ZGlmZiAtLWdpdCBhL2Fvcy9uZXR3b3JrL3RlYW1fbnVtYmVyLmNjIGIvYW9zL25ldHdvcmsvdGVhbV9udW1iZXIuY2MKaW5kZXggMTc1YzNhOS4uYmQ5MGI5NiAxMDA2NDQKLS0tIGEvYW9zL25ldHdvcmsvdGVhbV9udW1iZXIuY2MKKysrIGIvYW9zL25ldHdvcmsvdGVhbV9udW1iZXIuY2MKQEAgLTEzMCw2ICsxMzAsOCBAQAogICAgIHJldHVybiBzdGQ6OnN0cmluZ192aWV3KCJwaSIpOwogICB9IGVsc2UgaWYgKGhvc3RuYW1lLnN1YnN0cigwLCA1KSA9PSAib3Jpbi0iKSB7CiAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nX3ZpZXcoIm9yaW4iKTsKKyAgfSBlbHNlIGlmIChob3N0bmFtZS5zdWJzdHIoMCwgNCkgPT0gImltdS0iKSB7CisgICAgcmV0dXJuIHN0ZDo6c3RyaW5nX3ZpZXcoIm9yaW4iKTsKICAgfSBlbHNlCiAgICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKIH0KZGlmZiAtLWdpdCBhL2Fvcy9uZXR3b3JrL3RlYW1fbnVtYmVyX3Rlc3QuY2MgYi9hb3MvbmV0d29yay90ZWFtX251bWJlcl90ZXN0LmNjCmluZGV4IDk5MjJiMWIuLjI3OGEzNjQgMTAwNjQ0Ci0tLSBhL2Fvcy9uZXR3b3JrL3RlYW1fbnVtYmVyX3Rlc3QuY2MKKysrIGIvYW9zL25ldHdvcmsvdGVhbV9udW1iZXJfdGVzdC5jYwpAQCAtMjgsNyArMjgsNyBAQAogICBFWFBFQ1RfRkFMU0UoUGFyc2VSb2JvcmlvVGVhbU51bWJlcigicm9ib1JJTy0tRlJDIikpOwogfQogCi1URVNUKFRlYW1OdW1iZXJUZXN0LCBQYXJzZVBpT3JPcmluVGVhbU51bWJlcikgeworVEVTVChIb3N0bmFtZVBhcnNlVGVzdCwgUGFyc2VQaU9yT3JpblRlYW1OdW1iZXIpIHsKICAgRVhQRUNUX0VRKDk3MXUsICpQYXJzZVBpT3JPcmluVGVhbU51bWJlcigicGktOTcxLTEiKSk7CiAgIEVYUEVDVF9FUSg4OTcxdSwgKlBhcnNlUGlPck9yaW5UZWFtTnVtYmVyKCJwaS04OTcxLTIyIikpOwogICBFWFBFQ1RfRVEoODk3MXUsICpQYXJzZVBpT3JPcmluVGVhbU51bWJlcigicGktODk3MS0iKSk7CkBAIC0zNywxMiArMzcsMTYgQEAKICAgRVhQRUNUX0VRKDg5NzF1LCAqUGFyc2VQaU9yT3JpblRlYW1OdW1iZXIoIm9yaW4tODk3MS0yMiIpKTsKICAgRVhQRUNUX0VRKDg5NzF1LCAqUGFyc2VQaU9yT3JpblRlYW1OdW1iZXIoIm9yaW4tODk3MS0iKSk7CiAKKyAgRVhQRUNUX0ZBTFNFKFBhcnNlUGlPck9yaW5UZWFtTnVtYmVyKCJyb2JvUklPLTk3MS1GUkMiKSk7CisKICAgRVhQRUNUX0ZBTFNFKFBhcnNlUm9ib3Jpb1RlYW1OdW1iZXIoInBpIikpOwogICBFWFBFQ1RfRkFMU0UoUGFyc2VSb2JvcmlvVGVhbU51bWJlcigicGktIikpOwogICBFWFBFQ1RfRkFMU0UoUGFyc2VSb2JvcmlvVGVhbU51bWJlcigicGktOTcxIikpOwogICBFWFBFQ1RfRkFMU0UoUGFyc2VSb2JvcmlvVGVhbU51bWJlcigicGktOTcxYS0xIikpOwogICBFWFBFQ1RfRkFMU0UoUGFyc2VSb2JvcmlvVGVhbU51bWJlcigib3Jpbi05NzEtMSIpKTsKK30KIAorVEVTVChIb3N0bmFtZVBhcnNlVGVzdCwgUGFyc2VQaU9yT3Jpbk51bWJlcikgewogICBFWFBFQ1RfRVEoMXUsICpQYXJzZVBpT3JPcmluTnVtYmVyKCJwaS05NzEtMSIpKTsKICAgRVhQRUNUX0VRKDIydSwgKlBhcnNlUGlPck9yaW5OdW1iZXIoInBpLTg5NzEtMjIiKSk7CiAgIEVYUEVDVF9FUSgxdSwgKlBhcnNlUGlPck9yaW5OdW1iZXIoIm9yaW4tOTcxLTEiKSk7CkBAIC01OSw0ICs2MywxOSBAQAogICBFWFBFQ1RfRkFMU0UoUGFyc2VQaU9yT3Jpbk51bWJlcigib3Jpbi05NzEiKSk7CiB9CiAKK1RFU1QoSG9zdG5hbWVQYXJzZVRlc3QsIFBhcnNlUGlPck9yaW4pIHsKKyAgRVhQRUNUX0VRKCJwaSIsICpQYXJzZVBpT3JPcmluKCJwaS05NzEtMSIpKTsKKyAgRVhQRUNUX0VRKCJwaSIsICpQYXJzZVBpT3JPcmluKCJwaS04OTcxLTIyIikpOworICBFWFBFQ1RfRVEoInBpIiwgKlBhcnNlUGlPck9yaW4oInBpLTg5NzEtIikpOworCisgIEVYUEVDVF9FUSgib3JpbiIsICpQYXJzZVBpT3JPcmluKCJvcmluLTk3MS0xIikpOworICBFWFBFQ1RfRVEoIm9yaW4iLCAqUGFyc2VQaU9yT3Jpbigib3Jpbi04OTcxLTIyIikpOworICBFWFBFQ1RfRVEoIm9yaW4iLCAqUGFyc2VQaU9yT3Jpbigib3Jpbi04OTcxLSIpKTsKKworICBFWFBFQ1RfRVEoIm9yaW4iLCAqUGFyc2VQaU9yT3JpbigiaW11LTk3MS0xIikpOworCisgIEVYUEVDVF9GQUxTRShQYXJzZVBpT3JPcmluKCJyb2JvUklPLTk3MS1GUkMiKSk7CisgIEVYUEVDVF9GQUxTRShQYXJzZVBpT3JPcmluKCJsYXB0b3AiKSk7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhb3M6Om5ldHdvcms6OnRlc3RpbmcKZGlmZiAtLWdpdCBhL2ZyYzk3MS9jb250cm9sX2xvb3BzL2RscXIuaCBiL2ZyYzk3MS9jb250cm9sX2xvb3BzL2RscXIuaAppbmRleCBkMzFmNDkyLi42YTUwODNhIDEwMDY0NAotLS0gYS9mcmM5NzEvY29udHJvbF9sb29wcy9kbHFyLmgKKysrIGIvZnJjOTcxL2NvbnRyb2xfbG9vcHMvZGxxci5oCkBAIC01LDEwICs1LDEwIEBACiAKIG5hbWVzcGFjZSBmcmM5NzE6OmNvbnRyb2xzIHsKIAotdGVtcGxhdGUgPGludCBudW1fc3RhdGVzLCBpbnQgbnVtX2lucHV0cz4KLWludCBDb250cm9sbGFiaWxpdHkoY29uc3QgOjpFaWdlbjo6TWF0cml4PGRvdWJsZSwgbnVtX3N0YXRlcywgbnVtX3N0YXRlcz4gJkEsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IDo6RWlnZW46Ok1hdHJpeDxkb3VibGUsIG51bV9zdGF0ZXMsIG51bV9pbnB1dHM+ICZCKSB7Ci0gIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCBudW1fc3RhdGVzLCBudW1fc3RhdGVzICogbnVtX2lucHV0cz4gY29udHJvbGxhYmlsaXR5OwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgaW50IG51bV9zdGF0ZXMsIGludCBudW1faW5wdXRzPgoraW50IENvbnRyb2xsYWJpbGl0eShjb25zdCA6OkVpZ2VuOjpNYXRyaXg8U2NhbGFyLCBudW1fc3RhdGVzLCBudW1fc3RhdGVzPiAmQSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgOjpFaWdlbjo6TWF0cml4PFNjYWxhciwgbnVtX3N0YXRlcywgbnVtX2lucHV0cz4gJkIpIHsKKyAgRWlnZW46Ok1hdHJpeDxTY2FsYXIsIG51bV9zdGF0ZXMsIG51bV9zdGF0ZXMgKiBudW1faW5wdXRzPiBjb250cm9sbGFiaWxpdHk7CiAgIGNvbnRyb2xsYWJpbGl0eS5ibG9jaygwLCAwLCBudW1fc3RhdGVzLCBudW1faW5wdXRzKSA9IEI7CiAKICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBudW1fc3RhdGVzOyBpKyspIHsKQEAgLTE4LDcgKzE4LDcgQEAKICAgfQogCiAgIHJldHVybiBFaWdlbjo6RnVsbFBpdkxVPAotICAgICAgICAgICAgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCBudW1fc3RhdGVzLCBudW1fc3RhdGVzICogbnVtX2lucHV0cz4+KAorICAgICAgICAgICAgIEVpZ2VuOjpNYXRyaXg8U2NhbGFyLCBudW1fc3RhdGVzLCBudW1fc3RhdGVzICogbnVtX2lucHV0cz4+KAogICAgICAgICAgICAgIGNvbnRyb2xsYWJpbGl0eSkKICAgICAgIC5yYW5rKCk7CiB9CmRpZmYgLS1naXQgYS9mcmM5NzEvY29udHJvbF9sb29wcy9kb3VibGVfam9pbnRlZF9hcm0vdHJhamVjdG9yeS5jYyBiL2ZyYzk3MS9jb250cm9sX2xvb3BzL2RvdWJsZV9qb2ludGVkX2FybS90cmFqZWN0b3J5LmNjCmluZGV4IDBlYWY2N2UuLmEwNGQ2Y2MgMTAwNjQ0Ci0tLSBhL2ZyYzk3MS9jb250cm9sX2xvb3BzL2RvdWJsZV9qb2ludGVkX2FybS90cmFqZWN0b3J5LmNjCisrKyBiL2ZyYzk3MS9jb250cm9sX2xvb3BzL2RvdWJsZV9qb2ludGVkX2FybS90cmFqZWN0b3J5LmNjCkBAIC0zOTEsMTQgKzM5MSwxNCBAQAogICBjb25zdCBhdXRvIHhfYmxvY2tlZCA9IFguYmxvY2s8NCwgMT4oMCwgMCk7CiAKICAgY29uc3QgOjpFaWdlbjo6TWF0cml4PGRvdWJsZSwgNCwgND4gZmluYWxfQSA9Ci0gICAgICA6OmZyYzk3MTo6Y29udHJvbF9sb29wczo6TnVtZXJpY2FsSmFjb2JpYW5YPDQsIDI+KAorICAgICAgOjpmcmM5NzE6OmNvbnRyb2xfbG9vcHM6Ok51bWVyaWNhbEphY29iaWFuWDw0LCAyLCBkb3VibGU+KAogICAgICAgICAgIFt0aGlzXShjb25zdCBhdXRvICZ4X2Jsb2NrZWQsIGNvbnN0IGF1dG8gJlUsIGRvdWJsZSBkdCkgewogICAgICAgICAgICAgcmV0dXJuIHRoaXMtPmR5bmFtaWNzXy0+VW5ib3VuZGVkRGlzY3JldGVEeW5hbWljcyh4X2Jsb2NrZWQsIFUsIGR0KTsKICAgICAgICAgICB9LAogICAgICAgICAgIHhfYmxvY2tlZCwgVSwgMC4wMDUwNSk7CiAKICAgY29uc3QgOjpFaWdlbjo6TWF0cml4PGRvdWJsZSwgNCwgMj4gZmluYWxfQiA9Ci0gICAgICA6OmZyYzk3MTo6Y29udHJvbF9sb29wczo6TnVtZXJpY2FsSmFjb2JpYW5VPDQsIDI+KAorICAgICAgOjpmcmM5NzE6OmNvbnRyb2xfbG9vcHM6Ok51bWVyaWNhbEphY29iaWFuVTw0LCAyLCBkb3VibGU+KAogICAgICAgICAgIFt0aGlzXShjb25zdCBhdXRvICZ4X2Jsb2NrZWQsIGNvbnN0IGF1dG8gJlUsIGRvdWJsZSBkdCkgewogICAgICAgICAgICAgcmV0dXJuIHRoaXMtPmR5bmFtaWNzXy0+VW5ib3VuZGVkRGlzY3JldGVEeW5hbWljcyh4X2Jsb2NrZWQsIFUsIGR0KTsKICAgICAgICAgICB9LApkaWZmIC0tZ2l0IGEvZnJjOTcxL2NvbnRyb2xfbG9vcHMvamFjb2JpYW4uaCBiL2ZyYzk3MS9jb250cm9sX2xvb3BzL2phY29iaWFuLmgKaW5kZXggNTQ0MmVjOC4uZTgyYzY2OCAxMDA2NDQKLS0tIGEvZnJjOTcxL2NvbnRyb2xfbG9vcHMvamFjb2JpYW4uaAorKysgYi9mcmM5NzEvY29udHJvbF9sb29wcy9qYWNvYmlhbi5oCkBAIC01LDE4ICs1LDE4IEBACiAKIG5hbWVzcGFjZSBmcmM5NzE6OmNvbnRyb2xfbG9vcHMgewogCi10ZW1wbGF0ZSA8aW50IG51bV9zdGF0ZXMsIGludCBudW1faW5wdXRzLCB0eXBlbmFtZSBGPgotOjpFaWdlbjo6TWF0cml4PGRvdWJsZSwgbnVtX3N0YXRlcywgbnVtX2lucHV0cz4gTnVtZXJpY2FsSmFjb2JpYW4oCi0gICAgY29uc3QgRiAmZm4sIDo6RWlnZW46Ok1hdHJpeDxkb3VibGUsIG51bV9pbnB1dHMsIDE+IGlucHV0KSB7Ci0gIGNvbnN0ZXhwciBkb3VibGUga0Vwc2lsb24gPSAxZS01OwotICA6OkVpZ2VuOjpNYXRyaXg8ZG91YmxlLCBudW1fc3RhdGVzLCBudW1faW5wdXRzPiByZXN1bHQgPQotICAgICAgOjpFaWdlbjo6TWF0cml4PGRvdWJsZSwgbnVtX3N0YXRlcywgbnVtX2lucHV0cz46Olplcm8oKTsKK3RlbXBsYXRlIDxpbnQgbnVtX3N0YXRlcywgaW50IG51bV9pbnB1dHMsIHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgRj4KKzo6RWlnZW46Ok1hdHJpeDxTY2FsYXIsIG51bV9zdGF0ZXMsIG51bV9pbnB1dHM+IE51bWVyaWNhbEphY29iaWFuKAorICAgIGNvbnN0IEYgJmZuLCA6OkVpZ2VuOjpNYXRyaXg8U2NhbGFyLCBudW1faW5wdXRzLCAxPiBpbnB1dCkgeworICBjb25zdGV4cHIgU2NhbGFyIGtFcHNpbG9uID0gMWUtNTsKKyAgOjpFaWdlbjo6TWF0cml4PFNjYWxhciwgbnVtX3N0YXRlcywgbnVtX2lucHV0cz4gcmVzdWx0ID0KKyAgICAgIDo6RWlnZW46Ok1hdHJpeDxTY2FsYXIsIG51bV9zdGF0ZXMsIG51bV9pbnB1dHM+OjpaZXJvKCk7CiAKICAgLy8gSXQncyBtb3JlIGV4cGVuc2l2ZSwgYnV0ICstIGVwc2lsb24gd2lsbCBiZSBtb3JlIGFjY3VyYXRlCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX2lucHV0czsgKytpKSB7Ci0gICAgOjpFaWdlbjo6TWF0cml4PGRvdWJsZSwgbnVtX2lucHV0cywgMT4gZFhfcGx1cyA9IGlucHV0OworICAgIDo6RWlnZW46Ok1hdHJpeDxTY2FsYXIsIG51bV9pbnB1dHMsIDE+IGRYX3BsdXMgPSBpbnB1dDsKICAgICBkWF9wbHVzKGksIDApICs9IGtFcHNpbG9uOwotICAgIDo6RWlnZW46Ok1hdHJpeDxkb3VibGUsIG51bV9pbnB1dHMsIDE+IGRYX21pbnVzID0gaW5wdXQ7CisgICAgOjpFaWdlbjo6TWF0cml4PFNjYWxhciwgbnVtX2lucHV0cywgMT4gZFhfbWludXMgPSBpbnB1dDsKICAgICBkWF9taW51cyhpLCAwKSAtPSBrRXBzaWxvbjsKICAgICByZXN1bHQuY29sKGkpID0gKGZuKGRYX3BsdXMpIC0gZm4oZFhfbWludXMpKSAvIChrRXBzaWxvbiAqIDIuMCk7CiAgIH0KQEAgLTI0LDI0ICsyNCwyNiBAQAogfQogCiAvLyBJbXBsZW1lbnRzIGEgbnVtZXJpY2FsIGphY29iaWFuIHdpdGggcmVzcGVjdCB0byBYIGZvciBmKFgsIFUsIC4uLikuCi10ZW1wbGF0ZSA8aW50IG51bV9zdGF0ZXMsIGludCBudW1fdSwgdHlwZW5hbWUgRiwgdHlwZW5hbWUuLi4gQXJncz4KLTo6RWlnZW46Ok1hdHJpeDxkb3VibGUsIG51bV9zdGF0ZXMsIG51bV9zdGF0ZXM+IE51bWVyaWNhbEphY29iaWFuWCgKLSAgICBjb25zdCBGICZmbiwgOjpFaWdlbjo6TWF0cml4PGRvdWJsZSwgbnVtX3N0YXRlcywgMT4gWCwKLSAgICA6OkVpZ2VuOjpNYXRyaXg8ZG91YmxlLCBudW1fdSwgMT4gVSwgQXJncyAmJi4uLmFyZ3MpIHsKK3RlbXBsYXRlIDxpbnQgbnVtX3N0YXRlcywgaW50IG51bV91LCB0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIEYsCisgICAgICAgICAgdHlwZW5hbWUuLi4gQXJncz4KKzo6RWlnZW46Ok1hdHJpeDxTY2FsYXIsIG51bV9zdGF0ZXMsIG51bV9zdGF0ZXM+IE51bWVyaWNhbEphY29iaWFuWCgKKyAgICBjb25zdCBGICZmbiwgOjpFaWdlbjo6TWF0cml4PFNjYWxhciwgbnVtX3N0YXRlcywgMT4gWCwKKyAgICA6OkVpZ2VuOjpNYXRyaXg8U2NhbGFyLCBudW1fdSwgMT4gVSwgQXJncyAmJi4uLmFyZ3MpIHsKICAgcmV0dXJuIE51bWVyaWNhbEphY29iaWFuPG51bV9zdGF0ZXMsIG51bV9zdGF0ZXM+KAotICAgICAgWyZdKDo6RWlnZW46Ok1hdHJpeDxkb3VibGUsIG51bV9zdGF0ZXMsIDE+IFgpIHsKKyAgICAgIFsmXSg6OkVpZ2VuOjpNYXRyaXg8U2NhbGFyLCBudW1fc3RhdGVzLCAxPiBYKSB7CiAgICAgICAgIHJldHVybiBmbihYLCBVLCBhcmdzLi4uKTsKICAgICAgIH0sCiAgICAgICBYKTsKIH0KIAogLy8gSW1wbGVtZW50cyBhIG51bWVyaWNhbCBqYWNvYmlhbiB3aXRoIHJlc3BlY3QgdG8gVSBmb3IgZihYLCBVLCAuLi4pLgotdGVtcGxhdGUgPGludCBudW1fc3RhdGVzLCBpbnQgbnVtX3UsIHR5cGVuYW1lIEYsIHR5cGVuYW1lLi4uIEFyZ3M+Ci06OkVpZ2VuOjpNYXRyaXg8ZG91YmxlLCBudW1fc3RhdGVzLCBudW1fdT4gTnVtZXJpY2FsSmFjb2JpYW5VKAotICAgIGNvbnN0IEYgJmZuLCA6OkVpZ2VuOjpNYXRyaXg8ZG91YmxlLCBudW1fc3RhdGVzLCAxPiBYLAotICAgIDo6RWlnZW46Ok1hdHJpeDxkb3VibGUsIG51bV91LCAxPiBVLCBBcmdzICYmLi4uYXJncykgewordGVtcGxhdGUgPGludCBudW1fc3RhdGVzLCBpbnQgbnVtX3UsIHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgRiwKKyAgICAgICAgICB0eXBlbmFtZS4uLiBBcmdzPgorOjpFaWdlbjo6TWF0cml4PFNjYWxhciwgbnVtX3N0YXRlcywgbnVtX3U+IE51bWVyaWNhbEphY29iaWFuVSgKKyAgICBjb25zdCBGICZmbiwgOjpFaWdlbjo6TWF0cml4PFNjYWxhciwgbnVtX3N0YXRlcywgMT4gWCwKKyAgICA6OkVpZ2VuOjpNYXRyaXg8U2NhbGFyLCBudW1fdSwgMT4gVSwgQXJncyAmJi4uLmFyZ3MpIHsKICAgcmV0dXJuIE51bWVyaWNhbEphY29iaWFuPG51bV9zdGF0ZXMsIG51bV91PigKLSAgICAgIFsmXSg6OkVpZ2VuOjpNYXRyaXg8ZG91YmxlLCBudW1fdSwgMT4gVSkgeyByZXR1cm4gZm4oWCwgVSwgYXJncy4uLik7IH0sCisgICAgICBbJl0oOjpFaWdlbjo6TWF0cml4PFNjYWxhciwgbnVtX3UsIDE+IFUpIHsgcmV0dXJuIGZuKFgsIFUsIGFyZ3MuLi4pOyB9LAogICAgICAgVSk7CiB9CiAKZGlmZiAtLWdpdCBhL2ZyYzk3MS9jb250cm9sX2xvb3BzL2phY29iaWFuX3Rlc3QuY2MgYi9mcmM5NzEvY29udHJvbF9sb29wcy9qYWNvYmlhbl90ZXN0LmNjCmluZGV4IDU2MDYwMDQuLjkyYTE1YTMgMTAwNjQ0Ci0tLSBhL2ZyYzk3MS9jb250cm9sX2xvb3BzL2phY29iaWFuX3Rlc3QuY2MKKysrIGIvZnJjOTcxL2NvbnRyb2xfbG9vcHMvamFjb2JpYW5fdGVzdC5jYwpAQCAtMTksMTcgKzE5LDE3IEBACiAKIC8vIFRlc3QgdGhhdCB3ZSBjYW4gcmVjb3ZlciBBIGZyb20gQXhCdWZuIHByZXR0eSBhY2N1cmF0ZWx5LgogVEVTVChSdW5nZUt1dHRhVGVzdCwgQXgpIHsKLSAgOjpFaWdlbjo6TWF0cml4PGRvdWJsZSwgNCwgND4gTmV3QSA9Ci0gICAgICBOdW1lcmljYWxKYWNvYmlhblg8NCwgMj4oQXhCdWZuLCA6OkVpZ2VuOjpNYXRyaXg8ZG91YmxlLCA0LCAxPjo6WmVybygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6RWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+OjpaZXJvKCkpOworICA6OkVpZ2VuOjpNYXRyaXg8ZG91YmxlLCA0LCA0PiBOZXdBID0gTnVtZXJpY2FsSmFjb2JpYW5YPDQsIDIsIGRvdWJsZT4oCisgICAgICBBeEJ1Zm4sIDo6RWlnZW46Ok1hdHJpeDxkb3VibGUsIDQsIDE+OjpaZXJvKCksCisgICAgICA6OkVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPjo6WmVybygpKTsKICAgRVhQRUNUX1RSVUUoTmV3QS5pc0FwcHJveChBKSk7CiB9CiAKIC8vIFRlc3QgdGhhdCB3ZSBjYW4gcmVjb3ZlciBCIGZyb20gQXhCdWZuIHByZXR0eSBhY2N1cmF0ZWx5LgogVEVTVChSdW5nZUt1dHRhVGVzdCwgQnUpIHsKLSAgOjpFaWdlbjo6TWF0cml4PGRvdWJsZSwgNCwgMj4gTmV3QiA9Ci0gICAgICBOdW1lcmljYWxKYWNvYmlhblU8NCwgMj4oQXhCdWZuLCA6OkVpZ2VuOjpNYXRyaXg8ZG91YmxlLCA0LCAxPjo6WmVybygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6RWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+OjpaZXJvKCkpOworICA6OkVpZ2VuOjpNYXRyaXg8ZG91YmxlLCA0LCAyPiBOZXdCID0gTnVtZXJpY2FsSmFjb2JpYW5VPDQsIDIsIGRvdWJsZT4oCisgICAgICBBeEJ1Zm4sIDo6RWlnZW46Ok1hdHJpeDxkb3VibGUsIDQsIDE+OjpaZXJvKCksCisgICAgICA6OkVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPjo6WmVybygpKTsKICAgRVhQRUNUX1RSVUUoTmV3Qi5pc0FwcHJveChCKSk7CiB9CiAKZGlmZiAtLWdpdCBhL2ZyYzk3MS9jb250cm9sX2xvb3BzL3F1YXRlcm5pb25fdXRpbHMuaCBiL2ZyYzk3MS9jb250cm9sX2xvb3BzL3F1YXRlcm5pb25fdXRpbHMuaAppbmRleCAzZTQwZTNmNC4uYzJjODU0YyAxMDA2NDQKLS0tIGEvZnJjOTcxL2NvbnRyb2xfbG9vcHMvcXVhdGVybmlvbl91dGlscy5oCisrKyBiL2ZyYzk3MS9jb250cm9sX2xvb3BzL3F1YXRlcm5pb25fdXRpbHMuaApAQCAtOCwxOSArOCwxNyBAQAogCiBuYW1lc3BhY2UgZnJjOTcxOjpjb250cm9scyB7CiAKLS8vIEZ1bmN0aW9uIHRvIGNvbXB1dGUgdGhlIHF1YXRlcm5pb24gYXZlcmFnZSBvZiBhIGJ1bmNoIG9mIHF1YXRlcm5pb25zLiBFYWNoCi0vLyBjb2x1bW4gaW4gdGhlIGlucHV0IG1hdHJpeCBpcyBhIHF1YXRlcm5pb24gKG9wdGlvbmFsbHkgc2NhbGVkIGJ5IGl0J3MKLS8vIHdlaWdodCkuCi10ZW1wbGF0ZSA8aW50IFNNPgotaW5saW5lIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCA0LCAxPiBRdWF0ZXJuaW9uTWVhbigKLSAgICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgNCwgU00+IGlucHV0KSB7CisvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZXh0cmFjdCBtZWFuIHF1YXRlcm5pb24gZnJvbSBBKkFeVCBvZiBxdWF0ZXJuaW9uIGxpc3QKKy8vIFRoaXMgYWxsb3dzIHVzIHRvIHN1cHBvcnQgbXVsdGlwbGUgZm9ybWF0cyBvZiB0aGUgaW5wdXQgcXVhdGVybmlvbiBsaXN0CitpbmxpbmUgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDQsIDE+IEV4dHJhY3RRdWF0ZXJuaW9uTWVhbigKKyAgICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgNCwgND4gaW5wdXQpIHsKICAgLy8gQWxnb3JpdGhtIHRvIGNvbXB1dGUgdGhlIGF2ZXJhZ2Ugb2YgYSBidW5jaCBvZiBxdWF0ZXJuaW9uczoKLSAgLy8gaHR0cDovL3d3dy5hY3N1LmJ1ZmZhbG8uZWR1L35qb2huYy9hdmVfcXVhdDA3LnBkZgotCi0gIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCA0LCA0PiBtID0gaW5wdXQgKiBpbnB1dC50cmFuc3Bvc2UoKTsKKyAgLy8gIGh0dHA6Ly93d3cuYWNzdS5idWZmYWxvLmVkdS9+am9obmMvYXZlX3F1YXQwNy5wZGYKKyAgLy8gU2VlIGFsc286CisgIC8vICBodHRwczovL250cnMubmFzYS5nb3YvYXJjaGl2ZS9uYXNhL2Nhc2kubnRycy5uYXNhLmdvdi8yMDA3MDAxNzg3Mi5wZGYKIAogICBFaWdlbjo6RWlnZW5Tb2x2ZXI8RWlnZW46Ok1hdHJpeDxkb3VibGUsIDQsIDQ+PiBzb2x2ZXI7Ci0gIHNvbHZlci5jb21wdXRlKG0pOworICBzb2x2ZXIuY29tcHV0ZShpbnB1dCk7CiAKICAgRWlnZW46OkVpZ2VuU29sdmVyPEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCA0LCA0Pj46OkVpZ2VudmVjdG9yc1R5cGUKICAgICAgIGVpZ2VudmVjdG9ycyA9IHNvbHZlci5laWdlbnZlY3RvcnMoKTsKQEAgLTQ3LDYgKzQ1LDM3IEBACiAgIHJldHVybiBlaWdlbnZlY3RvcnMuY29sKG1heF9pbmRleCkucmVhbCgpLm5vcm1hbGl6ZWQoKTsKIH0KIAorLy8gRnVuY3Rpb24gdG8gY29tcHV0ZSB0aGUgcXVhdGVybmlvbiBhdmVyYWdlIG9mIGEgYnVuY2ggb2YgcXVhdGVybmlvbnMuIEVhY2gKKy8vIGNvbHVtbiBpbiB0aGUgNHhOIGlucHV0IE1hdHJpeCBpcyBhIHF1YXRlcm5pb24gKG9wdGlvbmFsbHkgc2NhbGVkIGJ5IGl0J3MKKy8vIHdlaWdodCkuCit0ZW1wbGF0ZSA8aW50IE4+CitpbmxpbmUgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDQsIDE+IFF1YXRlcm5pb25NZWFuKAorICAgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCA0LCBOPiBxdWF0ZXJuaW9ucykgeworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgNCwgND4gbSA9IHF1YXRlcm5pb25zICogcXVhdGVybmlvbnMudHJhbnNwb3NlKCk7CisKKyAgcmV0dXJuIEV4dHJhY3RRdWF0ZXJuaW9uTWVhbihtKTsKK30KKworLy8gRnVuY3Rpb24gdG8gY29tcHV0ZSB0aGUgcXVhdGVybmlvbiBhdmVyYWdlIG9mIGEgYnVuY2ggb2YgcXVhdGVybmlvbnMuCisvLyBUaGlzIGFsbG93cyBmb3IgcGFzc2luZyBpbiBhIHZhcmlhYmxlIHNpemUgbGlzdCAodmVjdG9yKSBvZiBxdWF0ZXJuaW9ucworCisvLyBGb3IgcmVmZXJlbmNlIChzaW5jZSBJJ3ZlIGJlZW4gYml0dGVuIGJ5IGl0KToKKy8vIEVpZ2VuOjpRdWF0ZXJuaW9uIHN0b3JlcyBhbmQgcHJpbnRzIGNvZWZmaWNpZW50cyBhcyBbeCwgeSwgeiwgd10KKy8vIGFuZCBpbml0aWFsaXplcyB1c2luZyBhIFZlY3RvcjRkIGluIHRoaXMgb3JkZXIsIEJVVAorLy8gaW5pdGlhbGl6ZXMgd2l0aCBzY2FsYXJzIGFzIEVpZ2VuOjpRdWF0ZXJuaW9ue3csIHgsIHksIHp9CitpbmxpbmUgRWlnZW46OlZlY3RvcjRkIFF1YXRlcm5pb25NZWFuKAorICAgIHN0ZDo6dmVjdG9yPEVpZ2VuOjpWZWN0b3I0ZD4gcXVhdGVybmlvbl9saXN0KSB7CisgIENIRUNLKHF1YXRlcm5pb25fbGlzdC5zaXplKCkgIT0gMCkKKyAgICAgIDw8ICJNdXN0IGhhdmUgYXQgbGVhc3Qgb25lIHF1YXRlcm5pb24gdG8gY29tcHV0ZSBhbiBhdmVyYWdlISI7CisKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDQsIDQ+IG0gPSBFaWdlbjo6TWF0cml4NGQ6Olplcm8oKTsKKyAgZm9yIChFaWdlbjo6VmVjdG9yNGQgcXVhdGVybmlvbiA6IHF1YXRlcm5pb25fbGlzdCkgeworICAgIG0gKz0gcXVhdGVybmlvbiAqIHF1YXRlcm5pb24udHJhbnNwb3NlKCk7CisgIH0KKworICByZXR1cm4gRWlnZW46OlZlY3RvcjRkKEV4dHJhY3RRdWF0ZXJuaW9uTWVhbihtKSk7Cit9CisKIC8vIENvbnZlcnRzIGZyb20gYSBxdWF0ZXJuaW9uIHRvIGEgcm90YXRpb24gdmVjdG9yLCB3aGVyZSB0aGUgcm90YXRpb24gdmVjdG9yJ3MKIC8vIGRpcmVjdGlvbiByZXByZXNlbnRzIHRoZSBheGlzIHRvIHJvdGF0ZSBhcm91bmQgYW5kIGl0cyBtYWduaXR1ZGUgcmVwcmVzZW50cwogLy8gdGhlIG51bWJlciBvZiByYWRpYW5zIHRvIHJvdGF0ZS4KQEAgLTc0LDcgKzEwMyw3IEBACiBpbmxpbmUgRWlnZW46OlZlY3RvcjRkIFF1YXRlcm5pb25EZXJpdmF0aXZlKEVpZ2VuOjpWZWN0b3IzZCBvbWVnYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRWlnZW46OlZlY3RvcjRkICZxX21hdHJpeCkgewogICAvLyBTZWUgaHR0cHM6Ly93d3cuYXNod2lubmFyYXlhbi5jb20vcG9zdC9ob3ctdG8taW50ZWdyYXRlLXF1YXRlcm5pb25zLyBmb3IKLSAgLy8gYW5vdGhlciByZXNvdXJjZSBvbiBxdWF0ZXJuaW9uIGludGVncmF0aW9uIGFuZCBkZXJpdml0aXZlcy4KKyAgLy8gYW5vdGhlciByZXNvdXJjZSBvbiBxdWF0ZXJuaW9uIGludGVncmF0aW9uIGFuZCBkZXJpdmF0aXZlcy4KICAgRWlnZW46OlF1YXRlcm5pb248ZG91YmxlPiBxKHFfbWF0cml4KTsKIAogICBFaWdlbjo6UXVhdGVybmlvbjxkb3VibGU+IG9tZWdhX3E7CmRpZmYgLS1naXQgYS9mcmM5NzEvY29udHJvbF9sb29wcy9xdWF0ZXJuaW9uX3V0aWxzX3Rlc3QuY2MgYi9mcmM5NzEvY29udHJvbF9sb29wcy9xdWF0ZXJuaW9uX3V0aWxzX3Rlc3QuY2MKaW5kZXggMmVhZWFhMC4uNjNmNDUwNyAxMDA2NDQKLS0tIGEvZnJjOTcxL2NvbnRyb2xfbG9vcHMvcXVhdGVybmlvbl91dGlsc190ZXN0LmNjCisrKyBiL2ZyYzk3MS9jb250cm9sX2xvb3BzL3F1YXRlcm5pb25fdXRpbHNfdGVzdC5jYwpAQCAtMTcsNiArMTcsNyBAQAogLy8gcmV0dXJuIHRoZSBvcmlnaW5hbCBxdWF0ZXJuaW9uLgogVEVTVChEb3duRXN0aW1hdG9yVGVzdCwgUXVhdGVybmlvbk1lYW4pIHsKICAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDQsIDc+IHZlY3RvcnM7CisgIHN0ZDo6dmVjdG9yPEVpZ2VuOjpWZWN0b3I0ZD4gcXVhdGVybmlvbl9saXN0OwogICB2ZWN0b3JzLmNvbCgwKSA8PCAwLCAwLCAwLCAxOwogICBmb3IgKGludCBpID0gMDsgaSA8IDM7ICsraSkgewogICAgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCA0LCAxPiBwZXJ0dXJiYXRpb247CkBAIC0yOSw2ICszMCw3IEBACiAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCA3OyArK2kpIHsKICAgICB2ZWN0b3JzLmNvbChpKS5ub3JtYWxpemUoKTsKKyAgICBxdWF0ZXJuaW9uX2xpc3QucHVzaF9iYWNrKEVpZ2VuOjpWZWN0b3I0ZCh2ZWN0b3JzLmNvbChpKSkpOwogICB9CiAKICAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDQsIDE+IG1lYW4gPSBRdWF0ZXJuaW9uTWVhbih2ZWN0b3JzKTsKQEAgLTM2LDYgKzM4LDE1IEBACiAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgKytpKSB7CiAgICAgRVhQRUNUX05FQVIobWVhbihpLCAwKSwgdmVjdG9ycyhpLCAwKSwgMC4wMDEpIDw8ICI6IEZhaWxlZCBvbiBpbmRleCAiIDw8IGk7CiAgIH0KKworICAvLyBUZXN0IHZlcnNpb24gb2YgY29kZSB0aGF0IHBhc3NlcyBpbiBhIHZlY3RvciBvZiBxdWF0ZXJuaW9ucworICBtZWFuID0gUXVhdGVybmlvbk1lYW4ocXVhdGVybmlvbl9saXN0KTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDQ7ICsraSkgeworICAgIEVYUEVDVF9ORUFSKG1lYW4oaSwgMCksIHF1YXRlcm5pb25fbGlzdFswXShpLCAwKSwgMC4wMDEpCisgICAgICAgIDw8ICI6IEZhaWxlZCBvbiBpbmRleCAiIDw8IGkgPDwgIiB3aXRoIG1lYW4gPSAiIDw8IG1lYW4KKyAgICAgICAgPDwgIiBhbmQgcXVhdF9saXN0ID0gIiA8PCBxdWF0ZXJuaW9uX2xpc3RbMF07CisgIH0KIH0KIAogLy8gVGVzdHMgdGhhdCBUb1JvdGF0aW9uVmVjdG9yRnJvbVF1YXRlcm5pb24gd29ya3MgZm9yIGEgMCByb3RhdGlvbi4KZGlmZiAtLWdpdCBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvQ29yZS9JbmMvbWFpbi5oIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Db3JlL0luYy9tYWluLmgKaW5kZXggZjRlMGVlOC4uNmVjY2EwZCAxMDA2NDQKLS0tIGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Db3JlL0luYy9tYWluLmgKKysrIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Db3JlL0luYy9tYWluLmgKQEAgLTE4NSw3ICsxODUsMTEgQEAKIA0KIC8qIFVTRVIgQ09ERSBCRUdJTiBQcml2YXRlIGRlZmluZXMgKi8NCiANCisjZGVmaW5lIExTSV9DTE9DS19GUkVRX0haIDMyMDAwICAvLyAzMiBrSHoNCiAjZGVmaW5lIElNVV9TQU1QTEVTX1BFUl9NUyAzDQorI2RlZmluZSBDQU5fV0FUQ0hET0dfVElNRU9VVF9VUyAyMDAwMCAgLy8gMjAgbXMNCisjZGVmaW5lIFBXTV9XQVRDSERPR19USU1FT1VUX1VTIDIwMDAwICAvLyAyMCBtcw0KKyNkZWZpbmUgU1BJX1dBVENIRE9HX1RJTUVPVVRfVVMgMjAwMDAgIC8vIDIwIG1zDQogDQogLyogVVNFUiBDT0RFIEVORCBQcml2YXRlIGRlZmluZXMgKi8NCiANCmRpZmYgLS1naXQgYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0NvcmUvSW5jL3N0bTMyZzR4eF9oYWxfY29uZi5oIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Db3JlL0luYy9zdG0zMmc0eHhfaGFsX2NvbmYuaAppbmRleCBjMjYxOGIyLi5iZWY0ZWJmIDEwMDY0NAotLS0gYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0NvcmUvSW5jL3N0bTMyZzR4eF9oYWxfY29uZi5oCisrKyBiL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvQ29yZS9JbmMvc3RtMzJnNHh4X2hhbF9jb25mLmgKQEAgLTQ2LDcgKzQ2LDcgQEAKIC8qI2RlZmluZSBIQUxfRk1BQ19NT0RVTEVfRU5BQkxFRCAgICovDQogLyojZGVmaW5lIEhBTF9IUlRJTV9NT0RVTEVfRU5BQkxFRCAgICovDQogLyojZGVmaW5lIEhBTF9JUkRBX01PRFVMRV9FTkFCTEVEICAgKi8NCi0vKiNkZWZpbmUgSEFMX0lXREdfTU9EVUxFX0VOQUJMRUQgICAqLw0KKyNkZWZpbmUgSEFMX0lXREdfTU9EVUxFX0VOQUJMRUQNCiAvKiNkZWZpbmUgSEFMX0kyQ19NT0RVTEVfRU5BQkxFRCAgICovDQogLyojZGVmaW5lIEhBTF9JMlNfTU9EVUxFX0VOQUJMRUQgICAqLw0KIC8qI2RlZmluZSBIQUxfTFBUSU1fTU9EVUxFX0VOQUJMRUQgICAqLw0KZGlmZiAtLWdpdCBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvQ29yZS9TcmMvbWFpbi5jIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Db3JlL1NyYy9tYWluLmMKaW5kZXggYzA3NThmOC4uNjVhMmQ0MiAxMDA2NDQKLS0tIGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Db3JlL1NyYy9tYWluLmMKKysrIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Db3JlL1NyYy9tYWluLmMKQEAgLTQ5LDYgKzQ5LDggQEAKIA0KIEZEQ0FOX0hhbmRsZVR5cGVEZWYgaGZkY2FuMjsNCiANCitJV0RHX0hhbmRsZVR5cGVEZWYgaGl3ZGc7DQorDQogU1BJX0hhbmRsZVR5cGVEZWYgaHNwaTE7DQogU1BJX0hhbmRsZVR5cGVEZWYgaHNwaTI7DQogU1BJX0hhbmRsZVR5cGVEZWYgaHNwaTM7DQpAQCAtODUsNyArODcsNyBAQAogc3RhdGljIHVpbnQ4X3QgY2FuX3R4WzY0XTsNCiBzdGF0aWMgaW50IGNhbl90eF9wYWNrZXRfY291bnRlcjsNCiBzdGF0aWMgQ2FuRGF0YSBjYW5fb3V0Ow0KLXN0YXRpYyBpbnQgdGltZXJfaW5kZXg7DQorc3RhdGljIGludCB0aW1lcl9pbmRleCA9IDA7DQogDQogc3RhdGljIERhdGFNdXJhdGEgbXVyYXRhX2F2ZXJhZ2VkOw0KIHN0YXRpYyBEYXRhVGRrIHRka19hdmVyYWdlZDsNCkBAIC0xMDYsNiArMTA4LDE1IEBACiBzdGF0aWMgRm91ckJ5dGVzIHNwaTNfdHg7DQogc3RhdGljIEZvdXJCeXRlcyBzcGlfbXVyYXRhX3J4Ow0KIA0KKy8vIFdhdGNoZG9nDQorLy8gV2F0Y2hwdXBwaWVzLCByZWFsbHkuIFdoZW4gdGhleSBzdGFydmUsIHRoZSBtYWluIHdhdGNoZG9nIGFsc28gc3RhcnZlczsNCisvLyBzeXN0ZW0gcmVzZXQgaXMgdHJpZ2dlcmVkIG9uIG1haW4gd2F0Y2hkb2cgdGltZW91dC4NCit1bnNpZ25lZCBsb25nIGxhc3RfY2FuX3dhdGNoZG9nX3VzOw0KK3Vuc2lnbmVkIGxvbmcgbGFzdF9wd21fd2F0Y2hkb2dfdXM7DQordW5zaWduZWQgbG9uZyBsYXN0X3NwaV91bm9fd2F0Y2hkb2dfdXM7DQordW5zaWduZWQgbG9uZyBsYXN0X3NwaV9kdWVfd2F0Y2hkb2dfdXM7DQordW5zaWduZWQgbG9uZyBsYXN0X3NwaV90ZGtfd2F0Y2hkb2dfdXM7DQorDQogLyogVVNFUiBDT0RFIEVORCBQViAqLw0KIA0KIC8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpAQCAtMTIxLDYgKzEzMiw3IEBACiBzdGF0aWMgdm9pZCBNWF9VU0JfUENEX0luaXQodm9pZCk7DQogc3RhdGljIHZvaWQgTVhfVElNMl9Jbml0KHZvaWQpOw0KIHN0YXRpYyB2b2lkIE1YX1RJTTFfSW5pdCh2b2lkKTsNCitzdGF0aWMgdm9pZCBNWF9JV0RHX0luaXQodm9pZCk7DQogLyogVVNFUiBDT0RFIEJFR0lOIFBGUCAqLw0KIA0KIHN0YXRpYyB2b2lkIEVuYWJsZUxlZHModm9pZCk7DQpAQCAtMTUyLDYgKzE2NCwxMSBAQAogICAgICAgICAgICAgICAgICAgIFNwaUluIGNhbGwpOw0KIHN0YXRpYyB2b2lkIFNwaU11cmF0YShEYXRhUmF3SW50MTYgKmRhdGEsIFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpeCwgU3BpT3V0ICpyZXMsDQogICAgICAgICAgICAgICAgICAgICAgIFNwaUluIGNhbGwpOw0KKw0KKy8vIFdhdGNoZG9nDQorc3RhdGljIHVpbnQxNl90IEdldFdhdGNoZG9nVGltZW91dE1zKHZvaWQpOw0KK3N0YXRpYyB2b2lkIERlbGF5V2l0aFdhdGNoZG9nKHVpbnQxNl90IGRlbGF5X21zKTsNCisNCiAvKiBVU0VSIENPREUgRU5EIFBGUCAqLw0KIA0KIC8qIFByaXZhdGUgdXNlciBjb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpAQCAtMTk3LDE3ICsyMTQsMjcgQEAKICAgTVhfVVNCX1BDRF9Jbml0KCk7DQogICBNWF9USU0yX0luaXQoKTsNCiAgIE1YX1RJTTFfSW5pdCgpOw0KKyAgTVhfSVdER19Jbml0KCk7DQogICAvKiBVU0VSIENPREUgQkVHSU4gMiAqLw0KIA0KLSAgRW5hYmxlTGVkcygpOyAgICAgICAgICAgICAgIC8vIFNldCBMRURzIHRvIHJlZA0KKyAgSEFMX0lXREdfUmVmcmVzaCgmaGl3ZGcpOw0KKyAgRW5hYmxlTGVkcygpOyAgLy8gU2V0IExFRHMgdG8gcmVkDQorICBIQUxfSVdER19SZWZyZXNoKCZoaXdkZyk7DQorDQogICBJbml0Q2FuKCZ0eF9oZWFkZXIsIDB4MDEpOyAgLy8gSW5pdGlhbGl6ZSB0aGUgQ0FOIG1vZHVsZQ0KKyAgSEFMX0lXREdfUmVmcmVzaCgmaGl3ZGcpOw0KKw0KICAgSW5pdE11cmF0YSgpOyAgLy8gUnVuIHRoZSBNdXJhdGEgcG93ZXIgdXAgc2VxdWVuY2UgKHNlZSBwZyAzMCBvZiBkYXRhc2hlZXQpDQotICBJbml0VGRrKCk7ICAgICAvLyBSdW4gdGhlIFRESyBwb3dlciB1cCBzZXF1ZW5jZSAoc2VlIHBnIDIyIG9mIGRhdGFzaGVldCkNCisgIEhBTF9JV0RHX1JlZnJlc2goJmhpd2RnKTsNCisNCisgIEluaXRUZGsoKTsgIC8vIFJ1biB0aGUgVERLIHBvd2VyIHVwIHNlcXVlbmNlIChzZWUgcGcgMjIgb2YgZGF0YXNoZWV0KQ0KKyAgSEFMX0lXREdfUmVmcmVzaCgmaGl3ZGcpOw0KKw0KICAgSEFMX1RJTV9CYXNlX1N0YXJ0X0lUKCZodGltMik7ICAvLyBTdGFydCAxIHVzIHRpbWVyDQogICBIQUxfVElNX0Jhc2VfU3RhcnRfSVQoJmh0aW0xKTsgIC8vIFN0YXJ0IDEgbXMgdGltZXINCi0NCiAgIEhBTF9USU1fUFdNX1N0YXJ0X0lUKCZodGltMywgVElNX0NIQU5ORUxfMyk7DQogICBIQUxfVElNX1BXTV9TdGFydF9JVCgmaHRpbTMsIFRJTV9DSEFOTkVMXzQpOw0KKyAgSEFMX0lXREdfUmVmcmVzaCgmaGl3ZGcpOw0KIA0KICAgLyogVVNFUiBDT0RFIEVORCAyICovDQogDQpAQCAtMjE4LDYgKzI0NSw0MSBAQAogICAgIC8qIFVTRVIgQ09ERSBFTkQgV0hJTEUgKi8NCiANCiAgICAgLyogVVNFUiBDT0RFIEJFR0lOIDMgKi8NCisNCisgICAgLy8gQ2hlY2sgd2hlbiBDQU4sIFBXTSBhbmQgU1BJIHdlcmUgbGFzdCBzdWNjZXNzZnVsbHkgd3JpdHRlbi4gVXNlDQorICAgIC8vIHNuYXBzaG90dGVkIHRpbWVzdGFtcHMgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbiBmcm9tIGludGVycnVwdCBsb29wDQorICAgIC8vIHVwZGF0aW5nIGR1cmluZyBjaGVjay4NCisgICAgdW5zaWduZWQgbG9uZyBsYXN0X2Nhbl93YXRjaGRvZ191c19jb3B5ID0gbGFzdF9jYW5fd2F0Y2hkb2dfdXM7DQorICAgIHVuc2lnbmVkIGxvbmcgbGFzdF9wd21fd2F0Y2hkb2dfdXNfY29weSA9IGxhc3RfcHdtX3dhdGNoZG9nX3VzOw0KKyAgICB1bnNpZ25lZCBsb25nIGxhc3Rfc3BpX3Vub193YXRjaGRvZ191c19jb3B5ID0gbGFzdF9zcGlfdW5vX3dhdGNoZG9nX3VzOw0KKyAgICB1bnNpZ25lZCBsb25nIGxhc3Rfc3BpX2R1ZV93YXRjaGRvZ191c19jb3B5ID0gbGFzdF9zcGlfZHVlX3dhdGNoZG9nX3VzOw0KKyAgICB1bnNpZ25lZCBsb25nIGxhc3Rfc3BpX3Rka193YXRjaGRvZ191c19jb3B5ID0gbGFzdF9zcGlfdGRrX3dhdGNoZG9nX3VzOw0KKyAgICB1bnNpZ25lZCBsb25nIGN1cnJlbnRfdGltZV91cyA9IF9fSEFMX1RJTV9HZXRDb3VudGVyKCZodGltMik7DQorDQorICAgIC8vIEZlZWQgd2F0Y2hkb2cuIFRyaWdnZXJzIHN5c3RlbSByZXNldCBhZnRlciAxMDAgbXMuDQorICAgIC8vIFdlIGFsc28gY2hlY2sgMyBzdWItd2F0Y2hkb2dzIHRoYXQgbW9uaXRvciB0aGUgKGludGVycnVwdCkgbG9vcHMgZm9yIENBTiwNCisgICAgLy8gUFdNIGFuZCBTUEkuIFRoaXMgbWFpbiB3YXRjaGRvZyBpcyBvbmx5IGZlZCB3aGVuIGFsbCBhcmUgZmVkLg0KKw0KKyAgICBpZiAoY3VycmVudF90aW1lX3VzIC0gbGFzdF9jYW5fd2F0Y2hkb2dfdXNfY29weSA+IENBTl9XQVRDSERPR19USU1FT1VUX1VTKSB7DQorICAgICAgLy8gVE9ETyhzaW5keSk6IGFkZCB1YXJ0IGxvZ2dpbmcgaW4gZnV0dXJlIFBSIC0tICJDQU4gd2F0Y2hkb2cgdGltZW91dCINCisgICAgfSBlbHNlIGlmIChjdXJyZW50X3RpbWVfdXMgLSBsYXN0X3B3bV93YXRjaGRvZ191c19jb3B5ID4NCisgICAgICAgICAgICAgICBQV01fV0FUQ0hET0dfVElNRU9VVF9VUykgew0KKyAgICAgIC8vIFRPRE8oc2luZHkpOiBhZGQgdWFydCBsb2dnaW5nIGluIGZ1dHVyZSBQUiAtLSAiUFdNIHdhdGNoZG9nIHRpbWVvdXQiDQorICAgIH0gZWxzZSBpZiAoY3VycmVudF90aW1lX3VzIC0gbGFzdF9zcGlfdW5vX3dhdGNoZG9nX3VzX2NvcHkgPg0KKyAgICAgICAgICAgICAgIFNQSV9XQVRDSERPR19USU1FT1VUX1VTKSB7DQorICAgICAgLy8gVE9ETyhzaW5keSk6IGFkZCB1YXJ0IGxvZ2dpbmcgaW4gZnV0dXJlIFBSIC0tICJTUEkgVU5PIHdhdGNoZG9nDQorICAgICAgLy8gdGltZW91dCINCisgICAgfSBlbHNlIGlmIChjdXJyZW50X3RpbWVfdXMgLSBsYXN0X3NwaV9kdWVfd2F0Y2hkb2dfdXNfY29weSA+DQorICAgICAgICAgICAgICAgU1BJX1dBVENIRE9HX1RJTUVPVVRfVVMpIHsNCisgICAgICAvLyBUT0RPKHNpbmR5KTogYWRkIHVhcnQgbG9nZ2luZyBpbiBmdXR1cmUgUFIgLS0gIlNQSSBEVUUgd2F0Y2hkb2cNCisgICAgICAvLyB0aW1lb3V0Ig0KKyAgICB9IGVsc2UgaWYgKGN1cnJlbnRfdGltZV91cyAtIGxhc3Rfc3BpX3Rka193YXRjaGRvZ191c19jb3B5ID4NCisgICAgICAgICAgICAgICBTUElfV0FUQ0hET0dfVElNRU9VVF9VUykgew0KKyAgICAgIC8vIFRPRE8oc2luZHkpOiBhZGQgdWFydCBsb2dnaW5nIGluIGZ1dHVyZSBQUiAtLSAiU1BJIFRESyB3YXRjaGRvZw0KKyAgICAgIC8vIHRpbWVvdXQiDQorICAgIH0gZWxzZSB7DQorICAgICAgSEFMX0lXREdfUmVmcmVzaCgmaGl3ZGcpOw0KKyAgICB9DQogICB9DQogICAvKiBVU0VSIENPREUgRU5EIDMgKi8NCiB9DQpAQCAtMjM3LDkgKzI5OSwxMSBAQAogICAvKiogSW5pdGlhbGl6ZXMgdGhlIFJDQyBPc2NpbGxhdG9ycyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzDQogICAgKiBpbiB0aGUgUkNDX09zY0luaXRUeXBlRGVmIHN0cnVjdHVyZS4NCiAgICAqLw0KLSAgUkNDX09zY0luaXRTdHJ1Y3QuT3NjaWxsYXRvclR5cGUgPQ0KLSAgICAgIFJDQ19PU0NJTExBVE9SVFlQRV9IU0k0OCB8IFJDQ19PU0NJTExBVE9SVFlQRV9IU0U7DQorICBSQ0NfT3NjSW5pdFN0cnVjdC5Pc2NpbGxhdG9yVHlwZSA9IFJDQ19PU0NJTExBVE9SVFlQRV9IU0k0OCB8DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19PU0NJTExBVE9SVFlQRV9MU0kgfA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NfT1NDSUxMQVRPUlRZUEVfSFNFOw0KICAgUkNDX09zY0luaXRTdHJ1Y3QuSFNFU3RhdGUgPSBSQ0NfSFNFX09OOw0KKyAgUkNDX09zY0luaXRTdHJ1Y3QuTFNJU3RhdGUgPSBSQ0NfTFNJX09OOw0KICAgUkNDX09zY0luaXRTdHJ1Y3QuSFNJNDhTdGF0ZSA9IFJDQ19IU0k0OF9PTjsNCiAgIFJDQ19Pc2NJbml0U3RydWN0LlBMTC5QTExTdGF0ZSA9IFJDQ19QTExfT047DQogICBSQ0NfT3NjSW5pdFN0cnVjdC5QTEwuUExMU291cmNlID0gUkNDX1BMTFNPVVJDRV9IU0U7DQpAQCAtMzYwLDYgKzQyNCwzMSBAQAogfQ0KIA0KIC8qKg0KKyAqIEBicmllZiBJV0RHIEluaXRpYWxpemF0aW9uIEZ1bmN0aW9uDQorICogQHBhcmFtIE5vbmUNCisgKiBAcmV0dmFsIE5vbmUNCisgKi8NCitzdGF0aWMgdm9pZCBNWF9JV0RHX0luaXQodm9pZCkgew0KKyAgLyogVVNFUiBDT0RFIEJFR0lOIElXREdfSW5pdCAwICovDQorDQorICAvKiBVU0VSIENPREUgRU5EIElXREdfSW5pdCAwICovDQorDQorICAvKiBVU0VSIENPREUgQkVHSU4gSVdER19Jbml0IDEgKi8NCisNCisgIC8qIFVTRVIgQ09ERSBFTkQgSVdER19Jbml0IDEgKi8NCisgIGhpd2RnLkluc3RhbmNlID0gSVdERzsNCisgIGhpd2RnLkluaXQuUHJlc2NhbGVyID0gSVdER19QUkVTQ0FMRVJfMTY7DQorICBoaXdkZy5Jbml0LldpbmRvdyA9IDQwOTU7DQorICBoaXdkZy5Jbml0LlJlbG9hZCA9IDIwMDsNCisgIGlmIChIQUxfSVdER19Jbml0KCZoaXdkZykgIT0gSEFMX09LKSB7DQorICAgIEVycm9yX0hhbmRsZXIoKTsNCisgIH0NCisgIC8qIFVTRVIgQ09ERSBCRUdJTiBJV0RHX0luaXQgMiAqLw0KKw0KKyAgLyogVVNFUiBDT0RFIEVORCBJV0RHX0luaXQgMiAqLw0KK30NCisNCisvKioNCiAgKiBAYnJpZWYgU1BJMSBJbml0aWFsaXphdGlvbiBGdW5jdGlvbg0KICAqIEBwYXJhbSBOb25lDQogICogQHJldHZhbCBOb25lDQpAQCAtNTI3LDcgKzYxNiw3IEBACiAgIGh0aW0yLkluc3RhbmNlID0gVElNMjsNCiAgIGh0aW0yLkluaXQuUHJlc2NhbGVyID0gMTY4IC0gMTsNCiAgIGh0aW0yLkluaXQuQ291bnRlck1vZGUgPSBUSU1fQ09VTlRFUk1PREVfVVA7DQotICBodGltMi5Jbml0LlBlcmlvZCA9IDQuMjk0OTY3Mjk1RTk7DQorICBodGltMi5Jbml0LlBlcmlvZCA9IDQyOTQ5NjcyOTU7DQogICBodGltMi5Jbml0LkNsb2NrRGl2aXNpb24gPSBUSU1fQ0xPQ0tESVZJU0lPTl9ESVYxOw0KICAgaHRpbTIuSW5pdC5BdXRvUmVsb2FkUHJlbG9hZCA9IFRJTV9BVVRPUkVMT0FEX1BSRUxPQURfRU5BQkxFOw0KICAgaWYgKEhBTF9USU1fQmFzZV9Jbml0KCZodGltMikgIT0gSEFMX09LKSB7DQpAQCAtNzc3LDcgKzg2Niw5IEBACiAgIC8vIFRES19QV1JfRU4gc3RhcnRzIGhpZ2gsIG11c3QgYmUgc2V0IGxvdyBiZWZvcmUgcmVhZGluZw0KICAgSEFMX0dQSU9fV3JpdGVQaW4oVERLX1BXUl9FTl9HUElPX1BvcnQsIFRES19QV1JfRU5fUGluLCBHUElPX1BJTl9SRVNFVCk7DQogICAvLyBUREtfRU4gc3RhcnRzIGhpZ2gsIG11c3QgYmUgc2V0IGxvdyBhZnRlciBhIGRlbGF5IGZyb20gVERLX1BXUl9FTg0KLSAgSEFMX0RlbGF5KDEwMDApOw0KKw0KKyAgRGVsYXlXaXRoV2F0Y2hkb2coMTAwMCk7DQorDQogICBIQUxfR1BJT19Xcml0ZVBpbihUREtfRU5fR1BJT19Qb3J0LCBUREtfRU5fUGluLCBHUElPX1BJTl9SRVNFVCk7DQogfQ0KIA0KQEAgLTg3NiwyMSArOTY3LDIxIEBACiANCiAgIEhBTF9HUElPX1dyaXRlUGluKFJFU0VUX1VOT19HUElPX1BvcnQsIFJFU0VUX1VOT19QaW4sDQogICAgICAgICAgICAgICAgICAgICBHUElPX1BJTl9SRVNFVCk7ICAvLyBSZXNldCBVTk8NCi0gIEhBTF9EZWxheSgxKTsNCisgIERlbGF5V2l0aFdhdGNoZG9nKDEpOw0KICAgSEFMX0dQSU9fV3JpdGVQaW4oUkVTRVRfVU5PX0dQSU9fUG9ydCwgUkVTRVRfVU5PX1BpbiwgR1BJT19QSU5fU0VUKTsNCiAgIEhBTF9HUElPX1dyaXRlUGluKFJFU0VUX0RVRV9HUElPX1BvcnQsIFJFU0VUX0RVRV9QaW4sDQogICAgICAgICAgICAgICAgICAgICBHUElPX1BJTl9SRVNFVCk7ICAvLyBSZXNldCBEVUUNCi0gIEhBTF9EZWxheSgxKTsNCisgIERlbGF5V2l0aFdhdGNoZG9nKDEpOw0KICAgSEFMX0dQSU9fV3JpdGVQaW4oUkVTRVRfRFVFX0dQSU9fUG9ydCwgUkVTRVRfRFVFX1BpbiwgR1BJT19QSU5fU0VUKTsNCiANCi0gIEhBTF9EZWxheSgyNSk7DQorICBEZWxheVdpdGhXYXRjaGRvZygyNSk7DQogDQogICBTZW5kU3BpRHVlKE1ha2VTcGlSZWFkTXNnTXVyYXRhKEFDQ19EQzFfQUREUkVTUykpOyAgLy8gY3h4X2N4eSBhZGRyZXNzDQogDQogICBTZW5kU3BpRHVlKFdSSVRFX09QX01PREVfTk9STUFMKTsNCiAgIFNlbmRTcGlEdWUoV1JJVEVfT1BfTU9ERV9OT1JNQUwpOw0KICAgU2VuZFNwaVVubyhXUklURV9PUF9NT0RFX05PUk1BTCk7DQotICBIQUxfRGVsYXkoNzApOw0KKyAgRGVsYXlXaXRoV2F0Y2hkb2coNzApOw0KIA0KICAgU2VuZFNwaUR1ZShXUklURV9NT0RFX0FTTV8wMTApOw0KICAgU2VuZFNwaUR1ZShSRUFEX01PREUpOw0KQEAgLTk0OCwxOSArMTAzOSwxOSBAQAogDQogICBIQUxfR1BJT19Xcml0ZVBpbihSRVNFVF9VTk9fR1BJT19Qb3J0LCBSRVNFVF9VTk9fUGluLA0KICAgICAgICAgICAgICAgICAgICAgR1BJT19QSU5fUkVTRVQpOyAgLy8gUmVzZXQgVU5PDQotICBIQUxfRGVsYXkoMSk7DQorICBEZWxheVdpdGhXYXRjaGRvZygxKTsNCiAgIEhBTF9HUElPX1dyaXRlUGluKFJFU0VUX1VOT19HUElPX1BvcnQsIFJFU0VUX1VOT19QaW4sIEdQSU9fUElOX1NFVCk7DQogICBIQUxfR1BJT19Xcml0ZVBpbihSRVNFVF9EVUVfR1BJT19Qb3J0LCBSRVNFVF9EVUVfUGluLA0KICAgICAgICAgICAgICAgICAgICAgR1BJT19QSU5fUkVTRVQpOyAgLy8gUmVzZXQgRFVFDQotICBIQUxfRGVsYXkoMSk7DQorICBEZWxheVdpdGhXYXRjaGRvZygxKTsNCiAgIEhBTF9HUElPX1dyaXRlUGluKFJFU0VUX0RVRV9HUElPX1BvcnQsIFJFU0VUX0RVRV9QaW4sIEdQSU9fUElOX1NFVCk7DQogDQotICBIQUxfRGVsYXkoMjUpOw0KKyAgRGVsYXlXaXRoV2F0Y2hkb2coMjUpOw0KIA0KICAgU2VuZFNwaUR1ZShXUklURV9PUF9NT0RFX05PUk1BTCk7DQogICBTZW5kU3BpRHVlKFdSSVRFX09QX01PREVfTk9STUFMKTsNCiAgIFNlbmRTcGlVbm8oV1JJVEVfT1BfTU9ERV9OT1JNQUwpOw0KLSAgSEFMX0RlbGF5KDcwKTsNCisgIERlbGF5V2l0aFdhdGNoZG9nKDcwKTsNCiANCiAgIFNlbmRTcGlVbm8oDQogICAgICAgTWFrZVNwaU1zZ011cmF0YShNVVJBVEFfR1lST19GSUxURVJfQUREUiwgTVVSQVRBX0dZUk9fRklMVEVSXzMwMEhaKSk7DQpAQCAtOTY4LDE5ICsxMDU5LDE5IEBACiANCiAgIEhBTF9HUElPX1dyaXRlUGluKFJFU0VUX0RVRV9HUElPX1BvcnQsIFJFU0VUX0RVRV9QaW4sDQogICAgICAgICAgICAgICAgICAgICBHUElPX1BJTl9SRVNFVCk7ICAvLyBSZXNldCBEVUUNCi0gIEhBTF9EZWxheSgxKTsNCisgIERlbGF5V2l0aFdhdGNoZG9nKDEpOw0KICAgSEFMX0dQSU9fV3JpdGVQaW4oUkVTRVRfRFVFX0dQSU9fUG9ydCwgUkVTRVRfRFVFX1BpbiwgR1BJT19QSU5fU0VUKTsNCi0gIEhBTF9EZWxheSgyNSk7DQorICBEZWxheVdpdGhXYXRjaGRvZygyNSk7DQogDQogICBTZW5kU3BpRHVlKFdSSVRFX09QX01PREVfTk9STUFMKTsNCiAgIFNlbmRTcGlEdWUoV1JJVEVfT1BfTU9ERV9OT1JNQUwpOw0KLSAgSEFMX0RlbGF5KDEpOw0KKyAgRGVsYXlXaXRoV2F0Y2hkb2coMSk7DQogDQogICBTZW5kU3BpRHVlKA0KICAgICAgIE1ha2VTcGlNc2dNdXJhdGEoTVVSQVRBX0dZUk9fRklMVEVSX0FERFIsIE1VUkFUQV9HWVJPX0ZJTFRFUl8zMDBIWikpOw0KIA0KICAgZm9yIChudW1fYXR0ZW1wdHMgPSAwOyBudW1fYXR0ZW1wdHMgPCAyOyBudW1fYXR0ZW1wdHMrKykgew0KLSAgICBIQUxfRGVsYXkoNDA1KTsNCisgICAgRGVsYXlXaXRoV2F0Y2hkb2coNDA1KTsNCiANCiAgICAgU2VuZFNwaUR1ZShXUklURV9FT0lfQklUKTsNCiAgICAgU2VuZFNwaVVubyhXUklURV9FT0lfQklUKTsNCkBAIC05ODgsMzIgKzEwNzksMzIgQEAKICAgICAvKiBVTk8gKi8NCiAgICAgU2VuZFNwaVVubyhSRUFEX1NVTU1BUllfU1RBVFVTKTsNCiAgICAgU2VuZFNwaVVubyhSRUFEX1NVTU1BUllfU1RBVFVTKTsNCi0gICAgSEFMX0RlbGF5KDMpOw0KKyAgICBEZWxheVdpdGhXYXRjaGRvZygzKTsNCiAgICAgcmVzcG9uc2VfdW5vID0gU2VuZFNwaVVubyhSRUFEX1NVTU1BUllfU1RBVFVTKTsNCiAgICAgdW5vX29rID0gIUNIRUNLX1JTX0VSUk9SKHJlc3BvbnNlX3Vubyk7DQogDQogICAgIC8qIERVRSAqLw0KICAgICBTZW5kU3BpRHVlKFJFQURfU1VNTUFSWV9TVEFUVVMpOw0KICAgICBTZW5kU3BpRHVlKFJFQURfU1VNTUFSWV9TVEFUVVMpOw0KLSAgICBIQUxfRGVsYXkoMyk7DQorICAgIERlbGF5V2l0aFdhdGNoZG9nKDMpOw0KICAgICByZXNwb25zZV9kdWUgPSBTZW5kU3BpRHVlKFJFQURfU1VNTUFSWV9TVEFUVVMpOw0KICAgICBkdWVfb2sgPSAhQ0hFQ0tfUlNfRVJST1IocmVzcG9uc2VfZHVlKTsNCiANCiAgICAgaWYgKChkdWVfb2sgPT0gZmFsc2UgfHwgdW5vX29rID09IGZhbHNlKSAmJiAobnVtX2F0dGVtcHRzID09IDApKSB7DQogICAgICAgSEFMX0dQSU9fV3JpdGVQaW4oUkVTRVRfVU5PX0dQSU9fUG9ydCwgUkVTRVRfVU5PX1BpbiwNCiAgICAgICAgICAgICAgICAgICAgICAgICBHUElPX1BJTl9SRVNFVCk7ICAvLyBSZXNldCBVTk8NCi0gICAgICBIQUxfRGVsYXkoMSk7DQorICAgICAgRGVsYXlXaXRoV2F0Y2hkb2coMSk7DQogICAgICAgSEFMX0dQSU9fV3JpdGVQaW4oUkVTRVRfVU5PX0dQSU9fUG9ydCwgUkVTRVRfVU5PX1BpbiwgR1BJT19QSU5fU0VUKTsNCiAgICAgICBIQUxfR1BJT19Xcml0ZVBpbihSRVNFVF9EVUVfR1BJT19Qb3J0LCBSRVNFVF9EVUVfUGluLA0KICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU9fUElOX1JFU0VUKTsgIC8vIFJlc2V0IERVRQ0KLSAgICAgIEhBTF9EZWxheSgxKTsNCisgICAgICBEZWxheVdpdGhXYXRjaGRvZygxKTsNCiAgICAgICBIQUxfR1BJT19Xcml0ZVBpbihSRVNFVF9EVUVfR1BJT19Qb3J0LCBSRVNFVF9EVUVfUGluLCBHUElPX1BJTl9TRVQpOw0KLSAgICAgIEhBTF9EZWxheSgyNSk7DQorICAgICAgRGVsYXlXaXRoV2F0Y2hkb2coMjUpOw0KIA0KICAgICAgIFNlbmRTcGlEdWUoV1JJVEVfT1BfTU9ERV9OT1JNQUwpOw0KICAgICAgIFNlbmRTcGlEdWUoV1JJVEVfT1BfTU9ERV9OT1JNQUwpOw0KICAgICAgIFNlbmRTcGlVbm8oV1JJVEVfT1BfTU9ERV9OT1JNQUwpOw0KLSAgICAgIEhBTF9EZWxheSg1MCk7DQorICAgICAgRGVsYXlXaXRoV2F0Y2hkb2coNTApOw0KIA0KICAgICAgIFNlbmRTcGlVbm8oDQogICAgICAgICAgIE1ha2VTcGlNc2dNdXJhdGEoTVVSQVRBX0dZUk9fRklMVEVSX0FERFIsIE1VUkFUQV9HWVJPX0ZJTFRFUl8zMDBIWikpOw0KQEAgLTEwMjEsNyArMTExMiw3IEBACiAgICAgICAgICAgTWFrZVNwaU1zZ011cmF0YShNVVJBVEFfQUNDX0ZJTFRFUl9BRERSLCBNVVJBVEFfQUNDX0ZJTFRFUl8zMDBIWikpOw0KICAgICAgIFNlbmRTcGlEdWUoDQogICAgICAgICAgIE1ha2VTcGlNc2dNdXJhdGEoTVVSQVRBX0dZUk9fRklMVEVSX0FERFIsIE1VUkFUQV9HWVJPX0ZJTFRFUl8zMDBIWikpOw0KLSAgICAgIEhBTF9EZWxheSg0NSk7DQorICAgICAgRGVsYXlXaXRoV2F0Y2hkb2coNDUpOw0KICAgICB9IGVsc2Ugew0KICAgICAgIGJyZWFrOw0KICAgICB9DQpAQCAtMTA0MSw3ICsxMTMyLDcgQEAKIA0KICAgLy8gU2VuZCAweDgxIHRvIFBXUl9NR01UIHRvIGluaXRpYWxpemUgU1BJDQogICBTZW5kU3BpVGRrKFBXUl9NR01UXzEsIDB4ODEsIGZhbHNlKTsNCi0gIEhBTF9EZWxheSgxMDApOw0KKyAgRGVsYXlXaXRoV2F0Y2hkb2coMTAwKTsNCiANCiAgIC8vIFNldHRpbmcgdGhlIHNhbXBsZSByYXRlcyBmb3IgVERLDQogICBTZW5kU3BpVGRrKFVTRVJfQ1RSTCwgMHg1NSwgZmFsc2UpOw0KQEAgLTExMDAsNiArMTE5MSw3IEBACiAgICAgICAgICAgcmVzdWx0ID0gcHdtX3BlcmlvZCAqIC45ZjsNCiAgICAgICAgIH0NCiAgICAgICAgIFRJTTMtPkNDUjMgPSByZXN1bHQ7DQorICAgICAgICBsYXN0X3B3bV93YXRjaGRvZ191cyA9IF9fSEFMX1RJTV9HZXRDb3VudGVyKCZodGltMik7DQogICAgICAgICBicmVhazsNCiANCiAgICAgICBjYXNlIFRJTV9DSEFOTkVMXzQ6DQpAQCAtMTExNyw2ICsxMjA5LDcgQEAKICAgICAgICAgICByZXN1bHQgPSBwd21fcGVyaW9kICogLjlmOw0KICAgICAgICAgfQ0KICAgICAgICAgVElNMy0+Q0NSNCA9IHJlc3VsdDsNCisgICAgICAgIGxhc3RfcHdtX3dhdGNoZG9nX3VzID0gX19IQUxfVElNX0dldENvdW50ZXIoJmh0aW0yKTsNCiAgICAgICAgIGJyZWFrOw0KIA0KICAgICAgIGRlZmF1bHQ6DQpAQCAtMTM3Nyw2ICsxNDcwLDcgQEAKICAgICAgIH0NCiANCiAgICAgICAqcmVzID0gU1BJX1JFQURZOw0KKyAgICAgIGxhc3Rfc3BpX3Rka193YXRjaGRvZ191cyA9IF9fSEFMX1RJTV9HZXRDb3VudGVyKCZodGltMik7DQogICAgICAgYnJlYWs7DQogICB9DQogfQ0KQEAgLTE0MjYsMTAgKzE1MjAsMzIgQEAKICAgICAgIH0NCiANCiAgICAgICAqcmVzID0gU1BJX1JFQURZOw0KKyAgICAgIGxhc3Rfc3BpX3Vub193YXRjaGRvZ191cyA9IF9fSEFMX1RJTV9HZXRDb3VudGVyKCZodGltMik7DQorICAgICAgbGFzdF9zcGlfZHVlX3dhdGNoZG9nX3VzID0gX19IQUxfVElNX0dldENvdW50ZXIoJmh0aW0yKTsNCiAgICAgICBicmVhazsNCiAgIH0NCiB9DQogDQorc3RhdGljIHVpbnQxNl90IEdldFdhdGNoZG9nVGltZW91dE1zKHZvaWQpIHsNCisgIHJldHVybiAodWludDE2X3QpKCh1aW50MzJfdCkoMTAwMCkgKiBoaXdkZy5Jbml0LlJlbG9hZCAqDQorICAgICAgICAgICAgICAgICAgICBoaXdkZy5Jbml0LlByZXNjYWxlciAvIExTSV9DTE9DS19GUkVRX0haKTsNCit9DQorDQorc3RhdGljIHZvaWQgRGVsYXlXaXRoV2F0Y2hkb2codWludDE2X3QgZGVsYXlfbXMpIHsNCisgIC8vIERlbGF5IHdpdGhvdXQgdHJpZ2dlcmluZyB3YXRjaGRvZyByZXNldC4gV2UgZG8gdGhpcyBieSBmZWVkaW5nIHRoZSB3YXRjaGRvZw0KKyAgLy8gYXQgbGVhc3Qgb25jZSBkdXJpbmcgdGhpcyBpbnRlcnZhbDsgaGVyZSB3ZSBhcmJpdHJhcmlseSBjaG9vc2UgZG8gaXQgMw0KKyAgLy8gdGltZXMuIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIHdpbGwgY2F1c2UgYSBkZWxheSBvZiBzbGlnaHRseSBsb25nZXIgdGhhbg0KKyAgLy8gdGhlIHJlcXVlc3RlZCBkdWUgdG8gbm9uemVybyBjb21wdXRlIHRpbWUuDQorICB1aW50MTZfdCB3YXRjaGRvZ19wZXRfcGVyaW9kX21zID0gR2V0V2F0Y2hkb2dUaW1lb3V0TXMoKSAvIDM7DQorICB1aW50MTZfdCByZW1haW5pbmdfZGVsYXlfdGltZV9tcyA9IGRlbGF5X21zOw0KKyAgd2hpbGUgKHdhdGNoZG9nX3BldF9wZXJpb2RfbXMgPCByZW1haW5pbmdfZGVsYXlfdGltZV9tcykgew0KKyAgICBIQUxfRGVsYXkod2F0Y2hkb2dfcGV0X3BlcmlvZF9tcyk7DQorICAgIEhBTF9JV0RHX1JlZnJlc2goJmhpd2RnKTsNCisgICAgcmVtYWluaW5nX2RlbGF5X3RpbWVfbXMgLT0gd2F0Y2hkb2dfcGV0X3BlcmlvZF9tczsNCisgIH0NCisgIEhBTF9EZWxheShyZW1haW5pbmdfZGVsYXlfdGltZV9tcyk7DQorfQ0KKw0KIHZvaWQgSEFMX1RJTV9QZXJpb2RFbGFwc2VkQ2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pIHsNCiAgIGlmIChodGltID09ICZodGltMSkgew0KICAgICB0aW1lcl9pbmRleCsrOw0KQEAgLTE0NzIsNiArMTU4OCw3IEBACiAgICAgICAgIH0NCiAgICAgICB9DQogICAgICAgY2FuX3R4X3BhY2tldF9jb3VudGVyICs9IDM7DQorICAgICAgbGFzdF9jYW5fd2F0Y2hkb2dfdXMgPSBfX0hBTF9USU1fR2V0Q291bnRlcigmaHRpbTIpOw0KIA0KICAgICAgIFNwaVRkayh0ZGtfZGF0YSwgJmhzcGkxLCAmdGRrX3N0YXRlLCBTUElfUlVOKTsNCiAgICAgICBTcGlNdXJhdGEodW5vX2RhdGEsICZoc3BpMiwgJnVub19zdGF0ZSwgU1BJX1JVTik7DQpAQCAtMTUxOSw3ICsxNjM2LDcgQEAKICAgICB9DQogDQogICAgIHRka19kYXRhW3RpbWVyX2luZGV4XS5zdGF0ZSsrOw0KLSAgICBpZiAodGRrX2RhdGFbdGltZXJfaW5kZXhdLnN0YXRlID09IDgpIHsNCisgICAgaWYgKHRka19kYXRhW3RpbWVyX2luZGV4XS5zdGF0ZSA+PSA4KSB7DQogICAgICAgU3BpQ3NFbmQoaHNwaSk7DQogICAgICAgdGRrX2RhdGFbdGltZXJfaW5kZXhdLnN0YXRlID0gMDsNCiAgICAgICBjYW5fb3V0LnRka19jb3VudGVyKys7DQpkaWZmIC0tZ2l0IGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Db3JlL1NyYy9zdG0zMmc0eHhfaGFsX21zcC5jIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Db3JlL1NyYy9zdG0zMmc0eHhfaGFsX21zcC5jCmluZGV4IGYzMTVkZmEuLmU0MTQyMTAgMTAwNjQ0Ci0tLSBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvQ29yZS9TcmMvc3RtMzJnNHh4X2hhbF9tc3AuYworKysgYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0NvcmUvU3JjL3N0bTMyZzR4eF9oYWxfbXNwLmMKQEAgLTEsMyArMSw0IEBACisNCiAvKiBVU0VSIENPREUgQkVHSU4gSGVhZGVyICovDQogLyoqDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KQEAgLTIwLDcgKzIxLDYgQEAKIA0KIC8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQogI2luY2x1ZGUgIm1haW4uaCINCi0NCiAvKiBVU0VSIENPREUgQkVHSU4gSW5jbHVkZXMgKi8NCiANCiAvKiBVU0VSIENPREUgRU5EIEluY2x1ZGVzICovDQpkaWZmIC0tZ2l0IGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9EZWJ1Zy9Db3JlL1NyYy9zdWJkaXIubWsgYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RlYnVnL0NvcmUvU3JjL3N1YmRpci5tawppbmRleCBmNGM4MTAzLi44ZmU5MTQwIDEwMDY0NAotLS0gYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RlYnVnL0NvcmUvU3JjL3N1YmRpci5taworKysgYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RlYnVnL0NvcmUvU3JjL3N1YmRpci5tawpAQCAtMSw2ICsxLDYgQEAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIEF1dG9tYXRpY2FsbHktZ2VuZXJhdGVkIGZpbGUuIERvIG5vdCBlZGl0IQotIyBUb29sY2hhaW46IEdOVSBUb29scyBmb3IgU1RNMzIgKDExLjMucmVsMSkKKyMgVG9vbGNoYWluOiBHTlUgVG9vbHMgZm9yIFNUTTMyICgxMi4zLnJlbDEpCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCiAjIEFkZCBpbnB1dHMgYW5kIG91dHB1dHMgZnJvbSB0aGVzZSB0b29sIGludm9jYXRpb25zIHRvIHRoZSBidWlsZCB2YXJpYWJsZXMgCmRpZmYgLS1naXQgYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RlYnVnL0NvcmUvU3RhcnR1cC9zdWJkaXIubWsgYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RlYnVnL0NvcmUvU3RhcnR1cC9zdWJkaXIubWsKaW5kZXggOTU0YTZiZS4uZDZiN2I2MyAxMDA2NDQKLS0tIGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9EZWJ1Zy9Db3JlL1N0YXJ0dXAvc3ViZGlyLm1rCisrKyBiL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRGVidWcvQ29yZS9TdGFydHVwL3N1YmRpci5tawpAQCAtMSw2ICsxLDYgQEAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIEF1dG9tYXRpY2FsbHktZ2VuZXJhdGVkIGZpbGUuIERvIG5vdCBlZGl0IQotIyBUb29sY2hhaW46IEdOVSBUb29scyBmb3IgU1RNMzIgKDExLjMucmVsMSkKKyMgVG9vbGNoYWluOiBHTlUgVG9vbHMgZm9yIFNUTTMyICgxMi4zLnJlbDEpCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCiAjIEFkZCBpbnB1dHMgYW5kIG91dHB1dHMgZnJvbSB0aGVzZSB0b29sIGludm9jYXRpb25zIHRvIHRoZSBidWlsZCB2YXJpYWJsZXMgCmRpZmYgLS1naXQgYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RlYnVnL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N1YmRpci5tayBiL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRGVidWcvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3ViZGlyLm1rCmluZGV4IDA3YWVlODMuLjdkMDg2ZmEgMTAwNjQ0Ci0tLSBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRGVidWcvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3ViZGlyLm1rCisrKyBiL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRGVidWcvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3ViZGlyLm1rCkBAIC0xLDYgKzEsNiBAQAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMgQXV0b21hdGljYWxseS1nZW5lcmF0ZWQgZmlsZS4gRG8gbm90IGVkaXQhCi0jIFRvb2xjaGFpbjogR05VIFRvb2xzIGZvciBTVE0zMiAoMTEuMy5yZWwxKQorIyBUb29sY2hhaW46IEdOVSBUb29scyBmb3IgU1RNMzIgKDEyLjMucmVsMSkKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKICMgQWRkIGlucHV0cyBhbmQgb3V0cHV0cyBmcm9tIHRoZXNlIHRvb2wgaW52b2NhdGlvbnMgdG8gdGhlIGJ1aWxkIHZhcmlhYmxlcyAKQEAgLTE3LDYgKzE3LDcgQEAKIC4uL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfZmxhc2hfZXguYyBcCiAuLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX2ZsYXNoX3JhbWZ1bmMuYyBcCiAuLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX2dwaW8uYyBcCisuLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX2l3ZGcuYyBcCiAuLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3BjZC5jIFwKIC4uL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfcGNkX2V4LmMgXAogLi4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9wd3IuYyBcCkBAIC00NSw2ICs0Niw3IEBACiAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfZmxhc2hfZXgubyBcCiAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfZmxhc2hfcmFtZnVuYy5vIFwKIC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9ncGlvLm8gXAorLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX2l3ZGcubyBcCiAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfcGNkLm8gXAogLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3BjZF9leC5vIFwKIC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9wd3IubyBcCkBAIC03Myw2ICs3NSw3IEBACiAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfZmxhc2hfZXguZCBcCiAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfZmxhc2hfcmFtZnVuYy5kIFwKIC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9ncGlvLmQgXAorLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX2l3ZGcuZCBcCiAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfcGNkLmQgXAogLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3BjZF9leC5kIFwKIC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9wd3IuZCBcCkBAIC05Niw4ICs5OSw4IEBACiBjbGVhbjogY2xlYW4tRHJpdmVycy0yZi1TVE0zMkc0eHhfSEFMX0RyaXZlci0yZi1TcmMKIAogY2xlYW4tRHJpdmVycy0yZi1TVE0zMkc0eHhfSEFMX0RyaXZlci0yZi1TcmM6Ci0JLSQoUk0pIC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbC5jeWNsbyAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWwuZCAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWwubyAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWwuc3UgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX2FkYy5jeWNsbyAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfYWRjLmQgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX2FkYy5vIC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9hZGMuc3UgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX2FkY19leC5jeWNsbyAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfYWRjX2V4LmQgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX2FkY19leC5vIC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9hZGNfZXguc3UgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX2NvcnRleC5jeWNsbyAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfY29ydGV4LmQgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX2NvcnRleC5vIC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9jb3J0ZXguc3UgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX2RtYS5jeWNsbyAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfZG1hLmQgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX2RtYS5vIC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9kbWEuc3UgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX2RtYV9leC5jeWNsbyAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfZG1hX2V4LmQgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX2RtYV9leC5vIC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9kbWFfZXguc3UgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX2V4dGkuY3ljbG8gLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX2V4dGkuZCAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfZXh0aS5vIC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9leHRpLnN1IC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9mZGNhbi5jeWNsbyAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfZmRjYW4uZCAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfZmRjYW4ubyAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfZmRjYW4uc3UgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX2ZsYXNoLmN5Y2xvIC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9mbGFzaC5kIC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9mbGFzaC5vIC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9mbGFzaC5zdSAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfZmxhc2hfZXguY3ljbG8gLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX2ZsYXNoX2V4LmQgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX2ZsYXNoX2V4Lm8gLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX2ZsYXNoX2V4LnN1IC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9mbGFzaF9yYW1mdW5jLmN5Y2xvIC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9mbGFzaF9yYW1mdW5jLmQgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX2ZsYXNoX3JhbWZ1bmMubyAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfZmxhc2hfcmFtZnVuYy5zdSAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfZ3Bpby5jeWNsbyAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfZ3Bpby5kIC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9ncGlvLm8gLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX2dwaW8uc3UgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3BjZC5jeWNsbyAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfcGNkLmQgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3BjZC5vIC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9wY2Quc3UgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3BjZF9leC5jeWNsbyAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfcGNkX2V4LmQgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3BjZF9leC5vIC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9wY2RfZXguc3UgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3B3ci5jeWNsbyAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfcHdyLmQgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3B3ci5vIC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9wd3Iuc3UgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3B3cl9leC5jeWNsbyAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfcHdyX2V4LmQgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3B3cl9leC5vIC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9wd3JfZXguc3UgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3JjYy5jeWNsbyAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfcmNjLmQgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3JjYy5vIC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9yY2Muc3UgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3JjY19leC5jeWNsbyAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfcmNjX2V4LmQgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3JjY19leC5vIC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9yY2NfZXguc3UgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3NwaS5jeWNsbyAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfc3BpLmQgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3NwaS5vIC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9zcGkuc3UgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3NwaV9leC5jeWNsbyAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfc3BpX2V4LmQgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3NwaV9leC5vIC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9zcGlfZXguc3UgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3RpbS5jeWNsbyAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfdGltLmQgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3RpbS5vIC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF90aW0uc3UgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3RpbV9leC5jeWNsbyAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfdGltX2V4LmQgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3RpbV9leC5vIC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF90aW1fZXguc3UgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3VhcnQuY3ljbG8gLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3VhcnQuZCAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfdWFydC5vIC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF91YXJ0LnN1IC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF91YXJ0X2V4LmN5Y2xvIC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF91YXJ0X2V4LmQgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3VhcnRfZXgubyAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfdWFydF9leC5zdSAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9sbF9hZGMuY3ljbG8gLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfbGxfYWRjLmQgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfbGxfYWRjLm8gLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfbGxfYWRjLnN1IC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2xsX3VzYi5jeWNsbyAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9sbF91c2IuZCAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9sbF91c2IubwotCS0kKFJNKSAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9sbF91c2Iuc3UKKwktJChSTSkgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsLmN5Y2xvIC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbC5kIC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbC5vIC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbC5zdSAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfYWRjLmN5Y2xvIC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9hZGMuZCAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfYWRjLm8gLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX2FkYy5zdSAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfYWRjX2V4LmN5Y2xvIC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9hZGNfZXguZCAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfYWRjX2V4Lm8gLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX2FkY19leC5zdSAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfY29ydGV4LmN5Y2xvIC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9jb3J0ZXguZCAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfY29ydGV4Lm8gLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX2NvcnRleC5zdSAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfZG1hLmN5Y2xvIC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9kbWEuZCAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfZG1hLm8gLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX2RtYS5zdSAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfZG1hX2V4LmN5Y2xvIC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9kbWFfZXguZCAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfZG1hX2V4Lm8gLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX2RtYV9leC5zdSAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfZXh0aS5jeWNsbyAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfZXh0aS5kIC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9leHRpLm8gLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX2V4dGkuc3UgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX2ZkY2FuLmN5Y2xvIC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9mZGNhbi5kIC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9mZGNhbi5vIC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9mZGNhbi5zdSAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfZmxhc2guY3ljbG8gLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX2ZsYXNoLmQgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX2ZsYXNoLm8gLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX2ZsYXNoLnN1IC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9mbGFzaF9leC5jeWNsbyAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfZmxhc2hfZXguZCAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfZmxhc2hfZXgubyAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfZmxhc2hfZXguc3UgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX2ZsYXNoX3JhbWZ1bmMuY3ljbG8gLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX2ZsYXNoX3JhbWZ1bmMuZCAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfZmxhc2hfcmFtZnVuYy5vIC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9mbGFzaF9yYW1mdW5jLnN1IC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9ncGlvLmN5Y2xvIC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9ncGlvLmQgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX2dwaW8ubyAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfZ3Bpby5zdSAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfaXdkZy5jeWNsbyAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfaXdkZy5kIC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9pd2RnLm8gLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX2l3ZGcuc3UgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3BjZC5jeWNsbyAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfcGNkLmQgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3BjZC5vIC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9wY2Quc3UgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3BjZF9leC5jeWNsbyAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfcGNkX2V4LmQgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3BjZF9leC5vIC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9wY2RfZXguc3UgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3B3ci5jeWNsbyAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfcHdyLmQgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3B3ci5vIC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9wd3Iuc3UgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3B3cl9leC5jeWNsbyAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfcHdyX2V4LmQgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3B3cl9leC5vIC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9wd3JfZXguc3UgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3JjYy5jeWNsbyAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfcmNjLmQgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3JjYy5vIC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9yY2Muc3UgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3JjY19leC5jeWNsbyAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfcmNjX2V4LmQgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3JjY19leC5vIC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9yY2NfZXguc3UgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3NwaS5jeWNsbyAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfc3BpLmQgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3NwaS5vIC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9zcGkuc3UgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3NwaV9leC5jeWNsbyAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfc3BpX2V4LmQgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3NwaV9leC5vIC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9zcGlfZXguc3UgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3RpbS5jeWNsbyAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfdGltLmQgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3RpbS5vIC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF90aW0uc3UgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3RpbV9leC5jeWNsbyAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfdGltX2V4LmQgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3RpbV9leC5vIC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF90aW1fZXguc3UgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3VhcnQuY3ljbG8gLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3VhcnQuZCAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfdWFydC5vIC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF91YXJ0LnN1IC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF91YXJ0X2V4LmN5Y2xvIC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF91YXJ0X2V4LmQgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3VhcnRfZXgubyAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfdWFydF9leC5zdSAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9sbF9hZGMuY3ljbG8gLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfbGxfYWRjLmQgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfbGxfYWRjLm8KKwktJChSTSkgLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfbGxfYWRjLnN1IC4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2xsX3VzYi5jeWNsbyAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9sbF91c2IuZCAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9sbF91c2IubyAuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9sbF91c2Iuc3UKIAogLlBIT05ZOiBjbGVhbi1Ecml2ZXJzLTJmLVNUTTMyRzR4eF9IQUxfRHJpdmVyLTJmLVNyYwogCmRpZmYgLS1naXQgYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RlYnVnL21ha2VmaWxlIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9EZWJ1Zy9tYWtlZmlsZQppbmRleCBlN2NmMGRiLi5lZWQ3YWViIDEwMDY0NAotLS0gYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RlYnVnL21ha2VmaWxlCisrKyBiL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRGVidWcvbWFrZWZpbGUKQEAgLTEsNiArMSw2IEBACiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyBBdXRvbWF0aWNhbGx5LWdlbmVyYXRlZCBmaWxlLiBEbyBub3QgZWRpdCEKLSMgVG9vbGNoYWluOiBHTlUgVG9vbHMgZm9yIFNUTTMyICgxMS4zLnJlbDEpCisjIFRvb2xjaGFpbjogR05VIFRvb2xzIGZvciBTVE0zMiAoMTIuMy5yZWwxKQogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAogLWluY2x1ZGUgLi4vbWFrZWZpbGUuaW5pdApkaWZmIC0tZ2l0IGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9EZWJ1Zy9vYmplY3RzLmxpc3QgYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RlYnVnL29iamVjdHMubGlzdAppbmRleCAwNzFiMDUyLi4zZmVkMjQyIDEwMDY0NAotLS0gYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RlYnVnL29iamVjdHMubGlzdAorKysgYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RlYnVnL29iamVjdHMubGlzdApAQCAtMTcsNiArMTcsNyBAQAogIi4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9mbGFzaF9leC5vIgogIi4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9mbGFzaF9yYW1mdW5jLm8iCiAiLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX2dwaW8ubyIKKyIuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfaXdkZy5vIgogIi4vRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9wY2QubyIKICIuL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfcGNkX2V4Lm8iCiAiLi9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3B3ci5vIgpkaWZmIC0tZ2l0IGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9EZWJ1Zy9vYmplY3RzLm1rIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9EZWJ1Zy9vYmplY3RzLm1rCmluZGV4IDgyMDg1NGIuLjk0ZTg2ZjcgMTAwNjQ0Ci0tLSBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRGVidWcvb2JqZWN0cy5taworKysgYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RlYnVnL29iamVjdHMubWsKQEAgLTEsNiArMSw2IEBACiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyBBdXRvbWF0aWNhbGx5LWdlbmVyYXRlZCBmaWxlLiBEbyBub3QgZWRpdCEKLSMgVG9vbGNoYWluOiBHTlUgVG9vbHMgZm9yIFNUTTMyICgxMS4zLnJlbDEpCisjIFRvb2xjaGFpbjogR05VIFRvb2xzIGZvciBTVE0zMiAoMTIuMy5yZWwxKQogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAogVVNFUl9PQkpTIDo9CmRpZmYgLS1naXQgYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RlYnVnL3NvdXJjZXMubWsgYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RlYnVnL3NvdXJjZXMubWsKaW5kZXggYWE1YzE1Yi4uYzlhNDg1NSAxMDA2NDQKLS0tIGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9EZWJ1Zy9zb3VyY2VzLm1rCisrKyBiL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRGVidWcvc291cmNlcy5tawpAQCAtMSw2ICsxLDYgQEAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIEF1dG9tYXRpY2FsbHktZ2VuZXJhdGVkIGZpbGUuIERvIG5vdCBlZGl0IQotIyBUb29sY2hhaW46IEdOVSBUb29scyBmb3IgU1RNMzIgKDExLjMucmVsMSkKKyMgVG9vbGNoYWluOiBHTlUgVG9vbHMgZm9yIFNUTTMyICgxMi4zLnJlbDEpCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCiBFTEZfU1JDUyA6PSAKZGlmZiAtLWdpdCBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9DTVNJUy9EZXZpY2UvU1QvU1RNMzJHNHh4L0luY2x1ZGUvc3RtMzJnNDczeHguaCBiL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9DTVNJUy9EZXZpY2UvU1QvU1RNMzJHNHh4L0luY2x1ZGUvc3RtMzJnNDczeHguaAppbmRleCA1OWZmZWM0Li5kYTk4Y2JlIDEwMDY0NAotLS0gYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvQ01TSVMvRGV2aWNlL1NUL1NUTTMyRzR4eC9JbmNsdWRlL3N0bTMyZzQ3M3h4LmgKKysrIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL0NNU0lTL0RldmljZS9TVC9TVE0zMkc0eHgvSW5jbHVkZS9zdG0zMmc0NzN4eC5oCkBAIC0xMDU4LDEwICsxMDU4LDggQEAKICAqLw0KIA0KIHR5cGVkZWYgc3RydWN0IHsNCi0gIF9fSU8gdWludDMyX3QgR0NSOyAgICAgLyohPCBTQUkgZ2xvYmFsIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIsICAgICAgICBBZGRyZXNzDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldDogMHgwMCAqLw0KLSAgdWludDMyX3QgUkVTRVJWRURbMTZdOyAvKiE8IFJlc2VydmVkLCAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzIG9mZnNldDoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNCB0byAweDQwICovDQorICB1aW50MzJfdCBSRVNFUlZFRFsxN107IC8qITwgUmVzZXJ2ZWQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzcw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IDB4MDAgdG8gMHg0MCAqLw0KICAgX19JTyB1aW50MzJfdCBQRE1DUjsgICAvKiE8IFNBSSBQRE0gY29udHJvbCByZWdpc3RlciwgICAgICAgICAgICAgICAgIEFkZHJlc3MNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiAweDQ0ICovDQogICBfX0lPIHVpbnQzMl90IFBETURMWTsgIC8qITwgU0FJIFBETSBkZWxheSByZWdpc3RlciwgICAgICAgICAgICAgICAgICAgQWRkcmVzcw0KQEAgLTE3NTAsNyArMTc0OCw3IEBACiANCiAvKg0KICAqIEBicmllZiBTcGVjaWZpYyBkZXZpY2UgZmVhdHVyZSBkZWZpbml0aW9ucyAobm90IHByZXNlbnQgb24gYWxsIGRldmljZXMgaW4gdGhlDQotICogU1RNMzJHNCBzZXJpZSkNCisgKiBTVE0zMkc0IHNlcmllcykNCiAgKi8NCiAjZGVmaW5lIEFEQ19NVUxUSU1PREVfU1VQUE9SVCAvKiE8IEFEQyBmZWF0dXJlIGF2YWlsYWJsZSBvbmx5IG9uIHNwZWNpZmljICAgICBcDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlczogbXVsdGltb2RlIGF2YWlsYWJsZSBvbiBkZXZpY2VzIHdpdGggXA0KQEAgLTE5MzIsNyArMTkzMCw3IEBACiAjZGVmaW5lIEFEQ19DRkdSX0FVVERMWSBBRENfQ0ZHUl9BVVRETFlfTXNrIC8qITwgQURDIGxvdyBwb3dlciBhdXRvIHdhaXQgKi8NCiAjZGVmaW5lIEFEQ19DRkdSX0FMSUdOX1BvcyAoMTVVKQ0KICNkZWZpbmUgQURDX0NGR1JfQUxJR05fTXNrICgweDFVTCA8PCBBRENfQ0ZHUl9BTElHTl9Qb3MpIC8qITwgMHgwMDAwODAwMCAqLw0KLSNkZWZpbmUgQURDX0NGR1JfQUxJR04gQURDX0NGR1JfQUxJR05fTXNrIC8qITwgQURDIGRhdGEgYWxpZ25lbWVudCAqLw0KKyNkZWZpbmUgQURDX0NGR1JfQUxJR04gQURDX0NGR1JfQUxJR05fTXNrIC8qITwgQURDIGRhdGEgYWxpZ25tZW50ICovDQogI2RlZmluZSBBRENfQ0ZHUl9ESVNDRU5fUG9zICgxNlUpDQogI2RlZmluZSBBRENfQ0ZHUl9ESVNDRU5fTXNrICgweDFVTCA8PCBBRENfQ0ZHUl9ESVNDRU5fUG9zKSAvKiE8IDB4MDAwMTAwMDAgKi8NCiAjZGVmaW5lIEFEQ19DRkdSX0RJU0NFTiBcDQpAQCAtNTc2Myw3ICs1NzYxLDcgQEAKICNkZWZpbmUgRkRDQU5fRU5ETl9FVFZfTXNrIFwNCiAgICgweEZGRkZGRkZGVUwgPDwgRkRDQU5fRU5ETl9FVFZfUG9zKSAvKiE8IDB4RkZGRkZGRkYgKi8NCiAjZGVmaW5lIEZEQ0FOX0VORE5fRVRWIFwNCi0gIEZEQ0FOX0VORE5fRVRWX01zayAvKiE8RW5kaWFubmVzIFRlc3QgVmFsdWUgICAgICAgICAgICAgICAgICAgICovDQorICBGRENBTl9FTkROX0VUVl9Nc2sgLyohPEVuZGlhbm5lc3MgVGVzdCBWYWx1ZSAgICAgICAgICAgICAgICAgICAgKi8NCiANCiAvKioqKioqKioqKioqKioqKiogIEJpdCBkZWZpbml0aW9uIGZvciBGRENBTl9EQlRQIHJlZ2lzdGVyICAqKioqKioqKioqKioqKioqKioqLw0KICNkZWZpbmUgRkRDQU5fREJUUF9EU0pXX1BvcyAoMFUpDQpAQCAtNzA2NSw3ICs3MDYzLDcgQEAKIC8qKioqKioqKioqKioqKioqKiogIEJpdCBkZWZpbml0aW9uIGZvciBGTUNfQkNSMSByZWdpc3RlciAgKioqKioqKioqKioqKioqKioqKi8NCiAjZGVmaW5lIEZNQ19CQ1IxX0NDTEtFTl9Qb3MgKDIwVSkNCiAjZGVmaW5lIEZNQ19CQ1IxX0NDTEtFTl9Nc2sgKDB4MVVMIDw8IEZNQ19CQ1IxX0NDTEtFTl9Qb3MpIC8qITwgMHgwMDEwMDAwMCAqLw0KLSNkZWZpbmUgRk1DX0JDUjFfQ0NMS0VOIEZNQ19CQ1IxX0NDTEtFTl9Nc2sgLyohPENvbnRpbm91cyBjbG9jayBlbmFibGUgICAgICovDQorI2RlZmluZSBGTUNfQkNSMV9DQ0xLRU4gRk1DX0JDUjFfQ0NMS0VOX01zayAvKiE8Q29udGludW91cyBjbG9jayBlbmFibGUgICAgICovDQogI2RlZmluZSBGTUNfQkNSMV9XRkRJU19Qb3MgKDIxVSkNCiAjZGVmaW5lIEZNQ19CQ1IxX1dGRElTX01zayAoMHgxVUwgPDwgRk1DX0JDUjFfV0ZESVNfUG9zKSAvKiE8IDB4MDAyMDAwMDAgKi8NCiAjZGVmaW5lIEZNQ19CQ1IxX1dGRElTIEZNQ19CQ1IxX1dGRElTX01zayAvKiE8V3JpdGUgRklGTyBEaXNhYmxlICAgICAgICAgKi8NCkBAIC05Mjc4LDcgKzkyNzYsNyBAQAogI2RlZmluZSBPUEFNUF9DU1JfT1VUQ0FMX01zayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQogICAoMHgxVUwgPDwgT1BBTVBfQ1NSX09VVENBTF9Qb3MpICAgICAgICAgICAgIC8qITwgMHg0MDAwMDAwMCBcDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgT1BBTVBfQ1NSX09VVENBTCBPUEFNUF9DU1JfT1VUQ0FMX01zayAvKiE8IE9QQU1QIG91cHV0IHN0YXR1cyBmbGFnICovDQorI2RlZmluZSBPUEFNUF9DU1JfT1VUQ0FMIE9QQU1QX0NTUl9PVVRDQUxfTXNrIC8qITwgT1BBTVAgb3V0cHV0IHN0YXR1cyBmbGFnICovDQogI2RlZmluZSBPUEFNUF9DU1JfTE9DS19Qb3MgKDMxVSkNCiAjZGVmaW5lIE9QQU1QX0NTUl9MT0NLX01zayAoMHgxVUwgPDwgT1BBTVBfQ1NSX0xPQ0tfUG9zKSAvKiE8IDB4ODAwMDAwMDAgKi8NCiAjZGVmaW5lIE9QQU1QX0NTUl9MT0NLIFwNCkBAIC0xMDU1Nyw3ICsxMDU1NSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KIC8qDQogICogQGJyaWVmIFNwZWNpZmljIGRldmljZSBmZWF0dXJlIGRlZmluaXRpb25zICAobm90IHByZXNlbnQgb24gYWxsIGRldmljZXMgaW4NCi0gKiB0aGUgU1RNMzJHNCBzZXJpZSkNCisgKiB0aGUgU1RNMzJHNCBzZXJpZXMpDQogICovDQogDQogI2RlZmluZSBSQ0NfSFNJNDhfU1VQUE9SVA0KQEAgLTEyNjczLDIxICsxMjY3MSwxOCBAQAogI2RlZmluZSBUQU1QX0NSMl9UQU1QM05PRVJBU0VfTXNrIFwNCiAgICgweDFVTCA8PCBUQU1QX0NSMl9UQU1QM05PRVJBU0VfUG9zKSAvKiE8IDB4MDAwMDAwMDQgKi8NCiAjZGVmaW5lIFRBTVBfQ1IyX1RBTVAzTk9FUkFTRSBUQU1QX0NSMl9UQU1QM05PRVJBU0VfTXNrDQotI2RlZmluZSBUQU1QX0NSMl9UQU1QMU1GX1BvcyAoMTZVKQ0KLSNkZWZpbmUgVEFNUF9DUjJfVEFNUDFNRl9Nc2sgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKDB4MVVMIDw8IFRBTVBfQ1IyX1RBTVAxTUZfUG9zKSAvKiE8IDB4MDAwMTAwMDAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFRBTVBfQ1IyX1RBTVAxTUYgVEFNUF9DUjJfVEFNUDFNRl9Nc2sNCi0jZGVmaW5lIFRBTVBfQ1IyX1RBTVAyTUZfUG9zICgxN1UpDQotI2RlZmluZSBUQU1QX0NSMl9UQU1QMk1GX01zayAgICAgICAgICAgICAgICAgICAgICBcDQotICAoMHgxVUwgPDwgVEFNUF9DUjJfVEFNUDJNRl9Qb3MpIC8qITwgMHgwMDAyMDAwMCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgVEFNUF9DUjJfVEFNUDJNRiBUQU1QX0NSMl9UQU1QMk1GX01zaw0KLSNkZWZpbmUgVEFNUF9DUjJfVEFNUDNNRl9Qb3MgKDE4VSkNCi0jZGVmaW5lIFRBTVBfQ1IyX1RBTVAzTUZfTXNrICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgweDFVTCA8PCBUQU1QX0NSMl9UQU1QM01GX1BvcykgLyohPCAweDAwMDQwMDAwIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBUQU1QX0NSMl9UQU1QM01GIFRBTVBfQ1IyX1RBTVAzTUZfTXNrDQorI2RlZmluZSBUQU1QX0NSMl9UQU1QMU1TS19Qb3MgKDE2VSkNCisjZGVmaW5lIFRBTVBfQ1IyX1RBTVAxTVNLX01zayBcDQorICAoMHgxVUwgPDwgVEFNUF9DUjJfVEFNUDFNU0tfUG9zKSAvKiE8IDB4MDAwMTAwMDAgKi8NCisjZGVmaW5lIFRBTVBfQ1IyX1RBTVAxTVNLIFRBTVBfQ1IyX1RBTVAxTVNLX01zaw0KKyNkZWZpbmUgVEFNUF9DUjJfVEFNUDJNU0tfUG9zICgxN1UpDQorI2RlZmluZSBUQU1QX0NSMl9UQU1QMk1TS19Nc2sgXA0KKyAgKDB4MVVMIDw8IFRBTVBfQ1IyX1RBTVAyTVNLX1BvcykgLyohPCAweDAwMDIwMDAwICovDQorI2RlZmluZSBUQU1QX0NSMl9UQU1QMk1TSyBUQU1QX0NSMl9UQU1QMk1TS19Nc2sNCisjZGVmaW5lIFRBTVBfQ1IyX1RBTVAzTVNLX1BvcyAoMThVKQ0KKyNkZWZpbmUgVEFNUF9DUjJfVEFNUDNNU0tfTXNrIFwNCisgICgweDFVTCA8PCBUQU1QX0NSMl9UQU1QM01TS19Qb3MpIC8qITwgMHgwMDA0MDAwMCAqLw0KKyNkZWZpbmUgVEFNUF9DUjJfVEFNUDNNU0sgVEFNUF9DUjJfVEFNUDNNU0tfTXNrDQogI2RlZmluZSBUQU1QX0NSMl9UQU1QMVRSR19Qb3MgKDI0VSkNCiAjZGVmaW5lIFRBTVBfQ1IyX1RBTVAxVFJHX01zayBcDQogICAoMHgxVUwgPDwgVEFNUF9DUjJfVEFNUDFUUkdfUG9zKSAvKiE8IDB4MDEwMDAwMDAgKi8NCkBAIC0xMjcwMSw2ICsxMjY5NiwxNyBAQAogICAoMHgxVUwgPDwgVEFNUF9DUjJfVEFNUDNUUkdfUG9zKSAvKiE8IDB4MDQwMDAwMDAgKi8NCiAjZGVmaW5lIFRBTVBfQ1IyX1RBTVAzVFJHIFRBTVBfQ1IyX1RBTVAzVFJHX01zaw0KIA0KKy8qIExlZ2FjeSBhbGlhc2VzICovDQorI2RlZmluZSBUQU1QX0NSMl9UQU1QMU1GX1BvcyBUQU1QX0NSMl9UQU1QMU1TS19Qb3MNCisjZGVmaW5lIFRBTVBfQ1IyX1RBTVAxTUZfTXNrIFRBTVBfQ1IyX1RBTVAxTVNLX01zaw0KKyNkZWZpbmUgVEFNUF9DUjJfVEFNUDFNRiBUQU1QX0NSMl9UQU1QMU1TSw0KKyNkZWZpbmUgVEFNUF9DUjJfVEFNUDJNRl9Qb3MgVEFNUF9DUjJfVEFNUDJNU0tfUG9zDQorI2RlZmluZSBUQU1QX0NSMl9UQU1QMk1GX01zayBUQU1QX0NSMl9UQU1QMk1TS19Nc2sNCisjZGVmaW5lIFRBTVBfQ1IyX1RBTVAyTUYgVEFNUF9DUjJfVEFNUDJNU0sNCisjZGVmaW5lIFRBTVBfQ1IyX1RBTVAzTUZfUG9zIFRBTVBfQ1IyX1RBTVAzTVNLX1Bvcw0KKyNkZWZpbmUgVEFNUF9DUjJfVEFNUDNNRl9Nc2sgVEFNUF9DUjJfVEFNUDNNU0tfTXNrDQorI2RlZmluZSBUQU1QX0NSMl9UQU1QM01GIFRBTVBfQ1IyX1RBTVAzTVNLDQorDQogLyoqKioqKioqKioqKioqKioqKioqICBCaXRzIGRlZmluaXRpb24gZm9yIFRBTVBfRkxUQ1IgcmVnaXN0ZXIgICoqKioqKioqKioqKioqKi8NCiAjZGVmaW5lIFRBTVBfRkxUQ1JfVEFNUEZSRVFfMCAoMHgwMDAwMDAwMVVMKQ0KICNkZWZpbmUgVEFNUF9GTFRDUl9UQU1QRlJFUV8xICgweDAwMDAwMDAyVUwpDQpAQCAtMTMwMTAsMjEgKzEzMDE2LDYgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJpYWwgQXVkaW8gSW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qKioqKioqKioqKioqKioqKioqKiAgQml0IGRlZmluaXRpb24gZm9yIFNBSV9HQ1IgcmVnaXN0ZXIgICoqKioqKioqKioqKioqKioqKiovDQotI2RlZmluZSBTQUlfR0NSX1NZTkNJTl9Qb3MgKDBVKQ0KLSNkZWZpbmUgU0FJX0dDUl9TWU5DSU5fTXNrICgweDNVTCA8PCBTQUlfR0NSX1NZTkNJTl9Qb3MpIC8qITwgMHgwMDAwMDAwMyAqLw0KLSNkZWZpbmUgU0FJX0dDUl9TWU5DSU4gXA0KLSAgU0FJX0dDUl9TWU5DSU5fTXNrIC8qITxTWU5DSU5bMTowXSBiaXRzIChTeW5jaHJvbml6YXRpb24gSW5wdXRzKSAgICovDQotI2RlZmluZSBTQUlfR0NSX1NZTkNJTl8wICgweDFVTCA8PCBTQUlfR0NSX1NZTkNJTl9Qb3MpIC8qITwgMHgwMDAwMDAwMSAqLw0KLSNkZWZpbmUgU0FJX0dDUl9TWU5DSU5fMSAoMHgyVUwgPDwgU0FJX0dDUl9TWU5DSU5fUG9zKSAvKiE8IDB4MDAwMDAwMDIgKi8NCi0NCi0jZGVmaW5lIFNBSV9HQ1JfU1lOQ09VVF9Qb3MgKDRVKQ0KLSNkZWZpbmUgU0FJX0dDUl9TWU5DT1VUX01zayAoMHgzVUwgPDwgU0FJX0dDUl9TWU5DT1VUX1BvcykgLyohPCAweDAwMDAwMDMwICovDQotI2RlZmluZSBTQUlfR0NSX1NZTkNPVVQgXA0KLSAgU0FJX0dDUl9TWU5DT1VUX01zayAvKiE8U1lOQ09VVFsxOjBdIGJpdHMgKFN5bmNocm9uaXphdGlvbiBPdXRwdXRzKSAqLw0KLSNkZWZpbmUgU0FJX0dDUl9TWU5DT1VUXzAgKDB4MVVMIDw8IFNBSV9HQ1JfU1lOQ09VVF9Qb3MpIC8qITwgMHgwMDAwMDAxMCAqLw0KLSNkZWZpbmUgU0FJX0dDUl9TWU5DT1VUXzEgKDB4MlVMIDw8IFNBSV9HQ1JfU1lOQ09VVF9Qb3MpIC8qITwgMHgwMDAwMDAyMCAqLw0KLQ0KIC8qKioqKioqKioqKioqKioqKioqICBCaXQgZGVmaW5pdGlvbiBmb3IgU0FJX3hDUjEgcmVnaXN0ZXIgICoqKioqKioqKioqKioqKioqKiovDQogI2RlZmluZSBTQUlfeENSMV9NT0RFX1BvcyAoMFUpDQogI2RlZmluZSBTQUlfeENSMV9NT0RFX01zayAoMHgzVUwgPDwgU0FJX3hDUjFfTU9ERV9Qb3MpIC8qITwgMHgwMDAwMDAwMyAqLw0KQEAgLTEzNTI2LDcgKzEzNTE3LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQogLyoNCiAgKiBAYnJpZWYgU3BlY2lmaWMgZGV2aWNlIGZlYXR1cmUgZGVmaW5pdGlvbnMgKG5vdCBwcmVzZW50IG9uIGFsbCBkZXZpY2VzIGluIHRoZQ0KLSAqIFNUTTMyRzQgc2VyaWUpDQorICogU1RNMzJHNCBzZXJpZXMpDQogICovDQogI2RlZmluZSBTUElfSTJTX1NVUFBPUlQgLyohPCBJMlMgc3VwcG9ydCAqLw0KIA0KZGlmZiAtLWdpdCBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9DTVNJUy9EZXZpY2UvU1QvU1RNMzJHNHh4L0luY2x1ZGUvc3RtMzJnNHh4LmggYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvQ01TSVMvRGV2aWNlL1NUL1NUTTMyRzR4eC9JbmNsdWRlL3N0bTMyZzR4eC5oCmluZGV4IDFhMjVmYzUuLjMwMGJiNWYgMTAwNjQ0Ci0tLSBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9DTVNJUy9EZXZpY2UvU1QvU1RNMzJHNHh4L0luY2x1ZGUvc3RtMzJnNHh4LmgKKysrIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL0NNU0lTL0RldmljZS9TVC9TVE0zMkc0eHgvSW5jbHVkZS9zdG0zMmc0eHguaApAQCAtMSwyNDUgKzEsMjU1IEBACi0vKioNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQGZpbGUgICAgc3RtMzJnNHh4LmgNCi0gKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQ0KLSAqIEBicmllZiAgIENNU0lTIFNUTTMyRzR4eCBEZXZpY2UgUGVyaXBoZXJhbCBBY2Nlc3MgTGF5ZXIgSGVhZGVyIEZpbGUuDQotICoNCi0gKiAgICAgICAgICBUaGUgZmlsZSBpcyB0aGUgdW5pcXVlIGluY2x1ZGUgZmlsZSB0aGF0IHRoZSBhcHBsaWNhdGlvbiBwcm9ncmFtbWVyDQotICogICAgICAgICAgaXMgdXNpbmcgaW4gdGhlIEMgc291cmNlIGNvZGUsIHVzdWFsbHkgaW4gbWFpbi5jLiBUaGlzIGZpbGUNCi0gKmNvbnRhaW5zOg0KLSAqICAgICAgICAgICAtIENvbmZpZ3VyYXRpb24gc2VjdGlvbiB0aGF0IGFsbG93cyB0byBzZWxlY3Q6DQotICogICAgICAgICAgICAgIC0gVGhlIFNUTTMyRzR4eCBkZXZpY2UgdXNlZCBpbiB0aGUgdGFyZ2V0IGFwcGxpY2F0aW9uDQotICogICAgICAgICAgICAgIC0gVG8gdXNlIG9yIG5vdCB0aGUgcGVyaXBoZXJhbJJzIGRyaXZlcnMgaW4gYXBwbGljYXRpb24NCi0gKmNvZGUoaS5lLiBjb2RlIHdpbGwgYmUgYmFzZWQgb24gZGlyZWN0IGFjY2VzcyB0byBwZXJpcGhlcmFsknMgcmVnaXN0ZXJzIHJhdGhlcg0KLSAqdGhhbiBkcml2ZXJzIEFQSSksIHRoaXMgb3B0aW9uIGlzIGNvbnRyb2xsZWQgYnkNCi0gKiAgICAgICAgICAgICAgICAiI2RlZmluZSBVU0VfSEFMX0RSSVZFUiINCi0gKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBAYXR0ZW50aW9uDQotICoNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQotICoNCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRlcm1zIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUNCi0gKiBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb2Z0d2FyZSBjb21wb25lbnQuDQotICogSWYgbm8gTElDRU5TRSBmaWxlIGNvbWVzIHdpdGggdGhpcyBzb2Z0d2FyZSwgaXQgaXMgcHJvdmlkZWQgQVMtSVMuDQotICoNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICovDQotDQotLyoqIEBhZGR0b2dyb3VwIENNU0lTDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGFkZHRvZ3JvdXAgc3RtMzJnNHh4DQotICogQHsNCi0gKi8NCi0NCi0jaWZuZGVmIF9fU1RNMzJHNHh4X0gNCi0jZGVmaW5lIF9fU1RNMzJHNHh4X0gNCi0NCi0jaWZkZWYgX19jcGx1c3BsdXMNCi1leHRlcm4gIkMiIHsNCi0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8NCi0NCi0vKiogQGFkZHRvZ3JvdXAgTGlicmFyeV9jb25maWd1cmF0aW9uX3NlY3Rpb24NCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiBTVE0zMiBGYW1pbHkNCi0gKi8NCi0jaWYgIWRlZmluZWQoU1RNMzJHNCkNCi0jZGVmaW5lIFNUTTMyRzQNCi0jZW5kaWYgLyogU1RNMzJHNCAqLw0KLQ0KLS8qIFVuY29tbWVudCB0aGUgbGluZSBiZWxvdyBhY2NvcmRpbmcgdG8gdGhlIHRhcmdldCBTVE0zMkc0IGRldmljZSB1c2VkIGluIHlvdXINCi0gICBhcHBsaWNhdGlvbg0KLSAgKi8NCi0NCi0jaWYgIWRlZmluZWQoU1RNMzJHNDMxeHgpICYmICFkZWZpbmVkKFNUTTMyRzQ0MXh4KSAmJiAhZGVmaW5lZChTVE0zMkc0NzF4eCkgJiYgXA0KLSAgICAhZGVmaW5lZChTVE0zMkc0NzN4eCkgJiYgIWRlZmluZWQoU1RNMzJHNDc0eHgpICYmICFkZWZpbmVkKFNUTTMyRzQ4NHh4KSAmJiBcDQotICAgICFkZWZpbmVkKFNUTTMyR0JLMUNCKSAmJiAhZGVmaW5lZChTVE0zMkc0OTF4eCkgJiYgIWRlZmluZWQoU1RNMzJHNEExeHgpDQotLyogI2RlZmluZSBTVE0zMkc0MzF4eCAqLyAvKiE8IFNUTTMyRzQzMXh4IERldmljZXMgKi8NCi0vKiAjZGVmaW5lIFNUTTMyRzQ0MXh4ICovIC8qITwgU1RNMzJHNDQxeHggRGV2aWNlcyAqLw0KLS8qICNkZWZpbmUgU1RNMzJHNDcxeHggKi8gLyohPCBTVE0zMkc0NzF4eCBEZXZpY2VzICovDQotLyogI2RlZmluZSBTVE0zMkc0NzN4eCAqLyAvKiE8IFNUTTMyRzQ3M3h4IERldmljZXMgKi8NCi0vKiAjZGVmaW5lIFNUTTMyRzQ4M3h4ICovIC8qITwgU1RNMzJHNDgzeHggRGV2aWNlcyAqLw0KLS8qICNkZWZpbmUgU1RNMzJHNDc0eHggKi8gLyohPCBTVE0zMkc0NzR4eCBEZXZpY2VzICovDQotLyogI2RlZmluZSBTVE0zMkc0ODR4eCAqLyAvKiE8IFNUTTMyRzQ4NHh4IERldmljZXMgKi8NCi0vKiAjZGVmaW5lIFNUTTMyRzQ5MXh4ICovIC8qITwgU1RNMzJHNDkxeHggRGV2aWNlcyAqLw0KLS8qICNkZWZpbmUgU1RNMzJHNEExeHggKi8gLyohPCBTVE0zMkc0QTF4eCBEZXZpY2VzICovDQotLyogI2RlZmluZSBTVE0zMkdCSzFDQiAqLyAvKiE8IFNUTTMyR0JLMUNCIERldmljZXMgKi8NCi0jZW5kaWYNCi0NCi0vKiAgVGlwOiBUbyBhdm9pZCBtb2RpZnlpbmcgdGhpcyBmaWxlIGVhY2ggdGltZSB5b3UgbmVlZCB0byBzd2l0Y2ggYmV0d2VlbiB0aGVzZQ0KLSAgICAgICAgZGV2aWNlcywgeW91IGNhbiBkZWZpbmUgdGhlIGRldmljZSBpbiB5b3VyIHRvb2xjaGFpbiBjb21waWxlcg0KLSAgIHByZXByb2Nlc3Nvci4NCi0gICovDQotI2lmICFkZWZpbmVkKFVTRV9IQUxfRFJJVkVSKQ0KLS8qKg0KLSAqIEBicmllZiBDb21tZW50IHRoZSBsaW5lIGJlbG93IGlmIHlvdSB3aWxsIG5vdCB1c2UgdGhlIHBlcmlwaGVyYWxzIGRyaXZlcnMuDQotICAgSW4gdGhpcyBjYXNlLCB0aGVzZSBkcml2ZXJzIHdpbGwgbm90IGJlIGluY2x1ZGVkIGFuZCB0aGUgYXBwbGljYXRpb24gY29kZQ0KLSB3aWxsIGJlIGJhc2VkIG9uIGRpcmVjdCBhY2Nlc3MgdG8gcGVyaXBoZXJhbHMgcmVnaXN0ZXJzDQotICAgKi8NCi0vKiNkZWZpbmUgVVNFX0hBTF9EUklWRVIgKi8NCi0jZW5kaWYgLyogVVNFX0hBTF9EUklWRVIgKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgQ01TSVMgRGV2aWNlIHZlcnNpb24gbnVtYmVyIFYxLjIuMg0KLSAqLw0KLSNkZWZpbmUgX19TVE0zMkc0X0NNU0lTX1ZFUlNJT05fTUFJTiAoMHgwMVUpIC8qITwgWzMxOjI0XSBtYWluIHZlcnNpb24gKi8NCi0jZGVmaW5lIF9fU1RNMzJHNF9DTVNJU19WRVJTSU9OX1NVQjEgKDB4MDJVKSAvKiE8IFsyMzoxNl0gc3ViMSB2ZXJzaW9uICovDQotI2RlZmluZSBfX1NUTTMyRzRfQ01TSVNfVkVSU0lPTl9TVUIyICgweDAyVSkgLyohPCBbMTU6OF0gIHN1YjIgdmVyc2lvbiAqLw0KLSNkZWZpbmUgX19TVE0zMkc0X0NNU0lTX1ZFUlNJT05fUkMgKDB4MDBVKSAgIC8qITwgWzc6MF0gIHJlbGVhc2UgY2FuZGlkYXRlICovDQotI2RlZmluZSBfX1NUTTMyRzRfQ01TSVNfVkVSU0lPTiAgICAgICAgICAgXA0KLSAgKChfX1NUTTMyRzRfQ01TSVNfVkVSU0lPTl9NQUlOIDw8IDI0KSB8IFwNCi0gICAoX19TVE0zMkc0X0NNU0lTX1ZFUlNJT05fU1VCMSA8PCAxNikgfCBcDQotICAgKF9fU1RNMzJHNF9DTVNJU19WRVJTSU9OX1NVQjIgPDwgOCkgfCAoX19TVE0zMkc0X0NNU0lTX1ZFUlNJT05fUkMpKQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBhZGR0b2dyb3VwIERldmljZV9JbmNsdWRlZA0KLSAqIEB7DQotICovDQotDQotI2lmIGRlZmluZWQoU1RNMzJHNDMxeHgpDQotI2luY2x1ZGUgInN0bTMyZzQzMXh4LmgiDQotI2VsaWYgZGVmaW5lZChTVE0zMkc0NDF4eCkNCi0jaW5jbHVkZSAic3RtMzJnNDQxeHguaCINCi0jZWxpZiBkZWZpbmVkKFNUTTMyRzQ3MXh4KQ0KLSNpbmNsdWRlICJzdG0zMmc0NzF4eC5oIg0KLSNlbGlmIGRlZmluZWQoU1RNMzJHNDczeHgpDQotI2luY2x1ZGUgInN0bTMyZzQ3M3h4LmgiDQotI2VsaWYgZGVmaW5lZChTVE0zMkc0ODN4eCkNCi0jaW5jbHVkZSAic3RtMzJnNDgzeHguaCINCi0jZWxpZiBkZWZpbmVkKFNUTTMyRzQ3NHh4KQ0KLSNpbmNsdWRlICJzdG0zMmc0NzR4eC5oIg0KLSNlbGlmIGRlZmluZWQoU1RNMzJHNDg0eHgpDQotI2luY2x1ZGUgInN0bTMyZzQ4NHh4LmgiDQotI2VsaWYgZGVmaW5lZChTVE0zMkc0OTF4eCkNCi0jaW5jbHVkZSAic3RtMzJnNDkxeHguaCINCi0jZWxpZiBkZWZpbmVkKFNUTTMyRzRBMXh4KQ0KLSNpbmNsdWRlICJzdG0zMmc0YTF4eC5oIg0KLSNlbGlmIGRlZmluZWQoU1RNMzJHQksxQ0IpDQotI2luY2x1ZGUgInN0bTMyZ2JrMWNiLmgiDQotI2Vsc2UNCi0jZXJyb3IgXA0KLSAgICAiUGxlYXNlIHNlbGVjdCBmaXJzdCB0aGUgdGFyZ2V0IFNUTTMyRzR4eCBkZXZpY2UgdXNlZCBpbiB5b3VyIGFwcGxpY2F0aW9uIChpbiBzdG0zMmc0eHguaCBmaWxlKSINCi0jZW5kaWYNCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAYWRkdG9ncm91cCBFeHBvcnRlZF90eXBlcw0KLSAqIEB7DQotICovDQotdHlwZWRlZiBlbnVtIHsgUkVTRVQgPSAwLCBTRVQgPSAhUkVTRVQgfSBGbGFnU3RhdHVzLCBJVFN0YXR1czsNCi0NCi10eXBlZGVmIGVudW0geyBESVNBQkxFID0gMCwgRU5BQkxFID0gIURJU0FCTEUgfSBGdW5jdGlvbmFsU3RhdGU7DQotI2RlZmluZSBJU19GVU5DVElPTkFMX1NUQVRFKFNUQVRFKSAoKChTVEFURSkgPT0gRElTQUJMRSkgfHwgKChTVEFURSkgPT0gRU5BQkxFKSkNCi0NCi10eXBlZGVmIGVudW0geyBTVUNDRVNTID0gMCwgRVJST1IgPSAhU1VDQ0VTUyB9IEVycm9yU3RhdHVzOw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBhZGR0b2dyb3VwIEV4cG9ydGVkX21hY3Jvcw0KLSAqIEB7DQotICovDQotI2RlZmluZSBTRVRfQklUKFJFRywgQklUKSAoKFJFRykgfD0gKEJJVCkpDQotDQotI2RlZmluZSBDTEVBUl9CSVQoUkVHLCBCSVQpICgoUkVHKSAmPSB+KEJJVCkpDQotDQotI2RlZmluZSBSRUFEX0JJVChSRUcsIEJJVCkgKChSRUcpICYgKEJJVCkpDQotDQotI2RlZmluZSBDTEVBUl9SRUcoUkVHKSAoKFJFRykgPSAoMHgwKSkNCi0NCi0jZGVmaW5lIFdSSVRFX1JFRyhSRUcsIFZBTCkgKChSRUcpID0gKFZBTCkpDQotDQotI2RlZmluZSBSRUFEX1JFRyhSRUcpICgoUkVHKSkNCi0NCi0jZGVmaW5lIE1PRElGWV9SRUcoUkVHLCBDTEVBUk1BU0ssIFNFVE1BU0spIFwNCi0gIFdSSVRFX1JFRygoUkVHKSwgKCgoUkVBRF9SRUcoUkVHKSkgJiAofihDTEVBUk1BU0spKSkgfCAoU0VUTUFTSykpKQ0KLQ0KLSNkZWZpbmUgUE9TSVRJT05fVkFMKFZBTCkgKF9fQ0xaKF9fUkJJVChWQUwpKSkNCi0NCi0vKiBVc2Ugb2YgQ01TSVMgY29tcGlsZXIgaW50cmluc2ljcyBmb3IgcmVnaXN0ZXIgZXhjbHVzaXZlIGFjY2VzcyAqLw0KLS8qIEF0b21pYyAzMi1iaXQgcmVnaXN0ZXIgYWNjZXNzIG1hY3JvIHRvIHNldCBvbmUgb3Igc2V2ZXJhbCBiaXRzICovDQotI2RlZmluZSBBVE9NSUNfU0VUX0JJVChSRUcsIEJJVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIHVpbnQzMl90IHZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgdmFsID0gX19MRFJFWFcoKF9fSU8gdWludDMyX3QgKikmKFJFRykpIHwgKEJJVCk7ICAgICAgICBcDQotICAgIH0gd2hpbGUgKChfX1NUUkVYVyh2YWwsIChfX0lPIHVpbnQzMl90ICopJihSRUcpKSkgIT0gMFUpOyBcDQotICB9IHdoaWxlICgwKQ0KLQ0KLS8qIEF0b21pYyAzMi1iaXQgcmVnaXN0ZXIgYWNjZXNzIG1hY3JvIHRvIGNsZWFyIG9uZSBvciBzZXZlcmFsIGJpdHMgKi8NCi0jZGVmaW5lIEFUT01JQ19DTEVBUl9CSVQoUkVHLCBCSVQpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgdWludDMyX3QgdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICB2YWwgPSBfX0xEUkVYVygoX19JTyB1aW50MzJfdCAqKSYoUkVHKSkgJiB+KEJJVCk7ICAgICAgIFwNCi0gICAgfSB3aGlsZSAoKF9fU1RSRVhXKHZhbCwgKF9fSU8gdWludDMyX3QgKikmKFJFRykpKSAhPSAwVSk7IFwNCi0gIH0gd2hpbGUgKDApDQotDQotLyogQXRvbWljIDMyLWJpdCByZWdpc3RlciBhY2Nlc3MgbWFjcm8gdG8gY2xlYXIgYW5kIHNldCBvbmUgb3Igc2V2ZXJhbCBiaXRzICovDQotI2RlZmluZSBBVE9NSUNfTU9ESUZZX1JFRyhSRUcsIENMRUFSTVNLLCBTRVRNQVNLKSAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgdWludDMyX3QgdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgIHZhbCA9IChfX0xEUkVYVygoX19JTyB1aW50MzJfdCAqKSYoUkVHKSkgJiB+KENMRUFSTVNLKSkgfCAoU0VUTUFTSyk7IFwNCi0gICAgfSB3aGlsZSAoKF9fU1RSRVhXKHZhbCwgKF9fSU8gdWludDMyX3QgKikmKFJFRykpKSAhPSAwVSk7ICAgICAgICAgICAgICBcDQotICB9IHdoaWxlICgwKQ0KLQ0KLS8qIEF0b21pYyAxNi1iaXQgcmVnaXN0ZXIgYWNjZXNzIG1hY3JvIHRvIHNldCBvbmUgb3Igc2V2ZXJhbCBiaXRzICovDQotI2RlZmluZSBBVE9NSUNfU0VUSF9CSVQoUkVHLCBCSVQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIHVpbnQxNl90IHZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgdmFsID0gX19MRFJFWEgoKF9fSU8gdWludDE2X3QgKikmKFJFRykpIHwgKEJJVCk7ICAgICAgICBcDQotICAgIH0gd2hpbGUgKChfX1NUUkVYSCh2YWwsIChfX0lPIHVpbnQxNl90ICopJihSRUcpKSkgIT0gMFUpOyBcDQotICB9IHdoaWxlICgwKQ0KLQ0KLS8qIEF0b21pYyAxNi1iaXQgcmVnaXN0ZXIgYWNjZXNzIG1hY3JvIHRvIGNsZWFyIG9uZSBvciBzZXZlcmFsIGJpdHMgKi8NCi0jZGVmaW5lIEFUT01JQ19DTEVBUkhfQklUKFJFRywgQklUKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgdWludDE2X3QgdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICB2YWwgPSBfX0xEUkVYSCgoX19JTyB1aW50MTZfdCAqKSYoUkVHKSkgJiB+KEJJVCk7ICAgICAgIFwNCi0gICAgfSB3aGlsZSAoKF9fU1RSRVhIKHZhbCwgKF9fSU8gdWludDE2X3QgKikmKFJFRykpKSAhPSAwVSk7IFwNCi0gIH0gd2hpbGUgKDApDQotDQotLyogQXRvbWljIDE2LWJpdCByZWdpc3RlciBhY2Nlc3MgbWFjcm8gdG8gY2xlYXIgYW5kIHNldCBvbmUgb3Igc2V2ZXJhbCBiaXRzICovDQotI2RlZmluZSBBVE9NSUNfTU9ESUZZSF9SRUcoUkVHLCBDTEVBUk1TSywgU0VUTUFTSykgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgdWludDE2X3QgdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgIHZhbCA9IChfX0xEUkVYSCgoX19JTyB1aW50MTZfdCAqKSYoUkVHKSkgJiB+KENMRUFSTVNLKSkgfCAoU0VUTUFTSyk7IFwNCi0gICAgfSB3aGlsZSAoKF9fU1RSRVhIKHZhbCwgKF9fSU8gdWludDE2X3QgKikmKFJFRykpKSAhPSAwVSk7ICAgICAgICAgICAgICBcDQotICB9IHdoaWxlICgwKQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotI2lmIGRlZmluZWQoVVNFX0hBTF9EUklWRVIpDQotI2luY2x1ZGUgInN0bTMyZzR4eF9oYWwuaCINCi0jZW5kaWYgLyogVVNFX0hBTF9EUklWRVIgKi8NCi0NCi0jaWZkZWYgX19jcGx1c3BsdXMNCi19DQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovDQotDQotI2VuZGlmIC8qIF9fU1RNMzJHNHh4X0ggKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQorLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAZmlsZSAgICBzdG0zMmc0eHguaAorICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAqIEBicmllZiAgIENNU0lTIFNUTTMyRzR4eCBEZXZpY2UgUGVyaXBoZXJhbCBBY2Nlc3MgTGF5ZXIgSGVhZGVyIEZpbGUuCisgKgorICogICAgICAgICAgVGhlIGZpbGUgaXMgdGhlIHVuaXF1ZSBpbmNsdWRlIGZpbGUgdGhhdCB0aGUgYXBwbGljYXRpb24gcHJvZ3JhbW1lcgorICogICAgICAgICAgaXMgdXNpbmcgaW4gdGhlIEMgc291cmNlIGNvZGUsIHVzdWFsbHkgaW4gbWFpbi5jLiBUaGlzIGZpbGUKKyAqY29udGFpbnM6CisgKiAgICAgICAgICAgLSBDb25maWd1cmF0aW9uIHNlY3Rpb24gdGhhdCBhbGxvd3MgdG8gc2VsZWN0OgorICogICAgICAgICAgICAgIC0gVGhlIFNUTTMyRzR4eCBkZXZpY2UgdXNlZCBpbiB0aGUgdGFyZ2V0IGFwcGxpY2F0aW9uCisgKiAgICAgICAgICAgICAgLSBUbyB1c2Ugb3Igbm90IHRoZSBwZXJpcGhlcmFsknMgZHJpdmVycyBpbiBhcHBsaWNhdGlvbgorICpjb2RlKGkuZS4gY29kZSB3aWxsIGJlIGJhc2VkIG9uIGRpcmVjdCBhY2Nlc3MgdG8gcGVyaXBoZXJhbJJzIHJlZ2lzdGVycyByYXRoZXIKKyAqdGhhbiBkcml2ZXJzIEFQSSksIHRoaXMgb3B0aW9uIGlzIGNvbnRyb2xsZWQgYnkKKyAqICAgICAgICAgICAgICAgICIjZGVmaW5lIFVTRV9IQUxfRFJJVkVSIgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBhdHRlbnRpb24KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRlcm1zIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUKKyAqIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4KKyAqIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcyB3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKiogQGFkZHRvZ3JvdXAgQ01TSVMKKyAqIEB7CisgKi8KKworLyoqIEBhZGR0b2dyb3VwIHN0bTMyZzR4eAorICogQHsKKyAqLworCisjaWZuZGVmIF9fU1RNMzJHNHh4X0gKKyNkZWZpbmUgX19TVE0zMkc0eHhfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKy8qKiBAYWRkdG9ncm91cCBMaWJyYXJ5X2NvbmZpZ3VyYXRpb25fc2VjdGlvbgorICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiBTVE0zMiBGYW1pbHkKKyAqLworI2lmICFkZWZpbmVkKFNUTTMyRzQpCisjZGVmaW5lIFNUTTMyRzQKKyNlbmRpZiAvKiBTVE0zMkc0ICovCisKKy8qIFVuY29tbWVudCB0aGUgbGluZSBiZWxvdyBhY2NvcmRpbmcgdG8gdGhlIHRhcmdldCBTVE0zMkc0IGRldmljZSB1c2VkIGluIHlvdXIKKyAgIGFwcGxpY2F0aW9uCisgICovCisKKyNpZiAhZGVmaW5lZChTVE0zMkc0MzF4eCkgJiYgIWRlZmluZWQoU1RNMzJHNDQxeHgpICYmICFkZWZpbmVkKFNUTTMyRzQ3MXh4KSAmJiBcCisgICAgIWRlZmluZWQoU1RNMzJHNDczeHgpICYmICFkZWZpbmVkKFNUTTMyRzQ3NHh4KSAmJiAhZGVmaW5lZChTVE0zMkc0ODR4eCkgJiYgXAorICAgICFkZWZpbmVkKFNUTTMyR0JLMUNCKSAmJiAhZGVmaW5lZChTVE0zMkc0OTF4eCkgJiYgIWRlZmluZWQoU1RNMzJHNEExeHgpICYmIFwKKyAgICAhZGVmaW5lZChTVE0zMkc0MTF4QikgJiYgIWRlZmluZWQoU1RNMzJHNDExeEMpICYmICFkZWZpbmVkKFNUTTMyRzQxNHh4KQorLyogI2RlZmluZSBTVE0zMkc0MTF4QiAqLyAvKiE8IFNUTTMyRzQxMXhCIERldmljZXMgKi8KKy8qICNkZWZpbmUgU1RNMzJHNDExeEMgKi8gLyohPCBTVE0zMkc0MTF4QyBEZXZpY2VzICovCisvKiAjZGVmaW5lIFNUTTMyRzQxNHh4ICovIC8qITwgU1RNMzJHNDE0eHggRGV2aWNlcyAqLworLyogI2RlZmluZSBTVE0zMkc0MzF4eCAqLyAvKiE8IFNUTTMyRzQzMXh4IERldmljZXMgKi8KKy8qICNkZWZpbmUgU1RNMzJHNDQxeHggKi8gLyohPCBTVE0zMkc0NDF4eCBEZXZpY2VzICovCisvKiAjZGVmaW5lIFNUTTMyRzQ3MXh4ICovIC8qITwgU1RNMzJHNDcxeHggRGV2aWNlcyAqLworLyogI2RlZmluZSBTVE0zMkc0NzN4eCAqLyAvKiE8IFNUTTMyRzQ3M3h4IERldmljZXMgKi8KKy8qICNkZWZpbmUgU1RNMzJHNDgzeHggKi8gLyohPCBTVE0zMkc0ODN4eCBEZXZpY2VzICovCisvKiAjZGVmaW5lIFNUTTMyRzQ3NHh4ICovIC8qITwgU1RNMzJHNDc0eHggRGV2aWNlcyAqLworLyogI2RlZmluZSBTVE0zMkc0ODR4eCAqLyAvKiE8IFNUTTMyRzQ4NHh4IERldmljZXMgKi8KKy8qICNkZWZpbmUgU1RNMzJHNDkxeHggKi8gLyohPCBTVE0zMkc0OTF4eCBEZXZpY2VzICovCisvKiAjZGVmaW5lIFNUTTMyRzRBMXh4ICovIC8qITwgU1RNMzJHNEExeHggRGV2aWNlcyAqLworLyogI2RlZmluZSBTVE0zMkdCSzFDQiAqLyAvKiE8IFNUTTMyR0JLMUNCIERldmljZXMgKi8KKyNlbmRpZgorCisvKiAgVGlwOiBUbyBhdm9pZCBtb2RpZnlpbmcgdGhpcyBmaWxlIGVhY2ggdGltZSB5b3UgbmVlZCB0byBzd2l0Y2ggYmV0d2VlbiB0aGVzZQorICAgICAgICBkZXZpY2VzLCB5b3UgY2FuIGRlZmluZSB0aGUgZGV2aWNlIGluIHlvdXIgdG9vbGNoYWluIGNvbXBpbGVyCisgICBwcmVwcm9jZXNzb3IuCisgICovCisjaWYgIWRlZmluZWQoVVNFX0hBTF9EUklWRVIpCisvKioKKyAqIEBicmllZiBDb21tZW50IHRoZSBsaW5lIGJlbG93IGlmIHlvdSB3aWxsIG5vdCB1c2UgdGhlIHBlcmlwaGVyYWxzIGRyaXZlcnMuCisgICBJbiB0aGlzIGNhc2UsIHRoZXNlIGRyaXZlcnMgd2lsbCBub3QgYmUgaW5jbHVkZWQgYW5kIHRoZSBhcHBsaWNhdGlvbiBjb2RlCisgd2lsbCBiZSBiYXNlZCBvbiBkaXJlY3QgYWNjZXNzIHRvIHBlcmlwaGVyYWxzIHJlZ2lzdGVycworICAgKi8KKy8qI2RlZmluZSBVU0VfSEFMX0RSSVZFUiAqLworI2VuZGlmIC8qIFVTRV9IQUxfRFJJVkVSICovCisKKy8qKgorICogQGJyaWVmIENNU0lTIERldmljZSB2ZXJzaW9uIG51bWJlciBWMS4yLjUKKyAqLworI2RlZmluZSBfX1NUTTMyRzRfQ01TSVNfVkVSU0lPTl9NQUlOICgweDAxVSkgLyohPCBbMzE6MjRdIG1haW4gdmVyc2lvbiAqLworI2RlZmluZSBfX1NUTTMyRzRfQ01TSVNfVkVSU0lPTl9TVUIxICgweDAyVSkgLyohPCBbMjM6MTZdIHN1YjEgdmVyc2lvbiAqLworI2RlZmluZSBfX1NUTTMyRzRfQ01TSVNfVkVSU0lPTl9TVUIyICgweDA1VSkgLyohPCBbMTU6OF0gIHN1YjIgdmVyc2lvbiAqLworI2RlZmluZSBfX1NUTTMyRzRfQ01TSVNfVkVSU0lPTl9SQyAoMHgwMFUpICAgLyohPCBbNzowXSAgcmVsZWFzZSBjYW5kaWRhdGUgKi8KKyNkZWZpbmUgX19TVE0zMkc0X0NNU0lTX1ZFUlNJT04gICAgICAgICAgIFwKKyAgKChfX1NUTTMyRzRfQ01TSVNfVkVSU0lPTl9NQUlOIDw8IDI0KSB8IFwKKyAgIChfX1NUTTMyRzRfQ01TSVNfVkVSU0lPTl9TVUIxIDw8IDE2KSB8IFwKKyAgIChfX1NUTTMyRzRfQ01TSVNfVkVSU0lPTl9TVUIyIDw8IDgpIHwgKF9fU1RNMzJHNF9DTVNJU19WRVJTSU9OX1JDKSkKKworLyoqCisgKiBAfQorICovCisKKy8qKiBAYWRkdG9ncm91cCBEZXZpY2VfSW5jbHVkZWQKKyAqIEB7CisgKi8KKworI2lmIGRlZmluZWQoU1RNMzJHNDMxeHgpCisjaW5jbHVkZSAic3RtMzJnNDMxeHguaCIKKyNlbGlmIGRlZmluZWQoU1RNMzJHNDQxeHgpCisjaW5jbHVkZSAic3RtMzJnNDQxeHguaCIKKyNlbGlmIGRlZmluZWQoU1RNMzJHNDcxeHgpCisjaW5jbHVkZSAic3RtMzJnNDcxeHguaCIKKyNlbGlmIGRlZmluZWQoU1RNMzJHNDczeHgpCisjaW5jbHVkZSAic3RtMzJnNDczeHguaCIKKyNlbGlmIGRlZmluZWQoU1RNMzJHNDgzeHgpCisjaW5jbHVkZSAic3RtMzJnNDgzeHguaCIKKyNlbGlmIGRlZmluZWQoU1RNMzJHNDc0eHgpCisjaW5jbHVkZSAic3RtMzJnNDc0eHguaCIKKyNlbGlmIGRlZmluZWQoU1RNMzJHNDg0eHgpCisjaW5jbHVkZSAic3RtMzJnNDg0eHguaCIKKyNlbGlmIGRlZmluZWQoU1RNMzJHNDkxeHgpCisjaW5jbHVkZSAic3RtMzJnNDkxeHguaCIKKyNlbGlmIGRlZmluZWQoU1RNMzJHNEExeHgpCisjaW5jbHVkZSAic3RtMzJnNGExeHguaCIKKyNlbGlmIGRlZmluZWQoU1RNMzJHQksxQ0IpCisjaW5jbHVkZSAic3RtMzJnYmsxY2IuaCIKKyNlbGlmIGRlZmluZWQoU1RNMzJHNDExeEIpCisjaW5jbHVkZSAic3RtMzJnNDExeGIuaCIKKyNlbGlmIGRlZmluZWQoU1RNMzJHNDExeEMpCisjaW5jbHVkZSAic3RtMzJnNDExeGMuaCIKKyNlbGlmIGRlZmluZWQoU1RNMzJHNDE0eHgpCisjaW5jbHVkZSAic3RtMzJnNDE0eHguaCIKKyNlbHNlCisjZXJyb3IgXAorICAgICJQbGVhc2Ugc2VsZWN0IGZpcnN0IHRoZSB0YXJnZXQgU1RNMzJHNHh4IGRldmljZSB1c2VkIGluIHlvdXIgYXBwbGljYXRpb24gKGluIHN0bTMyZzR4eC5oIGZpbGUpIgorI2VuZGlmCisKKy8qKgorICogQH0KKyAqLworCisvKiogQGFkZHRvZ3JvdXAgRXhwb3J0ZWRfdHlwZXMKKyAqIEB7CisgKi8KK3R5cGVkZWYgZW51bSB7IFJFU0VUID0gMCwgU0VUID0gIVJFU0VUIH0gRmxhZ1N0YXR1cywgSVRTdGF0dXM7CisKK3R5cGVkZWYgZW51bSB7IERJU0FCTEUgPSAwLCBFTkFCTEUgPSAhRElTQUJMRSB9IEZ1bmN0aW9uYWxTdGF0ZTsKKyNkZWZpbmUgSVNfRlVOQ1RJT05BTF9TVEFURShTVEFURSkgKCgoU1RBVEUpID09IERJU0FCTEUpIHx8ICgoU1RBVEUpID09IEVOQUJMRSkpCisKK3R5cGVkZWYgZW51bSB7IFNVQ0NFU1MgPSAwLCBFUlJPUiA9ICFTVUNDRVNTIH0gRXJyb3JTdGF0dXM7CisKKy8qKgorICogQH0KKyAqLworCisvKiogQGFkZHRvZ3JvdXAgRXhwb3J0ZWRfbWFjcm9zCisgKiBAeworICovCisjZGVmaW5lIFNFVF9CSVQoUkVHLCBCSVQpICgoUkVHKSB8PSAoQklUKSkKKworI2RlZmluZSBDTEVBUl9CSVQoUkVHLCBCSVQpICgoUkVHKSAmPSB+KEJJVCkpCisKKyNkZWZpbmUgUkVBRF9CSVQoUkVHLCBCSVQpICgoUkVHKSAmIChCSVQpKQorCisjZGVmaW5lIENMRUFSX1JFRyhSRUcpICgoUkVHKSA9ICgweDApKQorCisjZGVmaW5lIFdSSVRFX1JFRyhSRUcsIFZBTCkgKChSRUcpID0gKFZBTCkpCisKKyNkZWZpbmUgUkVBRF9SRUcoUkVHKSAoKFJFRykpCisKKyNkZWZpbmUgTU9ESUZZX1JFRyhSRUcsIENMRUFSTUFTSywgU0VUTUFTSykgXAorICBXUklURV9SRUcoKFJFRyksICgoKFJFQURfUkVHKFJFRykpICYgKH4oQ0xFQVJNQVNLKSkpIHwgKFNFVE1BU0spKSkKKworI2RlZmluZSBQT1NJVElPTl9WQUwoVkFMKSAoX19DTFooX19SQklUKFZBTCkpKQorCisvKiBVc2Ugb2YgQ01TSVMgY29tcGlsZXIgaW50cmluc2ljcyBmb3IgcmVnaXN0ZXIgZXhjbHVzaXZlIGFjY2VzcyAqLworLyogQXRvbWljIDMyLWJpdCByZWdpc3RlciBhY2Nlc3MgbWFjcm8gdG8gc2V0IG9uZSBvciBzZXZlcmFsIGJpdHMgKi8KKyNkZWZpbmUgQVRPTUlDX1NFVF9CSVQoUkVHLCBCSVQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDMyX3QgdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdmFsID0gX19MRFJFWFcoKF9fSU8gdWludDMyX3QgKikmKFJFRykpIHwgKEJJVCk7ICAgICAgICBcCisgICAgfSB3aGlsZSAoKF9fU1RSRVhXKHZhbCwgKF9fSU8gdWludDMyX3QgKikmKFJFRykpKSAhPSAwVSk7IFwKKyAgfSB3aGlsZSAoMCkKKworLyogQXRvbWljIDMyLWJpdCByZWdpc3RlciBhY2Nlc3MgbWFjcm8gdG8gY2xlYXIgb25lIG9yIHNldmVyYWwgYml0cyAqLworI2RlZmluZSBBVE9NSUNfQ0xFQVJfQklUKFJFRywgQklUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50MzJfdCB2YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB2YWwgPSBfX0xEUkVYVygoX19JTyB1aW50MzJfdCAqKSYoUkVHKSkgJiB+KEJJVCk7ICAgICAgIFwKKyAgICB9IHdoaWxlICgoX19TVFJFWFcodmFsLCAoX19JTyB1aW50MzJfdCAqKSYoUkVHKSkpICE9IDBVKTsgXAorICB9IHdoaWxlICgwKQorCisvKiBBdG9taWMgMzItYml0IHJlZ2lzdGVyIGFjY2VzcyBtYWNybyB0byBjbGVhciBhbmQgc2V0IG9uZSBvciBzZXZlcmFsIGJpdHMgKi8KKyNkZWZpbmUgQVRPTUlDX01PRElGWV9SRUcoUkVHLCBDTEVBUk1TSywgU0VUTUFTSykgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50MzJfdCB2YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHZhbCA9IChfX0xEUkVYVygoX19JTyB1aW50MzJfdCAqKSYoUkVHKSkgJiB+KENMRUFSTVNLKSkgfCAoU0VUTUFTSyk7IFwKKyAgICB9IHdoaWxlICgoX19TVFJFWFcodmFsLCAoX19JTyB1aW50MzJfdCAqKSYoUkVHKSkpICE9IDBVKTsgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworLyogQXRvbWljIDE2LWJpdCByZWdpc3RlciBhY2Nlc3MgbWFjcm8gdG8gc2V0IG9uZSBvciBzZXZlcmFsIGJpdHMgKi8KKyNkZWZpbmUgQVRPTUlDX1NFVEhfQklUKFJFRywgQklUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDE2X3QgdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdmFsID0gX19MRFJFWEgoKF9fSU8gdWludDE2X3QgKikmKFJFRykpIHwgKEJJVCk7ICAgICAgICBcCisgICAgfSB3aGlsZSAoKF9fU1RSRVhIKHZhbCwgKF9fSU8gdWludDE2X3QgKikmKFJFRykpKSAhPSAwVSk7IFwKKyAgfSB3aGlsZSAoMCkKKworLyogQXRvbWljIDE2LWJpdCByZWdpc3RlciBhY2Nlc3MgbWFjcm8gdG8gY2xlYXIgb25lIG9yIHNldmVyYWwgYml0cyAqLworI2RlZmluZSBBVE9NSUNfQ0xFQVJIX0JJVChSRUcsIEJJVCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50MTZfdCB2YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB2YWwgPSBfX0xEUkVYSCgoX19JTyB1aW50MTZfdCAqKSYoUkVHKSkgJiB+KEJJVCk7ICAgICAgIFwKKyAgICB9IHdoaWxlICgoX19TVFJFWEgodmFsLCAoX19JTyB1aW50MTZfdCAqKSYoUkVHKSkpICE9IDBVKTsgXAorICB9IHdoaWxlICgwKQorCisvKiBBdG9taWMgMTYtYml0IHJlZ2lzdGVyIGFjY2VzcyBtYWNybyB0byBjbGVhciBhbmQgc2V0IG9uZSBvciBzZXZlcmFsIGJpdHMgKi8KKyNkZWZpbmUgQVRPTUlDX01PRElGWUhfUkVHKFJFRywgQ0xFQVJNU0ssIFNFVE1BU0spICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50MTZfdCB2YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHZhbCA9IChfX0xEUkVYSCgoX19JTyB1aW50MTZfdCAqKSYoUkVHKSkgJiB+KENMRUFSTVNLKSkgfCAoU0VUTUFTSyk7IFwKKyAgICB9IHdoaWxlICgoX19TVFJFWEgodmFsLCAoX19JTyB1aW50MTZfdCAqKSYoUkVHKSkpICE9IDBVKTsgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworLyoqCisgKiBAfQorICovCisKKyNpZiBkZWZpbmVkKFVTRV9IQUxfRFJJVkVSKQorI2luY2x1ZGUgInN0bTMyZzR4eF9oYWwuaCIKKyNlbmRpZiAvKiBVU0VfSEFMX0RSSVZFUiAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYgLyogX19TVE0zMkc0eHhfSCAqLworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLwpkaWZmIC0tZ2l0IGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL0NNU0lTL0RldmljZS9TVC9TVE0zMkc0eHgvSW5jbHVkZS9zeXN0ZW1fc3RtMzJnNHh4LmggYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvQ01TSVMvRGV2aWNlL1NUL1NUTTMyRzR4eC9JbmNsdWRlL3N5c3RlbV9zdG0zMmc0eHguaAppbmRleCA3MWE5M2EyLi5hZjMwZGUxIDEwMDY0NAotLS0gYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvQ01TSVMvRGV2aWNlL1NUL1NUTTMyRzR4eC9JbmNsdWRlL3N5c3RlbV9zdG0zMmc0eHguaAorKysgYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvQ01TSVMvRGV2aWNlL1NUL1NUTTMyRzR4eC9JbmNsdWRlL3N5c3RlbV9zdG0zMmc0eHguaApAQCAtMSwxMDMgKzEsMTAzIEBACi0vKioNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQGZpbGUgICAgc3lzdGVtX3N0bTMyZzR4eC5oDQotICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0NCi0gKiBAYnJpZWYgICBDTVNJUyBDb3J0ZXgtTTQgRGV2aWNlIFN5c3RlbSBTb3VyY2UgRmlsZSBmb3IgU1RNMzJHNHh4IGRldmljZXMuDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEBhdHRlbnRpb24NCi0gKg0KLSAqIENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4NCi0gKg0KLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGVybXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZQ0KLSAqIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4NCi0gKiBJZiBubyBMSUNFTlNFIGZpbGUgY29tZXMgd2l0aCB0aGlzIHNvZnR3YXJlLCBpdCBpcyBwcm92aWRlZCBBUy1JUy4NCi0gKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKi8NCi0NCi0vKiogQGFkZHRvZ3JvdXAgQ01TSVMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKiBAYWRkdG9ncm91cCBzdG0zMmc0eHhfc3lzdGVtDQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbg0KLSAqLw0KLSNpZm5kZWYgX19TWVNURU1fU1RNMzJHNFhYX0gNCi0jZGVmaW5lIF9fU1lTVEVNX1NUTTMyRzRYWF9IDQotDQotI2lmZGVmIF9fY3BsdXNwbHVzDQotZXh0ZXJuICJDIiB7DQotI2VuZGlmDQotDQotLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzR4eF9TeXN0ZW1fSW5jbHVkZXMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzR4eF9TeXN0ZW1fRXhwb3J0ZWRfVmFyaWFibGVzDQotICogQHsNCi0gKi8NCi0vKiBUaGUgU3lzdGVtQ29yZUNsb2NrIHZhcmlhYmxlIGlzIHVwZGF0ZWQgaW4gdGhyZWUgd2F5czoNCi0gICAgMSkgYnkgY2FsbGluZyBDTVNJUyBmdW5jdGlvbiBTeXN0ZW1Db3JlQ2xvY2tVcGRhdGUoKQ0KLSAgICAyKSBieSBjYWxsaW5nIEhBTCBBUEkgZnVuY3Rpb24gSEFMX1JDQ19HZXRTeXNDbG9ja0ZyZXEoKQ0KLSAgICAzKSBlYWNoIHRpbWUgSEFMX1JDQ19DbG9ja0NvbmZpZygpIGlzIGNhbGxlZCB0byBjb25maWd1cmUgdGhlIHN5c3RlbSBjbG9jaw0KLSAgIGZyZXF1ZW5jeSBOb3RlOiBJZiB5b3UgdXNlIHRoaXMgZnVuY3Rpb24gdG8gY29uZmlndXJlIHRoZSBzeXN0ZW0gY2xvY2s7IHRoZW4NCi0gICB0aGVyZSBpcyBubyBuZWVkIHRvIGNhbGwgdGhlIDIgZmlyc3QgZnVuY3Rpb25zIGxpc3RlZCBhYm92ZSwgc2luY2UNCi0gICBTeXN0ZW1Db3JlQ2xvY2sgdmFyaWFibGUgaXMgdXBkYXRlZCBhdXRvbWF0aWNhbGx5Lg0KLSovDQotZXh0ZXJuIHVpbnQzMl90IFN5c3RlbUNvcmVDbG9jazsgLyohPCBTeXN0ZW0gQ2xvY2sgRnJlcXVlbmN5IChDb3JlIENsb2NrKSAqLw0KLQ0KLWV4dGVybiBjb25zdCB1aW50OF90IEFIQlByZXNjVGFibGVbMTZdOyAvKiE8IEFIQiBwcmVzY2FsZXJzIHRhYmxlIHZhbHVlcyAqLw0KLWV4dGVybiBjb25zdCB1aW50OF90IEFQQlByZXNjVGFibGVbOF07ICAvKiE8IEFQQiBwcmVzY2FsZXJzIHRhYmxlIHZhbHVlcyAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzR4eF9TeXN0ZW1fRXhwb3J0ZWRfQ29uc3RhbnRzDQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAYWRkdG9ncm91cCBTVE0zMkc0eHhfU3lzdGVtX0V4cG9ydGVkX01hY3Jvcw0KLSAqIEB7DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGFkZHRvZ3JvdXAgU1RNMzJHNHh4X1N5c3RlbV9FeHBvcnRlZF9GdW5jdGlvbnMNCi0gKiBAew0KLSAqLw0KLQ0KLWV4dGVybiB2b2lkIFN5c3RlbUluaXQodm9pZCk7DQotZXh0ZXJuIHZvaWQgU3lzdGVtQ29yZUNsb2NrVXBkYXRlKHZvaWQpOw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotI2lmZGVmIF9fY3BsdXNwbHVzDQotfQ0KLSNlbmRpZg0KLQ0KLSNlbmRpZiAvKl9fU1lTVEVNX1NUTTMyRzRYWF9IICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGZpbGUgICAgc3lzdGVtX3N0bTMyZzR4eC5oCisgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICogQGJyaWVmICAgQ01TSVMgQ29ydGV4LU00IERldmljZSBTeXN0ZW0gU291cmNlIEZpbGUgZm9yIFNUTTMyRzR4eCBkZXZpY2VzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGF0dGVudGlvbgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGVybXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZQorICogaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc29mdHdhcmUgY29tcG9uZW50LgorICogSWYgbm8gTElDRU5TRSBmaWxlIGNvbWVzIHdpdGggdGhpcyBzb2Z0d2FyZSwgaXQgaXMgcHJvdmlkZWQgQVMtSVMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qKiBAYWRkdG9ncm91cCBDTVNJUworICogQHsKKyAqLworCisvKiogQGFkZHRvZ3JvdXAgc3RtMzJnNHh4X3N5c3RlbQorICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uCisgKi8KKyNpZm5kZWYgX19TWVNURU1fU1RNMzJHNFhYX0gKKyNkZWZpbmUgX19TWVNURU1fU1RNMzJHNFhYX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHNHh4X1N5c3RlbV9JbmNsdWRlcworICogQHsKKyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzR4eF9TeXN0ZW1fRXhwb3J0ZWRfVmFyaWFibGVzCisgKiBAeworICovCisvKiBUaGUgU3lzdGVtQ29yZUNsb2NrIHZhcmlhYmxlIGlzIHVwZGF0ZWQgaW4gdGhyZWUgd2F5czoKKyAgICAxKSBieSBjYWxsaW5nIENNU0lTIGZ1bmN0aW9uIFN5c3RlbUNvcmVDbG9ja1VwZGF0ZSgpCisgICAgMikgYnkgY2FsbGluZyBIQUwgQVBJIGZ1bmN0aW9uIEhBTF9SQ0NfR2V0U3lzQ2xvY2tGcmVxKCkKKyAgICAzKSBlYWNoIHRpbWUgSEFMX1JDQ19DbG9ja0NvbmZpZygpIGlzIGNhbGxlZCB0byBjb25maWd1cmUgdGhlIHN5c3RlbSBjbG9jaworICAgZnJlcXVlbmN5IE5vdGU6IElmIHlvdSB1c2UgdGhpcyBmdW5jdGlvbiB0byBjb25maWd1cmUgdGhlIHN5c3RlbSBjbG9jazsgdGhlbgorICAgdGhlcmUgaXMgbm8gbmVlZCB0byBjYWxsIHRoZSAyIGZpcnN0IGZ1bmN0aW9ucyBsaXN0ZWQgYWJvdmUsIHNpbmNlCisgICBTeXN0ZW1Db3JlQ2xvY2sgdmFyaWFibGUgaXMgdXBkYXRlZCBhdXRvbWF0aWNhbGx5LgorKi8KK2V4dGVybiB1aW50MzJfdCBTeXN0ZW1Db3JlQ2xvY2s7IC8qITwgU3lzdGVtIENsb2NrIEZyZXF1ZW5jeSAoQ29yZSBDbG9jaykgKi8KKworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgQUhCUHJlc2NUYWJsZVsxNl07IC8qITwgQUhCIHByZXNjYWxlcnMgdGFibGUgdmFsdWVzICovCitleHRlcm4gY29uc3QgdWludDhfdCBBUEJQcmVzY1RhYmxlWzhdOyAgLyohPCBBUEIgcHJlc2NhbGVycyB0YWJsZSB2YWx1ZXMgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkc0eHhfU3lzdGVtX0V4cG9ydGVkX0NvbnN0YW50cworICogQHsKKyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzR4eF9TeXN0ZW1fRXhwb3J0ZWRfTWFjcm9zCisgKiBAeworICovCisKKy8qKgorICogQH0KKyAqLworCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHNHh4X1N5c3RlbV9FeHBvcnRlZF9GdW5jdGlvbnMKKyAqIEB7CisgKi8KKworZXh0ZXJuIHZvaWQgU3lzdGVtSW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIFN5c3RlbUNvcmVDbG9ja1VwZGF0ZSh2b2lkKTsKKy8qKgorICogQH0KKyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLypfX1NZU1RFTV9TVE0zMkc0WFhfSCAqLworCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCmRpZmYgLS1naXQgYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvQ01TSVMvRGV2aWNlL1NUL1NUTTMyRzR4eC9MSUNFTlNFLnR4dCBiL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9DTVNJUy9EZXZpY2UvU1QvU1RNMzJHNHh4L0xJQ0VOU0UudHh0CmluZGV4IDUzMDY2ODYuLjg3MmU4MmIgMTAwNjQ0Ci0tLSBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9DTVNJUy9EZXZpY2UvU1QvU1RNMzJHNHh4L0xJQ0VOU0UudHh0CisrKyBiL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9DTVNJUy9EZXZpY2UvU1QvU1RNMzJHNHh4L0xJQ0VOU0UudHh0CkBAIC0xLDYgKzEsNiBAQAotVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgcHJvdmlkZWQgdG8geW91IGFzIHBhcnQgb2YgYSBzb2Z0d2FyZSBwYWNrYWdlIGFuZA0KLWFwcGxpY2FibGUgbGljZW5zZSB0ZXJtcyBhcmUgaW4gdGhlICBQYWNrYWdlX2xpY2Vuc2UgZmlsZS4gSWYgeW91IHJlY2VpdmVkIHRoaXMNCi1zb2Z0d2FyZSBjb21wb25lbnQgb3V0c2lkZSBvZiBhIHBhY2thZ2Ugb3Igd2l0aG91dCBhcHBsaWNhYmxlIGxpY2Vuc2UgdGVybXMsDQotdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2Ugc2hhbGwgYXBwbHkuIA0KLVlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgQXBhY2hlLTIuMCBhdDoNCi1odHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0FwYWNoZS0yLjANCitUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBwcm92aWRlZCB0byB5b3UgYXMgcGFydCBvZiBhIHNvZnR3YXJlIHBhY2thZ2UgYW5kCithcHBsaWNhYmxlIGxpY2Vuc2UgdGVybXMgYXJlIGluIHRoZSAgUGFja2FnZV9saWNlbnNlIGZpbGUuIElmIHlvdSByZWNlaXZlZCB0aGlzCitzb2Z0d2FyZSBjb21wb25lbnQgb3V0c2lkZSBvZiBhIHBhY2thZ2Ugb3Igd2l0aG91dCBhcHBsaWNhYmxlIGxpY2Vuc2UgdGVybXMsCit0aGUgdGVybXMgb2YgdGhlIEFwYWNoZS0yLjAgbGljZW5zZSBzaGFsbCBhcHBseS4gCitZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIEFwYWNoZS0yLjAgYXQ6CitodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0FwYWNoZS0yLjAKZGlmZiAtLWdpdCBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9JbmMvTGVnYWN5L3N0bTMyX2hhbF9sZWdhY3kuaCBiL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9JbmMvTGVnYWN5L3N0bTMyX2hhbF9sZWdhY3kuaAppbmRleCA0NjFhN2Q1Li5mYTA1N2IzIDEwMDY0NAotLS0gYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL0xlZ2FjeS9zdG0zMl9oYWxfbGVnYWN5LmgKKysrIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9MZWdhY3kvc3RtMzJfaGFsX2xlZ2FjeS5oCkBAIC0xLDQzNTEgKzEsNDgwMCBAQAotLyoqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEBmaWxlICAgIHN0bTMyX2hhbF9sZWdhY3kuaA0KLSAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtDQotICogQGJyaWVmICAgVGhpcyBmaWxlIGNvbnRhaW5zIGFsaWFzZXMgZGVmaW5pdGlvbiBmb3IgdGhlIFNUTTMyQ3ViZSBIQUwNCi0gKmNvbnN0YW50cyBtYWNyb3MgYW5kIGZ1bmN0aW9ucyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZS4NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQGF0dGVudGlvbg0KLSAqDQotICogQ29weXJpZ2h0IChjKSAyMDIxIFNUTWljcm9lbGVjdHJvbmljcy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KLSAqDQotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0ZXJtcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlDQotICogaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc29mdHdhcmUgY29tcG9uZW50Lg0KLSAqIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcyB3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLg0KLSAqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqLw0KLQ0KLS8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotI2lmbmRlZiBTVE0zMl9IQUxfTEVHQUNZDQotI2RlZmluZSBTVE0zMl9IQUxfTEVHQUNZDQotDQotI2lmZGVmIF9fY3BsdXNwbHVzDQotZXh0ZXJuICJDIiB7DQotI2VuZGlmDQotDQotLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotDQotLyoqIEBkZWZncm91cCBIQUxfQUVTX0FsaWFzZWRfRGVmaW5lcyBIQUwgQ1JZUCBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3INCi0gKiBsZWdhY3kgcHVycG9zZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBBRVNfRkxBR19SREVSUiBDUllQX0ZMQUdfUkRFUlINCi0jZGVmaW5lIEFFU19GTEFHX1dSRVJSIENSWVBfRkxBR19XUkVSUg0KLSNkZWZpbmUgQUVTX0NMRUFSRkxBR19DQ0YgQ1JZUF9DTEVBUkZMQUdfQ0NGDQotI2RlZmluZSBBRVNfQ0xFQVJGTEFHX1JERVJSIENSWVBfQ0xFQVJGTEFHX1JERVJSDQotI2RlZmluZSBBRVNfQ0xFQVJGTEFHX1dSRVJSIENSWVBfQ0xFQVJGTEFHX1dSRVJSDQotI2lmIGRlZmluZWQoU1RNMzJVNSkNCi0jZGVmaW5lIENSWVBfREFUQVRZUEVfMzJCIENSWVBfTk9fU1dBUA0KLSNkZWZpbmUgQ1JZUF9EQVRBVFlQRV8xNkIgQ1JZUF9IQUxGV09SRF9TV0FQDQotI2RlZmluZSBDUllQX0RBVEFUWVBFXzhCIENSWVBfQllURV9TV0FQDQotI2RlZmluZSBDUllQX0RBVEFUWVBFXzFCIENSWVBfQklUX1NXQVANCi0jZGVmaW5lIENSWVBfQ0NGX0NMRUFSIENSWVBfQ0xFQVJfQ0NGDQotI2RlZmluZSBDUllQX0VSUl9DTEVBUiBDUllQX0NMRUFSX1JXRUlGDQotI2VuZGlmIC8qIFNUTTMyVTUgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgSEFMX0FEQ19BbGlhc2VkX0RlZmluZXMgSEFMIEFEQyBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3INCi0gKiBsZWdhY3kgcHVycG9zZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBBRENfUkVTT0xVVElPTjEyYiBBRENfUkVTT0xVVElPTl8xMkINCi0jZGVmaW5lIEFEQ19SRVNPTFVUSU9OMTBiIEFEQ19SRVNPTFVUSU9OXzEwQg0KLSNkZWZpbmUgQURDX1JFU09MVVRJT044YiBBRENfUkVTT0xVVElPTl84Qg0KLSNkZWZpbmUgQURDX1JFU09MVVRJT042YiBBRENfUkVTT0xVVElPTl82Qg0KLSNkZWZpbmUgT1ZSX0RBVEFfT1ZFUldSSVRURU4gQURDX09WUl9EQVRBX09WRVJXUklUVEVODQotI2RlZmluZSBPVlJfREFUQV9QUkVTRVJWRUQgQURDX09WUl9EQVRBX1BSRVNFUlZFRA0KLSNkZWZpbmUgRU9DX1NJTkdMRV9DT05WIEFEQ19FT0NfU0lOR0xFX0NPTlYNCi0jZGVmaW5lIEVPQ19TRVFfQ09OViBBRENfRU9DX1NFUV9DT05WDQotI2RlZmluZSBFT0NfU0lOR0xFX1NFUV9DT05WIEFEQ19FT0NfU0lOR0xFX1NFUV9DT05WDQotI2RlZmluZSBSRUdVTEFSX0dST1VQIEFEQ19SRUdVTEFSX0dST1VQDQotI2RlZmluZSBJTkpFQ1RFRF9HUk9VUCBBRENfSU5KRUNURURfR1JPVVANCi0jZGVmaW5lIFJFR1VMQVJfSU5KRUNURURfR1JPVVAgQURDX1JFR1VMQVJfSU5KRUNURURfR1JPVVANCi0jZGVmaW5lIEFXRF9FVkVOVCBBRENfQVdEX0VWRU5UDQotI2RlZmluZSBBV0QxX0VWRU5UIEFEQ19BV0QxX0VWRU5UDQotI2RlZmluZSBBV0QyX0VWRU5UIEFEQ19BV0QyX0VWRU5UDQotI2RlZmluZSBBV0QzX0VWRU5UIEFEQ19BV0QzX0VWRU5UDQotI2RlZmluZSBPVlJfRVZFTlQgQURDX09WUl9FVkVOVA0KLSNkZWZpbmUgSlFPVkZfRVZFTlQgQURDX0pRT1ZGX0VWRU5UDQotI2RlZmluZSBBTExfQ0hBTk5FTFMgQURDX0FMTF9DSEFOTkVMUw0KLSNkZWZpbmUgUkVHVUxBUl9DSEFOTkVMUyBBRENfUkVHVUxBUl9DSEFOTkVMUw0KLSNkZWZpbmUgSU5KRUNURURfQ0hBTk5FTFMgQURDX0lOSkVDVEVEX0NIQU5ORUxTDQotI2RlZmluZSBTWVNDRkdfRkxBR19TRU5TT1JfQURDIEFEQ19GTEFHX1NFTlNPUg0KLSNkZWZpbmUgU1lTQ0ZHX0ZMQUdfVlJFRl9BREMgQURDX0ZMQUdfVlJFRklOVA0KLSNkZWZpbmUgQURDX0NMT0NLUFJFU0NBTEVSX1BDTEtfRElWMSBBRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjENCi0jZGVmaW5lIEFEQ19DTE9DS1BSRVNDQUxFUl9QQ0xLX0RJVjIgQURDX0NMT0NLX1NZTkNfUENMS19ESVYyDQotI2RlZmluZSBBRENfQ0xPQ0tQUkVTQ0FMRVJfUENMS19ESVY0IEFEQ19DTE9DS19TWU5DX1BDTEtfRElWNA0KLSNkZWZpbmUgQURDX0NMT0NLUFJFU0NBTEVSX1BDTEtfRElWNiBBRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjYNCi0jZGVmaW5lIEFEQ19DTE9DS1BSRVNDQUxFUl9QQ0xLX0RJVjggQURDX0NMT0NLX1NZTkNfUENMS19ESVY4DQotI2RlZmluZSBBRENfRVhURVJOQUxUUklHMF9UNl9UUkdPIEFEQ19FWFRFUk5BTFRSSUdDT05WX1Q2X1RSR08NCi0jZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUcxX1QyMV9DQzIgQURDX0VYVEVSTkFMVFJJR0NPTlZfVDIxX0NDMg0KLSNkZWZpbmUgQURDX0VYVEVSTkFMVFJJRzJfVDJfVFJHTyBBRENfRVhURVJOQUxUUklHQ09OVl9UMl9UUkdPDQotI2RlZmluZSBBRENfRVhURVJOQUxUUklHM19UMl9DQzQgQURDX0VYVEVSTkFMVFJJR0NPTlZfVDJfQ0M0DQotI2RlZmluZSBBRENfRVhURVJOQUxUUklHNF9UMjJfVFJHTyBBRENfRVhURVJOQUxUUklHQ09OVl9UMjJfVFJHTw0KLSNkZWZpbmUgQURDX0VYVEVSTkFMVFJJRzdfRVhUX0lUMTEgQURDX0VYVEVSTkFMVFJJR0NPTlZfRVhUX0lUMTENCi0jZGVmaW5lIEFEQ19DTE9DS19BU1lOQyBBRENfQ0xPQ0tfQVNZTkNfRElWMQ0KLSNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR19FREdFX05PTkUgQURDX0VYVEVSTkFMVFJJR0NPTlZFREdFX05PTkUNCi0jZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdfRURHRV9SSVNJTkcgQURDX0VYVEVSTkFMVFJJR0NPTlZFREdFX1JJU0lORw0KLSNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR19FREdFX0ZBTExJTkcgQURDX0VYVEVSTkFMVFJJR0NPTlZFREdFX0ZBTExJTkcNCi0jZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdfRURHRV9SSVNJTkdGQUxMSU5HIFwNCi0gIEFEQ19FWFRFUk5BTFRSSUdDT05WRURHRV9SSVNJTkdGQUxMSU5HDQotI2RlZmluZSBBRENfU0FNUExFVElNRV8yQ1lDTEVfNSBBRENfU0FNUExFVElNRV8yQ1lDTEVTXzUNCi0NCi0jZGVmaW5lIEhBTF9BRENfU1RBVEVfQlVTWV9SRUcgSEFMX0FEQ19TVEFURV9SRUdfQlVTWQ0KLSNkZWZpbmUgSEFMX0FEQ19TVEFURV9CVVNZX0lOSiBIQUxfQURDX1NUQVRFX0lOSl9CVVNZDQotI2RlZmluZSBIQUxfQURDX1NUQVRFX0VPQ19SRUcgSEFMX0FEQ19TVEFURV9SRUdfRU9DDQotI2RlZmluZSBIQUxfQURDX1NUQVRFX0VPQ19JTkogSEFMX0FEQ19TVEFURV9JTkpfRU9DDQotI2RlZmluZSBIQUxfQURDX1NUQVRFX0VSUk9SIEhBTF9BRENfU1RBVEVfRVJST1JfSU5URVJOQUwNCi0jZGVmaW5lIEhBTF9BRENfU1RBVEVfQlVTWSBIQUxfQURDX1NUQVRFX0JVU1lfSU5URVJOQUwNCi0jZGVmaW5lIEhBTF9BRENfU1RBVEVfQVdEIEhBTF9BRENfU1RBVEVfQVdEMQ0KLQ0KLSNpZiBkZWZpbmVkKFNUTTMySDcpDQotI2RlZmluZSBBRENfQ0hBTk5FTF9WQkFUX0RJVjQgQURDX0NIQU5ORUxfVkJBVA0KLSNlbmRpZiAvKiBTVE0zMkg3ICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEhBTF9DRUNfQWxpYXNlZF9EZWZpbmVzIEhBTCBDRUMgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yDQotICogbGVnYWN5IHB1cnBvc2UNCi0gKiBAew0KLSAqLw0KLQ0KLSNkZWZpbmUgX19IQUxfQ0VDX0dFVF9JVCBfX0hBTF9DRUNfR0VUX0ZMQUcNCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgSEFMX0NPTVBfQWxpYXNlZF9EZWZpbmVzIEhBTCBDT01QIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvcg0KLSAqIGxlZ2FjeSBwdXJwb3NlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIENPTVBfV0lORE9XTU9ERV9ESVNBQkxFRCBDT01QX1dJTkRPV01PREVfRElTQUJMRQ0KLSNkZWZpbmUgQ09NUF9XSU5ET1dNT0RFX0VOQUJMRUQgQ09NUF9XSU5ET1dNT0RFX0VOQUJMRQ0KLSNkZWZpbmUgQ09NUF9FWFRJX0xJTkVfQ09NUDFfRVZFTlQgQ09NUF9FWFRJX0xJTkVfQ09NUDENCi0jZGVmaW5lIENPTVBfRVhUSV9MSU5FX0NPTVAyX0VWRU5UIENPTVBfRVhUSV9MSU5FX0NPTVAyDQotI2RlZmluZSBDT01QX0VYVElfTElORV9DT01QM19FVkVOVCBDT01QX0VYVElfTElORV9DT01QMw0KLSNkZWZpbmUgQ09NUF9FWFRJX0xJTkVfQ09NUDRfRVZFTlQgQ09NUF9FWFRJX0xJTkVfQ09NUDQNCi0jZGVmaW5lIENPTVBfRVhUSV9MSU5FX0NPTVA1X0VWRU5UIENPTVBfRVhUSV9MSU5FX0NPTVA1DQotI2RlZmluZSBDT01QX0VYVElfTElORV9DT01QNl9FVkVOVCBDT01QX0VYVElfTElORV9DT01QNg0KLSNkZWZpbmUgQ09NUF9FWFRJX0xJTkVfQ09NUDdfRVZFTlQgQ09NUF9FWFRJX0xJTkVfQ09NUDcNCi0jaWYgZGVmaW5lZChTVE0zMkwwKQ0KLSNkZWZpbmUgQ09NUF9MUFRJTUNPTk5FQ1RJT05fRU5BQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKHVpbnQzMl90KTB4MDAwMDAwMDNVKSAvKiE8IENPTVBYIG91dHB1dCBnZW5lcmljIG5hbWluZzogY29ubmVjdGVkIHRvIExQVElNIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0IDEgZm9yIENPTVAxLCBMUFRJTSBpbnB1dCAyIGZvciBDT01QMiAqLw0KLSNlbmRpZg0KLSNkZWZpbmUgQ09NUF9PVVRQVVRfQ09NUDZUSU0yT0NSRUZDTFIgQ09NUF9PVVRQVVRfQ09NUDZfVElNMk9DUkVGQ0xSDQotI2lmIGRlZmluZWQoU1RNMzJGMzczeEMpIHx8IGRlZmluZWQoU1RNMzJGMzc4eHgpDQotI2RlZmluZSBDT01QX09VVFBVVF9USU0zSUMxIENPTVBfT1VUUFVUX0NPTVAxX1RJTTNJQzENCi0jZGVmaW5lIENPTVBfT1VUUFVUX1RJTTNPQ1JFRkNMUiBDT01QX09VVFBVVF9DT01QMV9USU0zT0NSRUZDTFINCi0jZW5kaWYgLyogU1RNMzJGMzczeEMgfHwgU1RNMzJGMzc4eHggKi8NCi0NCi0jaWYgZGVmaW5lZChTVE0zMkwwKSB8fCBkZWZpbmVkKFNUTTMyTDQpDQotI2RlZmluZSBDT01QX1dJTkRPV01PREVfRU5BQkxFIENPTVBfV0lORE9XTU9ERV9DT01QMV9JTlBVVF9QTFVTX0NPTU1PTg0KLQ0KLSNkZWZpbmUgQ09NUF9OT05JTlZFUlRJTkdJTlBVVF9JTzEgQ09NUF9JTlBVVF9QTFVTX0lPMQ0KLSNkZWZpbmUgQ09NUF9OT05JTlZFUlRJTkdJTlBVVF9JTzIgQ09NUF9JTlBVVF9QTFVTX0lPMg0KLSNkZWZpbmUgQ09NUF9OT05JTlZFUlRJTkdJTlBVVF9JTzMgQ09NUF9JTlBVVF9QTFVTX0lPMw0KLSNkZWZpbmUgQ09NUF9OT05JTlZFUlRJTkdJTlBVVF9JTzQgQ09NUF9JTlBVVF9QTFVTX0lPNA0KLSNkZWZpbmUgQ09NUF9OT05JTlZFUlRJTkdJTlBVVF9JTzUgQ09NUF9JTlBVVF9QTFVTX0lPNQ0KLSNkZWZpbmUgQ09NUF9OT05JTlZFUlRJTkdJTlBVVF9JTzYgQ09NUF9JTlBVVF9QTFVTX0lPNg0KLQ0KLSNkZWZpbmUgQ09NUF9JTlZFUlRJTkdJTlBVVF8xXzRWUkVGSU5UIENPTVBfSU5QVVRfTUlOVVNfMV80VlJFRklOVA0KLSNkZWZpbmUgQ09NUF9JTlZFUlRJTkdJTlBVVF8xXzJWUkVGSU5UIENPTVBfSU5QVVRfTUlOVVNfMV8yVlJFRklOVA0KLSNkZWZpbmUgQ09NUF9JTlZFUlRJTkdJTlBVVF8zXzRWUkVGSU5UIENPTVBfSU5QVVRfTUlOVVNfM180VlJFRklOVA0KLSNkZWZpbmUgQ09NUF9JTlZFUlRJTkdJTlBVVF9WUkVGSU5UIENPTVBfSU5QVVRfTUlOVVNfVlJFRklOVA0KLSNkZWZpbmUgQ09NUF9JTlZFUlRJTkdJTlBVVF9EQUMxX0NIMSBDT01QX0lOUFVUX01JTlVTX0RBQzFfQ0gxDQotI2RlZmluZSBDT01QX0lOVkVSVElOR0lOUFVUX0RBQzFfQ0gyIENPTVBfSU5QVVRfTUlOVVNfREFDMV9DSDINCi0jZGVmaW5lIENPTVBfSU5WRVJUSU5HSU5QVVRfREFDMSBDT01QX0lOUFVUX01JTlVTX0RBQzFfQ0gxDQotI2RlZmluZSBDT01QX0lOVkVSVElOR0lOUFVUX0RBQzIgQ09NUF9JTlBVVF9NSU5VU19EQUMxX0NIMg0KLSNkZWZpbmUgQ09NUF9JTlZFUlRJTkdJTlBVVF9JTzEgQ09NUF9JTlBVVF9NSU5VU19JTzENCi0jaWYgZGVmaW5lZChTVE0zMkwwKQ0KLS8qIElzc3VlIGZpeGVkIG9uIFNUTTMyTDAgQ09NUCBkcml2ZXI6IG9ubHkgMiBkZWRpY2F0ZWQgSU8gKElPMSBhbmQgSU8yKSwgICAgICovDQotLyogSU8yIHdhcyB3cm9uZ2x5IGFzc2lnbmVkIHRvIElPIHNoYXJlZCB3aXRoIERBQyBhbmQgSU8zIHdhcyBjb3JyZXNwb25kaW5nICAgKi8NCi0vKiB0byB0aGUgc2Vjb25kIGRlZGljYXRlZCBJTyAob25seSBmb3IgQ09NUDIpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgQ09NUF9JTlZFUlRJTkdJTlBVVF9JTzIgQ09NUF9JTlBVVF9NSU5VU19EQUMxX0NIMg0KLSNkZWZpbmUgQ09NUF9JTlZFUlRJTkdJTlBVVF9JTzMgQ09NUF9JTlBVVF9NSU5VU19JTzINCi0jZWxzZQ0KLSNkZWZpbmUgQ09NUF9JTlZFUlRJTkdJTlBVVF9JTzIgQ09NUF9JTlBVVF9NSU5VU19JTzINCi0jZGVmaW5lIENPTVBfSU5WRVJUSU5HSU5QVVRfSU8zIENPTVBfSU5QVVRfTUlOVVNfSU8zDQotI2VuZGlmDQotI2RlZmluZSBDT01QX0lOVkVSVElOR0lOUFVUX0lPNCBDT01QX0lOUFVUX01JTlVTX0lPNA0KLSNkZWZpbmUgQ09NUF9JTlZFUlRJTkdJTlBVVF9JTzUgQ09NUF9JTlBVVF9NSU5VU19JTzUNCi0NCi0jZGVmaW5lIENPTVBfT1VUUFVUTEVWRUxfTE9XIENPTVBfT1VUUFVUX0xFVkVMX0xPVw0KLSNkZWZpbmUgQ09NUF9PVVRQVVRMRVZFTF9ISUdIIENPTVBfT1VUUFVUX0xFVkVMX0hJR0gNCi0NCi0vKiBOb3RlOiBMaXRlcmFsICJDT01QX0ZMQUdfTE9DSyIga2VwdCBmb3IgbGVnYWN5IHB1cnBvc2UuICAgICAgICAgICAgICAgICAgICAqLw0KLS8qICAgICAgIFRvIGNoZWNrIENPTVAgbG9jayBzdGF0ZSwgdXNlIG1hY3JvICJfX0hBTF9DT01QX0lTX0xPQ0tFRCgpIi4gICAgICAgICovDQotI2lmIGRlZmluZWQoQ09NUF9DU1JfTE9DSykNCi0jZGVmaW5lIENPTVBfRkxBR19MT0NLIENPTVBfQ1NSX0xPQ0sNCi0jZWxpZiBkZWZpbmVkKENPTVBfQ1NSX0NPTVAxTE9DSykNCi0jZGVmaW5lIENPTVBfRkxBR19MT0NLIENPTVBfQ1NSX0NPTVAxTE9DSw0KLSNlbGlmIGRlZmluZWQoQ09NUF9DU1JfQ09NUHhMT0NLKQ0KLSNkZWZpbmUgQ09NUF9GTEFHX0xPQ0sgQ09NUF9DU1JfQ09NUHhMT0NLDQotI2VuZGlmDQotDQotI2lmIGRlZmluZWQoU1RNMzJMNCkNCi0jZGVmaW5lIENPTVBfQkxBTktJTkdTUkNFX1RJTTFPQzUgQ09NUF9CTEFOS0lOR1NSQ19USU0xX09DNV9DT01QMQ0KLSNkZWZpbmUgQ09NUF9CTEFOS0lOR1NSQ0VfVElNMk9DMyBDT01QX0JMQU5LSU5HU1JDX1RJTTJfT0MzX0NPTVAxDQotI2RlZmluZSBDT01QX0JMQU5LSU5HU1JDRV9USU0zT0MzIENPTVBfQkxBTktJTkdTUkNfVElNM19PQzNfQ09NUDENCi0jZGVmaW5lIENPTVBfQkxBTktJTkdTUkNFX1RJTTNPQzQgQ09NUF9CTEFOS0lOR1NSQ19USU0zX09DNF9DT01QMg0KLSNkZWZpbmUgQ09NUF9CTEFOS0lOR1NSQ0VfVElNOE9DNSBDT01QX0JMQU5LSU5HU1JDX1RJTThfT0M1X0NPTVAyDQotI2RlZmluZSBDT01QX0JMQU5LSU5HU1JDRV9USU0xNU9DMSBDT01QX0JMQU5LSU5HU1JDX1RJTTE1X09DMV9DT01QMg0KLSNkZWZpbmUgQ09NUF9CTEFOS0lOR1NSQ0VfTk9ORSBDT01QX0JMQU5LSU5HU1JDX05PTkUNCi0jZW5kaWYNCi0NCi0jaWYgZGVmaW5lZChTVE0zMkwwKQ0KLSNkZWZpbmUgQ09NUF9NT0RFX0hJR0hTUEVFRCBDT01QX1BPV0VSTU9ERV9NRURJVU1TUEVFRA0KLSNkZWZpbmUgQ09NUF9NT0RFX0xPV1NQRUVEIENPTVBfUE9XRVJNT0RFX1VMVFJBTE9XUE9XRVINCi0jZWxzZQ0KLSNkZWZpbmUgQ09NUF9NT0RFX0hJR0hTUEVFRCBDT01QX1BPV0VSTU9ERV9ISUdIU1BFRUQNCi0jZGVmaW5lIENPTVBfTU9ERV9NRURJVU1TUEVFRCBDT01QX1BPV0VSTU9ERV9NRURJVU1TUEVFRA0KLSNkZWZpbmUgQ09NUF9NT0RFX0xPV1BPV0VSIENPTVBfUE9XRVJNT0RFX0xPV1BPV0VSDQotI2RlZmluZSBDT01QX01PREVfVUxUUkFMT1dQT1dFUiBDT01QX1BPV0VSTU9ERV9VTFRSQUxPV1BPV0VSDQotI2VuZGlmDQotDQotI2VuZGlmDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEhBTF9DT1JURVhfQWxpYXNlZF9EZWZpbmVzIEhBTCBDT1JURVggQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQNCi0gKiBmb3IgbGVnYWN5IHB1cnBvc2UNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgX19IQUxfQ09SVEVYX1NZU1RJQ0tDTEtfQ09ORklHIEhBTF9TWVNUSUNLX0NMS1NvdXJjZUNvbmZpZw0KLSNpZiBkZWZpbmVkKFNUTTMyVTUpDQotI2RlZmluZSBNUFVfREVWSUNFX25HblJuRSBNUFVfREVWSUNFX05HTlJORQ0KLSNkZWZpbmUgTVBVX0RFVklDRV9uR25SRSBNUFVfREVWSUNFX05HTlJFDQotI2RlZmluZSBNUFVfREVWSUNFX25HUkUgTVBVX0RFVklDRV9OR1JFDQotI2VuZGlmIC8qIFNUTTMyVTUgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQ1JDX0FsaWFzZXMgQ1JDIEFQSSBhbGlhc2VzDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIEhBTF9DUkNfSW5wdXRfRGF0YV9SZXZlcnNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgSEFMX0NSQ0V4X0lucHV0X0RhdGFfUmV2ZXJzZSAvKiE8IEFsaWFzZWQgdG8gSEFMX0NSQ0V4X0lucHV0X0RhdGFfUmV2ZXJzZSBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBpbnRlciBTVE0zMiBzZXJpZXMgY29tcGF0aWJpbGl0eSAgKi8NCi0jZGVmaW5lIEhBTF9DUkNfT3V0cHV0X0RhdGFfUmV2ZXJzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBIQUxfQ1JDRXhfT3V0cHV0X0RhdGFfUmV2ZXJzZSAvKiE8IEFsaWFzZWQgdG8gSEFMX0NSQ0V4X091dHB1dF9EYXRhX1JldmVyc2UgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGludGVyIFNUTTMyIHNlcmllcyBjb21wYXRpYmlsaXR5ICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEhBTF9DUkNfQWxpYXNlZF9EZWZpbmVzIEhBTCBDUkMgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yDQotICogbGVnYWN5IHB1cnBvc2UNCi0gKiBAew0KLSAqLw0KLQ0KLSNkZWZpbmUgQ1JDX09VVFBVVERBVEFfSU5WRVJTSU9OX0RJU0FCTEVEIENSQ19PVVRQVVREQVRBX0lOVkVSU0lPTl9ESVNBQkxFDQotI2RlZmluZSBDUkNfT1VUUFVUREFUQV9JTlZFUlNJT05fRU5BQkxFRCBDUkNfT1VUUFVUREFUQV9JTlZFUlNJT05fRU5BQkxFDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEhBTF9EQUNfQWxpYXNlZF9EZWZpbmVzIEhBTCBEQUMgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yDQotICogbGVnYWN5IHB1cnBvc2UNCi0gKiBAew0KLSAqLw0KLQ0KLSNkZWZpbmUgREFDMV9DSEFOTkVMXzEgREFDX0NIQU5ORUxfMQ0KLSNkZWZpbmUgREFDMV9DSEFOTkVMXzIgREFDX0NIQU5ORUxfMg0KLSNkZWZpbmUgREFDMl9DSEFOTkVMXzEgREFDX0NIQU5ORUxfMQ0KLSNkZWZpbmUgREFDX1dBVkVfTk9ORSAweDAwMDAwMDAwVQ0KLSNkZWZpbmUgREFDX1dBVkVfTk9JU0UgREFDX0NSX1dBVkUxXzANCi0jZGVmaW5lIERBQ19XQVZFX1RSSUFOR0xFIERBQ19DUl9XQVZFMV8xDQotI2RlZmluZSBEQUNfV0FWRUdFTkVSQVRJT05fTk9ORSBEQUNfV0FWRV9OT05FDQotI2RlZmluZSBEQUNfV0FWRUdFTkVSQVRJT05fTk9JU0UgREFDX1dBVkVfTk9JU0UNCi0jZGVmaW5lIERBQ19XQVZFR0VORVJBVElPTl9UUklBTkdMRSBEQUNfV0FWRV9UUklBTkdMRQ0KLQ0KLSNpZiBkZWZpbmVkKFNUTTMyRzQpIHx8IGRlZmluZWQoU1RNMzJINykgfHwgZGVmaW5lZChTVE0zMlU1KQ0KLSNkZWZpbmUgREFDX0NISVBDT05ORUNUX0RJU0FCTEUgREFDX0NISVBDT05ORUNUX0VYVEVSTkFMDQotI2RlZmluZSBEQUNfQ0hJUENPTk5FQ1RfRU5BQkxFIERBQ19DSElQQ09OTkVDVF9JTlRFUk5BTA0KLSNlbmRpZg0KLQ0KLSNpZiBkZWZpbmVkKFNUTTMyVTUpDQotI2RlZmluZSBEQUNfVFJJR0dFUl9TVE9QX0xQVElNMV9PVVQgREFDX1RSSUdHRVJfU1RPUF9MUFRJTTFfQ0gxDQotI2RlZmluZSBEQUNfVFJJR0dFUl9TVE9QX0xQVElNM19PVVQgREFDX1RSSUdHRVJfU1RPUF9MUFRJTTNfQ0gxDQotI2RlZmluZSBEQUNfVFJJR0dFUl9MUFRJTTFfT1VUIERBQ19UUklHR0VSX0xQVElNMV9DSDENCi0jZGVmaW5lIERBQ19UUklHR0VSX0xQVElNM19PVVQgREFDX1RSSUdHRVJfTFBUSU0zX0NIMQ0KLSNlbmRpZg0KLQ0KLSNpZiBkZWZpbmVkKFNUTTMyTDEpIHx8IGRlZmluZWQoU1RNMzJMNCkgfHwgZGVmaW5lZChTVE0zMkcwKSB8fCBcDQotICAgIGRlZmluZWQoU1RNMzJMNSkgfHwgZGVmaW5lZChTVE0zMkg3KSB8fCBkZWZpbmVkKFNUTTMyRjQpIHx8IFwNCi0gICAgZGVmaW5lZChTVE0zMkc0KQ0KLSNkZWZpbmUgSEFMX0RBQ19NU1BfSU5JVF9DQl9JRCBIQUxfREFDX01TUElOSVRfQ0JfSUQNCi0jZGVmaW5lIEhBTF9EQUNfTVNQX0RFSU5JVF9DQl9JRCBIQUxfREFDX01TUERFSU5JVF9DQl9JRA0KLSNlbmRpZg0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBIQUxfRE1BX0FsaWFzZWRfRGVmaW5lcyBIQUwgRE1BIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvcg0KLSAqIGxlZ2FjeSBwdXJwb3NlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIEhBTF9SRU1BUERNQV9BRENfRE1BX0NIMiBETUFfUkVNQVBfQURDX0RNQV9DSDINCi0jZGVmaW5lIEhBTF9SRU1BUERNQV9VU0FSVDFfVFhfRE1BX0NINCBETUFfUkVNQVBfVVNBUlQxX1RYX0RNQV9DSDQNCi0jZGVmaW5lIEhBTF9SRU1BUERNQV9VU0FSVDFfUlhfRE1BX0NINSBETUFfUkVNQVBfVVNBUlQxX1JYX0RNQV9DSDUNCi0jZGVmaW5lIEhBTF9SRU1BUERNQV9USU0xNl9ETUFfQ0g0IERNQV9SRU1BUF9USU0xNl9ETUFfQ0g0DQotI2RlZmluZSBIQUxfUkVNQVBETUFfVElNMTdfRE1BX0NIMiBETUFfUkVNQVBfVElNMTdfRE1BX0NIMg0KLSNkZWZpbmUgSEFMX1JFTUFQRE1BX1VTQVJUM19ETUFfQ0gzMiBETUFfUkVNQVBfVVNBUlQzX0RNQV9DSDMyDQotI2RlZmluZSBIQUxfUkVNQVBETUFfVElNMTZfRE1BX0NINiBETUFfUkVNQVBfVElNMTZfRE1BX0NINg0KLSNkZWZpbmUgSEFMX1JFTUFQRE1BX1RJTTE3X0RNQV9DSDcgRE1BX1JFTUFQX1RJTTE3X0RNQV9DSDcNCi0jZGVmaW5lIEhBTF9SRU1BUERNQV9TUEkyX0RNQV9DSDY3IERNQV9SRU1BUF9TUEkyX0RNQV9DSDY3DQotI2RlZmluZSBIQUxfUkVNQVBETUFfVVNBUlQyX0RNQV9DSDY3IERNQV9SRU1BUF9VU0FSVDJfRE1BX0NINjcNCi0jZGVmaW5lIEhBTF9SRU1BUERNQV9JMkMxX0RNQV9DSDc2IERNQV9SRU1BUF9JMkMxX0RNQV9DSDc2DQotI2RlZmluZSBIQUxfUkVNQVBETUFfVElNMV9ETUFfQ0g2IERNQV9SRU1BUF9USU0xX0RNQV9DSDYNCi0jZGVmaW5lIEhBTF9SRU1BUERNQV9USU0yX0RNQV9DSDcgRE1BX1JFTUFQX1RJTTJfRE1BX0NINw0KLSNkZWZpbmUgSEFMX1JFTUFQRE1BX1RJTTNfRE1BX0NINiBETUFfUkVNQVBfVElNM19ETUFfQ0g2DQotDQotI2RlZmluZSBJU19IQUxfUkVNQVBETUEgSVNfRE1BX1JFTUFQDQotI2RlZmluZSBfX0hBTF9SRU1BUERNQV9DSEFOTkVMX0VOQUJMRSBfX0hBTF9ETUFfUkVNQVBfQ0hBTk5FTF9FTkFCTEUNCi0jZGVmaW5lIF9fSEFMX1JFTUFQRE1BX0NIQU5ORUxfRElTQUJMRSBfX0hBTF9ETUFfUkVNQVBfQ0hBTk5FTF9ESVNBQkxFDQotDQotI2lmIGRlZmluZWQoU1RNMzJMNCkNCi0NCi0jZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0VYVEkwIEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTANCi0jZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0VYVEkxIEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTENCi0jZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0VYVEkyIEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTINCi0jZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0VYVEkzIEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTMNCi0jZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0VYVEk0IEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTQNCi0jZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0VYVEk1IEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTUNCi0jZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0VYVEk2IEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTYNCi0jZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0VYVEk3IEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTcNCi0jZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0VYVEk4IEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTgNCi0jZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0VYVEk5IEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTkNCi0jZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0VYVEkxMCBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEkxMA0KLSNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRVUVTVF9HRU5fRVhUSTExIEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTExDQotI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9FWFRJMTIgSEFMX0RNQU1VWDFfUkVRX0dFTl9FWFRJMTINCi0jZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0VYVEkxMyBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEkxMw0KLSNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRVUVTVF9HRU5fRVhUSTE0IEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTE0DQotI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9FWFRJMTUgSEFMX0RNQU1VWDFfUkVRX0dFTl9FWFRJMTUNCi0jZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0RNQU1VWDFfQ0gwX0VWVCBcDQotICBIQUxfRE1BTVVYMV9SRVFfR0VOX0RNQU1VWDFfQ0gwX0VWVA0KLSNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRVUVTVF9HRU5fRE1BTVVYMV9DSDFfRVZUIFwNCi0gIEhBTF9ETUFNVVgxX1JFUV9HRU5fRE1BTVVYMV9DSDFfRVZUDQotI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9ETUFNVVgxX0NIMl9FVlQgXA0KLSAgSEFMX0RNQU1VWDFfUkVRX0dFTl9ETUFNVVgxX0NIMl9FVlQNCi0jZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0RNQU1VWDFfQ0gzX0VWVCBcDQotICBIQUxfRE1BTVVYMV9SRVFfR0VOX0RNQU1VWDFfQ0gzX0VWVA0KLSNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRVUVTVF9HRU5fTFBUSU0xX09VVCBIQUxfRE1BTVVYMV9SRVFfR0VOX0xQVElNMV9PVVQNCi0jZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0xQVElNMl9PVVQgSEFMX0RNQU1VWDFfUkVRX0dFTl9MUFRJTTJfT1VUDQotI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9EU0lfVEUgSEFMX0RNQU1VWDFfUkVRX0dFTl9EU0lfVEUNCi0jZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0RTSV9FT1QgSEFMX0RNQU1VWDFfUkVRX0dFTl9EU0lfRU9UDQotI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9ETUEyRF9FT1QgSEFMX0RNQU1VWDFfUkVRX0dFTl9ETUEyRF9FT1QNCi0jZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0xURENfSVQgSEFMX0RNQU1VWDFfUkVRX0dFTl9MVERDX0lUDQotDQotI2RlZmluZSBIQUxfRE1BTVVYX1JFUVVFU1RfR0VOX05PX0VWRU5UIEhBTF9ETUFNVVhfUkVRX0dFTl9OT19FVkVOVA0KLSNkZWZpbmUgSEFMX0RNQU1VWF9SRVFVRVNUX0dFTl9SSVNJTkcgSEFMX0RNQU1VWF9SRVFfR0VOX1JJU0lORw0KLSNkZWZpbmUgSEFMX0RNQU1VWF9SRVFVRVNUX0dFTl9GQUxMSU5HIEhBTF9ETUFNVVhfUkVRX0dFTl9GQUxMSU5HDQotI2RlZmluZSBIQUxfRE1BTVVYX1JFUVVFU1RfR0VOX1JJU0lOR19GQUxMSU5HIEhBTF9ETUFNVVhfUkVRX0dFTl9SSVNJTkdfRkFMTElORw0KLQ0KLSNpZiBkZWZpbmVkKFNUTTMyTDRSNXh4KSB8fCBkZWZpbmVkKFNUTTMyTDRSOXh4KSB8fCBkZWZpbmVkKFNUTTMyTDRSOXh4KSB8fCBcDQotICAgIGRlZmluZWQoU1RNMzJMNFM1eHgpIHx8IGRlZmluZWQoU1RNMzJMNFM3eHgpIHx8IGRlZmluZWQoU1RNMzJMNFM5eHgpDQotI2RlZmluZSBETUFfUkVRVUVTVF9EQ01JX1BTU0kgRE1BX1JFUVVFU1RfRENNSQ0KLSNlbmRpZg0KLQ0KLSNlbmRpZiAvKiBTVE0zMkw0ICovDQotDQotI2lmIGRlZmluZWQoU1RNMzJHMCkNCi0jZGVmaW5lIERNQV9SRVFVRVNUX0RBQzFfQ0hBTk5FTDEgRE1BX1JFUVVFU1RfREFDMV9DSDENCi0jZGVmaW5lIERNQV9SRVFVRVNUX0RBQzFfQ0hBTk5FTDIgRE1BX1JFUVVFU1RfREFDMV9DSDINCi0jZGVmaW5lIERNQV9SRVFVRVNUX1RJTTE2X1RSSUdfQ09NIERNQV9SRVFVRVNUX1RJTTE2X0NPTQ0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfVElNMTdfVFJJR19DT00gRE1BX1JFUVVFU1RfVElNMTdfQ09NDQotDQotI2RlZmluZSBMTF9ETUFNVVhfUkVRX1RJTTE2X1RSSUdfQ09NIExMX0RNQU1VWF9SRVFfVElNMTZfQ09NDQotI2RlZmluZSBMTF9ETUFNVVhfUkVRX1RJTTE3X1RSSUdfQ09NIExMX0RNQU1VWF9SRVFfVElNMTdfQ09NDQotI2VuZGlmDQotDQotI2lmIGRlZmluZWQoU1RNMzJINykNCi0NCi0jZGVmaW5lIERNQV9SRVFVRVNUX0RBQzEgRE1BX1JFUVVFU1RfREFDMV9DSDENCi0jZGVmaW5lIERNQV9SRVFVRVNUX0RBQzIgRE1BX1JFUVVFU1RfREFDMV9DSDINCi0NCi0jZGVmaW5lIEJETUFfUkVRVUVTVF9MUF9VQVJUMV9SWCBCRE1BX1JFUVVFU1RfTFBVQVJUMV9SWA0KLSNkZWZpbmUgQkRNQV9SRVFVRVNUX0xQX1VBUlQxX1RYIEJETUFfUkVRVUVTVF9MUFVBUlQxX1RYDQotDQotI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9ETUFNVVgxX0NIMF9FVlQgXA0KLSAgSEFMX0RNQU1VWDFfUkVRX0dFTl9ETUFNVVgxX0NIMF9FVlQNCi0jZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0RNQU1VWDFfQ0gxX0VWVCBcDQotICBIQUxfRE1BTVVYMV9SRVFfR0VOX0RNQU1VWDFfQ0gxX0VWVA0KLSNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRVUVTVF9HRU5fRE1BTVVYMV9DSDJfRVZUIFwNCi0gIEhBTF9ETUFNVVgxX1JFUV9HRU5fRE1BTVVYMV9DSDJfRVZUDQotI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9MUFRJTTFfT1VUIEhBTF9ETUFNVVgxX1JFUV9HRU5fTFBUSU0xX09VVA0KLSNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRVUVTVF9HRU5fTFBUSU0yX09VVCBIQUxfRE1BTVVYMV9SRVFfR0VOX0xQVElNMl9PVVQNCi0jZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0xQVElNM19PVVQgSEFMX0RNQU1VWDFfUkVRX0dFTl9MUFRJTTNfT1VUDQotI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9FWFRJMCBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEkwDQotI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9USU0xMl9UUkdPIEhBTF9ETUFNVVgxX1JFUV9HRU5fVElNMTJfVFJHTw0KLQ0KLSNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fRE1BTVVYMl9DSDBfRVZUIFwNCi0gIEhBTF9ETUFNVVgyX1JFUV9HRU5fRE1BTVVYMl9DSDBfRVZUDQotI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9ETUFNVVgyX0NIMV9FVlQgXA0KLSAgSEFMX0RNQU1VWDJfUkVRX0dFTl9ETUFNVVgyX0NIMV9FVlQNCi0jZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX0RNQU1VWDJfQ0gyX0VWVCBcDQotICBIQUxfRE1BTVVYMl9SRVFfR0VOX0RNQU1VWDJfQ0gyX0VWVA0KLSNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fRE1BTVVYMl9DSDNfRVZUIFwNCi0gIEhBTF9ETUFNVVgyX1JFUV9HRU5fRE1BTVVYMl9DSDNfRVZUDQotI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9ETUFNVVgyX0NINF9FVlQgXA0KLSAgSEFMX0RNQU1VWDJfUkVRX0dFTl9ETUFNVVgyX0NINF9FVlQNCi0jZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX0RNQU1VWDJfQ0g1X0VWVCBcDQotICBIQUxfRE1BTVVYMl9SRVFfR0VOX0RNQU1VWDJfQ0g1X0VWVA0KLSNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fRE1BTVVYMl9DSDZfRVZUIFwNCi0gIEhBTF9ETUFNVVgyX1JFUV9HRU5fRE1BTVVYMl9DSDZfRVZUDQotI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9MUFVBUlQxX1JYX1dLVVAgXA0KLSAgSEFMX0RNQU1VWDJfUkVRX0dFTl9MUFVBUlQxX1JYX1dLVVANCi0jZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX0xQVUFSVDFfVFhfV0tVUCBcDQotICBIQUxfRE1BTVVYMl9SRVFfR0VOX0xQVUFSVDFfVFhfV0tVUA0KLSNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fTFBUSU0yX1dLVVAgSEFMX0RNQU1VWDJfUkVRX0dFTl9MUFRJTTJfV0tVUA0KLSNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fTFBUSU0yX09VVCBIQUxfRE1BTVVYMl9SRVFfR0VOX0xQVElNMl9PVVQNCi0jZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX0xQVElNM19XS1VQIEhBTF9ETUFNVVgyX1JFUV9HRU5fTFBUSU0zX1dLVVANCi0jZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX0xQVElNM19PVVQgSEFMX0RNQU1VWDJfUkVRX0dFTl9MUFRJTTNfT1VUDQotI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9MUFRJTTRfV0tVUCBIQUxfRE1BTVVYMl9SRVFfR0VOX0xQVElNNF9XS1VQDQotI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9MUFRJTTVfV0tVUCBIQUxfRE1BTVVYMl9SRVFfR0VOX0xQVElNNV9XS1VQDQotI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9JMkM0X1dLVVAgSEFMX0RNQU1VWDJfUkVRX0dFTl9JMkM0X1dLVVANCi0jZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX1NQSTZfV0tVUCBIQUxfRE1BTVVYMl9SRVFfR0VOX1NQSTZfV0tVUA0KLSNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fQ09NUDFfT1VUIEhBTF9ETUFNVVgyX1JFUV9HRU5fQ09NUDFfT1VUDQotI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9DT01QMl9PVVQgSEFMX0RNQU1VWDJfUkVRX0dFTl9DT01QMl9PVVQNCi0jZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX1JUQ19XS1VQIEhBTF9ETUFNVVgyX1JFUV9HRU5fUlRDX1dLVVANCi0jZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX0VYVEkwIEhBTF9ETUFNVVgyX1JFUV9HRU5fRVhUSTANCi0jZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX0VYVEkyIEhBTF9ETUFNVVgyX1JFUV9HRU5fRVhUSTINCi0jZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX0kyQzRfSVRfRVZUIEhBTF9ETUFNVVgyX1JFUV9HRU5fSTJDNF9JVF9FVlQNCi0jZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX1NQSTZfSVQgSEFMX0RNQU1VWDJfUkVRX0dFTl9TUEk2X0lUDQotI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9MUFVBUlQxX1RYX0lUIEhBTF9ETUFNVVgyX1JFUV9HRU5fTFBVQVJUMV9UWF9JVA0KLSNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fTFBVQVJUMV9SWF9JVCBIQUxfRE1BTVVYMl9SRVFfR0VOX0xQVUFSVDFfUlhfSVQNCi0jZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX0FEQzNfSVQgSEFMX0RNQU1VWDJfUkVRX0dFTl9BREMzX0lUDQotI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9BREMzX0FXRDFfT1VUIEhBTF9ETUFNVVgyX1JFUV9HRU5fQURDM19BV0QxX09VVA0KLSNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fQkRNQV9DSDBfSVQgSEFMX0RNQU1VWDJfUkVRX0dFTl9CRE1BX0NIMF9JVA0KLSNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fQkRNQV9DSDFfSVQgSEFMX0RNQU1VWDJfUkVRX0dFTl9CRE1BX0NIMV9JVA0KLQ0KLSNkZWZpbmUgSEFMX0RNQU1VWF9SRVFVRVNUX0dFTl9OT19FVkVOVCBIQUxfRE1BTVVYX1JFUV9HRU5fTk9fRVZFTlQNCi0jZGVmaW5lIEhBTF9ETUFNVVhfUkVRVUVTVF9HRU5fUklTSU5HIEhBTF9ETUFNVVhfUkVRX0dFTl9SSVNJTkcNCi0jZGVmaW5lIEhBTF9ETUFNVVhfUkVRVUVTVF9HRU5fRkFMTElORyBIQUxfRE1BTVVYX1JFUV9HRU5fRkFMTElORw0KLSNkZWZpbmUgSEFMX0RNQU1VWF9SRVFVRVNUX0dFTl9SSVNJTkdfRkFMTElORyBIQUxfRE1BTVVYX1JFUV9HRU5fUklTSU5HX0ZBTExJTkcNCi0NCi0jZGVmaW5lIERGU0RNX0ZJTFRFUl9FWFRfVFJJR19MUFRJTTEgREZTRE1fRklMVEVSX0VYVF9UUklHX0xQVElNMV9PVVQNCi0jZGVmaW5lIERGU0RNX0ZJTFRFUl9FWFRfVFJJR19MUFRJTTIgREZTRE1fRklMVEVSX0VYVF9UUklHX0xQVElNMl9PVVQNCi0jZGVmaW5lIERGU0RNX0ZJTFRFUl9FWFRfVFJJR19MUFRJTTMgREZTRE1fRklMVEVSX0VYVF9UUklHX0xQVElNM19PVVQNCi0NCi0jZGVmaW5lIERBQ19UUklHR0VSX0xQMV9PVVQgREFDX1RSSUdHRVJfTFBUSU0xX09VVA0KLSNkZWZpbmUgREFDX1RSSUdHRVJfTFAyX09VVCBEQUNfVFJJR0dFUl9MUFRJTTJfT1VUDQotDQotI2VuZGlmIC8qIFNUTTMySDcgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgSEFMX0ZMQVNIX0FsaWFzZWRfRGVmaW5lcyBIQUwgRkxBU0ggQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yDQotICogbGVnYWN5IHB1cnBvc2UNCi0gKiBAew0KLSAqLw0KLQ0KLSNkZWZpbmUgVFlQRVBST0dSQU1fQllURSBGTEFTSF9UWVBFUFJPR1JBTV9CWVRFDQotI2RlZmluZSBUWVBFUFJPR1JBTV9IQUxGV09SRCBGTEFTSF9UWVBFUFJPR1JBTV9IQUxGV09SRA0KLSNkZWZpbmUgVFlQRVBST0dSQU1fV09SRCBGTEFTSF9UWVBFUFJPR1JBTV9XT1JEDQotI2RlZmluZSBUWVBFUFJPR1JBTV9ET1VCTEVXT1JEIEZMQVNIX1RZUEVQUk9HUkFNX0RPVUJMRVdPUkQNCi0jZGVmaW5lIFRZUEVFUkFTRV9TRUNUT1JTIEZMQVNIX1RZUEVFUkFTRV9TRUNUT1JTDQotI2RlZmluZSBUWVBFRVJBU0VfUEFHRVMgRkxBU0hfVFlQRUVSQVNFX1BBR0VTDQotI2RlZmluZSBUWVBFRVJBU0VfUEFHRUVSQVNFIEZMQVNIX1RZUEVFUkFTRV9QQUdFUw0KLSNkZWZpbmUgVFlQRUVSQVNFX01BU1NFUkFTRSBGTEFTSF9UWVBFRVJBU0VfTUFTU0VSQVNFDQotI2RlZmluZSBXUlBTVEFURV9ESVNBQkxFIE9CX1dSUFNUQVRFX0RJU0FCTEUNCi0jZGVmaW5lIFdSUFNUQVRFX0VOQUJMRSBPQl9XUlBTVEFURV9FTkFCTEUNCi0jZGVmaW5lIEhBTF9GTEFTSF9USU1FT1VUX1ZBTFVFIEZMQVNIX1RJTUVPVVRfVkFMVUUNCi0jZGVmaW5lIE9CRVhfUENST1AgT1BUSU9OQllURV9QQ1JPUA0KLSNkZWZpbmUgT0JFWF9CT09UQ09ORklHIE9QVElPTkJZVEVfQk9PVENPTkZJRw0KLSNkZWZpbmUgUENST1BTVEFURV9ESVNBQkxFIE9CX1BDUk9QX1NUQVRFX0RJU0FCTEUNCi0jZGVmaW5lIFBDUk9QU1RBVEVfRU5BQkxFIE9CX1BDUk9QX1NUQVRFX0VOQUJMRQ0KLSNkZWZpbmUgVFlQRUVSQVNFREFUQV9CWVRFIEZMQVNIX1RZUEVFUkFTRURBVEFfQllURQ0KLSNkZWZpbmUgVFlQRUVSQVNFREFUQV9IQUxGV09SRCBGTEFTSF9UWVBFRVJBU0VEQVRBX0hBTEZXT1JEDQotI2RlZmluZSBUWVBFRVJBU0VEQVRBX1dPUkQgRkxBU0hfVFlQRUVSQVNFREFUQV9XT1JEDQotI2RlZmluZSBUWVBFUFJPR1JBTURBVEFfQllURSBGTEFTSF9UWVBFUFJPR1JBTURBVEFfQllURQ0KLSNkZWZpbmUgVFlQRVBST0dSQU1EQVRBX0hBTEZXT1JEIEZMQVNIX1RZUEVQUk9HUkFNREFUQV9IQUxGV09SRA0KLSNkZWZpbmUgVFlQRVBST0dSQU1EQVRBX1dPUkQgRkxBU0hfVFlQRVBST0dSQU1EQVRBX1dPUkQNCi0jZGVmaW5lIFRZUEVQUk9HUkFNREFUQV9GQVNUQllURSBGTEFTSF9UWVBFUFJPR1JBTURBVEFfRkFTVEJZVEUNCi0jZGVmaW5lIFRZUEVQUk9HUkFNREFUQV9GQVNUSEFMRldPUkQgRkxBU0hfVFlQRVBST0dSQU1EQVRBX0ZBU1RIQUxGV09SRA0KLSNkZWZpbmUgVFlQRVBST0dSQU1EQVRBX0ZBU1RXT1JEIEZMQVNIX1RZUEVQUk9HUkFNREFUQV9GQVNUV09SRA0KLSNkZWZpbmUgUEFHRVNJWkUgRkxBU0hfUEFHRV9TSVpFDQotI2RlZmluZSBUWVBFUFJPR1JBTV9GQVNUQllURSBGTEFTSF9UWVBFUFJPR1JBTV9CWVRFDQotI2RlZmluZSBUWVBFUFJPR1JBTV9GQVNUSEFMRldPUkQgRkxBU0hfVFlQRVBST0dSQU1fSEFMRldPUkQNCi0jZGVmaW5lIFRZUEVQUk9HUkFNX0ZBU1RXT1JEIEZMQVNIX1RZUEVQUk9HUkFNX1dPUkQNCi0jZGVmaW5lIFZPTFRBR0VfUkFOR0VfMSBGTEFTSF9WT0xUQUdFX1JBTkdFXzENCi0jZGVmaW5lIFZPTFRBR0VfUkFOR0VfMiBGTEFTSF9WT0xUQUdFX1JBTkdFXzINCi0jZGVmaW5lIFZPTFRBR0VfUkFOR0VfMyBGTEFTSF9WT0xUQUdFX1JBTkdFXzMNCi0jZGVmaW5lIFZPTFRBR0VfUkFOR0VfNCBGTEFTSF9WT0xUQUdFX1JBTkdFXzQNCi0jZGVmaW5lIFRZUEVQUk9HUkFNX0ZBU1QgRkxBU0hfVFlQRVBST0dSQU1fRkFTVA0KLSNkZWZpbmUgVFlQRVBST0dSQU1fRkFTVF9BTkRfTEFTVCBGTEFTSF9UWVBFUFJPR1JBTV9GQVNUX0FORF9MQVNUDQotI2RlZmluZSBXUlBBUkVBX0JBTksxX0FSRUFBIE9CX1dSUEFSRUFfQkFOSzFfQVJFQUENCi0jZGVmaW5lIFdSUEFSRUFfQkFOSzFfQVJFQUIgT0JfV1JQQVJFQV9CQU5LMV9BUkVBQg0KLSNkZWZpbmUgV1JQQVJFQV9CQU5LMl9BUkVBQSBPQl9XUlBBUkVBX0JBTksyX0FSRUFBDQotI2RlZmluZSBXUlBBUkVBX0JBTksyX0FSRUFCIE9CX1dSUEFSRUFfQkFOSzJfQVJFQUINCi0jZGVmaW5lIElXREdfU1REQllfRlJFRVpFIE9CX0lXREdfU1REQllfRlJFRVpFDQotI2RlZmluZSBJV0RHX1NUREJZX0FDVElWRSBPQl9JV0RHX1NUREJZX1JVTg0KLSNkZWZpbmUgSVdER19TVE9QX0ZSRUVaRSBPQl9JV0RHX1NUT1BfRlJFRVpFDQotI2RlZmluZSBJV0RHX1NUT1BfQUNUSVZFIE9CX0lXREdfU1RPUF9SVU4NCi0jZGVmaW5lIEZMQVNIX0VSUk9SX05PTkUgSEFMX0ZMQVNIX0VSUk9SX05PTkUNCi0jZGVmaW5lIEZMQVNIX0VSUk9SX1JEIEhBTF9GTEFTSF9FUlJPUl9SRA0KLSNkZWZpbmUgRkxBU0hfRVJST1JfUEcgSEFMX0ZMQVNIX0VSUk9SX1BST0cNCi0jZGVmaW5lIEZMQVNIX0VSUk9SX1BHUCBIQUxfRkxBU0hfRVJST1JfUEdTDQotI2RlZmluZSBGTEFTSF9FUlJPUl9XUlAgSEFMX0ZMQVNIX0VSUk9SX1dSUA0KLSNkZWZpbmUgRkxBU0hfRVJST1JfT1BUViBIQUxfRkxBU0hfRVJST1JfT1BUVg0KLSNkZWZpbmUgRkxBU0hfRVJST1JfT1BUVlVTUiBIQUxfRkxBU0hfRVJST1JfT1BUVlVTUg0KLSNkZWZpbmUgRkxBU0hfRVJST1JfUFJPRyBIQUxfRkxBU0hfRVJST1JfUFJPRw0KLSNkZWZpbmUgRkxBU0hfRVJST1JfT1AgSEFMX0ZMQVNIX0VSUk9SX09QRVJBVElPTg0KLSNkZWZpbmUgRkxBU0hfRVJST1JfUEdBIEhBTF9GTEFTSF9FUlJPUl9QR0ENCi0jZGVmaW5lIEZMQVNIX0VSUk9SX1NJWkUgSEFMX0ZMQVNIX0VSUk9SX1NJWkUNCi0jZGVmaW5lIEZMQVNIX0VSUk9SX1NJWiBIQUxfRkxBU0hfRVJST1JfU0laRQ0KLSNkZWZpbmUgRkxBU0hfRVJST1JfUEdTIEhBTF9GTEFTSF9FUlJPUl9QR1MNCi0jZGVmaW5lIEZMQVNIX0VSUk9SX01JUyBIQUxfRkxBU0hfRVJST1JfTUlTDQotI2RlZmluZSBGTEFTSF9FUlJPUl9GQVNUIEhBTF9GTEFTSF9FUlJPUl9GQVNUDQotI2RlZmluZSBGTEFTSF9FUlJPUl9GV1dFUlIgSEFMX0ZMQVNIX0VSUk9SX0ZXV0VSUg0KLSNkZWZpbmUgRkxBU0hfRVJST1JfTk9UWkVSTyBIQUxfRkxBU0hfRVJST1JfTk9UWkVSTw0KLSNkZWZpbmUgRkxBU0hfRVJST1JfT1BFUkFUSU9OIEhBTF9GTEFTSF9FUlJPUl9PUEVSQVRJT04NCi0jZGVmaW5lIEZMQVNIX0VSUk9SX0VSUyBIQUxfRkxBU0hfRVJST1JfRVJTDQotI2RlZmluZSBPQl9XREdfU1cgT0JfSVdER19TVw0KLSNkZWZpbmUgT0JfV0RHX0hXIE9CX0lXREdfSFcNCi0jZGVmaW5lIE9CX1NEQURDMTJfVkREX01PTklUT1JfU0VUIE9CX1NEQUNEX1ZERF9NT05JVE9SX1NFVA0KLSNkZWZpbmUgT0JfU0RBREMxMl9WRERfTU9OSVRPUl9SRVNFVCBPQl9TREFDRF9WRERfTU9OSVRPUl9SRVNFVA0KLSNkZWZpbmUgT0JfUkFNX1BBUklUWV9DSEVDS19TRVQgT0JfU1JBTV9QQVJJVFlfU0VUDQotI2RlZmluZSBPQl9SQU1fUEFSSVRZX0NIRUNLX1JFU0VUIE9CX1NSQU1fUEFSSVRZX1JFU0VUDQotI2RlZmluZSBJU19PQl9TREFEQzEyX1ZERF9NT05JVE9SIElTX09CX1NEQUNEX1ZERF9NT05JVE9SDQotI2RlZmluZSBPQl9SRFBfTEVWRUwwIE9CX1JEUF9MRVZFTF8wDQotI2RlZmluZSBPQl9SRFBfTEVWRUwxIE9CX1JEUF9MRVZFTF8xDQotI2RlZmluZSBPQl9SRFBfTEVWRUwyIE9CX1JEUF9MRVZFTF8yDQotI2lmIGRlZmluZWQoU1RNMzJHMCkNCi0jZGVmaW5lIE9CX0JPT1RfTE9DS19ESVNBQkxFIE9CX0JPT1RfRU5UUllfRk9SQ0VEX05PTkUNCi0jZGVmaW5lIE9CX0JPT1RfTE9DS19FTkFCTEUgT0JfQk9PVF9FTlRSWV9GT1JDRURfRkxBU0gNCi0jZWxzZQ0KLSNkZWZpbmUgT0JfQk9PVF9FTlRSWV9GT1JDRURfTk9ORSBPQl9CT09UX0xPQ0tfRElTQUJMRQ0KLSNkZWZpbmUgT0JfQk9PVF9FTlRSWV9GT1JDRURfRkxBU0ggT0JfQk9PVF9MT0NLX0VOQUJMRQ0KLSNlbmRpZg0KLSNpZiBkZWZpbmVkKFNUTTMySDcpDQotI2RlZmluZSBGTEFTSF9GTEFHX1NORUNDRV9CQU5LMVJSIEZMQVNIX0ZMQUdfU05FQ0NFUlJfQkFOSzENCi0jZGVmaW5lIEZMQVNIX0ZMQUdfREJFQ0NFX0JBTksxUlIgRkxBU0hfRkxBR19EQkVDQ0VSUl9CQU5LMQ0KLSNkZWZpbmUgRkxBU0hfRkxBR19TVFJCRVJfQkFOSzFSIEZMQVNIX0ZMQUdfU1RSQkVSUl9CQU5LMQ0KLSNkZWZpbmUgRkxBU0hfRkxBR19TTkVDQ0VfQkFOSzJSUiBGTEFTSF9GTEFHX1NORUNDRVJSX0JBTksyDQotI2RlZmluZSBGTEFTSF9GTEFHX0RCRUNDRV9CQU5LMlJSIEZMQVNIX0ZMQUdfREJFQ0NFUlJfQkFOSzINCi0jZGVmaW5lIEZMQVNIX0ZMQUdfU1RSQkVSX0JBTksyUiBGTEFTSF9GTEFHX1NUUkJFUlJfQkFOSzINCi0jZGVmaW5lIEZMQVNIX0ZMQUdfV0RXIEZMQVNIX0ZMQUdfV0JORQ0KLSNkZWZpbmUgT0JfV1JQX1NFQ1RPUl9BbGwgT0JfV1JQX1NFQ1RPUl9BTEwNCi0jZW5kaWYgLyogU1RNMzJINyAqLw0KLSNpZiBkZWZpbmVkKFNUTTMyVTUpDQotI2RlZmluZSBPQl9VU0VSX25SU1RfU1RPUCBPQl9VU0VSX05SU1RfU1RPUA0KLSNkZWZpbmUgT0JfVVNFUl9uUlNUX1NUREJZIE9CX1VTRVJfTlJTVF9TVERCWQ0KLSNkZWZpbmUgT0JfVVNFUl9uUlNUX1NIRFcgT0JfVVNFUl9OUlNUX1NIRFcNCi0jZGVmaW5lIE9CX1VTRVJfblNXQk9PVDAgT0JfVVNFUl9OU1dCT09UMA0KLSNkZWZpbmUgT0JfVVNFUl9uQk9PVDAgT0JfVVNFUl9OQk9PVDANCi0jZGVmaW5lIE9CX25CT09UMF9SRVNFVCBPQl9OQk9PVDBfUkVTRVQNCi0jZGVmaW5lIE9CX25CT09UMF9TRVQgT0JfTkJPT1QwX1NFVA0KLSNlbmRpZiAvKiBTVE0zMlU1ICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEhBTF9KUEVHX0FsaWFzZWRfTWFjcm9zIEhBTCBKUEVHIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yDQotICogbGVnYWN5IHB1cnBvc2UNCi0gKiBAew0KLSAqLw0KLQ0KLSNpZiBkZWZpbmVkKFNUTTMySDcpDQotI2RlZmluZSBfX0hBTF9SQ0NfSlBFR19DTEtfRU5BQkxFIF9fSEFMX1JDQ19KUEdERUNFTl9DTEtfRU5BQkxFDQotI2RlZmluZSBfX0hBTF9SQ0NfSlBFR19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfSlBHREVDRU5fQ0xLX0RJU0FCTEUNCi0jZGVmaW5lIF9fSEFMX1JDQ19KUEVHX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19KUEdERUNSU1RfRk9SQ0VfUkVTRVQNCi0jZGVmaW5lIF9fSEFMX1JDQ19KUEVHX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0pQR0RFQ1JTVF9SRUxFQVNFX1JFU0VUDQotI2RlZmluZSBfX0hBTF9SQ0NfSlBFR19DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19KUEdERUNfQ0xLX1NMRUVQX0VOQUJMRQ0KLSNkZWZpbmUgX19IQUxfUkNDX0pQRUdfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0pQR0RFQ19DTEtfU0xFRVBfRElTQUJMRQ0KLSNlbmRpZiAvKiBTVE0zMkg3ICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEhBTF9TWVNDRkdfQWxpYXNlZF9EZWZpbmVzIEhBTCBTWVNDRkcgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQNCi0gKiBmb3IgbGVnYWN5IHB1cnBvc2UNCi0gKiBAew0KLSAqLw0KLQ0KLSNkZWZpbmUgSEFMX1NZU0NGR19GQVNUTU9ERVBMVVNfSTJDX1BBOSBJMkNfRkFTVE1PREVQTFVTX1BBOQ0KLSNkZWZpbmUgSEFMX1NZU0NGR19GQVNUTU9ERVBMVVNfSTJDX1BBMTAgSTJDX0ZBU1RNT0RFUExVU19QQTEwDQotI2RlZmluZSBIQUxfU1lTQ0ZHX0ZBU1RNT0RFUExVU19JMkNfUEI2IEkyQ19GQVNUTU9ERVBMVVNfUEI2DQotI2RlZmluZSBIQUxfU1lTQ0ZHX0ZBU1RNT0RFUExVU19JMkNfUEI3IEkyQ19GQVNUTU9ERVBMVVNfUEI3DQotI2RlZmluZSBIQUxfU1lTQ0ZHX0ZBU1RNT0RFUExVU19JMkNfUEI4IEkyQ19GQVNUTU9ERVBMVVNfUEI4DQotI2RlZmluZSBIQUxfU1lTQ0ZHX0ZBU1RNT0RFUExVU19JMkNfUEI5IEkyQ19GQVNUTU9ERVBMVVNfUEI5DQotI2RlZmluZSBIQUxfU1lTQ0ZHX0ZBU1RNT0RFUExVU19JMkMxIEkyQ19GQVNUTU9ERVBMVVNfSTJDMQ0KLSNkZWZpbmUgSEFMX1NZU0NGR19GQVNUTU9ERVBMVVNfSTJDMiBJMkNfRkFTVE1PREVQTFVTX0kyQzINCi0jZGVmaW5lIEhBTF9TWVNDRkdfRkFTVE1PREVQTFVTX0kyQzMgSTJDX0ZBU1RNT0RFUExVU19JMkMzDQotI2lmIGRlZmluZWQoU1RNMzJHNCkNCi0NCi0jZGVmaW5lIEhBTF9TWVNDRkdfRW5hYmxlSU9BbmFsb2dTd2l0Y2hCb29zdGVyIEhBTF9TWVNDRkdfRW5hYmxlSU9Td2l0Y2hCb29zdGVyDQotI2RlZmluZSBIQUxfU1lTQ0ZHX0Rpc2FibGVJT0FuYWxvZ1N3aXRjaEJvb3N0ZXIgXA0KLSAgSEFMX1NZU0NGR19EaXNhYmxlSU9Td2l0Y2hCb29zdGVyDQotI2RlZmluZSBIQUxfU1lTQ0ZHX0VuYWJsZUlPQW5hbG9nU3dpdGNoVkREIEhBTF9TWVNDRkdfRW5hYmxlSU9Td2l0Y2hWREQNCi0jZGVmaW5lIEhBTF9TWVNDRkdfRGlzYWJsZUlPQW5hbG9nU3dpdGNoVkREIEhBTF9TWVNDRkdfRGlzYWJsZUlPU3dpdGNoVkREDQotI2VuZGlmIC8qIFNUTTMyRzQgKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgTExfRk1DX0FsaWFzZWRfRGVmaW5lcyBMTCBGTUMgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yDQotICogY29tcGF0aWJpbGl0eSBwdXJwb3NlDQotICogQHsNCi0gKi8NCi0jaWYgZGVmaW5lZChTVE0zMkw0KSB8fCBkZWZpbmVkKFNUTTMyRjcpIHx8IGRlZmluZWQoU1RNMzJINykgfHwgZGVmaW5lZChTVE0zMkc0KQ0KLSNkZWZpbmUgRk1DX05BTkRfUENDX1dBSVRfRkVBVFVSRV9ESVNBQkxFIEZNQ19OQU5EX1dBSVRfRkVBVFVSRV9ESVNBQkxFDQotI2RlZmluZSBGTUNfTkFORF9QQ0NfV0FJVF9GRUFUVVJFX0VOQUJMRSBGTUNfTkFORF9XQUlUX0ZFQVRVUkVfRU5BQkxFDQotI2RlZmluZSBGTUNfTkFORF9QQ0NfTUVNX0JVU19XSURUSF84IEZNQ19OQU5EX01FTV9CVVNfV0lEVEhfOA0KLSNkZWZpbmUgRk1DX05BTkRfUENDX01FTV9CVVNfV0lEVEhfMTYgRk1DX05BTkRfTUVNX0JVU19XSURUSF8xNg0KLSNlbGlmIGRlZmluZWQoU1RNMzJGMSkgfHwgZGVmaW5lZChTVE0zMkYyKSB8fCBkZWZpbmVkKFNUTTMyRjMpIHx8IFwNCi0gICAgZGVmaW5lZChTVE0zMkY0KQ0KLSNkZWZpbmUgRk1DX05BTkRfV0FJVF9GRUFUVVJFX0RJU0FCTEUgRk1DX05BTkRfUENDX1dBSVRfRkVBVFVSRV9ESVNBQkxFDQotI2RlZmluZSBGTUNfTkFORF9XQUlUX0ZFQVRVUkVfRU5BQkxFIEZNQ19OQU5EX1BDQ19XQUlUX0ZFQVRVUkVfRU5BQkxFDQotI2RlZmluZSBGTUNfTkFORF9NRU1fQlVTX1dJRFRIXzggRk1DX05BTkRfUENDX01FTV9CVVNfV0lEVEhfOA0KLSNkZWZpbmUgRk1DX05BTkRfTUVNX0JVU19XSURUSF8xNiBGTUNfTkFORF9QQ0NfTUVNX0JVU19XSURUSF8xNg0KLSNlbmRpZg0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBMTF9GU01DX0FsaWFzZWRfRGVmaW5lcyBMTCBGU01DIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvcg0KLSAqIGxlZ2FjeSBwdXJwb3NlDQotICogQHsNCi0gKi8NCi0NCi0jZGVmaW5lIEZTTUNfTk9SU1JBTV9UWVBFREVGIEZTTUNfTk9SU1JBTV9UeXBlRGVmDQotI2RlZmluZSBGU01DX05PUlNSQU1fRVhURU5ERURfVFlQRURFRiBGU01DX05PUlNSQU1fRVhURU5ERURfVHlwZURlZg0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBIQUxfR1BJT19BbGlhc2VkX01hY3JvcyBIQUwgR1BJTyBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvcg0KLSAqIGxlZ2FjeSBwdXJwb3NlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIEdFVF9HUElPX1NPVVJDRSBHUElPX0dFVF9JTkRFWA0KLSNkZWZpbmUgR0VUX0dQSU9fSU5ERVggR1BJT19HRVRfSU5ERVgNCi0NCi0jaWYgZGVmaW5lZChTVE0zMkY0KQ0KLSNkZWZpbmUgR1BJT19BRjEyX1NETU1DIEdQSU9fQUYxMl9TRElPDQotI2RlZmluZSBHUElPX0FGMTJfU0RNTUMxIEdQSU9fQUYxMl9TRElPDQotI2VuZGlmDQotDQotI2lmIGRlZmluZWQoU1RNMzJGNykNCi0jZGVmaW5lIEdQSU9fQUYxMl9TRElPIEdQSU9fQUYxMl9TRE1NQzENCi0jZGVmaW5lIEdQSU9fQUYxMl9TRE1NQyBHUElPX0FGMTJfU0RNTUMxDQotI2VuZGlmDQotDQotI2lmIGRlZmluZWQoU1RNMzJMNCkNCi0jZGVmaW5lIEdQSU9fQUYxMl9TRElPIEdQSU9fQUYxMl9TRE1NQzENCi0jZGVmaW5lIEdQSU9fQUYxMl9TRE1NQyBHUElPX0FGMTJfU0RNTUMxDQotI2VuZGlmDQotDQotI2lmIGRlZmluZWQoU1RNMzJINykNCi0jZGVmaW5lIEdQSU9fQUY3X1NESU8xIEdQSU9fQUY3X1NETU1DMQ0KLSNkZWZpbmUgR1BJT19BRjhfU0RJTzEgR1BJT19BRjhfU0RNTUMxDQotI2RlZmluZSBHUElPX0FGMTJfU0RJTzEgR1BJT19BRjEyX1NETU1DMQ0KLSNkZWZpbmUgR1BJT19BRjlfU0RJTzIgR1BJT19BRjlfU0RNTUMyDQotI2RlZmluZSBHUElPX0FGMTBfU0RJTzIgR1BJT19BRjEwX1NETU1DMg0KLSNkZWZpbmUgR1BJT19BRjExX1NESU8yIEdQSU9fQUYxMV9TRE1NQzINCi0NCi0jaWYgZGVmaW5lZChTVE0zMkg3NDN4eCkgfHwgZGVmaW5lZChTVE0zMkg3NTN4eCkgfHwgZGVmaW5lZChTVE0zMkg3NTB4eCkgfHwgXA0KLSAgICBkZWZpbmVkKFNUTTMySDc0Mnh4KSB8fCBkZWZpbmVkKFNUTTMySDc0NXh4KSB8fCBkZWZpbmVkKFNUTTMySDc1NXh4KSB8fCBcDQotICAgIGRlZmluZWQoU1RNMzJINzQ3eHgpIHx8IGRlZmluZWQoU1RNMzJINzU3eHgpDQotI2RlZmluZSBHUElPX0FGMTBfT1RHMl9IUyBHUElPX0FGMTBfT1RHMl9GUw0KLSNkZWZpbmUgR1BJT19BRjEwX09URzFfRlMgR1BJT19BRjEwX09URzFfSFMNCi0jZGVmaW5lIEdQSU9fQUYxMl9PVEcyX0ZTIEdQSU9fQUYxMl9PVEcxX0ZTDQotI2VuZGlmIC8qU1RNMzJINzQzeHggfHwgU1RNMzJINzUzeHggfHwgU1RNMzJINzUweHggfHwgU1RNMzJINzQyeHggfHwgXA0KLSAgICAgICAgICBTVE0zMkg3NDV4eCB8fCBTVE0zMkg3NTV4eCB8fCBTVE0zMkg3NDd4eCB8fCBTVE0zMkg3NTd4eCAqLw0KLSNlbmRpZiAvKiBTVE0zMkg3ICovDQotDQotI2RlZmluZSBHUElPX0FGMF9MUFRJTSBHUElPX0FGMF9MUFRJTTENCi0jZGVmaW5lIEdQSU9fQUYxX0xQVElNIEdQSU9fQUYxX0xQVElNMQ0KLSNkZWZpbmUgR1BJT19BRjJfTFBUSU0gR1BJT19BRjJfTFBUSU0xDQotDQotI2lmIGRlZmluZWQoU1RNMzJMMCkgfHwgZGVmaW5lZChTVE0zMkw0KSB8fCBkZWZpbmVkKFNUTTMyRjQpIHx8IFwNCi0gICAgZGVmaW5lZChTVE0zMkYyKSB8fCBkZWZpbmVkKFNUTTMyRjcpIHx8IGRlZmluZWQoU1RNMzJHNCkgfHwgXA0KLSAgICBkZWZpbmVkKFNUTTMySDcpIHx8IGRlZmluZWQoU1RNMzJXQikgfHwgZGVmaW5lZChTVE0zMlU1KQ0KLSNkZWZpbmUgR1BJT19TUEVFRF9MT1cgR1BJT19TUEVFRF9GUkVRX0xPVw0KLSNkZWZpbmUgR1BJT19TUEVFRF9NRURJVU0gR1BJT19TUEVFRF9GUkVRX01FRElVTQ0KLSNkZWZpbmUgR1BJT19TUEVFRF9GQVNUIEdQSU9fU1BFRURfRlJFUV9ISUdIDQotI2RlZmluZSBHUElPX1NQRUVEX0hJR0ggR1BJT19TUEVFRF9GUkVRX1ZFUllfSElHSA0KLSNlbmRpZiAvKiBTVE0zMkwwIHx8IFNUTTMyTDQgfHwgU1RNMzJGNCB8fCBTVE0zMkYyIHx8IFNUTTMyRjcgfHwgU1RNMzJHNCB8fCBcDQotICAgICAgICAgIFNUTTMySDcgfHwgU1RNMzJXQiB8fCBTVE0zMlU1Ki8NCi0NCi0jaWYgZGVmaW5lZChTVE0zMkwxKQ0KLSNkZWZpbmUgR1BJT19TUEVFRF9WRVJZX0xPVyBHUElPX1NQRUVEX0ZSRVFfTE9XDQotI2RlZmluZSBHUElPX1NQRUVEX0xPVyBHUElPX1NQRUVEX0ZSRVFfTUVESVVNDQotI2RlZmluZSBHUElPX1NQRUVEX01FRElVTSBHUElPX1NQRUVEX0ZSRVFfSElHSA0KLSNkZWZpbmUgR1BJT19TUEVFRF9ISUdIIEdQSU9fU1BFRURfRlJFUV9WRVJZX0hJR0gNCi0jZW5kaWYgLyogU1RNMzJMMSAqLw0KLQ0KLSNpZiBkZWZpbmVkKFNUTTMyRjApIHx8IGRlZmluZWQoU1RNMzJGMykgfHwgZGVmaW5lZChTVE0zMkYxKQ0KLSNkZWZpbmUgR1BJT19TUEVFRF9MT1cgR1BJT19TUEVFRF9GUkVRX0xPVw0KLSNkZWZpbmUgR1BJT19TUEVFRF9NRURJVU0gR1BJT19TUEVFRF9GUkVRX01FRElVTQ0KLSNkZWZpbmUgR1BJT19TUEVFRF9ISUdIIEdQSU9fU1BFRURfRlJFUV9ISUdIDQotI2VuZGlmIC8qIFNUTTMyRjAgfHwgU1RNMzJGMyB8fCBTVE0zMkYxICovDQotDQotI2RlZmluZSBHUElPX0FGNl9ERlNETSBHUElPX0FGNl9ERlNETTENCi0NCi0jaWYgZGVmaW5lZChTVE0zMlU1KQ0KLSNkZWZpbmUgR1BJT19BRjBfUlRDXzUwSHogR1BJT19BRjBfUlRDXzUwSFoNCi0jZW5kaWYgLyogU1RNMzJVNSAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBIQUxfR1RaQ19BbGlhc2VkX0RlZmluZXMgSEFMIEdUWkMgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yDQotICogbGVnYWN5IHB1cnBvc2UNCi0gKiBAew0KLSAqLw0KLSNpZiBkZWZpbmVkKFNUTTMyVTUpDQotI2RlZmluZSBHVFpDX1BFUklQSF9EQ01JIEdUWkNfUEVSSVBIX0RDTUlfUFNTSQ0KLSNlbmRpZiAvKiBTVE0zMlU1ICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEhBTF9IUlRJTV9BbGlhc2VkX01hY3JvcyBIQUwgSFJUSU0gQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3INCi0gKiBsZWdhY3kgcHVycG9zZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBIUlRJTV9USU1ERUxBWUVEUFJPVEVDVElPTl9ESVNBQkxFRCBcDQotICBIUlRJTV9USU1FUl9BX0JfQ19ERUxBWUVEUFJPVEVDVElPTl9ESVNBQkxFRA0KLSNkZWZpbmUgSFJUSU1fVElNREVMQVlFRFBST1RFQ1RJT05fREVMQVlFRE9VVDFfRUVWNjggXA0KLSAgSFJUSU1fVElNRVJfQV9CX0NfREVMQVlFRFBST1RFQ1RJT05fREVMQVlFRE9VVDFfRUVWNg0KLSNkZWZpbmUgSFJUSU1fVElNREVMQVlFRFBST1RFQ1RJT05fREVMQVlFRE9VVDJfRUVWNjggXA0KLSAgSFJUSU1fVElNRVJfQV9CX0NfREVMQVlFRFBST1RFQ1RJT05fREVMQVlFRE9VVDJfRUVWNg0KLSNkZWZpbmUgSFJUSU1fVElNREVMQVlFRFBST1RFQ1RJT05fREVMQVlFREJPVEhfRUVWNjggXA0KLSAgSFJUSU1fVElNRVJfQV9CX0NfREVMQVlFRFBST1RFQ1RJT05fREVMQVlFREJPVEhfRUVWNg0KLSNkZWZpbmUgSFJUSU1fVElNREVMQVlFRFBST1RFQ1RJT05fQkFMQU5DRURfRUVWNjggXA0KLSAgSFJUSU1fVElNRVJfQV9CX0NfREVMQVlFRFBST1RFQ1RJT05fQkFMQU5DRURfRUVWNg0KLSNkZWZpbmUgSFJUSU1fVElNREVMQVlFRFBST1RFQ1RJT05fREVMQVlFRE9VVDFfREVFVjc5IFwNCi0gIEhSVElNX1RJTUVSX0FfQl9DX0RFTEFZRURQUk9URUNUSU9OX0RFTEFZRURPVVQxX0RFRVY3DQotI2RlZmluZSBIUlRJTV9USU1ERUxBWUVEUFJPVEVDVElPTl9ERUxBWUVET1VUMl9ERUVWNzkgXA0KLSAgSFJUSU1fVElNRVJfQV9CX0NfREVMQVlFRFBST1RFQ1RJT05fREVMQVlFRE9VVDJfREVFVjcNCi0jZGVmaW5lIEhSVElNX1RJTURFTEFZRURQUk9URUNUSU9OX0RFTEFZRURCT1RIX0VFVjc5IFwNCi0gIEhSVElNX1RJTUVSX0FfQl9DX0RFTEFZRURQUk9URUNUSU9OX0RFTEFZRURCT1RIX0VFVjcNCi0jZGVmaW5lIEhSVElNX1RJTURFTEFZRURQUk9URUNUSU9OX0JBTEFOQ0VEX0VFVjc5IFwNCi0gIEhSVElNX1RJTUVSX0FfQl9DX0RFTEFZRURQUk9URUNUSU9OX0JBTEFOQ0VEX0VFVjcNCi0NCi0jZGVmaW5lIF9fSEFMX0hSVElNX1NldENvdW50ZXIgX19IQUxfSFJUSU1fU0VUQ09VTlRFUg0KLSNkZWZpbmUgX19IQUxfSFJUSU1fR2V0Q291bnRlciBfX0hBTF9IUlRJTV9HRVRDT1VOVEVSDQotI2RlZmluZSBfX0hBTF9IUlRJTV9TZXRQZXJpb2QgX19IQUxfSFJUSU1fU0VUUEVSSU9EDQotI2RlZmluZSBfX0hBTF9IUlRJTV9HZXRQZXJpb2QgX19IQUxfSFJUSU1fR0VUUEVSSU9EDQotI2RlZmluZSBfX0hBTF9IUlRJTV9TZXRDbG9ja1ByZXNjYWxlciBfX0hBTF9IUlRJTV9TRVRDTE9DS1BSRVNDQUxFUg0KLSNkZWZpbmUgX19IQUxfSFJUSU1fR2V0Q2xvY2tQcmVzY2FsZXIgX19IQUxfSFJUSU1fR0VUQ0xPQ0tQUkVTQ0FMRVINCi0jZGVmaW5lIF9fSEFMX0hSVElNX1NldENvbXBhcmUgX19IQUxfSFJUSU1fU0VUQ09NUEFSRQ0KLSNkZWZpbmUgX19IQUxfSFJUSU1fR2V0Q29tcGFyZSBfX0hBTF9IUlRJTV9HRVRDT01QQVJFDQotDQotI2lmIGRlZmluZWQoU1RNMzJHNCkNCi0jZGVmaW5lIEhBTF9IUlRJTV9FeHRlcm5hbEV2ZW50Q291bnRlckNvbmZpZyBIQUxfSFJUSU1fRXh0RXZlbnRDb3VudGVyQ29uZmlnDQotI2RlZmluZSBIQUxfSFJUSU1fRXh0ZXJuYWxFdmVudENvdW50ZXJFbmFibGUgSEFMX0hSVElNX0V4dEV2ZW50Q291bnRlckVuYWJsZQ0KLSNkZWZpbmUgSEFMX0hSVElNX0V4dGVybmFsRXZlbnRDb3VudGVyRGlzYWJsZSBIQUxfSFJUSU1fRXh0RXZlbnRDb3VudGVyRGlzYWJsZQ0KLSNkZWZpbmUgSEFMX0hSVElNX0V4dGVybmFsRXZlbnRDb3VudGVyUmVzZXQgSEFMX0hSVElNX0V4dEV2ZW50Q291bnRlclJlc2V0DQotI2RlZmluZSBIUlRJTV9USU1FRVZFTlRfQSBIUlRJTV9FVkVOVENPVU5URVJfQQ0KLSNkZWZpbmUgSFJUSU1fVElNRUVWRU5UX0IgSFJUSU1fRVZFTlRDT1VOVEVSX0INCi0jZGVmaW5lIEhSVElNX1RJTUVFVkVOVFJFU0VUTU9ERV9VTkNPTkRJVElPTkFMIFwNCi0gIEhSVElNX0VWRU5UQ09VTlRFUl9SU1RNT0RFX1VOQ09ORElUSU9OQUwNCi0jZGVmaW5lIEhSVElNX1RJTUVFVkVOVFJFU0VUTU9ERV9DT05ESVRJT05BTCBcDQotICBIUlRJTV9FVkVOVENPVU5URVJfUlNUTU9ERV9DT05ESVRJT05BTA0KLSNlbmRpZiAvKiBTVE0zMkc0ICovDQotDQotI2lmIGRlZmluZWQoU1RNMzJINykNCi0jZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1BRVYxX1RJTUJDTVAxIEhSVElNX09VVFBVVFNFVF9USU1FVl8xDQotI2RlZmluZSBIUlRJTV9PVVRQVVRTRVRfVElNQUVWMl9USU1CQ01QMiBIUlRJTV9PVVRQVVRTRVRfVElNRVZfMg0KLSNkZWZpbmUgSFJUSU1fT1VUUFVUU0VUX1RJTUFFVjNfVElNQ0NNUDIgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzMNCi0jZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1BRVY0X1RJTUNDTVAzIEhSVElNX09VVFBVVFNFVF9USU1FVl80DQotI2RlZmluZSBIUlRJTV9PVVRQVVRTRVRfVElNQUVWNV9USU1EQ01QMSBIUlRJTV9PVVRQVVRTRVRfVElNRVZfNQ0KLSNkZWZpbmUgSFJUSU1fT1VUUFVUU0VUX1RJTUFFVjZfVElNRENNUDIgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzYNCi0jZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1BRVY3X1RJTUVDTVAzIEhSVElNX09VVFBVVFNFVF9USU1FVl83DQotI2RlZmluZSBIUlRJTV9PVVRQVVRTRVRfVElNQUVWOF9USU1FQ01QNCBIUlRJTV9PVVRQVVRTRVRfVElNRVZfOA0KLSNkZWZpbmUgSFJUSU1fT1VUUFVUU0VUX1RJTUFFVjlfVElNRkNNUDQgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzkNCi0jZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1CRVYxX1RJTUFDTVAxIEhSVElNX09VVFBVVFNFVF9USU1FVl8xDQotI2RlZmluZSBIUlRJTV9PVVRQVVRTRVRfVElNQkVWMl9USU1BQ01QMiBIUlRJTV9PVVRQVVRTRVRfVElNRVZfMg0KLSNkZWZpbmUgSFJUSU1fT1VUUFVUU0VUX1RJTUJFVjNfVElNQ0NNUDMgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzMNCi0jZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1CRVY0X1RJTUNDTVA0IEhSVElNX09VVFBVVFNFVF9USU1FVl80DQotI2RlZmluZSBIUlRJTV9PVVRQVVRTRVRfVElNQkVWNV9USU1EQ01QMyBIUlRJTV9PVVRQVVRTRVRfVElNRVZfNQ0KLSNkZWZpbmUgSFJUSU1fT1VUUFVUU0VUX1RJTUJFVjZfVElNRENNUDQgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzYNCi0jZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1CRVY3X1RJTUVDTVAxIEhSVElNX09VVFBVVFNFVF9USU1FVl83DQotI2RlZmluZSBIUlRJTV9PVVRQVVRTRVRfVElNQkVWOF9USU1FQ01QMiBIUlRJTV9PVVRQVVRTRVRfVElNRVZfOA0KLSNkZWZpbmUgSFJUSU1fT1VUUFVUU0VUX1RJTUJFVjlfVElNRkNNUDMgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzkNCi0jZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1DRVYxX1RJTUFDTVAxIEhSVElNX09VVFBVVFNFVF9USU1FVl8xDQotI2RlZmluZSBIUlRJTV9PVVRQVVRTRVRfVElNQ0VWMl9USU1BQ01QMiBIUlRJTV9PVVRQVVRTRVRfVElNRVZfMg0KLSNkZWZpbmUgSFJUSU1fT1VUUFVUU0VUX1RJTUNFVjNfVElNQkNNUDIgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzMNCi0jZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1DRVY0X1RJTUJDTVAzIEhSVElNX09VVFBVVFNFVF9USU1FVl80DQotI2RlZmluZSBIUlRJTV9PVVRQVVRTRVRfVElNQ0VWNV9USU1EQ01QMiBIUlRJTV9PVVRQVVRTRVRfVElNRVZfNQ0KLSNkZWZpbmUgSFJUSU1fT1VUUFVUU0VUX1RJTUNFVjZfVElNRENNUDQgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzYNCi0jZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1DRVY3X1RJTUVDTVAzIEhSVElNX09VVFBVVFNFVF9USU1FVl83DQotI2RlZmluZSBIUlRJTV9PVVRQVVRTRVRfVElNQ0VWOF9USU1FQ01QNCBIUlRJTV9PVVRQVVRTRVRfVElNRVZfOA0KLSNkZWZpbmUgSFJUSU1fT1VUUFVUU0VUX1RJTUNFVjlfVElNRkNNUDIgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzkNCi0jZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1ERVYxX1RJTUFDTVAxIEhSVElNX09VVFBVVFNFVF9USU1FVl8xDQotI2RlZmluZSBIUlRJTV9PVVRQVVRTRVRfVElNREVWMl9USU1BQ01QNCBIUlRJTV9PVVRQVVRTRVRfVElNRVZfMg0KLSNkZWZpbmUgSFJUSU1fT1VUUFVUU0VUX1RJTURFVjNfVElNQkNNUDIgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzMNCi0jZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1ERVY0X1RJTUJDTVA0IEhSVElNX09VVFBVVFNFVF9USU1FVl80DQotI2RlZmluZSBIUlRJTV9PVVRQVVRTRVRfVElNREVWNV9USU1DQ01QNCBIUlRJTV9PVVRQVVRTRVRfVElNRVZfNQ0KLSNkZWZpbmUgSFJUSU1fT1VUUFVUU0VUX1RJTURFVjZfVElNRUNNUDEgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzYNCi0jZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1ERVY3X1RJTUVDTVA0IEhSVElNX09VVFBVVFNFVF9USU1FVl83DQotI2RlZmluZSBIUlRJTV9PVVRQVVRTRVRfVElNREVWOF9USU1GQ01QMSBIUlRJTV9PVVRQVVRTRVRfVElNRVZfOA0KLSNkZWZpbmUgSFJUSU1fT1VUUFVUU0VUX1RJTURFVjlfVElNRkNNUDMgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzkNCi0jZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1FRVYxX1RJTUFDTVA0IEhSVElNX09VVFBVVFNFVF9USU1FVl8xDQotI2RlZmluZSBIUlRJTV9PVVRQVVRTRVRfVElNRUVWMl9USU1CQ01QMyBIUlRJTV9PVVRQVVRTRVRfVElNRVZfMg0KLSNkZWZpbmUgSFJUSU1fT1VUUFVUU0VUX1RJTUVFVjNfVElNQkNNUDQgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzMNCi0jZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1FRVY0X1RJTUNDTVAxIEhSVElNX09VVFBVVFNFVF9USU1FVl80DQotI2RlZmluZSBIUlRJTV9PVVRQVVRTRVRfVElNRUVWNV9USU1EQ01QMiBIUlRJTV9PVVRQVVRTRVRfVElNRVZfNQ0KLSNkZWZpbmUgSFJUSU1fT1VUUFVUU0VUX1RJTUVFVjZfVElNRENNUDEgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzYNCi0jZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1FRVY3X1RJTURDTVAyIEhSVElNX09VVFBVVFNFVF9USU1FVl83DQotI2RlZmluZSBIUlRJTV9PVVRQVVRTRVRfVElNRUVWOF9USU1GQ01QMyBIUlRJTV9PVVRQVVRTRVRfVElNRVZfOA0KLSNkZWZpbmUgSFJUSU1fT1VUUFVUU0VUX1RJTUVFVjlfVElNRkNNUDQgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzkNCi0jZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1GRVYxX1RJTUFDTVAzIEhSVElNX09VVFBVVFNFVF9USU1FVl8xDQotI2RlZmluZSBIUlRJTV9PVVRQVVRTRVRfVElNRkVWMl9USU1CQ01QMSBIUlRJTV9PVVRQVVRTRVRfVElNRVZfMg0KLSNkZWZpbmUgSFJUSU1fT1VUUFVUU0VUX1RJTUZFVjNfVElNQkNNUDQgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzMNCi0jZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1GRVY0X1RJTUNDTVAxIEhSVElNX09VVFBVVFNFVF9USU1FVl80DQotI2RlZmluZSBIUlRJTV9PVVRQVVRTRVRfVElNRkVWNV9USU1DQ01QNCBIUlRJTV9PVVRQVVRTRVRfVElNRVZfNQ0KLSNkZWZpbmUgSFJUSU1fT1VUUFVUU0VUX1RJTUZFVjZfVElNRENNUDMgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzYNCi0jZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1GRVY3X1RJTURDTVA0IEhSVElNX09VVFBVVFNFVF9USU1FVl83DQotI2RlZmluZSBIUlRJTV9PVVRQVVRTRVRfVElNRkVWOF9USU1FQ01QMiBIUlRJTV9PVVRQVVRTRVRfVElNRVZfOA0KLSNkZWZpbmUgSFJUSU1fT1VUUFVUU0VUX1RJTUZFVjlfVElNRUNNUDMgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzkNCi0NCi0jZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUFFVjFfVElNQkNNUDEgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzENCi0jZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUFFVjJfVElNQkNNUDIgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzINCi0jZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUFFVjNfVElNQ0NNUDIgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzMNCi0jZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUFFVjRfVElNQ0NNUDMgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzQNCi0jZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUFFVjVfVElNRENNUDEgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzUNCi0jZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUFFVjZfVElNRENNUDIgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzYNCi0jZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUFFVjdfVElNRUNNUDMgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzcNCi0jZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUFFVjhfVElNRUNNUDQgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzgNCi0jZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUFFVjlfVElNRkNNUDQgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzkNCi0jZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUJFVjFfVElNQUNNUDEgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzENCi0jZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUJFVjJfVElNQUNNUDIgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzINCi0jZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUJFVjNfVElNQ0NNUDMgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzMNCi0jZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUJFVjRfVElNQ0NNUDQgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzQNCi0jZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUJFVjVfVElNRENNUDMgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzUNCi0jZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUJFVjZfVElNRENNUDQgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzYNCi0jZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUJFVjdfVElNRUNNUDEgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzcNCi0jZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUJFVjhfVElNRUNNUDIgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzgNCi0jZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUJFVjlfVElNRkNNUDMgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzkNCi0jZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUNFVjFfVElNQUNNUDEgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzENCi0jZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUNFVjJfVElNQUNNUDIgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzINCi0jZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUNFVjNfVElNQkNNUDIgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzMNCi0jZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUNFVjRfVElNQkNNUDMgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzQNCi0jZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUNFVjVfVElNRENNUDIgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzUNCi0jZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUNFVjZfVElNRENNUDQgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzYNCi0jZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUNFVjdfVElNRUNNUDMgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzcNCi0jZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUNFVjhfVElNRUNNUDQgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzgNCi0jZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUNFVjlfVElNRkNNUDIgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzkNCi0jZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTURFVjFfVElNQUNNUDEgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzENCi0jZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTURFVjJfVElNQUNNUDQgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzINCi0jZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTURFVjNfVElNQkNNUDIgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzMNCi0jZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTURFVjRfVElNQkNNUDQgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzQNCi0jZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTURFVjVfVElNQ0NNUDQgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzUNCi0jZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTURFVjZfVElNRUNNUDEgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzYNCi0jZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTURFVjdfVElNRUNNUDQgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzcNCi0jZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTURFVjhfVElNRkNNUDEgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzgNCi0jZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTURFVjlfVElNRkNNUDMgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzkNCi0jZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUVFVjFfVElNQUNNUDQgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzENCi0jZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUVFVjJfVElNQkNNUDMgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzINCi0jZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUVFVjNfVElNQkNNUDQgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzMNCi0jZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUVFVjRfVElNQ0NNUDEgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzQNCi0jZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUVFVjVfVElNRENNUDIgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzUNCi0jZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUVFVjZfVElNRENNUDEgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzYNCi0jZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUVFVjdfVElNRENNUDIgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzcNCi0jZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUVFVjhfVElNRkNNUDMgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzgNCi0jZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUVFVjlfVElNRkNNUDQgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzkNCi0jZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUZFVjFfVElNQUNNUDMgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzENCi0jZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUZFVjJfVElNQkNNUDEgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzINCi0jZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUZFVjNfVElNQkNNUDQgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzMNCi0jZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUZFVjRfVElNQ0NNUDEgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzQNCi0jZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUZFVjVfVElNQ0NNUDQgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzUNCi0jZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUZFVjZfVElNRENNUDMgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzYNCi0jZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUZFVjdfVElNRENNUDQgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzcNCi0jZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUZFVjhfVElNRUNNUDIgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzgNCi0jZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUZFVjlfVElNRUNNUDMgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzkNCi0jZW5kaWYgLyogU1RNMzJINyAqLw0KLQ0KLSNpZiBkZWZpbmVkKFNUTTMyRjMpDQotLyoqIEBicmllZiBDb25zdGFudHMgZGVmaW5pbmcgYXZhaWxhYmxlIHNvdXJjZXMgYXNzb2NpYXRlZCB0byBleHRlcm5hbCBldmVudHMuDQotICovDQotI2RlZmluZSBIUlRJTV9FVkVOVFNSQ18xICgweDAwMDAwMDAwVSkNCi0jZGVmaW5lIEhSVElNX0VWRU5UU1JDXzIgKEhSVElNX0VFQ1IxX0VFMVNSQ18wKQ0KLSNkZWZpbmUgSFJUSU1fRVZFTlRTUkNfMyAoSFJUSU1fRUVDUjFfRUUxU1JDXzEpDQotI2RlZmluZSBIUlRJTV9FVkVOVFNSQ180IChIUlRJTV9FRUNSMV9FRTFTUkNfMSB8IEhSVElNX0VFQ1IxX0VFMVNSQ18wKQ0KLQ0KLS8qKiBAYnJpZWYgQ29uc3RhbnRzIGRlZmluaW5nIHRoZSBETEwgY2FsaWJyYXRpb24gcGVyaW9kcyAoaW4gbWljcm8gc2Vjb25kcykNCi0gKi8NCi0jZGVmaW5lIEhSVElNX0NBTElCUkFUSU9OUkFURV83MzAwIDB4MDAwMDAwMDBVDQotI2RlZmluZSBIUlRJTV9DQUxJQlJBVElPTlJBVEVfOTEwIChIUlRJTV9ETExDUl9DQUxSVEVfMCkNCi0jZGVmaW5lIEhSVElNX0NBTElCUkFUSU9OUkFURV8xMTQgKEhSVElNX0RMTENSX0NBTFJURV8xKQ0KLSNkZWZpbmUgSFJUSU1fQ0FMSUJSQVRJT05SQVRFXzE0IChIUlRJTV9ETExDUl9DQUxSVEVfMSB8IEhSVElNX0RMTENSX0NBTFJURV8wKQ0KLQ0KLSNlbmRpZiAvKiBTVE0zMkYzICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEhBTF9JMkNfQWxpYXNlZF9EZWZpbmVzIEhBTCBJMkMgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yDQotICogbGVnYWN5IHB1cnBvc2UNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgSTJDX0RVQUxBRERSRVNTX0RJU0FCTEVEIEkyQ19EVUFMQUREUkVTU19ESVNBQkxFDQotI2RlZmluZSBJMkNfRFVBTEFERFJFU1NfRU5BQkxFRCBJMkNfRFVBTEFERFJFU1NfRU5BQkxFDQotI2RlZmluZSBJMkNfR0VORVJBTENBTExfRElTQUJMRUQgSTJDX0dFTkVSQUxDQUxMX0RJU0FCTEUNCi0jZGVmaW5lIEkyQ19HRU5FUkFMQ0FMTF9FTkFCTEVEIEkyQ19HRU5FUkFMQ0FMTF9FTkFCTEUNCi0jZGVmaW5lIEkyQ19OT1NUUkVUQ0hfRElTQUJMRUQgSTJDX05PU1RSRVRDSF9ESVNBQkxFDQotI2RlZmluZSBJMkNfTk9TVFJFVENIX0VOQUJMRUQgSTJDX05PU1RSRVRDSF9FTkFCTEUNCi0jZGVmaW5lIEkyQ19BTkFMT0dGSUxURVJfRU5BQkxFRCBJMkNfQU5BTE9HRklMVEVSX0VOQUJMRQ0KLSNkZWZpbmUgSTJDX0FOQUxPR0ZJTFRFUl9ESVNBQkxFRCBJMkNfQU5BTE9HRklMVEVSX0RJU0FCTEUNCi0jaWYgZGVmaW5lZChTVE0zMkYwKSB8fCBkZWZpbmVkKFNUTTMyRjEpIHx8IGRlZmluZWQoU1RNMzJGMykgfHwgXA0KLSAgICBkZWZpbmVkKFNUTTMyRzApIHx8IGRlZmluZWQoU1RNMzJMNCkgfHwgZGVmaW5lZChTVE0zMkwxKSB8fCBcDQotICAgIGRlZmluZWQoU1RNMzJGNykNCi0jZGVmaW5lIEhBTF9JMkNfU1RBVEVfTUVNX0JVU1lfVFggSEFMX0kyQ19TVEFURV9CVVNZX1RYDQotI2RlZmluZSBIQUxfSTJDX1NUQVRFX01FTV9CVVNZX1JYIEhBTF9JMkNfU1RBVEVfQlVTWV9SWA0KLSNkZWZpbmUgSEFMX0kyQ19TVEFURV9NQVNURVJfQlVTWV9UWCBIQUxfSTJDX1NUQVRFX0JVU1lfVFgNCi0jZGVmaW5lIEhBTF9JMkNfU1RBVEVfTUFTVEVSX0JVU1lfUlggSEFMX0kyQ19TVEFURV9CVVNZX1JYDQotI2RlZmluZSBIQUxfSTJDX1NUQVRFX1NMQVZFX0JVU1lfVFggSEFMX0kyQ19TVEFURV9CVVNZX1RYDQotI2RlZmluZSBIQUxfSTJDX1NUQVRFX1NMQVZFX0JVU1lfUlggSEFMX0kyQ19TVEFURV9CVVNZX1JYDQotI2VuZGlmDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEhBTF9JUkRBX0FsaWFzZWRfRGVmaW5lcyBIQUwgSVJEQSBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3INCi0gKiBsZWdhY3kgcHVycG9zZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBJUkRBX09ORV9CSVRfU0FNUExFX0RJU0FCTEVEIElSREFfT05FX0JJVF9TQU1QTEVfRElTQUJMRQ0KLSNkZWZpbmUgSVJEQV9PTkVfQklUX1NBTVBMRV9FTkFCTEVEIElSREFfT05FX0JJVF9TQU1QTEVfRU5BQkxFDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEhBTF9JV0RHX0FsaWFzZWRfRGVmaW5lcyBIQUwgSVdERyBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3INCi0gKiBsZWdhY3kgcHVycG9zZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBLUl9LRVlfUkVMT0FEIElXREdfS0VZX1JFTE9BRA0KLSNkZWZpbmUgS1JfS0VZX0VOQUJMRSBJV0RHX0tFWV9FTkFCTEUNCi0jZGVmaW5lIEtSX0tFWV9FV0EgSVdER19LRVlfV1JJVEVfQUNDRVNTX0VOQUJMRQ0KLSNkZWZpbmUgS1JfS0VZX0RXQSBJV0RHX0tFWV9XUklURV9BQ0NFU1NfRElTQUJMRQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBIQUxfTFBUSU1fQWxpYXNlZF9EZWZpbmVzIEhBTCBMUFRJTSBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3INCi0gKiBsZWdhY3kgcHVycG9zZQ0KLSAqIEB7DQotICovDQotDQotI2RlZmluZSBMUFRJTV9DTE9DS1NBTVBMRVRJTUVfRElSRUNUVFJBTlNJU1RJT04gXA0KLSAgTFBUSU1fQ0xPQ0tTQU1QTEVUSU1FX0RJUkVDVFRSQU5TSVRJT04NCi0jZGVmaW5lIExQVElNX0NMT0NLU0FNUExFVElNRV8yVFJBTlNJU1RJT05TIExQVElNX0NMT0NLU0FNUExFVElNRV8yVFJBTlNJVElPTlMNCi0jZGVmaW5lIExQVElNX0NMT0NLU0FNUExFVElNRV80VFJBTlNJU1RJT05TIExQVElNX0NMT0NLU0FNUExFVElNRV80VFJBTlNJVElPTlMNCi0jZGVmaW5lIExQVElNX0NMT0NLU0FNUExFVElNRV84VFJBTlNJU1RJT05TIExQVElNX0NMT0NLU0FNUExFVElNRV84VFJBTlNJVElPTlMNCi0NCi0jZGVmaW5lIExQVElNX0NMT0NLUE9MQVJJVFlfUklTSU5HRURHRSBMUFRJTV9DTE9DS1BPTEFSSVRZX1JJU0lORw0KLSNkZWZpbmUgTFBUSU1fQ0xPQ0tQT0xBUklUWV9GQUxMSU5HRURHRSBMUFRJTV9DTE9DS1BPTEFSSVRZX0ZBTExJTkcNCi0jZGVmaW5lIExQVElNX0NMT0NLUE9MQVJJVFlfQk9USEVER0VTIExQVElNX0NMT0NLUE9MQVJJVFlfUklTSU5HX0ZBTExJTkcNCi0NCi0jZGVmaW5lIExQVElNX1RSSUdTQU1QTEVUSU1FX0RJUkVDVFRSQU5TSVNUSU9OIFwNCi0gIExQVElNX1RSSUdTQU1QTEVUSU1FX0RJUkVDVFRSQU5TSVRJT04NCi0jZGVmaW5lIExQVElNX1RSSUdTQU1QTEVUSU1FXzJUUkFOU0lTVElPTlMgTFBUSU1fVFJJR1NBTVBMRVRJTUVfMlRSQU5TSVRJT05TDQotI2RlZmluZSBMUFRJTV9UUklHU0FNUExFVElNRV80VFJBTlNJU1RJT05TIExQVElNX1RSSUdTQU1QTEVUSU1FXzRUUkFOU0lUSU9OUw0KLSNkZWZpbmUgTFBUSU1fVFJJR1NBTVBMRVRJTUVfOFRSQU5TSVNUSU9OUyBMUFRJTV9UUklHU0FNUExFVElNRV84VFJBTlNJVElPTlMNCi0NCi0vKiBUaGUgZm9sbG93aW5nIDMgZGVmaW5pdGlvbiBoYXZlIGFsc28gYmVlbiBwcmVzZW50IGluIGEgdGVtcG9yYXJ5IHZlcnNpb24gb2YNCi0gKiBscHRpbS5oICovDQotLyogVGhleSBuZWVkIHRvIGJlIHJlbmFtZWQgYWxzbyB0byB0aGUgcmlnaHQgbmFtZSwganVzdCBpbiBjYXNlICovDQotI2RlZmluZSBMUFRJTV9UUklHU0FNUExFVElNRV8yVFJBTlNJVElPTiBMUFRJTV9UUklHU0FNUExFVElNRV8yVFJBTlNJVElPTlMNCi0jZGVmaW5lIExQVElNX1RSSUdTQU1QTEVUSU1FXzRUUkFOU0lUSU9OIExQVElNX1RSSUdTQU1QTEVUSU1FXzRUUkFOU0lUSU9OUw0KLSNkZWZpbmUgTFBUSU1fVFJJR1NBTVBMRVRJTUVfOFRSQU5TSVRJT04gTFBUSU1fVFJJR1NBTVBMRVRJTUVfOFRSQU5TSVRJT05TDQotDQotLyoqIEBkZWZncm91cCBIQUxfTFBUSU1fQWxpYXNlZF9EZWZpbmVzIEhBTCBMUFRJTSBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3INCi0gKiBsZWdhY3kgcHVycG9zZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBIQUxfTFBUSU1fUmVhZENvbXBhcmUgSEFMX0xQVElNX1JlYWRDYXB0dXJlZFZhbHVlDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEhBTF9MUFRJTV9BbGlhc2VkX0RlZmluZXMgTEwgTFBUSU0gQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yDQotICogbGVnYWN5IHB1cnBvc2UNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfTFBUSU1fU2V0Q29tcGFyZUNIMSBMTF9MUFRJTV9PQ19TZXRDb21wYXJlQ0gxDQotI2RlZmluZSBMTF9MUFRJTV9TZXRDb21wYXJlQ0gyIExMX0xQVElNX09DX1NldENvbXBhcmVDSDINCi0jZGVmaW5lIExMX0xQVElNX0dldENvbXBhcmVDSDEgTExfTFBUSU1fT0NfR2V0Q29tcGFyZUNIMQ0KLSNkZWZpbmUgTExfTFBUSU1fR2V0Q29tcGFyZUNIMiBMTF9MUFRJTV9PQ19HZXRDb21wYXJlQ0gyDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0jaWYgZGVmaW5lZChTVE0zMlU1KQ0KLSNkZWZpbmUgTFBUSU1fSVNSX0NDMSBMUFRJTV9JU1JfQ0MxSUYNCi0jZGVmaW5lIExQVElNX0lTUl9DQzIgTFBUSU1fSVNSX0NDMklGDQotI2RlZmluZSBMUFRJTV9DSEFOTkVMX0FMTCAweDAwMDAwMDAwVQ0KLSNlbmRpZiAvKiBTVE0zMlU1ICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEhBTF9OQU5EX0FsaWFzZWRfRGVmaW5lcyBIQUwgTkFORCBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3INCi0gKiBsZWdhY3kgcHVycG9zZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBIQUxfTkFORF9SZWFkX1BhZ2UgSEFMX05BTkRfUmVhZF9QYWdlXzhiDQotI2RlZmluZSBIQUxfTkFORF9Xcml0ZV9QYWdlIEhBTF9OQU5EX1dyaXRlX1BhZ2VfOGINCi0jZGVmaW5lIEhBTF9OQU5EX1JlYWRfU3BhcmVBcmVhIEhBTF9OQU5EX1JlYWRfU3BhcmVBcmVhXzhiDQotI2RlZmluZSBIQUxfTkFORF9Xcml0ZV9TcGFyZUFyZWEgSEFMX05BTkRfV3JpdGVfU3BhcmVBcmVhXzhiDQotDQotI2RlZmluZSBOQU5EX0FkZHJlc3NUeXBlZGVmIE5BTkRfQWRkcmVzc1R5cGVEZWYNCi0NCi0jZGVmaW5lIF9fQVJSQVlfQUREUkVTUyBBUlJBWV9BRERSRVNTDQotI2RlZmluZSBfX0FERFJfMXN0X0NZQ0xFIEFERFJfMVNUX0NZQ0xFDQotI2RlZmluZSBfX0FERFJfMm5kX0NZQ0xFIEFERFJfMk5EX0NZQ0xFDQotI2RlZmluZSBfX0FERFJfM3JkX0NZQ0xFIEFERFJfM1JEX0NZQ0xFDQotI2RlZmluZSBfX0FERFJfNHRoX0NZQ0xFIEFERFJfNFRIX0NZQ0xFDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEhBTF9OT1JfQWxpYXNlZF9EZWZpbmVzIEhBTCBOT1IgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yDQotICogbGVnYWN5IHB1cnBvc2UNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTk9SX1N0YXR1c1R5cGVkZWYgSEFMX05PUl9TdGF0dXNUeXBlRGVmDQotI2RlZmluZSBOT1JfU1VDQ0VTUyBIQUxfTk9SX1NUQVRVU19TVUNDRVNTDQotI2RlZmluZSBOT1JfT05HT0lORyBIQUxfTk9SX1NUQVRVU19PTkdPSU5HDQotI2RlZmluZSBOT1JfRVJST1IgSEFMX05PUl9TVEFUVVNfRVJST1INCi0jZGVmaW5lIE5PUl9USU1FT1VUIEhBTF9OT1JfU1RBVFVTX1RJTUVPVVQNCi0NCi0jZGVmaW5lIF9fTk9SX1dSSVRFIE5PUl9XUklURQ0KLSNkZWZpbmUgX19OT1JfQUREUl9TSElGVCBOT1JfQUREUl9TSElGVA0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBIQUxfT1BBTVBfQWxpYXNlZF9EZWZpbmVzIEhBTCBPUEFNUCBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3INCi0gKiBsZWdhY3kgcHVycG9zZQ0KLSAqIEB7DQotICovDQotDQotI2RlZmluZSBPUEFNUF9OT05JTlZFUlRJTkdJTlBVVF9WUDAgT1BBTVBfTk9OSU5WRVJUSU5HSU5QVVRfSU8wDQotI2RlZmluZSBPUEFNUF9OT05JTlZFUlRJTkdJTlBVVF9WUDEgT1BBTVBfTk9OSU5WRVJUSU5HSU5QVVRfSU8xDQotI2RlZmluZSBPUEFNUF9OT05JTlZFUlRJTkdJTlBVVF9WUDIgT1BBTVBfTk9OSU5WRVJUSU5HSU5QVVRfSU8yDQotI2RlZmluZSBPUEFNUF9OT05JTlZFUlRJTkdJTlBVVF9WUDMgT1BBTVBfTk9OSU5WRVJUSU5HSU5QVVRfSU8zDQotDQotI2RlZmluZSBPUEFNUF9TRUNfTk9OSU5WRVJUSU5HSU5QVVRfVlAwIE9QQU1QX1NFQ19OT05JTlZFUlRJTkdJTlBVVF9JTzANCi0jZGVmaW5lIE9QQU1QX1NFQ19OT05JTlZFUlRJTkdJTlBVVF9WUDEgT1BBTVBfU0VDX05PTklOVkVSVElOR0lOUFVUX0lPMQ0KLSNkZWZpbmUgT1BBTVBfU0VDX05PTklOVkVSVElOR0lOUFVUX1ZQMiBPUEFNUF9TRUNfTk9OSU5WRVJUSU5HSU5QVVRfSU8yDQotI2RlZmluZSBPUEFNUF9TRUNfTk9OSU5WRVJUSU5HSU5QVVRfVlAzIE9QQU1QX1NFQ19OT05JTlZFUlRJTkdJTlBVVF9JTzMNCi0NCi0jZGVmaW5lIE9QQU1QX0lOVkVSVElOR0lOUFVUX1ZNMCBPUEFNUF9JTlZFUlRJTkdJTlBVVF9JTzANCi0jZGVmaW5lIE9QQU1QX0lOVkVSVElOR0lOUFVUX1ZNMSBPUEFNUF9JTlZFUlRJTkdJTlBVVF9JTzENCi0NCi0jZGVmaW5lIElPUEFNUF9JTlZFUlRJTkdJTlBVVF9WTTAgT1BBTVBfSU5WRVJUSU5HSU5QVVRfSU8wDQotI2RlZmluZSBJT1BBTVBfSU5WRVJUSU5HSU5QVVRfVk0xIE9QQU1QX0lOVkVSVElOR0lOUFVUX0lPMQ0KLQ0KLSNkZWZpbmUgT1BBTVBfU0VDX0lOVkVSVElOR0lOUFVUX1ZNMCBPUEFNUF9TRUNfSU5WRVJUSU5HSU5QVVRfSU8wDQotI2RlZmluZSBPUEFNUF9TRUNfSU5WRVJUSU5HSU5QVVRfVk0xIE9QQU1QX1NFQ19JTlZFUlRJTkdJTlBVVF9JTzENCi0NCi0jZGVmaW5lIE9QQU1QX0lOVkVSVElOR0lOUFVUX1ZJTk0gT1BBTVBfU0VDX0lOVkVSVElOR0lOUFVUX0lPMQ0KLQ0KLSNkZWZpbmUgT1BBTVBfUEdBQ09OTkVDVF9OTyBPUEFNUF9QR0FfQ09OTkVDVF9JTlZFUlRJTkdJTlBVVF9OTw0KLSNkZWZpbmUgT1BBTVBfUEdBQ09OTkVDVF9WTTAgT1BBTVBfUEdBX0NPTk5FQ1RfSU5WRVJUSU5HSU5QVVRfSU8wDQotI2RlZmluZSBPUEFNUF9QR0FDT05ORUNUX1ZNMSBPUEFNUF9QR0FfQ09OTkVDVF9JTlZFUlRJTkdJTlBVVF9JTzENCi0NCi0jaWYgZGVmaW5lZChTVE0zMkwxKSB8fCBkZWZpbmVkKFNUTTMyTDQpIHx8IGRlZmluZWQoU1RNMzJMNSkgfHwgXA0KLSAgICBkZWZpbmVkKFNUTTMySDcpIHx8IGRlZmluZWQoU1RNMzJHNCkNCi0jZGVmaW5lIEhBTF9PUEFNUF9NU1BfSU5JVF9DQl9JRCBIQUxfT1BBTVBfTVNQSU5JVF9DQl9JRA0KLSNkZWZpbmUgSEFMX09QQU1QX01TUF9ERUlOSVRfQ0JfSUQgSEFMX09QQU1QX01TUERFSU5JVF9DQl9JRA0KLSNlbmRpZg0KLQ0KLSNpZiBkZWZpbmVkKFNUTTMyTDQpIHx8IGRlZmluZWQoU1RNMzJMNSkNCi0jZGVmaW5lIE9QQU1QX1BPV0VSTU9ERV9OT1JNQUwgT1BBTVBfUE9XRVJNT0RFX05PUk1BTFBPV0VSDQotI2VsaWYgZGVmaW5lZChTVE0zMkc0KQ0KLSNkZWZpbmUgT1BBTVBfUE9XRVJNT0RFX05PUk1BTCBPUEFNUF9QT1dFUk1PREVfTk9STUFMU1BFRUQNCi0jZW5kaWYNCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgSEFMX0kyU19BbGlhc2VkX0RlZmluZXMgSEFMIEkyUyBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3INCi0gKiBsZWdhY3kgcHVycG9zZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBJMlNfU1RBTkRBUkRfUEhJTExJUFMgSTJTX1NUQU5EQVJEX1BISUxJUFMNCi0NCi0jaWYgZGVmaW5lZChTVE0zMkg3KQ0KLSNkZWZpbmUgSTJTX0lUX1RYRSBJMlNfSVRfVFhQDQotI2RlZmluZSBJMlNfSVRfUlhORSBJMlNfSVRfUlhQDQotDQotI2RlZmluZSBJMlNfRkxBR19UWEUgSTJTX0ZMQUdfVFhQDQotI2RlZmluZSBJMlNfRkxBR19SWE5FIEkyU19GTEFHX1JYUA0KLSNlbmRpZg0KLQ0KLSNpZiBkZWZpbmVkKFNUTTMyRjcpDQotI2RlZmluZSBJMlNfQ0xPQ0tfU1lTQ0xLIEkyU19DTE9DS19QTEwNCi0jZW5kaWYNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgSEFMX1BDQ0FSRF9BbGlhc2VkX0RlZmluZXMgSEFMIFBDQ0FSRCBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZA0KLSAqIGZvciBsZWdhY3kgcHVycG9zZQ0KLSAqIEB7DQotICovDQotDQotLyogQ29tcGFjdCBGbGFzaC1BVEEgcmVnaXN0ZXJzIGRlc2NyaXB0aW9uICovDQotI2RlZmluZSBDRl9EQVRBIEFUQV9EQVRBDQotI2RlZmluZSBDRl9TRUNUT1JfQ09VTlQgQVRBX1NFQ1RPUl9DT1VOVA0KLSNkZWZpbmUgQ0ZfU0VDVE9SX05VTUJFUiBBVEFfU0VDVE9SX05VTUJFUg0KLSNkZWZpbmUgQ0ZfQ1lMSU5ERVJfTE9XIEFUQV9DWUxJTkRFUl9MT1cNCi0jZGVmaW5lIENGX0NZTElOREVSX0hJR0ggQVRBX0NZTElOREVSX0hJR0gNCi0jZGVmaW5lIENGX0NBUkRfSEVBRCBBVEFfQ0FSRF9IRUFEDQotI2RlZmluZSBDRl9TVEFUVVNfQ01EIEFUQV9TVEFUVVNfQ01EDQotI2RlZmluZSBDRl9TVEFUVVNfQ01EX0FMVEVSTkFURSBBVEFfU1RBVFVTX0NNRF9BTFRFUk5BVEUNCi0jZGVmaW5lIENGX0NPTU1PTl9EQVRBX0FSRUEgQVRBX0NPTU1PTl9EQVRBX0FSRUENCi0NCi0vKiBDb21wYWN0IEZsYXNoLUFUQSBjb21tYW5kcyAqLw0KLSNkZWZpbmUgQ0ZfUkVBRF9TRUNUT1JfQ01EIEFUQV9SRUFEX1NFQ1RPUl9DTUQNCi0jZGVmaW5lIENGX1dSSVRFX1NFQ1RPUl9DTUQgQVRBX1dSSVRFX1NFQ1RPUl9DTUQNCi0jZGVmaW5lIENGX0VSQVNFX1NFQ1RPUl9DTUQgQVRBX0VSQVNFX1NFQ1RPUl9DTUQNCi0jZGVmaW5lIENGX0lERU5USUZZX0NNRCBBVEFfSURFTlRJRllfQ01EDQotDQotI2RlZmluZSBQQ0NBUkRfU3RhdHVzVHlwZWRlZiBIQUxfUENDQVJEX1N0YXR1c1R5cGVEZWYNCi0jZGVmaW5lIFBDQ0FSRF9TVUNDRVNTIEhBTF9QQ0NBUkRfU1RBVFVTX1NVQ0NFU1MNCi0jZGVmaW5lIFBDQ0FSRF9PTkdPSU5HIEhBTF9QQ0NBUkRfU1RBVFVTX09OR09JTkcNCi0jZGVmaW5lIFBDQ0FSRF9FUlJPUiBIQUxfUENDQVJEX1NUQVRVU19FUlJPUg0KLSNkZWZpbmUgUENDQVJEX1RJTUVPVVQgSEFMX1BDQ0FSRF9TVEFUVVNfVElNRU9VVA0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBIQUxfUlRDX0FsaWFzZWRfRGVmaW5lcyBIQUwgUlRDIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvcg0KLSAqIGxlZ2FjeSBwdXJwb3NlDQotICogQHsNCi0gKi8NCi0NCi0jZGVmaW5lIEZPUk1BVF9CSU4gUlRDX0ZPUk1BVF9CSU4NCi0jZGVmaW5lIEZPUk1BVF9CQ0QgUlRDX0ZPUk1BVF9CQ0QNCi0NCi0jZGVmaW5lIFJUQ19BTEFSTVNVQlNFQ09ORE1BU0tfTm9uZSBSVENfQUxBUk1TVUJTRUNPTkRNQVNLX05PTkUNCi0jZGVmaW5lIFJUQ19UQU1QRVJFUkFTRUJBQ0tVUF9ESVNBQkxFRCBSVENfVEFNUEVSX0VSQVNFX0JBQ0tVUF9ESVNBQkxFDQotI2RlZmluZSBSVENfVEFNUEVSTUFTS19GTEFHX0RJU0FCTEVEIFJUQ19UQU1QRVJNQVNLX0ZMQUdfRElTQUJMRQ0KLSNkZWZpbmUgUlRDX1RBTVBFUk1BU0tfRkxBR19FTkFCTEVEIFJUQ19UQU1QRVJNQVNLX0ZMQUdfRU5BQkxFDQotDQotI2RlZmluZSBSVENfTUFTS1RBTVBFUkZMQUdfRElTQUJMRUQgUlRDX1RBTVBFUk1BU0tfRkxBR19ESVNBQkxFDQotI2RlZmluZSBSVENfTUFTS1RBTVBFUkZMQUdfRU5BQkxFRCBSVENfVEFNUEVSTUFTS19GTEFHX0VOQUJMRQ0KLSNkZWZpbmUgUlRDX1RBTVBFUkVSQVNFQkFDS1VQX0VOQUJMRUQgUlRDX1RBTVBFUl9FUkFTRV9CQUNLVVBfRU5BQkxFDQotI2RlZmluZSBSVENfVEFNUEVSMV8yX0lOVEVSUlVQVCBSVENfQUxMX1RBTVBFUl9JTlRFUlJVUFQNCi0jZGVmaW5lIFJUQ19UQU1QRVIxXzJfM19JTlRFUlJVUFQgUlRDX0FMTF9UQU1QRVJfSU5URVJSVVBUDQotDQotI2RlZmluZSBSVENfVElNRVNUQU1QUElOX1BDMTMgUlRDX1RJTUVTVEFNUFBJTl9ERUZBVUxUDQotI2RlZmluZSBSVENfVElNRVNUQU1QUElOX1BBMCBSVENfVElNRVNUQU1QUElOX1BPUzENCi0jZGVmaW5lIFJUQ19USU1FU1RBTVBQSU5fUEk4IFJUQ19USU1FU1RBTVBQSU5fUE9TMQ0KLSNkZWZpbmUgUlRDX1RJTUVTVEFNUFBJTl9QQzEgUlRDX1RJTUVTVEFNUFBJTl9QT1MyDQotDQotI2RlZmluZSBSVENfT1VUUFVUX1JFTUFQX1BDMTMgUlRDX09VVFBVVF9SRU1BUF9OT05FDQotI2RlZmluZSBSVENfT1VUUFVUX1JFTUFQX1BCMTQgUlRDX09VVFBVVF9SRU1BUF9QT1MxDQotI2RlZmluZSBSVENfT1VUUFVUX1JFTUFQX1BCMiBSVENfT1VUUFVUX1JFTUFQX1BPUzENCi0NCi0jZGVmaW5lIFJUQ19UQU1QRVJQSU5fUEMxMyBSVENfVEFNUEVSUElOX0RFRkFVTFQNCi0jZGVmaW5lIFJUQ19UQU1QRVJQSU5fUEEwIFJUQ19UQU1QRVJQSU5fUE9TMQ0KLSNkZWZpbmUgUlRDX1RBTVBFUlBJTl9QSTggUlRDX1RBTVBFUlBJTl9QT1MxDQotDQotI2lmIGRlZmluZWQoU1RNMzJINykNCi0jZGVmaW5lIFJUQ19UQU1QQ1JfVEFNUFhFIFJUQ19UQU1QRVJfWA0KLSNkZWZpbmUgUlRDX1RBTVBDUl9UQU1QWElFIFJUQ19UQU1QRVJfWF9JTlRFUlJVUFQNCi0NCi0jZGVmaW5lIFJUQ19UQU1QRVIxX0lOVEVSUlVQVCBSVENfSVRfVEFNUDENCi0jZGVmaW5lIFJUQ19UQU1QRVIyX0lOVEVSUlVQVCBSVENfSVRfVEFNUDINCi0jZGVmaW5lIFJUQ19UQU1QRVIzX0lOVEVSUlVQVCBSVENfSVRfVEFNUDMNCi0jZGVmaW5lIFJUQ19BTExfVEFNUEVSX0lOVEVSUlVQVCBSVENfSVRfVEFNUEFMTA0KLSNlbmRpZiAvKiBTVE0zMkg3ICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEhBTF9TTUFSVENBUkRfQWxpYXNlZF9EZWZpbmVzIEhBTCBTTUFSVENBUkQgQWxpYXNlZCBEZWZpbmVzDQotICogbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgU01BUlRDQVJEX05BQ0tfRU5BQkxFRCBTTUFSVENBUkRfTkFDS19FTkFCTEUNCi0jZGVmaW5lIFNNQVJUQ0FSRF9OQUNLX0RJU0FCTEVEIFNNQVJUQ0FSRF9OQUNLX0RJU0FCTEUNCi0NCi0jZGVmaW5lIFNNQVJUQ0FSRF9PTkVCSVRfU0FNUExJTkdfRElTQUJMRUQgU01BUlRDQVJEX09ORV9CSVRfU0FNUExFX0RJU0FCTEUNCi0jZGVmaW5lIFNNQVJUQ0FSRF9PTkVCSVRfU0FNUExJTkdfRU5BQkxFRCBTTUFSVENBUkRfT05FX0JJVF9TQU1QTEVfRU5BQkxFDQotI2RlZmluZSBTTUFSVENBUkRfT05FQklUX1NBTVBMSU5HX0RJU0FCTEUgU01BUlRDQVJEX09ORV9CSVRfU0FNUExFX0RJU0FCTEUNCi0jZGVmaW5lIFNNQVJUQ0FSRF9PTkVCSVRfU0FNUExJTkdfRU5BQkxFIFNNQVJUQ0FSRF9PTkVfQklUX1NBTVBMRV9FTkFCTEUNCi0NCi0jZGVmaW5lIFNNQVJUQ0FSRF9USU1FT1VUX0RJU0FCTEVEIFNNQVJUQ0FSRF9USU1FT1VUX0RJU0FCTEUNCi0jZGVmaW5lIFNNQVJUQ0FSRF9USU1FT1VUX0VOQUJMRUQgU01BUlRDQVJEX1RJTUVPVVRfRU5BQkxFDQotDQotI2RlZmluZSBTTUFSVENBUkRfTEFTVEJJVF9ESVNBQkxFRCBTTUFSVENBUkRfTEFTVEJJVF9ESVNBQkxFDQotI2RlZmluZSBTTUFSVENBUkRfTEFTVEJJVF9FTkFCTEVEIFNNQVJUQ0FSRF9MQVNUQklUX0VOQUJMRQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBIQUxfU01CVVNfQWxpYXNlZF9EZWZpbmVzIEhBTCBTTUJVUyBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3INCi0gKiBsZWdhY3kgcHVycG9zZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBTTUJVU19EVUFMQUREUkVTU19ESVNBQkxFRCBTTUJVU19EVUFMQUREUkVTU19ESVNBQkxFDQotI2RlZmluZSBTTUJVU19EVUFMQUREUkVTU19FTkFCTEVEIFNNQlVTX0RVQUxBRERSRVNTX0VOQUJMRQ0KLSNkZWZpbmUgU01CVVNfR0VORVJBTENBTExfRElTQUJMRUQgU01CVVNfR0VORVJBTENBTExfRElTQUJMRQ0KLSNkZWZpbmUgU01CVVNfR0VORVJBTENBTExfRU5BQkxFRCBTTUJVU19HRU5FUkFMQ0FMTF9FTkFCTEUNCi0jZGVmaW5lIFNNQlVTX05PU1RSRVRDSF9ESVNBQkxFRCBTTUJVU19OT1NUUkVUQ0hfRElTQUJMRQ0KLSNkZWZpbmUgU01CVVNfTk9TVFJFVENIX0VOQUJMRUQgU01CVVNfTk9TVFJFVENIX0VOQUJMRQ0KLSNkZWZpbmUgU01CVVNfQU5BTE9HRklMVEVSX0VOQUJMRUQgU01CVVNfQU5BTE9HRklMVEVSX0VOQUJMRQ0KLSNkZWZpbmUgU01CVVNfQU5BTE9HRklMVEVSX0RJU0FCTEVEIFNNQlVTX0FOQUxPR0ZJTFRFUl9ESVNBQkxFDQotI2RlZmluZSBTTUJVU19QRUNfRElTQUJMRUQgU01CVVNfUEVDX0RJU0FCTEUNCi0jZGVmaW5lIFNNQlVTX1BFQ19FTkFCTEVEIFNNQlVTX1BFQ19FTkFCTEUNCi0jZGVmaW5lIEhBTF9TTUJVU19TVEFURV9TTEFWRV9MSVNURU4gSEFMX1NNQlVTX1NUQVRFX0xJU1RFTg0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBIQUxfU1BJX0FsaWFzZWRfRGVmaW5lcyBIQUwgU1BJIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvcg0KLSAqIGxlZ2FjeSBwdXJwb3NlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFNQSV9USU1PREVfRElTQUJMRUQgU1BJX1RJTU9ERV9ESVNBQkxFDQotI2RlZmluZSBTUElfVElNT0RFX0VOQUJMRUQgU1BJX1RJTU9ERV9FTkFCTEUNCi0NCi0jZGVmaW5lIFNQSV9DUkNDQUxDVUxBVElPTl9ESVNBQkxFRCBTUElfQ1JDQ0FMQ1VMQVRJT05fRElTQUJMRQ0KLSNkZWZpbmUgU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRUQgU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRQ0KLQ0KLSNkZWZpbmUgU1BJX05TU19QVUxTRV9ESVNBQkxFRCBTUElfTlNTX1BVTFNFX0RJU0FCTEUNCi0jZGVmaW5lIFNQSV9OU1NfUFVMU0VfRU5BQkxFRCBTUElfTlNTX1BVTFNFX0VOQUJMRQ0KLQ0KLSNpZiBkZWZpbmVkKFNUTTMySDcpDQotDQotI2RlZmluZSBTUElfRkxBR19UWEUgU1BJX0ZMQUdfVFhQDQotI2RlZmluZSBTUElfRkxBR19SWE5FIFNQSV9GTEFHX1JYUA0KLQ0KLSNkZWZpbmUgU1BJX0lUX1RYRSBTUElfSVRfVFhQDQotI2RlZmluZSBTUElfSVRfUlhORSBTUElfSVRfUlhQDQotDQotI2RlZmluZSBTUElfRlJMVkxfRU1QVFkgU1BJX1JYX0ZJRk9fMFBBQ0tFVA0KLSNkZWZpbmUgU1BJX0ZSTFZMX1FVQVJURVJfRlVMTCBTUElfUlhfRklGT18xUEFDS0VUDQotI2RlZmluZSBTUElfRlJMVkxfSEFMRl9GVUxMIFNQSV9SWF9GSUZPXzJQQUNLRVQNCi0jZGVmaW5lIFNQSV9GUkxWTF9GVUxMIFNQSV9SWF9GSUZPXzNQQUNLRVQNCi0NCi0jZW5kaWYgLyogU1RNMzJINyAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBIQUxfVElNX0FsaWFzZWRfRGVmaW5lcyBIQUwgVElNIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvcg0KLSAqIGxlZ2FjeSBwdXJwb3NlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIENDRVJfQ0N4RV9NQVNLIFRJTV9DQ0VSX0NDeEVfTUFTSw0KLSNkZWZpbmUgQ0NFUl9DQ3hORV9NQVNLIFRJTV9DQ0VSX0NDeE5FX01BU0sNCi0NCi0jZGVmaW5lIFRJTV9ETUFCYXNlX0NSMSBUSU1fRE1BQkFTRV9DUjENCi0jZGVmaW5lIFRJTV9ETUFCYXNlX0NSMiBUSU1fRE1BQkFTRV9DUjINCi0jZGVmaW5lIFRJTV9ETUFCYXNlX1NNQ1IgVElNX0RNQUJBU0VfU01DUg0KLSNkZWZpbmUgVElNX0RNQUJhc2VfRElFUiBUSU1fRE1BQkFTRV9ESUVSDQotI2RlZmluZSBUSU1fRE1BQmFzZV9TUiBUSU1fRE1BQkFTRV9TUg0KLSNkZWZpbmUgVElNX0RNQUJhc2VfRUdSIFRJTV9ETUFCQVNFX0VHUg0KLSNkZWZpbmUgVElNX0RNQUJhc2VfQ0NNUjEgVElNX0RNQUJBU0VfQ0NNUjENCi0jZGVmaW5lIFRJTV9ETUFCYXNlX0NDTVIyIFRJTV9ETUFCQVNFX0NDTVIyDQotI2RlZmluZSBUSU1fRE1BQmFzZV9DQ0VSIFRJTV9ETUFCQVNFX0NDRVINCi0jZGVmaW5lIFRJTV9ETUFCYXNlX0NOVCBUSU1fRE1BQkFTRV9DTlQNCi0jZGVmaW5lIFRJTV9ETUFCYXNlX1BTQyBUSU1fRE1BQkFTRV9QU0MNCi0jZGVmaW5lIFRJTV9ETUFCYXNlX0FSUiBUSU1fRE1BQkFTRV9BUlINCi0jZGVmaW5lIFRJTV9ETUFCYXNlX1JDUiBUSU1fRE1BQkFTRV9SQ1INCi0jZGVmaW5lIFRJTV9ETUFCYXNlX0NDUjEgVElNX0RNQUJBU0VfQ0NSMQ0KLSNkZWZpbmUgVElNX0RNQUJhc2VfQ0NSMiBUSU1fRE1BQkFTRV9DQ1IyDQotI2RlZmluZSBUSU1fRE1BQmFzZV9DQ1IzIFRJTV9ETUFCQVNFX0NDUjMNCi0jZGVmaW5lIFRJTV9ETUFCYXNlX0NDUjQgVElNX0RNQUJBU0VfQ0NSNA0KLSNkZWZpbmUgVElNX0RNQUJhc2VfQkRUUiBUSU1fRE1BQkFTRV9CRFRSDQotI2RlZmluZSBUSU1fRE1BQmFzZV9EQ1IgVElNX0RNQUJBU0VfRENSDQotI2RlZmluZSBUSU1fRE1BQmFzZV9ETUFSIFRJTV9ETUFCQVNFX0RNQVINCi0jZGVmaW5lIFRJTV9ETUFCYXNlX09SMSBUSU1fRE1BQkFTRV9PUjENCi0jZGVmaW5lIFRJTV9ETUFCYXNlX0NDTVIzIFRJTV9ETUFCQVNFX0NDTVIzDQotI2RlZmluZSBUSU1fRE1BQmFzZV9DQ1I1IFRJTV9ETUFCQVNFX0NDUjUNCi0jZGVmaW5lIFRJTV9ETUFCYXNlX0NDUjYgVElNX0RNQUJBU0VfQ0NSNg0KLSNkZWZpbmUgVElNX0RNQUJhc2VfT1IyIFRJTV9ETUFCQVNFX09SMg0KLSNkZWZpbmUgVElNX0RNQUJhc2VfT1IzIFRJTV9ETUFCQVNFX09SMw0KLSNkZWZpbmUgVElNX0RNQUJhc2VfT1IgVElNX0RNQUJBU0VfT1INCi0NCi0jZGVmaW5lIFRJTV9FdmVudFNvdXJjZV9VcGRhdGUgVElNX0VWRU5UU09VUkNFX1VQREFURQ0KLSNkZWZpbmUgVElNX0V2ZW50U291cmNlX0NDMSBUSU1fRVZFTlRTT1VSQ0VfQ0MxDQotI2RlZmluZSBUSU1fRXZlbnRTb3VyY2VfQ0MyIFRJTV9FVkVOVFNPVVJDRV9DQzINCi0jZGVmaW5lIFRJTV9FdmVudFNvdXJjZV9DQzMgVElNX0VWRU5UU09VUkNFX0NDMw0KLSNkZWZpbmUgVElNX0V2ZW50U291cmNlX0NDNCBUSU1fRVZFTlRTT1VSQ0VfQ0M0DQotI2RlZmluZSBUSU1fRXZlbnRTb3VyY2VfQ09NIFRJTV9FVkVOVFNPVVJDRV9DT00NCi0jZGVmaW5lIFRJTV9FdmVudFNvdXJjZV9UcmlnZ2VyIFRJTV9FVkVOVFNPVVJDRV9UUklHR0VSDQotI2RlZmluZSBUSU1fRXZlbnRTb3VyY2VfQnJlYWsgVElNX0VWRU5UU09VUkNFX0JSRUFLDQotI2RlZmluZSBUSU1fRXZlbnRTb3VyY2VfQnJlYWsyIFRJTV9FVkVOVFNPVVJDRV9CUkVBSzINCi0NCi0jZGVmaW5lIFRJTV9ETUFCdXJzdExlbmd0aF8xVHJhbnNmZXIgVElNX0RNQUJVUlNUTEVOR1RIXzFUUkFOU0ZFUg0KLSNkZWZpbmUgVElNX0RNQUJ1cnN0TGVuZ3RoXzJUcmFuc2ZlcnMgVElNX0RNQUJVUlNUTEVOR1RIXzJUUkFOU0ZFUlMNCi0jZGVmaW5lIFRJTV9ETUFCdXJzdExlbmd0aF8zVHJhbnNmZXJzIFRJTV9ETUFCVVJTVExFTkdUSF8zVFJBTlNGRVJTDQotI2RlZmluZSBUSU1fRE1BQnVyc3RMZW5ndGhfNFRyYW5zZmVycyBUSU1fRE1BQlVSU1RMRU5HVEhfNFRSQU5TRkVSUw0KLSNkZWZpbmUgVElNX0RNQUJ1cnN0TGVuZ3RoXzVUcmFuc2ZlcnMgVElNX0RNQUJVUlNUTEVOR1RIXzVUUkFOU0ZFUlMNCi0jZGVmaW5lIFRJTV9ETUFCdXJzdExlbmd0aF82VHJhbnNmZXJzIFRJTV9ETUFCVVJTVExFTkdUSF82VFJBTlNGRVJTDQotI2RlZmluZSBUSU1fRE1BQnVyc3RMZW5ndGhfN1RyYW5zZmVycyBUSU1fRE1BQlVSU1RMRU5HVEhfN1RSQU5TRkVSUw0KLSNkZWZpbmUgVElNX0RNQUJ1cnN0TGVuZ3RoXzhUcmFuc2ZlcnMgVElNX0RNQUJVUlNUTEVOR1RIXzhUUkFOU0ZFUlMNCi0jZGVmaW5lIFRJTV9ETUFCdXJzdExlbmd0aF85VHJhbnNmZXJzIFRJTV9ETUFCVVJTVExFTkdUSF85VFJBTlNGRVJTDQotI2RlZmluZSBUSU1fRE1BQnVyc3RMZW5ndGhfMTBUcmFuc2ZlcnMgVElNX0RNQUJVUlNUTEVOR1RIXzEwVFJBTlNGRVJTDQotI2RlZmluZSBUSU1fRE1BQnVyc3RMZW5ndGhfMTFUcmFuc2ZlcnMgVElNX0RNQUJVUlNUTEVOR1RIXzExVFJBTlNGRVJTDQotI2RlZmluZSBUSU1fRE1BQnVyc3RMZW5ndGhfMTJUcmFuc2ZlcnMgVElNX0RNQUJVUlNUTEVOR1RIXzEyVFJBTlNGRVJTDQotI2RlZmluZSBUSU1fRE1BQnVyc3RMZW5ndGhfMTNUcmFuc2ZlcnMgVElNX0RNQUJVUlNUTEVOR1RIXzEzVFJBTlNGRVJTDQotI2RlZmluZSBUSU1fRE1BQnVyc3RMZW5ndGhfMTRUcmFuc2ZlcnMgVElNX0RNQUJVUlNUTEVOR1RIXzE0VFJBTlNGRVJTDQotI2RlZmluZSBUSU1fRE1BQnVyc3RMZW5ndGhfMTVUcmFuc2ZlcnMgVElNX0RNQUJVUlNUTEVOR1RIXzE1VFJBTlNGRVJTDQotI2RlZmluZSBUSU1fRE1BQnVyc3RMZW5ndGhfMTZUcmFuc2ZlcnMgVElNX0RNQUJVUlNUTEVOR1RIXzE2VFJBTlNGRVJTDQotI2RlZmluZSBUSU1fRE1BQnVyc3RMZW5ndGhfMTdUcmFuc2ZlcnMgVElNX0RNQUJVUlNUTEVOR1RIXzE3VFJBTlNGRVJTDQotI2RlZmluZSBUSU1fRE1BQnVyc3RMZW5ndGhfMThUcmFuc2ZlcnMgVElNX0RNQUJVUlNUTEVOR1RIXzE4VFJBTlNGRVJTDQotDQotI2lmIGRlZmluZWQoU1RNMzJMMCkNCi0jZGVmaW5lIFRJTTIyX1RJMV9HUElPMSBUSU0yMl9USTFfR1BJTw0KLSNkZWZpbmUgVElNMjJfVEkxX0dQSU8yIFRJTTIyX1RJMV9HUElPDQotI2VuZGlmDQotDQotI2lmIGRlZmluZWQoU1RNMzJGMykNCi0jZGVmaW5lIElTX1RJTV9IQUxMX0lOVEVSRkFDRV9JTlNUQU5DRSBJU19USU1fSEFMTF9TRU5TT1JfSU5URVJGQUNFX0lOU1RBTkNFDQotI2VuZGlmDQotDQotI2lmIGRlZmluZWQoU1RNMzJINykNCi0jZGVmaW5lIFRJTV9USU0xX0VUUl9DT01QMV9PVVQgVElNX1RJTTFfRVRSX0NPTVAxDQotI2RlZmluZSBUSU1fVElNMV9FVFJfQ09NUDJfT1VUIFRJTV9USU0xX0VUUl9DT01QMg0KLSNkZWZpbmUgVElNX1RJTThfRVRSX0NPTVAxX09VVCBUSU1fVElNOF9FVFJfQ09NUDENCi0jZGVmaW5lIFRJTV9USU04X0VUUl9DT01QMl9PVVQgVElNX1RJTThfRVRSX0NPTVAyDQotI2RlZmluZSBUSU1fVElNMl9FVFJfQ09NUDFfT1VUIFRJTV9USU0yX0VUUl9DT01QMQ0KLSNkZWZpbmUgVElNX1RJTTJfRVRSX0NPTVAyX09VVCBUSU1fVElNMl9FVFJfQ09NUDINCi0jZGVmaW5lIFRJTV9USU0zX0VUUl9DT01QMV9PVVQgVElNX1RJTTNfRVRSX0NPTVAxDQotI2RlZmluZSBUSU1fVElNMV9USTFfQ09NUDFfT1VUIFRJTV9USU0xX1RJMV9DT01QMQ0KLSNkZWZpbmUgVElNX1RJTThfVEkxX0NPTVAyX09VVCBUSU1fVElNOF9USTFfQ09NUDINCi0jZGVmaW5lIFRJTV9USU0yX1RJNF9DT01QMV9PVVQgVElNX1RJTTJfVEk0X0NPTVAxDQotI2RlZmluZSBUSU1fVElNMl9USTRfQ09NUDJfT1VUIFRJTV9USU0yX1RJNF9DT01QMg0KLSNkZWZpbmUgVElNX1RJTTJfVEk0X0NPTVAxQ09NUDJfT1VUIFRJTV9USU0yX1RJNF9DT01QMV9DT01QMg0KLSNkZWZpbmUgVElNX1RJTTNfVEkxX0NPTVAxX09VVCBUSU1fVElNM19USTFfQ09NUDENCi0jZGVmaW5lIFRJTV9USU0zX1RJMV9DT01QMl9PVVQgVElNX1RJTTNfVEkxX0NPTVAyDQotI2RlZmluZSBUSU1fVElNM19USTFfQ09NUDFDT01QMl9PVVQgVElNX1RJTTNfVEkxX0NPTVAxX0NPTVAyDQotI2VuZGlmDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEhBTF9UU0NfQWxpYXNlZF9EZWZpbmVzIEhBTCBUU0MgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yDQotICogbGVnYWN5IHB1cnBvc2UNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgVFNDX1NZTkNfUE9MX0ZBTEwgVFNDX1NZTkNfUE9MQVJJVFlfRkFMTElORw0KLSNkZWZpbmUgVFNDX1NZTkNfUE9MX1JJU0VfSElHSCBUU0NfU1lOQ19QT0xBUklUWV9SSVNJTkcNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgSEFMX1VBUlRfQWxpYXNlZF9EZWZpbmVzIEhBTCBVQVJUIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvcg0KLSAqIGxlZ2FjeSBwdXJwb3NlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFVBUlRfT05FQklUX1NBTVBMSU5HX0RJU0FCTEVEIFVBUlRfT05FX0JJVF9TQU1QTEVfRElTQUJMRQ0KLSNkZWZpbmUgVUFSVF9PTkVCSVRfU0FNUExJTkdfRU5BQkxFRCBVQVJUX09ORV9CSVRfU0FNUExFX0VOQUJMRQ0KLSNkZWZpbmUgVUFSVF9PTkVfQklUX1NBTVBMRV9ESVNBQkxFRCBVQVJUX09ORV9CSVRfU0FNUExFX0RJU0FCTEUNCi0jZGVmaW5lIFVBUlRfT05FX0JJVF9TQU1QTEVfRU5BQkxFRCBVQVJUX09ORV9CSVRfU0FNUExFX0VOQUJMRQ0KLQ0KLSNkZWZpbmUgX19IQUxfVUFSVF9PTkVCSVRfRU5BQkxFIF9fSEFMX1VBUlRfT05FX0JJVF9TQU1QTEVfRU5BQkxFDQotI2RlZmluZSBfX0hBTF9VQVJUX09ORUJJVF9ESVNBQkxFIF9fSEFMX1VBUlRfT05FX0JJVF9TQU1QTEVfRElTQUJMRQ0KLQ0KLSNkZWZpbmUgX19ESVZfU0FNUExJTkcxNiBVQVJUX0RJVl9TQU1QTElORzE2DQotI2RlZmluZSBfX0RJVk1BTlRfU0FNUExJTkcxNiBVQVJUX0RJVk1BTlRfU0FNUExJTkcxNg0KLSNkZWZpbmUgX19ESVZGUkFRX1NBTVBMSU5HMTYgVUFSVF9ESVZGUkFRX1NBTVBMSU5HMTYNCi0jZGVmaW5lIF9fVUFSVF9CUlJfU0FNUExJTkcxNiBVQVJUX0JSUl9TQU1QTElORzE2DQotDQotI2RlZmluZSBfX0RJVl9TQU1QTElORzggVUFSVF9ESVZfU0FNUExJTkc4DQotI2RlZmluZSBfX0RJVk1BTlRfU0FNUExJTkc4IFVBUlRfRElWTUFOVF9TQU1QTElORzgNCi0jZGVmaW5lIF9fRElWRlJBUV9TQU1QTElORzggVUFSVF9ESVZGUkFRX1NBTVBMSU5HOA0KLSNkZWZpbmUgX19VQVJUX0JSUl9TQU1QTElORzggVUFSVF9CUlJfU0FNUExJTkc4DQotDQotI2RlZmluZSBfX0RJVl9MUFVBUlQgVUFSVF9ESVZfTFBVQVJUDQotDQotI2RlZmluZSBVQVJUX1dBS0VVUE1FVEhPREVfSURMRUxJTkUgVUFSVF9XQUtFVVBNRVRIT0RfSURMRUxJTkUNCi0jZGVmaW5lIFVBUlRfV0FLRVVQTUVUSE9ERV9BRERSRVNTTUFSSyBVQVJUX1dBS0VVUE1FVEhPRF9BRERSRVNTTUFSSw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBIQUxfVVNBUlRfQWxpYXNlZF9EZWZpbmVzIEhBTCBVU0FSVCBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3INCi0gKiBsZWdhY3kgcHVycG9zZQ0KLSAqIEB7DQotICovDQotDQotI2RlZmluZSBVU0FSVF9DTE9DS19ESVNBQkxFRCBVU0FSVF9DTE9DS19ESVNBQkxFDQotI2RlZmluZSBVU0FSVF9DTE9DS19FTkFCTEVEIFVTQVJUX0NMT0NLX0VOQUJMRQ0KLQ0KLSNkZWZpbmUgVVNBUlROQUNLX0VOQUJMRUQgVVNBUlRfTkFDS19FTkFCTEUNCi0jZGVmaW5lIFVTQVJUTkFDS19ESVNBQkxFRCBVU0FSVF9OQUNLX0RJU0FCTEUNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgSEFMX1dXREdfQWxpYXNlZF9EZWZpbmVzIEhBTCBXV0RHIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvcg0KLSAqIGxlZ2FjeSBwdXJwb3NlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIENGUl9CQVNFIFdXREdfQ0ZSX0JBU0UNCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgSEFMX0NBTl9BbGlhc2VkX0RlZmluZXMgSEFMIENBTiBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3INCi0gKiBsZWdhY3kgcHVycG9zZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBDQU5fRmlsdGVyRklGTzAgQ0FOX0ZJTFRFUl9GSUZPMA0KLSNkZWZpbmUgQ0FOX0ZpbHRlckZJRk8xIENBTl9GSUxURVJfRklGTzENCi0jZGVmaW5lIENBTl9JVF9SUUNQMCBDQU5fSVRfVE1FDQotI2RlZmluZSBDQU5fSVRfUlFDUDEgQ0FOX0lUX1RNRQ0KLSNkZWZpbmUgQ0FOX0lUX1JRQ1AyIENBTl9JVF9UTUUNCi0jZGVmaW5lIElOQUtfVElNRU9VVCBDQU5fVElNRU9VVF9WQUxVRQ0KLSNkZWZpbmUgU0xBS19USU1FT1VUIENBTl9USU1FT1VUX1ZBTFVFDQotI2RlZmluZSBDQU5fVFhTVEFUVVNfRkFJTEVEICgodWludDhfdCkweDAwVSkNCi0jZGVmaW5lIENBTl9UWFNUQVRVU19PSyAoKHVpbnQ4X3QpMHgwMVUpDQotI2RlZmluZSBDQU5fVFhTVEFUVVNfUEVORElORyAoKHVpbnQ4X3QpMHgwMlUpDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEhBTF9FVEhfQWxpYXNlZF9EZWZpbmVzIEhBTCBFVEggQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yDQotICogbGVnYWN5IHB1cnBvc2UNCi0gKiBAew0KLSAqLw0KLQ0KLSNkZWZpbmUgVkxBTl9UQUcgRVRIX1ZMQU5fVEFHDQotI2RlZmluZSBNSU5fRVRIX1BBWUxPQUQgRVRIX01JTl9FVEhfUEFZTE9BRA0KLSNkZWZpbmUgTUFYX0VUSF9QQVlMT0FEIEVUSF9NQVhfRVRIX1BBWUxPQUQNCi0jZGVmaW5lIEpVTUJPX0ZSQU1FX1BBWUxPQUQgRVRIX0pVTUJPX0ZSQU1FX1BBWUxPQUQNCi0jZGVmaW5lIE1BQ01JSUFSX0NSX01BU0sgRVRIX01BQ01JSUFSX0NSX01BU0sNCi0jZGVmaW5lIE1BQ0NSX0NMRUFSX01BU0sgRVRIX01BQ0NSX0NMRUFSX01BU0sNCi0jZGVmaW5lIE1BQ0ZDUl9DTEVBUl9NQVNLIEVUSF9NQUNGQ1JfQ0xFQVJfTUFTSw0KLSNkZWZpbmUgRE1BT01SX0NMRUFSX01BU0sgRVRIX0RNQU9NUl9DTEVBUl9NQVNLDQotDQotI2RlZmluZSBFVEhfTU1DQ1IgMHgwMDAwMDEwMFUNCi0jZGVmaW5lIEVUSF9NTUNSSVIgMHgwMDAwMDEwNFUNCi0jZGVmaW5lIEVUSF9NTUNUSVIgMHgwMDAwMDEwOFUNCi0jZGVmaW5lIEVUSF9NTUNSSU1SIDB4MDAwMDAxMENVDQotI2RlZmluZSBFVEhfTU1DVElNUiAweDAwMDAwMTEwVQ0KLSNkZWZpbmUgRVRIX01NQ1RHRlNDQ1IgMHgwMDAwMDE0Q1UNCi0jZGVmaW5lIEVUSF9NTUNUR0ZNU0NDUiAweDAwMDAwMTUwVQ0KLSNkZWZpbmUgRVRIX01NQ1RHRkNSIDB4MDAwMDAxNjhVDQotI2RlZmluZSBFVEhfTU1DUkZDRUNSIDB4MDAwMDAxOTRVDQotI2RlZmluZSBFVEhfTU1DUkZBRUNSIDB4MDAwMDAxOThVDQotI2RlZmluZSBFVEhfTU1DUkdVRkNSIDB4MDAwMDAxQzRVDQotDQotI2RlZmluZSBFVEhfTUFDX1RYRklGT19GVUxMIDB4MDIwMDAwMDBVICAgICAgICAgLyogVHggRklGTyBmdWxsICovDQotI2RlZmluZSBFVEhfTUFDX1RYRklGT05PVF9FTVBUWSAweDAxMDAwMDAwVSAgICAgLyogVHggRklGTyBub3QgZW1wdHkgKi8NCi0jZGVmaW5lIEVUSF9NQUNfVFhGSUZPX1dSSVRFX0FDVElWRSAweDAwNDAwMDAwVSAvKiBUeCBGSUZPIHdyaXRlIGFjdGl2ZSAqLw0KLSNkZWZpbmUgRVRIX01BQ19UWEZJRk9fSURMRSAweDAwMDAwMDAwVSAgICAgICAgIC8qIFR4IEZJRk8gcmVhZCBzdGF0dXM6IElkbGUgKi8NCi0jZGVmaW5lIEVUSF9NQUNfVFhGSUZPX1JFQUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgMHgwMDEwMDAwMFUgLyogVHggRklGTyByZWFkIHN0YXR1czogUmVhZCAodHJhbnNmZXJyaW5nIGRhdGEgdG8gdGhlIE1BQyBcDQotICAgICAgICAgICAgICAgICB0cmFuc21pdHRlcikgKi8NCi0jZGVmaW5lIEVUSF9NQUNfVFhGSUZPX1dBSVRJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIDB4MDAyMDAwMDBVIC8qIFR4IEZJRk8gcmVhZCBzdGF0dXM6IFdhaXRpbmcgZm9yIFR4U3RhdHVzIGZyb20gTUFDIFwNCi0gICAgICAgICAgICAgICAgIHRyYW5zbWl0dGVyICovDQotI2RlZmluZSBFVEhfTUFDX1RYRklGT19XUklUSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAweDAwMzAwMDAwVSAvKiBUeCBGSUZPIHJlYWQgc3RhdHVzOiBXcml0aW5nIHRoZSByZWNlaXZlZCBUeFN0YXR1cyBvciBcDQotICAgICAgICAgICAgICAgICBmbHVzaGluZyB0aGUgVHhGSUZPICovDQotI2RlZmluZSBFVEhfTUFDX1RSQU5TTUlTU0lPTl9QQVVTRSAweDAwMDgwMDAwVSAvKiBNQUMgdHJhbnNtaXR0ZXIgaW4gcGF1c2UgKi8NCi0jZGVmaW5lIEVUSF9NQUNfVFJBTlNNSVRGUkFNRUNPTlRST0xMRVJfSURMRSBcDQotICAweDAwMDAwMDAwVSAvKiBNQUMgdHJhbnNtaXQgZnJhbWUgY29udHJvbGxlcjogSWRsZSAqLw0KLSNkZWZpbmUgRVRIX01BQ19UUkFOU01JVEZSQU1FQ09OVFJPTExFUl9XQUlUSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAweDAwMDIwMDAwVSAvKiBNQUMgdHJhbnNtaXQgZnJhbWUgY29udHJvbGxlcjogV2FpdGluZyBmb3IgU3RhdHVzIG9mIHByZXZpb3VzIFwNCi0gICAgICAgICAgICAgICAgIGZyYW1lIG9yIElGRy9iYWNrb2ZmIHBlcmlvZCB0byBiZSBvdmVyICovDQotI2RlZmluZSBFVEhfTUFDX1RSQU5TTUlURlJBTUVDT05UUk9MTEVSX0dFTlJBVElOR19QQ0YgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgMHgwMDA0MDAwMFUgLyogTUFDIHRyYW5zbWl0IGZyYW1lIGNvbnRyb2xsZXI6IEdlbmVyYXRpbmcgYW5kIHRyYW5zbWl0dGluZyBhIFwNCi0gICAgICAgICAgICAgICAgIFBhdXNlIGNvbnRyb2wgZnJhbWUgKGluIGZ1bGwgZHVwbGV4IG1vZGUpICovDQotI2RlZmluZSBFVEhfTUFDX1RSQU5TTUlURlJBTUVDT05UUk9MTEVSX1RSQU5TRkVSUklORyAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAweDAwMDYwMDAwVSAvKiBNQUMgdHJhbnNtaXQgZnJhbWUgY29udHJvbGxlcjogVHJhbnNmZXJyaW5nIGlucHV0IGZyYW1lIGZvciBcDQotICAgICAgICAgICAgICAgICB0cmFuc21pc3Npb24gKi8NCi0jZGVmaW5lIEVUSF9NQUNfTUlJX1RSQU5TTUlUX0FDVElWRSBcDQotICAweDAwMDEwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNQUMgTUlJIHRyYW5zbWl0IGVuZ2luZSBhY3RpdmUgKi8NCi0jZGVmaW5lIEVUSF9NQUNfUlhGSUZPX0VNUFRZIDB4MDAwMDAwMDBVIC8qIFJ4IEZJRk8gZmlsbCBsZXZlbDogZW1wdHkgKi8NCi0jZGVmaW5lIEVUSF9NQUNfUlhGSUZPX0JFTE9XX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgMHgwMDAwMDEwMFUgLyogUnggRklGTyBmaWxsIGxldmVsOiBmaWxsLWxldmVsIGJlbG93IGZsb3ctY29udHJvbCBkZS1hY3RpdmF0ZSBcDQotICAgICAgICAgICAgICAgICB0aHJlc2hvbGQgKi8NCi0jZGVmaW5lIEVUSF9NQUNfUlhGSUZPX0FCT1ZFX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgMHgwMDAwMDIwMFUgLyogUnggRklGTyBmaWxsIGxldmVsOiBmaWxsLWxldmVsIGFib3ZlIGZsb3ctY29udHJvbCBhY3RpdmF0ZSBcDQotICAgICAgICAgICAgICAgICB0aHJlc2hvbGQgKi8NCi0jZGVmaW5lIEVUSF9NQUNfUlhGSUZPX0ZVTEwgMHgwMDAwMDMwMFUgLyogUnggRklGTyBmaWxsIGxldmVsOiBmdWxsICovDQotI2lmIGRlZmluZWQoU1RNMzJGMSkNCi0jZWxzZQ0KLSNkZWZpbmUgRVRIX01BQ19SRUFEQ09OVFJPTExFUl9JRExFIFwNCi0gIDB4MDAwMDAwMDBVIC8qIFJ4IEZJRk8gcmVhZCBjb250cm9sbGVyIElETEUgc3RhdGUgKi8NCi0jZGVmaW5lIEVUSF9NQUNfUkVBRENPTlRST0xMRVJfUkVBRElOR19EQVRBIFwNCi0gIDB4MDAwMDAwMjBVIC8qIFJ4IEZJRk8gcmVhZCBjb250cm9sbGVyIFJlYWRpbmcgZnJhbWUgZGF0YSAqLw0KLSNkZWZpbmUgRVRIX01BQ19SRUFEQ09OVFJPTExFUl9SRUFESU5HX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIDB4MDAwMDAwNDBVIC8qIFJ4IEZJRk8gcmVhZCBjb250cm9sbGVyIFJlYWRpbmcgZnJhbWUgc3RhdHVzIChvciB0aW1lLXN0YW1wKSBcDQotICAgICAgICAgICAgICAgKi8NCi0jZW5kaWYNCi0jZGVmaW5lIEVUSF9NQUNfUkVBRENPTlRST0xMRVJfRkxVU0hJTkcgXA0KLSAgMHgwMDAwMDA2MFUgLyogUnggRklGTyByZWFkIGNvbnRyb2xsZXIgRmx1c2hpbmcgdGhlIGZyYW1lIGRhdGEgYW5kIHN0YXR1cyAqLw0KLSNkZWZpbmUgRVRIX01BQ19SWEZJRk9fV1JJVEVfQUNUSVZFIFwNCi0gIDB4MDAwMDAwMTBVIC8qIFJ4IEZJRk8gd3JpdGUgY29udHJvbGxlciBhY3RpdmUgKi8NCi0jZGVmaW5lIEVUSF9NQUNfU01BTExfRklGT19OT1RBQ1RJVkUgXA0KLSAgMHgwMDAwMDAwMFUgLyogTUFDIHNtYWxsIEZJRk8gcmVhZCAvIHdyaXRlIGNvbnRyb2xsZXJzIG5vdCBhY3RpdmUgKi8NCi0jZGVmaW5lIEVUSF9NQUNfU01BTExfRklGT19SRUFEX0FDVElWRSBcDQotICAweDAwMDAwMDAyVSAvKiBNQUMgc21hbGwgRklGTyByZWFkIGNvbnRyb2xsZXIgYWN0aXZlICovDQotI2RlZmluZSBFVEhfTUFDX1NNQUxMX0ZJRk9fV1JJVEVfQUNUSVZFIFwNCi0gIDB4MDAwMDAwMDRVIC8qIE1BQyBzbWFsbCBGSUZPIHdyaXRlIGNvbnRyb2xsZXIgYWN0aXZlICovDQotI2RlZmluZSBFVEhfTUFDX1NNQUxMX0ZJRk9fUldfQUNUSVZFIFwNCi0gIDB4MDAwMDAwMDZVIC8qIE1BQyBzbWFsbCBGSUZPIHJlYWQgLyB3cml0ZSBjb250cm9sbGVycyBhY3RpdmUgKi8NCi0jZGVmaW5lIEVUSF9NQUNfTUlJX1JFQ0VJVkVfUFJPVE9DT0xfQUNUSVZFIFwNCi0gIDB4MDAwMDAwMDFVIC8qIE1BQyBNSUkgcmVjZWl2ZSBwcm90b2NvbCBlbmdpbmUgYWN0aXZlICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEhBTF9EQ01JX0FsaWFzZWRfRGVmaW5lcyBIQUwgRENNSSBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3INCi0gKiBsZWdhY3kgcHVycG9zZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBIQUxfRENNSV9FUlJPUl9PVkYgSEFMX0RDTUlfRVJST1JfT1ZSDQotI2RlZmluZSBEQ01JX0lUX09WRiBEQ01JX0lUX09WUg0KLSNkZWZpbmUgRENNSV9GTEFHX09WRlJJIERDTUlfRkxBR19PVlJSSQ0KLSNkZWZpbmUgRENNSV9GTEFHX09WRk1JIERDTUlfRkxBR19PVlJNSQ0KLQ0KLSNkZWZpbmUgSEFMX0RDTUlfQ29uZmlnQ1JPUCBIQUxfRENNSV9Db25maWdDcm9wDQotI2RlZmluZSBIQUxfRENNSV9FbmFibGVDUk9QIEhBTF9EQ01JX0VuYWJsZUNyb3ANCi0jZGVmaW5lIEhBTF9EQ01JX0Rpc2FibGVDUk9QIEhBTF9EQ01JX0Rpc2FibGVDcm9wDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0jaWYgZGVmaW5lZChTVE0zMkw0KSB8fCBkZWZpbmVkKFNUTTMyRjcpIHx8IGRlZmluZWQoU1RNMzJGNDI3eHgpIHx8ICAgICAgICAgXA0KLSAgICBkZWZpbmVkKFNUTTMyRjQzN3h4KSB8fCBkZWZpbmVkKFNUTTMyRjQyOXh4KSB8fCBkZWZpbmVkKFNUTTMyRjQzOXh4KSB8fCBcDQotICAgIGRlZmluZWQoU1RNMzJGNDY5eHgpIHx8IGRlZmluZWQoU1RNMzJGNDc5eHgpIHx8IGRlZmluZWQoU1RNMzJINykNCi0vKiogQGRlZmdyb3VwIEhBTF9ETUEyRF9BbGlhc2VkX0RlZmluZXMgSEFMIERNQTJEIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvcg0KLSAqIGxlZ2FjeSBwdXJwb3NlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIERNQTJEX0FSR0I4ODg4IERNQTJEX09VVFBVVF9BUkdCODg4OA0KLSNkZWZpbmUgRE1BMkRfUkdCODg4IERNQTJEX09VVFBVVF9SR0I4ODgNCi0jZGVmaW5lIERNQTJEX1JHQjU2NSBETUEyRF9PVVRQVVRfUkdCNTY1DQotI2RlZmluZSBETUEyRF9BUkdCMTU1NSBETUEyRF9PVVRQVVRfQVJHQjE1NTUNCi0jZGVmaW5lIERNQTJEX0FSR0I0NDQ0IERNQTJEX09VVFBVVF9BUkdCNDQ0NA0KLQ0KLSNkZWZpbmUgQ01fQVJHQjg4ODggRE1BMkRfSU5QVVRfQVJHQjg4ODgNCi0jZGVmaW5lIENNX1JHQjg4OCBETUEyRF9JTlBVVF9SR0I4ODgNCi0jZGVmaW5lIENNX1JHQjU2NSBETUEyRF9JTlBVVF9SR0I1NjUNCi0jZGVmaW5lIENNX0FSR0IxNTU1IERNQTJEX0lOUFVUX0FSR0IxNTU1DQotI2RlZmluZSBDTV9BUkdCNDQ0NCBETUEyRF9JTlBVVF9BUkdCNDQ0NA0KLSNkZWZpbmUgQ01fTDggRE1BMkRfSU5QVVRfTDgNCi0jZGVmaW5lIENNX0FMNDQgRE1BMkRfSU5QVVRfQUw0NA0KLSNkZWZpbmUgQ01fQUw4OCBETUEyRF9JTlBVVF9BTDg4DQotI2RlZmluZSBDTV9MNCBETUEyRF9JTlBVVF9MNA0KLSNkZWZpbmUgQ01fQTggRE1BMkRfSU5QVVRfQTgNCi0jZGVmaW5lIENNX0E0IERNQTJEX0lOUFVUX0E0DQotLyoqDQotICogQH0NCi0gKi8NCi0jZW5kaWYgLyogU1RNMzJMNCB8fCAgU1RNMzJGNyB8fCAgU1RNMzJGNCB8fCAgU1RNMzJINyAqLw0KLQ0KLSNpZiBkZWZpbmVkKFNUTTMyTDQpIHx8IGRlZmluZWQoU1RNMzJGNykgfHwgZGVmaW5lZChTVE0zMkY0Mjd4eCkgfHwgICAgICAgICBcDQotICAgIGRlZmluZWQoU1RNMzJGNDM3eHgpIHx8IGRlZmluZWQoU1RNMzJGNDI5eHgpIHx8IGRlZmluZWQoU1RNMzJGNDM5eHgpIHx8IFwNCi0gICAgZGVmaW5lZChTVE0zMkY0Njl4eCkgfHwgZGVmaW5lZChTVE0zMkY0Nzl4eCkgfHwgZGVmaW5lZChTVE0zMkg3KSB8fCAgICAgXA0KLSAgICBkZWZpbmVkKFNUTTMyVTUpDQotLyoqIEBkZWZncm91cCBETUEyRF9BbGlhc2VzIERNQTJEIEFQSSBBbGlhc2VzDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIEhBTF9ETUEyRF9EaXNhYmxlQ0xVVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIEhBTF9ETUEyRF9DTFVUTG9hZGluZ19BYm9ydCAvKiE8IEFsaWFzZWQgdG8gSEFMX0RNQTJEX0NMVVRMb2FkaW5nX0Fib3J0IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbGVnYWN5IGNvZGUgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLSNlbmRpZiAvKiBTVE0zMkw0IHx8ICBTVE0zMkY3IHx8ICBTVE0zMkY0IHx8ICBTVE0zMkg3IHx8IFNUTTMyVTUgKi8NCi0NCi0vKiogQGRlZmdyb3VwIEhBTF9QUFBfQWxpYXNlZF9EZWZpbmVzIEhBTCBQUFAgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yDQotICogbGVnYWN5IHB1cnBvc2UNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0NCi0vKiogQGRlZmdyb3VwIEhBTF9DUllQX0FsaWFzZWRfRnVuY3Rpb25zIEhBTCBDUllQIEFsaWFzZWQgRnVuY3Rpb25zIG1haW50YWluZWQNCi0gKiBmb3IgbGVnYWN5IHB1cnBvc2UNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgSEFMX0NSWVBfQ29tcHV0YXRpb25DcGx0Q2FsbGJhY2sgSEFMX0NSWVBFeF9Db21wdXRhdGlvbkNwbHRDYWxsYmFjaw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBIQUxfRENBQ0hFX0FsaWFzZWRfRnVuY3Rpb25zIEhBTCBEQ0FDSEUgQWxpYXNlZCBGdW5jdGlvbnMNCi0gKiBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQ0KLSAqIEB7DQotICovDQotDQotI2lmIGRlZmluZWQoU1RNMzJVNSkNCi0jZGVmaW5lIEhBTF9EQ0FDSEVfQ2xlYW5JbnZhbGlkYXRlQnlBZGRyIEhBTF9EQ0FDSEVfQ2xlYW5JbnZhbGlkQnlBZGRyDQotI2RlZmluZSBIQUxfRENBQ0hFX0NsZWFuSW52YWxpZGF0ZUJ5QWRkcl9JVCBIQUxfRENBQ0hFX0NsZWFuSW52YWxpZEJ5QWRkcl9JVA0KLSNlbmRpZiAvKiBTVE0zMlU1ICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0jaWYgIWRlZmluZWQoU1RNMzJGMikNCi0vKiogQGRlZmdyb3VwIEhBU0hfYWxpYXMgSEFTSCBBUEkgYWxpYXMNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgSEFMX0hBU0hFeF9JUlFIYW5kbGVyIFwNCi0gIEhBTF9IQVNIX0lSUUhhbmRsZXIgLyohPCBSZWRpcmVjdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGxlZ2FjeSBjb2RlICovDQotLyoqDQotICoNCi0gKiBAfQ0KLSAqLw0KLSNlbmRpZiAvKiBTVE0zMkYyICovDQotLyoqIEBkZWZncm91cCBIQUxfSEFTSF9BbGlhc2VkX0Z1bmN0aW9ucyBIQUwgSEFTSCBBbGlhc2VkIEZ1bmN0aW9ucyBtYWludGFpbmVkDQotICogZm9yIGxlZ2FjeSBwdXJwb3NlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIEhBTF9IQVNIX1NUQVRFVHlwZURlZiBIQUxfSEFTSF9TdGF0ZVR5cGVEZWYNCi0jZGVmaW5lIEhBTF9IQVNIUGhhc2VUeXBlRGVmIEhBTF9IQVNIX1BoYXNlVHlwZURlZg0KLSNkZWZpbmUgSEFMX0hNQUNfTUQ1X0ZpbmlzaCBIQUxfSEFTSF9NRDVfRmluaXNoDQotI2RlZmluZSBIQUxfSE1BQ19TSEExX0ZpbmlzaCBIQUxfSEFTSF9TSEExX0ZpbmlzaA0KLSNkZWZpbmUgSEFMX0hNQUNfU0hBMjI0X0ZpbmlzaCBIQUxfSEFTSF9TSEEyMjRfRmluaXNoDQotI2RlZmluZSBIQUxfSE1BQ19TSEEyNTZfRmluaXNoIEhBTF9IQVNIX1NIQTI1Nl9GaW5pc2gNCi0NCi0vKkhBU0ggQWxnb3JpdGhtIFNlbGVjdGlvbiovDQotDQotI2RlZmluZSBIQVNIX0FsZ29TZWxlY3Rpb25fU0hBMSBIQVNIX0FMR09TRUxFQ1RJT05fU0hBMQ0KLSNkZWZpbmUgSEFTSF9BbGdvU2VsZWN0aW9uX1NIQTIyNCBIQVNIX0FMR09TRUxFQ1RJT05fU0hBMjI0DQotI2RlZmluZSBIQVNIX0FsZ29TZWxlY3Rpb25fU0hBMjU2IEhBU0hfQUxHT1NFTEVDVElPTl9TSEEyNTYNCi0jZGVmaW5lIEhBU0hfQWxnb1NlbGVjdGlvbl9NRDUgSEFTSF9BTEdPU0VMRUNUSU9OX01ENQ0KLQ0KLSNkZWZpbmUgSEFTSF9BbGdvTW9kZV9IQVNIIEhBU0hfQUxHT01PREVfSEFTSA0KLSNkZWZpbmUgSEFTSF9BbGdvTW9kZV9ITUFDIEhBU0hfQUxHT01PREVfSE1BQw0KLQ0KLSNkZWZpbmUgSEFTSF9ITUFDS2V5VHlwZV9TaG9ydEtleSBIQVNIX0hNQUNfS0VZVFlQRV9TSE9SVEtFWQ0KLSNkZWZpbmUgSEFTSF9ITUFDS2V5VHlwZV9Mb25nS2V5IEhBU0hfSE1BQ19LRVlUWVBFX0xPTkdLRVkNCi0NCi0jaWYgZGVmaW5lZChTVE0zMkw0KSB8fCBkZWZpbmVkKFNUTTMyTDUpIHx8IGRlZmluZWQoU1RNMzJGMikgfHwgXA0KLSAgICBkZWZpbmVkKFNUTTMyRjQpIHx8IGRlZmluZWQoU1RNMzJGNykgfHwgZGVmaW5lZChTVE0zMkg3KQ0KLQ0KLSNkZWZpbmUgSEFMX0hBU0hfTUQ1X0FjY3VtdWxhdGUgSEFMX0hBU0hfTUQ1X0FjY21sdA0KLSNkZWZpbmUgSEFMX0hBU0hfTUQ1X0FjY3VtdWxhdGVfRW5kIEhBTF9IQVNIX01ENV9BY2NtbHRfRW5kDQotI2RlZmluZSBIQUxfSEFTSF9NRDVfQWNjdW11bGF0ZV9JVCBIQUxfSEFTSF9NRDVfQWNjbWx0X0lUDQotI2RlZmluZSBIQUxfSEFTSF9NRDVfQWNjdW11bGF0ZV9FbmRfSVQgSEFMX0hBU0hfTUQ1X0FjY21sdF9FbmRfSVQNCi0NCi0jZGVmaW5lIEhBTF9IQVNIX1NIQTFfQWNjdW11bGF0ZSBIQUxfSEFTSF9TSEExX0FjY21sdA0KLSNkZWZpbmUgSEFMX0hBU0hfU0hBMV9BY2N1bXVsYXRlX0VuZCBIQUxfSEFTSF9TSEExX0FjY21sdF9FbmQNCi0jZGVmaW5lIEhBTF9IQVNIX1NIQTFfQWNjdW11bGF0ZV9JVCBIQUxfSEFTSF9TSEExX0FjY21sdF9JVA0KLSNkZWZpbmUgSEFMX0hBU0hfU0hBMV9BY2N1bXVsYXRlX0VuZF9JVCBIQUxfSEFTSF9TSEExX0FjY21sdF9FbmRfSVQNCi0NCi0jZGVmaW5lIEhBTF9IQVNIRXhfU0hBMjI0X0FjY3VtdWxhdGUgSEFMX0hBU0hFeF9TSEEyMjRfQWNjbWx0DQotI2RlZmluZSBIQUxfSEFTSEV4X1NIQTIyNF9BY2N1bXVsYXRlX0VuZCBIQUxfSEFTSEV4X1NIQTIyNF9BY2NtbHRfRW5kDQotI2RlZmluZSBIQUxfSEFTSEV4X1NIQTIyNF9BY2N1bXVsYXRlX0lUIEhBTF9IQVNIRXhfU0hBMjI0X0FjY21sdF9JVA0KLSNkZWZpbmUgSEFMX0hBU0hFeF9TSEEyMjRfQWNjdW11bGF0ZV9FbmRfSVQgSEFMX0hBU0hFeF9TSEEyMjRfQWNjbWx0X0VuZF9JVA0KLQ0KLSNkZWZpbmUgSEFMX0hBU0hFeF9TSEEyNTZfQWNjdW11bGF0ZSBIQUxfSEFTSEV4X1NIQTI1Nl9BY2NtbHQNCi0jZGVmaW5lIEhBTF9IQVNIRXhfU0hBMjU2X0FjY3VtdWxhdGVfRW5kIEhBTF9IQVNIRXhfU0hBMjU2X0FjY21sdF9FbmQNCi0jZGVmaW5lIEhBTF9IQVNIRXhfU0hBMjU2X0FjY3VtdWxhdGVfSVQgSEFMX0hBU0hFeF9TSEEyNTZfQWNjbWx0X0lUDQotI2RlZmluZSBIQUxfSEFTSEV4X1NIQTI1Nl9BY2N1bXVsYXRlX0VuZF9JVCBIQUxfSEFTSEV4X1NIQTI1Nl9BY2NtbHRfRW5kX0lUDQotDQotI2VuZGlmIC8qIFNUTTMyTDQgfHwgU1RNMzJMNSB8fCBTVE0zMkYyIHx8IFNUTTMyRjQgfHwgU1RNMzJGNyB8fCBTVE0zMkg3ICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEhBTF9BbGlhc2VkX0Z1bmN0aW9ucyBIQUwgR2VuZXJpYyBBbGlhc2VkIEZ1bmN0aW9ucyBtYWludGFpbmVkIGZvcg0KLSAqIGxlZ2FjeSBwdXJwb3NlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIEhBTF9FbmFibGVEQkdTbGVlcE1vZGUgSEFMX0RCR01DVV9FbmFibGVEQkdTbGVlcE1vZGUNCi0jZGVmaW5lIEhBTF9EaXNhYmxlREJHU2xlZXBNb2RlIEhBTF9EQkdNQ1VfRGlzYWJsZURCR1NsZWVwTW9kZQ0KLSNkZWZpbmUgSEFMX0VuYWJsZURCR1N0b3BNb2RlIEhBTF9EQkdNQ1VfRW5hYmxlREJHU3RvcE1vZGUNCi0jZGVmaW5lIEhBTF9EaXNhYmxlREJHU3RvcE1vZGUgSEFMX0RCR01DVV9EaXNhYmxlREJHU3RvcE1vZGUNCi0jZGVmaW5lIEhBTF9FbmFibGVEQkdTdGFuZGJ5TW9kZSBIQUxfREJHTUNVX0VuYWJsZURCR1N0YW5kYnlNb2RlDQotI2RlZmluZSBIQUxfRGlzYWJsZURCR1N0YW5kYnlNb2RlIEhBTF9EQkdNQ1VfRGlzYWJsZURCR1N0YW5kYnlNb2RlDQotI2RlZmluZSBIQUxfREJHX0xvd1Bvd2VyQ29uZmlnKFBlcmlwaCwgY21kKSAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoKGNtZCkgPT0gRU5BQkxFKSA/IEhBTF9EQkdNQ1VfREJHX0VuYWJsZUxvd1Bvd2VyQ29uZmlnKFBlcmlwaCkgXA0KLSAgICAgICAgICAgICAgICAgICAgIDogSEFMX0RCR01DVV9EQkdfRGlzYWJsZUxvd1Bvd2VyQ29uZmlnKFBlcmlwaCkpDQotI2RlZmluZSBIQUxfVlJFRklOVF9PdXRwdXRTZWxlY3QgSEFMX1NZU0NGR19WUkVGSU5UX091dHB1dFNlbGVjdA0KLSNkZWZpbmUgSEFMX0xvY2tfQ21kKGNtZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKCgoY21kKSA9PSBFTkFCTEUpID8gSEFMX1NZU0NGR19FbmFibGVfTG9ja19WUkVGSU5UKCkgXA0KLSAgICAgICAgICAgICAgICAgICAgIDogSEFMX1NZU0NGR19EaXNhYmxlX0xvY2tfVlJFRklOVCgpKQ0KLSNpZiBkZWZpbmVkKFNUTTMyTDApDQotI2Vsc2UNCi0jZGVmaW5lIEhBTF9WUkVGSU5UX0NtZChjbWQpIFwNCi0gICgoKGNtZCkgPT0gRU5BQkxFKSA/IEhBTF9TWVNDRkdfRW5hYmxlVlJFRklOVCgpIDogSEFMX1NZU0NGR19EaXNhYmxlVlJFRklOVCgpKQ0KLSNlbmRpZg0KLSNkZWZpbmUgSEFMX0FEQ19FbmFibGVCdWZmZXJfQ21kKGNtZCkgXA0KLSAgKCgoY21kKSA9PSBFTkFCTEUpID8gSEFMX0FEQ0V4X0VuYWJsZVZSRUZJTlQoKSA6IEhBTF9BRENFeF9EaXNhYmxlVlJFRklOVCgpKQ0KLSNkZWZpbmUgSEFMX0FEQ19FbmFibGVCdWZmZXJTZW5zb3JfQ21kKGNtZCkgICAgICAgICAgICAgICAgXA0KLSAgKCgoY21kKSA9PSBFTkFCTEUpID8gSEFMX0FEQ0V4X0VuYWJsZVZSRUZJTlRUZW1wU2Vuc29yKCkgXA0KLSAgICAgICAgICAgICAgICAgICAgIDogSEFMX0FEQ0V4X0Rpc2FibGVWUkVGSU5UVGVtcFNlbnNvcigpKQ0KLSNpZiBkZWZpbmVkKFNUTTMySDdBM3h4KSB8fCBkZWZpbmVkKFNUTTMySDdCM3h4KSB8fCBkZWZpbmVkKFNUTTMySDdCMHh4KSB8fCBcDQotICAgIGRlZmluZWQoU1RNMzJIN0EzeHhRKSB8fCBkZWZpbmVkKFNUTTMySDdCM3h4USkgfHwgZGVmaW5lZChTVE0zMkg3QjB4eFEpDQotI2RlZmluZSBIQUxfRW5hYmxlU1JEb21haW5EQkdTdG9wTW9kZSBIQUxfRW5hYmxlRG9tYWluM0RCR1N0b3BNb2RlDQotI2RlZmluZSBIQUxfRGlzYWJsZVNSRG9tYWluREJHU3RvcE1vZGUgSEFMX0Rpc2FibGVEb21haW4zREJHU3RvcE1vZGUNCi0jZGVmaW5lIEhBTF9FbmFibGVTUkRvbWFpbkRCR1N0YW5kYnlNb2RlIEhBTF9FbmFibGVEb21haW4zREJHU3RhbmRieU1vZGUNCi0jZGVmaW5lIEhBTF9EaXNhYmxlU1JEb21haW5EQkdTdGFuZGJ5TW9kZSBIQUxfRGlzYWJsZURvbWFpbjNEQkdTdGFuZGJ5TW9kZQ0KLSNlbmRpZiAvKiBTVE0zMkg3QTN4eCB8fCBTVE0zMkg3QjN4eCB8fCBTVE0zMkg3QjB4eCB8fCBTVE0zMkg3QTN4eFEgfHwgXA0KLSAgICAgICAgICBTVE0zMkg3QjN4eFEgIHx8IFNUTTMySDdCMHh4USAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBIQUxfRkxBU0hfQWxpYXNlZF9GdW5jdGlvbnMgSEFMIEZMQVNIIEFsaWFzZWQgRnVuY3Rpb25zIG1haW50YWluZWQNCi0gKiBmb3IgbGVnYWN5IHB1cnBvc2UNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgRkxBU0hfSGFsZlBhZ2VQcm9ncmFtIEhBTF9GTEFTSEV4X0hhbGZQYWdlUHJvZ3JhbQ0KLSNkZWZpbmUgRkxBU0hfRW5hYmxlUnVuUG93ZXJEb3duIEhBTF9GTEFTSEV4X0VuYWJsZVJ1blBvd2VyRG93bg0KLSNkZWZpbmUgRkxBU0hfRGlzYWJsZVJ1blBvd2VyRG93biBIQUxfRkxBU0hFeF9EaXNhYmxlUnVuUG93ZXJEb3duDQotI2RlZmluZSBIQUxfREFUQV9FRVBST01FeF9VbmxvY2sgSEFMX0ZMQVNIRXhfREFUQUVFUFJPTV9VbmxvY2sNCi0jZGVmaW5lIEhBTF9EQVRBX0VFUFJPTUV4X0xvY2sgSEFMX0ZMQVNIRXhfREFUQUVFUFJPTV9Mb2NrDQotI2RlZmluZSBIQUxfREFUQV9FRVBST01FeF9FcmFzZSBIQUxfRkxBU0hFeF9EQVRBRUVQUk9NX0VyYXNlDQotI2RlZmluZSBIQUxfREFUQV9FRVBST01FeF9Qcm9ncmFtIEhBTF9GTEFTSEV4X0RBVEFFRVBST01fUHJvZ3JhbQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBIQUxfSTJDX0FsaWFzZWRfRnVuY3Rpb25zIEhBTCBJMkMgQWxpYXNlZCBGdW5jdGlvbnMgbWFpbnRhaW5lZCBmb3INCi0gKiBsZWdhY3kgcHVycG9zZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBIQUxfSTJDRXhfQW5hbG9nRmlsdGVyX0NvbmZpZyBIQUxfSTJDRXhfQ29uZmlnQW5hbG9nRmlsdGVyDQotI2RlZmluZSBIQUxfSTJDRXhfRGlnaXRhbEZpbHRlcl9Db25maWcgSEFMX0kyQ0V4X0NvbmZpZ0RpZ2l0YWxGaWx0ZXINCi0jZGVmaW5lIEhBTF9GTVBJMkNFeF9BbmFsb2dGaWx0ZXJfQ29uZmlnIEhBTF9GTVBJMkNFeF9Db25maWdBbmFsb2dGaWx0ZXINCi0jZGVmaW5lIEhBTF9GTVBJMkNFeF9EaWdpdGFsRmlsdGVyX0NvbmZpZyBIQUxfRk1QSTJDRXhfQ29uZmlnRGlnaXRhbEZpbHRlcg0KLQ0KLSNkZWZpbmUgSEFMX0kyQ0Zhc3RNb2RlUGx1c0NvbmZpZyhTWVNDRkdfSTJDRmFzdE1vZGVQbHVzLCBjbWQpICAgICAgICAgICAgICBcDQotICAoKChjbWQpID09IEVOQUJMRSkgPyBIQUxfSTJDRXhfRW5hYmxlRmFzdE1vZGVQbHVzKFNZU0NGR19JMkNGYXN0TW9kZVBsdXMpIFwNCi0gICAgICAgICAgICAgICAgICAgICA6IEhBTF9JMkNFeF9EaXNhYmxlRmFzdE1vZGVQbHVzKFNZU0NGR19JMkNGYXN0TW9kZVBsdXMpKQ0KLQ0KLSNpZiBkZWZpbmVkKFNUTTMySDcpIHx8IGRlZmluZWQoU1RNMzJXQikgfHwgZGVmaW5lZChTVE0zMkcwKSB8fCBcDQotICAgIGRlZmluZWQoU1RNMzJGMCkgfHwgZGVmaW5lZChTVE0zMkYxKSB8fCBkZWZpbmVkKFNUTTMyRjIpIHx8IFwNCi0gICAgZGVmaW5lZChTVE0zMkYzKSB8fCBkZWZpbmVkKFNUTTMyRjQpIHx8IGRlZmluZWQoU1RNMzJGNykgfHwgXA0KLSAgICBkZWZpbmVkKFNUTTMyTDApIHx8IGRlZmluZWQoU1RNMzJMNCkgfHwgZGVmaW5lZChTVE0zMkw1KSB8fCBcDQotICAgIGRlZmluZWQoU1RNMzJHNCkgfHwgZGVmaW5lZChTVE0zMkwxKQ0KLSNkZWZpbmUgSEFMX0kyQ19NYXN0ZXJfU2VxdWVudGlhbF9UcmFuc21pdF9JVCBIQUxfSTJDX01hc3Rlcl9TZXFfVHJhbnNtaXRfSVQNCi0jZGVmaW5lIEhBTF9JMkNfTWFzdGVyX1NlcXVlbnRpYWxfUmVjZWl2ZV9JVCBIQUxfSTJDX01hc3Rlcl9TZXFfUmVjZWl2ZV9JVA0KLSNkZWZpbmUgSEFMX0kyQ19TbGF2ZV9TZXF1ZW50aWFsX1RyYW5zbWl0X0lUIEhBTF9JMkNfU2xhdmVfU2VxX1RyYW5zbWl0X0lUDQotI2RlZmluZSBIQUxfSTJDX1NsYXZlX1NlcXVlbnRpYWxfUmVjZWl2ZV9JVCBIQUxfSTJDX1NsYXZlX1NlcV9SZWNlaXZlX0lUDQotI2VuZGlmIC8qIFNUTTMySDcgfHwgU1RNMzJXQiAgfHwgU1RNMzJHMCB8fCBTVE0zMkYwIHx8IFNUTTMyRjEgfHwgU1RNMzJGMiB8fCBcDQotICAgICAgICAgIFNUTTMyRjMgfHwgU1RNMzJGNCB8fCBTVE0zMkY3IHx8IFNUTTMyTDAgfHwgU1RNMzJMNCB8fCBTVE0zMkw1IHx8ICBcDQotICAgICAgICAgIFNUTTMyRzQgfHwgU1RNMzJMMSAqLw0KLSNpZiBkZWZpbmVkKFNUTTMySDcpIHx8IGRlZmluZWQoU1RNMzJXQikgfHwgZGVmaW5lZChTVE0zMkcwKSB8fCBcDQotICAgIGRlZmluZWQoU1RNMzJGNCkgfHwgZGVmaW5lZChTVE0zMkY3KSB8fCBkZWZpbmVkKFNUTTMyTDApIHx8IFwNCi0gICAgZGVmaW5lZChTVE0zMkw0KSB8fCBkZWZpbmVkKFNUTTMyTDUpIHx8IGRlZmluZWQoU1RNMzJHNCkgfHwgXA0KLSAgICBkZWZpbmVkKFNUTTMyTDEpDQotI2RlZmluZSBIQUxfSTJDX01hc3Rlcl9TZXF1ZW50aWFsX1RyYW5zbWl0X0RNQSBIQUxfSTJDX01hc3Rlcl9TZXFfVHJhbnNtaXRfRE1BDQotI2RlZmluZSBIQUxfSTJDX01hc3Rlcl9TZXF1ZW50aWFsX1JlY2VpdmVfRE1BIEhBTF9JMkNfTWFzdGVyX1NlcV9SZWNlaXZlX0RNQQ0KLSNkZWZpbmUgSEFMX0kyQ19TbGF2ZV9TZXF1ZW50aWFsX1RyYW5zbWl0X0RNQSBIQUxfSTJDX1NsYXZlX1NlcV9UcmFuc21pdF9ETUENCi0jZGVmaW5lIEhBTF9JMkNfU2xhdmVfU2VxdWVudGlhbF9SZWNlaXZlX0RNQSBIQUxfSTJDX1NsYXZlX1NlcV9SZWNlaXZlX0RNQQ0KLSNlbmRpZiAvKiBTVE0zMkg3IHx8IFNUTTMyV0IgIHx8IFNUTTMyRzAgfHwgU1RNMzJGNCB8fCBTVE0zMkY3IHx8IFNUTTMyTDAgfHwgXA0KLSAgICAgICAgICBTVE0zMkw0IHx8IFNUTTMyTDUgfHwgU1RNMzJHNCB8fCBTVE0zMkwxICovDQotDQotI2lmIGRlZmluZWQoU1RNMzJGNCkNCi0jZGVmaW5lIEhBTF9GTVBJMkNfTWFzdGVyX1NlcXVlbnRpYWxfVHJhbnNtaXRfSVQgXA0KLSAgSEFMX0ZNUEkyQ19NYXN0ZXJfU2VxX1RyYW5zbWl0X0lUDQotI2RlZmluZSBIQUxfRk1QSTJDX01hc3Rlcl9TZXF1ZW50aWFsX1JlY2VpdmVfSVQgSEFMX0ZNUEkyQ19NYXN0ZXJfU2VxX1JlY2VpdmVfSVQNCi0jZGVmaW5lIEhBTF9GTVBJMkNfU2xhdmVfU2VxdWVudGlhbF9UcmFuc21pdF9JVCBIQUxfRk1QSTJDX1NsYXZlX1NlcV9UcmFuc21pdF9JVA0KLSNkZWZpbmUgSEFMX0ZNUEkyQ19TbGF2ZV9TZXF1ZW50aWFsX1JlY2VpdmVfSVQgSEFMX0ZNUEkyQ19TbGF2ZV9TZXFfUmVjZWl2ZV9JVA0KLSNkZWZpbmUgSEFMX0ZNUEkyQ19NYXN0ZXJfU2VxdWVudGlhbF9UcmFuc21pdF9ETUEgXA0KLSAgSEFMX0ZNUEkyQ19NYXN0ZXJfU2VxX1RyYW5zbWl0X0RNQQ0KLSNkZWZpbmUgSEFMX0ZNUEkyQ19NYXN0ZXJfU2VxdWVudGlhbF9SZWNlaXZlX0RNQSBcDQotICBIQUxfRk1QSTJDX01hc3Rlcl9TZXFfUmVjZWl2ZV9ETUENCi0jZGVmaW5lIEhBTF9GTVBJMkNfU2xhdmVfU2VxdWVudGlhbF9UcmFuc21pdF9ETUEgXA0KLSAgSEFMX0ZNUEkyQ19TbGF2ZV9TZXFfVHJhbnNtaXRfRE1BDQotI2RlZmluZSBIQUxfRk1QSTJDX1NsYXZlX1NlcXVlbnRpYWxfUmVjZWl2ZV9ETUEgSEFMX0ZNUEkyQ19TbGF2ZV9TZXFfUmVjZWl2ZV9ETUENCi0jZW5kaWYgLyogU1RNMzJGNCAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBIQUxfUFdSX0FsaWFzZWQgSEFMIFBXUiBBbGlhc2VkIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlDQotICogQHsNCi0gKi8NCi0NCi0jaWYgZGVmaW5lZChTVE0zMkcwKQ0KLSNkZWZpbmUgSEFMX1BXUl9Db25maWdQVkQgSEFMX1BXUkV4X0NvbmZpZ1BWRA0KLSNkZWZpbmUgSEFMX1BXUl9FbmFibGVQVkQgSEFMX1BXUkV4X0VuYWJsZVBWRA0KLSNkZWZpbmUgSEFMX1BXUl9EaXNhYmxlUFZEIEhBTF9QV1JFeF9EaXNhYmxlUFZEDQotI2RlZmluZSBIQUxfUFdSX1BWRF9JUlFIYW5kbGVyIEhBTF9QV1JFeF9QVkRfSVJRSGFuZGxlcg0KLSNlbmRpZg0KLSNkZWZpbmUgSEFMX1BXUl9QVkRDb25maWcgSEFMX1BXUl9Db25maWdQVkQNCi0jZGVmaW5lIEhBTF9QV1JfRGlzYWJsZUJrVXBSZWcgSEFMX1BXUkV4X0Rpc2FibGVCa1VwUmVnDQotI2RlZmluZSBIQUxfUFdSX0Rpc2FibGVGbGFzaFBvd2VyRG93biBIQUxfUFdSRXhfRGlzYWJsZUZsYXNoUG93ZXJEb3duDQotI2RlZmluZSBIQUxfUFdSX0Rpc2FibGVWZGRpbzJNb25pdG9yIEhBTF9QV1JFeF9EaXNhYmxlVmRkaW8yTW9uaXRvcg0KLSNkZWZpbmUgSEFMX1BXUl9FbmFibGVCa1VwUmVnIEhBTF9QV1JFeF9FbmFibGVCa1VwUmVnDQotI2RlZmluZSBIQUxfUFdSX0VuYWJsZUZsYXNoUG93ZXJEb3duIEhBTF9QV1JFeF9FbmFibGVGbGFzaFBvd2VyRG93bg0KLSNkZWZpbmUgSEFMX1BXUl9FbmFibGVWZGRpbzJNb25pdG9yIEhBTF9QV1JFeF9FbmFibGVWZGRpbzJNb25pdG9yDQotI2RlZmluZSBIQUxfUFdSX1BWRF9QVk1fSVJRSGFuZGxlciBIQUxfUFdSRXhfUFZEX1BWTV9JUlFIYW5kbGVyDQotI2RlZmluZSBIQUxfUFdSX1BWRExldmVsQ29uZmlnIEhBTF9QV1JfQ29uZmlnUFZEDQotI2RlZmluZSBIQUxfUFdSX1ZkZGlvMk1vbml0b3JfSVJRSGFuZGxlciBIQUxfUFdSRXhfVmRkaW8yTW9uaXRvcl9JUlFIYW5kbGVyDQotI2RlZmluZSBIQUxfUFdSX1ZkZGlvMk1vbml0b3JDYWxsYmFjayBIQUxfUFdSRXhfVmRkaW8yTW9uaXRvckNhbGxiYWNrDQotI2RlZmluZSBIQUxfUFdSRXhfQWN0aXZhdGVPdmVyRHJpdmUgSEFMX1BXUkV4X0VuYWJsZU92ZXJEcml2ZQ0KLSNkZWZpbmUgSEFMX1BXUkV4X0RlYWN0aXZhdGVPdmVyRHJpdmUgSEFMX1BXUkV4X0Rpc2FibGVPdmVyRHJpdmUNCi0jZGVmaW5lIEhBTF9QV1JFeF9EaXNhYmxlU0RBRENBbmFsb2cgSEFMX1BXUkV4X0Rpc2FibGVTREFEQw0KLSNkZWZpbmUgSEFMX1BXUkV4X0VuYWJsZVNEQURDQW5hbG9nIEhBTF9QV1JFeF9FbmFibGVTREFEQw0KLSNkZWZpbmUgSEFMX1BXUkV4X1BWTUNvbmZpZyBIQUxfUFdSRXhfQ29uZmlnUFZNDQotDQotI2RlZmluZSBQV1JfTU9ERV9OT1JNQUwgUFdSX1BWRF9NT0RFX05PUk1BTA0KLSNkZWZpbmUgUFdSX01PREVfSVRfUklTSU5HIFBXUl9QVkRfTU9ERV9JVF9SSVNJTkcNCi0jZGVmaW5lIFBXUl9NT0RFX0lUX0ZBTExJTkcgUFdSX1BWRF9NT0RFX0lUX0ZBTExJTkcNCi0jZGVmaW5lIFBXUl9NT0RFX0lUX1JJU0lOR19GQUxMSU5HIFBXUl9QVkRfTU9ERV9JVF9SSVNJTkdfRkFMTElORw0KLSNkZWZpbmUgUFdSX01PREVfRVZFTlRfUklTSU5HIFBXUl9QVkRfTU9ERV9FVkVOVF9SSVNJTkcNCi0jZGVmaW5lIFBXUl9NT0RFX0VWRU5UX0ZBTExJTkcgUFdSX1BWRF9NT0RFX0VWRU5UX0ZBTExJTkcNCi0jZGVmaW5lIFBXUl9NT0RFX0VWRU5UX1JJU0lOR19GQUxMSU5HIFBXUl9QVkRfTU9ERV9FVkVOVF9SSVNJTkdfRkFMTElORw0KLQ0KLSNkZWZpbmUgQ1JfT0ZGU0VUX0JCIFBXUl9DUl9PRkZTRVRfQkINCi0jZGVmaW5lIENTUl9PRkZTRVRfQkIgUFdSX0NTUl9PRkZTRVRfQkINCi0jZGVmaW5lIFBNT0RFX0JJVF9OVU1CRVIgVk9TX0JJVF9OVU1CRVINCi0jZGVmaW5lIENSX1BNT0RFX0JCIENSX1ZPU19CQg0KLQ0KLSNkZWZpbmUgREJQX0JpdE51bWJlciBEQlBfQklUX05VTUJFUg0KLSNkZWZpbmUgUFZERV9CaXROdW1iZXIgUFZERV9CSVRfTlVNQkVSDQotI2RlZmluZSBQTU9ERV9CaXROdW1iZXIgUE1PREVfQklUX05VTUJFUg0KLSNkZWZpbmUgRVdVUF9CaXROdW1iZXIgRVdVUF9CSVRfTlVNQkVSDQotI2RlZmluZSBGUERTX0JpdE51bWJlciBGUERTX0JJVF9OVU1CRVINCi0jZGVmaW5lIE9ERU5fQml0TnVtYmVyIE9ERU5fQklUX05VTUJFUg0KLSNkZWZpbmUgT0RTV0VOX0JpdE51bWJlciBPRFNXRU5fQklUX05VTUJFUg0KLSNkZWZpbmUgTVJMVkRTX0JpdE51bWJlciBNUkxWRFNfQklUX05VTUJFUg0KLSNkZWZpbmUgTFBMVkRTX0JpdE51bWJlciBMUExWRFNfQklUX05VTUJFUg0KLSNkZWZpbmUgQlJFX0JpdE51bWJlciBCUkVfQklUX05VTUJFUg0KLQ0KLSNkZWZpbmUgUFdSX01PREVfRVZUIFBXUl9QVkRfTU9ERV9OT1JNQUwNCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgSEFMX1NNQlVTX0FsaWFzZWRfRnVuY3Rpb25zIEhBTCBTTUJVUyBBbGlhc2VkIEZ1bmN0aW9ucyBtYWludGFpbmVkDQotICogZm9yIGxlZ2FjeSBwdXJwb3NlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIEhBTF9TTUJVU19TbGF2ZV9MaXN0ZW5fSVQgSEFMX1NNQlVTX0VuYWJsZUxpc3Rlbl9JVA0KLSNkZWZpbmUgSEFMX1NNQlVTX1NsYXZlQWRkckNhbGxiYWNrIEhBTF9TTUJVU19BZGRyQ2FsbGJhY2sNCi0jZGVmaW5lIEhBTF9TTUJVU19TbGF2ZUxpc3RlbkNwbHRDYWxsYmFjayBIQUxfU01CVVNfTGlzdGVuQ3BsdENhbGxiYWNrDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEhBTF9TUElfQWxpYXNlZF9GdW5jdGlvbnMgSEFMIFNQSSBBbGlhc2VkIEZ1bmN0aW9ucyBtYWludGFpbmVkIGZvcg0KLSAqIGxlZ2FjeSBwdXJwb3NlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIEhBTF9TUElfRmx1c2hSeEZpZm8gSEFMX1NQSUV4X0ZsdXNoUnhGaWZvDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEhBTF9USU1fQWxpYXNlZF9GdW5jdGlvbnMgSEFMIFRJTSBBbGlhc2VkIEZ1bmN0aW9ucyBtYWludGFpbmVkIGZvcg0KLSAqIGxlZ2FjeSBwdXJwb3NlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIEhBTF9USU1fRE1BRGVsYXlQdWxzZUNwbHQgVElNX0RNQURlbGF5UHVsc2VDcGx0DQotI2RlZmluZSBIQUxfVElNX0RNQUVycm9yIFRJTV9ETUFFcnJvcg0KLSNkZWZpbmUgSEFMX1RJTV9ETUFDYXB0dXJlQ3BsdCBUSU1fRE1BQ2FwdHVyZUNwbHQNCi0jZGVmaW5lIEhBTF9USU1FeF9ETUFDb21tdXRhdGlvbkNwbHQgVElNRXhfRE1BQ29tbXV0YXRpb25DcGx0DQotI2lmIGRlZmluZWQoU1RNMzJINykgfHwgZGVmaW5lZChTVE0zMkcwKSB8fCBkZWZpbmVkKFNUTTMyRjApIHx8IFwNCi0gICAgZGVmaW5lZChTVE0zMkYxKSB8fCBkZWZpbmVkKFNUTTMyRjIpIHx8IGRlZmluZWQoU1RNMzJGMykgfHwgXA0KLSAgICBkZWZpbmVkKFNUTTMyRjQpIHx8IGRlZmluZWQoU1RNMzJGNykgfHwgZGVmaW5lZChTVE0zMkwwKSB8fCBcDQotICAgIGRlZmluZWQoU1RNMzJMNCkNCi0jZGVmaW5lIEhBTF9USU1fU2xhdmVDb25maWdTeW5jaHJvbml6YXRpb24gSEFMX1RJTV9TbGF2ZUNvbmZpZ1N5bmNocm8NCi0jZGVmaW5lIEhBTF9USU1fU2xhdmVDb25maWdTeW5jaHJvbml6YXRpb25fSVQgSEFMX1RJTV9TbGF2ZUNvbmZpZ1N5bmNocm9fSVQNCi0jZGVmaW5lIEhBTF9USU1FeF9Db21tdXRhdGlvbkNhbGxiYWNrIEhBTF9USU1FeF9Db21tdXRDYWxsYmFjaw0KLSNkZWZpbmUgSEFMX1RJTUV4X0NvbmZpZ0NvbW11dGF0aW9uRXZlbnQgSEFMX1RJTUV4X0NvbmZpZ0NvbW11dEV2ZW50DQotI2RlZmluZSBIQUxfVElNRXhfQ29uZmlnQ29tbXV0YXRpb25FdmVudF9JVCBIQUxfVElNRXhfQ29uZmlnQ29tbXV0RXZlbnRfSVQNCi0jZGVmaW5lIEhBTF9USU1FeF9Db25maWdDb21tdXRhdGlvbkV2ZW50X0RNQSBIQUxfVElNRXhfQ29uZmlnQ29tbXV0RXZlbnRfRE1BDQotI2VuZGlmIC8qIFNUTTMySDcgfHwgU1RNMzJHMCB8fCBTVE0zMkYwIHx8IFNUTTMyRjEgfHwgU1RNMzJGMiB8fCBTVE0zMkYzIHx8IFwNCi0gICAgICAgICAgU1RNMzJGNCB8fCBTVE0zMkY3IHx8IFNUTTMyTDAgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgSEFMX1VBUlRfQWxpYXNlZF9GdW5jdGlvbnMgSEFMIFVBUlQgQWxpYXNlZCBGdW5jdGlvbnMgbWFpbnRhaW5lZA0KLSAqIGZvciBsZWdhY3kgcHVycG9zZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBIQUxfVUFSVF9XYWtldXBDYWxsYmFjayBIQUxfVUFSVEV4X1dha2V1cENhbGxiYWNrDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEhBTF9MVERDX0FsaWFzZWRfRnVuY3Rpb25zIEhBTCBMVERDIEFsaWFzZWQgRnVuY3Rpb25zIG1haW50YWluZWQNCi0gKiBmb3IgbGVnYWN5IHB1cnBvc2UNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgSEFMX0xURENfTGluZUV2ZW5DYWxsYmFjayBIQUxfTFREQ19MaW5lRXZlbnRDYWxsYmFjaw0KLSNkZWZpbmUgSEFMX0xURENfUmVsYW9kIEhBTF9MVERDX1JlbG9hZA0KLSNkZWZpbmUgSEFMX0xURENfU3RydWN0SW5pdEZyb21WaWRlb0NvbmZpZyBIQUxfTFREQ0V4X1N0cnVjdEluaXRGcm9tVmlkZW9Db25maWcNCi0jZGVmaW5lIEhBTF9MVERDX1N0cnVjdEluaXRGcm9tQWRhcHRlZENvbW1hbmRDb25maWcgXA0KLSAgSEFMX0xURENFeF9TdHJ1Y3RJbml0RnJvbUFkYXB0ZWRDb21tYW5kQ29uZmlnDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEhBTF9QUFBfQWxpYXNlZF9GdW5jdGlvbnMgSEFMIFBQUCBBbGlhc2VkIEZ1bmN0aW9ucyBtYWludGFpbmVkIGZvcg0KLSAqIGxlZ2FjeSBwdXJwb3NlDQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIEV4cG9ydGVkIG1hY3Jvcw0KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotDQotLyoqIEBkZWZncm91cCBIQUxfQUVTX0FsaWFzZWRfTWFjcm9zIEhBTCBDUllQIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yDQotICogbGVnYWN5IHB1cnBvc2UNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgQUVTX0lUX0NDIENSWVBfSVRfQ0MNCi0jZGVmaW5lIEFFU19JVF9FUlIgQ1JZUF9JVF9FUlINCi0jZGVmaW5lIEFFU19GTEFHX0NDRiBDUllQX0ZMQUdfQ0NGDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEhBTF9BbGlhc2VkX01hY3JvcyBIQUwgR2VuZXJpYyBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvcg0KLSAqIGxlZ2FjeSBwdXJwb3NlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX0dFVF9CT09UX01PREUgX19IQUxfU1lTQ0ZHX0dFVF9CT09UX01PREUNCi0jZGVmaW5lIF9fSEFMX1JFTUFQTUVNT1JZX0ZMQVNIIF9fSEFMX1NZU0NGR19SRU1BUE1FTU9SWV9GTEFTSA0KLSNkZWZpbmUgX19IQUxfUkVNQVBNRU1PUllfU1lTVEVNRkxBU0ggX19IQUxfU1lTQ0ZHX1JFTUFQTUVNT1JZX1NZU1RFTUZMQVNIDQotI2RlZmluZSBfX0hBTF9SRU1BUE1FTU9SWV9TUkFNIF9fSEFMX1NZU0NGR19SRU1BUE1FTU9SWV9TUkFNDQotI2RlZmluZSBfX0hBTF9SRU1BUE1FTU9SWV9GTUMgX19IQUxfU1lTQ0ZHX1JFTUFQTUVNT1JZX0ZNQw0KLSNkZWZpbmUgX19IQUxfUkVNQVBNRU1PUllfRk1DX1NEUkFNIF9fSEFMX1NZU0NGR19SRU1BUE1FTU9SWV9GTUNfU0RSQU0NCi0jZGVmaW5lIF9fSEFMX1JFTUFQTUVNT1JZX0ZTTUMgX19IQUxfU1lTQ0ZHX1JFTUFQTUVNT1JZX0ZTTUMNCi0jZGVmaW5lIF9fSEFMX1JFTUFQTUVNT1JZX1FVQURTUEkgX19IQUxfU1lTQ0ZHX1JFTUFQTUVNT1JZX1FVQURTUEkNCi0jZGVmaW5lIF9fSEFMX0ZNQ19CQU5LIF9fSEFMX1NZU0NGR19GTUNfQkFOSw0KLSNkZWZpbmUgX19IQUxfR0VUX0ZMQUcgX19IQUxfU1lTQ0ZHX0dFVF9GTEFHDQotI2RlZmluZSBfX0hBTF9DTEVBUl9GTEFHIF9fSEFMX1NZU0NGR19DTEVBUl9GTEFHDQotI2RlZmluZSBfX0hBTF9WUkVGSU5UX09VVF9FTkFCTEUgX19IQUxfU1lTQ0ZHX1ZSRUZJTlRfT1VUX0VOQUJMRQ0KLSNkZWZpbmUgX19IQUxfVlJFRklOVF9PVVRfRElTQUJMRSBfX0hBTF9TWVNDRkdfVlJFRklOVF9PVVRfRElTQUJMRQ0KLSNkZWZpbmUgX19IQUxfU1lTQ0ZHX1NSQU0yX1dSUF9FTkFCTEUgX19IQUxfU1lTQ0ZHX1NSQU0yX1dSUF8wXzMxX0VOQUJMRQ0KLQ0KLSNkZWZpbmUgU1lTQ0ZHX0ZMQUdfVlJFRl9SRUFEWSBTWVNDRkdfRkxBR19WUkVGSU5UX1JFQURZDQotI2RlZmluZSBTWVNDRkdfRkxBR19SQzQ4IFJDQ19GTEFHX0hTSTQ4DQotI2RlZmluZSBJU19TWVNDRkdfRkFTVE1PREVQTFVTX0NPTkZJRyBJU19JMkNfRkFTVE1PREVQTFVTDQotI2RlZmluZSBVRkJfTU9ERV9CaXROdW1iZXIgVUZCX01PREVfQklUX05VTUJFUg0KLSNkZWZpbmUgQ01QX1BEX0JpdE51bWJlciBDTVBfUERfQklUX05VTUJFUg0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBIQUxfQURDX0FsaWFzZWRfTWFjcm9zIEhBTCBBREMgQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3INCi0gKiBsZWdhY3kgcHVycG9zZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBfX0FEQ19FTkFCTEUgX19IQUxfQURDX0VOQUJMRQ0KLSNkZWZpbmUgX19BRENfRElTQUJMRSBfX0hBTF9BRENfRElTQUJMRQ0KLSNkZWZpbmUgX19IQUxfQURDX0VOQUJMSU5HX0NPTkRJVElPTlMgQURDX0VOQUJMSU5HX0NPTkRJVElPTlMNCi0jZGVmaW5lIF9fSEFMX0FEQ19ESVNBQkxJTkdfQ09ORElUSU9OUyBBRENfRElTQUJMSU5HX0NPTkRJVElPTlMNCi0jZGVmaW5lIF9fSEFMX0FEQ19JU19FTkFCTEVEIEFEQ19JU19FTkFCTEUNCi0jZGVmaW5lIF9fQURDX0lTX0VOQUJMRUQgQURDX0lTX0VOQUJMRQ0KLSNkZWZpbmUgX19IQUxfQURDX0lTX1NPRlRXQVJFX1NUQVJUX1JFR1VMQVIgQURDX0lTX1NPRlRXQVJFX1NUQVJUX1JFR1VMQVINCi0jZGVmaW5lIF9fSEFMX0FEQ19JU19TT0ZUV0FSRV9TVEFSVF9JTkpFQ1RFRCBBRENfSVNfU09GVFdBUkVfU1RBUlRfSU5KRUNURUQNCi0jZGVmaW5lIF9fSEFMX0FEQ19JU19DT05WRVJTSU9OX09OR09JTkdfUkVHVUxBUl9JTkpFQ1RFRCBcDQotICBBRENfSVNfQ09OVkVSU0lPTl9PTkdPSU5HX1JFR1VMQVJfSU5KRUNURUQNCi0jZGVmaW5lIF9fSEFMX0FEQ19JU19DT05WRVJTSU9OX09OR09JTkdfUkVHVUxBUiBcDQotICBBRENfSVNfQ09OVkVSU0lPTl9PTkdPSU5HX1JFR1VMQVINCi0jZGVmaW5lIF9fSEFMX0FEQ19JU19DT05WRVJTSU9OX09OR09JTkdfSU5KRUNURUQgXA0KLSAgQURDX0lTX0NPTlZFUlNJT05fT05HT0lOR19JTkpFQ1RFRA0KLSNkZWZpbmUgX19IQUxfQURDX0lTX0NPTlZFUlNJT05fT05HT0lORyBBRENfSVNfQ09OVkVSU0lPTl9PTkdPSU5HDQotI2RlZmluZSBfX0hBTF9BRENfQ0xFQVJfRVJST1JDT0RFIEFEQ19DTEVBUl9FUlJPUkNPREUNCi0NCi0jZGVmaW5lIF9fSEFMX0FEQ19HRVRfUkVTT0xVVElPTiBBRENfR0VUX1JFU09MVVRJT04NCi0jZGVmaW5lIF9fSEFMX0FEQ19KU1FSX1JLIEFEQ19KU1FSX1JLDQotI2RlZmluZSBfX0hBTF9BRENfQ0ZHUl9BV0QxQ0ggQURDX0NGR1JfQVdEMUNIX1NISUZUDQotI2RlZmluZSBfX0hBTF9BRENfQ0ZHUl9BV0QyM0NSIEFEQ19DRkdSX0FXRDIzQ1INCi0jZGVmaW5lIF9fSEFMX0FEQ19DRkdSX0lOSkVDVF9BVVRPX0NPTlZFUlNJT04gQURDX0NGR1JfSU5KRUNUX0FVVE9fQ09OVkVSU0lPTg0KLSNkZWZpbmUgX19IQUxfQURDX0NGR1JfSU5KRUNUX0NPTlRFWFRfUVVFVUUgQURDX0NGR1JfSU5KRUNUX0NPTlRFWFRfUVVFVUUNCi0jZGVmaW5lIF9fSEFMX0FEQ19DRkdSX0lOSkVDVF9ESVNDQ09OVElOVU9VUyBBRENfQ0ZHUl9JTkpFQ1RfRElTQ0NPTlRJTlVPVVMNCi0jZGVmaW5lIF9fSEFMX0FEQ19DRkdSX1JFR19ESVNDQ09OVElOVU9VUyBBRENfQ0ZHUl9SRUdfRElTQ0NPTlRJTlVPVVMNCi0jZGVmaW5lIF9fSEFMX0FEQ19DRkdSX0RJU0NPTlRJTlVPVVNfTlVNIEFEQ19DRkdSX0RJU0NPTlRJTlVPVVNfTlVNDQotI2RlZmluZSBfX0hBTF9BRENfQ0ZHUl9BVVRPV0FJVCBBRENfQ0ZHUl9BVVRPV0FJVA0KLSNkZWZpbmUgX19IQUxfQURDX0NGR1JfQ09OVElOVU9VUyBBRENfQ0ZHUl9DT05USU5VT1VTDQotI2RlZmluZSBfX0hBTF9BRENfQ0ZHUl9PVkVSUlVOIEFEQ19DRkdSX09WRVJSVU4NCi0jZGVmaW5lIF9fSEFMX0FEQ19DRkdSX0RNQUNPTlRSRVEgQURDX0NGR1JfRE1BQ09OVFJFUQ0KLSNkZWZpbmUgX19IQUxfQURDX0NGR1JfRVhUU0VMIEFEQ19DRkdSX0VYVFNFTF9TRVQNCi0jZGVmaW5lIF9fSEFMX0FEQ19KU1FSX0pFWFRTRUwgQURDX0pTUVJfSkVYVFNFTF9TRVQNCi0jZGVmaW5lIF9fSEFMX0FEQ19PRlJfQ0hBTk5FTCBBRENfT0ZSX0NIQU5ORUwNCi0jZGVmaW5lIF9fSEFMX0FEQ19ESUZTRUxfQ0hBTk5FTCBBRENfRElGU0VMX0NIQU5ORUwNCi0jZGVmaW5lIF9fSEFMX0FEQ19DQUxGQUNUX0RJRkZfU0VUIEFEQ19DQUxGQUNUX0RJRkZfU0VUDQotI2RlZmluZSBfX0hBTF9BRENfQ0FMRkFDVF9ESUZGX0dFVCBBRENfQ0FMRkFDVF9ESUZGX0dFVA0KLSNkZWZpbmUgX19IQUxfQURDX1RSWF9ISUdIVEhSRVNIT0xEIEFEQ19UUlhfSElHSFRIUkVTSE9MRA0KLQ0KLSNkZWZpbmUgX19IQUxfQURDX09GRlNFVF9TSElGVF9SRVNPTFVUSU9OIEFEQ19PRkZTRVRfU0hJRlRfUkVTT0xVVElPTg0KLSNkZWZpbmUgX19IQUxfQURDX0FXRDFUSFJFU0hPTERfU0hJRlRfUkVTT0xVVElPTiBcDQotICBBRENfQVdEMVRIUkVTSE9MRF9TSElGVF9SRVNPTFVUSU9ODQotI2RlZmluZSBfX0hBTF9BRENfQVdEMjNUSFJFU0hPTERfU0hJRlRfUkVTT0xVVElPTiBcDQotICBBRENfQVdEMjNUSFJFU0hPTERfU0hJRlRfUkVTT0xVVElPTg0KLSNkZWZpbmUgX19IQUxfQURDX0NPTU1PTl9SRUdJU1RFUiBBRENfQ09NTU9OX1JFR0lTVEVSDQotI2RlZmluZSBfX0hBTF9BRENfQ09NTU9OX0NDUl9NVUxUSSBBRENfQ09NTU9OX0NDUl9NVUxUSQ0KLSNkZWZpbmUgX19IQUxfQURDX01VTFRJTU9ERV9JU19FTkFCTEVEIEFEQ19NVUxUSU1PREVfSVNfRU5BQkxFDQotI2RlZmluZSBfX0FEQ19NVUxUSU1PREVfSVNfRU5BQkxFRCBBRENfTVVMVElNT0RFX0lTX0VOQUJMRQ0KLSNkZWZpbmUgX19IQUxfQURDX05PTk1VTFRJTU9ERV9PUl9NVUxUSU1PREVNQVNURVIgXA0KLSAgQURDX05PTk1VTFRJTU9ERV9PUl9NVUxUSU1PREVNQVNURVINCi0jZGVmaW5lIF9fSEFMX0FEQ19DT01NT05fQURDX09USEVSIEFEQ19DT01NT05fQURDX09USEVSDQotI2RlZmluZSBfX0hBTF9BRENfTVVMVElfU0xBVkUgQURDX01VTFRJX1NMQVZFDQotDQotI2RlZmluZSBfX0hBTF9BRENfU1FSMV9MIEFEQ19TUVIxX0xfU0hJRlQNCi0jZGVmaW5lIF9fSEFMX0FEQ19KU1FSX0pMIEFEQ19KU1FSX0pMX1NISUZUDQotI2RlZmluZSBfX0hBTF9BRENfSlNRUl9SS19KTCBBRENfSlNRUl9SS19KTA0KLSNkZWZpbmUgX19IQUxfQURDX0NSMV9ESVNDT05USU5VT1VTX05VTSBBRENfQ1IxX0RJU0NPTlRJTlVPVVNfTlVNDQotI2RlZmluZSBfX0hBTF9BRENfQ1IxX1NDQU4gQURDX0NSMV9TQ0FOX1NFVA0KLSNkZWZpbmUgX19IQUxfQURDX0NPTlZDWUNMRVNfTUFYX1JBTkdFIEFEQ19DT05WQ1lDTEVTX01BWF9SQU5HRQ0KLSNkZWZpbmUgX19IQUxfQURDX0NMT0NLX1BSRVNDQUxFUl9SQU5HRSBBRENfQ0xPQ0tfUFJFU0NBTEVSX1JBTkdFDQotI2RlZmluZSBfX0hBTF9BRENfR0VUX0NMT0NLX1BSRVNDQUxFUiBBRENfR0VUX0NMT0NLX1BSRVNDQUxFUg0KLQ0KLSNkZWZpbmUgX19IQUxfQURDX1NRUjEgQURDX1NRUjENCi0jZGVmaW5lIF9fSEFMX0FEQ19TTVBSMSBBRENfU01QUjENCi0jZGVmaW5lIF9fSEFMX0FEQ19TTVBSMiBBRENfU01QUjINCi0jZGVmaW5lIF9fSEFMX0FEQ19TUVIzX1JLIEFEQ19TUVIzX1JLDQotI2RlZmluZSBfX0hBTF9BRENfU1FSMl9SSyBBRENfU1FSMl9SSw0KLSNkZWZpbmUgX19IQUxfQURDX1NRUjFfUksgQURDX1NRUjFfUksNCi0jZGVmaW5lIF9fSEFMX0FEQ19DUjJfQ09OVElOVU9VUyBBRENfQ1IyX0NPTlRJTlVPVVMNCi0jZGVmaW5lIF9fSEFMX0FEQ19DUjFfRElTQ09OVElOVU9VUyBBRENfQ1IxX0RJU0NPTlRJTlVPVVMNCi0jZGVmaW5lIF9fSEFMX0FEQ19DUjFfU0NBTkNPTlYgQURDX0NSMV9TQ0FOQ09OVg0KLSNkZWZpbmUgX19IQUxfQURDX0NSMl9FT0NTZWxlY3Rpb24gQURDX0NSMl9FT0NTZWxlY3Rpb24NCi0jZGVmaW5lIF9fSEFMX0FEQ19DUjJfRE1BQ29udFJlcSBBRENfQ1IyX0RNQUNvbnRSZXENCi0jZGVmaW5lIF9fSEFMX0FEQ19KU1FSIEFEQ19KU1FSDQotDQotI2RlZmluZSBfX0hBTF9BRENfQ0hTRUxSX0NIQU5ORUwgQURDX0NIU0VMUl9DSEFOTkVMDQotI2RlZmluZSBfX0hBTF9BRENfQ0ZHUjFfUkVHX0RJU0NDT05USU5VT1VTIEFEQ19DRkdSMV9SRUdfRElTQ0NPTlRJTlVPVVMNCi0jZGVmaW5lIF9fSEFMX0FEQ19DRkdSMV9BVVRPT0ZGIEFEQ19DRkdSMV9BVVRPT0ZGDQotI2RlZmluZSBfX0hBTF9BRENfQ0ZHUjFfQVVUT1dBSVQgQURDX0NGR1IxX0FVVE9XQUlUDQotI2RlZmluZSBfX0hBTF9BRENfQ0ZHUjFfQ09OVElOVU9VUyBBRENfQ0ZHUjFfQ09OVElOVU9VUw0KLSNkZWZpbmUgX19IQUxfQURDX0NGR1IxX09WRVJSVU4gQURDX0NGR1IxX09WRVJSVU4NCi0jZGVmaW5lIF9fSEFMX0FEQ19DRkdSMV9TQ0FORElSIEFEQ19DRkdSMV9TQ0FORElSDQotI2RlZmluZSBfX0hBTF9BRENfQ0ZHUjFfRE1BQ09OVFJFUSBBRENfQ0ZHUjFfRE1BQ09OVFJFUQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBIQUxfREFDX0FsaWFzZWRfTWFjcm9zIEhBTCBEQUMgQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3INCi0gKiBsZWdhY3kgcHVycG9zZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBfX0hBTF9ESFIxMlIxX0FMSUdORU1FTlQgREFDX0RIUjEyUjFfQUxJR05NRU5UDQotI2RlZmluZSBfX0hBTF9ESFIxMlIyX0FMSUdORU1FTlQgREFDX0RIUjEyUjJfQUxJR05NRU5UDQotI2RlZmluZSBfX0hBTF9ESFIxMlJEX0FMSUdORU1FTlQgREFDX0RIUjEyUkRfQUxJR05NRU5UDQotI2RlZmluZSBJU19EQUNfR0VORVJBVEVfV0FWRSBJU19EQUNfV0FWRQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBIQUxfREJHTUNVX0FsaWFzZWRfTWFjcm9zIEhBTCBEQkdNQ1UgQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3INCi0gKiBsZWdhY3kgcHVycG9zZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBfX0hBTF9GUkVFWkVfVElNMV9EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9USU0xDQotI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9USU0xX0RCR01DVSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfVElNMQ0KLSNkZWZpbmUgX19IQUxfRlJFRVpFX1RJTTJfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfVElNMg0KLSNkZWZpbmUgX19IQUxfVU5GUkVFWkVfVElNMl9EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTINCi0jZGVmaW5lIF9fSEFMX0ZSRUVaRV9USU0zX0RCR01DVSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1RJTTMNCi0jZGVmaW5lIF9fSEFMX1VORlJFRVpFX1RJTTNfREJHTUNVIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU0zDQotI2RlZmluZSBfX0hBTF9GUkVFWkVfVElNNF9EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9USU00DQotI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9USU00X0RCR01DVSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfVElNNA0KLSNkZWZpbmUgX19IQUxfRlJFRVpFX1RJTTVfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfVElNNQ0KLSNkZWZpbmUgX19IQUxfVU5GUkVFWkVfVElNNV9EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTUNCi0jZGVmaW5lIF9fSEFMX0ZSRUVaRV9USU02X0RCR01DVSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1RJTTYNCi0jZGVmaW5lIF9fSEFMX1VORlJFRVpFX1RJTTZfREJHTUNVIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU02DQotI2RlZmluZSBfX0hBTF9GUkVFWkVfVElNN19EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9USU03DQotI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9USU03X0RCR01DVSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfVElNNw0KLSNkZWZpbmUgX19IQUxfRlJFRVpFX1RJTThfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfVElNOA0KLSNkZWZpbmUgX19IQUxfVU5GUkVFWkVfVElNOF9EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTgNCi0NCi0jZGVmaW5lIF9fSEFMX0ZSRUVaRV9USU05X0RCR01DVSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1RJTTkNCi0jZGVmaW5lIF9fSEFMX1VORlJFRVpFX1RJTTlfREJHTUNVIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU05DQotI2RlZmluZSBfX0hBTF9GUkVFWkVfVElNMTBfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfVElNMTANCi0jZGVmaW5lIF9fSEFMX1VORlJFRVpFX1RJTTEwX0RCR01DVSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfVElNMTANCi0jZGVmaW5lIF9fSEFMX0ZSRUVaRV9USU0xMV9EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9USU0xMQ0KLSNkZWZpbmUgX19IQUxfVU5GUkVFWkVfVElNMTFfREJHTUNVIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU0xMQ0KLSNkZWZpbmUgX19IQUxfRlJFRVpFX1RJTTEyX0RCR01DVSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1RJTTEyDQotI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9USU0xMl9EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTEyDQotI2RlZmluZSBfX0hBTF9GUkVFWkVfVElNMTNfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfVElNMTMNCi0jZGVmaW5lIF9fSEFMX1VORlJFRVpFX1RJTTEzX0RCR01DVSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfVElNMTMNCi0jZGVmaW5lIF9fSEFMX0ZSRUVaRV9USU0xNF9EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9USU0xNA0KLSNkZWZpbmUgX19IQUxfVU5GUkVFWkVfVElNMTRfREJHTUNVIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU0xNA0KLSNkZWZpbmUgX19IQUxfRlJFRVpFX0NBTjJfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfQ0FOMg0KLSNkZWZpbmUgX19IQUxfVU5GUkVFWkVfQ0FOMl9EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX0NBTjINCi0NCi0jZGVmaW5lIF9fSEFMX0ZSRUVaRV9USU0xNV9EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9USU0xNQ0KLSNkZWZpbmUgX19IQUxfVU5GUkVFWkVfVElNMTVfREJHTUNVIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU0xNQ0KLSNkZWZpbmUgX19IQUxfRlJFRVpFX1RJTTE2X0RCR01DVSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1RJTTE2DQotI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9USU0xNl9EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTE2DQotI2RlZmluZSBfX0hBTF9GUkVFWkVfVElNMTdfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfVElNMTcNCi0jZGVmaW5lIF9fSEFMX1VORlJFRVpFX1RJTTE3X0RCR01DVSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfVElNMTcNCi0jZGVmaW5lIF9fSEFMX0ZSRUVaRV9SVENfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfUlRDDQotI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9SVENfREJHTUNVIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9SVEMNCi0jaWYgZGVmaW5lZChTVE0zMkg3KQ0KLSNkZWZpbmUgX19IQUxfRlJFRVpFX1dXREdfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfV1dERzENCi0jZGVmaW5lIF9fSEFMX1VORlJFRVpFX1dXREdfREJHTUNVIF9fSEFMX0RCR01DVV9VbkZyZWV6ZV9XV0RHMQ0KLSNkZWZpbmUgX19IQUxfRlJFRVpFX0lXREdfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfSVdERzENCi0jZGVmaW5lIF9fSEFMX1VORlJFRVpFX0lXREdfREJHTUNVIF9fSEFMX0RCR01DVV9VbkZyZWV6ZV9JV0RHMQ0KLSNlbHNlDQotI2RlZmluZSBfX0hBTF9GUkVFWkVfV1dER19EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9XV0RHDQotI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9XV0RHX0RCR01DVSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfV1dERw0KLSNkZWZpbmUgX19IQUxfRlJFRVpFX0lXREdfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfSVdERw0KLSNkZWZpbmUgX19IQUxfVU5GUkVFWkVfSVdER19EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX0lXREcNCi0jZW5kaWYgLyogU1RNMzJINyAqLw0KLSNkZWZpbmUgX19IQUxfRlJFRVpFX0kyQzFfVElNRU9VVF9EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9JMkMxX1RJTUVPVVQNCi0jZGVmaW5lIF9fSEFMX1VORlJFRVpFX0kyQzFfVElNRU9VVF9EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX0kyQzFfVElNRU9VVA0KLSNkZWZpbmUgX19IQUxfRlJFRVpFX0kyQzJfVElNRU9VVF9EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9JMkMyX1RJTUVPVVQNCi0jZGVmaW5lIF9fSEFMX1VORlJFRVpFX0kyQzJfVElNRU9VVF9EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX0kyQzJfVElNRU9VVA0KLSNkZWZpbmUgX19IQUxfRlJFRVpFX0kyQzNfVElNRU9VVF9EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9JMkMzX1RJTUVPVVQNCi0jZGVmaW5lIF9fSEFMX1VORlJFRVpFX0kyQzNfVElNRU9VVF9EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX0kyQzNfVElNRU9VVA0KLSNkZWZpbmUgX19IQUxfRlJFRVpFX0NBTjFfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfQ0FOMQ0KLSNkZWZpbmUgX19IQUxfVU5GUkVFWkVfQ0FOMV9EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX0NBTjENCi0jZGVmaW5lIF9fSEFMX0ZSRUVaRV9MUFRJTTFfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfTFBUSU0xDQotI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9MUFRJTTFfREJHTUNVIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9MUFRJTTENCi0jZGVmaW5lIF9fSEFMX0ZSRUVaRV9MUFRJTTJfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfTFBUSU0yDQotI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9MUFRJTTJfREJHTUNVIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9MUFRJTTINCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgSEFMX0NPTVBfQWxpYXNlZF9NYWNyb3MgSEFMIENPTVAgQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3INCi0gKiBsZWdhY3kgcHVycG9zZQ0KLSAqIEB7DQotICovDQotI2lmIGRlZmluZWQoU1RNMzJGMykNCi0jZGVmaW5lIENPTVBfU1RBUlQgX19IQUxfQ09NUF9FTkFCTEUNCi0jZGVmaW5lIENPTVBfU1RPUCBfX0hBTF9DT01QX0RJU0FCTEUNCi0jZGVmaW5lIENPTVBfTE9DSyBfX0hBTF9DT01QX0xPQ0sNCi0NCi0jaWYgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkgfHwgXA0KLSAgICBkZWZpbmVkKFNUTTMyRjMwM3g4KSB8fCBkZWZpbmVkKFNUTTMyRjMzNHg4KSB8fCBkZWZpbmVkKFNUTTMyRjMyOHh4KQ0KLSNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX1JJU0lOR19JVF9FTkFCTEUoX19FWFRJTElORV9fKSBcDQotICAoKChfX0VYVElMSU5FX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVAyKSAgICAgICAgICAgIFwNCi0gICAgICAgPyBfX0hBTF9DT01QX0NPTVAyX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCkgICAgXA0KLSAgIDogKChfX0VYVElMSU5FX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVA0KSAgICAgICAgICBcDQotICAgICAgID8gX19IQUxfQ09NUF9DT01QNF9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpICAgIFwNCi0gICAgICAgOiBfX0hBTF9DT01QX0NPTVA2X0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCkpDQotI2RlZmluZSBfX0hBTF9DT01QX0VYVElfUklTSU5HX0lUX0RJU0FCTEUoX19FWFRJTElORV9fKSBcDQotICAoKChfX0VYVElMSU5FX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVAyKSAgICAgICAgICAgICBcDQotICAgICAgID8gX19IQUxfQ09NUF9DT01QMl9FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKSAgICBcDQotICAgOiAoKF9fRVhUSUxJTkVfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDQpICAgICAgICAgICBcDQotICAgICAgID8gX19IQUxfQ09NUF9DT01QNF9FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKSAgICBcDQotICAgICAgIDogX19IQUxfQ09NUF9DT01QNl9FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKSkNCi0jZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9GQUxMSU5HX0lUX0VOQUJMRShfX0VYVElMSU5FX18pIFwNCi0gICgoKF9fRVhUSUxJTkVfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDIpICAgICAgICAgICAgIFwNCi0gICAgICAgPyBfX0hBTF9DT01QX0NPTVAyX0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRSgpICAgIFwNCi0gICA6ICgoX19FWFRJTElORV9fKSA9PSBDT01QX0VYVElfTElORV9DT01QNCkgICAgICAgICAgIFwNCi0gICAgICAgPyBfX0hBTF9DT01QX0NPTVA0X0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRSgpICAgIFwNCi0gICAgICAgOiBfX0hBTF9DT01QX0NPTVA2X0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRSgpKQ0KLSNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX0ZBTExJTkdfSVRfRElTQUJMRShfX0VYVElMSU5FX18pIFwNCi0gICgoKF9fRVhUSUxJTkVfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDIpICAgICAgICAgICAgICBcDQotICAgICAgID8gX19IQUxfQ09NUF9DT01QMl9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCkgICAgXA0KLSAgIDogKChfX0VYVElMSU5FX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVA0KSAgICAgICAgICAgIFwNCi0gICAgICAgPyBfX0hBTF9DT01QX0NPTVA0X0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKSAgICBcDQotICAgICAgIDogX19IQUxfQ09NUF9DT01QNl9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCkpDQotI2RlZmluZSBfX0hBTF9DT01QX0VYVElfRU5BQkxFX0lUKF9fRVhUSUxJTkVfXykgXA0KLSAgKCgoX19FWFRJTElORV9fKSA9PSBDT01QX0VYVElfTElORV9DT01QMikgICAgIFwNCi0gICAgICAgPyBfX0hBTF9DT01QX0NPTVAyX0VYVElfRU5BQkxFX0lUKCkgICAgICBcDQotICAgOiAoKF9fRVhUSUxJTkVfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDQpICAgXA0KLSAgICAgICA/IF9fSEFMX0NPTVBfQ09NUDRfRVhUSV9FTkFCTEVfSVQoKSAgICAgIFwNCi0gICAgICAgOiBfX0hBTF9DT01QX0NPTVA2X0VYVElfRU5BQkxFX0lUKCkpDQotI2RlZmluZSBfX0hBTF9DT01QX0VYVElfRElTQUJMRV9JVChfX0VYVElMSU5FX18pIFwNCi0gICgoKF9fRVhUSUxJTkVfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDIpICAgICAgXA0KLSAgICAgICA/IF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9ESVNBQkxFX0lUKCkgICAgICBcDQotICAgOiAoKF9fRVhUSUxJTkVfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDQpICAgIFwNCi0gICAgICAgPyBfX0hBTF9DT01QX0NPTVA0X0VYVElfRElTQUJMRV9JVCgpICAgICAgXA0KLSAgICAgICA6IF9fSEFMX0NPTVBfQ09NUDZfRVhUSV9ESVNBQkxFX0lUKCkpDQotI2RlZmluZSBfX0hBTF9DT01QX0VYVElfR0VUX0ZMQUcoX19GTEFHX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKChfX0ZMQUdfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDIpICAgPyBfX0hBTF9DT01QX0NPTVAyX0VYVElfR0VUX0ZMQUcoKSBcDQotICAgOiAoKF9fRkxBR19fKSA9PSBDT01QX0VYVElfTElORV9DT01QNCkgPyBfX0hBTF9DT01QX0NPTVA0X0VYVElfR0VUX0ZMQUcoKSBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfX0hBTF9DT01QX0NPTVA2X0VYVElfR0VUX0ZMQUcoKSkNCi0jZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9DTEVBUl9GTEFHKF9fRkxBR19fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoKF9fRkxBR19fKSA9PSBDT01QX0VYVElfTElORV9DT01QMikgPyBfX0hBTF9DT01QX0NPTVAyX0VYVElfQ0xFQVJfRkxBRygpIFwNCi0gICA6ICgoX19GTEFHX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVA0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgPyBfX0hBTF9DT01QX0NPTVA0X0VYVElfQ0xFQVJfRkxBRygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgOiBfX0hBTF9DT01QX0NPTVA2X0VYVElfQ0xFQVJfRkxBRygpKQ0KLSNlbmRpZg0KLSNpZiBkZWZpbmVkKFNUTTMyRjMwMnhFKSB8fCBkZWZpbmVkKFNUTTMyRjMwMnhDKQ0KLSNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX1JJU0lOR19JVF9FTkFCTEUoX19FWFRJTElORV9fKSBcDQotICAoKChfX0VYVElMSU5FX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVAxKSAgICAgICAgICAgIFwNCi0gICAgICAgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCkgICAgXA0KLSAgIDogKChfX0VYVElMSU5FX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVAyKSAgICAgICAgICBcDQotICAgICAgID8gX19IQUxfQ09NUF9DT01QMl9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpICAgIFwNCi0gICA6ICgoX19FWFRJTElORV9fKSA9PSBDT01QX0VYVElfTElORV9DT01QNCkgICAgICAgICAgXA0KLSAgICAgICA/IF9fSEFMX0NPTVBfQ09NUDRfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKSAgICBcDQotICAgICAgIDogX19IQUxfQ09NUF9DT01QNl9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpKQ0KLSNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX1JJU0lOR19JVF9ESVNBQkxFKF9fRVhUSUxJTkVfXykgXA0KLSAgKCgoX19FWFRJTElORV9fKSA9PSBDT01QX0VYVElfTElORV9DT01QMSkgICAgICAgICAgICAgXA0KLSAgICAgICA/IF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCkgICAgXA0KLSAgIDogKChfX0VYVElMSU5FX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVAyKSAgICAgICAgICAgXA0KLSAgICAgICA/IF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCkgICAgXA0KLSAgIDogKChfX0VYVElMSU5FX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVA0KSAgICAgICAgICAgXA0KLSAgICAgICA/IF9fSEFMX0NPTVBfQ09NUDRfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCkgICAgXA0KLSAgICAgICA6IF9fSEFMX0NPTVBfQ09NUDZfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCkpDQotI2RlZmluZSBfX0hBTF9DT01QX0VYVElfRkFMTElOR19JVF9FTkFCTEUoX19FWFRJTElORV9fKSBcDQotICAoKChfX0VYVElMSU5FX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVAxKSAgICAgICAgICAgICBcDQotICAgICAgID8gX19IQUxfQ09NUF9DT01QMV9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKSAgICBcDQotICAgOiAoKF9fRVhUSUxJTkVfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDIpICAgICAgICAgICBcDQotICAgICAgID8gX19IQUxfQ09NUF9DT01QMl9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKSAgICBcDQotICAgOiAoKF9fRVhUSUxJTkVfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDQpICAgICAgICAgICBcDQotICAgICAgID8gX19IQUxfQ09NUF9DT01QNF9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKSAgICBcDQotICAgICAgIDogX19IQUxfQ09NUF9DT01QNl9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKSkNCi0jZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9GQUxMSU5HX0lUX0RJU0FCTEUoX19FWFRJTElORV9fKSBcDQotICAoKChfX0VYVElMSU5FX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVAxKSAgICAgICAgICAgICAgXA0KLSAgICAgICA/IF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpICAgIFwNCi0gICA6ICgoX19FWFRJTElORV9fKSA9PSBDT01QX0VYVElfTElORV9DT01QMikgICAgICAgICAgICBcDQotICAgICAgID8gX19IQUxfQ09NUF9DT01QMl9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCkgICAgXA0KLSAgIDogKChfX0VYVElMSU5FX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVA0KSAgICAgICAgICAgIFwNCi0gICAgICAgPyBfX0hBTF9DT01QX0NPTVA0X0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKSAgICBcDQotICAgICAgIDogX19IQUxfQ09NUF9DT01QNl9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCkpDQotI2RlZmluZSBfX0hBTF9DT01QX0VYVElfRU5BQkxFX0lUKF9fRVhUSUxJTkVfXykgXA0KLSAgKCgoX19FWFRJTElORV9fKSA9PSBDT01QX0VYVElfTElORV9DT01QMSkgICAgIFwNCi0gICAgICAgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfRU5BQkxFX0lUKCkgICAgICBcDQotICAgOiAoKF9fRVhUSUxJTkVfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDIpICAgXA0KLSAgICAgICA/IF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9FTkFCTEVfSVQoKSAgICAgIFwNCi0gICA6ICgoX19FWFRJTElORV9fKSA9PSBDT01QX0VYVElfTElORV9DT01QNCkgICBcDQotICAgICAgID8gX19IQUxfQ09NUF9DT01QNF9FWFRJX0VOQUJMRV9JVCgpICAgICAgXA0KLSAgICAgICA6IF9fSEFMX0NPTVBfQ09NUDZfRVhUSV9FTkFCTEVfSVQoKSkNCi0jZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9ESVNBQkxFX0lUKF9fRVhUSUxJTkVfXykgXA0KLSAgKCgoX19FWFRJTElORV9fKSA9PSBDT01QX0VYVElfTElORV9DT01QMSkgICAgICBcDQotICAgICAgID8gX19IQUxfQ09NUF9DT01QMV9FWFRJX0RJU0FCTEVfSVQoKSAgICAgIFwNCi0gICA6ICgoX19FWFRJTElORV9fKSA9PSBDT01QX0VYVElfTElORV9DT01QMikgICAgXA0KLSAgICAgICA/IF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9ESVNBQkxFX0lUKCkgICAgICBcDQotICAgOiAoKF9fRVhUSUxJTkVfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDQpICAgIFwNCi0gICAgICAgPyBfX0hBTF9DT01QX0NPTVA0X0VYVElfRElTQUJMRV9JVCgpICAgICAgXA0KLSAgICAgICA6IF9fSEFMX0NPTVBfQ09NUDZfRVhUSV9ESVNBQkxFX0lUKCkpDQotI2RlZmluZSBfX0hBTF9DT01QX0VYVElfR0VUX0ZMQUcoX19GTEFHX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKChfX0ZMQUdfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDEpICAgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfR0VUX0ZMQUcoKSBcDQotICAgOiAoKF9fRkxBR19fKSA9PSBDT01QX0VYVElfTElORV9DT01QMikgPyBfX0hBTF9DT01QX0NPTVAyX0VYVElfR0VUX0ZMQUcoKSBcDQotICAgOiAoKF9fRkxBR19fKSA9PSBDT01QX0VYVElfTElORV9DT01QNCkgPyBfX0hBTF9DT01QX0NPTVA0X0VYVElfR0VUX0ZMQUcoKSBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfX0hBTF9DT01QX0NPTVA2X0VYVElfR0VUX0ZMQUcoKSkNCi0jZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9DTEVBUl9GTEFHKF9fRkxBR19fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKCgoX19GTEFHX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVAxKSAgID8gX19IQUxfQ09NUF9DT01QMV9FWFRJX0NMRUFSX0ZMQUcoKSBcDQotICAgOiAoKF9fRkxBR19fKSA9PSBDT01QX0VYVElfTElORV9DT01QMikgPyBfX0hBTF9DT01QX0NPTVAyX0VYVElfQ0xFQVJfRkxBRygpIFwNCi0gICA6ICgoX19GTEFHX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVA0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICA/IF9fSEFMX0NPTVBfQ09NUDRfRVhUSV9DTEVBUl9GTEFHKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgIDogX19IQUxfQ09NUF9DT01QNl9FWFRJX0NMRUFSX0ZMQUcoKSkNCi0jZW5kaWYNCi0jaWYgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkgfHwgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgXA0KLSAgICBkZWZpbmVkKFNUTTMyRjM1OHh4KQ0KLSNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX1JJU0lOR19JVF9FTkFCTEUoX19FWFRJTElORV9fKSBcDQotICAoKChfX0VYVElMSU5FX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVAxKSAgICAgICAgICAgIFwNCi0gICAgICAgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCkgICAgXA0KLSAgIDogKChfX0VYVElMSU5FX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVAyKSAgICAgICAgICBcDQotICAgICAgID8gX19IQUxfQ09NUF9DT01QMl9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpICAgIFwNCi0gICA6ICgoX19FWFRJTElORV9fKSA9PSBDT01QX0VYVElfTElORV9DT01QMykgICAgICAgICAgXA0KLSAgICAgICA/IF9fSEFMX0NPTVBfQ09NUDNfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKSAgICBcDQotICAgOiAoKF9fRVhUSUxJTkVfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDQpICAgICAgICAgIFwNCi0gICAgICAgPyBfX0hBTF9DT01QX0NPTVA0X0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCkgICAgXA0KLSAgIDogKChfX0VYVElMSU5FX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVA1KSAgICAgICAgICBcDQotICAgICAgID8gX19IQUxfQ09NUF9DT01QNV9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpICAgIFwNCi0gICA6ICgoX19FWFRJTElORV9fKSA9PSBDT01QX0VYVElfTElORV9DT01QNikgICAgICAgICAgXA0KLSAgICAgICA/IF9fSEFMX0NPTVBfQ09NUDZfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKSAgICBcDQotICAgICAgIDogX19IQUxfQ09NUF9DT01QN19FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpKQ0KLSNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX1JJU0lOR19JVF9ESVNBQkxFKF9fRVhUSUxJTkVfXykgXA0KLSAgKCgoX19FWFRJTElORV9fKSA9PSBDT01QX0VYVElfTElORV9DT01QMSkgICAgICAgICAgICAgXA0KLSAgICAgICA/IF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCkgICAgXA0KLSAgIDogKChfX0VYVElMSU5FX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVAyKSAgICAgICAgICAgXA0KLSAgICAgICA/IF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCkgICAgXA0KLSAgIDogKChfX0VYVElMSU5FX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVAzKSAgICAgICAgICAgXA0KLSAgICAgICA/IF9fSEFMX0NPTVBfQ09NUDNfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCkgICAgXA0KLSAgIDogKChfX0VYVElMSU5FX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVA0KSAgICAgICAgICAgXA0KLSAgICAgICA/IF9fSEFMX0NPTVBfQ09NUDRfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCkgICAgXA0KLSAgIDogKChfX0VYVElMSU5FX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVA1KSAgICAgICAgICAgXA0KLSAgICAgICA/IF9fSEFMX0NPTVBfQ09NUDVfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCkgICAgXA0KLSAgIDogKChfX0VYVElMSU5FX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVA2KSAgICAgICAgICAgXA0KLSAgICAgICA/IF9fSEFMX0NPTVBfQ09NUDZfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCkgICAgXA0KLSAgICAgICA6IF9fSEFMX0NPTVBfQ09NUDdfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCkpDQotI2RlZmluZSBfX0hBTF9DT01QX0VYVElfRkFMTElOR19JVF9FTkFCTEUoX19FWFRJTElORV9fKSBcDQotICAoKChfX0VYVElMSU5FX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVAxKSAgICAgICAgICAgICBcDQotICAgICAgID8gX19IQUxfQ09NUF9DT01QMV9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKSAgICBcDQotICAgOiAoKF9fRVhUSUxJTkVfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDIpICAgICAgICAgICBcDQotICAgICAgID8gX19IQUxfQ09NUF9DT01QMl9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKSAgICBcDQotICAgOiAoKF9fRVhUSUxJTkVfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDMpICAgICAgICAgICBcDQotICAgICAgID8gX19IQUxfQ09NUF9DT01QM19FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKSAgICBcDQotICAgOiAoKF9fRVhUSUxJTkVfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDQpICAgICAgICAgICBcDQotICAgICAgID8gX19IQUxfQ09NUF9DT01QNF9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKSAgICBcDQotICAgOiAoKF9fRVhUSUxJTkVfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDUpICAgICAgICAgICBcDQotICAgICAgID8gX19IQUxfQ09NUF9DT01QNV9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKSAgICBcDQotICAgOiAoKF9fRVhUSUxJTkVfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDYpICAgICAgICAgICBcDQotICAgICAgID8gX19IQUxfQ09NUF9DT01QNl9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKSAgICBcDQotICAgICAgIDogX19IQUxfQ09NUF9DT01QN19FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKSkNCi0jZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9GQUxMSU5HX0lUX0RJU0FCTEUoX19FWFRJTElORV9fKSBcDQotICAoKChfX0VYVElMSU5FX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVAxKSAgICAgICAgICAgICAgXA0KLSAgICAgICA/IF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpICAgIFwNCi0gICA6ICgoX19FWFRJTElORV9fKSA9PSBDT01QX0VYVElfTElORV9DT01QMikgICAgICAgICAgICBcDQotICAgICAgID8gX19IQUxfQ09NUF9DT01QMl9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCkgICAgXA0KLSAgIDogKChfX0VYVElMSU5FX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVAzKSAgICAgICAgICAgIFwNCi0gICAgICAgPyBfX0hBTF9DT01QX0NPTVAzX0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKSAgICBcDQotICAgOiAoKF9fRVhUSUxJTkVfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDQpICAgICAgICAgICAgXA0KLSAgICAgICA/IF9fSEFMX0NPTVBfQ09NUDRfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpICAgIFwNCi0gICA6ICgoX19FWFRJTElORV9fKSA9PSBDT01QX0VYVElfTElORV9DT01QNSkgICAgICAgICAgICBcDQotICAgICAgID8gX19IQUxfQ09NUF9DT01QNV9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCkgICAgXA0KLSAgIDogKChfX0VYVElMSU5FX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVA2KSAgICAgICAgICAgIFwNCi0gICAgICAgPyBfX0hBTF9DT01QX0NPTVA2X0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKSAgICBcDQotICAgICAgIDogX19IQUxfQ09NUF9DT01QN19FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCkpDQotI2RlZmluZSBfX0hBTF9DT01QX0VYVElfRU5BQkxFX0lUKF9fRVhUSUxJTkVfXykgXA0KLSAgKCgoX19FWFRJTElORV9fKSA9PSBDT01QX0VYVElfTElORV9DT01QMSkgICAgIFwNCi0gICAgICAgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfRU5BQkxFX0lUKCkgICAgICBcDQotICAgOiAoKF9fRVhUSUxJTkVfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDIpICAgXA0KLSAgICAgICA/IF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9FTkFCTEVfSVQoKSAgICAgIFwNCi0gICA6ICgoX19FWFRJTElORV9fKSA9PSBDT01QX0VYVElfTElORV9DT01QMykgICBcDQotICAgICAgID8gX19IQUxfQ09NUF9DT01QM19FWFRJX0VOQUJMRV9JVCgpICAgICAgXA0KLSAgIDogKChfX0VYVElMSU5FX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVA0KSAgIFwNCi0gICAgICAgPyBfX0hBTF9DT01QX0NPTVA0X0VYVElfRU5BQkxFX0lUKCkgICAgICBcDQotICAgOiAoKF9fRVhUSUxJTkVfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDUpICAgXA0KLSAgICAgICA/IF9fSEFMX0NPTVBfQ09NUDVfRVhUSV9FTkFCTEVfSVQoKSAgICAgIFwNCi0gICA6ICgoX19FWFRJTElORV9fKSA9PSBDT01QX0VYVElfTElORV9DT01QNikgICBcDQotICAgICAgID8gX19IQUxfQ09NUF9DT01QNl9FWFRJX0VOQUJMRV9JVCgpICAgICAgXA0KLSAgICAgICA6IF9fSEFMX0NPTVBfQ09NUDdfRVhUSV9FTkFCTEVfSVQoKSkNCi0jZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9ESVNBQkxFX0lUKF9fRVhUSUxJTkVfXykgXA0KLSAgKCgoX19FWFRJTElORV9fKSA9PSBDT01QX0VYVElfTElORV9DT01QMSkgICAgICBcDQotICAgICAgID8gX19IQUxfQ09NUF9DT01QMV9FWFRJX0RJU0FCTEVfSVQoKSAgICAgIFwNCi0gICA6ICgoX19FWFRJTElORV9fKSA9PSBDT01QX0VYVElfTElORV9DT01QMikgICAgXA0KLSAgICAgICA/IF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9ESVNBQkxFX0lUKCkgICAgICBcDQotICAgOiAoKF9fRVhUSUxJTkVfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDMpICAgIFwNCi0gICAgICAgPyBfX0hBTF9DT01QX0NPTVAzX0VYVElfRElTQUJMRV9JVCgpICAgICAgXA0KLSAgIDogKChfX0VYVElMSU5FX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVA0KSAgICBcDQotICAgICAgID8gX19IQUxfQ09NUF9DT01QNF9FWFRJX0RJU0FCTEVfSVQoKSAgICAgIFwNCi0gICA6ICgoX19FWFRJTElORV9fKSA9PSBDT01QX0VYVElfTElORV9DT01QNSkgICAgXA0KLSAgICAgICA/IF9fSEFMX0NPTVBfQ09NUDVfRVhUSV9ESVNBQkxFX0lUKCkgICAgICBcDQotICAgOiAoKF9fRVhUSUxJTkVfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDYpICAgIFwNCi0gICAgICAgPyBfX0hBTF9DT01QX0NPTVA2X0VYVElfRElTQUJMRV9JVCgpICAgICAgXA0KLSAgICAgICA6IF9fSEFMX0NPTVBfQ09NUDdfRVhUSV9ESVNBQkxFX0lUKCkpDQotI2RlZmluZSBfX0hBTF9DT01QX0VYVElfR0VUX0ZMQUcoX19GTEFHX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKChfX0ZMQUdfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDEpICAgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfR0VUX0ZMQUcoKSBcDQotICAgOiAoKF9fRkxBR19fKSA9PSBDT01QX0VYVElfTElORV9DT01QMikgPyBfX0hBTF9DT01QX0NPTVAyX0VYVElfR0VUX0ZMQUcoKSBcDQotICAgOiAoKF9fRkxBR19fKSA9PSBDT01QX0VYVElfTElORV9DT01QMykgPyBfX0hBTF9DT01QX0NPTVAzX0VYVElfR0VUX0ZMQUcoKSBcDQotICAgOiAoKF9fRkxBR19fKSA9PSBDT01QX0VYVElfTElORV9DT01QNCkgPyBfX0hBTF9DT01QX0NPTVA0X0VYVElfR0VUX0ZMQUcoKSBcDQotICAgOiAoKF9fRkxBR19fKSA9PSBDT01QX0VYVElfTElORV9DT01QNSkgPyBfX0hBTF9DT01QX0NPTVA1X0VYVElfR0VUX0ZMQUcoKSBcDQotICAgOiAoKF9fRkxBR19fKSA9PSBDT01QX0VYVElfTElORV9DT01QNikgPyBfX0hBTF9DT01QX0NPTVA2X0VYVElfR0VUX0ZMQUcoKSBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfX0hBTF9DT01QX0NPTVA3X0VYVElfR0VUX0ZMQUcoKSkNCi0jZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9DTEVBUl9GTEFHKF9fRkxBR19fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKCgoX19GTEFHX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVAxKSAgID8gX19IQUxfQ09NUF9DT01QMV9FWFRJX0NMRUFSX0ZMQUcoKSBcDQotICAgOiAoKF9fRkxBR19fKSA9PSBDT01QX0VYVElfTElORV9DT01QMikgPyBfX0hBTF9DT01QX0NPTVAyX0VYVElfQ0xFQVJfRkxBRygpIFwNCi0gICA6ICgoX19GTEFHX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVAzKSA/IF9fSEFMX0NPTVBfQ09NUDNfRVhUSV9DTEVBUl9GTEFHKCkgXA0KLSAgIDogKChfX0ZMQUdfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDQpID8gX19IQUxfQ09NUF9DT01QNF9FWFRJX0NMRUFSX0ZMQUcoKSBcDQotICAgOiAoKF9fRkxBR19fKSA9PSBDT01QX0VYVElfTElORV9DT01QNSkgPyBfX0hBTF9DT01QX0NPTVA1X0VYVElfQ0xFQVJfRkxBRygpIFwNCi0gICA6ICgoX19GTEFHX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVA2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICA/IF9fSEFMX0NPTVBfQ09NUDZfRVhUSV9DTEVBUl9GTEFHKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgIDogX19IQUxfQ09NUF9DT01QN19FWFRJX0NMRUFSX0ZMQUcoKSkNCi0jZW5kaWYNCi0jaWYgZGVmaW5lZChTVE0zMkYzNzN4QykgfHwgZGVmaW5lZChTVE0zMkYzNzh4eCkNCi0jZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9SSVNJTkdfSVRfRU5BQkxFKF9fRVhUSUxJTkVfXykgXA0KLSAgKCgoX19FWFRJTElORV9fKSA9PSBDT01QX0VYVElfTElORV9DT01QMSkgICAgICAgICAgICBcDQotICAgICAgID8gX19IQUxfQ09NUF9DT01QMV9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpICAgIFwNCi0gICAgICAgOiBfX0hBTF9DT01QX0NPTVAyX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCkpDQotI2RlZmluZSBfX0hBTF9DT01QX0VYVElfUklTSU5HX0lUX0RJU0FCTEUoX19FWFRJTElORV9fKSBcDQotICAoKChfX0VYVElMSU5FX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVAxKSAgICAgICAgICAgICBcDQotICAgICAgID8gX19IQUxfQ09NUF9DT01QMV9FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKSAgICBcDQotICAgICAgIDogX19IQUxfQ09NUF9DT01QMl9FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKSkNCi0jZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9GQUxMSU5HX0lUX0VOQUJMRShfX0VYVElMSU5FX18pIFwNCi0gICgoKF9fRVhUSUxJTkVfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDEpICAgICAgICAgICAgIFwNCi0gICAgICAgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRSgpICAgIFwNCi0gICAgICAgOiBfX0hBTF9DT01QX0NPTVAyX0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRSgpKQ0KLSNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX0ZBTExJTkdfSVRfRElTQUJMRShfX0VYVElMSU5FX18pIFwNCi0gICgoKF9fRVhUSUxJTkVfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDEpICAgICAgICAgICAgICBcDQotICAgICAgID8gX19IQUxfQ09NUF9DT01QMV9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCkgICAgXA0KLSAgICAgICA6IF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpKQ0KLSNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX0VOQUJMRV9JVChfX0VYVElMSU5FX18pIFwNCi0gICgoKF9fRVhUSUxJTkVfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDEpICAgICBcDQotICAgICAgID8gX19IQUxfQ09NUF9DT01QMV9FWFRJX0VOQUJMRV9JVCgpICAgICAgXA0KLSAgICAgICA6IF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9FTkFCTEVfSVQoKSkNCi0jZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9ESVNBQkxFX0lUKF9fRVhUSUxJTkVfXykgXA0KLSAgKCgoX19FWFRJTElORV9fKSA9PSBDT01QX0VYVElfTElORV9DT01QMSkgICAgICBcDQotICAgICAgID8gX19IQUxfQ09NUF9DT01QMV9FWFRJX0RJU0FCTEVfSVQoKSAgICAgIFwNCi0gICAgICAgOiBfX0hBTF9DT01QX0NPTVAyX0VYVElfRElTQUJMRV9JVCgpKQ0KLSNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX0dFVF9GTEFHKF9fRkxBR19fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoKF9fRkxBR19fKSA9PSBDT01QX0VYVElfTElORV9DT01QMSkgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfR0VUX0ZMQUcoKSBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX19IQUxfQ09NUF9DT01QMl9FWFRJX0dFVF9GTEFHKCkpDQotI2RlZmluZSBfX0hBTF9DT01QX0VYVElfQ0xFQVJfRkxBRyhfX0ZMQUdfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKChfX0ZMQUdfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDEpID8gX19IQUxfQ09NUF9DT01QMV9FWFRJX0NMRUFSX0ZMQUcoKSBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX19IQUxfQ09NUF9DT01QMl9FWFRJX0NMRUFSX0ZMQUcoKSkNCi0jZW5kaWYNCi0jZWxzZQ0KLSNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX1JJU0lOR19JVF9FTkFCTEUoX19FWFRJTElORV9fKSBcDQotICAoKChfX0VYVElMSU5FX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVAxKSAgICAgICAgICAgIFwNCi0gICAgICAgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCkgICAgXA0KLSAgICAgICA6IF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKSkNCi0jZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9SSVNJTkdfSVRfRElTQUJMRShfX0VYVElMSU5FX18pIFwNCi0gICgoKF9fRVhUSUxJTkVfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDEpICAgICAgICAgICAgIFwNCi0gICAgICAgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpICAgIFwNCi0gICAgICAgOiBfX0hBTF9DT01QX0NPTVAyX0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpKQ0KLSNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX0ZBTExJTkdfSVRfRU5BQkxFKF9fRVhUSUxJTkVfXykgXA0KLSAgKCgoX19FWFRJTElORV9fKSA9PSBDT01QX0VYVElfTElORV9DT01QMSkgICAgICAgICAgICAgXA0KLSAgICAgICA/IF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCkgICAgXA0KLSAgICAgICA6IF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCkpDQotI2RlZmluZSBfX0hBTF9DT01QX0VYVElfRkFMTElOR19JVF9ESVNBQkxFKF9fRVhUSUxJTkVfXykgXA0KLSAgKCgoX19FWFRJTElORV9fKSA9PSBDT01QX0VYVElfTElORV9DT01QMSkgICAgICAgICAgICAgIFwNCi0gICAgICAgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKSAgICBcDQotICAgICAgIDogX19IQUxfQ09NUF9DT01QMl9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCkpDQotI2RlZmluZSBfX0hBTF9DT01QX0VYVElfRU5BQkxFX0lUKF9fRVhUSUxJTkVfXykgXA0KLSAgKCgoX19FWFRJTElORV9fKSA9PSBDT01QX0VYVElfTElORV9DT01QMSkgICAgIFwNCi0gICAgICAgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfRU5BQkxFX0lUKCkgICAgICBcDQotICAgICAgIDogX19IQUxfQ09NUF9DT01QMl9FWFRJX0VOQUJMRV9JVCgpKQ0KLSNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX0RJU0FCTEVfSVQoX19FWFRJTElORV9fKSBcDQotICAoKChfX0VYVElMSU5FX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVAxKSAgICAgIFwNCi0gICAgICAgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfRElTQUJMRV9JVCgpICAgICAgXA0KLSAgICAgICA6IF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9ESVNBQkxFX0lUKCkpDQotI2RlZmluZSBfX0hBTF9DT01QX0VYVElfR0VUX0ZMQUcoX19GTEFHX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKCgoX19GTEFHX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVAxKSA/IF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9HRVRfRkxBRygpIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfX0hBTF9DT01QX0NPTVAyX0VYVElfR0VUX0ZMQUcoKSkNCi0jZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9DTEVBUl9GTEFHKF9fRkxBR19fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoKF9fRkxBR19fKSA9PSBDT01QX0VYVElfTElORV9DT01QMSkgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfQ0xFQVJfRkxBRygpIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfX0hBTF9DT01QX0NPTVAyX0VYVElfQ0xFQVJfRkxBRygpKQ0KLSNlbmRpZg0KLQ0KLSNkZWZpbmUgX19IQUxfQ09NUF9HRVRfRVhUSV9MSU5FIENPTVBfR0VUX0VYVElfTElORQ0KLQ0KLSNpZiBkZWZpbmVkKFNUTTMyTDApIHx8IGRlZmluZWQoU1RNMzJMNCkNCi0vKiBOb3RlOiBPbiB0aGVzZSBTVE0zMiBmYW1pbGllcywgdGhlIG9ubHkgYXJndW1lbnQgb2YgdGhpcyBtYWNybyAgICAgICAgICAgICAqLw0KLS8qICAgICAgIGlzIENPTVBfRkxBR19MT0NLLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotLyogICAgICAgVGhpcyBtYWNybyBpcyByZXBsYWNlZCBieSBfX0hBTF9DT01QX0lTX0xPQ0tFRCB3aXRoIG9ubHkgSEFMIGhhbmRsZSAgKi8NCi0vKiAgICAgICBhcmd1bWVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgX19IQUxfQ09NUF9HRVRfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgXA0KLSAgKF9fSEFMX0NPTVBfSVNfTE9DS0VEKF9fSEFORExFX18pKQ0KLSNlbmRpZg0KLS8qKg0KLSAqIEB9DQotICovDQotDQotI2lmIGRlZmluZWQoU1RNMzJMMCkgfHwgZGVmaW5lZChTVE0zMkw0KQ0KLS8qKiBAZGVmZ3JvdXAgSEFMX0NPTVBfQWxpYXNlZF9GdW5jdGlvbnMgSEFMIENPTVAgQWxpYXNlZCBGdW5jdGlvbnMgbWFpbnRhaW5lZA0KLSAqIGZvciBsZWdhY3kgcHVycG9zZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBIQUxfQ09NUF9TdGFydF9JVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIEhBTF9DT01QX1N0YXJ0IC8qIEZ1bmN0aW9uIGNvbnNpZGVyZWQgYXMgbGVnYWN5IGFzIEVYVEkgZXZlbnQgb3IgSVQgXA0KLSAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBpcyBkb25lIGludG8gSEFMX0NPTVBfSW5pdCgpICovDQotI2RlZmluZSBIQUxfQ09NUF9TdG9wX0lUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgSEFMX0NPTVBfU3RvcCAvKiBGdW5jdGlvbiBjb25zaWRlcmVkIGFzIGxlZ2FjeSBhcyBFWFRJIGV2ZW50IG9yIElUIFwNCi0gICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBpcyBkb25lIGludG8gSEFMX0NPTVBfSW5pdCgpICovDQotLyoqDQotICogQH0NCi0gKi8NCi0jZW5kaWYNCi0NCi0vKiogQGRlZmdyb3VwIEhBTF9EQUNfQWxpYXNlZF9NYWNyb3MgSEFMIERBQyBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvcg0KLSAqIGxlZ2FjeSBwdXJwb3NlDQotICogQHsNCi0gKi8NCi0NCi0jZGVmaW5lIElTX0RBQ19XQVZFKFdBVkUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoKFdBVkUpID09IERBQ19XQVZFX05PTkUpIHx8ICgoV0FWRSkgPT0gREFDX1dBVkVfTk9JU0UpIHx8IFwNCi0gICAoKFdBVkUpID09IERBQ19XQVZFX1RSSUFOR0xFKSkNCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgSEFMX0ZMQVNIX0FsaWFzZWRfTWFjcm9zIEhBTCBGTEFTSCBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvcg0KLSAqIGxlZ2FjeSBwdXJwb3NlDQotICogQHsNCi0gKi8NCi0NCi0jZGVmaW5lIElTX1dSUEFSRUEgSVNfT0JfV1JQQVJFQQ0KLSNkZWZpbmUgSVNfVFlQRVBST0dSQU0gSVNfRkxBU0hfVFlQRVBST0dSQU0NCi0jZGVmaW5lIElTX1RZUEVQUk9HUkFNRkxBU0ggSVNfRkxBU0hfVFlQRVBST0dSQU0NCi0jZGVmaW5lIElTX1RZUEVFUkFTRSBJU19GTEFTSF9UWVBFRVJBU0UNCi0jZGVmaW5lIElTX05CU0VDVE9SUyBJU19GTEFTSF9OQlNFQ1RPUlMNCi0jZGVmaW5lIElTX09CX1dER19TT1VSQ0UgSVNfT0JfSVdER19TT1VSQ0UNCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgSEFMX0kyQ19BbGlhc2VkX01hY3JvcyBIQUwgSTJDIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yDQotICogbGVnYWN5IHB1cnBvc2UNCi0gKiBAew0KLSAqLw0KLQ0KLSNkZWZpbmUgX19IQUxfSTJDX1JFU0VUX0NSMiBJMkNfUkVTRVRfQ1IyDQotI2RlZmluZSBfX0hBTF9JMkNfR0VORVJBVEVfU1RBUlQgSTJDX0dFTkVSQVRFX1NUQVJUDQotI2lmIGRlZmluZWQoU1RNMzJGMSkNCi0jZGVmaW5lIF9fSEFMX0kyQ19GUkVRX1JBTkdFIEkyQ19GUkVRUkFOR0UNCi0jZWxzZQ0KLSNkZWZpbmUgX19IQUxfSTJDX0ZSRVFfUkFOR0UgSTJDX0ZSRVFfUkFOR0UNCi0jZW5kaWYgLyogU1RNMzJGMSAqLw0KLSNkZWZpbmUgX19IQUxfSTJDX1JJU0VfVElNRSBJMkNfUklTRV9USU1FDQotI2RlZmluZSBfX0hBTF9JMkNfU1BFRURfU1RBTkRBUkQgSTJDX1NQRUVEX1NUQU5EQVJEDQotI2RlZmluZSBfX0hBTF9JMkNfU1BFRURfRkFTVCBJMkNfU1BFRURfRkFTVA0KLSNkZWZpbmUgX19IQUxfSTJDX1NQRUVEIEkyQ19TUEVFRA0KLSNkZWZpbmUgX19IQUxfSTJDXzdCSVRfQUREX1dSSVRFIEkyQ183QklUX0FERF9XUklURQ0KLSNkZWZpbmUgX19IQUxfSTJDXzdCSVRfQUREX1JFQUQgSTJDXzdCSVRfQUREX1JFQUQNCi0jZGVmaW5lIF9fSEFMX0kyQ18xMEJJVF9BRERSRVNTIEkyQ18xMEJJVF9BRERSRVNTDQotI2RlZmluZSBfX0hBTF9JMkNfMTBCSVRfSEVBREVSX1dSSVRFIEkyQ18xMEJJVF9IRUFERVJfV1JJVEUNCi0jZGVmaW5lIF9fSEFMX0kyQ18xMEJJVF9IRUFERVJfUkVBRCBJMkNfMTBCSVRfSEVBREVSX1JFQUQNCi0jZGVmaW5lIF9fSEFMX0kyQ19NRU1fQUREX01TQiBJMkNfTUVNX0FERF9NU0INCi0jZGVmaW5lIF9fSEFMX0kyQ19NRU1fQUREX0xTQiBJMkNfTUVNX0FERF9MU0INCi0jZGVmaW5lIF9fSEFMX0kyQ19GUkVRUkFOR0UgSTJDX0ZSRVFSQU5HRQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBIQUxfSTJTX0FsaWFzZWRfTWFjcm9zIEhBTCBJMlMgQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3INCi0gKiBsZWdhY3kgcHVycG9zZQ0KLSAqIEB7DQotICovDQotDQotI2RlZmluZSBJU19JMlNfSU5TVEFOQ0UgSVNfSTJTX0FMTF9JTlNUQU5DRQ0KLSNkZWZpbmUgSVNfSTJTX0lOU1RBTkNFX0VYVCBJU19JMlNfQUxMX0lOU1RBTkNFX0VYVA0KLQ0KLSNpZiBkZWZpbmVkKFNUTTMySDcpDQotI2RlZmluZSBfX0hBTF9JMlNfQ0xFQVJfRlJFRkxBRyBfX0hBTF9JMlNfQ0xFQVJfVElGUkVGTEFHDQotI2VuZGlmDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEhBTF9JUkRBX0FsaWFzZWRfTWFjcm9zIEhBTCBJUkRBIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yDQotICogbGVnYWN5IHB1cnBvc2UNCi0gKiBAew0KLSAqLw0KLQ0KLSNkZWZpbmUgX19JUkRBX0RJU0FCTEUgX19IQUxfSVJEQV9ESVNBQkxFDQotI2RlZmluZSBfX0lSREFfRU5BQkxFIF9fSEFMX0lSREFfRU5BQkxFDQotDQotI2RlZmluZSBfX0hBTF9JUkRBX0dFVENMT0NLU09VUkNFIElSREFfR0VUQ0xPQ0tTT1VSQ0UNCi0jZGVmaW5lIF9fSEFMX0lSREFfTUFTS19DT01QVVRBVElPTiBJUkRBX01BU0tfQ09NUFVUQVRJT04NCi0jZGVmaW5lIF9fSVJEQV9HRVRDTE9DS1NPVVJDRSBJUkRBX0dFVENMT0NLU09VUkNFDQotI2RlZmluZSBfX0lSREFfTUFTS19DT01QVVRBVElPTiBJUkRBX01BU0tfQ09NUFVUQVRJT04NCi0NCi0jZGVmaW5lIElTX0lSREFfT05FQklUX1NBTVBMRSBJU19JUkRBX09ORV9CSVRfU0FNUExFDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEhBTF9JV0RHX0FsaWFzZWRfTWFjcm9zIEhBTCBJV0RHIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yDQotICogbGVnYWN5IHB1cnBvc2UNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgX19IQUxfSVdER19FTkFCTEVfV1JJVEVfQUNDRVNTIElXREdfRU5BQkxFX1dSSVRFX0FDQ0VTUw0KLSNkZWZpbmUgX19IQUxfSVdER19ESVNBQkxFX1dSSVRFX0FDQ0VTUyBJV0RHX0RJU0FCTEVfV1JJVEVfQUNDRVNTDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEhBTF9MUFRJTV9BbGlhc2VkX01hY3JvcyBIQUwgTFBUSU0gQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3INCi0gKiBsZWdhY3kgcHVycG9zZQ0KLSAqIEB7DQotICovDQotDQotI2RlZmluZSBfX0hBTF9MUFRJTV9FTkFCTEVfSU5URVJSVVBUIF9fSEFMX0xQVElNX0VOQUJMRV9JVA0KLSNkZWZpbmUgX19IQUxfTFBUSU1fRElTQUJMRV9JTlRFUlJVUFQgX19IQUxfTFBUSU1fRElTQUJMRV9JVA0KLSNkZWZpbmUgX19IQUxfTFBUSU1fR0VUX0lUU1RBVFVTIF9fSEFMX0xQVElNX0dFVF9JVF9TT1VSQ0UNCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgSEFMX09QQU1QX0FsaWFzZWRfTWFjcm9zIEhBTCBPUEFNUCBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvcg0KLSAqIGxlZ2FjeSBwdXJwb3NlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIF9fT1BBTVBfQ1NSX09QQVhQRCBPUEFNUF9DU1JfT1BBWFBEDQotI2RlZmluZSBfX09QQU1QX0NTUl9TM1NFTFggT1BBTVBfQ1NSX1MzU0VMWA0KLSNkZWZpbmUgX19PUEFNUF9DU1JfUzRTRUxYIE9QQU1QX0NTUl9TNFNFTFgNCi0jZGVmaW5lIF9fT1BBTVBfQ1NSX1M1U0VMWCBPUEFNUF9DU1JfUzVTRUxYDQotI2RlZmluZSBfX09QQU1QX0NTUl9TNlNFTFggT1BBTVBfQ1NSX1M2U0VMWA0KLSNkZWZpbmUgX19PUEFNUF9DU1JfT1BBWENBTF9MIE9QQU1QX0NTUl9PUEFYQ0FMX0wNCi0jZGVmaW5lIF9fT1BBTVBfQ1NSX09QQVhDQUxfSCBPUEFNUF9DU1JfT1BBWENBTF9IDQotI2RlZmluZSBfX09QQU1QX0NTUl9PUEFYTFBNIE9QQU1QX0NTUl9PUEFYTFBNDQotI2RlZmluZSBfX09QQU1QX0NTUl9BTExfU1dJVENIRVMgT1BBTVBfQ1NSX0FMTF9TV0lUQ0hFUw0KLSNkZWZpbmUgX19PUEFNUF9DU1JfQU5BV1NFTFggT1BBTVBfQ1NSX0FOQVdTRUxYDQotI2RlZmluZSBfX09QQU1QX0NTUl9PUEFYQ0FMT1VUIE9QQU1QX0NTUl9PUEFYQ0FMT1VUDQotI2RlZmluZSBfX09QQU1QX09GRlNFVF9UUklNX0JJVFNQT1NJVElPTiBPUEFNUF9PRkZTRVRfVFJJTV9CSVRTUE9TSVRJT04NCi0jZGVmaW5lIF9fT1BBTVBfT0ZGU0VUX1RSSU1fU0VUIE9QQU1QX09GRlNFVF9UUklNX1NFVA0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBIQUxfUFdSX0FsaWFzZWRfTWFjcm9zIEhBTCBQV1IgQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3INCi0gKiBsZWdhY3kgcHVycG9zZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBfX0hBTF9QVkRfRVZFTlRfRElTQUJMRSBfX0hBTF9QV1JfUFZEX0VYVElfRElTQUJMRV9FVkVOVA0KLSNkZWZpbmUgX19IQUxfUFZEX0VWRU5UX0VOQUJMRSBfX0hBTF9QV1JfUFZEX0VYVElfRU5BQkxFX0VWRU5UDQotI2RlZmluZSBfX0hBTF9QVkRfRVhUSV9GQUxMSU5HVFJJR0dFUl9ESVNBQkxFIFwNCi0gIF9fSEFMX1BXUl9QVkRfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRQ0KLSNkZWZpbmUgX19IQUxfUFZEX0VYVElfRkFMTElOR1RSSUdHRVJfRU5BQkxFIFwNCi0gIF9fSEFMX1BXUl9QVkRfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFDQotI2RlZmluZSBfX0hBTF9QVkRfRVhUSV9SSVNJTkdUUklHR0VSX0RJU0FCTEUgXA0KLSAgX19IQUxfUFdSX1BWRF9FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UNCi0jZGVmaW5lIF9fSEFMX1BWRF9FWFRJX1JJU0lOR1RSSUdHRVJfRU5BQkxFIFwNCi0gIF9fSEFMX1BXUl9QVkRfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UNCi0jZGVmaW5lIF9fSEFMX1BWTV9FVkVOVF9ESVNBQkxFIF9fSEFMX1BXUl9QVk1fRVZFTlRfRElTQUJMRQ0KLSNkZWZpbmUgX19IQUxfUFZNX0VWRU5UX0VOQUJMRSBfX0hBTF9QV1JfUFZNX0VWRU5UX0VOQUJMRQ0KLSNkZWZpbmUgX19IQUxfUFZNX0VYVElfRkFMTElOR1RSSUdHRVJfRElTQUJMRSBcDQotICBfX0hBTF9QV1JfUFZNX0VYVElfRkFMTElOR1RSSUdHRVJfRElTQUJMRQ0KLSNkZWZpbmUgX19IQUxfUFZNX0VYVElfRkFMTElOR1RSSUdHRVJfRU5BQkxFIFwNCi0gIF9fSEFMX1BXUl9QVk1fRVhUSV9GQUxMSU5HVFJJR0dFUl9FTkFCTEUNCi0jZGVmaW5lIF9fSEFMX1BWTV9FWFRJX1JJU0lOR1RSSUdHRVJfRElTQUJMRSBcDQotICBfX0hBTF9QV1JfUFZNX0VYVElfUklTSU5HVFJJR0dFUl9ESVNBQkxFDQotI2RlZmluZSBfX0hBTF9QVk1fRVhUSV9SSVNJTkdUUklHR0VSX0VOQUJMRSBcDQotICBfX0hBTF9QV1JfUFZNX0VYVElfUklTSU5HVFJJR0dFUl9FTkFCTEUNCi0jZGVmaW5lIF9fSEFMX1BXUl9JTlRFUk5BTFdBS0VVUF9ESVNBQkxFIEhBTF9QV1JFeF9EaXNhYmxlSW50ZXJuYWxXYWtlVXBMaW5lDQotI2RlZmluZSBfX0hBTF9QV1JfSU5URVJOQUxXQUtFVVBfRU5BQkxFIEhBTF9QV1JFeF9FbmFibGVJbnRlcm5hbFdha2VVcExpbmUNCi0jZGVmaW5lIF9fSEFMX1BXUl9QVUxMX1VQX0RPV05fQ09ORklHX0RJU0FCTEUgXA0KLSAgSEFMX1BXUkV4X0Rpc2FibGVQdWxsVXBQdWxsRG93bkNvbmZpZw0KLSNkZWZpbmUgX19IQUxfUFdSX1BVTExfVVBfRE9XTl9DT05GSUdfRU5BQkxFIFwNCi0gIEhBTF9QV1JFeF9FbmFibGVQdWxsVXBQdWxsRG93bkNvbmZpZw0KLSNkZWZpbmUgX19IQUxfUFdSX1BWRF9FWFRJX0NMRUFSX0VHREVfVFJJR0dFUigpIFwNCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIF9fSEFMX1BXUl9QVkRfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCk7ICAgXA0KLSAgICBfX0hBTF9QV1JfUFZEX0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKTsgIFwNCi0gIH0gd2hpbGUgKDApDQotI2RlZmluZSBfX0hBTF9QV1JfUFZEX0VYVElfRVZFTlRfRElTQUJMRSBfX0hBTF9QV1JfUFZEX0VYVElfRElTQUJMRV9FVkVOVA0KLSNkZWZpbmUgX19IQUxfUFdSX1BWRF9FWFRJX0VWRU5UX0VOQUJMRSBfX0hBTF9QV1JfUFZEX0VYVElfRU5BQkxFX0VWRU5UDQotI2RlZmluZSBfX0hBTF9QV1JfUFZEX0VYVElfRkFMTElOR1RSSUdHRVJfRElTQUJMRSBcDQotICBfX0hBTF9QV1JfUFZEX0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UNCi0jZGVmaW5lIF9fSEFMX1BXUl9QVkRfRVhUSV9GQUxMSU5HVFJJR0dFUl9FTkFCTEUgXA0KLSAgX19IQUxfUFdSX1BWRF9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UNCi0jZGVmaW5lIF9fSEFMX1BXUl9QVkRfRVhUSV9SSVNJTkdUUklHR0VSX0RJU0FCTEUgXA0KLSAgX19IQUxfUFdSX1BWRF9FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UNCi0jZGVmaW5lIF9fSEFMX1BXUl9QVkRfRVhUSV9SSVNJTkdUUklHR0VSX0VOQUJMRSBcDQotICBfX0hBTF9QV1JfUFZEX0VYVElfRU5BQkxFX1JJU0lOR19FREdFDQotI2RlZmluZSBfX0hBTF9QV1JfUFZEX0VYVElfU0VUX0ZBTExJTkdfRUdERV9UUklHR0VSIFwNCi0gIF9fSEFMX1BXUl9QVkRfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFDQotI2RlZmluZSBfX0hBTF9QV1JfUFZEX0VYVElfU0VUX1JJU0lOR19FREdFX1RSSUdHRVIgXA0KLSAgX19IQUxfUFdSX1BWRF9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRQ0KLSNkZWZpbmUgX19IQUxfUFdSX1BWTV9ESVNBQkxFKCkgXA0KLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBIQUxfUFdSRXhfRGlzYWJsZVBWTTEoKTsgICAgXA0KLSAgICBIQUxfUFdSRXhfRGlzYWJsZVBWTTIoKTsgICAgXA0KLSAgICBIQUxfUFdSRXhfRGlzYWJsZVBWTTMoKTsgICAgXA0KLSAgICBIQUxfUFdSRXhfRGlzYWJsZVBWTTQoKTsgICAgXA0KLSAgfSB3aGlsZSAoMCkNCi0jZGVmaW5lIF9fSEFMX1BXUl9QVk1fRU5BQkxFKCkgXA0KLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIEhBTF9QV1JFeF9FbmFibGVQVk0xKCk7ICAgIFwNCi0gICAgSEFMX1BXUkV4X0VuYWJsZVBWTTIoKTsgICAgXA0KLSAgICBIQUxfUFdSRXhfRW5hYmxlUFZNMygpOyAgICBcDQotICAgIEhBTF9QV1JFeF9FbmFibGVQVk00KCk7ICAgIFwNCi0gIH0gd2hpbGUgKDApDQotI2RlZmluZSBfX0hBTF9QV1JfU1JBTTJDT05URU5UX1BSRVNFUlZFX0RJU0FCTEUgXA0KLSAgSEFMX1BXUkV4X0Rpc2FibGVTUkFNMkNvbnRlbnRSZXRlbnRpb24NCi0jZGVmaW5lIF9fSEFMX1BXUl9TUkFNMkNPTlRFTlRfUFJFU0VSVkVfRU5BQkxFIFwNCi0gIEhBTF9QV1JFeF9FbmFibGVTUkFNMkNvbnRlbnRSZXRlbnRpb24NCi0jZGVmaW5lIF9fSEFMX1BXUl9WRERJTzJfRElTQUJMRSBIQUxfUFdSRXhfRGlzYWJsZVZkZElPMg0KLSNkZWZpbmUgX19IQUxfUFdSX1ZERElPMl9FTkFCTEUgSEFMX1BXUkV4X0VuYWJsZVZkZElPMg0KLSNkZWZpbmUgX19IQUxfUFdSX1ZERElPMl9FWFRJX0NMRUFSX0VHREVfVFJJR0dFUiBcDQotICBfX0hBTF9QV1JfVkRESU8yX0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UNCi0jZGVmaW5lIF9fSEFMX1BXUl9WRERJTzJfRVhUSV9TRVRfRkFMTElOR19FR0RFX1RSSUdHRVIgXA0KLSAgX19IQUxfUFdSX1ZERElPMl9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UNCi0jZGVmaW5lIF9fSEFMX1BXUl9WRERVU0JfRElTQUJMRSBIQUxfUFdSRXhfRGlzYWJsZVZkZFVTQg0KLSNkZWZpbmUgX19IQUxfUFdSX1ZERFVTQl9FTkFCTEUgSEFMX1BXUkV4X0VuYWJsZVZkZFVTQg0KLQ0KLSNpZiBkZWZpbmVkKFNUTTMyRjQpDQotI2RlZmluZSBfX0hBTF9QVkRfRVhUSV9FTkFCTEVfSVQoUFdSX0VYVElfTElORV9QVkQpIFwNCi0gIF9fSEFMX1BXUl9QVkRfRVhUSV9FTkFCTEVfSVQoKQ0KLSNkZWZpbmUgX19IQUxfUFZEX0VYVElfRElTQUJMRV9JVChQV1JfRVhUSV9MSU5FX1BWRCkgXA0KLSAgX19IQUxfUFdSX1BWRF9FWFRJX0RJU0FCTEVfSVQoKQ0KLSNkZWZpbmUgX19IQUxfUFZEX0VYVElfR0VUX0ZMQUcoUFdSX0VYVElfTElORV9QVkQpIF9fSEFMX1BXUl9QVkRfRVhUSV9HRVRfRkxBRygpDQotI2RlZmluZSBfX0hBTF9QVkRfRVhUSV9DTEVBUl9GTEFHKFBXUl9FWFRJX0xJTkVfUFZEKSBcDQotICBfX0hBTF9QV1JfUFZEX0VYVElfQ0xFQVJfRkxBRygpDQotI2RlZmluZSBfX0hBTF9QVkRfRVhUSV9HRU5FUkFURV9TV0lUKFBXUl9FWFRJX0xJTkVfUFZEKSBcDQotICBfX0hBTF9QV1JfUFZEX0VYVElfR0VORVJBVEVfU1dJVCgpDQotI2Vsc2UNCi0jZGVmaW5lIF9fSEFMX1BWRF9FWFRJX0NMRUFSX0ZMQUcgX19IQUxfUFdSX1BWRF9FWFRJX0NMRUFSX0ZMQUcNCi0jZGVmaW5lIF9fSEFMX1BWRF9FWFRJX0RJU0FCTEVfSVQgX19IQUxfUFdSX1BWRF9FWFRJX0RJU0FCTEVfSVQNCi0jZGVmaW5lIF9fSEFMX1BWRF9FWFRJX0VOQUJMRV9JVCBfX0hBTF9QV1JfUFZEX0VYVElfRU5BQkxFX0lUDQotI2RlZmluZSBfX0hBTF9QVkRfRVhUSV9HRU5FUkFURV9TV0lUIF9fSEFMX1BXUl9QVkRfRVhUSV9HRU5FUkFURV9TV0lUDQotI2RlZmluZSBfX0hBTF9QVkRfRVhUSV9HRVRfRkxBRyBfX0hBTF9QV1JfUFZEX0VYVElfR0VUX0ZMQUcNCi0jZW5kaWYgLyogU1RNMzJGNCAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBIQUxfUkNDX0FsaWFzZWQgSEFMIFJDQyBBbGlhc2VkIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlDQotICogQHsNCi0gKi8NCi0NCi0jZGVmaW5lIFJDQ19TdG9wV2FrZVVwQ2xvY2tfTVNJIFJDQ19TVE9QX1dBS0VVUENMT0NLX01TSQ0KLSNkZWZpbmUgUkNDX1N0b3BXYWtlVXBDbG9ja19IU0kgUkNDX1NUT1BfV0FLRVVQQ0xPQ0tfSFNJDQotDQotI2RlZmluZSBIQUxfUkNDX0NDU0NhbGxiYWNrIEhBTF9SQ0NfQ1NTQ2FsbGJhY2sNCi0jZGVmaW5lIEhBTF9SQzQ4X0VuYWJsZUJ1ZmZlcl9DbWQoY21kKSAgICAgICAgICAgICAgICAgXA0KLSAgKCgoY21kKSA9PSBFTkFCTEUpID8gSEFMX1JDQ0V4X0VuYWJsZUhTSTQ4X1ZSRUZJTlQoKSBcDQotICAgICAgICAgICAgICAgICAgICAgOiBIQUxfUkNDRXhfRGlzYWJsZUhTSTQ4X1ZSRUZJTlQoKSkNCi0NCi0jZGVmaW5lIF9fQURDX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19BRENfQ0xLX0RJU0FCTEUNCi0jZGVmaW5lIF9fQURDX0NMS19FTkFCTEUgX19IQUxfUkNDX0FEQ19DTEtfRU5BQkxFDQotI2RlZmluZSBfX0FEQ19DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfQURDX0NMS19TTEVFUF9ESVNBQkxFDQotI2RlZmluZSBfX0FEQ19DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19BRENfQ0xLX1NMRUVQX0VOQUJMRQ0KLSNkZWZpbmUgX19BRENfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0FEQ19GT1JDRV9SRVNFVA0KLSNkZWZpbmUgX19BRENfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfQURDX1JFTEVBU0VfUkVTRVQNCi0jZGVmaW5lIF9fQURDMV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfQURDMV9DTEtfRElTQUJMRQ0KLSNkZWZpbmUgX19BREMxX0NMS19FTkFCTEUgX19IQUxfUkNDX0FEQzFfQ0xLX0VOQUJMRQ0KLSNkZWZpbmUgX19BREMxX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19BREMxX0ZPUkNFX1JFU0VUDQotI2RlZmluZSBfX0FEQzFfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfQURDMV9SRUxFQVNFX1JFU0VUDQotI2RlZmluZSBfX0FEQzFfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfQURDMV9DTEtfU0xFRVBfRU5BQkxFDQotI2RlZmluZSBfX0FEQzFfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0FEQzFfQ0xLX1NMRUVQX0RJU0FCTEUNCi0jZGVmaW5lIF9fQURDMl9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfQURDMl9DTEtfRElTQUJMRQ0KLSNkZWZpbmUgX19BREMyX0NMS19FTkFCTEUgX19IQUxfUkNDX0FEQzJfQ0xLX0VOQUJMRQ0KLSNkZWZpbmUgX19BREMyX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19BREMyX0ZPUkNFX1JFU0VUDQotI2RlZmluZSBfX0FEQzJfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfQURDMl9SRUxFQVNFX1JFU0VUDQotI2RlZmluZSBfX0FEQzNfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0FEQzNfQ0xLX0RJU0FCTEUNCi0jZGVmaW5lIF9fQURDM19DTEtfRU5BQkxFIF9fSEFMX1JDQ19BREMzX0NMS19FTkFCTEUNCi0jZGVmaW5lIF9fQURDM19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfQURDM19GT1JDRV9SRVNFVA0KLSNkZWZpbmUgX19BREMzX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0FEQzNfUkVMRUFTRV9SRVNFVA0KLSNkZWZpbmUgX19BRVNfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0FFU19DTEtfRElTQUJMRQ0KLSNkZWZpbmUgX19BRVNfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfQUVTX0NMS19FTkFCTEUNCi0jZGVmaW5lIF9fQUVTX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19BRVNfQ0xLX1NMRUVQX0RJU0FCTEUNCi0jZGVmaW5lIF9fQUVTX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0FFU19DTEtfU0xFRVBfRU5BQkxFDQotI2RlZmluZSBfX0FFU19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfQUVTX0ZPUkNFX1JFU0VUDQotI2RlZmluZSBfX0FFU19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19BRVNfUkVMRUFTRV9SRVNFVA0KLSNkZWZpbmUgX19DUllQX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0NSWVBfQ0xLX1NMRUVQX0VOQUJMRQ0KLSNkZWZpbmUgX19DUllQX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19DUllQX0NMS19TTEVFUF9ESVNBQkxFDQotI2RlZmluZSBfX0NSWVBfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfQ1JZUF9DTEtfRU5BQkxFDQotI2RlZmluZSBfX0NSWVBfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0NSWVBfQ0xLX0RJU0FCTEUNCi0jZGVmaW5lIF9fQ1JZUF9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfQ1JZUF9GT1JDRV9SRVNFVA0KLSNkZWZpbmUgX19DUllQX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0NSWVBfUkVMRUFTRV9SRVNFVA0KLSNkZWZpbmUgX19BRklPX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19BRklPX0NMS19ESVNBQkxFDQotI2RlZmluZSBfX0FGSU9fQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfQUZJT19DTEtfRU5BQkxFDQotI2RlZmluZSBfX0FGSU9fRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0FGSU9fRk9SQ0VfUkVTRVQNCi0jZGVmaW5lIF9fQUZJT19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19BRklPX1JFTEVBU0VfUkVTRVQNCi0jZGVmaW5lIF9fQUhCX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19BSEJfRk9SQ0VfUkVTRVQNCi0jZGVmaW5lIF9fQUhCX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0FIQl9SRUxFQVNFX1JFU0VUDQotI2RlZmluZSBfX0FIQjFfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0FIQjFfRk9SQ0VfUkVTRVQNCi0jZGVmaW5lIF9fQUhCMV9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19BSEIxX1JFTEVBU0VfUkVTRVQNCi0jZGVmaW5lIF9fQUhCMl9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfQUhCMl9GT1JDRV9SRVNFVA0KLSNkZWZpbmUgX19BSEIyX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0FIQjJfUkVMRUFTRV9SRVNFVA0KLSNkZWZpbmUgX19BSEIzX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19BSEIzX0ZPUkNFX1JFU0VUDQotI2RlZmluZSBfX0FIQjNfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfQUhCM19SRUxFQVNFX1JFU0VUDQotI2RlZmluZSBfX0FQQjFfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0FQQjFfRk9SQ0VfUkVTRVQNCi0jZGVmaW5lIF9fQVBCMV9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19BUEIxX1JFTEVBU0VfUkVTRVQNCi0jZGVmaW5lIF9fQVBCMl9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfQVBCMl9GT1JDRV9SRVNFVA0KLSNkZWZpbmUgX19BUEIyX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0FQQjJfUkVMRUFTRV9SRVNFVA0KLSNkZWZpbmUgX19CS1BfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0JLUF9DTEtfRElTQUJMRQ0KLSNkZWZpbmUgX19CS1BfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfQktQX0NMS19FTkFCTEUNCi0jZGVmaW5lIF9fQktQX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19CS1BfRk9SQ0VfUkVTRVQNCi0jZGVmaW5lIF9fQktQX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0JLUF9SRUxFQVNFX1JFU0VUDQotI2RlZmluZSBfX0NBTjFfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0NBTjFfQ0xLX0RJU0FCTEUNCi0jZGVmaW5lIF9fQ0FOMV9DTEtfRU5BQkxFIF9fSEFMX1JDQ19DQU4xX0NMS19FTkFCTEUNCi0jZGVmaW5lIF9fQ0FOMV9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfQ0FOMV9DTEtfU0xFRVBfRElTQUJMRQ0KLSNkZWZpbmUgX19DQU4xX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0NBTjFfQ0xLX1NMRUVQX0VOQUJMRQ0KLSNkZWZpbmUgX19DQU4xX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19DQU4xX0ZPUkNFX1JFU0VUDQotI2RlZmluZSBfX0NBTjFfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfQ0FOMV9SRUxFQVNFX1JFU0VUDQotI2RlZmluZSBfX0NBTl9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfQ0FOMV9DTEtfRElTQUJMRQ0KLSNkZWZpbmUgX19DQU5fQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfQ0FOMV9DTEtfRU5BQkxFDQotI2RlZmluZSBfX0NBTl9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfQ0FOMV9GT1JDRV9SRVNFVA0KLSNkZWZpbmUgX19DQU5fUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfQ0FOMV9SRUxFQVNFX1JFU0VUDQotI2RlZmluZSBfX0NBTjJfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0NBTjJfQ0xLX0RJU0FCTEUNCi0jZGVmaW5lIF9fQ0FOMl9DTEtfRU5BQkxFIF9fSEFMX1JDQ19DQU4yX0NMS19FTkFCTEUNCi0jZGVmaW5lIF9fQ0FOMl9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfQ0FOMl9GT1JDRV9SRVNFVA0KLSNkZWZpbmUgX19DQU4yX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0NBTjJfUkVMRUFTRV9SRVNFVA0KLSNkZWZpbmUgX19DRUNfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0NFQ19DTEtfRElTQUJMRQ0KLSNkZWZpbmUgX19DRUNfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfQ0VDX0NMS19FTkFCTEUNCi0jZGVmaW5lIF9fQ09NUF9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfQ09NUF9DTEtfRElTQUJMRQ0KLSNkZWZpbmUgX19DT01QX0NMS19FTkFCTEUgX19IQUxfUkNDX0NPTVBfQ0xLX0VOQUJMRQ0KLSNkZWZpbmUgX19DT01QX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19DT01QX0ZPUkNFX1JFU0VUDQotI2RlZmluZSBfX0NPTVBfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfQ09NUF9SRUxFQVNFX1JFU0VUDQotI2RlZmluZSBfX0NPTVBfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfQ09NUF9DTEtfU0xFRVBfRU5BQkxFDQotI2RlZmluZSBfX0NPTVBfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0NPTVBfQ0xLX1NMRUVQX0RJU0FCTEUNCi0jZGVmaW5lIF9fQ0VDX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19DRUNfRk9SQ0VfUkVTRVQNCi0jZGVmaW5lIF9fQ0VDX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0NFQ19SRUxFQVNFX1JFU0VUDQotI2RlZmluZSBfX0NSQ19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfQ1JDX0NMS19ESVNBQkxFDQotI2RlZmluZSBfX0NSQ19DTEtfRU5BQkxFIF9fSEFMX1JDQ19DUkNfQ0xLX0VOQUJMRQ0KLSNkZWZpbmUgX19DUkNfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0NSQ19DTEtfU0xFRVBfRElTQUJMRQ0KLSNkZWZpbmUgX19DUkNfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfQ1JDX0NMS19TTEVFUF9FTkFCTEUNCi0jZGVmaW5lIF9fQ1JDX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19DUkNfRk9SQ0VfUkVTRVQNCi0jZGVmaW5lIF9fQ1JDX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0NSQ19SRUxFQVNFX1JFU0VUDQotI2RlZmluZSBfX0RBQ19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfREFDX0NMS19ESVNBQkxFDQotI2RlZmluZSBfX0RBQ19DTEtfRU5BQkxFIF9fSEFMX1JDQ19EQUNfQ0xLX0VOQUJMRQ0KLSNkZWZpbmUgX19EQUNfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0RBQ19GT1JDRV9SRVNFVA0KLSNkZWZpbmUgX19EQUNfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfREFDX1JFTEVBU0VfUkVTRVQNCi0jZGVmaW5lIF9fREFDMV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfREFDMV9DTEtfRElTQUJMRQ0KLSNkZWZpbmUgX19EQUMxX0NMS19FTkFCTEUgX19IQUxfUkNDX0RBQzFfQ0xLX0VOQUJMRQ0KLSNkZWZpbmUgX19EQUMxX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19EQUMxX0NMS19TTEVFUF9ESVNBQkxFDQotI2RlZmluZSBfX0RBQzFfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfREFDMV9DTEtfU0xFRVBfRU5BQkxFDQotI2RlZmluZSBfX0RBQzFfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0RBQzFfRk9SQ0VfUkVTRVQNCi0jZGVmaW5lIF9fREFDMV9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19EQUMxX1JFTEVBU0VfUkVTRVQNCi0jZGVmaW5lIF9fREJHTUNVX0NMS19FTkFCTEUgX19IQUxfUkNDX0RCR01DVV9DTEtfRU5BQkxFDQotI2RlZmluZSBfX0RCR01DVV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfREJHTUNVX0NMS19ESVNBQkxFDQotI2RlZmluZSBfX0RCR01DVV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfREJHTUNVX0ZPUkNFX1JFU0VUDQotI2RlZmluZSBfX0RCR01DVV9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19EQkdNQ1VfUkVMRUFTRV9SRVNFVA0KLSNkZWZpbmUgX19ERlNETV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfREZTRE1fQ0xLX0RJU0FCTEUNCi0jZGVmaW5lIF9fREZTRE1fQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfREZTRE1fQ0xLX0VOQUJMRQ0KLSNkZWZpbmUgX19ERlNETV9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfREZTRE1fQ0xLX1NMRUVQX0RJU0FCTEUNCi0jZGVmaW5lIF9fREZTRE1fQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfREZTRE1fQ0xLX1NMRUVQX0VOQUJMRQ0KLSNkZWZpbmUgX19ERlNETV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfREZTRE1fRk9SQ0VfUkVTRVQNCi0jZGVmaW5lIF9fREZTRE1fUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfREZTRE1fUkVMRUFTRV9SRVNFVA0KLSNkZWZpbmUgX19ETUExX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19ETUExX0NMS19ESVNBQkxFDQotI2RlZmluZSBfX0RNQTFfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfRE1BMV9DTEtfRU5BQkxFDQotI2RlZmluZSBfX0RNQTFfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0RNQTFfQ0xLX1NMRUVQX0RJU0FCTEUNCi0jZGVmaW5lIF9fRE1BMV9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19ETUExX0NMS19TTEVFUF9FTkFCTEUNCi0jZGVmaW5lIF9fRE1BMV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfRE1BMV9GT1JDRV9SRVNFVA0KLSNkZWZpbmUgX19ETUExX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0RNQTFfUkVMRUFTRV9SRVNFVA0KLSNkZWZpbmUgX19ETUEyX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19ETUEyX0NMS19ESVNBQkxFDQotI2RlZmluZSBfX0RNQTJfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfRE1BMl9DTEtfRU5BQkxFDQotI2RlZmluZSBfX0RNQTJfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0RNQTJfQ0xLX1NMRUVQX0RJU0FCTEUNCi0jZGVmaW5lIF9fRE1BMl9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19ETUEyX0NMS19TTEVFUF9FTkFCTEUNCi0jZGVmaW5lIF9fRE1BMl9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfRE1BMl9GT1JDRV9SRVNFVA0KLSNkZWZpbmUgX19ETUEyX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0RNQTJfUkVMRUFTRV9SRVNFVA0KLSNkZWZpbmUgX19FVEhNQUNfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0VUSE1BQ19DTEtfRElTQUJMRQ0KLSNkZWZpbmUgX19FVEhNQUNfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfRVRITUFDX0NMS19FTkFCTEUNCi0jZGVmaW5lIF9fRVRITUFDX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19FVEhNQUNfRk9SQ0VfUkVTRVQNCi0jZGVmaW5lIF9fRVRITUFDX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0VUSE1BQ19SRUxFQVNFX1JFU0VUDQotI2RlZmluZSBfX0VUSE1BQ1JYX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19FVEhNQUNSWF9DTEtfRElTQUJMRQ0KLSNkZWZpbmUgX19FVEhNQUNSWF9DTEtfRU5BQkxFIF9fSEFMX1JDQ19FVEhNQUNSWF9DTEtfRU5BQkxFDQotI2RlZmluZSBfX0VUSE1BQ1RYX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19FVEhNQUNUWF9DTEtfRElTQUJMRQ0KLSNkZWZpbmUgX19FVEhNQUNUWF9DTEtfRU5BQkxFIF9fSEFMX1JDQ19FVEhNQUNUWF9DTEtfRU5BQkxFDQotI2RlZmluZSBfX0ZJUkVXQUxMX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19GSVJFV0FMTF9DTEtfRElTQUJMRQ0KLSNkZWZpbmUgX19GSVJFV0FMTF9DTEtfRU5BQkxFIF9fSEFMX1JDQ19GSVJFV0FMTF9DTEtfRU5BQkxFDQotI2RlZmluZSBfX0ZMQVNIX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19GTEFTSF9DTEtfRElTQUJMRQ0KLSNkZWZpbmUgX19GTEFTSF9DTEtfRU5BQkxFIF9fSEFMX1JDQ19GTEFTSF9DTEtfRU5BQkxFDQotI2RlZmluZSBfX0ZMQVNIX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19GTEFTSF9DTEtfU0xFRVBfRElTQUJMRQ0KLSNkZWZpbmUgX19GTEFTSF9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19GTEFTSF9DTEtfU0xFRVBfRU5BQkxFDQotI2RlZmluZSBfX0ZMQVNIX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19GTEFTSF9GT1JDRV9SRVNFVA0KLSNkZWZpbmUgX19GTEFTSF9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19GTEFTSF9SRUxFQVNFX1JFU0VUDQotI2RlZmluZSBfX0ZMSVRGX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19GTElURl9DTEtfRElTQUJMRQ0KLSNkZWZpbmUgX19GTElURl9DTEtfRU5BQkxFIF9fSEFMX1JDQ19GTElURl9DTEtfRU5BQkxFDQotI2RlZmluZSBfX0ZMSVRGX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19GTElURl9GT1JDRV9SRVNFVA0KLSNkZWZpbmUgX19GTElURl9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19GTElURl9SRUxFQVNFX1JFU0VUDQotI2RlZmluZSBfX0ZMSVRGX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0ZMSVRGX0NMS19TTEVFUF9FTkFCTEUNCi0jZGVmaW5lIF9fRkxJVEZfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0ZMSVRGX0NMS19TTEVFUF9ESVNBQkxFDQotI2RlZmluZSBfX0ZNQ19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfRk1DX0NMS19ESVNBQkxFDQotI2RlZmluZSBfX0ZNQ19DTEtfRU5BQkxFIF9fSEFMX1JDQ19GTUNfQ0xLX0VOQUJMRQ0KLSNkZWZpbmUgX19GTUNfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0ZNQ19DTEtfU0xFRVBfRElTQUJMRQ0KLSNkZWZpbmUgX19GTUNfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfRk1DX0NMS19TTEVFUF9FTkFCTEUNCi0jZGVmaW5lIF9fRk1DX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19GTUNfRk9SQ0VfUkVTRVQNCi0jZGVmaW5lIF9fRk1DX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0ZNQ19SRUxFQVNFX1JFU0VUDQotI2RlZmluZSBfX0ZTTUNfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0ZTTUNfQ0xLX0RJU0FCTEUNCi0jZGVmaW5lIF9fRlNNQ19DTEtfRU5BQkxFIF9fSEFMX1JDQ19GU01DX0NMS19FTkFCTEUNCi0jZGVmaW5lIF9fR1BJT0FfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0dQSU9BX0NMS19ESVNBQkxFDQotI2RlZmluZSBfX0dQSU9BX0NMS19FTkFCTEUgX19IQUxfUkNDX0dQSU9BX0NMS19FTkFCTEUNCi0jZGVmaW5lIF9fR1BJT0FfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0dQSU9BX0NMS19TTEVFUF9ESVNBQkxFDQotI2RlZmluZSBfX0dQSU9BX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0dQSU9BX0NMS19TTEVFUF9FTkFCTEUNCi0jZGVmaW5lIF9fR1BJT0FfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0dQSU9BX0ZPUkNFX1JFU0VUDQotI2RlZmluZSBfX0dQSU9BX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0dQSU9BX1JFTEVBU0VfUkVTRVQNCi0jZGVmaW5lIF9fR1BJT0JfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0dQSU9CX0NMS19ESVNBQkxFDQotI2RlZmluZSBfX0dQSU9CX0NMS19FTkFCTEUgX19IQUxfUkNDX0dQSU9CX0NMS19FTkFCTEUNCi0jZGVmaW5lIF9fR1BJT0JfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0dQSU9CX0NMS19TTEVFUF9ESVNBQkxFDQotI2RlZmluZSBfX0dQSU9CX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0dQSU9CX0NMS19TTEVFUF9FTkFCTEUNCi0jZGVmaW5lIF9fR1BJT0JfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0dQSU9CX0ZPUkNFX1JFU0VUDQotI2RlZmluZSBfX0dQSU9CX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0dQSU9CX1JFTEVBU0VfUkVTRVQNCi0jZGVmaW5lIF9fR1BJT0NfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0dQSU9DX0NMS19ESVNBQkxFDQotI2RlZmluZSBfX0dQSU9DX0NMS19FTkFCTEUgX19IQUxfUkNDX0dQSU9DX0NMS19FTkFCTEUNCi0jZGVmaW5lIF9fR1BJT0NfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0dQSU9DX0NMS19TTEVFUF9ESVNBQkxFDQotI2RlZmluZSBfX0dQSU9DX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0dQSU9DX0NMS19TTEVFUF9FTkFCTEUNCi0jZGVmaW5lIF9fR1BJT0NfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0dQSU9DX0ZPUkNFX1JFU0VUDQotI2RlZmluZSBfX0dQSU9DX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0dQSU9DX1JFTEVBU0VfUkVTRVQNCi0jZGVmaW5lIF9fR1BJT0RfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0dQSU9EX0NMS19ESVNBQkxFDQotI2RlZmluZSBfX0dQSU9EX0NMS19FTkFCTEUgX19IQUxfUkNDX0dQSU9EX0NMS19FTkFCTEUNCi0jZGVmaW5lIF9fR1BJT0RfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0dQSU9EX0NMS19TTEVFUF9ESVNBQkxFDQotI2RlZmluZSBfX0dQSU9EX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0dQSU9EX0NMS19TTEVFUF9FTkFCTEUNCi0jZGVmaW5lIF9fR1BJT0RfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0dQSU9EX0ZPUkNFX1JFU0VUDQotI2RlZmluZSBfX0dQSU9EX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0dQSU9EX1JFTEVBU0VfUkVTRVQNCi0jZGVmaW5lIF9fR1BJT0VfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0dQSU9FX0NMS19ESVNBQkxFDQotI2RlZmluZSBfX0dQSU9FX0NMS19FTkFCTEUgX19IQUxfUkNDX0dQSU9FX0NMS19FTkFCTEUNCi0jZGVmaW5lIF9fR1BJT0VfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0dQSU9FX0NMS19TTEVFUF9ESVNBQkxFDQotI2RlZmluZSBfX0dQSU9FX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0dQSU9FX0NMS19TTEVFUF9FTkFCTEUNCi0jZGVmaW5lIF9fR1BJT0VfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0dQSU9FX0ZPUkNFX1JFU0VUDQotI2RlZmluZSBfX0dQSU9FX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0dQSU9FX1JFTEVBU0VfUkVTRVQNCi0jZGVmaW5lIF9fR1BJT0ZfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0dQSU9GX0NMS19ESVNBQkxFDQotI2RlZmluZSBfX0dQSU9GX0NMS19FTkFCTEUgX19IQUxfUkNDX0dQSU9GX0NMS19FTkFCTEUNCi0jZGVmaW5lIF9fR1BJT0ZfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0dQSU9GX0NMS19TTEVFUF9ESVNBQkxFDQotI2RlZmluZSBfX0dQSU9GX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0dQSU9GX0NMS19TTEVFUF9FTkFCTEUNCi0jZGVmaW5lIF9fR1BJT0ZfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0dQSU9GX0ZPUkNFX1JFU0VUDQotI2RlZmluZSBfX0dQSU9GX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0dQSU9GX1JFTEVBU0VfUkVTRVQNCi0jZGVmaW5lIF9fR1BJT0dfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0dQSU9HX0NMS19ESVNBQkxFDQotI2RlZmluZSBfX0dQSU9HX0NMS19FTkFCTEUgX19IQUxfUkNDX0dQSU9HX0NMS19FTkFCTEUNCi0jZGVmaW5lIF9fR1BJT0dfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0dQSU9HX0NMS19TTEVFUF9ESVNBQkxFDQotI2RlZmluZSBfX0dQSU9HX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0dQSU9HX0NMS19TTEVFUF9FTkFCTEUNCi0jZGVmaW5lIF9fR1BJT0dfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0dQSU9HX0ZPUkNFX1JFU0VUDQotI2RlZmluZSBfX0dQSU9HX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0dQSU9HX1JFTEVBU0VfUkVTRVQNCi0jZGVmaW5lIF9fR1BJT0hfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0dQSU9IX0NMS19ESVNBQkxFDQotI2RlZmluZSBfX0dQSU9IX0NMS19FTkFCTEUgX19IQUxfUkNDX0dQSU9IX0NMS19FTkFCTEUNCi0jZGVmaW5lIF9fR1BJT0hfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0dQSU9IX0NMS19TTEVFUF9ESVNBQkxFDQotI2RlZmluZSBfX0dQSU9IX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0dQSU9IX0NMS19TTEVFUF9FTkFCTEUNCi0jZGVmaW5lIF9fR1BJT0hfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0dQSU9IX0ZPUkNFX1JFU0VUDQotI2RlZmluZSBfX0dQSU9IX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0dQSU9IX1JFTEVBU0VfUkVTRVQNCi0jZGVmaW5lIF9fSTJDMV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfSTJDMV9DTEtfRElTQUJMRQ0KLSNkZWZpbmUgX19JMkMxX0NMS19FTkFCTEUgX19IQUxfUkNDX0kyQzFfQ0xLX0VOQUJMRQ0KLSNkZWZpbmUgX19JMkMxX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19JMkMxX0NMS19TTEVFUF9ESVNBQkxFDQotI2RlZmluZSBfX0kyQzFfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfSTJDMV9DTEtfU0xFRVBfRU5BQkxFDQotI2RlZmluZSBfX0kyQzFfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0kyQzFfRk9SQ0VfUkVTRVQNCi0jZGVmaW5lIF9fSTJDMV9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19JMkMxX1JFTEVBU0VfUkVTRVQNCi0jZGVmaW5lIF9fSTJDMl9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfSTJDMl9DTEtfRElTQUJMRQ0KLSNkZWZpbmUgX19JMkMyX0NMS19FTkFCTEUgX19IQUxfUkNDX0kyQzJfQ0xLX0VOQUJMRQ0KLSNkZWZpbmUgX19JMkMyX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19JMkMyX0NMS19TTEVFUF9ESVNBQkxFDQotI2RlZmluZSBfX0kyQzJfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfSTJDMl9DTEtfU0xFRVBfRU5BQkxFDQotI2RlZmluZSBfX0kyQzJfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0kyQzJfRk9SQ0VfUkVTRVQNCi0jZGVmaW5lIF9fSTJDMl9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19JMkMyX1JFTEVBU0VfUkVTRVQNCi0jZGVmaW5lIF9fSTJDM19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfSTJDM19DTEtfRElTQUJMRQ0KLSNkZWZpbmUgX19JMkMzX0NMS19FTkFCTEUgX19IQUxfUkNDX0kyQzNfQ0xLX0VOQUJMRQ0KLSNkZWZpbmUgX19JMkMzX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19JMkMzX0NMS19TTEVFUF9ESVNBQkxFDQotI2RlZmluZSBfX0kyQzNfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfSTJDM19DTEtfU0xFRVBfRU5BQkxFDQotI2RlZmluZSBfX0kyQzNfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0kyQzNfRk9SQ0VfUkVTRVQNCi0jZGVmaW5lIF9fSTJDM19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19JMkMzX1JFTEVBU0VfUkVTRVQNCi0jZGVmaW5lIF9fTENEX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19MQ0RfQ0xLX0RJU0FCTEUNCi0jZGVmaW5lIF9fTENEX0NMS19FTkFCTEUgX19IQUxfUkNDX0xDRF9DTEtfRU5BQkxFDQotI2RlZmluZSBfX0xDRF9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfTENEX0NMS19TTEVFUF9ESVNBQkxFDQotI2RlZmluZSBfX0xDRF9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19MQ0RfQ0xLX1NMRUVQX0VOQUJMRQ0KLSNkZWZpbmUgX19MQ0RfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0xDRF9GT1JDRV9SRVNFVA0KLSNkZWZpbmUgX19MQ0RfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfTENEX1JFTEVBU0VfUkVTRVQNCi0jZGVmaW5lIF9fTFBUSU0xX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19MUFRJTTFfQ0xLX0RJU0FCTEUNCi0jZGVmaW5lIF9fTFBUSU0xX0NMS19FTkFCTEUgX19IQUxfUkNDX0xQVElNMV9DTEtfRU5BQkxFDQotI2RlZmluZSBfX0xQVElNMV9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfTFBUSU0xX0NMS19TTEVFUF9ESVNBQkxFDQotI2RlZmluZSBfX0xQVElNMV9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19MUFRJTTFfQ0xLX1NMRUVQX0VOQUJMRQ0KLSNkZWZpbmUgX19MUFRJTTFfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0xQVElNMV9GT1JDRV9SRVNFVA0KLSNkZWZpbmUgX19MUFRJTTFfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfTFBUSU0xX1JFTEVBU0VfUkVTRVQNCi0jZGVmaW5lIF9fTFBUSU0yX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19MUFRJTTJfQ0xLX0RJU0FCTEUNCi0jZGVmaW5lIF9fTFBUSU0yX0NMS19FTkFCTEUgX19IQUxfUkNDX0xQVElNMl9DTEtfRU5BQkxFDQotI2RlZmluZSBfX0xQVElNMl9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfTFBUSU0yX0NMS19TTEVFUF9ESVNBQkxFDQotI2RlZmluZSBfX0xQVElNMl9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19MUFRJTTJfQ0xLX1NMRUVQX0VOQUJMRQ0KLSNkZWZpbmUgX19MUFRJTTJfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0xQVElNMl9GT1JDRV9SRVNFVA0KLSNkZWZpbmUgX19MUFRJTTJfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfTFBUSU0yX1JFTEVBU0VfUkVTRVQNCi0jZGVmaW5lIF9fTFBVQVJUMV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfTFBVQVJUMV9DTEtfRElTQUJMRQ0KLSNkZWZpbmUgX19MUFVBUlQxX0NMS19FTkFCTEUgX19IQUxfUkNDX0xQVUFSVDFfQ0xLX0VOQUJMRQ0KLSNkZWZpbmUgX19MUFVBUlQxX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19MUFVBUlQxX0NMS19TTEVFUF9ESVNBQkxFDQotI2RlZmluZSBfX0xQVUFSVDFfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfTFBVQVJUMV9DTEtfU0xFRVBfRU5BQkxFDQotI2RlZmluZSBfX0xQVUFSVDFfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0xQVUFSVDFfRk9SQ0VfUkVTRVQNCi0jZGVmaW5lIF9fTFBVQVJUMV9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19MUFVBUlQxX1JFTEVBU0VfUkVTRVQNCi0jZGVmaW5lIF9fT1BBTVBfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX09QQU1QX0NMS19ESVNBQkxFDQotI2RlZmluZSBfX09QQU1QX0NMS19FTkFCTEUgX19IQUxfUkNDX09QQU1QX0NMS19FTkFCTEUNCi0jZGVmaW5lIF9fT1BBTVBfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX09QQU1QX0NMS19TTEVFUF9ESVNBQkxFDQotI2RlZmluZSBfX09QQU1QX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX09QQU1QX0NMS19TTEVFUF9FTkFCTEUNCi0jZGVmaW5lIF9fT1BBTVBfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX09QQU1QX0ZPUkNFX1JFU0VUDQotI2RlZmluZSBfX09QQU1QX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX09QQU1QX1JFTEVBU0VfUkVTRVQNCi0jZGVmaW5lIF9fT1RHRlNfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX09UR0ZTX0NMS19ESVNBQkxFDQotI2RlZmluZSBfX09UR0ZTX0NMS19FTkFCTEUgX19IQUxfUkNDX09UR0ZTX0NMS19FTkFCTEUNCi0jZGVmaW5lIF9fT1RHRlNfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX09UR0ZTX0NMS19TTEVFUF9ESVNBQkxFDQotI2RlZmluZSBfX09UR0ZTX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX09UR0ZTX0NMS19TTEVFUF9FTkFCTEUNCi0jZGVmaW5lIF9fT1RHRlNfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX09UR0ZTX0ZPUkNFX1JFU0VUDQotI2RlZmluZSBfX09UR0ZTX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX09UR0ZTX1JFTEVBU0VfUkVTRVQNCi0jZGVmaW5lIF9fUFdSX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19QV1JfQ0xLX0RJU0FCTEUNCi0jZGVmaW5lIF9fUFdSX0NMS19FTkFCTEUgX19IQUxfUkNDX1BXUl9DTEtfRU5BQkxFDQotI2RlZmluZSBfX1BXUl9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfUFdSX0NMS19TTEVFUF9ESVNBQkxFDQotI2RlZmluZSBfX1BXUl9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19QV1JfQ0xLX1NMRUVQX0VOQUJMRQ0KLSNkZWZpbmUgX19QV1JfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1BXUl9GT1JDRV9SRVNFVA0KLSNkZWZpbmUgX19QV1JfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfUFdSX1JFTEVBU0VfUkVTRVQNCi0jZGVmaW5lIF9fUVNQSV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfUVNQSV9DTEtfRElTQUJMRQ0KLSNkZWZpbmUgX19RU1BJX0NMS19FTkFCTEUgX19IQUxfUkNDX1FTUElfQ0xLX0VOQUJMRQ0KLSNkZWZpbmUgX19RU1BJX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19RU1BJX0NMS19TTEVFUF9ESVNBQkxFDQotI2RlZmluZSBfX1FTUElfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfUVNQSV9DTEtfU0xFRVBfRU5BQkxFDQotI2RlZmluZSBfX1FTUElfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1FTUElfRk9SQ0VfUkVTRVQNCi0jZGVmaW5lIF9fUVNQSV9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19RU1BJX1JFTEVBU0VfUkVTRVQNCi0NCi0jaWYgZGVmaW5lZChTVE0zMldCKQ0KLSNkZWZpbmUgX19IQUxfUkNDX1FTUElfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1FVQURTUElfQ0xLX0RJU0FCTEUNCi0jZGVmaW5lIF9fSEFMX1JDQ19RU1BJX0NMS19FTkFCTEUgX19IQUxfUkNDX1FVQURTUElfQ0xLX0VOQUJMRQ0KLSNkZWZpbmUgX19IQUxfUkNDX1FTUElfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1FVQURTUElfQ0xLX1NMRUVQX0RJU0FCTEUNCi0jZGVmaW5lIF9fSEFMX1JDQ19RU1BJX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1FVQURTUElfQ0xLX1NMRUVQX0VOQUJMRQ0KLSNkZWZpbmUgX19IQUxfUkNDX1FTUElfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1FVQURTUElfRk9SQ0VfUkVTRVQNCi0jZGVmaW5lIF9fSEFMX1JDQ19RU1BJX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1FVQURTUElfUkVMRUFTRV9SRVNFVA0KLSNkZWZpbmUgX19IQUxfUkNDX1FTUElfSVNfQ0xLX0VOQUJMRUQgX19IQUxfUkNDX1FVQURTUElfSVNfQ0xLX0VOQUJMRUQNCi0jZGVmaW5lIF9fSEFMX1JDQ19RU1BJX0lTX0NMS19ESVNBQkxFRCBfX0hBTF9SQ0NfUVVBRFNQSV9JU19DTEtfRElTQUJMRUQNCi0jZGVmaW5lIF9fSEFMX1JDQ19RU1BJX0lTX0NMS19TTEVFUF9FTkFCTEVEIFwNCi0gIF9fSEFMX1JDQ19RVUFEU1BJX0lTX0NMS19TTEVFUF9FTkFCTEVEDQotI2RlZmluZSBfX0hBTF9SQ0NfUVNQSV9JU19DTEtfU0xFRVBfRElTQUJMRUQgXA0KLSAgX19IQUxfUkNDX1FVQURTUElfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEDQotI2RlZmluZSBRU1BJX0lSUUhhbmRsZXIgUVVBRFNQSV9JUlFIYW5kbGVyDQotI2VuZGlmIC8qIF9fSEFMX1JDQ19RVUFEU1BJX0NMS19FTkFCTEUgKi8NCi0NCi0jZGVmaW5lIF9fUk5HX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19STkdfQ0xLX0RJU0FCTEUNCi0jZGVmaW5lIF9fUk5HX0NMS19FTkFCTEUgX19IQUxfUkNDX1JOR19DTEtfRU5BQkxFDQotI2RlZmluZSBfX1JOR19DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfUk5HX0NMS19TTEVFUF9ESVNBQkxFDQotI2RlZmluZSBfX1JOR19DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19STkdfQ0xLX1NMRUVQX0VOQUJMRQ0KLSNkZWZpbmUgX19STkdfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1JOR19GT1JDRV9SRVNFVA0KLSNkZWZpbmUgX19STkdfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfUk5HX1JFTEVBU0VfUkVTRVQNCi0jZGVmaW5lIF9fU0FJMV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfU0FJMV9DTEtfRElTQUJMRQ0KLSNkZWZpbmUgX19TQUkxX0NMS19FTkFCTEUgX19IQUxfUkNDX1NBSTFfQ0xLX0VOQUJMRQ0KLSNkZWZpbmUgX19TQUkxX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19TQUkxX0NMS19TTEVFUF9ESVNBQkxFDQotI2RlZmluZSBfX1NBSTFfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfU0FJMV9DTEtfU0xFRVBfRU5BQkxFDQotI2RlZmluZSBfX1NBSTFfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1NBSTFfRk9SQ0VfUkVTRVQNCi0jZGVmaW5lIF9fU0FJMV9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19TQUkxX1JFTEVBU0VfUkVTRVQNCi0jZGVmaW5lIF9fU0FJMl9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfU0FJMl9DTEtfRElTQUJMRQ0KLSNkZWZpbmUgX19TQUkyX0NMS19FTkFCTEUgX19IQUxfUkNDX1NBSTJfQ0xLX0VOQUJMRQ0KLSNkZWZpbmUgX19TQUkyX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19TQUkyX0NMS19TTEVFUF9ESVNBQkxFDQotI2RlZmluZSBfX1NBSTJfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfU0FJMl9DTEtfU0xFRVBfRU5BQkxFDQotI2RlZmluZSBfX1NBSTJfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1NBSTJfRk9SQ0VfUkVTRVQNCi0jZGVmaW5lIF9fU0FJMl9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19TQUkyX1JFTEVBU0VfUkVTRVQNCi0jZGVmaW5lIF9fU0RJT19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfU0RJT19DTEtfRElTQUJMRQ0KLSNkZWZpbmUgX19TRElPX0NMS19FTkFCTEUgX19IQUxfUkNDX1NESU9fQ0xLX0VOQUJMRQ0KLSNkZWZpbmUgX19TRE1NQ19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfU0RNTUNfQ0xLX0RJU0FCTEUNCi0jZGVmaW5lIF9fU0RNTUNfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfU0RNTUNfQ0xLX0VOQUJMRQ0KLSNkZWZpbmUgX19TRE1NQ19DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfU0RNTUNfQ0xLX1NMRUVQX0RJU0FCTEUNCi0jZGVmaW5lIF9fU0RNTUNfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfU0RNTUNfQ0xLX1NMRUVQX0VOQUJMRQ0KLSNkZWZpbmUgX19TRE1NQ19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfU0RNTUNfRk9SQ0VfUkVTRVQNCi0jZGVmaW5lIF9fU0RNTUNfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfU0RNTUNfUkVMRUFTRV9SRVNFVA0KLSNkZWZpbmUgX19TUEkxX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19TUEkxX0NMS19ESVNBQkxFDQotI2RlZmluZSBfX1NQSTFfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfU1BJMV9DTEtfRU5BQkxFDQotI2RlZmluZSBfX1NQSTFfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1NQSTFfQ0xLX1NMRUVQX0RJU0FCTEUNCi0jZGVmaW5lIF9fU1BJMV9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19TUEkxX0NMS19TTEVFUF9FTkFCTEUNCi0jZGVmaW5lIF9fU1BJMV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfU1BJMV9GT1JDRV9SRVNFVA0KLSNkZWZpbmUgX19TUEkxX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1NQSTFfUkVMRUFTRV9SRVNFVA0KLSNkZWZpbmUgX19TUEkyX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19TUEkyX0NMS19ESVNBQkxFDQotI2RlZmluZSBfX1NQSTJfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfU1BJMl9DTEtfRU5BQkxFDQotI2RlZmluZSBfX1NQSTJfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1NQSTJfQ0xLX1NMRUVQX0RJU0FCTEUNCi0jZGVmaW5lIF9fU1BJMl9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19TUEkyX0NMS19TTEVFUF9FTkFCTEUNCi0jZGVmaW5lIF9fU1BJMl9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfU1BJMl9GT1JDRV9SRVNFVA0KLSNkZWZpbmUgX19TUEkyX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1NQSTJfUkVMRUFTRV9SRVNFVA0KLSNkZWZpbmUgX19TUEkzX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19TUEkzX0NMS19ESVNBQkxFDQotI2RlZmluZSBfX1NQSTNfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfU1BJM19DTEtfRU5BQkxFDQotI2RlZmluZSBfX1NQSTNfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1NQSTNfQ0xLX1NMRUVQX0RJU0FCTEUNCi0jZGVmaW5lIF9fU1BJM19DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19TUEkzX0NMS19TTEVFUF9FTkFCTEUNCi0jZGVmaW5lIF9fU1BJM19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfU1BJM19GT1JDRV9SRVNFVA0KLSNkZWZpbmUgX19TUEkzX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1NQSTNfUkVMRUFTRV9SRVNFVA0KLSNkZWZpbmUgX19TUkFNX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19TUkFNX0NMS19ESVNBQkxFDQotI2RlZmluZSBfX1NSQU1fQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfU1JBTV9DTEtfRU5BQkxFDQotI2RlZmluZSBfX1NSQU0xX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19TUkFNMV9DTEtfU0xFRVBfRElTQUJMRQ0KLSNkZWZpbmUgX19TUkFNMV9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19TUkFNMV9DTEtfU0xFRVBfRU5BQkxFDQotI2RlZmluZSBfX1NSQU0yX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19TUkFNMl9DTEtfU0xFRVBfRElTQUJMRQ0KLSNkZWZpbmUgX19TUkFNMl9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19TUkFNMl9DTEtfU0xFRVBfRU5BQkxFDQotI2RlZmluZSBfX1NXUE1JMV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfU1dQTUkxX0NMS19ESVNBQkxFDQotI2RlZmluZSBfX1NXUE1JMV9DTEtfRU5BQkxFIF9fSEFMX1JDQ19TV1BNSTFfQ0xLX0VOQUJMRQ0KLSNkZWZpbmUgX19TV1BNSTFfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1NXUE1JMV9DTEtfU0xFRVBfRElTQUJMRQ0KLSNkZWZpbmUgX19TV1BNSTFfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfU1dQTUkxX0NMS19TTEVFUF9FTkFCTEUNCi0jZGVmaW5lIF9fU1dQTUkxX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19TV1BNSTFfRk9SQ0VfUkVTRVQNCi0jZGVmaW5lIF9fU1dQTUkxX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1NXUE1JMV9SRUxFQVNFX1JFU0VUDQotI2RlZmluZSBfX1NZU0NGR19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfU1lTQ0ZHX0NMS19ESVNBQkxFDQotI2RlZmluZSBfX1NZU0NGR19DTEtfRU5BQkxFIF9fSEFMX1JDQ19TWVNDRkdfQ0xLX0VOQUJMRQ0KLSNkZWZpbmUgX19TWVNDRkdfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1NZU0NGR19DTEtfU0xFRVBfRElTQUJMRQ0KLSNkZWZpbmUgX19TWVNDRkdfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfU1lTQ0ZHX0NMS19TTEVFUF9FTkFCTEUNCi0jZGVmaW5lIF9fU1lTQ0ZHX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19TWVNDRkdfRk9SQ0VfUkVTRVQNCi0jZGVmaW5lIF9fU1lTQ0ZHX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1NZU0NGR19SRUxFQVNFX1JFU0VUDQotI2RlZmluZSBfX1RJTTFfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1RJTTFfQ0xLX0RJU0FCTEUNCi0jZGVmaW5lIF9fVElNMV9DTEtfRU5BQkxFIF9fSEFMX1JDQ19USU0xX0NMS19FTkFCTEUNCi0jZGVmaW5lIF9fVElNMV9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfVElNMV9DTEtfU0xFRVBfRElTQUJMRQ0KLSNkZWZpbmUgX19USU0xX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1RJTTFfQ0xLX1NMRUVQX0VOQUJMRQ0KLSNkZWZpbmUgX19USU0xX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19USU0xX0ZPUkNFX1JFU0VUDQotI2RlZmluZSBfX1RJTTFfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVElNMV9SRUxFQVNFX1JFU0VUDQotI2RlZmluZSBfX1RJTTEwX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19USU0xMF9DTEtfRElTQUJMRQ0KLSNkZWZpbmUgX19USU0xMF9DTEtfRU5BQkxFIF9fSEFMX1JDQ19USU0xMF9DTEtfRU5BQkxFDQotI2RlZmluZSBfX1RJTTEwX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19USU0xMF9GT1JDRV9SRVNFVA0KLSNkZWZpbmUgX19USU0xMF9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19USU0xMF9SRUxFQVNFX1JFU0VUDQotI2RlZmluZSBfX1RJTTExX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19USU0xMV9DTEtfRElTQUJMRQ0KLSNkZWZpbmUgX19USU0xMV9DTEtfRU5BQkxFIF9fSEFMX1JDQ19USU0xMV9DTEtfRU5BQkxFDQotI2RlZmluZSBfX1RJTTExX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19USU0xMV9GT1JDRV9SRVNFVA0KLSNkZWZpbmUgX19USU0xMV9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19USU0xMV9SRUxFQVNFX1JFU0VUDQotI2RlZmluZSBfX1RJTTEyX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19USU0xMl9DTEtfRElTQUJMRQ0KLSNkZWZpbmUgX19USU0xMl9DTEtfRU5BQkxFIF9fSEFMX1JDQ19USU0xMl9DTEtfRU5BQkxFDQotI2RlZmluZSBfX1RJTTEyX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19USU0xMl9GT1JDRV9SRVNFVA0KLSNkZWZpbmUgX19USU0xMl9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19USU0xMl9SRUxFQVNFX1JFU0VUDQotI2RlZmluZSBfX1RJTTEzX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19USU0xM19DTEtfRElTQUJMRQ0KLSNkZWZpbmUgX19USU0xM19DTEtfRU5BQkxFIF9fSEFMX1JDQ19USU0xM19DTEtfRU5BQkxFDQotI2RlZmluZSBfX1RJTTEzX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19USU0xM19GT1JDRV9SRVNFVA0KLSNkZWZpbmUgX19USU0xM19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19USU0xM19SRUxFQVNFX1JFU0VUDQotI2RlZmluZSBfX1RJTTE0X0NMS19ESVNBQkxFIF9fSEFMX1JDQ19USU0xNF9DTEtfRElTQUJMRQ0KLSNkZWZpbmUgX19USU0xNF9DTEtfRU5BQkxFIF9fSEFMX1JDQ19USU0xNF9DTEtfRU5BQkxFDQotI2RlZmluZSBfX1RJTTE0X0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19USU0xNF9GT1JDRV9SRVNFVA0KLSNkZWZpbmUgX19USU0xNF9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19USU0xNF9SRUxFQVNFX1JFU0VUDQotI2RlZmluZSBfX1RJTTE1X0NMS19ESVNBQkxFIF9fSEFMX1JDQ19USU0xNV9DTEtfRElTQUJMRQ0KLSNkZWZpbmUgX19USU0xNV9DTEtfRU5BQkxFIF9fSEFMX1JDQ19USU0xNV9DTEtfRU5BQkxFDQotI2RlZmluZSBfX1RJTTE1X0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19USU0xNV9DTEtfU0xFRVBfRElTQUJMRQ0KLSNkZWZpbmUgX19USU0xNV9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19USU0xNV9DTEtfU0xFRVBfRU5BQkxFDQotI2RlZmluZSBfX1RJTTE1X0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19USU0xNV9GT1JDRV9SRVNFVA0KLSNkZWZpbmUgX19USU0xNV9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19USU0xNV9SRUxFQVNFX1JFU0VUDQotI2RlZmluZSBfX1RJTTE2X0NMS19ESVNBQkxFIF9fSEFMX1JDQ19USU0xNl9DTEtfRElTQUJMRQ0KLSNkZWZpbmUgX19USU0xNl9DTEtfRU5BQkxFIF9fSEFMX1JDQ19USU0xNl9DTEtfRU5BQkxFDQotI2RlZmluZSBfX1RJTTE2X0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19USU0xNl9DTEtfU0xFRVBfRElTQUJMRQ0KLSNkZWZpbmUgX19USU0xNl9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19USU0xNl9DTEtfU0xFRVBfRU5BQkxFDQotI2RlZmluZSBfX1RJTTE2X0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19USU0xNl9GT1JDRV9SRVNFVA0KLSNkZWZpbmUgX19USU0xNl9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19USU0xNl9SRUxFQVNFX1JFU0VUDQotI2RlZmluZSBfX1RJTTE3X0NMS19ESVNBQkxFIF9fSEFMX1JDQ19USU0xN19DTEtfRElTQUJMRQ0KLSNkZWZpbmUgX19USU0xN19DTEtfRU5BQkxFIF9fSEFMX1JDQ19USU0xN19DTEtfRU5BQkxFDQotI2RlZmluZSBfX1RJTTE3X0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19USU0xN19DTEtfU0xFRVBfRElTQUJMRQ0KLSNkZWZpbmUgX19USU0xN19DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19USU0xN19DTEtfU0xFRVBfRU5BQkxFDQotI2RlZmluZSBfX1RJTTE3X0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19USU0xN19GT1JDRV9SRVNFVA0KLSNkZWZpbmUgX19USU0xN19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19USU0xN19SRUxFQVNFX1JFU0VUDQotI2RlZmluZSBfX1RJTTJfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1RJTTJfQ0xLX0RJU0FCTEUNCi0jZGVmaW5lIF9fVElNMl9DTEtfRU5BQkxFIF9fSEFMX1JDQ19USU0yX0NMS19FTkFCTEUNCi0jZGVmaW5lIF9fVElNMl9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfVElNMl9DTEtfU0xFRVBfRElTQUJMRQ0KLSNkZWZpbmUgX19USU0yX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1RJTTJfQ0xLX1NMRUVQX0VOQUJMRQ0KLSNkZWZpbmUgX19USU0yX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19USU0yX0ZPUkNFX1JFU0VUDQotI2RlZmluZSBfX1RJTTJfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVElNMl9SRUxFQVNFX1JFU0VUDQotI2RlZmluZSBfX1RJTTNfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1RJTTNfQ0xLX0RJU0FCTEUNCi0jZGVmaW5lIF9fVElNM19DTEtfRU5BQkxFIF9fSEFMX1JDQ19USU0zX0NMS19FTkFCTEUNCi0jZGVmaW5lIF9fVElNM19DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfVElNM19DTEtfU0xFRVBfRElTQUJMRQ0KLSNkZWZpbmUgX19USU0zX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1RJTTNfQ0xLX1NMRUVQX0VOQUJMRQ0KLSNkZWZpbmUgX19USU0zX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19USU0zX0ZPUkNFX1JFU0VUDQotI2RlZmluZSBfX1RJTTNfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVElNM19SRUxFQVNFX1JFU0VUDQotI2RlZmluZSBfX1RJTTRfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1RJTTRfQ0xLX0RJU0FCTEUNCi0jZGVmaW5lIF9fVElNNF9DTEtfRU5BQkxFIF9fSEFMX1JDQ19USU00X0NMS19FTkFCTEUNCi0jZGVmaW5lIF9fVElNNF9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfVElNNF9DTEtfU0xFRVBfRElTQUJMRQ0KLSNkZWZpbmUgX19USU00X0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1RJTTRfQ0xLX1NMRUVQX0VOQUJMRQ0KLSNkZWZpbmUgX19USU00X0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19USU00X0ZPUkNFX1JFU0VUDQotI2RlZmluZSBfX1RJTTRfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVElNNF9SRUxFQVNFX1JFU0VUDQotI2RlZmluZSBfX1RJTTVfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1RJTTVfQ0xLX0RJU0FCTEUNCi0jZGVmaW5lIF9fVElNNV9DTEtfRU5BQkxFIF9fSEFMX1JDQ19USU01X0NMS19FTkFCTEUNCi0jZGVmaW5lIF9fVElNNV9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfVElNNV9DTEtfU0xFRVBfRElTQUJMRQ0KLSNkZWZpbmUgX19USU01X0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1RJTTVfQ0xLX1NMRUVQX0VOQUJMRQ0KLSNkZWZpbmUgX19USU01X0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19USU01X0ZPUkNFX1JFU0VUDQotI2RlZmluZSBfX1RJTTVfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVElNNV9SRUxFQVNFX1JFU0VUDQotI2RlZmluZSBfX1RJTTZfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1RJTTZfQ0xLX0RJU0FCTEUNCi0jZGVmaW5lIF9fVElNNl9DTEtfRU5BQkxFIF9fSEFMX1JDQ19USU02X0NMS19FTkFCTEUNCi0jZGVmaW5lIF9fVElNNl9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfVElNNl9DTEtfU0xFRVBfRElTQUJMRQ0KLSNkZWZpbmUgX19USU02X0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1RJTTZfQ0xLX1NMRUVQX0VOQUJMRQ0KLSNkZWZpbmUgX19USU02X0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19USU02X0ZPUkNFX1JFU0VUDQotI2RlZmluZSBfX1RJTTZfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVElNNl9SRUxFQVNFX1JFU0VUDQotI2RlZmluZSBfX1RJTTdfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1RJTTdfQ0xLX0RJU0FCTEUNCi0jZGVmaW5lIF9fVElNN19DTEtfRU5BQkxFIF9fSEFMX1JDQ19USU03X0NMS19FTkFCTEUNCi0jZGVmaW5lIF9fVElNN19DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfVElNN19DTEtfU0xFRVBfRElTQUJMRQ0KLSNkZWZpbmUgX19USU03X0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1RJTTdfQ0xLX1NMRUVQX0VOQUJMRQ0KLSNkZWZpbmUgX19USU03X0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19USU03X0ZPUkNFX1JFU0VUDQotI2RlZmluZSBfX1RJTTdfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVElNN19SRUxFQVNFX1JFU0VUDQotI2RlZmluZSBfX1RJTThfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1RJTThfQ0xLX0RJU0FCTEUNCi0jZGVmaW5lIF9fVElNOF9DTEtfRU5BQkxFIF9fSEFMX1JDQ19USU04X0NMS19FTkFCTEUNCi0jZGVmaW5lIF9fVElNOF9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfVElNOF9DTEtfU0xFRVBfRElTQUJMRQ0KLSNkZWZpbmUgX19USU04X0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1RJTThfQ0xLX1NMRUVQX0VOQUJMRQ0KLSNkZWZpbmUgX19USU04X0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19USU04X0ZPUkNFX1JFU0VUDQotI2RlZmluZSBfX1RJTThfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVElNOF9SRUxFQVNFX1JFU0VUDQotI2RlZmluZSBfX1RJTTlfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1RJTTlfQ0xLX0RJU0FCTEUNCi0jZGVmaW5lIF9fVElNOV9DTEtfRU5BQkxFIF9fSEFMX1JDQ19USU05X0NMS19FTkFCTEUNCi0jZGVmaW5lIF9fVElNOV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVElNOV9GT1JDRV9SRVNFVA0KLSNkZWZpbmUgX19USU05X1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1RJTTlfUkVMRUFTRV9SRVNFVA0KLSNkZWZpbmUgX19UU0NfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1RTQ19DTEtfRElTQUJMRQ0KLSNkZWZpbmUgX19UU0NfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVFNDX0NMS19FTkFCTEUNCi0jZGVmaW5lIF9fVFNDX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19UU0NfQ0xLX1NMRUVQX0RJU0FCTEUNCi0jZGVmaW5lIF9fVFNDX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1RTQ19DTEtfU0xFRVBfRU5BQkxFDQotI2RlZmluZSBfX1RTQ19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVFNDX0ZPUkNFX1JFU0VUDQotI2RlZmluZSBfX1RTQ19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19UU0NfUkVMRUFTRV9SRVNFVA0KLSNkZWZpbmUgX19VQVJUNF9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVUFSVDRfQ0xLX0RJU0FCTEUNCi0jZGVmaW5lIF9fVUFSVDRfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVUFSVDRfQ0xLX0VOQUJMRQ0KLSNkZWZpbmUgX19VQVJUNF9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfVUFSVDRfQ0xLX1NMRUVQX0RJU0FCTEUNCi0jZGVmaW5lIF9fVUFSVDRfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfVUFSVDRfQ0xLX1NMRUVQX0VOQUJMRQ0KLSNkZWZpbmUgX19VQVJUNF9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVUFSVDRfRk9SQ0VfUkVTRVQNCi0jZGVmaW5lIF9fVUFSVDRfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVUFSVDRfUkVMRUFTRV9SRVNFVA0KLSNkZWZpbmUgX19VQVJUNV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVUFSVDVfQ0xLX0RJU0FCTEUNCi0jZGVmaW5lIF9fVUFSVDVfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVUFSVDVfQ0xLX0VOQUJMRQ0KLSNkZWZpbmUgX19VQVJUNV9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfVUFSVDVfQ0xLX1NMRUVQX0RJU0FCTEUNCi0jZGVmaW5lIF9fVUFSVDVfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfVUFSVDVfQ0xLX1NMRUVQX0VOQUJMRQ0KLSNkZWZpbmUgX19VQVJUNV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVUFSVDVfRk9SQ0VfUkVTRVQNCi0jZGVmaW5lIF9fVUFSVDVfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVUFSVDVfUkVMRUFTRV9SRVNFVA0KLSNkZWZpbmUgX19VU0FSVDFfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1VTQVJUMV9DTEtfRElTQUJMRQ0KLSNkZWZpbmUgX19VU0FSVDFfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVVNBUlQxX0NMS19FTkFCTEUNCi0jZGVmaW5lIF9fVVNBUlQxX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19VU0FSVDFfQ0xLX1NMRUVQX0RJU0FCTEUNCi0jZGVmaW5lIF9fVVNBUlQxX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1VTQVJUMV9DTEtfU0xFRVBfRU5BQkxFDQotI2RlZmluZSBfX1VTQVJUMV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVVNBUlQxX0ZPUkNFX1JFU0VUDQotI2RlZmluZSBfX1VTQVJUMV9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19VU0FSVDFfUkVMRUFTRV9SRVNFVA0KLSNkZWZpbmUgX19VU0FSVDJfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1VTQVJUMl9DTEtfRElTQUJMRQ0KLSNkZWZpbmUgX19VU0FSVDJfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVVNBUlQyX0NMS19FTkFCTEUNCi0jZGVmaW5lIF9fVVNBUlQyX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19VU0FSVDJfQ0xLX1NMRUVQX0RJU0FCTEUNCi0jZGVmaW5lIF9fVVNBUlQyX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1VTQVJUMl9DTEtfU0xFRVBfRU5BQkxFDQotI2RlZmluZSBfX1VTQVJUMl9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVVNBUlQyX0ZPUkNFX1JFU0VUDQotI2RlZmluZSBfX1VTQVJUMl9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19VU0FSVDJfUkVMRUFTRV9SRVNFVA0KLSNkZWZpbmUgX19VU0FSVDNfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1VTQVJUM19DTEtfRElTQUJMRQ0KLSNkZWZpbmUgX19VU0FSVDNfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVVNBUlQzX0NMS19FTkFCTEUNCi0jZGVmaW5lIF9fVVNBUlQzX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19VU0FSVDNfQ0xLX1NMRUVQX0RJU0FCTEUNCi0jZGVmaW5lIF9fVVNBUlQzX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1VTQVJUM19DTEtfU0xFRVBfRU5BQkxFDQotI2RlZmluZSBfX1VTQVJUM19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVVNBUlQzX0ZPUkNFX1JFU0VUDQotI2RlZmluZSBfX1VTQVJUM19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19VU0FSVDNfUkVMRUFTRV9SRVNFVA0KLSNkZWZpbmUgX19VU0FSVDRfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1VBUlQ0X0NMS19ESVNBQkxFDQotI2RlZmluZSBfX1VTQVJUNF9DTEtfRU5BQkxFIF9fSEFMX1JDQ19VQVJUNF9DTEtfRU5BQkxFDQotI2RlZmluZSBfX1VTQVJUNF9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19VQVJUNF9DTEtfU0xFRVBfRU5BQkxFDQotI2RlZmluZSBfX1VTQVJUNF9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfVUFSVDRfQ0xLX1NMRUVQX0RJU0FCTEUNCi0jZGVmaW5lIF9fVVNBUlQ0X0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19VQVJUNF9GT1JDRV9SRVNFVA0KLSNkZWZpbmUgX19VU0FSVDRfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVUFSVDRfUkVMRUFTRV9SRVNFVA0KLSNkZWZpbmUgX19VU0FSVDVfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1VBUlQ1X0NMS19ESVNBQkxFDQotI2RlZmluZSBfX1VTQVJUNV9DTEtfRU5BQkxFIF9fSEFMX1JDQ19VQVJUNV9DTEtfRU5BQkxFDQotI2RlZmluZSBfX1VTQVJUNV9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19VQVJUNV9DTEtfU0xFRVBfRU5BQkxFDQotI2RlZmluZSBfX1VTQVJUNV9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfVUFSVDVfQ0xLX1NMRUVQX0RJU0FCTEUNCi0jZGVmaW5lIF9fVVNBUlQ1X0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19VQVJUNV9GT1JDRV9SRVNFVA0KLSNkZWZpbmUgX19VU0FSVDVfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVUFSVDVfUkVMRUFTRV9SRVNFVA0KLSNkZWZpbmUgX19VU0FSVDdfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1VBUlQ3X0NMS19ESVNBQkxFDQotI2RlZmluZSBfX1VTQVJUN19DTEtfRU5BQkxFIF9fSEFMX1JDQ19VQVJUN19DTEtfRU5BQkxFDQotI2RlZmluZSBfX1VTQVJUN19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVUFSVDdfRk9SQ0VfUkVTRVQNCi0jZGVmaW5lIF9fVVNBUlQ3X1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1VBUlQ3X1JFTEVBU0VfUkVTRVQNCi0jZGVmaW5lIF9fVVNBUlQ4X0NMS19ESVNBQkxFIF9fSEFMX1JDQ19VQVJUOF9DTEtfRElTQUJMRQ0KLSNkZWZpbmUgX19VU0FSVDhfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVUFSVDhfQ0xLX0VOQUJMRQ0KLSNkZWZpbmUgX19VU0FSVDhfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1VBUlQ4X0ZPUkNFX1JFU0VUDQotI2RlZmluZSBfX1VTQVJUOF9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19VQVJUOF9SRUxFQVNFX1JFU0VUDQotI2RlZmluZSBfX1VTQl9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVVNCX0NMS19ESVNBQkxFDQotI2RlZmluZSBfX1VTQl9DTEtfRU5BQkxFIF9fSEFMX1JDQ19VU0JfQ0xLX0VOQUJMRQ0KLSNkZWZpbmUgX19VU0JfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1VTQl9GT1JDRV9SRVNFVA0KLSNkZWZpbmUgX19VU0JfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfVVNCX0NMS19TTEVFUF9FTkFCTEUNCi0jZGVmaW5lIF9fVVNCX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19VU0JfQ0xLX1NMRUVQX0RJU0FCTEUNCi0jZGVmaW5lIF9fVVNCX09UR19GU19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVVNCX09UR19GU19DTEtfRElTQUJMRQ0KLSNkZWZpbmUgX19VU0JfT1RHX0ZTX0NMS19FTkFCTEUgX19IQUxfUkNDX1VTQl9PVEdfRlNfQ0xLX0VOQUJMRQ0KLSNkZWZpbmUgX19VU0JfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVVNCX1JFTEVBU0VfUkVTRVQNCi0NCi0jaWYgZGVmaW5lZChTVE0zMkg3KQ0KLSNkZWZpbmUgX19IQUxfUkNDX1dXREdfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1dXREcxX0NMS19ESVNBQkxFDQotI2RlZmluZSBfX0hBTF9SQ0NfV1dER19DTEtfRU5BQkxFIF9fSEFMX1JDQ19XV0RHMV9DTEtfRU5BQkxFDQotI2RlZmluZSBfX0hBTF9SQ0NfV1dER19DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfV1dERzFfQ0xLX1NMRUVQX0RJU0FCTEUNCi0jZGVmaW5lIF9fSEFMX1JDQ19XV0RHX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1dXREcxX0NMS19TTEVFUF9FTkFCTEUNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19XV0RHX0ZPUkNFX1JFU0VUICAgXA0KLSAgKCh2b2lkKTBVKSAvKiBOb3QgYXZhaWxhYmxlIG9uIHRoZSBcDQotICAgICAgICAgICAgICAgIFNUTTMySDcqLw0KLSNkZWZpbmUgX19IQUxfUkNDX1dXREdfUkVMRUFTRV9SRVNFVCBcDQotICAoKHZvaWQpMFUpIC8qIE5vdCBhdmFpbGFibGUgb24gdGhlIFNUTTMySDcqLw0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1dXREdfSVNfQ0xLX0VOQUJMRUQgX19IQUxfUkNDX1dXREcxX0lTX0NMS19FTkFCTEVEDQotI2RlZmluZSBfX0hBTF9SQ0NfV1dER19JU19DTEtfRElTQUJMRUQgX19IQUxfUkNDX1dXREcxX0lTX0NMS19ESVNBQkxFRA0KLSNlbmRpZg0KLQ0KLSNkZWZpbmUgX19XV0RHX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19XV0RHX0NMS19ESVNBQkxFDQotI2RlZmluZSBfX1dXREdfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfV1dER19DTEtfRU5BQkxFDQotI2RlZmluZSBfX1dXREdfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1dXREdfQ0xLX1NMRUVQX0RJU0FCTEUNCi0jZGVmaW5lIF9fV1dER19DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19XV0RHX0NMS19TTEVFUF9FTkFCTEUNCi0jZGVmaW5lIF9fV1dER19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfV1dER19GT1JDRV9SRVNFVA0KLSNkZWZpbmUgX19XV0RHX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1dXREdfUkVMRUFTRV9SRVNFVA0KLQ0KLSNkZWZpbmUgX19USU0yMV9DTEtfRU5BQkxFIF9fSEFMX1JDQ19USU0yMV9DTEtfRU5BQkxFDQotI2RlZmluZSBfX1RJTTIxX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19USU0yMV9DTEtfRElTQUJMRQ0KLSNkZWZpbmUgX19USU0yMV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVElNMjFfRk9SQ0VfUkVTRVQNCi0jZGVmaW5lIF9fVElNMjFfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVElNMjFfUkVMRUFTRV9SRVNFVA0KLSNkZWZpbmUgX19USU0yMV9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19USU0yMV9DTEtfU0xFRVBfRU5BQkxFDQotI2RlZmluZSBfX1RJTTIxX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19USU0yMV9DTEtfU0xFRVBfRElTQUJMRQ0KLSNkZWZpbmUgX19USU0yMl9DTEtfRU5BQkxFIF9fSEFMX1JDQ19USU0yMl9DTEtfRU5BQkxFDQotI2RlZmluZSBfX1RJTTIyX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19USU0yMl9DTEtfRElTQUJMRQ0KLSNkZWZpbmUgX19USU0yMl9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVElNMjJfRk9SQ0VfUkVTRVQNCi0jZGVmaW5lIF9fVElNMjJfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVElNMjJfUkVMRUFTRV9SRVNFVA0KLSNkZWZpbmUgX19USU0yMl9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19USU0yMl9DTEtfU0xFRVBfRU5BQkxFDQotI2RlZmluZSBfX1RJTTIyX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19USU0yMl9DTEtfU0xFRVBfRElTQUJMRQ0KLSNkZWZpbmUgX19DUlNfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0NSU19DTEtfRElTQUJMRQ0KLSNkZWZpbmUgX19DUlNfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfQ1JTX0NMS19FTkFCTEUNCi0jZGVmaW5lIF9fQ1JTX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19DUlNfQ0xLX1NMRUVQX0RJU0FCTEUNCi0jZGVmaW5lIF9fQ1JTX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0NSU19DTEtfU0xFRVBfRU5BQkxFDQotI2RlZmluZSBfX0NSU19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfQ1JTX0ZPUkNFX1JFU0VUDQotI2RlZmluZSBfX0NSU19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19DUlNfUkVMRUFTRV9SRVNFVA0KLSNkZWZpbmUgX19SQ0NfQkFDS1VQUkVTRVRfRk9SQ0UgX19IQUxfUkNDX0JBQ0tVUFJFU0VUX0ZPUkNFDQotI2RlZmluZSBfX1JDQ19CQUNLVVBSRVNFVF9SRUxFQVNFIF9fSEFMX1JDQ19CQUNLVVBSRVNFVF9SRUxFQVNFDQotDQotI2RlZmluZSBfX1VTQl9PVEdfRlNfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1VTQl9PVEdfRlNfRk9SQ0VfUkVTRVQNCi0jZGVmaW5lIF9fVVNCX09UR19GU19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19VU0JfT1RHX0ZTX1JFTEVBU0VfUkVTRVQNCi0jZGVmaW5lIF9fVVNCX09UR19GU19DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19VU0JfT1RHX0ZTX0NMS19TTEVFUF9FTkFCTEUNCi0jZGVmaW5lIF9fVVNCX09UR19GU19DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfVVNCX09UR19GU19DTEtfU0xFRVBfRElTQUJMRQ0KLSNkZWZpbmUgX19VU0JfT1RHX0hTX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19VU0JfT1RHX0hTX0NMS19ESVNBQkxFDQotI2RlZmluZSBfX1VTQl9PVEdfSFNfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVVNCX09UR19IU19DTEtfRU5BQkxFDQotI2RlZmluZSBfX1VTQl9PVEdfSFNfVUxQSV9DTEtfRU5BQkxFIF9fSEFMX1JDQ19VU0JfT1RHX0hTX1VMUElfQ0xLX0VOQUJMRQ0KLSNkZWZpbmUgX19VU0JfT1RHX0hTX1VMUElfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1VTQl9PVEdfSFNfVUxQSV9DTEtfRElTQUJMRQ0KLSNkZWZpbmUgX19USU05X0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1RJTTlfQ0xLX1NMRUVQX0VOQUJMRQ0KLSNkZWZpbmUgX19USU05X0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19USU05X0NMS19TTEVFUF9ESVNBQkxFDQotI2RlZmluZSBfX1RJTTEwX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1RJTTEwX0NMS19TTEVFUF9FTkFCTEUNCi0jZGVmaW5lIF9fVElNMTBfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1RJTTEwX0NMS19TTEVFUF9ESVNBQkxFDQotI2RlZmluZSBfX1RJTTExX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1RJTTExX0NMS19TTEVFUF9FTkFCTEUNCi0jZGVmaW5lIF9fVElNMTFfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1RJTTExX0NMS19TTEVFUF9ESVNBQkxFDQotI2RlZmluZSBfX0VUSE1BQ1BUUF9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19FVEhNQUNQVFBfQ0xLX1NMRUVQX0VOQUJMRQ0KLSNkZWZpbmUgX19FVEhNQUNQVFBfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0VUSE1BQ1BUUF9DTEtfU0xFRVBfRElTQUJMRQ0KLSNkZWZpbmUgX19FVEhNQUNQVFBfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfRVRITUFDUFRQX0NMS19FTkFCTEUNCi0jZGVmaW5lIF9fRVRITUFDUFRQX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19FVEhNQUNQVFBfQ0xLX0RJU0FCTEUNCi0jZGVmaW5lIF9fSEFTSF9DTEtfRU5BQkxFIF9fSEFMX1JDQ19IQVNIX0NMS19FTkFCTEUNCi0jZGVmaW5lIF9fSEFTSF9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfSEFTSF9GT1JDRV9SRVNFVA0KLSNkZWZpbmUgX19IQVNIX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0hBU0hfUkVMRUFTRV9SRVNFVA0KLSNkZWZpbmUgX19IQVNIX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0hBU0hfQ0xLX1NMRUVQX0VOQUJMRQ0KLSNkZWZpbmUgX19IQVNIX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19IQVNIX0NMS19TTEVFUF9ESVNBQkxFDQotI2RlZmluZSBfX0hBU0hfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0hBU0hfQ0xLX0RJU0FCTEUNCi0jZGVmaW5lIF9fU1BJNV9DTEtfRU5BQkxFIF9fSEFMX1JDQ19TUEk1X0NMS19FTkFCTEUNCi0jZGVmaW5lIF9fU1BJNV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfU1BJNV9DTEtfRElTQUJMRQ0KLSNkZWZpbmUgX19TUEk1X0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19TUEk1X0ZPUkNFX1JFU0VUDQotI2RlZmluZSBfX1NQSTVfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfU1BJNV9SRUxFQVNFX1JFU0VUDQotI2RlZmluZSBfX1NQSTVfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfU1BJNV9DTEtfU0xFRVBfRU5BQkxFDQotI2RlZmluZSBfX1NQSTVfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1NQSTVfQ0xLX1NMRUVQX0RJU0FCTEUNCi0jZGVmaW5lIF9fU1BJNl9DTEtfRU5BQkxFIF9fSEFMX1JDQ19TUEk2X0NMS19FTkFCTEUNCi0jZGVmaW5lIF9fU1BJNl9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfU1BJNl9DTEtfRElTQUJMRQ0KLSNkZWZpbmUgX19TUEk2X0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19TUEk2X0ZPUkNFX1JFU0VUDQotI2RlZmluZSBfX1NQSTZfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfU1BJNl9SRUxFQVNFX1JFU0VUDQotI2RlZmluZSBfX1NQSTZfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfU1BJNl9DTEtfU0xFRVBfRU5BQkxFDQotI2RlZmluZSBfX1NQSTZfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1NQSTZfQ0xLX1NMRUVQX0RJU0FCTEUNCi0jZGVmaW5lIF9fTFREQ19DTEtfRU5BQkxFIF9fSEFMX1JDQ19MVERDX0NMS19FTkFCTEUNCi0jZGVmaW5lIF9fTFREQ19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfTFREQ19DTEtfRElTQUJMRQ0KLSNkZWZpbmUgX19MVERDX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19MVERDX0ZPUkNFX1JFU0VUDQotI2RlZmluZSBfX0xURENfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfTFREQ19SRUxFQVNFX1JFU0VUDQotI2RlZmluZSBfX0xURENfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfTFREQ19DTEtfU0xFRVBfRU5BQkxFDQotI2RlZmluZSBfX0VUSE1BQ19DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19FVEhNQUNfQ0xLX1NMRUVQX0VOQUJMRQ0KLSNkZWZpbmUgX19FVEhNQUNfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0VUSE1BQ19DTEtfU0xFRVBfRElTQUJMRQ0KLSNkZWZpbmUgX19FVEhNQUNUWF9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19FVEhNQUNUWF9DTEtfU0xFRVBfRU5BQkxFDQotI2RlZmluZSBfX0VUSE1BQ1RYX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19FVEhNQUNUWF9DTEtfU0xFRVBfRElTQUJMRQ0KLSNkZWZpbmUgX19FVEhNQUNSWF9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19FVEhNQUNSWF9DTEtfU0xFRVBfRU5BQkxFDQotI2RlZmluZSBfX0VUSE1BQ1JYX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19FVEhNQUNSWF9DTEtfU0xFRVBfRElTQUJMRQ0KLSNkZWZpbmUgX19USU0xMl9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19USU0xMl9DTEtfU0xFRVBfRU5BQkxFDQotI2RlZmluZSBfX1RJTTEyX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19USU0xMl9DTEtfU0xFRVBfRElTQUJMRQ0KLSNkZWZpbmUgX19USU0xM19DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19USU0xM19DTEtfU0xFRVBfRU5BQkxFDQotI2RlZmluZSBfX1RJTTEzX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19USU0xM19DTEtfU0xFRVBfRElTQUJMRQ0KLSNkZWZpbmUgX19USU0xNF9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19USU0xNF9DTEtfU0xFRVBfRU5BQkxFDQotI2RlZmluZSBfX1RJTTE0X0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19USU0xNF9DTEtfU0xFRVBfRElTQUJMRQ0KLSNkZWZpbmUgX19CS1BTUkFNX0NMS19FTkFCTEUgX19IQUxfUkNDX0JLUFNSQU1fQ0xLX0VOQUJMRQ0KLSNkZWZpbmUgX19CS1BTUkFNX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19CS1BTUkFNX0NMS19ESVNBQkxFDQotI2RlZmluZSBfX0JLUFNSQU1fQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfQktQU1JBTV9DTEtfU0xFRVBfRU5BQkxFDQotI2RlZmluZSBfX0JLUFNSQU1fQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0JLUFNSQU1fQ0xLX1NMRUVQX0RJU0FCTEUNCi0jZGVmaW5lIF9fQ0NNREFUQVJBTUVOX0NMS19FTkFCTEUgX19IQUxfUkNDX0NDTURBVEFSQU1FTl9DTEtfRU5BQkxFDQotI2RlZmluZSBfX0NDTURBVEFSQU1FTl9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfQ0NNREFUQVJBTUVOX0NMS19ESVNBQkxFDQotI2RlZmluZSBfX1VTQVJUNl9DTEtfRU5BQkxFIF9fSEFMX1JDQ19VU0FSVDZfQ0xLX0VOQUJMRQ0KLSNkZWZpbmUgX19VU0FSVDZfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1VTQVJUNl9DTEtfRElTQUJMRQ0KLSNkZWZpbmUgX19VU0FSVDZfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1VTQVJUNl9GT1JDRV9SRVNFVA0KLSNkZWZpbmUgX19VU0FSVDZfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVVNBUlQ2X1JFTEVBU0VfUkVTRVQNCi0jZGVmaW5lIF9fVVNBUlQ2X0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1VTQVJUNl9DTEtfU0xFRVBfRU5BQkxFDQotI2RlZmluZSBfX1VTQVJUNl9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfVVNBUlQ2X0NMS19TTEVFUF9ESVNBQkxFDQotI2RlZmluZSBfX1NQSTRfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfU1BJNF9DTEtfRU5BQkxFDQotI2RlZmluZSBfX1NQSTRfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1NQSTRfQ0xLX0RJU0FCTEUNCi0jZGVmaW5lIF9fU1BJNF9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfU1BJNF9GT1JDRV9SRVNFVA0KLSNkZWZpbmUgX19TUEk0X1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1NQSTRfUkVMRUFTRV9SRVNFVA0KLSNkZWZpbmUgX19TUEk0X0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1NQSTRfQ0xLX1NMRUVQX0VOQUJMRQ0KLSNkZWZpbmUgX19TUEk0X0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19TUEk0X0NMS19TTEVFUF9ESVNBQkxFDQotI2RlZmluZSBfX0dQSU9JX0NMS19FTkFCTEUgX19IQUxfUkNDX0dQSU9JX0NMS19FTkFCTEUNCi0jZGVmaW5lIF9fR1BJT0lfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0dQSU9JX0NMS19ESVNBQkxFDQotI2RlZmluZSBfX0dQSU9JX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19HUElPSV9GT1JDRV9SRVNFVA0KLSNkZWZpbmUgX19HUElPSV9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19HUElPSV9SRUxFQVNFX1JFU0VUDQotI2RlZmluZSBfX0dQSU9JX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0dQSU9JX0NMS19TTEVFUF9FTkFCTEUNCi0jZGVmaW5lIF9fR1BJT0lfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0dQSU9JX0NMS19TTEVFUF9ESVNBQkxFDQotI2RlZmluZSBfX0dQSU9KX0NMS19FTkFCTEUgX19IQUxfUkNDX0dQSU9KX0NMS19FTkFCTEUNCi0jZGVmaW5lIF9fR1BJT0pfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0dQSU9KX0NMS19ESVNBQkxFDQotI2RlZmluZSBfX0dQSU9KX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19HUElPSl9GT1JDRV9SRVNFVA0KLSNkZWZpbmUgX19HUElPSl9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19HUElPSl9SRUxFQVNFX1JFU0VUDQotI2RlZmluZSBfX0dQSU9KX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0dQSU9KX0NMS19TTEVFUF9FTkFCTEUNCi0jZGVmaW5lIF9fR1BJT0pfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0dQSU9KX0NMS19TTEVFUF9ESVNBQkxFDQotI2RlZmluZSBfX0dQSU9LX0NMS19FTkFCTEUgX19IQUxfUkNDX0dQSU9LX0NMS19FTkFCTEUNCi0jZGVmaW5lIF9fR1BJT0tfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0dQSU9LX0NMS19ESVNBQkxFDQotI2RlZmluZSBfX0dQSU9LX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0dQSU9LX1JFTEVBU0VfUkVTRVQNCi0jZGVmaW5lIF9fR1BJT0tfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfR1BJT0tfQ0xLX1NMRUVQX0VOQUJMRQ0KLSNkZWZpbmUgX19HUElPS19DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfR1BJT0tfQ0xLX1NMRUVQX0RJU0FCTEUNCi0jZGVmaW5lIF9fRVRIX0NMS19FTkFCTEUgX19IQUxfUkNDX0VUSF9DTEtfRU5BQkxFDQotI2RlZmluZSBfX0VUSF9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfRVRIX0NMS19ESVNBQkxFDQotI2RlZmluZSBfX0RDTUlfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfRENNSV9DTEtfRU5BQkxFDQotI2RlZmluZSBfX0RDTUlfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0RDTUlfQ0xLX0RJU0FCTEUNCi0jZGVmaW5lIF9fRENNSV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfRENNSV9GT1JDRV9SRVNFVA0KLSNkZWZpbmUgX19EQ01JX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0RDTUlfUkVMRUFTRV9SRVNFVA0KLSNkZWZpbmUgX19EQ01JX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0RDTUlfQ0xLX1NMRUVQX0VOQUJMRQ0KLSNkZWZpbmUgX19EQ01JX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19EQ01JX0NMS19TTEVFUF9ESVNBQkxFDQotI2RlZmluZSBfX1VBUlQ3X0NMS19FTkFCTEUgX19IQUxfUkNDX1VBUlQ3X0NMS19FTkFCTEUNCi0jZGVmaW5lIF9fVUFSVDdfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1VBUlQ3X0NMS19ESVNBQkxFDQotI2RlZmluZSBfX1VBUlQ3X1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1VBUlQ3X1JFTEVBU0VfUkVTRVQNCi0jZGVmaW5lIF9fVUFSVDdfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1VBUlQ3X0ZPUkNFX1JFU0VUDQotI2RlZmluZSBfX1VBUlQ3X0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1VBUlQ3X0NMS19TTEVFUF9FTkFCTEUNCi0jZGVmaW5lIF9fVUFSVDdfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1VBUlQ3X0NMS19TTEVFUF9ESVNBQkxFDQotI2RlZmluZSBfX1VBUlQ4X0NMS19FTkFCTEUgX19IQUxfUkNDX1VBUlQ4X0NMS19FTkFCTEUNCi0jZGVmaW5lIF9fVUFSVDhfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1VBUlQ4X0NMS19ESVNBQkxFDQotI2RlZmluZSBfX1VBUlQ4X0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19VQVJUOF9GT1JDRV9SRVNFVA0KLSNkZWZpbmUgX19VQVJUOF9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19VQVJUOF9SRUxFQVNFX1JFU0VUDQotI2RlZmluZSBfX1VBUlQ4X0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1VBUlQ4X0NMS19TTEVFUF9FTkFCTEUNCi0jZGVmaW5lIF9fVUFSVDhfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1VBUlQ4X0NMS19TTEVFUF9ESVNBQkxFDQotI2RlZmluZSBfX09UR0hTX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1VTQl9PVEdfSFNfQ0xLX1NMRUVQX0VOQUJMRQ0KLSNkZWZpbmUgX19PVEdIU19DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfVVNCX09UR19IU19DTEtfU0xFRVBfRElTQUJMRQ0KLSNkZWZpbmUgX19PVEdIU19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVVNCX09UR19IU19GT1JDRV9SRVNFVA0KLSNkZWZpbmUgX19PVEdIU19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19VU0JfT1RHX0hTX1JFTEVBU0VfUkVTRVQNCi0jZGVmaW5lIF9fT1RHSFNVTFBJX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1VTQl9PVEdfSFNfVUxQSV9DTEtfU0xFRVBfRU5BQkxFDQotI2RlZmluZSBfX09UR0hTVUxQSV9DTEtfU0xFRVBfRElTQUJMRSBcDQotICBfX0hBTF9SQ0NfVVNCX09UR19IU19VTFBJX0NMS19TTEVFUF9ESVNBQkxFDQotI2RlZmluZSBfX0hBTF9SQ0NfT1RHSFNfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfVVNCX09UR19IU19DTEtfU0xFRVBfRU5BQkxFDQotI2RlZmluZSBfX0hBTF9SQ0NfT1RHSFNfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1VTQl9PVEdfSFNfQ0xLX1NMRUVQX0RJU0FCTEUNCi0jZGVmaW5lIF9fSEFMX1JDQ19PVEdIU19JU19DTEtfU0xFRVBfRU5BQkxFRCBcDQotICBfX0hBTF9SQ0NfVVNCX09UR19IU19JU19DTEtfU0xFRVBfRU5BQkxFRA0KLSNkZWZpbmUgX19IQUxfUkNDX09UR0hTX0lTX0NMS19TTEVFUF9ESVNBQkxFRCBcDQotICBfX0hBTF9SQ0NfVVNCX09UR19IU19JU19DTEtfU0xFRVBfRElTQUJMRUQNCi0jZGVmaW5lIF9fSEFMX1JDQ19PVEdIU19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVVNCX09UR19IU19GT1JDRV9SRVNFVA0KLSNkZWZpbmUgX19IQUxfUkNDX09UR0hTX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1VTQl9PVEdfSFNfUkVMRUFTRV9SRVNFVA0KLSNkZWZpbmUgX19IQUxfUkNDX09UR0hTVUxQSV9DTEtfU0xFRVBfRU5BQkxFIFwNCi0gIF9fSEFMX1JDQ19VU0JfT1RHX0hTX1VMUElfQ0xLX1NMRUVQX0VOQUJMRQ0KLSNkZWZpbmUgX19IQUxfUkNDX09UR0hTVUxQSV9DTEtfU0xFRVBfRElTQUJMRSBcDQotICBfX0hBTF9SQ0NfVVNCX09UR19IU19VTFBJX0NMS19TTEVFUF9ESVNBQkxFDQotI2RlZmluZSBfX0hBTF9SQ0NfT1RHSFNVTFBJX0lTX0NMS19TTEVFUF9FTkFCTEVEIFwNCi0gIF9fSEFMX1JDQ19VU0JfT1RHX0hTX1VMUElfSVNfQ0xLX1NMRUVQX0VOQUJMRUQNCi0jZGVmaW5lIF9fSEFMX1JDQ19PVEdIU1VMUElfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEIFwNCi0gIF9fSEFMX1JDQ19VU0JfT1RHX0hTX1VMUElfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEDQotI2RlZmluZSBfX1NSQU0zX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1NSQU0zX0NMS19TTEVFUF9FTkFCTEUNCi0jZGVmaW5lIF9fQ0FOMl9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19DQU4yX0NMS19TTEVFUF9FTkFCTEUNCi0jZGVmaW5lIF9fQ0FOMl9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfQ0FOMl9DTEtfU0xFRVBfRElTQUJMRQ0KLSNkZWZpbmUgX19EQUNfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfREFDX0NMS19TTEVFUF9FTkFCTEUNCi0jZGVmaW5lIF9fREFDX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19EQUNfQ0xLX1NMRUVQX0RJU0FCTEUNCi0jZGVmaW5lIF9fQURDMl9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19BREMyX0NMS19TTEVFUF9FTkFCTEUNCi0jZGVmaW5lIF9fQURDMl9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfQURDMl9DTEtfU0xFRVBfRElTQUJMRQ0KLSNkZWZpbmUgX19BREMzX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0FEQzNfQ0xLX1NMRUVQX0VOQUJMRQ0KLSNkZWZpbmUgX19BREMzX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19BREMzX0NMS19TTEVFUF9ESVNBQkxFDQotI2RlZmluZSBfX0ZTTUNfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0ZTTUNfRk9SQ0VfUkVTRVQNCi0jZGVmaW5lIF9fRlNNQ19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19GU01DX1JFTEVBU0VfUkVTRVQNCi0jZGVmaW5lIF9fRlNNQ19DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19GU01DX0NMS19TTEVFUF9FTkFCTEUNCi0jZGVmaW5lIF9fRlNNQ19DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfRlNNQ19DTEtfU0xFRVBfRElTQUJMRQ0KLSNkZWZpbmUgX19TRElPX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19TRElPX0ZPUkNFX1JFU0VUDQotI2RlZmluZSBfX1NESU9fUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfU0RJT19SRUxFQVNFX1JFU0VUDQotI2RlZmluZSBfX1NESU9fQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1NESU9fQ0xLX1NMRUVQX0RJU0FCTEUNCi0jZGVmaW5lIF9fU0RJT19DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19TRElPX0NMS19TTEVFUF9FTkFCTEUNCi0jZGVmaW5lIF9fRE1BMkRfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfRE1BMkRfQ0xLX0VOQUJMRQ0KLSNkZWZpbmUgX19ETUEyRF9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfRE1BMkRfQ0xLX0RJU0FCTEUNCi0jZGVmaW5lIF9fRE1BMkRfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0RNQTJEX0ZPUkNFX1JFU0VUDQotI2RlZmluZSBfX0RNQTJEX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0RNQTJEX1JFTEVBU0VfUkVTRVQNCi0jZGVmaW5lIF9fRE1BMkRfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfRE1BMkRfQ0xLX1NMRUVQX0VOQUJMRQ0KLSNkZWZpbmUgX19ETUEyRF9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfRE1BMkRfQ0xLX1NMRUVQX0RJU0FCTEUNCi0NCi0vKiBhbGlhcyBkZWZpbmUgbWFpbnRhaW5lZCBmb3IgbGVnYWN5ICovDQotI2RlZmluZSBfX0hBTF9SQ0NfT1RHRlNfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1VTQl9PVEdfRlNfRk9SQ0VfUkVTRVQNCi0jZGVmaW5lIF9fSEFMX1JDQ19PVEdGU19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19VU0JfT1RHX0ZTX1JFTEVBU0VfUkVTRVQNCi0NCi0jZGVmaW5lIF9fQURDMTJfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfQURDMTJfQ0xLX0VOQUJMRQ0KLSNkZWZpbmUgX19BREMxMl9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfQURDMTJfQ0xLX0RJU0FCTEUNCi0jZGVmaW5lIF9fQURDMzRfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfQURDMzRfQ0xLX0VOQUJMRQ0KLSNkZWZpbmUgX19BREMzNF9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfQURDMzRfQ0xLX0RJU0FCTEUNCi0jZGVmaW5lIF9fREFDMl9DTEtfRU5BQkxFIF9fSEFMX1JDQ19EQUMyX0NMS19FTkFCTEUNCi0jZGVmaW5lIF9fREFDMl9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfREFDMl9DTEtfRElTQUJMRQ0KLSNkZWZpbmUgX19USU0xOF9DTEtfRU5BQkxFIF9fSEFMX1JDQ19USU0xOF9DTEtfRU5BQkxFDQotI2RlZmluZSBfX1RJTTE4X0NMS19ESVNBQkxFIF9fSEFMX1JDQ19USU0xOF9DTEtfRElTQUJMRQ0KLSNkZWZpbmUgX19USU0xOV9DTEtfRU5BQkxFIF9fSEFMX1JDQ19USU0xOV9DTEtfRU5BQkxFDQotI2RlZmluZSBfX1RJTTE5X0NMS19ESVNBQkxFIF9fSEFMX1JDQ19USU0xOV9DTEtfRElTQUJMRQ0KLSNkZWZpbmUgX19USU0yMF9DTEtfRU5BQkxFIF9fSEFMX1JDQ19USU0yMF9DTEtfRU5BQkxFDQotI2RlZmluZSBfX1RJTTIwX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19USU0yMF9DTEtfRElTQUJMRQ0KLSNkZWZpbmUgX19IUlRJTTFfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfSFJUSU0xX0NMS19FTkFCTEUNCi0jZGVmaW5lIF9fSFJUSU0xX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19IUlRJTTFfQ0xLX0RJU0FCTEUNCi0jZGVmaW5lIF9fU0RBREMxX0NMS19FTkFCTEUgX19IQUxfUkNDX1NEQURDMV9DTEtfRU5BQkxFDQotI2RlZmluZSBfX1NEQURDMl9DTEtfRU5BQkxFIF9fSEFMX1JDQ19TREFEQzJfQ0xLX0VOQUJMRQ0KLSNkZWZpbmUgX19TREFEQzNfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfU0RBREMzX0NMS19FTkFCTEUNCi0jZGVmaW5lIF9fU0RBREMxX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19TREFEQzFfQ0xLX0RJU0FCTEUNCi0jZGVmaW5lIF9fU0RBREMyX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19TREFEQzJfQ0xLX0RJU0FCTEUNCi0jZGVmaW5lIF9fU0RBREMzX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19TREFEQzNfQ0xLX0RJU0FCTEUNCi0NCi0jZGVmaW5lIF9fQURDMTJfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0FEQzEyX0ZPUkNFX1JFU0VUDQotI2RlZmluZSBfX0FEQzEyX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0FEQzEyX1JFTEVBU0VfUkVTRVQNCi0jZGVmaW5lIF9fQURDMzRfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0FEQzM0X0ZPUkNFX1JFU0VUDQotI2RlZmluZSBfX0FEQzM0X1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0FEQzM0X1JFTEVBU0VfUkVTRVQNCi0jZGVmaW5lIF9fREFDMl9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfREFDMl9GT1JDRV9SRVNFVA0KLSNkZWZpbmUgX19EQUMyX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0RBQzJfUkVMRUFTRV9SRVNFVA0KLSNkZWZpbmUgX19USU0xOF9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVElNMThfRk9SQ0VfUkVTRVQNCi0jZGVmaW5lIF9fVElNMThfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVElNMThfUkVMRUFTRV9SRVNFVA0KLSNkZWZpbmUgX19USU0xOV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVElNMTlfRk9SQ0VfUkVTRVQNCi0jZGVmaW5lIF9fVElNMTlfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVElNMTlfUkVMRUFTRV9SRVNFVA0KLSNkZWZpbmUgX19USU0yMF9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVElNMjBfRk9SQ0VfUkVTRVQNCi0jZGVmaW5lIF9fVElNMjBfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVElNMjBfUkVMRUFTRV9SRVNFVA0KLSNkZWZpbmUgX19IUlRJTTFfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0hSVElNMV9GT1JDRV9SRVNFVA0KLSNkZWZpbmUgX19IUlRJTTFfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfSFJUSU0xX1JFTEVBU0VfUkVTRVQNCi0jZGVmaW5lIF9fU0RBREMxX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19TREFEQzFfRk9SQ0VfUkVTRVQNCi0jZGVmaW5lIF9fU0RBREMyX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19TREFEQzJfRk9SQ0VfUkVTRVQNCi0jZGVmaW5lIF9fU0RBREMzX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19TREFEQzNfRk9SQ0VfUkVTRVQNCi0jZGVmaW5lIF9fU0RBREMxX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1NEQURDMV9SRUxFQVNFX1JFU0VUDQotI2RlZmluZSBfX1NEQURDMl9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19TREFEQzJfUkVMRUFTRV9SRVNFVA0KLSNkZWZpbmUgX19TREFEQzNfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfU0RBREMzX1JFTEVBU0VfUkVTRVQNCi0NCi0jZGVmaW5lIF9fQURDMV9JU19DTEtfRU5BQkxFRCBfX0hBTF9SQ0NfQURDMV9JU19DTEtfRU5BQkxFRA0KLSNkZWZpbmUgX19BREMxX0lTX0NMS19ESVNBQkxFRCBfX0hBTF9SQ0NfQURDMV9JU19DTEtfRElTQUJMRUQNCi0jZGVmaW5lIF9fQURDMTJfSVNfQ0xLX0VOQUJMRUQgX19IQUxfUkNDX0FEQzEyX0lTX0NMS19FTkFCTEVEDQotI2RlZmluZSBfX0FEQzEyX0lTX0NMS19ESVNBQkxFRCBfX0hBTF9SQ0NfQURDMTJfSVNfQ0xLX0RJU0FCTEVEDQotI2RlZmluZSBfX0FEQzM0X0lTX0NMS19FTkFCTEVEIF9fSEFMX1JDQ19BREMzNF9JU19DTEtfRU5BQkxFRA0KLSNkZWZpbmUgX19BREMzNF9JU19DTEtfRElTQUJMRUQgX19IQUxfUkNDX0FEQzM0X0lTX0NMS19ESVNBQkxFRA0KLSNkZWZpbmUgX19DRUNfSVNfQ0xLX0VOQUJMRUQgX19IQUxfUkNDX0NFQ19JU19DTEtfRU5BQkxFRA0KLSNkZWZpbmUgX19DRUNfSVNfQ0xLX0RJU0FCTEVEIF9fSEFMX1JDQ19DRUNfSVNfQ0xLX0RJU0FCTEVEDQotI2RlZmluZSBfX0NSQ19JU19DTEtfRU5BQkxFRCBfX0hBTF9SQ0NfQ1JDX0lTX0NMS19FTkFCTEVEDQotI2RlZmluZSBfX0NSQ19JU19DTEtfRElTQUJMRUQgX19IQUxfUkNDX0NSQ19JU19DTEtfRElTQUJMRUQNCi0jZGVmaW5lIF9fREFDMV9JU19DTEtfRU5BQkxFRCBfX0hBTF9SQ0NfREFDMV9JU19DTEtfRU5BQkxFRA0KLSNkZWZpbmUgX19EQUMxX0lTX0NMS19ESVNBQkxFRCBfX0hBTF9SQ0NfREFDMV9JU19DTEtfRElTQUJMRUQNCi0jZGVmaW5lIF9fREFDMl9JU19DTEtfRU5BQkxFRCBfX0hBTF9SQ0NfREFDMl9JU19DTEtfRU5BQkxFRA0KLSNkZWZpbmUgX19EQUMyX0lTX0NMS19ESVNBQkxFRCBfX0hBTF9SQ0NfREFDMl9JU19DTEtfRElTQUJMRUQNCi0jZGVmaW5lIF9fRE1BMV9JU19DTEtfRU5BQkxFRCBfX0hBTF9SQ0NfRE1BMV9JU19DTEtfRU5BQkxFRA0KLSNkZWZpbmUgX19ETUExX0lTX0NMS19ESVNBQkxFRCBfX0hBTF9SQ0NfRE1BMV9JU19DTEtfRElTQUJMRUQNCi0jZGVmaW5lIF9fRE1BMl9JU19DTEtfRU5BQkxFRCBfX0hBTF9SQ0NfRE1BMl9JU19DTEtfRU5BQkxFRA0KLSNkZWZpbmUgX19ETUEyX0lTX0NMS19ESVNBQkxFRCBfX0hBTF9SQ0NfRE1BMl9JU19DTEtfRElTQUJMRUQNCi0jZGVmaW5lIF9fRkxJVEZfSVNfQ0xLX0VOQUJMRUQgX19IQUxfUkNDX0ZMSVRGX0lTX0NMS19FTkFCTEVEDQotI2RlZmluZSBfX0ZMSVRGX0lTX0NMS19ESVNBQkxFRCBfX0hBTF9SQ0NfRkxJVEZfSVNfQ0xLX0RJU0FCTEVEDQotI2RlZmluZSBfX0ZNQ19JU19DTEtfRU5BQkxFRCBfX0hBTF9SQ0NfRk1DX0lTX0NMS19FTkFCTEVEDQotI2RlZmluZSBfX0ZNQ19JU19DTEtfRElTQUJMRUQgX19IQUxfUkNDX0ZNQ19JU19DTEtfRElTQUJMRUQNCi0jZGVmaW5lIF9fR1BJT0FfSVNfQ0xLX0VOQUJMRUQgX19IQUxfUkNDX0dQSU9BX0lTX0NMS19FTkFCTEVEDQotI2RlZmluZSBfX0dQSU9BX0lTX0NMS19ESVNBQkxFRCBfX0hBTF9SQ0NfR1BJT0FfSVNfQ0xLX0RJU0FCTEVEDQotI2RlZmluZSBfX0dQSU9CX0lTX0NMS19FTkFCTEVEIF9fSEFMX1JDQ19HUElPQl9JU19DTEtfRU5BQkxFRA0KLSNkZWZpbmUgX19HUElPQl9JU19DTEtfRElTQUJMRUQgX19IQUxfUkNDX0dQSU9CX0lTX0NMS19ESVNBQkxFRA0KLSNkZWZpbmUgX19HUElPQ19JU19DTEtfRU5BQkxFRCBfX0hBTF9SQ0NfR1BJT0NfSVNfQ0xLX0VOQUJMRUQNCi0jZGVmaW5lIF9fR1BJT0NfSVNfQ0xLX0RJU0FCTEVEIF9fSEFMX1JDQ19HUElPQ19JU19DTEtfRElTQUJMRUQNCi0jZGVmaW5lIF9fR1BJT0RfSVNfQ0xLX0VOQUJMRUQgX19IQUxfUkNDX0dQSU9EX0lTX0NMS19FTkFCTEVEDQotI2RlZmluZSBfX0dQSU9EX0lTX0NMS19ESVNBQkxFRCBfX0hBTF9SQ0NfR1BJT0RfSVNfQ0xLX0RJU0FCTEVEDQotI2RlZmluZSBfX0dQSU9FX0lTX0NMS19FTkFCTEVEIF9fSEFMX1JDQ19HUElPRV9JU19DTEtfRU5BQkxFRA0KLSNkZWZpbmUgX19HUElPRV9JU19DTEtfRElTQUJMRUQgX19IQUxfUkNDX0dQSU9FX0lTX0NMS19ESVNBQkxFRA0KLSNkZWZpbmUgX19HUElPRl9JU19DTEtfRU5BQkxFRCBfX0hBTF9SQ0NfR1BJT0ZfSVNfQ0xLX0VOQUJMRUQNCi0jZGVmaW5lIF9fR1BJT0ZfSVNfQ0xLX0RJU0FCTEVEIF9fSEFMX1JDQ19HUElPRl9JU19DTEtfRElTQUJMRUQNCi0jZGVmaW5lIF9fR1BJT0dfSVNfQ0xLX0VOQUJMRUQgX19IQUxfUkNDX0dQSU9HX0lTX0NMS19FTkFCTEVEDQotI2RlZmluZSBfX0dQSU9HX0lTX0NMS19ESVNBQkxFRCBfX0hBTF9SQ0NfR1BJT0dfSVNfQ0xLX0RJU0FCTEVEDQotI2RlZmluZSBfX0dQSU9IX0lTX0NMS19FTkFCTEVEIF9fSEFMX1JDQ19HUElPSF9JU19DTEtfRU5BQkxFRA0KLSNkZWZpbmUgX19HUElPSF9JU19DTEtfRElTQUJMRUQgX19IQUxfUkNDX0dQSU9IX0lTX0NMS19ESVNBQkxFRA0KLSNkZWZpbmUgX19IUlRJTTFfSVNfQ0xLX0VOQUJMRUQgX19IQUxfUkNDX0hSVElNMV9JU19DTEtfRU5BQkxFRA0KLSNkZWZpbmUgX19IUlRJTTFfSVNfQ0xLX0RJU0FCTEVEIF9fSEFMX1JDQ19IUlRJTTFfSVNfQ0xLX0RJU0FCTEVEDQotI2RlZmluZSBfX0kyQzFfSVNfQ0xLX0VOQUJMRUQgX19IQUxfUkNDX0kyQzFfSVNfQ0xLX0VOQUJMRUQNCi0jZGVmaW5lIF9fSTJDMV9JU19DTEtfRElTQUJMRUQgX19IQUxfUkNDX0kyQzFfSVNfQ0xLX0RJU0FCTEVEDQotI2RlZmluZSBfX0kyQzJfSVNfQ0xLX0VOQUJMRUQgX19IQUxfUkNDX0kyQzJfSVNfQ0xLX0VOQUJMRUQNCi0jZGVmaW5lIF9fSTJDMl9JU19DTEtfRElTQUJMRUQgX19IQUxfUkNDX0kyQzJfSVNfQ0xLX0RJU0FCTEVEDQotI2RlZmluZSBfX0kyQzNfSVNfQ0xLX0VOQUJMRUQgX19IQUxfUkNDX0kyQzNfSVNfQ0xLX0VOQUJMRUQNCi0jZGVmaW5lIF9fSTJDM19JU19DTEtfRElTQUJMRUQgX19IQUxfUkNDX0kyQzNfSVNfQ0xLX0RJU0FCTEVEDQotI2RlZmluZSBfX1BXUl9JU19DTEtfRU5BQkxFRCBfX0hBTF9SQ0NfUFdSX0lTX0NMS19FTkFCTEVEDQotI2RlZmluZSBfX1BXUl9JU19DTEtfRElTQUJMRUQgX19IQUxfUkNDX1BXUl9JU19DTEtfRElTQUJMRUQNCi0jZGVmaW5lIF9fU1lTQ0ZHX0lTX0NMS19FTkFCTEVEIF9fSEFMX1JDQ19TWVNDRkdfSVNfQ0xLX0VOQUJMRUQNCi0jZGVmaW5lIF9fU1lTQ0ZHX0lTX0NMS19ESVNBQkxFRCBfX0hBTF9SQ0NfU1lTQ0ZHX0lTX0NMS19ESVNBQkxFRA0KLSNkZWZpbmUgX19TUEkxX0lTX0NMS19FTkFCTEVEIF9fSEFMX1JDQ19TUEkxX0lTX0NMS19FTkFCTEVEDQotI2RlZmluZSBfX1NQSTFfSVNfQ0xLX0RJU0FCTEVEIF9fSEFMX1JDQ19TUEkxX0lTX0NMS19ESVNBQkxFRA0KLSNkZWZpbmUgX19TUEkyX0lTX0NMS19FTkFCTEVEIF9fSEFMX1JDQ19TUEkyX0lTX0NMS19FTkFCTEVEDQotI2RlZmluZSBfX1NQSTJfSVNfQ0xLX0RJU0FCTEVEIF9fSEFMX1JDQ19TUEkyX0lTX0NMS19ESVNBQkxFRA0KLSNkZWZpbmUgX19TUEkzX0lTX0NMS19FTkFCTEVEIF9fSEFMX1JDQ19TUEkzX0lTX0NMS19FTkFCTEVEDQotI2RlZmluZSBfX1NQSTNfSVNfQ0xLX0RJU0FCTEVEIF9fSEFMX1JDQ19TUEkzX0lTX0NMS19ESVNBQkxFRA0KLSNkZWZpbmUgX19TUEk0X0lTX0NMS19FTkFCTEVEIF9fSEFMX1JDQ19TUEk0X0lTX0NMS19FTkFCTEVEDQotI2RlZmluZSBfX1NQSTRfSVNfQ0xLX0RJU0FCTEVEIF9fSEFMX1JDQ19TUEk0X0lTX0NMS19ESVNBQkxFRA0KLSNkZWZpbmUgX19TREFEQzFfSVNfQ0xLX0VOQUJMRUQgX19IQUxfUkNDX1NEQURDMV9JU19DTEtfRU5BQkxFRA0KLSNkZWZpbmUgX19TREFEQzFfSVNfQ0xLX0RJU0FCTEVEIF9fSEFMX1JDQ19TREFEQzFfSVNfQ0xLX0RJU0FCTEVEDQotI2RlZmluZSBfX1NEQURDMl9JU19DTEtfRU5BQkxFRCBfX0hBTF9SQ0NfU0RBREMyX0lTX0NMS19FTkFCTEVEDQotI2RlZmluZSBfX1NEQURDMl9JU19DTEtfRElTQUJMRUQgX19IQUxfUkNDX1NEQURDMl9JU19DTEtfRElTQUJMRUQNCi0jZGVmaW5lIF9fU0RBREMzX0lTX0NMS19FTkFCTEVEIF9fSEFMX1JDQ19TREFEQzNfSVNfQ0xLX0VOQUJMRUQNCi0jZGVmaW5lIF9fU0RBREMzX0lTX0NMS19ESVNBQkxFRCBfX0hBTF9SQ0NfU0RBREMzX0lTX0NMS19ESVNBQkxFRA0KLSNkZWZpbmUgX19TUkFNX0lTX0NMS19FTkFCTEVEIF9fSEFMX1JDQ19TUkFNX0lTX0NMS19FTkFCTEVEDQotI2RlZmluZSBfX1NSQU1fSVNfQ0xLX0RJU0FCTEVEIF9fSEFMX1JDQ19TUkFNX0lTX0NMS19ESVNBQkxFRA0KLSNkZWZpbmUgX19USU0xX0lTX0NMS19FTkFCTEVEIF9fSEFMX1JDQ19USU0xX0lTX0NMS19FTkFCTEVEDQotI2RlZmluZSBfX1RJTTFfSVNfQ0xLX0RJU0FCTEVEIF9fSEFMX1JDQ19USU0xX0lTX0NMS19ESVNBQkxFRA0KLSNkZWZpbmUgX19USU0yX0lTX0NMS19FTkFCTEVEIF9fSEFMX1JDQ19USU0yX0lTX0NMS19FTkFCTEVEDQotI2RlZmluZSBfX1RJTTJfSVNfQ0xLX0RJU0FCTEVEIF9fSEFMX1JDQ19USU0yX0lTX0NMS19ESVNBQkxFRA0KLSNkZWZpbmUgX19USU0zX0lTX0NMS19FTkFCTEVEIF9fSEFMX1JDQ19USU0zX0lTX0NMS19FTkFCTEVEDQotI2RlZmluZSBfX1RJTTNfSVNfQ0xLX0RJU0FCTEVEIF9fSEFMX1JDQ19USU0zX0lTX0NMS19ESVNBQkxFRA0KLSNkZWZpbmUgX19USU00X0lTX0NMS19FTkFCTEVEIF9fSEFMX1JDQ19USU00X0lTX0NMS19FTkFCTEVEDQotI2RlZmluZSBfX1RJTTRfSVNfQ0xLX0RJU0FCTEVEIF9fSEFMX1JDQ19USU00X0lTX0NMS19ESVNBQkxFRA0KLSNkZWZpbmUgX19USU01X0lTX0NMS19FTkFCTEVEIF9fSEFMX1JDQ19USU01X0lTX0NMS19FTkFCTEVEDQotI2RlZmluZSBfX1RJTTVfSVNfQ0xLX0RJU0FCTEVEIF9fSEFMX1JDQ19USU01X0lTX0NMS19ESVNBQkxFRA0KLSNkZWZpbmUgX19USU02X0lTX0NMS19FTkFCTEVEIF9fSEFMX1JDQ19USU02X0lTX0NMS19FTkFCTEVEDQotI2RlZmluZSBfX1RJTTZfSVNfQ0xLX0RJU0FCTEVEIF9fSEFMX1JDQ19USU02X0lTX0NMS19ESVNBQkxFRA0KLSNkZWZpbmUgX19USU03X0lTX0NMS19FTkFCTEVEIF9fSEFMX1JDQ19USU03X0lTX0NMS19FTkFCTEVEDQotI2RlZmluZSBfX1RJTTdfSVNfQ0xLX0RJU0FCTEVEIF9fSEFMX1JDQ19USU03X0lTX0NMS19ESVNBQkxFRA0KLSNkZWZpbmUgX19USU04X0lTX0NMS19FTkFCTEVEIF9fSEFMX1JDQ19USU04X0lTX0NMS19FTkFCTEVEDQotI2RlZmluZSBfX1RJTThfSVNfQ0xLX0RJU0FCTEVEIF9fSEFMX1JDQ19USU04X0lTX0NMS19ESVNBQkxFRA0KLSNkZWZpbmUgX19USU0xMl9JU19DTEtfRU5BQkxFRCBfX0hBTF9SQ0NfVElNMTJfSVNfQ0xLX0VOQUJMRUQNCi0jZGVmaW5lIF9fVElNMTJfSVNfQ0xLX0RJU0FCTEVEIF9fSEFMX1JDQ19USU0xMl9JU19DTEtfRElTQUJMRUQNCi0jZGVmaW5lIF9fVElNMTNfSVNfQ0xLX0VOQUJMRUQgX19IQUxfUkNDX1RJTTEzX0lTX0NMS19FTkFCTEVEDQotI2RlZmluZSBfX1RJTTEzX0lTX0NMS19ESVNBQkxFRCBfX0hBTF9SQ0NfVElNMTNfSVNfQ0xLX0RJU0FCTEVEDQotI2RlZmluZSBfX1RJTTE0X0lTX0NMS19FTkFCTEVEIF9fSEFMX1JDQ19USU0xNF9JU19DTEtfRU5BQkxFRA0KLSNkZWZpbmUgX19USU0xNF9JU19DTEtfRElTQUJMRUQgX19IQUxfUkNDX1RJTTE0X0lTX0NMS19ESVNBQkxFRA0KLSNkZWZpbmUgX19USU0xNV9JU19DTEtfRU5BQkxFRCBfX0hBTF9SQ0NfVElNMTVfSVNfQ0xLX0VOQUJMRUQNCi0jZGVmaW5lIF9fVElNMTVfSVNfQ0xLX0RJU0FCTEVEIF9fSEFMX1JDQ19USU0xNV9JU19DTEtfRElTQUJMRUQNCi0jZGVmaW5lIF9fVElNMTZfSVNfQ0xLX0VOQUJMRUQgX19IQUxfUkNDX1RJTTE2X0lTX0NMS19FTkFCTEVEDQotI2RlZmluZSBfX1RJTTE2X0lTX0NMS19ESVNBQkxFRCBfX0hBTF9SQ0NfVElNMTZfSVNfQ0xLX0RJU0FCTEVEDQotI2RlZmluZSBfX1RJTTE3X0lTX0NMS19FTkFCTEVEIF9fSEFMX1JDQ19USU0xN19JU19DTEtfRU5BQkxFRA0KLSNkZWZpbmUgX19USU0xN19JU19DTEtfRElTQUJMRUQgX19IQUxfUkNDX1RJTTE3X0lTX0NMS19ESVNBQkxFRA0KLSNkZWZpbmUgX19USU0xOF9JU19DTEtfRU5BQkxFRCBfX0hBTF9SQ0NfVElNMThfSVNfQ0xLX0VOQUJMRUQNCi0jZGVmaW5lIF9fVElNMThfSVNfQ0xLX0RJU0FCTEVEIF9fSEFMX1JDQ19USU0xOF9JU19DTEtfRElTQUJMRUQNCi0jZGVmaW5lIF9fVElNMTlfSVNfQ0xLX0VOQUJMRUQgX19IQUxfUkNDX1RJTTE5X0lTX0NMS19FTkFCTEVEDQotI2RlZmluZSBfX1RJTTE5X0lTX0NMS19ESVNBQkxFRCBfX0hBTF9SQ0NfVElNMTlfSVNfQ0xLX0RJU0FCTEVEDQotI2RlZmluZSBfX1RJTTIwX0lTX0NMS19FTkFCTEVEIF9fSEFMX1JDQ19USU0yMF9JU19DTEtfRU5BQkxFRA0KLSNkZWZpbmUgX19USU0yMF9JU19DTEtfRElTQUJMRUQgX19IQUxfUkNDX1RJTTIwX0lTX0NMS19ESVNBQkxFRA0KLSNkZWZpbmUgX19UU0NfSVNfQ0xLX0VOQUJMRUQgX19IQUxfUkNDX1RTQ19JU19DTEtfRU5BQkxFRA0KLSNkZWZpbmUgX19UU0NfSVNfQ0xLX0RJU0FCTEVEIF9fSEFMX1JDQ19UU0NfSVNfQ0xLX0RJU0FCTEVEDQotI2RlZmluZSBfX1VBUlQ0X0lTX0NMS19FTkFCTEVEIF9fSEFMX1JDQ19VQVJUNF9JU19DTEtfRU5BQkxFRA0KLSNkZWZpbmUgX19VQVJUNF9JU19DTEtfRElTQUJMRUQgX19IQUxfUkNDX1VBUlQ0X0lTX0NMS19ESVNBQkxFRA0KLSNkZWZpbmUgX19VQVJUNV9JU19DTEtfRU5BQkxFRCBfX0hBTF9SQ0NfVUFSVDVfSVNfQ0xLX0VOQUJMRUQNCi0jZGVmaW5lIF9fVUFSVDVfSVNfQ0xLX0RJU0FCTEVEIF9fSEFMX1JDQ19VQVJUNV9JU19DTEtfRElTQUJMRUQNCi0jZGVmaW5lIF9fVVNBUlQxX0lTX0NMS19FTkFCTEVEIF9fSEFMX1JDQ19VU0FSVDFfSVNfQ0xLX0VOQUJMRUQNCi0jZGVmaW5lIF9fVVNBUlQxX0lTX0NMS19ESVNBQkxFRCBfX0hBTF9SQ0NfVVNBUlQxX0lTX0NMS19ESVNBQkxFRA0KLSNkZWZpbmUgX19VU0FSVDJfSVNfQ0xLX0VOQUJMRUQgX19IQUxfUkNDX1VTQVJUMl9JU19DTEtfRU5BQkxFRA0KLSNkZWZpbmUgX19VU0FSVDJfSVNfQ0xLX0RJU0FCTEVEIF9fSEFMX1JDQ19VU0FSVDJfSVNfQ0xLX0RJU0FCTEVEDQotI2RlZmluZSBfX1VTQVJUM19JU19DTEtfRU5BQkxFRCBfX0hBTF9SQ0NfVVNBUlQzX0lTX0NMS19FTkFCTEVEDQotI2RlZmluZSBfX1VTQVJUM19JU19DTEtfRElTQUJMRUQgX19IQUxfUkNDX1VTQVJUM19JU19DTEtfRElTQUJMRUQNCi0jZGVmaW5lIF9fVVNCX0lTX0NMS19FTkFCTEVEIF9fSEFMX1JDQ19VU0JfSVNfQ0xLX0VOQUJMRUQNCi0jZGVmaW5lIF9fVVNCX0lTX0NMS19ESVNBQkxFRCBfX0hBTF9SQ0NfVVNCX0lTX0NMS19ESVNBQkxFRA0KLSNkZWZpbmUgX19XV0RHX0lTX0NMS19FTkFCTEVEIF9fSEFMX1JDQ19XV0RHX0lTX0NMS19FTkFCTEVEDQotI2RlZmluZSBfX1dXREdfSVNfQ0xLX0RJU0FCTEVEIF9fSEFMX1JDQ19XV0RHX0lTX0NMS19ESVNBQkxFRA0KLQ0KLSNpZiBkZWZpbmVkKFNUTTMyTDEpDQotI2RlZmluZSBfX0hBTF9SQ0NfQ1JZUF9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfQUVTX0NMS19ESVNBQkxFDQotI2RlZmluZSBfX0hBTF9SQ0NfQ1JZUF9DTEtfRU5BQkxFIF9fSEFMX1JDQ19BRVNfQ0xLX0VOQUJMRQ0KLSNkZWZpbmUgX19IQUxfUkNDX0NSWVBfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0FFU19DTEtfU0xFRVBfRElTQUJMRQ0KLSNkZWZpbmUgX19IQUxfUkNDX0NSWVBfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfQUVTX0NMS19TTEVFUF9FTkFCTEUNCi0jZGVmaW5lIF9fSEFMX1JDQ19DUllQX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19BRVNfRk9SQ0VfUkVTRVQNCi0jZGVmaW5lIF9fSEFMX1JDQ19DUllQX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0FFU19SRUxFQVNFX1JFU0VUDQotI2VuZGlmIC8qIFNUTTMyTDEgKi8NCi0NCi0jaWYgZGVmaW5lZChTVE0zMkY0KQ0KLSNkZWZpbmUgX19IQUxfUkNDX1NETU1DMV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfU0RJT19GT1JDRV9SRVNFVA0KLSNkZWZpbmUgX19IQUxfUkNDX1NETU1DMV9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19TRElPX1JFTEVBU0VfUkVTRVQNCi0jZGVmaW5lIF9fSEFMX1JDQ19TRE1NQzFfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfU0RJT19DTEtfU0xFRVBfRU5BQkxFDQotI2RlZmluZSBfX0hBTF9SQ0NfU0RNTUMxX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19TRElPX0NMS19TTEVFUF9ESVNBQkxFDQotI2RlZmluZSBfX0hBTF9SQ0NfU0RNTUMxX0NMS19FTkFCTEUgX19IQUxfUkNDX1NESU9fQ0xLX0VOQUJMRQ0KLSNkZWZpbmUgX19IQUxfUkNDX1NETU1DMV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfU0RJT19DTEtfRElTQUJMRQ0KLSNkZWZpbmUgX19IQUxfUkNDX1NETU1DMV9JU19DTEtfRU5BQkxFRCBfX0hBTF9SQ0NfU0RJT19JU19DTEtfRU5BQkxFRA0KLSNkZWZpbmUgX19IQUxfUkNDX1NETU1DMV9JU19DTEtfRElTQUJMRUQgX19IQUxfUkNDX1NESU9fSVNfQ0xLX0RJU0FCTEVEDQotI2RlZmluZSBTZG1tYzFDbG9ja1NlbGVjdGlvbiBTZGlvQ2xvY2tTZWxlY3Rpb24NCi0jZGVmaW5lIFJDQ19QRVJJUEhDTEtfU0RNTUMxIFJDQ19QRVJJUEhDTEtfU0RJTw0KLSNkZWZpbmUgUkNDX1NETU1DMUNMS1NPVVJDRV9DTEs0OCBSQ0NfU0RJT0NMS1NPVVJDRV9DSzQ4DQotI2RlZmluZSBSQ0NfU0RNTUMxQ0xLU09VUkNFX1NZU0NMSyBSQ0NfU0RJT0NMS1NPVVJDRV9TWVNDTEsNCi0jZGVmaW5lIF9fSEFMX1JDQ19TRE1NQzFfQ09ORklHIF9fSEFMX1JDQ19TRElPX0NPTkZJRw0KLSNkZWZpbmUgX19IQUxfUkNDX0dFVF9TRE1NQzFfU09VUkNFIF9fSEFMX1JDQ19HRVRfU0RJT19TT1VSQ0UNCi0jZW5kaWYNCi0NCi0jaWYgZGVmaW5lZChTVE0zMkY3KSB8fCBkZWZpbmVkKFNUTTMyTDQpDQotI2RlZmluZSBfX0hBTF9SQ0NfU0RJT19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfU0RNTUMxX0ZPUkNFX1JFU0VUDQotI2RlZmluZSBfX0hBTF9SQ0NfU0RJT19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19TRE1NQzFfUkVMRUFTRV9SRVNFVA0KLSNkZWZpbmUgX19IQUxfUkNDX1NESU9fQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfU0RNTUMxX0NMS19TTEVFUF9FTkFCTEUNCi0jZGVmaW5lIF9fSEFMX1JDQ19TRElPX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19TRE1NQzFfQ0xLX1NMRUVQX0RJU0FCTEUNCi0jZGVmaW5lIF9fSEFMX1JDQ19TRElPX0NMS19FTkFCTEUgX19IQUxfUkNDX1NETU1DMV9DTEtfRU5BQkxFDQotI2RlZmluZSBfX0hBTF9SQ0NfU0RJT19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfU0RNTUMxX0NMS19ESVNBQkxFDQotI2RlZmluZSBfX0hBTF9SQ0NfU0RJT19JU19DTEtfRU5BQkxFRCBfX0hBTF9SQ0NfU0RNTUMxX0lTX0NMS19FTkFCTEVEDQotI2RlZmluZSBfX0hBTF9SQ0NfU0RJT19JU19DTEtfRElTQUJMRUQgX19IQUxfUkNDX1NETU1DMV9JU19DTEtfRElTQUJMRUQNCi0jZGVmaW5lIFNkaW9DbG9ja1NlbGVjdGlvbiBTZG1tYzFDbG9ja1NlbGVjdGlvbg0KLSNkZWZpbmUgUkNDX1BFUklQSENMS19TRElPIFJDQ19QRVJJUEhDTEtfU0RNTUMxDQotI2RlZmluZSBfX0hBTF9SQ0NfU0RJT19DT05GSUcgX19IQUxfUkNDX1NETU1DMV9DT05GSUcNCi0jZGVmaW5lIF9fSEFMX1JDQ19HRVRfU0RJT19TT1VSQ0UgX19IQUxfUkNDX0dFVF9TRE1NQzFfU09VUkNFDQotI2VuZGlmDQotDQotI2lmIGRlZmluZWQoU1RNMzJGNykNCi0jZGVmaW5lIFJDQ19TRElPQ0xLU09VUkNFX0NMSzQ4IFJDQ19TRE1NQzFDTEtTT1VSQ0VfQ0xLNDgNCi0jZGVmaW5lIFJDQ19TRElPQ0xLU09VUkNFX1NZU0NMSyBSQ0NfU0RNTUMxQ0xLU09VUkNFX1NZU0NMSw0KLSNlbmRpZg0KLQ0KLSNpZiBkZWZpbmVkKFNUTTMySDcpDQotI2RlZmluZSBfX0hBTF9SQ0NfVVNCX09UR19IU19DTEtfRU5BQkxFKCkgX19IQUxfUkNDX1VTQjFfT1RHX0hTX0NMS19FTkFCTEUoKQ0KLSNkZWZpbmUgX19IQUxfUkNDX1VTQl9PVEdfSFNfVUxQSV9DTEtfRU5BQkxFKCkgXA0KLSAgX19IQUxfUkNDX1VTQjFfT1RHX0hTX1VMUElfQ0xLX0VOQUJMRSgpDQotI2RlZmluZSBfX0hBTF9SQ0NfVVNCX09UR19IU19DTEtfRElTQUJMRSgpIF9fSEFMX1JDQ19VU0IxX09UR19IU19DTEtfRElTQUJMRSgpDQotI2RlZmluZSBfX0hBTF9SQ0NfVVNCX09UR19IU19VTFBJX0NMS19ESVNBQkxFKCkgXA0KLSAgX19IQUxfUkNDX1VTQjFfT1RHX0hTX1VMUElfQ0xLX0RJU0FCTEUoKQ0KLSNkZWZpbmUgX19IQUxfUkNDX1VTQl9PVEdfSFNfRk9SQ0VfUkVTRVQoKSBfX0hBTF9SQ0NfVVNCMV9PVEdfSFNfRk9SQ0VfUkVTRVQoKQ0KLSNkZWZpbmUgX19IQUxfUkNDX1VTQl9PVEdfSFNfUkVMRUFTRV9SRVNFVCgpIFwNCi0gIF9fSEFMX1JDQ19VU0IxX09UR19IU19SRUxFQVNFX1JFU0VUKCkNCi0jZGVmaW5lIF9fSEFMX1JDQ19VU0JfT1RHX0hTX0NMS19TTEVFUF9FTkFCTEUoKSBcDQotICBfX0hBTF9SQ0NfVVNCMV9PVEdfSFNfQ0xLX1NMRUVQX0VOQUJMRSgpDQotI2RlZmluZSBfX0hBTF9SQ0NfVVNCX09UR19IU19VTFBJX0NMS19TTEVFUF9FTkFCTEUoKSBcDQotICBfX0hBTF9SQ0NfVVNCMV9PVEdfSFNfVUxQSV9DTEtfU0xFRVBfRU5BQkxFKCkNCi0jZGVmaW5lIF9fSEFMX1JDQ19VU0JfT1RHX0hTX0NMS19TTEVFUF9ESVNBQkxFKCkgXA0KLSAgX19IQUxfUkNDX1VTQjFfT1RHX0hTX0NMS19TTEVFUF9ESVNBQkxFKCkNCi0jZGVmaW5lIF9fSEFMX1JDQ19VU0JfT1RHX0hTX1VMUElfQ0xLX1NMRUVQX0RJU0FCTEUoKSBcDQotICBfX0hBTF9SQ0NfVVNCMV9PVEdfSFNfVUxQSV9DTEtfU0xFRVBfRElTQUJMRSgpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfVVNCX09UR19GU19DTEtfRU5BQkxFKCkgX19IQUxfUkNDX1VTQjJfT1RHX0ZTX0NMS19FTkFCTEUoKQ0KLSNkZWZpbmUgX19IQUxfUkNDX1VTQl9PVEdfRlNfVUxQSV9DTEtfRU5BQkxFKCkgXA0KLSAgX19IQUxfUkNDX1VTQjJfT1RHX0ZTX1VMUElfQ0xLX0VOQUJMRSgpDQotI2RlZmluZSBfX0hBTF9SQ0NfVVNCX09UR19GU19DTEtfRElTQUJMRSgpIF9fSEFMX1JDQ19VU0IyX09UR19GU19DTEtfRElTQUJMRSgpDQotI2RlZmluZSBfX0hBTF9SQ0NfVVNCX09UR19GU19VTFBJX0NMS19ESVNBQkxFKCkgXA0KLSAgX19IQUxfUkNDX1VTQjJfT1RHX0ZTX1VMUElfQ0xLX0RJU0FCTEUoKQ0KLSNkZWZpbmUgX19IQUxfUkNDX1VTQl9PVEdfRlNfRk9SQ0VfUkVTRVQoKSBfX0hBTF9SQ0NfVVNCMl9PVEdfRlNfRk9SQ0VfUkVTRVQoKQ0KLSNkZWZpbmUgX19IQUxfUkNDX1VTQl9PVEdfRlNfUkVMRUFTRV9SRVNFVCgpIFwNCi0gIF9fSEFMX1JDQ19VU0IyX09UR19GU19SRUxFQVNFX1JFU0VUKCkNCi0jZGVmaW5lIF9fSEFMX1JDQ19VU0JfT1RHX0ZTX0NMS19TTEVFUF9FTkFCTEUoKSBcDQotICBfX0hBTF9SQ0NfVVNCMl9PVEdfRlNfQ0xLX1NMRUVQX0VOQUJMRSgpDQotI2RlZmluZSBfX0hBTF9SQ0NfVVNCX09UR19GU19VTFBJX0NMS19TTEVFUF9FTkFCTEUoKSBcDQotICBfX0hBTF9SQ0NfVVNCMl9PVEdfRlNfVUxQSV9DTEtfU0xFRVBfRU5BQkxFKCkNCi0jZGVmaW5lIF9fSEFMX1JDQ19VU0JfT1RHX0ZTX0NMS19TTEVFUF9ESVNBQkxFKCkgXA0KLSAgX19IQUxfUkNDX1VTQjJfT1RHX0ZTX0NMS19TTEVFUF9ESVNBQkxFKCkNCi0jZGVmaW5lIF9fSEFMX1JDQ19VU0JfT1RHX0ZTX1VMUElfQ0xLX1NMRUVQX0RJU0FCTEUoKSBcDQotICBfX0hBTF9SQ0NfVVNCMl9PVEdfRlNfVUxQSV9DTEtfU0xFRVBfRElTQUJMRSgpDQotI2VuZGlmDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfSTJTQ0xLIF9fSEFMX1JDQ19JMlNfQ09ORklHDQotI2RlZmluZSBfX0hBTF9SQ0NfSTJTQ0xLX0NPTkZJRyBfX0hBTF9SQ0NfSTJTX0NPTkZJRw0KLQ0KLSNkZWZpbmUgX19SQ0NfUExMU1JDIFJDQ19HRVRfUExMX09TQ1NPVVJDRQ0KLQ0KLSNkZWZpbmUgSVNfUkNDX01TSVJBTkdFIElTX1JDQ19NU0lfQ0xPQ0tfUkFOR0UNCi0jZGVmaW5lIElTX1JDQ19SVENDTEtfU09VUkNFIElTX1JDQ19SVENDTEtTT1VSQ0UNCi0jZGVmaW5lIElTX1JDQ19TWVNDTEtfRElWIElTX1JDQ19IQ0xLDQotI2RlZmluZSBJU19SQ0NfSENMS19ESVYgSVNfUkNDX1BDTEsNCi0jZGVmaW5lIElTX1JDQ19QRVJJUEhDTEsgSVNfUkNDX1BFUklQSENMT0NLDQotDQotI2RlZmluZSBSQ0NfSVRfSFNJMTQgUkNDX0lUX0hTSTE0UkRZDQotDQotI2RlZmluZSBSQ0NfSVRfQ1NTTFNFIFJDQ19JVF9MU0VDU1MNCi0jZGVmaW5lIFJDQ19JVF9DU1NIU0UgUkNDX0lUX0NTUw0KLQ0KLSNkZWZpbmUgUkNDX1BMTE1VTF8zIFJDQ19QTExfTVVMMw0KLSNkZWZpbmUgUkNDX1BMTE1VTF80IFJDQ19QTExfTVVMNA0KLSNkZWZpbmUgUkNDX1BMTE1VTF82IFJDQ19QTExfTVVMNg0KLSNkZWZpbmUgUkNDX1BMTE1VTF84IFJDQ19QTExfTVVMOA0KLSNkZWZpbmUgUkNDX1BMTE1VTF8xMiBSQ0NfUExMX01VTDEyDQotI2RlZmluZSBSQ0NfUExMTVVMXzE2IFJDQ19QTExfTVVMMTYNCi0jZGVmaW5lIFJDQ19QTExNVUxfMjQgUkNDX1BMTF9NVUwyNA0KLSNkZWZpbmUgUkNDX1BMTE1VTF8zMiBSQ0NfUExMX01VTDMyDQotI2RlZmluZSBSQ0NfUExMTVVMXzQ4IFJDQ19QTExfTVVMNDgNCi0NCi0jZGVmaW5lIFJDQ19QTExESVZfMiBSQ0NfUExMX0RJVjINCi0jZGVmaW5lIFJDQ19QTExESVZfMyBSQ0NfUExMX0RJVjMNCi0jZGVmaW5lIFJDQ19QTExESVZfNCBSQ0NfUExMX0RJVjQNCi0NCi0jZGVmaW5lIElTX1JDQ19NQ09TT1VSQ0UgSVNfUkNDX01DTzFTT1VSQ0UNCi0jZGVmaW5lIF9fSEFMX1JDQ19NQ09fQ09ORklHIF9fSEFMX1JDQ19NQ08xX0NPTkZJRw0KLSNkZWZpbmUgUkNDX01DT19OT0RJViBSQ0NfTUNPRElWXzENCi0jZGVmaW5lIFJDQ19NQ09fRElWMSBSQ0NfTUNPRElWXzENCi0jZGVmaW5lIFJDQ19NQ09fRElWMiBSQ0NfTUNPRElWXzINCi0jZGVmaW5lIFJDQ19NQ09fRElWNCBSQ0NfTUNPRElWXzQNCi0jZGVmaW5lIFJDQ19NQ09fRElWOCBSQ0NfTUNPRElWXzgNCi0jZGVmaW5lIFJDQ19NQ09fRElWMTYgUkNDX01DT0RJVl8xNg0KLSNkZWZpbmUgUkNDX01DT19ESVYzMiBSQ0NfTUNPRElWXzMyDQotI2RlZmluZSBSQ0NfTUNPX0RJVjY0IFJDQ19NQ09ESVZfNjQNCi0jZGVmaW5lIFJDQ19NQ09fRElWMTI4IFJDQ19NQ09ESVZfMTI4DQotI2RlZmluZSBSQ0NfTUNPU09VUkNFX05PTkUgUkNDX01DTzFTT1VSQ0VfTk9DTE9DSw0KLSNkZWZpbmUgUkNDX01DT1NPVVJDRV9MU0kgUkNDX01DTzFTT1VSQ0VfTFNJDQotI2RlZmluZSBSQ0NfTUNPU09VUkNFX0xTRSBSQ0NfTUNPMVNPVVJDRV9MU0UNCi0jZGVmaW5lIFJDQ19NQ09TT1VSQ0VfU1lTQ0xLIFJDQ19NQ08xU09VUkNFX1NZU0NMSw0KLSNkZWZpbmUgUkNDX01DT1NPVVJDRV9IU0kgUkNDX01DTzFTT1VSQ0VfSFNJDQotI2RlZmluZSBSQ0NfTUNPU09VUkNFX0hTSTE0IFJDQ19NQ08xU09VUkNFX0hTSTE0DQotI2RlZmluZSBSQ0NfTUNPU09VUkNFX0hTSTQ4IFJDQ19NQ08xU09VUkNFX0hTSTQ4DQotI2RlZmluZSBSQ0NfTUNPU09VUkNFX0hTRSBSQ0NfTUNPMVNPVVJDRV9IU0UNCi0jZGVmaW5lIFJDQ19NQ09TT1VSQ0VfUExMQ0xLX0RJVjEgUkNDX01DTzFTT1VSQ0VfUExMQ0xLDQotI2RlZmluZSBSQ0NfTUNPU09VUkNFX1BMTENMS19OT0RJViBSQ0NfTUNPMVNPVVJDRV9QTExDTEsNCi0jZGVmaW5lIFJDQ19NQ09TT1VSQ0VfUExMQ0xLX0RJVjIgUkNDX01DTzFTT1VSQ0VfUExMQ0xLX0RJVjINCi0NCi0jaWYgZGVmaW5lZChTVE0zMkw0KSB8fCBkZWZpbmVkKFNUTTMyV0IpIHx8IGRlZmluZWQoU1RNMzJHMCkgfHwgXA0KLSAgICBkZWZpbmVkKFNUTTMyRzQpIHx8IGRlZmluZWQoU1RNMzJMNSkgfHwgZGVmaW5lZChTVE0zMldMKQ0KLSNkZWZpbmUgUkNDX1JUQ0NMS1NPVVJDRV9OT19DTEsgUkNDX1JUQ0NMS1NPVVJDRV9OT05FDQotI2Vsc2UNCi0jZGVmaW5lIFJDQ19SVENDTEtTT1VSQ0VfTk9ORSBSQ0NfUlRDQ0xLU09VUkNFX05PX0NMSw0KLSNlbmRpZg0KLQ0KLSNkZWZpbmUgUkNDX1VTQkNMS19QTExTQUkxIFJDQ19VU0JDTEtTT1VSQ0VfUExMU0FJMQ0KLSNkZWZpbmUgUkNDX1VTQkNMS19QTEwgUkNDX1VTQkNMS1NPVVJDRV9QTEwNCi0jZGVmaW5lIFJDQ19VU0JDTEtfTVNJIFJDQ19VU0JDTEtTT1VSQ0VfTVNJDQotI2RlZmluZSBSQ0NfVVNCQ0xLU09VUkNFX1BMTENMSyBSQ0NfVVNCQ0xLU09VUkNFX1BMTA0KLSNkZWZpbmUgUkNDX1VTQlBMTENMS19ESVYxIFJDQ19VU0JDTEtTT1VSQ0VfUExMDQotI2RlZmluZSBSQ0NfVVNCUExMQ0xLX0RJVjFfNSBSQ0NfVVNCQ0xLU09VUkNFX1BMTF9ESVYxXzUNCi0jZGVmaW5lIFJDQ19VU0JQTExDTEtfRElWMiBSQ0NfVVNCQ0xLU09VUkNFX1BMTF9ESVYyDQotI2RlZmluZSBSQ0NfVVNCUExMQ0xLX0RJVjMgUkNDX1VTQkNMS1NPVVJDRV9QTExfRElWMw0KLQ0KLSNkZWZpbmUgSFNJT05fQml0TnVtYmVyIFJDQ19IU0lPTl9CSVRfTlVNQkVSDQotI2RlZmluZSBIU0lPTl9CSVROVU1CRVIgUkNDX0hTSU9OX0JJVF9OVU1CRVINCi0jZGVmaW5lIEhTRU9OX0JpdE51bWJlciBSQ0NfSFNFT05fQklUX05VTUJFUg0KLSNkZWZpbmUgSFNFT05fQklUTlVNQkVSIFJDQ19IU0VPTl9CSVRfTlVNQkVSDQotI2RlZmluZSBNU0lPTl9CSVROVU1CRVIgUkNDX01TSU9OX0JJVF9OVU1CRVINCi0jZGVmaW5lIENTU09OX0JpdE51bWJlciBSQ0NfQ1NTT05fQklUX05VTUJFUg0KLSNkZWZpbmUgQ1NTT05fQklUTlVNQkVSIFJDQ19DU1NPTl9CSVRfTlVNQkVSDQotI2RlZmluZSBQTExPTl9CaXROdW1iZXIgUkNDX1BMTE9OX0JJVF9OVU1CRVINCi0jZGVmaW5lIFBMTE9OX0JJVE5VTUJFUiBSQ0NfUExMT05fQklUX05VTUJFUg0KLSNkZWZpbmUgUExMSTJTT05fQml0TnVtYmVyIFJDQ19QTExJMlNPTl9CSVRfTlVNQkVSDQotI2RlZmluZSBJMlNTUkNfQml0TnVtYmVyIFJDQ19JMlNTUkNfQklUX05VTUJFUg0KLSNkZWZpbmUgUlRDRU5fQml0TnVtYmVyIFJDQ19SVENFTl9CSVRfTlVNQkVSDQotI2RlZmluZSBSVENFTl9CSVROVU1CRVIgUkNDX1JUQ0VOX0JJVF9OVU1CRVINCi0jZGVmaW5lIEJEUlNUX0JpdE51bWJlciBSQ0NfQkRSU1RfQklUX05VTUJFUg0KLSNkZWZpbmUgQkRSU1RfQklUTlVNQkVSIFJDQ19CRFJTVF9CSVRfTlVNQkVSDQotI2RlZmluZSBSVENSU1RfQklUTlVNQkVSIFJDQ19SVENSU1RfQklUX05VTUJFUg0KLSNkZWZpbmUgTFNJT05fQml0TnVtYmVyIFJDQ19MU0lPTl9CSVRfTlVNQkVSDQotI2RlZmluZSBMU0lPTl9CSVROVU1CRVIgUkNDX0xTSU9OX0JJVF9OVU1CRVINCi0jZGVmaW5lIExTRU9OX0JpdE51bWJlciBSQ0NfTFNFT05fQklUX05VTUJFUg0KLSNkZWZpbmUgTFNFT05fQklUTlVNQkVSIFJDQ19MU0VPTl9CSVRfTlVNQkVSDQotI2RlZmluZSBMU0VCWVBfQklUTlVNQkVSIFJDQ19MU0VCWVBfQklUX05VTUJFUg0KLSNkZWZpbmUgUExMU0FJT05fQml0TnVtYmVyIFJDQ19QTExTQUlPTl9CSVRfTlVNQkVSDQotI2RlZmluZSBUSU1QUkVfQml0TnVtYmVyIFJDQ19USU1QUkVfQklUX05VTUJFUg0KLSNkZWZpbmUgUk1WRl9CaXROdW1iZXIgUkNDX1JNVkZfQklUX05VTUJFUg0KLSNkZWZpbmUgUk1WRl9CSVROVU1CRVIgUkNDX1JNVkZfQklUX05VTUJFUg0KLSNkZWZpbmUgUkNDX0NSMl9IU0kxNFRSSU1fQml0TnVtYmVyIFJDQ19IU0kxNFRSSU1fQklUX05VTUJFUg0KLSNkZWZpbmUgQ1JfQllURTJfQUREUkVTUyBSQ0NfQ1JfQllURTJfQUREUkVTUw0KLSNkZWZpbmUgQ0lSX0JZVEUxX0FERFJFU1MgUkNDX0NJUl9CWVRFMV9BRERSRVNTDQotI2RlZmluZSBDSVJfQllURTJfQUREUkVTUyBSQ0NfQ0lSX0JZVEUyX0FERFJFU1MNCi0jZGVmaW5lIEJEQ1JfQllURTBfQUREUkVTUyBSQ0NfQkRDUl9CWVRFMF9BRERSRVNTDQotI2RlZmluZSBEQlBfVElNRU9VVF9WQUxVRSBSQ0NfREJQX1RJTUVPVVRfVkFMVUUNCi0jZGVmaW5lIExTRV9USU1FT1VUX1ZBTFVFIFJDQ19MU0VfVElNRU9VVF9WQUxVRQ0KLQ0KLSNkZWZpbmUgQ1JfSFNJT05fQkIgUkNDX0NSX0hTSU9OX0JCDQotI2RlZmluZSBDUl9DU1NPTl9CQiBSQ0NfQ1JfQ1NTT05fQkINCi0jZGVmaW5lIENSX1BMTE9OX0JCIFJDQ19DUl9QTExPTl9CQg0KLSNkZWZpbmUgQ1JfUExMSTJTT05fQkIgUkNDX0NSX1BMTEkyU09OX0JCDQotI2RlZmluZSBDUl9NU0lPTl9CQiBSQ0NfQ1JfTVNJT05fQkINCi0jZGVmaW5lIENTUl9MU0lPTl9CQiBSQ0NfQ1NSX0xTSU9OX0JCDQotI2RlZmluZSBDU1JfTFNFT05fQkIgUkNDX0NTUl9MU0VPTl9CQg0KLSNkZWZpbmUgQ1NSX0xTRUJZUF9CQiBSQ0NfQ1NSX0xTRUJZUF9CQg0KLSNkZWZpbmUgQ1NSX1JUQ0VOX0JCIFJDQ19DU1JfUlRDRU5fQkINCi0jZGVmaW5lIENTUl9SVENSU1RfQkIgUkNDX0NTUl9SVENSU1RfQkINCi0jZGVmaW5lIENGR1JfSTJTU1JDX0JCIFJDQ19DRkdSX0kyU1NSQ19CQg0KLSNkZWZpbmUgQkRDUl9SVENFTl9CQiBSQ0NfQkRDUl9SVENFTl9CQg0KLSNkZWZpbmUgQkRDUl9CRFJTVF9CQiBSQ0NfQkRDUl9CRFJTVF9CQg0KLSNkZWZpbmUgQ1JfSFNFT05fQkIgUkNDX0NSX0hTRU9OX0JCDQotI2RlZmluZSBDU1JfUk1WRl9CQiBSQ0NfQ1NSX1JNVkZfQkINCi0jZGVmaW5lIENSX1BMTFNBSU9OX0JCIFJDQ19DUl9QTExTQUlPTl9CQg0KLSNkZWZpbmUgRENLQ0ZHUl9USU1QUkVfQkIgUkNDX0RDS0NGR1JfVElNUFJFX0JCDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfQ1JTX0VOQUJMRV9GUkVRX0VSUk9SX0NPVU5URVIgXA0KLSAgX19IQUxfUkNDX0NSU19GUkVRX0VSUk9SX0NPVU5URVJfRU5BQkxFDQotI2RlZmluZSBfX0hBTF9SQ0NfQ1JTX0RJU0FCTEVfRlJFUV9FUlJPUl9DT1VOVEVSIFwNCi0gIF9fSEFMX1JDQ19DUlNfRlJFUV9FUlJPUl9DT1VOVEVSX0RJU0FCTEUNCi0jZGVmaW5lIF9fSEFMX1JDQ19DUlNfRU5BQkxFX0FVVE9NQVRJQ19DQUxJQiBcDQotICBfX0hBTF9SQ0NfQ1JTX0FVVE9NQVRJQ19DQUxJQl9FTkFCTEUNCi0jZGVmaW5lIF9fSEFMX1JDQ19DUlNfRElTQUJMRV9BVVRPTUFUSUNfQ0FMSUIgXA0KLSAgX19IQUxfUkNDX0NSU19BVVRPTUFUSUNfQ0FMSUJfRElTQUJMRQ0KLSNkZWZpbmUgX19IQUxfUkNDX0NSU19DQUxDVUxBVEVfUkVMT0FEVkFMVUUgX19IQUxfUkNDX0NSU19SRUxPQURWQUxVRV9DQUxDVUxBVEUNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19HRVRfSVRfU09VUkNFIF9fSEFMX1JDQ19HRVRfSVQNCi0NCi0jZGVmaW5lIFJDQ19DUlNfU1lOQ1dBUk0gUkNDX0NSU19TWU5DV0FSTg0KLSNkZWZpbmUgUkNDX0NSU19UUklNT1YgUkNDX0NSU19UUklNT1ZGDQotDQotI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX0NLNDggUkNDX1BFUklQSENMS19DTEs0OA0KLSNkZWZpbmUgUkNDX0NLNDhDTEtTT1VSQ0VfUExMUSBSQ0NfQ0xLNDhDTEtTT1VSQ0VfUExMUQ0KLSNkZWZpbmUgUkNDX0NLNDhDTEtTT1VSQ0VfUExMU0FJUCBSQ0NfQ0xLNDhDTEtTT1VSQ0VfUExMU0FJUA0KLSNkZWZpbmUgUkNDX0NLNDhDTEtTT1VSQ0VfUExMSTJTUSBSQ0NfQ0xLNDhDTEtTT1VSQ0VfUExMSTJTUQ0KLSNkZWZpbmUgSVNfUkNDX0NLNDhDTEtTT1VSQ0UgSVNfUkNDX0NMSzQ4Q0xLU09VUkNFDQotI2RlZmluZSBSQ0NfU0RJT0NMS1NPVVJDRV9DSzQ4IFJDQ19TRElPQ0xLU09VUkNFX0NMSzQ4DQotDQotI2RlZmluZSBfX0hBTF9SQ0NfREZTRE1fQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfREZTRE0xX0NMS19FTkFCTEUNCi0jZGVmaW5lIF9fSEFMX1JDQ19ERlNETV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfREZTRE0xX0NMS19ESVNBQkxFDQotI2RlZmluZSBfX0hBTF9SQ0NfREZTRE1fSVNfQ0xLX0VOQUJMRUQgX19IQUxfUkNDX0RGU0RNMV9JU19DTEtfRU5BQkxFRA0KLSNkZWZpbmUgX19IQUxfUkNDX0RGU0RNX0lTX0NMS19ESVNBQkxFRCBfX0hBTF9SQ0NfREZTRE0xX0lTX0NMS19ESVNBQkxFRA0KLSNkZWZpbmUgX19IQUxfUkNDX0RGU0RNX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19ERlNETTFfRk9SQ0VfUkVTRVQNCi0jZGVmaW5lIF9fSEFMX1JDQ19ERlNETV9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19ERlNETTFfUkVMRUFTRV9SRVNFVA0KLSNkZWZpbmUgX19IQUxfUkNDX0RGU0RNX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0RGU0RNMV9DTEtfU0xFRVBfRU5BQkxFDQotI2RlZmluZSBfX0hBTF9SQ0NfREZTRE1fQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0RGU0RNMV9DTEtfU0xFRVBfRElTQUJMRQ0KLSNkZWZpbmUgX19IQUxfUkNDX0RGU0RNX0lTX0NMS19TTEVFUF9FTkFCTEVEIFwNCi0gIF9fSEFMX1JDQ19ERlNETTFfSVNfQ0xLX1NMRUVQX0VOQUJMRUQNCi0jZGVmaW5lIF9fSEFMX1JDQ19ERlNETV9JU19DTEtfU0xFRVBfRElTQUJMRUQgXA0KLSAgX19IQUxfUkNDX0RGU0RNMV9JU19DTEtfU0xFRVBfRElTQUJMRUQNCi0jZGVmaW5lIERmc2RtQ2xvY2tTZWxlY3Rpb24gRGZzZG0xQ2xvY2tTZWxlY3Rpb24NCi0jZGVmaW5lIFJDQ19QRVJJUEhDTEtfREZTRE0gUkNDX1BFUklQSENMS19ERlNETTENCi0jZGVmaW5lIFJDQ19ERlNETUNMS1NPVVJDRV9QQ0xLIFJDQ19ERlNETTFDTEtTT1VSQ0VfUENMSzINCi0jZGVmaW5lIFJDQ19ERlNETUNMS1NPVVJDRV9TWVNDTEsgUkNDX0RGU0RNMUNMS1NPVVJDRV9TWVNDTEsNCi0jZGVmaW5lIF9fSEFMX1JDQ19ERlNETV9DT05GSUcgX19IQUxfUkNDX0RGU0RNMV9DT05GSUcNCi0jZGVmaW5lIF9fSEFMX1JDQ19HRVRfREZTRE1fU09VUkNFIF9fSEFMX1JDQ19HRVRfREZTRE0xX1NPVVJDRQ0KLSNkZWZpbmUgUkNDX0RGU0RNMUNMS1NPVVJDRV9QQ0xLIFJDQ19ERlNETTFDTEtTT1VSQ0VfUENMSzINCi0jZGVmaW5lIFJDQ19TV1BNSTFDTEtTT1VSQ0VfUENMSyBSQ0NfU1dQTUkxQ0xLU09VUkNFX1BDTEsxDQotI2RlZmluZSBSQ0NfTFBUSU0xQ0xLU09VUkNFX1BDTEsgUkNDX0xQVElNMUNMS1NPVVJDRV9QQ0xLMQ0KLSNkZWZpbmUgUkNDX0xQVElNMkNMS1NPVVJDRV9QQ0xLIFJDQ19MUFRJTTJDTEtTT1VSQ0VfUENMSzENCi0NCi0jZGVmaW5lIFJDQ19ERlNETTFBVURJT0NMS1NPVVJDRV9JMlNBUEIxIFJDQ19ERlNETTFBVURJT0NMS1NPVVJDRV9JMlMxDQotI2RlZmluZSBSQ0NfREZTRE0xQVVESU9DTEtTT1VSQ0VfSTJTQVBCMiBSQ0NfREZTRE0xQVVESU9DTEtTT1VSQ0VfSTJTMg0KLSNkZWZpbmUgUkNDX0RGU0RNMkFVRElPQ0xLU09VUkNFX0kyU0FQQjEgUkNDX0RGU0RNMkFVRElPQ0xLU09VUkNFX0kyUzENCi0jZGVmaW5lIFJDQ19ERlNETTJBVURJT0NMS1NPVVJDRV9JMlNBUEIyIFJDQ19ERlNETTJBVURJT0NMS1NPVVJDRV9JMlMyDQotI2RlZmluZSBSQ0NfREZTRE0xQ0xLU09VUkNFX0FQQjIgUkNDX0RGU0RNMUNMS1NPVVJDRV9QQ0xLMg0KLSNkZWZpbmUgUkNDX0RGU0RNMkNMS1NPVVJDRV9BUEIyIFJDQ19ERlNETTJDTEtTT1VSQ0VfUENMSzINCi0jZGVmaW5lIFJDQ19GTVBJMkMxQ0xLU09VUkNFX0FQQiBSQ0NfRk1QSTJDMUNMS1NPVVJDRV9QQ0xLMQ0KLSNpZiBkZWZpbmVkKFNUTTMyVTUpDQotI2RlZmluZSBNU0lLUExMTW9kZVNFTCBSQ0NfTVNJS1BMTF9NT0RFX1NFTA0KLSNkZWZpbmUgTVNJU1BMTE1vZGVTRUwgUkNDX01TSVNQTExfTU9ERV9TRUwNCi0jZGVmaW5lIF9fSEFMX1JDQ19BSEIyMV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfQUhCMl8xX0NMS19ESVNBQkxFDQotI2RlZmluZSBfX0hBTF9SQ0NfQUhCMjJfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0FIQjJfMl9DTEtfRElTQUJMRQ0KLSNkZWZpbmUgX19IQUxfUkNDX0FIQjFfQ0xLX0Rpc2FibGVfQ2xlYXIgX19IQUxfUkNDX0FIQjFfQ0xLX0VOQUJMRQ0KLSNkZWZpbmUgX19IQUxfUkNDX0FIQjIxX0NMS19EaXNhYmxlX0NsZWFyIF9fSEFMX1JDQ19BSEIyXzFfQ0xLX0VOQUJMRQ0KLSNkZWZpbmUgX19IQUxfUkNDX0FIQjIyX0NMS19EaXNhYmxlX0NsZWFyIF9fSEFMX1JDQ19BSEIyXzJfQ0xLX0VOQUJMRQ0KLSNkZWZpbmUgX19IQUxfUkNDX0FIQjNfQ0xLX0Rpc2FibGVfQ2xlYXIgX19IQUxfUkNDX0FIQjNfQ0xLX0VOQUJMRQ0KLSNkZWZpbmUgX19IQUxfUkNDX0FQQjFfQ0xLX0Rpc2FibGVfQ2xlYXIgX19IQUxfUkNDX0FQQjFfQ0xLX0VOQUJMRQ0KLSNkZWZpbmUgX19IQUxfUkNDX0FQQjJfQ0xLX0Rpc2FibGVfQ2xlYXIgX19IQUxfUkNDX0FQQjJfQ0xLX0VOQUJMRQ0KLSNkZWZpbmUgX19IQUxfUkNDX0FQQjNfQ0xLX0Rpc2FibGVfQ2xlYXIgX19IQUxfUkNDX0FQQjNfQ0xLX0VOQUJMRQ0KLSNkZWZpbmUgSVNfUkNDX01TSVBMTE1vZGVTZWxlY3Rpb24gSVNfUkNDX01TSVBMTE1PREVfU0VMRUNUDQotI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX0NMSzQ4IFJDQ19QRVJJUEhDTEtfSUNMSw0KLSNkZWZpbmUgUkNDX0NMSzQ4Q0xLU09VUkNFX0hTSTQ4IFJDQ19JQ0xLX0NMS1NPVVJDRV9IU0k0OA0KLSNkZWZpbmUgUkNDX0NMSzQ4Q0xLU09VUkNFX1BMTDIgUkNDX0lDTEtfQ0xLU09VUkNFX1BMTDINCi0jZGVmaW5lIFJDQ19DTEs0OENMS1NPVVJDRV9QTEwxIFJDQ19JQ0xLX0NMS1NPVVJDRV9QTEwxDQotI2RlZmluZSBSQ0NfQ0xLNDhDTEtTT1VSQ0VfTVNJSyBSQ0NfSUNMS19DTEtTT1VSQ0VfTVNJSw0KLSNkZWZpbmUgX19IQUxfUkNDX0FEQzFfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfQURDMTJfQ0xLX0VOQUJMRQ0KLSNkZWZpbmUgX19IQUxfUkNDX0FEQzFfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0FEQzEyX0NMS19ESVNBQkxFDQotI2RlZmluZSBfX0hBTF9SQ0NfQURDMV9JU19DTEtfRU5BQkxFRCBfX0hBTF9SQ0NfQURDMTJfSVNfQ0xLX0VOQUJMRUQNCi0jZGVmaW5lIF9fSEFMX1JDQ19BREMxX0lTX0NMS19ESVNBQkxFRCBfX0hBTF9SQ0NfQURDMTJfSVNfQ0xLX0RJU0FCTEVEDQotI2RlZmluZSBfX0hBTF9SQ0NfQURDMV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfQURDMTJfRk9SQ0VfUkVTRVQNCi0jZGVmaW5lIF9fSEFMX1JDQ19BREMxX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0FEQzEyX1JFTEVBU0VfUkVTRVQNCi0jZW5kaWYNCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgSEFMX1JOR19BbGlhc2VkX01hY3JvcyBIQUwgUk5HIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yDQotICogbGVnYWN5IHB1cnBvc2UNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgSEFMX1JOR19SZWFkeUNhbGxiYWNrKF9fSEFORExFX18pIFwNCi0gIEhBTF9STkdfUmVhZHlEYXRhQ2FsbGJhY2soKF9fSEFORExFX18pLCB1aW50MzJfdCByYW5kb20zMmJpdCkNCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgSEFMX1JUQ19BbGlhc2VkX01hY3JvcyBIQUwgUlRDIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yDQotICogbGVnYWN5IHB1cnBvc2UNCi0gKiBAew0KLSAqLw0KLSNpZiBkZWZpbmVkKFNUTTMyRzApIHx8IGRlZmluZWQoU1RNMzJMNSkgfHwgZGVmaW5lZChTVE0zMkw0MTJ4eCkgfHwgICAgICAgICBcDQotICAgIGRlZmluZWQoU1RNMzJMNDIyeHgpIHx8IGRlZmluZWQoU1RNMzJMNFA1eHgpIHx8IGRlZmluZWQoU1RNMzJMNFE1eHgpIHx8IFwNCi0gICAgZGVmaW5lZChTVE0zMkc0KSB8fCBkZWZpbmVkKFNUTTMyV0wpIHx8IGRlZmluZWQoU1RNMzJVNSkNCi0jZWxzZQ0KLSNkZWZpbmUgX19IQUxfUlRDX0NMRUFSX0ZMQUcgX19IQUxfUlRDX0VYVElfQ0xFQVJfRkxBRw0KLSNlbmRpZg0KLSNkZWZpbmUgX19IQUxfUlRDX0RJU0FCTEVfSVQgX19IQUxfUlRDX0VYVElfRElTQUJMRV9JVA0KLSNkZWZpbmUgX19IQUxfUlRDX0VOQUJMRV9JVCBfX0hBTF9SVENfRVhUSV9FTkFCTEVfSVQNCi0NCi0jaWYgZGVmaW5lZChTVE0zMkYxKQ0KLSNkZWZpbmUgX19IQUxfUlRDX0VYVElfQ0xFQVJfRkxBRyhSVENfRVhUSV9MSU5FX0FMQVJNX0VWRU5UKSBcDQotICBfX0hBTF9SVENfQUxBUk1fRVhUSV9DTEVBUl9GTEFHKCkNCi0NCi0jZGVmaW5lIF9fSEFMX1JUQ19FWFRJX0VOQUJMRV9JVChSVENfRVhUSV9MSU5FX0FMQVJNX0VWRU5UKSBcDQotICBfX0hBTF9SVENfQUxBUk1fRVhUSV9FTkFCTEVfSVQoKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUlRDX0VYVElfRElTQUJMRV9JVChSVENfRVhUSV9MSU5FX0FMQVJNX0VWRU5UKSBcDQotICBfX0hBTF9SVENfQUxBUk1fRVhUSV9ESVNBQkxFX0lUKCkNCi0NCi0jZGVmaW5lIF9fSEFMX1JUQ19FWFRJX0dFVF9GTEFHKFJUQ19FWFRJX0xJTkVfQUxBUk1fRVZFTlQpIFwNCi0gIF9fSEFMX1JUQ19BTEFSTV9FWFRJX0dFVF9GTEFHKCkNCi0NCi0jZGVmaW5lIF9fSEFMX1JUQ19FWFRJX0dFTkVSQVRFX1NXSVQoUlRDX0VYVElfTElORV9BTEFSTV9FVkVOVCkgXA0KLSAgX19IQUxfUlRDX0FMQVJNX0VYVElfR0VORVJBVEVfU1dJVCgpDQotI2Vsc2UNCi0jZGVmaW5lIF9fSEFMX1JUQ19FWFRJX0NMRUFSX0ZMQUcoX19FWFRJX0xJTkVfXykgICAgICAgICAgICAgICBcDQotICAoKChfX0VYVElfTElORV9fKSA9PSBSVENfRVhUSV9MSU5FX0FMQVJNX0VWRU5UKSAgICAgICAgICAgICAgXA0KLSAgICAgICA/IF9fSEFMX1JUQ19BTEFSTV9FWFRJX0NMRUFSX0ZMQUcoKSAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgOiAoKChfX0VYVElfTElORV9fKSA9PSBSVENfRVhUSV9MSU5FX1dBS0VVUFRJTUVSX0VWRU5UKSBcDQotICAgICAgICAgICAgICA/IF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9FWFRJX0NMRUFSX0ZMQUcoKSAgICAgICAgXA0KLSAgICAgICAgICAgICAgOiBfX0hBTF9SVENfVEFNUEVSX1RJTUVTVEFNUF9FWFRJX0NMRUFSX0ZMQUcoKSkpDQotI2RlZmluZSBfX0hBTF9SVENfRVhUSV9FTkFCTEVfSVQoX19FWFRJX0xJTkVfXykgICAgICAgICAgICAgICAgXA0KLSAgKCgoX19FWFRJX0xJTkVfXykgPT0gUlRDX0VYVElfTElORV9BTEFSTV9FVkVOVCkgICAgICAgICAgICAgIFwNCi0gICAgICAgPyBfX0hBTF9SVENfQUxBUk1fRVhUSV9FTkFCTEVfSVQoKSAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgIDogKCgoX19FWFRJX0xJTkVfXykgPT0gUlRDX0VYVElfTElORV9XQUtFVVBUSU1FUl9FVkVOVCkgXA0KLSAgICAgICAgICAgICAgPyBfX0hBTF9SVENfV0FLRVVQVElNRVJfRVhUSV9FTkFCTEVfSVQoKSAgICAgICAgIFwNCi0gICAgICAgICAgICAgIDogX19IQUxfUlRDX1RBTVBFUl9USU1FU1RBTVBfRVhUSV9FTkFCTEVfSVQoKSkpDQotI2RlZmluZSBfX0hBTF9SVENfRVhUSV9ESVNBQkxFX0lUKF9fRVhUSV9MSU5FX18pICAgICAgICAgICAgICAgXA0KLSAgKCgoX19FWFRJX0xJTkVfXykgPT0gUlRDX0VYVElfTElORV9BTEFSTV9FVkVOVCkgICAgICAgICAgICAgIFwNCi0gICAgICAgPyBfX0hBTF9SVENfQUxBUk1fRVhUSV9ESVNBQkxFX0lUKCkgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgIDogKCgoX19FWFRJX0xJTkVfXykgPT0gUlRDX0VYVElfTElORV9XQUtFVVBUSU1FUl9FVkVOVCkgXA0KLSAgICAgICAgICAgICAgPyBfX0hBTF9SVENfV0FLRVVQVElNRVJfRVhUSV9ESVNBQkxFX0lUKCkgICAgICAgIFwNCi0gICAgICAgICAgICAgIDogX19IQUxfUlRDX1RBTVBFUl9USU1FU1RBTVBfRVhUSV9ESVNBQkxFX0lUKCkpKQ0KLSNkZWZpbmUgX19IQUxfUlRDX0VYVElfR0VUX0ZMQUcoX19FWFRJX0xJTkVfXykgICAgICAgICAgICAgICAgIFwNCi0gICgoKF9fRVhUSV9MSU5FX18pID09IFJUQ19FWFRJX0xJTkVfQUxBUk1fRVZFTlQpICAgICAgICAgICAgICBcDQotICAgICAgID8gX19IQUxfUlRDX0FMQVJNX0VYVElfR0VUX0ZMQUcoKSAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICA6ICgoKF9fRVhUSV9MSU5FX18pID09IFJUQ19FWFRJX0xJTkVfV0FLRVVQVElNRVJfRVZFTlQpIFwNCi0gICAgICAgICAgICAgID8gX19IQUxfUlRDX1dBS0VVUFRJTUVSX0VYVElfR0VUX0ZMQUcoKSAgICAgICAgICBcDQotICAgICAgICAgICAgICA6IF9fSEFMX1JUQ19UQU1QRVJfVElNRVNUQU1QX0VYVElfR0VUX0ZMQUcoKSkpDQotI2RlZmluZSBfX0hBTF9SVENfRVhUSV9HRU5FUkFURV9TV0lUKF9fRVhUSV9MSU5FX18pICAgICAgICAgICAgXA0KLSAgKCgoX19FWFRJX0xJTkVfXykgPT0gUlRDX0VYVElfTElORV9BTEFSTV9FVkVOVCkgICAgICAgICAgICAgIFwNCi0gICAgICAgPyBfX0hBTF9SVENfQUxBUk1fRVhUSV9HRU5FUkFURV9TV0lUKCkgICAgICAgICAgICAgICAgICBcDQotICAgICAgIDogKCgoX19FWFRJX0xJTkVfXykgPT0gUlRDX0VYVElfTElORV9XQUtFVVBUSU1FUl9FVkVOVCkgXA0KLSAgICAgICAgICAgICAgPyBfX0hBTF9SVENfV0FLRVVQVElNRVJfRVhUSV9HRU5FUkFURV9TV0lUKCkgICAgIFwNCi0gICAgICAgICAgICAgIDogX19IQUxfUlRDX1RBTVBFUl9USU1FU1RBTVBfRVhUSV9HRU5FUkFURV9TV0lUKCkpKQ0KLSNlbmRpZiAvKiBTVE0zMkYxICovDQotDQotI2RlZmluZSBJU19BTEFSTSBJU19SVENfQUxBUk0NCi0jZGVmaW5lIElTX0FMQVJNX01BU0sgSVNfUlRDX0FMQVJNX01BU0sNCi0jZGVmaW5lIElTX1RBTVBFUiBJU19SVENfVEFNUEVSDQotI2RlZmluZSBJU19UQU1QRVJfRVJBU0VfTU9ERSBJU19SVENfVEFNUEVSX0VSQVNFX01PREUNCi0jZGVmaW5lIElTX1RBTVBFUl9GSUxURVIgSVNfUlRDX1RBTVBFUl9GSUxURVINCi0jZGVmaW5lIElTX1RBTVBFUl9JTlRFUlJVUFQgSVNfUlRDX1RBTVBFUl9JTlRFUlJVUFQNCi0jZGVmaW5lIElTX1RBTVBFUl9NQVNLRkxBR19TVEFURSBJU19SVENfVEFNUEVSX01BU0tGTEFHX1NUQVRFDQotI2RlZmluZSBJU19UQU1QRVJfUFJFQ0hBUkdFX0RVUkFUSU9OIElTX1JUQ19UQU1QRVJfUFJFQ0hBUkdFX0RVUkFUSU9ODQotI2RlZmluZSBJU19UQU1QRVJfUFVMTFVQX1NUQVRFIElTX1JUQ19UQU1QRVJfUFVMTFVQX1NUQVRFDQotI2RlZmluZSBJU19UQU1QRVJfU0FNUExJTkdfRlJFUSBJU19SVENfVEFNUEVSX1NBTVBMSU5HX0ZSRVENCi0jZGVmaW5lIElTX1RBTVBFUl9USU1FU1RBTVBPTlRBTVBFUl9ERVRFQ1RJT04gXA0KLSAgSVNfUlRDX1RBTVBFUl9USU1FU1RBTVBPTlRBTVBFUl9ERVRFQ1RJT04NCi0jZGVmaW5lIElTX1RBTVBFUl9UUklHR0VSIElTX1JUQ19UQU1QRVJfVFJJR0dFUg0KLSNkZWZpbmUgSVNfV0FLRVVQX0NMT0NLIElTX1JUQ19XQUtFVVBfQ0xPQ0sNCi0jZGVmaW5lIElTX1dBS0VVUF9DT1VOVEVSIElTX1JUQ19XQUtFVVBfQ09VTlRFUg0KLQ0KLSNkZWZpbmUgX19SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRSBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRQ0KLSNkZWZpbmUgX19SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEhBTF9TRF9BbGlhc2VkX01hY3JvcyBIQUwgU0QvTU1DIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yDQotICogbGVnYWN5IHB1cnBvc2UNCi0gKiBAew0KLSAqLw0KLQ0KLSNkZWZpbmUgU0RfT0NSX0NJRF9DU0RfT1ZFUldSSUVURSBTRF9PQ1JfQ0lEX0NTRF9PVkVSV1JJVEUNCi0jZGVmaW5lIFNEX0NNRF9TRF9BUFBfU1RBVVMgU0RfQ01EX1NEX0FQUF9TVEFUVVMNCi0NCi0jaWYgIWRlZmluZWQoU1RNMzJGMSkgJiYgIWRlZmluZWQoU1RNMzJGMikgJiYgIWRlZmluZWQoU1RNMzJGNCkgJiYgXA0KLSAgICAhZGVmaW5lZChTVE0zMkY3KSAmJiAhZGVmaW5lZChTVE0zMkwxKQ0KLSNkZWZpbmUgZU1NQ19ISUdIX1ZPTFRBR0VfUkFOR0UgRU1NQ19ISUdIX1ZPTFRBR0VfUkFOR0UNCi0jZGVmaW5lIGVNTUNfRFVBTF9WT0xUQUdFX1JBTkdFIEVNTUNfRFVBTF9WT0xUQUdFX1JBTkdFDQotI2RlZmluZSBlTU1DX0xPV19WT0xUQUdFX1JBTkdFIEVNTUNfTE9XX1ZPTFRBR0VfUkFOR0UNCi0NCi0jZGVmaW5lIFNETU1DX05TcGVlZF9DTEtfRElWIFNETU1DX05TUEVFRF9DTEtfRElWDQotI2RlZmluZSBTRE1NQ19IU3BlZWRfQ0xLX0RJViBTRE1NQ19IU1BFRURfQ0xLX0RJVg0KLSNlbmRpZg0KLQ0KLSNpZiBkZWZpbmVkKFNUTTMyRjQpIHx8IGRlZmluZWQoU1RNMzJGMikNCi0jZGVmaW5lIFNEX1NETU1DX0RJU0FCTEVEIFNEX1NESU9fRElTQUJMRUQNCi0jZGVmaW5lIFNEX1NETU1DX0ZVTkNUSU9OX0JVU1kgU0RfU0RJT19GVU5DVElPTl9CVVNZDQotI2RlZmluZSBTRF9TRE1NQ19GVU5DVElPTl9GQUlMRUQgU0RfU0RJT19GVU5DVElPTl9GQUlMRUQNCi0jZGVmaW5lIFNEX1NETU1DX1VOS05PV05fRlVOQ1RJT04gU0RfU0RJT19VTktOT1dOX0ZVTkNUSU9ODQotI2RlZmluZSBTRF9DTURfU0RNTUNfU0VOX09QX0NPTkQgU0RfQ01EX1NESU9fU0VOX09QX0NPTkQNCi0jZGVmaW5lIFNEX0NNRF9TRE1NQ19SV19ESVJFQ1QgU0RfQ01EX1NESU9fUldfRElSRUNUDQotI2RlZmluZSBTRF9DTURfU0RNTUNfUldfRVhURU5ERUQgU0RfQ01EX1NESU9fUldfRVhURU5ERUQNCi0jZGVmaW5lIF9fSEFMX1NEX1NETU1DX0VOQUJMRSBfX0hBTF9TRF9TRElPX0VOQUJMRQ0KLSNkZWZpbmUgX19IQUxfU0RfU0RNTUNfRElTQUJMRSBfX0hBTF9TRF9TRElPX0RJU0FCTEUNCi0jZGVmaW5lIF9fSEFMX1NEX1NETU1DX0RNQV9FTkFCTEUgX19IQUxfU0RfU0RJT19ETUFfRU5BQkxFDQotI2RlZmluZSBfX0hBTF9TRF9TRE1NQ19ETUFfRElTQUJMRSBfX0hBTF9TRF9TRElPX0RNQV9ESVNBQkwNCi0jZGVmaW5lIF9fSEFMX1NEX1NETU1DX0VOQUJMRV9JVCBfX0hBTF9TRF9TRElPX0VOQUJMRV9JVA0KLSNkZWZpbmUgX19IQUxfU0RfU0RNTUNfRElTQUJMRV9JVCBfX0hBTF9TRF9TRElPX0RJU0FCTEVfSVQNCi0jZGVmaW5lIF9fSEFMX1NEX1NETU1DX0dFVF9GTEFHIF9fSEFMX1NEX1NESU9fR0VUX0ZMQUcNCi0jZGVmaW5lIF9fSEFMX1NEX1NETU1DX0NMRUFSX0ZMQUcgX19IQUxfU0RfU0RJT19DTEVBUl9GTEFHDQotI2RlZmluZSBfX0hBTF9TRF9TRE1NQ19HRVRfSVQgX19IQUxfU0RfU0RJT19HRVRfSVQNCi0jZGVmaW5lIF9fSEFMX1NEX1NETU1DX0NMRUFSX0lUIF9fSEFMX1NEX1NESU9fQ0xFQVJfSVQNCi0jZGVmaW5lIFNETU1DX1NUQVRJQ19GTEFHUyBTRElPX1NUQVRJQ19GTEFHUw0KLSNkZWZpbmUgU0RNTUNfQ01EMFRJTUVPVVQgU0RJT19DTUQwVElNRU9VVA0KLSNkZWZpbmUgU0RfU0RNTUNfU0VORF9JRl9DT05EIFNEX1NESU9fU0VORF9JRl9DT05EDQotLyogYWxpYXMgQ01TSVMgKi8NCi0jZGVmaW5lIFNETU1DMV9JUlFuIFNESU9fSVJRbg0KLSNkZWZpbmUgU0RNTUMxX0lSUUhhbmRsZXIgU0RJT19JUlFIYW5kbGVyDQotI2VuZGlmDQotDQotI2lmIGRlZmluZWQoU1RNMzJGNykgfHwgZGVmaW5lZChTVE0zMkw0KQ0KLSNkZWZpbmUgU0RfU0RJT19ESVNBQkxFRCBTRF9TRE1NQ19ESVNBQkxFRA0KLSNkZWZpbmUgU0RfU0RJT19GVU5DVElPTl9CVVNZIFNEX1NETU1DX0ZVTkNUSU9OX0JVU1kNCi0jZGVmaW5lIFNEX1NESU9fRlVOQ1RJT05fRkFJTEVEIFNEX1NETU1DX0ZVTkNUSU9OX0ZBSUxFRA0KLSNkZWZpbmUgU0RfU0RJT19VTktOT1dOX0ZVTkNUSU9OIFNEX1NETU1DX1VOS05PV05fRlVOQ1RJT04NCi0jZGVmaW5lIFNEX0NNRF9TRElPX1NFTl9PUF9DT05EIFNEX0NNRF9TRE1NQ19TRU5fT1BfQ09ORA0KLSNkZWZpbmUgU0RfQ01EX1NESU9fUldfRElSRUNUIFNEX0NNRF9TRE1NQ19SV19ESVJFQ1QNCi0jZGVmaW5lIFNEX0NNRF9TRElPX1JXX0VYVEVOREVEIFNEX0NNRF9TRE1NQ19SV19FWFRFTkRFRA0KLSNkZWZpbmUgX19IQUxfU0RfU0RJT19FTkFCTEUgX19IQUxfU0RfU0RNTUNfRU5BQkxFDQotI2RlZmluZSBfX0hBTF9TRF9TRElPX0RJU0FCTEUgX19IQUxfU0RfU0RNTUNfRElTQUJMRQ0KLSNkZWZpbmUgX19IQUxfU0RfU0RJT19ETUFfRU5BQkxFIF9fSEFMX1NEX1NETU1DX0RNQV9FTkFCTEUNCi0jZGVmaW5lIF9fSEFMX1NEX1NESU9fRE1BX0RJU0FCTCBfX0hBTF9TRF9TRE1NQ19ETUFfRElTQUJMRQ0KLSNkZWZpbmUgX19IQUxfU0RfU0RJT19FTkFCTEVfSVQgX19IQUxfU0RfU0RNTUNfRU5BQkxFX0lUDQotI2RlZmluZSBfX0hBTF9TRF9TRElPX0RJU0FCTEVfSVQgX19IQUxfU0RfU0RNTUNfRElTQUJMRV9JVA0KLSNkZWZpbmUgX19IQUxfU0RfU0RJT19HRVRfRkxBRyBfX0hBTF9TRF9TRE1NQ19HRVRfRkxBRw0KLSNkZWZpbmUgX19IQUxfU0RfU0RJT19DTEVBUl9GTEFHIF9fSEFMX1NEX1NETU1DX0NMRUFSX0ZMQUcNCi0jZGVmaW5lIF9fSEFMX1NEX1NESU9fR0VUX0lUIF9fSEFMX1NEX1NETU1DX0dFVF9JVA0KLSNkZWZpbmUgX19IQUxfU0RfU0RJT19DTEVBUl9JVCBfX0hBTF9TRF9TRE1NQ19DTEVBUl9JVA0KLSNkZWZpbmUgU0RJT19TVEFUSUNfRkxBR1MgU0RNTUNfU1RBVElDX0ZMQUdTDQotI2RlZmluZSBTRElPX0NNRDBUSU1FT1VUIFNETU1DX0NNRDBUSU1FT1VUDQotI2RlZmluZSBTRF9TRElPX1NFTkRfSUZfQ09ORCBTRF9TRE1NQ19TRU5EX0lGX0NPTkQNCi0vKiBhbGlhcyBDTVNJUyBmb3IgY29tcGF0aWJpbGl0aWVzICovDQotI2RlZmluZSBTRElPX0lSUW4gU0RNTUMxX0lSUW4NCi0jZGVmaW5lIFNESU9fSVJRSGFuZGxlciBTRE1NQzFfSVJRSGFuZGxlcg0KLSNlbmRpZg0KLQ0KLSNpZiBkZWZpbmVkKFNUTTMyRjcpIHx8IGRlZmluZWQoU1RNMzJGNCkgfHwgZGVmaW5lZChTVE0zMkYyKSB8fCBcDQotICAgIGRlZmluZWQoU1RNMzJMNCkgfHwgZGVmaW5lZChTVE0zMkg3KQ0KLSNkZWZpbmUgSEFMX1NEX0NhcmRDSURUeXBlZGVmIEhBTF9TRF9DYXJkQ0lEVHlwZURlZg0KLSNkZWZpbmUgSEFMX1NEX0NhcmRDU0RUeXBlZGVmIEhBTF9TRF9DYXJkQ1NEVHlwZURlZg0KLSNkZWZpbmUgSEFMX1NEX0NhcmRTdGF0dXNUeXBlZGVmIEhBTF9TRF9DYXJkU3RhdHVzVHlwZURlZg0KLSNkZWZpbmUgSEFMX1NEX0NhcmRTdGF0ZVR5cGVkZWYgSEFMX1NEX0NhcmRTdGF0ZVR5cGVEZWYNCi0jZW5kaWYNCi0NCi0jaWYgZGVmaW5lZChTVE0zMkg3KSB8fCBkZWZpbmVkKFNUTTMyTDUpDQotI2RlZmluZSBIQUxfTU1DRXhfUmVhZF9ETUFEb3VibGVCdWZmZXIwQ3BsdENhbGxiYWNrIFwNCi0gIEhBTF9NTUNFeF9SZWFkX0RNQURvdWJsZUJ1ZjBDcGx0Q2FsbGJhY2sNCi0jZGVmaW5lIEhBTF9NTUNFeF9SZWFkX0RNQURvdWJsZUJ1ZmZlcjFDcGx0Q2FsbGJhY2sgXA0KLSAgSEFMX01NQ0V4X1JlYWRfRE1BRG91YmxlQnVmMUNwbHRDYWxsYmFjaw0KLSNkZWZpbmUgSEFMX01NQ0V4X1dyaXRlX0RNQURvdWJsZUJ1ZmZlcjBDcGx0Q2FsbGJhY2sgXA0KLSAgSEFMX01NQ0V4X1dyaXRlX0RNQURvdWJsZUJ1ZjBDcGx0Q2FsbGJhY2sNCi0jZGVmaW5lIEhBTF9NTUNFeF9Xcml0ZV9ETUFEb3VibGVCdWZmZXIxQ3BsdENhbGxiYWNrIFwNCi0gIEhBTF9NTUNFeF9Xcml0ZV9ETUFEb3VibGVCdWYxQ3BsdENhbGxiYWNrDQotI2RlZmluZSBIQUxfU0RFeF9SZWFkX0RNQURvdWJsZUJ1ZmZlcjBDcGx0Q2FsbGJhY2sgXA0KLSAgSEFMX1NERXhfUmVhZF9ETUFEb3VibGVCdWYwQ3BsdENhbGxiYWNrDQotI2RlZmluZSBIQUxfU0RFeF9SZWFkX0RNQURvdWJsZUJ1ZmZlcjFDcGx0Q2FsbGJhY2sgXA0KLSAgSEFMX1NERXhfUmVhZF9ETUFEb3VibGVCdWYxQ3BsdENhbGxiYWNrDQotI2RlZmluZSBIQUxfU0RFeF9Xcml0ZV9ETUFEb3VibGVCdWZmZXIwQ3BsdENhbGxiYWNrIFwNCi0gIEhBTF9TREV4X1dyaXRlX0RNQURvdWJsZUJ1ZjBDcGx0Q2FsbGJhY2sNCi0jZGVmaW5lIEhBTF9TREV4X1dyaXRlX0RNQURvdWJsZUJ1ZmZlcjFDcGx0Q2FsbGJhY2sgXA0KLSAgSEFMX1NERXhfV3JpdGVfRE1BRG91YmxlQnVmMUNwbHRDYWxsYmFjaw0KLSNkZWZpbmUgSEFMX1NEX0RyaXZlVHJhbnNjaXZlcl8xXzhWX0NhbGxiYWNrIFwNCi0gIEhBTF9TRF9Ecml2ZVRyYW5zY2VpdmVyXzFfOFZfQ2FsbGJhY2sNCi0jZW5kaWYNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgSEFMX1NNQVJUQ0FSRF9BbGlhc2VkX01hY3JvcyBIQUwgU01BUlRDQVJEIEFsaWFzZWQgTWFjcm9zDQotICogbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UNCi0gKiBAew0KLSAqLw0KLQ0KLSNkZWZpbmUgX19TTUFSVENBUkRfRU5BQkxFX0lUIF9fSEFMX1NNQVJUQ0FSRF9FTkFCTEVfSVQNCi0jZGVmaW5lIF9fU01BUlRDQVJEX0RJU0FCTEVfSVQgX19IQUxfU01BUlRDQVJEX0RJU0FCTEVfSVQNCi0jZGVmaW5lIF9fU01BUlRDQVJEX0VOQUJMRSBfX0hBTF9TTUFSVENBUkRfRU5BQkxFDQotI2RlZmluZSBfX1NNQVJUQ0FSRF9ESVNBQkxFIF9fSEFMX1NNQVJUQ0FSRF9ESVNBQkxFDQotI2RlZmluZSBfX1NNQVJUQ0FSRF9ETUFfUkVRVUVTVF9FTkFCTEUgX19IQUxfU01BUlRDQVJEX0RNQV9SRVFVRVNUX0VOQUJMRQ0KLSNkZWZpbmUgX19TTUFSVENBUkRfRE1BX1JFUVVFU1RfRElTQUJMRSBfX0hBTF9TTUFSVENBUkRfRE1BX1JFUVVFU1RfRElTQUJMRQ0KLQ0KLSNkZWZpbmUgX19IQUxfU01BUlRDQVJEX0dFVENMT0NLU09VUkNFIFNNQVJUQ0FSRF9HRVRDTE9DS1NPVVJDRQ0KLSNkZWZpbmUgX19TTUFSVENBUkRfR0VUQ0xPQ0tTT1VSQ0UgU01BUlRDQVJEX0dFVENMT0NLU09VUkNFDQotDQotI2RlZmluZSBJU19TTUFSVENBUkRfT05FQklUX1NBTVBMSU5HIElTX1NNQVJUQ0FSRF9PTkVfQklUX1NBTVBMRQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBIQUxfU01CVVNfQWxpYXNlZF9NYWNyb3MgSEFMIFNNQlVTIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yDQotICogbGVnYWN5IHB1cnBvc2UNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgX19IQUxfU01CVVNfUkVTRVRfQ1IxIFNNQlVTX1JFU0VUX0NSMQ0KLSNkZWZpbmUgX19IQUxfU01CVVNfUkVTRVRfQ1IyIFNNQlVTX1JFU0VUX0NSMg0KLSNkZWZpbmUgX19IQUxfU01CVVNfR0VORVJBVEVfU1RBUlQgU01CVVNfR0VORVJBVEVfU1RBUlQNCi0jZGVmaW5lIF9fSEFMX1NNQlVTX0dFVF9BRERSX01BVENIIFNNQlVTX0dFVF9BRERSX01BVENIDQotI2RlZmluZSBfX0hBTF9TTUJVU19HRVRfRElSIFNNQlVTX0dFVF9ESVINCi0jZGVmaW5lIF9fSEFMX1NNQlVTX0dFVF9TVE9QX01PREUgU01CVVNfR0VUX1NUT1BfTU9ERQ0KLSNkZWZpbmUgX19IQUxfU01CVVNfR0VUX1BFQ19NT0RFIFNNQlVTX0dFVF9QRUNfTU9ERQ0KLSNkZWZpbmUgX19IQUxfU01CVVNfR0VUX0FMRVJUX0VOQUJMRUQgU01CVVNfR0VUX0FMRVJUX0VOQUJMRUQNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgSEFMX1NQSV9BbGlhc2VkX01hY3JvcyBIQUwgU1BJIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yDQotICogbGVnYWN5IHB1cnBvc2UNCi0gKiBAew0KLSAqLw0KLQ0KLSNkZWZpbmUgX19IQUxfU1BJXzFMSU5FX1RYIFNQSV8xTElORV9UWA0KLSNkZWZpbmUgX19IQUxfU1BJXzFMSU5FX1JYIFNQSV8xTElORV9SWA0KLSNkZWZpbmUgX19IQUxfU1BJX1JFU0VUX0NSQyBTUElfUkVTRVRfQ1JDDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEhBTF9VQVJUX0FsaWFzZWRfTWFjcm9zIEhBTCBVQVJUIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yDQotICogbGVnYWN5IHB1cnBvc2UNCi0gKiBAew0KLSAqLw0KLQ0KLSNkZWZpbmUgX19IQUxfVUFSVF9HRVRDTE9DS1NPVVJDRSBVQVJUX0dFVENMT0NLU09VUkNFDQotI2RlZmluZSBfX0hBTF9VQVJUX01BU0tfQ09NUFVUQVRJT04gVUFSVF9NQVNLX0NPTVBVVEFUSU9ODQotI2RlZmluZSBfX1VBUlRfR0VUQ0xPQ0tTT1VSQ0UgVUFSVF9HRVRDTE9DS1NPVVJDRQ0KLSNkZWZpbmUgX19VQVJUX01BU0tfQ09NUFVUQVRJT04gVUFSVF9NQVNLX0NPTVBVVEFUSU9ODQotDQotI2RlZmluZSBJU19VQVJUX1dBS0VVUE1FVEhPREUgSVNfVUFSVF9XQUtFVVBNRVRIT0QNCi0NCi0jZGVmaW5lIElTX1VBUlRfT05FQklUX1NBTVBMRSBJU19VQVJUX09ORV9CSVRfU0FNUExFDQotI2RlZmluZSBJU19VQVJUX09ORUJJVF9TQU1QTElORyBJU19VQVJUX09ORV9CSVRfU0FNUExFDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEhBTF9VU0FSVF9BbGlhc2VkX01hY3JvcyBIQUwgVVNBUlQgQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3INCi0gKiBsZWdhY3kgcHVycG9zZQ0KLSAqIEB7DQotICovDQotDQotI2RlZmluZSBfX1VTQVJUX0VOQUJMRV9JVCBfX0hBTF9VU0FSVF9FTkFCTEVfSVQNCi0jZGVmaW5lIF9fVVNBUlRfRElTQUJMRV9JVCBfX0hBTF9VU0FSVF9ESVNBQkxFX0lUDQotI2RlZmluZSBfX1VTQVJUX0VOQUJMRSBfX0hBTF9VU0FSVF9FTkFCTEUNCi0jZGVmaW5lIF9fVVNBUlRfRElTQUJMRSBfX0hBTF9VU0FSVF9ESVNBQkxFDQotDQotI2RlZmluZSBfX0hBTF9VU0FSVF9HRVRDTE9DS1NPVVJDRSBVU0FSVF9HRVRDTE9DS1NPVVJDRQ0KLSNkZWZpbmUgX19VU0FSVF9HRVRDTE9DS1NPVVJDRSBVU0FSVF9HRVRDTE9DS1NPVVJDRQ0KLQ0KLSNpZiBkZWZpbmVkKFNUTTMyRjApIHx8IGRlZmluZWQoU1RNMzJGMykgfHwgZGVmaW5lZChTVE0zMkY3KQ0KLSNkZWZpbmUgVVNBUlRfT1ZFUlNBTVBMSU5HXzE2IDB4MDAwMDAwMDBVDQotI2RlZmluZSBVU0FSVF9PVkVSU0FNUExJTkdfOCBVU0FSVF9DUjFfT1ZFUjgNCi0NCi0jZGVmaW5lIElTX1VTQVJUX09WRVJTQU1QTElORyhfX1NBTVBMSU5HX18pICAgICBcDQotICAoKChfX1NBTVBMSU5HX18pID09IFVTQVJUX09WRVJTQU1QTElOR18xNikgfHwgXA0KLSAgICgoX19TQU1QTElOR19fKSA9PSBVU0FSVF9PVkVSU0FNUExJTkdfOCkpDQotI2VuZGlmIC8qIFNUTTMyRjAgfHwgU1RNMzJGMyB8fCBTVE0zMkY3ICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEhBTF9VU0JfQWxpYXNlZF9NYWNyb3MgSEFMIFVTQiBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvcg0KLSAqIGxlZ2FjeSBwdXJwb3NlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFVTQl9FWFRJX0xJTkVfV0FLRVVQIFVTQl9XQUtFVVBfRVhUSV9MSU5FDQotDQotI2RlZmluZSBVU0JfRlNfRVhUSV9UUklHR0VSX1JJU0lOR19FREdFIFVTQl9PVEdfRlNfV0FLRVVQX0VYVElfUklTSU5HX0VER0UNCi0jZGVmaW5lIFVTQl9GU19FWFRJX1RSSUdHRVJfRkFMTElOR19FREdFIFVTQl9PVEdfRlNfV0FLRVVQX0VYVElfRkFMTElOR19FREdFDQotI2RlZmluZSBVU0JfRlNfRVhUSV9UUklHR0VSX0JPVEhfRURHRSBVU0JfT1RHX0ZTX1dBS0VVUF9FWFRJX1JJU0lOR19GQUxMSU5HX0VER0UNCi0jZGVmaW5lIFVTQl9GU19FWFRJX0xJTkVfV0FLRVVQIFVTQl9PVEdfRlNfV0FLRVVQX0VYVElfTElORQ0KLQ0KLSNkZWZpbmUgVVNCX0hTX0VYVElfVFJJR0dFUl9SSVNJTkdfRURHRSBVU0JfT1RHX0hTX1dBS0VVUF9FWFRJX1JJU0lOR19FREdFDQotI2RlZmluZSBVU0JfSFNfRVhUSV9UUklHR0VSX0ZBTExJTkdfRURHRSBVU0JfT1RHX0hTX1dBS0VVUF9FWFRJX0ZBTExJTkdfRURHRQ0KLSNkZWZpbmUgVVNCX0hTX0VYVElfVFJJR0dFUl9CT1RIX0VER0UgVVNCX09UR19IU19XQUtFVVBfRVhUSV9SSVNJTkdfRkFMTElOR19FREdFDQotI2RlZmluZSBVU0JfSFNfRVhUSV9MSU5FX1dBS0VVUCBVU0JfT1RHX0hTX1dBS0VVUF9FWFRJX0xJTkUNCi0NCi0jZGVmaW5lIF9fSEFMX1VTQl9FWFRJX0VOQUJMRV9JVCBfX0hBTF9VU0JfV0FLRVVQX0VYVElfRU5BQkxFX0lUDQotI2RlZmluZSBfX0hBTF9VU0JfRVhUSV9ESVNBQkxFX0lUIF9fSEFMX1VTQl9XQUtFVVBfRVhUSV9ESVNBQkxFX0lUDQotI2RlZmluZSBfX0hBTF9VU0JfRVhUSV9HRVRfRkxBRyBfX0hBTF9VU0JfV0FLRVVQX0VYVElfR0VUX0ZMQUcNCi0jZGVmaW5lIF9fSEFMX1VTQl9FWFRJX0NMRUFSX0ZMQUcgX19IQUxfVVNCX1dBS0VVUF9FWFRJX0NMRUFSX0ZMQUcNCi0jZGVmaW5lIF9fSEFMX1VTQl9FWFRJX1NFVF9SSVNJTkdfRURHRV9UUklHR0VSIFwNCi0gIF9fSEFMX1VTQl9XQUtFVVBfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UNCi0jZGVmaW5lIF9fSEFMX1VTQl9FWFRJX1NFVF9GQUxMSU5HX0VER0VfVFJJR0dFUiBcDQotICBfX0hBTF9VU0JfV0FLRVVQX0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRQ0KLSNkZWZpbmUgX19IQUxfVVNCX0VYVElfU0VUX0ZBTExJTkdSSVNJTkdfVFJJR0dFUiBcDQotICBfX0hBTF9VU0JfV0FLRVVQX0VYVElfRU5BQkxFX1JJU0lOR19GQUxMSU5HX0VER0UNCi0NCi0jZGVmaW5lIF9fSEFMX1VTQl9GU19FWFRJX0VOQUJMRV9JVCBfX0hBTF9VU0JfT1RHX0ZTX1dBS0VVUF9FWFRJX0VOQUJMRV9JVA0KLSNkZWZpbmUgX19IQUxfVVNCX0ZTX0VYVElfRElTQUJMRV9JVCBfX0hBTF9VU0JfT1RHX0ZTX1dBS0VVUF9FWFRJX0RJU0FCTEVfSVQNCi0jZGVmaW5lIF9fSEFMX1VTQl9GU19FWFRJX0dFVF9GTEFHIF9fSEFMX1VTQl9PVEdfRlNfV0FLRVVQX0VYVElfR0VUX0ZMQUcNCi0jZGVmaW5lIF9fSEFMX1VTQl9GU19FWFRJX0NMRUFSX0ZMQUcgX19IQUxfVVNCX09UR19GU19XQUtFVVBfRVhUSV9DTEVBUl9GTEFHDQotI2RlZmluZSBfX0hBTF9VU0JfRlNfRVhUSV9TRVRfUklTSU5HX0VHREVfVFJJR0dFUiBcDQotICBfX0hBTF9VU0JfT1RHX0ZTX1dBS0VVUF9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRQ0KLSNkZWZpbmUgX19IQUxfVVNCX0ZTX0VYVElfU0VUX0ZBTExJTkdfRUdERV9UUklHR0VSIFwNCi0gIF9fSEFMX1VTQl9PVEdfRlNfV0FLRVVQX0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRQ0KLSNkZWZpbmUgX19IQUxfVVNCX0ZTX0VYVElfU0VUX0ZBTExJTkdSSVNJTkdfVFJJR0dFUiBcDQotICBfX0hBTF9VU0JfT1RHX0ZTX1dBS0VVUF9FWFRJX0VOQUJMRV9SSVNJTkdfRkFMTElOR19FREdFDQotI2RlZmluZSBfX0hBTF9VU0JfRlNfRVhUSV9HRU5FUkFURV9TV0lUIFwNCi0gIF9fSEFMX1VTQl9PVEdfRlNfV0FLRVVQX0VYVElfR0VORVJBVEVfU1dJVA0KLQ0KLSNkZWZpbmUgX19IQUxfVVNCX0hTX0VYVElfRU5BQkxFX0lUIF9fSEFMX1VTQl9PVEdfSFNfV0FLRVVQX0VYVElfRU5BQkxFX0lUDQotI2RlZmluZSBfX0hBTF9VU0JfSFNfRVhUSV9ESVNBQkxFX0lUIF9fSEFMX1VTQl9PVEdfSFNfV0FLRVVQX0VYVElfRElTQUJMRV9JVA0KLSNkZWZpbmUgX19IQUxfVVNCX0hTX0VYVElfR0VUX0ZMQUcgX19IQUxfVVNCX09UR19IU19XQUtFVVBfRVhUSV9HRVRfRkxBRw0KLSNkZWZpbmUgX19IQUxfVVNCX0hTX0VYVElfQ0xFQVJfRkxBRyBfX0hBTF9VU0JfT1RHX0hTX1dBS0VVUF9FWFRJX0NMRUFSX0ZMQUcNCi0jZGVmaW5lIF9fSEFMX1VTQl9IU19FWFRJX1NFVF9SSVNJTkdfRUdERV9UUklHR0VSIFwNCi0gIF9fSEFMX1VTQl9PVEdfSFNfV0FLRVVQX0VYVElfRU5BQkxFX1JJU0lOR19FREdFDQotI2RlZmluZSBfX0hBTF9VU0JfSFNfRVhUSV9TRVRfRkFMTElOR19FR0RFX1RSSUdHRVIgXA0KLSAgX19IQUxfVVNCX09UR19IU19XQUtFVVBfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFDQotI2RlZmluZSBfX0hBTF9VU0JfSFNfRVhUSV9TRVRfRkFMTElOR1JJU0lOR19UUklHR0VSIFwNCi0gIF9fSEFMX1VTQl9PVEdfSFNfV0FLRVVQX0VYVElfRU5BQkxFX1JJU0lOR19GQUxMSU5HX0VER0UNCi0jZGVmaW5lIF9fSEFMX1VTQl9IU19FWFRJX0dFTkVSQVRFX1NXSVQgXA0KLSAgX19IQUxfVVNCX09UR19IU19XQUtFVVBfRVhUSV9HRU5FUkFURV9TV0lUDQotDQotI2RlZmluZSBIQUxfUENEX0FjdGl2ZVJlbW90ZVdha2V1cCBIQUxfUENEX0FjdGl2YXRlUmVtb3RlV2FrZXVwDQotI2RlZmluZSBIQUxfUENEX0RlQWN0aXZlUmVtb3RlV2FrZXVwIEhBTF9QQ0RfRGVBY3RpdmF0ZVJlbW90ZVdha2V1cA0KLQ0KLSNkZWZpbmUgSEFMX1BDRF9TZXRUeEZpRm8gSEFMX1BDREV4X1NldFR4RmlGbw0KLSNkZWZpbmUgSEFMX1BDRF9TZXRSeEZpRm8gSEFMX1BDREV4X1NldFJ4RmlGbw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBIQUxfVElNX0FsaWFzZWRfTWFjcm9zIEhBTCBUSU0gQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3INCi0gKiBsZWdhY3kgcHVycG9zZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBfX0hBTF9USU1fU2V0SUNQcmVzY2FsZXJWYWx1ZSBUSU1fU0VUX0lDUFJFU0NBTEVSVkFMVUUNCi0jZGVmaW5lIF9fSEFMX1RJTV9SZXNldElDUHJlc2NhbGVyVmFsdWUgVElNX1JFU0VUX0lDUFJFU0NBTEVSVkFMVUUNCi0NCi0jZGVmaW5lIFRJTV9HRVRfSVRTVEFUVVMgX19IQUxfVElNX0dFVF9JVF9TT1VSQ0UNCi0jZGVmaW5lIFRJTV9HRVRfQ0xFQVJfSVQgX19IQUxfVElNX0NMRUFSX0lUDQotDQotI2RlZmluZSBfX0hBTF9USU1fR0VUX0lUU1RBVFVTIF9fSEFMX1RJTV9HRVRfSVRfU09VUkNFDQotDQotI2RlZmluZSBfX0hBTF9USU1fRElSRUNUSU9OX1NUQVRVUyBfX0hBTF9USU1fSVNfVElNX0NPVU5USU5HX0RPV04NCi0jZGVmaW5lIF9fSEFMX1RJTV9QUkVTQ0FMRVIgX19IQUxfVElNX1NFVF9QUkVTQ0FMRVINCi0jZGVmaW5lIF9fSEFMX1RJTV9TZXRDb3VudGVyIF9fSEFMX1RJTV9TRVRfQ09VTlRFUg0KLSNkZWZpbmUgX19IQUxfVElNX0dldENvdW50ZXIgX19IQUxfVElNX0dFVF9DT1VOVEVSDQotI2RlZmluZSBfX0hBTF9USU1fU2V0QXV0b3JlbG9hZCBfX0hBTF9USU1fU0VUX0FVVE9SRUxPQUQNCi0jZGVmaW5lIF9fSEFMX1RJTV9HZXRBdXRvcmVsb2FkIF9fSEFMX1RJTV9HRVRfQVVUT1JFTE9BRA0KLSNkZWZpbmUgX19IQUxfVElNX1NldENsb2NrRGl2aXNpb24gX19IQUxfVElNX1NFVF9DTE9DS0RJVklTSU9ODQotI2RlZmluZSBfX0hBTF9USU1fR2V0Q2xvY2tEaXZpc2lvbiBfX0hBTF9USU1fR0VUX0NMT0NLRElWSVNJT04NCi0jZGVmaW5lIF9fSEFMX1RJTV9TZXRJQ1ByZXNjYWxlciBfX0hBTF9USU1fU0VUX0lDUFJFU0NBTEVSDQotI2RlZmluZSBfX0hBTF9USU1fR2V0SUNQcmVzY2FsZXIgX19IQUxfVElNX0dFVF9JQ1BSRVNDQUxFUg0KLSNkZWZpbmUgX19IQUxfVElNX1NldENvbXBhcmUgX19IQUxfVElNX1NFVF9DT01QQVJFDQotI2RlZmluZSBfX0hBTF9USU1fR2V0Q29tcGFyZSBfX0hBTF9USU1fR0VUX0NPTVBBUkUNCi0NCi0jZGVmaW5lIFRJTV9CUkVBS0lOUFVUU09VUkNFX0RGU0RNIFRJTV9CUkVBS0lOUFVUU09VUkNFX0RGU0RNMQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBIQUxfRVRIX0FsaWFzZWRfTWFjcm9zIEhBTCBFVEggQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3INCi0gKiBsZWdhY3kgcHVycG9zZQ0KLSAqIEB7DQotICovDQotDQotI2RlZmluZSBfX0hBTF9FVEhfRVhUSV9FTkFCTEVfSVQgX19IQUxfRVRIX1dBS0VVUF9FWFRJX0VOQUJMRV9JVA0KLSNkZWZpbmUgX19IQUxfRVRIX0VYVElfRElTQUJMRV9JVCBfX0hBTF9FVEhfV0FLRVVQX0VYVElfRElTQUJMRV9JVA0KLSNkZWZpbmUgX19IQUxfRVRIX0VYVElfR0VUX0ZMQUcgX19IQUxfRVRIX1dBS0VVUF9FWFRJX0dFVF9GTEFHDQotI2RlZmluZSBfX0hBTF9FVEhfRVhUSV9DTEVBUl9GTEFHIF9fSEFMX0VUSF9XQUtFVVBfRVhUSV9DTEVBUl9GTEFHDQotI2RlZmluZSBfX0hBTF9FVEhfRVhUSV9TRVRfUklTSU5HX0VHREVfVFJJR0dFUiBcDQotICBfX0hBTF9FVEhfV0FLRVVQX0VYVElfRU5BQkxFX1JJU0lOR19FREdFX1RSSUdHRVINCi0jZGVmaW5lIF9fSEFMX0VUSF9FWFRJX1NFVF9GQUxMSU5HX0VHREVfVFJJR0dFUiBcDQotICBfX0hBTF9FVEhfV0FLRVVQX0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRV9UUklHR0VSDQotI2RlZmluZSBfX0hBTF9FVEhfRVhUSV9TRVRfRkFMTElOR1JJU0lOR19UUklHR0VSIFwNCi0gIF9fSEFMX0VUSF9XQUtFVVBfRVhUSV9FTkFCTEVfRkFMTElOR1JJU0lOR19UUklHR0VSDQotDQotI2RlZmluZSBFVEhfUFJPTUlTQ0lPVVNNT0RFX0VOQUJMRSBFVEhfUFJPTUlTQ1VPVVNfTU9ERV9FTkFCTEUNCi0jZGVmaW5lIEVUSF9QUk9NSVNDSU9VU01PREVfRElTQUJMRSBFVEhfUFJPTUlTQ1VPVVNfTU9ERV9ESVNBQkxFDQotI2RlZmluZSBJU19FVEhfUFJPTUlTQ0lPVVNfTU9ERSBJU19FVEhfUFJPTUlTQ1VPVVNfTU9ERQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBIQUxfTFREQ19BbGlhc2VkX01hY3JvcyBIQUwgTFREQyBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvcg0KLSAqIGxlZ2FjeSBwdXJwb3NlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX0xURENfTEFZRVIgTFREQ19MQVlFUg0KLSNkZWZpbmUgX19IQUxfTFREQ19SRUxPQURfQ09ORklHIF9fSEFMX0xURENfUkVMT0FEX0lNTUVESUFURV9DT05GSUcNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgSEFMX1NBSV9BbGlhc2VkX01hY3JvcyBIQUwgU0FJIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yDQotICogbGVnYWN5IHB1cnBvc2UNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgU0FJX09VVFBVVERSSVZFX0RJU0FCTEVEIFNBSV9PVVRQVVREUklWRV9ESVNBQkxFDQotI2RlZmluZSBTQUlfT1VUUFVURFJJVkVfRU5BQkxFRCBTQUlfT1VUUFVURFJJVkVfRU5BQkxFDQotI2RlZmluZSBTQUlfTUFTVEVSRElWSURFUl9FTkFCTEVEIFNBSV9NQVNURVJESVZJREVSX0VOQUJMRQ0KLSNkZWZpbmUgU0FJX01BU1RFUkRJVklERVJfRElTQUJMRUQgU0FJX01BU1RFUkRJVklERVJfRElTQUJMRQ0KLSNkZWZpbmUgU0FJX1NUUkVPTU9ERSBTQUlfU1RFUkVPTU9ERQ0KLSNkZWZpbmUgU0FJX0ZJRk9TdGF0dXNfRW1wdHkgU0FJX0ZJRk9TVEFUVVNfRU1QVFkNCi0jZGVmaW5lIFNBSV9GSUZPU3RhdHVzX0xlc3MxUXVhcnRlckZ1bGwgU0FJX0ZJRk9TVEFUVVNfTEVTUzFRVUFSVEVSRlVMTA0KLSNkZWZpbmUgU0FJX0ZJRk9TdGF0dXNfMVF1YXJ0ZXJGdWxsIFNBSV9GSUZPU1RBVFVTXzFRVUFSVEVSRlVMTA0KLSNkZWZpbmUgU0FJX0ZJRk9TdGF0dXNfSGFsZkZ1bGwgU0FJX0ZJRk9TVEFUVVNfSEFMRkZVTEwNCi0jZGVmaW5lIFNBSV9GSUZPU3RhdHVzXzNRdWFydGVyc0Z1bGwgU0FJX0ZJRk9TVEFUVVNfM1FVQVJURVJGVUxMDQotI2RlZmluZSBTQUlfRklGT1N0YXR1c19GdWxsIFNBSV9GSUZPU1RBVFVTX0ZVTEwNCi0jZGVmaW5lIElTX1NBSV9CTE9DS19NT05PX1NUUkVPX01PREUgSVNfU0FJX0JMT0NLX01PTk9fU1RFUkVPX01PREUNCi0jZGVmaW5lIFNBSV9TWU5DSFJPTk9VU19FWFQgU0FJX1NZTkNIUk9OT1VTX0VYVF9TQUkxDQotI2RlZmluZSBTQUlfU1lOQ0VYVF9JTl9FTkFCTEUgU0FJX1NZTkNFWFRfT1VUQkxPQ0tBX0VOQUJMRQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBIQUxfU1BESUZSWF9BbGlhc2VkX01hY3JvcyBIQUwgU1BESUZSWCBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkDQotICogZm9yIGxlZ2FjeSBwdXJwb3NlDQotICogQHsNCi0gKi8NCi0jaWYgZGVmaW5lZChTVE0zMkg3KQ0KLSNkZWZpbmUgSEFMX1NQRElGUlhfUmVjZWl2ZUNvbnRyb2xGbG93IEhBTF9TUERJRlJYX1JlY2VpdmVDdHJsRmxvdw0KLSNkZWZpbmUgSEFMX1NQRElGUlhfUmVjZWl2ZUNvbnRyb2xGbG93X0lUIEhBTF9TUERJRlJYX1JlY2VpdmVDdHJsRmxvd19JVA0KLSNkZWZpbmUgSEFMX1NQRElGUlhfUmVjZWl2ZUNvbnRyb2xGbG93X0RNQSBIQUxfU1BESUZSWF9SZWNlaXZlQ3RybEZsb3dfRE1BDQotI2VuZGlmDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEhBTF9IUlRJTV9BbGlhc2VkX0Z1bmN0aW9ucyBIQUwgSFJUSU0gQWxpYXNlZCBGdW5jdGlvbnMgbWFpbnRhaW5lZA0KLSAqIGZvciBsZWdhY3kgcHVycG9zZQ0KLSAqIEB7DQotICovDQotI2lmIGRlZmluZWQoU1RNMzJINykgfHwgZGVmaW5lZChTVE0zMkc0KSB8fCBkZWZpbmVkKFNUTTMyRjMpDQotI2RlZmluZSBIQUxfSFJUSU1fV2F2ZWZvcm1Db3VudGVyU3RhcnRfSVQgSEFMX0hSVElNX1dhdmVmb3JtQ291bnRTdGFydF9JVA0KLSNkZWZpbmUgSEFMX0hSVElNX1dhdmVmb3JtQ291bnRlclN0YXJ0X0RNQSBIQUxfSFJUSU1fV2F2ZWZvcm1Db3VudFN0YXJ0X0RNQQ0KLSNkZWZpbmUgSEFMX0hSVElNX1dhdmVmb3JtQ291bnRlclN0YXJ0IEhBTF9IUlRJTV9XYXZlZm9ybUNvdW50U3RhcnQNCi0jZGVmaW5lIEhBTF9IUlRJTV9XYXZlZm9ybUNvdW50ZXJTdG9wX0lUIEhBTF9IUlRJTV9XYXZlZm9ybUNvdW50U3RvcF9JVA0KLSNkZWZpbmUgSEFMX0hSVElNX1dhdmVmb3JtQ291bnRlclN0b3BfRE1BIEhBTF9IUlRJTV9XYXZlZm9ybUNvdW50U3RvcF9ETUENCi0jZGVmaW5lIEhBTF9IUlRJTV9XYXZlZm9ybUNvdW50ZXJTdG9wIEhBTF9IUlRJTV9XYXZlZm9ybUNvdW50U3RvcA0KLSNlbmRpZg0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBIQUxfUVNQSV9BbGlhc2VkX01hY3JvcyBIQUwgUVNQSSBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvcg0KLSAqIGxlZ2FjeSBwdXJwb3NlDQotICogQHsNCi0gKi8NCi0jaWYgZGVmaW5lZChTVE0zMkw0KSB8fCBkZWZpbmVkKFNUTTMyRjQpIHx8IGRlZmluZWQoU1RNMzJGNykgfHwgZGVmaW5lZChTVE0zMkg3KQ0KLSNkZWZpbmUgSEFMX1FQU0lfVElNRU9VVF9ERUZBVUxUX1ZBTFVFIEhBTF9RU1BJX1RJTUVPVVRfREVGQVVMVF9WQUxVRQ0KLSNlbmRpZiAvKiBTVE0zMkw0IHx8IFNUTTMyRjQgfHwgU1RNMzJGNyAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBIQUxfR2VuZXJpY19BbGlhc2VkX01hY3JvcyBIQUwgR2VuZXJpYyBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkDQotICogZm9yIGxlZ2FjeSBwdXJwb3NlDQotICogQHsNCi0gKi8NCi0jaWYgZGVmaW5lZChTVE0zMkY3KQ0KLSNkZWZpbmUgQVJUX0FDQ0xFUkFUT1JfRU5BQkxFIEFSVF9BQ0NFTEVSQVRPUl9FTkFCTEUNCi0jZW5kaWYgLyogU1RNMzJGNyAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBIQUxfUFBQX0FsaWFzZWRfTWFjcm9zIEhBTCBQUFAgQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3INCi0gKiBsZWdhY3kgcHVycG9zZQ0KLSAqIEB7DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0jaWZkZWYgX19jcGx1c3BsdXMNCi19DQotI2VuZGlmDQotDQotI2VuZGlmIC8qIFNUTTMyX0hBTF9MRUdBQ1kgKi8NCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBmaWxlICAgIHN0bTMyX2hhbF9sZWdhY3kuaAorICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAqIEBicmllZiAgIFRoaXMgZmlsZSBjb250YWlucyBhbGlhc2VzIGRlZmluaXRpb24gZm9yIHRoZSBTVE0zMkN1YmUgSEFMCisgKmNvbnN0YW50cyBtYWNyb3MgYW5kIGZ1bmN0aW9ucyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBhdHRlbnRpb24KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMjEgU1RNaWNyb2VsZWN0cm9uaWNzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRlcm1zIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUKKyAqIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4KKyAqIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcyB3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMl9IQUxfTEVHQUNZCisjZGVmaW5lIFNUTTMyX0hBTF9MRUdBQ1kKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0FFU19BbGlhc2VkX0RlZmluZXMgSEFMIENSWVAgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yCisgKiBsZWdhY3kgcHVycG9zZQorICogQHsKKyAqLworI2RlZmluZSBBRVNfRkxBR19SREVSUiBDUllQX0ZMQUdfUkRFUlIKKyNkZWZpbmUgQUVTX0ZMQUdfV1JFUlIgQ1JZUF9GTEFHX1dSRVJSCisjZGVmaW5lIEFFU19DTEVBUkZMQUdfQ0NGIENSWVBfQ0xFQVJGTEFHX0NDRgorI2RlZmluZSBBRVNfQ0xFQVJGTEFHX1JERVJSIENSWVBfQ0xFQVJGTEFHX1JERVJSCisjZGVmaW5lIEFFU19DTEVBUkZMQUdfV1JFUlIgQ1JZUF9DTEVBUkZMQUdfV1JFUlIKKyNpZiBkZWZpbmVkKFNUTTMySDcpIHx8IGRlZmluZWQoU1RNMzJNUDEpCisjZGVmaW5lIENSWVBfREFUQVRZUEVfMzJCIENSWVBfTk9fU1dBUAorI2RlZmluZSBDUllQX0RBVEFUWVBFXzE2QiBDUllQX0hBTEZXT1JEX1NXQVAKKyNkZWZpbmUgQ1JZUF9EQVRBVFlQRV84QiBDUllQX0JZVEVfU1dBUAorI2RlZmluZSBDUllQX0RBVEFUWVBFXzFCIENSWVBfQklUX1NXQVAKKyNlbmRpZiAvKiBTVE0zMkg3IHx8IFNUTTMyTVAxICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBIQUxfQURDX0FsaWFzZWRfRGVmaW5lcyBIQUwgQURDIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvcgorICogbGVnYWN5IHB1cnBvc2UKKyAqIEB7CisgKi8KKyNkZWZpbmUgQURDX1JFU09MVVRJT04xMmIgQURDX1JFU09MVVRJT05fMTJCCisjZGVmaW5lIEFEQ19SRVNPTFVUSU9OMTBiIEFEQ19SRVNPTFVUSU9OXzEwQgorI2RlZmluZSBBRENfUkVTT0xVVElPTjhiIEFEQ19SRVNPTFVUSU9OXzhCCisjZGVmaW5lIEFEQ19SRVNPTFVUSU9ONmIgQURDX1JFU09MVVRJT05fNkIKKyNkZWZpbmUgT1ZSX0RBVEFfT1ZFUldSSVRURU4gQURDX09WUl9EQVRBX09WRVJXUklUVEVOCisjZGVmaW5lIE9WUl9EQVRBX1BSRVNFUlZFRCBBRENfT1ZSX0RBVEFfUFJFU0VSVkVECisjZGVmaW5lIEVPQ19TSU5HTEVfQ09OViBBRENfRU9DX1NJTkdMRV9DT05WCisjZGVmaW5lIEVPQ19TRVFfQ09OViBBRENfRU9DX1NFUV9DT05WCisjZGVmaW5lIEVPQ19TSU5HTEVfU0VRX0NPTlYgQURDX0VPQ19TSU5HTEVfU0VRX0NPTlYKKyNkZWZpbmUgUkVHVUxBUl9HUk9VUCBBRENfUkVHVUxBUl9HUk9VUAorI2RlZmluZSBJTkpFQ1RFRF9HUk9VUCBBRENfSU5KRUNURURfR1JPVVAKKyNkZWZpbmUgUkVHVUxBUl9JTkpFQ1RFRF9HUk9VUCBBRENfUkVHVUxBUl9JTkpFQ1RFRF9HUk9VUAorI2RlZmluZSBBV0RfRVZFTlQgQURDX0FXRF9FVkVOVAorI2RlZmluZSBBV0QxX0VWRU5UIEFEQ19BV0QxX0VWRU5UCisjZGVmaW5lIEFXRDJfRVZFTlQgQURDX0FXRDJfRVZFTlQKKyNkZWZpbmUgQVdEM19FVkVOVCBBRENfQVdEM19FVkVOVAorI2RlZmluZSBPVlJfRVZFTlQgQURDX09WUl9FVkVOVAorI2RlZmluZSBKUU9WRl9FVkVOVCBBRENfSlFPVkZfRVZFTlQKKyNkZWZpbmUgQUxMX0NIQU5ORUxTIEFEQ19BTExfQ0hBTk5FTFMKKyNkZWZpbmUgUkVHVUxBUl9DSEFOTkVMUyBBRENfUkVHVUxBUl9DSEFOTkVMUworI2RlZmluZSBJTkpFQ1RFRF9DSEFOTkVMUyBBRENfSU5KRUNURURfQ0hBTk5FTFMKKyNkZWZpbmUgU1lTQ0ZHX0ZMQUdfU0VOU09SX0FEQyBBRENfRkxBR19TRU5TT1IKKyNkZWZpbmUgU1lTQ0ZHX0ZMQUdfVlJFRl9BREMgQURDX0ZMQUdfVlJFRklOVAorI2RlZmluZSBBRENfQ0xPQ0tQUkVTQ0FMRVJfUENMS19ESVYxIEFEQ19DTE9DS19TWU5DX1BDTEtfRElWMQorI2RlZmluZSBBRENfQ0xPQ0tQUkVTQ0FMRVJfUENMS19ESVYyIEFEQ19DTE9DS19TWU5DX1BDTEtfRElWMgorI2RlZmluZSBBRENfQ0xPQ0tQUkVTQ0FMRVJfUENMS19ESVY0IEFEQ19DTE9DS19TWU5DX1BDTEtfRElWNAorI2RlZmluZSBBRENfQ0xPQ0tQUkVTQ0FMRVJfUENMS19ESVY2IEFEQ19DTE9DS19TWU5DX1BDTEtfRElWNgorI2RlZmluZSBBRENfQ0xPQ0tQUkVTQ0FMRVJfUENMS19ESVY4IEFEQ19DTE9DS19TWU5DX1BDTEtfRElWOAorI2RlZmluZSBBRENfRVhURVJOQUxUUklHMF9UNl9UUkdPIEFEQ19FWFRFUk5BTFRSSUdDT05WX1Q2X1RSR08KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJRzFfVDIxX0NDMiBBRENfRVhURVJOQUxUUklHQ09OVl9UMjFfQ0MyCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUcyX1QyX1RSR08gQURDX0VYVEVSTkFMVFJJR0NPTlZfVDJfVFJHTworI2RlZmluZSBBRENfRVhURVJOQUxUUklHM19UMl9DQzQgQURDX0VYVEVSTkFMVFJJR0NPTlZfVDJfQ0M0CisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUc0X1QyMl9UUkdPIEFEQ19FWFRFUk5BTFRSSUdDT05WX1QyMl9UUkdPCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUc3X0VYVF9JVDExIEFEQ19FWFRFUk5BTFRSSUdDT05WX0VYVF9JVDExCisjZGVmaW5lIEFEQ19DTE9DS19BU1lOQyBBRENfQ0xPQ0tfQVNZTkNfRElWMQorI2RlZmluZSBBRENfRVhURVJOQUxUUklHX0VER0VfTk9ORSBBRENfRVhURVJOQUxUUklHQ09OVkVER0VfTk9ORQorI2RlZmluZSBBRENfRVhURVJOQUxUUklHX0VER0VfUklTSU5HIEFEQ19FWFRFUk5BTFRSSUdDT05WRURHRV9SSVNJTkcKKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR19FREdFX0ZBTExJTkcgQURDX0VYVEVSTkFMVFJJR0NPTlZFREdFX0ZBTExJTkcKKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR19FREdFX1JJU0lOR0ZBTExJTkcgXAorICBBRENfRVhURVJOQUxUUklHQ09OVkVER0VfUklTSU5HRkFMTElORworI2RlZmluZSBBRENfU0FNUExFVElNRV8yQ1lDTEVfNSBBRENfU0FNUExFVElNRV8yQ1lDTEVTXzUKKworI2RlZmluZSBIQUxfQURDX1NUQVRFX0JVU1lfUkVHIEhBTF9BRENfU1RBVEVfUkVHX0JVU1kKKyNkZWZpbmUgSEFMX0FEQ19TVEFURV9CVVNZX0lOSiBIQUxfQURDX1NUQVRFX0lOSl9CVVNZCisjZGVmaW5lIEhBTF9BRENfU1RBVEVfRU9DX1JFRyBIQUxfQURDX1NUQVRFX1JFR19FT0MKKyNkZWZpbmUgSEFMX0FEQ19TVEFURV9FT0NfSU5KIEhBTF9BRENfU1RBVEVfSU5KX0VPQworI2RlZmluZSBIQUxfQURDX1NUQVRFX0VSUk9SIEhBTF9BRENfU1RBVEVfRVJST1JfSU5URVJOQUwKKyNkZWZpbmUgSEFMX0FEQ19TVEFURV9CVVNZIEhBTF9BRENfU1RBVEVfQlVTWV9JTlRFUk5BTAorI2RlZmluZSBIQUxfQURDX1NUQVRFX0FXRCBIQUxfQURDX1NUQVRFX0FXRDEKKworI2lmIGRlZmluZWQoU1RNMzJINykKKyNkZWZpbmUgQURDX0NIQU5ORUxfVkJBVF9ESVY0IEFEQ19DSEFOTkVMX1ZCQVQKKyNlbmRpZiAvKiBTVE0zMkg3ICovCisKKyNpZiBkZWZpbmVkKFNUTTMyVTUpCisjZGVmaW5lIEFEQ19TQU1QTEVUSU1FXzVDWUNMRSBBRENfU0FNUExFVElNRV81Q1lDTEVTCisjZGVmaW5lIEFEQ19TQU1QTEVUSU1FXzM5MUNZQ0xFU181IEFEQ19TQU1QTEVUSU1FXzM5MUNZQ0xFUworI2RlZmluZSBBREM0X1NBTVBMRVRJTUVfMTYwQ1lDTEVTXzUgQURDNF9TQU1QTEVUSU1FXzgxNENZQ0xFU181CisjZW5kaWYgLyogU1RNMzJVNSAqLworCisjaWYgZGVmaW5lZChTVE0zMkg1KQorI2RlZmluZSBBRENfQ0hBTk5FTF9WQ09SRSBBRENfQ0hBTk5FTF9WRERDT1JFCisjZW5kaWYgLyogU1RNMzJINSAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0NFQ19BbGlhc2VkX0RlZmluZXMgSEFMIENFQyBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IKKyAqIGxlZ2FjeSBwdXJwb3NlCisgKiBAeworICovCisKKyNkZWZpbmUgX19IQUxfQ0VDX0dFVF9JVCBfX0hBTF9DRUNfR0VUX0ZMQUcKKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0NPTVBfQWxpYXNlZF9EZWZpbmVzIEhBTCBDT01QIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvcgorICogbGVnYWN5IHB1cnBvc2UKKyAqIEB7CisgKi8KKyNkZWZpbmUgQ09NUF9XSU5ET1dNT0RFX0RJU0FCTEVEIENPTVBfV0lORE9XTU9ERV9ESVNBQkxFCisjZGVmaW5lIENPTVBfV0lORE9XTU9ERV9FTkFCTEVEIENPTVBfV0lORE9XTU9ERV9FTkFCTEUKKyNkZWZpbmUgQ09NUF9FWFRJX0xJTkVfQ09NUDFfRVZFTlQgQ09NUF9FWFRJX0xJTkVfQ09NUDEKKyNkZWZpbmUgQ09NUF9FWFRJX0xJTkVfQ09NUDJfRVZFTlQgQ09NUF9FWFRJX0xJTkVfQ09NUDIKKyNkZWZpbmUgQ09NUF9FWFRJX0xJTkVfQ09NUDNfRVZFTlQgQ09NUF9FWFRJX0xJTkVfQ09NUDMKKyNkZWZpbmUgQ09NUF9FWFRJX0xJTkVfQ09NUDRfRVZFTlQgQ09NUF9FWFRJX0xJTkVfQ09NUDQKKyNkZWZpbmUgQ09NUF9FWFRJX0xJTkVfQ09NUDVfRVZFTlQgQ09NUF9FWFRJX0xJTkVfQ09NUDUKKyNkZWZpbmUgQ09NUF9FWFRJX0xJTkVfQ09NUDZfRVZFTlQgQ09NUF9FWFRJX0xJTkVfQ09NUDYKKyNkZWZpbmUgQ09NUF9FWFRJX0xJTkVfQ09NUDdfRVZFTlQgQ09NUF9FWFRJX0xJTkVfQ09NUDcKKyNpZiBkZWZpbmVkKFNUTTMyTDApCisjZGVmaW5lIENPTVBfTFBUSU1DT05ORUNUSU9OX0VOQUJMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKHVpbnQzMl90KTB4MDAwMDAwMDNVKSAvKiE8IENPTVBYIG91dHB1dCBnZW5lcmljIG5hbWluZzogY29ubmVjdGVkIHRvIExQVElNIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCAxIGZvciBDT01QMSwgTFBUSU0gaW5wdXQgMiBmb3IgQ09NUDIgKi8KKyNlbmRpZgorI2RlZmluZSBDT01QX09VVFBVVF9DT01QNlRJTTJPQ1JFRkNMUiBDT01QX09VVFBVVF9DT01QNl9USU0yT0NSRUZDTFIKKyNpZiBkZWZpbmVkKFNUTTMyRjM3M3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM3OHh4KQorI2RlZmluZSBDT01QX09VVFBVVF9USU0zSUMxIENPTVBfT1VUUFVUX0NPTVAxX1RJTTNJQzEKKyNkZWZpbmUgQ09NUF9PVVRQVVRfVElNM09DUkVGQ0xSIENPTVBfT1VUUFVUX0NPTVAxX1RJTTNPQ1JFRkNMUgorI2VuZGlmIC8qIFNUTTMyRjM3M3hDIHx8IFNUTTMyRjM3OHh4ICovCisKKyNpZiBkZWZpbmVkKFNUTTMyTDApIHx8IGRlZmluZWQoU1RNMzJMNCkKKyNkZWZpbmUgQ09NUF9XSU5ET1dNT0RFX0VOQUJMRSBDT01QX1dJTkRPV01PREVfQ09NUDFfSU5QVVRfUExVU19DT01NT04KKworI2RlZmluZSBDT01QX05PTklOVkVSVElOR0lOUFVUX0lPMSBDT01QX0lOUFVUX1BMVVNfSU8xCisjZGVmaW5lIENPTVBfTk9OSU5WRVJUSU5HSU5QVVRfSU8yIENPTVBfSU5QVVRfUExVU19JTzIKKyNkZWZpbmUgQ09NUF9OT05JTlZFUlRJTkdJTlBVVF9JTzMgQ09NUF9JTlBVVF9QTFVTX0lPMworI2RlZmluZSBDT01QX05PTklOVkVSVElOR0lOUFVUX0lPNCBDT01QX0lOUFVUX1BMVVNfSU80CisjZGVmaW5lIENPTVBfTk9OSU5WRVJUSU5HSU5QVVRfSU81IENPTVBfSU5QVVRfUExVU19JTzUKKyNkZWZpbmUgQ09NUF9OT05JTlZFUlRJTkdJTlBVVF9JTzYgQ09NUF9JTlBVVF9QTFVTX0lPNgorCisjZGVmaW5lIENPTVBfSU5WRVJUSU5HSU5QVVRfMV80VlJFRklOVCBDT01QX0lOUFVUX01JTlVTXzFfNFZSRUZJTlQKKyNkZWZpbmUgQ09NUF9JTlZFUlRJTkdJTlBVVF8xXzJWUkVGSU5UIENPTVBfSU5QVVRfTUlOVVNfMV8yVlJFRklOVAorI2RlZmluZSBDT01QX0lOVkVSVElOR0lOUFVUXzNfNFZSRUZJTlQgQ09NUF9JTlBVVF9NSU5VU18zXzRWUkVGSU5UCisjZGVmaW5lIENPTVBfSU5WRVJUSU5HSU5QVVRfVlJFRklOVCBDT01QX0lOUFVUX01JTlVTX1ZSRUZJTlQKKyNkZWZpbmUgQ09NUF9JTlZFUlRJTkdJTlBVVF9EQUMxX0NIMSBDT01QX0lOUFVUX01JTlVTX0RBQzFfQ0gxCisjZGVmaW5lIENPTVBfSU5WRVJUSU5HSU5QVVRfREFDMV9DSDIgQ09NUF9JTlBVVF9NSU5VU19EQUMxX0NIMgorI2RlZmluZSBDT01QX0lOVkVSVElOR0lOUFVUX0RBQzEgQ09NUF9JTlBVVF9NSU5VU19EQUMxX0NIMQorI2RlZmluZSBDT01QX0lOVkVSVElOR0lOUFVUX0RBQzIgQ09NUF9JTlBVVF9NSU5VU19EQUMxX0NIMgorI2RlZmluZSBDT01QX0lOVkVSVElOR0lOUFVUX0lPMSBDT01QX0lOUFVUX01JTlVTX0lPMQorI2lmIGRlZmluZWQoU1RNMzJMMCkKKy8qIElzc3VlIGZpeGVkIG9uIFNUTTMyTDAgQ09NUCBkcml2ZXI6IG9ubHkgMiBkZWRpY2F0ZWQgSU8gKElPMSBhbmQgSU8yKSwgICAgICovCisvKiBJTzIgd2FzIHdyb25nbHkgYXNzaWduZWQgdG8gSU8gc2hhcmVkIHdpdGggREFDIGFuZCBJTzMgd2FzIGNvcnJlc3BvbmRpbmcgICAqLworLyogdG8gdGhlIHNlY29uZCBkZWRpY2F0ZWQgSU8gKG9ubHkgZm9yIENPTVAyKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ09NUF9JTlZFUlRJTkdJTlBVVF9JTzIgQ09NUF9JTlBVVF9NSU5VU19EQUMxX0NIMgorI2RlZmluZSBDT01QX0lOVkVSVElOR0lOUFVUX0lPMyBDT01QX0lOUFVUX01JTlVTX0lPMgorI2Vsc2UKKyNkZWZpbmUgQ09NUF9JTlZFUlRJTkdJTlBVVF9JTzIgQ09NUF9JTlBVVF9NSU5VU19JTzIKKyNkZWZpbmUgQ09NUF9JTlZFUlRJTkdJTlBVVF9JTzMgQ09NUF9JTlBVVF9NSU5VU19JTzMKKyNlbmRpZgorI2RlZmluZSBDT01QX0lOVkVSVElOR0lOUFVUX0lPNCBDT01QX0lOUFVUX01JTlVTX0lPNAorI2RlZmluZSBDT01QX0lOVkVSVElOR0lOUFVUX0lPNSBDT01QX0lOUFVUX01JTlVTX0lPNQorCisjZGVmaW5lIENPTVBfT1VUUFVUTEVWRUxfTE9XIENPTVBfT1VUUFVUX0xFVkVMX0xPVworI2RlZmluZSBDT01QX09VVFBVVExFVkVMX0hJR0ggQ09NUF9PVVRQVVRfTEVWRUxfSElHSAorCisvKiBOb3RlOiBMaXRlcmFsICJDT01QX0ZMQUdfTE9DSyIga2VwdCBmb3IgbGVnYWN5IHB1cnBvc2UuICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgVG8gY2hlY2sgQ09NUCBsb2NrIHN0YXRlLCB1c2UgbWFjcm8gIl9fSEFMX0NPTVBfSVNfTE9DS0VEKCkiLiAgICAgICAgKi8KKyNpZiBkZWZpbmVkKENPTVBfQ1NSX0xPQ0spCisjZGVmaW5lIENPTVBfRkxBR19MT0NLIENPTVBfQ1NSX0xPQ0sKKyNlbGlmIGRlZmluZWQoQ09NUF9DU1JfQ09NUDFMT0NLKQorI2RlZmluZSBDT01QX0ZMQUdfTE9DSyBDT01QX0NTUl9DT01QMUxPQ0sKKyNlbGlmIGRlZmluZWQoQ09NUF9DU1JfQ09NUHhMT0NLKQorI2RlZmluZSBDT01QX0ZMQUdfTE9DSyBDT01QX0NTUl9DT01QeExPQ0sKKyNlbmRpZgorCisjaWYgZGVmaW5lZChTVE0zMkw0KQorI2RlZmluZSBDT01QX0JMQU5LSU5HU1JDRV9USU0xT0M1IENPTVBfQkxBTktJTkdTUkNfVElNMV9PQzVfQ09NUDEKKyNkZWZpbmUgQ09NUF9CTEFOS0lOR1NSQ0VfVElNMk9DMyBDT01QX0JMQU5LSU5HU1JDX1RJTTJfT0MzX0NPTVAxCisjZGVmaW5lIENPTVBfQkxBTktJTkdTUkNFX1RJTTNPQzMgQ09NUF9CTEFOS0lOR1NSQ19USU0zX09DM19DT01QMQorI2RlZmluZSBDT01QX0JMQU5LSU5HU1JDRV9USU0zT0M0IENPTVBfQkxBTktJTkdTUkNfVElNM19PQzRfQ09NUDIKKyNkZWZpbmUgQ09NUF9CTEFOS0lOR1NSQ0VfVElNOE9DNSBDT01QX0JMQU5LSU5HU1JDX1RJTThfT0M1X0NPTVAyCisjZGVmaW5lIENPTVBfQkxBTktJTkdTUkNFX1RJTTE1T0MxIENPTVBfQkxBTktJTkdTUkNfVElNMTVfT0MxX0NPTVAyCisjZGVmaW5lIENPTVBfQkxBTktJTkdTUkNFX05PTkUgQ09NUF9CTEFOS0lOR1NSQ19OT05FCisjZW5kaWYKKworI2lmIGRlZmluZWQoU1RNMzJMMCkKKyNkZWZpbmUgQ09NUF9NT0RFX0hJR0hTUEVFRCBDT01QX1BPV0VSTU9ERV9NRURJVU1TUEVFRAorI2RlZmluZSBDT01QX01PREVfTE9XU1BFRUQgQ09NUF9QT1dFUk1PREVfVUxUUkFMT1dQT1dFUgorI2Vsc2UKKyNkZWZpbmUgQ09NUF9NT0RFX0hJR0hTUEVFRCBDT01QX1BPV0VSTU9ERV9ISUdIU1BFRUQKKyNkZWZpbmUgQ09NUF9NT0RFX01FRElVTVNQRUVEIENPTVBfUE9XRVJNT0RFX01FRElVTVNQRUVECisjZGVmaW5lIENPTVBfTU9ERV9MT1dQT1dFUiBDT01QX1BPV0VSTU9ERV9MT1dQT1dFUgorI2RlZmluZSBDT01QX01PREVfVUxUUkFMT1dQT1dFUiBDT01QX1BPV0VSTU9ERV9VTFRSQUxPV1BPV0VSCisjZW5kaWYKKworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFNUTTMyVTUpCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9DTEVBUl9SQVNJTkdfRkxBRyBcCisgIF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9DTEVBUl9SSVNJTkdfRkxBRworI2VuZGlmCisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEhBTF9DT1JURVhfQWxpYXNlZF9EZWZpbmVzIEhBTCBDT1JURVggQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQKKyAqIGZvciBsZWdhY3kgcHVycG9zZQorICogQHsKKyAqLworI2RlZmluZSBfX0hBTF9DT1JURVhfU1lTVElDS0NMS19DT05GSUcgSEFMX1NZU1RJQ0tfQ0xLU291cmNlQ29uZmlnCisjaWYgZGVmaW5lZChTVE0zMlU1KQorI2RlZmluZSBNUFVfREVWSUNFX25HblJuRSBNUFVfREVWSUNFX05HTlJORQorI2RlZmluZSBNUFVfREVWSUNFX25HblJFIE1QVV9ERVZJQ0VfTkdOUkUKKyNkZWZpbmUgTVBVX0RFVklDRV9uR1JFIE1QVV9ERVZJQ0VfTkdSRQorI2VuZGlmIC8qIFNUTTMyVTUgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIENSQ19BbGlhc2VzIENSQyBBUEkgYWxpYXNlcworICogQHsKKyAqLworI2lmIGRlZmluZWQoU1RNMzJINSkgfHwgZGVmaW5lZChTVE0zMkMwKQorI2Vsc2UKKyNkZWZpbmUgSEFMX0NSQ19JbnB1dF9EYXRhX1JldmVyc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEhBTF9DUkNFeF9JbnB1dF9EYXRhX1JldmVyc2UgLyohPCBBbGlhc2VkIHRvIEhBTF9DUkNFeF9JbnB1dF9EYXRhX1JldmVyc2UgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBpbnRlciBTVE0zMiBzZXJpZXMgY29tcGF0aWJpbGl0eSAgKi8KKyNkZWZpbmUgSEFMX0NSQ19PdXRwdXRfRGF0YV9SZXZlcnNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSEFMX0NSQ0V4X091dHB1dF9EYXRhX1JldmVyc2UgLyohPCBBbGlhc2VkIHRvIEhBTF9DUkNFeF9PdXRwdXRfRGF0YV9SZXZlcnNlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGludGVyIFNUTTMyIHNlcmllcyBjb21wYXRpYmlsaXR5ICovCisjZW5kaWYKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEhBTF9DUkNfQWxpYXNlZF9EZWZpbmVzIEhBTCBDUkMgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yCisgKiBsZWdhY3kgcHVycG9zZQorICogQHsKKyAqLworCisjZGVmaW5lIENSQ19PVVRQVVREQVRBX0lOVkVSU0lPTl9ESVNBQkxFRCBDUkNfT1VUUFVUREFUQV9JTlZFUlNJT05fRElTQUJMRQorI2RlZmluZSBDUkNfT1VUUFVUREFUQV9JTlZFUlNJT05fRU5BQkxFRCBDUkNfT1VUUFVUREFUQV9JTlZFUlNJT05fRU5BQkxFCisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEhBTF9EQUNfQWxpYXNlZF9EZWZpbmVzIEhBTCBEQUMgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yCisgKiBsZWdhY3kgcHVycG9zZQorICogQHsKKyAqLworCisjZGVmaW5lIERBQzFfQ0hBTk5FTF8xIERBQ19DSEFOTkVMXzEKKyNkZWZpbmUgREFDMV9DSEFOTkVMXzIgREFDX0NIQU5ORUxfMgorI2RlZmluZSBEQUMyX0NIQU5ORUxfMSBEQUNfQ0hBTk5FTF8xCisjZGVmaW5lIERBQ19XQVZFX05PTkUgMHgwMDAwMDAwMFUKKyNkZWZpbmUgREFDX1dBVkVfTk9JU0UgREFDX0NSX1dBVkUxXzAKKyNkZWZpbmUgREFDX1dBVkVfVFJJQU5HTEUgREFDX0NSX1dBVkUxXzEKKyNkZWZpbmUgREFDX1dBVkVHRU5FUkFUSU9OX05PTkUgREFDX1dBVkVfTk9ORQorI2RlZmluZSBEQUNfV0FWRUdFTkVSQVRJT05fTk9JU0UgREFDX1dBVkVfTk9JU0UKKyNkZWZpbmUgREFDX1dBVkVHRU5FUkFUSU9OX1RSSUFOR0xFIERBQ19XQVZFX1RSSUFOR0xFCisKKyNpZiBkZWZpbmVkKFNUTTMyRzQpIHx8IGRlZmluZWQoU1RNMzJINykgfHwgZGVmaW5lZChTVE0zMlU1KQorI2RlZmluZSBEQUNfQ0hJUENPTk5FQ1RfRElTQUJMRSBEQUNfQ0hJUENPTk5FQ1RfRVhURVJOQUwKKyNkZWZpbmUgREFDX0NISVBDT05ORUNUX0VOQUJMRSBEQUNfQ0hJUENPTk5FQ1RfSU5URVJOQUwKKyNlbmRpZgorCisjaWYgZGVmaW5lZChTVE0zMlU1KQorI2RlZmluZSBEQUNfVFJJR0dFUl9TVE9QX0xQVElNMV9PVVQgREFDX1RSSUdHRVJfU1RPUF9MUFRJTTFfQ0gxCisjZGVmaW5lIERBQ19UUklHR0VSX1NUT1BfTFBUSU0zX09VVCBEQUNfVFJJR0dFUl9TVE9QX0xQVElNM19DSDEKKyNkZWZpbmUgREFDX1RSSUdHRVJfTFBUSU0xX09VVCBEQUNfVFJJR0dFUl9MUFRJTTFfQ0gxCisjZGVmaW5lIERBQ19UUklHR0VSX0xQVElNM19PVVQgREFDX1RSSUdHRVJfTFBUSU0zX0NIMQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFNUTTMySDUpCisjZGVmaW5lIERBQ19UUklHR0VSX0xQVElNMV9PVVQgREFDX1RSSUdHRVJfTFBUSU0xX0NIMQorI2RlZmluZSBEQUNfVFJJR0dFUl9MUFRJTTJfT1VUIERBQ19UUklHR0VSX0xQVElNMl9DSDEKKyNlbmRpZgorCisjaWYgZGVmaW5lZChTVE0zMkwxKSB8fCBkZWZpbmVkKFNUTTMyTDQpIHx8IGRlZmluZWQoU1RNMzJHMCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJMNSkgfHwgZGVmaW5lZChTVE0zMkg3KSB8fCBkZWZpbmVkKFNUTTMyRjQpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRzQpCisjZGVmaW5lIEhBTF9EQUNfTVNQX0lOSVRfQ0JfSUQgSEFMX0RBQ19NU1BJTklUX0NCX0lECisjZGVmaW5lIEhBTF9EQUNfTVNQX0RFSU5JVF9DQl9JRCBIQUxfREFDX01TUERFSU5JVF9DQl9JRAorI2VuZGlmCisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEhBTF9ETUFfQWxpYXNlZF9EZWZpbmVzIEhBTCBETUEgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yCisgKiBsZWdhY3kgcHVycG9zZQorICogQHsKKyAqLworI2RlZmluZSBIQUxfUkVNQVBETUFfQURDX0RNQV9DSDIgRE1BX1JFTUFQX0FEQ19ETUFfQ0gyCisjZGVmaW5lIEhBTF9SRU1BUERNQV9VU0FSVDFfVFhfRE1BX0NINCBETUFfUkVNQVBfVVNBUlQxX1RYX0RNQV9DSDQKKyNkZWZpbmUgSEFMX1JFTUFQRE1BX1VTQVJUMV9SWF9ETUFfQ0g1IERNQV9SRU1BUF9VU0FSVDFfUlhfRE1BX0NINQorI2RlZmluZSBIQUxfUkVNQVBETUFfVElNMTZfRE1BX0NINCBETUFfUkVNQVBfVElNMTZfRE1BX0NINAorI2RlZmluZSBIQUxfUkVNQVBETUFfVElNMTdfRE1BX0NIMiBETUFfUkVNQVBfVElNMTdfRE1BX0NIMgorI2RlZmluZSBIQUxfUkVNQVBETUFfVVNBUlQzX0RNQV9DSDMyIERNQV9SRU1BUF9VU0FSVDNfRE1BX0NIMzIKKyNkZWZpbmUgSEFMX1JFTUFQRE1BX1RJTTE2X0RNQV9DSDYgRE1BX1JFTUFQX1RJTTE2X0RNQV9DSDYKKyNkZWZpbmUgSEFMX1JFTUFQRE1BX1RJTTE3X0RNQV9DSDcgRE1BX1JFTUFQX1RJTTE3X0RNQV9DSDcKKyNkZWZpbmUgSEFMX1JFTUFQRE1BX1NQSTJfRE1BX0NINjcgRE1BX1JFTUFQX1NQSTJfRE1BX0NINjcKKyNkZWZpbmUgSEFMX1JFTUFQRE1BX1VTQVJUMl9ETUFfQ0g2NyBETUFfUkVNQVBfVVNBUlQyX0RNQV9DSDY3CisjZGVmaW5lIEhBTF9SRU1BUERNQV9JMkMxX0RNQV9DSDc2IERNQV9SRU1BUF9JMkMxX0RNQV9DSDc2CisjZGVmaW5lIEhBTF9SRU1BUERNQV9USU0xX0RNQV9DSDYgRE1BX1JFTUFQX1RJTTFfRE1BX0NINgorI2RlZmluZSBIQUxfUkVNQVBETUFfVElNMl9ETUFfQ0g3IERNQV9SRU1BUF9USU0yX0RNQV9DSDcKKyNkZWZpbmUgSEFMX1JFTUFQRE1BX1RJTTNfRE1BX0NINiBETUFfUkVNQVBfVElNM19ETUFfQ0g2CisKKyNkZWZpbmUgSVNfSEFMX1JFTUFQRE1BIElTX0RNQV9SRU1BUAorI2RlZmluZSBfX0hBTF9SRU1BUERNQV9DSEFOTkVMX0VOQUJMRSBfX0hBTF9ETUFfUkVNQVBfQ0hBTk5FTF9FTkFCTEUKKyNkZWZpbmUgX19IQUxfUkVNQVBETUFfQ0hBTk5FTF9ESVNBQkxFIF9fSEFMX0RNQV9SRU1BUF9DSEFOTkVMX0RJU0FCTEUKKworI2lmIGRlZmluZWQoU1RNMzJMNCkKKworI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9FWFRJMCBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEkwCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0VYVEkxIEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTEKKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRVUVTVF9HRU5fRVhUSTIgSEFMX0RNQU1VWDFfUkVRX0dFTl9FWFRJMgorI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9FWFRJMyBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEkzCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0VYVEk0IEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTQKKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRVUVTVF9HRU5fRVhUSTUgSEFMX0RNQU1VWDFfUkVRX0dFTl9FWFRJNQorI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9FWFRJNiBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEk2CisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0VYVEk3IEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTcKKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRVUVTVF9HRU5fRVhUSTggSEFMX0RNQU1VWDFfUkVRX0dFTl9FWFRJOAorI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9FWFRJOSBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEk5CisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0VYVEkxMCBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEkxMAorI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9FWFRJMTEgSEFMX0RNQU1VWDFfUkVRX0dFTl9FWFRJMTEKKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRVUVTVF9HRU5fRVhUSTEyIEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTEyCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0VYVEkxMyBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEkxMworI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9FWFRJMTQgSEFMX0RNQU1VWDFfUkVRX0dFTl9FWFRJMTQKKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRVUVTVF9HRU5fRVhUSTE1IEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTE1CisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0RNQU1VWDFfQ0gwX0VWVCBcCisgIEhBTF9ETUFNVVgxX1JFUV9HRU5fRE1BTVVYMV9DSDBfRVZUCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0RNQU1VWDFfQ0gxX0VWVCBcCisgIEhBTF9ETUFNVVgxX1JFUV9HRU5fRE1BTVVYMV9DSDFfRVZUCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0RNQU1VWDFfQ0gyX0VWVCBcCisgIEhBTF9ETUFNVVgxX1JFUV9HRU5fRE1BTVVYMV9DSDJfRVZUCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0RNQU1VWDFfQ0gzX0VWVCBcCisgIEhBTF9ETUFNVVgxX1JFUV9HRU5fRE1BTVVYMV9DSDNfRVZUCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0xQVElNMV9PVVQgSEFMX0RNQU1VWDFfUkVRX0dFTl9MUFRJTTFfT1VUCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0xQVElNMl9PVVQgSEFMX0RNQU1VWDFfUkVRX0dFTl9MUFRJTTJfT1VUCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0RTSV9URSBIQUxfRE1BTVVYMV9SRVFfR0VOX0RTSV9URQorI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9EU0lfRU9UIEhBTF9ETUFNVVgxX1JFUV9HRU5fRFNJX0VPVAorI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9ETUEyRF9FT1QgSEFMX0RNQU1VWDFfUkVRX0dFTl9ETUEyRF9FT1QKKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRVUVTVF9HRU5fTFREQ19JVCBIQUxfRE1BTVVYMV9SRVFfR0VOX0xURENfSVQKKworI2RlZmluZSBIQUxfRE1BTVVYX1JFUVVFU1RfR0VOX05PX0VWRU5UIEhBTF9ETUFNVVhfUkVRX0dFTl9OT19FVkVOVAorI2RlZmluZSBIQUxfRE1BTVVYX1JFUVVFU1RfR0VOX1JJU0lORyBIQUxfRE1BTVVYX1JFUV9HRU5fUklTSU5HCisjZGVmaW5lIEhBTF9ETUFNVVhfUkVRVUVTVF9HRU5fRkFMTElORyBIQUxfRE1BTVVYX1JFUV9HRU5fRkFMTElORworI2RlZmluZSBIQUxfRE1BTVVYX1JFUVVFU1RfR0VOX1JJU0lOR19GQUxMSU5HIEhBTF9ETUFNVVhfUkVRX0dFTl9SSVNJTkdfRkFMTElORworCisjaWYgZGVmaW5lZChTVE0zMkw0UjV4eCkgfHwgZGVmaW5lZChTVE0zMkw0Ujl4eCkgfHwgZGVmaW5lZChTVE0zMkw0Ujl4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJMNFM1eHgpIHx8IGRlZmluZWQoU1RNMzJMNFM3eHgpIHx8IGRlZmluZWQoU1RNMzJMNFM5eHgpCisjZGVmaW5lIERNQV9SRVFVRVNUX0RDTUlfUFNTSSBETUFfUkVRVUVTVF9EQ01JCisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyTDQgKi8KKworI2lmIGRlZmluZWQoU1RNMzJHMCkKKyNkZWZpbmUgRE1BX1JFUVVFU1RfREFDMV9DSEFOTkVMMSBETUFfUkVRVUVTVF9EQUMxX0NIMQorI2RlZmluZSBETUFfUkVRVUVTVF9EQUMxX0NIQU5ORUwyIERNQV9SRVFVRVNUX0RBQzFfQ0gyCisjZGVmaW5lIERNQV9SRVFVRVNUX1RJTTE2X1RSSUdfQ09NIERNQV9SRVFVRVNUX1RJTTE2X0NPTQorI2RlZmluZSBETUFfUkVRVUVTVF9USU0xN19UUklHX0NPTSBETUFfUkVRVUVTVF9USU0xN19DT00KKworI2RlZmluZSBMTF9ETUFNVVhfUkVRX1RJTTE2X1RSSUdfQ09NIExMX0RNQU1VWF9SRVFfVElNMTZfQ09NCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNMTdfVFJJR19DT00gTExfRE1BTVVYX1JFUV9USU0xN19DT00KKyNlbmRpZgorCisjaWYgZGVmaW5lZChTVE0zMkg3KQorCisjZGVmaW5lIERNQV9SRVFVRVNUX0RBQzEgRE1BX1JFUVVFU1RfREFDMV9DSDEKKyNkZWZpbmUgRE1BX1JFUVVFU1RfREFDMiBETUFfUkVRVUVTVF9EQUMxX0NIMgorCisjZGVmaW5lIEJETUFfUkVRVUVTVF9MUF9VQVJUMV9SWCBCRE1BX1JFUVVFU1RfTFBVQVJUMV9SWAorI2RlZmluZSBCRE1BX1JFUVVFU1RfTFBfVUFSVDFfVFggQkRNQV9SRVFVRVNUX0xQVUFSVDFfVFgKKworI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9ETUFNVVgxX0NIMF9FVlQgXAorICBIQUxfRE1BTVVYMV9SRVFfR0VOX0RNQU1VWDFfQ0gwX0VWVAorI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9ETUFNVVgxX0NIMV9FVlQgXAorICBIQUxfRE1BTVVYMV9SRVFfR0VOX0RNQU1VWDFfQ0gxX0VWVAorI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9ETUFNVVgxX0NIMl9FVlQgXAorICBIQUxfRE1BTVVYMV9SRVFfR0VOX0RNQU1VWDFfQ0gyX0VWVAorI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9MUFRJTTFfT1VUIEhBTF9ETUFNVVgxX1JFUV9HRU5fTFBUSU0xX09VVAorI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9MUFRJTTJfT1VUIEhBTF9ETUFNVVgxX1JFUV9HRU5fTFBUSU0yX09VVAorI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9MUFRJTTNfT1VUIEhBTF9ETUFNVVgxX1JFUV9HRU5fTFBUSU0zX09VVAorI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9FWFRJMCBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEkwCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX1RJTTEyX1RSR08gSEFMX0RNQU1VWDFfUkVRX0dFTl9USU0xMl9UUkdPCisKKyNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fRE1BTVVYMl9DSDBfRVZUIFwKKyAgSEFMX0RNQU1VWDJfUkVRX0dFTl9ETUFNVVgyX0NIMF9FVlQKKyNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fRE1BTVVYMl9DSDFfRVZUIFwKKyAgSEFMX0RNQU1VWDJfUkVRX0dFTl9ETUFNVVgyX0NIMV9FVlQKKyNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fRE1BTVVYMl9DSDJfRVZUIFwKKyAgSEFMX0RNQU1VWDJfUkVRX0dFTl9ETUFNVVgyX0NIMl9FVlQKKyNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fRE1BTVVYMl9DSDNfRVZUIFwKKyAgSEFMX0RNQU1VWDJfUkVRX0dFTl9ETUFNVVgyX0NIM19FVlQKKyNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fRE1BTVVYMl9DSDRfRVZUIFwKKyAgSEFMX0RNQU1VWDJfUkVRX0dFTl9ETUFNVVgyX0NINF9FVlQKKyNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fRE1BTVVYMl9DSDVfRVZUIFwKKyAgSEFMX0RNQU1VWDJfUkVRX0dFTl9ETUFNVVgyX0NINV9FVlQKKyNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fRE1BTVVYMl9DSDZfRVZUIFwKKyAgSEFMX0RNQU1VWDJfUkVRX0dFTl9ETUFNVVgyX0NINl9FVlQKKyNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fTFBVQVJUMV9SWF9XS1VQIFwKKyAgSEFMX0RNQU1VWDJfUkVRX0dFTl9MUFVBUlQxX1JYX1dLVVAKKyNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fTFBVQVJUMV9UWF9XS1VQIFwKKyAgSEFMX0RNQU1VWDJfUkVRX0dFTl9MUFVBUlQxX1RYX1dLVVAKKyNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fTFBUSU0yX1dLVVAgSEFMX0RNQU1VWDJfUkVRX0dFTl9MUFRJTTJfV0tVUAorI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9MUFRJTTJfT1VUIEhBTF9ETUFNVVgyX1JFUV9HRU5fTFBUSU0yX09VVAorI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9MUFRJTTNfV0tVUCBIQUxfRE1BTVVYMl9SRVFfR0VOX0xQVElNM19XS1VQCisjZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX0xQVElNM19PVVQgSEFMX0RNQU1VWDJfUkVRX0dFTl9MUFRJTTNfT1VUCisjZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX0xQVElNNF9XS1VQIEhBTF9ETUFNVVgyX1JFUV9HRU5fTFBUSU00X1dLVVAKKyNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fTFBUSU01X1dLVVAgSEFMX0RNQU1VWDJfUkVRX0dFTl9MUFRJTTVfV0tVUAorI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9JMkM0X1dLVVAgSEFMX0RNQU1VWDJfUkVRX0dFTl9JMkM0X1dLVVAKKyNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fU1BJNl9XS1VQIEhBTF9ETUFNVVgyX1JFUV9HRU5fU1BJNl9XS1VQCisjZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX0NPTVAxX09VVCBIQUxfRE1BTVVYMl9SRVFfR0VOX0NPTVAxX09VVAorI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9DT01QMl9PVVQgSEFMX0RNQU1VWDJfUkVRX0dFTl9DT01QMl9PVVQKKyNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fUlRDX1dLVVAgSEFMX0RNQU1VWDJfUkVRX0dFTl9SVENfV0tVUAorI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9FWFRJMCBIQUxfRE1BTVVYMl9SRVFfR0VOX0VYVEkwCisjZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX0VYVEkyIEhBTF9ETUFNVVgyX1JFUV9HRU5fRVhUSTIKKyNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fSTJDNF9JVF9FVlQgSEFMX0RNQU1VWDJfUkVRX0dFTl9JMkM0X0lUX0VWVAorI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9TUEk2X0lUIEhBTF9ETUFNVVgyX1JFUV9HRU5fU1BJNl9JVAorI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9MUFVBUlQxX1RYX0lUIEhBTF9ETUFNVVgyX1JFUV9HRU5fTFBVQVJUMV9UWF9JVAorI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9MUFVBUlQxX1JYX0lUIEhBTF9ETUFNVVgyX1JFUV9HRU5fTFBVQVJUMV9SWF9JVAorI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9BREMzX0lUIEhBTF9ETUFNVVgyX1JFUV9HRU5fQURDM19JVAorI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9BREMzX0FXRDFfT1VUIEhBTF9ETUFNVVgyX1JFUV9HRU5fQURDM19BV0QxX09VVAorI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9CRE1BX0NIMF9JVCBIQUxfRE1BTVVYMl9SRVFfR0VOX0JETUFfQ0gwX0lUCisjZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX0JETUFfQ0gxX0lUIEhBTF9ETUFNVVgyX1JFUV9HRU5fQkRNQV9DSDFfSVQKKworI2RlZmluZSBIQUxfRE1BTVVYX1JFUVVFU1RfR0VOX05PX0VWRU5UIEhBTF9ETUFNVVhfUkVRX0dFTl9OT19FVkVOVAorI2RlZmluZSBIQUxfRE1BTVVYX1JFUVVFU1RfR0VOX1JJU0lORyBIQUxfRE1BTVVYX1JFUV9HRU5fUklTSU5HCisjZGVmaW5lIEhBTF9ETUFNVVhfUkVRVUVTVF9HRU5fRkFMTElORyBIQUxfRE1BTVVYX1JFUV9HRU5fRkFMTElORworI2RlZmluZSBIQUxfRE1BTVVYX1JFUVVFU1RfR0VOX1JJU0lOR19GQUxMSU5HIEhBTF9ETUFNVVhfUkVRX0dFTl9SSVNJTkdfRkFMTElORworCisjZGVmaW5lIERGU0RNX0ZJTFRFUl9FWFRfVFJJR19MUFRJTTEgREZTRE1fRklMVEVSX0VYVF9UUklHX0xQVElNMV9PVVQKKyNkZWZpbmUgREZTRE1fRklMVEVSX0VYVF9UUklHX0xQVElNMiBERlNETV9GSUxURVJfRVhUX1RSSUdfTFBUSU0yX09VVAorI2RlZmluZSBERlNETV9GSUxURVJfRVhUX1RSSUdfTFBUSU0zIERGU0RNX0ZJTFRFUl9FWFRfVFJJR19MUFRJTTNfT1VUCisKKyNkZWZpbmUgREFDX1RSSUdHRVJfTFAxX09VVCBEQUNfVFJJR0dFUl9MUFRJTTFfT1VUCisjZGVmaW5lIERBQ19UUklHR0VSX0xQMl9PVVQgREFDX1RSSUdHRVJfTFBUSU0yX09VVAorCisjZW5kaWYgLyogU1RNMzJINyAqLworCisjaWYgZGVmaW5lZChTVE0zMlU1KQorI2RlZmluZSBHUERNQTFfUkVRVUVTVF9EQ01JIEdQRE1BMV9SRVFVRVNUX0RDTUlfUFNTSQorI2VuZGlmIC8qIFNUTTMyVTUgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEhBTF9GTEFTSF9BbGlhc2VkX0RlZmluZXMgSEFMIEZMQVNIIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvcgorICogbGVnYWN5IHB1cnBvc2UKKyAqIEB7CisgKi8KKworI2RlZmluZSBUWVBFUFJPR1JBTV9CWVRFIEZMQVNIX1RZUEVQUk9HUkFNX0JZVEUKKyNkZWZpbmUgVFlQRVBST0dSQU1fSEFMRldPUkQgRkxBU0hfVFlQRVBST0dSQU1fSEFMRldPUkQKKyNkZWZpbmUgVFlQRVBST0dSQU1fV09SRCBGTEFTSF9UWVBFUFJPR1JBTV9XT1JECisjZGVmaW5lIFRZUEVQUk9HUkFNX0RPVUJMRVdPUkQgRkxBU0hfVFlQRVBST0dSQU1fRE9VQkxFV09SRAorI2RlZmluZSBUWVBFRVJBU0VfU0VDVE9SUyBGTEFTSF9UWVBFRVJBU0VfU0VDVE9SUworI2RlZmluZSBUWVBFRVJBU0VfUEFHRVMgRkxBU0hfVFlQRUVSQVNFX1BBR0VTCisjZGVmaW5lIFRZUEVFUkFTRV9QQUdFRVJBU0UgRkxBU0hfVFlQRUVSQVNFX1BBR0VTCisjZGVmaW5lIFRZUEVFUkFTRV9NQVNTRVJBU0UgRkxBU0hfVFlQRUVSQVNFX01BU1NFUkFTRQorI2RlZmluZSBXUlBTVEFURV9ESVNBQkxFIE9CX1dSUFNUQVRFX0RJU0FCTEUKKyNkZWZpbmUgV1JQU1RBVEVfRU5BQkxFIE9CX1dSUFNUQVRFX0VOQUJMRQorI2RlZmluZSBIQUxfRkxBU0hfVElNRU9VVF9WQUxVRSBGTEFTSF9USU1FT1VUX1ZBTFVFCisjZGVmaW5lIE9CRVhfUENST1AgT1BUSU9OQllURV9QQ1JPUAorI2RlZmluZSBPQkVYX0JPT1RDT05GSUcgT1BUSU9OQllURV9CT09UQ09ORklHCisjZGVmaW5lIFBDUk9QU1RBVEVfRElTQUJMRSBPQl9QQ1JPUF9TVEFURV9ESVNBQkxFCisjZGVmaW5lIFBDUk9QU1RBVEVfRU5BQkxFIE9CX1BDUk9QX1NUQVRFX0VOQUJMRQorI2RlZmluZSBUWVBFRVJBU0VEQVRBX0JZVEUgRkxBU0hfVFlQRUVSQVNFREFUQV9CWVRFCisjZGVmaW5lIFRZUEVFUkFTRURBVEFfSEFMRldPUkQgRkxBU0hfVFlQRUVSQVNFREFUQV9IQUxGV09SRAorI2RlZmluZSBUWVBFRVJBU0VEQVRBX1dPUkQgRkxBU0hfVFlQRUVSQVNFREFUQV9XT1JECisjZGVmaW5lIFRZUEVQUk9HUkFNREFUQV9CWVRFIEZMQVNIX1RZUEVQUk9HUkFNREFUQV9CWVRFCisjZGVmaW5lIFRZUEVQUk9HUkFNREFUQV9IQUxGV09SRCBGTEFTSF9UWVBFUFJPR1JBTURBVEFfSEFMRldPUkQKKyNkZWZpbmUgVFlQRVBST0dSQU1EQVRBX1dPUkQgRkxBU0hfVFlQRVBST0dSQU1EQVRBX1dPUkQKKyNkZWZpbmUgVFlQRVBST0dSQU1EQVRBX0ZBU1RCWVRFIEZMQVNIX1RZUEVQUk9HUkFNREFUQV9GQVNUQllURQorI2RlZmluZSBUWVBFUFJPR1JBTURBVEFfRkFTVEhBTEZXT1JEIEZMQVNIX1RZUEVQUk9HUkFNREFUQV9GQVNUSEFMRldPUkQKKyNkZWZpbmUgVFlQRVBST0dSQU1EQVRBX0ZBU1RXT1JEIEZMQVNIX1RZUEVQUk9HUkFNREFUQV9GQVNUV09SRAorI2lmICFkZWZpbmVkKFNUTTMyRjIpICYmICFkZWZpbmVkKFNUTTMyRjQpICYmICFkZWZpbmVkKFNUTTMyRjcpICYmIFwKKyAgICAhZGVmaW5lZChTVE0zMkg3KQorI2RlZmluZSBQQUdFU0laRSBGTEFTSF9QQUdFX1NJWkUKKyNlbmRpZiAvKiBTVE0zMkYyICYmIFNUTTMyRjQgJiYgU1RNMzJGNyAmJiAgU1RNMzJINyAqLworI2RlZmluZSBUWVBFUFJPR1JBTV9GQVNUQllURSBGTEFTSF9UWVBFUFJPR1JBTV9CWVRFCisjZGVmaW5lIFRZUEVQUk9HUkFNX0ZBU1RIQUxGV09SRCBGTEFTSF9UWVBFUFJPR1JBTV9IQUxGV09SRAorI2RlZmluZSBUWVBFUFJPR1JBTV9GQVNUV09SRCBGTEFTSF9UWVBFUFJPR1JBTV9XT1JECisjZGVmaW5lIFZPTFRBR0VfUkFOR0VfMSBGTEFTSF9WT0xUQUdFX1JBTkdFXzEKKyNkZWZpbmUgVk9MVEFHRV9SQU5HRV8yIEZMQVNIX1ZPTFRBR0VfUkFOR0VfMgorI2RlZmluZSBWT0xUQUdFX1JBTkdFXzMgRkxBU0hfVk9MVEFHRV9SQU5HRV8zCisjZGVmaW5lIFZPTFRBR0VfUkFOR0VfNCBGTEFTSF9WT0xUQUdFX1JBTkdFXzQKKyNkZWZpbmUgVFlQRVBST0dSQU1fRkFTVCBGTEFTSF9UWVBFUFJPR1JBTV9GQVNUCisjZGVmaW5lIFRZUEVQUk9HUkFNX0ZBU1RfQU5EX0xBU1QgRkxBU0hfVFlQRVBST0dSQU1fRkFTVF9BTkRfTEFTVAorI2RlZmluZSBXUlBBUkVBX0JBTksxX0FSRUFBIE9CX1dSUEFSRUFfQkFOSzFfQVJFQUEKKyNkZWZpbmUgV1JQQVJFQV9CQU5LMV9BUkVBQiBPQl9XUlBBUkVBX0JBTksxX0FSRUFCCisjZGVmaW5lIFdSUEFSRUFfQkFOSzJfQVJFQUEgT0JfV1JQQVJFQV9CQU5LMl9BUkVBQQorI2RlZmluZSBXUlBBUkVBX0JBTksyX0FSRUFCIE9CX1dSUEFSRUFfQkFOSzJfQVJFQUIKKyNkZWZpbmUgSVdER19TVERCWV9GUkVFWkUgT0JfSVdER19TVERCWV9GUkVFWkUKKyNkZWZpbmUgSVdER19TVERCWV9BQ1RJVkUgT0JfSVdER19TVERCWV9SVU4KKyNkZWZpbmUgSVdER19TVE9QX0ZSRUVaRSBPQl9JV0RHX1NUT1BfRlJFRVpFCisjZGVmaW5lIElXREdfU1RPUF9BQ1RJVkUgT0JfSVdER19TVE9QX1JVTgorI2RlZmluZSBGTEFTSF9FUlJPUl9OT05FIEhBTF9GTEFTSF9FUlJPUl9OT05FCisjZGVmaW5lIEZMQVNIX0VSUk9SX1JEIEhBTF9GTEFTSF9FUlJPUl9SRAorI2RlZmluZSBGTEFTSF9FUlJPUl9QRyBIQUxfRkxBU0hfRVJST1JfUFJPRworI2RlZmluZSBGTEFTSF9FUlJPUl9QR1AgSEFMX0ZMQVNIX0VSUk9SX1BHUworI2RlZmluZSBGTEFTSF9FUlJPUl9XUlAgSEFMX0ZMQVNIX0VSUk9SX1dSUAorI2RlZmluZSBGTEFTSF9FUlJPUl9PUFRWIEhBTF9GTEFTSF9FUlJPUl9PUFRWCisjZGVmaW5lIEZMQVNIX0VSUk9SX09QVFZVU1IgSEFMX0ZMQVNIX0VSUk9SX09QVFZVU1IKKyNkZWZpbmUgRkxBU0hfRVJST1JfUFJPRyBIQUxfRkxBU0hfRVJST1JfUFJPRworI2RlZmluZSBGTEFTSF9FUlJPUl9PUCBIQUxfRkxBU0hfRVJST1JfT1BFUkFUSU9OCisjZGVmaW5lIEZMQVNIX0VSUk9SX1BHQSBIQUxfRkxBU0hfRVJST1JfUEdBCisjZGVmaW5lIEZMQVNIX0VSUk9SX1NJWkUgSEFMX0ZMQVNIX0VSUk9SX1NJWkUKKyNkZWZpbmUgRkxBU0hfRVJST1JfU0laIEhBTF9GTEFTSF9FUlJPUl9TSVpFCisjZGVmaW5lIEZMQVNIX0VSUk9SX1BHUyBIQUxfRkxBU0hfRVJST1JfUEdTCisjZGVmaW5lIEZMQVNIX0VSUk9SX01JUyBIQUxfRkxBU0hfRVJST1JfTUlTCisjZGVmaW5lIEZMQVNIX0VSUk9SX0ZBU1QgSEFMX0ZMQVNIX0VSUk9SX0ZBU1QKKyNkZWZpbmUgRkxBU0hfRVJST1JfRldXRVJSIEhBTF9GTEFTSF9FUlJPUl9GV1dFUlIKKyNkZWZpbmUgRkxBU0hfRVJST1JfTk9UWkVSTyBIQUxfRkxBU0hfRVJST1JfTk9UWkVSTworI2RlZmluZSBGTEFTSF9FUlJPUl9PUEVSQVRJT04gSEFMX0ZMQVNIX0VSUk9SX09QRVJBVElPTgorI2RlZmluZSBGTEFTSF9FUlJPUl9FUlMgSEFMX0ZMQVNIX0VSUk9SX0VSUworI2RlZmluZSBPQl9XREdfU1cgT0JfSVdER19TVworI2RlZmluZSBPQl9XREdfSFcgT0JfSVdER19IVworI2RlZmluZSBPQl9TREFEQzEyX1ZERF9NT05JVE9SX1NFVCBPQl9TREFDRF9WRERfTU9OSVRPUl9TRVQKKyNkZWZpbmUgT0JfU0RBREMxMl9WRERfTU9OSVRPUl9SRVNFVCBPQl9TREFDRF9WRERfTU9OSVRPUl9SRVNFVAorI2RlZmluZSBPQl9SQU1fUEFSSVRZX0NIRUNLX1NFVCBPQl9TUkFNX1BBUklUWV9TRVQKKyNkZWZpbmUgT0JfUkFNX1BBUklUWV9DSEVDS19SRVNFVCBPQl9TUkFNX1BBUklUWV9SRVNFVAorI2RlZmluZSBJU19PQl9TREFEQzEyX1ZERF9NT05JVE9SIElTX09CX1NEQUNEX1ZERF9NT05JVE9SCisjZGVmaW5lIE9CX1JEUF9MRVZFTDAgT0JfUkRQX0xFVkVMXzAKKyNkZWZpbmUgT0JfUkRQX0xFVkVMMSBPQl9SRFBfTEVWRUxfMQorI2RlZmluZSBPQl9SRFBfTEVWRUwyIE9CX1JEUF9MRVZFTF8yCisjaWYgZGVmaW5lZChTVE0zMkcwKSB8fCBkZWZpbmVkKFNUTTMyQzApCisjZGVmaW5lIE9CX0JPT1RfTE9DS19ESVNBQkxFIE9CX0JPT1RfRU5UUllfRk9SQ0VEX05PTkUKKyNkZWZpbmUgT0JfQk9PVF9MT0NLX0VOQUJMRSBPQl9CT09UX0VOVFJZX0ZPUkNFRF9GTEFTSAorI2Vsc2UKKyNkZWZpbmUgT0JfQk9PVF9FTlRSWV9GT1JDRURfTk9ORSBPQl9CT09UX0xPQ0tfRElTQUJMRQorI2RlZmluZSBPQl9CT09UX0VOVFJZX0ZPUkNFRF9GTEFTSCBPQl9CT09UX0xPQ0tfRU5BQkxFCisjZW5kaWYKKyNpZiBkZWZpbmVkKFNUTTMySDcpCisjZGVmaW5lIEZMQVNIX0ZMQUdfU05FQ0NFX0JBTksxUlIgRkxBU0hfRkxBR19TTkVDQ0VSUl9CQU5LMQorI2RlZmluZSBGTEFTSF9GTEFHX0RCRUNDRV9CQU5LMVJSIEZMQVNIX0ZMQUdfREJFQ0NFUlJfQkFOSzEKKyNkZWZpbmUgRkxBU0hfRkxBR19TVFJCRVJfQkFOSzFSIEZMQVNIX0ZMQUdfU1RSQkVSUl9CQU5LMQorI2RlZmluZSBGTEFTSF9GTEFHX1NORUNDRV9CQU5LMlJSIEZMQVNIX0ZMQUdfU05FQ0NFUlJfQkFOSzIKKyNkZWZpbmUgRkxBU0hfRkxBR19EQkVDQ0VfQkFOSzJSUiBGTEFTSF9GTEFHX0RCRUNDRVJSX0JBTksyCisjZGVmaW5lIEZMQVNIX0ZMQUdfU1RSQkVSX0JBTksyUiBGTEFTSF9GTEFHX1NUUkJFUlJfQkFOSzIKKyNkZWZpbmUgRkxBU0hfRkxBR19XRFcgRkxBU0hfRkxBR19XQk5FCisjZGVmaW5lIE9CX1dSUF9TRUNUT1JfQWxsIE9CX1dSUF9TRUNUT1JfQUxMCisjZW5kaWYgLyogU1RNMzJINyAqLworI2lmIGRlZmluZWQoU1RNMzJVNSkKKyNkZWZpbmUgT0JfVVNFUl9uUlNUX1NUT1AgT0JfVVNFUl9OUlNUX1NUT1AKKyNkZWZpbmUgT0JfVVNFUl9uUlNUX1NUREJZIE9CX1VTRVJfTlJTVF9TVERCWQorI2RlZmluZSBPQl9VU0VSX25SU1RfU0hEVyBPQl9VU0VSX05SU1RfU0hEVworI2RlZmluZSBPQl9VU0VSX25TV0JPT1QwIE9CX1VTRVJfTlNXQk9PVDAKKyNkZWZpbmUgT0JfVVNFUl9uQk9PVDAgT0JfVVNFUl9OQk9PVDAKKyNkZWZpbmUgT0JfbkJPT1QwX1JFU0VUIE9CX05CT09UMF9SRVNFVAorI2RlZmluZSBPQl9uQk9PVDBfU0VUIE9CX05CT09UMF9TRVQKKyNkZWZpbmUgT0JfVVNFUl9TUkFNMTM0X1JTVCBPQl9VU0VSX1NSQU1fUlNUCisjZGVmaW5lIE9CX1NSQU0xMzRfUlNUX0VSQVNFIE9CX1NSQU1fUlNUX0VSQVNFCisjZGVmaW5lIE9CX1NSQU0xMzRfUlNUX05PVF9FUkFTRSBPQl9TUkFNX1JTVF9OT1RfRVJBU0UKKyNlbmRpZiAvKiBTVE0zMlU1ICovCisjaWYgZGVmaW5lZChTVE0zMlUwKQorI2RlZmluZSBPQl9VU0VSX25SU1RfU1RPUCBPQl9VU0VSX05SU1RfU1RPUAorI2RlZmluZSBPQl9VU0VSX25SU1RfU1REQlkgT0JfVVNFUl9OUlNUX1NUREJZCisjZGVmaW5lIE9CX1VTRVJfblJTVF9TSERXIE9CX1VTRVJfTlJTVF9TSERXCisjZGVmaW5lIE9CX1VTRVJfbkJPT1RfU0VMIE9CX1VTRVJfTkJPT1RfU0VMCisjZGVmaW5lIE9CX1VTRVJfbkJPT1QwIE9CX1VTRVJfTkJPT1QwCisjZGVmaW5lIE9CX1VTRVJfbkJPT1QxIE9CX1VTRVJfTkJPT1QxCisjZGVmaW5lIE9CX25CT09UMF9SRVNFVCBPQl9OQk9PVDBfUkVTRVQKKyNkZWZpbmUgT0JfbkJPT1QwX1NFVCBPQl9OQk9PVDBfU0VUCisjZW5kaWYgLyogU1RNMzJVMCAqLworCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBIQUxfSlBFR19BbGlhc2VkX01hY3JvcyBIQUwgSlBFRyBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvcgorICogbGVnYWN5IHB1cnBvc2UKKyAqIEB7CisgKi8KKworI2lmIGRlZmluZWQoU1RNMzJINykKKyNkZWZpbmUgX19IQUxfUkNDX0pQRUdfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfSlBHREVDRU5fQ0xLX0VOQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfSlBFR19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfSlBHREVDRU5fQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19IQUxfUkNDX0pQRUdfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0pQR0RFQ1JTVF9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0hBTF9SQ0NfSlBFR19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19KUEdERUNSU1RfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0hBTF9SQ0NfSlBFR19DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19KUEdERUNfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfSlBFR19DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfSlBHREVDX0NMS19TTEVFUF9ESVNBQkxFCisjZW5kaWYgLyogU1RNMzJINyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBIQUxfU1lTQ0ZHX0FsaWFzZWRfRGVmaW5lcyBIQUwgU1lTQ0ZHIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkCisgKiBmb3IgbGVnYWN5IHB1cnBvc2UKKyAqIEB7CisgKi8KKworI2RlZmluZSBIQUxfU1lTQ0ZHX0ZBU1RNT0RFUExVU19JMkNfUEE5IEkyQ19GQVNUTU9ERVBMVVNfUEE5CisjZGVmaW5lIEhBTF9TWVNDRkdfRkFTVE1PREVQTFVTX0kyQ19QQTEwIEkyQ19GQVNUTU9ERVBMVVNfUEExMAorI2RlZmluZSBIQUxfU1lTQ0ZHX0ZBU1RNT0RFUExVU19JMkNfUEI2IEkyQ19GQVNUTU9ERVBMVVNfUEI2CisjZGVmaW5lIEhBTF9TWVNDRkdfRkFTVE1PREVQTFVTX0kyQ19QQjcgSTJDX0ZBU1RNT0RFUExVU19QQjcKKyNkZWZpbmUgSEFMX1NZU0NGR19GQVNUTU9ERVBMVVNfSTJDX1BCOCBJMkNfRkFTVE1PREVQTFVTX1BCOAorI2RlZmluZSBIQUxfU1lTQ0ZHX0ZBU1RNT0RFUExVU19JMkNfUEI5IEkyQ19GQVNUTU9ERVBMVVNfUEI5CisjZGVmaW5lIEhBTF9TWVNDRkdfRkFTVE1PREVQTFVTX0kyQzEgSTJDX0ZBU1RNT0RFUExVU19JMkMxCisjZGVmaW5lIEhBTF9TWVNDRkdfRkFTVE1PREVQTFVTX0kyQzIgSTJDX0ZBU1RNT0RFUExVU19JMkMyCisjZGVmaW5lIEhBTF9TWVNDRkdfRkFTVE1PREVQTFVTX0kyQzMgSTJDX0ZBU1RNT0RFUExVU19JMkMzCisjaWYgZGVmaW5lZChTVE0zMkc0KQorCisjZGVmaW5lIEhBTF9TWVNDRkdfRW5hYmxlSU9BbmFsb2dTd2l0Y2hCb29zdGVyIEhBTF9TWVNDRkdfRW5hYmxlSU9Td2l0Y2hCb29zdGVyCisjZGVmaW5lIEhBTF9TWVNDRkdfRGlzYWJsZUlPQW5hbG9nU3dpdGNoQm9vc3RlciBcCisgIEhBTF9TWVNDRkdfRGlzYWJsZUlPU3dpdGNoQm9vc3RlcgorI2RlZmluZSBIQUxfU1lTQ0ZHX0VuYWJsZUlPQW5hbG9nU3dpdGNoVkREIEhBTF9TWVNDRkdfRW5hYmxlSU9Td2l0Y2hWREQKKyNkZWZpbmUgSEFMX1NZU0NGR19EaXNhYmxlSU9BbmFsb2dTd2l0Y2hWREQgSEFMX1NZU0NGR19EaXNhYmxlSU9Td2l0Y2hWREQKKyNlbmRpZiAvKiBTVE0zMkc0ICovCisKKyNpZiBkZWZpbmVkKFNUTTMyVTUpCisKKyNkZWZpbmUgSEFMX1NZU0NGR19FbmFibGVJT0FuYWxvZ1N3aXRjaEJvb3N0ZXIgSEFMX1NZU0NGR19FbmFibGVJT0FuYWxvZ0Jvb3N0ZXIKKyNkZWZpbmUgSEFMX1NZU0NGR19EaXNhYmxlSU9BbmFsb2dTd2l0Y2hCb29zdGVyIFwKKyAgSEFMX1NZU0NGR19EaXNhYmxlSU9BbmFsb2dCb29zdGVyCisjZGVmaW5lIEhBTF9TWVNDRkdfRW5hYmxlSU9BbmFsb2dTd2l0Y2hWb2x0YWdlU2VsZWN0aW9uIFwKKyAgSEFMX1NZU0NGR19FbmFibGVJT0FuYWxvZ1ZvbHRhZ2VTZWxlY3Rpb24KKyNkZWZpbmUgSEFMX1NZU0NGR19EaXNhYmxlSU9BbmFsb2dTd2l0Y2hWb2x0YWdlU2VsZWN0aW9uIFwKKyAgSEFMX1NZU0NGR19EaXNhYmxlSU9BbmFsb2dWb2x0YWdlU2VsZWN0aW9uCisKKyNlbmRpZiAvKiBTVE0zMlU1ICovCisKKyNpZiBkZWZpbmVkKFNUTTMySDUpCisjZGVmaW5lIFNZU0NGR19JVF9GUFVfSU9DIFNCU19JVF9GUFVfSU9DCisjZGVmaW5lIFNZU0NGR19JVF9GUFVfRFpDIFNCU19JVF9GUFVfRFpDCisjZGVmaW5lIFNZU0NGR19JVF9GUFVfVUZDIFNCU19JVF9GUFVfVUZDCisjZGVmaW5lIFNZU0NGR19JVF9GUFVfT0ZDIFNCU19JVF9GUFVfT0ZDCisjZGVmaW5lIFNZU0NGR19JVF9GUFVfSURDIFNCU19JVF9GUFVfSURDCisjZGVmaW5lIFNZU0NGR19JVF9GUFVfSVhDIFNCU19JVF9GUFVfSVhDCisKKyNkZWZpbmUgU1lTQ0ZHX0JSRUFLX0ZMQVNIX0VDQyBTQlNfQlJFQUtfRkxBU0hfRUNDCisjZGVmaW5lIFNZU0NGR19CUkVBS19QVkQgU0JTX0JSRUFLX1BWRAorI2RlZmluZSBTWVNDRkdfQlJFQUtfU1JBTV9FQ0MgU0JTX0JSRUFLX1NSQU1fRUNDCisjZGVmaW5lIFNZU0NGR19CUkVBS19MT0NLVVAgU0JTX0JSRUFLX0xPQ0tVUAorCisjZGVmaW5lIFNZU0NGR19WUkVGQlVGX1ZPTFRBR0VfU0NBTEUwIFZSRUZCVUZfVk9MVEFHRV9TQ0FMRTAKKyNkZWZpbmUgU1lTQ0ZHX1ZSRUZCVUZfVk9MVEFHRV9TQ0FMRTEgVlJFRkJVRl9WT0xUQUdFX1NDQUxFMQorI2RlZmluZSBTWVNDRkdfVlJFRkJVRl9WT0xUQUdFX1NDQUxFMiBWUkVGQlVGX1ZPTFRBR0VfU0NBTEUyCisjZGVmaW5lIFNZU0NGR19WUkVGQlVGX1ZPTFRBR0VfU0NBTEUzIFZSRUZCVUZfVk9MVEFHRV9TQ0FMRTMKKworI2RlZmluZSBTWVNDRkdfVlJFRkJVRl9ISUdIX0lNUEVEQU5DRV9ESVNBQkxFIFZSRUZCVUZfSElHSF9JTVBFREFOQ0VfRElTQUJMRQorI2RlZmluZSBTWVNDRkdfVlJFRkJVRl9ISUdIX0lNUEVEQU5DRV9FTkFCTEUgVlJFRkJVRl9ISUdIX0lNUEVEQU5DRV9FTkFCTEUKKworI2RlZmluZSBTWVNDRkdfRkFTVE1PREVQTFVTX1BCNiBTQlNfRkFTVE1PREVQTFVTX1BCNgorI2RlZmluZSBTWVNDRkdfRkFTVE1PREVQTFVTX1BCNyBTQlNfRkFTVE1PREVQTFVTX1BCNworI2RlZmluZSBTWVNDRkdfRkFTVE1PREVQTFVTX1BCOCBTQlNfRkFTVE1PREVQTFVTX1BCOAorI2RlZmluZSBTWVNDRkdfRkFTVE1PREVQTFVTX1BCOSBTQlNfRkFTVE1PREVQTFVTX1BCOQorCisjZGVmaW5lIFNZU0NGR19FVEhfTUlJIFNCU19FVEhfTUlJCisjZGVmaW5lIFNZU0NGR19FVEhfUk1JSSBTQlNfRVRIX1JNSUkKKyNkZWZpbmUgSVNfU1lTQ0ZHX0VUSEVSTkVUX0NPTkZJRyBJU19TQlNfRVRIRVJORVRfQ09ORklHCisKKyNkZWZpbmUgU1lTQ0ZHX01FTU9SSUVTX0VSQVNFX0ZMQUdfSVBNRUUgU0JTX01FTU9SSUVTX0VSQVNFX0ZMQUdfSVBNRUUKKyNkZWZpbmUgU1lTQ0ZHX01FTU9SSUVTX0VSQVNFX0ZMQUdfTUNMUiBTQlNfTUVNT1JJRVNfRVJBU0VfRkxBR19NQ0xSCisjZGVmaW5lIElTX1NZU0NGR19NRU1PUklFU19FUkFTRV9GTEFHIElTX1NCU19NRU1PUklFU19FUkFTRV9GTEFHCisKKyNkZWZpbmUgSVNfU1lTQ0ZHX0NPREVfQ09ORklHIElTX1NCU19DT0RFX0NPTkZJRworCisjZGVmaW5lIFNZU0NGR19NUFVfTlNFQyBTQlNfTVBVX05TRUMKKyNkZWZpbmUgU1lTQ0ZHX1ZUT1JfTlNFQyBTQlNfVlRPUl9OU0VDCisjaWYgZGVmaW5lZChfX0FSTV9GRUFUVVJFX0NNU0UpICYmIChfX0FSTV9GRUFUVVJFX0NNU0UgPT0gM1UpCisjZGVmaW5lIFNZU0NGR19TQVUgU0JTX1NBVQorI2RlZmluZSBTWVNDRkdfTVBVX1NFQyBTQlNfTVBVX1NFQworI2RlZmluZSBTWVNDRkdfVlRPUl9BSVJDUl9TRUMgU0JTX1ZUT1JfQUlSQ1JfU0VDCisjZGVmaW5lIFNZU0NGR19MT0NLX0FMTCBTQlNfTE9DS19BTEwKKyNlbHNlCisjZGVmaW5lIFNZU0NGR19MT0NLX0FMTCBTQlNfTE9DS19BTEwKKyNlbmRpZiAvKiBfX0FSTV9GRUFUVVJFX0NNU0UgKi8KKworI2RlZmluZSBTWVNDRkdfQ0xLIFNCU19DTEsKKyNkZWZpbmUgU1lTQ0ZHX0NMQVNTQiBTQlNfQ0xBU1NCCisjZGVmaW5lIFNZU0NGR19GUFUgU0JTX0ZQVQorI2RlZmluZSBTWVNDRkdfQUxMIFNCU19BTEwKKworI2RlZmluZSBTWVNDRkdfU0VDIFNCU19TRUMKKyNkZWZpbmUgU1lTQ0ZHX05TRUMgU0JTX05TRUMKKworI2RlZmluZSBfX0hBTF9TWVNDRkdfRlBVX0lOVEVSUlVQVF9FTkFCTEUgX19IQUxfU0JTX0ZQVV9JTlRFUlJVUFRfRU5BQkxFCisjZGVmaW5lIF9fSEFMX1NZU0NGR19GUFVfSU5URVJSVVBUX0RJU0FCTEUgX19IQUxfU0JTX0ZQVV9JTlRFUlJVUFRfRElTQUJMRQorCisjZGVmaW5lIF9fSEFMX1NZU0NGR19CUkVBS19FQ0NfTE9DSyBfX0hBTF9TQlNfQlJFQUtfRUNDX0xPQ0sKKyNkZWZpbmUgX19IQUxfU1lTQ0ZHX0JSRUFLX0xPQ0tVUF9MT0NLIF9fSEFMX1NCU19CUkVBS19MT0NLVVBfTE9DSworI2RlZmluZSBfX0hBTF9TWVNDRkdfQlJFQUtfUFZEX0xPQ0sgX19IQUxfU0JTX0JSRUFLX1BWRF9MT0NLCisjZGVmaW5lIF9fSEFMX1NZU0NGR19CUkVBS19TUkFNX0VDQ19MT0NLIF9fSEFMX1NCU19CUkVBS19TUkFNX0VDQ19MT0NLCisKKyNkZWZpbmUgX19IQUxfU1lTQ0ZHX0ZBU1RNT0RFUExVU19FTkFCTEUgX19IQUxfU0JTX0ZBU1RNT0RFUExVU19FTkFCTEUKKyNkZWZpbmUgX19IQUxfU1lTQ0ZHX0ZBU1RNT0RFUExVU19ESVNBQkxFIF9fSEFMX1NCU19GQVNUTU9ERVBMVVNfRElTQUJMRQorCisjZGVmaW5lIF9fSEFMX1NZU0NGR19HRVRfTUVNT1JJRVNfRVJBU0VfU1RBVFVTIFwKKyAgX19IQUxfU0JTX0dFVF9NRU1PUklFU19FUkFTRV9TVEFUVVMKKyNkZWZpbmUgX19IQUxfU1lTQ0ZHX0NMRUFSX01FTU9SSUVTX0VSQVNFX1NUQVRVUyBcCisgIF9fSEFMX1NCU19DTEVBUl9NRU1PUklFU19FUkFTRV9TVEFUVVMKKworI2RlZmluZSBJU19TWVNDRkdfRlBVX0lOVEVSUlVQVCBJU19TQlNfRlBVX0lOVEVSUlVQVAorI2RlZmluZSBJU19TWVNDRkdfQlJFQUtfQ09ORklHIElTX1NCU19CUkVBS19DT05GSUcKKyNkZWZpbmUgSVNfU1lTQ0ZHX1ZSRUZCVUZfVk9MVEFHRV9TQ0FMRSBJU19WUkVGQlVGX1ZPTFRBR0VfU0NBTEUKKyNkZWZpbmUgSVNfU1lTQ0ZHX1ZSRUZCVUZfSElHSF9JTVBFREFOQ0UgSVNfVlJFRkJVRl9ISUdIX0lNUEVEQU5DRQorI2RlZmluZSBJU19TWVNDRkdfVlJFRkJVRl9UUklNTUlORyBJU19WUkVGQlVGX1RSSU1NSU5HCisjZGVmaW5lIElTX1NZU0NGR19GQVNUTU9ERVBMVVMgSVNfU0JTX0ZBU1RNT0RFUExVUworI2RlZmluZSBJU19TWVNDRkdfSVRFTVNfQVRUUklCVVRFUyBJU19TQlNfSVRFTVNfQVRUUklCVVRFUworI2RlZmluZSBJU19TWVNDRkdfQVRUUklCVVRFUyBJU19TQlNfQVRUUklCVVRFUworI2RlZmluZSBJU19TWVNDRkdfTE9DS19JVEVNUyBJU19TQlNfTE9DS19JVEVNUworCisjZGVmaW5lIEhBTF9TWVNDRkdfVlJFRkJVRl9Wb2x0YWdlU2NhbGluZ0NvbmZpZyBIQUxfVlJFRkJVRl9Wb2x0YWdlU2NhbGluZ0NvbmZpZworI2RlZmluZSBIQUxfU1lTQ0ZHX1ZSRUZCVUZfSGlnaEltcGVkYW5jZUNvbmZpZyBIQUxfVlJFRkJVRl9IaWdoSW1wZWRhbmNlQ29uZmlnCisjZGVmaW5lIEhBTF9TWVNDRkdfVlJFRkJVRl9UcmltbWluZ0NvbmZpZyBIQUxfVlJFRkJVRl9UcmltbWluZ0NvbmZpZworI2RlZmluZSBIQUxfU1lTQ0ZHX0VuYWJsZVZSRUZCVUYgSEFMX0VuYWJsZVZSRUZCVUYKKyNkZWZpbmUgSEFMX1NZU0NGR19EaXNhYmxlVlJFRkJVRiBIQUxfRGlzYWJsZVZSRUZCVUYKKworI2RlZmluZSBIQUxfU1lTQ0ZHX0VuYWJsZUlPQW5hbG9nU3dpdGNoQm9vc3RlciBcCisgIEhBTF9TQlNfRW5hYmxlSU9BbmFsb2dTd2l0Y2hCb29zdGVyCisjZGVmaW5lIEhBTF9TWVNDRkdfRGlzYWJsZUlPQW5hbG9nU3dpdGNoQm9vc3RlciBcCisgIEhBTF9TQlNfRGlzYWJsZUlPQW5hbG9nU3dpdGNoQm9vc3RlcgorI2RlZmluZSBIQUxfU1lTQ0ZHX0VUSEludGVyZmFjZVNlbGVjdCBIQUxfU0JTX0VUSEludGVyZmFjZVNlbGVjdAorCisjZGVmaW5lIEhBTF9TWVNDRkdfTG9jayBIQUxfU0JTX0xvY2sKKyNkZWZpbmUgSEFMX1NZU0NGR19HZXRMb2NrIEhBTF9TQlNfR2V0TG9jaworCisjaWYgZGVmaW5lZChfX0FSTV9GRUFUVVJFX0NNU0UpICYmIChfX0FSTV9GRUFUVVJFX0NNU0UgPT0gM1UpCisjZGVmaW5lIEhBTF9TWVNDRkdfQ29uZmlnQXR0cmlidXRlcyBIQUxfU0JTX0NvbmZpZ0F0dHJpYnV0ZXMKKyNkZWZpbmUgSEFMX1NZU0NGR19HZXRDb25maWdBdHRyaWJ1dGVzIEhBTF9TQlNfR2V0Q29uZmlnQXR0cmlidXRlcworI2VuZGlmIC8qIF9fQVJNX0ZFQVRVUkVfQ01TRSAqLworCisjZW5kaWYgLyogU1RNMzJINSAqLworCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBMTF9GTUNfQWxpYXNlZF9EZWZpbmVzIExMIEZNQyBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IKKyAqIGNvbXBhdGliaWxpdHkgcHVycG9zZQorICogQHsKKyAqLworI2lmIGRlZmluZWQoU1RNMzJMNCkgfHwgZGVmaW5lZChTVE0zMkY3KSB8fCBkZWZpbmVkKFNUTTMySDcpIHx8IGRlZmluZWQoU1RNMzJHNCkKKyNkZWZpbmUgRk1DX05BTkRfUENDX1dBSVRfRkVBVFVSRV9ESVNBQkxFIEZNQ19OQU5EX1dBSVRfRkVBVFVSRV9ESVNBQkxFCisjZGVmaW5lIEZNQ19OQU5EX1BDQ19XQUlUX0ZFQVRVUkVfRU5BQkxFIEZNQ19OQU5EX1dBSVRfRkVBVFVSRV9FTkFCTEUKKyNkZWZpbmUgRk1DX05BTkRfUENDX01FTV9CVVNfV0lEVEhfOCBGTUNfTkFORF9NRU1fQlVTX1dJRFRIXzgKKyNkZWZpbmUgRk1DX05BTkRfUENDX01FTV9CVVNfV0lEVEhfMTYgRk1DX05BTkRfTUVNX0JVU19XSURUSF8xNgorI2VsaWYgZGVmaW5lZChTVE0zMkYxKSB8fCBkZWZpbmVkKFNUTTMyRjIpIHx8IGRlZmluZWQoU1RNMzJGMykgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGNCkKKyNkZWZpbmUgRk1DX05BTkRfV0FJVF9GRUFUVVJFX0RJU0FCTEUgRk1DX05BTkRfUENDX1dBSVRfRkVBVFVSRV9ESVNBQkxFCisjZGVmaW5lIEZNQ19OQU5EX1dBSVRfRkVBVFVSRV9FTkFCTEUgRk1DX05BTkRfUENDX1dBSVRfRkVBVFVSRV9FTkFCTEUKKyNkZWZpbmUgRk1DX05BTkRfTUVNX0JVU19XSURUSF84IEZNQ19OQU5EX1BDQ19NRU1fQlVTX1dJRFRIXzgKKyNkZWZpbmUgRk1DX05BTkRfTUVNX0JVU19XSURUSF8xNiBGTUNfTkFORF9QQ0NfTUVNX0JVU19XSURUSF8xNgorI2VuZGlmCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBMTF9GU01DX0FsaWFzZWRfRGVmaW5lcyBMTCBGU01DIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvcgorICogbGVnYWN5IHB1cnBvc2UKKyAqIEB7CisgKi8KKworI2RlZmluZSBGU01DX05PUlNSQU1fVFlQRURFRiBGU01DX05PUlNSQU1fVHlwZURlZgorI2RlZmluZSBGU01DX05PUlNSQU1fRVhURU5ERURfVFlQRURFRiBGU01DX05PUlNSQU1fRVhURU5ERURfVHlwZURlZgorLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0dQSU9fQWxpYXNlZF9NYWNyb3MgSEFMIEdQSU8gQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3IKKyAqIGxlZ2FjeSBwdXJwb3NlCisgKiBAeworICovCisjZGVmaW5lIEdFVF9HUElPX1NPVVJDRSBHUElPX0dFVF9JTkRFWAorI2RlZmluZSBHRVRfR1BJT19JTkRFWCBHUElPX0dFVF9JTkRFWAorCisjaWYgZGVmaW5lZChTVE0zMkY0KQorI2RlZmluZSBHUElPX0FGMTJfU0RNTUMgR1BJT19BRjEyX1NESU8KKyNkZWZpbmUgR1BJT19BRjEyX1NETU1DMSBHUElPX0FGMTJfU0RJTworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFNUTTMyRjcpCisjZGVmaW5lIEdQSU9fQUYxMl9TRElPIEdQSU9fQUYxMl9TRE1NQzEKKyNkZWZpbmUgR1BJT19BRjEyX1NETU1DIEdQSU9fQUYxMl9TRE1NQzEKKyNlbmRpZgorCisjaWYgZGVmaW5lZChTVE0zMkw0KQorI2RlZmluZSBHUElPX0FGMTJfU0RJTyBHUElPX0FGMTJfU0RNTUMxCisjZGVmaW5lIEdQSU9fQUYxMl9TRE1NQyBHUElPX0FGMTJfU0RNTUMxCisjZW5kaWYKKworI2lmIGRlZmluZWQoU1RNMzJINykKKyNkZWZpbmUgR1BJT19BRjdfU0RJTzEgR1BJT19BRjdfU0RNTUMxCisjZGVmaW5lIEdQSU9fQUY4X1NESU8xIEdQSU9fQUY4X1NETU1DMQorI2RlZmluZSBHUElPX0FGMTJfU0RJTzEgR1BJT19BRjEyX1NETU1DMQorI2RlZmluZSBHUElPX0FGOV9TRElPMiBHUElPX0FGOV9TRE1NQzIKKyNkZWZpbmUgR1BJT19BRjEwX1NESU8yIEdQSU9fQUYxMF9TRE1NQzIKKyNkZWZpbmUgR1BJT19BRjExX1NESU8yIEdQSU9fQUYxMV9TRE1NQzIKKworI2lmIGRlZmluZWQoU1RNMzJINzQzeHgpIHx8IGRlZmluZWQoU1RNMzJINzUzeHgpIHx8IGRlZmluZWQoU1RNMzJINzUweHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMySDc0Mnh4KSB8fCBkZWZpbmVkKFNUTTMySDc0NXh4KSB8fCBkZWZpbmVkKFNUTTMySDc1NXh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkg3NDd4eCkgfHwgZGVmaW5lZChTVE0zMkg3NTd4eCkKKyNkZWZpbmUgR1BJT19BRjEwX09URzJfSFMgR1BJT19BRjEwX09URzJfRlMKKyNkZWZpbmUgR1BJT19BRjEwX09URzFfRlMgR1BJT19BRjEwX09URzFfSFMKKyNkZWZpbmUgR1BJT19BRjEyX09URzJfRlMgR1BJT19BRjEyX09URzFfRlMKKyNlbmRpZiAvKlNUTTMySDc0M3h4IHx8IFNUTTMySDc1M3h4IHx8IFNUTTMySDc1MHh4IHx8IFNUTTMySDc0Mnh4IHx8IFwKKyAgICAgICAgIFNUTTMySDc0NXh4IHx8IFNUTTMySDc1NXh4IHx8IFNUTTMySDc0N3h4IHx8IFNUTTMySDc1N3h4ICovCisjZW5kaWYgLyogU1RNMzJINyAqLworCisjZGVmaW5lIEdQSU9fQUYwX0xQVElNIEdQSU9fQUYwX0xQVElNMQorI2RlZmluZSBHUElPX0FGMV9MUFRJTSBHUElPX0FGMV9MUFRJTTEKKyNkZWZpbmUgR1BJT19BRjJfTFBUSU0gR1BJT19BRjJfTFBUSU0xCisKKyNpZiBkZWZpbmVkKFNUTTMyTDApIHx8IGRlZmluZWQoU1RNMzJMNCkgfHwgZGVmaW5lZChTVE0zMkY0KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYyKSB8fCBkZWZpbmVkKFNUTTMyRjcpIHx8IGRlZmluZWQoU1RNMzJHNCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJINykgfHwgZGVmaW5lZChTVE0zMldCKSB8fCBkZWZpbmVkKFNUTTMyVTUpCisjZGVmaW5lIEdQSU9fU1BFRURfTE9XIEdQSU9fU1BFRURfRlJFUV9MT1cKKyNkZWZpbmUgR1BJT19TUEVFRF9NRURJVU0gR1BJT19TUEVFRF9GUkVRX01FRElVTQorI2RlZmluZSBHUElPX1NQRUVEX0ZBU1QgR1BJT19TUEVFRF9GUkVRX0hJR0gKKyNkZWZpbmUgR1BJT19TUEVFRF9ISUdIIEdQSU9fU1BFRURfRlJFUV9WRVJZX0hJR0gKKyNlbmRpZiAvKiBTVE0zMkwwIHx8IFNUTTMyTDQgfHwgU1RNMzJGNCB8fCBTVE0zMkYyIHx8IFNUTTMyRjcgfHwgU1RNMzJHNCB8fCBcCisgICAgICAgICAgU1RNMzJINyB8fCBTVE0zMldCIHx8IFNUTTMyVTUqLworCisjaWYgZGVmaW5lZChTVE0zMkwxKQorI2RlZmluZSBHUElPX1NQRUVEX1ZFUllfTE9XIEdQSU9fU1BFRURfRlJFUV9MT1cKKyNkZWZpbmUgR1BJT19TUEVFRF9MT1cgR1BJT19TUEVFRF9GUkVRX01FRElVTQorI2RlZmluZSBHUElPX1NQRUVEX01FRElVTSBHUElPX1NQRUVEX0ZSRVFfSElHSAorI2RlZmluZSBHUElPX1NQRUVEX0hJR0ggR1BJT19TUEVFRF9GUkVRX1ZFUllfSElHSAorI2VuZGlmIC8qIFNUTTMyTDEgKi8KKworI2lmIGRlZmluZWQoU1RNMzJGMCkgfHwgZGVmaW5lZChTVE0zMkYzKSB8fCBkZWZpbmVkKFNUTTMyRjEpCisjZGVmaW5lIEdQSU9fU1BFRURfTE9XIEdQSU9fU1BFRURfRlJFUV9MT1cKKyNkZWZpbmUgR1BJT19TUEVFRF9NRURJVU0gR1BJT19TUEVFRF9GUkVRX01FRElVTQorI2RlZmluZSBHUElPX1NQRUVEX0hJR0ggR1BJT19TUEVFRF9GUkVRX0hJR0gKKyNlbmRpZiAvKiBTVE0zMkYwIHx8IFNUTTMyRjMgfHwgU1RNMzJGMSAqLworCisjZGVmaW5lIEdQSU9fQUY2X0RGU0RNIEdQSU9fQUY2X0RGU0RNMQorCisjaWYgZGVmaW5lZChTVE0zMlU1KSB8fCBkZWZpbmVkKFNUTTMySDUpCisjZGVmaW5lIEdQSU9fQUYwX1JUQ181MEh6IEdQSU9fQUYwX1JUQ181MEhaCisjZW5kaWYgLyogU1RNMzJVNSB8fCBTVE0zMkg1ICovCisjaWYgZGVmaW5lZChTVE0zMlU1KQorI2RlZmluZSBHUElPX0FGMF9TMkRTVE9QIEdQSU9fQUYwX1NSRFNUT1AKKyNkZWZpbmUgR1BJT19BRjExX0xQR1BJTyBHUElPX0FGMTFfTFBHUElPMQorI2VuZGlmIC8qIFNUTTMyVTUgKi8KKworI2lmIGRlZmluZWQoU1RNMzJXQkEpCisjZGVmaW5lIEdQSU9fQUYxMV9SRl9BTlRTVzAgR1BJT19BRjExX1JGCisjZGVmaW5lIEdQSU9fQUYxMV9SRl9BTlRTVzEgR1BJT19BRjExX1JGCisjZGVmaW5lIEdQSU9fQUYxMV9SRl9BTlRTVzIgR1BJT19BRjExX1JGCisjZGVmaW5lIEdQSU9fQUYxMV9SRl9JTzEgR1BJT19BRjExX1JGCisjZGVmaW5lIEdQSU9fQUYxMV9SRl9JTzIgR1BJT19BRjExX1JGCisjZGVmaW5lIEdQSU9fQUYxMV9SRl9JTzMgR1BJT19BRjExX1JGCisjZGVmaW5lIEdQSU9fQUYxMV9SRl9JTzQgR1BJT19BRjExX1JGCisjZGVmaW5lIEdQSU9fQUYxMV9SRl9JTzUgR1BJT19BRjExX1JGCisjZGVmaW5lIEdQSU9fQUYxMV9SRl9JTzYgR1BJT19BRjExX1JGCisjZGVmaW5lIEdQSU9fQUYxMV9SRl9JTzcgR1BJT19BRjExX1JGCisjZGVmaW5lIEdQSU9fQUYxMV9SRl9JTzggR1BJT19BRjExX1JGCisjZGVmaW5lIEdQSU9fQUYxMV9SRl9JTzkgR1BJT19BRjExX1JGCisjZW5kaWYgLyogU1RNMzJXQkEgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEhBTF9HVFpDX0FsaWFzZWRfRGVmaW5lcyBIQUwgR1RaQyBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IKKyAqIGxlZ2FjeSBwdXJwb3NlCisgKiBAeworICovCisjaWYgZGVmaW5lZChTVE0zMlU1KQorI2RlZmluZSBHVFpDX1BFUklQSF9EQ01JIEdUWkNfUEVSSVBIX0RDTUlfUFNTSQorI2RlZmluZSBHVFpDX1BFUklQSF9MVERDIEdUWkNfUEVSSVBIX0xURENVU0IKKyNlbmRpZiAvKiBTVE0zMlU1ICovCisjaWYgZGVmaW5lZChTVE0zMkg1KQorI2RlZmluZSBHVFpDX1BFUklQSF9EQUMxMiBHVFpDX1BFUklQSF9EQUMxCisjZGVmaW5lIEdUWkNfUEVSSVBIX0FEQzEyIEdUWkNfUEVSSVBIX0FEQworI2RlZmluZSBHVFpDX1BFUklQSF9VU0JGUyBHVFpDX1BFUklQSF9VU0IKKyNlbmRpZiAvKiBTVE0zMkg1ICovCisjaWYgZGVmaW5lZChTVE0zMkg1KSB8fCBkZWZpbmVkKFNUTTMyVTUpCisjZGVmaW5lIEdUWkNfTUNQQkJfTkJfVkNUUl9SRUdfTUFYIEdUWkNfTVBDQkJfTkJfVkNUUl9SRUdfTUFYCisjZGVmaW5lIEdUWkNfTUNQQkJfTkJfTENLX1ZDVFJfUkVHX01BWCBHVFpDX01QQ0JCX05CX0xDS19WQ1RSX1JFR19NQVgKKyNkZWZpbmUgR1RaQ19NQ1BCQl9TVVBFUkJMT0NLX1VOTE9DS0VEIEdUWkNfTVBDQkJfU1VQRVJCTE9DS19VTkxPQ0tFRAorI2RlZmluZSBHVFpDX01DUEJCX1NVUEVSQkxPQ0tfTE9DS0VEIEdUWkNfTVBDQkJfU1VQRVJCTE9DS19MT0NLRUQKKyNkZWZpbmUgR1RaQ19NQ1BCQl9CTE9DS19OU0VDIEdUWkNfTVBDQkJfQkxPQ0tfTlNFQworI2RlZmluZSBHVFpDX01DUEJCX0JMT0NLX1NFQyBHVFpDX01QQ0JCX0JMT0NLX1NFQworI2RlZmluZSBHVFpDX01DUEJCX0JMT0NLX05QUklWIEdUWkNfTVBDQkJfQkxPQ0tfTlBSSVYKKyNkZWZpbmUgR1RaQ19NQ1BCQl9CTE9DS19QUklWIEdUWkNfTVBDQkJfQkxPQ0tfUFJJVgorI2RlZmluZSBHVFpDX01DUEJCX0xPQ0tfT0ZGIEdUWkNfTVBDQkJfTE9DS19PRkYKKyNkZWZpbmUgR1RaQ19NQ1BCQl9MT0NLX09OIEdUWkNfTVBDQkJfTE9DS19PTgorI2VuZGlmIC8qIFNUTTMySDUgfHwgU1RNMzJVNSAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0hSVElNX0FsaWFzZWRfTWFjcm9zIEhBTCBIUlRJTSBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvcgorICogbGVnYWN5IHB1cnBvc2UKKyAqIEB7CisgKi8KKyNkZWZpbmUgSFJUSU1fVElNREVMQVlFRFBST1RFQ1RJT05fRElTQUJMRUQgXAorICBIUlRJTV9USU1FUl9BX0JfQ19ERUxBWUVEUFJPVEVDVElPTl9ESVNBQkxFRAorI2RlZmluZSBIUlRJTV9USU1ERUxBWUVEUFJPVEVDVElPTl9ERUxBWUVET1VUMV9FRVY2OCBcCisgIEhSVElNX1RJTUVSX0FfQl9DX0RFTEFZRURQUk9URUNUSU9OX0RFTEFZRURPVVQxX0VFVjYKKyNkZWZpbmUgSFJUSU1fVElNREVMQVlFRFBST1RFQ1RJT05fREVMQVlFRE9VVDJfRUVWNjggXAorICBIUlRJTV9USU1FUl9BX0JfQ19ERUxBWUVEUFJPVEVDVElPTl9ERUxBWUVET1VUMl9FRVY2CisjZGVmaW5lIEhSVElNX1RJTURFTEFZRURQUk9URUNUSU9OX0RFTEFZRURCT1RIX0VFVjY4IFwKKyAgSFJUSU1fVElNRVJfQV9CX0NfREVMQVlFRFBST1RFQ1RJT05fREVMQVlFREJPVEhfRUVWNgorI2RlZmluZSBIUlRJTV9USU1ERUxBWUVEUFJPVEVDVElPTl9CQUxBTkNFRF9FRVY2OCBcCisgIEhSVElNX1RJTUVSX0FfQl9DX0RFTEFZRURQUk9URUNUSU9OX0JBTEFOQ0VEX0VFVjYKKyNkZWZpbmUgSFJUSU1fVElNREVMQVlFRFBST1RFQ1RJT05fREVMQVlFRE9VVDFfREVFVjc5IFwKKyAgSFJUSU1fVElNRVJfQV9CX0NfREVMQVlFRFBST1RFQ1RJT05fREVMQVlFRE9VVDFfREVFVjcKKyNkZWZpbmUgSFJUSU1fVElNREVMQVlFRFBST1RFQ1RJT05fREVMQVlFRE9VVDJfREVFVjc5IFwKKyAgSFJUSU1fVElNRVJfQV9CX0NfREVMQVlFRFBST1RFQ1RJT05fREVMQVlFRE9VVDJfREVFVjcKKyNkZWZpbmUgSFJUSU1fVElNREVMQVlFRFBST1RFQ1RJT05fREVMQVlFREJPVEhfRUVWNzkgXAorICBIUlRJTV9USU1FUl9BX0JfQ19ERUxBWUVEUFJPVEVDVElPTl9ERUxBWUVEQk9USF9FRVY3CisjZGVmaW5lIEhSVElNX1RJTURFTEFZRURQUk9URUNUSU9OX0JBTEFOQ0VEX0VFVjc5IFwKKyAgSFJUSU1fVElNRVJfQV9CX0NfREVMQVlFRFBST1RFQ1RJT05fQkFMQU5DRURfRUVWNworCisjZGVmaW5lIF9fSEFMX0hSVElNX1NldENvdW50ZXIgX19IQUxfSFJUSU1fU0VUQ09VTlRFUgorI2RlZmluZSBfX0hBTF9IUlRJTV9HZXRDb3VudGVyIF9fSEFMX0hSVElNX0dFVENPVU5URVIKKyNkZWZpbmUgX19IQUxfSFJUSU1fU2V0UGVyaW9kIF9fSEFMX0hSVElNX1NFVFBFUklPRAorI2RlZmluZSBfX0hBTF9IUlRJTV9HZXRQZXJpb2QgX19IQUxfSFJUSU1fR0VUUEVSSU9ECisjZGVmaW5lIF9fSEFMX0hSVElNX1NldENsb2NrUHJlc2NhbGVyIF9fSEFMX0hSVElNX1NFVENMT0NLUFJFU0NBTEVSCisjZGVmaW5lIF9fSEFMX0hSVElNX0dldENsb2NrUHJlc2NhbGVyIF9fSEFMX0hSVElNX0dFVENMT0NLUFJFU0NBTEVSCisjZGVmaW5lIF9fSEFMX0hSVElNX1NldENvbXBhcmUgX19IQUxfSFJUSU1fU0VUQ09NUEFSRQorI2RlZmluZSBfX0hBTF9IUlRJTV9HZXRDb21wYXJlIF9fSEFMX0hSVElNX0dFVENPTVBBUkUKKworI2lmIGRlZmluZWQoU1RNMzJGMykgfHwgZGVmaW5lZChTVE0zMkc0KSB8fCBkZWZpbmVkKFNUTTMySDcpCisjZGVmaW5lIEhSVElNSW50ZXJydXB0UmVzcXVlc3RzIEhSVElNSW50ZXJydXB0UmVxdWVzdHMKKyNlbmRpZiAvKiBTVE0zMkYzIHx8IFNUTTMyRzQgfHwgU1RNMzJINyAqLworCisjaWYgZGVmaW5lZChTVE0zMkc0KQorI2RlZmluZSBIQUxfSFJUSU1fRXh0ZXJuYWxFdmVudENvdW50ZXJDb25maWcgSEFMX0hSVElNX0V4dEV2ZW50Q291bnRlckNvbmZpZworI2RlZmluZSBIQUxfSFJUSU1fRXh0ZXJuYWxFdmVudENvdW50ZXJFbmFibGUgSEFMX0hSVElNX0V4dEV2ZW50Q291bnRlckVuYWJsZQorI2RlZmluZSBIQUxfSFJUSU1fRXh0ZXJuYWxFdmVudENvdW50ZXJEaXNhYmxlIEhBTF9IUlRJTV9FeHRFdmVudENvdW50ZXJEaXNhYmxlCisjZGVmaW5lIEhBTF9IUlRJTV9FeHRlcm5hbEV2ZW50Q291bnRlclJlc2V0IEhBTF9IUlRJTV9FeHRFdmVudENvdW50ZXJSZXNldAorI2RlZmluZSBIUlRJTV9USU1FRVZFTlRfQSBIUlRJTV9FVkVOVENPVU5URVJfQQorI2RlZmluZSBIUlRJTV9USU1FRVZFTlRfQiBIUlRJTV9FVkVOVENPVU5URVJfQgorI2RlZmluZSBIUlRJTV9USU1FRVZFTlRSRVNFVE1PREVfVU5DT05ESVRJT05BTCBcCisgIEhSVElNX0VWRU5UQ09VTlRFUl9SU1RNT0RFX1VOQ09ORElUSU9OQUwKKyNkZWZpbmUgSFJUSU1fVElNRUVWRU5UUkVTRVRNT0RFX0NPTkRJVElPTkFMIFwKKyAgSFJUSU1fRVZFTlRDT1VOVEVSX1JTVE1PREVfQ09ORElUSU9OQUwKKyNlbmRpZiAvKiBTVE0zMkc0ICovCisKKyNpZiBkZWZpbmVkKFNUTTMySDcpCisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1BRVYxX1RJTUJDTVAxIEhSVElNX09VVFBVVFNFVF9USU1FVl8xCisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1BRVYyX1RJTUJDTVAyIEhSVElNX09VVFBVVFNFVF9USU1FVl8yCisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1BRVYzX1RJTUNDTVAyIEhSVElNX09VVFBVVFNFVF9USU1FVl8zCisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1BRVY0X1RJTUNDTVAzIEhSVElNX09VVFBVVFNFVF9USU1FVl80CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1BRVY1X1RJTURDTVAxIEhSVElNX09VVFBVVFNFVF9USU1FVl81CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1BRVY2X1RJTURDTVAyIEhSVElNX09VVFBVVFNFVF9USU1FVl82CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1BRVY3X1RJTUVDTVAzIEhSVElNX09VVFBVVFNFVF9USU1FVl83CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1BRVY4X1RJTUVDTVA0IEhSVElNX09VVFBVVFNFVF9USU1FVl84CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1BRVY5X1RJTUZDTVA0IEhSVElNX09VVFBVVFNFVF9USU1FVl85CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1CRVYxX1RJTUFDTVAxIEhSVElNX09VVFBVVFNFVF9USU1FVl8xCisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1CRVYyX1RJTUFDTVAyIEhSVElNX09VVFBVVFNFVF9USU1FVl8yCisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1CRVYzX1RJTUNDTVAzIEhSVElNX09VVFBVVFNFVF9USU1FVl8zCisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1CRVY0X1RJTUNDTVA0IEhSVElNX09VVFBVVFNFVF9USU1FVl80CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1CRVY1X1RJTURDTVAzIEhSVElNX09VVFBVVFNFVF9USU1FVl81CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1CRVY2X1RJTURDTVA0IEhSVElNX09VVFBVVFNFVF9USU1FVl82CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1CRVY3X1RJTUVDTVAxIEhSVElNX09VVFBVVFNFVF9USU1FVl83CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1CRVY4X1RJTUVDTVAyIEhSVElNX09VVFBVVFNFVF9USU1FVl84CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1CRVY5X1RJTUZDTVAzIEhSVElNX09VVFBVVFNFVF9USU1FVl85CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1DRVYxX1RJTUFDTVAxIEhSVElNX09VVFBVVFNFVF9USU1FVl8xCisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1DRVYyX1RJTUFDTVAyIEhSVElNX09VVFBVVFNFVF9USU1FVl8yCisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1DRVYzX1RJTUJDTVAyIEhSVElNX09VVFBVVFNFVF9USU1FVl8zCisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1DRVY0X1RJTUJDTVAzIEhSVElNX09VVFBVVFNFVF9USU1FVl80CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1DRVY1X1RJTURDTVAyIEhSVElNX09VVFBVVFNFVF9USU1FVl81CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1DRVY2X1RJTURDTVA0IEhSVElNX09VVFBVVFNFVF9USU1FVl82CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1DRVY3X1RJTUVDTVAzIEhSVElNX09VVFBVVFNFVF9USU1FVl83CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1DRVY4X1RJTUVDTVA0IEhSVElNX09VVFBVVFNFVF9USU1FVl84CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1DRVY5X1RJTUZDTVAyIEhSVElNX09VVFBVVFNFVF9USU1FVl85CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1ERVYxX1RJTUFDTVAxIEhSVElNX09VVFBVVFNFVF9USU1FVl8xCisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1ERVYyX1RJTUFDTVA0IEhSVElNX09VVFBVVFNFVF9USU1FVl8yCisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1ERVYzX1RJTUJDTVAyIEhSVElNX09VVFBVVFNFVF9USU1FVl8zCisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1ERVY0X1RJTUJDTVA0IEhSVElNX09VVFBVVFNFVF9USU1FVl80CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1ERVY1X1RJTUNDTVA0IEhSVElNX09VVFBVVFNFVF9USU1FVl81CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1ERVY2X1RJTUVDTVAxIEhSVElNX09VVFBVVFNFVF9USU1FVl82CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1ERVY3X1RJTUVDTVA0IEhSVElNX09VVFBVVFNFVF9USU1FVl83CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1ERVY4X1RJTUZDTVAxIEhSVElNX09VVFBVVFNFVF9USU1FVl84CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1ERVY5X1RJTUZDTVAzIEhSVElNX09VVFBVVFNFVF9USU1FVl85CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1FRVYxX1RJTUFDTVA0IEhSVElNX09VVFBVVFNFVF9USU1FVl8xCisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1FRVYyX1RJTUJDTVAzIEhSVElNX09VVFBVVFNFVF9USU1FVl8yCisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1FRVYzX1RJTUJDTVA0IEhSVElNX09VVFBVVFNFVF9USU1FVl8zCisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1FRVY0X1RJTUNDTVAxIEhSVElNX09VVFBVVFNFVF9USU1FVl80CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1FRVY1X1RJTURDTVAyIEhSVElNX09VVFBVVFNFVF9USU1FVl81CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1FRVY2X1RJTURDTVAxIEhSVElNX09VVFBVVFNFVF9USU1FVl82CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1FRVY3X1RJTURDTVAyIEhSVElNX09VVFBVVFNFVF9USU1FVl83CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1FRVY4X1RJTUZDTVAzIEhSVElNX09VVFBVVFNFVF9USU1FVl84CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1FRVY5X1RJTUZDTVA0IEhSVElNX09VVFBVVFNFVF9USU1FVl85CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1GRVYxX1RJTUFDTVAzIEhSVElNX09VVFBVVFNFVF9USU1FVl8xCisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1GRVYyX1RJTUJDTVAxIEhSVElNX09VVFBVVFNFVF9USU1FVl8yCisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1GRVYzX1RJTUJDTVA0IEhSVElNX09VVFBVVFNFVF9USU1FVl8zCisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1GRVY0X1RJTUNDTVAxIEhSVElNX09VVFBVVFNFVF9USU1FVl80CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1GRVY1X1RJTUNDTVA0IEhSVElNX09VVFBVVFNFVF9USU1FVl81CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1GRVY2X1RJTURDTVAzIEhSVElNX09VVFBVVFNFVF9USU1FVl82CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1GRVY3X1RJTURDTVA0IEhSVElNX09VVFBVVFNFVF9USU1FVl83CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1GRVY4X1RJTUVDTVAyIEhSVElNX09VVFBVVFNFVF9USU1FVl84CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1GRVY5X1RJTUVDTVAzIEhSVElNX09VVFBVVFNFVF9USU1FVl85CisKKyNkZWZpbmUgSFJUSU1fT1VUUFVUUkVTRVRfVElNQUVWMV9USU1CQ01QMSBIUlRJTV9PVVRQVVRTRVRfVElNRVZfMQorI2RlZmluZSBIUlRJTV9PVVRQVVRSRVNFVF9USU1BRVYyX1RJTUJDTVAyIEhSVElNX09VVFBVVFNFVF9USU1FVl8yCisjZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUFFVjNfVElNQ0NNUDIgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzMKKyNkZWZpbmUgSFJUSU1fT1VUUFVUUkVTRVRfVElNQUVWNF9USU1DQ01QMyBIUlRJTV9PVVRQVVRTRVRfVElNRVZfNAorI2RlZmluZSBIUlRJTV9PVVRQVVRSRVNFVF9USU1BRVY1X1RJTURDTVAxIEhSVElNX09VVFBVVFNFVF9USU1FVl81CisjZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUFFVjZfVElNRENNUDIgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzYKKyNkZWZpbmUgSFJUSU1fT1VUUFVUUkVTRVRfVElNQUVWN19USU1FQ01QMyBIUlRJTV9PVVRQVVRTRVRfVElNRVZfNworI2RlZmluZSBIUlRJTV9PVVRQVVRSRVNFVF9USU1BRVY4X1RJTUVDTVA0IEhSVElNX09VVFBVVFNFVF9USU1FVl84CisjZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUFFVjlfVElNRkNNUDQgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzkKKyNkZWZpbmUgSFJUSU1fT1VUUFVUUkVTRVRfVElNQkVWMV9USU1BQ01QMSBIUlRJTV9PVVRQVVRTRVRfVElNRVZfMQorI2RlZmluZSBIUlRJTV9PVVRQVVRSRVNFVF9USU1CRVYyX1RJTUFDTVAyIEhSVElNX09VVFBVVFNFVF9USU1FVl8yCisjZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUJFVjNfVElNQ0NNUDMgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzMKKyNkZWZpbmUgSFJUSU1fT1VUUFVUUkVTRVRfVElNQkVWNF9USU1DQ01QNCBIUlRJTV9PVVRQVVRTRVRfVElNRVZfNAorI2RlZmluZSBIUlRJTV9PVVRQVVRSRVNFVF9USU1CRVY1X1RJTURDTVAzIEhSVElNX09VVFBVVFNFVF9USU1FVl81CisjZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUJFVjZfVElNRENNUDQgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzYKKyNkZWZpbmUgSFJUSU1fT1VUUFVUUkVTRVRfVElNQkVWN19USU1FQ01QMSBIUlRJTV9PVVRQVVRTRVRfVElNRVZfNworI2RlZmluZSBIUlRJTV9PVVRQVVRSRVNFVF9USU1CRVY4X1RJTUVDTVAyIEhSVElNX09VVFBVVFNFVF9USU1FVl84CisjZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUJFVjlfVElNRkNNUDMgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzkKKyNkZWZpbmUgSFJUSU1fT1VUUFVUUkVTRVRfVElNQ0VWMV9USU1BQ01QMSBIUlRJTV9PVVRQVVRTRVRfVElNRVZfMQorI2RlZmluZSBIUlRJTV9PVVRQVVRSRVNFVF9USU1DRVYyX1RJTUFDTVAyIEhSVElNX09VVFBVVFNFVF9USU1FVl8yCisjZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUNFVjNfVElNQkNNUDIgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzMKKyNkZWZpbmUgSFJUSU1fT1VUUFVUUkVTRVRfVElNQ0VWNF9USU1CQ01QMyBIUlRJTV9PVVRQVVRTRVRfVElNRVZfNAorI2RlZmluZSBIUlRJTV9PVVRQVVRSRVNFVF9USU1DRVY1X1RJTURDTVAyIEhSVElNX09VVFBVVFNFVF9USU1FVl81CisjZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUNFVjZfVElNRENNUDQgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzYKKyNkZWZpbmUgSFJUSU1fT1VUUFVUUkVTRVRfVElNQ0VWN19USU1FQ01QMyBIUlRJTV9PVVRQVVRTRVRfVElNRVZfNworI2RlZmluZSBIUlRJTV9PVVRQVVRSRVNFVF9USU1DRVY4X1RJTUVDTVA0IEhSVElNX09VVFBVVFNFVF9USU1FVl84CisjZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUNFVjlfVElNRkNNUDIgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzkKKyNkZWZpbmUgSFJUSU1fT1VUUFVUUkVTRVRfVElNREVWMV9USU1BQ01QMSBIUlRJTV9PVVRQVVRTRVRfVElNRVZfMQorI2RlZmluZSBIUlRJTV9PVVRQVVRSRVNFVF9USU1ERVYyX1RJTUFDTVA0IEhSVElNX09VVFBVVFNFVF9USU1FVl8yCisjZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTURFVjNfVElNQkNNUDIgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzMKKyNkZWZpbmUgSFJUSU1fT1VUUFVUUkVTRVRfVElNREVWNF9USU1CQ01QNCBIUlRJTV9PVVRQVVRTRVRfVElNRVZfNAorI2RlZmluZSBIUlRJTV9PVVRQVVRSRVNFVF9USU1ERVY1X1RJTUNDTVA0IEhSVElNX09VVFBVVFNFVF9USU1FVl81CisjZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTURFVjZfVElNRUNNUDEgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzYKKyNkZWZpbmUgSFJUSU1fT1VUUFVUUkVTRVRfVElNREVWN19USU1FQ01QNCBIUlRJTV9PVVRQVVRTRVRfVElNRVZfNworI2RlZmluZSBIUlRJTV9PVVRQVVRSRVNFVF9USU1ERVY4X1RJTUZDTVAxIEhSVElNX09VVFBVVFNFVF9USU1FVl84CisjZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTURFVjlfVElNRkNNUDMgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzkKKyNkZWZpbmUgSFJUSU1fT1VUUFVUUkVTRVRfVElNRUVWMV9USU1BQ01QNCBIUlRJTV9PVVRQVVRTRVRfVElNRVZfMQorI2RlZmluZSBIUlRJTV9PVVRQVVRSRVNFVF9USU1FRVYyX1RJTUJDTVAzIEhSVElNX09VVFBVVFNFVF9USU1FVl8yCisjZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUVFVjNfVElNQkNNUDQgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzMKKyNkZWZpbmUgSFJUSU1fT1VUUFVUUkVTRVRfVElNRUVWNF9USU1DQ01QMSBIUlRJTV9PVVRQVVRTRVRfVElNRVZfNAorI2RlZmluZSBIUlRJTV9PVVRQVVRSRVNFVF9USU1FRVY1X1RJTURDTVAyIEhSVElNX09VVFBVVFNFVF9USU1FVl81CisjZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUVFVjZfVElNRENNUDEgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzYKKyNkZWZpbmUgSFJUSU1fT1VUUFVUUkVTRVRfVElNRUVWN19USU1EQ01QMiBIUlRJTV9PVVRQVVRTRVRfVElNRVZfNworI2RlZmluZSBIUlRJTV9PVVRQVVRSRVNFVF9USU1FRVY4X1RJTUZDTVAzIEhSVElNX09VVFBVVFNFVF9USU1FVl84CisjZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUVFVjlfVElNRkNNUDQgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzkKKyNkZWZpbmUgSFJUSU1fT1VUUFVUUkVTRVRfVElNRkVWMV9USU1BQ01QMyBIUlRJTV9PVVRQVVRTRVRfVElNRVZfMQorI2RlZmluZSBIUlRJTV9PVVRQVVRSRVNFVF9USU1GRVYyX1RJTUJDTVAxIEhSVElNX09VVFBVVFNFVF9USU1FVl8yCisjZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUZFVjNfVElNQkNNUDQgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzMKKyNkZWZpbmUgSFJUSU1fT1VUUFVUUkVTRVRfVElNRkVWNF9USU1DQ01QMSBIUlRJTV9PVVRQVVRTRVRfVElNRVZfNAorI2RlZmluZSBIUlRJTV9PVVRQVVRSRVNFVF9USU1GRVY1X1RJTUNDTVA0IEhSVElNX09VVFBVVFNFVF9USU1FVl81CisjZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUZFVjZfVElNRENNUDMgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzYKKyNkZWZpbmUgSFJUSU1fT1VUUFVUUkVTRVRfVElNRkVWN19USU1EQ01QNCBIUlRJTV9PVVRQVVRTRVRfVElNRVZfNworI2RlZmluZSBIUlRJTV9PVVRQVVRSRVNFVF9USU1GRVY4X1RJTUVDTVAyIEhSVElNX09VVFBVVFNFVF9USU1FVl84CisjZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUZFVjlfVElNRUNNUDMgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzkKKyNlbmRpZiAvKiBTVE0zMkg3ICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMpCisvKiogQGJyaWVmIENvbnN0YW50cyBkZWZpbmluZyBhdmFpbGFibGUgc291cmNlcyBhc3NvY2lhdGVkIHRvIGV4dGVybmFsIGV2ZW50cy4KKyAqLworI2RlZmluZSBIUlRJTV9FVkVOVFNSQ18xICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgSFJUSU1fRVZFTlRTUkNfMiAoSFJUSU1fRUVDUjFfRUUxU1JDXzApCisjZGVmaW5lIEhSVElNX0VWRU5UU1JDXzMgKEhSVElNX0VFQ1IxX0VFMVNSQ18xKQorI2RlZmluZSBIUlRJTV9FVkVOVFNSQ180IChIUlRJTV9FRUNSMV9FRTFTUkNfMSB8IEhSVElNX0VFQ1IxX0VFMVNSQ18wKQorCisvKiogQGJyaWVmIENvbnN0YW50cyBkZWZpbmluZyB0aGUgRExMIGNhbGlicmF0aW9uIHBlcmlvZHMgKGluIG1pY3JvIHNlY29uZHMpCisgKi8KKyNkZWZpbmUgSFJUSU1fQ0FMSUJSQVRJT05SQVRFXzczMDAgMHgwMDAwMDAwMFUKKyNkZWZpbmUgSFJUSU1fQ0FMSUJSQVRJT05SQVRFXzkxMCAoSFJUSU1fRExMQ1JfQ0FMUlRFXzApCisjZGVmaW5lIEhSVElNX0NBTElCUkFUSU9OUkFURV8xMTQgKEhSVElNX0RMTENSX0NBTFJURV8xKQorI2RlZmluZSBIUlRJTV9DQUxJQlJBVElPTlJBVEVfMTQgKEhSVElNX0RMTENSX0NBTFJURV8xIHwgSFJUSU1fRExMQ1JfQ0FMUlRFXzApCisjZW5kaWYgLyogU1RNMzJGMyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBIQUxfSTJDX0FsaWFzZWRfRGVmaW5lcyBIQUwgSTJDIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvcgorICogbGVnYWN5IHB1cnBvc2UKKyAqIEB7CisgKi8KKyNkZWZpbmUgSTJDX0RVQUxBRERSRVNTX0RJU0FCTEVEIEkyQ19EVUFMQUREUkVTU19ESVNBQkxFCisjZGVmaW5lIEkyQ19EVUFMQUREUkVTU19FTkFCTEVEIEkyQ19EVUFMQUREUkVTU19FTkFCTEUKKyNkZWZpbmUgSTJDX0dFTkVSQUxDQUxMX0RJU0FCTEVEIEkyQ19HRU5FUkFMQ0FMTF9ESVNBQkxFCisjZGVmaW5lIEkyQ19HRU5FUkFMQ0FMTF9FTkFCTEVEIEkyQ19HRU5FUkFMQ0FMTF9FTkFCTEUKKyNkZWZpbmUgSTJDX05PU1RSRVRDSF9ESVNBQkxFRCBJMkNfTk9TVFJFVENIX0RJU0FCTEUKKyNkZWZpbmUgSTJDX05PU1RSRVRDSF9FTkFCTEVEIEkyQ19OT1NUUkVUQ0hfRU5BQkxFCisjZGVmaW5lIEkyQ19BTkFMT0dGSUxURVJfRU5BQkxFRCBJMkNfQU5BTE9HRklMVEVSX0VOQUJMRQorI2RlZmluZSBJMkNfQU5BTE9HRklMVEVSX0RJU0FCTEVEIEkyQ19BTkFMT0dGSUxURVJfRElTQUJMRQorI2lmIGRlZmluZWQoU1RNMzJGMCkgfHwgZGVmaW5lZChTVE0zMkYxKSB8fCBkZWZpbmVkKFNUTTMyRjMpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRzApIHx8IGRlZmluZWQoU1RNMzJMNCkgfHwgZGVmaW5lZChTVE0zMkwxKSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkY3KQorI2RlZmluZSBIQUxfSTJDX1NUQVRFX01FTV9CVVNZX1RYIEhBTF9JMkNfU1RBVEVfQlVTWV9UWAorI2RlZmluZSBIQUxfSTJDX1NUQVRFX01FTV9CVVNZX1JYIEhBTF9JMkNfU1RBVEVfQlVTWV9SWAorI2RlZmluZSBIQUxfSTJDX1NUQVRFX01BU1RFUl9CVVNZX1RYIEhBTF9JMkNfU1RBVEVfQlVTWV9UWAorI2RlZmluZSBIQUxfSTJDX1NUQVRFX01BU1RFUl9CVVNZX1JYIEhBTF9JMkNfU1RBVEVfQlVTWV9SWAorI2RlZmluZSBIQUxfSTJDX1NUQVRFX1NMQVZFX0JVU1lfVFggSEFMX0kyQ19TVEFURV9CVVNZX1RYCisjZGVmaW5lIEhBTF9JMkNfU1RBVEVfU0xBVkVfQlVTWV9SWCBIQUxfSTJDX1NUQVRFX0JVU1lfUlgKKyNlbmRpZgorLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0lSREFfQWxpYXNlZF9EZWZpbmVzIEhBTCBJUkRBIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvcgorICogbGVnYWN5IHB1cnBvc2UKKyAqIEB7CisgKi8KKyNkZWZpbmUgSVJEQV9PTkVfQklUX1NBTVBMRV9ESVNBQkxFRCBJUkRBX09ORV9CSVRfU0FNUExFX0RJU0FCTEUKKyNkZWZpbmUgSVJEQV9PTkVfQklUX1NBTVBMRV9FTkFCTEVEIElSREFfT05FX0JJVF9TQU1QTEVfRU5BQkxFCisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEhBTF9JV0RHX0FsaWFzZWRfRGVmaW5lcyBIQUwgSVdERyBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IKKyAqIGxlZ2FjeSBwdXJwb3NlCisgKiBAeworICovCisjZGVmaW5lIEtSX0tFWV9SRUxPQUQgSVdER19LRVlfUkVMT0FECisjZGVmaW5lIEtSX0tFWV9FTkFCTEUgSVdER19LRVlfRU5BQkxFCisjZGVmaW5lIEtSX0tFWV9FV0EgSVdER19LRVlfV1JJVEVfQUNDRVNTX0VOQUJMRQorI2RlZmluZSBLUl9LRVlfRFdBIElXREdfS0VZX1dSSVRFX0FDQ0VTU19ESVNBQkxFCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBIQUxfTFBUSU1fQWxpYXNlZF9EZWZpbmVzIEhBTCBMUFRJTSBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IKKyAqIGxlZ2FjeSBwdXJwb3NlCisgKiBAeworICovCisKKyNkZWZpbmUgTFBUSU1fQ0xPQ0tTQU1QTEVUSU1FX0RJUkVDVFRSQU5TSVNUSU9OIFwKKyAgTFBUSU1fQ0xPQ0tTQU1QTEVUSU1FX0RJUkVDVFRSQU5TSVRJT04KKyNkZWZpbmUgTFBUSU1fQ0xPQ0tTQU1QTEVUSU1FXzJUUkFOU0lTVElPTlMgTFBUSU1fQ0xPQ0tTQU1QTEVUSU1FXzJUUkFOU0lUSU9OUworI2RlZmluZSBMUFRJTV9DTE9DS1NBTVBMRVRJTUVfNFRSQU5TSVNUSU9OUyBMUFRJTV9DTE9DS1NBTVBMRVRJTUVfNFRSQU5TSVRJT05TCisjZGVmaW5lIExQVElNX0NMT0NLU0FNUExFVElNRV84VFJBTlNJU1RJT05TIExQVElNX0NMT0NLU0FNUExFVElNRV84VFJBTlNJVElPTlMKKworI2RlZmluZSBMUFRJTV9DTE9DS1BPTEFSSVRZX1JJU0lOR0VER0UgTFBUSU1fQ0xPQ0tQT0xBUklUWV9SSVNJTkcKKyNkZWZpbmUgTFBUSU1fQ0xPQ0tQT0xBUklUWV9GQUxMSU5HRURHRSBMUFRJTV9DTE9DS1BPTEFSSVRZX0ZBTExJTkcKKyNkZWZpbmUgTFBUSU1fQ0xPQ0tQT0xBUklUWV9CT1RIRURHRVMgTFBUSU1fQ0xPQ0tQT0xBUklUWV9SSVNJTkdfRkFMTElORworCisjZGVmaW5lIExQVElNX1RSSUdTQU1QTEVUSU1FX0RJUkVDVFRSQU5TSVNUSU9OIFwKKyAgTFBUSU1fVFJJR1NBTVBMRVRJTUVfRElSRUNUVFJBTlNJVElPTgorI2RlZmluZSBMUFRJTV9UUklHU0FNUExFVElNRV8yVFJBTlNJU1RJT05TIExQVElNX1RSSUdTQU1QTEVUSU1FXzJUUkFOU0lUSU9OUworI2RlZmluZSBMUFRJTV9UUklHU0FNUExFVElNRV80VFJBTlNJU1RJT05TIExQVElNX1RSSUdTQU1QTEVUSU1FXzRUUkFOU0lUSU9OUworI2RlZmluZSBMUFRJTV9UUklHU0FNUExFVElNRV84VFJBTlNJU1RJT05TIExQVElNX1RSSUdTQU1QTEVUSU1FXzhUUkFOU0lUSU9OUworCisvKiBUaGUgZm9sbG93aW5nIDMgZGVmaW5pdGlvbiBoYXZlIGFsc28gYmVlbiBwcmVzZW50IGluIGEgdGVtcG9yYXJ5IHZlcnNpb24gb2YKKyAqIGxwdGltLmggKi8KKy8qIFRoZXkgbmVlZCB0byBiZSByZW5hbWVkIGFsc28gdG8gdGhlIHJpZ2h0IG5hbWUsIGp1c3QgaW4gY2FzZSAqLworI2RlZmluZSBMUFRJTV9UUklHU0FNUExFVElNRV8yVFJBTlNJVElPTiBMUFRJTV9UUklHU0FNUExFVElNRV8yVFJBTlNJVElPTlMKKyNkZWZpbmUgTFBUSU1fVFJJR1NBTVBMRVRJTUVfNFRSQU5TSVRJT04gTFBUSU1fVFJJR1NBTVBMRVRJTUVfNFRSQU5TSVRJT05TCisjZGVmaW5lIExQVElNX1RSSUdTQU1QTEVUSU1FXzhUUkFOU0lUSU9OIExQVElNX1RSSUdTQU1QTEVUSU1FXzhUUkFOU0lUSU9OUworCisvKiogQGRlZmdyb3VwIEhBTF9MUFRJTV9BbGlhc2VkX0RlZmluZXMgSEFMIExQVElNIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvcgorICogbGVnYWN5IHB1cnBvc2UKKyAqIEB7CisgKi8KKyNkZWZpbmUgSEFMX0xQVElNX1JlYWRDb21wYXJlIEhBTF9MUFRJTV9SZWFkQ2FwdHVyZWRWYWx1ZQorLyoqCisgKiBAfQorICovCisKKyNpZiBkZWZpbmVkKFNUTTMyVTUpCisjZGVmaW5lIExQVElNX0lTUl9DQzEgTFBUSU1fSVNSX0NDMUlGCisjZGVmaW5lIExQVElNX0lTUl9DQzIgTFBUSU1fSVNSX0NDMklGCisjZGVmaW5lIExQVElNX0NIQU5ORUxfQUxMIDB4MDAwMDAwMDBVCisjZW5kaWYgLyogU1RNMzJVNSAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX05BTkRfQWxpYXNlZF9EZWZpbmVzIEhBTCBOQU5EIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvcgorICogbGVnYWN5IHB1cnBvc2UKKyAqIEB7CisgKi8KKyNkZWZpbmUgSEFMX05BTkRfUmVhZF9QYWdlIEhBTF9OQU5EX1JlYWRfUGFnZV84YgorI2RlZmluZSBIQUxfTkFORF9Xcml0ZV9QYWdlIEhBTF9OQU5EX1dyaXRlX1BhZ2VfOGIKKyNkZWZpbmUgSEFMX05BTkRfUmVhZF9TcGFyZUFyZWEgSEFMX05BTkRfUmVhZF9TcGFyZUFyZWFfOGIKKyNkZWZpbmUgSEFMX05BTkRfV3JpdGVfU3BhcmVBcmVhIEhBTF9OQU5EX1dyaXRlX1NwYXJlQXJlYV84YgorCisjZGVmaW5lIE5BTkRfQWRkcmVzc1R5cGVkZWYgTkFORF9BZGRyZXNzVHlwZURlZgorCisjZGVmaW5lIF9fQVJSQVlfQUREUkVTUyBBUlJBWV9BRERSRVNTCisjZGVmaW5lIF9fQUREUl8xc3RfQ1lDTEUgQUREUl8xU1RfQ1lDTEUKKyNkZWZpbmUgX19BRERSXzJuZF9DWUNMRSBBRERSXzJORF9DWUNMRQorI2RlZmluZSBfX0FERFJfM3JkX0NZQ0xFIEFERFJfM1JEX0NZQ0xFCisjZGVmaW5lIF9fQUREUl80dGhfQ1lDTEUgQUREUl80VEhfQ1lDTEUKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEhBTF9OT1JfQWxpYXNlZF9EZWZpbmVzIEhBTCBOT1IgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yCisgKiBsZWdhY3kgcHVycG9zZQorICogQHsKKyAqLworI2RlZmluZSBOT1JfU3RhdHVzVHlwZWRlZiBIQUxfTk9SX1N0YXR1c1R5cGVEZWYKKyNkZWZpbmUgTk9SX1NVQ0NFU1MgSEFMX05PUl9TVEFUVVNfU1VDQ0VTUworI2RlZmluZSBOT1JfT05HT0lORyBIQUxfTk9SX1NUQVRVU19PTkdPSU5HCisjZGVmaW5lIE5PUl9FUlJPUiBIQUxfTk9SX1NUQVRVU19FUlJPUgorI2RlZmluZSBOT1JfVElNRU9VVCBIQUxfTk9SX1NUQVRVU19USU1FT1VUCisKKyNkZWZpbmUgX19OT1JfV1JJVEUgTk9SX1dSSVRFCisjZGVmaW5lIF9fTk9SX0FERFJfU0hJRlQgTk9SX0FERFJfU0hJRlQKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEhBTF9PUEFNUF9BbGlhc2VkX0RlZmluZXMgSEFMIE9QQU1QIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvcgorICogbGVnYWN5IHB1cnBvc2UKKyAqIEB7CisgKi8KKworI2RlZmluZSBPUEFNUF9OT05JTlZFUlRJTkdJTlBVVF9WUDAgT1BBTVBfTk9OSU5WRVJUSU5HSU5QVVRfSU8wCisjZGVmaW5lIE9QQU1QX05PTklOVkVSVElOR0lOUFVUX1ZQMSBPUEFNUF9OT05JTlZFUlRJTkdJTlBVVF9JTzEKKyNkZWZpbmUgT1BBTVBfTk9OSU5WRVJUSU5HSU5QVVRfVlAyIE9QQU1QX05PTklOVkVSVElOR0lOUFVUX0lPMgorI2RlZmluZSBPUEFNUF9OT05JTlZFUlRJTkdJTlBVVF9WUDMgT1BBTVBfTk9OSU5WRVJUSU5HSU5QVVRfSU8zCisKKyNkZWZpbmUgT1BBTVBfU0VDX05PTklOVkVSVElOR0lOUFVUX1ZQMCBPUEFNUF9TRUNfTk9OSU5WRVJUSU5HSU5QVVRfSU8wCisjZGVmaW5lIE9QQU1QX1NFQ19OT05JTlZFUlRJTkdJTlBVVF9WUDEgT1BBTVBfU0VDX05PTklOVkVSVElOR0lOUFVUX0lPMQorI2RlZmluZSBPUEFNUF9TRUNfTk9OSU5WRVJUSU5HSU5QVVRfVlAyIE9QQU1QX1NFQ19OT05JTlZFUlRJTkdJTlBVVF9JTzIKKyNkZWZpbmUgT1BBTVBfU0VDX05PTklOVkVSVElOR0lOUFVUX1ZQMyBPUEFNUF9TRUNfTk9OSU5WRVJUSU5HSU5QVVRfSU8zCisKKyNkZWZpbmUgT1BBTVBfSU5WRVJUSU5HSU5QVVRfVk0wIE9QQU1QX0lOVkVSVElOR0lOUFVUX0lPMAorI2RlZmluZSBPUEFNUF9JTlZFUlRJTkdJTlBVVF9WTTEgT1BBTVBfSU5WRVJUSU5HSU5QVVRfSU8xCisKKyNkZWZpbmUgSU9QQU1QX0lOVkVSVElOR0lOUFVUX1ZNMCBPUEFNUF9JTlZFUlRJTkdJTlBVVF9JTzAKKyNkZWZpbmUgSU9QQU1QX0lOVkVSVElOR0lOUFVUX1ZNMSBPUEFNUF9JTlZFUlRJTkdJTlBVVF9JTzEKKworI2RlZmluZSBPUEFNUF9TRUNfSU5WRVJUSU5HSU5QVVRfVk0wIE9QQU1QX1NFQ19JTlZFUlRJTkdJTlBVVF9JTzAKKyNkZWZpbmUgT1BBTVBfU0VDX0lOVkVSVElOR0lOUFVUX1ZNMSBPUEFNUF9TRUNfSU5WRVJUSU5HSU5QVVRfSU8xCisKKyNkZWZpbmUgT1BBTVBfSU5WRVJUSU5HSU5QVVRfVklOTSBPUEFNUF9TRUNfSU5WRVJUSU5HSU5QVVRfSU8xCisKKyNkZWZpbmUgT1BBTVBfUEdBQ09OTkVDVF9OTyBPUEFNUF9QR0FfQ09OTkVDVF9JTlZFUlRJTkdJTlBVVF9OTworI2RlZmluZSBPUEFNUF9QR0FDT05ORUNUX1ZNMCBPUEFNUF9QR0FfQ09OTkVDVF9JTlZFUlRJTkdJTlBVVF9JTzAKKyNkZWZpbmUgT1BBTVBfUEdBQ09OTkVDVF9WTTEgT1BBTVBfUEdBX0NPTk5FQ1RfSU5WRVJUSU5HSU5QVVRfSU8xCisKKyNpZiBkZWZpbmVkKFNUTTMyTDEpIHx8IGRlZmluZWQoU1RNMzJMNCkgfHwgZGVmaW5lZChTVE0zMkw1KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkg3KSB8fCBkZWZpbmVkKFNUTTMyRzQpIHx8IGRlZmluZWQoU1RNMzJVNSkKKyNkZWZpbmUgSEFMX09QQU1QX01TUF9JTklUX0NCX0lEIEhBTF9PUEFNUF9NU1BJTklUX0NCX0lECisjZGVmaW5lIEhBTF9PUEFNUF9NU1BfREVJTklUX0NCX0lEIEhBTF9PUEFNUF9NU1BERUlOSVRfQ0JfSUQKKyNlbmRpZgorCisjaWYgZGVmaW5lZChTVE0zMkw0KSB8fCBkZWZpbmVkKFNUTTMyTDUpCisjZGVmaW5lIE9QQU1QX1BPV0VSTU9ERV9OT1JNQUwgT1BBTVBfUE9XRVJNT0RFX05PUk1BTFBPV0VSCisjZWxpZiBkZWZpbmVkKFNUTTMyRzQpCisjZGVmaW5lIE9QQU1QX1BPV0VSTU9ERV9OT1JNQUwgT1BBTVBfUE9XRVJNT0RFX05PUk1BTFNQRUVECisjZW5kaWYKKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0kyU19BbGlhc2VkX0RlZmluZXMgSEFMIEkyUyBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IKKyAqIGxlZ2FjeSBwdXJwb3NlCisgKiBAeworICovCisjZGVmaW5lIEkyU19TVEFOREFSRF9QSElMTElQUyBJMlNfU1RBTkRBUkRfUEhJTElQUworCisjaWYgZGVmaW5lZChTVE0zMkg3KQorI2RlZmluZSBJMlNfSVRfVFhFIEkyU19JVF9UWFAKKyNkZWZpbmUgSTJTX0lUX1JYTkUgSTJTX0lUX1JYUAorCisjZGVmaW5lIEkyU19GTEFHX1RYRSBJMlNfRkxBR19UWFAKKyNkZWZpbmUgSTJTX0ZMQUdfUlhORSBJMlNfRkxBR19SWFAKKyNlbmRpZgorCisjaWYgZGVmaW5lZChTVE0zMkY3KQorI2RlZmluZSBJMlNfQ0xPQ0tfU1lTQ0xLIEkyU19DTE9DS19QTEwKKyNlbmRpZgorLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1BDQ0FSRF9BbGlhc2VkX0RlZmluZXMgSEFMIFBDQ0FSRCBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZAorICogZm9yIGxlZ2FjeSBwdXJwb3NlCisgKiBAeworICovCisKKy8qIENvbXBhY3QgRmxhc2gtQVRBIHJlZ2lzdGVycyBkZXNjcmlwdGlvbiAqLworI2RlZmluZSBDRl9EQVRBIEFUQV9EQVRBCisjZGVmaW5lIENGX1NFQ1RPUl9DT1VOVCBBVEFfU0VDVE9SX0NPVU5UCisjZGVmaW5lIENGX1NFQ1RPUl9OVU1CRVIgQVRBX1NFQ1RPUl9OVU1CRVIKKyNkZWZpbmUgQ0ZfQ1lMSU5ERVJfTE9XIEFUQV9DWUxJTkRFUl9MT1cKKyNkZWZpbmUgQ0ZfQ1lMSU5ERVJfSElHSCBBVEFfQ1lMSU5ERVJfSElHSAorI2RlZmluZSBDRl9DQVJEX0hFQUQgQVRBX0NBUkRfSEVBRAorI2RlZmluZSBDRl9TVEFUVVNfQ01EIEFUQV9TVEFUVVNfQ01ECisjZGVmaW5lIENGX1NUQVRVU19DTURfQUxURVJOQVRFIEFUQV9TVEFUVVNfQ01EX0FMVEVSTkFURQorI2RlZmluZSBDRl9DT01NT05fREFUQV9BUkVBIEFUQV9DT01NT05fREFUQV9BUkVBCisKKy8qIENvbXBhY3QgRmxhc2gtQVRBIGNvbW1hbmRzICovCisjZGVmaW5lIENGX1JFQURfU0VDVE9SX0NNRCBBVEFfUkVBRF9TRUNUT1JfQ01ECisjZGVmaW5lIENGX1dSSVRFX1NFQ1RPUl9DTUQgQVRBX1dSSVRFX1NFQ1RPUl9DTUQKKyNkZWZpbmUgQ0ZfRVJBU0VfU0VDVE9SX0NNRCBBVEFfRVJBU0VfU0VDVE9SX0NNRAorI2RlZmluZSBDRl9JREVOVElGWV9DTUQgQVRBX0lERU5USUZZX0NNRAorCisjZGVmaW5lIFBDQ0FSRF9TdGF0dXNUeXBlZGVmIEhBTF9QQ0NBUkRfU3RhdHVzVHlwZURlZgorI2RlZmluZSBQQ0NBUkRfU1VDQ0VTUyBIQUxfUENDQVJEX1NUQVRVU19TVUNDRVNTCisjZGVmaW5lIFBDQ0FSRF9PTkdPSU5HIEhBTF9QQ0NBUkRfU1RBVFVTX09OR09JTkcKKyNkZWZpbmUgUENDQVJEX0VSUk9SIEhBTF9QQ0NBUkRfU1RBVFVTX0VSUk9SCisjZGVmaW5lIFBDQ0FSRF9USU1FT1VUIEhBTF9QQ0NBUkRfU1RBVFVTX1RJTUVPVVQKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEhBTF9SVENfQWxpYXNlZF9EZWZpbmVzIEhBTCBSVEMgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yCisgKiBsZWdhY3kgcHVycG9zZQorICogQHsKKyAqLworCisjZGVmaW5lIEZPUk1BVF9CSU4gUlRDX0ZPUk1BVF9CSU4KKyNkZWZpbmUgRk9STUFUX0JDRCBSVENfRk9STUFUX0JDRAorCisjZGVmaW5lIFJUQ19BTEFSTVNVQlNFQ09ORE1BU0tfTm9uZSBSVENfQUxBUk1TVUJTRUNPTkRNQVNLX05PTkUKKyNkZWZpbmUgUlRDX1RBTVBFUkVSQVNFQkFDS1VQX0RJU0FCTEVEIFJUQ19UQU1QRVJfRVJBU0VfQkFDS1VQX0RJU0FCTEUKKyNkZWZpbmUgUlRDX1RBTVBFUk1BU0tfRkxBR19ESVNBQkxFRCBSVENfVEFNUEVSTUFTS19GTEFHX0RJU0FCTEUKKyNkZWZpbmUgUlRDX1RBTVBFUk1BU0tfRkxBR19FTkFCTEVEIFJUQ19UQU1QRVJNQVNLX0ZMQUdfRU5BQkxFCisKKyNkZWZpbmUgUlRDX01BU0tUQU1QRVJGTEFHX0RJU0FCTEVEIFJUQ19UQU1QRVJNQVNLX0ZMQUdfRElTQUJMRQorI2RlZmluZSBSVENfTUFTS1RBTVBFUkZMQUdfRU5BQkxFRCBSVENfVEFNUEVSTUFTS19GTEFHX0VOQUJMRQorI2RlZmluZSBSVENfVEFNUEVSRVJBU0VCQUNLVVBfRU5BQkxFRCBSVENfVEFNUEVSX0VSQVNFX0JBQ0tVUF9FTkFCTEUKKyNkZWZpbmUgUlRDX1RBTVBFUjFfMl9JTlRFUlJVUFQgUlRDX0FMTF9UQU1QRVJfSU5URVJSVVBUCisjZGVmaW5lIFJUQ19UQU1QRVIxXzJfM19JTlRFUlJVUFQgUlRDX0FMTF9UQU1QRVJfSU5URVJSVVBUCisKKyNkZWZpbmUgUlRDX1RJTUVTVEFNUFBJTl9QQzEzIFJUQ19USU1FU1RBTVBQSU5fREVGQVVMVAorI2RlZmluZSBSVENfVElNRVNUQU1QUElOX1BBMCBSVENfVElNRVNUQU1QUElOX1BPUzEKKyNkZWZpbmUgUlRDX1RJTUVTVEFNUFBJTl9QSTggUlRDX1RJTUVTVEFNUFBJTl9QT1MxCisjZGVmaW5lIFJUQ19USU1FU1RBTVBQSU5fUEMxIFJUQ19USU1FU1RBTVBQSU5fUE9TMgorCisjZGVmaW5lIFJUQ19PVVRQVVRfUkVNQVBfUEMxMyBSVENfT1VUUFVUX1JFTUFQX05PTkUKKyNkZWZpbmUgUlRDX09VVFBVVF9SRU1BUF9QQjE0IFJUQ19PVVRQVVRfUkVNQVBfUE9TMQorI2RlZmluZSBSVENfT1VUUFVUX1JFTUFQX1BCMiBSVENfT1VUUFVUX1JFTUFQX1BPUzEKKworI2RlZmluZSBSVENfVEFNUEVSUElOX1BDMTMgUlRDX1RBTVBFUlBJTl9ERUZBVUxUCisjZGVmaW5lIFJUQ19UQU1QRVJQSU5fUEEwIFJUQ19UQU1QRVJQSU5fUE9TMQorI2RlZmluZSBSVENfVEFNUEVSUElOX1BJOCBSVENfVEFNUEVSUElOX1BPUzEKKworI2lmIGRlZmluZWQoU1RNMzJINSkgfHwgZGVmaW5lZChTVE0zMkg3UlMpCisjZGVmaW5lIFRBTVBfU0VDUkVUREVWSUNFX0VSQVNFX05PTkUgVEFNUF9ERVZJQ0VTRUNSRVRTX0VSQVNFX05PTkUKKyNkZWZpbmUgVEFNUF9TRUNSRVRERVZJQ0VfRVJBU0VfQktQX1NSQU0gVEFNUF9ERVZJQ0VTRUNSRVRTX0VSQVNFX0JLUFNSQU0KKyNlbmRpZiAvKiBTVE0zMkg1IHx8IFNUTTMySDdSUyAqLworCisjaWYgZGVmaW5lZChTVE0zMldCQSkKKyNkZWZpbmUgVEFNUF9TRUNSRVRERVZJQ0VfRVJBU0VfTk9ORSBUQU1QX0RFVklDRVNFQ1JFVFNfRVJBU0VfTk9ORQorI2RlZmluZSBUQU1QX1NFQ1JFVERFVklDRV9FUkFTRV9TUkFNMiBUQU1QX0RFVklDRVNFQ1JFVFNfRVJBU0VfU1JBTTIKKyNkZWZpbmUgVEFNUF9TRUNSRVRERVZJQ0VfRVJBU0VfUkhVSyBUQU1QX0RFVklDRVNFQ1JFVFNfRVJBU0VfUkhVSworI2RlZmluZSBUQU1QX1NFQ1JFVERFVklDRV9FUkFTRV9JQ0FDSEUgVEFNUF9ERVZJQ0VTRUNSRVRTX0VSQVNFX0lDQUNIRQorI2RlZmluZSBUQU1QX1NFQ1JFVERFVklDRV9FUkFTRV9TQUVTX0FFU19IQVNIIFwKKyAgVEFNUF9ERVZJQ0VTRUNSRVRTX0VSQVNFX1NBRVNfQUVTX0hBU0gKKyNkZWZpbmUgVEFNUF9TRUNSRVRERVZJQ0VfRVJBU0VfUEtBX1NSQU0gVEFNUF9ERVZJQ0VTRUNSRVRTX0VSQVNFX1BLQV9TUkFNCisjZGVmaW5lIFRBTVBfU0VDUkVUREVWSUNFX0VSQVNFX0FMTCBUQU1QX0RFVklDRVNFQ1JFVFNfRVJBU0VfQUxMCisjZW5kaWYgLyogU1RNMzJXQkEgKi8KKworI2lmIGRlZmluZWQoU1RNMzJINSkgfHwgZGVmaW5lZChTVE0zMldCQSkgfHwgZGVmaW5lZChTVE0zMkg3UlMpCisjZGVmaW5lIFRBTVBfU0VDUkVUREVWSUNFX0VSQVNFX0RJU0FCTEUgVEFNUF9ERVZJQ0VTRUNSRVRTX0VSQVNFX05PTkUKKyNkZWZpbmUgVEFNUF9TRUNSRVRERVZJQ0VfRVJBU0VfRU5BQkxFIFRBTVBfU0VDUkVUREVWSUNFX0VSQVNFX0FMTAorI2VuZGlmIC8qIFNUTTMySDUgfHwgU1RNMzJXQkEgfHwgU1RNMzJIN1JTICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjcpCisjZGVmaW5lIFJUQ19UQU1QQ1JfVEFNUFhFIFJUQ19UQU1QRVJfRU5BQkxFX0JJVFNfTUFTSworI2RlZmluZSBSVENfVEFNUENSX1RBTVBYSUUgUlRDX1RBTVBFUl9JVF9FTkFCTEVfQklUU19NQVNLCisjZW5kaWYgLyogU1RNMzJGNyAqLworCisjaWYgZGVmaW5lZChTVE0zMkg3KQorI2RlZmluZSBSVENfVEFNUENSX1RBTVBYRSBSVENfVEFNUEVSX1gKKyNkZWZpbmUgUlRDX1RBTVBDUl9UQU1QWElFIFJUQ19UQU1QRVJfWF9JTlRFUlJVUFQKKyNlbmRpZiAvKiBTVE0zMkg3ICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjcpIHx8IGRlZmluZWQoU1RNMzJINykgfHwgZGVmaW5lZChTVE0zMkwwKQorI2RlZmluZSBSVENfVEFNUEVSMV9JTlRFUlJVUFQgUlRDX0lUX1RBTVAxCisjZGVmaW5lIFJUQ19UQU1QRVIyX0lOVEVSUlVQVCBSVENfSVRfVEFNUDIKKyNkZWZpbmUgUlRDX1RBTVBFUjNfSU5URVJSVVBUIFJUQ19JVF9UQU1QMworI2RlZmluZSBSVENfQUxMX1RBTVBFUl9JTlRFUlJVUFQgUlRDX0lUX1RBTVAKKyNlbmRpZiAvKiBTVE0zMkY3IHx8IFNUTTMySDcgfHwgU1RNMzJMMCAqLworCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBIQUxfU01BUlRDQVJEX0FsaWFzZWRfRGVmaW5lcyBIQUwgU01BUlRDQVJEIEFsaWFzZWQgRGVmaW5lcworICogbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAqIEB7CisgKi8KKyNkZWZpbmUgU01BUlRDQVJEX05BQ0tfRU5BQkxFRCBTTUFSVENBUkRfTkFDS19FTkFCTEUKKyNkZWZpbmUgU01BUlRDQVJEX05BQ0tfRElTQUJMRUQgU01BUlRDQVJEX05BQ0tfRElTQUJMRQorCisjZGVmaW5lIFNNQVJUQ0FSRF9PTkVCSVRfU0FNUExJTkdfRElTQUJMRUQgU01BUlRDQVJEX09ORV9CSVRfU0FNUExFX0RJU0FCTEUKKyNkZWZpbmUgU01BUlRDQVJEX09ORUJJVF9TQU1QTElOR19FTkFCTEVEIFNNQVJUQ0FSRF9PTkVfQklUX1NBTVBMRV9FTkFCTEUKKyNkZWZpbmUgU01BUlRDQVJEX09ORUJJVF9TQU1QTElOR19ESVNBQkxFIFNNQVJUQ0FSRF9PTkVfQklUX1NBTVBMRV9ESVNBQkxFCisjZGVmaW5lIFNNQVJUQ0FSRF9PTkVCSVRfU0FNUExJTkdfRU5BQkxFIFNNQVJUQ0FSRF9PTkVfQklUX1NBTVBMRV9FTkFCTEUKKworI2RlZmluZSBTTUFSVENBUkRfVElNRU9VVF9ESVNBQkxFRCBTTUFSVENBUkRfVElNRU9VVF9ESVNBQkxFCisjZGVmaW5lIFNNQVJUQ0FSRF9USU1FT1VUX0VOQUJMRUQgU01BUlRDQVJEX1RJTUVPVVRfRU5BQkxFCisKKyNkZWZpbmUgU01BUlRDQVJEX0xBU1RCSVRfRElTQUJMRUQgU01BUlRDQVJEX0xBU1RCSVRfRElTQUJMRQorI2RlZmluZSBTTUFSVENBUkRfTEFTVEJJVF9FTkFCTEVEIFNNQVJUQ0FSRF9MQVNUQklUX0VOQUJMRQorLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1NNQlVTX0FsaWFzZWRfRGVmaW5lcyBIQUwgU01CVVMgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yCisgKiBsZWdhY3kgcHVycG9zZQorICogQHsKKyAqLworI2RlZmluZSBTTUJVU19EVUFMQUREUkVTU19ESVNBQkxFRCBTTUJVU19EVUFMQUREUkVTU19ESVNBQkxFCisjZGVmaW5lIFNNQlVTX0RVQUxBRERSRVNTX0VOQUJMRUQgU01CVVNfRFVBTEFERFJFU1NfRU5BQkxFCisjZGVmaW5lIFNNQlVTX0dFTkVSQUxDQUxMX0RJU0FCTEVEIFNNQlVTX0dFTkVSQUxDQUxMX0RJU0FCTEUKKyNkZWZpbmUgU01CVVNfR0VORVJBTENBTExfRU5BQkxFRCBTTUJVU19HRU5FUkFMQ0FMTF9FTkFCTEUKKyNkZWZpbmUgU01CVVNfTk9TVFJFVENIX0RJU0FCTEVEIFNNQlVTX05PU1RSRVRDSF9ESVNBQkxFCisjZGVmaW5lIFNNQlVTX05PU1RSRVRDSF9FTkFCTEVEIFNNQlVTX05PU1RSRVRDSF9FTkFCTEUKKyNkZWZpbmUgU01CVVNfQU5BTE9HRklMVEVSX0VOQUJMRUQgU01CVVNfQU5BTE9HRklMVEVSX0VOQUJMRQorI2RlZmluZSBTTUJVU19BTkFMT0dGSUxURVJfRElTQUJMRUQgU01CVVNfQU5BTE9HRklMVEVSX0RJU0FCTEUKKyNkZWZpbmUgU01CVVNfUEVDX0RJU0FCTEVEIFNNQlVTX1BFQ19ESVNBQkxFCisjZGVmaW5lIFNNQlVTX1BFQ19FTkFCTEVEIFNNQlVTX1BFQ19FTkFCTEUKKyNkZWZpbmUgSEFMX1NNQlVTX1NUQVRFX1NMQVZFX0xJU1RFTiBIQUxfU01CVVNfU1RBVEVfTElTVEVOCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBIQUxfU1BJX0FsaWFzZWRfRGVmaW5lcyBIQUwgU1BJIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvcgorICogbGVnYWN5IHB1cnBvc2UKKyAqIEB7CisgKi8KKyNkZWZpbmUgU1BJX1RJTU9ERV9ESVNBQkxFRCBTUElfVElNT0RFX0RJU0FCTEUKKyNkZWZpbmUgU1BJX1RJTU9ERV9FTkFCTEVEIFNQSV9USU1PREVfRU5BQkxFCisKKyNkZWZpbmUgU1BJX0NSQ0NBTENVTEFUSU9OX0RJU0FCTEVEIFNQSV9DUkNDQUxDVUxBVElPTl9ESVNBQkxFCisjZGVmaW5lIFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEVEIFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUKKworI2RlZmluZSBTUElfTlNTX1BVTFNFX0RJU0FCTEVEIFNQSV9OU1NfUFVMU0VfRElTQUJMRQorI2RlZmluZSBTUElfTlNTX1BVTFNFX0VOQUJMRUQgU1BJX05TU19QVUxTRV9FTkFCTEUKKworI2lmIGRlZmluZWQoU1RNMzJINykKKworI2RlZmluZSBTUElfRkxBR19UWEUgU1BJX0ZMQUdfVFhQCisjZGVmaW5lIFNQSV9GTEFHX1JYTkUgU1BJX0ZMQUdfUlhQCisKKyNkZWZpbmUgU1BJX0lUX1RYRSBTUElfSVRfVFhQCisjZGVmaW5lIFNQSV9JVF9SWE5FIFNQSV9JVF9SWFAKKworI2RlZmluZSBTUElfRlJMVkxfRU1QVFkgU1BJX1JYX0ZJRk9fMFBBQ0tFVAorI2RlZmluZSBTUElfRlJMVkxfUVVBUlRFUl9GVUxMIFNQSV9SWF9GSUZPXzFQQUNLRVQKKyNkZWZpbmUgU1BJX0ZSTFZMX0hBTEZfRlVMTCBTUElfUlhfRklGT18yUEFDS0VUCisjZGVmaW5lIFNQSV9GUkxWTF9GVUxMIFNQSV9SWF9GSUZPXzNQQUNLRVQKKworI2VuZGlmIC8qIFNUTTMySDcgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1RJTV9BbGlhc2VkX0RlZmluZXMgSEFMIFRJTSBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IKKyAqIGxlZ2FjeSBwdXJwb3NlCisgKiBAeworICovCisjZGVmaW5lIENDRVJfQ0N4RV9NQVNLIFRJTV9DQ0VSX0NDeEVfTUFTSworI2RlZmluZSBDQ0VSX0NDeE5FX01BU0sgVElNX0NDRVJfQ0N4TkVfTUFTSworCisjZGVmaW5lIFRJTV9ETUFCYXNlX0NSMSBUSU1fRE1BQkFTRV9DUjEKKyNkZWZpbmUgVElNX0RNQUJhc2VfQ1IyIFRJTV9ETUFCQVNFX0NSMgorI2RlZmluZSBUSU1fRE1BQmFzZV9TTUNSIFRJTV9ETUFCQVNFX1NNQ1IKKyNkZWZpbmUgVElNX0RNQUJhc2VfRElFUiBUSU1fRE1BQkFTRV9ESUVSCisjZGVmaW5lIFRJTV9ETUFCYXNlX1NSIFRJTV9ETUFCQVNFX1NSCisjZGVmaW5lIFRJTV9ETUFCYXNlX0VHUiBUSU1fRE1BQkFTRV9FR1IKKyNkZWZpbmUgVElNX0RNQUJhc2VfQ0NNUjEgVElNX0RNQUJBU0VfQ0NNUjEKKyNkZWZpbmUgVElNX0RNQUJhc2VfQ0NNUjIgVElNX0RNQUJBU0VfQ0NNUjIKKyNkZWZpbmUgVElNX0RNQUJhc2VfQ0NFUiBUSU1fRE1BQkFTRV9DQ0VSCisjZGVmaW5lIFRJTV9ETUFCYXNlX0NOVCBUSU1fRE1BQkFTRV9DTlQKKyNkZWZpbmUgVElNX0RNQUJhc2VfUFNDIFRJTV9ETUFCQVNFX1BTQworI2RlZmluZSBUSU1fRE1BQmFzZV9BUlIgVElNX0RNQUJBU0VfQVJSCisjZGVmaW5lIFRJTV9ETUFCYXNlX1JDUiBUSU1fRE1BQkFTRV9SQ1IKKyNkZWZpbmUgVElNX0RNQUJhc2VfQ0NSMSBUSU1fRE1BQkFTRV9DQ1IxCisjZGVmaW5lIFRJTV9ETUFCYXNlX0NDUjIgVElNX0RNQUJBU0VfQ0NSMgorI2RlZmluZSBUSU1fRE1BQmFzZV9DQ1IzIFRJTV9ETUFCQVNFX0NDUjMKKyNkZWZpbmUgVElNX0RNQUJhc2VfQ0NSNCBUSU1fRE1BQkFTRV9DQ1I0CisjZGVmaW5lIFRJTV9ETUFCYXNlX0JEVFIgVElNX0RNQUJBU0VfQkRUUgorI2RlZmluZSBUSU1fRE1BQmFzZV9EQ1IgVElNX0RNQUJBU0VfRENSCisjZGVmaW5lIFRJTV9ETUFCYXNlX0RNQVIgVElNX0RNQUJBU0VfRE1BUgorI2RlZmluZSBUSU1fRE1BQmFzZV9PUjEgVElNX0RNQUJBU0VfT1IxCisjZGVmaW5lIFRJTV9ETUFCYXNlX0NDTVIzIFRJTV9ETUFCQVNFX0NDTVIzCisjZGVmaW5lIFRJTV9ETUFCYXNlX0NDUjUgVElNX0RNQUJBU0VfQ0NSNQorI2RlZmluZSBUSU1fRE1BQmFzZV9DQ1I2IFRJTV9ETUFCQVNFX0NDUjYKKyNkZWZpbmUgVElNX0RNQUJhc2VfT1IyIFRJTV9ETUFCQVNFX09SMgorI2RlZmluZSBUSU1fRE1BQmFzZV9PUjMgVElNX0RNQUJBU0VfT1IzCisjZGVmaW5lIFRJTV9ETUFCYXNlX09SIFRJTV9ETUFCQVNFX09SCisKKyNkZWZpbmUgVElNX0V2ZW50U291cmNlX1VwZGF0ZSBUSU1fRVZFTlRTT1VSQ0VfVVBEQVRFCisjZGVmaW5lIFRJTV9FdmVudFNvdXJjZV9DQzEgVElNX0VWRU5UU09VUkNFX0NDMQorI2RlZmluZSBUSU1fRXZlbnRTb3VyY2VfQ0MyIFRJTV9FVkVOVFNPVVJDRV9DQzIKKyNkZWZpbmUgVElNX0V2ZW50U291cmNlX0NDMyBUSU1fRVZFTlRTT1VSQ0VfQ0MzCisjZGVmaW5lIFRJTV9FdmVudFNvdXJjZV9DQzQgVElNX0VWRU5UU09VUkNFX0NDNAorI2RlZmluZSBUSU1fRXZlbnRTb3VyY2VfQ09NIFRJTV9FVkVOVFNPVVJDRV9DT00KKyNkZWZpbmUgVElNX0V2ZW50U291cmNlX1RyaWdnZXIgVElNX0VWRU5UU09VUkNFX1RSSUdHRVIKKyNkZWZpbmUgVElNX0V2ZW50U291cmNlX0JyZWFrIFRJTV9FVkVOVFNPVVJDRV9CUkVBSworI2RlZmluZSBUSU1fRXZlbnRTb3VyY2VfQnJlYWsyIFRJTV9FVkVOVFNPVVJDRV9CUkVBSzIKKworI2RlZmluZSBUSU1fRE1BQnVyc3RMZW5ndGhfMVRyYW5zZmVyIFRJTV9ETUFCVVJTVExFTkdUSF8xVFJBTlNGRVIKKyNkZWZpbmUgVElNX0RNQUJ1cnN0TGVuZ3RoXzJUcmFuc2ZlcnMgVElNX0RNQUJVUlNUTEVOR1RIXzJUUkFOU0ZFUlMKKyNkZWZpbmUgVElNX0RNQUJ1cnN0TGVuZ3RoXzNUcmFuc2ZlcnMgVElNX0RNQUJVUlNUTEVOR1RIXzNUUkFOU0ZFUlMKKyNkZWZpbmUgVElNX0RNQUJ1cnN0TGVuZ3RoXzRUcmFuc2ZlcnMgVElNX0RNQUJVUlNUTEVOR1RIXzRUUkFOU0ZFUlMKKyNkZWZpbmUgVElNX0RNQUJ1cnN0TGVuZ3RoXzVUcmFuc2ZlcnMgVElNX0RNQUJVUlNUTEVOR1RIXzVUUkFOU0ZFUlMKKyNkZWZpbmUgVElNX0RNQUJ1cnN0TGVuZ3RoXzZUcmFuc2ZlcnMgVElNX0RNQUJVUlNUTEVOR1RIXzZUUkFOU0ZFUlMKKyNkZWZpbmUgVElNX0RNQUJ1cnN0TGVuZ3RoXzdUcmFuc2ZlcnMgVElNX0RNQUJVUlNUTEVOR1RIXzdUUkFOU0ZFUlMKKyNkZWZpbmUgVElNX0RNQUJ1cnN0TGVuZ3RoXzhUcmFuc2ZlcnMgVElNX0RNQUJVUlNUTEVOR1RIXzhUUkFOU0ZFUlMKKyNkZWZpbmUgVElNX0RNQUJ1cnN0TGVuZ3RoXzlUcmFuc2ZlcnMgVElNX0RNQUJVUlNUTEVOR1RIXzlUUkFOU0ZFUlMKKyNkZWZpbmUgVElNX0RNQUJ1cnN0TGVuZ3RoXzEwVHJhbnNmZXJzIFRJTV9ETUFCVVJTVExFTkdUSF8xMFRSQU5TRkVSUworI2RlZmluZSBUSU1fRE1BQnVyc3RMZW5ndGhfMTFUcmFuc2ZlcnMgVElNX0RNQUJVUlNUTEVOR1RIXzExVFJBTlNGRVJTCisjZGVmaW5lIFRJTV9ETUFCdXJzdExlbmd0aF8xMlRyYW5zZmVycyBUSU1fRE1BQlVSU1RMRU5HVEhfMTJUUkFOU0ZFUlMKKyNkZWZpbmUgVElNX0RNQUJ1cnN0TGVuZ3RoXzEzVHJhbnNmZXJzIFRJTV9ETUFCVVJTVExFTkdUSF8xM1RSQU5TRkVSUworI2RlZmluZSBUSU1fRE1BQnVyc3RMZW5ndGhfMTRUcmFuc2ZlcnMgVElNX0RNQUJVUlNUTEVOR1RIXzE0VFJBTlNGRVJTCisjZGVmaW5lIFRJTV9ETUFCdXJzdExlbmd0aF8xNVRyYW5zZmVycyBUSU1fRE1BQlVSU1RMRU5HVEhfMTVUUkFOU0ZFUlMKKyNkZWZpbmUgVElNX0RNQUJ1cnN0TGVuZ3RoXzE2VHJhbnNmZXJzIFRJTV9ETUFCVVJTVExFTkdUSF8xNlRSQU5TRkVSUworI2RlZmluZSBUSU1fRE1BQnVyc3RMZW5ndGhfMTdUcmFuc2ZlcnMgVElNX0RNQUJVUlNUTEVOR1RIXzE3VFJBTlNGRVJTCisjZGVmaW5lIFRJTV9ETUFCdXJzdExlbmd0aF8xOFRyYW5zZmVycyBUSU1fRE1BQlVSU1RMRU5HVEhfMThUUkFOU0ZFUlMKKworI2lmIGRlZmluZWQoU1RNMzJMMCkKKyNkZWZpbmUgVElNMjJfVEkxX0dQSU8xIFRJTTIyX1RJMV9HUElPCisjZGVmaW5lIFRJTTIyX1RJMV9HUElPMiBUSU0yMl9USTFfR1BJTworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMpCisjZGVmaW5lIElTX1RJTV9IQUxMX0lOVEVSRkFDRV9JTlNUQU5DRSBJU19USU1fSEFMTF9TRU5TT1JfSU5URVJGQUNFX0lOU1RBTkNFCisjZW5kaWYKKworI2lmIGRlZmluZWQoU1RNMzJINykKKyNkZWZpbmUgVElNX1RJTTFfRVRSX0NPTVAxX09VVCBUSU1fVElNMV9FVFJfQ09NUDEKKyNkZWZpbmUgVElNX1RJTTFfRVRSX0NPTVAyX09VVCBUSU1fVElNMV9FVFJfQ09NUDIKKyNkZWZpbmUgVElNX1RJTThfRVRSX0NPTVAxX09VVCBUSU1fVElNOF9FVFJfQ09NUDEKKyNkZWZpbmUgVElNX1RJTThfRVRSX0NPTVAyX09VVCBUSU1fVElNOF9FVFJfQ09NUDIKKyNkZWZpbmUgVElNX1RJTTJfRVRSX0NPTVAxX09VVCBUSU1fVElNMl9FVFJfQ09NUDEKKyNkZWZpbmUgVElNX1RJTTJfRVRSX0NPTVAyX09VVCBUSU1fVElNMl9FVFJfQ09NUDIKKyNkZWZpbmUgVElNX1RJTTNfRVRSX0NPTVAxX09VVCBUSU1fVElNM19FVFJfQ09NUDEKKyNkZWZpbmUgVElNX1RJTTFfVEkxX0NPTVAxX09VVCBUSU1fVElNMV9USTFfQ09NUDEKKyNkZWZpbmUgVElNX1RJTThfVEkxX0NPTVAyX09VVCBUSU1fVElNOF9USTFfQ09NUDIKKyNkZWZpbmUgVElNX1RJTTJfVEk0X0NPTVAxX09VVCBUSU1fVElNMl9USTRfQ09NUDEKKyNkZWZpbmUgVElNX1RJTTJfVEk0X0NPTVAyX09VVCBUSU1fVElNMl9USTRfQ09NUDIKKyNkZWZpbmUgVElNX1RJTTJfVEk0X0NPTVAxQ09NUDJfT1VUIFRJTV9USU0yX1RJNF9DT01QMV9DT01QMgorI2RlZmluZSBUSU1fVElNM19USTFfQ09NUDFfT1VUIFRJTV9USU0zX1RJMV9DT01QMQorI2RlZmluZSBUSU1fVElNM19USTFfQ09NUDJfT1VUIFRJTV9USU0zX1RJMV9DT01QMgorI2RlZmluZSBUSU1fVElNM19USTFfQ09NUDFDT01QMl9PVVQgVElNX1RJTTNfVEkxX0NPTVAxX0NPTVAyCisjZW5kaWYKKworI2lmIGRlZmluZWQoU1RNMzJVNSkKKyNkZWZpbmUgT0NSRUZfQ0xFQVJfU0VMRUNUX1BvcyBPQ1JFRl9DTEVBUl9TRUxFQ1RfUE9TCisjZGVmaW5lIE9DUkVGX0NMRUFSX1NFTEVDVF9Nc2sgT0NSRUZfQ0xFQVJfU0VMRUNUX01TSworI2VuZGlmCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBIQUxfVFNDX0FsaWFzZWRfRGVmaW5lcyBIQUwgVFNDIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvcgorICogbGVnYWN5IHB1cnBvc2UKKyAqIEB7CisgKi8KKyNkZWZpbmUgVFNDX1NZTkNfUE9MX0ZBTEwgVFNDX1NZTkNfUE9MQVJJVFlfRkFMTElORworI2RlZmluZSBUU0NfU1lOQ19QT0xfUklTRV9ISUdIIFRTQ19TWU5DX1BPTEFSSVRZX1JJU0lORworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1VBUlRfQWxpYXNlZF9EZWZpbmVzIEhBTCBVQVJUIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvcgorICogbGVnYWN5IHB1cnBvc2UKKyAqIEB7CisgKi8KKyNkZWZpbmUgVUFSVF9PTkVCSVRfU0FNUExJTkdfRElTQUJMRUQgVUFSVF9PTkVfQklUX1NBTVBMRV9ESVNBQkxFCisjZGVmaW5lIFVBUlRfT05FQklUX1NBTVBMSU5HX0VOQUJMRUQgVUFSVF9PTkVfQklUX1NBTVBMRV9FTkFCTEUKKyNkZWZpbmUgVUFSVF9PTkVfQklUX1NBTVBMRV9ESVNBQkxFRCBVQVJUX09ORV9CSVRfU0FNUExFX0RJU0FCTEUKKyNkZWZpbmUgVUFSVF9PTkVfQklUX1NBTVBMRV9FTkFCTEVEIFVBUlRfT05FX0JJVF9TQU1QTEVfRU5BQkxFCisKKyNkZWZpbmUgX19IQUxfVUFSVF9PTkVCSVRfRU5BQkxFIF9fSEFMX1VBUlRfT05FX0JJVF9TQU1QTEVfRU5BQkxFCisjZGVmaW5lIF9fSEFMX1VBUlRfT05FQklUX0RJU0FCTEUgX19IQUxfVUFSVF9PTkVfQklUX1NBTVBMRV9ESVNBQkxFCisKKyNkZWZpbmUgX19ESVZfU0FNUExJTkcxNiBVQVJUX0RJVl9TQU1QTElORzE2CisjZGVmaW5lIF9fRElWTUFOVF9TQU1QTElORzE2IFVBUlRfRElWTUFOVF9TQU1QTElORzE2CisjZGVmaW5lIF9fRElWRlJBUV9TQU1QTElORzE2IFVBUlRfRElWRlJBUV9TQU1QTElORzE2CisjZGVmaW5lIF9fVUFSVF9CUlJfU0FNUExJTkcxNiBVQVJUX0JSUl9TQU1QTElORzE2CisKKyNkZWZpbmUgX19ESVZfU0FNUExJTkc4IFVBUlRfRElWX1NBTVBMSU5HOAorI2RlZmluZSBfX0RJVk1BTlRfU0FNUExJTkc4IFVBUlRfRElWTUFOVF9TQU1QTElORzgKKyNkZWZpbmUgX19ESVZGUkFRX1NBTVBMSU5HOCBVQVJUX0RJVkZSQVFfU0FNUExJTkc4CisjZGVmaW5lIF9fVUFSVF9CUlJfU0FNUExJTkc4IFVBUlRfQlJSX1NBTVBMSU5HOAorCisjZGVmaW5lIF9fRElWX0xQVUFSVCBVQVJUX0RJVl9MUFVBUlQKKworI2RlZmluZSBVQVJUX1dBS0VVUE1FVEhPREVfSURMRUxJTkUgVUFSVF9XQUtFVVBNRVRIT0RfSURMRUxJTkUKKyNkZWZpbmUgVUFSVF9XQUtFVVBNRVRIT0RFX0FERFJFU1NNQVJLIFVBUlRfV0FLRVVQTUVUSE9EX0FERFJFU1NNQVJLCisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEhBTF9VU0FSVF9BbGlhc2VkX0RlZmluZXMgSEFMIFVTQVJUIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvcgorICogbGVnYWN5IHB1cnBvc2UKKyAqIEB7CisgKi8KKworI2RlZmluZSBVU0FSVF9DTE9DS19ESVNBQkxFRCBVU0FSVF9DTE9DS19ESVNBQkxFCisjZGVmaW5lIFVTQVJUX0NMT0NLX0VOQUJMRUQgVVNBUlRfQ0xPQ0tfRU5BQkxFCisKKyNkZWZpbmUgVVNBUlROQUNLX0VOQUJMRUQgVVNBUlRfTkFDS19FTkFCTEUKKyNkZWZpbmUgVVNBUlROQUNLX0RJU0FCTEVEIFVTQVJUX05BQ0tfRElTQUJMRQorLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1dXREdfQWxpYXNlZF9EZWZpbmVzIEhBTCBXV0RHIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvcgorICogbGVnYWN5IHB1cnBvc2UKKyAqIEB7CisgKi8KKyNkZWZpbmUgQ0ZSX0JBU0UgV1dER19DRlJfQkFTRQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBIQUxfQ0FOX0FsaWFzZWRfRGVmaW5lcyBIQUwgQ0FOIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvcgorICogbGVnYWN5IHB1cnBvc2UKKyAqIEB7CisgKi8KKyNkZWZpbmUgQ0FOX0ZpbHRlckZJRk8wIENBTl9GSUxURVJfRklGTzAKKyNkZWZpbmUgQ0FOX0ZpbHRlckZJRk8xIENBTl9GSUxURVJfRklGTzEKKyNkZWZpbmUgQ0FOX0lUX1JRQ1AwIENBTl9JVF9UTUUKKyNkZWZpbmUgQ0FOX0lUX1JRQ1AxIENBTl9JVF9UTUUKKyNkZWZpbmUgQ0FOX0lUX1JRQ1AyIENBTl9JVF9UTUUKKyNkZWZpbmUgSU5BS19USU1FT1VUIENBTl9USU1FT1VUX1ZBTFVFCisjZGVmaW5lIFNMQUtfVElNRU9VVCBDQU5fVElNRU9VVF9WQUxVRQorI2RlZmluZSBDQU5fVFhTVEFUVVNfRkFJTEVEICgodWludDhfdCkweDAwVSkKKyNkZWZpbmUgQ0FOX1RYU1RBVFVTX09LICgodWludDhfdCkweDAxVSkKKyNkZWZpbmUgQ0FOX1RYU1RBVFVTX1BFTkRJTkcgKCh1aW50OF90KTB4MDJVKQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBIQUxfRVRIX0FsaWFzZWRfRGVmaW5lcyBIQUwgRVRIIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvcgorICogbGVnYWN5IHB1cnBvc2UKKyAqIEB7CisgKi8KKworI2RlZmluZSBWTEFOX1RBRyBFVEhfVkxBTl9UQUcKKyNkZWZpbmUgTUlOX0VUSF9QQVlMT0FEIEVUSF9NSU5fRVRIX1BBWUxPQUQKKyNkZWZpbmUgTUFYX0VUSF9QQVlMT0FEIEVUSF9NQVhfRVRIX1BBWUxPQUQKKyNkZWZpbmUgSlVNQk9fRlJBTUVfUEFZTE9BRCBFVEhfSlVNQk9fRlJBTUVfUEFZTE9BRAorI2RlZmluZSBNQUNNSUlBUl9DUl9NQVNLIEVUSF9NQUNNSUlBUl9DUl9NQVNLCisjZGVmaW5lIE1BQ0NSX0NMRUFSX01BU0sgRVRIX01BQ0NSX0NMRUFSX01BU0sKKyNkZWZpbmUgTUFDRkNSX0NMRUFSX01BU0sgRVRIX01BQ0ZDUl9DTEVBUl9NQVNLCisjZGVmaW5lIERNQU9NUl9DTEVBUl9NQVNLIEVUSF9ETUFPTVJfQ0xFQVJfTUFTSworCisjZGVmaW5lIEVUSF9NTUNDUiAweDAwMDAwMTAwVQorI2RlZmluZSBFVEhfTU1DUklSIDB4MDAwMDAxMDRVCisjZGVmaW5lIEVUSF9NTUNUSVIgMHgwMDAwMDEwOFUKKyNkZWZpbmUgRVRIX01NQ1JJTVIgMHgwMDAwMDEwQ1UKKyNkZWZpbmUgRVRIX01NQ1RJTVIgMHgwMDAwMDExMFUKKyNkZWZpbmUgRVRIX01NQ1RHRlNDQ1IgMHgwMDAwMDE0Q1UKKyNkZWZpbmUgRVRIX01NQ1RHRk1TQ0NSIDB4MDAwMDAxNTBVCisjZGVmaW5lIEVUSF9NTUNUR0ZDUiAweDAwMDAwMTY4VQorI2RlZmluZSBFVEhfTU1DUkZDRUNSIDB4MDAwMDAxOTRVCisjZGVmaW5lIEVUSF9NTUNSRkFFQ1IgMHgwMDAwMDE5OFUKKyNkZWZpbmUgRVRIX01NQ1JHVUZDUiAweDAwMDAwMUM0VQorCisjZGVmaW5lIEVUSF9NQUNfVFhGSUZPX0ZVTEwgMHgwMjAwMDAwMFUgICAgICAgICAvKiBUeCBGSUZPIGZ1bGwgKi8KKyNkZWZpbmUgRVRIX01BQ19UWEZJRk9OT1RfRU1QVFkgMHgwMTAwMDAwMFUgICAgIC8qIFR4IEZJRk8gbm90IGVtcHR5ICovCisjZGVmaW5lIEVUSF9NQUNfVFhGSUZPX1dSSVRFX0FDVElWRSAweDAwNDAwMDAwVSAvKiBUeCBGSUZPIHdyaXRlIGFjdGl2ZSAqLworI2RlZmluZSBFVEhfTUFDX1RYRklGT19JRExFIDB4MDAwMDAwMDBVICAgICAgICAgLyogVHggRklGTyByZWFkIHN0YXR1czogSWRsZSAqLworI2RlZmluZSBFVEhfTUFDX1RYRklGT19SRUFEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAxMDAwMDBVIC8qIFR4IEZJRk8gcmVhZCBzdGF0dXM6IFJlYWQgKHRyYW5zZmVycmluZyBkYXRhIHRvIFwKKyAgICAgICAgICAgICAgICAgdGhlIE1BQyB0cmFuc21pdHRlcikgKi8KKyNkZWZpbmUgRVRIX01BQ19UWEZJRk9fV0FJVElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAyMDAwMDBVIC8qIFR4IEZJRk8gcmVhZCBzdGF0dXM6IFdhaXRpbmcgZm9yIFR4U3RhdHVzIGZyb20gXAorICAgICAgICAgICAgICAgICBNQUMgdHJhbnNtaXR0ZXIgKi8KKyNkZWZpbmUgRVRIX01BQ19UWEZJRk9fV1JJVElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAweDAwMzAwMDAwVSAvKiBUeCBGSUZPIHJlYWQgc3RhdHVzOiBXcml0aW5nIHRoZSByZWNlaXZlZCBUeFN0YXR1cyBcCisgICAgICAgICAgICAgICAgIG9yIGZsdXNoaW5nIHRoZSBUeEZJRk8gKi8KKyNkZWZpbmUgRVRIX01BQ19UUkFOU01JU1NJT05fUEFVU0UgMHgwMDA4MDAwMFUgLyogTUFDIHRyYW5zbWl0dGVyIGluIHBhdXNlICovCisjZGVmaW5lIEVUSF9NQUNfVFJBTlNNSVRGUkFNRUNPTlRST0xMRVJfSURMRSBcCisgIDB4MDAwMDAwMDBVIC8qIE1BQyB0cmFuc21pdCBmcmFtZSBjb250cm9sbGVyOiBJZGxlICovCisjZGVmaW5lIEVUSF9NQUNfVFJBTlNNSVRGUkFNRUNPTlRST0xMRVJfV0FJVElORyAgICAgICAgICAgICAgICAgICAgXAorICAweDAwMDIwMDAwVSAvKiBNQUMgdHJhbnNtaXQgZnJhbWUgY29udHJvbGxlcjogV2FpdGluZyBmb3IgU3RhdHVzIFwKKyAgICAgICAgICAgICAgb2YgcHJldmlvdXMgZnJhbWUgb3IgSUZHL2JhY2tvZmYgcGVyaW9kIHRvIGJlIG92ZXIgKi8KKyNkZWZpbmUgRVRIX01BQ19UUkFOU01JVEZSQU1FQ09OVFJPTExFUl9HRU5SQVRJTkdfUENGICAgICAgICAgIFwKKyAgMHgwMDA0MDAwMFUgLyogTUFDIHRyYW5zbWl0IGZyYW1lIGNvbnRyb2xsZXI6IEdlbmVyYXRpbmcgYW5kIFwKKyAgICAgICAgdHJhbnNtaXR0aW5nIGEgUGF1c2UgY29udHJvbCBmcmFtZSAoaW4gZnVsbCBkdXBsZXggbW9kZSkgKi8KKyNkZWZpbmUgRVRIX01BQ19UUkFOU01JVEZSQU1FQ09OVFJPTExFUl9UUkFOU0ZFUlJJTkcgICAgICAgICAgICAgICBcCisgIDB4MDAwNjAwMDBVIC8qIE1BQyB0cmFuc21pdCBmcmFtZSBjb250cm9sbGVyOiBUcmFuc2ZlcnJpbmcgaW5wdXQgXAorICAgICAgICAgICAgICAgICBmcmFtZSBmb3IgdHJhbnNtaXNzaW9uICovCisjZGVmaW5lIEVUSF9NQUNfTUlJX1RSQU5TTUlUX0FDVElWRSBcCisgIDB4MDAwMTAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1BQyBNSUkgdHJhbnNtaXQgZW5naW5lIGFjdGl2ZSAqLworI2RlZmluZSBFVEhfTUFDX1JYRklGT19FTVBUWSAweDAwMDAwMDAwVSAvKiBSeCBGSUZPIGZpbGwgbGV2ZWw6IGVtcHR5ICovCisjZGVmaW5lIEVUSF9NQUNfUlhGSUZPX0JFTE9XX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAweDAwMDAwMTAwVSAvKiBSeCBGSUZPIGZpbGwgbGV2ZWw6IGZpbGwtbGV2ZWwgYmVsb3cgZmxvdy1jb250cm9sIFwKKyAgICAgICAgICAgICAgICAgZGUtYWN0aXZhdGUgdGhyZXNob2xkICovCisjZGVmaW5lIEVUSF9NQUNfUlhGSUZPX0FCT1ZFX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAweDAwMDAwMjAwVSAvKiBSeCBGSUZPIGZpbGwgbGV2ZWw6IGZpbGwtbGV2ZWwgYWJvdmUgZmxvdy1jb250cm9sIFwKKyAgICAgICAgICAgICAgICAgYWN0aXZhdGUgdGhyZXNob2xkICovCisjZGVmaW5lIEVUSF9NQUNfUlhGSUZPX0ZVTEwgMHgwMDAwMDMwMFUgLyogUnggRklGTyBmaWxsIGxldmVsOiBmdWxsICovCisjaWYgZGVmaW5lZChTVE0zMkYxKQorI2Vsc2UKKyNkZWZpbmUgRVRIX01BQ19SRUFEQ09OVFJPTExFUl9JRExFIFwKKyAgMHgwMDAwMDAwMFUgLyogUnggRklGTyByZWFkIGNvbnRyb2xsZXIgSURMRSBzdGF0ZSAqLworI2RlZmluZSBFVEhfTUFDX1JFQURDT05UUk9MTEVSX1JFQURJTkdfREFUQSBcCisgIDB4MDAwMDAwMjBVIC8qIFJ4IEZJRk8gcmVhZCBjb250cm9sbGVyIFJlYWRpbmcgZnJhbWUgZGF0YSAqLworI2RlZmluZSBFVEhfTUFDX1JFQURDT05UUk9MTEVSX1JFQURJTkdfU1RBVFVTICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMDAwNDBVIC8qIFJ4IEZJRk8gcmVhZCBjb250cm9sbGVyIFJlYWRpbmcgZnJhbWUgc3RhdHVzIFwKKyAgICAgICAgICAgICAgICAob3IgdGltZS1zdGFtcCkgKi8KKyNlbmRpZgorI2RlZmluZSBFVEhfTUFDX1JFQURDT05UUk9MTEVSX0ZMVVNISU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAweDAwMDAwMDYwVSAvKiBSeCBGSUZPIHJlYWQgY29udHJvbGxlciBGbHVzaGluZyB0aGUgZnJhbWUgZGF0YSBhbmQgXAorICAgICAgICAgICAgICAgICBzdGF0dXMgKi8KKyNkZWZpbmUgRVRIX01BQ19SWEZJRk9fV1JJVEVfQUNUSVZFIFwKKyAgMHgwMDAwMDAxMFUgLyogUnggRklGTyB3cml0ZSBjb250cm9sbGVyIGFjdGl2ZSAqLworI2RlZmluZSBFVEhfTUFDX1NNQUxMX0ZJRk9fTk9UQUNUSVZFIFwKKyAgMHgwMDAwMDAwMFUgLyogTUFDIHNtYWxsIEZJRk8gcmVhZCAvIHdyaXRlIGNvbnRyb2xsZXJzIG5vdCBhY3RpdmUgKi8KKyNkZWZpbmUgRVRIX01BQ19TTUFMTF9GSUZPX1JFQURfQUNUSVZFIFwKKyAgMHgwMDAwMDAwMlUgLyogTUFDIHNtYWxsIEZJRk8gcmVhZCBjb250cm9sbGVyIGFjdGl2ZSAqLworI2RlZmluZSBFVEhfTUFDX1NNQUxMX0ZJRk9fV1JJVEVfQUNUSVZFIFwKKyAgMHgwMDAwMDAwNFUgLyogTUFDIHNtYWxsIEZJRk8gd3JpdGUgY29udHJvbGxlciBhY3RpdmUgKi8KKyNkZWZpbmUgRVRIX01BQ19TTUFMTF9GSUZPX1JXX0FDVElWRSBcCisgIDB4MDAwMDAwMDZVIC8qIE1BQyBzbWFsbCBGSUZPIHJlYWQgLyB3cml0ZSBjb250cm9sbGVycyBhY3RpdmUgKi8KKyNkZWZpbmUgRVRIX01BQ19NSUlfUkVDRUlWRV9QUk9UT0NPTF9BQ1RJVkUgXAorICAweDAwMDAwMDAxVSAvKiBNQUMgTUlJIHJlY2VpdmUgcHJvdG9jb2wgZW5naW5lIGFjdGl2ZSAqLworCisjZGVmaW5lIEVUSF9UeFBhY2tldENvbmZpZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRVRIX1R4UGFja2V0Q29uZmlnVHlwZURlZiAvKiBUcmFuc21pdCBQYWNrZXQgQ29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb24gKi8KKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0RDTUlfQWxpYXNlZF9EZWZpbmVzIEhBTCBEQ01JIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvcgorICogbGVnYWN5IHB1cnBvc2UKKyAqIEB7CisgKi8KKyNkZWZpbmUgSEFMX0RDTUlfRVJST1JfT1ZGIEhBTF9EQ01JX0VSUk9SX09WUgorI2RlZmluZSBEQ01JX0lUX09WRiBEQ01JX0lUX09WUgorI2RlZmluZSBEQ01JX0ZMQUdfT1ZGUkkgRENNSV9GTEFHX09WUlJJCisjZGVmaW5lIERDTUlfRkxBR19PVkZNSSBEQ01JX0ZMQUdfT1ZSTUkKKworI2RlZmluZSBIQUxfRENNSV9Db25maWdDUk9QIEhBTF9EQ01JX0NvbmZpZ0Nyb3AKKyNkZWZpbmUgSEFMX0RDTUlfRW5hYmxlQ1JPUCBIQUxfRENNSV9FbmFibGVDcm9wCisjZGVmaW5lIEhBTF9EQ01JX0Rpc2FibGVDUk9QIEhBTF9EQ01JX0Rpc2FibGVDcm9wCisKKy8qKgorICogQH0KKyAqLworCisjaWYgZGVmaW5lZChTVE0zMkw0KSB8fCBkZWZpbmVkKFNUTTMyRjcpIHx8IGRlZmluZWQoU1RNMzJGNDI3eHgpIHx8ICAgICAgICAgXAorICAgIGRlZmluZWQoU1RNMzJGNDM3eHgpIHx8IGRlZmluZWQoU1RNMzJGNDI5eHgpIHx8IGRlZmluZWQoU1RNMzJGNDM5eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjQ2OXh4KSB8fCBkZWZpbmVkKFNUTTMyRjQ3OXh4KSB8fCBkZWZpbmVkKFNUTTMySDcpCisvKiogQGRlZmdyb3VwIEhBTF9ETUEyRF9BbGlhc2VkX0RlZmluZXMgSEFMIERNQTJEIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvcgorICogbGVnYWN5IHB1cnBvc2UKKyAqIEB7CisgKi8KKyNkZWZpbmUgRE1BMkRfQVJHQjg4ODggRE1BMkRfT1VUUFVUX0FSR0I4ODg4CisjZGVmaW5lIERNQTJEX1JHQjg4OCBETUEyRF9PVVRQVVRfUkdCODg4CisjZGVmaW5lIERNQTJEX1JHQjU2NSBETUEyRF9PVVRQVVRfUkdCNTY1CisjZGVmaW5lIERNQTJEX0FSR0IxNTU1IERNQTJEX09VVFBVVF9BUkdCMTU1NQorI2RlZmluZSBETUEyRF9BUkdCNDQ0NCBETUEyRF9PVVRQVVRfQVJHQjQ0NDQKKworI2RlZmluZSBDTV9BUkdCODg4OCBETUEyRF9JTlBVVF9BUkdCODg4OAorI2RlZmluZSBDTV9SR0I4ODggRE1BMkRfSU5QVVRfUkdCODg4CisjZGVmaW5lIENNX1JHQjU2NSBETUEyRF9JTlBVVF9SR0I1NjUKKyNkZWZpbmUgQ01fQVJHQjE1NTUgRE1BMkRfSU5QVVRfQVJHQjE1NTUKKyNkZWZpbmUgQ01fQVJHQjQ0NDQgRE1BMkRfSU5QVVRfQVJHQjQ0NDQKKyNkZWZpbmUgQ01fTDggRE1BMkRfSU5QVVRfTDgKKyNkZWZpbmUgQ01fQUw0NCBETUEyRF9JTlBVVF9BTDQ0CisjZGVmaW5lIENNX0FMODggRE1BMkRfSU5QVVRfQUw4OAorI2RlZmluZSBDTV9MNCBETUEyRF9JTlBVVF9MNAorI2RlZmluZSBDTV9BOCBETUEyRF9JTlBVVF9BOAorI2RlZmluZSBDTV9BNCBETUEyRF9JTlBVVF9BNAorLyoqCisgKiBAfQorICovCisjZW5kaWYgLyogU1RNMzJMNCB8fCAgU1RNMzJGNyB8fCAgU1RNMzJGNCB8fCAgU1RNMzJINyAqLworCisjaWYgZGVmaW5lZChTVE0zMkw0KSB8fCBkZWZpbmVkKFNUTTMyRjcpIHx8IGRlZmluZWQoU1RNMzJGNDI3eHgpIHx8ICAgICAgICAgXAorICAgIGRlZmluZWQoU1RNMzJGNDM3eHgpIHx8IGRlZmluZWQoU1RNMzJGNDI5eHgpIHx8IGRlZmluZWQoU1RNMzJGNDM5eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjQ2OXh4KSB8fCBkZWZpbmVkKFNUTTMyRjQ3OXh4KSB8fCBkZWZpbmVkKFNUTTMySDcpIHx8ICAgICBcCisgICAgZGVmaW5lZChTVE0zMlU1KQorLyoqIEBkZWZncm91cCBETUEyRF9BbGlhc2VzIERNQTJEIEFQSSBBbGlhc2VzCisgKiBAeworICovCisjZGVmaW5lIEhBTF9ETUEyRF9EaXNhYmxlQ0xVVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSEFMX0RNQTJEX0NMVVRMb2FkaW5nX0Fib3J0IC8qITwgQWxpYXNlZCB0byBIQUxfRE1BMkRfQ0xVVExvYWRpbmdfQWJvcnQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGxlZ2FjeSBjb2RlICovCisvKioKKyAqIEB9CisgKi8KKworI2VuZGlmIC8qIFNUTTMyTDQgfHwgIFNUTTMyRjcgfHwgIFNUTTMyRjQgfHwgIFNUTTMySDcgfHwgU1RNMzJVNSAqLworCisvKiogQGRlZmdyb3VwIEhBTF9QUFBfQWxpYXNlZF9EZWZpbmVzIEhBTCBQUFAgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yCisgKiBsZWdhY3kgcHVycG9zZQorICogQHsKKyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBIQUxfQ1JZUF9BbGlhc2VkX0Z1bmN0aW9ucyBIQUwgQ1JZUCBBbGlhc2VkIEZ1bmN0aW9ucyBtYWludGFpbmVkCisgKiBmb3IgbGVnYWN5IHB1cnBvc2UKKyAqIEB7CisgKi8KKyNkZWZpbmUgSEFMX0NSWVBfQ29tcHV0YXRpb25DcGx0Q2FsbGJhY2sgSEFMX0NSWVBFeF9Db21wdXRhdGlvbkNwbHRDYWxsYmFjaworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0RDQUNIRV9BbGlhc2VkX0Z1bmN0aW9ucyBIQUwgRENBQ0hFIEFsaWFzZWQgRnVuY3Rpb25zCisgKiBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICogQHsKKyAqLworCisjaWYgZGVmaW5lZChTVE0zMlU1KQorI2RlZmluZSBIQUxfRENBQ0hFX0NsZWFuSW52YWxpZGF0ZUJ5QWRkciBIQUxfRENBQ0hFX0NsZWFuSW52YWxpZEJ5QWRkcgorI2RlZmluZSBIQUxfRENBQ0hFX0NsZWFuSW52YWxpZGF0ZUJ5QWRkcl9JVCBIQUxfRENBQ0hFX0NsZWFuSW52YWxpZEJ5QWRkcl9JVAorI2VuZGlmIC8qIFNUTTMyVTUgKi8KKworLyoqCisgKiBAfQorICovCisKKyNpZiAhZGVmaW5lZChTVE0zMkYyKQorLyoqIEBkZWZncm91cCBIQVNIX2FsaWFzIEhBU0ggQVBJIGFsaWFzCisgKiBAeworICovCisjZGVmaW5lIEhBTF9IQVNIRXhfSVJRSGFuZGxlciBcCisgIEhBTF9IQVNIX0lSUUhhbmRsZXIgLyohPCBSZWRpcmVjdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGxlZ2FjeSBjb2RlICovCisvKioKKyAqCisgKiBAfQorICovCisjZW5kaWYgLyogU1RNMzJGMiAqLworLyoqIEBkZWZncm91cCBIQUxfSEFTSF9BbGlhc2VkX0Z1bmN0aW9ucyBIQUwgSEFTSCBBbGlhc2VkIEZ1bmN0aW9ucyBtYWludGFpbmVkCisgKiBmb3IgbGVnYWN5IHB1cnBvc2UKKyAqIEB7CisgKi8KKyNkZWZpbmUgSEFMX0hBU0hfU1RBVEVUeXBlRGVmIEhBTF9IQVNIX1N0YXRlVHlwZURlZgorI2RlZmluZSBIQUxfSEFTSFBoYXNlVHlwZURlZiBIQUxfSEFTSF9QaGFzZVR5cGVEZWYKKyNkZWZpbmUgSEFMX0hNQUNfTUQ1X0ZpbmlzaCBIQUxfSEFTSF9NRDVfRmluaXNoCisjZGVmaW5lIEhBTF9ITUFDX1NIQTFfRmluaXNoIEhBTF9IQVNIX1NIQTFfRmluaXNoCisjZGVmaW5lIEhBTF9ITUFDX1NIQTIyNF9GaW5pc2ggSEFMX0hBU0hfU0hBMjI0X0ZpbmlzaAorI2RlZmluZSBIQUxfSE1BQ19TSEEyNTZfRmluaXNoIEhBTF9IQVNIX1NIQTI1Nl9GaW5pc2gKKworLypIQVNIIEFsZ29yaXRobSBTZWxlY3Rpb24qLworCisjZGVmaW5lIEhBU0hfQWxnb1NlbGVjdGlvbl9TSEExIEhBU0hfQUxHT1NFTEVDVElPTl9TSEExCisjZGVmaW5lIEhBU0hfQWxnb1NlbGVjdGlvbl9TSEEyMjQgSEFTSF9BTEdPU0VMRUNUSU9OX1NIQTIyNAorI2RlZmluZSBIQVNIX0FsZ29TZWxlY3Rpb25fU0hBMjU2IEhBU0hfQUxHT1NFTEVDVElPTl9TSEEyNTYKKyNkZWZpbmUgSEFTSF9BbGdvU2VsZWN0aW9uX01ENSBIQVNIX0FMR09TRUxFQ1RJT05fTUQ1CisKKyNkZWZpbmUgSEFTSF9BbGdvTW9kZV9IQVNIIEhBU0hfQUxHT01PREVfSEFTSAorI2RlZmluZSBIQVNIX0FsZ29Nb2RlX0hNQUMgSEFTSF9BTEdPTU9ERV9ITUFDCisKKyNkZWZpbmUgSEFTSF9ITUFDS2V5VHlwZV9TaG9ydEtleSBIQVNIX0hNQUNfS0VZVFlQRV9TSE9SVEtFWQorI2RlZmluZSBIQVNIX0hNQUNLZXlUeXBlX0xvbmdLZXkgSEFTSF9ITUFDX0tFWVRZUEVfTE9OR0tFWQorCisjaWYgZGVmaW5lZChTVE0zMkw0KSB8fCBkZWZpbmVkKFNUTTMyTDUpIHx8IGRlZmluZWQoU1RNMzJGMikgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGNCkgfHwgZGVmaW5lZChTVE0zMkY3KSB8fCBkZWZpbmVkKFNUTTMySDcpCisKKyNkZWZpbmUgSEFMX0hBU0hfTUQ1X0FjY3VtdWxhdGUgSEFMX0hBU0hfTUQ1X0FjY21sdAorI2RlZmluZSBIQUxfSEFTSF9NRDVfQWNjdW11bGF0ZV9FbmQgSEFMX0hBU0hfTUQ1X0FjY21sdF9FbmQKKyNkZWZpbmUgSEFMX0hBU0hfTUQ1X0FjY3VtdWxhdGVfSVQgSEFMX0hBU0hfTUQ1X0FjY21sdF9JVAorI2RlZmluZSBIQUxfSEFTSF9NRDVfQWNjdW11bGF0ZV9FbmRfSVQgSEFMX0hBU0hfTUQ1X0FjY21sdF9FbmRfSVQKKworI2RlZmluZSBIQUxfSEFTSF9TSEExX0FjY3VtdWxhdGUgSEFMX0hBU0hfU0hBMV9BY2NtbHQKKyNkZWZpbmUgSEFMX0hBU0hfU0hBMV9BY2N1bXVsYXRlX0VuZCBIQUxfSEFTSF9TSEExX0FjY21sdF9FbmQKKyNkZWZpbmUgSEFMX0hBU0hfU0hBMV9BY2N1bXVsYXRlX0lUIEhBTF9IQVNIX1NIQTFfQWNjbWx0X0lUCisjZGVmaW5lIEhBTF9IQVNIX1NIQTFfQWNjdW11bGF0ZV9FbmRfSVQgSEFMX0hBU0hfU0hBMV9BY2NtbHRfRW5kX0lUCisKKyNkZWZpbmUgSEFMX0hBU0hFeF9TSEEyMjRfQWNjdW11bGF0ZSBIQUxfSEFTSEV4X1NIQTIyNF9BY2NtbHQKKyNkZWZpbmUgSEFMX0hBU0hFeF9TSEEyMjRfQWNjdW11bGF0ZV9FbmQgSEFMX0hBU0hFeF9TSEEyMjRfQWNjbWx0X0VuZAorI2RlZmluZSBIQUxfSEFTSEV4X1NIQTIyNF9BY2N1bXVsYXRlX0lUIEhBTF9IQVNIRXhfU0hBMjI0X0FjY21sdF9JVAorI2RlZmluZSBIQUxfSEFTSEV4X1NIQTIyNF9BY2N1bXVsYXRlX0VuZF9JVCBIQUxfSEFTSEV4X1NIQTIyNF9BY2NtbHRfRW5kX0lUCisKKyNkZWZpbmUgSEFMX0hBU0hFeF9TSEEyNTZfQWNjdW11bGF0ZSBIQUxfSEFTSEV4X1NIQTI1Nl9BY2NtbHQKKyNkZWZpbmUgSEFMX0hBU0hFeF9TSEEyNTZfQWNjdW11bGF0ZV9FbmQgSEFMX0hBU0hFeF9TSEEyNTZfQWNjbWx0X0VuZAorI2RlZmluZSBIQUxfSEFTSEV4X1NIQTI1Nl9BY2N1bXVsYXRlX0lUIEhBTF9IQVNIRXhfU0hBMjU2X0FjY21sdF9JVAorI2RlZmluZSBIQUxfSEFTSEV4X1NIQTI1Nl9BY2N1bXVsYXRlX0VuZF9JVCBIQUxfSEFTSEV4X1NIQTI1Nl9BY2NtbHRfRW5kX0lUCisKKyNlbmRpZiAvKiBTVE0zMkw0IHx8IFNUTTMyTDUgfHwgU1RNMzJGMiB8fCBTVE0zMkY0IHx8IFNUTTMyRjcgfHwgU1RNMzJINyAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0FsaWFzZWRfRnVuY3Rpb25zIEhBTCBHZW5lcmljIEFsaWFzZWQgRnVuY3Rpb25zIG1haW50YWluZWQgZm9yCisgKiBsZWdhY3kgcHVycG9zZQorICogQHsKKyAqLworI2RlZmluZSBIQUxfRW5hYmxlREJHU2xlZXBNb2RlIEhBTF9EQkdNQ1VfRW5hYmxlREJHU2xlZXBNb2RlCisjZGVmaW5lIEhBTF9EaXNhYmxlREJHU2xlZXBNb2RlIEhBTF9EQkdNQ1VfRGlzYWJsZURCR1NsZWVwTW9kZQorI2RlZmluZSBIQUxfRW5hYmxlREJHU3RvcE1vZGUgSEFMX0RCR01DVV9FbmFibGVEQkdTdG9wTW9kZQorI2RlZmluZSBIQUxfRGlzYWJsZURCR1N0b3BNb2RlIEhBTF9EQkdNQ1VfRGlzYWJsZURCR1N0b3BNb2RlCisjZGVmaW5lIEhBTF9FbmFibGVEQkdTdGFuZGJ5TW9kZSBIQUxfREJHTUNVX0VuYWJsZURCR1N0YW5kYnlNb2RlCisjZGVmaW5lIEhBTF9EaXNhYmxlREJHU3RhbmRieU1vZGUgSEFMX0RCR01DVV9EaXNhYmxlREJHU3RhbmRieU1vZGUKKyNkZWZpbmUgSEFMX0RCR19Mb3dQb3dlckNvbmZpZyhQZXJpcGgsIGNtZCkgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKGNtZCkgPT0gRU5BQkxFKSA/IEhBTF9EQkdNQ1VfREJHX0VuYWJsZUxvd1Bvd2VyQ29uZmlnKFBlcmlwaCkgXAorICAgICAgICAgICAgICAgICAgICAgOiBIQUxfREJHTUNVX0RCR19EaXNhYmxlTG93UG93ZXJDb25maWcoUGVyaXBoKSkKKyNkZWZpbmUgSEFMX1ZSRUZJTlRfT3V0cHV0U2VsZWN0IEhBTF9TWVNDRkdfVlJFRklOVF9PdXRwdXRTZWxlY3QKKyNkZWZpbmUgSEFMX0xvY2tfQ21kKGNtZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKChjbWQpID09IEVOQUJMRSkgPyBIQUxfU1lTQ0ZHX0VuYWJsZV9Mb2NrX1ZSRUZJTlQoKSBcCisgICAgICAgICAgICAgICAgICAgICA6IEhBTF9TWVNDRkdfRGlzYWJsZV9Mb2NrX1ZSRUZJTlQoKSkKKyNpZiBkZWZpbmVkKFNUTTMyTDApCisjZWxzZQorI2RlZmluZSBIQUxfVlJFRklOVF9DbWQoY21kKSBcCisgICgoKGNtZCkgPT0gRU5BQkxFKSA/IEhBTF9TWVNDRkdfRW5hYmxlVlJFRklOVCgpIDogSEFMX1NZU0NGR19EaXNhYmxlVlJFRklOVCgpKQorI2VuZGlmCisjZGVmaW5lIEhBTF9BRENfRW5hYmxlQnVmZmVyX0NtZChjbWQpIFwKKyAgKCgoY21kKSA9PSBFTkFCTEUpID8gSEFMX0FEQ0V4X0VuYWJsZVZSRUZJTlQoKSA6IEhBTF9BRENFeF9EaXNhYmxlVlJFRklOVCgpKQorI2RlZmluZSBIQUxfQURDX0VuYWJsZUJ1ZmZlclNlbnNvcl9DbWQoY21kKSAgICAgICAgICAgICAgICBcCisgICgoKGNtZCkgPT0gRU5BQkxFKSA/IEhBTF9BRENFeF9FbmFibGVWUkVGSU5UVGVtcFNlbnNvcigpIFwKKyAgICAgICAgICAgICAgICAgICAgIDogSEFMX0FEQ0V4X0Rpc2FibGVWUkVGSU5UVGVtcFNlbnNvcigpKQorI2lmIGRlZmluZWQoU1RNMzJIN0EzeHgpIHx8IGRlZmluZWQoU1RNMzJIN0IzeHgpIHx8IGRlZmluZWQoU1RNMzJIN0IweHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMySDdBM3h4USkgfHwgZGVmaW5lZChTVE0zMkg3QjN4eFEpIHx8IGRlZmluZWQoU1RNMzJIN0IweHhRKQorI2RlZmluZSBIQUxfRW5hYmxlU1JEb21haW5EQkdTdG9wTW9kZSBIQUxfRW5hYmxlRG9tYWluM0RCR1N0b3BNb2RlCisjZGVmaW5lIEhBTF9EaXNhYmxlU1JEb21haW5EQkdTdG9wTW9kZSBIQUxfRGlzYWJsZURvbWFpbjNEQkdTdG9wTW9kZQorI2RlZmluZSBIQUxfRW5hYmxlU1JEb21haW5EQkdTdGFuZGJ5TW9kZSBIQUxfRW5hYmxlRG9tYWluM0RCR1N0YW5kYnlNb2RlCisjZGVmaW5lIEhBTF9EaXNhYmxlU1JEb21haW5EQkdTdGFuZGJ5TW9kZSBIQUxfRGlzYWJsZURvbWFpbjNEQkdTdGFuZGJ5TW9kZQorI2VuZGlmIC8qIFNUTTMySDdBM3h4IHx8IFNUTTMySDdCM3h4IHx8IFNUTTMySDdCMHh4IHx8IFNUTTMySDdBM3h4USB8fCBcCisgICAgICAgICAgU1RNMzJIN0IzeHhRICB8fCBTVE0zMkg3QjB4eFEgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0ZMQVNIX0FsaWFzZWRfRnVuY3Rpb25zIEhBTCBGTEFTSCBBbGlhc2VkIEZ1bmN0aW9ucyBtYWludGFpbmVkCisgKiBmb3IgbGVnYWN5IHB1cnBvc2UKKyAqIEB7CisgKi8KKyNkZWZpbmUgRkxBU0hfSGFsZlBhZ2VQcm9ncmFtIEhBTF9GTEFTSEV4X0hhbGZQYWdlUHJvZ3JhbQorI2RlZmluZSBGTEFTSF9FbmFibGVSdW5Qb3dlckRvd24gSEFMX0ZMQVNIRXhfRW5hYmxlUnVuUG93ZXJEb3duCisjZGVmaW5lIEZMQVNIX0Rpc2FibGVSdW5Qb3dlckRvd24gSEFMX0ZMQVNIRXhfRGlzYWJsZVJ1blBvd2VyRG93bgorI2RlZmluZSBIQUxfREFUQV9FRVBST01FeF9VbmxvY2sgSEFMX0ZMQVNIRXhfREFUQUVFUFJPTV9VbmxvY2sKKyNkZWZpbmUgSEFMX0RBVEFfRUVQUk9NRXhfTG9jayBIQUxfRkxBU0hFeF9EQVRBRUVQUk9NX0xvY2sKKyNkZWZpbmUgSEFMX0RBVEFfRUVQUk9NRXhfRXJhc2UgSEFMX0ZMQVNIRXhfREFUQUVFUFJPTV9FcmFzZQorI2RlZmluZSBIQUxfREFUQV9FRVBST01FeF9Qcm9ncmFtIEhBTF9GTEFTSEV4X0RBVEFFRVBST01fUHJvZ3JhbQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBIQUxfSTJDX0FsaWFzZWRfRnVuY3Rpb25zIEhBTCBJMkMgQWxpYXNlZCBGdW5jdGlvbnMgbWFpbnRhaW5lZCBmb3IKKyAqIGxlZ2FjeSBwdXJwb3NlCisgKiBAeworICovCisjZGVmaW5lIEhBTF9JMkNFeF9BbmFsb2dGaWx0ZXJfQ29uZmlnIEhBTF9JMkNFeF9Db25maWdBbmFsb2dGaWx0ZXIKKyNkZWZpbmUgSEFMX0kyQ0V4X0RpZ2l0YWxGaWx0ZXJfQ29uZmlnIEhBTF9JMkNFeF9Db25maWdEaWdpdGFsRmlsdGVyCisjZGVmaW5lIEhBTF9GTVBJMkNFeF9BbmFsb2dGaWx0ZXJfQ29uZmlnIEhBTF9GTVBJMkNFeF9Db25maWdBbmFsb2dGaWx0ZXIKKyNkZWZpbmUgSEFMX0ZNUEkyQ0V4X0RpZ2l0YWxGaWx0ZXJfQ29uZmlnIEhBTF9GTVBJMkNFeF9Db25maWdEaWdpdGFsRmlsdGVyCisKKyNkZWZpbmUgSEFMX0kyQ0Zhc3RNb2RlUGx1c0NvbmZpZyhTWVNDRkdfSTJDRmFzdE1vZGVQbHVzLCBjbWQpICAgICAgICAgICAgICBcCisgICgoKGNtZCkgPT0gRU5BQkxFKSA/IEhBTF9JMkNFeF9FbmFibGVGYXN0TW9kZVBsdXMoU1lTQ0ZHX0kyQ0Zhc3RNb2RlUGx1cykgXAorICAgICAgICAgICAgICAgICAgICAgOiBIQUxfSTJDRXhfRGlzYWJsZUZhc3RNb2RlUGx1cyhTWVNDRkdfSTJDRmFzdE1vZGVQbHVzKSkKKworI2lmIGRlZmluZWQoU1RNMzJINykgfHwgZGVmaW5lZChTVE0zMldCKSB8fCBkZWZpbmVkKFNUTTMyRzApIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjApIHx8IGRlZmluZWQoU1RNMzJGMSkgfHwgZGVmaW5lZChTVE0zMkYyKSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzKSB8fCBkZWZpbmVkKFNUTTMyRjQpIHx8IGRlZmluZWQoU1RNMzJGNykgfHwgXAorICAgIGRlZmluZWQoU1RNMzJMMCkgfHwgZGVmaW5lZChTVE0zMkw0KSB8fCBkZWZpbmVkKFNUTTMyTDUpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRzQpIHx8IGRlZmluZWQoU1RNMzJMMSkKKyNkZWZpbmUgSEFMX0kyQ19NYXN0ZXJfU2VxdWVudGlhbF9UcmFuc21pdF9JVCBIQUxfSTJDX01hc3Rlcl9TZXFfVHJhbnNtaXRfSVQKKyNkZWZpbmUgSEFMX0kyQ19NYXN0ZXJfU2VxdWVudGlhbF9SZWNlaXZlX0lUIEhBTF9JMkNfTWFzdGVyX1NlcV9SZWNlaXZlX0lUCisjZGVmaW5lIEhBTF9JMkNfU2xhdmVfU2VxdWVudGlhbF9UcmFuc21pdF9JVCBIQUxfSTJDX1NsYXZlX1NlcV9UcmFuc21pdF9JVAorI2RlZmluZSBIQUxfSTJDX1NsYXZlX1NlcXVlbnRpYWxfUmVjZWl2ZV9JVCBIQUxfSTJDX1NsYXZlX1NlcV9SZWNlaXZlX0lUCisjZW5kaWYgLyogU1RNMzJINyB8fCBTVE0zMldCICB8fCBTVE0zMkcwIHx8IFNUTTMyRjAgfHwgU1RNMzJGMSB8fCBTVE0zMkYyIHx8IFwKKyAgICAgICAgICBTVE0zMkYzIHx8IFNUTTMyRjQgfHwgU1RNMzJGNyB8fCBTVE0zMkwwIHx8IFNUTTMyTDQgfHwgU1RNMzJMNSB8fCAgXAorICAgICAgICAgIFNUTTMyRzQgfHwgU1RNMzJMMSAqLworI2lmIGRlZmluZWQoU1RNMzJINykgfHwgZGVmaW5lZChTVE0zMldCKSB8fCBkZWZpbmVkKFNUTTMyRzApIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjQpIHx8IGRlZmluZWQoU1RNMzJGNykgfHwgZGVmaW5lZChTVE0zMkwwKSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkw0KSB8fCBkZWZpbmVkKFNUTTMyTDUpIHx8IGRlZmluZWQoU1RNMzJHNCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJMMSkKKyNkZWZpbmUgSEFMX0kyQ19NYXN0ZXJfU2VxdWVudGlhbF9UcmFuc21pdF9ETUEgSEFMX0kyQ19NYXN0ZXJfU2VxX1RyYW5zbWl0X0RNQQorI2RlZmluZSBIQUxfSTJDX01hc3Rlcl9TZXF1ZW50aWFsX1JlY2VpdmVfRE1BIEhBTF9JMkNfTWFzdGVyX1NlcV9SZWNlaXZlX0RNQQorI2RlZmluZSBIQUxfSTJDX1NsYXZlX1NlcXVlbnRpYWxfVHJhbnNtaXRfRE1BIEhBTF9JMkNfU2xhdmVfU2VxX1RyYW5zbWl0X0RNQQorI2RlZmluZSBIQUxfSTJDX1NsYXZlX1NlcXVlbnRpYWxfUmVjZWl2ZV9ETUEgSEFMX0kyQ19TbGF2ZV9TZXFfUmVjZWl2ZV9ETUEKKyNlbmRpZiAvKiBTVE0zMkg3IHx8IFNUTTMyV0IgIHx8IFNUTTMyRzAgfHwgU1RNMzJGNCB8fCBTVE0zMkY3IHx8IFNUTTMyTDAgfHwgXAorICAgICAgICAgIFNUTTMyTDQgfHwgU1RNMzJMNSB8fCBTVE0zMkc0IHx8IFNUTTMyTDEgKi8KKworI2lmIGRlZmluZWQoU1RNMzJGNCkKKyNkZWZpbmUgSEFMX0ZNUEkyQ19NYXN0ZXJfU2VxdWVudGlhbF9UcmFuc21pdF9JVCBcCisgIEhBTF9GTVBJMkNfTWFzdGVyX1NlcV9UcmFuc21pdF9JVAorI2RlZmluZSBIQUxfRk1QSTJDX01hc3Rlcl9TZXF1ZW50aWFsX1JlY2VpdmVfSVQgSEFMX0ZNUEkyQ19NYXN0ZXJfU2VxX1JlY2VpdmVfSVQKKyNkZWZpbmUgSEFMX0ZNUEkyQ19TbGF2ZV9TZXF1ZW50aWFsX1RyYW5zbWl0X0lUIEhBTF9GTVBJMkNfU2xhdmVfU2VxX1RyYW5zbWl0X0lUCisjZGVmaW5lIEhBTF9GTVBJMkNfU2xhdmVfU2VxdWVudGlhbF9SZWNlaXZlX0lUIEhBTF9GTVBJMkNfU2xhdmVfU2VxX1JlY2VpdmVfSVQKKyNkZWZpbmUgSEFMX0ZNUEkyQ19NYXN0ZXJfU2VxdWVudGlhbF9UcmFuc21pdF9ETUEgXAorICBIQUxfRk1QSTJDX01hc3Rlcl9TZXFfVHJhbnNtaXRfRE1BCisjZGVmaW5lIEhBTF9GTVBJMkNfTWFzdGVyX1NlcXVlbnRpYWxfUmVjZWl2ZV9ETUEgXAorICBIQUxfRk1QSTJDX01hc3Rlcl9TZXFfUmVjZWl2ZV9ETUEKKyNkZWZpbmUgSEFMX0ZNUEkyQ19TbGF2ZV9TZXF1ZW50aWFsX1RyYW5zbWl0X0RNQSBcCisgIEhBTF9GTVBJMkNfU2xhdmVfU2VxX1RyYW5zbWl0X0RNQQorI2RlZmluZSBIQUxfRk1QSTJDX1NsYXZlX1NlcXVlbnRpYWxfUmVjZWl2ZV9ETUEgSEFMX0ZNUEkyQ19TbGF2ZV9TZXFfUmVjZWl2ZV9ETUEKKyNlbmRpZiAvKiBTVE0zMkY0ICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBIQUxfUFdSX0FsaWFzZWQgSEFMIFBXUiBBbGlhc2VkIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgKiBAeworICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRzApCisjZGVmaW5lIEhBTF9QV1JfQ29uZmlnUFZEIEhBTF9QV1JFeF9Db25maWdQVkQKKyNkZWZpbmUgSEFMX1BXUl9FbmFibGVQVkQgSEFMX1BXUkV4X0VuYWJsZVBWRAorI2RlZmluZSBIQUxfUFdSX0Rpc2FibGVQVkQgSEFMX1BXUkV4X0Rpc2FibGVQVkQKKyNkZWZpbmUgSEFMX1BXUl9QVkRfSVJRSGFuZGxlciBIQUxfUFdSRXhfUFZEX0lSUUhhbmRsZXIKKyNlbmRpZgorI2RlZmluZSBIQUxfUFdSX1BWRENvbmZpZyBIQUxfUFdSX0NvbmZpZ1BWRAorI2RlZmluZSBIQUxfUFdSX0Rpc2FibGVCa1VwUmVnIEhBTF9QV1JFeF9EaXNhYmxlQmtVcFJlZworI2RlZmluZSBIQUxfUFdSX0Rpc2FibGVGbGFzaFBvd2VyRG93biBIQUxfUFdSRXhfRGlzYWJsZUZsYXNoUG93ZXJEb3duCisjZGVmaW5lIEhBTF9QV1JfRGlzYWJsZVZkZGlvMk1vbml0b3IgSEFMX1BXUkV4X0Rpc2FibGVWZGRpbzJNb25pdG9yCisjZGVmaW5lIEhBTF9QV1JfRW5hYmxlQmtVcFJlZyBIQUxfUFdSRXhfRW5hYmxlQmtVcFJlZworI2RlZmluZSBIQUxfUFdSX0VuYWJsZUZsYXNoUG93ZXJEb3duIEhBTF9QV1JFeF9FbmFibGVGbGFzaFBvd2VyRG93bgorI2RlZmluZSBIQUxfUFdSX0VuYWJsZVZkZGlvMk1vbml0b3IgSEFMX1BXUkV4X0VuYWJsZVZkZGlvMk1vbml0b3IKKyNkZWZpbmUgSEFMX1BXUl9QVkRfUFZNX0lSUUhhbmRsZXIgSEFMX1BXUkV4X1BWRF9QVk1fSVJRSGFuZGxlcgorI2RlZmluZSBIQUxfUFdSX1BWRExldmVsQ29uZmlnIEhBTF9QV1JfQ29uZmlnUFZECisjZGVmaW5lIEhBTF9QV1JfVmRkaW8yTW9uaXRvcl9JUlFIYW5kbGVyIEhBTF9QV1JFeF9WZGRpbzJNb25pdG9yX0lSUUhhbmRsZXIKKyNkZWZpbmUgSEFMX1BXUl9WZGRpbzJNb25pdG9yQ2FsbGJhY2sgSEFMX1BXUkV4X1ZkZGlvMk1vbml0b3JDYWxsYmFjaworI2RlZmluZSBIQUxfUFdSRXhfQWN0aXZhdGVPdmVyRHJpdmUgSEFMX1BXUkV4X0VuYWJsZU92ZXJEcml2ZQorI2RlZmluZSBIQUxfUFdSRXhfRGVhY3RpdmF0ZU92ZXJEcml2ZSBIQUxfUFdSRXhfRGlzYWJsZU92ZXJEcml2ZQorI2RlZmluZSBIQUxfUFdSRXhfRGlzYWJsZVNEQURDQW5hbG9nIEhBTF9QV1JFeF9EaXNhYmxlU0RBREMKKyNkZWZpbmUgSEFMX1BXUkV4X0VuYWJsZVNEQURDQW5hbG9nIEhBTF9QV1JFeF9FbmFibGVTREFEQworI2RlZmluZSBIQUxfUFdSRXhfUFZNQ29uZmlnIEhBTF9QV1JFeF9Db25maWdQVk0KKworI2RlZmluZSBQV1JfTU9ERV9OT1JNQUwgUFdSX1BWRF9NT0RFX05PUk1BTAorI2RlZmluZSBQV1JfTU9ERV9JVF9SSVNJTkcgUFdSX1BWRF9NT0RFX0lUX1JJU0lORworI2RlZmluZSBQV1JfTU9ERV9JVF9GQUxMSU5HIFBXUl9QVkRfTU9ERV9JVF9GQUxMSU5HCisjZGVmaW5lIFBXUl9NT0RFX0lUX1JJU0lOR19GQUxMSU5HIFBXUl9QVkRfTU9ERV9JVF9SSVNJTkdfRkFMTElORworI2RlZmluZSBQV1JfTU9ERV9FVkVOVF9SSVNJTkcgUFdSX1BWRF9NT0RFX0VWRU5UX1JJU0lORworI2RlZmluZSBQV1JfTU9ERV9FVkVOVF9GQUxMSU5HIFBXUl9QVkRfTU9ERV9FVkVOVF9GQUxMSU5HCisjZGVmaW5lIFBXUl9NT0RFX0VWRU5UX1JJU0lOR19GQUxMSU5HIFBXUl9QVkRfTU9ERV9FVkVOVF9SSVNJTkdfRkFMTElORworCisjZGVmaW5lIENSX09GRlNFVF9CQiBQV1JfQ1JfT0ZGU0VUX0JCCisjZGVmaW5lIENTUl9PRkZTRVRfQkIgUFdSX0NTUl9PRkZTRVRfQkIKKyNkZWZpbmUgUE1PREVfQklUX05VTUJFUiBWT1NfQklUX05VTUJFUgorI2RlZmluZSBDUl9QTU9ERV9CQiBDUl9WT1NfQkIKKworI2RlZmluZSBEQlBfQml0TnVtYmVyIERCUF9CSVRfTlVNQkVSCisjZGVmaW5lIFBWREVfQml0TnVtYmVyIFBWREVfQklUX05VTUJFUgorI2RlZmluZSBQTU9ERV9CaXROdW1iZXIgUE1PREVfQklUX05VTUJFUgorI2RlZmluZSBFV1VQX0JpdE51bWJlciBFV1VQX0JJVF9OVU1CRVIKKyNkZWZpbmUgRlBEU19CaXROdW1iZXIgRlBEU19CSVRfTlVNQkVSCisjZGVmaW5lIE9ERU5fQml0TnVtYmVyIE9ERU5fQklUX05VTUJFUgorI2RlZmluZSBPRFNXRU5fQml0TnVtYmVyIE9EU1dFTl9CSVRfTlVNQkVSCisjZGVmaW5lIE1STFZEU19CaXROdW1iZXIgTVJMVkRTX0JJVF9OVU1CRVIKKyNkZWZpbmUgTFBMVkRTX0JpdE51bWJlciBMUExWRFNfQklUX05VTUJFUgorI2RlZmluZSBCUkVfQml0TnVtYmVyIEJSRV9CSVRfTlVNQkVSCisKKyNkZWZpbmUgUFdSX01PREVfRVZUIFBXUl9QVkRfTU9ERV9OT1JNQUwKKworI2lmIGRlZmluZWQoU1RNMzJVNSkKKyNkZWZpbmUgUFdSX1NSQU0xX1BBR0UxX1NUT1BfUkVURU5USU9OIFBXUl9TUkFNMV9QQUdFMV9TVE9QCisjZGVmaW5lIFBXUl9TUkFNMV9QQUdFMl9TVE9QX1JFVEVOVElPTiBQV1JfU1JBTTFfUEFHRTJfU1RPUAorI2RlZmluZSBQV1JfU1JBTTFfUEFHRTNfU1RPUF9SRVRFTlRJT04gUFdSX1NSQU0xX1BBR0UzX1NUT1AKKyNkZWZpbmUgUFdSX1NSQU0xX1BBR0U0X1NUT1BfUkVURU5USU9OIFBXUl9TUkFNMV9QQUdFNF9TVE9QCisjZGVmaW5lIFBXUl9TUkFNMV9QQUdFNV9TVE9QX1JFVEVOVElPTiBQV1JfU1JBTTFfUEFHRTVfU1RPUAorI2RlZmluZSBQV1JfU1JBTTFfUEFHRTZfU1RPUF9SRVRFTlRJT04gUFdSX1NSQU0xX1BBR0U2X1NUT1AKKyNkZWZpbmUgUFdSX1NSQU0xX1BBR0U3X1NUT1BfUkVURU5USU9OIFBXUl9TUkFNMV9QQUdFN19TVE9QCisjZGVmaW5lIFBXUl9TUkFNMV9QQUdFOF9TVE9QX1JFVEVOVElPTiBQV1JfU1JBTTFfUEFHRThfU1RPUAorI2RlZmluZSBQV1JfU1JBTTFfUEFHRTlfU1RPUF9SRVRFTlRJT04gUFdSX1NSQU0xX1BBR0U5X1NUT1AKKyNkZWZpbmUgUFdSX1NSQU0xX1BBR0UxMF9TVE9QX1JFVEVOVElPTiBQV1JfU1JBTTFfUEFHRTEwX1NUT1AKKyNkZWZpbmUgUFdSX1NSQU0xX1BBR0UxMV9TVE9QX1JFVEVOVElPTiBQV1JfU1JBTTFfUEFHRTExX1NUT1AKKyNkZWZpbmUgUFdSX1NSQU0xX1BBR0UxMl9TVE9QX1JFVEVOVElPTiBQV1JfU1JBTTFfUEFHRTEyX1NUT1AKKyNkZWZpbmUgUFdSX1NSQU0xX0ZVTExfU1RPUF9SRVRFTlRJT04gUFdSX1NSQU0xX0ZVTExfU1RPUAorCisjZGVmaW5lIFBXUl9TUkFNMl9QQUdFMV9TVE9QX1JFVEVOVElPTiBQV1JfU1JBTTJfUEFHRTFfU1RPUAorI2RlZmluZSBQV1JfU1JBTTJfUEFHRTJfU1RPUF9SRVRFTlRJT04gUFdSX1NSQU0yX1BBR0UyX1NUT1AKKyNkZWZpbmUgUFdSX1NSQU0yX0ZVTExfU1RPUF9SRVRFTlRJT04gUFdSX1NSQU0yX0ZVTExfU1RPUAorCisjZGVmaW5lIFBXUl9TUkFNM19QQUdFMV9TVE9QX1JFVEVOVElPTiBQV1JfU1JBTTNfUEFHRTFfU1RPUAorI2RlZmluZSBQV1JfU1JBTTNfUEFHRTJfU1RPUF9SRVRFTlRJT04gUFdSX1NSQU0zX1BBR0UyX1NUT1AKKyNkZWZpbmUgUFdSX1NSQU0zX1BBR0UzX1NUT1BfUkVURU5USU9OIFBXUl9TUkFNM19QQUdFM19TVE9QCisjZGVmaW5lIFBXUl9TUkFNM19QQUdFNF9TVE9QX1JFVEVOVElPTiBQV1JfU1JBTTNfUEFHRTRfU1RPUAorI2RlZmluZSBQV1JfU1JBTTNfUEFHRTVfU1RPUF9SRVRFTlRJT04gUFdSX1NSQU0zX1BBR0U1X1NUT1AKKyNkZWZpbmUgUFdSX1NSQU0zX1BBR0U2X1NUT1BfUkVURU5USU9OIFBXUl9TUkFNM19QQUdFNl9TVE9QCisjZGVmaW5lIFBXUl9TUkFNM19QQUdFN19TVE9QX1JFVEVOVElPTiBQV1JfU1JBTTNfUEFHRTdfU1RPUAorI2RlZmluZSBQV1JfU1JBTTNfUEFHRThfU1RPUF9SRVRFTlRJT04gUFdSX1NSQU0zX1BBR0U4X1NUT1AKKyNkZWZpbmUgUFdSX1NSQU0zX1BBR0U5X1NUT1BfUkVURU5USU9OIFBXUl9TUkFNM19QQUdFOV9TVE9QCisjZGVmaW5lIFBXUl9TUkFNM19QQUdFMTBfU1RPUF9SRVRFTlRJT04gUFdSX1NSQU0zX1BBR0UxMF9TVE9QCisjZGVmaW5lIFBXUl9TUkFNM19QQUdFMTFfU1RPUF9SRVRFTlRJT04gUFdSX1NSQU0zX1BBR0UxMV9TVE9QCisjZGVmaW5lIFBXUl9TUkFNM19QQUdFMTJfU1RPUF9SRVRFTlRJT04gUFdSX1NSQU0zX1BBR0UxMl9TVE9QCisjZGVmaW5lIFBXUl9TUkFNM19QQUdFMTNfU1RPUF9SRVRFTlRJT04gUFdSX1NSQU0zX1BBR0UxM19TVE9QCisjZGVmaW5lIFBXUl9TUkFNM19GVUxMX1NUT1BfUkVURU5USU9OIFBXUl9TUkFNM19GVUxMX1NUT1AKKworI2RlZmluZSBQV1JfU1JBTTRfRlVMTF9TVE9QX1JFVEVOVElPTiBQV1JfU1JBTTRfRlVMTF9TVE9QCisKKyNkZWZpbmUgUFdSX1NSQU01X1BBR0UxX1NUT1BfUkVURU5USU9OIFBXUl9TUkFNNV9QQUdFMV9TVE9QCisjZGVmaW5lIFBXUl9TUkFNNV9QQUdFMl9TVE9QX1JFVEVOVElPTiBQV1JfU1JBTTVfUEFHRTJfU1RPUAorI2RlZmluZSBQV1JfU1JBTTVfUEFHRTNfU1RPUF9SRVRFTlRJT04gUFdSX1NSQU01X1BBR0UzX1NUT1AKKyNkZWZpbmUgUFdSX1NSQU01X1BBR0U0X1NUT1BfUkVURU5USU9OIFBXUl9TUkFNNV9QQUdFNF9TVE9QCisjZGVmaW5lIFBXUl9TUkFNNV9QQUdFNV9TVE9QX1JFVEVOVElPTiBQV1JfU1JBTTVfUEFHRTVfU1RPUAorI2RlZmluZSBQV1JfU1JBTTVfUEFHRTZfU1RPUF9SRVRFTlRJT04gUFdSX1NSQU01X1BBR0U2X1NUT1AKKyNkZWZpbmUgUFdSX1NSQU01X1BBR0U3X1NUT1BfUkVURU5USU9OIFBXUl9TUkFNNV9QQUdFN19TVE9QCisjZGVmaW5lIFBXUl9TUkFNNV9QQUdFOF9TVE9QX1JFVEVOVElPTiBQV1JfU1JBTTVfUEFHRThfU1RPUAorI2RlZmluZSBQV1JfU1JBTTVfUEFHRTlfU1RPUF9SRVRFTlRJT04gUFdSX1NSQU01X1BBR0U5X1NUT1AKKyNkZWZpbmUgUFdSX1NSQU01X1BBR0UxMF9TVE9QX1JFVEVOVElPTiBQV1JfU1JBTTVfUEFHRTEwX1NUT1AKKyNkZWZpbmUgUFdSX1NSQU01X1BBR0UxMV9TVE9QX1JFVEVOVElPTiBQV1JfU1JBTTVfUEFHRTExX1NUT1AKKyNkZWZpbmUgUFdSX1NSQU01X1BBR0UxMl9TVE9QX1JFVEVOVElPTiBQV1JfU1JBTTVfUEFHRTEyX1NUT1AKKyNkZWZpbmUgUFdSX1NSQU01X1BBR0UxM19TVE9QX1JFVEVOVElPTiBQV1JfU1JBTTVfUEFHRTEzX1NUT1AKKyNkZWZpbmUgUFdSX1NSQU01X0ZVTExfU1RPUF9SRVRFTlRJT04gUFdSX1NSQU01X0ZVTExfU1RPUAorCisjZGVmaW5lIFBXUl9TUkFNNl9QQUdFMV9TVE9QX1JFVEVOVElPTiBQV1JfU1JBTTZfUEFHRTFfU1RPUAorI2RlZmluZSBQV1JfU1JBTTZfUEFHRTJfU1RPUF9SRVRFTlRJT04gUFdSX1NSQU02X1BBR0UyX1NUT1AKKyNkZWZpbmUgUFdSX1NSQU02X1BBR0UzX1NUT1BfUkVURU5USU9OIFBXUl9TUkFNNl9QQUdFM19TVE9QCisjZGVmaW5lIFBXUl9TUkFNNl9QQUdFNF9TVE9QX1JFVEVOVElPTiBQV1JfU1JBTTZfUEFHRTRfU1RPUAorI2RlZmluZSBQV1JfU1JBTTZfUEFHRTVfU1RPUF9SRVRFTlRJT04gUFdSX1NSQU02X1BBR0U1X1NUT1AKKyNkZWZpbmUgUFdSX1NSQU02X1BBR0U2X1NUT1BfUkVURU5USU9OIFBXUl9TUkFNNl9QQUdFNl9TVE9QCisjZGVmaW5lIFBXUl9TUkFNNl9QQUdFN19TVE9QX1JFVEVOVElPTiBQV1JfU1JBTTZfUEFHRTdfU1RPUAorI2RlZmluZSBQV1JfU1JBTTZfUEFHRThfU1RPUF9SRVRFTlRJT04gUFdSX1NSQU02X1BBR0U4X1NUT1AKKyNkZWZpbmUgUFdSX1NSQU02X0ZVTExfU1RPUF9SRVRFTlRJT04gUFdSX1NSQU02X0ZVTExfU1RPUAorCisjZGVmaW5lIFBXUl9JQ0FDSEVfRlVMTF9TVE9QX1JFVEVOVElPTiBQV1JfSUNBQ0hFX0ZVTExfU1RPUAorI2RlZmluZSBQV1JfRENBQ0hFMV9GVUxMX1NUT1BfUkVURU5USU9OIFBXUl9EQ0FDSEUxX0ZVTExfU1RPUAorI2RlZmluZSBQV1JfRENBQ0hFMl9GVUxMX1NUT1BfUkVURU5USU9OIFBXUl9EQ0FDSEUyX0ZVTExfU1RPUAorI2RlZmluZSBQV1JfRE1BMkRSQU1fRlVMTF9TVE9QX1JFVEVOVElPTiBQV1JfRE1BMkRSQU1fRlVMTF9TVE9QCisjZGVmaW5lIFBXUl9QRVJJUEhSQU1fRlVMTF9TVE9QX1JFVEVOVElPTiBQV1JfUEVSSVBIUkFNX0ZVTExfU1RPUAorI2RlZmluZSBQV1JfUEtBMzJSQU1fRlVMTF9TVE9QX1JFVEVOVElPTiBQV1JfUEtBMzJSQU1fRlVMTF9TVE9QCisjZGVmaW5lIFBXUl9HUkFQSElDUFJBTV9GVUxMX1NUT1BfUkVURU5USU9OIFBXUl9HUkFQSElDUFJBTV9GVUxMX1NUT1AKKyNkZWZpbmUgUFdSX0RTSVJBTV9GVUxMX1NUT1BfUkVURU5USU9OIFBXUl9EU0lSQU1fRlVMTF9TVE9QCisjZGVmaW5lIFBXUl9KUEVHUkFNX0ZVTExfU1RPUF9SRVRFTlRJT04gUFdSX0pQRUdSQU1fRlVMTF9TVE9QCisKKyNkZWZpbmUgUFdSX1NSQU0yX1BBR0UxX1NUQU5EQllfUkVURU5USU9OIFBXUl9TUkFNMl9QQUdFMV9TVEFOREJZCisjZGVmaW5lIFBXUl9TUkFNMl9QQUdFMl9TVEFOREJZX1JFVEVOVElPTiBQV1JfU1JBTTJfUEFHRTJfU1RBTkRCWQorI2RlZmluZSBQV1JfU1JBTTJfRlVMTF9TVEFOREJZX1JFVEVOVElPTiBQV1JfU1JBTTJfRlVMTF9TVEFOREJZCisKKyNkZWZpbmUgUFdSX1NSQU0xX0ZVTExfUlVOX1JFVEVOVElPTiBQV1JfU1JBTTFfRlVMTF9SVU4KKyNkZWZpbmUgUFdSX1NSQU0yX0ZVTExfUlVOX1JFVEVOVElPTiBQV1JfU1JBTTJfRlVMTF9SVU4KKyNkZWZpbmUgUFdSX1NSQU0zX0ZVTExfUlVOX1JFVEVOVElPTiBQV1JfU1JBTTNfRlVMTF9SVU4KKyNkZWZpbmUgUFdSX1NSQU00X0ZVTExfUlVOX1JFVEVOVElPTiBQV1JfU1JBTTRfRlVMTF9SVU4KKyNkZWZpbmUgUFdSX1NSQU01X0ZVTExfUlVOX1JFVEVOVElPTiBQV1JfU1JBTTVfRlVMTF9SVU4KKyNkZWZpbmUgUFdSX1NSQU02X0ZVTExfUlVOX1JFVEVOVElPTiBQV1JfU1JBTTZfRlVMTF9SVU4KKworI2RlZmluZSBQV1JfQUxMX1JBTV9SVU5fUkVURU5USU9OX01BU0sgUFdSX0FMTF9SQU1fUlVOX01BU0sKKyNlbmRpZgorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBIQUxfUlRDX0FsaWFzZWRfRnVuY3Rpb25zIEhBTCBSVEMgQWxpYXNlZCBGdW5jdGlvbnMgbWFpbnRhaW5lZCBmb3IKKyAqIGxlZ2FjeSBwdXJwb3NlCisgKiBAeworICovCisjaWYgZGVmaW5lZChTVE0zMkg1KSB8fCBkZWZpbmVkKFNUTTMyV0JBKSB8fCBkZWZpbmVkKFNUTTMySDdSUykKKyNkZWZpbmUgSEFMX1JUQ0V4X1NldEJvb3RoYXJkd2FyZUtleSBIQUxfUlRDRXhfTG9ja0Jvb3RIYXJkd2FyZUtleQorI2RlZmluZSBIQUxfUlRDRXhfQktVUEJsb2NrX0VuYWJsZSBIQUxfUlRDRXhfQktVUEJsb2NrCisjZGVmaW5lIEhBTF9SVENFeF9CS1VQQmxvY2tfRGlzYWJsZSBIQUxfUlRDRXhfQktVUFVuYmxvY2sKKyNkZWZpbmUgSEFMX1JUQ0V4X0VyYXNlX1NlY3JldERldl9Db25mIEhBTF9SVENFeF9Db25maWdFcmFzZURldmljZVNlY3JldHMKKyNlbmRpZiAvKiBTVE0zMkg1IHx8IFNUTTMyV0JBIHx8IFNUTTMySDdSUyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBIQUxfU01CVVNfQWxpYXNlZF9GdW5jdGlvbnMgSEFMIFNNQlVTIEFsaWFzZWQgRnVuY3Rpb25zIG1haW50YWluZWQKKyAqIGZvciBsZWdhY3kgcHVycG9zZQorICogQHsKKyAqLworI2RlZmluZSBIQUxfU01CVVNfU2xhdmVfTGlzdGVuX0lUIEhBTF9TTUJVU19FbmFibGVMaXN0ZW5fSVQKKyNkZWZpbmUgSEFMX1NNQlVTX1NsYXZlQWRkckNhbGxiYWNrIEhBTF9TTUJVU19BZGRyQ2FsbGJhY2sKKyNkZWZpbmUgSEFMX1NNQlVTX1NsYXZlTGlzdGVuQ3BsdENhbGxiYWNrIEhBTF9TTUJVU19MaXN0ZW5DcGx0Q2FsbGJhY2sKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEhBTF9TUElfQWxpYXNlZF9GdW5jdGlvbnMgSEFMIFNQSSBBbGlhc2VkIEZ1bmN0aW9ucyBtYWludGFpbmVkIGZvcgorICogbGVnYWN5IHB1cnBvc2UKKyAqIEB7CisgKi8KKyNkZWZpbmUgSEFMX1NQSV9GbHVzaFJ4RmlmbyBIQUxfU1BJRXhfRmx1c2hSeEZpZm8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEhBTF9USU1fQWxpYXNlZF9GdW5jdGlvbnMgSEFMIFRJTSBBbGlhc2VkIEZ1bmN0aW9ucyBtYWludGFpbmVkIGZvcgorICogbGVnYWN5IHB1cnBvc2UKKyAqIEB7CisgKi8KKyNkZWZpbmUgSEFMX1RJTV9ETUFEZWxheVB1bHNlQ3BsdCBUSU1fRE1BRGVsYXlQdWxzZUNwbHQKKyNkZWZpbmUgSEFMX1RJTV9ETUFFcnJvciBUSU1fRE1BRXJyb3IKKyNkZWZpbmUgSEFMX1RJTV9ETUFDYXB0dXJlQ3BsdCBUSU1fRE1BQ2FwdHVyZUNwbHQKKyNkZWZpbmUgSEFMX1RJTUV4X0RNQUNvbW11dGF0aW9uQ3BsdCBUSU1FeF9ETUFDb21tdXRhdGlvbkNwbHQKKyNpZiBkZWZpbmVkKFNUTTMySDcpIHx8IGRlZmluZWQoU1RNMzJHMCkgfHwgZGVmaW5lZChTVE0zMkYwKSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYxKSB8fCBkZWZpbmVkKFNUTTMyRjIpIHx8IGRlZmluZWQoU1RNMzJGMykgfHwgXAorICAgIGRlZmluZWQoU1RNMzJGNCkgfHwgZGVmaW5lZChTVE0zMkY3KSB8fCBkZWZpbmVkKFNUTTMyTDApIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyTDQpCisjZGVmaW5lIEhBTF9USU1fU2xhdmVDb25maWdTeW5jaHJvbml6YXRpb24gSEFMX1RJTV9TbGF2ZUNvbmZpZ1N5bmNocm8KKyNkZWZpbmUgSEFMX1RJTV9TbGF2ZUNvbmZpZ1N5bmNocm9uaXphdGlvbl9JVCBIQUxfVElNX1NsYXZlQ29uZmlnU3luY2hyb19JVAorI2RlZmluZSBIQUxfVElNRXhfQ29tbXV0YXRpb25DYWxsYmFjayBIQUxfVElNRXhfQ29tbXV0Q2FsbGJhY2sKKyNkZWZpbmUgSEFMX1RJTUV4X0NvbmZpZ0NvbW11dGF0aW9uRXZlbnQgSEFMX1RJTUV4X0NvbmZpZ0NvbW11dEV2ZW50CisjZGVmaW5lIEhBTF9USU1FeF9Db25maWdDb21tdXRhdGlvbkV2ZW50X0lUIEhBTF9USU1FeF9Db25maWdDb21tdXRFdmVudF9JVAorI2RlZmluZSBIQUxfVElNRXhfQ29uZmlnQ29tbXV0YXRpb25FdmVudF9ETUEgSEFMX1RJTUV4X0NvbmZpZ0NvbW11dEV2ZW50X0RNQQorI2VuZGlmIC8qIFNUTTMySDcgfHwgU1RNMzJHMCB8fCBTVE0zMkYwIHx8IFNUTTMyRjEgfHwgU1RNMzJGMiB8fCBTVE0zMkYzIHx8IFwKKyAgICAgICAgICBTVE0zMkY0IHx8IFNUTTMyRjcgfHwgU1RNMzJMMCAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1VBUlRfQWxpYXNlZF9GdW5jdGlvbnMgSEFMIFVBUlQgQWxpYXNlZCBGdW5jdGlvbnMgbWFpbnRhaW5lZAorICogZm9yIGxlZ2FjeSBwdXJwb3NlCisgKiBAeworICovCisjZGVmaW5lIEhBTF9VQVJUX1dha2V1cENhbGxiYWNrIEhBTF9VQVJURXhfV2FrZXVwQ2FsbGJhY2sKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEhBTF9MVERDX0FsaWFzZWRfRnVuY3Rpb25zIEhBTCBMVERDIEFsaWFzZWQgRnVuY3Rpb25zIG1haW50YWluZWQKKyAqIGZvciBsZWdhY3kgcHVycG9zZQorICogQHsKKyAqLworI2RlZmluZSBIQUxfTFREQ19MaW5lRXZlbkNhbGxiYWNrIEhBTF9MVERDX0xpbmVFdmVudENhbGxiYWNrCisjZGVmaW5lIEhBTF9MVERDX1JlbGFvZCBIQUxfTFREQ19SZWxvYWQKKyNkZWZpbmUgSEFMX0xURENfU3RydWN0SW5pdEZyb21WaWRlb0NvbmZpZyBIQUxfTFREQ0V4X1N0cnVjdEluaXRGcm9tVmlkZW9Db25maWcKKyNkZWZpbmUgSEFMX0xURENfU3RydWN0SW5pdEZyb21BZGFwdGVkQ29tbWFuZENvbmZpZyBcCisgIEhBTF9MVERDRXhfU3RydWN0SW5pdEZyb21BZGFwdGVkQ29tbWFuZENvbmZpZworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1BQUF9BbGlhc2VkX0Z1bmN0aW9ucyBIQUwgUFBQIEFsaWFzZWQgRnVuY3Rpb25zIG1haW50YWluZWQgZm9yCisgKiBsZWdhY3kgcHVycG9zZQorICogQHsKKyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyogRXhwb3J0ZWQgbWFjcm9zCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIEhBTF9BRVNfQWxpYXNlZF9NYWNyb3MgSEFMIENSWVAgQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3IKKyAqIGxlZ2FjeSBwdXJwb3NlCisgKiBAeworICovCisjZGVmaW5lIEFFU19JVF9DQyBDUllQX0lUX0NDCisjZGVmaW5lIEFFU19JVF9FUlIgQ1JZUF9JVF9FUlIKKyNkZWZpbmUgQUVTX0ZMQUdfQ0NGIENSWVBfRkxBR19DQ0YKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEhBTF9BbGlhc2VkX01hY3JvcyBIQUwgR2VuZXJpYyBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvcgorICogbGVnYWN5IHB1cnBvc2UKKyAqIEB7CisgKi8KKyNkZWZpbmUgX19IQUxfR0VUX0JPT1RfTU9ERSBfX0hBTF9TWVNDRkdfR0VUX0JPT1RfTU9ERQorI2RlZmluZSBfX0hBTF9SRU1BUE1FTU9SWV9GTEFTSCBfX0hBTF9TWVNDRkdfUkVNQVBNRU1PUllfRkxBU0gKKyNkZWZpbmUgX19IQUxfUkVNQVBNRU1PUllfU1lTVEVNRkxBU0ggX19IQUxfU1lTQ0ZHX1JFTUFQTUVNT1JZX1NZU1RFTUZMQVNICisjZGVmaW5lIF9fSEFMX1JFTUFQTUVNT1JZX1NSQU0gX19IQUxfU1lTQ0ZHX1JFTUFQTUVNT1JZX1NSQU0KKyNkZWZpbmUgX19IQUxfUkVNQVBNRU1PUllfRk1DIF9fSEFMX1NZU0NGR19SRU1BUE1FTU9SWV9GTUMKKyNkZWZpbmUgX19IQUxfUkVNQVBNRU1PUllfRk1DX1NEUkFNIF9fSEFMX1NZU0NGR19SRU1BUE1FTU9SWV9GTUNfU0RSQU0KKyNkZWZpbmUgX19IQUxfUkVNQVBNRU1PUllfRlNNQyBfX0hBTF9TWVNDRkdfUkVNQVBNRU1PUllfRlNNQworI2RlZmluZSBfX0hBTF9SRU1BUE1FTU9SWV9RVUFEU1BJIF9fSEFMX1NZU0NGR19SRU1BUE1FTU9SWV9RVUFEU1BJCisjZGVmaW5lIF9fSEFMX0ZNQ19CQU5LIF9fSEFMX1NZU0NGR19GTUNfQkFOSworI2RlZmluZSBfX0hBTF9HRVRfRkxBRyBfX0hBTF9TWVNDRkdfR0VUX0ZMQUcKKyNkZWZpbmUgX19IQUxfQ0xFQVJfRkxBRyBfX0hBTF9TWVNDRkdfQ0xFQVJfRkxBRworI2RlZmluZSBfX0hBTF9WUkVGSU5UX09VVF9FTkFCTEUgX19IQUxfU1lTQ0ZHX1ZSRUZJTlRfT1VUX0VOQUJMRQorI2RlZmluZSBfX0hBTF9WUkVGSU5UX09VVF9ESVNBQkxFIF9fSEFMX1NZU0NGR19WUkVGSU5UX09VVF9ESVNBQkxFCisjZGVmaW5lIF9fSEFMX1NZU0NGR19TUkFNMl9XUlBfRU5BQkxFIF9fSEFMX1NZU0NGR19TUkFNMl9XUlBfMF8zMV9FTkFCTEUKKworI2RlZmluZSBTWVNDRkdfRkxBR19WUkVGX1JFQURZIFNZU0NGR19GTEFHX1ZSRUZJTlRfUkVBRFkKKyNkZWZpbmUgU1lTQ0ZHX0ZMQUdfUkM0OCBSQ0NfRkxBR19IU0k0OAorI2RlZmluZSBJU19TWVNDRkdfRkFTVE1PREVQTFVTX0NPTkZJRyBJU19JMkNfRkFTVE1PREVQTFVTCisjZGVmaW5lIFVGQl9NT0RFX0JpdE51bWJlciBVRkJfTU9ERV9CSVRfTlVNQkVSCisjZGVmaW5lIENNUF9QRF9CaXROdW1iZXIgQ01QX1BEX0JJVF9OVU1CRVIKKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0FEQ19BbGlhc2VkX01hY3JvcyBIQUwgQURDIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yCisgKiBsZWdhY3kgcHVycG9zZQorICogQHsKKyAqLworI2RlZmluZSBfX0FEQ19FTkFCTEUgX19IQUxfQURDX0VOQUJMRQorI2RlZmluZSBfX0FEQ19ESVNBQkxFIF9fSEFMX0FEQ19ESVNBQkxFCisjZGVmaW5lIF9fSEFMX0FEQ19FTkFCTElOR19DT05ESVRJT05TIEFEQ19FTkFCTElOR19DT05ESVRJT05TCisjZGVmaW5lIF9fSEFMX0FEQ19ESVNBQkxJTkdfQ09ORElUSU9OUyBBRENfRElTQUJMSU5HX0NPTkRJVElPTlMKKyNkZWZpbmUgX19IQUxfQURDX0lTX0VOQUJMRUQgQURDX0lTX0VOQUJMRQorI2RlZmluZSBfX0FEQ19JU19FTkFCTEVEIEFEQ19JU19FTkFCTEUKKyNkZWZpbmUgX19IQUxfQURDX0lTX1NPRlRXQVJFX1NUQVJUX1JFR1VMQVIgQURDX0lTX1NPRlRXQVJFX1NUQVJUX1JFR1VMQVIKKyNkZWZpbmUgX19IQUxfQURDX0lTX1NPRlRXQVJFX1NUQVJUX0lOSkVDVEVEIEFEQ19JU19TT0ZUV0FSRV9TVEFSVF9JTkpFQ1RFRAorI2RlZmluZSBfX0hBTF9BRENfSVNfQ09OVkVSU0lPTl9PTkdPSU5HX1JFR1VMQVJfSU5KRUNURUQgXAorICBBRENfSVNfQ09OVkVSU0lPTl9PTkdPSU5HX1JFR1VMQVJfSU5KRUNURUQKKyNkZWZpbmUgX19IQUxfQURDX0lTX0NPTlZFUlNJT05fT05HT0lOR19SRUdVTEFSIFwKKyAgQURDX0lTX0NPTlZFUlNJT05fT05HT0lOR19SRUdVTEFSCisjZGVmaW5lIF9fSEFMX0FEQ19JU19DT05WRVJTSU9OX09OR09JTkdfSU5KRUNURUQgXAorICBBRENfSVNfQ09OVkVSU0lPTl9PTkdPSU5HX0lOSkVDVEVECisjZGVmaW5lIF9fSEFMX0FEQ19JU19DT05WRVJTSU9OX09OR09JTkcgQURDX0lTX0NPTlZFUlNJT05fT05HT0lORworI2RlZmluZSBfX0hBTF9BRENfQ0xFQVJfRVJST1JDT0RFIEFEQ19DTEVBUl9FUlJPUkNPREUKKworI2RlZmluZSBfX0hBTF9BRENfR0VUX1JFU09MVVRJT04gQURDX0dFVF9SRVNPTFVUSU9OCisjZGVmaW5lIF9fSEFMX0FEQ19KU1FSX1JLIEFEQ19KU1FSX1JLCisjZGVmaW5lIF9fSEFMX0FEQ19DRkdSX0FXRDFDSCBBRENfQ0ZHUl9BV0QxQ0hfU0hJRlQKKyNkZWZpbmUgX19IQUxfQURDX0NGR1JfQVdEMjNDUiBBRENfQ0ZHUl9BV0QyM0NSCisjZGVmaW5lIF9fSEFMX0FEQ19DRkdSX0lOSkVDVF9BVVRPX0NPTlZFUlNJT04gQURDX0NGR1JfSU5KRUNUX0FVVE9fQ09OVkVSU0lPTgorI2RlZmluZSBfX0hBTF9BRENfQ0ZHUl9JTkpFQ1RfQ09OVEVYVF9RVUVVRSBBRENfQ0ZHUl9JTkpFQ1RfQ09OVEVYVF9RVUVVRQorI2RlZmluZSBfX0hBTF9BRENfQ0ZHUl9JTkpFQ1RfRElTQ0NPTlRJTlVPVVMgQURDX0NGR1JfSU5KRUNUX0RJU0NDT05USU5VT1VTCisjZGVmaW5lIF9fSEFMX0FEQ19DRkdSX1JFR19ESVNDQ09OVElOVU9VUyBBRENfQ0ZHUl9SRUdfRElTQ0NPTlRJTlVPVVMKKyNkZWZpbmUgX19IQUxfQURDX0NGR1JfRElTQ09OVElOVU9VU19OVU0gQURDX0NGR1JfRElTQ09OVElOVU9VU19OVU0KKyNkZWZpbmUgX19IQUxfQURDX0NGR1JfQVVUT1dBSVQgQURDX0NGR1JfQVVUT1dBSVQKKyNkZWZpbmUgX19IQUxfQURDX0NGR1JfQ09OVElOVU9VUyBBRENfQ0ZHUl9DT05USU5VT1VTCisjZGVmaW5lIF9fSEFMX0FEQ19DRkdSX09WRVJSVU4gQURDX0NGR1JfT1ZFUlJVTgorI2RlZmluZSBfX0hBTF9BRENfQ0ZHUl9ETUFDT05UUkVRIEFEQ19DRkdSX0RNQUNPTlRSRVEKKyNkZWZpbmUgX19IQUxfQURDX0NGR1JfRVhUU0VMIEFEQ19DRkdSX0VYVFNFTF9TRVQKKyNkZWZpbmUgX19IQUxfQURDX0pTUVJfSkVYVFNFTCBBRENfSlNRUl9KRVhUU0VMX1NFVAorI2RlZmluZSBfX0hBTF9BRENfT0ZSX0NIQU5ORUwgQURDX09GUl9DSEFOTkVMCisjZGVmaW5lIF9fSEFMX0FEQ19ESUZTRUxfQ0hBTk5FTCBBRENfRElGU0VMX0NIQU5ORUwKKyNkZWZpbmUgX19IQUxfQURDX0NBTEZBQ1RfRElGRl9TRVQgQURDX0NBTEZBQ1RfRElGRl9TRVQKKyNkZWZpbmUgX19IQUxfQURDX0NBTEZBQ1RfRElGRl9HRVQgQURDX0NBTEZBQ1RfRElGRl9HRVQKKyNkZWZpbmUgX19IQUxfQURDX1RSWF9ISUdIVEhSRVNIT0xEIEFEQ19UUlhfSElHSFRIUkVTSE9MRAorCisjZGVmaW5lIF9fSEFMX0FEQ19PRkZTRVRfU0hJRlRfUkVTT0xVVElPTiBBRENfT0ZGU0VUX1NISUZUX1JFU09MVVRJT04KKyNkZWZpbmUgX19IQUxfQURDX0FXRDFUSFJFU0hPTERfU0hJRlRfUkVTT0xVVElPTiBcCisgIEFEQ19BV0QxVEhSRVNIT0xEX1NISUZUX1JFU09MVVRJT04KKyNkZWZpbmUgX19IQUxfQURDX0FXRDIzVEhSRVNIT0xEX1NISUZUX1JFU09MVVRJT04gXAorICBBRENfQVdEMjNUSFJFU0hPTERfU0hJRlRfUkVTT0xVVElPTgorI2RlZmluZSBfX0hBTF9BRENfQ09NTU9OX1JFR0lTVEVSIEFEQ19DT01NT05fUkVHSVNURVIKKyNkZWZpbmUgX19IQUxfQURDX0NPTU1PTl9DQ1JfTVVMVEkgQURDX0NPTU1PTl9DQ1JfTVVMVEkKKyNkZWZpbmUgX19IQUxfQURDX01VTFRJTU9ERV9JU19FTkFCTEVEIEFEQ19NVUxUSU1PREVfSVNfRU5BQkxFCisjZGVmaW5lIF9fQURDX01VTFRJTU9ERV9JU19FTkFCTEVEIEFEQ19NVUxUSU1PREVfSVNfRU5BQkxFCisjZGVmaW5lIF9fSEFMX0FEQ19OT05NVUxUSU1PREVfT1JfTVVMVElNT0RFTUFTVEVSIFwKKyAgQURDX05PTk1VTFRJTU9ERV9PUl9NVUxUSU1PREVNQVNURVIKKyNkZWZpbmUgX19IQUxfQURDX0NPTU1PTl9BRENfT1RIRVIgQURDX0NPTU1PTl9BRENfT1RIRVIKKyNkZWZpbmUgX19IQUxfQURDX01VTFRJX1NMQVZFIEFEQ19NVUxUSV9TTEFWRQorCisjZGVmaW5lIF9fSEFMX0FEQ19TUVIxX0wgQURDX1NRUjFfTF9TSElGVAorI2RlZmluZSBfX0hBTF9BRENfSlNRUl9KTCBBRENfSlNRUl9KTF9TSElGVAorI2RlZmluZSBfX0hBTF9BRENfSlNRUl9SS19KTCBBRENfSlNRUl9SS19KTAorI2RlZmluZSBfX0hBTF9BRENfQ1IxX0RJU0NPTlRJTlVPVVNfTlVNIEFEQ19DUjFfRElTQ09OVElOVU9VU19OVU0KKyNkZWZpbmUgX19IQUxfQURDX0NSMV9TQ0FOIEFEQ19DUjFfU0NBTl9TRVQKKyNkZWZpbmUgX19IQUxfQURDX0NPTlZDWUNMRVNfTUFYX1JBTkdFIEFEQ19DT05WQ1lDTEVTX01BWF9SQU5HRQorI2RlZmluZSBfX0hBTF9BRENfQ0xPQ0tfUFJFU0NBTEVSX1JBTkdFIEFEQ19DTE9DS19QUkVTQ0FMRVJfUkFOR0UKKyNkZWZpbmUgX19IQUxfQURDX0dFVF9DTE9DS19QUkVTQ0FMRVIgQURDX0dFVF9DTE9DS19QUkVTQ0FMRVIKKworI2RlZmluZSBfX0hBTF9BRENfU1FSMSBBRENfU1FSMQorI2RlZmluZSBfX0hBTF9BRENfU01QUjEgQURDX1NNUFIxCisjZGVmaW5lIF9fSEFMX0FEQ19TTVBSMiBBRENfU01QUjIKKyNkZWZpbmUgX19IQUxfQURDX1NRUjNfUksgQURDX1NRUjNfUksKKyNkZWZpbmUgX19IQUxfQURDX1NRUjJfUksgQURDX1NRUjJfUksKKyNkZWZpbmUgX19IQUxfQURDX1NRUjFfUksgQURDX1NRUjFfUksKKyNkZWZpbmUgX19IQUxfQURDX0NSMl9DT05USU5VT1VTIEFEQ19DUjJfQ09OVElOVU9VUworI2RlZmluZSBfX0hBTF9BRENfQ1IxX0RJU0NPTlRJTlVPVVMgQURDX0NSMV9ESVNDT05USU5VT1VTCisjZGVmaW5lIF9fSEFMX0FEQ19DUjFfU0NBTkNPTlYgQURDX0NSMV9TQ0FOQ09OVgorI2RlZmluZSBfX0hBTF9BRENfQ1IyX0VPQ1NlbGVjdGlvbiBBRENfQ1IyX0VPQ1NlbGVjdGlvbgorI2RlZmluZSBfX0hBTF9BRENfQ1IyX0RNQUNvbnRSZXEgQURDX0NSMl9ETUFDb250UmVxCisjZGVmaW5lIF9fSEFMX0FEQ19KU1FSIEFEQ19KU1FSCisKKyNkZWZpbmUgX19IQUxfQURDX0NIU0VMUl9DSEFOTkVMIEFEQ19DSFNFTFJfQ0hBTk5FTAorI2RlZmluZSBfX0hBTF9BRENfQ0ZHUjFfUkVHX0RJU0NDT05USU5VT1VTIEFEQ19DRkdSMV9SRUdfRElTQ0NPTlRJTlVPVVMKKyNkZWZpbmUgX19IQUxfQURDX0NGR1IxX0FVVE9PRkYgQURDX0NGR1IxX0FVVE9PRkYKKyNkZWZpbmUgX19IQUxfQURDX0NGR1IxX0FVVE9XQUlUIEFEQ19DRkdSMV9BVVRPV0FJVAorI2RlZmluZSBfX0hBTF9BRENfQ0ZHUjFfQ09OVElOVU9VUyBBRENfQ0ZHUjFfQ09OVElOVU9VUworI2RlZmluZSBfX0hBTF9BRENfQ0ZHUjFfT1ZFUlJVTiBBRENfQ0ZHUjFfT1ZFUlJVTgorI2RlZmluZSBfX0hBTF9BRENfQ0ZHUjFfU0NBTkRJUiBBRENfQ0ZHUjFfU0NBTkRJUgorI2RlZmluZSBfX0hBTF9BRENfQ0ZHUjFfRE1BQ09OVFJFUSBBRENfQ0ZHUjFfRE1BQ09OVFJFUQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBIQUxfREFDX0FsaWFzZWRfTWFjcm9zIEhBTCBEQUMgQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3IKKyAqIGxlZ2FjeSBwdXJwb3NlCisgKiBAeworICovCisjZGVmaW5lIF9fSEFMX0RIUjEyUjFfQUxJR05FTUVOVCBEQUNfREhSMTJSMV9BTElHTk1FTlQKKyNkZWZpbmUgX19IQUxfREhSMTJSMl9BTElHTkVNRU5UIERBQ19ESFIxMlIyX0FMSUdOTUVOVAorI2RlZmluZSBfX0hBTF9ESFIxMlJEX0FMSUdORU1FTlQgREFDX0RIUjEyUkRfQUxJR05NRU5UCisjZGVmaW5lIElTX0RBQ19HRU5FUkFURV9XQVZFIElTX0RBQ19XQVZFCisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEhBTF9EQkdNQ1VfQWxpYXNlZF9NYWNyb3MgSEFMIERCR01DVSBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvcgorICogbGVnYWN5IHB1cnBvc2UKKyAqIEB7CisgKi8KKyNkZWZpbmUgX19IQUxfRlJFRVpFX1RJTTFfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfVElNMQorI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9USU0xX0RCR01DVSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfVElNMQorI2RlZmluZSBfX0hBTF9GUkVFWkVfVElNMl9EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9USU0yCisjZGVmaW5lIF9fSEFMX1VORlJFRVpFX1RJTTJfREJHTUNVIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU0yCisjZGVmaW5lIF9fSEFMX0ZSRUVaRV9USU0zX0RCR01DVSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1RJTTMKKyNkZWZpbmUgX19IQUxfVU5GUkVFWkVfVElNM19EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTMKKyNkZWZpbmUgX19IQUxfRlJFRVpFX1RJTTRfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfVElNNAorI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9USU00X0RCR01DVSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfVElNNAorI2RlZmluZSBfX0hBTF9GUkVFWkVfVElNNV9EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9USU01CisjZGVmaW5lIF9fSEFMX1VORlJFRVpFX1RJTTVfREJHTUNVIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU01CisjZGVmaW5lIF9fSEFMX0ZSRUVaRV9USU02X0RCR01DVSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1RJTTYKKyNkZWZpbmUgX19IQUxfVU5GUkVFWkVfVElNNl9EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTYKKyNkZWZpbmUgX19IQUxfRlJFRVpFX1RJTTdfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfVElNNworI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9USU03X0RCR01DVSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfVElNNworI2RlZmluZSBfX0hBTF9GUkVFWkVfVElNOF9EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9USU04CisjZGVmaW5lIF9fSEFMX1VORlJFRVpFX1RJTThfREJHTUNVIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU04CisKKyNkZWZpbmUgX19IQUxfRlJFRVpFX1RJTTlfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfVElNOQorI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9USU05X0RCR01DVSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfVElNOQorI2RlZmluZSBfX0hBTF9GUkVFWkVfVElNMTBfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfVElNMTAKKyNkZWZpbmUgX19IQUxfVU5GUkVFWkVfVElNMTBfREJHTUNVIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU0xMAorI2RlZmluZSBfX0hBTF9GUkVFWkVfVElNMTFfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfVElNMTEKKyNkZWZpbmUgX19IQUxfVU5GUkVFWkVfVElNMTFfREJHTUNVIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU0xMQorI2RlZmluZSBfX0hBTF9GUkVFWkVfVElNMTJfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfVElNMTIKKyNkZWZpbmUgX19IQUxfVU5GUkVFWkVfVElNMTJfREJHTUNVIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU0xMgorI2RlZmluZSBfX0hBTF9GUkVFWkVfVElNMTNfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfVElNMTMKKyNkZWZpbmUgX19IQUxfVU5GUkVFWkVfVElNMTNfREJHTUNVIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU0xMworI2RlZmluZSBfX0hBTF9GUkVFWkVfVElNMTRfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfVElNMTQKKyNkZWZpbmUgX19IQUxfVU5GUkVFWkVfVElNMTRfREJHTUNVIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU0xNAorI2RlZmluZSBfX0hBTF9GUkVFWkVfQ0FOMl9EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9DQU4yCisjZGVmaW5lIF9fSEFMX1VORlJFRVpFX0NBTjJfREJHTUNVIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9DQU4yCisKKyNkZWZpbmUgX19IQUxfRlJFRVpFX1RJTTE1X0RCR01DVSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1RJTTE1CisjZGVmaW5lIF9fSEFMX1VORlJFRVpFX1RJTTE1X0RCR01DVSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfVElNMTUKKyNkZWZpbmUgX19IQUxfRlJFRVpFX1RJTTE2X0RCR01DVSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1RJTTE2CisjZGVmaW5lIF9fSEFMX1VORlJFRVpFX1RJTTE2X0RCR01DVSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfVElNMTYKKyNkZWZpbmUgX19IQUxfRlJFRVpFX1RJTTE3X0RCR01DVSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1RJTTE3CisjZGVmaW5lIF9fSEFMX1VORlJFRVpFX1RJTTE3X0RCR01DVSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfVElNMTcKKyNkZWZpbmUgX19IQUxfRlJFRVpFX1JUQ19EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9SVEMKKyNkZWZpbmUgX19IQUxfVU5GUkVFWkVfUlRDX0RCR01DVSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfUlRDCisjaWYgZGVmaW5lZChTVE0zMkg3KQorI2RlZmluZSBfX0hBTF9GUkVFWkVfV1dER19EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9XV0RHMQorI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9XV0RHX0RCR01DVSBfX0hBTF9EQkdNQ1VfVW5GcmVlemVfV1dERzEKKyNkZWZpbmUgX19IQUxfRlJFRVpFX0lXREdfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfSVdERzEKKyNkZWZpbmUgX19IQUxfVU5GUkVFWkVfSVdER19EQkdNQ1UgX19IQUxfREJHTUNVX1VuRnJlZXplX0lXREcxCisjZWxzZQorI2RlZmluZSBfX0hBTF9GUkVFWkVfV1dER19EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9XV0RHCisjZGVmaW5lIF9fSEFMX1VORlJFRVpFX1dXREdfREJHTUNVIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9XV0RHCisjZGVmaW5lIF9fSEFMX0ZSRUVaRV9JV0RHX0RCR01DVSBfX0hBTF9EQkdNQ1VfRlJFRVpFX0lXREcKKyNkZWZpbmUgX19IQUxfVU5GUkVFWkVfSVdER19EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX0lXREcKKyNlbmRpZiAvKiBTVE0zMkg3ICovCisjZGVmaW5lIF9fSEFMX0ZSRUVaRV9JMkMxX1RJTUVPVVRfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfSTJDMV9USU1FT1VUCisjZGVmaW5lIF9fSEFMX1VORlJFRVpFX0kyQzFfVElNRU9VVF9EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX0kyQzFfVElNRU9VVAorI2RlZmluZSBfX0hBTF9GUkVFWkVfSTJDMl9USU1FT1VUX0RCR01DVSBfX0hBTF9EQkdNQ1VfRlJFRVpFX0kyQzJfVElNRU9VVAorI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9JMkMyX1RJTUVPVVRfREJHTUNVIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9JMkMyX1RJTUVPVVQKKyNkZWZpbmUgX19IQUxfRlJFRVpFX0kyQzNfVElNRU9VVF9EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9JMkMzX1RJTUVPVVQKKyNkZWZpbmUgX19IQUxfVU5GUkVFWkVfSTJDM19USU1FT1VUX0RCR01DVSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfSTJDM19USU1FT1VUCisjZGVmaW5lIF9fSEFMX0ZSRUVaRV9DQU4xX0RCR01DVSBfX0hBTF9EQkdNQ1VfRlJFRVpFX0NBTjEKKyNkZWZpbmUgX19IQUxfVU5GUkVFWkVfQ0FOMV9EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX0NBTjEKKyNkZWZpbmUgX19IQUxfRlJFRVpFX0xQVElNMV9EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9MUFRJTTEKKyNkZWZpbmUgX19IQUxfVU5GUkVFWkVfTFBUSU0xX0RCR01DVSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfTFBUSU0xCisjZGVmaW5lIF9fSEFMX0ZSRUVaRV9MUFRJTTJfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfTFBUSU0yCisjZGVmaW5lIF9fSEFMX1VORlJFRVpFX0xQVElNMl9EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX0xQVElNMgorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBIQUxfQ09NUF9BbGlhc2VkX01hY3JvcyBIQUwgQ09NUCBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvcgorICogbGVnYWN5IHB1cnBvc2UKKyAqIEB7CisgKi8KKyNpZiBkZWZpbmVkKFNUTTMyRjMpCisjZGVmaW5lIENPTVBfU1RBUlQgX19IQUxfQ09NUF9FTkFCTEUKKyNkZWZpbmUgQ09NUF9TVE9QIF9fSEFMX0NPTVBfRElTQUJMRQorI2RlZmluZSBDT01QX0xPQ0sgX19IQUxfQ09NUF9MT0NLCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMwMXg4KSB8fCBkZWZpbmVkKFNUTTMyRjMwMng4KSB8fCBkZWZpbmVkKFNUTTMyRjMxOHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkYzMDN4OCkgfHwgZGVmaW5lZChTVE0zMkYzMzR4OCkgfHwgZGVmaW5lZChTVE0zMkYzMjh4eCkKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX1JJU0lOR19JVF9FTkFCTEUoX19FWFRJTElORV9fKSBcCisgICgoKF9fRVhUSUxJTkVfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDIpICAgICAgICAgICAgXAorICAgICAgID8gX19IQUxfQ09NUF9DT01QMl9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpICAgIFwKKyAgIDogKChfX0VYVElMSU5FX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVA0KSAgICAgICAgICBcCisgICAgICAgPyBfX0hBTF9DT01QX0NPTVA0X0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCkgICAgXAorICAgICAgIDogX19IQUxfQ09NUF9DT01QNl9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpKQorI2RlZmluZSBfX0hBTF9DT01QX0VYVElfUklTSU5HX0lUX0RJU0FCTEUoX19FWFRJTElORV9fKSBcCisgICgoKF9fRVhUSUxJTkVfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDIpICAgICAgICAgICAgIFwKKyAgICAgICA/IF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCkgICAgXAorICAgOiAoKF9fRVhUSUxJTkVfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDQpICAgICAgICAgICBcCisgICAgICAgPyBfX0hBTF9DT01QX0NPTVA0X0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpICAgIFwKKyAgICAgICA6IF9fSEFMX0NPTVBfQ09NUDZfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCkpCisjZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9GQUxMSU5HX0lUX0VOQUJMRShfX0VYVElMSU5FX18pIFwKKyAgKCgoX19FWFRJTElORV9fKSA9PSBDT01QX0VYVElfTElORV9DT01QMikgICAgICAgICAgICAgXAorICAgICAgID8gX19IQUxfQ09NUF9DT01QMl9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKSAgICBcCisgICA6ICgoX19FWFRJTElORV9fKSA9PSBDT01QX0VYVElfTElORV9DT01QNCkgICAgICAgICAgIFwKKyAgICAgICA/IF9fSEFMX0NPTVBfQ09NUDRfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCkgICAgXAorICAgICAgIDogX19IQUxfQ09NUF9DT01QNl9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKSkKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX0ZBTExJTkdfSVRfRElTQUJMRShfX0VYVElMSU5FX18pIFwKKyAgKCgoX19FWFRJTElORV9fKSA9PSBDT01QX0VYVElfTElORV9DT01QMikgICAgICAgICAgICAgIFwKKyAgICAgICA/IF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpICAgIFwKKyAgIDogKChfX0VYVElMSU5FX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVA0KSAgICAgICAgICAgIFwKKyAgICAgICA/IF9fSEFMX0NPTVBfQ09NUDRfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpICAgIFwKKyAgICAgICA6IF9fSEFMX0NPTVBfQ09NUDZfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpKQorI2RlZmluZSBfX0hBTF9DT01QX0VYVElfRU5BQkxFX0lUKF9fRVhUSUxJTkVfXykgXAorICAoKChfX0VYVElMSU5FX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVAyKSAgICAgXAorICAgICAgID8gX19IQUxfQ09NUF9DT01QMl9FWFRJX0VOQUJMRV9JVCgpICAgICAgXAorICAgOiAoKF9fRVhUSUxJTkVfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDQpICAgXAorICAgICAgID8gX19IQUxfQ09NUF9DT01QNF9FWFRJX0VOQUJMRV9JVCgpICAgICAgXAorICAgICAgIDogX19IQUxfQ09NUF9DT01QNl9FWFRJX0VOQUJMRV9JVCgpKQorI2RlZmluZSBfX0hBTF9DT01QX0VYVElfRElTQUJMRV9JVChfX0VYVElMSU5FX18pIFwKKyAgKCgoX19FWFRJTElORV9fKSA9PSBDT01QX0VYVElfTElORV9DT01QMikgICAgICBcCisgICAgICAgPyBfX0hBTF9DT01QX0NPTVAyX0VYVElfRElTQUJMRV9JVCgpICAgICAgXAorICAgOiAoKF9fRVhUSUxJTkVfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDQpICAgIFwKKyAgICAgICA/IF9fSEFMX0NPTVBfQ09NUDRfRVhUSV9ESVNBQkxFX0lUKCkgICAgICBcCisgICAgICAgOiBfX0hBTF9DT01QX0NPTVA2X0VYVElfRElTQUJMRV9JVCgpKQorI2RlZmluZSBfX0hBTF9DT01QX0VYVElfR0VUX0ZMQUcoX19GTEFHX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKF9fRkxBR19fKSA9PSBDT01QX0VYVElfTElORV9DT01QMikgICA/IF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9HRVRfRkxBRygpIFwKKyAgIDogKChfX0ZMQUdfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDQpID8gX19IQUxfQ09NUF9DT01QNF9FWFRJX0dFVF9GTEFHKCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfX0hBTF9DT01QX0NPTVA2X0VYVElfR0VUX0ZMQUcoKSkKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX0NMRUFSX0ZMQUcoX19GTEFHX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKChfX0ZMQUdfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDIpID8gX19IQUxfQ09NUF9DT01QMl9FWFRJX0NMRUFSX0ZMQUcoKSBcCisgICA6ICgoX19GTEFHX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVA0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICA/IF9fSEFMX0NPTVBfQ09NUDRfRVhUSV9DTEVBUl9GTEFHKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIDogX19IQUxfQ09NUF9DT01QNl9FWFRJX0NMRUFSX0ZMQUcoKSkKKyNlbmRpZgorI2lmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAyeEMpCisjZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9SSVNJTkdfSVRfRU5BQkxFKF9fRVhUSUxJTkVfXykgXAorICAoKChfX0VYVElMSU5FX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVAxKSAgICAgICAgICAgIFwKKyAgICAgICA/IF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKSAgICBcCisgICA6ICgoX19FWFRJTElORV9fKSA9PSBDT01QX0VYVElfTElORV9DT01QMikgICAgICAgICAgXAorICAgICAgID8gX19IQUxfQ09NUF9DT01QMl9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpICAgIFwKKyAgIDogKChfX0VYVElMSU5FX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVA0KSAgICAgICAgICBcCisgICAgICAgPyBfX0hBTF9DT01QX0NPTVA0X0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCkgICAgXAorICAgICAgIDogX19IQUxfQ09NUF9DT01QNl9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpKQorI2RlZmluZSBfX0hBTF9DT01QX0VYVElfUklTSU5HX0lUX0RJU0FCTEUoX19FWFRJTElORV9fKSBcCisgICgoKF9fRVhUSUxJTkVfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDEpICAgICAgICAgICAgIFwKKyAgICAgICA/IF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCkgICAgXAorICAgOiAoKF9fRVhUSUxJTkVfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDIpICAgICAgICAgICBcCisgICAgICAgPyBfX0hBTF9DT01QX0NPTVAyX0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpICAgIFwKKyAgIDogKChfX0VYVElMSU5FX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVA0KSAgICAgICAgICAgXAorICAgICAgID8gX19IQUxfQ09NUF9DT01QNF9FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKSAgICBcCisgICAgICAgOiBfX0hBTF9DT01QX0NPTVA2X0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpKQorI2RlZmluZSBfX0hBTF9DT01QX0VYVElfRkFMTElOR19JVF9FTkFCTEUoX19FWFRJTElORV9fKSBcCisgICgoKF9fRVhUSUxJTkVfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDEpICAgICAgICAgICAgIFwKKyAgICAgICA/IF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCkgICAgXAorICAgOiAoKF9fRVhUSUxJTkVfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDIpICAgICAgICAgICBcCisgICAgICAgPyBfX0hBTF9DT01QX0NPTVAyX0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRSgpICAgIFwKKyAgIDogKChfX0VYVElMSU5FX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVA0KSAgICAgICAgICAgXAorICAgICAgID8gX19IQUxfQ09NUF9DT01QNF9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKSAgICBcCisgICAgICAgOiBfX0hBTF9DT01QX0NPTVA2X0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRSgpKQorI2RlZmluZSBfX0hBTF9DT01QX0VYVElfRkFMTElOR19JVF9ESVNBQkxFKF9fRVhUSUxJTkVfXykgXAorICAoKChfX0VYVElMSU5FX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVAxKSAgICAgICAgICAgICAgXAorICAgICAgID8gX19IQUxfQ09NUF9DT01QMV9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCkgICAgXAorICAgOiAoKF9fRVhUSUxJTkVfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDIpICAgICAgICAgICAgXAorICAgICAgID8gX19IQUxfQ09NUF9DT01QMl9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCkgICAgXAorICAgOiAoKF9fRVhUSUxJTkVfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDQpICAgICAgICAgICAgXAorICAgICAgID8gX19IQUxfQ09NUF9DT01QNF9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCkgICAgXAorICAgICAgIDogX19IQUxfQ09NUF9DT01QNl9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCkpCisjZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9FTkFCTEVfSVQoX19FWFRJTElORV9fKSBcCisgICgoKF9fRVhUSUxJTkVfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDEpICAgICBcCisgICAgICAgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfRU5BQkxFX0lUKCkgICAgICBcCisgICA6ICgoX19FWFRJTElORV9fKSA9PSBDT01QX0VYVElfTElORV9DT01QMikgICBcCisgICAgICAgPyBfX0hBTF9DT01QX0NPTVAyX0VYVElfRU5BQkxFX0lUKCkgICAgICBcCisgICA6ICgoX19FWFRJTElORV9fKSA9PSBDT01QX0VYVElfTElORV9DT01QNCkgICBcCisgICAgICAgPyBfX0hBTF9DT01QX0NPTVA0X0VYVElfRU5BQkxFX0lUKCkgICAgICBcCisgICAgICAgOiBfX0hBTF9DT01QX0NPTVA2X0VYVElfRU5BQkxFX0lUKCkpCisjZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9ESVNBQkxFX0lUKF9fRVhUSUxJTkVfXykgXAorICAoKChfX0VYVElMSU5FX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVAxKSAgICAgIFwKKyAgICAgICA/IF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9ESVNBQkxFX0lUKCkgICAgICBcCisgICA6ICgoX19FWFRJTElORV9fKSA9PSBDT01QX0VYVElfTElORV9DT01QMikgICAgXAorICAgICAgID8gX19IQUxfQ09NUF9DT01QMl9FWFRJX0RJU0FCTEVfSVQoKSAgICAgIFwKKyAgIDogKChfX0VYVElMSU5FX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVA0KSAgICBcCisgICAgICAgPyBfX0hBTF9DT01QX0NPTVA0X0VYVElfRElTQUJMRV9JVCgpICAgICAgXAorICAgICAgIDogX19IQUxfQ09NUF9DT01QNl9FWFRJX0RJU0FCTEVfSVQoKSkKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX0dFVF9GTEFHKF9fRkxBR19fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKChfX0ZMQUdfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDEpICAgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfR0VUX0ZMQUcoKSBcCisgICA6ICgoX19GTEFHX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVAyKSA/IF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9HRVRfRkxBRygpIFwKKyAgIDogKChfX0ZMQUdfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDQpID8gX19IQUxfQ09NUF9DT01QNF9FWFRJX0dFVF9GTEFHKCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfX0hBTF9DT01QX0NPTVA2X0VYVElfR0VUX0ZMQUcoKSkKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX0NMRUFSX0ZMQUcoX19GTEFHX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKF9fRkxBR19fKSA9PSBDT01QX0VYVElfTElORV9DT01QMSkgICA/IF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9DTEVBUl9GTEFHKCkgXAorICAgOiAoKF9fRkxBR19fKSA9PSBDT01QX0VYVElfTElORV9DT01QMikgPyBfX0hBTF9DT01QX0NPTVAyX0VYVElfQ0xFQVJfRkxBRygpIFwKKyAgIDogKChfX0ZMQUdfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgPyBfX0hBTF9DT01QX0NPTVA0X0VYVElfQ0xFQVJfRkxBRygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIDogX19IQUxfQ09NUF9DT01QNl9FWFRJX0NMRUFSX0ZMQUcoKSkKKyNlbmRpZgorI2lmIGRlZmluZWQoU1RNMzJGMzAzeEUpIHx8IGRlZmluZWQoU1RNMzJGMzk4eHgpIHx8IGRlZmluZWQoU1RNMzJGMzAzeEMpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRjM1OHh4KQorI2RlZmluZSBfX0hBTF9DT01QX0VYVElfUklTSU5HX0lUX0VOQUJMRShfX0VYVElMSU5FX18pIFwKKyAgKCgoX19FWFRJTElORV9fKSA9PSBDT01QX0VYVElfTElORV9DT01QMSkgICAgICAgICAgICBcCisgICAgICAgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCkgICAgXAorICAgOiAoKF9fRVhUSUxJTkVfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDIpICAgICAgICAgIFwKKyAgICAgICA/IF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKSAgICBcCisgICA6ICgoX19FWFRJTElORV9fKSA9PSBDT01QX0VYVElfTElORV9DT01QMykgICAgICAgICAgXAorICAgICAgID8gX19IQUxfQ09NUF9DT01QM19FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpICAgIFwKKyAgIDogKChfX0VYVElMSU5FX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVA0KSAgICAgICAgICBcCisgICAgICAgPyBfX0hBTF9DT01QX0NPTVA0X0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCkgICAgXAorICAgOiAoKF9fRVhUSUxJTkVfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDUpICAgICAgICAgIFwKKyAgICAgICA/IF9fSEFMX0NPTVBfQ09NUDVfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKSAgICBcCisgICA6ICgoX19FWFRJTElORV9fKSA9PSBDT01QX0VYVElfTElORV9DT01QNikgICAgICAgICAgXAorICAgICAgID8gX19IQUxfQ09NUF9DT01QNl9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpICAgIFwKKyAgICAgICA6IF9fSEFMX0NPTVBfQ09NUDdfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKSkKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX1JJU0lOR19JVF9ESVNBQkxFKF9fRVhUSUxJTkVfXykgXAorICAoKChfX0VYVElMSU5FX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVAxKSAgICAgICAgICAgICBcCisgICAgICAgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpICAgIFwKKyAgIDogKChfX0VYVElMSU5FX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVAyKSAgICAgICAgICAgXAorICAgICAgID8gX19IQUxfQ09NUF9DT01QMl9FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKSAgICBcCisgICA6ICgoX19FWFRJTElORV9fKSA9PSBDT01QX0VYVElfTElORV9DT01QMykgICAgICAgICAgIFwKKyAgICAgICA/IF9fSEFMX0NPTVBfQ09NUDNfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCkgICAgXAorICAgOiAoKF9fRVhUSUxJTkVfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDQpICAgICAgICAgICBcCisgICAgICAgPyBfX0hBTF9DT01QX0NPTVA0X0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpICAgIFwKKyAgIDogKChfX0VYVElMSU5FX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVA1KSAgICAgICAgICAgXAorICAgICAgID8gX19IQUxfQ09NUF9DT01QNV9FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKSAgICBcCisgICA6ICgoX19FWFRJTElORV9fKSA9PSBDT01QX0VYVElfTElORV9DT01QNikgICAgICAgICAgIFwKKyAgICAgICA/IF9fSEFMX0NPTVBfQ09NUDZfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCkgICAgXAorICAgICAgIDogX19IQUxfQ09NUF9DT01QN19FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKSkKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX0ZBTExJTkdfSVRfRU5BQkxFKF9fRVhUSUxJTkVfXykgXAorICAoKChfX0VYVElMSU5FX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVAxKSAgICAgICAgICAgICBcCisgICAgICAgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRSgpICAgIFwKKyAgIDogKChfX0VYVElMSU5FX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVAyKSAgICAgICAgICAgXAorICAgICAgID8gX19IQUxfQ09NUF9DT01QMl9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKSAgICBcCisgICA6ICgoX19FWFRJTElORV9fKSA9PSBDT01QX0VYVElfTElORV9DT01QMykgICAgICAgICAgIFwKKyAgICAgICA/IF9fSEFMX0NPTVBfQ09NUDNfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCkgICAgXAorICAgOiAoKF9fRVhUSUxJTkVfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDQpICAgICAgICAgICBcCisgICAgICAgPyBfX0hBTF9DT01QX0NPTVA0X0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRSgpICAgIFwKKyAgIDogKChfX0VYVElMSU5FX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVA1KSAgICAgICAgICAgXAorICAgICAgID8gX19IQUxfQ09NUF9DT01QNV9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKSAgICBcCisgICA6ICgoX19FWFRJTElORV9fKSA9PSBDT01QX0VYVElfTElORV9DT01QNikgICAgICAgICAgIFwKKyAgICAgICA/IF9fSEFMX0NPTVBfQ09NUDZfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCkgICAgXAorICAgICAgIDogX19IQUxfQ09NUF9DT01QN19FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKSkKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX0ZBTExJTkdfSVRfRElTQUJMRShfX0VYVElMSU5FX18pIFwKKyAgKCgoX19FWFRJTElORV9fKSA9PSBDT01QX0VYVElfTElORV9DT01QMSkgICAgICAgICAgICAgIFwKKyAgICAgICA/IF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpICAgIFwKKyAgIDogKChfX0VYVElMSU5FX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVAyKSAgICAgICAgICAgIFwKKyAgICAgICA/IF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpICAgIFwKKyAgIDogKChfX0VYVElMSU5FX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVAzKSAgICAgICAgICAgIFwKKyAgICAgICA/IF9fSEFMX0NPTVBfQ09NUDNfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpICAgIFwKKyAgIDogKChfX0VYVElMSU5FX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVA0KSAgICAgICAgICAgIFwKKyAgICAgICA/IF9fSEFMX0NPTVBfQ09NUDRfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpICAgIFwKKyAgIDogKChfX0VYVElMSU5FX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVA1KSAgICAgICAgICAgIFwKKyAgICAgICA/IF9fSEFMX0NPTVBfQ09NUDVfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpICAgIFwKKyAgIDogKChfX0VYVElMSU5FX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVA2KSAgICAgICAgICAgIFwKKyAgICAgICA/IF9fSEFMX0NPTVBfQ09NUDZfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpICAgIFwKKyAgICAgICA6IF9fSEFMX0NPTVBfQ09NUDdfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpKQorI2RlZmluZSBfX0hBTF9DT01QX0VYVElfRU5BQkxFX0lUKF9fRVhUSUxJTkVfXykgXAorICAoKChfX0VYVElMSU5FX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVAxKSAgICAgXAorICAgICAgID8gX19IQUxfQ09NUF9DT01QMV9FWFRJX0VOQUJMRV9JVCgpICAgICAgXAorICAgOiAoKF9fRVhUSUxJTkVfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDIpICAgXAorICAgICAgID8gX19IQUxfQ09NUF9DT01QMl9FWFRJX0VOQUJMRV9JVCgpICAgICAgXAorICAgOiAoKF9fRVhUSUxJTkVfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDMpICAgXAorICAgICAgID8gX19IQUxfQ09NUF9DT01QM19FWFRJX0VOQUJMRV9JVCgpICAgICAgXAorICAgOiAoKF9fRVhUSUxJTkVfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDQpICAgXAorICAgICAgID8gX19IQUxfQ09NUF9DT01QNF9FWFRJX0VOQUJMRV9JVCgpICAgICAgXAorICAgOiAoKF9fRVhUSUxJTkVfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDUpICAgXAorICAgICAgID8gX19IQUxfQ09NUF9DT01QNV9FWFRJX0VOQUJMRV9JVCgpICAgICAgXAorICAgOiAoKF9fRVhUSUxJTkVfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDYpICAgXAorICAgICAgID8gX19IQUxfQ09NUF9DT01QNl9FWFRJX0VOQUJMRV9JVCgpICAgICAgXAorICAgICAgIDogX19IQUxfQ09NUF9DT01QN19FWFRJX0VOQUJMRV9JVCgpKQorI2RlZmluZSBfX0hBTF9DT01QX0VYVElfRElTQUJMRV9JVChfX0VYVElMSU5FX18pIFwKKyAgKCgoX19FWFRJTElORV9fKSA9PSBDT01QX0VYVElfTElORV9DT01QMSkgICAgICBcCisgICAgICAgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfRElTQUJMRV9JVCgpICAgICAgXAorICAgOiAoKF9fRVhUSUxJTkVfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDIpICAgIFwKKyAgICAgICA/IF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9ESVNBQkxFX0lUKCkgICAgICBcCisgICA6ICgoX19FWFRJTElORV9fKSA9PSBDT01QX0VYVElfTElORV9DT01QMykgICAgXAorICAgICAgID8gX19IQUxfQ09NUF9DT01QM19FWFRJX0RJU0FCTEVfSVQoKSAgICAgIFwKKyAgIDogKChfX0VYVElMSU5FX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVA0KSAgICBcCisgICAgICAgPyBfX0hBTF9DT01QX0NPTVA0X0VYVElfRElTQUJMRV9JVCgpICAgICAgXAorICAgOiAoKF9fRVhUSUxJTkVfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDUpICAgIFwKKyAgICAgICA/IF9fSEFMX0NPTVBfQ09NUDVfRVhUSV9ESVNBQkxFX0lUKCkgICAgICBcCisgICA6ICgoX19FWFRJTElORV9fKSA9PSBDT01QX0VYVElfTElORV9DT01QNikgICAgXAorICAgICAgID8gX19IQUxfQ09NUF9DT01QNl9FWFRJX0RJU0FCTEVfSVQoKSAgICAgIFwKKyAgICAgICA6IF9fSEFMX0NPTVBfQ09NUDdfRVhUSV9ESVNBQkxFX0lUKCkpCisjZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9HRVRfRkxBRyhfX0ZMQUdfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoX19GTEFHX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVAxKSAgID8gX19IQUxfQ09NUF9DT01QMV9FWFRJX0dFVF9GTEFHKCkgXAorICAgOiAoKF9fRkxBR19fKSA9PSBDT01QX0VYVElfTElORV9DT01QMikgPyBfX0hBTF9DT01QX0NPTVAyX0VYVElfR0VUX0ZMQUcoKSBcCisgICA6ICgoX19GTEFHX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVAzKSA/IF9fSEFMX0NPTVBfQ09NUDNfRVhUSV9HRVRfRkxBRygpIFwKKyAgIDogKChfX0ZMQUdfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDQpID8gX19IQUxfQ09NUF9DT01QNF9FWFRJX0dFVF9GTEFHKCkgXAorICAgOiAoKF9fRkxBR19fKSA9PSBDT01QX0VYVElfTElORV9DT01QNSkgPyBfX0hBTF9DT01QX0NPTVA1X0VYVElfR0VUX0ZMQUcoKSBcCisgICA6ICgoX19GTEFHX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVA2KSA/IF9fSEFMX0NPTVBfQ09NUDZfRVhUSV9HRVRfRkxBRygpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX19IQUxfQ09NUF9DT01QN19FWFRJX0dFVF9GTEFHKCkpCisjZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9DTEVBUl9GTEFHKF9fRkxBR19fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKChfX0ZMQUdfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDEpICAgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfQ0xFQVJfRkxBRygpIFwKKyAgIDogKChfX0ZMQUdfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDIpID8gX19IQUxfQ09NUF9DT01QMl9FWFRJX0NMRUFSX0ZMQUcoKSBcCisgICA6ICgoX19GTEFHX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVAzKSA/IF9fSEFMX0NPTVBfQ09NUDNfRVhUSV9DTEVBUl9GTEFHKCkgXAorICAgOiAoKF9fRkxBR19fKSA9PSBDT01QX0VYVElfTElORV9DT01QNCkgPyBfX0hBTF9DT01QX0NPTVA0X0VYVElfQ0xFQVJfRkxBRygpIFwKKyAgIDogKChfX0ZMQUdfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDUpID8gX19IQUxfQ09NUF9DT01QNV9FWFRJX0NMRUFSX0ZMQUcoKSBcCisgICA6ICgoX19GTEFHX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVA2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgID8gX19IQUxfQ09NUF9DT01QNl9FWFRJX0NMRUFSX0ZMQUcoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICA6IF9fSEFMX0NPTVBfQ09NUDdfRVhUSV9DTEVBUl9GTEFHKCkpCisjZW5kaWYKKyNpZiBkZWZpbmVkKFNUTTMyRjM3M3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM3OHh4KQorI2RlZmluZSBfX0hBTF9DT01QX0VYVElfUklTSU5HX0lUX0VOQUJMRShfX0VYVElMSU5FX18pIFwKKyAgKCgoX19FWFRJTElORV9fKSA9PSBDT01QX0VYVElfTElORV9DT01QMSkgICAgICAgICAgICBcCisgICAgICAgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCkgICAgXAorICAgICAgIDogX19IQUxfQ09NUF9DT01QMl9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpKQorI2RlZmluZSBfX0hBTF9DT01QX0VYVElfUklTSU5HX0lUX0RJU0FCTEUoX19FWFRJTElORV9fKSBcCisgICgoKF9fRVhUSUxJTkVfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDEpICAgICAgICAgICAgIFwKKyAgICAgICA/IF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCkgICAgXAorICAgICAgIDogX19IQUxfQ09NUF9DT01QMl9FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKSkKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX0ZBTExJTkdfSVRfRU5BQkxFKF9fRVhUSUxJTkVfXykgXAorICAoKChfX0VYVElMSU5FX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVAxKSAgICAgICAgICAgICBcCisgICAgICAgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRSgpICAgIFwKKyAgICAgICA6IF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCkpCisjZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9GQUxMSU5HX0lUX0RJU0FCTEUoX19FWFRJTElORV9fKSBcCisgICgoKF9fRVhUSUxJTkVfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDEpICAgICAgICAgICAgICBcCisgICAgICAgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKSAgICBcCisgICAgICAgOiBfX0hBTF9DT01QX0NPTVAyX0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKSkKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX0VOQUJMRV9JVChfX0VYVElMSU5FX18pIFwKKyAgKCgoX19FWFRJTElORV9fKSA9PSBDT01QX0VYVElfTElORV9DT01QMSkgICAgIFwKKyAgICAgICA/IF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9FTkFCTEVfSVQoKSAgICAgIFwKKyAgICAgICA6IF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9FTkFCTEVfSVQoKSkKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX0RJU0FCTEVfSVQoX19FWFRJTElORV9fKSBcCisgICgoKF9fRVhUSUxJTkVfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDEpICAgICAgXAorICAgICAgID8gX19IQUxfQ09NUF9DT01QMV9FWFRJX0RJU0FCTEVfSVQoKSAgICAgIFwKKyAgICAgICA6IF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9ESVNBQkxFX0lUKCkpCisjZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9HRVRfRkxBRyhfX0ZMQUdfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKF9fRkxBR19fKSA9PSBDT01QX0VYVElfTElORV9DT01QMSkgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfR0VUX0ZMQUcoKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfX0hBTF9DT01QX0NPTVAyX0VYVElfR0VUX0ZMQUcoKSkKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX0NMRUFSX0ZMQUcoX19GTEFHX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKChfX0ZMQUdfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDEpID8gX19IQUxfQ09NUF9DT01QMV9FWFRJX0NMRUFSX0ZMQUcoKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfX0hBTF9DT01QX0NPTVAyX0VYVElfQ0xFQVJfRkxBRygpKQorI2VuZGlmCisjZWxzZQorI2RlZmluZSBfX0hBTF9DT01QX0VYVElfUklTSU5HX0lUX0VOQUJMRShfX0VYVElMSU5FX18pIFwKKyAgKCgoX19FWFRJTElORV9fKSA9PSBDT01QX0VYVElfTElORV9DT01QMSkgICAgICAgICAgICBcCisgICAgICAgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCkgICAgXAorICAgICAgIDogX19IQUxfQ09NUF9DT01QMl9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpKQorI2RlZmluZSBfX0hBTF9DT01QX0VYVElfUklTSU5HX0lUX0RJU0FCTEUoX19FWFRJTElORV9fKSBcCisgICgoKF9fRVhUSUxJTkVfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDEpICAgICAgICAgICAgIFwKKyAgICAgICA/IF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCkgICAgXAorICAgICAgIDogX19IQUxfQ09NUF9DT01QMl9FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKSkKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX0ZBTExJTkdfSVRfRU5BQkxFKF9fRVhUSUxJTkVfXykgXAorICAoKChfX0VYVElMSU5FX18pID09IENPTVBfRVhUSV9MSU5FX0NPTVAxKSAgICAgICAgICAgICBcCisgICAgICAgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRSgpICAgIFwKKyAgICAgICA6IF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCkpCisjZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9GQUxMSU5HX0lUX0RJU0FCTEUoX19FWFRJTElORV9fKSBcCisgICgoKF9fRVhUSUxJTkVfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDEpICAgICAgICAgICAgICBcCisgICAgICAgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKSAgICBcCisgICAgICAgOiBfX0hBTF9DT01QX0NPTVAyX0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKSkKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX0VOQUJMRV9JVChfX0VYVElMSU5FX18pIFwKKyAgKCgoX19FWFRJTElORV9fKSA9PSBDT01QX0VYVElfTElORV9DT01QMSkgICAgIFwKKyAgICAgICA/IF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9FTkFCTEVfSVQoKSAgICAgIFwKKyAgICAgICA6IF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9FTkFCTEVfSVQoKSkKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX0RJU0FCTEVfSVQoX19FWFRJTElORV9fKSBcCisgICgoKF9fRVhUSUxJTkVfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDEpICAgICAgXAorICAgICAgID8gX19IQUxfQ09NUF9DT01QMV9FWFRJX0RJU0FCTEVfSVQoKSAgICAgIFwKKyAgICAgICA6IF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9ESVNBQkxFX0lUKCkpCisjZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9HRVRfRkxBRyhfX0ZMQUdfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKF9fRkxBR19fKSA9PSBDT01QX0VYVElfTElORV9DT01QMSkgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfR0VUX0ZMQUcoKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfX0hBTF9DT01QX0NPTVAyX0VYVElfR0VUX0ZMQUcoKSkKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX0NMRUFSX0ZMQUcoX19GTEFHX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKChfX0ZMQUdfXykgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDEpID8gX19IQUxfQ09NUF9DT01QMV9FWFRJX0NMRUFSX0ZMQUcoKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfX0hBTF9DT01QX0NPTVAyX0VYVElfQ0xFQVJfRkxBRygpKQorI2VuZGlmCisKKyNkZWZpbmUgX19IQUxfQ09NUF9HRVRfRVhUSV9MSU5FIENPTVBfR0VUX0VYVElfTElORQorCisjaWYgZGVmaW5lZChTVE0zMkwwKSB8fCBkZWZpbmVkKFNUTTMyTDQpCisvKiBOb3RlOiBPbiB0aGVzZSBTVE0zMiBmYW1pbGllcywgdGhlIG9ubHkgYXJndW1lbnQgb2YgdGhpcyBtYWNybyAgICAgICAgICAgICAqLworLyogICAgICAgaXMgQ09NUF9GTEFHX0xPQ0suICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIFRoaXMgbWFjcm8gaXMgcmVwbGFjZWQgYnkgX19IQUxfQ09NUF9JU19MT0NLRUQgd2l0aCBvbmx5IEhBTCBoYW5kbGUgICovCisvKiAgICAgICBhcmd1bWVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX0hBTF9DT01QX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSBcCisgIChfX0hBTF9DT01QX0lTX0xPQ0tFRChfX0hBTkRMRV9fKSkKKyNlbmRpZgorLyoqCisgKiBAfQorICovCisKKyNpZiBkZWZpbmVkKFNUTTMyTDApIHx8IGRlZmluZWQoU1RNMzJMNCkKKy8qKiBAZGVmZ3JvdXAgSEFMX0NPTVBfQWxpYXNlZF9GdW5jdGlvbnMgSEFMIENPTVAgQWxpYXNlZCBGdW5jdGlvbnMgbWFpbnRhaW5lZAorICogZm9yIGxlZ2FjeSBwdXJwb3NlCisgKiBAeworICovCisjZGVmaW5lIEhBTF9DT01QX1N0YXJ0X0lUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBIQUxfQ09NUF9TdGFydCAvKiBGdW5jdGlvbiBjb25zaWRlcmVkIGFzIGxlZ2FjeSBhcyBFWFRJIGV2ZW50IG9yIElUIFwKKyAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBpcyBkb25lIGludG8gSEFMX0NPTVBfSW5pdCgpICovCisjZGVmaW5lIEhBTF9DT01QX1N0b3BfSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEhBTF9DT01QX1N0b3AgLyogRnVuY3Rpb24gY29uc2lkZXJlZCBhcyBsZWdhY3kgYXMgRVhUSSBldmVudCBvciBJVCBcCisgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBpcyBkb25lIGludG8gSEFMX0NPTVBfSW5pdCgpICovCisvKioKKyAqIEB9CisgKi8KKyNlbmRpZgorCisvKiogQGRlZmdyb3VwIEhBTF9EQUNfQWxpYXNlZF9NYWNyb3MgSEFMIERBQyBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvcgorICogbGVnYWN5IHB1cnBvc2UKKyAqIEB7CisgKi8KKworI2RlZmluZSBJU19EQUNfV0FWRShXQVZFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKFdBVkUpID09IERBQ19XQVZFX05PTkUpIHx8ICgoV0FWRSkgPT0gREFDX1dBVkVfTk9JU0UpIHx8IFwKKyAgICgoV0FWRSkgPT0gREFDX1dBVkVfVFJJQU5HTEUpKQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBIQUxfRkxBU0hfQWxpYXNlZF9NYWNyb3MgSEFMIEZMQVNIIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yCisgKiBsZWdhY3kgcHVycG9zZQorICogQHsKKyAqLworCisjZGVmaW5lIElTX1dSUEFSRUEgSVNfT0JfV1JQQVJFQQorI2RlZmluZSBJU19UWVBFUFJPR1JBTSBJU19GTEFTSF9UWVBFUFJPR1JBTQorI2RlZmluZSBJU19UWVBFUFJPR1JBTUZMQVNIIElTX0ZMQVNIX1RZUEVQUk9HUkFNCisjZGVmaW5lIElTX1RZUEVFUkFTRSBJU19GTEFTSF9UWVBFRVJBU0UKKyNkZWZpbmUgSVNfTkJTRUNUT1JTIElTX0ZMQVNIX05CU0VDVE9SUworI2RlZmluZSBJU19PQl9XREdfU09VUkNFIElTX09CX0lXREdfU09VUkNFCisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEhBTF9JMkNfQWxpYXNlZF9NYWNyb3MgSEFMIEkyQyBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvcgorICogbGVnYWN5IHB1cnBvc2UKKyAqIEB7CisgKi8KKworI2RlZmluZSBfX0hBTF9JMkNfUkVTRVRfQ1IyIEkyQ19SRVNFVF9DUjIKKyNkZWZpbmUgX19IQUxfSTJDX0dFTkVSQVRFX1NUQVJUIEkyQ19HRU5FUkFURV9TVEFSVAorI2lmIGRlZmluZWQoU1RNMzJGMSkKKyNkZWZpbmUgX19IQUxfSTJDX0ZSRVFfUkFOR0UgSTJDX0ZSRVFSQU5HRQorI2Vsc2UKKyNkZWZpbmUgX19IQUxfSTJDX0ZSRVFfUkFOR0UgSTJDX0ZSRVFfUkFOR0UKKyNlbmRpZiAvKiBTVE0zMkYxICovCisjZGVmaW5lIF9fSEFMX0kyQ19SSVNFX1RJTUUgSTJDX1JJU0VfVElNRQorI2RlZmluZSBfX0hBTF9JMkNfU1BFRURfU1RBTkRBUkQgSTJDX1NQRUVEX1NUQU5EQVJECisjZGVmaW5lIF9fSEFMX0kyQ19TUEVFRF9GQVNUIEkyQ19TUEVFRF9GQVNUCisjZGVmaW5lIF9fSEFMX0kyQ19TUEVFRCBJMkNfU1BFRUQKKyNkZWZpbmUgX19IQUxfSTJDXzdCSVRfQUREX1dSSVRFIEkyQ183QklUX0FERF9XUklURQorI2RlZmluZSBfX0hBTF9JMkNfN0JJVF9BRERfUkVBRCBJMkNfN0JJVF9BRERfUkVBRAorI2RlZmluZSBfX0hBTF9JMkNfMTBCSVRfQUREUkVTUyBJMkNfMTBCSVRfQUREUkVTUworI2RlZmluZSBfX0hBTF9JMkNfMTBCSVRfSEVBREVSX1dSSVRFIEkyQ18xMEJJVF9IRUFERVJfV1JJVEUKKyNkZWZpbmUgX19IQUxfSTJDXzEwQklUX0hFQURFUl9SRUFEIEkyQ18xMEJJVF9IRUFERVJfUkVBRAorI2RlZmluZSBfX0hBTF9JMkNfTUVNX0FERF9NU0IgSTJDX01FTV9BRERfTVNCCisjZGVmaW5lIF9fSEFMX0kyQ19NRU1fQUREX0xTQiBJMkNfTUVNX0FERF9MU0IKKyNkZWZpbmUgX19IQUxfSTJDX0ZSRVFSQU5HRSBJMkNfRlJFUVJBTkdFCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBIQUxfSTJTX0FsaWFzZWRfTWFjcm9zIEhBTCBJMlMgQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3IKKyAqIGxlZ2FjeSBwdXJwb3NlCisgKiBAeworICovCisKKyNkZWZpbmUgSVNfSTJTX0lOU1RBTkNFIElTX0kyU19BTExfSU5TVEFOQ0UKKyNkZWZpbmUgSVNfSTJTX0lOU1RBTkNFX0VYVCBJU19JMlNfQUxMX0lOU1RBTkNFX0VYVAorCisjaWYgZGVmaW5lZChTVE0zMkg3KQorI2RlZmluZSBfX0hBTF9JMlNfQ0xFQVJfRlJFRkxBRyBfX0hBTF9JMlNfQ0xFQVJfVElGUkVGTEFHCisjZW5kaWYKKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0lSREFfQWxpYXNlZF9NYWNyb3MgSEFMIElSREEgQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3IKKyAqIGxlZ2FjeSBwdXJwb3NlCisgKiBAeworICovCisKKyNkZWZpbmUgX19JUkRBX0RJU0FCTEUgX19IQUxfSVJEQV9ESVNBQkxFCisjZGVmaW5lIF9fSVJEQV9FTkFCTEUgX19IQUxfSVJEQV9FTkFCTEUKKworI2RlZmluZSBfX0hBTF9JUkRBX0dFVENMT0NLU09VUkNFIElSREFfR0VUQ0xPQ0tTT1VSQ0UKKyNkZWZpbmUgX19IQUxfSVJEQV9NQVNLX0NPTVBVVEFUSU9OIElSREFfTUFTS19DT01QVVRBVElPTgorI2RlZmluZSBfX0lSREFfR0VUQ0xPQ0tTT1VSQ0UgSVJEQV9HRVRDTE9DS1NPVVJDRQorI2RlZmluZSBfX0lSREFfTUFTS19DT01QVVRBVElPTiBJUkRBX01BU0tfQ09NUFVUQVRJT04KKworI2RlZmluZSBJU19JUkRBX09ORUJJVF9TQU1QTEUgSVNfSVJEQV9PTkVfQklUX1NBTVBMRQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBIQUxfSVdER19BbGlhc2VkX01hY3JvcyBIQUwgSVdERyBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvcgorICogbGVnYWN5IHB1cnBvc2UKKyAqIEB7CisgKi8KKyNkZWZpbmUgX19IQUxfSVdER19FTkFCTEVfV1JJVEVfQUNDRVNTIElXREdfRU5BQkxFX1dSSVRFX0FDQ0VTUworI2RlZmluZSBfX0hBTF9JV0RHX0RJU0FCTEVfV1JJVEVfQUNDRVNTIElXREdfRElTQUJMRV9XUklURV9BQ0NFU1MKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEhBTF9MUFRJTV9BbGlhc2VkX01hY3JvcyBIQUwgTFBUSU0gQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3IKKyAqIGxlZ2FjeSBwdXJwb3NlCisgKiBAeworICovCisKKyNkZWZpbmUgX19IQUxfTFBUSU1fRU5BQkxFX0lOVEVSUlVQVCBfX0hBTF9MUFRJTV9FTkFCTEVfSVQKKyNkZWZpbmUgX19IQUxfTFBUSU1fRElTQUJMRV9JTlRFUlJVUFQgX19IQUxfTFBUSU1fRElTQUJMRV9JVAorI2RlZmluZSBfX0hBTF9MUFRJTV9HRVRfSVRTVEFUVVMgX19IQUxfTFBUSU1fR0VUX0lUX1NPVVJDRQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBIQUxfT1BBTVBfQWxpYXNlZF9NYWNyb3MgSEFMIE9QQU1QIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yCisgKiBsZWdhY3kgcHVycG9zZQorICogQHsKKyAqLworI2RlZmluZSBfX09QQU1QX0NTUl9PUEFYUEQgT1BBTVBfQ1NSX09QQVhQRAorI2RlZmluZSBfX09QQU1QX0NTUl9TM1NFTFggT1BBTVBfQ1NSX1MzU0VMWAorI2RlZmluZSBfX09QQU1QX0NTUl9TNFNFTFggT1BBTVBfQ1NSX1M0U0VMWAorI2RlZmluZSBfX09QQU1QX0NTUl9TNVNFTFggT1BBTVBfQ1NSX1M1U0VMWAorI2RlZmluZSBfX09QQU1QX0NTUl9TNlNFTFggT1BBTVBfQ1NSX1M2U0VMWAorI2RlZmluZSBfX09QQU1QX0NTUl9PUEFYQ0FMX0wgT1BBTVBfQ1NSX09QQVhDQUxfTAorI2RlZmluZSBfX09QQU1QX0NTUl9PUEFYQ0FMX0ggT1BBTVBfQ1NSX09QQVhDQUxfSAorI2RlZmluZSBfX09QQU1QX0NTUl9PUEFYTFBNIE9QQU1QX0NTUl9PUEFYTFBNCisjZGVmaW5lIF9fT1BBTVBfQ1NSX0FMTF9TV0lUQ0hFUyBPUEFNUF9DU1JfQUxMX1NXSVRDSEVTCisjZGVmaW5lIF9fT1BBTVBfQ1NSX0FOQVdTRUxYIE9QQU1QX0NTUl9BTkFXU0VMWAorI2RlZmluZSBfX09QQU1QX0NTUl9PUEFYQ0FMT1VUIE9QQU1QX0NTUl9PUEFYQ0FMT1VUCisjZGVmaW5lIF9fT1BBTVBfT0ZGU0VUX1RSSU1fQklUU1BPU0lUSU9OIE9QQU1QX09GRlNFVF9UUklNX0JJVFNQT1NJVElPTgorI2RlZmluZSBfX09QQU1QX09GRlNFVF9UUklNX1NFVCBPUEFNUF9PRkZTRVRfVFJJTV9TRVQKKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1BXUl9BbGlhc2VkX01hY3JvcyBIQUwgUFdSIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yCisgKiBsZWdhY3kgcHVycG9zZQorICogQHsKKyAqLworI2RlZmluZSBfX0hBTF9QVkRfRVZFTlRfRElTQUJMRSBfX0hBTF9QV1JfUFZEX0VYVElfRElTQUJMRV9FVkVOVAorI2RlZmluZSBfX0hBTF9QVkRfRVZFTlRfRU5BQkxFIF9fSEFMX1BXUl9QVkRfRVhUSV9FTkFCTEVfRVZFTlQKKyNkZWZpbmUgX19IQUxfUFZEX0VYVElfRkFMTElOR1RSSUdHRVJfRElTQUJMRSBcCisgIF9fSEFMX1BXUl9QVkRfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRQorI2RlZmluZSBfX0hBTF9QVkRfRVhUSV9GQUxMSU5HVFJJR0dFUl9FTkFCTEUgXAorICBfX0hBTF9QV1JfUFZEX0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRQorI2RlZmluZSBfX0hBTF9QVkRfRVhUSV9SSVNJTkdUUklHR0VSX0RJU0FCTEUgXAorICBfX0hBTF9QV1JfUFZEX0VYVElfRElTQUJMRV9SSVNJTkdfRURHRQorI2RlZmluZSBfX0hBTF9QVkRfRVhUSV9SSVNJTkdUUklHR0VSX0VOQUJMRSBcCisgIF9fSEFMX1BXUl9QVkRfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UKKyNkZWZpbmUgX19IQUxfUFZNX0VWRU5UX0RJU0FCTEUgX19IQUxfUFdSX1BWTV9FVkVOVF9ESVNBQkxFCisjZGVmaW5lIF9fSEFMX1BWTV9FVkVOVF9FTkFCTEUgX19IQUxfUFdSX1BWTV9FVkVOVF9FTkFCTEUKKyNkZWZpbmUgX19IQUxfUFZNX0VYVElfRkFMTElOR1RSSUdHRVJfRElTQUJMRSBcCisgIF9fSEFMX1BXUl9QVk1fRVhUSV9GQUxMSU5HVFJJR0dFUl9ESVNBQkxFCisjZGVmaW5lIF9fSEFMX1BWTV9FWFRJX0ZBTExJTkdUUklHR0VSX0VOQUJMRSBcCisgIF9fSEFMX1BXUl9QVk1fRVhUSV9GQUxMSU5HVFJJR0dFUl9FTkFCTEUKKyNkZWZpbmUgX19IQUxfUFZNX0VYVElfUklTSU5HVFJJR0dFUl9ESVNBQkxFIFwKKyAgX19IQUxfUFdSX1BWTV9FWFRJX1JJU0lOR1RSSUdHRVJfRElTQUJMRQorI2RlZmluZSBfX0hBTF9QVk1fRVhUSV9SSVNJTkdUUklHR0VSX0VOQUJMRSBcCisgIF9fSEFMX1BXUl9QVk1fRVhUSV9SSVNJTkdUUklHR0VSX0VOQUJMRQorI2RlZmluZSBfX0hBTF9QV1JfSU5URVJOQUxXQUtFVVBfRElTQUJMRSBIQUxfUFdSRXhfRGlzYWJsZUludGVybmFsV2FrZVVwTGluZQorI2RlZmluZSBfX0hBTF9QV1JfSU5URVJOQUxXQUtFVVBfRU5BQkxFIEhBTF9QV1JFeF9FbmFibGVJbnRlcm5hbFdha2VVcExpbmUKKyNkZWZpbmUgX19IQUxfUFdSX1BVTExfVVBfRE9XTl9DT05GSUdfRElTQUJMRSBcCisgIEhBTF9QV1JFeF9EaXNhYmxlUHVsbFVwUHVsbERvd25Db25maWcKKyNkZWZpbmUgX19IQUxfUFdSX1BVTExfVVBfRE9XTl9DT05GSUdfRU5BQkxFIFwKKyAgSEFMX1BXUkV4X0VuYWJsZVB1bGxVcFB1bGxEb3duQ29uZmlnCisjZGVmaW5lIF9fSEFMX1BXUl9QVkRfRVhUSV9DTEVBUl9FR0RFX1RSSUdHRVIoKSBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19IQUxfUFdSX1BWRF9FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKTsgICBcCisgICAgX19IQUxfUFdSX1BWRF9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCk7ICBcCisgIH0gd2hpbGUgKDApCisjZGVmaW5lIF9fSEFMX1BXUl9QVkRfRVhUSV9FVkVOVF9ESVNBQkxFIF9fSEFMX1BXUl9QVkRfRVhUSV9ESVNBQkxFX0VWRU5UCisjZGVmaW5lIF9fSEFMX1BXUl9QVkRfRVhUSV9FVkVOVF9FTkFCTEUgX19IQUxfUFdSX1BWRF9FWFRJX0VOQUJMRV9FVkVOVAorI2RlZmluZSBfX0hBTF9QV1JfUFZEX0VYVElfRkFMTElOR1RSSUdHRVJfRElTQUJMRSBcCisgIF9fSEFMX1BXUl9QVkRfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRQorI2RlZmluZSBfX0hBTF9QV1JfUFZEX0VYVElfRkFMTElOR1RSSUdHRVJfRU5BQkxFIFwKKyAgX19IQUxfUFdSX1BWRF9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UKKyNkZWZpbmUgX19IQUxfUFdSX1BWRF9FWFRJX1JJU0lOR1RSSUdHRVJfRElTQUJMRSBcCisgIF9fSEFMX1BXUl9QVkRfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFCisjZGVmaW5lIF9fSEFMX1BXUl9QVkRfRVhUSV9SSVNJTkdUUklHR0VSX0VOQUJMRSBcCisgIF9fSEFMX1BXUl9QVkRfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UKKyNkZWZpbmUgX19IQUxfUFdSX1BWRF9FWFRJX1NFVF9GQUxMSU5HX0VHREVfVFJJR0dFUiBcCisgIF9fSEFMX1BXUl9QVkRfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFCisjZGVmaW5lIF9fSEFMX1BXUl9QVkRfRVhUSV9TRVRfUklTSU5HX0VER0VfVFJJR0dFUiBcCisgIF9fSEFMX1BXUl9QVkRfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UKKyNkZWZpbmUgX19IQUxfUFdSX1BWTV9ESVNBQkxFKCkgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgSEFMX1BXUkV4X0Rpc2FibGVQVk0xKCk7ICAgIFwKKyAgICBIQUxfUFdSRXhfRGlzYWJsZVBWTTIoKTsgICAgXAorICAgIEhBTF9QV1JFeF9EaXNhYmxlUFZNMygpOyAgICBcCisgICAgSEFMX1BXUkV4X0Rpc2FibGVQVk00KCk7ICAgIFwKKyAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgX19IQUxfUFdSX1BWTV9FTkFCTEUoKSBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEhBTF9QV1JFeF9FbmFibGVQVk0xKCk7ICAgIFwKKyAgICBIQUxfUFdSRXhfRW5hYmxlUFZNMigpOyAgICBcCisgICAgSEFMX1BXUkV4X0VuYWJsZVBWTTMoKTsgICAgXAorICAgIEhBTF9QV1JFeF9FbmFibGVQVk00KCk7ICAgIFwKKyAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgX19IQUxfUFdSX1NSQU0yQ09OVEVOVF9QUkVTRVJWRV9ESVNBQkxFIFwKKyAgSEFMX1BXUkV4X0Rpc2FibGVTUkFNMkNvbnRlbnRSZXRlbnRpb24KKyNkZWZpbmUgX19IQUxfUFdSX1NSQU0yQ09OVEVOVF9QUkVTRVJWRV9FTkFCTEUgXAorICBIQUxfUFdSRXhfRW5hYmxlU1JBTTJDb250ZW50UmV0ZW50aW9uCisjZGVmaW5lIF9fSEFMX1BXUl9WRERJTzJfRElTQUJMRSBIQUxfUFdSRXhfRGlzYWJsZVZkZElPMgorI2RlZmluZSBfX0hBTF9QV1JfVkRESU8yX0VOQUJMRSBIQUxfUFdSRXhfRW5hYmxlVmRkSU8yCisjZGVmaW5lIF9fSEFMX1BXUl9WRERJTzJfRVhUSV9DTEVBUl9FR0RFX1RSSUdHRVIgXAorICBfX0hBTF9QV1JfVkRESU8yX0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UKKyNkZWZpbmUgX19IQUxfUFdSX1ZERElPMl9FWFRJX1NFVF9GQUxMSU5HX0VHREVfVFJJR0dFUiBcCisgIF9fSEFMX1BXUl9WRERJTzJfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFCisjZGVmaW5lIF9fSEFMX1BXUl9WRERVU0JfRElTQUJMRSBIQUxfUFdSRXhfRGlzYWJsZVZkZFVTQgorI2RlZmluZSBfX0hBTF9QV1JfVkREVVNCX0VOQUJMRSBIQUxfUFdSRXhfRW5hYmxlVmRkVVNCCisKKyNpZiBkZWZpbmVkKFNUTTMyRjQpCisjZGVmaW5lIF9fSEFMX1BWRF9FWFRJX0VOQUJMRV9JVChQV1JfRVhUSV9MSU5FX1BWRCkgXAorICBfX0hBTF9QV1JfUFZEX0VYVElfRU5BQkxFX0lUKCkKKyNkZWZpbmUgX19IQUxfUFZEX0VYVElfRElTQUJMRV9JVChQV1JfRVhUSV9MSU5FX1BWRCkgXAorICBfX0hBTF9QV1JfUFZEX0VYVElfRElTQUJMRV9JVCgpCisjZGVmaW5lIF9fSEFMX1BWRF9FWFRJX0dFVF9GTEFHKFBXUl9FWFRJX0xJTkVfUFZEKSBfX0hBTF9QV1JfUFZEX0VYVElfR0VUX0ZMQUcoKQorI2RlZmluZSBfX0hBTF9QVkRfRVhUSV9DTEVBUl9GTEFHKFBXUl9FWFRJX0xJTkVfUFZEKSBcCisgIF9fSEFMX1BXUl9QVkRfRVhUSV9DTEVBUl9GTEFHKCkKKyNkZWZpbmUgX19IQUxfUFZEX0VYVElfR0VORVJBVEVfU1dJVChQV1JfRVhUSV9MSU5FX1BWRCkgXAorICBfX0hBTF9QV1JfUFZEX0VYVElfR0VORVJBVEVfU1dJVCgpCisjZWxzZQorI2RlZmluZSBfX0hBTF9QVkRfRVhUSV9DTEVBUl9GTEFHIF9fSEFMX1BXUl9QVkRfRVhUSV9DTEVBUl9GTEFHCisjZGVmaW5lIF9fSEFMX1BWRF9FWFRJX0RJU0FCTEVfSVQgX19IQUxfUFdSX1BWRF9FWFRJX0RJU0FCTEVfSVQKKyNkZWZpbmUgX19IQUxfUFZEX0VYVElfRU5BQkxFX0lUIF9fSEFMX1BXUl9QVkRfRVhUSV9FTkFCTEVfSVQKKyNkZWZpbmUgX19IQUxfUFZEX0VYVElfR0VORVJBVEVfU1dJVCBfX0hBTF9QV1JfUFZEX0VYVElfR0VORVJBVEVfU1dJVAorI2RlZmluZSBfX0hBTF9QVkRfRVhUSV9HRVRfRkxBRyBfX0hBTF9QV1JfUFZEX0VYVElfR0VUX0ZMQUcKKyNlbmRpZiAvKiBTVE0zMkY0ICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBIQUxfUkNDX0FsaWFzZWQgSEFMIFJDQyBBbGlhc2VkIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgKiBAeworICovCisKKyNkZWZpbmUgUkNDX1N0b3BXYWtlVXBDbG9ja19NU0kgUkNDX1NUT1BfV0FLRVVQQ0xPQ0tfTVNJCisjZGVmaW5lIFJDQ19TdG9wV2FrZVVwQ2xvY2tfSFNJIFJDQ19TVE9QX1dBS0VVUENMT0NLX0hTSQorCisjZGVmaW5lIEhBTF9SQ0NfQ0NTQ2FsbGJhY2sgSEFMX1JDQ19DU1NDYWxsYmFjaworI2RlZmluZSBIQUxfUkM0OF9FbmFibGVCdWZmZXJfQ21kKGNtZCkgICAgICAgICAgICAgICAgIFwKKyAgKCgoY21kKSA9PSBFTkFCTEUpID8gSEFMX1JDQ0V4X0VuYWJsZUhTSTQ4X1ZSRUZJTlQoKSBcCisgICAgICAgICAgICAgICAgICAgICA6IEhBTF9SQ0NFeF9EaXNhYmxlSFNJNDhfVlJFRklOVCgpKQorCisjZGVmaW5lIF9fQURDX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19BRENfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19BRENfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfQURDX0NMS19FTkFCTEUKKyNkZWZpbmUgX19BRENfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0FEQ19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0FEQ19DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19BRENfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0FEQ19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfQURDX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fQURDX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0FEQ19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fQURDMV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfQURDMV9DTEtfRElTQUJMRQorI2RlZmluZSBfX0FEQzFfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfQURDMV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fQURDMV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfQURDMV9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0FEQzFfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfQURDMV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fQURDMV9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19BREMxX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19BREMxX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19BREMxX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fQURDMl9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfQURDMl9DTEtfRElTQUJMRQorI2RlZmluZSBfX0FEQzJfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfQURDMl9DTEtfRU5BQkxFCisjZGVmaW5lIF9fQURDMl9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfQURDMl9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0FEQzJfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfQURDMl9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fQURDM19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfQURDM19DTEtfRElTQUJMRQorI2RlZmluZSBfX0FEQzNfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfQURDM19DTEtfRU5BQkxFCisjZGVmaW5lIF9fQURDM19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfQURDM19GT1JDRV9SRVNFVAorI2RlZmluZSBfX0FEQzNfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfQURDM19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fQUVTX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19BRVNfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19BRVNfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfQUVTX0NMS19FTkFCTEUKKyNkZWZpbmUgX19BRVNfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0FFU19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0FFU19DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19BRVNfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0FFU19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfQUVTX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fQUVTX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0FFU19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fQ1JZUF9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19DUllQX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19DUllQX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19DUllQX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fQ1JZUF9DTEtfRU5BQkxFIF9fSEFMX1JDQ19DUllQX0NMS19FTkFCTEUKKyNkZWZpbmUgX19DUllQX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19DUllQX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fQ1JZUF9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfQ1JZUF9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0NSWVBfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfQ1JZUF9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fQUZJT19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfQUZJT19DTEtfRElTQUJMRQorI2RlZmluZSBfX0FGSU9fQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfQUZJT19DTEtfRU5BQkxFCisjZGVmaW5lIF9fQUZJT19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfQUZJT19GT1JDRV9SRVNFVAorI2RlZmluZSBfX0FGSU9fUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfQUZJT19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fQUhCX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19BSEJfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19BSEJfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfQUhCX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19BSEIxX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19BSEIxX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fQUhCMV9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19BSEIxX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19BSEIyX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19BSEIyX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fQUhCMl9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19BSEIyX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19BSEIzX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19BSEIzX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fQUhCM19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19BSEIzX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19BUEIxX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19BUEIxX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fQVBCMV9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19BUEIxX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19BUEIyX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19BUEIyX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fQVBCMl9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19BUEIyX1JFTEVBU0VfUkVTRVQKKyNpZiBkZWZpbmVkKFNUTTMyQzApCisjZGVmaW5lIF9fSEFMX1JDQ19BUEIxX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19BUEIxX0dSUDFfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19IQUxfUkNDX0FQQjFfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfQVBCMV9HUlAxX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19IQUxfUkNDX0FQQjJfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0FQQjFfR1JQMl9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0hBTF9SQ0NfQVBCMl9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19BUEIxX0dSUDJfUkVMRUFTRV9SRVNFVAorI2VuZGlmIC8qIFNUTTMyQzAgKi8KKyNkZWZpbmUgX19CS1BfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0JLUF9DTEtfRElTQUJMRQorI2RlZmluZSBfX0JLUF9DTEtfRU5BQkxFIF9fSEFMX1JDQ19CS1BfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0JLUF9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfQktQX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fQktQX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0JLUF9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fQ0FOMV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfQ0FOMV9DTEtfRElTQUJMRQorI2RlZmluZSBfX0NBTjFfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfQ0FOMV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fQ0FOMV9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfQ0FOMV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0NBTjFfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfQ0FOMV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fQ0FOMV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfQ0FOMV9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0NBTjFfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfQ0FOMV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fQ0FOX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19DQU4xX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fQ0FOX0NMS19FTkFCTEUgX19IQUxfUkNDX0NBTjFfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0NBTl9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfQ0FOMV9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0NBTl9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19DQU4xX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19DQU4yX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19DQU4yX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fQ0FOMl9DTEtfRU5BQkxFIF9fSEFMX1JDQ19DQU4yX0NMS19FTkFCTEUKKyNkZWZpbmUgX19DQU4yX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19DQU4yX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fQ0FOMl9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19DQU4yX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19DRUNfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0NFQ19DTEtfRElTQUJMRQorI2RlZmluZSBfX0NFQ19DTEtfRU5BQkxFIF9fSEFMX1JDQ19DRUNfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0NPTVBfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0NPTVBfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19DT01QX0NMS19FTkFCTEUgX19IQUxfUkNDX0NPTVBfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0NPTVBfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0NPTVBfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19DT01QX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0NPTVBfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0NPTVBfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfQ09NUF9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fQ09NUF9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfQ09NUF9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0NFQ19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfQ0VDX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fQ0VDX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0NFQ19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fQ1JDX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19DUkNfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19DUkNfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfQ1JDX0NMS19FTkFCTEUKKyNkZWZpbmUgX19DUkNfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0NSQ19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0NSQ19DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19DUkNfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0NSQ19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfQ1JDX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fQ1JDX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0NSQ19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fREFDX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19EQUNfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19EQUNfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfREFDX0NMS19FTkFCTEUKKyNkZWZpbmUgX19EQUNfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0RBQ19GT1JDRV9SRVNFVAorI2RlZmluZSBfX0RBQ19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19EQUNfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0RBQzFfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0RBQzFfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19EQUMxX0NMS19FTkFCTEUgX19IQUxfUkNDX0RBQzFfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0RBQzFfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0RBQzFfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19EQUMxX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0RBQzFfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0RBQzFfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0RBQzFfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19EQUMxX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0RBQzFfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0RCR01DVV9DTEtfRU5BQkxFIF9fSEFMX1JDQ19EQkdNQ1VfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0RCR01DVV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfREJHTUNVX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fREJHTUNVX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19EQkdNQ1VfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19EQkdNQ1VfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfREJHTUNVX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19ERlNETV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfREZTRE1fQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19ERlNETV9DTEtfRU5BQkxFIF9fSEFMX1JDQ19ERlNETV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fREZTRE1fQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0RGU0RNX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fREZTRE1fQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfREZTRE1fQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0RGU0RNX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19ERlNETV9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0RGU0RNX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0RGU0RNX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19ETUExX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19ETUExX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fRE1BMV9DTEtfRU5BQkxFIF9fSEFMX1JDQ19ETUExX0NMS19FTkFCTEUKKyNkZWZpbmUgX19ETUExX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19ETUExX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fRE1BMV9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19ETUExX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19ETUExX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19ETUExX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fRE1BMV9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19ETUExX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19ETUEyX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19ETUEyX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fRE1BMl9DTEtfRU5BQkxFIF9fSEFMX1JDQ19ETUEyX0NMS19FTkFCTEUKKyNkZWZpbmUgX19ETUEyX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19ETUEyX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fRE1BMl9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19ETUEyX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19ETUEyX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19ETUEyX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fRE1BMl9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19ETUEyX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19FVEhNQUNfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0VUSE1BQ19DTEtfRElTQUJMRQorI2RlZmluZSBfX0VUSE1BQ19DTEtfRU5BQkxFIF9fSEFMX1JDQ19FVEhNQUNfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0VUSE1BQ19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfRVRITUFDX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fRVRITUFDX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0VUSE1BQ19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fRVRITUFDUlhfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0VUSE1BQ1JYX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fRVRITUFDUlhfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfRVRITUFDUlhfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0VUSE1BQ1RYX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19FVEhNQUNUWF9DTEtfRElTQUJMRQorI2RlZmluZSBfX0VUSE1BQ1RYX0NMS19FTkFCTEUgX19IQUxfUkNDX0VUSE1BQ1RYX0NMS19FTkFCTEUKKyNkZWZpbmUgX19GSVJFV0FMTF9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfRklSRVdBTExfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19GSVJFV0FMTF9DTEtfRU5BQkxFIF9fSEFMX1JDQ19GSVJFV0FMTF9DTEtfRU5BQkxFCisjZGVmaW5lIF9fRkxBU0hfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0ZMQVNIX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fRkxBU0hfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfRkxBU0hfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0ZMQVNIX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19GTEFTSF9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0ZMQVNIX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0ZMQVNIX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19GTEFTSF9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfRkxBU0hfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19GTEFTSF9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19GTEFTSF9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fRkxJVEZfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0ZMSVRGX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fRkxJVEZfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfRkxJVEZfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0ZMSVRGX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19GTElURl9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0ZMSVRGX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0ZMSVRGX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19GTElURl9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19GTElURl9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fRkxJVEZfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0ZMSVRGX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fRk1DX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19GTUNfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19GTUNfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfRk1DX0NMS19FTkFCTEUKKyNkZWZpbmUgX19GTUNfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0ZNQ19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0ZNQ19DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19GTUNfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0ZNQ19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfRk1DX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fRk1DX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0ZNQ19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fRlNNQ19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfRlNNQ19DTEtfRElTQUJMRQorI2RlZmluZSBfX0ZTTUNfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfRlNNQ19DTEtfRU5BQkxFCisjZGVmaW5lIF9fR1BJT0FfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0dQSU9BX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fR1BJT0FfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfR1BJT0FfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0dQSU9BX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19HUElPQV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0dQSU9BX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0dQSU9BX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19HUElPQV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfR1BJT0FfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19HUElPQV9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19HUElPQV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fR1BJT0JfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0dQSU9CX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fR1BJT0JfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfR1BJT0JfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0dQSU9CX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19HUElPQl9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0dQSU9CX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0dQSU9CX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19HUElPQl9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfR1BJT0JfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19HUElPQl9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19HUElPQl9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fR1BJT0NfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0dQSU9DX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fR1BJT0NfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfR1BJT0NfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0dQSU9DX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19HUElPQ19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0dQSU9DX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0dQSU9DX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19HUElPQ19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfR1BJT0NfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19HUElPQ19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19HUElPQ19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fR1BJT0RfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0dQSU9EX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fR1BJT0RfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfR1BJT0RfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0dQSU9EX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19HUElPRF9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0dQSU9EX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0dQSU9EX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19HUElPRF9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfR1BJT0RfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19HUElPRF9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19HUElPRF9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fR1BJT0VfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0dQSU9FX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fR1BJT0VfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfR1BJT0VfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0dQSU9FX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19HUElPRV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0dQSU9FX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0dQSU9FX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19HUElPRV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfR1BJT0VfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19HUElPRV9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19HUElPRV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fR1BJT0ZfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0dQSU9GX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fR1BJT0ZfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfR1BJT0ZfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0dQSU9GX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19HUElPRl9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0dQSU9GX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0dQSU9GX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19HUElPRl9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfR1BJT0ZfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19HUElPRl9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19HUElPRl9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fR1BJT0dfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0dQSU9HX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fR1BJT0dfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfR1BJT0dfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0dQSU9HX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19HUElPR19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0dQSU9HX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0dQSU9HX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19HUElPR19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfR1BJT0dfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19HUElPR19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19HUElPR19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fR1BJT0hfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0dQSU9IX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fR1BJT0hfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfR1BJT0hfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0dQSU9IX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19HUElPSF9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0dQSU9IX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0dQSU9IX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19HUElPSF9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfR1BJT0hfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19HUElPSF9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19HUElPSF9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fSTJDMV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfSTJDMV9DTEtfRElTQUJMRQorI2RlZmluZSBfX0kyQzFfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfSTJDMV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fSTJDMV9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfSTJDMV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0kyQzFfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfSTJDMV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fSTJDMV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfSTJDMV9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0kyQzFfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfSTJDMV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fSTJDMl9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfSTJDMl9DTEtfRElTQUJMRQorI2RlZmluZSBfX0kyQzJfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfSTJDMl9DTEtfRU5BQkxFCisjZGVmaW5lIF9fSTJDMl9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfSTJDMl9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0kyQzJfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfSTJDMl9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fSTJDMl9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfSTJDMl9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0kyQzJfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfSTJDMl9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fSTJDM19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfSTJDM19DTEtfRElTQUJMRQorI2RlZmluZSBfX0kyQzNfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfSTJDM19DTEtfRU5BQkxFCisjZGVmaW5lIF9fSTJDM19DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfSTJDM19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0kyQzNfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfSTJDM19DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fSTJDM19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfSTJDM19GT1JDRV9SRVNFVAorI2RlZmluZSBfX0kyQzNfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfSTJDM19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fTENEX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19MQ0RfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19MQ0RfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfTENEX0NMS19FTkFCTEUKKyNkZWZpbmUgX19MQ0RfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0xDRF9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0xDRF9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19MQ0RfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0xDRF9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfTENEX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fTENEX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0xDRF9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fTFBUSU0xX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19MUFRJTTFfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19MUFRJTTFfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfTFBUSU0xX0NMS19FTkFCTEUKKyNkZWZpbmUgX19MUFRJTTFfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0xQVElNMV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0xQVElNMV9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19MUFRJTTFfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0xQVElNMV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfTFBUSU0xX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fTFBUSU0xX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0xQVElNMV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fTFBUSU0yX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19MUFRJTTJfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19MUFRJTTJfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfTFBUSU0yX0NMS19FTkFCTEUKKyNkZWZpbmUgX19MUFRJTTJfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0xQVElNMl9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0xQVElNMl9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19MUFRJTTJfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0xQVElNMl9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfTFBUSU0yX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fTFBUSU0yX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0xQVElNMl9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fTFBVQVJUMV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfTFBVQVJUMV9DTEtfRElTQUJMRQorI2RlZmluZSBfX0xQVUFSVDFfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfTFBVQVJUMV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fTFBVQVJUMV9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfTFBVQVJUMV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0xQVUFSVDFfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfTFBVQVJUMV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fTFBVQVJUMV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfTFBVQVJUMV9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0xQVUFSVDFfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfTFBVQVJUMV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fT1BBTVBfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX09QQU1QX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fT1BBTVBfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfT1BBTVBfQ0xLX0VOQUJMRQorI2RlZmluZSBfX09QQU1QX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19PUEFNUF9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX09QQU1QX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX09QQU1QX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19PUEFNUF9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfT1BBTVBfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19PUEFNUF9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19PUEFNUF9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fT1RHRlNfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX09UR0ZTX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fT1RHRlNfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfT1RHRlNfQ0xLX0VOQUJMRQorI2RlZmluZSBfX09UR0ZTX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19PVEdGU19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX09UR0ZTX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX09UR0ZTX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19PVEdGU19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfT1RHRlNfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19PVEdGU19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19PVEdGU19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fUFdSX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19QV1JfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19QV1JfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfUFdSX0NMS19FTkFCTEUKKyNkZWZpbmUgX19QV1JfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1BXUl9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1BXUl9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19QV1JfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1BXUl9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfUFdSX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fUFdSX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1BXUl9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fUVNQSV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfUVNQSV9DTEtfRElTQUJMRQorI2RlZmluZSBfX1FTUElfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfUVNQSV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fUVNQSV9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfUVNQSV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1FTUElfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfUVNQSV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fUVNQSV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfUVNQSV9GT1JDRV9SRVNFVAorI2RlZmluZSBfX1FTUElfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfUVNQSV9SRUxFQVNFX1JFU0VUCisKKyNpZiBkZWZpbmVkKFNUTTMyV0IpCisjZGVmaW5lIF9fSEFMX1JDQ19RU1BJX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19RVUFEU1BJX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19RU1BJX0NMS19FTkFCTEUgX19IQUxfUkNDX1FVQURTUElfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfUVNQSV9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfUVVBRFNQSV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfUVNQSV9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19RVUFEU1BJX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19IQUxfUkNDX1FTUElfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1FVQURTUElfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19IQUxfUkNDX1FTUElfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfUVVBRFNQSV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fSEFMX1JDQ19RU1BJX0lTX0NMS19FTkFCTEVEIF9fSEFMX1JDQ19RVUFEU1BJX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fSEFMX1JDQ19RU1BJX0lTX0NMS19ESVNBQkxFRCBfX0hBTF9SQ0NfUVVBRFNQSV9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19IQUxfUkNDX1FTUElfSVNfQ0xLX1NMRUVQX0VOQUJMRUQgXAorICBfX0hBTF9SQ0NfUVVBRFNQSV9JU19DTEtfU0xFRVBfRU5BQkxFRAorI2RlZmluZSBfX0hBTF9SQ0NfUVNQSV9JU19DTEtfU0xFRVBfRElTQUJMRUQgXAorICBfX0hBTF9SQ0NfUVVBRFNQSV9JU19DTEtfU0xFRVBfRElTQUJMRUQKKyNkZWZpbmUgUVNQSV9JUlFIYW5kbGVyIFFVQURTUElfSVJRSGFuZGxlcgorI2VuZGlmIC8qIF9fSEFMX1JDQ19RVUFEU1BJX0NMS19FTkFCTEUgKi8KKworI2RlZmluZSBfX1JOR19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfUk5HX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fUk5HX0NMS19FTkFCTEUgX19IQUxfUkNDX1JOR19DTEtfRU5BQkxFCisjZGVmaW5lIF9fUk5HX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19STkdfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19STkdfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfUk5HX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19STkdfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1JOR19GT1JDRV9SRVNFVAorI2RlZmluZSBfX1JOR19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19STkdfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1NBSTFfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1NBSTFfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19TQUkxX0NMS19FTkFCTEUgX19IQUxfUkNDX1NBSTFfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1NBSTFfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1NBSTFfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19TQUkxX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1NBSTFfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1NBSTFfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1NBSTFfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19TQUkxX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1NBSTFfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1NBSTJfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1NBSTJfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19TQUkyX0NMS19FTkFCTEUgX19IQUxfUkNDX1NBSTJfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1NBSTJfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1NBSTJfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19TQUkyX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1NBSTJfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1NBSTJfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1NBSTJfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19TQUkyX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1NBSTJfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1NESU9fQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1NESU9fQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19TRElPX0NMS19FTkFCTEUgX19IQUxfUkNDX1NESU9fQ0xLX0VOQUJMRQorI2RlZmluZSBfX1NETU1DX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19TRE1NQ19DTEtfRElTQUJMRQorI2RlZmluZSBfX1NETU1DX0NMS19FTkFCTEUgX19IQUxfUkNDX1NETU1DX0NMS19FTkFCTEUKKyNkZWZpbmUgX19TRE1NQ19DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfU0RNTUNfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19TRE1NQ19DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19TRE1NQ19DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fU0RNTUNfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1NETU1DX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fU0RNTUNfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfU0RNTUNfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1NQSTFfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1NQSTFfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19TUEkxX0NMS19FTkFCTEUgX19IQUxfUkNDX1NQSTFfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1NQSTFfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1NQSTFfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19TUEkxX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1NQSTFfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1NQSTFfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1NQSTFfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19TUEkxX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1NQSTFfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1NQSTJfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1NQSTJfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19TUEkyX0NMS19FTkFCTEUgX19IQUxfUkNDX1NQSTJfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1NQSTJfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1NQSTJfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19TUEkyX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1NQSTJfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1NQSTJfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1NQSTJfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19TUEkyX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1NQSTJfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1NQSTNfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1NQSTNfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19TUEkzX0NMS19FTkFCTEUgX19IQUxfUkNDX1NQSTNfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1NQSTNfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1NQSTNfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19TUEkzX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1NQSTNfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1NQSTNfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1NQSTNfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19TUEkzX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1NQSTNfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1NSQU1fQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1NSQU1fQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19TUkFNX0NMS19FTkFCTEUgX19IQUxfUkNDX1NSQU1fQ0xLX0VOQUJMRQorI2RlZmluZSBfX1NSQU0xX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19TUkFNMV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1NSQU0xX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1NSQU0xX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19TUkFNMl9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfU1JBTTJfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19TUkFNMl9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19TUkFNMl9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fU1dQTUkxX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19TV1BNSTFfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19TV1BNSTFfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfU1dQTUkxX0NMS19FTkFCTEUKKyNkZWZpbmUgX19TV1BNSTFfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1NXUE1JMV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1NXUE1JMV9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19TV1BNSTFfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1NXUE1JMV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfU1dQTUkxX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fU1dQTUkxX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1NXUE1JMV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fU1lTQ0ZHX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19TWVNDRkdfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19TWVNDRkdfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfU1lTQ0ZHX0NMS19FTkFCTEUKKyNkZWZpbmUgX19TWVNDRkdfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1NZU0NGR19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1NZU0NGR19DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19TWVNDRkdfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1NZU0NGR19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfU1lTQ0ZHX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fU1lTQ0ZHX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1NZU0NGR19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVElNMV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVElNMV9DTEtfRElTQUJMRQorI2RlZmluZSBfX1RJTTFfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVElNMV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVElNMV9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfVElNMV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1RJTTFfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfVElNMV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fVElNMV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVElNMV9GT1JDRV9SRVNFVAorI2RlZmluZSBfX1RJTTFfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVElNMV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVElNMTBfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1RJTTEwX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVElNMTBfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVElNMTBfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1RJTTEwX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19USU0xMF9GT1JDRV9SRVNFVAorI2RlZmluZSBfX1RJTTEwX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1RJTTEwX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19USU0xMV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVElNMTFfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19USU0xMV9DTEtfRU5BQkxFIF9fSEFMX1JDQ19USU0xMV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVElNMTFfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1RJTTExX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVElNMTFfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVElNMTFfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1RJTTEyX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19USU0xMl9DTEtfRElTQUJMRQorI2RlZmluZSBfX1RJTTEyX0NMS19FTkFCTEUgX19IQUxfUkNDX1RJTTEyX0NMS19FTkFCTEUKKyNkZWZpbmUgX19USU0xMl9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVElNMTJfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19USU0xMl9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19USU0xMl9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVElNMTNfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1RJTTEzX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVElNMTNfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVElNMTNfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1RJTTEzX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19USU0xM19GT1JDRV9SRVNFVAorI2RlZmluZSBfX1RJTTEzX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1RJTTEzX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19USU0xNF9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVElNMTRfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19USU0xNF9DTEtfRU5BQkxFIF9fSEFMX1JDQ19USU0xNF9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVElNMTRfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1RJTTE0X0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVElNMTRfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVElNMTRfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1RJTTE1X0NMS19ESVNBQkxFIF9fSEFMX1JDQ19USU0xNV9DTEtfRElTQUJMRQorI2RlZmluZSBfX1RJTTE1X0NMS19FTkFCTEUgX19IQUxfUkNDX1RJTTE1X0NMS19FTkFCTEUKKyNkZWZpbmUgX19USU0xNV9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfVElNMTVfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19USU0xNV9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19USU0xNV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fVElNMTVfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1RJTTE1X0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVElNMTVfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVElNMTVfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1RJTTE2X0NMS19ESVNBQkxFIF9fSEFMX1JDQ19USU0xNl9DTEtfRElTQUJMRQorI2RlZmluZSBfX1RJTTE2X0NMS19FTkFCTEUgX19IQUxfUkNDX1RJTTE2X0NMS19FTkFCTEUKKyNkZWZpbmUgX19USU0xNl9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfVElNMTZfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19USU0xNl9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19USU0xNl9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fVElNMTZfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1RJTTE2X0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVElNMTZfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVElNMTZfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1RJTTE3X0NMS19ESVNBQkxFIF9fSEFMX1JDQ19USU0xN19DTEtfRElTQUJMRQorI2RlZmluZSBfX1RJTTE3X0NMS19FTkFCTEUgX19IQUxfUkNDX1RJTTE3X0NMS19FTkFCTEUKKyNkZWZpbmUgX19USU0xN19DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfVElNMTdfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19USU0xN19DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19USU0xN19DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fVElNMTdfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1RJTTE3X0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVElNMTdfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVElNMTdfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1RJTTJfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1RJTTJfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19USU0yX0NMS19FTkFCTEUgX19IQUxfUkNDX1RJTTJfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1RJTTJfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1RJTTJfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19USU0yX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1RJTTJfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1RJTTJfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1RJTTJfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19USU0yX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1RJTTJfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1RJTTNfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1RJTTNfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19USU0zX0NMS19FTkFCTEUgX19IQUxfUkNDX1RJTTNfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1RJTTNfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1RJTTNfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19USU0zX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1RJTTNfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1RJTTNfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1RJTTNfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19USU0zX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1RJTTNfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1RJTTRfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1RJTTRfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19USU00X0NMS19FTkFCTEUgX19IQUxfUkNDX1RJTTRfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1RJTTRfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1RJTTRfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19USU00X0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1RJTTRfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1RJTTRfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1RJTTRfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19USU00X1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1RJTTRfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1RJTTVfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1RJTTVfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19USU01X0NMS19FTkFCTEUgX19IQUxfUkNDX1RJTTVfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1RJTTVfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1RJTTVfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19USU01X0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1RJTTVfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1RJTTVfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1RJTTVfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19USU01X1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1RJTTVfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1RJTTZfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1RJTTZfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19USU02X0NMS19FTkFCTEUgX19IQUxfUkNDX1RJTTZfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1RJTTZfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1RJTTZfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19USU02X0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1RJTTZfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1RJTTZfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1RJTTZfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19USU02X1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1RJTTZfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1RJTTdfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1RJTTdfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19USU03X0NMS19FTkFCTEUgX19IQUxfUkNDX1RJTTdfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1RJTTdfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1RJTTdfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19USU03X0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1RJTTdfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1RJTTdfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1RJTTdfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19USU03X1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1RJTTdfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1RJTThfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1RJTThfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19USU04X0NMS19FTkFCTEUgX19IQUxfUkNDX1RJTThfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1RJTThfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1RJTThfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19USU04X0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1RJTThfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1RJTThfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1RJTThfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19USU04X1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1RJTThfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1RJTTlfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1RJTTlfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19USU05X0NMS19FTkFCTEUgX19IQUxfUkNDX1RJTTlfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1RJTTlfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1RJTTlfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19USU05X1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1RJTTlfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1RTQ19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVFNDX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVFNDX0NMS19FTkFCTEUgX19IQUxfUkNDX1RTQ19DTEtfRU5BQkxFCisjZGVmaW5lIF9fVFNDX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19UU0NfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19UU0NfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfVFNDX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19UU0NfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1RTQ19GT1JDRV9SRVNFVAorI2RlZmluZSBfX1RTQ19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19UU0NfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1VBUlQ0X0NMS19ESVNBQkxFIF9fSEFMX1JDQ19VQVJUNF9DTEtfRElTQUJMRQorI2RlZmluZSBfX1VBUlQ0X0NMS19FTkFCTEUgX19IQUxfUkNDX1VBUlQ0X0NMS19FTkFCTEUKKyNkZWZpbmUgX19VQVJUNF9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfVUFSVDRfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19VQVJUNF9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19VQVJUNF9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fVUFSVDRfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1VBUlQ0X0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVUFSVDRfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVUFSVDRfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1VBUlQ1X0NMS19ESVNBQkxFIF9fSEFMX1JDQ19VQVJUNV9DTEtfRElTQUJMRQorI2RlZmluZSBfX1VBUlQ1X0NMS19FTkFCTEUgX19IQUxfUkNDX1VBUlQ1X0NMS19FTkFCTEUKKyNkZWZpbmUgX19VQVJUNV9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfVUFSVDVfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19VQVJUNV9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19VQVJUNV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fVUFSVDVfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1VBUlQ1X0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVUFSVDVfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVUFSVDVfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1VTQVJUMV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVVNBUlQxX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVVNBUlQxX0NMS19FTkFCTEUgX19IQUxfUkNDX1VTQVJUMV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVVNBUlQxX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19VU0FSVDFfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19VU0FSVDFfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfVVNBUlQxX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19VU0FSVDFfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1VTQVJUMV9GT1JDRV9SRVNFVAorI2RlZmluZSBfX1VTQVJUMV9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19VU0FSVDFfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1VTQVJUMl9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVVNBUlQyX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVVNBUlQyX0NMS19FTkFCTEUgX19IQUxfUkNDX1VTQVJUMl9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVVNBUlQyX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19VU0FSVDJfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19VU0FSVDJfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfVVNBUlQyX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19VU0FSVDJfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1VTQVJUMl9GT1JDRV9SRVNFVAorI2RlZmluZSBfX1VTQVJUMl9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19VU0FSVDJfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1VTQVJUM19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVVNBUlQzX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVVNBUlQzX0NMS19FTkFCTEUgX19IQUxfUkNDX1VTQVJUM19DTEtfRU5BQkxFCisjZGVmaW5lIF9fVVNBUlQzX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19VU0FSVDNfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19VU0FSVDNfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfVVNBUlQzX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19VU0FSVDNfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1VTQVJUM19GT1JDRV9SRVNFVAorI2RlZmluZSBfX1VTQVJUM19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19VU0FSVDNfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1VTQVJUNF9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVUFSVDRfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19VU0FSVDRfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVUFSVDRfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1VTQVJUNF9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19VQVJUNF9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fVVNBUlQ0X0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19VQVJUNF9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1VTQVJUNF9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVUFSVDRfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19VU0FSVDRfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVUFSVDRfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1VTQVJUNV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVUFSVDVfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19VU0FSVDVfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVUFSVDVfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1VTQVJUNV9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19VQVJUNV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fVVNBUlQ1X0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19VQVJUNV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1VTQVJUNV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVUFSVDVfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19VU0FSVDVfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVUFSVDVfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1VTQVJUN19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVUFSVDdfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19VU0FSVDdfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVUFSVDdfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1VTQVJUN19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVUFSVDdfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19VU0FSVDdfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVUFSVDdfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1VTQVJUOF9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVUFSVDhfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19VU0FSVDhfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVUFSVDhfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1VTQVJUOF9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVUFSVDhfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19VU0FSVDhfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVUFSVDhfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1VTQl9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVVNCX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVVNCX0NMS19FTkFCTEUgX19IQUxfUkNDX1VTQl9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVVNCX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19VU0JfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19VU0JfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfVVNCX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19VU0JfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1VTQl9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1VTQl9PVEdfRlNfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1VTQl9PVEdfRlNfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19VU0JfT1RHX0ZTX0NMS19FTkFCTEUgX19IQUxfUkNDX1VTQl9PVEdfRlNfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1VTQl9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19VU0JfUkVMRUFTRV9SRVNFVAorCisjaWYgZGVmaW5lZChTVE0zMkg3KQorI2RlZmluZSBfX0hBTF9SQ0NfV1dER19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfV1dERzFfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19IQUxfUkNDX1dXREdfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfV1dERzFfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfV1dER19DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfV1dERzFfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19IQUxfUkNDX1dXREdfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfV1dERzFfQ0xLX1NMRUVQX0VOQUJMRQorCisjZGVmaW5lIF9fSEFMX1JDQ19XV0RHX0ZPUkNFX1JFU0VUICAgXAorICAoKHZvaWQpMFUpIC8qIE5vdCBhdmFpbGFibGUgb24gdGhlIFwKKyAgICAgICAgICAgICAgICBTVE0zMkg3Ki8KKyNkZWZpbmUgX19IQUxfUkNDX1dXREdfUkVMRUFTRV9SRVNFVCBcCisgICgodm9pZCkwVSkgLyogTm90IGF2YWlsYWJsZSBvbiB0aGUgU1RNMzJINyovCisKKyNkZWZpbmUgX19IQUxfUkNDX1dXREdfSVNfQ0xLX0VOQUJMRUQgX19IQUxfUkNDX1dXREcxX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fSEFMX1JDQ19XV0RHX0lTX0NMS19ESVNBQkxFRCBfX0hBTF9SQ0NfV1dERzFfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIFJDQ19TUEk0Q0xLU09VUkNFX0QyUENMSzEgUkNDX1NQSTRDTEtTT1VSQ0VfRDJQQ0xLMgorI2RlZmluZSBSQ0NfU1BJNUNMS1NPVVJDRV9EMlBDTEsxIFJDQ19TUEk1Q0xLU09VUkNFX0QyUENMSzIKKyNkZWZpbmUgUkNDX1NQSTQ1Q0xLU09VUkNFX0QyUENMSzEgUkNDX1NQSTQ1Q0xLU09VUkNFX0QyUENMSzIKKyNkZWZpbmUgUkNDX1NQSTQ1Q0xLU09VUkNFX0NEUENMSzEgUkNDX1NQSTQ1Q0xLU09VUkNFX0NEUENMSzIKKyNkZWZpbmUgUkNDX1NQSTQ1Q0xLU09VUkNFX1BDTEsxIFJDQ19TUEk0NUNMS1NPVVJDRV9QQ0xLMgorI2VuZGlmCisKKyNkZWZpbmUgX19XV0RHX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19XV0RHX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fV1dER19DTEtfRU5BQkxFIF9fSEFMX1JDQ19XV0RHX0NMS19FTkFCTEUKKyNkZWZpbmUgX19XV0RHX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19XV0RHX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fV1dER19DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19XV0RHX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19XV0RHX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19XV0RHX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fV1dER19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19XV0RHX1JFTEVBU0VfUkVTRVQKKworI2RlZmluZSBfX1RJTTIxX0NMS19FTkFCTEUgX19IQUxfUkNDX1RJTTIxX0NMS19FTkFCTEUKKyNkZWZpbmUgX19USU0yMV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVElNMjFfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19USU0yMV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVElNMjFfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19USU0yMV9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19USU0yMV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVElNMjFfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfVElNMjFfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1RJTTIxX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19USU0yMV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1RJTTIyX0NMS19FTkFCTEUgX19IQUxfUkNDX1RJTTIyX0NMS19FTkFCTEUKKyNkZWZpbmUgX19USU0yMl9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVElNMjJfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19USU0yMl9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVElNMjJfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19USU0yMl9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19USU0yMl9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVElNMjJfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfVElNMjJfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1RJTTIyX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19USU0yMl9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0NSU19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfQ1JTX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fQ1JTX0NMS19FTkFCTEUgX19IQUxfUkNDX0NSU19DTEtfRU5BQkxFCisjZGVmaW5lIF9fQ1JTX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19DUlNfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19DUlNfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfQ1JTX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19DUlNfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0NSU19GT1JDRV9SRVNFVAorI2RlZmluZSBfX0NSU19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19DUlNfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1JDQ19CQUNLVVBSRVNFVF9GT1JDRSBfX0hBTF9SQ0NfQkFDS1VQUkVTRVRfRk9SQ0UKKyNkZWZpbmUgX19SQ0NfQkFDS1VQUkVTRVRfUkVMRUFTRSBfX0hBTF9SQ0NfQkFDS1VQUkVTRVRfUkVMRUFTRQorCisjZGVmaW5lIF9fVVNCX09UR19GU19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVVNCX09UR19GU19GT1JDRV9SRVNFVAorI2RlZmluZSBfX1VTQl9PVEdfRlNfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVVNCX09UR19GU19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVVNCX09UR19GU19DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19VU0JfT1RHX0ZTX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19VU0JfT1RHX0ZTX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19VU0JfT1RHX0ZTX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fVVNCX09UR19IU19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVVNCX09UR19IU19DTEtfRElTQUJMRQorI2RlZmluZSBfX1VTQl9PVEdfSFNfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVVNCX09UR19IU19DTEtfRU5BQkxFCisjZGVmaW5lIF9fVVNCX09UR19IU19VTFBJX0NMS19FTkFCTEUgX19IQUxfUkNDX1VTQl9PVEdfSFNfVUxQSV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVVNCX09UR19IU19VTFBJX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19VU0JfT1RHX0hTX1VMUElfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19USU05X0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1RJTTlfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1RJTTlfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1RJTTlfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19USU0xMF9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19USU0xMF9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fVElNMTBfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1RJTTEwX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fVElNMTFfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfVElNMTFfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1RJTTExX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19USU0xMV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0VUSE1BQ1BUUF9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19FVEhNQUNQVFBfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0VUSE1BQ1BUUF9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfRVRITUFDUFRQX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fRVRITUFDUFRQX0NMS19FTkFCTEUgX19IQUxfUkNDX0VUSE1BQ1BUUF9DTEtfRU5BQkxFCisjZGVmaW5lIF9fRVRITUFDUFRQX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19FVEhNQUNQVFBfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19IQVNIX0NMS19FTkFCTEUgX19IQUxfUkNDX0hBU0hfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0hBU0hfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0hBU0hfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19IQVNIX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0hBU0hfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0hBU0hfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfSEFTSF9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fSEFTSF9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfSEFTSF9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0hBU0hfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0hBU0hfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19TUEk1X0NMS19FTkFCTEUgX19IQUxfUkNDX1NQSTVfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1NQSTVfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1NQSTVfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19TUEk1X0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19TUEk1X0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fU1BJNV9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19TUEk1X1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19TUEk1X0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1NQSTVfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1NQSTVfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1NQSTVfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19TUEk2X0NMS19FTkFCTEUgX19IQUxfUkNDX1NQSTZfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1NQSTZfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1NQSTZfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19TUEk2X0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19TUEk2X0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fU1BJNl9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19TUEk2X1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19TUEk2X0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1NQSTZfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1NQSTZfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1NQSTZfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19MVERDX0NMS19FTkFCTEUgX19IQUxfUkNDX0xURENfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0xURENfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0xURENfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19MVERDX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19MVERDX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fTFREQ19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19MVERDX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19MVERDX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0xURENfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0VUSE1BQ19DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19FVEhNQUNfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0VUSE1BQ19DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfRVRITUFDX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fRVRITUFDVFhfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfRVRITUFDVFhfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0VUSE1BQ1RYX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19FVEhNQUNUWF9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0VUSE1BQ1JYX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0VUSE1BQ1JYX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19FVEhNQUNSWF9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfRVRITUFDUlhfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19USU0xMl9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19USU0xMl9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fVElNMTJfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1RJTTEyX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fVElNMTNfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfVElNMTNfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1RJTTEzX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19USU0xM19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1RJTTE0X0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1RJTTE0X0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19USU0xNF9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfVElNMTRfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19CS1BTUkFNX0NMS19FTkFCTEUgX19IQUxfUkNDX0JLUFNSQU1fQ0xLX0VOQUJMRQorI2RlZmluZSBfX0JLUFNSQU1fQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0JLUFNSQU1fQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19CS1BTUkFNX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0JLUFNSQU1fQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0JLUFNSQU1fQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0JLUFNSQU1fQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19DQ01EQVRBUkFNRU5fQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfQ0NNREFUQVJBTUVOX0NMS19FTkFCTEUKKyNkZWZpbmUgX19DQ01EQVRBUkFNRU5fQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0NDTURBVEFSQU1FTl9DTEtfRElTQUJMRQorI2RlZmluZSBfX1VTQVJUNl9DTEtfRU5BQkxFIF9fSEFMX1JDQ19VU0FSVDZfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1VTQVJUNl9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVVNBUlQ2X0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVVNBUlQ2X0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19VU0FSVDZfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19VU0FSVDZfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVVNBUlQ2X1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19VU0FSVDZfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfVVNBUlQ2X0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19VU0FSVDZfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1VTQVJUNl9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1NQSTRfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfU1BJNF9DTEtfRU5BQkxFCisjZGVmaW5lIF9fU1BJNF9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfU1BJNF9DTEtfRElTQUJMRQorI2RlZmluZSBfX1NQSTRfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1NQSTRfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19TUEk0X1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1NQSTRfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1NQSTRfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfU1BJNF9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fU1BJNF9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfU1BJNF9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0dQSU9JX0NMS19FTkFCTEUgX19IQUxfUkNDX0dQSU9JX0NMS19FTkFCTEUKKyNkZWZpbmUgX19HUElPSV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfR1BJT0lfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19HUElPSV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfR1BJT0lfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19HUElPSV9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19HUElPSV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fR1BJT0lfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfR1BJT0lfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0dQSU9JX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19HUElPSV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0dQSU9KX0NMS19FTkFCTEUgX19IQUxfUkNDX0dQSU9KX0NMS19FTkFCTEUKKyNkZWZpbmUgX19HUElPSl9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfR1BJT0pfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19HUElPSl9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfR1BJT0pfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19HUElPSl9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19HUElPSl9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fR1BJT0pfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfR1BJT0pfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0dQSU9KX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19HUElPSl9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0dQSU9LX0NMS19FTkFCTEUgX19IQUxfUkNDX0dQSU9LX0NMS19FTkFCTEUKKyNkZWZpbmUgX19HUElPS19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfR1BJT0tfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19HUElPS19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19HUElPS19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fR1BJT0tfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfR1BJT0tfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0dQSU9LX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19HUElPS19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0VUSF9DTEtfRU5BQkxFIF9fSEFMX1JDQ19FVEhfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0VUSF9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfRVRIX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fRENNSV9DTEtfRU5BQkxFIF9fSEFMX1JDQ19EQ01JX0NMS19FTkFCTEUKKyNkZWZpbmUgX19EQ01JX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19EQ01JX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fRENNSV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfRENNSV9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0RDTUlfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfRENNSV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fRENNSV9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19EQ01JX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19EQ01JX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19EQ01JX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fVUFSVDdfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVUFSVDdfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1VBUlQ3X0NMS19ESVNBQkxFIF9fSEFMX1JDQ19VQVJUN19DTEtfRElTQUJMRQorI2RlZmluZSBfX1VBUlQ3X1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1VBUlQ3X1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19VQVJUN19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVUFSVDdfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19VQVJUN19DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19VQVJUN19DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fVUFSVDdfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1VBUlQ3X0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fVUFSVDhfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVUFSVDhfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1VBUlQ4X0NMS19ESVNBQkxFIF9fSEFMX1JDQ19VQVJUOF9DTEtfRElTQUJMRQorI2RlZmluZSBfX1VBUlQ4X0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19VQVJUOF9GT1JDRV9SRVNFVAorI2RlZmluZSBfX1VBUlQ4X1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1VBUlQ4X1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19VQVJUOF9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19VQVJUOF9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fVUFSVDhfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1VBUlQ4X0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fT1RHSFNfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfVVNCX09UR19IU19DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fT1RHSFNfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1VTQl9PVEdfSFNfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19PVEdIU19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVVNCX09UR19IU19GT1JDRV9SRVNFVAorI2RlZmluZSBfX09UR0hTX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1VTQl9PVEdfSFNfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX09UR0hTVUxQSV9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19VU0JfT1RHX0hTX1VMUElfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX09UR0hTVUxQSV9DTEtfU0xFRVBfRElTQUJMRSBcCisgIF9fSEFMX1JDQ19VU0JfT1RHX0hTX1VMUElfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19IQUxfUkNDX09UR0hTX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1VTQl9PVEdfSFNfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfT1RHSFNfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1VTQl9PVEdfSFNfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19IQUxfUkNDX09UR0hTX0lTX0NMS19TTEVFUF9FTkFCTEVEIFwKKyAgX19IQUxfUkNDX1VTQl9PVEdfSFNfSVNfQ0xLX1NMRUVQX0VOQUJMRUQKKyNkZWZpbmUgX19IQUxfUkNDX09UR0hTX0lTX0NMS19TTEVFUF9ESVNBQkxFRCBcCisgIF9fSEFMX1JDQ19VU0JfT1RHX0hTX0lTX0NMS19TTEVFUF9ESVNBQkxFRAorI2RlZmluZSBfX0hBTF9SQ0NfT1RHSFNfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1VTQl9PVEdfSFNfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19IQUxfUkNDX09UR0hTX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1VTQl9PVEdfSFNfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0hBTF9SQ0NfT1RHSFNVTFBJX0NMS19TTEVFUF9FTkFCTEUgXAorICBfX0hBTF9SQ0NfVVNCX09UR19IU19VTFBJX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19IQUxfUkNDX09UR0hTVUxQSV9DTEtfU0xFRVBfRElTQUJMRSBcCisgIF9fSEFMX1JDQ19VU0JfT1RHX0hTX1VMUElfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19IQUxfUkNDX09UR0hTVUxQSV9JU19DTEtfU0xFRVBfRU5BQkxFRCBcCisgIF9fSEFMX1JDQ19VU0JfT1RHX0hTX1VMUElfSVNfQ0xLX1NMRUVQX0VOQUJMRUQKKyNkZWZpbmUgX19IQUxfUkNDX09UR0hTVUxQSV9JU19DTEtfU0xFRVBfRElTQUJMRUQgXAorICBfX0hBTF9SQ0NfVVNCX09UR19IU19VTFBJX0lTX0NMS19TTEVFUF9ESVNBQkxFRAorI2RlZmluZSBfX1NSQU0zX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1NSQU0zX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19DQU4yX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0NBTjJfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0NBTjJfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0NBTjJfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19EQUNfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfREFDX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19EQUNfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0RBQ19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0FEQzJfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfQURDMl9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fQURDMl9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfQURDMl9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0FEQzNfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfQURDM19DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fQURDM19DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfQURDM19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0ZTTUNfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0ZTTUNfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19GU01DX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0ZTTUNfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0ZTTUNfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfRlNNQ19DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fRlNNQ19DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfRlNNQ19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1NESU9fRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1NESU9fRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19TRElPX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1NESU9fUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1NESU9fQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1NESU9fQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19TRElPX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1NESU9fQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0RNQTJEX0NMS19FTkFCTEUgX19IQUxfUkNDX0RNQTJEX0NMS19FTkFCTEUKKyNkZWZpbmUgX19ETUEyRF9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfRE1BMkRfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19ETUEyRF9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfRE1BMkRfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19ETUEyRF9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19ETUEyRF9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fRE1BMkRfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfRE1BMkRfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0RNQTJEX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19ETUEyRF9DTEtfU0xFRVBfRElTQUJMRQorCisvKiBhbGlhcyBkZWZpbmUgbWFpbnRhaW5lZCBmb3IgbGVnYWN5ICovCisjZGVmaW5lIF9fSEFMX1JDQ19PVEdGU19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVVNCX09UR19GU19GT1JDRV9SRVNFVAorI2RlZmluZSBfX0hBTF9SQ0NfT1RHRlNfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVVNCX09UR19GU19SRUxFQVNFX1JFU0VUCisKKyNkZWZpbmUgX19BREMxMl9DTEtfRU5BQkxFIF9fSEFMX1JDQ19BREMxMl9DTEtfRU5BQkxFCisjZGVmaW5lIF9fQURDMTJfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0FEQzEyX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fQURDMzRfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfQURDMzRfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0FEQzM0X0NMS19ESVNBQkxFIF9fSEFMX1JDQ19BREMzNF9DTEtfRElTQUJMRQorI2RlZmluZSBfX0RBQzJfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfREFDMl9DTEtfRU5BQkxFCisjZGVmaW5lIF9fREFDMl9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfREFDMl9DTEtfRElTQUJMRQorI2RlZmluZSBfX1RJTTE4X0NMS19FTkFCTEUgX19IQUxfUkNDX1RJTTE4X0NMS19FTkFCTEUKKyNkZWZpbmUgX19USU0xOF9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVElNMThfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19USU0xOV9DTEtfRU5BQkxFIF9fSEFMX1JDQ19USU0xOV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVElNMTlfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1RJTTE5X0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVElNMjBfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVElNMjBfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1RJTTIwX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19USU0yMF9DTEtfRElTQUJMRQorI2RlZmluZSBfX0hSVElNMV9DTEtfRU5BQkxFIF9fSEFMX1JDQ19IUlRJTTFfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0hSVElNMV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfSFJUSU0xX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fU0RBREMxX0NMS19FTkFCTEUgX19IQUxfUkNDX1NEQURDMV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fU0RBREMyX0NMS19FTkFCTEUgX19IQUxfUkNDX1NEQURDMl9DTEtfRU5BQkxFCisjZGVmaW5lIF9fU0RBREMzX0NMS19FTkFCTEUgX19IQUxfUkNDX1NEQURDM19DTEtfRU5BQkxFCisjZGVmaW5lIF9fU0RBREMxX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19TREFEQzFfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19TREFEQzJfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1NEQURDMl9DTEtfRElTQUJMRQorI2RlZmluZSBfX1NEQURDM19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfU0RBREMzX0NMS19ESVNBQkxFCisKKyNkZWZpbmUgX19BREMxMl9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfQURDMTJfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19BREMxMl9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19BREMxMl9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fQURDMzRfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0FEQzM0X0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fQURDMzRfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfQURDMzRfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0RBQzJfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0RBQzJfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19EQUMyX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0RBQzJfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1RJTTE4X0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19USU0xOF9GT1JDRV9SRVNFVAorI2RlZmluZSBfX1RJTTE4X1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1RJTTE4X1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19USU0xOV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVElNMTlfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19USU0xOV9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19USU0xOV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVElNMjBfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1RJTTIwX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVElNMjBfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVElNMjBfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0hSVElNMV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfSFJUSU0xX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fSFJUSU0xX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0hSVElNMV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fU0RBREMxX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19TREFEQzFfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19TREFEQzJfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1NEQURDMl9GT1JDRV9SRVNFVAorI2RlZmluZSBfX1NEQURDM19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfU0RBREMzX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fU0RBREMxX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1NEQURDMV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fU0RBREMyX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1NEQURDMl9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fU0RBREMzX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1NEQURDM19SRUxFQVNFX1JFU0VUCisKKyNkZWZpbmUgX19BREMxX0lTX0NMS19FTkFCTEVEIF9fSEFMX1JDQ19BREMxX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fQURDMV9JU19DTEtfRElTQUJMRUQgX19IQUxfUkNDX0FEQzFfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fQURDMTJfSVNfQ0xLX0VOQUJMRUQgX19IQUxfUkNDX0FEQzEyX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fQURDMTJfSVNfQ0xLX0RJU0FCTEVEIF9fSEFMX1JDQ19BREMxMl9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19BREMzNF9JU19DTEtfRU5BQkxFRCBfX0hBTF9SQ0NfQURDMzRfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19BREMzNF9JU19DTEtfRElTQUJMRUQgX19IQUxfUkNDX0FEQzM0X0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX0NFQ19JU19DTEtfRU5BQkxFRCBfX0hBTF9SQ0NfQ0VDX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fQ0VDX0lTX0NMS19ESVNBQkxFRCBfX0hBTF9SQ0NfQ0VDX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX0NSQ19JU19DTEtfRU5BQkxFRCBfX0hBTF9SQ0NfQ1JDX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fQ1JDX0lTX0NMS19ESVNBQkxFRCBfX0hBTF9SQ0NfQ1JDX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX0RBQzFfSVNfQ0xLX0VOQUJMRUQgX19IQUxfUkNDX0RBQzFfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19EQUMxX0lTX0NMS19ESVNBQkxFRCBfX0hBTF9SQ0NfREFDMV9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19EQUMyX0lTX0NMS19FTkFCTEVEIF9fSEFMX1JDQ19EQUMyX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fREFDMl9JU19DTEtfRElTQUJMRUQgX19IQUxfUkNDX0RBQzJfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fRE1BMV9JU19DTEtfRU5BQkxFRCBfX0hBTF9SQ0NfRE1BMV9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX0RNQTFfSVNfQ0xLX0RJU0FCTEVEIF9fSEFMX1JDQ19ETUExX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX0RNQTJfSVNfQ0xLX0VOQUJMRUQgX19IQUxfUkNDX0RNQTJfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19ETUEyX0lTX0NMS19ESVNBQkxFRCBfX0hBTF9SQ0NfRE1BMl9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19GTElURl9JU19DTEtfRU5BQkxFRCBfX0hBTF9SQ0NfRkxJVEZfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19GTElURl9JU19DTEtfRElTQUJMRUQgX19IQUxfUkNDX0ZMSVRGX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX0ZNQ19JU19DTEtfRU5BQkxFRCBfX0hBTF9SQ0NfRk1DX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fRk1DX0lTX0NMS19ESVNBQkxFRCBfX0hBTF9SQ0NfRk1DX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX0dQSU9BX0lTX0NMS19FTkFCTEVEIF9fSEFMX1JDQ19HUElPQV9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX0dQSU9BX0lTX0NMS19ESVNBQkxFRCBfX0hBTF9SQ0NfR1BJT0FfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fR1BJT0JfSVNfQ0xLX0VOQUJMRUQgX19IQUxfUkNDX0dQSU9CX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fR1BJT0JfSVNfQ0xLX0RJU0FCTEVEIF9fSEFMX1JDQ19HUElPQl9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19HUElPQ19JU19DTEtfRU5BQkxFRCBfX0hBTF9SQ0NfR1BJT0NfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19HUElPQ19JU19DTEtfRElTQUJMRUQgX19IQUxfUkNDX0dQSU9DX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX0dQSU9EX0lTX0NMS19FTkFCTEVEIF9fSEFMX1JDQ19HUElPRF9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX0dQSU9EX0lTX0NMS19ESVNBQkxFRCBfX0hBTF9SQ0NfR1BJT0RfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fR1BJT0VfSVNfQ0xLX0VOQUJMRUQgX19IQUxfUkNDX0dQSU9FX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fR1BJT0VfSVNfQ0xLX0RJU0FCTEVEIF9fSEFMX1JDQ19HUElPRV9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19HUElPRl9JU19DTEtfRU5BQkxFRCBfX0hBTF9SQ0NfR1BJT0ZfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19HUElPRl9JU19DTEtfRElTQUJMRUQgX19IQUxfUkNDX0dQSU9GX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX0dQSU9HX0lTX0NMS19FTkFCTEVEIF9fSEFMX1JDQ19HUElPR19JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX0dQSU9HX0lTX0NMS19ESVNBQkxFRCBfX0hBTF9SQ0NfR1BJT0dfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fR1BJT0hfSVNfQ0xLX0VOQUJMRUQgX19IQUxfUkNDX0dQSU9IX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fR1BJT0hfSVNfQ0xLX0RJU0FCTEVEIF9fSEFMX1JDQ19HUElPSF9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19IUlRJTTFfSVNfQ0xLX0VOQUJMRUQgX19IQUxfUkNDX0hSVElNMV9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX0hSVElNMV9JU19DTEtfRElTQUJMRUQgX19IQUxfUkNDX0hSVElNMV9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19JMkMxX0lTX0NMS19FTkFCTEVEIF9fSEFMX1JDQ19JMkMxX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fSTJDMV9JU19DTEtfRElTQUJMRUQgX19IQUxfUkNDX0kyQzFfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fSTJDMl9JU19DTEtfRU5BQkxFRCBfX0hBTF9SQ0NfSTJDMl9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX0kyQzJfSVNfQ0xLX0RJU0FCTEVEIF9fSEFMX1JDQ19JMkMyX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX0kyQzNfSVNfQ0xLX0VOQUJMRUQgX19IQUxfUkNDX0kyQzNfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19JMkMzX0lTX0NMS19ESVNBQkxFRCBfX0hBTF9SQ0NfSTJDM19JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19QV1JfSVNfQ0xLX0VOQUJMRUQgX19IQUxfUkNDX1BXUl9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1BXUl9JU19DTEtfRElTQUJMRUQgX19IQUxfUkNDX1BXUl9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19TWVNDRkdfSVNfQ0xLX0VOQUJMRUQgX19IQUxfUkNDX1NZU0NGR19JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1NZU0NGR19JU19DTEtfRElTQUJMRUQgX19IQUxfUkNDX1NZU0NGR19JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19TUEkxX0lTX0NMS19FTkFCTEVEIF9fSEFMX1JDQ19TUEkxX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fU1BJMV9JU19DTEtfRElTQUJMRUQgX19IQUxfUkNDX1NQSTFfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fU1BJMl9JU19DTEtfRU5BQkxFRCBfX0hBTF9SQ0NfU1BJMl9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1NQSTJfSVNfQ0xLX0RJU0FCTEVEIF9fSEFMX1JDQ19TUEkyX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX1NQSTNfSVNfQ0xLX0VOQUJMRUQgX19IQUxfUkNDX1NQSTNfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19TUEkzX0lTX0NMS19ESVNBQkxFRCBfX0hBTF9SQ0NfU1BJM19JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19TUEk0X0lTX0NMS19FTkFCTEVEIF9fSEFMX1JDQ19TUEk0X0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fU1BJNF9JU19DTEtfRElTQUJMRUQgX19IQUxfUkNDX1NQSTRfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fU0RBREMxX0lTX0NMS19FTkFCTEVEIF9fSEFMX1JDQ19TREFEQzFfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19TREFEQzFfSVNfQ0xLX0RJU0FCTEVEIF9fSEFMX1JDQ19TREFEQzFfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fU0RBREMyX0lTX0NMS19FTkFCTEVEIF9fSEFMX1JDQ19TREFEQzJfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19TREFEQzJfSVNfQ0xLX0RJU0FCTEVEIF9fSEFMX1JDQ19TREFEQzJfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fU0RBREMzX0lTX0NMS19FTkFCTEVEIF9fSEFMX1JDQ19TREFEQzNfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19TREFEQzNfSVNfQ0xLX0RJU0FCTEVEIF9fSEFMX1JDQ19TREFEQzNfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fU1JBTV9JU19DTEtfRU5BQkxFRCBfX0hBTF9SQ0NfU1JBTV9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1NSQU1fSVNfQ0xLX0RJU0FCTEVEIF9fSEFMX1JDQ19TUkFNX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX1RJTTFfSVNfQ0xLX0VOQUJMRUQgX19IQUxfUkNDX1RJTTFfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19USU0xX0lTX0NMS19ESVNBQkxFRCBfX0hBTF9SQ0NfVElNMV9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19USU0yX0lTX0NMS19FTkFCTEVEIF9fSEFMX1JDQ19USU0yX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fVElNMl9JU19DTEtfRElTQUJMRUQgX19IQUxfUkNDX1RJTTJfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fVElNM19JU19DTEtfRU5BQkxFRCBfX0hBTF9SQ0NfVElNM19JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1RJTTNfSVNfQ0xLX0RJU0FCTEVEIF9fSEFMX1JDQ19USU0zX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX1RJTTRfSVNfQ0xLX0VOQUJMRUQgX19IQUxfUkNDX1RJTTRfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19USU00X0lTX0NMS19ESVNBQkxFRCBfX0hBTF9SQ0NfVElNNF9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19USU01X0lTX0NMS19FTkFCTEVEIF9fSEFMX1JDQ19USU01X0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fVElNNV9JU19DTEtfRElTQUJMRUQgX19IQUxfUkNDX1RJTTVfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fVElNNl9JU19DTEtfRU5BQkxFRCBfX0hBTF9SQ0NfVElNNl9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1RJTTZfSVNfQ0xLX0RJU0FCTEVEIF9fSEFMX1JDQ19USU02X0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX1RJTTdfSVNfQ0xLX0VOQUJMRUQgX19IQUxfUkNDX1RJTTdfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19USU03X0lTX0NMS19ESVNBQkxFRCBfX0hBTF9SQ0NfVElNN19JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19USU04X0lTX0NMS19FTkFCTEVEIF9fSEFMX1JDQ19USU04X0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fVElNOF9JU19DTEtfRElTQUJMRUQgX19IQUxfUkNDX1RJTThfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fVElNMTJfSVNfQ0xLX0VOQUJMRUQgX19IQUxfUkNDX1RJTTEyX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fVElNMTJfSVNfQ0xLX0RJU0FCTEVEIF9fSEFMX1JDQ19USU0xMl9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19USU0xM19JU19DTEtfRU5BQkxFRCBfX0hBTF9SQ0NfVElNMTNfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19USU0xM19JU19DTEtfRElTQUJMRUQgX19IQUxfUkNDX1RJTTEzX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX1RJTTE0X0lTX0NMS19FTkFCTEVEIF9fSEFMX1JDQ19USU0xNF9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1RJTTE0X0lTX0NMS19ESVNBQkxFRCBfX0hBTF9SQ0NfVElNMTRfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fVElNMTVfSVNfQ0xLX0VOQUJMRUQgX19IQUxfUkNDX1RJTTE1X0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fVElNMTVfSVNfQ0xLX0RJU0FCTEVEIF9fSEFMX1JDQ19USU0xNV9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19USU0xNl9JU19DTEtfRU5BQkxFRCBfX0hBTF9SQ0NfVElNMTZfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19USU0xNl9JU19DTEtfRElTQUJMRUQgX19IQUxfUkNDX1RJTTE2X0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX1RJTTE3X0lTX0NMS19FTkFCTEVEIF9fSEFMX1JDQ19USU0xN19JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1RJTTE3X0lTX0NMS19ESVNBQkxFRCBfX0hBTF9SQ0NfVElNMTdfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fVElNMThfSVNfQ0xLX0VOQUJMRUQgX19IQUxfUkNDX1RJTTE4X0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fVElNMThfSVNfQ0xLX0RJU0FCTEVEIF9fSEFMX1JDQ19USU0xOF9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19USU0xOV9JU19DTEtfRU5BQkxFRCBfX0hBTF9SQ0NfVElNMTlfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19USU0xOV9JU19DTEtfRElTQUJMRUQgX19IQUxfUkNDX1RJTTE5X0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX1RJTTIwX0lTX0NMS19FTkFCTEVEIF9fSEFMX1JDQ19USU0yMF9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1RJTTIwX0lTX0NMS19ESVNBQkxFRCBfX0hBTF9SQ0NfVElNMjBfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fVFNDX0lTX0NMS19FTkFCTEVEIF9fSEFMX1JDQ19UU0NfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19UU0NfSVNfQ0xLX0RJU0FCTEVEIF9fSEFMX1JDQ19UU0NfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fVUFSVDRfSVNfQ0xLX0VOQUJMRUQgX19IQUxfUkNDX1VBUlQ0X0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fVUFSVDRfSVNfQ0xLX0RJU0FCTEVEIF9fSEFMX1JDQ19VQVJUNF9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19VQVJUNV9JU19DTEtfRU5BQkxFRCBfX0hBTF9SQ0NfVUFSVDVfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19VQVJUNV9JU19DTEtfRElTQUJMRUQgX19IQUxfUkNDX1VBUlQ1X0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX1VTQVJUMV9JU19DTEtfRU5BQkxFRCBfX0hBTF9SQ0NfVVNBUlQxX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fVVNBUlQxX0lTX0NMS19ESVNBQkxFRCBfX0hBTF9SQ0NfVVNBUlQxX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX1VTQVJUMl9JU19DTEtfRU5BQkxFRCBfX0hBTF9SQ0NfVVNBUlQyX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fVVNBUlQyX0lTX0NMS19ESVNBQkxFRCBfX0hBTF9SQ0NfVVNBUlQyX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX1VTQVJUM19JU19DTEtfRU5BQkxFRCBfX0hBTF9SQ0NfVVNBUlQzX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fVVNBUlQzX0lTX0NMS19ESVNBQkxFRCBfX0hBTF9SQ0NfVVNBUlQzX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX1VTQl9JU19DTEtfRU5BQkxFRCBfX0hBTF9SQ0NfVVNCX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fVVNCX0lTX0NMS19ESVNBQkxFRCBfX0hBTF9SQ0NfVVNCX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX1dXREdfSVNfQ0xLX0VOQUJMRUQgX19IQUxfUkNDX1dXREdfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19XV0RHX0lTX0NMS19ESVNBQkxFRCBfX0hBTF9SQ0NfV1dER19JU19DTEtfRElTQUJMRUQKKworI2lmIGRlZmluZWQoU1RNMzJMMSkKKyNkZWZpbmUgX19IQUxfUkNDX0NSWVBfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0FFU19DTEtfRElTQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfQ1JZUF9DTEtfRU5BQkxFIF9fSEFMX1JDQ19BRVNfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfQ1JZUF9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfQUVTX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19DUllQX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0FFU19DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19DUllQX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19BRVNfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19IQUxfUkNDX0NSWVBfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfQUVTX1JFTEVBU0VfUkVTRVQKKyNlbmRpZiAvKiBTVE0zMkwxICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjQpCisjZGVmaW5lIF9fSEFMX1JDQ19TRE1NQzFfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1NESU9fRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19IQUxfUkNDX1NETU1DMV9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19TRElPX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19IQUxfUkNDX1NETU1DMV9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19TRElPX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19IQUxfUkNDX1NETU1DMV9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfU0RJT19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfU0RNTUMxX0NMS19FTkFCTEUgX19IQUxfUkNDX1NESU9fQ0xLX0VOQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfU0RNTUMxX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19TRElPX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19TRE1NQzFfSVNfQ0xLX0VOQUJMRUQgX19IQUxfUkNDX1NESU9fSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19IQUxfUkNDX1NETU1DMV9JU19DTEtfRElTQUJMRUQgX19IQUxfUkNDX1NESU9fSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIFNkbW1jMUNsb2NrU2VsZWN0aW9uIFNkaW9DbG9ja1NlbGVjdGlvbgorI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX1NETU1DMSBSQ0NfUEVSSVBIQ0xLX1NESU8KKyNkZWZpbmUgUkNDX1NETU1DMUNMS1NPVVJDRV9DTEs0OCBSQ0NfU0RJT0NMS1NPVVJDRV9DSzQ4CisjZGVmaW5lIFJDQ19TRE1NQzFDTEtTT1VSQ0VfU1lTQ0xLIFJDQ19TRElPQ0xLU09VUkNFX1NZU0NMSworI2RlZmluZSBfX0hBTF9SQ0NfU0RNTUMxX0NPTkZJRyBfX0hBTF9SQ0NfU0RJT19DT05GSUcKKyNkZWZpbmUgX19IQUxfUkNDX0dFVF9TRE1NQzFfU09VUkNFIF9fSEFMX1JDQ19HRVRfU0RJT19TT1VSQ0UKKyNlbmRpZgorCisjaWYgZGVmaW5lZChTVE0zMkY3KSB8fCBkZWZpbmVkKFNUTTMyTDQpCisjZGVmaW5lIF9fSEFMX1JDQ19TRElPX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19TRE1NQzFfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19IQUxfUkNDX1NESU9fUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfU0RNTUMxX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19IQUxfUkNDX1NESU9fQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfU0RNTUMxX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19IQUxfUkNDX1NESU9fQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1NETU1DMV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfU0RJT19DTEtfRU5BQkxFIF9fSEFMX1JDQ19TRE1NQzFfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfU0RJT19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfU0RNTUMxX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19TRElPX0lTX0NMS19FTkFCTEVEIF9fSEFMX1JDQ19TRE1NQzFfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19IQUxfUkNDX1NESU9fSVNfQ0xLX0RJU0FCTEVEIF9fSEFMX1JDQ19TRE1NQzFfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIFNkaW9DbG9ja1NlbGVjdGlvbiBTZG1tYzFDbG9ja1NlbGVjdGlvbgorI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX1NESU8gUkNDX1BFUklQSENMS19TRE1NQzEKKyNkZWZpbmUgX19IQUxfUkNDX1NESU9fQ09ORklHIF9fSEFMX1JDQ19TRE1NQzFfQ09ORklHCisjZGVmaW5lIF9fSEFMX1JDQ19HRVRfU0RJT19TT1VSQ0UgX19IQUxfUkNDX0dFVF9TRE1NQzFfU09VUkNFCisjZW5kaWYKKworI2lmIGRlZmluZWQoU1RNMzJGNykKKyNkZWZpbmUgUkNDX1NESU9DTEtTT1VSQ0VfQ0xLNDggUkNDX1NETU1DMUNMS1NPVVJDRV9DTEs0OAorI2RlZmluZSBSQ0NfU0RJT0NMS1NPVVJDRV9TWVNDTEsgUkNDX1NETU1DMUNMS1NPVVJDRV9TWVNDTEsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChTVE0zMkg3KQorI2RlZmluZSBfX0hBTF9SQ0NfVVNCX09UR19IU19DTEtfRU5BQkxFKCkgX19IQUxfUkNDX1VTQjFfT1RHX0hTX0NMS19FTkFCTEUoKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNCX09UR19IU19VTFBJX0NMS19FTkFCTEUoKSBcCisgIF9fSEFMX1JDQ19VU0IxX09UR19IU19VTFBJX0NMS19FTkFCTEUoKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNCX09UR19IU19DTEtfRElTQUJMRSgpIF9fSEFMX1JDQ19VU0IxX09UR19IU19DTEtfRElTQUJMRSgpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0JfT1RHX0hTX1VMUElfQ0xLX0RJU0FCTEUoKSBcCisgIF9fSEFMX1JDQ19VU0IxX09UR19IU19VTFBJX0NMS19ESVNBQkxFKCkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQl9PVEdfSFNfRk9SQ0VfUkVTRVQoKSBfX0hBTF9SQ0NfVVNCMV9PVEdfSFNfRk9SQ0VfUkVTRVQoKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNCX09UR19IU19SRUxFQVNFX1JFU0VUKCkgXAorICBfX0hBTF9SQ0NfVVNCMV9PVEdfSFNfUkVMRUFTRV9SRVNFVCgpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0JfT1RHX0hTX0NMS19TTEVFUF9FTkFCTEUoKSBcCisgIF9fSEFMX1JDQ19VU0IxX09UR19IU19DTEtfU0xFRVBfRU5BQkxFKCkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQl9PVEdfSFNfVUxQSV9DTEtfU0xFRVBfRU5BQkxFKCkgXAorICBfX0hBTF9SQ0NfVVNCMV9PVEdfSFNfVUxQSV9DTEtfU0xFRVBfRU5BQkxFKCkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQl9PVEdfSFNfQ0xLX1NMRUVQX0RJU0FCTEUoKSBcCisgIF9fSEFMX1JDQ19VU0IxX09UR19IU19DTEtfU0xFRVBfRElTQUJMRSgpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0JfT1RHX0hTX1VMUElfQ0xLX1NMRUVQX0RJU0FCTEUoKSBcCisgIF9fSEFMX1JDQ19VU0IxX09UR19IU19VTFBJX0NMS19TTEVFUF9ESVNBQkxFKCkKKworI2RlZmluZSBfX0hBTF9SQ0NfVVNCX09UR19GU19DTEtfRU5BQkxFKCkgX19IQUxfUkNDX1VTQjJfT1RHX0ZTX0NMS19FTkFCTEUoKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNCX09UR19GU19VTFBJX0NMS19FTkFCTEUoKSBcCisgIF9fSEFMX1JDQ19VU0IyX09UR19GU19VTFBJX0NMS19FTkFCTEUoKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNCX09UR19GU19DTEtfRElTQUJMRSgpIF9fSEFMX1JDQ19VU0IyX09UR19GU19DTEtfRElTQUJMRSgpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0JfT1RHX0ZTX1VMUElfQ0xLX0RJU0FCTEUoKSBcCisgIF9fSEFMX1JDQ19VU0IyX09UR19GU19VTFBJX0NMS19ESVNBQkxFKCkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQl9PVEdfRlNfRk9SQ0VfUkVTRVQoKSBfX0hBTF9SQ0NfVVNCMl9PVEdfRlNfRk9SQ0VfUkVTRVQoKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNCX09UR19GU19SRUxFQVNFX1JFU0VUKCkgXAorICBfX0hBTF9SQ0NfVVNCMl9PVEdfRlNfUkVMRUFTRV9SRVNFVCgpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0JfT1RHX0ZTX0NMS19TTEVFUF9FTkFCTEUoKSBcCisgIF9fSEFMX1JDQ19VU0IyX09UR19GU19DTEtfU0xFRVBfRU5BQkxFKCkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQl9PVEdfRlNfVUxQSV9DTEtfU0xFRVBfRU5BQkxFKCkgXAorICBfX0hBTF9SQ0NfVVNCMl9PVEdfRlNfVUxQSV9DTEtfU0xFRVBfRU5BQkxFKCkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQl9PVEdfRlNfQ0xLX1NMRUVQX0RJU0FCTEUoKSBcCisgIF9fSEFMX1JDQ19VU0IyX09UR19GU19DTEtfU0xFRVBfRElTQUJMRSgpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0JfT1RHX0ZTX1VMUElfQ0xLX1NMRUVQX0RJU0FCTEUoKSBcCisgIF9fSEFMX1JDQ19VU0IyX09UR19GU19VTFBJX0NMS19TTEVFUF9ESVNBQkxFKCkKKyNlbmRpZgorCisjZGVmaW5lIF9fSEFMX1JDQ19JMlNDTEsgX19IQUxfUkNDX0kyU19DT05GSUcKKyNkZWZpbmUgX19IQUxfUkNDX0kyU0NMS19DT05GSUcgX19IQUxfUkNDX0kyU19DT05GSUcKKworI2RlZmluZSBfX1JDQ19QTExTUkMgUkNDX0dFVF9QTExfT1NDU09VUkNFCisKKyNkZWZpbmUgSVNfUkNDX01TSVJBTkdFIElTX1JDQ19NU0lfQ0xPQ0tfUkFOR0UKKyNkZWZpbmUgSVNfUkNDX1JUQ0NMS19TT1VSQ0UgSVNfUkNDX1JUQ0NMS1NPVVJDRQorI2RlZmluZSBJU19SQ0NfU1lTQ0xLX0RJViBJU19SQ0NfSENMSworI2RlZmluZSBJU19SQ0NfSENMS19ESVYgSVNfUkNDX1BDTEsKKyNkZWZpbmUgSVNfUkNDX1BFUklQSENMSyBJU19SQ0NfUEVSSVBIQ0xPQ0sKKworI2RlZmluZSBSQ0NfSVRfSFNJMTQgUkNDX0lUX0hTSTE0UkRZCisKKyNkZWZpbmUgUkNDX0lUX0NTU0xTRSBSQ0NfSVRfTFNFQ1NTCisjZGVmaW5lIFJDQ19JVF9DU1NIU0UgUkNDX0lUX0NTUworCisjZGVmaW5lIFJDQ19QTExNVUxfMyBSQ0NfUExMX01VTDMKKyNkZWZpbmUgUkNDX1BMTE1VTF80IFJDQ19QTExfTVVMNAorI2RlZmluZSBSQ0NfUExMTVVMXzYgUkNDX1BMTF9NVUw2CisjZGVmaW5lIFJDQ19QTExNVUxfOCBSQ0NfUExMX01VTDgKKyNkZWZpbmUgUkNDX1BMTE1VTF8xMiBSQ0NfUExMX01VTDEyCisjZGVmaW5lIFJDQ19QTExNVUxfMTYgUkNDX1BMTF9NVUwxNgorI2RlZmluZSBSQ0NfUExMTVVMXzI0IFJDQ19QTExfTVVMMjQKKyNkZWZpbmUgUkNDX1BMTE1VTF8zMiBSQ0NfUExMX01VTDMyCisjZGVmaW5lIFJDQ19QTExNVUxfNDggUkNDX1BMTF9NVUw0OAorCisjZGVmaW5lIFJDQ19QTExESVZfMiBSQ0NfUExMX0RJVjIKKyNkZWZpbmUgUkNDX1BMTERJVl8zIFJDQ19QTExfRElWMworI2RlZmluZSBSQ0NfUExMRElWXzQgUkNDX1BMTF9ESVY0CisKKyNkZWZpbmUgSVNfUkNDX01DT1NPVVJDRSBJU19SQ0NfTUNPMVNPVVJDRQorI2RlZmluZSBfX0hBTF9SQ0NfTUNPX0NPTkZJRyBfX0hBTF9SQ0NfTUNPMV9DT05GSUcKKyNkZWZpbmUgUkNDX01DT19OT0RJViBSQ0NfTUNPRElWXzEKKyNkZWZpbmUgUkNDX01DT19ESVYxIFJDQ19NQ09ESVZfMQorI2RlZmluZSBSQ0NfTUNPX0RJVjIgUkNDX01DT0RJVl8yCisjZGVmaW5lIFJDQ19NQ09fRElWNCBSQ0NfTUNPRElWXzQKKyNkZWZpbmUgUkNDX01DT19ESVY4IFJDQ19NQ09ESVZfOAorI2RlZmluZSBSQ0NfTUNPX0RJVjE2IFJDQ19NQ09ESVZfMTYKKyNkZWZpbmUgUkNDX01DT19ESVYzMiBSQ0NfTUNPRElWXzMyCisjZGVmaW5lIFJDQ19NQ09fRElWNjQgUkNDX01DT0RJVl82NAorI2RlZmluZSBSQ0NfTUNPX0RJVjEyOCBSQ0NfTUNPRElWXzEyOAorI2RlZmluZSBSQ0NfTUNPU09VUkNFX05PTkUgUkNDX01DTzFTT1VSQ0VfTk9DTE9DSworI2RlZmluZSBSQ0NfTUNPU09VUkNFX0xTSSBSQ0NfTUNPMVNPVVJDRV9MU0kKKyNkZWZpbmUgUkNDX01DT1NPVVJDRV9MU0UgUkNDX01DTzFTT1VSQ0VfTFNFCisjZGVmaW5lIFJDQ19NQ09TT1VSQ0VfU1lTQ0xLIFJDQ19NQ08xU09VUkNFX1NZU0NMSworI2RlZmluZSBSQ0NfTUNPU09VUkNFX0hTSSBSQ0NfTUNPMVNPVVJDRV9IU0kKKyNkZWZpbmUgUkNDX01DT1NPVVJDRV9IU0kxNCBSQ0NfTUNPMVNPVVJDRV9IU0kxNAorI2RlZmluZSBSQ0NfTUNPU09VUkNFX0hTSTQ4IFJDQ19NQ08xU09VUkNFX0hTSTQ4CisjZGVmaW5lIFJDQ19NQ09TT1VSQ0VfSFNFIFJDQ19NQ08xU09VUkNFX0hTRQorI2RlZmluZSBSQ0NfTUNPU09VUkNFX1BMTENMS19ESVYxIFJDQ19NQ08xU09VUkNFX1BMTENMSworI2RlZmluZSBSQ0NfTUNPU09VUkNFX1BMTENMS19OT0RJViBSQ0NfTUNPMVNPVVJDRV9QTExDTEsKKyNkZWZpbmUgUkNDX01DT1NPVVJDRV9QTExDTEtfRElWMiBSQ0NfTUNPMVNPVVJDRV9QTExDTEtfRElWMgorCisjaWYgZGVmaW5lZChTVE0zMlUwKQorI2RlZmluZSBSQ0NfU1lTQ0xLU09VUkNFX1NUQVRVU19QTExSIFJDQ19TWVNDTEtTT1VSQ0VfU1RBVFVTX1BMTENMSworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFNUTTMyTDQpIHx8IGRlZmluZWQoU1RNMzJXQikgfHwgZGVmaW5lZChTVE0zMkcwKSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkc0KSB8fCBkZWZpbmVkKFNUTTMyTDUpIHx8IGRlZmluZWQoU1RNMzJXTCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJDMCkgfHwgZGVmaW5lZChTVE0zMkg3UlMpIHx8IGRlZmluZWQoU1RNMzJVMCkKKyNkZWZpbmUgUkNDX1JUQ0NMS1NPVVJDRV9OT19DTEsgUkNDX1JUQ0NMS1NPVVJDRV9OT05FCisjZWxzZQorI2RlZmluZSBSQ0NfUlRDQ0xLU09VUkNFX05PTkUgUkNDX1JUQ0NMS1NPVVJDRV9OT19DTEsKKyNlbmRpZgorCisjZGVmaW5lIFJDQ19VU0JDTEtfUExMU0FJMSBSQ0NfVVNCQ0xLU09VUkNFX1BMTFNBSTEKKyNkZWZpbmUgUkNDX1VTQkNMS19QTEwgUkNDX1VTQkNMS1NPVVJDRV9QTEwKKyNkZWZpbmUgUkNDX1VTQkNMS19NU0kgUkNDX1VTQkNMS1NPVVJDRV9NU0kKKyNkZWZpbmUgUkNDX1VTQkNMS1NPVVJDRV9QTExDTEsgUkNDX1VTQkNMS1NPVVJDRV9QTEwKKyNkZWZpbmUgUkNDX1VTQlBMTENMS19ESVYxIFJDQ19VU0JDTEtTT1VSQ0VfUExMCisjZGVmaW5lIFJDQ19VU0JQTExDTEtfRElWMV81IFJDQ19VU0JDTEtTT1VSQ0VfUExMX0RJVjFfNQorI2RlZmluZSBSQ0NfVVNCUExMQ0xLX0RJVjIgUkNDX1VTQkNMS1NPVVJDRV9QTExfRElWMgorI2RlZmluZSBSQ0NfVVNCUExMQ0xLX0RJVjMgUkNDX1VTQkNMS1NPVVJDRV9QTExfRElWMworCisjZGVmaW5lIEhTSU9OX0JpdE51bWJlciBSQ0NfSFNJT05fQklUX05VTUJFUgorI2RlZmluZSBIU0lPTl9CSVROVU1CRVIgUkNDX0hTSU9OX0JJVF9OVU1CRVIKKyNkZWZpbmUgSFNFT05fQml0TnVtYmVyIFJDQ19IU0VPTl9CSVRfTlVNQkVSCisjZGVmaW5lIEhTRU9OX0JJVE5VTUJFUiBSQ0NfSFNFT05fQklUX05VTUJFUgorI2RlZmluZSBNU0lPTl9CSVROVU1CRVIgUkNDX01TSU9OX0JJVF9OVU1CRVIKKyNkZWZpbmUgQ1NTT05fQml0TnVtYmVyIFJDQ19DU1NPTl9CSVRfTlVNQkVSCisjZGVmaW5lIENTU09OX0JJVE5VTUJFUiBSQ0NfQ1NTT05fQklUX05VTUJFUgorI2RlZmluZSBQTExPTl9CaXROdW1iZXIgUkNDX1BMTE9OX0JJVF9OVU1CRVIKKyNkZWZpbmUgUExMT05fQklUTlVNQkVSIFJDQ19QTExPTl9CSVRfTlVNQkVSCisjZGVmaW5lIFBMTEkyU09OX0JpdE51bWJlciBSQ0NfUExMSTJTT05fQklUX05VTUJFUgorI2RlZmluZSBJMlNTUkNfQml0TnVtYmVyIFJDQ19JMlNTUkNfQklUX05VTUJFUgorI2RlZmluZSBSVENFTl9CaXROdW1iZXIgUkNDX1JUQ0VOX0JJVF9OVU1CRVIKKyNkZWZpbmUgUlRDRU5fQklUTlVNQkVSIFJDQ19SVENFTl9CSVRfTlVNQkVSCisjZGVmaW5lIEJEUlNUX0JpdE51bWJlciBSQ0NfQkRSU1RfQklUX05VTUJFUgorI2RlZmluZSBCRFJTVF9CSVROVU1CRVIgUkNDX0JEUlNUX0JJVF9OVU1CRVIKKyNkZWZpbmUgUlRDUlNUX0JJVE5VTUJFUiBSQ0NfUlRDUlNUX0JJVF9OVU1CRVIKKyNkZWZpbmUgTFNJT05fQml0TnVtYmVyIFJDQ19MU0lPTl9CSVRfTlVNQkVSCisjZGVmaW5lIExTSU9OX0JJVE5VTUJFUiBSQ0NfTFNJT05fQklUX05VTUJFUgorI2RlZmluZSBMU0VPTl9CaXROdW1iZXIgUkNDX0xTRU9OX0JJVF9OVU1CRVIKKyNkZWZpbmUgTFNFT05fQklUTlVNQkVSIFJDQ19MU0VPTl9CSVRfTlVNQkVSCisjZGVmaW5lIExTRUJZUF9CSVROVU1CRVIgUkNDX0xTRUJZUF9CSVRfTlVNQkVSCisjZGVmaW5lIFBMTFNBSU9OX0JpdE51bWJlciBSQ0NfUExMU0FJT05fQklUX05VTUJFUgorI2RlZmluZSBUSU1QUkVfQml0TnVtYmVyIFJDQ19USU1QUkVfQklUX05VTUJFUgorI2RlZmluZSBSTVZGX0JpdE51bWJlciBSQ0NfUk1WRl9CSVRfTlVNQkVSCisjZGVmaW5lIFJNVkZfQklUTlVNQkVSIFJDQ19STVZGX0JJVF9OVU1CRVIKKyNkZWZpbmUgUkNDX0NSMl9IU0kxNFRSSU1fQml0TnVtYmVyIFJDQ19IU0kxNFRSSU1fQklUX05VTUJFUgorI2RlZmluZSBDUl9CWVRFMl9BRERSRVNTIFJDQ19DUl9CWVRFMl9BRERSRVNTCisjZGVmaW5lIENJUl9CWVRFMV9BRERSRVNTIFJDQ19DSVJfQllURTFfQUREUkVTUworI2RlZmluZSBDSVJfQllURTJfQUREUkVTUyBSQ0NfQ0lSX0JZVEUyX0FERFJFU1MKKyNkZWZpbmUgQkRDUl9CWVRFMF9BRERSRVNTIFJDQ19CRENSX0JZVEUwX0FERFJFU1MKKyNkZWZpbmUgREJQX1RJTUVPVVRfVkFMVUUgUkNDX0RCUF9USU1FT1VUX1ZBTFVFCisjZGVmaW5lIExTRV9USU1FT1VUX1ZBTFVFIFJDQ19MU0VfVElNRU9VVF9WQUxVRQorCisjZGVmaW5lIENSX0hTSU9OX0JCIFJDQ19DUl9IU0lPTl9CQgorI2RlZmluZSBDUl9DU1NPTl9CQiBSQ0NfQ1JfQ1NTT05fQkIKKyNkZWZpbmUgQ1JfUExMT05fQkIgUkNDX0NSX1BMTE9OX0JCCisjZGVmaW5lIENSX1BMTEkyU09OX0JCIFJDQ19DUl9QTExJMlNPTl9CQgorI2RlZmluZSBDUl9NU0lPTl9CQiBSQ0NfQ1JfTVNJT05fQkIKKyNkZWZpbmUgQ1NSX0xTSU9OX0JCIFJDQ19DU1JfTFNJT05fQkIKKyNkZWZpbmUgQ1NSX0xTRU9OX0JCIFJDQ19DU1JfTFNFT05fQkIKKyNkZWZpbmUgQ1NSX0xTRUJZUF9CQiBSQ0NfQ1NSX0xTRUJZUF9CQgorI2RlZmluZSBDU1JfUlRDRU5fQkIgUkNDX0NTUl9SVENFTl9CQgorI2RlZmluZSBDU1JfUlRDUlNUX0JCIFJDQ19DU1JfUlRDUlNUX0JCCisjZGVmaW5lIENGR1JfSTJTU1JDX0JCIFJDQ19DRkdSX0kyU1NSQ19CQgorI2RlZmluZSBCRENSX1JUQ0VOX0JCIFJDQ19CRENSX1JUQ0VOX0JCCisjZGVmaW5lIEJEQ1JfQkRSU1RfQkIgUkNDX0JEQ1JfQkRSU1RfQkIKKyNkZWZpbmUgQ1JfSFNFT05fQkIgUkNDX0NSX0hTRU9OX0JCCisjZGVmaW5lIENTUl9STVZGX0JCIFJDQ19DU1JfUk1WRl9CQgorI2RlZmluZSBDUl9QTExTQUlPTl9CQiBSQ0NfQ1JfUExMU0FJT05fQkIKKyNkZWZpbmUgRENLQ0ZHUl9USU1QUkVfQkIgUkNDX0RDS0NGR1JfVElNUFJFX0JCCisKKyNkZWZpbmUgX19IQUxfUkNDX0NSU19FTkFCTEVfRlJFUV9FUlJPUl9DT1VOVEVSIFwKKyAgX19IQUxfUkNDX0NSU19GUkVRX0VSUk9SX0NPVU5URVJfRU5BQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19DUlNfRElTQUJMRV9GUkVRX0VSUk9SX0NPVU5URVIgXAorICBfX0hBTF9SQ0NfQ1JTX0ZSRVFfRVJST1JfQ09VTlRFUl9ESVNBQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19DUlNfRU5BQkxFX0FVVE9NQVRJQ19DQUxJQiBcCisgIF9fSEFMX1JDQ19DUlNfQVVUT01BVElDX0NBTElCX0VOQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfQ1JTX0RJU0FCTEVfQVVUT01BVElDX0NBTElCIFwKKyAgX19IQUxfUkNDX0NSU19BVVRPTUFUSUNfQ0FMSUJfRElTQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfQ1JTX0NBTENVTEFURV9SRUxPQURWQUxVRSBfX0hBTF9SQ0NfQ1JTX1JFTE9BRFZBTFVFX0NBTENVTEFURQorCisjZGVmaW5lIF9fSEFMX1JDQ19HRVRfSVRfU09VUkNFIF9fSEFMX1JDQ19HRVRfSVQKKworI2RlZmluZSBSQ0NfQ1JTX1NZTkNXQVJNIFJDQ19DUlNfU1lOQ1dBUk4KKyNkZWZpbmUgUkNDX0NSU19UUklNT1YgUkNDX0NSU19UUklNT1ZGCisKKyNkZWZpbmUgUkNDX1BFUklQSENMS19DSzQ4IFJDQ19QRVJJUEhDTEtfQ0xLNDgKKyNkZWZpbmUgUkNDX0NLNDhDTEtTT1VSQ0VfUExMUSBSQ0NfQ0xLNDhDTEtTT1VSQ0VfUExMUQorI2RlZmluZSBSQ0NfQ0s0OENMS1NPVVJDRV9QTExTQUlQIFJDQ19DTEs0OENMS1NPVVJDRV9QTExTQUlQCisjZGVmaW5lIFJDQ19DSzQ4Q0xLU09VUkNFX1BMTEkyU1EgUkNDX0NMSzQ4Q0xLU09VUkNFX1BMTEkyU1EKKyNkZWZpbmUgSVNfUkNDX0NLNDhDTEtTT1VSQ0UgSVNfUkNDX0NMSzQ4Q0xLU09VUkNFCisjZGVmaW5lIFJDQ19TRElPQ0xLU09VUkNFX0NLNDggUkNDX1NESU9DTEtTT1VSQ0VfQ0xLNDgKKworI2RlZmluZSBfX0hBTF9SQ0NfREZTRE1fQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfREZTRE0xX0NMS19FTkFCTEUKKyNkZWZpbmUgX19IQUxfUkNDX0RGU0RNX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19ERlNETTFfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19IQUxfUkNDX0RGU0RNX0lTX0NMS19FTkFCTEVEIF9fSEFMX1JDQ19ERlNETTFfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19IQUxfUkNDX0RGU0RNX0lTX0NMS19ESVNBQkxFRCBfX0hBTF9SQ0NfREZTRE0xX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX0hBTF9SQ0NfREZTRE1fRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0RGU0RNMV9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0hBTF9SQ0NfREZTRE1fUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfREZTRE0xX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19IQUxfUkNDX0RGU0RNX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0RGU0RNMV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19ERlNETV9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfREZTRE0xX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19ERlNETV9JU19DTEtfU0xFRVBfRU5BQkxFRCBcCisgIF9fSEFMX1JDQ19ERlNETTFfSVNfQ0xLX1NMRUVQX0VOQUJMRUQKKyNkZWZpbmUgX19IQUxfUkNDX0RGU0RNX0lTX0NMS19TTEVFUF9ESVNBQkxFRCBcCisgIF9fSEFMX1JDQ19ERlNETTFfSVNfQ0xLX1NMRUVQX0RJU0FCTEVECisjZGVmaW5lIERmc2RtQ2xvY2tTZWxlY3Rpb24gRGZzZG0xQ2xvY2tTZWxlY3Rpb24KKyNkZWZpbmUgUkNDX1BFUklQSENMS19ERlNETSBSQ0NfUEVSSVBIQ0xLX0RGU0RNMQorI2RlZmluZSBSQ0NfREZTRE1DTEtTT1VSQ0VfUENMSyBSQ0NfREZTRE0xQ0xLU09VUkNFX1BDTEsyCisjZGVmaW5lIFJDQ19ERlNETUNMS1NPVVJDRV9TWVNDTEsgUkNDX0RGU0RNMUNMS1NPVVJDRV9TWVNDTEsKKyNkZWZpbmUgX19IQUxfUkNDX0RGU0RNX0NPTkZJRyBfX0hBTF9SQ0NfREZTRE0xX0NPTkZJRworI2RlZmluZSBfX0hBTF9SQ0NfR0VUX0RGU0RNX1NPVVJDRSBfX0hBTF9SQ0NfR0VUX0RGU0RNMV9TT1VSQ0UKKyNkZWZpbmUgUkNDX0RGU0RNMUNMS1NPVVJDRV9QQ0xLIFJDQ19ERlNETTFDTEtTT1VSQ0VfUENMSzIKKyNkZWZpbmUgUkNDX1NXUE1JMUNMS1NPVVJDRV9QQ0xLIFJDQ19TV1BNSTFDTEtTT1VSQ0VfUENMSzEKKyNpZiAhZGVmaW5lZChTVE0zMlUwKQorI2RlZmluZSBSQ0NfTFBUSU0xQ0xLU09VUkNFX1BDTEsgUkNDX0xQVElNMUNMS1NPVVJDRV9QQ0xLMQorI2RlZmluZSBSQ0NfTFBUSU0yQ0xLU09VUkNFX1BDTEsgUkNDX0xQVElNMkNMS1NPVVJDRV9QQ0xLMQorI2VuZGlmCisKKyNkZWZpbmUgUkNDX0RGU0RNMUFVRElPQ0xLU09VUkNFX0kyU0FQQjEgUkNDX0RGU0RNMUFVRElPQ0xLU09VUkNFX0kyUzEKKyNkZWZpbmUgUkNDX0RGU0RNMUFVRElPQ0xLU09VUkNFX0kyU0FQQjIgUkNDX0RGU0RNMUFVRElPQ0xLU09VUkNFX0kyUzIKKyNkZWZpbmUgUkNDX0RGU0RNMkFVRElPQ0xLU09VUkNFX0kyU0FQQjEgUkNDX0RGU0RNMkFVRElPQ0xLU09VUkNFX0kyUzEKKyNkZWZpbmUgUkNDX0RGU0RNMkFVRElPQ0xLU09VUkNFX0kyU0FQQjIgUkNDX0RGU0RNMkFVRElPQ0xLU09VUkNFX0kyUzIKKyNkZWZpbmUgUkNDX0RGU0RNMUNMS1NPVVJDRV9BUEIyIFJDQ19ERlNETTFDTEtTT1VSQ0VfUENMSzIKKyNkZWZpbmUgUkNDX0RGU0RNMkNMS1NPVVJDRV9BUEIyIFJDQ19ERlNETTJDTEtTT1VSQ0VfUENMSzIKKyNkZWZpbmUgUkNDX0ZNUEkyQzFDTEtTT1VSQ0VfQVBCIFJDQ19GTVBJMkMxQ0xLU09VUkNFX1BDTEsxCisjaWYgZGVmaW5lZChTVE0zMlU1KQorI2RlZmluZSBNU0lLUExMTW9kZVNFTCBSQ0NfTVNJS1BMTF9NT0RFX1NFTAorI2RlZmluZSBNU0lTUExMTW9kZVNFTCBSQ0NfTVNJU1BMTF9NT0RFX1NFTAorI2RlZmluZSBfX0hBTF9SQ0NfQUhCMjFfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0FIQjJfMV9DTEtfRElTQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfQUhCMjJfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0FIQjJfMl9DTEtfRElTQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfQUhCMV9DTEtfRGlzYWJsZV9DbGVhciBfX0hBTF9SQ0NfQUhCMV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19BSEIyMV9DTEtfRGlzYWJsZV9DbGVhciBfX0hBTF9SQ0NfQUhCMl8xX0NMS19FTkFCTEUKKyNkZWZpbmUgX19IQUxfUkNDX0FIQjIyX0NMS19EaXNhYmxlX0NsZWFyIF9fSEFMX1JDQ19BSEIyXzJfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfQUhCM19DTEtfRGlzYWJsZV9DbGVhciBfX0hBTF9SQ0NfQUhCM19DTEtfRU5BQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19BUEIxX0NMS19EaXNhYmxlX0NsZWFyIF9fSEFMX1JDQ19BUEIxX0NMS19FTkFCTEUKKyNkZWZpbmUgX19IQUxfUkNDX0FQQjJfQ0xLX0Rpc2FibGVfQ2xlYXIgX19IQUxfUkNDX0FQQjJfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfQVBCM19DTEtfRGlzYWJsZV9DbGVhciBfX0hBTF9SQ0NfQVBCM19DTEtfRU5BQkxFCisjZGVmaW5lIElTX1JDQ19NU0lQTExNb2RlU2VsZWN0aW9uIElTX1JDQ19NU0lQTExNT0RFX1NFTEVDVAorI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX0NMSzQ4IFJDQ19QRVJJUEhDTEtfSUNMSworI2RlZmluZSBSQ0NfQ0xLNDhDTEtTT1VSQ0VfSFNJNDggUkNDX0lDTEtfQ0xLU09VUkNFX0hTSTQ4CisjZGVmaW5lIFJDQ19DTEs0OENMS1NPVVJDRV9QTEwyIFJDQ19JQ0xLX0NMS1NPVVJDRV9QTEwyCisjZGVmaW5lIFJDQ19DTEs0OENMS1NPVVJDRV9QTEwxIFJDQ19JQ0xLX0NMS1NPVVJDRV9QTEwxCisjZGVmaW5lIFJDQ19DTEs0OENMS1NPVVJDRV9NU0lLIFJDQ19JQ0xLX0NMS1NPVVJDRV9NU0lLCisjZGVmaW5lIF9fSEFMX1JDQ19BREMxX0NMS19FTkFCTEUgX19IQUxfUkNDX0FEQzEyX0NMS19FTkFCTEUKKyNkZWZpbmUgX19IQUxfUkNDX0FEQzFfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0FEQzEyX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19BREMxX0lTX0NMS19FTkFCTEVEIF9fSEFMX1JDQ19BREMxMl9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX0hBTF9SQ0NfQURDMV9JU19DTEtfRElTQUJMRUQgX19IQUxfUkNDX0FEQzEyX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX0hBTF9SQ0NfQURDMV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfQURDMTJfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19IQUxfUkNDX0FEQzFfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfQURDMTJfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0hBTF9SQ0NfQURDMV9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19BREMxMl9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19BREMxX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19BREMxMl9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfR0VUX0NMSzQ4X1NPVVJDRSBfX0hBTF9SQ0NfR0VUX0lDTEtfU09VUkNFCisjZGVmaW5lIF9fSEFMX1JDQ19QTExGUkFDTl9FTkFCTEUgX19IQUxfUkNDX1BMTF9GUkFDTl9FTkFCTEUKKyNkZWZpbmUgX19IQUxfUkNDX1BMTEZSQUNOX0RJU0FCTEUgX19IQUxfUkNDX1BMTF9GUkFDTl9ESVNBQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19QTExGUkFDTl9DT05GSUcgX19IQUxfUkNDX1BMTF9GUkFDTl9DT05GSUcKKyNkZWZpbmUgSVNfUkNDX1BMTEZSQUNOX1ZBTFVFIElTX1JDQ19QTExfRlJBQ05fVkFMVUUKKyNlbmRpZiAvKiBTVE0zMlU1ICovCisKKyNpZiBkZWZpbmVkKFNUTTMySDUpCisjZGVmaW5lIF9fSEFMX1JDQ19QTExGUkFDTl9FTkFCTEUgX19IQUxfUkNDX1BMTF9GUkFDTl9FTkFCTEUKKyNkZWZpbmUgX19IQUxfUkNDX1BMTEZSQUNOX0RJU0FCTEUgX19IQUxfUkNDX1BMTF9GUkFDTl9ESVNBQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19QTExGUkFDTl9DT05GSUcgX19IQUxfUkNDX1BMTF9GUkFDTl9DT05GSUcKKyNkZWZpbmUgSVNfUkNDX1BMTEZSQUNOX1ZBTFVFIElTX1JDQ19QTExfRlJBQ05fVkFMVUUKKworI2RlZmluZSBSQ0NfUExMU09VUkNFX05PTkUgUkNDX1BMTDFfU09VUkNFX05PTkUKKyNkZWZpbmUgUkNDX1BMTFNPVVJDRV9IU0kgUkNDX1BMTDFfU09VUkNFX0hTSQorI2RlZmluZSBSQ0NfUExMU09VUkNFX0NTSSBSQ0NfUExMMV9TT1VSQ0VfQ1NJCisjZGVmaW5lIFJDQ19QTExTT1VSQ0VfSFNFIFJDQ19QTEwxX1NPVVJDRV9IU0UKKyNkZWZpbmUgUkNDX1BMTFZDSVJBTkdFXzAgUkNDX1BMTDFfVkNJUkFOR0VfMAorI2RlZmluZSBSQ0NfUExMVkNJUkFOR0VfMSBSQ0NfUExMMV9WQ0lSQU5HRV8xCisjZGVmaW5lIFJDQ19QTExWQ0lSQU5HRV8yIFJDQ19QTEwxX1ZDSVJBTkdFXzIKKyNkZWZpbmUgUkNDX1BMTFZDSVJBTkdFXzMgUkNDX1BMTDFfVkNJUkFOR0VfMworI2RlZmluZSBSQ0NfUExMMVZDT1dJREUgUkNDX1BMTDFfVkNPUkFOR0VfV0lERQorI2RlZmluZSBSQ0NfUExMMVZDT01FRElVTSBSQ0NfUExMMV9WQ09SQU5HRV9NRURJVU0KKworI2RlZmluZSBJU19SQ0NfUExMU09VUkNFIElTX1JDQ19QTEwxX1NPVVJDRQorI2RlZmluZSBJU19SQ0NfUExMUkdFX1ZBTFVFIElTX1JDQ19QTEwxX1ZDSVJHRV9WQUxVRQorI2RlZmluZSBJU19SQ0NfUExMVkNPUkdFX1ZBTFVFIElTX1JDQ19QTEwxX1ZDT1JHRV9WQUxVRQorI2RlZmluZSBJU19SQ0NfUExMQ0xPQ0tPVVRfVkFMVUUgSVNfUkNDX1BMTDFfQ0xPQ0tPVVRfVkFMVUUKKyNkZWZpbmUgSVNfUkNDX1BMTF9GUkFDTl9WQUxVRSBJU19SQ0NfUExMMV9GUkFDTl9WQUxVRQorI2RlZmluZSBJU19SQ0NfUExMTV9WQUxVRSBJU19SQ0NfUExMMV9ESVZNX1ZBTFVFCisjZGVmaW5lIElTX1JDQ19QTExOX1ZBTFVFIElTX1JDQ19QTEwxX01VTE5fVkFMVUUKKyNkZWZpbmUgSVNfUkNDX1BMTFBfVkFMVUUgSVNfUkNDX1BMTDFfRElWUF9WQUxVRQorI2RlZmluZSBJU19SQ0NfUExMUV9WQUxVRSBJU19SQ0NfUExMMV9ESVZRX1ZBTFVFCisjZGVmaW5lIElTX1JDQ19QTExSX1ZBTFVFIElTX1JDQ19QTEwxX0RJVlJfVkFMVUUKKworI2RlZmluZSBfX0hBTF9SQ0NfUExMX0VOQUJMRSBfX0hBTF9SQ0NfUExMMV9FTkFCTEUKKyNkZWZpbmUgX19IQUxfUkNDX1BMTF9ESVNBQkxFIF9fSEFMX1JDQ19QTEwxX0RJU0FCTEUKKyNkZWZpbmUgX19IQUxfUkNDX1BMTF9GUkFDTl9FTkFCTEUgX19IQUxfUkNDX1BMTDFfRlJBQ05fRU5BQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19QTExfRlJBQ05fRElTQUJMRSBfX0hBTF9SQ0NfUExMMV9GUkFDTl9ESVNBQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19QTExfQ09ORklHIF9fSEFMX1JDQ19QTEwxX0NPTkZJRworI2RlZmluZSBfX0hBTF9SQ0NfUExMX1BMTFNPVVJDRV9DT05GSUcgX19IQUxfUkNDX1BMTDFfUExMU09VUkNFX0NPTkZJRworI2RlZmluZSBfX0hBTF9SQ0NfUExMX0RJVk1fQ09ORklHIF9fSEFMX1JDQ19QTEwxX0RJVk1fQ09ORklHCisjZGVmaW5lIF9fSEFMX1JDQ19QTExfRlJBQ05fQ09ORklHIF9fSEFMX1JDQ19QTEwxX0ZSQUNOX0NPTkZJRworI2RlZmluZSBfX0hBTF9SQ0NfUExMX1ZDSVJBTkdFIF9fSEFMX1JDQ19QTEwxX1ZDSVJBTkdFCisjZGVmaW5lIF9fSEFMX1JDQ19QTExfVkNPUkFOR0UgX19IQUxfUkNDX1BMTDFfVkNPUkFOR0UKKyNkZWZpbmUgX19IQUxfUkNDX0dFVF9QTExfT1NDU09VUkNFIF9fSEFMX1JDQ19HRVRfUExMMV9PU0NTT1VSQ0UKKyNkZWZpbmUgX19IQUxfUkNDX1BMTENMS09VVF9FTkFCTEUgX19IQUxfUkNDX1BMTDFfQ0xLT1VUX0VOQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfUExMQ0xLT1VUX0RJU0FCTEUgX19IQUxfUkNDX1BMTDFfQ0xLT1VUX0RJU0FCTEUKKyNkZWZpbmUgX19IQUxfUkNDX0dFVF9QTExDTEtPVVRfQ09ORklHIF9fSEFMX1JDQ19HRVRfUExMMV9DTEtPVVRfQ09ORklHCisKKyNkZWZpbmUgX19IQUxfUkNDX1BMTDJGUkFDTl9FTkFCTEUgX19IQUxfUkNDX1BMTDJfRlJBQ05fRU5BQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19QTEwyRlJBQ05fRElTQUJMRSBfX0hBTF9SQ0NfUExMMl9GUkFDTl9ESVNBQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19QTEwyQ0xLT1VUX0VOQUJMRSBfX0hBTF9SQ0NfUExMMl9DTEtPVVRfRU5BQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19QTEwyQ0xLT1VUX0RJU0FCTEUgX19IQUxfUkNDX1BMTDJfQ0xLT1VUX0RJU0FCTEUKKyNkZWZpbmUgX19IQUxfUkNDX1BMTDJGUkFDTl9DT05GSUcgX19IQUxfUkNDX1BMTDJfRlJBQ05fQ09ORklHCisjZGVmaW5lIF9fSEFMX1JDQ19HRVRfUExMMkNMS09VVF9DT05GSUcgX19IQUxfUkNDX0dFVF9QTEwyX0NMS09VVF9DT05GSUcKKworI2RlZmluZSBfX0hBTF9SQ0NfUExMM0ZSQUNOX0VOQUJMRSBfX0hBTF9SQ0NfUExMM19GUkFDTl9FTkFCTEUKKyNkZWZpbmUgX19IQUxfUkNDX1BMTDNGUkFDTl9ESVNBQkxFIF9fSEFMX1JDQ19QTEwzX0ZSQUNOX0RJU0FCTEUKKyNkZWZpbmUgX19IQUxfUkNDX1BMTDNDTEtPVVRfRU5BQkxFIF9fSEFMX1JDQ19QTEwzX0NMS09VVF9FTkFCTEUKKyNkZWZpbmUgX19IQUxfUkNDX1BMTDNDTEtPVVRfRElTQUJMRSBfX0hBTF9SQ0NfUExMM19DTEtPVVRfRElTQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfUExMM0ZSQUNOX0NPTkZJRyBfX0hBTF9SQ0NfUExMM19GUkFDTl9DT05GSUcKKyNkZWZpbmUgX19IQUxfUkNDX0dFVF9QTEwzQ0xLT1VUX0NPTkZJRyBfX0hBTF9SQ0NfR0VUX1BMTDNfQ0xLT1VUX0NPTkZJRworCisjZGVmaW5lIFJDQ19QTEwyVkNJUkFOR0VfMCBSQ0NfUExMMl9WQ0lSQU5HRV8wCisjZGVmaW5lIFJDQ19QTEwyVkNJUkFOR0VfMSBSQ0NfUExMMl9WQ0lSQU5HRV8xCisjZGVmaW5lIFJDQ19QTEwyVkNJUkFOR0VfMiBSQ0NfUExMMl9WQ0lSQU5HRV8yCisjZGVmaW5lIFJDQ19QTEwyVkNJUkFOR0VfMyBSQ0NfUExMMl9WQ0lSQU5HRV8zCisKKyNkZWZpbmUgUkNDX1BMTDJWQ09XSURFIFJDQ19QTEwyX1ZDT1JBTkdFX1dJREUKKyNkZWZpbmUgUkNDX1BMTDJWQ09NRURJVU0gUkNDX1BMTDJfVkNPUkFOR0VfTUVESVVNCisKKyNkZWZpbmUgUkNDX1BMTDJTT1VSQ0VfTk9ORSBSQ0NfUExMMl9TT1VSQ0VfTk9ORQorI2RlZmluZSBSQ0NfUExMMlNPVVJDRV9IU0kgUkNDX1BMTDJfU09VUkNFX0hTSQorI2RlZmluZSBSQ0NfUExMMlNPVVJDRV9DU0kgUkNDX1BMTDJfU09VUkNFX0NTSQorI2RlZmluZSBSQ0NfUExMMlNPVVJDRV9IU0UgUkNDX1BMTDJfU09VUkNFX0hTRQorCisjZGVmaW5lIFJDQ19QTEwzVkNJUkFOR0VfMCBSQ0NfUExMM19WQ0lSQU5HRV8wCisjZGVmaW5lIFJDQ19QTEwzVkNJUkFOR0VfMSBSQ0NfUExMM19WQ0lSQU5HRV8xCisjZGVmaW5lIFJDQ19QTEwzVkNJUkFOR0VfMiBSQ0NfUExMM19WQ0lSQU5HRV8yCisjZGVmaW5lIFJDQ19QTEwzVkNJUkFOR0VfMyBSQ0NfUExMM19WQ0lSQU5HRV8zCisKKyNkZWZpbmUgUkNDX1BMTDNWQ09XSURFIFJDQ19QTEwzX1ZDT1JBTkdFX1dJREUKKyNkZWZpbmUgUkNDX1BMTDNWQ09NRURJVU0gUkNDX1BMTDNfVkNPUkFOR0VfTUVESVVNCisKKyNkZWZpbmUgUkNDX1BMTDNTT1VSQ0VfTk9ORSBSQ0NfUExMM19TT1VSQ0VfTk9ORQorI2RlZmluZSBSQ0NfUExMM1NPVVJDRV9IU0kgUkNDX1BMTDNfU09VUkNFX0hTSQorI2RlZmluZSBSQ0NfUExMM1NPVVJDRV9DU0kgUkNDX1BMTDNfU09VUkNFX0NTSQorI2RlZmluZSBSQ0NfUExMM1NPVVJDRV9IU0UgUkNDX1BMTDNfU09VUkNFX0hTRQorCisjZW5kaWYgLyogU1RNMzJINSAqLworCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBIQUxfUk5HX0FsaWFzZWRfTWFjcm9zIEhBTCBSTkcgQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3IKKyAqIGxlZ2FjeSBwdXJwb3NlCisgKiBAeworICovCisjZGVmaW5lIEhBTF9STkdfUmVhZHlDYWxsYmFjayhfX0hBTkRMRV9fKSBcCisgIEhBTF9STkdfUmVhZHlEYXRhQ2FsbGJhY2soKF9fSEFORExFX18pLCB1aW50MzJfdCByYW5kb20zMmJpdCkKKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1JUQ19BbGlhc2VkX01hY3JvcyBIQUwgUlRDIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yCisgKiBsZWdhY3kgcHVycG9zZQorICogQHsKKyAqLworI2lmIGRlZmluZWQoU1RNMzJHMCkgfHwgZGVmaW5lZChTVE0zMkw1KSB8fCBkZWZpbmVkKFNUTTMyTDQxMnh4KSB8fCAgICAgICAgIFwKKyAgICBkZWZpbmVkKFNUTTMyTDQyMnh4KSB8fCBkZWZpbmVkKFNUTTMyTDRQNXh4KSB8fCBkZWZpbmVkKFNUTTMyTDRRNXh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkc0KSB8fCBkZWZpbmVkKFNUTTMyV0wpIHx8IGRlZmluZWQoU1RNMzJVNSkgfHwgICAgICAgICAgICAgXAorICAgIGRlZmluZWQoU1RNMzJXQkEpIHx8IGRlZmluZWQoU1RNMzJINSkgfHwgZGVmaW5lZChTVE0zMkMwKSB8fCAgICAgICAgICAgIFwKKyAgICBkZWZpbmVkKFNUTTMySDdSUykgfHwgZGVmaW5lZChTVE0zMlUwKQorI2Vsc2UKKyNkZWZpbmUgX19IQUxfUlRDX0NMRUFSX0ZMQUcgX19IQUxfUlRDX0VYVElfQ0xFQVJfRkxBRworI2VuZGlmCisjZGVmaW5lIF9fSEFMX1JUQ19ESVNBQkxFX0lUIF9fSEFMX1JUQ19FWFRJX0RJU0FCTEVfSVQKKyNkZWZpbmUgX19IQUxfUlRDX0VOQUJMRV9JVCBfX0hBTF9SVENfRVhUSV9FTkFCTEVfSVQKKworI2lmIGRlZmluZWQoU1RNMzJGMSkKKyNkZWZpbmUgX19IQUxfUlRDX0VYVElfQ0xFQVJfRkxBRyhSVENfRVhUSV9MSU5FX0FMQVJNX0VWRU5UKSBcCisgIF9fSEFMX1JUQ19BTEFSTV9FWFRJX0NMRUFSX0ZMQUcoKQorCisjZGVmaW5lIF9fSEFMX1JUQ19FWFRJX0VOQUJMRV9JVChSVENfRVhUSV9MSU5FX0FMQVJNX0VWRU5UKSBcCisgIF9fSEFMX1JUQ19BTEFSTV9FWFRJX0VOQUJMRV9JVCgpCisKKyNkZWZpbmUgX19IQUxfUlRDX0VYVElfRElTQUJMRV9JVChSVENfRVhUSV9MSU5FX0FMQVJNX0VWRU5UKSBcCisgIF9fSEFMX1JUQ19BTEFSTV9FWFRJX0RJU0FCTEVfSVQoKQorCisjZGVmaW5lIF9fSEFMX1JUQ19FWFRJX0dFVF9GTEFHKFJUQ19FWFRJX0xJTkVfQUxBUk1fRVZFTlQpIFwKKyAgX19IQUxfUlRDX0FMQVJNX0VYVElfR0VUX0ZMQUcoKQorCisjZGVmaW5lIF9fSEFMX1JUQ19FWFRJX0dFTkVSQVRFX1NXSVQoUlRDX0VYVElfTElORV9BTEFSTV9FVkVOVCkgXAorICBfX0hBTF9SVENfQUxBUk1fRVhUSV9HRU5FUkFURV9TV0lUKCkKKyNlbHNlCisjZGVmaW5lIF9fSEFMX1JUQ19FWFRJX0NMRUFSX0ZMQUcoX19FWFRJX0xJTkVfXykgICAgICAgICAgICAgICBcCisgICgoKF9fRVhUSV9MSU5FX18pID09IFJUQ19FWFRJX0xJTkVfQUxBUk1fRVZFTlQpICAgICAgICAgICAgICBcCisgICAgICAgPyBfX0hBTF9SVENfQUxBUk1fRVhUSV9DTEVBUl9GTEFHKCkgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgOiAoKChfX0VYVElfTElORV9fKSA9PSBSVENfRVhUSV9MSU5FX1dBS0VVUFRJTUVSX0VWRU5UKSBcCisgICAgICAgICAgICAgID8gX19IQUxfUlRDX1dBS0VVUFRJTUVSX0VYVElfQ0xFQVJfRkxBRygpICAgICAgICBcCisgICAgICAgICAgICAgIDogX19IQUxfUlRDX1RBTVBFUl9USU1FU1RBTVBfRVhUSV9DTEVBUl9GTEFHKCkpKQorI2RlZmluZSBfX0hBTF9SVENfRVhUSV9FTkFCTEVfSVQoX19FWFRJX0xJTkVfXykgICAgICAgICAgICAgICAgXAorICAoKChfX0VYVElfTElORV9fKSA9PSBSVENfRVhUSV9MSU5FX0FMQVJNX0VWRU5UKSAgICAgICAgICAgICAgXAorICAgICAgID8gX19IQUxfUlRDX0FMQVJNX0VYVElfRU5BQkxFX0lUKCkgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIDogKCgoX19FWFRJX0xJTkVfXykgPT0gUlRDX0VYVElfTElORV9XQUtFVVBUSU1FUl9FVkVOVCkgXAorICAgICAgICAgICAgICA/IF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9FWFRJX0VOQUJMRV9JVCgpICAgICAgICAgXAorICAgICAgICAgICAgICA6IF9fSEFMX1JUQ19UQU1QRVJfVElNRVNUQU1QX0VYVElfRU5BQkxFX0lUKCkpKQorI2RlZmluZSBfX0hBTF9SVENfRVhUSV9ESVNBQkxFX0lUKF9fRVhUSV9MSU5FX18pICAgICAgICAgICAgICAgXAorICAoKChfX0VYVElfTElORV9fKSA9PSBSVENfRVhUSV9MSU5FX0FMQVJNX0VWRU5UKSAgICAgICAgICAgICAgXAorICAgICAgID8gX19IQUxfUlRDX0FMQVJNX0VYVElfRElTQUJMRV9JVCgpICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIDogKCgoX19FWFRJX0xJTkVfXykgPT0gUlRDX0VYVElfTElORV9XQUtFVVBUSU1FUl9FVkVOVCkgXAorICAgICAgICAgICAgICA/IF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9FWFRJX0RJU0FCTEVfSVQoKSAgICAgICAgXAorICAgICAgICAgICAgICA6IF9fSEFMX1JUQ19UQU1QRVJfVElNRVNUQU1QX0VYVElfRElTQUJMRV9JVCgpKSkKKyNkZWZpbmUgX19IQUxfUlRDX0VYVElfR0VUX0ZMQUcoX19FWFRJX0xJTkVfXykgICAgICAgICAgICAgICAgIFwKKyAgKCgoX19FWFRJX0xJTkVfXykgPT0gUlRDX0VYVElfTElORV9BTEFSTV9FVkVOVCkgICAgICAgICAgICAgIFwKKyAgICAgICA/IF9fSEFMX1JUQ19BTEFSTV9FWFRJX0dFVF9GTEFHKCkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICA6ICgoKF9fRVhUSV9MSU5FX18pID09IFJUQ19FWFRJX0xJTkVfV0FLRVVQVElNRVJfRVZFTlQpIFwKKyAgICAgICAgICAgICAgPyBfX0hBTF9SVENfV0FLRVVQVElNRVJfRVhUSV9HRVRfRkxBRygpICAgICAgICAgIFwKKyAgICAgICAgICAgICAgOiBfX0hBTF9SVENfVEFNUEVSX1RJTUVTVEFNUF9FWFRJX0dFVF9GTEFHKCkpKQorI2RlZmluZSBfX0hBTF9SVENfRVhUSV9HRU5FUkFURV9TV0lUKF9fRVhUSV9MSU5FX18pICAgICAgICAgICAgXAorICAoKChfX0VYVElfTElORV9fKSA9PSBSVENfRVhUSV9MSU5FX0FMQVJNX0VWRU5UKSAgICAgICAgICAgICAgXAorICAgICAgID8gX19IQUxfUlRDX0FMQVJNX0VYVElfR0VORVJBVEVfU1dJVCgpICAgICAgICAgICAgICAgICAgXAorICAgICAgIDogKCgoX19FWFRJX0xJTkVfXykgPT0gUlRDX0VYVElfTElORV9XQUtFVVBUSU1FUl9FVkVOVCkgXAorICAgICAgICAgICAgICA/IF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9FWFRJX0dFTkVSQVRFX1NXSVQoKSAgICAgXAorICAgICAgICAgICAgICA6IF9fSEFMX1JUQ19UQU1QRVJfVElNRVNUQU1QX0VYVElfR0VORVJBVEVfU1dJVCgpKSkKKyNlbmRpZiAvKiBTVE0zMkYxICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjApIHx8IGRlZmluZWQoU1RNMzJGMikgfHwgZGVmaW5lZChTVE0zMkYzKSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkY0KSB8fCBkZWZpbmVkKFNUTTMyRjcpIHx8IGRlZmluZWQoU1RNMzJINykgfHwgXAorICAgIGRlZmluZWQoU1RNMzJMMCkgfHwgZGVmaW5lZChTVE0zMkwxKSB8fCBkZWZpbmVkKFNUTTMyV0IpCisjZGVmaW5lIF9fSEFMX1JUQ19UQU1QRVJfR0VUX0lUIF9fSEFMX1JUQ19UQU1QRVJfR0VUX0ZMQUcKKyNlbmRpZgorCisjZGVmaW5lIElTX0FMQVJNIElTX1JUQ19BTEFSTQorI2RlZmluZSBJU19BTEFSTV9NQVNLIElTX1JUQ19BTEFSTV9NQVNLCisjZGVmaW5lIElTX1RBTVBFUiBJU19SVENfVEFNUEVSCisjZGVmaW5lIElTX1RBTVBFUl9FUkFTRV9NT0RFIElTX1JUQ19UQU1QRVJfRVJBU0VfTU9ERQorI2RlZmluZSBJU19UQU1QRVJfRklMVEVSIElTX1JUQ19UQU1QRVJfRklMVEVSCisjZGVmaW5lIElTX1RBTVBFUl9JTlRFUlJVUFQgSVNfUlRDX1RBTVBFUl9JTlRFUlJVUFQKKyNkZWZpbmUgSVNfVEFNUEVSX01BU0tGTEFHX1NUQVRFIElTX1JUQ19UQU1QRVJfTUFTS0ZMQUdfU1RBVEUKKyNkZWZpbmUgSVNfVEFNUEVSX1BSRUNIQVJHRV9EVVJBVElPTiBJU19SVENfVEFNUEVSX1BSRUNIQVJHRV9EVVJBVElPTgorI2RlZmluZSBJU19UQU1QRVJfUFVMTFVQX1NUQVRFIElTX1JUQ19UQU1QRVJfUFVMTFVQX1NUQVRFCisjZGVmaW5lIElTX1RBTVBFUl9TQU1QTElOR19GUkVRIElTX1JUQ19UQU1QRVJfU0FNUExJTkdfRlJFUQorI2RlZmluZSBJU19UQU1QRVJfVElNRVNUQU1QT05UQU1QRVJfREVURUNUSU9OIFwKKyAgSVNfUlRDX1RBTVBFUl9USU1FU1RBTVBPTlRBTVBFUl9ERVRFQ1RJT04KKyNkZWZpbmUgSVNfVEFNUEVSX1RSSUdHRVIgSVNfUlRDX1RBTVBFUl9UUklHR0VSCisjZGVmaW5lIElTX1dBS0VVUF9DTE9DSyBJU19SVENfV0FLRVVQX0NMT0NLCisjZGVmaW5lIElTX1dBS0VVUF9DT1VOVEVSIElTX1JUQ19XQUtFVVBfQ09VTlRFUgorCisjZGVmaW5lIF9fUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUKKyNkZWZpbmUgX19SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFCisKKyNpZiBkZWZpbmVkKFNUTTMySDUpCisjZGVmaW5lIF9fSEFMX1JDQ19SVENBUEJfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfUlRDX0NMS19FTkFCTEUKKyNkZWZpbmUgX19IQUxfUkNDX1JUQ0FQQl9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfUlRDX0NMS19ESVNBQkxFCisjZW5kaWYgLyogU1RNMzJINSAqLworCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBIQUxfU0RfQWxpYXNlZF9NYWNyb3MgSEFMIFNEL01NQyBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvcgorICogbGVnYWN5IHB1cnBvc2UKKyAqIEB7CisgKi8KKworI2RlZmluZSBTRF9PQ1JfQ0lEX0NTRF9PVkVSV1JJRVRFIFNEX09DUl9DSURfQ1NEX09WRVJXUklURQorI2RlZmluZSBTRF9DTURfU0RfQVBQX1NUQVVTIFNEX0NNRF9TRF9BUFBfU1RBVFVTCisKKyNpZiAhZGVmaW5lZChTVE0zMkYxKSAmJiAhZGVmaW5lZChTVE0zMkYyKSAmJiAhZGVmaW5lZChTVE0zMkY0KSAmJiBcCisgICAgIWRlZmluZWQoU1RNMzJMMSkKKyNkZWZpbmUgZU1NQ19ISUdIX1ZPTFRBR0VfUkFOR0UgRU1NQ19ISUdIX1ZPTFRBR0VfUkFOR0UKKyNkZWZpbmUgZU1NQ19EVUFMX1ZPTFRBR0VfUkFOR0UgRU1NQ19EVUFMX1ZPTFRBR0VfUkFOR0UKKyNkZWZpbmUgZU1NQ19MT1dfVk9MVEFHRV9SQU5HRSBFTU1DX0xPV19WT0xUQUdFX1JBTkdFCisKKyNkZWZpbmUgU0RNTUNfTlNwZWVkX0NMS19ESVYgU0RNTUNfTlNQRUVEX0NMS19ESVYKKyNkZWZpbmUgU0RNTUNfSFNwZWVkX0NMS19ESVYgU0RNTUNfSFNQRUVEX0NMS19ESVYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChTVE0zMkY0KSB8fCBkZWZpbmVkKFNUTTMyRjIpCisjZGVmaW5lIFNEX1NETU1DX0RJU0FCTEVEIFNEX1NESU9fRElTQUJMRUQKKyNkZWZpbmUgU0RfU0RNTUNfRlVOQ1RJT05fQlVTWSBTRF9TRElPX0ZVTkNUSU9OX0JVU1kKKyNkZWZpbmUgU0RfU0RNTUNfRlVOQ1RJT05fRkFJTEVEIFNEX1NESU9fRlVOQ1RJT05fRkFJTEVECisjZGVmaW5lIFNEX1NETU1DX1VOS05PV05fRlVOQ1RJT04gU0RfU0RJT19VTktOT1dOX0ZVTkNUSU9OCisjZGVmaW5lIFNEX0NNRF9TRE1NQ19TRU5fT1BfQ09ORCBTRF9DTURfU0RJT19TRU5fT1BfQ09ORAorI2RlZmluZSBTRF9DTURfU0RNTUNfUldfRElSRUNUIFNEX0NNRF9TRElPX1JXX0RJUkVDVAorI2RlZmluZSBTRF9DTURfU0RNTUNfUldfRVhURU5ERUQgU0RfQ01EX1NESU9fUldfRVhURU5ERUQKKyNkZWZpbmUgX19IQUxfU0RfU0RNTUNfRU5BQkxFIF9fSEFMX1NEX1NESU9fRU5BQkxFCisjZGVmaW5lIF9fSEFMX1NEX1NETU1DX0RJU0FCTEUgX19IQUxfU0RfU0RJT19ESVNBQkxFCisjZGVmaW5lIF9fSEFMX1NEX1NETU1DX0RNQV9FTkFCTEUgX19IQUxfU0RfU0RJT19ETUFfRU5BQkxFCisjZGVmaW5lIF9fSEFMX1NEX1NETU1DX0RNQV9ESVNBQkxFIF9fSEFMX1NEX1NESU9fRE1BX0RJU0FCTAorI2RlZmluZSBfX0hBTF9TRF9TRE1NQ19FTkFCTEVfSVQgX19IQUxfU0RfU0RJT19FTkFCTEVfSVQKKyNkZWZpbmUgX19IQUxfU0RfU0RNTUNfRElTQUJMRV9JVCBfX0hBTF9TRF9TRElPX0RJU0FCTEVfSVQKKyNkZWZpbmUgX19IQUxfU0RfU0RNTUNfR0VUX0ZMQUcgX19IQUxfU0RfU0RJT19HRVRfRkxBRworI2RlZmluZSBfX0hBTF9TRF9TRE1NQ19DTEVBUl9GTEFHIF9fSEFMX1NEX1NESU9fQ0xFQVJfRkxBRworI2RlZmluZSBfX0hBTF9TRF9TRE1NQ19HRVRfSVQgX19IQUxfU0RfU0RJT19HRVRfSVQKKyNkZWZpbmUgX19IQUxfU0RfU0RNTUNfQ0xFQVJfSVQgX19IQUxfU0RfU0RJT19DTEVBUl9JVAorI2RlZmluZSBTRE1NQ19TVEFUSUNfRkxBR1MgU0RJT19TVEFUSUNfRkxBR1MKKyNkZWZpbmUgU0RNTUNfQ01EMFRJTUVPVVQgU0RJT19DTUQwVElNRU9VVAorI2RlZmluZSBTRF9TRE1NQ19TRU5EX0lGX0NPTkQgU0RfU0RJT19TRU5EX0lGX0NPTkQKKy8qIGFsaWFzIENNU0lTICovCisjZGVmaW5lIFNETU1DMV9JUlFuIFNESU9fSVJRbgorI2RlZmluZSBTRE1NQzFfSVJRSGFuZGxlciBTRElPX0lSUUhhbmRsZXIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChTVE0zMkY3KSB8fCBkZWZpbmVkKFNUTTMyTDQpCisjZGVmaW5lIFNEX1NESU9fRElTQUJMRUQgU0RfU0RNTUNfRElTQUJMRUQKKyNkZWZpbmUgU0RfU0RJT19GVU5DVElPTl9CVVNZIFNEX1NETU1DX0ZVTkNUSU9OX0JVU1kKKyNkZWZpbmUgU0RfU0RJT19GVU5DVElPTl9GQUlMRUQgU0RfU0RNTUNfRlVOQ1RJT05fRkFJTEVECisjZGVmaW5lIFNEX1NESU9fVU5LTk9XTl9GVU5DVElPTiBTRF9TRE1NQ19VTktOT1dOX0ZVTkNUSU9OCisjZGVmaW5lIFNEX0NNRF9TRElPX1NFTl9PUF9DT05EIFNEX0NNRF9TRE1NQ19TRU5fT1BfQ09ORAorI2RlZmluZSBTRF9DTURfU0RJT19SV19ESVJFQ1QgU0RfQ01EX1NETU1DX1JXX0RJUkVDVAorI2RlZmluZSBTRF9DTURfU0RJT19SV19FWFRFTkRFRCBTRF9DTURfU0RNTUNfUldfRVhURU5ERUQKKyNkZWZpbmUgX19IQUxfU0RfU0RJT19FTkFCTEUgX19IQUxfU0RfU0RNTUNfRU5BQkxFCisjZGVmaW5lIF9fSEFMX1NEX1NESU9fRElTQUJMRSBfX0hBTF9TRF9TRE1NQ19ESVNBQkxFCisjZGVmaW5lIF9fSEFMX1NEX1NESU9fRE1BX0VOQUJMRSBfX0hBTF9TRF9TRE1NQ19ETUFfRU5BQkxFCisjZGVmaW5lIF9fSEFMX1NEX1NESU9fRE1BX0RJU0FCTCBfX0hBTF9TRF9TRE1NQ19ETUFfRElTQUJMRQorI2RlZmluZSBfX0hBTF9TRF9TRElPX0VOQUJMRV9JVCBfX0hBTF9TRF9TRE1NQ19FTkFCTEVfSVQKKyNkZWZpbmUgX19IQUxfU0RfU0RJT19ESVNBQkxFX0lUIF9fSEFMX1NEX1NETU1DX0RJU0FCTEVfSVQKKyNkZWZpbmUgX19IQUxfU0RfU0RJT19HRVRfRkxBRyBfX0hBTF9TRF9TRE1NQ19HRVRfRkxBRworI2RlZmluZSBfX0hBTF9TRF9TRElPX0NMRUFSX0ZMQUcgX19IQUxfU0RfU0RNTUNfQ0xFQVJfRkxBRworI2RlZmluZSBfX0hBTF9TRF9TRElPX0dFVF9JVCBfX0hBTF9TRF9TRE1NQ19HRVRfSVQKKyNkZWZpbmUgX19IQUxfU0RfU0RJT19DTEVBUl9JVCBfX0hBTF9TRF9TRE1NQ19DTEVBUl9JVAorI2RlZmluZSBTRElPX1NUQVRJQ19GTEFHUyBTRE1NQ19TVEFUSUNfRkxBR1MKKyNkZWZpbmUgU0RJT19DTUQwVElNRU9VVCBTRE1NQ19DTUQwVElNRU9VVAorI2RlZmluZSBTRF9TRElPX1NFTkRfSUZfQ09ORCBTRF9TRE1NQ19TRU5EX0lGX0NPTkQKKy8qIGFsaWFzIENNU0lTIGZvciBjb21wYXRpYmlsaXRpZXMgKi8KKyNkZWZpbmUgU0RJT19JUlFuIFNETU1DMV9JUlFuCisjZGVmaW5lIFNESU9fSVJRSGFuZGxlciBTRE1NQzFfSVJRSGFuZGxlcgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFNUTTMyRjcpIHx8IGRlZmluZWQoU1RNMzJGNCkgfHwgZGVmaW5lZChTVE0zMkYyKSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkw0KSB8fCBkZWZpbmVkKFNUTTMySDcpCisjZGVmaW5lIEhBTF9TRF9DYXJkQ0lEVHlwZWRlZiBIQUxfU0RfQ2FyZENJRFR5cGVEZWYKKyNkZWZpbmUgSEFMX1NEX0NhcmRDU0RUeXBlZGVmIEhBTF9TRF9DYXJkQ1NEVHlwZURlZgorI2RlZmluZSBIQUxfU0RfQ2FyZFN0YXR1c1R5cGVkZWYgSEFMX1NEX0NhcmRTdGF0dXNUeXBlRGVmCisjZGVmaW5lIEhBTF9TRF9DYXJkU3RhdGVUeXBlZGVmIEhBTF9TRF9DYXJkU3RhdGVUeXBlRGVmCisjZW5kaWYKKworI2lmIGRlZmluZWQoU1RNMzJINykgfHwgZGVmaW5lZChTVE0zMkw1KQorI2RlZmluZSBIQUxfTU1DRXhfUmVhZF9ETUFEb3VibGVCdWZmZXIwQ3BsdENhbGxiYWNrIFwKKyAgSEFMX01NQ0V4X1JlYWRfRE1BRG91YmxlQnVmMENwbHRDYWxsYmFjaworI2RlZmluZSBIQUxfTU1DRXhfUmVhZF9ETUFEb3VibGVCdWZmZXIxQ3BsdENhbGxiYWNrIFwKKyAgSEFMX01NQ0V4X1JlYWRfRE1BRG91YmxlQnVmMUNwbHRDYWxsYmFjaworI2RlZmluZSBIQUxfTU1DRXhfV3JpdGVfRE1BRG91YmxlQnVmZmVyMENwbHRDYWxsYmFjayBcCisgIEhBTF9NTUNFeF9Xcml0ZV9ETUFEb3VibGVCdWYwQ3BsdENhbGxiYWNrCisjZGVmaW5lIEhBTF9NTUNFeF9Xcml0ZV9ETUFEb3VibGVCdWZmZXIxQ3BsdENhbGxiYWNrIFwKKyAgSEFMX01NQ0V4X1dyaXRlX0RNQURvdWJsZUJ1ZjFDcGx0Q2FsbGJhY2sKKyNkZWZpbmUgSEFMX1NERXhfUmVhZF9ETUFEb3VibGVCdWZmZXIwQ3BsdENhbGxiYWNrIFwKKyAgSEFMX1NERXhfUmVhZF9ETUFEb3VibGVCdWYwQ3BsdENhbGxiYWNrCisjZGVmaW5lIEhBTF9TREV4X1JlYWRfRE1BRG91YmxlQnVmZmVyMUNwbHRDYWxsYmFjayBcCisgIEhBTF9TREV4X1JlYWRfRE1BRG91YmxlQnVmMUNwbHRDYWxsYmFjaworI2RlZmluZSBIQUxfU0RFeF9Xcml0ZV9ETUFEb3VibGVCdWZmZXIwQ3BsdENhbGxiYWNrIFwKKyAgSEFMX1NERXhfV3JpdGVfRE1BRG91YmxlQnVmMENwbHRDYWxsYmFjaworI2RlZmluZSBIQUxfU0RFeF9Xcml0ZV9ETUFEb3VibGVCdWZmZXIxQ3BsdENhbGxiYWNrIFwKKyAgSEFMX1NERXhfV3JpdGVfRE1BRG91YmxlQnVmMUNwbHRDYWxsYmFjaworI2RlZmluZSBIQUxfU0RfRHJpdmVUcmFuc2NpdmVyXzFfOFZfQ2FsbGJhY2sgXAorICBIQUxfU0RfRHJpdmVUcmFuc2NlaXZlcl8xXzhWX0NhbGxiYWNrCisjZW5kaWYKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEhBTF9TTUFSVENBUkRfQWxpYXNlZF9NYWNyb3MgSEFMIFNNQVJUQ0FSRCBBbGlhc2VkIE1hY3JvcworICogbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAqIEB7CisgKi8KKworI2RlZmluZSBfX1NNQVJUQ0FSRF9FTkFCTEVfSVQgX19IQUxfU01BUlRDQVJEX0VOQUJMRV9JVAorI2RlZmluZSBfX1NNQVJUQ0FSRF9ESVNBQkxFX0lUIF9fSEFMX1NNQVJUQ0FSRF9ESVNBQkxFX0lUCisjZGVmaW5lIF9fU01BUlRDQVJEX0VOQUJMRSBfX0hBTF9TTUFSVENBUkRfRU5BQkxFCisjZGVmaW5lIF9fU01BUlRDQVJEX0RJU0FCTEUgX19IQUxfU01BUlRDQVJEX0RJU0FCTEUKKyNkZWZpbmUgX19TTUFSVENBUkRfRE1BX1JFUVVFU1RfRU5BQkxFIF9fSEFMX1NNQVJUQ0FSRF9ETUFfUkVRVUVTVF9FTkFCTEUKKyNkZWZpbmUgX19TTUFSVENBUkRfRE1BX1JFUVVFU1RfRElTQUJMRSBfX0hBTF9TTUFSVENBUkRfRE1BX1JFUVVFU1RfRElTQUJMRQorCisjZGVmaW5lIF9fSEFMX1NNQVJUQ0FSRF9HRVRDTE9DS1NPVVJDRSBTTUFSVENBUkRfR0VUQ0xPQ0tTT1VSQ0UKKyNkZWZpbmUgX19TTUFSVENBUkRfR0VUQ0xPQ0tTT1VSQ0UgU01BUlRDQVJEX0dFVENMT0NLU09VUkNFCisKKyNkZWZpbmUgSVNfU01BUlRDQVJEX09ORUJJVF9TQU1QTElORyBJU19TTUFSVENBUkRfT05FX0JJVF9TQU1QTEUKKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1NNQlVTX0FsaWFzZWRfTWFjcm9zIEhBTCBTTUJVUyBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvcgorICogbGVnYWN5IHB1cnBvc2UKKyAqIEB7CisgKi8KKyNkZWZpbmUgX19IQUxfU01CVVNfUkVTRVRfQ1IxIFNNQlVTX1JFU0VUX0NSMQorI2RlZmluZSBfX0hBTF9TTUJVU19SRVNFVF9DUjIgU01CVVNfUkVTRVRfQ1IyCisjZGVmaW5lIF9fSEFMX1NNQlVTX0dFTkVSQVRFX1NUQVJUIFNNQlVTX0dFTkVSQVRFX1NUQVJUCisjZGVmaW5lIF9fSEFMX1NNQlVTX0dFVF9BRERSX01BVENIIFNNQlVTX0dFVF9BRERSX01BVENICisjZGVmaW5lIF9fSEFMX1NNQlVTX0dFVF9ESVIgU01CVVNfR0VUX0RJUgorI2RlZmluZSBfX0hBTF9TTUJVU19HRVRfU1RPUF9NT0RFIFNNQlVTX0dFVF9TVE9QX01PREUKKyNkZWZpbmUgX19IQUxfU01CVVNfR0VUX1BFQ19NT0RFIFNNQlVTX0dFVF9QRUNfTU9ERQorI2RlZmluZSBfX0hBTF9TTUJVU19HRVRfQUxFUlRfRU5BQkxFRCBTTUJVU19HRVRfQUxFUlRfRU5BQkxFRAorLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1NQSV9BbGlhc2VkX01hY3JvcyBIQUwgU1BJIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yCisgKiBsZWdhY3kgcHVycG9zZQorICogQHsKKyAqLworCisjZGVmaW5lIF9fSEFMX1NQSV8xTElORV9UWCBTUElfMUxJTkVfVFgKKyNkZWZpbmUgX19IQUxfU1BJXzFMSU5FX1JYIFNQSV8xTElORV9SWAorI2RlZmluZSBfX0hBTF9TUElfUkVTRVRfQ1JDIFNQSV9SRVNFVF9DUkMKKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1VBUlRfQWxpYXNlZF9NYWNyb3MgSEFMIFVBUlQgQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3IKKyAqIGxlZ2FjeSBwdXJwb3NlCisgKiBAeworICovCisKKyNkZWZpbmUgX19IQUxfVUFSVF9HRVRDTE9DS1NPVVJDRSBVQVJUX0dFVENMT0NLU09VUkNFCisjZGVmaW5lIF9fSEFMX1VBUlRfTUFTS19DT01QVVRBVElPTiBVQVJUX01BU0tfQ09NUFVUQVRJT04KKyNkZWZpbmUgX19VQVJUX0dFVENMT0NLU09VUkNFIFVBUlRfR0VUQ0xPQ0tTT1VSQ0UKKyNkZWZpbmUgX19VQVJUX01BU0tfQ09NUFVUQVRJT04gVUFSVF9NQVNLX0NPTVBVVEFUSU9OCisKKyNkZWZpbmUgSVNfVUFSVF9XQUtFVVBNRVRIT0RFIElTX1VBUlRfV0FLRVVQTUVUSE9ECisKKyNkZWZpbmUgSVNfVUFSVF9PTkVCSVRfU0FNUExFIElTX1VBUlRfT05FX0JJVF9TQU1QTEUKKyNkZWZpbmUgSVNfVUFSVF9PTkVCSVRfU0FNUExJTkcgSVNfVUFSVF9PTkVfQklUX1NBTVBMRQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBIQUxfVVNBUlRfQWxpYXNlZF9NYWNyb3MgSEFMIFVTQVJUIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yCisgKiBsZWdhY3kgcHVycG9zZQorICogQHsKKyAqLworCisjZGVmaW5lIF9fVVNBUlRfRU5BQkxFX0lUIF9fSEFMX1VTQVJUX0VOQUJMRV9JVAorI2RlZmluZSBfX1VTQVJUX0RJU0FCTEVfSVQgX19IQUxfVVNBUlRfRElTQUJMRV9JVAorI2RlZmluZSBfX1VTQVJUX0VOQUJMRSBfX0hBTF9VU0FSVF9FTkFCTEUKKyNkZWZpbmUgX19VU0FSVF9ESVNBQkxFIF9fSEFMX1VTQVJUX0RJU0FCTEUKKworI2RlZmluZSBfX0hBTF9VU0FSVF9HRVRDTE9DS1NPVVJDRSBVU0FSVF9HRVRDTE9DS1NPVVJDRQorI2RlZmluZSBfX1VTQVJUX0dFVENMT0NLU09VUkNFIFVTQVJUX0dFVENMT0NLU09VUkNFCisKKyNpZiBkZWZpbmVkKFNUTTMyRjApIHx8IGRlZmluZWQoU1RNMzJGMykgfHwgZGVmaW5lZChTVE0zMkY3KQorI2RlZmluZSBVU0FSVF9PVkVSU0FNUExJTkdfMTYgMHgwMDAwMDAwMFUKKyNkZWZpbmUgVVNBUlRfT1ZFUlNBTVBMSU5HXzggVVNBUlRfQ1IxX09WRVI4CisKKyNkZWZpbmUgSVNfVVNBUlRfT1ZFUlNBTVBMSU5HKF9fU0FNUExJTkdfXykgICAgIFwKKyAgKCgoX19TQU1QTElOR19fKSA9PSBVU0FSVF9PVkVSU0FNUExJTkdfMTYpIHx8IFwKKyAgICgoX19TQU1QTElOR19fKSA9PSBVU0FSVF9PVkVSU0FNUExJTkdfOCkpCisjZW5kaWYgLyogU1RNMzJGMCB8fCBTVE0zMkYzIHx8IFNUTTMyRjcgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEhBTF9VU0JfQWxpYXNlZF9NYWNyb3MgSEFMIFVTQiBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvcgorICogbGVnYWN5IHB1cnBvc2UKKyAqIEB7CisgKi8KKyNkZWZpbmUgVVNCX0VYVElfTElORV9XQUtFVVAgVVNCX1dBS0VVUF9FWFRJX0xJTkUKKworI2RlZmluZSBVU0JfRlNfRVhUSV9UUklHR0VSX1JJU0lOR19FREdFIFVTQl9PVEdfRlNfV0FLRVVQX0VYVElfUklTSU5HX0VER0UKKyNkZWZpbmUgVVNCX0ZTX0VYVElfVFJJR0dFUl9GQUxMSU5HX0VER0UgVVNCX09UR19GU19XQUtFVVBfRVhUSV9GQUxMSU5HX0VER0UKKyNkZWZpbmUgVVNCX0ZTX0VYVElfVFJJR0dFUl9CT1RIX0VER0UgVVNCX09UR19GU19XQUtFVVBfRVhUSV9SSVNJTkdfRkFMTElOR19FREdFCisjZGVmaW5lIFVTQl9GU19FWFRJX0xJTkVfV0FLRVVQIFVTQl9PVEdfRlNfV0FLRVVQX0VYVElfTElORQorCisjZGVmaW5lIFVTQl9IU19FWFRJX1RSSUdHRVJfUklTSU5HX0VER0UgVVNCX09UR19IU19XQUtFVVBfRVhUSV9SSVNJTkdfRURHRQorI2RlZmluZSBVU0JfSFNfRVhUSV9UUklHR0VSX0ZBTExJTkdfRURHRSBVU0JfT1RHX0hTX1dBS0VVUF9FWFRJX0ZBTExJTkdfRURHRQorI2RlZmluZSBVU0JfSFNfRVhUSV9UUklHR0VSX0JPVEhfRURHRSBVU0JfT1RHX0hTX1dBS0VVUF9FWFRJX1JJU0lOR19GQUxMSU5HX0VER0UKKyNkZWZpbmUgVVNCX0hTX0VYVElfTElORV9XQUtFVVAgVVNCX09UR19IU19XQUtFVVBfRVhUSV9MSU5FCisKKyNkZWZpbmUgX19IQUxfVVNCX0VYVElfRU5BQkxFX0lUIF9fSEFMX1VTQl9XQUtFVVBfRVhUSV9FTkFCTEVfSVQKKyNkZWZpbmUgX19IQUxfVVNCX0VYVElfRElTQUJMRV9JVCBfX0hBTF9VU0JfV0FLRVVQX0VYVElfRElTQUJMRV9JVAorI2RlZmluZSBfX0hBTF9VU0JfRVhUSV9HRVRfRkxBRyBfX0hBTF9VU0JfV0FLRVVQX0VYVElfR0VUX0ZMQUcKKyNkZWZpbmUgX19IQUxfVVNCX0VYVElfQ0xFQVJfRkxBRyBfX0hBTF9VU0JfV0FLRVVQX0VYVElfQ0xFQVJfRkxBRworI2RlZmluZSBfX0hBTF9VU0JfRVhUSV9TRVRfUklTSU5HX0VER0VfVFJJR0dFUiBcCisgIF9fSEFMX1VTQl9XQUtFVVBfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UKKyNkZWZpbmUgX19IQUxfVVNCX0VYVElfU0VUX0ZBTExJTkdfRURHRV9UUklHR0VSIFwKKyAgX19IQUxfVVNCX1dBS0VVUF9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UKKyNkZWZpbmUgX19IQUxfVVNCX0VYVElfU0VUX0ZBTExJTkdSSVNJTkdfVFJJR0dFUiBcCisgIF9fSEFMX1VTQl9XQUtFVVBfRVhUSV9FTkFCTEVfUklTSU5HX0ZBTExJTkdfRURHRQorCisjZGVmaW5lIF9fSEFMX1VTQl9GU19FWFRJX0VOQUJMRV9JVCBfX0hBTF9VU0JfT1RHX0ZTX1dBS0VVUF9FWFRJX0VOQUJMRV9JVAorI2RlZmluZSBfX0hBTF9VU0JfRlNfRVhUSV9ESVNBQkxFX0lUIF9fSEFMX1VTQl9PVEdfRlNfV0FLRVVQX0VYVElfRElTQUJMRV9JVAorI2RlZmluZSBfX0hBTF9VU0JfRlNfRVhUSV9HRVRfRkxBRyBfX0hBTF9VU0JfT1RHX0ZTX1dBS0VVUF9FWFRJX0dFVF9GTEFHCisjZGVmaW5lIF9fSEFMX1VTQl9GU19FWFRJX0NMRUFSX0ZMQUcgX19IQUxfVVNCX09UR19GU19XQUtFVVBfRVhUSV9DTEVBUl9GTEFHCisjZGVmaW5lIF9fSEFMX1VTQl9GU19FWFRJX1NFVF9SSVNJTkdfRUdERV9UUklHR0VSIFwKKyAgX19IQUxfVVNCX09UR19GU19XQUtFVVBfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UKKyNkZWZpbmUgX19IQUxfVVNCX0ZTX0VYVElfU0VUX0ZBTExJTkdfRUdERV9UUklHR0VSIFwKKyAgX19IQUxfVVNCX09UR19GU19XQUtFVVBfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFCisjZGVmaW5lIF9fSEFMX1VTQl9GU19FWFRJX1NFVF9GQUxMSU5HUklTSU5HX1RSSUdHRVIgXAorICBfX0hBTF9VU0JfT1RHX0ZTX1dBS0VVUF9FWFRJX0VOQUJMRV9SSVNJTkdfRkFMTElOR19FREdFCisjZGVmaW5lIF9fSEFMX1VTQl9GU19FWFRJX0dFTkVSQVRFX1NXSVQgXAorICBfX0hBTF9VU0JfT1RHX0ZTX1dBS0VVUF9FWFRJX0dFTkVSQVRFX1NXSVQKKworI2RlZmluZSBfX0hBTF9VU0JfSFNfRVhUSV9FTkFCTEVfSVQgX19IQUxfVVNCX09UR19IU19XQUtFVVBfRVhUSV9FTkFCTEVfSVQKKyNkZWZpbmUgX19IQUxfVVNCX0hTX0VYVElfRElTQUJMRV9JVCBfX0hBTF9VU0JfT1RHX0hTX1dBS0VVUF9FWFRJX0RJU0FCTEVfSVQKKyNkZWZpbmUgX19IQUxfVVNCX0hTX0VYVElfR0VUX0ZMQUcgX19IQUxfVVNCX09UR19IU19XQUtFVVBfRVhUSV9HRVRfRkxBRworI2RlZmluZSBfX0hBTF9VU0JfSFNfRVhUSV9DTEVBUl9GTEFHIF9fSEFMX1VTQl9PVEdfSFNfV0FLRVVQX0VYVElfQ0xFQVJfRkxBRworI2RlZmluZSBfX0hBTF9VU0JfSFNfRVhUSV9TRVRfUklTSU5HX0VHREVfVFJJR0dFUiBcCisgIF9fSEFMX1VTQl9PVEdfSFNfV0FLRVVQX0VYVElfRU5BQkxFX1JJU0lOR19FREdFCisjZGVmaW5lIF9fSEFMX1VTQl9IU19FWFRJX1NFVF9GQUxMSU5HX0VHREVfVFJJR0dFUiBcCisgIF9fSEFMX1VTQl9PVEdfSFNfV0FLRVVQX0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRQorI2RlZmluZSBfX0hBTF9VU0JfSFNfRVhUSV9TRVRfRkFMTElOR1JJU0lOR19UUklHR0VSIFwKKyAgX19IQUxfVVNCX09UR19IU19XQUtFVVBfRVhUSV9FTkFCTEVfUklTSU5HX0ZBTExJTkdfRURHRQorI2RlZmluZSBfX0hBTF9VU0JfSFNfRVhUSV9HRU5FUkFURV9TV0lUIFwKKyAgX19IQUxfVVNCX09UR19IU19XQUtFVVBfRVhUSV9HRU5FUkFURV9TV0lUCisKKyNkZWZpbmUgSEFMX1BDRF9BY3RpdmVSZW1vdGVXYWtldXAgSEFMX1BDRF9BY3RpdmF0ZVJlbW90ZVdha2V1cAorI2RlZmluZSBIQUxfUENEX0RlQWN0aXZlUmVtb3RlV2FrZXVwIEhBTF9QQ0RfRGVBY3RpdmF0ZVJlbW90ZVdha2V1cAorCisjZGVmaW5lIEhBTF9QQ0RfU2V0VHhGaUZvIEhBTF9QQ0RFeF9TZXRUeEZpRm8KKyNkZWZpbmUgSEFMX1BDRF9TZXRSeEZpRm8gSEFMX1BDREV4X1NldFJ4RmlGbworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1RJTV9BbGlhc2VkX01hY3JvcyBIQUwgVElNIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yCisgKiBsZWdhY3kgcHVycG9zZQorICogQHsKKyAqLworI2RlZmluZSBfX0hBTF9USU1fU2V0SUNQcmVzY2FsZXJWYWx1ZSBUSU1fU0VUX0lDUFJFU0NBTEVSVkFMVUUKKyNkZWZpbmUgX19IQUxfVElNX1Jlc2V0SUNQcmVzY2FsZXJWYWx1ZSBUSU1fUkVTRVRfSUNQUkVTQ0FMRVJWQUxVRQorCisjZGVmaW5lIFRJTV9HRVRfSVRTVEFUVVMgX19IQUxfVElNX0dFVF9JVF9TT1VSQ0UKKyNkZWZpbmUgVElNX0dFVF9DTEVBUl9JVCBfX0hBTF9USU1fQ0xFQVJfSVQKKworI2RlZmluZSBfX0hBTF9USU1fR0VUX0lUU1RBVFVTIF9fSEFMX1RJTV9HRVRfSVRfU09VUkNFCisKKyNkZWZpbmUgX19IQUxfVElNX0RJUkVDVElPTl9TVEFUVVMgX19IQUxfVElNX0lTX1RJTV9DT1VOVElOR19ET1dOCisjZGVmaW5lIF9fSEFMX1RJTV9QUkVTQ0FMRVIgX19IQUxfVElNX1NFVF9QUkVTQ0FMRVIKKyNkZWZpbmUgX19IQUxfVElNX1NldENvdW50ZXIgX19IQUxfVElNX1NFVF9DT1VOVEVSCisjZGVmaW5lIF9fSEFMX1RJTV9HZXRDb3VudGVyIF9fSEFMX1RJTV9HRVRfQ09VTlRFUgorI2RlZmluZSBfX0hBTF9USU1fU2V0QXV0b3JlbG9hZCBfX0hBTF9USU1fU0VUX0FVVE9SRUxPQUQKKyNkZWZpbmUgX19IQUxfVElNX0dldEF1dG9yZWxvYWQgX19IQUxfVElNX0dFVF9BVVRPUkVMT0FECisjZGVmaW5lIF9fSEFMX1RJTV9TZXRDbG9ja0RpdmlzaW9uIF9fSEFMX1RJTV9TRVRfQ0xPQ0tESVZJU0lPTgorI2RlZmluZSBfX0hBTF9USU1fR2V0Q2xvY2tEaXZpc2lvbiBfX0hBTF9USU1fR0VUX0NMT0NLRElWSVNJT04KKyNkZWZpbmUgX19IQUxfVElNX1NldElDUHJlc2NhbGVyIF9fSEFMX1RJTV9TRVRfSUNQUkVTQ0FMRVIKKyNkZWZpbmUgX19IQUxfVElNX0dldElDUHJlc2NhbGVyIF9fSEFMX1RJTV9HRVRfSUNQUkVTQ0FMRVIKKyNkZWZpbmUgX19IQUxfVElNX1NldENvbXBhcmUgX19IQUxfVElNX1NFVF9DT01QQVJFCisjZGVmaW5lIF9fSEFMX1RJTV9HZXRDb21wYXJlIF9fSEFMX1RJTV9HRVRfQ09NUEFSRQorCisjZGVmaW5lIFRJTV9CUkVBS0lOUFVUU09VUkNFX0RGU0RNIFRJTV9CUkVBS0lOUFVUU09VUkNFX0RGU0RNMQorCisjZGVmaW5lIFRJTV9PQ01PREVfQVNTWU1FVFJJQ19QV00xIFRJTV9PQ01PREVfQVNZTU1FVFJJQ19QV00xCisjZGVmaW5lIFRJTV9PQ01PREVfQVNTWU1FVFJJQ19QV00yIFRJTV9PQ01PREVfQVNZTU1FVFJJQ19QV00yCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBIQUxfRVRIX0FsaWFzZWRfTWFjcm9zIEhBTCBFVEggQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3IKKyAqIGxlZ2FjeSBwdXJwb3NlCisgKiBAeworICovCisKKyNkZWZpbmUgX19IQUxfRVRIX0VYVElfRU5BQkxFX0lUIF9fSEFMX0VUSF9XQUtFVVBfRVhUSV9FTkFCTEVfSVQKKyNkZWZpbmUgX19IQUxfRVRIX0VYVElfRElTQUJMRV9JVCBfX0hBTF9FVEhfV0FLRVVQX0VYVElfRElTQUJMRV9JVAorI2RlZmluZSBfX0hBTF9FVEhfRVhUSV9HRVRfRkxBRyBfX0hBTF9FVEhfV0FLRVVQX0VYVElfR0VUX0ZMQUcKKyNkZWZpbmUgX19IQUxfRVRIX0VYVElfQ0xFQVJfRkxBRyBfX0hBTF9FVEhfV0FLRVVQX0VYVElfQ0xFQVJfRkxBRworI2RlZmluZSBfX0hBTF9FVEhfRVhUSV9TRVRfUklTSU5HX0VHREVfVFJJR0dFUiBcCisgIF9fSEFMX0VUSF9XQUtFVVBfRVhUSV9FTkFCTEVfUklTSU5HX0VER0VfVFJJR0dFUgorI2RlZmluZSBfX0hBTF9FVEhfRVhUSV9TRVRfRkFMTElOR19FR0RFX1RSSUdHRVIgXAorICBfX0hBTF9FVEhfV0FLRVVQX0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRV9UUklHR0VSCisjZGVmaW5lIF9fSEFMX0VUSF9FWFRJX1NFVF9GQUxMSU5HUklTSU5HX1RSSUdHRVIgXAorICBfX0hBTF9FVEhfV0FLRVVQX0VYVElfRU5BQkxFX0ZBTExJTkdSSVNJTkdfVFJJR0dFUgorCisjZGVmaW5lIEVUSF9QUk9NSVNDSU9VU01PREVfRU5BQkxFIEVUSF9QUk9NSVNDVU9VU19NT0RFX0VOQUJMRQorI2RlZmluZSBFVEhfUFJPTUlTQ0lPVVNNT0RFX0RJU0FCTEUgRVRIX1BST01JU0NVT1VTX01PREVfRElTQUJMRQorI2RlZmluZSBJU19FVEhfUFJPTUlTQ0lPVVNfTU9ERSBJU19FVEhfUFJPTUlTQ1VPVVNfTU9ERQorLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0xURENfQWxpYXNlZF9NYWNyb3MgSEFMIExUREMgQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3IKKyAqIGxlZ2FjeSBwdXJwb3NlCisgKiBAeworICovCisjZGVmaW5lIF9fSEFMX0xURENfTEFZRVIgTFREQ19MQVlFUgorI2RlZmluZSBfX0hBTF9MVERDX1JFTE9BRF9DT05GSUcgX19IQUxfTFREQ19SRUxPQURfSU1NRURJQVRFX0NPTkZJRworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1NBSV9BbGlhc2VkX01hY3JvcyBIQUwgU0FJIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yCisgKiBsZWdhY3kgcHVycG9zZQorICogQHsKKyAqLworI2RlZmluZSBTQUlfT1VUUFVURFJJVkVfRElTQUJMRUQgU0FJX09VVFBVVERSSVZFX0RJU0FCTEUKKyNkZWZpbmUgU0FJX09VVFBVVERSSVZFX0VOQUJMRUQgU0FJX09VVFBVVERSSVZFX0VOQUJMRQorI2RlZmluZSBTQUlfTUFTVEVSRElWSURFUl9FTkFCTEVEIFNBSV9NQVNURVJESVZJREVSX0VOQUJMRQorI2RlZmluZSBTQUlfTUFTVEVSRElWSURFUl9ESVNBQkxFRCBTQUlfTUFTVEVSRElWSURFUl9ESVNBQkxFCisjZGVmaW5lIFNBSV9TVFJFT01PREUgU0FJX1NURVJFT01PREUKKyNkZWZpbmUgU0FJX0ZJRk9TdGF0dXNfRW1wdHkgU0FJX0ZJRk9TVEFUVVNfRU1QVFkKKyNkZWZpbmUgU0FJX0ZJRk9TdGF0dXNfTGVzczFRdWFydGVyRnVsbCBTQUlfRklGT1NUQVRVU19MRVNTMVFVQVJURVJGVUxMCisjZGVmaW5lIFNBSV9GSUZPU3RhdHVzXzFRdWFydGVyRnVsbCBTQUlfRklGT1NUQVRVU18xUVVBUlRFUkZVTEwKKyNkZWZpbmUgU0FJX0ZJRk9TdGF0dXNfSGFsZkZ1bGwgU0FJX0ZJRk9TVEFUVVNfSEFMRkZVTEwKKyNkZWZpbmUgU0FJX0ZJRk9TdGF0dXNfM1F1YXJ0ZXJzRnVsbCBTQUlfRklGT1NUQVRVU18zUVVBUlRFUkZVTEwKKyNkZWZpbmUgU0FJX0ZJRk9TdGF0dXNfRnVsbCBTQUlfRklGT1NUQVRVU19GVUxMCisjZGVmaW5lIElTX1NBSV9CTE9DS19NT05PX1NUUkVPX01PREUgSVNfU0FJX0JMT0NLX01PTk9fU1RFUkVPX01PREUKKyNkZWZpbmUgU0FJX1NZTkNIUk9OT1VTX0VYVCBTQUlfU1lOQ0hST05PVVNfRVhUX1NBSTEKKyNkZWZpbmUgU0FJX1NZTkNFWFRfSU5fRU5BQkxFIFNBSV9TWU5DRVhUX09VVEJMT0NLQV9FTkFCTEUKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEhBTF9TUERJRlJYX0FsaWFzZWRfTWFjcm9zIEhBTCBTUERJRlJYIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQKKyAqIGZvciBsZWdhY3kgcHVycG9zZQorICogQHsKKyAqLworI2lmIGRlZmluZWQoU1RNMzJINykKKyNkZWZpbmUgSEFMX1NQRElGUlhfUmVjZWl2ZUNvbnRyb2xGbG93IEhBTF9TUERJRlJYX1JlY2VpdmVDdHJsRmxvdworI2RlZmluZSBIQUxfU1BESUZSWF9SZWNlaXZlQ29udHJvbEZsb3dfSVQgSEFMX1NQRElGUlhfUmVjZWl2ZUN0cmxGbG93X0lUCisjZGVmaW5lIEhBTF9TUERJRlJYX1JlY2VpdmVDb250cm9sRmxvd19ETUEgSEFMX1NQRElGUlhfUmVjZWl2ZUN0cmxGbG93X0RNQQorI2VuZGlmCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBIQUxfSFJUSU1fQWxpYXNlZF9GdW5jdGlvbnMgSEFMIEhSVElNIEFsaWFzZWQgRnVuY3Rpb25zIG1haW50YWluZWQKKyAqIGZvciBsZWdhY3kgcHVycG9zZQorICogQHsKKyAqLworI2lmIGRlZmluZWQoU1RNMzJINykgfHwgZGVmaW5lZChTVE0zMkc0KSB8fCBkZWZpbmVkKFNUTTMyRjMpCisjZGVmaW5lIEhBTF9IUlRJTV9XYXZlZm9ybUNvdW50ZXJTdGFydF9JVCBIQUxfSFJUSU1fV2F2ZWZvcm1Db3VudFN0YXJ0X0lUCisjZGVmaW5lIEhBTF9IUlRJTV9XYXZlZm9ybUNvdW50ZXJTdGFydF9ETUEgSEFMX0hSVElNX1dhdmVmb3JtQ291bnRTdGFydF9ETUEKKyNkZWZpbmUgSEFMX0hSVElNX1dhdmVmb3JtQ291bnRlclN0YXJ0IEhBTF9IUlRJTV9XYXZlZm9ybUNvdW50U3RhcnQKKyNkZWZpbmUgSEFMX0hSVElNX1dhdmVmb3JtQ291bnRlclN0b3BfSVQgSEFMX0hSVElNX1dhdmVmb3JtQ291bnRTdG9wX0lUCisjZGVmaW5lIEhBTF9IUlRJTV9XYXZlZm9ybUNvdW50ZXJTdG9wX0RNQSBIQUxfSFJUSU1fV2F2ZWZvcm1Db3VudFN0b3BfRE1BCisjZGVmaW5lIEhBTF9IUlRJTV9XYXZlZm9ybUNvdW50ZXJTdG9wIEhBTF9IUlRJTV9XYXZlZm9ybUNvdW50U3RvcAorI2VuZGlmCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBIQUxfUVNQSV9BbGlhc2VkX01hY3JvcyBIQUwgUVNQSSBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvcgorICogbGVnYWN5IHB1cnBvc2UKKyAqIEB7CisgKi8KKyNpZiBkZWZpbmVkKFNUTTMyTDQpIHx8IGRlZmluZWQoU1RNMzJGNCkgfHwgZGVmaW5lZChTVE0zMkY3KSB8fCBkZWZpbmVkKFNUTTMySDcpCisjZGVmaW5lIEhBTF9RUFNJX1RJTUVPVVRfREVGQVVMVF9WQUxVRSBIQUxfUVNQSV9USU1FT1VUX0RFRkFVTFRfVkFMVUUKKyNlbmRpZiAvKiBTVE0zMkw0IHx8IFNUTTMyRjQgfHwgU1RNMzJGNyAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0dlbmVyaWNfQWxpYXNlZF9NYWNyb3MgSEFMIEdlbmVyaWMgQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZAorICogZm9yIGxlZ2FjeSBwdXJwb3NlCisgKiBAeworICovCisjaWYgZGVmaW5lZChTVE0zMkY3KQorI2RlZmluZSBBUlRfQUNDTEVSQVRPUl9FTkFCTEUgQVJUX0FDQ0VMRVJBVE9SX0VOQUJMRQorI2VuZGlmIC8qIFNUTTMyRjcgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEhBTF9QUFBfQWxpYXNlZF9NYWNyb3MgSEFMIFBQUCBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvcgorICogbGVnYWN5IHB1cnBvc2UKKyAqIEB7CisgKi8KKworLyoqCisgKiBAfQorICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMl9IQUxfTEVHQUNZICovCmRpZmYgLS1naXQgYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9oYWwuaCBiL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9JbmMvc3RtMzJnNHh4X2hhbC5oCmluZGV4IGM3NTBkNmIuLmVjMGJjZmEgMTAwNjQ0Ci0tLSBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9JbmMvc3RtMzJnNHh4X2hhbC5oCisrKyBiL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9JbmMvc3RtMzJnNHh4X2hhbC5oCkBAIC0xLDc3MCArMSw3ODIgQEAKLS8qKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBAZmlsZSAgICBzdG0zMmc0eHhfaGFsLmgNCi0gKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQ0KLSAqIEBicmllZiAgIFRoaXMgZmlsZSBjb250YWlucyBhbGwgdGhlIGZ1bmN0aW9ucyBwcm90b3R5cGVzIGZvciB0aGUgSEFMDQotICogICAgICAgICAgbW9kdWxlIGRyaXZlci4NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQGF0dGVudGlvbg0KLSAqDQotICogQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KLSAqDQotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0ZXJtcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlDQotICogaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc29mdHdhcmUgY29tcG9uZW50Lg0KLSAqIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcyB3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLg0KLSAqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqLw0KLQ0KLS8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotI2lmbmRlZiBTVE0zMkc0eHhfSEFMX0gNCi0jZGVmaW5lIFNUTTMyRzR4eF9IQUxfSA0KLQ0KLSNpZmRlZiBfX2NwbHVzcGx1cw0KLWV4dGVybiAiQyIgew0KLSNlbmRpZg0KLQ0KLS8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotI2luY2x1ZGUgInN0bTMyZzR4eF9oYWxfY29uZi5oIg0KLQ0KLS8qKiBAYWRkdG9ncm91cCBTVE0zMkc0eHhfSEFMX0RyaXZlcg0KLSAqIEB7DQotICovDQotDQotLyoqIEBhZGR0b2dyb3VwIEhBTCBIQUwNCi0gKiBAew0KLSAqLw0KLQ0KLS8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0NCi0vKiogQGRlZmdyb3VwIEhBTF9FeHBvcnRlZF9Db25zdGFudHMgSEFMIEV4cG9ydGVkIENvbnN0YW50cw0KLSAqIEB7DQotICovDQotDQotLyoqIEBkZWZncm91cCBIQUxfVElDS19GUkVRIFRpY2sgRnJlcXVlbmN5DQotICogQHsNCi0gKi8NCi0jZGVmaW5lIEhBTF9USUNLX0ZSRVFfMTBIWiAxMDBVDQotI2RlZmluZSBIQUxfVElDS19GUkVRXzEwMEhaIDEwVQ0KLSNkZWZpbmUgSEFMX1RJQ0tfRlJFUV8xS0haIDFVDQotI2RlZmluZSBIQUxfVElDS19GUkVRX0RFRkFVTFQgSEFMX1RJQ0tfRlJFUV8xS0haDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFNZU0NGR19FeHBvcnRlZF9Db25zdGFudHMgU1lTQ0ZHIEV4cG9ydGVkIENvbnN0YW50cw0KLSAqIEB7DQotICovDQotDQotLyoqIEBkZWZncm91cCBTWVNDRkdfQm9vdE1vZGUgQm9vdCBNb2RlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFNZU0NGR19CT09UX01BSU5GTEFTSCAweDAwMDAwMDAwVQ0KLSNkZWZpbmUgU1lTQ0ZHX0JPT1RfU1lTVEVNRkxBU0ggU1lTQ0ZHX01FTU1FTVJNUF9NT0RFXzANCi0NCi0jaWYgZGVmaW5lZChGTUNfQkFOSzEpDQotI2RlZmluZSBTWVNDRkdfQk9PVF9GTUMgU1lTQ0ZHX01FTU1FTVJNUF9NT0RFXzENCi0jZW5kaWYgLyogRk1DX0JBTksxICovDQotDQotI2RlZmluZSBTWVNDRkdfQk9PVF9TUkFNIChTWVNDRkdfTUVNTUVNUk1QX01PREVfMSB8IFNZU0NGR19NRU1NRU1STVBfTU9ERV8wKQ0KLQ0KLSNpZiBkZWZpbmVkKFFVQURTUEkpDQotI2RlZmluZSBTWVNDRkdfQk9PVF9RVUFEU1BJIChTWVNDRkdfTUVNTUVNUk1QX01PREVfMiB8IFNZU0NGR19NRU1NRU1STVBfTU9ERV8xKQ0KLSNlbmRpZiAvKiBRVUFEU1BJICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFNZU0NGR19GUFVfSW50ZXJydXB0cyBGUFUgSW50ZXJydXB0cw0KLSAqIEB7DQotICovDQotI2RlZmluZSBTWVNDRkdfSVRfRlBVX0lPQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBTWVNDRkdfQ0ZHUjFfRlBVX0lFXzAgLyohPCBGbG9hdGluZyBQb2ludCBVbml0IEludmFsaWQgb3BlcmF0aW9uIEludGVycnVwdCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBTWVNDRkdfSVRfRlBVX0RaQyBcDQotICBTWVNDRkdfQ0ZHUjFfRlBVX0lFXzEgLyohPCBGbG9hdGluZyBQb2ludCBVbml0IERpdmlkZS1ieS16ZXJvIEludGVycnVwdCAqLw0KLSNkZWZpbmUgU1lTQ0ZHX0lUX0ZQVV9VRkMgXA0KLSAgU1lTQ0ZHX0NGR1IxX0ZQVV9JRV8yIC8qITwgRmxvYXRpbmcgUG9pbnQgVW5pdCBVbmRlcmZsb3cgSW50ZXJydXB0ICovDQotI2RlZmluZSBTWVNDRkdfSVRfRlBVX09GQyBcDQotICBTWVNDRkdfQ0ZHUjFfRlBVX0lFXzMgLyohPCBGbG9hdGluZyBQb2ludCBVbml0IE92ZXJmbG93IEludGVycnVwdCAqLw0KLSNkZWZpbmUgU1lTQ0ZHX0lUX0ZQVV9JREMgXA0KLSAgU1lTQ0ZHX0NGR1IxX0ZQVV9JRV80IC8qITwgRmxvYXRpbmcgUG9pbnQgVW5pdCBJbnB1dCBkZW5vcm1hbCBJbnRlcnJ1cHQgKi8NCi0jZGVmaW5lIFNZU0NGR19JVF9GUFVfSVhDIFwNCi0gIFNZU0NGR19DRkdSMV9GUFVfSUVfNSAvKiE8IEZsb2F0aW5nIFBvaW50IFVuaXQgSW5leGFjdCBJbnRlcnJ1cHQgKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgU1lTQ0ZHX0NDTVNSQU1XUlAgQ0NNIFdyaXRlIHByb3RlY3Rpb24NCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTAgXA0KLSAgU1lTQ0ZHX1NXUFJfUEFHRTAgLyohPCBDQ01TUkFNIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAwICovDQotI2RlZmluZSBTWVNDRkdfQ0NNU1JBTVdSUF9QQUdFMSBcDQotICBTWVNDRkdfU1dQUl9QQUdFMSAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDEgKi8NCi0jZGVmaW5lIFNZU0NGR19DQ01TUkFNV1JQX1BBR0UyIFwNCi0gIFNZU0NGR19TV1BSX1BBR0UyIC8qITwgQ0NNU1JBTSBXcml0ZSBwcm90ZWN0aW9uIHBhZ2UgMiAqLw0KLSNkZWZpbmUgU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTMgXA0KLSAgU1lTQ0ZHX1NXUFJfUEFHRTMgLyohPCBDQ01TUkFNIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAzICovDQotI2RlZmluZSBTWVNDRkdfQ0NNU1JBTVdSUF9QQUdFNCBcDQotICBTWVNDRkdfU1dQUl9QQUdFNCAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDQgKi8NCi0jZGVmaW5lIFNZU0NGR19DQ01TUkFNV1JQX1BBR0U1IFwNCi0gIFNZU0NGR19TV1BSX1BBR0U1IC8qITwgQ0NNU1JBTSBXcml0ZSBwcm90ZWN0aW9uIHBhZ2UgNSAqLw0KLSNkZWZpbmUgU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTYgXA0KLSAgU1lTQ0ZHX1NXUFJfUEFHRTYgLyohPCBDQ01TUkFNIFdyaXRlIHByb3RlY3Rpb24gcGFnZSA2ICovDQotI2RlZmluZSBTWVNDRkdfQ0NNU1JBTVdSUF9QQUdFNyBcDQotICBTWVNDRkdfU1dQUl9QQUdFNyAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDcgKi8NCi0jZGVmaW5lIFNZU0NGR19DQ01TUkFNV1JQX1BBR0U4IFwNCi0gIFNZU0NGR19TV1BSX1BBR0U4IC8qITwgQ0NNU1JBTSBXcml0ZSBwcm90ZWN0aW9uIHBhZ2UgOCAqLw0KLSNkZWZpbmUgU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTkgXA0KLSAgU1lTQ0ZHX1NXUFJfUEFHRTkgLyohPCBDQ01TUkFNIFdyaXRlIHByb3RlY3Rpb24gcGFnZSA5ICovDQotI2RlZmluZSBTWVNDRkdfQ0NNU1JBTVdSUF9QQUdFMTAgXA0KLSAgU1lTQ0ZHX1NXUFJfUEFHRTEwIC8qITwgQ0NNU1JBTSBXcml0ZSBwcm90ZWN0aW9uIHBhZ2UgMTAgKi8NCi0jZGVmaW5lIFNZU0NGR19DQ01TUkFNV1JQX1BBR0UxMSBcDQotICBTWVNDRkdfU1dQUl9QQUdFMTEgLyohPCBDQ01TUkFNIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAxMSAqLw0KLSNkZWZpbmUgU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTEyIFwNCi0gIFNZU0NGR19TV1BSX1BBR0UxMiAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDEyICovDQotI2RlZmluZSBTWVNDRkdfQ0NNU1JBTVdSUF9QQUdFMTMgXA0KLSAgU1lTQ0ZHX1NXUFJfUEFHRTEzIC8qITwgQ0NNU1JBTSBXcml0ZSBwcm90ZWN0aW9uIHBhZ2UgMTMgKi8NCi0jZGVmaW5lIFNZU0NGR19DQ01TUkFNV1JQX1BBR0UxNCBcDQotICBTWVNDRkdfU1dQUl9QQUdFMTQgLyohPCBDQ01TUkFNIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAxNCAqLw0KLSNkZWZpbmUgU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTE1IFwNCi0gIFNZU0NGR19TV1BSX1BBR0UxNSAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDE1ICovDQotI2RlZmluZSBTWVNDRkdfQ0NNU1JBTVdSUF9QQUdFMTYgXA0KLSAgU1lTQ0ZHX1NXUFJfUEFHRTE2IC8qITwgQ0NNU1JBTSBXcml0ZSBwcm90ZWN0aW9uIHBhZ2UgMTYgKi8NCi0jZGVmaW5lIFNZU0NGR19DQ01TUkFNV1JQX1BBR0UxNyBcDQotICBTWVNDRkdfU1dQUl9QQUdFMTcgLyohPCBDQ01TUkFNIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAxNyAqLw0KLSNkZWZpbmUgU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTE4IFwNCi0gIFNZU0NGR19TV1BSX1BBR0UxOCAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDE4ICovDQotI2RlZmluZSBTWVNDRkdfQ0NNU1JBTVdSUF9QQUdFMTkgXA0KLSAgU1lTQ0ZHX1NXUFJfUEFHRTE5IC8qITwgQ0NNU1JBTSBXcml0ZSBwcm90ZWN0aW9uIHBhZ2UgMTkgKi8NCi0jZGVmaW5lIFNZU0NGR19DQ01TUkFNV1JQX1BBR0UyMCBcDQotICBTWVNDRkdfU1dQUl9QQUdFMjAgLyohPCBDQ01TUkFNIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAyMCAqLw0KLSNkZWZpbmUgU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTIxIFwNCi0gIFNZU0NGR19TV1BSX1BBR0UyMSAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDIxICovDQotI2RlZmluZSBTWVNDRkdfQ0NNU1JBTVdSUF9QQUdFMjIgXA0KLSAgU1lTQ0ZHX1NXUFJfUEFHRTIyIC8qITwgQ0NNU1JBTSBXcml0ZSBwcm90ZWN0aW9uIHBhZ2UgMjIgKi8NCi0jZGVmaW5lIFNZU0NGR19DQ01TUkFNV1JQX1BBR0UyMyBcDQotICBTWVNDRkdfU1dQUl9QQUdFMjMgLyohPCBDQ01TUkFNIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAyMyAqLw0KLSNkZWZpbmUgU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTI0IFwNCi0gIFNZU0NGR19TV1BSX1BBR0UyNCAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDI0ICovDQotI2RlZmluZSBTWVNDRkdfQ0NNU1JBTVdSUF9QQUdFMjUgXA0KLSAgU1lTQ0ZHX1NXUFJfUEFHRTI1IC8qITwgQ0NNU1JBTSBXcml0ZSBwcm90ZWN0aW9uIHBhZ2UgMjUgKi8NCi0jZGVmaW5lIFNZU0NGR19DQ01TUkFNV1JQX1BBR0UyNiBcDQotICBTWVNDRkdfU1dQUl9QQUdFMjYgLyohPCBDQ01TUkFNIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAyNiAqLw0KLSNkZWZpbmUgU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTI3IFwNCi0gIFNZU0NGR19TV1BSX1BBR0UyNyAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDI3ICovDQotI2RlZmluZSBTWVNDRkdfQ0NNU1JBTVdSUF9QQUdFMjggXA0KLSAgU1lTQ0ZHX1NXUFJfUEFHRTI4IC8qITwgQ0NNU1JBTSBXcml0ZSBwcm90ZWN0aW9uIHBhZ2UgMjggKi8NCi0jZGVmaW5lIFNZU0NGR19DQ01TUkFNV1JQX1BBR0UyOSBcDQotICBTWVNDRkdfU1dQUl9QQUdFMjkgLyohPCBDQ01TUkFNIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAyOSAqLw0KLSNkZWZpbmUgU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTMwIFwNCi0gIFNZU0NGR19TV1BSX1BBR0UzMCAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDMwICovDQotI2RlZmluZSBTWVNDRkdfQ0NNU1JBTVdSUF9QQUdFMzEgXA0KLSAgU1lTQ0ZHX1NXUFJfUEFHRTMxIC8qITwgQ0NNU1JBTSBXcml0ZSBwcm90ZWN0aW9uIHBhZ2UgMzEgKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLSNpZiBkZWZpbmVkKFZSRUZCVUYpDQotLyoqIEBkZWZncm91cCBTWVNDRkdfVlJFRkJVRl9Wb2x0YWdlU2NhbGUgVlJFRkJVRiBWb2x0YWdlIFNjYWxlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFNZU0NGR19WUkVGQlVGX1ZPTFRBR0VfU0NBTEUwIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgVm9sdGFnZSByZWZlcmVuY2Ugc2NhbGUgMCAoVlJFRkJVRl9PVVQgPSAyLjA0OFYpICovDQotI2RlZmluZSBTWVNDRkdfVlJFRkJVRl9WT0xUQUdFX1NDQUxFMSBcDQotICBWUkVGQlVGX0NTUl9WUlNfMCAvKiE8IFZvbHRhZ2UgcmVmZXJlbmNlIHNjYWxlIDEgKFZSRUZCVUZfT1VUID0gMi41VikgICAqLw0KLSNkZWZpbmUgU1lTQ0ZHX1ZSRUZCVUZfVk9MVEFHRV9TQ0FMRTIgXA0KLSAgVlJFRkJVRl9DU1JfVlJTXzEgLyohPCBWb2x0YWdlIHJlZmVyZW5jZSBzY2FsZSAyIChWUkVGQlVGX09VVCA9IDIuOVYpICAgKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgU1lTQ0ZHX1ZSRUZCVUZfSGlnaEltcGVkYW5jZSBWUkVGQlVGIEhpZ2ggSW1wZWRhbmNlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFNZU0NGR19WUkVGQlVGX0hJR0hfSU1QRURBTkNFX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAweDAwMDAwMDAwVSAvKiE8IFZSRUZfcGx1cyBwaW4gaXMgaW50ZXJuYWxseSBjb25uZWN0ZWQgdG8gVm9sdGFnZSByZWZlcmVuY2UgXA0KLSAgICAgICAgICAgICAgICAgYnVmZmVyIG91dHB1dCAqLw0KLSNkZWZpbmUgU1lTQ0ZHX1ZSRUZCVUZfSElHSF9JTVBFREFOQ0VfRU5BQkxFIFwNCi0gIFZSRUZCVUZfQ1NSX0hJWiAvKiE8IFZSRUZfcGx1cyBwaW4gaXMgaGlnaCBpbXBlZGFuY2UgKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLSNlbmRpZiAvKiBWUkVGQlVGICovDQotDQotLyoqIEBkZWZncm91cCBTWVNDRkdfZmxhZ3NfZGVmaW5pdGlvbiBGbGFncw0KLSAqIEB7DQotICovDQotDQotI2RlZmluZSBTWVNDRkdfRkxBR19TUkFNX1BFIFwNCi0gIFNZU0NGR19DRkdSMl9TUEYgLyohPCBTUkFNIHBhcml0eSBlcnJvciAoZmlyc3QgMzJrQiBvZiBTUkFNMSArIENDTSBTUkFNKSAqLw0KLSNkZWZpbmUgU1lTQ0ZHX0ZMQUdfQ0NNU1JBTV9CVVNZIFwNCi0gIFNZU0NGR19TQ1NSX0NDTUJTWSAvKiE8IENDTVNSQU0gYnVzeSBieSBlcmFzZSBvcGVyYXRpb24gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgU1lTQ0ZHX0Zhc3RNb2RlUGx1c19HUElPIEZhc3QtbW9kZSBQbHVzIG9uIEdQSU8NCi0gKiBAew0KLSAqLw0KLQ0KLS8qKiBAYnJpZWYgIEZhc3QtbW9kZSBQbHVzIGRyaXZpbmcgY2FwYWJpbGl0eSBvbiBhIHNwZWNpZmljIEdQSU8NCi0gKi8NCi0jZGVmaW5lIFNZU0NGR19GQVNUTU9ERVBMVVNfUEI2IFwNCi0gIFNZU0NGR19DRkdSMV9JMkNfUEI2X0ZNUCAvKiE8IEVuYWJsZSBGYXN0LW1vZGUgUGx1cyBvbiBQQjYgKi8NCi0jZGVmaW5lIFNZU0NGR19GQVNUTU9ERVBMVVNfUEI3IFwNCi0gIFNZU0NGR19DRkdSMV9JMkNfUEI3X0ZNUCAvKiE8IEVuYWJsZSBGYXN0LW1vZGUgUGx1cyBvbiBQQjcgKi8NCi0jaWYgZGVmaW5lZChTWVNDRkdfQ0ZHUjFfSTJDX1BCOF9GTVApDQotI2RlZmluZSBTWVNDRkdfRkFTVE1PREVQTFVTX1BCOCBcDQotICBTWVNDRkdfQ0ZHUjFfSTJDX1BCOF9GTVAgLyohPCBFbmFibGUgRmFzdC1tb2RlIFBsdXMgb24gUEI4ICovDQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgLyogU1lTQ0ZHX0NGR1IxX0kyQ19QQjhfRk1QICovDQotI2lmIGRlZmluZWQoU1lTQ0ZHX0NGR1IxX0kyQ19QQjlfRk1QKQ0KLSNkZWZpbmUgU1lTQ0ZHX0ZBU1RNT0RFUExVU19QQjkgXA0KLSAgU1lTQ0ZHX0NGR1IxX0kyQ19QQjlfRk1QIC8qITwgRW5hYmxlIEZhc3QtbW9kZSBQbHVzIG9uIFBCOSAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgICAgICAgIC8qIFNZU0NGR19DRkdSMV9JMkNfUEI5X0ZNUCAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotDQotLyoqIEBkZWZncm91cCBEQkdNQ1VfRXhwb3J0ZWRfTWFjcm9zIERCR01DVSBFeHBvcnRlZCBNYWNyb3MNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKiBAYnJpZWYgIEZyZWV6ZS9VbmZyZWV6ZSBQZXJpcGhlcmFscyBpbiBEZWJ1ZyBtb2RlDQotICovDQotI2lmIGRlZmluZWQoREJHTUNVX0FQQjFGWlIxX0RCR19USU0yX1NUT1ApDQotI2RlZmluZSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1RJTTIoKSBcDQotICBTRVRfQklUKERCR01DVS0+QVBCMUZaUjEsIERCR01DVV9BUEIxRlpSMV9EQkdfVElNMl9TVE9QKQ0KLSNkZWZpbmUgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTIoKSBcDQotICBDTEVBUl9CSVQoREJHTUNVLT5BUEIxRlpSMSwgREJHTUNVX0FQQjFGWlIxX0RCR19USU0yX1NUT1ApDQotI2VuZGlmIC8qIERCR01DVV9BUEIxRlpSMV9EQkdfVElNMl9TVE9QICovDQotDQotI2lmIGRlZmluZWQoREJHTUNVX0FQQjFGWlIxX0RCR19USU0zX1NUT1ApDQotI2RlZmluZSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1RJTTMoKSBcDQotICBTRVRfQklUKERCR01DVS0+QVBCMUZaUjEsIERCR01DVV9BUEIxRlpSMV9EQkdfVElNM19TVE9QKQ0KLSNkZWZpbmUgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTMoKSBcDQotICBDTEVBUl9CSVQoREJHTUNVLT5BUEIxRlpSMSwgREJHTUNVX0FQQjFGWlIxX0RCR19USU0zX1NUT1ApDQotI2VuZGlmIC8qIERCR01DVV9BUEIxRlpSMV9EQkdfVElNM19TVE9QICovDQotDQotI2lmIGRlZmluZWQoREJHTUNVX0FQQjFGWlIxX0RCR19USU00X1NUT1ApDQotI2RlZmluZSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1RJTTQoKSBcDQotICBTRVRfQklUKERCR01DVS0+QVBCMUZaUjEsIERCR01DVV9BUEIxRlpSMV9EQkdfVElNNF9TVE9QKQ0KLSNkZWZpbmUgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTQoKSBcDQotICBDTEVBUl9CSVQoREJHTUNVLT5BUEIxRlpSMSwgREJHTUNVX0FQQjFGWlIxX0RCR19USU00X1NUT1ApDQotI2VuZGlmIC8qIERCR01DVV9BUEIxRlpSMV9EQkdfVElNNF9TVE9QICovDQotDQotI2lmIGRlZmluZWQoREJHTUNVX0FQQjFGWlIxX0RCR19USU01X1NUT1ApDQotI2RlZmluZSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1RJTTUoKSBcDQotICBTRVRfQklUKERCR01DVS0+QVBCMUZaUjEsIERCR01DVV9BUEIxRlpSMV9EQkdfVElNNV9TVE9QKQ0KLSNkZWZpbmUgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTUoKSBcDQotICBDTEVBUl9CSVQoREJHTUNVLT5BUEIxRlpSMSwgREJHTUNVX0FQQjFGWlIxX0RCR19USU01X1NUT1ApDQotI2VuZGlmIC8qIERCR01DVV9BUEIxRlpSMV9EQkdfVElNNV9TVE9QICovDQotDQotI2lmIGRlZmluZWQoREJHTUNVX0FQQjFGWlIxX0RCR19USU02X1NUT1ApDQotI2RlZmluZSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1RJTTYoKSBcDQotICBTRVRfQklUKERCR01DVS0+QVBCMUZaUjEsIERCR01DVV9BUEIxRlpSMV9EQkdfVElNNl9TVE9QKQ0KLSNkZWZpbmUgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTYoKSBcDQotICBDTEVBUl9CSVQoREJHTUNVLT5BUEIxRlpSMSwgREJHTUNVX0FQQjFGWlIxX0RCR19USU02X1NUT1ApDQotI2VuZGlmIC8qIERCR01DVV9BUEIxRlpSMV9EQkdfVElNNl9TVE9QICovDQotDQotI2lmIGRlZmluZWQoREJHTUNVX0FQQjFGWlIxX0RCR19USU03X1NUT1ApDQotI2RlZmluZSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1RJTTcoKSBcDQotICBTRVRfQklUKERCR01DVS0+QVBCMUZaUjEsIERCR01DVV9BUEIxRlpSMV9EQkdfVElNN19TVE9QKQ0KLSNkZWZpbmUgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTcoKSBcDQotICBDTEVBUl9CSVQoREJHTUNVLT5BUEIxRlpSMSwgREJHTUNVX0FQQjFGWlIxX0RCR19USU03X1NUT1ApDQotI2VuZGlmIC8qIERCR01DVV9BUEIxRlpSMV9EQkdfVElNN19TVE9QICovDQotDQotI2lmIGRlZmluZWQoREJHTUNVX0FQQjFGWlIxX0RCR19SVENfU1RPUCkNCi0jZGVmaW5lIF9fSEFMX0RCR01DVV9GUkVFWkVfUlRDKCkgXA0KLSAgU0VUX0JJVChEQkdNQ1UtPkFQQjFGWlIxLCBEQkdNQ1VfQVBCMUZaUjFfREJHX1JUQ19TVE9QKQ0KLSNkZWZpbmUgX19IQUxfREJHTUNVX1VORlJFRVpFX1JUQygpIFwNCi0gIENMRUFSX0JJVChEQkdNQ1UtPkFQQjFGWlIxLCBEQkdNQ1VfQVBCMUZaUjFfREJHX1JUQ19TVE9QKQ0KLSNlbmRpZiAvKiBEQkdNQ1VfQVBCMUZaUjFfREJHX1JUQ19TVE9QICovDQotDQotI2lmIGRlZmluZWQoREJHTUNVX0FQQjFGWlIxX0RCR19XV0RHX1NUT1ApDQotI2RlZmluZSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1dXREcoKSBcDQotICBTRVRfQklUKERCR01DVS0+QVBCMUZaUjEsIERCR01DVV9BUEIxRlpSMV9EQkdfV1dER19TVE9QKQ0KLSNkZWZpbmUgX19IQUxfREJHTUNVX1VORlJFRVpFX1dXREcoKSBcDQotICBDTEVBUl9CSVQoREJHTUNVLT5BUEIxRlpSMSwgREJHTUNVX0FQQjFGWlIxX0RCR19XV0RHX1NUT1ApDQotI2VuZGlmIC8qIERCR01DVV9BUEIxRlpSMV9EQkdfV1dER19TVE9QICovDQotDQotI2lmIGRlZmluZWQoREJHTUNVX0FQQjFGWlIxX0RCR19JV0RHX1NUT1ApDQotI2RlZmluZSBfX0hBTF9EQkdNQ1VfRlJFRVpFX0lXREcoKSBcDQotICBTRVRfQklUKERCR01DVS0+QVBCMUZaUjEsIERCR01DVV9BUEIxRlpSMV9EQkdfSVdER19TVE9QKQ0KLSNkZWZpbmUgX19IQUxfREJHTUNVX1VORlJFRVpFX0lXREcoKSBcDQotICBDTEVBUl9CSVQoREJHTUNVLT5BUEIxRlpSMSwgREJHTUNVX0FQQjFGWlIxX0RCR19JV0RHX1NUT1ApDQotI2VuZGlmIC8qIERCR01DVV9BUEIxRlpSMV9EQkdfSVdER19TVE9QICovDQotDQotI2lmIGRlZmluZWQoREJHTUNVX0FQQjFGWlIxX0RCR19JMkMxX1NUT1ApDQotI2RlZmluZSBfX0hBTF9EQkdNQ1VfRlJFRVpFX0kyQzFfVElNRU9VVCgpIFwNCi0gIFNFVF9CSVQoREJHTUNVLT5BUEIxRlpSMSwgREJHTUNVX0FQQjFGWlIxX0RCR19JMkMxX1NUT1ApDQotI2RlZmluZSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfSTJDMV9USU1FT1VUKCkgXA0KLSAgQ0xFQVJfQklUKERCR01DVS0+QVBCMUZaUjEsIERCR01DVV9BUEIxRlpSMV9EQkdfSTJDMV9TVE9QKQ0KLSNlbmRpZiAvKiBEQkdNQ1VfQVBCMUZaUjFfREJHX0kyQzFfU1RPUCAqLw0KLQ0KLSNpZiBkZWZpbmVkKERCR01DVV9BUEIxRlpSMV9EQkdfSTJDMl9TVE9QKQ0KLSNkZWZpbmUgX19IQUxfREJHTUNVX0ZSRUVaRV9JMkMyX1RJTUVPVVQoKSBcDQotICBTRVRfQklUKERCR01DVS0+QVBCMUZaUjEsIERCR01DVV9BUEIxRlpSMV9EQkdfSTJDMl9TVE9QKQ0KLSNkZWZpbmUgX19IQUxfREJHTUNVX1VORlJFRVpFX0kyQzJfVElNRU9VVCgpIFwNCi0gIENMRUFSX0JJVChEQkdNQ1UtPkFQQjFGWlIxLCBEQkdNQ1VfQVBCMUZaUjFfREJHX0kyQzJfU1RPUCkNCi0jZW5kaWYgLyogREJHTUNVX0FQQjFGWlIxX0RCR19JMkMyX1NUT1AgKi8NCi0NCi0jaWYgZGVmaW5lZChEQkdNQ1VfQVBCMUZaUjFfREJHX0kyQzNfU1RPUCkNCi0jZGVmaW5lIF9fSEFMX0RCR01DVV9GUkVFWkVfSTJDM19USU1FT1VUKCkgXA0KLSAgU0VUX0JJVChEQkdNQ1UtPkFQQjFGWlIxLCBEQkdNQ1VfQVBCMUZaUjFfREJHX0kyQzNfU1RPUCkNCi0jZGVmaW5lIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9JMkMzX1RJTUVPVVQoKSBcDQotICBDTEVBUl9CSVQoREJHTUNVLT5BUEIxRlpSMSwgREJHTUNVX0FQQjFGWlIxX0RCR19JMkMzX1NUT1ApDQotI2VuZGlmIC8qIERCR01DVV9BUEIxRlpSMV9EQkdfSTJDM19TVE9QICovDQotDQotI2lmIGRlZmluZWQoREJHTUNVX0FQQjFGWlIxX0RCR19MUFRJTTFfU1RPUCkNCi0jZGVmaW5lIF9fSEFMX0RCR01DVV9GUkVFWkVfTFBUSU0xKCkgXA0KLSAgU0VUX0JJVChEQkdNQ1UtPkFQQjFGWlIxLCBEQkdNQ1VfQVBCMUZaUjFfREJHX0xQVElNMV9TVE9QKQ0KLSNkZWZpbmUgX19IQUxfREJHTUNVX1VORlJFRVpFX0xQVElNMSgpIFwNCi0gIENMRUFSX0JJVChEQkdNQ1UtPkFQQjFGWlIxLCBEQkdNQ1VfQVBCMUZaUjFfREJHX0xQVElNMV9TVE9QKQ0KLSNlbmRpZiAvKiBEQkdNQ1VfQVBCMUZaUjFfREJHX0xQVElNMV9TVE9QICovDQotDQotI2lmIGRlZmluZWQoREJHTUNVX0FQQjFGWlIyX0RCR19JMkM0X1NUT1ApDQotI2RlZmluZSBfX0hBTF9EQkdNQ1VfRlJFRVpFX0kyQzRfVElNRU9VVCgpIFwNCi0gIFNFVF9CSVQoREJHTUNVLT5BUEIxRlpSMiwgREJHTUNVX0FQQjFGWlIyX0RCR19JMkM0X1NUT1ApDQotI2RlZmluZSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfSTJDNF9USU1FT1VUKCkgXA0KLSAgQ0xFQVJfQklUKERCR01DVS0+QVBCMUZaUjIsIERCR01DVV9BUEIxRlpSMl9EQkdfSTJDNF9TVE9QKQ0KLSNlbmRpZiAvKiBEQkdNQ1VfQVBCMUZaUjJfREJHX0kyQzRfU1RPUCAqLw0KLQ0KLSNpZiBkZWZpbmVkKERCR01DVV9BUEIyRlpfREJHX1RJTTFfU1RPUCkNCi0jZGVmaW5lIF9fSEFMX0RCR01DVV9GUkVFWkVfVElNMSgpIFwNCi0gIFNFVF9CSVQoREJHTUNVLT5BUEIyRlosIERCR01DVV9BUEIyRlpfREJHX1RJTTFfU1RPUCkNCi0jZGVmaW5lIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU0xKCkgXA0KLSAgQ0xFQVJfQklUKERCR01DVS0+QVBCMkZaLCBEQkdNQ1VfQVBCMkZaX0RCR19USU0xX1NUT1ApDQotI2VuZGlmIC8qIERCR01DVV9BUEIyRlpfREJHX1RJTTFfU1RPUCAqLw0KLQ0KLSNpZiBkZWZpbmVkKERCR01DVV9BUEIyRlpfREJHX1RJTThfU1RPUCkNCi0jZGVmaW5lIF9fSEFMX0RCR01DVV9GUkVFWkVfVElNOCgpIFwNCi0gIFNFVF9CSVQoREJHTUNVLT5BUEIyRlosIERCR01DVV9BUEIyRlpfREJHX1RJTThfU1RPUCkNCi0jZGVmaW5lIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU04KCkgXA0KLSAgQ0xFQVJfQklUKERCR01DVS0+QVBCMkZaLCBEQkdNQ1VfQVBCMkZaX0RCR19USU04X1NUT1ApDQotI2VuZGlmIC8qIERCR01DVV9BUEIyRlpfREJHX1RJTThfU1RPUCAqLw0KLQ0KLSNpZiBkZWZpbmVkKERCR01DVV9BUEIyRlpfREJHX1RJTTE1X1NUT1ApDQotI2RlZmluZSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1RJTTE1KCkgXA0KLSAgU0VUX0JJVChEQkdNQ1UtPkFQQjJGWiwgREJHTUNVX0FQQjJGWl9EQkdfVElNMTVfU1RPUCkNCi0jZGVmaW5lIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU0xNSgpIFwNCi0gIENMRUFSX0JJVChEQkdNQ1UtPkFQQjJGWiwgREJHTUNVX0FQQjJGWl9EQkdfVElNMTVfU1RPUCkNCi0jZW5kaWYgLyogREJHTUNVX0FQQjJGWl9EQkdfVElNMTVfU1RPUCAqLw0KLQ0KLSNpZiBkZWZpbmVkKERCR01DVV9BUEIyRlpfREJHX1RJTTE2X1NUT1ApDQotI2RlZmluZSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1RJTTE2KCkgXA0KLSAgU0VUX0JJVChEQkdNQ1UtPkFQQjJGWiwgREJHTUNVX0FQQjJGWl9EQkdfVElNMTZfU1RPUCkNCi0jZGVmaW5lIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU0xNigpIFwNCi0gIENMRUFSX0JJVChEQkdNQ1UtPkFQQjJGWiwgREJHTUNVX0FQQjJGWl9EQkdfVElNMTZfU1RPUCkNCi0jZW5kaWYgLyogREJHTUNVX0FQQjJGWl9EQkdfVElNMTZfU1RPUCAqLw0KLQ0KLSNpZiBkZWZpbmVkKERCR01DVV9BUEIyRlpfREJHX1RJTTE3X1NUT1ApDQotI2RlZmluZSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1RJTTE3KCkgXA0KLSAgU0VUX0JJVChEQkdNQ1UtPkFQQjJGWiwgREJHTUNVX0FQQjJGWl9EQkdfVElNMTdfU1RPUCkNCi0jZGVmaW5lIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU0xNygpIFwNCi0gIENMRUFSX0JJVChEQkdNQ1UtPkFQQjJGWiwgREJHTUNVX0FQQjJGWl9EQkdfVElNMTdfU1RPUCkNCi0jZW5kaWYgLyogREJHTUNVX0FQQjJGWl9EQkdfVElNMTdfU1RPUCAqLw0KLQ0KLSNpZiBkZWZpbmVkKERCR01DVV9BUEIyRlpfREJHX1RJTTIwX1NUT1ApDQotI2RlZmluZSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1RJTTIwKCkgXA0KLSAgU0VUX0JJVChEQkdNQ1UtPkFQQjJGWiwgREJHTUNVX0FQQjJGWl9EQkdfVElNMjBfU1RPUCkNCi0jZGVmaW5lIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU0yMCgpIFwNCi0gIENMRUFSX0JJVChEQkdNQ1UtPkFQQjJGWiwgREJHTUNVX0FQQjJGWl9EQkdfVElNMjBfU1RPUCkNCi0jZW5kaWYgLyogREJHTUNVX0FQQjJGWl9EQkdfVElNMjBfU1RPUCAqLw0KLQ0KLSNpZiBkZWZpbmVkKERCR01DVV9BUEIyRlpfREJHX0hSVElNMV9TVE9QKQ0KLSNkZWZpbmUgX19IQUxfREJHTUNVX0ZSRUVaRV9IUlRJTTEoKSBcDQotICBTRVRfQklUKERCR01DVS0+QVBCMkZaLCBEQkdNQ1VfQVBCMkZaX0RCR19IUlRJTTFfU1RPUCkNCi0jZGVmaW5lIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9IUlRJTTEoKSBcDQotICBDTEVBUl9CSVQoREJHTUNVLT5BUEIyRlosIERCR01DVV9BUEIyRlpfREJHX0hSVElNMV9TVE9QKQ0KLSNlbmRpZiAvKiBEQkdNQ1VfQVBCMkZaX0RCR19IUlRJTTFfU1RPUCAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBTWVNDRkdfRXhwb3J0ZWRfTWFjcm9zIFNZU0NGRyBFeHBvcnRlZCBNYWNyb3MNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKiBAYnJpZWYgIE1haW4gRmxhc2ggbWVtb3J5IG1hcHBlZCBhdCAweDAwMDAwMDAwLg0KLSAqLw0KLSNkZWZpbmUgX19IQUxfU1lTQ0ZHX1JFTUFQTUVNT1JZX0ZMQVNIKCkgXA0KLSAgQ0xFQVJfQklUKFNZU0NGRy0+TUVNUk1QLCBTWVNDRkdfTUVNUk1QX01FTV9NT0RFKQ0KLQ0KLS8qKiBAYnJpZWYgIFN5c3RlbSBGbGFzaCBtZW1vcnkgbWFwcGVkIGF0IDB4MDAwMDAwMDAuDQotICovDQotI2RlZmluZSBfX0hBTF9TWVNDRkdfUkVNQVBNRU1PUllfU1lTVEVNRkxBU0goKSBcDQotICBNT0RJRllfUkVHKFNZU0NGRy0+TUVNUk1QLCBTWVNDRkdfTUVNUk1QX01FTV9NT0RFLCBTWVNDRkdfTUVNUk1QX01FTV9NT0RFXzApDQotDQotLyoqIEBicmllZiAgRW1iZWRkZWQgU1JBTSBtYXBwZWQgYXQgMHgwMDAwMDAwMC4NCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1NZU0NGR19SRU1BUE1FTU9SWV9TUkFNKCkgICAgICAgICAgICAgIFwNCi0gIE1PRElGWV9SRUcoU1lTQ0ZHLT5NRU1STVAsIFNZU0NGR19NRU1STVBfTUVNX01PREUsIFwNCi0gICAgICAgICAgICAgKFNZU0NGR19NRU1STVBfTUVNX01PREVfMSB8IFNZU0NGR19NRU1STVBfTUVNX01PREVfMCkpDQotDQotI2lmIGRlZmluZWQoRk1DX0JBTksxKQ0KLS8qKiBAYnJpZWYgIEZNQyBCYW5rMSAoTk9SL1BTUkFNIDEgYW5kIDIpIG1hcHBlZCBhdCAweDAwMDAwMDAwLg0KLSAqLw0KLSNkZWZpbmUgX19IQUxfU1lTQ0ZHX1JFTUFQTUVNT1JZX0ZNQygpIFwNCi0gIE1PRElGWV9SRUcoU1lTQ0ZHLT5NRU1STVAsIFNZU0NGR19NRU1STVBfTUVNX01PREUsIFNZU0NGR19NRU1STVBfTUVNX01PREVfMSkNCi0jZW5kaWYgLyogRk1DX0JBTksxICovDQotDQotI2lmIGRlZmluZWQoUVVBRFNQSSkNCi0vKiogQGJyaWVmICBRVUFEU1BJIG1hcHBlZCBhdCAweDAwMDAwMDAwLg0KLSAqLw0KLSNkZWZpbmUgX19IQUxfU1lTQ0ZHX1JFTUFQTUVNT1JZX1FVQURTUEkoKSAgICAgICAgICAgXA0KLSAgTU9ESUZZX1JFRyhTWVNDRkctPk1FTVJNUCwgU1lTQ0ZHX01FTVJNUF9NRU1fTU9ERSwgXA0KLSAgICAgICAgICAgICAoU1lTQ0ZHX01FTVJNUF9NRU1fTU9ERV8yIHwgU1lTQ0ZHX01FTVJNUF9NRU1fTU9ERV8xKSkNCi0jZW5kaWYgLyogUVVBRFNQSSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmV0dXJuIHRoZSBib290IG1vZGUgYXMgY29uZmlndXJlZCBieSB1c2VyLg0KLSAqIEByZXR2YWwgVGhlIGJvb3QgbW9kZSBhcyBjb25maWd1cmVkIGJ5IHVzZXIuIFRoZSByZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lDQotICogICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgQGFyZyBAcmVmIFNZU0NGR19CT09UX01BSU5GTEFTSA0KLSAqICAgICAgICAgICBAYXJnIEByZWYgU1lTQ0ZHX0JPT1RfU1lTVEVNRkxBU0gNCi0gKiAgICAgICAgICAgQGFyZyBAcmVmIFNZU0NGR19CT09UX0ZNQyAoKikNCi0gKiAgICAgICAgICAgQGFyZyBAcmVmIFNZU0NGR19CT09UX1FVQURTUEkgKCopDQotICogICAgICAgICAgIEBhcmcgQHJlZiBTWVNDRkdfQk9PVF9TUkFNDQotICogQG5vdGUgICAoKikgYXZhaWxhYmlsaXR5IGRlcGVuZHMgb24gZGV2aWNlcw0KLSAqLw0KLSNkZWZpbmUgX19IQUxfU1lTQ0ZHX0dFVF9CT09UX01PREUoKSBcDQotICBSRUFEX0JJVChTWVNDRkctPk1FTVJNUCwgU1lTQ0ZHX01FTVJNUF9NRU1fTU9ERSkNCi0NCi0vKiogQGJyaWVmICBDQ01TUkFNIHBhZ2Ugd3JpdGUgcHJvdGVjdGlvbiBlbmFibGUgbWFjcm8NCi0gKiBAcGFyYW0gX19DQ01TUkFNV1JQX186IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gKiBTWVNDRkdfQ0NNU1JBTVdSUA0KLSAqIEBub3RlICAgd3JpdGUgcHJvdGVjdGlvbiBjYW4gb25seSBiZSBkaXNhYmxlZCBieSBhIHN5c3RlbSByZXNldA0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLS8qIExlZ2FjeSBkZWZpbmUgKi8NCi0jZGVmaW5lIF9fSEFMX1NZU0NGR19DQ01TUkFNX1dSUF8xXzMxX0VOQUJMRSBcDQotICBfX0hBTF9TWVNDRkdfQ0NNU1JBTV9XUlBfMF8zMV9FTkFCTEUNCi0jZGVmaW5lIF9fSEFMX1NZU0NGR19DQ01TUkFNX1dSUF8wXzMxX0VOQUJMRShfX0NDTVNSQU1XUlBfXykgICBcDQotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBhc3NlcnRfcGFyYW0oSVNfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRSgoX19DQ01TUkFNV1JQX18pKSk7IFwNCi0gICAgU0VUX0JJVChTWVNDRkctPlNXUFIsIChfX0NDTVNSQU1XUlBfXykpOyAgICAgICAgICAgICAgICAgICBcDQotICB9IHdoaWxlICgwKQ0KLQ0KLS8qKiBAYnJpZWYgIENDTVNSQU0gcGFnZSB3cml0ZSBwcm90ZWN0aW9uIHVubG9jayBwcmlvciB0byBlcmFzZQ0KLSAqIEBub3RlICAgV3JpdGluZyBhIHdyb25nIGtleSByZWFjdGl2YXRlcyB0aGUgd3JpdGUgcHJvdGVjdGlvbg0KLSAqLw0KLSNkZWZpbmUgX19IQUxfU1lTQ0ZHX0NDTVNSQU1fV1JQX1VOTE9DSygpIFwNCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIFNZU0NGRy0+U0tSID0gMHhDQTsgICAgICAgICAgICAgICAgICAgXA0KLSAgICBTWVNDRkctPlNLUiA9IDB4NTM7ICAgICAgICAgICAgICAgICAgIFwNCi0gIH0gd2hpbGUgKDApDQotDQotLyoqIEBicmllZiAgQ0NNU1JBTSBlcmFzZQ0KLSAqIEBub3RlICAgX19TWVNDRkdfR0VUX0ZMQUcoU1lTQ0ZHX0ZMQUdfQ0NNU1JBTV9CVVNZKSBtYXkgYmUgdXNlZCB0byBjaGVjayBlbmQNCi0gKiBvZiBlcmFzZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfU1lTQ0ZHX0NDTVNSQU1fRVJBU0UoKSBTRVRfQklUKFNZU0NGRy0+U0NTUiwgU1lTQ0ZHX1NDU1JfQ0NNRVIpDQotDQotLyoqIEBicmllZiAgRmxvYXRpbmcgUG9pbnQgVW5pdCBpbnRlcnJ1cHQgZW5hYmxlL2Rpc2FibGUgbWFjcm9zDQotICogQHBhcmFtIF9fSU5URVJSVVBUX186IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gKiBTWVNDRkdfRlBVX0ludGVycnVwdHMNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1NZU0NGR19GUFVfSU5URVJSVVBUX0VOQUJMRShfX0lOVEVSUlVQVF9fKSAgICBcDQotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBhc3NlcnRfcGFyYW0oSVNfU1lTQ0ZHX0ZQVV9JTlRFUlJVUFQoKF9fSU5URVJSVVBUX18pKSk7IFwNCi0gICAgU0VUX0JJVChTWVNDRkctPkNGR1IxLCAoX19JTlRFUlJVUFRfXykpOyAgICAgICAgICAgICAgICBcDQotICB9IHdoaWxlICgwKQ0KLQ0KLSNkZWZpbmUgX19IQUxfU1lTQ0ZHX0ZQVV9JTlRFUlJVUFRfRElTQUJMRShfX0lOVEVSUlVQVF9fKSAgIFwNCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIGFzc2VydF9wYXJhbShJU19TWVNDRkdfRlBVX0lOVEVSUlVQVCgoX19JTlRFUlJVUFRfXykpKTsgXA0KLSAgICBDTEVBUl9CSVQoU1lTQ0ZHLT5DRkdSMSwgKF9fSU5URVJSVVBUX18pKTsgICAgICAgICAgICAgIFwNCi0gIH0gd2hpbGUgKDApDQotDQotLyoqIEBicmllZiAgU1lTQ0ZHIEJyZWFrIEVDQyBsb2NrLg0KLSAqICAgICAgICAgRW5hYmxlIGFuZCBsb2NrIHRoZSBjb25uZWN0aW9uIG9mIEZsYXNoIEVDQyBlcnJvciBjb25uZWN0aW9uIHRvDQotICogVElNMS84LzE1LzE2LzE3IEJyZWFrIGlucHV0Lg0KLSAqIEBub3RlICAgVGhlIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24gaXMgbG9ja2VkIGFuZCBjYW4gYmUgdW5sb2NrZWQgb25seSBieQ0KLSAqIHN5c3RlbSByZXNldC4NCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1NZU0NGR19CUkVBS19FQ0NfTE9DSygpIFNFVF9CSVQoU1lTQ0ZHLT5DRkdSMiwgU1lTQ0ZHX0NGR1IyX0VDQ0wpDQotDQotLyoqIEBicmllZiAgU1lTQ0ZHIEJyZWFrIENvcnRleC1NNCBMb2NrdXAgbG9jay4NCi0gKiAgICAgICAgIEVuYWJsZSBhbmQgbG9jayB0aGUgY29ubmVjdGlvbiBvZiBDb3J0ZXgtTTQgTE9DS1VQIChIYXJkZmF1bHQpIG91dHB1dA0KLSAqIHRvIFRJTTEvOC8xNS8xNi8xNyBCcmVhayBpbnB1dC4NCi0gKiBAbm90ZSAgIFRoZSBzZWxlY3RlZCBjb25maWd1cmF0aW9uIGlzIGxvY2tlZCBhbmQgY2FuIGJlIHVubG9ja2VkIG9ubHkgYnkNCi0gKiBzeXN0ZW0gcmVzZXQuDQotICovDQotI2RlZmluZSBfX0hBTF9TWVNDRkdfQlJFQUtfTE9DS1VQX0xPQ0soKSBcDQotICBTRVRfQklUKFNZU0NGRy0+Q0ZHUjIsIFNZU0NGR19DRkdSMl9DTEwpDQotDQotLyoqIEBicmllZiAgU1lTQ0ZHIEJyZWFrIFBWRCBsb2NrLg0KLSAqICAgICAgICAgRW5hYmxlIGFuZCBsb2NrIHRoZSBQVkQgY29ubmVjdGlvbiB0byBUaW1lcjEvOC8xNS8xNi8xNyBCcmVhayBpbnB1dCwNCi0gKiBhcyB3ZWxsIGFzIHRoZSBQVkRFIGFuZCBQTFNbMjowXSBpbiB0aGUgUFdSX0NSMiByZWdpc3Rlci4NCi0gKiBAbm90ZSAgIFRoZSBzZWxlY3RlZCBjb25maWd1cmF0aW9uIGlzIGxvY2tlZCBhbmQgY2FuIGJlIHVubG9ja2VkIG9ubHkgYnkNCi0gKiBzeXN0ZW0gcmVzZXQuDQotICovDQotI2RlZmluZSBfX0hBTF9TWVNDRkdfQlJFQUtfUFZEX0xPQ0soKSBTRVRfQklUKFNZU0NGRy0+Q0ZHUjIsIFNZU0NGR19DRkdSMl9QVkRMKQ0KLQ0KLS8qKiBAYnJpZWYgIFNZU0NGRyBCcmVhayBTUkFNIHBhcml0eSBsb2NrLg0KLSAqICAgICAgICAgRW5hYmxlIGFuZCBsb2NrIHRoZSBTUkFNIHBhcml0eSBlcnJvciAoZmlyc3QgMzJrQiBvZiBTUkFNMSArIENDTQ0KLSAqIFNSQU0pIHNpZ25hbCBjb25uZWN0aW9uIHRvIFRJTTEvOC8xNS8xNi8xNyBCcmVhayBpbnB1dC4NCi0gKiBAbm90ZSAgIFRoZSBzZWxlY3RlZCBjb25maWd1cmF0aW9uIGlzIGxvY2tlZCBhbmQgY2FuIGJlIHVubG9ja2VkIGJ5IHN5c3RlbQ0KLSAqIHJlc2V0Lg0KLSAqLw0KLSNkZWZpbmUgX19IQUxfU1lTQ0ZHX0JSRUFLX1NSQU1QQVJJVFlfTE9DSygpIFwNCi0gIFNFVF9CSVQoU1lTQ0ZHLT5DRkdSMiwgU1lTQ0ZHX0NGR1IyX1NQTCkNCi0NCi0vKiogQGJyaWVmICBDaGVjayBTWVNDRkcgZmxhZyBpcyBzZXQgb3Igbm90Lg0KLSAqIEBwYXJhbSAgX19GTEFHX186IHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4NCi0gKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIEByZWYgU1lTQ0ZHX0ZMQUdfU1JBTV9QRSAgIFNSQU0gUGFyaXR5IEVycm9yIEZsYWcNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBTWVNDRkdfRkxBR19DQ01TUkFNX0JVU1kgQ0NNU1JBTSBFcmFzZSBPbmdvaW5nDQotICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fRkxBR19fIChUUlVFIG9yIEZBTFNFKS4NCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1NZU0NGR19HRVRfRkxBRyhfX0ZMQUdfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKCgoKChfX0ZMQUdfXykgPT0gU1lTQ0ZHX1NDU1JfQ0NNQlNZKSA/IFNZU0NGRy0+U0NTUiA6IFNZU0NGRy0+Q0ZHUjIpICYgXA0KLSAgICAgKF9fRkxBR19fKSkgIT0gMFUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgPyAxVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgIDogMFUpDQotDQotLyoqIEBicmllZiAgU2V0IHRoZSBTUEYgYml0IHRvIGNsZWFyIHRoZSBTUkFNIFBhcml0eSBFcnJvciBGbGFnLg0KLSAqLw0KLSNkZWZpbmUgX19IQUxfU1lTQ0ZHX0NMRUFSX0ZMQUcoKSBTRVRfQklUKFNZU0NGRy0+Q0ZHUjIsIFNZU0NGR19DRkdSMl9TUEYpDQotDQotLyoqIEBicmllZiAgRmFzdC1tb2RlIFBsdXMgZHJpdmluZyBjYXBhYmlsaXR5IGVuYWJsZS9kaXNhYmxlIG1hY3Jvcw0KLSAqIEBwYXJhbSBfX0ZBU1RNT0RFUExVU19fOiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiA6DQotICogICAgIEBhcmcgQHJlZiBTWVNDRkdfRkFTVE1PREVQTFVTX1BCNiBGYXN0LW1vZGUgUGx1cyBkcml2aW5nIGNhcGFiaWxpdHkNCi0gKiBhY3RpdmF0aW9uIG9uIFBCNg0KLSAqICAgICBAYXJnIEByZWYgU1lTQ0ZHX0ZBU1RNT0RFUExVU19QQjcgRmFzdC1tb2RlIFBsdXMgZHJpdmluZyBjYXBhYmlsaXR5DQotICogYWN0aXZhdGlvbiBvbiBQQjcNCi0gKiAgICAgQGFyZyBAcmVmIFNZU0NGR19GQVNUTU9ERVBMVVNfUEI4IEZhc3QtbW9kZSBQbHVzIGRyaXZpbmcgY2FwYWJpbGl0eQ0KLSAqIGFjdGl2YXRpb24gb24gUEI4DQotICogICAgIEBhcmcgQHJlZiBTWVNDRkdfRkFTVE1PREVQTFVTX1BCOSBGYXN0LW1vZGUgUGx1cyBkcml2aW5nIGNhcGFiaWxpdHkNCi0gKiBhY3RpdmF0aW9uIG9uIFBCOQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfU1lTQ0ZHX0ZBU1RNT0RFUExVU19FTkFCTEUoX19GQVNUTU9ERVBMVVNfXykgICAgXA0KLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBhc3NlcnRfcGFyYW0oSVNfU1lTQ0ZHX0ZBU1RNT0RFUExVUygoX19GQVNUTU9ERVBMVVNfXykpKTsgXA0KLSAgICBTRVRfQklUKFNZU0NGRy0+Q0ZHUjEsIChfX0ZBU1RNT0RFUExVU19fKSk7ICAgICAgICAgICAgICAgXA0KLSAgfSB3aGlsZSAoMCkNCi0NCi0jZGVmaW5lIF9fSEFMX1NZU0NGR19GQVNUTU9ERVBMVVNfRElTQUJMRShfX0ZBU1RNT0RFUExVU19fKSAgIFwNCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgYXNzZXJ0X3BhcmFtKElTX1NZU0NGR19GQVNUTU9ERVBMVVMoKF9fRkFTVE1PREVQTFVTX18pKSk7IFwNCi0gICAgQ0xFQVJfQklUKFNZU0NGRy0+Q0ZHUjEsIChfX0ZBU1RNT0RFUExVU19fKSk7ICAgICAgICAgICAgIFwNCi0gIH0gd2hpbGUgKDApDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgU1lTQ0ZHX1ByaXZhdGVfTWFjcm9zIFNZU0NGRyBQcml2YXRlIE1hY3Jvcw0KLSAqIEB7DQotICovDQotDQotI2RlZmluZSBJU19TWVNDRkdfRlBVX0lOVEVSUlVQVChfX0lOVEVSUlVQVF9fKSAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoKChfX0lOVEVSUlVQVF9fKSAmIFNZU0NGR19JVF9GUFVfSU9DKSA9PSBTWVNDRkdfSVRfRlBVX0lPQykgfHwgXA0KLSAgICgoKF9fSU5URVJSVVBUX18pICYgU1lTQ0ZHX0lUX0ZQVV9EWkMpID09IFNZU0NGR19JVF9GUFVfRFpDKSB8fCBcDQotICAgKCgoX19JTlRFUlJVUFRfXykgJiBTWVNDRkdfSVRfRlBVX1VGQykgPT0gU1lTQ0ZHX0lUX0ZQVV9VRkMpIHx8IFwNCi0gICAoKChfX0lOVEVSUlVQVF9fKSAmIFNZU0NGR19JVF9GUFVfT0ZDKSA9PSBTWVNDRkdfSVRfRlBVX09GQykgfHwgXA0KLSAgICgoKF9fSU5URVJSVVBUX18pICYgU1lTQ0ZHX0lUX0ZQVV9JREMpID09IFNZU0NGR19JVF9GUFVfSURDKSB8fCBcDQotICAgKCgoX19JTlRFUlJVUFRfXykgJiBTWVNDRkdfSVRfRlBVX0lYQykgPT0gU1lTQ0ZHX0lUX0ZQVV9JWEMpKQ0KLQ0KLSNkZWZpbmUgSVNfU1lTQ0ZHX0JSRUFLX0NPTkZJRyhfX0NPTkZJR19fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKChfX0NPTkZJR19fKSA9PSBTWVNDRkdfQlJFQUtfRUNDKSB8fCAoKF9fQ09ORklHX18pID09IFNZU0NGR19CUkVBS19QVkQpIHx8IFwNCi0gICAoKF9fQ09ORklHX18pID09IFNZU0NGR19CUkVBS19TUkFNUEFSSVRZKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoX19DT05GSUdfXykgPT0gU1lTQ0ZHX0JSRUFLX0xPQ0tVUCkpDQotDQotI2lmIChDQ01TUkFNX1NJWkUgPT0gMHgwMDAwODAwMFVMKSB8fCAoQ0NNU1JBTV9TSVpFID09IDB4MDAwMDQwMDBVTCkNCi0jZGVmaW5lIElTX1NZU0NGR19DQ01TUkFNV1JQX1BBR0UoX19QQUdFX18pICgoX19QQUdFX18pID4gMFUpDQotI2VsaWYgKENDTVNSQU1fU0laRSA9PSAweDAwMDAyODAwVUwpDQotI2RlZmluZSBJU19TWVNDRkdfQ0NNU1JBTVdSUF9QQUdFKF9fUEFHRV9fKSBcDQotICAoKChfX1BBR0VfXykgPiAwVSkgJiYgKChfX1BBR0VfXykgPD0gMHgwMDAwMDNGRlUpKQ0KLSNlbmRpZiAvKiBDQ01TUkFNX1NJWkUgKi8NCi0NCi0jaWYgZGVmaW5lZChWUkVGQlVGKQ0KLSNkZWZpbmUgSVNfU1lTQ0ZHX1ZSRUZCVUZfVk9MVEFHRV9TQ0FMRShfX1NDQUxFX18pICAgXA0KLSAgKCgoX19TQ0FMRV9fKSA9PSBTWVNDRkdfVlJFRkJVRl9WT0xUQUdFX1NDQUxFMCkgfHwgXA0KLSAgICgoX19TQ0FMRV9fKSA9PSBTWVNDRkdfVlJFRkJVRl9WT0xUQUdFX1NDQUxFMSkgfHwgXA0KLSAgICgoX19TQ0FMRV9fKSA9PSBTWVNDRkdfVlJFRkJVRl9WT0xUQUdFX1NDQUxFMikpDQotDQotI2RlZmluZSBJU19TWVNDRkdfVlJFRkJVRl9ISUdIX0lNUEVEQU5DRShfX1ZBTFVFX18pICAgICAgICAgIFwNCi0gICgoKF9fVkFMVUVfXykgPT0gU1lTQ0ZHX1ZSRUZCVUZfSElHSF9JTVBFREFOQ0VfRElTQUJMRSkgfHwgXA0KLSAgICgoX19WQUxVRV9fKSA9PSBTWVNDRkdfVlJFRkJVRl9ISUdIX0lNUEVEQU5DRV9FTkFCTEUpKQ0KLQ0KLSNkZWZpbmUgSVNfU1lTQ0ZHX1ZSRUZCVUZfVFJJTU1JTkcoX19WQUxVRV9fKSBcDQotICAoKChfX1ZBTFVFX18pID4gMFUpICYmICgoX19WQUxVRV9fKSA8PSBWUkVGQlVGX0NDUl9UUklNKSkNCi0jZW5kaWYgLyogVlJFRkJVRiAqLw0KLQ0KLSNpZiBkZWZpbmVkKFNZU0NGR19GQVNUTU9ERVBMVVNfUEI4KSAmJiBkZWZpbmVkKFNZU0NGR19GQVNUTU9ERVBMVVNfUEI5KQ0KLSNkZWZpbmUgSVNfU1lTQ0ZHX0ZBU1RNT0RFUExVUyhfX1BJTl9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKCgoX19QSU5fXykgJiBTWVNDRkdfRkFTVE1PREVQTFVTX1BCNikgPT0gU1lTQ0ZHX0ZBU1RNT0RFUExVU19QQjYpIHx8IFwNCi0gICAoKChfX1BJTl9fKSAmIFNZU0NGR19GQVNUTU9ERVBMVVNfUEI3KSA9PSBTWVNDRkdfRkFTVE1PREVQTFVTX1BCNykgfHwgXA0KLSAgICgoKF9fUElOX18pICYgU1lTQ0ZHX0ZBU1RNT0RFUExVU19QQjgpID09IFNZU0NGR19GQVNUTU9ERVBMVVNfUEI4KSB8fCBcDQotICAgKCgoX19QSU5fXykgJiBTWVNDRkdfRkFTVE1PREVQTFVTX1BCOSkgPT0gU1lTQ0ZHX0ZBU1RNT0RFUExVU19QQjkpKQ0KLSNlbGlmIGRlZmluZWQoU1lTQ0ZHX0ZBU1RNT0RFUExVU19QQjgpDQotI2RlZmluZSBJU19TWVNDRkdfRkFTVE1PREVQTFVTKF9fUElOX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoKChfX1BJTl9fKSAmIFNZU0NGR19GQVNUTU9ERVBMVVNfUEI2KSA9PSBTWVNDRkdfRkFTVE1PREVQTFVTX1BCNikgfHwgXA0KLSAgICgoKF9fUElOX18pICYgU1lTQ0ZHX0ZBU1RNT0RFUExVU19QQjcpID09IFNZU0NGR19GQVNUTU9ERVBMVVNfUEI3KSB8fCBcDQotICAgKCgoX19QSU5fXykgJiBTWVNDRkdfRkFTVE1PREVQTFVTX1BCOCkgPT0gU1lTQ0ZHX0ZBU1RNT0RFUExVU19QQjgpKQ0KLSNlbGlmIGRlZmluZWQoU1lTQ0ZHX0ZBU1RNT0RFUExVU19QQjkpDQotI2RlZmluZSBJU19TWVNDRkdfRkFTVE1PREVQTFVTKF9fUElOX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoKChfX1BJTl9fKSAmIFNZU0NGR19GQVNUTU9ERVBMVVNfUEI2KSA9PSBTWVNDRkdfRkFTVE1PREVQTFVTX1BCNikgfHwgXA0KLSAgICgoKF9fUElOX18pICYgU1lTQ0ZHX0ZBU1RNT0RFUExVU19QQjcpID09IFNZU0NGR19GQVNUTU9ERVBMVVNfUEI3KSB8fCBcDQotICAgKCgoX19QSU5fXykgJiBTWVNDRkdfRkFTVE1PREVQTFVTX1BCOSkgPT0gU1lTQ0ZHX0ZBU1RNT0RFUExVU19QQjkpKQ0KLSNlbHNlDQotI2RlZmluZSBJU19TWVNDRkdfRkFTVE1PREVQTFVTKF9fUElOX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoKChfX1BJTl9fKSAmIFNZU0NGR19GQVNUTU9ERVBMVVNfUEI2KSA9PSBTWVNDRkdfRkFTVE1PREVQTFVTX1BCNikgfHwgXA0KLSAgICgoKF9fUElOX18pICYgU1lTQ0ZHX0ZBU1RNT0RFUExVU19QQjcpID09IFNZU0NGR19GQVNUTU9ERVBMVVNfUEI3KSkNCi0jZW5kaWYgLyogU1lTQ0ZHX0ZBU1RNT0RFUExVU19QQiAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBIQUxfUHJpdmF0ZV9NYWNyb3MgSEFMIFByaXZhdGUgTWFjcm9zDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIElTX1RJQ0tGUkVRKEZSRVEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKChGUkVRKSA9PSBIQUxfVElDS19GUkVRXzEwSFopIHx8ICgoRlJFUSkgPT0gSEFMX1RJQ0tfRlJFUV8xMDBIWikgfHwgXA0KLSAgICgoRlJFUSkgPT0gSEFMX1RJQ0tfRlJFUV8xS0haKSkNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotDQotLyoqIEBhZGR0b2dyb3VwIEhBTF9FeHBvcnRlZF9GdW5jdGlvbnMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKiBAYWRkdG9ncm91cCBIQUxfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMQ0KLSAqIEB7DQotICovDQotLyogSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0luaXQodm9pZCk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RlSW5pdCh2b2lkKTsNCi12b2lkIEhBTF9Nc3BJbml0KHZvaWQpOw0KLXZvaWQgSEFMX01zcERlSW5pdCh2b2lkKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfSW5pdFRpY2sodWludDMyX3QgVGlja1ByaW9yaXR5KTsNCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAYWRkdG9ncm91cCBIQUxfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBIQUwgQ29udHJvbCBmdW5jdGlvbnMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMNCi0gKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotdm9pZCBIQUxfSW5jVGljayh2b2lkKTsNCi12b2lkIEhBTF9EZWxheSh1aW50MzJfdCBEZWxheSk7DQotdWludDMyX3QgSEFMX0dldFRpY2sodm9pZCk7DQotdWludDMyX3QgSEFMX0dldFRpY2tQcmlvKHZvaWQpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9TZXRUaWNrRnJlcSh1aW50MzJfdCBGcmVxKTsNCi11aW50MzJfdCBIQUxfR2V0VGlja0ZyZXEodm9pZCk7DQotdm9pZCBIQUxfU3VzcGVuZFRpY2sodm9pZCk7DQotdm9pZCBIQUxfUmVzdW1lVGljayh2b2lkKTsNCi11aW50MzJfdCBIQUxfR2V0SGFsVmVyc2lvbih2b2lkKTsNCi11aW50MzJfdCBIQUxfR2V0UkVWSUQodm9pZCk7DQotdWludDMyX3QgSEFMX0dldERFVklEKHZvaWQpOw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBhZGR0b2dyb3VwIEhBTF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzDQotICogQHsNCi0gKi8NCi0NCi0vKiBEQkdNQ1UgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucw0KLSAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXZvaWQgSEFMX0RCR01DVV9FbmFibGVEQkdTbGVlcE1vZGUodm9pZCk7DQotdm9pZCBIQUxfREJHTUNVX0Rpc2FibGVEQkdTbGVlcE1vZGUodm9pZCk7DQotdm9pZCBIQUxfREJHTUNVX0VuYWJsZURCR1N0b3BNb2RlKHZvaWQpOw0KLXZvaWQgSEFMX0RCR01DVV9EaXNhYmxlREJHU3RvcE1vZGUodm9pZCk7DQotdm9pZCBIQUxfREJHTUNVX0VuYWJsZURCR1N0YW5kYnlNb2RlKHZvaWQpOw0KLXZvaWQgSEFMX0RCR01DVV9EaXNhYmxlREJHU3RhbmRieU1vZGUodm9pZCk7DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiBFeHBvcnRlZCB2YXJpYWJsZXMNCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAYWRkdG9ncm91cCBIQUxfRXhwb3J0ZWRfVmFyaWFibGVzDQotICogQHsNCi0gKi8NCi1leHRlcm4gX19JTyB1aW50MzJfdCB1d1RpY2s7DQotZXh0ZXJuIHVpbnQzMl90IHV3VGlja1ByaW87DQotZXh0ZXJuIHVpbnQzMl90IHV3VGlja0ZyZXE7DQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGFkZHRvZ3JvdXAgSEFMX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQNCi0gKiBAew0KLSAqLw0KLQ0KLS8qIFNZU0NGRyBDb250cm9sIGZ1bmN0aW9ucw0KLSAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotdm9pZCBIQUxfU1lTQ0ZHX0NDTVNSQU1FcmFzZSh2b2lkKTsNCi12b2lkIEhBTF9TWVNDRkdfRW5hYmxlTWVtb3J5U3dhcHBpbmdCYW5rKHZvaWQpOw0KLXZvaWQgSEFMX1NZU0NGR19EaXNhYmxlTWVtb3J5U3dhcHBpbmdCYW5rKHZvaWQpOw0KLQ0KLSNpZiBkZWZpbmVkKFZSRUZCVUYpDQotdm9pZCBIQUxfU1lTQ0ZHX1ZSRUZCVUZfVm9sdGFnZVNjYWxpbmdDb25maWcodWludDMyX3QgVm9sdGFnZVNjYWxpbmcpOw0KLXZvaWQgSEFMX1NZU0NGR19WUkVGQlVGX0hpZ2hJbXBlZGFuY2VDb25maWcodWludDMyX3QgTW9kZSk7DQotdm9pZCBIQUxfU1lTQ0ZHX1ZSRUZCVUZfVHJpbW1pbmdDb25maWcodWludDMyX3QgVHJpbW1pbmdWYWx1ZSk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NZU0NGR19FbmFibGVWUkVGQlVGKHZvaWQpOw0KLXZvaWQgSEFMX1NZU0NGR19EaXNhYmxlVlJFRkJVRih2b2lkKTsNCi0jZW5kaWYgLyogVlJFRkJVRiAqLw0KLQ0KLXZvaWQgSEFMX1NZU0NGR19FbmFibGVJT1N3aXRjaEJvb3N0ZXIodm9pZCk7DQotdm9pZCBIQUxfU1lTQ0ZHX0Rpc2FibGVJT1N3aXRjaEJvb3N0ZXIodm9pZCk7DQotdm9pZCBIQUxfU1lTQ0ZHX0VuYWJsZUlPU3dpdGNoVkREKHZvaWQpOw0KLXZvaWQgSEFMX1NZU0NGR19EaXNhYmxlSU9Td2l0Y2hWREQodm9pZCk7DQotDQotdm9pZCBIQUxfU1lTQ0ZHX0NDTVNSQU1fV3JpdGVQcm90ZWN0aW9uRW5hYmxlKHVpbnQzMl90IFBhZ2UpOw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotI2lmZGVmIF9fY3BsdXNwbHVzDQotfQ0KLSNlbmRpZg0KLQ0KLSNlbmRpZiAvKiBTVE0zMkc0eHhfSEFMX0ggKi8NCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBmaWxlICAgIHN0bTMyZzR4eF9oYWwuaAorICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAqIEBicmllZiAgIFRoaXMgZmlsZSBjb250YWlucyBhbGwgdGhlIGZ1bmN0aW9ucyBwcm90b3R5cGVzIGZvciB0aGUgSEFMCisgKiAgICAgICAgICBtb2R1bGUgZHJpdmVyLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGF0dGVudGlvbgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGVybXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZQorICogaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc29mdHdhcmUgY29tcG9uZW50LgorICogSWYgbm8gTElDRU5TRSBmaWxlIGNvbWVzIHdpdGggdGhpcyBzb2Z0d2FyZSwgaXQgaXMgcHJvdmlkZWQgQVMtSVMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyRzR4eF9IQUxfSAorI2RlZmluZSBTVE0zMkc0eHhfSEFMX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzR4eF9oYWxfY29uZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHNHh4X0hBTF9Ecml2ZXIKKyAqIEB7CisgKi8KKworLyoqIEBhZGR0b2dyb3VwIEhBTCBIQUwKKyAqIEB7CisgKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0V4cG9ydGVkX0NvbnN0YW50cyBIQUwgRXhwb3J0ZWQgQ29uc3RhbnRzCisgKiBAeworICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1RJQ0tfRlJFUSBUaWNrIEZyZXF1ZW5jeQorICogQHsKKyAqLworI2RlZmluZSBIQUxfVElDS19GUkVRXzEwSFogMTAwVQorI2RlZmluZSBIQUxfVElDS19GUkVRXzEwMEhaIDEwVQorI2RlZmluZSBIQUxfVElDS19GUkVRXzFLSFogMVUKKyNkZWZpbmUgSEFMX1RJQ0tfRlJFUV9ERUZBVUxUIEhBTF9USUNLX0ZSRVFfMUtIWgorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBTWVNDRkdfRXhwb3J0ZWRfQ29uc3RhbnRzIFNZU0NGRyBFeHBvcnRlZCBDb25zdGFudHMKKyAqIEB7CisgKi8KKworLyoqIEBkZWZncm91cCBTWVNDRkdfQm9vdE1vZGUgQm9vdCBNb2RlCisgKiBAeworICovCisjZGVmaW5lIFNZU0NGR19CT09UX01BSU5GTEFTSCAweDAwMDAwMDAwVQorI2RlZmluZSBTWVNDRkdfQk9PVF9TWVNURU1GTEFTSCBTWVNDRkdfTUVNTUVNUk1QX01PREVfMAorCisjaWYgZGVmaW5lZChGTUNfQkFOSzEpCisjZGVmaW5lIFNZU0NGR19CT09UX0ZNQyBTWVNDRkdfTUVNTUVNUk1QX01PREVfMQorI2VuZGlmIC8qIEZNQ19CQU5LMSAqLworCisjZGVmaW5lIFNZU0NGR19CT09UX1NSQU0gKFNZU0NGR19NRU1NRU1STVBfTU9ERV8xIHwgU1lTQ0ZHX01FTU1FTVJNUF9NT0RFXzApCisKKyNpZiBkZWZpbmVkKFFVQURTUEkpCisjZGVmaW5lIFNZU0NGR19CT09UX1FVQURTUEkgKFNZU0NGR19NRU1NRU1STVBfTU9ERV8yIHwgU1lTQ0ZHX01FTU1FTVJNUF9NT0RFXzEpCisjZW5kaWYgLyogUVVBRFNQSSAqLworCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBTWVNDRkdfRlBVX0ludGVycnVwdHMgRlBVIEludGVycnVwdHMKKyAqIEB7CisgKi8KKyNkZWZpbmUgU1lTQ0ZHX0lUX0ZQVV9JT0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBTWVNDRkdfQ0ZHUjFfRlBVX0lFXzAgLyohPCBGbG9hdGluZyBQb2ludCBVbml0IEludmFsaWQgb3BlcmF0aW9uIEludGVycnVwdCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU1lTQ0ZHX0lUX0ZQVV9EWkMgXAorICBTWVNDRkdfQ0ZHUjFfRlBVX0lFXzEgLyohPCBGbG9hdGluZyBQb2ludCBVbml0IERpdmlkZS1ieS16ZXJvIEludGVycnVwdCAqLworI2RlZmluZSBTWVNDRkdfSVRfRlBVX1VGQyBcCisgIFNZU0NGR19DRkdSMV9GUFVfSUVfMiAvKiE8IEZsb2F0aW5nIFBvaW50IFVuaXQgVW5kZXJmbG93IEludGVycnVwdCAqLworI2RlZmluZSBTWVNDRkdfSVRfRlBVX09GQyBcCisgIFNZU0NGR19DRkdSMV9GUFVfSUVfMyAvKiE8IEZsb2F0aW5nIFBvaW50IFVuaXQgT3ZlcmZsb3cgSW50ZXJydXB0ICovCisjZGVmaW5lIFNZU0NGR19JVF9GUFVfSURDIFwKKyAgU1lTQ0ZHX0NGR1IxX0ZQVV9JRV80IC8qITwgRmxvYXRpbmcgUG9pbnQgVW5pdCBJbnB1dCBkZW5vcm1hbCBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgU1lTQ0ZHX0lUX0ZQVV9JWEMgXAorICBTWVNDRkdfQ0ZHUjFfRlBVX0lFXzUgLyohPCBGbG9hdGluZyBQb2ludCBVbml0IEluZXhhY3QgSW50ZXJydXB0ICovCisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFNZU0NGR19DQ01TUkFNV1JQIENDTSBXcml0ZSBwcm90ZWN0aW9uCisgKiBAeworICovCisjZGVmaW5lIFNZU0NGR19DQ01TUkFNV1JQX1BBR0UwIFwKKyAgU1lTQ0ZHX1NXUFJfUEFHRTAgLyohPCBDQ01TUkFNIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAwICovCisjZGVmaW5lIFNZU0NGR19DQ01TUkFNV1JQX1BBR0UxIFwKKyAgU1lTQ0ZHX1NXUFJfUEFHRTEgLyohPCBDQ01TUkFNIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAxICovCisjZGVmaW5lIFNZU0NGR19DQ01TUkFNV1JQX1BBR0UyIFwKKyAgU1lTQ0ZHX1NXUFJfUEFHRTIgLyohPCBDQ01TUkFNIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAyICovCisjZGVmaW5lIFNZU0NGR19DQ01TUkFNV1JQX1BBR0UzIFwKKyAgU1lTQ0ZHX1NXUFJfUEFHRTMgLyohPCBDQ01TUkFNIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAzICovCisjZGVmaW5lIFNZU0NGR19DQ01TUkFNV1JQX1BBR0U0IFwKKyAgU1lTQ0ZHX1NXUFJfUEFHRTQgLyohPCBDQ01TUkFNIFdyaXRlIHByb3RlY3Rpb24gcGFnZSA0ICovCisjZGVmaW5lIFNZU0NGR19DQ01TUkFNV1JQX1BBR0U1IFwKKyAgU1lTQ0ZHX1NXUFJfUEFHRTUgLyohPCBDQ01TUkFNIFdyaXRlIHByb3RlY3Rpb24gcGFnZSA1ICovCisjZGVmaW5lIFNZU0NGR19DQ01TUkFNV1JQX1BBR0U2IFwKKyAgU1lTQ0ZHX1NXUFJfUEFHRTYgLyohPCBDQ01TUkFNIFdyaXRlIHByb3RlY3Rpb24gcGFnZSA2ICovCisjZGVmaW5lIFNZU0NGR19DQ01TUkFNV1JQX1BBR0U3IFwKKyAgU1lTQ0ZHX1NXUFJfUEFHRTcgLyohPCBDQ01TUkFNIFdyaXRlIHByb3RlY3Rpb24gcGFnZSA3ICovCisjZGVmaW5lIFNZU0NGR19DQ01TUkFNV1JQX1BBR0U4IFwKKyAgU1lTQ0ZHX1NXUFJfUEFHRTggLyohPCBDQ01TUkFNIFdyaXRlIHByb3RlY3Rpb24gcGFnZSA4ICovCisjZGVmaW5lIFNZU0NGR19DQ01TUkFNV1JQX1BBR0U5IFwKKyAgU1lTQ0ZHX1NXUFJfUEFHRTkgLyohPCBDQ01TUkFNIFdyaXRlIHByb3RlY3Rpb24gcGFnZSA5ICovCisjZGVmaW5lIFNZU0NGR19DQ01TUkFNV1JQX1BBR0UxMCBcCisgIFNZU0NGR19TV1BSX1BBR0UxMCAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDEwICovCisjZGVmaW5lIFNZU0NGR19DQ01TUkFNV1JQX1BBR0UxMSBcCisgIFNZU0NGR19TV1BSX1BBR0UxMSAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDExICovCisjZGVmaW5lIFNZU0NGR19DQ01TUkFNV1JQX1BBR0UxMiBcCisgIFNZU0NGR19TV1BSX1BBR0UxMiAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDEyICovCisjZGVmaW5lIFNZU0NGR19DQ01TUkFNV1JQX1BBR0UxMyBcCisgIFNZU0NGR19TV1BSX1BBR0UxMyAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDEzICovCisjZGVmaW5lIFNZU0NGR19DQ01TUkFNV1JQX1BBR0UxNCBcCisgIFNZU0NGR19TV1BSX1BBR0UxNCAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDE0ICovCisjZGVmaW5lIFNZU0NGR19DQ01TUkFNV1JQX1BBR0UxNSBcCisgIFNZU0NGR19TV1BSX1BBR0UxNSAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDE1ICovCisjZGVmaW5lIFNZU0NGR19DQ01TUkFNV1JQX1BBR0UxNiBcCisgIFNZU0NGR19TV1BSX1BBR0UxNiAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDE2ICovCisjZGVmaW5lIFNZU0NGR19DQ01TUkFNV1JQX1BBR0UxNyBcCisgIFNZU0NGR19TV1BSX1BBR0UxNyAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDE3ICovCisjZGVmaW5lIFNZU0NGR19DQ01TUkFNV1JQX1BBR0UxOCBcCisgIFNZU0NGR19TV1BSX1BBR0UxOCAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDE4ICovCisjZGVmaW5lIFNZU0NGR19DQ01TUkFNV1JQX1BBR0UxOSBcCisgIFNZU0NGR19TV1BSX1BBR0UxOSAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDE5ICovCisjZGVmaW5lIFNZU0NGR19DQ01TUkFNV1JQX1BBR0UyMCBcCisgIFNZU0NGR19TV1BSX1BBR0UyMCAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDIwICovCisjZGVmaW5lIFNZU0NGR19DQ01TUkFNV1JQX1BBR0UyMSBcCisgIFNZU0NGR19TV1BSX1BBR0UyMSAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDIxICovCisjZGVmaW5lIFNZU0NGR19DQ01TUkFNV1JQX1BBR0UyMiBcCisgIFNZU0NGR19TV1BSX1BBR0UyMiAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDIyICovCisjZGVmaW5lIFNZU0NGR19DQ01TUkFNV1JQX1BBR0UyMyBcCisgIFNZU0NGR19TV1BSX1BBR0UyMyAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDIzICovCisjZGVmaW5lIFNZU0NGR19DQ01TUkFNV1JQX1BBR0UyNCBcCisgIFNZU0NGR19TV1BSX1BBR0UyNCAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDI0ICovCisjZGVmaW5lIFNZU0NGR19DQ01TUkFNV1JQX1BBR0UyNSBcCisgIFNZU0NGR19TV1BSX1BBR0UyNSAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDI1ICovCisjZGVmaW5lIFNZU0NGR19DQ01TUkFNV1JQX1BBR0UyNiBcCisgIFNZU0NGR19TV1BSX1BBR0UyNiAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDI2ICovCisjZGVmaW5lIFNZU0NGR19DQ01TUkFNV1JQX1BBR0UyNyBcCisgIFNZU0NGR19TV1BSX1BBR0UyNyAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDI3ICovCisjZGVmaW5lIFNZU0NGR19DQ01TUkFNV1JQX1BBR0UyOCBcCisgIFNZU0NGR19TV1BSX1BBR0UyOCAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDI4ICovCisjZGVmaW5lIFNZU0NGR19DQ01TUkFNV1JQX1BBR0UyOSBcCisgIFNZU0NGR19TV1BSX1BBR0UyOSAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDI5ICovCisjZGVmaW5lIFNZU0NGR19DQ01TUkFNV1JQX1BBR0UzMCBcCisgIFNZU0NGR19TV1BSX1BBR0UzMCAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDMwICovCisjZGVmaW5lIFNZU0NGR19DQ01TUkFNV1JQX1BBR0UzMSBcCisgIFNZU0NGR19TV1BSX1BBR0UzMSAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDMxICovCisKKy8qKgorICogQH0KKyAqLworCisjaWYgZGVmaW5lZChWUkVGQlVGKQorLyoqIEBkZWZncm91cCBTWVNDRkdfVlJFRkJVRl9Wb2x0YWdlU2NhbGUgVlJFRkJVRiBWb2x0YWdlIFNjYWxlCisgKiBAeworICovCisjZGVmaW5lIFNZU0NGR19WUkVGQlVGX1ZPTFRBR0VfU0NBTEUwIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBWb2x0YWdlIHJlZmVyZW5jZSBzY2FsZSAwIChWUkVGQlVGX09VVCA9IDIuMDQ4VikgKi8KKyNkZWZpbmUgU1lTQ0ZHX1ZSRUZCVUZfVk9MVEFHRV9TQ0FMRTEgXAorICBWUkVGQlVGX0NTUl9WUlNfMCAvKiE8IFZvbHRhZ2UgcmVmZXJlbmNlIHNjYWxlIDEgKFZSRUZCVUZfT1VUID0gMi41VikgICAqLworI2RlZmluZSBTWVNDRkdfVlJFRkJVRl9WT0xUQUdFX1NDQUxFMiBcCisgIFZSRUZCVUZfQ1NSX1ZSU18xIC8qITwgVm9sdGFnZSByZWZlcmVuY2Ugc2NhbGUgMiAoVlJFRkJVRl9PVVQgPSAyLjlWKSAgICovCisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFNZU0NGR19WUkVGQlVGX0hpZ2hJbXBlZGFuY2UgVlJFRkJVRiBIaWdoIEltcGVkYW5jZQorICogQHsKKyAqLworI2RlZmluZSBTWVNDRkdfVlJFRkJVRl9ISUdIX0lNUEVEQU5DRV9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAweDAwMDAwMDAwVSAvKiE8IFZSRUZfcGx1cyBwaW4gaXMgaW50ZXJuYWxseSBjb25uZWN0ZWQgdG8gVm9sdGFnZSByZWZlcmVuY2UgXAorICAgICAgICAgICAgICAgICBidWZmZXIgb3V0cHV0ICovCisjZGVmaW5lIFNZU0NGR19WUkVGQlVGX0hJR0hfSU1QRURBTkNFX0VOQUJMRSBcCisgIFZSRUZCVUZfQ1NSX0hJWiAvKiE8IFZSRUZfcGx1cyBwaW4gaXMgaGlnaCBpbXBlZGFuY2UgKi8KKworLyoqCisgKiBAfQorICovCisjZW5kaWYgLyogVlJFRkJVRiAqLworCisvKiogQGRlZmdyb3VwIFNZU0NGR19mbGFnc19kZWZpbml0aW9uIEZsYWdzCisgKiBAeworICovCisKKyNkZWZpbmUgU1lTQ0ZHX0ZMQUdfU1JBTV9QRSBcCisgIFNZU0NGR19DRkdSMl9TUEYgLyohPCBTUkFNIHBhcml0eSBlcnJvciAoZmlyc3QgMzJrQiBvZiBTUkFNMSArIENDTSBTUkFNKSAqLworI2RlZmluZSBTWVNDRkdfRkxBR19DQ01TUkFNX0JVU1kgXAorICBTWVNDRkdfU0NTUl9DQ01CU1kgLyohPCBDQ01TUkFNIGJ1c3kgYnkgZXJhc2Ugb3BlcmF0aW9uICovCisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFNZU0NGR19GYXN0TW9kZVBsdXNfR1BJTyBGYXN0LW1vZGUgUGx1cyBvbiBHUElPCisgKiBAeworICovCisKKy8qKiBAYnJpZWYgIEZhc3QtbW9kZSBQbHVzIGRyaXZpbmcgY2FwYWJpbGl0eSBvbiBhIHNwZWNpZmljIEdQSU8KKyAqLworI2RlZmluZSBTWVNDRkdfRkFTVE1PREVQTFVTX1BCNiBcCisgIFNZU0NGR19DRkdSMV9JMkNfUEI2X0ZNUCAvKiE8IEVuYWJsZSBGYXN0LW1vZGUgUGx1cyBvbiBQQjYgKi8KKyNkZWZpbmUgU1lTQ0ZHX0ZBU1RNT0RFUExVU19QQjcgXAorICBTWVNDRkdfQ0ZHUjFfSTJDX1BCN19GTVAgLyohPCBFbmFibGUgRmFzdC1tb2RlIFBsdXMgb24gUEI3ICovCisjaWYgZGVmaW5lZChTWVNDRkdfQ0ZHUjFfSTJDX1BCOF9GTVApCisjZGVmaW5lIFNZU0NGR19GQVNUTU9ERVBMVVNfUEI4IFwKKyAgU1lTQ0ZHX0NGR1IxX0kyQ19QQjhfRk1QIC8qITwgRW5hYmxlIEZhc3QtbW9kZSBQbHVzIG9uIFBCOCAqLworI2VuZGlmICAgICAgICAgICAgICAgICAgICAgLyogU1lTQ0ZHX0NGR1IxX0kyQ19QQjhfRk1QICovCisjaWYgZGVmaW5lZChTWVNDRkdfQ0ZHUjFfSTJDX1BCOV9GTVApCisjZGVmaW5lIFNZU0NGR19GQVNUTU9ERVBMVVNfUEI5IFwKKyAgU1lTQ0ZHX0NGR1IxX0kyQ19QQjlfRk1QIC8qITwgRW5hYmxlIEZhc3QtbW9kZSBQbHVzIG9uIFBCOSAqLworI2VuZGlmICAgICAgICAgICAgICAgICAgICAgLyogU1lTQ0ZHX0NGR1IxX0kyQ19QQjlfRk1QICovCisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgREJHTUNVX0V4cG9ydGVkX01hY3JvcyBEQkdNQ1UgRXhwb3J0ZWQgTWFjcm9zCisgKiBAeworICovCisKKy8qKiBAYnJpZWYgIEZyZWV6ZS9VbmZyZWV6ZSBQZXJpcGhlcmFscyBpbiBEZWJ1ZyBtb2RlCisgKi8KKyNpZiBkZWZpbmVkKERCR01DVV9BUEIxRlpSMV9EQkdfVElNMl9TVE9QKQorI2RlZmluZSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1RJTTIoKSBcCisgIFNFVF9CSVQoREJHTUNVLT5BUEIxRlpSMSwgREJHTUNVX0FQQjFGWlIxX0RCR19USU0yX1NUT1ApCisjZGVmaW5lIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU0yKCkgXAorICBDTEVBUl9CSVQoREJHTUNVLT5BUEIxRlpSMSwgREJHTUNVX0FQQjFGWlIxX0RCR19USU0yX1NUT1ApCisjZW5kaWYgLyogREJHTUNVX0FQQjFGWlIxX0RCR19USU0yX1NUT1AgKi8KKworI2lmIGRlZmluZWQoREJHTUNVX0FQQjFGWlIxX0RCR19USU0zX1NUT1ApCisjZGVmaW5lIF9fSEFMX0RCR01DVV9GUkVFWkVfVElNMygpIFwKKyAgU0VUX0JJVChEQkdNQ1UtPkFQQjFGWlIxLCBEQkdNQ1VfQVBCMUZaUjFfREJHX1RJTTNfU1RPUCkKKyNkZWZpbmUgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTMoKSBcCisgIENMRUFSX0JJVChEQkdNQ1UtPkFQQjFGWlIxLCBEQkdNQ1VfQVBCMUZaUjFfREJHX1RJTTNfU1RPUCkKKyNlbmRpZiAvKiBEQkdNQ1VfQVBCMUZaUjFfREJHX1RJTTNfU1RPUCAqLworCisjaWYgZGVmaW5lZChEQkdNQ1VfQVBCMUZaUjFfREJHX1RJTTRfU1RPUCkKKyNkZWZpbmUgX19IQUxfREJHTUNVX0ZSRUVaRV9USU00KCkgXAorICBTRVRfQklUKERCR01DVS0+QVBCMUZaUjEsIERCR01DVV9BUEIxRlpSMV9EQkdfVElNNF9TVE9QKQorI2RlZmluZSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfVElNNCgpIFwKKyAgQ0xFQVJfQklUKERCR01DVS0+QVBCMUZaUjEsIERCR01DVV9BUEIxRlpSMV9EQkdfVElNNF9TVE9QKQorI2VuZGlmIC8qIERCR01DVV9BUEIxRlpSMV9EQkdfVElNNF9TVE9QICovCisKKyNpZiBkZWZpbmVkKERCR01DVV9BUEIxRlpSMV9EQkdfVElNNV9TVE9QKQorI2RlZmluZSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1RJTTUoKSBcCisgIFNFVF9CSVQoREJHTUNVLT5BUEIxRlpSMSwgREJHTUNVX0FQQjFGWlIxX0RCR19USU01X1NUT1ApCisjZGVmaW5lIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU01KCkgXAorICBDTEVBUl9CSVQoREJHTUNVLT5BUEIxRlpSMSwgREJHTUNVX0FQQjFGWlIxX0RCR19USU01X1NUT1ApCisjZW5kaWYgLyogREJHTUNVX0FQQjFGWlIxX0RCR19USU01X1NUT1AgKi8KKworI2lmIGRlZmluZWQoREJHTUNVX0FQQjFGWlIxX0RCR19USU02X1NUT1ApCisjZGVmaW5lIF9fSEFMX0RCR01DVV9GUkVFWkVfVElNNigpIFwKKyAgU0VUX0JJVChEQkdNQ1UtPkFQQjFGWlIxLCBEQkdNQ1VfQVBCMUZaUjFfREJHX1RJTTZfU1RPUCkKKyNkZWZpbmUgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTYoKSBcCisgIENMRUFSX0JJVChEQkdNQ1UtPkFQQjFGWlIxLCBEQkdNQ1VfQVBCMUZaUjFfREJHX1RJTTZfU1RPUCkKKyNlbmRpZiAvKiBEQkdNQ1VfQVBCMUZaUjFfREJHX1RJTTZfU1RPUCAqLworCisjaWYgZGVmaW5lZChEQkdNQ1VfQVBCMUZaUjFfREJHX1RJTTdfU1RPUCkKKyNkZWZpbmUgX19IQUxfREJHTUNVX0ZSRUVaRV9USU03KCkgXAorICBTRVRfQklUKERCR01DVS0+QVBCMUZaUjEsIERCR01DVV9BUEIxRlpSMV9EQkdfVElNN19TVE9QKQorI2RlZmluZSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfVElNNygpIFwKKyAgQ0xFQVJfQklUKERCR01DVS0+QVBCMUZaUjEsIERCR01DVV9BUEIxRlpSMV9EQkdfVElNN19TVE9QKQorI2VuZGlmIC8qIERCR01DVV9BUEIxRlpSMV9EQkdfVElNN19TVE9QICovCisKKyNpZiBkZWZpbmVkKERCR01DVV9BUEIxRlpSMV9EQkdfUlRDX1NUT1ApCisjZGVmaW5lIF9fSEFMX0RCR01DVV9GUkVFWkVfUlRDKCkgXAorICBTRVRfQklUKERCR01DVS0+QVBCMUZaUjEsIERCR01DVV9BUEIxRlpSMV9EQkdfUlRDX1NUT1ApCisjZGVmaW5lIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9SVEMoKSBcCisgIENMRUFSX0JJVChEQkdNQ1UtPkFQQjFGWlIxLCBEQkdNQ1VfQVBCMUZaUjFfREJHX1JUQ19TVE9QKQorI2VuZGlmIC8qIERCR01DVV9BUEIxRlpSMV9EQkdfUlRDX1NUT1AgKi8KKworI2lmIGRlZmluZWQoREJHTUNVX0FQQjFGWlIxX0RCR19XV0RHX1NUT1ApCisjZGVmaW5lIF9fSEFMX0RCR01DVV9GUkVFWkVfV1dERygpIFwKKyAgU0VUX0JJVChEQkdNQ1UtPkFQQjFGWlIxLCBEQkdNQ1VfQVBCMUZaUjFfREJHX1dXREdfU1RPUCkKKyNkZWZpbmUgX19IQUxfREJHTUNVX1VORlJFRVpFX1dXREcoKSBcCisgIENMRUFSX0JJVChEQkdNQ1UtPkFQQjFGWlIxLCBEQkdNQ1VfQVBCMUZaUjFfREJHX1dXREdfU1RPUCkKKyNlbmRpZiAvKiBEQkdNQ1VfQVBCMUZaUjFfREJHX1dXREdfU1RPUCAqLworCisjaWYgZGVmaW5lZChEQkdNQ1VfQVBCMUZaUjFfREJHX0lXREdfU1RPUCkKKyNkZWZpbmUgX19IQUxfREJHTUNVX0ZSRUVaRV9JV0RHKCkgXAorICBTRVRfQklUKERCR01DVS0+QVBCMUZaUjEsIERCR01DVV9BUEIxRlpSMV9EQkdfSVdER19TVE9QKQorI2RlZmluZSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfSVdERygpIFwKKyAgQ0xFQVJfQklUKERCR01DVS0+QVBCMUZaUjEsIERCR01DVV9BUEIxRlpSMV9EQkdfSVdER19TVE9QKQorI2VuZGlmIC8qIERCR01DVV9BUEIxRlpSMV9EQkdfSVdER19TVE9QICovCisKKyNpZiBkZWZpbmVkKERCR01DVV9BUEIxRlpSMV9EQkdfSTJDMV9TVE9QKQorI2RlZmluZSBfX0hBTF9EQkdNQ1VfRlJFRVpFX0kyQzFfVElNRU9VVCgpIFwKKyAgU0VUX0JJVChEQkdNQ1UtPkFQQjFGWlIxLCBEQkdNQ1VfQVBCMUZaUjFfREJHX0kyQzFfU1RPUCkKKyNkZWZpbmUgX19IQUxfREJHTUNVX1VORlJFRVpFX0kyQzFfVElNRU9VVCgpIFwKKyAgQ0xFQVJfQklUKERCR01DVS0+QVBCMUZaUjEsIERCR01DVV9BUEIxRlpSMV9EQkdfSTJDMV9TVE9QKQorI2VuZGlmIC8qIERCR01DVV9BUEIxRlpSMV9EQkdfSTJDMV9TVE9QICovCisKKyNpZiBkZWZpbmVkKERCR01DVV9BUEIxRlpSMV9EQkdfSTJDMl9TVE9QKQorI2RlZmluZSBfX0hBTF9EQkdNQ1VfRlJFRVpFX0kyQzJfVElNRU9VVCgpIFwKKyAgU0VUX0JJVChEQkdNQ1UtPkFQQjFGWlIxLCBEQkdNQ1VfQVBCMUZaUjFfREJHX0kyQzJfU1RPUCkKKyNkZWZpbmUgX19IQUxfREJHTUNVX1VORlJFRVpFX0kyQzJfVElNRU9VVCgpIFwKKyAgQ0xFQVJfQklUKERCR01DVS0+QVBCMUZaUjEsIERCR01DVV9BUEIxRlpSMV9EQkdfSTJDMl9TVE9QKQorI2VuZGlmIC8qIERCR01DVV9BUEIxRlpSMV9EQkdfSTJDMl9TVE9QICovCisKKyNpZiBkZWZpbmVkKERCR01DVV9BUEIxRlpSMV9EQkdfSTJDM19TVE9QKQorI2RlZmluZSBfX0hBTF9EQkdNQ1VfRlJFRVpFX0kyQzNfVElNRU9VVCgpIFwKKyAgU0VUX0JJVChEQkdNQ1UtPkFQQjFGWlIxLCBEQkdNQ1VfQVBCMUZaUjFfREJHX0kyQzNfU1RPUCkKKyNkZWZpbmUgX19IQUxfREJHTUNVX1VORlJFRVpFX0kyQzNfVElNRU9VVCgpIFwKKyAgQ0xFQVJfQklUKERCR01DVS0+QVBCMUZaUjEsIERCR01DVV9BUEIxRlpSMV9EQkdfSTJDM19TVE9QKQorI2VuZGlmIC8qIERCR01DVV9BUEIxRlpSMV9EQkdfSTJDM19TVE9QICovCisKKyNpZiBkZWZpbmVkKERCR01DVV9BUEIxRlpSMV9EQkdfTFBUSU0xX1NUT1ApCisjZGVmaW5lIF9fSEFMX0RCR01DVV9GUkVFWkVfTFBUSU0xKCkgXAorICBTRVRfQklUKERCR01DVS0+QVBCMUZaUjEsIERCR01DVV9BUEIxRlpSMV9EQkdfTFBUSU0xX1NUT1ApCisjZGVmaW5lIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9MUFRJTTEoKSBcCisgIENMRUFSX0JJVChEQkdNQ1UtPkFQQjFGWlIxLCBEQkdNQ1VfQVBCMUZaUjFfREJHX0xQVElNMV9TVE9QKQorI2VuZGlmIC8qIERCR01DVV9BUEIxRlpSMV9EQkdfTFBUSU0xX1NUT1AgKi8KKworI2lmIGRlZmluZWQoREJHTUNVX0FQQjFGWlIyX0RCR19JMkM0X1NUT1ApCisjZGVmaW5lIF9fSEFMX0RCR01DVV9GUkVFWkVfSTJDNF9USU1FT1VUKCkgXAorICBTRVRfQklUKERCR01DVS0+QVBCMUZaUjIsIERCR01DVV9BUEIxRlpSMl9EQkdfSTJDNF9TVE9QKQorI2RlZmluZSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfSTJDNF9USU1FT1VUKCkgXAorICBDTEVBUl9CSVQoREJHTUNVLT5BUEIxRlpSMiwgREJHTUNVX0FQQjFGWlIyX0RCR19JMkM0X1NUT1ApCisjZW5kaWYgLyogREJHTUNVX0FQQjFGWlIyX0RCR19JMkM0X1NUT1AgKi8KKworI2lmIGRlZmluZWQoREJHTUNVX0FQQjJGWl9EQkdfVElNMV9TVE9QKQorI2RlZmluZSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1RJTTEoKSBcCisgIFNFVF9CSVQoREJHTUNVLT5BUEIyRlosIERCR01DVV9BUEIyRlpfREJHX1RJTTFfU1RPUCkKKyNkZWZpbmUgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTEoKSBcCisgIENMRUFSX0JJVChEQkdNQ1UtPkFQQjJGWiwgREJHTUNVX0FQQjJGWl9EQkdfVElNMV9TVE9QKQorI2VuZGlmIC8qIERCR01DVV9BUEIyRlpfREJHX1RJTTFfU1RPUCAqLworCisjaWYgZGVmaW5lZChEQkdNQ1VfQVBCMkZaX0RCR19USU04X1NUT1ApCisjZGVmaW5lIF9fSEFMX0RCR01DVV9GUkVFWkVfVElNOCgpIFwKKyAgU0VUX0JJVChEQkdNQ1UtPkFQQjJGWiwgREJHTUNVX0FQQjJGWl9EQkdfVElNOF9TVE9QKQorI2RlZmluZSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfVElNOCgpIFwKKyAgQ0xFQVJfQklUKERCR01DVS0+QVBCMkZaLCBEQkdNQ1VfQVBCMkZaX0RCR19USU04X1NUT1ApCisjZW5kaWYgLyogREJHTUNVX0FQQjJGWl9EQkdfVElNOF9TVE9QICovCisKKyNpZiBkZWZpbmVkKERCR01DVV9BUEIyRlpfREJHX1RJTTE1X1NUT1ApCisjZGVmaW5lIF9fSEFMX0RCR01DVV9GUkVFWkVfVElNMTUoKSBcCisgIFNFVF9CSVQoREJHTUNVLT5BUEIyRlosIERCR01DVV9BUEIyRlpfREJHX1RJTTE1X1NUT1ApCisjZGVmaW5lIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU0xNSgpIFwKKyAgQ0xFQVJfQklUKERCR01DVS0+QVBCMkZaLCBEQkdNQ1VfQVBCMkZaX0RCR19USU0xNV9TVE9QKQorI2VuZGlmIC8qIERCR01DVV9BUEIyRlpfREJHX1RJTTE1X1NUT1AgKi8KKworI2lmIGRlZmluZWQoREJHTUNVX0FQQjJGWl9EQkdfVElNMTZfU1RPUCkKKyNkZWZpbmUgX19IQUxfREJHTUNVX0ZSRUVaRV9USU0xNigpIFwKKyAgU0VUX0JJVChEQkdNQ1UtPkFQQjJGWiwgREJHTUNVX0FQQjJGWl9EQkdfVElNMTZfU1RPUCkKKyNkZWZpbmUgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTE2KCkgXAorICBDTEVBUl9CSVQoREJHTUNVLT5BUEIyRlosIERCR01DVV9BUEIyRlpfREJHX1RJTTE2X1NUT1ApCisjZW5kaWYgLyogREJHTUNVX0FQQjJGWl9EQkdfVElNMTZfU1RPUCAqLworCisjaWYgZGVmaW5lZChEQkdNQ1VfQVBCMkZaX0RCR19USU0xN19TVE9QKQorI2RlZmluZSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1RJTTE3KCkgXAorICBTRVRfQklUKERCR01DVS0+QVBCMkZaLCBEQkdNQ1VfQVBCMkZaX0RCR19USU0xN19TVE9QKQorI2RlZmluZSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfVElNMTcoKSBcCisgIENMRUFSX0JJVChEQkdNQ1UtPkFQQjJGWiwgREJHTUNVX0FQQjJGWl9EQkdfVElNMTdfU1RPUCkKKyNlbmRpZiAvKiBEQkdNQ1VfQVBCMkZaX0RCR19USU0xN19TVE9QICovCisKKyNpZiBkZWZpbmVkKERCR01DVV9BUEIyRlpfREJHX1RJTTIwX1NUT1ApCisjZGVmaW5lIF9fSEFMX0RCR01DVV9GUkVFWkVfVElNMjAoKSBcCisgIFNFVF9CSVQoREJHTUNVLT5BUEIyRlosIERCR01DVV9BUEIyRlpfREJHX1RJTTIwX1NUT1ApCisjZGVmaW5lIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU0yMCgpIFwKKyAgQ0xFQVJfQklUKERCR01DVS0+QVBCMkZaLCBEQkdNQ1VfQVBCMkZaX0RCR19USU0yMF9TVE9QKQorI2VuZGlmIC8qIERCR01DVV9BUEIyRlpfREJHX1RJTTIwX1NUT1AgKi8KKworI2lmIGRlZmluZWQoREJHTUNVX0FQQjJGWl9EQkdfSFJUSU0xX1NUT1ApCisjZGVmaW5lIF9fSEFMX0RCR01DVV9GUkVFWkVfSFJUSU0xKCkgXAorICBTRVRfQklUKERCR01DVS0+QVBCMkZaLCBEQkdNQ1VfQVBCMkZaX0RCR19IUlRJTTFfU1RPUCkKKyNkZWZpbmUgX19IQUxfREJHTUNVX1VORlJFRVpFX0hSVElNMSgpIFwKKyAgQ0xFQVJfQklUKERCR01DVS0+QVBCMkZaLCBEQkdNQ1VfQVBCMkZaX0RCR19IUlRJTTFfU1RPUCkKKyNlbmRpZiAvKiBEQkdNQ1VfQVBCMkZaX0RCR19IUlRJTTFfU1RPUCAqLworCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBTWVNDRkdfRXhwb3J0ZWRfTWFjcm9zIFNZU0NGRyBFeHBvcnRlZCBNYWNyb3MKKyAqIEB7CisgKi8KKworLyoqIEBicmllZiAgTWFpbiBGbGFzaCBtZW1vcnkgbWFwcGVkIGF0IDB4MDAwMDAwMDAuCisgKi8KKyNkZWZpbmUgX19IQUxfU1lTQ0ZHX1JFTUFQTUVNT1JZX0ZMQVNIKCkgXAorICBDTEVBUl9CSVQoU1lTQ0ZHLT5NRU1STVAsIFNZU0NGR19NRU1STVBfTUVNX01PREUpCisKKy8qKiBAYnJpZWYgIFN5c3RlbSBGbGFzaCBtZW1vcnkgbWFwcGVkIGF0IDB4MDAwMDAwMDAuCisgKi8KKyNkZWZpbmUgX19IQUxfU1lTQ0ZHX1JFTUFQTUVNT1JZX1NZU1RFTUZMQVNIKCkgXAorICBNT0RJRllfUkVHKFNZU0NGRy0+TUVNUk1QLCBTWVNDRkdfTUVNUk1QX01FTV9NT0RFLCBTWVNDRkdfTUVNUk1QX01FTV9NT0RFXzApCisKKy8qKiBAYnJpZWYgIEVtYmVkZGVkIFNSQU0gbWFwcGVkIGF0IDB4MDAwMDAwMDAuCisgKi8KKyNkZWZpbmUgX19IQUxfU1lTQ0ZHX1JFTUFQTUVNT1JZX1NSQU0oKSAgICAgICAgICAgICAgXAorICBNT0RJRllfUkVHKFNZU0NGRy0+TUVNUk1QLCBTWVNDRkdfTUVNUk1QX01FTV9NT0RFLCBcCisgICAgICAgICAgICAgKFNZU0NGR19NRU1STVBfTUVNX01PREVfMSB8IFNZU0NGR19NRU1STVBfTUVNX01PREVfMCkpCisKKyNpZiBkZWZpbmVkKEZNQ19CQU5LMSkKKy8qKiBAYnJpZWYgIEZNQyBCYW5rMSAoTk9SL1BTUkFNIDEgYW5kIDIpIG1hcHBlZCBhdCAweDAwMDAwMDAwLgorICovCisjZGVmaW5lIF9fSEFMX1NZU0NGR19SRU1BUE1FTU9SWV9GTUMoKSBcCisgIE1PRElGWV9SRUcoU1lTQ0ZHLT5NRU1STVAsIFNZU0NGR19NRU1STVBfTUVNX01PREUsIFNZU0NGR19NRU1STVBfTUVNX01PREVfMSkKKyNlbmRpZiAvKiBGTUNfQkFOSzEgKi8KKworI2lmIGRlZmluZWQoUVVBRFNQSSkKKy8qKiBAYnJpZWYgIFFVQURTUEkgbWFwcGVkIGF0IDB4MDAwMDAwMDAuCisgKi8KKyNkZWZpbmUgX19IQUxfU1lTQ0ZHX1JFTUFQTUVNT1JZX1FVQURTUEkoKSAgICAgICAgICAgXAorICBNT0RJRllfUkVHKFNZU0NGRy0+TUVNUk1QLCBTWVNDRkdfTUVNUk1QX01FTV9NT0RFLCBcCisgICAgICAgICAgICAgKFNZU0NGR19NRU1STVBfTUVNX01PREVfMiB8IFNZU0NGR19NRU1STVBfTUVNX01PREVfMSkpCisjZW5kaWYgLyogUVVBRFNQSSAqLworCisvKioKKyAqIEBicmllZiAgUmV0dXJuIHRoZSBib290IG1vZGUgYXMgY29uZmlndXJlZCBieSB1c2VyLgorICogQHJldHZhbCBUaGUgYm9vdCBtb2RlIGFzIGNvbmZpZ3VyZWQgYnkgdXNlci4gVGhlIHJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUKKyAqICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgQGFyZyBAcmVmIFNZU0NGR19CT09UX01BSU5GTEFTSAorICogICAgICAgICAgIEBhcmcgQHJlZiBTWVNDRkdfQk9PVF9TWVNURU1GTEFTSAorICogICAgICAgICAgIEBhcmcgQHJlZiBTWVNDRkdfQk9PVF9GTUMgKCopCisgKiAgICAgICAgICAgQGFyZyBAcmVmIFNZU0NGR19CT09UX1FVQURTUEkgKCopCisgKiAgICAgICAgICAgQGFyZyBAcmVmIFNZU0NGR19CT09UX1NSQU0KKyAqIEBub3RlICAgKCopIGF2YWlsYWJpbGl0eSBkZXBlbmRzIG9uIGRldmljZXMKKyAqLworI2RlZmluZSBfX0hBTF9TWVNDRkdfR0VUX0JPT1RfTU9ERSgpIFwKKyAgUkVBRF9CSVQoU1lTQ0ZHLT5NRU1STVAsIFNZU0NGR19NRU1STVBfTUVNX01PREUpCisKKy8qKiBAYnJpZWYgIENDTVNSQU0gcGFnZSB3cml0ZSBwcm90ZWN0aW9uIGVuYWJsZSBtYWNybworICogQHBhcmFtIF9fQ0NNU1JBTVdSUF9fOiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmCisgKiBTWVNDRkdfQ0NNU1JBTVdSUAorICogQG5vdGUgICB3cml0ZSBwcm90ZWN0aW9uIGNhbiBvbmx5IGJlIGRpc2FibGVkIGJ5IGEgc3lzdGVtIHJlc2V0CisgKiBAcmV0dmFsIE5vbmUKKyAqLworLyogTGVnYWN5IGRlZmluZSAqLworI2RlZmluZSBfX0hBTF9TWVNDRkdfQ0NNU1JBTV9XUlBfMV8zMV9FTkFCTEUgXAorICBfX0hBTF9TWVNDRkdfQ0NNU1JBTV9XUlBfMF8zMV9FTkFCTEUKKyNkZWZpbmUgX19IQUxfU1lTQ0ZHX0NDTVNSQU1fV1JQXzBfMzFfRU5BQkxFKF9fQ0NNU1JBTVdSUF9fKSAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhc3NlcnRfcGFyYW0oSVNfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRSgoX19DQ01TUkFNV1JQX18pKSk7IFwKKyAgICBTRVRfQklUKFNZU0NGRy0+U1dQUiwgKF9fQ0NNU1JBTVdSUF9fKSk7ICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworLyoqIEBicmllZiAgQ0NNU1JBTSBwYWdlIHdyaXRlIHByb3RlY3Rpb24gdW5sb2NrIHByaW9yIHRvIGVyYXNlCisgKiBAbm90ZSAgIFdyaXRpbmcgYSB3cm9uZyBrZXkgcmVhY3RpdmF0ZXMgdGhlIHdyaXRlIHByb3RlY3Rpb24KKyAqLworI2RlZmluZSBfX0hBTF9TWVNDRkdfQ0NNU1JBTV9XUlBfVU5MT0NLKCkgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFNZU0NGRy0+U0tSID0gMHhDQTsgICAgICAgICAgICAgICAgICAgXAorICAgIFNZU0NGRy0+U0tSID0gMHg1MzsgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisvKiogQGJyaWVmICBDQ01TUkFNIGVyYXNlCisgKiBAbm90ZSAgIF9fU1lTQ0ZHX0dFVF9GTEFHKFNZU0NGR19GTEFHX0NDTVNSQU1fQlVTWSkgbWF5IGJlIHVzZWQgdG8gY2hlY2sgZW5kCisgKiBvZiBlcmFzZQorICovCisjZGVmaW5lIF9fSEFMX1NZU0NGR19DQ01TUkFNX0VSQVNFKCkgU0VUX0JJVChTWVNDRkctPlNDU1IsIFNZU0NGR19TQ1NSX0NDTUVSKQorCisvKiogQGJyaWVmICBGbG9hdGluZyBQb2ludCBVbml0IGludGVycnVwdCBlbmFibGUvZGlzYWJsZSBtYWNyb3MKKyAqIEBwYXJhbSBfX0lOVEVSUlVQVF9fOiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmCisgKiBTWVNDRkdfRlBVX0ludGVycnVwdHMKKyAqLworI2RlZmluZSBfX0hBTF9TWVNDRkdfRlBVX0lOVEVSUlVQVF9FTkFCTEUoX19JTlRFUlJVUFRfXykgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFzc2VydF9wYXJhbShJU19TWVNDRkdfRlBVX0lOVEVSUlVQVCgoX19JTlRFUlJVUFRfXykpKTsgXAorICAgIFNFVF9CSVQoU1lTQ0ZHLT5DRkdSMSwgKF9fSU5URVJSVVBUX18pKTsgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIF9fSEFMX1NZU0NGR19GUFVfSU5URVJSVVBUX0RJU0FCTEUoX19JTlRFUlJVUFRfXykgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXNzZXJ0X3BhcmFtKElTX1NZU0NGR19GUFVfSU5URVJSVVBUKChfX0lOVEVSUlVQVF9fKSkpOyBcCisgICAgQ0xFQVJfQklUKFNZU0NGRy0+Q0ZHUjEsIChfX0lOVEVSUlVQVF9fKSk7ICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKy8qKiBAYnJpZWYgIFNZU0NGRyBCcmVhayBFQ0MgbG9jay4KKyAqICAgICAgICAgRW5hYmxlIGFuZCBsb2NrIHRoZSBjb25uZWN0aW9uIG9mIEZsYXNoIEVDQyBlcnJvciBjb25uZWN0aW9uIHRvCisgKiBUSU0xLzgvMTUvMTYvMTcgQnJlYWsgaW5wdXQuCisgKiBAbm90ZSAgIFRoZSBzZWxlY3RlZCBjb25maWd1cmF0aW9uIGlzIGxvY2tlZCBhbmQgY2FuIGJlIHVubG9ja2VkIG9ubHkgYnkKKyAqIHN5c3RlbSByZXNldC4KKyAqLworI2RlZmluZSBfX0hBTF9TWVNDRkdfQlJFQUtfRUNDX0xPQ0soKSBTRVRfQklUKFNZU0NGRy0+Q0ZHUjIsIFNZU0NGR19DRkdSMl9FQ0NMKQorCisvKiogQGJyaWVmICBTWVNDRkcgQnJlYWsgQ29ydGV4LU00IExvY2t1cCBsb2NrLgorICogICAgICAgICBFbmFibGUgYW5kIGxvY2sgdGhlIGNvbm5lY3Rpb24gb2YgQ29ydGV4LU00IExPQ0tVUCAoSGFyZGZhdWx0KSBvdXRwdXQKKyAqIHRvIFRJTTEvOC8xNS8xNi8xNyBCcmVhayBpbnB1dC4KKyAqIEBub3RlICAgVGhlIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24gaXMgbG9ja2VkIGFuZCBjYW4gYmUgdW5sb2NrZWQgb25seSBieQorICogc3lzdGVtIHJlc2V0LgorICovCisjZGVmaW5lIF9fSEFMX1NZU0NGR19CUkVBS19MT0NLVVBfTE9DSygpIFwKKyAgU0VUX0JJVChTWVNDRkctPkNGR1IyLCBTWVNDRkdfQ0ZHUjJfQ0xMKQorCisvKiogQGJyaWVmICBTWVNDRkcgQnJlYWsgUFZEIGxvY2suCisgKiAgICAgICAgIEVuYWJsZSBhbmQgbG9jayB0aGUgUFZEIGNvbm5lY3Rpb24gdG8gVGltZXIxLzgvMTUvMTYvMTcgQnJlYWsgaW5wdXQsCisgKiBhcyB3ZWxsIGFzIHRoZSBQVkRFIGFuZCBQTFNbMjowXSBpbiB0aGUgUFdSX0NSMiByZWdpc3Rlci4KKyAqIEBub3RlICAgVGhlIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24gaXMgbG9ja2VkIGFuZCBjYW4gYmUgdW5sb2NrZWQgb25seSBieQorICogc3lzdGVtIHJlc2V0LgorICovCisjZGVmaW5lIF9fSEFMX1NZU0NGR19CUkVBS19QVkRfTE9DSygpIFNFVF9CSVQoU1lTQ0ZHLT5DRkdSMiwgU1lTQ0ZHX0NGR1IyX1BWREwpCisKKy8qKiBAYnJpZWYgIFNZU0NGRyBCcmVhayBTUkFNIHBhcml0eSBsb2NrLgorICogICAgICAgICBFbmFibGUgYW5kIGxvY2sgdGhlIFNSQU0gcGFyaXR5IGVycm9yIChmaXJzdCAzMmtCIG9mIFNSQU0xICsgQ0NNCisgKiBTUkFNKSBzaWduYWwgY29ubmVjdGlvbiB0byBUSU0xLzgvMTUvMTYvMTcgQnJlYWsgaW5wdXQuCisgKiBAbm90ZSAgIFRoZSBzZWxlY3RlZCBjb25maWd1cmF0aW9uIGlzIGxvY2tlZCBhbmQgY2FuIGJlIHVubG9ja2VkIGJ5IHN5c3RlbQorICogcmVzZXQuCisgKi8KKyNkZWZpbmUgX19IQUxfU1lTQ0ZHX0JSRUFLX1NSQU1QQVJJVFlfTE9DSygpIFwKKyAgU0VUX0JJVChTWVNDRkctPkNGR1IyLCBTWVNDRkdfQ0ZHUjJfU1BMKQorCisvKiogQGJyaWVmICBDaGVjayBTWVNDRkcgZmxhZyBpcyBzZXQgb3Igbm90LgorICogQHBhcmFtICBfX0ZMQUdfXzogc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNoZWNrLgorICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIEByZWYgU1lTQ0ZHX0ZMQUdfU1JBTV9QRSAgIFNSQU0gUGFyaXR5IEVycm9yIEZsYWcKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFNZU0NGR19GTEFHX0NDTVNSQU1fQlVTWSBDQ01TUkFNIEVyYXNlIE9uZ29pbmcKKyAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0ZMQUdfXyAoVFJVRSBvciBGQUxTRSkuCisgKi8KKyNkZWZpbmUgX19IQUxfU1lTQ0ZHX0dFVF9GTEFHKF9fRkxBR19fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoKCgoX19GTEFHX18pID09IFNZU0NGR19TQ1NSX0NDTUJTWSkgPyBTWVNDRkctPlNDU1IgOiBTWVNDRkctPkNGR1IyKSAmIFwKKyAgICAgKF9fRkxBR19fKSkgIT0gMFUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICA/IDFVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICA6IDBVKQorCisvKiogQGJyaWVmICBTZXQgdGhlIFNQRiBiaXQgdG8gY2xlYXIgdGhlIFNSQU0gUGFyaXR5IEVycm9yIEZsYWcuCisgKi8KKyNkZWZpbmUgX19IQUxfU1lTQ0ZHX0NMRUFSX0ZMQUcoKSBTRVRfQklUKFNZU0NGRy0+Q0ZHUjIsIFNZU0NGR19DRkdSMl9TUEYpCisKKy8qKiBAYnJpZWYgIEZhc3QtbW9kZSBQbHVzIGRyaXZpbmcgY2FwYWJpbGl0eSBlbmFibGUvZGlzYWJsZSBtYWNyb3MKKyAqIEBwYXJhbSBfX0ZBU1RNT0RFUExVU19fOiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiA6CisgKiAgICAgQGFyZyBAcmVmIFNZU0NGR19GQVNUTU9ERVBMVVNfUEI2IEZhc3QtbW9kZSBQbHVzIGRyaXZpbmcgY2FwYWJpbGl0eQorICogYWN0aXZhdGlvbiBvbiBQQjYKKyAqICAgICBAYXJnIEByZWYgU1lTQ0ZHX0ZBU1RNT0RFUExVU19QQjcgRmFzdC1tb2RlIFBsdXMgZHJpdmluZyBjYXBhYmlsaXR5CisgKiBhY3RpdmF0aW9uIG9uIFBCNworICogICAgIEBhcmcgQHJlZiBTWVNDRkdfRkFTVE1PREVQTFVTX1BCOCBGYXN0LW1vZGUgUGx1cyBkcml2aW5nIGNhcGFiaWxpdHkKKyAqIGFjdGl2YXRpb24gb24gUEI4CisgKiAgICAgQGFyZyBAcmVmIFNZU0NGR19GQVNUTU9ERVBMVVNfUEI5IEZhc3QtbW9kZSBQbHVzIGRyaXZpbmcgY2FwYWJpbGl0eQorICogYWN0aXZhdGlvbiBvbiBQQjkKKyAqLworI2RlZmluZSBfX0hBTF9TWVNDRkdfRkFTVE1PREVQTFVTX0VOQUJMRShfX0ZBU1RNT0RFUExVU19fKSAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhc3NlcnRfcGFyYW0oSVNfU1lTQ0ZHX0ZBU1RNT0RFUExVUygoX19GQVNUTU9ERVBMVVNfXykpKTsgXAorICAgIFNFVF9CSVQoU1lTQ0ZHLT5DRkdSMSwgKF9fRkFTVE1PREVQTFVTX18pKTsgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgX19IQUxfU1lTQ0ZHX0ZBU1RNT0RFUExVU19ESVNBQkxFKF9fRkFTVE1PREVQTFVTX18pICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXNzZXJ0X3BhcmFtKElTX1NZU0NGR19GQVNUTU9ERVBMVVMoKF9fRkFTVE1PREVQTFVTX18pKSk7IFwKKyAgICBDTEVBUl9CSVQoU1lTQ0ZHLT5DRkdSMSwgKF9fRkFTVE1PREVQTFVTX18pKTsgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisvKioKKyAqIEB9CisgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgU1lTQ0ZHX1ByaXZhdGVfTWFjcm9zIFNZU0NGRyBQcml2YXRlIE1hY3JvcworICogQHsKKyAqLworCisjZGVmaW5lIElTX1NZU0NGR19GUFVfSU5URVJSVVBUKF9fSU5URVJSVVBUX18pICAgICAgICAgICAgICAgICAgICAgXAorICAoKCgoX19JTlRFUlJVUFRfXykgJiBTWVNDRkdfSVRfRlBVX0lPQykgPT0gU1lTQ0ZHX0lUX0ZQVV9JT0MpIHx8IFwKKyAgICgoKF9fSU5URVJSVVBUX18pICYgU1lTQ0ZHX0lUX0ZQVV9EWkMpID09IFNZU0NGR19JVF9GUFVfRFpDKSB8fCBcCisgICAoKChfX0lOVEVSUlVQVF9fKSAmIFNZU0NGR19JVF9GUFVfVUZDKSA9PSBTWVNDRkdfSVRfRlBVX1VGQykgfHwgXAorICAgKCgoX19JTlRFUlJVUFRfXykgJiBTWVNDRkdfSVRfRlBVX09GQykgPT0gU1lTQ0ZHX0lUX0ZQVV9PRkMpIHx8IFwKKyAgICgoKF9fSU5URVJSVVBUX18pICYgU1lTQ0ZHX0lUX0ZQVV9JREMpID09IFNZU0NGR19JVF9GUFVfSURDKSB8fCBcCisgICAoKChfX0lOVEVSUlVQVF9fKSAmIFNZU0NGR19JVF9GUFVfSVhDKSA9PSBTWVNDRkdfSVRfRlBVX0lYQykpCisKKyNkZWZpbmUgSVNfU1lTQ0ZHX0JSRUFLX0NPTkZJRyhfX0NPTkZJR19fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKF9fQ09ORklHX18pID09IFNZU0NGR19CUkVBS19FQ0MpIHx8ICgoX19DT05GSUdfXykgPT0gU1lTQ0ZHX0JSRUFLX1BWRCkgfHwgXAorICAgKChfX0NPTkZJR19fKSA9PSBTWVNDRkdfQlJFQUtfU1JBTVBBUklUWSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoX19DT05GSUdfXykgPT0gU1lTQ0ZHX0JSRUFLX0xPQ0tVUCkpCisKKyNpZiAoQ0NNU1JBTV9TSVpFID09IFwKKyAgICAgMHgwMDAwODAwMFVMKSAvKiBTVE0zMkc0IGRldmljZXMgd2l0aCBDQ01TUkFNX1NJWkUgPSAzMiBLYnl0ZXMgKi8KKyNkZWZpbmUgSVNfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRShfX1BBR0VfXykgKChfX1BBR0VfXykgPiAwVSkKKyNlbGlmIChDQ01TUkFNX1NJWkUgPT0gXAorICAgICAgIDB4MDAwMDUwMDBVTCkgLyogU1RNMzJHNCBkZXZpY2VzIHdpdGggQ0NNU1JBTV9TSVpFID0gMjAgS2J5dGVzICovCisjZGVmaW5lIElTX1NZU0NGR19DQ01TUkFNV1JQX1BBR0UoX19QQUdFX18pIFwKKyAgKCgoX19QQUdFX18pID4gMFUpICYmICgoX19QQUdFX18pIDw9IDB4MDAwRkZGRkZVKSkKKyNlbGlmIChDQ01TUkFNX1NJWkUgPT0gXAorICAgICAgIDB4MDAwMDQwMDBVTCkgLyogU1RNMzJHNCBkZXZpY2VzIHdpdGggQ0NNU1JBTV9TSVpFID0gMTYgS2J5dGVzICovCisjZGVmaW5lIElTX1NZU0NGR19DQ01TUkFNV1JQX1BBR0UoX19QQUdFX18pIFwKKyAgKCgoX19QQUdFX18pID4gMFUpICYmICgoX19QQUdFX18pIDw9IDB4MDAwMEZGRkZVKSkKKyNlbGlmIChDQ01TUkFNX1NJWkUgPT0gXAorICAgICAgIDB4MDAwMDI4MDBVTCkgLyogU1RNMzJHNCBkZXZpY2VzIHdpdGggQ0NNU1JBTV9TSVpFID0gMTAgS2J5dGVzICovCisjZGVmaW5lIElTX1NZU0NGR19DQ01TUkFNV1JQX1BBR0UoX19QQUdFX18pIFwKKyAgKCgoX19QQUdFX18pID4gMFUpICYmICgoX19QQUdFX18pIDw9IDB4MDAwMDAzRkZVKSkKKyNlbmRpZiAvKiBDQ01TUkFNX1NJWkUgKi8KKworI2lmIGRlZmluZWQoVlJFRkJVRikKKyNkZWZpbmUgSVNfU1lTQ0ZHX1ZSRUZCVUZfVk9MVEFHRV9TQ0FMRShfX1NDQUxFX18pICAgXAorICAoKChfX1NDQUxFX18pID09IFNZU0NGR19WUkVGQlVGX1ZPTFRBR0VfU0NBTEUwKSB8fCBcCisgICAoKF9fU0NBTEVfXykgPT0gU1lTQ0ZHX1ZSRUZCVUZfVk9MVEFHRV9TQ0FMRTEpIHx8IFwKKyAgICgoX19TQ0FMRV9fKSA9PSBTWVNDRkdfVlJFRkJVRl9WT0xUQUdFX1NDQUxFMikpCisKKyNkZWZpbmUgSVNfU1lTQ0ZHX1ZSRUZCVUZfSElHSF9JTVBFREFOQ0UoX19WQUxVRV9fKSAgICAgICAgICBcCisgICgoKF9fVkFMVUVfXykgPT0gU1lTQ0ZHX1ZSRUZCVUZfSElHSF9JTVBFREFOQ0VfRElTQUJMRSkgfHwgXAorICAgKChfX1ZBTFVFX18pID09IFNZU0NGR19WUkVGQlVGX0hJR0hfSU1QRURBTkNFX0VOQUJMRSkpCisKKyNkZWZpbmUgSVNfU1lTQ0ZHX1ZSRUZCVUZfVFJJTU1JTkcoX19WQUxVRV9fKSBcCisgICgoKF9fVkFMVUVfXykgPiAwVSkgJiYgKChfX1ZBTFVFX18pIDw9IFZSRUZCVUZfQ0NSX1RSSU0pKQorI2VuZGlmIC8qIFZSRUZCVUYgKi8KKworI2lmIGRlZmluZWQoU1lTQ0ZHX0ZBU1RNT0RFUExVU19QQjgpICYmIGRlZmluZWQoU1lTQ0ZHX0ZBU1RNT0RFUExVU19QQjkpCisjZGVmaW5lIElTX1NZU0NGR19GQVNUTU9ERVBMVVMoX19QSU5fXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKCgoX19QSU5fXykgJiBTWVNDRkdfRkFTVE1PREVQTFVTX1BCNikgPT0gU1lTQ0ZHX0ZBU1RNT0RFUExVU19QQjYpIHx8IFwKKyAgICgoKF9fUElOX18pICYgU1lTQ0ZHX0ZBU1RNT0RFUExVU19QQjcpID09IFNZU0NGR19GQVNUTU9ERVBMVVNfUEI3KSB8fCBcCisgICAoKChfX1BJTl9fKSAmIFNZU0NGR19GQVNUTU9ERVBMVVNfUEI4KSA9PSBTWVNDRkdfRkFTVE1PREVQTFVTX1BCOCkgfHwgXAorICAgKCgoX19QSU5fXykgJiBTWVNDRkdfRkFTVE1PREVQTFVTX1BCOSkgPT0gU1lTQ0ZHX0ZBU1RNT0RFUExVU19QQjkpKQorI2VsaWYgZGVmaW5lZChTWVNDRkdfRkFTVE1PREVQTFVTX1BCOCkKKyNkZWZpbmUgSVNfU1lTQ0ZHX0ZBU1RNT0RFUExVUyhfX1BJTl9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKChfX1BJTl9fKSAmIFNZU0NGR19GQVNUTU9ERVBMVVNfUEI2KSA9PSBTWVNDRkdfRkFTVE1PREVQTFVTX1BCNikgfHwgXAorICAgKCgoX19QSU5fXykgJiBTWVNDRkdfRkFTVE1PREVQTFVTX1BCNykgPT0gU1lTQ0ZHX0ZBU1RNT0RFUExVU19QQjcpIHx8IFwKKyAgICgoKF9fUElOX18pICYgU1lTQ0ZHX0ZBU1RNT0RFUExVU19QQjgpID09IFNZU0NGR19GQVNUTU9ERVBMVVNfUEI4KSkKKyNlbGlmIGRlZmluZWQoU1lTQ0ZHX0ZBU1RNT0RFUExVU19QQjkpCisjZGVmaW5lIElTX1NZU0NGR19GQVNUTU9ERVBMVVMoX19QSU5fXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKCgoX19QSU5fXykgJiBTWVNDRkdfRkFTVE1PREVQTFVTX1BCNikgPT0gU1lTQ0ZHX0ZBU1RNT0RFUExVU19QQjYpIHx8IFwKKyAgICgoKF9fUElOX18pICYgU1lTQ0ZHX0ZBU1RNT0RFUExVU19QQjcpID09IFNZU0NGR19GQVNUTU9ERVBMVVNfUEI3KSB8fCBcCisgICAoKChfX1BJTl9fKSAmIFNZU0NGR19GQVNUTU9ERVBMVVNfUEI5KSA9PSBTWVNDRkdfRkFTVE1PREVQTFVTX1BCOSkpCisjZWxzZQorI2RlZmluZSBJU19TWVNDRkdfRkFTVE1PREVQTFVTKF9fUElOX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoKF9fUElOX18pICYgU1lTQ0ZHX0ZBU1RNT0RFUExVU19QQjYpID09IFNZU0NGR19GQVNUTU9ERVBMVVNfUEI2KSB8fCBcCisgICAoKChfX1BJTl9fKSAmIFNZU0NGR19GQVNUTU9ERVBMVVNfUEI3KSA9PSBTWVNDRkdfRkFTVE1PREVQTFVTX1BCNykpCisjZW5kaWYgLyogU1lTQ0ZHX0ZBU1RNT0RFUExVU19QQiAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1ByaXZhdGVfTWFjcm9zIEhBTCBQcml2YXRlIE1hY3JvcworICogQHsKKyAqLworI2RlZmluZSBJU19USUNLRlJFUShGUkVRKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKChGUkVRKSA9PSBIQUxfVElDS19GUkVRXzEwSFopIHx8ICgoRlJFUSkgPT0gSEFMX1RJQ0tfRlJFUV8xMDBIWikgfHwgXAorICAgKChGUkVRKSA9PSBIQUxfVElDS19GUkVRXzFLSFopKQorLyoqCisgKiBAfQorICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAYWRkdG9ncm91cCBIQUxfRXhwb3J0ZWRfRnVuY3Rpb25zCisgKiBAeworICovCisKKy8qKiBAYWRkdG9ncm91cCBIQUxfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMQorICogQHsKKyAqLworLyogSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSW5pdCh2b2lkKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9EZUluaXQodm9pZCk7Cit2b2lkIEhBTF9Nc3BJbml0KHZvaWQpOwordm9pZCBIQUxfTXNwRGVJbml0KHZvaWQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0luaXRUaWNrKHVpbnQzMl90IFRpY2tQcmlvcml0eSk7CisKKy8qKgorICogQH0KKyAqLworCisvKiogQGFkZHRvZ3JvdXAgSEFMX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSEFMIENvbnRyb2wgZnVuY3Rpb25zCisgKiBAeworICovCisKKy8qIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgSEFMX0luY1RpY2sodm9pZCk7Cit2b2lkIEhBTF9EZWxheSh1aW50MzJfdCBEZWxheSk7Cit1aW50MzJfdCBIQUxfR2V0VGljayh2b2lkKTsKK3VpbnQzMl90IEhBTF9HZXRUaWNrUHJpbyh2b2lkKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TZXRUaWNrRnJlcSh1aW50MzJfdCBGcmVxKTsKK3VpbnQzMl90IEhBTF9HZXRUaWNrRnJlcSh2b2lkKTsKK3ZvaWQgSEFMX1N1c3BlbmRUaWNrKHZvaWQpOwordm9pZCBIQUxfUmVzdW1lVGljayh2b2lkKTsKK3VpbnQzMl90IEhBTF9HZXRIYWxWZXJzaW9uKHZvaWQpOwordWludDMyX3QgSEFMX0dldFJFVklEKHZvaWQpOwordWludDMyX3QgSEFMX0dldERFVklEKHZvaWQpOwordWludDMyX3QgSEFMX0dldFVJRHcwKHZvaWQpOwordWludDMyX3QgSEFMX0dldFVJRHcxKHZvaWQpOwordWludDMyX3QgSEFMX0dldFVJRHcyKHZvaWQpOworCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBhZGR0b2dyb3VwIEhBTF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzCisgKiBAeworICovCisKKy8qIERCR01DVSBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgSEFMX0RCR01DVV9FbmFibGVEQkdTbGVlcE1vZGUodm9pZCk7Cit2b2lkIEhBTF9EQkdNQ1VfRGlzYWJsZURCR1NsZWVwTW9kZSh2b2lkKTsKK3ZvaWQgSEFMX0RCR01DVV9FbmFibGVEQkdTdG9wTW9kZSh2b2lkKTsKK3ZvaWQgSEFMX0RCR01DVV9EaXNhYmxlREJHU3RvcE1vZGUodm9pZCk7Cit2b2lkIEhBTF9EQkdNQ1VfRW5hYmxlREJHU3RhbmRieU1vZGUodm9pZCk7Cit2b2lkIEhBTF9EQkdNQ1VfRGlzYWJsZURCR1N0YW5kYnlNb2RlKHZvaWQpOworCisvKioKKyAqIEB9CisgKi8KKworLyogRXhwb3J0ZWQgdmFyaWFibGVzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIEhBTF9FeHBvcnRlZF9WYXJpYWJsZXMKKyAqIEB7CisgKi8KK2V4dGVybiBfX0lPIHVpbnQzMl90IHV3VGljazsKK2V4dGVybiB1aW50MzJfdCB1d1RpY2tQcmlvOworZXh0ZXJuIHVpbnQzMl90IHV3VGlja0ZyZXE7CisvKioKKyAqIEB9CisgKi8KKworLyoqIEBhZGR0b2dyb3VwIEhBTF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA0CisgKiBAeworICovCisKKy8qIFNZU0NGRyBDb250cm9sIGZ1bmN0aW9ucworICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgSEFMX1NZU0NGR19DQ01TUkFNRXJhc2Uodm9pZCk7Cit2b2lkIEhBTF9TWVNDRkdfRW5hYmxlTWVtb3J5U3dhcHBpbmdCYW5rKHZvaWQpOwordm9pZCBIQUxfU1lTQ0ZHX0Rpc2FibGVNZW1vcnlTd2FwcGluZ0Jhbmsodm9pZCk7CisKKyNpZiBkZWZpbmVkKFZSRUZCVUYpCit2b2lkIEhBTF9TWVNDRkdfVlJFRkJVRl9Wb2x0YWdlU2NhbGluZ0NvbmZpZyh1aW50MzJfdCBWb2x0YWdlU2NhbGluZyk7Cit2b2lkIEhBTF9TWVNDRkdfVlJFRkJVRl9IaWdoSW1wZWRhbmNlQ29uZmlnKHVpbnQzMl90IE1vZGUpOwordm9pZCBIQUxfU1lTQ0ZHX1ZSRUZCVUZfVHJpbW1pbmdDb25maWcodWludDMyX3QgVHJpbW1pbmdWYWx1ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1lTQ0ZHX0VuYWJsZVZSRUZCVUYodm9pZCk7Cit2b2lkIEhBTF9TWVNDRkdfRGlzYWJsZVZSRUZCVUYodm9pZCk7CisjZW5kaWYgLyogVlJFRkJVRiAqLworCit2b2lkIEhBTF9TWVNDRkdfRW5hYmxlSU9Td2l0Y2hCb29zdGVyKHZvaWQpOwordm9pZCBIQUxfU1lTQ0ZHX0Rpc2FibGVJT1N3aXRjaEJvb3N0ZXIodm9pZCk7Cit2b2lkIEhBTF9TWVNDRkdfRW5hYmxlSU9Td2l0Y2hWREQodm9pZCk7Cit2b2lkIEhBTF9TWVNDRkdfRGlzYWJsZUlPU3dpdGNoVkREKHZvaWQpOwordm9pZCBIQUxfU1lTQ0ZHX0NDTVNSQU1fV3JpdGVQcm90ZWN0aW9uRW5hYmxlKHVpbnQzMl90IFBhZ2UpOworCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyRzR4eF9IQUxfSCAqLwpkaWZmIC0tZ2l0IGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfaGFsX2FkYy5oIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfaGFsX2FkYy5oCmluZGV4IDRlMGE5NGEuLmZhNzdhNTIgMTAwNjQ0Ci0tLSBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9JbmMvc3RtMzJnNHh4X2hhbF9hZGMuaAorKysgYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9oYWxfYWRjLmgKQEAgLTEsMjg2NCArMSwyNzM3IEBACi0vKioNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQGZpbGUgICAgc3RtMzJnNHh4X2hhbF9hZGMuaA0KLSAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtDQotICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgQURDIEhBTCBtb2R1bGUuDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEBhdHRlbnRpb24NCi0gKg0KLSAqIENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4NCi0gKg0KLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGVybXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZQ0KLSAqIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4NCi0gKiBJZiBubyBMSUNFTlNFIGZpbGUgY29tZXMgd2l0aCB0aGlzIHNvZnR3YXJlLCBpdCBpcyBwcm92aWRlZCBBUy1JUy4NCi0gKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKi8NCi0NCi0vKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpZm5kZWYgU1RNMzJHNHh4X0hBTF9BRENfSA0KLSNkZWZpbmUgU1RNMzJHNHh4X0hBTF9BRENfSA0KLQ0KLSNpZmRlZiBfX2NwbHVzcGx1cw0KLWV4dGVybiAiQyIgew0KLSNlbmRpZg0KLQ0KLS8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotI2luY2x1ZGUgInN0bTMyZzR4eF9oYWxfZGVmLmgiDQotDQotLyogSW5jbHVkZSBsb3cgbGV2ZWwgZHJpdmVyICovDQotI2luY2x1ZGUgInN0bTMyZzR4eF9sbF9hZGMuaCINCi0NCi0vKiogQGFkZHRvZ3JvdXAgU1RNMzJHNHh4X0hBTF9Ecml2ZXINCi0gKiBAew0KLSAqLw0KLQ0KLS8qKiBAYWRkdG9ncm91cCBBREMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBkZWZncm91cCBBRENfRXhwb3J0ZWRfVHlwZXMgQURDIEV4cG9ydGVkIFR5cGVzDQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEFEQyBncm91cCByZWd1bGFyIG92ZXJzYW1wbGluZyBzdHJ1Y3R1cmUgZGVmaW5pdGlvbg0KLSAqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gIHVpbnQzMl90DQotICAgICAgUmF0aW87IC8qITwgQ29uZmlndXJlcyB0aGUgb3ZlcnNhbXBsaW5nIHJhdGlvLg0KLSAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX0hBTF9FQ19PVlNfUkFUSU8gKi8NCi0NCi0gIHVpbnQzMl90IFJpZ2h0Qml0U2hpZnQ7IC8qITwgQ29uZmlndXJlcyB0aGUgZGl2aXNpb24gY29lZmZpY2llbnQgZm9yIHRoZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcnNhbXBsZXIuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19IQUxfRUNfT1ZTX1NISUZUICovDQotDQotICB1aW50MzJfdCBUcmlnZ2VyZWRNb2RlOyAvKiE8IFNlbGVjdHMgdGhlIHJlZ3VsYXIgdHJpZ2dlcmVkIG92ZXJzYW1wbGluZyBtb2RlLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfSEFMX0VDX09WU19ESVNDT05UX01PREUgKi8NCi0NCi0gIHVpbnQzMl90IE92ZXJzYW1wbGluZ1N0b3BSZXNldDsgLyohPCBTZWxlY3RzIHRoZSByZWd1bGFyIG92ZXJzYW1wbGluZyBtb2RlLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBvdmVyc2FtcGxpbmcgaXMgZWl0aGVyIHRlbXBvcmFyeQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wcGVkIG9yIHJlc2V0IHVwb24gYW4gaW5qZWN0ZWQgc2VxdWVuY2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0aW9uLiBJZiBvdmVyc2FtcGxpbmcgaXMgZW5hYmxlZCBvbg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3RoIHJlZ3VsYXIgYW5kIGluamVjdGVkIGdyb3VwcywgdGhpcw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgaXMgZGlzY2FyZGVkIGFuZCBmb3JjZWQgdG8NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZyAiQURDX1JFR09WRVJTQU1QTElOR19SRVNVTUVEX01PREUiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRoZSBvdmVyc2FtcGxpbmcgYnVmZmVyIGlzIHplcm9lZCBkdXJpbmcNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5qZWN0aW9uIHNlcXVlbmNlKS4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgdmFsdWUgb2YgQHJlZiBBRENfSEFMX0VDX09WU19TQ09QRV9SRUcgKi8NCi0NCi19IEFEQ19PdmVyc2FtcGxpbmdUeXBlRGVmOw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU3RydWN0dXJlIGRlZmluaXRpb24gb2YgQURDIGluc3RhbmNlIGFuZCBBREMgZ3JvdXAgcmVndWxhci4NCi0gKiBAbm90ZSAgIFBhcmFtZXRlcnMgb2YgdGhpcyBzdHJ1Y3R1cmUgYXJlIHNoYXJlZCB3aXRoaW4gMiBzY29wZXM6DQotICogICAgICAgICAgLSBTY29wZSBlbnRpcmUgQURDIChhZmZlY3RzIEFEQyBncm91cHMgcmVndWxhciBhbmQgaW5qZWN0ZWQpOg0KLSAqIENsb2NrUHJlc2NhbGVyLCBSZXNvbHV0aW9uLCBEYXRhQWxpZ24sIEdhaW5Db21wZW5zYXRpb24sIFNjYW5Db252TW9kZSwNCi0gKiBFT0NTZWxlY3Rpb24sIExvd1Bvd2VyQXV0b1dhaXQuDQotICogICAgICAgICAgLSBTY29wZSBBREMgZ3JvdXAgcmVndWxhcjogQ29udGludW91c0NvbnZNb2RlLCBOYnJPZkNvbnZlcnNpb24sDQotICogRGlzY29udGludW91c0NvbnZNb2RlLCBOYnJPZkRpc2NDb252ZXJzaW9uLCBFeHRlcm5hbFRyaWdDb252LA0KLSAqIEV4dGVybmFsVHJpZ0NvbnZFZGdlLCBETUFDb250aW51b3VzUmVxdWVzdHMsIE92ZXJydW4sIE92ZXJzYW1wbGluZ01vZGUsDQotICogT3ZlcnNhbXBsaW5nLCBTYW1wbGluZ01vZGUuDQotICogQG5vdGUgICBUaGUgc2V0dGluZyBvZiB0aGVzZSBwYXJhbWV0ZXJzIGJ5IGZ1bmN0aW9uIEhBTF9BRENfSW5pdCgpIGlzDQotICogY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlLiBBREMgc3RhdGUgY2FuIGJlIGVpdGhlcjoNCi0gKiAgICAgICAgICAtIEZvciBhbGwgcGFyYW1ldGVyczogQURDIGRpc2FibGVkDQotICogICAgICAgICAgLSBGb3IgYWxsIHBhcmFtZXRlcnMgZXhjZXB0ICdMb3dQb3dlckF1dG9XYWl0JywNCi0gKiAnRE1BQ29udGludW91c1JlcXVlc3RzJyBhbmQgJ092ZXJzYW1wbGluZyc6IEFEQyBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbg0KLSAqIGdvaW5nIG9uIGdyb3VwIHJlZ3VsYXIuDQotICogICAgICAgICAgLSBGb3IgcGFyYW1ldGVycyAnTG93UG93ZXJBdXRvV2FpdCcgYW5kICdETUFDb250aW51b3VzUmVxdWVzdHMnOiBBREMNCi0gKiBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZyBvbiBncm91cHMgcmVndWxhciBhbmQgaW5qZWN0ZWQuIElmIEFEQyBpcw0KLSAqIG5vdCBpbiB0aGUgYXBwcm9wcmlhdGUgc3RhdGUgdG8gbW9kaWZ5IHNvbWUgcGFyYW1ldGVycywgdGhlc2UgcGFyYW1ldGVycw0KLSAqIHNldHRpbmcgaXMgYnlwYXNzZWQgd2l0aG91dCBlcnJvciByZXBvcnRpbmcgKGFzIGl0IGNhbiBiZSB0aGUgZXhwZWN0ZWQNCi0gKiBiZWhhdmlvciBpbiBjYXNlIG9mIGludGVuZGVkIGFjdGlvbiB0byB1cGRhdGUgYW5vdGhlciBwYXJhbWV0ZXIgKHdoaWNoDQotICogZnVsZmlsbHMgdGhlIEFEQyBzdGF0ZSBjb25kaXRpb24pIG9uIHRoZSBmbHkpLg0KLSAqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gIHVpbnQzMl90DQotICAgICAgQ2xvY2tQcmVzY2FsZXI7IC8qITwgU2VsZWN0IEFEQyBjbG9jayBzb3VyY2UgKHN5bmNocm9ub3VzIGNsb2NrIGRlcml2ZWQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBBUEIgY2xvY2sgb3IgYXN5bmNocm9ub3VzIGNsb2NrIGRlcml2ZWQgZnJvbQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICBzeXN0ZW0gY2xvY2sgb3IgUExMIChSZWZlciB0byByZWZlcmVuY2UgbWFudWFsIGZvciBsaXN0DQotICAgICAgICAgICAgICAgICAgICAgICAgIG9mIGNsb2NrcyBhdmFpbGFibGUpKSBhbmQgY2xvY2sgcHJlc2NhbGVyLiBUaGlzDQotICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19IQUxfRUNfQ09NTU9OX0NMT0NLX1NPVVJDRS4gTm90ZTogVGhlIEFEQyBjbG9jaw0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIGlzIGNvbW1vbiB0byBhbGwgQURDIGluc3RhbmNlcy4gTm90ZTogSW4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBvZiB1c2FnZSBvZiBjaGFubmVscyBvbiBpbmplY3RlZCBncm91cCwgQURDDQotICAgICAgICAgICAgICAgICAgICAgICAgIGZyZXF1ZW5jeSBzaG91bGQgYmUgbG93ZXIgdGhhbiBBSEIgY2xvY2sgZnJlcXVlbmN5IC80DQotICAgICAgICAgICAgICAgICAgICAgICAgIGZvciByZXNvbHV0aW9uIDEyIG9yIDEwIGJpdHMsIEFIQiBjbG9jayBmcmVxdWVuY3kgLzMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHJlc29sdXRpb24gOCBiaXRzLCBBSEIgY2xvY2sgZnJlcXVlbmN5IC8yIGZvcg0KLSAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uIDYgYml0cy4gTm90ZTogSW4gY2FzZSBvZiBzeW5jaHJvbm91cyBjbG9jaw0KLSAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlIGJhc2VkIG9uIEhDTEsvMSwgdGhlIGNvbmZpZ3VyYXRpb24gbXVzdCBiZSBlbmFibGVkDQotICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHkgaWYgdGhlIHN5c3RlbSBjbG9jayBoYXMgYSA1MCUgZHV0eSBjbG9jayBjeWNsZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAoQVBCIHByZXNjYWxlciBjb25maWd1cmVkIGluc2lkZSBSQ0MgbXVzdCBiZSBieXBhc3NlZA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgUENMSyBjbG9jayBtdXN0IGhhdmUgNTAlIGR1dHkgY3ljbGUpLiBSZWZlciB0bw0KLSAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2UgbWFudWFsIGZvciBkZXRhaWxzLiBOb3RlOiBJbiBjYXNlIG9mIHVzYWdlIG9mDQotICAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jaHJvbm91cyBjbG9jaywgdGhlIHNlbGVjdGVkIGNsb2NrIG11c3QgYmUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgcHJlbGltaW5hcmlseSBlbmFibGVkIGF0IFJDQyB0b3AgbGV2ZWwuIE5vdGU6IFRoaXMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIGNhbiBiZSBtb2RpZmllZCBvbmx5IGlmIGFsbCBBREMgaW5zdGFuY2VzIGFyZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZC4gKi8NCi0NCi0gIHVpbnQzMl90IFJlc29sdXRpb247IC8qITwgQ29uZmlndXJlIHRoZSBBREMgcmVzb2x1dGlvbi4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0hBTF9FQ19SRVNPTFVUSU9OICovDQotDQotICB1aW50MzJfdCBEYXRhQWxpZ247IC8qITwgU3BlY2lmeSBBREMgZGF0YSBhbGlnbm1lbnQgaW4gY29udmVyc2lvbiBkYXRhDQotICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIChyaWdodCBvciBsZWZ0KS4gUmVmZXIgdG8gcmVmZXJlbmNlIG1hbnVhbCBmb3INCi0gICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25tZW50cyBmb3JtYXRzIHZlcnN1cyByZXNvbHV0aW9ucy4gVGhpcyBwYXJhbWV0ZXINCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBBRENfSEFMX0VDX0RBVEFfQUxJR04gKi8NCi0NCi0gIHVpbnQzMl90IEdhaW5Db21wZW5zYXRpb247IC8qITwgU3BlY2lmeSB0aGUgQURDIGdhaW4gY29tcGVuc2F0aW9uIGNvZWZmaWNpZW50DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBhcHBsaWVkIHRvIEFEQyByYXcgY29udmVyc2lvbiBkYXRhLCBiYXNlZA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gZm9sbG93aW5nIGZvcm11bGE6IERBVEEgPSBEQVRBKHJhdykgKiAoZ2Fpbg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGVuc2F0aW9uIGNvZWYpIC8gNDA5NiAyLjEyIGJpdCBmb3JtYXQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZDogMiBiaXRzIGV4cG9uZW50cyAvIDEyIGJpdHMgbWFudGlzc2ENCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdhaW4gc3RlcCBpcyAxLzQwOTYgPSAwLjAwMDI0NCBHYWluIHJhbmdlIGlzDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAgdG8gMy45OTk3NTYgVGhpcyBwYXJhbWV0ZXIgdmFsdWUgY2FuIGJlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICBHYWluIGNvbXBlbnNhdGlvbiB3aWxsIGJlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZCBhbmQgY29lZmZpY2llbnQgc2V0IHRvIDAgMSAtPiAweDNGRkYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdhaW4gY29tcGVuc2F0aW9uIHdpbGwgYmUgZW5hYmxlZCBhbmQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZmaWNpZW50IHNldCB0byBzcGVjaWZpZWQgdmFsdWUNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogR2FpbiBjb21wZW5zYXRpb24gd2hlbiBlbmFibGVkIGlzDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWVkIHRvIGFsbCBjaGFubmVscy4gKi8NCi0NCi0gIHVpbnQzMl90DQotICAgICAgU2NhbkNvbnZNb2RlOyAvKiE8IENvbmZpZ3VyZSB0aGUgc2VxdWVuY2VyIG9mIEFEQyBncm91cHMgcmVndWxhciBhbmQNCi0gICAgICAgICAgICAgICAgICAgICAgIGluamVjdGVkLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYXNzb2NpYXRlZCB0byBwYXJhbWV0ZXINCi0gICAgICAgICAgICAgICAgICAgICAgICdEaXNjb250aW51b3VzQ29udk1vZGUnIHRvIGhhdmUgbWFpbiBzZXF1ZW5jZSBzdWJkaXZpZGVkDQotICAgICAgICAgICAgICAgICAgICAgICBpbiBzdWNjZXNzaXZlIHBhcnRzLiBJZiBkaXNhYmxlZDogQ29udmVyc2lvbiBpcyBwZXJmb3JtZWQNCi0gICAgICAgICAgICAgICAgICAgICAgIGluIHNpbmdsZSBtb2RlIChvbmUgY2hhbm5lbCBjb252ZXJ0ZWQsIHRoZSBvbmUgZGVmaW5lZCBpbg0KLSAgICAgICAgICAgICAgICAgICAgICAgcmFuayAxKS4gUGFyYW1ldGVycyAnTmJyT2ZDb252ZXJzaW9uJyBhbmQNCi0gICAgICAgICAgICAgICAgICAgICAgICdJbmplY3RlZE5ick9mQ29udmVyc2lvbicgYXJlIGRpc2NhcmRlZCAoZXF1aXZhbGVudCB0bw0KLSAgICAgICAgICAgICAgICAgICAgICAgc2V0IHRvIDEpLiBJZiBlbmFibGVkOiAgQ29udmVyc2lvbnMgYXJlIHBlcmZvcm1lZCBpbg0KLSAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2UgbW9kZSAobXVsdGlwbGUgcmFua3MgZGVmaW5lZCBieQ0KLSAgICAgICAgICAgICAgICAgICAgICAgJ05ick9mQ29udmVyc2lvbicgb3IgJ0luamVjdGVkTmJyT2ZDb252ZXJzaW9uJyBhbmQgcmFuaw0KLSAgICAgICAgICAgICAgICAgICAgICAgb2YgZWFjaCBjaGFubmVsIGluIHNlcXVlbmNlcikuIFNjYW4gZGlyZWN0aW9uIGlzIHVwd2FyZDoNCi0gICAgICAgICAgICAgICAgICAgICAgIGZyb20gcmFuayAxIHRvIHJhbmsgJ24nLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZg0KLSAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBBRENfU2Nhbl9tb2RlICovDQotDQotICB1aW50MzJfdA0KLSAgICAgIEVPQ1NlbGVjdGlvbjsgLyohPCBTcGVjaWZ5IHdoaWNoIEVPQyAoRW5kIE9mIENvbnZlcnNpb24pIGZsYWcgaXMgdXNlZCBmb3INCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb24gYnkgcG9sbGluZyBhbmQgaW50ZXJydXB0aW9uOiBlbmQgb2YgdW5pdGFyeQ0KLSAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbiBvciBlbmQgb2Ygc2VxdWVuY2UgY29udmVyc2lvbnMuIFRoaXMgcGFyYW1ldGVyDQotICAgICAgICAgICAgICAgICAgICAgICBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ19FT0NTZWxlY3Rpb24uICovDQotDQotICBGdW5jdGlvbmFsU3RhdGUNCi0gICAgICBMb3dQb3dlckF1dG9XYWl0OyAvKiE8IFNlbGVjdCB0aGUgZHluYW1pYyBsb3cgcG93ZXIgQXV0byBEZWxheTogbmV3DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbiBzdGFydCBvbmx5IHdoZW4gdGhlIHByZXZpb3VzIGNvbnZlcnNpb24NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9yIEFEQyBncm91cCByZWd1bGFyKSBvciBwcmV2aW91cyBzZXF1ZW5jZSAoZm9yIEFEQw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwIGluamVjdGVkKSBoYXMgYmVlbiByZXRyaWV2ZWQgYnkgdXNlciBzb2Z0d2FyZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyBmdW5jdGlvbiBIQUxfQURDX0dldFZhbHVlKCkgb3INCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDRXhfSW5qZWN0ZWRHZXRWYWx1ZSgpLiBUaGlzIGZlYXR1cmUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvbWF0aWNhbGx5IGFkYXB0cyB0aGUgZnJlcXVlbmN5IG9mIEFEQyBjb252ZXJzaW9ucw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJzIHRvIHRoZSBzcGVlZCBvZiB0aGUgc3lzdGVtIHRoYXQgcmVhZHMgdGhlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS4gTW9yZW92ZXIsIHRoaXMgYXZvaWRzIHJpc2sgb2Ygb3ZlcnJ1biBmb3IgbG93DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlcXVlbmN5IGFwcGxpY2F0aW9ucy4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHNldCB0bw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEVOQUJMRSBvciBESVNBQkxFLiBOb3RlOiBJdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gdXNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBpbnRlcnJ1cHRpb24gb3IgRE1BIChIQUxfQURDX1N0YXJ0X0lUKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TdGFydF9ETUEoKSkgc2luY2UgdGhlc2UgbW9kZXMgaGF2ZSB0byBjbGVhcg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGltbWVkaWF0ZWx5IHRoZSBFT0MgZmxhZyAoYnkgQ1BVIHRvIGZyZWUgdGhlIElSUQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmcgZXZlbnQgb3IgYnkgRE1BKS4gQXV0byB3YWl0IHdpbGwgd29yayBidXQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmb3J0IGEgdmVyeSBzaG9ydCB0aW1lLCBkaXNjYXJkaW5nIGl0cyBpbnRlbmRlZA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlbmVmaXQgKGV4Y2VwdCBzcGVjaWZpYyBjYXNlIG9mIGhpZ2ggbG9hZCBvZiBDUFUgb3INCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBETUEgdHJhbnNmZXJzIHdoaWNoIGNhbiBqdXN0aWZ5IHVzYWdlIG9mIGF1dG8gd2FpdCkuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG8gdXNlIHdpdGggcG9sbGluZzogMS4gU3RhcnQgY29udmVyc2lvbiB3aXRoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TdGFydCgpLCAyLiBMYXRlciBvbiwgd2hlbiBBREMgY29udmVyc2lvbg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgaXMgbmVlZGVkOiB1c2UgSEFMX0FEQ19Qb2xsRm9yQ29udmVyc2lvbigpIHRvDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5zdXJlIHRoYXQgY29udmVyc2lvbiBpcyBjb21wbGV0ZWQgYW5kDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19HZXRWYWx1ZSgpIHRvIHJldHJpZXZlIGNvbnZlcnNpb24gcmVzdWx0IGFuZA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWcgYW5vdGhlciBjb252ZXJzaW9uIHN0YXJ0LiAoaW4gY2FzZSBvZiB1c2FnZSBvZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQyBncm91cCBpbmplY3RlZCwgdXNlIHRoZSBlcXVpdmFsZW50IGZ1bmN0aW9ucw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENFeEluamVjdGVkX1N0YXJ0KCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ0V4X0luamVjdGVkR2V0VmFsdWUoKSwgLi4uKS4gKi8NCi0NCi0gIEZ1bmN0aW9uYWxTdGF0ZQ0KLSAgICAgIENvbnRpbnVvdXNDb252TW9kZTsgLyohPCBTcGVjaWZ5IHdoZXRoZXIgdGhlIGNvbnZlcnNpb24gaXMgcGVyZm9ybWVkIGluDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xlIG1vZGUgKG9uZSBjb252ZXJzaW9uKSBvciBjb250aW51b3VzIG1vZGUgZm9yDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDIGdyb3VwIHJlZ3VsYXIsIGFmdGVyIHRoZSBmaXJzdCBBREMgY29udmVyc2lvbg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0IHRyaWdnZXIgb2NjdXJyZWQgKHNvZnR3YXJlIHN0YXJ0IG9yIGV4dGVybmFsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcikuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBzZXQgdG8gRU5BQkxFIG9yDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgRElTQUJMRS4gKi8NCi0NCi0gIHVpbnQzMl90DQotICAgICAgTmJyT2ZDb252ZXJzaW9uOyAvKiE8IFNwZWNpZnkgdGhlIG51bWJlciBvZiByYW5rcyB0aGF0IHdpbGwgYmUgY29udmVydGVkDQotICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoaW4gdGhlIHJlZ3VsYXIgZ3JvdXAgc2VxdWVuY2VyLiBUbyB1c2UgdGhlIHJlZ3VsYXINCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwIHNlcXVlbmNlciBhbmQgY29udmVydCBzZXZlcmFsIHJhbmtzLCBwYXJhbWV0ZXINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICdTY2FuQ29udk1vZGUnIG11c3QgYmUgZW5hYmxlZC4gVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDEgYW5kIE1heF9EYXRhID0gMTYuIE5vdGU6DQotICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIG1vZGlmaWVkIHdoZW4gbm8gY29udmVyc2lvbiBpcw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgb24gZ29pbmcgb24gcmVndWxhciBncm91cCAoQURDIGRpc2FibGVkLCBvciBBREMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQgd2l0aG91dCBjb250aW51b3VzIG1vZGUgb3IgZXh0ZXJuYWwgdHJpZ2dlcg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBjb3VsZCBsYXVuY2ggYSBjb252ZXJzaW9uKS4gKi8NCi0NCi0gIEZ1bmN0aW9uYWxTdGF0ZQ0KLSAgICAgIERpc2NvbnRpbnVvdXNDb252TW9kZTsgLyohPCBTcGVjaWZ5IHdoZXRoZXIgdGhlIGNvbnZlcnNpb25zIHNlcXVlbmNlIG9mDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDIGdyb3VwIHJlZ3VsYXIgaXMgcGVyZm9ybWVkIGluDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGxldGUtc2VxdWVuY2UvRGlzY29udGludW91cy1zZXF1ZW5jZSAobWFpbg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlIHN1YmRpdmlkZWQgaW4gc3VjY2Vzc2l2ZSBwYXJ0cykuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzY29udGludW91cyBtb2RlIGlzIHVzZWQgb25seSBpZiBzZXF1ZW5jZXIgaXMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkIChwYXJhbWV0ZXIgJ1NjYW5Db252TW9kZScpLiBJZiBzZXF1ZW5jZXIgaXMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZCwgdGhpcyBwYXJhbWV0ZXIgaXMgZGlzY2FyZGVkLiBEaXNjb250aW51b3VzDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSBjYW4gYmUgZW5hYmxlZCBvbmx5IGlmIGNvbnRpbnVvdXMgbW9kZSBpcw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkLiBJZiBjb250aW51b3VzIG1vZGUgaXMgZW5hYmxlZCwgdGhpcw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciBzZXR0aW5nIGlzIGRpc2NhcmRlZC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IHRvIEVOQUJMRSBvciBESVNBQkxFLiAqLw0KLQ0KLSAgdWludDMyX3QNCi0gICAgICBOYnJPZkRpc2NDb252ZXJzaW9uOyAvKiE8IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGRpc2NvbnRpbnVvdXMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9ucyBpbiB3aGljaCB0aGUgbWFpbiBzZXF1ZW5jZSBvZiBBREMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cCByZWd1bGFyIChwYXJhbWV0ZXIgTmJyT2ZDb252ZXJzaW9uKSB3aWxsIGJlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViZGl2aWRlZC4gSWYgcGFyYW1ldGVyICdEaXNjb250aW51b3VzQ29udk1vZGUnDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgZGlzYWJsZWQsIHRoaXMgcGFyYW1ldGVyIGlzIGRpc2NhcmRlZC4gVGhpcw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAxDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIE1heF9EYXRhID0gOC4gKi8NCi0NCi0gIHVpbnQzMl90IEV4dGVybmFsVHJpZ0NvbnY7IC8qITwgU2VsZWN0IHRoZSBleHRlcm5hbCBldmVudCBzb3VyY2UgdXNlZCB0bw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlciBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHN0YXJ0LiBJZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IHRvIEFEQ19TT0ZUV0FSRV9TVEFSVCwgZXh0ZXJuYWwgdHJpZ2dlcnMgYXJlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZCBhbmQgc29mdHdhcmUgdHJpZ2dlciBpcyB1c2VkIGluc3RlYWQuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19yZWd1bGFyX2V4dGVybmFsX3RyaWdnZXJfc291cmNlLiBDYXV0aW9uOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWwgdHJpZ2dlciBzb3VyY2UgaXMgY29tbW9uIHRvIGFsbCBBREMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlcy4gKi8NCi0NCi0gIHVpbnQzMl90IEV4dGVybmFsVHJpZ0NvbnZFZGdlOyAvKiE8IFNlbGVjdCB0aGUgZXh0ZXJuYWwgZXZlbnQgZWRnZSB1c2VkIHRvDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlciBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHN0YXJ0Lg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgdHJpZ2dlciBzb3VyY2UgaXMgc2V0IHRvDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX1NPRlRXQVJFX1NUQVJULCB0aGlzIHBhcmFtZXRlciBpcw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NhcmRlZC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIEFEQ19yZWd1bGFyX2V4dGVybmFsX3RyaWdnZXJfZWRnZSAqLw0KLQ0KLSAgdWludDMyX3QgU2FtcGxpbmdNb2RlOyAvKiE8IFNlbGVjdCB0aGUgc2FtcGxpbmcgbW9kZSB0byBiZSB1c2VkIGZvciBBREMgZ3JvdXANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVndWxhciBjb252ZXJzaW9uLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIEFEQ19yZWd1bGFyX3NhbXBsaW5nX21vZGUgKi8NCi0NCi0gIEZ1bmN0aW9uYWxTdGF0ZQ0KLSAgICAgIERNQUNvbnRpbnVvdXNSZXF1ZXN0czsgLyohPCBTcGVjaWZ5IHdoZXRoZXIgdGhlIERNQSByZXF1ZXN0cyBhcmUgcGVyZm9ybWVkDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gb25lIHNob3QgbW9kZSAoRE1BIHRyYW5zZmVyIHN0b3BzIHdoZW4gbnVtYmVyIG9mDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbnMgaXMgcmVhY2hlZCkgb3IgaW4gY29udGludW91cyBtb2RlIChETUENCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2ZlciB1bmxpbWl0ZWQsIHdoYXRldmVyIG51bWJlciBvZiBjb252ZXJzaW9ucykuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHNldCB0byBFTkFCTEUgb3IgRElTQUJMRS4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBJbiBjb250aW51b3VzIG1vZGUsIERNQSBtdXN0IGJlIGNvbmZpZ3VyZWQgaW4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjaXJjdWxhciBtb2RlLiBPdGhlcndpc2UgYW4gb3ZlcnJ1biB3aWxsIGJlIHRyaWdnZXJlZA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gRE1BIGJ1ZmZlciBtYXhpbXVtIHBvaW50ZXIgaXMgcmVhY2hlZC4gKi8NCi0NCi0gIHVpbnQzMl90DQotICAgICAgT3ZlcnJ1bjsgLyohPCBTZWxlY3QgdGhlIGJlaGF2aW9yIGluIGNhc2Ugb2Ygb3ZlcnJ1bjogZGF0YSBvdmVyd3JpdHRlbiBvcg0KLSAgICAgICAgICAgICAgICAgIHByZXNlcnZlZCAoZGVmYXVsdCkuIFRoaXMgcGFyYW1ldGVyIGFwcGxpZXMgdG8gQURDIGdyb3VwDQotICAgICAgICAgICAgICAgICAgcmVndWxhciBvbmx5LiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmDQotICAgICAgICAgICAgICAgICAgQURDX0hBTF9FQ19SRUdfT1ZSX0RBVEFfQkVIQVZJT1IuIE5vdGU6IEluIGNhc2Ugb2Ygb3ZlcnJ1biBzZXQNCi0gICAgICAgICAgICAgICAgICB0byBkYXRhIHByZXNlcnZlZCBhbmQgdXNhZ2Ugd2l0aCBwcm9ncmFtbWluZyBtb2RlbCB3aXRoDQotICAgICAgICAgICAgICAgICAgaW50ZXJydXB0aW9uIChIQUxfU3RhcnRfSVQoKSk6IEFEQyBJUlEgaGFuZGxlciBoYXMgdG8gY2xlYXINCi0gICAgICAgICAgICAgICAgICAgIGVuZCBvZiBjb252ZXJzaW9uIGZsYWdzLCB0aGlzIGluZHVjZXMgdGhlIHJlbGVhc2Ugb2YgdGhlDQotICAgICAgICAgICAgICAgICAgcHJlc2VydmVkIGRhdGEuIElmIG5lZWRlZCwgdGhpcyBkYXRhIGNhbiBiZSBzYXZlZCBpbiBmdW5jdGlvbg0KLSAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19Db252Q3BsdENhbGxiYWNrKCksIHBsYWNlZCBpbiB1c2VyIHByb2dyYW0gY29kZQ0KLSAgICAgICAgICAgICAgICAgIChjYWxsZWQgYmVmb3JlIGVuZCBvZiBjb252ZXJzaW9uIGZsYWdzIGNsZWFyKS4gTm90ZTogRXJyb3INCi0gICAgICAgICAgICAgICAgICByZXBvcnRpbmcgd2l0aCByZXNwZWN0IHRvIHRoZSBjb252ZXJzaW9uIG1vZGU6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAtIFVzYWdlIHdpdGggQURDIGNvbnZlcnNpb24gYnkgcG9sbGluZyBmb3IgZXZlbnQgb3INCi0gICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRpb246IEVycm9yIGlzIHJlcG9ydGVkIG9ubHkgaWYgb3ZlcnJ1biBpcyBzZXQgdG8gZGF0YQ0KLSAgICAgICAgICAgICAgICAgIHByZXNlcnZlZC4gSWYgb3ZlcnJ1biBpcyBzZXQgdG8gZGF0YSBvdmVyd3JpdHRlbiwgdXNlciBjYW4NCi0gICAgICAgICAgICAgICAgICB3aWxsaW5nbHkgbm90IHJlYWQgYWxsIHRoZSBjb252ZXJ0ZWQgZGF0YSwgdGhpcyBpcyBub3QNCi0gICAgICAgICAgICAgICAgICBjb25zaWRlcmVkIGFzIGFuIGVycm9uZW91cyBjYXNlLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgLSBVc2FnZSB3aXRoIEFEQyBjb252ZXJzaW9uIGJ5IERNQTogRXJyb3IgaXMgcmVwb3J0ZWQNCi0gICAgICAgICAgICAgICAgICB3aGF0ZXZlciBvdmVycnVuIHNldHRpbmcgKERNQSBpcyBleHBlY3RlZCB0byBwcm9jZXNzIGFsbCBkYXRhDQotICAgICAgICAgICAgICAgICAgZnJvbSBkYXRhIHJlZ2lzdGVyKS4gKi8NCi0NCi0gIEZ1bmN0aW9uYWxTdGF0ZQ0KLSAgICAgIE92ZXJzYW1wbGluZ01vZGU7IC8qITwgU3BlY2lmeSB3aGV0aGVyIHRoZSBvdmVyc2FtcGxpbmcgZmVhdHVyZSBpcyBlbmFibGVkDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgZGlzYWJsZWQuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBzZXQgdG8gRU5BQkxFIG9yDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgRElTQUJMRS4gTm90ZTogVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG1vZGlmaWVkIG9ubHkgaWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBjb252ZXJzaW9uIGlzIG9uZ29pbmcgb24gQURDIGdyb3Vwcw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ3VsYXIgYW5kIGluamVjdGVkICovDQotDQotICBBRENfT3ZlcnNhbXBsaW5nVHlwZURlZg0KLSAgICAgIE92ZXJzYW1wbGluZzsgLyohPCBTcGVjaWZ5IHRoZSBPdmVyc2FtcGxpbmcgcGFyYW1ldGVycy4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ2F1dGlvbjogdGhpcyBzZXR0aW5nIG92ZXJ3cml0ZXMgdGhlIHByZXZpb3VzDQotICAgICAgICAgICAgICAgICAgICAgICBvdmVyc2FtcGxpbmcgY29uZmlndXJhdGlvbiBpZiBvdmVyc2FtcGxpbmcgaXMgYWxyZWFkeQ0KLSAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZC4gKi8NCi0NCi19IEFEQ19Jbml0VHlwZURlZjsNCi0NCi0vKioNCi0gKiBAYnJpZWYgIFN0cnVjdHVyZSBkZWZpbml0aW9uIG9mIEFEQyBjaGFubmVsIGZvciByZWd1bGFyIGdyb3VwDQotICogQG5vdGUgICBUaGUgc2V0dGluZyBvZiB0aGVzZSBwYXJhbWV0ZXJzIGJ5IGZ1bmN0aW9uIEhBTF9BRENfQ29uZmlnQ2hhbm5lbCgpDQotICogaXMgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlLiBBREMgc3RhdGUgY2FuIGJlIGVpdGhlcjoNCi0gKiAgICAgICAgICAtIEZvciBhbGwgcGFyYW1ldGVyczogQURDIGRpc2FibGVkICh0aGlzIGlzIHRoZSBvbmx5IHBvc3NpYmxlIEFEQw0KLSAqIHN0YXRlIHRvIG1vZGlmeSBwYXJhbWV0ZXIgJ1NpbmdsZURpZmYnKQ0KLSAqICAgICAgICAgIC0gRm9yIGFsbCBleGNlcHQgcGFyYW1ldGVycyAnU2FtcGxpbmdUaW1lJywgJ09mZnNldCcsDQotICogJ09mZnNldE51bWJlcic6IEFEQyBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZyBvbiByZWd1bGFyIGdyb3VwLg0KLSAqICAgICAgICAgIC0gRm9yIHBhcmFtZXRlcnMgJ1NhbXBsaW5nVGltZScsICdPZmZzZXQnLCAnT2Zmc2V0TnVtYmVyJzogQURDDQotICogZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcgb24gcmVndWxhciBhbmQgaW5qZWN0ZWQgZ3JvdXBzLiBJZiBBREMgaXMNCi0gKiBub3QgaW4gdGhlIGFwcHJvcHJpYXRlIHN0YXRlIHRvIG1vZGlmeSBzb21lIHBhcmFtZXRlcnMsIHRoZXNlIHBhcmFtZXRlcnMNCi0gKiBzZXR0aW5nIGlzIGJ5cGFzc2VkIHdpdGhvdXQgZXJyb3IgcmVwb3J0aW5nIChhcyBpdCBjYW4gYmUgdGhlIGV4cGVjdGVkDQotICogYmVoYXZpb3IgaW4gY2FzZSBvZiBpbnRlbmRlZCBhY3Rpb24gdG8gdXBkYXRlIGFub3RoZXIgcGFyYW1ldGVyICh3aGljaA0KLSAqIGZ1bGZpbGxzIHRoZSBBREMgc3RhdGUgY29uZGl0aW9uKSBvbiB0aGUgZmx5KS4NCi0gKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICB1aW50MzJfdA0KLSAgICAgIENoYW5uZWw7IC8qITwgU3BlY2lmeSB0aGUgY2hhbm5lbCB0byBjb25maWd1cmUgaW50byBBREMgcmVndWxhciBncm91cC4NCi0gICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX0hBTF9FQ19DSEFOTkVMDQotICAgICAgICAgICAgICAgICAgICBOb3RlOiBEZXBlbmRpbmcgb24gZGV2aWNlcyBhbmQgQURDIGluc3RhbmNlcywgc29tZSBjaGFubmVscw0KLSAgICAgICAgICAgICAgICAgIG1heSBub3QgYmUgYXZhaWxhYmxlIG9uIGRldmljZSBwYWNrYWdlIHBpbnMuIFJlZmVyIHRvIGRldmljZQ0KLSAgICAgICAgICAgICAgICAgIGRhdGFzaGVldCBmb3IgY2hhbm5lbHMgYXZhaWxhYmlsaXR5LiAqLw0KLQ0KLSAgdWludDMyX3QNCi0gICAgICBSYW5rOyAvKiE8IFNwZWNpZnkgdGhlIHJhbmsgaW4gdGhlIHJlZ3VsYXIgZ3JvdXAgc2VxdWVuY2VyLg0KLSAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBBRENfSEFMX0VDX1JFR19TRVFfUkFOS1MNCi0gICAgICAgICAgICAgICAgIE5vdGU6IHRvIGRpc2FibGUgYSBjaGFubmVsIG9yIGNoYW5nZSBvcmRlciBvZiBjb252ZXJzaW9uDQotICAgICAgICAgICAgICAgc2VxdWVuY2VyLCByYW5rIGNvbnRhaW5pbmcgYSBwcmV2aW91cyBjaGFubmVsIHNldHRpbmcgY2FuIGJlDQotICAgICAgICAgICAgICAgb3ZlcndyaXR0ZW4gYnkgdGhlIG5ldyBjaGFubmVsIHNldHRpbmcgKG9yIHBhcmFtZXRlciBudW1iZXIgb2YNCi0gICAgICAgICAgICAgICBjb252ZXJzaW9ucyBhZGp1c3RlZCkgKi8NCi0NCi0gIHVpbnQzMl90DQotICAgICAgU2FtcGxpbmdUaW1lOyAvKiE8IFNhbXBsaW5nIHRpbWUgdmFsdWUgdG8gYmUgc2V0IGZvciB0aGUgc2VsZWN0ZWQgY2hhbm5lbC4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgVW5pdDogQURDIGNsb2NrIGN5Y2xlcw0KLSAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJzaW9uIHRpbWUgaXMgdGhlIGFkZGl0aW9uIG9mIHNhbXBsaW5nIHRpbWUgYW5kDQotICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzaW5nIHRpbWUgKDEyLjUgQURDIGNsb2NrIGN5Y2xlcyBhdCBBREMgcmVzb2x1dGlvbg0KLSAgICAgICAgICAgICAgICAgICAgICAgMTIgYml0cywgMTAuNSBjeWNsZXMgYXQgMTAgYml0cywgOC41IGN5Y2xlcyBhdCA4DQotICAgICAgICAgICAgICAgICAgICAgICBiaXRzLCA2LjUgY3ljbGVzIGF0IDYgYml0cykuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhDQotICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBvZiBAcmVmIEFEQ19IQUxfRUNfQ0hBTk5FTF9TQU1QTElOR1RJTUUgQ2F1dGlvbjoNCi0gICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGFwcGxpZXMgdG8gYSBjaGFubmVsIHRoYXQgY2FuIGJlIHVzZWQgaW50bw0KLSAgICAgICAgICAgICAgICAgICAgICAgcmVndWxhciBhbmQvb3IgaW5qZWN0ZWQgZ3JvdXAuIEl0IG92ZXJ3cml0ZXMgdGhlIGxhc3QNCi0gICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmcuIE5vdGU6IEluIGNhc2Ugb2YgdXNhZ2Ugb2YgaW50ZXJuYWwgbWVhc3VyZW1lbnQNCi0gICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzIChWcmVmSW50L1ZiYXQvVGVtcFNlbnNvciksIHNhbXBsaW5nIHRpbWUNCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRzIG11c3QgYmUgcmVzcGVjdGVkIChzYW1wbGluZyB0aW1lIGNhbiBiZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgYWRqdXN0ZWQgaW4gZnVuY3Rpb24gb2YgQURDIGNsb2NrIGZyZXF1ZW5jeSBhbmQgc2FtcGxpbmcNCi0gICAgICAgICAgICAgICAgICAgICAgIHRpbWUgc2V0dGluZykgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgdGltaW5ncw0KLSAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLiAqLw0KLQ0KLSAgdWludDMyX3QNCi0gICAgICBTaW5nbGVEaWZmOyAvKiE8IFNlbGVjdCBzaW5nbGUtZW5kZWQgb3IgZGlmZmVyZW50aWFsIGlucHV0Lg0KLSAgICAgICAgICAgICAgICAgICAgICAgSW4gZGlmZmVyZW50aWFsIG1vZGU6IERpZmZlcmVudGlhbCBtZWFzdXJlbWVudCBpcyBjYXJyaWVkDQotICAgICAgICAgICAgICAgICAgICAgb3V0IGJldHdlZW4gdGhlIHNlbGVjdGVkIGNoYW5uZWwgJ2knIChwb3NpdGl2ZSBpbnB1dCkgYW5kDQotICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCAnaSsxJyAobmVnYXRpdmUgaW5wdXQpLiBPbmx5IGNoYW5uZWwgJ2knIGhhcyB0byBiZQ0KLSAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZWQsIGNoYW5uZWwgJ2krMScgaXMgY29uZmlndXJlZCBhdXRvbWF0aWNhbGx5LiBUaGlzDQotICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBvZiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgQURDX0hBTF9FQ19DSEFOTkVMX1NJTkdMRV9ESUZGX0VORElORyBDYXV0aW9uOiBUaGlzDQotICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIGFwcGxpZXMgdG8gYSBjaGFubmVsIHRoYXQgY2FuIGJlIHVzZWQgaW4gYQ0KLSAgICAgICAgICAgICAgICAgICAgIHJlZ3VsYXIgYW5kL29yIGluamVjdGVkIGdyb3VwLiBJdCBvdmVyd3JpdGVzIHRoZSBsYXN0DQotICAgICAgICAgICAgICAgICAgICAgc2V0dGluZy4gTm90ZTogUmVmZXIgdG8gUmVmZXJlbmNlIE1hbnVhbCB0byBlbnN1cmUgdGhlDQotICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQgY2hhbm5lbCBpcyBhdmFpbGFibGUgaW4gZGlmZmVyZW50aWFsIG1vZGUuIE5vdGU6DQotICAgICAgICAgICAgICAgICAgICAgV2hlbiBjb25maWd1cmluZyBhIGNoYW5uZWwgJ2knIGluIGRpZmZlcmVudGlhbCBtb2RlLCB0aGUNCi0gICAgICAgICAgICAgICAgICAgICBjaGFubmVsICdpKzEnIGlzIG5vdCB1c2FibGUgc2VwYXJhdGVseS4gTm90ZTogVGhpcw0KLSAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciBtdXN0IGJlIG1vZGlmaWVkIHdoZW4gQURDIGlzIGRpc2FibGVkIChiZWZvcmUgQURDDQotICAgICAgICAgICAgICAgICAgICAgc3RhcnQgY29udmVyc2lvbiBvciBhZnRlciBBREMgc3RvcCBjb252ZXJzaW9uKS4gSWYgQURDIGlzDQotICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZCwgdGhpcyBwYXJhbWV0ZXIgc2V0dGluZyBpcyBieXBhc3NlZCB3aXRob3V0IGVycm9yDQotICAgICAgICAgICAgICAgICAgICAgcmVwb3J0aW5nIChhcyBpdCBjYW4gYmUgdGhlIGV4cGVjdGVkIGJlaGF2aW9yIGluIGNhc2Ugb2YNCi0gICAgICAgICAgICAgICAgICAgICBhbm90aGVyIHBhcmFtZXRlciB1cGRhdGUgb24gdGhlIGZseSkgKi8NCi0NCi0gIHVpbnQzMl90IE9mZnNldE51bWJlcjsgLyohPCBTZWxlY3QgdGhlIG9mZnNldCBudW1iZXINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19IQUxfRUNfT0ZGU0VUX05CIENhdXRpb246IE9ubHkgb25lIG9mZnNldCBpcw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkIHBlciBjaGFubmVsLiBUaGlzIHBhcmFtZXRlciBvdmVyd3JpdGVzIHRoZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0IHNldHRpbmcuICovDQotDQotICB1aW50MzJfdA0KLSAgICAgIE9mZnNldDsgLyohPCBEZWZpbmUgdGhlIG9mZnNldCB0byBiZSBhcHBsaWVkIG9uIHRoZSByYXcgY29udmVydGVkIGRhdGEuDQotICAgICAgICAgICAgICAgICAgIE9mZnNldCB2YWx1ZSBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyLg0KLSAgICAgICAgICAgICAgICAgICBEZXBlbmRpbmcgb2YgQURDIHJlc29sdXRpb24gc2VsZWN0ZWQgKDEyLCAxMCwgOCBvciA2IGJpdHMpLA0KLSAgICAgICAgICAgICAgICAgdGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMDAgYW5kDQotICAgICAgICAgICAgICAgICBNYXhfRGF0YSA9IDB4RkZGLCAweDNGRiwgMHhGRiBvciAweDNGIHJlc3BlY3RpdmVseS4gTm90ZTogVGhpcw0KLSAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIG11c3QgYmUgbW9kaWZpZWQgd2hlbiBubyBjb252ZXJzaW9uIGlzIG9uIGdvaW5nIG9uDQotICAgICAgICAgICAgICAgICBib3RoIHJlZ3VsYXIgYW5kIGluamVjdGVkIGdyb3VwcyAoQURDIGRpc2FibGVkLCBvciBBREMgZW5hYmxlZA0KLSAgICAgICAgICAgICAgICAgICAgICAgICB3aXRob3V0IGNvbnRpbnVvdXMgbW9kZSBvciBleHRlcm5hbCB0cmlnZ2VyIHRoYXQgY291bGQNCi0gICAgICAgICAgICAgICAgIGxhdW5jaCBhIGNvbnZlcnNpb24pLiAqLw0KLQ0KLSAgdWludDMyX3QNCi0gICAgICBPZmZzZXRTaWduOyAvKiE8IERlZmluZSBpZiB0aGUgb2Zmc2V0IHNob3VsZCBiZSBzdWJ0cmFjdGVkIChuZWdhdGl2ZSBzaWduKQ0KLSAgICAgICAgICAgICAgICAgICAgb3IgYWRkZWQgKHBvc2l0aXZlIHNpZ24pIGZyb20gb3IgdG8gdGhlIHJhdyBjb252ZXJ0ZWQgZGF0YS4NCi0gICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDRXhfT2Zmc2V0U2lnbi4NCi0gICAgICAgICAgICAgICAgICAgIE5vdGU6IFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgbW9kaWZpZWQgd2hlbiBubyBjb252ZXJzaW9uIGlzDQotICAgICAgICAgICAgICAgICAgICBvbiBnb2luZyBvbiBib3RoIHJlZ3VsYXIgYW5kIGluamVjdGVkIGdyb3VwcyAoQURDIGRpc2FibGVkLA0KLSAgICAgICAgICAgICAgICAgICAgb3IgQURDIGVuYWJsZWQgd2l0aG91dCBjb250aW51b3VzIG1vZGUgb3IgZXh0ZXJuYWwgdHJpZ2dlcg0KLSAgICAgICAgICAgICAgICAgICAgdGhhdCBjb3VsZCBsYXVuY2ggYSBjb252ZXJzaW9uKS4gKi8NCi0gIEZ1bmN0aW9uYWxTdGF0ZQ0KLSAgICAgIE9mZnNldFNhdHVyYXRpb247IC8qITwgRGVmaW5lIGlmIHRoZSBvZmZzZXQgc2hvdWxkIGJlIHNhdHVyYXRlZCB1cG9uIHVuZGVyDQotICAgICAgICAgICAgICAgICAgICAgICAgICBvciBvdmVyIGZsb3cuIFRoaXMgcGFyYW1ldGVyIHZhbHVlIGNhbiBiZSBFTkFCTEUgb3INCi0gICAgICAgICAgICAgICAgICAgICAgICAgIERJU0FCTEUuIE5vdGU6IFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgbW9kaWZpZWQgd2hlbiBubw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbiBpcyBvbiBnb2luZyBvbiBib3RoIHJlZ3VsYXIgYW5kIGluamVjdGVkDQotICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cHMgKEFEQyBkaXNhYmxlZCwgb3IgQURDIGVuYWJsZWQgd2l0aG91dA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludW91cyBtb2RlIG9yIGV4dGVybmFsIHRyaWdnZXIgdGhhdCBjb3VsZCBsYXVuY2gNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGEgY29udmVyc2lvbikuICovDQotDQotfSBBRENfQ2hhbm5lbENvbmZUeXBlRGVmOw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU3RydWN0dXJlIGRlZmluaXRpb24gb2YgQURDIGFuYWxvZyB3YXRjaGRvZw0KLSAqIEBub3RlICAgVGhlIHNldHRpbmcgb2YgdGhlc2UgcGFyYW1ldGVycyBieSBmdW5jdGlvbiBIQUxfQURDX0FuYWxvZ1dER0NvbmZpZygpDQotICogaXMgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlLiBBREMgc3RhdGUgY2FuIGJlIGVpdGhlcjoNCi0gKiAgICAgICAgICAtIEZvciBhbGwgcGFyYW1ldGVycyBleGNlcHQgJ0hpZ2hUaHJlc2hvbGQnLCAnTG93VGhyZXNob2xkJzogQURDDQotICogZGlzYWJsZWQgb3IgQURDIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nIG9uIEFEQyBncm91cHMgcmVndWxhciBhbmQNCi0gKiBpbmplY3RlZC4NCi0gKiAgICAgICAgICAtIEZvciBwYXJhbWV0ZXJzICdIaWdoVGhyZXNob2xkJywgJ0xvd1RocmVzaG9sZCc6IEFEQyBlbmFibGVkIHdpdGgNCi0gKiBjb252ZXJzaW9uIG9uIGdvaW5nIG9uIHJlZ3VsYXIgYW5kIGluamVjdGVkIGdyb3Vwcy4NCi0gKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICB1aW50MzJfdA0KLSAgICAgIFdhdGNoZG9nTnVtYmVyOyAvKiE8IFNlbGVjdCB3aGljaCBBREMgYW5hbG9nIHdhdGNoZG9nIGlzIG1vbml0b3JpbmcgdGhlDQotICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkIGNoYW5uZWwuIEZvciBBbmFsb2cgV2F0Y2hkb2cgMTogT25seSAxIGNoYW5uZWwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2FuIGJlIG1vbml0b3JlZCAob3Igb3ZlcmFsbCBncm91cCBvZiBjaGFubmVscyBieQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nIHBhcmFtZXRlciAnV2F0Y2hkb2dNb2RlJykgRm9yIEFuYWxvZyBXYXRjaGRvZyAyDQotICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCAzOiBTZXZlcmFsIGNoYW5uZWxzIGNhbiBiZSBtb25pdG9yZWQgKGJ5IHN1Y2Nlc3NpdmUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2FsbHMgb2YgJ0hBTF9BRENfQW5hbG9nV0RHQ29uZmlnKCknIGZvciBlYWNoIGNoYW5uZWwpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICBBRENfSEFMX0VDX0FXRF9OVU1CRVIuICovDQotDQotICB1aW50MzJfdA0KLSAgICAgIFdhdGNoZG9nTW9kZTsgLyohPCBDb25maWd1cmUgdGhlIEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9kZTogc2luZ2xlL2FsbC9ub25lDQotICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVscy4gRm9yIEFuYWxvZyBXYXRjaGRvZyAxOiBDb25maWd1cmUgdGhlIEFEQyBhbmFsb2cNCi0gICAgICAgICAgICAgICAgICAgICAgIHdhdGNoZG9nIG1vZGU6IHNpbmdsZSBjaGFubmVsIG9yIGFsbCBjaGFubmVscywgQURDIGdyb3Vwcw0KLSAgICAgICAgICAgICAgICAgICAgICAgcmVndWxhciBhbmQtb3IgaW5qZWN0ZWQuIEZvciBBbmFsb2cgV2F0Y2hkb2cgMiBhbmQgMzoNCi0gICAgICAgICAgICAgICAgICAgICAgIFNldmVyYWwgY2hhbm5lbHMgY2FuIGJlIG1vbml0b3JlZCBieSBhcHBseWluZw0KLSAgICAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc2l2ZWx5IHRoZSBBV0QgaW5pdCBzdHJ1Y3R1cmUuIENoYW5uZWxzIG9uIEFEQw0KLSAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgcmVndWxhciBhbmQgaW5qZWN0ZWQgYXJlIG5vdCBkaWZmZXJlbnRpYXRlZDogU2V0DQotICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSAnQURDX0FOQUxPR1dBVENIRE9HX1NJTkdMRV94eHgnIHRvIG1vbml0b3IgMQ0KLSAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCwgdmFsdWUgJ0FEQ19BTkFMT0dXQVRDSERPR19BTExfeHh4JyB0byBtb25pdG9yDQotICAgICAgICAgICAgICAgICAgICAgICBhbGwgY2hhbm5lbHMsICdBRENfQU5BTE9HV0FUQ0hET0dfTk9ORScgdG8gbW9uaXRvciBubw0KLSAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgQURDX2FuYWxvZ193YXRjaGRvZ19tb2RlLiAqLw0KLQ0KLSAgdWludDMyX3QgQ2hhbm5lbDsgLyohPCBTZWxlY3Qgd2hpY2ggQURDIGNoYW5uZWwgdG8gbW9uaXRvciBieSBhbmFsb2cgd2F0Y2hkb2cuDQotICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBBbmFsb2cgV2F0Y2hkb2cgMTogdGhpcyBwYXJhbWV0ZXIgaGFzIGFuIGVmZmVjdA0KLSAgICAgICAgICAgICAgICAgICAgICAgb25seSBpZiBwYXJhbWV0ZXIgJ1dhdGNoZG9nTW9kZScgaXMgY29uZmlndXJlZCBvbiBzaW5nbGUNCi0gICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgKG9ubHkgMSBjaGFubmVsIGNhbiBiZSBtb25pdG9yZWQpLiBGb3IgQW5hbG9nDQotICAgICAgICAgICAgICAgICAgICAgICBXYXRjaGRvZyAyIGFuZCAzOiBTZXZlcmFsIGNoYW5uZWxzIGNhbiBiZSBtb25pdG9yZWQuIFRvDQotICAgICAgICAgICAgICAgICAgICAgICB1c2UgdGhpcyBmZWF0dXJlLCBjYWxsIHN1Y2Nlc3NpdmVseSB0aGUgZnVuY3Rpb24NCi0gICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfQW5hbG9nV0RHQ29uZmlnKCkgZm9yIGVhY2ggY2hhbm5lbCB0byBiZSBhZGRlZA0KLSAgICAgICAgICAgICAgICAgICAgICAgKG9yIHJlbW92ZWQgd2l0aCB2YWx1ZSAnQURDX0FOQUxPR1dBVENIRE9HX05PTkUnKS4gVGhpcw0KLSAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX0hBTF9FQ19DSEFOTkVMLiAqLw0KLQ0KLSAgRnVuY3Rpb25hbFN0YXRlIElUTW9kZTsgLyohPCBTcGVjaWZ5IHdoZXRoZXIgdGhlIGFuYWxvZyB3YXRjaGRvZyBpcyBjb25maWd1cmVkDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBpbnRlcnJ1cHQgb3IgcG9sbGluZyBtb2RlLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCB0byBFTkFCTEUgb3IgRElTQUJMRSAqLw0KLQ0KLSAgdWludDMyX3QNCi0gICAgICBIaWdoVGhyZXNob2xkOyAvKiE8IENvbmZpZ3VyZSB0aGUgQURDIGFuYWxvZyB3YXRjaGRvZyBIaWdoIHRocmVzaG9sZA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLiBEZXBlbmRpbmcgb2YgQURDIHJlc29sdXRpb24gc2VsZWN0ZWQgKDEyLCAxMCwgOA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG9yIDYgYml0cyksIHRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2Vlbg0KLSAgICAgICAgICAgICAgICAgICAgICAgIE1pbl9EYXRhID0gMHgwMDAgYW5kIE1heF9EYXRhID0gMHhGRkYsIDB4M0ZGLCAweEZGIG9yDQotICAgICAgICAgICAgICAgICAgICAgICAgMHgzRiByZXNwZWN0aXZlbHkuIE5vdGU6IEFuYWxvZyB3YXRjaGRvZyAyIGFuZCAzIGFyZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0ZWQgdG8gYSByZXNvbHV0aW9uIG9mIDggYml0czogaWYgQURDIHJlc29sdXRpb24gaXMNCi0gICAgICAgICAgICAgICAgICAgICAgICAxMiBiaXRzIHRoZSA0IExTQiBhcmUgaWdub3JlZCwgaWYgQURDIHJlc29sdXRpb24gaXMgMTANCi0gICAgICAgICAgICAgICAgICAgICAgICBiaXRzIHRoZSAyIExTQiBhcmUgaWdub3JlZC4gTm90ZTogSWYgQURDIG92ZXJzYW1wbGluZyBpcw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQsIEFEQyBhbmFsb2cgd2F0Y2hkb2cgdGhyZXNob2xkcyBhcmUgaW1wYWN0ZWQ6DQotICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvbXBhcmlzb24gb2YgYW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZHMgaXMgZG9uZSBvbg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcnNhbXBsaW5nIGZpbmFsIGNvbXB1dGF0aW9uIChhZnRlciByYXRpbyBhbmQNCi0gICAgICAgICAgICAgICAgICAgICAgICBzaGlmdCBhcHBsaWNhdGlvbik6IEFEQyBkYXRhIHJlZ2lzdGVyIGJpdGZpZWxkIFsxNTo0XQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICgxMiBtb3N0IHNpZ25pZmljYW50IGJpdHMpLiAqLw0KLQ0KLSAgdWludDMyX3QNCi0gICAgICBMb3dUaHJlc2hvbGQ7IC8qITwgQ29uZmlndXJlcyB0aGUgQURDIGFuYWxvZyB3YXRjaGRvZyBMb3cgdGhyZXNob2xkIHZhbHVlLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICBEZXBlbmRpbmcgb2YgQURDIHJlc29sdXRpb24gc2VsZWN0ZWQgKDEyLCAxMCwgOCBvciA2DQotICAgICAgICAgICAgICAgICAgICAgICBiaXRzKSwgdGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0NCi0gICAgICAgICAgICAgICAgICAgICAgIDB4MDAwIGFuZCBNYXhfRGF0YSA9IDB4RkZGLCAweDNGRiwgMHhGRiBvciAweDNGDQotICAgICAgICAgICAgICAgICAgICAgICByZXNwZWN0aXZlbHkuIE5vdGU6IEFuYWxvZyB3YXRjaGRvZyAyIGFuZCAzIGFyZSBsaW1pdGVkDQotICAgICAgICAgICAgICAgICAgICAgICB0byBhIHJlc29sdXRpb24gb2YgOCBiaXRzOiBpZiBBREMgcmVzb2x1dGlvbiBpcyAxMiBiaXRzDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSA0IExTQiBhcmUgaWdub3JlZCwgaWYgQURDIHJlc29sdXRpb24gaXMgMTANCi0gICAgICAgICAgICAgICAgICAgICAgIGJpdHMgdGhlIDIgTFNCIGFyZSBpZ25vcmVkLiBOb3RlOiBJZiBBREMgb3ZlcnNhbXBsaW5nIGlzDQotICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkLCBBREMgYW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZHMgYXJlIGltcGFjdGVkOiB0aGUNCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmlzb24gb2YgYW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZHMgaXMgZG9uZSBvbg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyc2FtcGxpbmcgZmluYWwgY29tcHV0YXRpb24gKGFmdGVyIHJhdGlvIGFuZA0KLSAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQgYXBwbGljYXRpb24pOiBBREMgZGF0YSByZWdpc3RlciBiaXRmaWVsZCBbMTU6NF0gKDEyDQotICAgICAgICAgICAgICAgICAgICAgICBtb3N0IHNpZ25pZmljYW50IGJpdHMpLiAqLw0KLQ0KLSAgdWludDMyX3QNCi0gICAgICBGaWx0ZXJpbmdDb25maWc7IC8qITwgU3BlY2lmeSB3aGV0aGVyIGZpbHRlcmluZyBzaG91bGQgYmUgdXNlIGFuZCB0aGUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciBvZiBzYW1wbGVzIHRvIGNvbnNpZGVyLiBCZWZvcmUgc2V0dGluZyBmbGFnIG9yDQotICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzaW5nIGludGVycnVwdCwgYW5hbG9nIHdhdGNoZG9nIGNhbiB3YWl0IHRvIGhhdmUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNldmVyYWwgY29uc2VjdXRpdmUgb3V0LW9mLXdpbmRvdyBzYW1wbGVzLiBUaGlzDQotICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgYWxsb3dzIHRvIGNvbmZpZ3VyZSB0aGlzIG51bWJlci4gVGhpcw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIG9ubHkgYXBwbGllcyB0byBBbmFsb2cgd2F0Y2hkb2cgMS4gRm9yDQotICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcnMsIHVzZSB2YWx1ZSBBRENfQVdEX0ZJTFRFUklOR19OT05FLiBUaGlzDQotICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX2FuYWxvZ193YXRjaGRvZ19maWx0ZXJpbmdfY29uZmlnLiAqLw0KLX0gQURDX0FuYWxvZ1dER0NvbmZUeXBlRGVmOw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQURDIGdyb3VwIGluamVjdGVkIGNvbnRleHRzIHF1ZXVlIGNvbmZpZ3VyYXRpb24NCi0gKiBAbm90ZSAgIFN0cnVjdHVyZSBpbnRlbmRlZCB0byBiZSB1c2VkIG9ubHkgdGhyb3VnaCBzdHJ1Y3R1cmUNCi0gKiAiQURDX0hhbmRsZVR5cGVEZWYiDQotICovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgdWludDMyX3QgQ29udGV4dFF1ZXVlOyAvKiE8IEluamVjdGVkIGNoYW5uZWwgY29uZmlndXJhdGlvbiBjb250ZXh0OiBidWlsZC11cA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyIGVhY2ggSEFMX0FEQ0V4X0luamVjdGVkQ29uZmlnQ2hhbm5lbCgpIGNhbGwgdG8NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSBpbml0aWFsaXplIEpTUVIgcmVnaXN0ZXIgYXQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ0V4X0luamVjdGVkQ29uZmlnQ2hhbm5lbCgpIGxhc3QgY2FsbCAqLw0KLQ0KLSAgdWludDMyX3QgQ2hhbm5lbENvdW50OyAvKiE8IE51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgaW5qZWN0ZWQgc2VxdWVuY2UgKi8NCi19IEFEQ19JbmplY3Rpb25Db25maWdUeXBlRGVmOw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQURDX1N0YXRlcyBBREMgU3RhdGVzDQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEhBTCBBREMgc3RhdGUgbWFjaGluZTogQURDIHN0YXRlcyBkZWZpbml0aW9uIChiaXRmaWVsZHMpDQotICogQG5vdGUgICBBREMgc3RhdGUgbWFjaGluZSBpcyBtYW5hZ2VkIGJ5IGJpdGZpZWxkcywgc3RhdGUgbXVzdCBiZSBjb21wYXJlZA0KLSAqICAgICAgICAgd2l0aCBiaXQgYnkgYml0Lg0KLSAqICAgICAgICAgRm9yIGV4YW1wbGU6DQotICogICAgICAgICAgICIgaWYgKChIQUxfQURDX0dldFN0YXRlKGhhZGMxKSAmIEhBTF9BRENfU1RBVEVfUkVHX0JVU1kpICE9IDBVTCkgIg0KLSAqICAgICAgICAgICAiIGlmICgoSEFMX0FEQ19HZXRTdGF0ZShoYWRjMSkgJiBIQUxfQURDX1NUQVRFX0FXRDEpICE9IDBVTCkgIg0KLSAqLw0KLS8qIFN0YXRlcyBvZiBBREMgZ2xvYmFsIHNjb3BlICovDQotI2RlZmluZSBIQUxfQURDX1NUQVRFX1JFU0VUIFwNCi0gICgweDAwMDAwMDAwVUwpIC8qITwgQURDIG5vdCB5ZXQgaW5pdGlhbGl6ZWQgb3IgZGlzYWJsZWQgKi8NCi0jZGVmaW5lIEhBTF9BRENfU1RBVEVfUkVBRFkgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoMHgwMDAwMDAwMVVMKSAvKiE8IEFEQyBwZXJpcGhlcmFsIHJlYWR5IGZvciB1c2UgXA0KLSAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBIQUxfQURDX1NUQVRFX0JVU1lfSU5URVJOQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKDB4MDAwMDAwMDJVTCkgLyohPCBBREMgaXMgYnVzeSBkdWUgdG8gYW4gaW50ZXJuYWwgcHJvY2VzcyAoaW5pdGlhbGl6YXRpb24sIFwNCi0gICAgICAgICAgICAgICAgICAgIGNhbGlicmF0aW9uKSAqLw0KLSNkZWZpbmUgSEFMX0FEQ19TVEFURV9USU1FT1VUICgweDAwMDAwMDA0VUwpIC8qITwgVGltZU91dCBvY2N1cnJlbmNlICovDQotDQotLyogU3RhdGVzIG9mIEFEQyBlcnJvcnMgKi8NCi0jZGVmaW5lIEhBTF9BRENfU1RBVEVfRVJST1JfSU5URVJOQUwgXA0KLSAgKDB4MDAwMDAwMTBVTCkgLyohPCBJbnRlcm5hbCBlcnJvciBvY2N1cnJlbmNlICovDQotI2RlZmluZSBIQUxfQURDX1NUQVRFX0VSUk9SX0NPTkZJRyBcDQotICAoMHgwMDAwMDAyMFVMKSAvKiE8IENvbmZpZ3VyYXRpb24gZXJyb3Igb2NjdXJyZW5jZSAqLw0KLSNkZWZpbmUgSEFMX0FEQ19TVEFURV9FUlJPUl9ETUEgKDB4MDAwMDAwNDBVTCkgLyohPCBETUEgZXJyb3Igb2NjdXJyZW5jZSAqLw0KLQ0KLS8qIFN0YXRlcyBvZiBBREMgZ3JvdXAgcmVndWxhciAqLw0KLSNkZWZpbmUgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgweDAwMDAwMTAwVUwpIC8qITwgQSBjb252ZXJzaW9uIG9uIEFEQyBncm91cCByZWd1bGFyIGlzIG9uZ29pbmcgb3IgY2FuICAgICBcDQotICAgICAgICAgICAgICAgICAgICBvY2N1ciAoZWl0aGVyIGJ5IGNvbnRpbnVvdXMgbW9kZSwgZXh0ZXJuYWwgdHJpZ2dlciwgbG93ICAgXA0KLSAgICAgICAgICAgICAgICAgICAgcG93ZXIgYXV0byBwb3dlci1vbiAoaWYgZmVhdHVyZSBhdmFpbGFibGUpLCBtdWx0aW1vZGUgQURDIFwNCi0gICAgICAgICAgICAgICAgICAgIG1hc3RlciBjb250cm9sIChpZiBmZWF0dXJlIGF2YWlsYWJsZSkpICovDQotI2RlZmluZSBIQUxfQURDX1NUQVRFX1JFR19FT0MgXA0KLSAgKDB4MDAwMDAyMDBVTCkgLyohPCBDb252ZXJzaW9uIGRhdGEgYXZhaWxhYmxlIG9uIGdyb3VwIHJlZ3VsYXIgKi8NCi0jZGVmaW5lIEhBTF9BRENfU1RBVEVfUkVHX09WUiAoMHgwMDAwMDQwMFVMKSAvKiE8IE92ZXJydW4gb2NjdXJyZW5jZSAqLw0KLSNkZWZpbmUgSEFMX0FEQ19TVEFURV9SRUdfRU9TTVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoMHgwMDAwMDgwMFVMKSAvKiE8IE5vdCBhdmFpbGFibGUgb24gdGhpcyBTVE0zMiBzZXJpZXM6IEVuZCBPZiBTYW1wbGluZyBmbGFnIFwNCi0gICAgICAgICAgICAgICAgICAgIHJhaXNlZCAgKi8NCi0NCi0vKiBTdGF0ZXMgb2YgQURDIGdyb3VwIGluamVjdGVkICovDQotI2RlZmluZSBIQUxfQURDX1NUQVRFX0lOSl9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKDB4MDAwMDEwMDBVTCkgLyohPCBBIGNvbnZlcnNpb24gb24gQURDIGdyb3VwIGluamVjdGVkIGlzIG9uZ29pbmcgb3IgY2FuICAgIFwNCi0gICAgICAgICAgICAgICAgICAgIG9jY3VyIChlaXRoZXIgYnkgYXV0by1pbmplY3Rpb24gbW9kZSwgZXh0ZXJuYWwgdHJpZ2dlciwgICBcDQotICAgICAgICAgICAgICAgICAgICBsb3cgcG93ZXIgYXV0byBwb3dlci1vbiAoaWYgZmVhdHVyZSBhdmFpbGFibGUpLCBtdWx0aW1vZGUgXA0KLSAgICAgICAgICAgICAgICAgICAgQURDIG1hc3RlciBjb250cm9sIChpZiBmZWF0dXJlIGF2YWlsYWJsZSkpICovDQotI2RlZmluZSBIQUxfQURDX1NUQVRFX0lOSl9FT0MgXA0KLSAgKDB4MDAwMDIwMDBVTCkgLyohPCBDb252ZXJzaW9uIGRhdGEgYXZhaWxhYmxlIG9uIGdyb3VwIGluamVjdGVkICovDQotI2RlZmluZSBIQUxfQURDX1NUQVRFX0lOSl9KUU9WRiBcDQotICAoMHgwMDAwNDAwMFVMKSAvKiE8IEluamVjdGVkIHF1ZXVlIG92ZXJmbG93IG9jY3VycmVuY2UgKi8NCi0NCi0vKiBTdGF0ZXMgb2YgQURDIGFuYWxvZyB3YXRjaGRvZ3MgKi8NCi0jZGVmaW5lIEhBTF9BRENfU1RBVEVfQVdEMSBcDQotICAoMHgwMDAxMDAwMFVMKSAvKiE8IE91dC1vZi13aW5kb3cgb2NjdXJyZW5jZSBvZiBBREMgYW5hbG9nIHdhdGNoZG9nIDEgKi8NCi0jZGVmaW5lIEhBTF9BRENfU1RBVEVfQVdEMiBcDQotICAoMHgwMDAyMDAwMFVMKSAvKiE8IE91dC1vZi13aW5kb3cgb2NjdXJyZW5jZSBvZiBBREMgYW5hbG9nIHdhdGNoZG9nIDIgKi8NCi0jZGVmaW5lIEhBTF9BRENfU1RBVEVfQVdEMyBcDQotICAoMHgwMDA0MDAwMFVMKSAvKiE8IE91dC1vZi13aW5kb3cgb2NjdXJyZW5jZSBvZiBBREMgYW5hbG9nIHdhdGNoZG9nIDMgKi8NCi0NCi0vKiBTdGF0ZXMgb2YgQURDIG11bHRpLW1vZGUgKi8NCi0jZGVmaW5lIEhBTF9BRENfU1RBVEVfTVVMVElNT0RFX1NMQVZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoMHgwMDEwMDAwMFVMKSAvKiE8IEFEQyBpbiBtdWx0aW1vZGUgc2xhdmUgc3RhdGUsIGNvbnRyb2xsZWQgYnkgYW5vdGhlciBBREMgXA0KLSAgICAgICAgICAgICAgICAgICAgbWFzdGVyICh3aGVuIGZlYXR1cmUgYXZhaWxhYmxlKSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQGJyaWVmICBBREMgaGFuZGxlIFN0cnVjdHVyZSBkZWZpbml0aW9uDQotICovDQotI2lmIChVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkNCi10eXBlZGVmIHN0cnVjdCBfX0FEQ19IYW5kbGVUeXBlRGVmDQotI2Vsc2UNCi10eXBlZGVmIHN0cnVjdA0KLSNlbmRpZiAvKiBVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi17DQotICBBRENfVHlwZURlZiAqSW5zdGFuY2U7ICAgICAgICAgLyohPCBSZWdpc3RlciBiYXNlIGFkZHJlc3MgKi8NCi0gIEFEQ19Jbml0VHlwZURlZiBJbml0OyAgICAgICAgICAvKiE8IEFEQyBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzIGFuZCByZWd1bGFyDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbnMgc2V0dGluZyAqLw0KLSAgRE1BX0hhbmRsZVR5cGVEZWYgKkRNQV9IYW5kbGU7IC8qITwgUG9pbnRlciBETUEgSGFuZGxlciAqLw0KLSAgSEFMX0xvY2tUeXBlRGVmIExvY2s7ICAgICAgICAgIC8qITwgQURDIGxvY2tpbmcgb2JqZWN0ICovDQotICBfX0lPIHVpbnQzMl90IFN0YXRlOyAvKiE8IEFEQyBjb21tdW5pY2F0aW9uIHN0YXRlIChiaXRtYXAgb2YgQURDIHN0YXRlcykgKi8NCi0gIF9fSU8gdWludDMyX3QgRXJyb3JDb2RlOyAvKiE8IEFEQyBFcnJvciBjb2RlICovDQotICBBRENfSW5qZWN0aW9uQ29uZmlnVHlwZURlZg0KLSAgICAgIEluamVjdGlvbkNvbmZpZzsgLyohPCBBREMgaW5qZWN0ZWQgY2hhbm5lbCBjb25maWd1cmF0aW9uIGJ1aWxkLXVwDQotICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUgKi8NCi0jaWYgKFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQ0KLSAgdm9pZCAoKkNvbnZDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX0FEQ19IYW5kbGVUeXBlRGVmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpoYWRjKTsgLyohPCBBREMgY29udmVyc2lvbiBjb21wbGV0ZSBjYWxsYmFjayAqLw0KLSAgdm9pZCAoKkNvbnZIYWxmQ3BsdENhbGxiYWNrKSgNCi0gICAgICBzdHJ1Y3QgX19BRENfSGFuZGxlVHlwZURlZg0KLSAgICAgICAgICAqaGFkYyk7IC8qITwgQURDIGNvbnZlcnNpb24gRE1BIGhhbGYtdHJhbnNmZXIgY2FsbGJhY2sgKi8NCi0gIHZvaWQgKCpMZXZlbE91dE9mV2luZG93Q2FsbGJhY2spKA0KLSAgICAgIHN0cnVjdCBfX0FEQ19IYW5kbGVUeXBlRGVmICpoYWRjKTsgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIDEgY2FsbGJhY2sgKi8NCi0gIHZvaWQgKCpFcnJvckNhbGxiYWNrKSgNCi0gICAgICBzdHJ1Y3QgX19BRENfSGFuZGxlVHlwZURlZiAqaGFkYyk7IC8qITwgQURDIGVycm9yIGNhbGxiYWNrICovDQotICB2b2lkICgqSW5qZWN0ZWRDb252Q3BsdENhbGxiYWNrKSgNCi0gICAgICBzdHJ1Y3QgX19BRENfSGFuZGxlVHlwZURlZg0KLSAgICAgICAgICAqaGFkYyk7IC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gY29tcGxldGUgY2FsbGJhY2sgKi8NCi0gIHZvaWQgKCpJbmplY3RlZFF1ZXVlT3ZlcmZsb3dDYWxsYmFjaykoDQotICAgICAgc3RydWN0IF9fQURDX0hhbmRsZVR5cGVEZWYNCi0gICAgICAgICAgKmhhZGMpOyAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb250ZXh0IHF1ZXVlIG92ZXJmbG93IGNhbGxiYWNrICovDQotICB2b2lkICgqTGV2ZWxPdXRPZldpbmRvdzJDYWxsYmFjaykoDQotICAgICAgc3RydWN0IF9fQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpOyAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgMiBjYWxsYmFjayAqLw0KLSAgdm9pZCAoKkxldmVsT3V0T2ZXaW5kb3czQ2FsbGJhY2spKA0KLSAgICAgIHN0cnVjdCBfX0FEQ19IYW5kbGVUeXBlRGVmICpoYWRjKTsgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIDMgY2FsbGJhY2sgKi8NCi0gIHZvaWQgKCpFbmRPZlNhbXBsaW5nQ2FsbGJhY2spKA0KLSAgICAgIHN0cnVjdCBfX0FEQ19IYW5kbGVUeXBlRGVmICpoYWRjKTsgLyohPCBBREMgZW5kIG9mIHNhbXBsaW5nIGNhbGxiYWNrICovDQotICB2b2lkICgqTXNwSW5pdENhbGxiYWNrKSgNCi0gICAgICBzdHJ1Y3QgX19BRENfSGFuZGxlVHlwZURlZiAqaGFkYyk7IC8qITwgQURDIE1zcCBJbml0IGNhbGxiYWNrICovDQotICB2b2lkICgqTXNwRGVJbml0Q2FsbGJhY2spKA0KLSAgICAgIHN0cnVjdCBfX0FEQ19IYW5kbGVUeXBlRGVmICpoYWRjKTsgLyohPCBBREMgTXNwIERlSW5pdCBjYWxsYmFjayAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotfSBBRENfSGFuZGxlVHlwZURlZjsNCi0NCi0jaWYgKFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQ0KLS8qKg0KLSAqIEBicmllZiAgSEFMIEFEQyBDYWxsYmFjayBJRCBlbnVtZXJhdGlvbiBkZWZpbml0aW9uDQotICovDQotdHlwZWRlZiBlbnVtIHsNCi0gIEhBTF9BRENfQ09OVkVSU0lPTl9DT01QTEVURV9DQl9JRCA9DQotICAgICAgMHgwMFUsIC8qITwgQURDIGNvbnZlcnNpb24gY29tcGxldGUgY2FsbGJhY2sgSUQgKi8NCi0gIEhBTF9BRENfQ09OVkVSU0lPTl9IQUxGX0NCX0lEID0NCi0gICAgICAweDAxVSwgLyohPCBBREMgY29udmVyc2lvbiBETUEgaGFsZi10cmFuc2ZlciBjYWxsYmFjayBJRCAqLw0KLSAgSEFMX0FEQ19MRVZFTF9PVVRfT0ZfV0lORE9XXzFfQ0JfSUQgPQ0KLSAgICAgIDB4MDJVLCAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgMSBjYWxsYmFjayBJRCAqLw0KLSAgSEFMX0FEQ19FUlJPUl9DQl9JRCA9IDB4MDNVLCAvKiE8IEFEQyBlcnJvciBjYWxsYmFjayBJRCAqLw0KLSAgSEFMX0FEQ19JTkpfQ09OVkVSU0lPTl9DT01QTEVURV9DQl9JRCA9DQotICAgICAgMHgwNFUsIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gY29tcGxldGUgY2FsbGJhY2sgSUQgKi8NCi0gIEhBTF9BRENfSU5KX1FVRVVFX09WRUZMT1dfQ0JfSUQgPQ0KLSAgICAgIDB4MDVVLCAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb250ZXh0IHF1ZXVlIG92ZXJmbG93IGNhbGxiYWNrIElEICovDQotICBIQUxfQURDX0xFVkVMX09VVF9PRl9XSU5ET1dfMl9DQl9JRCA9DQotICAgICAgMHgwNlUsIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyAyIGNhbGxiYWNrIElEICovDQotICBIQUxfQURDX0xFVkVMX09VVF9PRl9XSU5ET1dfM19DQl9JRCA9DQotICAgICAgMHgwN1UsIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyAzIGNhbGxiYWNrIElEICovDQotICBIQUxfQURDX0VORF9PRl9TQU1QTElOR19DQl9JRCA9IDB4MDhVLCAvKiE8IEFEQyBlbmQgb2Ygc2FtcGxpbmcgY2FsbGJhY2sgSUQgKi8NCi0gIEhBTF9BRENfTVNQSU5JVF9DQl9JRCA9IDB4MDlVLCAgLyohPCBBREMgTXNwIEluaXQgY2FsbGJhY2sgSUQgICAgICAgICAgKi8NCi0gIEhBTF9BRENfTVNQREVJTklUX0NCX0lEID0gMHgwQVUgLyohPCBBREMgTXNwIERlSW5pdCBjYWxsYmFjayBJRCAgICAgICAgKi8NCi19IEhBTF9BRENfQ2FsbGJhY2tJRFR5cGVEZWY7DQotDQotLyoqDQotICogQGJyaWVmICBIQUwgQURDIENhbGxiYWNrIHBvaW50ZXIgZGVmaW5pdGlvbg0KLSAqLw0KLXR5cGVkZWYgdm9pZCAoKnBBRENfQ2FsbGJhY2tUeXBlRGVmKSgNCi0gICAgQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpOyAvKiE8IHBvaW50ZXIgdG8gYSBBREMgY2FsbGJhY2sgZnVuY3Rpb24gKi8NCi0NCi0jZW5kaWYgLyogVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQURDX0V4cG9ydGVkX0NvbnN0YW50cyBBREMgRXhwb3J0ZWQgQ29uc3RhbnRzDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEFEQ19FcnJvcl9Db2RlIEFEQyBFcnJvciBDb2RlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIEhBTF9BRENfRVJST1JfTk9ORSBcDQotICAoMHgwMFUpIC8qITwgTm8gZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgSEFMX0FEQ19FUlJPUl9JTlRFUk5BTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoMHgwMVUpIC8qITwgQURDIHBlcmlwaGVyYWwgaW50ZXJuYWwgZXJyb3IgKHByb2JsZW0gb2YgY2xvY2tpbmcsIFwNCi0gICAgICAgICAgICAgICBlbmFibGUvZGlzYWJsZSwgZXJyb25lb3VzIHN0YXRlLCAuLi4pICAgICAgICovDQotI2RlZmluZSBIQUxfQURDX0VSUk9SX09WUiBcDQotICAoMHgwMlUpIC8qITwgT3ZlcnJ1biBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgSEFMX0FEQ19FUlJPUl9ETUEgXA0KLSAgKDB4MDRVKSAvKiE8IERNQSB0cmFuc2ZlciBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIEhBTF9BRENfRVJST1JfSlFPVkYgXA0KLSAgKDB4MDhVKSAvKiE8IEluamVjdGVkIGNvbnRleHQgcXVldWUgb3ZlcmZsb3cgZXJyb3IgICAgICAgKi8NCi0jaWYgKFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQ0KLSNkZWZpbmUgSEFMX0FEQ19FUlJPUl9JTlZBTElEX0NBTExCQUNLICgweDEwVSkgLyohPCBJbnZhbGlkIENhbGxiYWNrIGVycm9yICovDQotI2VuZGlmIC8qIFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBBRENfSEFMX0VDX0NPTU1PTl9DTE9DS19TT1VSQ0UgIEFEQyBjb21tb24gLSBDbG9jayBzb3VyY2UNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgQURDX0NMT0NLX1NZTkNfUENMS19ESVYxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX0NMT0NLX1NZTkNfUENMS19ESVYxKSAvKiE8IEFEQyBzeW5jaHJvbm91cyBjbG9jayBkZXJpdmVkIGZyb20gQUhCIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb2NrIHdpdGhvdXQgcHJlc2NhbGVyICovDQotI2RlZmluZSBBRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjIpIC8qITwgQURDIHN5bmNocm9ub3VzIGNsb2NrIGRlcml2ZWQgZnJvbSBBSEIgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvY2sgd2l0aCBwcmVzY2FsZXIgZGl2aXNpb24gYnkgMiAqLw0KLSNkZWZpbmUgQURDX0NMT0NLX1NZTkNfUENMS19ESVY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX0NMT0NLX1NZTkNfUENMS19ESVY0KSAvKiE8IEFEQyBzeW5jaHJvbm91cyBjbG9jayBkZXJpdmVkIGZyb20gQUhCIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb2NrIHdpdGggcHJlc2NhbGVyIGRpdmlzaW9uIGJ5IDQgKi8NCi0NCi0jZGVmaW5lIEFEQ19DTE9DS19BU1lOQ19ESVYxIFwNCi0gIChMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMSkgLyohPCBBREMgYXN5bmNocm9ub3VzIGNsb2NrIHdpdGhvdXQgcHJlc2NhbGVyICovDQotI2RlZmluZSBBRENfQ0xPQ0tfQVNZTkNfRElWMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX0NMT0NLX0FTWU5DX0RJVjIpIC8qITwgQURDIGFzeW5jaHJvbm91cyBjbG9jayB3aXRoIHByZXNjYWxlciBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdmlzaW9uIGJ5IDIgICAqLw0KLSNkZWZpbmUgQURDX0NMT0NLX0FTWU5DX0RJVjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19DTE9DS19BU1lOQ19ESVY0KSAvKiE8IEFEQyBhc3luY2hyb25vdXMgY2xvY2sgd2l0aCBwcmVzY2FsZXIgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZpc2lvbiBieSA0ICAgKi8NCi0jZGVmaW5lIEFEQ19DTE9DS19BU1lOQ19ESVY2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfQ0xPQ0tfQVNZTkNfRElWNikgLyohPCBBREMgYXN5bmNocm9ub3VzIGNsb2NrIHdpdGggcHJlc2NhbGVyIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2aXNpb24gYnkgNiAgICovDQotI2RlZmluZSBBRENfQ0xPQ0tfQVNZTkNfRElWOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX0NMT0NLX0FTWU5DX0RJVjgpIC8qITwgQURDIGFzeW5jaHJvbm91cyBjbG9jayB3aXRoIHByZXNjYWxlciBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdmlzaW9uIGJ5IDggICAqLw0KLSNkZWZpbmUgQURDX0NMT0NLX0FTWU5DX0RJVjEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMTApIC8qITwgQURDIGFzeW5jaHJvbm91cyBjbG9jayB3aXRoIHByZXNjYWxlciBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZpc2lvbiBieSAxMCAgKi8NCi0jZGVmaW5lIEFEQ19DTE9DS19BU1lOQ19ESVYxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX0NMT0NLX0FTWU5DX0RJVjEyKSAvKiE8IEFEQyBhc3luY2hyb25vdXMgY2xvY2sgd2l0aCBwcmVzY2FsZXIgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2aXNpb24gYnkgMTIgICovDQotI2RlZmluZSBBRENfQ0xPQ0tfQVNZTkNfRElWMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19DTE9DS19BU1lOQ19ESVYxNikgLyohPCBBREMgYXN5bmNocm9ub3VzIGNsb2NrIHdpdGggcHJlc2NhbGVyIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdmlzaW9uIGJ5IDE2ICAqLw0KLSNkZWZpbmUgQURDX0NMT0NLX0FTWU5DX0RJVjMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMzIpIC8qITwgQURDIGFzeW5jaHJvbm91cyBjbG9jayB3aXRoIHByZXNjYWxlciBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZpc2lvbiBieSAzMiAgKi8NCi0jZGVmaW5lIEFEQ19DTE9DS19BU1lOQ19ESVY2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX0NMT0NLX0FTWU5DX0RJVjY0KSAvKiE8IEFEQyBhc3luY2hyb25vdXMgY2xvY2sgd2l0aCBwcmVzY2FsZXIgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2aXNpb24gYnkgNjQgICovDQotI2RlZmluZSBBRENfQ0xPQ0tfQVNZTkNfRElWMTI4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMTI4KSAvKiE8IEFEQyBhc3luY2hyb25vdXMgY2xvY2sgd2l0aCBwcmVzY2FsZXIgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdmlzaW9uIGJ5IDEyOCAqLw0KLSNkZWZpbmUgQURDX0NMT0NLX0FTWU5DX0RJVjI1NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX0NMT0NLX0FTWU5DX0RJVjI1NikgLyohPCBBREMgYXN5bmNocm9ub3VzIGNsb2NrIHdpdGggcHJlc2NhbGVyIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZpc2lvbiBieSAyNTYgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQURDX0hBTF9FQ19SRVNPTFVUSU9OICBBREMgaW5zdGFuY2UgLSBSZXNvbHV0aW9uDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIEFEQ19SRVNPTFVUSU9OXzEyQiBcDQotICAoTExfQURDX1JFU09MVVRJT05fMTJCKSAvKiE8IEFEQyByZXNvbHV0aW9uIDEyIGJpdHMgKi8NCi0jZGVmaW5lIEFEQ19SRVNPTFVUSU9OXzEwQiBcDQotICAoTExfQURDX1JFU09MVVRJT05fMTBCKSAvKiE8IEFEQyByZXNvbHV0aW9uIDEwIGJpdHMgKi8NCi0jZGVmaW5lIEFEQ19SRVNPTFVUSU9OXzhCICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfUkVTT0xVVElPTl84QikgLyohPCBBREMgcmVzb2x1dGlvbiAgOCBiaXRzIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBBRENfUkVTT0xVVElPTl82QiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX1JFU09MVVRJT05fNkIpIC8qITwgQURDIHJlc29sdXRpb24gIDYgYml0cyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBBRENfSEFMX0VDX0RBVEFfQUxJR04gQURDIGNvbnZlcnNpb24gZGF0YSBhbGlnbm1lbnQNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgQURDX0RBVEFBTElHTl9SSUdIVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfREFUQV9BTElHTl9SSUdIVCkgLyohPCBBREMgY29udmVyc2lvbiBkYXRhIGFsaWdubWVudDogcmlnaHQgYWxpZ25lZCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbGlnbm1lbnQgb24gZGF0YSByZWdpc3RlciBMU0IgYml0IDApKi8NCi0jZGVmaW5lIEFEQ19EQVRBQUxJR05fTEVGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19EQVRBX0FMSUdOX0xFRlQpIC8qITwgQURDIGNvbnZlcnNpb24gZGF0YSBhbGlnbm1lbnQ6IGxlZnQgYWxpZ25lZCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFsaWdubWVudCBvbiBkYXRhIHJlZ2lzdGVyIE1TQiBiaXQgMTUpKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQURDX1NjYW5fbW9kZSBBREMgc2VxdWVuY2VyIHNjYW4gbW9kZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBBRENfU0NBTl9ESVNBQkxFICgweDAwMDAwMDAwVUwpIC8qITwgU2NhbiBtb2RlIGRpc2FibGVkICovDQotI2RlZmluZSBBRENfU0NBTl9FTkFCTEUgKDB4MDAwMDAwMDFVTCkgIC8qITwgU2NhbiBtb2RlIGVuYWJsZWQgICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEFEQ19yZWd1bGFyX2V4dGVybmFsX3RyaWdnZXJfc291cmNlIEFEQyBncm91cCByZWd1bGFyIHRyaWdnZXINCi0gKiBzb3VyY2UNCi0gKiBAew0KLSAqLw0KLS8qIEFEQyBncm91cCByZWd1bGFyIHRyaWdnZXIgc291cmNlcyBmb3IgYWxsIEFEQyBpbnN0YW5jZXMgKi8NCi0jZGVmaW5lIEFEQ19TT0ZUV0FSRV9TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfUkVHX1RSSUdfU09GVFdBUkUpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOiBTVyBzdGFydC4gKi8NCi0jZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdfVDFfVFJHTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX1JFR19UUklHX0VYVF9USU0xX1RSR08pIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTEgVFJHTy4gICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmcpLiAqLw0KLSNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR19UMV9UUkdPMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX1JFR19UUklHX0VYVF9USU0xX1RSR08yKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMSBUUkdPMi4gICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nKS4gKi8NCi0jZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdfVDFfQ0MxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfQ0gxKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTEgY2hhbm5lbCAxIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgY2FwdHVyZSkuIFRyaWdnZXIgZWRnZSBzZXQgdG8gICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8NCi0jZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdfVDFfQ0MyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfQ0gyKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTEgY2hhbm5lbCAyIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgY2FwdHVyZSkuIFRyaWdnZXIgZWRnZSBzZXQgdG8gICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8NCi0jZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdfVDFfQ0MzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfQ0gzKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTEgY2hhbm5lbCAzIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgY2FwdHVyZSkuIFRyaWdnZXIgZWRnZSBzZXQgdG8gICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8NCi0jZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdfVDJfVFJHTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX1JFR19UUklHX0VYVF9USU0yX1RSR08pIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTIgVFJHTy4gICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmcpLiAqLw0KLSNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR19UMl9DQzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19SRUdfVFJJR19FWFRfVElNMl9DSDEpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMiBjaGFubmVsIDEgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50IChjYXB0dXJlIGNvbXBhcmU6IGlucHV0IGNhcHR1cmUgb3IgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBjYXB0dXJlKS4gVHJpZ2dlciBlZGdlIHNldCB0byAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLw0KLSNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR19UMl9DQzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19SRUdfVFJJR19FWFRfVElNMl9DSDIpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMiBjaGFubmVsIDIgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50IChjYXB0dXJlIGNvbXBhcmU6IGlucHV0IGNhcHR1cmUgb3IgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBjYXB0dXJlKS4gVHJpZ2dlciBlZGdlIHNldCB0byAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLw0KLSNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR19UMl9DQzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19SRUdfVFJJR19FWFRfVElNMl9DSDMpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMiBjaGFubmVsIDMgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50IChjYXB0dXJlIGNvbXBhcmU6IGlucHV0IGNhcHR1cmUgb3IgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBjYXB0dXJlKS4gVHJpZ2dlciBlZGdlIHNldCB0byAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLw0KLSNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR19UM19UUkdPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTNfVFJHTykgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMyBUUkdPLiAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZykuICovDQotI2RlZmluZSBBRENfRVhURVJOQUxUUklHX1QzX0NDMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX1JFR19UUklHX0VYVF9USU0zX0NIMSkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU0zIGNoYW5uZWwgMSBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQgKGNhcHR1cmUgY29tcGFyZTogaW5wdXQgY2FwdHVyZSBvciBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IGNhcHR1cmUpLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovDQotI2RlZmluZSBBRENfRVhURVJOQUxUUklHX1QzX0NDNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX1JFR19UUklHX0VYVF9USU0zX0NINCkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU0zIGNoYW5uZWwgNCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQgKGNhcHR1cmUgY29tcGFyZTogaW5wdXQgY2FwdHVyZSBvciBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IGNhcHR1cmUpLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovDQotI2RlZmluZSBBRENfRVhURVJOQUxUUklHX1Q0X1RSR08gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19SRUdfVFJJR19FWFRfVElNNF9UUkdPKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU00IFRSR08uICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nKS4gKi8NCi0jZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdfVDRfQ0MxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTRfQ0gxKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTQgY2hhbm5lbCAxIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgY2FwdHVyZSkuIFRyaWdnZXIgZWRnZSBzZXQgdG8gICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8NCi0jZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdfVDRfQ0M0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTRfQ0g0KSAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTQgY2hhbm5lbCA0IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgY2FwdHVyZSkuIFRyaWdnZXIgZWRnZSBzZXQgdG8gICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8NCi0jZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdfVDZfVFJHTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX1JFR19UUklHX0VYVF9USU02X1RSR08pIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTYgVFJHTy4gICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmcpLiAqLw0KLSNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR19UN19UUkdPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTdfVFJHTykgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNNyBUUkdPLiAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZykuICovDQotI2RlZmluZSBBRENfRVhURVJOQUxUUklHX1Q4X1RSR08gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19SRUdfVFJJR19FWFRfVElNOF9UUkdPKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU04IFRSR08uICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nKS4gKi8NCi0jZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdfVDhfVFJHTzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19SRUdfVFJJR19FWFRfVElNOF9UUkdPMikgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTggVFJHTzIuICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZykuICovDQotI2RlZmluZSBBRENfRVhURVJOQUxUUklHX1Q4X0NDMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX1JFR19UUklHX0VYVF9USU04X0NIMSkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU04IGNoYW5uZWwgMSBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQgKGNhcHR1cmUgY29tcGFyZTogaW5wdXQgY2FwdHVyZSBvciBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IGNhcHR1cmUpLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovDQotI2RlZmluZSBBRENfRVhURVJOQUxUUklHX1QxNV9UUkdPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTE1X1RSR08pIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU0xNSBUUkdPLiAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmcpLiAqLw0KLSNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR19UMjBfVFJHTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX1JFR19UUklHX0VYVF9USU0yMF9UUkdPKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMjAgVFJHTy4gICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nKS4gKi8NCi0jZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdfVDIwX1RSR08yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX1JFR19UUklHX0VYVF9USU0yMF9UUkdPMikgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMjAgVFJHTzIuIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlICAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgc2V0dGluZykuICovDQotI2RlZmluZSBBRENfRVhURVJOQUxUUklHX1QyMF9DQzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTIwX0NIMSkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTIwIGNoYW5uZWwgMSBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50IChjYXB0dXJlIGNvbXBhcmU6IGlucHV0IGNhcHR1cmUgb3IgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IGNhcHR1cmUpLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8NCi0jZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdfVDIwX0NDMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19SRUdfVFJJR19FWFRfVElNMjBfQ0gyKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMjAgY2hhbm5lbCAyIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQgKGNhcHR1cmUgY29tcGFyZTogaW5wdXQgY2FwdHVyZSBvciAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgY2FwdHVyZSkuIFRyaWdnZXIgZWRnZSBzZXQgdG8gICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLw0KLSNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR19UMjBfQ0MzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX1JFR19UUklHX0VYVF9USU0yMF9DSDMpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU0yMCBjaGFubmVsIDMgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBjYXB0dXJlKS4gVHJpZ2dlciBlZGdlIHNldCB0byAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovDQotI2RlZmluZSBBRENfRVhURVJOQUxUUklHX0hSVElNX1RSRzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX1JFR19UUklHX0VYVF9IUlRJTV9UUkcxKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IEhSVElNRVIgQURDICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyIDEgZXZlbnQuIFRyaWdnZXIgZWRnZSBzZXQgdG8gICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8NCi0jZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdfSFJUSU1fVFJHMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfUkVHX1RSSUdfRVhUX0hSVElNX1RSRzIpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogSFJUSU1FUiBBREMgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXIgMiBldmVudC4gVHJpZ2dlciBlZGdlIHNldCB0byAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLw0KLSNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR19IUlRJTV9UUkczICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19SRUdfVFJJR19FWFRfSFJUSU1fVFJHMykgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBIUlRJTUVSIEFEQyAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlciAzIGV2ZW50LiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovDQotI2RlZmluZSBBRENfRVhURVJOQUxUUklHX0hSVElNX1RSRzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX1JFR19UUklHX0VYVF9IUlRJTV9UUkc0KSAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IEhSVElNRVIgQURDICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyIDQgZXZlbnQuIFRyaWdnZXIgZWRnZSBzZXQgdG8gICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8NCi0jZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdfSFJUSU1fVFJHNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfUkVHX1RSSUdfRVhUX0hSVElNX1RSRzUpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogSFJUSU1FUiBBREMgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXIgNSBldmVudC4gVHJpZ2dlciBlZGdlIHNldCB0byAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLw0KLSNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR19IUlRJTV9UUkc2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19SRUdfVFJJR19FWFRfSFJUSU1fVFJHNikgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBIUlRJTUVSIEFEQyAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlciA2IGV2ZW50LiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovDQotI2RlZmluZSBBRENfRVhURVJOQUxUUklHX0hSVElNX1RSRzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX1JFR19UUklHX0VYVF9IUlRJTV9UUkc3KSAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IEhSVElNRVIgQURDICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyIDcgZXZlbnQuIFRyaWdnZXIgZWRnZSBzZXQgdG8gICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8NCi0jZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdfSFJUSU1fVFJHOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfUkVHX1RSSUdfRVhUX0hSVElNX1RSRzgpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogSFJUSU1FUiBBREMgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXIgOCBldmVudC4gVHJpZ2dlciBlZGdlIHNldCB0byAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLw0KLSNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR19IUlRJTV9UUkc5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19SRUdfVFJJR19FWFRfSFJUSU1fVFJHOSkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBIUlRJTUVSIEFEQyAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlciA5IGV2ZW50LiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovDQotI2RlZmluZSBBRENfRVhURVJOQUxUUklHX0hSVElNX1RSRzEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19SRUdfVFJJR19FWFRfSFJUSU1fVFJHMTApIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IEhSVElNRVIgQURDICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlciAxMCBldmVudC4gVHJpZ2dlciBlZGdlIHNldCB0byAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLw0KLSNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR19FWFRfSVQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19SRUdfVFJJR19FWFRfRVhUSV9MSU5FMikgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBleHRlcm5hbCAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0IGxpbmUgMi4gVHJpZ2dlciBlZGdlIHNldCB0byAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovDQotI2RlZmluZSBBRENfRVhURVJOQUxUUklHX0VYVF9JVDExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19SRUdfVFJJR19FWFRfRVhUSV9MSU5FMTEpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IGV4dGVybmFsICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0IGxpbmUgMTEuIFRyaWdnZXIgZWRnZSBzZXQgdG8gXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLw0KLSNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR19MUFRJTV9PVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX1JFR19UUklHX0VYVF9MUFRJTV9PVVQpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBMUFRJTUVSIE9VVCAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0IHNldHRpbmcpLiAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBBRENfcmVndWxhcl9leHRlcm5hbF90cmlnZ2VyX2VkZ2UgQURDIGdyb3VwIHJlZ3VsYXIgdHJpZ2dlciBlZGdlDQotICogKHdoZW4gZXh0ZXJuYWwgdHJpZ2dlciBpcyBzZWxlY3RlZCkNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0NPTlZFREdFX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgweDAwMDAwMDAwVUwpIC8qITwgUmVndWxhciBjb252ZXJzaW9ucyBoYXJkd2FyZSB0cmlnZ2VyIGRldGVjdGlvbiBkaXNhYmxlZCBcDQotICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdDT05WRURHRV9SSVNJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19SRUdfVFJJR19FWFRfUklTSU5HKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbGFyaXR5IHNldCB0byByaXNpbmcgZWRnZSAqLw0KLSNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0NPTlZFREdFX0ZBTExJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19SRUdfVFJJR19FWFRfRkFMTElORykgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9sYXJpdHkgc2V0IHRvIGZhbGxpbmcgZWRnZSAqLw0KLSNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0NPTlZFREdFX1JJU0lOR0ZBTExJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19SRUdfVFJJR19FWFRfUklTSU5HRkFMTElORykgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlciBwb2xhcml0eSBzZXQgdG8gYm90aCByaXNpbmcgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGZhbGxpbmcgZWRnZXMgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQURDX3JlZ3VsYXJfc2FtcGxpbmdfbW9kZSBBREMgZ3JvdXAgcmVndWxhciBzYW1wbGluZyBtb2RlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIEFEQ19TQU1QTElOR19NT0RFX05PUk1BTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKDB4MDAwMDAwMDBVTCkgLyohPCBBREMgY29udmVyc2lvbnMgc2FtcGxpbmcgcGhhc2UgZHVyYXRpb24gaXMgZGVmaW5lZCB1c2luZyBcDQotICAgICAgICAgICAgICAgICAgICBAcmVmIEFEQ19IQUxfRUNfQ0hBTk5FTF9TQU1QTElOR1RJTUUgKi8NCi0jZGVmaW5lIEFEQ19TQU1QTElOR19NT0RFX0JVTEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19DRkdSMl9CVUxCKSAvKiE8IEFEQyBjb252ZXJzaW9ucyBzYW1wbGluZyBwaGFzZSBzdGFydHMgaW1tZWRpYXRlbHkgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgIGFmdGVyIGVuZCBvZiBjb252ZXJzaW9uLCBhbmQgc3RvcHMgdXBvbiB0cmlnZ2VyIGV2ZW50LiAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogRmlyc3QgY29udmVyc2lvbiBpcyB1c2luZyBtaW5pbWFsICAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZyB0aW1lIChzZWUgQHJlZiBBRENfSEFMX0VDX0NIQU5ORUxfU0FNUExJTkdUSU1FKSBcDQotICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgQURDX1NBTVBMSU5HX01PREVfVFJJR0dFUl9DT05UUk9MRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0NGR1IyX1NNUFRSSUcpIC8qITwgQURDIGNvbnZlcnNpb25zIHNhbXBsaW5nIHBoYXNlIGlzIGNvbnRyb2xsZWQgYnkgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlciBldmVudHM6IFRyaWdnZXIgcmlzaW5nIGVkZ2UgID0gc3RhcnQgc2FtcGxpbmcgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJpZ2dlciBmYWxsaW5nIGVkZ2UgPSBzdG9wIHNhbXBsaW5nIGFuZCAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0IGNvbnZlcnNpb24gKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQURDX0VPQ1NlbGVjdGlvbiBBREMgc2VxdWVuY2VyIGVuZCBvZiB1bml0YXJ5IGNvbnZlcnNpb24gb3INCi0gKiBzZXF1ZW5jZSBjb252ZXJzaW9ucw0KLSAqIEB7DQotICovDQotI2RlZmluZSBBRENfRU9DX1NJTkdMRV9DT05WIFwNCi0gIChBRENfSVNSX0VPQykgLyohPCBFbmQgb2YgdW5pdGFyeSBjb252ZXJzaW9uIGZsYWcgICovDQotI2RlZmluZSBBRENfRU9DX1NFUV9DT05WIFwNCi0gIChBRENfSVNSX0VPUykgLyohPCBFbmQgb2Ygc2VxdWVuY2UgY29udmVyc2lvbnMgZmxhZyAgICAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBBRENfSEFMX0VDX1JFR19PVlJfREFUQV9CRUhBVklPUiAgQURDIGdyb3VwIHJlZ3VsYXIgLSBPdmVycnVuDQotICogYmVoYXZpb3Igb24gY29udmVyc2lvbiBkYXRhDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIEFEQ19PVlJfREFUQV9QUkVTRVJWRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfUkVHX09WUl9EQVRBX1BSRVNFUlZFRCkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBiZWhhdmlvciBpbiBjYXNlIG9mIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcnJ1bjogZGF0YSBwcmVzZXJ2ZWQgKi8NCi0jZGVmaW5lIEFEQ19PVlJfREFUQV9PVkVSV1JJVFRFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19SRUdfT1ZSX0RBVEFfT1ZFUldSSVRURU4pIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgYmVoYXZpb3IgaW4gY2FzZSBvZiBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcnJ1bjogZGF0YSBvdmVyd3JpdHRlbiAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBBRENfSEFMX0VDX1JFR19TRVFfUkFOS1MgIEFEQyBncm91cCByZWd1bGFyIC0gU2VxdWVuY2VyIHJhbmtzDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIEFEQ19SRUdVTEFSX1JBTktfMSBcDQotICAoTExfQURDX1JFR19SQU5LXzEpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgMSAqLw0KLSNkZWZpbmUgQURDX1JFR1VMQVJfUkFOS18yIFwNCi0gIChMTF9BRENfUkVHX1JBTktfMikgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgcmFuayAyICovDQotI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzMgXA0KLSAgKExMX0FEQ19SRUdfUkFOS18zKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciByYW5rIDMgKi8NCi0jZGVmaW5lIEFEQ19SRUdVTEFSX1JBTktfNCBcDQotICAoTExfQURDX1JFR19SQU5LXzQpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgNCAqLw0KLSNkZWZpbmUgQURDX1JFR1VMQVJfUkFOS181IFwNCi0gIChMTF9BRENfUkVHX1JBTktfNSkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgcmFuayA1ICovDQotI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzYgXA0KLSAgKExMX0FEQ19SRUdfUkFOS182KSAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciByYW5rIDYgKi8NCi0jZGVmaW5lIEFEQ19SRUdVTEFSX1JBTktfNyBcDQotICAoTExfQURDX1JFR19SQU5LXzcpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgNyAqLw0KLSNkZWZpbmUgQURDX1JFR1VMQVJfUkFOS184IFwNCi0gIChMTF9BRENfUkVHX1JBTktfOCkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgcmFuayA4ICovDQotI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzkgXA0KLSAgKExMX0FEQ19SRUdfUkFOS185KSAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciByYW5rIDkgKi8NCi0jZGVmaW5lIEFEQ19SRUdVTEFSX1JBTktfMTAgXA0KLSAgKExMX0FEQ19SRUdfUkFOS18xMCkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgcmFuayAxMCAqLw0KLSNkZWZpbmUgQURDX1JFR1VMQVJfUkFOS18xMSBcDQotICAoTExfQURDX1JFR19SQU5LXzExKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciByYW5rIDExICovDQotI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzEyIFwNCi0gIChMTF9BRENfUkVHX1JBTktfMTIpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgMTIgKi8NCi0jZGVmaW5lIEFEQ19SRUdVTEFSX1JBTktfMTMgXA0KLSAgKExMX0FEQ19SRUdfUkFOS18xMykgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgcmFuayAxMyAqLw0KLSNkZWZpbmUgQURDX1JFR1VMQVJfUkFOS18xNCBcDQotICAoTExfQURDX1JFR19SQU5LXzE0KSAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciByYW5rIDE0ICovDQotI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzE1IFwNCi0gIChMTF9BRENfUkVHX1JBTktfMTUpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgMTUgKi8NCi0jZGVmaW5lIEFEQ19SRUdVTEFSX1JBTktfMTYgXA0KLSAgKExMX0FEQ19SRUdfUkFOS18xNikgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgcmFuayAxNiAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBBRENfSEFMX0VDX0NIQU5ORUxfU0FNUExJTkdUSU1FICBDaGFubmVsIC0gU2FtcGxpbmcgdGltZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBBRENfU0FNUExFVElNRV8yQ1lDTEVTXzUgXA0KLSAgKExMX0FEQ19TQU1QTElOR1RJTUVfMkNZQ0xFU181KSAvKiE8IFNhbXBsaW5nIHRpbWUgMi41IEFEQyBjbG9jayBjeWNsZXMgKi8NCi0jZGVmaW5lIEFEQ19TQU1QTEVUSU1FXzZDWUNMRVNfNSBcDQotICAoTExfQURDX1NBTVBMSU5HVElNRV82Q1lDTEVTXzUpIC8qITwgU2FtcGxpbmcgdGltZSA2LjUgQURDIGNsb2NrIGN5Y2xlcyAqLw0KLSNkZWZpbmUgQURDX1NBTVBMRVRJTUVfMTJDWUNMRVNfNSBcDQotICAoTExfQURDX1NBTVBMSU5HVElNRV8xMkNZQ0xFU181KSAvKiE8IFNhbXBsaW5nIHRpbWUgMTIuNSBBREMgY2xvY2sgY3ljbGVzICovDQotI2RlZmluZSBBRENfU0FNUExFVElNRV8yNENZQ0xFU181IFwNCi0gIChMTF9BRENfU0FNUExJTkdUSU1FXzI0Q1lDTEVTXzUpIC8qITwgU2FtcGxpbmcgdGltZSAyNC41IEFEQyBjbG9jayBjeWNsZXMgKi8NCi0jZGVmaW5lIEFEQ19TQU1QTEVUSU1FXzQ3Q1lDTEVTXzUgXA0KLSAgKExMX0FEQ19TQU1QTElOR1RJTUVfNDdDWUNMRVNfNSkgLyohPCBTYW1wbGluZyB0aW1lIDQ3LjUgQURDIGNsb2NrIGN5Y2xlcyAqLw0KLSNkZWZpbmUgQURDX1NBTVBMRVRJTUVfOTJDWUNMRVNfNSBcDQotICAoTExfQURDX1NBTVBMSU5HVElNRV85MkNZQ0xFU181KSAvKiE8IFNhbXBsaW5nIHRpbWUgOTIuNSBBREMgY2xvY2sgY3ljbGVzICovDQotI2RlZmluZSBBRENfU0FNUExFVElNRV8yNDdDWUNMRVNfNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19TQU1QTElOR1RJTUVfMjQ3Q1lDTEVTXzUpIC8qITwgU2FtcGxpbmcgdGltZSAyNDcuNSBBREMgY2xvY2sgY3ljbGVzIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIEFEQ19TQU1QTEVUSU1FXzY0MENZQ0xFU181ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX1NBTVBMSU5HVElNRV82NDBDWUNMRVNfNSkgLyohPCBTYW1wbGluZyB0aW1lIDY0MC41IEFEQyBjbG9jayBjeWNsZXMgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgQURDX1NBTVBMRVRJTUVfM0NZQ0xFU181ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX1NNUFIxX1NNUFBMVVMgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBMTF9BRENfU0FNUExJTkdUSU1FXzJDWUNMRVNfNSkgLyohPCBTYW1wbGluZyB0aW1lIDMuNSBBREMgY2xvY2sgY3ljbGVzLiBJZiAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZCwgdGhpcyBzYW1wbGluZyB0aW1lIHJlcGxhY2VzIGFsbCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nIHRpbWUgMi41IEFEQyBjbG9jayBjeWNsZXMuIFRoZXNlIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiBzYW1wbGluZyB0aW1lcyBjYW5ub3QgYmUgdXNlZCAgICAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW11bHRhbmVvdXNseS4gKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQURDX0hBTF9FQ19DSEFOTkVMICBBREMgaW5zdGFuY2UgLSBDaGFubmVsIG51bWJlcg0KLSAqIEB7DQotICovDQotLyogTm90ZTogVnJlZkludCwgVGVtcFNlbnNvciBhbmQgVmJhdCBpbnRlcm5hbCBjaGFubmVscyBhcmUgbm90IGF2YWlsYWJsZSBvbiAgKi8NCi0vKiAgICAgICAgYWxsIEFEQyBpbnN0YW5jZXMgKHJlZmVyIHRvIFJlZmVyZW5jZSBNYW51YWwpLiAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgQURDX0NIQU5ORUxfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX0NIQU5ORUxfMCkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBBREN4X0lOMCAgKi8NCi0jZGVmaW5lIEFEQ19DSEFOTkVMXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19DSEFOTkVMXzEpIC8qITwgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBcDQotICAgICAgICAgICAgICAgICAgICAgICAgQURDeF9JTjEgICovDQotI2RlZmluZSBBRENfQ0hBTk5FTF8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfQ0hBTk5FTF8yKSAvKiE8IEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEFEQ3hfSU4yICAqLw0KLSNkZWZpbmUgQURDX0NIQU5ORUxfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX0NIQU5ORUxfMykgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBBREN4X0lOMyAgKi8NCi0jZGVmaW5lIEFEQ19DSEFOTkVMXzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19DSEFOTkVMXzQpIC8qITwgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBcDQotICAgICAgICAgICAgICAgICAgICAgICAgQURDeF9JTjQgICovDQotI2RlZmluZSBBRENfQ0hBTk5FTF81ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfQ0hBTk5FTF81KSAvKiE8IEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEFEQ3hfSU41ICAqLw0KLSNkZWZpbmUgQURDX0NIQU5ORUxfNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX0NIQU5ORUxfNikgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBBREN4X0lONiAgKi8NCi0jZGVmaW5lIEFEQ19DSEFOTkVMXzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19DSEFOTkVMXzcpIC8qITwgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBcDQotICAgICAgICAgICAgICAgICAgICAgICAgQURDeF9JTjcgICovDQotI2RlZmluZSBBRENfQ0hBTk5FTF84ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfQ0hBTk5FTF84KSAvKiE8IEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEFEQ3hfSU44ICAqLw0KLSNkZWZpbmUgQURDX0NIQU5ORUxfOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX0NIQU5ORUxfOSkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBBREN4X0lOOSAgKi8NCi0jZGVmaW5lIEFEQ19DSEFOTkVMXzEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX0NIQU5ORUxfMTApIC8qITwgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBwaW4pIEFEQ3hfSU4xMCAqLw0KLSNkZWZpbmUgQURDX0NIQU5ORUxfMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfQ0hBTk5FTF8xMSkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgIHBpbikgQURDeF9JTjExICovDQotI2RlZmluZSBBRENfQ0hBTk5FTF8xMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19DSEFOTkVMXzEyKSAvKiE8IEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgcGluKSBBREN4X0lOMTIgKi8NCi0jZGVmaW5lIEFEQ19DSEFOTkVMXzEzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX0NIQU5ORUxfMTMpIC8qITwgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBwaW4pIEFEQ3hfSU4xMyAqLw0KLSNkZWZpbmUgQURDX0NIQU5ORUxfMTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfQ0hBTk5FTF8xNCkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgIHBpbikgQURDeF9JTjE0ICovDQotI2RlZmluZSBBRENfQ0hBTk5FTF8xNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19DSEFOTkVMXzE1KSAvKiE8IEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgcGluKSBBREN4X0lOMTUgKi8NCi0jZGVmaW5lIEFEQ19DSEFOTkVMXzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX0NIQU5ORUxfMTYpIC8qITwgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBwaW4pIEFEQ3hfSU4xNiAqLw0KLSNkZWZpbmUgQURDX0NIQU5ORUxfMTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfQ0hBTk5FTF8xNykgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgIHBpbikgQURDeF9JTjE3ICovDQotI2RlZmluZSBBRENfQ0hBTk5FTF8xOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19DSEFOTkVMXzE4KSAvKiE8IEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgcGluKSBBREN4X0lOMTggKi8NCi0jZGVmaW5lIEFEQ19DSEFOTkVMX1ZSRUZJTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfQ0hBTk5FTF9WUkVGSU5UKSAvKiE8IEFEQyBpbnRlcm5hbCBjaGFubmVsIGNvbm5lY3RlZCB0byBWcmVmSW50OiAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcm5hbCB2b2x0YWdlIHJlZmVyZW5jZS4gT24gdGhpcyBTVE0zMiAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpZXMsIEFEQyBjaGFubmVsIGF2YWlsYWJsZSBvbiBhbGwgaW5zdGFuY2VzIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXQgQURDMi4gKi8NCi0jZGVmaW5lIEFEQ19DSEFOTkVMX1RFTVBTRU5TT1JfQURDMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1JfQURDMSkgLyohPCBBREMgaW50ZXJuYWwgY2hhbm5lbCBjb25uZWN0ZWQgdG8gICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wZXJhdHVyZSBzZW5zb3IuIE9uIHRoaXMgU1RNMzIgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmllcywgQURDIGNoYW5uZWwgYXZhaWxhYmxlIG9ubHkgb24gXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDMSBpbnN0YW5jZS4gKi8NCi0jZGVmaW5lIEFEQ19DSEFOTkVMX1RFTVBTRU5TT1JfQURDNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1JfQURDNSkgLyohPCBBREMgaW50ZXJuYWwgY2hhbm5lbCBjb25uZWN0ZWQgdG8gICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wZXJhdHVyZSBzZW5zb3IuIE9uIHRoaXMgU1RNMzIgICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmllcywgQURDIGNoYW5uZWwgYXZhaWxhYmxlIG9ubHkgb24gICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDNSBpbnN0YW5jZS4gUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgQURDNSBhdmFpbGFpYmlsaXR5ICovDQotI2RlZmluZSBBRENfQ0hBTk5FTF9WQkFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfQ0hBTk5FTF9WQkFUKSAvKiE8IEFEQyBpbnRlcm5hbCBjaGFubmVsIGNvbm5lY3RlZCB0byBWYmF0LzM6IFZiYXQgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHRhZ2UgdGhyb3VnaCBhIGRpdmlkZXIgbGFkZGVyIG9mIGZhY3RvciAxLzMgdG8gICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZSBWYmF0IGFsd2F5cyBiZWxvdyBWZGRhLiBPbiB0aGlzIFNUTTMyIHNlcmllcywgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBBREMgY2hhbm5lbCBhdmFpbGFibGUgb24gYWxsIEFEQyBpbnN0YW5jZXMgYnV0IEFEQzIgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICYgQURDNC4gUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgQURDNCAgICAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhaWJpbGl0eSAqLw0KLSNkZWZpbmUgQURDX0NIQU5ORUxfVk9QQU1QMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX0NIQU5ORUxfVk9QQU1QMSkgLyohPCBBREMgaW50ZXJuYWwgY2hhbm5lbCBjb25uZWN0ZWQgdG8gT1BBTVAxIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBBREMgY2hhbm5lbCAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSBvbmx5IG9uIEFEQzEgaW5zdGFuY2UuICovDQotI2RlZmluZSBBRENfQ0hBTk5FTF9WT1BBTVAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfQ0hBTk5FTF9WT1BBTVAyKSAvKiE8IEFEQyBpbnRlcm5hbCBjaGFubmVsIGNvbm5lY3RlZCB0byBPUEFNUDIgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC4gT24gdGhpcyBTVE0zMiBzZXJpZXMsIEFEQyBjaGFubmVsICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlIG9ubHkgb24gQURDMiBpbnN0YW5jZS4gKi8NCi0jZGVmaW5lIEFEQ19DSEFOTkVMX1ZPUEFNUDNfQURDMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX0NIQU5ORUxfVk9QQU1QM19BREMyKSAvKiE8IEFEQyBpbnRlcm5hbCBjaGFubmVsIGNvbm5lY3RlZCB0byBPUEFNUDMgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LiBPbiB0aGlzIFNUTTMyIHNlcmllcywgQURDIGNoYW5uZWwgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSBvbmx5IG9uIEFEQzIgaW5zdGFuY2UuICovDQotI2RlZmluZSBBRENfQ0hBTk5FTF9WT1BBTVAzX0FEQzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19DSEFOTkVMX1ZPUEFNUDNfQURDMykgLyohPCBBREMgaW50ZXJuYWwgY2hhbm5lbCBjb25uZWN0ZWQgdG8gT1BBTVAzIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC4gT24gdGhpcyBTVE0zMiBzZXJpZXMsIEFEQyBjaGFubmVsICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUgb25seSBvbiBBREMzIGluc3RhbmNlLiBSZWZlciB0byAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlIGRhdGFzaGVldCBmb3IgQURDMyBhdmFpbGFiaWxpdHkgKi8NCi0jZGVmaW5lIEFEQ19DSEFOTkVMX1ZPUEFNUDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19DSEFOTkVMX1ZPUEFNUDQpIC8qITwgQURDIGludGVybmFsIGNoYW5uZWwgY29ubmVjdGVkIHRvIE9QQU1QNCAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LiBPbiB0aGlzIFNUTTMyIHNlcmllcywgQURDIGNoYW5uZWwgICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUgb25seSBvbiBBREM1IGluc3RhbmNlLiBSZWZlciB0byBkZXZpY2UgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFzaGVldCBmb3IgQURDNSBhdmFpbGFiaWxpdHkgKi8NCi0jZGVmaW5lIEFEQ19DSEFOTkVMX1ZPUEFNUDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19DSEFOTkVMX1ZPUEFNUDUpIC8qITwgQURDIGludGVybmFsIGNoYW5uZWwgY29ubmVjdGVkIHRvIE9QQU1QNSAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LiBPbiB0aGlzIFNUTTMyIHNlcmllcywgQURDIGNoYW5uZWwgICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUgb25seSBvbiBBREM1IGluc3RhbmNlLiBSZWZlciB0byBkZXZpY2UgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFzaGVldCBmb3IgQURDNSBhdmFpbGFiaWxpdHkgKi8NCi0jZGVmaW5lIEFEQ19DSEFOTkVMX1ZPUEFNUDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19DSEFOTkVMX1ZPUEFNUDYpIC8qITwgQURDIGludGVybmFsIGNoYW5uZWwgY29ubmVjdGVkIHRvIE9QQU1QNiAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LiBPbiB0aGlzIFNUTTMyIHNlcmllcywgQURDIGNoYW5uZWwgICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUgb25seSBvbiBBREM0IGluc3RhbmNlLiBSZWZlciB0byBkZXZpY2UgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFzaGVldCBmb3IgQURDNCBhdmFpbGFiaWxpdHkgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQURDX0hBTF9FQ19BV0RfTlVNQkVSIEFuYWxvZyB3YXRjaGRvZyAtIEFuYWxvZyB3YXRjaGRvZyBudW1iZXINCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgQURDX0FOQUxPR1dBVENIRE9HXzEgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19BV0QxKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbnVtYmVyIDEgXA0KLSAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIEFEQ19BTkFMT0dXQVRDSERPR18yICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfQVdEMikgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG51bWJlciAyIFwNCi0gICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBBRENfQU5BTE9HV0FUQ0hET0dfMyAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX0FXRDMpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBudW1iZXIgMyBcDQotICAgICAgICAgICAgICAgICAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBBRENfYW5hbG9nX3dhdGNoZG9nX2ZpbHRlcmluZ19jb25maWcgQURDIEFuYWxvZyBXYXRjaGRvZyBmaWx0ZXJpbmcNCi0gKiBjb25maWd1cmF0aW9uDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIEFEQ19BV0RfRklMVEVSSU5HX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKDB4MDAwMDAwMDBVTCkgLyohPCBBREMgYW5hbG9nIHdhdGhkb2cgbm8gZmlsdGVyaW5nLCBvbmUgb3V0LW9mLXdpbmRvdyBcDQotICAgICAgICAgICAgICAgICAgICBzYW1wbGUgaXMgbmVlZGVkIHRvIHJhaXNlIGZsYWcgb3IgaW50ZXJydXB0ICovDQotI2RlZmluZSBBRENfQVdEX0ZJTFRFUklOR18yU0FNUExFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKEFEQ19UUjFfQVdERklMVF8wKSkgLyohPCBBREMgYW5hbG9nIHdhdGhkb2cgMiBjb25zZWN1dGl2ZXMgb3V0LW9mLXdpbmRvdyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcyBhcmUgbmVlZGVkIHRvIHJhaXNlIGZsYWcgb3IgaW50ZXJydXB0ICovDQotI2RlZmluZSBBRENfQVdEX0ZJTFRFUklOR18zU0FNUExFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKEFEQ19UUjFfQVdERklMVF8xKSkgLyohPCBBREMgYW5hbG9nIHdhdGhkb2cgMyBjb25zZWN1dGl2ZXMgb3V0LW9mLXdpbmRvdyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcyBhcmUgbmVlZGVkIHRvIHJhaXNlIGZsYWcgb3IgaW50ZXJydXB0ICovDQotI2RlZmluZSBBRENfQVdEX0ZJTFRFUklOR180U0FNUExFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKEFEQ19UUjFfQVdERklMVF8xIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIEFEQ19UUjFfQVdERklMVF8wKSkgLyohPCBBREMgYW5hbG9nIHdhdGhkb2cgNCBjb25zZWN1dGl2ZXMgb3V0LW9mLXdpbmRvdyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcyBhcmUgbmVlZGVkIHRvIHJhaXNlIGZsYWcgb3IgaW50ZXJydXB0ICovDQotI2RlZmluZSBBRENfQVdEX0ZJTFRFUklOR181U0FNUExFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKEFEQ19UUjFfQVdERklMVF8yKSkgLyohPCBBREMgYW5hbG9nIHdhdGhkb2cgNSBjb25zZWN1dGl2ZXMgb3V0LW9mLXdpbmRvdyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcyBhcmUgbmVlZGVkIHRvIHJhaXNlIGZsYWcgb3IgaW50ZXJydXB0ICovDQotI2RlZmluZSBBRENfQVdEX0ZJTFRFUklOR182U0FNUExFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKEFEQ19UUjFfQVdERklMVF8yIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIEFEQ19UUjFfQVdERklMVF8wKSkgLyohPCBBREMgYW5hbG9nIHdhdGhkb2cgNiBjb25zZWN1dGl2ZXMgb3V0LW9mLXdpbmRvdyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcyBhcmUgbmVlZGVkIHRvIHJhaXNlIGZsYWcgb3IgaW50ZXJydXB0ICovDQotI2RlZmluZSBBRENfQVdEX0ZJTFRFUklOR183U0FNUExFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKEFEQ19UUjFfQVdERklMVF8yIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIEFEQ19UUjFfQVdERklMVF8xKSkgLyohPCBBREMgYW5hbG9nIHdhdGhkb2cgNyBjb25zZWN1dGl2ZXMgb3V0LW9mLXdpbmRvdyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcyBhcmUgbmVlZGVkIHRvIHJhaXNlIGZsYWcgb3IgaW50ZXJydXB0ICovDQotI2RlZmluZSBBRENfQVdEX0ZJTFRFUklOR184U0FNUExFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKEFEQ19UUjFfQVdERklMVF8yIHwgQURDX1RSMV9BV0RGSUxUXzEgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIEFEQ19UUjFfQVdERklMVF8wKSkgLyohPCBBREMgYW5hbG9nIHdhdGhkb2cgOCBjb25zZWN1dGl2ZXMgb3V0LW9mLXdpbmRvdyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcyBhcmUgbmVlZGVkIHRvIHJhaXNlIGZsYWcgb3IgaW50ZXJydXB0ICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEFEQ19hbmFsb2dfd2F0Y2hkb2dfbW9kZSBBREMgQW5hbG9nIFdhdGNoZG9nIE1vZGUNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgQURDX0FOQUxPR1dBVENIRE9HX05PTkUgXA0KLSAgKDB4MDAwMDAwMDBVTCkgLyohPCBObyBhbmFsb2cgd2F0Y2hkb2cgc2VsZWN0ZWQgKi8NCi0jZGVmaW5lIEFEQ19BTkFMT0dXQVRDSERPR19TSU5HTEVfUkVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19DRkdSX0FXRDFTR0wgfCBBRENfQ0ZHUl9BV0QxRU4pIC8qITwgQW5hbG9nIHdhdGNoZG9nIGFwcGxpZWQgdG8gYSBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVndWxhciBncm91cCBzaW5nbGUgY2hhbm5lbCAqLw0KLSNkZWZpbmUgQURDX0FOQUxPR1dBVENIRE9HX1NJTkdMRV9JTkpFQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0ZHUl9BV0QxU0dMIHwgQURDX0NGR1JfSkFXRDFFTikgLyohPCBBbmFsb2cgd2F0Y2hkb2cgYXBwbGllZCB0byBhbiBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdGVkIGdyb3VwIHNpbmdsZSBjaGFubmVsICovDQotI2RlZmluZSBBRENfQU5BTE9HV0FUQ0hET0dfU0lOR0xFX1JFR0lOSkVDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0ZHUl9BV0QxU0dMIHwgQURDX0NGR1JfQVdEMUVOIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0pBV0QxRU4pIC8qITwgQW5hbG9nIHdhdGNoZG9nIGFwcGxpZWQgdG8gYSByZWd1bGFyIGFuZCBpbmplY3RlZCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBzIHNpbmdsZSBjaGFubmVsICovDQotI2RlZmluZSBBRENfQU5BTE9HV0FUQ0hET0dfQUxMX1JFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0ZHUl9BV0QxRU4pIC8qITwgQW5hbG9nIHdhdGNoZG9nIGFwcGxpZWQgdG8gcmVndWxhciBncm91cCBhbGwgY2hhbm5lbHMgXA0KLSAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBBRENfQU5BTE9HV0FUQ0hET0dfQUxMX0lOSkVDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19DRkdSX0pBV0QxRU4pIC8qITwgQW5hbG9nIHdhdGNoZG9nIGFwcGxpZWQgdG8gaW5qZWN0ZWQgZ3JvdXAgYWxsIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVscyAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBBRENfQU5BTE9HV0FUQ0hET0dfQUxMX1JFR0lOSkVDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0ZHUl9BV0QxRU4gfCBBRENfQ0ZHUl9KQVdEMUVOKSAvKiE8IEFuYWxvZyB3YXRjaGRvZyBhcHBsaWVkIHRvIHJlZ3VsYXIgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBpbmplY3RlZCBncm91cHMgYWxsIGNoYW5uZWxzICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEFEQ19IQUxfRUNfT1ZTX1JBVElPICBPdmVyc2FtcGxpbmcgLSBSYXRpbw0KLSAqIEB7DQotICovDQotI2RlZmluZSBBRENfT1ZFUlNBTVBMSU5HX1JBVElPXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfT1ZTX1JBVElPXzIpIC8qITwgQURDIG92ZXJzYW1wbGluZyByYXRpbyBvZiAyICgyIEFEQyBjb252ZXJzaW9ucyBhcmUgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybWVkLCBzdW0gb2YgdGhlc2UgY29udmVyc2lvbnMgZGF0YSBpcyBjb21wdXRlZCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICB0byByZXN1bHQgYXMgdGhlIEFEQyBvdmVyc2FtcGxpbmcgY29udmVyc2lvbiBkYXRhICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChiZWZvcmUgcG90ZW50aWFsIHNoaWZ0KSAqLw0KLSNkZWZpbmUgQURDX09WRVJTQU1QTElOR19SQVRJT180ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX09WU19SQVRJT180KSAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgcmF0aW8gb2YgNCAoNCBBREMgY29udmVyc2lvbnMgYXJlIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1lZCwgc3VtIG9mIHRoZXNlIGNvbnZlcnNpb25zIGRhdGEgaXMgY29tcHV0ZWQgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gcmVzdWx0IGFzIHRoZSBBREMgb3ZlcnNhbXBsaW5nIGNvbnZlcnNpb24gZGF0YSAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAoYmVmb3JlIHBvdGVudGlhbCBzaGlmdCkgKi8NCi0jZGVmaW5lIEFEQ19PVkVSU0FNUExJTkdfUkFUSU9fOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19PVlNfUkFUSU9fOCkgLyohPCBBREMgb3ZlcnNhbXBsaW5nIHJhdGlvIG9mIDggKDggQURDIGNvbnZlcnNpb25zIGFyZSBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtZWQsIHN1bSBvZiB0aGVzZSBjb252ZXJzaW9ucyBkYXRhIGlzIGNvbXB1dGVkIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHJlc3VsdCBhcyB0aGUgQURDIG92ZXJzYW1wbGluZyBjb252ZXJzaW9uIGRhdGEgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgKGJlZm9yZSBwb3RlbnRpYWwgc2hpZnQpICovDQotI2RlZmluZSBBRENfT1ZFUlNBTVBMSU5HX1JBVElPXzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19PVlNfUkFUSU9fMTYpIC8qITwgQURDIG92ZXJzYW1wbGluZyByYXRpbyBvZiAxNiAoMTYgQURDIGNvbnZlcnNpb25zIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgcGVyZm9ybWVkLCBzdW0gb2YgdGhlc2UgY29udmVyc2lvbnMgZGF0YSBpcyAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHV0ZWQgdG8gcmVzdWx0IGFzIHRoZSBBREMgb3ZlcnNhbXBsaW5nICAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb24gZGF0YSAoYmVmb3JlIHBvdGVudGlhbCBzaGlmdCkgKi8NCi0jZGVmaW5lIEFEQ19PVkVSU0FNUExJTkdfUkFUSU9fMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX09WU19SQVRJT18zMikgLyohPCBBREMgb3ZlcnNhbXBsaW5nIHJhdGlvIG9mIDMyICgzMiBBREMgY29udmVyc2lvbnMgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBwZXJmb3JtZWQsIHN1bSBvZiB0aGVzZSBjb252ZXJzaW9ucyBkYXRhIGlzICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRlZCB0byByZXN1bHQgYXMgdGhlIEFEQyBvdmVyc2FtcGxpbmcgICAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbiBkYXRhIChiZWZvcmUgcG90ZW50aWFsIHNoaWZ0KSAqLw0KLSNkZWZpbmUgQURDX09WRVJTQU1QTElOR19SQVRJT182NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfT1ZTX1JBVElPXzY0KSAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgcmF0aW8gb2YgNjQgKDY0IEFEQyBjb252ZXJzaW9ucyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIHBlcmZvcm1lZCwgc3VtIG9mIHRoZXNlIGNvbnZlcnNpb25zIGRhdGEgaXMgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGVkIHRvIHJlc3VsdCBhcyB0aGUgQURDIG92ZXJzYW1wbGluZyAgICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9uIGRhdGEgKGJlZm9yZSBwb3RlbnRpYWwgc2hpZnQpICovDQotI2RlZmluZSBBRENfT1ZFUlNBTVBMSU5HX1JBVElPXzEyOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19PVlNfUkFUSU9fMTI4KSAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgcmF0aW8gb2YgMTI4ICgxMjggQURDICAgICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbnMgYXJlIHBlcmZvcm1lZCwgc3VtIG9mIHRoZXNlICAgICAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb25zIGRhdGEgaXMgY29tcHV0ZWQgdG8gcmVzdWx0IGFzIHRoZSBBREMgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyc2FtcGxpbmcgY29udmVyc2lvbiBkYXRhIChiZWZvcmUgcG90ZW50aWFsICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQpICovDQotI2RlZmluZSBBRENfT1ZFUlNBTVBMSU5HX1JBVElPXzI1NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19PVlNfUkFUSU9fMjU2KSAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgcmF0aW8gb2YgMjU2ICgyNTYgQURDICAgICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbnMgYXJlIHBlcmZvcm1lZCwgc3VtIG9mIHRoZXNlICAgICAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb25zIGRhdGEgaXMgY29tcHV0ZWQgdG8gcmVzdWx0IGFzIHRoZSBBREMgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyc2FtcGxpbmcgY29udmVyc2lvbiBkYXRhIChiZWZvcmUgcG90ZW50aWFsICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQpICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEFEQ19IQUxfRUNfT1ZTX1NISUZUICBPdmVyc2FtcGxpbmcgLSBEYXRhIHNoaWZ0DQotICogQHsNCi0gKi8NCi0jZGVmaW5lIEFEQ19SSUdIVEJJVFNISUZUX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX09WU19TSElGVF9OT05FKSAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgbm8gc2hpZnQgKHN1bSBvZiB0aGUgQURDICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbnMgZGF0YSBpcyBub3QgZGl2aWRlZCB0byByZXN1bHQgYXMgdGhlIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQyBvdmVyc2FtcGxpbmcgY29udmVyc2lvbiBkYXRhKSAqLw0KLSNkZWZpbmUgQURDX1JJR0hUQklUU0hJRlRfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzEpIC8qITwgQURDIG92ZXJzYW1wbGluZyBzaGlmdCBvZiAxIChzdW0gb2YgdGhlIEFEQyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9ucyBkYXRhIGlzIGRpdmlkZWQgYnkgMiB0byByZXN1bHQgYXMgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIEFEQyBvdmVyc2FtcGxpbmcgY29udmVyc2lvbiBkYXRhKSAqLw0KLSNkZWZpbmUgQURDX1JJR0hUQklUU0hJRlRfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzIpIC8qITwgQURDIG92ZXJzYW1wbGluZyBzaGlmdCBvZiAyIChzdW0gb2YgdGhlIEFEQyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9ucyBkYXRhIGlzIGRpdmlkZWQgYnkgNCB0byByZXN1bHQgYXMgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIEFEQyBvdmVyc2FtcGxpbmcgY29udmVyc2lvbiBkYXRhKSAqLw0KLSNkZWZpbmUgQURDX1JJR0hUQklUU0hJRlRfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzMpIC8qITwgQURDIG92ZXJzYW1wbGluZyBzaGlmdCBvZiAzIChzdW0gb2YgdGhlIEFEQyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9ucyBkYXRhIGlzIGRpdmlkZWQgYnkgOCB0byByZXN1bHQgYXMgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIEFEQyBvdmVyc2FtcGxpbmcgY29udmVyc2lvbiBkYXRhKSAqLw0KLSNkZWZpbmUgQURDX1JJR0hUQklUU0hJRlRfNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX09WU19TSElGVF9SSUdIVF80KSAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgc2hpZnQgb2YgNCAoc3VtIG9mIHRoZSBBREMgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb25zIGRhdGEgaXMgZGl2aWRlZCBieSAxNiB0byByZXN1bHQgYXMgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIEFEQyBvdmVyc2FtcGxpbmcgY29udmVyc2lvbiBkYXRhKSAqLw0KLSNkZWZpbmUgQURDX1JJR0hUQklUU0hJRlRfNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX09WU19TSElGVF9SSUdIVF81KSAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgc2hpZnQgb2YgNSAoc3VtIG9mIHRoZSBBREMgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb25zIGRhdGEgaXMgZGl2aWRlZCBieSAzMiB0byByZXN1bHQgYXMgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIEFEQyBvdmVyc2FtcGxpbmcgY29udmVyc2lvbiBkYXRhKSAqLw0KLSNkZWZpbmUgQURDX1JJR0hUQklUU0hJRlRfNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX09WU19TSElGVF9SSUdIVF82KSAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgc2hpZnQgb2YgNiAoc3VtIG9mIHRoZSBBREMgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb25zIGRhdGEgaXMgZGl2aWRlZCBieSA2NCB0byByZXN1bHQgYXMgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIEFEQyBvdmVyc2FtcGxpbmcgY29udmVyc2lvbiBkYXRhKSAqLw0KLSNkZWZpbmUgQURDX1JJR0hUQklUU0hJRlRfNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzcpIC8qITwgQURDIG92ZXJzYW1wbGluZyBzaGlmdCBvZiA3IChzdW0gb2YgdGhlIEFEQyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9ucyBkYXRhIGlzIGRpdmlkZWQgYnkgMTI4IHRvIHJlc3VsdCAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgdGhlIEFEQyBvdmVyc2FtcGxpbmcgY29udmVyc2lvbiBkYXRhKSAqLw0KLSNkZWZpbmUgQURDX1JJR0hUQklUU0hJRlRfOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzgpIC8qITwgQURDIG92ZXJzYW1wbGluZyBzaGlmdCBvZiA4IChzdW0gb2YgdGhlIEFEQyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9ucyBkYXRhIGlzIGRpdmlkZWQgYnkgMjU2IHRvIHJlc3VsdCAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgdGhlIEFEQyBvdmVyc2FtcGxpbmcgY29udmVyc2lvbiBkYXRhKSAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBBRENfSEFMX0VDX09WU19ESVNDT05UX01PREUgIE92ZXJzYW1wbGluZyAtIERpc2NvbnRpbnVvdXMgbW9kZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBBRENfVFJJR0dFUkVETU9ERV9TSU5HTEVfVFJJR0dFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX09WU19SRUdfQ09OVCkgLyohPCBBREMgb3ZlcnNhbXBsaW5nIGRpc2NvbnRpbnVvdXMgbW9kZTogY29udGludW91cyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSAoYWxsIGNvbnZlcnNpb25zIG9mIG92ZXJzYW1wbGluZyByYXRpbyBhcmUgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSBmcm9tIDEgdHJpZ2dlcikgKi8NCi0jZGVmaW5lIEFEQ19UUklHR0VSRURNT0RFX01VTFRJX1RSSUdHRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX09WU19SRUdfRElTQ09OVCkgLyohPCBBREMgb3ZlcnNhbXBsaW5nIGRpc2NvbnRpbnVvdXMgbW9kZTogXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NvbnRpbnVvdXMgbW9kZSAoZWFjaCBjb252ZXJzaW9uIG9mIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyc2FtcGxpbmcgcmF0aW8gbmVlZHMgYSB0cmlnZ2VyKSAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBBRENfSEFMX0VDX09WU19TQ09QRV9SRUcgIE92ZXJzYW1wbGluZyAtIE92ZXJzYW1wbGluZyBzY29wZSBmb3INCi0gKiBBREMgZ3JvdXAgcmVndWxhcg0KLSAqIEB7DQotICovDQotI2RlZmluZSBBRENfUkVHT1ZFUlNBTVBMSU5HX0NPTlRJTlVFRF9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfT1ZTX0dSUF9SRUdVTEFSX0NPTlRJTlVFRCkgLyohPCBPdmVyc2FtcGxpbmcgYnVmZmVyIG1haW50YWluZWQgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJpbmcgaW5qZWN0aW9uIHNlcXVlbmNlICovDQotI2RlZmluZSBBRENfUkVHT1ZFUlNBTVBMSU5HX1JFU1VNRURfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX09WU19HUlBfUkVHVUxBUl9SRVNVTUVEKSAvKiE8IE92ZXJzYW1wbGluZyBidWZmZXIgemVyb2VkIGR1cmluZyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmplY3Rpb24gc2VxdWVuY2UgICAgICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEFEQ19FdmVudF90eXBlIEFEQyBFdmVudCB0eXBlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIEFEQ19FT1NNUF9FVkVOVCAoQURDX0ZMQUdfRU9TTVApIC8qITwgQURDIEVuZCBvZiBTYW1wbGluZyBldmVudCAqLw0KLSNkZWZpbmUgQURDX0FXRDFfRVZFTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19GTEFHX0FXRDEpIC8qITwgQURDIEFuYWxvZyB3YXRjaGRvZyAxIGV2ZW50IChtYWluIGFuYWxvZyB3YXRjaGRvZywgXA0KLSAgICAgICAgICAgICAgICAgICAgIHByZXNlbnQgb24gYWxsIFNUTTMyIHNlcmllcykgKi8NCi0jZGVmaW5lIEFEQ19BV0QyX0VWRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19GTEFHX0FXRDIpIC8qITwgQURDIEFuYWxvZyB3YXRjaGRvZyAyIGV2ZW50IChhZGRpdGlvbmFsIGFuYWxvZyBcDQotICAgICAgICAgICAgICAgICAgICAgd2F0Y2hkb2csIG5vdCBwcmVzZW50IG9uIGFsbCBTVE0zMiBzZXJpZXMpICovDQotI2RlZmluZSBBRENfQVdEM19FVkVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfRkxBR19BV0QzKSAvKiE8IEFEQyBBbmFsb2cgd2F0Y2hkb2cgMyBldmVudCAoYWRkaXRpb25hbCBhbmFsb2cgXA0KLSAgICAgICAgICAgICAgICAgICAgIHdhdGNoZG9nLCBub3QgcHJlc2VudCBvbiBhbGwgU1RNMzIgc2VyaWVzKSAqLw0KLSNkZWZpbmUgQURDX09WUl9FVkVOVCAoQURDX0ZMQUdfT1ZSKSAvKiE8IEFEQyBvdmVycnVuIGV2ZW50ICovDQotI2RlZmluZSBBRENfSlFPVkZfRVZFTlQgXA0KLSAgKEFEQ19GTEFHX0pRT1ZGKSAvKiE8IEFEQyBJbmplY3RlZCBDb250ZXh0IFF1ZXVlIE92ZXJmbG93IGV2ZW50ICovDQotLyoqDQotICogQH0NCi0gKi8NCi0jZGVmaW5lIEFEQ19BV0RfRVZFTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIEFEQ19BV0QxX0VWRU5UIC8qITwgQURDIEFuYWxvZyB3YXRjaGRvZyAxIGV2ZW50OiBOYW1pbmcgZm9yIGNvbXBhdGliaWxpdHkgIFwNCi0gICAgICAgICAgICAgICAgICAgIHdpdGggb3RoZXIgU1RNMzIgZGV2aWNlcyBoYXZpbmcgb25seSBvbmUgYW5hbG9nIHdhdGNoZG9nIFwNCi0gICAgICAgICAgICAgICAgICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQURDX2ludGVycnVwdHNfZGVmaW5pdGlvbiBBREMgaW50ZXJydXB0cyBkZWZpbml0aW9uDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIEFEQ19JVF9SRFkgQURDX0lFUl9BRFJEWUlFIC8qITwgQURDIFJlYWR5IGludGVycnVwdCBzb3VyY2UgKi8NCi0jZGVmaW5lIEFEQ19JVF9FT1NNUCBcDQotICBBRENfSUVSX0VPU01QSUUgLyohPCBBREMgRW5kIG9mIHNhbXBsaW5nIGludGVycnVwdCBzb3VyY2UgKi8NCi0jZGVmaW5lIEFEQ19JVF9FT0MgXA0KLSAgQURDX0lFUl9FT0NJRSAvKiE8IEFEQyBFbmQgb2YgcmVndWxhciBjb252ZXJzaW9uIGludGVycnVwdCBzb3VyY2UgKi8NCi0jZGVmaW5lIEFEQ19JVF9FT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIEFEQ19JRVJfRU9TSUUgLyohPCBBREMgRW5kIG9mIHJlZ3VsYXIgc2VxdWVuY2Ugb2YgY29udmVyc2lvbnMgaW50ZXJydXB0IFwNCi0gICAgICAgICAgICAgICAgICAgc291cmNlICovDQotI2RlZmluZSBBRENfSVRfT1ZSIEFEQ19JRVJfT1ZSSUUgLyohPCBBREMgb3ZlcnJ1biBpbnRlcnJ1cHQgc291cmNlICovDQotI2RlZmluZSBBRENfSVRfSkVPQyBcDQotICBBRENfSUVSX0pFT0NJRSAvKiE8IEFEQyBFbmQgb2YgaW5qZWN0ZWQgY29udmVyc2lvbiBpbnRlcnJ1cHQgc291cmNlICovDQotI2RlZmluZSBBRENfSVRfSkVPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIEFEQ19JRVJfSkVPU0lFIC8qITwgQURDIEVuZCBvZiBpbmplY3RlZCBzZXF1ZW5jZSBvZiBjb252ZXJzaW9ucyBpbnRlcnJ1cHQgXA0KLSAgICAgICAgICAgICAgICAgICAgc291cmNlICovDQotI2RlZmluZSBBRENfSVRfQVdEMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBBRENfSUVSX0FXRDFJRSAvKiE8IEFEQyBBbmFsb2cgd2F0Y2hkb2cgMSBpbnRlcnJ1cHQgc291cmNlIChtYWluIGFuYWxvZyBcDQotICAgICAgICAgICAgICAgICAgICB3YXRjaGRvZykgKi8NCi0jZGVmaW5lIEFEQ19JVF9BV0QyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgQURDX0lFUl9BV0QySUUgLyohPCBBREMgQW5hbG9nIHdhdGNoZG9nIDIgaW50ZXJydXB0IHNvdXJjZSAoYWRkaXRpb25hbCBcDQotICAgICAgICAgICAgICAgICAgICBhbmFsb2cgd2F0Y2hkb2cpICovDQotI2RlZmluZSBBRENfSVRfQVdEMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIEFEQ19JRVJfQVdEM0lFIC8qITwgQURDIEFuYWxvZyB3YXRjaGRvZyAzIGludGVycnVwdCBzb3VyY2UgKGFkZGl0aW9uYWwgXA0KLSAgICAgICAgICAgICAgICAgICAgYW5hbG9nIHdhdGNoZG9nKSAqLw0KLSNkZWZpbmUgQURDX0lUX0pRT1ZGIFwNCi0gIEFEQ19JRVJfSlFPVkZJRSAvKiE8IEFEQyBJbmplY3RlZCBDb250ZXh0IFF1ZXVlIE92ZXJmbG93IGludGVycnVwdCBzb3VyY2UgKi8NCi0NCi0jZGVmaW5lIEFEQ19JVF9BV0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgQURDX0lUX0FXRDEgLyohPCBBREMgQW5hbG9nIHdhdGNoZG9nIDEgaW50ZXJydXB0IHNvdXJjZTogbmFtaW5nIGZvciAgICAgICAgICBcDQotICAgICAgICAgICAgICAgICBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgU1RNMzIgZGV2aWNlcyBoYXZpbmcgb25seSBvbmUgYW5hbG9nIFwNCi0gICAgICAgICAgICAgICAgIHdhdGNoZG9nICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEFEQ19mbGFnc19kZWZpbml0aW9uIEFEQyBmbGFncyBkZWZpbml0aW9uDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIEFEQ19GTEFHX1JEWSBBRENfSVNSX0FEUkRZICAgLyohPCBBREMgUmVhZHkgZmxhZyAqLw0KLSNkZWZpbmUgQURDX0ZMQUdfRU9TTVAgQURDX0lTUl9FT1NNUCAvKiE8IEFEQyBFbmQgb2YgU2FtcGxpbmcgZmxhZyAqLw0KLSNkZWZpbmUgQURDX0ZMQUdfRU9DIEFEQ19JU1JfRU9DICAgICAvKiE8IEFEQyBFbmQgb2YgUmVndWxhciBDb252ZXJzaW9uIGZsYWcgKi8NCi0jZGVmaW5lIEFEQ19GTEFHX0VPUyBcDQotICBBRENfSVNSX0VPUyAvKiE8IEFEQyBFbmQgb2YgUmVndWxhciBzZXF1ZW5jZSBvZiBDb252ZXJzaW9ucyBmbGFnICovDQotI2RlZmluZSBBRENfRkxBR19PVlIgQURDX0lTUl9PVlIgICAvKiE8IEFEQyBvdmVycnVuIGZsYWcgKi8NCi0jZGVmaW5lIEFEQ19GTEFHX0pFT0MgQURDX0lTUl9KRU9DIC8qITwgQURDIEVuZCBvZiBJbmplY3RlZCBDb252ZXJzaW9uIGZsYWcgKi8NCi0jZGVmaW5lIEFEQ19GTEFHX0pFT1MgXA0KLSAgQURDX0lTUl9KRU9TIC8qITwgQURDIEVuZCBvZiBJbmplY3RlZCBzZXF1ZW5jZSBvZiBDb252ZXJzaW9ucyBmbGFnICovDQotI2RlZmluZSBBRENfRkxBR19BV0QxIFwNCi0gIEFEQ19JU1JfQVdEMSAvKiE8IEFEQyBBbmFsb2cgd2F0Y2hkb2cgMSBmbGFnIChtYWluIGFuYWxvZyB3YXRjaGRvZykgKi8NCi0jZGVmaW5lIEFEQ19GTEFHX0FXRDIgXA0KLSAgQURDX0lTUl9BV0QyIC8qITwgQURDIEFuYWxvZyB3YXRjaGRvZyAyIGZsYWcgKGFkZGl0aW9uYWwgYW5hbG9nIHdhdGNoZG9nKSAqLw0KLSNkZWZpbmUgQURDX0ZMQUdfQVdEMyBcDQotICBBRENfSVNSX0FXRDMgLyohPCBBREMgQW5hbG9nIHdhdGNoZG9nIDMgZmxhZyAoYWRkaXRpb25hbCBhbmFsb2cgd2F0Y2hkb2cpICovDQotI2RlZmluZSBBRENfRkxBR19KUU9WRiBcDQotICBBRENfSVNSX0pRT1ZGIC8qITwgQURDIEluamVjdGVkIENvbnRleHQgUXVldWUgT3ZlcmZsb3cgZmxhZyAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQURDX1ByaXZhdGVfTWFjcm9zIEFEQyBQcml2YXRlIE1hY3Jvcw0KLSAqIEB7DQotICovDQotLyogTWFjcm8gcmVzZXJ2ZWQgZm9yIGludGVybmFsIEhBTCBkcml2ZXIgdXNhZ2UsIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIGluICAgKi8NCi0vKiBjb2RlIG9mIGZpbmFsIHVzZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiBSZXR1cm4gcmVzb2x1dGlvbiBiaXRzIGluIENGR1IgcmVnaXN0ZXIgUkVTWzE6MF0gZmllbGQuDQotICogQHBhcmFtIF9fSEFORExFX18gQURDIGhhbmRsZQ0KLSAqIEByZXR2YWwgVmFsdWUgb2YgYml0ZmllbGQgUkVTIGluIENGR1IgcmVnaXN0ZXIuDQotICovDQotI2RlZmluZSBBRENfR0VUX1JFU09MVVRJT04oX19IQU5ETEVfXykgXA0KLSAgKExMX0FEQ19HZXRSZXNvbHV0aW9uKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBDbGVhciBBREMgZXJyb3IgY29kZSAoc2V0IGl0IHRvIG5vIGVycm9yIGNvZGUgIkhBTF9BRENfRVJST1JfTk9ORSIpLg0KLSAqIEBwYXJhbSBfX0hBTkRMRV9fIEFEQyBoYW5kbGUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIEFEQ19DTEVBUl9FUlJPUkNPREUoX19IQU5ETEVfXykgXA0KLSAgKChfX0hBTkRMRV9fKS0+RXJyb3JDb2RlID0gSEFMX0FEQ19FUlJPUl9OT05FKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBTaW11bHRhbmVvdXNseSBjbGVhciBhbmQgc2V0IHNwZWNpZmljIGJpdHMgb2YgdGhlIGhhbmRsZSBTdGF0ZS4NCi0gKiBAbm90ZSAgQURDX1NUQVRFX0NMUl9TRVQoKSBtYWNybyBpcyBtZXJlbHkgYWxpYXNlZCB0byBnZW5lcmljIG1hY3JvDQotICogTU9ESUZZX1JFRygpLCB0aGUgZmlyc3QgcGFyYW1ldGVyIGlzIHRoZSBBREMgaGFuZGxlIFN0YXRlLCB0aGUgc2Vjb25kDQotICogcGFyYW1ldGVyIGlzIHRoZSBiaXQgZmllbGQgdG8gY2xlYXIsIHRoZSB0aGlyZCBhbmQgbGFzdCBwYXJhbWV0ZXIgaXMgdGhlIGJpdA0KLSAqIGZpZWxkIHRvIHNldC4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIEFEQ19TVEFURV9DTFJfU0VUIE1PRElGWV9SRUcNCi0NCi0vKioNCi0gKiBAYnJpZWYgVmVyaWZ5IHRoYXQgYSBnaXZlbiB2YWx1ZSBpcyBhbGlnbmVkIHdpdGggdGhlIEFEQyByZXNvbHV0aW9uIHJhbmdlLg0KLSAqIEBwYXJhbSBfX1JFU09MVVRJT05fXyBBREMgcmVzb2x1dGlvbiAoMTIsIDEwLCA4IG9yIDYgYml0cykuDQotICogQHBhcmFtIF9fQURDX1ZBTFVFX18gdmFsdWUgY2hlY2tlZCBhZ2FpbnN0IHRoZSByZXNvbHV0aW9uLg0KLSAqIEByZXR2YWwgU0VUIChfX0FEQ19WQUxVRV9fIGluIGxpbmUgd2l0aCBfX1JFU09MVVRJT05fXykgb3IgUkVTRVQNCi0gKiAoX19BRENfVkFMVUVfXyBub3QgaW4gbGluZSB3aXRoIF9fUkVTT0xVVElPTl9fKQ0KLSAqLw0KLSNkZWZpbmUgSVNfQURDX1JBTkdFKF9fUkVTT0xVVElPTl9fLCBfX0FEQ19WQUxVRV9fKSBcDQotICAoKF9fQURDX1ZBTFVFX18pIDw9IF9fTExfQURDX0RJR0lUQUxfU0NBTEUoX19SRVNPTFVUSU9OX18pKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBWZXJpZnkgdGhlIGxlbmd0aCBvZiB0aGUgc2NoZWR1bGVkIHJlZ3VsYXIgY29udmVyc2lvbnMgZ3JvdXAuDQotICogQHBhcmFtIF9fTEVOR1RIX18gbnVtYmVyIG9mIHByb2dyYW1tZWQgY29udmVyc2lvbnMuDQotICogQHJldHZhbCBTRVQgKF9fTEVOR1RIX18gaXMgd2l0aGluIHRoZSBtYXhpbXVtIG51bWJlciBvZiBwb3NzaWJsZSBwcm9ncmFtbWFibGUNCi0gKiByZWd1bGFyIGNvbnZlcnNpb25zKSBvciBSRVNFVCAoX19MRU5HVEhfXyBpcyBudWxsIG9yIHRvbyBsYXJnZSkNCi0gKi8NCi0jZGVmaW5lIElTX0FEQ19SRUdVTEFSX05CX0NPTlYoX19MRU5HVEhfXykgXA0KLSAgKCgoX19MRU5HVEhfXykgPj0gKDFVTCkpICYmICgoX19MRU5HVEhfXykgPD0gKDE2VUwpKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgVmVyaWZ5IHRoZSBudW1iZXIgb2Ygc2NoZWR1bGVkIHJlZ3VsYXIgY29udmVyc2lvbnMgaW4gZGlzY29udGludW91cw0KLSAqIG1vZGUuDQotICogQHBhcmFtIE5VTUJFUiBudW1iZXIgb2Ygc2NoZWR1bGVkIHJlZ3VsYXIgY29udmVyc2lvbnMgaW4gZGlzY29udGludW91cyBtb2RlLg0KLSAqIEByZXR2YWwgU0VUIChOVU1CRVIgaXMgd2l0aGluIHRoZSBtYXhpbXVtIG51bWJlciBvZiByZWd1bGFyIGNvbnZlcnNpb25zIGluDQotICogZGlzY29udGludW91cyBtb2RlKSBvciBSRVNFVCAoTlVNQkVSIGlzIG51bGwgb3IgdG9vIGxhcmdlKQ0KLSAqLw0KLSNkZWZpbmUgSVNfQURDX1JFR1VMQVJfRElTQ09OVF9OVU1CRVIoTlVNQkVSKSBcDQotICAoKChOVU1CRVIpID49ICgxVUwpKSAmJiAoKE5VTUJFUikgPD0gKDhVTCkpKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBWZXJpZnkgdGhlIEFEQyBjbG9jayBzZXR0aW5nLg0KLSAqIEBwYXJhbSBfX0FEQ19DTE9DS19fIHByb2dyYW1tZWQgQURDIGNsb2NrLg0KLSAqIEByZXR2YWwgU0VUIChfX0FEQ19DTE9DS19fIGlzIGEgdmFsaWQgdmFsdWUpIG9yIFJFU0VUIChfX0FEQ19DTE9DS19fIGlzDQotICogaW52YWxpZCkNCi0gKi8NCi0jZGVmaW5lIElTX0FEQ19DTE9DS1BSRVNDQUxFUihfX0FEQ19DTE9DS19fKSAgICAgICAgXA0KLSAgKCgoX19BRENfQ0xPQ0tfXykgPT0gQURDX0NMT0NLX1NZTkNfUENMS19ESVYxKSB8fCBcDQotICAgKChfX0FEQ19DTE9DS19fKSA9PSBBRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjIpIHx8IFwNCi0gICAoKF9fQURDX0NMT0NLX18pID09IEFEQ19DTE9DS19TWU5DX1BDTEtfRElWNCkgfHwgXA0KLSAgICgoX19BRENfQ0xPQ0tfXykgPT0gQURDX0NMT0NLX0FTWU5DX0RJVjEpIHx8ICAgICBcDQotICAgKChfX0FEQ19DTE9DS19fKSA9PSBBRENfQ0xPQ0tfQVNZTkNfRElWMikgfHwgICAgIFwNCi0gICAoKF9fQURDX0NMT0NLX18pID09IEFEQ19DTE9DS19BU1lOQ19ESVY0KSB8fCAgICAgXA0KLSAgICgoX19BRENfQ0xPQ0tfXykgPT0gQURDX0NMT0NLX0FTWU5DX0RJVjYpIHx8ICAgICBcDQotICAgKChfX0FEQ19DTE9DS19fKSA9PSBBRENfQ0xPQ0tfQVNZTkNfRElWOCkgfHwgICAgIFwNCi0gICAoKF9fQURDX0NMT0NLX18pID09IEFEQ19DTE9DS19BU1lOQ19ESVYxMCkgfHwgICAgXA0KLSAgICgoX19BRENfQ0xPQ0tfXykgPT0gQURDX0NMT0NLX0FTWU5DX0RJVjEyKSB8fCAgICBcDQotICAgKChfX0FEQ19DTE9DS19fKSA9PSBBRENfQ0xPQ0tfQVNZTkNfRElWMTYpIHx8ICAgIFwNCi0gICAoKF9fQURDX0NMT0NLX18pID09IEFEQ19DTE9DS19BU1lOQ19ESVYzMikgfHwgICAgXA0KLSAgICgoX19BRENfQ0xPQ0tfXykgPT0gQURDX0NMT0NLX0FTWU5DX0RJVjY0KSB8fCAgICBcDQotICAgKChfX0FEQ19DTE9DS19fKSA9PSBBRENfQ0xPQ0tfQVNZTkNfRElWMTI4KSB8fCAgIFwNCi0gICAoKF9fQURDX0NMT0NLX18pID09IEFEQ19DTE9DS19BU1lOQ19ESVYyNTYpKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBWZXJpZnkgdGhlIEFEQyByZXNvbHV0aW9uIHNldHRpbmcuDQotICogQHBhcmFtIF9fUkVTT0xVVElPTl9fIHByb2dyYW1tZWQgQURDIHJlc29sdXRpb24uDQotICogQHJldHZhbCBTRVQgKF9fUkVTT0xVVElPTl9fIGlzIGEgdmFsaWQgdmFsdWUpIG9yIFJFU0VUIChfX1JFU09MVVRJT05fXyBpcw0KLSAqIGludmFsaWQpDQotICovDQotI2RlZmluZSBJU19BRENfUkVTT0xVVElPTihfX1JFU09MVVRJT05fXykgICAgICBcDQotICAoKChfX1JFU09MVVRJT05fXykgPT0gQURDX1JFU09MVVRJT05fMTJCKSB8fCBcDQotICAgKChfX1JFU09MVVRJT05fXykgPT0gQURDX1JFU09MVVRJT05fMTBCKSB8fCBcDQotICAgKChfX1JFU09MVVRJT05fXykgPT0gQURDX1JFU09MVVRJT05fOEIpIHx8ICBcDQotICAgKChfX1JFU09MVVRJT05fXykgPT0gQURDX1JFU09MVVRJT05fNkIpKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBWZXJpZnkgdGhlIEFEQyByZXNvbHV0aW9uIHNldHRpbmcgd2hlbiBsaW1pdGVkIHRvIDYgb3IgOCBiaXRzLg0KLSAqIEBwYXJhbSBfX1JFU09MVVRJT05fXyBwcm9ncmFtbWVkIEFEQyByZXNvbHV0aW9uIHdoZW4gbGltaXRlZCB0byA2IG9yIDggYml0cy4NCi0gKiBAcmV0dmFsIFNFVCAoX19SRVNPTFVUSU9OX18gaXMgYSB2YWxpZCB2YWx1ZSkgb3IgUkVTRVQgKF9fUkVTT0xVVElPTl9fIGlzDQotICogaW52YWxpZCkNCi0gKi8NCi0jZGVmaW5lIElTX0FEQ19SRVNPTFVUSU9OXzhfNl9CSVRTKF9fUkVTT0xVVElPTl9fKSBcDQotICAoKChfX1JFU09MVVRJT05fXykgPT0gQURDX1JFU09MVVRJT05fOEIpIHx8ICAgICAgXA0KLSAgICgoX19SRVNPTFVUSU9OX18pID09IEFEQ19SRVNPTFVUSU9OXzZCKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgVmVyaWZ5IHRoZSBBREMgY29udmVydGVkIGRhdGEgYWxpZ25tZW50Lg0KLSAqIEBwYXJhbSBfX0FMSUdOX18gcHJvZ3JhbW1lZCBBREMgY29udmVydGVkIGRhdGEgYWxpZ25tZW50Lg0KLSAqIEByZXR2YWwgU0VUIChfX0FMSUdOX18gaXMgYSB2YWxpZCB2YWx1ZSkgb3IgUkVTRVQgKF9fQUxJR05fXyBpcyBpbnZhbGlkKQ0KLSAqLw0KLSNkZWZpbmUgSVNfQURDX0RBVEFfQUxJR04oX19BTElHTl9fKSBcDQotICAoKChfX0FMSUdOX18pID09IEFEQ19EQVRBQUxJR05fUklHSFQpIHx8ICgoX19BTElHTl9fKSA9PSBBRENfREFUQUFMSUdOX0xFRlQpKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBWZXJpZnkgdGhlIEFEQyBnYWluIGNvbXBlbnNhdGlvbi4NCi0gKiBAcGFyYW0gX19HQUlOX0NPTVBFTlNBVElPTl9fIHByb2dyYW1tZWQgQURDIGdhaW4gY29tcGVuc2F0aW9uIGNvZWZmaWNpZW50Lg0KLSAqIEByZXR2YWwgU0VUIChfX0dBSU5fQ09NUEVOU0FUSU9OX18gaXMgYSB2YWxpZCB2YWx1ZSkgb3IgUkVTRVQNCi0gKiAoX19HQUlOX0NPTVBFTlNBVElPTl9fIGlzIGludmFsaWQpDQotICovDQotI2RlZmluZSBJU19BRENfR0FJTl9DT01QRU5TQVRJT04oX19HQUlOX0NPTVBFTlNBVElPTl9fKSBcDQotICAoKF9fR0FJTl9DT01QRU5TQVRJT05fXykgPD0gMTYzOTNVTCkNCi0NCi0vKioNCi0gKiBAYnJpZWYgVmVyaWZ5IHRoZSBBREMgc2NhbiBtb2RlLg0KLSAqIEBwYXJhbSBfX1NDQU5fTU9ERV9fIHByb2dyYW1tZWQgQURDIHNjYW4gbW9kZS4NCi0gKiBAcmV0dmFsIFNFVCAoX19TQ0FOX01PREVfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fU0NBTl9NT0RFX18gaXMgaW52YWxpZCkNCi0gKi8NCi0jZGVmaW5lIElTX0FEQ19TQ0FOX01PREUoX19TQ0FOX01PREVfXykgICAgIFwNCi0gICgoKF9fU0NBTl9NT0RFX18pID09IEFEQ19TQ0FOX0RJU0FCTEUpIHx8IFwNCi0gICAoKF9fU0NBTl9NT0RFX18pID09IEFEQ19TQ0FOX0VOQUJMRSkpDQotDQotLyoqDQotICogQGJyaWVmIFZlcmlmeSB0aGUgQURDIGVkZ2UgdHJpZ2dlciBzZXR0aW5nIGZvciByZWd1bGFyIGdyb3VwLg0KLSAqIEBwYXJhbSBfX0VER0VfXyBwcm9ncmFtbWVkIEFEQyBlZGdlIHRyaWdnZXIgc2V0dGluZy4NCi0gKiBAcmV0dmFsIFNFVCAoX19FREdFX18gaXMgYSB2YWxpZCB2YWx1ZSkgb3IgUkVTRVQgKF9fRURHRV9fIGlzIGludmFsaWQpDQotICovDQotI2RlZmluZSBJU19BRENfRVhUVFJJR19FREdFKF9fRURHRV9fKSAgICAgICAgICAgICAgICAgIFwNCi0gICgoKF9fRURHRV9fKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVkVER0VfTk9ORSkgfHwgICAgXA0KLSAgICgoX19FREdFX18pID09IEFEQ19FWFRFUk5BTFRSSUdDT05WRURHRV9SSVNJTkcpIHx8ICBcDQotICAgKChfX0VER0VfXykgPT0gQURDX0VYVEVSTkFMVFJJR0NPTlZFREdFX0ZBTExJTkcpIHx8IFwNCi0gICAoKF9fRURHRV9fKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVkVER0VfUklTSU5HRkFMTElORykpDQotDQotLyoqDQotICogQGJyaWVmIFZlcmlmeSB0aGUgQURDIHJlZ3VsYXIgY29udmVyc2lvbnMgZXh0ZXJuYWwgdHJpZ2dlci4NCi0gKiBAcGFyYW0gX19IQU5ETEVfXyBBREMgaGFuZGxlDQotICogQHBhcmFtIF9fUkVHVFJJR19fIHByb2dyYW1tZWQgQURDIHJlZ3VsYXIgY29udmVyc2lvbnMgZXh0ZXJuYWwgdHJpZ2dlci4NCi0gKiBAcmV0dmFsIFNFVCAoX19SRUdUUklHX18gaXMgYSB2YWxpZCB2YWx1ZSkgb3IgUkVTRVQgKF9fUkVHVFJJR19fIGlzIGludmFsaWQpDQotICovDQotI2lmIGRlZmluZWQoU1RNMzJHNDc0eHgpIHx8IGRlZmluZWQoU1RNMzJHNDg0eHgpDQotI2RlZmluZSBJU19BRENfRVhUVFJJRyhfX0hBTkRMRV9fLCBfX1JFR1RSSUdfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKCgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDFfVFJHTykgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QxX1RSR08yKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UMV9DQzMpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDJfVFJHTykgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QzX1RSR08pIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UNF9UUkdPKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDZfVFJHTykgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1Q3X1RSR08pIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UOF9UUkdPKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDhfVFJHTzIpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QxNV9UUkdPKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UMjBfVFJHTykgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDIwX1RSR08yKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QyMF9DQzEpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19IUlRJTV9UUkcxKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfSFJUSU1fVFJHMykgfHwgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX0hSVElNX1RSRzUpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19IUlRJTV9UUkc2KSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfSFJUSU1fVFJHNykgfHwgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX0hSVElNX1RSRzgpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19IUlRJTV9UUkc5KSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfSFJUSU1fVFJHMTApIHx8ICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX0xQVElNX09VVCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBBREMxKSB8fCAoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBBREMyKSkgJiYgXA0KLSAgICAoKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UMV9DQzEpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDFfQ0MyKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QyX0NDMikgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UM19DQzQpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDRfQ0M0KSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QyMF9DQzIpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UMjBfQ0MzKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfRVhUX0lUMTEpKSkgfHwgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBBREMzKSB8fCAoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBBREM0KSB8fCAgXA0KLSAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gQURDNSkpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgKCgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDJfQ0MxKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QyX0NDMykgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UM19DQzEpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDRfQ0MxKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1Q4X0NDMSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19IUlRJTV9UUkcyKSB8fCAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfSFJUSU1fVFJHNCkgfHwgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX0VYVF9JVDIpKSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoX19SRUdUUklHX18pID09IEFEQ19TT0ZUV0FSRV9TVEFSVCkpDQotI2VsaWYgZGVmaW5lZChTVE0zMkc0NzN4eCkgfHwgZGVmaW5lZChTVE0zMkc0ODN4eCkNCi0jZGVmaW5lIElTX0FEQ19FWFRUUklHKF9fSEFORExFX18sIF9fUkVHVFJJR19fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UMV9UUkdPKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDFfVFJHTzIpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QxX0NDMykgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UMl9UUkdPKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDNfVFJHTykgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1Q0X1RSR08pIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UNl9UUkdPKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDdfVFJHTykgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1Q4X1RSR08pIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UOF9UUkdPMikgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDE1X1RSR08pIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QyMF9UUkdPKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UMjBfVFJHTzIpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDIwX0NDMSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX0xQVElNX09VVCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBBREMxKSB8fCAoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBBREMyKSkgJiYgXA0KLSAgICAoKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UMV9DQzEpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDFfQ0MyKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QyX0NDMikgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UM19DQzQpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDRfQ0M0KSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QyMF9DQzIpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UMjBfQ0MzKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfRVhUX0lUMTEpKSkgfHwgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBBREMzKSB8fCAoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBBREM0KSB8fCAgXA0KLSAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gQURDNSkpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgKCgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDJfQ0MxKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QyX0NDMykgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UM19DQzEpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDRfQ0MxKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1Q4X0NDMSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19FWFRfSVQyKSkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fUkVHVFJJR19fKSA9PSBBRENfU09GVFdBUkVfU1RBUlQpKQ0KLSNlbGlmIGRlZmluZWQoU1RNMzJHNDcxeHgpDQotI2RlZmluZSBJU19BRENfRVhUVFJJRyhfX0hBTkRMRV9fLCBfX1JFR1RSSUdfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKCgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDFfVFJHTykgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QxX1RSR08yKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UMV9DQzMpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDJfVFJHTykgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QzX1RSR08pIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UNF9UUkdPKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDZfVFJHTykgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1Q3X1RSR08pIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UOF9UUkdPKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDhfVFJHTzIpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QxNV9UUkdPKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19MUFRJTV9PVVQpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gQURDMSkgfHwgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gQURDMikpICYmIFwNCi0gICAgKCgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDFfQ0MxKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QxX0NDMikgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UMl9DQzIpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDNfQ0M0KSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1Q0X0NDNCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19FWFRfSVQxMSkpKSB8fCAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlID09IEFEQzMpKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICgoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QyX0NDMSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UMl9DQzMpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDNfQ0MxKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1Q0X0NDMSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UOF9DQzEpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfRVhUX0lUMikpKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKChfX1JFR1RSSUdfXykgPT0gQURDX1NPRlRXQVJFX1NUQVJUKSkNCi0jZWxpZiBkZWZpbmVkKFNUTTMyR0JLMUNCKSB8fCBkZWZpbmVkKFNUTTMyRzQzMXh4KSB8fCBkZWZpbmVkKFNUTTMyRzQ0MXh4KQ0KLSNkZWZpbmUgSVNfQURDX0VYVFRSSUcoX19IQU5ETEVfXywgX19SRUdUUklHX18pICAgICBcDQotICAoKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UMV9UUkdPKSB8fCAgIFwNCi0gICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QxX1RSR08yKSB8fCAgXA0KLSAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDFfQ0MxKSB8fCAgICBcDQotICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UMV9DQzIpIHx8ICAgIFwNCi0gICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QxX0NDMykgfHwgICAgXA0KLSAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDJfVFJHTykgfHwgICBcDQotICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UMl9DQzIpIHx8ICAgIFwNCi0gICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QzX1RSR08pIHx8ICAgXA0KLSAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDNfQ0M0KSB8fCAgICBcDQotICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UNF9UUkdPKSB8fCAgIFwNCi0gICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1Q0X0NDNCkgfHwgICAgXA0KLSAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDZfVFJHTykgfHwgICBcDQotICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UN19UUkdPKSB8fCAgIFwNCi0gICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1Q4X1RSR08pIHx8ICAgXA0KLSAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDhfVFJHTzIpIHx8ICBcDQotICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UMTVfVFJHTykgfHwgIFwNCi0gICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX0xQVElNX09VVCkgfHwgXA0KLSAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfRVhUX0lUMTEpIHx8ICBcDQotICAgKChfX1JFR1RSSUdfXykgPT0gQURDX1NPRlRXQVJFX1NUQVJUKSkNCi0jZWxpZiBkZWZpbmVkKFNUTTMyRzQ5MXh4KSB8fCBkZWZpbmVkKFNUTTMyRzRBMXh4KQ0KLSNkZWZpbmUgSVNfQURDX0VYVFRSSUcoX19IQU5ETEVfXywgX19SRUdUUklHX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QxX1RSR08pIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UMV9UUkdPMikgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDFfQ0MzKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QyX1RSR08pIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UM19UUkdPKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDRfVFJHTykgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1Q2X1RSR08pIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UN19UUkdPKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDhfVFJHTykgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1Q4X1RSR08yKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UMTVfVFJHTykgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDIwX1RSR08pIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QyMF9UUkdPMikgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UMjBfQ0MxKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfTFBUSU1fT1VUKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlID09IEFEQzEpIHx8ICgoX19IQU5ETEVfXyktPkluc3RhbmNlID09IEFEQzIpKSAmJiBcDQotICAgICgoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QxX0NDMSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UMV9DQzIpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDJfQ0MyKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QzX0NDNCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UNF9DQzQpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDIwX0NDMikgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QyMF9DQzMpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19FWFRfSVQxMSkpKSB8fCAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gQURDMykgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICgoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QyX0NDMSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UMl9DQzMpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDNfQ0MxKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1Q0X0NDMSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UOF9DQzEpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfRVhUX0lUMikpKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKChfX1JFR1RSSUdfXykgPT0gQURDX1NPRlRXQVJFX1NUQVJUKSkNCi0jZW5kaWYNCi0NCi0vKioNCi0gKiBAYnJpZWYgVmVyaWZ5IHRoZSBBREMgcmVndWxhciBjb252ZXJzaW9ucyBleHRlcm5hbCB0cmlnZ2VyLg0KLSAqIEBwYXJhbSBfX1NBTVBMSU5HTU9ERV9fIHByb2dyYW1tZWQgQURDIHJlZ3VsYXIgY29udmVyc2lvbnMgZXh0ZXJuYWwgdHJpZ2dlci4NCi0gKiBAcmV0dmFsIFNFVCAoX19TQU1QTElOR01PREVfXyBpcyBhIHZhbGlkIHZhbHVlKSBvciBSRVNFVCAoX19TQU1QTElOR01PREVfXyBpcw0KLSAqIGludmFsaWQpDQotICovDQotI2RlZmluZSBJU19BRENfU0FNUExJTkdNT0RFKF9fU0FNUExJTkdNT0RFX18pICAgICAgICAgIFwNCi0gICgoKF9fU0FNUExJTkdNT0RFX18pID09IEFEQ19TQU1QTElOR19NT0RFX05PUk1BTCkgfHwgXA0KLSAgICgoX19TQU1QTElOR01PREVfXykgPT0gQURDX1NBTVBMSU5HX01PREVfQlVMQikgfHwgICBcDQotICAgKChfX1NBTVBMSU5HTU9ERV9fKSA9PSBBRENfU0FNUExJTkdfTU9ERV9UUklHR0VSX0NPTlRST0xFRCkpDQotDQotLyoqDQotICogQGJyaWVmIFZlcmlmeSB0aGUgQURDIHJlZ3VsYXIgY29udmVyc2lvbnMgY2hlY2sgZm9yIGNvbnZlcnRlZCBkYXRhDQotICogYXZhaWxhYmlsaXR5Lg0KLSAqIEBwYXJhbSBfX0VPQ19TRUxFQ1RJT05fXyBjb252ZXJ0ZWQgZGF0YSBhdmFpbGFiaWxpdHkgY2hlY2suDQotICogQHJldHZhbCBTRVQgKF9fRU9DX1NFTEVDVElPTl9fIGlzIGEgdmFsaWQgdmFsdWUpIG9yIFJFU0VUIChfX0VPQ19TRUxFQ1RJT05fXw0KLSAqIGlzIGludmFsaWQpDQotICovDQotI2RlZmluZSBJU19BRENfRU9DX1NFTEVDVElPTihfX0VPQ19TRUxFQ1RJT05fXykgICAgXA0KLSAgKCgoX19FT0NfU0VMRUNUSU9OX18pID09IEFEQ19FT0NfU0lOR0xFX0NPTlYpIHx8IFwNCi0gICAoKF9fRU9DX1NFTEVDVElPTl9fKSA9PSBBRENfRU9DX1NFUV9DT05WKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgVmVyaWZ5IHRoZSBBREMgcmVndWxhciBjb252ZXJzaW9ucyBvdmVycnVuIGhhbmRsaW5nLg0KLSAqIEBwYXJhbSBfX09WUl9fIEFEQyByZWd1bGFyIGNvbnZlcnNpb25zIG92ZXJydW4gaGFuZGxpbmcuDQotICogQHJldHZhbCBTRVQgKF9fT1ZSX18gaXMgYSB2YWxpZCB2YWx1ZSkgb3IgUkVTRVQgKF9fT1ZSX18gaXMgaW52YWxpZCkNCi0gKi8NCi0jZGVmaW5lIElTX0FEQ19PVkVSUlVOKF9fT1ZSX18pICAgICAgICAgICAgIFwNCi0gICgoKF9fT1ZSX18pID09IEFEQ19PVlJfREFUQV9QUkVTRVJWRUQpIHx8IFwNCi0gICAoKF9fT1ZSX18pID09IEFEQ19PVlJfREFUQV9PVkVSV1JJVFRFTikpDQotDQotLyoqDQotICogQGJyaWVmIFZlcmlmeSB0aGUgQURDIGNvbnZlcnNpb25zIHNhbXBsaW5nIHRpbWUuDQotICogQHBhcmFtIF9fVElNRV9fIEFEQyBjb252ZXJzaW9ucyBzYW1wbGluZyB0aW1lLg0KLSAqIEByZXR2YWwgU0VUIChfX1RJTUVfXyBpcyBhIHZhbGlkIHZhbHVlKSBvciBSRVNFVCAoX19USU1FX18gaXMgaW52YWxpZCkNCi0gKi8NCi0jZGVmaW5lIElTX0FEQ19TQU1QTEVfVElNRShfX1RJTUVfXykgICAgICAgICAgICAgXA0KLSAgKCgoX19USU1FX18pID09IEFEQ19TQU1QTEVUSU1FXzJDWUNMRVNfNSkgfHwgICBcDQotICAgKChfX1RJTUVfXykgPT0gQURDX1NBTVBMRVRJTUVfM0NZQ0xFU181KSB8fCAgIFwNCi0gICAoKF9fVElNRV9fKSA9PSBBRENfU0FNUExFVElNRV82Q1lDTEVTXzUpIHx8ICAgXA0KLSAgICgoX19USU1FX18pID09IEFEQ19TQU1QTEVUSU1FXzEyQ1lDTEVTXzUpIHx8ICBcDQotICAgKChfX1RJTUVfXykgPT0gQURDX1NBTVBMRVRJTUVfMjRDWUNMRVNfNSkgfHwgIFwNCi0gICAoKF9fVElNRV9fKSA9PSBBRENfU0FNUExFVElNRV80N0NZQ0xFU181KSB8fCAgXA0KLSAgICgoX19USU1FX18pID09IEFEQ19TQU1QTEVUSU1FXzkyQ1lDTEVTXzUpIHx8ICBcDQotICAgKChfX1RJTUVfXykgPT0gQURDX1NBTVBMRVRJTUVfMjQ3Q1lDTEVTXzUpIHx8IFwNCi0gICAoKF9fVElNRV9fKSA9PSBBRENfU0FNUExFVElNRV82NDBDWUNMRVNfNSkpDQotDQotLyoqDQotICogQGJyaWVmIFZlcmlmeSB0aGUgQURDIHJlZ3VsYXIgY2hhbm5lbCBzZXR0aW5nLg0KLSAqIEBwYXJhbSAgX19DSEFOTkVMX18gcHJvZ3JhbW1lZCBBREMgcmVndWxhciBjaGFubmVsLg0KLSAqIEByZXR2YWwgU0VUIChfX0NIQU5ORUxfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fQ0hBTk5FTF9fIGlzIGludmFsaWQpDQotICovDQotI2RlZmluZSBJU19BRENfUkVHVUxBUl9SQU5LKF9fQ0hBTk5FTF9fKSAgICAgXA0KLSAgKCgoX19DSEFOTkVMX18pID09IEFEQ19SRUdVTEFSX1JBTktfMSkgfHwgIFwNCi0gICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfUkVHVUxBUl9SQU5LXzIpIHx8ICBcDQotICAgKChfX0NIQU5ORUxfXykgPT0gQURDX1JFR1VMQVJfUkFOS18zKSB8fCAgXA0KLSAgICgoX19DSEFOTkVMX18pID09IEFEQ19SRUdVTEFSX1JBTktfNCkgfHwgIFwNCi0gICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfUkVHVUxBUl9SQU5LXzUpIHx8ICBcDQotICAgKChfX0NIQU5ORUxfXykgPT0gQURDX1JFR1VMQVJfUkFOS182KSB8fCAgXA0KLSAgICgoX19DSEFOTkVMX18pID09IEFEQ19SRUdVTEFSX1JBTktfNykgfHwgIFwNCi0gICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfUkVHVUxBUl9SQU5LXzgpIHx8ICBcDQotICAgKChfX0NIQU5ORUxfXykgPT0gQURDX1JFR1VMQVJfUkFOS185KSB8fCAgXA0KLSAgICgoX19DSEFOTkVMX18pID09IEFEQ19SRUdVTEFSX1JBTktfMTApIHx8IFwNCi0gICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfUkVHVUxBUl9SQU5LXzExKSB8fCBcDQotICAgKChfX0NIQU5ORUxfXykgPT0gQURDX1JFR1VMQVJfUkFOS18xMikgfHwgXA0KLSAgICgoX19DSEFOTkVMX18pID09IEFEQ19SRUdVTEFSX1JBTktfMTMpIHx8IFwNCi0gICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfUkVHVUxBUl9SQU5LXzE0KSB8fCBcDQotICAgKChfX0NIQU5ORUxfXykgPT0gQURDX1JFR1VMQVJfUkFOS18xNSkgfHwgXA0KLSAgICgoX19DSEFOTkVMX18pID09IEFEQ19SRUdVTEFSX1JBTktfMTYpKQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0NCi0vKiogQGRlZmdyb3VwIEFEQ19Qcml2YXRlX0NvbnN0YW50cyBBREMgUHJpdmF0ZSBDb25zdGFudHMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qIEZpeGVkIHRpbWVvdXQgdmFsdWVzIGZvciBBREMgY29udmVyc2lvbiAoaW5jbHVkaW5nIHNhbXBsaW5nIHRpbWUpICAgICAgICAqLw0KLS8qIE1heGltdW0gc2FtcGxpbmcgdGltZSBpcyA2NDAuNSBBREMgY2xvY2sgY3ljbGUgKFNNUHhbMjowXSA9IDBiMTExICAgICAgICAqLw0KLS8qIE1heGltdW0gY29udmVyc2lvbiB0aW1lIGlzIDEyLjUgKyBNYXhpbXVtIHNhbXBsaW5nIHRpbWUgICAgICAgICAgICAgICAgICAqLw0KLS8qICAgICAgICAgICAgICAgICAgICAgICBvciAxMi41ICArIDY0MC41ID0gNjUzIEFEQyBjbG9jayBjeWNsZXMgICAgICAgICAgICAqLw0KLS8qIE1pbmltdW0gQURDIENsb2NrIGZyZXF1ZW5jeSBpcyAwLjE0IE1IeiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLS8qIE1heGltdW0gY29udmVyc2lvbiB0aW1lIGlzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLS8qICAgICAgICAgICAgICA2NTMgLyAwLjE0IE1IeiA9IDQuNjYgbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgQURDX1NUT1BfQ09OVkVSU0lPTl9USU1FT1VUICg1VUwpIC8qITwgQURDIHN0b3AgdGltZS1vdXQgdmFsdWUgKi8NCi0NCi0vKiBEZWxheSBmb3IgdGVtcGVyYXR1cmUgc2Vuc29yIHN0YWJpbGl6YXRpb24gdGltZS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0vKiBNYXhpbXVtIGRlbGF5IGlzIDEyMHVzIChyZWZlciBkZXZpY2UgZGF0YXNoZWV0LCBwYXJhbWV0ZXIgdFNUQVJUKS4gICAgICAgKi8NCi0vKiBVbml0OiB1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIEFEQ19URU1QU0VOU09SX0RFTEFZX1VTIChMTF9BRENfREVMQVlfVEVNUFNFTlNPUl9TVEFCX1VTKQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0NCi0vKiogQGRlZmdyb3VwIEFEQ19FeHBvcnRlZF9NYWNyb3MgQURDIEV4cG9ydGVkIE1hY3Jvcw0KLSAqIEB7DQotICovDQotLyogTWFjcm8gZm9yIGludGVybmFsIEhBTCBkcml2ZXIgdXNhZ2UsIGFuZCBwb3NzaWJseSBjYW4gYmUgdXNlZCBpbnRvIGNvZGUgb2YgKi8NCi0vKiBmaW5hbCB1c2VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQURDX0hBTF9FTV9IQU5ETEVfSVRfRkxBRyBIQUwgQURDIG1hY3JvIHRvIG1hbmFnZSBIQUwgQURDIGhhbmRsZSwNCi0gKiBJVCBhbmQgZmxhZ3MuDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGJyaWVmICBSZXNldCBBREMgaGFuZGxlIHN0YXRlLg0KLSAqIEBwYXJhbSBfX0hBTkRMRV9fIEFEQyBoYW5kbGUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jaWYgKFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQ0KLSNkZWZpbmUgX19IQUxfQURDX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSBcDQotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgKF9fSEFORExFX18pLT5TdGF0ZSA9IEhBTF9BRENfU1RBVEVfUkVTRVQ7ICAgXA0KLSAgICAoX19IQU5ETEVfXyktPk1zcEluaXRDYWxsYmFjayA9IE5VTEw7ICAgICAgICBcDQotICAgIChfX0hBTkRMRV9fKS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBOVUxMOyAgICAgIFwNCi0gIH0gd2hpbGUgKDApDQotI2Vsc2UNCi0jZGVmaW5lIF9fSEFMX0FEQ19SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgXA0KLSAgKChfX0hBTkRMRV9fKS0+U3RhdGUgPSBIQUxfQURDX1NUQVRFX1JFU0VUKQ0KLSNlbmRpZiAvKiBVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgRW5hYmxlIEFEQyBpbnRlcnJ1cHQuDQotICogQHBhcmFtIF9fSEFORExFX18gQURDIGhhbmRsZQ0KLSAqIEBwYXJhbSBfX0lOVEVSUlVQVF9fIEFEQyBJbnRlcnJ1cHQNCi0gKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfSVRfUkRZICAgIEFEQyBSZWFkeSBpbnRlcnJ1cHQgc291cmNlDQotICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0lUX0VPU01QICBBREMgRW5kIG9mIFNhbXBsaW5nIGludGVycnVwdCBzb3VyY2UNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfSVRfRU9DICAgIEFEQyBFbmQgb2YgUmVndWxhciBDb252ZXJzaW9uIGludGVycnVwdA0KLSAqIHNvdXJjZQ0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19JVF9FT1MgICAgQURDIEVuZCBvZiBSZWd1bGFyIHNlcXVlbmNlIG9mIENvbnZlcnNpb25zDQotICogaW50ZXJydXB0IHNvdXJjZQ0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19JVF9PVlIgICAgQURDIG92ZXJydW4gaW50ZXJydXB0IHNvdXJjZQ0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19JVF9KRU9DICAgQURDIEVuZCBvZiBJbmplY3RlZCBDb252ZXJzaW9uIGludGVycnVwdA0KLSAqIHNvdXJjZQ0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19JVF9KRU9TICAgQURDIEVuZCBvZiBJbmplY3RlZCBzZXF1ZW5jZSBvZg0KLSAqIENvbnZlcnNpb25zIGludGVycnVwdCBzb3VyY2UNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfSVRfQVdEMSAgIEFEQyBBbmFsb2cgd2F0Y2hkb2cgMSBpbnRlcnJ1cHQgc291cmNlDQotICogKG1haW4gYW5hbG9nIHdhdGNoZG9nKQ0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19JVF9BV0QyICAgQURDIEFuYWxvZyB3YXRjaGRvZyAyIGludGVycnVwdCBzb3VyY2UNCi0gKiAoYWRkaXRpb25hbCBhbmFsb2cgd2F0Y2hkb2cpDQotICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0lUX0FXRDMgICBBREMgQW5hbG9nIHdhdGNoZG9nIDMgaW50ZXJydXB0IHNvdXJjZQ0KLSAqIChhZGRpdGlvbmFsIGFuYWxvZyB3YXRjaGRvZykNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfSVRfSlFPVkYgIEFEQyBJbmplY3RlZCBDb250ZXh0IFF1ZXVlIE92ZXJmbG93DQotICogaW50ZXJydXB0IHNvdXJjZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX0FEQ19FTkFCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgXA0KLSAgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JRVIpIHw9IChfX0lOVEVSUlVQVF9fKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgRGlzYWJsZSBBREMgaW50ZXJydXB0Lg0KLSAqIEBwYXJhbSBfX0hBTkRMRV9fIEFEQyBoYW5kbGUNCi0gKiBAcGFyYW0gX19JTlRFUlJVUFRfXyBBREMgSW50ZXJydXB0DQotICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0lUX1JEWSAgICBBREMgUmVhZHkgaW50ZXJydXB0IHNvdXJjZQ0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19JVF9FT1NNUCAgQURDIEVuZCBvZiBTYW1wbGluZyBpbnRlcnJ1cHQgc291cmNlDQotICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0lUX0VPQyAgICBBREMgRW5kIG9mIFJlZ3VsYXIgQ29udmVyc2lvbiBpbnRlcnJ1cHQNCi0gKiBzb3VyY2UNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfSVRfRU9TICAgIEFEQyBFbmQgb2YgUmVndWxhciBzZXF1ZW5jZSBvZiBDb252ZXJzaW9ucw0KLSAqIGludGVycnVwdCBzb3VyY2UNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfSVRfT1ZSICAgIEFEQyBvdmVycnVuIGludGVycnVwdCBzb3VyY2UNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfSVRfSkVPQyAgIEFEQyBFbmQgb2YgSW5qZWN0ZWQgQ29udmVyc2lvbiBpbnRlcnJ1cHQNCi0gKiBzb3VyY2UNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfSVRfSkVPUyAgIEFEQyBFbmQgb2YgSW5qZWN0ZWQgc2VxdWVuY2Ugb2YNCi0gKiBDb252ZXJzaW9ucyBpbnRlcnJ1cHQgc291cmNlDQotICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0lUX0FXRDEgICBBREMgQW5hbG9nIHdhdGNoZG9nIDEgaW50ZXJydXB0IHNvdXJjZQ0KLSAqIChtYWluIGFuYWxvZyB3YXRjaGRvZykNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfSVRfQVdEMiAgIEFEQyBBbmFsb2cgd2F0Y2hkb2cgMiBpbnRlcnJ1cHQgc291cmNlDQotICogKGFkZGl0aW9uYWwgYW5hbG9nIHdhdGNoZG9nKQ0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19JVF9BV0QzICAgQURDIEFuYWxvZyB3YXRjaGRvZyAzIGludGVycnVwdCBzb3VyY2UNCi0gKiAoYWRkaXRpb25hbCBhbmFsb2cgd2F0Y2hkb2cpDQotICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0lUX0pRT1ZGICBBREMgSW5qZWN0ZWQgQ29udGV4dCBRdWV1ZSBPdmVyZmxvdw0KLSAqIGludGVycnVwdCBzb3VyY2UuDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9BRENfRElTQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSBcDQotICAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklFUikgJj0gfihfX0lOVEVSUlVQVF9fKSkNCi0NCi0vKiogQGJyaWVmICBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBBREMgaW50ZXJydXB0IHNvdXJjZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLg0KLSAqIEBwYXJhbSBfX0hBTkRMRV9fIEFEQyBoYW5kbGUNCi0gKiBAcGFyYW0gX19JTlRFUlJVUFRfXyBBREMgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjaw0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0lUX1JEWSAgICBBREMgUmVhZHkgaW50ZXJydXB0IHNvdXJjZQ0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19JVF9FT1NNUCAgQURDIEVuZCBvZiBTYW1wbGluZyBpbnRlcnJ1cHQgc291cmNlDQotICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0lUX0VPQyAgICBBREMgRW5kIG9mIFJlZ3VsYXIgQ29udmVyc2lvbiBpbnRlcnJ1cHQNCi0gKiBzb3VyY2UNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfSVRfRU9TICAgIEFEQyBFbmQgb2YgUmVndWxhciBzZXF1ZW5jZSBvZiBDb252ZXJzaW9ucw0KLSAqIGludGVycnVwdCBzb3VyY2UNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfSVRfT1ZSICAgIEFEQyBvdmVycnVuIGludGVycnVwdCBzb3VyY2UNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfSVRfSkVPQyAgIEFEQyBFbmQgb2YgSW5qZWN0ZWQgQ29udmVyc2lvbiBpbnRlcnJ1cHQNCi0gKiBzb3VyY2UNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfSVRfSkVPUyAgIEFEQyBFbmQgb2YgSW5qZWN0ZWQgc2VxdWVuY2Ugb2YNCi0gKiBDb252ZXJzaW9ucyBpbnRlcnJ1cHQgc291cmNlDQotICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0lUX0FXRDEgICBBREMgQW5hbG9nIHdhdGNoZG9nIDEgaW50ZXJydXB0IHNvdXJjZQ0KLSAqIChtYWluIGFuYWxvZyB3YXRjaGRvZykNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfSVRfQVdEMiAgIEFEQyBBbmFsb2cgd2F0Y2hkb2cgMiBpbnRlcnJ1cHQgc291cmNlDQotICogKGFkZGl0aW9uYWwgYW5hbG9nIHdhdGNoZG9nKQ0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19JVF9BV0QzICAgQURDIEFuYWxvZyB3YXRjaGRvZyAzIGludGVycnVwdCBzb3VyY2UNCi0gKiAoYWRkaXRpb25hbCBhbmFsb2cgd2F0Y2hkb2cpDQotICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0lUX0pRT1ZGICBBREMgSW5qZWN0ZWQgQ29udGV4dCBRdWV1ZSBPdmVyZmxvdw0KLSAqIGludGVycnVwdCBzb3VyY2UuDQotICogQHJldHZhbCBTdGF0ZSBvZiBpbnRlcnJ1cHRpb24gKFNFVCBvciBSRVNFVCkNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX0FEQ19HRVRfSVRfU09VUkNFKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pIFwNCi0gICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SUVSICYgKF9fSU5URVJSVVBUX18pKSA9PSAoX19JTlRFUlJVUFRfXykpDQotDQotLyoqDQotICogQGJyaWVmIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBBREMgZmxhZyBpcyBzZXQgb3Igbm90Lg0KLSAqIEBwYXJhbSBfX0hBTkRMRV9fIEFEQyBoYW5kbGUNCi0gKiBAcGFyYW0gX19GTEFHX18gQURDIGZsYWcNCi0gKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfRkxBR19SRFkgICAgIEFEQyBSZWFkeSBmbGFnDQotICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0ZMQUdfRU9TTVAgICBBREMgRW5kIG9mIFNhbXBsaW5nIGZsYWcNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfRkxBR19FT0MgICAgIEFEQyBFbmQgb2YgUmVndWxhciBDb252ZXJzaW9uIGZsYWcNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfRkxBR19FT1MgICAgIEFEQyBFbmQgb2YgUmVndWxhciBzZXF1ZW5jZSBvZg0KLSAqIENvbnZlcnNpb25zIGZsYWcNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfRkxBR19PVlIgICAgIEFEQyBvdmVycnVuIGZsYWcNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfRkxBR19KRU9DICAgIEFEQyBFbmQgb2YgSW5qZWN0ZWQgQ29udmVyc2lvbiBmbGFnDQotICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0ZMQUdfSkVPUyAgICBBREMgRW5kIG9mIEluamVjdGVkIHNlcXVlbmNlIG9mDQotICogQ29udmVyc2lvbnMgZmxhZw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19GTEFHX0FXRDEgICAgQURDIEFuYWxvZyB3YXRjaGRvZyAxIGZsYWcgKG1haW4gYW5hbG9nDQotICogd2F0Y2hkb2cpDQotICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0ZMQUdfQVdEMiAgICBBREMgQW5hbG9nIHdhdGNoZG9nIDIgZmxhZyAoYWRkaXRpb25hbA0KLSAqIGFuYWxvZyB3YXRjaGRvZykNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfRkxBR19BV0QzICAgIEFEQyBBbmFsb2cgd2F0Y2hkb2cgMyBmbGFnIChhZGRpdGlvbmFsDQotICogYW5hbG9nIHdhdGNoZG9nKQ0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19GTEFHX0pRT1ZGICAgQURDIEluamVjdGVkIENvbnRleHQgUXVldWUgT3ZlcmZsb3cNCi0gKiBmbGFnLg0KLSAqIEByZXR2YWwgU3RhdGUgb2YgZmxhZyAoVFJVRSBvciBGQUxTRSkuDQotICovDQotI2RlZmluZSBfX0hBTF9BRENfR0VUX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pIFwNCi0gICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUikgJiAoX19GTEFHX18pKSA9PSAoX19GTEFHX18pKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBDbGVhciB0aGUgc3BlY2lmaWVkIEFEQyBmbGFnLg0KLSAqIEBwYXJhbSBfX0hBTkRMRV9fIEFEQyBoYW5kbGUNCi0gKiBAcGFyYW0gX19GTEFHX18gQURDIGZsYWcNCi0gKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfRkxBR19SRFkgICAgIEFEQyBSZWFkeSBmbGFnDQotICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0ZMQUdfRU9TTVAgICBBREMgRW5kIG9mIFNhbXBsaW5nIGZsYWcNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfRkxBR19FT0MgICAgIEFEQyBFbmQgb2YgUmVndWxhciBDb252ZXJzaW9uIGZsYWcNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfRkxBR19FT1MgICAgIEFEQyBFbmQgb2YgUmVndWxhciBzZXF1ZW5jZSBvZg0KLSAqIENvbnZlcnNpb25zIGZsYWcNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfRkxBR19PVlIgICAgIEFEQyBvdmVycnVuIGZsYWcNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfRkxBR19KRU9DICAgIEFEQyBFbmQgb2YgSW5qZWN0ZWQgQ29udmVyc2lvbiBmbGFnDQotICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0ZMQUdfSkVPUyAgICBBREMgRW5kIG9mIEluamVjdGVkIHNlcXVlbmNlIG9mDQotICogQ29udmVyc2lvbnMgZmxhZw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19GTEFHX0FXRDEgICAgQURDIEFuYWxvZyB3YXRjaGRvZyAxIGZsYWcgKG1haW4gYW5hbG9nDQotICogd2F0Y2hkb2cpDQotICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0ZMQUdfQVdEMiAgICBBREMgQW5hbG9nIHdhdGNoZG9nIDIgZmxhZyAoYWRkaXRpb25hbA0KLSAqIGFuYWxvZyB3YXRjaGRvZykNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfRkxBR19BV0QzICAgIEFEQyBBbmFsb2cgd2F0Y2hkb2cgMyBmbGFnIChhZGRpdGlvbmFsDQotICogYW5hbG9nIHdhdGNoZG9nKQ0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19GTEFHX0pRT1ZGICAgQURDIEluamVjdGVkIENvbnRleHQgUXVldWUgT3ZlcmZsb3cNCi0gKiBmbGFnLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLS8qIE5vdGU6IGJpdCBjbGVhcmVkIGJpdCBieSB3cml0aW5nIDEgKHdyaXRpbmcgMCBoYXMgbm8gZWZmZWN0IG9uIGFueSBiaXQgb2YNCi0gKiByZWdpc3RlciBJU1IpICovDQotI2RlZmluZSBfX0hBTF9BRENfQ0xFQVJfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgXA0KLSAgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IpID0gKF9fRkxBR19fKSkNCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQURDX0hBTF9FTV9IRUxQRVJfTUFDUk8gSEFMIEFEQyBoZWxwZXIgbWFjcm8NCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGdldCBBREMgY2hhbm5lbCBudW1iZXIgaW4gZGVjaW1hbCBmb3JtYXQNCi0gKiAgICAgICAgIGZyb20gbGl0ZXJhbHMgQURDX0NIQU5ORUxfeC4NCi0gKiBAbm90ZSAgIEV4YW1wbGU6DQotICogICAgICAgICAgIF9fSEFMX0FEQ19DSEFOTkVMX1RPX0RFQ0lNQUxfTkIoQURDX0NIQU5ORUxfNCkNCi0gKiAgICAgICAgICAgd2lsbCByZXR1cm4gZGVjaW1hbCBudW1iZXIgIjQiLg0KLSAqIEBub3RlICAgVGhlIGlucHV0IGNhbiBiZSBhIHZhbHVlIGZyb20gZnVuY3Rpb25zIHdoZXJlIGEgY2hhbm5lbA0KLSAqICAgICAgICAgbnVtYmVyIGlzIHJldHVybmVkLCBlaXRoZXIgZGVmaW5lZCB3aXRoIG51bWJlcg0KLSAqICAgICAgICAgb3Igd2l0aCBiaXRmaWVsZCAob25seSBvbmUgYml0IG11c3QgYmUgc2V0KS4NCi0gKiBAcGFyYW0gIF9fQ0hBTk5FTF9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzEgICAgICAgICAgICAgICAgICg4KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzIgICAgICAgICAgICAgICAgICg4KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzMgICAgICAgICAgICAgICAgICg4KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzQgICAgICAgICAgICAgICAgICg4KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzUgICAgICAgICAgICAgICAgICg4KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF83DQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzExDQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzE0DQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzE3DQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF9WUkVGSU5UICAgICAgICAgICAoNykNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF9URU1QU0VOU09SX0FEQzEgICAoMSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF9URU1QU0VOU09SX0FEQzUgICAoNSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF9WQkFUICAgICAgICAgICAgICAoNikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF9WT1BBTVAxICAgICAgICAgICAoMSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF9WT1BBTVAyICAgICAgICAgICAoMikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF9WT1BBTVAzX0FEQzIgICAgICAoMikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF9WT1BBTVAzX0FEQzMgICAgICAoMykNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF9WT1BBTVA0ICAgICAgICAgICAoNSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF9WT1BBTVA1ICAgICAgICAgICAoNSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF9WT1BBTVA2ICAgICAgICAgICAoNCkNCi0gKg0KLSAqICAgICAgICAgKDEpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzEuXG4NCi0gKiAgICAgICAgICgyKSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMyLlxuDQotICogICAgICAgICAoMykgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMy5cbg0KLSAqICAgICAgICAgKDQpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzQuXG4NCi0gKiAgICAgICAgICg1KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREM1LlxuDQotICogICAgICAgICAoNikgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZXM6IEFEQzEsDQotICogQURDMywgQURDNS5cbiAoNykgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZXM6DQotICogQURDMSwgQURDMywgQURDNCwgQURDNS5cbg0KLSAqICAgICAgICAgIC0gIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBhbGwgQURDeCBhcmUgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlcy4NCi0gKiBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBtb3JlIGRldGFpbHMuICg4KSBPbiBTVE0zMkc0LCBmYXN0IGNoYW5uZWwNCi0gKiBhbGxvd3M6IDIuNSAoc2FtcGxpbmcpICsgMTIuNSAoY29udmVyc2lvbikgPSAxNSBBREMgY2xvY2sgY3ljbGVzIChmQURDKSB0bw0KLSAqIGNvbnZlcnQgaW4gMTItYml0IHJlc29sdXRpb24uIE90aGVyIGNoYW5uZWxzIGFyZSBzbG93IGNoYW5uZWxzICBhbGxvd3M6IDYuNQ0KLSAqIChzYW1wbGluZykgKyAxMi41IChjb252ZXJzaW9uKSA9IDE5IEFEQyBjbG9jayBjeWNsZXMgKGZBREMpIHRvIGNvbnZlcnQgaW4NCi0gKiAxMi1iaXQgcmVzb2x1dGlvbi5cbg0KLSAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0xOA0KLSAqLw0KLSNkZWZpbmUgX19IQUxfQURDX0NIQU5ORUxfVE9fREVDSU1BTF9OQihfX0NIQU5ORUxfXykgXA0KLSAgX19MTF9BRENfQ0hBTk5FTF9UT19ERUNJTUFMX05CKChfX0NIQU5ORUxfXykpDQotDQotLyoqDQotICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gZ2V0IEFEQyBjaGFubmVsIGluIGxpdGVyYWwgZm9ybWF0IEFEQ19DSEFOTkVMX3gNCi0gKiAgICAgICAgIGZyb20gbnVtYmVyIGluIGRlY2ltYWwgZm9ybWF0Lg0KLSAqIEBub3RlICAgRXhhbXBsZToNCi0gKiAgICAgICAgICAgX19IQUxfQURDX0RFQ0lNQUxfTkJfVE9fQ0hBTk5FTCg0KQ0KLSAqICAgICAgICAgICB3aWxsIHJldHVybiBhIGRhdGEgZXF1aXZhbGVudCB0byAiQURDX0NIQU5ORUxfNCIuDQotICogQHBhcmFtICBfX0RFQ0lNQUxfTkJfXyBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTE4DQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xICAgICAgICAgICAgICAgICAoOCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8yICAgICAgICAgICAgICAgICAoOCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8zICAgICAgICAgICAgICAgICAoOCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF80ICAgICAgICAgICAgICAgICAoOCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF81ICAgICAgICAgICAgICAgICAoOCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF82DQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfNw0KLSAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF85DQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzEyDQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzE1DQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xNw0KLSAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzE4DQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVlJFRklOVCAgICAgICAgICAgKDcpDQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVEVNUFNFTlNPUl9BREMxICAgKDEpDQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVEVNUFNFTlNPUl9BREM1ICAgKDUpDQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVkJBVCAgICAgICAgICAgICAgKDYpDQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVk9QQU1QMSAgICAgICAgICAgKDEpDQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVk9QQU1QMiAgICAgICAgICAgKDIpDQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVk9QQU1QM19BREMyICAgICAgKDIpDQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVk9QQU1QM19BREMzICAgICAgKDMpDQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVk9QQU1QNCAgICAgICAgICAgKDUpDQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVk9QQU1QNSAgICAgICAgICAgKDUpDQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVk9QQU1QNiAgICAgICAgICAgKDQpDQotICoNCi0gKiAgICAgICAgICgxKSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMxLlxuDQotICogICAgICAgICAoMikgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMi5cbg0KLSAqICAgICAgICAgKDMpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzMuXG4NCi0gKiAgICAgICAgICg0KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREM0LlxuDQotICogICAgICAgICAoNSkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDNS5cbg0KLSAqICAgICAgICAgKDYpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2VzOiBBREMxLA0KLSAqIEFEQzMsIEFEQzUuXG4gKDcpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2VzOg0KLSAqIEFEQzEsIEFEQzMsIEFEQzQsIEFEQzUuXG4NCi0gKiAgICAgICAgICAtICBPbiB0aGlzIFNUTTMyIHNlcmllcywgYWxsIEFEQ3ggYXJlIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuDQotICogUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgbW9yZSBkZXRhaWxzLiAoOCkgT24gU1RNMzJHNCwgZmFzdCBjaGFubmVsDQotICogYWxsb3dzOiAyLjUgKHNhbXBsaW5nKSArIDEyLjUgKGNvbnZlcnNpb24pID0gMTUgQURDIGNsb2NrIGN5Y2xlcyAoZkFEQykgdG8NCi0gKiBjb252ZXJ0IGluIDEyLWJpdCByZXNvbHV0aW9uLiBPdGhlciBjaGFubmVscyBhcmUgc2xvdyBjaGFubmVscyAgYWxsb3dzOiA2LjUNCi0gKiAoc2FtcGxpbmcpICsgMTIuNSAoY29udmVyc2lvbikgPSAxOSBBREMgY2xvY2sgY3ljbGVzIChmQURDKSB0byBjb252ZXJ0IGluDQotICogMTItYml0IHJlc29sdXRpb24uXG4gKDEsIDIsIDMsIDQsIDUsIDcpIEZvciBBREMgY2hhbm5lbCByZWFkIGJhY2sgZnJvbSBBREMNCi0gKiByZWdpc3RlciwgY29tcGFyaXNvbiB3aXRoIGludGVybmFsIGNoYW5uZWwgcGFyYW1ldGVyIHRvIGJlIGRvbmUgdXNpbmcgaGVscGVyDQotICogbWFjcm8gQHJlZiBfX0xMX0FEQ19DSEFOTkVMX0lOVEVSTkFMX1RPX0VYVEVSTkFMKCkuDQotICovDQotI2RlZmluZSBfX0hBTF9BRENfREVDSU1BTF9OQl9UT19DSEFOTkVMKF9fREVDSU1BTF9OQl9fKSBcDQotICBfX0xMX0FEQ19ERUNJTUFMX05CX1RPX0NIQU5ORUwoKF9fREVDSU1BTF9OQl9fKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgc2VsZWN0ZWQgY2hhbm5lbA0KLSAqICAgICAgICAgY29ycmVzcG9uZHMgdG8gbGl0ZXJhbCBkZWZpbml0aW9ucyBvZiBkcml2ZXIuDQotICogQG5vdGUgICBUaGUgZGlmZmVyZW50IGxpdGVyYWwgZGVmaW5pdGlvbnMgb2YgQURDIGNoYW5uZWxzIGFyZToNCi0gKiAgICAgICAgIC0gQURDIGludGVybmFsIGNoYW5uZWw6DQotICogICAgICAgICAgIEFEQ19DSEFOTkVMX1ZSRUZJTlQsIEFEQ19DSEFOTkVMX1RFTVBTRU5TT1IsIC4uLg0KLSAqICAgICAgICAgLSBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gYSBHUElPIHBpbik6DQotICogICAgICAgICAgIEFEQ19DSEFOTkVMXzEsIEFEQ19DSEFOTkVMXzIsIC4uLg0KLSAqIEBub3RlICAgVGhlIGNoYW5uZWwgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBkZWZpbmVkIGZyb20gbGl0ZXJhbA0KLSAqICAgICAgICAgZGVmaW5pdGlvbiBvZiBhIEFEQyBpbnRlcm5hbCBjaGFubmVsIChBRENfQ0hBTk5FTF9WUkVGSU5ULA0KLSAqICAgICAgICAgQURDX0NIQU5ORUxfVEVNUFNFTlNPUiwgLi4uKSwNCi0gKiAgICAgICAgIEFEQyBleHRlcm5hbCBjaGFubmVsIChBRENfQ0hBTk5FTF8xLCBBRENfQ0hBTk5FTF8yLCAuLi4pLA0KLSAqICAgICAgICAgbXVzdCBub3QgYmUgYSB2YWx1ZSBmcm9tIGZ1bmN0aW9ucyB3aGVyZSBhIGNoYW5uZWwgbnVtYmVyIGlzDQotICogICAgICAgICByZXR1cm5lZCBmcm9tIEFEQyByZWdpc3RlcnMsDQotICogICAgICAgICBiZWNhdXNlIGludGVybmFsIGFuZCBleHRlcm5hbCBjaGFubmVscyBzaGFyZSB0aGUgc2FtZSBjaGFubmVsDQotICogICAgICAgICBudW1iZXIgaW4gQURDIHJlZ2lzdGVycy4gVGhlIGRpZmZlcmVudGlhdGlvbiBpcyBtYWRlIG9ubHkgd2l0aA0KLSAqICAgICAgICAgcGFyYW1ldGVycyBkZWZpbml0aW9ucyBvZiBkcml2ZXIuDQotICogQHBhcmFtICBfX0NIQU5ORUxfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xICAgICAgICAgICAgICAgICAoOCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8yICAgICAgICAgICAgICAgICAoOCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8zICAgICAgICAgICAgICAgICAoOCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF80ICAgICAgICAgICAgICAgICAoOCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF81ICAgICAgICAgICAgICAgICAoOCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF82DQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfNw0KLSAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF85DQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzEyDQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzE1DQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xNw0KLSAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzE4DQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVlJFRklOVCAgICAgICAgICAgKDcpDQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVEVNUFNFTlNPUl9BREMxICAgKDEpDQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVEVNUFNFTlNPUl9BREM1ICAgKDUpDQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVkJBVCAgICAgICAgICAgICAgKDYpDQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVk9QQU1QMSAgICAgICAgICAgKDEpDQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVk9QQU1QMiAgICAgICAgICAgKDIpDQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVk9QQU1QM19BREMyICAgICAgKDIpDQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVk9QQU1QM19BREMzICAgICAgKDMpDQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVk9QQU1QNCAgICAgICAgICAgKDUpDQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVk9QQU1QNSAgICAgICAgICAgKDUpDQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVk9QQU1QNiAgICAgICAgICAgKDQpDQotICoNCi0gKiAgICAgICAgICgxKSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMxLlxuDQotICogICAgICAgICAoMikgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMi5cbg0KLSAqICAgICAgICAgKDMpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzMuXG4NCi0gKiAgICAgICAgICg0KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREM0LlxuDQotICogICAgICAgICAoNSkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDNS5cbg0KLSAqICAgICAgICAgKDYpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2VzOiBBREMxLA0KLSAqIEFEQzMsIEFEQzUuXG4gKDcpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2VzOg0KLSAqIEFEQzEsIEFEQzMsIEFEQzQsIEFEQzUuXG4NCi0gKiAgICAgICAgICAtICBPbiB0aGlzIFNUTTMyIHNlcmllcywgYWxsIEFEQ3ggYXJlIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuDQotICogUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgbW9yZSBkZXRhaWxzLiAoOCkgT24gU1RNMzJHNCwgZmFzdCBjaGFubmVsDQotICogYWxsb3dzOiAyLjUgKHNhbXBsaW5nKSArIDEyLjUgKGNvbnZlcnNpb24pID0gMTUgQURDIGNsb2NrIGN5Y2xlcyAoZkFEQykgdG8NCi0gKiBjb252ZXJ0IGluIDEyLWJpdCByZXNvbHV0aW9uLiBPdGhlciBjaGFubmVscyBhcmUgc2xvdyBjaGFubmVscyAgYWxsb3dzOiA2LjUNCi0gKiAoc2FtcGxpbmcpICsgMTIuNSAoY29udmVyc2lvbikgPSAxOSBBREMgY2xvY2sgY3ljbGVzIChmQURDKSB0byBjb252ZXJ0IGluDQotICogMTItYml0IHJlc29sdXRpb24uXG4NCi0gKiBAcmV0dmFsIFZhbHVlICIwIiBpZiB0aGUgY2hhbm5lbCBjb3JyZXNwb25kcyB0byBhIHBhcmFtZXRlciBkZWZpbml0aW9uIG9mIGENCi0gKiBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gYSBHUElPIHBpbikuIFZhbHVlICIxIiBpZiB0aGUNCi0gKiBjaGFubmVsIGNvcnJlc3BvbmRzIHRvIGEgcGFyYW1ldGVyIGRlZmluaXRpb24gb2YgYSBBREMgaW50ZXJuYWwgY2hhbm5lbC4NCi0gKi8NCi0jZGVmaW5lIF9fSEFMX0FEQ19JU19DSEFOTkVMX0lOVEVSTkFMKF9fQ0hBTk5FTF9fKSBcDQotICBfX0xMX0FEQ19JU19DSEFOTkVMX0lOVEVSTkFMKChfX0NIQU5ORUxfXykpDQotDQotLyoqDQotICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gY29udmVydCBhIGNoYW5uZWwgZGVmaW5lZCBmcm9tIHBhcmFtZXRlcg0KLSAqICAgICAgICAgZGVmaW5pdGlvbiBvZiBhIEFEQyBpbnRlcm5hbCBjaGFubmVsIChBRENfQ0hBTk5FTF9WUkVGSU5ULA0KLSAqICAgICAgICAgQURDX0NIQU5ORUxfVEVNUFNFTlNPUiwgLi4uKSwNCi0gKiAgICAgICAgIHRvIGl0cyBlcXVpdmFsZW50IHBhcmFtZXRlciBkZWZpbml0aW9uIG9mIGEgQURDIGV4dGVybmFsIGNoYW5uZWwNCi0gKiAgICAgICAgIChBRENfQ0hBTk5FTF8xLCBBRENfQ0hBTk5FTF8yLCAuLi4pLg0KLSAqIEBub3RlICAgVGhlIGNoYW5uZWwgcGFyYW1ldGVyIGNhbiBiZSwgYWRkaXRpb25hbGx5IHRvIGEgdmFsdWUNCi0gKiAgICAgICAgIGRlZmluZWQgZnJvbSBwYXJhbWV0ZXIgZGVmaW5pdGlvbiBvZiBhIEFEQyBpbnRlcm5hbCBjaGFubmVsDQotICogICAgICAgICAoQURDX0NIQU5ORUxfVlJFRklOVCwgQURDX0NIQU5ORUxfVEVNUFNFTlNPUiwgLi4uKSwNCi0gKiAgICAgICAgIGEgdmFsdWUgZGVmaW5lZCBmcm9tIHBhcmFtZXRlciBkZWZpbml0aW9uIG9mDQotICogICAgICAgICBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoQURDX0NIQU5ORUxfMSwgQURDX0NIQU5ORUxfMiwgLi4uKQ0KLSAqICAgICAgICAgb3IgYSB2YWx1ZSBmcm9tIGZ1bmN0aW9ucyB3aGVyZSBhIGNoYW5uZWwgbnVtYmVyIGlzIHJldHVybmVkDQotICogICAgICAgICBmcm9tIEFEQyByZWdpc3RlcnMuDQotICogQHBhcmFtICBfX0NIQU5ORUxfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xICAgICAgICAgICAgICAgICAoOCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8yICAgICAgICAgICAgICAgICAoOCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8zICAgICAgICAgICAgICAgICAoOCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF80ICAgICAgICAgICAgICAgICAoOCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF81ICAgICAgICAgICAgICAgICAoOCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF82DQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfNw0KLSAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF85DQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzEyDQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzE1DQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xNw0KLSAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzE4DQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVlJFRklOVCAgICAgICAgICAgKDcpDQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVEVNUFNFTlNPUl9BREMxICAgKDEpDQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVEVNUFNFTlNPUl9BREM1ICAgKDUpDQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVkJBVCAgICAgICAgICAgICAgKDYpDQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVk9QQU1QMSAgICAgICAgICAgKDEpDQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVk9QQU1QMiAgICAgICAgICAgKDIpDQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVk9QQU1QM19BREMyICAgICAgKDIpDQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVk9QQU1QM19BREMzICAgICAgKDMpDQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVk9QQU1QNCAgICAgICAgICAgKDUpDQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVk9QQU1QNSAgICAgICAgICAgKDUpDQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVk9QQU1QNiAgICAgICAgICAgKDQpDQotICoNCi0gKiAgICAgICAgICgxKSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMxLlxuDQotICogICAgICAgICAoMikgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMi5cbg0KLSAqICAgICAgICAgKDMpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzMuXG4NCi0gKiAgICAgICAgICg0KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREM0LlxuDQotICogICAgICAgICAoNSkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDNS5cbg0KLSAqICAgICAgICAgKDYpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2VzOiBBREMxLA0KLSAqIEFEQzMsIEFEQzUuXG4gKDcpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2VzOg0KLSAqIEFEQzEsIEFEQzMsIEFEQzQsIEFEQzUuXG4NCi0gKiAgICAgICAgICAtICBPbiB0aGlzIFNUTTMyIHNlcmllcywgYWxsIEFEQ3ggYXJlIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuDQotICogUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgbW9yZSBkZXRhaWxzLiAoOCkgT24gU1RNMzJHNCwgZmFzdCBjaGFubmVsDQotICogYWxsb3dzOiAyLjUgKHNhbXBsaW5nKSArIDEyLjUgKGNvbnZlcnNpb24pID0gMTUgQURDIGNsb2NrIGN5Y2xlcyAoZkFEQykgdG8NCi0gKiBjb252ZXJ0IGluIDEyLWJpdCByZXNvbHV0aW9uLiBPdGhlciBjaGFubmVscyBhcmUgc2xvdyBjaGFubmVscyAgYWxsb3dzOiA2LjUNCi0gKiAoc2FtcGxpbmcpICsgMTIuNSAoY29udmVyc2lvbikgPSAxOSBBREMgY2xvY2sgY3ljbGVzIChmQURDKSB0byBjb252ZXJ0IGluDQotICogMTItYml0IHJlc29sdXRpb24uXG4NCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8yDQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF81DQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF84DQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzEwDQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzEzDQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzE2DQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xOA0KLSAqLw0KLSNkZWZpbmUgX19IQUxfQURDX0NIQU5ORUxfSU5URVJOQUxfVE9fRVhURVJOQUwoX19DSEFOTkVMX18pIFwNCi0gIF9fTExfQURDX0NIQU5ORUxfSU5URVJOQUxfVE9fRVhURVJOQUwoKF9fQ0hBTk5FTF9fKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgaW50ZXJuYWwgY2hhbm5lbA0KLSAqICAgICAgICAgc2VsZWN0ZWQgaXMgYXZhaWxhYmxlIG9uIHRoZSBBREMgaW5zdGFuY2Ugc2VsZWN0ZWQuDQotICogQG5vdGUgICBUaGUgY2hhbm5lbCBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGRlZmluZWQgZnJvbSBwYXJhbWV0ZXINCi0gKiAgICAgICAgIGRlZmluaXRpb24gb2YgYSBBREMgaW50ZXJuYWwgY2hhbm5lbCAoQURDX0NIQU5ORUxfVlJFRklOVCwNCi0gKiAgICAgICAgIEFEQ19DSEFOTkVMX1RFTVBTRU5TT1IsIC4uLiksDQotICogICAgICAgICBtdXN0IG5vdCBiZSBhIHZhbHVlIGRlZmluZWQgZnJvbSBwYXJhbWV0ZXIgZGVmaW5pdGlvbiBvZg0KLSAqICAgICAgICAgQURDIGV4dGVybmFsIGNoYW5uZWwgKEFEQ19DSEFOTkVMXzEsIEFEQ19DSEFOTkVMXzIsIC4uLikNCi0gKiAgICAgICAgIG9yIGEgdmFsdWUgZnJvbSBmdW5jdGlvbnMgd2hlcmUgYSBjaGFubmVsIG51bWJlciBpcw0KLSAqICAgICAgICAgcmV0dXJuZWQgZnJvbSBBREMgcmVnaXN0ZXJzLA0KLSAqICAgICAgICAgYmVjYXVzZSBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgY2hhbm5lbHMgc2hhcmUgdGhlIHNhbWUgY2hhbm5lbA0KLSAqICAgICAgICAgbnVtYmVyIGluIEFEQyByZWdpc3RlcnMuIFRoZSBkaWZmZXJlbnRpYXRpb24gaXMgbWFkZSBvbmx5IHdpdGgNCi0gKiAgICAgICAgIHBhcmFtZXRlcnMgZGVmaW5pdGlvbnMgb2YgZHJpdmVyLg0KLSAqIEBwYXJhbSAgX19BRENfSU5TVEFOQ0VfXyBBREMgaW5zdGFuY2UNCi0gKiBAcGFyYW0gIF9fQ0hBTk5FTF9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVlJFRklOVCAgICAgICAgICAgKDcpDQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVEVNUFNFTlNPUl9BREMxICAgKDEpDQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVEVNUFNFTlNPUl9BREM1ICAgKDUpDQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVkJBVCAgICAgICAgICAgICAgKDYpDQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVk9QQU1QMSAgICAgICAgICAgKDEpDQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVk9QQU1QMiAgICAgICAgICAgKDIpDQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVk9QQU1QM19BREMyICAgICAgKDIpDQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVk9QQU1QM19BREMzICAgICAgKDMpDQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVk9QQU1QNCAgICAgICAgICAgKDUpDQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVk9QQU1QNSAgICAgICAgICAgKDUpDQotICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVk9QQU1QNiAgICAgICAgICAgKDQpDQotICoNCi0gKiAgICAgICAgICgxKSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMxLlxuDQotICogICAgICAgICAoMikgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMi5cbg0KLSAqICAgICAgICAgKDMpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzMuXG4NCi0gKiAgICAgICAgICg0KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREM0LlxuDQotICogICAgICAgICAoNSkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDNS5cbg0KLSAqICAgICAgICAgKDYpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2VzOiBBREMxLA0KLSAqIEFEQzMsIEFEQzUuXG4gKDcpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2VzOg0KLSAqIEFEQzEsIEFEQzMsIEFEQzQsIEFEQzUuXG4NCi0gKiAgICAgICAgICAtICBPbiB0aGlzIFNUTTMyIHNlcmllcywgYWxsIEFEQ3ggYXJlIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuDQotICogUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgbW9yZSBkZXRhaWxzLg0KLSAqIEByZXR2YWwgVmFsdWUgIjAiIGlmIHRoZSBpbnRlcm5hbCBjaGFubmVsIHNlbGVjdGVkIGlzIG5vdCBhdmFpbGFibGUgb24gdGhlDQotICogQURDIGluc3RhbmNlIHNlbGVjdGVkLiBWYWx1ZSAiMSIgaWYgdGhlIGludGVybmFsIGNoYW5uZWwgc2VsZWN0ZWQgaXMNCi0gKiBhdmFpbGFibGUgb24gdGhlIEFEQyBpbnN0YW5jZSBzZWxlY3RlZC4NCi0gKi8NCi0jZGVmaW5lIF9fSEFMX0FEQ19JU19DSEFOTkVMX0lOVEVSTkFMX0FWQUlMQUJMRShfX0FEQ19JTlNUQU5DRV9fLCBfX0NIQU5ORUxfXykgXA0KLSAgX19MTF9BRENfSVNfQ0hBTk5FTF9JTlRFUk5BTF9BVkFJTEFCTEUoKF9fQURDX0lOU1RBTkNFX18pLCAoX19DSEFOTkVMX18pKQ0KLQ0KLSNpZiBkZWZpbmVkKEFEQ19NVUxUSU1PREVfU1VQUE9SVCkNCi0vKioNCi0gKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBnZXQgdGhlIEFEQyBtdWx0aW1vZGUgY29udmVyc2lvbiBkYXRhIG9mIEFEQyBtYXN0ZXINCi0gKiAgICAgICAgIG9yIEFEQyBzbGF2ZSBmcm9tIHJhdyB2YWx1ZSB3aXRoIGJvdGggQURDIGNvbnZlcnNpb24gZGF0YQ0KLSAqIGNvbmNhdGVuYXRlZC4NCi0gKiBAbm90ZSAgIFRoaXMgbWFjcm8gaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aGVuIG11bHRpbW9kZSB0cmFuc2ZlciBieSBETUENCi0gKiAgICAgICAgIGlzIGVuYWJsZWQ6IHJlZmVyIHRvIGZ1bmN0aW9uIEByZWYgTExfQURDX1NldE11bHRpRE1BVHJhbnNmZXIoKS4NCi0gKiAgICAgICAgIEluIHRoaXMgY2FzZSB0aGUgdHJhbnNmZXJyZWQgZGF0YSBuZWVkIHRvIHByb2Nlc3NlZCB3aXRoIHRoaXMgbWFjcm8NCi0gKiAgICAgICAgIHRvIHNlcGFyYXRlIHRoZSBjb252ZXJzaW9uIGRhdGEgb2YgQURDIG1hc3RlciBhbmQgQURDIHNsYXZlLg0KLSAqIEBwYXJhbSAgX19BRENfTVVMVElfTUFTVEVSX1NMQVZFX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nDQotICogdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19NVUxUSV9NQVNURVINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfU0xBVkUNCi0gKiBAcGFyYW0gIF9fQURDX01VTFRJX0NPTlZfREFUQV9fIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMDAgYW5kDQotICogTWF4X0RhdGE9MHhGRkYNCi0gKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMDAgYW5kIE1heF9EYXRhPTB4RkZGDQotICovDQotI2RlZmluZSBfX0hBTF9BRENfTVVMVElfQ09OVl9EQVRBX01BU1RFUl9TTEFWRShfX0FEQ19NVUxUSV9NQVNURVJfU0xBVkVfXywgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19BRENfTVVMVElfQ09OVl9EQVRBX18pICAgIFwNCi0gIF9fTExfQURDX01VTFRJX0NPTlZfREFUQV9NQVNURVJfU0xBVkUoKF9fQURDX01VTFRJX01BU1RFUl9TTEFWRV9fKSwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0FEQ19NVUxUSV9DT05WX0RBVEFfXykpDQotI2VuZGlmIC8qIEFEQ19NVUxUSU1PREVfU1VQUE9SVCAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIHNlbGVjdCB0aGUgQURDIGNvbW1vbiBpbnN0YW5jZQ0KLSAqICAgICAgICAgdG8gd2hpY2ggaXMgYmVsb25naW5nIHRoZSBzZWxlY3RlZCBBREMgaW5zdGFuY2UuDQotICogQG5vdGUgICBBREMgY29tbW9uIHJlZ2lzdGVyIGluc3RhbmNlIGNhbiBiZSB1c2VkIGZvcjoNCi0gKiAgICAgICAgIC0gU2V0IHBhcmFtZXRlcnMgY29tbW9uIHRvIHNldmVyYWwgQURDIGluc3RhbmNlcw0KLSAqICAgICAgICAgLSBNdWx0aW1vZGUgKGZvciBkZXZpY2VzIHdpdGggc2V2ZXJhbCBBREMgaW5zdGFuY2VzKQ0KLSAqICAgICAgICAgUmVmZXIgdG8gZnVuY3Rpb25zIGhhdmluZyBhcmd1bWVudCAiQURDeHlfQ09NTU9OIiBhcyBwYXJhbWV0ZXIuDQotICogQHBhcmFtICBfX0FEQ3hfXyBBREMgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIEFEQyBjb21tb24gcmVnaXN0ZXIgaW5zdGFuY2UNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX0FEQ19DT01NT05fSU5TVEFOQ0UoX19BREN4X18pIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRSgoX19BREN4X18pKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGNoZWNrIGlmIGFsbCBBREMgaW5zdGFuY2VzIHNoYXJpbmcgdGhlIHNhbWUNCi0gKiAgICAgICAgIEFEQyBjb21tb24gaW5zdGFuY2UgYXJlIGRpc2FibGVkLg0KLSAqIEBub3RlICAgVGhpcyBjaGVjayBpcyByZXF1aXJlZCBieSBmdW5jdGlvbnMgd2l0aCBzZXR0aW5nIGNvbmRpdGlvbmVkIHRvDQotICogICAgICAgICBBREMgc3RhdGU6DQotICogICAgICAgICBBbGwgQURDIGluc3RhbmNlcyBvZiB0aGUgQURDIGNvbW1vbiBncm91cCBtdXN0IGJlIGRpc2FibGVkLg0KLSAqICAgICAgICAgUmVmZXIgdG8gZnVuY3Rpb25zIGhhdmluZyBhcmd1bWVudCAiQURDeHlfQ09NTU9OIiBhcyBwYXJhbWV0ZXIuDQotICogQG5vdGUgICBPbiBkZXZpY2VzIHdpdGggb25seSAxIEFEQyBjb21tb24gaW5zdGFuY2UsIHBhcmFtZXRlciBvZiB0aGlzIG1hY3JvDQotICogICAgICAgICBpcyB1c2VsZXNzIGFuZCBjYW4gYmUgaWdub3JlZCAocGFyYW1ldGVyIGtlcHQgZm9yIGNvbXBhdGliaWxpdHkNCi0gKiAgICAgICAgIHdpdGggZGV2aWNlcyBmZWF0dXJpbmcgc2V2ZXJhbCBBREMgY29tbW9uIGluc3RhbmNlcykuDQotICogQHBhcmFtICBfX0FEQ1hZX0NPTU1PTl9fIEFEQyBjb21tb24gaW5zdGFuY2UNCi0gKiAgICAgICAgIChjYW4gYmUgc2V0IGRpcmVjdGx5IGZyb20gQ01TSVMgZGVmaW5pdGlvbiBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8NCi0gKiBAcmVmIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRSgpICkNCi0gKiBAcmV0dmFsIFZhbHVlICIwIiBpZiBhbGwgQURDIGluc3RhbmNlcyBzaGFyaW5nIHRoZSBzYW1lIEFEQyBjb21tb24gaW5zdGFuY2UNCi0gKiAgICAgICAgIGFyZSBkaXNhYmxlZC4NCi0gKiAgICAgICAgIFZhbHVlICIxIiBpZiBhdCBsZWFzdCBvbmUgQURDIGluc3RhbmNlIHNoYXJpbmcgdGhlIHNhbWUgQURDIGNvbW1vbg0KLSAqIGluc3RhbmNlIGlzIGVuYWJsZWQuDQotICovDQotI2RlZmluZSBfX0hBTF9BRENfSVNfRU5BQkxFRF9BTExfQ09NTU9OX0lOU1RBTkNFKF9fQURDWFlfQ09NTU9OX18pIFwNCi0gIF9fTExfQURDX0lTX0VOQUJMRURfQUxMX0NPTU1PTl9JTlNUQU5DRSgoX19BRENYWV9DT01NT05fXykpDQotDQotLyoqDQotICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gZGVmaW5lIHRoZSBBREMgY29udmVyc2lvbiBkYXRhIGZ1bGwtc2NhbGUgZGlnaXRhbA0KLSAqICAgICAgICAgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgc2VsZWN0ZWQgQURDIHJlc29sdXRpb24uDQotICogQG5vdGUgICBBREMgY29udmVyc2lvbiBkYXRhIGZ1bGwtc2NhbGUgY29ycmVzcG9uZHMgdG8gdm9sdGFnZSByYW5nZQ0KLSAqICAgICAgICAgZGV0ZXJtaW5lZCBieSBhbmFsb2cgdm9sdGFnZSByZWZlcmVuY2VzIFZyZWYrIGFuZCBWcmVmLQ0KLSAqICAgICAgICAgKHJlZmVyIHRvIHJlZmVyZW5jZSBtYW51YWwpLg0KLSAqIEBwYXJhbSAgX19BRENfUkVTT0xVVElPTl9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgQURDX1JFU09MVVRJT05fMTJCDQotICogICAgICAgICBAYXJnIEByZWYgQURDX1JFU09MVVRJT05fMTBCDQotICogICAgICAgICBAYXJnIEByZWYgQURDX1JFU09MVVRJT05fOEINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfUkVTT0xVVElPTl82Qg0KLSAqIEByZXR2YWwgQURDIGNvbnZlcnNpb24gZGF0YSBmdWxsLXNjYWxlIGRpZ2l0YWwgdmFsdWUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX0FEQ19ESUdJVEFMX1NDQUxFKF9fQURDX1JFU09MVVRJT05fXykgXA0KLSAgX19MTF9BRENfRElHSVRBTF9TQ0FMRSgoX19BRENfUkVTT0xVVElPTl9fKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBjb252ZXJ0IHRoZSBBREMgY29udmVyc2lvbiBkYXRhIGZyb20NCi0gKiAgICAgICAgIGEgcmVzb2x1dGlvbiB0byBhbm90aGVyIHJlc29sdXRpb24uDQotICogQHBhcmFtICBfX0RBVEFfXyBBREMgY29udmVyc2lvbiBkYXRhIHRvIGJlIGNvbnZlcnRlZA0KLSAqIEBwYXJhbSAgX19BRENfUkVTT0xVVElPTl9DVVJSRU5UX18gUmVzb2x1dGlvbiBvZiB0byB0aGUgZGF0YSB0byBiZSBjb252ZXJ0ZWQNCi0gKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgQURDX1JFU09MVVRJT05fMTJCDQotICogICAgICAgICBAYXJnIEByZWYgQURDX1JFU09MVVRJT05fMTBCDQotICogICAgICAgICBAYXJnIEByZWYgQURDX1JFU09MVVRJT05fOEINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfUkVTT0xVVElPTl82Qg0KLSAqIEBwYXJhbSAgX19BRENfUkVTT0xVVElPTl9UQVJHRVRfXyBSZXNvbHV0aW9uIG9mIHRoZSBkYXRhIGFmdGVyIGNvbnZlcnNpb24NCi0gKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgQURDX1JFU09MVVRJT05fMTJCDQotICogICAgICAgICBAYXJnIEByZWYgQURDX1JFU09MVVRJT05fMTBCDQotICogICAgICAgICBAYXJnIEByZWYgQURDX1JFU09MVVRJT05fOEINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfUkVTT0xVVElPTl82Qg0KLSAqIEByZXR2YWwgQURDIGNvbnZlcnNpb24gZGF0YSB0byB0aGUgcmVxdWVzdGVkIHJlc29sdXRpb24NCi0gKi8NCi0jZGVmaW5lIF9fSEFMX0FEQ19DT05WRVJUX0RBVEFfUkVTT0xVVElPTiggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgX19EQVRBX18sIF9fQURDX1JFU09MVVRJT05fQ1VSUkVOVF9fLCBfX0FEQ19SRVNPTFVUSU9OX1RBUkdFVF9fKSAgICAgICAgIFwNCi0gIF9fTExfQURDX0NPTlZFUlRfREFUQV9SRVNPTFVUSU9OKChfX0RBVEFfXyksIChfX0FEQ19SRVNPTFVUSU9OX0NVUlJFTlRfXyksIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0FEQ19SRVNPTFVUSU9OX1RBUkdFVF9fKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBjYWxjdWxhdGUgdGhlIHZvbHRhZ2UgKHVuaXQ6IG1Wb2x0KQ0KLSAqICAgICAgICAgY29ycmVzcG9uZGluZyB0byBhIEFEQyBjb252ZXJzaW9uIGRhdGEgKHVuaXQ6IGRpZ2l0YWwgdmFsdWUpLg0KLSAqIEBub3RlICAgQW5hbG9nIHJlZmVyZW5jZSB2b2x0YWdlIChWcmVmKykgbXVzdCBiZSBlaXRoZXIga25vd24gZnJvbQ0KLSAqICAgICAgICAgdXNlciBib2FyZCBlbnZpcm9ubWVudCBvciBjYW4gYmUgY2FsY3VsYXRlZCB1c2luZyBBREMgbWVhc3VyZW1lbnQNCi0gKiAgICAgICAgIGFuZCBBREMgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ0FMQ19WUkVGQU5BTE9HX1ZPTFRBR0UoKS4NCi0gKiBAcGFyYW0gIF9fVlJFRkFOQUxPR19WT0xUQUdFX18gQW5hbG9nIHJlZmVyZW5jZSB2b2x0YWdlICh1bml0OiBtVikNCi0gKiBAcGFyYW0gIF9fQURDX0RBVEFfXyBBREMgY29udmVyc2lvbiBkYXRhIChyZXNvbHV0aW9uIDEyIGJpdHMpDQotICogICAgICAgICAgICAgICAgICAgICAgICh1bml0OiBkaWdpdGFsIHZhbHVlKS4NCi0gKiBAcGFyYW0gIF9fQURDX1JFU09MVVRJT05fXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19SRVNPTFVUSU9OXzEyQg0KLSAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19SRVNPTFVUSU9OXzEwQg0KLSAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19SRVNPTFVUSU9OXzhCDQotICogICAgICAgICBAYXJnIEByZWYgQURDX1JFU09MVVRJT05fNkINCi0gKiBAcmV0dmFsIEFEQyBjb252ZXJzaW9uIGRhdGEgZXF1aXZhbGVudCB2b2x0YWdlIHZhbHVlICh1bml0OiBtVm9sdCkNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX0FEQ19DQUxDX0RBVEFfVE9fVk9MVEFHRShfX1ZSRUZBTkFMT0dfVk9MVEFHRV9fLCBfX0FEQ19EQVRBX18sIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0FEQ19SRVNPTFVUSU9OX18pICAgICAgICAgICAgICAgICAgIFwNCi0gIF9fTExfQURDX0NBTENfREFUQV9UT19WT0xUQUdFKChfX1ZSRUZBTkFMT0dfVk9MVEFHRV9fKSwgKF9fQURDX0RBVEFfXyksICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0FEQ19SRVNPTFVUSU9OX18pKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGNhbGN1bGF0ZSBhbmFsb2cgcmVmZXJlbmNlIHZvbHRhZ2UgKFZyZWYrKQ0KLSAqICAgICAgICAgKHVuaXQ6IG1Wb2x0KSBmcm9tIEFEQyBjb252ZXJzaW9uIGRhdGEgb2YgaW50ZXJuYWwgdm9sdGFnZQ0KLSAqICAgICAgICAgcmVmZXJlbmNlIFZyZWZJbnQuDQotICogQG5vdGUgICBDb21wdXRhdGlvbiBpcyB1c2luZyBWcmVmSW50IGNhbGlicmF0aW9uIHZhbHVlDQotICogICAgICAgICBzdG9yZWQgaW4gc3lzdGVtIG1lbW9yeSBmb3IgZWFjaCBkZXZpY2UgZHVyaW5nIHByb2R1Y3Rpb24uDQotICogQG5vdGUgICBUaGlzIHZvbHRhZ2UgZGVwZW5kcyBvbiB1c2VyIGJvYXJkIGVudmlyb25tZW50OiB2b2x0YWdlIGxldmVsDQotICogICAgICAgICBjb25uZWN0ZWQgdG8gcGluIFZyZWYrLg0KLSAqICAgICAgICAgT24gZGV2aWNlcyB3aXRoIHNtYWxsIHBhY2thZ2UsIHRoZSBwaW4gVnJlZisgaXMgbm90IHByZXNlbnQNCi0gKiAgICAgICAgIGFuZCBpbnRlcm5hbGx5IGJvbmRlZCB0byBwaW4gVmRkYS4NCi0gKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBjYWxpYnJhdGlvbiBkYXRhIG9mIGludGVybmFsIHZvbHRhZ2UgcmVmZXJlbmNlDQotICogICAgICAgICBWcmVmSW50IGNvcnJlc3BvbmRzIHRvIGEgcmVzb2x1dGlvbiBvZiAxMiBiaXRzLA0KLSAqICAgICAgICAgdGhpcyBpcyB0aGUgcmVjb21tZW5kZWQgQURDIHJlc29sdXRpb24gdG8gY29udmVydCB2b2x0YWdlIG9mDQotICogICAgICAgICBpbnRlcm5hbCB2b2x0YWdlIHJlZmVyZW5jZSBWcmVmSW50Lg0KLSAqICAgICAgICAgT3RoZXJ3aXNlLCB0aGlzIG1hY3JvIHBlcmZvcm1zIHRoZSBwcm9jZXNzaW5nIHRvIHNjYWxlDQotICogICAgICAgICBBREMgY29udmVyc2lvbiBkYXRhIHRvIDEyIGJpdHMuDQotICogQHBhcmFtICBfX1ZSRUZJTlRfQURDX0RBVEFfXyBBREMgY29udmVyc2lvbiBkYXRhIChyZXNvbHV0aW9uIDEyIGJpdHMpDQotICogICAgICAgICBvZiBpbnRlcm5hbCB2b2x0YWdlIHJlZmVyZW5jZSBWcmVmSW50ICh1bml0OiBkaWdpdGFsIHZhbHVlKS4NCi0gKiBAcGFyYW0gIF9fQURDX1JFU09MVVRJT05fXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19SRVNPTFVUSU9OXzEyQg0KLSAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19SRVNPTFVUSU9OXzEwQg0KLSAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19SRVNPTFVUSU9OXzhCDQotICogICAgICAgICBAYXJnIEByZWYgQURDX1JFU09MVVRJT05fNkINCi0gKiBAcmV0dmFsIEFuYWxvZyByZWZlcmVuY2Ugdm9sdGFnZSAodW5pdDogbVYpDQotICovDQotI2RlZmluZSBfX0hBTF9BRENfQ0FMQ19WUkVGQU5BTE9HX1ZPTFRBR0UoX19WUkVGSU5UX0FEQ19EQVRBX18sIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0FEQ19SRVNPTFVUSU9OX18pICAgXA0KLSAgX19MTF9BRENfQ0FMQ19WUkVGQU5BTE9HX1ZPTFRBR0UoKF9fVlJFRklOVF9BRENfREFUQV9fKSwgKF9fQURDX1JFU09MVVRJT05fXykpDQotDQotLyoqDQotICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gY2FsY3VsYXRlIHRoZSB0ZW1wZXJhdHVyZSAodW5pdDogZGVncmVlIENlbHNpdXMpDQotICogICAgICAgICBmcm9tIEFEQyBjb252ZXJzaW9uIGRhdGEgb2YgaW50ZXJuYWwgdGVtcGVyYXR1cmUgc2Vuc29yLg0KLSAqIEBub3RlICAgQ29tcHV0YXRpb24gaXMgdXNpbmcgdGVtcGVyYXR1cmUgc2Vuc29yIGNhbGlicmF0aW9uIHZhbHVlcw0KLSAqICAgICAgICAgc3RvcmVkIGluIHN5c3RlbSBtZW1vcnkgZm9yIGVhY2ggZGV2aWNlIGR1cmluZyBwcm9kdWN0aW9uLg0KLSAqIEBub3RlICAgQ2FsY3VsYXRpb24gZm9ybXVsYToNCi0gKiAgICAgICAgICAgVGVtcGVyYXR1cmUgPSAoKFRTX0FEQ19EQVRBIC0gVFNfQ0FMMSkNCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICogKFRTX0NBTDJfVEVNUCAtIFRTX0NBTDFfVEVNUCkpDQotICogICAgICAgICAgICAgICAgICAgICAgICAgLyAoVFNfQ0FMMiAtIFRTX0NBTDEpICsgVFNfQ0FMMV9URU1QDQotICogICAgICAgICAgIHdpdGggVFNfQURDX0RBVEEgPSB0ZW1wZXJhdHVyZSBzZW5zb3IgcmF3IGRhdGEgbWVhc3VyZWQgYnkgQURDDQotICogICAgICAgICAgICAgICAgQXZnX1Nsb3BlID0gKFRTX0NBTDIgLSBUU19DQUwxKQ0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKFRTX0NBTDJfVEVNUCAtIFRTX0NBTDFfVEVNUCkNCi0gKiAgICAgICAgICAgICAgICBUU19DQUwxICAgPSBlcXVpdmFsZW50IFRTX0FEQ19EQVRBIGF0IHRlbXBlcmF0dXJlDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVNUF9ERUdDX0NBTDEgKGNhbGlicmF0ZWQgaW4gZmFjdG9yeSkNCi0gKiAgICAgICAgICAgICAgICBUU19DQUwyICAgPSBlcXVpdmFsZW50IFRTX0FEQ19EQVRBIGF0IHRlbXBlcmF0dXJlDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVNUF9ERUdDX0NBTDIgKGNhbGlicmF0ZWQgaW4gZmFjdG9yeSkNCi0gKiAgICAgICAgIENhdXRpb246IENhbGN1bGF0aW9uIHJlbGV2YW5jeSB1bmRlciByZXNlcnZlIHRoYXQgY2FsaWJyYXRpb24NCi0gKiAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgYXJlIGNvcnJlY3QgKGFkZHJlc3MgYW5kIGRhdGEpLg0KLSAqICAgICAgICAgICAgICAgICAgVG8gY2FsY3VsYXRlIHRlbXBlcmF0dXJlIHVzaW5nIHRlbXBlcmF0dXJlIHNlbnNvcg0KLSAqICAgICAgICAgICAgICAgICAgZGF0YXNoZWV0IHR5cGljYWwgdmFsdWVzIChnZW5lcmljIHZhbHVlcyBsZXNzLCB0aGVyZWZvcmUNCi0gKiAgICAgICAgICAgICAgICAgIGxlc3MgYWNjdXJhdGUgdGhhbiBjYWxpYnJhdGVkIHZhbHVlcyksDQotICogICAgICAgICAgICAgICAgICB1c2UgaGVscGVyIG1hY3JvIEByZWYNCi0gKiBfX0xMX0FEQ19DQUxDX1RFTVBFUkFUVVJFX1RZUF9QQVJBTVMoKS4NCi0gKiBAbm90ZSAgIEFzIGNhbGN1bGF0aW9uIGlucHV0LCB0aGUgYW5hbG9nIHJlZmVyZW5jZSB2b2x0YWdlIChWcmVmKykgbXVzdCBiZQ0KLSAqICAgICAgICAgZGVmaW5lZCBhcyBpdCBpbXBhY3RzIHRoZSBBREMgTFNCIGVxdWl2YWxlbnQgdm9sdGFnZS4NCi0gKiBAbm90ZSAgIEFuYWxvZyByZWZlcmVuY2Ugdm9sdGFnZSAoVnJlZispIG11c3QgYmUgZWl0aGVyIGtub3duIGZyb20NCi0gKiAgICAgICAgIHVzZXIgYm9hcmQgZW52aXJvbm1lbnQgb3IgY2FuIGJlIGNhbGN1bGF0ZWQgdXNpbmcgQURDIG1lYXN1cmVtZW50DQotICogICAgICAgICBhbmQgQURDIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0NBTENfVlJFRkFOQUxPR19WT0xUQUdFKCkuDQotICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllcywgY2FsaWJyYXRpb24gZGF0YSBvZiB0ZW1wZXJhdHVyZSBzZW5zb3INCi0gKiAgICAgICAgIGNvcnJlc3BvbmRzIHRvIGEgcmVzb2x1dGlvbiBvZiAxMiBiaXRzLA0KLSAqICAgICAgICAgdGhpcyBpcyB0aGUgcmVjb21tZW5kZWQgQURDIHJlc29sdXRpb24gdG8gY29udmVydCB2b2x0YWdlIG9mDQotICogICAgICAgICB0ZW1wZXJhdHVyZSBzZW5zb3IuDQotICogICAgICAgICBPdGhlcndpc2UsIHRoaXMgbWFjcm8gcGVyZm9ybXMgdGhlIHByb2Nlc3NpbmcgdG8gc2NhbGUNCi0gKiAgICAgICAgIEFEQyBjb252ZXJzaW9uIGRhdGEgdG8gMTIgYml0cy4NCi0gKiBAcGFyYW0gIF9fVlJFRkFOQUxPR19WT0xUQUdFX18gIEFuYWxvZyByZWZlcmVuY2Ugdm9sdGFnZSAodW5pdDogbVYpDQotICogQHBhcmFtICBfX1RFTVBTRU5TT1JfQURDX0RBVEFfXyBBREMgY29udmVyc2lvbiBkYXRhIG9mIGludGVybmFsDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wZXJhdHVyZSBzZW5zb3IgKHVuaXQ6IGRpZ2l0YWwgdmFsdWUpLg0KLSAqIEBwYXJhbSAgX19BRENfUkVTT0xVVElPTl9fICAgICAgQURDIHJlc29sdXRpb24gYXQgd2hpY2ggaW50ZXJuYWwgdGVtcGVyYXR1cmUNCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbnNvciB2b2x0YWdlIGhhcyBiZWVuIG1lYXN1cmVkLg0KLSAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfUkVTT0xVVElPTl8xMkINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfUkVTT0xVVElPTl8xMEINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBBRENfUkVTT0xVVElPTl84Qg0KLSAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19SRVNPTFVUSU9OXzZCDQotICogQHJldHZhbCBUZW1wZXJhdHVyZSAodW5pdDogZGVncmVlIENlbHNpdXMpDQotICovDQotI2RlZmluZSBfX0hBTF9BRENfQ0FMQ19URU1QRVJBVFVSRSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgX19WUkVGQU5BTE9HX1ZPTFRBR0VfXywgX19URU1QU0VOU09SX0FEQ19EQVRBX18sIF9fQURDX1JFU09MVVRJT05fXykgXA0KLSAgX19MTF9BRENfQ0FMQ19URU1QRVJBVFVSRSgoX19WUkVGQU5BTE9HX1ZPTFRBR0VfXyksICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX1RFTVBTRU5TT1JfQURDX0RBVEFfXyksIChfX0FEQ19SRVNPTFVUSU9OX18pKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGNhbGN1bGF0ZSB0aGUgdGVtcGVyYXR1cmUgKHVuaXQ6IGRlZ3JlZSBDZWxzaXVzKQ0KLSAqICAgICAgICAgZnJvbSBBREMgY29udmVyc2lvbiBkYXRhIG9mIGludGVybmFsIHRlbXBlcmF0dXJlIHNlbnNvci4NCi0gKiBAbm90ZSAgIENvbXB1dGF0aW9uIGlzIHVzaW5nIHRlbXBlcmF0dXJlIHNlbnNvciB0eXBpY2FsIHZhbHVlcw0KLSAqICAgICAgICAgKHJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQpLg0KLSAqIEBub3RlICAgQ2FsY3VsYXRpb24gZm9ybXVsYToNCi0gKiAgICAgICAgICAgVGVtcGVyYXR1cmUgPSAoVFNfVFlQX0NBTHhfVk9MVCh1VikgLSBUU19BRENfREFUQSAqIENvbnZlcnNpb25fdVYpDQotICogICAgICAgICAgICAgICAgICAgICAgICAgLyBBdmdfU2xvcGUgKyBDQUx4X1RFTVANCi0gKiAgICAgICAgICAgd2l0aCBUU19BRENfREFUQSAgICAgID0gdGVtcGVyYXR1cmUgc2Vuc29yIHJhdyBkYXRhIG1lYXN1cmVkIGJ5IEFEQw0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5pdDogZGlnaXRhbCB2YWx1ZSkNCi0gKiAgICAgICAgICAgICAgICBBdmdfU2xvcGUgICAgICAgID0gdGVtcGVyYXR1cmUgc2Vuc29yIHNsb3BlDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bml0OiB1Vi9EZWdyZWUgQ2Vsc2l1cykNCi0gKiAgICAgICAgICAgICAgICBUU19UWVBfQ0FMeF9WT0xUID0gdGVtcGVyYXR1cmUgc2Vuc29yIGRpZ2l0YWwgdmFsdWUgYXQNCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGVyYXR1cmUgQ0FMeF9URU1QICh1bml0OiBtVikNCi0gKiAgICAgICAgIENhdXRpb246IENhbGN1bGF0aW9uIHJlbGV2YW5jeSB1bmRlciByZXNlcnZlIHRoZSB0ZW1wZXJhdHVyZSBzZW5zb3INCi0gKiAgICAgICAgICAgICAgICAgIG9mIHRoZSBjdXJyZW50IGRldmljZSBoYXMgY2hhcmFjdGVyaXN0aWNzIGluIGxpbmUgd2l0aA0KLSAqICAgICAgICAgICAgICAgICAgZGF0YXNoZWV0IHR5cGljYWwgdmFsdWVzLg0KLSAqICAgICAgICAgICAgICAgICAgSWYgdGVtcGVyYXR1cmUgc2Vuc29yIGNhbGlicmF0aW9uIHZhbHVlcyBhcmUgYXZhaWxhYmxlIG9uDQotICogICAgICAgICAgICAgICAgICBvbiB0aGlzIGRldmljZSAocHJlc2VuY2Ugb2YgbWFjcm8NCi0gKiBfX0xMX0FEQ19DQUxDX1RFTVBFUkFUVVJFKCkpLCB0ZW1wZXJhdHVyZSBjYWxjdWxhdGlvbiB3aWxsIGJlIG1vcmUgYWNjdXJhdGUNCi0gKiB1c2luZyBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19DQUxDX1RFTVBFUkFUVVJFKCkuDQotICogQG5vdGUgICBBcyBjYWxjdWxhdGlvbiBpbnB1dCwgdGhlIGFuYWxvZyByZWZlcmVuY2Ugdm9sdGFnZSAoVnJlZispIG11c3QgYmUNCi0gKiAgICAgICAgIGRlZmluZWQgYXMgaXQgaW1wYWN0cyB0aGUgQURDIExTQiBlcXVpdmFsZW50IHZvbHRhZ2UuDQotICogQG5vdGUgICBBbmFsb2cgcmVmZXJlbmNlIHZvbHRhZ2UgKFZyZWYrKSBtdXN0IGJlIGVpdGhlciBrbm93biBmcm9tDQotICogICAgICAgICB1c2VyIGJvYXJkIGVudmlyb25tZW50IG9yIGNhbiBiZSBjYWxjdWxhdGVkIHVzaW5nIEFEQyBtZWFzdXJlbWVudA0KLSAqICAgICAgICAgYW5kIEFEQyBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19DQUxDX1ZSRUZBTkFMT0dfVk9MVEFHRSgpLg0KLSAqIEBub3RlICAgQURDIG1lYXN1cmVtZW50IGRhdGEgbXVzdCBjb3JyZXNwb25kIHRvIGEgcmVzb2x1dGlvbiBvZiAxMmJpdHMNCi0gKiAgICAgICAgIChmdWxsIHNjYWxlIGRpZ2l0YWwgdmFsdWUgNDA5NSkuIElmIG5vdCB0aGUgY2FzZSwgdGhlIGRhdGEgbXVzdCBiZQ0KLSAqICAgICAgICAgcHJlbGltaW5hcmlseSByZXNjYWxlZCB0byBhbiBlcXVpdmFsZW50IHJlc29sdXRpb24gb2YgMTIgYml0cy4NCi0gKiBAcGFyYW0gIF9fVEVNUFNFTlNPUl9UWVBfQVZHU0xPUEVfXyAgIERldmljZSBkYXRhc2hlZXQgZGF0YTogVGVtcGVyYXR1cmUNCi0gKiBzZW5zb3Igc2xvcGUgdHlwaWNhbCB2YWx1ZSAodW5pdDogdVYvRGVnQ2Vsc2l1cykuIE9uIFNUTTMyRzQsIHJlZmVyIHRvIGRldmljZQ0KLSAqIGRhdGFzaGVldCBwYXJhbWV0ZXIgIkF2Z19TbG9wZSIuDQotICogQHBhcmFtICBfX1RFTVBTRU5TT1JfVFlQX0NBTFhfVl9fICAgICBEZXZpY2UgZGF0YXNoZWV0IGRhdGE6IFRlbXBlcmF0dXJlDQotICogc2Vuc29yIHZvbHRhZ2UgdHlwaWNhbCB2YWx1ZSAoYXQgdGVtcGVyYXR1cmUgYW5kIFZyZWYrIGRlZmluZWQgaW4gcGFyYW1ldGVycw0KLSAqIGJlbG93KSAodW5pdDogbVYpLiBPbiBTVE0zMkc0LCByZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IHBhcmFtZXRlciAiVjMwIg0KLSAqIChjb3JyZXNwb25kaW5nIHRvIFRTX0NBTDEpLg0KLSAqIEBwYXJhbSAgX19URU1QU0VOU09SX0NBTFhfVEVNUF9fICAgICAgRGV2aWNlIGRhdGFzaGVldCBkYXRhOiBUZW1wZXJhdHVyZSBhdA0KLSAqIHdoaWNoIHRlbXBlcmF0dXJlIHNlbnNvciB2b2x0YWdlIChzZWUgcGFyYW1ldGVyIGFib3ZlKSBpcyBjb3JyZXNwb25kaW5nDQotICogKHVuaXQ6IG1WKQ0KLSAqIEBwYXJhbSAgX19WUkVGQU5BTE9HX1ZPTFRBR0VfXyAgICAgICAgQW5hbG9nIHZvbHRhZ2UgcmVmZXJlbmNlIChWcmVmKykNCi0gKiB2b2x0YWdlICh1bml0OiBtVikNCi0gKiBAcGFyYW0gIF9fVEVNUFNFTlNPUl9BRENfREFUQV9fICAgICAgIEFEQyBjb252ZXJzaW9uIGRhdGEgb2YgaW50ZXJuYWwNCi0gKiB0ZW1wZXJhdHVyZSBzZW5zb3IgKHVuaXQ6IGRpZ2l0YWwgdmFsdWUpLg0KLSAqIEBwYXJhbSAgX19BRENfUkVTT0xVVElPTl9fICAgICAgICAgICAgQURDIHJlc29sdXRpb24gYXQgd2hpY2ggaW50ZXJuYWwNCi0gKiB0ZW1wZXJhdHVyZSBzZW5zb3Igdm9sdGFnZSBoYXMgYmVlbiBtZWFzdXJlZC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZg0KLSAqIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19SRVNPTFVUSU9OXzEyQg0KLSAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19SRVNPTFVUSU9OXzEwQg0KLSAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19SRVNPTFVUSU9OXzhCDQotICogICAgICAgICBAYXJnIEByZWYgQURDX1JFU09MVVRJT05fNkINCi0gKiBAcmV0dmFsIFRlbXBlcmF0dXJlICh1bml0OiBkZWdyZWUgQ2Vsc2l1cykNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX0FEQ19DQUxDX1RFTVBFUkFUVVJFX1RZUF9QQVJBTVMoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBfX1RFTVBTRU5TT1JfVFlQX0FWR1NMT1BFX18sIF9fVEVNUFNFTlNPUl9UWVBfQ0FMWF9WX18sICAgICAgICAgICAgICAgICAgICBcDQotICAgIF9fVEVNUFNFTlNPUl9DQUxYX1RFTVBfXywgX19WUkVGQU5BTE9HX1ZPTFRBR0VfXywgX19URU1QU0VOU09SX0FEQ19EQVRBX18sIFwNCi0gICAgX19BRENfUkVTT0xVVElPTl9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgX19MTF9BRENfQ0FMQ19URU1QRVJBVFVSRV9UWVBfUEFSQU1TKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgKF9fVEVNUFNFTlNPUl9UWVBfQVZHU0xPUEVfXyksIChfX1RFTVBTRU5TT1JfVFlQX0NBTFhfVl9fKSwgICAgICAgICAgICAgIFwNCi0gICAgICAoX19URU1QU0VOU09SX0NBTFhfVEVNUF9fKSwgKF9fVlJFRkFOQUxPR19WT0xUQUdFX18pLCAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgIChfX1RFTVBTRU5TT1JfQURDX0RBVEFfXyksIChfX0FEQ19SRVNPTFVUSU9OX18pKQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiBJbmNsdWRlIEFEQyBIQUwgRXh0ZW5kZWQgbW9kdWxlICovDQotI2luY2x1ZGUgInN0bTMyZzR4eF9oYWxfYWRjX2V4LmgiDQotDQotLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGFkZHRvZ3JvdXAgQURDX0V4cG9ydGVkX0Z1bmN0aW9ucw0KLSAqIEB7DQotICovDQotDQotLyoqIEBhZGR0b2dyb3VwIEFEQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxDQotICogQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucw0KLSAqIEB7DQotICovDQotLyogSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDX0luaXQoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfRGVJbml0KEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKTsNCi12b2lkIEhBTF9BRENfTXNwSW5pdChBRENfSGFuZGxlVHlwZURlZiAqaGFkYyk7DQotdm9pZCBIQUxfQURDX01zcERlSW5pdChBRENfSGFuZGxlVHlwZURlZiAqaGFkYyk7DQotDQotI2lmIChVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkNCi0vKiBDYWxsYmFja3MgUmVnaXN0ZXIvVW5SZWdpc3RlciBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfUmVnaXN0ZXJDYWxsYmFjayhBRENfSGFuZGxlVHlwZURlZiAqaGFkYywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQURDX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfVW5SZWdpc3RlckNhbGxiYWNrKA0KLSAgICBBRENfSGFuZGxlVHlwZURlZiAqaGFkYywgSEFMX0FEQ19DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKTsNCi0jZW5kaWYgLyogVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGFkZHRvZ3JvdXAgQURDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDINCi0gKiBAYnJpZWYgICAgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucw0KLSAqIEB7DQotICovDQotLyogSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0NCi0vKiBCbG9ja2luZyBtb2RlOiBQb2xsaW5nICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ19TdGFydChBRENfSGFuZGxlVHlwZURlZiAqaGFkYyk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ19TdG9wKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDX1BvbGxGb3JDb252ZXJzaW9uKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZW91dCk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ19Qb2xsRm9yRXZlbnQoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRXZlbnRUeXBlLCB1aW50MzJfdCBUaW1lb3V0KTsNCi0NCi0vKiBOb24tYmxvY2tpbmcgbW9kZTogSW50ZXJydXB0aW9uICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ19TdGFydF9JVChBRENfSGFuZGxlVHlwZURlZiAqaGFkYyk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ19TdG9wX0lUKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKTsNCi0NCi0vKiBOb24tYmxvY2tpbmcgbW9kZTogRE1BICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ19TdGFydF9ETUEoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMsIHVpbnQzMl90ICpwRGF0YSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBMZW5ndGgpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfU3RvcF9ETUEoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpOw0KLQ0KLS8qIEFEQyByZXRyaWV2ZSBjb252ZXJzaW9uIHZhbHVlIGludGVuZGVkIHRvIGJlIHVzZWQgd2l0aCBwb2xsaW5nIG9yDQotICogaW50ZXJydXB0aW9uICovDQotdWludDMyX3QgSEFMX0FEQ19HZXRWYWx1ZShBRENfSGFuZGxlVHlwZURlZiAqaGFkYyk7DQotDQotLyogQURDIHNhbXBsaW5nIGNvbnRyb2wgKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDX1N0YXJ0U2FtcGxpbmcoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfU3RvcFNhbXBsaW5nKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKTsNCi0NCi0vKiBBREMgSVJRSGFuZGxlciBhbmQgQ2FsbGJhY2tzIHVzZWQgaW4gbm9uLWJsb2NraW5nIG1vZGVzIChJbnRlcnJ1cHRpb24gYW5kDQotICogRE1BKSAqLw0KLXZvaWQgSEFMX0FEQ19JUlFIYW5kbGVyKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKTsNCi12b2lkIEhBTF9BRENfQ29udkNwbHRDYWxsYmFjayhBRENfSGFuZGxlVHlwZURlZiAqaGFkYyk7DQotdm9pZCBIQUxfQURDX0NvbnZIYWxmQ3BsdENhbGxiYWNrKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKTsNCi12b2lkIEhBTF9BRENfTGV2ZWxPdXRPZldpbmRvd0NhbGxiYWNrKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKTsNCi12b2lkIEhBTF9BRENfRXJyb3JDYWxsYmFjayhBRENfSGFuZGxlVHlwZURlZiAqaGFkYyk7DQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGFkZHRvZ3JvdXAgQURDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucw0KLSAqICBAYnJpZWYgICAgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucw0KLSAqIEB7DQotICovDQotLyogUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDX0NvbmZpZ0NoYW5uZWwoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DaGFubmVsQ29uZlR5cGVEZWYgKnNDb25maWcpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfQW5hbG9nV0RHQ29uZmlnKA0KLSAgICBBRENfSGFuZGxlVHlwZURlZiAqaGFkYywgQURDX0FuYWxvZ1dER0NvbmZUeXBlRGVmICpBbmFsb2dXREdDb25maWcpOw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKiogQGFkZHRvZ3JvdXAgQURDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQNCi0gKiBAew0KLSAqLw0KLXVpbnQzMl90IEhBTF9BRENfR2V0U3RhdGUoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpOw0KLXVpbnQzMl90IEhBTF9BRENfR2V0RXJyb3IoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpOw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiBQcml2YXRlIGZ1bmN0aW9ucw0KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGFkZHRvZ3JvdXAgQURDX1ByaXZhdGVfRnVuY3Rpb25zIEFEQyBQcml2YXRlIEZ1bmN0aW9ucw0KLSAqIEB7DQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgQURDX0NvbnZlcnNpb25TdG9wKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDb252ZXJzaW9uR3JvdXApOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEFEQ19FbmFibGUoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEFEQ19EaXNhYmxlKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKTsNCi12b2lkIEFEQ19ETUFDb252Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7DQotdm9pZCBBRENfRE1BSGFsZkNvbnZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsNCi12b2lkIEFEQ19ETUFFcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotI2lmZGVmIF9fY3BsdXNwbHVzDQotfQ0KLSNlbmRpZg0KLQ0KLSNlbmRpZiAvKiBTVE0zMkc0eHhfSEFMX0FEQ19IICovDQorLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAZmlsZSAgICBzdG0zMmc0eHhfaGFsX2FkYy5oCisgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgQURDIEhBTCBtb2R1bGUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYXR0ZW50aW9uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0ZXJtcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlCisgKiBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb2Z0d2FyZSBjb21wb25lbnQuCisgKiBJZiBubyBMSUNFTlNFIGZpbGUgY29tZXMgd2l0aCB0aGlzIHNvZnR3YXJlLCBpdCBpcyBwcm92aWRlZCBBUy1JUy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJHNHh4X0hBTF9BRENfSAorI2RlZmluZSBTVE0zMkc0eHhfSEFMX0FEQ19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmc0eHhfaGFsX2RlZi5oIgorCisvKiBJbmNsdWRlIGxvdyBsZXZlbCBkcml2ZXIgKi8KKyNpbmNsdWRlICJzdG0zMmc0eHhfbGxfYWRjLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkc0eHhfSEFMX0RyaXZlcgorICogQHsKKyAqLworCisvKiogQGFkZHRvZ3JvdXAgQURDCisgKiBAeworICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEFEQ19FeHBvcnRlZF9UeXBlcyBBREMgRXhwb3J0ZWQgVHlwZXMKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgIEFEQyBncm91cCByZWd1bGFyIG92ZXJzYW1wbGluZyBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQzMl90CisgICAgICBSYXRpbzsgLyohPCBDb25maWd1cmVzIHRoZSBvdmVyc2FtcGxpbmcgcmF0aW8uCisgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ19IQUxfRUNfT1ZTX1JBVElPICovCisKKyAgdWludDMyX3QgUmlnaHRCaXRTaGlmdDsgLyohPCBDb25maWd1cmVzIHRoZSBkaXZpc2lvbiBjb2VmZmljaWVudCBmb3IgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE92ZXJzYW1wbGVyLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19IQUxfRUNfT1ZTX1NISUZUICovCisKKyAgdWludDMyX3QgVHJpZ2dlcmVkTW9kZTsgLyohPCBTZWxlY3RzIHRoZSByZWd1bGFyIHRyaWdnZXJlZCBvdmVyc2FtcGxpbmcgbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19IQUxfRUNfT1ZTX0RJU0NPTlRfTU9ERSAqLworCisgIHVpbnQzMl90IE92ZXJzYW1wbGluZ1N0b3BSZXNldDsgLyohPCBTZWxlY3RzIHRoZSByZWd1bGFyIG92ZXJzYW1wbGluZyBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG92ZXJzYW1wbGluZyBpcyBlaXRoZXIgdGVtcG9yYXJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcHBlZCBvciByZXNldCB1cG9uIGFuIGluamVjdGVkIHNlcXVlbmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0aW9uLiBJZiBvdmVyc2FtcGxpbmcgaXMgZW5hYmxlZCBvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdGggcmVndWxhciBhbmQgaW5qZWN0ZWQgZ3JvdXBzLCB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgaXMgZGlzY2FyZGVkIGFuZCBmb3JjZWQgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nICJBRENfUkVHT1ZFUlNBTVBMSU5HX1JFU1VNRURfTU9ERSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhlIG92ZXJzYW1wbGluZyBidWZmZXIgaXMgemVyb2VkIGR1cmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdGlvbiBzZXF1ZW5jZSkuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgdmFsdWUgb2YgQHJlZiBBRENfSEFMX0VDX09WU19TQ09QRV9SRUcgKi8KKworfSBBRENfT3ZlcnNhbXBsaW5nVHlwZURlZjsKKworLyoqCisgKiBAYnJpZWYgIFN0cnVjdHVyZSBkZWZpbml0aW9uIG9mIEFEQyBpbnN0YW5jZSBhbmQgQURDIGdyb3VwIHJlZ3VsYXIuCisgKiBAbm90ZSAgIFBhcmFtZXRlcnMgb2YgdGhpcyBzdHJ1Y3R1cmUgYXJlIHNoYXJlZCB3aXRoaW4gMiBzY29wZXM6CisgKiAgICAgICAgICAtIFNjb3BlIGVudGlyZSBBREMgKGFmZmVjdHMgQURDIGdyb3VwcyByZWd1bGFyIGFuZCBpbmplY3RlZCk6CisgKiBDbG9ja1ByZXNjYWxlciwgUmVzb2x1dGlvbiwgRGF0YUFsaWduLCBHYWluQ29tcGVuc2F0aW9uLCBTY2FuQ29udk1vZGUsCisgKiBFT0NTZWxlY3Rpb24sIExvd1Bvd2VyQXV0b1dhaXQuCisgKiAgICAgICAgICAtIFNjb3BlIEFEQyBncm91cCByZWd1bGFyOiBDb250aW51b3VzQ29udk1vZGUsIE5ick9mQ29udmVyc2lvbiwKKyAqIERpc2NvbnRpbnVvdXNDb252TW9kZSwgTmJyT2ZEaXNjQ29udmVyc2lvbiwgRXh0ZXJuYWxUcmlnQ29udiwKKyAqIEV4dGVybmFsVHJpZ0NvbnZFZGdlLCBETUFDb250aW51b3VzUmVxdWVzdHMsIE92ZXJydW4sIE92ZXJzYW1wbGluZ01vZGUsCisgKiBPdmVyc2FtcGxpbmcsIFNhbXBsaW5nTW9kZS4KKyAqIEBub3RlICAgVGhlIHNldHRpbmcgb2YgdGhlc2UgcGFyYW1ldGVycyBieSBmdW5jdGlvbiBIQUxfQURDX0luaXQoKSBpcworICogY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlLiBBREMgc3RhdGUgY2FuIGJlIGVpdGhlcjoKKyAqICAgICAgICAgIC0gRm9yIGFsbCBwYXJhbWV0ZXJzOiBBREMgZGlzYWJsZWQKKyAqICAgICAgICAgIC0gRm9yIGFsbCBwYXJhbWV0ZXJzIGV4Y2VwdCAnTG93UG93ZXJBdXRvV2FpdCcsCisgKiAnRE1BQ29udGludW91c1JlcXVlc3RzJyBhbmQgJ092ZXJzYW1wbGluZyc6IEFEQyBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbgorICogZ29pbmcgb24gZ3JvdXAgcmVndWxhci4KKyAqICAgICAgICAgIC0gRm9yIHBhcmFtZXRlcnMgJ0xvd1Bvd2VyQXV0b1dhaXQnIGFuZCAnRE1BQ29udGludW91c1JlcXVlc3RzJzogQURDCisgKiBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZyBvbiBncm91cHMgcmVndWxhciBhbmQgaW5qZWN0ZWQuIElmIEFEQyBpcworICogbm90IGluIHRoZSBhcHByb3ByaWF0ZSBzdGF0ZSB0byBtb2RpZnkgc29tZSBwYXJhbWV0ZXJzLCB0aGVzZSBwYXJhbWV0ZXJzCisgKiBzZXR0aW5nIGlzIGJ5cGFzc2VkIHdpdGhvdXQgZXJyb3IgcmVwb3J0aW5nIChhcyBpdCBjYW4gYmUgdGhlIGV4cGVjdGVkCisgKiBiZWhhdmlvciBpbiBjYXNlIG9mIGludGVuZGVkIGFjdGlvbiB0byB1cGRhdGUgYW5vdGhlciBwYXJhbWV0ZXIgKHdoaWNoCisgKiBmdWxmaWxscyB0aGUgQURDIHN0YXRlIGNvbmRpdGlvbikgb24gdGhlIGZseSkuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDMyX3QKKyAgICAgIENsb2NrUHJlc2NhbGVyOyAvKiE8IFNlbGVjdCBBREMgY2xvY2sgc291cmNlIChzeW5jaHJvbm91cyBjbG9jayBkZXJpdmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBBUEIgY2xvY2sgb3IgYXN5bmNocm9ub3VzIGNsb2NrIGRlcml2ZWQgZnJvbQorICAgICAgICAgICAgICAgICAgICAgICAgIHN5c3RlbSBjbG9jayBvciBQTEwgKFJlZmVyIHRvIHJlZmVyZW5jZSBtYW51YWwgZm9yIGxpc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICBvZiBjbG9ja3MgYXZhaWxhYmxlKSkgYW5kIGNsb2NrIHByZXNjYWxlci4gVGhpcworICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0hBTF9FQ19DT01NT05fQ0xPQ0tfU09VUkNFLiBOb3RlOiBUaGUgQURDIGNsb2NrCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBpcyBjb21tb24gdG8gYWxsIEFEQyBpbnN0YW5jZXMuIE5vdGU6IEluCisgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBvZiB1c2FnZSBvZiBjaGFubmVscyBvbiBpbmplY3RlZCBncm91cCwgQURDCisgICAgICAgICAgICAgICAgICAgICAgICAgZnJlcXVlbmN5IHNob3VsZCBiZSBsb3dlciB0aGFuIEFIQiBjbG9jayBmcmVxdWVuY3kgLzQKKyAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgcmVzb2x1dGlvbiAxMiBvciAxMCBiaXRzLCBBSEIgY2xvY2sgZnJlcXVlbmN5IC8zCisgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHJlc29sdXRpb24gOCBiaXRzLCBBSEIgY2xvY2sgZnJlcXVlbmN5IC8yIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24gNiBiaXRzLiBOb3RlOiBJbiBjYXNlIG9mIHN5bmNocm9ub3VzIGNsb2NrCisgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSBiYXNlZCBvbiBIQ0xLLzEsIHRoZSBjb25maWd1cmF0aW9uIG11c3QgYmUgZW5hYmxlZAorICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHkgaWYgdGhlIHN5c3RlbSBjbG9jayBoYXMgYSA1MCUgZHV0eSBjbG9jayBjeWNsZQorICAgICAgICAgICAgICAgICAgICAgICAgIChBUEIgcHJlc2NhbGVyIGNvbmZpZ3VyZWQgaW5zaWRlIFJDQyAgbXVzdCBiZSBieXBhc3NlZAorICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBQQ0xLIGNsb2NrIG11c3QgaGF2ZSA1MCUgZHV0eSBjeWNsZSkuIFJlZmVyIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlIG1hbnVhbCBmb3IgZGV0YWlscy4gTm90ZTogSW4gY2FzZSBvZiB1c2FnZSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jaHJvbm91cyBjbG9jaywgdGhlIHNlbGVjdGVkIGNsb2NrIG11c3QgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWxpbWluYXJpbHkgZW5hYmxlZCBhdCBSQ0MgdG9wIGxldmVsLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG1vZGlmaWVkIG9ubHkgaWYgYWxsIEFEQworICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlcyBhcmUgZGlzYWJsZWQuICovCisKKyAgdWludDMyX3QgUmVzb2x1dGlvbjsgLyohPCBDb25maWd1cmUgdGhlIEFEQyByZXNvbHV0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0hBTF9FQ19SRVNPTFVUSU9OICovCisKKyAgdWludDMyX3QgRGF0YUFsaWduOyAvKiE8IFNwZWNpZnkgQURDIGRhdGEgYWxpZ25tZW50IGluIGNvbnZlcnNpb24gZGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIChyaWdodCBvciBsZWZ0KS4gUmVmZXIgdG8gcmVmZXJlbmNlIG1hbnVhbCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbm1lbnRzIGZvcm1hdHMgdmVyc3VzIHJlc29sdXRpb25zLiBUaGlzIHBhcmFtZXRlcgorICAgICAgICAgICAgICAgICAgICAgICAgIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX0hBTF9FQ19EQVRBX0FMSUdOICovCisKKyAgdWludDMyX3QKKyAgICAgIEdhaW5Db21wZW5zYXRpb247IC8qITwgU3BlY2lmeSB0aGUgQURDIGdhaW4gY29tcGVuc2F0aW9uIGNvZWZmaWNpZW50IHRvIGJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWVkIHRvIEFEQyByYXcgY29udmVyc2lvbiBkYXRhLCBiYXNlZCBvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sbG93aW5nIGZvcm11bGE6IERBVEEgPSBEQVRBKHJhdykgKiAoZ2FpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGVuc2F0aW9uIGNvZWYpIC8gNDA5NiAiMi4xMiIgYml0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkOiAyIGJpdHMgZXhwb25lbnRzIC8gMTIgYml0cyBtYW50aXNzYSBHYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwIGlzIDEvNDA5NiA9IDAuMDAwMjQ0IEdhaW4gcmFuZ2UgaXMgMC4wMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0byAzLjk5OTc1NiBUaGlzIHBhcmFtZXRlciB2YWx1ZSBjYW4gYmUgMCBHYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wZW5zYXRpb24gd2lsbCBiZSBkaXNhYmxlZCBhbmQgY29lZmZpY2llbnQgc2V0IHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAwIDEgLT4gMHgzRkZGIEdhaW4gY29tcGVuc2F0aW9uIHdpbGwgYmUgZW5hYmxlZCBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZmaWNpZW50IHNldCB0byBzcGVjaWZpZWQgdmFsdWUgTm90ZTogR2FpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGVuc2F0aW9uIHdoZW4gZW5hYmxlZCBpcyBhcHBsaWVkIHRvIGFsbCBjaGFubmVscy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIHVpbnQzMl90CisgICAgICBTY2FuQ29udk1vZGU7IC8qITwgQ29uZmlndXJlIHRoZSBzZXF1ZW5jZXIgb2YgQURDIGdyb3VwcyByZWd1bGFyIGFuZAorICAgICAgICAgICAgICAgICAgICAgICBpbmplY3RlZC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFzc29jaWF0ZWQgdG8gcGFyYW1ldGVyCisgICAgICAgICAgICAgICAgICAgICAgICdEaXNjb250aW51b3VzQ29udk1vZGUnIHRvIGhhdmUgbWFpbiBzZXF1ZW5jZSBzdWJkaXZpZGVkCisgICAgICAgICAgICAgICAgICAgICAgIGluIHN1Y2Nlc3NpdmUgcGFydHMuIElmIGRpc2FibGVkOiBDb252ZXJzaW9uIGlzIHBlcmZvcm1lZAorICAgICAgICAgICAgICAgICAgICAgICBpbiBzaW5nbGUgbW9kZSAob25lIGNoYW5uZWwgY29udmVydGVkLCB0aGUgb25lIGRlZmluZWQgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgcmFuayAxKS4gUGFyYW1ldGVycyAnTmJyT2ZDb252ZXJzaW9uJyBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0luamVjdGVkTmJyT2ZDb252ZXJzaW9uJyBhcmUgZGlzY2FyZGVkCisgICAgICAgICAgICAgICAgICAgICAgIChlcXVpdmFsZW50IHRvIHNldCB0byAxKS4gSWYgZW5hYmxlZDogIENvbnZlcnNpb25zIGFyZQorICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtZWQgaW4gc2VxdWVuY2UgbW9kZSAobXVsdGlwbGUgcmFua3MgZGVmaW5lZCBieQorICAgICAgICAgICAgICAgICAgICAgICAnTmJyT2ZDb252ZXJzaW9uJyBvciAnSW5qZWN0ZWROYnJPZkNvbnZlcnNpb24nIGFuZCByYW5rCisgICAgICAgICAgICAgICAgICAgICAgIG9mIGVhY2ggY2hhbm5lbCBpbiBzZXF1ZW5jZXIpLiBTY2FuIGRpcmVjdGlvbiBpcyB1cHdhcmQ6CisgICAgICAgICAgICAgICAgICAgICAgIGZyb20gcmFuayAxIHRvIHJhbmsgJ24nLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZgorICAgICAgICAgICAgICAgICAgICAgICBAcmVmIEFEQ19TY2FuX21vZGUgKi8KKworICB1aW50MzJfdAorICAgICAgRU9DU2VsZWN0aW9uOyAvKiE8IFNwZWNpZnkgd2hpY2ggRU9DIChFbmQgT2YgQ29udmVyc2lvbikgZmxhZyBpcyB1c2VkIGZvcgorICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9uIGJ5IHBvbGxpbmcgYW5kIGludGVycnVwdGlvbjogZW5kIG9mIHVuaXRhcnkKKyAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbiBvciBlbmQgb2Ygc2VxdWVuY2UgY29udmVyc2lvbnMuIFRoaXMgcGFyYW1ldGVyCisgICAgICAgICAgICAgICAgICAgICAgIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX0VPQ1NlbGVjdGlvbi4gKi8KKworICBGdW5jdGlvbmFsU3RhdGUKKyAgICAgIExvd1Bvd2VyQXV0b1dhaXQ7IC8qITwgU2VsZWN0IHRoZSBkeW5hbWljIGxvdyBwb3dlciBBdXRvIERlbGF5OiBuZXcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb24gc3RhcnQgb25seSB3aGVuIHRoZSBwcmV2aW91cyBjb252ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9yIEFEQyBncm91cCByZWd1bGFyKSBvciBwcmV2aW91cyBzZXF1ZW5jZSAoZm9yIEFEQworICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgaW5qZWN0ZWQpIGhhcyBiZWVuIHJldHJpZXZlZCBieSB1c2VyIHNvZnR3YXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgZnVuY3Rpb24gSEFMX0FEQ19HZXRWYWx1ZSgpIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDRXhfSW5qZWN0ZWRHZXRWYWx1ZSgpLiBUaGlzIGZlYXR1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgYWRhcHRzIHRoZSBmcmVxdWVuY3kgb2YgQURDIGNvbnZlcnNpb25zCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VycyB0byB0aGUgc3BlZWQgb2YgdGhlIHN5c3RlbSB0aGF0IHJlYWRzIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS4gTW9yZW92ZXIsIHRoaXMgYXZvaWRzIHJpc2sgb2Ygb3ZlcnJ1biBmb3IgbG93CisgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVxdWVuY3kgYXBwbGljYXRpb25zLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgc2V0IHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkFCTEUgb3IgRElTQUJMRS4gTm90ZTogSXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIHVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBpbnRlcnJ1cHRpb24gb3IgRE1BIChIQUxfQURDX1N0YXJ0X0lUKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1N0YXJ0X0RNQSgpKSBzaW5jZSB0aGVzZSBtb2RlcyBoYXZlIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhciBpbW1lZGlhdGVseSB0aGUgRU9DIGZsYWcgKGJ5IENQVSB0byBmcmVlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVJRIHBlbmRpbmcgZXZlbnQgb3IgYnkgRE1BKS4gQXV0byB3YWl0IHdpbGwgd29yayBidXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcnQgYSB2ZXJ5IHNob3J0IHRpbWUsIGRpc2NhcmRpbmcgaXRzIGludGVuZGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZW5lZml0IChleGNlcHQgc3BlY2lmaWMgY2FzZSBvZiBoaWdoIGxvYWQgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENQVSBvciBETUEgdHJhbnNmZXJzIHdoaWNoIGNhbiBqdXN0aWZ5IHVzYWdlIG9mIGF1dG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXQpLiBEbyB1c2Ugd2l0aCBwb2xsaW5nOiAxLiBTdGFydCBjb252ZXJzaW9uIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU3RhcnQoKSwgMi4gTGF0ZXIgb24sIHdoZW4gQURDIGNvbnZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgaXMgbmVlZGVkOiB1c2UgSEFMX0FEQ19Qb2xsRm9yQ29udmVyc2lvbigpIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnN1cmUgdGhhdCBjb252ZXJzaW9uIGlzIGNvbXBsZXRlZCBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfR2V0VmFsdWUoKSB0byByZXRyaWV2ZSBjb252ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgYW5kIHRyaWcgYW5vdGhlciBjb252ZXJzaW9uIHN0YXJ0LiAoaW4gY2FzZSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2Ugb2YgQURDIGdyb3VwIGluamVjdGVkLCB1c2UgdGhlIGVxdWl2YWxlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9ucyBIQUxfQURDRXhJbmplY3RlZF9TdGFydCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ0V4X0luamVjdGVkR2V0VmFsdWUoKSwgLi4uKS4gKi8KKworICBGdW5jdGlvbmFsU3RhdGUKKyAgICAgIENvbnRpbnVvdXNDb252TW9kZTsgLyohPCBTcGVjaWZ5IHdoZXRoZXIgdGhlIGNvbnZlcnNpb24gaXMgcGVyZm9ybWVkIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmdsZSBtb2RlIChvbmUgY29udmVyc2lvbikgb3IgY29udGludW91cyBtb2RlIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREMgZ3JvdXAgcmVndWxhciwgYWZ0ZXIgdGhlIGZpcnN0IEFEQyBjb252ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgdHJpZ2dlciBvY2N1cnJlZCAoc29mdHdhcmUgc3RhcnQgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWwgdHJpZ2dlcikuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBzZXQgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5BQkxFIG9yIERJU0FCTEUuICovCisKKyAgdWludDMyX3QKKyAgICAgIE5ick9mQ29udmVyc2lvbjsgLyohPCBTcGVjaWZ5IHRoZSBudW1iZXIgb2YgcmFua3MgdGhhdCB3aWxsIGJlIGNvbnZlcnRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoaW4gdGhlIHJlZ3VsYXIgZ3JvdXAgc2VxdWVuY2VyLiBUaGlzIHBhcmFtZXRlciBpcworICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbnQgb24gU2NhbkNvbnZNb2RlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHNlcXVlbmNlciBjb25maWd1cmVkIHRvIGZ1bGx5IGNvbmZpZ3VyYWJsZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIgb2YgcmFua3MgaW4gdGhlIHNjYW4gc2VxdWVuY2UgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlIHVzaW5nIHRoaXMgcGFyYW1ldGVyLiBOb3RlOiBBZnRlciB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgY2FsbCBvZiAnSEFMX0FEQ19Jbml0KCknLCBlYWNoIHJhbmsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZGluZyB0byBwYXJhbWV0ZXIgIk5ick9mQ29udmVyc2lvbiIgbXVzdCBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgdXNpbmcgJ0hBTF9BRENfQ29uZmlnQ2hhbm5lbCgpJy4gQWZ0ZXJ3YXJkcywgd2hlbgorICAgICAgICAgICAgICAgICAgICAgICAgICBhbGwgbmVlZGVkIHNlcXVlbmNlciByYW5rcyBhcmUgc2V0LCBwYXJhbWV0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTmJyT2ZDb252ZXJzaW9uJyBjYW4gYmUgdXBkYXRlZCB3aXRob3V0CisgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmeWluZyBjb25maWd1cmF0aW9uIG9mIHNlcXVlbmNlciByYW5rcyAoc2VxdWVuY2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmtzIGFib3ZlICdOYnJPZkNvbnZlcnNpb24nIGFyZSBkaXNjYXJkZWQpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHNlcXVlbmNlciBjb25maWd1cmVkIHRvIG5vdCBmdWxseSBjb25maWd1cmFibGU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIHJhbmtzIGluIHRoZSBzY2FuIHNlcXVlbmNlIGlzIGRlZmluZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgbnVtYmVyIG9mIGNoYW5uZWxzIHNldCBpbiB0aGUgc2VxdWVuY2UuIFRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIGlzIGRpc2NhcmRlZC4gVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhCisgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMSBhbmQgTWF4X0RhdGEgPSA4LiBOb3RlOgorICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIG1vZGlmaWVkIHdoZW4gbm8gY29udmVyc2lvbiBpcworICAgICAgICAgICAgICAgICAgICAgICAgICBvbiBnb2luZyBvbiByZWd1bGFyIGdyb3VwIChBREMgZGlzYWJsZWQsIG9yIEFEQworICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkIHdpdGhvdXQgY29udGludW91cyBtb2RlIG9yIGV4dGVybmFsIHRyaWdnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBjb3VsZCBsYXVuY2ggYSBjb252ZXJzaW9uKS4gKi8KKworICBGdW5jdGlvbmFsU3RhdGUKKyAgICAgIERpc2NvbnRpbnVvdXNDb252TW9kZTsgLyohPCBTcGVjaWZ5IHdoZXRoZXIgdGhlIGNvbnZlcnNpb25zIHNlcXVlbmNlIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQyBncm91cCByZWd1bGFyIGlzIHBlcmZvcm1lZCBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wbGV0ZS1zZXF1ZW5jZS9EaXNjb250aW51b3VzLXNlcXVlbmNlIChtYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlIHN1YmRpdmlkZWQgaW4gc3VjY2Vzc2l2ZSBwYXJ0cykuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzY29udGludW91cyBtb2RlIGlzIHVzZWQgb25seSBpZiBzZXF1ZW5jZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgZW5hYmxlZCAocGFyYW1ldGVyICdTY2FuQ29udk1vZGUnKS4gSWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VyIGlzIGRpc2FibGVkLCB0aGlzIHBhcmFtZXRlciBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNjYXJkZWQuIERpc2NvbnRpbnVvdXMgbW9kZSBjYW4gYmUgZW5hYmxlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5IGlmIGNvbnRpbnVvdXMgbW9kZSBpcyBkaXNhYmxlZC4gSWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludW91cyBtb2RlIGlzIGVuYWJsZWQsIHRoaXMgcGFyYW1ldGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmcgaXMgZGlzY2FyZGVkLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIEVOQUJMRSBvciBESVNBQkxFLiBOb3RlOiBPbiB0aGlzIFNUTTMyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmllcywgQURDIGdyb3VwIHJlZ3VsYXIgbnVtYmVyIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NvbnRpbnVvdXMgcmFua3MgaW5jcmVtZW50IGlzIGZpeGVkIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZS1ieS1vbmUuICovCisKKyAgdWludDMyX3QKKyAgICAgIE5ick9mRGlzY0NvbnZlcnNpb247IC8qITwgU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgZGlzY29udGludW91cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbnMgaW4gd2hpY2ggdGhlIG1haW4gc2VxdWVuY2Ugb2YgQURDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cCByZWd1bGFyIChwYXJhbWV0ZXIgTmJyT2ZDb252ZXJzaW9uKSB3aWxsIGJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJkaXZpZGVkLiBJZiBwYXJhbWV0ZXIgJ0Rpc2NvbnRpbnVvdXNDb252TW9kZScKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGRpc2FibGVkLCB0aGlzIHBhcmFtZXRlciBpcyBkaXNjYXJkZWQuIFRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgTWF4X0RhdGEgPSA4LiAqLworCisgIHVpbnQzMl90IEV4dGVybmFsVHJpZ0NvbnY7IC8qITwgU2VsZWN0IHRoZSBleHRlcm5hbCBldmVudCBzb3VyY2UgdXNlZCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyIEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gc3RhcnQuIElmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCB0byBBRENfU09GVFdBUkVfU1RBUlQsIGV4dGVybmFsIHRyaWdnZXJzIGFyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZCBhbmQgc29mdHdhcmUgdHJpZ2dlciBpcyB1c2VkIGluc3RlYWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfcmVndWxhcl9leHRlcm5hbF90cmlnZ2VyX3NvdXJjZS4gQ2F1dGlvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWwgdHJpZ2dlciBzb3VyY2UgaXMgY29tbW9uIHRvIGFsbCBBREMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VzLiAqLworCisgIHVpbnQzMl90IEV4dGVybmFsVHJpZ0NvbnZFZGdlOyAvKiE8IFNlbGVjdCB0aGUgZXh0ZXJuYWwgZXZlbnQgZWRnZSB1c2VkIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyIEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgdHJpZ2dlciBzb3VyY2UgaXMgc2V0IHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfU09GVFdBUkVfU1RBUlQsIHRoaXMgcGFyYW1ldGVyIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNjYXJkZWQuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIEFEQ19yZWd1bGFyX2V4dGVybmFsX3RyaWdnZXJfZWRnZSAqLworCisgIHVpbnQzMl90IFNhbXBsaW5nTW9kZTsgLyohPCBTZWxlY3QgdGhlIHNhbXBsaW5nIG1vZGUgdG8gYmUgdXNlZCBmb3IgQURDIGdyb3VwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVndWxhciBjb252ZXJzaW9uLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgQURDX3JlZ3VsYXJfc2FtcGxpbmdfbW9kZSAqLworCisgIEZ1bmN0aW9uYWxTdGF0ZQorICAgICAgRE1BQ29udGludW91c1JlcXVlc3RzOyAvKiE8IFNwZWNpZnkgd2hldGhlciB0aGUgRE1BIHJlcXVlc3RzIGFyZSBwZXJmb3JtZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gb25lIHNob3QgbW9kZSAoRE1BIHRyYW5zZmVyIHN0b3BzIHdoZW4gbnVtYmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIGNvbnZlcnNpb25zIGlzIHJlYWNoZWQpIG9yIGluIGNvbnRpbnVvdXMgbW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRE1BIHRyYW5zZmVyIHVubGltaXRlZCwgd2hhdGV2ZXIgbnVtYmVyIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb25zKS4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHNldCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkFCTEUgb3IgRElTQUJMRS4gTm90ZTogSW4gY29udGludW91cyBtb2RlLCBETUEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVzdCBiZSBjb25maWd1cmVkIGluIGNpcmN1bGFyIG1vZGUuIE90aGVyd2lzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbiBvdmVycnVuIHdpbGwgYmUgdHJpZ2dlcmVkIHdoZW4gRE1BIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhpbXVtIHBvaW50ZXIgaXMgcmVhY2hlZC4gKi8KKworICB1aW50MzJfdAorICAgICAgT3ZlcnJ1bjsgLyohPCBTZWxlY3QgdGhlIGJlaGF2aW9yIGluIGNhc2Ugb2Ygb3ZlcnJ1bjogZGF0YSBvdmVyd3JpdHRlbiBvcgorICAgICAgICAgICAgICAgICAgcHJlc2VydmVkIChkZWZhdWx0KS4gVGhpcyBwYXJhbWV0ZXIgYXBwbGllcyB0byBBREMgZ3JvdXAKKyAgICAgICAgICAgICAgICAgIHJlZ3VsYXIgb25seS4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgQURDX0hBTF9FQ19SRUdfT1ZSX0RBVEFfQkVIQVZJT1IuIE5vdGU6IEluIGNhc2Ugb2Ygb3ZlcnJ1biBzZXQKKyAgICAgICAgICAgICAgICAgIHRvIGRhdGEgcHJlc2VydmVkIGFuZCB1c2FnZSB3aXRoIHByb2dyYW1taW5nIG1vZGVsIHdpdGgKKyAgICAgICAgICAgICAgICAgIGludGVycnVwdGlvbiAoSEFMX1N0YXJ0X0lUKCkpOiBBREMgSVJRIGhhbmRsZXIgaGFzIHRvIGNsZWFyCisgICAgICAgICAgICAgICAgICBlbmQgb2YgY29udmVyc2lvbiBmbGFncywgdGhpcyBpbmR1Y2VzIHRoZSByZWxlYXNlIG9mIHRoZQorICAgICAgICAgICAgICAgICAgcHJlc2VydmVkIGRhdGEuIElmIG5lZWRlZCwgdGhpcyBkYXRhIGNhbiBiZSBzYXZlZCBpbiBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgSEFMX0FEQ19Db252Q3BsdENhbGxiYWNrKCksIHBsYWNlZCBpbiB1c2VyIHByb2dyYW0gY29kZQorICAgICAgICAgICAgICAgICAgKGNhbGxlZCBiZWZvcmUgZW5kIG9mIGNvbnZlcnNpb24gZmxhZ3MgY2xlYXIpIE5vdGU6IEVycm9yCisgICAgICAgICAgICAgICAgICByZXBvcnRpbmcgd2l0aCByZXNwZWN0IHRvIHRoZSBjb252ZXJzaW9uIG1vZGU6CisgICAgICAgICAgICAgICAgICAgICAgICAgIC0gVXNhZ2Ugd2l0aCBBREMgY29udmVyc2lvbiBieSBwb2xsaW5nIGZvciBldmVudCBvcgorICAgICAgICAgICAgICAgICAgaW50ZXJydXB0aW9uOiBFcnJvciBpcyByZXBvcnRlZCBvbmx5IGlmIG92ZXJydW4gaXMgc2V0IHRvIGRhdGEKKyAgICAgICAgICAgICAgICAgIHByZXNlcnZlZC4gSWYgb3ZlcnJ1biBpcyBzZXQgdG8gZGF0YSBvdmVyd3JpdHRlbiwgdXNlciBjYW4KKyAgICAgICAgICAgICAgICAgIHdpbGxpbmdseSBub3QgcmVhZCBhbGwgdGhlIGNvbnZlcnRlZCBkYXRhLCB0aGlzIGlzIG5vdAorICAgICAgICAgICAgICAgICAgY29uc2lkZXJlZCBhcyBhbiBlcnJvbmVvdXMgY2FzZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgLSBVc2FnZSB3aXRoIEFEQyBjb252ZXJzaW9uIGJ5IERNQTogRXJyb3IgaXMgcmVwb3J0ZWQKKyAgICAgICAgICAgICAgICAgIHdoYXRldmVyIG92ZXJydW4gc2V0dGluZyAoRE1BIGlzIGV4cGVjdGVkIHRvIHByb2Nlc3MgYWxsIGRhdGEKKyAgICAgICAgICAgICAgICAgIGZyb20gZGF0YSByZWdpc3RlcikuICovCisKKyAgRnVuY3Rpb25hbFN0YXRlCisgICAgICBPdmVyc2FtcGxpbmdNb2RlOyAvKiE8IFNwZWNpZnkgd2hldGhlciB0aGUgb3ZlcnNhbXBsaW5nIGZlYXR1cmUgaXMgZW5hYmxlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgZGlzYWJsZWQuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBzZXQgdG8gRU5BQkxFIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICBESVNBQkxFLiBOb3RlOiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgbW9kaWZpZWQgb25seSBpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gY29udmVyc2lvbiBpcyBvbmdvaW5nIG9uIEFEQyBncm91cHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ3VsYXIgYW5kIGluamVjdGVkICovCisKKyAgQURDX092ZXJzYW1wbGluZ1R5cGVEZWYKKyAgICAgIE92ZXJzYW1wbGluZzsgLyohPCBTcGVjaWZ5IHRoZSBPdmVyc2FtcGxpbmcgcGFyYW1ldGVycy4KKyAgICAgICAgICAgICAgICAgICAgICAgICBDYXV0aW9uOiB0aGlzIHNldHRpbmcgb3ZlcndyaXRlcyB0aGUgcHJldmlvdXMKKyAgICAgICAgICAgICAgICAgICAgICAgb3ZlcnNhbXBsaW5nIGNvbmZpZ3VyYXRpb24gaWYgb3ZlcnNhbXBsaW5nIGlzIGFscmVhZHkKKyAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZC4gKi8KKworfSBBRENfSW5pdFR5cGVEZWY7CisKKy8qKgorICogQGJyaWVmICBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBvZiBBREMgY2hhbm5lbCBmb3IgcmVndWxhciBncm91cAorICogQG5vdGUgICBUaGUgc2V0dGluZyBvZiB0aGVzZSBwYXJhbWV0ZXJzIGJ5IGZ1bmN0aW9uIEhBTF9BRENfQ29uZmlnQ2hhbm5lbCgpCisgKiBpcyBjb25kaXRpb25lZCB0byBBREMgc3RhdGUuIEFEQyBzdGF0ZSBjYW4gYmUgZWl0aGVyOgorICogICAgICAgICAgLSBGb3IgYWxsIHBhcmFtZXRlcnM6IEFEQyBkaXNhYmxlZCAodGhpcyBpcyB0aGUgb25seSBwb3NzaWJsZSBBREMKKyAqIHN0YXRlIHRvIG1vZGlmeSBwYXJhbWV0ZXIgJ1NpbmdsZURpZmYnKQorICogICAgICAgICAgLSBGb3IgYWxsIGV4Y2VwdCBwYXJhbWV0ZXJzICdTYW1wbGluZ1RpbWUnLCAnT2Zmc2V0JywKKyAqICdPZmZzZXROdW1iZXInOiBBREMgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcgb24gcmVndWxhciBncm91cC4KKyAqICAgICAgICAgIC0gRm9yIHBhcmFtZXRlcnMgJ1NhbXBsaW5nVGltZScsICdPZmZzZXQnLCAnT2Zmc2V0TnVtYmVyJzogQURDCisgKiBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZyBvbiByZWd1bGFyIGFuZCBpbmplY3RlZCBncm91cHMuIElmIEFEQyBpcworICogbm90IGluIHRoZSBhcHByb3ByaWF0ZSBzdGF0ZSB0byBtb2RpZnkgc29tZSBwYXJhbWV0ZXJzLCB0aGVzZSBwYXJhbWV0ZXJzCisgKiBzZXR0aW5nIGlzIGJ5cGFzc2VkIHdpdGhvdXQgZXJyb3IgcmVwb3J0aW5nIChhcyBpdCBjYW4gYmUgdGhlIGV4cGVjdGVkCisgKiBiZWhhdmlvciBpbiBjYXNlIG9mIGludGVuZGVkIGFjdGlvbiB0byB1cGRhdGUgYW5vdGhlciBwYXJhbWV0ZXIgKHdoaWNoCisgKiBmdWxmaWxscyB0aGUgQURDIHN0YXRlIGNvbmRpdGlvbikgb24gdGhlIGZseSkuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDMyX3QKKyAgICAgIENoYW5uZWw7IC8qITwgU3BlY2lmeSB0aGUgY2hhbm5lbCB0byBjb25maWd1cmUgaW50byBBREMgcmVndWxhciBncm91cC4KKyAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBBRENfSEFMX0VDX0NIQU5ORUwKKyAgICAgICAgICAgICAgICAgICAgTm90ZTogRGVwZW5kaW5nIG9uIGRldmljZXMgYW5kIEFEQyBpbnN0YW5jZXMsIHNvbWUgY2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgIG1heSBub3QgYmUgYXZhaWxhYmxlIG9uIGRldmljZSBwYWNrYWdlIHBpbnMuIFJlZmVyIHRvIGRldmljZQorICAgICAgICAgICAgICAgICAgZGF0YXNoZWV0IGZvciBjaGFubmVscyBhdmFpbGFiaWxpdHkuICovCisKKyAgdWludDMyX3QKKyAgICAgIFJhbms7IC8qITwgU3BlY2lmeSB0aGUgcmFuayBpbiB0aGUgcmVndWxhciBncm91cCBzZXF1ZW5jZXIuCisgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX0hBTF9FQ19SRUdfU0VRX1JBTktTCisgICAgICAgICAgICAgICAgIE5vdGU6IHRvIGRpc2FibGUgYSBjaGFubmVsIG9yIGNoYW5nZSBvcmRlciBvZiBjb252ZXJzaW9uCisgICAgICAgICAgICAgICBzZXF1ZW5jZXIsIHJhbmsgY29udGFpbmluZyBhIHByZXZpb3VzIGNoYW5uZWwgc2V0dGluZyBjYW4gYmUKKyAgICAgICAgICAgICAgIG92ZXJ3cml0dGVuIGJ5IHRoZSBuZXcgY2hhbm5lbCBzZXR0aW5nIChvciBwYXJhbWV0ZXIgbnVtYmVyIG9mCisgICAgICAgICAgICAgICBjb252ZXJzaW9ucyBhZGp1c3RlZCkgKi8KKworICB1aW50MzJfdAorICAgICAgU2FtcGxpbmdUaW1lOyAvKiE8IFNhbXBsaW5nIHRpbWUgdmFsdWUgdG8gYmUgc2V0IGZvciB0aGUgc2VsZWN0ZWQgY2hhbm5lbC4KKyAgICAgICAgICAgICAgICAgICAgICAgICBVbml0OiBBREMgY2xvY2sgY3ljbGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVyc2lvbiB0aW1lIGlzIHRoZSBhZGRpdGlvbiBvZiBzYW1wbGluZyB0aW1lIGFuZAorICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzaW5nIHRpbWUgKDEyLjUgQURDIGNsb2NrIGN5Y2xlcyBhdCBBREMgcmVzb2x1dGlvbgorICAgICAgICAgICAgICAgICAgICAgICAxMiBiaXRzLCAxMC41IGN5Y2xlcyBhdCAxMCBiaXRzLCA4LjUgY3ljbGVzIGF0IDgKKyAgICAgICAgICAgICAgICAgICAgICAgYml0cywgNi41IGN5Y2xlcyBhdCA2IGJpdHMpLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYQorICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBvZiBAcmVmIEFEQ19IQUxfRUNfQ0hBTk5FTF9TQU1QTElOR1RJTUUgQ2F1dGlvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgYXBwbGllcyB0byBhIGNoYW5uZWwgdGhhdCBjYW4gYmUgdXNlZCBpbnRvCisgICAgICAgICAgICAgICAgICAgICAgIHJlZ3VsYXIgYW5kL29yIGluamVjdGVkIGdyb3VwLiBJdCBvdmVyd3JpdGVzIHRoZSBsYXN0CisgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmcuIE5vdGU6IEluIGNhc2Ugb2YgdXNhZ2Ugb2YgaW50ZXJuYWwgbWVhc3VyZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMgKFZyZWZJbnQsIFZiYXQsIC4uLiksIHNhbXBsaW5nIHRpbWUgY29uc3RyYWludHMKKyAgICAgICAgICAgICAgICAgICAgICAgbXVzdCBiZSByZXNwZWN0ZWQgKHNhbXBsaW5nIHRpbWUgY2FuIGJlIGFkanVzdGVkIGluCisgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG9mIEFEQyBjbG9jayBmcmVxdWVuY3kgYW5kIHNhbXBsaW5nIHRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZykuIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIHRpbWluZ3MgdmFsdWVzLgorICAgICAgICAgICAgICAgICAgICAgKi8KKworICB1aW50MzJfdCBTaW5nbGVEaWZmOyAvKiE8IFNlbGVjdCBzaW5nbGUtZW5kZWQgb3IgZGlmZmVyZW50aWFsIGlucHV0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluIGRpZmZlcmVudGlhbCBtb2RlOiBEaWZmZXJlbnRpYWwgbWVhc3VyZW1lbnQgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FycmllZCBvdXQgYmV0d2VlbiB0aGUgc2VsZWN0ZWQgY2hhbm5lbCAnaScgKHBvc2l0aXZlCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KSBhbmQgY2hhbm5lbCAnaSsxJyAobmVnYXRpdmUgaW5wdXQpLiBPbmx5CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgJ2knIGhhcyB0byBiZSBjb25maWd1cmVkLCBjaGFubmVsICdpKzEnIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZWQgYXV0b21hdGljYWxseSBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgb2YgQHJlZiBBRENfSEFMX0VDX0NIQU5ORUxfU0lOR0xFX0RJRkZfRU5ESU5HCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2F1dGlvbjogVGhpcyBwYXJhbWV0ZXIgYXBwbGllcyB0byBhIGNoYW5uZWwgdGhhdAorICAgICAgICAgICAgICAgICAgICAgICAgICBjYW4gYmUgdXNlZCBpbiBhIHJlZ3VsYXIgYW5kL29yIGluamVjdGVkIGdyb3VwLiBJdAorICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyd3JpdGVzIHRoZSBsYXN0IHNldHRpbmcuIE5vdGU6IFJlZmVyIHRvIFJlZmVyZW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgICBNYW51YWwgdG8gZW5zdXJlIHRoZSBzZWxlY3RlZCBjaGFubmVsIGlzIGF2YWlsYWJsZSBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVudGlhbCBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IFdoZW4gY29uZmlndXJpbmcgYSBjaGFubmVsICdpJyBpbiBkaWZmZXJlbnRpYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSwgdGhlIGNoYW5uZWwgJ2krMScgaXMgbm90IHVzYWJsZSBzZXBhcmF0ZWx5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgbW9kaWZpZWQgd2hlbiBBREMgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQgKGJlZm9yZSBBREMgc3RhcnQgY29udmVyc2lvbiBvciBhZnRlciBBREMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcCBjb252ZXJzaW9uKS4gSWYgQURDIGlzIGVuYWJsZWQsIHRoaXMgcGFyYW1ldGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmcgaXMgYnlwYXNzZWQgd2l0aG91dCBlcnJvciByZXBvcnRpbmcgKGFzIGl0IGNhbgorICAgICAgICAgICAgICAgICAgICAgICAgICBiZSB0aGUgZXhwZWN0ZWQgYmVoYXZpb3IgaW4gY2FzZSBvZiBhbm90aGVyIHBhcmFtZXRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZSBvbiB0aGUgZmx5KSAqLworCisgIHVpbnQzMl90IE9mZnNldE51bWJlcjsgLyohPCBTZWxlY3QgdGhlIG9mZnNldCBudW1iZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfSEFMX0VDX09GRlNFVF9OQiBDYXV0aW9uOiBPbmx5IG9uZSBvZmZzZXQgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkIHBlciBjaGFubmVsLiBUaGlzIHBhcmFtZXRlciBvdmVyd3JpdGVzIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCBzZXR0aW5nLiAqLworCisgIHVpbnQzMl90CisgICAgICBPZmZzZXQ7IC8qITwgRGVmaW5lIHRoZSBvZmZzZXQgdG8gYmUgYXBwbGllZCBvbiB0aGUgcmF3IGNvbnZlcnRlZCBkYXRhLgorICAgICAgICAgICAgICAgICAgIE9mZnNldCB2YWx1ZSBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyLgorICAgICAgICAgICAgICAgICAgIERlcGVuZGluZyBvZiBBREMgcmVzb2x1dGlvbiBzZWxlY3RlZCAoMTIsIDEwLCA4IG9yIDYgYml0cyksCisgICAgICAgICAgICAgICAgIHRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MDAwIGFuZAorICAgICAgICAgICAgICAgICBNYXhfRGF0YSA9IDB4RkZGLCAweDNGRiwgMHhGRiBvciAweDNGIHJlc3BlY3RpdmVseS4gTm90ZTogVGhpcworICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgbXVzdCBiZSBtb2RpZmllZCB3aGVuIG5vIGNvbnZlcnNpb24gaXMgb24gZ29pbmcgb24KKyAgICAgICAgICAgICAgICAgYm90aCByZWd1bGFyIGFuZCBpbmplY3RlZCBncm91cHMgKEFEQyBkaXNhYmxlZCwgb3IgQURDIGVuYWJsZWQKKyAgICAgICAgICAgICAgICAgd2l0aG91dCBjb250aW51b3VzIG1vZGUgb3IgZXh0ZXJuYWwgdHJpZ2dlciB0aGF0IGNvdWxkIGxhdW5jaCBhCisgICAgICAgICAgICAgICAgIGNvbnZlcnNpb24pLiAqLworCisgIHVpbnQzMl90CisgICAgICBPZmZzZXRTaWduOyAvKiE8IERlZmluZSBpZiB0aGUgb2Zmc2V0IHNob3VsZCBiZSBzdWJ0cmFjdGVkIChuZWdhdGl2ZSBzaWduKQorICAgICAgICAgICAgICAgICAgICAgb3IgYWRkZWQgKHBvc2l0aXZlIHNpZ24pIGZyb20gb3IgdG8gdGhlIHJhdyBjb252ZXJ0ZWQgZGF0YS4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDRXhfT2Zmc2V0U2lnbi4KKyAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgbW9kaWZpZWQgd2hlbiBubyBjb252ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgICBpcyBvbiBnb2luZyBvbiBib3RoIHJlZ3VsYXIgYW5kIGluamVjdGVkIGdyb3VwcyAoQURDCisgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZCwgb3IgQURDIGVuYWJsZWQgd2l0aG91dCBjb250aW51b3VzIG1vZGUgb3IKKyAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsIHRyaWdnZXIgdGhhdCBjb3VsZCBsYXVuY2ggYSBjb252ZXJzaW9uKS4qLworICBGdW5jdGlvbmFsU3RhdGUKKyAgICAgIE9mZnNldFNhdHVyYXRpb247IC8qITwgRGVmaW5lIGlmIHRoZSBvZmZzZXQgc2hvdWxkIGJlIHNhdHVyYXRlZCB1cG9uIHVuZGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIG92ZXIgZmxvdy4gVGhpcyBwYXJhbWV0ZXIgdmFsdWUgY2FuIGJlIEVOQUJMRSBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICBESVNBQkxFLiBOb3RlOiBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIG1vZGlmaWVkIHdoZW4gbm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbiBpcyBvbiBnb2luZyBvbiBib3RoIHJlZ3VsYXIgYW5kIGluamVjdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwcyAoQURDIGRpc2FibGVkLCBvciBBREMgZW5hYmxlZCB3aXRob3V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVvdXMgbW9kZSBvciBleHRlcm5hbCB0cmlnZ2VyIHRoYXQgY291bGQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGF1bmNoIGEgY29udmVyc2lvbikuICovCisKK30gQURDX0NoYW5uZWxDb25mVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBvZiBBREMgYW5hbG9nIHdhdGNoZG9nCisgICogQG5vdGUgICBUaGUgc2V0dGluZyBvZiB0aGVzZSBwYXJhbWV0ZXJzIGJ5IGZ1bmN0aW9uCisgIEhBTF9BRENfQW5hbG9nV0RHQ29uZmlnKCkgaXMgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlLgorICAqICAgICAgICAgQURDIHN0YXRlIGNhbiBiZSBlaXRoZXI6CisgICogICAgICAgICAgLSBGb3IgYWxsIHBhcmFtZXRlcnMgZXhjZXB0ICdIaWdoVGhyZXNob2xkJywgJ0xvd1RocmVzaG9sZCc6IEFEQworICBkaXNhYmxlZCBvciBBREMgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcgb24gQURDIGdyb3VwcyByZWd1bGFyIGFuZAorICBpbmplY3RlZC4KKyAgKiAgICAgICAgICAtIEZvciBwYXJhbWV0ZXJzICdIaWdoVGhyZXNob2xkJywgJ0xvd1RocmVzaG9sZCc6IEFEQyBlbmFibGVkIHdpdGgKKyAgY29udmVyc2lvbiBvbiBnb2luZyBvbiByZWd1bGFyIGFuZCBpbmplY3RlZCBncm91cHMuCisgICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQzMl90CisgICAgICBXYXRjaGRvZ051bWJlcjsgLyohPCBTZWxlY3Qgd2hpY2ggQURDIGFuYWxvZyB3YXRjaGRvZyBpcyBtb25pdG9yaW5nIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkIGNoYW5uZWwuIEZvciBBbmFsb2cgV2F0Y2hkb2cgMTogT25seSAxIGNoYW5uZWwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjYW4gYmUgbW9uaXRvcmVkIChvciBvdmVyYWxsIGdyb3VwIG9mIGNoYW5uZWxzIGJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZyBwYXJhbWV0ZXIgJ1dhdGNoZG9nTW9kZScpIEZvciBBbmFsb2cgV2F0Y2hkb2cgMgorICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCAzOiBTZXZlcmFsIGNoYW5uZWxzIGNhbiBiZSBtb25pdG9yZWQgKGJ5IHN1Y2Nlc3NpdmUKKyAgICAgICAgICAgICAgICAgICAgICAgICBjYWxscyBvZiAnSEFMX0FEQ19BbmFsb2dXREdDb25maWcoKScgZm9yIGVhY2ggY2hhbm5lbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICBBRENfSEFMX0VDX0FXRF9OVU1CRVIuICovCisKKyAgdWludDMyX3QgV2F0Y2hkb2dNb2RlOyAvKiE8IENvbmZpZ3VyZSB0aGUgQURDIGFuYWxvZyB3YXRjaGRvZyBtb2RlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmdsZS9hbGwvbm9uZSBjaGFubmVscy4gRm9yIEFuYWxvZyBXYXRjaGRvZyAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyZSB0aGUgQURDIGFuYWxvZyB3YXRjaGRvZyBtb2RlOiBzaW5nbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsIG9yIGFsbCBjaGFubmVscywgQURDIGdyb3VwcyByZWd1bGFyIGFuZC1vcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdGVkLiBGb3IgQW5hbG9nIFdhdGNoZG9nIDIgYW5kIDM6IFNldmVyYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVscyBjYW4gYmUgbW9uaXRvcmVkIGJ5IGFwcGx5aW5nIHN1Y2Nlc3NpdmVseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBBV0QgaW5pdCBzdHJ1Y3R1cmUuIENoYW5uZWxzIG9uIEFEQyBncm91cAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ3VsYXIgYW5kIGluamVjdGVkIGFyZSBub3QgZGlmZmVyZW50aWF0ZWQ6IFNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlICdBRENfQU5BTE9HV0FUQ0hET0dfU0lOR0xFX3h4eCcgdG8gbW9uaXRvciAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCwgdmFsdWUgJ0FEQ19BTkFMT0dXQVRDSERPR19BTExfeHh4JyB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbml0b3IgYWxsIGNoYW5uZWxzLCAnQURDX0FOQUxPR1dBVENIRE9HX05PTkUnIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9uaXRvciBubyBjaGFubmVsLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgQURDX2FuYWxvZ193YXRjaGRvZ19tb2RlLiAqLworCisgIHVpbnQzMl90CisgICAgICBDaGFubmVsOyAvKiE8IFNlbGVjdCB3aGljaCBBREMgY2hhbm5lbCB0byBtb25pdG9yIGJ5IGFuYWxvZyB3YXRjaGRvZy4KKyAgICAgICAgICAgICAgICAgICAgRm9yIEFuYWxvZyBXYXRjaGRvZyAxOiB0aGlzIHBhcmFtZXRlciBoYXMgYW4gZWZmZWN0IG9ubHkgaWYKKyAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciAnV2F0Y2hkb2dNb2RlJyBpcyBjb25maWd1cmVkIG9uIHNpbmdsZSBjaGFubmVsIChvbmx5CisgICAgICAgICAgICAgICAgICAxIGNoYW5uZWwgY2FuIGJlIG1vbml0b3JlZCkuIEZvciBBbmFsb2cgV2F0Y2hkb2cgMiBhbmQgMzoKKyAgICAgICAgICAgICAgICAgIFNldmVyYWwgY2hhbm5lbHMgY2FuIGJlIG1vbml0b3JlZC4gVG8gdXNlIHRoaXMgZmVhdHVyZSwgY2FsbAorICAgICAgICAgICAgICAgICAgc3VjY2Vzc2l2ZWx5IHRoZSBmdW5jdGlvbiBIQUxfQURDX0FuYWxvZ1dER0NvbmZpZygpIGZvciBlYWNoCisgICAgICAgICAgICAgICAgICBjaGFubmVsIHRvIGJlIGFkZGVkIChvciByZW1vdmVkIHdpdGggdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQURDX0FOQUxPR1dBVENIRE9HX05PTkUnKS4KKyAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBBRENfSEFMX0VDX0NIQU5ORUwuICovCisKKyAgRnVuY3Rpb25hbFN0YXRlIElUTW9kZTsgLyohPCBTcGVjaWZ5IHdoZXRoZXIgdGhlIGFuYWxvZyB3YXRjaGRvZyBpcyBjb25maWd1cmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGludGVycnVwdCBvciBwb2xsaW5nIG1vZGUuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgdG8gRU5BQkxFIG9yIERJU0FCTEUgKi8KKworICB1aW50MzJfdCBIaWdoVGhyZXNob2xkOyAvKiE8IENvbmZpZ3VyZSB0aGUgQURDIGFuYWxvZyB3YXRjaGRvZyBIaWdoIHRocmVzaG9sZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS4gRGVwZW5kaW5nIG9mIEFEQyByZXNvbHV0aW9uIHNlbGVjdGVkICgxMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAsIDggb3IgNiBiaXRzKSwgdGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMDAgYW5kIE1heF9EYXRhID0gMHhGRkYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4M0ZGLCAweEZGIG9yIDB4M0YgcmVzcGVjdGl2ZWx5LiBOb3RlOiBBbmFsb2cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0Y2hkb2cgMiBhbmQgMyBhcmUgbGltaXRlZCB0byBhIHJlc29sdXRpb24gb2YgOAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzOiBpZiBBREMgcmVzb2x1dGlvbiBpcyAxMiBiaXRzIHRoZSA0IExTQiBhcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlZCwgaWYgQURDIHJlc29sdXRpb24gaXMgMTAgYml0cyB0aGUgMiBMU0IgYXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZWQuIE5vdGU6IElmIEFEQyBvdmVyc2FtcGxpbmcgaXMgZW5hYmxlZCwgQURDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuYWxvZyB3YXRjaGRvZyB0aHJlc2hvbGRzIGFyZSBpbXBhY3RlZDogdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmlzb24gb2YgYW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZHMgaXMgZG9uZSBvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJzYW1wbGluZyBmaW5hbCBjb21wdXRhdGlvbiAoYWZ0ZXIgcmF0aW8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHNoaWZ0IGFwcGxpY2F0aW9uKTogQURDIGRhdGEgcmVnaXN0ZXIgYml0ZmllbGQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzE1OjRdICgxMiBtb3N0IHNpZ25pZmljYW50IGJpdHMpLiAqLworCisgIHVpbnQzMl90CisgICAgICBMb3dUaHJlc2hvbGQ7IC8qITwgQ29uZmlndXJlcyB0aGUgQURDIGFuYWxvZyB3YXRjaGRvZyBMb3cgdGhyZXNob2xkIHZhbHVlLgorICAgICAgICAgICAgICAgICAgICAgICAgIERlcGVuZGluZyBvZiBBREMgcmVzb2x1dGlvbiBzZWxlY3RlZCAoMTIsIDEwLCA4IG9yIDYKKyAgICAgICAgICAgICAgICAgICAgICAgYml0cyksIHRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9CisgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwIGFuZCBNYXhfRGF0YSA9IDB4RkZGLCAweDNGRiwgMHhGRiBvciAweDNGCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcGVjdGl2ZWx5LgorICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IEFuYWxvZyB3YXRjaGRvZyAyIGFuZCAzIGFyZSBsaW1pdGVkIHRvIGEKKyAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbiBvZiA4IGJpdHM6IGlmIEFEQyByZXNvbHV0aW9uIGlzIDEyIGJpdHMgdGhlIDQKKyAgICAgICAgICAgICAgICAgICAgICAgTFNCIGFyZSBpZ25vcmVkLCBpZiBBREMgcmVzb2x1dGlvbiBpcyAxMCBiaXRzIHRoZSAyIExTQgorICAgICAgICAgICAgICAgICAgICAgICBhcmUgaWdub3JlZC4gTm90ZTogSWYgQURDIG92ZXJzYW1wbGluZyBpcyBlbmFibGVkLCBBREMKKyAgICAgICAgICAgICAgICAgICAgICAgYW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZHMgYXJlIGltcGFjdGVkOiB0aGUgY29tcGFyaXNvbgorICAgICAgICAgICAgICAgICAgICAgICBvZiBhbmFsb2cgd2F0Y2hkb2cgdGhyZXNob2xkcyBpcyBkb25lIG9uIG92ZXJzYW1wbGluZworICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBjb21wdXRhdGlvbiAoYWZ0ZXIgcmF0aW8gYW5kIHNoaWZ0IGFwcGxpY2F0aW9uKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREMgZGF0YSByZWdpc3RlciBiaXRmaWVsZCBbMTU6NF0gKDEyIG1vc3QKKyAgICAgICAgICAgICAgICAgICAgICAgc2lnbmlmaWNhbnQgYml0cykuKi8KKworICB1aW50MzJfdCBGaWx0ZXJpbmdDb25maWc7IC8qITwgU3BlY2lmeSB3aGV0aGVyIGZpbHRlcmluZyBzaG91bGQgYmUgdXNlIGFuZCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgb2Ygc2FtcGxlcyB0byBjb25zaWRlci4gQmVmb3JlIHNldHRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnIG9yIHJhaXNpbmcgaW50ZXJydXB0LCBhbmFsb2cgd2F0Y2hkb2cgY2FuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdCB0byBoYXZlIHNldmVyYWwgY29uc2VjdXRpdmUgb3V0LW9mLXdpbmRvdworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMuIFRoaXMgcGFyYW1ldGVyIGFsbG93cyB0byBjb25maWd1cmUgdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlci4gVGhpcyBwYXJhbWV0ZXIgb25seSBhcHBsaWVzIHRvIEFuYWxvZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGNoZG9nIDEuIEZvciBvdGhlcnMsIHVzZSB2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0FXRF9GSUxURVJJTkdfTk9ORS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfYW5hbG9nX3dhdGNoZG9nX2ZpbHRlcmluZ19jb25maWcuICovCit9IEFEQ19BbmFsb2dXREdDb25mVHlwZURlZjsKKworLyoqCisgKiBAYnJpZWYgIEFEQyBncm91cCBpbmplY3RlZCBjb250ZXh0cyBxdWV1ZSBjb25maWd1cmF0aW9uCisgKiBAbm90ZSAgIFN0cnVjdHVyZSBpbnRlbmRlZCB0byBiZSB1c2VkIG9ubHkgdGhyb3VnaCBzdHJ1Y3R1cmUKKyAqICJBRENfSGFuZGxlVHlwZURlZiIKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50MzJfdCBDb250ZXh0UXVldWU7IC8qITwgSW5qZWN0ZWQgY2hhbm5lbCBjb25maWd1cmF0aW9uIGNvbnRleHQ6IGJ1aWxkLXVwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlciBlYWNoIEhBTF9BRENFeF9JbmplY3RlZENvbmZpZ0NoYW5uZWwoKSBjYWxsIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSBpbml0aWFsaXplIEpTUVIgcmVnaXN0ZXIgYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDRXhfSW5qZWN0ZWRDb25maWdDaGFubmVsKCkgbGFzdCBjYWxsICovCisKKyAgdWludDMyX3QgQ2hhbm5lbENvdW50OyAvKiE8IE51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgaW5qZWN0ZWQgc2VxdWVuY2UgKi8KK30gQURDX0luamVjdGlvbkNvbmZpZ1R5cGVEZWY7CisKKy8qKiBAZGVmZ3JvdXAgQURDX1N0YXRlcyBBREMgU3RhdGVzCisgKiBAeworICovCisKKy8qKgorICogQGJyaWVmICBIQUwgQURDIHN0YXRlIG1hY2hpbmU6IEFEQyBzdGF0ZXMgZGVmaW5pdGlvbiAoYml0ZmllbGRzKQorICogQG5vdGUgICBBREMgc3RhdGUgbWFjaGluZSBpcyBtYW5hZ2VkIGJ5IGJpdGZpZWxkcywgc3RhdGUgbXVzdCBiZSBjb21wYXJlZAorICogICAgICAgICB3aXRoIGJpdCBieSBiaXQuCisgKiAgICAgICAgIEZvciBleGFtcGxlOgorICogICAgICAgICAgICIgaWYgKChIQUxfQURDX0dldFN0YXRlKGhhZGMxKSAmIEhBTF9BRENfU1RBVEVfUkVHX0JVU1kpICE9IDBVTCkgIgorICogICAgICAgICAgICIgaWYgKChIQUxfQURDX0dldFN0YXRlKGhhZGMxKSAmIEhBTF9BRENfU1RBVEVfQVdEMSkgIT0gMFVMKSAiCisgKi8KKy8qIFN0YXRlcyBvZiBBREMgZ2xvYmFsIHNjb3BlICovCisjZGVmaW5lIEhBTF9BRENfU1RBVEVfUkVTRVQgXAorICAoMHgwMDAwMDAwMFVMKSAvKiE8IEFEQyBub3QgeWV0IGluaXRpYWxpemVkIG9yIGRpc2FibGVkICovCisjZGVmaW5lIEhBTF9BRENfU1RBVEVfUkVBRFkgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgweDAwMDAwMDAxVUwpIC8qITwgQURDIHBlcmlwaGVyYWwgcmVhZHkgZm9yIHVzZSBcCisgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfQURDX1NUQVRFX0JVU1lfSU5URVJOQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoMHgwMDAwMDAwMlVMKSAvKiE8IEFEQyBpcyBidXN5IGR1ZSB0byBhbiBpbnRlcm5hbCBwcm9jZXNzIChpbml0aWFsaXphdGlvbiwgXAorICAgICAgICAgICAgICAgICAgICAgIGNhbGlicmF0aW9uLCAuLi4pICovCisjZGVmaW5lIEhBTF9BRENfU1RBVEVfVElNRU9VVCAoMHgwMDAwMDAwNFVMKSAvKiE8IFRpbWVPdXQgb2NjdXJyZW5jZSAqLworCisvKiBTdGF0ZXMgb2YgQURDIGVycm9ycyAqLworI2RlZmluZSBIQUxfQURDX1NUQVRFX0VSUk9SX0lOVEVSTkFMIFwKKyAgKDB4MDAwMDAwMTBVTCkgLyohPCBJbnRlcm5hbCBlcnJvciBvY2N1cnJlbmNlICovCisjZGVmaW5lIEhBTF9BRENfU1RBVEVfRVJST1JfQ09ORklHIFwKKyAgKDB4MDAwMDAwMjBVTCkgLyohPCBDb25maWd1cmF0aW9uIGVycm9yIG9jY3VycmVuY2UgKi8KKyNkZWZpbmUgSEFMX0FEQ19TVEFURV9FUlJPUl9ETUEgKDB4MDAwMDAwNDBVTCkgLyohPCBETUEgZXJyb3Igb2NjdXJyZW5jZSAqLworCisvKiBTdGF0ZXMgb2YgQURDIGdyb3VwIHJlZ3VsYXIgKi8KKyNkZWZpbmUgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKDB4MDAwMDAxMDBVTCkgLyohPCBBIGNvbnZlcnNpb24gb24gQURDIGdyb3VwIHJlZ3VsYXIgaXMgb25nb2luZyBvciBjYW4gICAgIFwKKyAgICAgICAgICAgICAgICAgICAgb2NjdXIgKGVpdGhlciBieSBjb250aW51b3VzIG1vZGUsIGV4dGVybmFsIHRyaWdnZXIsIGxvdyAgIFwKKyAgICAgICAgICAgICAgICAgICAgcG93ZXIgYXV0byBwb3dlci1vbiAoaWYgZmVhdHVyZSBhdmFpbGFibGUpLCBtdWx0aW1vZGUgQURDIFwKKyAgICAgICAgICAgICAgICAgICAgbWFzdGVyIGNvbnRyb2wgKGlmIGZlYXR1cmUgYXZhaWxhYmxlKSkgKi8KKyNkZWZpbmUgSEFMX0FEQ19TVEFURV9SRUdfRU9DIFwKKyAgKDB4MDAwMDAyMDBVTCkgLyohPCBDb252ZXJzaW9uIGRhdGEgYXZhaWxhYmxlIG9uIGdyb3VwIHJlZ3VsYXIgKi8KKyNkZWZpbmUgSEFMX0FEQ19TVEFURV9SRUdfT1ZSICgweDAwMDAwNDAwVUwpIC8qITwgT3ZlcnJ1biBvY2N1cnJlbmNlICovCisjZGVmaW5lIEhBTF9BRENfU1RBVEVfUkVHX0VPU01QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoMHgwMDAwMDgwMFVMKSAvKiE8IE5vdCBhdmFpbGFibGUgb24gdGhpcyBTVE0zMiBzZXJpZXM6IEVuZCBPZiBTYW1wbGluZyBmbGFnIFwKKyAgICAgICAgICAgICAgICAgICAgICByYWlzZWQgICovCisKKy8qIFN0YXRlcyBvZiBBREMgZ3JvdXAgaW5qZWN0ZWQgKi8KKyNkZWZpbmUgSEFMX0FEQ19TVEFURV9JTkpfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKDB4MDAwMDEwMDBVTCkgLyohPCBBIGNvbnZlcnNpb24gb24gQURDIGdyb3VwIGluamVjdGVkIGlzIG9uZ29pbmcgb3IgY2FuICAgIFwKKyAgICAgICAgICAgICAgICAgICAgb2NjdXIgKGVpdGhlciBieSBhdXRvLWluamVjdGlvbiBtb2RlLCBleHRlcm5hbCB0cmlnZ2VyLCAgIFwKKyAgICAgICAgICAgICAgICAgICAgbG93IHBvd2VyIGF1dG8gcG93ZXItb24gKGlmIGZlYXR1cmUgYXZhaWxhYmxlKSwgbXVsdGltb2RlIFwKKyAgICAgICAgICAgICAgICAgICAgICBBREMgbWFzdGVyIGNvbnRyb2wgKGlmIGZlYXR1cmUgYXZhaWxhYmxlKSkgKi8KKyNkZWZpbmUgSEFMX0FEQ19TVEFURV9JTkpfRU9DIFwKKyAgKDB4MDAwMDIwMDBVTCkgLyohPCBDb252ZXJzaW9uIGRhdGEgYXZhaWxhYmxlIG9uIGdyb3VwIGluamVjdGVkICovCisjZGVmaW5lIEhBTF9BRENfU1RBVEVfSU5KX0pRT1ZGIFwKKyAgKDB4MDAwMDQwMDBVTCkgLyohPCBJbmplY3RlZCBxdWV1ZSBvdmVyZmxvdyBvY2N1cnJlbmNlICovCisKKy8qIFN0YXRlcyBvZiBBREMgYW5hbG9nIHdhdGNoZG9ncyAqLworI2RlZmluZSBIQUxfQURDX1NUQVRFX0FXRDEgXAorICAoMHgwMDAxMDAwMFVMKSAvKiE8IE91dC1vZi13aW5kb3cgb2NjdXJyZW5jZSBvZiBBREMgYW5hbG9nIHdhdGNoZG9nIDEgKi8KKyNkZWZpbmUgSEFMX0FEQ19TVEFURV9BV0QyIFwKKyAgKDB4MDAwMjAwMDBVTCkgLyohPCBPdXQtb2Ytd2luZG93IG9jY3VycmVuY2Ugb2YgQURDIGFuYWxvZyB3YXRjaGRvZyAyICovCisjZGVmaW5lIEhBTF9BRENfU1RBVEVfQVdEMyBcCisgICgweDAwMDQwMDAwVUwpIC8qITwgT3V0LW9mLXdpbmRvdyBvY2N1cnJlbmNlIG9mIEFEQyBhbmFsb2cgd2F0Y2hkb2cgMyAqLworCisvKiBTdGF0ZXMgb2YgQURDIG11bHRpLW1vZGUgKi8KKyNkZWZpbmUgSEFMX0FEQ19TVEFURV9NVUxUSU1PREVfU0xBVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKDB4MDAxMDAwMDBVTCkgLyohPCBBREMgaW4gbXVsdGltb2RlIHNsYXZlIHN0YXRlLCBjb250cm9sbGVkIGJ5IGFub3RoZXIgQURDIFwKKyAgICAgICAgICAgICAgICAgICAgICBtYXN0ZXIgKHdoZW4gZmVhdHVyZSBhdmFpbGFibGUpICovCisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEBicmllZiAgQURDIGhhbmRsZSBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICovCisjaWYgKFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQordHlwZWRlZiBzdHJ1Y3QgX19BRENfSGFuZGxlVHlwZURlZgorI2Vsc2UKK3R5cGVkZWYgc3RydWN0CisjZW5kaWYgLyogVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit7CisgIEFEQ19UeXBlRGVmICpJbnN0YW5jZTsgICAgICAgICAvKiE8IFJlZ2lzdGVyIGJhc2UgYWRkcmVzcyAqLworICBBRENfSW5pdFR5cGVEZWYgSW5pdDsgICAgICAgICAgLyohPCBBREMgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycyBhbmQgcmVndWxhcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9ucyBzZXR0aW5nICovCisgIERNQV9IYW5kbGVUeXBlRGVmICpETUFfSGFuZGxlOyAvKiE8IFBvaW50ZXIgRE1BIEhhbmRsZXIgKi8KKyAgSEFMX0xvY2tUeXBlRGVmIExvY2s7ICAgICAgICAgIC8qITwgQURDIGxvY2tpbmcgb2JqZWN0ICovCisgIF9fSU8gdWludDMyX3QgU3RhdGU7IC8qITwgQURDIGNvbW11bmljYXRpb24gc3RhdGUgKGJpdG1hcCBvZiBBREMgc3RhdGVzKSAqLworICBfX0lPIHVpbnQzMl90IEVycm9yQ29kZTsgLyohPCBBREMgRXJyb3IgY29kZSAqLworICBBRENfSW5qZWN0aW9uQ29uZmlnVHlwZURlZgorICAgICAgSW5qZWN0aW9uQ29uZmlnOyAvKiE8IEFEQyBpbmplY3RlZCBjaGFubmVsIGNvbmZpZ3VyYXRpb24gYnVpbGQtdXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlICovCisjaWYgKFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICB2b2lkICgqQ29udkNwbHRDYWxsYmFjaykoc3RydWN0IF9fQURDX0hhbmRsZVR5cGVEZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaGFkYyk7IC8qITwgQURDIGNvbnZlcnNpb24gY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgdm9pZCAoKkNvbnZIYWxmQ3BsdENhbGxiYWNrKSgKKyAgICAgIHN0cnVjdCBfX0FEQ19IYW5kbGVUeXBlRGVmICpoYWRjKTsgLyohPCBBREMgY29udmVyc2lvbiBETUEgaGFsZi10cmFuc2ZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrICovCisgIHZvaWQgKCpMZXZlbE91dE9mV2luZG93Q2FsbGJhY2spKAorICAgICAgc3RydWN0IF9fQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpOyAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgMSBjYWxsYmFjayAqLworICB2b2lkICgqRXJyb3JDYWxsYmFjaykoCisgICAgICBzdHJ1Y3QgX19BRENfSGFuZGxlVHlwZURlZiAqaGFkYyk7IC8qITwgQURDIGVycm9yIGNhbGxiYWNrICovCisgIHZvaWQgKCpJbmplY3RlZENvbnZDcGx0Q2FsbGJhY2spKAorICAgICAgc3RydWN0IF9fQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpOyAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlIGNhbGxiYWNrICovCisgIHZvaWQgKCpJbmplY3RlZFF1ZXVlT3ZlcmZsb3dDYWxsYmFjaykoCisgICAgICBzdHJ1Y3QgX19BRENfSGFuZGxlVHlwZURlZiAqaGFkYyk7IC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnRleHQgcXVldWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdyBjYWxsYmFjayAqLworICB2b2lkICgqTGV2ZWxPdXRPZldpbmRvdzJDYWxsYmFjaykoCisgICAgICBzdHJ1Y3QgX19BRENfSGFuZGxlVHlwZURlZiAqaGFkYyk7IC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyAyIGNhbGxiYWNrICovCisgIHZvaWQgKCpMZXZlbE91dE9mV2luZG93M0NhbGxiYWNrKSgKKyAgICAgIHN0cnVjdCBfX0FEQ19IYW5kbGVUeXBlRGVmICpoYWRjKTsgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIDMgY2FsbGJhY2sgKi8KKyAgdm9pZCAoKkVuZE9mU2FtcGxpbmdDYWxsYmFjaykoCisgICAgICBzdHJ1Y3QgX19BRENfSGFuZGxlVHlwZURlZiAqaGFkYyk7IC8qITwgQURDIGVuZCBvZiBzYW1wbGluZyBjYWxsYmFjayAqLworICB2b2lkICgqTXNwSW5pdENhbGxiYWNrKSgKKyAgICAgIHN0cnVjdCBfX0FEQ19IYW5kbGVUeXBlRGVmICpoYWRjKTsgLyohPCBBREMgTXNwIEluaXQgY2FsbGJhY2sgKi8KKyAgdm9pZCAoKk1zcERlSW5pdENhbGxiYWNrKSgKKyAgICAgIHN0cnVjdCBfX0FEQ19IYW5kbGVUeXBlRGVmICpoYWRjKTsgLyohPCBBREMgTXNwIERlSW5pdCBjYWxsYmFjayAqLworI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30gQURDX0hhbmRsZVR5cGVEZWY7CisKKyNpZiAoVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisvKioKKyAqIEBicmllZiAgSEFMIEFEQyBDYWxsYmFjayBJRCBlbnVtZXJhdGlvbiBkZWZpbml0aW9uCisgKi8KK3R5cGVkZWYgZW51bSB7CisgIEhBTF9BRENfQ09OVkVSU0lPTl9DT01QTEVURV9DQl9JRCA9CisgICAgICAweDAwVSwgLyohPCBBREMgY29udmVyc2lvbiBjb21wbGV0ZSBjYWxsYmFjayBJRCAqLworICBIQUxfQURDX0NPTlZFUlNJT05fSEFMRl9DQl9JRCA9CisgICAgICAweDAxVSwgLyohPCBBREMgY29udmVyc2lvbiBETUEgaGFsZi10cmFuc2ZlciBjYWxsYmFjayBJRCAqLworICBIQUxfQURDX0xFVkVMX09VVF9PRl9XSU5ET1dfMV9DQl9JRCA9CisgICAgICAweDAyVSwgICAgICAgICAgICAgICAgICAgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIDEgY2FsbGJhY2sgSUQgKi8KKyAgSEFMX0FEQ19FUlJPUl9DQl9JRCA9IDB4MDNVLCAvKiE8IEFEQyBlcnJvciBjYWxsYmFjayBJRCAqLworICBIQUxfQURDX0lOSl9DT05WRVJTSU9OX0NPTVBMRVRFX0NCX0lEID0KKyAgICAgIDB4MDRVLCAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIGNvbXBsZXRlIGNhbGxiYWNrIElEICovCisgIEhBTF9BRENfSU5KX1FVRVVFX09WRUZMT1dfQ0JfSUQgPQorICAgICAgMHgwNVUsIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnRleHQgcXVldWUgb3ZlcmZsb3cgY2FsbGJhY2sgSUQgKi8KKyAgSEFMX0FEQ19MRVZFTF9PVVRfT0ZfV0lORE9XXzJfQ0JfSUQgPQorICAgICAgMHgwNlUsIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyAyIGNhbGxiYWNrIElEICovCisgIEhBTF9BRENfTEVWRUxfT1VUX09GX1dJTkRPV18zX0NCX0lEID0KKyAgICAgIDB4MDdVLCAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgMyBjYWxsYmFjayBJRCAqLworICBIQUxfQURDX0VORF9PRl9TQU1QTElOR19DQl9JRCA9IDB4MDhVLCAvKiE8IEFEQyBlbmQgb2Ygc2FtcGxpbmcgY2FsbGJhY2sgSUQgKi8KKyAgSEFMX0FEQ19NU1BJTklUX0NCX0lEID0gMHgwOVUsICAvKiE8IEFEQyBNc3AgSW5pdCBjYWxsYmFjayBJRCAgICAgICAgICAqLworICBIQUxfQURDX01TUERFSU5JVF9DQl9JRCA9IDB4MEFVIC8qITwgQURDIE1zcCBEZUluaXQgY2FsbGJhY2sgSUQgICAgICAgICovCit9IEhBTF9BRENfQ2FsbGJhY2tJRFR5cGVEZWY7CisKKy8qKgorICogQGJyaWVmICBIQUwgQURDIENhbGxiYWNrIHBvaW50ZXIgZGVmaW5pdGlvbgorICovCit0eXBlZGVmIHZvaWQgKCpwQURDX0NhbGxiYWNrVHlwZURlZikoCisgICAgQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpOyAvKiE8IHBvaW50ZXIgdG8gYSBBREMgY2FsbGJhY2sgZnVuY3Rpb24gKi8KKworI2VuZGlmIC8qIFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBBRENfRXhwb3J0ZWRfQ29uc3RhbnRzIEFEQyBFeHBvcnRlZCBDb25zdGFudHMKKyAqIEB7CisgKi8KKworLyoqIEBkZWZncm91cCBBRENfRXJyb3JfQ29kZSBBREMgRXJyb3IgQ29kZQorICogQHsKKyAqLworI2RlZmluZSBIQUxfQURDX0VSUk9SX05PTkUgXAorICAoMHgwMFUpIC8qITwgTm8gZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfQURDX0VSUk9SX0lOVEVSTkFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKDB4MDFVKSAvKiE8IEFEQyBwZXJpcGhlcmFsIGludGVybmFsIGVycm9yIChwcm9ibGVtIG9mIGNsb2NraW5nLCBcCisgICAgICAgICAgICAgICBlbmFibGUvZGlzYWJsZSwgZXJyb25lb3VzIHN0YXRlLCAuLi4pICAgICAgICovCisjZGVmaW5lIEhBTF9BRENfRVJST1JfT1ZSIFwKKyAgKDB4MDJVKSAvKiE8IE92ZXJydW4gZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX0FEQ19FUlJPUl9ETUEgXAorICAoMHgwNFUpIC8qITwgRE1BIHRyYW5zZmVyIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfQURDX0VSUk9SX0pRT1ZGIFwKKyAgKDB4MDhVKSAvKiE8IEluamVjdGVkIGNvbnRleHQgcXVldWUgb3ZlcmZsb3cgZXJyb3IgICAgICAgKi8KKyNpZiAoVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisjZGVmaW5lIEhBTF9BRENfRVJST1JfSU5WQUxJRF9DQUxMQkFDSyAoMHgxMFUpIC8qITwgSW52YWxpZCBDYWxsYmFjayBlcnJvciAqLworI2VuZGlmIC8qIFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0hBTF9FQ19DT01NT05fQ0xPQ0tfU09VUkNFICBBREMgY29tbW9uIC0gQ2xvY2sgc291cmNlCisgKiBAeworICovCisKKyNkZWZpbmUgQURDX0NMT0NLX1NZTkNfUENMS19ESVYxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX0NMT0NLX1NZTkNfUENMS19ESVYxKSAvKiE8IEFEQyBzeW5jaHJvbm91cyBjbG9jayBmcm9tIEFIQiBjbG9jayBcCisgd2l0aG91dCBwcmVzY2FsZXIgKi8KKyNkZWZpbmUgQURDX0NMT0NLX1NZTkNfUENMS19ESVYyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX0NMT0NLX1NZTkNfUENMS19ESVYyKSAvKiE8IEFEQyBzeW5jaHJvbm91cyBjbG9jayBmcm9tIEFIQiBjbG9jayBcCisgd2l0aCBwcmVzY2FsZXIgZGl2aXNpb24gYnkgMiAqLworI2RlZmluZSBBRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChMTF9BRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjQpIC8qITwgQURDIHN5bmNocm9ub3VzIGNsb2NrIGZyb20gQUhCIGNsb2NrIFwKKyB3aXRoIHByZXNjYWxlciBkaXZpc2lvbiBieSA0ICovCisjZGVmaW5lIEFEQ19DTE9DS19BU1lOQ19ESVYxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX0NMT0NLX0FTWU5DX0RJVjEpIC8qITwgQURDIGFzeW5jaHJvbm91cyBjbG9jayB3aXRob3V0IFwKK3ByZXNjYWxlciAqLworI2RlZmluZSBBRENfQ0xPQ0tfQVNZTkNfRElWMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMikgLyohPCBBREMgYXN5bmNocm9ub3VzIGNsb2NrIHdpdGggcHJlc2NhbGVyIFwKK2RpdmlzaW9uIGJ5IDIgICAqLworI2RlZmluZSBBRENfQ0xPQ0tfQVNZTkNfRElWNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChMTF9BRENfQ0xPQ0tfQVNZTkNfRElWNCkgLyohPCBBREMgYXN5bmNocm9ub3VzIGNsb2NrIHdpdGggcHJlc2NhbGVyIFwKK2RpdmlzaW9uIGJ5IDQgICAqLworI2RlZmluZSBBRENfQ0xPQ0tfQVNZTkNfRElWNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChMTF9BRENfQ0xPQ0tfQVNZTkNfRElWNikgLyohPCBBREMgYXN5bmNocm9ub3VzIGNsb2NrIHdpdGggcHJlc2NhbGVyIFwKK2RpdmlzaW9uIGJ5IDYgICAqLworI2RlZmluZSBBRENfQ0xPQ0tfQVNZTkNfRElWOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChMTF9BRENfQ0xPQ0tfQVNZTkNfRElWOCkgLyohPCBBREMgYXN5bmNocm9ub3VzIGNsb2NrIHdpdGggcHJlc2NhbGVyIFwKK2RpdmlzaW9uIGJ5IDggICAqLworI2RlZmluZSBBRENfQ0xPQ0tfQVNZTkNfRElWMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX0NMT0NLX0FTWU5DX0RJVjEwKSAvKiE8IEFEQyBhc3luY2hyb25vdXMgY2xvY2sgd2l0aCBwcmVzY2FsZXIgXAorZGl2aXNpb24gYnkgMTAgICovCisjZGVmaW5lIEFEQ19DTE9DS19BU1lOQ19ESVYxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMTIpIC8qITwgQURDIGFzeW5jaHJvbm91cyBjbG9jayB3aXRoIHByZXNjYWxlciBcCitkaXZpc2lvbiBieSAxMiAgKi8KKyNkZWZpbmUgQURDX0NMT0NLX0FTWU5DX0RJVjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKExMX0FEQ19DTE9DS19BU1lOQ19ESVYxNikgLyohPCBBREMgYXN5bmNocm9ub3VzIGNsb2NrIHdpdGggcHJlc2NhbGVyIFwKK2RpdmlzaW9uIGJ5IDE2ICAqLworI2RlZmluZSBBRENfQ0xPQ0tfQVNZTkNfRElWMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX0NMT0NLX0FTWU5DX0RJVjMyKSAvKiE8IEFEQyBhc3luY2hyb25vdXMgY2xvY2sgd2l0aCBwcmVzY2FsZXIgXAorZGl2aXNpb24gYnkgMzIgICovCisjZGVmaW5lIEFEQ19DTE9DS19BU1lOQ19ESVY2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChMTF9BRENfQ0xPQ0tfQVNZTkNfRElWNjQpIC8qITwgQURDIGFzeW5jaHJvbm91cyBjbG9jayB3aXRoIHByZXNjYWxlciBcCitkaXZpc2lvbiBieSA2NCAgKi8KKyNkZWZpbmUgQURDX0NMT0NLX0FTWU5DX0RJVjEyOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMTI4KSAvKiE8IEFEQyBhc3luY2hyb25vdXMgY2xvY2sgd2l0aCBwcmVzY2FsZXIgXAorZGl2aXNpb24gYnkgMTI4ICovCisjZGVmaW5lIEFEQ19DTE9DS19BU1lOQ19ESVYyNTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX0NMT0NLX0FTWU5DX0RJVjI1NikgLyohPCBBREMgYXN5bmNocm9ub3VzIGNsb2NrIHdpdGggcHJlc2NhbGVyIFwKK2RpdmlzaW9uIGJ5IDI1NiAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0hBTF9FQ19SRVNPTFVUSU9OICBBREMgaW5zdGFuY2UgLSBSZXNvbHV0aW9uCisgKiBAeworICovCisjZGVmaW5lIEFEQ19SRVNPTFVUSU9OXzEyQiBcCisgIChMTF9BRENfUkVTT0xVVElPTl8xMkIpIC8qITwgQURDIHJlc29sdXRpb24gMTIgYml0cyAqLworI2RlZmluZSBBRENfUkVTT0xVVElPTl8xMEIgXAorICAoTExfQURDX1JFU09MVVRJT05fMTBCKSAvKiE8IEFEQyByZXNvbHV0aW9uIDEwIGJpdHMgKi8KKyNkZWZpbmUgQURDX1JFU09MVVRJT05fOEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX1JFU09MVVRJT05fOEIpIC8qITwgQURDIHJlc29sdXRpb24gIDggYml0cyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFEQ19SRVNPTFVUSU9OXzZCICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKExMX0FEQ19SRVNPTFVUSU9OXzZCKSAvKiE8IEFEQyByZXNvbHV0aW9uICA2IGJpdHMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0hBTF9FQ19EQVRBX0FMSUdOIEFEQyBjb252ZXJzaW9uIGRhdGEgYWxpZ25tZW50CisgKiBAeworICovCisjZGVmaW5lIEFEQ19EQVRBQUxJR05fUklHSFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChMTF9BRENfREFUQV9BTElHTl9SSUdIVCkgLyohPCBBREMgY29udmVyc2lvbiBkYXRhIGFsaWdubWVudDogcmlnaHQgYWxpZ25lZCBcCisgIChhbGlnbm1lbnQgb24gZGF0YSByZWdpc3RlciBMU0IgYml0IDApKi8KKyNkZWZpbmUgQURDX0RBVEFBTElHTl9MRUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChMTF9BRENfREFUQV9BTElHTl9MRUZUKSAvKiE8IEFEQyBjb252ZXJzaW9uIGRhdGEgYWxpZ25tZW50OiBsZWZ0IGFsaWduZWQgXAorIChhbGlnbm1lbnQgb24gZGF0YSByZWdpc3RlciBNU0IgYml0IDE1KSovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBBRENfU2Nhbl9tb2RlIEFEQyBzZXF1ZW5jZXIgc2NhbiBtb2RlCisgKiBAeworICovCisjZGVmaW5lIEFEQ19TQ0FOX0RJU0FCTEUgKDB4MDAwMDAwMDBVTCkgLyohPCBTY2FuIG1vZGUgZGlzYWJsZWQgKi8KKyNkZWZpbmUgQURDX1NDQU5fRU5BQkxFICgweDAwMDAwMDAxVUwpICAvKiE8IFNjYW4gbW9kZSBlbmFibGVkICAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX3JlZ3VsYXJfZXh0ZXJuYWxfdHJpZ2dlcl9zb3VyY2UgQURDIGdyb3VwIHJlZ3VsYXIgdHJpZ2dlcgorICogc291cmNlCisgKiBAeworICovCisvKiBBREMgZ3JvdXAgcmVndWxhciB0cmlnZ2VyIHNvdXJjZXMgZm9yIGFsbCBBREMgaW5zdGFuY2VzICovCisjZGVmaW5lIEFEQ19TT0ZUV0FSRV9TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChMTF9BRENfUkVHX1RSSUdfU09GVFdBUkUpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBcCit0cmlnZ2VyIHNvZnR3YXJlIHN0YXJ0ICovCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdfVDFfVFJHTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9UUkdPKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gXAordHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTEgVFJHTy4gKi8KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR19UMV9UUkdPMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9UUkdPMikgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIFwKK3RyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU0xIFRSR08yLiAqLworI2RlZmluZSBBRENfRVhURVJOQUxUUklHX1QxX0NDMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9DSDEpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBcCit0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMSBjaGFubmVsIDEgZXZlbnQgKGNhcHR1cmUgY29tcGFyZSkuICovCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdfVDFfQ0MyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX1JFR19UUklHX0VYVF9USU0xX0NIMikgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIFwKK3RyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU0xIGNoYW5uZWwgMiBldmVudCAoY2FwdHVyZSBjb21wYXJlKS4gKi8KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR19UMV9DQzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfQ0gzKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gXAordHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTEgY2hhbm5lbCAzIGV2ZW50IChjYXB0dXJlIGNvbXBhcmUpLiAqLworI2RlZmluZSBBRENfRVhURVJOQUxUUklHX1QyX1RSR08gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTJfVFJHTykgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIFwKK3RyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU0yIFRSR08uICovCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdfVDJfQ0MxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX1JFR19UUklHX0VYVF9USU0yX0NIMSkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIFwKK3RyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU0yIGNoYW5uZWwgMSBldmVudCAoY2FwdHVyZSBjb21wYXJlKS4gKi8KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR19UMl9DQzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTJfQ0gyKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gXAordHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTIgY2hhbm5lbCAyIGV2ZW50IChjYXB0dXJlIGNvbXBhcmUpLiAqLworI2RlZmluZSBBRENfRVhURVJOQUxUUklHX1QyX0NDMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKExMX0FEQ19SRUdfVFJJR19FWFRfVElNMl9DSDMpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBcCit0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMiBjaGFubmVsIDMgZXZlbnQgKGNhcHR1cmUgY29tcGFyZSkuICovCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdfVDNfVFJHTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKExMX0FEQ19SRUdfVFJJR19FWFRfVElNM19UUkdPKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gXAordHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTMgVFJHTy4gKi8KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR19UM19DQzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTNfQ0gxKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gXAordHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTMgY2hhbm5lbCAxIGV2ZW50IChjYXB0dXJlIGNvbXBhcmUpLiAqLworI2RlZmluZSBBRENfRVhURVJOQUxUUklHX1QzX0NDNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKExMX0FEQ19SRUdfVFJJR19FWFRfVElNM19DSDQpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBcCit0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMyBjaGFubmVsIDQgZXZlbnQgKGNhcHR1cmUgY29tcGFyZSkuICovCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdfVDRfVFJHTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKExMX0FEQ19SRUdfVFJJR19FWFRfVElNNF9UUkdPKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gXAordHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTQgVFJHTy4gKi8KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR19UNF9DQzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTRfQ0gxKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gXAordHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTQgY2hhbm5lbCAxIGV2ZW50IChjYXB0dXJlIGNvbXBhcmUpLiAqLworI2RlZmluZSBBRENfRVhURVJOQUxUUklHX1Q0X0NDNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKExMX0FEQ19SRUdfVFJJR19FWFRfVElNNF9DSDQpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBcCit0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNNCBjaGFubmVsIDQgZXZlbnQgKGNhcHR1cmUgY29tcGFyZSkuICovCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdfVDZfVFJHTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKExMX0FEQ19SRUdfVFJJR19FWFRfVElNNl9UUkdPKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gXAordHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTYgVFJHTy4gKi8KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR19UN19UUkdPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX1JFR19UUklHX0VYVF9USU03X1RSR08pIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBcCit0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNNyBUUkdPLiAqLworI2RlZmluZSBBRENfRVhURVJOQUxUUklHX1Q4X1RSR08gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChMTF9BRENfUkVHX1RSSUdfRVhUX1RJTThfVFJHTykgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIFwKK3RyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU04IFRSR08uICovCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdfVDhfVFJHTzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChMTF9BRENfUkVHX1RSSUdfRVhUX1RJTThfVFJHTzIpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBcCit0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNOCBUUkdPMi4gKi8KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR19UOF9DQzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChMTF9BRENfUkVHX1RSSUdfRVhUX1RJTThfQ0gxKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gXAordHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTggY2hhbm5lbCAxIGV2ZW50IChjYXB0dXJlIGNvbXBhcmUpLiAqLworI2RlZmluZSBBRENfRVhURVJOQUxUUklHX1QxNV9UUkdPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX1JFR19UUklHX0VYVF9USU0xNV9UUkdPKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gXAordHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTE1IFRSR08uICovCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdfVDIwX1RSR08gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTIwX1RSR08pIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBcCit0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMjAgVFJHTy4gKi8KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR19UMjBfVFJHTzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTIwX1RSR08yKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gXAordHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTIwIFRSR08yLiAqLworI2RlZmluZSBBRENfRVhURVJOQUxUUklHX1QyMF9DQzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTIwX0NIMSkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIFwKK3RyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU0yMCBjaGFubmVsIDEgZXZlbnQgKGNhcHR1cmUgY29tcGFyZSkuICovCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdfVDIwX0NDMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKExMX0FEQ19SRUdfVFJJR19FWFRfVElNMjBfQ0gyKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gXAordHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTIwIGNoYW5uZWwgMiBldmVudCAoY2FwdHVyZSBjb21wYXJlKS4gKi8KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR19UMjBfQ0MzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX1JFR19UUklHX0VYVF9USU0yMF9DSDMpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBcCit0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMjAgY2hhbm5lbCAzIGV2ZW50IChjYXB0dXJlIGNvbXBhcmUpLiAqLworI2RlZmluZSBBRENfRVhURVJOQUxUUklHX0hSVElNX1RSRzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX1JFR19UUklHX0VYVF9IUlRJTV9UUkcxKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gXAordHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IEhSVElNRVIgQURDIHRyaWdnZXIgMSBldmVudC4gKi8KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR19IUlRJTV9UUkcyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKExMX0FEQ19SRUdfVFJJR19FWFRfSFJUSU1fVFJHMikgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIFwKK3RyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBIUlRJTUVSIEFEQyB0cmlnZ2VyIDIgZXZlbnQuICovCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdfSFJUSU1fVFJHMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChMTF9BRENfUkVHX1RSSUdfRVhUX0hSVElNX1RSRzMpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBcCit0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogSFJUSU1FUiBBREMgdHJpZ2dlciAzIGV2ZW50LiAqLworI2RlZmluZSBBRENfRVhURVJOQUxUUklHX0hSVElNX1RSRzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX1JFR19UUklHX0VYVF9IUlRJTV9UUkc0KSAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gXAordHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IEhSVElNRVIgQURDIHRyaWdnZXIgNCBldmVudC4gKi8KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR19IUlRJTV9UUkc1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKExMX0FEQ19SRUdfVFJJR19FWFRfSFJUSU1fVFJHNSkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIFwKK3RyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBIUlRJTUVSIEFEQyB0cmlnZ2VyIDUgZXZlbnQuICovCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdfSFJUSU1fVFJHNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChMTF9BRENfUkVHX1RSSUdfRVhUX0hSVElNX1RSRzYpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBcCit0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogSFJUSU1FUiBBREMgdHJpZ2dlciA2IGV2ZW50LiAqLworI2RlZmluZSBBRENfRVhURVJOQUxUUklHX0hSVElNX1RSRzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX1JFR19UUklHX0VYVF9IUlRJTV9UUkc3KSAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gXAordHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IEhSVElNRVIgQURDIHRyaWdnZXIgNyBldmVudC4gKi8KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR19IUlRJTV9UUkc4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKExMX0FEQ19SRUdfVFJJR19FWFRfSFJUSU1fVFJHOCkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIFwKK3RyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBIUlRJTUVSIEFEQyB0cmlnZ2VyIDggZXZlbnQuICovCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdfSFJUSU1fVFJHOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChMTF9BRENfUkVHX1RSSUdfRVhUX0hSVElNX1RSRzkpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBcCit0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogSFJUSU1FUiBBREMgdHJpZ2dlciA5IGV2ZW50LiAqLworI2RlZmluZSBBRENfRVhURVJOQUxUUklHX0hSVElNX1RSRzEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKExMX0FEQ19SRUdfVFJJR19FWFRfSFJUSU1fVFJHMTApIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBcCit0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogSFJUSU1FUiBBREMgdHJpZ2dlciAxMCBldmVudC4gKi8KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR19FWFRfSVQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKExMX0FEQ19SRUdfVFJJR19FWFRfRVhUSV9MSU5FMikgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIFwKK3RyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBleHRlcm5hbCBpbnRlcnJ1cHQgbGluZSAyLiAqLworI2RlZmluZSBBRENfRVhURVJOQUxUUklHX0VYVF9JVDExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKExMX0FEQ19SRUdfVFJJR19FWFRfRVhUSV9MSU5FMTEpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBcCit0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogZXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUgMTEuICovCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdfTFBUSU1fT1VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKExMX0FEQ19SRUdfVFJJR19FWFRfTFBUSU1fT1VUKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gXAordHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IExQVElNRVIgT1VUIGV2ZW50LiAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX3JlZ3VsYXJfZXh0ZXJuYWxfdHJpZ2dlcl9lZGdlIEFEQyBncm91cCByZWd1bGFyIHRyaWdnZXIgZWRnZQorICogKHdoZW4gZXh0ZXJuYWwgdHJpZ2dlciBpcyBzZWxlY3RlZCkKKyAqIEB7CisgKi8KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0NPTlZFREdFX05PTkUgICAgICAgICAgIFwKKyAgKDB4MDAwMDAwMDBVTCkgLyohPCBBREMgZ3JvdXAgcmVndWxhciB0cmlnZ2VyIFwKK2Rpc2FibGVkIChTVyBzdGFydCkqLworI2RlZmluZSBBRENfRVhURVJOQUxUUklHQ09OVkVER0VfUklTSU5HICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChMTF9BRENfUkVHX1RSSUdfRVhUX1JJU0lORykgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIFwKK3RyaWdnZXIgcG9sYXJpdHkgc2V0IHRvIHJpc2luZyBlZGdlICovCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdDT05WRURHRV9GQUxMSU5HICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChMTF9BRENfUkVHX1RSSUdfRVhUX0ZBTExJTkcpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBcCit0cmlnZ2VyIHBvbGFyaXR5IHNldCB0byBmYWxsaW5nIGVkZ2UgKi8KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0NPTlZFREdFX1JJU0lOR0ZBTExJTkcgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKExMX0FEQ19SRUdfVFJJR19FWFRfUklTSU5HRkFMTElORykgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIFwKKyAgdHJpZ2dlciBwb2xhcml0eSBzZXQgdG8gYm90aCByaXNpbmcgYW5kIGZhbGxpbmcgZWRnZXMgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEFEQ19yZWd1bGFyX3NhbXBsaW5nX21vZGUgQURDIGdyb3VwIHJlZ3VsYXIgc2FtcGxpbmcgbW9kZQorICogQHsKKyAqLworI2RlZmluZSBBRENfU0FNUExJTkdfTU9ERV9OT1JNQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgweDAwMDAwMDAwVUwpIC8qITwgQURDIGNvbnZlcnNpb25zIHNhbXBsaW5nIHBoYXNlIGR1cmF0aW9uIGlzIFwKK2RlZmluZWQgdXNpbmcgIEByZWYgQURDX0hBTF9FQ19DSEFOTkVMX1NBTVBMSU5HVElNRSAqLworI2RlZmluZSBBRENfU0FNUExJTkdfTU9ERV9CVUxCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19DRkdSMl9CVUxCKSAvKiE8IEFEQyBjb252ZXJzaW9ucyBzYW1wbGluZyBwaGFzZSBzdGFydHMgICAgICBcCitpbW1lZGlhdGVseSBhZnRlciBlbmQgb2YgY29udmVyc2lvbiwgYW5kIHN0b3BzIHVwb24gdHJpZ2dlciBldmVudC4gXAorTm90ZTogRmlyc3QgY29udmVyc2lvbiBpcyB1c2luZyBtaW5pbWFsIHNhbXBsaW5nIHRpbWUgICAgICAgICAgICAgIFwKKyAgICAgKHNlZSBAcmVmIEFEQ19IQUxfRUNfQ0hBTk5FTF9TQU1QTElOR1RJTUUpICovCisjZGVmaW5lIEFEQ19TQU1QTElOR19NT0RFX1RSSUdHRVJfQ09OVFJPTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfQ0ZHUjJfU01QVFJJRykgLyohPCBBREMgY29udmVyc2lvbnMgc2FtcGxpbmcgcGhhc2UgaXMgY29udHJvbGxlZCBcCisgIGJ5IHRyaWdnZXIgZXZlbnRzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRyaWdnZXIgcmlzaW5nIGVkZ2UgID0gc3RhcnQgc2FtcGxpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRyaWdnZXIgZmFsbGluZyBlZGdlID0gc3RvcCBzYW1wbGluZyBhbmQgc3RhcnQgY29udmVyc2lvbiAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0VPQ1NlbGVjdGlvbiBBREMgc2VxdWVuY2VyIGVuZCBvZiB1bml0YXJ5IGNvbnZlcnNpb24gb3IKKyAqIHNlcXVlbmNlIGNvbnZlcnNpb25zCisgKiBAeworICovCisjZGVmaW5lIEFEQ19FT0NfU0lOR0xFX0NPTlYgXAorICAoQURDX0lTUl9FT0MpIC8qITwgRW5kIG9mIHVuaXRhcnkgY29udmVyc2lvbiBmbGFnICAqLworI2RlZmluZSBBRENfRU9DX1NFUV9DT05WIFwKKyAgKEFEQ19JU1JfRU9TKSAvKiE8IEVuZCBvZiBzZXF1ZW5jZSBjb252ZXJzaW9ucyBmbGFnICAgICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBBRENfSEFMX0VDX1JFR19PVlJfREFUQV9CRUhBVklPUiAgQURDIGdyb3VwIHJlZ3VsYXIgLSBPdmVycnVuCisgKiBiZWhhdmlvciBvbiBjb252ZXJzaW9uIGRhdGEKKyAqIEB7CisgKi8KKyNkZWZpbmUgQURDX09WUl9EQVRBX1BSRVNFUlZFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX1JFR19PVlJfREFUQV9QUkVTRVJWRUQpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgYmVoYXZpb3IgaW4gY2FzZSBcCitvZiBvdmVycnVuOiBkYXRhIHByZXNlcnZlZCAqLworI2RlZmluZSBBRENfT1ZSX0RBVEFfT1ZFUldSSVRURU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKExMX0FEQ19SRUdfT1ZSX0RBVEFfT1ZFUldSSVRURU4pIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgYmVoYXZpb3IgaW4gY2FzZSBcCisgb2Ygb3ZlcnJ1bjogZGF0YSBvdmVyd3JpdHRlbiAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0hBTF9FQ19SRUdfU0VRX1JBTktTICBBREMgZ3JvdXAgcmVndWxhciAtIFNlcXVlbmNlciByYW5rcworICogQHsKKyAqLworI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzEgXAorICAoTExfQURDX1JFR19SQU5LXzEpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgMSAqLworI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzIgXAorICAoTExfQURDX1JFR19SQU5LXzIpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgMiAqLworI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzMgXAorICAoTExfQURDX1JFR19SQU5LXzMpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgMyAqLworI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzQgXAorICAoTExfQURDX1JFR19SQU5LXzQpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgNCAqLworI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzUgXAorICAoTExfQURDX1JFR19SQU5LXzUpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgNSAqLworI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzYgXAorICAoTExfQURDX1JFR19SQU5LXzYpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgNiAqLworI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzcgXAorICAoTExfQURDX1JFR19SQU5LXzcpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgNyAqLworI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzggXAorICAoTExfQURDX1JFR19SQU5LXzgpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgOCAqLworI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzkgXAorICAoTExfQURDX1JFR19SQU5LXzkpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgOSAqLworI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzEwIFwKKyAgKExMX0FEQ19SRUdfUkFOS18xMCkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgcmFuayAxMCAqLworI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzExIFwKKyAgKExMX0FEQ19SRUdfUkFOS18xMSkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgcmFuayAxMSAqLworI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzEyIFwKKyAgKExMX0FEQ19SRUdfUkFOS18xMikgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgcmFuayAxMiAqLworI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzEzIFwKKyAgKExMX0FEQ19SRUdfUkFOS18xMykgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgcmFuayAxMyAqLworI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzE0IFwKKyAgKExMX0FEQ19SRUdfUkFOS18xNCkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgcmFuayAxNCAqLworI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzE1IFwKKyAgKExMX0FEQ19SRUdfUkFOS18xNSkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgcmFuayAxNSAqLworI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzE2IFwKKyAgKExMX0FEQ19SRUdfUkFOS18xNikgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgcmFuayAxNiAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0hBTF9FQ19DSEFOTkVMX1NBTVBMSU5HVElNRSAgQ2hhbm5lbCAtIFNhbXBsaW5nIHRpbWUKKyAqIEB7CisgKi8KKyNkZWZpbmUgQURDX1NBTVBMRVRJTUVfMkNZQ0xFU181IFwKKyAgKExMX0FEQ19TQU1QTElOR1RJTUVfMkNZQ0xFU181KSAvKiE8IFNhbXBsaW5nIHRpbWUgMi41IEFEQyBjbG9jayBjeWNsZXMgKi8KKyNkZWZpbmUgQURDX1NBTVBMRVRJTUVfNkNZQ0xFU181IFwKKyAgKExMX0FEQ19TQU1QTElOR1RJTUVfNkNZQ0xFU181KSAvKiE8IFNhbXBsaW5nIHRpbWUgNi41IEFEQyBjbG9jayBjeWNsZXMgKi8KKyNkZWZpbmUgQURDX1NBTVBMRVRJTUVfMTJDWUNMRVNfNSBcCisgIChMTF9BRENfU0FNUExJTkdUSU1FXzEyQ1lDTEVTXzUpIC8qITwgU2FtcGxpbmcgdGltZSAxMi41IEFEQyBjbG9jayBjeWNsZXMgKi8KKyNkZWZpbmUgQURDX1NBTVBMRVRJTUVfMjRDWUNMRVNfNSBcCisgIChMTF9BRENfU0FNUExJTkdUSU1FXzI0Q1lDTEVTXzUpIC8qITwgU2FtcGxpbmcgdGltZSAyNC41IEFEQyBjbG9jayBjeWNsZXMgKi8KKyNkZWZpbmUgQURDX1NBTVBMRVRJTUVfNDdDWUNMRVNfNSBcCisgIChMTF9BRENfU0FNUExJTkdUSU1FXzQ3Q1lDTEVTXzUpIC8qITwgU2FtcGxpbmcgdGltZSA0Ny41IEFEQyBjbG9jayBjeWNsZXMgKi8KKyNkZWZpbmUgQURDX1NBTVBMRVRJTUVfOTJDWUNMRVNfNSBcCisgIChMTF9BRENfU0FNUExJTkdUSU1FXzkyQ1lDTEVTXzUpIC8qITwgU2FtcGxpbmcgdGltZSA5Mi41IEFEQyBjbG9jayBjeWNsZXMgKi8KKyNkZWZpbmUgQURDX1NBTVBMRVRJTUVfMjQ3Q1lDTEVTXzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKExMX0FEQ19TQU1QTElOR1RJTUVfMjQ3Q1lDTEVTXzUpIC8qITwgU2FtcGxpbmcgdGltZSAyNDcuNSBBREMgY2xvY2sgY3ljbGVzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBBRENfU0FNUExFVElNRV82NDBDWUNMRVNfNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX1NBTVBMSU5HVElNRV82NDBDWUNMRVNfNSkgLyohPCBTYW1wbGluZyB0aW1lIDY0MC41IEFEQyBjbG9jayBjeWNsZXMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFEQ19TQU1QTEVUSU1FXzNDWUNMRVNfNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX1NNUFIxX1NNUFBMVVMgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIExMX0FEQ19TQU1QTElOR1RJTUVfMkNZQ0xFU181KSAvKiE8IFNhbXBsaW5nIHRpbWUgMy41ICAgICAgICAgICAgICAgICBcCitBREMgY2xvY2sgY3ljbGVzLiBJZiBzZWxlY3RlZCwgdGhpcyBzYW1wbGluZyB0aW1lIHJlcGxhY2VzIHNhbXBsaW5nIHRpbWUgXAorMi41IEFEQyBjbG9jayBjeWNsZXMuIFRoZXNlIDIgc2FtcGxpbmcgdGltZXMgY2Fubm90IGJlIHVzZWQgc2ltdWx0YW5lb3VzbHkuICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBBRENfSEFMX0VDX0NIQU5ORUwgIEFEQyBpbnN0YW5jZSAtIENoYW5uZWwgbnVtYmVyCisgKiBAeworICovCisvKiBOb3RlOiBWcmVmSW50LCBUZW1wU2Vuc29yIGFuZCBWYmF0IGludGVybmFsIGNoYW5uZWxzIGFyZSBub3QgYXZhaWxhYmxlIG9uICAqLworLyogICAgICAgIGFsbCBBREMgaW5zdGFuY2VzIChyZWZlciB0byBSZWZlcmVuY2UgTWFudWFsKS4gICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfMCBcCisgIChMTF9BRENfQ0hBTk5FTF8wKSAvKiE8IEV4dGVybmFsIGNoYW5uZWwgKEdQSU8gcGluKSBBREN4X0lOMCAgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfMSBcCisgIChMTF9BRENfQ0hBTk5FTF8xKSAvKiE8IEV4dGVybmFsIGNoYW5uZWwgKEdQSU8gcGluKSBBREN4X0lOMSAgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfMiBcCisgIChMTF9BRENfQ0hBTk5FTF8yKSAvKiE8IEV4dGVybmFsIGNoYW5uZWwgKEdQSU8gcGluKSBBREN4X0lOMiAgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfMyBcCisgIChMTF9BRENfQ0hBTk5FTF8zKSAvKiE8IEV4dGVybmFsIGNoYW5uZWwgKEdQSU8gcGluKSBBREN4X0lOMyAgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfNCBcCisgIChMTF9BRENfQ0hBTk5FTF80KSAvKiE8IEV4dGVybmFsIGNoYW5uZWwgKEdQSU8gcGluKSBBREN4X0lONCAgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfNSBcCisgIChMTF9BRENfQ0hBTk5FTF81KSAvKiE8IEV4dGVybmFsIGNoYW5uZWwgKEdQSU8gcGluKSBBREN4X0lONSAgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfNiBcCisgIChMTF9BRENfQ0hBTk5FTF82KSAvKiE8IEV4dGVybmFsIGNoYW5uZWwgKEdQSU8gcGluKSBBREN4X0lONiAgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfNyBcCisgIChMTF9BRENfQ0hBTk5FTF83KSAvKiE8IEV4dGVybmFsIGNoYW5uZWwgKEdQSU8gcGluKSBBREN4X0lONyAgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfOCBcCisgIChMTF9BRENfQ0hBTk5FTF84KSAvKiE8IEV4dGVybmFsIGNoYW5uZWwgKEdQSU8gcGluKSBBREN4X0lOOCAgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfOSBcCisgIChMTF9BRENfQ0hBTk5FTF85KSAvKiE8IEV4dGVybmFsIGNoYW5uZWwgKEdQSU8gcGluKSBBREN4X0lOOSAgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfMTAgXAorICAoTExfQURDX0NIQU5ORUxfMTApIC8qITwgRXh0ZXJuYWwgY2hhbm5lbCAoR1BJTyBwaW4pIEFEQ3hfSU4xMCAqLworI2RlZmluZSBBRENfQ0hBTk5FTF8xMSBcCisgIChMTF9BRENfQ0hBTk5FTF8xMSkgLyohPCBFeHRlcm5hbCBjaGFubmVsIChHUElPIHBpbikgQURDeF9JTjExICovCisjZGVmaW5lIEFEQ19DSEFOTkVMXzEyIFwKKyAgKExMX0FEQ19DSEFOTkVMXzEyKSAvKiE8IEV4dGVybmFsIGNoYW5uZWwgKEdQSU8gcGluKSBBREN4X0lOMTIgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfMTMgXAorICAoTExfQURDX0NIQU5ORUxfMTMpIC8qITwgRXh0ZXJuYWwgY2hhbm5lbCAoR1BJTyBwaW4pIEFEQ3hfSU4xMyAqLworI2RlZmluZSBBRENfQ0hBTk5FTF8xNCBcCisgIChMTF9BRENfQ0hBTk5FTF8xNCkgLyohPCBFeHRlcm5hbCBjaGFubmVsIChHUElPIHBpbikgQURDeF9JTjE0ICovCisjZGVmaW5lIEFEQ19DSEFOTkVMXzE1IFwKKyAgKExMX0FEQ19DSEFOTkVMXzE1KSAvKiE8IEV4dGVybmFsIGNoYW5uZWwgKEdQSU8gcGluKSBBREN4X0lOMTUgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfMTYgXAorICAoTExfQURDX0NIQU5ORUxfMTYpIC8qITwgRXh0ZXJuYWwgY2hhbm5lbCAoR1BJTyBwaW4pIEFEQ3hfSU4xNiAqLworI2RlZmluZSBBRENfQ0hBTk5FTF8xNyBcCisgIChMTF9BRENfQ0hBTk5FTF8xNykgLyohPCBFeHRlcm5hbCBjaGFubmVsIChHUElPIHBpbikgQURDeF9JTjE3ICovCisjZGVmaW5lIEFEQ19DSEFOTkVMXzE4IFwKKyAgKExMX0FEQ19DSEFOTkVMXzE4KSAvKiE8IEV4dGVybmFsIGNoYW5uZWwgKEdQSU8gcGluKSBBREN4X0lOMTggKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfVlJFRklOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChMTF9BRENfQ0hBTk5FTF9WUkVGSU5UKSAvKiE8IEludGVybmFsIGNoYW5uZWwgVnJlZkludDogSW50ZXJuYWwgICAgXAordm9sdGFnZSByZWZlcmVuY2UuIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBBREMgY2hhbm5lbCBhdmFpbGFibGUgb24gYWxsIFwKK2luc3RhbmNlcyBidXQgQURDMi4gKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfVEVNUFNFTlNPUl9BREMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUl9BREMxKSAvKiE8IEludGVybmFsIGNoYW5uZWwgVGVtcGVyYXR1cmUgc2Vuc29yLiBcCisgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBBREMgY2hhbm5lbCBhdmFpbGFibGUgb25seSBvbiBBREMxIGluc3RhbmNlLiAqLworI2RlZmluZSBBRENfQ0hBTk5FTF9URU1QU0VOU09SX0FEQzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SX0FEQzUpIC8qITwgSW50ZXJuYWwgY2hhbm5lbCBUZW1wZXJhdHVyZSBzZW5zb3IuIFwKKyAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIEFEQyBjaGFubmVsIGF2YWlsYWJsZSBvbmx5IG9uIEFEQzUgaW5zdGFuY2UuICAgICAgICAgXAorICBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBBREM1IGF2YWlsYWJpbGl0eSAqLworI2RlZmluZSBBRENfQ0hBTk5FTF9WQkFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX0NIQU5ORUxfVkJBVCkgLyohPCBJbnRlcm5hbCBjaGFubmVsIFZiYXQvMzogVmJhdCB2b2x0YWdlICAgICAgICAgICAgXAordGhyb3VnaCBhIGRpdmlkZXIgbGFkZGVyIG9mIGZhY3RvciAxLzMgdG8gaGF2ZSBjaGFubmVsIHZvbHRhZ2UgYWx3YXlzIGJlbG93ICAgXAorVmRkYS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorT24gdGhpcyBTVE0zMiBzZXJpZXMsIEFEQyBjaGFubmVsIGF2YWlsYWJsZSBvbiBhbGwgSW5zdGFuY2VzIGJ1dCBBREMyICYgQURDNC4gXAorUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgQURDNCBhdmFpbGFiaWxpdHkgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfVk9QQU1QMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChMTF9BRENfQ0hBTk5FTF9WT1BBTVAxKSAvKiE8IEludGVybmFsIGNoYW5uZWwgT1BBTVAxIG91dHB1dC4gXAorT24gdGhpcyBTVE0zMiBzZXJpZXMsIEFEQyBjaGFubmVsIGF2YWlsYWJsZSBvbmx5IG9uIEFEQzEgaW5zdGFuY2UuICovCisjZGVmaW5lIEFEQ19DSEFOTkVMX1ZPUEFNUDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX0NIQU5ORUxfVk9QQU1QMikgLyohPCBJbnRlcm5hbCBjaGFubmVsIE9QQU1QMiBvdXRwdXQuIFwKK09uIHRoaXMgU1RNMzIgc2VyaWVzLCBBREMgY2hhbm5lbCBhdmFpbGFibGUgb25seSBvbiBBREMyIGluc3RhbmNlLiAqLworI2RlZmluZSBBRENfQ0hBTk5FTF9WT1BBTVAzX0FEQzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX0NIQU5ORUxfVk9QQU1QM19BREMyKSAvKiE8IEludGVybmFsIGNoYW5uZWwgT1BBTVAzIG91dHB1dC4gXAorT24gdGhpcyBTVE0zMiBzZXJpZXMsIEFEQyBjaGFubmVsIGF2YWlsYWJsZSBvbmx5IG9uIEFEQzIgaW5zdGFuY2UuICovCisjZGVmaW5lIEFEQ19DSEFOTkVMX1ZPUEFNUDNfQURDMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChMTF9BRENfQ0hBTk5FTF9WT1BBTVAzX0FEQzMpIC8qITwgSW50ZXJuYWwgY2hhbm5lbCBPUEFNUDMgb3V0cHV0LiBcCitPbiB0aGlzIFNUTTMyIHNlcmllcywgQURDIGNoYW5uZWwgYXZhaWxhYmxlIG9ubHkgb24gQURDMyBpbnN0YW5jZS4gICBcCitSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBBREMzIGF2YWlsYWJpbGl0eSAqLworI2RlZmluZSBBRENfQ0hBTk5FTF9WT1BBTVA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKExMX0FEQ19DSEFOTkVMX1ZPUEFNUDQpIC8qITwgSW50ZXJuYWwgY2hhbm5lbCBPUEFNUDQgb3V0cHV0LiAgICBcCitPbiB0aGlzIFNUTTMyIHNlcmllcywgQURDIGNoYW5uZWwgYXZhaWxhYmxlIG9ubHkgb24gQURDNSBpbnN0YW5jZS4gXAorUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgQURDNSBhdmFpbGFiaWxpdHkgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfVk9QQU1QNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChMTF9BRENfQ0hBTk5FTF9WT1BBTVA1KSAvKiE8IEludGVybmFsIGNoYW5uZWwgT1BBTVA1IG91dHB1dC4gICAgXAorT24gdGhpcyBTVE0zMiBzZXJpZXMsIEFEQyBjaGFubmVsIGF2YWlsYWJsZSBvbmx5IG9uIEFEQzUgaW5zdGFuY2UuIFwKK1JlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIEFEQzUgYXZhaWxhYmlsaXR5ICovCisjZGVmaW5lIEFEQ19DSEFOTkVMX1ZPUEFNUDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX0NIQU5ORUxfVk9QQU1QNikgLyohPCBJbnRlcm5hbCBjaGFubmVsIE9QQU1QNiBvdXRwdXQuICAgIFwKK09uIHRoaXMgU1RNMzIgc2VyaWVzLCBBREMgY2hhbm5lbCBhdmFpbGFibGUgb25seSBvbiBBREM0IGluc3RhbmNlLiBcCitSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBBREM0IGF2YWlsYWJpbGl0eSAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0hBTF9FQ19BV0RfTlVNQkVSIEFuYWxvZyB3YXRjaGRvZyAtIEFEQyBhbmFsb2cgd2F0Y2hkb2cgKEFXRCkKKyAqIG51bWJlcgorICogQHsKKyAqLworI2RlZmluZSBBRENfQU5BTE9HV0FUQ0hET0dfMSAgICAgICAgICAgICAgICAgICAgICBcCisgIChMTF9BRENfQVdEMSkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG51bWJlciAxIFwKKyAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQURDX0FOQUxPR1dBVENIRE9HXzIgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX0FXRDIpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBudW1iZXIgMiBcCisgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFEQ19BTkFMT0dXQVRDSERPR18zICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKExMX0FEQ19BV0QzKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbnVtYmVyIDMgXAorICAgICAgICAgICAgICAgICAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX2FuYWxvZ193YXRjaGRvZ19maWx0ZXJpbmdfY29uZmlnIEFEQyBhbmFsb2cgd2F0Y2hkb2cgKEFXRCkKKyAqIGZpbHRlcmluZyBjb25maWd1cmF0aW9uCisgKiBAeworICovCisjZGVmaW5lIEFEQ19BV0RfRklMVEVSSU5HX05PTkUgICAgICAgICAgICAgICAgICBcCisgICgweDAwMDAwMDAwVUwpIC8qITwgQURDIEFXRCBubyBmaWx0ZXJpbmcsIG9uZSBcCitvdXQtb2Ytd2luZG93IHNhbXBsZSB0byByYWlzZSBmbGFnIG9yIGludGVycnVwdCAqLworI2RlZmluZSBBRENfQVdEX0ZJTFRFUklOR18yU0FNUExFUyAgICAgICAgICAgICAgICAgIFwKKyAgKChBRENfVFIxX0FXREZJTFRfMCkpIC8qITwgQURDIEFXRCAyIGNvbnNlY3V0aXZlcyBcCitvdXQtb2Ytd2luZG93IHNhbXBsZXMgdG8gcmFpc2UgZmxhZyBvciBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgQURDX0FXRF9GSUxURVJJTkdfM1NBTVBMRVMgICAgICAgICAgICAgICAgICBcCisgICgoQURDX1RSMV9BV0RGSUxUXzEpKSAvKiE8IEFEQyBBV0QgMyBjb25zZWN1dGl2ZXMgXAorb3V0LW9mLXdpbmRvdyBzYW1wbGVzIHRvIHJhaXNlIGZsYWcgb3IgaW50ZXJydXB0ICovCisjZGVmaW5lIEFEQ19BV0RfRklMVEVSSU5HXzRTQU1QTEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoQURDX1RSMV9BV0RGSUxUXzEgfCBBRENfVFIxX0FXREZJTFRfMCkpIC8qITwgQURDIEFXRCA0IGNvbnNlY3V0aXZlcyBcCisgIG91dC1vZi13aW5kb3cgc2FtcGxlcyB0byByYWlzZSBmbGFnIG9yIGludGVycnVwdCAqLworI2RlZmluZSBBRENfQVdEX0ZJTFRFUklOR181U0FNUExFUyAgICAgICAgICAgICAgICAgIFwKKyAgKChBRENfVFIxX0FXREZJTFRfMikpIC8qITwgQURDIEFXRCA1IGNvbnNlY3V0aXZlcyBcCitvdXQtb2Ytd2luZG93IHNhbXBsZXMgdG8gcmFpc2UgZmxhZyBvciBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgQURDX0FXRF9GSUxURVJJTkdfNlNBTVBMRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChBRENfVFIxX0FXREZJTFRfMiB8IEFEQ19UUjFfQVdERklMVF8wKSkgLyohPCBBREMgQVdEIDYgY29uc2VjdXRpdmVzIFwKKyAgb3V0LW9mLXdpbmRvdyBzYW1wbGVzIHRvIHJhaXNlIGZsYWcgb3IgaW50ZXJydXB0ICovCisjZGVmaW5lIEFEQ19BV0RfRklMVEVSSU5HXzdTQU1QTEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoQURDX1RSMV9BV0RGSUxUXzIgfCBBRENfVFIxX0FXREZJTFRfMSkpIC8qITwgQURDIEFXRCA3IGNvbnNlY3V0aXZlcyBcCisgIG91dC1vZi13aW5kb3cgc2FtcGxlcyB0byByYWlzZSBmbGFnIG9yIGludGVycnVwdCAqLworI2RlZmluZSBBRENfQVdEX0ZJTFRFUklOR184U0FNUExFUyAgICAgICAgICAgICAgICAgIFwKKyAgKChBRENfVFIxX0FXREZJTFRfMiB8IEFEQ19UUjFfQVdERklMVF8xIHwgICAgICAgICBcCisgICAgQURDX1RSMV9BV0RGSUxUXzApKSAvKiE8IEFEQyBBV0QgOCBjb25zZWN1dGl2ZXMgXAorb3V0LW9mLXdpbmRvdyBzYW1wbGVzIHRvIHJhaXNlIGZsYWcgb3IgaW50ZXJydXB0ICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBBRENfYW5hbG9nX3dhdGNoZG9nX21vZGUgQURDIGFuYWxvZyB3YXRjaGRvZyAoQVdEKSBtb2RlCisgKiBAeworICovCisjZGVmaW5lIEFEQ19BTkFMT0dXQVRDSERPR19OT05FICgweDAwMDAwMDAwVUwpIC8qITwgQURDIEFXRCBub3Qgc2VsZWN0ZWQgKi8KKyNkZWZpbmUgQURDX0FOQUxPR1dBVENIRE9HX1NJTkdMRV9SRUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfQ0ZHUl9BV0QxU0dMIHwgQURDX0NGR1JfQVdEMUVOKSAvKiE8IEFEQyBBV0QgYXBwbGllZCB0byBhIHJlZ3VsYXIgXAorZ3JvdXAgc2luZ2xlIGNoYW5uZWwgKi8KKyNkZWZpbmUgQURDX0FOQUxPR1dBVENIRE9HX1NJTkdMRV9JTkpFQyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfQ0ZHUl9BV0QxU0dMIHwgQURDX0NGR1JfSkFXRDFFTikgLyohPCBBREMgQVdEIGFwcGxpZWQgdG8gYW4gXAorIGluamVjdGVkIGdyb3VwIHNpbmdsZSBjaGFubmVsICovCisjZGVmaW5lIEFEQ19BTkFMT0dXQVRDSERPR19TSU5HTEVfUkVHSU5KRUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0NGR1JfQVdEMVNHTCB8IEFEQ19DRkdSX0FXRDFFTiB8IEFEQ19DRkdSX0pBV0QxRU4pIC8qITwgQURDIEFXRCBhcHBsaWVkIFwKKyAgICAgICAgICAgICAgICAgIHRvIGEgcmVndWxhciBhbmQgaW5qZWN0ZWQgZ3JvdXBzIHNpbmdsZSBjaGFubmVsICovCisjZGVmaW5lIEFEQ19BTkFMT0dXQVRDSERPR19BTExfUkVHICAgICAgICAgICAgICAgICAgXAorICAoQURDX0NGR1JfQVdEMUVOKSAvKiE8IEFEQyBBV0QgYXBwbGllZCB0byByZWd1bGFyIFwKK2dyb3VwIGFsbCBjaGFubmVscyAqLworI2RlZmluZSBBRENfQU5BTE9HV0FUQ0hET0dfQUxMX0lOSkVDICAgICAgICAgICAgICAgICAgXAorICAoQURDX0NGR1JfSkFXRDFFTikgLyohPCBBREMgQVdEIGFwcGxpZWQgdG8gaW5qZWN0ZWQgXAorZ3JvdXAgYWxsIGNoYW5uZWxzICovCisjZGVmaW5lIEFEQ19BTkFMT0dXQVRDSERPR19BTExfUkVHSU5KRUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19DRkdSX0FXRDFFTiB8IEFEQ19DRkdSX0pBV0QxRU4pIC8qITwgQURDIEFXRCBhcHBsaWVkIHRvIHJlZ3VsYXIgXAorYW5kIGluamVjdGVkIGdyb3VwcyBhbGwgY2hhbm5lbHMgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEFEQ19IQUxfRUNfT1ZTX1JBVElPICBPdmVyc2FtcGxpbmcgLSBSYXRpbworICogQHsKKyAqLworLyoqCisgKiBAbm90ZSBUaGUgb3ZlcnNhbXBsaW5nIHJhdGlvIGlzIHRoZSBudW1iZXIgb2YgQURDIGNvbnZlcnNpb25zIHBlcmZvcm1lZCwgc3VtCisgKiBvZiB0aGVzZSBjb252ZXJzaW9ucyBkYXRhIGlzIGNvbXB1dGVkIHRvIHJlc3VsdCBhcyB0aGUgQURDIG92ZXJzYW1wbGluZworICogY29udmVyc2lvbiBkYXRhIChiZWZvcmUgcG90ZW50aWFsIHNoaWZ0KQorICovCisjZGVmaW5lIEFEQ19PVkVSU0FNUExJTkdfUkFUSU9fMiBcCisgIChMTF9BRENfT1ZTX1JBVElPXzIpIC8qITwgQURDIG92ZXJzYW1wbGluZyByYXRpbyAgICAyICovCisjZGVmaW5lIEFEQ19PVkVSU0FNUExJTkdfUkFUSU9fNCBcCisgIChMTF9BRENfT1ZTX1JBVElPXzQpIC8qITwgQURDIG92ZXJzYW1wbGluZyByYXRpbyAgICA0ICovCisjZGVmaW5lIEFEQ19PVkVSU0FNUExJTkdfUkFUSU9fOCBcCisgIChMTF9BRENfT1ZTX1JBVElPXzgpIC8qITwgQURDIG92ZXJzYW1wbGluZyByYXRpbyAgICA4ICovCisjZGVmaW5lIEFEQ19PVkVSU0FNUExJTkdfUkFUSU9fMTYgXAorICAoTExfQURDX09WU19SQVRJT18xNikgLyohPCBBREMgb3ZlcnNhbXBsaW5nIHJhdGlvICAgMTYgKi8KKyNkZWZpbmUgQURDX09WRVJTQU1QTElOR19SQVRJT18zMiBcCisgIChMTF9BRENfT1ZTX1JBVElPXzMyKSAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgcmF0aW8gICAzMiAqLworI2RlZmluZSBBRENfT1ZFUlNBTVBMSU5HX1JBVElPXzY0IFwKKyAgKExMX0FEQ19PVlNfUkFUSU9fNjQpIC8qITwgQURDIG92ZXJzYW1wbGluZyByYXRpbyAgIDY0ICovCisjZGVmaW5lIEFEQ19PVkVSU0FNUExJTkdfUkFUSU9fMTI4IFwKKyAgKExMX0FEQ19PVlNfUkFUSU9fMTI4KSAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgcmF0aW8gIDEyOCAqLworI2RlZmluZSBBRENfT1ZFUlNBTVBMSU5HX1JBVElPXzI1NiBcCisgIChMTF9BRENfT1ZTX1JBVElPXzI1NikgLyohPCBBREMgb3ZlcnNhbXBsaW5nIHJhdGlvICAyNTYgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEFEQ19IQUxfRUNfT1ZTX1NISUZUICBPdmVyc2FtcGxpbmcgLSBEYXRhIHNoaWZ0CisgKiBAeworICovCisvKioKKyAqIEBub3RlIFRoZSBzdW0gb2YgdGhlIEFEQyBjb252ZXJzaW9ucyBkYXRhIGlzIGRpdmlkZWQgYnkgIlJpZ2h0Yml0c2hpZnQiCisgKiBudW1iZXIgdG8gcmVzdWx0IGFzIHRoZSBBREMgb3ZlcnNhbXBsaW5nIGNvbnZlcnNpb24gZGF0YSkKKyAqLworI2RlZmluZSBBRENfUklHSFRCSVRTSElGVF9OT05FIFwKKyAgKExMX0FEQ19PVlNfU0hJRlRfTk9ORSkgLyohPCBBREMgb3ZlcnNhbXBsaW5nIG5vIHNoaWZ0ICAgKi8KKyNkZWZpbmUgQURDX1JJR0hUQklUU0hJRlRfMSBcCisgIChMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzEpIC8qITwgQURDIG92ZXJzYW1wbGluZyByaWdodCBzaGlmdCBvZiAxIHJhbmtzICovCisjZGVmaW5lIEFEQ19SSUdIVEJJVFNISUZUXzIgXAorICAoTExfQURDX09WU19TSElGVF9SSUdIVF8yKSAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgcmlnaHQgc2hpZnQgb2YgMiByYW5rcyAqLworI2RlZmluZSBBRENfUklHSFRCSVRTSElGVF8zIFwKKyAgKExMX0FEQ19PVlNfU0hJRlRfUklHSFRfMykgLyohPCBBREMgb3ZlcnNhbXBsaW5nIHJpZ2h0IHNoaWZ0IG9mIDMgcmFua3MgKi8KKyNkZWZpbmUgQURDX1JJR0hUQklUU0hJRlRfNCBcCisgIChMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzQpIC8qITwgQURDIG92ZXJzYW1wbGluZyByaWdodCBzaGlmdCBvZiA0IHJhbmtzICovCisjZGVmaW5lIEFEQ19SSUdIVEJJVFNISUZUXzUgXAorICAoTExfQURDX09WU19TSElGVF9SSUdIVF81KSAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgcmlnaHQgc2hpZnQgb2YgNSByYW5rcyAqLworI2RlZmluZSBBRENfUklHSFRCSVRTSElGVF82IFwKKyAgKExMX0FEQ19PVlNfU0hJRlRfUklHSFRfNikgLyohPCBBREMgb3ZlcnNhbXBsaW5nIHJpZ2h0IHNoaWZ0IG9mIDYgcmFua3MgKi8KKyNkZWZpbmUgQURDX1JJR0hUQklUU0hJRlRfNyBcCisgIChMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzcpIC8qITwgQURDIG92ZXJzYW1wbGluZyByaWdodCBzaGlmdCBvZiA3IHJhbmtzICovCisjZGVmaW5lIEFEQ19SSUdIVEJJVFNISUZUXzggXAorICAoTExfQURDX09WU19TSElGVF9SSUdIVF84KSAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgcmlnaHQgc2hpZnQgb2YgOCByYW5rcyAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0hBTF9FQ19PVlNfRElTQ09OVF9NT0RFICBPdmVyc2FtcGxpbmcgLSBEaXNjb250aW51b3VzIG1vZGUKKyAqIEB7CisgKi8KKyNkZWZpbmUgQURDX1RSSUdHRVJFRE1PREVfU0lOR0xFX1RSSUdHRVIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKExMX0FEQ19PVlNfUkVHX0NPTlQpIC8qITwgQURDIG92ZXJzYW1wbGluZyBkaXNjb250aW51b3VzIG1vZGU6IFwKK2NvbnRpbnVvdXMgbW9kZSAoYWxsIGNvbnZlcnNpb25zIG9mIE9WUyByYXRpbyBhcmUgZG9uZSBmcm9tIDEgdHJpZ2dlcikgKi8KKyNkZWZpbmUgQURDX1RSSUdHRVJFRE1PREVfTVVMVElfVFJJR0dFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKExMX0FEQ19PVlNfUkVHX0RJU0NPTlQpIC8qITwgQURDIG92ZXJzYW1wbGluZyBkaXNjb250aW51b3VzIG1vZGU6IFwKK2Rpc2NvbnRpbnVvdXMgbW9kZSAoZWFjaCBjb252ZXJzaW9uIG9mIE9WUyByYXRpbyBuZWVkcyBhIHRyaWdnZXIpICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBBRENfSEFMX0VDX09WU19TQ09QRV9SRUcgIE92ZXJzYW1wbGluZyAtIE92ZXJzYW1wbGluZyBzY29wZSBmb3IKKyAqIEFEQyBncm91cCByZWd1bGFyCisgKiBAeworICovCisjZGVmaW5lIEFEQ19SRUdPVkVSU0FNUExJTkdfQ09OVElOVUVEX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX09WU19HUlBfUkVHVUxBUl9DT05USU5VRUQpIC8qITwgT3ZlcnNhbXBsaW5nIGJ1ZmZlciBtYWludGFpbmVkIFwKKyAgZHVyaW5nIGluamVjdGlvbiBzZXF1ZW5jZSAqLworI2RlZmluZSBBRENfUkVHT1ZFUlNBTVBMSU5HX1JFU1VNRURfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChMTF9BRENfT1ZTX0dSUF9SRUdVTEFSX1JFU1VNRUQpIC8qITwgT3ZlcnNhbXBsaW5nIGJ1ZmZlciB6ZXJvZWQgZHVyaW5nIFwKK2luamVjdGlvbiBzZXF1ZW5jZSAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0V2ZW50X3R5cGUgQURDIEV2ZW50IHR5cGUKKyAqIEB7CisgKi8KKy8qKgorICogQG5vdGUgQW5hbG9nIHdhdGNoZG9nIDEgaXMgYXZhaWxhYmxlIG9uIGFsbCBzdG0zMiBzZXJpZXMKKyAqICAgICAgIEFuYWxvZyB3YXRjaGRvZyAyIGFuZCAzIGFyZSBub3QgYXZhaWxhYmxlIG9uIGFsbCBzZXJpZXMKKyAqLworI2RlZmluZSBBRENfRU9TTVBfRVZFTlQgKEFEQ19GTEFHX0VPU01QKSAvKiE8IEFEQyBFbmQgb2YgU2FtcGxpbmcgZXZlbnQgKi8KKyNkZWZpbmUgQURDX0FXRDFfRVZFTlQgXAorICAoQURDX0ZMQUdfQVdEMSkgLyohPCBBREMgQW5hbG9nIHdhdGNoZG9nIDEgZXZlbnQgKG1haW4gYW5hbG9nIHdhdGNoZG9nKSAqLworI2RlZmluZSBBRENfQVdEMl9FVkVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19GTEFHX0FXRDIpIC8qITwgQURDIEFuYWxvZyB3YXRjaGRvZyAyIGV2ZW50IChhZGRpdGlvbmFsIGFuYWxvZyBcCisgICAgICAgICAgICAgICAgICAgICB3YXRjaGRvZykgKi8KKyNkZWZpbmUgQURDX0FXRDNfRVZFTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfRkxBR19BV0QzKSAvKiE8IEFEQyBBbmFsb2cgd2F0Y2hkb2cgMyBldmVudCAoYWRkaXRpb25hbCBhbmFsb2cgXAorICAgICAgICAgICAgICAgICAgICAgd2F0Y2hkb2cpICovCisjZGVmaW5lIEFEQ19PVlJfRVZFTlQgKEFEQ19GTEFHX09WUikgLyohPCBBREMgb3ZlcnJ1biBldmVudCAqLworI2RlZmluZSBBRENfSlFPVkZfRVZFTlQgXAorICAoQURDX0ZMQUdfSlFPVkYpIC8qITwgQURDIEluamVjdGVkIENvbnRleHQgUXVldWUgT3ZlcmZsb3cgZXZlbnQgKi8KKy8qKgorICogQH0KKyAqLworI2RlZmluZSBBRENfQVdEX0VWRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQURDX0FXRDFfRVZFTlQgLyohPCBBREMgQW5hbG9nIHdhdGNoZG9nIDEgZXZlbnQ6IE5hbWluZyBmb3IgY29tcGF0aWJpbGl0eSAgICBcCisgICAgICAgICAgICAgICAgICAgICAgd2l0aCBvdGhlciBTVE0zMiBkZXZpY2VzIGhhdmluZyBvbmx5IG9uZSBhbmFsb2cgd2F0Y2hkb2cgXAorICAgICAgICAgICAgICAgICAgKi8KKworLyoqIEBkZWZncm91cCBBRENfaW50ZXJydXB0c19kZWZpbml0aW9uIEFEQyBpbnRlcnJ1cHRzIGRlZmluaXRpb24KKyAqIEB7CisgKi8KKyNkZWZpbmUgQURDX0lUX1JEWSBBRENfSUVSX0FEUkRZSUUgLyohPCBBREMgUmVhZHkgaW50ZXJydXB0IHNvdXJjZSAqLworI2RlZmluZSBBRENfSVRfRU9TTVAgXAorICBBRENfSUVSX0VPU01QSUUgLyohPCBBREMgRW5kIG9mIHNhbXBsaW5nIGludGVycnVwdCBzb3VyY2UgKi8KKyNkZWZpbmUgQURDX0lUX0VPQyBcCisgIEFEQ19JRVJfRU9DSUUgLyohPCBBREMgRW5kIG9mIHJlZ3VsYXIgY29udmVyc2lvbiBpbnRlcnJ1cHQgc291cmNlICovCisjZGVmaW5lIEFEQ19JVF9FT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQURDX0lFUl9FT1NJRSAvKiE8IEFEQyBFbmQgb2YgcmVndWxhciBzZXF1ZW5jZSBvZiBjb252ZXJzaW9ucyBpbnRlcnJ1cHQgXAorICAgICAgICAgICAgICAgICAgIHNvdXJjZSAqLworI2RlZmluZSBBRENfSVRfT1ZSIEFEQ19JRVJfT1ZSSUUgLyohPCBBREMgb3ZlcnJ1biBpbnRlcnJ1cHQgc291cmNlICovCisjZGVmaW5lIEFEQ19JVF9KRU9DIFwKKyAgQURDX0lFUl9KRU9DSUUgLyohPCBBREMgRW5kIG9mIGluamVjdGVkIGNvbnZlcnNpb24gaW50ZXJydXB0IHNvdXJjZSAqLworI2RlZmluZSBBRENfSVRfSkVPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQURDX0lFUl9KRU9TSUUgLyohPCBBREMgRW5kIG9mIGluamVjdGVkIHNlcXVlbmNlIG9mIGNvbnZlcnNpb25zIGludGVycnVwdCBcCisgICAgICAgICAgICAgICAgICAgIHNvdXJjZSAqLworI2RlZmluZSBBRENfSVRfQVdEMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEFEQ19JRVJfQVdEMUlFIC8qITwgQURDIEFuYWxvZyB3YXRjaGRvZyAxIGludGVycnVwdCBzb3VyY2UgKG1haW4gYW5hbG9nIFwKKyAgICAgICAgICAgICAgICAgICAgd2F0Y2hkb2cpICovCisjZGVmaW5lIEFEQ19JVF9BV0QyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBRENfSUVSX0FXRDJJRSAvKiE8IEFEQyBBbmFsb2cgd2F0Y2hkb2cgMiBpbnRlcnJ1cHQgc291cmNlIChhZGRpdGlvbmFsIFwKK2FuYWxvZyB3YXRjaGRvZykgKi8KKyNkZWZpbmUgQURDX0lUX0FXRDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEFEQ19JRVJfQVdEM0lFIC8qITwgQURDIEFuYWxvZyB3YXRjaGRvZyAzIGludGVycnVwdCBzb3VyY2UgKGFkZGl0aW9uYWwgXAorYW5hbG9nIHdhdGNoZG9nKSAqLworI2RlZmluZSBBRENfSVRfSlFPVkYgXAorICBBRENfSUVSX0pRT1ZGSUUgLyohPCBBREMgSW5qZWN0ZWQgQ29udGV4dCBRdWV1ZSBPdmVyZmxvdyBpbnRlcnJ1cHQgc291cmNlICovCisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEFEQ19mbGFnc19kZWZpbml0aW9uIEFEQyBmbGFncyBkZWZpbml0aW9uCisgKiBAeworICovCisjZGVmaW5lIEFEQ19GTEFHX1JEWSBBRENfSVNSX0FEUkRZICAgLyohPCBBREMgUmVhZHkgZmxhZyAqLworI2RlZmluZSBBRENfRkxBR19FT1NNUCBBRENfSVNSX0VPU01QIC8qITwgQURDIEVuZCBvZiBTYW1wbGluZyBmbGFnICovCisjZGVmaW5lIEFEQ19GTEFHX0VPQyBBRENfSVNSX0VPQyAgICAgLyohPCBBREMgRW5kIG9mIFJlZ3VsYXIgQ29udmVyc2lvbiBmbGFnICovCisjZGVmaW5lIEFEQ19GTEFHX0VPUyBcCisgIEFEQ19JU1JfRU9TIC8qITwgQURDIEVuZCBvZiBSZWd1bGFyIHNlcXVlbmNlIG9mIENvbnZlcnNpb25zIGZsYWcgKi8KKyNkZWZpbmUgQURDX0ZMQUdfT1ZSIEFEQ19JU1JfT1ZSICAgLyohPCBBREMgb3ZlcnJ1biBmbGFnICovCisjZGVmaW5lIEFEQ19GTEFHX0pFT0MgQURDX0lTUl9KRU9DIC8qITwgQURDIEVuZCBvZiBJbmplY3RlZCBDb252ZXJzaW9uIGZsYWcgKi8KKyNkZWZpbmUgQURDX0ZMQUdfSkVPUyBcCisgIEFEQ19JU1JfSkVPUyAvKiE8IEFEQyBFbmQgb2YgSW5qZWN0ZWQgc2VxdWVuY2Ugb2YgQ29udmVyc2lvbnMgZmxhZyAqLworI2RlZmluZSBBRENfRkxBR19BV0QxIFwKKyAgQURDX0lTUl9BV0QxIC8qITwgQURDIEFuYWxvZyB3YXRjaGRvZyAxIGZsYWcgKG1haW4gYW5hbG9nIHdhdGNoZG9nKSAqLworI2RlZmluZSBBRENfRkxBR19BV0QyIFwKKyAgQURDX0lTUl9BV0QyIC8qITwgQURDIEFuYWxvZyB3YXRjaGRvZyAyIGZsYWcgKGFkZGl0aW9uYWwgYW5hbG9nIHdhdGNoZG9nKSAqLworI2RlZmluZSBBRENfRkxBR19BV0QzIFwKKyAgQURDX0lTUl9BV0QzIC8qITwgQURDIEFuYWxvZyB3YXRjaGRvZyAzIGZsYWcgKGFkZGl0aW9uYWwgYW5hbG9nIHdhdGNoZG9nKSAqLworI2RlZmluZSBBRENfRkxBR19KUU9WRiBcCisgIEFEQ19JU1JfSlFPVkYgLyohPCBBREMgSW5qZWN0ZWQgQ29udGV4dCBRdWV1ZSBPdmVyZmxvdyBmbGFnICovCisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBBRENfUHJpdmF0ZV9NYWNyb3MgQURDIFByaXZhdGUgTWFjcm9zCisgKiBAeworICovCisvKiBNYWNybyByZXNlcnZlZCBmb3IgaW50ZXJuYWwgSEFMIGRyaXZlciB1c2FnZSwgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgaW4gICAqLworLyogY29kZSBvZiBmaW5hbCB1c2VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyoqCisgKiBAYnJpZWYgUmV0dXJuIHJlc29sdXRpb24gYml0cyBpbiBDRkdSIHJlZ2lzdGVyIFJFU1sxOjBdIGZpZWxkLgorICogQHBhcmFtIF9fSEFORExFX18gQURDIGhhbmRsZQorICogQHJldHZhbCBWYWx1ZSBvZiBiaXRmaWVsZCBSRVMgaW4gQ0ZHUiByZWdpc3Rlci4KKyAqLworI2RlZmluZSBBRENfR0VUX1JFU09MVVRJT04oX19IQU5ETEVfXykgXAorICAoTExfQURDX0dldFJlc29sdXRpb24oKF9fSEFORExFX18pLT5JbnN0YW5jZSkpCisKKy8qKgorICogQGJyaWVmIENsZWFyIEFEQyBlcnJvciBjb2RlIChzZXQgaXQgdG8gbm8gZXJyb3IgY29kZSAiSEFMX0FEQ19FUlJPUl9OT05FIikuCisgKiBAcGFyYW0gX19IQU5ETEVfXyBBREMgaGFuZGxlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBBRENfQ0xFQVJfRVJST1JDT0RFKF9fSEFORExFX18pIFwKKyAgKChfX0hBTkRMRV9fKS0+RXJyb3JDb2RlID0gSEFMX0FEQ19FUlJPUl9OT05FKQorCisvKioKKyAqIEBicmllZiBTaW11bHRhbmVvdXNseSBjbGVhciBhbmQgc2V0IHNwZWNpZmljIGJpdHMgb2YgdGhlIGhhbmRsZSBTdGF0ZS4KKyAqIEBub3RlICBBRENfU1RBVEVfQ0xSX1NFVCgpIG1hY3JvIGlzIG1lcmVseSBhbGlhc2VkIHRvIGdlbmVyaWMgbWFjcm8KKyAqIE1PRElGWV9SRUcoKSwgdGhlIGZpcnN0IHBhcmFtZXRlciBpcyB0aGUgQURDIGhhbmRsZSBTdGF0ZSwgdGhlIHNlY29uZAorICogcGFyYW1ldGVyIGlzIHRoZSBiaXQgZmllbGQgdG8gY2xlYXIsIHRoZSB0aGlyZCBhbmQgbGFzdCBwYXJhbWV0ZXIgaXMgdGhlIGJpdAorICogZmllbGQgdG8gc2V0LgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgQURDX1NUQVRFX0NMUl9TRVQgTU9ESUZZX1JFRworCisvKioKKyAqIEBicmllZiBWZXJpZnkgdGhhdCBhIGdpdmVuIHZhbHVlIGlzIGFsaWduZWQgd2l0aCB0aGUgQURDIHJlc29sdXRpb24gcmFuZ2UuCisgKiBAcGFyYW0gX19SRVNPTFVUSU9OX18gQURDIHJlc29sdXRpb24gKDEyLCAxMCwgOCBvciA2IGJpdHMpLgorICogQHBhcmFtIF9fQURDX1ZBTFVFX18gdmFsdWUgY2hlY2tlZCBhZ2FpbnN0IHRoZSByZXNvbHV0aW9uLgorICogQHJldHZhbCBTRVQgKF9fQURDX1ZBTFVFX18gaW4gbGluZSB3aXRoIF9fUkVTT0xVVElPTl9fKSBvciBSRVNFVAorICogKF9fQURDX1ZBTFVFX18gbm90IGluIGxpbmUgd2l0aCBfX1JFU09MVVRJT05fXykKKyAqLworI2RlZmluZSBJU19BRENfUkFOR0UoX19SRVNPTFVUSU9OX18sIF9fQURDX1ZBTFVFX18pIFwKKyAgKChfX0FEQ19WQUxVRV9fKSA8PSBfX0xMX0FEQ19ESUdJVEFMX1NDQUxFKF9fUkVTT0xVVElPTl9fKSkKKworLyoqCisgKiBAYnJpZWYgVmVyaWZ5IHRoZSBsZW5ndGggb2YgdGhlIHNjaGVkdWxlZCByZWd1bGFyIGNvbnZlcnNpb25zIGdyb3VwLgorICogQHBhcmFtIF9fTEVOR1RIX18gbnVtYmVyIG9mIHByb2dyYW1tZWQgY29udmVyc2lvbnMuCisgKiBAcmV0dmFsIFNFVCAoX19MRU5HVEhfXyBpcyB3aXRoaW4gdGhlIG1heGltdW0gbnVtYmVyIG9mIHBvc3NpYmxlIHByb2dyYW1tYWJsZQorICogcmVndWxhciBjb252ZXJzaW9ucykgb3IgUkVTRVQgKF9fTEVOR1RIX18gaXMgbnVsbCBvciB0b28gbGFyZ2UpCisgKi8KKyNkZWZpbmUgSVNfQURDX1JFR1VMQVJfTkJfQ09OVihfX0xFTkdUSF9fKSBcCisgICgoKF9fTEVOR1RIX18pID49ICgxVUwpKSAmJiAoKF9fTEVOR1RIX18pIDw9ICgxNlVMKSkpCisKKy8qKgorICogQGJyaWVmIFZlcmlmeSB0aGUgbnVtYmVyIG9mIHNjaGVkdWxlZCByZWd1bGFyIGNvbnZlcnNpb25zIGluIGRpc2NvbnRpbnVvdXMKKyAqIG1vZGUuCisgKiBAcGFyYW0gTlVNQkVSIG51bWJlciBvZiBzY2hlZHVsZWQgcmVndWxhciBjb252ZXJzaW9ucyBpbiBkaXNjb250aW51b3VzIG1vZGUuCisgKiBAcmV0dmFsIFNFVCAoTlVNQkVSIGlzIHdpdGhpbiB0aGUgbWF4aW11bSBudW1iZXIgb2YgcmVndWxhciBjb252ZXJzaW9ucyBpbgorICogZGlzY29udGludW91cyBtb2RlKSBvciBSRVNFVCAoTlVNQkVSIGlzIG51bGwgb3IgdG9vIGxhcmdlKQorICovCisjZGVmaW5lIElTX0FEQ19SRUdVTEFSX0RJU0NPTlRfTlVNQkVSKE5VTUJFUikgXAorICAoKChOVU1CRVIpID49ICgxVUwpKSAmJiAoKE5VTUJFUikgPD0gKDhVTCkpKQorCisvKioKKyAqIEBicmllZiBWZXJpZnkgdGhlIEFEQyBjbG9jayBzZXR0aW5nLgorICogQHBhcmFtIF9fQURDX0NMT0NLX18gcHJvZ3JhbW1lZCBBREMgY2xvY2suCisgKiBAcmV0dmFsIFNFVCAoX19BRENfQ0xPQ0tfXyBpcyBhIHZhbGlkIHZhbHVlKSBvciBSRVNFVCAoX19BRENfQ0xPQ0tfXyBpcworICogaW52YWxpZCkKKyAqLworI2RlZmluZSBJU19BRENfQ0xPQ0tQUkVTQ0FMRVIoX19BRENfQ0xPQ0tfXykgICAgICAgIFwKKyAgKCgoX19BRENfQ0xPQ0tfXykgPT0gQURDX0NMT0NLX1NZTkNfUENMS19ESVYxKSB8fCBcCisgICAoKF9fQURDX0NMT0NLX18pID09IEFEQ19DTE9DS19TWU5DX1BDTEtfRElWMikgfHwgXAorICAgKChfX0FEQ19DTE9DS19fKSA9PSBBRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjQpIHx8IFwKKyAgICgoX19BRENfQ0xPQ0tfXykgPT0gQURDX0NMT0NLX0FTWU5DX0RJVjEpIHx8ICAgICBcCisgICAoKF9fQURDX0NMT0NLX18pID09IEFEQ19DTE9DS19BU1lOQ19ESVYyKSB8fCAgICAgXAorICAgKChfX0FEQ19DTE9DS19fKSA9PSBBRENfQ0xPQ0tfQVNZTkNfRElWNCkgfHwgICAgIFwKKyAgICgoX19BRENfQ0xPQ0tfXykgPT0gQURDX0NMT0NLX0FTWU5DX0RJVjYpIHx8ICAgICBcCisgICAoKF9fQURDX0NMT0NLX18pID09IEFEQ19DTE9DS19BU1lOQ19ESVY4KSB8fCAgICAgXAorICAgKChfX0FEQ19DTE9DS19fKSA9PSBBRENfQ0xPQ0tfQVNZTkNfRElWMTApIHx8ICAgIFwKKyAgICgoX19BRENfQ0xPQ0tfXykgPT0gQURDX0NMT0NLX0FTWU5DX0RJVjEyKSB8fCAgICBcCisgICAoKF9fQURDX0NMT0NLX18pID09IEFEQ19DTE9DS19BU1lOQ19ESVYxNikgfHwgICAgXAorICAgKChfX0FEQ19DTE9DS19fKSA9PSBBRENfQ0xPQ0tfQVNZTkNfRElWMzIpIHx8ICAgIFwKKyAgICgoX19BRENfQ0xPQ0tfXykgPT0gQURDX0NMT0NLX0FTWU5DX0RJVjY0KSB8fCAgICBcCisgICAoKF9fQURDX0NMT0NLX18pID09IEFEQ19DTE9DS19BU1lOQ19ESVYxMjgpIHx8ICAgXAorICAgKChfX0FEQ19DTE9DS19fKSA9PSBBRENfQ0xPQ0tfQVNZTkNfRElWMjU2KSkKKworLyoqCisgKiBAYnJpZWYgVmVyaWZ5IHRoZSBBREMgcmVzb2x1dGlvbiBzZXR0aW5nLgorICogQHBhcmFtIF9fUkVTT0xVVElPTl9fIHByb2dyYW1tZWQgQURDIHJlc29sdXRpb24uCisgKiBAcmV0dmFsIFNFVCAoX19SRVNPTFVUSU9OX18gaXMgYSB2YWxpZCB2YWx1ZSkgb3IgUkVTRVQgKF9fUkVTT0xVVElPTl9fIGlzCisgKiBpbnZhbGlkKQorICovCisjZGVmaW5lIElTX0FEQ19SRVNPTFVUSU9OKF9fUkVTT0xVVElPTl9fKSAgICAgIFwKKyAgKCgoX19SRVNPTFVUSU9OX18pID09IEFEQ19SRVNPTFVUSU9OXzEyQikgfHwgXAorICAgKChfX1JFU09MVVRJT05fXykgPT0gQURDX1JFU09MVVRJT05fMTBCKSB8fCBcCisgICAoKF9fUkVTT0xVVElPTl9fKSA9PSBBRENfUkVTT0xVVElPTl84QikgfHwgIFwKKyAgICgoX19SRVNPTFVUSU9OX18pID09IEFEQ19SRVNPTFVUSU9OXzZCKSkKKworLyoqCisgKiBAYnJpZWYgVmVyaWZ5IHRoZSBBREMgcmVzb2x1dGlvbiBzZXR0aW5nIHdoZW4gbGltaXRlZCB0byA2IG9yIDggYml0cy4KKyAqIEBwYXJhbSBfX1JFU09MVVRJT05fXyBwcm9ncmFtbWVkIEFEQyByZXNvbHV0aW9uIHdoZW4gbGltaXRlZCB0byA2IG9yIDggYml0cy4KKyAqIEByZXR2YWwgU0VUIChfX1JFU09MVVRJT05fXyBpcyBhIHZhbGlkIHZhbHVlKSBvciBSRVNFVCAoX19SRVNPTFVUSU9OX18gaXMKKyAqIGludmFsaWQpCisgKi8KKyNkZWZpbmUgSVNfQURDX1JFU09MVVRJT05fOF82X0JJVFMoX19SRVNPTFVUSU9OX18pIFwKKyAgKCgoX19SRVNPTFVUSU9OX18pID09IEFEQ19SRVNPTFVUSU9OXzhCKSB8fCAgICAgIFwKKyAgICgoX19SRVNPTFVUSU9OX18pID09IEFEQ19SRVNPTFVUSU9OXzZCKSkKKworLyoqCisgKiBAYnJpZWYgVmVyaWZ5IHRoZSBBREMgY29udmVydGVkIGRhdGEgYWxpZ25tZW50LgorICogQHBhcmFtIF9fQUxJR05fXyBwcm9ncmFtbWVkIEFEQyBjb252ZXJ0ZWQgZGF0YSBhbGlnbm1lbnQuCisgKiBAcmV0dmFsIFNFVCAoX19BTElHTl9fIGlzIGEgdmFsaWQgdmFsdWUpIG9yIFJFU0VUIChfX0FMSUdOX18gaXMgaW52YWxpZCkKKyAqLworI2RlZmluZSBJU19BRENfREFUQV9BTElHTihfX0FMSUdOX18pIFwKKyAgKCgoX19BTElHTl9fKSA9PSBBRENfREFUQUFMSUdOX1JJR0hUKSB8fCAoKF9fQUxJR05fXykgPT0gQURDX0RBVEFBTElHTl9MRUZUKSkKKworLyoqCisgKiBAYnJpZWYgVmVyaWZ5IHRoZSBBREMgZ2FpbiBjb21wZW5zYXRpb24uCisgKiBAcGFyYW0gX19HQUlOX0NPTVBFTlNBVElPTl9fIHByb2dyYW1tZWQgQURDIGdhaW4gY29tcGVuc2F0aW9uIGNvZWZmaWNpZW50LgorICogQHJldHZhbCBTRVQgKF9fR0FJTl9DT01QRU5TQVRJT05fXyBpcyBhIHZhbGlkIHZhbHVlKSBvciBSRVNFVAorICogKF9fR0FJTl9DT01QRU5TQVRJT05fXyBpcyBpbnZhbGlkKQorICovCisjZGVmaW5lIElTX0FEQ19HQUlOX0NPTVBFTlNBVElPTihfX0dBSU5fQ09NUEVOU0FUSU9OX18pIFwKKyAgKChfX0dBSU5fQ09NUEVOU0FUSU9OX18pIDw9IDE2MzkzVUwpCisKKy8qKgorICogQGJyaWVmIFZlcmlmeSB0aGUgQURDIHNjYW4gbW9kZS4KKyAqIEBwYXJhbSBfX1NDQU5fTU9ERV9fIHByb2dyYW1tZWQgQURDIHNjYW4gbW9kZS4KKyAqIEByZXR2YWwgU0VUIChfX1NDQU5fTU9ERV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19TQ0FOX01PREVfXyBpcyBpbnZhbGlkKQorICovCisjZGVmaW5lIElTX0FEQ19TQ0FOX01PREUoX19TQ0FOX01PREVfXykgICAgIFwKKyAgKCgoX19TQ0FOX01PREVfXykgPT0gQURDX1NDQU5fRElTQUJMRSkgfHwgXAorICAgKChfX1NDQU5fTU9ERV9fKSA9PSBBRENfU0NBTl9FTkFCTEUpKQorCisvKioKKyAqIEBicmllZiBWZXJpZnkgdGhlIEFEQyBlZGdlIHRyaWdnZXIgc2V0dGluZyBmb3IgcmVndWxhciBncm91cC4KKyAqIEBwYXJhbSBfX0VER0VfXyBwcm9ncmFtbWVkIEFEQyBlZGdlIHRyaWdnZXIgc2V0dGluZy4KKyAqIEByZXR2YWwgU0VUIChfX0VER0VfXyBpcyBhIHZhbGlkIHZhbHVlKSBvciBSRVNFVCAoX19FREdFX18gaXMgaW52YWxpZCkKKyAqLworI2RlZmluZSBJU19BRENfRVhUVFJJR19FREdFKF9fRURHRV9fKSAgICAgICAgICAgICAgICAgIFwKKyAgKCgoX19FREdFX18pID09IEFEQ19FWFRFUk5BTFRSSUdDT05WRURHRV9OT05FKSB8fCAgICBcCisgICAoKF9fRURHRV9fKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVkVER0VfUklTSU5HKSB8fCAgXAorICAgKChfX0VER0VfXykgPT0gQURDX0VYVEVSTkFMVFJJR0NPTlZFREdFX0ZBTExJTkcpIHx8IFwKKyAgICgoX19FREdFX18pID09IEFEQ19FWFRFUk5BTFRSSUdDT05WRURHRV9SSVNJTkdGQUxMSU5HKSkKKworLyoqCisgKiBAYnJpZWYgVmVyaWZ5IHRoZSBBREMgcmVndWxhciBjb252ZXJzaW9ucyBleHRlcm5hbCB0cmlnZ2VyLgorICogQHBhcmFtIF9fSEFORExFX18gQURDIGhhbmRsZQorICogQHBhcmFtIF9fUkVHVFJJR19fIHByb2dyYW1tZWQgQURDIHJlZ3VsYXIgY29udmVyc2lvbnMgZXh0ZXJuYWwgdHJpZ2dlci4KKyAqIEByZXR2YWwgU0VUIChfX1JFR1RSSUdfXyBpcyBhIHZhbGlkIHZhbHVlKSBvciBSRVNFVCAoX19SRUdUUklHX18gaXMgaW52YWxpZCkKKyAqLworI2lmIGRlZmluZWQoU1RNMzJHNDc0eHgpIHx8IGRlZmluZWQoU1RNMzJHNDg0eHgpCisjZGVmaW5lIElTX0FEQ19FWFRUUklHKF9fSEFORExFX18sIF9fUkVHVFJJR19fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QxX1RSR08pIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QxX1RSR08yKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QxX0NDMykgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QyX1RSR08pIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QzX1RSR08pIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1Q0X1RSR08pIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1Q2X1RSR08pIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1Q3X1RSR08pIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1Q4X1RSR08pIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1Q4X1RSR08yKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QxNV9UUkdPKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QyMF9UUkdPKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QyMF9UUkdPMikgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QyMF9DQzEpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX0hSVElNX1RSRzEpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX0hSVElNX1RSRzMpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX0hSVElNX1RSRzUpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX0hSVElNX1RSRzYpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX0hSVElNX1RSRzcpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX0hSVElNX1RSRzgpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX0hSVElNX1RSRzkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX0hSVElNX1RSRzEwKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX0xQVElNX09VVCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlID09IEFEQzEpIHx8ICgoX19IQU5ETEVfXyktPkluc3RhbmNlID09IEFEQzIpKSAmJiBcCisgICAgKCgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDFfQ0MxKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDFfQ0MyKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDJfQ0MyKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDNfQ0M0KSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDRfQ0M0KSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDIwX0NDMikgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDIwX0NDMykgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfRVhUX0lUMTEpKSkgfHwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlID09IEFEQzMpIHx8ICgoX19IQU5ETEVfXyktPkluc3RhbmNlID09IEFEQzQpIHx8ICBcCisgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlID09IEFEQzUpKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDJfQ0MxKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDJfQ0MzKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDNfQ0MxKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDRfQ0MxKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDhfQ0MxKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfSFJUSU1fVFJHMikgfHwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfSFJUSU1fVFJHNCkgfHwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfRVhUX0lUMikpKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfU09GVFdBUkVfU1RBUlQpKQorI2VsaWYgZGVmaW5lZChTVE0zMkc0NzN4eCkgfHwgZGVmaW5lZChTVE0zMkc0ODN4eCkKKyNkZWZpbmUgSVNfQURDX0VYVFRSSUcoX19IQU5ETEVfXywgX19SRUdUUklHX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDFfVFJHTykgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDFfVFJHTzIpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDFfQ0MzKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDJfVFJHTykgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDNfVFJHTykgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDRfVFJHTykgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDZfVFJHTykgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDdfVFJHTykgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDhfVFJHTykgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDhfVFJHTzIpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDE1X1RSR08pIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDIwX1RSR08pIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDIwX1RSR08yKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDIwX0NDMSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfTFBUSU1fT1VUKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gQURDMSkgfHwgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gQURDMikpICYmIFwKKyAgICAoKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UMV9DQzEpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UMV9DQzIpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UMl9DQzIpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UM19DQzQpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UNF9DQzQpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UMjBfQ0MyKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UMjBfQ0MzKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19FWFRfSVQxMSkpKSB8fCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gQURDMykgfHwgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gQURDNCkgfHwgIFwKKyAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gQURDNSkpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UMl9DQzEpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UMl9DQzMpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UM19DQzEpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UNF9DQzEpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UOF9DQzEpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19FWFRfSVQyKSkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoX19SRUdUUklHX18pID09IEFEQ19TT0ZUV0FSRV9TVEFSVCkpCisjZWxpZiBkZWZpbmVkKFNUTTMyRzQ3MXh4KQorI2RlZmluZSBJU19BRENfRVhUVFJJRyhfX0hBTkRMRV9fLCBfX1JFR1RSSUdfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UMV9UUkdPKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UMV9UUkdPMikgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UMV9DQzMpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UMl9UUkdPKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UM19UUkdPKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UNF9UUkdPKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UNl9UUkdPKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UN19UUkdPKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UOF9UUkdPKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UOF9UUkdPMikgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UMTVfVFJHTykgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19MUFRJTV9PVVQpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBBREMxKSB8fCAoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBBREMyKSkgJiYgXAorICAgICgoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QxX0NDMSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QxX0NDMikgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QyX0NDMikgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QzX0NDNCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1Q0X0NDNCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX0VYVF9JVDExKSkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBBREMzKSkgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QyX0NDMSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QyX0NDMykgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QzX0NDMSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1Q0X0NDMSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1Q4X0NDMSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX0VYVF9JVDIpKSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKChfX1JFR1RSSUdfXykgPT0gQURDX1NPRlRXQVJFX1NUQVJUKSkKKyNlbGlmIGRlZmluZWQoU1RNMzJHNDExeEIpIHx8IGRlZmluZWQoU1RNMzJHNDE0eHgpIHx8IGRlZmluZWQoU1RNMzJHQksxQ0IpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRzQzMXh4KSB8fCBkZWZpbmVkKFNUTTMyRzQ0MXh4KQorI2RlZmluZSBJU19BRENfRVhUVFJJRyhfX0hBTkRMRV9fLCBfX1JFR1RSSUdfXykgICAgIFwKKyAgKCgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDFfVFJHTykgfHwgICBcCisgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QxX1RSR08yKSB8fCAgXAorICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UMV9DQzEpIHx8ICAgIFwKKyAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDFfQ0MyKSB8fCAgICBcCisgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QxX0NDMykgfHwgICAgXAorICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UMl9UUkdPKSB8fCAgIFwKKyAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDJfQ0MyKSB8fCAgICBcCisgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QzX1RSR08pIHx8ICAgXAorICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UM19DQzQpIHx8ICAgIFwKKyAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDRfVFJHTykgfHwgICBcCisgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1Q0X0NDNCkgfHwgICAgXAorICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UNl9UUkdPKSB8fCAgIFwKKyAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDdfVFJHTykgfHwgICBcCisgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1Q4X1RSR08pIHx8ICAgXAorICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UOF9UUkdPMikgfHwgIFwKKyAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDE1X1RSR08pIHx8ICBcCisgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX0xQVElNX09VVCkgfHwgXAorICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19FWFRfSVQxMSkgfHwgIFwKKyAgICgoX19SRUdUUklHX18pID09IEFEQ19TT0ZUV0FSRV9TVEFSVCkpCisjZWxpZiBkZWZpbmVkKFNUTTMyRzQ5MXh4KSB8fCBkZWZpbmVkKFNUTTMyRzRBMXh4KSB8fCBkZWZpbmVkKFNUTTMyRzQxMXhDKQorI2RlZmluZSBJU19BRENfRVhUVFJJRyhfX0hBTkRMRV9fLCBfX1JFR1RSSUdfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UMV9UUkdPKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UMV9UUkdPMikgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UMV9DQzMpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UMl9UUkdPKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UM19UUkdPKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UNF9UUkdPKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UNl9UUkdPKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UN19UUkdPKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UOF9UUkdPKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UOF9UUkdPMikgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UMTVfVFJHTykgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UMjBfVFJHTykgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UMjBfVFJHTzIpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UMjBfQ0MxKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19MUFRJTV9PVVQpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBBREMxKSB8fCAoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBBREMyKSkgJiYgXAorICAgICgoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QxX0NDMSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QxX0NDMikgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QyX0NDMikgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QzX0NDNCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1Q0X0NDNCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QyMF9DQzIpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QyMF9DQzMpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX0VYVF9JVDExKSkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlID09IEFEQzMpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QyX0NDMSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QyX0NDMykgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QzX0NDMSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1Q0X0NDMSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1Q4X0NDMSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX0VYVF9JVDIpKSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKChfX1JFR1RSSUdfXykgPT0gQURDX1NPRlRXQVJFX1NUQVJUKSkKKyNlbmRpZiAvKiBTVE0zMkc0eHggKi8KKworLyoqCisgKiBAYnJpZWYgVmVyaWZ5IHRoZSBBREMgcmVndWxhciBjb252ZXJzaW9ucyBleHRlcm5hbCB0cmlnZ2VyLgorICogQHBhcmFtIF9fU0FNUExJTkdNT0RFX18gcHJvZ3JhbW1lZCBBREMgcmVndWxhciBjb252ZXJzaW9ucyBleHRlcm5hbCB0cmlnZ2VyLgorICogQHJldHZhbCBTRVQgKF9fU0FNUExJTkdNT0RFX18gaXMgYSB2YWxpZCB2YWx1ZSkgb3IgUkVTRVQgKF9fU0FNUExJTkdNT0RFX18gaXMKKyAqIGludmFsaWQpCisgKi8KKyNkZWZpbmUgSVNfQURDX1NBTVBMSU5HTU9ERShfX1NBTVBMSU5HTU9ERV9fKSAgICAgICAgICBcCisgICgoKF9fU0FNUExJTkdNT0RFX18pID09IEFEQ19TQU1QTElOR19NT0RFX05PUk1BTCkgfHwgXAorICAgKChfX1NBTVBMSU5HTU9ERV9fKSA9PSBBRENfU0FNUExJTkdfTU9ERV9CVUxCKSB8fCAgIFwKKyAgICgoX19TQU1QTElOR01PREVfXykgPT0gQURDX1NBTVBMSU5HX01PREVfVFJJR0dFUl9DT05UUk9MRUQpKQorCisvKioKKyAqIEBicmllZiBWZXJpZnkgdGhlIEFEQyByZWd1bGFyIGNvbnZlcnNpb25zIGNoZWNrIGZvciBjb252ZXJ0ZWQgZGF0YQorICogYXZhaWxhYmlsaXR5LgorICogQHBhcmFtIF9fRU9DX1NFTEVDVElPTl9fIGNvbnZlcnRlZCBkYXRhIGF2YWlsYWJpbGl0eSBjaGVjay4KKyAqIEByZXR2YWwgU0VUIChfX0VPQ19TRUxFQ1RJT05fXyBpcyBhIHZhbGlkIHZhbHVlKSBvciBSRVNFVCAoX19FT0NfU0VMRUNUSU9OX18KKyAqIGlzIGludmFsaWQpCisgKi8KKyNkZWZpbmUgSVNfQURDX0VPQ19TRUxFQ1RJT04oX19FT0NfU0VMRUNUSU9OX18pICAgIFwKKyAgKCgoX19FT0NfU0VMRUNUSU9OX18pID09IEFEQ19FT0NfU0lOR0xFX0NPTlYpIHx8IFwKKyAgICgoX19FT0NfU0VMRUNUSU9OX18pID09IEFEQ19FT0NfU0VRX0NPTlYpKQorCisvKioKKyAqIEBicmllZiBWZXJpZnkgdGhlIEFEQyByZWd1bGFyIGNvbnZlcnNpb25zIG92ZXJydW4gaGFuZGxpbmcuCisgKiBAcGFyYW0gX19PVlJfXyBBREMgcmVndWxhciBjb252ZXJzaW9ucyBvdmVycnVuIGhhbmRsaW5nLgorICogQHJldHZhbCBTRVQgKF9fT1ZSX18gaXMgYSB2YWxpZCB2YWx1ZSkgb3IgUkVTRVQgKF9fT1ZSX18gaXMgaW52YWxpZCkKKyAqLworI2RlZmluZSBJU19BRENfT1ZFUlJVTihfX09WUl9fKSAgICAgICAgICAgICBcCisgICgoKF9fT1ZSX18pID09IEFEQ19PVlJfREFUQV9QUkVTRVJWRUQpIHx8IFwKKyAgICgoX19PVlJfXykgPT0gQURDX09WUl9EQVRBX09WRVJXUklUVEVOKSkKKworLyoqCisgKiBAYnJpZWYgVmVyaWZ5IHRoZSBBREMgY29udmVyc2lvbnMgc2FtcGxpbmcgdGltZS4KKyAqIEBwYXJhbSBfX1RJTUVfXyBBREMgY29udmVyc2lvbnMgc2FtcGxpbmcgdGltZS4KKyAqIEByZXR2YWwgU0VUIChfX1RJTUVfXyBpcyBhIHZhbGlkIHZhbHVlKSBvciBSRVNFVCAoX19USU1FX18gaXMgaW52YWxpZCkKKyAqLworI2RlZmluZSBJU19BRENfU0FNUExFX1RJTUUoX19USU1FX18pICAgICAgICAgICAgIFwKKyAgKCgoX19USU1FX18pID09IEFEQ19TQU1QTEVUSU1FXzJDWUNMRVNfNSkgfHwgICBcCisgICAoKF9fVElNRV9fKSA9PSBBRENfU0FNUExFVElNRV8zQ1lDTEVTXzUpIHx8ICAgXAorICAgKChfX1RJTUVfXykgPT0gQURDX1NBTVBMRVRJTUVfNkNZQ0xFU181KSB8fCAgIFwKKyAgICgoX19USU1FX18pID09IEFEQ19TQU1QTEVUSU1FXzEyQ1lDTEVTXzUpIHx8ICBcCisgICAoKF9fVElNRV9fKSA9PSBBRENfU0FNUExFVElNRV8yNENZQ0xFU181KSB8fCAgXAorICAgKChfX1RJTUVfXykgPT0gQURDX1NBTVBMRVRJTUVfNDdDWUNMRVNfNSkgfHwgIFwKKyAgICgoX19USU1FX18pID09IEFEQ19TQU1QTEVUSU1FXzkyQ1lDTEVTXzUpIHx8ICBcCisgICAoKF9fVElNRV9fKSA9PSBBRENfU0FNUExFVElNRV8yNDdDWUNMRVNfNSkgfHwgXAorICAgKChfX1RJTUVfXykgPT0gQURDX1NBTVBMRVRJTUVfNjQwQ1lDTEVTXzUpKQorCisvKioKKyAqIEBicmllZiBWZXJpZnkgdGhlIEFEQyByZWd1bGFyIGNoYW5uZWwgc2V0dGluZy4KKyAqIEBwYXJhbSAgX19DSEFOTkVMX18gcHJvZ3JhbW1lZCBBREMgcmVndWxhciBjaGFubmVsLgorICogQHJldHZhbCBTRVQgKF9fQ0hBTk5FTF9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19DSEFOTkVMX18gaXMgaW52YWxpZCkKKyAqLworI2RlZmluZSBJU19BRENfUkVHVUxBUl9SQU5LKF9fQ0hBTk5FTF9fKSAgICAgXAorICAoKChfX0NIQU5ORUxfXykgPT0gQURDX1JFR1VMQVJfUkFOS18xKSB8fCAgXAorICAgKChfX0NIQU5ORUxfXykgPT0gQURDX1JFR1VMQVJfUkFOS18yKSB8fCAgXAorICAgKChfX0NIQU5ORUxfXykgPT0gQURDX1JFR1VMQVJfUkFOS18zKSB8fCAgXAorICAgKChfX0NIQU5ORUxfXykgPT0gQURDX1JFR1VMQVJfUkFOS180KSB8fCAgXAorICAgKChfX0NIQU5ORUxfXykgPT0gQURDX1JFR1VMQVJfUkFOS181KSB8fCAgXAorICAgKChfX0NIQU5ORUxfXykgPT0gQURDX1JFR1VMQVJfUkFOS182KSB8fCAgXAorICAgKChfX0NIQU5ORUxfXykgPT0gQURDX1JFR1VMQVJfUkFOS183KSB8fCAgXAorICAgKChfX0NIQU5ORUxfXykgPT0gQURDX1JFR1VMQVJfUkFOS184KSB8fCAgXAorICAgKChfX0NIQU5ORUxfXykgPT0gQURDX1JFR1VMQVJfUkFOS185KSB8fCAgXAorICAgKChfX0NIQU5ORUxfXykgPT0gQURDX1JFR1VMQVJfUkFOS18xMCkgfHwgXAorICAgKChfX0NIQU5ORUxfXykgPT0gQURDX1JFR1VMQVJfUkFOS18xMSkgfHwgXAorICAgKChfX0NIQU5ORUxfXykgPT0gQURDX1JFR1VMQVJfUkFOS18xMikgfHwgXAorICAgKChfX0NIQU5ORUxfXykgPT0gQURDX1JFR1VMQVJfUkFOS18xMykgfHwgXAorICAgKChfX0NIQU5ORUxfXykgPT0gQURDX1JFR1VMQVJfUkFOS18xNCkgfHwgXAorICAgKChfX0NIQU5ORUxfXykgPT0gQURDX1JFR1VMQVJfUkFOS18xNSkgfHwgXAorICAgKChfX0NIQU5ORUxfXykgPT0gQURDX1JFR1VMQVJfUkFOS18xNikpCisKKy8qKgorICogQH0KKyAqLworCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIEFEQ19Qcml2YXRlX0NvbnN0YW50cyBBREMgUHJpdmF0ZSBDb25zdGFudHMKKyAqIEB7CisgKi8KKworLyogRml4ZWQgdGltZW91dCB2YWx1ZXMgZm9yIEFEQyBjb252ZXJzaW9uIChpbmNsdWRpbmcgc2FtcGxpbmcgdGltZSkgICAgICAgICovCisvKiBNYXhpbXVtIHNhbXBsaW5nIHRpbWUgaXMgNjQwLjUgQURDIGNsb2NrIGN5Y2xlIChTTVB4WzI6MF0gPSAwYjExMSAgICAgICAgKi8KKy8qIE1heGltdW0gY29udmVyc2lvbiB0aW1lIGlzIDEyLjUgKyBNYXhpbXVtIHNhbXBsaW5nIHRpbWUgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgIG9yIDEyLjUgICsgNjQwLjUgPSA2NTMgQURDIGNsb2NrIGN5Y2xlcyAgICAgICAgICAgICovCisvKiBNaW5pbXVtIEFEQyBDbG9jayBmcmVxdWVuY3kgaXMgMC4xNCBNSHogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE1heGltdW0gY29udmVyc2lvbiB0aW1lIGlzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgIDY1MyAvIDAuMTQgTUh6ID0gNC42NiBtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFEQ19TVE9QX0NPTlZFUlNJT05fVElNRU9VVCAoNVVMKSAvKiE8IEFEQyBzdG9wIHRpbWUtb3V0IHZhbHVlICovCisKKy8qIERlbGF5IGZvciB0ZW1wZXJhdHVyZSBzZW5zb3Igc3RhYmlsaXphdGlvbiB0aW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTWF4aW11bSBkZWxheSBpcyAxMjB1cyAocmVmZXIgZGV2aWNlIGRhdGFzaGVldCwgcGFyYW1ldGVyIHRTVEFSVCkuICAgICAgICovCisvKiBVbml0OiB1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQURDX1RFTVBTRU5TT1JfREVMQVlfVVMgKExMX0FEQ19ERUxBWV9URU1QU0VOU09SX1NUQUJfVVMpCisKKy8qKgorICogQH0KKyAqLworCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIEFEQ19FeHBvcnRlZF9NYWNyb3MgQURDIEV4cG9ydGVkIE1hY3JvcworICogQHsKKyAqLworLyogTWFjcm8gZm9yIGludGVybmFsIEhBTCBkcml2ZXIgdXNhZ2UsIGFuZCBwb3NzaWJseSBjYW4gYmUgdXNlZCBpbnRvIGNvZGUgb2YgKi8KKy8qIGZpbmFsIHVzZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0hBTF9FTV9IQU5ETEVfSVRfRkxBRyBIQUwgQURDIG1hY3JvIHRvIG1hbmFnZSBIQUwgQURDIGhhbmRsZSwKKyAqIElUIGFuZCBmbGFncy4KKyAqIEB7CisgKi8KKworLyoqIEBicmllZiAgUmVzZXQgQURDIGhhbmRsZSBzdGF0ZS4KKyAqIEBwYXJhbSBfX0hBTkRMRV9fIEFEQyBoYW5kbGUKKyAqIEByZXR2YWwgTm9uZQorICovCisjaWYgKFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorI2RlZmluZSBfX0hBTF9BRENfUkVTRVRfSEFORExFX1NUQVRFKF9fSEFORExFX18pIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKF9fSEFORExFX18pLT5TdGF0ZSA9IEhBTF9BRENfU1RBVEVfUkVTRVQ7ICAgXAorICAgIChfX0hBTkRMRV9fKS0+TXNwSW5pdENhbGxiYWNrID0gTlVMTDsgICAgICAgIFwKKyAgICAoX19IQU5ETEVfXyktPk1zcERlSW5pdENhbGxiYWNrID0gTlVMTDsgICAgICBcCisgIH0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBfX0hBTF9BRENfUkVTRVRfSEFORExFX1NUQVRFKF9fSEFORExFX18pIFwKKyAgKChfX0hBTkRMRV9fKS0+U3RhdGUgPSBIQUxfQURDX1NUQVRFX1JFU0VUKQorI2VuZGlmIC8qIFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyAqIEBicmllZiBFbmFibGUgQURDIGludGVycnVwdC4KKyAqIEBwYXJhbSBfX0hBTkRMRV9fIEFEQyBoYW5kbGUKKyAqIEBwYXJhbSBfX0lOVEVSUlVQVF9fIEFEQyBJbnRlcnJ1cHQKKyAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0lUX1JEWSAgICBBREMgUmVhZHkgaW50ZXJydXB0IHNvdXJjZQorICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0lUX0VPU01QICBBREMgRW5kIG9mIFNhbXBsaW5nIGludGVycnVwdCBzb3VyY2UKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19JVF9FT0MgICAgQURDIEVuZCBvZiBSZWd1bGFyIENvbnZlcnNpb24gaW50ZXJydXB0CisgKiBzb3VyY2UKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19JVF9FT1MgICAgQURDIEVuZCBvZiBSZWd1bGFyIHNlcXVlbmNlIG9mIENvbnZlcnNpb25zCisgKiBpbnRlcnJ1cHQgc291cmNlCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfSVRfT1ZSICAgIEFEQyBvdmVycnVuIGludGVycnVwdCBzb3VyY2UKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19JVF9KRU9DICAgQURDIEVuZCBvZiBJbmplY3RlZCBDb252ZXJzaW9uIGludGVycnVwdAorICogc291cmNlCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfSVRfSkVPUyAgIEFEQyBFbmQgb2YgSW5qZWN0ZWQgc2VxdWVuY2Ugb2YKKyAqIENvbnZlcnNpb25zIGludGVycnVwdCBzb3VyY2UKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19JVF9BV0QxICAgQURDIEFuYWxvZyB3YXRjaGRvZyAxIGludGVycnVwdCBzb3VyY2UKKyAqIChtYWluIGFuYWxvZyB3YXRjaGRvZykKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19JVF9BV0QyICAgQURDIEFuYWxvZyB3YXRjaGRvZyAyIGludGVycnVwdCBzb3VyY2UKKyAqIChhZGRpdGlvbmFsIGFuYWxvZyB3YXRjaGRvZykKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19JVF9BV0QzICAgQURDIEFuYWxvZyB3YXRjaGRvZyAzIGludGVycnVwdCBzb3VyY2UKKyAqIChhZGRpdGlvbmFsIGFuYWxvZyB3YXRjaGRvZykKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19JVF9KUU9WRiAgQURDIEluamVjdGVkIENvbnRleHQgUXVldWUgT3ZlcmZsb3cKKyAqIGludGVycnVwdCBzb3VyY2UuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9BRENfRU5BQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pIFwKKyAgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JRVIpIHw9IChfX0lOVEVSUlVQVF9fKSkKKworLyoqCisgKiBAYnJpZWYgRGlzYWJsZSBBREMgaW50ZXJydXB0LgorICogQHBhcmFtIF9fSEFORExFX18gQURDIGhhbmRsZQorICogQHBhcmFtIF9fSU5URVJSVVBUX18gQURDIEludGVycnVwdAorICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfSVRfUkRZICAgIEFEQyBSZWFkeSBpbnRlcnJ1cHQgc291cmNlCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfSVRfRU9TTVAgIEFEQyBFbmQgb2YgU2FtcGxpbmcgaW50ZXJydXB0IHNvdXJjZQorICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0lUX0VPQyAgICBBREMgRW5kIG9mIFJlZ3VsYXIgQ29udmVyc2lvbiBpbnRlcnJ1cHQKKyAqIHNvdXJjZQorICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0lUX0VPUyAgICBBREMgRW5kIG9mIFJlZ3VsYXIgc2VxdWVuY2Ugb2YgQ29udmVyc2lvbnMKKyAqIGludGVycnVwdCBzb3VyY2UKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19JVF9PVlIgICAgQURDIG92ZXJydW4gaW50ZXJydXB0IHNvdXJjZQorICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0lUX0pFT0MgICBBREMgRW5kIG9mIEluamVjdGVkIENvbnZlcnNpb24gaW50ZXJydXB0CisgKiBzb3VyY2UKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19JVF9KRU9TICAgQURDIEVuZCBvZiBJbmplY3RlZCBzZXF1ZW5jZSBvZgorICogQ29udmVyc2lvbnMgaW50ZXJydXB0IHNvdXJjZQorICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0lUX0FXRDEgICBBREMgQW5hbG9nIHdhdGNoZG9nIDEgaW50ZXJydXB0IHNvdXJjZQorICogKG1haW4gYW5hbG9nIHdhdGNoZG9nKQorICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0lUX0FXRDIgICBBREMgQW5hbG9nIHdhdGNoZG9nIDIgaW50ZXJydXB0IHNvdXJjZQorICogKGFkZGl0aW9uYWwgYW5hbG9nIHdhdGNoZG9nKQorICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0lUX0FXRDMgICBBREMgQW5hbG9nIHdhdGNoZG9nIDMgaW50ZXJydXB0IHNvdXJjZQorICogKGFkZGl0aW9uYWwgYW5hbG9nIHdhdGNoZG9nKQorICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0lUX0pRT1ZGICBBREMgSW5qZWN0ZWQgQ29udGV4dCBRdWV1ZSBPdmVyZmxvdworICogaW50ZXJydXB0IHNvdXJjZS4KKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX0FEQ19ESVNBQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pIFwKKyAgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JRVIpICY9IH4oX19JTlRFUlJVUFRfXykpCisKKy8qKiBAYnJpZWYgIENoZWNrcyBpZiB0aGUgc3BlY2lmaWVkIEFEQyBpbnRlcnJ1cHQgc291cmNlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgKiBAcGFyYW0gX19IQU5ETEVfXyBBREMgaGFuZGxlCisgKiBAcGFyYW0gX19JTlRFUlJVUFRfXyBBREMgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjaworICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19JVF9SRFkgICAgQURDIFJlYWR5IGludGVycnVwdCBzb3VyY2UKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19JVF9FT1NNUCAgQURDIEVuZCBvZiBTYW1wbGluZyBpbnRlcnJ1cHQgc291cmNlCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfSVRfRU9DICAgIEFEQyBFbmQgb2YgUmVndWxhciBDb252ZXJzaW9uIGludGVycnVwdAorICogc291cmNlCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfSVRfRU9TICAgIEFEQyBFbmQgb2YgUmVndWxhciBzZXF1ZW5jZSBvZiBDb252ZXJzaW9ucworICogaW50ZXJydXB0IHNvdXJjZQorICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0lUX09WUiAgICBBREMgb3ZlcnJ1biBpbnRlcnJ1cHQgc291cmNlCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfSVRfSkVPQyAgIEFEQyBFbmQgb2YgSW5qZWN0ZWQgQ29udmVyc2lvbiBpbnRlcnJ1cHQKKyAqIHNvdXJjZQorICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0lUX0pFT1MgICBBREMgRW5kIG9mIEluamVjdGVkIHNlcXVlbmNlIG9mCisgKiBDb252ZXJzaW9ucyBpbnRlcnJ1cHQgc291cmNlCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfSVRfQVdEMSAgIEFEQyBBbmFsb2cgd2F0Y2hkb2cgMSBpbnRlcnJ1cHQgc291cmNlCisgKiAobWFpbiBhbmFsb2cgd2F0Y2hkb2cpCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfSVRfQVdEMiAgIEFEQyBBbmFsb2cgd2F0Y2hkb2cgMiBpbnRlcnJ1cHQgc291cmNlCisgKiAoYWRkaXRpb25hbCBhbmFsb2cgd2F0Y2hkb2cpCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfSVRfQVdEMyAgIEFEQyBBbmFsb2cgd2F0Y2hkb2cgMyBpbnRlcnJ1cHQgc291cmNlCisgKiAoYWRkaXRpb25hbCBhbmFsb2cgd2F0Y2hkb2cpCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfSVRfSlFPVkYgIEFEQyBJbmplY3RlZCBDb250ZXh0IFF1ZXVlIE92ZXJmbG93CisgKiBpbnRlcnJ1cHQgc291cmNlLgorICogQHJldHZhbCBTdGF0ZSBvZiBpbnRlcnJ1cHRpb24gKFNFVCBvciBSRVNFVCkKKyAqLworI2RlZmluZSBfX0hBTF9BRENfR0VUX0lUX1NPVVJDRShfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSBcCisgICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SUVSICYgKF9fSU5URVJSVVBUX18pKSA9PSAoX19JTlRFUlJVUFRfXykpCisKKy8qKgorICogQGJyaWVmIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBBREMgZmxhZyBpcyBzZXQgb3Igbm90LgorICogQHBhcmFtIF9fSEFORExFX18gQURDIGhhbmRsZQorICogQHBhcmFtIF9fRkxBR19fIEFEQyBmbGFnCisgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19GTEFHX1JEWSAgICAgQURDIFJlYWR5IGZsYWcKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19GTEFHX0VPU01QICAgQURDIEVuZCBvZiBTYW1wbGluZyBmbGFnCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfRkxBR19FT0MgICAgIEFEQyBFbmQgb2YgUmVndWxhciBDb252ZXJzaW9uIGZsYWcKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19GTEFHX0VPUyAgICAgQURDIEVuZCBvZiBSZWd1bGFyIHNlcXVlbmNlIG9mCisgKiBDb252ZXJzaW9ucyBmbGFnCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfRkxBR19PVlIgICAgIEFEQyBvdmVycnVuIGZsYWcKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19GTEFHX0pFT0MgICAgQURDIEVuZCBvZiBJbmplY3RlZCBDb252ZXJzaW9uIGZsYWcKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19GTEFHX0pFT1MgICAgQURDIEVuZCBvZiBJbmplY3RlZCBzZXF1ZW5jZSBvZgorICogQ29udmVyc2lvbnMgZmxhZworICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0ZMQUdfQVdEMSAgICBBREMgQW5hbG9nIHdhdGNoZG9nIDEgZmxhZyAobWFpbiBhbmFsb2cKKyAqIHdhdGNoZG9nKQorICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0ZMQUdfQVdEMiAgICBBREMgQW5hbG9nIHdhdGNoZG9nIDIgZmxhZyAoYWRkaXRpb25hbAorICogYW5hbG9nIHdhdGNoZG9nKQorICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0ZMQUdfQVdEMyAgICBBREMgQW5hbG9nIHdhdGNoZG9nIDMgZmxhZyAoYWRkaXRpb25hbAorICogYW5hbG9nIHdhdGNoZG9nKQorICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0ZMQUdfSlFPVkYgICBBREMgSW5qZWN0ZWQgQ29udGV4dCBRdWV1ZSBPdmVyZmxvdworICogZmxhZy4KKyAqIEByZXR2YWwgU3RhdGUgb2YgZmxhZyAoVFJVRSBvciBGQUxTRSkuCisgKi8KKyNkZWZpbmUgX19IQUxfQURDX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSBcCisgICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUikgJiAoX19GTEFHX18pKSA9PSAoX19GTEFHX18pKQorCisvKioKKyAqIEBicmllZiBDbGVhciB0aGUgc3BlY2lmaWVkIEFEQyBmbGFnLgorICogQHBhcmFtIF9fSEFORExFX18gQURDIGhhbmRsZQorICogQHBhcmFtIF9fRkxBR19fIEFEQyBmbGFnCisgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19GTEFHX1JEWSAgICAgQURDIFJlYWR5IGZsYWcKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19GTEFHX0VPU01QICAgQURDIEVuZCBvZiBTYW1wbGluZyBmbGFnCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfRkxBR19FT0MgICAgIEFEQyBFbmQgb2YgUmVndWxhciBDb252ZXJzaW9uIGZsYWcKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19GTEFHX0VPUyAgICAgQURDIEVuZCBvZiBSZWd1bGFyIHNlcXVlbmNlIG9mCisgKiBDb252ZXJzaW9ucyBmbGFnCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfRkxBR19PVlIgICAgIEFEQyBvdmVycnVuIGZsYWcKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19GTEFHX0pFT0MgICAgQURDIEVuZCBvZiBJbmplY3RlZCBDb252ZXJzaW9uIGZsYWcKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19GTEFHX0pFT1MgICAgQURDIEVuZCBvZiBJbmplY3RlZCBzZXF1ZW5jZSBvZgorICogQ29udmVyc2lvbnMgZmxhZworICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0ZMQUdfQVdEMSAgICBBREMgQW5hbG9nIHdhdGNoZG9nIDEgZmxhZyAobWFpbiBhbmFsb2cKKyAqIHdhdGNoZG9nKQorICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0ZMQUdfQVdEMiAgICBBREMgQW5hbG9nIHdhdGNoZG9nIDIgZmxhZyAoYWRkaXRpb25hbAorICogYW5hbG9nIHdhdGNoZG9nKQorICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0ZMQUdfQVdEMyAgICBBREMgQW5hbG9nIHdhdGNoZG9nIDMgZmxhZyAoYWRkaXRpb25hbAorICogYW5hbG9nIHdhdGNoZG9nKQorICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0ZMQUdfSlFPVkYgICBBREMgSW5qZWN0ZWQgQ29udGV4dCBRdWV1ZSBPdmVyZmxvdworICogZmxhZy4KKyAqIEByZXR2YWwgTm9uZQorICovCisvKiBOb3RlOiBiaXQgY2xlYXJlZCBiaXQgYnkgd3JpdGluZyAxICh3cml0aW5nIDAgaGFzIG5vIGVmZmVjdCBvbiBhbnkgYml0IG9mCisgKiByZWdpc3RlciBJU1IpICovCisjZGVmaW5lIF9fSEFMX0FEQ19DTEVBUl9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSBcCisgICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVNSKSA9IChfX0ZMQUdfXykpCisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEFEQ19IQUxfRU1fSEVMUEVSX01BQ1JPIEhBTCBBREMgaGVscGVyIG1hY3JvCisgKiBAeworICovCisKKy8qKgorICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gZ2V0IEFEQyBjaGFubmVsIG51bWJlciBpbiBkZWNpbWFsIGZvcm1hdAorICogICAgICAgICBmcm9tIGxpdGVyYWxzIEFEQ19DSEFOTkVMX3guCisgKiBAbm90ZSAgIEV4YW1wbGU6CisgKiAgICAgICAgICAgX19IQUxfQURDX0NIQU5ORUxfVE9fREVDSU1BTF9OQihBRENfQ0hBTk5FTF80KQorICogICAgICAgICAgIHdpbGwgcmV0dXJuIGRlY2ltYWwgbnVtYmVyICI0Ii4KKyAqIEBub3RlICAgVGhlIGlucHV0IGNhbiBiZSBhIHZhbHVlIGZyb20gZnVuY3Rpb25zIHdoZXJlIGEgY2hhbm5lbAorICogICAgICAgICBudW1iZXIgaXMgcmV0dXJuZWQsIGVpdGhlciBkZWZpbmVkIHdpdGggbnVtYmVyCisgKiAgICAgICAgIG9yIHdpdGggYml0ZmllbGQgKG9ubHkgb25lIGJpdCBtdXN0IGJlIHNldCkuCisgKiBAcGFyYW0gIF9fQ0hBTk5FTF9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8wCisgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xICAgICAgICAgICAgICAgICAoOCkKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzIgICAgICAgICAgICAgICAgICg4KQorICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMyAgICAgICAgICAgICAgICAgKDgpCisgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF80ICAgICAgICAgICAgICAgICAoOCkKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzUgICAgICAgICAgICAgICAgICg4KQorICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfNgorICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfNworICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfOAorICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfOQorICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTAKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzExCisgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xMgorICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTMKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzE0CisgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xNQorICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTYKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzE3CisgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xOAorICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVlJFRklOVCAgICAgICAgICAgKDcpCisgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF9URU1QU0VOU09SX0FEQzEgICAoMSkKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMX1RFTVBTRU5TT1JfQURDNSAgICg1KQorICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVkJBVCAgICAgICAgICAgICAgKDYpCisgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF9WT1BBTVAxICAgICAgICAgICAoMSkKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMX1ZPUEFNUDIgICAgICAgICAgICgyKQorICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVk9QQU1QM19BREMyICAgICAgKDIpCisgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF9WT1BBTVAzX0FEQzMgICAgICAoMykKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMX1ZPUEFNUDQgICAgICAgICAgICg1KQorICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVk9QQU1QNSAgICAgICAgICAgKDUpCisgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF9WT1BBTVA2ICAgICAgICAgICAoNCkKKyAqCisgKiAgICAgICAgICgxKSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMxLlxuCisgKiAgICAgICAgICgyKSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMyLlxuCisgKiAgICAgICAgICgzKSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMzLlxuCisgKiAgICAgICAgICg0KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREM0LlxuCisgKiAgICAgICAgICg1KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREM1LlxuCisgKiAgICAgICAgICg2KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlczogQURDMSwKKyAqIEFEQzMsIEFEQzUuXG4gKDcpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2VzOgorICogQURDMSwgQURDMywgQURDNCwgQURDNS5cbiBPbiB0aGlzIFNUTTMyIHNlcmllcywgYWxsIEFEQ3ggYXJlIG5vdCBhdmFpbGFibGUgb24KKyAqIGFsbCBkZXZpY2VzLiBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBtb3JlIGRldGFpbHMuICg4KSBPbiBTVE0zMkc0LCBmYXN0CisgKiBjaGFubmVsIGFsbG93czogMi41IChzYW1wbGluZykgKyAxMi41IChjb252ZXJzaW9uKSA9IDE1IEFEQyBjbG9jayBjeWNsZXMKKyAqIChmQURDKSB0byBjb252ZXJ0IGluIDEyLWJpdCByZXNvbHV0aW9uLiBPdGhlciBjaGFubmVscyBhcmUgc2xvdyBjaGFubmVscworICogYWxsb3dzOiA2LjUgKHNhbXBsaW5nKSArIDEyLjUgKGNvbnZlcnNpb24pID0gMTkgQURDIGNsb2NrIGN5Y2xlcyAoZkFEQykgdG8KKyAqIGNvbnZlcnQgaW4gMTItYml0IHJlc29sdXRpb24uXG4KKyAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0xOAorICovCisjZGVmaW5lIF9fSEFMX0FEQ19DSEFOTkVMX1RPX0RFQ0lNQUxfTkIoX19DSEFOTkVMX18pIFwKKyAgX19MTF9BRENfQ0hBTk5FTF9UT19ERUNJTUFMX05CKChfX0NIQU5ORUxfXykpCisKKy8qKgorICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gZ2V0IEFEQyBjaGFubmVsIGluIGxpdGVyYWwgZm9ybWF0IEFEQ19DSEFOTkVMX3gKKyAqICAgICAgICAgZnJvbSBudW1iZXIgaW4gZGVjaW1hbCBmb3JtYXQuCisgKiBAbm90ZSAgIEV4YW1wbGU6CisgKiAgICAgICAgICAgX19IQUxfQURDX0RFQ0lNQUxfTkJfVE9fQ0hBTk5FTCg0KQorICogICAgICAgICAgIHdpbGwgcmV0dXJuIGEgZGF0YSBlcXVpdmFsZW50IHRvICJBRENfQ0hBTk5FTF80Ii4KKyAqIEBwYXJhbSAgX19ERUNJTUFMX05CX18gVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0xOAorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMAorICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMSAgICAgICAgICAgICAgICAgKDgpCisgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8yICAgICAgICAgICAgICAgICAoOCkKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzMgICAgICAgICAgICAgICAgICg4KQorICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfNCAgICAgICAgICAgICAgICAgKDgpCisgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF81ICAgICAgICAgICAgICAgICAoOCkKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzYKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzcKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzgKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzkKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzEwCisgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xMQorICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTIKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzEzCisgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xNAorICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTUKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzE2CisgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xNworICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTgKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMX1ZSRUZJTlQgICAgICAgICAgICg3KQorICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVEVNUFNFTlNPUl9BREMxICAgKDEpCisgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF9URU1QU0VOU09SX0FEQzUgICAoNSkKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMX1ZCQVQgICAgICAgICAgICAgICg2KQorICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVk9QQU1QMSAgICAgICAgICAgKDEpCisgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF9WT1BBTVAyICAgICAgICAgICAoMikKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMX1ZPUEFNUDNfQURDMiAgICAgICgyKQorICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVk9QQU1QM19BREMzICAgICAgKDMpCisgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF9WT1BBTVA0ICAgICAgICAgICAoNSkKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMX1ZPUEFNUDUgICAgICAgICAgICg1KQorICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVk9QQU1QNiAgICAgICAgICAgKDQpCisgKgorICogICAgICAgICAoMSkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMS5cbgorICogICAgICAgICAoMikgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMi5cbgorICogICAgICAgICAoMykgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMy5cbgorICogICAgICAgICAoNCkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDNC5cbgorICogICAgICAgICAoNSkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDNS5cbgorICogICAgICAgICAoNikgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZXM6IEFEQzEsCisgKiBBREMzLCBBREM1LlxuICg3KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlczoKKyAqIEFEQzEsIEFEQzMsIEFEQzQsIEFEQzUuXG4KKyAqICAgICAgICAgIC0gIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBhbGwgQURDeCBhcmUgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlcy4KKyAqIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIG1vcmUgZGV0YWlscy4gKDgpIE9uIFNUTTMyRzQsIGZhc3QgY2hhbm5lbAorICogYWxsb3dzOiAyLjUgKHNhbXBsaW5nKSArIDEyLjUgKGNvbnZlcnNpb24pID0gMTUgQURDIGNsb2NrIGN5Y2xlcyAoZkFEQykgdG8KKyAqIGNvbnZlcnQgaW4gMTItYml0IHJlc29sdXRpb24uIE90aGVyIGNoYW5uZWxzIGFyZSBzbG93IGNoYW5uZWxzICBhbGxvd3M6IDYuNQorICogKHNhbXBsaW5nKSArIDEyLjUgKGNvbnZlcnNpb24pID0gMTkgQURDIGNsb2NrIGN5Y2xlcyAoZkFEQykgdG8gY29udmVydCBpbgorICogMTItYml0IHJlc29sdXRpb24uXG4gKDEsIDIsIDMsIDQsIDUsIDcpIEZvciBBREMgY2hhbm5lbCByZWFkIGJhY2sgZnJvbSBBREMKKyAqIHJlZ2lzdGVyLCBjb21wYXJpc29uIHdpdGggaW50ZXJuYWwgY2hhbm5lbCBwYXJhbWV0ZXIgdG8gYmUgZG9uZSB1c2luZyBoZWxwZXIKKyAqIG1hY3JvIEByZWYgX19MTF9BRENfQ0hBTk5FTF9JTlRFUk5BTF9UT19FWFRFUk5BTCgpLgorICovCisjZGVmaW5lIF9fSEFMX0FEQ19ERUNJTUFMX05CX1RPX0NIQU5ORUwoX19ERUNJTUFMX05CX18pIFwKKyAgX19MTF9BRENfREVDSU1BTF9OQl9UT19DSEFOTkVMKChfX0RFQ0lNQUxfTkJfXykpCisKKy8qKgorICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHNlbGVjdGVkIGNoYW5uZWwKKyAqICAgICAgICAgY29ycmVzcG9uZHMgdG8gbGl0ZXJhbCBkZWZpbml0aW9ucyBvZiBkcml2ZXIuCisgKiBAbm90ZSAgIFRoZSBkaWZmZXJlbnQgbGl0ZXJhbCBkZWZpbml0aW9ucyBvZiBBREMgY2hhbm5lbHMgYXJlOgorICogICAgICAgICAtIEFEQyBpbnRlcm5hbCBjaGFubmVsOgorICogICAgICAgICAgIEFEQ19DSEFOTkVMX1ZSRUZJTlQsIEFEQ19DSEFOTkVMX1RFTVBTRU5TT1IsIC4uLgorICogICAgICAgICAtIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBhIEdQSU8gcGluKToKKyAqICAgICAgICAgICBBRENfQ0hBTk5FTF8xLCBBRENfQ0hBTk5FTF8yLCAuLi4KKyAqIEBub3RlICAgVGhlIGNoYW5uZWwgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBkZWZpbmVkIGZyb20gbGl0ZXJhbAorICogICAgICAgICBkZWZpbml0aW9uIG9mIGEgQURDIGludGVybmFsIGNoYW5uZWwgKEFEQ19DSEFOTkVMX1ZSRUZJTlQsCisgKiAgICAgICAgIEFEQ19DSEFOTkVMX1RFTVBTRU5TT1IsIC4uLiksCisgKiAgICAgICAgIEFEQyBleHRlcm5hbCBjaGFubmVsIChBRENfQ0hBTk5FTF8xLCBBRENfQ0hBTk5FTF8yLCAuLi4pLAorICogICAgICAgICBtdXN0IG5vdCBiZSBhIHZhbHVlIGZyb20gZnVuY3Rpb25zIHdoZXJlIGEgY2hhbm5lbCBudW1iZXIgaXMKKyAqICAgICAgICAgcmV0dXJuZWQgZnJvbSBBREMgcmVnaXN0ZXJzLAorICogICAgICAgICBiZWNhdXNlIGludGVybmFsIGFuZCBleHRlcm5hbCBjaGFubmVscyBzaGFyZSB0aGUgc2FtZSBjaGFubmVsCisgKiAgICAgICAgIG51bWJlciBpbiBBREMgcmVnaXN0ZXJzLiBUaGUgZGlmZmVyZW50aWF0aW9uIGlzIG1hZGUgb25seSB3aXRoCisgKiAgICAgICAgIHBhcmFtZXRlcnMgZGVmaW5pdGlvbnMgb2YgZHJpdmVyLgorICogQHBhcmFtICBfX0NIQU5ORUxfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMAorICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMSAgICAgICAgICAgICAgICAgKDgpCisgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8yICAgICAgICAgICAgICAgICAoOCkKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzMgICAgICAgICAgICAgICAgICg4KQorICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfNCAgICAgICAgICAgICAgICAgKDgpCisgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF81ICAgICAgICAgICAgICAgICAoOCkKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzYKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzcKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzgKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzkKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzEwCisgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xMQorICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTIKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzEzCisgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xNAorICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTUKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzE2CisgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xNworICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTgKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMX1ZSRUZJTlQgICAgICAgICAgICg3KQorICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVEVNUFNFTlNPUl9BREMxICAgKDEpCisgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF9URU1QU0VOU09SX0FEQzUgICAoNSkKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMX1ZCQVQgICAgICAgICAgICAgICg2KQorICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVk9QQU1QMSAgICAgICAgICAgKDEpCisgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF9WT1BBTVAyICAgICAgICAgICAoMikKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMX1ZPUEFNUDNfQURDMiAgICAgICgyKQorICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVk9QQU1QM19BREMzICAgICAgKDMpCisgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF9WT1BBTVA0ICAgICAgICAgICAoNSkKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMX1ZPUEFNUDUgICAgICAgICAgICg1KQorICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVk9QQU1QNiAgICAgICAgICAgKDQpCisgKgorICogICAgICAgICAoMSkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMS5cbgorICogICAgICAgICAoMikgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMi5cbgorICogICAgICAgICAoMykgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMy5cbgorICogICAgICAgICAoNCkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDNC5cbgorICogICAgICAgICAoNSkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDNS5cbgorICogICAgICAgICAoNikgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZXM6IEFEQzEsCisgKiBBREMzLCBBREM1LlxuICg3KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlczoKKyAqIEFEQzEsIEFEQzMsIEFEQzQsIEFEQzUuXG4gT24gdGhpcyBTVE0zMiBzZXJpZXMsIGFsbCBBREN4IGFyZSBub3QgYXZhaWxhYmxlIG9uCisgKiBhbGwgZGV2aWNlcy4gUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgbW9yZSBkZXRhaWxzLiAoOCkgT24gU1RNMzJHNCwgZmFzdAorICogY2hhbm5lbCBhbGxvd3M6IDIuNSAoc2FtcGxpbmcpICsgMTIuNSAoY29udmVyc2lvbikgPSAxNSBBREMgY2xvY2sgY3ljbGVzCisgKiAoZkFEQykgdG8gY29udmVydCBpbiAxMi1iaXQgcmVzb2x1dGlvbi4gT3RoZXIgY2hhbm5lbHMgYXJlIHNsb3cgY2hhbm5lbHMKKyAqIGFsbG93czogNi41IChzYW1wbGluZykgKyAxMi41IChjb252ZXJzaW9uKSA9IDE5IEFEQyBjbG9jayBjeWNsZXMgKGZBREMpIHRvCisgKiBjb252ZXJ0IGluIDEyLWJpdCByZXNvbHV0aW9uLlxuCisgKiBAcmV0dmFsIFZhbHVlICIwIiBpZiB0aGUgY2hhbm5lbCBjb3JyZXNwb25kcyB0byBhIHBhcmFtZXRlciBkZWZpbml0aW9uIG9mIGEKKyAqIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBhIEdQSU8gcGluKS4gVmFsdWUgIjEiIGlmIHRoZQorICogY2hhbm5lbCBjb3JyZXNwb25kcyB0byBhIHBhcmFtZXRlciBkZWZpbml0aW9uIG9mIGEgQURDIGludGVybmFsIGNoYW5uZWwuCisgKi8KKyNkZWZpbmUgX19IQUxfQURDX0lTX0NIQU5ORUxfSU5URVJOQUwoX19DSEFOTkVMX18pIFwKKyAgX19MTF9BRENfSVNfQ0hBTk5FTF9JTlRFUk5BTCgoX19DSEFOTkVMX18pKQorCisvKioKKyAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGNvbnZlcnQgYSBjaGFubmVsIGRlZmluZWQgZnJvbSBwYXJhbWV0ZXIKKyAqICAgICAgICAgZGVmaW5pdGlvbiBvZiBhIEFEQyBpbnRlcm5hbCBjaGFubmVsIChBRENfQ0hBTk5FTF9WUkVGSU5ULAorICogICAgICAgICBBRENfQ0hBTk5FTF9URU1QU0VOU09SLCAuLi4pLAorICogICAgICAgICB0byBpdHMgZXF1aXZhbGVudCBwYXJhbWV0ZXIgZGVmaW5pdGlvbiBvZiBhIEFEQyBleHRlcm5hbCBjaGFubmVsCisgKiAgICAgICAgIChBRENfQ0hBTk5FTF8xLCBBRENfQ0hBTk5FTF8yLCAuLi4pLgorICogQG5vdGUgICBUaGUgY2hhbm5lbCBwYXJhbWV0ZXIgY2FuIGJlLCBhZGRpdGlvbmFsbHkgdG8gYSB2YWx1ZQorICogICAgICAgICBkZWZpbmVkIGZyb20gcGFyYW1ldGVyIGRlZmluaXRpb24gb2YgYSBBREMgaW50ZXJuYWwgY2hhbm5lbAorICogICAgICAgICAoQURDX0NIQU5ORUxfVlJFRklOVCwgQURDX0NIQU5ORUxfVEVNUFNFTlNPUiwgLi4uKSwKKyAqICAgICAgICAgYSB2YWx1ZSBkZWZpbmVkIGZyb20gcGFyYW1ldGVyIGRlZmluaXRpb24gb2YKKyAqICAgICAgICAgQURDIGV4dGVybmFsIGNoYW5uZWwgKEFEQ19DSEFOTkVMXzEsIEFEQ19DSEFOTkVMXzIsIC4uLikKKyAqICAgICAgICAgb3IgYSB2YWx1ZSBmcm9tIGZ1bmN0aW9ucyB3aGVyZSBhIGNoYW5uZWwgbnVtYmVyIGlzIHJldHVybmVkCisgKiAgICAgICAgIGZyb20gQURDIHJlZ2lzdGVycy4KKyAqIEBwYXJhbSAgX19DSEFOTkVMX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzAKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzEgICAgICAgICAgICAgICAgICg4KQorICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMiAgICAgICAgICAgICAgICAgKDgpCisgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8zICAgICAgICAgICAgICAgICAoOCkKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzQgICAgICAgICAgICAgICAgICg4KQorICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfNSAgICAgICAgICAgICAgICAgKDgpCisgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF82CisgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF83CisgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF84CisgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF85CisgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xMAorICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTEKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzEyCisgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xMworICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTQKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzE1CisgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xNgorICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTcKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzE4CisgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF9WUkVGSU5UICAgICAgICAgICAoNykKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMX1RFTVBTRU5TT1JfQURDMSAgICgxKQorICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVEVNUFNFTlNPUl9BREM1ICAgKDUpCisgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF9WQkFUICAgICAgICAgICAgICAoNikKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMX1ZPUEFNUDEgICAgICAgICAgICgxKQorICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVk9QQU1QMiAgICAgICAgICAgKDIpCisgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF9WT1BBTVAzX0FEQzIgICAgICAoMikKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMX1ZPUEFNUDNfQURDMyAgICAgICgzKQorICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVk9QQU1QNCAgICAgICAgICAgKDUpCisgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF9WT1BBTVA1ICAgICAgICAgICAoNSkKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMX1ZPUEFNUDYgICAgICAgICAgICg0KQorICoKKyAqICAgICAgICAgKDEpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzEuXG4KKyAqICAgICAgICAgKDIpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzIuXG4KKyAqICAgICAgICAgKDMpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzMuXG4KKyAqICAgICAgICAgKDQpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzQuXG4KKyAqICAgICAgICAgKDUpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzUuXG4KKyAqICAgICAgICAgKDYpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2VzOiBBREMxLAorICogQURDMywgQURDNS5cbiAoNykgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZXM6CisgKiBBREMxLCBBREMzLCBBREM0LCBBREM1LlxuIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBhbGwgQURDeCBhcmUgbm90IGF2YWlsYWJsZSBvbgorICogYWxsIGRldmljZXMuIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIG1vcmUgZGV0YWlscy4gKDgpIE9uIFNUTTMyRzQsIGZhc3QKKyAqIGNoYW5uZWwgYWxsb3dzOiAyLjUgKHNhbXBsaW5nKSArIDEyLjUgKGNvbnZlcnNpb24pID0gMTUgQURDIGNsb2NrIGN5Y2xlcworICogKGZBREMpIHRvIGNvbnZlcnQgaW4gMTItYml0IHJlc29sdXRpb24uIE90aGVyIGNoYW5uZWxzIGFyZSBzbG93IGNoYW5uZWxzCisgKiBhbGxvd3M6IDYuNSAoc2FtcGxpbmcpICsgMTIuNSAoY29udmVyc2lvbikgPSAxOSBBREMgY2xvY2sgY3ljbGVzIChmQURDKSB0bworICogY29udmVydCBpbiAxMi1iaXQgcmVzb2x1dGlvbi5cbgorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMAorICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMQorICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMgorICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMworICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfNAorICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfNQorICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfNgorICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfNworICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfOAorICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfOQorICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTAKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzExCisgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xMgorICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTMKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzE0CisgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xNQorICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTYKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzE3CisgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xOAorICovCisjZGVmaW5lIF9fSEFMX0FEQ19DSEFOTkVMX0lOVEVSTkFMX1RPX0VYVEVSTkFMKF9fQ0hBTk5FTF9fKSBcCisgIF9fTExfQURDX0NIQU5ORUxfSU5URVJOQUxfVE9fRVhURVJOQUwoKF9fQ0hBTk5FTF9fKSkKKworLyoqCisgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgaW50ZXJuYWwgY2hhbm5lbAorICogICAgICAgICBzZWxlY3RlZCBpcyBhdmFpbGFibGUgb24gdGhlIEFEQyBpbnN0YW5jZSBzZWxlY3RlZC4KKyAqIEBub3RlICAgVGhlIGNoYW5uZWwgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBkZWZpbmVkIGZyb20gcGFyYW1ldGVyCisgKiAgICAgICAgIGRlZmluaXRpb24gb2YgYSBBREMgaW50ZXJuYWwgY2hhbm5lbCAoQURDX0NIQU5ORUxfVlJFRklOVCwKKyAqICAgICAgICAgQURDX0NIQU5ORUxfVEVNUFNFTlNPUiwgLi4uKSwKKyAqICAgICAgICAgbXVzdCBub3QgYmUgYSB2YWx1ZSBkZWZpbmVkIGZyb20gcGFyYW1ldGVyIGRlZmluaXRpb24gb2YKKyAqICAgICAgICAgQURDIGV4dGVybmFsIGNoYW5uZWwgKEFEQ19DSEFOTkVMXzEsIEFEQ19DSEFOTkVMXzIsIC4uLikKKyAqICAgICAgICAgb3IgYSB2YWx1ZSBmcm9tIGZ1bmN0aW9ucyB3aGVyZSBhIGNoYW5uZWwgbnVtYmVyIGlzCisgKiAgICAgICAgIHJldHVybmVkIGZyb20gQURDIHJlZ2lzdGVycywKKyAqICAgICAgICAgYmVjYXVzZSBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgY2hhbm5lbHMgc2hhcmUgdGhlIHNhbWUgY2hhbm5lbAorICogICAgICAgICBudW1iZXIgaW4gQURDIHJlZ2lzdGVycy4gVGhlIGRpZmZlcmVudGlhdGlvbiBpcyBtYWRlIG9ubHkgd2l0aAorICogICAgICAgICBwYXJhbWV0ZXJzIGRlZmluaXRpb25zIG9mIGRyaXZlci4KKyAqIEBwYXJhbSAgX19BRENfSU5TVEFOQ0VfXyBBREMgaW5zdGFuY2UKKyAqIEBwYXJhbSAgX19DSEFOTkVMX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMX1ZSRUZJTlQgICAgICAgICAgICg3KQorICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVEVNUFNFTlNPUl9BREMxICAgKDEpCisgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF9URU1QU0VOU09SX0FEQzUgICAoNSkKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMX1ZCQVQgICAgICAgICAgICAgICg2KQorICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVk9QQU1QMSAgICAgICAgICAgKDEpCisgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF9WT1BBTVAyICAgICAgICAgICAoMikKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMX1ZPUEFNUDNfQURDMiAgICAgICgyKQorICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVk9QQU1QM19BREMzICAgICAgKDMpCisgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF9WT1BBTVA0ICAgICAgICAgICAoNSkKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMX1ZPUEFNUDUgICAgICAgICAgICg1KQorICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVk9QQU1QNiAgICAgICAgICAgKDQpCisgKgorICogICAgICAgICAoMSkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMS5cbgorICogICAgICAgICAoMikgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMi5cbgorICogICAgICAgICAoMykgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMy5cbgorICogICAgICAgICAoNCkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDNC5cbgorICogICAgICAgICAoNSkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDNS5cbgorICogICAgICAgICAoNikgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZXM6IEFEQzEsCisgKiBBREMzLCBBREM1LlxuICg3KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlczoKKyAqIEFEQzEsIEFEQzMsIEFEQzQsIEFEQzUuXG4gT24gdGhpcyBTVE0zMiBzZXJpZXMsIGFsbCBBREN4IGFyZSBub3QgYXZhaWxhYmxlIG9uCisgKiBhbGwgZGV2aWNlcy4gUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgbW9yZSBkZXRhaWxzLgorICogQHJldHZhbCBWYWx1ZSAiMCIgaWYgdGhlIGludGVybmFsIGNoYW5uZWwgc2VsZWN0ZWQgaXMgbm90IGF2YWlsYWJsZSBvbiB0aGUKKyAqIEFEQyBpbnN0YW5jZSBzZWxlY3RlZC4gVmFsdWUgIjEiIGlmIHRoZSBpbnRlcm5hbCBjaGFubmVsIHNlbGVjdGVkIGlzCisgKiBhdmFpbGFibGUgb24gdGhlIEFEQyBpbnN0YW5jZSBzZWxlY3RlZC4KKyAqLworI2RlZmluZSBfX0hBTF9BRENfSVNfQ0hBTk5FTF9JTlRFUk5BTF9BVkFJTEFCTEUoX19BRENfSU5TVEFOQ0VfXywgX19DSEFOTkVMX18pIFwKKyAgX19MTF9BRENfSVNfQ0hBTk5FTF9JTlRFUk5BTF9BVkFJTEFCTEUoKF9fQURDX0lOU1RBTkNFX18pLCAoX19DSEFOTkVMX18pKQorCisjaWYgZGVmaW5lZChBRENfTVVMVElNT0RFX1NVUFBPUlQpCisvKioKKyAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGdldCB0aGUgQURDIG11bHRpbW9kZSBjb252ZXJzaW9uIGRhdGEgb2YgQURDIG1hc3RlcgorICogICAgICAgICBvciBBREMgc2xhdmUgZnJvbSByYXcgdmFsdWUgd2l0aCBib3RoIEFEQyBjb252ZXJzaW9uIGRhdGEKKyAqIGNvbmNhdGVuYXRlZC4KKyAqIEBub3RlICAgVGhpcyBtYWNybyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHdoZW4gbXVsdGltb2RlIHRyYW5zZmVyIGJ5IERNQQorICogICAgICAgICBpcyBlbmFibGVkOiByZWZlciB0byBmdW5jdGlvbiBAcmVmIExMX0FEQ19TZXRNdWx0aURNQVRyYW5zZmVyKCkuCisgKiAgICAgICAgIEluIHRoaXMgY2FzZSB0aGUgdHJhbnNmZXJyZWQgZGF0YSBuZWVkIHRvIHByb2Nlc3NlZCB3aXRoIHRoaXMgbWFjcm8KKyAqICAgICAgICAgdG8gc2VwYXJhdGUgdGhlIGNvbnZlcnNpb24gZGF0YSBvZiBBREMgbWFzdGVyIGFuZCBBREMgc2xhdmUuCisgKiBAcGFyYW0gIF9fQURDX01VTFRJX01BU1RFUl9TTEFWRV9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZworICogdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX01BU1RFUgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX1NMQVZFCisgKiBAcGFyYW0gIF9fQURDX01VTFRJX0NPTlZfREFUQV9fIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMDAgYW5kCisgKiBNYXhfRGF0YT0weEZGRgorICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwIGFuZCBNYXhfRGF0YT0weEZGRgorICovCisjZGVmaW5lIF9fSEFMX0FEQ19NVUxUSV9DT05WX0RBVEFfTUFTVEVSX1NMQVZFKF9fQURDX01VTFRJX01BU1RFUl9TTEFWRV9fLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fQURDX01VTFRJX0NPTlZfREFUQV9fKSAgICBcCisgIF9fTExfQURDX01VTFRJX0NPTlZfREFUQV9NQVNURVJfU0xBVkUoKF9fQURDX01VTFRJX01BU1RFUl9TTEFWRV9fKSwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fQURDX01VTFRJX0NPTlZfREFUQV9fKSkKKyNlbmRpZiAvKiBBRENfTVVMVElNT0RFX1NVUFBPUlQgKi8KKworLyoqCisgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBzZWxlY3QgdGhlIEFEQyBjb21tb24gaW5zdGFuY2UKKyAqICAgICAgICAgdG8gd2hpY2ggaXMgYmVsb25naW5nIHRoZSBzZWxlY3RlZCBBREMgaW5zdGFuY2UuCisgKiBAbm90ZSAgIEFEQyBjb21tb24gcmVnaXN0ZXIgaW5zdGFuY2UgY2FuIGJlIHVzZWQgZm9yOgorICogICAgICAgICAtIFNldCBwYXJhbWV0ZXJzIGNvbW1vbiB0byBzZXZlcmFsIEFEQyBpbnN0YW5jZXMKKyAqICAgICAgICAgLSBNdWx0aW1vZGUgKGZvciBkZXZpY2VzIHdpdGggc2V2ZXJhbCBBREMgaW5zdGFuY2VzKQorICogICAgICAgICBSZWZlciB0byBmdW5jdGlvbnMgaGF2aW5nIGFyZ3VtZW50ICJBREN4eV9DT01NT04iIGFzIHBhcmFtZXRlci4KKyAqIEBwYXJhbSAgX19BREN4X18gQURDIGluc3RhbmNlCisgKiBAcmV0dmFsIEFEQyBjb21tb24gcmVnaXN0ZXIgaW5zdGFuY2UKKyAqLworI2RlZmluZSBfX0hBTF9BRENfQ09NTU9OX0lOU1RBTkNFKF9fQURDeF9fKSBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoKF9fQURDeF9fKSkKKworLyoqCisgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBjaGVjayBpZiBhbGwgQURDIGluc3RhbmNlcyBzaGFyaW5nIHRoZSBzYW1lCisgKiAgICAgICAgIEFEQyBjb21tb24gaW5zdGFuY2UgYXJlIGRpc2FibGVkLgorICogQG5vdGUgICBUaGlzIGNoZWNrIGlzIHJlcXVpcmVkIGJ5IGZ1bmN0aW9ucyB3aXRoIHNldHRpbmcgY29uZGl0aW9uZWQgdG8KKyAqICAgICAgICAgQURDIHN0YXRlOgorICogICAgICAgICBBbGwgQURDIGluc3RhbmNlcyBvZiB0aGUgQURDIGNvbW1vbiBncm91cCBtdXN0IGJlIGRpc2FibGVkLgorICogICAgICAgICBSZWZlciB0byBmdW5jdGlvbnMgaGF2aW5nIGFyZ3VtZW50ICJBREN4eV9DT01NT04iIGFzIHBhcmFtZXRlci4KKyAqIEBub3RlICAgT24gZGV2aWNlcyB3aXRoIG9ubHkgMSBBREMgY29tbW9uIGluc3RhbmNlLCBwYXJhbWV0ZXIgb2YgdGhpcyBtYWNybworICogICAgICAgICBpcyB1c2VsZXNzIGFuZCBjYW4gYmUgaWdub3JlZCAocGFyYW1ldGVyIGtlcHQgZm9yIGNvbXBhdGliaWxpdHkKKyAqICAgICAgICAgd2l0aCBkZXZpY2VzIGZlYXR1cmluZyBzZXZlcmFsIEFEQyBjb21tb24gaW5zdGFuY2VzKS4KKyAqIEBwYXJhbSAgX19BRENYWV9DT01NT05fXyBBREMgY29tbW9uIGluc3RhbmNlCisgKiAgICAgICAgIChjYW4gYmUgc2V0IGRpcmVjdGx5IGZyb20gQ01TSVMgZGVmaW5pdGlvbiBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8KKyAqIEByZWYgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKCkgKQorICogQHJldHZhbCBWYWx1ZSAiMCIgaWYgYWxsIEFEQyBpbnN0YW5jZXMgc2hhcmluZyB0aGUgc2FtZSBBREMgY29tbW9uIGluc3RhbmNlCisgKiAgICAgICAgIGFyZSBkaXNhYmxlZC4KKyAqICAgICAgICAgVmFsdWUgIjEiIGlmIGF0IGxlYXN0IG9uZSBBREMgaW5zdGFuY2Ugc2hhcmluZyB0aGUgc2FtZSBBREMgY29tbW9uCisgKiBpbnN0YW5jZSBpcyBlbmFibGVkLgorICovCisjZGVmaW5lIF9fSEFMX0FEQ19JU19FTkFCTEVEX0FMTF9DT01NT05fSU5TVEFOQ0UoX19BRENYWV9DT01NT05fXykgXAorICBfX0xMX0FEQ19JU19FTkFCTEVEX0FMTF9DT01NT05fSU5TVEFOQ0UoKF9fQURDWFlfQ09NTU9OX18pKQorCisvKioKKyAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGRlZmluZSB0aGUgQURDIGNvbnZlcnNpb24gZGF0YSBmdWxsLXNjYWxlIGRpZ2l0YWwKKyAqICAgICAgICAgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgc2VsZWN0ZWQgQURDIHJlc29sdXRpb24uCisgKiBAbm90ZSAgIEFEQyBjb252ZXJzaW9uIGRhdGEgZnVsbC1zY2FsZSBjb3JyZXNwb25kcyB0byB2b2x0YWdlIHJhbmdlCisgKiAgICAgICAgIGRldGVybWluZWQgYnkgYW5hbG9nIHZvbHRhZ2UgcmVmZXJlbmNlcyBWcmVmKyBhbmQgVnJlZi0KKyAqICAgICAgICAgKHJlZmVyIHRvIHJlZmVyZW5jZSBtYW51YWwpLgorICogQHBhcmFtICBfX0FEQ19SRVNPTFVUSU9OX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19SRVNPTFVUSU9OXzEyQgorICogICAgICAgICBAYXJnIEByZWYgQURDX1JFU09MVVRJT05fMTBCCisgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfUkVTT0xVVElPTl84QgorICogICAgICAgICBAYXJnIEByZWYgQURDX1JFU09MVVRJT05fNkIKKyAqIEByZXR2YWwgQURDIGNvbnZlcnNpb24gZGF0YSBmdWxsLXNjYWxlIGRpZ2l0YWwgdmFsdWUKKyAqLworI2RlZmluZSBfX0hBTF9BRENfRElHSVRBTF9TQ0FMRShfX0FEQ19SRVNPTFVUSU9OX18pIFwKKyAgX19MTF9BRENfRElHSVRBTF9TQ0FMRSgoX19BRENfUkVTT0xVVElPTl9fKSkKKworLyoqCisgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBjb252ZXJ0IHRoZSBBREMgY29udmVyc2lvbiBkYXRhIGZyb20KKyAqICAgICAgICAgYSByZXNvbHV0aW9uIHRvIGFub3RoZXIgcmVzb2x1dGlvbi4KKyAqIEBwYXJhbSAgX19EQVRBX18gQURDIGNvbnZlcnNpb24gZGF0YSB0byBiZSBjb252ZXJ0ZWQKKyAqIEBwYXJhbSAgX19BRENfUkVTT0xVVElPTl9DVVJSRU5UX18gUmVzb2x1dGlvbiBvZiB0byB0aGUgZGF0YSB0byBiZSBjb252ZXJ0ZWQKKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19SRVNPTFVUSU9OXzEyQgorICogICAgICAgICBAYXJnIEByZWYgQURDX1JFU09MVVRJT05fMTBCCisgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfUkVTT0xVVElPTl84QgorICogICAgICAgICBAYXJnIEByZWYgQURDX1JFU09MVVRJT05fNkIKKyAqIEBwYXJhbSAgX19BRENfUkVTT0xVVElPTl9UQVJHRVRfXyBSZXNvbHV0aW9uIG9mIHRoZSBkYXRhIGFmdGVyIGNvbnZlcnNpb24KKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19SRVNPTFVUSU9OXzEyQgorICogICAgICAgICBAYXJnIEByZWYgQURDX1JFU09MVVRJT05fMTBCCisgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfUkVTT0xVVElPTl84QgorICogICAgICAgICBAYXJnIEByZWYgQURDX1JFU09MVVRJT05fNkIKKyAqIEByZXR2YWwgQURDIGNvbnZlcnNpb24gZGF0YSB0byB0aGUgcmVxdWVzdGVkIHJlc29sdXRpb24KKyAqLworI2RlZmluZSBfX0hBTF9BRENfQ09OVkVSVF9EQVRBX1JFU09MVVRJT04oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19EQVRBX18sIF9fQURDX1JFU09MVVRJT05fQ1VSUkVOVF9fLCBfX0FEQ19SRVNPTFVUSU9OX1RBUkdFVF9fKSAgICAgICAgIFwKKyAgX19MTF9BRENfQ09OVkVSVF9EQVRBX1JFU09MVVRJT04oKF9fREFUQV9fKSwgKF9fQURDX1JFU09MVVRJT05fQ1VSUkVOVF9fKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19BRENfUkVTT0xVVElPTl9UQVJHRVRfXykpCisKKy8qKgorICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gY2FsY3VsYXRlIHRoZSB2b2x0YWdlICh1bml0OiBtVm9sdCkKKyAqICAgICAgICAgY29ycmVzcG9uZGluZyB0byBhIEFEQyBjb252ZXJzaW9uIGRhdGEgKHVuaXQ6IGRpZ2l0YWwgdmFsdWUpLgorICogQG5vdGUgICBBbmFsb2cgcmVmZXJlbmNlIHZvbHRhZ2UgKFZyZWYrKSBtdXN0IGJlIGVpdGhlciBrbm93biBmcm9tCisgKiAgICAgICAgIHVzZXIgYm9hcmQgZW52aXJvbm1lbnQgb3IgY2FuIGJlIGNhbGN1bGF0ZWQgdXNpbmcgQURDIG1lYXN1cmVtZW50CisgKiAgICAgICAgIGFuZCBBREMgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ0FMQ19WUkVGQU5BTE9HX1ZPTFRBR0UoKS4KKyAqIEBwYXJhbSAgX19WUkVGQU5BTE9HX1ZPTFRBR0VfXyBBbmFsb2cgcmVmZXJlbmNlIHZvbHRhZ2UgKHVuaXQ6IG1WKQorICogQHBhcmFtICBfX0FEQ19EQVRBX18gQURDIGNvbnZlcnNpb24gZGF0YSAocmVzb2x1dGlvbiAxMiBiaXRzKQorICogICAgICAgICAgICAgICAgICAgICAgICh1bml0OiBkaWdpdGFsIHZhbHVlKS4KKyAqIEBwYXJhbSAgX19BRENfUkVTT0xVVElPTl9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfUkVTT0xVVElPTl8xMkIKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19SRVNPTFVUSU9OXzEwQgorICogICAgICAgICBAYXJnIEByZWYgQURDX1JFU09MVVRJT05fOEIKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19SRVNPTFVUSU9OXzZCCisgKiBAcmV0dmFsIEFEQyBjb252ZXJzaW9uIGRhdGEgZXF1aXZhbGVudCB2b2x0YWdlIHZhbHVlICh1bml0OiBtVm9sdCkKKyAqLworI2RlZmluZSBfX0hBTF9BRENfQ0FMQ19EQVRBX1RPX1ZPTFRBR0UoX19WUkVGQU5BTE9HX1ZPTFRBR0VfXywgX19BRENfREFUQV9fLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0FEQ19SRVNPTFVUSU9OX18pICAgICAgICAgICAgICAgICAgIFwKKyAgX19MTF9BRENfQ0FMQ19EQVRBX1RPX1ZPTFRBR0UoKF9fVlJFRkFOQUxPR19WT0xUQUdFX18pLCAoX19BRENfREFUQV9fKSwgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19BRENfUkVTT0xVVElPTl9fKSkKKworLyoqCisgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBjYWxjdWxhdGUgdGhlIHZvbHRhZ2UgKHVuaXQ6IG1Wb2x0KQorICogICAgICAgICBjb3JyZXNwb25kaW5nIHRvIGEgQURDIGNvbnZlcnNpb24gZGF0YSAodW5pdDogZGlnaXRhbCB2YWx1ZSkKKyAqICAgICAgICAgaW4gZGlmZmVyZW50aWFsIGVuZGVkIG1vZGUuCisgKiBAbm90ZSAgIEFuYWxvZyByZWZlcmVuY2Ugdm9sdGFnZSAoVnJlZispIG11c3QgYmUgZWl0aGVyIGtub3duIGZyb20KKyAqICAgICAgICAgdXNlciBib2FyZCBlbnZpcm9ubWVudCBvciBjYW4gYmUgY2FsY3VsYXRlZCB1c2luZyBBREMgbWVhc3VyZW1lbnQKKyAqICAgICAgICAgYW5kIEFEQyBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19DQUxDX1ZSRUZBTkFMT0dfVk9MVEFHRSgpLgorICogQHBhcmFtICBfX1ZSRUZBTkFMT0dfVk9MVEFHRV9fIEFuYWxvZyByZWZlcmVuY2Ugdm9sdGFnZSAodW5pdDogbVYpCisgKiBAcGFyYW0gIF9fQURDX0RBVEFfXyBBREMgY29udmVyc2lvbiBkYXRhIChyZXNvbHV0aW9uIDEyIGJpdHMpCisgKiAgICAgICAgICAgICAgICAgICAgICAgKHVuaXQ6IGRpZ2l0YWwgdmFsdWUpLgorICogQHBhcmFtICBfX0FEQ19SRVNPTFVUSU9OX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19SRVNPTFVUSU9OXzEyQgorICogICAgICAgICBAYXJnIEByZWYgQURDX1JFU09MVVRJT05fMTBCCisgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfUkVTT0xVVElPTl84QgorICogICAgICAgICBAYXJnIEByZWYgQURDX1JFU09MVVRJT05fNkIKKyAqIEByZXR2YWwgQURDIGNvbnZlcnNpb24gZGF0YSBlcXVpdmFsZW50IHZvbHRhZ2UgdmFsdWUgKHVuaXQ6IG1Wb2x0KQorICovCisjZGVmaW5lIF9fSEFMX0FEQ19DQUxDX0RJRkZfREFUQV9UT19WT0xUQUdFKF9fVlJFRkFOQUxPR19WT0xUQUdFX18sICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0FEQ19EQVRBX18sIF9fQURDX1JFU09MVVRJT05fXykgIFwKKyAgX19MTF9BRENfQ0FMQ19ESUZGX0RBVEFfVE9fVk9MVEFHRSgoX19WUkVGQU5BTE9HX1ZPTFRBR0VfXyksIChfX0FEQ19EQVRBX18pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fQURDX1JFU09MVVRJT05fXykpCisKKy8qKgorICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gY2FsY3VsYXRlIGFuYWxvZyByZWZlcmVuY2Ugdm9sdGFnZSAoVnJlZispCisgKiAgICAgICAgICh1bml0OiBtVm9sdCkgZnJvbSBBREMgY29udmVyc2lvbiBkYXRhIG9mIGludGVybmFsIHZvbHRhZ2UKKyAqICAgICAgICAgcmVmZXJlbmNlIFZyZWZJbnQuCisgKiBAbm90ZSAgIENvbXB1dGF0aW9uIGlzIHVzaW5nIFZyZWZJbnQgY2FsaWJyYXRpb24gdmFsdWUKKyAqICAgICAgICAgc3RvcmVkIGluIHN5c3RlbSBtZW1vcnkgZm9yIGVhY2ggZGV2aWNlIGR1cmluZyBwcm9kdWN0aW9uLgorICogQG5vdGUgICBUaGlzIHZvbHRhZ2UgZGVwZW5kcyBvbiB1c2VyIGJvYXJkIGVudmlyb25tZW50OiB2b2x0YWdlIGxldmVsCisgKiAgICAgICAgIGNvbm5lY3RlZCB0byBwaW4gVnJlZisuCisgKiAgICAgICAgIE9uIGRldmljZXMgd2l0aCBzbWFsbCBwYWNrYWdlLCB0aGUgcGluIFZyZWYrIGlzIG5vdCBwcmVzZW50CisgKiAgICAgICAgIGFuZCBpbnRlcm5hbGx5IGJvbmRlZCB0byBwaW4gVmRkYS4KKyAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIGNhbGlicmF0aW9uIGRhdGEgb2YgaW50ZXJuYWwgdm9sdGFnZSByZWZlcmVuY2UKKyAqICAgICAgICAgVnJlZkludCBjb3JyZXNwb25kcyB0byBhIHJlc29sdXRpb24gb2YgMTIgYml0cywKKyAqICAgICAgICAgdGhpcyBpcyB0aGUgcmVjb21tZW5kZWQgQURDIHJlc29sdXRpb24gdG8gY29udmVydCB2b2x0YWdlIG9mCisgKiAgICAgICAgIGludGVybmFsIHZvbHRhZ2UgcmVmZXJlbmNlIFZyZWZJbnQuCisgKiAgICAgICAgIE90aGVyd2lzZSwgdGhpcyBtYWNybyBwZXJmb3JtcyB0aGUgcHJvY2Vzc2luZyB0byBzY2FsZQorICogICAgICAgICBBREMgY29udmVyc2lvbiBkYXRhIHRvIDEyIGJpdHMuCisgKiBAcGFyYW0gIF9fVlJFRklOVF9BRENfREFUQV9fIEFEQyBjb252ZXJzaW9uIGRhdGEgKHJlc29sdXRpb24gMTIgYml0cykKKyAqICAgICAgICAgb2YgaW50ZXJuYWwgdm9sdGFnZSByZWZlcmVuY2UgVnJlZkludCAodW5pdDogZGlnaXRhbCB2YWx1ZSkuCisgKiBAcGFyYW0gIF9fQURDX1JFU09MVVRJT05fXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgQURDX1JFU09MVVRJT05fMTJCCisgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfUkVTT0xVVElPTl8xMEIKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19SRVNPTFVUSU9OXzhCCisgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfUkVTT0xVVElPTl82QgorICogQHJldHZhbCBBbmFsb2cgcmVmZXJlbmNlIHZvbHRhZ2UgKHVuaXQ6IG1WKQorICovCisjZGVmaW5lIF9fSEFMX0FEQ19DQUxDX1ZSRUZBTkFMT0dfVk9MVEFHRShfX1ZSRUZJTlRfQURDX0RBVEFfXywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19BRENfUkVTT0xVVElPTl9fKSAgIFwKKyAgX19MTF9BRENfQ0FMQ19WUkVGQU5BTE9HX1ZPTFRBR0UoKF9fVlJFRklOVF9BRENfREFUQV9fKSwgKF9fQURDX1JFU09MVVRJT05fXykpCisKKy8qKgorICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gY2FsY3VsYXRlIHRoZSB0ZW1wZXJhdHVyZSAodW5pdDogZGVncmVlIENlbHNpdXMpCisgKiAgICAgICAgIGZyb20gQURDIGNvbnZlcnNpb24gZGF0YSBvZiBpbnRlcm5hbCB0ZW1wZXJhdHVyZSBzZW5zb3IuCisgKiBAbm90ZSAgIENvbXB1dGF0aW9uIGlzIHVzaW5nIHRlbXBlcmF0dXJlIHNlbnNvciBjYWxpYnJhdGlvbiB2YWx1ZXMKKyAqICAgICAgICAgc3RvcmVkIGluIHN5c3RlbSBtZW1vcnkgZm9yIGVhY2ggZGV2aWNlIGR1cmluZyBwcm9kdWN0aW9uLgorICogQG5vdGUgICBDYWxjdWxhdGlvbiBmb3JtdWxhOgorICogICAgICAgICAgIFRlbXBlcmF0dXJlID0gKChUU19BRENfREFUQSAtIFRTX0NBTDEpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICogKFRTX0NBTDJfVEVNUCAtIFRTX0NBTDFfVEVNUCkpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAvIChUU19DQUwyIC0gVFNfQ0FMMSkgKyBUU19DQUwxX1RFTVAKKyAqICAgICAgICAgICB3aXRoIFRTX0FEQ19EQVRBID0gdGVtcGVyYXR1cmUgc2Vuc29yIHJhdyBkYXRhIG1lYXN1cmVkIGJ5IEFEQworICogICAgICAgICAgICAgICAgQXZnX1Nsb3BlID0gKFRTX0NBTDIgLSBUU19DQUwxKQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoVFNfQ0FMMl9URU1QIC0gVFNfQ0FMMV9URU1QKQorICogICAgICAgICAgICAgICAgVFNfQ0FMMSAgID0gZXF1aXZhbGVudCBUU19BRENfREFUQSBhdCB0ZW1wZXJhdHVyZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVNUF9ERUdDX0NBTDEgKGNhbGlicmF0ZWQgaW4gZmFjdG9yeSkKKyAqICAgICAgICAgICAgICAgIFRTX0NBTDIgICA9IGVxdWl2YWxlbnQgVFNfQURDX0RBVEEgYXQgdGVtcGVyYXR1cmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTVBfREVHQ19DQUwyIChjYWxpYnJhdGVkIGluIGZhY3RvcnkpCisgKiAgICAgICAgIENhdXRpb246IENhbGN1bGF0aW9uIHJlbGV2YW5jeSB1bmRlciByZXNlcnZlIHRoYXQgY2FsaWJyYXRpb24KKyAqICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyBhcmUgY29ycmVjdCAoYWRkcmVzcyBhbmQgZGF0YSkuCisgKiAgICAgICAgICAgICAgICAgIFRvIGNhbGN1bGF0ZSB0ZW1wZXJhdHVyZSB1c2luZyB0ZW1wZXJhdHVyZSBzZW5zb3IKKyAqICAgICAgICAgICAgICAgICAgZGF0YXNoZWV0IHR5cGljYWwgdmFsdWVzIChnZW5lcmljIHZhbHVlcyBsZXNzLCB0aGVyZWZvcmUKKyAqICAgICAgICAgICAgICAgICAgbGVzcyBhY2N1cmF0ZSB0aGFuIGNhbGlicmF0ZWQgdmFsdWVzKSwKKyAqICAgICAgICAgICAgICAgICAgdXNlIGhlbHBlciBtYWNybyBAcmVmCisgKiBfX0xMX0FEQ19DQUxDX1RFTVBFUkFUVVJFX1RZUF9QQVJBTVMoKS4KKyAqIEBub3RlICAgQXMgY2FsY3VsYXRpb24gaW5wdXQsIHRoZSBhbmFsb2cgcmVmZXJlbmNlIHZvbHRhZ2UgKFZyZWYrKSBtdXN0IGJlCisgKiAgICAgICAgIGRlZmluZWQgYXMgaXQgaW1wYWN0cyB0aGUgQURDIExTQiBlcXVpdmFsZW50IHZvbHRhZ2UuCisgKiBAbm90ZSAgIEFuYWxvZyByZWZlcmVuY2Ugdm9sdGFnZSAoVnJlZispIG11c3QgYmUgZWl0aGVyIGtub3duIGZyb20KKyAqICAgICAgICAgdXNlciBib2FyZCBlbnZpcm9ubWVudCBvciBjYW4gYmUgY2FsY3VsYXRlZCB1c2luZyBBREMgbWVhc3VyZW1lbnQKKyAqICAgICAgICAgYW5kIEFEQyBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19DQUxDX1ZSRUZBTkFMT0dfVk9MVEFHRSgpLgorICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllcywgY2FsaWJyYXRpb24gZGF0YSBvZiB0ZW1wZXJhdHVyZSBzZW5zb3IKKyAqICAgICAgICAgY29ycmVzcG9uZHMgdG8gYSByZXNvbHV0aW9uIG9mIDEyIGJpdHMsCisgKiAgICAgICAgIHRoaXMgaXMgdGhlIHJlY29tbWVuZGVkIEFEQyByZXNvbHV0aW9uIHRvIGNvbnZlcnQgdm9sdGFnZSBvZgorICogICAgICAgICB0ZW1wZXJhdHVyZSBzZW5zb3IuCisgKiAgICAgICAgIE90aGVyd2lzZSwgdGhpcyBtYWNybyBwZXJmb3JtcyB0aGUgcHJvY2Vzc2luZyB0byBzY2FsZQorICogICAgICAgICBBREMgY29udmVyc2lvbiBkYXRhIHRvIDEyIGJpdHMuCisgKiBAcGFyYW0gIF9fVlJFRkFOQUxPR19WT0xUQUdFX18gIEFuYWxvZyByZWZlcmVuY2Ugdm9sdGFnZSAodW5pdDogbVYpCisgKiBAcGFyYW0gIF9fVEVNUFNFTlNPUl9BRENfREFUQV9fIEFEQyBjb252ZXJzaW9uIGRhdGEgb2YgaW50ZXJuYWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGVyYXR1cmUgc2Vuc29yICh1bml0OiBkaWdpdGFsIHZhbHVlKS4KKyAqIEBwYXJhbSAgX19BRENfUkVTT0xVVElPTl9fICAgICAgQURDIHJlc29sdXRpb24gYXQgd2hpY2ggaW50ZXJuYWwgdGVtcGVyYXR1cmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vuc29yIHZvbHRhZ2UgaGFzIGJlZW4gbWVhc3VyZWQuCisgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfUkVTT0xVVElPTl8xMkIKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19SRVNPTFVUSU9OXzEwQgorICogICAgICAgICBAYXJnIEByZWYgQURDX1JFU09MVVRJT05fOEIKKyAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19SRVNPTFVUSU9OXzZCCisgKiBAcmV0dmFsIFRlbXBlcmF0dXJlICh1bml0OiBkZWdyZWUgQ2Vsc2l1cykKKyAqLworI2RlZmluZSBfX0hBTF9BRENfQ0FMQ19URU1QRVJBVFVSRSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX1ZSRUZBTkFMT0dfVk9MVEFHRV9fLCBfX1RFTVBTRU5TT1JfQURDX0RBVEFfXywgX19BRENfUkVTT0xVVElPTl9fKSBcCisgIF9fTExfQURDX0NBTENfVEVNUEVSQVRVUkUoKF9fVlJFRkFOQUxPR19WT0xUQUdFX18pLCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX1RFTVBTRU5TT1JfQURDX0RBVEFfXyksIChfX0FEQ19SRVNPTFVUSU9OX18pKQorCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBjYWxjdWxhdGUgdGhlIHRlbXBlcmF0dXJlICh1bml0OiBkZWdyZWUgQ2Vsc2l1cykKKyAgKiAgICAgICAgIGZyb20gQURDIGNvbnZlcnNpb24gZGF0YSBvZiBpbnRlcm5hbCB0ZW1wZXJhdHVyZSBzZW5zb3IuCisgICogQG5vdGUgICBDb21wdXRhdGlvbiBpcyB1c2luZyB0ZW1wZXJhdHVyZSBzZW5zb3IgdHlwaWNhbCB2YWx1ZXMKKyAgKiAgICAgICAgIChyZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0KS4KKyAgKiBAbm90ZSAgIENhbGN1bGF0aW9uIGZvcm11bGE6CisgICogICAgICAgICAgIFRlbXBlcmF0dXJlID0gKFRTX1RZUF9DQUx4X1ZPTFQodVYpIC0gVFNfQURDX0RBVEEgKiBDb252ZXJzaW9uX3VWKQorICAqICAgICAgICAgICAgICAgICAgICAgICAgIC8gQXZnX1Nsb3BlICsgQ0FMeF9URU1QCisgICogICAgICAgICAgIHdpdGggVFNfQURDX0RBVEEgICAgICA9IHRlbXBlcmF0dXJlIHNlbnNvciByYXcgZGF0YSBtZWFzdXJlZCBieQorICBBREMKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuaXQ6IGRpZ2l0YWwgdmFsdWUpCisgICogICAgICAgICAgICAgICAgQXZnX1Nsb3BlICAgICAgICA9IHRlbXBlcmF0dXJlIHNlbnNvciBzbG9wZQorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5pdDogdVYvRGVncmVlIENlbHNpdXMpCisgICogICAgICAgICAgICAgICAgVFNfVFlQX0NBTHhfVk9MVCA9IHRlbXBlcmF0dXJlIHNlbnNvciBkaWdpdGFsIHZhbHVlIGF0CisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBlcmF0dXJlIENBTHhfVEVNUCAodW5pdDogbVYpCisgICogICAgICAgICBDYXV0aW9uOiBDYWxjdWxhdGlvbiByZWxldmFuY3kgdW5kZXIgcmVzZXJ2ZSB0aGUgdGVtcGVyYXR1cmUgc2Vuc29yCisgICogICAgICAgICAgICAgICAgICBvZiB0aGUgY3VycmVudCBkZXZpY2UgaGFzIGNoYXJhY3RlcmlzdGljcyBpbiBsaW5lIHdpdGgKKyAgKiAgICAgICAgICAgICAgICAgIGRhdGFzaGVldCB0eXBpY2FsIHZhbHVlcy4KKyAgKiAgICAgICAgICAgICAgICAgIElmIHRlbXBlcmF0dXJlIHNlbnNvciBjYWxpYnJhdGlvbiB2YWx1ZXMgYXJlIGF2YWlsYWJsZSBvbgorICAqICAgICAgICAgICAgICAgICAgb24gdGhpcyBkZXZpY2UgKHByZXNlbmNlIG9mIG1hY3JvCisgIF9fTExfQURDX0NBTENfVEVNUEVSQVRVUkUoKSksCisgICogICAgICAgICAgICAgICAgICB0ZW1wZXJhdHVyZSBjYWxjdWxhdGlvbiB3aWxsIGJlIG1vcmUgYWNjdXJhdGUgdXNpbmcKKyAgKiAgICAgICAgICAgICAgICAgIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0NBTENfVEVNUEVSQVRVUkUoKS4KKyAgKiBAbm90ZSAgIEFzIGNhbGN1bGF0aW9uIGlucHV0LCB0aGUgYW5hbG9nIHJlZmVyZW5jZSB2b2x0YWdlIChWcmVmKykgbXVzdCBiZQorICAqICAgICAgICAgZGVmaW5lZCBhcyBpdCBpbXBhY3RzIHRoZSBBREMgTFNCIGVxdWl2YWxlbnQgdm9sdGFnZS4KKyAgKiBAbm90ZSAgIEFuYWxvZyByZWZlcmVuY2Ugdm9sdGFnZSAoVnJlZispIG11c3QgYmUgZWl0aGVyIGtub3duIGZyb20KKyAgKiAgICAgICAgIHVzZXIgYm9hcmQgZW52aXJvbm1lbnQgb3IgY2FuIGJlIGNhbGN1bGF0ZWQgdXNpbmcgQURDIG1lYXN1cmVtZW50CisgICogICAgICAgICBhbmQgQURDIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0NBTENfVlJFRkFOQUxPR19WT0xUQUdFKCkuCisgICogQG5vdGUgICBBREMgbWVhc3VyZW1lbnQgZGF0YSBtdXN0IGNvcnJlc3BvbmQgdG8gYSByZXNvbHV0aW9uIG9mIDEyYml0cworICAqICAgICAgICAgKGZ1bGwgc2NhbGUgZGlnaXRhbCB2YWx1ZSA0MDk1KS4gSWYgbm90IHRoZSBjYXNlLCB0aGUgZGF0YSBtdXN0IGJlCisgICogICAgICAgICBwcmVsaW1pbmFyaWx5IHJlc2NhbGVkIHRvIGFuIGVxdWl2YWxlbnQgcmVzb2x1dGlvbiBvZiAxMiBiaXRzLgorICAqIEBwYXJhbSAgX19URU1QU0VOU09SX1RZUF9BVkdTTE9QRV9fICAgIERldmljZSBkYXRhc2hlZXQgZGF0YTogVGVtcGVyYXR1cmUKKyAgc2Vuc29yIHNsb3BlIHR5cGljYWwgdmFsdWUgKHVuaXQ6IHVWL0RlZ0NlbHNpdXMpLgorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uIFNUTTMyRzQsIHJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQKKyAgcGFyYW1ldGVyICJBdmdfU2xvcGUiLgorICAqIEBwYXJhbSAgX19URU1QU0VOU09SX1RZUF9DQUxYX1ZfXyAgICAgIERldmljZSBkYXRhc2hlZXQgZGF0YTogVGVtcGVyYXR1cmUKKyAgc2Vuc29yIHZvbHRhZ2UgdHlwaWNhbCB2YWx1ZSAoYXQgdGVtcGVyYXR1cmUgYW5kIFZyZWYrIGRlZmluZWQgaW4gcGFyYW1ldGVycworICBiZWxvdykgKHVuaXQ6IG1WKS4KKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbiBTVE0zMkc0LCByZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0CisgIHBhcmFtZXRlciAiVjMwIiAoY29ycmVzcG9uZGluZyB0byBUU19DQUwxKS4KKyAgKiBAcGFyYW0gIF9fVEVNUFNFTlNPUl9DQUxYX1RFTVBfXyAgICAgIERldmljZSBkYXRhc2hlZXQgZGF0YTogVGVtcGVyYXR1cmUgYXQKKyAgd2hpY2ggdGVtcGVyYXR1cmUgc2Vuc29yIHZvbHRhZ2UgKHNlZSBwYXJhbWV0ZXIgYWJvdmUpIGlzIGNvcnJlc3BvbmRpbmcgKHVuaXQ6CisgIG1WKQorICAqIEBwYXJhbSAgX19WUkVGQU5BTE9HX1ZPTFRBR0VfXyAgICAgICAgQW5hbG9nIHZvbHRhZ2UgcmVmZXJlbmNlIChWcmVmKykKKyAgdm9sdGFnZSAodW5pdDogbVYpCisgICogQHBhcmFtICBfX1RFTVBTRU5TT1JfQURDX0RBVEFfXyAgICAgICBBREMgY29udmVyc2lvbiBkYXRhIG9mIGludGVybmFsCisgIHRlbXBlcmF0dXJlIHNlbnNvciAodW5pdDogZGlnaXRhbCB2YWx1ZSkuCisgICogQHBhcmFtICBfX0FEQ19SRVNPTFVUSU9OX18gICAgICAgICAgICBBREMgcmVzb2x1dGlvbiBhdCB3aGljaCBpbnRlcm5hbAorICB0ZW1wZXJhdHVyZSBzZW5zb3Igdm9sdGFnZSBoYXMgYmVlbiBtZWFzdXJlZC4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgQURDX1JFU09MVVRJT05fMTJCCisgICogICAgICAgICBAYXJnIEByZWYgQURDX1JFU09MVVRJT05fMTBCCisgICogICAgICAgICBAYXJnIEByZWYgQURDX1JFU09MVVRJT05fOEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfUkVTT0xVVElPTl82QgorICAqIEByZXR2YWwgVGVtcGVyYXR1cmUgKHVuaXQ6IGRlZ3JlZSBDZWxzaXVzKQorICAqLworI2RlZmluZSBfX0hBTF9BRENfQ0FMQ19URU1QRVJBVFVSRV9UWVBfUEFSQU1TKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX1RFTVBTRU5TT1JfVFlQX0FWR1NMT1BFX18sIF9fVEVNUFNFTlNPUl9UWVBfQ0FMWF9WX18sICAgICAgICAgICAgICAgICAgICBcCisgICAgX19URU1QU0VOU09SX0NBTFhfVEVNUF9fLCBfX1ZSRUZBTkFMT0dfVk9MVEFHRV9fLCBfX1RFTVBTRU5TT1JfQURDX0RBVEFfXywgXAorICAgIF9fQURDX1JFU09MVVRJT05fXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19MTF9BRENfQ0FMQ19URU1QRVJBVFVSRV9UWVBfUEFSQU1TKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoX19URU1QU0VOU09SX1RZUF9BVkdTTE9QRV9fKSwgKF9fVEVNUFNFTlNPUl9UWVBfQ0FMWF9WX18pLCAgICAgICAgICAgICAgXAorICAgICAgKF9fVEVNUFNFTlNPUl9DQUxYX1RFTVBfXyksIChfX1ZSRUZBTkFMT0dfVk9MVEFHRV9fKSwgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIChfX1RFTVBTRU5TT1JfQURDX0RBVEFfXyksIChfX0FEQ19SRVNPTFVUSU9OX18pKQorCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qIEluY2x1ZGUgQURDIEhBTCBFeHRlbmRlZCBtb2R1bGUgKi8KKyNpbmNsdWRlICJzdG0zMmc0eHhfaGFsX2FkY19leC5oIgorCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIEFEQ19FeHBvcnRlZF9GdW5jdGlvbnMKKyAqIEB7CisgKi8KKworLyoqIEBhZGR0b2dyb3VwIEFEQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxCisgKiBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgKiBAeworICovCisvKiBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ19Jbml0KEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfRGVJbml0KEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKTsKK3ZvaWQgSEFMX0FEQ19Nc3BJbml0KEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKTsKK3ZvaWQgSEFMX0FEQ19Nc3BEZUluaXQoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpOworCisjaWYgKFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorLyogQ2FsbGJhY2tzIFJlZ2lzdGVyL1VuUmVnaXN0ZXIgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfUmVnaXN0ZXJDYWxsYmFjayhBRENfSGFuZGxlVHlwZURlZiAqaGFkYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFEQ19DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfVW5SZWdpc3RlckNhbGxiYWNrKAorICAgIEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjLCBIQUxfQURDX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpOworI2VuZGlmIC8qIFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAYWRkdG9ncm91cCBBRENfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMgorICogQGJyaWVmICAgIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAqIEB7CisgKi8KKy8qIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEJsb2NraW5nIG1vZGU6IFBvbGxpbmcgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfU3RhcnQoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ19TdG9wKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfUG9sbEZvckNvbnZlcnNpb24oQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ19Qb2xsRm9yRXZlbnQoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBFdmVudFR5cGUsIHVpbnQzMl90IFRpbWVvdXQpOworCisvKiBOb24tYmxvY2tpbmcgbW9kZTogSW50ZXJydXB0aW9uICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDX1N0YXJ0X0lUKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfU3RvcF9JVChBRENfSGFuZGxlVHlwZURlZiAqaGFkYyk7CisKKy8qIE5vbi1ibG9ja2luZyBtb2RlOiBETUEgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfU3RhcnRfRE1BKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjLCB1aW50MzJfdCAqcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBMZW5ndGgpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ19TdG9wX0RNQShBRENfSGFuZGxlVHlwZURlZiAqaGFkYyk7CisKKy8qIEFEQyByZXRyaWV2ZSBjb252ZXJzaW9uIHZhbHVlIGludGVuZGVkIHRvIGJlIHVzZWQgd2l0aCBwb2xsaW5nIG9yCisgKiBpbnRlcnJ1cHRpb24gKi8KK3VpbnQzMl90IEhBTF9BRENfR2V0VmFsdWUoY29uc3QgQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpOworCisvKiBBREMgc2FtcGxpbmcgY29udHJvbCAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ19TdGFydFNhbXBsaW5nKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfU3RvcFNhbXBsaW5nKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKTsKKworLyogQURDIElSUUhhbmRsZXIgYW5kIENhbGxiYWNrcyB1c2VkIGluIG5vbi1ibG9ja2luZyBtb2RlcyAoSW50ZXJydXB0aW9uIGFuZAorICogRE1BKSAqLwordm9pZCBIQUxfQURDX0lSUUhhbmRsZXIoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpOwordm9pZCBIQUxfQURDX0NvbnZDcGx0Q2FsbGJhY2soQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpOwordm9pZCBIQUxfQURDX0NvbnZIYWxmQ3BsdENhbGxiYWNrKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKTsKK3ZvaWQgSEFMX0FEQ19MZXZlbE91dE9mV2luZG93Q2FsbGJhY2soQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpOwordm9pZCBIQUxfQURDX0Vycm9yQ2FsbGJhY2soQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpOworLyoqCisgKiBAfQorICovCisKKy8qKiBAYWRkdG9ncm91cCBBRENfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAqIEB7CisgKi8KKy8qIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDX0NvbmZpZ0NoYW5uZWwoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQURDX0NoYW5uZWxDb25mVHlwZURlZiAqcENvbmZpZyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDX0FuYWxvZ1dER0NvbmZpZygKKyAgICBBRENfSGFuZGxlVHlwZURlZiAqaGFkYywgY29uc3QgQURDX0FuYWxvZ1dER0NvbmZUeXBlRGVmICpwQW5hbG9nV0RHQ29uZmlnKTsKKworLyoqCisgKiBAfQorICovCisKKy8qIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogQGFkZHRvZ3JvdXAgQURDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQKKyAqIEB7CisgKi8KK3VpbnQzMl90IEhBTF9BRENfR2V0U3RhdGUoY29uc3QgQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpOwordWludDMyX3QgSEFMX0FEQ19HZXRFcnJvcihjb25zdCBBRENfSGFuZGxlVHlwZURlZiAqaGFkYyk7CisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBBRENfUHJpdmF0ZV9GdW5jdGlvbnMgQURDIFByaXZhdGUgRnVuY3Rpb25zCisgKiBAeworICovCitIQUxfU3RhdHVzVHlwZURlZiBBRENfQ29udmVyc2lvblN0b3AoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ29udmVyc2lvbkdyb3VwKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEFEQ19FbmFibGUoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpOworSEFMX1N0YXR1c1R5cGVEZWYgQURDX0Rpc2FibGUoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpOwordm9pZCBBRENfRE1BQ29udkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOwordm9pZCBBRENfRE1BSGFsZkNvbnZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3ZvaWQgQURDX0RNQUVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyRzR4eF9IQUxfQURDX0ggKi8KZGlmZiAtLWdpdCBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9JbmMvc3RtMzJnNHh4X2hhbF9hZGNfZXguaCBiL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9JbmMvc3RtMzJnNHh4X2hhbF9hZGNfZXguaAppbmRleCAyZGFmMzE1Li5hZWUwNGFjIDEwMDY0NAotLS0gYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9oYWxfYWRjX2V4LmgKKysrIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfaGFsX2FkY19leC5oCkBAIC0xLDE4MDQgKzEsMTcwNyBAQAotLyoqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEBmaWxlICAgIHN0bTMyZzR4eF9oYWxfYWRjX2V4LmgNCi0gKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQ0KLSAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIEFEQyBIQUwgZXh0ZW5kZWQgbW9kdWxlLg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBAYXR0ZW50aW9uDQotICoNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQotICoNCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRlcm1zIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUNCi0gKiBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb2Z0d2FyZSBjb21wb25lbnQuDQotICogSWYgbm8gTElDRU5TRSBmaWxlIGNvbWVzIHdpdGggdGhpcyBzb2Z0d2FyZSwgaXQgaXMgcHJvdmlkZWQgQVMtSVMuDQotICoNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICovDQotDQotLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaWZuZGVmIFNUTTMyRzR4eF9IQUxfQURDX0VYX0gNCi0jZGVmaW5lIFNUTTMyRzR4eF9IQUxfQURDX0VYX0gNCi0NCi0jaWZkZWYgX19jcGx1c3BsdXMNCi1leHRlcm4gIkMiIHsNCi0jZW5kaWYNCi0NCi0vKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpbmNsdWRlICJzdG0zMmc0eHhfaGFsX2RlZi5oIg0KLQ0KLS8qKiBAYWRkdG9ncm91cCBTVE0zMkc0eHhfSEFMX0RyaXZlcg0KLSAqIEB7DQotICovDQotDQotLyoqIEBhZGR0b2dyb3VwIEFEQ0V4DQotICogQHsNCi0gKi8NCi0NCi0vKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgQURDRXhfRXhwb3J0ZWRfVHlwZXMgQURDIEV4dGVuZGVkIEV4cG9ydGVkIFR5cGVzDQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEFEQyBJbmplY3RlZCBDb252ZXJzaW9uIE92ZXJzYW1wbGluZyBzdHJ1Y3R1cmUgZGVmaW5pdGlvbg0KLSAqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gIHVpbnQzMl90DQotICAgICAgUmF0aW87IC8qITwgQ29uZmlndXJlcyB0aGUgb3ZlcnNhbXBsaW5nIHJhdGlvLg0KLSAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX0hBTF9FQ19PVlNfUkFUSU8gKi8NCi0NCi0gIHVpbnQzMl90IFJpZ2h0Qml0U2hpZnQ7IC8qITwgQ29uZmlndXJlcyB0aGUgZGl2aXNpb24gY29lZmZpY2llbnQgZm9yIHRoZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcnNhbXBsZXIuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19IQUxfRUNfT1ZTX1NISUZUICovDQotfSBBRENfSW5qT3ZlcnNhbXBsaW5nVHlwZURlZjsNCi0NCi0vKioNCi0gKiBAYnJpZWYgIFN0cnVjdHVyZSBkZWZpbml0aW9uIG9mIEFEQyBncm91cCBpbmplY3RlZCBhbmQgQURDIGNoYW5uZWwgYWZmZWN0ZWQNCi0gKiB0byBBREMgZ3JvdXAgaW5qZWN0ZWQNCi0gKiBAbm90ZSAgIFBhcmFtZXRlcnMgb2YgdGhpcyBzdHJ1Y3R1cmUgYXJlIHNoYXJlZCB3aXRoaW4gMiBzY29wZXM6DQotICogICAgICAgICAgLSBTY29wZSBjaGFubmVsOiBJbmplY3RlZENoYW5uZWwsIEluamVjdGVkUmFuaywgSW5qZWN0ZWRTYW1wbGluZ1RpbWUNCi0gKiAsIEluamVjdGVkU2luZ2xlRGlmZiwgSW5qZWN0ZWRPZmZzZXROdW1iZXIsIEluamVjdGVkT2Zmc2V0LA0KLSAqIEluamVjdGVkT2Zmc2V0U2lnbiwgSW5qZWN0ZWRPZmZzZXRTYXR1cmF0aW9uDQotICogICAgICAgICAgLSBTY29wZSBBREMgZ3JvdXAgaW5qZWN0ZWQgKGFmZmVjdHMgYWxsIGNoYW5uZWxzIG9mIGluamVjdGVkIGdyb3VwKToNCi0gKiBJbmplY3RlZE5ick9mQ29udmVyc2lvbiwgSW5qZWN0ZWREaXNjb250aW51b3VzQ29udk1vZGUsIEF1dG9JbmplY3RlZENvbnYsDQotICogUXVldWVJbmplY3RlZENvbnRleHQsIEV4dGVybmFsVHJpZ0luamVjQ29udiwgRXh0ZXJuYWxUcmlnSW5qZWNDb252RWRnZSwNCi0gKiBJbmplY092ZXJzYW1wbGluZ01vZGUsIEluamVjT3ZlcnNhbXBsaW5nLg0KLSAqIEBub3RlICAgVGhlIHNldHRpbmcgb2YgdGhlc2UgcGFyYW1ldGVycyBieSBmdW5jdGlvbg0KLSAqIEhBTF9BRENFeF9JbmplY3RlZENvbmZpZ0NoYW5uZWwoKSBpcyBjb25kaXRpb25lZCB0byBBREMgc3RhdGUuIEFEQyBzdGF0ZSBjYW4NCi0gKiBiZSBlaXRoZXI6DQotICogICAgICAgICAgLSBGb3IgYWxsIHBhcmFtZXRlcnM6IEFEQyBkaXNhYmxlZCAodGhpcyBpcyB0aGUgb25seSBwb3NzaWJsZSBBREMNCi0gKiBzdGF0ZSB0byBtb2RpZnkgcGFyYW1ldGVyICdJbmplY3RlZFNpbmdsZURpZmYnKQ0KLSAqICAgICAgICAgIC0gRm9yIHBhcmFtZXRlcnMgJ0luamVjdGVkRGlzY29udGludW91c0NvbnZNb2RlJywNCi0gKiAnUXVldWVJbmplY3RlZENvbnRleHQnLCAnSW5qZWNPdmVyc2FtcGxpbmcnOiBBREMgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24NCi0gKiBvbiBnb2luZyBvbiBpbmplY3RlZCBncm91cC4NCi0gKiAgICAgICAgICAtIEZvciBwYXJhbWV0ZXJzICdJbmplY3RlZFNhbXBsaW5nVGltZScsICdJbmplY3RlZE9mZnNldCcsDQotICogJ0luamVjdGVkT2Zmc2V0TnVtYmVyJywgJ0luamVjdGVkT2Zmc2V0U2lnbicsICdJbmplY3RlZE9mZnNldFNhdHVyYXRpb24nLA0KLSAqICdBdXRvSW5qZWN0ZWRDb252JzogQURDIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nIG9uIHJlZ3VsYXIgYW5kDQotICogaW5qZWN0ZWQgZ3JvdXBzLg0KLSAqICAgICAgICAgIC0gRm9yIHBhcmFtZXRlcnMgJ0luamVjdGVkQ2hhbm5lbCcsICdJbmplY3RlZFJhbmsnLA0KLSAqICdJbmplY3RlZE5ick9mQ29udmVyc2lvbicsICdFeHRlcm5hbFRyaWdJbmplY0NvbnYnLA0KLSAqICdFeHRlcm5hbFRyaWdJbmplY0NvbnZFZGdlJzogQURDIGVuYWJsZWQgYW5kIHdoaWxlIGNvbnZlcnNpb24gb24gZ29pbmcgb24gQURDDQotICogZ3JvdXBzIHJlZ3VsYXIgYW5kIGluamVjdGVkLiBJZiBBREMgaXMgbm90IGluIHRoZSBhcHByb3ByaWF0ZSBzdGF0ZSB0byBtb2RpZnkNCi0gKiBzb21lIHBhcmFtZXRlcnMsIHRoZXNlIHBhcmFtZXRlcnMgc2V0dGluZyBpcyBieXBhc3NlZCB3aXRob3V0IGVycm9yIHJlcG9ydGluZw0KLSAqIChhcyBpdCBjYW4gYmUgdGhlIGV4cGVjdGVkIGJlaGF2aW9yIGluIGNhc2Ugb2YgaW50ZW5kZWQgYWN0aW9uIHRvIHVwZGF0ZQ0KLSAqIGFub3RoZXIgcGFyYW1ldGVyICh3aGljaCBmdWxmaWxscyB0aGUgQURDIHN0YXRlIGNvbmRpdGlvbikgb24gdGhlIGZseSkuDQotICovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgdWludDMyX3QgSW5qZWN0ZWRDaGFubmVsOyAvKiE8IFNwZWNpZmllcyB0aGUgY2hhbm5lbCB0byBjb25maWd1cmUgaW50byBBREMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgaW5qZWN0ZWQuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgQURDX0hBTF9FQ19DSEFOTkVMIE5vdGU6IERlcGVuZGluZyBvbg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VzIGFuZCBBREMgaW5zdGFuY2VzLCBzb21lIGNoYW5uZWxzIG1heSBub3QNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgYXZhaWxhYmxlIG9uIGRldmljZSBwYWNrYWdlIHBpbnMuIFJlZmVyIHRvDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSBkYXRhc2hlZXQgZm9yIGNoYW5uZWxzIGF2YWlsYWJpbGl0eS4gKi8NCi0NCi0gIHVpbnQzMl90DQotICAgICAgSW5qZWN0ZWRSYW5rOyAvKiE8IFNwZWNpZmllcyB0aGUgcmFuayBpbiB0aGUgQURDIGdyb3VwIGluamVjdGVkIHNlcXVlbmNlci4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgIEFEQ19JTkpfU0VRX1JBTktTLiBOb3RlOiB0byBkaXNhYmxlIGEgY2hhbm5lbCBvciBjaGFuZ2UNCi0gICAgICAgICAgICAgICAgICAgICAgIG9yZGVyIG9mIGNvbnZlcnNpb24gc2VxdWVuY2VyLCByYW5rIGNvbnRhaW5pbmcgYSBwcmV2aW91cw0KLSAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCBzZXR0aW5nIGNhbiBiZSBvdmVyd3JpdHRlbiBieSB0aGUgbmV3IGNoYW5uZWwNCi0gICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmcgKG9yIHBhcmFtZXRlciBudW1iZXIgb2YgY29udmVyc2lvbnMgYWRqdXN0ZWQpICovDQotDQotICB1aW50MzJfdA0KLSAgICAgIEluamVjdGVkU2FtcGxpbmdUaW1lOyAvKiE8IFNhbXBsaW5nIHRpbWUgdmFsdWUgdG8gYmUgc2V0IGZvciB0aGUgc2VsZWN0ZWQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbC4gVW5pdDogQURDIGNsb2NrIGN5Y2xlcy4gQ29udmVyc2lvbiB0aW1lDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHRoZSBhZGRpdGlvbiBvZiBzYW1wbGluZyB0aW1lIGFuZCBwcm9jZXNzaW5nDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUgKDEyLjUgQURDIGNsb2NrIGN5Y2xlcyBhdCBBREMgcmVzb2x1dGlvbiAxMg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzLCAxMC41IGN5Y2xlcyBhdCAxMCBiaXRzLCA4LjUgY3ljbGVzIGF0IDgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0cywgNi41IGN5Y2xlcyBhdCA2IGJpdHMpLiBUaGlzIHBhcmFtZXRlciBjYW4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgYSB2YWx1ZSBvZiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19IQUxfRUNfQ0hBTk5FTF9TQU1QTElOR1RJTUUuIENhdXRpb246IFRoaXMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIGFwcGxpZXMgdG8gYSBjaGFubmVsIHRoYXQgY2FuIGJlIHVzZWQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gYSByZWd1bGFyIGFuZC9vciBpbmplY3RlZCBncm91cC4gSXQgb3ZlcndyaXRlcw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbGFzdCBzZXR0aW5nLiBOb3RlOiBJbiBjYXNlIG9mIHVzYWdlIG9mDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsIG1lYXN1cmVtZW50IGNoYW5uZWxzDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChWcmVmSW50L1ZiYXQvVGVtcFNlbnNvciksIHNhbXBsaW5nIHRpbWUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludHMgbXVzdCBiZSByZXNwZWN0ZWQgKHNhbXBsaW5nIHRpbWUgY2FuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGFkanVzdGVkIGluIGZ1bmN0aW9uIG9mIEFEQyBjbG9jayBmcmVxdWVuY3kNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHNhbXBsaW5nIHRpbWUgc2V0dGluZykgUmVmZXIgdG8gZGV2aWNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFzaGVldCBmb3IgdGltaW5ncyB2YWx1ZXMuICovDQotDQotICB1aW50MzJfdA0KLSAgICAgIEluamVjdGVkU2luZ2xlRGlmZjsgLyohPCBTZWxlY3Rpb24gb2Ygc2luZ2xlLWVuZGVkIG9yIGRpZmZlcmVudGlhbCBpbnB1dC4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gZGlmZmVyZW50aWFsIG1vZGU6IERpZmZlcmVudGlhbCBtZWFzdXJlbWVudCBpcw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmV0d2VlbiB0aGUgc2VsZWN0ZWQgY2hhbm5lbCAnaScgKHBvc2l0aXZlIGlucHV0KQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGNoYW5uZWwgJ2krMScgKG5lZ2F0aXZlIGlucHV0KS4gT25seSBjaGFubmVsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaScgaGFzIHRvIGJlIGNvbmZpZ3VyZWQsIGNoYW5uZWwgJ2krMScgaXMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZWQgYXV0b21hdGljYWxseS4gVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBvZiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfSEFMX0VDX0NIQU5ORUxfU0lOR0xFX0RJRkZfRU5ESU5HLiBDYXV0aW9uOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgYXBwbGllcyB0byBhIGNoYW5uZWwgdGhhdCBjYW4gYmUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgaW4gYSByZWd1bGFyIGFuZC9vciBpbmplY3RlZCBncm91cC4gSXQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJ3cml0ZXMgdGhlIGxhc3Qgc2V0dGluZy4gTm90ZTogUmVmZXIgdG8NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZmVyZW5jZSBNYW51YWwgdG8gZW5zdXJlIHRoZSBzZWxlY3RlZCBjaGFubmVsIGlzDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUgaW4gZGlmZmVyZW50aWFsIG1vZGUuIE5vdGU6IFdoZW4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyaW5nIGEgY2hhbm5lbCAnaScgaW4gZGlmZmVyZW50aWFsIG1vZGUsIHRoZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCAnaSsxJyBpcyBub3QgdXNhYmxlIHNlcGFyYXRlbHkuIE5vdGU6IFRoaXMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciBtdXN0IGJlIG1vZGlmaWVkIHdoZW4gQURDIGlzIGRpc2FibGVkDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmVmb3JlIEFEQyBzdGFydCBjb252ZXJzaW9uIG9yIGFmdGVyIEFEQyBzdG9wDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9uKS4gSWYgQURDIGlzIGVuYWJsZWQsIHRoaXMgcGFyYW1ldGVyDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nIGlzIGJ5cGFzc2VkIHdpdGhvdXQgZXJyb3IgcmVwb3J0aW5nIChhcyBpdA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuIGJlIHRoZSBleHBlY3RlZCBiZWhhdmlvciBpbiBjYXNlIG9mIGFub3RoZXINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciB1cGRhdGUgb24gdGhlIGZseSkgKi8NCi0NCi0gIHVpbnQzMl90IEluamVjdGVkT2Zmc2V0TnVtYmVyOyAvKiE8IFNlbGVjdHMgdGhlIG9mZnNldCBudW1iZXIuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0hBTF9FQ19PRkZTRVRfTkIuIENhdXRpb246IE9ubHkgb25lDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0IGlzIGFsbG93ZWQgcGVyIGNoYW5uZWwuIFRoaXMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgb3ZlcndyaXRlcyB0aGUgbGFzdCBzZXR0aW5nLiAqLw0KLQ0KLSAgdWludDMyX3QgSW5qZWN0ZWRPZmZzZXQ7IC8qITwgRGVmaW5lcyB0aGUgb2Zmc2V0IHRvIGJlIGFwcGxpZWQgb24gdGhlIHJhdw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZCBkYXRhLiBPZmZzZXQgdmFsdWUgbXVzdCBiZSBhIHBvc2l0aXZlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyLiBEZXBlbmRpbmcgb2YgQURDIHJlc29sdXRpb24gc2VsZWN0ZWQgKDEyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwLCA4IG9yIDYgYml0cyksIHRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJldHdlZW4gTWluX0RhdGEgPSAweDAwMCBhbmQgTWF4X0RhdGEgPSAweEZGRiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNGRiwgMHhGRiBvciAweDNGIHJlc3BlY3RpdmVseS4gTm90ZTogVGhpcw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciBtdXN0IGJlIG1vZGlmaWVkIHdoZW4gbm8gY29udmVyc2lvbiBpcw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIGdvaW5nIG9uIGJvdGggcmVndWxhciBhbmQgaW5qZWN0ZWQgZ3JvdXBzIChBREMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZCwgb3IgQURDIGVuYWJsZWQgd2l0aG91dCBjb250aW51b3VzIG1vZGUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBleHRlcm5hbCB0cmlnZ2VyIHRoYXQgY291bGQgbGF1bmNoIGENCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9uKS4gKi8NCi0NCi0gIHVpbnQzMl90DQotICAgICAgSW5qZWN0ZWRPZmZzZXRTaWduOyAvKiE8IERlZmluZSBpZiB0aGUgb2Zmc2V0IHNob3VsZCBiZSBzdWJ0cmFjdGVkDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5lZ2F0aXZlIHNpZ24pIG9yIGFkZGVkIChwb3NpdGl2ZSBzaWduKSBmcm9tIG9yIHRvDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJhdyBjb252ZXJ0ZWQgZGF0YS4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBAcmVmIEFEQ0V4X09mZnNldFNpZ24uIE5vdGU6IFRoaXMgcGFyYW1ldGVyIG11c3QNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBtb2RpZmllZCB3aGVuIG5vIGNvbnZlcnNpb24gaXMgb24gZ29pbmcgb24gYm90aA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ3VsYXIgYW5kIGluamVjdGVkIGdyb3VwcyAoQURDIGRpc2FibGVkLCBvciBBREMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkIHdpdGhvdXQgY29udGludW91cyBtb2RlIG9yIGV4dGVybmFsIHRyaWdnZXINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IGNvdWxkIGxhdW5jaCBhIGNvbnZlcnNpb24pLiAqLw0KLSAgRnVuY3Rpb25hbFN0YXRlDQotICAgICAgSW5qZWN0ZWRPZmZzZXRTYXR1cmF0aW9uOyAvKiE8IERlZmluZSBpZiB0aGUgb2Zmc2V0IHNob3VsZCBiZSBzYXR1cmF0ZWQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cG9uIHVuZGVyIG9yIG92ZXIgZmxvdy4gVGhpcyBwYXJhbWV0ZXIgdmFsdWUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW4gYmUgRU5BQkxFIG9yIERJU0FCTEUuIE5vdGU6IFRoaXMgcGFyYW1ldGVyDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVzdCBiZSBtb2RpZmllZCB3aGVuIG5vIGNvbnZlcnNpb24gaXMgb24gZ29pbmcNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiBib3RoIHJlZ3VsYXIgYW5kIGluamVjdGVkIGdyb3VwcyAoQURDDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQsIG9yIEFEQyBlbmFibGVkIHdpdGhvdXQgY29udGludW91cw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgb3IgZXh0ZXJuYWwgdHJpZ2dlciB0aGF0IGNvdWxkIGxhdW5jaCBhDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbikuICovDQotDQotICB1aW50MzJfdA0KLSAgICAgIEluamVjdGVkTmJyT2ZDb252ZXJzaW9uOyAvKiE8IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHJhbmtzIHRoYXQgd2lsbCBiZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgd2l0aGluIHRoZSBBREMgZ3JvdXAgaW5qZWN0ZWQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VyLiBUbyB1c2UgdGhlIGluamVjdGVkIGdyb3VwIHNlcXVlbmNlcg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgY29udmVydCBzZXZlcmFsIHJhbmtzLCBwYXJhbWV0ZXINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NjYW5Db252TW9kZScgbXVzdCBiZSBlbmFibGVkLiBUaGlzIHBhcmFtZXRlcg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAxIGFuZA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhfRGF0YSA9IDQuIENhdXRpb246IHRoaXMgc2V0dGluZyBpbXBhY3RzDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBlbnRpcmUgaW5qZWN0ZWQgZ3JvdXAuIFRoZXJlZm9yZSwgY2FsbCBvZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDRXhfSW5qZWN0ZWRDb25maWdDaGFubmVsKCkgdG8gY29uZmlndXJlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgY2hhbm5lbCBvbiBpbmplY3RlZCBncm91cCBjYW4gaW1wYWN0IHRoZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIG9mIG90aGVyIGNoYW5uZWxzIHByZXZpb3VzbHkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0LiAqLw0KLQ0KLSAgRnVuY3Rpb25hbFN0YXRlDQotICAgICAgSW5qZWN0ZWREaXNjb250aW51b3VzQ29udk1vZGU7IC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGNvbnZlcnNpb25zDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZSBvZiBBREMgZ3JvdXAgaW5qZWN0ZWQgaXMgcGVyZm9ybWVkDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBDb21wbGV0ZS1zZXF1ZW5jZS9EaXNjb250aW51b3VzLXNlcXVlbmNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWFpbiBzZXF1ZW5jZSBzdWJkaXZpZGVkIGluIHN1Y2Nlc3NpdmUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzKS4gRGlzY29udGludW91cyBtb2RlIGlzIHVzZWQgb25seSBpZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VyIGlzIGVuYWJsZWQgKHBhcmFtZXRlcg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NjYW5Db252TW9kZScpLiBJZiBzZXF1ZW5jZXIgaXMgZGlzYWJsZWQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIHBhcmFtZXRlciBpcyBkaXNjYXJkZWQuIERpc2NvbnRpbnVvdXMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgY2FuIGJlIGVuYWJsZWQgb25seSBpZiBjb250aW51b3VzIG1vZGUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGRpc2FibGVkLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgc2V0IHRvDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkFCTEUgb3IgRElTQUJMRS4gTm90ZTogVGhpcyBwYXJhbWV0ZXIgbXVzdA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgbW9kaWZpZWQgd2hlbiBBREMgaXMgZGlzYWJsZWQgKGJlZm9yZSBBREMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0IGNvbnZlcnNpb24gb3IgYWZ0ZXIgQURDIHN0b3ANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb24pLiBOb3RlOiBGb3IgaW5qZWN0ZWQgZ3JvdXAsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNjb250aW51b3VzIG1vZGUgY29udmVydHMgdGhlIHNlcXVlbmNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsIGJ5IGNoYW5uZWwgKGRpc2NvbnRpbnVvdXMgbGVuZ3RoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZCB0byAxIHJhbmspLiBDYXV0aW9uOiB0aGlzIHNldHRpbmcNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGFjdHMgdGhlIGVudGlyZSBpbmplY3RlZCBncm91cC4gVGhlcmVmb3JlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbCBvZiBIQUxfQURDRXhfSW5qZWN0ZWRDb25maWdDaGFubmVsKCkgdG8NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZSBhIGNoYW5uZWwgb24gaW5qZWN0ZWQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwIGNhbiBpbXBhY3QgdGhlIGNvbmZpZ3VyYXRpb24gb2Ygb3RoZXINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzIHByZXZpb3VzbHkgc2V0LiAqLw0KLQ0KLSAgRnVuY3Rpb25hbFN0YXRlDQotICAgICAgQXV0b0luamVjdGVkQ29udjsgLyohPCBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBzZWxlY3RlZCBBREMgZ3JvdXAgaW5qZWN0ZWQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvbWF0aWMgY29udmVyc2lvbiBhZnRlciByZWd1bGFyIG9uZSBUaGlzIHBhcmFtZXRlcg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbiBiZSBzZXQgdG8gRU5BQkxFIG9yIERJU0FCTEUuIE5vdGU6IFRvIHVzZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1dG9tYXRpYyBpbmplY3RlZCBjb252ZXJzaW9uLCBkaXNjb250aW51b3VzIG1vZGUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtdXN0IGJlIGRpc2FibGVkICgnRGlzY29udGludW91c0NvbnZNb2RlJyBhbmQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAnSW5qZWN0ZWREaXNjb250aW51b3VzQ29udk1vZGUnIHNldCB0byBESVNBQkxFKSBOb3RlOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvIHVzZSBBdXRvbWF0aWMgaW5qZWN0ZWQgY29udmVyc2lvbiwgaW5qZWN0ZWQgZ3JvdXANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbCB0cmlnZ2VycyBtdXN0IGJlIGRpc2FibGVkDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdFeHRlcm5hbFRyaWdJbmplY0NvbnYnIHNldCB0bw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19JTkpFQ1RFRF9TT0ZUV0FSRV9TVEFSVCkgTm90ZTogSW4gY2FzZSBvZiBETUENCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIHdpdGggcmVndWxhciBncm91cDogaWYgRE1BIGNvbmZpZ3VyZWQgaW4gbm9ybWFsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSAoc2luZ2xlIHNob3QpIEpBVVRPIHdpbGwgYmUgc3RvcHBlZCB1cG9uIERNQQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyIGNvbXBsZXRlLiBUbyBtYWludGFpbiBKQVVUTyBhbHdheXMgZW5hYmxlZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBETUEgbXVzdCBiZSBjb25maWd1cmVkIGluIGNpcmN1bGFyIG1vZGUuIENhdXRpb246DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBzZXR0aW5nIGltcGFjdHMgdGhlIGVudGlyZSBpbmplY3RlZCBncm91cC4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBUaGVyZWZvcmUsIGNhbGwgb2YgSEFMX0FEQ0V4X0luamVjdGVkQ29uZmlnQ2hhbm5lbCgpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gY29uZmlndXJlIGEgY2hhbm5lbCBvbiBpbmplY3RlZCBncm91cCBjYW4gaW1wYWN0DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gb2Ygb3RoZXIgY2hhbm5lbHMgcHJldmlvdXNseSBzZXQuDQotICAgICAgICAgICAgICAgICAgICAgICAgICovDQotDQotICBGdW5jdGlvbmFsU3RhdGUNCi0gICAgICBRdWV1ZUluamVjdGVkQ29udGV4dDsgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgY29udGV4dCBxdWV1ZSBmZWF0dXJlIGlzDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBzZXQgdG8gRU5BQkxFIG9yDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJU0FCTEUuIElmIGNvbnRleHQgcXVldWUgaXMgZW5hYmxlZCwgaW5qZWN0ZWQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VyJmNoYW5uZWxzIGNvbmZpZ3VyYXRpb25zIGFyZSBxdWV1ZWQgb24NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXAgdG8gMiBjb250ZXh0cy4gSWYgYSBuZXcgaW5qZWN0ZWQgY29udGV4dCBpcw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgd2hlbiBxdWV1ZSBpcyBmdWxsLCBlcnJvciBpcyB0cmlnZ2VyZWQgYnkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0aW9uIGFuZCB0aHJvdWdoIGZ1bmN0aW9uDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0hBTF9BRENFeF9JbmplY3RlZFF1ZXVlT3ZlcmZsb3dDYWxsYmFjaycuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2F1dGlvbjogVGhpcyBmZWF0dXJlIHJlcXVlc3QgdGhhdCB0aGUgc2VxdWVuY2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgZnVsbHkgY29uZmlndXJlZCBiZWZvcmUgaW5qZWN0ZWQgY29udmVyc2lvbg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydC4gVGhlcmVmb3JlLCBjb25maWd1cmUgY2hhbm5lbHMgd2l0aCBhcyBtYW55DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxzIHRvIEhBTF9BRENFeF9JbmplY3RlZENvbmZpZ0NoYW5uZWwoKSBhcyB0aGUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0luamVjdGVkTmJyT2ZDb252ZXJzaW9uJyBwYXJhbWV0ZXIuIENhdXRpb246DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgc2V0dGluZyBpbXBhY3RzIHRoZSBlbnRpcmUgaW5qZWN0ZWQgZ3JvdXAuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZXJlZm9yZSwgY2FsbCBvZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDRXhfSW5qZWN0ZWRDb25maWdDaGFubmVsKCkgdG8gY29uZmlndXJlIGENCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCBvbiBpbmplY3RlZCBncm91cCBjYW4gaW1wYWN0IHRoZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIG9mIG90aGVyIGNoYW5uZWxzIHByZXZpb3VzbHkgc2V0Lg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgbW9kaWZpZWQgd2hlbiBBREMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgZGlzYWJsZWQgKGJlZm9yZSBBREMgc3RhcnQgY29udmVyc2lvbiBvciBhZnRlcg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREMgc3RvcCBjb252ZXJzaW9uKS4gKi8NCi0NCi0gIHVpbnQzMl90DQotICAgICAgRXh0ZXJuYWxUcmlnSW5qZWNDb252OyAvKiE8IFNlbGVjdHMgdGhlIGV4dGVybmFsIGV2ZW50IHVzZWQgdG8gdHJpZ2dlciB0aGUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb24gc3RhcnQgb2YgaW5qZWN0ZWQgZ3JvdXAuIElmIHNldCB0bw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0lOSkVDVEVEX1NPRlRXQVJFX1NUQVJULCBleHRlcm5hbCB0cmlnZ2Vycw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIGRpc2FibGVkIGFuZCBzb2Z0d2FyZSB0cmlnZ2VyIGlzIHVzZWQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RlYWQuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19pbmplY3RlZF9leHRlcm5hbF90cmlnZ2VyX3NvdXJjZS4gQ2F1dGlvbjoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgc2V0dGluZyBpbXBhY3RzIHRoZSBlbnRpcmUgaW5qZWN0ZWQgZ3JvdXAuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGVyZWZvcmUsIGNhbGwgb2YNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENFeF9JbmplY3RlZENvbmZpZ0NoYW5uZWwoKSB0byBjb25maWd1cmUgYQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCBvbiBpbmplY3RlZCBncm91cCBjYW4gaW1wYWN0IHRoZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBvZiBvdGhlciBjaGFubmVscyBwcmV2aW91c2x5IHNldC4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLQ0KLSAgdWludDMyX3QNCi0gICAgICBFeHRlcm5hbFRyaWdJbmplY0NvbnZFZGdlOyAvKiE8IFNlbGVjdHMgdGhlIGV4dGVybmFsIHRyaWdnZXIgZWRnZSBvZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdGVkIGdyb3VwLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfaW5qZWN0ZWRfZXh0ZXJuYWxfdHJpZ2dlcl9lZGdlLiBJZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXIgc291cmNlIGlzIHNldCB0bw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19JTkpFQ1RFRF9TT0ZUV0FSRV9TVEFSVCwgdGhpcyBwYXJhbWV0ZXINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBkaXNjYXJkZWQuIENhdXRpb246IHRoaXMgc2V0dGluZyBpbXBhY3RzDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGVudGlyZSBpbmplY3RlZCBncm91cC4gVGhlcmVmb3JlLCBjYWxsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgSEFMX0FEQ0V4X0luamVjdGVkQ29uZmlnQ2hhbm5lbCgpIHRvDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmUgYSBjaGFubmVsIG9uIGluamVjdGVkDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgY2FuIGltcGFjdCB0aGUgY29uZmlndXJhdGlvbiBvZiBvdGhlcg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzIHByZXZpb3VzbHkgc2V0LiAqLw0KLQ0KLSAgRnVuY3Rpb25hbFN0YXRlDQotICAgICAgSW5qZWNPdmVyc2FtcGxpbmdNb2RlOyAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBvdmVyc2FtcGxpbmcgZmVhdHVyZSBpcw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZCBvciBkaXNhYmxlZC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHNldA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gRU5BQkxFIG9yIERJU0FCTEUuIE5vdGU6IFRoaXMgcGFyYW1ldGVyIGNhbg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgbW9kaWZpZWQgb25seSBpZiB0aGVyZSBpcyBubyBjb252ZXJzaW9uIGlzDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmdvaW5nIChib3RoIEFEU1RBUlQgYW5kIEpBRFNUQVJUIGNsZWFyZWQpLiAqLw0KLQ0KLSAgQURDX0luak92ZXJzYW1wbGluZ1R5cGVEZWYNCi0gICAgICBJbmplY092ZXJzYW1wbGluZzsgLyohPCBTcGVjaWZpZXMgdGhlIE92ZXJzYW1wbGluZyBwYXJhbWV0ZXJzLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhdXRpb246IHRoaXMgc2V0dGluZyBvdmVyd3JpdGVzIHRoZSBwcmV2aW91cw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyc2FtcGxpbmcgY29uZmlndXJhdGlvbiBpZiBvdmVyc2FtcGxpbmcgYWxyZWFkeQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkLiBOb3RlOiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgbW9kaWZpZWQgb25seQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0aGVyZSBpcyBubyBjb252ZXJzaW9uIGlzIG9uZ29pbmcgKGJvdGggQURTVEFSVA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgSkFEU1RBUlQgY2xlYXJlZCkuICovDQotfSBBRENfSW5qZWN0aW9uQ29uZlR5cGVEZWY7DQotDQotI2lmIGRlZmluZWQoQURDX01VTFRJTU9ERV9TVVBQT1JUKQ0KLS8qKg0KLSAqIEBicmllZiAgU3RydWN0dXJlIGRlZmluaXRpb24gb2YgQURDIG11bHRpbW9kZQ0KLSAqIEBub3RlICAgVGhlIHNldHRpbmcgb2YgdGhlc2UgcGFyYW1ldGVycyBieSBmdW5jdGlvbg0KLSAqIEhBTF9BRENFeF9NdWx0aU1vZGVDb25maWdDaGFubmVsKCkgaXMgY29uZGl0aW9uZWQgYnkgQURDcyBzdGF0ZSAoYm90aCBNYXN0ZXINCi0gKiBhbmQgU2xhdmUgQURDcykuIEJvdGggTWFzdGVyIGFuZCBTbGF2ZSBBRENzIG11c3QgYmUgZGlzYWJsZWQuDQotICovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgdWludDMyX3QNCi0gICAgICBNb2RlOyAvKiE8IENvbmZpZ3VyZXMgdGhlIEFEQyB0byBvcGVyYXRlIGluIGluZGVwZW5kZW50IG9yIG11bHRpbW9kZS4NCi0gICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX0hBTF9FQ19NVUxUSV9NT0RFLiAqLw0KLQ0KLSAgdWludDMyX3QgRE1BQWNjZXNzTW9kZTsgLyohPCBDb25maWd1cmVzIHRoZSBETUEgbW9kZSBmb3IgbXVsdGltb2RlIEFEQzoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uIHdoZXRoZXIgMiBETUEgY2hhbm5lbHMgKGVhY2ggQURDIHVzZXMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0cyBvd24gRE1BIGNoYW5uZWwpIG9yIDEgRE1BIGNoYW5uZWwgKG9uZSBETUENCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgZm9yIGJvdGggQURDLCBETUEgb2YgQURDIG1hc3RlcikgVGhpcw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19IQUxfRUNfTVVMVElfRE1BX1RSQU5TRkVSX1JFU09MVVRJT04uICovDQotDQotICB1aW50MzJfdCBUd29TYW1wbGluZ0RlbGF5OyAvKiE8IENvbmZpZ3VyZXMgdGhlIERlbGF5IGJldHdlZW4gMiBzYW1wbGluZw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhhc2VzLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfSEFMX0VDX01VTFRJX1RXT1NNUF9ERUxBWS4gRGVsYXkgcmFuZ2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZHMgb24gc2VsZWN0ZWQgcmVzb2x1dGlvbjogZnJvbSAxIHRvIDEyDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9jayBjeWNsZXMgZm9yIDEyIGJpdHMsIGZyb20gMSB0byAxMCBjbG9jaw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ljbGVzIGZvciAxMCBiaXRzLCBmcm9tIDEgdG8gOCBjbG9jayBjeWNsZXMgZm9yDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4IGJpdHMsIGZyb20gMSB0byA2IGNsb2NrIGN5Y2xlcyBmb3IgNiBiaXRzLiAqLw0KLX0gQURDX011bHRpTW9kZVR5cGVEZWY7DQotI2VuZGlmIC8qIEFEQ19NVUxUSU1PREVfU1VQUE9SVCAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0NCi0vKiogQGRlZmdyb3VwIEFEQ0V4X0V4cG9ydGVkX0NvbnN0YW50cyBBREMgRXh0ZW5kZWQgRXhwb3J0ZWQgQ29uc3RhbnRzDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEFEQ19pbmplY3RlZF9leHRlcm5hbF90cmlnZ2VyX3NvdXJjZSBBREMgZ3JvdXAgaW5qZWN0ZWQgdHJpZ2dlcg0KLSAqIHNvdXJjZQ0KLSAqIEB7DQotICovDQotLyogQURDIGdyb3VwIHJlZ3VsYXIgdHJpZ2dlciBzb3VyY2VzIGZvciBhbGwgQURDIGluc3RhbmNlcyAqLw0KLSNkZWZpbmUgQURDX0lOSkVDVEVEX1NPRlRXQVJFX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfSU5KX1RSSUdfU09GVFdBUkUpIC8qITwgU29mdHdhcmUgdHJpZ2dlcnMgaW5qZWN0ZWQgZ3JvdXAgY29udmVyc2lvbiBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCAqLw0KLSNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QxX1RSR08gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTFfVFJHTykgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMSBUUkdPLiAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZykuICovDQotI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDFfVFJHTzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTFfVFJHTzIpIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU0xIFRSR08yLiAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmcpLiAqLw0KLSNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QxX0NDMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19JTkpfVFJJR19FWFRfVElNMV9DSDMpIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMSBjaGFubmVsIDMgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50IChjYXB0dXJlIGNvbXBhcmU6IGlucHV0IGNhcHR1cmUgb3IgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBjYXB0dXJlKS4gVHJpZ2dlciBlZGdlIHNldCB0byAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLw0KLSNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QxX0NDNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19JTkpfVFJJR19FWFRfVElNMV9DSDQpIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMSBjaGFubmVsIDQgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50IChjYXB0dXJlIGNvbXBhcmU6IGlucHV0IGNhcHR1cmUgb3IgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBjYXB0dXJlKS4gVHJpZ2dlciBlZGdlIHNldCB0byAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLw0KLSNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QyX1RSR08gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTJfVFJHTykgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMiBUUkdPLiAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZykuICovDQotI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDJfQ0MxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX0lOSl9UUklHX0VYVF9USU0yX0NIMSkgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU0yIGNoYW5uZWwgMSBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQgKGNhcHR1cmUgY29tcGFyZTogaW5wdXQgY2FwdHVyZSBvciBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IGNhcHR1cmUpLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovDQotI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDNfVFJHTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19JTkpfVFJJR19FWFRfVElNM19UUkdPKSAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU0zIFRSR08uICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nKS4gKi8NCi0jZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UM19DQzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTNfQ0gxKSAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTMgY2hhbm5lbCAxIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgY2FwdHVyZSkuIFRyaWdnZXIgZWRnZSBzZXQgdG8gICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8NCi0jZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UM19DQzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTNfQ0gzKSAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTMgY2hhbm5lbCAzIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgY2FwdHVyZSkuIFRyaWdnZXIgZWRnZSBzZXQgdG8gICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8NCi0jZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UM19DQzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTNfQ0g0KSAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTMgY2hhbm5lbCA0IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgY2FwdHVyZSkuIFRyaWdnZXIgZWRnZSBzZXQgdG8gICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8NCi0jZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UNF9UUkdPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX0lOSl9UUklHX0VYVF9USU00X1RSR08pIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTQgVFJHTy4gICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmcpLiAqLw0KLSNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDX1Q0X0NDMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19JTkpfVFJJR19FWFRfVElNNF9DSDMpIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNNCBjaGFubmVsIDMgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50IChjYXB0dXJlIGNvbXBhcmU6IGlucHV0IGNhcHR1cmUgb3IgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBjYXB0dXJlKS4gVHJpZ2dlciBlZGdlIHNldCB0byAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLw0KLSNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDX1Q0X0NDNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19JTkpfVFJJR19FWFRfVElNNF9DSDQpIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNNCBjaGFubmVsIDQgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50IChjYXB0dXJlIGNvbXBhcmU6IGlucHV0IGNhcHR1cmUgb3IgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBjYXB0dXJlKS4gVHJpZ2dlciBlZGdlIHNldCB0byAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLw0KLSNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDX1Q2X1RSR08gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTZfVFJHTykgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNNiBUUkdPLiAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZykuICovDQotI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDdfVFJHTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19JTkpfVFJJR19FWFRfVElNN19UUkdPKSAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU03IFRSR08uICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nKS4gKi8NCi0jZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UOF9UUkdPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX0lOSl9UUklHX0VYVF9USU04X1RSR08pIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTggVFJHTy4gICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmcpLiAqLw0KLSNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDX1Q4X1RSR08yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX0lOSl9UUklHX0VYVF9USU04X1RSR08yKSAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNOCBUUkdPMi4gICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nKS4gKi8NCi0jZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UOF9DQzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfSU5KX1RSSUdfRVhUX1RJTThfQ0gyKSAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTggY2hhbm5lbCAyIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgY2FwdHVyZSkuIFRyaWdnZXIgZWRnZSBzZXQgdG8gICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8NCi0jZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UOF9DQzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfSU5KX1RSSUdfRVhUX1RJTThfQ0g0KSAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTggY2hhbm5lbCA0IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgY2FwdHVyZSkuIFRyaWdnZXIgZWRnZSBzZXQgdG8gICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8NCi0jZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UMTVfVFJHTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19JTkpfVFJJR19FWFRfVElNMTVfVFJHTykgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTE1IFRSR08uICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZykuICovDQotI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDE2X0NDMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19JTkpfVFJJR19FWFRfVElNMTZfQ0gxKSAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU04IGNoYW5uZWwgNCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50IChjYXB0dXJlIGNvbXBhcmU6IGlucHV0IGNhcHR1cmUgb3IgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgY2FwdHVyZSkuIFRyaWdnZXIgZWRnZSBzZXQgdG8gICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovDQotI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDIwX1RSR08gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTIwX1RSR08pIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU0yMCBUUkdPLiAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmcpLiAqLw0KLSNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QyMF9UUkdPMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX0lOSl9UUklHX0VYVF9USU0yMF9UUkdPMikgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTIwIFRSR08yLiAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgICAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgc2V0dGluZykuICovDQotI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDIwX0NDMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTIwX0NIMikgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTIwIGNoYW5uZWwgMiBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50IChjYXB0dXJlIGNvbXBhcmU6IGlucHV0IGNhcHR1cmUgb3IgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IGNhcHR1cmUpLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8NCi0jZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UMjBfQ0M0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19JTkpfVFJJR19FWFRfVElNMjBfQ0g0KSAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMjAgY2hhbm5lbCA0IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQgKGNhcHR1cmUgY29tcGFyZTogaW5wdXQgY2FwdHVyZSBvciAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgY2FwdHVyZSkuIFRyaWdnZXIgZWRnZSBzZXQgdG8gICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLw0KLSNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDX0hSVElNX1RSRzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfSU5KX1RSSUdfRVhUX0hSVElNX1RSRzEpIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IEhSVElNRVIgQURDICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlciAxIGV2ZW50LiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLw0KLSNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDX0hSVElNX1RSRzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfSU5KX1RSSUdfRVhUX0hSVElNX1RSRzIpIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IEhSVElNRVIgQURDICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlciAyIGV2ZW50LiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLw0KLSNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDX0hSVElNX1RSRzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfSU5KX1RSSUdfRVhUX0hSVElNX1RSRzMpIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IEhSVElNRVIgQURDICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlciAzIGV2ZW50LiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLw0KLSNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDX0hSVElNX1RSRzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfSU5KX1RSSUdfRVhUX0hSVElNX1RSRzQpIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IEhSVElNRVIgQURDICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlciA0IGV2ZW50LiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLw0KLSNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDX0hSVElNX1RSRzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfSU5KX1RSSUdfRVhUX0hSVElNX1RSRzUpIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IEhSVElNRVIgQURDICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlciA1IGV2ZW50LiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLw0KLSNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDX0hSVElNX1RSRzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfSU5KX1RSSUdfRVhUX0hSVElNX1RSRzYpIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IEhSVElNRVIgQURDICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlciA2IGV2ZW50LiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLw0KLSNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDX0hSVElNX1RSRzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfSU5KX1RSSUdfRVhUX0hSVElNX1RSRzcpIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IEhSVElNRVIgQURDICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlciA3IGV2ZW50LiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLw0KLSNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDX0hSVElNX1RSRzggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfSU5KX1RSSUdfRVhUX0hSVElNX1RSRzgpIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IEhSVElNRVIgQURDICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlciA4IGV2ZW50LiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLw0KLSNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDX0hSVElNX1RSRzkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfSU5KX1RSSUdfRVhUX0hSVElNX1RSRzkpIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IEhSVElNRVIgQURDICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlciA5IGV2ZW50LiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLw0KLSNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDX0hSVElNX1RSRzEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX0lOSl9UUklHX0VYVF9IUlRJTV9UUkcxMCkgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IEhSVElNRVIgQURDICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXIgMTAgZXZlbnQuIFRyaWdnZXIgZWRnZSBzZXQgdG8gICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovDQotI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNfRVhUX0lUMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19JTkpfVFJJR19FWFRfRVhUSV9MSU5FMykgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogZXh0ZXJuYWwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHQgbGluZSAzLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovDQotI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNfRVhUX0lUMTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfSU5KX1RSSUdfRVhUX0VYVElfTElORTE1KSAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogZXh0ZXJuYWwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0IGxpbmUgMTUuIFRyaWdnZXIgZWRnZSBzZXQgdG8gIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8NCi0jZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19MUFRJTV9PVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfSU5KX1RSSUdfRVhUX0xQVElNX09VVCkgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBMUFRJTUVSIE9VVCAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgc2V0dGluZykuICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEFEQ19pbmplY3RlZF9leHRlcm5hbF90cmlnZ2VyX2VkZ2UgQURDIGdyb3VwIGluamVjdGVkIHRyaWdnZXIgZWRnZQ0KLSAqICh3aGVuIGV4dGVybmFsIHRyaWdnZXIgaXMgc2VsZWN0ZWQpDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfRURHRV9OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKDB4MDAwMDAwMDBVTCkgLyohPCBJbmplY3RlZCBjb252ZXJzaW9ucyBoYXJkd2FyZSB0cmlnZ2VyIGRldGVjdGlvbiBkaXNhYmxlZCBcDQotICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfRURHRV9SSVNJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0pTUVJfSkVYVEVOXzApIC8qITwgSW5qZWN0ZWQgY29udmVyc2lvbnMgaGFyZHdhcmUgdHJpZ2dlciBkZXRlY3Rpb24gb24gXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcmlzaW5nIGVkZ2UgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfRURHRV9GQUxMSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0pTUVJfSkVYVEVOXzEpIC8qITwgSW5qZWN0ZWQgY29udmVyc2lvbnMgaGFyZHdhcmUgdHJpZ2dlciBkZXRlY3Rpb24gb24gXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZmFsbGluZyBlZGdlICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfRURHRV9SSVNJTkdGQUxMSU5HICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19KU1FSX0pFWFRFTikgLyohPCBJbmplY3RlZCBjb252ZXJzaW9ucyBoYXJkd2FyZSB0cmlnZ2VyIGRldGVjdGlvbiBvbiBcDQotICAgICAgICAgICAgICAgICAgICAgICBib3RoIHRoZSByaXNpbmcgYW5kIGZhbGxpbmcgZWRnZXMgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQURDX0hBTF9FQ19DSEFOTkVMX1NJTkdMRV9ESUZGX0VORElORyAgQ2hhbm5lbCAtIFNpbmdsZSBvcg0KLSAqIGRpZmZlcmVudGlhbCBlbmRpbmcNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgQURDX1NJTkdMRV9FTkRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19TSU5HTEVfRU5ERUQpIC8qITwgQURDIGNoYW5uZWwgZW5kaW5nIHNldCB0byBzaW5nbGUgZW5kZWQgKGxpdGVyYWwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsc28gdXNlZCB0byBzZXQgY2FsaWJyYXRpb24gbW9kZSkgKi8NCi0jZGVmaW5lIEFEQ19ESUZGRVJFTlRJQUxfRU5ERUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfRElGRkVSRU5USUFMX0VOREVEKSAvKiE8IEFEQyBjaGFubmVsIGVuZGluZyBzZXQgdG8gZGlmZmVyZW50aWFsICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGl0ZXJhbCBhbHNvIHVzZWQgdG8gc2V0IGNhbGlicmF0aW9uIG1vZGUpIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQURDX0hBTF9FQ19PRkZTRVRfTkIgIEFEQyBpbnN0YW5jZSAtIE9mZnNldCBudW1iZXINCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgQURDX09GRlNFVF9OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19PRkZTRVRfNCArIDFVKSAvKiE8IEFEQyBvZmZzZXQgZGlzYWJsZWQ6IG5vIG9mZnNldCBjb3JyZWN0aW9uIGZvciB0aGUgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZCBBREMgY2hhbm5lbCAqLw0KLSNkZWZpbmUgQURDX09GRlNFVF8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfT0ZGU0VUXzEpIC8qITwgQURDIG9mZnNldCBudW1iZXIgMTogQURDIGNoYW5uZWwgYW5kIG9mZnNldCBsZXZlbCB0byBcDQotICAgICAgICAgICAgICAgICAgICAgICB3aGljaCB0aGUgb2Zmc2V0IHByb2dyYW1tZWQgd2lsbCBiZSBhcHBsaWVkICAgICAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgKGluZGVwZW5kZW50bHkgb2YgY2hhbm5lbCBtYXBwZWQgb24gQURDIGdyb3VwIHJlZ3VsYXIgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgIG9yIGdyb3VwIGluamVjdGVkKSAqLw0KLSNkZWZpbmUgQURDX09GRlNFVF8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfT0ZGU0VUXzIpIC8qITwgQURDIG9mZnNldCBudW1iZXIgMjogQURDIGNoYW5uZWwgYW5kIG9mZnNldCBsZXZlbCB0byBcDQotICAgICAgICAgICAgICAgICAgICAgICB3aGljaCB0aGUgb2Zmc2V0IHByb2dyYW1tZWQgd2lsbCBiZSBhcHBsaWVkICAgICAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgKGluZGVwZW5kZW50bHkgb2YgY2hhbm5lbCBtYXBwZWQgb24gQURDIGdyb3VwIHJlZ3VsYXIgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgIG9yIGdyb3VwIGluamVjdGVkKSAqLw0KLSNkZWZpbmUgQURDX09GRlNFVF8zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfT0ZGU0VUXzMpIC8qITwgQURDIG9mZnNldCBudW1iZXIgMzogQURDIGNoYW5uZWwgYW5kIG9mZnNldCBsZXZlbCB0byBcDQotICAgICAgICAgICAgICAgICAgICAgICB3aGljaCB0aGUgb2Zmc2V0IHByb2dyYW1tZWQgd2lsbCBiZSBhcHBsaWVkICAgICAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgKGluZGVwZW5kZW50bHkgb2YgY2hhbm5lbCBtYXBwZWQgb24gQURDIGdyb3VwIHJlZ3VsYXIgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgIG9yIGdyb3VwIGluamVjdGVkKSAqLw0KLSNkZWZpbmUgQURDX09GRlNFVF80ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfT0ZGU0VUXzQpIC8qITwgQURDIG9mZnNldCBudW1iZXIgNDogQURDIGNoYW5uZWwgYW5kIG9mZnNldCBsZXZlbCB0byBcDQotICAgICAgICAgICAgICAgICAgICAgICB3aGljaCB0aGUgb2Zmc2V0IHByb2dyYW1tZWQgd2lsbCBiZSBhcHBsaWVkICAgICAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgKGluZGVwZW5kZW50bHkgb2YgY2hhbm5lbCBtYXBwZWQgb24gQURDIGdyb3VwIHJlZ3VsYXIgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgIG9yIGdyb3VwIGluamVjdGVkKSAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBBRENFeF9PZmZzZXRTaWduIEFEQyBFeHRlbmRlZCBPZmZzZXQgU2lnbg0KLSAqIEB7DQotICovDQotI2RlZmluZSBBRENfT0ZGU0VUX1NJR05fTkVHQVRJVkUgXA0KLSAgKDB4MDAwMDAwMDBVTCkgLyohPCBPZmZzZXQgc2lnbiBuZWdhdGl2ZSwgb2Zmc2V0IGlzIHN1YnRyYWN0ZWQgKi8NCi0jZGVmaW5lIEFEQ19PRkZTRVRfU0lHTl9QT1NJVElWRSBcDQotICAoQURDX09GUjFfT0ZGU0VUUE9TKSAvKiE8IE9mZnNldCBzaWduIHBvc2l0aXZlLCBvZmZzZXQgaXMgYWRkZWQgICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEFEQ19JTkpfU0VRX1JBTktTICBBREMgZ3JvdXAgaW5qZWN0ZWQgLSBTZXF1ZW5jZXIgcmFua3MNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgQURDX0lOSkVDVEVEX1JBTktfMSBcDQotICAoTExfQURDX0lOSl9SQU5LXzEpIC8qITwgQURDIGdyb3VwIGluamVjdGVkIHNlcXVlbmNlciByYW5rIDEgKi8NCi0jZGVmaW5lIEFEQ19JTkpFQ1RFRF9SQU5LXzIgXA0KLSAgKExMX0FEQ19JTkpfUkFOS18yKSAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBzZXF1ZW5jZXIgcmFuayAyICovDQotI2RlZmluZSBBRENfSU5KRUNURURfUkFOS18zIFwNCi0gIChMTF9BRENfSU5KX1JBTktfMykgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgc2VxdWVuY2VyIHJhbmsgMyAqLw0KLSNkZWZpbmUgQURDX0lOSkVDVEVEX1JBTktfNCBcDQotICAoTExfQURDX0lOSl9SQU5LXzQpIC8qITwgQURDIGdyb3VwIGluamVjdGVkIHNlcXVlbmNlciByYW5rIDQgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLSNpZiBkZWZpbmVkKEFEQ19NVUxUSU1PREVfU1VQUE9SVCkNCi0vKiogQGRlZmdyb3VwIEFEQ19IQUxfRUNfTVVMVElfTU9ERSAgTXVsdGltb2RlIC0gTW9kZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBBRENfTU9ERV9JTkRFUEVOREVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX01VTFRJX0lOREVQRU5ERU5UKSAvKiE8IEFEQyBkdWFsIG1vZGUgZGlzYWJsZWQgKEFEQyBpbmRlcGVuZGVudCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlKSAqLw0KLSNkZWZpbmUgQURDX0RVQUxNT0RFX1JFR1NJTVVMVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfTVVMVElfRFVBTF9SRUdfU0lNVUxUKSAvKiE8IEFEQyBkdWFsIG1vZGUgZW5hYmxlZDogZ3JvdXAgcmVndWxhciBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ltdWx0YW5lb3VzICovDQotI2RlZmluZSBBRENfRFVBTE1PREVfSU5URVJMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfTVVMVElfRFVBTF9SRUdfSU5URVJMKSAvKiE8IEFEQyBkdWFsIG1vZGUgZW5hYmxlZDogQ29tYmluZWQgZ3JvdXAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ3VsYXIgaW50ZXJsZWF2ZWQgKi8NCi0jZGVmaW5lIEFEQ19EVUFMTU9ERV9JTkpFQ1NJTVVMVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19NVUxUSV9EVUFMX0lOSl9TSU1VTFQpIC8qITwgQURDIGR1YWwgbW9kZSBlbmFibGVkOiBncm91cCBpbmplY3RlZCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ltdWx0YW5lb3VzICovDQotI2RlZmluZSBBRENfRFVBTE1PREVfQUxURVJUUklHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19NVUxUSV9EVUFMX0lOSl9BTFRFUk4pIC8qITwgQURDIGR1YWwgbW9kZSBlbmFibGVkOiBncm91cCBpbmplY3RlZCAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHRlcm5hdGUgdHJpZ2dlci4gV29ya3Mgb25seSB3aXRoICAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWwgdHJpZ2dlcnMgKG5vdCBpbnRlcm5hbCBTVyBzdGFydCkgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgQURDX0RVQUxNT0RFX1JFR1NJTVVMVF9JTkpFQ1NJTVVMVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX01VTFRJX0RVQUxfUkVHX1NJTV9JTkpfU0lNKSAvKiE8IEFEQyBkdWFsIG1vZGUgZW5hYmxlZDogQ29tYmluZWQgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwIHJlZ3VsYXIgc2ltdWx0YW5lb3VzICsgZ3JvdXAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5qZWN0ZWQgc2ltdWx0YW5lb3VzICovDQotI2RlZmluZSBBRENfRFVBTE1PREVfUkVHU0lNVUxUX0FMVEVSVFJJRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfTVVMVElfRFVBTF9SRUdfU0lNX0lOSl9BTFQpIC8qITwgQURDIGR1YWwgbW9kZSBlbmFibGVkOiBDb21iaW5lZCAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgcmVndWxhciBzaW11bHRhbmVvdXMgKyBncm91cCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmplY3RlZCBhbHRlcm5hdGUgdHJpZ2dlciAqLw0KLSNkZWZpbmUgQURDX0RVQUxNT0RFX1JFR0lOVEVSTF9JTkpFQ1NJTVVMVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfTVVMVElfRFVBTF9SRUdfSU5UX0lOSl9TSU0pIC8qITwgQURDIGR1YWwgbW9kZSBlbmFibGVkOiBDb21iaW5lZCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cCByZWd1bGFyIGludGVybGVhdmVkICsgZ3JvdXAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5qZWN0ZWQgc2ltdWx0YW5lb3VzICovDQotDQotLyoqIEBkZWZncm91cCBBRENfSEFMX0VDX01VTFRJX0RNQV9UUkFOU0ZFUl9SRVNPTFVUSU9OICBNdWx0aW1vZGUgLSBETUEgdHJhbnNmZXINCi0gKiBtb2RlIGRlcGVuZGluZyBvbiBBREMgcmVzb2x1dGlvbg0KLSAqIEB7DQotICovDQotI2RlZmluZSBBRENfRE1BQUNDRVNTTU9ERV9ESVNBQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKDB4MDAwMDAwMDBVTCkgLyohPCBETUEgbXVsdGltb2RlIGRpc2FibGVkOiBlYWNoIEFEQyB1c2VzIGl0cyBvd24gRE1BIFwNCi0gICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgKi8NCi0jZGVmaW5lIEFEQ19ETUFBQ0NFU1NNT0RFXzEyXzEwX0JJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0NSX01ETUFfMSkgLyohPCBETUEgbXVsdGltb2RlIGVuYWJsZWQgKG9uZSBETUEgY2hhbm5lbCBmb3IgYm90aCBBREMsIFwNCi0gICAgICAgICAgICAgICAgICAgICAgRE1BIG9mIEFEQyBtYXN0ZXIpIGZvciAxMiBhbmQgMTAgYml0cyByZXNvbHV0aW9uICovDQotI2RlZmluZSBBRENfRE1BQUNDRVNTTU9ERV84XzZfQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0NSX01ETUEpIC8qITwgRE1BIG11bHRpbW9kZSBlbmFibGVkIChvbmUgRE1BIGNoYW5uZWwgZm9yIGJvdGggQURDLCBETUEgXA0KLSAgICAgICAgICAgICAgICAgICAgb2YgQURDIG1hc3RlcikgZm9yIDggYW5kIDYgYml0cyByZXNvbHV0aW9uICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEFEQ19IQUxfRUNfTVVMVElfVFdPU01QX0RFTEFZICBNdWx0aW1vZGUgLSBEZWxheSBiZXR3ZWVuIHR3bw0KLSAqIHNhbXBsaW5nIHBoYXNlcw0KLSAqIEB7DQotICovDQotI2RlZmluZSBBRENfVFdPU0FNUExJTkdERUxBWV8xQ1lDTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX01VTFRJX1RXT1NNUF9ERUxBWV8xQ1lDTEUpIC8qITwgQURDIG11bHRpbW9kZSBkZWxheSBiZXR3ZWVuIHR3byBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nIHBoYXNlczogMSBBREMgY2xvY2sgY3ljbGUgKi8NCi0jZGVmaW5lIEFEQ19UV09TQU1QTElOR0RFTEFZXzJDWUNMRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzJDWUNMRVMpIC8qITwgQURDIG11bHRpbW9kZSBkZWxheSBiZXR3ZWVuIHR3byAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nIHBoYXNlczogMiBBREMgY2xvY2sgY3ljbGVzIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgQURDX1RXT1NBTVBMSU5HREVMQVlfM0NZQ0xFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfM0NZQ0xFUykgLyohPCBBREMgbXVsdGltb2RlIGRlbGF5IGJldHdlZW4gdHdvICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmcgcGhhc2VzOiAzIEFEQyBjbG9jayBjeWNsZXMgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBBRENfVFdPU0FNUExJTkdERUxBWV80Q1lDTEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX01VTFRJX1RXT1NNUF9ERUxBWV80Q1lDTEVTKSAvKiE8IEFEQyBtdWx0aW1vZGUgZGVsYXkgYmV0d2VlbiB0d28gICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZyBwaGFzZXM6IDQgQURDIGNsb2NrIGN5Y2xlcyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIEFEQ19UV09TQU1QTElOR0RFTEFZXzVDWUNMRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzVDWUNMRVMpIC8qITwgQURDIG11bHRpbW9kZSBkZWxheSBiZXR3ZWVuIHR3byAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nIHBoYXNlczogNSBBREMgY2xvY2sgY3ljbGVzIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgQURDX1RXT1NBTVBMSU5HREVMQVlfNkNZQ0xFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfNkNZQ0xFUykgLyohPCBBREMgbXVsdGltb2RlIGRlbGF5IGJldHdlZW4gdHdvICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmcgcGhhc2VzOiA2IEFEQyBjbG9jayBjeWNsZXMgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBBRENfVFdPU0FNUExJTkdERUxBWV83Q1lDTEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX01VTFRJX1RXT1NNUF9ERUxBWV83Q1lDTEVTKSAvKiE8IEFEQyBtdWx0aW1vZGUgZGVsYXkgYmV0d2VlbiB0d28gICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZyBwaGFzZXM6IDcgQURDIGNsb2NrIGN5Y2xlcyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIEFEQ19UV09TQU1QTElOR0RFTEFZXzhDWUNMRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzhDWUNMRVMpIC8qITwgQURDIG11bHRpbW9kZSBkZWxheSBiZXR3ZWVuIHR3byAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nIHBoYXNlczogOCBBREMgY2xvY2sgY3ljbGVzIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgQURDX1RXT1NBTVBMSU5HREVMQVlfOUNZQ0xFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfOUNZQ0xFUykgLyohPCBBREMgbXVsdGltb2RlIGRlbGF5IGJldHdlZW4gdHdvICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmcgcGhhc2VzOiA5IEFEQyBjbG9jayBjeWNsZXMgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBBRENfVFdPU0FNUExJTkdERUxBWV8xMENZQ0xFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzEwQ1lDTEVTKSAvKiE8IEFEQyBtdWx0aW1vZGUgZGVsYXkgYmV0d2VlbiB0d28gICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nIHBoYXNlczogMTAgQURDIGNsb2NrIGN5Y2xlcyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBBRENfVFdPU0FNUExJTkdERUxBWV8xMUNZQ0xFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzExQ1lDTEVTKSAvKiE8IEFEQyBtdWx0aW1vZGUgZGVsYXkgYmV0d2VlbiB0d28gICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nIHBoYXNlczogMTEgQURDIGNsb2NrIGN5Y2xlcyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBBRENfVFdPU0FNUExJTkdERUxBWV8xMkNZQ0xFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzEyQ1lDTEVTKSAvKiE8IEFEQyBtdWx0aW1vZGUgZGVsYXkgYmV0d2VlbiB0d28gICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nIHBoYXNlczogMTIgQURDIGNsb2NrIGN5Y2xlcyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLSNlbmRpZiAvKiBBRENfTVVMVElNT0RFX1NVUFBPUlQgKi8NCi0NCi0vKiogQGRlZmdyb3VwIEFEQ19IQUxfRUNfR1JPVVBTICBBREMgaW5zdGFuY2UgLSBHcm91cHMNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgQURDX1JFR1VMQVJfR1JPVVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfR1JPVVBfUkVHVUxBUikgLyohPCBBREMgZ3JvdXAgcmVndWxhciAoYXZhaWxhYmxlIG9uIGFsbCBTVE0zMiBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZXMpICovDQotI2RlZmluZSBBRENfSU5KRUNURURfR1JPVVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19HUk9VUF9JTkpFQ1RFRCkgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgKG5vdCBhdmFpbGFibGUgb24gYWxsIFNUTTMyIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZXMpKi8NCi0jZGVmaW5lIEFEQ19SRUdVTEFSX0lOSkVDVEVEX0dST1VQIFwNCi0gIChMTF9BRENfR1JPVVBfUkVHVUxBUl9JTkpFQ1RFRCkgLyohPCBBREMgYm90aCBncm91cHMgcmVndWxhciBhbmQgaW5qZWN0ZWQgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQURDX0NGR1JfZmllbGRzIEFEQ3ggQ0ZHUiBmaWVsZHMNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgQURDX0NGR1JfRklFTERTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0ZHUl9BV0QxQ0ggfCBBRENfQ0ZHUl9KQVVUTyB8IEFEQ19DRkdSX0pBV0QxRU4gfCBBRENfQ0ZHUl9BV0QxRU4gfCBcDQotICAgQURDX0NGR1JfQVdEMVNHTCB8IEFEQ19DRkdSX0pRTSB8IEFEQ19DRkdSX0pESVNDRU4gfCBBRENfQ0ZHUl9ESVNDTlVNIHwgXA0KLSAgIEFEQ19DRkdSX0RJU0NFTiB8IEFEQ19DRkdSX0FVVERMWSB8IEFEQ19DRkdSX0NPTlQgfCBBRENfQ0ZHUl9PVlJNT0QgfCAgIFwNCi0gICBBRENfQ0ZHUl9FWFRFTiB8IEFEQ19DRkdSX0VYVFNFTCB8IEFEQ19DRkdSX0FMSUdOIHwgQURDX0NGR1JfUkVTIHwgICAgICBcDQotICAgQURDX0NGR1JfRE1BQ0ZHIHwgQURDX0NGR1JfRE1BRU4pDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEFEQ19TTVBSMV9maWVsZHMgQURDeCBTTVBSMSBmaWVsZHMNCi0gKiBAew0KLSAqLw0KLSNpZiBkZWZpbmVkKEFEQ19TTVBSMV9TTVBQTFVTKQ0KLSNkZWZpbmUgQURDX1NNUFIxX0ZJRUxEUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19TTVBSMV9TTVA5IHwgQURDX1NNUFIxX1NNUDggfCBBRENfU01QUjFfU01QNyB8IEFEQ19TTVBSMV9TTVA2IHwgXA0KLSAgIEFEQ19TTVBSMV9TTVA1IHwgQURDX1NNUFIxX1NNUDQgfCBBRENfU01QUjFfU01QMyB8IEFEQ19TTVBSMV9TTVAyIHwgXA0KLSAgIEFEQ19TTVBSMV9TTVAxIHwgQURDX1NNUFIxX1NNUDAgfCBBRENfU01QUjFfU01QUExVUykNCi0jZWxzZQ0KLSNkZWZpbmUgQURDX1NNUFIxX0ZJRUxEUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19TTVBSMV9TTVA5IHwgQURDX1NNUFIxX1NNUDggfCBBRENfU01QUjFfU01QNyB8IEFEQ19TTVBSMV9TTVA2IHwgXA0KLSAgIEFEQ19TTVBSMV9TTVA1IHwgQURDX1NNUFIxX1NNUDQgfCBBRENfU01QUjFfU01QMyB8IEFEQ19TTVBSMV9TTVAyIHwgXA0KLSAgIEFEQ19TTVBSMV9TTVAxIHwgQURDX1NNUFIxX1NNUDApDQotI2VuZGlmIC8qIEFEQ19TTVBSMV9TTVBQTFVTICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEFEQ19DRkdSX2ZpZWxkc18yIEFEQ3ggQ0ZHUiBzdWIgZmllbGRzDQotICogQHsNCi0gKi8NCi0vKiBBRENfQ0ZHUiBmaWVsZHMgb2YgcGFyYW1ldGVycyB0aGF0IGNhbiBiZSB1cGRhdGVkIHdoZW4gbm8gY29udmVyc2lvbg0KLSAgIChuZWl0aGVyIHJlZ3VsYXIgbm9yIGluamVjdGVkKSBpcyBvbi1nb2luZyAgKi8NCi0jZGVmaW5lIEFEQ19DRkdSX0ZJRUxEU18yICgoQURDX0NGR1JfRE1BQ0ZHIHwgQURDX0NGR1JfQVVURExZKSkNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogRXhwb3J0ZWQgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0NCi0jaWYgZGVmaW5lZChBRENfTVVMVElNT0RFX1NVUFBPUlQpDQotLyoqIEBkZWZncm91cCBBRENFeF9FeHBvcnRlZF9NYWNybyBBREMgRXh0ZW5kZWQgRXhwb3J0ZWQgTWFjcm9zDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGJyaWVmICBGb3JjZSBBREMgaW5zdGFuY2UgaW4gbXVsdGltb2RlIG1vZGUgaW5kZXBlbmRlbnQgKG11bHRpbW9kZQ0KLSAqIGRpc2FibGUpLg0KLSAqIEBub3RlICAgVGhpcyBtYWNybyBtdXN0IGJlIHVzZWQgb25seSBpbiBjYXNlIG9mIHRyYW5zaXRpb24gZnJvbSBtdWx0aW1vZGUNCi0gKiAgICAgICAgIHRvIG1vZGUgaW5kZXBlbmRlbnQgYW5kIGluIGNhc2Ugb2YgdW5rbm93biBwcmV2aW91cyBzdGF0ZSwNCi0gKiAgICAgICAgIHRvIGVuc3VyZSBBREMgY29uZmlndXJhdGlvbiBpcyBpbiBtb2RlIGluZGVwZW5kZW50Lg0KLSAqIEBub3RlICAgU3RhbmRhcmQgd2F5IG9mIG11bHRpbW9kZSBjb25maWd1cmF0aW9uIGNoYW5nZSBpcyBkb25lIGZyb20NCi0gKiAgICAgICAgIEhBTCBBREMgaGFuZGxlIG9mIEFEQyBtYXN0ZXIgdXNpbmcgZnVuY3Rpb24NCi0gKiAgICAgICAgICJIQUxfQURDRXhfTXVsdGlNb2RlQ29uZmlnQ2hhbm5lbCguLi4sIEFEQ19NT0RFX0lOREVQRU5ERU5UKSIgKSIuDQotICogICAgICAgICBVc2FnZSBvZiB0aGlzIG1hY3JvIGlzIG5vdCB0aGUgU3RhbmRhcmQgd2F5IG9mIG11bHRpbW9kZQ0KLSAqICAgICAgICAgY29uZmlndXJhdGlvbiBhbmQgY2FuIGxlYWQgdG8gaGF2ZSBIQUwgQURDIGhhbmRsZXMgc3RhdHVzDQotICogICAgICAgICBtaXNhbGlnbmVkLiBVc2FnZSBvZiB0aGlzIG1hY3JvIG11c3QgYmUgbGltaXRlZCB0byBjYXNlcw0KLSAqICAgICAgICAgbWVudGlvbmVkIGFib3ZlLg0KLSAqIEBwYXJhbSBfX0hBTkRMRV9fIEFEQyBoYW5kbGUuDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBBRENfRk9SQ0VfTU9ERV9JTkRFUEVOREVOVChfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgTExfQURDX1NldE11bHRpbW9kZShfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoKF9fSEFORExFX18pLT5JbnN0YW5jZSksIFwNCi0gICAgICAgICAgICAgICAgICAgICAgTExfQURDX01VTFRJX0lOREVQRU5ERU5UKQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotI2VuZGlmIC8qIEFEQ19NVUxUSU1PREVfU1VQUE9SVCAqLw0KLQ0KLS8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotDQotLyoqIEBkZWZncm91cCBBRENFeF9Qcml2YXRlX01hY3JvX2ludGVybmFsX0hBTF9kcml2ZXIgQURDIEV4dGVuZGVkIFByaXZhdGUNCi0gKiBNYWNyb3MNCi0gKiBAew0KLSAqLw0KLS8qIE1hY3JvIHJlc2VydmVkIGZvciBpbnRlcm5hbCBIQUwgZHJpdmVyIHVzYWdlLCBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCBpbiAgICovDQotLyogY29kZSBvZiBmaW5hbCB1c2VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgVGVzdCBpZiBjb252ZXJzaW9uIHRyaWdnZXIgb2YgaW5qZWN0ZWQgZ3JvdXAgaXMgc29mdHdhcmUgc3RhcnQNCi0gKiAgICAgICAgb3IgZXh0ZXJuYWwgdHJpZ2dlci4NCi0gKiBAcGFyYW0gX19IQU5ETEVfXyBBREMgaGFuZGxlLg0KLSAqIEByZXR2YWwgU0VUIChzb2Z0d2FyZSBzdGFydCkgb3IgUkVTRVQgKGV4dGVybmFsIHRyaWdnZXIpLg0KLSAqLw0KLSNkZWZpbmUgQURDX0lTX1NPRlRXQVJFX1NUQVJUX0lOSkVDVEVEKF9fSEFORExFX18pIFwNCi0gICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SlNRUiAmIEFEQ19KU1FSX0pFWFRFTikgPT0gMFVMKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBDaGVjayB3aGV0aGVyIG9yIG5vdCBBREMgaXMgaW5kZXBlbmRlbnQuDQotICogQHBhcmFtIF9fSEFORExFX18gQURDIGhhbmRsZS4NCi0gKiBAbm90ZSAgV2hlbiBtdWx0aW1vZGUgZmVhdHVyZSBpcyBub3QgYXZhaWxhYmxlLCB0aGUgbWFjcm8gYWx3YXlzIHJldHVybnMgU0VULg0KLSAqIEByZXR2YWwgU0VUIChBREMgaXMgaW5kZXBlbmRlbnQpIG9yIFJFU0VUIChBREMgaXMgbm90KS4NCi0gKi8NCi0jaWYgZGVmaW5lZChTVE0zMkc0NzR4eCkgfHwgZGVmaW5lZChTVE0zMkc0ODR4eCkgfHwgZGVmaW5lZChTVE0zMkc0NzN4eCkgfHwgXA0KLSAgICBkZWZpbmVkKFNUTTMyRzQ4M3h4KQ0KLSNkZWZpbmUgQURDX0lTX0lOREVQRU5ERU5UKF9fSEFORExFX18pIFwNCi0gICgoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSBBREM1KSkgPyBTRVQgOiBSRVNFVCkNCi0jZWxpZiBkZWZpbmVkKFNUTTMyRzQ5MXh4KSB8fCBkZWZpbmVkKFNUTTMyRzRBMXh4KQ0KLSNkZWZpbmUgQURDX0lTX0lOREVQRU5ERU5UKF9fSEFORExFX18pIFwNCi0gICgoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSBBREMzKSkgPyBTRVQgOiBSRVNFVCkNCi0jZWxpZiBkZWZpbmVkKFNUTTMyR0JLMUNCKSB8fCBkZWZpbmVkKFNUTTMyRzQzMXh4KSB8fCBkZWZpbmVkKFNUTTMyRzQ0MXh4KSB8fCBcDQotICAgIGRlZmluZWQoU1RNMzJHNDcxeHgpDQotI2RlZmluZSBBRENfSVNfSU5ERVBFTkRFTlQoX19IQU5ETEVfXykgKFJFU0VUKQ0KLSNlbmRpZiAvKiBkZWZpbmVkKFNUTTMyRzQ3NHh4KSB8fCBkZWZpbmVkKFNUTTMyRzQ4NHh4KSB8fCBkZWZpbmVkKFNUTTMyRzQ3M3h4KSBcDQotICAgICAgICAgIHx8IGRlZmluZWQoU1RNMzJHNDgzeHgpICovDQotDQotLyoqDQotICogQGJyaWVmIFNldCB0aGUgc2VsZWN0ZWQgaW5qZWN0ZWQgQ2hhbm5lbCByYW5rLg0KLSAqIEBwYXJhbSBfX0NIQU5ORUxOQl9fIENoYW5uZWwgbnVtYmVyLg0KLSAqIEBwYXJhbSBfX1JBTktOQl9fIFJhbmsgbnVtYmVyLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgQURDX0pTUVJfUksoX19DSEFOTkVMTkJfXywgX19SQU5LTkJfXykgICAgICAgIFwNCi0gICgoKChfX0NIQU5ORUxOQl9fKSAmIEFEQ19DSEFOTkVMX0lEX05VTUJFUl9NQVNLKSA+PiBcDQotICAgIEFEQ19DSEFOTkVMX0lEX05VTUJFUl9CSVRPRkZTRVRfUE9TKSAgICAgICAgICAgICAgXA0KLSAgIDw8ICgoX19SQU5LTkJfXykgJiBBRENfSU5KX1JBTktfSURfSlNRUl9NQVNLKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgQ29uZmlndXJlIEFEQyBpbmplY3RlZCBjb250ZXh0IHF1ZXVlDQotICogQHBhcmFtIF9fSU5KRUNUX0NPTlRFWFRfUVVFVUVfTU9ERV9fIEluamVjdGVkIGNvbnRleHQgcXVldWUgbW9kZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIEFEQ19DRkdSX0lOSkVDVF9DT05URVhUX1FVRVVFKF9fSU5KRUNUX0NPTlRFWFRfUVVFVUVfTU9ERV9fKSBcDQotICAoKF9fSU5KRUNUX0NPTlRFWFRfUVVFVUVfTU9ERV9fKSA8PCBBRENfQ0ZHUl9KUU1fUG9zKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBDb25maWd1cmUgQURDIGRpc2NvbnRpbnVvdXMgY29udmVyc2lvbiBtb2RlIGZvciBpbmplY3RlZCBncm91cA0KLSAqIEBwYXJhbSBfX0lOSkVDVF9ESVNDT05USU5VT1VTX01PREVfXyBJbmplY3RlZCBkaXNjb250aW51b3VzIG1vZGUuDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBBRENfQ0ZHUl9JTkpFQ1RfRElTQ0NPTlRJTlVPVVMoX19JTkpFQ1RfRElTQ09OVElOVU9VU19NT0RFX18pIFwNCi0gICgoX19JTkpFQ1RfRElTQ09OVElOVU9VU19NT0RFX18pIDw8IEFEQ19DRkdSX0pESVNDRU5fUG9zKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBDb25maWd1cmUgQURDIGRpc2NvbnRpbnVvdXMgY29udmVyc2lvbiBtb2RlIGZvciByZWd1bGFyIGdyb3VwDQotICogQHBhcmFtIF9fUkVHX0RJU0NPTlRJTlVPVVNfTU9ERV9fIFJlZ3VsYXIgZGlzY29udGludW91cyBtb2RlLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgQURDX0NGR1JfUkVHX0RJU0NPTlRJTlVPVVMoX19SRUdfRElTQ09OVElOVU9VU19NT0RFX18pIFwNCi0gICgoX19SRUdfRElTQ09OVElOVU9VU19NT0RFX18pIDw8IEFEQ19DRkdSX0RJU0NFTl9Qb3MpDQotDQotLyoqDQotICogQGJyaWVmIENvbmZpZ3VyZSB0aGUgbnVtYmVyIG9mIGRpc2NvbnRpbnVvdXMgY29udmVyc2lvbnMgZm9yIHJlZ3VsYXIgZ3JvdXAuDQotICogQHBhcmFtIF9fTkJSX0RJU0NPTlRJTlVPVVNfQ09OVl9fIE51bWJlciBvZiBkaXNjb250aW51b3VzIGNvbnZlcnNpb25zLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgQURDX0NGR1JfRElTQ09OVElOVU9VU19OVU0oX19OQlJfRElTQ09OVElOVU9VU19DT05WX18pIFwNCi0gICgoKF9fTkJSX0RJU0NPTlRJTlVPVVNfQ09OVl9fKS0xVUwpIDw8IEFEQ19DRkdSX0RJU0NOVU1fUG9zKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBDb25maWd1cmUgdGhlIEFEQyBhdXRvIGRlbGF5IG1vZGUuDQotICogQHBhcmFtIF9fQVVUT1dBSVRfXyBBdXRvIGRlbGF5IGJpdCBlbmFibGUgb3IgZGlzYWJsZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIEFEQ19DRkdSX0FVVE9XQUlUKF9fQVVUT1dBSVRfXykgKChfX0FVVE9XQUlUX18pIDw8IEFEQ19DRkdSX0FVVERMWV9Qb3MpDQotDQotLyoqDQotICogQGJyaWVmIENvbmZpZ3VyZSBBREMgY29udGludW91cyBjb252ZXJzaW9uIG1vZGUuDQotICogQHBhcmFtIF9fQ09OVElOVU9VU19NT0RFX18gQ29udGludW91cyBtb2RlLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgQURDX0NGR1JfQ09OVElOVU9VUyhfX0NPTlRJTlVPVVNfTU9ERV9fKSBcDQotICAoKF9fQ09OVElOVU9VU19NT0RFX18pIDw8IEFEQ19DRkdSX0NPTlRfUG9zKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBDb25maWd1cmUgdGhlIEFEQyBETUEgY29udGludW91cyByZXF1ZXN0Lg0KLSAqIEBwYXJhbSBfX0RNQUNPTlRSRVFfTU9ERV9fIERNQSBjb250aW51b3VzIHJlcXVlc3QgbW9kZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIEFEQ19DRkdSX0RNQUNPTlRSRVEoX19ETUFDT05UUkVRX01PREVfXykgXA0KLSAgKChfX0RNQUNPTlRSRVFfTU9ERV9fKSA8PCBBRENfQ0ZHUl9ETUFDRkdfUG9zKQ0KLQ0KLSNpZiBkZWZpbmVkKEFEQ19NVUxUSU1PREVfU1VQUE9SVCkNCi0vKioNCi0gKiBAYnJpZWYgQ29uZmlndXJlIHRoZSBBREMgRE1BIGNvbnRpbnVvdXMgcmVxdWVzdCBmb3IgQURDIG11bHRpbW9kZS4NCi0gKiBAcGFyYW0gX19ETUFDT05UUkVRX01PREVfXyBETUEgY29udGludW91cyByZXF1ZXN0IG1vZGUuDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBBRENfQ0NSX01VTFRJX0RNQUNPTlRSRVEoX19ETUFDT05UUkVRX01PREVfXykgXA0KLSAgKChfX0RNQUNPTlRSRVFfTU9ERV9fKSA8PCBBRENfQ0NSX0RNQUNGR19Qb3MpDQotI2VuZGlmIC8qIEFEQ19NVUxUSU1PREVfU1VQUE9SVCAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiBTaGlmdCB0aGUgb2Zmc2V0IHdpdGggcmVzcGVjdCB0byB0aGUgc2VsZWN0ZWQgQURDIHJlc29sdXRpb24uDQotICogQG5vdGUgICBPZmZzZXQgaGFzIHRvIGJlIGxlZnQtYWxpZ25lZCBvbiBiaXQgMTEsIHRoZSBMU0IgKHJpZ2h0IGJpdHMpIGFyZSBzZXQNCi0gKiB0byAwLiBJZiByZXNvbHV0aW9uIDEyIGJpdHMsIG5vIHNoaWZ0LiBJZiByZXNvbHV0aW9uIDEwIGJpdHMsIHNoaWZ0IG9mIDINCi0gKiByYW5rcyBvbiB0aGUgbGVmdC4gSWYgcmVzb2x1dGlvbiA4IGJpdHMsIHNoaWZ0IG9mIDQgcmFua3Mgb24gdGhlIGxlZnQuIElmDQotICogcmVzb2x1dGlvbiA2IGJpdHMsIHNoaWZ0IG9mIDYgcmFua3Mgb24gdGhlIGxlZnQuIFRoZXJlZm9yZSwgc2hpZnQgPSAoMTIgLQ0KLSAqIHJlc29sdXRpb24pID0gMTIgLSAoMTItICgoKFJFU1sxOjBdKSA+PiAzKSoyKSkuDQotICogQHBhcmFtIF9fSEFORExFX18gQURDIGhhbmRsZQ0KLSAqIEBwYXJhbSBfX09GRlNFVF9fIFZhbHVlIHRvIGJlIHNoaWZ0ZWQNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIEFEQ19PRkZTRVRfU0hJRlRfUkVTT0xVVElPTihfX0hBTkRMRV9fLCBfX09GRlNFVF9fKSAgICAgICAgICAgICAgICAgIFwNCi0gICgoX19PRkZTRVRfXykgPDwgKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0ZHUiAmIEFEQ19DRkdSX1JFUykgPj4gM1VMKSAqIFwNCi0gICAgICAgICAgICAgICAgICAgIDJVTCkpDQotDQotLyoqDQotICogQGJyaWVmIFNoaWZ0IHRoZSBBV0QxIHRocmVzaG9sZCB3aXRoIHJlc3BlY3QgdG8gdGhlIHNlbGVjdGVkIEFEQyByZXNvbHV0aW9uLg0KLSAqIEBub3RlICBUaHJlc2hvbGRzIGhhdmUgdG8gYmUgbGVmdC1hbGlnbmVkIG9uIGJpdCAxMSwgdGhlIExTQiAocmlnaHQgYml0cykgYXJlDQotICogc2V0IHRvIDAuIElmIHJlc29sdXRpb24gMTIgYml0cywgbm8gc2hpZnQuIElmIHJlc29sdXRpb24gMTAgYml0cywgc2hpZnQgb2YgMg0KLSAqIHJhbmtzIG9uIHRoZSBsZWZ0LiBJZiByZXNvbHV0aW9uIDggYml0cywgc2hpZnQgb2YgNCByYW5rcyBvbiB0aGUgbGVmdC4gSWYNCi0gKiByZXNvbHV0aW9uIDYgYml0cywgc2hpZnQgb2YgNiByYW5rcyBvbiB0aGUgbGVmdC4gVGhlcmVmb3JlLCBzaGlmdCA9ICgxMiAtDQotICogcmVzb2x1dGlvbikgPSAxMiAtICgxMi0gKCgoUkVTWzE6MF0pID4+IDMpKjIpKS4NCi0gKiBAcGFyYW0gX19IQU5ETEVfXyBBREMgaGFuZGxlDQotICogQHBhcmFtIF9fVEhSRVNIT0xEX18gVmFsdWUgdG8gYmUgc2hpZnRlZA0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgQURDX0FXRDFUSFJFU0hPTERfU0hJRlRfUkVTT0xVVElPTihfX0hBTkRMRV9fLCBfX1RIUkVTSE9MRF9fKSBcDQotICAoKF9fVEhSRVNIT0xEX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICA8PCAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DRkdSICYgQURDX0NGR1JfUkVTKSA+PiAzVUwpICogMlVMKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgU2hpZnQgdGhlIEFXRDIgYW5kIEFXRDMgdGhyZXNob2xkIHdpdGggcmVzcGVjdCB0byB0aGUgc2VsZWN0ZWQgQURDDQotICogcmVzb2x1dGlvbi4NCi0gKiBAbm90ZSAgVGhyZXNob2xkcyBoYXZlIHRvIGJlIGxlZnQtYWxpZ25lZCBvbiBiaXQgNy4NCi0gKiAgICAgICAgSWYgcmVzb2x1dGlvbiAxMiBiaXRzLCBzaGlmdCBvZiA0IHJhbmtzIG9uIHRoZSByaWdodCAodGhlIDQgTFNCIGFyZQ0KLSAqIGRpc2NhcmRlZCkuIElmIHJlc29sdXRpb24gMTAgYml0cywgc2hpZnQgb2YgMiByYW5rcyBvbiB0aGUgcmlnaHQgKHRoZSAyIExTQg0KLSAqIGFyZSBkaXNjYXJkZWQpLiBJZiByZXNvbHV0aW9uIDggYml0cywgbm8gc2hpZnQuIElmIHJlc29sdXRpb24gNiBiaXRzLCBzaGlmdA0KLSAqIG9mIDIgcmFua3Mgb24gdGhlIGxlZnQgKHRoZSAyIExTQiBhcmUgc2V0IHRvIDApLg0KLSAqIEBwYXJhbSBfX0hBTkRMRV9fIEFEQyBoYW5kbGUNCi0gKiBAcGFyYW0gX19USFJFU0hPTERfXyBWYWx1ZSB0byBiZSBzaGlmdGVkDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBBRENfQVdEMjNUSFJFU0hPTERfU0hJRlRfUkVTT0xVVElPTihfX0hBTkRMRV9fLCBfX1RIUkVTSE9MRF9fKSAgICAgICAgXA0KLSAgKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0ZHUiAmIEFEQ19DRkdSX1JFUykgIT0gICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgKEFEQ19DRkdSX1JFU18xIHwgQURDX0NGR1JfUkVTXzApKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgID8gKChfX1RIUkVTSE9MRF9fKSA+PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAoKDRVTCAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgICAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DRkdSICYgQURDX0NGR1JfUkVTKSA+PiAzVUwpICogMlVMKSkgJiBcDQotICAgICAgICAgICAweDFGVUwpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICA6ICgoX19USFJFU0hPTERfXykgPDwgMlVMKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgQ2xlYXIgQ29tbW9uIENvbnRyb2wgUmVnaXN0ZXIuDQotICogQHBhcmFtIF9fSEFORExFX18gQURDIGhhbmRsZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jaWYgZGVmaW5lZChBRENfTVVMVElNT0RFX1NVUFBPUlQpDQotI2RlZmluZSBBRENfQ0xFQVJfQ09NTU9OX0NPTlRST0xfUkVHSVNURVIoX19IQU5ETEVfXykgICAgICAgICAgICAgICBcDQotICBDTEVBUl9CSVQoX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpLT5DQ1IsICBcDQotICAgICAgICAgICAgQURDX0NDUl9DS01PREUgfCBBRENfQ0NSX1BSRVNDIHwgQURDX0NDUl9WQkFUU0VMIHwgICAgICBcDQotICAgICAgICAgICAgICAgIEFEQ19DQ1JfVlNFTlNFU0VMIHwgQURDX0NDUl9WUkVGRU4gfCBBRENfQ0NSX01ETUEgfCBcDQotICAgICAgICAgICAgICAgIEFEQ19DQ1JfRE1BQ0ZHIHwgQURDX0NDUl9ERUxBWSB8IEFEQ19DQ1JfRFVBTCkNCi0jZW5kaWYgLyogQURDX01VTFRJTU9ERV9TVVBQT1JUICovDQotDQotI2lmIGRlZmluZWQoU1RNMzJHNDc0eHgpIHx8IGRlZmluZWQoU1RNMzJHNDg0eHgpIHx8IGRlZmluZWQoU1RNMzJHNDczeHgpIHx8IFwNCi0gICAgZGVmaW5lZChTVE0zMkc0ODN4eCkNCi0vKioNCi0gKiBAYnJpZWYgU2V0IGhhbmRsZSBpbnN0YW5jZSBvZiB0aGUgQURDIHNsYXZlIGFzc29jaWF0ZWQgdG8gdGhlIEFEQyBtYXN0ZXIuDQotICogQHBhcmFtIF9fSEFORExFX01BU1RFUl9fIEFEQyBtYXN0ZXIgaGFuZGxlLg0KLSAqIEBwYXJhbSBfX0hBTkRMRV9TTEFWRV9fIEFEQyBzbGF2ZSBoYW5kbGUuDQotICogQG5vdGUgaWYgX19IQU5ETEVfTUFTVEVSX18gaXMgdGhlIGhhbmRsZSBvZiBhIHNsYXZlIEFEQyBvciBhbiBpbmRlcGVuZGVudA0KLSAqIEFEQywgX19IQU5ETEVfU0xBVkVfXyBpbnN0YW5jZSBpcyBzZXQgdG8gTlVMTC4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIEFEQ19NVUxUSV9TTEFWRShfX0hBTkRMRV9NQVNURVJfXywgX19IQU5ETEVfU0xBVkVfXykgXA0KLSAgKCgoX19IQU5ETEVfTUFTVEVSX18pLT5JbnN0YW5jZSA9PSBBREMxKSAgICAgICAgICAgICAgICAgICBcDQotICAgICAgID8gKChfX0hBTkRMRV9TTEFWRV9fKS0+SW5zdGFuY2UgPSBBREMyKSAgICAgICAgICAgICAgIFwNCi0gICA6ICgoX19IQU5ETEVfTUFTVEVSX18pLT5JbnN0YW5jZSA9PSBBREMzKSAgICAgICAgICAgICAgICAgXA0KLSAgICAgICA/ICgoX19IQU5ETEVfU0xBVkVfXyktPkluc3RhbmNlID0gQURDNCkgICAgICAgICAgICAgICBcDQotICAgICAgIDogKChfX0hBTkRMRV9TTEFWRV9fKS0+SW5zdGFuY2UgPSBOVUxMKSkNCi0jZWxpZiBkZWZpbmVkKFNUTTMyR0JLMUNCKSB8fCBkZWZpbmVkKFNUTTMyRzQzMXh4KSB8fCBkZWZpbmVkKFNUTTMyRzQ0MXh4KSB8fCBcDQotICAgIGRlZmluZWQoU1RNMzJHNDcxeHgpIHx8IGRlZmluZWQoU1RNMzJHNDkxeHgpIHx8IGRlZmluZWQoU1RNMzJHNEExeHgpDQotLyoqDQotICogQGJyaWVmIFNldCBoYW5kbGUgaW5zdGFuY2Ugb2YgdGhlIEFEQyBzbGF2ZSBhc3NvY2lhdGVkIHRvIHRoZSBBREMgbWFzdGVyLg0KLSAqIEBwYXJhbSBfX0hBTkRMRV9NQVNURVJfXyBBREMgbWFzdGVyIGhhbmRsZS4NCi0gKiBAcGFyYW0gX19IQU5ETEVfU0xBVkVfXyBBREMgc2xhdmUgaGFuZGxlLg0KLSAqIEBub3RlIGlmIF9fSEFORExFX01BU1RFUl9fIGlzIHRoZSBoYW5kbGUgb2YgYSBzbGF2ZSBBREMgb3IgYW4gaW5kZXBlbmRlbnQNCi0gKiBBREMsIF9fSEFORExFX1NMQVZFX18gaW5zdGFuY2UgaXMgc2V0IHRvIE5VTEwuDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBBRENfTVVMVElfU0xBVkUoX19IQU5ETEVfTUFTVEVSX18sIF9fSEFORExFX1NMQVZFX18pIFwNCi0gICgoKF9fSEFORExFX01BU1RFUl9fKS0+SW5zdGFuY2UgPT0gQURDMSkgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICA/ICgoX19IQU5ETEVfU0xBVkVfXyktPkluc3RhbmNlID0gQURDMikgICAgICAgICAgICAgICBcDQotICAgICAgIDogKChfX0hBTkRMRV9TTEFWRV9fKS0+SW5zdGFuY2UgPSBOVUxMKSkNCi0jZW5kaWYNCi0NCi0vKioNCi0gKiBAYnJpZWYgVmVyaWZ5IHRoZSBBREMgaW5zdGFuY2UgY29ubmVjdGVkIHRvIHRoZSB0ZW1wZXJhdHVyZSBzZW5zb3IuDQotICogQHBhcmFtIF9fSEFORExFX18gQURDIGhhbmRsZS4NCi0gKiBAcmV0dmFsIFNFVCAoQURDIGluc3RhbmNlIGlzIHZhbGlkKSBvciBSRVNFVCAoQURDIGluc3RhbmNlIGlzIGludmFsaWQpDQotICovDQotI2lmIGRlZmluZWQoU1RNMzJHNDc0eHgpIHx8IGRlZmluZWQoU1RNMzJHNDg0eHgpIHx8IGRlZmluZWQoU1RNMzJHNDczeHgpIHx8IFwNCi0gICAgZGVmaW5lZChTVE0zMkc0ODN4eCkNCi0jZGVmaW5lIEFEQ19URU1QRVJBVFVSRV9TRU5TT1JfSU5TVEFOQ0UoX19IQU5ETEVfXykgXA0KLSAgKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gQURDMSkgfHwgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSBBREM1KSkNCi0jZWxpZiBkZWZpbmVkKFNUTTMyR0JLMUNCKSB8fCBkZWZpbmVkKFNUTTMyRzQzMXh4KSB8fCBkZWZpbmVkKFNUTTMyRzQ0MXh4KSB8fCBcDQotICAgIGRlZmluZWQoU1RNMzJHNDcxeHgpIHx8IGRlZmluZWQoU1RNMzJHNDkxeHgpIHx8IGRlZmluZWQoU1RNMzJHNEExeHgpDQotI2RlZmluZSBBRENfVEVNUEVSQVRVUkVfU0VOU09SX0lOU1RBTkNFKF9fSEFORExFX18pIFwNCi0gICgoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gQURDMSkNCi0jZW5kaWYgLyogZGVmaW5lZChTVE0zMkc0NzR4eCkgfHwgZGVmaW5lZChTVE0zMkc0ODR4eCkgfHwgZGVmaW5lZChTVE0zMkc0NzN4eCkgXA0KLSAgICAgICAgICB8fCBkZWZpbmVkKFNUTTMyRzQ4M3h4KSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiBWZXJpZnkgdGhlIEFEQyBpbnN0YW5jZSBjb25uZWN0ZWQgdG8gdGhlIGJhdHRlcnkgdm9sdGFnZSBWQkFULg0KLSAqIEBwYXJhbSBfX0hBTkRMRV9fIEFEQyBoYW5kbGUuDQotICogQHJldHZhbCBTRVQgKEFEQyBpbnN0YW5jZSBpcyB2YWxpZCkgb3IgUkVTRVQgKEFEQyBpbnN0YW5jZSBpcyBpbnZhbGlkKQ0KLSAqLw0KLSNpZiBkZWZpbmVkKFNUTTMyRzQ3NHh4KSB8fCBkZWZpbmVkKFNUTTMyRzQ4NHh4KSB8fCBkZWZpbmVkKFNUTTMyRzQ3M3h4KSB8fCBcDQotICAgIGRlZmluZWQoU1RNMzJHNDgzeHgpDQotI2RlZmluZSBBRENfQkFUVEVSWV9WT0xUQUdFX0lOU1RBTkNFKF9fSEFORExFX18pIFwNCi0gICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpICE9IEFEQzIpIHx8ICgoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgIT0gQURDNCkpDQotI2VsaWYgZGVmaW5lZChTVE0zMkdCSzFDQikgfHwgZGVmaW5lZChTVE0zMkc0MzF4eCkgfHwgZGVmaW5lZChTVE0zMkc0NDF4eCkgfHwgXA0KLSAgICBkZWZpbmVkKFNUTTMyRzQ3MXh4KQ0KLSNkZWZpbmUgQURDX0JBVFRFUllfVk9MVEFHRV9JTlNUQU5DRShfX0hBTkRMRV9fKSBcDQotICAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpICE9IEFEQzIpDQotI2VsaWYgZGVmaW5lZChTVE0zMkc0OTF4eCkgfHwgZGVmaW5lZChTVE0zMkc0QTF4eCkNCi0jZGVmaW5lIEFEQ19CQVRURVJZX1ZPTFRBR0VfSU5TVEFOQ0UoX19IQU5ETEVfXykgXA0KLSAgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSBBREMxKQ0KLSNlbmRpZg0KLQ0KLS8qKg0KLSAqIEBicmllZiBWZXJpZnkgdGhlIEFEQyBpbnN0YW5jZSBjb25uZWN0ZWQgdG8gdGhlIGludGVybmFsIHZvbHRhZ2UgcmVmZXJlbmNlDQotICogVlJFRklOVC4NCi0gKiBAcGFyYW0gX19IQU5ETEVfXyBBREMgaGFuZGxlLg0KLSAqIEByZXR2YWwgU0VUIChBREMgaW5zdGFuY2UgaXMgdmFsaWQpIG9yIFJFU0VUIChBREMgaW5zdGFuY2UgaXMgaW52YWxpZCkNCi0gKi8NCi0jZGVmaW5lIEFEQ19WUkVGSU5UX0lOU1RBTkNFKF9fSEFORExFX18pICgoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgIT0gQURDMikNCi0NCi0vKioNCi0gKiBAYnJpZWYgVmVyaWZ5IHRoZSBsZW5ndGggb2Ygc2NoZWR1bGVkIGluamVjdGVkIGNvbnZlcnNpb25zIGdyb3VwLg0KLSAqIEBwYXJhbSBfX0xFTkdUSF9fIG51bWJlciBvZiBwcm9ncmFtbWVkIGNvbnZlcnNpb25zLg0KLSAqIEByZXR2YWwgU0VUIChfX0xFTkdUSF9fIGlzIHdpdGhpbiB0aGUgbWF4aW11bSBudW1iZXIgb2YgcG9zc2libGUgcHJvZ3JhbW1hYmxlDQotICogaW5qZWN0ZWQgY29udmVyc2lvbnMpIG9yIFJFU0VUIChfX0xFTkdUSF9fIGlzIG51bGwgb3IgdG9vIGxhcmdlKQ0KLSAqLw0KLSNkZWZpbmUgSVNfQURDX0lOSkVDVEVEX05CX0NPTlYoX19MRU5HVEhfXykgXA0KLSAgKCgoX19MRU5HVEhfXykgPj0gKDFVKSkgJiYgKChfX0xFTkdUSF9fKSA8PSAoNFUpKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgQ2FsaWJyYXRpb24gZmFjdG9yIHNpemUgdmVyaWZpY2F0aW9uICg3IGJpdHMgbWF4aW11bSkuDQotICogQHBhcmFtIF9fQ0FMSUJSQVRJT05fRkFDVE9SX18gQ2FsaWJyYXRpb24gZmFjdG9yIHZhbHVlLg0KLSAqIEByZXR2YWwgU0VUIChfX0NBTElCUkFUSU9OX0ZBQ1RPUl9fIGlzIHdpdGhpbiB0aGUgYXV0aG9yaXplZCBzaXplKSBvciBSRVNFVA0KLSAqIChfX0NBTElCUkFUSU9OX0ZBQ1RPUl9fIGlzIHRvbyBsYXJnZSkNCi0gKi8NCi0jZGVmaW5lIElTX0FEQ19DQUxGQUNUKF9fQ0FMSUJSQVRJT05fRkFDVE9SX18pIFwNCi0gICgoX19DQUxJQlJBVElPTl9GQUNUT1JfXykgPD0gKDB4N0ZVKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgVmVyaWZ5IHRoZSBBREMgY2hhbm5lbCBzZXR0aW5nLg0KLSAqIEBwYXJhbSBfX0hBTkRMRV9fIEFEQyBoYW5kbGUuDQotICogQHBhcmFtIF9fQ0hBTk5FTF9fIHByb2dyYW1tZWQgQURDIGNoYW5uZWwuDQotICogQHJldHZhbCBTRVQgKF9fQ0hBTk5FTF9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19DSEFOTkVMX18gaXMgaW52YWxpZCkNCi0gKi8NCi0jaWYgZGVmaW5lZChTVE0zMkc0NzR4eCkgfHwgZGVmaW5lZChTVE0zMkc0ODR4eCkgfHwgZGVmaW5lZChTVE0zMkc0NzN4eCkgfHwgXA0KLSAgICBkZWZpbmVkKFNUTTMyRzQ4M3h4KQ0KLSNkZWZpbmUgSVNfQURDX0NIQU5ORUwoX19IQU5ETEVfXywgX19DSEFOTkVMX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKCgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzEpIHx8ICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzIpIHx8ICAgIFwNCi0gICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfNikgfHwgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfNykgfHwgICAgXA0KLSAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF84KSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF85KSB8fCAgICBcDQotICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzEwKSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8xMSkgfHwgIFwNCi0gICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMTIpIHx8ICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzE0KSB8fCAgXA0KLSAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8xNSkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gQURDMSkgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgKCgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzMpIHx8ICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzQpIHx8ICAgXA0KLSAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfNSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF9WT1BBTVAxKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMX1RFTVBTRU5TT1JfQURDMSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfVkJBVCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF9WUkVGSU5UKSkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSBBREMyKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAoKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMykgfHwgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfNCkgfHwgICBcDQotICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF81KSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8xMykgfHwgIFwNCi0gICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMX1ZPUEFNUDIpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMTcpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF9WT1BBTVAzX0FEQzIpKSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSBBREMzKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAoKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMykgfHwgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfNCkgfHwgICBcDQotICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF81KSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMX1ZPUEFNUDNfQURDMykgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMTYpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF9WQkFUKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMX1ZSRUZJTlQpKSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09IEFEQzQpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICgoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8zKSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF80KSB8fCAgIFwNCi0gICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzUpIHx8ICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzEzKSB8fCAgXA0KLSAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMTYpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF9WT1BBTVA2KSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMX1ZSRUZJTlQpKSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09IEFEQzUpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICgoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF9WT1BBTVA1KSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMX1RFTVBTRU5TT1JfQURDNSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfVk9QQU1QNCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8xMykgfHwgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMTYpIHx8IFwNCi0gICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMX1ZCQVQpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfVlJFRklOVCkpKSkNCi0jZWxpZiBkZWZpbmVkKFNUTTMyRzQ3MXh4KQ0KLSNkZWZpbmUgSVNfQURDX0NIQU5ORUwoX19IQU5ETEVfXywgX19DSEFOTkVMX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKCgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzEpIHx8ICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzIpIHx8ICAgIFwNCi0gICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMykgfHwgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfNCkgfHwgICAgXA0KLSAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF81KSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF82KSB8fCAgICBcDQotICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzcpIHx8ICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzgpIHx8ICAgIFwNCi0gICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfOSkgfHwgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMTApIHx8ICAgXA0KLSAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8xMSkgfHwgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMTIpIHx8ICBcDQotICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzE0KSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8xNSkpIHx8IFwNCi0gICAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSBBREMxKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAoKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfVk9QQU1QMSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF9URU1QU0VOU09SX0FEQzEpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMX1ZCQVQpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfVlJFRklOVCkpKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gQURDMikgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgKCgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzEzKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfVk9QQU1QMikgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8xNykgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMX1ZPUEFNUDNfQURDMikpKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09IEFEQzMpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICgoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF9WT1BBTVAzX0FEQzMpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzE2KSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfVkJBVCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF9WUkVGSU5UKSkpKQ0KLSNlbGlmIGRlZmluZWQoU1RNMzJHQksxQ0IpIHx8IGRlZmluZWQoU1RNMzJHNDMxeHgpIHx8IGRlZmluZWQoU1RNMzJHNDQxeHgpDQotI2RlZmluZSBJU19BRENfQ0hBTk5FTChfX0hBTkRMRV9fLCBfX0NIQU5ORUxfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMSkgfHwgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMikgfHwgICAgXA0KLSAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8zKSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF80KSB8fCAgICBcDQotICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzUpIHx8ICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzYpIHx8ICAgIFwNCi0gICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfNykgfHwgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfOCkgfHwgICAgXA0KLSAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF85KSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8xMCkgfHwgICBcDQotICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzExKSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8xMikgfHwgIFwNCi0gICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMTQpIHx8ICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzE1KSkgfHwgXA0KLSAgICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09IEFEQzEpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICgoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF9WT1BBTVAxKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMX1RFTVBTRU5TT1JfQURDMSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfVkJBVCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF9WUkVGSU5UKSkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSBBREMyKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAoKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMTMpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF9WT1BBTVAyKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzE3KSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfVk9QQU1QM19BREMyKSkpKQ0KLSNlbGlmIGRlZmluZWQoU1RNMzJHNDkxeHgpIHx8IGRlZmluZWQoU1RNMzJHNEExeHgpDQotI2RlZmluZSBJU19BRENfQ0hBTk5FTChfX0hBTkRMRV9fLCBfX0NIQU5ORUxfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMSkgfHwgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMikgfHwgICAgXA0KLSAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8zKSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF80KSB8fCAgICBcDQotICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzUpIHx8ICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzYpIHx8ICAgIFwNCi0gICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfNykgfHwgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfOCkgfHwgICAgXA0KLSAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF85KSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8xMCkgfHwgICBcDQotICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzExKSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8xMikgfHwgIFwNCi0gICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMTQpIHx8ICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzE1KSkgfHwgXA0KLSAgICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09IEFEQzEpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICgoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF9WT1BBTVAxKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMX1RFTVBTRU5TT1JfQURDMSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfVkJBVCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF9WUkVGSU5UKSkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSBBREMyKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAoKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMTMpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF9WT1BBTVAyKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzE3KSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfVk9QQU1QM19BREMyKSkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gQURDMykgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgKCgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMX1ZPUEFNUDNfQURDMykgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMTYpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF9WT1BBTVA2KSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMX1ZSRUZJTlQpKSkpDQotI2VuZGlmIC8qIGRlZmluZWQoU1RNMzJHNDc0eHgpIHx8IGRlZmluZWQoU1RNMzJHNDg0eHgpIHx8IGRlZmluZWQoU1RNMzJHNDczeHgpIFwNCi0gICAgICAgICAgfHwgZGVmaW5lZChTVE0zMkc0ODN4eCkgKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgVmVyaWZ5IHRoZSBBREMgY2hhbm5lbCBzZXR0aW5nIGluIGRpZmZlcmVudGlhbCBtb2RlLg0KLSAqIEBwYXJhbSBfX0hBTkRMRV9fIEFEQyBoYW5kbGUuDQotICogQHBhcmFtIF9fQ0hBTk5FTF9fIHByb2dyYW1tZWQgQURDIGNoYW5uZWwuDQotICogQHJldHZhbCBTRVQgKF9fQ0hBTk5FTF9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19DSEFOTkVMX18gaXMgaW52YWxpZCkNCi0gKi8NCi0jaWYgZGVmaW5lZChTVE0zMkc0NzR4eCkgfHwgZGVmaW5lZChTVE0zMkc0ODR4eCkgfHwgZGVmaW5lZChTVE0zMkc0NzN4eCkgfHwgXA0KLSAgICBkZWZpbmVkKFNUTTMyRzQ4M3h4KQ0KLSNkZWZpbmUgSVNfQURDX0RJRkZfQ0hBTk5FTChfX0hBTkRMRV9fLCBfX0NIQU5ORUxfXykgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKCgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzEpIHx8ICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzYpIHx8ICAgIFwNCi0gICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfNykgfHwgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfOCkgfHwgICAgXA0KLSAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF85KSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8xMCkgfHwgICBcDQotICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzExKSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8xNCkpIHx8IFwNCi0gICAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSBBREMxKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAoKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMikgfHwgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMykgfHwgICBcDQotICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF80KSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF81KSkpIHx8IFwNCi0gICAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSBBREMyKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAoKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMikgfHwgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMykgfHwgICBcDQotICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF80KSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF81KSB8fCAgIFwNCi0gICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzEyKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMTMpKSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gQURDMykgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgKCgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzIpIHx8ICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzMpIHx8ICAgXA0KLSAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfNCkgfHwgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfNSkgfHwgICBcDQotICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8xNSkpKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSBBREM0KSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAoKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMikgfHwgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMykgfHwgICBcDQotICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF80KSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF81KSB8fCAgIFwNCi0gICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzEyKSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8xMykgfHwgXA0KLSAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMTUpKSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gQURDNSkgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgKCgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzEyKSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8xMykgfHwgXA0KLSAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMTUpKSkpDQotI2VsaWYgZGVmaW5lZChTVE0zMkc0NzF4eCkgfHwgZGVmaW5lZChTVE0zMkc0OTF4eCkgfHwgZGVmaW5lZChTVE0zMkc0QTF4eCkNCi0jZGVmaW5lIElTX0FEQ19ESUZGX0NIQU5ORUwoX19IQU5ETEVfXywgX19DSEFOTkVMX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKCgoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8xKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICgoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8yKSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8zKSB8fCAgIFwNCi0gICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzQpIHx8ICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzUpIHx8ICAgXA0KLSAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfNikgfHwgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfNykgfHwgICBcDQotICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF84KSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF85KSB8fCAgIFwNCi0gICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzEwKSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8xMSkgfHwgXA0KLSAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMTQpKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09IEFEQzIpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8xMikgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzEzKSkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09IEFEQzMpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzE1KSkpKQ0KLSNlbGlmIGRlZmluZWQoU1RNMzJHQksxQ0IpIHx8IGRlZmluZWQoU1RNMzJHNDMxeHgpIHx8IGRlZmluZWQoU1RNMzJHNDQxeHgpDQotI2RlZmluZSBJU19BRENfRElGRl9DSEFOTkVMKF9fSEFORExFX18sIF9fQ0hBTk5FTF9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMSkgfHwgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMikgfHwgICAgXA0KLSAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8zKSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF80KSB8fCAgICBcDQotICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzUpIHx8ICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzYpIHx8ICAgIFwNCi0gICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfNykgfHwgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfOCkgfHwgICAgXA0KLSAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF85KSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8xMCkgfHwgICBcDQotICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzExKSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8xNCkpIHx8IFwNCi0gICAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSBBREMyKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAoKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMTIpIHx8ICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzEzKSkpKQ0KLSNlbmRpZg0KLQ0KLS8qKg0KLSAqIEBicmllZiBWZXJpZnkgdGhlIEFEQyBzaW5nbGUtZW5kZWQgaW5wdXQgb3IgZGlmZmVyZW50aWFsIG1vZGUgc2V0dGluZy4NCi0gKiBAcGFyYW0gX19TSU5HX0RJRkZfXyBwcm9ncmFtbWVkIGNoYW5uZWwgc2V0dGluZy4NCi0gKiBAcmV0dmFsIFNFVCAoX19TSU5HX0RJRkZfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fU0lOR19ESUZGX18gaXMgaW52YWxpZCkNCi0gKi8NCi0jZGVmaW5lIElTX0FEQ19TSU5HTEVfRElGRkVSRU5USUFMKF9fU0lOR19ESUZGX18pIFwNCi0gICgoKF9fU0lOR19ESUZGX18pID09IEFEQ19TSU5HTEVfRU5ERUQpIHx8ICAgICAgIFwNCi0gICAoKF9fU0lOR19ESUZGX18pID09IEFEQ19ESUZGRVJFTlRJQUxfRU5ERUQpKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBWZXJpZnkgdGhlIEFEQyBvZmZzZXQgbWFuYWdlbWVudCBzZXR0aW5nLg0KLSAqIEBwYXJhbSBfX09GRlNFVF9OVU1CRVJfXyBBREMgb2Zmc2V0IG1hbmFnZW1lbnQuDQotICogQHJldHZhbCBTRVQgKF9fT0ZGU0VUX05VTUJFUl9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19PRkZTRVRfTlVNQkVSX18gaXMNCi0gKiBpbnZhbGlkKQ0KLSAqLw0KLSNkZWZpbmUgSVNfQURDX09GRlNFVF9OVU1CRVIoX19PRkZTRVRfTlVNQkVSX18pIFwNCi0gICgoKF9fT0ZGU0VUX05VTUJFUl9fKSA9PSBBRENfT0ZGU0VUX05PTkUpIHx8ICBcDQotICAgKChfX09GRlNFVF9OVU1CRVJfXykgPT0gQURDX09GRlNFVF8xKSB8fCAgICAgXA0KLSAgICgoX19PRkZTRVRfTlVNQkVSX18pID09IEFEQ19PRkZTRVRfMikgfHwgICAgIFwNCi0gICAoKF9fT0ZGU0VUX05VTUJFUl9fKSA9PSBBRENfT0ZGU0VUXzMpIHx8ICAgICBcDQotICAgKChfX09GRlNFVF9OVU1CRVJfXykgPT0gQURDX09GRlNFVF80KSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgVmVyaWZ5IHRoZSBBREMgb2Zmc2V0IHNpZ24gc2V0dGluZy4NCi0gKiBAcGFyYW0gX19PRkZTRVRfU0lHTl9fIEFEQyBvZmZzZXQgc2lnbi4NCi0gKiBAcmV0dmFsIFNFVCAoX19PRkZTRVRfU0lHTl9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19PRkZTRVRfU0lHTl9fIGlzIGludmFsaWQpDQotICovDQotI2RlZmluZSBJU19BRENfT0ZGU0VUX1NJR04oX19PRkZTRVRfU0lHTl9fKSAgICAgICAgICAgXA0KLSAgKCgoX19PRkZTRVRfU0lHTl9fKSA9PSBBRENfT0ZGU0VUX1NJR05fTkVHQVRJVkUpIHx8IFwNCi0gICAoKF9fT0ZGU0VUX1NJR05fXykgPT0gQURDX09GRlNFVF9TSUdOX1BPU0lUSVZFKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgVmVyaWZ5IHRoZSBBREMgaW5qZWN0ZWQgY2hhbm5lbCBzZXR0aW5nLg0KLSAqIEBwYXJhbSBfX0NIQU5ORUxfXyBwcm9ncmFtbWVkIEFEQyBpbmplY3RlZCBjaGFubmVsLg0KLSAqIEByZXR2YWwgU0VUIChfX0NIQU5ORUxfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fQ0hBTk5FTF9fIGlzIGludmFsaWQpDQotICovDQotI2RlZmluZSBJU19BRENfSU5KRUNURURfUkFOSyhfX0NIQU5ORUxfXykgICAgXA0KLSAgKCgoX19DSEFOTkVMX18pID09IEFEQ19JTkpFQ1RFRF9SQU5LXzEpIHx8IFwNCi0gICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfSU5KRUNURURfUkFOS18yKSB8fCBcDQotICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0lOSkVDVEVEX1JBTktfMykgfHwgXA0KLSAgICgoX19DSEFOTkVMX18pID09IEFEQ19JTkpFQ1RFRF9SQU5LXzQpKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBWZXJpZnkgdGhlIEFEQyBpbmplY3RlZCBjb252ZXJzaW9ucyBleHRlcm5hbCB0cmlnZ2VyLg0KLSAqIEBwYXJhbSBfX0hBTkRMRV9fIEFEQyBoYW5kbGUuDQotICogQHBhcmFtIF9fSU5KVFJJR19fIHByb2dyYW1tZWQgQURDIGluamVjdGVkIGNvbnZlcnNpb25zIGV4dGVybmFsIHRyaWdnZXIuDQotICogQHJldHZhbCBTRVQgKF9fSU5KVFJJR19fIGlzIGEgdmFsaWQgdmFsdWUpIG9yIFJFU0VUIChfX0lOSlRSSUdfXyBpcyBpbnZhbGlkKQ0KLSAqLw0KLSNpZiBkZWZpbmVkKFNUTTMyRzQ3NHh4KSB8fCBkZWZpbmVkKFNUTTMyRzQ4NHh4KQ0KLSNkZWZpbmUgSVNfQURDX0VYVFRSSUdJTkpFQyhfX0hBTkRMRV9fLCBfX0lOSlRSSUdfXykgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDFfVFJHTykgfHwgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QxX1RSR08yKSB8fCAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UMV9DQzQpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDJfVFJHTykgfHwgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QzX1RSR08pIHx8ICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UNF9UUkdPKSB8fCAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDZfVFJHTykgfHwgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1Q3X1RSR08pIHx8ICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UOF9UUkdPKSB8fCAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDhfVFJHTzIpIHx8ICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1Q4X0NDNCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UMTVfVFJHTykgfHwgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDIwX1RSR08pIHx8ICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QyMF9UUkdPMikgfHwgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19IUlRJTV9UUkcyKSB8fCAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfSFJUSU1fVFJHNCkgfHwgICAgICAgICAgICAgICAgICAgICBcDQotICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX0hSVElNX1RSRzUpIHx8ICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19IUlRJTV9UUkc2KSB8fCAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfSFJUSU1fVFJHNykgfHwgICAgICAgICAgICAgICAgICAgICBcDQotICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX0hSVElNX1RSRzgpIHx8ICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19IUlRJTV9UUkc5KSB8fCAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfSFJUSU1fVFJHMTApIHx8ICAgICAgICAgICAgICAgICAgICBcDQotICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX0xQVElNX09VVCkgfHwgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gQURDMSkgfHwgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gQURDMikpICYmIFwNCi0gICAgKCgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UMl9DQzEpIHx8ICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDNfQ0MxKSB8fCAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QzX0NDMykgfHwgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UM19DQzQpIHx8ICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDE2X0NDMSkgfHwgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QyMF9DQzQpIHx8ICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19FWFRfSVQxNSkpKSB8fCAgICAgICAgICAgICAgICAgICBcDQotICAgKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBBREMzKSB8fCAoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBBREM0KSB8fCAgXA0KLSAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gQURDNSkpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgKCgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UMV9DQzMpIHx8ICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDRfQ0MzKSB8fCAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1Q0X0NDNCkgfHwgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UOF9DQzIpIHx8ICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDIwX0NDMikgfHwgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX0hSVElNX1RSRzEpIHx8ICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19IUlRJTV9UUkczKSB8fCAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfRVhUX0lUMykpKSB8fCAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoX19JTkpUUklHX18pID09IEFEQ19JTkpFQ1RFRF9TT0ZUV0FSRV9TVEFSVCkpDQotI2VsaWYgZGVmaW5lZChTVE0zMkc0NzN4eCkgfHwgZGVmaW5lZChTVE0zMkc0ODN4eCkNCi0jZGVmaW5lIElTX0FEQ19FWFRUUklHSU5KRUMoX19IQU5ETEVfXywgX19JTkpUUklHX18pICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QxX1RSR08pIHx8ICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UMV9UUkdPMikgfHwgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDFfQ0M0KSB8fCAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QyX1RSR08pIHx8ICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UM19UUkdPKSB8fCAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDRfVFJHTykgfHwgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1Q2X1RSR08pIHx8ICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UN19UUkdPKSB8fCAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDhfVFJHTykgfHwgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1Q4X1RSR08yKSB8fCAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UOF9DQzQpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDE1X1RSR08pIHx8ICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QyMF9UUkdPKSB8fCAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UMjBfVFJHTzIpIHx8ICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfTFBUSU1fT1VUKSB8fCAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBBREMxKSB8fCAoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBBREMyKSkgJiYgXA0KLSAgICAoKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QyX0NDMSkgfHwgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UM19DQzEpIHx8ICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDNfQ0MzKSB8fCAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QzX0NDNCkgfHwgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UMTZfQ0MxKSB8fCAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDIwX0NDNCkgfHwgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX0VYVF9JVDE1KSkpIHx8ICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlID09IEFEQzMpIHx8ICgoX19IQU5ETEVfXyktPkluc3RhbmNlID09IEFEQzQpIHx8ICBcDQotICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBBREM1KSkgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAoKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QxX0NDMykgfHwgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UNF9DQzMpIHx8ICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDRfQ0M0KSB8fCAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1Q4X0NDMikgfHwgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UMjBfQ0MyKSB8fCAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfRVhUX0lUMykpKSB8fCAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoX19JTkpUUklHX18pID09IEFEQ19JTkpFQ1RFRF9TT0ZUV0FSRV9TVEFSVCkpDQotI2VsaWYgZGVmaW5lZChTVE0zMkc0NzF4eCkNCi0jZGVmaW5lIElTX0FEQ19FWFRUUklHSU5KRUMoX19IQU5ETEVfXywgX19JTkpUUklHX18pICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QxX1RSR08pIHx8ICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UMV9UUkdPMikgfHwgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDFfQ0M0KSB8fCAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QyX1RSR08pIHx8ICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UM19UUkdPKSB8fCAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDRfVFJHTykgfHwgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1Q2X1RSR08pIHx8ICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UN19UUkdPKSB8fCAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDhfVFJHTykgfHwgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1Q4X1RSR08yKSB8fCAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UOF9DQzQpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDE1X1RSR08pIHx8ICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX0xQVElNX09VVCkgfHwgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gQURDMSkgfHwgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gQURDMikpICYmIFwNCi0gICAgKCgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UMl9DQzEpIHx8ICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDNfQ0MxKSB8fCAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QzX0NDMykgfHwgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UM19DQzQpIHx8ICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDE2X0NDMSkgfHwgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX0VYVF9JVDE1KSkpIHx8ICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlID09IEFEQzMpKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICgoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDFfQ0MzKSB8fCAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1Q0X0NDMykgfHwgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UNF9DQzQpIHx8ICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDhfQ0MyKSB8fCAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX0VYVF9JVDMpKSkgfHwgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fSU5KVFJJR19fKSA9PSBBRENfSU5KRUNURURfU09GVFdBUkVfU1RBUlQpKQ0KLSNlbGlmIGRlZmluZWQoU1RNMzJHQksxQ0IpIHx8IGRlZmluZWQoU1RNMzJHNDMxeHgpIHx8IGRlZmluZWQoU1RNMzJHNDQxeHgpDQotI2RlZmluZSBJU19BRENfRVhUVFJJR0lOSkVDKF9fSEFORExFX18sIF9fSU5KVFJJR19fKSAgICAgXA0KLSAgKCgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UMV9UUkdPKSB8fCAgIFwNCi0gICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDFfVFJHTzIpIHx8ICBcDQotICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QxX0NDNCkgfHwgICAgXA0KLSAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UMl9UUkdPKSB8fCAgIFwNCi0gICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDJfQ0MxKSB8fCAgICBcDQotICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QzX1RSR08pIHx8ICAgXA0KLSAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UM19DQzEpIHx8ICAgIFwNCi0gICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDNfQ0MzKSB8fCAgICBcDQotICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QzX0NDNCkgfHwgICAgXA0KLSAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UNF9UUkdPKSB8fCAgIFwNCi0gICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDZfVFJHTykgfHwgICBcDQotICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1Q3X1RSR08pIHx8ICAgXA0KLSAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UOF9UUkdPKSB8fCAgIFwNCi0gICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDhfVFJHTzIpIHx8ICBcDQotICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1Q4X0NDNCkgfHwgICAgXA0KLSAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UMTVfVFJHTykgfHwgIFwNCi0gICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDE2X0NDMSkgfHwgICBcDQotICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX0VYVF9JVDE1KSB8fCAgXA0KLSAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19MUFRJTV9PVVQpIHx8IFwNCi0gICAoKF9fSU5KVFJJR19fKSA9PSBBRENfSU5KRUNURURfU09GVFdBUkVfU1RBUlQpKQ0KLSNlbGlmIGRlZmluZWQoU1RNMzJHNDkxeHgpIHx8IGRlZmluZWQoU1RNMzJHNEExeHgpDQotI2RlZmluZSBJU19BRENfRVhUVFJJR0lOSkVDKF9fSEFORExFX18sIF9fSU5KVFJJR19fKSAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKCgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UMV9UUkdPKSB8fCAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDFfVFJHTzIpIHx8ICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QxX0NDNCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UMl9UUkdPKSB8fCAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDNfVFJHTykgfHwgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1Q0X1RSR08pIHx8ICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UNl9UUkdPKSB8fCAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDdfVFJHTykgfHwgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1Q4X1RSR08pIHx8ICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UOF9UUkdPMikgfHwgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDhfQ0M0KSB8fCAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QxNV9UUkdPKSB8fCAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UMjBfVFJHTykgfHwgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDIwX1RSR08yKSB8fCAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX0xQVElNX09VVCkgfHwgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gQURDMSkgfHwgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gQURDMikpICYmIFwNCi0gICAgKCgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UMl9DQzEpIHx8ICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDNfQ0MxKSB8fCAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QzX0NDMykgfHwgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UM19DQzQpIHx8ICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDE2X0NDMSkgfHwgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QyMF9DQzQpIHx8ICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19FWFRfSVQxNSkpKSB8fCAgICAgICAgICAgICAgICAgICBcDQotICAgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlID09IEFEQzMpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAoKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QxX0NDMykgfHwgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UNF9DQzMpIHx8ICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDRfQ0M0KSB8fCAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1Q4X0NDMikgfHwgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UMjBfQ0MyKSB8fCAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfRVhUX0lUMykpKSB8fCAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoX19JTkpUUklHX18pID09IEFEQ19JTkpFQ1RFRF9TT0ZUV0FSRV9TVEFSVCkpDQotI2VuZGlmDQotDQotLyoqDQotICogQGJyaWVmIFZlcmlmeSB0aGUgQURDIGVkZ2UgdHJpZ2dlciBzZXR0aW5nIGZvciBpbmplY3RlZCBncm91cC4NCi0gKiBAcGFyYW0gX19FREdFX18gcHJvZ3JhbW1lZCBBREMgZWRnZSB0cmlnZ2VyIHNldHRpbmcuDQotICogQHJldHZhbCBTRVQgKF9fRURHRV9fIGlzIGEgdmFsaWQgdmFsdWUpIG9yIFJFU0VUIChfX0VER0VfXyBpcyBpbnZhbGlkKQ0KLSAqLw0KLSNkZWZpbmUgSVNfQURDX0VYVFRSSUdJTkpFQ19FREdFKF9fRURHRV9fKSAgICAgICAgICAgICAgICAgICBcDQotICAoKChfX0VER0VfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9FREdFX05PTkUpIHx8ICAgIFwNCi0gICAoKF9fRURHRV9fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX0VER0VfUklTSU5HKSB8fCAgXA0KLSAgICgoX19FREdFX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfRURHRV9GQUxMSU5HKSB8fCBcDQotICAgKChfX0VER0VfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9FREdFX1JJU0lOR0ZBTExJTkcpKQ0KLQ0KLSNpZiBkZWZpbmVkKEFEQ19NVUxUSU1PREVfU1VQUE9SVCkNCi0vKioNCi0gKiBAYnJpZWYgVmVyaWZ5IHRoZSBBREMgbXVsdGltb2RlIHNldHRpbmcuDQotICogQHBhcmFtIF9fTU9ERV9fIHByb2dyYW1tZWQgQURDIG11bHRpbW9kZSBzZXR0aW5nLg0KLSAqIEByZXR2YWwgU0VUIChfX01PREVfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fTU9ERV9fIGlzIGludmFsaWQpDQotICovDQotI2RlZmluZSBJU19BRENfTVVMVElNT0RFKF9fTU9ERV9fKSAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKCgoX19NT0RFX18pID09IEFEQ19NT0RFX0lOREVQRU5ERU5UKSB8fCAgICAgICAgICAgICAgIFwNCi0gICAoKF9fTU9ERV9fKSA9PSBBRENfRFVBTE1PREVfUkVHU0lNVUxUX0lOSkVDU0lNVUxUKSB8fCBcDQotICAgKChfX01PREVfXykgPT0gQURDX0RVQUxNT0RFX1JFR1NJTVVMVF9BTFRFUlRSSUcpIHx8ICAgXA0KLSAgICgoX19NT0RFX18pID09IEFEQ19EVUFMTU9ERV9SRUdJTlRFUkxfSU5KRUNTSU1VTFQpIHx8IFwNCi0gICAoKF9fTU9ERV9fKSA9PSBBRENfRFVBTE1PREVfSU5KRUNTSU1VTFQpIHx8ICAgICAgICAgICBcDQotICAgKChfX01PREVfXykgPT0gQURDX0RVQUxNT0RFX1JFR1NJTVVMVCkgfHwgICAgICAgICAgICAgXA0KLSAgICgoX19NT0RFX18pID09IEFEQ19EVUFMTU9ERV9JTlRFUkwpIHx8ICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fTU9ERV9fKSA9PSBBRENfRFVBTE1PREVfQUxURVJUUklHKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgVmVyaWZ5IHRoZSBBREMgbXVsdGltb2RlIERNQSBhY2Nlc3Mgc2V0dGluZy4NCi0gKiBAcGFyYW0gX19NT0RFX18gcHJvZ3JhbW1lZCBBREMgbXVsdGltb2RlIERNQSBhY2Nlc3Mgc2V0dGluZy4NCi0gKiBAcmV0dmFsIFNFVCAoX19NT0RFX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX01PREVfXyBpcyBpbnZhbGlkKQ0KLSAqLw0KLSNkZWZpbmUgSVNfQURDX0RNQV9BQ0NFU1NfTVVMVElNT0RFKF9fTU9ERV9fKSAgICAgIFwNCi0gICgoKF9fTU9ERV9fKSA9PSBBRENfRE1BQUNDRVNTTU9ERV9ESVNBQkxFRCkgfHwgICBcDQotICAgKChfX01PREVfXykgPT0gQURDX0RNQUFDQ0VTU01PREVfMTJfMTBfQklUUykgfHwgXA0KLSAgICgoX19NT0RFX18pID09IEFEQ19ETUFBQ0NFU1NNT0RFXzhfNl9CSVRTKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgVmVyaWZ5IHRoZSBBREMgbXVsdGltb2RlIGRlbGF5IHNldHRpbmcuDQotICogQHBhcmFtIF9fREVMQVlfXyBwcm9ncmFtbWVkIEFEQyBtdWx0aW1vZGUgZGVsYXkgc2V0dGluZy4NCi0gKiBAcmV0dmFsIFNFVCAoX19ERUxBWV9fIGlzIGEgdmFsaWQgdmFsdWUpIG9yIFJFU0VUIChfX0RFTEFZX18gaXMgaW52YWxpZCkNCi0gKi8NCi0jZGVmaW5lIElTX0FEQ19TQU1QTElOR19ERUxBWShfX0RFTEFZX18pICAgICAgICAgICAgIFwNCi0gICgoKF9fREVMQVlfXykgPT0gQURDX1RXT1NBTVBMSU5HREVMQVlfMUNZQ0xFKSB8fCAgIFwNCi0gICAoKF9fREVMQVlfXykgPT0gQURDX1RXT1NBTVBMSU5HREVMQVlfMkNZQ0xFUykgfHwgIFwNCi0gICAoKF9fREVMQVlfXykgPT0gQURDX1RXT1NBTVBMSU5HREVMQVlfM0NZQ0xFUykgfHwgIFwNCi0gICAoKF9fREVMQVlfXykgPT0gQURDX1RXT1NBTVBMSU5HREVMQVlfNENZQ0xFUykgfHwgIFwNCi0gICAoKF9fREVMQVlfXykgPT0gQURDX1RXT1NBTVBMSU5HREVMQVlfNUNZQ0xFUykgfHwgIFwNCi0gICAoKF9fREVMQVlfXykgPT0gQURDX1RXT1NBTVBMSU5HREVMQVlfNkNZQ0xFUykgfHwgIFwNCi0gICAoKF9fREVMQVlfXykgPT0gQURDX1RXT1NBTVBMSU5HREVMQVlfN0NZQ0xFUykgfHwgIFwNCi0gICAoKF9fREVMQVlfXykgPT0gQURDX1RXT1NBTVBMSU5HREVMQVlfOENZQ0xFUykgfHwgIFwNCi0gICAoKF9fREVMQVlfXykgPT0gQURDX1RXT1NBTVBMSU5HREVMQVlfOUNZQ0xFUykgfHwgIFwNCi0gICAoKF9fREVMQVlfXykgPT0gQURDX1RXT1NBTVBMSU5HREVMQVlfMTBDWUNMRVMpIHx8IFwNCi0gICAoKF9fREVMQVlfXykgPT0gQURDX1RXT1NBTVBMSU5HREVMQVlfMTFDWUNMRVMpIHx8IFwNCi0gICAoKF9fREVMQVlfXykgPT0gQURDX1RXT1NBTVBMSU5HREVMQVlfMTJDWUNMRVMpKQ0KLSNlbmRpZiAvKiBBRENfTVVMVElNT0RFX1NVUFBPUlQgKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgVmVyaWZ5IHRoZSBBREMgYW5hbG9nIHdhdGNoZG9nIHNldHRpbmcuDQotICogQHBhcmFtIF9fV0FUQ0hET0dfXyBwcm9ncmFtbWVkIEFEQyBhbmFsb2cgd2F0Y2hkb2cgc2V0dGluZy4NCi0gKiBAcmV0dmFsIFNFVCAoX19XQVRDSERPR19fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19XQVRDSERPR19fIGlzIGludmFsaWQpDQotICovDQotI2RlZmluZSBJU19BRENfQU5BTE9HX1dBVENIRE9HX05VTUJFUihfX1dBVENIRE9HX18pIFwNCi0gICgoKF9fV0FUQ0hET0dfXykgPT0gQURDX0FOQUxPR1dBVENIRE9HXzEpIHx8ICAgICAgXA0KLSAgICgoX19XQVRDSERPR19fKSA9PSBBRENfQU5BTE9HV0FUQ0hET0dfMikgfHwgICAgICBcDQotICAgKChfX1dBVENIRE9HX18pID09IEFEQ19BTkFMT0dXQVRDSERPR18zKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgVmVyaWZ5IHRoZSBBREMgYW5hbG9nIHdhdGNoZG9nIG1vZGUgc2V0dGluZy4NCi0gKiBAcGFyYW0gX19XQVRDSERPR19NT0RFX18gcHJvZ3JhbW1lZCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vZGUgc2V0dGluZy4NCi0gKiBAcmV0dmFsIFNFVCAoX19XQVRDSERPR19NT0RFX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1dBVENIRE9HX01PREVfXyBpcw0KLSAqIGludmFsaWQpDQotICovDQotI2RlZmluZSBJU19BRENfQU5BTE9HX1dBVENIRE9HX01PREUoX19XQVRDSERPR19NT0RFX18pICAgICAgICAgICAgXA0KLSAgKCgoX19XQVRDSERPR19NT0RFX18pID09IEFEQ19BTkFMT0dXQVRDSERPR19OT05FKSB8fCAgICAgICAgICAgIFwNCi0gICAoKF9fV0FUQ0hET0dfTU9ERV9fKSA9PSBBRENfQU5BTE9HV0FUQ0hET0dfU0lOR0xFX1JFRykgfHwgICAgICBcDQotICAgKChfX1dBVENIRE9HX01PREVfXykgPT0gQURDX0FOQUxPR1dBVENIRE9HX1NJTkdMRV9JTkpFQykgfHwgICAgXA0KLSAgICgoX19XQVRDSERPR19NT0RFX18pID09IEFEQ19BTkFMT0dXQVRDSERPR19TSU5HTEVfUkVHSU5KRUMpIHx8IFwNCi0gICAoKF9fV0FUQ0hET0dfTU9ERV9fKSA9PSBBRENfQU5BTE9HV0FUQ0hET0dfQUxMX1JFRykgfHwgICAgICAgICBcDQotICAgKChfX1dBVENIRE9HX01PREVfXykgPT0gQURDX0FOQUxPR1dBVENIRE9HX0FMTF9JTkpFQykgfHwgICAgICAgXA0KLSAgICgoX19XQVRDSERPR19NT0RFX18pID09IEFEQ19BTkFMT0dXQVRDSERPR19BTExfUkVHSU5KRUMpKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBWZXJpZnkgdGhlIEFEQyBhbmFsb2cgd2F0Y2hkb2cgZmlsdGVyaW5nIHNldHRpbmcuDQotICogQHBhcmFtIF9fRklMVEVSSU5HX01PREVfXyBwcm9ncmFtbWVkIEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9kZSBzZXR0aW5nLg0KLSAqIEByZXR2YWwgU0VUIChfX0ZJTFRFUklOR19NT0RFX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0ZJTFRFUklOR19NT0RFX18gaXMNCi0gKiBpbnZhbGlkKQ0KLSAqLw0KLSNkZWZpbmUgSVNfQURDX0FOQUxPR19XQVRDSERPR19GSUxURVJJTkdfTU9ERShfX0ZJTFRFUklOR19NT0RFX18pIFwNCi0gICgoKF9fRklMVEVSSU5HX01PREVfXykgPT0gQURDX0FXRF9GSUxURVJJTkdfTk9ORSkgfHwgICAgICAgICAgICBcDQotICAgKChfX0ZJTFRFUklOR19NT0RFX18pID09IEFEQ19BV0RfRklMVEVSSU5HXzJTQU1QTEVTKSB8fCAgICAgICAgXA0KLSAgICgoX19GSUxURVJJTkdfTU9ERV9fKSA9PSBBRENfQVdEX0ZJTFRFUklOR18zU0FNUExFUykgfHwgICAgICAgIFwNCi0gICAoKF9fRklMVEVSSU5HX01PREVfXykgPT0gQURDX0FXRF9GSUxURVJJTkdfNFNBTVBMRVMpIHx8ICAgICAgICBcDQotICAgKChfX0ZJTFRFUklOR19NT0RFX18pID09IEFEQ19BV0RfRklMVEVSSU5HXzVTQU1QTEVTKSB8fCAgICAgICAgXA0KLSAgICgoX19GSUxURVJJTkdfTU9ERV9fKSA9PSBBRENfQVdEX0ZJTFRFUklOR182U0FNUExFUykgfHwgICAgICAgIFwNCi0gICAoKF9fRklMVEVSSU5HX01PREVfXykgPT0gQURDX0FXRF9GSUxURVJJTkdfN1NBTVBMRVMpIHx8ICAgICAgICBcDQotICAgKChfX0ZJTFRFUklOR19NT0RFX18pID09IEFEQ19BV0RfRklMVEVSSU5HXzhTQU1QTEVTKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgVmVyaWZ5IHRoZSBBREMgY29udmVyc2lvbiAocmVndWxhciBvciBpbmplY3RlZCBvciBib3RoKS4NCi0gKiBAcGFyYW0gX19DT05WRVJTSU9OX18gQURDIGNvbnZlcnNpb24gZ3JvdXAuDQotICogQHJldHZhbCBTRVQgKF9fQ09OVkVSU0lPTl9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19DT05WRVJTSU9OX18gaXMgaW52YWxpZCkNCi0gKi8NCi0jZGVmaW5lIElTX0FEQ19DT05WRVJTSU9OX0dST1VQKF9fQ09OVkVSU0lPTl9fKSBcDQotICAoKChfX0NPTlZFUlNJT05fXykgPT0gQURDX1JFR1VMQVJfR1JPVVApIHx8ICAgXA0KLSAgICgoX19DT05WRVJTSU9OX18pID09IEFEQ19JTkpFQ1RFRF9HUk9VUCkgfHwgIFwNCi0gICAoKF9fQ09OVkVSU0lPTl9fKSA9PSBBRENfUkVHVUxBUl9JTkpFQ1RFRF9HUk9VUCkpDQotDQotLyoqDQotICogQGJyaWVmIFZlcmlmeSB0aGUgQURDIGV2ZW50IHR5cGUuDQotICogQHBhcmFtIF9fRVZFTlRfXyBBREMgZXZlbnQuDQotICogQHJldHZhbCBTRVQgKF9fRVZFTlRfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fRVZFTlRfXyBpcyBpbnZhbGlkKQ0KLSAqLw0KLSNkZWZpbmUgSVNfQURDX0VWRU5UX1RZUEUoX19FVkVOVF9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKChfX0VWRU5UX18pID09IEFEQ19FT1NNUF9FVkVOVCkgfHwgKChfX0VWRU5UX18pID09IEFEQ19BV0RfRVZFTlQpIHx8IFwNCi0gICAoKF9fRVZFTlRfXykgPT0gQURDX0FXRDJfRVZFTlQpIHx8ICgoX19FVkVOVF9fKSA9PSBBRENfQVdEM19FVkVOVCkgfHwgXA0KLSAgICgoX19FVkVOVF9fKSA9PSBBRENfT1ZSX0VWRU5UKSB8fCAoKF9fRVZFTlRfXykgPT0gQURDX0pRT1ZGX0VWRU5UKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgVmVyaWZ5IHRoZSBBREMgb3ZlcnNhbXBsaW5nIHJhdGlvLg0KLSAqIEBwYXJhbSBfX1JBVElPX18gcHJvZ3JhbW1lZCBBREMgb3ZlcnNhbXBsaW5nIHJhdGlvLg0KLSAqIEByZXR2YWwgU0VUIChfX1JBVElPX18gaXMgYSB2YWxpZCB2YWx1ZSkgb3IgUkVTRVQgKF9fUkFUSU9fXyBpcyBpbnZhbGlkKQ0KLSAqLw0KLSNkZWZpbmUgSVNfQURDX09WRVJTQU1QTElOR19SQVRJTyhfX1JBVElPX18pICAgICAgXA0KLSAgKCgoX19SQVRJT19fKSA9PSBBRENfT1ZFUlNBTVBMSU5HX1JBVElPXzIpIHx8ICAgXA0KLSAgICgoX19SQVRJT19fKSA9PSBBRENfT1ZFUlNBTVBMSU5HX1JBVElPXzQpIHx8ICAgXA0KLSAgICgoX19SQVRJT19fKSA9PSBBRENfT1ZFUlNBTVBMSU5HX1JBVElPXzgpIHx8ICAgXA0KLSAgICgoX19SQVRJT19fKSA9PSBBRENfT1ZFUlNBTVBMSU5HX1JBVElPXzE2KSB8fCAgXA0KLSAgICgoX19SQVRJT19fKSA9PSBBRENfT1ZFUlNBTVBMSU5HX1JBVElPXzMyKSB8fCAgXA0KLSAgICgoX19SQVRJT19fKSA9PSBBRENfT1ZFUlNBTVBMSU5HX1JBVElPXzY0KSB8fCAgXA0KLSAgICgoX19SQVRJT19fKSA9PSBBRENfT1ZFUlNBTVBMSU5HX1JBVElPXzEyOCkgfHwgXA0KLSAgICgoX19SQVRJT19fKSA9PSBBRENfT1ZFUlNBTVBMSU5HX1JBVElPXzI1NikpDQotDQotLyoqDQotICogQGJyaWVmIFZlcmlmeSB0aGUgQURDIG92ZXJzYW1wbGluZyBzaGlmdC4NCi0gKiBAcGFyYW0gX19TSElGVF9fIHByb2dyYW1tZWQgQURDIG92ZXJzYW1wbGluZyBzaGlmdC4NCi0gKiBAcmV0dmFsIFNFVCAoX19TSElGVF9fIGlzIGEgdmFsaWQgdmFsdWUpIG9yIFJFU0VUIChfX1NISUZUX18gaXMgaW52YWxpZCkNCi0gKi8NCi0jZGVmaW5lIElTX0FEQ19SSUdIVF9CSVRfU0hJRlQoX19TSElGVF9fKSAgICAgXA0KLSAgKCgoX19TSElGVF9fKSA9PSBBRENfUklHSFRCSVRTSElGVF9OT05FKSB8fCBcDQotICAgKChfX1NISUZUX18pID09IEFEQ19SSUdIVEJJVFNISUZUXzEpIHx8ICAgIFwNCi0gICAoKF9fU0hJRlRfXykgPT0gQURDX1JJR0hUQklUU0hJRlRfMikgfHwgICAgXA0KLSAgICgoX19TSElGVF9fKSA9PSBBRENfUklHSFRCSVRTSElGVF8zKSB8fCAgICBcDQotICAgKChfX1NISUZUX18pID09IEFEQ19SSUdIVEJJVFNISUZUXzQpIHx8ICAgIFwNCi0gICAoKF9fU0hJRlRfXykgPT0gQURDX1JJR0hUQklUU0hJRlRfNSkgfHwgICAgXA0KLSAgICgoX19TSElGVF9fKSA9PSBBRENfUklHSFRCSVRTSElGVF82KSB8fCAgICBcDQotICAgKChfX1NISUZUX18pID09IEFEQ19SSUdIVEJJVFNISUZUXzcpIHx8ICAgIFwNCi0gICAoKF9fU0hJRlRfXykgPT0gQURDX1JJR0hUQklUU0hJRlRfOCkpDQotDQotLyoqDQotICogQGJyaWVmIFZlcmlmeSB0aGUgQURDIG92ZXJzYW1wbGluZyB0cmlnZ2VyZWQgbW9kZS4NCi0gKiBAcGFyYW0gX19NT0RFX18gcHJvZ3JhbW1lZCBBREMgb3ZlcnNhbXBsaW5nIHRyaWdnZXJlZCBtb2RlLg0KLSAqIEByZXR2YWwgU0VUIChfX01PREVfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fTU9ERV9fIGlzIGludmFsaWQpDQotICovDQotI2RlZmluZSBJU19BRENfVFJJR0dFUkVEX09WRVJTQU1QTElOR19NT0RFKF9fTU9ERV9fKSAgIFwNCi0gICgoKF9fTU9ERV9fKSA9PSBBRENfVFJJR0dFUkVETU9ERV9TSU5HTEVfVFJJR0dFUikgfHwgXA0KLSAgICgoX19NT0RFX18pID09IEFEQ19UUklHR0VSRURNT0RFX01VTFRJX1RSSUdHRVIpKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBWZXJpZnkgdGhlIEFEQyBvdmVyc2FtcGxpbmcgcmVndWxhciBjb252ZXJzaW9uIHJlc3VtZWQgb3IgY29udGludWVkDQotICogbW9kZS4NCi0gKiBAcGFyYW0gX19NT0RFX18gcHJvZ3JhbW1lZCBBREMgb3ZlcnNhbXBsaW5nIHJlZ3VsYXIgY29udmVyc2lvbiByZXN1bWVkIG9yDQotICogY29udGludWVkIG1vZGUuDQotICogQHJldHZhbCBTRVQgKF9fTU9ERV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19NT0RFX18gaXMgaW52YWxpZCkNCi0gKi8NCi0jZGVmaW5lIElTX0FEQ19SRUdPVkVSU0FNUExJTkdfTU9ERShfX01PREVfXykgICAgICAgICAgICBcDQotICAoKChfX01PREVfXykgPT0gQURDX1JFR09WRVJTQU1QTElOR19DT05USU5VRURfTU9ERSkgfHwgXA0KLSAgICgoX19NT0RFX18pID09IEFEQ19SRUdPVkVSU0FNUExJTkdfUkVTVU1FRF9NT0RFKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgVmVyaWZ5IHRoZSBERlNETSBtb2RlIGNvbmZpZ3VyYXRpb24uDQotICogQHBhcmFtIF9fSEFORExFX18gQURDIGhhbmRsZS4NCi0gKiBAbm90ZSBXaGVuIERNU0RGTSBjb25maWd1cmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQsIHRoZSBtYWNybyBzeXN0ZW1hdGljYWxseQ0KLSAqIHJlcG9ydHMgU0VULiBGb3IgdGhpcyByZWFzb24sIHRoZSBpbnB1dCBwYXJhbWV0ZXIgaXMgdGhlIEFEQyBoYW5kbGUgYW5kIG5vdA0KLSAqIHRoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlciBkaXJlY3RseS4NCi0gKiBAcmV0dmFsIFNFVCAoREZTRE0gbW9kZSBjb25maWd1cmF0aW9uIGlzIHZhbGlkKSBvciBSRVNFVCAoREZTRE0gbW9kZQ0KLSAqIGNvbmZpZ3VyYXRpb24gaXMgaW52YWxpZCkNCi0gKi8NCi0jZGVmaW5lIElTX0FEQ19ERlNETUNGR19NT0RFKF9fSEFORExFX18pIChTRVQpDQotDQotLyoqDQotICogQGJyaWVmIFJldHVybiB0aGUgREZTRE0gY29uZmlndXJhdGlvbiBtb2RlLg0KLSAqIEBwYXJhbSBfX0hBTkRMRV9fIEFEQyBoYW5kbGUuDQotICogQG5vdGUgV2hlbiBETVNERk0gY29uZmlndXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkLCB0aGUgbWFjcm8gc3lzdGVtYXRpY2FsbHkNCi0gKiByZXBvcnRzIDB4MCAoaS5lIGRpc2FibGVkKS4gRm9yIHRoaXMgcmVhc29uLCB0aGUgaW5wdXQgcGFyYW1ldGVyIGlzIHRoZSBBREMNCi0gKiBoYW5kbGUgYW5kIG5vdCB0aGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgZGlyZWN0bHkuDQotICogQHJldHZhbCBERlNETSBjb25maWd1cmF0aW9uIG1vZGUNCi0gKi8NCi0jZGVmaW5lIEFEQ19DRkdSX0RGU0RNKF9fSEFORExFX18pICgweDBVTCkNCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBhZGR0b2dyb3VwIEFEQ0V4X0V4cG9ydGVkX0Z1bmN0aW9ucw0KLSAqIEB7DQotICovDQotDQotLyoqIEBhZGR0b2dyb3VwIEFEQ0V4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDENCi0gKiBAew0KLSAqLw0KLS8qIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotLyogQURDIGNhbGlicmF0aW9uICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ0V4X0NhbGlicmF0aW9uX1N0YXJ0KEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBTaW5nbGVEaWZmKTsNCi11aW50MzJfdCBIQUxfQURDRXhfQ2FsaWJyYXRpb25fR2V0VmFsdWUoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFNpbmdsZURpZmYpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENFeF9DYWxpYnJhdGlvbl9TZXRWYWx1ZShBRENfSGFuZGxlVHlwZURlZiAqaGFkYywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgU2luZ2xlRGlmZiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2FsaWJyYXRpb25GYWN0b3IpOw0KLQ0KLS8qIEJsb2NraW5nIG1vZGU6IFBvbGxpbmcgKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDRXhfSW5qZWN0ZWRTdGFydChBRENfSGFuZGxlVHlwZURlZiAqaGFkYyk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ0V4X0luamVjdGVkU3RvcChBRENfSGFuZGxlVHlwZURlZiAqaGFkYyk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ0V4X0luamVjdGVkUG9sbEZvckNvbnZlcnNpb24oQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZW91dCk7DQotDQotLyogTm9uLWJsb2NraW5nIG1vZGU6IEludGVycnVwdGlvbiAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENFeF9JbmplY3RlZFN0YXJ0X0lUKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDRXhfSW5qZWN0ZWRTdG9wX0lUKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKTsNCi0NCi0jaWYgZGVmaW5lZChBRENfTVVMVElNT0RFX1NVUFBPUlQpDQotLyogQURDIG11bHRpbW9kZSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENFeF9NdWx0aU1vZGVTdGFydF9ETUEoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcERhdGEsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBMZW5ndGgpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENFeF9NdWx0aU1vZGVTdG9wX0RNQShBRENfSGFuZGxlVHlwZURlZiAqaGFkYyk7DQotdWludDMyX3QgSEFMX0FEQ0V4X011bHRpTW9kZUdldFZhbHVlKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKTsNCi0jZW5kaWYgLyogQURDX01VTFRJTU9ERV9TVVBQT1JUICovDQotDQotLyogQURDIHJldHJpZXZlIGNvbnZlcnNpb24gdmFsdWUgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoIHBvbGxpbmcgb3INCi0gKiBpbnRlcnJ1cHRpb24gKi8NCi11aW50MzJfdCBIQUxfQURDRXhfSW5qZWN0ZWRHZXRWYWx1ZShBRENfSGFuZGxlVHlwZURlZiAqaGFkYywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBJbmplY3RlZFJhbmspOw0KLQ0KLS8qIEFEQyBJUlFIYW5kbGVyIGFuZCBDYWxsYmFja3MgdXNlZCBpbiBub24tYmxvY2tpbmcgbW9kZXMgKEludGVycnVwdGlvbikgKi8NCi12b2lkIEhBTF9BRENFeF9JbmplY3RlZENvbnZDcGx0Q2FsbGJhY2soQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpOw0KLXZvaWQgSEFMX0FEQ0V4X0luamVjdGVkUXVldWVPdmVyZmxvd0NhbGxiYWNrKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKTsNCi12b2lkIEhBTF9BRENFeF9MZXZlbE91dE9mV2luZG93MkNhbGxiYWNrKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKTsNCi12b2lkIEhBTF9BRENFeF9MZXZlbE91dE9mV2luZG93M0NhbGxiYWNrKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKTsNCi12b2lkIEhBTF9BRENFeF9FbmRPZlNhbXBsaW5nQ2FsbGJhY2soQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpOw0KLQ0KLS8qIEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb25zIHN0b3AgKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDRXhfUmVndWxhclN0b3AoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENFeF9SZWd1bGFyU3RvcF9JVChBRENfSGFuZGxlVHlwZURlZiAqaGFkYyk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ0V4X1JlZ3VsYXJTdG9wX0RNQShBRENfSGFuZGxlVHlwZURlZiAqaGFkYyk7DQotI2lmIGRlZmluZWQoQURDX01VTFRJTU9ERV9TVVBQT1JUKQ0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENFeF9SZWd1bGFyTXVsdGlNb2RlU3RvcF9ETUEoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpOw0KLSNlbmRpZiAvKiBBRENfTVVMVElNT0RFX1NVUFBPUlQgKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAYWRkdG9ncm91cCBBRENFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyDQotICogQHsNCi0gKi8NCi0vKiBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENFeF9JbmplY3RlZENvbmZpZ0NoYW5uZWwoDQotICAgIEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjLCBBRENfSW5qZWN0aW9uQ29uZlR5cGVEZWYgKnNDb25maWdJbmplY3RlZCk7DQotI2lmIGRlZmluZWQoQURDX01VTFRJTU9ERV9TVVBQT1JUKQ0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENFeF9NdWx0aU1vZGVDb25maWdDaGFubmVsKA0KLSAgICBBRENfSGFuZGxlVHlwZURlZiAqaGFkYywgQURDX011bHRpTW9kZVR5cGVEZWYgKm11bHRpbW9kZSk7DQotI2VuZGlmIC8qIEFEQ19NVUxUSU1PREVfU1VQUE9SVCAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENFeF9FbmFibGVJbmplY3RlZFF1ZXVlKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDRXhfRGlzYWJsZUluamVjdGVkUXVldWUoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENFeF9EaXNhYmxlVm9sdGFnZVJlZ3VsYXRvcihBRENfSGFuZGxlVHlwZURlZiAqaGFkYyk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ0V4X0VudGVyQURDRGVlcFBvd2VyRG93bk1vZGUoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpOw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotI2lmZGVmIF9fY3BsdXNwbHVzDQotfQ0KLSNlbmRpZg0KLQ0KLSNlbmRpZiAvKiBTVE0zMkc0eHhfSEFMX0FEQ19FWF9IICovDQorLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAZmlsZSAgICBzdG0zMmc0eHhfaGFsX2FkY19leC5oCisgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgQURDIEhBTCBleHRlbmRlZCBtb2R1bGUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYXR0ZW50aW9uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0ZXJtcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlCisgKiBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb2Z0d2FyZSBjb21wb25lbnQuCisgKiBJZiBubyBMSUNFTlNFIGZpbGUgY29tZXMgd2l0aCB0aGlzIHNvZnR3YXJlLCBpdCBpcyBwcm92aWRlZCBBUy1JUy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJHNHh4X0hBTF9BRENfRVhfSAorI2RlZmluZSBTVE0zMkc0eHhfSEFMX0FEQ19FWF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmc0eHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHNHh4X0hBTF9Ecml2ZXIKKyAqIEB7CisgKi8KKworLyoqIEBhZGR0b2dyb3VwIEFEQ0V4CisgKiBAeworICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEFEQ0V4X0V4cG9ydGVkX1R5cGVzIEFEQyBFeHRlbmRlZCBFeHBvcnRlZCBUeXBlcworICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiAgQURDIEluamVjdGVkIENvbnZlcnNpb24gT3ZlcnNhbXBsaW5nIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDMyX3QKKyAgICAgIFJhdGlvOyAvKiE8IENvbmZpZ3VyZXMgdGhlIG92ZXJzYW1wbGluZyByYXRpby4KKyAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX0hBTF9FQ19PVlNfUkFUSU8gKi8KKworICB1aW50MzJfdCBSaWdodEJpdFNoaWZ0OyAvKiE8IENvbmZpZ3VyZXMgdGhlIGRpdmlzaW9uIGNvZWZmaWNpZW50IGZvciB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcnNhbXBsZXIuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0hBTF9FQ19PVlNfU0hJRlQgKi8KK30gQURDX0luak92ZXJzYW1wbGluZ1R5cGVEZWY7CisKKy8qKgorICogQGJyaWVmICBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBvZiBBREMgZ3JvdXAgaW5qZWN0ZWQgYW5kIEFEQyBjaGFubmVsIGFmZmVjdGVkCisgKiB0byBBREMgZ3JvdXAgaW5qZWN0ZWQKKyAqIEBub3RlICAgUGFyYW1ldGVycyBvZiB0aGlzIHN0cnVjdHVyZSBhcmUgc2hhcmVkIHdpdGhpbiAyIHNjb3BlczoKKyAqICAgICAgICAgIC0gU2NvcGUgY2hhbm5lbDogSW5qZWN0ZWRDaGFubmVsLCBJbmplY3RlZFJhbmssIEluamVjdGVkU2FtcGxpbmdUaW1lCisgKiAsIEluamVjdGVkU2luZ2xlRGlmZiwgSW5qZWN0ZWRPZmZzZXROdW1iZXIsIEluamVjdGVkT2Zmc2V0LAorICogSW5qZWN0ZWRPZmZzZXRTaWduLCBJbmplY3RlZE9mZnNldFNhdHVyYXRpb24KKyAqICAgICAgICAgIC0gU2NvcGUgQURDIGdyb3VwIGluamVjdGVkIChhZmZlY3RzIGFsbCBjaGFubmVscyBvZiBpbmplY3RlZCBncm91cCk6CisgKiBJbmplY3RlZE5ick9mQ29udmVyc2lvbiwgSW5qZWN0ZWREaXNjb250aW51b3VzQ29udk1vZGUsIEF1dG9JbmplY3RlZENvbnYsCisgKiBRdWV1ZUluamVjdGVkQ29udGV4dCwgRXh0ZXJuYWxUcmlnSW5qZWNDb252LCBFeHRlcm5hbFRyaWdJbmplY0NvbnZFZGdlLAorICogICAgICAgICAgICBJbmplY092ZXJzYW1wbGluZ01vZGUsIEluamVjT3ZlcnNhbXBsaW5nLgorICogQG5vdGUgICBUaGUgc2V0dGluZyBvZiB0aGVzZSBwYXJhbWV0ZXJzIGJ5IGZ1bmN0aW9uCisgKiBIQUxfQURDRXhfSW5qZWN0ZWRDb25maWdDaGFubmVsKCkgaXMgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlLiBBREMgc3RhdGUgY2FuCisgKiBiZSBlaXRoZXI6CisgKiAgICAgICAgICAtIEZvciBhbGwgcGFyYW1ldGVyczogQURDIGRpc2FibGVkICh0aGlzIGlzIHRoZSBvbmx5IHBvc3NpYmxlIEFEQworICogc3RhdGUgdG8gbW9kaWZ5IHBhcmFtZXRlciAnSW5qZWN0ZWRTaW5nbGVEaWZmJykKKyAqICAgICAgICAgIC0gRm9yIHBhcmFtZXRlcnMgJ0luamVjdGVkRGlzY29udGludW91c0NvbnZNb2RlJywKKyAqICdRdWV1ZUluamVjdGVkQ29udGV4dCcsICdJbmplY092ZXJzYW1wbGluZyc6IEFEQyBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbgorICogb24gZ29pbmcgb24gaW5qZWN0ZWQgZ3JvdXAuCisgKiAgICAgICAgICAtIEZvciBwYXJhbWV0ZXJzICdJbmplY3RlZFNhbXBsaW5nVGltZScsICdJbmplY3RlZE9mZnNldCcsCisgKiAnSW5qZWN0ZWRPZmZzZXROdW1iZXInLCAnSW5qZWN0ZWRPZmZzZXRTaWduJywgJ0luamVjdGVkT2Zmc2V0U2F0dXJhdGlvbicsCisgKiAnQXV0b0luamVjdGVkQ29udic6IEFEQyBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZyBvbiByZWd1bGFyIGFuZAorICogICAgICAgICAgICBpbmplY3RlZCBncm91cHMuCisgKiAgICAgICAgICAtIEZvciBwYXJhbWV0ZXJzICdJbmplY3RlZENoYW5uZWwnLCAnSW5qZWN0ZWRSYW5rJywKKyAqICdJbmplY3RlZE5ick9mQ29udmVyc2lvbicsICdFeHRlcm5hbFRyaWdJbmplY0NvbnYnLAorICogICAgICAgICAgICAnRXh0ZXJuYWxUcmlnSW5qZWNDb252RWRnZSc6IEFEQyBlbmFibGVkIGFuZCB3aGlsZSBjb252ZXJzaW9uIG9uCisgKiBnb2luZyBvbiBBREMgZ3JvdXBzIHJlZ3VsYXIgYW5kIGluamVjdGVkLiBJZiBBREMgaXMgbm90IGluIHRoZSBhcHByb3ByaWF0ZQorICogc3RhdGUgdG8gbW9kaWZ5IHNvbWUgcGFyYW1ldGVycywgdGhlc2UgcGFyYW1ldGVycyBzZXR0aW5nIGlzIGJ5cGFzc2VkIHdpdGhvdXQKKyAqIGVycm9yIHJlcG9ydGluZyAoYXMgaXQgY2FuIGJlIHRoZSBleHBlY3RlZCBiZWhhdmlvciBpbiBjYXNlIG9mIGludGVuZGVkCisgKiBhY3Rpb24gdG8gdXBkYXRlIGFub3RoZXIgcGFyYW1ldGVyICh3aGljaCBmdWxmaWxscyB0aGUgQURDIHN0YXRlIGNvbmRpdGlvbikKKyAqIG9uIHRoZSBmbHkpLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQzMl90IEluamVjdGVkQ2hhbm5lbDsgLyohPCBTcGVjaWZpZXMgdGhlIGNoYW5uZWwgdG8gY29uZmlndXJlIGludG8gQURDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgaW5qZWN0ZWQuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBBRENfSEFMX0VDX0NIQU5ORUwgTm90ZTogRGVwZW5kaW5nIG9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlcyBhbmQgQURDIGluc3RhbmNlcywgc29tZSBjaGFubmVscyBtYXkgbm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgYXZhaWxhYmxlIG9uIGRldmljZSBwYWNrYWdlIHBpbnMuIFJlZmVyIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlIGRhdGFzaGVldCBmb3IgY2hhbm5lbHMgYXZhaWxhYmlsaXR5LiAqLworCisgIHVpbnQzMl90CisgICAgICBJbmplY3RlZFJhbms7IC8qITwgU3BlY2lmaWVzIHRoZSByYW5rIGluIHRoZSBBREMgZ3JvdXAgaW5qZWN0ZWQgc2VxdWVuY2VyLgorICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgIEFEQ19JTkpfU0VRX1JBTktTLiBOb3RlOiB0byBkaXNhYmxlIGEgY2hhbm5lbCBvciBjaGFuZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgb3JkZXIgb2YgY29udmVyc2lvbiBzZXF1ZW5jZXIsIHJhbmsgY29udGFpbmluZyBhIHByZXZpb3VzCisgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgc2V0dGluZyBjYW4gYmUgb3ZlcndyaXR0ZW4gYnkgdGhlIG5ldyBjaGFubmVsCisgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmcgKG9yIHBhcmFtZXRlciBudW1iZXIgb2YgY29udmVyc2lvbnMgYWRqdXN0ZWQpICovCisKKyAgdWludDMyX3QgSW5qZWN0ZWRTYW1wbGluZ1RpbWU7IC8qITwgU2FtcGxpbmcgdGltZSB2YWx1ZSB0byBiZSBzZXQgZm9yIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQgY2hhbm5lbC4gVW5pdDogQURDIGNsb2NrIGN5Y2xlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVyc2lvbiB0aW1lIGlzIHRoZSBhZGRpdGlvbiBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmcgdGltZSBhbmQgcHJvY2Vzc2luZyB0aW1lICgxMi41IEFEQworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvY2sgY3ljbGVzIGF0IEFEQyByZXNvbHV0aW9uIDEyIGJpdHMsIDEwLjUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN5Y2xlcyBhdCAxMCBiaXRzLCA4LjUgY3ljbGVzIGF0IDggYml0cywgNi41CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeWNsZXMgYXQgNiBiaXRzKS4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19IQUxfRUNfQ0hBTk5FTF9TQU1QTElOR1RJTUUuIENhdXRpb246CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBhcHBsaWVzIHRvIGEgY2hhbm5lbCB0aGF0IGNhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgdXNlZCBpbiBhIHJlZ3VsYXIgYW5kL29yIGluamVjdGVkIGdyb3VwLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXQgb3ZlcndyaXRlcyB0aGUgbGFzdCBzZXR0aW5nLiBOb3RlOiBJbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBvZiB1c2FnZSBvZiBpbnRlcm5hbCBtZWFzdXJlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMgKFZyZWZJbnQsIC4uLiksIHNhbXBsaW5nIHRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRzIG11c3QgYmUgcmVzcGVjdGVkIChzYW1wbGluZyB0aW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW4gYmUgYWRqdXN0ZWQgaW4gZnVuY3Rpb24gb2YgQURDIGNsb2NrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVxdWVuY3kgYW5kIHNhbXBsaW5nIHRpbWUgc2V0dGluZykuIFJlZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciB0aW1pbmdzIHZhbHVlcy4gKi8KKworICB1aW50MzJfdAorICAgICAgSW5qZWN0ZWRTaW5nbGVEaWZmOyAvKiE8IFNlbGVjdGlvbiBvZiBzaW5nbGUtZW5kZWQgb3IgZGlmZmVyZW50aWFsIGlucHV0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluIGRpZmZlcmVudGlhbCBtb2RlOiBEaWZmZXJlbnRpYWwgbWVhc3VyZW1lbnQgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmV0d2VlbiB0aGUgc2VsZWN0ZWQgY2hhbm5lbCAnaScgKHBvc2l0aXZlIGlucHV0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgY2hhbm5lbCAnaSsxJyAobmVnYXRpdmUgaW5wdXQpLiBPbmx5IGNoYW5uZWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2knIGhhcyB0byBiZSBjb25maWd1cmVkLCBjaGFubmVsICdpKzEnIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZWQgYXV0b21hdGljYWxseS4gVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBBRENfSEFMX0VDX0NIQU5ORUxfU0lOR0xFX0RJRkZfRU5ESU5HLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhdXRpb246IFRoaXMgcGFyYW1ldGVyIGFwcGxpZXMgdG8gYSBjaGFubmVsIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuIGJlIHVzZWQgaW4gYSByZWd1bGFyIGFuZC9vciBpbmplY3RlZCBncm91cC4gSXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcndyaXRlcyB0aGUgbGFzdCBzZXR0aW5nLiBOb3RlOiBSZWZlciB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZlcmVuY2UgTWFudWFsIHRvIGVuc3VyZSB0aGUgc2VsZWN0ZWQgY2hhbm5lbCBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSBpbiBkaWZmZXJlbnRpYWwgbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBXaGVuIGNvbmZpZ3VyaW5nIGEgY2hhbm5lbCAnaScgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW50aWFsIG1vZGUsIHRoZSBjaGFubmVsICdpKzEnIGlzIG5vdCB1c2FibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VwYXJhdGVseS4gTm90ZTogVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBtb2RpZmllZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIEFEQyBpcyBkaXNhYmxlZCAoYmVmb3JlIEFEQyBzdGFydCBjb252ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGFmdGVyIEFEQyBzdG9wIGNvbnZlcnNpb24pLiBJZiBBREMgaXMgZW5hYmxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBwYXJhbWV0ZXIgc2V0dGluZyBpcyBieXBhc3NlZCB3aXRob3V0IGVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0aW5nIChhcyBpdCBjYW4gYmUgdGhlIGV4cGVjdGVkIGJlaGF2aW9yIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugb2YgYW5vdGhlciBwYXJhbWV0ZXIgdXBkYXRlIG9uIHRoZSBmbHkpICovCisKKyAgdWludDMyX3QgSW5qZWN0ZWRPZmZzZXROdW1iZXI7IC8qITwgU2VsZWN0cyB0aGUgb2Zmc2V0IG51bWJlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0hBTF9FQ19PRkZTRVRfTkIuIENhdXRpb246IE9ubHkgb25lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgaXMgYWxsb3dlZCBwZXIgY2hhbm5lbC4gVGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIG92ZXJ3cml0ZXMgdGhlIGxhc3Qgc2V0dGluZy4gKi8KKworICB1aW50MzJfdCBJbmplY3RlZE9mZnNldDsgLyohPCBEZWZpbmVzIHRoZSBvZmZzZXQgdG8gYmUgYXBwbGllZCBvbiB0aGUgcmF3CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgZGF0YS4gT2Zmc2V0IHZhbHVlIG11c3QgYmUgYSBwb3NpdGl2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyLiBEZXBlbmRpbmcgb2YgQURDIHJlc29sdXRpb24gc2VsZWN0ZWQgKDEyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAsIDggb3IgNiBiaXRzKSwgdGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MDAwIGFuZCBNYXhfRGF0YSA9IDB4RkZGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNGRiwgMHhGRiBvciAweDNGIHJlc3BlY3RpdmVseS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBtb2RpZmllZCB3aGVuIG5vCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9uIGlzIG9uIGdvaW5nIG9uIGJvdGggcmVndWxhciBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdGVkIGdyb3VwcyAoQURDIGRpc2FibGVkLCBvciBBREMgZW5hYmxlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRob3V0IGNvbnRpbnVvdXMgbW9kZSBvciBleHRlcm5hbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlciB0aGF0IGNvdWxkIGxhdW5jaCBhIGNvbnZlcnNpb24pLiAqLworCisgIHVpbnQzMl90IEluamVjdGVkT2Zmc2V0U2lnbjsgLyohPCBEZWZpbmUgaWYgdGhlIG9mZnNldCBzaG91bGQgYmUgc3VidHJhY3RlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZWdhdGl2ZSBzaWduKSBvciBhZGRlZCAocG9zaXRpdmUgc2lnbikgZnJvbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIHRvIHRoZSByYXcgY29udmVydGVkIGRhdGEuIFRoaXMgcGFyYW1ldGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBBRENFeF9PZmZzZXRTaWduLiBOb3RlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgbW9kaWZpZWQgd2hlbiBubworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb24gaXMgb24gZ29pbmcgb24gYm90aCByZWd1bGFyIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdGVkIGdyb3VwcyAoQURDIGRpc2FibGVkLCBvciBBREMgZW5hYmxlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhvdXQgY29udGludW91cyBtb2RlIG9yIGV4dGVybmFsIHRyaWdnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IGNvdWxkIGxhdW5jaCBhIGNvbnZlcnNpb24pLiAqLworICBGdW5jdGlvbmFsU3RhdGUKKyAgICAgIEluamVjdGVkT2Zmc2V0U2F0dXJhdGlvbjsgLyohPCBEZWZpbmUgaWYgdGhlIG9mZnNldCBzaG91bGQgYmUgc2F0dXJhdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cG9uIHVuZGVyIG9yIG92ZXIgZmxvdy4gVGhpcyBwYXJhbWV0ZXIgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbiBiZSBFTkFCTEUgb3IgRElTQUJMRS4gTm90ZTogVGhpcyBwYXJhbWV0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgbW9kaWZpZWQgd2hlbiBubyBjb252ZXJzaW9uIGlzIG9uIGdvaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiBib3RoIHJlZ3VsYXIgYW5kIGluamVjdGVkIGdyb3VwcyAoQURDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZCwgb3IgQURDIGVuYWJsZWQgd2l0aG91dCBjb250aW51b3VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlIG9yIGV4dGVybmFsIHRyaWdnZXIgdGhhdCBjb3VsZCBsYXVuY2ggYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbikuICovCisKKyAgdWludDMyX3QgSW5qZWN0ZWROYnJPZkNvbnZlcnNpb247IC8qITwgU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgcmFua3MgdGhhdCB3aWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBjb252ZXJ0ZWQgd2l0aGluIHRoZSBBREMgZ3JvdXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdGVkIHNlcXVlbmNlci4gVG8gdXNlIHRoZSBpbmplY3RlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgc2VxdWVuY2VyIGFuZCBjb252ZXJ0IHNldmVyYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmtzLCBwYXJhbWV0ZXIgJ1NjYW5Db252TW9kZScgbXVzdCBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZC4gVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmV0d2VlbiBNaW5fRGF0YSA9IDEgYW5kIE1heF9EYXRhID0gNC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhdXRpb246IHRoaXMgc2V0dGluZyBpbXBhY3RzIHRoZSBlbnRpcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdGVkIGdyb3VwLiBUaGVyZWZvcmUsIGNhbGwgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENFeF9JbmplY3RlZENvbmZpZ0NoYW5uZWwoKSB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJlIGEgY2hhbm5lbCBvbiBpbmplY3RlZCBncm91cCBjYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGFjdCB0aGUgY29uZmlndXJhdGlvbiBvZiBvdGhlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMgcHJldmlvdXNseSBzZXQuICovCisKKyAgRnVuY3Rpb25hbFN0YXRlCisgICAgICBJbmplY3RlZERpc2NvbnRpbnVvdXNDb252TW9kZTsgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgY29udmVyc2lvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2Ugb2YgQURDIGdyb3VwIGluamVjdGVkIGlzIHBlcmZvcm1lZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBDb21wbGV0ZS1zZXF1ZW5jZS9EaXNjb250aW51b3VzLXNlcXVlbmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYWluIHNlcXVlbmNlIHN1YmRpdmlkZWQgaW4gc3VjY2Vzc2l2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0cykuIERpc2NvbnRpbnVvdXMgbW9kZSBpcyB1c2VkIG9ubHkgaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VyIGlzIGVuYWJsZWQgKHBhcmFtZXRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU2NhbkNvbnZNb2RlJykuIElmIHNlcXVlbmNlciBpcyBkaXNhYmxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBwYXJhbWV0ZXIgaXMgZGlzY2FyZGVkLiBEaXNjb250aW51b3VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgY2FuIGJlIGVuYWJsZWQgb25seSBpZiBjb250aW51b3VzIG1vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgZGlzYWJsZWQuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBzZXQgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5BQkxFIG9yIERJU0FCTEUuIE5vdGU6IFRoaXMgcGFyYW1ldGVyIG11c3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgbW9kaWZpZWQgd2hlbiBBREMgaXMgZGlzYWJsZWQgKGJlZm9yZSBBREMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgY29udmVyc2lvbiBvciBhZnRlciBBREMgc3RvcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9uKS4gTm90ZTogRm9yIGluamVjdGVkIGdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNjb250aW51b3VzIG1vZGUgY29udmVydHMgdGhlIHNlcXVlbmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgYnkgY2hhbm5lbCAoZGlzY29udGludW91cyBsZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWQgdG8gMSByYW5rKS4gQ2F1dGlvbjogdGhpcyBzZXR0aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGFjdHMgdGhlIGVudGlyZSBpbmplY3RlZCBncm91cC4gVGhlcmVmb3JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENFeF9JbmplY3RlZENvbmZpZ0NoYW5uZWwoKSB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmUgYSBjaGFubmVsIG9uIGluamVjdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwIGNhbiBpbXBhY3QgdGhlIGNvbmZpZ3VyYXRpb24gb2Ygb3RoZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMgcHJldmlvdXNseSBzZXQuICovCisKKyAgRnVuY3Rpb25hbFN0YXRlCisgICAgICBBdXRvSW5qZWN0ZWRDb252OyAvKiE8IEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHNlbGVjdGVkIEFEQyBncm91cCBpbmplY3RlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b21hdGljIGNvbnZlcnNpb24gYWZ0ZXIgcmVndWxhciBvbmUgVGhpcyBwYXJhbWV0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbiBiZSBzZXQgdG8gRU5BQkxFIG9yIERJU0FCTEUuIE5vdGU6IFRvIHVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV0b21hdGljIGluamVjdGVkIGNvbnZlcnNpb24sIGRpc2NvbnRpbnVvdXMgbW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVzdCBiZSBkaXNhYmxlZCAoJ0Rpc2NvbnRpbnVvdXNDb252TW9kZScgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdJbmplY3RlZERpc2NvbnRpbnVvdXNDb252TW9kZScgc2V0IHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICBESVNBQkxFKSBOb3RlOiBUbyB1c2UgQXV0b21hdGljIGluamVjdGVkIGNvbnZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmplY3RlZCBncm91cCBleHRlcm5hbCB0cmlnZ2VycyBtdXN0IGJlIGRpc2FibGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ0V4dGVybmFsVHJpZ0luamVjQ29udicgc2V0IHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19JTkpFQ1RFRF9TT0ZUV0FSRV9TVEFSVCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogSW4gY2FzZSBvZiBETUEgdXNlZCB3aXRoIHJlZ3VsYXIgZ3JvdXA6IGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETUEgY29uZmlndXJlZCBpbiBub3JtYWwgbW9kZSAoc2luZ2xlIHNob3QpIEpBVVRPCisgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHN0b3BwZWQgdXBvbiBETUEgdHJhbnNmZXIgY29tcGxldGUuIFRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWludGFpbiBKQVVUTyBhbHdheXMgZW5hYmxlZCwgRE1BIG11c3QgYmUgY29uZmlndXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gY2lyY3VsYXIgbW9kZS4gQ2F1dGlvbjogdGhpcyBzZXR0aW5nIGltcGFjdHMgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRpcmUgaW5qZWN0ZWQgZ3JvdXAuIFRoZXJlZm9yZSwgY2FsbCBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ0V4X0luamVjdGVkQ29uZmlnQ2hhbm5lbCgpIHRvIGNvbmZpZ3VyZSBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsIG9uIGluamVjdGVkIGdyb3VwIGNhbiBpbXBhY3QgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIG9mIG90aGVyIGNoYW5uZWxzIHByZXZpb3VzbHkgc2V0LiAqLworCisgIEZ1bmN0aW9uYWxTdGF0ZQorICAgICAgUXVldWVJbmplY3RlZENvbnRleHQ7IC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGNvbnRleHQgcXVldWUgZmVhdHVyZSBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBzZXQgdG8gRU5BQkxFIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElTQUJMRS4gSWYgY29udGV4dCBxdWV1ZSBpcyBlbmFibGVkLCBpbmplY3RlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlciZjaGFubmVscyBjb25maWd1cmF0aW9ucyBhcmUgcXVldWVkIG9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXAgdG8gMiBjb250ZXh0cy4gSWYgYSBuZXcgaW5qZWN0ZWQgY29udGV4dCBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCB3aGVuIHF1ZXVlIGlzIGZ1bGwsIGVycm9yIGlzIHRyaWdnZXJlZCBieQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0aW9uIGFuZCB0aHJvdWdoIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSEFMX0FEQ0V4X0luamVjdGVkUXVldWVPdmVyZmxvd0NhbGxiYWNrJy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhdXRpb246IFRoaXMgZmVhdHVyZSByZXF1ZXN0IHRoYXQgdGhlIHNlcXVlbmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgZnVsbHkgY29uZmlndXJlZCBiZWZvcmUgaW5qZWN0ZWQgY29udmVyc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LiBUaGVyZWZvcmUsIGNvbmZpZ3VyZSBjaGFubmVscyB3aXRoIGFzIG1hbnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxscyB0byBIQUxfQURDRXhfSW5qZWN0ZWRDb25maWdDaGFubmVsKCkgYXMgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSW5qZWN0ZWROYnJPZkNvbnZlcnNpb24nIHBhcmFtZXRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhdXRpb246IHRoaXMgc2V0dGluZyBpbXBhY3RzIHRoZSBlbnRpcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmplY3RlZCBncm91cC4gVGhlcmVmb3JlLCBjYWxsIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ0V4X0luamVjdGVkQ29uZmlnQ2hhbm5lbCgpIHRvIGNvbmZpZ3VyZSBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCBvbiBpbmplY3RlZCBncm91cCBjYW4gaW1wYWN0IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBvZiBvdGhlciBjaGFubmVscworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzbHkgc2V0LiBOb3RlOiBUaGlzIHBhcmFtZXRlciBtdXN0IGJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgd2hlbiBBREMgaXMgZGlzYWJsZWQgKGJlZm9yZSBBREMgc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9uIG9yIGFmdGVyIEFEQyBzdG9wIGNvbnZlcnNpb24pLiAqLworCisgIHVpbnQzMl90CisgICAgICBFeHRlcm5hbFRyaWdJbmplY0NvbnY7IC8qITwgU2VsZWN0cyB0aGUgZXh0ZXJuYWwgZXZlbnQgdXNlZCB0byB0cmlnZ2VyIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9uIHN0YXJ0IG9mIGluamVjdGVkIGdyb3VwLiBJZiBzZXQgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0lOSkVDVEVEX1NPRlRXQVJFX1NUQVJULCBleHRlcm5hbCB0cmlnZ2VycworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgZGlzYWJsZWQgYW5kIHNvZnR3YXJlIHRyaWdnZXIgaXMgdXNlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0ZWFkLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgQURDX2luamVjdGVkX2V4dGVybmFsX3RyaWdnZXJfc291cmNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhdXRpb246IHRoaXMgc2V0dGluZyBpbXBhY3RzIHRoZSBlbnRpcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5qZWN0ZWQgZ3JvdXAuIFRoZXJlZm9yZSwgY2FsbCBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDRXhfSW5qZWN0ZWRDb25maWdDaGFubmVsKCkgdG8gY29uZmlndXJlIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCBvbiBpbmplY3RlZCBncm91cCBjYW4gaW1wYWN0IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIG9mIG90aGVyIGNoYW5uZWxzIHByZXZpb3VzbHkgc2V0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICB1aW50MzJfdAorICAgICAgRXh0ZXJuYWxUcmlnSW5qZWNDb252RWRnZTsgLyohPCBTZWxlY3RzIHRoZSBleHRlcm5hbCB0cmlnZ2VyIGVkZ2Ugb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdGVkIGdyb3VwLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX2luamVjdGVkX2V4dGVybmFsX3RyaWdnZXJfZWRnZS4gSWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXIgc291cmNlIGlzIHNldCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0lOSkVDVEVEX1NPRlRXQVJFX1NUQVJULCB0aGlzIHBhcmFtZXRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBkaXNjYXJkZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhdXRpb246IHRoaXMgc2V0dGluZyBpbXBhY3RzIHRoZSBlbnRpcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdGVkIGdyb3VwLiBUaGVyZWZvcmUsIGNhbGwgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENFeF9JbmplY3RlZENvbmZpZ0NoYW5uZWwoKSB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmUgYSBjaGFubmVsIG9uIGluamVjdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cCBjYW4gaW1wYWN0IHRoZSBjb25maWd1cmF0aW9uIG9mIG90aGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVscyBwcmV2aW91c2x5IHNldC4gKi8KKworICBGdW5jdGlvbmFsU3RhdGUKKyAgICAgIEluamVjT3ZlcnNhbXBsaW5nTW9kZTsgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgb3ZlcnNhbXBsaW5nIGZlYXR1cmUgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZCBvciBkaXNhYmxlZC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBFTkFCTEUgb3IgRElTQUJMRS4gTm90ZTogVGhpcyBwYXJhbWV0ZXIgY2FuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIG1vZGlmaWVkIG9ubHkgaWYgdGhlcmUgaXMgbm8gY29udmVyc2lvbiBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmdvaW5nIChib3RoIEFEU1RBUlQgYW5kIEpBRFNUQVJUIGNsZWFyZWQpLiAqLworCisgIEFEQ19JbmpPdmVyc2FtcGxpbmdUeXBlRGVmCisgICAgICBJbmplY092ZXJzYW1wbGluZzsgLyohPCBTcGVjaWZpZXMgdGhlIE92ZXJzYW1wbGluZyBwYXJhbWV0ZXJzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2F1dGlvbjogdGhpcyBzZXR0aW5nIG92ZXJ3cml0ZXMgdGhlIHByZXZpb3VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcnNhbXBsaW5nIGNvbmZpZ3VyYXRpb24gaWYgb3ZlcnNhbXBsaW5nIGFscmVhZHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkLiBOb3RlOiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgbW9kaWZpZWQgb25seQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRoZXJlIGlzIG5vIGNvbnZlcnNpb24gaXMgb25nb2luZyAoYm90aCBBRFNUQVJUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIEpBRFNUQVJUIGNsZWFyZWQpLiovCit9IEFEQ19JbmplY3Rpb25Db25mVHlwZURlZjsKKworI2lmIGRlZmluZWQoQURDX01VTFRJTU9ERV9TVVBQT1JUKQorLyoqCisgKiBAYnJpZWYgIFN0cnVjdHVyZSBkZWZpbml0aW9uIG9mIEFEQyBtdWx0aW1vZGUKKyAqIEBub3RlICAgVGhlIHNldHRpbmcgb2YgdGhlc2UgcGFyYW1ldGVycyBieSBmdW5jdGlvbgorICogSEFMX0FEQ0V4X011bHRpTW9kZUNvbmZpZ0NoYW5uZWwoKSBpcyBjb25kaXRpb25lZCBieSBBRENzIHN0YXRlIChib3RoIE1hc3RlcgorICogYW5kIFNsYXZlIEFEQ3MpLiBCb3RoIE1hc3RlciBhbmQgU2xhdmUgQURDcyBtdXN0IGJlIGRpc2FibGVkLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQzMl90CisgICAgICBNb2RlOyAvKiE8IENvbmZpZ3VyZXMgdGhlIEFEQyB0byBvcGVyYXRlIGluIGluZGVwZW5kZW50IG9yIG11bHRpbW9kZS4KKyAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBBRENfSEFMX0VDX01VTFRJX01PREUuICovCisKKyAgdWludDMyX3QgRE1BQWNjZXNzTW9kZTsgLyohPCBDb25maWd1cmVzIHRoZSBETUEgbW9kZSBmb3IgbXVsdGltb2RlIEFEQzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb24gd2hldGhlciAyIERNQSBjaGFubmVscyAoZWFjaCBBREMgdXNlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdHMgb3duIERNQSBjaGFubmVsKSBvciAxIERNQSBjaGFubmVsIChvbmUgRE1BCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgZm9yIGJvdGggQURDLCBETUEgb2YgQURDIG1hc3RlcikuIFRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0hBTF9FQ19NVUxUSV9ETUFfVFJBTlNGRVJfUkVTT0xVVElPTi4gKi8KKworICB1aW50MzJfdCBUd29TYW1wbGluZ0RlbGF5OyAvKiE8IENvbmZpZ3VyZXMgdGhlIERlbGF5IGJldHdlZW4gMiBzYW1wbGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaGFzZXMuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0hBTF9FQ19NVUxUSV9UV09TTVBfREVMQVkuIERlbGF5IHJhbmdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZHMgb24gc2VsZWN0ZWQgcmVzb2x1dGlvbjogZnJvbSAxIHRvIDEyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb2NrIGN5Y2xlcyBmb3IgMTIgYml0cywgZnJvbSAxIHRvIDEwIGNsb2NrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN5Y2xlcyBmb3IgMTAgYml0cywgZnJvbSAxIHRvIDggY2xvY2sgY3ljbGVzIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4IGJpdHMsIGZyb20gMSB0byA2IGNsb2NrIGN5Y2xlcyBmb3IgNiBiaXRzLiAqLworfSBBRENfTXVsdGlNb2RlVHlwZURlZjsKKyNlbmRpZiAvKiBBRENfTVVMVElNT0RFX1NVUFBPUlQgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgQURDRXhfRXhwb3J0ZWRfQ29uc3RhbnRzIEFEQyBFeHRlbmRlZCBFeHBvcnRlZCBDb25zdGFudHMKKyAqIEB7CisgKi8KKworLyoqIEBkZWZncm91cCBBRENfaW5qZWN0ZWRfZXh0ZXJuYWxfdHJpZ2dlcl9zb3VyY2UgQURDIGdyb3VwIGluamVjdGVkIHRyaWdnZXIKKyAqIHNvdXJjZQorICogQHsKKyAqLworLyogQURDIGdyb3VwIHJlZ3VsYXIgdHJpZ2dlciBzb3VyY2VzIGZvciBhbGwgQURDIGluc3RhbmNlcyAqLworI2RlZmluZSBBRENfSU5KRUNURURfU09GVFdBUkVfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKExMX0FEQ19JTkpfVFJJR19TT0ZUV0FSRSkgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiBcCit0cmlnZ2VyIHNvZnR3YXJlIHN0YXJ0ICovCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UMV9UUkdPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTFfVFJHTykgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiBcCit0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMSBUUkdPLiAqLworI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDFfVFJHTzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKExMX0FEQ19JTkpfVFJJR19FWFRfVElNMV9UUkdPMikgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiBcCit0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMSBUUkdPMi4gKi8KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QxX0NDMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX0lOSl9UUklHX0VYVF9USU0xX0NIMykgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiBcCit0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMSBjaGFubmVsIDMgZXZlbnQgKGNhcHR1cmUgY29tcGFyZSkuICovCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UMV9DQzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKExMX0FEQ19JTkpfVFJJR19FWFRfVElNMV9DSDQpIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gXAordHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTEgY2hhbm5lbCA0IGV2ZW50IChjYXB0dXJlIGNvbXBhcmUpLiAqLworI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDJfVFJHTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX0lOSl9UUklHX0VYVF9USU0yX1RSR08pIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gXAordHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTIgVFJHTy4gKi8KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QyX0NDMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX0lOSl9UUklHX0VYVF9USU0yX0NIMSkgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiBcCit0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMiBjaGFubmVsIDEgZXZlbnQgKGNhcHR1cmUgY29tcGFyZSkuICovCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UM19UUkdPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTNfVFJHTykgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiBcCit0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMyBUUkdPLiAqLworI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDNfQ0MxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTNfQ0gxKSAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIFwKK3RyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU0zIGNoYW5uZWwgMSBldmVudCAoY2FwdHVyZSBjb21wYXJlKS4gKi8KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QzX0NDMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX0lOSl9UUklHX0VYVF9USU0zX0NIMykgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiBcCit0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMyBjaGFubmVsIDMgZXZlbnQgKGNhcHR1cmUgY29tcGFyZSkuICovCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UM19DQzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKExMX0FEQ19JTkpfVFJJR19FWFRfVElNM19DSDQpIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gXAordHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTMgY2hhbm5lbCA0IGV2ZW50IChjYXB0dXJlIGNvbXBhcmUpLiAqLworI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDRfVFJHTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX0lOSl9UUklHX0VYVF9USU00X1RSR08pIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gXAordHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTQgVFJHTy4gKi8KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDX1Q0X0NDMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX0lOSl9UUklHX0VYVF9USU00X0NIMykgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiBcCit0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNNCBjaGFubmVsIDMgZXZlbnQgKGNhcHR1cmUgY29tcGFyZSkuICovCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UNF9DQzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKExMX0FEQ19JTkpfVFJJR19FWFRfVElNNF9DSDQpIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gXAordHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTQgY2hhbm5lbCA0IGV2ZW50IChjYXB0dXJlIGNvbXBhcmUpLiAqLworI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDZfVFJHTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX0lOSl9UUklHX0VYVF9USU02X1RSR08pIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gXAordHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTYgVFJHTy4gKi8KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDX1Q3X1RSR08gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKExMX0FEQ19JTkpfVFJJR19FWFRfVElNN19UUkdPKSAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIFwKK3RyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU03IFRSR08uICovCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UOF9UUkdPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChMTF9BRENfSU5KX1RSSUdfRVhUX1RJTThfVFJHTykgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiBcCit0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNOCBUUkdPLiAqLworI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDhfVFJHTzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKExMX0FEQ19JTkpfVFJJR19FWFRfVElNOF9UUkdPMikgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiBcCit0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNOCBUUkdPMi4gKi8KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDX1Q4X0NDMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX0lOSl9UUklHX0VYVF9USU04X0NIMikgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiBcCit0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNOCBjaGFubmVsIDIgZXZlbnQgKGNhcHR1cmUgY29tcGFyZSkuICovCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UOF9DQzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKExMX0FEQ19JTkpfVFJJR19FWFRfVElNOF9DSDQpIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gXAordHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTggY2hhbm5lbCA0IGV2ZW50IChjYXB0dXJlIGNvbXBhcmUpLiAqLworI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDE1X1RSR08gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKExMX0FEQ19JTkpfVFJJR19FWFRfVElNMTVfVFJHTykgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiBcCit0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMTUgVFJHTy4gKi8KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QxNl9DQzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKExMX0FEQ19JTkpfVFJJR19FWFRfVElNMTZfQ0gxKSAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIFwKK3RyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU04IGNoYW5uZWwgNCBldmVudCAoY2FwdHVyZSBjb21wYXJlKS4gKi8KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QyMF9UUkdPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTIwX1RSR08pIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gXAordHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTIwIFRSR08uICovCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UMjBfVFJHTzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKExMX0FEQ19JTkpfVFJJR19FWFRfVElNMjBfVFJHTzIpIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gXAordHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTIwIFRSR08yLiAqLworI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDIwX0NDMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX0lOSl9UUklHX0VYVF9USU0yMF9DSDIpIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gXAordHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTIwIGNoYW5uZWwgMiBldmVudCAoY2FwdHVyZSBjb21wYXJlKS4gKi8KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QyMF9DQzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKExMX0FEQ19JTkpfVFJJR19FWFRfVElNMjBfQ0g0KSAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIFwKK3RyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU0yMCBjaGFubmVsIDQgZXZlbnQgKGNhcHR1cmUgY29tcGFyZSkuICovCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19IUlRJTV9UUkcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX0lOSl9UUklHX0VYVF9IUlRJTV9UUkcxKSAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIFwKK3RyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBIUlRJTUVSIEFEQyB0cmlnZ2VyIDEgZXZlbnQuICovCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19IUlRJTV9UUkcyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX0lOSl9UUklHX0VYVF9IUlRJTV9UUkcyKSAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIFwKK3RyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBIUlRJTUVSIEFEQyB0cmlnZ2VyIDIgZXZlbnQuICovCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19IUlRJTV9UUkczICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX0lOSl9UUklHX0VYVF9IUlRJTV9UUkczKSAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIFwKK3RyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBIUlRJTUVSIEFEQyB0cmlnZ2VyIDMgZXZlbnQuICovCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19IUlRJTV9UUkc0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX0lOSl9UUklHX0VYVF9IUlRJTV9UUkc0KSAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIFwKK3RyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBIUlRJTUVSIEFEQyB0cmlnZ2VyIDQgZXZlbnQuICovCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19IUlRJTV9UUkc1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX0lOSl9UUklHX0VYVF9IUlRJTV9UUkc1KSAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIFwKK3RyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBIUlRJTUVSIEFEQyB0cmlnZ2VyIDUgZXZlbnQuICovCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19IUlRJTV9UUkc2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX0lOSl9UUklHX0VYVF9IUlRJTV9UUkc2KSAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIFwKK3RyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBIUlRJTUVSIEFEQyB0cmlnZ2VyIDYgZXZlbnQuICovCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19IUlRJTV9UUkc3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX0lOSl9UUklHX0VYVF9IUlRJTV9UUkc3KSAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIFwKK3RyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBIUlRJTUVSIEFEQyB0cmlnZ2VyIDcgZXZlbnQuICovCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19IUlRJTV9UUkc4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX0lOSl9UUklHX0VYVF9IUlRJTV9UUkc4KSAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIFwKK3RyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBIUlRJTUVSIEFEQyB0cmlnZ2VyIDggZXZlbnQuICovCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19IUlRJTV9UUkc5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX0lOSl9UUklHX0VYVF9IUlRJTV9UUkc5KSAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIFwKK3RyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBIUlRJTUVSIEFEQyB0cmlnZ2VyIDkgZXZlbnQuICovCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19IUlRJTV9UUkcxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKExMX0FEQ19JTkpfVFJJR19FWFRfSFJUSU1fVFJHMTApIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gXAordHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IEhSVElNRVIgQURDIHRyaWdnZXIgMTAgZXZlbnQuICovCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19FWFRfSVQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX0lOSl9UUklHX0VYVF9FWFRJX0xJTkUzKSAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIFwKK3RyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBleHRlcm5hbCBpbnRlcnJ1cHQgbGluZSAzLiAqLworI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNfRVhUX0lUMTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChMTF9BRENfSU5KX1RSSUdfRVhUX0VYVElfTElORTE1KSAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIFwKK3RyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBleHRlcm5hbCBpbnRlcnJ1cHQgbGluZSAxNS4gKi8KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDX0xQVElNX09VVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKExMX0FEQ19JTkpfVFJJR19FWFRfTFBUSU1fT1VUKSAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIFwKK3RyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBMUFRJTUVSIE9VVCBldmVudC4gKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEFEQ19pbmplY3RlZF9leHRlcm5hbF90cmlnZ2VyX2VkZ2UgQURDIGdyb3VwIGluamVjdGVkIHRyaWdnZXIgZWRnZQorICogKHdoZW4gZXh0ZXJuYWwgdHJpZ2dlciBpcyBzZWxlY3RlZCkKKyAqIEB7CisgKi8KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9FREdFX05PTkUgICAgICAgIFwKKyAgKDB4MDAwMDAwMDBVTCkgLyohPCBJbmplY3RlZCBjb252ZXJzaW9ucyB0cmlnZ2VyIFwKK2Rpc2FibGVkIChTVyBzdGFydCkqLworI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX0VER0VfUklTSU5HICAgICAgICAgICBcCisgIChBRENfSlNRUl9KRVhURU5fMCkgLyohPCBJbmplY3RlZCBjb252ZXJzaW9ucyB0cmlnZ2VyIFwKK3BvbGFyaXR5IHNldCB0byByaXNpbmcgZWRnZSAqLworI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX0VER0VfRkFMTElORyAgICAgICAgICBcCisgIChBRENfSlNRUl9KRVhURU5fMSkgLyohPCBJbmplY3RlZCBjb252ZXJzaW9ucyB0cmlnZ2VyIFwKK3BvbGFyaXR5IHNldCB0byBmYWxsaW5nIGVkZ2UgKi8KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9FREdFX1JJU0lOR0ZBTExJTkcgIFwKKyAgKEFEQ19KU1FSX0pFWFRFTikgLyohPCBJbmplY3RlZCBjb252ZXJzaW9ucyB0cmlnZ2VyIFwKK3BvbGFyaXR5IHNldCB0byBib3RoIHJpc2luZyBhbmQgZmFsbGluZyBlZGdlcyAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0hBTF9FQ19DSEFOTkVMX1NJTkdMRV9ESUZGX0VORElORyAgQ2hhbm5lbCAtIFNpbmdsZSBvcgorICogZGlmZmVyZW50aWFsIGVuZGluZworICogQHsKKyAqLworI2RlZmluZSBBRENfU0lOR0xFX0VOREVEIFwKKyAgKExMX0FEQ19TSU5HTEVfRU5ERUQpIC8qITwgQURDIGNoYW5uZWwgZW5kaW5nIHNldCB0byBzaW5nbGUgZW5kZWQgKi8KKyNkZWZpbmUgQURDX0RJRkZFUkVOVElBTF9FTkRFRCBcCisgIChMTF9BRENfRElGRkVSRU5USUFMX0VOREVEKSAvKiE8IEFEQyBjaGFubmVsIGVuZGluZyBzZXQgdG8gZGlmZmVyZW50aWFsICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBBRENfSEFMX0VDX09GRlNFVF9OQiAgQURDIGluc3RhbmNlIC0gT2Zmc2V0IG51bWJlcgorICogQHsKKyAqLworI2RlZmluZSBBRENfT0ZGU0VUX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfT0ZGU0VUXzQgKyAxVSkgLyohPCBBREMgb2Zmc2V0IGRpc2FibGVkOiBubyBvZmZzZXQgY29ycmVjdGlvbiBmb3IgdGhlIFwKKyAgc2VsZWN0ZWQgQURDIGNoYW5uZWwgKi8KKyNkZWZpbmUgQURDX09GRlNFVF8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChMTF9BRENfT0ZGU0VUXzEpIC8qITwgQURDIG9mZnNldCBudW1iZXIgMTogQURDIGNoYW5uZWwgYW5kIG9mZnNldCBsZXZlbCB0byAgXAorICB3aGljaCB0aGUgb2Zmc2V0IHByb2dyYW1tZWQgd2lsbCBiZSBhcHBsaWVkIChpbmRlcGVuZGVudGx5IG9mIGNoYW5uZWwgbWFwcGVkIFwKKyAgb24gQURDIGdyb3VwIHJlZ3VsYXIgb3IgZ3JvdXAgaW5qZWN0ZWQpICovCisjZGVmaW5lIEFEQ19PRkZTRVRfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX09GRlNFVF8yKSAvKiE8IEFEQyBvZmZzZXQgbnVtYmVyIDI6IEFEQyBjaGFubmVsIGFuZCBvZmZzZXQgbGV2ZWwgdG8gIFwKKyAgd2hpY2ggdGhlIG9mZnNldCBwcm9ncmFtbWVkIHdpbGwgYmUgYXBwbGllZCAoaW5kZXBlbmRlbnRseSBvZiBjaGFubmVsIG1hcHBlZCBcCisgIG9uIEFEQyBncm91cCByZWd1bGFyIG9yIGdyb3VwIGluamVjdGVkKSAqLworI2RlZmluZSBBRENfT0ZGU0VUXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKExMX0FEQ19PRkZTRVRfMykgLyohPCBBREMgb2Zmc2V0IG51bWJlciAzOiBBREMgY2hhbm5lbCBhbmQgb2Zmc2V0IGxldmVsIHRvICBcCisgIHdoaWNoIHRoZSBvZmZzZXQgcHJvZ3JhbW1lZCB3aWxsIGJlIGFwcGxpZWQgKGluZGVwZW5kZW50bHkgb2YgY2hhbm5lbCBtYXBwZWQgXAorICBvbiBBREMgZ3JvdXAgcmVndWxhciBvciBncm91cCBpbmplY3RlZCkgKi8KKyNkZWZpbmUgQURDX09GRlNFVF80ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChMTF9BRENfT0ZGU0VUXzQpIC8qITwgQURDIG9mZnNldCBudW1iZXIgNDogQURDIGNoYW5uZWwgYW5kIG9mZnNldCBsZXZlbCB0byAgXAorICB3aGljaCB0aGUgb2Zmc2V0IHByb2dyYW1tZWQgd2lsbCBiZSBhcHBsaWVkIChpbmRlcGVuZGVudGx5IG9mIGNoYW5uZWwgbWFwcGVkIFwKKyAgb24gQURDIGdyb3VwIHJlZ3VsYXIgb3IgZ3JvdXAgaW5qZWN0ZWQpICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBBRENFeF9PZmZzZXRTaWduIEFEQyBFeHRlbmRlZCBPZmZzZXQgU2lnbgorICogQHsKKyAqLworI2RlZmluZSBBRENfT0ZGU0VUX1NJR05fTkVHQVRJVkUgXAorICAoMHgwMDAwMDAwMFVMKSAvKiE8IE9mZnNldCBzaWduIG5lZ2F0aXZlLCBvZmZzZXQgaXMgc3VidHJhY3RlZCAqLworI2RlZmluZSBBRENfT0ZGU0VUX1NJR05fUE9TSVRJVkUgXAorICAoQURDX09GUjFfT0ZGU0VUUE9TKSAvKiE8IE9mZnNldCBzaWduIHBvc2l0aXZlLCBvZmZzZXQgaXMgYWRkZWQgICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBBRENfSU5KX1NFUV9SQU5LUyAgQURDIGdyb3VwIGluamVjdGVkIC0gU2VxdWVuY2VyIHJhbmtzCisgKiBAeworICovCisjZGVmaW5lIEFEQ19JTkpFQ1RFRF9SQU5LXzEgXAorICAoTExfQURDX0lOSl9SQU5LXzEpIC8qITwgQURDIGdyb3VwIGluamVjdGVkIHNlcXVlbmNlciByYW5rIDEgKi8KKyNkZWZpbmUgQURDX0lOSkVDVEVEX1JBTktfMiBcCisgIChMTF9BRENfSU5KX1JBTktfMikgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgc2VxdWVuY2VyIHJhbmsgMiAqLworI2RlZmluZSBBRENfSU5KRUNURURfUkFOS18zIFwKKyAgKExMX0FEQ19JTkpfUkFOS18zKSAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBzZXF1ZW5jZXIgcmFuayAzICovCisjZGVmaW5lIEFEQ19JTkpFQ1RFRF9SQU5LXzQgXAorICAoTExfQURDX0lOSl9SQU5LXzQpIC8qITwgQURDIGdyb3VwIGluamVjdGVkIHNlcXVlbmNlciByYW5rIDQgKi8KKy8qKgorICogQH0KKyAqLworCisjaWYgZGVmaW5lZChBRENfTVVMVElNT0RFX1NVUFBPUlQpCisvKiogQGRlZmdyb3VwIEFEQ19IQUxfRUNfTVVMVElfTU9ERSAgTXVsdGltb2RlIC0gTW9kZQorICogQHsKKyAqLworI2RlZmluZSBBRENfTU9ERV9JTkRFUEVOREVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX01VTFRJX0lOREVQRU5ERU5UKSAvKiE8IEFEQyBkdWFsIG1vZGUgZGlzYWJsZWQgXAorKEFEQyBpbmRlcGVuZGVudCBtb2RlKSAqLworI2RlZmluZSBBRENfRFVBTE1PREVfUkVHU0lNVUxUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX01VTFRJX0RVQUxfUkVHX1NJTVVMVCkgLyohPCBBREMgZHVhbCBtb2RlIGVuYWJsZWQ6IGdyb3VwIHJlZ3VsYXIgXAorc2ltdWx0YW5lb3VzICovCisjZGVmaW5lIEFEQ19EVUFMTU9ERV9JTlRFUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX01VTFRJX0RVQUxfUkVHX0lOVEVSTCkgLyohPCBBREMgZHVhbCBtb2RlIGVuYWJsZWQ6IENvbWJpbmVkIFwKK2dyb3VwIHJlZ3VsYXIgaW50ZXJsZWF2ZWQgKi8KKyNkZWZpbmUgQURDX0RVQUxNT0RFX0lOSkVDU0lNVUxUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChMTF9BRENfTVVMVElfRFVBTF9JTkpfU0lNVUxUKSAvKiE8IEFEQyBkdWFsIG1vZGUgZW5hYmxlZDogZ3JvdXAgXAoraW5qZWN0ZWQgc2ltdWx0YW5lb3VzICovCisjZGVmaW5lIEFEQ19EVUFMTU9ERV9BTFRFUlRSSUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX01VTFRJX0RVQUxfSU5KX0FMVEVSTikgLyohPCBBREMgZHVhbCBtb2RlIGVuYWJsZWQ6IGdyb3VwICAgICAgICAgIFwKK2luamVjdGVkIGFsdGVybmF0ZSB0cmlnZ2VyLiBXb3JrcyBvbmx5IHdpdGggZXh0ZXJuYWwgdHJpZ2dlcnMgKG5vdCBpbnRlcm5hbCBcCitTVyBzdGFydCkgKi8KKyNkZWZpbmUgQURDX0RVQUxNT0RFX1JFR1NJTVVMVF9JTkpFQ1NJTVVMVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKExMX0FEQ19NVUxUSV9EVUFMX1JFR19TSU1fSU5KX1NJTSkgLyohPCBBREMgZHVhbCBtb2RlIGVuYWJsZWQ6IENvbWJpbmVkIFwKKyAgZ3JvdXAgcmVndWxhciBzaW11bHRhbmVvdXMgKyBncm91cCBpbmplY3RlZCBzaW11bHRhbmVvdXMgKi8KKyNkZWZpbmUgQURDX0RVQUxNT0RFX1JFR1NJTVVMVF9BTFRFUlRSSUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKExMX0FEQ19NVUxUSV9EVUFMX1JFR19TSU1fSU5KX0FMVCkgLyohPCBBREMgZHVhbCBtb2RlIGVuYWJsZWQ6IENvbWJpbmVkIFwKKyAgZ3JvdXAgcmVndWxhciBzaW11bHRhbmVvdXMgKyBncm91cCBpbmplY3RlZCBhbHRlcm5hdGUgdHJpZ2dlciAqLworI2RlZmluZSBBRENfRFVBTE1PREVfUkVHSU5URVJMX0lOSkVDU0lNVUxUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX01VTFRJX0RVQUxfUkVHX0lOVF9JTkpfU0lNKSAvKiE8IEFEQyBkdWFsIG1vZGUgZW5hYmxlZDogQ29tYmluZWQgXAorICBncm91cCByZWd1bGFyIGludGVybGVhdmVkICsgZ3JvdXAgaW5qZWN0ZWQgc2ltdWx0YW5lb3VzICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0hBTF9FQ19NVUxUSV9ETUFfVFJBTlNGRVJfUkVTT0xVVElPTiAgTXVsdGltb2RlIC0gRE1BIHRyYW5zZmVyCisgKiBtb2RlIGRlcGVuZGluZyBvbiBBREMgcmVzb2x1dGlvbgorICogQHsKKyAqLworI2RlZmluZSBBRENfRE1BQUNDRVNTTU9ERV9ESVNBQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgweDAwMDAwMDAwVUwpIC8qITwgRE1BIG11bHRpbW9kZSBkaXNhYmxlZDogZWFjaCBBREMgdXNlcyBpdHMgb3duIFwKK0RNQSBjaGFubmVsICovCisjZGVmaW5lIEFEQ19ETUFBQ0NFU1NNT0RFXzEyXzEwX0JJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19DQ1JfTURNQV8xKSAvKiE8IERNQSBtdWx0aW1vZGUgZW5hYmxlZCAob25lIERNQSBjaGFubmVsIGZvciBib3RoIEFEQywgXAorRE1BIG9mIEFEQyBtYXN0ZXIpIGZvciAxMiBhbmQgMTAgYml0cyByZXNvbHV0aW9uICovCisjZGVmaW5lIEFEQ19ETUFBQ0NFU1NNT0RFXzhfNl9CSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfQ0NSX01ETUEpIC8qITwgRE1BIG11bHRpbW9kZSBlbmFibGVkIChvbmUgRE1BIGNoYW5uZWwgZm9yIGJvdGggQURDLCBcCitETUEgb2YgQURDIG1hc3RlcikgZm9yIDggYW5kIDYgYml0cyByZXNvbHV0aW9uICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBBRENfSEFMX0VDX01VTFRJX1RXT1NNUF9ERUxBWSAgTXVsdGltb2RlIC0gRGVsYXkgYmV0d2VlbiB0d28KKyAqIHNhbXBsaW5nIHBoYXNlcworICogQHsKKyAqLworI2RlZmluZSBBRENfVFdPU0FNUExJTkdERUxBWV8xQ1lDTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzFDWUNMRSkgLyohPCBBREMgbXVsdGltb2RlIGRlbGF5IGJldHdlZW4gdHdvIFwKK3NhbXBsaW5nIHBoYXNlczogMSBBREMgY2xvY2sgY3ljbGUgKi8KKyNkZWZpbmUgQURDX1RXT1NBTVBMSU5HREVMQVlfMkNZQ0xFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfMkNZQ0xFUykgLyohPCBBREMgbXVsdGltb2RlIGRlbGF5IGJldHdlZW4gdHdvIFwKK3NhbXBsaW5nIHBoYXNlczogMiBBREMgY2xvY2sgY3ljbGVzICovCisjZGVmaW5lIEFEQ19UV09TQU1QTElOR0RFTEFZXzNDWUNMRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzNDWUNMRVMpIC8qITwgQURDIG11bHRpbW9kZSBkZWxheSBiZXR3ZWVuIHR3byBcCitzYW1wbGluZyBwaGFzZXM6IDMgQURDIGNsb2NrIGN5Y2xlcyAqLworI2RlZmluZSBBRENfVFdPU0FNUExJTkdERUxBWV80Q1lDTEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX01VTFRJX1RXT1NNUF9ERUxBWV80Q1lDTEVTKSAvKiE8IEFEQyBtdWx0aW1vZGUgZGVsYXkgYmV0d2VlbiB0d28gXAorc2FtcGxpbmcgcGhhc2VzOiA0IEFEQyBjbG9jayBjeWNsZXMgKi8KKyNkZWZpbmUgQURDX1RXT1NBTVBMSU5HREVMQVlfNUNZQ0xFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfNUNZQ0xFUykgLyohPCBBREMgbXVsdGltb2RlIGRlbGF5IGJldHdlZW4gdHdvIFwKK3NhbXBsaW5nIHBoYXNlczogNSBBREMgY2xvY2sgY3ljbGVzICovCisjZGVmaW5lIEFEQ19UV09TQU1QTElOR0RFTEFZXzZDWUNMRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzZDWUNMRVMpIC8qITwgQURDIG11bHRpbW9kZSBkZWxheSBiZXR3ZWVuIHR3byBcCitzYW1wbGluZyBwaGFzZXM6IDYgQURDIGNsb2NrIGN5Y2xlcyAqLworI2RlZmluZSBBRENfVFdPU0FNUExJTkdERUxBWV83Q1lDTEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX01VTFRJX1RXT1NNUF9ERUxBWV83Q1lDTEVTKSAvKiE8IEFEQyBtdWx0aW1vZGUgZGVsYXkgYmV0d2VlbiB0d28gXAorc2FtcGxpbmcgcGhhc2VzOiA3IEFEQyBjbG9jayBjeWNsZXMgKi8KKyNkZWZpbmUgQURDX1RXT1NBTVBMSU5HREVMQVlfOENZQ0xFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfOENZQ0xFUykgLyohPCBBREMgbXVsdGltb2RlIGRlbGF5IGJldHdlZW4gdHdvIFwKK3NhbXBsaW5nIHBoYXNlczogOCBBREMgY2xvY2sgY3ljbGVzICovCisjZGVmaW5lIEFEQ19UV09TQU1QTElOR0RFTEFZXzlDWUNMRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzlDWUNMRVMpIC8qITwgQURDIG11bHRpbW9kZSBkZWxheSBiZXR3ZWVuIHR3byBcCitzYW1wbGluZyBwaGFzZXM6IDkgQURDIGNsb2NrIGN5Y2xlcyAqLworI2RlZmluZSBBRENfVFdPU0FNUExJTkdERUxBWV8xMENZQ0xFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfMTBDWUNMRVMpIC8qITwgQURDIG11bHRpbW9kZSBkZWxheSBiZXR3ZWVuIHR3byBcCisgc2FtcGxpbmcgcGhhc2VzOiAxMCBBREMgY2xvY2sgY3ljbGVzICovCisjZGVmaW5lIEFEQ19UV09TQU1QTElOR0RFTEFZXzExQ1lDTEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX01VTFRJX1RXT1NNUF9ERUxBWV8xMUNZQ0xFUykgLyohPCBBREMgbXVsdGltb2RlIGRlbGF5IGJldHdlZW4gdHdvIFwKKyBzYW1wbGluZyBwaGFzZXM6IDExIEFEQyBjbG9jayBjeWNsZXMgKi8KKyNkZWZpbmUgQURDX1RXT1NBTVBMSU5HREVMQVlfMTJDWUNMRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzEyQ1lDTEVTKSAvKiE8IEFEQyBtdWx0aW1vZGUgZGVsYXkgYmV0d2VlbiB0d28gXAorIHNhbXBsaW5nIHBoYXNlczogMTIgQURDIGNsb2NrIGN5Y2xlcyAqLworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworI2VuZGlmIC8qIEFEQ19NVUxUSU1PREVfU1VQUE9SVCAqLworCisvKiogQGRlZmdyb3VwIEFEQ19IQUxfRUNfR1JPVVBTICBBREMgaW5zdGFuY2UgLSBHcm91cHMKKyAqIEB7CisgKi8KKyNkZWZpbmUgQURDX1JFR1VMQVJfR1JPVVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX0dST1VQX1JFR1VMQVIpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgKGF2YWlsYWJsZSBvbiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGwgU1RNMzIgZGV2aWNlcykgKi8KKyNkZWZpbmUgQURDX0lOSkVDVEVEX0dST1VQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX0dST1VQX0lOSkVDVEVEKSAvKiE8IEFEQyBncm91cCBpbmplY3RlZCAobm90IGF2YWlsYWJsZSBvbiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsIFNUTTMyIGRldmljZXMpICovCisjZGVmaW5lIEFEQ19SRUdVTEFSX0lOSkVDVEVEX0dST1VQIFwKKyAgKExMX0FEQ19HUk9VUF9SRUdVTEFSX0lOSkVDVEVEKSAvKiE8IEFEQyBib3RoIGdyb3VwcyByZWd1bGFyIGFuZCBpbmplY3RlZCAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0NGR1JfZmllbGRzIEFEQ3ggQ0ZHUiBmaWVsZHMKKyAqIEB7CisgKi8KKyNkZWZpbmUgQURDX0NGR1JfRklFTERTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19DRkdSX0FXRDFDSCB8IEFEQ19DRkdSX0pBVVRPIHwgQURDX0NGR1JfSkFXRDFFTiB8IEFEQ19DRkdSX0FXRDFFTiB8IFwKKyAgIEFEQ19DRkdSX0FXRDFTR0wgfCBBRENfQ0ZHUl9KUU0gfCBBRENfQ0ZHUl9KRElTQ0VOIHwgQURDX0NGR1JfRElTQ05VTSB8IFwKKyAgIEFEQ19DRkdSX0RJU0NFTiB8IEFEQ19DRkdSX0FVVERMWSB8IEFEQ19DRkdSX0NPTlQgfCBBRENfQ0ZHUl9PVlJNT0QgfCAgIFwKKyAgIEFEQ19DRkdSX0VYVEVOIHwgQURDX0NGR1JfRVhUU0VMIHwgQURDX0NGR1JfQUxJR04gfCBBRENfQ0ZHUl9SRVMgfCAgICAgIFwKKyAgIEFEQ19DRkdSX0RNQUNGRyB8IEFEQ19DRkdSX0RNQUVOKQorLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX1NNUFIxX2ZpZWxkcyBBREN4IFNNUFIxIGZpZWxkcworICogQHsKKyAqLworI2lmIGRlZmluZWQoQURDX1NNUFIxX1NNUFBMVVMpCisjZGVmaW5lIEFEQ19TTVBSMV9GSUVMRFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19TTVBSMV9TTVA5IHwgQURDX1NNUFIxX1NNUDggfCBBRENfU01QUjFfU01QNyB8IEFEQ19TTVBSMV9TTVA2IHwgXAorICAgQURDX1NNUFIxX1NNUDUgfCBBRENfU01QUjFfU01QNCB8IEFEQ19TTVBSMV9TTVAzIHwgQURDX1NNUFIxX1NNUDIgfCBcCisgICBBRENfU01QUjFfU01QMSB8IEFEQ19TTVBSMV9TTVAwIHwgQURDX1NNUFIxX1NNUFBMVVMpCisjZWxzZQorI2RlZmluZSBBRENfU01QUjFfRklFTERTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfU01QUjFfU01QOSB8IEFEQ19TTVBSMV9TTVA4IHwgQURDX1NNUFIxX1NNUDcgfCBBRENfU01QUjFfU01QNiB8IFwKKyAgIEFEQ19TTVBSMV9TTVA1IHwgQURDX1NNUFIxX1NNUDQgfCBBRENfU01QUjFfU01QMyB8IEFEQ19TTVBSMV9TTVAyIHwgXAorICAgQURDX1NNUFIxX1NNUDEgfCBBRENfU01QUjFfU01QMCkKKyNlbmRpZiAvKiBBRENfU01QUjFfU01QUExVUyAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0NGR1JfZmllbGRzXzIgQURDeCBDRkdSIHN1YiBmaWVsZHMKKyAqIEB7CisgKi8KKy8qIEFEQ19DRkdSIGZpZWxkcyBvZiBwYXJhbWV0ZXJzIHRoYXQgY2FuIGJlIHVwZGF0ZWQgd2hlbiBubyBjb252ZXJzaW9uCisgICAobmVpdGhlciByZWd1bGFyIG5vciBpbmplY3RlZCkgaXMgb24tZ29pbmcgICovCisjZGVmaW5lIEFEQ19DRkdSX0ZJRUxEU18yICgoQURDX0NGR1JfRE1BQ0ZHIHwgQURDX0NGR1JfQVVURExZKSkKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyogRXhwb3J0ZWQgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmIGRlZmluZWQoQURDX01VTFRJTU9ERV9TVVBQT1JUKQorLyoqIEBkZWZncm91cCBBRENFeF9FeHBvcnRlZF9NYWNybyBBREMgRXh0ZW5kZWQgRXhwb3J0ZWQgTWFjcm9zCisgKiBAeworICovCisKKy8qKiBAYnJpZWYgIEZvcmNlIEFEQyBpbnN0YW5jZSBpbiBtdWx0aW1vZGUgbW9kZSBpbmRlcGVuZGVudCAobXVsdGltb2RlCisgKiBkaXNhYmxlKS4KKyAqIEBub3RlICAgVGhpcyBtYWNybyBtdXN0IGJlIHVzZWQgb25seSBpbiBjYXNlIG9mIHRyYW5zaXRpb24gZnJvbSBtdWx0aW1vZGUKKyAqICAgICAgICAgdG8gbW9kZSBpbmRlcGVuZGVudCBhbmQgaW4gY2FzZSBvZiB1bmtub3duIHByZXZpb3VzIHN0YXRlLAorICogICAgICAgICB0byBlbnN1cmUgQURDIGNvbmZpZ3VyYXRpb24gaXMgaW4gbW9kZSBpbmRlcGVuZGVudC4KKyAqIEBub3RlICAgU3RhbmRhcmQgd2F5IG9mIG11bHRpbW9kZSBjb25maWd1cmF0aW9uIGNoYW5nZSBpcyBkb25lIGZyb20KKyAqICAgICAgICAgSEFMIEFEQyBoYW5kbGUgb2YgQURDIG1hc3RlciB1c2luZyBmdW5jdGlvbgorICogICAgICAgICAiSEFMX0FEQ0V4X011bHRpTW9kZUNvbmZpZ0NoYW5uZWwoLi4uLCBBRENfTU9ERV9JTkRFUEVOREVOVCkiICkiLgorICogICAgICAgICBVc2FnZSBvZiB0aGlzIG1hY3JvIGlzIG5vdCB0aGUgU3RhbmRhcmQgd2F5IG9mIG11bHRpbW9kZQorICogICAgICAgICBjb25maWd1cmF0aW9uIGFuZCBjYW4gbGVhZCB0byBoYXZlIEhBTCBBREMgaGFuZGxlcyBzdGF0dXMKKyAqICAgICAgICAgbWlzYWxpZ25lZC4gVXNhZ2Ugb2YgdGhpcyBtYWNybyBtdXN0IGJlIGxpbWl0ZWQgdG8gY2FzZXMKKyAqICAgICAgICAgbWVudGlvbmVkIGFib3ZlLgorICogQHBhcmFtIF9fSEFORExFX18gQURDIGhhbmRsZS4KKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIEFEQ19GT1JDRV9NT0RFX0lOREVQRU5ERU5UKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIExMX0FEQ19TZXRNdWx0aW1vZGUoX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpLCBcCisgICAgICAgICAgICAgICAgICAgICAgTExfQURDX01VTFRJX0lOREVQRU5ERU5UKQorCisvKioKKyAqIEB9CisgKi8KKyNlbmRpZiAvKiBBRENfTVVMVElNT0RFX1NVUFBPUlQgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBBRENFeF9Qcml2YXRlX01hY3JvX2ludGVybmFsX0hBTF9kcml2ZXIgQURDIEV4dGVuZGVkIFByaXZhdGUKKyAqIE1hY3JvcworICogQHsKKyAqLworLyogTWFjcm8gcmVzZXJ2ZWQgZm9yIGludGVybmFsIEhBTCBkcml2ZXIgdXNhZ2UsIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIGluICAgKi8KKy8qIGNvZGUgb2YgZmluYWwgdXNlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qKgorICogQGJyaWVmIFRlc3QgaWYgY29udmVyc2lvbiB0cmlnZ2VyIG9mIGluamVjdGVkIGdyb3VwIGlzIHNvZnR3YXJlIHN0YXJ0CisgKiAgICAgICAgb3IgZXh0ZXJuYWwgdHJpZ2dlci4KKyAqIEBwYXJhbSBfX0hBTkRMRV9fIEFEQyBoYW5kbGUuCisgKiBAcmV0dmFsIFNFVCAoc29mdHdhcmUgc3RhcnQpIG9yIFJFU0VUIChleHRlcm5hbCB0cmlnZ2VyKS4KKyAqLworI2RlZmluZSBBRENfSVNfU09GVFdBUkVfU1RBUlRfSU5KRUNURUQoX19IQU5ETEVfXykgXAorICAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkpTUVIgJiBBRENfSlNRUl9KRVhURU4pID09IDBVTCkKKworLyoqCisgKiBAYnJpZWYgQ2hlY2sgd2hldGhlciBvciBub3QgQURDIGlzIGluZGVwZW5kZW50LgorICogQHBhcmFtIF9fSEFORExFX18gQURDIGhhbmRsZS4KKyAqIEBub3RlICBXaGVuIG11bHRpbW9kZSBmZWF0dXJlIGlzIG5vdCBhdmFpbGFibGUsIHRoZSBtYWNybyBhbHdheXMgcmV0dXJucyBTRVQuCisgKiBAcmV0dmFsIFNFVCAoQURDIGlzIGluZGVwZW5kZW50KSBvciBSRVNFVCAoQURDIGlzIG5vdCkuCisgKi8KKyNpZiBkZWZpbmVkKFNUTTMyRzQ3NHh4KSB8fCBkZWZpbmVkKFNUTTMyRzQ4NHh4KSB8fCBkZWZpbmVkKFNUTTMyRzQ3M3h4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkc0ODN4eCkKKyNkZWZpbmUgQURDX0lTX0lOREVQRU5ERU5UKF9fSEFORExFX18pIFwKKyAgKCgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09IEFEQzUpKSA/IFNFVCA6IFJFU0VUKQorI2VsaWYgZGVmaW5lZChTVE0zMkc0OTF4eCkgfHwgZGVmaW5lZChTVE0zMkc0QTF4eCkgfHwgZGVmaW5lZChTVE0zMkc0MTF4QykKKyNkZWZpbmUgQURDX0lTX0lOREVQRU5ERU5UKF9fSEFORExFX18pIFwKKyAgKCgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09IEFEQzMpKSA/IFNFVCA6IFJFU0VUKQorI2VsaWYgZGVmaW5lZChTVE0zMkc0MTF4QikgfHwgZGVmaW5lZChTVE0zMkc0MTR4eCkgfHwgZGVmaW5lZChTVE0zMkdCSzFDQikgfHwgXAorICAgIGRlZmluZWQoU1RNMzJHNDMxeHgpIHx8IGRlZmluZWQoU1RNMzJHNDQxeHgpIHx8IGRlZmluZWQoU1RNMzJHNDcxeHgpCisjZGVmaW5lIEFEQ19JU19JTkRFUEVOREVOVChfX0hBTkRMRV9fKSAoUkVTRVQpCisjZW5kaWYgLyogZGVmaW5lZChTVE0zMkc0NzR4eCkgfHwgZGVmaW5lZChTVE0zMkc0ODR4eCkgfHwgZGVmaW5lZChTVE0zMkc0NzN4eCkgXAorICAgICAgICAgIHx8IGRlZmluZWQoU1RNMzJHNDgzeHgpICovCisKKy8qKgorICogQGJyaWVmIFNldCB0aGUgc2VsZWN0ZWQgaW5qZWN0ZWQgQ2hhbm5lbCByYW5rLgorICogQHBhcmFtIF9fQ0hBTk5FTE5CX18gQ2hhbm5lbCBudW1iZXIuCisgKiBAcGFyYW0gX19SQU5LTkJfXyBSYW5rIG51bWJlci4KKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIEFEQ19KU1FSX1JLKF9fQ0hBTk5FTE5CX18sIF9fUkFOS05CX18pICAgICAgICBcCisgICgoKChfX0NIQU5ORUxOQl9fKSAmIEFEQ19DSEFOTkVMX0lEX05VTUJFUl9NQVNLKSA+PiBcCisgICAgQURDX0NIQU5ORUxfSURfTlVNQkVSX0JJVE9GRlNFVF9QT1MpICAgICAgICAgICAgICBcCisgICA8PCAoKF9fUkFOS05CX18pICYgQURDX0lOSl9SQU5LX0lEX0pTUVJfTUFTSykpCisKKy8qKgorICogQGJyaWVmIENvbmZpZ3VyZSBBREMgaW5qZWN0ZWQgY29udGV4dCBxdWV1ZQorICogQHBhcmFtIF9fSU5KRUNUX0NPTlRFWFRfUVVFVUVfTU9ERV9fIEluamVjdGVkIGNvbnRleHQgcXVldWUgbW9kZS4KKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIEFEQ19DRkdSX0lOSkVDVF9DT05URVhUX1FVRVVFKF9fSU5KRUNUX0NPTlRFWFRfUVVFVUVfTU9ERV9fKSBcCisgICgoX19JTkpFQ1RfQ09OVEVYVF9RVUVVRV9NT0RFX18pIDw8IEFEQ19DRkdSX0pRTV9Qb3MpCisKKy8qKgorICogQGJyaWVmIENvbmZpZ3VyZSBBREMgZGlzY29udGludW91cyBjb252ZXJzaW9uIG1vZGUgZm9yIGluamVjdGVkIGdyb3VwCisgKiBAcGFyYW0gX19JTkpFQ1RfRElTQ09OVElOVU9VU19NT0RFX18gSW5qZWN0ZWQgZGlzY29udGludW91cyBtb2RlLgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgQURDX0NGR1JfSU5KRUNUX0RJU0NDT05USU5VT1VTKF9fSU5KRUNUX0RJU0NPTlRJTlVPVVNfTU9ERV9fKSBcCisgICgoX19JTkpFQ1RfRElTQ09OVElOVU9VU19NT0RFX18pIDw8IEFEQ19DRkdSX0pESVNDRU5fUG9zKQorCisvKioKKyAqIEBicmllZiBDb25maWd1cmUgQURDIGRpc2NvbnRpbnVvdXMgY29udmVyc2lvbiBtb2RlIGZvciByZWd1bGFyIGdyb3VwCisgKiBAcGFyYW0gX19SRUdfRElTQ09OVElOVU9VU19NT0RFX18gUmVndWxhciBkaXNjb250aW51b3VzIG1vZGUuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBBRENfQ0ZHUl9SRUdfRElTQ09OVElOVU9VUyhfX1JFR19ESVNDT05USU5VT1VTX01PREVfXykgXAorICAoKF9fUkVHX0RJU0NPTlRJTlVPVVNfTU9ERV9fKSA8PCBBRENfQ0ZHUl9ESVNDRU5fUG9zKQorCisvKioKKyAqIEBicmllZiBDb25maWd1cmUgdGhlIG51bWJlciBvZiBkaXNjb250aW51b3VzIGNvbnZlcnNpb25zIGZvciByZWd1bGFyIGdyb3VwLgorICogQHBhcmFtIF9fTkJSX0RJU0NPTlRJTlVPVVNfQ09OVl9fIE51bWJlciBvZiBkaXNjb250aW51b3VzIGNvbnZlcnNpb25zLgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgQURDX0NGR1JfRElTQ09OVElOVU9VU19OVU0oX19OQlJfRElTQ09OVElOVU9VU19DT05WX18pIFwKKyAgKCgoX19OQlJfRElTQ09OVElOVU9VU19DT05WX18pLTFVTCkgPDwgQURDX0NGR1JfRElTQ05VTV9Qb3MpCisKKy8qKgorICogQGJyaWVmIENvbmZpZ3VyZSB0aGUgQURDIGF1dG8gZGVsYXkgbW9kZS4KKyAqIEBwYXJhbSBfX0FVVE9XQUlUX18gQXV0byBkZWxheSBiaXQgZW5hYmxlIG9yIGRpc2FibGUuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBBRENfQ0ZHUl9BVVRPV0FJVChfX0FVVE9XQUlUX18pICgoX19BVVRPV0FJVF9fKSA8PCBBRENfQ0ZHUl9BVVRETFlfUG9zKQorCisvKioKKyAqIEBicmllZiBDb25maWd1cmUgQURDIGNvbnRpbnVvdXMgY29udmVyc2lvbiBtb2RlLgorICogQHBhcmFtIF9fQ09OVElOVU9VU19NT0RFX18gQ29udGludW91cyBtb2RlLgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgQURDX0NGR1JfQ09OVElOVU9VUyhfX0NPTlRJTlVPVVNfTU9ERV9fKSBcCisgICgoX19DT05USU5VT1VTX01PREVfXykgPDwgQURDX0NGR1JfQ09OVF9Qb3MpCisKKy8qKgorICogQGJyaWVmIENvbmZpZ3VyZSB0aGUgQURDIERNQSBjb250aW51b3VzIHJlcXVlc3QuCisgKiBAcGFyYW0gX19ETUFDT05UUkVRX01PREVfXyBETUEgY29udGludW91cyByZXF1ZXN0IG1vZGUuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBBRENfQ0ZHUl9ETUFDT05UUkVRKF9fRE1BQ09OVFJFUV9NT0RFX18pIFwKKyAgKChfX0RNQUNPTlRSRVFfTU9ERV9fKSA8PCBBRENfQ0ZHUl9ETUFDRkdfUG9zKQorCisjaWYgZGVmaW5lZChBRENfTVVMVElNT0RFX1NVUFBPUlQpCisvKioKKyAqIEBicmllZiBDb25maWd1cmUgdGhlIEFEQyBETUEgY29udGludW91cyByZXF1ZXN0IGZvciBBREMgbXVsdGltb2RlLgorICogQHBhcmFtIF9fRE1BQ09OVFJFUV9NT0RFX18gRE1BIGNvbnRpbnVvdXMgcmVxdWVzdCBtb2RlLgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgQURDX0NDUl9NVUxUSV9ETUFDT05UUkVRKF9fRE1BQ09OVFJFUV9NT0RFX18pIFwKKyAgKChfX0RNQUNPTlRSRVFfTU9ERV9fKSA8PCBBRENfQ0NSX0RNQUNGR19Qb3MpCisjZW5kaWYgLyogQURDX01VTFRJTU9ERV9TVVBQT1JUICovCisKKy8qKgorICogQGJyaWVmIFNoaWZ0IHRoZSBvZmZzZXQgd2l0aCByZXNwZWN0IHRvIHRoZSBzZWxlY3RlZCBBREMgcmVzb2x1dGlvbi4KKyAqIEBub3RlICAgT2Zmc2V0IGhhcyB0byBiZSBsZWZ0LWFsaWduZWQgb24gYml0IDExLCB0aGUgTFNCIChyaWdodCBiaXRzKSBhcmUgc2V0CisgKiB0byAwLiBJZiByZXNvbHV0aW9uIDEyIGJpdHMsIG5vIHNoaWZ0LiBJZiByZXNvbHV0aW9uIDEwIGJpdHMsIHNoaWZ0IG9mIDIKKyAqIHJhbmtzIG9uIHRoZSBsZWZ0LiBJZiByZXNvbHV0aW9uIDggYml0cywgc2hpZnQgb2YgNCByYW5rcyBvbiB0aGUgbGVmdC4gSWYKKyAqIHJlc29sdXRpb24gNiBiaXRzLCBzaGlmdCBvZiA2IHJhbmtzIG9uIHRoZSBsZWZ0LiBUaGVyZWZvcmUsIHNoaWZ0ID0gKDEyIC0KKyAqIHJlc29sdXRpb24pID0gMTIgLSAoMTItICgoKFJFU1sxOjBdKSA+PiAzKSoyKSkuCisgKiBAcGFyYW0gX19IQU5ETEVfXyBBREMgaGFuZGxlCisgKiBAcGFyYW0gX19PRkZTRVRfXyBWYWx1ZSB0byBiZSBzaGlmdGVkCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBBRENfT0ZGU0VUX1NISUZUX1JFU09MVVRJT04oX19IQU5ETEVfXywgX19PRkZTRVRfXykgICAgICAgICAgICAgICAgICBcCisgICgoX19PRkZTRVRfXykgPDwgKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0ZHUiAmIEFEQ19DRkdSX1JFUykgPj4gM1VMKSAqIFwKKyAgICAgICAgICAgICAgICAgICAgMlVMKSkKKworLyoqCisgKiBAYnJpZWYgU2hpZnQgdGhlIEFXRDEgdGhyZXNob2xkIHdpdGggcmVzcGVjdCB0byB0aGUgc2VsZWN0ZWQgQURDIHJlc29sdXRpb24uCisgKiBAbm90ZSAgVGhyZXNob2xkcyBoYXZlIHRvIGJlIGxlZnQtYWxpZ25lZCBvbiBiaXQgMTEsIHRoZSBMU0IgKHJpZ2h0IGJpdHMpIGFyZQorICogc2V0IHRvIDAuIElmIHJlc29sdXRpb24gMTIgYml0cywgbm8gc2hpZnQuIElmIHJlc29sdXRpb24gMTAgYml0cywgc2hpZnQgb2YgMgorICogcmFua3Mgb24gdGhlIGxlZnQuIElmIHJlc29sdXRpb24gOCBiaXRzLCBzaGlmdCBvZiA0IHJhbmtzIG9uIHRoZSBsZWZ0LiBJZgorICogcmVzb2x1dGlvbiA2IGJpdHMsIHNoaWZ0IG9mIDYgcmFua3Mgb24gdGhlIGxlZnQuIFRoZXJlZm9yZSwgc2hpZnQgPSAoMTIgLQorICogcmVzb2x1dGlvbikgPSAxMiAtICgxMi0gKCgoUkVTWzE6MF0pID4+IDMpKjIpKS4KKyAqIEBwYXJhbSBfX0hBTkRMRV9fIEFEQyBoYW5kbGUKKyAqIEBwYXJhbSBfX1RIUkVTSE9MRF9fIFZhbHVlIHRvIGJlIHNoaWZ0ZWQKKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIEFEQ19BV0QxVEhSRVNIT0xEX1NISUZUX1JFU09MVVRJT04oX19IQU5ETEVfXywgX19USFJFU0hPTERfXykgXAorICAoKF9fVEhSRVNIT0xEX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIDw8ICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNGR1IgJiBBRENfQ0ZHUl9SRVMpID4+IDNVTCkgKiAyVUwpKQorCisvKioKKyAqIEBicmllZiBTaGlmdCB0aGUgQVdEMiBhbmQgQVdEMyB0aHJlc2hvbGQgd2l0aCByZXNwZWN0IHRvIHRoZSBzZWxlY3RlZCBBREMKKyAqIHJlc29sdXRpb24uCisgKiBAbm90ZSAgVGhyZXNob2xkcyBoYXZlIHRvIGJlIGxlZnQtYWxpZ25lZCBvbiBiaXQgNy4KKyAqICAgICAgICBJZiByZXNvbHV0aW9uIDEyIGJpdHMsIHNoaWZ0IG9mIDQgcmFua3Mgb24gdGhlIHJpZ2h0ICh0aGUgNCBMU0IgYXJlCisgKiBkaXNjYXJkZWQpLiBJZiByZXNvbHV0aW9uIDEwIGJpdHMsIHNoaWZ0IG9mIDIgcmFua3Mgb24gdGhlIHJpZ2h0ICh0aGUgMiBMU0IKKyAqIGFyZSBkaXNjYXJkZWQpLiBJZiByZXNvbHV0aW9uIDggYml0cywgbm8gc2hpZnQuIElmIHJlc29sdXRpb24gNiBiaXRzLCBzaGlmdAorICogb2YgMiByYW5rcyBvbiB0aGUgbGVmdCAodGhlIDIgTFNCIGFyZSBzZXQgdG8gMCkuCisgKiBAcGFyYW0gX19IQU5ETEVfXyBBREMgaGFuZGxlCisgKiBAcGFyYW0gX19USFJFU0hPTERfXyBWYWx1ZSB0byBiZSBzaGlmdGVkCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBBRENfQVdEMjNUSFJFU0hPTERfU0hJRlRfUkVTT0xVVElPTihfX0hBTkRMRV9fLCBfX1RIUkVTSE9MRF9fKSAgICAgICAgXAorICAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DRkdSICYgQURDX0NGR1JfUkVTKSAhPSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChBRENfQ0ZHUl9SRVNfMSB8IEFEQ19DRkdSX1JFU18wKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgID8gKChfX1RIUkVTSE9MRF9fKSA+PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICgoNFVMIC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0ZHUiAmIEFEQ19DRkdSX1JFUykgPj4gM1VMKSAqIDJVTCkpICYgXAorICAgICAgICAgICAweDFGVUwpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIDogKChfX1RIUkVTSE9MRF9fKSA8PCAyVUwpKQorCisvKioKKyAqIEBicmllZiBDbGVhciBDb21tb24gQ29udHJvbCBSZWdpc3Rlci4KKyAqIEBwYXJhbSBfX0hBTkRMRV9fIEFEQyBoYW5kbGUuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2lmIGRlZmluZWQoQURDX01VTFRJTU9ERV9TVVBQT1JUKQorI2RlZmluZSBBRENfQ0xFQVJfQ09NTU9OX0NPTlRST0xfUkVHSVNURVIoX19IQU5ETEVfXykgICAgICAgICAgICAgICBcCisgIENMRUFSX0JJVChfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoKF9fSEFORExFX18pLT5JbnN0YW5jZSktPkNDUiwgIFwKKyAgICAgICAgICAgIEFEQ19DQ1JfQ0tNT0RFIHwgQURDX0NDUl9QUkVTQyB8IEFEQ19DQ1JfVkJBVFNFTCB8ICAgICAgXAorICAgICAgICAgICAgICAgIEFEQ19DQ1JfVlNFTlNFU0VMIHwgQURDX0NDUl9WUkVGRU4gfCBBRENfQ0NSX01ETUEgfCBcCisgICAgICAgICAgICAgICAgQURDX0NDUl9ETUFDRkcgfCBBRENfQ0NSX0RFTEFZIHwgQURDX0NDUl9EVUFMKQorI2VuZGlmIC8qIEFEQ19NVUxUSU1PREVfU1VQUE9SVCAqLworCisjaWYgZGVmaW5lZChTVE0zMkc0NzR4eCkgfHwgZGVmaW5lZChTVE0zMkc0ODR4eCkgfHwgZGVmaW5lZChTVE0zMkc0NzN4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJHNDgzeHgpCisvKioKKyAqIEBicmllZiBTZXQgaGFuZGxlIGluc3RhbmNlIG9mIHRoZSBBREMgc2xhdmUgYXNzb2NpYXRlZCB0byB0aGUgQURDIG1hc3Rlci4KKyAqIEBwYXJhbSBfX0hBTkRMRV9NQVNURVJfXyBBREMgbWFzdGVyIGhhbmRsZS4KKyAqIEBwYXJhbSBfX0hBTkRMRV9TTEFWRV9fIEFEQyBzbGF2ZSBoYW5kbGUuCisgKiBAbm90ZSBpZiBfX0hBTkRMRV9NQVNURVJfXyBpcyB0aGUgaGFuZGxlIG9mIGEgc2xhdmUgQURDIG9yIGFuIGluZGVwZW5kZW50CisgKiBBREMsIF9fSEFORExFX1NMQVZFX18gaW5zdGFuY2UgaXMgc2V0IHRvIE5VTEwuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBBRENfTVVMVElfU0xBVkUoX19IQU5ETEVfTUFTVEVSX18sIF9fSEFORExFX1NMQVZFX18pIFwKKyAgKCgoX19IQU5ETEVfTUFTVEVSX18pLT5JbnN0YW5jZSA9PSBBREMxKSAgICAgICAgICAgICAgICAgICBcCisgICAgICAgPyAoKF9fSEFORExFX1NMQVZFX18pLT5JbnN0YW5jZSA9IEFEQzIpICAgICAgICAgICAgICAgXAorICAgOiAoKF9fSEFORExFX01BU1RFUl9fKS0+SW5zdGFuY2UgPT0gQURDMykgICAgICAgICAgICAgICAgIFwKKyAgICAgICA/ICgoX19IQU5ETEVfU0xBVkVfXyktPkluc3RhbmNlID0gQURDNCkgICAgICAgICAgICAgICBcCisgICAgICAgOiAoKF9fSEFORExFX1NMQVZFX18pLT5JbnN0YW5jZSA9IE5VTEwpKQorI2VsaWYgZGVmaW5lZChTVE0zMkc0MTF4QikgfHwgZGVmaW5lZChTVE0zMkc0MTF4QykgfHwgZGVmaW5lZChTVE0zMkc0MTR4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJHQksxQ0IpIHx8IGRlZmluZWQoU1RNMzJHNDMxeHgpIHx8IGRlZmluZWQoU1RNMzJHNDQxeHgpIHx8ICAgXAorICAgIGRlZmluZWQoU1RNMzJHNDcxeHgpIHx8IGRlZmluZWQoU1RNMzJHNDkxeHgpIHx8IGRlZmluZWQoU1RNMzJHNEExeHgpCisvKioKKyAqIEBicmllZiBTZXQgaGFuZGxlIGluc3RhbmNlIG9mIHRoZSBBREMgc2xhdmUgYXNzb2NpYXRlZCB0byB0aGUgQURDIG1hc3Rlci4KKyAqIEBwYXJhbSBfX0hBTkRMRV9NQVNURVJfXyBBREMgbWFzdGVyIGhhbmRsZS4KKyAqIEBwYXJhbSBfX0hBTkRMRV9TTEFWRV9fIEFEQyBzbGF2ZSBoYW5kbGUuCisgKiBAbm90ZSBpZiBfX0hBTkRMRV9NQVNURVJfXyBpcyB0aGUgaGFuZGxlIG9mIGEgc2xhdmUgQURDIG9yIGFuIGluZGVwZW5kZW50CisgKiBBREMsIF9fSEFORExFX1NMQVZFX18gaW5zdGFuY2UgaXMgc2V0IHRvIE5VTEwuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBBRENfTVVMVElfU0xBVkUoX19IQU5ETEVfTUFTVEVSX18sIF9fSEFORExFX1NMQVZFX18pIFwKKyAgKCgoX19IQU5ETEVfTUFTVEVSX18pLT5JbnN0YW5jZSA9PSBBREMxKSAgICAgICAgICAgICAgICAgICBcCisgICAgICAgPyAoKF9fSEFORExFX1NMQVZFX18pLT5JbnN0YW5jZSA9IEFEQzIpICAgICAgICAgICAgICAgXAorICAgICAgIDogKChfX0hBTkRMRV9TTEFWRV9fKS0+SW5zdGFuY2UgPSBOVUxMKSkKKyNlbmRpZiAvKiBTVE0zMkc0eHggKi8KKworLyoqCisgKiBAYnJpZWYgVmVyaWZ5IHRoZSBBREMgaW5zdGFuY2UgY29ubmVjdGVkIHRvIHRoZSB0ZW1wZXJhdHVyZSBzZW5zb3IuCisgKiBAcGFyYW0gX19IQU5ETEVfXyBBREMgaGFuZGxlLgorICogQHJldHZhbCBTRVQgKEFEQyBpbnN0YW5jZSBpcyB2YWxpZCkgb3IgUkVTRVQgKEFEQyBpbnN0YW5jZSBpcyBpbnZhbGlkKQorICovCisjaWYgZGVmaW5lZChTVE0zMkc0NzR4eCkgfHwgZGVmaW5lZChTVE0zMkc0ODR4eCkgfHwgZGVmaW5lZChTVE0zMkc0NzN4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJHNDgzeHgpCisjZGVmaW5lIEFEQ19URU1QRVJBVFVSRV9TRU5TT1JfSU5TVEFOQ0UoX19IQU5ETEVfXykgXAorICAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSBBREMxKSB8fCAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09IEFEQzUpKQorI2VsaWYgZGVmaW5lZChTVE0zMkc0MTF4QikgfHwgZGVmaW5lZChTVE0zMkc0MTF4QykgfHwgZGVmaW5lZChTVE0zMkc0MTR4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJHQksxQ0IpIHx8IGRlZmluZWQoU1RNMzJHNDMxeHgpIHx8IGRlZmluZWQoU1RNMzJHNDQxeHgpIHx8ICAgXAorICAgIGRlZmluZWQoU1RNMzJHNDcxeHgpIHx8IGRlZmluZWQoU1RNMzJHNDkxeHgpIHx8IGRlZmluZWQoU1RNMzJHNEExeHgpCisjZGVmaW5lIEFEQ19URU1QRVJBVFVSRV9TRU5TT1JfSU5TVEFOQ0UoX19IQU5ETEVfXykgXAorICAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09IEFEQzEpCisjZW5kaWYgLyogZGVmaW5lZChTVE0zMkc0NzR4eCkgfHwgZGVmaW5lZChTVE0zMkc0ODR4eCkgfHwgZGVmaW5lZChTVE0zMkc0NzN4eCkgXAorICAgICAgICAgIHx8IGRlZmluZWQoU1RNMzJHNDgzeHgpICovCisKKy8qKgorICogQGJyaWVmIFZlcmlmeSB0aGUgQURDIGluc3RhbmNlIGNvbm5lY3RlZCB0byB0aGUgYmF0dGVyeSB2b2x0YWdlIFZCQVQuCisgKiBAcGFyYW0gX19IQU5ETEVfXyBBREMgaGFuZGxlLgorICogQHJldHZhbCBTRVQgKEFEQyBpbnN0YW5jZSBpcyB2YWxpZCkgb3IgUkVTRVQgKEFEQyBpbnN0YW5jZSBpcyBpbnZhbGlkKQorICovCisjaWYgZGVmaW5lZChTVE0zMkc0NzR4eCkgfHwgZGVmaW5lZChTVE0zMkc0ODR4eCkgfHwgZGVmaW5lZChTVE0zMkc0NzN4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJHNDgzeHgpCisjZGVmaW5lIEFEQ19CQVRURVJZX1ZPTFRBR0VfSU5TVEFOQ0UoX19IQU5ETEVfXykgXAorICAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlKSAhPSBBREMyKSB8fCAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpICE9IEFEQzQpKQorI2VsaWYgZGVmaW5lZChTVE0zMkc0MTF4QikgfHwgZGVmaW5lZChTVE0zMkc0MTF4QykgfHwgZGVmaW5lZChTVE0zMkc0MTR4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJHQksxQ0IpIHx8IGRlZmluZWQoU1RNMzJHNDMxeHgpIHx8IGRlZmluZWQoU1RNMzJHNDQxeHgpIHx8ICAgXAorICAgIGRlZmluZWQoU1RNMzJHNDcxeHgpCisjZGVmaW5lIEFEQ19CQVRURVJZX1ZPTFRBR0VfSU5TVEFOQ0UoX19IQU5ETEVfXykgXAorICAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpICE9IEFEQzIpCisjZWxpZiBkZWZpbmVkKFNUTTMyRzQ5MXh4KSB8fCBkZWZpbmVkKFNUTTMyRzRBMXh4KQorI2RlZmluZSBBRENfQkFUVEVSWV9WT0xUQUdFX0lOU1RBTkNFKF9fSEFORExFX18pIFwKKyAgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSBBREMxKQorI2VuZGlmIC8qIFNUTTMyRzR4eCAqLworCisvKioKKyAqIEBicmllZiBWZXJpZnkgdGhlIEFEQyBpbnN0YW5jZSBjb25uZWN0ZWQgdG8gdGhlIGludGVybmFsIHZvbHRhZ2UgcmVmZXJlbmNlCisgKiBWUkVGSU5ULgorICogQHBhcmFtIF9fSEFORExFX18gQURDIGhhbmRsZS4KKyAqIEByZXR2YWwgU0VUIChBREMgaW5zdGFuY2UgaXMgdmFsaWQpIG9yIFJFU0VUIChBREMgaW5zdGFuY2UgaXMgaW52YWxpZCkKKyAqLworI2RlZmluZSBBRENfVlJFRklOVF9JTlNUQU5DRShfX0hBTkRMRV9fKSAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpICE9IEFEQzIpCisKKy8qKgorICogQGJyaWVmIFZlcmlmeSB0aGUgbGVuZ3RoIG9mIHNjaGVkdWxlZCBpbmplY3RlZCBjb252ZXJzaW9ucyBncm91cC4KKyAqIEBwYXJhbSBfX0xFTkdUSF9fIG51bWJlciBvZiBwcm9ncmFtbWVkIGNvbnZlcnNpb25zLgorICogQHJldHZhbCBTRVQgKF9fTEVOR1RIX18gaXMgd2l0aGluIHRoZSBtYXhpbXVtIG51bWJlciBvZiBwb3NzaWJsZSBwcm9ncmFtbWFibGUKKyAqIGluamVjdGVkIGNvbnZlcnNpb25zKSBvciBSRVNFVCAoX19MRU5HVEhfXyBpcyBudWxsIG9yIHRvbyBsYXJnZSkKKyAqLworI2RlZmluZSBJU19BRENfSU5KRUNURURfTkJfQ09OVihfX0xFTkdUSF9fKSBcCisgICgoKF9fTEVOR1RIX18pID49ICgxVSkpICYmICgoX19MRU5HVEhfXykgPD0gKDRVKSkpCisKKy8qKgorICogQGJyaWVmIENhbGlicmF0aW9uIGZhY3RvciBzaXplIHZlcmlmaWNhdGlvbiAoNyBiaXRzIG1heGltdW0pLgorICogQHBhcmFtIF9fQ0FMSUJSQVRJT05fRkFDVE9SX18gQ2FsaWJyYXRpb24gZmFjdG9yIHZhbHVlLgorICogQHJldHZhbCBTRVQgKF9fQ0FMSUJSQVRJT05fRkFDVE9SX18gaXMgd2l0aGluIHRoZSBhdXRob3JpemVkIHNpemUpIG9yIFJFU0VUCisgKiAoX19DQUxJQlJBVElPTl9GQUNUT1JfXyBpcyB0b28gbGFyZ2UpCisgKi8KKyNkZWZpbmUgSVNfQURDX0NBTEZBQ1QoX19DQUxJQlJBVElPTl9GQUNUT1JfXykgXAorICAoKF9fQ0FMSUJSQVRJT05fRkFDVE9SX18pIDw9ICgweDdGVSkpCisKKy8qKgorICogQGJyaWVmIFZlcmlmeSB0aGUgQURDIGNoYW5uZWwgc2V0dGluZy4KKyAqIEBwYXJhbSBfX0hBTkRMRV9fIEFEQyBoYW5kbGUuCisgKiBAcGFyYW0gX19DSEFOTkVMX18gcHJvZ3JhbW1lZCBBREMgY2hhbm5lbC4KKyAqIEByZXR2YWwgU0VUIChfX0NIQU5ORUxfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fQ0hBTk5FTF9fIGlzIGludmFsaWQpCisgKi8KKyNpZiBkZWZpbmVkKFNUTTMyRzQ3NHh4KSB8fCBkZWZpbmVkKFNUTTMyRzQ4NHh4KSB8fCBkZWZpbmVkKFNUTTMyRzQ3M3h4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkc0ODN4eCkKKyNkZWZpbmUgSVNfQURDX0NIQU5ORUwoX19IQU5ETEVfXywgX19DSEFOTkVMX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMCkgfHwgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMSkgfHwgICAgXAorICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzIpIHx8ICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzYpIHx8ICAgIFwKKyAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF83KSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF84KSB8fCAgICBcCisgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfOSkgfHwgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMTApIHx8ICAgXAorICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzExKSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8xMikgfHwgIFwKKyAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8xNCkgfHwgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMTUpKSB8fCBcCisgICAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSBBREMxKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8zKSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF80KSB8fCAgIFwKKyAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfNSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMX1ZPUEFNUDEpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF9URU1QU0VOU09SX0FEQzEpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfVkJBVCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMX1ZSRUZJTlQpKSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gQURDMikgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMykgfHwgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfNCkgfHwgICBcCisgICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzUpIHx8ICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzEzKSB8fCAgXAorICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF9WT1BBTVAyKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMTcpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMX1ZPUEFNUDNfQURDMikpKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gQURDMykgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMykgfHwgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfNCkgfHwgICBcCisgICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzUpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF9WT1BBTVAzX0FEQzMpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMTYpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMX1ZCQVQpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF9WUkVGSU5UKSkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09IEFEQzQpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzMpIHx8ICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzQpIHx8ICAgXAorICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF81KSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8xMykgfHwgIFwKKyAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMTYpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMX1ZPUEFNUDYpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF9WUkVGSU5UKSkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09IEFEQzUpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMX1ZPUEFNUDUpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF9URU1QU0VOU09SX0FEQzUpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfVk9QQU1QNCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzEzKSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8xNikgfHwgXAorICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF9WQkFUKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfVlJFRklOVCkpKSkKKyNlbGlmIGRlZmluZWQoU1RNMzJHNDcxeHgpCisjZGVmaW5lIElTX0FEQ19DSEFOTkVMKF9fSEFORExFX18sIF9fQ0hBTk5FTF9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMCkgfHwgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMSkgfHwgICBcCisgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMikgfHwgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMykgfHwgICBcCisgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfNCkgfHwgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfNSkgfHwgICBcCisgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfNikgfHwgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfNykgfHwgICBcCisgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfOCkgfHwgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfOSkgfHwgICBcCisgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMTApIHx8ICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzExKSB8fCBcCisgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMTIpIHx8ICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzE0KSB8fCBcCisgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMTUpKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSBBREMxKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMX1ZPUEFNUDEpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMX1RFTVBTRU5TT1JfQURDMSkgfHwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMX1ZCQVQpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMX1ZSRUZJTlQpKSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSBBREMyKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzEzKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMX1ZPUEFNUDIpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzE3KSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMX1ZPUEFNUDNfQURDMikpKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSBBREMzKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMX1ZPUEFNUDNfQURDMykgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzE2KSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMX1ZCQVQpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMX1ZSRUZJTlQpKSkpCisjZWxpZiBkZWZpbmVkKFNUTTMyRzQxMXhCKSB8fCBkZWZpbmVkKFNUTTMyRzQxMXhDKSB8fCBkZWZpbmVkKFNUTTMyRzQxNHh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkdCSzFDQikgfHwgZGVmaW5lZChTVE0zMkc0MzF4eCkgfHwgZGVmaW5lZChTVE0zMkc0NDF4eCkKKyNkZWZpbmUgSVNfQURDX0NIQU5ORUwoX19IQU5ETEVfXywgX19DSEFOTkVMX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8wKSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8xKSB8fCAgIFwKKyAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8yKSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8zKSB8fCAgIFwKKyAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF80KSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF81KSB8fCAgIFwKKyAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF82KSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF83KSB8fCAgIFwKKyAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF84KSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF85KSB8fCAgIFwKKyAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8xMCkgfHwgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMTEpIHx8IFwKKyAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8xMikgfHwgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMTQpIHx8IFwKKyAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8xNSkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09IEFEQzEpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfVk9QQU1QMSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfVEVNUFNFTlNPUl9BREMxKSB8fCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfVkJBVCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfVlJFRklOVCkpKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09IEFEQzIpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMTMpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfVk9QQU1QMikgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMTcpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfVk9QQU1QM19BREMyKSkpKQorI2VsaWYgZGVmaW5lZChTVE0zMkc0OTF4eCkgfHwgZGVmaW5lZChTVE0zMkc0QTF4eCkKKyNkZWZpbmUgSVNfQURDX0NIQU5ORUwoX19IQU5ETEVfXywgX19DSEFOTkVMX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8wKSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8xKSB8fCAgIFwKKyAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8yKSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8zKSB8fCAgIFwKKyAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF80KSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF81KSB8fCAgIFwKKyAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF82KSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF83KSB8fCAgIFwKKyAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF84KSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF85KSB8fCAgIFwKKyAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8xMCkgfHwgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMTEpIHx8IFwKKyAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8xMikgfHwgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMTQpIHx8IFwKKyAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8xNSkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09IEFEQzEpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfVk9QQU1QMSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfVEVNUFNFTlNPUl9BREMxKSB8fCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfVkJBVCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfVlJFRklOVCkpKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09IEFEQzIpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMTMpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfVk9QQU1QMikgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMTcpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfVk9QQU1QM19BREMyKSkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09IEFEQzMpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfVk9QQU1QM19BREMzKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMTYpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfVk9QQU1QNikgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfVlJFRklOVCkpKSkKKyNlbmRpZiAvKiBkZWZpbmVkKFNUTTMyRzQ3NHh4KSB8fCBkZWZpbmVkKFNUTTMyRzQ4NHh4KSB8fCBkZWZpbmVkKFNUTTMyRzQ3M3h4KSBcCisgICAgICAgICAgfHwgZGVmaW5lZChTVE0zMkc0ODN4eCkgKi8KKworLyoqCisgKiBAYnJpZWYgVmVyaWZ5IHRoZSBBREMgY2hhbm5lbCBzZXR0aW5nIGluIGRpZmZlcmVudGlhbCBtb2RlLgorICogQHBhcmFtIF9fSEFORExFX18gQURDIGhhbmRsZS4KKyAqIEBwYXJhbSBfX0NIQU5ORUxfXyBwcm9ncmFtbWVkIEFEQyBjaGFubmVsLgorICogQHJldHZhbCBTRVQgKF9fQ0hBTk5FTF9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19DSEFOTkVMX18gaXMgaW52YWxpZCkKKyAqLworI2lmIGRlZmluZWQoU1RNMzJHNDc0eHgpIHx8IGRlZmluZWQoU1RNMzJHNDg0eHgpIHx8IGRlZmluZWQoU1RNMzJHNDczeHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRzQ4M3h4KQorI2RlZmluZSBJU19BRENfRElGRl9DSEFOTkVMKF9fSEFORExFX18sIF9fQ0hBTk5FTF9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8xKSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF82KSB8fCAgICBcCisgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfNykgfHwgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfOCkgfHwgICAgXAorICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzkpIHx8ICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzEwKSB8fCAgIFwKKyAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8xMSkgfHwgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMTQpKSB8fCBcCisgICAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSBBREMxKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8yKSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8zKSB8fCAgIFwKKyAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfNCkgfHwgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfNSkpKSB8fCBcCisgICAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSBBREMyKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8yKSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8zKSB8fCAgIFwKKyAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfNCkgfHwgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfNSkgfHwgICBcCisgICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzEyKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8xMykpKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09IEFEQzMpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzIpIHx8ICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzMpIHx8ICAgXAorICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF80KSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF81KSB8fCAgIFwKKyAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMTUpKSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSBBREM0KSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8yKSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8zKSB8fCAgIFwKKyAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfNCkgfHwgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfNSkgfHwgICBcCisgICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzEyKSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8xMykgfHwgXAorICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8xNSkpKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09IEFEQzUpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzEyKSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8xMykgfHwgXAorICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8xNSkpKSkKKyNlbGlmIGRlZmluZWQoU1RNMzJHNDcxeHgpIHx8IGRlZmluZWQoU1RNMzJHNDkxeHgpIHx8IGRlZmluZWQoU1RNMzJHNEExeHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRzQxMXhDKQorI2RlZmluZSBJU19BRENfRElGRl9DSEFOTkVMKF9fSEFORExFX18sIF9fQ0hBTk5FTF9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8xKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzIpIHx8ICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzMpIHx8ICAgXAorICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF80KSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF81KSB8fCAgIFwKKyAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfNikgfHwgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfNykgfHwgICBcCisgICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzgpIHx8ICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzkpIHx8ICAgXAorICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8xMCkgfHwgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMTEpIHx8IFwKKyAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMTQpKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gQURDMikgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMTIpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzEzKSkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gQURDMykgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8xNSkpKSkKKyNlbGlmIGRlZmluZWQoU1RNMzJHNDExeEIpIHx8IGRlZmluZWQoU1RNMzJHNDE0eHgpIHx8IGRlZmluZWQoU1RNMzJHQksxQ0IpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRzQzMXh4KSB8fCBkZWZpbmVkKFNUTTMyRzQ0MXh4KQorI2RlZmluZSBJU19BRENfRElGRl9DSEFOTkVMKF9fSEFORExFX18sIF9fQ0hBTk5FTF9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8xKSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8yKSB8fCAgICBcCisgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMykgfHwgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfNCkgfHwgICAgXAorICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzUpIHx8ICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzYpIHx8ICAgIFwKKyAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF83KSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF84KSB8fCAgICBcCisgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfOSkgfHwgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMTApIHx8ICAgXAorICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzExKSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8xNCkpIHx8IFwKKyAgICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09IEFEQzIpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzEyKSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8xMykpKSkKKyNlbmRpZiAvKiBTVE0zMkc0eHggKi8KKworLyoqCisgKiBAYnJpZWYgVmVyaWZ5IHRoZSBBREMgc2luZ2xlLWVuZGVkIGlucHV0IG9yIGRpZmZlcmVudGlhbCBtb2RlIHNldHRpbmcuCisgKiBAcGFyYW0gX19TSU5HX0RJRkZfXyBwcm9ncmFtbWVkIGNoYW5uZWwgc2V0dGluZy4KKyAqIEByZXR2YWwgU0VUIChfX1NJTkdfRElGRl9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19TSU5HX0RJRkZfXyBpcyBpbnZhbGlkKQorICovCisjZGVmaW5lIElTX0FEQ19TSU5HTEVfRElGRkVSRU5USUFMKF9fU0lOR19ESUZGX18pIFwKKyAgKCgoX19TSU5HX0RJRkZfXykgPT0gQURDX1NJTkdMRV9FTkRFRCkgfHwgICAgICAgXAorICAgKChfX1NJTkdfRElGRl9fKSA9PSBBRENfRElGRkVSRU5USUFMX0VOREVEKSkKKworLyoqCisgKiBAYnJpZWYgVmVyaWZ5IHRoZSBBREMgb2Zmc2V0IG1hbmFnZW1lbnQgc2V0dGluZy4KKyAqIEBwYXJhbSBfX09GRlNFVF9OVU1CRVJfXyBBREMgb2Zmc2V0IG1hbmFnZW1lbnQuCisgKiBAcmV0dmFsIFNFVCAoX19PRkZTRVRfTlVNQkVSX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX09GRlNFVF9OVU1CRVJfXyBpcworICogaW52YWxpZCkKKyAqLworI2RlZmluZSBJU19BRENfT0ZGU0VUX05VTUJFUihfX09GRlNFVF9OVU1CRVJfXykgXAorICAoKChfX09GRlNFVF9OVU1CRVJfXykgPT0gQURDX09GRlNFVF9OT05FKSB8fCAgXAorICAgKChfX09GRlNFVF9OVU1CRVJfXykgPT0gQURDX09GRlNFVF8xKSB8fCAgICAgXAorICAgKChfX09GRlNFVF9OVU1CRVJfXykgPT0gQURDX09GRlNFVF8yKSB8fCAgICAgXAorICAgKChfX09GRlNFVF9OVU1CRVJfXykgPT0gQURDX09GRlNFVF8zKSB8fCAgICAgXAorICAgKChfX09GRlNFVF9OVU1CRVJfXykgPT0gQURDX09GRlNFVF80KSkKKworLyoqCisgKiBAYnJpZWYgVmVyaWZ5IHRoZSBBREMgb2Zmc2V0IHNpZ24gc2V0dGluZy4KKyAqIEBwYXJhbSBfX09GRlNFVF9TSUdOX18gQURDIG9mZnNldCBzaWduLgorICogQHJldHZhbCBTRVQgKF9fT0ZGU0VUX1NJR05fXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fT0ZGU0VUX1NJR05fXyBpcyBpbnZhbGlkKQorICovCisjZGVmaW5lIElTX0FEQ19PRkZTRVRfU0lHTihfX09GRlNFVF9TSUdOX18pICAgICAgICAgICBcCisgICgoKF9fT0ZGU0VUX1NJR05fXykgPT0gQURDX09GRlNFVF9TSUdOX05FR0FUSVZFKSB8fCBcCisgICAoKF9fT0ZGU0VUX1NJR05fXykgPT0gQURDX09GRlNFVF9TSUdOX1BPU0lUSVZFKSkKKworLyoqCisgKiBAYnJpZWYgVmVyaWZ5IHRoZSBBREMgaW5qZWN0ZWQgY2hhbm5lbCBzZXR0aW5nLgorICogQHBhcmFtIF9fQ0hBTk5FTF9fIHByb2dyYW1tZWQgQURDIGluamVjdGVkIGNoYW5uZWwuCisgKiBAcmV0dmFsIFNFVCAoX19DSEFOTkVMX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0NIQU5ORUxfXyBpcyBpbnZhbGlkKQorICovCisjZGVmaW5lIElTX0FEQ19JTkpFQ1RFRF9SQU5LKF9fQ0hBTk5FTF9fKSAgICBcCisgICgoKF9fQ0hBTk5FTF9fKSA9PSBBRENfSU5KRUNURURfUkFOS18xKSB8fCBcCisgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfSU5KRUNURURfUkFOS18yKSB8fCBcCisgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfSU5KRUNURURfUkFOS18zKSB8fCBcCisgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfSU5KRUNURURfUkFOS180KSkKKworLyoqCisgKiBAYnJpZWYgVmVyaWZ5IHRoZSBBREMgaW5qZWN0ZWQgY29udmVyc2lvbnMgZXh0ZXJuYWwgdHJpZ2dlci4KKyAqIEBwYXJhbSBfX0hBTkRMRV9fIEFEQyBoYW5kbGUuCisgKiBAcGFyYW0gX19JTkpUUklHX18gcHJvZ3JhbW1lZCBBREMgaW5qZWN0ZWQgY29udmVyc2lvbnMgZXh0ZXJuYWwgdHJpZ2dlci4KKyAqIEByZXR2YWwgU0VUIChfX0lOSlRSSUdfXyBpcyBhIHZhbGlkIHZhbHVlKSBvciBSRVNFVCAoX19JTkpUUklHX18gaXMgaW52YWxpZCkKKyAqLworI2lmIGRlZmluZWQoU1RNMzJHNDc0eHgpIHx8IGRlZmluZWQoU1RNMzJHNDg0eHgpCisjZGVmaW5lIElTX0FEQ19FWFRUUklHSU5KRUMoX19IQU5ETEVfXywgX19JTkpUUklHX18pICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDFfVFJHTykgfHwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDFfVFJHTzIpIHx8ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDFfQ0M0KSB8fCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDJfVFJHTykgfHwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDNfVFJHTykgfHwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDRfVFJHTykgfHwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDZfVFJHTykgfHwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDdfVFJHTykgfHwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDhfVFJHTykgfHwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDhfVFJHTzIpIHx8ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDhfQ0M0KSB8fCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDE1X1RSR08pIHx8ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDIwX1RSR08pIHx8ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDIwX1RSR08yKSB8fCAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfSFJUSU1fVFJHMikgfHwgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfSFJUSU1fVFJHNCkgfHwgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfSFJUSU1fVFJHNSkgfHwgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfSFJUSU1fVFJHNikgfHwgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfSFJUSU1fVFJHNykgfHwgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfSFJUSU1fVFJHOCkgfHwgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfSFJUSU1fVFJHOSkgfHwgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfSFJUSU1fVFJHMTApIHx8ICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfTFBUSU1fT1VUKSB8fCAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlID09IEFEQzEpIHx8ICgoX19IQU5ETEVfXyktPkluc3RhbmNlID09IEFEQzIpKSAmJiBcCisgICAgKCgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UMl9DQzEpIHx8ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UM19DQzEpIHx8ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UM19DQzMpIHx8ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UM19DQzQpIHx8ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UMTZfQ0MxKSB8fCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UMjBfQ0M0KSB8fCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19FWFRfSVQxNSkpKSB8fCAgICAgICAgICAgICAgICAgICBcCisgICAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlID09IEFEQzMpIHx8ICgoX19IQU5ETEVfXyktPkluc3RhbmNlID09IEFEQzQpIHx8ICBcCisgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlID09IEFEQzUpKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UMV9DQzMpIHx8ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UNF9DQzMpIHx8ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UNF9DQzQpIHx8ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UOF9DQzIpIHx8ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UMjBfQ0MyKSB8fCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19IUlRJTV9UUkcxKSB8fCAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19IUlRJTV9UUkczKSB8fCAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19FWFRfSVQzKSkpIHx8ICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfSU5KRUNURURfU09GVFdBUkVfU1RBUlQpKQorI2VsaWYgZGVmaW5lZChTVE0zMkc0NzN4eCkgfHwgZGVmaW5lZChTVE0zMkc0ODN4eCkKKyNkZWZpbmUgSVNfQURDX0VYVFRSSUdJTkpFQyhfX0hBTkRMRV9fLCBfX0lOSlRSSUdfXykgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UMV9UUkdPKSB8fCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UMV9UUkdPMikgfHwgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UMV9DQzQpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UMl9UUkdPKSB8fCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UM19UUkdPKSB8fCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UNF9UUkdPKSB8fCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UNl9UUkdPKSB8fCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UN19UUkdPKSB8fCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UOF9UUkdPKSB8fCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UOF9UUkdPMikgfHwgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UOF9DQzQpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UMTVfVFJHTykgfHwgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UMjBfVFJHTykgfHwgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UMjBfVFJHTzIpIHx8ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19MUFRJTV9PVVQpIHx8ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gQURDMSkgfHwgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gQURDMikpICYmIFwKKyAgICAoKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QyX0NDMSkgfHwgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QzX0NDMSkgfHwgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QzX0NDMykgfHwgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QzX0NDNCkgfHwgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QxNl9DQzEpIHx8ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QyMF9DQzQpIHx8ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX0VYVF9JVDE1KSkpIHx8ICAgICAgICAgICAgICAgICAgIFwKKyAgICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gQURDMykgfHwgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gQURDNCkgfHwgIFwKKyAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gQURDNSkpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QxX0NDMykgfHwgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1Q0X0NDMykgfHwgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1Q0X0NDNCkgfHwgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1Q4X0NDMikgfHwgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QyMF9DQzIpIHx8ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX0VYVF9JVDMpKSkgfHwgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoX19JTkpUUklHX18pID09IEFEQ19JTkpFQ1RFRF9TT0ZUV0FSRV9TVEFSVCkpCisjZWxpZiBkZWZpbmVkKFNUTTMyRzQ3MXh4KQorI2RlZmluZSBJU19BRENfRVhUVFJJR0lOSkVDKF9fSEFORExFX18sIF9fSU5KVFJJR19fKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QxX1RSR08pIHx8ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QxX1RSR08yKSB8fCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QxX0NDNCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QyX1RSR08pIHx8ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QzX1RSR08pIHx8ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1Q0X1RSR08pIHx8ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1Q2X1RSR08pIHx8ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1Q3X1RSR08pIHx8ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1Q4X1RSR08pIHx8ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1Q4X1RSR08yKSB8fCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1Q4X0NDNCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QxNV9UUkdPKSB8fCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX0xQVElNX09VVCkgfHwgICAgICAgICAgICAgICAgICAgICAgXAorICAgKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBBREMxKSB8fCAoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBBREMyKSkgJiYgXAorICAgICgoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDJfQ0MxKSB8fCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDNfQ0MxKSB8fCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDNfQ0MzKSB8fCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDNfQ0M0KSB8fCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDE2X0NDMSkgfHwgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfRVhUX0lUMTUpKSkgfHwgICAgICAgICAgICAgICAgICAgXAorICAgKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBBREMzKSkgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDFfQ0MzKSB8fCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDRfQ0MzKSB8fCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDRfQ0M0KSB8fCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDhfQ0MyKSB8fCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfRVhUX0lUMykpKSB8fCAgICAgICAgICAgICAgICAgICAgXAorICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0lOSkVDVEVEX1NPRlRXQVJFX1NUQVJUKSkKKyNlbGlmIGRlZmluZWQoU1RNMzJHNDExeEIpIHx8IGRlZmluZWQoU1RNMzJHNDE0eHgpIHx8IGRlZmluZWQoU1RNMzJHQksxQ0IpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRzQzMXh4KSB8fCBkZWZpbmVkKFNUTTMyRzQ0MXh4KQorI2RlZmluZSBJU19BRENfRVhUVFJJR0lOSkVDKF9fSEFORExFX18sIF9fSU5KVFJJR19fKSAgICAgXAorICAoKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QxX1RSR08pIHx8ICAgXAorICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QxX1RSR08yKSB8fCAgXAorICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QxX0NDNCkgfHwgICAgXAorICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QyX1RSR08pIHx8ICAgXAorICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QyX0NDMSkgfHwgICAgXAorICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QzX1RSR08pIHx8ICAgXAorICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QzX0NDMSkgfHwgICAgXAorICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QzX0NDMykgfHwgICAgXAorICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QzX0NDNCkgfHwgICAgXAorICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1Q0X1RSR08pIHx8ICAgXAorICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1Q2X1RSR08pIHx8ICAgXAorICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1Q3X1RSR08pIHx8ICAgXAorICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1Q4X1RSR08pIHx8ICAgXAorICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1Q4X1RSR08yKSB8fCAgXAorICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1Q4X0NDNCkgfHwgICAgXAorICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QxNV9UUkdPKSB8fCAgXAorICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QxNl9DQzEpIHx8ICAgXAorICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX0VYVF9JVDE1KSB8fCAgXAorICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX0xQVElNX09VVCkgfHwgXAorICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0lOSkVDVEVEX1NPRlRXQVJFX1NUQVJUKSkKKyNlbGlmIGRlZmluZWQoU1RNMzJHNDkxeHgpIHx8IGRlZmluZWQoU1RNMzJHNEExeHgpIHx8IGRlZmluZWQoU1RNMzJHNDExeEMpCisjZGVmaW5lIElTX0FEQ19FWFRUUklHSU5KRUMoX19IQU5ETEVfXywgX19JTkpUUklHX18pICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDFfVFJHTykgfHwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDFfVFJHTzIpIHx8ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDFfQ0M0KSB8fCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDJfVFJHTykgfHwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDNfVFJHTykgfHwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDRfVFJHTykgfHwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDZfVFJHTykgfHwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDdfVFJHTykgfHwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDhfVFJHTykgfHwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDhfVFJHTzIpIHx8ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDhfQ0M0KSB8fCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDE1X1RSR08pIHx8ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDIwX1RSR08pIHx8ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDIwX1RSR08yKSB8fCAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfTFBUSU1fT1VUKSB8fCAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlID09IEFEQzEpIHx8ICgoX19IQU5ETEVfXyktPkluc3RhbmNlID09IEFEQzIpKSAmJiBcCisgICAgKCgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UMl9DQzEpIHx8ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UM19DQzEpIHx8ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UM19DQzMpIHx8ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UM19DQzQpIHx8ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UMTZfQ0MxKSB8fCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UMjBfQ0M0KSB8fCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19FWFRfSVQxNSkpKSB8fCAgICAgICAgICAgICAgICAgICBcCisgICAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gQURDMykgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UMV9DQzMpIHx8ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UNF9DQzMpIHx8ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UNF9DQzQpIHx8ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UOF9DQzIpIHx8ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UMjBfQ0MyKSB8fCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19FWFRfSVQzKSkpIHx8ICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfSU5KRUNURURfU09GVFdBUkVfU1RBUlQpKQorI2VuZGlmIC8qIFNUTTMyRzR4eCAqLworCisvKioKKyAqIEBicmllZiBWZXJpZnkgdGhlIEFEQyBlZGdlIHRyaWdnZXIgc2V0dGluZyBmb3IgaW5qZWN0ZWQgZ3JvdXAuCisgKiBAcGFyYW0gX19FREdFX18gcHJvZ3JhbW1lZCBBREMgZWRnZSB0cmlnZ2VyIHNldHRpbmcuCisgKiBAcmV0dmFsIFNFVCAoX19FREdFX18gaXMgYSB2YWxpZCB2YWx1ZSkgb3IgUkVTRVQgKF9fRURHRV9fIGlzIGludmFsaWQpCisgKi8KKyNkZWZpbmUgSVNfQURDX0VYVFRSSUdJTkpFQ19FREdFKF9fRURHRV9fKSAgICAgICAgICAgICAgICAgICBcCisgICgoKF9fRURHRV9fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX0VER0VfTk9ORSkgfHwgICAgXAorICAgKChfX0VER0VfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9FREdFX1JJU0lORykgfHwgIFwKKyAgICgoX19FREdFX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfRURHRV9GQUxMSU5HKSB8fCBcCisgICAoKF9fRURHRV9fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX0VER0VfUklTSU5HRkFMTElORykpCisKKyNpZiBkZWZpbmVkKEFEQ19NVUxUSU1PREVfU1VQUE9SVCkKKy8qKgorICogQGJyaWVmIFZlcmlmeSB0aGUgQURDIG11bHRpbW9kZSBzZXR0aW5nLgorICogQHBhcmFtIF9fTU9ERV9fIHByb2dyYW1tZWQgQURDIG11bHRpbW9kZSBzZXR0aW5nLgorICogQHJldHZhbCBTRVQgKF9fTU9ERV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19NT0RFX18gaXMgaW52YWxpZCkKKyAqLworI2RlZmluZSBJU19BRENfTVVMVElNT0RFKF9fTU9ERV9fKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKChfX01PREVfXykgPT0gQURDX01PREVfSU5ERVBFTkRFTlQpIHx8ICAgICAgICAgICAgICAgXAorICAgKChfX01PREVfXykgPT0gQURDX0RVQUxNT0RFX1JFR1NJTVVMVF9JTkpFQ1NJTVVMVCkgfHwgXAorICAgKChfX01PREVfXykgPT0gQURDX0RVQUxNT0RFX1JFR1NJTVVMVF9BTFRFUlRSSUcpIHx8ICAgXAorICAgKChfX01PREVfXykgPT0gQURDX0RVQUxNT0RFX1JFR0lOVEVSTF9JTkpFQ1NJTVVMVCkgfHwgXAorICAgKChfX01PREVfXykgPT0gQURDX0RVQUxNT0RFX0lOSkVDU0lNVUxUKSB8fCAgICAgICAgICAgXAorICAgKChfX01PREVfXykgPT0gQURDX0RVQUxNT0RFX1JFR1NJTVVMVCkgfHwgICAgICAgICAgICAgXAorICAgKChfX01PREVfXykgPT0gQURDX0RVQUxNT0RFX0lOVEVSTCkgfHwgICAgICAgICAgICAgICAgXAorICAgKChfX01PREVfXykgPT0gQURDX0RVQUxNT0RFX0FMVEVSVFJJRykpCisKKy8qKgorICogQGJyaWVmIFZlcmlmeSB0aGUgQURDIG11bHRpbW9kZSBETUEgYWNjZXNzIHNldHRpbmcuCisgKiBAcGFyYW0gX19NT0RFX18gcHJvZ3JhbW1lZCBBREMgbXVsdGltb2RlIERNQSBhY2Nlc3Mgc2V0dGluZy4KKyAqIEByZXR2YWwgU0VUIChfX01PREVfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fTU9ERV9fIGlzIGludmFsaWQpCisgKi8KKyNkZWZpbmUgSVNfQURDX0RNQV9BQ0NFU1NfTVVMVElNT0RFKF9fTU9ERV9fKSAgICAgIFwKKyAgKCgoX19NT0RFX18pID09IEFEQ19ETUFBQ0NFU1NNT0RFX0RJU0FCTEVEKSB8fCAgIFwKKyAgICgoX19NT0RFX18pID09IEFEQ19ETUFBQ0NFU1NNT0RFXzEyXzEwX0JJVFMpIHx8IFwKKyAgICgoX19NT0RFX18pID09IEFEQ19ETUFBQ0NFU1NNT0RFXzhfNl9CSVRTKSkKKworLyoqCisgKiBAYnJpZWYgVmVyaWZ5IHRoZSBBREMgbXVsdGltb2RlIGRlbGF5IHNldHRpbmcuCisgKiBAcGFyYW0gX19ERUxBWV9fIHByb2dyYW1tZWQgQURDIG11bHRpbW9kZSBkZWxheSBzZXR0aW5nLgorICogQHJldHZhbCBTRVQgKF9fREVMQVlfXyBpcyBhIHZhbGlkIHZhbHVlKSBvciBSRVNFVCAoX19ERUxBWV9fIGlzIGludmFsaWQpCisgKi8KKyNkZWZpbmUgSVNfQURDX1NBTVBMSU5HX0RFTEFZKF9fREVMQVlfXykgICAgICAgICAgICAgXAorICAoKChfX0RFTEFZX18pID09IEFEQ19UV09TQU1QTElOR0RFTEFZXzFDWUNMRSkgfHwgICBcCisgICAoKF9fREVMQVlfXykgPT0gQURDX1RXT1NBTVBMSU5HREVMQVlfMkNZQ0xFUykgfHwgIFwKKyAgICgoX19ERUxBWV9fKSA9PSBBRENfVFdPU0FNUExJTkdERUxBWV8zQ1lDTEVTKSB8fCAgXAorICAgKChfX0RFTEFZX18pID09IEFEQ19UV09TQU1QTElOR0RFTEFZXzRDWUNMRVMpIHx8ICBcCisgICAoKF9fREVMQVlfXykgPT0gQURDX1RXT1NBTVBMSU5HREVMQVlfNUNZQ0xFUykgfHwgIFwKKyAgICgoX19ERUxBWV9fKSA9PSBBRENfVFdPU0FNUExJTkdERUxBWV82Q1lDTEVTKSB8fCAgXAorICAgKChfX0RFTEFZX18pID09IEFEQ19UV09TQU1QTElOR0RFTEFZXzdDWUNMRVMpIHx8ICBcCisgICAoKF9fREVMQVlfXykgPT0gQURDX1RXT1NBTVBMSU5HREVMQVlfOENZQ0xFUykgfHwgIFwKKyAgICgoX19ERUxBWV9fKSA9PSBBRENfVFdPU0FNUExJTkdERUxBWV85Q1lDTEVTKSB8fCAgXAorICAgKChfX0RFTEFZX18pID09IEFEQ19UV09TQU1QTElOR0RFTEFZXzEwQ1lDTEVTKSB8fCBcCisgICAoKF9fREVMQVlfXykgPT0gQURDX1RXT1NBTVBMSU5HREVMQVlfMTFDWUNMRVMpIHx8IFwKKyAgICgoX19ERUxBWV9fKSA9PSBBRENfVFdPU0FNUExJTkdERUxBWV8xMkNZQ0xFUykpCisjZW5kaWYgLyogQURDX01VTFRJTU9ERV9TVVBQT1JUICovCisKKy8qKgorICogQGJyaWVmIFZlcmlmeSB0aGUgQURDIGFuYWxvZyB3YXRjaGRvZyBzZXR0aW5nLgorICogQHBhcmFtIF9fV0FUQ0hET0dfXyBwcm9ncmFtbWVkIEFEQyBhbmFsb2cgd2F0Y2hkb2cgc2V0dGluZy4KKyAqIEByZXR2YWwgU0VUIChfX1dBVENIRE9HX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1dBVENIRE9HX18gaXMgaW52YWxpZCkKKyAqLworI2RlZmluZSBJU19BRENfQU5BTE9HX1dBVENIRE9HX05VTUJFUihfX1dBVENIRE9HX18pIFwKKyAgKCgoX19XQVRDSERPR19fKSA9PSBBRENfQU5BTE9HV0FUQ0hET0dfMSkgfHwgICAgICBcCisgICAoKF9fV0FUQ0hET0dfXykgPT0gQURDX0FOQUxPR1dBVENIRE9HXzIpIHx8ICAgICAgXAorICAgKChfX1dBVENIRE9HX18pID09IEFEQ19BTkFMT0dXQVRDSERPR18zKSkKKworLyoqCisgKiBAYnJpZWYgVmVyaWZ5IHRoZSBBREMgYW5hbG9nIHdhdGNoZG9nIG1vZGUgc2V0dGluZy4KKyAqIEBwYXJhbSBfX1dBVENIRE9HX01PREVfXyBwcm9ncmFtbWVkIEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9kZSBzZXR0aW5nLgorICogQHJldHZhbCBTRVQgKF9fV0FUQ0hET0dfTU9ERV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19XQVRDSERPR19NT0RFX18gaXMKKyAqIGludmFsaWQpCisgKi8KKyNkZWZpbmUgSVNfQURDX0FOQUxPR19XQVRDSERPR19NT0RFKF9fV0FUQ0hET0dfTU9ERV9fKSAgICAgICAgICAgIFwKKyAgKCgoX19XQVRDSERPR19NT0RFX18pID09IEFEQ19BTkFMT0dXQVRDSERPR19OT05FKSB8fCAgICAgICAgICAgIFwKKyAgICgoX19XQVRDSERPR19NT0RFX18pID09IEFEQ19BTkFMT0dXQVRDSERPR19TSU5HTEVfUkVHKSB8fCAgICAgIFwKKyAgICgoX19XQVRDSERPR19NT0RFX18pID09IEFEQ19BTkFMT0dXQVRDSERPR19TSU5HTEVfSU5KRUMpIHx8ICAgIFwKKyAgICgoX19XQVRDSERPR19NT0RFX18pID09IEFEQ19BTkFMT0dXQVRDSERPR19TSU5HTEVfUkVHSU5KRUMpIHx8IFwKKyAgICgoX19XQVRDSERPR19NT0RFX18pID09IEFEQ19BTkFMT0dXQVRDSERPR19BTExfUkVHKSB8fCAgICAgICAgIFwKKyAgICgoX19XQVRDSERPR19NT0RFX18pID09IEFEQ19BTkFMT0dXQVRDSERPR19BTExfSU5KRUMpIHx8ICAgICAgIFwKKyAgICgoX19XQVRDSERPR19NT0RFX18pID09IEFEQ19BTkFMT0dXQVRDSERPR19BTExfUkVHSU5KRUMpKQorCisvKioKKyAqIEBicmllZiBWZXJpZnkgdGhlIEFEQyBhbmFsb2cgd2F0Y2hkb2cgZmlsdGVyaW5nIHNldHRpbmcuCisgKiBAcGFyYW0gX19GSUxURVJJTkdfTU9ERV9fIHByb2dyYW1tZWQgQURDIGFuYWxvZyB3YXRjaGRvZyBtb2RlIHNldHRpbmcuCisgKiBAcmV0dmFsIFNFVCAoX19GSUxURVJJTkdfTU9ERV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19GSUxURVJJTkdfTU9ERV9fIGlzCisgKiBpbnZhbGlkKQorICovCisjZGVmaW5lIElTX0FEQ19BTkFMT0dfV0FUQ0hET0dfRklMVEVSSU5HX01PREUoX19GSUxURVJJTkdfTU9ERV9fKSBcCisgICgoKF9fRklMVEVSSU5HX01PREVfXykgPT0gQURDX0FXRF9GSUxURVJJTkdfTk9ORSkgfHwgICAgICAgICAgICBcCisgICAoKF9fRklMVEVSSU5HX01PREVfXykgPT0gQURDX0FXRF9GSUxURVJJTkdfMlNBTVBMRVMpIHx8ICAgICAgICBcCisgICAoKF9fRklMVEVSSU5HX01PREVfXykgPT0gQURDX0FXRF9GSUxURVJJTkdfM1NBTVBMRVMpIHx8ICAgICAgICBcCisgICAoKF9fRklMVEVSSU5HX01PREVfXykgPT0gQURDX0FXRF9GSUxURVJJTkdfNFNBTVBMRVMpIHx8ICAgICAgICBcCisgICAoKF9fRklMVEVSSU5HX01PREVfXykgPT0gQURDX0FXRF9GSUxURVJJTkdfNVNBTVBMRVMpIHx8ICAgICAgICBcCisgICAoKF9fRklMVEVSSU5HX01PREVfXykgPT0gQURDX0FXRF9GSUxURVJJTkdfNlNBTVBMRVMpIHx8ICAgICAgICBcCisgICAoKF9fRklMVEVSSU5HX01PREVfXykgPT0gQURDX0FXRF9GSUxURVJJTkdfN1NBTVBMRVMpIHx8ICAgICAgICBcCisgICAoKF9fRklMVEVSSU5HX01PREVfXykgPT0gQURDX0FXRF9GSUxURVJJTkdfOFNBTVBMRVMpKQorCisvKioKKyAqIEBicmllZiBWZXJpZnkgdGhlIEFEQyBjb252ZXJzaW9uIChyZWd1bGFyIG9yIGluamVjdGVkIG9yIGJvdGgpLgorICogQHBhcmFtIF9fQ09OVkVSU0lPTl9fIEFEQyBjb252ZXJzaW9uIGdyb3VwLgorICogQHJldHZhbCBTRVQgKF9fQ09OVkVSU0lPTl9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19DT05WRVJTSU9OX18gaXMgaW52YWxpZCkKKyAqLworI2RlZmluZSBJU19BRENfQ09OVkVSU0lPTl9HUk9VUChfX0NPTlZFUlNJT05fXykgXAorICAoKChfX0NPTlZFUlNJT05fXykgPT0gQURDX1JFR1VMQVJfR1JPVVApIHx8ICAgXAorICAgKChfX0NPTlZFUlNJT05fXykgPT0gQURDX0lOSkVDVEVEX0dST1VQKSB8fCAgXAorICAgKChfX0NPTlZFUlNJT05fXykgPT0gQURDX1JFR1VMQVJfSU5KRUNURURfR1JPVVApKQorCisvKioKKyAqIEBicmllZiBWZXJpZnkgdGhlIEFEQyBldmVudCB0eXBlLgorICogQHBhcmFtIF9fRVZFTlRfXyBBREMgZXZlbnQuCisgKiBAcmV0dmFsIFNFVCAoX19FVkVOVF9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19FVkVOVF9fIGlzIGludmFsaWQpCisgKi8KKyNkZWZpbmUgSVNfQURDX0VWRU5UX1RZUEUoX19FVkVOVF9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKF9fRVZFTlRfXykgPT0gQURDX0VPU01QX0VWRU5UKSB8fCAoKF9fRVZFTlRfXykgPT0gQURDX0FXRF9FVkVOVCkgfHwgXAorICAgKChfX0VWRU5UX18pID09IEFEQ19BV0QyX0VWRU5UKSB8fCAoKF9fRVZFTlRfXykgPT0gQURDX0FXRDNfRVZFTlQpIHx8IFwKKyAgICgoX19FVkVOVF9fKSA9PSBBRENfT1ZSX0VWRU5UKSB8fCAoKF9fRVZFTlRfXykgPT0gQURDX0pRT1ZGX0VWRU5UKSkKKworLyoqCisgKiBAYnJpZWYgVmVyaWZ5IHRoZSBBREMgb3ZlcnNhbXBsaW5nIHJhdGlvLgorICogQHBhcmFtIF9fUkFUSU9fXyBwcm9ncmFtbWVkIEFEQyBvdmVyc2FtcGxpbmcgcmF0aW8uCisgKiBAcmV0dmFsIFNFVCAoX19SQVRJT19fIGlzIGEgdmFsaWQgdmFsdWUpIG9yIFJFU0VUIChfX1JBVElPX18gaXMgaW52YWxpZCkKKyAqLworI2RlZmluZSBJU19BRENfT1ZFUlNBTVBMSU5HX1JBVElPKF9fUkFUSU9fXykgICAgICBcCisgICgoKF9fUkFUSU9fXykgPT0gQURDX09WRVJTQU1QTElOR19SQVRJT18yKSB8fCAgIFwKKyAgICgoX19SQVRJT19fKSA9PSBBRENfT1ZFUlNBTVBMSU5HX1JBVElPXzQpIHx8ICAgXAorICAgKChfX1JBVElPX18pID09IEFEQ19PVkVSU0FNUExJTkdfUkFUSU9fOCkgfHwgICBcCisgICAoKF9fUkFUSU9fXykgPT0gQURDX09WRVJTQU1QTElOR19SQVRJT18xNikgfHwgIFwKKyAgICgoX19SQVRJT19fKSA9PSBBRENfT1ZFUlNBTVBMSU5HX1JBVElPXzMyKSB8fCAgXAorICAgKChfX1JBVElPX18pID09IEFEQ19PVkVSU0FNUExJTkdfUkFUSU9fNjQpIHx8ICBcCisgICAoKF9fUkFUSU9fXykgPT0gQURDX09WRVJTQU1QTElOR19SQVRJT18xMjgpIHx8IFwKKyAgICgoX19SQVRJT19fKSA9PSBBRENfT1ZFUlNBTVBMSU5HX1JBVElPXzI1NikpCisKKy8qKgorICogQGJyaWVmIFZlcmlmeSB0aGUgQURDIG92ZXJzYW1wbGluZyBzaGlmdC4KKyAqIEBwYXJhbSBfX1NISUZUX18gcHJvZ3JhbW1lZCBBREMgb3ZlcnNhbXBsaW5nIHNoaWZ0LgorICogQHJldHZhbCBTRVQgKF9fU0hJRlRfXyBpcyBhIHZhbGlkIHZhbHVlKSBvciBSRVNFVCAoX19TSElGVF9fIGlzIGludmFsaWQpCisgKi8KKyNkZWZpbmUgSVNfQURDX1JJR0hUX0JJVF9TSElGVChfX1NISUZUX18pICAgICBcCisgICgoKF9fU0hJRlRfXykgPT0gQURDX1JJR0hUQklUU0hJRlRfTk9ORSkgfHwgXAorICAgKChfX1NISUZUX18pID09IEFEQ19SSUdIVEJJVFNISUZUXzEpIHx8ICAgIFwKKyAgICgoX19TSElGVF9fKSA9PSBBRENfUklHSFRCSVRTSElGVF8yKSB8fCAgICBcCisgICAoKF9fU0hJRlRfXykgPT0gQURDX1JJR0hUQklUU0hJRlRfMykgfHwgICAgXAorICAgKChfX1NISUZUX18pID09IEFEQ19SSUdIVEJJVFNISUZUXzQpIHx8ICAgIFwKKyAgICgoX19TSElGVF9fKSA9PSBBRENfUklHSFRCSVRTSElGVF81KSB8fCAgICBcCisgICAoKF9fU0hJRlRfXykgPT0gQURDX1JJR0hUQklUU0hJRlRfNikgfHwgICAgXAorICAgKChfX1NISUZUX18pID09IEFEQ19SSUdIVEJJVFNISUZUXzcpIHx8ICAgIFwKKyAgICgoX19TSElGVF9fKSA9PSBBRENfUklHSFRCSVRTSElGVF84KSkKKworLyoqCisgKiBAYnJpZWYgVmVyaWZ5IHRoZSBBREMgb3ZlcnNhbXBsaW5nIHRyaWdnZXJlZCBtb2RlLgorICogQHBhcmFtIF9fTU9ERV9fIHByb2dyYW1tZWQgQURDIG92ZXJzYW1wbGluZyB0cmlnZ2VyZWQgbW9kZS4KKyAqIEByZXR2YWwgU0VUIChfX01PREVfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fTU9ERV9fIGlzIGludmFsaWQpCisgKi8KKyNkZWZpbmUgSVNfQURDX1RSSUdHRVJFRF9PVkVSU0FNUExJTkdfTU9ERShfX01PREVfXykgICBcCisgICgoKF9fTU9ERV9fKSA9PSBBRENfVFJJR0dFUkVETU9ERV9TSU5HTEVfVFJJR0dFUikgfHwgXAorICAgKChfX01PREVfXykgPT0gQURDX1RSSUdHRVJFRE1PREVfTVVMVElfVFJJR0dFUikpCisKKy8qKgorICogQGJyaWVmIFZlcmlmeSB0aGUgQURDIG92ZXJzYW1wbGluZyByZWd1bGFyIGNvbnZlcnNpb24gcmVzdW1lZCBvciBjb250aW51ZWQKKyAqIG1vZGUuCisgKiBAcGFyYW0gX19NT0RFX18gcHJvZ3JhbW1lZCBBREMgb3ZlcnNhbXBsaW5nIHJlZ3VsYXIgY29udmVyc2lvbiByZXN1bWVkIG9yCisgKiBjb250aW51ZWQgbW9kZS4KKyAqIEByZXR2YWwgU0VUIChfX01PREVfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fTU9ERV9fIGlzIGludmFsaWQpCisgKi8KKyNkZWZpbmUgSVNfQURDX1JFR09WRVJTQU1QTElOR19NT0RFKF9fTU9ERV9fKSAgICAgICAgICAgIFwKKyAgKCgoX19NT0RFX18pID09IEFEQ19SRUdPVkVSU0FNUExJTkdfQ09OVElOVUVEX01PREUpIHx8IFwKKyAgICgoX19NT0RFX18pID09IEFEQ19SRUdPVkVSU0FNUExJTkdfUkVTVU1FRF9NT0RFKSkKKworLyoqCisgKiBAYnJpZWYgVmVyaWZ5IHRoZSBERlNETSBtb2RlIGNvbmZpZ3VyYXRpb24uCisgKiBAcGFyYW0gX19IQU5ETEVfXyBBREMgaGFuZGxlLgorICogQG5vdGUgV2hlbiBETVNERk0gY29uZmlndXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkLCB0aGUgbWFjcm8gc3lzdGVtYXRpY2FsbHkKKyAqIHJlcG9ydHMgU0VULiBGb3IgdGhpcyByZWFzb24sIHRoZSBpbnB1dCBwYXJhbWV0ZXIgaXMgdGhlIEFEQyBoYW5kbGUgYW5kIG5vdAorICogdGhlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIGRpcmVjdGx5LgorICogQHJldHZhbCBTRVQgKERGU0RNIG1vZGUgY29uZmlndXJhdGlvbiBpcyB2YWxpZCkgb3IgUkVTRVQgKERGU0RNIG1vZGUKKyAqIGNvbmZpZ3VyYXRpb24gaXMgaW52YWxpZCkKKyAqLworI2RlZmluZSBJU19BRENfREZTRE1DRkdfTU9ERShfX0hBTkRMRV9fKSAoU0VUKQorCisvKioKKyAqIEBicmllZiBSZXR1cm4gdGhlIERGU0RNIGNvbmZpZ3VyYXRpb24gbW9kZS4KKyAqIEBwYXJhbSBfX0hBTkRMRV9fIEFEQyBoYW5kbGUuCisgKiBAbm90ZSBXaGVuIERNU0RGTSBjb25maWd1cmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQsIHRoZSBtYWNybyBzeXN0ZW1hdGljYWxseQorICogcmVwb3J0cyAweDAgKGkuZSBkaXNhYmxlZCkuIEZvciB0aGlzIHJlYXNvbiwgdGhlIGlucHV0IHBhcmFtZXRlciBpcyB0aGUgQURDCisgKiBoYW5kbGUgYW5kIG5vdCB0aGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgZGlyZWN0bHkuCisgKiBAcmV0dmFsIERGU0RNIGNvbmZpZ3VyYXRpb24gbW9kZQorICovCisjZGVmaW5lIEFEQ19DRkdSX0RGU0RNKF9fSEFORExFX18pICgweDBVTCkKKworLyoqCisgKiBAfQorICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgQURDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zCisgKiBAeworICovCisKKy8qKiBAYWRkdG9ncm91cCBBRENFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxCisgKiBAeworICovCisvKiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBBREMgY2FsaWJyYXRpb24gKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENFeF9DYWxpYnJhdGlvbl9TdGFydChBRENfSGFuZGxlVHlwZURlZiAqaGFkYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBTaW5nbGVEaWZmKTsKK3VpbnQzMl90IEhBTF9BRENFeF9DYWxpYnJhdGlvbl9HZXRWYWx1ZShjb25zdCBBRENfSGFuZGxlVHlwZURlZiAqaGFkYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBTaW5nbGVEaWZmKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENFeF9DYWxpYnJhdGlvbl9TZXRWYWx1ZShBRENfSGFuZGxlVHlwZURlZiAqaGFkYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBTaW5nbGVEaWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENhbGlicmF0aW9uRmFjdG9yKTsKKworLyogQmxvY2tpbmcgbW9kZTogUG9sbGluZyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ0V4X0luamVjdGVkU3RhcnQoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ0V4X0luamVjdGVkU3RvcChBRENfSGFuZGxlVHlwZURlZiAqaGFkYyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDRXhfSW5qZWN0ZWRQb2xsRm9yQ29udmVyc2lvbihBRENfSGFuZGxlVHlwZURlZiAqaGFkYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVvdXQpOworCisvKiBOb24tYmxvY2tpbmcgbW9kZTogSW50ZXJydXB0aW9uICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDRXhfSW5qZWN0ZWRTdGFydF9JVChBRENfSGFuZGxlVHlwZURlZiAqaGFkYyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDRXhfSW5qZWN0ZWRTdG9wX0lUKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKTsKKworI2lmIGRlZmluZWQoQURDX01VTFRJTU9ERV9TVVBQT1JUKQorLyogQURDIG11bHRpbW9kZSAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ0V4X011bHRpTW9kZVN0YXJ0X0RNQShBRENfSGFuZGxlVHlwZURlZiAqaGFkYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBMZW5ndGgpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ0V4X011bHRpTW9kZVN0b3BfRE1BKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKTsKK3VpbnQzMl90IEhBTF9BRENFeF9NdWx0aU1vZGVHZXRWYWx1ZShjb25zdCBBRENfSGFuZGxlVHlwZURlZiAqaGFkYyk7CisjZW5kaWYgLyogQURDX01VTFRJTU9ERV9TVVBQT1JUICovCisKKy8qIEFEQyByZXRyaWV2ZSBjb252ZXJzaW9uIHZhbHVlIGludGVuZGVkIHRvIGJlIHVzZWQgd2l0aCBwb2xsaW5nIG9yCisgKiBpbnRlcnJ1cHRpb24gKi8KK3VpbnQzMl90IEhBTF9BRENFeF9JbmplY3RlZEdldFZhbHVlKGNvbnN0IEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgSW5qZWN0ZWRSYW5rKTsKKworLyogQURDIElSUUhhbmRsZXIgYW5kIENhbGxiYWNrcyB1c2VkIGluIG5vbi1ibG9ja2luZyBtb2RlcyAoSW50ZXJydXB0aW9uKSAqLwordm9pZCBIQUxfQURDRXhfSW5qZWN0ZWRDb252Q3BsdENhbGxiYWNrKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKTsKK3ZvaWQgSEFMX0FEQ0V4X0luamVjdGVkUXVldWVPdmVyZmxvd0NhbGxiYWNrKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKTsKK3ZvaWQgSEFMX0FEQ0V4X0xldmVsT3V0T2ZXaW5kb3cyQ2FsbGJhY2soQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpOwordm9pZCBIQUxfQURDRXhfTGV2ZWxPdXRPZldpbmRvdzNDYWxsYmFjayhBRENfSGFuZGxlVHlwZURlZiAqaGFkYyk7Cit2b2lkIEhBTF9BRENFeF9FbmRPZlNhbXBsaW5nQ2FsbGJhY2soQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpOworCisvKiBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9ucyBzdG9wICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDRXhfUmVndWxhclN0b3AoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ0V4X1JlZ3VsYXJTdG9wX0lUKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENFeF9SZWd1bGFyU3RvcF9ETUEoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpOworI2lmIGRlZmluZWQoQURDX01VTFRJTU9ERV9TVVBQT1JUKQorSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ0V4X1JlZ3VsYXJNdWx0aU1vZGVTdG9wX0RNQShBRENfSGFuZGxlVHlwZURlZiAqaGFkYyk7CisjZW5kaWYgLyogQURDX01VTFRJTU9ERV9TVVBQT1JUICovCisKKy8qKgorICogQH0KKyAqLworCisvKiogQGFkZHRvZ3JvdXAgQURDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMgorICogQHsKKyAqLworLyogUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENFeF9JbmplY3RlZENvbmZpZ0NoYW5uZWwoCisgICAgQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMsIGNvbnN0IEFEQ19JbmplY3Rpb25Db25mVHlwZURlZiAqcENvbmZpZ0luamVjdGVkKTsKKyNpZiBkZWZpbmVkKEFEQ19NVUxUSU1PREVfU1VQUE9SVCkKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENFeF9NdWx0aU1vZGVDb25maWdDaGFubmVsKAorICAgIEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjLCBjb25zdCBBRENfTXVsdGlNb2RlVHlwZURlZiAqcE11bHRpbW9kZSk7CisjZW5kaWYgLyogQURDX01VTFRJTU9ERV9TVVBQT1JUICovCisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENFeF9FbmFibGVJbmplY3RlZFF1ZXVlKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENFeF9EaXNhYmxlSW5qZWN0ZWRRdWV1ZShBRENfSGFuZGxlVHlwZURlZiAqaGFkYyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDRXhfRGlzYWJsZVZvbHRhZ2VSZWd1bGF0b3IoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ0V4X0VudGVyQURDRGVlcFBvd2VyRG93bk1vZGUoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpOworCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyRzR4eF9IQUxfQURDX0VYX0ggKi8KZGlmZiAtLWdpdCBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9JbmMvc3RtMzJnNHh4X2hhbF9jb3J0ZXguaCBiL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9JbmMvc3RtMzJnNHh4X2hhbF9jb3J0ZXguaAppbmRleCBkMmFmNDJhLi44MTk5YTY2IDEwMDY0NAotLS0gYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9oYWxfY29ydGV4LmgKKysrIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfaGFsX2NvcnRleC5oCkBAIC0xLDQyNCArMSw0MjYgQEAKLS8qKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBAZmlsZSAgICBzdG0zMmc0eHhfaGFsX2NvcnRleC5oDQotICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0NCi0gKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBDT1JURVggSEFMIG1vZHVsZS4NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQGF0dGVudGlvbg0KLSAqDQotICogQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KLSAqDQotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0ZXJtcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlDQotICogaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc29mdHdhcmUgY29tcG9uZW50Lg0KLSAqIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcyB3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLg0KLSAqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqLw0KLS8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotI2lmbmRlZiBfX1NUTTMyRzR4eF9IQUxfQ09SVEVYX0gNCi0jZGVmaW5lIF9fU1RNMzJHNHh4X0hBTF9DT1JURVhfSA0KLQ0KLSNpZmRlZiBfX2NwbHVzcGx1cw0KLWV4dGVybiAiQyIgew0KLSNlbmRpZg0KLQ0KLS8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotI2luY2x1ZGUgInN0bTMyZzR4eF9oYWxfZGVmLmgiDQotDQotLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzR4eF9IQUxfRHJpdmVyDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIENPUlRFWCBDT1JURVgNCi0gKiBAYnJpZWYgQ09SVEVYIEhBTCBtb2R1bGUgZHJpdmVyDQotICogQHsNCi0gKi8NCi0NCi0vKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgQ09SVEVYX0V4cG9ydGVkX1R5cGVzIENPUlRFWCBFeHBvcnRlZCBUeXBlcw0KLSAqIEB7DQotICovDQotDQotI2lmIChfX01QVV9QUkVTRU5UID09IDEpDQotLyoqIEBkZWZncm91cCBDT1JURVhfTVBVX1JlZ2lvbl9Jbml0aWFsaXphdGlvbl9TdHJ1Y3R1cmVfZGVmaW5pdGlvbiBNUFUgUmVnaW9uDQotICogSW5pdGlhbGl6YXRpb24gU3RydWN0dXJlIERlZmluaXRpb24NCi0gKiBAYnJpZWYgIE1QVSBSZWdpb24gaW5pdGlhbGl6YXRpb24gc3RydWN0dXJlDQotICogQHsNCi0gKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICB1aW50OF90IEVuYWJsZTsgLyohPCBTcGVjaWZpZXMgdGhlIHN0YXR1cyBvZiB0aGUgcmVnaW9uLg0KLSAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgIENPUlRFWF9NUFVfUmVnaW9uX0VuYWJsZSAgICAgICAgICAgICAgICAgKi8NCi0gIHVpbnQ4X3QgTnVtYmVyOyAvKiE8IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHRoZSByZWdpb24gdG8gcHJvdGVjdC4NCi0gICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICBDT1JURVhfTVBVX1JlZ2lvbl9OdW1iZXIgICAgICAgICAgICAgICAgICovDQotICB1aW50MzJfdA0KLSAgICAgIEJhc2VBZGRyZXNzOyAvKiE8IFNwZWNpZmllcyB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSByZWdpb24gdG8gcHJvdGVjdC4gKi8NCi0gIHVpbnQ4X3QNCi0gICAgICBTaXplOyAvKiE8IFNwZWNpZmllcyB0aGUgc2l6ZSBvZiB0aGUgcmVnaW9uIHRvIHByb3RlY3QuDQotICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENPUlRFWF9NUFVfUmVnaW9uX1NpemUgKi8NCi0gIHVpbnQ4X3QNCi0gICAgICBTdWJSZWdpb25EaXNhYmxlOyAvKiE8IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHRoZSBzdWJyZWdpb24gcHJvdGVjdGlvbiB0bw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGUuIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2Vlbg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pbl9EYXRhID0gMHgwMCBhbmQgTWF4X0RhdGEgPSAweEZGICAgICovDQotICB1aW50OF90IFR5cGVFeHRGaWVsZDsgLyohPCBTcGVjaWZpZXMgdGhlIFRFWCBmaWVsZCBsZXZlbC4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDT1JURVhfTVBVX1RFWF9MZXZlbHMgICAgICAgICAgICAgICAgICAgICovDQotICB1aW50OF90IEFjY2Vzc1Blcm1pc3Npb247IC8qITwgU3BlY2lmaWVzIHRoZSByZWdpb24gYWNjZXNzIHBlcm1pc3Npb24gdHlwZS4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPUlRFWF9NUFVfUmVnaW9uX1Blcm1pc3Npb25fQXR0cmlidXRlcyAgKi8NCi0gIHVpbnQ4X3QgRGlzYWJsZUV4ZWM7ICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGluc3RydWN0aW9uIGFjY2VzcyBzdGF0dXMuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT1JURVhfTVBVX0luc3RydWN0aW9uX0FjY2VzcyAgICAgICAgICAgICovDQotICB1aW50OF90IElzU2hhcmVhYmxlOyAgLyohPCBTcGVjaWZpZXMgdGhlIHNoYXJlYWJpbGl0eSBzdGF0dXMgb2YgdGhlIHByb3RlY3RlZA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbi4gIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDT1JURVhfTVBVX0FjY2Vzc19TaGFyZWFibGUgICAgICAgICAgICAgICovDQotICB1aW50OF90IElzQ2FjaGVhYmxlOyAgLyohPCBTcGVjaWZpZXMgdGhlIGNhY2hlYWJsZSBzdGF0dXMgb2YgdGhlIHJlZ2lvbg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZC4gIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDT1JURVhfTVBVX0FjY2Vzc19DYWNoZWFibGUgICAgICAgICAgICAgICovDQotICB1aW50OF90IElzQnVmZmVyYWJsZTsgLyohPCBTcGVjaWZpZXMgdGhlIGJ1ZmZlcmFibGUgc3RhdHVzIG9mIHRoZSBwcm90ZWN0ZWQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb24uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDT1JURVhfTVBVX0FjY2Vzc19CdWZmZXJhYmxlICAgICAgICAgICAgICovDQotfSBNUFVfUmVnaW9uX0luaXRUeXBlRGVmOw0KLS8qKg0KLSAqIEB9DQotICovDQotI2VuZGlmIC8qIF9fTVBVX1BSRVNFTlQgKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotDQotLyoqIEBkZWZncm91cCBDT1JURVhfRXhwb3J0ZWRfQ29uc3RhbnRzIENPUlRFWCBFeHBvcnRlZCBDb25zdGFudHMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQ09SVEVYX1ByZWVtcHRpb25fUHJpb3JpdHlfR3JvdXAgQ09SVEVYIFByZWVtcHRpb24gUHJpb3JpdHkgR3JvdXANCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTlZJQ19QUklPUklUWUdST1VQXzAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAweDAwMDAwMDA3VSAvKiE8IDAgYml0ICBmb3IgcHJlLWVtcHRpb24gcHJpb3JpdHksIFwNCi0gICAgICAgICAgICAgICAgICAgNCBiaXRzIGZvciBzdWJwcmlvcml0eSAqLw0KLSNkZWZpbmUgTlZJQ19QUklPUklUWUdST1VQXzEgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAweDAwMDAwMDA2VSAvKiE8IDEgYml0ICBmb3IgcHJlLWVtcHRpb24gcHJpb3JpdHksIFwNCi0gICAgICAgICAgICAgICAgICAgMyBiaXRzIGZvciBzdWJwcmlvcml0eSAqLw0KLSNkZWZpbmUgTlZJQ19QUklPUklUWUdST1VQXzIgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAweDAwMDAwMDA1VSAvKiE8IDIgYml0cyBmb3IgcHJlLWVtcHRpb24gcHJpb3JpdHksIFwNCi0gICAgICAgICAgICAgICAgICAgMiBiaXRzIGZvciBzdWJwcmlvcml0eSAqLw0KLSNkZWZpbmUgTlZJQ19QUklPUklUWUdST1VQXzMgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAweDAwMDAwMDA0VSAvKiE8IDMgYml0cyBmb3IgcHJlLWVtcHRpb24gcHJpb3JpdHksIFwNCi0gICAgICAgICAgICAgICAgICAgMSBiaXQgIGZvciBzdWJwcmlvcml0eSAqLw0KLSNkZWZpbmUgTlZJQ19QUklPUklUWUdST1VQXzQgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAweDAwMDAwMDAzVSAvKiE8IDQgYml0cyBmb3IgcHJlLWVtcHRpb24gcHJpb3JpdHksIFwNCi0gICAgICAgICAgICAgICAgICAgMCBiaXQgIGZvciBzdWJwcmlvcml0eSAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBDT1JURVhfU3lzVGlja19jbG9ja19zb3VyY2UgQ09SVEVYIFN5c1RpY2sgY2xvY2sgc291cmNlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFNZU1RJQ0tfQ0xLU09VUkNFX0hDTEtfRElWOCAweDAwMDAwMDAwVQ0KLSNkZWZpbmUgU1lTVElDS19DTEtTT1VSQ0VfSENMSyAweDAwMDAwMDA0VQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotI2lmIChfX01QVV9QUkVTRU5UID09IDEpDQotLyoqIEBkZWZncm91cCBDT1JURVhfTVBVX0hGTk1JX1BSSVZERUZfQ29udHJvbCBDT1JURVggTVBVIEhGTk1JIGFuZCBQUklWSUxFR0VEDQotICogQWNjZXNzIGNvbnRyb2wNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTVBVX0hGTk1JX1BSSVZERUZfTk9ORSAweDAwMDAwMDAwVQ0KLSNkZWZpbmUgTVBVX0hBUkRGQVVMVF9OTUkgKE1QVV9DVFJMX0hGTk1JRU5BX01zaykNCi0jZGVmaW5lIE1QVV9QUklWSUxFR0VEX0RFRkFVTFQgKE1QVV9DVFJMX1BSSVZERUZFTkFfTXNrKQ0KLSNkZWZpbmUgTVBVX0hGTk1JX1BSSVZERUYgKE1QVV9DVFJMX0hGTk1JRU5BX01zayB8IE1QVV9DVFJMX1BSSVZERUZFTkFfTXNrKQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBDT1JURVhfTVBVX1JlZ2lvbl9FbmFibGUgQ09SVEVYIE1QVSBSZWdpb24gRW5hYmxlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIE1QVV9SRUdJT05fRU5BQkxFICgodWludDhfdCkweDAxKQ0KLSNkZWZpbmUgTVBVX1JFR0lPTl9ESVNBQkxFICgodWludDhfdCkweDAwKQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBDT1JURVhfTVBVX0luc3RydWN0aW9uX0FjY2VzcyBDT1JURVggTVBVIEluc3RydWN0aW9uIEFjY2Vzcw0KLSAqIEB7DQotICovDQotI2RlZmluZSBNUFVfSU5TVFJVQ1RJT05fQUNDRVNTX0VOQUJMRSAoKHVpbnQ4X3QpMHgwMCkNCi0jZGVmaW5lIE1QVV9JTlNUUlVDVElPTl9BQ0NFU1NfRElTQUJMRSAoKHVpbnQ4X3QpMHgwMSkNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQ09SVEVYX01QVV9BY2Nlc3NfU2hhcmVhYmxlIENPUlRFWCBNUFUgSW5zdHJ1Y3Rpb24gQWNjZXNzDQotICogU2hhcmVhYmxlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIE1QVV9BQ0NFU1NfU0hBUkVBQkxFICgodWludDhfdCkweDAxKQ0KLSNkZWZpbmUgTVBVX0FDQ0VTU19OT1RfU0hBUkVBQkxFICgodWludDhfdCkweDAwKQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBDT1JURVhfTVBVX0FjY2Vzc19DYWNoZWFibGUgQ09SVEVYIE1QVSBJbnN0cnVjdGlvbiBBY2Nlc3MNCi0gKiBDYWNoZWFibGUNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTVBVX0FDQ0VTU19DQUNIRUFCTEUgKCh1aW50OF90KTB4MDEpDQotI2RlZmluZSBNUFVfQUNDRVNTX05PVF9DQUNIRUFCTEUgKCh1aW50OF90KTB4MDApDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIENPUlRFWF9NUFVfQWNjZXNzX0J1ZmZlcmFibGUgQ09SVEVYIE1QVSBJbnN0cnVjdGlvbiBBY2Nlc3MNCi0gKiBCdWZmZXJhYmxlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIE1QVV9BQ0NFU1NfQlVGRkVSQUJMRSAoKHVpbnQ4X3QpMHgwMSkNCi0jZGVmaW5lIE1QVV9BQ0NFU1NfTk9UX0JVRkZFUkFCTEUgKCh1aW50OF90KTB4MDApDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIENPUlRFWF9NUFVfVEVYX0xldmVscyBDT1JURVggTVBVIFRFWCBMZXZlbHMNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTVBVX1RFWF9MRVZFTDAgKCh1aW50OF90KTB4MDApDQotI2RlZmluZSBNUFVfVEVYX0xFVkVMMSAoKHVpbnQ4X3QpMHgwMSkNCi0jZGVmaW5lIE1QVV9URVhfTEVWRUwyICgodWludDhfdCkweDAyKQ0KLSNkZWZpbmUgTVBVX1RFWF9MRVZFTDQgKCh1aW50OF90KTB4MDQpDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIENPUlRFWF9NUFVfUmVnaW9uX1NpemUgQ09SVEVYIE1QVSBSZWdpb24gU2l6ZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBNUFVfUkVHSU9OX1NJWkVfMzJCICgodWludDhfdCkweDA0KQ0KLSNkZWZpbmUgTVBVX1JFR0lPTl9TSVpFXzY0QiAoKHVpbnQ4X3QpMHgwNSkNCi0jZGVmaW5lIE1QVV9SRUdJT05fU0laRV8xMjhCICgodWludDhfdCkweDA2KQ0KLSNkZWZpbmUgTVBVX1JFR0lPTl9TSVpFXzI1NkIgKCh1aW50OF90KTB4MDcpDQotI2RlZmluZSBNUFVfUkVHSU9OX1NJWkVfNTEyQiAoKHVpbnQ4X3QpMHgwOCkNCi0jZGVmaW5lIE1QVV9SRUdJT05fU0laRV8xS0IgKCh1aW50OF90KTB4MDkpDQotI2RlZmluZSBNUFVfUkVHSU9OX1NJWkVfMktCICgodWludDhfdCkweDBBKQ0KLSNkZWZpbmUgTVBVX1JFR0lPTl9TSVpFXzRLQiAoKHVpbnQ4X3QpMHgwQikNCi0jZGVmaW5lIE1QVV9SRUdJT05fU0laRV84S0IgKCh1aW50OF90KTB4MEMpDQotI2RlZmluZSBNUFVfUkVHSU9OX1NJWkVfMTZLQiAoKHVpbnQ4X3QpMHgwRCkNCi0jZGVmaW5lIE1QVV9SRUdJT05fU0laRV8zMktCICgodWludDhfdCkweDBFKQ0KLSNkZWZpbmUgTVBVX1JFR0lPTl9TSVpFXzY0S0IgKCh1aW50OF90KTB4MEYpDQotI2RlZmluZSBNUFVfUkVHSU9OX1NJWkVfMTI4S0IgKCh1aW50OF90KTB4MTApDQotI2RlZmluZSBNUFVfUkVHSU9OX1NJWkVfMjU2S0IgKCh1aW50OF90KTB4MTEpDQotI2RlZmluZSBNUFVfUkVHSU9OX1NJWkVfNTEyS0IgKCh1aW50OF90KTB4MTIpDQotI2RlZmluZSBNUFVfUkVHSU9OX1NJWkVfMU1CICgodWludDhfdCkweDEzKQ0KLSNkZWZpbmUgTVBVX1JFR0lPTl9TSVpFXzJNQiAoKHVpbnQ4X3QpMHgxNCkNCi0jZGVmaW5lIE1QVV9SRUdJT05fU0laRV80TUIgKCh1aW50OF90KTB4MTUpDQotI2RlZmluZSBNUFVfUkVHSU9OX1NJWkVfOE1CICgodWludDhfdCkweDE2KQ0KLSNkZWZpbmUgTVBVX1JFR0lPTl9TSVpFXzE2TUIgKCh1aW50OF90KTB4MTcpDQotI2RlZmluZSBNUFVfUkVHSU9OX1NJWkVfMzJNQiAoKHVpbnQ4X3QpMHgxOCkNCi0jZGVmaW5lIE1QVV9SRUdJT05fU0laRV82NE1CICgodWludDhfdCkweDE5KQ0KLSNkZWZpbmUgTVBVX1JFR0lPTl9TSVpFXzEyOE1CICgodWludDhfdCkweDFBKQ0KLSNkZWZpbmUgTVBVX1JFR0lPTl9TSVpFXzI1Nk1CICgodWludDhfdCkweDFCKQ0KLSNkZWZpbmUgTVBVX1JFR0lPTl9TSVpFXzUxMk1CICgodWludDhfdCkweDFDKQ0KLSNkZWZpbmUgTVBVX1JFR0lPTl9TSVpFXzFHQiAoKHVpbnQ4X3QpMHgxRCkNCi0jZGVmaW5lIE1QVV9SRUdJT05fU0laRV8yR0IgKCh1aW50OF90KTB4MUUpDQotI2RlZmluZSBNUFVfUkVHSU9OX1NJWkVfNEdCICgodWludDhfdCkweDFGKQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBDT1JURVhfTVBVX1JlZ2lvbl9QZXJtaXNzaW9uX0F0dHJpYnV0ZXMgQ09SVEVYIE1QVSBSZWdpb24NCi0gKiBQZXJtaXNzaW9uIEF0dHJpYnV0ZXMNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTVBVX1JFR0lPTl9OT19BQ0NFU1MgKCh1aW50OF90KTB4MDApDQotI2RlZmluZSBNUFVfUkVHSU9OX1BSSVZfUlcgKCh1aW50OF90KTB4MDEpDQotI2RlZmluZSBNUFVfUkVHSU9OX1BSSVZfUldfVVJPICgodWludDhfdCkweDAyKQ0KLSNkZWZpbmUgTVBVX1JFR0lPTl9GVUxMX0FDQ0VTUyAoKHVpbnQ4X3QpMHgwMykNCi0jZGVmaW5lIE1QVV9SRUdJT05fUFJJVl9STyAoKHVpbnQ4X3QpMHgwNSkNCi0jZGVmaW5lIE1QVV9SRUdJT05fUFJJVl9ST19VUk8gKCh1aW50OF90KTB4MDYpDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIENPUlRFWF9NUFVfUmVnaW9uX051bWJlciBDT1JURVggTVBVIFJlZ2lvbiBOdW1iZXINCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTVBVX1JFR0lPTl9OVU1CRVIwICgodWludDhfdCkweDAwKQ0KLSNkZWZpbmUgTVBVX1JFR0lPTl9OVU1CRVIxICgodWludDhfdCkweDAxKQ0KLSNkZWZpbmUgTVBVX1JFR0lPTl9OVU1CRVIyICgodWludDhfdCkweDAyKQ0KLSNkZWZpbmUgTVBVX1JFR0lPTl9OVU1CRVIzICgodWludDhfdCkweDAzKQ0KLSNkZWZpbmUgTVBVX1JFR0lPTl9OVU1CRVI0ICgodWludDhfdCkweDA0KQ0KLSNkZWZpbmUgTVBVX1JFR0lPTl9OVU1CRVI1ICgodWludDhfdCkweDA1KQ0KLSNkZWZpbmUgTVBVX1JFR0lPTl9OVU1CRVI2ICgodWludDhfdCkweDA2KQ0KLSNkZWZpbmUgTVBVX1JFR0lPTl9OVU1CRVI3ICgodWludDhfdCkweDA3KQ0KLS8qKg0KLSAqIEB9DQotICovDQotI2VuZGlmIC8qIF9fTVBVX1BSRVNFTlQgKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBkZWZncm91cCBDT1JURVhfRXhwb3J0ZWRfTWFjcm9zIENPUlRFWCBFeHBvcnRlZCBNYWNyb3MNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGRlZmdyb3VwIENPUlRFWF9FeHBvcnRlZF9GdW5jdGlvbnMgQ09SVEVYIEV4cG9ydGVkIEZ1bmN0aW9ucw0KLSAqIEB7DQotICovDQotDQotLyoqIEBkZWZncm91cCBDT1JURVhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbg0KLSAqIGZ1bmN0aW9ucw0KLSAqIEBicmllZiAgICBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMNCi0gKiBAew0KLSAqLw0KLS8qIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi12b2lkIEhBTF9OVklDX1NldFByaW9yaXR5R3JvdXBpbmcodWludDMyX3QgUHJpb3JpdHlHcm91cCk7DQotdm9pZCBIQUxfTlZJQ19TZXRQcmlvcml0eShJUlFuX1R5cGUgSVJRbiwgdWludDMyX3QgUHJlZW1wdFByaW9yaXR5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgU3ViUHJpb3JpdHkpOw0KLXZvaWQgSEFMX05WSUNfRW5hYmxlSVJRKElSUW5fVHlwZSBJUlFuKTsNCi12b2lkIEhBTF9OVklDX0Rpc2FibGVJUlEoSVJRbl9UeXBlIElSUW4pOw0KLXZvaWQgSEFMX05WSUNfU3lzdGVtUmVzZXQodm9pZCk7DQotdWludDMyX3QgSEFMX1NZU1RJQ0tfQ29uZmlnKHVpbnQzMl90IFRpY2tzTnVtYik7DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIENPUlRFWF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMNCi0gKiBAYnJpZWYgICBDb3J0ZXggY29udHJvbCBmdW5jdGlvbnMNCi0gKiBAew0KLSAqLw0KLS8qIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotdWludDMyX3QgSEFMX05WSUNfR2V0UHJpb3JpdHlHcm91cGluZyh2b2lkKTsNCi12b2lkIEhBTF9OVklDX0dldFByaW9yaXR5KElSUW5fVHlwZSBJUlFuLCB1aW50MzJfdCBQcmlvcml0eUdyb3VwLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBQcmVlbXB0UHJpb3JpdHksIHVpbnQzMl90ICpwU3ViUHJpb3JpdHkpOw0KLXVpbnQzMl90IEhBTF9OVklDX0dldFBlbmRpbmdJUlEoSVJRbl9UeXBlIElSUW4pOw0KLXZvaWQgSEFMX05WSUNfU2V0UGVuZGluZ0lSUShJUlFuX1R5cGUgSVJRbik7DQotdm9pZCBIQUxfTlZJQ19DbGVhclBlbmRpbmdJUlEoSVJRbl9UeXBlIElSUW4pOw0KLXVpbnQzMl90IEhBTF9OVklDX0dldEFjdGl2ZShJUlFuX1R5cGUgSVJRbik7DQotdm9pZCBIQUxfU1lTVElDS19DTEtTb3VyY2VDb25maWcodWludDMyX3QgQ0xLU291cmNlKTsNCi12b2lkIEhBTF9TWVNUSUNLX0lSUUhhbmRsZXIodm9pZCk7DQotdm9pZCBIQUxfU1lTVElDS19DYWxsYmFjayh2b2lkKTsNCi0NCi0jaWYgKF9fTVBVX1BSRVNFTlQgPT0gMSkNCi12b2lkIEhBTF9NUFVfRW5hYmxlKHVpbnQzMl90IE1QVV9Db250cm9sKTsNCi12b2lkIEhBTF9NUFVfRGlzYWJsZSh2b2lkKTsNCi12b2lkIEhBTF9NUFVfQ29uZmlnUmVnaW9uKE1QVV9SZWdpb25fSW5pdFR5cGVEZWYgKk1QVV9Jbml0KTsNCi0jZW5kaWYgLyogX19NUFVfUFJFU0VOVCAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgQ09SVEVYX1ByaXZhdGVfTWFjcm9zIENPUlRFWCBQcml2YXRlIE1hY3Jvcw0KLSAqIEB7DQotICovDQotI2RlZmluZSBJU19OVklDX1BSSU9SSVRZX0dST1VQKEdST1VQKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKChHUk9VUCkgPT0gTlZJQ19QUklPUklUWUdST1VQXzApIHx8ICgoR1JPVVApID09IE5WSUNfUFJJT1JJVFlHUk9VUF8xKSB8fCBcDQotICAgKChHUk9VUCkgPT0gTlZJQ19QUklPUklUWUdST1VQXzIpIHx8ICgoR1JPVVApID09IE5WSUNfUFJJT1JJVFlHUk9VUF8zKSB8fCBcDQotICAgKChHUk9VUCkgPT0gTlZJQ19QUklPUklUWUdST1VQXzQpKQ0KLQ0KLSNkZWZpbmUgSVNfTlZJQ19QUkVFTVBUSU9OX1BSSU9SSVRZKFBSSU9SSVRZKSAoKFBSSU9SSVRZKSA8IDB4MTBVKQ0KLQ0KLSNkZWZpbmUgSVNfTlZJQ19TVUJfUFJJT1JJVFkoUFJJT1JJVFkpICgoUFJJT1JJVFkpIDwgMHgxMFUpDQotDQotI2RlZmluZSBJU19OVklDX0RFVklDRV9JUlEoSVJRKSAoKElSUSkgPiBTeXNUaWNrX0lSUW4pDQotDQotI2RlZmluZSBJU19TWVNUSUNLX0NMS19TT1VSQ0UoU09VUkNFKSAgICAgIFwNCi0gICgoKFNPVVJDRSkgPT0gU1lTVElDS19DTEtTT1VSQ0VfSENMSykgfHwgXA0KLSAgICgoU09VUkNFKSA9PSBTWVNUSUNLX0NMS1NPVVJDRV9IQ0xLX0RJVjgpKQ0KLQ0KLSNpZiAoX19NUFVfUFJFU0VOVCA9PSAxKQ0KLSNkZWZpbmUgSVNfTVBVX1JFR0lPTl9FTkFCTEUoU1RBVEUpIFwNCi0gICgoKFNUQVRFKSA9PSBNUFVfUkVHSU9OX0VOQUJMRSkgfHwgKChTVEFURSkgPT0gTVBVX1JFR0lPTl9ESVNBQkxFKSkNCi0NCi0jZGVmaW5lIElTX01QVV9JTlNUUlVDVElPTl9BQ0NFU1MoU1RBVEUpICAgICAgICAgXA0KLSAgKCgoU1RBVEUpID09IE1QVV9JTlNUUlVDVElPTl9BQ0NFU1NfRU5BQkxFKSB8fCBcDQotICAgKChTVEFURSkgPT0gTVBVX0lOU1RSVUNUSU9OX0FDQ0VTU19ESVNBQkxFKSkNCi0NCi0jZGVmaW5lIElTX01QVV9BQ0NFU1NfU0hBUkVBQkxFKFNUQVRFKSBcDQotICAoKChTVEFURSkgPT0gTVBVX0FDQ0VTU19TSEFSRUFCTEUpIHx8ICgoU1RBVEUpID09IE1QVV9BQ0NFU1NfTk9UX1NIQVJFQUJMRSkpDQotDQotI2RlZmluZSBJU19NUFVfQUNDRVNTX0NBQ0hFQUJMRShTVEFURSkgXA0KLSAgKCgoU1RBVEUpID09IE1QVV9BQ0NFU1NfQ0FDSEVBQkxFKSB8fCAoKFNUQVRFKSA9PSBNUFVfQUNDRVNTX05PVF9DQUNIRUFCTEUpKQ0KLQ0KLSNkZWZpbmUgSVNfTVBVX0FDQ0VTU19CVUZGRVJBQkxFKFNUQVRFKSBcDQotICAoKChTVEFURSkgPT0gTVBVX0FDQ0VTU19CVUZGRVJBQkxFKSB8fCAoKFNUQVRFKSA9PSBNUFVfQUNDRVNTX05PVF9CVUZGRVJBQkxFKSkNCi0NCi0jZGVmaW5lIElTX01QVV9URVhfTEVWRUwoVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKChUWVBFKSA9PSBNUFVfVEVYX0xFVkVMMCkgfHwgKChUWVBFKSA9PSBNUFVfVEVYX0xFVkVMMSkgfHwgXA0KLSAgICgoVFlQRSkgPT0gTVBVX1RFWF9MRVZFTDIpIHx8ICgoVFlQRSkgPT0gTVBVX1RFWF9MRVZFTDQpKQ0KLQ0KLSNkZWZpbmUgSVNfTVBVX1JFR0lPTl9QRVJNSVNTSU9OX0FUVFJJQlVURShUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKChUWVBFKSA9PSBNUFVfUkVHSU9OX05PX0FDQ0VTUykgfHwgKChUWVBFKSA9PSBNUFVfUkVHSU9OX1BSSVZfUlcpIHx8ICAgICAgIFwNCi0gICAoKFRZUEUpID09IE1QVV9SRUdJT05fUFJJVl9SV19VUk8pIHx8ICgoVFlQRSkgPT0gTVBVX1JFR0lPTl9GVUxMX0FDQ0VTUykgfHwgXA0KLSAgICgoVFlQRSkgPT0gTVBVX1JFR0lPTl9QUklWX1JPKSB8fCAoKFRZUEUpID09IE1QVV9SRUdJT05fUFJJVl9ST19VUk8pKQ0KLQ0KLSNkZWZpbmUgSVNfTVBVX1JFR0lPTl9OVU1CRVIoTlVNQkVSKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoKE5VTUJFUikgPT0gTVBVX1JFR0lPTl9OVU1CRVIwKSB8fCAoKE5VTUJFUikgPT0gTVBVX1JFR0lPTl9OVU1CRVIxKSB8fCBcDQotICAgKChOVU1CRVIpID09IE1QVV9SRUdJT05fTlVNQkVSMikgfHwgKChOVU1CRVIpID09IE1QVV9SRUdJT05fTlVNQkVSMykgfHwgXA0KLSAgICgoTlVNQkVSKSA9PSBNUFVfUkVHSU9OX05VTUJFUjQpIHx8ICgoTlVNQkVSKSA9PSBNUFVfUkVHSU9OX05VTUJFUjUpIHx8IFwNCi0gICAoKE5VTUJFUikgPT0gTVBVX1JFR0lPTl9OVU1CRVI2KSB8fCAoKE5VTUJFUikgPT0gTVBVX1JFR0lPTl9OVU1CRVI3KSkNCi0NCi0jZGVmaW5lIElTX01QVV9SRUdJT05fU0laRShTSVpFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV8zMkIpIHx8ICgoU0laRSkgPT0gTVBVX1JFR0lPTl9TSVpFXzY0QikgfHwgICAgIFwNCi0gICAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV8xMjhCKSB8fCAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV8yNTZCKSB8fCAgIFwNCi0gICAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV81MTJCKSB8fCAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV8xS0IpIHx8ICAgIFwNCi0gICAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV8yS0IpIHx8ICgoU0laRSkgPT0gTVBVX1JFR0lPTl9TSVpFXzRLQikgfHwgICAgIFwNCi0gICAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV84S0IpIHx8ICgoU0laRSkgPT0gTVBVX1JFR0lPTl9TSVpFXzE2S0IpIHx8ICAgIFwNCi0gICAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV8zMktCKSB8fCAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV82NEtCKSB8fCAgIFwNCi0gICAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV8xMjhLQikgfHwgKChTSVpFKSA9PSBNUFVfUkVHSU9OX1NJWkVfMjU2S0IpIHx8IFwNCi0gICAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV81MTJLQikgfHwgKChTSVpFKSA9PSBNUFVfUkVHSU9OX1NJWkVfMU1CKSB8fCAgIFwNCi0gICAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV8yTUIpIHx8ICgoU0laRSkgPT0gTVBVX1JFR0lPTl9TSVpFXzRNQikgfHwgICAgIFwNCi0gICAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV84TUIpIHx8ICgoU0laRSkgPT0gTVBVX1JFR0lPTl9TSVpFXzE2TUIpIHx8ICAgIFwNCi0gICAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV8zMk1CKSB8fCAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV82NE1CKSB8fCAgIFwNCi0gICAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV8xMjhNQikgfHwgKChTSVpFKSA9PSBNUFVfUkVHSU9OX1NJWkVfMjU2TUIpIHx8IFwNCi0gICAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV81MTJNQikgfHwgKChTSVpFKSA9PSBNUFVfUkVHSU9OX1NJWkVfMUdCKSB8fCAgIFwNCi0gICAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV8yR0IpIHx8ICgoU0laRSkgPT0gTVBVX1JFR0lPTl9TSVpFXzRHQikpDQotDQotI2RlZmluZSBJU19NUFVfU1VCX1JFR0lPTl9ESVNBQkxFKFNVQlJFR0lPTikgKChTVUJSRUdJT04pIDwgKHVpbnQxNl90KTB4MDBGRikNCi0jZW5kaWYgLyogX19NUFVfUFJFU0VOVCAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotI2lmZGVmIF9fY3BsdXNwbHVzDQotfQ0KLSNlbmRpZg0KLQ0KLSNlbmRpZiAvKiBfX1NUTTMyRzR4eF9IQUxfQ09SVEVYX0ggKi8NCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBmaWxlICAgIHN0bTMyZzR4eF9oYWxfY29ydGV4LmgKKyAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBDT1JURVggSEFMIG1vZHVsZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBhdHRlbnRpb24KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRlcm1zIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUKKyAqIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4KKyAqIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcyB3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgX19TVE0zMkc0eHhfSEFMX0NPUlRFWF9ICisjZGVmaW5lIF9fU1RNMzJHNHh4X0hBTF9DT1JURVhfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnNHh4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzR4eF9IQUxfRHJpdmVyCisgKiBAeworICovCisKKy8qKiBAZGVmZ3JvdXAgQ09SVEVYIENPUlRFWAorICogQGJyaWVmIENPUlRFWCBIQUwgbW9kdWxlIGRyaXZlcgorICogQHsKKyAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBDT1JURVhfRXhwb3J0ZWRfVHlwZXMgQ09SVEVYIEV4cG9ydGVkIFR5cGVzCisgKiBAeworICovCisKKyNpZiAoX19NUFVfUFJFU0VOVCA9PSAxKQorLyoqIEBkZWZncm91cCBDT1JURVhfTVBVX1JlZ2lvbl9Jbml0aWFsaXphdGlvbl9TdHJ1Y3R1cmVfZGVmaW5pdGlvbiBNUFUgUmVnaW9uCisgKiBJbml0aWFsaXphdGlvbiBTdHJ1Y3R1cmUgRGVmaW5pdGlvbgorICogQGJyaWVmICBNUFUgUmVnaW9uIGluaXRpYWxpemF0aW9uIHN0cnVjdHVyZQorICogQHsKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50OF90IEVuYWJsZTsgLyohPCBTcGVjaWZpZXMgdGhlIHN0YXR1cyBvZiB0aGUgcmVnaW9uLgorICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgICBDT1JURVhfTVBVX1JlZ2lvbl9FbmFibGUgICAgICAgICAgICAgICAgICovCisgIHVpbnQ4X3QgTnVtYmVyOyAvKiE8IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHRoZSByZWdpb24gdG8gcHJvdGVjdC4KKyAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgQ09SVEVYX01QVV9SZWdpb25fTnVtYmVyICAgICAgICAgICAgICAgICAqLworICB1aW50MzJfdAorICAgICAgQmFzZUFkZHJlc3M7IC8qITwgU3BlY2lmaWVzIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIHJlZ2lvbiB0byBwcm90ZWN0LiAqLworICB1aW50OF90CisgICAgICBTaXplOyAvKiE8IFNwZWNpZmllcyB0aGUgc2l6ZSBvZiB0aGUgcmVnaW9uIHRvIHByb3RlY3QuCisgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQ09SVEVYX01QVV9SZWdpb25fU2l6ZSAqLworICB1aW50OF90CisgICAgICBTdWJSZWdpb25EaXNhYmxlOyAvKiE8IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHRoZSBzdWJyZWdpb24gcHJvdGVjdGlvbiB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZS4gVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNaW5fRGF0YSA9IDB4MDAgYW5kIE1heF9EYXRhID0gMHhGRiAgICAqLworICB1aW50OF90IFR5cGVFeHRGaWVsZDsgLyohPCBTcGVjaWZpZXMgdGhlIFRFWCBmaWVsZCBsZXZlbC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09SVEVYX01QVV9URVhfTGV2ZWxzICAgICAgICAgICAgICAgICAgICAqLworICB1aW50OF90IEFjY2Vzc1Blcm1pc3Npb247IC8qITwgU3BlY2lmaWVzIHRoZSByZWdpb24gYWNjZXNzIHBlcm1pc3Npb24gdHlwZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT1JURVhfTVBVX1JlZ2lvbl9QZXJtaXNzaW9uX0F0dHJpYnV0ZXMgICovCisgIHVpbnQ4X3QgRGlzYWJsZUV4ZWM7ICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGluc3RydWN0aW9uIGFjY2VzcyBzdGF0dXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09SVEVYX01QVV9JbnN0cnVjdGlvbl9BY2Nlc3MgICAgICAgICAgICAqLworICB1aW50OF90IElzU2hhcmVhYmxlOyAgLyohPCBTcGVjaWZpZXMgdGhlIHNoYXJlYWJpbGl0eSBzdGF0dXMgb2YgdGhlIHByb3RlY3RlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uLiAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09SVEVYX01QVV9BY2Nlc3NfU2hhcmVhYmxlICAgICAgICAgICAgICAqLworICB1aW50OF90IElzQ2FjaGVhYmxlOyAgLyohPCBTcGVjaWZpZXMgdGhlIGNhY2hlYWJsZSBzdGF0dXMgb2YgdGhlIHJlZ2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkLiAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09SVEVYX01QVV9BY2Nlc3NfQ2FjaGVhYmxlICAgICAgICAgICAgICAqLworICB1aW50OF90IElzQnVmZmVyYWJsZTsgLyohPCBTcGVjaWZpZXMgdGhlIGJ1ZmZlcmFibGUgc3RhdHVzIG9mIHRoZSBwcm90ZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbi4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09SVEVYX01QVV9BY2Nlc3NfQnVmZmVyYWJsZSAgICAgICAgICAgICAqLworfSBNUFVfUmVnaW9uX0luaXRUeXBlRGVmOworLyoqCisgKiBAfQorICovCisjZW5kaWYgLyogX19NUFVfUFJFU0VOVCAqLworCisvKioKKyAqIEB9CisgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBDT1JURVhfRXhwb3J0ZWRfQ29uc3RhbnRzIENPUlRFWCBFeHBvcnRlZCBDb25zdGFudHMKKyAqIEB7CisgKi8KKworLyoqIEBkZWZncm91cCBDT1JURVhfUHJlZW1wdGlvbl9Qcmlvcml0eV9Hcm91cCBDT1JURVggUHJlZW1wdGlvbiBQcmlvcml0eSBHcm91cAorICogQHsKKyAqLworI2RlZmluZSBOVklDX1BSSU9SSVRZR1JPVVBfMCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwMDAwMDAwN1UgLyohPCAwIGJpdCAgZm9yIHByZS1lbXB0aW9uIHByaW9yaXR5LCBcCisgICAgICAgICAgICAgICAgICAgNCBiaXRzIGZvciBzdWJwcmlvcml0eSAqLworI2RlZmluZSBOVklDX1BSSU9SSVRZR1JPVVBfMSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwMDAwMDAwNlUgLyohPCAxIGJpdCAgZm9yIHByZS1lbXB0aW9uIHByaW9yaXR5LCBcCisgICAgICAgICAgICAgICAgICAgMyBiaXRzIGZvciBzdWJwcmlvcml0eSAqLworI2RlZmluZSBOVklDX1BSSU9SSVRZR1JPVVBfMiAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwMDAwMDAwNVUgLyohPCAyIGJpdHMgZm9yIHByZS1lbXB0aW9uIHByaW9yaXR5LCBcCisgICAgICAgICAgICAgICAgICAgMiBiaXRzIGZvciBzdWJwcmlvcml0eSAqLworI2RlZmluZSBOVklDX1BSSU9SSVRZR1JPVVBfMyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwMDAwMDAwNFUgLyohPCAzIGJpdHMgZm9yIHByZS1lbXB0aW9uIHByaW9yaXR5LCBcCisgICAgICAgICAgICAgICAgICAgMSBiaXQgIGZvciBzdWJwcmlvcml0eSAqLworI2RlZmluZSBOVklDX1BSSU9SSVRZR1JPVVBfNCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwMDAwMDAwM1UgLyohPCA0IGJpdHMgZm9yIHByZS1lbXB0aW9uIHByaW9yaXR5LCBcCisgICAgICAgICAgICAgICAgICAgMCBiaXQgIGZvciBzdWJwcmlvcml0eSAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX1N5c1RpY2tfY2xvY2tfc291cmNlIENPUlRFWCBTeXNUaWNrIGNsb2NrIHNvdXJjZQorICogQHsKKyAqLworI2RlZmluZSBTWVNUSUNLX0NMS1NPVVJDRV9IQ0xLX0RJVjggMHgwMDAwMDAwMFUKKyNkZWZpbmUgU1lTVElDS19DTEtTT1VSQ0VfSENMSyAweDAwMDAwMDA0VQorCisvKioKKyAqIEB9CisgKi8KKworI2lmIChfX01QVV9QUkVTRU5UID09IDEpCisvKiogQGRlZmdyb3VwIENPUlRFWF9NUFVfSEZOTUlfUFJJVkRFRl9Db250cm9sIENPUlRFWCBNUFUgSEZOTUkgYW5kIFBSSVZJTEVHRUQKKyAqIEFjY2VzcyBjb250cm9sCisgKiBAeworICovCisjZGVmaW5lIE1QVV9IRk5NSV9QUklWREVGX05PTkUgMHgwMDAwMDAwMFUKKyNkZWZpbmUgTVBVX0hBUkRGQVVMVF9OTUkgKE1QVV9DVFJMX0hGTk1JRU5BX01zaykKKyNkZWZpbmUgTVBVX1BSSVZJTEVHRURfREVGQVVMVCAoTVBVX0NUUkxfUFJJVkRFRkVOQV9Nc2spCisjZGVmaW5lIE1QVV9IRk5NSV9QUklWREVGIChNUFVfQ1RSTF9IRk5NSUVOQV9Nc2sgfCBNUFVfQ1RSTF9QUklWREVGRU5BX01zaykKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIENPUlRFWF9NUFVfUmVnaW9uX0VuYWJsZSBDT1JURVggTVBVIFJlZ2lvbiBFbmFibGUKKyAqIEB7CisgKi8KKyNkZWZpbmUgTVBVX1JFR0lPTl9FTkFCTEUgKCh1aW50OF90KTB4MDEpCisjZGVmaW5lIE1QVV9SRUdJT05fRElTQUJMRSAoKHVpbnQ4X3QpMHgwMCkKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIENPUlRFWF9NUFVfSW5zdHJ1Y3Rpb25fQWNjZXNzIENPUlRFWCBNUFUgSW5zdHJ1Y3Rpb24gQWNjZXNzCisgKiBAeworICovCisjZGVmaW5lIE1QVV9JTlNUUlVDVElPTl9BQ0NFU1NfRU5BQkxFICgodWludDhfdCkweDAwKQorI2RlZmluZSBNUFVfSU5TVFJVQ1RJT05fQUNDRVNTX0RJU0FCTEUgKCh1aW50OF90KTB4MDEpCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBDT1JURVhfTVBVX0FjY2Vzc19TaGFyZWFibGUgQ09SVEVYIE1QVSBJbnN0cnVjdGlvbiBBY2Nlc3MKKyAqIFNoYXJlYWJsZQorICogQHsKKyAqLworI2RlZmluZSBNUFVfQUNDRVNTX1NIQVJFQUJMRSAoKHVpbnQ4X3QpMHgwMSkKKyNkZWZpbmUgTVBVX0FDQ0VTU19OT1RfU0hBUkVBQkxFICgodWludDhfdCkweDAwKQorLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX01QVV9BY2Nlc3NfQ2FjaGVhYmxlIENPUlRFWCBNUFUgSW5zdHJ1Y3Rpb24gQWNjZXNzCisgKiBDYWNoZWFibGUKKyAqIEB7CisgKi8KKyNkZWZpbmUgTVBVX0FDQ0VTU19DQUNIRUFCTEUgKCh1aW50OF90KTB4MDEpCisjZGVmaW5lIE1QVV9BQ0NFU1NfTk9UX0NBQ0hFQUJMRSAoKHVpbnQ4X3QpMHgwMCkKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIENPUlRFWF9NUFVfQWNjZXNzX0J1ZmZlcmFibGUgQ09SVEVYIE1QVSBJbnN0cnVjdGlvbiBBY2Nlc3MKKyAqIEJ1ZmZlcmFibGUKKyAqIEB7CisgKi8KKyNkZWZpbmUgTVBVX0FDQ0VTU19CVUZGRVJBQkxFICgodWludDhfdCkweDAxKQorI2RlZmluZSBNUFVfQUNDRVNTX05PVF9CVUZGRVJBQkxFICgodWludDhfdCkweDAwKQorLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX01QVV9URVhfTGV2ZWxzIENPUlRFWCBNUFUgVEVYIExldmVscworICogQHsKKyAqLworI2RlZmluZSBNUFVfVEVYX0xFVkVMMCAoKHVpbnQ4X3QpMHgwMCkKKyNkZWZpbmUgTVBVX1RFWF9MRVZFTDEgKCh1aW50OF90KTB4MDEpCisjZGVmaW5lIE1QVV9URVhfTEVWRUwyICgodWludDhfdCkweDAyKQorI2RlZmluZSBNUFVfVEVYX0xFVkVMNCAoKHVpbnQ4X3QpMHgwNCkKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIENPUlRFWF9NUFVfUmVnaW9uX1NpemUgQ09SVEVYIE1QVSBSZWdpb24gU2l6ZQorICogQHsKKyAqLworI2RlZmluZSBNUFVfUkVHSU9OX1NJWkVfMzJCICgodWludDhfdCkweDA0KQorI2RlZmluZSBNUFVfUkVHSU9OX1NJWkVfNjRCICgodWludDhfdCkweDA1KQorI2RlZmluZSBNUFVfUkVHSU9OX1NJWkVfMTI4QiAoKHVpbnQ4X3QpMHgwNikKKyNkZWZpbmUgTVBVX1JFR0lPTl9TSVpFXzI1NkIgKCh1aW50OF90KTB4MDcpCisjZGVmaW5lIE1QVV9SRUdJT05fU0laRV81MTJCICgodWludDhfdCkweDA4KQorI2RlZmluZSBNUFVfUkVHSU9OX1NJWkVfMUtCICgodWludDhfdCkweDA5KQorI2RlZmluZSBNUFVfUkVHSU9OX1NJWkVfMktCICgodWludDhfdCkweDBBKQorI2RlZmluZSBNUFVfUkVHSU9OX1NJWkVfNEtCICgodWludDhfdCkweDBCKQorI2RlZmluZSBNUFVfUkVHSU9OX1NJWkVfOEtCICgodWludDhfdCkweDBDKQorI2RlZmluZSBNUFVfUkVHSU9OX1NJWkVfMTZLQiAoKHVpbnQ4X3QpMHgwRCkKKyNkZWZpbmUgTVBVX1JFR0lPTl9TSVpFXzMyS0IgKCh1aW50OF90KTB4MEUpCisjZGVmaW5lIE1QVV9SRUdJT05fU0laRV82NEtCICgodWludDhfdCkweDBGKQorI2RlZmluZSBNUFVfUkVHSU9OX1NJWkVfMTI4S0IgKCh1aW50OF90KTB4MTApCisjZGVmaW5lIE1QVV9SRUdJT05fU0laRV8yNTZLQiAoKHVpbnQ4X3QpMHgxMSkKKyNkZWZpbmUgTVBVX1JFR0lPTl9TSVpFXzUxMktCICgodWludDhfdCkweDEyKQorI2RlZmluZSBNUFVfUkVHSU9OX1NJWkVfMU1CICgodWludDhfdCkweDEzKQorI2RlZmluZSBNUFVfUkVHSU9OX1NJWkVfMk1CICgodWludDhfdCkweDE0KQorI2RlZmluZSBNUFVfUkVHSU9OX1NJWkVfNE1CICgodWludDhfdCkweDE1KQorI2RlZmluZSBNUFVfUkVHSU9OX1NJWkVfOE1CICgodWludDhfdCkweDE2KQorI2RlZmluZSBNUFVfUkVHSU9OX1NJWkVfMTZNQiAoKHVpbnQ4X3QpMHgxNykKKyNkZWZpbmUgTVBVX1JFR0lPTl9TSVpFXzMyTUIgKCh1aW50OF90KTB4MTgpCisjZGVmaW5lIE1QVV9SRUdJT05fU0laRV82NE1CICgodWludDhfdCkweDE5KQorI2RlZmluZSBNUFVfUkVHSU9OX1NJWkVfMTI4TUIgKCh1aW50OF90KTB4MUEpCisjZGVmaW5lIE1QVV9SRUdJT05fU0laRV8yNTZNQiAoKHVpbnQ4X3QpMHgxQikKKyNkZWZpbmUgTVBVX1JFR0lPTl9TSVpFXzUxMk1CICgodWludDhfdCkweDFDKQorI2RlZmluZSBNUFVfUkVHSU9OX1NJWkVfMUdCICgodWludDhfdCkweDFEKQorI2RlZmluZSBNUFVfUkVHSU9OX1NJWkVfMkdCICgodWludDhfdCkweDFFKQorI2RlZmluZSBNUFVfUkVHSU9OX1NJWkVfNEdCICgodWludDhfdCkweDFGKQorLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX01QVV9SZWdpb25fUGVybWlzc2lvbl9BdHRyaWJ1dGVzIENPUlRFWCBNUFUgUmVnaW9uCisgKiBQZXJtaXNzaW9uIEF0dHJpYnV0ZXMKKyAqIEB7CisgKi8KKyNkZWZpbmUgTVBVX1JFR0lPTl9OT19BQ0NFU1MgKCh1aW50OF90KTB4MDApCisjZGVmaW5lIE1QVV9SRUdJT05fUFJJVl9SVyAoKHVpbnQ4X3QpMHgwMSkKKyNkZWZpbmUgTVBVX1JFR0lPTl9QUklWX1JXX1VSTyAoKHVpbnQ4X3QpMHgwMikKKyNkZWZpbmUgTVBVX1JFR0lPTl9GVUxMX0FDQ0VTUyAoKHVpbnQ4X3QpMHgwMykKKyNkZWZpbmUgTVBVX1JFR0lPTl9QUklWX1JPICgodWludDhfdCkweDA1KQorI2RlZmluZSBNUFVfUkVHSU9OX1BSSVZfUk9fVVJPICgodWludDhfdCkweDA2KQorLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX01QVV9SZWdpb25fTnVtYmVyIENPUlRFWCBNUFUgUmVnaW9uIE51bWJlcgorICogQHsKKyAqLworI2RlZmluZSBNUFVfUkVHSU9OX05VTUJFUjAgKCh1aW50OF90KTB4MDApCisjZGVmaW5lIE1QVV9SRUdJT05fTlVNQkVSMSAoKHVpbnQ4X3QpMHgwMSkKKyNkZWZpbmUgTVBVX1JFR0lPTl9OVU1CRVIyICgodWludDhfdCkweDAyKQorI2RlZmluZSBNUFVfUkVHSU9OX05VTUJFUjMgKCh1aW50OF90KTB4MDMpCisjZGVmaW5lIE1QVV9SRUdJT05fTlVNQkVSNCAoKHVpbnQ4X3QpMHgwNCkKKyNkZWZpbmUgTVBVX1JFR0lPTl9OVU1CRVI1ICgodWludDhfdCkweDA1KQorI2RlZmluZSBNUFVfUkVHSU9OX05VTUJFUjYgKCh1aW50OF90KTB4MDYpCisjZGVmaW5lIE1QVV9SRUdJT05fTlVNQkVSNyAoKHVpbnQ4X3QpMHgwNykKKy8qKgorICogQH0KKyAqLworI2VuZGlmIC8qIF9fTVBVX1BSRVNFTlQgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIENPUlRFWF9FeHBvcnRlZF9NYWNyb3MgQ09SVEVYIEV4cG9ydGVkIE1hY3JvcworICogQHsKKyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX0V4cG9ydGVkX0Z1bmN0aW9ucyBDT1JURVggRXhwb3J0ZWQgRnVuY3Rpb25zCisgKiBAeworICovCisKKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24KKyAqIGZ1bmN0aW9ucworICogQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICogQHsKKyAqLworLyogSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBIQUxfTlZJQ19TZXRQcmlvcml0eUdyb3VwaW5nKHVpbnQzMl90IFByaW9yaXR5R3JvdXApOwordm9pZCBIQUxfTlZJQ19TZXRQcmlvcml0eShJUlFuX1R5cGUgSVJRbiwgdWludDMyX3QgUHJlZW1wdFByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBTdWJQcmlvcml0eSk7Cit2b2lkIEhBTF9OVklDX0VuYWJsZUlSUShJUlFuX1R5cGUgSVJRbik7Cit2b2lkIEhBTF9OVklDX0Rpc2FibGVJUlEoSVJRbl9UeXBlIElSUW4pOwordm9pZCBIQUxfTlZJQ19TeXN0ZW1SZXNldCh2b2lkKTsKK3VpbnQzMl90IEhBTF9TWVNUSUNLX0NvbmZpZyh1aW50MzJfdCBUaWNrc051bWIpOworCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBDT1JURVhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgKiBAYnJpZWYgICBDb3J0ZXggY29udHJvbCBmdW5jdGlvbnMKKyAqIEB7CisgKi8KKy8qIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBIQUxfTlZJQ19HZXRQcmlvcml0eUdyb3VwaW5nKHZvaWQpOwordm9pZCBIQUxfTlZJQ19HZXRQcmlvcml0eShJUlFuX1R5cGUgSVJRbiwgdWludDMyX3QgUHJpb3JpdHlHcm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBQcmVlbXB0UHJpb3JpdHksIHVpbnQzMl90ICpwU3ViUHJpb3JpdHkpOwordWludDMyX3QgSEFMX05WSUNfR2V0UGVuZGluZ0lSUShJUlFuX1R5cGUgSVJRbik7Cit2b2lkIEhBTF9OVklDX1NldFBlbmRpbmdJUlEoSVJRbl9UeXBlIElSUW4pOwordm9pZCBIQUxfTlZJQ19DbGVhclBlbmRpbmdJUlEoSVJRbl9UeXBlIElSUW4pOwordWludDMyX3QgSEFMX05WSUNfR2V0QWN0aXZlKElSUW5fVHlwZSBJUlFuKTsKK3ZvaWQgSEFMX1NZU1RJQ0tfQ0xLU291cmNlQ29uZmlnKHVpbnQzMl90IENMS1NvdXJjZSk7Cit2b2lkIEhBTF9TWVNUSUNLX0lSUUhhbmRsZXIodm9pZCk7Cit2b2lkIEhBTF9TWVNUSUNLX0NhbGxiYWNrKHZvaWQpOworCisjaWYgKF9fTVBVX1BSRVNFTlQgPT0gMSkKK3ZvaWQgSEFMX01QVV9FbmFibGUodWludDMyX3QgTVBVX0NvbnRyb2wpOwordm9pZCBIQUxfTVBVX0Rpc2FibGUodm9pZCk7Cit2b2lkIEhBTF9NUFVfRW5hYmxlUmVnaW9uKHVpbnQzMl90IFJlZ2lvbk51bWJlcik7Cit2b2lkIEhBTF9NUFVfRGlzYWJsZVJlZ2lvbih1aW50MzJfdCBSZWdpb25OdW1iZXIpOwordm9pZCBIQUxfTVBVX0NvbmZpZ1JlZ2lvbihNUFVfUmVnaW9uX0luaXRUeXBlRGVmICpNUFVfSW5pdCk7CisjZW5kaWYgLyogX19NUFVfUFJFU0VOVCAqLworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBDT1JURVhfUHJpdmF0ZV9NYWNyb3MgQ09SVEVYIFByaXZhdGUgTWFjcm9zCisgKiBAeworICovCisjZGVmaW5lIElTX05WSUNfUFJJT1JJVFlfR1JPVVAoR1JPVVApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoR1JPVVApID09IE5WSUNfUFJJT1JJVFlHUk9VUF8wKSB8fCAoKEdST1VQKSA9PSBOVklDX1BSSU9SSVRZR1JPVVBfMSkgfHwgXAorICAgKChHUk9VUCkgPT0gTlZJQ19QUklPUklUWUdST1VQXzIpIHx8ICgoR1JPVVApID09IE5WSUNfUFJJT1JJVFlHUk9VUF8zKSB8fCBcCisgICAoKEdST1VQKSA9PSBOVklDX1BSSU9SSVRZR1JPVVBfNCkpCisKKyNkZWZpbmUgSVNfTlZJQ19QUkVFTVBUSU9OX1BSSU9SSVRZKFBSSU9SSVRZKSAoKFBSSU9SSVRZKSA8IDB4MTBVKQorCisjZGVmaW5lIElTX05WSUNfU1VCX1BSSU9SSVRZKFBSSU9SSVRZKSAoKFBSSU9SSVRZKSA8IDB4MTBVKQorCisjZGVmaW5lIElTX05WSUNfREVWSUNFX0lSUShJUlEpICgoSVJRKSA+IFN5c1RpY2tfSVJRbikKKworI2RlZmluZSBJU19TWVNUSUNLX0NMS19TT1VSQ0UoU09VUkNFKSAgICAgIFwKKyAgKCgoU09VUkNFKSA9PSBTWVNUSUNLX0NMS1NPVVJDRV9IQ0xLKSB8fCBcCisgICAoKFNPVVJDRSkgPT0gU1lTVElDS19DTEtTT1VSQ0VfSENMS19ESVY4KSkKKworI2lmIChfX01QVV9QUkVTRU5UID09IDEpCisjZGVmaW5lIElTX01QVV9SRUdJT05fRU5BQkxFKFNUQVRFKSBcCisgICgoKFNUQVRFKSA9PSBNUFVfUkVHSU9OX0VOQUJMRSkgfHwgKChTVEFURSkgPT0gTVBVX1JFR0lPTl9ESVNBQkxFKSkKKworI2RlZmluZSBJU19NUFVfSU5TVFJVQ1RJT05fQUNDRVNTKFNUQVRFKSAgICAgICAgIFwKKyAgKCgoU1RBVEUpID09IE1QVV9JTlNUUlVDVElPTl9BQ0NFU1NfRU5BQkxFKSB8fCBcCisgICAoKFNUQVRFKSA9PSBNUFVfSU5TVFJVQ1RJT05fQUNDRVNTX0RJU0FCTEUpKQorCisjZGVmaW5lIElTX01QVV9BQ0NFU1NfU0hBUkVBQkxFKFNUQVRFKSBcCisgICgoKFNUQVRFKSA9PSBNUFVfQUNDRVNTX1NIQVJFQUJMRSkgfHwgKChTVEFURSkgPT0gTVBVX0FDQ0VTU19OT1RfU0hBUkVBQkxFKSkKKworI2RlZmluZSBJU19NUFVfQUNDRVNTX0NBQ0hFQUJMRShTVEFURSkgXAorICAoKChTVEFURSkgPT0gTVBVX0FDQ0VTU19DQUNIRUFCTEUpIHx8ICgoU1RBVEUpID09IE1QVV9BQ0NFU1NfTk9UX0NBQ0hFQUJMRSkpCisKKyNkZWZpbmUgSVNfTVBVX0FDQ0VTU19CVUZGRVJBQkxFKFNUQVRFKSBcCisgICgoKFNUQVRFKSA9PSBNUFVfQUNDRVNTX0JVRkZFUkFCTEUpIHx8ICgoU1RBVEUpID09IE1QVV9BQ0NFU1NfTk9UX0JVRkZFUkFCTEUpKQorCisjZGVmaW5lIElTX01QVV9URVhfTEVWRUwoVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKFRZUEUpID09IE1QVV9URVhfTEVWRUwwKSB8fCAoKFRZUEUpID09IE1QVV9URVhfTEVWRUwxKSB8fCBcCisgICAoKFRZUEUpID09IE1QVV9URVhfTEVWRUwyKSB8fCAoKFRZUEUpID09IE1QVV9URVhfTEVWRUw0KSkKKworI2RlZmluZSBJU19NUFVfUkVHSU9OX1BFUk1JU1NJT05fQVRUUklCVVRFKFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoVFlQRSkgPT0gTVBVX1JFR0lPTl9OT19BQ0NFU1MpIHx8ICgoVFlQRSkgPT0gTVBVX1JFR0lPTl9QUklWX1JXKSB8fCAgICAgICBcCisgICAoKFRZUEUpID09IE1QVV9SRUdJT05fUFJJVl9SV19VUk8pIHx8ICgoVFlQRSkgPT0gTVBVX1JFR0lPTl9GVUxMX0FDQ0VTUykgfHwgXAorICAgKChUWVBFKSA9PSBNUFVfUkVHSU9OX1BSSVZfUk8pIHx8ICgoVFlQRSkgPT0gTVBVX1JFR0lPTl9QUklWX1JPX1VSTykpCisKKyNkZWZpbmUgSVNfTVBVX1JFR0lPTl9OVU1CRVIoTlVNQkVSKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoTlVNQkVSKSA9PSBNUFVfUkVHSU9OX05VTUJFUjApIHx8ICgoTlVNQkVSKSA9PSBNUFVfUkVHSU9OX05VTUJFUjEpIHx8IFwKKyAgICgoTlVNQkVSKSA9PSBNUFVfUkVHSU9OX05VTUJFUjIpIHx8ICgoTlVNQkVSKSA9PSBNUFVfUkVHSU9OX05VTUJFUjMpIHx8IFwKKyAgICgoTlVNQkVSKSA9PSBNUFVfUkVHSU9OX05VTUJFUjQpIHx8ICgoTlVNQkVSKSA9PSBNUFVfUkVHSU9OX05VTUJFUjUpIHx8IFwKKyAgICgoTlVNQkVSKSA9PSBNUFVfUkVHSU9OX05VTUJFUjYpIHx8ICgoTlVNQkVSKSA9PSBNUFVfUkVHSU9OX05VTUJFUjcpKQorCisjZGVmaW5lIElTX01QVV9SRUdJT05fU0laRShTSVpFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoU0laRSkgPT0gTVBVX1JFR0lPTl9TSVpFXzMyQikgfHwgKChTSVpFKSA9PSBNUFVfUkVHSU9OX1NJWkVfNjRCKSB8fCAgICAgXAorICAgKChTSVpFKSA9PSBNUFVfUkVHSU9OX1NJWkVfMTI4QikgfHwgKChTSVpFKSA9PSBNUFVfUkVHSU9OX1NJWkVfMjU2QikgfHwgICBcCisgICAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV81MTJCKSB8fCAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV8xS0IpIHx8ICAgIFwKKyAgICgoU0laRSkgPT0gTVBVX1JFR0lPTl9TSVpFXzJLQikgfHwgKChTSVpFKSA9PSBNUFVfUkVHSU9OX1NJWkVfNEtCKSB8fCAgICAgXAorICAgKChTSVpFKSA9PSBNUFVfUkVHSU9OX1NJWkVfOEtCKSB8fCAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV8xNktCKSB8fCAgICBcCisgICAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV8zMktCKSB8fCAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV82NEtCKSB8fCAgIFwKKyAgICgoU0laRSkgPT0gTVBVX1JFR0lPTl9TSVpFXzEyOEtCKSB8fCAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV8yNTZLQikgfHwgXAorICAgKChTSVpFKSA9PSBNUFVfUkVHSU9OX1NJWkVfNTEyS0IpIHx8ICgoU0laRSkgPT0gTVBVX1JFR0lPTl9TSVpFXzFNQikgfHwgICBcCisgICAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV8yTUIpIHx8ICgoU0laRSkgPT0gTVBVX1JFR0lPTl9TSVpFXzRNQikgfHwgICAgIFwKKyAgICgoU0laRSkgPT0gTVBVX1JFR0lPTl9TSVpFXzhNQikgfHwgKChTSVpFKSA9PSBNUFVfUkVHSU9OX1NJWkVfMTZNQikgfHwgICAgXAorICAgKChTSVpFKSA9PSBNUFVfUkVHSU9OX1NJWkVfMzJNQikgfHwgKChTSVpFKSA9PSBNUFVfUkVHSU9OX1NJWkVfNjRNQikgfHwgICBcCisgICAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV8xMjhNQikgfHwgKChTSVpFKSA9PSBNUFVfUkVHSU9OX1NJWkVfMjU2TUIpIHx8IFwKKyAgICgoU0laRSkgPT0gTVBVX1JFR0lPTl9TSVpFXzUxMk1CKSB8fCAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV8xR0IpIHx8ICAgXAorICAgKChTSVpFKSA9PSBNUFVfUkVHSU9OX1NJWkVfMkdCKSB8fCAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV80R0IpKQorCisjZGVmaW5lIElTX01QVV9TVUJfUkVHSU9OX0RJU0FCTEUoU1VCUkVHSU9OKSAoKFNVQlJFR0lPTikgPCAodWludDE2X3QpMHgwMEZGKQorI2VuZGlmIC8qIF9fTVBVX1BSRVNFTlQgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qIFByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fU1RNMzJHNHh4X0hBTF9DT1JURVhfSCAqLwpkaWZmIC0tZ2l0IGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfaGFsX2RlZi5oIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfaGFsX2RlZi5oCmluZGV4IGRmNzEyMmEuLjc4ZGY2NzAgMTAwNjQ0Ci0tLSBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9JbmMvc3RtMzJnNHh4X2hhbF9kZWYuaAorKysgYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9oYWxfZGVmLmgKQEAgLTEsMjA2ICsxLDIwOCBAQAotLyoqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEBmaWxlICAgIHN0bTMyZzR4eF9oYWxfZGVmLmgNCi0gKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQ0KLSAqIEBicmllZiAgIFRoaXMgZmlsZSBjb250YWlucyBIQUwgY29tbW9uIGRlZmluZXMsIGVudW1lcmF0aW9uLCBtYWNyb3MgYW5kDQotICogICAgICAgICAgc3RydWN0dXJlcyBkZWZpbml0aW9ucy4NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQGF0dGVudGlvbg0KLSAqDQotICogQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KLSAqDQotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0ZXJtcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlDQotICogaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc29mdHdhcmUgY29tcG9uZW50Lg0KLSAqIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcyB3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLg0KLSAqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqLw0KLQ0KLS8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotI2lmbmRlZiBfX1NUTTMyRzR4eF9IQUxfREVGDQotI2RlZmluZSBfX1NUTTMyRzR4eF9IQUxfREVGDQotDQotI2lmZGVmIF9fY3BsdXNwbHVzDQotZXh0ZXJuICJDIiB7DQotI2VuZGlmDQotDQotLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaW5jbHVkZSA8c3RkZGVmLmg+DQotDQotI2luY2x1ZGUgIkxlZ2FjeS9zdG0zMl9oYWxfbGVnYWN5LmgiIC8qIEFsaWFzZXMgZmlsZSBmb3Igb2xkIG5hbWVzIGNvbXBhdGliaWxpdHkgKi8NCi0jaW5jbHVkZSAic3RtMzJnNHh4LmgiDQotDQotLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEhBTCBTdGF0dXMgc3RydWN0dXJlcyBkZWZpbml0aW9uDQotICovDQotdHlwZWRlZiBlbnVtIHsNCi0gIEhBTF9PSyA9IDB4MDBVLA0KLSAgSEFMX0VSUk9SID0gMHgwMVUsDQotICBIQUxfQlVTWSA9IDB4MDJVLA0KLSAgSEFMX1RJTUVPVVQgPSAweDAzVQ0KLX0gSEFMX1N0YXR1c1R5cGVEZWY7DQotDQotLyoqDQotICogQGJyaWVmICBIQUwgTG9jayBzdHJ1Y3R1cmVzIGRlZmluaXRpb24NCi0gKi8NCi10eXBlZGVmIGVudW0geyBIQUxfVU5MT0NLRUQgPSAweDAwVSwgSEFMX0xPQ0tFRCA9IDB4MDFVIH0gSEFMX0xvY2tUeXBlRGVmOw0KLQ0KLS8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotDQotI2RlZmluZSBIQUxfTUFYX0RFTEFZIDB4RkZGRkZGRkZVDQotDQotI2RlZmluZSBIQUxfSVNfQklUX1NFVChSRUcsIEJJVCkgKCgoUkVHKSAmIChCSVQpKSA9PSAoQklUKSkNCi0jZGVmaW5lIEhBTF9JU19CSVRfQ0xSKFJFRywgQklUKSAoKChSRUcpICYgKEJJVCkpID09IDBVKQ0KLQ0KLSNkZWZpbmUgX19IQUxfTElOS0RNQShfX0hBTkRMRV9fLCBfX1BQUF9ETUFfRklFTERfXywgX19ETUFfSEFORExFX18pIFwNCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIChfX0hBTkRMRV9fKS0+X19QUFBfRE1BX0ZJRUxEX18gPSAmKF9fRE1BX0hBTkRMRV9fKTsgICAgICAgICAgICAgXA0KLSAgICAoX19ETUFfSEFORExFX18pLlBhcmVudCA9IChfX0hBTkRMRV9fKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIH0gd2hpbGUgKDApDQotDQotI2RlZmluZSBVTlVTRUQoWCkgKHZvaWQpWA0KLQ0KLS8qKiBAYnJpZWYgUmVzZXQgdGhlIEhhbmRsZSdzIFN0YXRlIGZpZWxkLg0KLSAqIEBwYXJhbSBfX0hBTkRMRV9fOiBzcGVjaWZpZXMgdGhlIFBlcmlwaGVyYWwgSGFuZGxlLg0KLSAqIEBub3RlICBUaGlzIG1hY3JvIGNhbiBiZSB1c2VkIGZvciB0aGUgZm9sbG93aW5nIHB1cnBvc2U6DQotICogICAgICAgICAgLSBXaGVuIHRoZSBIYW5kbGUgaXMgZGVjbGFyZWQgYXMgbG9jYWwgdmFyaWFibGU7IGJlZm9yZSBwYXNzaW5nIGl0DQotICogYXMgcGFyYW1ldGVyIHRvIEhBTF9QUFBfSW5pdCgpIGZvciB0aGUgZmlyc3QgdGltZSwgaXQgaXMgbWFuZGF0b3J5IHRvIHVzZQ0KLSAqIHRoaXMgbWFjcm8gdG8gc2V0IHRvIDAgdGhlIEhhbmRsZSdzICJTdGF0ZSIgZmllbGQuIE90aGVyd2lzZSwgIlN0YXRlIiBmaWVsZA0KLSAqIG1heSBoYXZlIGFueSByYW5kb20gdmFsdWUgYW5kIHRoZSBmaXJzdCB0aW1lIHRoZSBmdW5jdGlvbiBIQUxfUFBQX0luaXQoKSBpcw0KLSAqIGNhbGxlZCwgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSBpbml0aWFsaXphdGlvbiB3aWxsIGJlIG1pc3NlZCAoaS5lLg0KLSAqIEhBTF9QUFBfTXNwSW5pdCgpIHdpbGwgbm90IGJlIGV4ZWN1dGVkKS4NCi0gKiAgICAgICAgICAtIFdoZW4gdGhlcmUgaXMgYSBuZWVkIHRvIHJlY29uZmlndXJlIHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmU6DQotICogaW5zdGVhZCBvZiBjYWxsaW5nIEhBTF9QUFBfRGVJbml0KCkgdGhlbiBIQUxfUFBQX0luaXQoKSwgdXNlciBjYW4gbWFrZSBhIGNhbGwNCi0gKiB0byB0aGlzIG1hY3JvIHRoZW4gSEFMX1BQUF9Jbml0KCkuIEluIHRoaXMgbGF0ZXIgZnVuY3Rpb24sIHdoZW4gdGhlIEhhbmRsZSdzDQotICogIlN0YXRlIiBmaWVsZCBpcyBzZXQgdG8gMCwgaXQgd2lsbCBleGVjdXRlIHRoZSBmdW5jdGlvbiBIQUxfUFBQX01zcEluaXQoKQ0KLSAqIHdoaWNoIHdpbGwgcmVjb25maWd1cmUgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pLT5TdGF0ZSA9IDApDQotDQotI2lmIChVU0VfUlRPUyA9PSAxVSkNCi0vKiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAqLw0KLSNlcnJvciAiIFVTRV9SVE9TIHNob3VsZCBiZSAwIGluIHRoZSBjdXJyZW50IEhBTCByZWxlYXNlICINCi0jZWxzZQ0KLSNkZWZpbmUgX19IQUxfTE9DSyhfX0hBTkRMRV9fKSAgICAgICAgICAgICAgXA0KLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBpZiAoKF9fSEFORExFX18pLT5Mb2NrID09IEhBTF9MT0NLRUQpIHsgXA0KLSAgICAgIHJldHVybiBIQUxfQlVTWTsgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgIChfX0hBTkRMRV9fKS0+TG9jayA9IEhBTF9MT0NLRUQ7ICAgICAgXA0KLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgfSB3aGlsZSAoMFUpDQotDQotI2RlZmluZSBfX0hBTF9VTkxPQ0soX19IQU5ETEVfXykgICAgICAgXA0KLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgKF9fSEFORExFX18pLT5Mb2NrID0gSEFMX1VOTE9DS0VEOyBcDQotICB9IHdoaWxlICgwVSkNCi0jZW5kaWYgLyogVVNFX1JUT1MgKi8NCi0NCi0jaWYgZGVmaW5lZChfX0FSTUNDX1ZFUlNJT04pICYmIFwNCi0gICAgKF9fQVJNQ0NfVkVSU0lPTiA+PSA2MDEwMDUwKSAvKiBBUk0gQ29tcGlsZXIgVjYgKi8NCi0jaWZuZGVmIF9fd2Vhaw0KLSNkZWZpbmUgX193ZWFrIF9fYXR0cmlidXRlX18oKHdlYWspKQ0KLSNlbmRpZg0KLSNpZm5kZWYgX19wYWNrZWQNCi0jZGVmaW5lIF9fcGFja2VkIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpDQotI2VuZGlmDQotI2VsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19DQ19BUk0pIC8qIEdOVSBDb21waWxlciAqLw0KLSNpZm5kZWYgX193ZWFrDQotI2RlZmluZSBfX3dlYWsgX19hdHRyaWJ1dGVfXygod2VhaykpDQotI2VuZGlmIC8qIF9fd2VhayAqLw0KLSNpZm5kZWYgX19wYWNrZWQNCi0jZGVmaW5lIF9fcGFja2VkIF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKQ0KLSNlbmRpZiAvKiBfX3BhY2tlZCAqLw0KLSNlbmRpZiAvKiBfX0dOVUNfXyAqLw0KLQ0KLS8qIE1hY3JvIHRvIGdldCB2YXJpYWJsZSBhbGlnbmVkIG9uIDQtYnl0ZXMsIGZvciBfX0lDQ0FSTV9fIHRoZSBkaXJlY3RpdmUNCi0gKiAiI3ByYWdtYSBkYXRhX2FsaWdubWVudD00IiBtdXN0IGJlIHVzZWQgaW5zdGVhZCAqLw0KLSNpZiBkZWZpbmVkKF9fQVJNQ0NfVkVSU0lPTikgJiYgXA0KLSAgICAoX19BUk1DQ19WRVJTSU9OID49IDYwMTAwNTApIC8qIEFSTSBDb21waWxlciBWNiAqLw0KLSNpZm5kZWYgX19BTElHTl9CRUdJTg0KLSNkZWZpbmUgX19BTElHTl9CRUdJTg0KLSNlbmRpZg0KLSNpZm5kZWYgX19BTElHTl9FTkQNCi0jZGVmaW5lIF9fQUxJR05fRU5EIF9fYXR0cmlidXRlX18oKGFsaWduZWQoNCkpKQ0KLSNlbmRpZg0KLSNlbGlmIGRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKF9fQ0NfQVJNKSAvKiBHTlUgQ29tcGlsZXIgKi8NCi0jaWZuZGVmIF9fQUxJR05fRU5EDQotI2RlZmluZSBfX0FMSUdOX0VORCBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDRVKSkpDQotI2VuZGlmIC8qIF9fQUxJR05fRU5EICovDQotI2lmbmRlZiBfX0FMSUdOX0JFR0lODQotI2RlZmluZSBfX0FMSUdOX0JFR0lODQotI2VuZGlmIC8qIF9fQUxJR05fQkVHSU4gKi8NCi0jZWxzZQ0KLSNpZm5kZWYgX19BTElHTl9FTkQNCi0jZGVmaW5lIF9fQUxJR05fRU5EDQotI2VuZGlmIC8qIF9fQUxJR05fRU5EICovDQotI2lmbmRlZiBfX0FMSUdOX0JFR0lODQotI2lmIGRlZmluZWQoX19DQ19BUk0pIC8qIEFSTSBDb21waWxlciBWNSovDQotI2RlZmluZSBfX0FMSUdOX0JFR0lOIF9fYWxpZ24oNFUpDQotI2VsaWYgZGVmaW5lZChfX0lDQ0FSTV9fKSAvKiBJQVIgQ29tcGlsZXIgKi8NCi0jZGVmaW5lIF9fQUxJR05fQkVHSU4NCi0jZW5kaWYgLyogX19DQ19BUk0gKi8NCi0jZW5kaWYgLyogX19BTElHTl9CRUdJTiAqLw0KLSNlbmRpZiAvKiBfX0dOVUNfXyAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgX19SQU1fRlVOQyBkZWZpbml0aW9uDQotICovDQotI2lmIGRlZmluZWQoX19DQ19BUk0pIHx8IFwNCi0gICAgKGRlZmluZWQoX19BUk1DQ19WRVJTSU9OKSAmJiAoX19BUk1DQ19WRVJTSU9OID49IDYwMTAwNTApKQ0KLS8qIEFSTSBDb21waWxlciBWNC9WNSBhbmQgVjYNCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSAgIFJBTSBmdW5jdGlvbnMgYXJlIGRlZmluZWQgdXNpbmcgdGhlIHRvb2xjaGFpbiBvcHRpb25zLg0KLSAgIEZ1bmN0aW9ucyB0aGF0IGFyZSBleGVjdXRlZCBpbiBSQU0gc2hvdWxkIHJlc2lkZSBpbiBhIHNlcGFyYXRlIHNvdXJjZSBtb2R1bGUuDQotICAgVXNpbmcgdGhlICdPcHRpb25zIGZvciBGaWxlJyBkaWFsb2cgeW91IGNhbiBzaW1wbHkgY2hhbmdlIHRoZSAnQ29kZSAvIENvbnN0Jw0KLSAgIGFyZWEgb2YgYSBtb2R1bGUgdG8gYSBtZW1vcnkgc3BhY2UgaW4gcGh5c2ljYWwgUkFNLg0KLSAgIEF2YWlsYWJsZSBtZW1vcnkgYXJlYXMgYXJlIGRlY2xhcmVkIGluIHRoZSAnVGFyZ2V0JyB0YWIgb2YgdGhlICdPcHRpb25zIGZvcg0KLSAgIFRhcmdldCcgZGlhbG9nLg0KLSovDQotI2RlZmluZSBfX1JBTV9GVU5DDQotDQotI2VsaWYgZGVmaW5lZChfX0lDQ0FSTV9fKQ0KLS8qIElDQ0FSTSBDb21waWxlcg0KLSAgIC0tLS0tLS0tLS0tLS0tLQ0KLSAgIFJBTSBmdW5jdGlvbnMgYXJlIGRlZmluZWQgdXNpbmcgYSBzcGVjaWZpYyB0b29sY2hhaW4ga2V5d29yZCAiX19yYW1mdW5jIi4NCi0qLw0KLSNkZWZpbmUgX19SQU1fRlVOQyBfX3JhbWZ1bmMNCi0NCi0jZWxpZiBkZWZpbmVkKF9fR05VQ19fKQ0KLS8qIEdOVSBDb21waWxlcg0KLSAgIC0tLS0tLS0tLS0tLQ0KLSAgUkFNIGZ1bmN0aW9ucyBhcmUgZGVmaW5lZCB1c2luZyBhIHNwZWNpZmljIHRvb2xjaGFpbiBhdHRyaWJ1dGUNCi0gICAiX19hdHRyaWJ1dGVfXygoc2VjdGlvbigiLlJhbUZ1bmMiKSkpIi4NCi0qLw0KLSNkZWZpbmUgX19SQU1fRlVOQyBfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKCIuUmFtRnVuYyIpKSkNCi0NCi0jZW5kaWYgLyogX19DQ19BUk0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIF9fTk9JTkxJTkUgZGVmaW5pdGlvbg0KLSAqLw0KLSNpZiBkZWZpbmVkKF9fQ0NfQVJNKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgKGRlZmluZWQoX19BUk1DQ19WRVJTSU9OKSAmJiAoX19BUk1DQ19WRVJTSU9OID49IDYwMTAwNTApKSB8fCBcDQotICAgIGRlZmluZWQoX19HTlVDX18pDQotLyogQVJNIFY0L1Y1IGFuZCBWNiAmIEdOVSBDb21waWxlcg0KLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0qLw0KLSNkZWZpbmUgX19OT0lOTElORSBfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpDQotDQotI2VsaWYgZGVmaW5lZChfX0lDQ0FSTV9fKQ0KLS8qIElDQ0FSTSBDb21waWxlcg0KLSAgIC0tLS0tLS0tLS0tLS0tLQ0KLSovDQotI2RlZmluZSBfX05PSU5MSU5FIF9QcmFnbWEoIm9wdGltaXplID0gbm9faW5saW5lIikNCi0NCi0jZW5kaWYgLyogX19DQ19BUk0gfHwgX19HTlVDX18gKi8NCi0NCi0jaWZkZWYgX19jcGx1c3BsdXMNCi19DQotI2VuZGlmDQotDQotI2VuZGlmIC8qIF9fX1NUTTMyRzR4eF9IQUxfREVGICovDQorLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAZmlsZSAgICBzdG0zMmc0eHhfaGFsX2RlZi5oCisgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICogQGJyaWVmICAgVGhpcyBmaWxlIGNvbnRhaW5zIEhBTCBjb21tb24gZGVmaW5lcywgZW51bWVyYXRpb24sIG1hY3JvcyBhbmQKKyAqICAgICAgICAgIHN0cnVjdHVyZXMgZGVmaW5pdGlvbnMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYXR0ZW50aW9uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0ZXJtcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlCisgKiBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb2Z0d2FyZSBjb21wb25lbnQuCisgKiBJZiBubyBMSUNFTlNFIGZpbGUgY29tZXMgd2l0aCB0aGlzIHNvZnR3YXJlLCBpdCBpcyBwcm92aWRlZCBBUy1JUy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgX19TVE0zMkc0eHhfSEFMX0RFRgorI2RlZmluZSBfX1NUTTMyRzR4eF9IQUxfREVGCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2luY2x1ZGUgIkxlZ2FjeS9zdG0zMl9oYWxfbGVnYWN5LmgiIC8qIEFsaWFzZXMgZmlsZSBmb3Igb2xkIG5hbWVzIGNvbXBhdGliaWxpdHkgKi8KKyNpbmNsdWRlICJzdG0zMmc0eHguaCIKKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBAYnJpZWYgIEhBTCBTdGF0dXMgc3RydWN0dXJlcyBkZWZpbml0aW9uCisgKi8KK3R5cGVkZWYgZW51bSB7CisgIEhBTF9PSyA9IDB4MDBVLAorICBIQUxfRVJST1IgPSAweDAxVSwKKyAgSEFMX0JVU1kgPSAweDAyVSwKKyAgSEFMX1RJTUVPVVQgPSAweDAzVQorfSBIQUxfU3RhdHVzVHlwZURlZjsKKworLyoqCisgKiBAYnJpZWYgIEhBTCBMb2NrIHN0cnVjdHVyZXMgZGVmaW5pdGlvbgorICovCit0eXBlZGVmIGVudW0geyBIQUxfVU5MT0NLRUQgPSAweDAwVSwgSEFMX0xPQ0tFRCA9IDB4MDFVIH0gSEFMX0xvY2tUeXBlRGVmOworCisvKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIEhBTF9NQVhfREVMQVkgMHhGRkZGRkZGRlUKKworI2RlZmluZSBIQUxfSVNfQklUX1NFVChSRUcsIEJJVCkgKCgoUkVHKSAmIChCSVQpKSA9PSAoQklUKSkKKyNkZWZpbmUgSEFMX0lTX0JJVF9DTFIoUkVHLCBCSVQpICgoKFJFRykgJiAoQklUKSkgPT0gMFUpCisKKyNkZWZpbmUgX19IQUxfTElOS0RNQShfX0hBTkRMRV9fLCBfX1BQUF9ETUFfRklFTERfXywgX19ETUFfSEFORExFX18pIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoX19IQU5ETEVfXyktPl9fUFBQX0RNQV9GSUVMRF9fID0gJihfX0RNQV9IQU5ETEVfXyk7ICAgICAgICAgICAgIFwKKyAgICAoX19ETUFfSEFORExFX18pLlBhcmVudCA9IChfX0hBTkRMRV9fKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2lmICFkZWZpbmVkKFVOVVNFRCkKKyNkZWZpbmUgVU5VU0VEKFgpICh2b2lkKVggLyogVG8gYXZvaWQgZ2NjL2crKyB3YXJuaW5ncyAqLworI2VuZGlmICAgICAgICAgICAgICAgICAgICAvKiBVTlVTRUQgKi8KKworLyoqIEBicmllZiBSZXNldCB0aGUgSGFuZGxlJ3MgU3RhdGUgZmllbGQuCisgKiBAcGFyYW0gX19IQU5ETEVfXzogc3BlY2lmaWVzIHRoZSBQZXJpcGhlcmFsIEhhbmRsZS4KKyAqIEBub3RlICBUaGlzIG1hY3JvIGNhbiBiZSB1c2VkIGZvciB0aGUgZm9sbG93aW5nIHB1cnBvc2U6CisgKiAgICAgICAgICAtIFdoZW4gdGhlIEhhbmRsZSBpcyBkZWNsYXJlZCBhcyBsb2NhbCB2YXJpYWJsZTsgYmVmb3JlIHBhc3NpbmcgaXQKKyAqIGFzIHBhcmFtZXRlciB0byBIQUxfUFBQX0luaXQoKSBmb3IgdGhlIGZpcnN0IHRpbWUsIGl0IGlzIG1hbmRhdG9yeSB0byB1c2UKKyAqIHRoaXMgbWFjcm8gdG8gc2V0IHRvIDAgdGhlIEhhbmRsZSdzICJTdGF0ZSIgZmllbGQuIE90aGVyd2lzZSwgIlN0YXRlIiBmaWVsZAorICogbWF5IGhhdmUgYW55IHJhbmRvbSB2YWx1ZSBhbmQgdGhlIGZpcnN0IHRpbWUgdGhlIGZ1bmN0aW9uIEhBTF9QUFBfSW5pdCgpIGlzCisgKiBjYWxsZWQsIHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgaW5pdGlhbGl6YXRpb24gd2lsbCBiZSBtaXNzZWQgKGkuZS4KKyAqIEhBTF9QUFBfTXNwSW5pdCgpIHdpbGwgbm90IGJlIGV4ZWN1dGVkKS4KKyAqICAgICAgICAgIC0gV2hlbiB0aGVyZSBpcyBhIG5lZWQgdG8gcmVjb25maWd1cmUgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZToKKyAqIGluc3RlYWQgb2YgY2FsbGluZyBIQUxfUFBQX0RlSW5pdCgpIHRoZW4gSEFMX1BQUF9Jbml0KCksIHVzZXIgY2FuIG1ha2UgYSBjYWxsCisgKiB0byB0aGlzIG1hY3JvIHRoZW4gSEFMX1BQUF9Jbml0KCkuIEluIHRoaXMgbGF0ZXIgZnVuY3Rpb24sIHdoZW4gdGhlIEhhbmRsZSdzCisgKiAiU3RhdGUiIGZpZWxkIGlzIHNldCB0byAwLCBpdCB3aWxsIGV4ZWN1dGUgdGhlIGZ1bmN0aW9uIEhBTF9QUFBfTXNwSW5pdCgpCisgKiB3aGljaCB3aWxsIHJlY29uZmlndXJlIHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+U3RhdGUgPSAwKQorCisjaWYgKFVTRV9SVE9TID09IDFVKQorLyogUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KKyNlcnJvciAiIFVTRV9SVE9TIHNob3VsZCBiZSAwIGluIHRoZSBjdXJyZW50IEhBTCByZWxlYXNlICIKKyNlbHNlCisjZGVmaW5lIF9fSEFMX0xPQ0soX19IQU5ETEVfXykgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoX19IQU5ETEVfXyktPkxvY2sgPT0gSEFMX0xPQ0tFRCkgeyBcCisgICAgICByZXR1cm4gSEFMX0JVU1k7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKF9fSEFORExFX18pLT5Mb2NrID0gSEFMX0xPQ0tFRDsgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMFUpCisKKyNkZWZpbmUgX19IQUxfVU5MT0NLKF9fSEFORExFX18pICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoX19IQU5ETEVfXyktPkxvY2sgPSBIQUxfVU5MT0NLRUQ7IFwKKyAgfSB3aGlsZSAoMFUpCisjZW5kaWYgLyogVVNFX1JUT1MgKi8KKworI2lmIGRlZmluZWQoX19BUk1DQ19WRVJTSU9OKSAmJiBcCisgICAgKF9fQVJNQ0NfVkVSU0lPTiA+PSA2MDEwMDUwKSAvKiBBUk0gQ29tcGlsZXIgVjYgKi8KKyNpZm5kZWYgX193ZWFrCisjZGVmaW5lIF9fd2VhayBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkKKyNlbmRpZgorI2lmbmRlZiBfX3BhY2tlZAorI2RlZmluZSBfX3BhY2tlZCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKQorI2VuZGlmCisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX0NDX0FSTSkgLyogR05VIENvbXBpbGVyICovCisjaWZuZGVmIF9fd2VhaworI2RlZmluZSBfX3dlYWsgX19hdHRyaWJ1dGVfXygod2VhaykpCisjZW5kaWYgLyogX193ZWFrICovCisjaWZuZGVmIF9fcGFja2VkCisjZGVmaW5lIF9fcGFja2VkIF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKQorI2VuZGlmIC8qIF9fcGFja2VkICovCisjZW5kaWYgLyogX19HTlVDX18gKi8KKworLyogTWFjcm8gdG8gZ2V0IHZhcmlhYmxlIGFsaWduZWQgb24gNC1ieXRlcywgZm9yIF9fSUNDQVJNX18gdGhlIGRpcmVjdGl2ZQorICogIiNwcmFnbWEgZGF0YV9hbGlnbm1lbnQ9NCIgbXVzdCBiZSB1c2VkIGluc3RlYWQgKi8KKyNpZiBkZWZpbmVkKF9fQVJNQ0NfVkVSU0lPTikgJiYgXAorICAgIChfX0FSTUNDX1ZFUlNJT04gPj0gNjAxMDA1MCkgLyogQVJNIENvbXBpbGVyIFY2ICovCisjaWZuZGVmIF9fQUxJR05fQkVHSU4KKyNkZWZpbmUgX19BTElHTl9CRUdJTgorI2VuZGlmCisjaWZuZGVmIF9fQUxJR05fRU5ECisjZGVmaW5lIF9fQUxJR05fRU5EIF9fYXR0cmlidXRlX18oKGFsaWduZWQoNCkpKQorI2VuZGlmCisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX0NDX0FSTSkgLyogR05VIENvbXBpbGVyICovCisjaWZuZGVmIF9fQUxJR05fRU5ECisjZGVmaW5lIF9fQUxJR05fRU5EIF9fYXR0cmlidXRlX18oKGFsaWduZWQoNFUpKSkKKyNlbmRpZiAvKiBfX0FMSUdOX0VORCAqLworI2lmbmRlZiBfX0FMSUdOX0JFR0lOCisjZGVmaW5lIF9fQUxJR05fQkVHSU4KKyNlbmRpZiAvKiBfX0FMSUdOX0JFR0lOICovCisjZWxzZQorI2lmbmRlZiBfX0FMSUdOX0VORAorI2RlZmluZSBfX0FMSUdOX0VORAorI2VuZGlmIC8qIF9fQUxJR05fRU5EICovCisjaWZuZGVmIF9fQUxJR05fQkVHSU4KKyNpZiBkZWZpbmVkKF9fQ0NfQVJNKSAvKiBBUk0gQ29tcGlsZXIgVjUqLworI2RlZmluZSBfX0FMSUdOX0JFR0lOIF9fYWxpZ24oNFUpCisjZWxpZiBkZWZpbmVkKF9fSUNDQVJNX18pIC8qIElBUiBDb21waWxlciAqLworI2RlZmluZSBfX0FMSUdOX0JFR0lOCisjZW5kaWYgLyogX19DQ19BUk0gKi8KKyNlbmRpZiAvKiBfX0FMSUdOX0JFR0lOICovCisjZW5kaWYgLyogX19HTlVDX18gKi8KKworLyoqCisgKiBAYnJpZWYgIF9fUkFNX0ZVTkMgZGVmaW5pdGlvbgorICovCisjaWYgZGVmaW5lZChfX0NDX0FSTSkgfHwgXAorICAgIChkZWZpbmVkKF9fQVJNQ0NfVkVSU0lPTikgJiYgKF9fQVJNQ0NfVkVSU0lPTiA+PSA2MDEwMDUwKSkKKy8qIEFSTSBDb21waWxlciBWNC9WNSBhbmQgVjYKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBSQU0gZnVuY3Rpb25zIGFyZSBkZWZpbmVkIHVzaW5nIHRoZSB0b29sY2hhaW4gb3B0aW9ucy4KKyAgIEZ1bmN0aW9ucyB0aGF0IGFyZSBleGVjdXRlZCBpbiBSQU0gc2hvdWxkIHJlc2lkZSBpbiBhIHNlcGFyYXRlIHNvdXJjZSBtb2R1bGUuCisgICBVc2luZyB0aGUgJ09wdGlvbnMgZm9yIEZpbGUnIGRpYWxvZyB5b3UgY2FuIHNpbXBseSBjaGFuZ2UgdGhlICdDb2RlIC8gQ29uc3QnCisgICBhcmVhIG9mIGEgbW9kdWxlIHRvIGEgbWVtb3J5IHNwYWNlIGluIHBoeXNpY2FsIFJBTS4KKyAgIEF2YWlsYWJsZSBtZW1vcnkgYXJlYXMgYXJlIGRlY2xhcmVkIGluIHRoZSAnVGFyZ2V0JyB0YWIgb2YgdGhlICdPcHRpb25zIGZvcgorICAgVGFyZ2V0JyBkaWFsb2cuCisqLworI2RlZmluZSBfX1JBTV9GVU5DCisKKyNlbGlmIGRlZmluZWQoX19JQ0NBUk1fXykKKy8qIElDQ0FSTSBDb21waWxlcgorICAgLS0tLS0tLS0tLS0tLS0tCisgICBSQU0gZnVuY3Rpb25zIGFyZSBkZWZpbmVkIHVzaW5nIGEgc3BlY2lmaWMgdG9vbGNoYWluIGtleXdvcmQgIl9fcmFtZnVuYyIuCisqLworI2RlZmluZSBfX1JBTV9GVU5DIF9fcmFtZnVuYworCisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKQorLyogR05VIENvbXBpbGVyCisgICAtLS0tLS0tLS0tLS0KKyAgUkFNIGZ1bmN0aW9ucyBhcmUgZGVmaW5lZCB1c2luZyBhIHNwZWNpZmljIHRvb2xjaGFpbiBhdHRyaWJ1dGUKKyAgICJfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKCIuUmFtRnVuYyIpKSkiLgorKi8KKyNkZWZpbmUgX19SQU1fRlVOQyBfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKCIuUmFtRnVuYyIpKSkKKworI2VuZGlmIC8qIF9fQ0NfQVJNICovCisKKy8qKgorICogQGJyaWVmICBfX05PSU5MSU5FIGRlZmluaXRpb24KKyAqLworI2lmIGRlZmluZWQoX19DQ19BUk0pIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChkZWZpbmVkKF9fQVJNQ0NfVkVSU0lPTikgJiYgKF9fQVJNQ0NfVkVSU0lPTiA+PSA2MDEwMDUwKSkgfHwgXAorICAgIGRlZmluZWQoX19HTlVDX18pCisvKiBBUk0gVjQvVjUgYW5kIFY2ICYgR05VIENvbXBpbGVyCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworI2RlZmluZSBfX05PSU5MSU5FIF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSkKKworI2VsaWYgZGVmaW5lZChfX0lDQ0FSTV9fKQorLyogSUNDQVJNIENvbXBpbGVyCisgICAtLS0tLS0tLS0tLS0tLS0KKyovCisjZGVmaW5lIF9fTk9JTkxJTkUgX1ByYWdtYSgib3B0aW1pemUgPSBub19pbmxpbmUiKQorCisjZW5kaWYgLyogX19DQ19BUk0gfHwgX19HTlVDX18gKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fX1NUTTMyRzR4eF9IQUxfREVGICovCmRpZmYgLS1naXQgYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9oYWxfZG1hLmggYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9oYWxfZG1hLmgKaW5kZXggZDdkMjAyZC4uMzE3Zjg1MSAxMDA2NDQKLS0tIGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfaGFsX2RtYS5oCisrKyBiL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9JbmMvc3RtMzJnNHh4X2hhbF9kbWEuaApAQCAtMSw5OTMgKzEsOTkzIEBACi0vKioNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQGZpbGUgICAgc3RtMzJnNHh4X2hhbF9kbWEuaA0KLSAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtDQotICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgRE1BIEhBTCBtb2R1bGUuDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEBhdHRlbnRpb24NCi0gKg0KLSAqIENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4NCi0gKg0KLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGVybXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZQ0KLSAqIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4NCi0gKiBJZiBubyBMSUNFTlNFIGZpbGUgY29tZXMgd2l0aCB0aGlzIHNvZnR3YXJlLCBpdCBpcyBwcm92aWRlZCBBUy1JUy4NCi0gKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKi8NCi0NCi0vKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpZm5kZWYgX19TVE0zMkc0eHhfSEFMX0RNQV9IDQotI2RlZmluZSBfX1NUTTMyRzR4eF9IQUxfRE1BX0gNCi0NCi0jaWZkZWYgX19jcGx1c3BsdXMNCi1leHRlcm4gIkMiIHsNCi0jZW5kaWYNCi0NCi0vKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpbmNsdWRlICJzdG0zMmc0eHhfaGFsX2RlZi5oIg0KLQ0KLS8qKiBAYWRkdG9ncm91cCBTVE0zMkc0eHhfSEFMX0RyaXZlcg0KLSAqIEB7DQotICovDQotDQotLyoqIEBhZGR0b2dyb3VwIERNQQ0KLSAqIEB7DQotICovDQotDQotLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGRlZmdyb3VwIERNQV9FeHBvcnRlZF9UeXBlcyBETUEgRXhwb3J0ZWQgVHlwZXMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRE1BIENvbmZpZ3VyYXRpb24gU3RydWN0dXJlIGRlZmluaXRpb24NCi0gKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICB1aW50MzJfdA0KLSAgICAgIFJlcXVlc3Q7IC8qITwgU3BlY2lmaWVzIHRoZSByZXF1ZXN0IHNlbGVjdGVkIGZvciB0aGUgc3BlY2lmaWVkIGNoYW5uZWwuDQotICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIERNQV9yZXF1ZXN0ICovDQotDQotICB1aW50MzJfdCBEaXJlY3Rpb247IC8qITwgU3BlY2lmaWVzIGlmIHRoZSBkYXRhIHdpbGwgYmUgdHJhbnNmZXJyZWQgZnJvbSBtZW1vcnkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgdG8gcGVyaXBoZXJhbCwgZnJvbSBtZW1vcnkgdG8gbWVtb3J5IG9yIGZyb20gcGVyaXBoZXJhbA0KLSAgICAgICAgICAgICAgICAgICAgICAgICB0byBtZW1vcnkuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgRE1BX0RhdGFfdHJhbnNmZXJfZGlyZWN0aW9uICovDQotDQotICB1aW50MzJfdCBQZXJpcGhJbmM7IC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIFBlcmlwaGVyYWwgYWRkcmVzcyByZWdpc3Rlcg0KLSAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgaW5jcmVtZW50ZWQgb3Igbm90LiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBvZiBAcmVmIERNQV9QZXJpcGhlcmFsX2luY3JlbWVudGVkX21vZGUgKi8NCi0NCi0gIHVpbnQzMl90IE1lbUluYzsgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgbWVtb3J5IGFkZHJlc3MgcmVnaXN0ZXIgc2hvdWxkIGJlDQotICAgICAgICAgICAgICAgICAgICAgIGluY3JlbWVudGVkIG9yIG5vdC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICBETUFfTWVtb3J5X2luY3JlbWVudGVkX21vZGUgKi8NCi0NCi0gIHVpbnQzMl90IFBlcmlwaERhdGFBbGlnbm1lbnQ7IC8qITwgU3BlY2lmaWVzIHRoZSBQZXJpcGhlcmFsIGRhdGEgd2lkdGguDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERNQV9QZXJpcGhlcmFsX2RhdGFfc2l6ZSAqLw0KLQ0KLSAgdWludDMyX3QgTWVtRGF0YUFsaWdubWVudDsgLyohPCBTcGVjaWZpZXMgdGhlIE1lbW9yeSBkYXRhIHdpZHRoLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBETUFfTWVtb3J5X2RhdGFfc2l6ZSAqLw0KLQ0KLSAgdWludDMyX3QgTW9kZTsgLyohPCBTcGVjaWZpZXMgdGhlIG9wZXJhdGlvbiBtb2RlIG9mIHRoZSBETUF5IENoYW5uZWx4Lg0KLSAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIERNQV9tb2RlDQotICAgICAgICAgICAgICAgICAgICAgIEBub3RlIFRoZSBjaXJjdWxhciBidWZmZXIgbW9kZSBjYW5ub3QgYmUgdXNlZCBpZiB0aGUNCi0gICAgICAgICAgICAgICAgICAgIG1lbW9yeS10by1tZW1vcnkgZGF0YSB0cmFuc2ZlciBpcyBjb25maWd1cmVkIG9uIHRoZSBzZWxlY3RlZA0KLSAgICAgICAgICAgICAgICAgICAgQ2hhbm5lbCAqLw0KLQ0KLSAgdWludDMyX3QNCi0gICAgICBQcmlvcml0eTsgLyohPCBTcGVjaWZpZXMgdGhlIHNvZnR3YXJlIHByaW9yaXR5IGZvciB0aGUgRE1BeSBDaGFubmVseC4NCi0gICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIERNQV9Qcmlvcml0eV9sZXZlbCAqLw0KLX0gRE1BX0luaXRUeXBlRGVmOw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSEFMIERNQSBTdGF0ZSBzdHJ1Y3R1cmVzIGRlZmluaXRpb24NCi0gKi8NCi10eXBlZGVmIGVudW0gew0KLSAgSEFMX0RNQV9TVEFURV9SRVNFVCA9IDB4MDBVLCAgIC8qITwgRE1BIG5vdCB5ZXQgaW5pdGlhbGl6ZWQgb3IgZGlzYWJsZWQgICAgKi8NCi0gIEhBTF9ETUFfU1RBVEVfUkVBRFkgPSAweDAxVSwgICAvKiE8IERNQSBpbml0aWFsaXplZCBhbmQgcmVhZHkgZm9yIHVzZSAgICAgICovDQotICBIQUxfRE1BX1NUQVRFX0JVU1kgPSAweDAyVSwgICAgLyohPCBETUEgcHJvY2VzcyBpcyBvbmdvaW5nICAgICAgICAgICAgICAgICAqLw0KLSAgSEFMX0RNQV9TVEFURV9USU1FT1VUID0gMHgwM1UsIC8qITwgRE1BIHRpbWVvdXQgc3RhdGUgICAgICAgICAgICAgICAgICAgICAqLw0KLX0gSEFMX0RNQV9TdGF0ZVR5cGVEZWY7DQotDQotLyoqDQotICogQGJyaWVmICBIQUwgRE1BIEVycm9yIENvZGUgc3RydWN0dXJlIGRlZmluaXRpb24NCi0gKi8NCi10eXBlZGVmIGVudW0gew0KLSAgSEFMX0RNQV9GVUxMX1RSQU5TRkVSID0gMHgwMFUsIC8qITwgRnVsbCB0cmFuc2ZlciAgICAgKi8NCi0gIEhBTF9ETUFfSEFMRl9UUkFOU0ZFUiA9IDB4MDFVICAvKiE8IEhhbGYgVHJhbnNmZXIgICAgICovDQotfSBIQUxfRE1BX0xldmVsQ29tcGxldGVUeXBlRGVmOw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSEFMIERNQSBDYWxsYmFjayBJRCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbg0KLSAqLw0KLXR5cGVkZWYgZW51bSB7DQotICBIQUxfRE1BX1hGRVJfQ1BMVF9DQl9JRCA9IDB4MDBVLCAgICAgLyohPCBGdWxsIHRyYW5zZmVyICAgICAqLw0KLSAgSEFMX0RNQV9YRkVSX0hBTEZDUExUX0NCX0lEID0gMHgwMVUsIC8qITwgSGFsZiB0cmFuc2ZlciAgICAgKi8NCi0gIEhBTF9ETUFfWEZFUl9FUlJPUl9DQl9JRCA9IDB4MDJVLCAgICAvKiE8IEVycm9yICAgICAgICAgICAgICovDQotICBIQUxfRE1BX1hGRVJfQUJPUlRfQ0JfSUQgPSAweDAzVSwgICAgLyohPCBBYm9ydCAgICAgICAgICAgICAqLw0KLSAgSEFMX0RNQV9YRkVSX0FMTF9DQl9JRCA9IDB4MDRVICAgICAgIC8qITwgQWxsICAgICAgICAgICAgICAgKi8NCi0NCi19IEhBTF9ETUFfQ2FsbGJhY2tJRFR5cGVEZWY7DQotDQotLyoqDQotICogQGJyaWVmICBETUEgaGFuZGxlIFN0cnVjdHVyZSBkZWZpbml0aW9uDQotICovDQotdHlwZWRlZiBzdHJ1Y3QgX19ETUFfSGFuZGxlVHlwZURlZiB7DQotICBETUFfQ2hhbm5lbF9UeXBlRGVmICpJbnN0YW5jZTsgLyohPCBSZWdpc3RlciBiYXNlIGFkZHJlc3MgICAgICAgICAgICAgICAgKi8NCi0NCi0gIERNQV9Jbml0VHlwZURlZiBJbml0OyAvKiE8IERNQSBjb21tdW5pY2F0aW9uIHBhcmFtZXRlcnMgICAgICAgICAqLw0KLQ0KLSAgSEFMX0xvY2tUeXBlRGVmIExvY2s7IC8qITwgRE1BIGxvY2tpbmcgb2JqZWN0ICAgICAgICAgICAgICAgICAgICovDQotDQotICBfX0lPIEhBTF9ETUFfU3RhdGVUeXBlRGVmIFN0YXRlOyAvKiE8IERNQSB0cmFuc2ZlciBzdGF0ZSAgICAgICAgICAgICAgICAgICAqLw0KLQ0KLSAgdm9pZCAqUGFyZW50OyAvKiE8IFBhcmVudCBvYmplY3Qgc3RhdGUgICAgICAgICAgICAgICAgICAqLw0KLQ0KLSAgdm9pZCAoKlhmZXJDcGx0Q2FsbGJhY2spKA0KLSAgICAgIHN0cnVjdCBfX0RNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsgLyohPCBETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8NCi0NCi0gIHZvaWQgKCpYZmVySGFsZkNwbHRDYWxsYmFjaykoDQotICAgICAgc3RydWN0IF9fRE1BX0hhbmRsZVR5cGVEZWYNCi0gICAgICAgICAgKmhkbWEpOyAvKiE8IERNQSBIYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICAqLw0KLQ0KLSAgdm9pZCAoKlhmZXJFcnJvckNhbGxiYWNrKSgNCi0gICAgICBzdHJ1Y3QgX19ETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7IC8qITwgRE1BIHRyYW5zZmVyIGVycm9yIGNhbGxiYWNrICovDQotDQotICB2b2lkICgqWGZlckFib3J0Q2FsbGJhY2spKA0KLSAgICAgIHN0cnVjdCBfX0RNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsgLyohPCBETUEgdHJhbnNmZXIgYWJvcnQgY2FsbGJhY2sgKi8NCi0NCi0gIF9fSU8gdWludDMyX3QgRXJyb3JDb2RlOyAvKiE8IERNQSBFcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAgICAqLw0KLQ0KLSAgRE1BX1R5cGVEZWYgKkRtYUJhc2VBZGRyZXNzOyAvKiE8IERNQSBDaGFubmVsIEJhc2UgQWRkcmVzcyAgICAgICAgICAgICAqLw0KLQ0KLSAgdWludDMyX3QgQ2hhbm5lbEluZGV4OyAvKiE8IERNQSBDaGFubmVsIEluZGV4ICAgICAgICAgICAgICAgICAgICAqLw0KLQ0KLSAgRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BbXV4Q2hhbm5lbDsgLyohPCBSZWdpc3RlciBiYXNlIGFkZHJlc3MgKi8NCi0NCi0gIERNQU1VWF9DaGFubmVsU3RhdHVzX1R5cGVEZWYNCi0gICAgICAqRE1BbXV4Q2hhbm5lbFN0YXR1czsgLyohPCBETUFNVVggQ2hhbm5lbHMgU3RhdHVzIEJhc2UgQWRkcmVzcyAgKi8NCi0NCi0gIHVpbnQzMl90IERNQW11eENoYW5uZWxTdGF0dXNNYXNrOyAvKiE8IERNQU1VWCBDaGFubmVsIFN0YXR1cyBNYXNrICAgICAgICAgICAqLw0KLQ0KLSAgRE1BTVVYX1JlcXVlc3RHZW5fVHlwZURlZg0KLSAgICAgICpETUFtdXhSZXF1ZXN0R2VuOyAvKiE8IERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvciBCYXNlIEFkZHJlc3MgKi8NCi0NCi0gIERNQU1VWF9SZXF1ZXN0R2VuU3RhdHVzX1R5cGVEZWYNCi0gICAgICAqRE1BbXV4UmVxdWVzdEdlblN0YXR1czsgLyohPCBETUFNVVggcmVxdWVzdCBnZW5lcmF0b3IgQWRkcmVzcyAgICAgKi8NCi0NCi0gIHVpbnQzMl90DQotICAgICAgRE1BbXV4UmVxdWVzdEdlblN0YXR1c01hc2s7IC8qITwgRE1BTVVYIHJlcXVlc3QgZ2VuZXJhdG9yIFN0YXR1cyBtYXNrICovDQotDQotfSBETUFfSGFuZGxlVHlwZURlZjsNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotDQotLyoqIEBkZWZncm91cCBETUFfRXhwb3J0ZWRfQ29uc3RhbnRzIERNQSBFeHBvcnRlZCBDb25zdGFudHMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRE1BX0Vycm9yX0NvZGUgRE1BIEVycm9yIENvZGUNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgSEFMX0RNQV9FUlJPUl9OT05FIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgTm8gZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgSEFMX0RNQV9FUlJPUl9URSBcDQotICAweDAwMDAwMDAxVSAvKiE8IFRyYW5zZmVyIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIEhBTF9ETUFfRVJST1JfTk9fWEZFUiBcDQotICAweDAwMDAwMDA0VSAvKiE8IEFib3J0IHJlcXVlc3RlZCB3aXRoIG5vIFhmZXIgb25nb2luZyAgKi8NCi0jZGVmaW5lIEhBTF9ETUFfRVJST1JfVElNRU9VVCBcDQotICAweDAwMDAwMDIwVSAvKiE8IFRpbWVvdXQgZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIEhBTF9ETUFfRVJST1JfTk9UX1NVUFBPUlRFRCBcDQotICAweDAwMDAwMTAwVSAvKiE8IE5vdCBzdXBwb3J0ZWQgbW9kZSAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIEhBTF9ETUFfRVJST1JfU1lOQyBcDQotICAweDAwMDAwMjAwVSAvKiE8IERNQU1VWCBzeW5jIG92ZXJydW4gIGVycm9yICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgSEFMX0RNQV9FUlJPUl9SRVFHRU4gXA0KLSAgMHgwMDAwMDQwMFUgLyohPCBETUFNVVggcmVxdWVzdCBnZW5lcmF0b3Igb3ZlcnJ1biAgZXJyb3IgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRE1BX3JlcXVlc3QgRE1BIHJlcXVlc3QNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfTUVNMk1FTSAwVSAvKiE8IG1lbW9yeSB0byBtZW1vcnkgdHJhbnNmZXIgICAqLw0KLQ0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfR0VORVJBVE9SMCAxVQ0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfR0VORVJBVE9SMSAyVQ0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfR0VORVJBVE9SMiAzVQ0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfR0VORVJBVE9SMyA0VQ0KLQ0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfQURDMSA1VQ0KLQ0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfREFDMV9DSEFOTkVMMSA2VQ0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfREFDMV9DSEFOTkVMMiA3VQ0KLQ0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfVElNNl9VUCA4VQ0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfVElNN19VUCA5VQ0KLQ0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfU1BJMV9SWCAxMFUNCi0jZGVmaW5lIERNQV9SRVFVRVNUX1NQSTFfVFggMTFVDQotI2RlZmluZSBETUFfUkVRVUVTVF9TUEkyX1JYIDEyVQ0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfU1BJMl9UWCAxM1UNCi0jZGVmaW5lIERNQV9SRVFVRVNUX1NQSTNfUlggMTRVDQotI2RlZmluZSBETUFfUkVRVUVTVF9TUEkzX1RYIDE1VQ0KLQ0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfSTJDMV9SWCAxNlUNCi0jZGVmaW5lIERNQV9SRVFVRVNUX0kyQzFfVFggMTdVDQotI2RlZmluZSBETUFfUkVRVUVTVF9JMkMyX1JYIDE4VQ0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfSTJDMl9UWCAxOVUNCi0jZGVmaW5lIERNQV9SRVFVRVNUX0kyQzNfUlggMjBVDQotI2RlZmluZSBETUFfUkVRVUVTVF9JMkMzX1RYIDIxVQ0KLSNpZiBkZWZpbmVkKEkyQzQpDQotI2RlZmluZSBETUFfUkVRVUVTVF9JMkM0X1JYIDIyVQ0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfSTJDNF9UWCAyM1UNCi0jZW5kaWYgLyogSTJDNCAqLw0KLQ0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfVVNBUlQxX1JYIDI0VQ0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfVVNBUlQxX1RYIDI1VQ0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfVVNBUlQyX1JYIDI2VQ0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfVVNBUlQyX1RYIDI3VQ0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfVVNBUlQzX1JYIDI4VQ0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfVVNBUlQzX1RYIDI5VQ0KLQ0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfVUFSVDRfUlggMzBVDQotI2RlZmluZSBETUFfUkVRVUVTVF9VQVJUNF9UWCAzMVUNCi0jaWYgZGVmaW5lZChVQVJUNSkNCi0jZGVmaW5lIERNQV9SRVFVRVNUX1VBUlQ1X1JYIDMyVQ0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfVUFSVDVfVFggMzNVDQotI2VuZGlmIC8qIFVBUlQ1ICovDQotDQotI2RlZmluZSBETUFfUkVRVUVTVF9MUFVBUlQxX1JYIDM0VQ0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfTFBVQVJUMV9UWCAzNVUNCi0NCi0jZGVmaW5lIERNQV9SRVFVRVNUX0FEQzIgMzZVDQotI2lmIGRlZmluZWQoQURDMykNCi0jZGVmaW5lIERNQV9SRVFVRVNUX0FEQzMgMzdVDQotI2VuZGlmIC8qIEFEQzMgKi8NCi0jaWYgZGVmaW5lZChBREM0KQ0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfQURDNCAzOFUNCi0jZW5kaWYgLyogQURDNCAqLw0KLSNpZiBkZWZpbmVkKEFEQzUpDQotI2RlZmluZSBETUFfUkVRVUVTVF9BREM1IDM5VQ0KLSNlbmRpZiAvKiBBREM1ICovDQotDQotI2lmIGRlZmluZWQoUVVBRFNQSSkNCi0jZGVmaW5lIERNQV9SRVFVRVNUX1FVQURTUEkgNDBVDQotI2VuZGlmIC8qIFFVQURTUEkgKi8NCi0NCi0jaWYgZGVmaW5lZChEQUMyKQ0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfREFDMl9DSEFOTkVMMSA0MVUNCi0jZW5kaWYgLyogREFDMiAqLw0KLQ0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfVElNMV9DSDEgNDJVDQotI2RlZmluZSBETUFfUkVRVUVTVF9USU0xX0NIMiA0M1UNCi0jZGVmaW5lIERNQV9SRVFVRVNUX1RJTTFfQ0gzIDQ0VQ0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfVElNMV9DSDQgNDVVDQotI2RlZmluZSBETUFfUkVRVUVTVF9USU0xX1VQIDQ2VQ0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfVElNMV9UUklHIDQ3VQ0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfVElNMV9DT00gNDhVDQotDQotI2RlZmluZSBETUFfUkVRVUVTVF9USU04X0NIMSA0OVUNCi0jZGVmaW5lIERNQV9SRVFVRVNUX1RJTThfQ0gyIDUwVQ0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfVElNOF9DSDMgNTFVDQotI2RlZmluZSBETUFfUkVRVUVTVF9USU04X0NINCA1MlUNCi0jZGVmaW5lIERNQV9SRVFVRVNUX1RJTThfVVAgNTNVDQotI2RlZmluZSBETUFfUkVRVUVTVF9USU04X1RSSUcgNTRVDQotI2RlZmluZSBETUFfUkVRVUVTVF9USU04X0NPTSA1NVUNCi0NCi0jZGVmaW5lIERNQV9SRVFVRVNUX1RJTTJfQ0gxIDU2VQ0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfVElNMl9DSDIgNTdVDQotI2RlZmluZSBETUFfUkVRVUVTVF9USU0yX0NIMyA1OFUNCi0jZGVmaW5lIERNQV9SRVFVRVNUX1RJTTJfQ0g0IDU5VQ0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfVElNMl9VUCA2MFUNCi0NCi0jZGVmaW5lIERNQV9SRVFVRVNUX1RJTTNfQ0gxIDYxVQ0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfVElNM19DSDIgNjJVDQotI2RlZmluZSBETUFfUkVRVUVTVF9USU0zX0NIMyA2M1UNCi0jZGVmaW5lIERNQV9SRVFVRVNUX1RJTTNfQ0g0IDY0VQ0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfVElNM19VUCA2NVUNCi0jZGVmaW5lIERNQV9SRVFVRVNUX1RJTTNfVFJJRyA2NlUNCi0NCi0jZGVmaW5lIERNQV9SRVFVRVNUX1RJTTRfQ0gxIDY3VQ0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfVElNNF9DSDIgNjhVDQotI2RlZmluZSBETUFfUkVRVUVTVF9USU00X0NIMyA2OVUNCi0jZGVmaW5lIERNQV9SRVFVRVNUX1RJTTRfQ0g0IDcwVQ0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfVElNNF9VUCA3MVUNCi0NCi0jaWYgZGVmaW5lZChUSU01KQ0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfVElNNV9DSDEgNzJVDQotI2RlZmluZSBETUFfUkVRVUVTVF9USU01X0NIMiA3M1UNCi0jZGVmaW5lIERNQV9SRVFVRVNUX1RJTTVfQ0gzIDc0VQ0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfVElNNV9DSDQgNzVVDQotI2RlZmluZSBETUFfUkVRVUVTVF9USU01X1VQIDc2VQ0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfVElNNV9UUklHIDc3VQ0KLSNlbmRpZiAvKiBUSU01ICovDQotDQotI2RlZmluZSBETUFfUkVRVUVTVF9USU0xNV9DSDEgNzhVDQotI2RlZmluZSBETUFfUkVRVUVTVF9USU0xNV9VUCA3OVUNCi0jZGVmaW5lIERNQV9SRVFVRVNUX1RJTTE1X1RSSUcgODBVDQotI2RlZmluZSBETUFfUkVRVUVTVF9USU0xNV9DT00gODFVDQotDQotI2RlZmluZSBETUFfUkVRVUVTVF9USU0xNl9DSDEgODJVDQotI2RlZmluZSBETUFfUkVRVUVTVF9USU0xNl9VUCA4M1UNCi0jZGVmaW5lIERNQV9SRVFVRVNUX1RJTTE3X0NIMSA4NFUNCi0jZGVmaW5lIERNQV9SRVFVRVNUX1RJTTE3X1VQIDg1VQ0KLQ0KLSNpZiBkZWZpbmVkKFRJTTIwKQ0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfVElNMjBfQ0gxIDg2VQ0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfVElNMjBfQ0gyIDg3VQ0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfVElNMjBfQ0gzIDg4VQ0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfVElNMjBfQ0g0IDg5VQ0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfVElNMjBfVVAgOTBVDQotI2VuZGlmIC8qIFRJTTIwICovDQotDQotI2RlZmluZSBETUFfUkVRVUVTVF9BRVNfSU4gOTFVDQotI2RlZmluZSBETUFfUkVRVUVTVF9BRVNfT1VUIDkyVQ0KLQ0KLSNpZiBkZWZpbmVkKFRJTTIwKQ0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfVElNMjBfVFJJRyA5M1UNCi0jZGVmaW5lIERNQV9SRVFVRVNUX1RJTTIwX0NPTSA5NFUNCi0jZW5kaWYgLyogVElNMjAgKi8NCi0NCi0jaWYgZGVmaW5lZChIUlRJTTEpDQotI2RlZmluZSBETUFfUkVRVUVTVF9IUlRJTTFfTSA5NVUNCi0jZGVmaW5lIERNQV9SRVFVRVNUX0hSVElNMV9BIDk2VQ0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfSFJUSU0xX0IgOTdVDQotI2RlZmluZSBETUFfUkVRVUVTVF9IUlRJTTFfQyA5OFUNCi0jZGVmaW5lIERNQV9SRVFVRVNUX0hSVElNMV9EIDk5VQ0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfSFJUSU0xX0UgMTAwVQ0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfSFJUSU0xX0YgMTAxVQ0KLSNlbmRpZiAvKiBIUlRJTTEgKi8NCi0NCi0jZGVmaW5lIERNQV9SRVFVRVNUX0RBQzNfQ0hBTk5FTDEgMTAyVQ0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfREFDM19DSEFOTkVMMiAxMDNVDQotI2lmIGRlZmluZWQoREFDNCkNCi0jZGVmaW5lIERNQV9SRVFVRVNUX0RBQzRfQ0hBTk5FTDEgMTA0VQ0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfREFDNF9DSEFOTkVMMiAxMDVVDQotI2VuZGlmIC8qIERBQzQgKi8NCi0NCi0jaWYgZGVmaW5lZChTUEk0KQ0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfU1BJNF9SWCAxMDZVDQotI2RlZmluZSBETUFfUkVRVUVTVF9TUEk0X1RYIDEwN1UNCi0jZW5kaWYgLyogU1BJNCAqLw0KLQ0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfU0FJMV9BIDEwOFUNCi0jZGVmaW5lIERNQV9SRVFVRVNUX1NBSTFfQiAxMDlVDQotDQotI2RlZmluZSBETUFfUkVRVUVTVF9GTUFDX1JFQUQgMTEwVQ0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfRk1BQ19XUklURSAxMTFVDQotDQotI2RlZmluZSBETUFfUkVRVUVTVF9DT1JESUNfUkVBRCAxMTJVDQotI2RlZmluZSBETUFfUkVRVUVTVF9DT1JESUNfV1JJVEUgMTEzVQ0KLQ0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfVUNQRDFfUlggMTE0VQ0KLSNkZWZpbmUgRE1BX1JFUVVFU1RfVUNQRDFfVFggMTE1VQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBETUFfRGF0YV90cmFuc2Zlcl9kaXJlY3Rpb24gRE1BIERhdGEgdHJhbnNmZXIgZGlyZWN0aW9uDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIERNQV9QRVJJUEhfVE9fTUVNT1JZICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgUGVyaXBoZXJhbCB0byBtZW1vcnkgZGlyZWN0aW9uIFwNCi0gICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgRE1BX01FTU9SWV9UT19QRVJJUEggICAgICAgICAgICAgICAgICAgICAgXA0KLSAgRE1BX0NDUl9ESVIgLyohPCBNZW1vcnkgdG8gcGVyaXBoZXJhbCBkaXJlY3Rpb24gXA0KLSAgICAgICAgICAgICAgICovDQotI2RlZmluZSBETUFfTUVNT1JZX1RPX01FTU9SWSBcDQotICBETUFfQ0NSX01FTTJNRU0gLyohPCBNZW1vcnkgdG8gbWVtb3J5IGRpcmVjdGlvbiAgICAgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRE1BX1BlcmlwaGVyYWxfaW5jcmVtZW50ZWRfbW9kZSBETUEgUGVyaXBoZXJhbCBpbmNyZW1lbnRlZCBtb2RlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIERNQV9QSU5DX0VOQUJMRSBETUFfQ0NSX1BJTkMgLyohPCBQZXJpcGhlcmFsIGluY3JlbWVudCBtb2RlIEVuYWJsZSAqLw0KLSNkZWZpbmUgRE1BX1BJTkNfRElTQUJMRSAweDAwMDAwMDAwVSAvKiE8IFBlcmlwaGVyYWwgaW5jcmVtZW50IG1vZGUgRGlzYWJsZSAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBETUFfTWVtb3J5X2luY3JlbWVudGVkX21vZGUgRE1BIE1lbW9yeSBpbmNyZW1lbnRlZCBtb2RlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIERNQV9NSU5DX0VOQUJMRSBETUFfQ0NSX01JTkMgLyohPCBNZW1vcnkgaW5jcmVtZW50IG1vZGUgRW5hYmxlICAqLw0KLSNkZWZpbmUgRE1BX01JTkNfRElTQUJMRSAweDAwMDAwMDAwVSAvKiE8IE1lbW9yeSBpbmNyZW1lbnQgbW9kZSBEaXNhYmxlICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIERNQV9QZXJpcGhlcmFsX2RhdGFfc2l6ZSBETUEgUGVyaXBoZXJhbCBkYXRhIHNpemUNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgRE1BX1BEQVRBQUxJR05fQllURSBcDQotICAweDAwMDAwMDAwVSAvKiE8IFBlcmlwaGVyYWwgZGF0YSBhbGlnbm1lbnQgOiBCeXRlICAgICAqLw0KLSNkZWZpbmUgRE1BX1BEQVRBQUxJR05fSEFMRldPUkQgXA0KLSAgRE1BX0NDUl9QU0laRV8wIC8qITwgUGVyaXBoZXJhbCBkYXRhIGFsaWdubWVudCA6IEhhbGZXb3JkICovDQotI2RlZmluZSBETUFfUERBVEFBTElHTl9XT1JEIFwNCi0gIERNQV9DQ1JfUFNJWkVfMSAvKiE8IFBlcmlwaGVyYWwgZGF0YSBhbGlnbm1lbnQgOiBXb3JkICAgICAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBETUFfTWVtb3J5X2RhdGFfc2l6ZSBETUEgTWVtb3J5IGRhdGEgc2l6ZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBETUFfTURBVEFBTElHTl9CWVRFIDB4MDAwMDAwMDBVIC8qITwgTWVtb3J5IGRhdGEgYWxpZ25tZW50IDogQnl0ZSAqLw0KLSNkZWZpbmUgRE1BX01EQVRBQUxJR05fSEFMRldPUkQgXA0KLSAgRE1BX0NDUl9NU0laRV8wIC8qITwgTWVtb3J5IGRhdGEgYWxpZ25tZW50IDogSGFsZldvcmQgKi8NCi0jZGVmaW5lIERNQV9NREFUQUFMSUdOX1dPUkQgXA0KLSAgRE1BX0NDUl9NU0laRV8xIC8qITwgTWVtb3J5IGRhdGEgYWxpZ25tZW50IDogV29yZCAgICAgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRE1BX21vZGUgRE1BIG1vZGUNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgRE1BX05PUk1BTCAweDAwMDAwMDAwVSAgICAvKiE8IE5vcm1hbCBtb2RlICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIERNQV9DSVJDVUxBUiBETUFfQ0NSX0NJUkMgLyohPCBDaXJjdWxhciBtb2RlICAgICAgICAgICAgICAgICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIERNQV9Qcmlvcml0eV9sZXZlbCBETUEgUHJpb3JpdHkgbGV2ZWwNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgRE1BX1BSSU9SSVRZX0xPVyAweDAwMDAwMDAwVSAgICAgIC8qITwgUHJpb3JpdHkgbGV2ZWwgOiBMb3cgICAgICAgKi8NCi0jZGVmaW5lIERNQV9QUklPUklUWV9NRURJVU0gRE1BX0NDUl9QTF8wICAvKiE8IFByaW9yaXR5IGxldmVsIDogTWVkaXVtICAgICovDQotI2RlZmluZSBETUFfUFJJT1JJVFlfSElHSCBETUFfQ0NSX1BMXzEgICAgLyohPCBQcmlvcml0eSBsZXZlbCA6IEhpZ2ggICAgICAqLw0KLSNkZWZpbmUgRE1BX1BSSU9SSVRZX1ZFUllfSElHSCBETUFfQ0NSX1BMIC8qITwgUHJpb3JpdHkgbGV2ZWwgOiBWZXJ5X0hpZ2ggKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRE1BX2ludGVycnVwdF9lbmFibGVfZGVmaW5pdGlvbnMgRE1BIGludGVycnVwdCBlbmFibGUgZGVmaW5pdGlvbnMNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgRE1BX0lUX1RDIERNQV9DQ1JfVENJRQ0KLSNkZWZpbmUgRE1BX0lUX0hUIERNQV9DQ1JfSFRJRQ0KLSNkZWZpbmUgRE1BX0lUX1RFIERNQV9DQ1JfVEVJRQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBETUFfZmxhZ19kZWZpbml0aW9ucyBETUEgZmxhZyBkZWZpbml0aW9ucw0KLSAqIEB7DQotICovDQotI2RlZmluZSBETUFfRkxBR19HTDEgMHgwMDAwMDAwMVUNCi0jZGVmaW5lIERNQV9GTEFHX1RDMSAweDAwMDAwMDAyVQ0KLSNkZWZpbmUgRE1BX0ZMQUdfSFQxIDB4MDAwMDAwMDRVDQotI2RlZmluZSBETUFfRkxBR19URTEgMHgwMDAwMDAwOFUNCi0jZGVmaW5lIERNQV9GTEFHX0dMMiAweDAwMDAwMDEwVQ0KLSNkZWZpbmUgRE1BX0ZMQUdfVEMyIDB4MDAwMDAwMjBVDQotI2RlZmluZSBETUFfRkxBR19IVDIgMHgwMDAwMDA0MFUNCi0jZGVmaW5lIERNQV9GTEFHX1RFMiAweDAwMDAwMDgwVQ0KLSNkZWZpbmUgRE1BX0ZMQUdfR0wzIDB4MDAwMDAxMDBVDQotI2RlZmluZSBETUFfRkxBR19UQzMgMHgwMDAwMDIwMFUNCi0jZGVmaW5lIERNQV9GTEFHX0hUMyAweDAwMDAwNDAwVQ0KLSNkZWZpbmUgRE1BX0ZMQUdfVEUzIDB4MDAwMDA4MDBVDQotI2RlZmluZSBETUFfRkxBR19HTDQgMHgwMDAwMTAwMFUNCi0jZGVmaW5lIERNQV9GTEFHX1RDNCAweDAwMDAyMDAwVQ0KLSNkZWZpbmUgRE1BX0ZMQUdfSFQ0IDB4MDAwMDQwMDBVDQotI2RlZmluZSBETUFfRkxBR19URTQgMHgwMDAwODAwMFUNCi0jZGVmaW5lIERNQV9GTEFHX0dMNSAweDAwMDEwMDAwVQ0KLSNkZWZpbmUgRE1BX0ZMQUdfVEM1IDB4MDAwMjAwMDBVDQotI2RlZmluZSBETUFfRkxBR19IVDUgMHgwMDA0MDAwMFUNCi0jZGVmaW5lIERNQV9GTEFHX1RFNSAweDAwMDgwMDAwVQ0KLSNkZWZpbmUgRE1BX0ZMQUdfR0w2IDB4MDAxMDAwMDBVDQotI2RlZmluZSBETUFfRkxBR19UQzYgMHgwMDIwMDAwMFUNCi0jZGVmaW5lIERNQV9GTEFHX0hUNiAweDAwNDAwMDAwVQ0KLSNkZWZpbmUgRE1BX0ZMQUdfVEU2IDB4MDA4MDAwMDBVDQotI2lmIGRlZmluZWQoRE1BMV9DaGFubmVsNykNCi0jZGVmaW5lIERNQV9GTEFHX0dMNyAweDAxMDAwMDAwVQ0KLSNkZWZpbmUgRE1BX0ZMQUdfVEM3IDB4MDIwMDAwMDBVDQotI2RlZmluZSBETUFfRkxBR19IVDcgMHgwNDAwMDAwMFUNCi0jZGVmaW5lIERNQV9GTEFHX1RFNyAweDA4MDAwMDAwVQ0KLSNlbmRpZiAvKiBETUExX0NoYW5uZWw3ICovDQotI2lmIGRlZmluZWQoRE1BMV9DaGFubmVsOCkNCi0jZGVmaW5lIERNQV9GTEFHX0dMOCAweDEwMDAwMDAwVQ0KLSNkZWZpbmUgRE1BX0ZMQUdfVEM4IDB4MjAwMDAwMDBVDQotI2RlZmluZSBETUFfRkxBR19IVDggMHg0MDAwMDAwMFUNCi0jZGVmaW5lIERNQV9GTEFHX1RFOCAweDgwMDAwMDAwVQ0KLSNlbmRpZiAvKiBETUExX0NoYW5uZWw4ICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBkZWZncm91cCBETUFfRXhwb3J0ZWRfTWFjcm9zIERNQSBFeHBvcnRlZCBNYWNyb3MNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKiBAYnJpZWYgIFJlc2V0IERNQSBoYW5kbGUgc3RhdGUuDQotICogQHBhcmFtICBfX0hBTkRMRV9fIERNQSBoYW5kbGUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX0RNQV9SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgXA0KLSAgKChfX0hBTkRMRV9fKS0+U3RhdGUgPSBIQUxfRE1BX1NUQVRFX1JFU0VUKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIHRoZSBzcGVjaWZpZWQgRE1BIENoYW5uZWwuDQotICogQHBhcmFtICBfX0hBTkRMRV9fIERNQSBoYW5kbGUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX0RNQV9FTkFCTEUoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDUiB8PSBETUFfQ0NSX0VOKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSB0aGUgc3BlY2lmaWVkIERNQSBDaGFubmVsLg0KLSAqIEBwYXJhbSAgX19IQU5ETEVfXyBETUEgaGFuZGxlDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9ETUFfRElTQUJMRShfX0hBTkRMRV9fKSBcDQotICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NSICY9IH5ETUFfQ0NSX0VOKQ0KLQ0KLS8qIEludGVycnVwdCAmIEZsYWcgbWFuYWdlbWVudCAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmV0dXJuIHRoZSBjdXJyZW50IERNQSBDaGFubmVsIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuDQotICogQHBhcmFtICBfX0hBTkRMRV9fIERNQSBoYW5kbGUNCi0gKiBAcmV0dmFsIFRoZSBzcGVjaWZpZWQgdHJhbnNmZXIgY29tcGxldGUgZmxhZyBpbmRleC4NCi0gKi8NCi0NCi0jaWYgZGVmaW5lZChETUExX0NoYW5uZWw4KQ0KLSNkZWZpbmUgX19IQUxfRE1BX0dFVF9UQ19GTEFHX0lOREVYKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKCgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMSkpICAgXA0KLSAgICAgICA/IERNQV9GTEFHX1RDMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWwxKSkgXA0KLSAgICAgICA/IERNQV9GTEFHX1RDMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwyKSkgXA0KLSAgICAgICA/IERNQV9GTEFHX1RDMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWwyKSkgXA0KLSAgICAgICA/IERNQV9GTEFHX1RDMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwzKSkgXA0KLSAgICAgICA/IERNQV9GTEFHX1RDMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWwzKSkgXA0KLSAgICAgICA/IERNQV9GTEFHX1RDMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw0KSkgXA0KLSAgICAgICA/IERNQV9GTEFHX1RDNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWw0KSkgXA0KLSAgICAgICA/IERNQV9GTEFHX1RDNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw1KSkgXA0KLSAgICAgICA/IERNQV9GTEFHX1RDNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWw1KSkgXA0KLSAgICAgICA/IERNQV9GTEFHX1RDNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw2KSkgXA0KLSAgICAgICA/IERNQV9GTEFHX1RDNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWw2KSkgXA0KLSAgICAgICA/IERNQV9GTEFHX1RDNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw3KSkgXA0KLSAgICAgICA/IERNQV9GTEFHX1RDNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWw3KSkgXA0KLSAgICAgICA/IERNQV9GTEFHX1RDNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICA6IERNQV9GTEFHX1RDOCkNCi0jZWxpZiBkZWZpbmVkKERNQTFfQ2hhbm5lbDYpDQotI2RlZmluZSBfX0hBTF9ETUFfR0VUX1RDX0ZMQUdfSU5ERVgoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwxKSkgICBcDQotICAgICAgID8gRE1BX0ZMQUdfVEMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDEpKSBcDQotICAgICAgID8gRE1BX0ZMQUdfVEMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDIpKSBcDQotICAgICAgID8gRE1BX0ZMQUdfVEMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDIpKSBcDQotICAgICAgID8gRE1BX0ZMQUdfVEMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDMpKSBcDQotICAgICAgID8gRE1BX0ZMQUdfVEMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDMpKSBcDQotICAgICAgID8gRE1BX0ZMQUdfVEMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDQpKSBcDQotICAgICAgID8gRE1BX0ZMQUdfVEM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDQpKSBcDQotICAgICAgID8gRE1BX0ZMQUdfVEM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDUpKSBcDQotICAgICAgID8gRE1BX0ZMQUdfVEM1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDUpKSBcDQotICAgICAgID8gRE1BX0ZMQUdfVEM1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgIDogRE1BX0ZMQUdfVEM2KQ0KLSNlbmRpZiAvKiBETUExX0NoYW5uZWw4ICovDQotDQotLyoqDQotICogQGJyaWVmICBSZXR1cm4gdGhlIGN1cnJlbnQgRE1BIENoYW5uZWwgaGFsZiB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnLg0KLSAqIEBwYXJhbSAgX19IQU5ETEVfXyBETUEgaGFuZGxlDQotICogQHJldHZhbCBUaGUgc3BlY2lmaWVkIGhhbGYgdHJhbnNmZXIgY29tcGxldGUgZmxhZyBpbmRleC4NCi0gKi8NCi0jaWYgZGVmaW5lZChETUExX0NoYW5uZWw4KQ0KLSNkZWZpbmUgX19IQUxfRE1BX0dFVF9IVF9GTEFHX0lOREVYKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKCgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMSkpICAgXA0KLSAgICAgICA/IERNQV9GTEFHX0hUMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWwxKSkgXA0KLSAgICAgICA/IERNQV9GTEFHX0hUMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwyKSkgXA0KLSAgICAgICA/IERNQV9GTEFHX0hUMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWwyKSkgXA0KLSAgICAgICA/IERNQV9GTEFHX0hUMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwzKSkgXA0KLSAgICAgICA/IERNQV9GTEFHX0hUMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWwzKSkgXA0KLSAgICAgICA/IERNQV9GTEFHX0hUMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw0KSkgXA0KLSAgICAgICA/IERNQV9GTEFHX0hUNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWw0KSkgXA0KLSAgICAgICA/IERNQV9GTEFHX0hUNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw1KSkgXA0KLSAgICAgICA/IERNQV9GTEFHX0hUNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWw1KSkgXA0KLSAgICAgICA/IERNQV9GTEFHX0hUNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw2KSkgXA0KLSAgICAgICA/IERNQV9GTEFHX0hUNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWw2KSkgXA0KLSAgICAgICA/IERNQV9GTEFHX0hUNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw3KSkgXA0KLSAgICAgICA/IERNQV9GTEFHX0hUNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWw3KSkgXA0KLSAgICAgICA/IERNQV9GTEFHX0hUNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICA6IERNQV9GTEFHX0hUOCkNCi0jZWxpZiBkZWZpbmVkKERNQTFfQ2hhbm5lbDYpDQotI2RlZmluZSBfX0hBTF9ETUFfR0VUX0hUX0ZMQUdfSU5ERVgoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwxKSkgICBcDQotICAgICAgID8gRE1BX0ZMQUdfSFQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDEpKSBcDQotICAgICAgID8gRE1BX0ZMQUdfSFQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDIpKSBcDQotICAgICAgID8gRE1BX0ZMQUdfSFQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDIpKSBcDQotICAgICAgID8gRE1BX0ZMQUdfSFQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDMpKSBcDQotICAgICAgID8gRE1BX0ZMQUdfSFQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDMpKSBcDQotICAgICAgID8gRE1BX0ZMQUdfSFQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDQpKSBcDQotICAgICAgID8gRE1BX0ZMQUdfSFQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDQpKSBcDQotICAgICAgID8gRE1BX0ZMQUdfSFQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDUpKSBcDQotICAgICAgID8gRE1BX0ZMQUdfSFQ1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDUpKSBcDQotICAgICAgID8gRE1BX0ZMQUdfSFQ1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgIDogRE1BX0ZMQUdfSFQ2KQ0KLSNlbmRpZiAvKiBETUExX0NoYW5uZWw4ICovDQotDQotLyoqDQotICogQGJyaWVmICBSZXR1cm4gdGhlIGN1cnJlbnQgRE1BIENoYW5uZWwgdHJhbnNmZXIgZXJyb3IgZmxhZy4NCi0gKiBAcGFyYW0gIF9fSEFORExFX18gRE1BIGhhbmRsZQ0KLSAqIEByZXR2YWwgVGhlIHNwZWNpZmllZCB0cmFuc2ZlciBlcnJvciBmbGFnIGluZGV4Lg0KLSAqLw0KLSNpZiBkZWZpbmVkKERNQTFfQ2hhbm5lbDgpDQotI2RlZmluZSBfX0hBTF9ETUFfR0VUX1RFX0ZMQUdfSU5ERVgoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwxKSkgICBcDQotICAgICAgID8gRE1BX0ZMQUdfVEUxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDEpKSBcDQotICAgICAgID8gRE1BX0ZMQUdfVEUxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDIpKSBcDQotICAgICAgID8gRE1BX0ZMQUdfVEUyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDIpKSBcDQotICAgICAgID8gRE1BX0ZMQUdfVEUyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDMpKSBcDQotICAgICAgID8gRE1BX0ZMQUdfVEUzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDMpKSBcDQotICAgICAgID8gRE1BX0ZMQUdfVEUzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDQpKSBcDQotICAgICAgID8gRE1BX0ZMQUdfVEU0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDQpKSBcDQotICAgICAgID8gRE1BX0ZMQUdfVEU0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDUpKSBcDQotICAgICAgID8gRE1BX0ZMQUdfVEU1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDUpKSBcDQotICAgICAgID8gRE1BX0ZMQUdfVEU1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDYpKSBcDQotICAgICAgID8gRE1BX0ZMQUdfVEU2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDYpKSBcDQotICAgICAgID8gRE1BX0ZMQUdfVEU2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDcpKSBcDQotICAgICAgID8gRE1BX0ZMQUdfVEU3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDcpKSBcDQotICAgICAgID8gRE1BX0ZMQUdfVEU3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgIDogRE1BX0ZMQUdfVEU4KQ0KLSNlbGlmIGRlZmluZWQoRE1BMV9DaGFubmVsNikNCi0jZGVmaW5lIF9fSEFMX0RNQV9HRVRfVEVfRkxBR19JTkRFWChfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDEpKSAgIFwNCi0gICAgICAgPyBETUFfRkxBR19URTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICA6ICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMl9DaGFubmVsMSkpIFwNCi0gICAgICAgPyBETUFfRkxBR19URTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICA6ICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMikpIFwNCi0gICAgICAgPyBETUFfRkxBR19URTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICA6ICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMl9DaGFubmVsMikpIFwNCi0gICAgICAgPyBETUFfRkxBR19URTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICA6ICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMykpIFwNCi0gICAgICAgPyBETUFfRkxBR19URTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICA6ICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMl9DaGFubmVsMykpIFwNCi0gICAgICAgPyBETUFfRkxBR19URTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICA6ICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsNCkpIFwNCi0gICAgICAgPyBETUFfRkxBR19URTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICA6ICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMl9DaGFubmVsNCkpIFwNCi0gICAgICAgPyBETUFfRkxBR19URTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICA6ICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsNSkpIFwNCi0gICAgICAgPyBETUFfRkxBR19URTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICA6ICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMl9DaGFubmVsNSkpIFwNCi0gICAgICAgPyBETUFfRkxBR19URTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgOiBETUFfRkxBR19URTYpDQotI2VuZGlmIC8qIERNQTFfQ2hhbm5lbDggKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJldHVybiB0aGUgY3VycmVudCBETUEgQ2hhbm5lbCBHbG9iYWwgaW50ZXJydXB0IGZsYWcuDQotICogQHBhcmFtICBfX0hBTkRMRV9fIERNQSBoYW5kbGUNCi0gKiBAcmV0dmFsIFRoZSBzcGVjaWZpZWQgdHJhbnNmZXIgZXJyb3IgZmxhZyBpbmRleC4NCi0gKi8NCi0jaWYgZGVmaW5lZChETUExX0NoYW5uZWw4KQ0KLSNkZWZpbmUgX19IQUxfRE1BX0dFVF9HSV9GTEFHX0lOREVYKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKCgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMSkpICAgXA0KLSAgICAgICA/IERNQV9JU1JfR0lGMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWwxKSkgXA0KLSAgICAgICA/IERNQV9JU1JfR0lGMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwyKSkgXA0KLSAgICAgICA/IERNQV9JU1JfR0lGMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWwyKSkgXA0KLSAgICAgICA/IERNQV9JU1JfR0lGMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwzKSkgXA0KLSAgICAgICA/IERNQV9JU1JfR0lGMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWwzKSkgXA0KLSAgICAgICA/IERNQV9JU1JfR0lGMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw0KSkgXA0KLSAgICAgICA/IERNQV9JU1JfR0lGNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWw0KSkgXA0KLSAgICAgICA/IERNQV9JU1JfR0lGNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw1KSkgXA0KLSAgICAgICA/IERNQV9JU1JfR0lGNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWw1KSkgXA0KLSAgICAgICA/IERNQV9JU1JfR0lGNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw2KSkgXA0KLSAgICAgICA/IERNQV9JU1JfR0lGNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWw2KSkgXA0KLSAgICAgICA/IERNQV9JU1JfR0lGNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw3KSkgXA0KLSAgICAgICA/IERNQV9JU1JfR0lGNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWw3KSkgXA0KLSAgICAgICA/IERNQV9JU1JfR0lGNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICA6IERNQV9JU1JfR0lGOCkNCi0jZWxpZiBkZWZpbmVkKERNQTFfQ2hhbm5lbDYpDQotI2RlZmluZSBfX0hBTF9ETUFfR0VUX0dJX0ZMQUdfSU5ERVgoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwxKSkgICBcDQotICAgICAgID8gRE1BX0lTUl9HSUYxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDEpKSBcDQotICAgICAgID8gRE1BX0lTUl9HSUYxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDIpKSBcDQotICAgICAgID8gRE1BX0lTUl9HSUYyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDIpKSBcDQotICAgICAgID8gRE1BX0lTUl9HSUYyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDMpKSBcDQotICAgICAgID8gRE1BX0lTUl9HSUYzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDMpKSBcDQotICAgICAgID8gRE1BX0lTUl9HSUYzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDQpKSBcDQotICAgICAgID8gRE1BX0lTUl9HSUY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDQpKSBcDQotICAgICAgID8gRE1BX0lTUl9HSUY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDUpKSBcDQotICAgICAgID8gRE1BX0lTUl9HSUY1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDUpKSBcDQotICAgICAgID8gRE1BX0lTUl9HSUY1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgIDogRE1BX0lTUl9HSUY2KQ0KLSNlbmRpZiAvKiBETUExX0NoYW5uZWw4ICovDQotDQotLyoqDQotICogQGJyaWVmICBHZXQgdGhlIERNQSBDaGFubmVsIHBlbmRpbmcgZmxhZ3MuDQotICogQHBhcmFtICBfX0hBTkRMRV9fIERNQSBoYW5kbGUNCi0gKiBAcGFyYW0gIF9fRkxBR19fIEdldCB0aGUgc3BlY2lmaWVkIGZsYWcuDQotICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgRE1BX0ZMQUdfVEN4ICBUcmFuc2ZlciBjb21wbGV0ZSBmbGFnDQotICogICAgICAgICAgICBAYXJnIERNQV9GTEFHX0hUeCAgSGFsZiB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnDQotICogICAgICAgICAgICBAYXJnIERNQV9GTEFHX1RFeCAgVHJhbnNmZXIgZXJyb3IgZmxhZw0KLSAqICAgICAgICAgICAgQGFyZyBETUFfRkxBR19HTHggIEdsb2JhbCBpbnRlcnJ1cHQgZmxhZw0KLSAqICAgICAgICAgV2hlcmUgeCBjYW4gYmUgZnJvbSAxIHRvIDggdG8gc2VsZWN0IHRoZSBETUEgQ2hhbm5lbCB4IGZsYWcuDQotICogQHJldHZhbCBUaGUgc3RhdGUgb2YgRkxBRyAoU0VUIG9yIFJFU0VUKS4NCi0gKi8NCi0jaWYgZGVmaW5lZChETUExX0NoYW5uZWw4KQ0KLSNkZWZpbmUgX19IQUxfRE1BX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAgICAgICAgICAgICAgICAgICAgXA0KLSAgKCgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID4gKCh1aW50MzJfdClETUExX0NoYW5uZWw4KSkgXA0KLSAgICAgICA/IChETUEyLT5JU1IgJiAoX19GTEFHX18pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICA6IChETUExLT5JU1IgJiAoX19GTEFHX18pKSkNCi0jZWxpZiBkZWZpbmVkKERNQTFfQ2hhbm5lbDYpDQotI2RlZmluZSBfX0hBTF9ETUFfR0VUX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICAgICAgICAgICAgICAgICAgICBcDQotICAoKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPiAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDYpKSBcDQotICAgICAgID8gKERNQTItPklTUiAmIChfX0ZMQUdfXykpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgIDogKERNQTEtPklTUiAmIChfX0ZMQUdfXykpKQ0KLSNlbmRpZiAvKiBETUExX0NoYW5uZWw4ICovDQotDQotLyoqDQotICogQGJyaWVmICBDbGVhciB0aGUgRE1BIENoYW5uZWwgcGVuZGluZyBmbGFncy4NCi0gKiBAcGFyYW0gIF9fSEFORExFX18gRE1BIGhhbmRsZQ0KLSAqIEBwYXJhbSAgX19GTEFHX18gc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNsZWFyLg0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIERNQV9GTEFHX1RDeCAgVHJhbnNmZXIgY29tcGxldGUgZmxhZw0KLSAqICAgICAgICAgICAgQGFyZyBETUFfRkxBR19IVHggIEhhbGYgdHJhbnNmZXIgY29tcGxldGUgZmxhZw0KLSAqICAgICAgICAgICAgQGFyZyBETUFfRkxBR19URXggIFRyYW5zZmVyIGVycm9yIGZsYWcNCi0gKiAgICAgICAgICAgIEBhcmcgRE1BX0ZMQUdfR0x4ICBHbG9iYWwgaW50ZXJydXB0IGZsYWcNCi0gKiAgICAgICAgIFdoZXJlIHggY2FuIGJlIGZyb20gMSB0byA4IHRvIHNlbGVjdCB0aGUgRE1BIENoYW5uZWwgeCBmbGFnLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNpZiBkZWZpbmVkKERNQTFfQ2hhbm5lbDgpDQotI2RlZmluZSBfX0hBTF9ETUFfQ0xFQVJfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgICAgICAgICAgICAgICAgICBcDQotICAoKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPiAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDgpKSBcDQotICAgICAgID8gKERNQTItPklGQ1IgPSAoX19GTEFHX18pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgIDogKERNQTEtPklGQ1IgPSAoX19GTEFHX18pKSkNCi0jZWxzZQ0KLSNkZWZpbmUgX19IQUxfRE1BX0NMRUFSX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICAgICAgICAgICAgICAgICAgXA0KLSAgKCgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID4gKCh1aW50MzJfdClETUExX0NoYW5uZWw2KSkgXA0KLSAgICAgICA/IChETUEyLT5JRkNSID0gKF9fRkxBR19fKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICA6IChETUExLT5JRkNSID0gKF9fRkxBR19fKSkpDQotI2VuZGlmIC8qIERNQTFfQ2hhbm5lbDggKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSB0aGUgc3BlY2lmaWVkIERNQSBDaGFubmVsIGludGVycnVwdHMuDQotICogQHBhcmFtICBfX0hBTkRMRV9fIERNQSBoYW5kbGUNCi0gKiBAcGFyYW0gX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIERNQSBpbnRlcnJ1cHQgc291cmNlcyB0byBiZSBlbmFibGVkIG9yDQotICogZGlzYWJsZWQuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIERNQV9JVF9UQyAgVHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0IG1hc2sNCi0gKiAgICAgICAgICAgIEBhcmcgRE1BX0lUX0hUICBIYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdCBtYXNrDQotICogICAgICAgICAgICBAYXJnIERNQV9JVF9URSAgVHJhbnNmZXIgZXJyb3IgaW50ZXJydXB0IG1hc2sNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX0RNQV9FTkFCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgXA0KLSAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDUiB8PSAoX19JTlRFUlJVUFRfXykpDQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIHRoZSBzcGVjaWZpZWQgRE1BIENoYW5uZWwgaW50ZXJydXB0cy4NCi0gKiBAcGFyYW0gIF9fSEFORExFX18gRE1BIGhhbmRsZQ0KLSAqIEBwYXJhbSBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgRE1BIGludGVycnVwdCBzb3VyY2VzIHRvIGJlIGVuYWJsZWQgb3INCi0gKiBkaXNhYmxlZC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgRE1BX0lUX1RDICBUcmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQgbWFzaw0KLSAqICAgICAgICAgICAgQGFyZyBETUFfSVRfSFQgIEhhbGYgdHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0IG1hc2sNCi0gKiAgICAgICAgICAgIEBhcmcgRE1BX0lUX1RFICBUcmFuc2ZlciBlcnJvciBpbnRlcnJ1cHQgbWFzaw0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfRE1BX0RJU0FCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgXA0KLSAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDUiAmPSB+KF9fSU5URVJSVVBUX18pKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIERNQSBDaGFubmVsIGludGVycnVwdCBpcyBlbmFibGVkIG9yIG5vdC4NCi0gKiBAcGFyYW0gIF9fSEFORExFX18gRE1BIGhhbmRsZQ0KLSAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIERNQSBpbnRlcnJ1cHQgc291cmNlIHRvIGNoZWNrLg0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIERNQV9JVF9UQyAgVHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0IG1hc2sNCi0gKiAgICAgICAgICAgIEBhcmcgRE1BX0lUX0hUICBIYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdCBtYXNrDQotICogICAgICAgICAgICBAYXJnIERNQV9JVF9URSAgVHJhbnNmZXIgZXJyb3IgaW50ZXJydXB0IG1hc2sNCi0gKiBAcmV0dmFsIFRoZSBzdGF0ZSBvZiBETUFfSVQgKFNFVCBvciBSRVNFVCkuDQotICovDQotI2RlZmluZSBfX0hBTF9ETUFfR0VUX0lUX1NPVVJDRShfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSBcDQotICAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDUiAmIChfX0lOVEVSUlVQVF9fKSkpDQotDQotLyoqDQotICogQGJyaWVmICBSZXR1cm4gdGhlIG51bWJlciBvZiByZW1haW5pbmcgZGF0YSB1bml0cyBpbiB0aGUgY3VycmVudCBETUEgQ2hhbm5lbA0KLSAqIHRyYW5zZmVyLg0KLSAqIEBwYXJhbSAgX19IQU5ETEVfXyBETUEgaGFuZGxlDQotICogQHJldHZhbCBUaGUgbnVtYmVyIG9mIHJlbWFpbmluZyBkYXRhIHVuaXRzIGluIHRoZSBjdXJyZW50IERNQSBDaGFubmVsDQotICogdHJhbnNmZXIuDQotICovDQotI2RlZmluZSBfX0hBTF9ETUFfR0VUX0NPVU5URVIoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNORFRSKQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogSW5jbHVkZSBETUEgSEFMIEV4dGVuc2lvbiBtb2R1bGUgKi8NCi0jaW5jbHVkZSAic3RtMzJnNHh4X2hhbF9kbWFfZXguaCINCi0NCi0vKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLQ0KLS8qKiBAYWRkdG9ncm91cCBETUFfRXhwb3J0ZWRfRnVuY3Rpb25zDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGFkZHRvZ3JvdXAgRE1BX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDENCi0gKiBAew0KLSAqLw0KLS8qIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RNQV9Jbml0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BX0RlSW5pdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7DQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGFkZHRvZ3JvdXAgRE1BX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDINCi0gKiBAew0KLSAqLw0KLS8qIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RNQV9TdGFydChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSwgdWludDMyX3QgU3JjQWRkcmVzcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IERzdEFkZHJlc3MsIHVpbnQzMl90IERhdGFMZW5ndGgpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9ETUFfU3RhcnRfSVQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEsIHVpbnQzMl90IFNyY0FkZHJlc3MsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBEc3RBZGRyZXNzLCB1aW50MzJfdCBEYXRhTGVuZ3RoKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BX0Fib3J0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BX0Fib3J0X0lUKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BX1BvbGxGb3JUcmFuc2ZlcigNCi0gICAgRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEsIEhBTF9ETUFfTGV2ZWxDb21wbGV0ZVR5cGVEZWYgQ29tcGxldGVMZXZlbCwNCi0gICAgdWludDMyX3QgVGltZW91dCk7DQotdm9pZCBIQUxfRE1BX0lSUUhhbmRsZXIoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9ETUFfUmVnaXN0ZXJDYWxsYmFjaygNCi0gICAgRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEsIEhBTF9ETUFfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwNCi0gICAgdm9pZCAoKnBDYWxsYmFjaykoRE1BX0hhbmRsZVR5cGVEZWYgKl9oZG1hKSk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RNQV9VblJlZ2lzdGVyQ2FsbGJhY2soDQotICAgIERNQV9IYW5kbGVUeXBlRGVmICpoZG1hLCBIQUxfRE1BX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpOw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBhZGR0b2dyb3VwIERNQV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzDQotICogQHsNCi0gKi8NCi0vKiBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvciBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLUhBTF9ETUFfU3RhdGVUeXBlRGVmIEhBTF9ETUFfR2V0U3RhdGUoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOw0KLXVpbnQzMl90IEhBTF9ETUFfR2V0RXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgRE1BX1ByaXZhdGVfTWFjcm9zIERNQSBQcml2YXRlIE1hY3Jvcw0KLSAqIEB7DQotICovDQotDQotI2RlZmluZSBJU19ETUFfRElSRUNUSU9OKERJUkVDVElPTikgICAgICAgICBcDQotICAoKChESVJFQ1RJT04pID09IERNQV9QRVJJUEhfVE9fTUVNT1JZKSB8fCBcDQotICAgKChESVJFQ1RJT04pID09IERNQV9NRU1PUllfVE9fUEVSSVBIKSB8fCBcDQotICAgKChESVJFQ1RJT04pID09IERNQV9NRU1PUllfVE9fTUVNT1JZKSkNCi0NCi0jZGVmaW5lIElTX0RNQV9CVUZGRVJfU0laRShTSVpFKSAoKChTSVpFKSA+PSAweDFVKSAmJiAoKFNJWkUpIDwgMHg0MDAwMFUpKQ0KLQ0KLSNkZWZpbmUgSVNfRE1BX1BFUklQSEVSQUxfSU5DX1NUQVRFKFNUQVRFKSBcDQotICAoKChTVEFURSkgPT0gRE1BX1BJTkNfRU5BQkxFKSB8fCAoKFNUQVRFKSA9PSBETUFfUElOQ19ESVNBQkxFKSkNCi0NCi0jZGVmaW5lIElTX0RNQV9NRU1PUllfSU5DX1NUQVRFKFNUQVRFKSBcDQotICAoKChTVEFURSkgPT0gRE1BX01JTkNfRU5BQkxFKSB8fCAoKFNUQVRFKSA9PSBETUFfTUlOQ19ESVNBQkxFKSkNCi0NCi0jZGVmaW5lIElTX0RNQV9BTExfUkVRVUVTVChSRVFVRVNUKSAoKFJFUVVFU1QpIDw9IERNQV9SRVFVRVNUX1VDUEQxX1RYKQ0KLQ0KLSNkZWZpbmUgSVNfRE1BX1BFUklQSEVSQUxfREFUQV9TSVpFKFNJWkUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKCgoU0laRSkgPT0gRE1BX1BEQVRBQUxJR05fQllURSkgfHwgKChTSVpFKSA9PSBETUFfUERBVEFBTElHTl9IQUxGV09SRCkgfHwgXA0KLSAgICgoU0laRSkgPT0gRE1BX1BEQVRBQUxJR05fV09SRCkpDQotDQotI2RlZmluZSBJU19ETUFfTUVNT1JZX0RBVEFfU0laRShTSVpFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKChTSVpFKSA9PSBETUFfTURBVEFBTElHTl9CWVRFKSB8fCAoKFNJWkUpID09IERNQV9NREFUQUFMSUdOX0hBTEZXT1JEKSB8fCBcDQotICAgKChTSVpFKSA9PSBETUFfTURBVEFBTElHTl9XT1JEKSkNCi0NCi0jZGVmaW5lIElTX0RNQV9NT0RFKE1PREUpICgoKE1PREUpID09IERNQV9OT1JNQUwpIHx8ICgoTU9ERSkgPT0gRE1BX0NJUkNVTEFSKSkNCi0NCi0jZGVmaW5lIElTX0RNQV9QUklPUklUWShQUklPUklUWSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKChQUklPUklUWSkgPT0gRE1BX1BSSU9SSVRZX0xPVykgfHwgKChQUklPUklUWSkgPT0gRE1BX1BSSU9SSVRZX01FRElVTSkgfHwgXA0KLSAgICgoUFJJT1JJVFkpID09IERNQV9QUklPUklUWV9ISUdIKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKFBSSU9SSVRZKSA9PSBETUFfUFJJT1JJVFlfVkVSWV9ISUdIKSkNCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIFByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLSNpZmRlZiBfX2NwbHVzcGx1cw0KLX0NCi0jZW5kaWYNCi0NCi0jZW5kaWYgLyogX19TVE0zMkc0eHhfSEFMX0RNQV9IICovDQorLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAZmlsZSAgICBzdG0zMmc0eHhfaGFsX2RtYS5oCisgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgRE1BIEhBTCBtb2R1bGUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYXR0ZW50aW9uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0ZXJtcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlCisgKiBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb2Z0d2FyZSBjb21wb25lbnQuCisgKiBJZiBubyBMSUNFTlNFIGZpbGUgY29tZXMgd2l0aCB0aGlzIHNvZnR3YXJlLCBpdCBpcyBwcm92aWRlZCBBUy1JUy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgX19TVE0zMkc0eHhfSEFMX0RNQV9ICisjZGVmaW5lIF9fU1RNMzJHNHh4X0hBTF9ETUFfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnNHh4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzR4eF9IQUxfRHJpdmVyCisgKiBAeworICovCisKKy8qKiBAYWRkdG9ncm91cCBETUEKKyAqIEB7CisgKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRE1BX0V4cG9ydGVkX1R5cGVzIERNQSBFeHBvcnRlZCBUeXBlcworICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiAgRE1BIENvbmZpZ3VyYXRpb24gU3RydWN0dXJlIGRlZmluaXRpb24KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50MzJfdAorICAgICAgUmVxdWVzdDsgLyohPCBTcGVjaWZpZXMgdGhlIHJlcXVlc3Qgc2VsZWN0ZWQgZm9yIHRoZSBzcGVjaWZpZWQgY2hhbm5lbC4KKyAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBETUFfcmVxdWVzdCAqLworCisgIHVpbnQzMl90IERpcmVjdGlvbjsgLyohPCBTcGVjaWZpZXMgaWYgdGhlIGRhdGEgd2lsbCBiZSB0cmFuc2ZlcnJlZCBmcm9tIG1lbW9yeQorICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHBlcmlwaGVyYWwsIGZyb20gbWVtb3J5IHRvIG1lbW9yeSBvciBmcm9tIHBlcmlwaGVyYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0byBtZW1vcnkuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICBETUFfRGF0YV90cmFuc2Zlcl9kaXJlY3Rpb24gKi8KKworICB1aW50MzJfdCBQZXJpcGhJbmM7IC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIFBlcmlwaGVyYWwgYWRkcmVzcyByZWdpc3RlcgorICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBpbmNyZW1lbnRlZCBvciBub3QuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhCisgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgb2YgQHJlZiBETUFfUGVyaXBoZXJhbF9pbmNyZW1lbnRlZF9tb2RlICovCisKKyAgdWludDMyX3QgTWVtSW5jOyAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBtZW1vcnkgYWRkcmVzcyByZWdpc3RlciBzaG91bGQgYmUKKyAgICAgICAgICAgICAgICAgICAgICBpbmNyZW1lbnRlZCBvciBub3QuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICBETUFfTWVtb3J5X2luY3JlbWVudGVkX21vZGUgKi8KKworICB1aW50MzJfdCBQZXJpcGhEYXRhQWxpZ25tZW50OyAvKiE8IFNwZWNpZmllcyB0aGUgUGVyaXBoZXJhbCBkYXRhIHdpZHRoLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE1BX1BlcmlwaGVyYWxfZGF0YV9zaXplICovCisKKyAgdWludDMyX3QgTWVtRGF0YUFsaWdubWVudDsgLyohPCBTcGVjaWZpZXMgdGhlIE1lbW9yeSBkYXRhIHdpZHRoLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE1BX01lbW9yeV9kYXRhX3NpemUgKi8KKworICB1aW50MzJfdCBNb2RlOyAvKiE8IFNwZWNpZmllcyB0aGUgb3BlcmF0aW9uIG1vZGUgb2YgdGhlIERNQXkgQ2hhbm5lbHguCisgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBETUFfbW9kZQorICAgICAgICAgICAgICAgICAgICAgIEBub3RlIFRoZSBjaXJjdWxhciBidWZmZXIgbW9kZSBjYW5ub3QgYmUgdXNlZCBpZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgbWVtb3J5LXRvLW1lbW9yeSBkYXRhIHRyYW5zZmVyIGlzIGNvbmZpZ3VyZWQgb24gdGhlIHNlbGVjdGVkCisgICAgICAgICAgICAgICAgICAgIENoYW5uZWwgKi8KKworICB1aW50MzJfdAorICAgICAgUHJpb3JpdHk7IC8qITwgU3BlY2lmaWVzIHRoZSBzb2Z0d2FyZSBwcmlvcml0eSBmb3IgdGhlIERNQXkgQ2hhbm5lbHguCisgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIERNQV9Qcmlvcml0eV9sZXZlbCAqLworfSBETUFfSW5pdFR5cGVEZWY7CisKKy8qKgorICogQGJyaWVmICBIQUwgRE1BIFN0YXRlIHN0cnVjdHVyZXMgZGVmaW5pdGlvbgorICovCit0eXBlZGVmIGVudW0geworICBIQUxfRE1BX1NUQVRFX1JFU0VUID0gMHgwMFUsICAgLyohPCBETUEgbm90IHlldCBpbml0aWFsaXplZCBvciBkaXNhYmxlZCAgICAqLworICBIQUxfRE1BX1NUQVRFX1JFQURZID0gMHgwMVUsICAgLyohPCBETUEgaW5pdGlhbGl6ZWQgYW5kIHJlYWR5IGZvciB1c2UgICAgICAqLworICBIQUxfRE1BX1NUQVRFX0JVU1kgPSAweDAyVSwgICAgLyohPCBETUEgcHJvY2VzcyBpcyBvbmdvaW5nICAgICAgICAgICAgICAgICAqLworICBIQUxfRE1BX1NUQVRFX1RJTUVPVVQgPSAweDAzVSwgLyohPCBETUEgdGltZW91dCBzdGF0ZSAgICAgICAgICAgICAgICAgICAgICovCit9IEhBTF9ETUFfU3RhdGVUeXBlRGVmOworCisvKioKKyAqIEBicmllZiAgSEFMIERNQSBFcnJvciBDb2RlIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgKi8KK3R5cGVkZWYgZW51bSB7CisgIEhBTF9ETUFfRlVMTF9UUkFOU0ZFUiA9IDB4MDBVLCAvKiE8IEZ1bGwgdHJhbnNmZXIgICAgICovCisgIEhBTF9ETUFfSEFMRl9UUkFOU0ZFUiA9IDB4MDFVICAvKiE8IEhhbGYgVHJhbnNmZXIgICAgICovCit9IEhBTF9ETUFfTGV2ZWxDb21wbGV0ZVR5cGVEZWY7CisKKy8qKgorICogQGJyaWVmICBIQUwgRE1BIENhbGxiYWNrIElEIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgKi8KK3R5cGVkZWYgZW51bSB7CisgIEhBTF9ETUFfWEZFUl9DUExUX0NCX0lEID0gMHgwMFUsICAgICAvKiE8IEZ1bGwgdHJhbnNmZXIgICAgICovCisgIEhBTF9ETUFfWEZFUl9IQUxGQ1BMVF9DQl9JRCA9IDB4MDFVLCAvKiE8IEhhbGYgdHJhbnNmZXIgICAgICovCisgIEhBTF9ETUFfWEZFUl9FUlJPUl9DQl9JRCA9IDB4MDJVLCAgICAvKiE8IEVycm9yICAgICAgICAgICAgICovCisgIEhBTF9ETUFfWEZFUl9BQk9SVF9DQl9JRCA9IDB4MDNVLCAgICAvKiE8IEFib3J0ICAgICAgICAgICAgICovCisgIEhBTF9ETUFfWEZFUl9BTExfQ0JfSUQgPSAweDA0VSAgICAgICAvKiE8IEFsbCAgICAgICAgICAgICAgICovCisKK30gSEFMX0RNQV9DYWxsYmFja0lEVHlwZURlZjsKKworLyoqCisgKiBAYnJpZWYgIERNQSBoYW5kbGUgU3RydWN0dXJlIGRlZmluaXRpb24KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX19ETUFfSGFuZGxlVHlwZURlZiB7CisgIERNQV9DaGFubmVsX1R5cGVEZWYgKkluc3RhbmNlOyAvKiE8IFJlZ2lzdGVyIGJhc2UgYWRkcmVzcyAgICAgICAgICAgICAgICAqLworCisgIERNQV9Jbml0VHlwZURlZiBJbml0OyAvKiE8IERNQSBjb21tdW5pY2F0aW9uIHBhcmFtZXRlcnMgICAgICAgICAqLworCisgIEhBTF9Mb2NrVHlwZURlZiBMb2NrOyAvKiE8IERNQSBsb2NraW5nIG9iamVjdCAgICAgICAgICAgICAgICAgICAqLworCisgIF9fSU8gSEFMX0RNQV9TdGF0ZVR5cGVEZWYgU3RhdGU7IC8qITwgRE1BIHRyYW5zZmVyIHN0YXRlICAgICAgICAgICAgICAgICAgICovCisKKyAgdm9pZCAqUGFyZW50OyAvKiE8IFBhcmVudCBvYmplY3Qgc3RhdGUgICAgICAgICAgICAgICAgICAqLworCisgIHZvaWQgKCpYZmVyQ3BsdENhbGxiYWNrKSgKKyAgICAgIHN0cnVjdCBfX0RNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsgLyohPCBETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKworICB2b2lkICgqWGZlckhhbGZDcGx0Q2FsbGJhY2spKAorICAgICAgc3RydWN0IF9fRE1BX0hhbmRsZVR5cGVEZWYKKyAgICAgICAgICAqaGRtYSk7IC8qITwgRE1BIEhhbGYgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgICovCisKKyAgdm9pZCAoKlhmZXJFcnJvckNhbGxiYWNrKSgKKyAgICAgIHN0cnVjdCBfX0RNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsgLyohPCBETUEgdHJhbnNmZXIgZXJyb3IgY2FsbGJhY2sgKi8KKworICB2b2lkICgqWGZlckFib3J0Q2FsbGJhY2spKAorICAgICAgc3RydWN0IF9fRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOyAvKiE8IERNQSB0cmFuc2ZlciBhYm9ydCBjYWxsYmFjayAqLworCisgIF9fSU8gdWludDMyX3QgRXJyb3JDb2RlOyAvKiE8IERNQSBFcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIERNQV9UeXBlRGVmICpEbWFCYXNlQWRkcmVzczsgLyohPCBETUEgQ2hhbm5lbCBCYXNlIEFkZHJlc3MgICAgICAgICAgICAgKi8KKworICB1aW50MzJfdCBDaGFubmVsSW5kZXg7IC8qITwgRE1BIENoYW5uZWwgSW5kZXggICAgICAgICAgICAgICAgICAgICovCisKKyAgRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BbXV4Q2hhbm5lbDsgLyohPCBSZWdpc3RlciBiYXNlIGFkZHJlc3MgKi8KKworICBETUFNVVhfQ2hhbm5lbFN0YXR1c19UeXBlRGVmCisgICAgICAqRE1BbXV4Q2hhbm5lbFN0YXR1czsgLyohPCBETUFNVVggQ2hhbm5lbHMgU3RhdHVzIEJhc2UgQWRkcmVzcyAgKi8KKworICB1aW50MzJfdCBETUFtdXhDaGFubmVsU3RhdHVzTWFzazsgLyohPCBETUFNVVggQ2hhbm5lbCBTdGF0dXMgTWFzayAgICAgICAgICAgKi8KKworICBETUFNVVhfUmVxdWVzdEdlbl9UeXBlRGVmCisgICAgICAqRE1BbXV4UmVxdWVzdEdlbjsgLyohPCBETUFNVVggcmVxdWVzdCBnZW5lcmF0b3IgQmFzZSBBZGRyZXNzICovCisKKyAgRE1BTVVYX1JlcXVlc3RHZW5TdGF0dXNfVHlwZURlZgorICAgICAgKkRNQW11eFJlcXVlc3RHZW5TdGF0dXM7IC8qITwgRE1BTVVYIHJlcXVlc3QgZ2VuZXJhdG9yIEFkZHJlc3MgICAgICovCisKKyAgdWludDMyX3QKKyAgICAgIERNQW11eFJlcXVlc3RHZW5TdGF0dXNNYXNrOyAvKiE8IERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvciBTdGF0dXMgbWFzayAqLworCit9IERNQV9IYW5kbGVUeXBlRGVmOworLyoqCisgKiBAfQorICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgRE1BX0V4cG9ydGVkX0NvbnN0YW50cyBETUEgRXhwb3J0ZWQgQ29uc3RhbnRzCisgKiBAeworICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BX0Vycm9yX0NvZGUgRE1BIEVycm9yIENvZGUKKyAqIEB7CisgKi8KKyNkZWZpbmUgSEFMX0RNQV9FUlJPUl9OT05FIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBObyBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9ETUFfRVJST1JfVEUgXAorICAweDAwMDAwMDAxVSAvKiE8IFRyYW5zZmVyIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX0RNQV9FUlJPUl9OT19YRkVSIFwKKyAgMHgwMDAwMDAwNFUgLyohPCBBYm9ydCByZXF1ZXN0ZWQgd2l0aCBubyBYZmVyIG9uZ29pbmcgICovCisjZGVmaW5lIEhBTF9ETUFfRVJST1JfVElNRU9VVCBcCisgIDB4MDAwMDAwMjBVIC8qITwgVGltZW91dCBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfRE1BX0VSUk9SX05PVF9TVVBQT1JURUQgXAorICAweDAwMDAwMTAwVSAvKiE8IE5vdCBzdXBwb3J0ZWQgbW9kZSAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX0RNQV9FUlJPUl9TWU5DIFwKKyAgMHgwMDAwMDIwMFUgLyohPCBETUFNVVggc3luYyBvdmVycnVuICBlcnJvciAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX0RNQV9FUlJPUl9SRVFHRU4gXAorICAweDAwMDAwNDAwVSAvKiE8IERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvciBvdmVycnVuICBlcnJvciAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BX3JlcXVlc3QgRE1BIHJlcXVlc3QKKyAqIEB7CisgKi8KKyNkZWZpbmUgRE1BX1JFUVVFU1RfTUVNMk1FTSAwVSAvKiE8IG1lbW9yeSB0byBtZW1vcnkgdHJhbnNmZXIgICAqLworCisjZGVmaW5lIERNQV9SRVFVRVNUX0dFTkVSQVRPUjAgMVUKKyNkZWZpbmUgRE1BX1JFUVVFU1RfR0VORVJBVE9SMSAyVQorI2RlZmluZSBETUFfUkVRVUVTVF9HRU5FUkFUT1IyIDNVCisjZGVmaW5lIERNQV9SRVFVRVNUX0dFTkVSQVRPUjMgNFUKKworI2RlZmluZSBETUFfUkVRVUVTVF9BREMxIDVVCisKKyNkZWZpbmUgRE1BX1JFUVVFU1RfREFDMV9DSEFOTkVMMSA2VQorI2RlZmluZSBETUFfUkVRVUVTVF9EQUMxX0NIQU5ORUwyIDdVCisKKyNkZWZpbmUgRE1BX1JFUVVFU1RfVElNNl9VUCA4VQorI2RlZmluZSBETUFfUkVRVUVTVF9USU03X1VQIDlVCisKKyNkZWZpbmUgRE1BX1JFUVVFU1RfU1BJMV9SWCAxMFUKKyNkZWZpbmUgRE1BX1JFUVVFU1RfU1BJMV9UWCAxMVUKKyNkZWZpbmUgRE1BX1JFUVVFU1RfU1BJMl9SWCAxMlUKKyNkZWZpbmUgRE1BX1JFUVVFU1RfU1BJMl9UWCAxM1UKKyNkZWZpbmUgRE1BX1JFUVVFU1RfU1BJM19SWCAxNFUKKyNkZWZpbmUgRE1BX1JFUVVFU1RfU1BJM19UWCAxNVUKKworI2RlZmluZSBETUFfUkVRVUVTVF9JMkMxX1JYIDE2VQorI2RlZmluZSBETUFfUkVRVUVTVF9JMkMxX1RYIDE3VQorI2RlZmluZSBETUFfUkVRVUVTVF9JMkMyX1JYIDE4VQorI2RlZmluZSBETUFfUkVRVUVTVF9JMkMyX1RYIDE5VQorI2RlZmluZSBETUFfUkVRVUVTVF9JMkMzX1JYIDIwVQorI2RlZmluZSBETUFfUkVRVUVTVF9JMkMzX1RYIDIxVQorI2lmIGRlZmluZWQoSTJDNCkKKyNkZWZpbmUgRE1BX1JFUVVFU1RfSTJDNF9SWCAyMlUKKyNkZWZpbmUgRE1BX1JFUVVFU1RfSTJDNF9UWCAyM1UKKyNlbmRpZiAvKiBJMkM0ICovCisKKyNkZWZpbmUgRE1BX1JFUVVFU1RfVVNBUlQxX1JYIDI0VQorI2RlZmluZSBETUFfUkVRVUVTVF9VU0FSVDFfVFggMjVVCisjZGVmaW5lIERNQV9SRVFVRVNUX1VTQVJUMl9SWCAyNlUKKyNkZWZpbmUgRE1BX1JFUVVFU1RfVVNBUlQyX1RYIDI3VQorI2RlZmluZSBETUFfUkVRVUVTVF9VU0FSVDNfUlggMjhVCisjZGVmaW5lIERNQV9SRVFVRVNUX1VTQVJUM19UWCAyOVUKKworI2RlZmluZSBETUFfUkVRVUVTVF9VQVJUNF9SWCAzMFUKKyNkZWZpbmUgRE1BX1JFUVVFU1RfVUFSVDRfVFggMzFVCisjaWYgZGVmaW5lZChVQVJUNSkKKyNkZWZpbmUgRE1BX1JFUVVFU1RfVUFSVDVfUlggMzJVCisjZGVmaW5lIERNQV9SRVFVRVNUX1VBUlQ1X1RYIDMzVQorI2VuZGlmIC8qIFVBUlQ1ICovCisKKyNkZWZpbmUgRE1BX1JFUVVFU1RfTFBVQVJUMV9SWCAzNFUKKyNkZWZpbmUgRE1BX1JFUVVFU1RfTFBVQVJUMV9UWCAzNVUKKworI2RlZmluZSBETUFfUkVRVUVTVF9BREMyIDM2VQorI2lmIGRlZmluZWQoQURDMykKKyNkZWZpbmUgRE1BX1JFUVVFU1RfQURDMyAzN1UKKyNlbmRpZiAvKiBBREMzICovCisjaWYgZGVmaW5lZChBREM0KQorI2RlZmluZSBETUFfUkVRVUVTVF9BREM0IDM4VQorI2VuZGlmIC8qIEFEQzQgKi8KKyNpZiBkZWZpbmVkKEFEQzUpCisjZGVmaW5lIERNQV9SRVFVRVNUX0FEQzUgMzlVCisjZW5kaWYgLyogQURDNSAqLworCisjaWYgZGVmaW5lZChRVUFEU1BJKQorI2RlZmluZSBETUFfUkVRVUVTVF9RVUFEU1BJIDQwVQorI2VuZGlmIC8qIFFVQURTUEkgKi8KKworI2lmIGRlZmluZWQoREFDMikKKyNkZWZpbmUgRE1BX1JFUVVFU1RfREFDMl9DSEFOTkVMMSA0MVUKKyNlbmRpZiAvKiBEQUMyICovCisKKyNkZWZpbmUgRE1BX1JFUVVFU1RfVElNMV9DSDEgNDJVCisjZGVmaW5lIERNQV9SRVFVRVNUX1RJTTFfQ0gyIDQzVQorI2RlZmluZSBETUFfUkVRVUVTVF9USU0xX0NIMyA0NFUKKyNkZWZpbmUgRE1BX1JFUVVFU1RfVElNMV9DSDQgNDVVCisjZGVmaW5lIERNQV9SRVFVRVNUX1RJTTFfVVAgNDZVCisjZGVmaW5lIERNQV9SRVFVRVNUX1RJTTFfVFJJRyA0N1UKKyNkZWZpbmUgRE1BX1JFUVVFU1RfVElNMV9DT00gNDhVCisKKyNkZWZpbmUgRE1BX1JFUVVFU1RfVElNOF9DSDEgNDlVCisjZGVmaW5lIERNQV9SRVFVRVNUX1RJTThfQ0gyIDUwVQorI2RlZmluZSBETUFfUkVRVUVTVF9USU04X0NIMyA1MVUKKyNkZWZpbmUgRE1BX1JFUVVFU1RfVElNOF9DSDQgNTJVCisjZGVmaW5lIERNQV9SRVFVRVNUX1RJTThfVVAgNTNVCisjZGVmaW5lIERNQV9SRVFVRVNUX1RJTThfVFJJRyA1NFUKKyNkZWZpbmUgRE1BX1JFUVVFU1RfVElNOF9DT00gNTVVCisKKyNkZWZpbmUgRE1BX1JFUVVFU1RfVElNMl9DSDEgNTZVCisjZGVmaW5lIERNQV9SRVFVRVNUX1RJTTJfQ0gyIDU3VQorI2RlZmluZSBETUFfUkVRVUVTVF9USU0yX0NIMyA1OFUKKyNkZWZpbmUgRE1BX1JFUVVFU1RfVElNMl9DSDQgNTlVCisjZGVmaW5lIERNQV9SRVFVRVNUX1RJTTJfVVAgNjBVCisKKyNkZWZpbmUgRE1BX1JFUVVFU1RfVElNM19DSDEgNjFVCisjZGVmaW5lIERNQV9SRVFVRVNUX1RJTTNfQ0gyIDYyVQorI2RlZmluZSBETUFfUkVRVUVTVF9USU0zX0NIMyA2M1UKKyNkZWZpbmUgRE1BX1JFUVVFU1RfVElNM19DSDQgNjRVCisjZGVmaW5lIERNQV9SRVFVRVNUX1RJTTNfVVAgNjVVCisjZGVmaW5lIERNQV9SRVFVRVNUX1RJTTNfVFJJRyA2NlUKKworI2RlZmluZSBETUFfUkVRVUVTVF9USU00X0NIMSA2N1UKKyNkZWZpbmUgRE1BX1JFUVVFU1RfVElNNF9DSDIgNjhVCisjZGVmaW5lIERNQV9SRVFVRVNUX1RJTTRfQ0gzIDY5VQorI2RlZmluZSBETUFfUkVRVUVTVF9USU00X0NINCA3MFUKKyNkZWZpbmUgRE1BX1JFUVVFU1RfVElNNF9VUCA3MVUKKworI2lmIGRlZmluZWQoVElNNSkKKyNkZWZpbmUgRE1BX1JFUVVFU1RfVElNNV9DSDEgNzJVCisjZGVmaW5lIERNQV9SRVFVRVNUX1RJTTVfQ0gyIDczVQorI2RlZmluZSBETUFfUkVRVUVTVF9USU01X0NIMyA3NFUKKyNkZWZpbmUgRE1BX1JFUVVFU1RfVElNNV9DSDQgNzVVCisjZGVmaW5lIERNQV9SRVFVRVNUX1RJTTVfVVAgNzZVCisjZGVmaW5lIERNQV9SRVFVRVNUX1RJTTVfVFJJRyA3N1UKKyNlbmRpZiAvKiBUSU01ICovCisKKyNkZWZpbmUgRE1BX1JFUVVFU1RfVElNMTVfQ0gxIDc4VQorI2RlZmluZSBETUFfUkVRVUVTVF9USU0xNV9VUCA3OVUKKyNkZWZpbmUgRE1BX1JFUVVFU1RfVElNMTVfVFJJRyA4MFUKKyNkZWZpbmUgRE1BX1JFUVVFU1RfVElNMTVfQ09NIDgxVQorCisjZGVmaW5lIERNQV9SRVFVRVNUX1RJTTE2X0NIMSA4MlUKKyNkZWZpbmUgRE1BX1JFUVVFU1RfVElNMTZfVVAgODNVCisjZGVmaW5lIERNQV9SRVFVRVNUX1RJTTE3X0NIMSA4NFUKKyNkZWZpbmUgRE1BX1JFUVVFU1RfVElNMTdfVVAgODVVCisKKyNpZiBkZWZpbmVkKFRJTTIwKQorI2RlZmluZSBETUFfUkVRVUVTVF9USU0yMF9DSDEgODZVCisjZGVmaW5lIERNQV9SRVFVRVNUX1RJTTIwX0NIMiA4N1UKKyNkZWZpbmUgRE1BX1JFUVVFU1RfVElNMjBfQ0gzIDg4VQorI2RlZmluZSBETUFfUkVRVUVTVF9USU0yMF9DSDQgODlVCisjZGVmaW5lIERNQV9SRVFVRVNUX1RJTTIwX1VQIDkwVQorI2VuZGlmIC8qIFRJTTIwICovCisKKyNkZWZpbmUgRE1BX1JFUVVFU1RfQUVTX0lOIDkxVQorI2RlZmluZSBETUFfUkVRVUVTVF9BRVNfT1VUIDkyVQorCisjaWYgZGVmaW5lZChUSU0yMCkKKyNkZWZpbmUgRE1BX1JFUVVFU1RfVElNMjBfVFJJRyA5M1UKKyNkZWZpbmUgRE1BX1JFUVVFU1RfVElNMjBfQ09NIDk0VQorI2VuZGlmIC8qIFRJTTIwICovCisKKyNpZiBkZWZpbmVkKEhSVElNMSkKKyNkZWZpbmUgRE1BX1JFUVVFU1RfSFJUSU0xX00gOTVVCisjZGVmaW5lIERNQV9SRVFVRVNUX0hSVElNMV9BIDk2VQorI2RlZmluZSBETUFfUkVRVUVTVF9IUlRJTTFfQiA5N1UKKyNkZWZpbmUgRE1BX1JFUVVFU1RfSFJUSU0xX0MgOThVCisjZGVmaW5lIERNQV9SRVFVRVNUX0hSVElNMV9EIDk5VQorI2RlZmluZSBETUFfUkVRVUVTVF9IUlRJTTFfRSAxMDBVCisjZGVmaW5lIERNQV9SRVFVRVNUX0hSVElNMV9GIDEwMVUKKyNlbmRpZiAvKiBIUlRJTTEgKi8KKworI2RlZmluZSBETUFfUkVRVUVTVF9EQUMzX0NIQU5ORUwxIDEwMlUKKyNkZWZpbmUgRE1BX1JFUVVFU1RfREFDM19DSEFOTkVMMiAxMDNVCisjaWYgZGVmaW5lZChEQUM0KQorI2RlZmluZSBETUFfUkVRVUVTVF9EQUM0X0NIQU5ORUwxIDEwNFUKKyNkZWZpbmUgRE1BX1JFUVVFU1RfREFDNF9DSEFOTkVMMiAxMDVVCisjZW5kaWYgLyogREFDNCAqLworCisjaWYgZGVmaW5lZChTUEk0KQorI2RlZmluZSBETUFfUkVRVUVTVF9TUEk0X1JYIDEwNlUKKyNkZWZpbmUgRE1BX1JFUVVFU1RfU1BJNF9UWCAxMDdVCisjZW5kaWYgLyogU1BJNCAqLworCisjZGVmaW5lIERNQV9SRVFVRVNUX1NBSTFfQSAxMDhVCisjZGVmaW5lIERNQV9SRVFVRVNUX1NBSTFfQiAxMDlVCisKKyNkZWZpbmUgRE1BX1JFUVVFU1RfRk1BQ19SRUFEIDExMFUKKyNkZWZpbmUgRE1BX1JFUVVFU1RfRk1BQ19XUklURSAxMTFVCisKKyNkZWZpbmUgRE1BX1JFUVVFU1RfQ09SRElDX1JFQUQgMTEyVQorI2RlZmluZSBETUFfUkVRVUVTVF9DT1JESUNfV1JJVEUgMTEzVQorCisjZGVmaW5lIERNQV9SRVFVRVNUX1VDUEQxX1JYIDExNFUKKyNkZWZpbmUgRE1BX1JFUVVFU1RfVUNQRDFfVFggMTE1VQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBETUFfRGF0YV90cmFuc2Zlcl9kaXJlY3Rpb24gRE1BIERhdGEgdHJhbnNmZXIgZGlyZWN0aW9uCisgKiBAeworICovCisjZGVmaW5lIERNQV9QRVJJUEhfVE9fTUVNT1JZICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBQZXJpcGhlcmFsIHRvIG1lbW9yeSBkaXJlY3Rpb24gXAorICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRE1BX01FTU9SWV9UT19QRVJJUEggICAgICAgICAgICAgICAgICAgICAgXAorICBETUFfQ0NSX0RJUiAvKiE8IE1lbW9yeSB0byBwZXJpcGhlcmFsIGRpcmVjdGlvbiBcCisgICAgICAgICAgICAgICAqLworI2RlZmluZSBETUFfTUVNT1JZX1RPX01FTU9SWSBcCisgIERNQV9DQ1JfTUVNMk1FTSAvKiE8IE1lbW9yeSB0byBtZW1vcnkgZGlyZWN0aW9uICAgICAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BX1BlcmlwaGVyYWxfaW5jcmVtZW50ZWRfbW9kZSBETUEgUGVyaXBoZXJhbCBpbmNyZW1lbnRlZCBtb2RlCisgKiBAeworICovCisjZGVmaW5lIERNQV9QSU5DX0VOQUJMRSBETUFfQ0NSX1BJTkMgLyohPCBQZXJpcGhlcmFsIGluY3JlbWVudCBtb2RlIEVuYWJsZSAqLworI2RlZmluZSBETUFfUElOQ19ESVNBQkxFIDB4MDAwMDAwMDBVIC8qITwgUGVyaXBoZXJhbCBpbmNyZW1lbnQgbW9kZSBEaXNhYmxlICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBETUFfTWVtb3J5X2luY3JlbWVudGVkX21vZGUgRE1BIE1lbW9yeSBpbmNyZW1lbnRlZCBtb2RlCisgKiBAeworICovCisjZGVmaW5lIERNQV9NSU5DX0VOQUJMRSBETUFfQ0NSX01JTkMgLyohPCBNZW1vcnkgaW5jcmVtZW50IG1vZGUgRW5hYmxlICAqLworI2RlZmluZSBETUFfTUlOQ19ESVNBQkxFIDB4MDAwMDAwMDBVIC8qITwgTWVtb3J5IGluY3JlbWVudCBtb2RlIERpc2FibGUgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIERNQV9QZXJpcGhlcmFsX2RhdGFfc2l6ZSBETUEgUGVyaXBoZXJhbCBkYXRhIHNpemUKKyAqIEB7CisgKi8KKyNkZWZpbmUgRE1BX1BEQVRBQUxJR05fQllURSBcCisgIDB4MDAwMDAwMDBVIC8qITwgUGVyaXBoZXJhbCBkYXRhIGFsaWdubWVudCA6IEJ5dGUgICAgICovCisjZGVmaW5lIERNQV9QREFUQUFMSUdOX0hBTEZXT1JEIFwKKyAgRE1BX0NDUl9QU0laRV8wIC8qITwgUGVyaXBoZXJhbCBkYXRhIGFsaWdubWVudCA6IEhhbGZXb3JkICovCisjZGVmaW5lIERNQV9QREFUQUFMSUdOX1dPUkQgXAorICBETUFfQ0NSX1BTSVpFXzEgLyohPCBQZXJpcGhlcmFsIGRhdGEgYWxpZ25tZW50IDogV29yZCAgICAgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIERNQV9NZW1vcnlfZGF0YV9zaXplIERNQSBNZW1vcnkgZGF0YSBzaXplCisgKiBAeworICovCisjZGVmaW5lIERNQV9NREFUQUFMSUdOX0JZVEUgMHgwMDAwMDAwMFUgLyohPCBNZW1vcnkgZGF0YSBhbGlnbm1lbnQgOiBCeXRlICovCisjZGVmaW5lIERNQV9NREFUQUFMSUdOX0hBTEZXT1JEIFwKKyAgRE1BX0NDUl9NU0laRV8wIC8qITwgTWVtb3J5IGRhdGEgYWxpZ25tZW50IDogSGFsZldvcmQgKi8KKyNkZWZpbmUgRE1BX01EQVRBQUxJR05fV09SRCBcCisgIERNQV9DQ1JfTVNJWkVfMSAvKiE8IE1lbW9yeSBkYXRhIGFsaWdubWVudCA6IFdvcmQgICAgICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBETUFfbW9kZSBETUEgbW9kZQorICogQHsKKyAqLworI2RlZmluZSBETUFfTk9STUFMIDB4MDAwMDAwMDBVICAgIC8qITwgTm9ybWFsIG1vZGUgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBETUFfQ0lSQ1VMQVIgRE1BX0NDUl9DSVJDIC8qITwgQ2lyY3VsYXIgbW9kZSAgICAgICAgICAgICAgICAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BX1ByaW9yaXR5X2xldmVsIERNQSBQcmlvcml0eSBsZXZlbAorICogQHsKKyAqLworI2RlZmluZSBETUFfUFJJT1JJVFlfTE9XIDB4MDAwMDAwMDBVICAgICAgLyohPCBQcmlvcml0eSBsZXZlbCA6IExvdyAgICAgICAqLworI2RlZmluZSBETUFfUFJJT1JJVFlfTUVESVVNIERNQV9DQ1JfUExfMCAgLyohPCBQcmlvcml0eSBsZXZlbCA6IE1lZGl1bSAgICAqLworI2RlZmluZSBETUFfUFJJT1JJVFlfSElHSCBETUFfQ0NSX1BMXzEgICAgLyohPCBQcmlvcml0eSBsZXZlbCA6IEhpZ2ggICAgICAqLworI2RlZmluZSBETUFfUFJJT1JJVFlfVkVSWV9ISUdIIERNQV9DQ1JfUEwgLyohPCBQcmlvcml0eSBsZXZlbCA6IFZlcnlfSGlnaCAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BX2ludGVycnVwdF9lbmFibGVfZGVmaW5pdGlvbnMgRE1BIGludGVycnVwdCBlbmFibGUgZGVmaW5pdGlvbnMKKyAqIEB7CisgKi8KKyNkZWZpbmUgRE1BX0lUX1RDIERNQV9DQ1JfVENJRQorI2RlZmluZSBETUFfSVRfSFQgRE1BX0NDUl9IVElFCisjZGVmaW5lIERNQV9JVF9URSBETUFfQ0NSX1RFSUUKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIERNQV9mbGFnX2RlZmluaXRpb25zIERNQSBmbGFnIGRlZmluaXRpb25zCisgKiBAeworICovCisjZGVmaW5lIERNQV9GTEFHX0dMMSAweDAwMDAwMDAxVQorI2RlZmluZSBETUFfRkxBR19UQzEgMHgwMDAwMDAwMlUKKyNkZWZpbmUgRE1BX0ZMQUdfSFQxIDB4MDAwMDAwMDRVCisjZGVmaW5lIERNQV9GTEFHX1RFMSAweDAwMDAwMDA4VQorI2RlZmluZSBETUFfRkxBR19HTDIgMHgwMDAwMDAxMFUKKyNkZWZpbmUgRE1BX0ZMQUdfVEMyIDB4MDAwMDAwMjBVCisjZGVmaW5lIERNQV9GTEFHX0hUMiAweDAwMDAwMDQwVQorI2RlZmluZSBETUFfRkxBR19URTIgMHgwMDAwMDA4MFUKKyNkZWZpbmUgRE1BX0ZMQUdfR0wzIDB4MDAwMDAxMDBVCisjZGVmaW5lIERNQV9GTEFHX1RDMyAweDAwMDAwMjAwVQorI2RlZmluZSBETUFfRkxBR19IVDMgMHgwMDAwMDQwMFUKKyNkZWZpbmUgRE1BX0ZMQUdfVEUzIDB4MDAwMDA4MDBVCisjZGVmaW5lIERNQV9GTEFHX0dMNCAweDAwMDAxMDAwVQorI2RlZmluZSBETUFfRkxBR19UQzQgMHgwMDAwMjAwMFUKKyNkZWZpbmUgRE1BX0ZMQUdfSFQ0IDB4MDAwMDQwMDBVCisjZGVmaW5lIERNQV9GTEFHX1RFNCAweDAwMDA4MDAwVQorI2RlZmluZSBETUFfRkxBR19HTDUgMHgwMDAxMDAwMFUKKyNkZWZpbmUgRE1BX0ZMQUdfVEM1IDB4MDAwMjAwMDBVCisjZGVmaW5lIERNQV9GTEFHX0hUNSAweDAwMDQwMDAwVQorI2RlZmluZSBETUFfRkxBR19URTUgMHgwMDA4MDAwMFUKKyNkZWZpbmUgRE1BX0ZMQUdfR0w2IDB4MDAxMDAwMDBVCisjZGVmaW5lIERNQV9GTEFHX1RDNiAweDAwMjAwMDAwVQorI2RlZmluZSBETUFfRkxBR19IVDYgMHgwMDQwMDAwMFUKKyNkZWZpbmUgRE1BX0ZMQUdfVEU2IDB4MDA4MDAwMDBVCisjaWYgZGVmaW5lZChETUExX0NoYW5uZWw3KQorI2RlZmluZSBETUFfRkxBR19HTDcgMHgwMTAwMDAwMFUKKyNkZWZpbmUgRE1BX0ZMQUdfVEM3IDB4MDIwMDAwMDBVCisjZGVmaW5lIERNQV9GTEFHX0hUNyAweDA0MDAwMDAwVQorI2RlZmluZSBETUFfRkxBR19URTcgMHgwODAwMDAwMFUKKyNlbmRpZiAvKiBETUExX0NoYW5uZWw3ICovCisjaWYgZGVmaW5lZChETUExX0NoYW5uZWw4KQorI2RlZmluZSBETUFfRkxBR19HTDggMHgxMDAwMDAwMFUKKyNkZWZpbmUgRE1BX0ZMQUdfVEM4IDB4MjAwMDAwMDBVCisjZGVmaW5lIERNQV9GTEFHX0hUOCAweDQwMDAwMDAwVQorI2RlZmluZSBETUFfRkxBR19URTggMHg4MDAwMDAwMFUKKyNlbmRpZiAvKiBETUExX0NoYW5uZWw4ICovCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIERNQV9FeHBvcnRlZF9NYWNyb3MgRE1BIEV4cG9ydGVkIE1hY3JvcworICogQHsKKyAqLworCisvKiogQGJyaWVmICBSZXNldCBETUEgaGFuZGxlIHN0YXRlLgorICogQHBhcmFtICBfX0hBTkRMRV9fIERNQSBoYW5kbGUKKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX0RNQV9SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgXAorICAoKF9fSEFORExFX18pLT5TdGF0ZSA9IEhBTF9ETUFfU1RBVEVfUkVTRVQpCisKKy8qKgorICogQGJyaWVmICBFbmFibGUgdGhlIHNwZWNpZmllZCBETUEgQ2hhbm5lbC4KKyAqIEBwYXJhbSAgX19IQU5ETEVfXyBETUEgaGFuZGxlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9ETUFfRU5BQkxFKF9fSEFORExFX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ1IgfD0gRE1BX0NDUl9FTikKKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgdGhlIHNwZWNpZmllZCBETUEgQ2hhbm5lbC4KKyAqIEBwYXJhbSAgX19IQU5ETEVfXyBETUEgaGFuZGxlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9ETUFfRElTQUJMRShfX0hBTkRMRV9fKSBcCisgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ1IgJj0gfkRNQV9DQ1JfRU4pCisKKy8qIEludGVycnVwdCAmIEZsYWcgbWFuYWdlbWVudCAqLworCisvKioKKyAqIEBicmllZiAgUmV0dXJuIHRoZSBjdXJyZW50IERNQSBDaGFubmVsIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuCisgKiBAcGFyYW0gIF9fSEFORExFX18gRE1BIGhhbmRsZQorICogQHJldHZhbCBUaGUgc3BlY2lmaWVkIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcgaW5kZXguCisgKi8KKworI2lmIGRlZmluZWQoRE1BMV9DaGFubmVsOCkKKyNkZWZpbmUgX19IQUxfRE1BX0dFVF9UQ19GTEFHX0lOREVYKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwxKSkgICBcCisgICAgICAgPyBETUFfRkxBR19UQzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWwxKSkgXAorICAgICAgID8gRE1BX0ZMQUdfVEMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICA6ICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMikpIFwKKyAgICAgICA/IERNQV9GTEFHX1RDMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDIpKSBcCisgICAgICAgPyBETUFfRkxBR19UQzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwzKSkgXAorICAgICAgID8gRE1BX0ZMQUdfVEMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICA6ICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMl9DaGFubmVsMykpIFwKKyAgICAgICA/IERNQV9GTEFHX1RDMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDQpKSBcCisgICAgICAgPyBETUFfRkxBR19UQzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWw0KSkgXAorICAgICAgID8gRE1BX0ZMQUdfVEM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICA6ICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsNSkpIFwKKyAgICAgICA/IERNQV9GTEFHX1RDNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDUpKSBcCisgICAgICAgPyBETUFfRkxBR19UQzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw2KSkgXAorICAgICAgID8gRE1BX0ZMQUdfVEM2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICA6ICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMl9DaGFubmVsNikpIFwKKyAgICAgICA/IERNQV9GTEFHX1RDNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDcpKSBcCisgICAgICAgPyBETUFfRkxBR19UQzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWw3KSkgXAorICAgICAgID8gRE1BX0ZMQUdfVEM3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgOiBETUFfRkxBR19UQzgpCisjZWxpZiBkZWZpbmVkKERNQTFfQ2hhbm5lbDYpCisjZGVmaW5lIF9fSEFMX0RNQV9HRVRfVENfRkxBR19JTkRFWChfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMSkpICAgXAorICAgICAgID8gRE1BX0ZMQUdfVEMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICA6ICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMl9DaGFubmVsMSkpIFwKKyAgICAgICA/IERNQV9GTEFHX1RDMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDIpKSBcCisgICAgICAgPyBETUFfRkxBR19UQzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWwyKSkgXAorICAgICAgID8gRE1BX0ZMQUdfVEMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICA6ICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMykpIFwKKyAgICAgICA/IERNQV9GTEFHX1RDMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDMpKSBcCisgICAgICAgPyBETUFfRkxBR19UQzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw0KSkgXAorICAgICAgID8gRE1BX0ZMQUdfVEM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICA6ICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMl9DaGFubmVsNCkpIFwKKyAgICAgICA/IERNQV9GTEFHX1RDNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDUpKSBcCisgICAgICAgPyBETUFfRkxBR19UQzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWw1KSkgXAorICAgICAgID8gRE1BX0ZMQUdfVEM1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgOiBETUFfRkxBR19UQzYpCisjZW5kaWYgLyogRE1BMV9DaGFubmVsOCAqLworCisvKioKKyAqIEBicmllZiAgUmV0dXJuIHRoZSBjdXJyZW50IERNQSBDaGFubmVsIGhhbGYgdHJhbnNmZXIgY29tcGxldGUgZmxhZy4KKyAqIEBwYXJhbSAgX19IQU5ETEVfXyBETUEgaGFuZGxlCisgKiBAcmV0dmFsIFRoZSBzcGVjaWZpZWQgaGFsZiB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnIGluZGV4LgorICovCisjaWYgZGVmaW5lZChETUExX0NoYW5uZWw4KQorI2RlZmluZSBfX0hBTF9ETUFfR0VUX0hUX0ZMQUdfSU5ERVgoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDEpKSAgIFwKKyAgICAgICA/IERNQV9GTEFHX0hUMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDEpKSBcCisgICAgICAgPyBETUFfRkxBR19IVDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwyKSkgXAorICAgICAgID8gRE1BX0ZMQUdfSFQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICA6ICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMl9DaGFubmVsMikpIFwKKyAgICAgICA/IERNQV9GTEFHX0hUMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDMpKSBcCisgICAgICAgPyBETUFfRkxBR19IVDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWwzKSkgXAorICAgICAgID8gRE1BX0ZMQUdfSFQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICA6ICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsNCkpIFwKKyAgICAgICA/IERNQV9GTEFHX0hUNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDQpKSBcCisgICAgICAgPyBETUFfRkxBR19IVDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw1KSkgXAorICAgICAgID8gRE1BX0ZMQUdfSFQ1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICA6ICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMl9DaGFubmVsNSkpIFwKKyAgICAgICA/IERNQV9GTEFHX0hUNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDYpKSBcCisgICAgICAgPyBETUFfRkxBR19IVDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWw2KSkgXAorICAgICAgID8gRE1BX0ZMQUdfSFQ2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICA6ICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsNykpIFwKKyAgICAgICA/IERNQV9GTEFHX0hUNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDcpKSBcCisgICAgICAgPyBETUFfRkxBR19IVDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICA6IERNQV9GTEFHX0hUOCkKKyNlbGlmIGRlZmluZWQoRE1BMV9DaGFubmVsNikKKyNkZWZpbmUgX19IQUxfRE1BX0dFVF9IVF9GTEFHX0lOREVYKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwxKSkgICBcCisgICAgICAgPyBETUFfRkxBR19IVDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWwxKSkgXAorICAgICAgID8gRE1BX0ZMQUdfSFQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICA6ICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMikpIFwKKyAgICAgICA/IERNQV9GTEFHX0hUMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDIpKSBcCisgICAgICAgPyBETUFfRkxBR19IVDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwzKSkgXAorICAgICAgID8gRE1BX0ZMQUdfSFQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICA6ICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMl9DaGFubmVsMykpIFwKKyAgICAgICA/IERNQV9GTEFHX0hUMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDQpKSBcCisgICAgICAgPyBETUFfRkxBR19IVDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWw0KSkgXAorICAgICAgID8gRE1BX0ZMQUdfSFQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICA6ICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsNSkpIFwKKyAgICAgICA/IERNQV9GTEFHX0hUNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDUpKSBcCisgICAgICAgPyBETUFfRkxBR19IVDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICA6IERNQV9GTEFHX0hUNikKKyNlbmRpZiAvKiBETUExX0NoYW5uZWw4ICovCisKKy8qKgorICogQGJyaWVmICBSZXR1cm4gdGhlIGN1cnJlbnQgRE1BIENoYW5uZWwgdHJhbnNmZXIgZXJyb3IgZmxhZy4KKyAqIEBwYXJhbSAgX19IQU5ETEVfXyBETUEgaGFuZGxlCisgKiBAcmV0dmFsIFRoZSBzcGVjaWZpZWQgdHJhbnNmZXIgZXJyb3IgZmxhZyBpbmRleC4KKyAqLworI2lmIGRlZmluZWQoRE1BMV9DaGFubmVsOCkKKyNkZWZpbmUgX19IQUxfRE1BX0dFVF9URV9GTEFHX0lOREVYKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwxKSkgICBcCisgICAgICAgPyBETUFfRkxBR19URTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWwxKSkgXAorICAgICAgID8gRE1BX0ZMQUdfVEUxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICA6ICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMikpIFwKKyAgICAgICA/IERNQV9GTEFHX1RFMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDIpKSBcCisgICAgICAgPyBETUFfRkxBR19URTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwzKSkgXAorICAgICAgID8gRE1BX0ZMQUdfVEUzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICA6ICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMl9DaGFubmVsMykpIFwKKyAgICAgICA/IERNQV9GTEFHX1RFMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDQpKSBcCisgICAgICAgPyBETUFfRkxBR19URTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWw0KSkgXAorICAgICAgID8gRE1BX0ZMQUdfVEU0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICA6ICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsNSkpIFwKKyAgICAgICA/IERNQV9GTEFHX1RFNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDUpKSBcCisgICAgICAgPyBETUFfRkxBR19URTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw2KSkgXAorICAgICAgID8gRE1BX0ZMQUdfVEU2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICA6ICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMl9DaGFubmVsNikpIFwKKyAgICAgICA/IERNQV9GTEFHX1RFNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDcpKSBcCisgICAgICAgPyBETUFfRkxBR19URTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWw3KSkgXAorICAgICAgID8gRE1BX0ZMQUdfVEU3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgOiBETUFfRkxBR19URTgpCisjZWxpZiBkZWZpbmVkKERNQTFfQ2hhbm5lbDYpCisjZGVmaW5lIF9fSEFMX0RNQV9HRVRfVEVfRkxBR19JTkRFWChfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMSkpICAgXAorICAgICAgID8gRE1BX0ZMQUdfVEUxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICA6ICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMl9DaGFubmVsMSkpIFwKKyAgICAgICA/IERNQV9GTEFHX1RFMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDIpKSBcCisgICAgICAgPyBETUFfRkxBR19URTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWwyKSkgXAorICAgICAgID8gRE1BX0ZMQUdfVEUyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICA6ICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMykpIFwKKyAgICAgICA/IERNQV9GTEFHX1RFMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDMpKSBcCisgICAgICAgPyBETUFfRkxBR19URTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw0KSkgXAorICAgICAgID8gRE1BX0ZMQUdfVEU0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICA6ICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMl9DaGFubmVsNCkpIFwKKyAgICAgICA/IERNQV9GTEFHX1RFNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDUpKSBcCisgICAgICAgPyBETUFfRkxBR19URTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWw1KSkgXAorICAgICAgID8gRE1BX0ZMQUdfVEU1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgOiBETUFfRkxBR19URTYpCisjZW5kaWYgLyogRE1BMV9DaGFubmVsOCAqLworCisvKioKKyAqIEBicmllZiAgUmV0dXJuIHRoZSBjdXJyZW50IERNQSBDaGFubmVsIEdsb2JhbCBpbnRlcnJ1cHQgZmxhZy4KKyAqIEBwYXJhbSAgX19IQU5ETEVfXyBETUEgaGFuZGxlCisgKiBAcmV0dmFsIFRoZSBzcGVjaWZpZWQgdHJhbnNmZXIgZXJyb3IgZmxhZyBpbmRleC4KKyAqLworI2lmIGRlZmluZWQoRE1BMV9DaGFubmVsOCkKKyNkZWZpbmUgX19IQUxfRE1BX0dFVF9HSV9GTEFHX0lOREVYKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwxKSkgICBcCisgICAgICAgPyBETUFfSVNSX0dJRjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWwxKSkgXAorICAgICAgID8gRE1BX0lTUl9HSUYxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICA6ICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMikpIFwKKyAgICAgICA/IERNQV9JU1JfR0lGMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDIpKSBcCisgICAgICAgPyBETUFfSVNSX0dJRjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwzKSkgXAorICAgICAgID8gRE1BX0lTUl9HSUYzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICA6ICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMl9DaGFubmVsMykpIFwKKyAgICAgICA/IERNQV9JU1JfR0lGMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDQpKSBcCisgICAgICAgPyBETUFfSVNSX0dJRjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWw0KSkgXAorICAgICAgID8gRE1BX0lTUl9HSUY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICA6ICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsNSkpIFwKKyAgICAgICA/IERNQV9JU1JfR0lGNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDUpKSBcCisgICAgICAgPyBETUFfSVNSX0dJRjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw2KSkgXAorICAgICAgID8gRE1BX0lTUl9HSUY2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICA6ICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMl9DaGFubmVsNikpIFwKKyAgICAgICA/IERNQV9JU1JfR0lGNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDcpKSBcCisgICAgICAgPyBETUFfSVNSX0dJRjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWw3KSkgXAorICAgICAgID8gRE1BX0lTUl9HSUY3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgOiBETUFfSVNSX0dJRjgpCisjZWxpZiBkZWZpbmVkKERNQTFfQ2hhbm5lbDYpCisjZGVmaW5lIF9fSEFMX0RNQV9HRVRfR0lfRkxBR19JTkRFWChfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMSkpICAgXAorICAgICAgID8gRE1BX0lTUl9HSUYxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICA6ICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMl9DaGFubmVsMSkpIFwKKyAgICAgICA/IERNQV9JU1JfR0lGMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDIpKSBcCisgICAgICAgPyBETUFfSVNSX0dJRjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWwyKSkgXAorICAgICAgID8gRE1BX0lTUl9HSUYyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICA6ICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMykpIFwKKyAgICAgICA/IERNQV9JU1JfR0lGMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDMpKSBcCisgICAgICAgPyBETUFfSVNSX0dJRjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw0KSkgXAorICAgICAgID8gRE1BX0lTUl9HSUY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICA6ICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMl9DaGFubmVsNCkpIFwKKyAgICAgICA/IERNQV9JU1JfR0lGNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDUpKSBcCisgICAgICAgPyBETUFfSVNSX0dJRjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIDogKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWw1KSkgXAorICAgICAgID8gRE1BX0lTUl9HSUY1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgOiBETUFfSVNSX0dJRjYpCisjZW5kaWYgLyogRE1BMV9DaGFubmVsOCAqLworCisvKioKKyAqIEBicmllZiAgR2V0IHRoZSBETUEgQ2hhbm5lbCBwZW5kaW5nIGZsYWdzLgorICogQHBhcmFtICBfX0hBTkRMRV9fIERNQSBoYW5kbGUKKyAqIEBwYXJhbSAgX19GTEFHX18gR2V0IHRoZSBzcGVjaWZpZWQgZmxhZy4KKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgRE1BX0ZMQUdfVEN4ICBUcmFuc2ZlciBjb21wbGV0ZSBmbGFnCisgKiAgICAgICAgICAgIEBhcmcgRE1BX0ZMQUdfSFR4ICBIYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcKKyAqICAgICAgICAgICAgQGFyZyBETUFfRkxBR19URXggIFRyYW5zZmVyIGVycm9yIGZsYWcKKyAqICAgICAgICAgICAgQGFyZyBETUFfRkxBR19HTHggIEdsb2JhbCBpbnRlcnJ1cHQgZmxhZworICogICAgICAgICBXaGVyZSB4IGNhbiBiZSBmcm9tIDEgdG8gOCB0byBzZWxlY3QgdGhlIERNQSBDaGFubmVsIHggZmxhZy4KKyAqIEByZXR2YWwgVGhlIHN0YXRlIG9mIEZMQUcgKFNFVCBvciBSRVNFVCkuCisgKi8KKyNpZiBkZWZpbmVkKERNQTFfQ2hhbm5lbDgpCisjZGVmaW5lIF9fSEFMX0RNQV9HRVRfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID4gKCh1aW50MzJfdClETUExX0NoYW5uZWw4KSkgXAorICAgICAgID8gKERNQTItPklTUiAmIChfX0ZMQUdfXykpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgOiAoRE1BMS0+SVNSICYgKF9fRkxBR19fKSkpCisjZWxpZiBkZWZpbmVkKERNQTFfQ2hhbm5lbDYpCisjZGVmaW5lIF9fSEFMX0RNQV9HRVRfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID4gKCh1aW50MzJfdClETUExX0NoYW5uZWw2KSkgXAorICAgICAgID8gKERNQTItPklTUiAmIChfX0ZMQUdfXykpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgOiAoRE1BMS0+SVNSICYgKF9fRkxBR19fKSkpCisjZW5kaWYgLyogRE1BMV9DaGFubmVsOCAqLworCisvKioKKyAqIEBicmllZiAgQ2xlYXIgdGhlIERNQSBDaGFubmVsIHBlbmRpbmcgZmxhZ3MuCisgKiBAcGFyYW0gIF9fSEFORExFX18gRE1BIGhhbmRsZQorICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2xlYXIuCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIERNQV9GTEFHX1RDeCAgVHJhbnNmZXIgY29tcGxldGUgZmxhZworICogICAgICAgICAgICBAYXJnIERNQV9GTEFHX0hUeCAgSGFsZiB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnCisgKiAgICAgICAgICAgIEBhcmcgRE1BX0ZMQUdfVEV4ICBUcmFuc2ZlciBlcnJvciBmbGFnCisgKiAgICAgICAgICAgIEBhcmcgRE1BX0ZMQUdfR0x4ICBHbG9iYWwgaW50ZXJydXB0IGZsYWcKKyAqICAgICAgICAgV2hlcmUgeCBjYW4gYmUgZnJvbSAxIHRvIDggdG8gc2VsZWN0IHRoZSBETUEgQ2hhbm5lbCB4IGZsYWcuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2lmIGRlZmluZWQoRE1BMV9DaGFubmVsOCkKKyNkZWZpbmUgX19IQUxfRE1BX0NMRUFSX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICAgICAgICAgICAgICAgICAgXAorICAoKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPiAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDgpKSBcCisgICAgICAgPyAoRE1BMi0+SUZDUiA9IChfX0ZMQUdfXykpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICA6IChETUExLT5JRkNSID0gKF9fRkxBR19fKSkpCisjZWxzZQorI2RlZmluZSBfX0hBTF9ETUFfQ0xFQVJfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgICAgICAgICAgICAgICAgICBcCisgICgoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA+ICgodWludDMyX3QpRE1BMV9DaGFubmVsNikpIFwKKyAgICAgICA/IChETUEyLT5JRkNSID0gKF9fRkxBR19fKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIDogKERNQTEtPklGQ1IgPSAoX19GTEFHX18pKSkKKyNlbmRpZiAvKiBETUExX0NoYW5uZWw4ICovCisKKy8qKgorICogQGJyaWVmICBFbmFibGUgdGhlIHNwZWNpZmllZCBETUEgQ2hhbm5lbCBpbnRlcnJ1cHRzLgorICogQHBhcmFtICBfX0hBTkRMRV9fIERNQSBoYW5kbGUKKyAqIEBwYXJhbSBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgRE1BIGludGVycnVwdCBzb3VyY2VzIHRvIGJlIGVuYWJsZWQgb3IKKyAqIGRpc2FibGVkLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIERNQV9JVF9UQyAgVHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0IG1hc2sKKyAqICAgICAgICAgICAgQGFyZyBETUFfSVRfSFQgIEhhbGYgdHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0IG1hc2sKKyAqICAgICAgICAgICAgQGFyZyBETUFfSVRfVEUgIFRyYW5zZmVyIGVycm9yIGludGVycnVwdCBtYXNrCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9ETUFfRU5BQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pIFwKKyAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDUiB8PSAoX19JTlRFUlJVUFRfXykpCisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIHRoZSBzcGVjaWZpZWQgRE1BIENoYW5uZWwgaW50ZXJydXB0cy4KKyAqIEBwYXJhbSAgX19IQU5ETEVfXyBETUEgaGFuZGxlCisgKiBAcGFyYW0gX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIERNQSBpbnRlcnJ1cHQgc291cmNlcyB0byBiZSBlbmFibGVkIG9yCisgKiBkaXNhYmxlZC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBETUFfSVRfVEMgIFRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdCBtYXNrCisgKiAgICAgICAgICAgIEBhcmcgRE1BX0lUX0hUICBIYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdCBtYXNrCisgKiAgICAgICAgICAgIEBhcmcgRE1BX0lUX1RFICBUcmFuc2ZlciBlcnJvciBpbnRlcnJ1cHQgbWFzaworICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfRE1BX0RJU0FCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgXAorICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NSICY9IH4oX19JTlRFUlJVUFRfXykpCisKKy8qKgorICogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgRE1BIENoYW5uZWwgaW50ZXJydXB0IGlzIGVuYWJsZWQgb3Igbm90LgorICogQHBhcmFtICBfX0hBTkRMRV9fIERNQSBoYW5kbGUKKyAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIERNQSBpbnRlcnJ1cHQgc291cmNlIHRvIGNoZWNrLgorICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBETUFfSVRfVEMgIFRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdCBtYXNrCisgKiAgICAgICAgICAgIEBhcmcgRE1BX0lUX0hUICBIYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdCBtYXNrCisgKiAgICAgICAgICAgIEBhcmcgRE1BX0lUX1RFICBUcmFuc2ZlciBlcnJvciBpbnRlcnJ1cHQgbWFzaworICogQHJldHZhbCBUaGUgc3RhdGUgb2YgRE1BX0lUIChTRVQgb3IgUkVTRVQpLgorICovCisjZGVmaW5lIF9fSEFMX0RNQV9HRVRfSVRfU09VUkNFKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pIFwKKyAgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ1IgJiAoX19JTlRFUlJVUFRfXykpKQorCisvKioKKyAqIEBicmllZiAgUmV0dXJuIHRoZSBudW1iZXIgb2YgcmVtYWluaW5nIGRhdGEgdW5pdHMgaW4gdGhlIGN1cnJlbnQgRE1BIENoYW5uZWwKKyAqIHRyYW5zZmVyLgorICogQHBhcmFtICBfX0hBTkRMRV9fIERNQSBoYW5kbGUKKyAqIEByZXR2YWwgVGhlIG51bWJlciBvZiByZW1haW5pbmcgZGF0YSB1bml0cyBpbiB0aGUgY3VycmVudCBETUEgQ2hhbm5lbAorICogdHJhbnNmZXIuCisgKi8KKyNkZWZpbmUgX19IQUxfRE1BX0dFVF9DT1VOVEVSKF9fSEFORExFX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DTkRUUikKKworLyoqCisgKiBAfQorICovCisKKy8qIEluY2x1ZGUgRE1BIEhBTCBFeHRlbnNpb24gbW9kdWxlICovCisjaW5jbHVkZSAic3RtMzJnNHh4X2hhbF9kbWFfZXguaCIKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBhZGR0b2dyb3VwIERNQV9FeHBvcnRlZF9GdW5jdGlvbnMKKyAqIEB7CisgKi8KKworLyoqIEBhZGR0b2dyb3VwIERNQV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxCisgKiBAeworICovCisvKiBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RNQV9Jbml0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9ETUFfRGVJbml0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKKy8qKgorICogQH0KKyAqLworCisvKiogQGFkZHRvZ3JvdXAgRE1BX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIKKyAqIEB7CisgKi8KKy8qIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BX1N0YXJ0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hLCB1aW50MzJfdCBTcmNBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBEc3RBZGRyZXNzLCB1aW50MzJfdCBEYXRhTGVuZ3RoKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9ETUFfU3RhcnRfSVQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEsIHVpbnQzMl90IFNyY0FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IERzdEFkZHJlc3MsIHVpbnQzMl90IERhdGFMZW5ndGgpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RNQV9BYm9ydChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BX0Fib3J0X0lUKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9ETUFfUG9sbEZvclRyYW5zZmVyKAorICAgIERNQV9IYW5kbGVUeXBlRGVmICpoZG1hLCBIQUxfRE1BX0xldmVsQ29tcGxldGVUeXBlRGVmIENvbXBsZXRlTGV2ZWwsCisgICAgdWludDMyX3QgVGltZW91dCk7Cit2b2lkIEhBTF9ETUFfSVJRSGFuZGxlcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BX1JlZ2lzdGVyQ2FsbGJhY2soCisgICAgRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEsIEhBTF9ETUFfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwKKyAgICB2b2lkICgqcENhbGxiYWNrKShETUFfSGFuZGxlVHlwZURlZiAqX2hkbWEpKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9ETUFfVW5SZWdpc3RlckNhbGxiYWNrKAorICAgIERNQV9IYW5kbGVUeXBlRGVmICpoZG1hLCBIQUxfRE1BX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpOworCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBhZGR0b2dyb3VwIERNQV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzCisgKiBAeworICovCisvKiBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvciBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX0RNQV9TdGF0ZVR5cGVEZWYgSEFMX0RNQV9HZXRTdGF0ZShETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7Cit1aW50MzJfdCBIQUxfRE1BX0dldEVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRE1BX1ByaXZhdGVfTWFjcm9zIERNQSBQcml2YXRlIE1hY3JvcworICogQHsKKyAqLworCisjZGVmaW5lIElTX0RNQV9ESVJFQ1RJT04oRElSRUNUSU9OKSAgICAgICAgIFwKKyAgKCgoRElSRUNUSU9OKSA9PSBETUFfUEVSSVBIX1RPX01FTU9SWSkgfHwgXAorICAgKChESVJFQ1RJT04pID09IERNQV9NRU1PUllfVE9fUEVSSVBIKSB8fCBcCisgICAoKERJUkVDVElPTikgPT0gRE1BX01FTU9SWV9UT19NRU1PUlkpKQorCisjZGVmaW5lIElTX0RNQV9CVUZGRVJfU0laRShTSVpFKSAoKChTSVpFKSA+PSAweDFVKSAmJiAoKFNJWkUpIDwgMHg0MDAwMFUpKQorCisjZGVmaW5lIElTX0RNQV9QRVJJUEhFUkFMX0lOQ19TVEFURShTVEFURSkgXAorICAoKChTVEFURSkgPT0gRE1BX1BJTkNfRU5BQkxFKSB8fCAoKFNUQVRFKSA9PSBETUFfUElOQ19ESVNBQkxFKSkKKworI2RlZmluZSBJU19ETUFfTUVNT1JZX0lOQ19TVEFURShTVEFURSkgXAorICAoKChTVEFURSkgPT0gRE1BX01JTkNfRU5BQkxFKSB8fCAoKFNUQVRFKSA9PSBETUFfTUlOQ19ESVNBQkxFKSkKKworI2RlZmluZSBJU19ETUFfQUxMX1JFUVVFU1QoUkVRVUVTVCkgKChSRVFVRVNUKSA8PSBETUFfUkVRVUVTVF9VQ1BEMV9UWCkKKworI2RlZmluZSBJU19ETUFfUEVSSVBIRVJBTF9EQVRBX1NJWkUoU0laRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKFNJWkUpID09IERNQV9QREFUQUFMSUdOX0JZVEUpIHx8ICgoU0laRSkgPT0gRE1BX1BEQVRBQUxJR05fSEFMRldPUkQpIHx8IFwKKyAgICgoU0laRSkgPT0gRE1BX1BEQVRBQUxJR05fV09SRCkpCisKKyNkZWZpbmUgSVNfRE1BX01FTU9SWV9EQVRBX1NJWkUoU0laRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKChTSVpFKSA9PSBETUFfTURBVEFBTElHTl9CWVRFKSB8fCAoKFNJWkUpID09IERNQV9NREFUQUFMSUdOX0hBTEZXT1JEKSB8fCBcCisgICAoKFNJWkUpID09IERNQV9NREFUQUFMSUdOX1dPUkQpKQorCisjZGVmaW5lIElTX0RNQV9NT0RFKE1PREUpICgoKE1PREUpID09IERNQV9OT1JNQUwpIHx8ICgoTU9ERSkgPT0gRE1BX0NJUkNVTEFSKSkKKworI2RlZmluZSBJU19ETUFfUFJJT1JJVFkoUFJJT1JJVFkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKChQUklPUklUWSkgPT0gRE1BX1BSSU9SSVRZX0xPVykgfHwgKChQUklPUklUWSkgPT0gRE1BX1BSSU9SSVRZX01FRElVTSkgfHwgXAorICAgKChQUklPUklUWSkgPT0gRE1BX1BSSU9SSVRZX0hJR0gpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKChQUklPUklUWSkgPT0gRE1BX1BSSU9SSVRZX1ZFUllfSElHSCkpCisKKy8qKgorICogQH0KKyAqLworCisvKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1NUTTMyRzR4eF9IQUxfRE1BX0ggKi8KZGlmZiAtLWdpdCBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9JbmMvc3RtMzJnNHh4X2hhbF9kbWFfZXguaCBiL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9JbmMvc3RtMzJnNHh4X2hhbF9kbWFfZXguaAppbmRleCA0MjBlM2QwLi42Y2FiZmRhIDEwMDY0NAotLS0gYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9oYWxfZG1hX2V4LmgKKysrIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfaGFsX2RtYV9leC5oCkBAIC0xLDMxOCArMSwzMTggQEAKLS8qKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBAZmlsZSAgICBzdG0zMmc0eHhfaGFsX2RtYV9leC5oDQotICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0NCi0gKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBETUEgSEFMIGV4dGVuc2lvbiBtb2R1bGUuDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEBhdHRlbnRpb24NCi0gKg0KLSAqIENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4NCi0gKg0KLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGVybXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZQ0KLSAqIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4NCi0gKiBJZiBubyBMSUNFTlNFIGZpbGUgY29tZXMgd2l0aCB0aGlzIHNvZnR3YXJlLCBpdCBpcyBwcm92aWRlZCBBUy1JUy4NCi0gKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKi8NCi0NCi0vKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpZm5kZWYgX19TVE0zMkc0eHhfSEFMX0RNQV9FWF9IDQotI2RlZmluZSBfX1NUTTMyRzR4eF9IQUxfRE1BX0VYX0gNCi0NCi0jaWZkZWYgX19jcGx1c3BsdXMNCi1leHRlcm4gIkMiIHsNCi0jZW5kaWYNCi0NCi0vKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpbmNsdWRlICJzdG0zMmc0eHhfaGFsX2RlZi5oIg0KLQ0KLS8qKiBAYWRkdG9ncm91cCBTVE0zMkc0eHhfSEFMX0RyaXZlcg0KLSAqIEB7DQotICovDQotDQotLyoqIEBhZGR0b2dyb3VwIERNQUV4DQotICogQHsNCi0gKi8NCi0NCi0vKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgRE1BRXhfRXhwb3J0ZWRfVHlwZXMgRE1BRXggRXhwb3J0ZWQgVHlwZXMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSEFMIERNQSBTeW5jaHJvIGRlZmluaXRpb24NCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEhBTCBETUFNVVggU3luY2hyb25pemF0aW9uIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlIGRlZmluaXRpb24NCi0gKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICB1aW50MzJfdA0KLSAgICAgIFN5bmNTaWduYWxJRDsgLyohPCBTcGVjaWZpZXMgdGhlIHN5bmNocm9uaXphdGlvbiBzaWduYWwgZ2F0aW5nIHRoZSBETUENCi0gICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgaW4gcGVyaW9kaWMgbW9kZS4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUNCi0gICAgICAgICAgICAgICAgICAgICAgIG9mIEByZWYgRE1BRXhfRE1BTVVYX1N5bmNTaWduYWxJRF9zZWxlY3Rpb24gKi8NCi0NCi0gIHVpbnQzMl90IFN5bmNQb2xhcml0eTsgLyohPCBTcGVjaWZpZXMgdGhlIHBvbGFyaXR5IG9mIHRoZSBzaWduYWwgb24gd2hpY2ggdGhlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERNQSByZXF1ZXN0IGlzIHN5bmNocm9uaXplZC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGENCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgb2YgQHJlZiBETUFFeF9ETUFNVVhfU3luY1BvbGFyaXR5X3NlbGVjdGlvbiAqLw0KLQ0KLSAgRnVuY3Rpb25hbFN0YXRlIFN5bmNFbmFibGU7IC8qITwgU3BlY2lmaWVzIGlmIHRoZSBzeW5jaHJvbml6YXRpb24gc2hhbGwgYmUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkIG9yIGRpc2FibGVkIFRoaXMgcGFyYW1ldGVyIGNhbiB0YWtlIHRoZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIEVOQUJMRSBvciBESVNBQkxFKi8NCi0NCi0gIEZ1bmN0aW9uYWxTdGF0ZQ0KLSAgICAgIEV2ZW50RW5hYmxlOyAvKiE8IFNwZWNpZmllcyBpZiBhbiBldmVudCBzaGFsbCBiZSBnZW5lcmF0ZWQgb25jZSB0aGUNCi0gICAgICAgICAgICAgICAgICAgICAgUmVxdWVzdE51bWJlciBpcyByZWFjaGVkLiBUaGlzIHBhcmFtZXRlciBjYW4gdGFrZSB0aGUNCi0gICAgICAgICAgICAgICAgICAgICAgdmFsdWUgRU5BQkxFIG9yIERJU0FCTEUgKi8NCi0NCi0gIHVpbnQzMl90DQotICAgICAgUmVxdWVzdE51bWJlcjsgLyohPCBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBETUEgcmVxdWVzdCB0aGF0IHdpbGwgYmUNCi0gICAgICAgICAgICAgICAgICAgICAgICBhdXRob3JpemVkIGFmdGVyIGEgc3luYyBldmVudCBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGENCi0gICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDEgYW5kIE1heF9EYXRhID0gMzIgKi8NCi0NCi19IEhBTF9ETUFfTXV4U3luY0NvbmZpZ1R5cGVEZWY7DQotDQotLyoqDQotICogQGJyaWVmICBIQUwgRE1BTVVYIHJlcXVlc3QgZ2VuZXJhdG9yIHBhcmFtZXRlcnMgc3RydWN0dXJlIGRlZmluaXRpb24NCi0gKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICB1aW50MzJfdCBTaWduYWxJRDsgLyohPCBTcGVjaWZpZXMgdGhlIElEIG9mIHRoZSBzaWduYWwgdXNlZCBmb3IgRE1BTVVYIHJlcXVlc3QNCi0gICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0b3IgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgIERNQUV4X0RNQU1VWF9TaWduYWxHZW5lcmF0b3JJRF9zZWxlY3Rpb24gKi8NCi0NCi0gIHVpbnQzMl90IFBvbGFyaXR5OyAvKiE8IFNwZWNpZmllcyB0aGUgcG9sYXJpdHkgb2YgdGhlIHNpZ25hbCBvbiB3aGljaCB0aGUNCi0gICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgaXMgZ2VuZXJhdGVkLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZg0KLSAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBETUFFeF9ETUFNVVhfUmVxdWVzdEdlbmVuZXJhdG9yUG9sYXJpdHlfc2VsZWN0aW9uICovDQotDQotICB1aW50MzJfdA0KLSAgICAgIFJlcXVlc3ROdW1iZXI7IC8qITwgU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgRE1BIHJlcXVlc3QgdGhhdCB3aWxsIGJlDQotICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkIGFmdGVyIGEgc2lnbmFsIGV2ZW50IFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMSBhbmQgTWF4X0RhdGEgPSAzMiAqLw0KLQ0KLX0gSEFMX0RNQV9NdXhSZXF1ZXN0R2VuZXJhdG9yQ29uZmlnVHlwZURlZjsNCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBkZWZncm91cCBETUFFeF9FeHBvcnRlZF9Db25zdGFudHMgRE1BRXggRXhwb3J0ZWQgQ29uc3RhbnRzDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIERNQUV4X0RNQU1VWF9TeW5jU2lnbmFsSURfc2VsZWN0aW9uIERNQU1VWCBTeW5jU2lnbmFsSUQgc2VsZWN0aW9uDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIEhBTF9ETUFNVVgxX1NZTkNfRVhUSTAgMFUgLyohPCAgU3luY2hyb25pemF0aW9uIFNpZ25hbCBpcyBFWFRJMCAgSVQgKi8NCi0jZGVmaW5lIEhBTF9ETUFNVVgxX1NZTkNfRVhUSTEgMVUgLyohPCAgU3luY2hyb25pemF0aW9uIFNpZ25hbCBpcyBFWFRJMSAgSVQgKi8NCi0jZGVmaW5lIEhBTF9ETUFNVVgxX1NZTkNfRVhUSTIgMlUgLyohPCAgU3luY2hyb25pemF0aW9uIFNpZ25hbCBpcyBFWFRJMiAgSVQgKi8NCi0jZGVmaW5lIEhBTF9ETUFNVVgxX1NZTkNfRVhUSTMgM1UgLyohPCAgU3luY2hyb25pemF0aW9uIFNpZ25hbCBpcyBFWFRJMyAgSVQgKi8NCi0jZGVmaW5lIEhBTF9ETUFNVVgxX1NZTkNfRVhUSTQgNFUgLyohPCAgU3luY2hyb25pemF0aW9uIFNpZ25hbCBpcyBFWFRJNCAgSVQgKi8NCi0jZGVmaW5lIEhBTF9ETUFNVVgxX1NZTkNfRVhUSTUgNVUgLyohPCAgU3luY2hyb25pemF0aW9uIFNpZ25hbCBpcyBFWFRJNSAgSVQgKi8NCi0jZGVmaW5lIEhBTF9ETUFNVVgxX1NZTkNfRVhUSTYgNlUgLyohPCAgU3luY2hyb25pemF0aW9uIFNpZ25hbCBpcyBFWFRJNiAgSVQgKi8NCi0jZGVmaW5lIEhBTF9ETUFNVVgxX1NZTkNfRVhUSTcgN1UgLyohPCAgU3luY2hyb25pemF0aW9uIFNpZ25hbCBpcyBFWFRJNyAgSVQgKi8NCi0jZGVmaW5lIEhBTF9ETUFNVVgxX1NZTkNfRVhUSTggOFUgLyohPCAgU3luY2hyb25pemF0aW9uIFNpZ25hbCBpcyBFWFRJOCAgSVQgKi8NCi0jZGVmaW5lIEhBTF9ETUFNVVgxX1NZTkNfRVhUSTkgOVUgLyohPCAgU3luY2hyb25pemF0aW9uIFNpZ25hbCBpcyBFWFRJOSAgSVQgKi8NCi0jZGVmaW5lIEhBTF9ETUFNVVgxX1NZTkNfRVhUSTEwIFwNCi0gIDEwVSAvKiE8ICBTeW5jaHJvbml6YXRpb24gU2lnbmFsIGlzIEVYVEkxMCBJVCAgICovDQotI2RlZmluZSBIQUxfRE1BTVVYMV9TWU5DX0VYVEkxMSBcDQotICAxMVUgLyohPCAgU3luY2hyb25pemF0aW9uIFNpZ25hbCBpcyBFWFRJMTEgSVQgICAqLw0KLSNkZWZpbmUgSEFMX0RNQU1VWDFfU1lOQ19FWFRJMTIgXA0KLSAgMTJVIC8qITwgIFN5bmNocm9uaXphdGlvbiBTaWduYWwgaXMgRVhUSTEyIElUICAgKi8NCi0jZGVmaW5lIEhBTF9ETUFNVVgxX1NZTkNfRVhUSTEzIFwNCi0gIDEzVSAvKiE8ICBTeW5jaHJvbml6YXRpb24gU2lnbmFsIGlzIEVYVEkxMyBJVCAgICovDQotI2RlZmluZSBIQUxfRE1BTVVYMV9TWU5DX0VYVEkxNCBcDQotICAxNFUgLyohPCAgU3luY2hyb25pemF0aW9uIFNpZ25hbCBpcyBFWFRJMTQgSVQgICAqLw0KLSNkZWZpbmUgSEFMX0RNQU1VWDFfU1lOQ19FWFRJMTUgXA0KLSAgMTVVIC8qITwgIFN5bmNocm9uaXphdGlvbiBTaWduYWwgaXMgRVhUSTE1IElUICAgKi8NCi0jZGVmaW5lIEhBTF9ETUFNVVgxX1NZTkNfRE1BTVVYMV9DSDBfRVZUIFwNCi0gIDE2VSAvKiE8ICBTeW5jaHJvbml6YXRpb24gU2lnbmFsIGlzIERNQU1VWDEgQ2hhbm5lbDAgRXZlbnQgICovDQotI2RlZmluZSBIQUxfRE1BTVVYMV9TWU5DX0RNQU1VWDFfQ0gxX0VWVCBcDQotICAxN1UgLyohPCAgU3luY2hyb25pemF0aW9uIFNpZ25hbCBpcyBETUFNVVgxIENoYW5uZWwxIEV2ZW50ICAqLw0KLSNkZWZpbmUgSEFMX0RNQU1VWDFfU1lOQ19ETUFNVVgxX0NIMl9FVlQgXA0KLSAgMThVIC8qITwgIFN5bmNocm9uaXphdGlvbiBTaWduYWwgaXMgRE1BTVVYMSBDaGFubmVsMiBFdmVudCAgKi8NCi0jZGVmaW5lIEhBTF9ETUFNVVgxX1NZTkNfRE1BTVVYMV9DSDNfRVZUIFwNCi0gIDE5VSAvKiE8ICBTeW5jaHJvbml6YXRpb24gU2lnbmFsIGlzIERNQU1VWDEgQ2hhbm5lbDMgRXZlbnQgICovDQotI2RlZmluZSBIQUxfRE1BTVVYMV9TWU5DX0xQVElNMV9PVVQgXA0KLSAgMjBVIC8qITwgIFN5bmNocm9uaXphdGlvbiBTaWduYWwgaXMgTFBUSU0xIE9VVCAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBETUFFeF9ETUFNVVhfU3luY1BvbGFyaXR5X3NlbGVjdGlvbiBETUFNVVggU3luY1BvbGFyaXR5IHNlbGVjdGlvbg0KLSAqIEB7DQotICovDQotI2RlZmluZSBIQUxfRE1BTVVYX1NZTkNfTk9fRVZFTlQgMFUgLyohPCBibG9jayBzeW5jaHJvbml6YXRpb24gZXZlbnRzICovDQotI2RlZmluZSBIQUxfRE1BTVVYX1NZTkNfUklTSU5HIFwNCi0gICgodWludDMyX3QpRE1BTVVYX0N4Q1JfU1BPTF8wKSAvKiE8IHN5bmNocm9uaXplIHdpdGggcmlzaW5nIGVkZ2UgZXZlbnRzICovDQotI2RlZmluZSBIQUxfRE1BTVVYX1NZTkNfRkFMTElORyBcDQotICAoKHVpbnQzMl90KURNQU1VWF9DeENSX1NQT0xfMSkgLyohPCBzeW5jaHJvbml6ZSB3aXRoIGZhbGxpbmcgZWRnZSBldmVudHMgKi8NCi0jZGVmaW5lIEhBTF9ETUFNVVhfU1lOQ19SSVNJTkdfRkFMTElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgodWludDMyX3QpRE1BTVVYX0N4Q1JfU1BPTCkgLyohPCBzeW5jaHJvbml6ZSB3aXRoIHJpc2luZyBhbmQgZmFsbGluZyBlZGdlIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIERNQUV4X0RNQU1VWF9TaWduYWxHZW5lcmF0b3JJRF9zZWxlY3Rpb24gRE1BTVVYIFNpZ25hbEdlbmVyYXRvcklEDQotICogc2VsZWN0aW9uDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTAgXA0KLSAgMFUgLyohPCBSZXF1ZXN0IGdlbmVyYXRvciBTaWduYWwgaXMgRVhUSTAgSVQgICAgKi8NCi0jZGVmaW5lIEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTEgXA0KLSAgMVUgLyohPCBSZXF1ZXN0IGdlbmVyYXRvciBTaWduYWwgaXMgRVhUSTEgSVQgICAgKi8NCi0jZGVmaW5lIEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTIgXA0KLSAgMlUgLyohPCBSZXF1ZXN0IGdlbmVyYXRvciBTaWduYWwgaXMgRVhUSTIgSVQgICAgKi8NCi0jZGVmaW5lIEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTMgXA0KLSAgM1UgLyohPCBSZXF1ZXN0IGdlbmVyYXRvciBTaWduYWwgaXMgRVhUSTMgSVQgICAgKi8NCi0jZGVmaW5lIEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTQgXA0KLSAgNFUgLyohPCBSZXF1ZXN0IGdlbmVyYXRvciBTaWduYWwgaXMgRVhUSTQgSVQgICAgKi8NCi0jZGVmaW5lIEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTUgXA0KLSAgNVUgLyohPCBSZXF1ZXN0IGdlbmVyYXRvciBTaWduYWwgaXMgRVhUSTUgSVQgICAgKi8NCi0jZGVmaW5lIEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTYgXA0KLSAgNlUgLyohPCBSZXF1ZXN0IGdlbmVyYXRvciBTaWduYWwgaXMgRVhUSTYgSVQgICAgKi8NCi0jZGVmaW5lIEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTcgXA0KLSAgN1UgLyohPCBSZXF1ZXN0IGdlbmVyYXRvciBTaWduYWwgaXMgRVhUSTcgSVQgICAgKi8NCi0jZGVmaW5lIEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTggXA0KLSAgOFUgLyohPCBSZXF1ZXN0IGdlbmVyYXRvciBTaWduYWwgaXMgRVhUSTggSVQgICAgKi8NCi0jZGVmaW5lIEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTkgXA0KLSAgOVUgLyohPCBSZXF1ZXN0IGdlbmVyYXRvciBTaWduYWwgaXMgRVhUSTkgSVQgICAgKi8NCi0jZGVmaW5lIEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTEwIFwNCi0gIDEwVSAvKiE8IFJlcXVlc3QgZ2VuZXJhdG9yIFNpZ25hbCBpcyBFWFRJMTAgSVQgICAqLw0KLSNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRX0dFTl9FWFRJMTEgXA0KLSAgMTFVIC8qITwgUmVxdWVzdCBnZW5lcmF0b3IgU2lnbmFsIGlzIEVYVEkxMSBJVCAgICovDQotI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEkxMiBcDQotICAxMlUgLyohPCBSZXF1ZXN0IGdlbmVyYXRvciBTaWduYWwgaXMgRVhUSTEyIElUICAgKi8NCi0jZGVmaW5lIEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTEzIFwNCi0gIDEzVSAvKiE8IFJlcXVlc3QgZ2VuZXJhdG9yIFNpZ25hbCBpcyBFWFRJMTMgSVQgICAqLw0KLSNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRX0dFTl9FWFRJMTQgXA0KLSAgMTRVIC8qITwgUmVxdWVzdCBnZW5lcmF0b3IgU2lnbmFsIGlzIEVYVEkxNCBJVCAgICovDQotI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEkxNSBcDQotICAxNVUgLyohPCBSZXF1ZXN0IGdlbmVyYXRvciBTaWduYWwgaXMgRVhUSTE1IElUICAgKi8NCi0jZGVmaW5lIEhBTF9ETUFNVVgxX1JFUV9HRU5fRE1BTVVYMV9DSDBfRVZUIFwNCi0gIDE2VSAvKiE8IFJlcXVlc3QgZ2VuZXJhdG9yIFNpZ25hbCBpcyBETUFNVVgxIENoYW5uZWwwIEV2ZW50ICovDQotI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFfR0VOX0RNQU1VWDFfQ0gxX0VWVCBcDQotICAxN1UgLyohPCBSZXF1ZXN0IGdlbmVyYXRvciBTaWduYWwgaXMgRE1BTVVYMSBDaGFubmVsMSBFdmVudCAqLw0KLSNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRX0dFTl9ETUFNVVgxX0NIMl9FVlQgXA0KLSAgMThVIC8qITwgUmVxdWVzdCBnZW5lcmF0b3IgU2lnbmFsIGlzIERNQU1VWDEgQ2hhbm5lbDIgRXZlbnQgKi8NCi0jZGVmaW5lIEhBTF9ETUFNVVgxX1JFUV9HRU5fRE1BTVVYMV9DSDNfRVZUIFwNCi0gIDE5VSAvKiE8IFJlcXVlc3QgZ2VuZXJhdG9yIFNpZ25hbCBpcyBETUFNVVgxIENoYW5uZWwzIEV2ZW50ICovDQotI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFfR0VOX0xQVElNMV9PVVQgXA0KLSAgMjBVIC8qITwgUmVxdWVzdCBnZW5lcmF0b3IgU2lnbmFsIGlzIExQVElNMSBPVVQgICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIERNQUV4X0RNQU1VWF9SZXF1ZXN0R2VuZW5lcmF0b3JQb2xhcml0eV9zZWxlY3Rpb24gRE1BTVVYDQotICogUmVxdWVzdEdlbmVuZXJhdG9yUG9sYXJpdHkgc2VsZWN0aW9uDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIEhBTF9ETUFNVVhfUkVRX0dFTl9OT19FVkVOVCBcDQotICAweDAwMDAwMDAwVSAvKiE8IGJsb2NrIHJlcXVlc3QgZ2VuZXJhdG9yIGV2ZW50cyAgICAgICAgKi8NCi0jZGVmaW5lIEhBTF9ETUFNVVhfUkVRX0dFTl9SSVNJTkcgXA0KLSAgRE1BTVVYX1JHeENSX0dQT0xfMCAvKiE8IGdlbmVyYXRlIHJlcXVlc3Qgb24gcmlzaW5nIGVkZ2UgZXZlbnRzICovDQotI2RlZmluZSBIQUxfRE1BTVVYX1JFUV9HRU5fRkFMTElORyBcDQotICBETUFNVVhfUkd4Q1JfR1BPTF8xIC8qITwgZ2VuZXJhdGUgcmVxdWVzdCBvbiBmYWxsaW5nIGVkZ2UgZXZlbnRzICovDQotI2RlZmluZSBIQUxfRE1BTVVYX1JFUV9HRU5fUklTSU5HX0ZBTExJTkcgXA0KLSAgRE1BTVVYX1JHeENSX0dQT0wgLyohPCBnZW5lcmF0ZSByZXF1ZXN0IG9uIHJpc2luZyBhbmQgZmFsbGluZyBlZGdlIGV2ZW50cyAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLQ0KLS8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBhZGR0b2dyb3VwIERNQUV4X0V4cG9ydGVkX0Z1bmN0aW9ucw0KLSAqIEB7DQotICovDQotDQotLyogSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKiogQGFkZHRvZ3JvdXAgRE1BRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMQ0KLSAqIEB7DQotICovDQotDQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSRVFVRVNUIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BRXhfQ29uZmlnTXV4UmVxdWVzdEdlbmVyYXRvcigNCi0gICAgRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEsDQotICAgIEhBTF9ETUFfTXV4UmVxdWVzdEdlbmVyYXRvckNvbmZpZ1R5cGVEZWYgKnBSZXF1ZXN0R2VuZXJhdG9yQ29uZmlnKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BRXhfRW5hYmxlTXV4UmVxdWVzdEdlbmVyYXRvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RNQUV4X0Rpc2FibGVNdXhSZXF1ZXN0R2VuZXJhdG9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsNCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLQ0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU1lOQ0hSTyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RNQUV4X0NvbmZpZ011eFN5bmMoDQotICAgIERNQV9IYW5kbGVUeXBlRGVmICpoZG1hLCBIQUxfRE1BX011eFN5bmNDb25maWdUeXBlRGVmICpwU3luY0NvbmZpZyk7DQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi0NCi12b2lkIEhBTF9ETUFFeF9NVVhfSVJRSGFuZGxlcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBkZWZncm91cCBETUFFeF9Qcml2YXRlX01hY3JvcyBETUFFeCBQcml2YXRlIE1hY3Jvcw0KLSAqIEBicmllZiAgICBETUFFeCBwcml2YXRlIG1hY3Jvcw0KLSAqIEB7DQotICovDQotDQotI2RlZmluZSBJU19ETUFNVVhfU1lOQ19TSUdOQUxfSUQoU0lHTkFMX0lEKSBcDQotICAoKFNJR05BTF9JRCkgPD0gSEFMX0RNQU1VWDFfU1lOQ19MUFRJTTFfT1VUKQ0KLQ0KLSNkZWZpbmUgSVNfRE1BTVVYX1NZTkNfUkVRVUVTVF9OVU1CRVIoUkVRVUVTVF9OVU1CRVIpIFwNCi0gICgoKFJFUVVFU1RfTlVNQkVSKSA+IDBVKSAmJiAoKFJFUVVFU1RfTlVNQkVSKSA8PSAzMlUpKQ0KLQ0KLSNkZWZpbmUgSVNfRE1BTVVYX1NZTkNfUE9MQVJJVFkoUE9MQVJJVFkpICAgICAgXA0KLSAgKCgoUE9MQVJJVFkpID09IEhBTF9ETUFNVVhfU1lOQ19OT19FVkVOVCkgfHwgXA0KLSAgICgoUE9MQVJJVFkpID09IEhBTF9ETUFNVVhfU1lOQ19SSVNJTkcpIHx8ICAgXA0KLSAgICgoUE9MQVJJVFkpID09IEhBTF9ETUFNVVhfU1lOQ19GQUxMSU5HKSB8fCAgXA0KLSAgICgoUE9MQVJJVFkpID09IEhBTF9ETUFNVVhfU1lOQ19SSVNJTkdfRkFMTElORykpDQotDQotI2RlZmluZSBJU19ETUFNVVhfU1lOQ19TVEFURShTWU5DKSAoKChTWU5DKSA9PSBESVNBQkxFKSB8fCAoKFNZTkMpID09IEVOQUJMRSkpDQotDQotI2RlZmluZSBJU19ETUFNVVhfU1lOQ19FVkVOVChFVkVOVCkgXA0KLSAgKCgoRVZFTlQpID09IERJU0FCTEUpIHx8ICgoRVZFTlQpID09IEVOQUJMRSkpDQotDQotI2RlZmluZSBJU19ETUFNVVhfUkVRVUVTVF9HRU5fU0lHTkFMX0lEKFNJR05BTF9JRCkgXA0KLSAgKChTSUdOQUxfSUQpIDw9IEhBTF9ETUFNVVgxX1JFUV9HRU5fTFBUSU0xX09VVCkNCi0NCi0jZGVmaW5lIElTX0RNQU1VWF9SRVFVRVNUX0dFTl9SRVFVRVNUX05VTUJFUihSRVFVRVNUX05VTUJFUikgXA0KLSAgKCgoUkVRVUVTVF9OVU1CRVIpID4gMFUpICYmICgoUkVRVUVTVF9OVU1CRVIpIDw9IDMyVSkpDQotDQotI2RlZmluZSBJU19ETUFNVVhfUkVRVUVTVF9HRU5fUE9MQVJJVFkoUE9MQVJJVFkpICBcDQotICAoKChQT0xBUklUWSkgPT0gSEFMX0RNQU1VWF9SRVFfR0VOX05PX0VWRU5UKSB8fCBcDQotICAgKChQT0xBUklUWSkgPT0gSEFMX0RNQU1VWF9SRVFfR0VOX1JJU0lORykgfHwgICBcDQotICAgKChQT0xBUklUWSkgPT0gSEFMX0RNQU1VWF9SRVFfR0VOX0ZBTExJTkcpIHx8ICBcDQotICAgKChQT0xBUklUWSkgPT0gSEFMX0RNQU1VWF9SRVFfR0VOX1JJU0lOR19GQUxMSU5HKSkNCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0jaWZkZWYgX19jcGx1c3BsdXMNCi19DQotI2VuZGlmDQotDQotI2VuZGlmIC8qIF9fU1RNMzJHNHh4X0hBTF9ETUFfRVhfSCAqLw0KKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGZpbGUgICAgc3RtMzJnNHh4X2hhbF9kbWFfZXguaAorICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIERNQSBIQUwgZXh0ZW5zaW9uIG1vZHVsZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBhdHRlbnRpb24KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRlcm1zIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUKKyAqIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4KKyAqIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcyB3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBfX1NUTTMyRzR4eF9IQUxfRE1BX0VYX0gKKyNkZWZpbmUgX19TVE0zMkc0eHhfSEFMX0RNQV9FWF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmc0eHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHNHh4X0hBTF9Ecml2ZXIKKyAqIEB7CisgKi8KKworLyoqIEBhZGR0b2dyb3VwIERNQUV4CisgKiBAeworICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIERNQUV4X0V4cG9ydGVkX1R5cGVzIERNQUV4IEV4cG9ydGVkIFR5cGVzCisgKiBAeworICovCisKKy8qKgorICogQGJyaWVmICBIQUwgRE1BIFN5bmNocm8gZGVmaW5pdGlvbgorICovCisKKy8qKgorICogQGJyaWVmICBIQUwgRE1BTVVYIFN5bmNocm9uaXphdGlvbiBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDMyX3QKKyAgICAgIFN5bmNTaWduYWxJRDsgLyohPCBTcGVjaWZpZXMgdGhlIHN5bmNocm9uaXphdGlvbiBzaWduYWwgZ2F0aW5nIHRoZSBETUEKKyAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCBpbiBwZXJpb2RpYyBtb2RlLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICBvZiBAcmVmIERNQUV4X0RNQU1VWF9TeW5jU2lnbmFsSURfc2VsZWN0aW9uICovCisKKyAgdWludDMyX3QgU3luY1BvbGFyaXR5OyAvKiE8IFNwZWNpZmllcyB0aGUgcG9sYXJpdHkgb2YgdGhlIHNpZ25hbCBvbiB3aGljaCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBETUEgcmVxdWVzdCBpcyBzeW5jaHJvbml6ZWQuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgb2YgQHJlZiBETUFFeF9ETUFNVVhfU3luY1BvbGFyaXR5X3NlbGVjdGlvbiAqLworCisgIEZ1bmN0aW9uYWxTdGF0ZSBTeW5jRW5hYmxlOyAvKiE8IFNwZWNpZmllcyBpZiB0aGUgc3luY2hyb25pemF0aW9uIHNoYWxsIGJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkIG9yIGRpc2FibGVkIFRoaXMgcGFyYW1ldGVyIGNhbiB0YWtlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgRU5BQkxFIG9yIERJU0FCTEUqLworCisgIEZ1bmN0aW9uYWxTdGF0ZQorICAgICAgRXZlbnRFbmFibGU7IC8qITwgU3BlY2lmaWVzIGlmIGFuIGV2ZW50IHNoYWxsIGJlIGdlbmVyYXRlZCBvbmNlIHRoZQorICAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3ROdW1iZXIgaXMgcmVhY2hlZC4gVGhpcyBwYXJhbWV0ZXIgY2FuIHRha2UgdGhlCisgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgRU5BQkxFIG9yIERJU0FCTEUgKi8KKworICB1aW50MzJfdAorICAgICAgUmVxdWVzdE51bWJlcjsgLyohPCBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBETUEgcmVxdWVzdCB0aGF0IHdpbGwgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhvcml6ZWQgYWZ0ZXIgYSBzeW5jIGV2ZW50IFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYQorICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAxIGFuZCBNYXhfRGF0YSA9IDMyICovCisKK30gSEFMX0RNQV9NdXhTeW5jQ29uZmlnVHlwZURlZjsKKworLyoqCisgKiBAYnJpZWYgIEhBTCBETUFNVVggcmVxdWVzdCBnZW5lcmF0b3IgcGFyYW1ldGVycyBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQzMl90IFNpZ25hbElEOyAvKiE8IFNwZWNpZmllcyB0aGUgSUQgb2YgdGhlIHNpZ25hbCB1c2VkIGZvciBETUFNVVggcmVxdWVzdAorICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdG9yIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgIERNQUV4X0RNQU1VWF9TaWduYWxHZW5lcmF0b3JJRF9zZWxlY3Rpb24gKi8KKworICB1aW50MzJfdCBQb2xhcml0eTsgLyohPCBTcGVjaWZpZXMgdGhlIHBvbGFyaXR5IG9mIHRoZSBzaWduYWwgb24gd2hpY2ggdGhlCisgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgaXMgZ2VuZXJhdGVkLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZgorICAgICAgICAgICAgICAgICAgICAgICBAcmVmIERNQUV4X0RNQU1VWF9SZXF1ZXN0R2VuZW5lcmF0b3JQb2xhcml0eV9zZWxlY3Rpb24gKi8KKworICB1aW50MzJfdAorICAgICAgUmVxdWVzdE51bWJlcjsgLyohPCBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBETUEgcmVxdWVzdCB0aGF0IHdpbGwgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZCBhZnRlciBhIHNpZ25hbCBldmVudCBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMSBhbmQgTWF4X0RhdGEgPSAzMiAqLworCit9IEhBTF9ETUFfTXV4UmVxdWVzdEdlbmVyYXRvckNvbmZpZ1R5cGVEZWY7CisKKy8qKgorICogQH0KKyAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBETUFFeF9FeHBvcnRlZF9Db25zdGFudHMgRE1BRXggRXhwb3J0ZWQgQ29uc3RhbnRzCisgKiBAeworICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BRXhfRE1BTVVYX1N5bmNTaWduYWxJRF9zZWxlY3Rpb24gRE1BTVVYIFN5bmNTaWduYWxJRCBzZWxlY3Rpb24KKyAqIEB7CisgKi8KKyNkZWZpbmUgSEFMX0RNQU1VWDFfU1lOQ19FWFRJMCAwVSAvKiE8ICBTeW5jaHJvbml6YXRpb24gU2lnbmFsIGlzIEVYVEkwICBJVCAqLworI2RlZmluZSBIQUxfRE1BTVVYMV9TWU5DX0VYVEkxIDFVIC8qITwgIFN5bmNocm9uaXphdGlvbiBTaWduYWwgaXMgRVhUSTEgIElUICovCisjZGVmaW5lIEhBTF9ETUFNVVgxX1NZTkNfRVhUSTIgMlUgLyohPCAgU3luY2hyb25pemF0aW9uIFNpZ25hbCBpcyBFWFRJMiAgSVQgKi8KKyNkZWZpbmUgSEFMX0RNQU1VWDFfU1lOQ19FWFRJMyAzVSAvKiE8ICBTeW5jaHJvbml6YXRpb24gU2lnbmFsIGlzIEVYVEkzICBJVCAqLworI2RlZmluZSBIQUxfRE1BTVVYMV9TWU5DX0VYVEk0IDRVIC8qITwgIFN5bmNocm9uaXphdGlvbiBTaWduYWwgaXMgRVhUSTQgIElUICovCisjZGVmaW5lIEhBTF9ETUFNVVgxX1NZTkNfRVhUSTUgNVUgLyohPCAgU3luY2hyb25pemF0aW9uIFNpZ25hbCBpcyBFWFRJNSAgSVQgKi8KKyNkZWZpbmUgSEFMX0RNQU1VWDFfU1lOQ19FWFRJNiA2VSAvKiE8ICBTeW5jaHJvbml6YXRpb24gU2lnbmFsIGlzIEVYVEk2ICBJVCAqLworI2RlZmluZSBIQUxfRE1BTVVYMV9TWU5DX0VYVEk3IDdVIC8qITwgIFN5bmNocm9uaXphdGlvbiBTaWduYWwgaXMgRVhUSTcgIElUICovCisjZGVmaW5lIEhBTF9ETUFNVVgxX1NZTkNfRVhUSTggOFUgLyohPCAgU3luY2hyb25pemF0aW9uIFNpZ25hbCBpcyBFWFRJOCAgSVQgKi8KKyNkZWZpbmUgSEFMX0RNQU1VWDFfU1lOQ19FWFRJOSA5VSAvKiE8ICBTeW5jaHJvbml6YXRpb24gU2lnbmFsIGlzIEVYVEk5ICBJVCAqLworI2RlZmluZSBIQUxfRE1BTVVYMV9TWU5DX0VYVEkxMCBcCisgIDEwVSAvKiE8ICBTeW5jaHJvbml6YXRpb24gU2lnbmFsIGlzIEVYVEkxMCBJVCAgICovCisjZGVmaW5lIEhBTF9ETUFNVVgxX1NZTkNfRVhUSTExIFwKKyAgMTFVIC8qITwgIFN5bmNocm9uaXphdGlvbiBTaWduYWwgaXMgRVhUSTExIElUICAgKi8KKyNkZWZpbmUgSEFMX0RNQU1VWDFfU1lOQ19FWFRJMTIgXAorICAxMlUgLyohPCAgU3luY2hyb25pemF0aW9uIFNpZ25hbCBpcyBFWFRJMTIgSVQgICAqLworI2RlZmluZSBIQUxfRE1BTVVYMV9TWU5DX0VYVEkxMyBcCisgIDEzVSAvKiE8ICBTeW5jaHJvbml6YXRpb24gU2lnbmFsIGlzIEVYVEkxMyBJVCAgICovCisjZGVmaW5lIEhBTF9ETUFNVVgxX1NZTkNfRVhUSTE0IFwKKyAgMTRVIC8qITwgIFN5bmNocm9uaXphdGlvbiBTaWduYWwgaXMgRVhUSTE0IElUICAgKi8KKyNkZWZpbmUgSEFMX0RNQU1VWDFfU1lOQ19FWFRJMTUgXAorICAxNVUgLyohPCAgU3luY2hyb25pemF0aW9uIFNpZ25hbCBpcyBFWFRJMTUgSVQgICAqLworI2RlZmluZSBIQUxfRE1BTVVYMV9TWU5DX0RNQU1VWDFfQ0gwX0VWVCBcCisgIDE2VSAvKiE8ICBTeW5jaHJvbml6YXRpb24gU2lnbmFsIGlzIERNQU1VWDEgQ2hhbm5lbDAgRXZlbnQgICovCisjZGVmaW5lIEhBTF9ETUFNVVgxX1NZTkNfRE1BTVVYMV9DSDFfRVZUIFwKKyAgMTdVIC8qITwgIFN5bmNocm9uaXphdGlvbiBTaWduYWwgaXMgRE1BTVVYMSBDaGFubmVsMSBFdmVudCAgKi8KKyNkZWZpbmUgSEFMX0RNQU1VWDFfU1lOQ19ETUFNVVgxX0NIMl9FVlQgXAorICAxOFUgLyohPCAgU3luY2hyb25pemF0aW9uIFNpZ25hbCBpcyBETUFNVVgxIENoYW5uZWwyIEV2ZW50ICAqLworI2RlZmluZSBIQUxfRE1BTVVYMV9TWU5DX0RNQU1VWDFfQ0gzX0VWVCBcCisgIDE5VSAvKiE8ICBTeW5jaHJvbml6YXRpb24gU2lnbmFsIGlzIERNQU1VWDEgQ2hhbm5lbDMgRXZlbnQgICovCisjZGVmaW5lIEhBTF9ETUFNVVgxX1NZTkNfTFBUSU0xX09VVCBcCisgIDIwVSAvKiE8ICBTeW5jaHJvbml6YXRpb24gU2lnbmFsIGlzIExQVElNMSBPVVQgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BRXhfRE1BTVVYX1N5bmNQb2xhcml0eV9zZWxlY3Rpb24gRE1BTVVYIFN5bmNQb2xhcml0eSBzZWxlY3Rpb24KKyAqIEB7CisgKi8KKyNkZWZpbmUgSEFMX0RNQU1VWF9TWU5DX05PX0VWRU5UIDBVIC8qITwgYmxvY2sgc3luY2hyb25pemF0aW9uIGV2ZW50cyAqLworI2RlZmluZSBIQUxfRE1BTVVYX1NZTkNfUklTSU5HIFwKKyAgKCh1aW50MzJfdClETUFNVVhfQ3hDUl9TUE9MXzApIC8qITwgc3luY2hyb25pemUgd2l0aCByaXNpbmcgZWRnZSBldmVudHMgKi8KKyNkZWZpbmUgSEFMX0RNQU1VWF9TWU5DX0ZBTExJTkcgXAorICAoKHVpbnQzMl90KURNQU1VWF9DeENSX1NQT0xfMSkgLyohPCBzeW5jaHJvbml6ZSB3aXRoIGZhbGxpbmcgZWRnZSBldmVudHMgKi8KKyNkZWZpbmUgSEFMX0RNQU1VWF9TWU5DX1JJU0lOR19GQUxMSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKHVpbnQzMl90KURNQU1VWF9DeENSX1NQT0wpIC8qITwgc3luY2hyb25pemUgd2l0aCByaXNpbmcgYW5kIGZhbGxpbmcgZWRnZSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzICovCisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIERNQUV4X0RNQU1VWF9TaWduYWxHZW5lcmF0b3JJRF9zZWxlY3Rpb24gRE1BTVVYIFNpZ25hbEdlbmVyYXRvcklECisgKiBzZWxlY3Rpb24KKyAqIEB7CisgKi8KKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRX0dFTl9FWFRJMCBcCisgIDBVIC8qITwgUmVxdWVzdCBnZW5lcmF0b3IgU2lnbmFsIGlzIEVYVEkwIElUICAgICovCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTEgXAorICAxVSAvKiE8IFJlcXVlc3QgZ2VuZXJhdG9yIFNpZ25hbCBpcyBFWFRJMSBJVCAgICAqLworI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEkyIFwKKyAgMlUgLyohPCBSZXF1ZXN0IGdlbmVyYXRvciBTaWduYWwgaXMgRVhUSTIgSVQgICAgKi8KKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRX0dFTl9FWFRJMyBcCisgIDNVIC8qITwgUmVxdWVzdCBnZW5lcmF0b3IgU2lnbmFsIGlzIEVYVEkzIElUICAgICovCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTQgXAorICA0VSAvKiE8IFJlcXVlc3QgZ2VuZXJhdG9yIFNpZ25hbCBpcyBFWFRJNCBJVCAgICAqLworI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEk1IFwKKyAgNVUgLyohPCBSZXF1ZXN0IGdlbmVyYXRvciBTaWduYWwgaXMgRVhUSTUgSVQgICAgKi8KKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRX0dFTl9FWFRJNiBcCisgIDZVIC8qITwgUmVxdWVzdCBnZW5lcmF0b3IgU2lnbmFsIGlzIEVYVEk2IElUICAgICovCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTcgXAorICA3VSAvKiE8IFJlcXVlc3QgZ2VuZXJhdG9yIFNpZ25hbCBpcyBFWFRJNyBJVCAgICAqLworI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEk4IFwKKyAgOFUgLyohPCBSZXF1ZXN0IGdlbmVyYXRvciBTaWduYWwgaXMgRVhUSTggSVQgICAgKi8KKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRX0dFTl9FWFRJOSBcCisgIDlVIC8qITwgUmVxdWVzdCBnZW5lcmF0b3IgU2lnbmFsIGlzIEVYVEk5IElUICAgICovCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTEwIFwKKyAgMTBVIC8qITwgUmVxdWVzdCBnZW5lcmF0b3IgU2lnbmFsIGlzIEVYVEkxMCBJVCAgICovCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTExIFwKKyAgMTFVIC8qITwgUmVxdWVzdCBnZW5lcmF0b3IgU2lnbmFsIGlzIEVYVEkxMSBJVCAgICovCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTEyIFwKKyAgMTJVIC8qITwgUmVxdWVzdCBnZW5lcmF0b3IgU2lnbmFsIGlzIEVYVEkxMiBJVCAgICovCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTEzIFwKKyAgMTNVIC8qITwgUmVxdWVzdCBnZW5lcmF0b3IgU2lnbmFsIGlzIEVYVEkxMyBJVCAgICovCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTE0IFwKKyAgMTRVIC8qITwgUmVxdWVzdCBnZW5lcmF0b3IgU2lnbmFsIGlzIEVYVEkxNCBJVCAgICovCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTE1IFwKKyAgMTVVIC8qITwgUmVxdWVzdCBnZW5lcmF0b3IgU2lnbmFsIGlzIEVYVEkxNSBJVCAgICovCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUV9HRU5fRE1BTVVYMV9DSDBfRVZUIFwKKyAgMTZVIC8qITwgUmVxdWVzdCBnZW5lcmF0b3IgU2lnbmFsIGlzIERNQU1VWDEgQ2hhbm5lbDAgRXZlbnQgKi8KKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRX0dFTl9ETUFNVVgxX0NIMV9FVlQgXAorICAxN1UgLyohPCBSZXF1ZXN0IGdlbmVyYXRvciBTaWduYWwgaXMgRE1BTVVYMSBDaGFubmVsMSBFdmVudCAqLworI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFfR0VOX0RNQU1VWDFfQ0gyX0VWVCBcCisgIDE4VSAvKiE8IFJlcXVlc3QgZ2VuZXJhdG9yIFNpZ25hbCBpcyBETUFNVVgxIENoYW5uZWwyIEV2ZW50ICovCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUV9HRU5fRE1BTVVYMV9DSDNfRVZUIFwKKyAgMTlVIC8qITwgUmVxdWVzdCBnZW5lcmF0b3IgU2lnbmFsIGlzIERNQU1VWDEgQ2hhbm5lbDMgRXZlbnQgKi8KKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRX0dFTl9MUFRJTTFfT1VUIFwKKyAgMjBVIC8qITwgUmVxdWVzdCBnZW5lcmF0b3IgU2lnbmFsIGlzIExQVElNMSBPVVQgICovCisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIERNQUV4X0RNQU1VWF9SZXF1ZXN0R2VuZW5lcmF0b3JQb2xhcml0eV9zZWxlY3Rpb24gRE1BTVVYCisgKiBSZXF1ZXN0R2VuZW5lcmF0b3JQb2xhcml0eSBzZWxlY3Rpb24KKyAqIEB7CisgKi8KKyNkZWZpbmUgSEFMX0RNQU1VWF9SRVFfR0VOX05PX0VWRU5UIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBibG9jayByZXF1ZXN0IGdlbmVyYXRvciBldmVudHMgICAgICAgICovCisjZGVmaW5lIEhBTF9ETUFNVVhfUkVRX0dFTl9SSVNJTkcgXAorICBETUFNVVhfUkd4Q1JfR1BPTF8wIC8qITwgZ2VuZXJhdGUgcmVxdWVzdCBvbiByaXNpbmcgZWRnZSBldmVudHMgKi8KKyNkZWZpbmUgSEFMX0RNQU1VWF9SRVFfR0VOX0ZBTExJTkcgXAorICBETUFNVVhfUkd4Q1JfR1BPTF8xIC8qITwgZ2VuZXJhdGUgcmVxdWVzdCBvbiBmYWxsaW5nIGVkZ2UgZXZlbnRzICovCisjZGVmaW5lIEhBTF9ETUFNVVhfUkVRX0dFTl9SSVNJTkdfRkFMTElORyBcCisgIERNQU1VWF9SR3hDUl9HUE9MIC8qITwgZ2VuZXJhdGUgcmVxdWVzdCBvbiByaXNpbmcgYW5kIGZhbGxpbmcgZWRnZSBldmVudHMgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIERNQUV4X0V4cG9ydGVkX0Z1bmN0aW9ucworICogQHsKKyAqLworCisvKiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIEBhZGR0b2dyb3VwIERNQUV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEKKyAqIEB7CisgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSRVFVRVNUIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9ETUFFeF9Db25maWdNdXhSZXF1ZXN0R2VuZXJhdG9yKAorICAgIERNQV9IYW5kbGVUeXBlRGVmICpoZG1hLAorICAgIEhBTF9ETUFfTXV4UmVxdWVzdEdlbmVyYXRvckNvbmZpZ1R5cGVEZWYgKnBSZXF1ZXN0R2VuZXJhdG9yQ29uZmlnKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9ETUFFeF9FbmFibGVNdXhSZXF1ZXN0R2VuZXJhdG9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9ETUFFeF9EaXNhYmxlTXV4UmVxdWVzdEdlbmVyYXRvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNZTkNIUk8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RNQUV4X0NvbmZpZ011eFN5bmMoCisgICAgRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEsIEhBTF9ETUFfTXV4U3luY0NvbmZpZ1R5cGVEZWYgKnBTeW5jQ29uZmlnKTsKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQgSEFMX0RNQUV4X01VWF9JUlFIYW5kbGVyKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBETUFFeF9Qcml2YXRlX01hY3JvcyBETUFFeCBQcml2YXRlIE1hY3JvcworICogQGJyaWVmICAgIERNQUV4IHByaXZhdGUgbWFjcm9zCisgKiBAeworICovCisKKyNkZWZpbmUgSVNfRE1BTVVYX1NZTkNfU0lHTkFMX0lEKFNJR05BTF9JRCkgXAorICAoKFNJR05BTF9JRCkgPD0gSEFMX0RNQU1VWDFfU1lOQ19MUFRJTTFfT1VUKQorCisjZGVmaW5lIElTX0RNQU1VWF9TWU5DX1JFUVVFU1RfTlVNQkVSKFJFUVVFU1RfTlVNQkVSKSBcCisgICgoKFJFUVVFU1RfTlVNQkVSKSA+IDBVKSAmJiAoKFJFUVVFU1RfTlVNQkVSKSA8PSAzMlUpKQorCisjZGVmaW5lIElTX0RNQU1VWF9TWU5DX1BPTEFSSVRZKFBPTEFSSVRZKSAgICAgIFwKKyAgKCgoUE9MQVJJVFkpID09IEhBTF9ETUFNVVhfU1lOQ19OT19FVkVOVCkgfHwgXAorICAgKChQT0xBUklUWSkgPT0gSEFMX0RNQU1VWF9TWU5DX1JJU0lORykgfHwgICBcCisgICAoKFBPTEFSSVRZKSA9PSBIQUxfRE1BTVVYX1NZTkNfRkFMTElORykgfHwgIFwKKyAgICgoUE9MQVJJVFkpID09IEhBTF9ETUFNVVhfU1lOQ19SSVNJTkdfRkFMTElORykpCisKKyNkZWZpbmUgSVNfRE1BTVVYX1NZTkNfU1RBVEUoU1lOQykgKCgoU1lOQykgPT0gRElTQUJMRSkgfHwgKChTWU5DKSA9PSBFTkFCTEUpKQorCisjZGVmaW5lIElTX0RNQU1VWF9TWU5DX0VWRU5UKEVWRU5UKSBcCisgICgoKEVWRU5UKSA9PSBESVNBQkxFKSB8fCAoKEVWRU5UKSA9PSBFTkFCTEUpKQorCisjZGVmaW5lIElTX0RNQU1VWF9SRVFVRVNUX0dFTl9TSUdOQUxfSUQoU0lHTkFMX0lEKSBcCisgICgoU0lHTkFMX0lEKSA8PSBIQUxfRE1BTVVYMV9SRVFfR0VOX0xQVElNMV9PVVQpCisKKyNkZWZpbmUgSVNfRE1BTVVYX1JFUVVFU1RfR0VOX1JFUVVFU1RfTlVNQkVSKFJFUVVFU1RfTlVNQkVSKSBcCisgICgoKFJFUVVFU1RfTlVNQkVSKSA+IDBVKSAmJiAoKFJFUVVFU1RfTlVNQkVSKSA8PSAzMlUpKQorCisjZGVmaW5lIElTX0RNQU1VWF9SRVFVRVNUX0dFTl9QT0xBUklUWShQT0xBUklUWSkgIFwKKyAgKCgoUE9MQVJJVFkpID09IEhBTF9ETUFNVVhfUkVRX0dFTl9OT19FVkVOVCkgfHwgXAorICAgKChQT0xBUklUWSkgPT0gSEFMX0RNQU1VWF9SRVFfR0VOX1JJU0lORykgfHwgICBcCisgICAoKFBPTEFSSVRZKSA9PSBIQUxfRE1BTVVYX1JFUV9HRU5fRkFMTElORykgfHwgIFwKKyAgICgoUE9MQVJJVFkpID09IEhBTF9ETUFNVVhfUkVRX0dFTl9SSVNJTkdfRkFMTElORykpCisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1NUTTMyRzR4eF9IQUxfRE1BX0VYX0ggKi8KZGlmZiAtLWdpdCBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9JbmMvc3RtMzJnNHh4X2hhbF9leHRpLmggYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9oYWxfZXh0aS5oCmluZGV4IGQzYTRkYzEuLjg2MDgxMjYgMTAwNjQ0Ci0tLSBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9JbmMvc3RtMzJnNHh4X2hhbF9leHRpLmgKKysrIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfaGFsX2V4dGkuaApAQCAtMSwzMTYgKzEsMzE2IEBACi0vKioNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQGZpbGUgICAgc3RtMzJnNHh4X2hhbF9leHRpLmgNCi0gKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQ0KLSAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIEVYVEkgSEFMIG1vZHVsZS4NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQGF0dGVudGlvbg0KLSAqDQotICogQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KLSAqDQotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0ZXJtcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlDQotICogaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc29mdHdhcmUgY29tcG9uZW50Lg0KLSAqIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcyB3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLg0KLSAqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqLw0KLQ0KLS8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotI2lmbmRlZiBTVE0zMkc0eHhfSEFMX0VYVElfSA0KLSNkZWZpbmUgU1RNMzJHNHh4X0hBTF9FWFRJX0gNCi0NCi0jaWZkZWYgX19jcGx1c3BsdXMNCi1leHRlcm4gIkMiIHsNCi0jZW5kaWYNCi0NCi0vKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpbmNsdWRlICJzdG0zMmc0eHhfaGFsX2RlZi5oIg0KLQ0KLS8qKiBAYWRkdG9ncm91cCBTVE0zMkc0eHhfSEFMX0RyaXZlcg0KLSAqIEB7DQotICovDQotDQotLyoqIEBkZWZncm91cCBFWFRJIEVYVEkNCi0gKiBAYnJpZWYgRVhUSSBIQUwgbW9kdWxlIGRyaXZlcg0KLSAqIEB7DQotICovDQotDQotLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0NCi0vKiogQGRlZmdyb3VwIEVYVElfRXhwb3J0ZWRfVHlwZXMgRVhUSSBFeHBvcnRlZCBUeXBlcw0KLSAqIEB7DQotICovDQotdHlwZWRlZiBlbnVtIHsgSEFMX0VYVElfQ09NTU9OX0NCX0lEID0gMHgwMFVMIH0gRVhUSV9DYWxsYmFja0lEVHlwZURlZjsNCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVYVEkgSGFuZGxlIHN0cnVjdHVyZSBkZWZpbml0aW9uDQotICovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgdWludDMyX3QgTGluZTsgICAgICAgICAgICAgICAgIC8qITwgIEV4dGkgbGluZSBudW1iZXIgKi8NCi0gIHZvaWQgKCpQZW5kaW5nQ2FsbGJhY2spKHZvaWQpOyAvKiE8ICBFeHRpIHBlbmRpbmcgY2FsbGJhY2sgKi8NCi19IEVYVElfSGFuZGxlVHlwZURlZjsNCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVYVEkgQ29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbg0KLSAqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gIHVpbnQzMl90IExpbmU7ICAgIC8qITwgVGhlIEV4dGkgbGluZSB0byBiZSBjb25maWd1cmVkLiBUaGlzIHBhcmFtZXRlcg0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEVYVElfTGluZSAqLw0KLSAgdWludDMyX3QgTW9kZTsgICAgLyohPCBUaGUgRXhpdCBNb2RlIHRvIGJlIGNvbmZpZ3VyZWQgZm9yIGEgY29yZS4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgQHJlZiBFWFRJX01vZGUgKi8NCi0gIHVpbnQzMl90IFRyaWdnZXI7IC8qITwgVGhlIEV4dGkgVHJpZ2dlciB0byBiZSBjb25maWd1cmVkLiBUaGlzIHBhcmFtZXRlcg0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEVYVElfVHJpZ2dlciAqLw0KLSAgdWludDMyX3QgR1BJT1NlbDsgLyohPCBUaGUgRXh0aSBHUElPIG11bHRpcGxleGVyIHNlbGVjdGlvbiB0byBiZSBjb25maWd1cmVkLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBpcyBvbmx5IHBvc3NpYmxlIGZvciBsaW5lIDAgdG8gMTUuIEl0DQotICAgICAgICAgICAgICAgICAgICAgICAgIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRVhUSV9HUElPU2VsICovDQotfSBFWFRJX0NvbmZpZ1R5cGVEZWY7DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgRVhUSV9FeHBvcnRlZF9Db25zdGFudHMgRVhUSSBFeHBvcnRlZCBDb25zdGFudHMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRVhUSV9MaW5lICBFWFRJIExpbmUNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgRVhUSV9MSU5FXzAgKEVYVElfR1BJTyB8IEVYVElfUkVHMSB8IDB4MDB1KQ0KLSNkZWZpbmUgRVhUSV9MSU5FXzEgKEVYVElfR1BJTyB8IEVYVElfUkVHMSB8IDB4MDF1KQ0KLSNkZWZpbmUgRVhUSV9MSU5FXzIgKEVYVElfR1BJTyB8IEVYVElfUkVHMSB8IDB4MDJ1KQ0KLSNkZWZpbmUgRVhUSV9MSU5FXzMgKEVYVElfR1BJTyB8IEVYVElfUkVHMSB8IDB4MDN1KQ0KLSNkZWZpbmUgRVhUSV9MSU5FXzQgKEVYVElfR1BJTyB8IEVYVElfUkVHMSB8IDB4MDR1KQ0KLSNkZWZpbmUgRVhUSV9MSU5FXzUgKEVYVElfR1BJTyB8IEVYVElfUkVHMSB8IDB4MDV1KQ0KLSNkZWZpbmUgRVhUSV9MSU5FXzYgKEVYVElfR1BJTyB8IEVYVElfUkVHMSB8IDB4MDZ1KQ0KLSNkZWZpbmUgRVhUSV9MSU5FXzcgKEVYVElfR1BJTyB8IEVYVElfUkVHMSB8IDB4MDd1KQ0KLSNkZWZpbmUgRVhUSV9MSU5FXzggKEVYVElfR1BJTyB8IEVYVElfUkVHMSB8IDB4MDh1KQ0KLSNkZWZpbmUgRVhUSV9MSU5FXzkgKEVYVElfR1BJTyB8IEVYVElfUkVHMSB8IDB4MDl1KQ0KLSNkZWZpbmUgRVhUSV9MSU5FXzEwIChFWFRJX0dQSU8gfCBFWFRJX1JFRzEgfCAweDBBdSkNCi0jZGVmaW5lIEVYVElfTElORV8xMSAoRVhUSV9HUElPIHwgRVhUSV9SRUcxIHwgMHgwQnUpDQotI2RlZmluZSBFWFRJX0xJTkVfMTIgKEVYVElfR1BJTyB8IEVYVElfUkVHMSB8IDB4MEN1KQ0KLSNkZWZpbmUgRVhUSV9MSU5FXzEzIChFWFRJX0dQSU8gfCBFWFRJX1JFRzEgfCAweDBEdSkNCi0jZGVmaW5lIEVYVElfTElORV8xNCAoRVhUSV9HUElPIHwgRVhUSV9SRUcxIHwgMHgwRXUpDQotI2RlZmluZSBFWFRJX0xJTkVfMTUgKEVYVElfR1BJTyB8IEVYVElfUkVHMSB8IDB4MEZ1KQ0KLSNkZWZpbmUgRVhUSV9MSU5FXzE2IChFWFRJX0NPTkZJRyB8IEVYVElfUkVHMSB8IDB4MTB1KQ0KLSNkZWZpbmUgRVhUSV9MSU5FXzE3IChFWFRJX0NPTkZJRyB8IEVYVElfUkVHMSB8IDB4MTF1KQ0KLSNkZWZpbmUgRVhUSV9MSU5FXzE4IChFWFRJX0RJUkVDVCB8IEVYVElfUkVHMSB8IDB4MTJ1KQ0KLSNkZWZpbmUgRVhUSV9MSU5FXzE5IChFWFRJX0NPTkZJRyB8IEVYVElfUkVHMSB8IDB4MTN1KQ0KLSNkZWZpbmUgRVhUSV9MSU5FXzIwIChFWFRJX0NPTkZJRyB8IEVYVElfUkVHMSB8IDB4MTR1KQ0KLSNkZWZpbmUgRVhUSV9MSU5FXzIxIChFWFRJX0NPTkZJRyB8IEVYVElfUkVHMSB8IDB4MTV1KQ0KLSNkZWZpbmUgRVhUSV9MSU5FXzIyIChFWFRJX0NPTkZJRyB8IEVYVElfUkVHMSB8IDB4MTZ1KQ0KLSNkZWZpbmUgRVhUSV9MSU5FXzIzIChFWFRJX0RJUkVDVCB8IEVYVElfUkVHMSB8IDB4MTd1KQ0KLSNkZWZpbmUgRVhUSV9MSU5FXzI0IChFWFRJX0RJUkVDVCB8IEVYVElfUkVHMSB8IDB4MTh1KQ0KLSNkZWZpbmUgRVhUSV9MSU5FXzI1IChFWFRJX0RJUkVDVCB8IEVYVElfUkVHMSB8IDB4MTl1KQ0KLSNkZWZpbmUgRVhUSV9MSU5FXzI2IChFWFRJX0RJUkVDVCB8IEVYVElfUkVHMSB8IDB4MUF1KQ0KLSNkZWZpbmUgRVhUSV9MSU5FXzI3IChFWFRJX0RJUkVDVCB8IEVYVElfUkVHMSB8IDB4MUJ1KQ0KLSNkZWZpbmUgRVhUSV9MSU5FXzI4IChFWFRJX0RJUkVDVCB8IEVYVElfUkVHMSB8IDB4MUN1KQ0KLSNkZWZpbmUgRVhUSV9MSU5FXzI5IChFWFRJX0NPTkZJRyB8IEVYVElfUkVHMSB8IDB4MUR1KQ0KLSNkZWZpbmUgRVhUSV9MSU5FXzMwIChFWFRJX0NPTkZJRyB8IEVYVElfUkVHMSB8IDB4MUV1KQ0KLSNkZWZpbmUgRVhUSV9MSU5FXzMxIChFWFRJX0NPTkZJRyB8IEVYVElfUkVHMSB8IDB4MUZ1KQ0KLSNkZWZpbmUgRVhUSV9MSU5FXzMyIChFWFRJX0NPTkZJRyB8IEVYVElfUkVHMiB8IDB4MDB1KQ0KLSNkZWZpbmUgRVhUSV9MSU5FXzMzIChFWFRJX0NPTkZJRyB8IEVYVElfUkVHMiB8IDB4MDF1KQ0KLSNkZWZpbmUgRVhUSV9MSU5FXzM0IChFWFRJX0RJUkVDVCB8IEVYVElfUkVHMiB8IDB4MDJ1KQ0KLSNkZWZpbmUgRVhUSV9MSU5FXzM1IChFWFRJX0RJUkVDVCB8IEVYVElfUkVHMiB8IDB4MDN1KQ0KLSNkZWZpbmUgRVhUSV9MSU5FXzM2IChFWFRJX0RJUkVDVCB8IEVYVElfUkVHMiB8IDB4MDR1KQ0KLSNkZWZpbmUgRVhUSV9MSU5FXzM3IChFWFRJX0RJUkVDVCB8IEVYVElfUkVHMiB8IDB4MDV1KQ0KLSNkZWZpbmUgRVhUSV9MSU5FXzM4IChFWFRJX0NPTkZJRyB8IEVYVElfUkVHMiB8IDB4MDZ1KQ0KLSNkZWZpbmUgRVhUSV9MSU5FXzM5IChFWFRJX0NPTkZJRyB8IEVYVElfUkVHMiB8IDB4MDd1KQ0KLSNkZWZpbmUgRVhUSV9MSU5FXzQwIChFWFRJX0NPTkZJRyB8IEVYVElfUkVHMiB8IDB4MDh1KQ0KLSNkZWZpbmUgRVhUSV9MSU5FXzQxIChFWFRJX0NPTkZJRyB8IEVYVElfUkVHMiB8IDB4MDl1KQ0KLSNkZWZpbmUgRVhUSV9MSU5FXzQyIChFWFRJX0RJUkVDVCB8IEVYVElfUkVHMiB8IDB4MEF1KQ0KLSNkZWZpbmUgRVhUSV9MSU5FXzQzIChFWFRJX0RJUkVDVCB8IEVYVElfUkVHMiB8IDB4MEJ1KQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBFWFRJX01vZGUgIEVYVEkgTW9kZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBFWFRJX01PREVfTk9ORSAweDAwMDAwMDAwVQ0KLSNkZWZpbmUgRVhUSV9NT0RFX0lOVEVSUlVQVCAweDAwMDAwMDAxVQ0KLSNkZWZpbmUgRVhUSV9NT0RFX0VWRU5UIDB4MDAwMDAwMDJVDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEVYVElfVHJpZ2dlciAgRVhUSSBUcmlnZ2VyDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIEVYVElfVFJJR0dFUl9OT05FIDB4MDAwMDAwMDBVDQotI2RlZmluZSBFWFRJX1RSSUdHRVJfUklTSU5HIDB4MDAwMDAwMDFVDQotI2RlZmluZSBFWFRJX1RSSUdHRVJfRkFMTElORyAweDAwMDAwMDAyVQ0KLSNkZWZpbmUgRVhUSV9UUklHR0VSX1JJU0lOR19GQUxMSU5HIChFWFRJX1RSSUdHRVJfUklTSU5HIHwgRVhUSV9UUklHR0VSX0ZBTExJTkcpDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEVYVElfR1BJT1NlbCAgRVhUSSBHUElPU2VsDQotICogQGJyaWVmDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIEVYVElfR1BJT0EgMHgwMDAwMDAwMFUNCi0jZGVmaW5lIEVYVElfR1BJT0IgMHgwMDAwMDAwMVUNCi0jZGVmaW5lIEVYVElfR1BJT0MgMHgwMDAwMDAwMlUNCi0jZGVmaW5lIEVYVElfR1BJT0QgMHgwMDAwMDAwM1UNCi0jZGVmaW5lIEVYVElfR1BJT0UgMHgwMDAwMDAwNFUNCi0jZGVmaW5lIEVYVElfR1BJT0YgMHgwMDAwMDAwNVUNCi0jZGVmaW5lIEVYVElfR1BJT0cgMHgwMDAwMDAwNlUNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGRlZmdyb3VwIEVYVElfRXhwb3J0ZWRfTWFjcm9zIEVYVEkgRXhwb3J0ZWQgTWFjcm9zDQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGRlZmdyb3VwIEVYVElfUHJpdmF0ZV9Db25zdGFudHMgRVhUSSBQcml2YXRlIENvbnN0YW50cw0KLSAqIEB7DQotICovDQotLyoqDQotICogQGJyaWVmICBFWFRJIExpbmUgcHJvcGVydHkgZGVmaW5pdGlvbg0KLSAqLw0KLSNkZWZpbmUgRVhUSV9QUk9QRVJUWV9TSElGVCAyNFUNCi0jZGVmaW5lIEVYVElfRElSRUNUICgweDAxdUwgPDwgRVhUSV9QUk9QRVJUWV9TSElGVCkNCi0jZGVmaW5lIEVYVElfQ09ORklHICgweDAydUwgPDwgRVhUSV9QUk9QRVJUWV9TSElGVCkNCi0jZGVmaW5lIEVYVElfR1BJTyAoKDB4MDR1TCA8PCBFWFRJX1BST1BFUlRZX1NISUZUKSB8IEVYVElfQ09ORklHKQ0KLSNkZWZpbmUgRVhUSV9SRVNFUlZFRCAoMHgwOHVMIDw8IEVYVElfUFJPUEVSVFlfU0hJRlQpDQotI2RlZmluZSBFWFRJX1BST1BFUlRZX01BU0sgKEVYVElfRElSRUNUIHwgRVhUSV9DT05GSUcgfCBFWFRJX0dQSU8pDQotDQotLyoqDQotICogQGJyaWVmICBFWFRJIFJlZ2lzdGVyIGFuZCBiaXQgdXNhZ2UNCi0gKi8NCi0jZGVmaW5lIEVYVElfUkVHX1NISUZUIDE2VQ0KLSNkZWZpbmUgRVhUSV9SRUcxICgweDAwdUwgPDwgRVhUSV9SRUdfU0hJRlQpDQotI2RlZmluZSBFWFRJX1JFRzIgKDB4MDF1TCA8PCBFWFRJX1JFR19TSElGVCkNCi0jZGVmaW5lIEVYVElfUkVHX01BU0sgKEVYVElfUkVHMSB8IEVYVElfUkVHMikNCi0jZGVmaW5lIEVYVElfUElOX01BU0sgMHgwMDAwMDAxRlUNCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVYVEkgTWFzayBmb3IgaW50ZXJydXB0ICYgZXZlbnQgbW9kZQ0KLSAqLw0KLSNkZWZpbmUgRVhUSV9NT0RFX01BU0sgKEVYVElfTU9ERV9FVkVOVCB8IEVYVElfTU9ERV9JTlRFUlJVUFQpDQotDQotLyoqDQotICogQGJyaWVmICBFWFRJIE1hc2sgZm9yIHRyaWdnZXIgcG9zc2liaWxpdGllcw0KLSAqLw0KLSNkZWZpbmUgRVhUSV9UUklHR0VSX01BU0sgKEVYVElfVFJJR0dFUl9SSVNJTkcgfCBFWFRJX1RSSUdHRVJfRkFMTElORykNCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVYVEkgTGluZSBudW1iZXINCi0gKi8NCi0jZGVmaW5lIEVYVElfTElORV9OQiA0NFVMDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgRVhUSV9Qcml2YXRlX01hY3JvcyBFWFRJIFByaXZhdGUgTWFjcm9zDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIElTX0VYVElfTElORShfX0VYVElfTElORV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKCgoKF9fRVhUSV9MSU5FX18pICYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICB+KEVYVElfUFJPUEVSVFlfTUFTSyB8IEVYVElfUkVHX01BU0sgfCBFWFRJX1BJTl9NQVNLKSkgPT0gMHgwMFUpICYmIFwNCi0gICAoKCgoX19FWFRJX0xJTkVfXykgJiBFWFRJX1BST1BFUlRZX01BU0spID09IEVYVElfRElSRUNUKSB8fCAgICAgICAgICAgXA0KLSAgICAoKChfX0VYVElfTElORV9fKSAmIEVYVElfUFJPUEVSVFlfTUFTSykgPT0gRVhUSV9DT05GSUcpIHx8ICAgICAgICAgICBcDQotICAgICgoKF9fRVhUSV9MSU5FX18pICYgRVhUSV9QUk9QRVJUWV9NQVNLKSA9PSBFWFRJX0dQSU8pKSAmJiAgICAgICAgICAgIFwNCi0gICAoKChfX0VYVElfTElORV9fKSAmIChFWFRJX1JFR19NQVNLIHwgRVhUSV9QSU5fTUFTSykpIDwgICAgICAgICAgICAgICAgXA0KLSAgICAoKChFWFRJX0xJTkVfTkIgLyAzMnUpIDw8IEVYVElfUkVHX1NISUZUKSB8IChFWFRJX0xJTkVfTkIgJSAzMnUpKSkpDQotDQotI2RlZmluZSBJU19FWFRJX01PREUoX19FWFRJX0xJTkVfXykgICAgICAgICAgICAgICAgIFwNCi0gICgoKChfX0VYVElfTElORV9fKSAmIEVYVElfTU9ERV9NQVNLKSAhPSAweDAwVSkgJiYgXA0KLSAgICgoKF9fRVhUSV9MSU5FX18pICYgfkVYVElfTU9ERV9NQVNLKSA9PSAweDAwVSkpDQotDQotI2RlZmluZSBJU19FWFRJX1RSSUdHRVIoX19FWFRJX0xJTkVfXykgXA0KLSAgKCgoX19FWFRJX0xJTkVfXykgJiB+RVhUSV9UUklHR0VSX01BU0spID09IDB4MDBVKQ0KLQ0KLSNkZWZpbmUgSVNfRVhUSV9DT05GSUdfTElORShfX0VYVElfTElORV9fKSBcDQotICAoKChfX0VYVElfTElORV9fKSAmIEVYVElfQ09ORklHKSAhPSAweDAwVSkNCi0NCi0jZGVmaW5lIElTX0VYVElfR1BJT19QT1JUKF9fUE9SVF9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKChfX1BPUlRfXykgPT0gRVhUSV9HUElPQSkgfHwgKChfX1BPUlRfXykgPT0gRVhUSV9HUElPQikgfHwgXA0KLSAgICgoX19QT1JUX18pID09IEVYVElfR1BJT0MpIHx8ICgoX19QT1JUX18pID09IEVYVElfR1BJT0QpIHx8IFwNCi0gICAoKF9fUE9SVF9fKSA9PSBFWFRJX0dQSU9FKSB8fCAoKF9fUE9SVF9fKSA9PSBFWFRJX0dQSU9GKSB8fCBcDQotICAgKChfX1BPUlRfXykgPT0gRVhUSV9HUElPRykpDQotDQotI2RlZmluZSBJU19FWFRJX0dQSU9fUElOKF9fUElOX18pICgoX19QSU5fXykgPCAxNnUpDQotDQotI2RlZmluZSBJU19FWFRJX1BFTkRJTkdfRURHRShfX0VER0VfXykgICAgIFwNCi0gICgoKF9fRURHRV9fKSA9PSBFWFRJX1RSSUdHRVJfUklTSU5HKSB8fCAgXA0KLSAgICgoX19FREdFX18pID09IEVYVElfVFJJR0dFUl9GQUxMSU5HKSB8fCBcDQotICAgKChfX0VER0VfXykgPT0gRVhUSV9UUklHR0VSX1JJU0lOR19GQUxMSU5HKSkNCi0NCi0jZGVmaW5lIElTX0VYVElfQ0IoX19DQl9fKSAoKF9fQ0JfXykgPT0gSEFMX0VYVElfQ09NTU9OX0NCX0lEKQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGRlZmdyb3VwIEVYVElfRXhwb3J0ZWRfRnVuY3Rpb25zIEVYVEkgRXhwb3J0ZWQgRnVuY3Rpb25zDQotICogQGJyaWVmICAgIEVYVEkgRXhwb3J0ZWQgRnVuY3Rpb25zDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEVYVElfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucw0KLSAqIEBicmllZiAgICBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucw0KLSAqIEB7DQotICovDQotLyogQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfRVhUSV9TZXRDb25maWdMaW5lKEVYVElfSGFuZGxlVHlwZURlZiAqaGV4dGksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRJX0NvbmZpZ1R5cGVEZWYgKnBFeHRpQ29uZmlnKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfRVhUSV9HZXRDb25maWdMaW5lKEVYVElfSGFuZGxlVHlwZURlZiAqaGV4dGksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRJX0NvbmZpZ1R5cGVEZWYgKnBFeHRpQ29uZmlnKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfRVhUSV9DbGVhckNvbmZpZ0xpbmUoRVhUSV9IYW5kbGVUeXBlRGVmICpoZXh0aSk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0VYVElfUmVnaXN0ZXJDYWxsYmFjayhFWFRJX0hhbmRsZVR5cGVEZWYgKmhleHRpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUSV9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKnBQZW5kaW5nQ2Jmbikodm9pZCkpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9FWFRJX0dldEhhbmRsZShFWFRJX0hhbmRsZVR5cGVEZWYgKmhleHRpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBFeHRpTGluZSk7DQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEVYVElfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zDQotICogQGJyaWVmICAgIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMNCi0gKiBAew0KLSAqLw0KLS8qIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotdm9pZCBIQUxfRVhUSV9JUlFIYW5kbGVyKEVYVElfSGFuZGxlVHlwZURlZiAqaGV4dGkpOw0KLXVpbnQzMl90IEhBTF9FWFRJX0dldFBlbmRpbmcoRVhUSV9IYW5kbGVUeXBlRGVmICpoZXh0aSwgdWludDMyX3QgRWRnZSk7DQotdm9pZCBIQUxfRVhUSV9DbGVhclBlbmRpbmcoRVhUSV9IYW5kbGVUeXBlRGVmICpoZXh0aSwgdWludDMyX3QgRWRnZSk7DQotdm9pZCBIQUxfRVhUSV9HZW5lcmF0ZVNXSShFWFRJX0hhbmRsZVR5cGVEZWYgKmhleHRpKTsNCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLSNpZmRlZiBfX2NwbHVzcGx1cw0KLX0NCi0jZW5kaWYNCi0NCi0jZW5kaWYgLyogU1RNMzJHNHh4X0hBTF9FWFRJX0ggKi8NCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBmaWxlICAgIHN0bTMyZzR4eF9oYWxfZXh0aS5oCisgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgRVhUSSBIQUwgbW9kdWxlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGF0dGVudGlvbgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGVybXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZQorICogaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc29mdHdhcmUgY29tcG9uZW50LgorICogSWYgbm8gTElDRU5TRSBmaWxlIGNvbWVzIHdpdGggdGhpcyBzb2Z0d2FyZSwgaXQgaXMgcHJvdmlkZWQgQVMtSVMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyRzR4eF9IQUxfRVhUSV9ICisjZGVmaW5lIFNUTTMyRzR4eF9IQUxfRVhUSV9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmc0eHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHNHh4X0hBTF9Ecml2ZXIKKyAqIEB7CisgKi8KKworLyoqIEBkZWZncm91cCBFWFRJIEVYVEkKKyAqIEBicmllZiBFWFRJIEhBTCBtb2R1bGUgZHJpdmVyCisgKiBAeworICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgRVhUSV9FeHBvcnRlZF9UeXBlcyBFWFRJIEV4cG9ydGVkIFR5cGVzCisgKiBAeworICovCit0eXBlZGVmIGVudW0geyBIQUxfRVhUSV9DT01NT05fQ0JfSUQgPSAweDAwVUwgfSBFWFRJX0NhbGxiYWNrSURUeXBlRGVmOworCisvKioKKyAqIEBicmllZiAgRVhUSSBIYW5kbGUgc3RydWN0dXJlIGRlZmluaXRpb24KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50MzJfdCBMaW5lOyAgICAgICAgICAgICAgICAgLyohPCAgRXh0aSBsaW5lIG51bWJlciAqLworICB2b2lkICgqUGVuZGluZ0NhbGxiYWNrKSh2b2lkKTsgLyohPCAgRXh0aSBwZW5kaW5nIGNhbGxiYWNrICovCit9IEVYVElfSGFuZGxlVHlwZURlZjsKKworLyoqCisgKiBAYnJpZWYgIEVYVEkgQ29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQzMl90IExpbmU7ICAgIC8qITwgVGhlIEV4dGkgbGluZSB0byBiZSBjb25maWd1cmVkLiBUaGlzIHBhcmFtZXRlcgorICAgICAgICAgICAgICAgICAgICAgICAgIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRVhUSV9MaW5lICovCisgIHVpbnQzMl90IE1vZGU7ICAgIC8qITwgVGhlIEV4aXQgTW9kZSB0byBiZSBjb25maWd1cmVkIGZvciBhIGNvcmUuCisgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgQHJlZiBFWFRJX01vZGUgKi8KKyAgdWludDMyX3QgVHJpZ2dlcjsgLyohPCBUaGUgRXh0aSBUcmlnZ2VyIHRvIGJlIGNvbmZpZ3VyZWQuIFRoaXMgcGFyYW1ldGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBFWFRJX1RyaWdnZXIgKi8KKyAgdWludDMyX3QgR1BJT1NlbDsgLyohPCBUaGUgRXh0aSBHUElPIG11bHRpcGxleGVyIHNlbGVjdGlvbiB0byBiZSBjb25maWd1cmVkLgorICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGlzIG9ubHkgcG9zc2libGUgZm9yIGxpbmUgMCB0byAxNS4gSXQKKyAgICAgICAgICAgICAgICAgICAgICAgICBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEVYVElfR1BJT1NlbCAqLworfSBFWFRJX0NvbmZpZ1R5cGVEZWY7CisKKy8qKgorICogQH0KKyAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBFWFRJX0V4cG9ydGVkX0NvbnN0YW50cyBFWFRJIEV4cG9ydGVkIENvbnN0YW50cworICogQHsKKyAqLworCisvKiogQGRlZmdyb3VwIEVYVElfTGluZSAgRVhUSSBMaW5lCisgKiBAeworICovCisjZGVmaW5lIEVYVElfTElORV8wIChFWFRJX0dQSU8gfCBFWFRJX1JFRzEgfCAweDAwdSkKKyNkZWZpbmUgRVhUSV9MSU5FXzEgKEVYVElfR1BJTyB8IEVYVElfUkVHMSB8IDB4MDF1KQorI2RlZmluZSBFWFRJX0xJTkVfMiAoRVhUSV9HUElPIHwgRVhUSV9SRUcxIHwgMHgwMnUpCisjZGVmaW5lIEVYVElfTElORV8zIChFWFRJX0dQSU8gfCBFWFRJX1JFRzEgfCAweDAzdSkKKyNkZWZpbmUgRVhUSV9MSU5FXzQgKEVYVElfR1BJTyB8IEVYVElfUkVHMSB8IDB4MDR1KQorI2RlZmluZSBFWFRJX0xJTkVfNSAoRVhUSV9HUElPIHwgRVhUSV9SRUcxIHwgMHgwNXUpCisjZGVmaW5lIEVYVElfTElORV82IChFWFRJX0dQSU8gfCBFWFRJX1JFRzEgfCAweDA2dSkKKyNkZWZpbmUgRVhUSV9MSU5FXzcgKEVYVElfR1BJTyB8IEVYVElfUkVHMSB8IDB4MDd1KQorI2RlZmluZSBFWFRJX0xJTkVfOCAoRVhUSV9HUElPIHwgRVhUSV9SRUcxIHwgMHgwOHUpCisjZGVmaW5lIEVYVElfTElORV85IChFWFRJX0dQSU8gfCBFWFRJX1JFRzEgfCAweDA5dSkKKyNkZWZpbmUgRVhUSV9MSU5FXzEwIChFWFRJX0dQSU8gfCBFWFRJX1JFRzEgfCAweDBBdSkKKyNkZWZpbmUgRVhUSV9MSU5FXzExIChFWFRJX0dQSU8gfCBFWFRJX1JFRzEgfCAweDBCdSkKKyNkZWZpbmUgRVhUSV9MSU5FXzEyIChFWFRJX0dQSU8gfCBFWFRJX1JFRzEgfCAweDBDdSkKKyNkZWZpbmUgRVhUSV9MSU5FXzEzIChFWFRJX0dQSU8gfCBFWFRJX1JFRzEgfCAweDBEdSkKKyNkZWZpbmUgRVhUSV9MSU5FXzE0IChFWFRJX0dQSU8gfCBFWFRJX1JFRzEgfCAweDBFdSkKKyNkZWZpbmUgRVhUSV9MSU5FXzE1IChFWFRJX0dQSU8gfCBFWFRJX1JFRzEgfCAweDBGdSkKKyNkZWZpbmUgRVhUSV9MSU5FXzE2IChFWFRJX0NPTkZJRyB8IEVYVElfUkVHMSB8IDB4MTB1KQorI2RlZmluZSBFWFRJX0xJTkVfMTcgKEVYVElfQ09ORklHIHwgRVhUSV9SRUcxIHwgMHgxMXUpCisjZGVmaW5lIEVYVElfTElORV8xOCAoRVhUSV9ESVJFQ1QgfCBFWFRJX1JFRzEgfCAweDEydSkKKyNkZWZpbmUgRVhUSV9MSU5FXzE5IChFWFRJX0NPTkZJRyB8IEVYVElfUkVHMSB8IDB4MTN1KQorI2RlZmluZSBFWFRJX0xJTkVfMjAgKEVYVElfQ09ORklHIHwgRVhUSV9SRUcxIHwgMHgxNHUpCisjZGVmaW5lIEVYVElfTElORV8yMSAoRVhUSV9DT05GSUcgfCBFWFRJX1JFRzEgfCAweDE1dSkKKyNkZWZpbmUgRVhUSV9MSU5FXzIyIChFWFRJX0NPTkZJRyB8IEVYVElfUkVHMSB8IDB4MTZ1KQorI2RlZmluZSBFWFRJX0xJTkVfMjMgKEVYVElfRElSRUNUIHwgRVhUSV9SRUcxIHwgMHgxN3UpCisjZGVmaW5lIEVYVElfTElORV8yNCAoRVhUSV9ESVJFQ1QgfCBFWFRJX1JFRzEgfCAweDE4dSkKKyNkZWZpbmUgRVhUSV9MSU5FXzI1IChFWFRJX0RJUkVDVCB8IEVYVElfUkVHMSB8IDB4MTl1KQorI2RlZmluZSBFWFRJX0xJTkVfMjYgKEVYVElfRElSRUNUIHwgRVhUSV9SRUcxIHwgMHgxQXUpCisjZGVmaW5lIEVYVElfTElORV8yNyAoRVhUSV9ESVJFQ1QgfCBFWFRJX1JFRzEgfCAweDFCdSkKKyNkZWZpbmUgRVhUSV9MSU5FXzI4IChFWFRJX0RJUkVDVCB8IEVYVElfUkVHMSB8IDB4MUN1KQorI2RlZmluZSBFWFRJX0xJTkVfMjkgKEVYVElfQ09ORklHIHwgRVhUSV9SRUcxIHwgMHgxRHUpCisjZGVmaW5lIEVYVElfTElORV8zMCAoRVhUSV9DT05GSUcgfCBFWFRJX1JFRzEgfCAweDFFdSkKKyNkZWZpbmUgRVhUSV9MSU5FXzMxIChFWFRJX0NPTkZJRyB8IEVYVElfUkVHMSB8IDB4MUZ1KQorI2RlZmluZSBFWFRJX0xJTkVfMzIgKEVYVElfQ09ORklHIHwgRVhUSV9SRUcyIHwgMHgwMHUpCisjZGVmaW5lIEVYVElfTElORV8zMyAoRVhUSV9DT05GSUcgfCBFWFRJX1JFRzIgfCAweDAxdSkKKyNkZWZpbmUgRVhUSV9MSU5FXzM0IChFWFRJX0RJUkVDVCB8IEVYVElfUkVHMiB8IDB4MDJ1KQorI2RlZmluZSBFWFRJX0xJTkVfMzUgKEVYVElfRElSRUNUIHwgRVhUSV9SRUcyIHwgMHgwM3UpCisjZGVmaW5lIEVYVElfTElORV8zNiAoRVhUSV9ESVJFQ1QgfCBFWFRJX1JFRzIgfCAweDA0dSkKKyNkZWZpbmUgRVhUSV9MSU5FXzM3IChFWFRJX0RJUkVDVCB8IEVYVElfUkVHMiB8IDB4MDV1KQorI2RlZmluZSBFWFRJX0xJTkVfMzggKEVYVElfQ09ORklHIHwgRVhUSV9SRUcyIHwgMHgwNnUpCisjZGVmaW5lIEVYVElfTElORV8zOSAoRVhUSV9DT05GSUcgfCBFWFRJX1JFRzIgfCAweDA3dSkKKyNkZWZpbmUgRVhUSV9MSU5FXzQwIChFWFRJX0NPTkZJRyB8IEVYVElfUkVHMiB8IDB4MDh1KQorI2RlZmluZSBFWFRJX0xJTkVfNDEgKEVYVElfQ09ORklHIHwgRVhUSV9SRUcyIHwgMHgwOXUpCisjZGVmaW5lIEVYVElfTElORV80MiAoRVhUSV9ESVJFQ1QgfCBFWFRJX1JFRzIgfCAweDBBdSkKKyNkZWZpbmUgRVhUSV9MSU5FXzQzIChFWFRJX0RJUkVDVCB8IEVYVElfUkVHMiB8IDB4MEJ1KQorLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgRVhUSV9Nb2RlICBFWFRJIE1vZGUKKyAqIEB7CisgKi8KKyNkZWZpbmUgRVhUSV9NT0RFX05PTkUgMHgwMDAwMDAwMFUKKyNkZWZpbmUgRVhUSV9NT0RFX0lOVEVSUlVQVCAweDAwMDAwMDAxVQorI2RlZmluZSBFWFRJX01PREVfRVZFTlQgMHgwMDAwMDAwMlUKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEVYVElfVHJpZ2dlciAgRVhUSSBUcmlnZ2VyCisgKiBAeworICovCisjZGVmaW5lIEVYVElfVFJJR0dFUl9OT05FIDB4MDAwMDAwMDBVCisjZGVmaW5lIEVYVElfVFJJR0dFUl9SSVNJTkcgMHgwMDAwMDAwMVUKKyNkZWZpbmUgRVhUSV9UUklHR0VSX0ZBTExJTkcgMHgwMDAwMDAwMlUKKyNkZWZpbmUgRVhUSV9UUklHR0VSX1JJU0lOR19GQUxMSU5HIChFWFRJX1RSSUdHRVJfUklTSU5HIHwgRVhUSV9UUklHR0VSX0ZBTExJTkcpCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBFWFRJX0dQSU9TZWwgIEVYVEkgR1BJT1NlbAorICogQGJyaWVmCisgKiBAeworICovCisjZGVmaW5lIEVYVElfR1BJT0EgMHgwMDAwMDAwMFUKKyNkZWZpbmUgRVhUSV9HUElPQiAweDAwMDAwMDAxVQorI2RlZmluZSBFWFRJX0dQSU9DIDB4MDAwMDAwMDJVCisjZGVmaW5lIEVYVElfR1BJT0QgMHgwMDAwMDAwM1UKKyNkZWZpbmUgRVhUSV9HUElPRSAweDAwMDAwMDA0VQorI2RlZmluZSBFWFRJX0dQSU9GIDB4MDAwMDAwMDVVCisjZGVmaW5lIEVYVElfR1BJT0cgMHgwMDAwMDAwNlUKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRVhUSV9FeHBvcnRlZF9NYWNyb3MgRVhUSSBFeHBvcnRlZCBNYWNyb3MKKyAqIEB7CisgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRVhUSV9Qcml2YXRlX0NvbnN0YW50cyBFWFRJIFByaXZhdGUgQ29uc3RhbnRzCisgKiBAeworICovCisvKioKKyAqIEBicmllZiAgRVhUSSBMaW5lIHByb3BlcnR5IGRlZmluaXRpb24KKyAqLworI2RlZmluZSBFWFRJX1BST1BFUlRZX1NISUZUIDI0VQorI2RlZmluZSBFWFRJX0RJUkVDVCAoMHgwMXVMIDw8IEVYVElfUFJPUEVSVFlfU0hJRlQpCisjZGVmaW5lIEVYVElfQ09ORklHICgweDAydUwgPDwgRVhUSV9QUk9QRVJUWV9TSElGVCkKKyNkZWZpbmUgRVhUSV9HUElPICgoMHgwNHVMIDw8IEVYVElfUFJPUEVSVFlfU0hJRlQpIHwgRVhUSV9DT05GSUcpCisjZGVmaW5lIEVYVElfUkVTRVJWRUQgKDB4MDh1TCA8PCBFWFRJX1BST1BFUlRZX1NISUZUKQorI2RlZmluZSBFWFRJX1BST1BFUlRZX01BU0sgKEVYVElfRElSRUNUIHwgRVhUSV9DT05GSUcgfCBFWFRJX0dQSU8pCisKKy8qKgorICogQGJyaWVmICBFWFRJIFJlZ2lzdGVyIGFuZCBiaXQgdXNhZ2UKKyAqLworI2RlZmluZSBFWFRJX1JFR19TSElGVCAxNlUKKyNkZWZpbmUgRVhUSV9SRUcxICgweDAwdUwgPDwgRVhUSV9SRUdfU0hJRlQpCisjZGVmaW5lIEVYVElfUkVHMiAoMHgwMXVMIDw8IEVYVElfUkVHX1NISUZUKQorI2RlZmluZSBFWFRJX1JFR19NQVNLIChFWFRJX1JFRzEgfCBFWFRJX1JFRzIpCisjZGVmaW5lIEVYVElfUElOX01BU0sgMHgwMDAwMDAxRlUKKworLyoqCisgKiBAYnJpZWYgIEVYVEkgTWFzayBmb3IgaW50ZXJydXB0ICYgZXZlbnQgbW9kZQorICovCisjZGVmaW5lIEVYVElfTU9ERV9NQVNLIChFWFRJX01PREVfRVZFTlQgfCBFWFRJX01PREVfSU5URVJSVVBUKQorCisvKioKKyAqIEBicmllZiAgRVhUSSBNYXNrIGZvciB0cmlnZ2VyIHBvc3NpYmlsaXRpZXMKKyAqLworI2RlZmluZSBFWFRJX1RSSUdHRVJfTUFTSyAoRVhUSV9UUklHR0VSX1JJU0lORyB8IEVYVElfVFJJR0dFUl9GQUxMSU5HKQorCisvKioKKyAqIEBicmllZiAgRVhUSSBMaW5lIG51bWJlcgorICovCisjZGVmaW5lIEVYVElfTElORV9OQiA0NFVMCisKKy8qKgorICogQH0KKyAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBFWFRJX1ByaXZhdGVfTWFjcm9zIEVYVEkgUHJpdmF0ZSBNYWNyb3MKKyAqIEB7CisgKi8KKyNkZWZpbmUgSVNfRVhUSV9MSU5FKF9fRVhUSV9MSU5FX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKChfX0VYVElfTElORV9fKSAmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB+KEVYVElfUFJPUEVSVFlfTUFTSyB8IEVYVElfUkVHX01BU0sgfCBFWFRJX1BJTl9NQVNLKSkgPT0gMHgwMFUpICYmIFwKKyAgICgoKChfX0VYVElfTElORV9fKSAmIEVYVElfUFJPUEVSVFlfTUFTSykgPT0gRVhUSV9ESVJFQ1QpIHx8ICAgICAgICAgICBcCisgICAgKCgoX19FWFRJX0xJTkVfXykgJiBFWFRJX1BST1BFUlRZX01BU0spID09IEVYVElfQ09ORklHKSB8fCAgICAgICAgICAgXAorICAgICgoKF9fRVhUSV9MSU5FX18pICYgRVhUSV9QUk9QRVJUWV9NQVNLKSA9PSBFWFRJX0dQSU8pKSAmJiAgICAgICAgICAgIFwKKyAgICgoKF9fRVhUSV9MSU5FX18pICYgKEVYVElfUkVHX01BU0sgfCBFWFRJX1BJTl9NQVNLKSkgPCAgICAgICAgICAgICAgICBcCisgICAgKCgoRVhUSV9MSU5FX05CIC8gMzJ1KSA8PCBFWFRJX1JFR19TSElGVCkgfCAoRVhUSV9MSU5FX05CICUgMzJ1KSkpKQorCisjZGVmaW5lIElTX0VYVElfTU9ERShfX0VYVElfTElORV9fKSAgICAgICAgICAgICAgICAgXAorICAoKCgoX19FWFRJX0xJTkVfXykgJiBFWFRJX01PREVfTUFTSykgIT0gMHgwMFUpICYmIFwKKyAgICgoKF9fRVhUSV9MSU5FX18pICYgfkVYVElfTU9ERV9NQVNLKSA9PSAweDAwVSkpCisKKyNkZWZpbmUgSVNfRVhUSV9UUklHR0VSKF9fRVhUSV9MSU5FX18pIFwKKyAgKCgoX19FWFRJX0xJTkVfXykgJiB+RVhUSV9UUklHR0VSX01BU0spID09IDB4MDBVKQorCisjZGVmaW5lIElTX0VYVElfQ09ORklHX0xJTkUoX19FWFRJX0xJTkVfXykgXAorICAoKChfX0VYVElfTElORV9fKSAmIEVYVElfQ09ORklHKSAhPSAweDAwVSkKKworI2RlZmluZSBJU19FWFRJX0dQSU9fUE9SVChfX1BPUlRfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKChfX1BPUlRfXykgPT0gRVhUSV9HUElPQSkgfHwgKChfX1BPUlRfXykgPT0gRVhUSV9HUElPQikgfHwgXAorICAgKChfX1BPUlRfXykgPT0gRVhUSV9HUElPQykgfHwgKChfX1BPUlRfXykgPT0gRVhUSV9HUElPRCkgfHwgXAorICAgKChfX1BPUlRfXykgPT0gRVhUSV9HUElPRSkgfHwgKChfX1BPUlRfXykgPT0gRVhUSV9HUElPRikgfHwgXAorICAgKChfX1BPUlRfXykgPT0gRVhUSV9HUElPRykpCisKKyNkZWZpbmUgSVNfRVhUSV9HUElPX1BJTihfX1BJTl9fKSAoKF9fUElOX18pIDwgMTZ1KQorCisjZGVmaW5lIElTX0VYVElfUEVORElOR19FREdFKF9fRURHRV9fKSAgICAgXAorICAoKChfX0VER0VfXykgPT0gRVhUSV9UUklHR0VSX1JJU0lORykgfHwgIFwKKyAgICgoX19FREdFX18pID09IEVYVElfVFJJR0dFUl9GQUxMSU5HKSB8fCBcCisgICAoKF9fRURHRV9fKSA9PSBFWFRJX1RSSUdHRVJfUklTSU5HX0ZBTExJTkcpKQorCisjZGVmaW5lIElTX0VYVElfQ0IoX19DQl9fKSAoKF9fQ0JfXykgPT0gSEFMX0VYVElfQ09NTU9OX0NCX0lEKQorLyoqCisgKiBAfQorICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEVYVElfRXhwb3J0ZWRfRnVuY3Rpb25zIEVYVEkgRXhwb3J0ZWQgRnVuY3Rpb25zCisgKiBAYnJpZWYgICAgRVhUSSBFeHBvcnRlZCBGdW5jdGlvbnMKKyAqIEB7CisgKi8KKworLyoqIEBkZWZncm91cCBFWFRJX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMKKyAqIEBicmllZiAgICBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICogQHsKKyAqLworLyogQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9FWFRJX1NldENvbmZpZ0xpbmUoRVhUSV9IYW5kbGVUeXBlRGVmICpoZXh0aSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUSV9Db25maWdUeXBlRGVmICpwRXh0aUNvbmZpZyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRVhUSV9HZXRDb25maWdMaW5lKEVYVElfSGFuZGxlVHlwZURlZiAqaGV4dGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVElfQ29uZmlnVHlwZURlZiAqcEV4dGlDb25maWcpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0VYVElfQ2xlYXJDb25maWdMaW5lKEVYVElfSGFuZGxlVHlwZURlZiAqaGV4dGkpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0VYVElfUmVnaXN0ZXJDYWxsYmFjayhFWFRJX0hhbmRsZVR5cGVEZWYgKmhleHRpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRJX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpwUGVuZGluZ0NiZm4pKHZvaWQpKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9FWFRJX0dldEhhbmRsZShFWFRJX0hhbmRsZVR5cGVEZWYgKmhleHRpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEV4dGlMaW5lKTsKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEVYVElfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCisgKiBAYnJpZWYgICAgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICogQHsKKyAqLworLyogSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgSEFMX0VYVElfSVJRSGFuZGxlcihFWFRJX0hhbmRsZVR5cGVEZWYgKmhleHRpKTsKK3VpbnQzMl90IEhBTF9FWFRJX0dldFBlbmRpbmcoRVhUSV9IYW5kbGVUeXBlRGVmICpoZXh0aSwgdWludDMyX3QgRWRnZSk7Cit2b2lkIEhBTF9FWFRJX0NsZWFyUGVuZGluZyhFWFRJX0hhbmRsZVR5cGVEZWYgKmhleHRpLCB1aW50MzJfdCBFZGdlKTsKK3ZvaWQgSEFMX0VYVElfR2VuZXJhdGVTV0koRVhUSV9IYW5kbGVUeXBlRGVmICpoZXh0aSk7CisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJHNHh4X0hBTF9FWFRJX0ggKi8KZGlmZiAtLWdpdCBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9JbmMvc3RtMzJnNHh4X2hhbF9mZGNhbi5oIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfaGFsX2ZkY2FuLmgKaW5kZXggYWE4OGRmYi4uNTliMjgzYSAxMDA2NDQKLS0tIGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfaGFsX2ZkY2FuLmgKKysrIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfaGFsX2ZkY2FuLmgKQEAgLTEsMTc1NSArMSwxNzY2IEBACi0vKioNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQGZpbGUgICAgc3RtMzJnNHh4X2hhbF9mZGNhbi5oDQotICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0NCi0gKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBGRENBTiBIQUwgbW9kdWxlLg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBAYXR0ZW50aW9uDQotICoNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQotICoNCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRlcm1zIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUNCi0gKiBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb2Z0d2FyZSBjb21wb25lbnQuDQotICogSWYgbm8gTElDRU5TRSBmaWxlIGNvbWVzIHdpdGggdGhpcyBzb2Z0d2FyZSwgaXQgaXMgcHJvdmlkZWQgQVMtSVMuDQotICoNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICovDQotDQotLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaWZuZGVmIFNUTTMyRzR4eF9IQUxfRkRDQU5fSA0KLSNkZWZpbmUgU1RNMzJHNHh4X0hBTF9GRENBTl9IDQotDQotI2lmZGVmIF9fY3BsdXNwbHVzDQotZXh0ZXJuICJDIiB7DQotI2VuZGlmDQotDQotLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaW5jbHVkZSAic3RtMzJnNHh4X2hhbF9kZWYuaCINCi0NCi0jaWYgZGVmaW5lZChGRENBTjEpDQotDQotLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzR4eF9IQUxfRHJpdmVyDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGFkZHRvZ3JvdXAgRkRDQU4NCi0gKiBAew0KLSAqLw0KLQ0KLS8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBkZWZncm91cCBGRENBTl9FeHBvcnRlZF9UeXBlcyBGRENBTiBFeHBvcnRlZCBUeXBlcw0KLSAqIEB7DQotICovDQotDQotLyoqDQotICogQGJyaWVmIEhBTCBTdGF0ZSBzdHJ1Y3R1cmVzIGRlZmluaXRpb24NCi0gKi8NCi10eXBlZGVmIGVudW0gew0KLSAgSEFMX0ZEQ0FOX1NUQVRFX1JFU0VUID0gMHgwMFUsIC8qITwgRkRDQU4gbm90IHlldCBpbml0aWFsaXplZCBvciBkaXNhYmxlZCAqLw0KLSAgSEFMX0ZEQ0FOX1NUQVRFX1JFQURZID0gMHgwMVUsIC8qITwgRkRDQU4gaW5pdGlhbGl6ZWQgYW5kIHJlYWR5IGZvciB1c2UgICAqLw0KLSAgSEFMX0ZEQ0FOX1NUQVRFX0JVU1kgPSAweDAyVSwgIC8qITwgRkRDQU4gcHJvY2VzcyBpcyBvbmdvaW5nICAgICAgICAgICAgICAqLw0KLSAgSEFMX0ZEQ0FOX1NUQVRFX0VSUk9SID0gMHgwM1UgIC8qITwgRkRDQU4gZXJyb3Igc3RhdGUgICAgICAgICAgICAgICAgICAgICAqLw0KLX0gSEFMX0ZEQ0FOX1N0YXRlVHlwZURlZjsNCi0NCi0vKioNCi0gKiBAYnJpZWYgRkRDQU4gSW5pdCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbg0KLSAqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gIHVpbnQzMl90IENsb2NrRGl2aWRlcjsgLyohPCBTcGVjaWZpZXMgdGhlIEZEQ0FOIGtlcm5lbCBjbG9jayBkaXZpZGVyLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBjbG9jayBpcyBjb21tb24gdG8gYWxsIEZEQ0FOIGluc3RhbmNlcy4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBpcyBhcHBsaWVkIG9ubHkgYXQgaW5pdGlhbGlzYXRpb24NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgZmlyc3QgRkRDQU4gaW5zdGFuY2UuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIG9mIEByZWYgRkRDQU5fY2xvY2tfZGl2aWRlci4gICAqLw0KLQ0KLSAgdWludDMyX3QgRnJhbWVGb3JtYXQ7IC8qITwgU3BlY2lmaWVzIHRoZSBGRENBTiBmcmFtZSBmb3JtYXQuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRDQU5fZnJhbWVfZm9ybWF0ICAgICAqLw0KLQ0KLSAgdWludDMyX3QNCi0gICAgICBNb2RlOyAvKiE8IFNwZWNpZmllcyB0aGUgRkRDQU4gbW9kZS4NCi0gICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRkRDQU5fb3BlcmF0aW5nX21vZGUgICAqLw0KLQ0KLSAgRnVuY3Rpb25hbFN0YXRlIEF1dG9SZXRyYW5zbWlzc2lvbjsgLyohPCBFbmFibGUgb3IgZGlzYWJsZSB0aGUgYXV0b21hdGljDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRyYW5zbWlzc2lvbiBtb2RlLiBUaGlzIHBhcmFtZXRlciBjYW4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHNldCB0byBFTkFCTEUgb3IgRElTQUJMRSAqLw0KLQ0KLSAgRnVuY3Rpb25hbFN0YXRlDQotICAgICAgVHJhbnNtaXRQYXVzZTsgLyohPCBFbmFibGUgb3IgZGlzYWJsZSB0aGUgVHJhbnNtaXQgUGF1c2UgZmVhdHVyZS4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBzZXQgdG8gRU5BQkxFIG9yIERJU0FCTEUgKi8NCi0NCi0gIEZ1bmN0aW9uYWxTdGF0ZQ0KLSAgICAgIFByb3RvY29sRXhjZXB0aW9uOyAvKiE8IEVuYWJsZSBvciBkaXNhYmxlIHRoZSBQcm90b2NvbCBFeGNlcHRpb24gSGFuZGxpbmcuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgc2V0IHRvIEVOQUJMRSBvciBESVNBQkxFICovDQotDQotICB1aW50MzJfdCBOb21pbmFsUHJlc2NhbGVyOyAvKiE8IFNwZWNpZmllcyB0aGUgdmFsdWUgYnkgd2hpY2ggdGhlIG9zY2lsbGF0b3INCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZXF1ZW5jeSBpcyBkaXZpZGVkIGZvciBnZW5lcmF0aW5nIHRoZSBub21pbmFsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXQgdGltZSBxdWFudGEuIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJldHdlZW4gMSBhbmQgNTEyICAgICAgICAgICAgKi8NCi0NCi0gIHVpbnQzMl90DQotICAgICAgTm9taW5hbFN5bmNKdW1wV2lkdGg7IC8qITwgU3BlY2lmaWVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiB0aW1lIHF1YW50YSB0aGUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRDQU4gaGFyZHdhcmUgaXMgYWxsb3dlZCB0byBsZW5ndGhlbiBvciBzaG9ydGVuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgYml0IHRvIHBlcmZvcm0gcmVzeW5jaHJvbml6YXRpb24uIFRoaXMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiAxIGFuZCAxMjggKi8NCi0NCi0gIHVpbnQzMl90IE5vbWluYWxUaW1lU2VnMTsgLyohPCBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiB0aW1lIHF1YW50YSBpbiBCaXQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VnbWVudCAxLiBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJldHdlZW4gMiBhbmQgMjU2ICAgICAgICAgICAgKi8NCi0NCi0gIHVpbnQzMl90IE5vbWluYWxUaW1lU2VnMjsgLyohPCBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiB0aW1lIHF1YW50YSBpbiBCaXQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VnbWVudCAyLiBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJldHdlZW4gMiBhbmQgMTI4ICAgICAgICAgICAgKi8NCi0NCi0gIHVpbnQzMl90IERhdGFQcmVzY2FsZXI7IC8qITwgU3BlY2lmaWVzIHRoZSB2YWx1ZSBieSB3aGljaCB0aGUgb3NjaWxsYXRvcg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlcXVlbmN5IGlzIGRpdmlkZWQgZm9yIGdlbmVyYXRpbmcgdGhlIGRhdGEgYml0DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lIHF1YW50YS4gVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlcg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmV0d2VlbiAxIGFuZCAzMiAgICAgICAgICAgICAqLw0KLQ0KLSAgdWludDMyX3QgRGF0YVN5bmNKdW1wV2lkdGg7IC8qITwgU3BlY2lmaWVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiB0aW1lIHF1YW50YQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBGRENBTiBoYXJkd2FyZSBpcyBhbGxvd2VkIHRvIGxlbmd0aGVuIG9yDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRlbiBhIGRhdGEgYml0IHRvIHBlcmZvcm0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN5bmNocm9uaXphdGlvbi4gVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyIGJldHdlZW4gMSBhbmQgMTYgICAgICAgICAgICAgKi8NCi0NCi0gIHVpbnQzMl90IERhdGFUaW1lU2VnMTsgLyohPCBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiB0aW1lIHF1YW50YSBpbiBEYXRhIEJpdA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWdtZW50IDEuIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiAxDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCAzMiAgICAgICAgICAgICAqLw0KLQ0KLSAgdWludDMyX3QgRGF0YVRpbWVTZWcyOyAvKiE8IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHRpbWUgcXVhbnRhIGluIERhdGEgQml0DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlZ21lbnQgMi4gVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIDENCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIDE2ICAgICAgICAgICAgICovDQotDQotICB1aW50MzJfdA0KLSAgICAgIFN0ZEZpbHRlcnNOYnI7IC8qITwgU3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygc3RhbmRhcmQgTWVzc2FnZSBJRCBmaWx0ZXJzLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDI4ICovDQotDQotICB1aW50MzJfdA0KLSAgICAgIEV4dEZpbHRlcnNOYnI7IC8qITwgU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgZXh0ZW5kZWQgTWVzc2FnZSBJRCBmaWx0ZXJzLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDggKi8NCi0NCi0gIHVpbnQzMl90IFR4Rmlmb1F1ZXVlTW9kZTsgLyohPCBUeCBGSUZPL1F1ZXVlIE1vZGUgc2VsZWN0aW9uLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRDQU5fdHhGaWZvUXVldWVfTW9kZSAqLw0KLQ0KLX0gRkRDQU5fSW5pdFR5cGVEZWY7DQotDQotLyoqDQotICogQGJyaWVmICBGRENBTiBmaWx0ZXIgc3RydWN0dXJlIGRlZmluaXRpb24NCi0gKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICB1aW50MzJfdCBJZFR5cGU7IC8qITwgU3BlY2lmaWVzIHRoZSBpZGVudGlmaWVyIHR5cGUuDQotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBGRENBTl9pZF90eXBlICovDQotDQotICB1aW50MzJfdCBGaWx0ZXJJbmRleDsgLyohPCBTcGVjaWZpZXMgdGhlIGZpbHRlciB3aGljaCB3aWxsIGJlIGluaXRpYWxpemVkLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMCBhbmQgKFNSQU1DQU5fRkxTX05CUi0xKSwgaWYgSWRUeXBlIGlzDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRDQU5fU1RBTkRBUkRfSUQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDAgYW5kIChTUkFNQ0FOX0ZMRV9OQlItMSksIGlmIElkVHlwZSBpcw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZEQ0FOX0VYVEVOREVEX0lEICovDQotDQotICB1aW50MzJfdA0KLSAgICAgIEZpbHRlclR5cGU7IC8qITwgU3BlY2lmaWVzIHRoZSBmaWx0ZXIgdHlwZS4NCi0gICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRkRDQU5fZmlsdGVyX3R5cGUuDQotICAgICAgICAgICAgICAgICAgICAgICBUaGUgdmFsdWUgRkRDQU5fRklMVEVSX1JBTkdFX05PX0VJRE0gaXMgcGVybWl0dGVkDQotICAgICAgICAgICAgICAgICAgICAgICBvbmx5IHdoZW4gSWRUeXBlIGlzIEZEQ0FOX0VYVEVOREVEX0lELiAqLw0KLQ0KLSAgdWludDMyX3QgRmlsdGVyQ29uZmlnOyAvKiE8IFNwZWNpZmllcyB0aGUgZmlsdGVyIGNvbmZpZ3VyYXRpb24uDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRENBTl9maWx0ZXJfY29uZmlnICovDQotDQotICB1aW50MzJfdA0KLSAgICAgIEZpbHRlcklEMTsgLyohPCBTcGVjaWZpZXMgdGhlIGZpbHRlciBpZGVudGlmaWNhdGlvbiAxLg0KLSAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW46DQotICAgICAgICAgICAgICAgICAgICAgICAtIDAgYW5kIDB4N0ZGLCBpZiBJZFR5cGUgaXMgRkRDQU5fU1RBTkRBUkRfSUQNCi0gICAgICAgICAgICAgICAgICAgICAgIC0gMCBhbmQgMHgxRkZGRkZGRiwgaWYgSWRUeXBlIGlzIEZEQ0FOX0VYVEVOREVEX0lEICovDQotDQotICB1aW50MzJfdA0KLSAgICAgIEZpbHRlcklEMjsgLyohPCBTcGVjaWZpZXMgdGhlIGZpbHRlciBpZGVudGlmaWNhdGlvbiAyLg0KLSAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW46DQotICAgICAgICAgICAgICAgICAgICAgICAtIDAgYW5kIDB4N0ZGLCBpZiBJZFR5cGUgaXMgRkRDQU5fU1RBTkRBUkRfSUQNCi0gICAgICAgICAgICAgICAgICAgICAgIC0gMCBhbmQgMHgxRkZGRkZGRiwgaWYgSWRUeXBlIGlzIEZEQ0FOX0VYVEVOREVEX0lEICovDQotDQotfSBGRENBTl9GaWx0ZXJUeXBlRGVmOw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRkRDQU4gVHggaGVhZGVyIHN0cnVjdHVyZSBkZWZpbml0aW9uDQotICovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgdWludDMyX3QNCi0gICAgICBJZGVudGlmaWVyOyAvKiE8IFNwZWNpZmllcyB0aGUgaWRlbnRpZmllci4NCi0gICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbjoNCi0gICAgICAgICAgICAgICAgICAgICAgICAtIDAgYW5kIDB4N0ZGLCBpZiBJZFR5cGUgaXMgRkRDQU5fU1RBTkRBUkRfSUQNCi0gICAgICAgICAgICAgICAgICAgICAgICAtIDAgYW5kIDB4MUZGRkZGRkYsIGlmIElkVHlwZSBpcyBGRENBTl9FWFRFTkRFRF9JRCAqLw0KLQ0KLSAgdWludDMyX3QNCi0gICAgICBJZFR5cGU7IC8qITwgU3BlY2lmaWVzIHRoZSBpZGVudGlmaWVyIHR5cGUgZm9yIHRoZSBtZXNzYWdlIHRoYXQgd2lsbCBiZQ0KLSAgICAgICAgICAgICAgICAgICB0cmFuc21pdHRlZC4NCi0gICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBGRENBTl9pZF90eXBlICovDQotDQotICB1aW50MzJfdCBUeEZyYW1lVHlwZTsgLyohPCBTcGVjaWZpZXMgdGhlIGZyYW1lIHR5cGUgb2YgdGhlIG1lc3NhZ2UgdGhhdCB3aWxsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgdHJhbnNtaXR0ZWQuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGRENBTl9mcmFtZV90eXBlICAgICAgICAgICAgKi8NCi0NCi0gIHVpbnQzMl90IERhdGFMZW5ndGg7IC8qITwgU3BlY2lmaWVzIHRoZSBsZW5ndGggb2YgdGhlIGZyYW1lIHRoYXQgd2lsbCBiZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNtaXR0ZWQuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZEQ0FOX2RhdGFfbGVuZ3RoX2NvZGUgICAgICovDQotDQotICB1aW50MzJfdCBFcnJvclN0YXRlSW5kaWNhdG9yOyAvKiE8IFNwZWNpZmllcyB0aGUgZXJyb3Igc3RhdGUgaW5kaWNhdG9yLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRENBTl9lcnJvcl9zdGF0ZV9pbmRpY2F0b3IgKi8NCi0NCi0gIHVpbnQzMl90IEJpdFJhdGVTd2l0Y2g7IC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIFR4IGZyYW1lIHdpbGwgYmUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbWl0dGVkIHdpdGggb3Igd2l0aG91dCBiaXQgcmF0ZSBzd2l0Y2hpbmcuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZEQ0FOX2JpdF9yYXRlX3N3aXRjaGluZyAgICAqLw0KLQ0KLSAgdWludDMyX3QgRkRGb3JtYXQ7IC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIFR4IGZyYW1lIHdpbGwgYmUgdHJhbnNtaXR0ZWQgaW4NCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc2ljIG9yIEZEIGZvcm1hdC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YNCi0gICAgICAgICAgICAgICAgICAgICAgICBAcmVmIEZEQ0FOX2Zvcm1hdCAgICAgICAgICAgICAgICAqLw0KLQ0KLSAgdWludDMyX3QgVHhFdmVudEZpZm9Db250cm9sOyAvKiE8IFNwZWNpZmllcyB0aGUgZXZlbnQgRklGTyBjb250cm9sLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRDQU5fRUZDICAgICAgICAgICAgICAgICAgICovDQotDQotICB1aW50MzJfdCBNZXNzYWdlTWFya2VyOyAvKiE8IFNwZWNpZmllcyB0aGUgbWVzc2FnZSBtYXJrZXIgdG8gYmUgY29waWVkIGludG8gVHgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50IEZJRk8gZWxlbWVudCBmb3IgaWRlbnRpZmljYXRpb24gb2YgVHggbWVzc2FnZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLiBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gMA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIDB4RkYgICAgICAgICAgICAgICAgKi8NCi0NCi19IEZEQ0FOX1R4SGVhZGVyVHlwZURlZjsNCi0NCi0vKioNCi0gKiBAYnJpZWYgIEZEQ0FOIFJ4IGhlYWRlciBzdHJ1Y3R1cmUgZGVmaW5pdGlvbg0KLSAqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gIHVpbnQzMl90DQotICAgICAgSWRlbnRpZmllcjsgLyohPCBTcGVjaWZpZXMgdGhlIGlkZW50aWZpZXIuDQotICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW46DQotICAgICAgICAgICAgICAgICAgICAgICAgLSAwIGFuZCAweDdGRiwgaWYgSWRUeXBlIGlzIEZEQ0FOX1NUQU5EQVJEX0lEDQotICAgICAgICAgICAgICAgICAgICAgICAgLSAwIGFuZCAweDFGRkZGRkZGLCBpZiBJZFR5cGUgaXMgRkRDQU5fRVhURU5ERURfSUQgKi8NCi0NCi0gIHVpbnQzMl90IElkVHlwZTsgLyohPCBTcGVjaWZpZXMgdGhlIGlkZW50aWZpZXIgdHlwZSBvZiB0aGUgcmVjZWl2ZWQgbWVzc2FnZS4NCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEZEQ0FOX2lkX3R5cGUgKi8NCi0NCi0gIHVpbnQzMl90IFJ4RnJhbWVUeXBlOyAvKiE8IFNwZWNpZmllcyB0aGUgdGhlIHJlY2VpdmVkIG1lc3NhZ2UgZnJhbWUgdHlwZS4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGRENBTl9mcmFtZV90eXBlICAgICAgICAgICAgKi8NCi0NCi0gIHVpbnQzMl90IERhdGFMZW5ndGg7IC8qITwgU3BlY2lmaWVzIHRoZSByZWNlaXZlZCBmcmFtZSBsZW5ndGguDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgICBGRENBTl9kYXRhX2xlbmd0aF9jb2RlICAgICAqLw0KLQ0KLSAgdWludDMyX3QgRXJyb3JTdGF0ZUluZGljYXRvcjsgLyohPCBTcGVjaWZpZXMgdGhlIGVycm9yIHN0YXRlIGluZGljYXRvci4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRDQU5fZXJyb3Jfc3RhdGVfaW5kaWNhdG9yICovDQotDQotICB1aW50MzJfdCBCaXRSYXRlU3dpdGNoOyAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBSeCBmcmFtZSBpcyByZWNlaXZlZCB3aXRoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciB3aXRob3V0IGJpdCByYXRlIHN3aXRjaGluZy4gVGhpcyBwYXJhbWV0ZXIgY2FuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBhIHZhbHVlIG9mIEByZWYgRkRDQU5fYml0X3JhdGVfc3dpdGNoaW5nICAgICovDQotDQotICB1aW50MzJfdA0KLSAgICAgIEZERm9ybWF0OyAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBSeCBmcmFtZSBpcyByZWNlaXZlZCBpbiBjbGFzc2ljIG9yIEZEDQotICAgICAgICAgICAgICAgICAgICAgZm9ybWF0Lg0KLSAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRkRDQU5fZm9ybWF0ICovDQotDQotICB1aW50MzJfdCBSeFRpbWVzdGFtcDsgLyohPCBTcGVjaWZpZXMgdGhlIHRpbWVzdGFtcCBjb3VudGVyIHZhbHVlIGNhcHR1cmVkIG9uDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgb2YgZnJhbWUgcmVjZXB0aW9uLiBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGENCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgYmV0d2VlbiAwIGFuZCAweEZGRkYgICAgICAgICAgICAgICovDQotDQotICB1aW50MzJfdA0KLSAgICAgIEZpbHRlckluZGV4OyAvKiE8IFNwZWNpZmllcyB0aGUgaW5kZXggb2YgbWF0Y2hpbmcgUnggYWNjZXB0YW5jZSBmaWx0ZXINCi0gICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC4gVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAtIDAgYW5kIChTUkFNQ0FOX0ZMU19OQlItMSksIGlmIElkVHlwZSBpcw0KLSAgICAgICAgICAgICAgICAgICAgICBGRENBTl9TVEFOREFSRF9JRA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAtIDAgYW5kIChTUkFNQ0FOX0ZMRV9OQlItMSksIGlmIElkVHlwZSBpcw0KLSAgICAgICAgICAgICAgICAgICAgICBGRENBTl9FWFRFTkRFRF9JRCAqLw0KLQ0KLSAgdWludDMyX3QgSXNGaWx0ZXJNYXRjaGluZ0ZyYW1lOyAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBhY2NlcHRlZCBmcmFtZSBkaWQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IG1hdGNoIGFueSBSeCBmaWx0ZXIuIEFjY2VwdGFuY2Ugb2YNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uLW1hdGNoaW5nIGZyYW1lcyBtYXkgYmUgZW5hYmxlZCB2aWENCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9GRENBTl9Db25maWdHbG9iYWxGaWx0ZXIoKS4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSAwIG9yIDEgKi8NCi0NCi19IEZEQ0FOX1J4SGVhZGVyVHlwZURlZjsNCi0NCi0vKioNCi0gKiBAYnJpZWYgIEZEQ0FOIFR4IGV2ZW50IEZJRk8gc3RydWN0dXJlIGRlZmluaXRpb24NCi0gKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICB1aW50MzJfdA0KLSAgICAgIElkZW50aWZpZXI7IC8qITwgU3BlY2lmaWVzIHRoZSBpZGVudGlmaWVyLg0KLSAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuOg0KLSAgICAgICAgICAgICAgICAgICAgICAgIC0gMCBhbmQgMHg3RkYsIGlmIElkVHlwZSBpcyBGRENBTl9TVEFOREFSRF9JRA0KLSAgICAgICAgICAgICAgICAgICAgICAgIC0gMCBhbmQgMHgxRkZGRkZGRiwgaWYgSWRUeXBlIGlzIEZEQ0FOX0VYVEVOREVEX0lEICovDQotDQotICB1aW50MzJfdA0KLSAgICAgIElkVHlwZTsgLyohPCBTcGVjaWZpZXMgdGhlIGlkZW50aWZpZXIgdHlwZSBmb3IgdGhlIHRyYW5zbWl0dGVkIG1lc3NhZ2UuDQotICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRkRDQU5faWRfdHlwZSAqLw0KLQ0KLSAgdWludDMyX3QgVHhGcmFtZVR5cGU7IC8qITwgU3BlY2lmaWVzIHRoZSBmcmFtZSB0eXBlIG9mIHRoZSB0cmFuc21pdHRlZA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGRENBTl9mcmFtZV90eXBlICAgICAgICAgICAgKi8NCi0NCi0gIHVpbnQzMl90IERhdGFMZW5ndGg7IC8qITwgU3BlY2lmaWVzIHRoZSBsZW5ndGggb2YgdGhlIHRyYW5zbWl0dGVkIGZyYW1lLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgICBGRENBTl9kYXRhX2xlbmd0aF9jb2RlICAgICAgKi8NCi0NCi0gIHVpbnQzMl90IEVycm9yU3RhdGVJbmRpY2F0b3I7IC8qITwgU3BlY2lmaWVzIHRoZSBlcnJvciBzdGF0ZSBpbmRpY2F0b3IuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZEQ0FOX2Vycm9yX3N0YXRlX2luZGljYXRvciAqLw0KLQ0KLSAgdWludDMyX3QgQml0UmF0ZVN3aXRjaDsgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgVHggZnJhbWUgaXMgdHJhbnNtaXR0ZWQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggb3Igd2l0aG91dCBiaXQgcmF0ZSBzd2l0Y2hpbmcuIFRoaXMgcGFyYW1ldGVyDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEZEQ0FOX2JpdF9yYXRlX3N3aXRjaGluZyAqLw0KLQ0KLSAgdWludDMyX3QgRkRGb3JtYXQ7IC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIFR4IGZyYW1lIGlzIHRyYW5zbWl0dGVkIGluDQotICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NpYyBvciBGRCBmb3JtYXQuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mDQotICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBGRENBTl9mb3JtYXQgICAgICAgICAgICAgICAgKi8NCi0NCi0gIHVpbnQzMl90IFR4VGltZXN0YW1wOyAvKiE8IFNwZWNpZmllcyB0aGUgdGltZXN0YW1wIGNvdW50ZXIgdmFsdWUgY2FwdHVyZWQgb24NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCBvZiBmcmFtZSB0cmFuc21pc3Npb24uIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciBiZXR3ZWVuIDAgYW5kIDB4RkZGRiAgICAgICAgICAgICAgKi8NCi0NCi0gIHVpbnQzMl90IE1lc3NhZ2VNYXJrZXI7IC8qITwgU3BlY2lmaWVzIHRoZSBtZXNzYWdlIG1hcmtlciBjb3BpZWQgaW50byBUeCBFdmVudA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklGTyBlbGVtZW50IGZvciBpZGVudGlmaWNhdGlvbiBvZiBUeCBtZXNzYWdlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiAwDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgMHhGRiAgICAgICAgICAgICAgICAqLw0KLQ0KLSAgdWludDMyX3QNCi0gICAgICBFdmVudFR5cGU7IC8qITwgU3BlY2lmaWVzIHRoZSBldmVudCB0eXBlLg0KLSAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEZEQ0FOX2V2ZW50X3R5cGUgKi8NCi0NCi19IEZEQ0FOX1R4RXZlbnRGaWZvVHlwZURlZjsNCi0NCi0vKioNCi0gKiBAYnJpZWYgIEZEQ0FOIEhpZ2ggUHJpb3JpdHkgTWVzc2FnZSBTdGF0dXMgc3RydWN0dXJlIGRlZmluaXRpb24NCi0gKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICB1aW50MzJfdCBGaWx0ZXJMaXN0OyAvKiE8IFNwZWNpZmllcyB0aGUgZmlsdGVyIGxpc3Qgb2YgdGhlIG1hdGNoaW5nIGZpbHRlcg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAwIDogU3RhbmRhcmQgRmlsdGVyIExpc3QNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMSA6IEV4dGVuZGVkIEZpbHRlciBMaXN0ICovDQotDQotICB1aW50MzJfdCBGaWx0ZXJJbmRleDsgLyohPCBTcGVjaWZpZXMgdGhlIGluZGV4IG9mIG1hdGNoaW5nIGZpbHRlciBlbGVtZW50Lg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgbnVtYmVyIGJldHdlZW46DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDAgYW5kIChTUkFNQ0FOX0ZMU19OQlItMSksIGlmIEZpbHRlckxpc3QgaXMgMA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdGFuZGFyZCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMCBhbmQgKFNSQU1DQU5fRkxFX05CUi0xKSwgaWYgRmlsdGVyTGlzdCBpcyAxDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKEV4dGVuZGVkKSAqLw0KLQ0KLSAgdWludDMyX3QgTWVzc2FnZVN0b3JhZ2U7IC8qITwgU3BlY2lmaWVzIHRoZSBIUCBNZXNzYWdlIFN0b3JhZ2UuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRDQU5faHBfbXNnX3N0b3JhZ2UgKi8NCi0NCi0gIHVpbnQzMl90IE1lc3NhZ2VJbmRleDsgLyohPCBTcGVjaWZpZXMgdGhlIEluZGV4IG9mIFJ4IEZJRk8gZWxlbWVudCB0byB3aGljaA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWVzc2FnZSB3YXMgc3RvcmVkLiBUaGlzIHBhcmFtZXRlciBpcyB2YWxpZCBvbmx5DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gTWVzc2FnZVN0b3JhZ2UgaXM6IEZEQ0FOX0hQX1NUT1JBR0VfUlhGSUZPMCBvcg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRDQU5fSFBfU1RPUkFHRV9SWEZJRk8xICovDQotDQotfSBGRENBTl9IcE1zZ1N0YXR1c1R5cGVEZWY7DQotDQotLyoqDQotICogQGJyaWVmIEZEQ0FOIFByb3RvY29sIFN0YXR1cyBzdHJ1Y3R1cmUgZGVmaW5pdGlvbg0KLSAqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gIHVpbnQzMl90IExhc3RFcnJvckNvZGU7IC8qITwgU3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRoZSBsYXN0IGVycm9yIHRoYXQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9jY3VycmVkIG9uIHRoZSBGRENBTiBidXMuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBvZiBAcmVmIEZEQ0FOX3Byb3RvY29sX2Vycm9yX2NvZGUgKi8NCi0NCi0gIHVpbnQzMl90IERhdGFMYXN0RXJyb3JDb2RlOyAvKiE8IFNwZWNpZmllcyB0aGUgdHlwZSBvZiB0aGUgbGFzdCBlcnJvciB0aGF0DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2NjdXJyZWQgaW4gdGhlIGRhdGEgcGhhc2Ugb2YgYSBDQU4gRkQgZm9ybWF0DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUgd2l0aCBpdHMgQlJTIGZsYWcgc2V0LiBUaGlzIHBhcmFtZXRlciBjYW4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBhIHZhbHVlIG9mIEByZWYgRkRDQU5fcHJvdG9jb2xfZXJyb3JfY29kZSAqLw0KLQ0KLSAgdWludDMyX3QgQWN0aXZpdHk7IC8qITwgU3BlY2lmaWVzIHRoZSBGRENBTiBtb2R1bGUgY29tbXVuaWNhdGlvbiBzdGF0ZS4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICBGRENBTl9jb21tdW5pY2F0aW9uX3N0YXRlICovDQotDQotICB1aW50MzJfdCBFcnJvclBhc3NpdmU7IC8qITwgU3BlY2lmaWVzIHRoZSBGRENBTiBtb2R1bGUgZXJyb3Igc3RhdHVzLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAwIDogVGhlIEZEQ0FOIGlzIGluIEVycm9yX0FjdGl2ZSBzdGF0ZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDEgOiBUaGUgRkRDQU4gaXMgaW4gRXJyb3JfUGFzc2l2ZSBzdGF0ZSAqLw0KLQ0KLSAgdWludDMyX3QgV2FybmluZzsgLyohPCBTcGVjaWZpZXMgdGhlIEZEQ0FOIG1vZHVsZSB3YXJuaW5nIHN0YXR1cy4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgLSAwIDogZXJyb3IgY291bnRlcnMgKFJ4RXJyb3JDbnQgYW5kIFR4RXJyb3JDbnQpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgYmVsb3cgdGhlIEVycm9yX1dhcm5pbmcgbGltaXQgb2YgOTYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC0gMSA6IGF0IGxlYXN0IG9uZSBvZiBlcnJvciBjb3VudGVycyBoYXMgcmVhY2hlZCB0aGUNCi0gICAgICAgICAgICAgICAgICAgICAgIEVycm9yX1dhcm5pbmcgbGltaXQgb2YgOTYgKi8NCi0NCi0gIHVpbnQzMl90IEJ1c09mZjsgLyohPCBTcGVjaWZpZXMgdGhlIEZEQ0FOIG1vZHVsZSBCdXNfT2ZmIHN0YXR1cy4NCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6DQotICAgICAgICAgICAgICAgICAgICAgICAgIC0gMCA6IFRoZSBGRENBTiBpcyBub3QgaW4gQnVzX09mZiBzdGF0ZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAtIDEgOiBUaGUgRkRDQU4gaXMgaW4gQnVzX09mZiBzdGF0ZSAqLw0KLQ0KLSAgdWludDMyX3QgUnhFU0lmbGFnOyAvKiE8IFNwZWNpZmllcyBFU0kgZmxhZyBvZiBsYXN0IHJlY2VpdmVkIENBTiBGRCBtZXNzYWdlLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAwIDogTGFzdCByZWNlaXZlZCBDQU4gRkQgbWVzc2FnZSBkaWQgbm90IGhhdmUgaXRzDQotICAgICAgICAgICAgICAgICAgICAgICAgIEVTSSBmbGFnIHNldA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDEgOiBMYXN0IHJlY2VpdmVkIENBTiBGRCBtZXNzYWdlIGhhZCBpdHMgRVNJIGZsYWcNCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2V0ICovDQotDQotICB1aW50MzJfdCBSeEJSU2ZsYWc7IC8qITwgU3BlY2lmaWVzIEJSUyBmbGFnIG9mIGxhc3QgcmVjZWl2ZWQgQ0FOIEZEIG1lc3NhZ2UuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDAgOiBMYXN0IHJlY2VpdmVkIENBTiBGRCBtZXNzYWdlIGRpZCBub3QgaGF2ZSBpdHMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgQlJTIGZsYWcgc2V0DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMSA6IExhc3QgcmVjZWl2ZWQgQ0FOIEZEIG1lc3NhZ2UgaGFkIGl0cyBCUlMgZmxhZw0KLSAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgKi8NCi0NCi0gIHVpbnQzMl90DQotICAgICAgUnhGREZmbGFnOyAvKiE8IFNwZWNpZmllcyBpZiBDQU4gRkQgbWVzc2FnZSAoRkRGIGZsYWcgc2V0KSBoYXMgYmVlbg0KLSAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZWQgc2luY2UgbGFzdCBwcm90b2NvbCBzdGF0dXMuVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOg0KLSAgICAgICAgICAgICAgICAgICAgICAgLSAwIDogTm8gQ0FOIEZEIG1lc3NhZ2UgcmVjZWl2ZWQNCi0gICAgICAgICAgICAgICAgICAgICAgIC0gMSA6IENBTiBGRCBtZXNzYWdlIHJlY2VpdmVkICovDQotDQotICB1aW50MzJfdCBQcm90b2NvbEV4Y2VwdGlvbjsgLyohPCBTcGVjaWZpZXMgdGhlIEZEQ0FOIG1vZHVsZSBQcm90b2NvbCBFeGNlcHRpb24NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDAgOiBObyBwcm90b2NvbCBleGNlcHRpb24gZXZlbnQgb2NjdXJyZWQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5jZSBsYXN0IHJlYWQgYWNjZXNzDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxIDogUHJvdG9jb2wgZXhjZXB0aW9uIGV2ZW50IG9jY3VycmVkICovDQotDQotICB1aW50MzJfdCBUREN2YWx1ZTsgLyohPCBTcGVjaWZpZXMgdGhlIFRyYW5zbWl0dGVyIERlbGF5IENvbXBlbnNhdGlvbiBWYWx1ZS4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEyNyAqLw0KLQ0KLX0gRkRDQU5fUHJvdG9jb2xTdGF0dXNUeXBlRGVmOw0KLQ0KLS8qKg0KLSAqIEBicmllZiBGRENBTiBFcnJvciBDb3VudGVycyBzdHJ1Y3R1cmUgZGVmaW5pdGlvbg0KLSAqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gIHVpbnQzMl90IFR4RXJyb3JDbnQ7IC8qITwgU3BlY2lmaWVzIHRoZSBUcmFuc21pdCBFcnJvciBDb3VudGVyIFZhbHVlLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAyNTUgKi8NCi0NCi0gIHVpbnQzMl90IFJ4RXJyb3JDbnQ7IC8qITwgU3BlY2lmaWVzIHRoZSBSZWNlaXZlIEVycm9yIENvdW50ZXIgVmFsdWUuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEyNyAqLw0KLQ0KLSAgdWludDMyX3QNCi0gICAgICBSeEVycm9yUGFzc2l2ZTsgLyohPCBTcGVjaWZpZXMgdGhlIFJlY2VpdmUgRXJyb3IgUGFzc2l2ZSBzdGF0dXMuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDAgOiBUaGUgUmVjZWl2ZSBFcnJvciBDb3VudGVyIChSeEVycm9yQ250KSBpcw0KLSAgICAgICAgICAgICAgICAgICAgICAgICBiZWxvdyB0aGUgZXJyb3IgcGFzc2l2ZSBsZXZlbCBvZiAxMjgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxIDogVGhlIFJlY2VpdmUgRXJyb3IgQ291bnRlciAoUnhFcnJvckNudCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzIHJlYWNoZWQgdGhlIGVycm9yIHBhc3NpdmUgbGV2ZWwgb2YgMTI4ICovDQotDQotICB1aW50MzJfdA0KLSAgICAgIEVycm9yTG9nZ2luZzsgLyohPCBTcGVjaWZpZXMgdGhlIFRyYW5zbWl0L1JlY2VpdmUgZXJyb3IgbG9nZ2luZyBjb3VudGVyDQotICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMjU1Lg0KLSAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGNvdW50ZXIgaXMgaW5jcmVtZW50ZWQgZWFjaCB0aW1lIHdoZW4gYSBGRENBTg0KLSAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2wgZXJyb3IgY2F1c2VzIHRoZSBUeEVycm9yQ250IG9yIHRoZSBSeEVycm9yQ250IHRvDQotICAgICAgICAgICAgICAgICAgICAgICBiZSBpbmNyZW1lbnRlZC4gVGhlIGNvdW50ZXIgc3RvcHMgYXQgMjU1OyB0aGUgbmV4dA0KLSAgICAgICAgICAgICAgICAgICAgICAgaW5jcmVtZW50IG9mIFR4RXJyb3JDbnQgb3IgUnhFcnJvckNudCBzZXRzIGludGVycnVwdCBmbGFnDQotICAgICAgICAgICAgICAgICAgICAgICBGRENBTl9GTEFHX0VSUk9SX0xPR0dJTkdfT1ZFUkZMT1cgKi8NCi0NCi19IEZEQ0FOX0Vycm9yQ291bnRlcnNUeXBlRGVmOw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRkRDQU4gTWVzc2FnZSBSQU0gYmxvY2tzDQotICovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgdWludDMyX3QNCi0gICAgICBTdGFuZGFyZEZpbHRlclNBOyAvKiE8IFNwZWNpZmllcyB0aGUgU3RhbmRhcmQgRmlsdGVyIExpc3QgU3RhcnQgQWRkcmVzcy4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSAzMi1iaXQgd29yZCBhZGRyZXNzICovDQotDQotICB1aW50MzJfdA0KLSAgICAgIEV4dGVuZGVkRmlsdGVyU0E7IC8qITwgU3BlY2lmaWVzIHRoZSBFeHRlbmRlZCBGaWx0ZXIgTGlzdCBTdGFydCBBZGRyZXNzLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIDMyLWJpdCB3b3JkIGFkZHJlc3MgKi8NCi0NCi0gIHVpbnQzMl90IFJ4RklGTzBTQTsgLyohPCBTcGVjaWZpZXMgdGhlIFJ4IEZJRk8gMCBTdGFydCBBZGRyZXNzLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSAzMi1iaXQgd29yZCBhZGRyZXNzICAgICAgKi8NCi0NCi0gIHVpbnQzMl90IFJ4RklGTzFTQTsgLyohPCBTcGVjaWZpZXMgdGhlIFJ4IEZJRk8gMSBTdGFydCBBZGRyZXNzLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSAzMi1iaXQgd29yZCBhZGRyZXNzICAgICAgKi8NCi0NCi0gIHVpbnQzMl90IFR4RXZlbnRGSUZPU0E7IC8qITwgU3BlY2lmaWVzIHRoZSBUeCBFdmVudCBGSUZPIFN0YXJ0IEFkZHJlc3MuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSAzMi1iaXQgd29yZCBhZGRyZXNzICovDQotDQotICB1aW50MzJfdCBUeEZJRk9RU0E7IC8qITwgU3BlY2lmaWVzIHRoZSBUeCBGSUZPL1F1ZXVlIFN0YXJ0IEFkZHJlc3MuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIDMyLWJpdCB3b3JkIGFkZHJlc3MgICAgICAqLw0KLQ0KLX0gRkRDQU5fTXNnUmFtQWRkcmVzc1R5cGVEZWY7DQotDQotLyoqDQotICogQGJyaWVmICBGRENBTiBoYW5kbGUgc3RydWN0dXJlIGRlZmluaXRpb24NCi0gKi8NCi0jaWYgVVNFX0hBTF9GRENBTl9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMQ0KLXR5cGVkZWYgc3RydWN0IF9fRkRDQU5fSGFuZGxlVHlwZURlZg0KLSNlbHNlDQotdHlwZWRlZiBzdHJ1Y3QNCi0jZW5kaWYgLyogVVNFX0hBTF9GRENBTl9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi17DQotICBGRENBTl9HbG9iYWxUeXBlRGVmICpJbnN0YW5jZTsgLyohPCBSZWdpc3RlciBiYXNlIGFkZHJlc3MgICAgICovDQotDQotICBGRENBTl9Jbml0VHlwZURlZiBJbml0OyAvKiE8IEZEQ0FOIHJlcXVpcmVkIHBhcmFtZXRlcnMgKi8NCi0NCi0gIEZEQ0FOX01zZ1JhbUFkZHJlc3NUeXBlRGVmIG1zZ1JhbTsgLyohPCBGRENBTiBNZXNzYWdlIFJBTSBibG9ja3MgICovDQotDQotICB1aW50MzJfdCBMYXRlc3RUeEZpZm9RUmVxdWVzdDsgLyohPCBGRENBTiBUeCBidWZmZXIgaW5kZXgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgbGF0ZXN0IFR4IEZJRk8vUXVldWUgcmVxdWVzdCAqLw0KLQ0KLSAgX19JTyBIQUxfRkRDQU5fU3RhdGVUeXBlRGVmIFN0YXRlOyAvKiE8IEZEQ0FOIGNvbW11bmljYXRpb24gc3RhdGUgKi8NCi0NCi0gIEhBTF9Mb2NrVHlwZURlZiBMb2NrOyAvKiE8IEZEQ0FOIGxvY2tpbmcgb2JqZWN0ICAgICAgKi8NCi0NCi0gIF9fSU8gdWludDMyX3QgRXJyb3JDb2RlOyAvKiE8IEZEQ0FOIEVycm9yIGNvZGUgICAgICAgICAgKi8NCi0NCi0jaWYgVVNFX0hBTF9GRENBTl9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMQ0KLSAgdm9pZCAoKlR4RXZlbnRGaWZvQ2FsbGJhY2spKA0KLSAgICAgIHN0cnVjdCBfX0ZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwNCi0gICAgICB1aW50MzJfdCBUeEV2ZW50Rmlmb0lUcyk7IC8qITwgRkRDQU4gVHggRXZlbnQgRmlmbyBjYWxsYmFjayAgICAgICAgICovDQotICB2b2lkICgqUnhGaWZvMENhbGxiYWNrKShzdHJ1Y3QgX19GRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4sDQotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBSeEZpZm8wSVRzKTsgLyohPCBGRENBTiBSeCBGaWZvIDAgY2FsbGJhY2sgKi8NCi0gIHZvaWQgKCpSeEZpZm8xQ2FsbGJhY2spKHN0cnVjdCBfX0ZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFJ4RmlmbzFJVHMpOyAvKiE8IEZEQ0FOIFJ4IEZpZm8gMSBjYWxsYmFjayAqLw0KLSAgdm9pZCAoKlR4Rmlmb0VtcHR5Q2FsbGJhY2spKHN0cnVjdCBfX0ZEQ0FOX0hhbmRsZVR5cGVEZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhmZGNhbik7IC8qITwgRkRDQU4gVHggRmlmbyBFbXB0eSBjYWxsYmFjayAqLw0KLSAgdm9pZCAoKlR4QnVmZmVyQ29tcGxldGVDYWxsYmFjaykoDQotICAgICAgc3RydWN0IF9fRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLA0KLSAgICAgIHVpbnQzMl90IEJ1ZmZlckluZGV4ZXMpOyAvKiE8IEZEQ0FOIFR4IEJ1ZmZlciBjb21wbGV0ZSBjYWxsYmFjayAgICAqLw0KLSAgdm9pZCAoKlR4QnVmZmVyQWJvcnRDYWxsYmFjaykoDQotICAgICAgc3RydWN0IF9fRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLA0KLSAgICAgIHVpbnQzMl90IEJ1ZmZlckluZGV4ZXMpOyAvKiE8IEZEQ0FOIFR4IEJ1ZmZlciBhYm9ydCBjYWxsYmFjayAgICAgICAqLw0KLSAgdm9pZCAoKkhpZ2hQcmlvcml0eU1lc3NhZ2VDYWxsYmFjaykoDQotICAgICAgc3RydWN0IF9fRkRDQU5fSGFuZGxlVHlwZURlZg0KLSAgICAgICAgICAqaGZkY2FuKTsgLyohPCBGRENBTiBIaWdoIHByaW9yaXR5IG1lc3NhZ2UgY2FsbGJhY2sgKi8NCi0gIHZvaWQgKCpUaW1lc3RhbXBXcmFwYXJvdW5kQ2FsbGJhY2spKA0KLSAgICAgIHN0cnVjdCBfX0ZEQ0FOX0hhbmRsZVR5cGVEZWYNCi0gICAgICAgICAgKmhmZGNhbik7IC8qITwgRkRDQU4gVGltZXN0YW1wIHdyYXBhcm91bmQgY2FsbGJhY2sgICovDQotICB2b2lkICgqVGltZW91dE9jY3VycmVkQ2FsbGJhY2spKA0KLSAgICAgIHN0cnVjdCBfX0ZEQ0FOX0hhbmRsZVR5cGVEZWYNCi0gICAgICAgICAgKmhmZGNhbik7IC8qITwgRkRDQU4gVGltZW91dCBvY2N1cnJlZCBjYWxsYmFjayAgICAgICovDQotICB2b2lkICgqRXJyb3JDYWxsYmFjaykoDQotICAgICAgc3RydWN0IF9fRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuKTsgLyohPCBGRENBTiBFcnJvciBjYWxsYmFjayAqLw0KLSAgdm9pZCAoKkVycm9yU3RhdHVzQ2FsbGJhY2spKA0KLSAgICAgIHN0cnVjdCBfX0ZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwNCi0gICAgICB1aW50MzJfdCBFcnJvclN0YXR1c0lUcyk7IC8qITwgRkRDQU4gRXJyb3Igc3RhdHVzIGNhbGxiYWNrICAgICAgICAgICovDQotDQotICB2b2lkICgqTXNwSW5pdENhbGxiYWNrKSgNCi0gICAgICBzdHJ1Y3QgX19GRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pOyAvKiE8IEZEQ0FOIE1zcCBJbml0IGNhbGxiYWNrICovDQotICB2b2lkICgqTXNwRGVJbml0Q2FsbGJhY2spKA0KLSAgICAgIHN0cnVjdCBfX0ZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbik7IC8qITwgRkRDQU4gTXNwIERlSW5pdCBjYWxsYmFjayAqLw0KLQ0KLSNlbmRpZiAvKiBVU0VfSEFMX0ZEQ0FOX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLQ0KLX0gRkRDQU5fSGFuZGxlVHlwZURlZjsNCi0NCi0jaWYgVVNFX0hBTF9GRENBTl9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMQ0KLS8qKg0KLSAqIEBicmllZiAgSEFMIEZEQ0FOIGNvbW1vbiBDYWxsYmFjayBJRCBlbnVtZXJhdGlvbiBkZWZpbml0aW9uDQotICovDQotdHlwZWRlZiBlbnVtIHsNCi0gIEhBTF9GRENBTl9UWF9GSUZPX0VNUFRZX0NCX0lEID0gMHgwMFUsIC8qITwgRkRDQU4gVHggRmlmbyBFbXB0eSBjYWxsYmFjayBJRCAqLw0KLSAgSEFMX0ZEQ0FOX0hJR0hfUFJJT19NRVNTQUdFX0NCX0lEID0NCi0gICAgICAweDAxVSwgLyohPCBGRENBTiBIaWdoIHByaW9yaXR5IG1lc3NhZ2UgY2FsbGJhY2sgSUQgKi8NCi0gIEhBTF9GRENBTl9USU1FU1RBTVBfV1JBUEFST1VORF9DQl9JRCA9DQotICAgICAgMHgwMlUsIC8qITwgRkRDQU4gVGltZXN0YW1wIHdyYXBhcm91bmQgY2FsbGJhY2sgSUQgICovDQotICBIQUxfRkRDQU5fVElNRU9VVF9PQ0NVUlJFRF9DQl9JRCA9DQotICAgICAgMHgwM1UsIC8qITwgRkRDQU4gVGltZW91dCBvY2N1cnJlZCBjYWxsYmFjayBJRCAgICAgICovDQotICBIQUxfRkRDQU5fRVJST1JfQ0FMTEJBQ0tfQ0JfSUQgPSAweDA0VSwgLyohPCBGRENBTiBFcnJvciBjYWxsYmFjayBJRCAqLw0KLQ0KLSAgSEFMX0ZEQ0FOX01TUElOSVRfQ0JfSUQgPSAweDA1VSwgICAvKiE8IEZEQ0FOIE1zcEluaXQgY2FsbGJhY2sgSUQgICAqLw0KLSAgSEFMX0ZEQ0FOX01TUERFSU5JVF9DQl9JRCA9IDB4MDZVLCAvKiE8IEZEQ0FOIE1zcERlSW5pdCBjYWxsYmFjayBJRCAqLw0KLQ0KLX0gSEFMX0ZEQ0FOX0NhbGxiYWNrSURUeXBlRGVmOw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSEFMIEZEQ0FOIENhbGxiYWNrIHBvaW50ZXIgZGVmaW5pdGlvbg0KLSAqLw0KLXR5cGVkZWYgdm9pZCAoKnBGRENBTl9DYWxsYmFja1R5cGVEZWYpKA0KLSAgICBGRENBTl9IYW5kbGVUeXBlRGVmDQotICAgICAgICAqaGZkY2FuKTsgLyohPCBwb2ludGVyIHRvIGEgY29tbW9uIEZEQ0FOIGNhbGxiYWNrIGZ1bmN0aW9uICAgICAgICAgICAqLw0KLXR5cGVkZWYgdm9pZCAoKnBGRENBTl9UeEV2ZW50Rmlmb0NhbGxiYWNrVHlwZURlZikoDQotICAgIEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwNCi0gICAgdWludDMyX3QgVHhFdmVudEZpZm9JVHMpOyAvKiE8IHBvaW50ZXIgdG8gVHggZXZlbnQgRmlmbyBGRENBTiBjYWxsYmFjaw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICAgICAgKi8NCi10eXBlZGVmIHZvaWQgKCpwRkRDQU5fUnhGaWZvMENhbGxiYWNrVHlwZURlZikoDQotICAgIEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwNCi0gICAgdWludDMyX3QgUnhGaWZvMElUcyk7IC8qITwgcG9pbnRlciB0byBSeCBGaWZvIDAgRkRDQU4gY2FsbGJhY2sgZnVuY3Rpb24gKi8NCi10eXBlZGVmIHZvaWQgKCpwRkRDQU5fUnhGaWZvMUNhbGxiYWNrVHlwZURlZikoDQotICAgIEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwNCi0gICAgdWludDMyX3QgUnhGaWZvMUlUcyk7IC8qITwgcG9pbnRlciB0byBSeCBGaWZvIDEgRkRDQU4gY2FsbGJhY2sgZnVuY3Rpb24gKi8NCi10eXBlZGVmIHZvaWQgKCpwRkRDQU5fVHhCdWZmZXJDb21wbGV0ZUNhbGxiYWNrVHlwZURlZikoDQotICAgIEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwNCi0gICAgdWludDMyX3QgQnVmZmVySW5kZXhlcyk7IC8qITwgcG9pbnRlciB0byBUeCBCdWZmZXIgY29tcGxldGUgRkRDQU4gY2FsbGJhY2sNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICovDQotdHlwZWRlZiB2b2lkICgqcEZEQ0FOX1R4QnVmZmVyQWJvcnRDYWxsYmFja1R5cGVEZWYpKA0KLSAgICBGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4sDQotICAgIHVpbnQzMl90IEJ1ZmZlckluZGV4ZXMpOyAvKiE8IHBvaW50ZXIgdG8gVHggQnVmZmVyIGFib3J0IEZEQ0FOIGNhbGxiYWNrDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAgICAqLw0KLXR5cGVkZWYgdm9pZCAoKnBGRENBTl9FcnJvclN0YXR1c0NhbGxiYWNrVHlwZURlZikoDQotICAgIEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwNCi0gICAgdWludDMyX3QgRXJyb3JTdGF0dXNJVHMpOyAvKiE8IHBvaW50ZXIgdG8gRXJyb3IgU3RhdHVzIGNhbGxiYWNrIGZ1bmN0aW9uICovDQotDQotI2VuZGlmIC8qIFVTRV9IQUxfRkRDQU5fUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgRkRDQU5fRXhwb3J0ZWRfQ29uc3RhbnRzIEZEQ0FOIEV4cG9ydGVkIENvbnN0YW50cw0KLSAqIEB7DQotICovDQotDQotLyoqIEBkZWZncm91cCBIQUxfRkRDQU5fRXJyb3JfQ29kZSBIQUwgRkRDQU4gRXJyb3IgQ29kZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBIQUxfRkRDQU5fRVJST1JfTk9ORSAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAvKiE8IE5vIGVycm9yICovDQotI2RlZmluZSBIQUxfRkRDQU5fRVJST1JfVElNRU9VVCAoKHVpbnQzMl90KTB4MDAwMDAwMDFVKSAvKiE8IFRpbWVvdXQgZXJyb3IgKi8NCi0jZGVmaW5lIEhBTF9GRENBTl9FUlJPUl9OT1RfSU5JVElBTElaRUQgXA0KLSAgKCh1aW50MzJfdCkweDAwMDAwMDAyVSkgLyohPCBQZXJpcGhlcmFsIG5vdCBpbml0aWFsaXplZCAqLw0KLSNkZWZpbmUgSEFMX0ZEQ0FOX0VSUk9SX05PVF9SRUFEWSBcDQotICAoKHVpbnQzMl90KTB4MDAwMDAwMDRVKSAvKiE8IFBlcmlwaGVyYWwgbm90IHJlYWR5ICovDQotI2RlZmluZSBIQUxfRkRDQU5fRVJST1JfTk9UX1NUQVJURUQgXA0KLSAgKCh1aW50MzJfdCkweDAwMDAwMDA4VSkgLyohPCBQZXJpcGhlcmFsIG5vdCBzdGFydGVkICovDQotI2RlZmluZSBIQUxfRkRDQU5fRVJST1JfTk9UX1NVUFBPUlRFRCBcDQotICAoKHVpbnQzMl90KTB4MDAwMDAwMTBVKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBNb2RlIG5vdCBzdXBwb3J0ZWQgKi8NCi0jZGVmaW5lIEhBTF9GRENBTl9FUlJPUl9QQVJBTSAoKHVpbnQzMl90KTB4MDAwMDAwMjBVKSAvKiE8IFBhcmFtZXRlciBlcnJvciAqLw0KLSNkZWZpbmUgSEFMX0ZEQ0FOX0VSUk9SX1BFTkRJTkcgXA0KLSAgKCh1aW50MzJfdCkweDAwMDAwMDQwVSkgLyohPCBQZW5kaW5nIG9wZXJhdGlvbiAqLw0KLSNkZWZpbmUgSEFMX0ZEQ0FOX0VSUk9SX1JBTV9BQ0NFU1MgXA0KLSAgKCh1aW50MzJfdCkweDAwMDAwMDgwVSkgLyohPCBNZXNzYWdlIFJBTSBBY2Nlc3MgRmFpbHVyZSAqLw0KLSNkZWZpbmUgSEFMX0ZEQ0FOX0VSUk9SX0ZJRk9fRU1QVFkgXA0KLSAgKCh1aW50MzJfdCkweDAwMDAwMTAwVSkgLyohPCBQdXQgZWxlbWVudCBpbiBmdWxsIEZJRk8gKi8NCi0jZGVmaW5lIEhBTF9GRENBTl9FUlJPUl9GSUZPX0ZVTEwgXA0KLSAgKCh1aW50MzJfdCkweDAwMDAwMjAwVSkgLyohPCBHZXQgZWxlbWVudCBmcm9tIGVtcHR5IEZJRk8gKi8NCi0jZGVmaW5lIEhBTF9GRENBTl9FUlJPUl9MT0dfT1ZFUkZMT1cgXA0KLSAgRkRDQU5fSVJfRUxPIC8qITwgT3ZlcmZsb3cgb2YgQ0FOIEVycm9yIExvZ2dpbmcgQ291bnRlciAqLw0KLSNkZWZpbmUgSEFMX0ZEQ0FOX0VSUk9SX1JBTV9XREcgXA0KLSAgRkRDQU5fSVJfV0RJIC8qITwgTWVzc2FnZSBSQU0gV2F0Y2hkb2cgZXZlbnQgb2NjdXJyZWQgKi8NCi0jZGVmaW5lIEhBTF9GRENBTl9FUlJPUl9QUk9UT0NPTF9BUkJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIEZEQ0FOX0lSX1BFQSAvKiE8IFByb3RvY29sIEVycm9yIGluIEFyYml0cmF0aW9uIFBoYXNlIChOb21pbmFsIEJpdCBUaW1lIGlzIFwNCi0gICAgICAgICAgICAgICAgICB1c2VkKSAgICAgICAgICovDQotI2RlZmluZSBIQUxfRkRDQU5fRVJST1JfUFJPVE9DT0xfREFUQSBcDQotICBGRENBTl9JUl9QRUQgLyohPCBQcm90b2NvbCBFcnJvciBpbiBEYXRhIFBoYXNlIChEYXRhIEJpdCBUaW1lIGlzIHVzZWQpICovDQotI2RlZmluZSBIQUxfRkRDQU5fRVJST1JfUkVTRVJWRURfQVJFQSBcDQotICBGRENBTl9JUl9BUkEgLyohPCBBY2Nlc3MgdG8gUmVzZXJ2ZWQgQWRkcmVzcyAqLw0KLQ0KLSNpZiBVU0VfSEFMX0ZEQ0FOX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxDQotI2RlZmluZSBIQUxfRkRDQU5fRVJST1JfSU5WQUxJRF9DQUxMQkFDSyBcDQotICAoKHVpbnQzMl90KTB4MDAwMDAxMDBVKSAvKiE8IEludmFsaWQgQ2FsbGJhY2sgZXJyb3IgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgIC8qIFVTRV9IQUxfRkRDQU5fUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEZEQ0FOX2ZyYW1lX2Zvcm1hdCBGRENBTiBGcmFtZSBGb3JtYXQNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgRkRDQU5fRlJBTUVfQ0xBU1NJQyBcDQotICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAvKiE8IENsYXNzaWMgbW9kZSAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgRkRDQU5fRlJBTUVfRkRfTk9fQlJTIFwNCi0gICgodWludDMyX3QpRkRDQU5fQ0NDUl9GRE9FKSAvKiE8IEZEIG1vZGUgd2l0aG91dCBCaXRSYXRlIFN3aXRjaGluZyAqLw0KLSNkZWZpbmUgRkRDQU5fRlJBTUVfRkRfQlJTICAgICAgXA0KLSAgKCh1aW50MzJfdCkoRkRDQU5fQ0NDUl9GRE9FIHwgXA0KLSAgICAgICAgICAgICAgRkRDQU5fQ0NDUl9CUlNFKSkgLyohPCBGRCBtb2RlIHdpdGggQml0UmF0ZSBTd2l0Y2hpbmcgICAgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRkRDQU5fb3BlcmF0aW5nX21vZGUgRkRDQU4gT3BlcmF0aW5nIE1vZGUNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgRkRDQU5fTU9ERV9OT1JNQUwgXA0KLSAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgLyohPCBOb3JtYWwgbW9kZSAgICAgICAgICAgICAgICovDQotI2RlZmluZSBGRENBTl9NT0RFX1JFU1RSSUNURURfT1BFUkFUSU9OIFwNCi0gICgodWludDMyX3QpMHgwMDAwMDAwMVUpIC8qITwgUmVzdHJpY3RlZCBPcGVyYXRpb24gbW9kZSAqLw0KLSNkZWZpbmUgRkRDQU5fTU9ERV9CVVNfTU9OSVRPUklORyBcDQotICAoKHVpbnQzMl90KTB4MDAwMDAwMDJVKSAvKiE8IEJ1cyBNb25pdG9yaW5nIG1vZGUgICAgICAgKi8NCi0jZGVmaW5lIEZEQ0FOX01PREVfSU5URVJOQUxfTE9PUEJBQ0sgXA0KLSAgKCh1aW50MzJfdCkweDAwMDAwMDAzVSkgLyohPCBJbnRlcm5hbCBMb29wQmFjayBtb2RlICAgICovDQotI2RlZmluZSBGRENBTl9NT0RFX0VYVEVSTkFMX0xPT1BCQUNLIFwNCi0gICgodWludDMyX3QpMHgwMDAwMDAwNFUpIC8qITwgRXh0ZXJuYWwgTG9vcEJhY2sgbW9kZSAgICAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBGRENBTl9jbG9ja19kaXZpZGVyIEZEQ0FOIENsb2NrIERpdmlkZXINCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgRkRDQU5fQ0xPQ0tfRElWMSBcDQotICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAvKiE8IERpdmlkZSBrZXJuZWwgY2xvY2sgYnkgMSAgKi8NCi0jZGVmaW5lIEZEQ0FOX0NMT0NLX0RJVjIgXA0KLSAgKCh1aW50MzJfdCkweDAwMDAwMDAxVSkgLyohPCBEaXZpZGUga2VybmVsIGNsb2NrIGJ5IDIgICovDQotI2RlZmluZSBGRENBTl9DTE9DS19ESVY0IFwNCi0gICgodWludDMyX3QpMHgwMDAwMDAwMlUpIC8qITwgRGl2aWRlIGtlcm5lbCBjbG9jayBieSA0ICAqLw0KLSNkZWZpbmUgRkRDQU5fQ0xPQ0tfRElWNiBcDQotICAoKHVpbnQzMl90KTB4MDAwMDAwMDNVKSAvKiE8IERpdmlkZSBrZXJuZWwgY2xvY2sgYnkgNiAgKi8NCi0jZGVmaW5lIEZEQ0FOX0NMT0NLX0RJVjggXA0KLSAgKCh1aW50MzJfdCkweDAwMDAwMDA0VSkgLyohPCBEaXZpZGUga2VybmVsIGNsb2NrIGJ5IDggICovDQotI2RlZmluZSBGRENBTl9DTE9DS19ESVYxMCBcDQotICAoKHVpbnQzMl90KTB4MDAwMDAwMDVVKSAvKiE8IERpdmlkZSBrZXJuZWwgY2xvY2sgYnkgMTAgKi8NCi0jZGVmaW5lIEZEQ0FOX0NMT0NLX0RJVjEyIFwNCi0gICgodWludDMyX3QpMHgwMDAwMDAwNlUpIC8qITwgRGl2aWRlIGtlcm5lbCBjbG9jayBieSAxMiAqLw0KLSNkZWZpbmUgRkRDQU5fQ0xPQ0tfRElWMTQgXA0KLSAgKCh1aW50MzJfdCkweDAwMDAwMDA3VSkgLyohPCBEaXZpZGUga2VybmVsIGNsb2NrIGJ5IDE0ICovDQotI2RlZmluZSBGRENBTl9DTE9DS19ESVYxNiBcDQotICAoKHVpbnQzMl90KTB4MDAwMDAwMDhVKSAvKiE8IERpdmlkZSBrZXJuZWwgY2xvY2sgYnkgMTYgKi8NCi0jZGVmaW5lIEZEQ0FOX0NMT0NLX0RJVjE4IFwNCi0gICgodWludDMyX3QpMHgwMDAwMDAwOVUpIC8qITwgRGl2aWRlIGtlcm5lbCBjbG9jayBieSAxOCAqLw0KLSNkZWZpbmUgRkRDQU5fQ0xPQ0tfRElWMjAgXA0KLSAgKCh1aW50MzJfdCkweDAwMDAwMDBBVSkgLyohPCBEaXZpZGUga2VybmVsIGNsb2NrIGJ5IDIwICovDQotI2RlZmluZSBGRENBTl9DTE9DS19ESVYyMiBcDQotICAoKHVpbnQzMl90KTB4MDAwMDAwMEJVKSAvKiE8IERpdmlkZSBrZXJuZWwgY2xvY2sgYnkgMjIgKi8NCi0jZGVmaW5lIEZEQ0FOX0NMT0NLX0RJVjI0IFwNCi0gICgodWludDMyX3QpMHgwMDAwMDAwQ1UpIC8qITwgRGl2aWRlIGtlcm5lbCBjbG9jayBieSAyNCAqLw0KLSNkZWZpbmUgRkRDQU5fQ0xPQ0tfRElWMjYgXA0KLSAgKCh1aW50MzJfdCkweDAwMDAwMDBEVSkgLyohPCBEaXZpZGUga2VybmVsIGNsb2NrIGJ5IDI2ICovDQotI2RlZmluZSBGRENBTl9DTE9DS19ESVYyOCBcDQotICAoKHVpbnQzMl90KTB4MDAwMDAwMEVVKSAvKiE8IERpdmlkZSBrZXJuZWwgY2xvY2sgYnkgMjggKi8NCi0jZGVmaW5lIEZEQ0FOX0NMT0NLX0RJVjMwIFwNCi0gICgodWludDMyX3QpMHgwMDAwMDAwRlUpIC8qITwgRGl2aWRlIGtlcm5lbCBjbG9jayBieSAzMCAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBGRENBTl90eEZpZm9RdWV1ZV9Nb2RlIEZEQ0FOIFR4IEZJRk8vUXVldWUgTW9kZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBGRENBTl9UWF9GSUZPX09QRVJBVElPTiAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAvKiE8IEZJRk8gbW9kZSAgKi8NCi0jZGVmaW5lIEZEQ0FOX1RYX1FVRVVFX09QRVJBVElPTiAgICAgICAgICAgICAgXA0KLSAgKCh1aW50MzJfdClGRENBTl9UWEJDX1RGUU0pIC8qITwgUXVldWUgbW9kZSBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEZEQ0FOX2lkX3R5cGUgRkRDQU4gSUQgVHlwZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBGRENBTl9TVEFOREFSRF9JRCAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAvKiE8IFN0YW5kYXJkIElEIGVsZW1lbnQgKi8NCi0jZGVmaW5lIEZEQ0FOX0VYVEVOREVEX0lEICgodWludDMyX3QpMHg0MDAwMDAwMFUpIC8qITwgRXh0ZW5kZWQgSUQgZWxlbWVudCAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBGRENBTl9mcmFtZV90eXBlIEZEQ0FOIEZyYW1lIFR5cGUNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgRkRDQU5fREFUQV9GUkFNRSAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgIC8qITwgRGF0YSBmcmFtZSAgICovDQotI2RlZmluZSBGRENBTl9SRU1PVEVfRlJBTUUgKCh1aW50MzJfdCkweDIwMDAwMDAwVSkgLyohPCBSZW1vdGUgZnJhbWUgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRkRDQU5fZGF0YV9sZW5ndGhfY29kZSBGRENBTiBEYXRhIExlbmd0aCBDb2RlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIEZEQ0FOX0RMQ19CWVRFU18wICgodWludDMyX3QpMHgwMDAwMDAwMFUpICAvKiE8IDAgYnl0ZXMgZGF0YSBmaWVsZCAgKi8NCi0jZGVmaW5lIEZEQ0FOX0RMQ19CWVRFU18xICgodWludDMyX3QpMHgwMDAxMDAwMFUpICAvKiE8IDEgYnl0ZXMgZGF0YSBmaWVsZCAgKi8NCi0jZGVmaW5lIEZEQ0FOX0RMQ19CWVRFU18yICgodWludDMyX3QpMHgwMDAyMDAwMFUpICAvKiE8IDIgYnl0ZXMgZGF0YSBmaWVsZCAgKi8NCi0jZGVmaW5lIEZEQ0FOX0RMQ19CWVRFU18zICgodWludDMyX3QpMHgwMDAzMDAwMFUpICAvKiE8IDMgYnl0ZXMgZGF0YSBmaWVsZCAgKi8NCi0jZGVmaW5lIEZEQ0FOX0RMQ19CWVRFU180ICgodWludDMyX3QpMHgwMDA0MDAwMFUpICAvKiE8IDQgYnl0ZXMgZGF0YSBmaWVsZCAgKi8NCi0jZGVmaW5lIEZEQ0FOX0RMQ19CWVRFU181ICgodWludDMyX3QpMHgwMDA1MDAwMFUpICAvKiE8IDUgYnl0ZXMgZGF0YSBmaWVsZCAgKi8NCi0jZGVmaW5lIEZEQ0FOX0RMQ19CWVRFU182ICgodWludDMyX3QpMHgwMDA2MDAwMFUpICAvKiE8IDYgYnl0ZXMgZGF0YSBmaWVsZCAgKi8NCi0jZGVmaW5lIEZEQ0FOX0RMQ19CWVRFU183ICgodWludDMyX3QpMHgwMDA3MDAwMFUpICAvKiE8IDcgYnl0ZXMgZGF0YSBmaWVsZCAgKi8NCi0jZGVmaW5lIEZEQ0FOX0RMQ19CWVRFU184ICgodWludDMyX3QpMHgwMDA4MDAwMFUpICAvKiE8IDggYnl0ZXMgZGF0YSBmaWVsZCAgKi8NCi0jZGVmaW5lIEZEQ0FOX0RMQ19CWVRFU18xMiAoKHVpbnQzMl90KTB4MDAwOTAwMDBVKSAvKiE8IDEyIGJ5dGVzIGRhdGEgZmllbGQgKi8NCi0jZGVmaW5lIEZEQ0FOX0RMQ19CWVRFU18xNiAoKHVpbnQzMl90KTB4MDAwQTAwMDBVKSAvKiE8IDE2IGJ5dGVzIGRhdGEgZmllbGQgKi8NCi0jZGVmaW5lIEZEQ0FOX0RMQ19CWVRFU18yMCAoKHVpbnQzMl90KTB4MDAwQjAwMDBVKSAvKiE8IDIwIGJ5dGVzIGRhdGEgZmllbGQgKi8NCi0jZGVmaW5lIEZEQ0FOX0RMQ19CWVRFU18yNCAoKHVpbnQzMl90KTB4MDAwQzAwMDBVKSAvKiE8IDI0IGJ5dGVzIGRhdGEgZmllbGQgKi8NCi0jZGVmaW5lIEZEQ0FOX0RMQ19CWVRFU18zMiAoKHVpbnQzMl90KTB4MDAwRDAwMDBVKSAvKiE8IDMyIGJ5dGVzIGRhdGEgZmllbGQgKi8NCi0jZGVmaW5lIEZEQ0FOX0RMQ19CWVRFU180OCAoKHVpbnQzMl90KTB4MDAwRTAwMDBVKSAvKiE8IDQ4IGJ5dGVzIGRhdGEgZmllbGQgKi8NCi0jZGVmaW5lIEZEQ0FOX0RMQ19CWVRFU182NCAoKHVpbnQzMl90KTB4MDAwRjAwMDBVKSAvKiE8IDY0IGJ5dGVzIGRhdGEgZmllbGQgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRkRDQU5fZXJyb3Jfc3RhdGVfaW5kaWNhdG9yIEZEQ0FOIEVycm9yIFN0YXRlIEluZGljYXRvcg0KLSAqIEB7DQotICovDQotI2RlZmluZSBGRENBTl9FU0lfQUNUSVZFIFwNCi0gICgodWludDMyX3QpMHgwMDAwMDAwMFUpIC8qITwgVHJhbnNtaXR0aW5nIG5vZGUgaXMgZXJyb3IgYWN0aXZlICAqLw0KLSNkZWZpbmUgRkRDQU5fRVNJX1BBU1NJVkUgXA0KLSAgKCh1aW50MzJfdCkweDgwMDAwMDAwVSkgLyohPCBUcmFuc21pdHRpbmcgbm9kZSBpcyBlcnJvciBwYXNzaXZlICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEZEQ0FOX2JpdF9yYXRlX3N3aXRjaGluZyBGRENBTiBCaXQgUmF0ZSBTd2l0Y2hpbmcNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgRkRDQU5fQlJTX09GRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgLyohPCBGRENBTiBmcmFtZXMgdHJhbnNtaXR0ZWQvcmVjZWl2ZWQgd2l0aG91dCBiaXQgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZSBzd2l0Y2hpbmcgKi8NCi0jZGVmaW5lIEZEQ0FOX0JSU19PTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKCh1aW50MzJfdCkweDAwMTAwMDAwVSkgLyohPCBGRENBTiBmcmFtZXMgdHJhbnNtaXR0ZWQvcmVjZWl2ZWQgd2l0aCBiaXQgcmF0ZSBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2hpbmcgICAgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRkRDQU5fZm9ybWF0IEZEQ0FOIGZvcm1hdA0KLSAqIEB7DQotICovDQotI2RlZmluZSBGRENBTl9DTEFTU0lDX0NBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgodWludDMyX3QpMHgwMDAwMDAwMFUpIC8qITwgRnJhbWUgdHJhbnNtaXR0ZWQvcmVjZWl2ZWQgaW4gQ2xhc3NpYyBDQU4gXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ICovDQotI2RlZmluZSBGRENBTl9GRF9DQU4gXA0KLSAgKCh1aW50MzJfdCkweDAwMjAwMDAwVSkgLyohPCBGcmFtZSB0cmFuc21pdHRlZC9yZWNlaXZlZCBpbiBGRENBTiBmb3JtYXQgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRkRDQU5fRUZDIEZEQ0FOIEV2ZW50IEZJRk8gY29udHJvbA0KLSAqIEB7DQotICovDQotI2RlZmluZSBGRENBTl9OT19UWF9FVkVOVFMgXA0KLSAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgLyohPCBEbyBub3Qgc3RvcmUgVHggZXZlbnRzICovDQotI2RlZmluZSBGRENBTl9TVE9SRV9UWF9FVkVOVFMgXA0KLSAgKCh1aW50MzJfdCkweDAwODAwMDAwVSkgLyohPCBTdG9yZSBUeCBldmVudHMgICAgICAgICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEZEQ0FOX2ZpbHRlcl90eXBlIEZEQ0FOIEZpbHRlciBUeXBlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIEZEQ0FOX0ZJTFRFUl9SQU5HRSBcDQotICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAvKiE8IFJhbmdlIGZpbHRlciBmcm9tIEZpbHRlcklEMSB0byBGaWx0ZXJJRDIgKi8NCi0jZGVmaW5lIEZEQ0FOX0ZJTFRFUl9EVUFMIFwNCi0gICgodWludDMyX3QpMHgwMDAwMDAwMVUpIC8qITwgRHVhbCBJRCBmaWx0ZXIgZm9yIEZpbHRlcklEMSBvciBGaWx0ZXJJRDIgKi8NCi0jZGVmaW5lIEZEQ0FOX0ZJTFRFUl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKCh1aW50MzJfdCkweDAwMDAwMDAyVSkgLyohPCBDbGFzc2ljIGZpbHRlcjogRmlsdGVySUQxID0gZmlsdGVyLCBGaWx0ZXJJRDIgPSBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrICAgICAgICAgICAgKi8NCi0jZGVmaW5lIEZEQ0FOX0ZJTFRFUl9SQU5HRV9OT19FSURNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKHVpbnQzMl90KTB4MDAwMDAwMDNVKSAvKiE8IFJhbmdlIGZpbHRlciBmcm9tIEZpbHRlcklEMSB0byBGaWx0ZXJJRDIsIEVJRE0gXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzayBub3QgYXBwbGllZCAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBGRENBTl9maWx0ZXJfY29uZmlnIEZEQ0FOIEZpbHRlciBDb25maWd1cmF0aW9uDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIEZEQ0FOX0ZJTFRFUl9ESVNBQkxFIFwNCi0gICgodWludDMyX3QpMHgwMDAwMDAwMFUpIC8qITwgRGlzYWJsZSBmaWx0ZXIgZWxlbWVudCAqLw0KLSNkZWZpbmUgRkRDQU5fRklMVEVSX1RPX1JYRklGTzAgXA0KLSAgKCh1aW50MzJfdCkweDAwMDAwMDAxVSkgLyohPCBTdG9yZSBpbiBSeCBGSUZPIDAgaWYgZmlsdGVyIG1hdGNoZXMgKi8NCi0jZGVmaW5lIEZEQ0FOX0ZJTFRFUl9UT19SWEZJRk8xIFwNCi0gICgodWludDMyX3QpMHgwMDAwMDAwMlUpIC8qITwgU3RvcmUgaW4gUnggRklGTyAxIGlmIGZpbHRlciBtYXRjaGVzICovDQotI2RlZmluZSBGRENBTl9GSUxURVJfUkVKRUNUIFwNCi0gICgodWludDMyX3QpMHgwMDAwMDAwM1UpIC8qITwgUmVqZWN0IElEIGlmIGZpbHRlciBtYXRjaGVzICovDQotI2RlZmluZSBGRENBTl9GSUxURVJfSFAgXA0KLSAgKCh1aW50MzJfdCkweDAwMDAwMDA0VSkgLyohPCBTZXQgaGlnaCBwcmlvcml0eSBpZiBmaWx0ZXIgbWF0Y2hlcyAqLw0KLSNkZWZpbmUgRkRDQU5fRklMVEVSX1RPX1JYRklGTzBfSFAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKHVpbnQzMl90KTB4MDAwMDAwMDVVKSAvKiE8IFNldCBoaWdoIHByaW9yaXR5IGFuZCBzdG9yZSBpbiBGSUZPIDAgaWYgZmlsdGVyIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXMgICAqLw0KLSNkZWZpbmUgRkRDQU5fRklMVEVSX1RPX1JYRklGTzFfSFAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKHVpbnQzMl90KTB4MDAwMDAwMDZVKSAvKiE8IFNldCBoaWdoIHByaW9yaXR5IGFuZCBzdG9yZSBpbiBGSUZPIDEgaWYgZmlsdGVyIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXMgICAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBGRENBTl9UeF9sb2NhdGlvbiBGRENBTiBUeCBMb2NhdGlvbg0KLSAqIEB7DQotICovDQotI2RlZmluZSBGRENBTl9UWF9CVUZGRVIwIFwNCi0gICgodWludDMyX3QpMHgwMDAwMDAwMVUpIC8qITwgQWRkIG1lc3NhZ2UgdG8gVHggQnVmZmVyIDAgICovDQotI2RlZmluZSBGRENBTl9UWF9CVUZGRVIxIFwNCi0gICgodWludDMyX3QpMHgwMDAwMDAwMlUpIC8qITwgQWRkIG1lc3NhZ2UgdG8gVHggQnVmZmVyIDEgICovDQotI2RlZmluZSBGRENBTl9UWF9CVUZGRVIyIFwNCi0gICgodWludDMyX3QpMHgwMDAwMDAwNFUpIC8qITwgQWRkIG1lc3NhZ2UgdG8gVHggQnVmZmVyIDIgICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEZEQ0FOX1J4X2xvY2F0aW9uIEZEQ0FOIFJ4IExvY2F0aW9uDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIEZEQ0FOX1JYX0ZJRk8wIFwNCi0gICgodWludDMyX3QpMHgwMDAwMDA0MFUpIC8qITwgR2V0IHJlY2VpdmVkIG1lc3NhZ2UgZnJvbSBSeCBGSUZPIDAgICAgKi8NCi0jZGVmaW5lIEZEQ0FOX1JYX0ZJRk8xIFwNCi0gICgodWludDMyX3QpMHgwMDAwMDA0MVUpIC8qITwgR2V0IHJlY2VpdmVkIG1lc3NhZ2UgZnJvbSBSeCBGSUZPIDEgICAgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRkRDQU5fZXZlbnRfdHlwZSBGRENBTiBFdmVudCBUeXBlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIEZEQ0FOX1RYX0VWRU5UIFwNCi0gICgodWludDMyX3QpMHgwMDQwMDAwMFUpIC8qITwgVHggZXZlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgRkRDQU5fVFhfSU5fU1BJVEVfT0ZfQUJPUlQgXA0KLSAgKCh1aW50MzJfdCkweDAwODAwMDAwVSkgLyohPCBUcmFuc21pc3Npb24gaW4gc3BpdGUgb2YgY2FuY2VsbGF0aW9uICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEZEQ0FOX2hwX21zZ19zdG9yYWdlIEZEQ0FOIEhpZ2ggUHJpb3JpdHkgTWVzc2FnZSBTdG9yYWdlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIEZEQ0FOX0hQX1NUT1JBR0VfTk9fRklGTyBcDQotICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAvKiE8IE5vIEZJRk8gc2VsZWN0ZWQgICAgICAgICAqLw0KLSNkZWZpbmUgRkRDQU5fSFBfU1RPUkFHRV9NU0dfTE9TVCBcDQotICAoKHVpbnQzMl90KTB4MDAwMDAwNDBVKSAvKiE8IEZJRk8gbWVzc2FnZSBsb3N0ICAgICAgICAqLw0KLSNkZWZpbmUgRkRDQU5fSFBfU1RPUkFHRV9SWEZJRk8wIFwNCi0gICgodWludDMyX3QpMHgwMDAwMDA4MFUpIC8qITwgTWVzc2FnZSBzdG9yZWQgaW4gRklGTyAwICovDQotI2RlZmluZSBGRENBTl9IUF9TVE9SQUdFX1JYRklGTzEgXA0KLSAgKCh1aW50MzJfdCkweDAwMDAwMEMwVSkgLyohPCBNZXNzYWdlIHN0b3JlZCBpbiBGSUZPIDEgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRkRDQU5fcHJvdG9jb2xfZXJyb3JfY29kZSBGRENBTiBwcm90b2NvbCBlcnJvciBjb2RlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIEZEQ0FOX1BST1RPQ09MX0VSUk9SX05PTkUgXA0KLSAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgLyohPCBObyBlcnJvciBvY2N1cnJlZCAgICAgICAgICovDQotI2RlZmluZSBGRENBTl9QUk9UT0NPTF9FUlJPUl9TVFVGRiBcDQotICAoKHVpbnQzMl90KTB4MDAwMDAwMDFVKSAvKiE8IFN0dWZmIGVycm9yICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIEZEQ0FOX1BST1RPQ09MX0VSUk9SX0ZPUk0gXA0KLSAgKCh1aW50MzJfdCkweDAwMDAwMDAyVSkgLyohPCBGb3JtIGVycm9yICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBGRENBTl9QUk9UT0NPTF9FUlJPUl9BQ0sgXA0KLSAgKCh1aW50MzJfdCkweDAwMDAwMDAzVSkgLyohPCBBY2tub3dsZWRnZSBlcnJvciAgICAgICAgICovDQotI2RlZmluZSBGRENBTl9QUk9UT0NPTF9FUlJPUl9CSVQxIFwNCi0gICgodWludDMyX3QpMHgwMDAwMDAwNFUpIC8qITwgQml0IDEgKHJlY2Vzc2l2ZSkgZXJyb3IgICAqLw0KLSNkZWZpbmUgRkRDQU5fUFJPVE9DT0xfRVJST1JfQklUMCBcDQotICAoKHVpbnQzMl90KTB4MDAwMDAwMDVVKSAvKiE8IEJpdCAwIChkb21pbmFudCkgZXJyb3IgICAgKi8NCi0jZGVmaW5lIEZEQ0FOX1BST1RPQ09MX0VSUk9SX0NSQyBcDQotICAoKHVpbnQzMl90KTB4MDAwMDAwMDZVKSAvKiE8IENSQyBjaGVjayBzdW0gZXJyb3IgICAgICAgKi8NCi0jZGVmaW5lIEZEQ0FOX1BST1RPQ09MX0VSUk9SX05PX0NIQU5HRSBcDQotICAoKHVpbnQzMl90KTB4MDAwMDAwMDdVKSAvKiE8IE5vIGNoYW5nZSBzaW5jZSBsYXN0IHJlYWQgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRkRDQU5fY29tbXVuaWNhdGlvbl9zdGF0ZSBGRENBTiBjb21tdW5pY2F0aW9uIHN0YXRlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIEZEQ0FOX0NPTV9TVEFURV9TWU5DIFwNCi0gICgodWludDMyX3QpMHgwMDAwMDAwMFUpIC8qITwgTm9kZSBpcyBzeW5jaHJvbml6aW5nIG9uIENBTiBjb21tdW5pY2F0aW9uICovDQotI2RlZmluZSBGRENBTl9DT01fU1RBVEVfSURMRSBcDQotICAoKHVpbnQzMl90KTB4MDAwMDAwMDhVKSAvKiE8IE5vZGUgaXMgbmVpdGhlciByZWNlaXZlciBub3IgdHJhbnNtaXR0ZXIgICAqLw0KLSNkZWZpbmUgRkRDQU5fQ09NX1NUQVRFX1JYIFwNCi0gICgodWludDMyX3QpMHgwMDAwMDAxMFUpIC8qITwgTm9kZSBpcyBvcGVyYXRpbmcgYXMgcmVjZWl2ZXIgICAgICAgICAgICAgICovDQotI2RlZmluZSBGRENBTl9DT01fU1RBVEVfVFggXA0KLSAgKCh1aW50MzJfdCkweDAwMDAwMDE4VSkgLyohPCBOb2RlIGlzIG9wZXJhdGluZyBhcyB0cmFuc21pdHRlciAgICAgICAgICAgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRkRDQU5fUnhfRklGT19vcGVyYXRpb25fbW9kZSBGRENBTiBGSUZPIG9wZXJhdGlvbiBtb2RlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIEZEQ0FOX1JYX0ZJRk9fQkxPQ0tJTkcgXA0KLSAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgLyohPCBSeCBGSUZPIGJsb2NraW5nIG1vZGUgICovDQotI2RlZmluZSBGRENBTl9SWF9GSUZPX09WRVJXUklURSBcDQotICAoKHVpbnQzMl90KTB4MDAwMDAwMDFVKSAvKiE8IFJ4IEZJRk8gb3ZlcndyaXRlIG1vZGUgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRkRDQU5fTm9uX01hdGNoaW5nX0ZyYW1lcyBGRENBTiBub24tbWF0Y2hpbmcgZnJhbWVzDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIEZEQ0FOX0FDQ0VQVF9JTl9SWF9GSUZPMCBcDQotICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAvKiE8IEFjY2VwdCBpbiBSeCBGSUZPIDAgKi8NCi0jZGVmaW5lIEZEQ0FOX0FDQ0VQVF9JTl9SWF9GSUZPMSBcDQotICAoKHVpbnQzMl90KTB4MDAwMDAwMDFVKSAgICAgICAgICAgICAgICAgICAgLyohPCBBY2NlcHQgaW4gUnggRklGTyAxICovDQotI2RlZmluZSBGRENBTl9SRUpFQ1QgKCh1aW50MzJfdCkweDAwMDAwMDAyVSkgLyohPCBSZWplY3QgICAgICAgICAgICAgICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEZEQ0FOX1JlamVjdF9SZW1vdGVfRnJhbWVzIEZEQ0FOIHJlamVjdCByZW1vdGUgZnJhbWVzDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIEZEQ0FOX0ZJTFRFUl9SRU1PVEUgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgLyohPCBGaWx0ZXIgcmVtb3RlIGZyYW1lcyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIEZEQ0FOX1JFSkVDVF9SRU1PVEUgXA0KLSAgKCh1aW50MzJfdCkweDAwMDAwMDAxVSkgLyohPCBSZWplY3QgYWxsIHJlbW90ZSBmcmFtZXMgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRkRDQU5fSW50ZXJydXB0X0xpbmUgRkRDQU4gaW50ZXJydXB0IGxpbmUNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgRkRDQU5fSU5URVJSVVBUX0xJTkUwICgodWludDMyX3QpMHgwMDAwMDAwMVUpIC8qITwgSW50ZXJydXB0IExpbmUgMCAqLw0KLSNkZWZpbmUgRkRDQU5fSU5URVJSVVBUX0xJTkUxICgodWludDMyX3QpMHgwMDAwMDAwMlUpIC8qITwgSW50ZXJydXB0IExpbmUgMSAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBGRENBTl9UaW1lc3RhbXAgRkRDQU4gdGltZXN0YW1wDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIEZEQ0FOX1RJTUVTVEFNUF9JTlRFUk5BTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgodWludDMyX3QpMHgwMDAwMDAwMVUpIC8qITwgVGltZXN0YW1wIGNvdW50ZXIgdmFsdWUgaW5jcmVtZW50ZWQgYWNjb3JkaW5nIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIFRDUCAqLw0KLSNkZWZpbmUgRkRDQU5fVElNRVNUQU1QX0VYVEVSTkFMIFwNCi0gICgodWludDMyX3QpMHgwMDAwMDAwMlUpIC8qITwgRXh0ZXJuYWwgdGltZXN0YW1wIGNvdW50ZXIgdmFsdWUgdXNlZCAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBGRENBTl9UaW1lc3RhbXBfUHJlc2NhbGVyIEZEQ0FOIHRpbWVzdGFtcCBwcmVzY2FsZXINCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgRkRDQU5fVElNRVNUQU1QX1BSRVNDXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAvKiE8IFRpbWVzdGFtcCBjb3VudGVyIHRpbWUgdW5pdCBpbiBlcXVhbCB0byBDQU4gYml0IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBGRENBTl9USU1FU1RBTVBfUFJFU0NfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgodWludDMyX3QpMHgwMDAxMDAwMFUpIC8qITwgVGltZXN0YW1wIGNvdW50ZXIgdGltZSB1bml0IGluIGVxdWFsIHRvIENBTiBiaXQgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSBtdWx0aXBsaWVkIGJ5IDIgICovDQotI2RlZmluZSBGRENBTl9USU1FU1RBTVBfUFJFU0NfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgodWludDMyX3QpMHgwMDAyMDAwMFUpIC8qITwgVGltZXN0YW1wIGNvdW50ZXIgdGltZSB1bml0IGluIGVxdWFsIHRvIENBTiBiaXQgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSBtdWx0aXBsaWVkIGJ5IDMgICovDQotI2RlZmluZSBGRENBTl9USU1FU1RBTVBfUFJFU0NfNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgodWludDMyX3QpMHgwMDAzMDAwMFUpIC8qITwgVGltZXN0YW1wIGNvdW50ZXIgdGltZSB1bml0IGluIGVxdWFsIHRvIENBTiBiaXQgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSBtdWx0aXBsaWVkIGJ5IDQgICovDQotI2RlZmluZSBGRENBTl9USU1FU1RBTVBfUFJFU0NfNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgodWludDMyX3QpMHgwMDA0MDAwMFUpIC8qITwgVGltZXN0YW1wIGNvdW50ZXIgdGltZSB1bml0IGluIGVxdWFsIHRvIENBTiBiaXQgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSBtdWx0aXBsaWVkIGJ5IDUgICovDQotI2RlZmluZSBGRENBTl9USU1FU1RBTVBfUFJFU0NfNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgodWludDMyX3QpMHgwMDA1MDAwMFUpIC8qITwgVGltZXN0YW1wIGNvdW50ZXIgdGltZSB1bml0IGluIGVxdWFsIHRvIENBTiBiaXQgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSBtdWx0aXBsaWVkIGJ5IDYgICovDQotI2RlZmluZSBGRENBTl9USU1FU1RBTVBfUFJFU0NfNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgodWludDMyX3QpMHgwMDA2MDAwMFUpIC8qITwgVGltZXN0YW1wIGNvdW50ZXIgdGltZSB1bml0IGluIGVxdWFsIHRvIENBTiBiaXQgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSBtdWx0aXBsaWVkIGJ5IDcgICovDQotI2RlZmluZSBGRENBTl9USU1FU1RBTVBfUFJFU0NfOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgodWludDMyX3QpMHgwMDA3MDAwMFUpIC8qITwgVGltZXN0YW1wIGNvdW50ZXIgdGltZSB1bml0IGluIGVxdWFsIHRvIENBTiBiaXQgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSBtdWx0aXBsaWVkIGJ5IDggICovDQotI2RlZmluZSBGRENBTl9USU1FU1RBTVBfUFJFU0NfOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgodWludDMyX3QpMHgwMDA4MDAwMFUpIC8qITwgVGltZXN0YW1wIGNvdW50ZXIgdGltZSB1bml0IGluIGVxdWFsIHRvIENBTiBiaXQgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSBtdWx0aXBsaWVkIGJ5IDkgICovDQotI2RlZmluZSBGRENBTl9USU1FU1RBTVBfUFJFU0NfMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgodWludDMyX3QpMHgwMDA5MDAwMFUpIC8qITwgVGltZXN0YW1wIGNvdW50ZXIgdGltZSB1bml0IGluIGVxdWFsIHRvIENBTiBiaXQgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSBtdWx0aXBsaWVkIGJ5IDEwICovDQotI2RlZmluZSBGRENBTl9USU1FU1RBTVBfUFJFU0NfMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgodWludDMyX3QpMHgwMDBBMDAwMFUpIC8qITwgVGltZXN0YW1wIGNvdW50ZXIgdGltZSB1bml0IGluIGVxdWFsIHRvIENBTiBiaXQgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSBtdWx0aXBsaWVkIGJ5IDExICovDQotI2RlZmluZSBGRENBTl9USU1FU1RBTVBfUFJFU0NfMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgodWludDMyX3QpMHgwMDBCMDAwMFUpIC8qITwgVGltZXN0YW1wIGNvdW50ZXIgdGltZSB1bml0IGluIGVxdWFsIHRvIENBTiBiaXQgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSBtdWx0aXBsaWVkIGJ5IDEyICovDQotI2RlZmluZSBGRENBTl9USU1FU1RBTVBfUFJFU0NfMTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgodWludDMyX3QpMHgwMDBDMDAwMFUpIC8qITwgVGltZXN0YW1wIGNvdW50ZXIgdGltZSB1bml0IGluIGVxdWFsIHRvIENBTiBiaXQgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSBtdWx0aXBsaWVkIGJ5IDEzICovDQotI2RlZmluZSBGRENBTl9USU1FU1RBTVBfUFJFU0NfMTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgodWludDMyX3QpMHgwMDBEMDAwMFUpIC8qITwgVGltZXN0YW1wIGNvdW50ZXIgdGltZSB1bml0IGluIGVxdWFsIHRvIENBTiBiaXQgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSBtdWx0aXBsaWVkIGJ5IDE0ICovDQotI2RlZmluZSBGRENBTl9USU1FU1RBTVBfUFJFU0NfMTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgodWludDMyX3QpMHgwMDBFMDAwMFUpIC8qITwgVGltZXN0YW1wIGNvdW50ZXIgdGltZSB1bml0IGluIGVxdWFsIHRvIENBTiBiaXQgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSBtdWx0aXBsaWVkIGJ5IDE1ICovDQotI2RlZmluZSBGRENBTl9USU1FU1RBTVBfUFJFU0NfMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgodWludDMyX3QpMHgwMDBGMDAwMFUpIC8qITwgVGltZXN0YW1wIGNvdW50ZXIgdGltZSB1bml0IGluIGVxdWFsIHRvIENBTiBiaXQgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSBtdWx0aXBsaWVkIGJ5IDE2ICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEZEQ0FOX1RpbWVvdXRfT3BlcmF0aW9uIEZEQ0FOIHRpbWVvdXQgb3BlcmF0aW9uDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIEZEQ0FOX1RJTUVPVVRfQ09OVElOVU9VUyBcDQotICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAvKiE8IFRpbWVvdXQgY29udGludW91cyBvcGVyYXRpb24gICAgICAgICovDQotI2RlZmluZSBGRENBTl9USU1FT1VUX1RYX0VWRU5UX0ZJRk8gXA0KLSAgKCh1aW50MzJfdCkweDAwMDAwMDAyVSkgLyohPCBUaW1lb3V0IGNvbnRyb2xsZWQgYnkgVHggRXZlbnQgRklGTyAqLw0KLSNkZWZpbmUgRkRDQU5fVElNRU9VVF9SWF9GSUZPMCBcDQotICAoKHVpbnQzMl90KTB4MDAwMDAwMDRVKSAvKiE8IFRpbWVvdXQgY29udHJvbGxlZCBieSBSeCBGSUZPIDAgICAgICovDQotI2RlZmluZSBGRENBTl9USU1FT1VUX1JYX0ZJRk8xIFwNCi0gICgodWludDMyX3QpMHgwMDAwMDAwNlUpIC8qITwgVGltZW91dCBjb250cm9sbGVkIGJ5IFJ4IEZJRk8gMSAgICAgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgSW50ZXJydXB0X01hc2tzIEludGVycnVwdCBtYXNrcw0KLSAqIEB7DQotICovDQotI2RlZmluZSBGRENBTl9JUl9NQVNLICgodWludDMyX3QpMHgwMEZGRkZGRlUpIC8qITwgRkRDQU4gaW50ZXJydXB0cyBtYXNrICovDQotI2RlZmluZSBGRENBTl9JTFNfTUFTSyBcDQotICAoKHVpbnQzMl90KTB4MDAwMDAwN0ZVKSAvKiE8IEZEQ0FOIGludGVycnVwdHMgZ3JvdXAgbWFzayAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBGRENBTl9mbGFncyBGRENBTiBGbGFncw0KLSAqIEB7DQotICovDQotI2RlZmluZSBGRENBTl9GTEFHX1RYX0NPTVBMRVRFIFwNCi0gIEZEQ0FOX0lSX1RDIC8qITwgVHJhbnNtaXNzaW9uIENvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIEZEQ0FOX0ZMQUdfVFhfQUJPUlRfQ09NUExFVEUgXA0KLSAgRkRDQU5fSVJfVENGIC8qITwgVHJhbnNtaXNzaW9uIENhbmNlbGxhdGlvbiBGaW5pc2hlZCAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIEZEQ0FOX0ZMQUdfVFhfRklGT19FTVBUWSBcDQotICBGRENBTl9JUl9URkUgLyohPCBUeCBGSUZPIEVtcHR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgRkRDQU5fRkxBR19SWF9ISUdIX1BSSU9SSVRZX01TRyBcDQotICBGRENBTl9JUl9IUE0gLyohPCBIaWdoIHByaW9yaXR5IG1lc3NhZ2UgcmVjZWl2ZWQgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgRkRDQU5fRkxBR19UWF9FVlRfRklGT19FTFRfTE9TVCBcDQotICBGRENBTl9JUl9URUZMIC8qITwgVHggRXZlbnQgRklGTyBlbGVtZW50IGxvc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIEZEQ0FOX0ZMQUdfVFhfRVZUX0ZJRk9fRlVMTCBcDQotICBGRENBTl9JUl9URUZGIC8qITwgVHggRXZlbnQgRklGTyBmdWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIEZEQ0FOX0ZMQUdfVFhfRVZUX0ZJRk9fTkVXX0RBVEEgXA0KLSAgRkRDQU5fSVJfVEVGTiAvKiE8IFR4IEhhbmRsZXIgd3JvdGUgVHggRXZlbnQgRklGTyBlbGVtZW50ICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBGRENBTl9GTEFHX1JYX0ZJRk8wX01FU1NBR0VfTE9TVCBcDQotICBGRENBTl9JUl9SRjBMIC8qITwgUnggRklGTyAwIG1lc3NhZ2UgbG9zdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIEZEQ0FOX0ZMQUdfUlhfRklGTzBfRlVMTCBcDQotICBGRENBTl9JUl9SRjBGIC8qITwgUnggRklGTyAwIGZ1bGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIEZEQ0FOX0ZMQUdfUlhfRklGTzBfTkVXX01FU1NBR0UgXA0KLSAgRkRDQU5fSVJfUkYwTiAvKiE8IE5ldyBtZXNzYWdlIHdyaXR0ZW4gdG8gUnggRklGTyAwICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBGRENBTl9GTEFHX1JYX0ZJRk8xX01FU1NBR0VfTE9TVCBcDQotICBGRENBTl9JUl9SRjFMIC8qITwgUnggRklGTyAxIG1lc3NhZ2UgbG9zdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIEZEQ0FOX0ZMQUdfUlhfRklGTzFfRlVMTCBcDQotICBGRENBTl9JUl9SRjFGIC8qITwgUnggRklGTyAxIGZ1bGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIEZEQ0FOX0ZMQUdfUlhfRklGTzFfTkVXX01FU1NBR0UgXA0KLSAgRkRDQU5fSVJfUkYxTiAvKiE8IE5ldyBtZXNzYWdlIHdyaXR0ZW4gdG8gUnggRklGTyAxICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBGRENBTl9GTEFHX1JBTV9BQ0NFU1NfRkFJTFVSRSBcDQotICBGRENBTl9JUl9NUkFGIC8qITwgTWVzc2FnZSBSQU0gYWNjZXNzIGZhaWx1cmUgb2NjdXJyZWQgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIEZEQ0FOX0ZMQUdfRVJST1JfTE9HR0lOR19PVkVSRkxPVyBcDQotICBGRENBTl9JUl9FTE8gLyohPCBPdmVyZmxvdyBvZiBGRENBTiBFcnJvciBMb2dnaW5nIENvdW50ZXIgb2NjdXJyZWQgICAgICAqLw0KLSNkZWZpbmUgRkRDQU5fRkxBR19FUlJPUl9QQVNTSVZFIFwNCi0gIEZEQ0FOX0lSX0VQIC8qITwgRXJyb3JfUGFzc2l2ZSBzdGF0dXMgY2hhbmdlZCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIEZEQ0FOX0ZMQUdfRVJST1JfV0FSTklORyBcDQotICBGRENBTl9JUl9FVyAvKiE8IEVycm9yX1dhcm5pbmcgc3RhdHVzIGNoYW5nZWQgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBGRENBTl9GTEFHX0JVU19PRkYgXA0KLSAgRkRDQU5fSVJfQk8gLyohPCBCdXNfT2ZmIHN0YXR1cyBjaGFuZ2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgRkRDQU5fRkxBR19SQU1fV0FUQ0hET0cgXA0KLSAgRkRDQU5fSVJfV0RJIC8qITwgTWVzc2FnZSBSQU0gV2F0Y2hkb2cgZXZlbnQgZHVlIHRvIG1pc3NpbmcgUkVBRFkgICAgICAgKi8NCi0jZGVmaW5lIEZEQ0FOX0ZMQUdfQVJCX1BST1RPQ09MX0VSUk9SIFwNCi0gIEZEQ0FOX0lSX1BFQSAvKiE8IFByb3RvY29sIGVycm9yIGluIGFyYml0cmF0aW9uIHBoYXNlIGRldGVjdGVkICAgICAgICAgICovDQotI2RlZmluZSBGRENBTl9GTEFHX0RBVEFfUFJPVE9DT0xfRVJST1IgXA0KLSAgRkRDQU5fSVJfUEVEIC8qITwgUHJvdG9jb2wgZXJyb3IgaW4gZGF0YSBwaGFzZSBkZXRlY3RlZCAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIEZEQ0FOX0ZMQUdfUkVTRVJWRURfQUREUkVTU19BQ0NFU1MgXA0KLSAgRkRDQU5fSVJfQVJBIC8qITwgQWNjZXNzIHRvIHJlc2VydmVkIGFkZHJlc3Mgb2NjdXJyZWQgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIEZEQ0FOX0ZMQUdfVElNRVNUQU1QX1dSQVBBUk9VTkQgXA0KLSAgRkRDQU5fSVJfVFNXIC8qITwgVGltZXN0YW1wIGNvdW50ZXIgd3JhcHBlZCBhcm91bmQgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIEZEQ0FOX0ZMQUdfVElNRU9VVF9PQ0NVUlJFRCBcDQotICBGRENBTl9JUl9UT08gLyohPCBUaW1lb3V0IHJlYWNoZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBGRENBTl9JbnRlcnJ1cHRzIEZEQ0FOIEludGVycnVwdHMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRkRDQU5fVHhfSW50ZXJydXB0cyBGRENBTiBUeCBJbnRlcnJ1cHRzDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIEZEQ0FOX0lUX1RYX0NPTVBMRVRFIFwNCi0gIEZEQ0FOX0lFX1RDRSAvKiE8IFRyYW5zbWlzc2lvbiBDb21wbGV0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBGRENBTl9JVF9UWF9BQk9SVF9DT01QTEVURSBcDQotICBGRENBTl9JRV9UQ0ZFIC8qITwgVHJhbnNtaXNzaW9uIENhbmNlbGxhdGlvbiBGaW5pc2hlZCAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIEZEQ0FOX0lUX1RYX0ZJRk9fRU1QVFkgXA0KLSAgRkRDQU5fSUVfVEZFRSAvKiE8IFR4IEZJRk8gRW1wdHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEZEQ0FOX1J4X0ludGVycnVwdHMgRkRDQU4gUnggSW50ZXJydXB0cw0KLSAqIEB7DQotICovDQotI2RlZmluZSBGRENBTl9JVF9SWF9ISUdIX1BSSU9SSVRZX01TRyBcDQotICBGRENBTl9JRV9IUE1FIC8qITwgSGlnaCBwcmlvcml0eSBtZXNzYWdlIHJlY2VpdmVkICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRkRDQU5fQ291bnRlcl9JbnRlcnJ1cHRzIEZEQ0FOIENvdW50ZXIgSW50ZXJydXB0cw0KLSAqIEB7DQotICovDQotI2RlZmluZSBGRENBTl9JVF9USU1FU1RBTVBfV1JBUEFST1VORCBcDQotICBGRENBTl9JRV9UU1dFIC8qITwgVGltZXN0YW1wIGNvdW50ZXIgd3JhcHBlZCBhcm91bmQgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIEZEQ0FOX0lUX1RJTUVPVVRfT0NDVVJSRUQgXA0KLSAgRkRDQU5fSUVfVE9PRSAvKiE8IFRpbWVvdXQgcmVhY2hlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEZEQ0FOX1R4X0V2ZW50X0ZpZm9fSW50ZXJydXB0cyBGRENBTiBUeCBFdmVudCBGSUZPIEludGVycnVwdHMNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgRkRDQU5fSVRfVFhfRVZUX0ZJRk9fRUxUX0xPU1QgXA0KLSAgRkRDQU5fSUVfVEVGTEUgLyohPCBUeCBFdmVudCBGSUZPIGVsZW1lbnQgbG9zdCAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIEZEQ0FOX0lUX1RYX0VWVF9GSUZPX0ZVTEwgXA0KLSAgRkRDQU5fSUVfVEVGRkUgLyohPCBUeCBFdmVudCBGSUZPIGZ1bGwgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIEZEQ0FOX0lUX1RYX0VWVF9GSUZPX05FV19EQVRBIFwNCi0gIEZEQ0FOX0lFX1RFRk5FIC8qITwgVHggSGFuZGxlciB3cm90ZSBUeCBFdmVudCBGSUZPIGVsZW1lbnQgICAgICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEZEQ0FOX1J4X0ZpZm8wX0ludGVycnVwdHMgRkRDQU4gUnggRklGTyAwIEludGVycnVwdHMNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgRkRDQU5fSVRfUlhfRklGTzBfTUVTU0FHRV9MT1NUIFwNCi0gIEZEQ0FOX0lFX1JGMExFIC8qITwgUnggRklGTyAwIG1lc3NhZ2UgbG9zdCAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIEZEQ0FOX0lUX1JYX0ZJRk8wX0ZVTEwgXA0KLSAgRkRDQU5fSUVfUkYwRkUgLyohPCBSeCBGSUZPIDAgZnVsbCAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgRkRDQU5fSVRfUlhfRklGTzBfTkVXX01FU1NBR0UgXA0KLSAgRkRDQU5fSUVfUkYwTkUgLyohPCBOZXcgbWVzc2FnZSB3cml0dGVuIHRvIFJ4IEZJRk8gMCAgICAgICAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBGRENBTl9SeF9GaWZvMV9JbnRlcnJ1cHRzIEZEQ0FOIFJ4IEZJRk8gMSBJbnRlcnJ1cHRzDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIEZEQ0FOX0lUX1JYX0ZJRk8xX01FU1NBR0VfTE9TVCBcDQotICBGRENBTl9JRV9SRjFMRSAvKiE8IFJ4IEZJRk8gMSBtZXNzYWdlIGxvc3QgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBGRENBTl9JVF9SWF9GSUZPMV9GVUxMIFwNCi0gIEZEQ0FOX0lFX1JGMUZFIC8qITwgUnggRklGTyAxIGZ1bGwgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIEZEQ0FOX0lUX1JYX0ZJRk8xX05FV19NRVNTQUdFIFwNCi0gIEZEQ0FOX0lFX1JGMU5FIC8qITwgTmV3IG1lc3NhZ2Ugd3JpdHRlbiB0byBSeCBGSUZPIDEgICAgICAgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRkRDQU5fRXJyb3JfSW50ZXJydXB0cyBGRENBTiBFcnJvciBJbnRlcnJ1cHRzDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIEZEQ0FOX0lUX1JBTV9BQ0NFU1NfRkFJTFVSRSBcDQotICBGRENBTl9JRV9NUkFGRSAvKiE8IE1lc3NhZ2UgUkFNIGFjY2VzcyBmYWlsdXJlIG9jY3VycmVkICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgRkRDQU5fSVRfRVJST1JfTE9HR0lOR19PVkVSRkxPVyBcDQotICBGRENBTl9JRV9FTE9FIC8qITwgT3ZlcmZsb3cgb2YgRkRDQU4gRXJyb3IgTG9nZ2luZyBDb3VudGVyIG9jY3VycmVkICovDQotI2RlZmluZSBGRENBTl9JVF9SQU1fV0FUQ0hET0cgXA0KLSAgRkRDQU5fSUVfV0RJRSAvKiE8IE1lc3NhZ2UgUkFNIFdhdGNoZG9nIGV2ZW50IGR1ZSB0byBtaXNzaW5nIFJFQURZICAqLw0KLSNkZWZpbmUgRkRDQU5fSVRfQVJCX1BST1RPQ09MX0VSUk9SIFwNCi0gIEZEQ0FOX0lFX1BFQUUgLyohPCBQcm90b2NvbCBlcnJvciBpbiBhcmJpdHJhdGlvbiBwaGFzZSBkZXRlY3RlZCAgICAgKi8NCi0jZGVmaW5lIEZEQ0FOX0lUX0RBVEFfUFJPVE9DT0xfRVJST1IgXA0KLSAgRkRDQU5fSUVfUEVERSAvKiE8IFByb3RvY29sIGVycm9yIGluIGRhdGEgcGhhc2UgZGV0ZWN0ZWQgICAgICAgICAgICAqLw0KLSNkZWZpbmUgRkRDQU5fSVRfUkVTRVJWRURfQUREUkVTU19BQ0NFU1MgXA0KLSAgRkRDQU5fSUVfQVJBRSAvKiE8IEFjY2VzcyB0byByZXNlcnZlZCBhZGRyZXNzIG9jY3VycmVkICAgICAgICAgICAgICAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBGRENBTl9FcnJvcl9TdGF0dXNfSW50ZXJydXB0cyBGRENBTiBFcnJvciBTdGF0dXMgSW50ZXJydXB0cw0KLSAqIEB7DQotICovDQotI2RlZmluZSBGRENBTl9JVF9FUlJPUl9QQVNTSVZFIFwNCi0gIEZEQ0FOX0lFX0VQRSAvKiE8IEVycm9yX1Bhc3NpdmUgc3RhdHVzIGNoYW5nZWQgICAgICAqLw0KLSNkZWZpbmUgRkRDQU5fSVRfRVJST1JfV0FSTklORyBcDQotICBGRENBTl9JRV9FV0UgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEVycm9yX1dhcm5pbmcgc3RhdHVzIGNoYW5nZWQgICAgICAqLw0KLSNkZWZpbmUgRkRDQU5fSVRfQlVTX09GRiBGRENBTl9JRV9CT0UgLyohPCBCdXNfT2ZmIHN0YXR1cyBjaGFuZ2VkICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRkRDQU5fSW50ZXJydXB0c19MaXN0IEZEQ0FOIEludGVycnVwdHMgTGlzdA0KLSAqIEB7DQotICovDQotI2RlZmluZSBGRENBTl9JVF9MSVNUX1JYX0ZJRk8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChGRENBTl9JVF9SWF9GSUZPMF9NRVNTQUdFX0xPU1QgfCBGRENBTl9JVF9SWF9GSUZPMF9GVUxMIHwgXA0KLSAgIEZEQ0FOX0lUX1JYX0ZJRk8wX05FV19NRVNTQUdFKSAvKiE8IFJYIEZJRk8gMCBJbnRlcnJ1cHRzIExpc3QgICAgICAgICAgKi8NCi0jZGVmaW5lIEZEQ0FOX0lUX0xJU1RfUlhfRklGTzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEZEQ0FOX0lUX1JYX0ZJRk8xX01FU1NBR0VfTE9TVCB8IEZEQ0FOX0lUX1JYX0ZJRk8xX0ZVTEwgfCBcDQotICAgRkRDQU5fSVRfUlhfRklGTzFfTkVXX01FU1NBR0UpIC8qITwgUlggRklGTyAxIEludGVycnVwdHMgTGlzdCAgICAgICAgICAqLw0KLSNkZWZpbmUgRkRDQU5fSVRfTElTVF9TTVNHICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoRkRDQU5fSVRfVFhfQUJPUlRfQ09NUExFVEUgfCBGRENBTl9JVF9UWF9DT01QTEVURSB8IFwNCi0gICBGRENBTl9JVF9SWF9ISUdIX1BSSU9SSVRZX01TRykgLyohPCBTdGF0dXMgTWVzc2FnZSBJbnRlcnJ1cHRzIExpc3QgICAgICovDQotI2RlZmluZSBGRENBTl9JVF9MSVNUX1RYX0ZJRk9fRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEZEQ0FOX0lUX1RYX0VWVF9GSUZPX0VMVF9MT1NUIHwgRkRDQU5fSVRfVFhfRVZUX0ZJRk9fRlVMTCB8IFwNCi0gICBGRENBTl9JVF9UWF9FVlRfRklGT19ORVdfREFUQSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgRkRDQU5fSVRfVFhfRklGT19FTVBUWSkgLyohPCBUWCBGSUZPIEVycm9yIEludGVycnVwdHMgTGlzdCAgICAgICovDQotI2RlZmluZSBGRENBTl9JVF9MSVNUX01JU0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChGRENBTl9JVF9USU1FT1VUX09DQ1VSUkVEIHwgRkRDQU5fSVRfUkFNX0FDQ0VTU19GQUlMVVJFIHwgXA0KLSAgIEZEQ0FOX0lUX1RJTUVTVEFNUF9XUkFQQVJPVU5EKSAvKiE8IE1pc2MuIEludGVycnVwdHMgTGlzdCAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIEZEQ0FOX0lUX0xJU1RfQklUX0xJTkVfRVJST1IgXA0KLSAgKEZEQ0FOX0lUX0VSUk9SX1BBU1NJVkUgfCAgICAgICAgICBcDQotICAgRkRDQU5fSVRfRVJST1JfTE9HR0lOR19PVkVSRkxPVykgLyohPCBCaXQgYW5kIExpbmUgRXJyb3IgSW50ZXJydXB0cyBMaXN0ICovDQotI2RlZmluZSBGRENBTl9JVF9MSVNUX1BST1RPQ09MX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChGRENBTl9JVF9SRVNFUlZFRF9BRERSRVNTX0FDQ0VTUyB8IEZEQ0FOX0lUX0RBVEFfUFJPVE9DT0xfRVJST1IgfCAgICAgICAgXA0KLSAgIEZEQ0FOX0lUX0FSQl9QUk9UT0NPTF9FUlJPUiB8IEZEQ0FOX0lUX1JBTV9XQVRDSERPRyB8IEZEQ0FOX0lUX0JVU19PRkYgfCBcDQotICAgRkRDQU5fSVRfRVJST1JfV0FSTklORykgLyohPCBQcm90b2NvbCBFcnJvciBJbnRlcnJ1cHRzIExpc3QgICAgICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEZEQ0FOX0ludGVycnVwdHNfR3JvdXAgRkRDQU4gSW50ZXJydXB0cyBHcm91cA0KLSAqIEB7DQotICovDQotI2RlZmluZSBGRENBTl9JVF9HUk9VUF9SWF9GSUZPMCAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgRkRDQU5fSUxTX1JYRklGTzAgLyohPCBSWCBGSUZPIDAgSW50ZXJydXB0cyBHcm91cDogICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBSRjBMTDogUnggRklGTyAwIE1lc3NhZ2UgTG9zdCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgUkYwRkw6IFJ4IEZJRk8gMCBpcyBGdWxsICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFJGME5MOiBSeCBGSUZPIDAgSGFzIE5ldyBNZXNzYWdlICAgICAgICAgICAgKi8NCi0jZGVmaW5lIEZEQ0FOX0lUX0dST1VQX1JYX0ZJRk8xICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBGRENBTl9JTFNfUlhGSUZPMSAvKiE8IFJYIEZJRk8gMSBJbnRlcnJ1cHRzIEdyb3VwOiAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFJGMUxMOiBSeCBGSUZPIDEgTWVzc2FnZSBMb3N0IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBSRjFGTDogUnggRklGTyAxIGlzIEZ1bGwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgUkYxTkw6IFJ4IEZJRk8gMSBIYXMgTmV3IE1lc3NhZ2UgICAgICAgICAgICAqLw0KLSNkZWZpbmUgRkRDQU5fSVRfR1JPVVBfU01TRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgRkRDQU5fSUxTX1NNU0cgLyohPCBTdGF0dXMgTWVzc2FnZSBJbnRlcnJ1cHRzIEdyb3VwOiAgICAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRDRkw6IFRyYW5zbWlzc2lvbiBDYW5jZWxsYXRpb24gRmluaXNoZWQgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRDTDogVHJhbnNtaXNzaW9uIENvbXBsZXRlZCAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEhQTUw6IEhpZ2ggUHJpb3JpdHkgTWVzc2FnZSAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIEZEQ0FOX0lUX0dST1VQX1RYX0ZJRk9fRVJST1IgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIEZEQ0FOX0lMU19URkVSUiAvKiE8IFRYIEZJRk8gRXJyb3IgSW50ZXJydXB0cyBHcm91cDogICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgVEVGTEw6IFR4IEV2ZW50IEZJRk8gRWxlbWVudCBMb3N0IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgVEVGRkw6IFR4IEV2ZW50IEZJRk8gRnVsbCAgICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgVEVGTkw6IFR4IEV2ZW50IEZJRk8gTmV3IEVudHJ5ICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgVEZFTDogVHggRklGTyBFbXB0eSBJbnRlcnJ1cHQgTGluZSAgICAgICAgICAqLw0KLSNkZWZpbmUgRkRDQU5fSVRfR1JPVVBfTUlTQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBGRENBTl9JTFNfTUlTQyAvKiE8IE1pc2MuIEludGVycnVwdHMgR3JvdXA6ICAgICAgICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBUT09MOiBUaW1lb3V0IE9jY3VycmVkICAgICAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIE1SQUZMOiBNZXNzYWdlIFJBTSBBY2Nlc3MgRmFpbHVyZSBcDQotICAgICAgICAgICAgICAgICAgICAgICAgVFNXTDogVGltZXN0YW1wIFdyYXBhcm91bmQgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgRkRDQU5fSVRfR1JPVVBfQklUX0xJTkVfRVJST1IgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgRkRDQU5fSUxTX0JFUlIgLyohPCBCaXQgYW5kIExpbmUgRXJyb3IgSW50ZXJydXB0cyBHcm91cDogXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEVQTDogRXJyb3IgUGFzc2l2ZSAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEVMT0w6IEVycm9yIExvZ2dpbmcgT3ZlcmZsb3cgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIEZEQ0FOX0lUX0dST1VQX1BST1RPQ09MX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIEZEQ0FOX0lMU19QRVJSIC8qITwgUHJvdG9jb2wgRXJyb3IgR3JvdXA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBBUkFMOiBBY2Nlc3MgdG8gUmVzZXJ2ZWQgQWRkcmVzcyBMaW5lICAgICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBQRURMOiBQcm90b2NvbCBFcnJvciBpbiBEYXRhIFBoYXNlIExpbmUgICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBQRUFMOiBQcm90b2NvbCBFcnJvciBpbiBBcmJpdHJhdGlvbiBQaGFzZSBMaW5lIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBXRElMOiBXYXRjaGRvZyBJbnRlcnJ1cHQgTGluZSAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBCT0w6IEJ1c19PZmYgU3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBFV0w6IFdhcm5pbmcgU3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBkZWZncm91cCBGRENBTl9FeHBvcnRlZF9NYWNyb3MgRkRDQU4gRXhwb3J0ZWQgTWFjcm9zDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGJyaWVmICBSZXNldCBGRENBTiBoYW5kbGUgc3RhdGUuDQotICogQHBhcmFtICBfX0hBTkRMRV9fIEZEQ0FOIGhhbmRsZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jaWYgVVNFX0hBTF9GRENBTl9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMQ0KLSNkZWZpbmUgX19IQUxfRkRDQU5fUkVTRVRfSEFORExFX1NUQVRFKF9fSEFORExFX18pIFwNCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIChfX0hBTkRMRV9fKS0+U3RhdGUgPSBIQUxfRkRDQU5fU1RBVEVfUkVTRVQ7ICAgXA0KLSAgICAoX19IQU5ETEVfXyktPk1zcEluaXRDYWxsYmFjayA9IE5VTEw7ICAgICAgICAgIFwNCi0gICAgKF9fSEFORExFX18pLT5Nc3BEZUluaXRDYWxsYmFjayA9IE5VTEw7ICAgICAgICBcDQotICB9IHdoaWxlICgwKQ0KLSNlbHNlDQotI2RlZmluZSBfX0hBTF9GRENBTl9SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgXA0KLSAgKChfX0hBTkRMRV9fKS0+U3RhdGUgPSBIQUxfRkRDQU5fU1RBVEVfUkVTRVQpDQotI2VuZGlmIC8qIFVTRV9IQUxfRkRDQU5fUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgdGhlIHNwZWNpZmllZCBGRENBTiBpbnRlcnJ1cHRzLg0KLSAqIEBwYXJhbSAgX19IQU5ETEVfXyBGRENBTiBoYW5kbGUuDQotICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIEZEQ0FOIGludGVycnVwdC4NCi0gKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgQGFyZyBGRENBTl9JbnRlcnJ1cHRzDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9GRENBTl9FTkFCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgXA0KLSAgKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SUUgfD0gKF9fSU5URVJSVVBUX18pDQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIHRoZSBzcGVjaWZpZWQgRkRDQU4gaW50ZXJydXB0cy4NCi0gKiBAcGFyYW0gIF9fSEFORExFX18gRkRDQU4gaGFuZGxlLg0KLSAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBGRENBTiBpbnRlcnJ1cHQuDQotICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIEBhcmcgRkRDQU5fSW50ZXJydXB0cw0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfRkRDQU5fRElTQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSBcDQotICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SUUpICY9IH4oX19JTlRFUlJVUFRfXykNCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBGRENBTiBpbnRlcnJ1cHQgaXMgc2V0IG9yIG5vdC4NCi0gKiBAcGFyYW0gIF9fSEFORExFX18gRkRDQU4gaGFuZGxlLg0KLSAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBGRENBTiBpbnRlcnJ1cHQuDQotICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIEBhcmcgRkRDQU5fSW50ZXJydXB0cw0KLSAqIEByZXR2YWwgSVRTdGF0dXMNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX0ZEQ0FOX0dFVF9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSBcDQotICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVIgJiAoX19JTlRFUlJVUFRfXykpDQotDQotLyoqDQotICogQGJyaWVmICBDbGVhciB0aGUgc3BlY2lmaWVkIEZEQ0FOIGludGVycnVwdHMuDQotICogQHBhcmFtICBfX0hBTkRMRV9fIEZEQ0FOIGhhbmRsZS4NCi0gKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBpbnRlcnJ1cHRzIHRvIGNsZWFyLg0KLSAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiBAYXJnIEZEQ0FOX0ludGVycnVwdHMNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX0ZEQ0FOX0NMRUFSX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pIFwNCi0gICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JUikgPSAoX19JTlRFUlJVUFRfXykNCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBGRENBTiBmbGFnIGlzIHNldCBvciBub3QuDQotICogQHBhcmFtICBfX0hBTkRMRV9fIEZEQ0FOIGhhbmRsZS4NCi0gKiBAcGFyYW0gIF9fRkxBR19fIEZEQ0FOIGZsYWcuDQotICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIEBhcmcgRkRDQU5fZmxhZ3MNCi0gKiBAcmV0dmFsIEZsYWdTdGF0dXMNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX0ZEQ0FOX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSBcDQotICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVIgJiAoX19GTEFHX18pKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2xlYXIgdGhlIHNwZWNpZmllZCBGRENBTiBmbGFncy4NCi0gKiBAcGFyYW0gIF9fSEFORExFX18gRkRDQU4gaGFuZGxlLg0KLSAqIEBwYXJhbSAgX19GTEFHX18gc3BlY2lmaWVzIHRoZSBmbGFncyB0byBjbGVhci4NCi0gKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgQGFyZyBGRENBTl9mbGFncw0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfRkRDQU5fQ0xFQVJfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgXA0KLSAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklSKSA9IChfX0ZMQUdfXykNCi0NCi0vKiogQGJyaWVmICBDaGVjayBpZiB0aGUgc3BlY2lmaWVkIEZEQ0FOIGludGVycnVwdCBzb3VyY2UgaXMgZW5hYmxlZCBvcg0KLSAqIGRpc2FibGVkLg0KLSAqIEBwYXJhbSAgX19IQU5ETEVfXyBGRENBTiBoYW5kbGUuDQotICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgRkRDQU4gaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjay4NCi0gKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEBhcmcgRkRDQU5fSW50ZXJydXB0cw0KLSAqIEByZXR2YWwgSVRTdGF0dXMNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX0ZEQ0FOX0dFVF9JVF9TT1VSQ0UoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgXA0KLSAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklFICYgKF9fSU5URVJSVVBUX18pKQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGFkZHRvZ3JvdXAgRkRDQU5fRXhwb3J0ZWRfRnVuY3Rpb25zDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGFkZHRvZ3JvdXAgRkRDQU5fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMQ0KLSAqIEB7DQotICovDQotLyogSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fSW5pdChGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9EZUluaXQoRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuKTsNCi12b2lkIEhBTF9GRENBTl9Nc3BJbml0KEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbik7DQotdm9pZCBIQUxfRkRDQU5fTXNwRGVJbml0KEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbik7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX0VudGVyUG93ZXJEb3duTW9kZShGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9FeGl0UG93ZXJEb3duTW9kZShGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pOw0KLQ0KLSNpZiBVU0VfSEFMX0ZEQ0FOX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxDQotLyogQ2FsbGJhY2tzIFJlZ2lzdGVyL1VuUmVnaXN0ZXIgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fUmVnaXN0ZXJDYWxsYmFjaygNCi0gICAgRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLCBIQUxfRkRDQU5fQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwNCi0gICAgcEZEQ0FOX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9VblJlZ2lzdGVyQ2FsbGJhY2soDQotICAgIEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwgSEFMX0ZEQ0FOX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9SZWdpc3RlclR4RXZlbnRGaWZvQ2FsbGJhY2soDQotICAgIEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwgcEZEQ0FOX1R4RXZlbnRGaWZvQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjayk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX1VuUmVnaXN0ZXJUeEV2ZW50Rmlmb0NhbGxiYWNrKA0KLSAgICBGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9SZWdpc3RlclJ4RmlmbzBDYWxsYmFjaygNCi0gICAgRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLCBwRkRDQU5fUnhGaWZvMENhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9VblJlZ2lzdGVyUnhGaWZvMENhbGxiYWNrKA0KLSAgICBGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9SZWdpc3RlclJ4RmlmbzFDYWxsYmFjaygNCi0gICAgRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLCBwRkRDQU5fUnhGaWZvMUNhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9VblJlZ2lzdGVyUnhGaWZvMUNhbGxiYWNrKA0KLSAgICBGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9SZWdpc3RlclR4QnVmZmVyQ29tcGxldGVDYWxsYmFjaygNCi0gICAgRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLA0KLSAgICBwRkRDQU5fVHhCdWZmZXJDb21wbGV0ZUNhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9VblJlZ2lzdGVyVHhCdWZmZXJDb21wbGV0ZUNhbGxiYWNrKA0KLSAgICBGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9SZWdpc3RlclR4QnVmZmVyQWJvcnRDYWxsYmFjaygNCi0gICAgRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLCBwRkRDQU5fVHhCdWZmZXJBYm9ydENhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9VblJlZ2lzdGVyVHhCdWZmZXJBYm9ydENhbGxiYWNrKA0KLSAgICBGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9SZWdpc3RlckVycm9yU3RhdHVzQ2FsbGJhY2soDQotICAgIEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwgcEZEQ0FOX0Vycm9yU3RhdHVzQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjayk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX1VuUmVnaXN0ZXJFcnJvclN0YXR1c0NhbGxiYWNrKA0KLSAgICBGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pOw0KLSNlbmRpZiAvKiBVU0VfSEFMX0ZEQ0FOX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBhZGR0b2dyb3VwIEZEQ0FOX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDINCi0gKiBAew0KLSAqLw0KLS8qIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX0NvbmZpZ0ZpbHRlcihGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRENBTl9GaWx0ZXJUeXBlRGVmICpzRmlsdGVyQ29uZmlnKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fQ29uZmlnR2xvYmFsRmlsdGVyKEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE5vbk1hdGNoaW5nU3RkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgTm9uTWF0Y2hpbmdFeHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBSZWplY3RSZW1vdGVTdGQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBSZWplY3RSZW1vdGVFeHQpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9Db25maWdFeHRlbmRlZElkTWFzayhGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE1hc2spOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9Db25maWdSeEZpZm9PdmVyd3JpdGUoRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUnhGaWZvLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgT3BlcmF0aW9uTW9kZSk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX0NvbmZpZ1JhbVdhdGNoZG9nKEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ291bnRlclN0YXJ0VmFsdWUpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9Db25maWdUaW1lc3RhbXBDb3VudGVyKEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lc3RhbXBQcmVzY2FsZXIpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9FbmFibGVUaW1lc3RhbXBDb3VudGVyKEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lc3RhbXBPcGVyYXRpb24pOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9EaXNhYmxlVGltZXN0YW1wQ291bnRlcigNCi0gICAgRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuKTsNCi11aW50MTZfdCBIQUxfRkRDQU5fR2V0VGltZXN0YW1wQ291bnRlcihGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9SZXNldFRpbWVzdGFtcENvdW50ZXIoRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fQ29uZmlnVGltZW91dENvdW50ZXIoRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lb3V0T3BlcmF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lb3V0UGVyaW9kKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fRW5hYmxlVGltZW91dENvdW50ZXIoRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fRGlzYWJsZVRpbWVvdXRDb3VudGVyKEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbik7DQotdWludDE2X3QgSEFMX0ZEQ0FOX0dldFRpbWVvdXRDb3VudGVyKEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbik7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX1Jlc2V0VGltZW91dENvdW50ZXIoRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fQ29uZmlnVHhEZWxheUNvbXBlbnNhdGlvbigNCi0gICAgRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLCB1aW50MzJfdCBUZGNPZmZzZXQsIHVpbnQzMl90IFRkY0ZpbHRlcik7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX0VuYWJsZVR4RGVsYXlDb21wZW5zYXRpb24oDQotICAgIEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbik7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX0Rpc2FibGVUeERlbGF5Q29tcGVuc2F0aW9uKA0KLSAgICBGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9FbmFibGVJU09Nb2RlKEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbik7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX0Rpc2FibGVJU09Nb2RlKEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbik7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX0VuYWJsZUVkZ2VGaWx0ZXJpbmcoRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fRGlzYWJsZUVkZ2VGaWx0ZXJpbmcoRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuKTsNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAYWRkdG9ncm91cCBGRENBTl9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzDQotICogQHsNCi0gKi8NCi0vKiBDb250cm9sIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9TdGFydChGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9TdG9wKEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbik7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX0FkZE1lc3NhZ2VUb1R4Rmlmb1EoDQotICAgIEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwgRkRDQU5fVHhIZWFkZXJUeXBlRGVmICpwVHhIZWFkZXIsDQotICAgIHVpbnQ4X3QgKnBUeERhdGEpOw0KLXVpbnQzMl90IEhBTF9GRENBTl9HZXRMYXRlc3RUeEZpZm9RUmVxdWVzdEJ1ZmZlcihGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9BYm9ydFR4UmVxdWVzdChGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEJ1ZmZlckluZGV4KTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fR2V0UnhNZXNzYWdlKEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFJ4TG9jYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRENBTl9SeEhlYWRlclR5cGVEZWYgKnBSeEhlYWRlciwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBSeERhdGEpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9HZXRUeEV2ZW50KEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRENBTl9UeEV2ZW50Rmlmb1R5cGVEZWYgKnBUeEV2ZW50KTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fR2V0SGlnaFByaW9yaXR5TWVzc2FnZVN0YXR1cygNCi0gICAgRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLCBGRENBTl9IcE1zZ1N0YXR1c1R5cGVEZWYgKkhwTXNnU3RhdHVzKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fR2V0UHJvdG9jb2xTdGF0dXMoDQotICAgIEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwgRkRDQU5fUHJvdG9jb2xTdGF0dXNUeXBlRGVmICpQcm90b2NvbFN0YXR1cyk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX0dldEVycm9yQ291bnRlcnMoDQotICAgIEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwgRkRDQU5fRXJyb3JDb3VudGVyc1R5cGVEZWYgKkVycm9yQ291bnRlcnMpOw0KLXVpbnQzMl90IEhBTF9GRENBTl9Jc1R4QnVmZmVyTWVzc2FnZVBlbmRpbmcoRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVHhCdWZmZXJJbmRleCk7DQotdWludDMyX3QgSEFMX0ZEQ0FOX0dldFJ4Rmlmb0ZpbGxMZXZlbChGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBSeEZpZm8pOw0KLXVpbnQzMl90IEhBTF9GRENBTl9HZXRUeEZpZm9GcmVlTGV2ZWwoRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuKTsNCi11aW50MzJfdCBIQUxfRkRDQU5fSXNSZXN0cmljdGVkT3BlcmF0aW9uTW9kZShGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9FeGl0UmVzdHJpY3RlZE9wZXJhdGlvbk1vZGUoDQotICAgIEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbik7DQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGFkZHRvZ3JvdXAgRkRDQU5fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNA0KLSAqIEB7DQotICovDQotLyogSW50ZXJydXB0cyBtYW5hZ2VtZW50ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fQ29uZmlnSW50ZXJydXB0TGluZXMoRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBJVExpc3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEludGVycnVwdExpbmUpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9BY3RpdmF0ZU5vdGlmaWNhdGlvbihGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEFjdGl2ZUlUcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQnVmZmVySW5kZXhlcyk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX0RlYWN0aXZhdGVOb3RpZmljYXRpb24oRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEluYWN0aXZlSVRzKTsNCi12b2lkIEhBTF9GRENBTl9JUlFIYW5kbGVyKEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbik7DQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGFkZHRvZ3JvdXAgRkRDQU5fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNQ0KLSAqIEB7DQotICovDQotLyogQ2FsbGJhY2sgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi12b2lkIEhBTF9GRENBTl9UeEV2ZW50Rmlmb0NhbGxiYWNrKEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFR4RXZlbnRGaWZvSVRzKTsNCi12b2lkIEhBTF9GRENBTl9SeEZpZm8wQ2FsbGJhY2soRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBSeEZpZm8wSVRzKTsNCi12b2lkIEhBTF9GRENBTl9SeEZpZm8xQ2FsbGJhY2soRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBSeEZpZm8xSVRzKTsNCi12b2lkIEhBTF9GRENBTl9UeEZpZm9FbXB0eUNhbGxiYWNrKEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbik7DQotdm9pZCBIQUxfRkRDQU5fVHhCdWZmZXJDb21wbGV0ZUNhbGxiYWNrKEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQnVmZmVySW5kZXhlcyk7DQotdm9pZCBIQUxfRkRDQU5fVHhCdWZmZXJBYm9ydENhbGxiYWNrKEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQnVmZmVySW5kZXhlcyk7DQotdm9pZCBIQUxfRkRDQU5fSGlnaFByaW9yaXR5TWVzc2FnZUNhbGxiYWNrKEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbik7DQotdm9pZCBIQUxfRkRDQU5fVGltZXN0YW1wV3JhcGFyb3VuZENhbGxiYWNrKEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbik7DQotdm9pZCBIQUxfRkRDQU5fVGltZW91dE9jY3VycmVkQ2FsbGJhY2soRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuKTsNCi12b2lkIEhBTF9GRENBTl9FcnJvckNhbGxiYWNrKEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbik7DQotdm9pZCBIQUxfRkRDQU5fRXJyb3JTdGF0dXNDYWxsYmFjayhGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBFcnJvclN0YXR1c0lUcyk7DQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGFkZHRvZ3JvdXAgRkRDQU5fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNg0KLSAqIEB7DQotICovDQotLyogUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi11aW50MzJfdCBIQUxfRkRDQU5fR2V0RXJyb3IoRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuKTsNCi1IQUxfRkRDQU5fU3RhdGVUeXBlRGVmIEhBTF9GRENBTl9HZXRTdGF0ZShGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pOw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBkZWZncm91cCBGRENBTl9Qcml2YXRlX1ZhcmlhYmxlcyBGRENBTiBQcml2YXRlIFZhcmlhYmxlcw0KLSAqIEB7DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgRkRDQU5fUHJpdmF0ZV9Db25zdGFudHMgRkRDQU4gUHJpdmF0ZSBDb25zdGFudHMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGRlZmdyb3VwIEZEQ0FOX1ByaXZhdGVfTWFjcm9zIEZEQ0FOIFByaXZhdGUgTWFjcm9zDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIElTX0ZEQ0FOX0ZSQU1FX0ZPUk1BVChGT1JNQVQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKCgoRk9STUFUKSA9PSBGRENBTl9GUkFNRV9DTEFTU0lDKSB8fCAoKEZPUk1BVCkgPT0gRkRDQU5fRlJBTUVfRkRfTk9fQlJTKSB8fCBcDQotICAgKChGT1JNQVQpID09IEZEQ0FOX0ZSQU1FX0ZEX0JSUykpDQotI2RlZmluZSBJU19GRENBTl9NT0RFKE1PREUpICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKChNT0RFKSA9PSBGRENBTl9NT0RFX05PUk1BTCkgfHwgICAgICAgICAgICAgICBcDQotICAgKChNT0RFKSA9PSBGRENBTl9NT0RFX1JFU1RSSUNURURfT1BFUkFUSU9OKSB8fCBcDQotICAgKChNT0RFKSA9PSBGRENBTl9NT0RFX0JVU19NT05JVE9SSU5HKSB8fCAgICAgICBcDQotICAgKChNT0RFKSA9PSBGRENBTl9NT0RFX0lOVEVSTkFMX0xPT1BCQUNLKSB8fCAgICBcDQotICAgKChNT0RFKSA9PSBGRENBTl9NT0RFX0VYVEVSTkFMX0xPT1BCQUNLKSkNCi0jZGVmaW5lIElTX0ZEQ0FOX0NLRElWKENLRElWKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoKENLRElWKSA9PSBGRENBTl9DTE9DS19ESVYxKSB8fCAoKENLRElWKSA9PSBGRENBTl9DTE9DS19ESVYyKSB8fCAgIFwNCi0gICAoKENLRElWKSA9PSBGRENBTl9DTE9DS19ESVY0KSB8fCAoKENLRElWKSA9PSBGRENBTl9DTE9DS19ESVY2KSB8fCAgIFwNCi0gICAoKENLRElWKSA9PSBGRENBTl9DTE9DS19ESVY4KSB8fCAoKENLRElWKSA9PSBGRENBTl9DTE9DS19ESVYxMCkgfHwgIFwNCi0gICAoKENLRElWKSA9PSBGRENBTl9DTE9DS19ESVYxMikgfHwgKChDS0RJVikgPT0gRkRDQU5fQ0xPQ0tfRElWMTQpIHx8IFwNCi0gICAoKENLRElWKSA9PSBGRENBTl9DTE9DS19ESVYxNikgfHwgKChDS0RJVikgPT0gRkRDQU5fQ0xPQ0tfRElWMTgpIHx8IFwNCi0gICAoKENLRElWKSA9PSBGRENBTl9DTE9DS19ESVYyMCkgfHwgKChDS0RJVikgPT0gRkRDQU5fQ0xPQ0tfRElWMjIpIHx8IFwNCi0gICAoKENLRElWKSA9PSBGRENBTl9DTE9DS19ESVYyNCkgfHwgKChDS0RJVikgPT0gRkRDQU5fQ0xPQ0tfRElWMjYpIHx8IFwNCi0gICAoKENLRElWKSA9PSBGRENBTl9DTE9DS19ESVYyOCkgfHwgKChDS0RJVikgPT0gRkRDQU5fQ0xPQ0tfRElWMzApKQ0KLSNkZWZpbmUgSVNfRkRDQU5fTk9NSU5BTF9QUkVTQ0FMRVIoUFJFU0NBTEVSKSBcDQotICAoKChQUkVTQ0FMRVIpID49IDFVKSAmJiAoKFBSRVNDQUxFUikgPD0gNTEyVSkpDQotI2RlZmluZSBJU19GRENBTl9OT01JTkFMX1NKVyhTSlcpICgoKFNKVykgPj0gMVUpICYmICgoU0pXKSA8PSAxMjhVKSkNCi0jZGVmaW5lIElTX0ZEQ0FOX05PTUlOQUxfVFNFRzEoVFNFRzEpICgoKFRTRUcxKSA+PSAxVSkgJiYgKChUU0VHMSkgPD0gMjU2VSkpDQotI2RlZmluZSBJU19GRENBTl9OT01JTkFMX1RTRUcyKFRTRUcyKSAoKChUU0VHMikgPj0gMVUpICYmICgoVFNFRzIpIDw9IDEyOFUpKQ0KLSNkZWZpbmUgSVNfRkRDQU5fREFUQV9QUkVTQ0FMRVIoUFJFU0NBTEVSKSBcDQotICAoKChQUkVTQ0FMRVIpID49IDFVKSAmJiAoKFBSRVNDQUxFUikgPD0gMzJVKSkNCi0jZGVmaW5lIElTX0ZEQ0FOX0RBVEFfU0pXKFNKVykgKCgoU0pXKSA+PSAxVSkgJiYgKChTSlcpIDw9IDE2VSkpDQotI2RlZmluZSBJU19GRENBTl9EQVRBX1RTRUcxKFRTRUcxKSAoKChUU0VHMSkgPj0gMVUpICYmICgoVFNFRzEpIDw9IDMyVSkpDQotI2RlZmluZSBJU19GRENBTl9EQVRBX1RTRUcyKFRTRUcyKSAoKChUU0VHMikgPj0gMVUpICYmICgoVFNFRzIpIDw9IDE2VSkpDQotI2RlZmluZSBJU19GRENBTl9NQVhfVkFMVUUoVkFMVUUsIF9NQVhfKSAoKFZBTFVFKSA8PSAoX01BWF8pKQ0KLSNkZWZpbmUgSVNfRkRDQU5fTUlOX1ZBTFVFKFZBTFVFLCBfTUlOXykgKChWQUxVRSkgPj0gKF9NSU5fKSkNCi0jZGVmaW5lIElTX0ZEQ0FOX1RYX0ZJRk9fUVVFVUVfTU9ERShNT0RFKSBcDQotICAoKChNT0RFKSA9PSBGRENBTl9UWF9GSUZPX09QRVJBVElPTikgfHwgKChNT0RFKSA9PSBGRENBTl9UWF9RVUVVRV9PUEVSQVRJT04pKQ0KLSNkZWZpbmUgSVNfRkRDQU5fSURfVFlQRShJRF9UWVBFKSBcDQotICAoKChJRF9UWVBFKSA9PSBGRENBTl9TVEFOREFSRF9JRCkgfHwgKChJRF9UWVBFKSA9PSBGRENBTl9FWFRFTkRFRF9JRCkpDQotI2RlZmluZSBJU19GRENBTl9GSUxURVJfQ0ZHKENPTkZJRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoKENPTkZJRykgPT0gRkRDQU5fRklMVEVSX0RJU0FCTEUpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoQ09ORklHKSA9PSBGRENBTl9GSUxURVJfVE9fUlhGSUZPMCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKChDT05GSUcpID09IEZEQ0FOX0ZJTFRFUl9UT19SWEZJRk8xKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKENPTkZJRykgPT0gRkRDQU5fRklMVEVSX1JFSkVDVCkgfHwgKChDT05GSUcpID09IEZEQ0FOX0ZJTFRFUl9IUCkgfHwgXA0KLSAgICgoQ09ORklHKSA9PSBGRENBTl9GSUxURVJfVE9fUlhGSUZPMF9IUCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKChDT05GSUcpID09IEZEQ0FOX0ZJTFRFUl9UT19SWEZJRk8xX0hQKSkNCi0jZGVmaW5lIElTX0ZEQ0FOX1RYX0xPQ0FUSU9OKExPQ0FUSU9OKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKChMT0NBVElPTikgPT0gRkRDQU5fVFhfQlVGRkVSMCkgfHwgKChMT0NBVElPTikgPT0gRkRDQU5fVFhfQlVGRkVSMSkgfHwgXA0KLSAgICgoTE9DQVRJT04pID09IEZEQ0FOX1RYX0JVRkZFUjIpKQ0KLSNkZWZpbmUgSVNfRkRDQU5fVFhfTE9DQVRJT05fTElTVChMT0NBVElPTikgXA0KLSAgKCgoTE9DQVRJT04pID49IEZEQ0FOX1RYX0JVRkZFUjApICYmICAgICAgXA0KLSAgICgoTE9DQVRJT04pIDw9IChGRENBTl9UWF9CVUZGRVIwIHwgRkRDQU5fVFhfQlVGRkVSMSB8IEZEQ0FOX1RYX0JVRkZFUjIpKSkNCi0jZGVmaW5lIElTX0ZEQ0FOX1JYX0ZJRk8oRklGTykgXA0KLSAgKCgoRklGTykgPT0gRkRDQU5fUlhfRklGTzApIHx8ICgoRklGTykgPT0gRkRDQU5fUlhfRklGTzEpKQ0KLSNkZWZpbmUgSVNfRkRDQU5fUlhfRklGT19NT0RFKE1PREUpIFwNCi0gICgoKE1PREUpID09IEZEQ0FOX1JYX0ZJRk9fQkxPQ0tJTkcpIHx8ICgoTU9ERSkgPT0gRkRDQU5fUlhfRklGT19PVkVSV1JJVEUpKQ0KLSNkZWZpbmUgSVNfRkRDQU5fU1REX0ZJTFRFUl9UWVBFKFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKChUWVBFKSA9PSBGRENBTl9GSUxURVJfUkFOR0UpIHx8ICgoVFlQRSkgPT0gRkRDQU5fRklMVEVSX0RVQUwpIHx8IFwNCi0gICAoKFRZUEUpID09IEZEQ0FOX0ZJTFRFUl9NQVNLKSkNCi0jZGVmaW5lIElTX0ZEQ0FOX0VYVF9GSUxURVJfVFlQRShUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKCgoVFlQRSkgPT0gRkRDQU5fRklMVEVSX1JBTkdFKSB8fCAoKFRZUEUpID09IEZEQ0FOX0ZJTFRFUl9EVUFMKSB8fCBcDQotICAgKChUWVBFKSA9PSBGRENBTl9GSUxURVJfTUFTSykgfHwgKChUWVBFKSA9PSBGRENBTl9GSUxURVJfUkFOR0VfTk9fRUlETSkpDQotI2RlZmluZSBJU19GRENBTl9GUkFNRV9UWVBFKFRZUEUpIFwNCi0gICgoKFRZUEUpID09IEZEQ0FOX0RBVEFfRlJBTUUpIHx8ICgoVFlQRSkgPT0gRkRDQU5fUkVNT1RFX0ZSQU1FKSkNCi0jZGVmaW5lIElTX0ZEQ0FOX0RMQyhETEMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKChETEMpID09IEZEQ0FOX0RMQ19CWVRFU18wKSB8fCAoKERMQykgPT0gRkRDQU5fRExDX0JZVEVTXzEpIHx8ICAgXA0KLSAgICgoRExDKSA9PSBGRENBTl9ETENfQllURVNfMikgfHwgKChETEMpID09IEZEQ0FOX0RMQ19CWVRFU18zKSB8fCAgIFwNCi0gICAoKERMQykgPT0gRkRDQU5fRExDX0JZVEVTXzQpIHx8ICgoRExDKSA9PSBGRENBTl9ETENfQllURVNfNSkgfHwgICBcDQotICAgKChETEMpID09IEZEQ0FOX0RMQ19CWVRFU182KSB8fCAoKERMQykgPT0gRkRDQU5fRExDX0JZVEVTXzcpIHx8ICAgXA0KLSAgICgoRExDKSA9PSBGRENBTl9ETENfQllURVNfOCkgfHwgKChETEMpID09IEZEQ0FOX0RMQ19CWVRFU18xMikgfHwgIFwNCi0gICAoKERMQykgPT0gRkRDQU5fRExDX0JZVEVTXzE2KSB8fCAoKERMQykgPT0gRkRDQU5fRExDX0JZVEVTXzIwKSB8fCBcDQotICAgKChETEMpID09IEZEQ0FOX0RMQ19CWVRFU18yNCkgfHwgKChETEMpID09IEZEQ0FOX0RMQ19CWVRFU18zMikgfHwgXA0KLSAgICgoRExDKSA9PSBGRENBTl9ETENfQllURVNfNDgpIHx8ICgoRExDKSA9PSBGRENBTl9ETENfQllURVNfNjQpKQ0KLSNkZWZpbmUgSVNfRkRDQU5fRVNJKEVTSSkgXA0KLSAgKCgoRVNJKSA9PSBGRENBTl9FU0lfQUNUSVZFKSB8fCAoKEVTSSkgPT0gRkRDQU5fRVNJX1BBU1NJVkUpKQ0KLSNkZWZpbmUgSVNfRkRDQU5fQlJTKEJSUykgKCgoQlJTKSA9PSBGRENBTl9CUlNfT0ZGKSB8fCAoKEJSUykgPT0gRkRDQU5fQlJTX09OKSkNCi0jZGVmaW5lIElTX0ZEQ0FOX0ZERihGREYpIFwNCi0gICgoKEZERikgPT0gRkRDQU5fQ0xBU1NJQ19DQU4pIHx8ICgoRkRGKSA9PSBGRENBTl9GRF9DQU4pKQ0KLSNkZWZpbmUgSVNfRkRDQU5fRUZDKEVGQykgXA0KLSAgKCgoRUZDKSA9PSBGRENBTl9OT19UWF9FVkVOVFMpIHx8ICgoRUZDKSA9PSBGRENBTl9TVE9SRV9UWF9FVkVOVFMpKQ0KLSNkZWZpbmUgSVNfRkRDQU5fSVQoSVQpICgoKElUKSAmIH4oRkRDQU5fSVJfTUFTSykpID09IDBVKQ0KLSNkZWZpbmUgSVNfRkRDQU5fSVRfR1JPVVAoSVRfR1JPVVApICgoKElUX0dST1VQKSAmIH4oRkRDQU5fSUxTX01BU0spKSA9PSAwVSkNCi0jZGVmaW5lIElTX0ZEQ0FOX05PTl9NQVRDSElORyhERVNUSU5BVElPTikgICAgICAgIFwNCi0gICgoKERFU1RJTkFUSU9OKSA9PSBGRENBTl9BQ0NFUFRfSU5fUlhfRklGTzApIHx8IFwNCi0gICAoKERFU1RJTkFUSU9OKSA9PSBGRENBTl9BQ0NFUFRfSU5fUlhfRklGTzEpIHx8IFwNCi0gICAoKERFU1RJTkFUSU9OKSA9PSBGRENBTl9SRUpFQ1QpKQ0KLSNkZWZpbmUgSVNfRkRDQU5fUkVKRUNUX1JFTU9URShERVNUSU5BVElPTikgIFwNCi0gICgoKERFU1RJTkFUSU9OKSA9PSBGRENBTl9GSUxURVJfUkVNT1RFKSB8fCBcDQotICAgKChERVNUSU5BVElPTikgPT0gRkRDQU5fUkVKRUNUX1JFTU9URSkpDQotI2RlZmluZSBJU19GRENBTl9JVF9MSU5FKElUX0xJTkUpIFwNCi0gICgoKElUX0xJTkUpID09IEZEQ0FOX0lOVEVSUlVQVF9MSU5FMCkgfHwgKChJVF9MSU5FKSA9PSBGRENBTl9JTlRFUlJVUFRfTElORTEpKQ0KLSNkZWZpbmUgSVNfRkRDQU5fVElNRVNUQU1QKE9QRVJBVElPTikgICAgICAgICAgIFwNCi0gICgoKE9QRVJBVElPTikgPT0gRkRDQU5fVElNRVNUQU1QX0lOVEVSTkFMKSB8fCBcDQotICAgKChPUEVSQVRJT04pID09IEZEQ0FOX1RJTUVTVEFNUF9FWFRFUk5BTCkpDQotI2RlZmluZSBJU19GRENBTl9USU1FU1RBTVBfUFJFU0NBTEVSKFBSRVNDQUxFUikgXA0KLSAgKCgoUFJFU0NBTEVSKSA9PSBGRENBTl9USU1FU1RBTVBfUFJFU0NfMSkgfHwgIFwNCi0gICAoKFBSRVNDQUxFUikgPT0gRkRDQU5fVElNRVNUQU1QX1BSRVNDXzIpIHx8ICBcDQotICAgKChQUkVTQ0FMRVIpID09IEZEQ0FOX1RJTUVTVEFNUF9QUkVTQ18zKSB8fCAgXA0KLSAgICgoUFJFU0NBTEVSKSA9PSBGRENBTl9USU1FU1RBTVBfUFJFU0NfNCkgfHwgIFwNCi0gICAoKFBSRVNDQUxFUikgPT0gRkRDQU5fVElNRVNUQU1QX1BSRVNDXzUpIHx8ICBcDQotICAgKChQUkVTQ0FMRVIpID09IEZEQ0FOX1RJTUVTVEFNUF9QUkVTQ182KSB8fCAgXA0KLSAgICgoUFJFU0NBTEVSKSA9PSBGRENBTl9USU1FU1RBTVBfUFJFU0NfNykgfHwgIFwNCi0gICAoKFBSRVNDQUxFUikgPT0gRkRDQU5fVElNRVNUQU1QX1BSRVNDXzgpIHx8ICBcDQotICAgKChQUkVTQ0FMRVIpID09IEZEQ0FOX1RJTUVTVEFNUF9QUkVTQ185KSB8fCAgXA0KLSAgICgoUFJFU0NBTEVSKSA9PSBGRENBTl9USU1FU1RBTVBfUFJFU0NfMTApIHx8IFwNCi0gICAoKFBSRVNDQUxFUikgPT0gRkRDQU5fVElNRVNUQU1QX1BSRVNDXzExKSB8fCBcDQotICAgKChQUkVTQ0FMRVIpID09IEZEQ0FOX1RJTUVTVEFNUF9QUkVTQ18xMikgfHwgXA0KLSAgICgoUFJFU0NBTEVSKSA9PSBGRENBTl9USU1FU1RBTVBfUFJFU0NfMTMpIHx8IFwNCi0gICAoKFBSRVNDQUxFUikgPT0gRkRDQU5fVElNRVNUQU1QX1BSRVNDXzE0KSB8fCBcDQotICAgKChQUkVTQ0FMRVIpID09IEZEQ0FOX1RJTUVTVEFNUF9QUkVTQ18xNSkgfHwgXA0KLSAgICgoUFJFU0NBTEVSKSA9PSBGRENBTl9USU1FU1RBTVBfUFJFU0NfMTYpKQ0KLSNkZWZpbmUgSVNfRkRDQU5fVElNRU9VVChPUEVSQVRJT04pICAgICAgICAgICAgICAgIFwNCi0gICgoKE9QRVJBVElPTikgPT0gRkRDQU5fVElNRU9VVF9DT05USU5VT1VTKSB8fCAgICBcDQotICAgKChPUEVSQVRJT04pID09IEZEQ0FOX1RJTUVPVVRfVFhfRVZFTlRfRklGTykgfHwgXA0KLSAgICgoT1BFUkFUSU9OKSA9PSBGRENBTl9USU1FT1VUX1JYX0ZJRk8wKSB8fCAgICAgIFwNCi0gICAoKE9QRVJBVElPTikgPT0gRkRDQU5fVElNRU9VVF9SWF9GSUZPMSkpDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiBQcml2YXRlIGZ1bmN0aW9ucyBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qIFByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLSNlbmRpZiAvKiBGRENBTjEgKi8NCi0NCi0jaWZkZWYgX19jcGx1c3BsdXMNCi19DQotI2VuZGlmDQotDQotI2VuZGlmIC8qIFNUTTMyRzR4eF9IQUxfRkRDQU5fSCAqLw0KKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGZpbGUgICAgc3RtMzJnNHh4X2hhbF9mZGNhbi5oCisgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgRkRDQU4gSEFMIG1vZHVsZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBhdHRlbnRpb24KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRlcm1zIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUKKyAqIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4KKyAqIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcyB3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMkc0eHhfSEFMX0ZEQ0FOX0gKKyNkZWZpbmUgU1RNMzJHNHh4X0hBTF9GRENBTl9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmc0eHhfaGFsX2RlZi5oIgorCisjaWYgZGVmaW5lZChGRENBTjEpCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkc0eHhfSEFMX0RyaXZlcgorICogQHsKKyAqLworCisvKiogQGFkZHRvZ3JvdXAgRkRDQU4KKyAqIEB7CisgKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRkRDQU5fRXhwb3J0ZWRfVHlwZXMgRkRDQU4gRXhwb3J0ZWQgVHlwZXMKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgSEFMIFN0YXRlIHN0cnVjdHVyZXMgZGVmaW5pdGlvbgorICovCit0eXBlZGVmIGVudW0geworICBIQUxfRkRDQU5fU1RBVEVfUkVTRVQgPSAweDAwVSwgLyohPCBGRENBTiBub3QgeWV0IGluaXRpYWxpemVkIG9yIGRpc2FibGVkICovCisgIEhBTF9GRENBTl9TVEFURV9SRUFEWSA9IDB4MDFVLCAvKiE8IEZEQ0FOIGluaXRpYWxpemVkIGFuZCByZWFkeSBmb3IgdXNlICAgKi8KKyAgSEFMX0ZEQ0FOX1NUQVRFX0JVU1kgPSAweDAyVSwgIC8qITwgRkRDQU4gcHJvY2VzcyBpcyBvbmdvaW5nICAgICAgICAgICAgICAqLworICBIQUxfRkRDQU5fU1RBVEVfRVJST1IgPSAweDAzVSAgLyohPCBGRENBTiBlcnJvciBzdGF0ZSAgICAgICAgICAgICAgICAgICAgICovCit9IEhBTF9GRENBTl9TdGF0ZVR5cGVEZWY7CisKKy8qKgorICogQGJyaWVmIEZEQ0FOIEluaXQgc3RydWN0dXJlIGRlZmluaXRpb24KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50MzJfdCBDbG9ja0RpdmlkZXI7IC8qITwgU3BlY2lmaWVzIHRoZSBGRENBTiBrZXJuZWwgY2xvY2sgZGl2aWRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBjbG9jayBpcyBjb21tb24gdG8gYWxsIEZEQ0FOIGluc3RhbmNlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGlzIGFwcGxpZWQgb25seSBhdCBpbml0aWFsaXNhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIGZpcnN0IEZEQ0FOIGluc3RhbmNlLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIG9mIEByZWYgRkRDQU5fY2xvY2tfZGl2aWRlci4gICAqLworCisgIHVpbnQzMl90IEZyYW1lRm9ybWF0OyAvKiE8IFNwZWNpZmllcyB0aGUgRkRDQU4gZnJhbWUgZm9ybWF0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGRENBTl9mcmFtZV9mb3JtYXQgICAgICovCisKKyAgdWludDMyX3QKKyAgICAgIE1vZGU7IC8qITwgU3BlY2lmaWVzIHRoZSBGRENBTiBtb2RlLgorICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEZEQ0FOX29wZXJhdGluZ19tb2RlICAgKi8KKworICBGdW5jdGlvbmFsU3RhdGUgQXV0b1JldHJhbnNtaXNzaW9uOyAvKiE8IEVuYWJsZSBvciBkaXNhYmxlIHRoZSBhdXRvbWF0aWMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0cmFuc21pc3Npb24gbW9kZS4gVGhpcyBwYXJhbWV0ZXIgY2FuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHNldCB0byBFTkFCTEUgb3IgRElTQUJMRSAqLworCisgIEZ1bmN0aW9uYWxTdGF0ZQorICAgICAgVHJhbnNtaXRQYXVzZTsgLyohPCBFbmFibGUgb3IgZGlzYWJsZSB0aGUgVHJhbnNtaXQgUGF1c2UgZmVhdHVyZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHNldCB0byBFTkFCTEUgb3IgRElTQUJMRSAqLworCisgIEZ1bmN0aW9uYWxTdGF0ZQorICAgICAgUHJvdG9jb2xFeGNlcHRpb247IC8qITwgRW5hYmxlIG9yIGRpc2FibGUgdGhlIFByb3RvY29sIEV4Y2VwdGlvbiBIYW5kbGluZy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHNldCB0byBFTkFCTEUgb3IgRElTQUJMRSAqLworCisgIHVpbnQzMl90IE5vbWluYWxQcmVzY2FsZXI7IC8qITwgU3BlY2lmaWVzIHRoZSB2YWx1ZSBieSB3aGljaCB0aGUgb3NjaWxsYXRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVxdWVuY3kgaXMgZGl2aWRlZCBmb3IgZ2VuZXJhdGluZyB0aGUgbm9taW5hbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXQgdGltZSBxdWFudGEuIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmV0d2VlbiAxIGFuZCA1MTIgICAgICAgICAgICAqLworCisgIHVpbnQzMl90CisgICAgICBOb21pbmFsU3luY0p1bXBXaWR0aDsgLyohPCBTcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHRpbWUgcXVhbnRhIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZEQ0FOIGhhcmR3YXJlIGlzIGFsbG93ZWQgdG8gbGVuZ3RoZW4gb3Igc2hvcnRlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgYml0IHRvIHBlcmZvcm0gcmVzeW5jaHJvbml6YXRpb24uIFRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIDEgYW5kIDEyOCAqLworCisgIHVpbnQzMl90IE5vbWluYWxUaW1lU2VnMTsgLyohPCBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiB0aW1lIHF1YW50YSBpbiBCaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWdtZW50IDEuIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXR3ZWVuIDIgYW5kIDI1NiAgICAgICAgICAgICovCisKKyAgdWludDMyX3QgTm9taW5hbFRpbWVTZWcyOyAvKiE8IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHRpbWUgcXVhbnRhIGluIEJpdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlZ21lbnQgMi4gVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJldHdlZW4gMiBhbmQgMTI4ICAgICAgICAgICAgKi8KKworICB1aW50MzJfdCBEYXRhUHJlc2NhbGVyOyAvKiE8IFNwZWNpZmllcyB0aGUgdmFsdWUgYnkgd2hpY2ggdGhlIG9zY2lsbGF0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlcXVlbmN5IGlzIGRpdmlkZWQgZm9yIGdlbmVyYXRpbmcgdGhlIGRhdGEgYml0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUgcXVhbnRhLiBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJldHdlZW4gMSBhbmQgMzIgICAgICAgICAgICAgKi8KKworICB1aW50MzJfdCBEYXRhU3luY0p1bXBXaWR0aDsgLyohPCBTcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHRpbWUgcXVhbnRhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgRkRDQU4gaGFyZHdhcmUgaXMgYWxsb3dlZCB0byBsZW5ndGhlbiBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRlbiBhIGRhdGEgYml0IHRvIHBlcmZvcm0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3luY2hyb25pemF0aW9uLiBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciBiZXR3ZWVuIDEgYW5kIDE2ICAgICAgICAgICAgICovCisKKyAgdWludDMyX3QgRGF0YVRpbWVTZWcxOyAvKiE8IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHRpbWUgcXVhbnRhIGluIERhdGEgQml0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VnbWVudCAxLiBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCAzMiAgICAgICAgICAgICAqLworCisgIHVpbnQzMl90IERhdGFUaW1lU2VnMjsgLyohPCBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiB0aW1lIHF1YW50YSBpbiBEYXRhIEJpdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlZ21lbnQgMi4gVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgMTYgICAgICAgICAgICAgKi8KKworICB1aW50MzJfdAorICAgICAgU3RkRmlsdGVyc05icjsgLyohPCBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBzdGFuZGFyZCBNZXNzYWdlIElEIGZpbHRlcnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAyOCAqLworCisgIHVpbnQzMl90CisgICAgICBFeHRGaWx0ZXJzTmJyOyAvKiE8IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGV4dGVuZGVkIE1lc3NhZ2UgSUQgZmlsdGVycy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDggKi8KKworICB1aW50MzJfdCBUeEZpZm9RdWV1ZU1vZGU7IC8qITwgVHggRklGTy9RdWV1ZSBNb2RlIHNlbGVjdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRENBTl90eEZpZm9RdWV1ZV9Nb2RlICovCisKK30gRkRDQU5fSW5pdFR5cGVEZWY7CisKKy8qKgorICogQGJyaWVmICBGRENBTiBmaWx0ZXIgc3RydWN0dXJlIGRlZmluaXRpb24KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50MzJfdCBJZFR5cGU7IC8qITwgU3BlY2lmaWVzIHRoZSBpZGVudGlmaWVyIHR5cGUuCisgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEZEQ0FOX2lkX3R5cGUgKi8KKworICB1aW50MzJfdCBGaWx0ZXJJbmRleDsgLyohPCBTcGVjaWZpZXMgdGhlIGZpbHRlciB3aGljaCB3aWxsIGJlIGluaXRpYWxpemVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW46CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDAgYW5kIChTUkFNQ0FOX0ZMU19OQlItMSksIGlmIElkVHlwZSBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRDQU5fU1RBTkRBUkRfSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMCBhbmQgKFNSQU1DQU5fRkxFX05CUi0xKSwgaWYgSWRUeXBlIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGRENBTl9FWFRFTkRFRF9JRCAqLworCisgIHVpbnQzMl90CisgICAgICBGaWx0ZXJUeXBlOyAvKiE8IFNwZWNpZmllcyB0aGUgZmlsdGVyIHR5cGUuCisgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRkRDQU5fZmlsdGVyX3R5cGUuCisgICAgICAgICAgICAgICAgICAgICAgIFRoZSB2YWx1ZSBGRENBTl9GSUxURVJfUkFOR0VfTk9fRUlETSBpcyBwZXJtaXR0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgb25seSB3aGVuIElkVHlwZSBpcyBGRENBTl9FWFRFTkRFRF9JRC4gKi8KKworICB1aW50MzJfdCBGaWx0ZXJDb25maWc7IC8qITwgU3BlY2lmaWVzIHRoZSBmaWx0ZXIgY29uZmlndXJhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRENBTl9maWx0ZXJfY29uZmlnICovCisKKyAgdWludDMyX3QKKyAgICAgIEZpbHRlcklEMTsgLyohPCBTcGVjaWZpZXMgdGhlIGZpbHRlciBpZGVudGlmaWNhdGlvbiAxLgorICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbjoKKyAgICAgICAgICAgICAgICAgICAgICAgLSAwIGFuZCAweDdGRiwgaWYgSWRUeXBlIGlzIEZEQ0FOX1NUQU5EQVJEX0lECisgICAgICAgICAgICAgICAgICAgICAgIC0gMCBhbmQgMHgxRkZGRkZGRiwgaWYgSWRUeXBlIGlzIEZEQ0FOX0VYVEVOREVEX0lEICovCisKKyAgdWludDMyX3QKKyAgICAgIEZpbHRlcklEMjsgLyohPCBTcGVjaWZpZXMgdGhlIGZpbHRlciBpZGVudGlmaWNhdGlvbiAyLgorICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbjoKKyAgICAgICAgICAgICAgICAgICAgICAgLSAwIGFuZCAweDdGRiwgaWYgSWRUeXBlIGlzIEZEQ0FOX1NUQU5EQVJEX0lECisgICAgICAgICAgICAgICAgICAgICAgIC0gMCBhbmQgMHgxRkZGRkZGRiwgaWYgSWRUeXBlIGlzIEZEQ0FOX0VYVEVOREVEX0lEICovCisKK30gRkRDQU5fRmlsdGVyVHlwZURlZjsKKworLyoqCisgKiBAYnJpZWYgIEZEQ0FOIFR4IGhlYWRlciBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQzMl90CisgICAgICBJZGVudGlmaWVyOyAvKiE8IFNwZWNpZmllcyB0aGUgaWRlbnRpZmllci4KKyAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuOgorICAgICAgICAgICAgICAgICAgICAgICAgLSAwIGFuZCAweDdGRiwgaWYgSWRUeXBlIGlzIEZEQ0FOX1NUQU5EQVJEX0lECisgICAgICAgICAgICAgICAgICAgICAgICAtIDAgYW5kIDB4MUZGRkZGRkYsIGlmIElkVHlwZSBpcyBGRENBTl9FWFRFTkRFRF9JRCAqLworCisgIHVpbnQzMl90CisgICAgICBJZFR5cGU7IC8qITwgU3BlY2lmaWVzIHRoZSBpZGVudGlmaWVyIHR5cGUgZm9yIHRoZSBtZXNzYWdlIHRoYXQgd2lsbCBiZQorICAgICAgICAgICAgICAgICAgIHRyYW5zbWl0dGVkLgorICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRkRDQU5faWRfdHlwZSAqLworCisgIHVpbnQzMl90IFR4RnJhbWVUeXBlOyAvKiE8IFNwZWNpZmllcyB0aGUgZnJhbWUgdHlwZSBvZiB0aGUgbWVzc2FnZSB0aGF0IHdpbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHRyYW5zbWl0dGVkLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGRENBTl9mcmFtZV90eXBlICAgICAgICAgICAgKi8KKworICB1aW50MzJfdCBEYXRhTGVuZ3RoOyAvKiE8IFNwZWNpZmllcyB0aGUgbGVuZ3RoIG9mIHRoZSBmcmFtZSB0aGF0IHdpbGwgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNtaXR0ZWQuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRkRDQU5fZGF0YV9sZW5ndGhfY29kZSAgICAgKi8KKworICB1aW50MzJfdCBFcnJvclN0YXRlSW5kaWNhdG9yOyAvKiE8IFNwZWNpZmllcyB0aGUgZXJyb3Igc3RhdGUgaW5kaWNhdG9yLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRDQU5fZXJyb3Jfc3RhdGVfaW5kaWNhdG9yICovCisKKyAgdWludDMyX3QgQml0UmF0ZVN3aXRjaDsgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgVHggZnJhbWUgd2lsbCBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc21pdHRlZCB3aXRoIG9yIHdpdGhvdXQgYml0IHJhdGUgc3dpdGNoaW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRDQU5fYml0X3JhdGVfc3dpdGNoaW5nICAgICovCisKKyAgdWludDMyX3QgRkRGb3JtYXQ7IC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIFR4IGZyYW1lIHdpbGwgYmUgdHJhbnNtaXR0ZWQgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzaWMgb3IgRkQgZm9ybWF0LiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBGRENBTl9mb3JtYXQgICAgICAgICAgICAgICAgKi8KKworICB1aW50MzJfdCBUeEV2ZW50Rmlmb0NvbnRyb2w7IC8qITwgU3BlY2lmaWVzIHRoZSBldmVudCBGSUZPIGNvbnRyb2wuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRDQU5fRUZDICAgICAgICAgICAgICAgICAgICovCisKKyAgdWludDMyX3QgTWVzc2FnZU1hcmtlcjsgLyohPCBTcGVjaWZpZXMgdGhlIG1lc3NhZ2UgbWFya2VyIHRvIGJlIGNvcGllZCBpbnRvIFR4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50IEZJRk8gZWxlbWVudCBmb3IgaWRlbnRpZmljYXRpb24gb2YgVHggbWVzc2FnZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCAweEZGICAgICAgICAgICAgICAgICovCisKK30gRkRDQU5fVHhIZWFkZXJUeXBlRGVmOworCisvKioKKyAqIEBicmllZiAgRkRDQU4gUnggaGVhZGVyIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDMyX3QKKyAgICAgIElkZW50aWZpZXI7IC8qITwgU3BlY2lmaWVzIHRoZSBpZGVudGlmaWVyLgorICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW46CisgICAgICAgICAgICAgICAgICAgICAgICAtIDAgYW5kIDB4N0ZGLCBpZiBJZFR5cGUgaXMgRkRDQU5fU1RBTkRBUkRfSUQKKyAgICAgICAgICAgICAgICAgICAgICAgIC0gMCBhbmQgMHgxRkZGRkZGRiwgaWYgSWRUeXBlIGlzIEZEQ0FOX0VYVEVOREVEX0lEICovCisKKyAgdWludDMyX3QgSWRUeXBlOyAvKiE8IFNwZWNpZmllcyB0aGUgaWRlbnRpZmllciB0eXBlIG9mIHRoZSByZWNlaXZlZCBtZXNzYWdlLgorICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBGRENBTl9pZF90eXBlICovCisKKyAgdWludDMyX3QgUnhGcmFtZVR5cGU7IC8qITwgU3BlY2lmaWVzIHRoZSB0aGUgcmVjZWl2ZWQgbWVzc2FnZSBmcmFtZSB0eXBlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGRENBTl9mcmFtZV90eXBlICAgICAgICAgICAgKi8KKworICB1aW50MzJfdCBEYXRhTGVuZ3RoOyAvKiE8IFNwZWNpZmllcyB0aGUgcmVjZWl2ZWQgZnJhbWUgbGVuZ3RoLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZEQ0FOX2RhdGFfbGVuZ3RoX2NvZGUgICAgICovCisKKyAgdWludDMyX3QgRXJyb3JTdGF0ZUluZGljYXRvcjsgLyohPCBTcGVjaWZpZXMgdGhlIGVycm9yIHN0YXRlIGluZGljYXRvci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZEQ0FOX2Vycm9yX3N0YXRlX2luZGljYXRvciAqLworCisgIHVpbnQzMl90IEJpdFJhdGVTd2l0Y2g7IC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIFJ4IGZyYW1lIGlzIHJlY2VpdmVkIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Igd2l0aG91dCBiaXQgcmF0ZSBzd2l0Y2hpbmcuIFRoaXMgcGFyYW1ldGVyIGNhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBhIHZhbHVlIG9mIEByZWYgRkRDQU5fYml0X3JhdGVfc3dpdGNoaW5nICAgICovCisKKyAgdWludDMyX3QKKyAgICAgIEZERm9ybWF0OyAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBSeCBmcmFtZSBpcyByZWNlaXZlZCBpbiBjbGFzc2ljIG9yIEZECisgICAgICAgICAgICAgICAgICAgICBmb3JtYXQuCisgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEZEQ0FOX2Zvcm1hdCAqLworCisgIHVpbnQzMl90IFJ4VGltZXN0YW1wOyAvKiE8IFNwZWNpZmllcyB0aGUgdGltZXN0YW1wIGNvdW50ZXIgdmFsdWUgY2FwdHVyZWQgb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0IG9mIGZyYW1lIHJlY2VwdGlvbi4gVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgYmV0d2VlbiAwIGFuZCAweEZGRkYgICAgICAgICAgICAgICovCisKKyAgdWludDMyX3QKKyAgICAgIEZpbHRlckluZGV4OyAvKiE8IFNwZWNpZmllcyB0aGUgaW5kZXggb2YgbWF0Y2hpbmcgUnggYWNjZXB0YW5jZSBmaWx0ZXIKKyAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LiBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW46CisgICAgICAgICAgICAgICAgICAgICAgICAgLSAwIGFuZCAoU1JBTUNBTl9GTFNfTkJSLTEpLCBpZiBJZFR5cGUgaXMKKyAgICAgICAgICAgICAgICAgICAgICBGRENBTl9TVEFOREFSRF9JRAorICAgICAgICAgICAgICAgICAgICAgICAgIC0gMCBhbmQgKFNSQU1DQU5fRkxFX05CUi0xKSwgaWYgSWRUeXBlIGlzCisgICAgICAgICAgICAgICAgICAgICAgRkRDQU5fRVhURU5ERURfSUQgV2hlbiB0aGUgZnJhbWUgaXMgYSBOb24tRmlsdGVyIG1hdGNoaW5nCisgICAgICAgICAgICAgICAgICAgICAgZnJhbWUsIHRoaXMgcGFyYW1ldGVyIGlzIHVudXNlZC4gKi8KKworICB1aW50MzJfdCBJc0ZpbHRlck1hdGNoaW5nRnJhbWU7IC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGFjY2VwdGVkIGZyYW1lIGRpZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBtYXRjaCBhbnkgUnggZmlsdGVyLiBBY2NlcHRhbmNlIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uLW1hdGNoaW5nIGZyYW1lcyBtYXkgYmUgZW5hYmxlZCB2aWEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9GRENBTl9Db25maWdHbG9iYWxGaWx0ZXIoKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIHRha2VzIDAgaWYgdGhlIGZyYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZCBhbiBSeCBmaWx0ZXIgb3IgMSBpZiBpdCBkaWQgbm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggYW55IFJ4IGZpbHRlciAqLworCit9IEZEQ0FOX1J4SGVhZGVyVHlwZURlZjsKKworLyoqCisgKiBAYnJpZWYgIEZEQ0FOIFR4IGV2ZW50IEZJRk8gc3RydWN0dXJlIGRlZmluaXRpb24KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50MzJfdAorICAgICAgSWRlbnRpZmllcjsgLyohPCBTcGVjaWZpZXMgdGhlIGlkZW50aWZpZXIuCisgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIC0gMCBhbmQgMHg3RkYsIGlmIElkVHlwZSBpcyBGRENBTl9TVEFOREFSRF9JRAorICAgICAgICAgICAgICAgICAgICAgICAgLSAwIGFuZCAweDFGRkZGRkZGLCBpZiBJZFR5cGUgaXMgRkRDQU5fRVhURU5ERURfSUQgKi8KKworICB1aW50MzJfdAorICAgICAgSWRUeXBlOyAvKiE8IFNwZWNpZmllcyB0aGUgaWRlbnRpZmllciB0eXBlIGZvciB0aGUgdHJhbnNtaXR0ZWQgbWVzc2FnZS4KKyAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEZEQ0FOX2lkX3R5cGUgKi8KKworICB1aW50MzJfdCBUeEZyYW1lVHlwZTsgLyohPCBTcGVjaWZpZXMgdGhlIGZyYW1lIHR5cGUgb2YgdGhlIHRyYW5zbWl0dGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGRENBTl9mcmFtZV90eXBlICAgICAgICAgICAgKi8KKworICB1aW50MzJfdCBEYXRhTGVuZ3RoOyAvKiE8IFNwZWNpZmllcyB0aGUgbGVuZ3RoIG9mIHRoZSB0cmFuc21pdHRlZCBmcmFtZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZEQ0FOX2RhdGFfbGVuZ3RoX2NvZGUgICAgICAqLworCisgIHVpbnQzMl90IEVycm9yU3RhdGVJbmRpY2F0b3I7IC8qITwgU3BlY2lmaWVzIHRoZSBlcnJvciBzdGF0ZSBpbmRpY2F0b3IuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRENBTl9lcnJvcl9zdGF0ZV9pbmRpY2F0b3IgKi8KKworICB1aW50MzJfdCBCaXRSYXRlU3dpdGNoOyAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBUeCBmcmFtZSBpcyB0cmFuc21pdHRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIG9yIHdpdGhvdXQgYml0IHJhdGUgc3dpdGNoaW5nLiBUaGlzIHBhcmFtZXRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEZEQ0FOX2JpdF9yYXRlX3N3aXRjaGluZyAqLworCisgIHVpbnQzMl90IEZERm9ybWF0OyAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBUeCBmcmFtZSBpcyB0cmFuc21pdHRlZCBpbgorICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NpYyBvciBGRCBmb3JtYXQuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mCisgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIEZEQ0FOX2Zvcm1hdCAgICAgICAgICAgICAgICAqLworCisgIHVpbnQzMl90IFR4VGltZXN0YW1wOyAvKiE8IFNwZWNpZmllcyB0aGUgdGltZXN0YW1wIGNvdW50ZXIgdmFsdWUgY2FwdHVyZWQgb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0IG9mIGZyYW1lIHRyYW5zbWlzc2lvbi4gVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgYmV0d2VlbiAwIGFuZCAweEZGRkYgICAgICAgICAgICAgICovCisKKyAgdWludDMyX3QgTWVzc2FnZU1hcmtlcjsgLyohPCBTcGVjaWZpZXMgdGhlIG1lc3NhZ2UgbWFya2VyIGNvcGllZCBpbnRvIFR4IEV2ZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJRk8gZWxlbWVudCBmb3IgaWRlbnRpZmljYXRpb24gb2YgVHggbWVzc2FnZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCAweEZGICAgICAgICAgICAgICAgICovCisKKyAgdWludDMyX3QKKyAgICAgIEV2ZW50VHlwZTsgLyohPCBTcGVjaWZpZXMgdGhlIGV2ZW50IHR5cGUuCisgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBGRENBTl9ldmVudF90eXBlICovCisKK30gRkRDQU5fVHhFdmVudEZpZm9UeXBlRGVmOworCisvKioKKyAqIEBicmllZiAgRkRDQU4gSGlnaCBQcmlvcml0eSBNZXNzYWdlIFN0YXR1cyBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQzMl90IEZpbHRlckxpc3Q7IC8qITwgU3BlY2lmaWVzIHRoZSBmaWx0ZXIgbGlzdCBvZiB0aGUgbWF0Y2hpbmcgZmlsdGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAwIDogU3RhbmRhcmQgRmlsdGVyIExpc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxIDogRXh0ZW5kZWQgRmlsdGVyIExpc3QgKi8KKworICB1aW50MzJfdCBGaWx0ZXJJbmRleDsgLyohPCBTcGVjaWZpZXMgdGhlIGluZGV4IG9mIG1hdGNoaW5nIGZpbHRlciBlbGVtZW50LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBudW1iZXIgYmV0d2VlbjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAwIGFuZCAoU1JBTUNBTl9GTFNfTkJSLTEpLCBpZiBGaWx0ZXJMaXN0IGlzIDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdGFuZGFyZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAwIGFuZCAoU1JBTUNBTl9GTEVfTkJSLTEpLCBpZiBGaWx0ZXJMaXN0IGlzIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChFeHRlbmRlZCkgKi8KKworICB1aW50MzJfdCBNZXNzYWdlU3RvcmFnZTsgLyohPCBTcGVjaWZpZXMgdGhlIEhQIE1lc3NhZ2UgU3RvcmFnZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRDQU5faHBfbXNnX3N0b3JhZ2UgKi8KKworICB1aW50MzJfdCBNZXNzYWdlSW5kZXg7IC8qITwgU3BlY2lmaWVzIHRoZSBJbmRleCBvZiBSeCBGSUZPIGVsZW1lbnQgdG8gd2hpY2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWVzc2FnZSB3YXMgc3RvcmVkLiBUaGlzIHBhcmFtZXRlciBpcyB2YWxpZCBvbmx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiBNZXNzYWdlU3RvcmFnZSBpczogRkRDQU5fSFBfU1RPUkFHRV9SWEZJRk8wIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZEQ0FOX0hQX1NUT1JBR0VfUlhGSUZPMSAqLworCit9IEZEQ0FOX0hwTXNnU3RhdHVzVHlwZURlZjsKKworLyoqCisgKiBAYnJpZWYgRkRDQU4gUHJvdG9jb2wgU3RhdHVzIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDMyX3QgTGFzdEVycm9yQ29kZTsgLyohPCBTcGVjaWZpZXMgdGhlIHR5cGUgb2YgdGhlIGxhc3QgZXJyb3IgdGhhdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvY2N1cnJlZCBvbiB0aGUgRkRDQU4gYnVzLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBvZiBAcmVmIEZEQ0FOX3Byb3RvY29sX2Vycm9yX2NvZGUgKi8KKworICB1aW50MzJfdCBEYXRhTGFzdEVycm9yQ29kZTsgLyohPCBTcGVjaWZpZXMgdGhlIHR5cGUgb2YgdGhlIGxhc3QgZXJyb3IgdGhhdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2NjdXJyZWQgaW4gdGhlIGRhdGEgcGhhc2Ugb2YgYSBDQU4gRkQgZm9ybWF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZSB3aXRoIGl0cyBCUlMgZmxhZyBzZXQuIFRoaXMgcGFyYW1ldGVyIGNhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgYSB2YWx1ZSBvZiBAcmVmIEZEQ0FOX3Byb3RvY29sX2Vycm9yX2NvZGUgKi8KKworICB1aW50MzJfdCBBY3Rpdml0eTsgLyohPCBTcGVjaWZpZXMgdGhlIEZEQ0FOIG1vZHVsZSBjb21tdW5pY2F0aW9uIHN0YXRlLgorICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgICBGRENBTl9jb21tdW5pY2F0aW9uX3N0YXRlICAgICAgICAgICAgICovCisKKyAgdWludDMyX3QgRXJyb3JQYXNzaXZlOyAvKiE8IFNwZWNpZmllcyB0aGUgRkRDQU4gbW9kdWxlIGVycm9yIHN0YXR1cy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDAgOiBUaGUgRkRDQU4gaXMgaW4gRXJyb3JfQWN0aXZlIHN0YXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxIDogVGhlIEZEQ0FOIGlzIGluIEVycm9yX1Bhc3NpdmUgc3RhdGUgKi8KKworICB1aW50MzJfdCBXYXJuaW5nOyAvKiE8IFNwZWNpZmllcyB0aGUgRkRDQU4gbW9kdWxlIHdhcm5pbmcgc3RhdHVzLgorICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLSAwIDogZXJyb3IgY291bnRlcnMgKFJ4RXJyb3JDbnQgYW5kIFR4RXJyb3JDbnQpIGFyZQorICAgICAgICAgICAgICAgICAgICAgICBiZWxvdyB0aGUgRXJyb3JfV2FybmluZyBsaW1pdCBvZiA5NgorICAgICAgICAgICAgICAgICAgICAgICAgICAtIDEgOiBhdCBsZWFzdCBvbmUgb2YgZXJyb3IgY291bnRlcnMgaGFzIHJlYWNoZWQgdGhlCisgICAgICAgICAgICAgICAgICAgICAgIEVycm9yX1dhcm5pbmcgbGltaXQgb2YgOTYgKi8KKworICB1aW50MzJfdCBCdXNPZmY7IC8qITwgU3BlY2lmaWVzIHRoZSBGRENBTiBtb2R1bGUgQnVzX09mZiBzdGF0dXMuCisgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgLSAwIDogVGhlIEZEQ0FOIGlzIG5vdCBpbiBCdXNfT2ZmIHN0YXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgLSAxIDogVGhlIEZEQ0FOIGlzIGluIEJ1c19PZmYgc3RhdGUgKi8KKworICB1aW50MzJfdCBSeEVTSWZsYWc7IC8qITwgU3BlY2lmaWVzIEVTSSBmbGFnIG9mIGxhc3QgcmVjZWl2ZWQgQ0FOIEZEIG1lc3NhZ2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAwIDogTGFzdCByZWNlaXZlZCBDQU4gRkQgbWVzc2FnZSBkaWQgbm90IGhhdmUgaXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgRVNJIGZsYWcgc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxIDogTGFzdCByZWNlaXZlZCBDQU4gRkQgbWVzc2FnZSBoYWQgaXRzIEVTSSBmbGFnCisgICAgICAgICAgICAgICAgICAgICAgICAgc2V0ICAgICAgICAgICAgICAgICAgICAqLworCisgIHVpbnQzMl90IFJ4QlJTZmxhZzsgLyohPCBTcGVjaWZpZXMgQlJTIGZsYWcgb2YgbGFzdCByZWNlaXZlZCBDQU4gRkQgbWVzc2FnZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDAgOiBMYXN0IHJlY2VpdmVkIENBTiBGRCBtZXNzYWdlIGRpZCBub3QgaGF2ZSBpdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICBCUlMgZmxhZyBzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDEgOiBMYXN0IHJlY2VpdmVkIENBTiBGRCBtZXNzYWdlIGhhZCBpdHMgQlJTIGZsYWcKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgICAgICAgICAgICAgICAgICAgICovCisKKyAgdWludDMyX3QKKyAgICAgIFJ4RkRGZmxhZzsgLyohPCBTcGVjaWZpZXMgaWYgQ0FOIEZEIG1lc3NhZ2UgKEZERiBmbGFnIHNldCkgaGFzIGJlZW4KKyAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZWQgc2luY2UgbGFzdCBwcm90b2NvbCBzdGF0dXMuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToKKyAgICAgICAgICAgICAgICAgICAgICAgLSAwIDogTm8gQ0FOIEZEIG1lc3NhZ2UgcmVjZWl2ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgLSAxIDogQ0FOIEZEIG1lc3NhZ2UgcmVjZWl2ZWQgKi8KKworICB1aW50MzJfdCBQcm90b2NvbEV4Y2VwdGlvbjsgLyohPCBTcGVjaWZpZXMgdGhlIEZEQ0FOIG1vZHVsZSBQcm90b2NvbCBFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAwIDogTm8gcHJvdG9jb2wgZXhjZXB0aW9uIGV2ZW50IG9jY3VycmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5jZSBsYXN0IHJlYWQgYWNjZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDEgOiBQcm90b2NvbCBleGNlcHRpb24gZXZlbnQgb2NjdXJyZWQgKi8KKworICB1aW50MzJfdCBUREN2YWx1ZTsgLyohPCBTcGVjaWZpZXMgdGhlIFRyYW5zbWl0dGVyIERlbGF5IENvbXBlbnNhdGlvbiBWYWx1ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMTI3ICovCisKK30gRkRDQU5fUHJvdG9jb2xTdGF0dXNUeXBlRGVmOworCisvKioKKyAqIEBicmllZiBGRENBTiBFcnJvciBDb3VudGVycyBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQzMl90IFR4RXJyb3JDbnQ7IC8qITwgU3BlY2lmaWVzIHRoZSBUcmFuc21pdCBFcnJvciBDb3VudGVyIFZhbHVlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDI1NSAqLworCisgIHVpbnQzMl90IFJ4RXJyb3JDbnQ7IC8qITwgU3BlY2lmaWVzIHRoZSBSZWNlaXZlIEVycm9yIENvdW50ZXIgVmFsdWUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMTI3ICovCisKKyAgdWludDMyX3QgUnhFcnJvclBhc3NpdmU7IC8qITwgU3BlY2lmaWVzIHRoZSBSZWNlaXZlIEVycm9yIFBhc3NpdmUgc3RhdHVzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDAgOiBUaGUgUmVjZWl2ZSBFcnJvciBDb3VudGVyIChSeEVycm9yQ250KSBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVsb3cgdGhlIGVycm9yIHBhc3NpdmUgbGV2ZWwgb2YgMTI4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDEgOiBUaGUgUmVjZWl2ZSBFcnJvciBDb3VudGVyIChSeEVycm9yQ250KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzIHJlYWNoZWQgdGhlIGVycm9yIHBhc3NpdmUgbGV2ZWwgb2YgMTI4ICovCisKKyAgdWludDMyX3QKKyAgICAgIEVycm9yTG9nZ2luZzsgLyohPCBTcGVjaWZpZXMgdGhlIFRyYW5zbWl0L1JlY2VpdmUgZXJyb3IgbG9nZ2luZyBjb3VudGVyCisgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAyNTUuCisgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBjb3VudGVyIGlzIGluY3JlbWVudGVkIGVhY2ggdGltZSB3aGVuIGEgRkRDQU4KKyAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2wgZXJyb3IgY2F1c2VzIHRoZSBUeEVycm9yQ250IG9yIHRoZSBSeEVycm9yQ250IHRvCisgICAgICAgICAgICAgICAgICAgICAgIGJlIGluY3JlbWVudGVkLiBUaGUgY291bnRlciBzdG9wcyBhdCAyNTU7IHRoZSBuZXh0CisgICAgICAgICAgICAgICAgICAgICAgIGluY3JlbWVudCBvZiBUeEVycm9yQ250IG9yIFJ4RXJyb3JDbnQgc2V0cyBpbnRlcnJ1cHQgZmxhZworICAgICAgICAgICAgICAgICAgICAgICAgIEZEQ0FOX0ZMQUdfRVJST1JfTE9HR0lOR19PVkVSRkxPVyAqLworCit9IEZEQ0FOX0Vycm9yQ291bnRlcnNUeXBlRGVmOworCisvKioKKyAqIEBicmllZiAgRkRDQU4gTWVzc2FnZSBSQU0gYmxvY2tzCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDMyX3QKKyAgICAgIFN0YW5kYXJkRmlsdGVyU0E7IC8qITwgU3BlY2lmaWVzIHRoZSBTdGFuZGFyZCBGaWx0ZXIgTGlzdCBTdGFydCBBZGRyZXNzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgMzItYml0IHdvcmQgYWRkcmVzcyAqLworCisgIHVpbnQzMl90CisgICAgICBFeHRlbmRlZEZpbHRlclNBOyAvKiE8IFNwZWNpZmllcyB0aGUgRXh0ZW5kZWQgRmlsdGVyIExpc3QgU3RhcnQgQWRkcmVzcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIDMyLWJpdCB3b3JkIGFkZHJlc3MgKi8KKworICB1aW50MzJfdCBSeEZJRk8wU0E7IC8qITwgU3BlY2lmaWVzIHRoZSBSeCBGSUZPIDAgU3RhcnQgQWRkcmVzcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSAzMi1iaXQgd29yZCBhZGRyZXNzICAgICAgKi8KKworICB1aW50MzJfdCBSeEZJRk8xU0E7IC8qITwgU3BlY2lmaWVzIHRoZSBSeCBGSUZPIDEgU3RhcnQgQWRkcmVzcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSAzMi1iaXQgd29yZCBhZGRyZXNzICAgICAgKi8KKworICB1aW50MzJfdCBUeEV2ZW50RklGT1NBOyAvKiE8IFNwZWNpZmllcyB0aGUgVHggRXZlbnQgRklGTyBTdGFydCBBZGRyZXNzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSAzMi1iaXQgd29yZCBhZGRyZXNzICovCisKKyAgdWludDMyX3QgVHhGSUZPUVNBOyAvKiE8IFNwZWNpZmllcyB0aGUgVHggRklGTy9RdWV1ZSBTdGFydCBBZGRyZXNzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIDMyLWJpdCB3b3JkIGFkZHJlc3MgICAgICAqLworCit9IEZEQ0FOX01zZ1JhbUFkZHJlc3NUeXBlRGVmOworCisvKioKKyAqIEBicmllZiAgRkRDQU4gaGFuZGxlIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgKi8KKyNpZiBVU0VfSEFMX0ZEQ0FOX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxCit0eXBlZGVmIHN0cnVjdCBfX0ZEQ0FOX0hhbmRsZVR5cGVEZWYKKyNlbHNlCit0eXBlZGVmIHN0cnVjdAorI2VuZGlmIC8qIFVTRV9IQUxfRkRDQU5fUkVHSVNURVJfQ0FMTEJBQ0tTICovCit7CisgIEZEQ0FOX0dsb2JhbFR5cGVEZWYgKkluc3RhbmNlOyAvKiE8IFJlZ2lzdGVyIGJhc2UgYWRkcmVzcyAgICAgKi8KKworICBGRENBTl9Jbml0VHlwZURlZiBJbml0OyAvKiE8IEZEQ0FOIHJlcXVpcmVkIHBhcmFtZXRlcnMgKi8KKworICBGRENBTl9Nc2dSYW1BZGRyZXNzVHlwZURlZiBtc2dSYW07IC8qITwgRkRDQU4gTWVzc2FnZSBSQU0gYmxvY2tzICAqLworCisgIHVpbnQzMl90IExhdGVzdFR4Rmlmb1FSZXF1ZXN0OyAvKiE8IEZEQ0FOIFR4IGJ1ZmZlciBpbmRleAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIGxhdGVzdCBUeCBGSUZPL1F1ZXVlIHJlcXVlc3QgKi8KKworICBfX0lPIEhBTF9GRENBTl9TdGF0ZVR5cGVEZWYgU3RhdGU7IC8qITwgRkRDQU4gY29tbXVuaWNhdGlvbiBzdGF0ZSAqLworCisgIEhBTF9Mb2NrVHlwZURlZiBMb2NrOyAvKiE8IEZEQ0FOIGxvY2tpbmcgb2JqZWN0ICAgICAgKi8KKworICBfX0lPIHVpbnQzMl90IEVycm9yQ29kZTsgLyohPCBGRENBTiBFcnJvciBjb2RlICAgICAgICAgICovCisKKyNpZiBVU0VfSEFMX0ZEQ0FOX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxCisgIHZvaWQgKCpUeEV2ZW50Rmlmb0NhbGxiYWNrKSgKKyAgICAgIHN0cnVjdCBfX0ZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwKKyAgICAgIHVpbnQzMl90IFR4RXZlbnRGaWZvSVRzKTsgLyohPCBGRENBTiBUeCBFdmVudCBGaWZvIGNhbGxiYWNrICAgICAgICAgKi8KKyAgdm9pZCAoKlJ4RmlmbzBDYWxsYmFjaykoc3RydWN0IF9fRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBSeEZpZm8wSVRzKTsgLyohPCBGRENBTiBSeCBGaWZvIDAgY2FsbGJhY2sgKi8KKyAgdm9pZCAoKlJ4RmlmbzFDYWxsYmFjaykoc3RydWN0IF9fRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBSeEZpZm8xSVRzKTsgLyohPCBGRENBTiBSeCBGaWZvIDEgY2FsbGJhY2sgKi8KKyAgdm9pZCAoKlR4Rmlmb0VtcHR5Q2FsbGJhY2spKHN0cnVjdCBfX0ZEQ0FOX0hhbmRsZVR5cGVEZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaGZkY2FuKTsgLyohPCBGRENBTiBUeCBGaWZvIEVtcHR5IGNhbGxiYWNrICovCisgIHZvaWQgKCpUeEJ1ZmZlckNvbXBsZXRlQ2FsbGJhY2spKAorICAgICAgc3RydWN0IF9fRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLAorICAgICAgdWludDMyX3QgQnVmZmVySW5kZXhlcyk7IC8qITwgRkRDQU4gVHggQnVmZmVyIGNvbXBsZXRlIGNhbGxiYWNrICAgICovCisgIHZvaWQgKCpUeEJ1ZmZlckFib3J0Q2FsbGJhY2spKAorICAgICAgc3RydWN0IF9fRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLAorICAgICAgdWludDMyX3QgQnVmZmVySW5kZXhlcyk7IC8qITwgRkRDQU4gVHggQnVmZmVyIGFib3J0IGNhbGxiYWNrICAgICAgICovCisgIHZvaWQgKCpIaWdoUHJpb3JpdHlNZXNzYWdlQ2FsbGJhY2spKAorICAgICAgc3RydWN0IF9fRkRDQU5fSGFuZGxlVHlwZURlZgorICAgICAgICAgICpoZmRjYW4pOyAvKiE8IEZEQ0FOIEhpZ2ggcHJpb3JpdHkgbWVzc2FnZSBjYWxsYmFjayAqLworICB2b2lkICgqVGltZXN0YW1wV3JhcGFyb3VuZENhbGxiYWNrKSgKKyAgICAgIHN0cnVjdCBfX0ZEQ0FOX0hhbmRsZVR5cGVEZWYKKyAgICAgICAgICAqaGZkY2FuKTsgLyohPCBGRENBTiBUaW1lc3RhbXAgd3JhcGFyb3VuZCBjYWxsYmFjayAgKi8KKyAgdm9pZCAoKlRpbWVvdXRPY2N1cnJlZENhbGxiYWNrKSgKKyAgICAgIHN0cnVjdCBfX0ZEQ0FOX0hhbmRsZVR5cGVEZWYKKyAgICAgICAgICAqaGZkY2FuKTsgLyohPCBGRENBTiBUaW1lb3V0IG9jY3VycmVkIGNhbGxiYWNrICAgICAgKi8KKyAgdm9pZCAoKkVycm9yQ2FsbGJhY2spKAorICAgICAgc3RydWN0IF9fRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuKTsgLyohPCBGRENBTiBFcnJvciBjYWxsYmFjayAqLworICB2b2lkICgqRXJyb3JTdGF0dXNDYWxsYmFjaykoCisgICAgICBzdHJ1Y3QgX19GRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4sCisgICAgICB1aW50MzJfdCBFcnJvclN0YXR1c0lUcyk7IC8qITwgRkRDQU4gRXJyb3Igc3RhdHVzIGNhbGxiYWNrICAgICAgICAgICovCisKKyAgdm9pZCAoKk1zcEluaXRDYWxsYmFjaykoCisgICAgICBzdHJ1Y3QgX19GRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pOyAvKiE8IEZEQ0FOIE1zcCBJbml0IGNhbGxiYWNrICovCisgIHZvaWQgKCpNc3BEZUluaXRDYWxsYmFjaykoCisgICAgICBzdHJ1Y3QgX19GRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pOyAvKiE8IEZEQ0FOIE1zcCBEZUluaXQgY2FsbGJhY2sgKi8KKworI2VuZGlmIC8qIFVTRV9IQUxfRkRDQU5fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKK30gRkRDQU5fSGFuZGxlVHlwZURlZjsKKworI2lmIFVTRV9IQUxfRkRDQU5fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEKKy8qKgorICogQGJyaWVmICBIQUwgRkRDQU4gY29tbW9uIENhbGxiYWNrIElEIGVudW1lcmF0aW9uIGRlZmluaXRpb24KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgSEFMX0ZEQ0FOX1RYX0ZJRk9fRU1QVFlfQ0JfSUQgPSAweDAwVSwgLyohPCBGRENBTiBUeCBGaWZvIEVtcHR5IGNhbGxiYWNrIElEICovCisgIEhBTF9GRENBTl9ISUdIX1BSSU9fTUVTU0FHRV9DQl9JRCA9CisgICAgICAweDAxVSwgLyohPCBGRENBTiBIaWdoIHByaW9yaXR5IG1lc3NhZ2UgY2FsbGJhY2sgSUQgKi8KKyAgSEFMX0ZEQ0FOX1RJTUVTVEFNUF9XUkFQQVJPVU5EX0NCX0lEID0KKyAgICAgIDB4MDJVLCAvKiE8IEZEQ0FOIFRpbWVzdGFtcCB3cmFwYXJvdW5kIGNhbGxiYWNrIElEICAqLworICBIQUxfRkRDQU5fVElNRU9VVF9PQ0NVUlJFRF9DQl9JRCA9CisgICAgICAweDAzVSwgLyohPCBGRENBTiBUaW1lb3V0IG9jY3VycmVkIGNhbGxiYWNrIElEICAgICAgKi8KKyAgSEFMX0ZEQ0FOX0VSUk9SX0NBTExCQUNLX0NCX0lEID0gMHgwNFUsIC8qITwgRkRDQU4gRXJyb3IgY2FsbGJhY2sgSUQgKi8KKworICBIQUxfRkRDQU5fTVNQSU5JVF9DQl9JRCA9IDB4MDVVLCAgIC8qITwgRkRDQU4gTXNwSW5pdCBjYWxsYmFjayBJRCAgICovCisgIEhBTF9GRENBTl9NU1BERUlOSVRfQ0JfSUQgPSAweDA2VSwgLyohPCBGRENBTiBNc3BEZUluaXQgY2FsbGJhY2sgSUQgKi8KKworfSBIQUxfRkRDQU5fQ2FsbGJhY2tJRFR5cGVEZWY7CisKKy8qKgorICogQGJyaWVmICBIQUwgRkRDQU4gQ2FsbGJhY2sgcG9pbnRlciBkZWZpbml0aW9uCisgKi8KK3R5cGVkZWYgdm9pZCAoKnBGRENBTl9DYWxsYmFja1R5cGVEZWYpKAorICAgIEZEQ0FOX0hhbmRsZVR5cGVEZWYKKyAgICAgICAgKmhmZGNhbik7IC8qITwgcG9pbnRlciB0byBhIGNvbW1vbiBGRENBTiBjYWxsYmFjayBmdW5jdGlvbiAgICAgICAgICAgKi8KK3R5cGVkZWYgdm9pZCAoKnBGRENBTl9UeEV2ZW50Rmlmb0NhbGxiYWNrVHlwZURlZikoCisgICAgRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLAorICAgIHVpbnQzMl90IFR4RXZlbnRGaWZvSVRzKTsgLyohPCBwb2ludGVyIHRvIFR4IGV2ZW50IEZpZm8gRkRDQU4gY2FsbGJhY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICAgICAgKi8KK3R5cGVkZWYgdm9pZCAoKnBGRENBTl9SeEZpZm8wQ2FsbGJhY2tUeXBlRGVmKSgKKyAgICBGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4sCisgICAgdWludDMyX3QgUnhGaWZvMElUcyk7IC8qITwgcG9pbnRlciB0byBSeCBGaWZvIDAgRkRDQU4gY2FsbGJhY2sgZnVuY3Rpb24gKi8KK3R5cGVkZWYgdm9pZCAoKnBGRENBTl9SeEZpZm8xQ2FsbGJhY2tUeXBlRGVmKSgKKyAgICBGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4sCisgICAgdWludDMyX3QgUnhGaWZvMUlUcyk7IC8qITwgcG9pbnRlciB0byBSeCBGaWZvIDEgRkRDQU4gY2FsbGJhY2sgZnVuY3Rpb24gKi8KK3R5cGVkZWYgdm9pZCAoKnBGRENBTl9UeEJ1ZmZlckNvbXBsZXRlQ2FsbGJhY2tUeXBlRGVmKSgKKyAgICBGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4sCisgICAgdWludDMyX3QgQnVmZmVySW5kZXhlcyk7IC8qITwgcG9pbnRlciB0byBUeCBCdWZmZXIgY29tcGxldGUgRkRDQU4gY2FsbGJhY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKi8KK3R5cGVkZWYgdm9pZCAoKnBGRENBTl9UeEJ1ZmZlckFib3J0Q2FsbGJhY2tUeXBlRGVmKSgKKyAgICBGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4sCisgICAgdWludDMyX3QgQnVmZmVySW5kZXhlcyk7IC8qITwgcG9pbnRlciB0byBUeCBCdWZmZXIgYWJvcnQgRkRDQU4gY2FsbGJhY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gICAgKi8KK3R5cGVkZWYgdm9pZCAoKnBGRENBTl9FcnJvclN0YXR1c0NhbGxiYWNrVHlwZURlZikoCisgICAgRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLAorICAgIHVpbnQzMl90IEVycm9yU3RhdHVzSVRzKTsgLyohPCBwb2ludGVyIHRvIEVycm9yIFN0YXR1cyBjYWxsYmFjayBmdW5jdGlvbiAqLworCisjZW5kaWYgLyogVVNFX0hBTF9GRENBTl9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEZEQ0FOX0V4cG9ydGVkX0NvbnN0YW50cyBGRENBTiBFeHBvcnRlZCBDb25zdGFudHMKKyAqIEB7CisgKi8KKworLyoqIEBkZWZncm91cCBIQUxfRkRDQU5fRXJyb3JfQ29kZSBIQUwgRkRDQU4gRXJyb3IgQ29kZQorICogQHsKKyAqLworI2RlZmluZSBIQUxfRkRDQU5fRVJST1JfTk9ORSAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAvKiE8IE5vIGVycm9yICovCisjZGVmaW5lIEhBTF9GRENBTl9FUlJPUl9USU1FT1VUICgodWludDMyX3QpMHgwMDAwMDAwMVUpIC8qITwgVGltZW91dCBlcnJvciAqLworI2RlZmluZSBIQUxfRkRDQU5fRVJST1JfTk9UX0lOSVRJQUxJWkVEIFwKKyAgKCh1aW50MzJfdCkweDAwMDAwMDAyVSkgLyohPCBQZXJpcGhlcmFsIG5vdCBpbml0aWFsaXplZCAqLworI2RlZmluZSBIQUxfRkRDQU5fRVJST1JfTk9UX1JFQURZIFwKKyAgKCh1aW50MzJfdCkweDAwMDAwMDA0VSkgLyohPCBQZXJpcGhlcmFsIG5vdCByZWFkeSAqLworI2RlZmluZSBIQUxfRkRDQU5fRVJST1JfTk9UX1NUQVJURUQgXAorICAoKHVpbnQzMl90KTB4MDAwMDAwMDhVKSAvKiE8IFBlcmlwaGVyYWwgbm90IHN0YXJ0ZWQgKi8KKyNkZWZpbmUgSEFMX0ZEQ0FOX0VSUk9SX05PVF9TVVBQT1JURUQgXAorICAoKHVpbnQzMl90KTB4MDAwMDAwMTBVKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBNb2RlIG5vdCBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgSEFMX0ZEQ0FOX0VSUk9SX1BBUkFNICgodWludDMyX3QpMHgwMDAwMDAyMFUpIC8qITwgUGFyYW1ldGVyIGVycm9yICovCisjZGVmaW5lIEhBTF9GRENBTl9FUlJPUl9QRU5ESU5HIFwKKyAgKCh1aW50MzJfdCkweDAwMDAwMDQwVSkgLyohPCBQZW5kaW5nIG9wZXJhdGlvbiAqLworI2RlZmluZSBIQUxfRkRDQU5fRVJST1JfUkFNX0FDQ0VTUyBcCisgICgodWludDMyX3QpMHgwMDAwMDA4MFUpIC8qITwgTWVzc2FnZSBSQU0gQWNjZXNzIEZhaWx1cmUgKi8KKyNkZWZpbmUgSEFMX0ZEQ0FOX0VSUk9SX0ZJRk9fRU1QVFkgXAorICAoKHVpbnQzMl90KTB4MDAwMDAxMDBVKSAvKiE8IEdldCBlbGVtZW50IGZyb20gZW1wdHkgRklGTyAqLworI2RlZmluZSBIQUxfRkRDQU5fRVJST1JfRklGT19GVUxMIFwKKyAgKCh1aW50MzJfdCkweDAwMDAwMjAwVSkgLyohPCBQdXQgZWxlbWVudCBpbiBmdWxsIEZJRk8gKi8KKyNkZWZpbmUgSEFMX0ZEQ0FOX0VSUk9SX0xPR19PVkVSRkxPVyBcCisgIEZEQ0FOX0lSX0VMTyAvKiE8IE92ZXJmbG93IG9mIENBTiBFcnJvciBMb2dnaW5nIENvdW50ZXIgKi8KKyNkZWZpbmUgSEFMX0ZEQ0FOX0VSUk9SX1JBTV9XREcgXAorICBGRENBTl9JUl9XREkgLyohPCBNZXNzYWdlIFJBTSBXYXRjaGRvZyBldmVudCBvY2N1cnJlZCAqLworI2RlZmluZSBIQUxfRkRDQU5fRVJST1JfUFJPVE9DT0xfQVJCVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEZEQ0FOX0lSX1BFQSAvKiE8IFByb3RvY29sIEVycm9yIGluIEFyYml0cmF0aW9uIFBoYXNlIChOb21pbmFsIEJpdCBUaW1lIGlzIFwKKyAgICAgICAgICAgICAgICAgIHVzZWQpICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX0ZEQ0FOX0VSUk9SX1BST1RPQ09MX0RBVEEgXAorICBGRENBTl9JUl9QRUQgLyohPCBQcm90b2NvbCBFcnJvciBpbiBEYXRhIFBoYXNlIChEYXRhIEJpdCBUaW1lIGlzIHVzZWQpICovCisjZGVmaW5lIEhBTF9GRENBTl9FUlJPUl9SRVNFUlZFRF9BUkVBIFwKKyAgRkRDQU5fSVJfQVJBIC8qITwgQWNjZXNzIHRvIFJlc2VydmVkIEFkZHJlc3MgKi8KKworI2lmIFVTRV9IQUxfRkRDQU5fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEKKyNkZWZpbmUgSEFMX0ZEQ0FOX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0sgXAorICAoKHVpbnQzMl90KTB4MDAwMDAxMDBVKSAvKiE8IEludmFsaWQgQ2FsbGJhY2sgZXJyb3IgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAgICAgLyogVVNFX0hBTF9GRENBTl9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEZEQ0FOX2ZyYW1lX2Zvcm1hdCBGRENBTiBGcmFtZSBGb3JtYXQKKyAqIEB7CisgKi8KKyNkZWZpbmUgRkRDQU5fRlJBTUVfQ0xBU1NJQyBcCisgICgodWludDMyX3QpMHgwMDAwMDAwMFUpIC8qITwgQ2xhc3NpYyBtb2RlICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZEQ0FOX0ZSQU1FX0ZEX05PX0JSUyBcCisgICgodWludDMyX3QpRkRDQU5fQ0NDUl9GRE9FKSAvKiE8IEZEIG1vZGUgd2l0aG91dCBCaXRSYXRlIFN3aXRjaGluZyAqLworI2RlZmluZSBGRENBTl9GUkFNRV9GRF9CUlMgICAgICBcCisgICgodWludDMyX3QpKEZEQ0FOX0NDQ1JfRkRPRSB8IFwKKyAgICAgICAgICAgICAgRkRDQU5fQ0NDUl9CUlNFKSkgLyohPCBGRCBtb2RlIHdpdGggQml0UmF0ZSBTd2l0Y2hpbmcgICAgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEZEQ0FOX29wZXJhdGluZ19tb2RlIEZEQ0FOIE9wZXJhdGluZyBNb2RlCisgKiBAeworICovCisjZGVmaW5lIEZEQ0FOX01PREVfTk9STUFMIFwKKyAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgLyohPCBOb3JtYWwgbW9kZSAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZEQ0FOX01PREVfUkVTVFJJQ1RFRF9PUEVSQVRJT04gXAorICAoKHVpbnQzMl90KTB4MDAwMDAwMDFVKSAvKiE8IFJlc3RyaWN0ZWQgT3BlcmF0aW9uIG1vZGUgKi8KKyNkZWZpbmUgRkRDQU5fTU9ERV9CVVNfTU9OSVRPUklORyBcCisgICgodWludDMyX3QpMHgwMDAwMDAwMlUpIC8qITwgQnVzIE1vbml0b3JpbmcgbW9kZSAgICAgICAqLworI2RlZmluZSBGRENBTl9NT0RFX0lOVEVSTkFMX0xPT1BCQUNLIFwKKyAgKCh1aW50MzJfdCkweDAwMDAwMDAzVSkgLyohPCBJbnRlcm5hbCBMb29wQmFjayBtb2RlICAgICovCisjZGVmaW5lIEZEQ0FOX01PREVfRVhURVJOQUxfTE9PUEJBQ0sgXAorICAoKHVpbnQzMl90KTB4MDAwMDAwMDRVKSAvKiE8IEV4dGVybmFsIExvb3BCYWNrIG1vZGUgICAgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEZEQ0FOX2Nsb2NrX2RpdmlkZXIgRkRDQU4gQ2xvY2sgRGl2aWRlcgorICogQHsKKyAqLworI2RlZmluZSBGRENBTl9DTE9DS19ESVYxIFwKKyAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgLyohPCBEaXZpZGUga2VybmVsIGNsb2NrIGJ5IDEgICovCisjZGVmaW5lIEZEQ0FOX0NMT0NLX0RJVjIgXAorICAoKHVpbnQzMl90KTB4MDAwMDAwMDFVKSAvKiE8IERpdmlkZSBrZXJuZWwgY2xvY2sgYnkgMiAgKi8KKyNkZWZpbmUgRkRDQU5fQ0xPQ0tfRElWNCBcCisgICgodWludDMyX3QpMHgwMDAwMDAwMlUpIC8qITwgRGl2aWRlIGtlcm5lbCBjbG9jayBieSA0ICAqLworI2RlZmluZSBGRENBTl9DTE9DS19ESVY2IFwKKyAgKCh1aW50MzJfdCkweDAwMDAwMDAzVSkgLyohPCBEaXZpZGUga2VybmVsIGNsb2NrIGJ5IDYgICovCisjZGVmaW5lIEZEQ0FOX0NMT0NLX0RJVjggXAorICAoKHVpbnQzMl90KTB4MDAwMDAwMDRVKSAvKiE8IERpdmlkZSBrZXJuZWwgY2xvY2sgYnkgOCAgKi8KKyNkZWZpbmUgRkRDQU5fQ0xPQ0tfRElWMTAgXAorICAoKHVpbnQzMl90KTB4MDAwMDAwMDVVKSAvKiE8IERpdmlkZSBrZXJuZWwgY2xvY2sgYnkgMTAgKi8KKyNkZWZpbmUgRkRDQU5fQ0xPQ0tfRElWMTIgXAorICAoKHVpbnQzMl90KTB4MDAwMDAwMDZVKSAvKiE8IERpdmlkZSBrZXJuZWwgY2xvY2sgYnkgMTIgKi8KKyNkZWZpbmUgRkRDQU5fQ0xPQ0tfRElWMTQgXAorICAoKHVpbnQzMl90KTB4MDAwMDAwMDdVKSAvKiE8IERpdmlkZSBrZXJuZWwgY2xvY2sgYnkgMTQgKi8KKyNkZWZpbmUgRkRDQU5fQ0xPQ0tfRElWMTYgXAorICAoKHVpbnQzMl90KTB4MDAwMDAwMDhVKSAvKiE8IERpdmlkZSBrZXJuZWwgY2xvY2sgYnkgMTYgKi8KKyNkZWZpbmUgRkRDQU5fQ0xPQ0tfRElWMTggXAorICAoKHVpbnQzMl90KTB4MDAwMDAwMDlVKSAvKiE8IERpdmlkZSBrZXJuZWwgY2xvY2sgYnkgMTggKi8KKyNkZWZpbmUgRkRDQU5fQ0xPQ0tfRElWMjAgXAorICAoKHVpbnQzMl90KTB4MDAwMDAwMEFVKSAvKiE8IERpdmlkZSBrZXJuZWwgY2xvY2sgYnkgMjAgKi8KKyNkZWZpbmUgRkRDQU5fQ0xPQ0tfRElWMjIgXAorICAoKHVpbnQzMl90KTB4MDAwMDAwMEJVKSAvKiE8IERpdmlkZSBrZXJuZWwgY2xvY2sgYnkgMjIgKi8KKyNkZWZpbmUgRkRDQU5fQ0xPQ0tfRElWMjQgXAorICAoKHVpbnQzMl90KTB4MDAwMDAwMENVKSAvKiE8IERpdmlkZSBrZXJuZWwgY2xvY2sgYnkgMjQgKi8KKyNkZWZpbmUgRkRDQU5fQ0xPQ0tfRElWMjYgXAorICAoKHVpbnQzMl90KTB4MDAwMDAwMERVKSAvKiE8IERpdmlkZSBrZXJuZWwgY2xvY2sgYnkgMjYgKi8KKyNkZWZpbmUgRkRDQU5fQ0xPQ0tfRElWMjggXAorICAoKHVpbnQzMl90KTB4MDAwMDAwMEVVKSAvKiE8IERpdmlkZSBrZXJuZWwgY2xvY2sgYnkgMjggKi8KKyNkZWZpbmUgRkRDQU5fQ0xPQ0tfRElWMzAgXAorICAoKHVpbnQzMl90KTB4MDAwMDAwMEZVKSAvKiE8IERpdmlkZSBrZXJuZWwgY2xvY2sgYnkgMzAgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEZEQ0FOX3R4Rmlmb1F1ZXVlX01vZGUgRkRDQU4gVHggRklGTy9RdWV1ZSBNb2RlCisgKiBAeworICovCisjZGVmaW5lIEZEQ0FOX1RYX0ZJRk9fT1BFUkFUSU9OICgodWludDMyX3QpMHgwMDAwMDAwMFUpIC8qITwgRklGTyBtb2RlICAqLworI2RlZmluZSBGRENBTl9UWF9RVUVVRV9PUEVSQVRJT04gICAgICAgICAgICAgIFwKKyAgKCh1aW50MzJfdClGRENBTl9UWEJDX1RGUU0pIC8qITwgUXVldWUgbW9kZSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEZEQ0FOX2lkX3R5cGUgRkRDQU4gSUQgVHlwZQorICogQHsKKyAqLworI2RlZmluZSBGRENBTl9TVEFOREFSRF9JRCAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAvKiE8IFN0YW5kYXJkIElEIGVsZW1lbnQgKi8KKyNkZWZpbmUgRkRDQU5fRVhURU5ERURfSUQgKCh1aW50MzJfdCkweDQwMDAwMDAwVSkgLyohPCBFeHRlbmRlZCBJRCBlbGVtZW50ICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBGRENBTl9mcmFtZV90eXBlIEZEQ0FOIEZyYW1lIFR5cGUKKyAqIEB7CisgKi8KKyNkZWZpbmUgRkRDQU5fREFUQV9GUkFNRSAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgIC8qITwgRGF0YSBmcmFtZSAgICovCisjZGVmaW5lIEZEQ0FOX1JFTU9URV9GUkFNRSAoKHVpbnQzMl90KTB4MjAwMDAwMDBVKSAvKiE8IFJlbW90ZSBmcmFtZSAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgRkRDQU5fZGF0YV9sZW5ndGhfY29kZSBGRENBTiBEYXRhIExlbmd0aCBDb2RlCisgKiBAeworICovCisjZGVmaW5lIEZEQ0FOX0RMQ19CWVRFU18wICgodWludDMyX3QpMHgwMDAwMDAwMFUpICAvKiE8IDAgYnl0ZXMgZGF0YSBmaWVsZCAgKi8KKyNkZWZpbmUgRkRDQU5fRExDX0JZVEVTXzEgKCh1aW50MzJfdCkweDAwMDAwMDAxVSkgIC8qITwgMSBieXRlcyBkYXRhIGZpZWxkICAqLworI2RlZmluZSBGRENBTl9ETENfQllURVNfMiAoKHVpbnQzMl90KTB4MDAwMDAwMDJVKSAgLyohPCAyIGJ5dGVzIGRhdGEgZmllbGQgICovCisjZGVmaW5lIEZEQ0FOX0RMQ19CWVRFU18zICgodWludDMyX3QpMHgwMDAwMDAwM1UpICAvKiE8IDMgYnl0ZXMgZGF0YSBmaWVsZCAgKi8KKyNkZWZpbmUgRkRDQU5fRExDX0JZVEVTXzQgKCh1aW50MzJfdCkweDAwMDAwMDA0VSkgIC8qITwgNCBieXRlcyBkYXRhIGZpZWxkICAqLworI2RlZmluZSBGRENBTl9ETENfQllURVNfNSAoKHVpbnQzMl90KTB4MDAwMDAwMDVVKSAgLyohPCA1IGJ5dGVzIGRhdGEgZmllbGQgICovCisjZGVmaW5lIEZEQ0FOX0RMQ19CWVRFU182ICgodWludDMyX3QpMHgwMDAwMDAwNlUpICAvKiE8IDYgYnl0ZXMgZGF0YSBmaWVsZCAgKi8KKyNkZWZpbmUgRkRDQU5fRExDX0JZVEVTXzcgKCh1aW50MzJfdCkweDAwMDAwMDA3VSkgIC8qITwgNyBieXRlcyBkYXRhIGZpZWxkICAqLworI2RlZmluZSBGRENBTl9ETENfQllURVNfOCAoKHVpbnQzMl90KTB4MDAwMDAwMDhVKSAgLyohPCA4IGJ5dGVzIGRhdGEgZmllbGQgICovCisjZGVmaW5lIEZEQ0FOX0RMQ19CWVRFU18xMiAoKHVpbnQzMl90KTB4MDAwMDAwMDlVKSAvKiE8IDEyIGJ5dGVzIGRhdGEgZmllbGQgKi8KKyNkZWZpbmUgRkRDQU5fRExDX0JZVEVTXzE2ICgodWludDMyX3QpMHgwMDAwMDAwQVUpIC8qITwgMTYgYnl0ZXMgZGF0YSBmaWVsZCAqLworI2RlZmluZSBGRENBTl9ETENfQllURVNfMjAgKCh1aW50MzJfdCkweDAwMDAwMDBCVSkgLyohPCAyMCBieXRlcyBkYXRhIGZpZWxkICovCisjZGVmaW5lIEZEQ0FOX0RMQ19CWVRFU18yNCAoKHVpbnQzMl90KTB4MDAwMDAwMENVKSAvKiE8IDI0IGJ5dGVzIGRhdGEgZmllbGQgKi8KKyNkZWZpbmUgRkRDQU5fRExDX0JZVEVTXzMyICgodWludDMyX3QpMHgwMDAwMDAwRFUpIC8qITwgMzIgYnl0ZXMgZGF0YSBmaWVsZCAqLworI2RlZmluZSBGRENBTl9ETENfQllURVNfNDggKCh1aW50MzJfdCkweDAwMDAwMDBFVSkgLyohPCA0OCBieXRlcyBkYXRhIGZpZWxkICovCisjZGVmaW5lIEZEQ0FOX0RMQ19CWVRFU182NCAoKHVpbnQzMl90KTB4MDAwMDAwMEZVKSAvKiE8IDY0IGJ5dGVzIGRhdGEgZmllbGQgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEZEQ0FOX2Vycm9yX3N0YXRlX2luZGljYXRvciBGRENBTiBFcnJvciBTdGF0ZSBJbmRpY2F0b3IKKyAqIEB7CisgKi8KKyNkZWZpbmUgRkRDQU5fRVNJX0FDVElWRSBcCisgICgodWludDMyX3QpMHgwMDAwMDAwMFUpIC8qITwgVHJhbnNtaXR0aW5nIG5vZGUgaXMgZXJyb3IgYWN0aXZlICAqLworI2RlZmluZSBGRENBTl9FU0lfUEFTU0lWRSBcCisgICgodWludDMyX3QpMHg4MDAwMDAwMFUpIC8qITwgVHJhbnNtaXR0aW5nIG5vZGUgaXMgZXJyb3IgcGFzc2l2ZSAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgRkRDQU5fYml0X3JhdGVfc3dpdGNoaW5nIEZEQ0FOIEJpdCBSYXRlIFN3aXRjaGluZworICogQHsKKyAqLworI2RlZmluZSBGRENBTl9CUlNfT0ZGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgodWludDMyX3QpMHgwMDAwMDAwMFUpIC8qITwgRkRDQU4gZnJhbWVzIHRyYW5zbWl0dGVkL3JlY2VpdmVkIHdpdGhvdXQgYml0IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZSBzd2l0Y2hpbmcgKi8KKyNkZWZpbmUgRkRDQU5fQlJTX09OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgodWludDMyX3QpMHgwMDEwMDAwMFUpIC8qITwgRkRDQU4gZnJhbWVzIHRyYW5zbWl0dGVkL3JlY2VpdmVkIHdpdGggYml0IHJhdGUgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2hpbmcgICAgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEZEQ0FOX2Zvcm1hdCBGRENBTiBmb3JtYXQKKyAqIEB7CisgKi8KKyNkZWZpbmUgRkRDQU5fQ0xBU1NJQ19DQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgodWludDMyX3QpMHgwMDAwMDAwMFUpIC8qITwgRnJhbWUgdHJhbnNtaXR0ZWQvcmVjZWl2ZWQgaW4gQ2xhc3NpYyBDQU4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgKi8KKyNkZWZpbmUgRkRDQU5fRkRfQ0FOIFwKKyAgKCh1aW50MzJfdCkweDAwMjAwMDAwVSkgLyohPCBGcmFtZSB0cmFuc21pdHRlZC9yZWNlaXZlZCBpbiBGRENBTiBmb3JtYXQgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEZEQ0FOX0VGQyBGRENBTiBFdmVudCBGSUZPIGNvbnRyb2wKKyAqIEB7CisgKi8KKyNkZWZpbmUgRkRDQU5fTk9fVFhfRVZFTlRTIFwKKyAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgLyohPCBEbyBub3Qgc3RvcmUgVHggZXZlbnRzICovCisjZGVmaW5lIEZEQ0FOX1NUT1JFX1RYX0VWRU5UUyBcCisgICgodWludDMyX3QpMHgwMDgwMDAwMFUpIC8qITwgU3RvcmUgVHggZXZlbnRzICAgICAgICAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgRkRDQU5fZmlsdGVyX3R5cGUgRkRDQU4gRmlsdGVyIFR5cGUKKyAqIEB7CisgKi8KKyNkZWZpbmUgRkRDQU5fRklMVEVSX1JBTkdFIFwKKyAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgLyohPCBSYW5nZSBmaWx0ZXIgZnJvbSBGaWx0ZXJJRDEgdG8gRmlsdGVySUQyICovCisjZGVmaW5lIEZEQ0FOX0ZJTFRFUl9EVUFMIFwKKyAgKCh1aW50MzJfdCkweDAwMDAwMDAxVSkgLyohPCBEdWFsIElEIGZpbHRlciBmb3IgRmlsdGVySUQxIG9yIEZpbHRlcklEMiAqLworI2RlZmluZSBGRENBTl9GSUxURVJfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCh1aW50MzJfdCkweDAwMDAwMDAyVSkgLyohPCBDbGFzc2ljIGZpbHRlcjogRmlsdGVySUQxID0gZmlsdGVyLCBGaWx0ZXJJRDIgPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2sgICAgICAgICAgICAqLworI2RlZmluZSBGRENBTl9GSUxURVJfUkFOR0VfTk9fRUlETSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKHVpbnQzMl90KTB4MDAwMDAwMDNVKSAvKiE8IFJhbmdlIGZpbHRlciBmcm9tIEZpbHRlcklEMSB0byBGaWx0ZXJJRDIsIEVJRE0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrIG5vdCBhcHBsaWVkICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBGRENBTl9maWx0ZXJfY29uZmlnIEZEQ0FOIEZpbHRlciBDb25maWd1cmF0aW9uCisgKiBAeworICovCisjZGVmaW5lIEZEQ0FOX0ZJTFRFUl9ESVNBQkxFIFwKKyAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgLyohPCBEaXNhYmxlIGZpbHRlciBlbGVtZW50ICovCisjZGVmaW5lIEZEQ0FOX0ZJTFRFUl9UT19SWEZJRk8wIFwKKyAgKCh1aW50MzJfdCkweDAwMDAwMDAxVSkgLyohPCBTdG9yZSBpbiBSeCBGSUZPIDAgaWYgZmlsdGVyIG1hdGNoZXMgKi8KKyNkZWZpbmUgRkRDQU5fRklMVEVSX1RPX1JYRklGTzEgXAorICAoKHVpbnQzMl90KTB4MDAwMDAwMDJVKSAvKiE8IFN0b3JlIGluIFJ4IEZJRk8gMSBpZiBmaWx0ZXIgbWF0Y2hlcyAqLworI2RlZmluZSBGRENBTl9GSUxURVJfUkVKRUNUIFwKKyAgKCh1aW50MzJfdCkweDAwMDAwMDAzVSkgLyohPCBSZWplY3QgSUQgaWYgZmlsdGVyIG1hdGNoZXMgKi8KKyNkZWZpbmUgRkRDQU5fRklMVEVSX0hQIFwKKyAgKCh1aW50MzJfdCkweDAwMDAwMDA0VSkgLyohPCBTZXQgaGlnaCBwcmlvcml0eSBpZiBmaWx0ZXIgbWF0Y2hlcyAqLworI2RlZmluZSBGRENBTl9GSUxURVJfVE9fUlhGSUZPMF9IUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCh1aW50MzJfdCkweDAwMDAwMDA1VSkgLyohPCBTZXQgaGlnaCBwcmlvcml0eSBhbmQgc3RvcmUgaW4gRklGTyAwIGlmIGZpbHRlciBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXMgICAqLworI2RlZmluZSBGRENBTl9GSUxURVJfVE9fUlhGSUZPMV9IUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCh1aW50MzJfdCkweDAwMDAwMDA2VSkgLyohPCBTZXQgaGlnaCBwcmlvcml0eSBhbmQgc3RvcmUgaW4gRklGTyAxIGlmIGZpbHRlciBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXMgICAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgRkRDQU5fVHhfbG9jYXRpb24gRkRDQU4gVHggTG9jYXRpb24KKyAqIEB7CisgKi8KKyNkZWZpbmUgRkRDQU5fVFhfQlVGRkVSMCBcCisgICgodWludDMyX3QpMHgwMDAwMDAwMVUpIC8qITwgQWRkIG1lc3NhZ2UgdG8gVHggQnVmZmVyIDAgICovCisjZGVmaW5lIEZEQ0FOX1RYX0JVRkZFUjEgXAorICAoKHVpbnQzMl90KTB4MDAwMDAwMDJVKSAvKiE8IEFkZCBtZXNzYWdlIHRvIFR4IEJ1ZmZlciAxICAqLworI2RlZmluZSBGRENBTl9UWF9CVUZGRVIyIFwKKyAgKCh1aW50MzJfdCkweDAwMDAwMDA0VSkgLyohPCBBZGQgbWVzc2FnZSB0byBUeCBCdWZmZXIgMiAgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEZEQ0FOX1J4X2xvY2F0aW9uIEZEQ0FOIFJ4IExvY2F0aW9uCisgKiBAeworICovCisjZGVmaW5lIEZEQ0FOX1JYX0ZJRk8wIFwKKyAgKCh1aW50MzJfdCkweDAwMDAwMDQwVSkgLyohPCBHZXQgcmVjZWl2ZWQgbWVzc2FnZSBmcm9tIFJ4IEZJRk8gMCAgICAqLworI2RlZmluZSBGRENBTl9SWF9GSUZPMSBcCisgICgodWludDMyX3QpMHgwMDAwMDA0MVUpIC8qITwgR2V0IHJlY2VpdmVkIG1lc3NhZ2UgZnJvbSBSeCBGSUZPIDEgICAgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEZEQ0FOX2V2ZW50X3R5cGUgRkRDQU4gRXZlbnQgVHlwZQorICogQHsKKyAqLworI2RlZmluZSBGRENBTl9UWF9FVkVOVCBcCisgICgodWludDMyX3QpMHgwMDQwMDAwMFUpIC8qITwgVHggZXZlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGRENBTl9UWF9JTl9TUElURV9PRl9BQk9SVCBcCisgICgodWludDMyX3QpMHgwMDgwMDAwMFUpIC8qITwgVHJhbnNtaXNzaW9uIGluIHNwaXRlIG9mIGNhbmNlbGxhdGlvbiAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgRkRDQU5faHBfbXNnX3N0b3JhZ2UgRkRDQU4gSGlnaCBQcmlvcml0eSBNZXNzYWdlIFN0b3JhZ2UKKyAqIEB7CisgKi8KKyNkZWZpbmUgRkRDQU5fSFBfU1RPUkFHRV9OT19GSUZPIFwKKyAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgLyohPCBObyBGSUZPIHNlbGVjdGVkICAgICAgICAgKi8KKyNkZWZpbmUgRkRDQU5fSFBfU1RPUkFHRV9NU0dfTE9TVCBcCisgICgodWludDMyX3QpMHgwMDAwMDA0MFUpIC8qITwgRklGTyBtZXNzYWdlIGxvc3QgICAgICAgICovCisjZGVmaW5lIEZEQ0FOX0hQX1NUT1JBR0VfUlhGSUZPMCBcCisgICgodWludDMyX3QpMHgwMDAwMDA4MFUpIC8qITwgTWVzc2FnZSBzdG9yZWQgaW4gRklGTyAwICovCisjZGVmaW5lIEZEQ0FOX0hQX1NUT1JBR0VfUlhGSUZPMSBcCisgICgodWludDMyX3QpMHgwMDAwMDBDMFUpIC8qITwgTWVzc2FnZSBzdG9yZWQgaW4gRklGTyAxICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBGRENBTl9wcm90b2NvbF9lcnJvcl9jb2RlIEZEQ0FOIHByb3RvY29sIGVycm9yIGNvZGUKKyAqIEB7CisgKi8KKyNkZWZpbmUgRkRDQU5fUFJPVE9DT0xfRVJST1JfTk9ORSBcCisgICgodWludDMyX3QpMHgwMDAwMDAwMFUpIC8qITwgTm8gZXJyb3Igb2NjdXJyZWQgICAgICAgICAqLworI2RlZmluZSBGRENBTl9QUk9UT0NPTF9FUlJPUl9TVFVGRiBcCisgICgodWludDMyX3QpMHgwMDAwMDAwMVUpIC8qITwgU3R1ZmYgZXJyb3IgICAgICAgICAgICAgICAqLworI2RlZmluZSBGRENBTl9QUk9UT0NPTF9FUlJPUl9GT1JNIFwKKyAgKCh1aW50MzJfdCkweDAwMDAwMDAyVSkgLyohPCBGb3JtIGVycm9yICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZEQ0FOX1BST1RPQ09MX0VSUk9SX0FDSyBcCisgICgodWludDMyX3QpMHgwMDAwMDAwM1UpIC8qITwgQWNrbm93bGVkZ2UgZXJyb3IgICAgICAgICAqLworI2RlZmluZSBGRENBTl9QUk9UT0NPTF9FUlJPUl9CSVQxIFwKKyAgKCh1aW50MzJfdCkweDAwMDAwMDA0VSkgLyohPCBCaXQgMSAocmVjZXNzaXZlKSBlcnJvciAgICovCisjZGVmaW5lIEZEQ0FOX1BST1RPQ09MX0VSUk9SX0JJVDAgXAorICAoKHVpbnQzMl90KTB4MDAwMDAwMDVVKSAvKiE8IEJpdCAwIChkb21pbmFudCkgZXJyb3IgICAgKi8KKyNkZWZpbmUgRkRDQU5fUFJPVE9DT0xfRVJST1JfQ1JDIFwKKyAgKCh1aW50MzJfdCkweDAwMDAwMDA2VSkgLyohPCBDUkMgY2hlY2sgc3VtIGVycm9yICAgICAgICovCisjZGVmaW5lIEZEQ0FOX1BST1RPQ09MX0VSUk9SX05PX0NIQU5HRSBcCisgICgodWludDMyX3QpMHgwMDAwMDAwN1UpIC8qITwgTm8gY2hhbmdlIHNpbmNlIGxhc3QgcmVhZCAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgRkRDQU5fY29tbXVuaWNhdGlvbl9zdGF0ZSBGRENBTiBjb21tdW5pY2F0aW9uIHN0YXRlCisgKiBAeworICovCisjZGVmaW5lIEZEQ0FOX0NPTV9TVEFURV9TWU5DIFwKKyAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgLyohPCBOb2RlIGlzIHN5bmNocm9uaXppbmcgb24gQ0FOIGNvbW11bmljYXRpb24gKi8KKyNkZWZpbmUgRkRDQU5fQ09NX1NUQVRFX0lETEUgXAorICAoKHVpbnQzMl90KTB4MDAwMDAwMDhVKSAvKiE8IE5vZGUgaXMgbmVpdGhlciByZWNlaXZlciBub3IgdHJhbnNtaXR0ZXIgICAqLworI2RlZmluZSBGRENBTl9DT01fU1RBVEVfUlggXAorICAoKHVpbnQzMl90KTB4MDAwMDAwMTBVKSAvKiE8IE5vZGUgaXMgb3BlcmF0aW5nIGFzIHJlY2VpdmVyICAgICAgICAgICAgICAqLworI2RlZmluZSBGRENBTl9DT01fU1RBVEVfVFggXAorICAoKHVpbnQzMl90KTB4MDAwMDAwMThVKSAvKiE8IE5vZGUgaXMgb3BlcmF0aW5nIGFzIHRyYW5zbWl0dGVyICAgICAgICAgICAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgRkRDQU5fUnhfRklGT19vcGVyYXRpb25fbW9kZSBGRENBTiBGSUZPIG9wZXJhdGlvbiBtb2RlCisgKiBAeworICovCisjZGVmaW5lIEZEQ0FOX1JYX0ZJRk9fQkxPQ0tJTkcgXAorICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAvKiE8IFJ4IEZJRk8gYmxvY2tpbmcgbW9kZSAgKi8KKyNkZWZpbmUgRkRDQU5fUlhfRklGT19PVkVSV1JJVEUgXAorICAoKHVpbnQzMl90KTB4MDAwMDAwMDFVKSAvKiE8IFJ4IEZJRk8gb3ZlcndyaXRlIG1vZGUgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEZEQ0FOX05vbl9NYXRjaGluZ19GcmFtZXMgRkRDQU4gbm9uLW1hdGNoaW5nIGZyYW1lcworICogQHsKKyAqLworI2RlZmluZSBGRENBTl9BQ0NFUFRfSU5fUlhfRklGTzAgXAorICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAvKiE8IEFjY2VwdCBpbiBSeCBGSUZPIDAgKi8KKyNkZWZpbmUgRkRDQU5fQUNDRVBUX0lOX1JYX0ZJRk8xIFwKKyAgKCh1aW50MzJfdCkweDAwMDAwMDAxVSkgICAgICAgICAgICAgICAgICAgIC8qITwgQWNjZXB0IGluIFJ4IEZJRk8gMSAqLworI2RlZmluZSBGRENBTl9SRUpFQ1QgKCh1aW50MzJfdCkweDAwMDAwMDAyVSkgLyohPCBSZWplY3QgICAgICAgICAgICAgICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBGRENBTl9SZWplY3RfUmVtb3RlX0ZyYW1lcyBGRENBTiByZWplY3QgcmVtb3RlIGZyYW1lcworICogQHsKKyAqLworI2RlZmluZSBGRENBTl9GSUxURVJfUkVNT1RFICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgLyohPCBGaWx0ZXIgcmVtb3RlIGZyYW1lcyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGRENBTl9SRUpFQ1RfUkVNT1RFIFwKKyAgKCh1aW50MzJfdCkweDAwMDAwMDAxVSkgLyohPCBSZWplY3QgYWxsIHJlbW90ZSBmcmFtZXMgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEZEQ0FOX0ludGVycnVwdF9MaW5lIEZEQ0FOIGludGVycnVwdCBsaW5lCisgKiBAeworICovCisjZGVmaW5lIEZEQ0FOX0lOVEVSUlVQVF9MSU5FMCAoKHVpbnQzMl90KTB4MDAwMDAwMDFVKSAvKiE8IEludGVycnVwdCBMaW5lIDAgKi8KKyNkZWZpbmUgRkRDQU5fSU5URVJSVVBUX0xJTkUxICgodWludDMyX3QpMHgwMDAwMDAwMlUpIC8qITwgSW50ZXJydXB0IExpbmUgMSAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgRkRDQU5fVGltZXN0YW1wIEZEQ0FOIHRpbWVzdGFtcAorICogQHsKKyAqLworI2RlZmluZSBGRENBTl9USU1FU1RBTVBfSU5URVJOQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgodWludDMyX3QpMHgwMDAwMDAwMVUpIC8qITwgVGltZXN0YW1wIGNvdW50ZXIgdmFsdWUgaW5jcmVtZW50ZWQgYWNjb3JkaW5nIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gVENQICovCisjZGVmaW5lIEZEQ0FOX1RJTUVTVEFNUF9FWFRFUk5BTCBcCisgICgodWludDMyX3QpMHgwMDAwMDAwMlUpIC8qITwgRXh0ZXJuYWwgdGltZXN0YW1wIGNvdW50ZXIgdmFsdWUgdXNlZCAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgRkRDQU5fVGltZXN0YW1wX1ByZXNjYWxlciBGRENBTiB0aW1lc3RhbXAgcHJlc2NhbGVyCisgKiBAeworICovCisjZGVmaW5lIEZEQ0FOX1RJTUVTVEFNUF9QUkVTQ18xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAvKiE8IFRpbWVzdGFtcCBjb3VudGVyIHRpbWUgdW5pdCBpbiBlcXVhbCB0byBDQU4gYml0IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRkRDQU5fVElNRVNUQU1QX1BSRVNDXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgodWludDMyX3QpMHgwMDAxMDAwMFUpIC8qITwgVGltZXN0YW1wIGNvdW50ZXIgdGltZSB1bml0IGluIGVxdWFsIHRvIENBTiBiaXQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lIG11bHRpcGxpZWQgYnkgMiAgKi8KKyNkZWZpbmUgRkRDQU5fVElNRVNUQU1QX1BSRVNDXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgodWludDMyX3QpMHgwMDAyMDAwMFUpIC8qITwgVGltZXN0YW1wIGNvdW50ZXIgdGltZSB1bml0IGluIGVxdWFsIHRvIENBTiBiaXQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lIG11bHRpcGxpZWQgYnkgMyAgKi8KKyNkZWZpbmUgRkRDQU5fVElNRVNUQU1QX1BSRVNDXzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgodWludDMyX3QpMHgwMDAzMDAwMFUpIC8qITwgVGltZXN0YW1wIGNvdW50ZXIgdGltZSB1bml0IGluIGVxdWFsIHRvIENBTiBiaXQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lIG11bHRpcGxpZWQgYnkgNCAgKi8KKyNkZWZpbmUgRkRDQU5fVElNRVNUQU1QX1BSRVNDXzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgodWludDMyX3QpMHgwMDA0MDAwMFUpIC8qITwgVGltZXN0YW1wIGNvdW50ZXIgdGltZSB1bml0IGluIGVxdWFsIHRvIENBTiBiaXQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lIG11bHRpcGxpZWQgYnkgNSAgKi8KKyNkZWZpbmUgRkRDQU5fVElNRVNUQU1QX1BSRVNDXzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgodWludDMyX3QpMHgwMDA1MDAwMFUpIC8qITwgVGltZXN0YW1wIGNvdW50ZXIgdGltZSB1bml0IGluIGVxdWFsIHRvIENBTiBiaXQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lIG11bHRpcGxpZWQgYnkgNiAgKi8KKyNkZWZpbmUgRkRDQU5fVElNRVNUQU1QX1BSRVNDXzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgodWludDMyX3QpMHgwMDA2MDAwMFUpIC8qITwgVGltZXN0YW1wIGNvdW50ZXIgdGltZSB1bml0IGluIGVxdWFsIHRvIENBTiBiaXQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lIG11bHRpcGxpZWQgYnkgNyAgKi8KKyNkZWZpbmUgRkRDQU5fVElNRVNUQU1QX1BSRVNDXzggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgodWludDMyX3QpMHgwMDA3MDAwMFUpIC8qITwgVGltZXN0YW1wIGNvdW50ZXIgdGltZSB1bml0IGluIGVxdWFsIHRvIENBTiBiaXQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lIG11bHRpcGxpZWQgYnkgOCAgKi8KKyNkZWZpbmUgRkRDQU5fVElNRVNUQU1QX1BSRVNDXzkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgodWludDMyX3QpMHgwMDA4MDAwMFUpIC8qITwgVGltZXN0YW1wIGNvdW50ZXIgdGltZSB1bml0IGluIGVxdWFsIHRvIENBTiBiaXQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lIG11bHRpcGxpZWQgYnkgOSAgKi8KKyNkZWZpbmUgRkRDQU5fVElNRVNUQU1QX1BSRVNDXzEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgodWludDMyX3QpMHgwMDA5MDAwMFUpIC8qITwgVGltZXN0YW1wIGNvdW50ZXIgdGltZSB1bml0IGluIGVxdWFsIHRvIENBTiBiaXQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lIG11bHRpcGxpZWQgYnkgMTAgKi8KKyNkZWZpbmUgRkRDQU5fVElNRVNUQU1QX1BSRVNDXzExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgodWludDMyX3QpMHgwMDBBMDAwMFUpIC8qITwgVGltZXN0YW1wIGNvdW50ZXIgdGltZSB1bml0IGluIGVxdWFsIHRvIENBTiBiaXQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lIG11bHRpcGxpZWQgYnkgMTEgKi8KKyNkZWZpbmUgRkRDQU5fVElNRVNUQU1QX1BSRVNDXzEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgodWludDMyX3QpMHgwMDBCMDAwMFUpIC8qITwgVGltZXN0YW1wIGNvdW50ZXIgdGltZSB1bml0IGluIGVxdWFsIHRvIENBTiBiaXQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lIG11bHRpcGxpZWQgYnkgMTIgKi8KKyNkZWZpbmUgRkRDQU5fVElNRVNUQU1QX1BSRVNDXzEzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgodWludDMyX3QpMHgwMDBDMDAwMFUpIC8qITwgVGltZXN0YW1wIGNvdW50ZXIgdGltZSB1bml0IGluIGVxdWFsIHRvIENBTiBiaXQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lIG11bHRpcGxpZWQgYnkgMTMgKi8KKyNkZWZpbmUgRkRDQU5fVElNRVNUQU1QX1BSRVNDXzE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgodWludDMyX3QpMHgwMDBEMDAwMFUpIC8qITwgVGltZXN0YW1wIGNvdW50ZXIgdGltZSB1bml0IGluIGVxdWFsIHRvIENBTiBiaXQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lIG11bHRpcGxpZWQgYnkgMTQgKi8KKyNkZWZpbmUgRkRDQU5fVElNRVNUQU1QX1BSRVNDXzE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgodWludDMyX3QpMHgwMDBFMDAwMFUpIC8qITwgVGltZXN0YW1wIGNvdW50ZXIgdGltZSB1bml0IGluIGVxdWFsIHRvIENBTiBiaXQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lIG11bHRpcGxpZWQgYnkgMTUgKi8KKyNkZWZpbmUgRkRDQU5fVElNRVNUQU1QX1BSRVNDXzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgodWludDMyX3QpMHgwMDBGMDAwMFUpIC8qITwgVGltZXN0YW1wIGNvdW50ZXIgdGltZSB1bml0IGluIGVxdWFsIHRvIENBTiBiaXQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lIG11bHRpcGxpZWQgYnkgMTYgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEZEQ0FOX1RpbWVvdXRfT3BlcmF0aW9uIEZEQ0FOIHRpbWVvdXQgb3BlcmF0aW9uCisgKiBAeworICovCisjZGVmaW5lIEZEQ0FOX1RJTUVPVVRfQ09OVElOVU9VUyBcCisgICgodWludDMyX3QpMHgwMDAwMDAwMFUpIC8qITwgVGltZW91dCBjb250aW51b3VzIG9wZXJhdGlvbiAgICAgICAgKi8KKyNkZWZpbmUgRkRDQU5fVElNRU9VVF9UWF9FVkVOVF9GSUZPIFwKKyAgKCh1aW50MzJfdCkweDAwMDAwMDAyVSkgLyohPCBUaW1lb3V0IGNvbnRyb2xsZWQgYnkgVHggRXZlbnQgRklGTyAqLworI2RlZmluZSBGRENBTl9USU1FT1VUX1JYX0ZJRk8wIFwKKyAgKCh1aW50MzJfdCkweDAwMDAwMDA0VSkgLyohPCBUaW1lb3V0IGNvbnRyb2xsZWQgYnkgUnggRklGTyAwICAgICAqLworI2RlZmluZSBGRENBTl9USU1FT1VUX1JYX0ZJRk8xIFwKKyAgKCh1aW50MzJfdCkweDAwMDAwMDA2VSkgLyohPCBUaW1lb3V0IGNvbnRyb2xsZWQgYnkgUnggRklGTyAxICAgICAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgSW50ZXJydXB0X01hc2tzIEludGVycnVwdCBtYXNrcworICogQHsKKyAqLworI2RlZmluZSBGRENBTl9JUl9NQVNLICgodWludDMyX3QpMHgwMEZGRkZGRlUpIC8qITwgRkRDQU4gaW50ZXJydXB0cyBtYXNrICovCisjZGVmaW5lIEZEQ0FOX0lMU19NQVNLIFwKKyAgKCh1aW50MzJfdCkweDAwMDAwMDdGVSkgLyohPCBGRENBTiBpbnRlcnJ1cHRzIGdyb3VwIG1hc2sgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEZEQ0FOX2ZsYWdzIEZEQ0FOIEZsYWdzCisgKiBAeworICovCisjZGVmaW5lIEZEQ0FOX0ZMQUdfVFhfQ09NUExFVEUgXAorICBGRENBTl9JUl9UQyAvKiE8IFRyYW5zbWlzc2lvbiBDb21wbGV0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZEQ0FOX0ZMQUdfVFhfQUJPUlRfQ09NUExFVEUgXAorICBGRENBTl9JUl9UQ0YgLyohPCBUcmFuc21pc3Npb24gQ2FuY2VsbGF0aW9uIEZpbmlzaGVkICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGRENBTl9GTEFHX1RYX0ZJRk9fRU1QVFkgXAorICBGRENBTl9JUl9URkUgLyohPCBUeCBGSUZPIEVtcHR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGRENBTl9GTEFHX1JYX0hJR0hfUFJJT1JJVFlfTVNHIFwKKyAgRkRDQU5fSVJfSFBNIC8qITwgSGlnaCBwcmlvcml0eSBtZXNzYWdlIHJlY2VpdmVkICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRkRDQU5fRkxBR19UWF9FVlRfRklGT19FTFRfTE9TVCBcCisgIEZEQ0FOX0lSX1RFRkwgLyohPCBUeCBFdmVudCBGSUZPIGVsZW1lbnQgbG9zdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGRENBTl9GTEFHX1RYX0VWVF9GSUZPX0ZVTEwgXAorICBGRENBTl9JUl9URUZGIC8qITwgVHggRXZlbnQgRklGTyBmdWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRkRDQU5fRkxBR19UWF9FVlRfRklGT19ORVdfREFUQSBcCisgIEZEQ0FOX0lSX1RFRk4gLyohPCBUeCBIYW5kbGVyIHdyb3RlIFR4IEV2ZW50IEZJRk8gZWxlbWVudCAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGRENBTl9GTEFHX1JYX0ZJRk8wX01FU1NBR0VfTE9TVCBcCisgIEZEQ0FOX0lSX1JGMEwgLyohPCBSeCBGSUZPIDAgbWVzc2FnZSBsb3N0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGRENBTl9GTEFHX1JYX0ZJRk8wX0ZVTEwgXAorICBGRENBTl9JUl9SRjBGIC8qITwgUnggRklGTyAwIGZ1bGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRkRDQU5fRkxBR19SWF9GSUZPMF9ORVdfTUVTU0FHRSBcCisgIEZEQ0FOX0lSX1JGME4gLyohPCBOZXcgbWVzc2FnZSB3cml0dGVuIHRvIFJ4IEZJRk8gMCAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGRENBTl9GTEFHX1JYX0ZJRk8xX01FU1NBR0VfTE9TVCBcCisgIEZEQ0FOX0lSX1JGMUwgLyohPCBSeCBGSUZPIDEgbWVzc2FnZSBsb3N0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGRENBTl9GTEFHX1JYX0ZJRk8xX0ZVTEwgXAorICBGRENBTl9JUl9SRjFGIC8qITwgUnggRklGTyAxIGZ1bGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRkRDQU5fRkxBR19SWF9GSUZPMV9ORVdfTUVTU0FHRSBcCisgIEZEQ0FOX0lSX1JGMU4gLyohPCBOZXcgbWVzc2FnZSB3cml0dGVuIHRvIFJ4IEZJRk8gMSAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGRENBTl9GTEFHX1JBTV9BQ0NFU1NfRkFJTFVSRSBcCisgIEZEQ0FOX0lSX01SQUYgLyohPCBNZXNzYWdlIFJBTSBhY2Nlc3MgZmFpbHVyZSBvY2N1cnJlZCAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGRENBTl9GTEFHX0VSUk9SX0xPR0dJTkdfT1ZFUkZMT1cgXAorICBGRENBTl9JUl9FTE8gLyohPCBPdmVyZmxvdyBvZiBGRENBTiBFcnJvciBMb2dnaW5nIENvdW50ZXIgb2NjdXJyZWQgICAgICAqLworI2RlZmluZSBGRENBTl9GTEFHX0VSUk9SX1BBU1NJVkUgXAorICBGRENBTl9JUl9FUCAvKiE8IEVycm9yX1Bhc3NpdmUgc3RhdHVzIGNoYW5nZWQgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZEQ0FOX0ZMQUdfRVJST1JfV0FSTklORyBcCisgIEZEQ0FOX0lSX0VXIC8qITwgRXJyb3JfV2FybmluZyBzdGF0dXMgY2hhbmdlZCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRkRDQU5fRkxBR19CVVNfT0ZGIFwKKyAgRkRDQU5fSVJfQk8gLyohPCBCdXNfT2ZmIHN0YXR1cyBjaGFuZ2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGRENBTl9GTEFHX1JBTV9XQVRDSERPRyBcCisgIEZEQ0FOX0lSX1dESSAvKiE8IE1lc3NhZ2UgUkFNIFdhdGNoZG9nIGV2ZW50IGR1ZSB0byBtaXNzaW5nIFJFQURZICAgICAgICovCisjZGVmaW5lIEZEQ0FOX0ZMQUdfQVJCX1BST1RPQ09MX0VSUk9SIFwKKyAgRkRDQU5fSVJfUEVBIC8qITwgUHJvdG9jb2wgZXJyb3IgaW4gYXJiaXRyYXRpb24gcGhhc2UgZGV0ZWN0ZWQgICAgICAgICAgKi8KKyNkZWZpbmUgRkRDQU5fRkxBR19EQVRBX1BST1RPQ09MX0VSUk9SIFwKKyAgRkRDQU5fSVJfUEVEIC8qITwgUHJvdG9jb2wgZXJyb3IgaW4gZGF0YSBwaGFzZSBkZXRlY3RlZCAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRkRDQU5fRkxBR19SRVNFUlZFRF9BRERSRVNTX0FDQ0VTUyBcCisgIEZEQ0FOX0lSX0FSQSAvKiE8IEFjY2VzcyB0byByZXNlcnZlZCBhZGRyZXNzIG9jY3VycmVkICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZEQ0FOX0ZMQUdfVElNRVNUQU1QX1dSQVBBUk9VTkQgXAorICBGRENBTl9JUl9UU1cgLyohPCBUaW1lc3RhbXAgY291bnRlciB3cmFwcGVkIGFyb3VuZCAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGRENBTl9GTEFHX1RJTUVPVVRfT0NDVVJSRUQgXAorICBGRENBTl9JUl9UT08gLyohPCBUaW1lb3V0IHJlYWNoZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgRkRDQU5fSW50ZXJydXB0cyBGRENBTiBJbnRlcnJ1cHRzCisgKiBAeworICovCisKKy8qKiBAZGVmZ3JvdXAgRkRDQU5fVHhfSW50ZXJydXB0cyBGRENBTiBUeCBJbnRlcnJ1cHRzCisgKiBAeworICovCisjZGVmaW5lIEZEQ0FOX0lUX1RYX0NPTVBMRVRFIFwKKyAgRkRDQU5fSUVfVENFIC8qITwgVHJhbnNtaXNzaW9uIENvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRkRDQU5fSVRfVFhfQUJPUlRfQ09NUExFVEUgXAorICBGRENBTl9JRV9UQ0ZFIC8qITwgVHJhbnNtaXNzaW9uIENhbmNlbGxhdGlvbiBGaW5pc2hlZCAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRkRDQU5fSVRfVFhfRklGT19FTVBUWSBcCisgIEZEQ0FOX0lFX1RGRUUgLyohPCBUeCBGSUZPIEVtcHR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgRkRDQU5fUnhfSW50ZXJydXB0cyBGRENBTiBSeCBJbnRlcnJ1cHRzCisgKiBAeworICovCisjZGVmaW5lIEZEQ0FOX0lUX1JYX0hJR0hfUFJJT1JJVFlfTVNHIFwKKyAgRkRDQU5fSUVfSFBNRSAvKiE8IEhpZ2ggcHJpb3JpdHkgbWVzc2FnZSByZWNlaXZlZCAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBGRENBTl9Db3VudGVyX0ludGVycnVwdHMgRkRDQU4gQ291bnRlciBJbnRlcnJ1cHRzCisgKiBAeworICovCisjZGVmaW5lIEZEQ0FOX0lUX1RJTUVTVEFNUF9XUkFQQVJPVU5EIFwKKyAgRkRDQU5fSUVfVFNXRSAvKiE8IFRpbWVzdGFtcCBjb3VudGVyIHdyYXBwZWQgYXJvdW5kICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZEQ0FOX0lUX1RJTUVPVVRfT0NDVVJSRUQgXAorICBGRENBTl9JRV9UT09FIC8qITwgVGltZW91dCByZWFjaGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEZEQ0FOX1R4X0V2ZW50X0ZpZm9fSW50ZXJydXB0cyBGRENBTiBUeCBFdmVudCBGSUZPIEludGVycnVwdHMKKyAqIEB7CisgKi8KKyNkZWZpbmUgRkRDQU5fSVRfVFhfRVZUX0ZJRk9fRUxUX0xPU1QgXAorICBGRENBTl9JRV9URUZMRSAvKiE8IFR4IEV2ZW50IEZJRk8gZWxlbWVudCBsb3N0ICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGRENBTl9JVF9UWF9FVlRfRklGT19GVUxMIFwKKyAgRkRDQU5fSUVfVEVGRkUgLyohPCBUeCBFdmVudCBGSUZPIGZ1bGwgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRkRDQU5fSVRfVFhfRVZUX0ZJRk9fTkVXX0RBVEEgXAorICBGRENBTl9JRV9URUZORSAvKiE8IFR4IEhhbmRsZXIgd3JvdGUgVHggRXZlbnQgRklGTyBlbGVtZW50ICAgICAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgRkRDQU5fUnhfRmlmbzBfSW50ZXJydXB0cyBGRENBTiBSeCBGSUZPIDAgSW50ZXJydXB0cworICogQHsKKyAqLworI2RlZmluZSBGRENBTl9JVF9SWF9GSUZPMF9NRVNTQUdFX0xPU1QgXAorICBGRENBTl9JRV9SRjBMRSAvKiE8IFJ4IEZJRk8gMCBtZXNzYWdlIGxvc3QgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZEQ0FOX0lUX1JYX0ZJRk8wX0ZVTEwgXAorICBGRENBTl9JRV9SRjBGRSAvKiE8IFJ4IEZJRk8gMCBmdWxsICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZEQ0FOX0lUX1JYX0ZJRk8wX05FV19NRVNTQUdFIFwKKyAgRkRDQU5fSUVfUkYwTkUgLyohPCBOZXcgbWVzc2FnZSB3cml0dGVuIHRvIFJ4IEZJRk8gMCAgICAgICAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgRkRDQU5fUnhfRmlmbzFfSW50ZXJydXB0cyBGRENBTiBSeCBGSUZPIDEgSW50ZXJydXB0cworICogQHsKKyAqLworI2RlZmluZSBGRENBTl9JVF9SWF9GSUZPMV9NRVNTQUdFX0xPU1QgXAorICBGRENBTl9JRV9SRjFMRSAvKiE8IFJ4IEZJRk8gMSBtZXNzYWdlIGxvc3QgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZEQ0FOX0lUX1JYX0ZJRk8xX0ZVTEwgXAorICBGRENBTl9JRV9SRjFGRSAvKiE8IFJ4IEZJRk8gMSBmdWxsICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZEQ0FOX0lUX1JYX0ZJRk8xX05FV19NRVNTQUdFIFwKKyAgRkRDQU5fSUVfUkYxTkUgLyohPCBOZXcgbWVzc2FnZSB3cml0dGVuIHRvIFJ4IEZJRk8gMSAgICAgICAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgRkRDQU5fRXJyb3JfSW50ZXJydXB0cyBGRENBTiBFcnJvciBJbnRlcnJ1cHRzCisgKiBAeworICovCisjZGVmaW5lIEZEQ0FOX0lUX1JBTV9BQ0NFU1NfRkFJTFVSRSBcCisgIEZEQ0FOX0lFX01SQUZFIC8qITwgTWVzc2FnZSBSQU0gYWNjZXNzIGZhaWx1cmUgb2NjdXJyZWQgICAgICAgICAgICAgICovCisjZGVmaW5lIEZEQ0FOX0lUX0VSUk9SX0xPR0dJTkdfT1ZFUkZMT1cgXAorICBGRENBTl9JRV9FTE9FIC8qITwgT3ZlcmZsb3cgb2YgRkRDQU4gRXJyb3IgTG9nZ2luZyBDb3VudGVyIG9jY3VycmVkICovCisjZGVmaW5lIEZEQ0FOX0lUX1JBTV9XQVRDSERPRyBcCisgIEZEQ0FOX0lFX1dESUUgLyohPCBNZXNzYWdlIFJBTSBXYXRjaGRvZyBldmVudCBkdWUgdG8gbWlzc2luZyBSRUFEWSAgKi8KKyNkZWZpbmUgRkRDQU5fSVRfQVJCX1BST1RPQ09MX0VSUk9SIFwKKyAgRkRDQU5fSUVfUEVBRSAvKiE8IFByb3RvY29sIGVycm9yIGluIGFyYml0cmF0aW9uIHBoYXNlIGRldGVjdGVkICAgICAqLworI2RlZmluZSBGRENBTl9JVF9EQVRBX1BST1RPQ09MX0VSUk9SIFwKKyAgRkRDQU5fSUVfUEVERSAvKiE8IFByb3RvY29sIGVycm9yIGluIGRhdGEgcGhhc2UgZGV0ZWN0ZWQgICAgICAgICAgICAqLworI2RlZmluZSBGRENBTl9JVF9SRVNFUlZFRF9BRERSRVNTX0FDQ0VTUyBcCisgIEZEQ0FOX0lFX0FSQUUgLyohPCBBY2Nlc3MgdG8gcmVzZXJ2ZWQgYWRkcmVzcyBvY2N1cnJlZCAgICAgICAgICAgICAgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEZEQ0FOX0Vycm9yX1N0YXR1c19JbnRlcnJ1cHRzIEZEQ0FOIEVycm9yIFN0YXR1cyBJbnRlcnJ1cHRzCisgKiBAeworICovCisjZGVmaW5lIEZEQ0FOX0lUX0VSUk9SX1BBU1NJVkUgXAorICBGRENBTl9JRV9FUEUgLyohPCBFcnJvcl9QYXNzaXZlIHN0YXR1cyBjaGFuZ2VkICAgICAgKi8KKyNkZWZpbmUgRkRDQU5fSVRfRVJST1JfV0FSTklORyBcCisgIEZEQ0FOX0lFX0VXRSAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRXJyb3JfV2FybmluZyBzdGF0dXMgY2hhbmdlZCAgICAgICovCisjZGVmaW5lIEZEQ0FOX0lUX0JVU19PRkYgRkRDQU5fSUVfQk9FIC8qITwgQnVzX09mZiBzdGF0dXMgY2hhbmdlZCAqLworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEZEQ0FOX0ludGVycnVwdHNfTGlzdCBGRENBTiBJbnRlcnJ1cHRzIExpc3QKKyAqIEB7CisgKi8KKyNkZWZpbmUgRkRDQU5fSVRfTElTVF9SWF9GSUZPMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChGRENBTl9JVF9SWF9GSUZPMF9NRVNTQUdFX0xPU1QgfCBGRENBTl9JVF9SWF9GSUZPMF9GVUxMIHwgXAorICAgRkRDQU5fSVRfUlhfRklGTzBfTkVXX01FU1NBR0UpIC8qITwgUlggRklGTyAwIEludGVycnVwdHMgTGlzdCAgICAgICAgICAqLworI2RlZmluZSBGRENBTl9JVF9MSVNUX1JYX0ZJRk8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEZEQ0FOX0lUX1JYX0ZJRk8xX01FU1NBR0VfTE9TVCB8IEZEQ0FOX0lUX1JYX0ZJRk8xX0ZVTEwgfCBcCisgICBGRENBTl9JVF9SWF9GSUZPMV9ORVdfTUVTU0FHRSkgLyohPCBSWCBGSUZPIDEgSW50ZXJydXB0cyBMaXN0ICAgICAgICAgICovCisjZGVmaW5lIEZEQ0FOX0lUX0xJU1RfU01TRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoRkRDQU5fSVRfVFhfQUJPUlRfQ09NUExFVEUgfCBGRENBTl9JVF9UWF9DT01QTEVURSB8IFwKKyAgIEZEQ0FOX0lUX1JYX0hJR0hfUFJJT1JJVFlfTVNHKSAvKiE8IFN0YXR1cyBNZXNzYWdlIEludGVycnVwdHMgTGlzdCAgICAgKi8KKyNkZWZpbmUgRkRDQU5fSVRfTElTVF9UWF9GSUZPX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEZEQ0FOX0lUX1RYX0VWVF9GSUZPX0VMVF9MT1NUIHwgRkRDQU5fSVRfVFhfRVZUX0ZJRk9fRlVMTCB8IFwKKyAgIEZEQ0FOX0lUX1RYX0VWVF9GSUZPX05FV19EQVRBIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIEZEQ0FOX0lUX1RYX0ZJRk9fRU1QVFkpIC8qITwgVFggRklGTyBFcnJvciBJbnRlcnJ1cHRzIExpc3QgICAgICAqLworI2RlZmluZSBGRENBTl9JVF9MSVNUX01JU0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEZEQ0FOX0lUX1RJTUVPVVRfT0NDVVJSRUQgfCBGRENBTl9JVF9SQU1fQUNDRVNTX0ZBSUxVUkUgfCBcCisgICBGRENBTl9JVF9USU1FU1RBTVBfV1JBUEFST1VORCkgLyohPCBNaXNjLiBJbnRlcnJ1cHRzIExpc3QgICAgICAgICAgICAgICovCisjZGVmaW5lIEZEQ0FOX0lUX0xJU1RfQklUX0xJTkVfRVJST1IgXAorICAoRkRDQU5fSVRfRVJST1JfUEFTU0lWRSB8ICAgICAgICAgIFwKKyAgIEZEQ0FOX0lUX0VSUk9SX0xPR0dJTkdfT1ZFUkZMT1cpIC8qITwgQml0IGFuZCBMaW5lIEVycm9yIEludGVycnVwdHMgTGlzdCAqLworI2RlZmluZSBGRENBTl9JVF9MSVNUX1BST1RPQ09MX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEZEQ0FOX0lUX1JFU0VSVkVEX0FERFJFU1NfQUNDRVNTIHwgRkRDQU5fSVRfREFUQV9QUk9UT0NPTF9FUlJPUiB8ICAgICAgICBcCisgICBGRENBTl9JVF9BUkJfUFJPVE9DT0xfRVJST1IgfCBGRENBTl9JVF9SQU1fV0FUQ0hET0cgfCBGRENBTl9JVF9CVVNfT0ZGIHwgXAorICAgRkRDQU5fSVRfRVJST1JfV0FSTklORykgLyohPCBQcm90b2NvbCBFcnJvciBJbnRlcnJ1cHRzIExpc3QgICAgICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBGRENBTl9JbnRlcnJ1cHRzX0dyb3VwIEZEQ0FOIEludGVycnVwdHMgR3JvdXAKKyAqIEB7CisgKi8KKyNkZWZpbmUgRkRDQU5fSVRfR1JPVVBfUlhfRklGTzAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRkRDQU5fSUxTX1JYRklGTzAgLyohPCBSWCBGSUZPIDAgSW50ZXJydXB0cyBHcm91cDogICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFJGMExMOiBSeCBGSUZPIDAgTWVzc2FnZSBMb3N0IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFJGMEZMOiBSeCBGSUZPIDAgaXMgRnVsbCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFJGME5MOiBSeCBGSUZPIDAgSGFzIE5ldyBNZXNzYWdlICAgICAgICAgICAgKi8KKyNkZWZpbmUgRkRDQU5fSVRfR1JPVVBfUlhfRklGTzEgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRkRDQU5fSUxTX1JYRklGTzEgLyohPCBSWCBGSUZPIDEgSW50ZXJydXB0cyBHcm91cDogICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFJGMUxMOiBSeCBGSUZPIDEgTWVzc2FnZSBMb3N0IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFJGMUZMOiBSeCBGSUZPIDEgaXMgRnVsbCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFJGMU5MOiBSeCBGSUZPIDEgSGFzIE5ldyBNZXNzYWdlICAgICAgICAgICAgKi8KKyNkZWZpbmUgRkRDQU5fSVRfR1JPVVBfU01TRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBGRENBTl9JTFNfU01TRyAvKiE8IFN0YXR1cyBNZXNzYWdlIEludGVycnVwdHMgR3JvdXA6ICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBUQ0ZMOiBUcmFuc21pc3Npb24gQ2FuY2VsbGF0aW9uIEZpbmlzaGVkIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRDTDogVHJhbnNtaXNzaW9uIENvbXBsZXRlZCAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgSFBNTDogSGlnaCBQcmlvcml0eSBNZXNzYWdlICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGRENBTl9JVF9HUk9VUF9UWF9GSUZPX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICBcCisgIEZEQ0FOX0lMU19URkVSUiAvKiE8IFRYIEZJRk8gRXJyb3IgSW50ZXJydXB0cyBHcm91cDogICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBURUZMTDogVHggRXZlbnQgRklGTyBFbGVtZW50IExvc3QgXAorICAgICAgICAgICAgICAgICAgICAgICAgIFRFRkZMOiBUeCBFdmVudCBGSUZPIEZ1bGwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgVEVGTkw6IFR4IEV2ZW50IEZJRk8gTmV3IEVudHJ5ICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBURkVMOiBUeCBGSUZPIEVtcHR5IEludGVycnVwdCBMaW5lICAgICAgICAgICovCisjZGVmaW5lIEZEQ0FOX0lUX0dST1VQX01JU0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBGRENBTl9JTFNfTUlTQyAvKiE8IE1pc2MuIEludGVycnVwdHMgR3JvdXA6ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRPT0w6IFRpbWVvdXQgT2NjdXJyZWQgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBNUkFGTDogTWVzc2FnZSBSQU0gQWNjZXNzIEZhaWx1cmUgXAorICAgICAgICAgICAgICAgICAgICAgICAgVFNXTDogVGltZXN0YW1wIFdyYXBhcm91bmQgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGRENBTl9JVF9HUk9VUF9CSVRfTElORV9FUlJPUiAgICAgICAgICAgICAgICAgICAgICBcCisgIEZEQ0FOX0lMU19CRVJSIC8qITwgQml0IGFuZCBMaW5lIEVycm9yIEludGVycnVwdHMgR3JvdXA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVQTDogRXJyb3IgUGFzc2l2ZSAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgRUxPTDogRXJyb3IgTG9nZ2luZyBPdmVyZmxvdyAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGRENBTl9JVF9HUk9VUF9QUk9UT0NPTF9FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEZEQ0FOX0lMU19QRVJSIC8qITwgUHJvdG9jb2wgRXJyb3IgR3JvdXA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFSQUw6IEFjY2VzcyB0byBSZXNlcnZlZCBBZGRyZXNzIExpbmUgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgUEVETDogUHJvdG9jb2wgRXJyb3IgaW4gRGF0YSBQaGFzZSBMaW5lICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBQRUFMOiBQcm90b2NvbCBFcnJvciBpbiBBcmJpdHJhdGlvbiBQaGFzZSBMaW5lIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdESUw6IFdhdGNoZG9nIEludGVycnVwdCBMaW5lICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgQk9MOiBCdXNfT2ZmIFN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBFV0w6IFdhcm5pbmcgU3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEZEQ0FOX0V4cG9ydGVkX01hY3JvcyBGRENBTiBFeHBvcnRlZCBNYWNyb3MKKyAqIEB7CisgKi8KKworLyoqIEBicmllZiAgUmVzZXQgRkRDQU4gaGFuZGxlIHN0YXRlLgorICogQHBhcmFtICBfX0hBTkRMRV9fIEZEQ0FOIGhhbmRsZS4KKyAqIEByZXR2YWwgTm9uZQorICovCisjaWYgVVNFX0hBTF9GRENBTl9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMQorI2RlZmluZSBfX0hBTF9GRENBTl9SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChfX0hBTkRMRV9fKS0+U3RhdGUgPSBIQUxfRkRDQU5fU1RBVEVfUkVTRVQ7ICAgXAorICAgIChfX0hBTkRMRV9fKS0+TXNwSW5pdENhbGxiYWNrID0gTlVMTDsgICAgICAgICAgXAorICAgIChfX0hBTkRMRV9fKS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBOVUxMOyAgICAgICAgXAorICB9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgX19IQUxfRkRDQU5fUkVTRVRfSEFORExFX1NUQVRFKF9fSEFORExFX18pIFwKKyAgKChfX0hBTkRMRV9fKS0+U3RhdGUgPSBIQUxfRkRDQU5fU1RBVEVfUkVTRVQpCisjZW5kaWYgLyogVVNFX0hBTF9GRENBTl9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSB0aGUgc3BlY2lmaWVkIEZEQ0FOIGludGVycnVwdHMuCisgKiBAcGFyYW0gIF9fSEFORExFX18gRkRDQU4gaGFuZGxlLgorICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIEZEQ0FOIGludGVycnVwdC4KKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiBAYXJnIEZEQ0FOX0ludGVycnVwdHMKKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX0ZEQ0FOX0VOQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSBcCisgIChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklFIHw9IChfX0lOVEVSUlVQVF9fKQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSB0aGUgc3BlY2lmaWVkIEZEQ0FOIGludGVycnVwdHMuCisgKiBAcGFyYW0gIF9fSEFORExFX18gRkRDQU4gaGFuZGxlLgorICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIEZEQ0FOIGludGVycnVwdC4KKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiBAYXJnIEZEQ0FOX0ludGVycnVwdHMKKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX0ZEQ0FOX0RJU0FCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgXAorICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SUUpICY9IH4oX19JTlRFUlJVUFRfXykKKworLyoqCisgKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBGRENBTiBpbnRlcnJ1cHQgaXMgc2V0IG9yIG5vdC4KKyAqIEBwYXJhbSAgX19IQU5ETEVfXyBGRENBTiBoYW5kbGUuCisgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gRkRDQU4gaW50ZXJydXB0LgorICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIEBhcmcgRkRDQU5fSW50ZXJydXB0cworICogQHJldHZhbCBJVFN0YXR1cworICovCisjZGVmaW5lIF9fSEFMX0ZEQ0FOX0dFVF9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSBcCisgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JUiAmIChfX0lOVEVSUlVQVF9fKSkKKworLyoqCisgKiBAYnJpZWYgIENsZWFyIHRoZSBzcGVjaWZpZWQgRkRDQU4gaW50ZXJydXB0cy4KKyAqIEBwYXJhbSAgX19IQU5ETEVfXyBGRENBTiBoYW5kbGUuCisgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBpbnRlcnJ1cHRzIHRvIGNsZWFyLgorICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIEBhcmcgRkRDQU5fSW50ZXJydXB0cworICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfRkRDQU5fQ0xFQVJfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgXAorICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVIpID0gKF9fSU5URVJSVVBUX18pCisKKy8qKgorICogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgRkRDQU4gZmxhZyBpcyBzZXQgb3Igbm90LgorICogQHBhcmFtICBfX0hBTkRMRV9fIEZEQ0FOIGhhbmRsZS4KKyAqIEBwYXJhbSAgX19GTEFHX18gRkRDQU4gZmxhZy4KKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiBAYXJnIEZEQ0FOX2ZsYWdzCisgKiBAcmV0dmFsIEZsYWdTdGF0dXMKKyAqLworI2RlZmluZSBfX0hBTF9GRENBTl9HRVRfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgXAorICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVIgJiAoX19GTEFHX18pKQorCisvKioKKyAqIEBicmllZiAgQ2xlYXIgdGhlIHNwZWNpZmllZCBGRENBTiBmbGFncy4KKyAqIEBwYXJhbSAgX19IQU5ETEVfXyBGRENBTiBoYW5kbGUuCisgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgZmxhZ3MgdG8gY2xlYXIuCisgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgQGFyZyBGRENBTl9mbGFncworICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfRkRDQU5fQ0xFQVJfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgXAorICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVIpID0gKF9fRkxBR19fKQorCisvKiogQGJyaWVmICBDaGVjayBpZiB0aGUgc3BlY2lmaWVkIEZEQ0FOIGludGVycnVwdCBzb3VyY2UgaXMgZW5hYmxlZCBvcgorICogZGlzYWJsZWQuCisgKiBAcGFyYW0gIF9fSEFORExFX18gRkRDQU4gaGFuZGxlLgorICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgRkRDQU4gaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjay4KKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQGFyZyBGRENBTl9JbnRlcnJ1cHRzCisgKiBAcmV0dmFsIElUU3RhdHVzCisgKi8KKyNkZWZpbmUgX19IQUxfRkRDQU5fR0VUX0lUX1NPVVJDRShfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSBcCisgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JRSAmIChfX0lOVEVSUlVQVF9fKSkKKworLyoqCisgKiBAfQorICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgRkRDQU5fRXhwb3J0ZWRfRnVuY3Rpb25zCisgKiBAeworICovCisKKy8qKiBAYWRkdG9ncm91cCBGRENBTl9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxCisgKiBAeworICovCisvKiBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX0luaXQoRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9EZUluaXQoRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuKTsKK3ZvaWQgSEFMX0ZEQ0FOX01zcEluaXQoRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuKTsKK3ZvaWQgSEFMX0ZEQ0FOX01zcERlSW5pdChGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX0VudGVyUG93ZXJEb3duTW9kZShGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX0V4aXRQb3dlckRvd25Nb2RlKEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbik7CisKKyNpZiBVU0VfSEFMX0ZEQ0FOX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxCisvKiBDYWxsYmFja3MgUmVnaXN0ZXIvVW5SZWdpc3RlciBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX1JlZ2lzdGVyQ2FsbGJhY2soCisgICAgRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLCBIQUxfRkRDQU5fQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwKKyAgICBwRkRDQU5fQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjayk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fVW5SZWdpc3RlckNhbGxiYWNrKAorICAgIEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwgSEFMX0ZEQ0FOX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX1JlZ2lzdGVyVHhFdmVudEZpZm9DYWxsYmFjaygKKyAgICBGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4sIHBGRENBTl9UeEV2ZW50Rmlmb0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX1VuUmVnaXN0ZXJUeEV2ZW50Rmlmb0NhbGxiYWNrKAorICAgIEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbik7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fUmVnaXN0ZXJSeEZpZm8wQ2FsbGJhY2soCisgICAgRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLCBwRkRDQU5fUnhGaWZvMENhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX1VuUmVnaXN0ZXJSeEZpZm8wQ2FsbGJhY2soCisgICAgRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9SZWdpc3RlclJ4RmlmbzFDYWxsYmFjaygKKyAgICBGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4sIHBGRENBTl9SeEZpZm8xQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjayk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fVW5SZWdpc3RlclJ4RmlmbzFDYWxsYmFjaygKKyAgICBGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX1JlZ2lzdGVyVHhCdWZmZXJDb21wbGV0ZUNhbGxiYWNrKAorICAgIEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwKKyAgICBwRkRDQU5fVHhCdWZmZXJDb21wbGV0ZUNhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX1VuUmVnaXN0ZXJUeEJ1ZmZlckNvbXBsZXRlQ2FsbGJhY2soCisgICAgRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9SZWdpc3RlclR4QnVmZmVyQWJvcnRDYWxsYmFjaygKKyAgICBGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4sIHBGRENBTl9UeEJ1ZmZlckFib3J0Q2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjayk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fVW5SZWdpc3RlclR4QnVmZmVyQWJvcnRDYWxsYmFjaygKKyAgICBGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX1JlZ2lzdGVyRXJyb3JTdGF0dXNDYWxsYmFjaygKKyAgICBGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4sIHBGRENBTl9FcnJvclN0YXR1c0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX1VuUmVnaXN0ZXJFcnJvclN0YXR1c0NhbGxiYWNrKAorICAgIEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbik7CisjZW5kaWYgLyogVVNFX0hBTF9GRENBTl9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGFkZHRvZ3JvdXAgRkRDQU5fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMgorICogQHsKKyAqLworLyogQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9Db25maWdGaWx0ZXIoCisgICAgRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLCBjb25zdCBGRENBTl9GaWx0ZXJUeXBlRGVmICpzRmlsdGVyQ29uZmlnKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9Db25maWdHbG9iYWxGaWx0ZXIoRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBOb25NYXRjaGluZ1N0ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgTm9uTWF0Y2hpbmdFeHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFJlamVjdFJlbW90ZVN0ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUmVqZWN0UmVtb3RlRXh0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9Db25maWdFeHRlbmRlZElkTWFzayhGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgTWFzayk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fQ29uZmlnUnhGaWZvT3ZlcndyaXRlKEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUnhGaWZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBPcGVyYXRpb25Nb2RlKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9Db25maWdSYW1XYXRjaGRvZyhGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ291bnRlclN0YXJ0VmFsdWUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX0NvbmZpZ1RpbWVzdGFtcENvdW50ZXIoRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZXN0YW1wUHJlc2NhbGVyKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9FbmFibGVUaW1lc3RhbXBDb3VudGVyKEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVzdGFtcE9wZXJhdGlvbik7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fRGlzYWJsZVRpbWVzdGFtcENvdW50ZXIoCisgICAgRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuKTsKK3VpbnQxNl90IEhBTF9GRENBTl9HZXRUaW1lc3RhbXBDb3VudGVyKGNvbnN0IEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbik7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fUmVzZXRUaW1lc3RhbXBDb3VudGVyKEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbik7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fQ29uZmlnVGltZW91dENvdW50ZXIoRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVvdXRPcGVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZW91dFBlcmlvZCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fRW5hYmxlVGltZW91dENvdW50ZXIoRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9EaXNhYmxlVGltZW91dENvdW50ZXIoRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuKTsKK3VpbnQxNl90IEhBTF9GRENBTl9HZXRUaW1lb3V0Q291bnRlcihjb25zdCBGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX1Jlc2V0VGltZW91dENvdW50ZXIoRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9Db25maWdUeERlbGF5Q29tcGVuc2F0aW9uKAorICAgIEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwgdWludDMyX3QgVGRjT2Zmc2V0LCB1aW50MzJfdCBUZGNGaWx0ZXIpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX0VuYWJsZVR4RGVsYXlDb21wZW5zYXRpb24oCisgICAgRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9EaXNhYmxlVHhEZWxheUNvbXBlbnNhdGlvbigKKyAgICBGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX0VuYWJsZUlTT01vZGUoRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9EaXNhYmxlSVNPTW9kZShGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX0VuYWJsZUVkZ2VGaWx0ZXJpbmcoRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9EaXNhYmxlRWRnZUZpbHRlcmluZyhGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pOworLyoqCisgKiBAfQorICovCisKKy8qKiBAYWRkdG9ncm91cCBGRENBTl9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzCisgKiBAeworICovCisvKiBDb250cm9sIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX1N0YXJ0KEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbik7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fU3RvcChGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX0FkZE1lc3NhZ2VUb1R4Rmlmb1EoCisgICAgRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLCBjb25zdCBGRENBTl9UeEhlYWRlclR5cGVEZWYgKnBUeEhlYWRlciwKKyAgICBjb25zdCB1aW50OF90ICpwVHhEYXRhKTsKK3VpbnQzMl90IEhBTF9GRENBTl9HZXRMYXRlc3RUeEZpZm9RUmVxdWVzdEJ1ZmZlcigKKyAgICBjb25zdCBGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX0Fib3J0VHhSZXF1ZXN0KEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBCdWZmZXJJbmRleCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fR2V0UnhNZXNzYWdlKEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUnhMb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRDQU5fUnhIZWFkZXJUeXBlRGVmICpwUnhIZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBSeERhdGEpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX0dldFR4RXZlbnQoRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRDQU5fVHhFdmVudEZpZm9UeXBlRGVmICpwVHhFdmVudCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fR2V0SGlnaFByaW9yaXR5TWVzc2FnZVN0YXR1cygKKyAgICBjb25zdCBGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4sIEZEQ0FOX0hwTXNnU3RhdHVzVHlwZURlZiAqSHBNc2dTdGF0dXMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX0dldFByb3RvY29sU3RhdHVzKAorICAgIGNvbnN0IEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwKKyAgICBGRENBTl9Qcm90b2NvbFN0YXR1c1R5cGVEZWYgKlByb3RvY29sU3RhdHVzKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9HZXRFcnJvckNvdW50ZXJzKAorICAgIGNvbnN0IEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwKKyAgICBGRENBTl9FcnJvckNvdW50ZXJzVHlwZURlZiAqRXJyb3JDb3VudGVycyk7Cit1aW50MzJfdCBIQUxfRkRDQU5fSXNUeEJ1ZmZlck1lc3NhZ2VQZW5kaW5nKGNvbnN0IEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVHhCdWZmZXJJbmRleCk7Cit1aW50MzJfdCBIQUxfRkRDQU5fR2V0UnhGaWZvRmlsbExldmVsKGNvbnN0IEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUnhGaWZvKTsKK3VpbnQzMl90IEhBTF9GRENBTl9HZXRUeEZpZm9GcmVlTGV2ZWwoY29uc3QgRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuKTsKK3VpbnQzMl90IEhBTF9GRENBTl9Jc1Jlc3RyaWN0ZWRPcGVyYXRpb25Nb2RlKGNvbnN0IEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbik7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fRXhpdFJlc3RyaWN0ZWRPcGVyYXRpb25Nb2RlKAorICAgIEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbik7CisvKioKKyAqIEB9CisgKi8KKworLyoqIEBhZGR0b2dyb3VwIEZEQ0FOX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQKKyAqIEB7CisgKi8KKy8qIEludGVycnVwdHMgbWFuYWdlbWVudCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fQ29uZmlnSW50ZXJydXB0TGluZXMoRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IElUTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBJbnRlcnJ1cHRMaW5lKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9BY3RpdmF0ZU5vdGlmaWNhdGlvbihGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQWN0aXZlSVRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEJ1ZmZlckluZGV4ZXMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX0RlYWN0aXZhdGVOb3RpZmljYXRpb24oRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgSW5hY3RpdmVJVHMpOwordm9pZCBIQUxfRkRDQU5fSVJRSGFuZGxlcihGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pOworLyoqCisgKiBAfQorICovCisKKy8qKiBAYWRkdG9ncm91cCBGRENBTl9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA1CisgKiBAeworICovCisvKiBDYWxsYmFjayBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBIQUxfRkRDQU5fVHhFdmVudEZpZm9DYWxsYmFjayhGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFR4RXZlbnRGaWZvSVRzKTsKK3ZvaWQgSEFMX0ZEQ0FOX1J4RmlmbzBDYWxsYmFjayhGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUnhGaWZvMElUcyk7Cit2b2lkIEhBTF9GRENBTl9SeEZpZm8xQ2FsbGJhY2soRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFJ4RmlmbzFJVHMpOwordm9pZCBIQUxfRkRDQU5fVHhGaWZvRW1wdHlDYWxsYmFjayhGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pOwordm9pZCBIQUxfRkRDQU5fVHhCdWZmZXJDb21wbGV0ZUNhbGxiYWNrKEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBCdWZmZXJJbmRleGVzKTsKK3ZvaWQgSEFMX0ZEQ0FOX1R4QnVmZmVyQWJvcnRDYWxsYmFjayhGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQnVmZmVySW5kZXhlcyk7Cit2b2lkIEhBTF9GRENBTl9IaWdoUHJpb3JpdHlNZXNzYWdlQ2FsbGJhY2soRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuKTsKK3ZvaWQgSEFMX0ZEQ0FOX1RpbWVzdGFtcFdyYXBhcm91bmRDYWxsYmFjayhGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pOwordm9pZCBIQUxfRkRDQU5fVGltZW91dE9jY3VycmVkQ2FsbGJhY2soRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuKTsKK3ZvaWQgSEFMX0ZEQ0FOX0Vycm9yQ2FsbGJhY2soRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuKTsKK3ZvaWQgSEFMX0ZEQ0FOX0Vycm9yU3RhdHVzQ2FsbGJhY2soRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBFcnJvclN0YXR1c0lUcyk7CisvKioKKyAqIEB9CisgKi8KKworLyoqIEBhZGR0b2dyb3VwIEZEQ0FOX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDYKKyAqIEB7CisgKi8KKy8qIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBIQUxfRkRDQU5fR2V0RXJyb3IoY29uc3QgRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuKTsKK0hBTF9GRENBTl9TdGF0ZVR5cGVEZWYgSEFMX0ZEQ0FOX0dldFN0YXRlKGNvbnN0IEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbik7CisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBGRENBTl9Qcml2YXRlX1ZhcmlhYmxlcyBGRENBTiBQcml2YXRlIFZhcmlhYmxlcworICogQHsKKyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRkRDQU5fUHJpdmF0ZV9Db25zdGFudHMgRkRDQU4gUHJpdmF0ZSBDb25zdGFudHMKKyAqIEB7CisgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEZEQ0FOX1ByaXZhdGVfTWFjcm9zIEZEQ0FOIFByaXZhdGUgTWFjcm9zCisgKiBAeworICovCisjZGVmaW5lIElTX0ZEQ0FOX0ZSQU1FX0ZPUk1BVChGT1JNQVQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKChGT1JNQVQpID09IEZEQ0FOX0ZSQU1FX0NMQVNTSUMpIHx8ICgoRk9STUFUKSA9PSBGRENBTl9GUkFNRV9GRF9OT19CUlMpIHx8IFwKKyAgICgoRk9STUFUKSA9PSBGRENBTl9GUkFNRV9GRF9CUlMpKQorI2RlZmluZSBJU19GRENBTl9NT0RFKE1PREUpICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKE1PREUpID09IEZEQ0FOX01PREVfTk9STUFMKSB8fCAgICAgICAgICAgICAgIFwKKyAgICgoTU9ERSkgPT0gRkRDQU5fTU9ERV9SRVNUUklDVEVEX09QRVJBVElPTikgfHwgXAorICAgKChNT0RFKSA9PSBGRENBTl9NT0RFX0JVU19NT05JVE9SSU5HKSB8fCAgICAgICBcCisgICAoKE1PREUpID09IEZEQ0FOX01PREVfSU5URVJOQUxfTE9PUEJBQ0spIHx8ICAgIFwKKyAgICgoTU9ERSkgPT0gRkRDQU5fTU9ERV9FWFRFUk5BTF9MT09QQkFDSykpCisjZGVmaW5lIElTX0ZEQ0FOX0NLRElWKENLRElWKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoQ0tESVYpID09IEZEQ0FOX0NMT0NLX0RJVjEpIHx8ICgoQ0tESVYpID09IEZEQ0FOX0NMT0NLX0RJVjIpIHx8ICAgXAorICAgKChDS0RJVikgPT0gRkRDQU5fQ0xPQ0tfRElWNCkgfHwgKChDS0RJVikgPT0gRkRDQU5fQ0xPQ0tfRElWNikgfHwgICBcCisgICAoKENLRElWKSA9PSBGRENBTl9DTE9DS19ESVY4KSB8fCAoKENLRElWKSA9PSBGRENBTl9DTE9DS19ESVYxMCkgfHwgIFwKKyAgICgoQ0tESVYpID09IEZEQ0FOX0NMT0NLX0RJVjEyKSB8fCAoKENLRElWKSA9PSBGRENBTl9DTE9DS19ESVYxNCkgfHwgXAorICAgKChDS0RJVikgPT0gRkRDQU5fQ0xPQ0tfRElWMTYpIHx8ICgoQ0tESVYpID09IEZEQ0FOX0NMT0NLX0RJVjE4KSB8fCBcCisgICAoKENLRElWKSA9PSBGRENBTl9DTE9DS19ESVYyMCkgfHwgKChDS0RJVikgPT0gRkRDQU5fQ0xPQ0tfRElWMjIpIHx8IFwKKyAgICgoQ0tESVYpID09IEZEQ0FOX0NMT0NLX0RJVjI0KSB8fCAoKENLRElWKSA9PSBGRENBTl9DTE9DS19ESVYyNikgfHwgXAorICAgKChDS0RJVikgPT0gRkRDQU5fQ0xPQ0tfRElWMjgpIHx8ICgoQ0tESVYpID09IEZEQ0FOX0NMT0NLX0RJVjMwKSkKKyNkZWZpbmUgSVNfRkRDQU5fTk9NSU5BTF9QUkVTQ0FMRVIoUFJFU0NBTEVSKSBcCisgICgoKFBSRVNDQUxFUikgPj0gMVUpICYmICgoUFJFU0NBTEVSKSA8PSA1MTJVKSkKKyNkZWZpbmUgSVNfRkRDQU5fTk9NSU5BTF9TSlcoU0pXKSAoKChTSlcpID49IDFVKSAmJiAoKFNKVykgPD0gMTI4VSkpCisjZGVmaW5lIElTX0ZEQ0FOX05PTUlOQUxfVFNFRzEoVFNFRzEpICgoKFRTRUcxKSA+PSAxVSkgJiYgKChUU0VHMSkgPD0gMjU2VSkpCisjZGVmaW5lIElTX0ZEQ0FOX05PTUlOQUxfVFNFRzIoVFNFRzIpICgoKFRTRUcyKSA+PSAxVSkgJiYgKChUU0VHMikgPD0gMTI4VSkpCisjZGVmaW5lIElTX0ZEQ0FOX0RBVEFfUFJFU0NBTEVSKFBSRVNDQUxFUikgXAorICAoKChQUkVTQ0FMRVIpID49IDFVKSAmJiAoKFBSRVNDQUxFUikgPD0gMzJVKSkKKyNkZWZpbmUgSVNfRkRDQU5fREFUQV9TSlcoU0pXKSAoKChTSlcpID49IDFVKSAmJiAoKFNKVykgPD0gMTZVKSkKKyNkZWZpbmUgSVNfRkRDQU5fREFUQV9UU0VHMShUU0VHMSkgKCgoVFNFRzEpID49IDFVKSAmJiAoKFRTRUcxKSA8PSAzMlUpKQorI2RlZmluZSBJU19GRENBTl9EQVRBX1RTRUcyKFRTRUcyKSAoKChUU0VHMikgPj0gMVUpICYmICgoVFNFRzIpIDw9IDE2VSkpCisjZGVmaW5lIElTX0ZEQ0FOX01BWF9WQUxVRShWQUxVRSwgX01BWF8pICgoVkFMVUUpIDw9IChfTUFYXykpCisjZGVmaW5lIElTX0ZEQ0FOX01JTl9WQUxVRShWQUxVRSwgX01JTl8pICgoVkFMVUUpID49IChfTUlOXykpCisjZGVmaW5lIElTX0ZEQ0FOX1RYX0ZJRk9fUVVFVUVfTU9ERShNT0RFKSBcCisgICgoKE1PREUpID09IEZEQ0FOX1RYX0ZJRk9fT1BFUkFUSU9OKSB8fCAoKE1PREUpID09IEZEQ0FOX1RYX1FVRVVFX09QRVJBVElPTikpCisjZGVmaW5lIElTX0ZEQ0FOX0lEX1RZUEUoSURfVFlQRSkgXAorICAoKChJRF9UWVBFKSA9PSBGRENBTl9TVEFOREFSRF9JRCkgfHwgKChJRF9UWVBFKSA9PSBGRENBTl9FWFRFTkRFRF9JRCkpCisjZGVmaW5lIElTX0ZEQ0FOX0ZJTFRFUl9DRkcoQ09ORklHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKChDT05GSUcpID09IEZEQ0FOX0ZJTFRFUl9ESVNBQkxFKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoQ09ORklHKSA9PSBGRENBTl9GSUxURVJfVE9fUlhGSUZPMCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKENPTkZJRykgPT0gRkRDQU5fRklMVEVSX1RPX1JYRklGTzEpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKChDT05GSUcpID09IEZEQ0FOX0ZJTFRFUl9SRUpFQ1QpIHx8ICgoQ09ORklHKSA9PSBGRENBTl9GSUxURVJfSFApIHx8IFwKKyAgICgoQ09ORklHKSA9PSBGRENBTl9GSUxURVJfVE9fUlhGSUZPMF9IUCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKENPTkZJRykgPT0gRkRDQU5fRklMVEVSX1RPX1JYRklGTzFfSFApKQorI2RlZmluZSBJU19GRENBTl9UWF9MT0NBVElPTihMT0NBVElPTikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKChMT0NBVElPTikgPT0gRkRDQU5fVFhfQlVGRkVSMCkgfHwgKChMT0NBVElPTikgPT0gRkRDQU5fVFhfQlVGRkVSMSkgfHwgXAorICAgKChMT0NBVElPTikgPT0gRkRDQU5fVFhfQlVGRkVSMikpCisjZGVmaW5lIElTX0ZEQ0FOX1RYX0xPQ0FUSU9OX0xJU1QoTE9DQVRJT04pIFwKKyAgKCgoTE9DQVRJT04pID49IEZEQ0FOX1RYX0JVRkZFUjApICYmICAgICAgXAorICAgKChMT0NBVElPTikgPD0gKEZEQ0FOX1RYX0JVRkZFUjAgfCBGRENBTl9UWF9CVUZGRVIxIHwgRkRDQU5fVFhfQlVGRkVSMikpKQorI2RlZmluZSBJU19GRENBTl9SWF9GSUZPKEZJRk8pIFwKKyAgKCgoRklGTykgPT0gRkRDQU5fUlhfRklGTzApIHx8ICgoRklGTykgPT0gRkRDQU5fUlhfRklGTzEpKQorI2RlZmluZSBJU19GRENBTl9SWF9GSUZPX01PREUoTU9ERSkgXAorICAoKChNT0RFKSA9PSBGRENBTl9SWF9GSUZPX0JMT0NLSU5HKSB8fCAoKE1PREUpID09IEZEQ0FOX1JYX0ZJRk9fT1ZFUldSSVRFKSkKKyNkZWZpbmUgSVNfRkRDQU5fU1REX0ZJTFRFUl9UWVBFKFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKFRZUEUpID09IEZEQ0FOX0ZJTFRFUl9SQU5HRSkgfHwgKChUWVBFKSA9PSBGRENBTl9GSUxURVJfRFVBTCkgfHwgXAorICAgKChUWVBFKSA9PSBGRENBTl9GSUxURVJfTUFTSykpCisjZGVmaW5lIElTX0ZEQ0FOX0VYVF9GSUxURVJfVFlQRShUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKChUWVBFKSA9PSBGRENBTl9GSUxURVJfUkFOR0UpIHx8ICgoVFlQRSkgPT0gRkRDQU5fRklMVEVSX0RVQUwpIHx8IFwKKyAgICgoVFlQRSkgPT0gRkRDQU5fRklMVEVSX01BU0spIHx8ICgoVFlQRSkgPT0gRkRDQU5fRklMVEVSX1JBTkdFX05PX0VJRE0pKQorI2RlZmluZSBJU19GRENBTl9GUkFNRV9UWVBFKFRZUEUpIFwKKyAgKCgoVFlQRSkgPT0gRkRDQU5fREFUQV9GUkFNRSkgfHwgKChUWVBFKSA9PSBGRENBTl9SRU1PVEVfRlJBTUUpKQorI2RlZmluZSBJU19GRENBTl9ETEMoRExDKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKChETEMpID09IEZEQ0FOX0RMQ19CWVRFU18wKSB8fCAoKERMQykgPT0gRkRDQU5fRExDX0JZVEVTXzEpIHx8ICAgXAorICAgKChETEMpID09IEZEQ0FOX0RMQ19CWVRFU18yKSB8fCAoKERMQykgPT0gRkRDQU5fRExDX0JZVEVTXzMpIHx8ICAgXAorICAgKChETEMpID09IEZEQ0FOX0RMQ19CWVRFU180KSB8fCAoKERMQykgPT0gRkRDQU5fRExDX0JZVEVTXzUpIHx8ICAgXAorICAgKChETEMpID09IEZEQ0FOX0RMQ19CWVRFU182KSB8fCAoKERMQykgPT0gRkRDQU5fRExDX0JZVEVTXzcpIHx8ICAgXAorICAgKChETEMpID09IEZEQ0FOX0RMQ19CWVRFU184KSB8fCAoKERMQykgPT0gRkRDQU5fRExDX0JZVEVTXzEyKSB8fCAgXAorICAgKChETEMpID09IEZEQ0FOX0RMQ19CWVRFU18xNikgfHwgKChETEMpID09IEZEQ0FOX0RMQ19CWVRFU18yMCkgfHwgXAorICAgKChETEMpID09IEZEQ0FOX0RMQ19CWVRFU18yNCkgfHwgKChETEMpID09IEZEQ0FOX0RMQ19CWVRFU18zMikgfHwgXAorICAgKChETEMpID09IEZEQ0FOX0RMQ19CWVRFU180OCkgfHwgKChETEMpID09IEZEQ0FOX0RMQ19CWVRFU182NCkpCisjZGVmaW5lIElTX0ZEQ0FOX0VTSShFU0kpIFwKKyAgKCgoRVNJKSA9PSBGRENBTl9FU0lfQUNUSVZFKSB8fCAoKEVTSSkgPT0gRkRDQU5fRVNJX1BBU1NJVkUpKQorI2RlZmluZSBJU19GRENBTl9CUlMoQlJTKSAoKChCUlMpID09IEZEQ0FOX0JSU19PRkYpIHx8ICgoQlJTKSA9PSBGRENBTl9CUlNfT04pKQorI2RlZmluZSBJU19GRENBTl9GREYoRkRGKSBcCisgICgoKEZERikgPT0gRkRDQU5fQ0xBU1NJQ19DQU4pIHx8ICgoRkRGKSA9PSBGRENBTl9GRF9DQU4pKQorI2RlZmluZSBJU19GRENBTl9FRkMoRUZDKSBcCisgICgoKEVGQykgPT0gRkRDQU5fTk9fVFhfRVZFTlRTKSB8fCAoKEVGQykgPT0gRkRDQU5fU1RPUkVfVFhfRVZFTlRTKSkKKyNkZWZpbmUgSVNfRkRDQU5fSVQoSVQpICgoKElUKSAmIH4oRkRDQU5fSVJfTUFTSykpID09IDBVKQorI2RlZmluZSBJU19GRENBTl9JVF9HUk9VUChJVF9HUk9VUCkgKCgoSVRfR1JPVVApICYgfihGRENBTl9JTFNfTUFTSykpID09IDBVKQorI2RlZmluZSBJU19GRENBTl9OT05fTUFUQ0hJTkcoREVTVElOQVRJT04pICAgICAgICBcCisgICgoKERFU1RJTkFUSU9OKSA9PSBGRENBTl9BQ0NFUFRfSU5fUlhfRklGTzApIHx8IFwKKyAgICgoREVTVElOQVRJT04pID09IEZEQ0FOX0FDQ0VQVF9JTl9SWF9GSUZPMSkgfHwgXAorICAgKChERVNUSU5BVElPTikgPT0gRkRDQU5fUkVKRUNUKSkKKyNkZWZpbmUgSVNfRkRDQU5fUkVKRUNUX1JFTU9URShERVNUSU5BVElPTikgIFwKKyAgKCgoREVTVElOQVRJT04pID09IEZEQ0FOX0ZJTFRFUl9SRU1PVEUpIHx8IFwKKyAgICgoREVTVElOQVRJT04pID09IEZEQ0FOX1JFSkVDVF9SRU1PVEUpKQorI2RlZmluZSBJU19GRENBTl9JVF9MSU5FKElUX0xJTkUpIFwKKyAgKCgoSVRfTElORSkgPT0gRkRDQU5fSU5URVJSVVBUX0xJTkUwKSB8fCAoKElUX0xJTkUpID09IEZEQ0FOX0lOVEVSUlVQVF9MSU5FMSkpCisjZGVmaW5lIElTX0ZEQ0FOX1RJTUVTVEFNUChPUEVSQVRJT04pICAgICAgICAgICBcCisgICgoKE9QRVJBVElPTikgPT0gRkRDQU5fVElNRVNUQU1QX0lOVEVSTkFMKSB8fCBcCisgICAoKE9QRVJBVElPTikgPT0gRkRDQU5fVElNRVNUQU1QX0VYVEVSTkFMKSkKKyNkZWZpbmUgSVNfRkRDQU5fVElNRVNUQU1QX1BSRVNDQUxFUihQUkVTQ0FMRVIpIFwKKyAgKCgoUFJFU0NBTEVSKSA9PSBGRENBTl9USU1FU1RBTVBfUFJFU0NfMSkgfHwgIFwKKyAgICgoUFJFU0NBTEVSKSA9PSBGRENBTl9USU1FU1RBTVBfUFJFU0NfMikgfHwgIFwKKyAgICgoUFJFU0NBTEVSKSA9PSBGRENBTl9USU1FU1RBTVBfUFJFU0NfMykgfHwgIFwKKyAgICgoUFJFU0NBTEVSKSA9PSBGRENBTl9USU1FU1RBTVBfUFJFU0NfNCkgfHwgIFwKKyAgICgoUFJFU0NBTEVSKSA9PSBGRENBTl9USU1FU1RBTVBfUFJFU0NfNSkgfHwgIFwKKyAgICgoUFJFU0NBTEVSKSA9PSBGRENBTl9USU1FU1RBTVBfUFJFU0NfNikgfHwgIFwKKyAgICgoUFJFU0NBTEVSKSA9PSBGRENBTl9USU1FU1RBTVBfUFJFU0NfNykgfHwgIFwKKyAgICgoUFJFU0NBTEVSKSA9PSBGRENBTl9USU1FU1RBTVBfUFJFU0NfOCkgfHwgIFwKKyAgICgoUFJFU0NBTEVSKSA9PSBGRENBTl9USU1FU1RBTVBfUFJFU0NfOSkgfHwgIFwKKyAgICgoUFJFU0NBTEVSKSA9PSBGRENBTl9USU1FU1RBTVBfUFJFU0NfMTApIHx8IFwKKyAgICgoUFJFU0NBTEVSKSA9PSBGRENBTl9USU1FU1RBTVBfUFJFU0NfMTEpIHx8IFwKKyAgICgoUFJFU0NBTEVSKSA9PSBGRENBTl9USU1FU1RBTVBfUFJFU0NfMTIpIHx8IFwKKyAgICgoUFJFU0NBTEVSKSA9PSBGRENBTl9USU1FU1RBTVBfUFJFU0NfMTMpIHx8IFwKKyAgICgoUFJFU0NBTEVSKSA9PSBGRENBTl9USU1FU1RBTVBfUFJFU0NfMTQpIHx8IFwKKyAgICgoUFJFU0NBTEVSKSA9PSBGRENBTl9USU1FU1RBTVBfUFJFU0NfMTUpIHx8IFwKKyAgICgoUFJFU0NBTEVSKSA9PSBGRENBTl9USU1FU1RBTVBfUFJFU0NfMTYpKQorI2RlZmluZSBJU19GRENBTl9USU1FT1VUKE9QRVJBVElPTikgICAgICAgICAgICAgICAgXAorICAoKChPUEVSQVRJT04pID09IEZEQ0FOX1RJTUVPVVRfQ09OVElOVU9VUykgfHwgICAgXAorICAgKChPUEVSQVRJT04pID09IEZEQ0FOX1RJTUVPVVRfVFhfRVZFTlRfRklGTykgfHwgXAorICAgKChPUEVSQVRJT04pID09IEZEQ0FOX1RJTUVPVVRfUlhfRklGTzApIHx8ICAgICAgXAorICAgKChPUEVSQVRJT04pID09IEZEQ0FOX1RJTUVPVVRfUlhfRklGTzEpKQorCisjZGVmaW5lIEZEQ0FOX0NIRUNLX0lUX1NPVVJDRShfX0lFX18sIF9fSVRfXykgXAorICAoKCgoX19JRV9fKSAmIChfX0lUX18pKSA9PSAoX19JVF9fKSkgPyBTRVQgOiBSRVNFVCkKKworI2RlZmluZSBGRENBTl9DSEVDS19GTEFHKF9fSVJfXywgX19GTEFHX18pIFwKKyAgKCgoKF9fSVJfXykgJiAoX19GTEFHX18pKSA9PSAoX19GTEFHX18pKSA/IFNFVCA6IFJFU0VUKQorLyoqCisgKiBAfQorICovCisKKy8qIFByaXZhdGUgZnVuY3Rpb25zIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCisjZW5kaWYgLyogRkRDQU4xICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMkc0eHhfSEFMX0ZEQ0FOX0ggKi8KZGlmZiAtLWdpdCBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9JbmMvc3RtMzJnNHh4X2hhbF9mbGFzaC5oIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfaGFsX2ZsYXNoLmgKaW5kZXggZDVkNjRjNC4uNGY1ZDdlMyAxMDA2NDQKLS0tIGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfaGFsX2ZsYXNoLmgKKysrIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfaGFsX2ZsYXNoLmgKQEAgLTEsMTIxNyArMSwxMjE3IEBACi0vKioNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQGZpbGUgICAgc3RtMzJnNHh4X2hhbF9mbGFzaC5oDQotICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0NCi0gKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBGTEFTSCBIQUwgbW9kdWxlLg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBAYXR0ZW50aW9uDQotICoNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQotICoNCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRlcm1zIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUNCi0gKmluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4gSWYgbm8gTElDRU5TRSBmaWxlIGNvbWVzDQotICp3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKi8NCi0NCi0vKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpZm5kZWYgU1RNMzJHNHh4X0hBTF9GTEFTSF9IDQotI2RlZmluZSBTVE0zMkc0eHhfSEFMX0ZMQVNIX0gNCi0NCi0jaWZkZWYgX19jcGx1c3BsdXMNCi1leHRlcm4gIkMiIHsNCi0jZW5kaWYNCi0NCi0vKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpbmNsdWRlICJzdG0zMmc0eHhfaGFsX2RlZi5oIg0KLQ0KLS8qKiBAYWRkdG9ncm91cCBTVE0zMkc0eHhfSEFMX0RyaXZlcg0KLSAqIEB7DQotICovDQotDQotLyoqIEBhZGR0b2dyb3VwIEZMQVNIDQotICogQHsNCi0gKi8NCi0NCi0vKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgRkxBU0hfRXhwb3J0ZWRfVHlwZXMgRkxBU0ggRXhwb3J0ZWQgVHlwZXMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRkxBU0ggRXJhc2Ugc3RydWN0dXJlIGRlZmluaXRpb24NCi0gKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICB1aW50MzJfdA0KLSAgICAgIFR5cGVFcmFzZTsgIC8qITwgTWFzcyBlcmFzZSBvciBwYWdlIGVyYXNlLg0KLSAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBGTEFTSF9UeXBlX0VyYXNlICovDQotICB1aW50MzJfdCBCYW5rczsgLyohPCBTZWxlY3QgYmFuayB0byBlcmFzZS4NCi0gICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBvZiBAcmVmIEZMQVNIX0JhbmtzDQotICAgICAgICAgICAgICAgICAgICAgICAoRkxBU0hfQkFOS19CT1RIIHNob3VsZCBiZSB1c2VkIG9ubHkgZm9yIG1hc3MgZXJhc2UpICovDQotICB1aW50MzJfdCBQYWdlOyAgLyohPCBJbml0aWFsIEZsYXNoIHBhZ2UgdG8gZXJhc2Ugd2hlbiBwYWdlIGVyYXNlIGlzIGRpc2FibGVkLg0KLSAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMCBhbmQgKG1heCBudW1iZXINCi0gICAgICAgICAgICAgICAgICAgICBvZiBwYWdlcyBpbiB0aGUgYmFuayAtIDEpICAoZWcgOiAxMjcgZm9yIDUxMktCIGR1YWwgYmFuaykgKi8NCi0gIHVpbnQzMl90IE5iUGFnZXM7IC8qITwgTnVtYmVyIG9mIHBhZ2VzIHRvIGJlIGVyYXNlZC4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMSBhbmQgKG1heA0KLSAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyIG9mIHBhZ2VzIGluIHRoZSBiYW5rIC0gdmFsdWUgb2YgaW5pdGlhbCBwYWdlKSovDQotfSBGTEFTSF9FcmFzZUluaXRUeXBlRGVmOw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRkxBU0ggT3B0aW9uIEJ5dGVzIFByb2dyYW0gc3RydWN0dXJlIGRlZmluaXRpb24NCi0gKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICB1aW50MzJfdCBPcHRpb25UeXBlOyAvKiE8IE9wdGlvbiBieXRlIHRvIGJlIGNvbmZpZ3VyZWQuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSB2YWx1ZXMgb2YNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgRkxBU0hfT0JfVHlwZSAqLw0KLSAgdWludDMyX3QgV1JQQXJlYTsgICAgLyohPCBXcml0ZSBwcm90ZWN0aW9uIGFyZWEgdG8gYmUgcHJvZ3JhbW1lZCAodXNlZCBmb3INCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE9QVElPTkJZVEVfV1JQKS4gICAgT25seSBvbmUgV1JQIGFyZWEgY291bGQgYmUgcHJvZ3JhbW1lZA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgYXQgICAgdGhlIHNhbWUgdGltZS4gICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHZhbHVlIG9mDQotICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmICAgIEZMQVNIX09CX1dSUF9BcmVhICovDQotICB1aW50MzJfdA0KLSAgICAgIFdSUFN0YXJ0T2Zmc2V0OyAvKiE8IFdyaXRlIHByb3RlY3Rpb24gc3RhcnQgb2Zmc2V0ICh1c2VkIGZvcg0KLSAgICAgICAgICAgICAgICAgICAgICAgICBPUFRJT05CWVRFX1dSUCkuIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuDQotICAgICAgICAgICAgICAgICAgICAgICAgIDAgYW5kIChtYXggbnVtYmVyIG9mIHBhZ2VzIGluIHRoZSBiYW5rIC0gMSkgKi8NCi0gIHVpbnQzMl90DQotICAgICAgV1JQRW5kT2Zmc2V0OyAgLyohPCBXcml0ZSBwcm90ZWN0aW9uIGVuZCBvZmZzZXQgKHVzZWQgZm9yIE9QVElPTkJZVEVfV1JQKS4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIFdSUFN0YXJ0T2Zmc2V0DQotICAgICAgICAgICAgICAgICAgICAgICAgYW5kIChtYXggbnVtYmVyIG9mIHBhZ2VzIGluIHRoZSBiYW5rIC0gMSkgKi8NCi0gIHVpbnQzMl90IFJEUExldmVsOyAvKiE8IFNldCB0aGUgcmVhZCBwcm90ZWN0aW9uIGxldmVsLi4gKHVzZWQgZm9yDQotICAgICAgICAgICAgICAgICAgICAgICAgT1BUSU9OQllURV9SRFApLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgRkxBU0hfT0JfUmVhZF9Qcm90ZWN0aW9uICovDQotICB1aW50MzJfdCBVU0VSVHlwZTsgLyohPCBVc2VyIG9wdGlvbiBieXRlKHMpIHRvIGJlIGNvbmZpZ3VyZWQgKHVzZWQgZm9yDQotICAgICAgICAgICAgICAgICAgICAgICAgT1BUSU9OQllURV9VU0VSKS4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YNCi0gICAgICAgICAgICAgICAgICAgICAgICBAcmVmIEZMQVNIX09CX1VTRVJfVHlwZSAqLw0KLSAgdWludDMyX3QNCi0gICAgICBVU0VSQ29uZmlnOyAvKiE8IFZhbHVlIG9mIHRoZSB1c2VyIG9wdGlvbiBieXRlICh1c2VkIGZvciBPUFRJT05CWVRFX1VTRVIpLg0KLSAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgIEZMQVNIX09CX1VTRVJfQk9SX0xFVkVMLA0KLSAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBGTEFTSF9PQl9VU0VSX25SU1RfU1RPUCwgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgIEZMQVNIX09CX1VTRVJfblJTVF9TVEFOREJZLA0KLSAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBGTEFTSF9PQl9VU0VSX25SU1RfU0hVVERPV04sIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICBGTEFTSF9PQl9VU0VSX0lXREdfU1csDQotICAgICAgICAgICAgICAgICAgICAgICBAcmVmIEZMQVNIX09CX1VTRVJfSVdER19TVE9QLCBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgRkxBU0hfT0JfVVNFUl9JV0RHX1NUQU5EQlksDQotICAgICAgICAgICAgICAgICAgICAgICBAcmVmIEZMQVNIX09CX1VTRVJfV1dER19TVywgQHJlZiBGTEFTSF9PQl9VU0VSX0JGQjIgKCopLA0KLSAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBGTEFTSF9PQl9VU0VSX25CT09UMSwgQHJlZiBGTEFTSF9PQl9VU0VSX1NSQU1fUEUsDQotICAgICAgICAgICAgICAgICAgICAgICBAcmVmIEZMQVNIX09CX1VTRVJfQ0NNU1JBTV9SU1QNCi0gICAgICAgICAgICAgICAgICAgICAgIEBub3RlICgqKSBhdmFpbGFiaWxpdHkgZGVwZW5kcyBvbiBkZXZpY2VzICovDQotICB1aW50MzJfdA0KLSAgICAgIFBDUk9QQ29uZmlnOyAvKiE8IENvbmZpZ3VyYXRpb24gb2YgdGhlIFBDUk9QICh1c2VkIGZvciBPUFRJT05CWVRFX1BDUk9QKS4NCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgY29tYmluYXRpb24gb2YgQHJlZiBGTEFTSF9CYW5rcw0KLSAgICAgICAgICAgICAgICAgICAgICAoZXhjZXB0IEZMQVNIX0JBTktfQk9USCkgYW5kIEByZWYgRkxBU0hfT0JfUENST1BfUkRQICovDQotICB1aW50MzJfdA0KLSAgICAgIFBDUk9QU3RhcnRBZGRyOyAgICAgIC8qITwgUENST1AgU3RhcnQgYWRkcmVzcyAodXNlZCBmb3IgT1BUSU9OQllURV9QQ1JPUCkuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiBiZWdpbiBhbmQgZW5kDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgYmFuaw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gQmUgY2FyZWZ1bCBvZiB0aGUgYmFuayBzd2FwcGluZyBmb3IgdGhlIGFkZHJlc3MgKi8NCi0gIHVpbnQzMl90IFBDUk9QRW5kQWRkcjsgICAvKiE8IFBDUk9QIEVuZCBhZGRyZXNzICh1c2VkIGZvciBPUFRJT05CWVRFX1BDUk9QKS4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIFBDUk9QIFN0YXJ0DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyBhbmQgZW5kIG9mIGJhbmsgKi8NCi0gIHVpbnQzMl90IEJvb3RFbnRyeVBvaW50OyAvKiE8IFNldCB0aGUgQm9vdCBMb2NrICh1c2VkIGZvcg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QVElPTkJZVEVfQk9PVF9MT0NLKS4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGENCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBvZiBAcmVmIEZMQVNIX09CX0Jvb3RfTG9jayAqLw0KLSAgdWludDMyX3QgU2VjQmFuazsgLyohPCBCYW5rIG9mIHNlY3VyYWJsZSBtZW1vcnkgYXJlYSB0byBiZSBwcm9ncmFtbWVkICh1c2VkDQotICAgICAgICAgICAgICAgICAgICAgICBmb3IgT1BUSU9OQllURV9TRUMpLiBPbmx5IG9uZSBzZWN1cmFibGUgbWVtb3J5IGFyZWEgY291bGQNCi0gICAgICAgICAgICAgICAgICAgICAgIGJlIHByb2dyYW1tZWQgYXQgdGhlIHNhbWUgdGltZS4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IEZMQVNIX0JBTktfMTogU2VjdXJhYmxlIG1lbW9yeQ0KLSAgICAgICAgICAgICAgICAgICAgICAgYXJlYSB0byBiZSBwcm9ncmFtbWVkIGluIGJhbmsgMSBGTEFTSF9CQU5LXzI6IFNlY3VyYWJsZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5IGFyZWEgdG8gYmUgcHJvZ3JhbW1lZCBpbiBiYW5rIDIgKCopDQotICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlICgqKSBhdmFpbGFiaWxpdHkgZGVwZW5kcyBvbiBkZXZpY2VzICovDQotICB1aW50MzJfdCBTZWNTaXplOyAvKiE8IFNpemUgb2Ygc2VjdXJhYmxlIG1lbW9yeSBhcmVhIHRvIGJlIHByb2dyYW1tZWQgKHVzZWQNCi0gICAgICAgICAgICAgICAgICAgICAgIGZvciBPUFRJT05CWVRFX1NFQyksIGluIG51bWJlciBvZiBwYWdlcy4gU2VjdXJhYmxlIG1lbW9yeQ0KLSAgICAgICAgICAgICAgICAgICAgICAgYXJlYSBpcyBzdGFydGluZyBmcm9tIGZpcnN0IHBhZ2Ugb2YgdGhlIGJhbmsuIE9ubHkgb25lDQotICAgICAgICAgICAgICAgICAgICAgICBzZWN1cmFibGUgbWVtb3J5IGNvdWxkIGJlIHByb2dyYW1tZWQgYXQgdGhlIHNhbWUgdGltZS4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMCBhbmQgKG1heA0KLSAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyIG9mIHBhZ2VzIGluIHRoZSBiYW5rIC0gMSkgKi8NCi19IEZMQVNIX09CUHJvZ3JhbUluaXRUeXBlRGVmOw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRkxBU0ggUHJvY2VkdXJlIHN0cnVjdHVyZSBkZWZpbml0aW9uDQotICovDQotdHlwZWRlZiBlbnVtIHsNCi0gIEZMQVNIX1BST0NfTk9ORSA9IDAsDQotICBGTEFTSF9QUk9DX1BBR0VfRVJBU0UsDQotICBGTEFTSF9QUk9DX01BU1NfRVJBU0UsDQotICBGTEFTSF9QUk9DX1BST0dSQU0sDQotICBGTEFTSF9QUk9DX1BST0dSQU1fTEFTVA0KLX0gRkxBU0hfUHJvY2VkdXJlVHlwZURlZjsNCi0NCi0vKioNCi0gKiBAYnJpZWYgIEZMQVNIIENhY2hlIHN0cnVjdHVyZSBkZWZpbml0aW9uDQotICovDQotdHlwZWRlZiBlbnVtIHsNCi0gIEZMQVNIX0NBQ0hFX0RJU0FCTEVEID0gMCwNCi0gIEZMQVNIX0NBQ0hFX0lDQUNIRV9FTkFCTEVELA0KLSAgRkxBU0hfQ0FDSEVfRENBQ0hFX0VOQUJMRUQsDQotICBGTEFTSF9DQUNIRV9JQ0FDSEVfRENBQ0hFX0VOQUJMRUQNCi19IEZMQVNIX0NhY2hlVHlwZURlZjsNCi0NCi0vKioNCi0gKiBAYnJpZWYgIEZMQVNIIGhhbmRsZSBTdHJ1Y3R1cmUgZGVmaW5pdGlvbg0KLSAqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gIEhBTF9Mb2NrVHlwZURlZiBMb2NrOyAgICAvKiBGTEFTSCBsb2NraW5nIG9iamVjdCAqLw0KLSAgX19JTyB1aW50MzJfdCBFcnJvckNvZGU7IC8qIEZMQVNIIGVycm9yIGNvZGUgKi8NCi0gIF9fSU8gRkxBU0hfUHJvY2VkdXJlVHlwZURlZg0KLSAgICAgIFByb2NlZHVyZU9uR29pbmc7ICAvKiBJbnRlcm5hbCB2YXJpYWJsZSB0byBpbmRpY2F0ZSB3aGljaCBwcm9jZWR1cmUgaXMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25nb2luZyBvciBub3QgaW4gSVQgY29udGV4dCAqLw0KLSAgX19JTyB1aW50MzJfdCBBZGRyZXNzOyAvKiBJbnRlcm5hbCB2YXJpYWJsZSB0byBzYXZlIGFkZHJlc3Mgc2VsZWN0ZWQgZm9yDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyYW0gaW4gSVQgY29udGV4dCAqLw0KLSAgX19JTyB1aW50MzJfdCBCYW5rOyAvKiBJbnRlcm5hbCB2YXJpYWJsZSB0byBzYXZlIGN1cnJlbnQgYmFuayBzZWxlY3RlZCBkdXJpbmcNCi0gICAgICAgICAgICAgICAgICAgICAgICAgZXJhc2UgaW4gSVQgY29udGV4dCAqLw0KLSAgX19JTyB1aW50MzJfdCBQYWdlOyAvKiBJbnRlcm5hbCB2YXJpYWJsZSB0byBkZWZpbmUgdGhlIGN1cnJlbnQgcGFnZSB3aGljaCBpcw0KLSAgICAgICAgICAgICAgICAgICAgICAgICBlcmFzaW5nIGluIElUIGNvbnRleHQgKi8NCi0gIF9fSU8gdWludDMyX3QgTmJQYWdlc1RvRXJhc2U7IC8qIEludGVybmFsIHZhcmlhYmxlIHRvIHNhdmUgdGhlIHJlbWFpbmluZyBwYWdlcw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gZXJhc2UgaW4gSVQgY29udGV4dCAqLw0KLSAgX19JTyBGTEFTSF9DYWNoZVR5cGVEZWYNCi0gICAgICBDYWNoZVRvUmVhY3RpdmF0ZTsgLyogSW50ZXJuYWwgdmFyaWFibGUgdG8gaW5kaWNhdGUgd2hpY2ggY2FjaGVzIHNob3VsZCBiZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFjdGl2YXRlZCAqLw0KLX0gRkxBU0hfUHJvY2Vzc1R5cGVEZWY7DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgRkxBU0hfRXhwb3J0ZWRfQ29uc3RhbnRzIEZMQVNIIEV4cG9ydGVkIENvbnN0YW50cw0KLSAqIEB7DQotICovDQotDQotLyoqIEBkZWZncm91cCBGTEFTSF9FcnJvciBGTEFTSCBFcnJvcg0KLSAqIEB7DQotICovDQotI2RlZmluZSBIQUxfRkxBU0hfRVJST1JfTk9ORSAweDAwMDAwMDAwVQ0KLSNkZWZpbmUgSEFMX0ZMQVNIX0VSUk9SX09QIEZMQVNIX0ZMQUdfT1BFUlINCi0jZGVmaW5lIEhBTF9GTEFTSF9FUlJPUl9QUk9HIEZMQVNIX0ZMQUdfUFJPR0VSUg0KLSNkZWZpbmUgSEFMX0ZMQVNIX0VSUk9SX1dSUCBGTEFTSF9GTEFHX1dSUEVSUg0KLSNkZWZpbmUgSEFMX0ZMQVNIX0VSUk9SX1BHQSBGTEFTSF9GTEFHX1BHQUVSUg0KLSNkZWZpbmUgSEFMX0ZMQVNIX0VSUk9SX1NJWiBGTEFTSF9GTEFHX1NJWkVSUg0KLSNkZWZpbmUgSEFMX0ZMQVNIX0VSUk9SX1BHUyBGTEFTSF9GTEFHX1BHU0VSUg0KLSNkZWZpbmUgSEFMX0ZMQVNIX0VSUk9SX01JUyBGTEFTSF9GTEFHX01JU0VSUg0KLSNkZWZpbmUgSEFMX0ZMQVNIX0VSUk9SX0ZBU1QgRkxBU0hfRkxBR19GQVNURVJSDQotI2RlZmluZSBIQUxfRkxBU0hfRVJST1JfUkQgRkxBU0hfRkxBR19SREVSUg0KLSNkZWZpbmUgSEFMX0ZMQVNIX0VSUk9SX09QVFYgRkxBU0hfRkxBR19PUFRWRVJSDQotI2RlZmluZSBIQUxfRkxBU0hfRVJST1JfRUNDQyBGTEFTSF9GTEFHX0VDQ0MNCi0jZGVmaW5lIEhBTF9GTEFTSF9FUlJPUl9FQ0NEIEZMQVNIX0ZMQUdfRUNDRA0KLSNpZiBkZWZpbmVkKEZMQVNIX09QVFJfREJBTkspDQotI2RlZmluZSBIQUxfRkxBU0hfRVJST1JfRUNDQzIgRkxBU0hfRkxBR19FQ0NDMg0KLSNkZWZpbmUgSEFMX0ZMQVNIX0VSUk9SX0VDQ0QyIEZMQVNIX0ZMQUdfRUNDRDINCi0jZW5kaWYNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRkxBU0hfVHlwZV9FcmFzZSBGTEFTSCBFcmFzZSBUeXBlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIEZMQVNIX1RZUEVFUkFTRV9QQUdFUyAweDAwVSAgICAgLyohPFBhZ2VzIGVyYXNlIG9ubHkqLw0KLSNkZWZpbmUgRkxBU0hfVFlQRUVSQVNFX01BU1NFUkFTRSAweDAxVSAvKiE8Rmxhc2ggbWFzcyBlcmFzZSBhY3RpdmF0aW9uKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRkxBU0hfQmFua3MgRkxBU0ggQmFua3MNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgRkxBU0hfQkFOS18xIDB4MDAwMDAwMDFVIC8qITwgQmFuayAxICAgKi8NCi0jaWYgZGVmaW5lZChGTEFTSF9PUFRSX0RCQU5LKQ0KLSNkZWZpbmUgRkxBU0hfQkFOS18yIDB4MDAwMDAwMDJVICAgICAgICAgICAgICAgICAgICAgIC8qITwgQmFuayAyICAgKi8NCi0jZGVmaW5lIEZMQVNIX0JBTktfQk9USCAoRkxBU0hfQkFOS18xIHwgRkxBU0hfQkFOS18yKSAvKiE8IEJhbmsxIGFuZCBCYW5rMiAgKi8NCi0jZWxzZQ0KLSNkZWZpbmUgRkxBU0hfQkFOS19CT1RIIEZMQVNIX0JBTktfMSAvKiE8IEJhbmsgMSAgICovDQotI2VuZGlmDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEZMQVNIX1R5cGVfUHJvZ3JhbSBGTEFTSCBQcm9ncmFtIFR5cGUNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgRkxBU0hfVFlQRVBST0dSQU1fRE9VQkxFV09SRCBcDQotICAweDAwVSAvKiE8IFByb2dyYW0gYSBkb3VibGUtd29yZCAoNjQtYml0KSBhdCBhIHNwZWNpZmllZCBhZGRyZXNzLiovDQotI2RlZmluZSBGTEFTSF9UWVBFUFJPR1JBTV9GQVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIDB4MDFVIC8qITwgRmFzdCBwcm9ncmFtIGEgMzIgcm93IGRvdWJsZS13b3JkICg2NC1iaXQpIGF0IGEgc3BlY2lmaWVkICAgICAgICAgXA0KLSAgICAgICAgICAgYWRkcmVzcy4gQW5kIGFub3RoZXIgMzIgcm93IGRvdWJsZS13b3JkICg2NC1iaXQpIHdpbGwgYmUgcHJvZ3JhbW1lZCBcDQotICAgICAgICAgKi8NCi0jZGVmaW5lIEZMQVNIX1RZUEVQUk9HUkFNX0ZBU1RfQU5EX0xBU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIDB4MDJVIC8qITwgRmFzdCBwcm9ncmFtIGEgMzIgcm93IGRvdWJsZS13b3JkICg2NC1iaXQpIGF0IGEgc3BlY2lmaWVkIFwNCi0gICAgICAgICAgIGFkZHJlc3MuIEFuZCB0aGlzIGlzIHRoZSBsYXN0IDMyIHJvdyBkb3VibGUtd29yZCAoNjQtYml0KSAgIFwNCi0gICAgICAgICAgIHByb2dyYW1tZWQgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRkxBU0hfT0JfVHlwZSBGTEFTSCBPcHRpb24gQnl0ZXMgVHlwZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBPUFRJT05CWVRFX1dSUCAweDAxVSAgICAgICAvKiE8IFdSUCBvcHRpb24gYnl0ZSBjb25maWd1cmF0aW9uICovDQotI2RlZmluZSBPUFRJT05CWVRFX1JEUCAweDAyVSAgICAgICAvKiE8IFJEUCBvcHRpb24gYnl0ZSBjb25maWd1cmF0aW9uICovDQotI2RlZmluZSBPUFRJT05CWVRFX1VTRVIgMHgwNFUgICAgICAvKiE8IFVTRVIgb3B0aW9uIGJ5dGUgY29uZmlndXJhdGlvbiAqLw0KLSNkZWZpbmUgT1BUSU9OQllURV9QQ1JPUCAweDA4VSAgICAgLyohPCBQQ1JPUCBvcHRpb24gYnl0ZSBjb25maWd1cmF0aW9uICovDQotI2RlZmluZSBPUFRJT05CWVRFX0JPT1RfTE9DSyAweDEwVSAvKiE8IEJvb3QgbG9jayBvcHRpb24gYnl0ZSBjb25maWd1cmF0aW9uICovDQotI2RlZmluZSBPUFRJT05CWVRFX1NFQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAweDIwVSAvKiE8IFNlY3VyYWJsZSBtZW1vcnkgb3B0aW9uIGJ5dGUgY29uZmlndXJhdGlvbiBcDQotICAgICAgICAgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRkxBU0hfT0JfV1JQX0FyZWEgRkxBU0ggV1JQIEFyZWENCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgT0JfV1JQQVJFQV9CQU5LMV9BUkVBQSAweDAwVSAvKiE8IEZsYXNoIEJhbmsgMSBBcmVhIEEgKi8NCi0jZGVmaW5lIE9CX1dSUEFSRUFfQkFOSzFfQVJFQUIgMHgwMVUgLyohPCBGbGFzaCBCYW5rIDEgQXJlYSBCICovDQotI2lmIGRlZmluZWQoRkxBU0hfT1BUUl9EQkFOSykNCi0jZGVmaW5lIE9CX1dSUEFSRUFfQkFOSzJfQVJFQUEgMHgwMlUgLyohPCBGbGFzaCBCYW5rIDIgQXJlYSBBICovDQotI2RlZmluZSBPQl9XUlBBUkVBX0JBTksyX0FSRUFCIDB4MDRVIC8qITwgRmxhc2ggQmFuayAyIEFyZWEgQiAqLw0KLSNlbmRpZg0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBGTEFTSF9PQl9Cb290X0xvY2sgRkxBU0ggQm9vdCBMb2NrDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIE9CX0JPT1RfTE9DS19ESVNBQkxFIDB4MDAwMDAwMDBVICAgICAgICAgIC8qITwgQm9vdCBMb2NrIERpc2FibGUgKi8NCi0jZGVmaW5lIE9CX0JPT1RfTE9DS19FTkFCTEUgRkxBU0hfU0VDMVJfQk9PVF9MT0NLIC8qITwgQm9vdCBMb2NrIEVuYWJsZSAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBGTEFTSF9PQl9SZWFkX1Byb3RlY3Rpb24gRkxBU0ggT3B0aW9uIEJ5dGVzIFJlYWQgUHJvdGVjdGlvbg0KLSAqIEB7DQotICovDQotI2RlZmluZSBPQl9SRFBfTEVWRUxfMCAweEFBVQ0KLSNkZWZpbmUgT0JfUkRQX0xFVkVMXzEgMHhCQlUNCi0jZGVmaW5lIE9CX1JEUF9MRVZFTF8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAweENDVSAvKiE8IFdhcm5pbmc6IFdoZW4gZW5hYmxpbmcgcmVhZCBwcm90ZWN0aW9uIGxldmVsIDIgXA0KLSAgICAgICAgICAgICBpdCdzIG5vIG1vcmUgcG9zc2libGUgdG8gZ28gYmFjayB0byBsZXZlbCAxIG9yIDAgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRkxBU0hfT0JfVVNFUl9UeXBlIEZMQVNIIE9wdGlvbiBCeXRlcyBVc2VyIFR5cGUNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgT0JfVVNFUl9CT1JfTEVWIDB4MDAwMDAwMDFVIC8qITwgQk9SIHJlc2V0IExldmVsICovDQotI2RlZmluZSBPQl9VU0VSX25SU1RfU1RPUCBcDQotICAweDAwMDAwMDAyVSAvKiE8IFJlc2V0IGdlbmVyYXRlZCB3aGVuIGVudGVyaW5nIHRoZSBzdG9wIG1vZGUgKi8NCi0jZGVmaW5lIE9CX1VTRVJfblJTVF9TVERCWSBcDQotICAweDAwMDAwMDA0VSAvKiE8IFJlc2V0IGdlbmVyYXRlZCB3aGVuIGVudGVyaW5nIHRoZSBzdGFuZGJ5IG1vZGUgKi8NCi0jZGVmaW5lIE9CX1VTRVJfSVdER19TVyAweDAwMDAwMDA4VSAvKiE8IEluZGVwZW5kZW50IHdhdGNoZG9nIHNlbGVjdGlvbiAqLw0KLSNkZWZpbmUgT0JfVVNFUl9JV0RHX1NUT1AgXA0KLSAgMHgwMDAwMDAxMFUgLyohPCBJbmRlcGVuZGVudCB3YXRjaGRvZyBjb3VudGVyIGZyZWV6ZSBpbiBzdG9wIG1vZGUgKi8NCi0jZGVmaW5lIE9CX1VTRVJfSVdER19TVERCWSBcDQotICAweDAwMDAwMDIwVSAvKiE8IEluZGVwZW5kZW50IHdhdGNoZG9nIGNvdW50ZXIgZnJlZXplIGluIHN0YW5kYnkgbW9kZSAqLw0KLSNkZWZpbmUgT0JfVVNFUl9XV0RHX1NXIDB4MDAwMDAwNDBVIC8qITwgV2luZG93IHdhdGNoZG9nIHNlbGVjdGlvbiAqLw0KLSNpZiBkZWZpbmVkKEZMQVNIX09QVFJfREJBTkspDQotI2RlZmluZSBPQl9VU0VSX0JGQjIgMHgwMDAwMDA4MFUgLyohPCBEdWFsLWJhbmsgYm9vdCAqLw0KLSNkZWZpbmUgT0JfVVNFUl9EQkFOSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAweDAwMDAwMTAwVSAvKiE8IFNpbmdsZSBiYW5rIHdpdGggMTI4LWJpdHMgZGF0YSBvciB0d28gYmFua3Mgd2l0aCA2NC1iaXRzIFwNCi0gICAgICAgICAgICAgICAgIGRhdGEgKi8NCi0jZW5kaWYNCi0jaWYgZGVmaW5lZChGTEFTSF9PUFRSX1BCNF9QVVBFTikNCi0jZGVmaW5lIE9CX1VTRVJfUEI0X1BVUEVOIFwNCi0gIDB4MDAwMDAxMDBVIC8qITwgVVNCIHBvd2VyIGRlbGl2ZXJ5IGRlYWQtYmF0dGVyeS9UREkgcHVsbC11cCAqLw0KLSNlbmRpZg0KLSNkZWZpbmUgT0JfVVNFUl9uQk9PVDEgMHgwMDAwMDIwMFUgLyohPCBCb290IGNvbmZpZ3VyYXRpb24gKi8NCi0jZGVmaW5lIE9CX1VTRVJfU1JBTV9QRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIDB4MDAwMDA0MDBVIC8qITwgU1JBTSBwYXJpdHkgY2hlY2sgZW5hYmxlIChmaXJzdCAzMmtCIG9mIFNSQU0xICsgQ0NNIFNSQU0pIFwNCi0gICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgT0JfVVNFUl9DQ01TUkFNX1JTVCAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIDB4MDAwMDA4MDBVIC8qITwgQ0NNU1JBTSBFcmFzZSB3aGVuIHN5c3RlbSByZXNldCBcDQotICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIE9CX1VTRVJfblJTVF9TSERXIFwNCi0gIDB4MDAwMDEwMDBVIC8qITwgUmVzZXQgZ2VuZXJhdGVkIHdoZW4gZW50ZXJpbmcgdGhlIHNodXRkb3duIG1vZGUgKi8NCi0jZGVmaW5lIE9CX1VTRVJfblNXQk9PVDAgMHgwMDAwMjAwMFUgIC8qITwgU29mdHdhcmUgQk9PVDAgKi8NCi0jZGVmaW5lIE9CX1VTRVJfbkJPT1QwIDB4MDAwMDQwMDBVICAgIC8qITwgbkJPT1QwIG9wdGlvbiBiaXQgKi8NCi0jZGVmaW5lIE9CX1VTRVJfTlJTVF9NT0RFIDB4MDAwMDgwMDBVIC8qITwgUmVzZXQgcGluIGNvbmZpZ3VyYXRpb24gKi8NCi0jZGVmaW5lIE9CX1VTRVJfSVJIRU4gMHgwMDAxMDAwMFUgICAgIC8qITwgSW50ZXJuYWwgUmVzZXQgSG9sZGVyIGVuYWJsZSAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBGTEFTSF9PQl9VU0VSX0JPUl9MRVZFTCBGTEFTSCBPcHRpb24gQnl0ZXMgVXNlciBCT1IgTGV2ZWwNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgT0JfQk9SX0xFVkVMXzAgXA0KLSAgRkxBU0hfT1BUUl9CT1JfTEVWXzAgLyohPCBSZXNldCBsZXZlbCB0aHJlc2hvbGQgaXMgYXJvdW5kIDEuN1YgKi8NCi0jZGVmaW5lIE9CX0JPUl9MRVZFTF8xIFwNCi0gIEZMQVNIX09QVFJfQk9SX0xFVl8xIC8qITwgUmVzZXQgbGV2ZWwgdGhyZXNob2xkIGlzIGFyb3VuZCAyLjBWICovDQotI2RlZmluZSBPQl9CT1JfTEVWRUxfMiBcDQotICBGTEFTSF9PUFRSX0JPUl9MRVZfMiAvKiE8IFJlc2V0IGxldmVsIHRocmVzaG9sZCBpcyBhcm91bmQgMi4yViAqLw0KLSNkZWZpbmUgT0JfQk9SX0xFVkVMXzMgXA0KLSAgRkxBU0hfT1BUUl9CT1JfTEVWXzMgLyohPCBSZXNldCBsZXZlbCB0aHJlc2hvbGQgaXMgYXJvdW5kIDIuNVYgKi8NCi0jZGVmaW5lIE9CX0JPUl9MRVZFTF80IFwNCi0gIEZMQVNIX09QVFJfQk9SX0xFVl80IC8qITwgUmVzZXQgbGV2ZWwgdGhyZXNob2xkIGlzIGFyb3VuZCAyLjhWICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEZMQVNIX09CX1VTRVJfblJTVF9TVE9QIEZMQVNIIE9wdGlvbiBCeXRlcyBVc2VyIFJlc2V0IE9uIFN0b3ANCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgT0JfU1RPUF9SU1QgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBSZXNldCBnZW5lcmF0ZWQgd2hlbiBlbnRlcmluZyB0aGUgc3RvcCBtb2RlICovDQotI2RlZmluZSBPQl9TVE9QX05PUlNUIFwNCi0gIEZMQVNIX09QVFJfblJTVF9TVE9QIC8qITwgTm8gcmVzZXQgZ2VuZXJhdGVkIHdoZW4gZW50ZXJpbmcgdGhlIHN0b3AgbW9kZSAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBGTEFTSF9PQl9VU0VSX25SU1RfU1RBTkRCWSBGTEFTSCBPcHRpb24gQnl0ZXMgVXNlciBSZXNldCBPbg0KLSAqIFN0YW5kYnkNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgT0JfU1RBTkRCWV9SU1QgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBSZXNldCBnZW5lcmF0ZWQgd2hlbiBlbnRlcmluZyB0aGUgc3RhbmRieSBtb2RlICovDQotI2RlZmluZSBPQl9TVEFOREJZX05PUlNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIEZMQVNIX09QVFJfblJTVF9TVERCWSAvKiE8IE5vIHJlc2V0IGdlbmVyYXRlZCB3aGVuIGVudGVyaW5nIHRoZSBzdGFuZGJ5IG1vZGUgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBGTEFTSF9PQl9VU0VSX25SU1RfU0hVVERPV04gRkxBU0ggT3B0aW9uIEJ5dGVzIFVzZXIgUmVzZXQgT24NCi0gKiBTaHV0ZG93bg0KLSAqIEB7DQotICovDQotI2RlZmluZSBPQl9TSFVURE9XTl9SU1QgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBSZXNldCBnZW5lcmF0ZWQgd2hlbiBlbnRlcmluZyB0aGUgc2h1dGRvd24gbW9kZSAqLw0KLSNkZWZpbmUgT0JfU0hVVERPV05fTk9SU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBGTEFTSF9PUFRSX25SU1RfU0hEVyAvKiE8IE5vIHJlc2V0IGdlbmVyYXRlZCB3aGVuIGVudGVyaW5nIHRoZSBzaHV0ZG93biBtb2RlIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBGTEFTSF9PQl9VU0VSX0lXREdfU1cgRkxBU0ggT3B0aW9uIEJ5dGVzIFVzZXIgSVdERyBUeXBlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIE9CX0lXREdfSFcgMHgwMDAwMDAwMFUgICAgICAgIC8qITwgSGFyZHdhcmUgaW5kZXBlbmRlbnQgd2F0Y2hkb2cgKi8NCi0jZGVmaW5lIE9CX0lXREdfU1cgRkxBU0hfT1BUUl9JV0RHX1NXIC8qITwgU29mdHdhcmUgaW5kZXBlbmRlbnQgd2F0Y2hkb2cgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRkxBU0hfT0JfVVNFUl9JV0RHX1NUT1AgRkxBU0ggT3B0aW9uIEJ5dGVzIFVzZXIgSVdERyBNb2RlIE9uIFN0b3ANCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgT0JfSVdER19TVE9QX0ZSRUVaRSBcDQotICAweDAwMDAwMDAwVSAvKiE8IEluZGVwZW5kZW50IHdhdGNoZG9nIGNvdW50ZXIgaXMgZnJvemVuIGluIFN0b3AgbW9kZSAqLw0KLSNkZWZpbmUgT0JfSVdER19TVE9QX1JVTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBGTEFTSF9PUFRSX0lXREdfU1RPUCAvKiE8IEluZGVwZW5kZW50IHdhdGNoZG9nIGNvdW50ZXIgaXMgcnVubmluZyBpbiBTdG9wIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRkxBU0hfT0JfVVNFUl9JV0RHX1NUQU5EQlkgRkxBU0ggT3B0aW9uIEJ5dGVzIFVzZXIgSVdERyBNb2RlIE9uDQotICogU3RhbmRieQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBPQl9JV0RHX1NUREJZX0ZSRUVaRSBcDQotICAweDAwMDAwMDAwVSAvKiE8IEluZGVwZW5kZW50IHdhdGNoZG9nIGNvdW50ZXIgaXMgZnJvemVuIGluIFN0YW5kYnkgbW9kZSAqLw0KLSNkZWZpbmUgT0JfSVdER19TVERCWV9SVU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIEZMQVNIX09QVFJfSVdER19TVERCWSAvKiE8IEluZGVwZW5kZW50IHdhdGNoZG9nIGNvdW50ZXIgaXMgcnVubmluZyBpbiBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhbmRieSBtb2RlICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEZMQVNIX09CX1VTRVJfV1dER19TVyBGTEFTSCBPcHRpb24gQnl0ZXMgVXNlciBXV0RHIFR5cGUNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgT0JfV1dER19IVyAweDAwMDAwMDAwVSAgICAgICAgLyohPCBIYXJkd2FyZSB3aW5kb3cgd2F0Y2hkb2cgKi8NCi0jZGVmaW5lIE9CX1dXREdfU1cgRkxBU0hfT1BUUl9XV0RHX1NXIC8qITwgU29mdHdhcmUgd2luZG93IHdhdGNoZG9nICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0jaWYgZGVmaW5lZChGTEFTSF9PUFRSX0RCQU5LKQ0KLS8qKiBAZGVmZ3JvdXAgRkxBU0hfT0JfVVNFUl9CRkIyIEZMQVNIIE9wdGlvbiBCeXRlcyBVc2VyIEJGQjIgTW9kZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBPQl9CRkIyX0RJU0FCTEUgMHgwMDAwMDAwMFUgICAgLyohPCBEdWFsLWJhbmsgYm9vdCBkaXNhYmxlICovDQotI2RlZmluZSBPQl9CRkIyX0VOQUJMRSBGTEFTSF9PUFRSX0JGQjIgLyohPCBEdWFsLWJhbmsgYm9vdCBlbmFibGUgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRkxBU0hfT0JfVVNFUl9EQkFOSyBGTEFTSCBPcHRpb24gQnl0ZXMgVXNlciBEQkFOSyBUeXBlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIE9CX0RCQU5LXzEyOF9CSVRTIDB4MDAwMDAwMDBVICAgICAvKiE8IFNpbmdsZS1iYW5rIHdpdGggMTI4LWJpdHMgZGF0YSAqLw0KLSNkZWZpbmUgT0JfREJBTktfNjRfQklUUyBGTEFTSF9PUFRSX0RCQU5LIC8qITwgRHVhbC1iYW5rIHdpdGggNjQtYml0cyBkYXRhICovDQotLyoqDQotICogQH0NCi0gKi8NCi0jZW5kaWYNCi0NCi0jaWYgZGVmaW5lZChGTEFTSF9PUFRSX1BCNF9QVVBFTikNCi0vKiogQGRlZmdyb3VwIEZMQVNIX09CX1VTRVJfUEI0X1BVUEVOIEZMQVNIIE9wdGlvbiBCeXRlcyBVc2VyIFBCNCBQVVBFTiBiaXQNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgT0JfUEI0X1BVUEVOX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgVVNCIHBvd2VyIGRlbGl2ZXJ5IGRlYWQtYmF0dGVyeSBlbmFibGVkLyBUREkgcHVsbC11cCBcDQotICAgICAgICAgICAgICAgICBkZWFjdGl2YXRlZCAqLw0KLSNkZWZpbmUgT0JfUEI0X1BVUEVOX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgRkxBU0hfT1BUUl9QQjRfUFVQRU4gLyohPCBVU0IgcG93ZXIgZGVsaXZlcnkgZGVhZC1iYXR0ZXJ5IGRpc2FibGVkLyBUREkgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcHVsbC11cCBhY3RpdmF0ZWQgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLSNlbmRpZg0KLQ0KLS8qKiBAZGVmZ3JvdXAgRkxBU0hfT0JfVVNFUl9uQk9PVDEgRkxBU0ggT3B0aW9uIEJ5dGVzIFVzZXIgQk9PVDEgVHlwZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBPQl9CT09UMV9TUkFNIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgRW1iZWRkZWQgU1JBTTEgaXMgc2VsZWN0ZWQgYXMgYm9vdCBzcGFjZSAoaWYgQk9PVDA9MSkgKi8NCi0jZGVmaW5lIE9CX0JPT1QxX1NZU1RFTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBGTEFTSF9PUFRSX25CT09UMSAvKiE8IFN5c3RlbSBtZW1vcnkgaXMgc2VsZWN0ZWQgYXMgYm9vdCBzcGFjZSAoaWYgQk9PVDA9MSkgXA0KLSAgICAgICAgICAgICAgICAgICAgICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEZMQVNIX09CX1VTRVJfU1JBTV9QRSBGTEFTSCBPcHRpb24gQnl0ZXMgVXNlciBTUkFNIFBhcml0eSBDaGVjaw0KLSAqIFR5cGUNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgT0JfU1JBTV9QQVJJVFlfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBTUkFNIHBhcml0eSBjaGVjayBlbmFibGUgKGZpcnN0IDMya0Igb2YgU1JBTTEgKyBDQ00gU1JBTSkgXA0KLSAgICAgICAgICAgICAgICovDQotI2RlZmluZSBPQl9TUkFNX1BBUklUWV9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIEZMQVNIX09QVFJfU1JBTV9QRSAvKiE8IFNSQU0gcGFyaXR5IGNoZWNrIGRpc2FibGUgKGZpcnN0IDMya0Igb2YgU1JBTTEgKyBDQ00gXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIFNSQU0pICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEZMQVNIX09CX1VTRVJfQ0NNU1JBTV9SU1QgRkxBU0ggT3B0aW9uIEJ5dGVzIFVzZXIgQ0NNU1JBTSBFcmFzZSBPbg0KLSAqIFJlc2V0IFR5cGUNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgT0JfQ0NNU1JBTV9SU1RfRVJBU0UgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBDQ01TUkFNIGVyYXNlZCB3aGVuIGEgc3lzdGVtIHJlc2V0IG9jY3VycyAqLw0KLSNkZWZpbmUgT0JfQ0NNU1JBTV9SU1RfTk9UX0VSQVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBGTEFTSF9PUFRSX0NDTVNSQU1fUlNUIC8qITwgQ0NNU1JBTSBpcyBub3QgZXJhc2VkIHdoZW4gYSBzeXN0ZW0gcmVzZXQgb2NjdXJzIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEZMQVNIX09CX1VTRVJfblNXQk9PVDAgRkxBU0ggT3B0aW9uIEJ5dGVzIFVzZXIgU29mdHdhcmUgQk9PVDANCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgT0JfQk9PVDBfRlJPTV9PQiBcDQotICAweDAwMDAwMDAwVSAvKiE8IEJPT1QwIHRha2VuIGZyb20gdGhlIG9wdGlvbiBiaXQgbkJPT1QwICovDQotI2RlZmluZSBPQl9CT09UMF9GUk9NX1BJTiBcDQotICBGTEFTSF9PUFRSX25TV0JPT1QwIC8qITwgQk9PVDAgdGFrZW4gZnJvbSBQQjgvQk9PVDAgcGluICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEZMQVNIX09CX1VTRVJfbkJPT1QwIEZMQVNIIE9wdGlvbiBCeXRlcyBVc2VyIG5CT09UMCBvcHRpb24gYml0DQotICogQHsNCi0gKi8NCi0jZGVmaW5lIE9CX25CT09UMF9SRVNFVCAweDAwMDAwMDAwVSAgICAgLyohPCBuQk9PVDAgPSAwICovDQotI2RlZmluZSBPQl9uQk9PVDBfU0VUIEZMQVNIX09QVFJfbkJPT1QwIC8qITwgbkJPT1QwID0gMSAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBGTEFTSF9PQl9VU0VSX05SU1RfTU9ERSBGTEFTSCBPcHRpb24gQnl0ZXMgVXNlciBOUlNUIG1vZGUgYml0DQotICogQHsNCi0gKi8NCi0jZGVmaW5lIE9CX05SU1RfTU9ERV9JTlBVVF9PTkxZIFwNCi0gIEZMQVNIX09QVFJfTlJTVF9NT0RFXzAgLyohPCBSZXNldCBwaW4gaXMgaW4gUmVzZXQgaW5wdXQgbW9kZSBvbmx5ICovDQotI2RlZmluZSBPQl9OUlNUX01PREVfR1BJTyBcDQotICBGTEFTSF9PUFRSX05SU1RfTU9ERV8xIC8qITwgUmVzZXQgcGluIGlzIGluIEdQSU8gbW9kZSBvbmx5ICovDQotI2RlZmluZSBPQl9OUlNUX01PREVfSU5QVVRfT1VUUFVUIFwNCi0gIEZMQVNIX09QVFJfTlJTVF9NT0RFIC8qITwgUmVzZXQgcGluIGlzIGluIHJlc2V0IGlucHV0IGFuZCBvdXRwdXQgbW9kZSAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBGTEFTSF9PQl9VU0VSX0lOVEVSTkFMX1JFU0VUX0hPTERFUiBGTEFTSCBPcHRpb24gQnl0ZXMgVXNlcg0KLSAqIGludGVybmFsIHJlc2V0IGhvbGRlciBiaXQNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgT0JfSVJIX0RJU0FCTEUgMHgwMDAwMDAwMFUgICAgIC8qITwgSW50ZXJuYWwgUmVzZXQgaG9sZGVyIGRpc2FibGUgKi8NCi0jZGVmaW5lIE9CX0lSSF9FTkFCTEUgRkxBU0hfT1BUUl9JUkhFTiAvKiE8IEludGVybmFsIFJlc2V0IGhvbGRlciBlbmFibGUgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRkxBU0hfT0JfUENST1BfUkRQIEZMQVNIIE9wdGlvbiBCeXRlcyBQQ1JPUCBPbiBSRFAgTGV2ZWwgVHlwZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBPQl9QQ1JPUF9SRFBfTk9UX0VSQVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBQQ1JPUCBhcmVhIGlzIG5vdCBlcmFzZWQgd2hlbiB0aGUgUkRQIGxldmVsIFwNCi0gICAgICAgICAgICAgICAgICAgaXMgZGVjcmVhc2VkIGZyb20gTGV2ZWwgMSB0byBMZXZlbCAwICovDQotI2RlZmluZSBPQl9QQ1JPUF9SRFBfRVJBU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBGTEFTSF9QQ1JPUDFFUl9QQ1JPUF9SRFAgLyohPCBQQ1JPUCBhcmVhIGlzIGVyYXNlZCB3aGVuIHRoZSBSRFAgbGV2ZWwgaXMgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNyZWFzZWQgZnJvbSBMZXZlbCAxIHRvIExldmVsIDAgKGZ1bGwgbWFzcyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJhc2UpICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEZMQVNIX0xhdGVuY3kgRkxBU0ggTGF0ZW5jeQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBGTEFTSF9MQVRFTkNZXzAgRkxBU0hfQUNSX0xBVEVOQ1lfMFdTICAgLyohPCBGTEFTSCBaZXJvIHdhaXQgc3RhdGUgKi8NCi0jZGVmaW5lIEZMQVNIX0xBVEVOQ1lfMSBGTEFTSF9BQ1JfTEFURU5DWV8xV1MgICAvKiE8IEZMQVNIIE9uZSB3YWl0IHN0YXRlICovDQotI2RlZmluZSBGTEFTSF9MQVRFTkNZXzIgRkxBU0hfQUNSX0xBVEVOQ1lfMldTICAgLyohPCBGTEFTSCBUd28gd2FpdCBzdGF0ZXMgKi8NCi0jZGVmaW5lIEZMQVNIX0xBVEVOQ1lfMyBGTEFTSF9BQ1JfTEFURU5DWV8zV1MgICAvKiE8IEZMQVNIIFRocmVlIHdhaXQgc3RhdGVzICovDQotI2RlZmluZSBGTEFTSF9MQVRFTkNZXzQgRkxBU0hfQUNSX0xBVEVOQ1lfNFdTICAgLyohPCBGTEFTSCBGb3VyIHdhaXQgc3RhdGVzICovDQotI2RlZmluZSBGTEFTSF9MQVRFTkNZXzUgRkxBU0hfQUNSX0xBVEVOQ1lfNVdTICAgLyohPCBGTEFTSCBGaXZlIHdhaXQgc3RhdGUgKi8NCi0jZGVmaW5lIEZMQVNIX0xBVEVOQ1lfNiBGTEFTSF9BQ1JfTEFURU5DWV82V1MgICAvKiE8IEZMQVNIIFNpeCB3YWl0IHN0YXRlICovDQotI2RlZmluZSBGTEFTSF9MQVRFTkNZXzcgRkxBU0hfQUNSX0xBVEVOQ1lfN1dTICAgLyohPCBGTEFTSCBTZXZlbiB3YWl0IHN0YXRlcyAqLw0KLSNkZWZpbmUgRkxBU0hfTEFURU5DWV84IEZMQVNIX0FDUl9MQVRFTkNZXzhXUyAgIC8qITwgRkxBU0ggRWlnaHQgd2FpdCBzdGF0ZXMgKi8NCi0jZGVmaW5lIEZMQVNIX0xBVEVOQ1lfOSBGTEFTSF9BQ1JfTEFURU5DWV85V1MgICAvKiE8IEZMQVNIIE5pbmUgd2FpdCBzdGF0ZXMgKi8NCi0jZGVmaW5lIEZMQVNIX0xBVEVOQ1lfMTAgRkxBU0hfQUNSX0xBVEVOQ1lfMTBXUyAvKiE8IEZMQVNIIFRlbiB3YWl0IHN0YXRlICovDQotI2RlZmluZSBGTEFTSF9MQVRFTkNZXzExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgRkxBU0hfQUNSX0xBVEVOQ1lfMTFXUyAvKiE8IEZMQVNIIEVsZXZlbiB3YWl0IHN0YXRlIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBGTEFTSF9MQVRFTkNZXzEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIEZMQVNIX0FDUl9MQVRFTkNZXzEyV1MgLyohPCBGTEFTSCBUd2VsdmUgd2FpdCBzdGF0ZXMgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIEZMQVNIX0xBVEVOQ1lfMTMgXA0KLSAgRkxBU0hfQUNSX0xBVEVOQ1lfMTNXUyAvKiE8IEZMQVNIIFRoaXJ0ZWVuIHdhaXQgc3RhdGVzICovDQotI2RlZmluZSBGTEFTSF9MQVRFTkNZXzE0IFwNCi0gIEZMQVNIX0FDUl9MQVRFTkNZXzE0V1MgLyohPCBGTEFTSCBGb3VydGVlbiB3YWl0IHN0YXRlcyAqLw0KLSNkZWZpbmUgRkxBU0hfTEFURU5DWV8xNSBcDQotICBGTEFTSF9BQ1JfTEFURU5DWV8xNVdTIC8qITwgRkxBU0ggRmlmdGVlbiB3YWl0IHN0YXRlcyAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBGTEFTSF9LZXlzIEZMQVNIIEtleXMNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgRkxBU0hfS0VZMSAweDQ1NjcwMTIzVSAvKiE8IEZsYXNoIGtleTEgKi8NCi0jZGVmaW5lIEZMQVNIX0tFWTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgMHhDREVGODlBQlUgLyohPCBGbGFzaCBrZXkyOiB1c2VkIHdpdGggRkxBU0hfS0VZMSBcDQotICAgICAgICAgICAgICAgICAgIHRvIHVubG9jayB0aGUgRkxBU0ggcmVnaXN0ZXJzIGFjY2VzcyAqLw0KLQ0KLSNkZWZpbmUgRkxBU0hfUERLRVkxIDB4MDQxNTI2MzdVIC8qITwgRmxhc2ggcG93ZXIgZG93biBrZXkxICovDQotI2RlZmluZSBGTEFTSF9QREtFWTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAweEZBRkJGQ0ZEVSAvKiE8IEZsYXNoIHBvd2VyIGRvd24ga2V5MjogdXNlZCB3aXRoIEZMQVNIX1BES0VZMSBcDQotICAgICAgICAgICAgICAgICAgIHRvIHVubG9jayB0aGUgUlVOX1BEIGJpdCBpbiBGTEFTSF9BQ1IgKi8NCi0NCi0jZGVmaW5lIEZMQVNIX09QVEtFWTEgMHgwODE5MkEzQlUgLyohPCBGbGFzaCBvcHRpb24gYnl0ZSBrZXkxICovDQotI2RlZmluZSBGTEFTSF9PUFRLRVkyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIDB4NEM1RDZFN0ZVIC8qITwgRmxhc2ggb3B0aW9uIGJ5dGUga2V5MjogdXNlZCB3aXRoIEZMQVNIX09QVEtFWTEgXA0KLSAgICAgICAgICAgICAgICAgICB0byBhbGxvdyBvcHRpb24gYnl0ZXMgb3BlcmF0aW9ucyAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBGTEFTSF9GbGFncyBGTEFTSCBGbGFncyBEZWZpbml0aW9uDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIEZMQVNIX0ZMQUdfRU9QIEZMQVNIX1NSX0VPUCAgICAgLyohPCBGTEFTSCBFbmQgb2Ygb3BlcmF0aW9uIGZsYWcgKi8NCi0jZGVmaW5lIEZMQVNIX0ZMQUdfT1BFUlIgRkxBU0hfU1JfT1BFUlIgLyohPCBGTEFTSCBPcGVyYXRpb24gZXJyb3IgZmxhZyAqLw0KLSNkZWZpbmUgRkxBU0hfRkxBR19QUk9HRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgRkxBU0hfU1JfUFJPR0VSUiAvKiE8IEZMQVNIIFByb2dyYW1taW5nIGVycm9yIGZsYWcgXA0KLSAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIEZMQVNIX0ZMQUdfV1JQRVJSIFwNCi0gIEZMQVNIX1NSX1dSUEVSUiAvKiE8IEZMQVNIIFdyaXRlIHByb3RlY3Rpb24gZXJyb3IgZmxhZyAqLw0KLSNkZWZpbmUgRkxBU0hfRkxBR19QR0FFUlIgXA0KLSAgRkxBU0hfU1JfUEdBRVJSIC8qITwgRkxBU0ggUHJvZ3JhbW1pbmcgYWxpZ25tZW50IGVycm9yIGZsYWcgKi8NCi0jZGVmaW5lIEZMQVNIX0ZMQUdfU0laRVJSIEZMQVNIX1NSX1NJWkVSUiAvKiE8IEZMQVNIIFNpemUgZXJyb3IgZmxhZyAgKi8NCi0jZGVmaW5lIEZMQVNIX0ZMQUdfUEdTRVJSIFwNCi0gIEZMQVNIX1NSX1BHU0VSUiAvKiE8IEZMQVNIIFByb2dyYW1taW5nIHNlcXVlbmNlIGVycm9yIGZsYWcgKi8NCi0jZGVmaW5lIEZMQVNIX0ZMQUdfTUlTRVJSIFwNCi0gIEZMQVNIX1NSX01JU0VSUiAvKiE8IEZMQVNIIEZhc3QgcHJvZ3JhbW1pbmcgZGF0YSBtaXNzIGVycm9yIGZsYWcgKi8NCi0jZGVmaW5lIEZMQVNIX0ZMQUdfRkFTVEVSUiBcDQotICBGTEFTSF9TUl9GQVNURVJSIC8qITwgRkxBU0ggRmFzdCBwcm9ncmFtbWluZyBlcnJvciBmbGFnICovDQotI2RlZmluZSBGTEFTSF9GTEFHX1JERVJSIEZMQVNIX1NSX1JERVJSIC8qITwgRkxBU0ggUENST1AgcmVhZCBlcnJvciBmbGFnICovDQotI2RlZmluZSBGTEFTSF9GTEFHX09QVFZFUlIgXA0KLSAgRkxBU0hfU1JfT1BUVkVSUiAgICAgICAgICAgICAgICAgIC8qITwgRkxBU0ggT3B0aW9uIHZhbGlkaXR5IGVycm9yIGZsYWcgICovDQotI2RlZmluZSBGTEFTSF9GTEFHX0JTWSBGTEFTSF9TUl9CU1kgLyohPCBGTEFTSCBCdXN5IGZsYWcgKi8NCi0jZGVmaW5lIEZMQVNIX0ZMQUdfRUNDQyBcDQotICBGTEFTSF9FQ0NSX0VDQ0MgLyohPCBGTEFTSCBFQ0MgY29ycmVjdGlvbiBpbiA2NCBMU0IgYml0cyAqLw0KLSNkZWZpbmUgRkxBU0hfRkxBR19FQ0NEIFwNCi0gIEZMQVNIX0VDQ1JfRUNDRCAvKiE8IEZMQVNIIEVDQyBkZXRlY3Rpb24gaW4gNjQgTFNCIGJpdHMgKi8NCi0jaWYgZGVmaW5lZChGTEFTSF9PUFRSX0RCQU5LKQ0KLSNkZWZpbmUgRkxBU0hfRkxBR19FQ0NDMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIEZMQVNIX0VDQ1JfRUNDQzIgLyohPCBGTEFTSCBFQ0MgY29ycmVjdGlvbiBpbiA2NCBNU0IgYml0cyAobW9kZSAxMjggYml0cyBcDQotICAgICAgICAgICAgICAgICAgICAgIG9ubHkpICovDQotI2RlZmluZSBGTEFTSF9GTEFHX0VDQ0QyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBGTEFTSF9FQ0NSX0VDQ0QyIC8qITwgRkxBU0ggRUNDIGRldGVjdGlvbiBpbiA2NCBNU0IgYml0cyAobW9kZSAxMjggYml0cyBcDQotICAgICAgICAgICAgICAgICAgICAgIG9ubHkpICovDQotI2VuZGlmDQotDQotI2RlZmluZSBGTEFTSF9GTEFHX1NSX0VSUk9SUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEZMQVNIX0ZMQUdfT1BFUlIgfCBGTEFTSF9GTEFHX1BST0dFUlIgfCBGTEFTSF9GTEFHX1dSUEVSUiB8IFwNCi0gICBGTEFTSF9GTEFHX1BHQUVSUiB8IEZMQVNIX0ZMQUdfU0laRVJSIHwgRkxBU0hfRkxBR19QR1NFUlIgfCBcDQotICAgRkxBU0hfRkxBR19NSVNFUlIgfCBGTEFTSF9GTEFHX0ZBU1RFUlIgfCBGTEFTSF9GTEFHX1JERVJSIHwgXA0KLSAgIEZMQVNIX0ZMQUdfT1BUVkVSUikNCi0jaWYgZGVmaW5lZChGTEFTSF9PUFRSX0RCQU5LKQ0KLSNkZWZpbmUgRkxBU0hfRkxBR19FQ0NSX0VSUk9SUyBcDQotICAoRkxBU0hfRkxBR19FQ0NDIHwgRkxBU0hfRkxBR19FQ0NEIHwgRkxBU0hfRkxBR19FQ0NDMiB8IEZMQVNIX0ZMQUdfRUNDRDIpDQotI2Vsc2UNCi0jZGVmaW5lIEZMQVNIX0ZMQUdfRUNDUl9FUlJPUlMgKEZMQVNIX0ZMQUdfRUNDQyB8IEZMQVNIX0ZMQUdfRUNDRCkNCi0jZW5kaWYNCi0jZGVmaW5lIEZMQVNIX0ZMQUdfQUxMX0VSUk9SUyAoRkxBU0hfRkxBR19TUl9FUlJPUlMgfCBGTEFTSF9GTEFHX0VDQ1JfRVJST1JTKQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBGTEFTSF9JbnRlcnJ1cHRfZGVmaW5pdGlvbiBGTEFTSCBJbnRlcnJ1cHRzIERlZmluaXRpb24NCi0gKiBAYnJpZWYgRkxBU0ggSW50ZXJydXB0IGRlZmluaXRpb24NCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgRkxBU0hfSVRfRU9QIFwNCi0gIEZMQVNIX0NSX0VPUElFIC8qITwgRW5kIG9mIEZMQVNIIE9wZXJhdGlvbiBJbnRlcnJ1cHQgc291cmNlICovDQotI2RlZmluZSBGTEFTSF9JVF9PUEVSUiBGTEFTSF9DUl9FUlJJRSAvKiE8IEVycm9yIEludGVycnVwdCBzb3VyY2UgKi8NCi0jZGVmaW5lIEZMQVNIX0lUX1JERVJSICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBGTEFTSF9DUl9SREVSUklFIC8qITwgUENST1AgUmVhZCBFcnJvciBJbnRlcnJ1cHQgXA0KLSAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UqLw0KLSNkZWZpbmUgRkxBU0hfSVRfRUNDQyBcDQotICAoRkxBU0hfRUNDUl9FQ0NJRSA+PiAyNFUpIC8qITwgRUNDIENvcnJlY3Rpb24gSW50ZXJydXB0IHNvdXJjZSAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgRkxBU0hfRXhwb3J0ZWRfTWFjcm9zIEZMQVNIIEV4cG9ydGVkIE1hY3Jvcw0KLSAqIEBicmllZiBtYWNyb3MgdG8gY29udHJvbCBGTEFTSCBmZWF0dXJlcw0KLSAqIEB7DQotICovDQotDQotLyoqDQotICogQGJyaWVmICBTZXQgdGhlIEZMQVNIIExhdGVuY3kuDQotICogQHBhcmFtICBfX0xBVEVOQ1lfXyBGTEFTSCBMYXRlbmN5Lg0KLSAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcyA6DQotICogICAgICAgICAgIEBhcmcgRkxBU0hfTEFURU5DWV8wOiAgRkxBU0ggWmVybyB3YWl0IHN0YXRlDQotICogICAgICAgICAgIEBhcmcgRkxBU0hfTEFURU5DWV8xOiAgRkxBU0ggT25lIHdhaXQgc3RhdGUNCi0gKiAgICAgICAgICAgQGFyZyBGTEFTSF9MQVRFTkNZXzI6ICBGTEFTSCBUd28gd2FpdCBzdGF0ZXMNCi0gKiAgICAgICAgICAgQGFyZyBGTEFTSF9MQVRFTkNZXzM6ICBGTEFTSCBUaHJlZSB3YWl0IHN0YXRlcw0KLSAqICAgICAgICAgICBAYXJnIEZMQVNIX0xBVEVOQ1lfNDogIEZMQVNIIEZvdXIgd2FpdCBzdGF0ZXMNCi0gKiAgICAgICAgICAgQGFyZyBGTEFTSF9MQVRFTkNZXzU6ICBGTEFTSCBGaXZlIHdhaXQgc3RhdGVzDQotICogICAgICAgICAgIEBhcmcgRkxBU0hfTEFURU5DWV82OiAgRkxBU0ggU2l4IHdhaXQgc3RhdGVzDQotICogICAgICAgICAgIEBhcmcgRkxBU0hfTEFURU5DWV83OiAgRkxBU0ggU2V2ZW4gd2FpdCBzdGF0ZXMNCi0gKiAgICAgICAgICAgQGFyZyBGTEFTSF9MQVRFTkNZXzg6ICBGTEFTSCBFaWdodCB3YWl0IHN0YXRlcw0KLSAqICAgICAgICAgICBAYXJnIEZMQVNIX0xBVEVOQ1lfOTogIEZMQVNIIE5pbmUgd2FpdCBzdGF0ZXMNCi0gKiAgICAgICAgICAgQGFyZyBGTEFTSF9MQVRFTkNZXzEwOiBGTEFTSCBUZW4gd2FpdCBzdGF0ZQ0KLSAqICAgICAgICAgICBAYXJnIEZMQVNIX0xBVEVOQ1lfMTE6IEZMQVNIIEVsZXZlbiB3YWl0IHN0YXRlDQotICogICAgICAgICAgIEBhcmcgRkxBU0hfTEFURU5DWV8xMjogRkxBU0ggVHdlbHZlIHdhaXQgc3RhdGVzDQotICogICAgICAgICAgIEBhcmcgRkxBU0hfTEFURU5DWV8xMzogRkxBU0ggVGhpcnRlZW4gd2FpdCBzdGF0ZXMNCi0gKiAgICAgICAgICAgQGFyZyBGTEFTSF9MQVRFTkNZXzE0OiBGTEFTSCBGb3VydGVlbiB3YWl0IHN0YXRlcw0KLSAqICAgICAgICAgICBAYXJnIEZMQVNIX0xBVEVOQ1lfMTU6IEZMQVNIIEZpZnRlZW4gd2FpdCBzdGF0ZXMNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX0ZMQVNIX1NFVF9MQVRFTkNZKF9fTEFURU5DWV9fKSBcDQotICBNT0RJRllfUkVHKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9MQVRFTkNZLCAoX19MQVRFTkNZX18pKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IHRoZSBGTEFTSCBMYXRlbmN5Lg0KLSAqIEByZXR2YWwgRkxBU0hfTGF0ZW5jeS4NCi0gKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMgOg0KLSAqICAgICAgICAgICBAYXJnIEZMQVNIX0xBVEVOQ1lfMDogIEZMQVNIIFplcm8gd2FpdCBzdGF0ZQ0KLSAqICAgICAgICAgICBAYXJnIEZMQVNIX0xBVEVOQ1lfMTogIEZMQVNIIE9uZSB3YWl0IHN0YXRlDQotICogICAgICAgICAgIEBhcmcgRkxBU0hfTEFURU5DWV8yOiAgRkxBU0ggVHdvIHdhaXQgc3RhdGVzDQotICogICAgICAgICAgIEBhcmcgRkxBU0hfTEFURU5DWV8zOiAgRkxBU0ggVGhyZWUgd2FpdCBzdGF0ZXMNCi0gKiAgICAgICAgICAgQGFyZyBGTEFTSF9MQVRFTkNZXzQ6ICBGTEFTSCBGb3VyIHdhaXQgc3RhdGVzDQotICogICAgICAgICAgIEBhcmcgRkxBU0hfTEFURU5DWV81OiAgRkxBU0ggRml2ZSB3YWl0IHN0YXRlcw0KLSAqICAgICAgICAgICBAYXJnIEZMQVNIX0xBVEVOQ1lfNjogIEZMQVNIIFNpeCB3YWl0IHN0YXRlcw0KLSAqICAgICAgICAgICBAYXJnIEZMQVNIX0xBVEVOQ1lfNzogIEZMQVNIIFNldmVuIHdhaXQgc3RhdGVzDQotICogICAgICAgICAgIEBhcmcgRkxBU0hfTEFURU5DWV84OiAgRkxBU0ggRWlnaHQgd2FpdCBzdGF0ZXMNCi0gKiAgICAgICAgICAgQGFyZyBGTEFTSF9MQVRFTkNZXzk6ICBGTEFTSCBOaW5lIHdhaXQgc3RhdGVzDQotICogICAgICAgICAgIEBhcmcgRkxBU0hfTEFURU5DWV8xMDogRkxBU0ggVGVuIHdhaXQgc3RhdGUNCi0gKiAgICAgICAgICAgQGFyZyBGTEFTSF9MQVRFTkNZXzExOiBGTEFTSCBFbGV2ZW4gd2FpdCBzdGF0ZQ0KLSAqICAgICAgICAgICBAYXJnIEZMQVNIX0xBVEVOQ1lfMTI6IEZMQVNIIFR3ZWx2ZSB3YWl0IHN0YXRlcw0KLSAqICAgICAgICAgICBAYXJnIEZMQVNIX0xBVEVOQ1lfMTM6IEZMQVNIIFRoaXJ0ZWVuIHdhaXQgc3RhdGVzDQotICogICAgICAgICAgIEBhcmcgRkxBU0hfTEFURU5DWV8xNDogRkxBU0ggRm91cnRlZW4gd2FpdCBzdGF0ZXMNCi0gKiAgICAgICAgICAgQGFyZyBGTEFTSF9MQVRFTkNZXzE1OiBGTEFTSCBGaWZ0ZWVuIHdhaXQgc3RhdGVzDQotICovDQotI2RlZmluZSBfX0hBTF9GTEFTSF9HRVRfTEFURU5DWSgpIFJFQURfQklUKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9MQVRFTkNZKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIHRoZSBGTEFTSCBwcmVmZXRjaCBidWZmZXIuDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9GTEFTSF9QUkVGRVRDSF9CVUZGRVJfRU5BQkxFKCkgXA0KLSAgU0VUX0JJVChGTEFTSC0+QUNSLCBGTEFTSF9BQ1JfUFJGVEVOKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSB0aGUgRkxBU0ggcHJlZmV0Y2ggYnVmZmVyLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfRkxBU0hfUFJFRkVUQ0hfQlVGRkVSX0RJU0FCTEUoKSBcDQotICBDTEVBUl9CSVQoRkxBU0gtPkFDUiwgRkxBU0hfQUNSX1BSRlRFTikNCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSB0aGUgRkxBU0ggaW5zdHJ1Y3Rpb24gY2FjaGUuDQotICogQHJldHZhbCBub25lDQotICovDQotI2RlZmluZSBfX0hBTF9GTEFTSF9JTlNUUlVDVElPTl9DQUNIRV9FTkFCTEUoKSBcDQotICBTRVRfQklUKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9JQ0VOKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSB0aGUgRkxBU0ggaW5zdHJ1Y3Rpb24gY2FjaGUuDQotICogQHJldHZhbCBub25lDQotICovDQotI2RlZmluZSBfX0hBTF9GTEFTSF9JTlNUUlVDVElPTl9DQUNIRV9ESVNBQkxFKCkgXA0KLSAgQ0xFQVJfQklUKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9JQ0VOKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIHRoZSBGTEFTSCBkYXRhIGNhY2hlLg0KLSAqIEByZXR2YWwgbm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfRkxBU0hfREFUQV9DQUNIRV9FTkFCTEUoKSBTRVRfQklUKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9EQ0VOKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSB0aGUgRkxBU0ggZGF0YSBjYWNoZS4NCi0gKiBAcmV0dmFsIG5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX0ZMQVNIX0RBVEFfQ0FDSEVfRElTQUJMRSgpIENMRUFSX0JJVChGTEFTSC0+QUNSLCBGTEFTSF9BQ1JfRENFTikNCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJlc2V0IHRoZSBGTEFTSCBpbnN0cnVjdGlvbiBDYWNoZS4NCi0gKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSB1c2VkIG9ubHkgd2hlbiB0aGUgSW5zdHJ1Y3Rpb24gQ2FjaGUgaXMNCi0gKiBkaXNhYmxlZC4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX0ZMQVNIX0lOU1RSVUNUSU9OX0NBQ0hFX1JFU0VUKCkgXA0KLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIFNFVF9CSVQoRkxBU0gtPkFDUiwgRkxBU0hfQUNSX0lDUlNUKTsgICAgIFwNCi0gICAgQ0xFQVJfQklUKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9JQ1JTVCk7ICAgXA0KLSAgfSB3aGlsZSAoMCkNCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJlc2V0IHRoZSBGTEFTSCBkYXRhIENhY2hlLg0KLSAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIHVzZWQgb25seSB3aGVuIHRoZSBkYXRhIENhY2hlIGlzIGRpc2FibGVkLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfRkxBU0hfREFUQV9DQUNIRV9SRVNFVCgpICAgICAgXA0KLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBTRVRfQklUKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9EQ1JTVCk7ICAgXA0KLSAgICBDTEVBUl9CSVQoRkxBU0gtPkFDUiwgRkxBU0hfQUNSX0RDUlNUKTsgXA0KLSAgfSB3aGlsZSAoMCkNCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSB0aGUgRkxBU0ggcG93ZXIgZG93biBkdXJpbmcgTG93LXBvd2VyIHJ1biBtb2RlLg0KLSAqIEBub3RlICAgV3JpdGluZyB0aGlzIGJpdCB0byAxLCBhdXRvbWF0aWNhbGx5IHRoZSBrZXlzIGFyZQ0KLSAqICAgICAgICAgbG9zdCBhbmQgYSBuZXcgdW5sb2NrIHNlcXVlbmNlIGlzIG5lY2Vzc2FyeSB0byByZS13cml0ZSBpdCB0byAwLg0KLSAqLw0KLSNkZWZpbmUgX19IQUxfRkxBU0hfUE9XRVJfRE9XTl9FTkFCTEUoKSAgICAgXA0KLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBXUklURV9SRUcoRkxBU0gtPlBES0VZUiwgRkxBU0hfUERLRVkxKTsgXA0KLSAgICBXUklURV9SRUcoRkxBU0gtPlBES0VZUiwgRkxBU0hfUERLRVkyKTsgXA0KLSAgICBTRVRfQklUKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9SVU5fUEQpOyAgXA0KLSAgfSB3aGlsZSAoMCkNCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgdGhlIEZMQVNIIHBvd2VyIGRvd24gZHVyaW5nIExvdy1wb3dlciBydW4gbW9kZS4NCi0gKiBAbm90ZSAgIFdyaXRpbmcgdGhpcyBiaXQgdG8gMCwgYXV0b21hdGljYWxseSB0aGUga2V5cyBhcmUNCi0gKiAgICAgICAgIGxvc3QgYW5kIGEgbmV3IHVubG9jayBzZXF1ZW5jZSBpcyBuZWNlc3NhcnkgdG8gcmUtd3JpdGUgaXQgdG8gMS4NCi0gKi8NCi0jZGVmaW5lIF9fSEFMX0ZMQVNIX1BPV0VSX0RPV05fRElTQUJMRSgpICAgICBcDQotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBXUklURV9SRUcoRkxBU0gtPlBES0VZUiwgRkxBU0hfUERLRVkxKTsgIFwNCi0gICAgV1JJVEVfUkVHKEZMQVNILT5QREtFWVIsIEZMQVNIX1BES0VZMik7ICBcDQotICAgIENMRUFSX0JJVChGTEFTSC0+QUNSLCBGTEFTSF9BQ1JfUlVOX1BEKTsgXA0KLSAgfSB3aGlsZSAoMCkNCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSB0aGUgRkxBU0ggcG93ZXIgZG93biBkdXJpbmcgTG93LVBvd2VyIHNsZWVwIG1vZGUNCi0gKiBAcmV0dmFsIG5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX0ZMQVNIX1NMRUVQX1BPV0VSRE9XTl9FTkFCTEUoKSBcDQotICBTRVRfQklUKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9TTEVFUF9QRCkNCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgdGhlIEZMQVNIIHBvd2VyIGRvd24gZHVyaW5nIExvdy1Qb3dlciBzbGVlcCBtb2RlDQotICogQHJldHZhbCBub25lDQotICovDQotI2RlZmluZSBfX0hBTF9GTEFTSF9TTEVFUF9QT1dFUkRPV05fRElTQUJMRSgpIFwNCi0gIENMRUFSX0JJVChGTEFTSC0+QUNSLCBGTEFTSF9BQ1JfU0xFRVBfUEQpDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEZMQVNIX0ludGVycnVwdCBGTEFTSCBJbnRlcnJ1cHRzIE1hY3Jvcw0KLSAqICBAYnJpZWYgbWFjcm9zIHRvIGhhbmRsZSBGTEFTSCBpbnRlcnJ1cHRzDQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSB0aGUgc3BlY2lmaWVkIEZMQVNIIGludGVycnVwdC4NCi0gKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gRkxBU0ggaW50ZXJydXB0DQotICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICBAYXJnIEZMQVNIX0lUX0VPUDogRW5kIG9mIEZMQVNIIE9wZXJhdGlvbiBJbnRlcnJ1cHQNCi0gKiAgICAgQGFyZyBGTEFTSF9JVF9PUEVSUjogRXJyb3IgSW50ZXJydXB0DQotICogICAgIEBhcmcgRkxBU0hfSVRfUkRFUlI6IFBDUk9QIFJlYWQgRXJyb3IgSW50ZXJydXB0DQotICogICAgIEBhcmcgRkxBU0hfSVRfRUNDQzogRUNDIENvcnJlY3Rpb24gSW50ZXJydXB0DQotICogQHJldHZhbCBub25lDQotICovDQotI2RlZmluZSBfX0hBTF9GTEFTSF9FTkFCTEVfSVQoX19JTlRFUlJVUFRfXykgICAgICAgICAgICAgICAgICAgIFwNCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBpZiAoKChfX0lOVEVSUlVQVF9fKSAmIEZMQVNIX0lUX0VDQ0MpICE9IDBVKSB7ICAgICAgICAgICAgICBcDQotICAgICAgU0VUX0JJVChGTEFTSC0+RUNDUiwgRkxBU0hfRUNDUl9FQ0NJRSk7ICAgICAgICAgICAgICAgICAgIFwNCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBpZiAoKChfX0lOVEVSUlVQVF9fKSAmICh+RkxBU0hfSVRfRUNDQykpICE9IDBVKSB7ICAgICAgICAgICBcDQotICAgICAgU0VUX0JJVChGTEFTSC0+Q1IsICgoX19JTlRFUlJVUFRfXykgJiAofkZMQVNIX0lUX0VDQ0MpKSk7IFwNCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgfSB3aGlsZSAoMCkNCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgdGhlIHNwZWNpZmllZCBGTEFTSCBpbnRlcnJ1cHQuDQotICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIEZMQVNIIGludGVycnVwdA0KLSAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgQGFyZyBGTEFTSF9JVF9FT1A6IEVuZCBvZiBGTEFTSCBPcGVyYXRpb24gSW50ZXJydXB0DQotICogICAgIEBhcmcgRkxBU0hfSVRfT1BFUlI6IEVycm9yIEludGVycnVwdA0KLSAqICAgICBAYXJnIEZMQVNIX0lUX1JERVJSOiBQQ1JPUCBSZWFkIEVycm9yIEludGVycnVwdA0KLSAqICAgICBAYXJnIEZMQVNIX0lUX0VDQ0M6IEVDQyBDb3JyZWN0aW9uIEludGVycnVwdA0KLSAqIEByZXR2YWwgbm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfRkxBU0hfRElTQUJMRV9JVChfX0lOVEVSUlVQVF9fKSAgICAgICAgICAgICAgICAgICAgIFwNCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIGlmICgoKF9fSU5URVJSVVBUX18pICYgRkxBU0hfSVRfRUNDQykgIT0gMFUpIHsgICAgICAgICAgICAgICAgXA0KLSAgICAgIENMRUFSX0JJVChGTEFTSC0+RUNDUiwgRkxBU0hfRUNDUl9FQ0NJRSk7ICAgICAgICAgICAgICAgICAgIFwNCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIGlmICgoKF9fSU5URVJSVVBUX18pICYgKH5GTEFTSF9JVF9FQ0NDKSkgIT0gMFUpIHsgICAgICAgICAgICAgXA0KLSAgICAgIENMRUFSX0JJVChGTEFTSC0+Q1IsICgoX19JTlRFUlJVUFRfXykgJiAofkZMQVNIX0lUX0VDQ0MpKSk7IFwNCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICB9IHdoaWxlICgwKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIEZMQVNIIGZsYWcgaXMgc2V0IG9yIG5vdC4NCi0gKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgRkxBU0ggZmxhZyB0byBjaGVjay4NCi0gKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgIEBhcmcgRkxBU0hfRkxBR19FT1A6IEZMQVNIIEVuZCBvZiBPcGVyYXRpb24gZmxhZw0KLSAqICAgICBAYXJnIEZMQVNIX0ZMQUdfT1BFUlI6IEZMQVNIIE9wZXJhdGlvbiBlcnJvciBmbGFnDQotICogICAgIEBhcmcgRkxBU0hfRkxBR19QUk9HRVJSOiBGTEFTSCBQcm9ncmFtbWluZyBlcnJvciBmbGFnDQotICogICAgIEBhcmcgRkxBU0hfRkxBR19XUlBFUlI6IEZMQVNIIFdyaXRlIHByb3RlY3Rpb24gZXJyb3IgZmxhZw0KLSAqICAgICBAYXJnIEZMQVNIX0ZMQUdfUEdBRVJSOiBGTEFTSCBQcm9ncmFtbWluZyBhbGlnbm1lbnQgZXJyb3IgZmxhZw0KLSAqICAgICBAYXJnIEZMQVNIX0ZMQUdfU0laRVJSOiBGTEFTSCBTaXplIGVycm9yIGZsYWcNCi0gKiAgICAgQGFyZyBGTEFTSF9GTEFHX1BHU0VSUjogRkxBU0ggUHJvZ3JhbW1pbmcgc2VxdWVuY2UgZXJyb3IgZmxhZw0KLSAqICAgICBAYXJnIEZMQVNIX0ZMQUdfTUlTRVJSOiBGTEFTSCBGYXN0IHByb2dyYW1taW5nIGRhdGEgbWlzcyBlcnJvciBmbGFnDQotICogICAgIEBhcmcgRkxBU0hfRkxBR19GQVNURVJSOiBGTEFTSCBGYXN0IHByb2dyYW1taW5nIGVycm9yIGZsYWcNCi0gKiAgICAgQGFyZyBGTEFTSF9GTEFHX1JERVJSOiBGTEFTSCBQQ1JPUCByZWFkICBlcnJvciBmbGFnDQotICogICAgIEBhcmcgRkxBU0hfRkxBR19PUFRWRVJSOiBGTEFTSCBPcHRpb24gdmFsaWRpdHkgZXJyb3IgZmxhZw0KLSAqICAgICBAYXJnIEZMQVNIX0ZMQUdfQlNZOiBGTEFTSCB3cml0ZS9lcmFzZSBvcGVyYXRpb25zIGluIHByb2dyZXNzIGZsYWcNCi0gKiAgICAgQGFyZyBGTEFTSF9GTEFHX0VDQ0M6IEZMQVNIIG9uZSBFQ0MgZXJyb3IgaGFzIGJlZW4gZGV0ZWN0ZWQgYW5kIGNvcnJlY3RlZA0KLSAqIGluIDY0IExTQiBiaXRzDQotICogICAgIEBhcmcgRkxBU0hfRkxBR19FQ0NEOiBGTEFTSCB0d28gRUNDIGVycm9ycyBoYXZlIGJlZW4gZGV0ZWN0ZWQgaW4gNjQgTFNCDQotICogYml0cw0KLSAqICAgICBAYXJnIEZMQVNIX0ZMQUdfRUNDQzIoKik6IEZMQVNIIG9uZSBFQ0MgZXJyb3IgaGFzIGJlZW4gZGV0ZWN0ZWQgYW5kDQotICogY29ycmVjdGVkIGluIDY0IE1TQiBiaXRzIChtb2RlIDEyOCBiaXRzIG9ubHkpDQotICogICAgIEBhcmcgRkxBU0hfRkxBR19FQ0NEMigqKTogRkxBU0ggdHdvIEVDQyBlcnJvcnMgaGF2ZSBiZWVuIGRldGVjdGVkIGluIDY0DQotICogTVNCIGJpdHMgKG1vZGUgMTI4IGJpdHMgb25seSkNCi0gKiBAbm90ZSAgKCopIGF2YWlsYWJpbGl0eSBkZXBlbmRzIG9uIGRldmljZXMNCi0gKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgRkxBU0hfRkxBRyAoU0VUIG9yIFJFU0VUKS4NCi0gKi8NCi0jZGVmaW5lIF9fSEFMX0ZMQVNIX0dFVF9GTEFHKF9fRkxBR19fKSAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoKChfX0ZMQUdfXykgJiBGTEFTSF9GTEFHX0VDQ1JfRVJST1JTKSAhPSAwVSkgICAgICAgICAgIFwNCi0gICAgICAgPyAoUkVBRF9CSVQoRkxBU0gtPkVDQ1IsIChfX0ZMQUdfXykpID09IChfX0ZMQUdfXykpIFwNCi0gICAgICAgOiAoUkVBRF9CSVQoRkxBU0gtPlNSLCAoX19GTEFHX18pKSA9PSAoX19GTEFHX18pKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgIENsZWFyIHRoZSBGTEFTSCdzIHBlbmRpbmcgZmxhZ3MuDQotICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIEZMQVNIIGZsYWdzIHRvIGNsZWFyLg0KLSAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgQGFyZyBGTEFTSF9GTEFHX0VPUDogRkxBU0ggRW5kIG9mIE9wZXJhdGlvbiBmbGFnDQotICogICAgIEBhcmcgRkxBU0hfRkxBR19PUEVSUjogRkxBU0ggT3BlcmF0aW9uIGVycm9yIGZsYWcNCi0gKiAgICAgQGFyZyBGTEFTSF9GTEFHX1BST0dFUlI6IEZMQVNIIFByb2dyYW1taW5nIGVycm9yIGZsYWcNCi0gKiAgICAgQGFyZyBGTEFTSF9GTEFHX1dSUEVSUjogRkxBU0ggV3JpdGUgcHJvdGVjdGlvbiBlcnJvciBmbGFnDQotICogICAgIEBhcmcgRkxBU0hfRkxBR19QR0FFUlI6IEZMQVNIIFByb2dyYW1taW5nIGFsaWdubWVudCBlcnJvciBmbGFnDQotICogICAgIEBhcmcgRkxBU0hfRkxBR19TSVpFUlI6IEZMQVNIIFNpemUgZXJyb3IgZmxhZw0KLSAqICAgICBAYXJnIEZMQVNIX0ZMQUdfUEdTRVJSOiBGTEFTSCBQcm9ncmFtbWluZyBzZXF1ZW5jZSBlcnJvciBmbGFnDQotICogICAgIEBhcmcgRkxBU0hfRkxBR19NSVNFUlI6IEZMQVNIIEZhc3QgcHJvZ3JhbW1pbmcgZGF0YSBtaXNzIGVycm9yIGZsYWcNCi0gKiAgICAgQGFyZyBGTEFTSF9GTEFHX0ZBU1RFUlI6IEZMQVNIIEZhc3QgcHJvZ3JhbW1pbmcgZXJyb3IgZmxhZw0KLSAqICAgICBAYXJnIEZMQVNIX0ZMQUdfUkRFUlI6IEZMQVNIIFBDUk9QIHJlYWQgIGVycm9yIGZsYWcNCi0gKiAgICAgQGFyZyBGTEFTSF9GTEFHX09QVFZFUlI6IEZMQVNIIE9wdGlvbiB2YWxpZGl0eSBlcnJvciBmbGFnDQotICogICAgIEBhcmcgRkxBU0hfRkxBR19FQ0NDOiBGTEFTSCBvbmUgRUNDIGVycm9yIGhhcyBiZWVuIGRldGVjdGVkIGFuZCBjb3JyZWN0ZWQNCi0gKiBpbiA2NCBMU0IgYml0cw0KLSAqICAgICBAYXJnIEZMQVNIX0ZMQUdfRUNDRDogRkxBU0ggdHdvIEVDQyBlcnJvcnMgaGF2ZSBiZWVuIGRldGVjdGVkIGluIDY0IExTQg0KLSAqIGJpdHMNCi0gKiAgICAgQGFyZyBGTEFTSF9GTEFHX0VDQ0MyKCopOiBGTEFTSCBvbmUgRUNDIGVycm9yIGhhcyBiZWVuIGRldGVjdGVkIGFuZA0KLSAqIGNvcnJlY3RlZCBpbiA2NCBNU0IgYml0cyAobW9kZSAxMjggYml0cyBvbmx5KQ0KLSAqICAgICBAYXJnIEZMQVNIX0ZMQUdfRUNDRDIoKik6IEZMQVNIIHR3byBFQ0MgZXJyb3JzIGhhdmUgYmVlbiBkZXRlY3RlZCBpbiA2NA0KLSAqIE1TQiBiaXRzIChtb2RlIDEyOCBiaXRzIG9ubHkpDQotICogICAgIEBhcmcgRkxBU0hfRkxBR19TUl9FUlJPUlM6IEZMQVNIIEFsbCBTUiBlcnJvcnMgZmxhZ3MNCi0gKiAgICAgQGFyZyBGTEFTSF9GTEFHX0VDQ1JfRVJST1JTOiBGTEFTSCBBbGwgRUNDUiBlcnJvcnMgZmxhZ3MNCi0gKiBAbm90ZSAgKCopIGF2YWlsYWJpbGl0eSBkZXBlbmRzIG9uIGRldmljZXMNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX0ZMQVNIX0NMRUFSX0ZMQUcoX19GTEFHX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIGlmICgoKF9fRkxBR19fKSAmIEZMQVNIX0ZMQUdfRUNDUl9FUlJPUlMpICE9IDBVKSB7ICAgICAgICAgICAgICAgIFwNCi0gICAgICBTRVRfQklUKEZMQVNILT5FQ0NSLCAoKF9fRkxBR19fKSAmIEZMQVNIX0ZMQUdfRUNDUl9FUlJPUlMpKTsgICAgXA0KLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIGlmICgoKF9fRkxBR19fKSAmIH4oRkxBU0hfRkxBR19FQ0NSX0VSUk9SUykpICE9IDBVKSB7ICAgICAgICAgICAgIFwNCi0gICAgICBXUklURV9SRUcoRkxBU0gtPlNSLCAoKF9fRkxBR19fKSAmIH4oRkxBU0hfRkxBR19FQ0NSX0VSUk9SUykpKTsgXA0KLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICB9IHdoaWxlICgwKQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogSW5jbHVkZSBGTEFTSCBIQUwgRXh0ZW5kZWQgbW9kdWxlICovDQotI2luY2x1ZGUgInN0bTMyZzR4eF9oYWxfZmxhc2hfZXguaCINCi0jaW5jbHVkZSAic3RtMzJnNHh4X2hhbF9mbGFzaF9yYW1mdW5jLmgiDQotDQotLyogRXhwb3J0ZWQgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGRlZmdyb3VwIEZMQVNIX0V4cG9ydGVkX1ZhcmlhYmxlcyBGTEFTSCBFeHBvcnRlZCBWYXJpYWJsZXMNCi0gKiBAew0KLSAqLw0KLWV4dGVybiBGTEFTSF9Qcm9jZXNzVHlwZURlZiBwRmxhc2g7DQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAYWRkdG9ncm91cCBGTEFTSF9FeHBvcnRlZF9GdW5jdGlvbnMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qIFByb2dyYW0gb3BlcmF0aW9uIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyoqIEBhZGR0b2dyb3VwIEZMQVNIX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDENCi0gKiBAew0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9GTEFTSF9Qcm9ncmFtKHVpbnQzMl90IFR5cGVQcm9ncmFtLCB1aW50MzJfdCBBZGRyZXNzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IERhdGEpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9GTEFTSF9Qcm9ncmFtX0lUKHVpbnQzMl90IFR5cGVQcm9ncmFtLCB1aW50MzJfdCBBZGRyZXNzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IERhdGEpOw0KLS8qIEZMQVNIIElSUSBoYW5kbGVyIG1ldGhvZCAqLw0KLXZvaWQgSEFMX0ZMQVNIX0lSUUhhbmRsZXIodm9pZCk7DQotLyogQ2FsbGJhY2tzIGluIG5vbiBibG9ja2luZyBtb2RlcyAqLw0KLXZvaWQgSEFMX0ZMQVNIX0VuZE9mT3BlcmF0aW9uQ2FsbGJhY2sodWludDMyX3QgUmV0dXJuVmFsdWUpOw0KLXZvaWQgSEFMX0ZMQVNIX09wZXJhdGlvbkVycm9yQ2FsbGJhY2sodWludDMyX3QgUmV0dXJuVmFsdWUpOw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKiogQGFkZHRvZ3JvdXAgRkxBU0hfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMg0KLSAqIEB7DQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIX1VubG9jayh2b2lkKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfRkxBU0hfTG9jayh2b2lkKTsNCi0vKiBPcHRpb24gYnl0ZXMgY29udHJvbCAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9GTEFTSF9PQl9VbmxvY2sodm9pZCk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIX09CX0xvY2sodm9pZCk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIX09CX0xhdW5jaCh2b2lkKTsNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyoqIEBhZGR0b2dyb3VwIEZMQVNIX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMNCi0gKiBAew0KLSAqLw0KLXVpbnQzMl90IEhBTF9GTEFTSF9HZXRFcnJvcih2b2lkKTsNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBhZGR0b2dyb3VwIEZMQVNIX1ByaXZhdGVfRnVuY3Rpb25zDQotICogQHsNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbih1aW50MzJfdCBUaW1lb3V0KTsNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGRlZmdyb3VwIEZMQVNIX1ByaXZhdGVfQ29uc3RhbnRzIEZMQVNIIFByaXZhdGUgQ29uc3RhbnRzDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIEZMQVNIX1NJWkVfREFUQV9SRUdJU1RFUiBGTEFTSFNJWkVfQkFTRQ0KLQ0KLSNpZiBkZWZpbmVkKEZMQVNIX09QVFJfREJBTkspDQotI2RlZmluZSBGTEFTSF9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKCgoKCooKHVpbnQxNl90ICopRkxBU0hfU0laRV9EQVRBX1JFR0lTVEVSKSkgPT0gMHhGRkZGVSkpIFwNCi0gICAgICAgPyAoMHgyMDBVTCA8PCAxMFUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgIDogKCgoKigodWludDMyX3QgKilGTEFTSF9TSVpFX0RBVEFfUkVHSVNURVIpKSAmIDB4RkZGRlVMKSA8PCAxMFUpKQ0KLSNkZWZpbmUgRkxBU0hfQkFOS19TSVpFIChGTEFTSF9TSVpFID4+IDEpDQotI2RlZmluZSBGTEFTSF9QQUdFX05CIDEyOFUNCi0jZGVmaW5lIEZMQVNIX1BBR0VfU0laRV8xMjhfQklUUyAweDEwMDBVIC8qIDQgS0IgKi8NCi0jZWxzZQ0KLSNkZWZpbmUgRkxBU0hfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoKCgqKCh1aW50MTZfdCAqKUZMQVNIX1NJWkVfREFUQV9SRUdJU1RFUikpID09IDB4RkZGRlUpKSBcDQotICAgICAgID8gKDB4ODBVTCA8PCAxMFUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICA6ICgoKCooKHVpbnQzMl90ICopRkxBU0hfU0laRV9EQVRBX1JFR0lTVEVSKSkgJiAweEZGRkZVTCkgPDwgMTBVKSkNCi0jZGVmaW5lIEZMQVNIX0JBTktfU0laRSAoRkxBU0hfU0laRSkNCi0jZGVmaW5lIEZMQVNIX1BBR0VfTkIgICAgICAgICAgICAgICAgIFwNCi0gICgoRkxBU0hfU0laRSA9PSAweDAwMDgwMDAwVSkgPyAyNTZVIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoKEZMQVNIX1NJWkUgPT0gMHgwMDA0MDAwMFUpID8gMTI4VSA6IDY0VSkpDQotI2VuZGlmDQotDQotI2RlZmluZSBGTEFTSF9QQUdFX1NJWkUgMHg4MDBVIC8qIDIgS0IgKi8NCi0NCi0jZGVmaW5lIEZMQVNIX1RJTUVPVVRfVkFMVUUgMTAwMFUgLyogMSBzICAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGRlZmdyb3VwIEZMQVNIX1ByaXZhdGVfTWFjcm9zIEZMQVNIIFByaXZhdGUgTWFjcm9zDQotICogIEB7DQotICovDQotDQotI2RlZmluZSBJU19GTEFTSF9UWVBFRVJBU0UoVkFMVUUpIFwNCi0gICgoKFZBTFVFKSA9PSBGTEFTSF9UWVBFRVJBU0VfUEFHRVMpIHx8ICgoVkFMVUUpID09IEZMQVNIX1RZUEVFUkFTRV9NQVNTRVJBU0UpKQ0KLQ0KLSNpZiBkZWZpbmVkKEZMQVNIX09QVFJfREJBTkspDQotI2RlZmluZSBJU19GTEFTSF9CQU5LKEJBTkspICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKChCQU5LKSA9PSBGTEFTSF9CQU5LXzEpIHx8ICgoQkFOSykgPT0gRkxBU0hfQkFOS18yKSB8fCBcDQotICAgKChCQU5LKSA9PSBGTEFTSF9CQU5LX0JPVEgpKQ0KLQ0KLSNkZWZpbmUgSVNfRkxBU0hfQkFOS19FWENMVVNJVkUoQkFOSykgXA0KLSAgKCgoQkFOSykgPT0gRkxBU0hfQkFOS18xKSB8fCAoKEJBTkspID09IEZMQVNIX0JBTktfMikpDQotI2Vsc2UNCi0jZGVmaW5lIElTX0ZMQVNIX0JBTksoQkFOSykgKChCQU5LKSA9PSBGTEFTSF9CQU5LXzEpDQotDQotI2RlZmluZSBJU19GTEFTSF9CQU5LX0VYQ0xVU0lWRShCQU5LKSAoKEJBTkspID09IEZMQVNIX0JBTktfMSkNCi0jZW5kaWYNCi0NCi0jZGVmaW5lIElTX0ZMQVNIX1RZUEVQUk9HUkFNKFZBTFVFKSAgICAgICAgICAgICBcDQotICAoKChWQUxVRSkgPT0gRkxBU0hfVFlQRVBST0dSQU1fRE9VQkxFV09SRCkgfHwgXA0KLSAgICgoVkFMVUUpID09IEZMQVNIX1RZUEVQUk9HUkFNX0ZBU1QpIHx8ICAgICAgIFwNCi0gICAoKFZBTFVFKSA9PSBGTEFTSF9UWVBFUFJPR1JBTV9GQVNUX0FORF9MQVNUKSkNCi0NCi0jZGVmaW5lIElTX0ZMQVNIX01BSU5fTUVNX0FERFJFU1MoQUREUkVTUykgXA0KLSAgKCgoQUREUkVTUykgPj0gRkxBU0hfQkFTRSkgJiYgKChBRERSRVNTKSA8IChGTEFTSF9CQVNFICsgRkxBU0hfU0laRSkpKQ0KLQ0KLSNkZWZpbmUgSVNfRkxBU0hfT1RQX0FERFJFU1MoQUREUkVTUykgXA0KLSAgKCgoQUREUkVTUykgPj0gMHgxRkZGNzAwMFUpICYmICgoQUREUkVTUykgPD0gMHgxRkZGNzNGRlUpKQ0KLQ0KLSNkZWZpbmUgSVNfRkxBU0hfUFJPR1JBTV9BRERSRVNTKEFERFJFU1MpIFwNCi0gIChJU19GTEFTSF9NQUlOX01FTV9BRERSRVNTKEFERFJFU1MpIHx8IElTX0ZMQVNIX09UUF9BRERSRVNTKEFERFJFU1MpKQ0KLQ0KLSNkZWZpbmUgSVNfRkxBU0hfUEFHRShQQUdFKSAoKFBBR0UpIDwgRkxBU0hfUEFHRV9OQikNCi0NCi0jZGVmaW5lIElTX09QVElPTkJZVEUoVkFMVUUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoKFZBTFVFKSA8PSAoT1BUSU9OQllURV9XUlAgfCBPUFRJT05CWVRFX1JEUCB8IE9QVElPTkJZVEVfVVNFUiB8IFwNCi0gICAgICAgICAgICAgICAgT1BUSU9OQllURV9QQ1JPUCB8IE9QVElPTkJZVEVfQk9PVF9MT0NLIHwgT1BUSU9OQllURV9TRUMpKSkNCi0NCi0jaWYgZGVmaW5lZChGTEFTSF9PUFRSX0RCQU5LKQ0KLSNkZWZpbmUgSVNfT0JfV1JQQVJFQShWQUxVRSkgICAgICAgICAgICAgIFwNCi0gICgoKFZBTFVFKSA9PSBPQl9XUlBBUkVBX0JBTksxX0FSRUFBKSB8fCBcDQotICAgKChWQUxVRSkgPT0gT0JfV1JQQVJFQV9CQU5LMV9BUkVBQikgfHwgXA0KLSAgICgoVkFMVUUpID09IE9CX1dSUEFSRUFfQkFOSzJfQVJFQUEpIHx8ICgoVkFMVUUpID09IE9CX1dSUEFSRUFfQkFOSzJfQVJFQUIpKQ0KLSNlbHNlDQotI2RlZmluZSBJU19PQl9XUlBBUkVBKFZBTFVFKSBcDQotICAoKChWQUxVRSkgPT0gT0JfV1JQQVJFQV9CQU5LMV9BUkVBQSkgfHwgKChWQUxVRSkgPT0gT0JfV1JQQVJFQV9CQU5LMV9BUkVBQikpDQotI2VuZGlmDQotDQotI2RlZmluZSBJU19PQl9CT09UX0xPQ0soVkFMVUUpIFwNCi0gICgoKFZBTFVFKSA9PSBPQl9CT09UX0xPQ0tfRU5BQkxFKSB8fCAoKFZBTFVFKSA9PSBPQl9CT09UX0xPQ0tfRElTQUJMRSkpDQotDQotI2RlZmluZSBJU19PQl9SRFBfTEVWRUwoTEVWRUwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKChMRVZFTCkgPT0gT0JfUkRQX0xFVkVMXzApIHx8ICgoTEVWRUwpID09IE9CX1JEUF9MRVZFTF8xKSB8fCBcDQotICAgKChMRVZFTCkgPT0gT0JfUkRQX0xFVkVMXzIpKQ0KLQ0KLSNkZWZpbmUgSVNfT0JfVVNFUl9UWVBFKFRZUEUpICgoKFRZUEUpIDw9IDB4MUZGRkZVKSAmJiAoKFRZUEUpICE9IDBVKSkNCi0NCi0jZGVmaW5lIElTX09CX1VTRVJfQk9SX0xFVkVMKExFVkVMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoKExFVkVMKSA9PSBPQl9CT1JfTEVWRUxfMCkgfHwgKChMRVZFTCkgPT0gT0JfQk9SX0xFVkVMXzEpIHx8IFwNCi0gICAoKExFVkVMKSA9PSBPQl9CT1JfTEVWRUxfMikgfHwgKChMRVZFTCkgPT0gT0JfQk9SX0xFVkVMXzMpIHx8IFwNCi0gICAoKExFVkVMKSA9PSBPQl9CT1JfTEVWRUxfNCkpDQotDQotI2RlZmluZSBJU19PQl9VU0VSX1NUT1AoVkFMVUUpIFwNCi0gICgoKFZBTFVFKSA9PSBPQl9TVE9QX1JTVCkgfHwgKChWQUxVRSkgPT0gT0JfU1RPUF9OT1JTVCkpDQotDQotI2RlZmluZSBJU19PQl9VU0VSX1NUQU5EQlkoVkFMVUUpIFwNCi0gICgoKFZBTFVFKSA9PSBPQl9TVEFOREJZX1JTVCkgfHwgKChWQUxVRSkgPT0gT0JfU1RBTkRCWV9OT1JTVCkpDQotDQotI2RlZmluZSBJU19PQl9VU0VSX1NIVVRET1dOKFZBTFVFKSBcDQotICAoKChWQUxVRSkgPT0gT0JfU0hVVERPV05fUlNUKSB8fCAoKFZBTFVFKSA9PSBPQl9TSFVURE9XTl9OT1JTVCkpDQotDQotI2RlZmluZSBJU19PQl9VU0VSX0lXREcoVkFMVUUpIFwNCi0gICgoKFZBTFVFKSA9PSBPQl9JV0RHX0hXKSB8fCAoKFZBTFVFKSA9PSBPQl9JV0RHX1NXKSkNCi0NCi0jZGVmaW5lIElTX09CX1VTRVJfSVdER19TVE9QKFZBTFVFKSBcDQotICAoKChWQUxVRSkgPT0gT0JfSVdER19TVE9QX0ZSRUVaRSkgfHwgKChWQUxVRSkgPT0gT0JfSVdER19TVE9QX1JVTikpDQotDQotI2RlZmluZSBJU19PQl9VU0VSX0lXREdfU1REQlkoVkFMVUUpIFwNCi0gICgoKFZBTFVFKSA9PSBPQl9JV0RHX1NUREJZX0ZSRUVaRSkgfHwgKChWQUxVRSkgPT0gT0JfSVdER19TVERCWV9SVU4pKQ0KLQ0KLSNkZWZpbmUgSVNfT0JfVVNFUl9XV0RHKFZBTFVFKSBcDQotICAoKChWQUxVRSkgPT0gT0JfV1dER19IVykgfHwgKChWQUxVRSkgPT0gT0JfV1dER19TVykpDQotDQotI2lmIGRlZmluZWQoRkxBU0hfT1BUUl9EQkFOSykNCi0jZGVmaW5lIElTX09CX1VTRVJfQkZCMihWQUxVRSkgXA0KLSAgKCgoVkFMVUUpID09IE9CX0JGQjJfRElTQUJMRSkgfHwgKChWQUxVRSkgPT0gT0JfQkZCMl9FTkFCTEUpKQ0KLQ0KLSNkZWZpbmUgSVNfT0JfVVNFUl9EQkFOSyhWQUxVRSkgXA0KLSAgKCgoVkFMVUUpID09IE9CX0RCQU5LXzEyOF9CSVRTKSB8fCAoKFZBTFVFKSA9PSBPQl9EQkFOS182NF9CSVRTKSkNCi0jZW5kaWYNCi0NCi0jaWYgZGVmaW5lZChGTEFTSF9PUFRSX1BCNF9QVVBFTikNCi0jZGVmaW5lIElTX09CX1VTRVJfUEI0X1BVUEVOKFZBTFVFKSBcDQotICAoKChWQUxVRSkgPT0gT0JfUEI0X1BVUEVOX0RJU0FCTEUpIHx8ICgoVkFMVUUpID09IE9CX1BCNF9QVVBFTl9FTkFCTEUpKQ0KLSNlbmRpZg0KLQ0KLSNkZWZpbmUgSVNfT0JfVVNFUl9CT09UMShWQUxVRSkgXA0KLSAgKCgoVkFMVUUpID09IE9CX0JPT1QxX1NSQU0pIHx8ICgoVkFMVUUpID09IE9CX0JPT1QxX1NZU1RFTSkpDQotDQotI2RlZmluZSBJU19PQl9VU0VSX1NSQU1fUEFSSVRZKFZBTFVFKSBcDQotICAoKChWQUxVRSkgPT0gT0JfU1JBTV9QQVJJVFlfRU5BQkxFKSB8fCAoKFZBTFVFKSA9PSBPQl9TUkFNX1BBUklUWV9ESVNBQkxFKSkNCi0NCi0jZGVmaW5lIElTX09CX1VTRVJfQ0NNU1JBTV9SU1QoVkFMVUUpIFwNCi0gICgoKFZBTFVFKSA9PSBPQl9DQ01TUkFNX1JTVF9FUkFTRSkgfHwgKChWQUxVRSkgPT0gT0JfQ0NNU1JBTV9SU1RfTk9UX0VSQVNFKSkNCi0NCi0jZGVmaW5lIElTX09CX1VTRVJfU1dCT09UMChWQUxVRSkgXA0KLSAgKCgoVkFMVUUpID09IE9CX0JPT1QwX0ZST01fT0IpIHx8ICgoVkFMVUUpID09IE9CX0JPT1QwX0ZST01fUElOKSkNCi0NCi0jZGVmaW5lIElTX09CX1VTRVJfQk9PVDAoVkFMVUUpIFwNCi0gICgoKFZBTFVFKSA9PSBPQl9uQk9PVDBfUkVTRVQpIHx8ICgoVkFMVUUpID09IE9CX25CT09UMF9TRVQpKQ0KLQ0KLSNkZWZpbmUgSVNfT0JfVVNFUl9OUlNUX01PREUoVkFMVUUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKCgoVkFMVUUpID09IE9CX05SU1RfTU9ERV9HUElPKSB8fCAoKFZBTFVFKSA9PSBPQl9OUlNUX01PREVfSU5QVVRfT05MWSkgfHwgXA0KLSAgICgoVkFMVUUpID09IE9CX05SU1RfTU9ERV9JTlBVVF9PVVRQVVQpKQ0KLQ0KLSNkZWZpbmUgSVNfT0JfVVNFUl9JUkhFTihWQUxVRSkgXA0KLSAgKCgoVkFMVUUpID09IE9CX0lSSF9FTkFCTEUpIHx8ICgoVkFMVUUpID09IE9CX0lSSF9ESVNBQkxFKSkNCi0NCi0jZGVmaW5lIElTX09CX1BDUk9QX1JEUChWQUxVRSkgXA0KLSAgKCgoVkFMVUUpID09IE9CX1BDUk9QX1JEUF9OT1RfRVJBU0UpIHx8ICgoVkFMVUUpID09IE9CX1BDUk9QX1JEUF9FUkFTRSkpDQotDQotI2RlZmluZSBJU19PQl9TRUNNRU1fU0laRShWQUxVRSkgKChWQUxVRSkgPD0gRkxBU0hfUEFHRV9OQikNCi0NCi0jZGVmaW5lIElTX0ZMQVNIX0xBVEVOQ1koTEFURU5DWSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKCgoTEFURU5DWSkgPT0gRkxBU0hfTEFURU5DWV8wKSB8fCAoKExBVEVOQ1kpID09IEZMQVNIX0xBVEVOQ1lfMSkgfHwgICBcDQotICAgKChMQVRFTkNZKSA9PSBGTEFTSF9MQVRFTkNZXzIpIHx8ICgoTEFURU5DWSkgPT0gRkxBU0hfTEFURU5DWV8zKSB8fCAgIFwNCi0gICAoKExBVEVOQ1kpID09IEZMQVNIX0xBVEVOQ1lfNCkgfHwgKChMQVRFTkNZKSA9PSBGTEFTSF9MQVRFTkNZXzUpIHx8ICAgXA0KLSAgICgoTEFURU5DWSkgPT0gRkxBU0hfTEFURU5DWV82KSB8fCAoKExBVEVOQ1kpID09IEZMQVNIX0xBVEVOQ1lfNykgfHwgICBcDQotICAgKChMQVRFTkNZKSA9PSBGTEFTSF9MQVRFTkNZXzgpIHx8ICgoTEFURU5DWSkgPT0gRkxBU0hfTEFURU5DWV85KSB8fCAgIFwNCi0gICAoKExBVEVOQ1kpID09IEZMQVNIX0xBVEVOQ1lfMTApIHx8ICgoTEFURU5DWSkgPT0gRkxBU0hfTEFURU5DWV8xMSkgfHwgXA0KLSAgICgoTEFURU5DWSkgPT0gRkxBU0hfTEFURU5DWV8xMikgfHwgKChMQVRFTkNZKSA9PSBGTEFTSF9MQVRFTkNZXzEzKSB8fCBcDQotICAgKChMQVRFTkNZKSA9PSBGTEFTSF9MQVRFTkNZXzE0KSB8fCAoKExBVEVOQ1kpID09IEZMQVNIX0xBVEVOQ1lfMTUpKQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLSNpZmRlZiBfX2NwbHVzcGx1cw0KLX0NCi0jZW5kaWYNCi0NCi0jZW5kaWYgLyogU1RNMzJHNHh4X0hBTF9GTEFTSF9IICovDQorLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAZmlsZSAgICBzdG0zMmc0eHhfaGFsX2ZsYXNoLmgKKyAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBGTEFTSCBIQUwgbW9kdWxlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGF0dGVudGlvbgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGVybXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZQorICppbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb2Z0d2FyZSBjb21wb25lbnQuIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcworICp3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyRzR4eF9IQUxfRkxBU0hfSAorI2RlZmluZSBTVE0zMkc0eHhfSEFMX0ZMQVNIX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzR4eF9oYWxfZGVmLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkc0eHhfSEFMX0RyaXZlcgorICogQHsKKyAqLworCisvKiogQGFkZHRvZ3JvdXAgRkxBU0gKKyAqIEB7CisgKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRkxBU0hfRXhwb3J0ZWRfVHlwZXMgRkxBU0ggRXhwb3J0ZWQgVHlwZXMKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgIEZMQVNIIEVyYXNlIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDMyX3QKKyAgICAgIFR5cGVFcmFzZTsgIC8qITwgTWFzcyBlcmFzZSBvciBwYWdlIGVyYXNlLgorICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEZMQVNIX1R5cGVfRXJhc2UgKi8KKyAgdWludDMyX3QgQmFua3M7IC8qITwgU2VsZWN0IGJhbmsgdG8gZXJhc2UuCisgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBvZiBAcmVmIEZMQVNIX0JhbmtzCisgICAgICAgICAgICAgICAgICAgICAgIChGTEFTSF9CQU5LX0JPVEggc2hvdWxkIGJlIHVzZWQgb25seSBmb3IgbWFzcyBlcmFzZSkgKi8KKyAgdWludDMyX3QgUGFnZTsgIC8qITwgSW5pdGlhbCBGbGFzaCBwYWdlIHRvIGVyYXNlIHdoZW4gcGFnZSBlcmFzZSBpcyBkaXNhYmxlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMCBhbmQgKG1heCBudW1iZXIKKyAgICAgICAgICAgICAgICAgICAgIG9mIHBhZ2VzIGluIHRoZSBiYW5rIC0gMSkgIChlZyA6IDEyNyBmb3IgNTEyS0IgZHVhbCBiYW5rKSAqLworICB1aW50MzJfdCBOYlBhZ2VzOyAvKiE8IE51bWJlciBvZiBwYWdlcyB0byBiZSBlcmFzZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMSBhbmQgKG1heAorICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgb2YgcGFnZXMgaW4gdGhlIGJhbmsgLSB2YWx1ZSBvZiBpbml0aWFsIHBhZ2UpKi8KK30gRkxBU0hfRXJhc2VJbml0VHlwZURlZjsKKworLyoqCisgKiBAYnJpZWYgIEZMQVNIIE9wdGlvbiBCeXRlcyBQcm9ncmFtIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDMyX3QgT3B0aW9uVHlwZTsgLyohPCBPcHRpb24gYnl0ZSB0byBiZSBjb25maWd1cmVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSB2YWx1ZXMgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBGTEFTSF9PQl9UeXBlICovCisgIHVpbnQzMl90IFdSUEFyZWE7ICAgIC8qITwgV3JpdGUgcHJvdGVjdGlvbiBhcmVhIHRvIGJlIHByb2dyYW1tZWQgKHVzZWQgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9QVElPTkJZVEVfV1JQKS4gICAgT25seSBvbmUgV1JQIGFyZWEgY291bGQgYmUgcHJvZ3JhbW1lZAorICAgICAgICAgICAgICAgICAgICAgICAgICBhdCAgICB0aGUgc2FtZSB0aW1lLiAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgdmFsdWUgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiAgICBGTEFTSF9PQl9XUlBfQXJlYSAqLworICB1aW50MzJfdAorICAgICAgV1JQU3RhcnRPZmZzZXQ7IC8qITwgV3JpdGUgcHJvdGVjdGlvbiBzdGFydCBvZmZzZXQgKHVzZWQgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgT1BUSU9OQllURV9XUlApLiBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbgorICAgICAgICAgICAgICAgICAgICAgICAgIDAgYW5kIChtYXggbnVtYmVyIG9mIHBhZ2VzIGluIHRoZSBiYW5rIC0gMSkgKi8KKyAgdWludDMyX3QKKyAgICAgIFdSUEVuZE9mZnNldDsgIC8qITwgV3JpdGUgcHJvdGVjdGlvbiBlbmQgb2Zmc2V0ICh1c2VkIGZvciBPUFRJT05CWVRFX1dSUCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIFdSUFN0YXJ0T2Zmc2V0CisgICAgICAgICAgICAgICAgICAgICAgICBhbmQgKG1heCBudW1iZXIgb2YgcGFnZXMgaW4gdGhlIGJhbmsgLSAxKSAqLworICB1aW50MzJfdCBSRFBMZXZlbDsgLyohPCBTZXQgdGhlIHJlYWQgcHJvdGVjdGlvbiBsZXZlbC4uICh1c2VkIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgT1BUSU9OQllURV9SRFApLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgICBGTEFTSF9PQl9SZWFkX1Byb3RlY3Rpb24gKi8KKyAgdWludDMyX3QgVVNFUlR5cGU7IC8qITwgVXNlciBvcHRpb24gYnl0ZShzKSB0byBiZSBjb25maWd1cmVkICh1c2VkIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgT1BUSU9OQllURV9VU0VSKS4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YKKyAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgRkxBU0hfT0JfVVNFUl9UeXBlICovCisgIHVpbnQzMl90CisgICAgICBVU0VSQ29uZmlnOyAvKiE8IFZhbHVlIG9mIHRoZSB1c2VyIG9wdGlvbiBieXRlICh1c2VkIGZvciBPUFRJT05CWVRFX1VTRVIpLgorICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgICBGTEFTSF9PQl9VU0VSX0JPUl9MRVZFTCwKKyAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBGTEFTSF9PQl9VU0VSX25SU1RfU1RPUCwgQHJlZgorICAgICAgICAgICAgICAgICAgICAgRkxBU0hfT0JfVVNFUl9uUlNUX1NUQU5EQlksCisgICAgICAgICAgICAgICAgICAgICAgIEByZWYgRkxBU0hfT0JfVVNFUl9uUlNUX1NIVVRET1dOLCBAcmVmCisgICAgICAgICAgICAgICAgICAgICBGTEFTSF9PQl9VU0VSX0lXREdfU1csCisgICAgICAgICAgICAgICAgICAgICAgIEByZWYgRkxBU0hfT0JfVVNFUl9JV0RHX1NUT1AsIEByZWYKKyAgICAgICAgICAgICAgICAgICAgIEZMQVNIX09CX1VTRVJfSVdER19TVEFOREJZLAorICAgICAgICAgICAgICAgICAgICAgICBAcmVmIEZMQVNIX09CX1VTRVJfV1dER19TVywgQHJlZiBGTEFTSF9PQl9VU0VSX0JGQjIgKCopLAorICAgICAgICAgICAgICAgICAgICAgICBAcmVmIEZMQVNIX09CX1VTRVJfbkJPT1QxLCBAcmVmIEZMQVNIX09CX1VTRVJfU1JBTV9QRSwKKyAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBGTEFTSF9PQl9VU0VSX0NDTVNSQU1fUlNUCisgICAgICAgICAgICAgICAgICAgICAgIEBub3RlICgqKSBhdmFpbGFiaWxpdHkgZGVwZW5kcyBvbiBkZXZpY2VzICovCisgIHVpbnQzMl90CisgICAgICBQQ1JPUENvbmZpZzsgLyohPCBDb25maWd1cmF0aW9uIG9mIHRoZSBQQ1JPUCAodXNlZCBmb3IgT1BUSU9OQllURV9QQ1JPUCkuCisgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgY29tYmluYXRpb24gb2YgQHJlZiBGTEFTSF9CYW5rcworICAgICAgICAgICAgICAgICAgICAgIChleGNlcHQgRkxBU0hfQkFOS19CT1RIKSBhbmQgQHJlZiBGTEFTSF9PQl9QQ1JPUF9SRFAgKi8KKyAgdWludDMyX3QKKyAgICAgIFBDUk9QU3RhcnRBZGRyOyAgICAgIC8qITwgUENST1AgU3RhcnQgYWRkcmVzcyAodXNlZCBmb3IgT1BUSU9OQllURV9QQ1JPUCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIGJlZ2luIGFuZCBlbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIGJhbmsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gQmUgY2FyZWZ1bCBvZiB0aGUgYmFuayBzd2FwcGluZyBmb3IgdGhlIGFkZHJlc3MgKi8KKyAgdWludDMyX3QgUENST1BFbmRBZGRyOyAgIC8qITwgUENST1AgRW5kIGFkZHJlc3MgKHVzZWQgZm9yIE9QVElPTkJZVEVfUENST1ApLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiBQQ1JPUCBTdGFydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyBhbmQgZW5kIG9mIGJhbmsgKi8KKyAgdWludDMyX3QgQm9vdEVudHJ5UG9pbnQ7IC8qITwgU2V0IHRoZSBCb290IExvY2sgKHVzZWQgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUFRJT05CWVRFX0JPT1RfTE9DSykuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBvZiBAcmVmIEZMQVNIX09CX0Jvb3RfTG9jayAqLworICB1aW50MzJfdCBTZWNCYW5rOyAvKiE8IEJhbmsgb2Ygc2VjdXJhYmxlIG1lbW9yeSBhcmVhIHRvIGJlIHByb2dyYW1tZWQgKHVzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgZm9yIE9QVElPTkJZVEVfU0VDKS4gT25seSBvbmUgc2VjdXJhYmxlIG1lbW9yeSBhcmVhIGNvdWxkCisgICAgICAgICAgICAgICAgICAgICAgIGJlIHByb2dyYW1tZWQgYXQgdGhlIHNhbWUgdGltZS4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZQorICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogRkxBU0hfQkFOS18xOiBTZWN1cmFibGUgbWVtb3J5CisgICAgICAgICAgICAgICAgICAgICAgIGFyZWEgdG8gYmUgcHJvZ3JhbW1lZCBpbiBiYW5rIDEgRkxBU0hfQkFOS18yOiBTZWN1cmFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5IGFyZWEgdG8gYmUgcHJvZ3JhbW1lZCBpbiBiYW5rIDIgKCopCisgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgKCopIGF2YWlsYWJpbGl0eSBkZXBlbmRzIG9uIGRldmljZXMgKi8KKyAgdWludDMyX3QgU2VjU2l6ZTsgLyohPCBTaXplIG9mIHNlY3VyYWJsZSBtZW1vcnkgYXJlYSB0byBiZSBwcm9ncmFtbWVkICh1c2VkCisgICAgICAgICAgICAgICAgICAgICAgIGZvciBPUFRJT05CWVRFX1NFQyksIGluIG51bWJlciBvZiBwYWdlcy4gU2VjdXJhYmxlIG1lbW9yeQorICAgICAgICAgICAgICAgICAgICAgICBhcmVhIGlzIHN0YXJ0aW5nIGZyb20gZmlyc3QgcGFnZSBvZiB0aGUgYmFuay4gT25seSBvbmUKKyAgICAgICAgICAgICAgICAgICAgICAgc2VjdXJhYmxlIG1lbW9yeSBjb3VsZCBiZSBwcm9ncmFtbWVkIGF0IHRoZSBzYW1lIHRpbWUuCisgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMCBhbmQgKG1heAorICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgb2YgcGFnZXMgaW4gdGhlIGJhbmsgLSAxKSAqLworfSBGTEFTSF9PQlByb2dyYW1Jbml0VHlwZURlZjsKKworLyoqCisgKiBAYnJpZWYgIEZMQVNIIFByb2NlZHVyZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICovCit0eXBlZGVmIGVudW0geworICBGTEFTSF9QUk9DX05PTkUgPSAwLAorICBGTEFTSF9QUk9DX1BBR0VfRVJBU0UsCisgIEZMQVNIX1BST0NfTUFTU19FUkFTRSwKKyAgRkxBU0hfUFJPQ19QUk9HUkFNLAorICBGTEFTSF9QUk9DX1BST0dSQU1fTEFTVAorfSBGTEFTSF9Qcm9jZWR1cmVUeXBlRGVmOworCisvKioKKyAqIEBicmllZiAgRkxBU0ggQ2FjaGUgc3RydWN0dXJlIGRlZmluaXRpb24KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgRkxBU0hfQ0FDSEVfRElTQUJMRUQgPSAwLAorICBGTEFTSF9DQUNIRV9JQ0FDSEVfRU5BQkxFRCwKKyAgRkxBU0hfQ0FDSEVfRENBQ0hFX0VOQUJMRUQsCisgIEZMQVNIX0NBQ0hFX0lDQUNIRV9EQ0FDSEVfRU5BQkxFRAorfSBGTEFTSF9DYWNoZVR5cGVEZWY7CisKKy8qKgorICogQGJyaWVmICBGTEFTSCBoYW5kbGUgU3RydWN0dXJlIGRlZmluaXRpb24KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBIQUxfTG9ja1R5cGVEZWYgTG9jazsgICAgLyogRkxBU0ggbG9ja2luZyBvYmplY3QgKi8KKyAgX19JTyB1aW50MzJfdCBFcnJvckNvZGU7IC8qIEZMQVNIIGVycm9yIGNvZGUgKi8KKyAgX19JTyBGTEFTSF9Qcm9jZWR1cmVUeXBlRGVmCisgICAgICBQcm9jZWR1cmVPbkdvaW5nOyAgLyogSW50ZXJuYWwgdmFyaWFibGUgdG8gaW5kaWNhdGUgd2hpY2ggcHJvY2VkdXJlIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25nb2luZyBvciBub3QgaW4gSVQgY29udGV4dCAqLworICBfX0lPIHVpbnQzMl90IEFkZHJlc3M7IC8qIEludGVybmFsIHZhcmlhYmxlIHRvIHNhdmUgYWRkcmVzcyBzZWxlY3RlZCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmFtIGluIElUIGNvbnRleHQgKi8KKyAgX19JTyB1aW50MzJfdCBCYW5rOyAvKiBJbnRlcm5hbCB2YXJpYWJsZSB0byBzYXZlIGN1cnJlbnQgYmFuayBzZWxlY3RlZCBkdXJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICBlcmFzZSBpbiBJVCBjb250ZXh0ICovCisgIF9fSU8gdWludDMyX3QgUGFnZTsgLyogSW50ZXJuYWwgdmFyaWFibGUgdG8gZGVmaW5lIHRoZSBjdXJyZW50IHBhZ2Ugd2hpY2ggaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICBlcmFzaW5nIGluIElUIGNvbnRleHQgKi8KKyAgX19JTyB1aW50MzJfdCBOYlBhZ2VzVG9FcmFzZTsgLyogSW50ZXJuYWwgdmFyaWFibGUgdG8gc2F2ZSB0aGUgcmVtYWluaW5nIHBhZ2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGVyYXNlIGluIElUIGNvbnRleHQgKi8KKyAgX19JTyBGTEFTSF9DYWNoZVR5cGVEZWYKKyAgICAgIENhY2hlVG9SZWFjdGl2YXRlOyAvKiBJbnRlcm5hbCB2YXJpYWJsZSB0byBpbmRpY2F0ZSB3aGljaCBjYWNoZXMgc2hvdWxkIGJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhY3RpdmF0ZWQgKi8KK30gRkxBU0hfUHJvY2Vzc1R5cGVEZWY7CisKKy8qKgorICogQH0KKyAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBGTEFTSF9FeHBvcnRlZF9Db25zdGFudHMgRkxBU0ggRXhwb3J0ZWQgQ29uc3RhbnRzCisgKiBAeworICovCisKKy8qKiBAZGVmZ3JvdXAgRkxBU0hfRXJyb3IgRkxBU0ggRXJyb3IKKyAqIEB7CisgKi8KKyNkZWZpbmUgSEFMX0ZMQVNIX0VSUk9SX05PTkUgMHgwMDAwMDAwMFUKKyNkZWZpbmUgSEFMX0ZMQVNIX0VSUk9SX09QIEZMQVNIX0ZMQUdfT1BFUlIKKyNkZWZpbmUgSEFMX0ZMQVNIX0VSUk9SX1BST0cgRkxBU0hfRkxBR19QUk9HRVJSCisjZGVmaW5lIEhBTF9GTEFTSF9FUlJPUl9XUlAgRkxBU0hfRkxBR19XUlBFUlIKKyNkZWZpbmUgSEFMX0ZMQVNIX0VSUk9SX1BHQSBGTEFTSF9GTEFHX1BHQUVSUgorI2RlZmluZSBIQUxfRkxBU0hfRVJST1JfU0laIEZMQVNIX0ZMQUdfU0laRVJSCisjZGVmaW5lIEhBTF9GTEFTSF9FUlJPUl9QR1MgRkxBU0hfRkxBR19QR1NFUlIKKyNkZWZpbmUgSEFMX0ZMQVNIX0VSUk9SX01JUyBGTEFTSF9GTEFHX01JU0VSUgorI2RlZmluZSBIQUxfRkxBU0hfRVJST1JfRkFTVCBGTEFTSF9GTEFHX0ZBU1RFUlIKKyNkZWZpbmUgSEFMX0ZMQVNIX0VSUk9SX1JEIEZMQVNIX0ZMQUdfUkRFUlIKKyNkZWZpbmUgSEFMX0ZMQVNIX0VSUk9SX09QVFYgRkxBU0hfRkxBR19PUFRWRVJSCisjZGVmaW5lIEhBTF9GTEFTSF9FUlJPUl9FQ0NDIEZMQVNIX0ZMQUdfRUNDQworI2RlZmluZSBIQUxfRkxBU0hfRVJST1JfRUNDRCBGTEFTSF9GTEFHX0VDQ0QKKyNpZiBkZWZpbmVkKEZMQVNIX09QVFJfREJBTkspCisjZGVmaW5lIEhBTF9GTEFTSF9FUlJPUl9FQ0NDMiBGTEFTSF9GTEFHX0VDQ0MyCisjZGVmaW5lIEhBTF9GTEFTSF9FUlJPUl9FQ0NEMiBGTEFTSF9GTEFHX0VDQ0QyCisjZW5kaWYKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEZMQVNIX1R5cGVfRXJhc2UgRkxBU0ggRXJhc2UgVHlwZQorICogQHsKKyAqLworI2RlZmluZSBGTEFTSF9UWVBFRVJBU0VfUEFHRVMgMHgwMFUgICAgIC8qITxQYWdlcyBlcmFzZSBvbmx5Ki8KKyNkZWZpbmUgRkxBU0hfVFlQRUVSQVNFX01BU1NFUkFTRSAweDAxVSAvKiE8Rmxhc2ggbWFzcyBlcmFzZSBhY3RpdmF0aW9uKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEZMQVNIX0JhbmtzIEZMQVNIIEJhbmtzCisgKiBAeworICovCisjZGVmaW5lIEZMQVNIX0JBTktfMSAweDAwMDAwMDAxVSAvKiE8IEJhbmsgMSAgICovCisjaWYgZGVmaW5lZChGTEFTSF9PUFRSX0RCQU5LKQorI2RlZmluZSBGTEFTSF9CQU5LXzIgMHgwMDAwMDAwMlUgICAgICAgICAgICAgICAgICAgICAgLyohPCBCYW5rIDIgICAqLworI2RlZmluZSBGTEFTSF9CQU5LX0JPVEggKEZMQVNIX0JBTktfMSB8IEZMQVNIX0JBTktfMikgLyohPCBCYW5rMSBhbmQgQmFuazIgICovCisjZWxzZQorI2RlZmluZSBGTEFTSF9CQU5LX0JPVEggRkxBU0hfQkFOS18xIC8qITwgQmFuayAxICAgKi8KKyNlbmRpZgorLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgRkxBU0hfVHlwZV9Qcm9ncmFtIEZMQVNIIFByb2dyYW0gVHlwZQorICogQHsKKyAqLworI2RlZmluZSBGTEFTSF9UWVBFUFJPR1JBTV9ET1VCTEVXT1JEIFwKKyAgMHgwMFUgLyohPCBQcm9ncmFtIGEgZG91YmxlLXdvcmQgKDY0LWJpdCkgYXQgYSBzcGVjaWZpZWQgYWRkcmVzcy4qLworI2RlZmluZSBGTEFTSF9UWVBFUFJPR1JBTV9GQVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwMVUgLyohPCBGYXN0IHByb2dyYW0gYSAzMiByb3cgZG91YmxlLXdvcmQgKDY0LWJpdCkgYXQgYSBzcGVjaWZpZWQgICAgICAgICBcCisgICAgICAgICAgIGFkZHJlc3MuIEFuZCBhbm90aGVyIDMyIHJvdyBkb3VibGUtd29yZCAoNjQtYml0KSB3aWxsIGJlIHByb2dyYW1tZWQgXAorICAgICAgICAgKi8KKyNkZWZpbmUgRkxBU0hfVFlQRVBST0dSQU1fRkFTVF9BTkRfTEFTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAweDAyVSAvKiE8IEZhc3QgcHJvZ3JhbSBhIDMyIHJvdyBkb3VibGUtd29yZCAoNjQtYml0KSBhdCBhIHNwZWNpZmllZCBcCisgICAgICAgICAgIGFkZHJlc3MuIEFuZCB0aGlzIGlzIHRoZSBsYXN0IDMyIHJvdyBkb3VibGUtd29yZCAoNjQtYml0KSAgIFwKKyAgICAgICAgICAgcHJvZ3JhbW1lZCAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgRkxBU0hfT0JfVHlwZSBGTEFTSCBPcHRpb24gQnl0ZXMgVHlwZQorICogQHsKKyAqLworI2RlZmluZSBPUFRJT05CWVRFX1dSUCAweDAxVSAgICAgICAvKiE8IFdSUCBvcHRpb24gYnl0ZSBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIE9QVElPTkJZVEVfUkRQIDB4MDJVICAgICAgIC8qITwgUkRQIG9wdGlvbiBieXRlIGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgT1BUSU9OQllURV9VU0VSIDB4MDRVICAgICAgLyohPCBVU0VSIG9wdGlvbiBieXRlIGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgT1BUSU9OQllURV9QQ1JPUCAweDA4VSAgICAgLyohPCBQQ1JPUCBvcHRpb24gYnl0ZSBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIE9QVElPTkJZVEVfQk9PVF9MT0NLIDB4MTBVIC8qITwgQm9vdCBsb2NrIG9wdGlvbiBieXRlIGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgT1BUSU9OQllURV9TRUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAweDIwVSAvKiE8IFNlY3VyYWJsZSBtZW1vcnkgb3B0aW9uIGJ5dGUgY29uZmlndXJhdGlvbiBcCisgICAgICAgICAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgRkxBU0hfT0JfV1JQX0FyZWEgRkxBU0ggV1JQIEFyZWEKKyAqIEB7CisgKi8KKyNkZWZpbmUgT0JfV1JQQVJFQV9CQU5LMV9BUkVBQSAweDAwVSAvKiE8IEZsYXNoIEJhbmsgMSBBcmVhIEEgKi8KKyNkZWZpbmUgT0JfV1JQQVJFQV9CQU5LMV9BUkVBQiAweDAxVSAvKiE8IEZsYXNoIEJhbmsgMSBBcmVhIEIgKi8KKyNpZiBkZWZpbmVkKEZMQVNIX09QVFJfREJBTkspCisjZGVmaW5lIE9CX1dSUEFSRUFfQkFOSzJfQVJFQUEgMHgwMlUgLyohPCBGbGFzaCBCYW5rIDIgQXJlYSBBICovCisjZGVmaW5lIE9CX1dSUEFSRUFfQkFOSzJfQVJFQUIgMHgwNFUgLyohPCBGbGFzaCBCYW5rIDIgQXJlYSBCICovCisjZW5kaWYKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEZMQVNIX09CX0Jvb3RfTG9jayBGTEFTSCBCb290IExvY2sKKyAqIEB7CisgKi8KKyNkZWZpbmUgT0JfQk9PVF9MT0NLX0RJU0FCTEUgMHgwMDAwMDAwMFUgICAgICAgICAgLyohPCBCb290IExvY2sgRGlzYWJsZSAqLworI2RlZmluZSBPQl9CT09UX0xPQ0tfRU5BQkxFIEZMQVNIX1NFQzFSX0JPT1RfTE9DSyAvKiE8IEJvb3QgTG9jayBFbmFibGUgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEZMQVNIX09CX1JlYWRfUHJvdGVjdGlvbiBGTEFTSCBPcHRpb24gQnl0ZXMgUmVhZCBQcm90ZWN0aW9uCisgKiBAeworICovCisjZGVmaW5lIE9CX1JEUF9MRVZFTF8wIDB4QUFVCisjZGVmaW5lIE9CX1JEUF9MRVZFTF8xIDB4QkJVCisjZGVmaW5lIE9CX1JEUF9MRVZFTF8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4Q0NVIC8qITwgV2FybmluZzogV2hlbiBlbmFibGluZyByZWFkIHByb3RlY3Rpb24gbGV2ZWwgMiBcCisgICAgICAgICAgICAgaXQncyBubyBtb3JlIHBvc3NpYmxlIHRvIGdvIGJhY2sgdG8gbGV2ZWwgMSBvciAwICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBGTEFTSF9PQl9VU0VSX1R5cGUgRkxBU0ggT3B0aW9uIEJ5dGVzIFVzZXIgVHlwZQorICogQHsKKyAqLworI2RlZmluZSBPQl9VU0VSX0JPUl9MRVYgMHgwMDAwMDAwMVUgLyohPCBCT1IgcmVzZXQgTGV2ZWwgKi8KKyNkZWZpbmUgT0JfVVNFUl9uUlNUX1NUT1AgXAorICAweDAwMDAwMDAyVSAvKiE8IFJlc2V0IGdlbmVyYXRlZCB3aGVuIGVudGVyaW5nIHRoZSBzdG9wIG1vZGUgKi8KKyNkZWZpbmUgT0JfVVNFUl9uUlNUX1NUREJZIFwKKyAgMHgwMDAwMDAwNFUgLyohPCBSZXNldCBnZW5lcmF0ZWQgd2hlbiBlbnRlcmluZyB0aGUgc3RhbmRieSBtb2RlICovCisjZGVmaW5lIE9CX1VTRVJfSVdER19TVyAweDAwMDAwMDA4VSAvKiE8IEluZGVwZW5kZW50IHdhdGNoZG9nIHNlbGVjdGlvbiAqLworI2RlZmluZSBPQl9VU0VSX0lXREdfU1RPUCBcCisgIDB4MDAwMDAwMTBVIC8qITwgSW5kZXBlbmRlbnQgd2F0Y2hkb2cgY291bnRlciBmcmVlemUgaW4gc3RvcCBtb2RlICovCisjZGVmaW5lIE9CX1VTRVJfSVdER19TVERCWSBcCisgIDB4MDAwMDAwMjBVIC8qITwgSW5kZXBlbmRlbnQgd2F0Y2hkb2cgY291bnRlciBmcmVlemUgaW4gc3RhbmRieSBtb2RlICovCisjZGVmaW5lIE9CX1VTRVJfV1dER19TVyAweDAwMDAwMDQwVSAvKiE8IFdpbmRvdyB3YXRjaGRvZyBzZWxlY3Rpb24gKi8KKyNpZiBkZWZpbmVkKEZMQVNIX09QVFJfREJBTkspCisjZGVmaW5lIE9CX1VTRVJfQkZCMiAweDAwMDAwMDgwVSAvKiE8IER1YWwtYmFuayBib290ICovCisjZGVmaW5lIE9CX1VTRVJfREJBTksgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAweDAwMDAwMTAwVSAvKiE8IFNpbmdsZSBiYW5rIHdpdGggMTI4LWJpdHMgZGF0YSBvciB0d28gYmFua3Mgd2l0aCA2NC1iaXRzIFwKKyAgICAgICAgICAgICAgICAgZGF0YSAqLworI2VuZGlmCisjaWYgZGVmaW5lZChGTEFTSF9PUFRSX1BCNF9QVVBFTikKKyNkZWZpbmUgT0JfVVNFUl9QQjRfUFVQRU4gXAorICAweDAwMDAwMTAwVSAvKiE8IFVTQiBwb3dlciBkZWxpdmVyeSBkZWFkLWJhdHRlcnkvVERJIHB1bGwtdXAgKi8KKyNlbmRpZgorI2RlZmluZSBPQl9VU0VSX25CT09UMSAweDAwMDAwMjAwVSAvKiE8IEJvb3QgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBPQl9VU0VSX1NSQU1fUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMDA0MDBVIC8qITwgU1JBTSBwYXJpdHkgY2hlY2sgZW5hYmxlIChmaXJzdCAzMmtCIG9mIFNSQU0xICsgQ0NNIFNSQU0pIFwKKyAgICAgICAgICAgICAgICovCisjZGVmaW5lIE9CX1VTRVJfQ0NNU1JBTV9SU1QgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMDA4MDBVIC8qITwgQ0NNU1JBTSBFcmFzZSB3aGVuIHN5c3RlbSByZXNldCBcCisgICAgICAgICAgICAgICAqLworI2RlZmluZSBPQl9VU0VSX25SU1RfU0hEVyBcCisgIDB4MDAwMDEwMDBVIC8qITwgUmVzZXQgZ2VuZXJhdGVkIHdoZW4gZW50ZXJpbmcgdGhlIHNodXRkb3duIG1vZGUgKi8KKyNkZWZpbmUgT0JfVVNFUl9uU1dCT09UMCAweDAwMDAyMDAwVSAgLyohPCBTb2Z0d2FyZSBCT09UMCAqLworI2RlZmluZSBPQl9VU0VSX25CT09UMCAweDAwMDA0MDAwVSAgICAvKiE8IG5CT09UMCBvcHRpb24gYml0ICovCisjZGVmaW5lIE9CX1VTRVJfTlJTVF9NT0RFIDB4MDAwMDgwMDBVIC8qITwgUmVzZXQgcGluIGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgT0JfVVNFUl9JUkhFTiAweDAwMDEwMDAwVSAgICAgLyohPCBJbnRlcm5hbCBSZXNldCBIb2xkZXIgZW5hYmxlICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBGTEFTSF9PQl9VU0VSX0JPUl9MRVZFTCBGTEFTSCBPcHRpb24gQnl0ZXMgVXNlciBCT1IgTGV2ZWwKKyAqIEB7CisgKi8KKyNkZWZpbmUgT0JfQk9SX0xFVkVMXzAgXAorICBGTEFTSF9PUFRSX0JPUl9MRVZfMCAvKiE8IFJlc2V0IGxldmVsIHRocmVzaG9sZCBpcyBhcm91bmQgMS43ViAqLworI2RlZmluZSBPQl9CT1JfTEVWRUxfMSBcCisgIEZMQVNIX09QVFJfQk9SX0xFVl8xIC8qITwgUmVzZXQgbGV2ZWwgdGhyZXNob2xkIGlzIGFyb3VuZCAyLjBWICovCisjZGVmaW5lIE9CX0JPUl9MRVZFTF8yIFwKKyAgRkxBU0hfT1BUUl9CT1JfTEVWXzIgLyohPCBSZXNldCBsZXZlbCB0aHJlc2hvbGQgaXMgYXJvdW5kIDIuMlYgKi8KKyNkZWZpbmUgT0JfQk9SX0xFVkVMXzMgXAorICBGTEFTSF9PUFRSX0JPUl9MRVZfMyAvKiE8IFJlc2V0IGxldmVsIHRocmVzaG9sZCBpcyBhcm91bmQgMi41ViAqLworI2RlZmluZSBPQl9CT1JfTEVWRUxfNCBcCisgIEZMQVNIX09QVFJfQk9SX0xFVl80IC8qITwgUmVzZXQgbGV2ZWwgdGhyZXNob2xkIGlzIGFyb3VuZCAyLjhWICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBGTEFTSF9PQl9VU0VSX25SU1RfU1RPUCBGTEFTSCBPcHRpb24gQnl0ZXMgVXNlciBSZXNldCBPbiBTdG9wCisgKiBAeworICovCisjZGVmaW5lIE9CX1NUT1BfUlNUIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBSZXNldCBnZW5lcmF0ZWQgd2hlbiBlbnRlcmluZyB0aGUgc3RvcCBtb2RlICovCisjZGVmaW5lIE9CX1NUT1BfTk9SU1QgXAorICBGTEFTSF9PUFRSX25SU1RfU1RPUCAvKiE8IE5vIHJlc2V0IGdlbmVyYXRlZCB3aGVuIGVudGVyaW5nIHRoZSBzdG9wIG1vZGUgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEZMQVNIX09CX1VTRVJfblJTVF9TVEFOREJZIEZMQVNIIE9wdGlvbiBCeXRlcyBVc2VyIFJlc2V0IE9uCisgKiBTdGFuZGJ5CisgKiBAeworICovCisjZGVmaW5lIE9CX1NUQU5EQllfUlNUIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBSZXNldCBnZW5lcmF0ZWQgd2hlbiBlbnRlcmluZyB0aGUgc3RhbmRieSBtb2RlICovCisjZGVmaW5lIE9CX1NUQU5EQllfTk9SU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBGTEFTSF9PUFRSX25SU1RfU1REQlkgLyohPCBObyByZXNldCBnZW5lcmF0ZWQgd2hlbiBlbnRlcmluZyB0aGUgc3RhbmRieSBtb2RlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgRkxBU0hfT0JfVVNFUl9uUlNUX1NIVVRET1dOIEZMQVNIIE9wdGlvbiBCeXRlcyBVc2VyIFJlc2V0IE9uCisgKiBTaHV0ZG93bgorICogQHsKKyAqLworI2RlZmluZSBPQl9TSFVURE9XTl9SU1QgXAorICAweDAwMDAwMDAwVSAvKiE8IFJlc2V0IGdlbmVyYXRlZCB3aGVuIGVudGVyaW5nIHRoZSBzaHV0ZG93biBtb2RlICovCisjZGVmaW5lIE9CX1NIVVRET1dOX05PUlNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBGTEFTSF9PUFRSX25SU1RfU0hEVyAvKiE8IE5vIHJlc2V0IGdlbmVyYXRlZCB3aGVuIGVudGVyaW5nIHRoZSBzaHV0ZG93biBtb2RlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBGTEFTSF9PQl9VU0VSX0lXREdfU1cgRkxBU0ggT3B0aW9uIEJ5dGVzIFVzZXIgSVdERyBUeXBlCisgKiBAeworICovCisjZGVmaW5lIE9CX0lXREdfSFcgMHgwMDAwMDAwMFUgICAgICAgIC8qITwgSGFyZHdhcmUgaW5kZXBlbmRlbnQgd2F0Y2hkb2cgKi8KKyNkZWZpbmUgT0JfSVdER19TVyBGTEFTSF9PUFRSX0lXREdfU1cgLyohPCBTb2Z0d2FyZSBpbmRlcGVuZGVudCB3YXRjaGRvZyAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgRkxBU0hfT0JfVVNFUl9JV0RHX1NUT1AgRkxBU0ggT3B0aW9uIEJ5dGVzIFVzZXIgSVdERyBNb2RlIE9uIFN0b3AKKyAqIEB7CisgKi8KKyNkZWZpbmUgT0JfSVdER19TVE9QX0ZSRUVaRSBcCisgIDB4MDAwMDAwMDBVIC8qITwgSW5kZXBlbmRlbnQgd2F0Y2hkb2cgY291bnRlciBpcyBmcm96ZW4gaW4gU3RvcCBtb2RlICovCisjZGVmaW5lIE9CX0lXREdfU1RPUF9SVU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBGTEFTSF9PUFRSX0lXREdfU1RPUCAvKiE8IEluZGVwZW5kZW50IHdhdGNoZG9nIGNvdW50ZXIgaXMgcnVubmluZyBpbiBTdG9wIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgRkxBU0hfT0JfVVNFUl9JV0RHX1NUQU5EQlkgRkxBU0ggT3B0aW9uIEJ5dGVzIFVzZXIgSVdERyBNb2RlIE9uCisgKiBTdGFuZGJ5CisgKiBAeworICovCisjZGVmaW5lIE9CX0lXREdfU1REQllfRlJFRVpFIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBJbmRlcGVuZGVudCB3YXRjaGRvZyBjb3VudGVyIGlzIGZyb3plbiBpbiBTdGFuZGJ5IG1vZGUgKi8KKyNkZWZpbmUgT0JfSVdER19TVERCWV9SVU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRkxBU0hfT1BUUl9JV0RHX1NUREJZIC8qITwgSW5kZXBlbmRlbnQgd2F0Y2hkb2cgY291bnRlciBpcyBydW5uaW5nIGluIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YW5kYnkgbW9kZSAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgRkxBU0hfT0JfVVNFUl9XV0RHX1NXIEZMQVNIIE9wdGlvbiBCeXRlcyBVc2VyIFdXREcgVHlwZQorICogQHsKKyAqLworI2RlZmluZSBPQl9XV0RHX0hXIDB4MDAwMDAwMDBVICAgICAgICAvKiE8IEhhcmR3YXJlIHdpbmRvdyB3YXRjaGRvZyAqLworI2RlZmluZSBPQl9XV0RHX1NXIEZMQVNIX09QVFJfV1dER19TVyAvKiE8IFNvZnR3YXJlIHdpbmRvdyB3YXRjaGRvZyAqLworLyoqCisgKiBAfQorICovCisKKyNpZiBkZWZpbmVkKEZMQVNIX09QVFJfREJBTkspCisvKiogQGRlZmdyb3VwIEZMQVNIX09CX1VTRVJfQkZCMiBGTEFTSCBPcHRpb24gQnl0ZXMgVXNlciBCRkIyIE1vZGUKKyAqIEB7CisgKi8KKyNkZWZpbmUgT0JfQkZCMl9ESVNBQkxFIDB4MDAwMDAwMDBVICAgIC8qITwgRHVhbC1iYW5rIGJvb3QgZGlzYWJsZSAqLworI2RlZmluZSBPQl9CRkIyX0VOQUJMRSBGTEFTSF9PUFRSX0JGQjIgLyohPCBEdWFsLWJhbmsgYm9vdCBlbmFibGUgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEZMQVNIX09CX1VTRVJfREJBTksgRkxBU0ggT3B0aW9uIEJ5dGVzIFVzZXIgREJBTksgVHlwZQorICogQHsKKyAqLworI2RlZmluZSBPQl9EQkFOS18xMjhfQklUUyAweDAwMDAwMDAwVSAgICAgLyohPCBTaW5nbGUtYmFuayB3aXRoIDEyOC1iaXRzIGRhdGEgKi8KKyNkZWZpbmUgT0JfREJBTktfNjRfQklUUyBGTEFTSF9PUFRSX0RCQU5LIC8qITwgRHVhbC1iYW5rIHdpdGggNjQtYml0cyBkYXRhICovCisvKioKKyAqIEB9CisgKi8KKyNlbmRpZgorCisjaWYgZGVmaW5lZChGTEFTSF9PUFRSX1BCNF9QVVBFTikKKy8qKiBAZGVmZ3JvdXAgRkxBU0hfT0JfVVNFUl9QQjRfUFVQRU4gRkxBU0ggT3B0aW9uIEJ5dGVzIFVzZXIgUEI0IFBVUEVOIGJpdAorICogQHsKKyAqLworI2RlZmluZSBPQl9QQjRfUFVQRU5fRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAweDAwMDAwMDAwVSAvKiE8IFVTQiBwb3dlciBkZWxpdmVyeSBkZWFkLWJhdHRlcnkgZW5hYmxlZC8gVERJIHB1bGwtdXAgXAorICAgICAgICAgICAgICAgICBkZWFjdGl2YXRlZCAqLworI2RlZmluZSBPQl9QQjRfUFVQRU5fRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEZMQVNIX09QVFJfUEI0X1BVUEVOIC8qITwgVVNCIHBvd2VyIGRlbGl2ZXJ5IGRlYWQtYmF0dGVyeSBkaXNhYmxlZC8gVERJIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHVsbC11cCBhY3RpdmF0ZWQgKi8KKy8qKgorICogQH0KKyAqLworI2VuZGlmCisKKy8qKiBAZGVmZ3JvdXAgRkxBU0hfT0JfVVNFUl9uQk9PVDEgRkxBU0ggT3B0aW9uIEJ5dGVzIFVzZXIgQk9PVDEgVHlwZQorICogQHsKKyAqLworI2RlZmluZSBPQl9CT09UMV9TUkFNIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBFbWJlZGRlZCBTUkFNMSBpcyBzZWxlY3RlZCBhcyBib290IHNwYWNlIChpZiBCT09UMD0xKSAqLworI2RlZmluZSBPQl9CT09UMV9TWVNURU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBGTEFTSF9PUFRSX25CT09UMSAvKiE8IFN5c3RlbSBtZW1vcnkgaXMgc2VsZWN0ZWQgYXMgYm9vdCBzcGFjZSAoaWYgQk9PVDA9MSkgXAorICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEZMQVNIX09CX1VTRVJfU1JBTV9QRSBGTEFTSCBPcHRpb24gQnl0ZXMgVXNlciBTUkFNIFBhcml0eSBDaGVjaworICogVHlwZQorICogQHsKKyAqLworI2RlZmluZSBPQl9TUkFNX1BBUklUWV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMDAwMDBVIC8qITwgU1JBTSBwYXJpdHkgY2hlY2sgZW5hYmxlIChmaXJzdCAzMmtCIG9mIFNSQU0xICsgQ0NNIFNSQU0pIFwKKyAgICAgICAgICAgICAgICovCisjZGVmaW5lIE9CX1NSQU1fUEFSSVRZX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBGTEFTSF9PUFRSX1NSQU1fUEUgLyohPCBTUkFNIHBhcml0eSBjaGVjayBkaXNhYmxlIChmaXJzdCAzMmtCIG9mIFNSQU0xICsgQ0NNIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNSQU0pICovCisvKioKKyAqIEB9CisgKi8KKy8qKiBAZGVmZ3JvdXAgRkxBU0hfT0JfVVNFUl9DQ01TUkFNX1JTVCBGTEFTSCBPcHRpb24gQnl0ZXMgVXNlciBDQ01TUkFNIEVyYXNlIE9uCisgKiBSZXNldCBUeXBlCisgKiBAeworICovCisjZGVmaW5lIE9CX0NDTVNSQU1fUlNUX0VSQVNFIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBDQ01TUkFNIGVyYXNlZCB3aGVuIGEgc3lzdGVtIHJlc2V0IG9jY3VycyAqLworI2RlZmluZSBPQl9DQ01TUkFNX1JTVF9OT1RfRVJBU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRkxBU0hfT1BUUl9DQ01TUkFNX1JTVCAvKiE8IENDTVNSQU0gaXMgbm90IGVyYXNlZCB3aGVuIGEgc3lzdGVtIHJlc2V0IG9jY3VycyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioKKyAqIEB9CisgKi8KKy8qKiBAZGVmZ3JvdXAgRkxBU0hfT0JfVVNFUl9uU1dCT09UMCBGTEFTSCBPcHRpb24gQnl0ZXMgVXNlciBTb2Z0d2FyZSBCT09UMAorICogQHsKKyAqLworI2RlZmluZSBPQl9CT09UMF9GUk9NX09CIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBCT09UMCB0YWtlbiBmcm9tIHRoZSBvcHRpb24gYml0IG5CT09UMCAqLworI2RlZmluZSBPQl9CT09UMF9GUk9NX1BJTiBcCisgIEZMQVNIX09QVFJfblNXQk9PVDAgLyohPCBCT09UMCB0YWtlbiBmcm9tIFBCOC9CT09UMCBwaW4gKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEZMQVNIX09CX1VTRVJfbkJPT1QwIEZMQVNIIE9wdGlvbiBCeXRlcyBVc2VyIG5CT09UMCBvcHRpb24gYml0CisgKiBAeworICovCisjZGVmaW5lIE9CX25CT09UMF9SRVNFVCAweDAwMDAwMDAwVSAgICAgLyohPCBuQk9PVDAgPSAwICovCisjZGVmaW5lIE9CX25CT09UMF9TRVQgRkxBU0hfT1BUUl9uQk9PVDAgLyohPCBuQk9PVDAgPSAxICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBGTEFTSF9PQl9VU0VSX05SU1RfTU9ERSBGTEFTSCBPcHRpb24gQnl0ZXMgVXNlciBOUlNUIG1vZGUgYml0CisgKiBAeworICovCisjZGVmaW5lIE9CX05SU1RfTU9ERV9JTlBVVF9PTkxZIFwKKyAgRkxBU0hfT1BUUl9OUlNUX01PREVfMCAvKiE8IFJlc2V0IHBpbiBpcyBpbiBSZXNldCBpbnB1dCBtb2RlIG9ubHkgKi8KKyNkZWZpbmUgT0JfTlJTVF9NT0RFX0dQSU8gXAorICBGTEFTSF9PUFRSX05SU1RfTU9ERV8xIC8qITwgUmVzZXQgcGluIGlzIGluIEdQSU8gbW9kZSBvbmx5ICovCisjZGVmaW5lIE9CX05SU1RfTU9ERV9JTlBVVF9PVVRQVVQgXAorICBGTEFTSF9PUFRSX05SU1RfTU9ERSAvKiE8IFJlc2V0IHBpbiBpcyBpbiByZXNldCBpbnB1dCBhbmQgb3V0cHV0IG1vZGUgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEZMQVNIX09CX1VTRVJfSU5URVJOQUxfUkVTRVRfSE9MREVSIEZMQVNIIE9wdGlvbiBCeXRlcyBVc2VyCisgKiBpbnRlcm5hbCByZXNldCBob2xkZXIgYml0CisgKiBAeworICovCisjZGVmaW5lIE9CX0lSSF9ESVNBQkxFIDB4MDAwMDAwMDBVICAgICAvKiE8IEludGVybmFsIFJlc2V0IGhvbGRlciBkaXNhYmxlICovCisjZGVmaW5lIE9CX0lSSF9FTkFCTEUgRkxBU0hfT1BUUl9JUkhFTiAvKiE8IEludGVybmFsIFJlc2V0IGhvbGRlciBlbmFibGUgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEZMQVNIX09CX1BDUk9QX1JEUCBGTEFTSCBPcHRpb24gQnl0ZXMgUENST1AgT24gUkRQIExldmVsIFR5cGUKKyAqIEB7CisgKi8KKyNkZWZpbmUgT0JfUENST1BfUkRQX05PVF9FUkFTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBQQ1JPUCBhcmVhIGlzIG5vdCBlcmFzZWQgd2hlbiB0aGUgUkRQIGxldmVsIFwKKyAgICAgICAgICAgICAgICAgICBpcyBkZWNyZWFzZWQgZnJvbSBMZXZlbCAxIHRvIExldmVsIDAgKi8KKyNkZWZpbmUgT0JfUENST1BfUkRQX0VSQVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBGTEFTSF9QQ1JPUDFFUl9QQ1JPUF9SRFAgLyohPCBQQ1JPUCBhcmVhIGlzIGVyYXNlZCB3aGVuIHRoZSBSRFAgbGV2ZWwgaXMgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY3JlYXNlZCBmcm9tIExldmVsIDEgdG8gTGV2ZWwgMCAoZnVsbCBtYXNzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyYXNlKSAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgRkxBU0hfTGF0ZW5jeSBGTEFTSCBMYXRlbmN5CisgKiBAeworICovCisjZGVmaW5lIEZMQVNIX0xBVEVOQ1lfMCBGTEFTSF9BQ1JfTEFURU5DWV8wV1MgICAvKiE8IEZMQVNIIFplcm8gd2FpdCBzdGF0ZSAqLworI2RlZmluZSBGTEFTSF9MQVRFTkNZXzEgRkxBU0hfQUNSX0xBVEVOQ1lfMVdTICAgLyohPCBGTEFTSCBPbmUgd2FpdCBzdGF0ZSAqLworI2RlZmluZSBGTEFTSF9MQVRFTkNZXzIgRkxBU0hfQUNSX0xBVEVOQ1lfMldTICAgLyohPCBGTEFTSCBUd28gd2FpdCBzdGF0ZXMgKi8KKyNkZWZpbmUgRkxBU0hfTEFURU5DWV8zIEZMQVNIX0FDUl9MQVRFTkNZXzNXUyAgIC8qITwgRkxBU0ggVGhyZWUgd2FpdCBzdGF0ZXMgKi8KKyNkZWZpbmUgRkxBU0hfTEFURU5DWV80IEZMQVNIX0FDUl9MQVRFTkNZXzRXUyAgIC8qITwgRkxBU0ggRm91ciB3YWl0IHN0YXRlcyAqLworI2RlZmluZSBGTEFTSF9MQVRFTkNZXzUgRkxBU0hfQUNSX0xBVEVOQ1lfNVdTICAgLyohPCBGTEFTSCBGaXZlIHdhaXQgc3RhdGUgKi8KKyNkZWZpbmUgRkxBU0hfTEFURU5DWV82IEZMQVNIX0FDUl9MQVRFTkNZXzZXUyAgIC8qITwgRkxBU0ggU2l4IHdhaXQgc3RhdGUgKi8KKyNkZWZpbmUgRkxBU0hfTEFURU5DWV83IEZMQVNIX0FDUl9MQVRFTkNZXzdXUyAgIC8qITwgRkxBU0ggU2V2ZW4gd2FpdCBzdGF0ZXMgKi8KKyNkZWZpbmUgRkxBU0hfTEFURU5DWV84IEZMQVNIX0FDUl9MQVRFTkNZXzhXUyAgIC8qITwgRkxBU0ggRWlnaHQgd2FpdCBzdGF0ZXMgKi8KKyNkZWZpbmUgRkxBU0hfTEFURU5DWV85IEZMQVNIX0FDUl9MQVRFTkNZXzlXUyAgIC8qITwgRkxBU0ggTmluZSB3YWl0IHN0YXRlcyAqLworI2RlZmluZSBGTEFTSF9MQVRFTkNZXzEwIEZMQVNIX0FDUl9MQVRFTkNZXzEwV1MgLyohPCBGTEFTSCBUZW4gd2FpdCBzdGF0ZSAqLworI2RlZmluZSBGTEFTSF9MQVRFTkNZXzExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBGTEFTSF9BQ1JfTEFURU5DWV8xMVdTIC8qITwgRkxBU0ggRWxldmVuIHdhaXQgc3RhdGUgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGTEFTSF9MQVRFTkNZXzEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRkxBU0hfQUNSX0xBVEVOQ1lfMTJXUyAvKiE8IEZMQVNIIFR3ZWx2ZSB3YWl0IHN0YXRlcyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZMQVNIX0xBVEVOQ1lfMTMgXAorICBGTEFTSF9BQ1JfTEFURU5DWV8xM1dTIC8qITwgRkxBU0ggVGhpcnRlZW4gd2FpdCBzdGF0ZXMgKi8KKyNkZWZpbmUgRkxBU0hfTEFURU5DWV8xNCBcCisgIEZMQVNIX0FDUl9MQVRFTkNZXzE0V1MgLyohPCBGTEFTSCBGb3VydGVlbiB3YWl0IHN0YXRlcyAqLworI2RlZmluZSBGTEFTSF9MQVRFTkNZXzE1IFwKKyAgRkxBU0hfQUNSX0xBVEVOQ1lfMTVXUyAvKiE8IEZMQVNIIEZpZnRlZW4gd2FpdCBzdGF0ZXMgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEZMQVNIX0tleXMgRkxBU0ggS2V5cworICogQHsKKyAqLworI2RlZmluZSBGTEFTSF9LRVkxIDB4NDU2NzAxMjNVIC8qITwgRmxhc2gga2V5MSAqLworI2RlZmluZSBGTEFTSF9LRVkyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHhDREVGODlBQlUgLyohPCBGbGFzaCBrZXkyOiB1c2VkIHdpdGggRkxBU0hfS0VZMSBcCisgICAgICAgICAgICAgICAgICAgdG8gdW5sb2NrIHRoZSBGTEFTSCByZWdpc3RlcnMgYWNjZXNzICovCisKKyNkZWZpbmUgRkxBU0hfUERLRVkxIDB4MDQxNTI2MzdVIC8qITwgRmxhc2ggcG93ZXIgZG93biBrZXkxICovCisjZGVmaW5lIEZMQVNIX1BES0VZMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHhGQUZCRkNGRFUgLyohPCBGbGFzaCBwb3dlciBkb3duIGtleTI6IHVzZWQgd2l0aCBGTEFTSF9QREtFWTEgXAorICAgICAgICAgICAgICAgICAgIHRvIHVubG9jayB0aGUgUlVOX1BEIGJpdCBpbiBGTEFTSF9BQ1IgKi8KKworI2RlZmluZSBGTEFTSF9PUFRLRVkxIDB4MDgxOTJBM0JVIC8qITwgRmxhc2ggb3B0aW9uIGJ5dGUga2V5MSAqLworI2RlZmluZSBGTEFTSF9PUFRLRVkyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHg0QzVENkU3RlUgLyohPCBGbGFzaCBvcHRpb24gYnl0ZSBrZXkyOiB1c2VkIHdpdGggRkxBU0hfT1BUS0VZMSBcCisgICAgICAgICAgICAgICAgICAgdG8gYWxsb3cgb3B0aW9uIGJ5dGVzIG9wZXJhdGlvbnMgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEZMQVNIX0ZsYWdzIEZMQVNIIEZsYWdzIERlZmluaXRpb24KKyAqIEB7CisgKi8KKyNkZWZpbmUgRkxBU0hfRkxBR19FT1AgRkxBU0hfU1JfRU9QICAgICAvKiE8IEZMQVNIIEVuZCBvZiBvcGVyYXRpb24gZmxhZyAqLworI2RlZmluZSBGTEFTSF9GTEFHX09QRVJSIEZMQVNIX1NSX09QRVJSIC8qITwgRkxBU0ggT3BlcmF0aW9uIGVycm9yIGZsYWcgKi8KKyNkZWZpbmUgRkxBU0hfRkxBR19QUk9HRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBGTEFTSF9TUl9QUk9HRVJSIC8qITwgRkxBU0ggUHJvZ3JhbW1pbmcgZXJyb3IgZmxhZyBcCisgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZMQVNIX0ZMQUdfV1JQRVJSIFwKKyAgRkxBU0hfU1JfV1JQRVJSIC8qITwgRkxBU0ggV3JpdGUgcHJvdGVjdGlvbiBlcnJvciBmbGFnICovCisjZGVmaW5lIEZMQVNIX0ZMQUdfUEdBRVJSIFwKKyAgRkxBU0hfU1JfUEdBRVJSIC8qITwgRkxBU0ggUHJvZ3JhbW1pbmcgYWxpZ25tZW50IGVycm9yIGZsYWcgKi8KKyNkZWZpbmUgRkxBU0hfRkxBR19TSVpFUlIgRkxBU0hfU1JfU0laRVJSIC8qITwgRkxBU0ggU2l6ZSBlcnJvciBmbGFnICAqLworI2RlZmluZSBGTEFTSF9GTEFHX1BHU0VSUiBcCisgIEZMQVNIX1NSX1BHU0VSUiAvKiE8IEZMQVNIIFByb2dyYW1taW5nIHNlcXVlbmNlIGVycm9yIGZsYWcgKi8KKyNkZWZpbmUgRkxBU0hfRkxBR19NSVNFUlIgXAorICBGTEFTSF9TUl9NSVNFUlIgLyohPCBGTEFTSCBGYXN0IHByb2dyYW1taW5nIGRhdGEgbWlzcyBlcnJvciBmbGFnICovCisjZGVmaW5lIEZMQVNIX0ZMQUdfRkFTVEVSUiBcCisgIEZMQVNIX1NSX0ZBU1RFUlIgLyohPCBGTEFTSCBGYXN0IHByb2dyYW1taW5nIGVycm9yIGZsYWcgKi8KKyNkZWZpbmUgRkxBU0hfRkxBR19SREVSUiBGTEFTSF9TUl9SREVSUiAvKiE8IEZMQVNIIFBDUk9QIHJlYWQgZXJyb3IgZmxhZyAqLworI2RlZmluZSBGTEFTSF9GTEFHX09QVFZFUlIgXAorICBGTEFTSF9TUl9PUFRWRVJSICAgICAgICAgICAgICAgICAgLyohPCBGTEFTSCBPcHRpb24gdmFsaWRpdHkgZXJyb3IgZmxhZyAgKi8KKyNkZWZpbmUgRkxBU0hfRkxBR19CU1kgRkxBU0hfU1JfQlNZIC8qITwgRkxBU0ggQnVzeSBmbGFnICovCisjZGVmaW5lIEZMQVNIX0ZMQUdfRUNDQyBcCisgIEZMQVNIX0VDQ1JfRUNDQyAvKiE8IEZMQVNIIEVDQyBjb3JyZWN0aW9uIGluIDY0IExTQiBiaXRzICovCisjZGVmaW5lIEZMQVNIX0ZMQUdfRUNDRCBcCisgIEZMQVNIX0VDQ1JfRUNDRCAvKiE8IEZMQVNIIEVDQyBkZXRlY3Rpb24gaW4gNjQgTFNCIGJpdHMgKi8KKyNpZiBkZWZpbmVkKEZMQVNIX09QVFJfREJBTkspCisjZGVmaW5lIEZMQVNIX0ZMQUdfRUNDQzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEZMQVNIX0VDQ1JfRUNDQzIgLyohPCBGTEFTSCBFQ0MgY29ycmVjdGlvbiBpbiA2NCBNU0IgYml0cyAobW9kZSAxMjggYml0cyBcCisgICAgICAgICAgICAgICAgICAgICAgb25seSkgKi8KKyNkZWZpbmUgRkxBU0hfRkxBR19FQ0NEMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBGTEFTSF9FQ0NSX0VDQ0QyIC8qITwgRkxBU0ggRUNDIGRldGVjdGlvbiBpbiA2NCBNU0IgYml0cyAobW9kZSAxMjggYml0cyBcCisgICAgICAgICAgICAgICAgICAgICAgb25seSkgKi8KKyNlbmRpZgorCisjZGVmaW5lIEZMQVNIX0ZMQUdfU1JfRVJST1JTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChGTEFTSF9GTEFHX09QRVJSIHwgRkxBU0hfRkxBR19QUk9HRVJSIHwgRkxBU0hfRkxBR19XUlBFUlIgfCBcCisgICBGTEFTSF9GTEFHX1BHQUVSUiB8IEZMQVNIX0ZMQUdfU0laRVJSIHwgRkxBU0hfRkxBR19QR1NFUlIgfCBcCisgICBGTEFTSF9GTEFHX01JU0VSUiB8IEZMQVNIX0ZMQUdfRkFTVEVSUiB8IEZMQVNIX0ZMQUdfUkRFUlIgfCBcCisgICBGTEFTSF9GTEFHX09QVFZFUlIpCisjaWYgZGVmaW5lZChGTEFTSF9PUFRSX0RCQU5LKQorI2RlZmluZSBGTEFTSF9GTEFHX0VDQ1JfRVJST1JTIFwKKyAgKEZMQVNIX0ZMQUdfRUNDQyB8IEZMQVNIX0ZMQUdfRUNDRCB8IEZMQVNIX0ZMQUdfRUNDQzIgfCBGTEFTSF9GTEFHX0VDQ0QyKQorI2Vsc2UKKyNkZWZpbmUgRkxBU0hfRkxBR19FQ0NSX0VSUk9SUyAoRkxBU0hfRkxBR19FQ0NDIHwgRkxBU0hfRkxBR19FQ0NEKQorI2VuZGlmCisjZGVmaW5lIEZMQVNIX0ZMQUdfQUxMX0VSUk9SUyAoRkxBU0hfRkxBR19TUl9FUlJPUlMgfCBGTEFTSF9GTEFHX0VDQ1JfRVJST1JTKQorLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgRkxBU0hfSW50ZXJydXB0X2RlZmluaXRpb24gRkxBU0ggSW50ZXJydXB0cyBEZWZpbml0aW9uCisgKiBAYnJpZWYgRkxBU0ggSW50ZXJydXB0IGRlZmluaXRpb24KKyAqIEB7CisgKi8KKyNkZWZpbmUgRkxBU0hfSVRfRU9QIFwKKyAgRkxBU0hfQ1JfRU9QSUUgLyohPCBFbmQgb2YgRkxBU0ggT3BlcmF0aW9uIEludGVycnVwdCBzb3VyY2UgKi8KKyNkZWZpbmUgRkxBU0hfSVRfT1BFUlIgRkxBU0hfQ1JfRVJSSUUgLyohPCBFcnJvciBJbnRlcnJ1cHQgc291cmNlICovCisjZGVmaW5lIEZMQVNIX0lUX1JERVJSICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEZMQVNIX0NSX1JERVJSSUUgLyohPCBQQ1JPUCBSZWFkIEVycm9yIEludGVycnVwdCBcCisgICAgICAgICAgICAgICAgICAgICAgc291cmNlKi8KKyNkZWZpbmUgRkxBU0hfSVRfRUNDQyBcCisgIChGTEFTSF9FQ0NSX0VDQ0lFID4+IDI0VSkgLyohPCBFQ0MgQ29ycmVjdGlvbiBJbnRlcnJ1cHQgc291cmNlICovCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEZMQVNIX0V4cG9ydGVkX01hY3JvcyBGTEFTSCBFeHBvcnRlZCBNYWNyb3MKKyAqIEBicmllZiBtYWNyb3MgdG8gY29udHJvbCBGTEFTSCBmZWF0dXJlcworICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiAgU2V0IHRoZSBGTEFTSCBMYXRlbmN5LgorICogQHBhcmFtICBfX0xBVEVOQ1lfXyBGTEFTSCBMYXRlbmN5LgorICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzIDoKKyAqICAgICAgICAgICBAYXJnIEZMQVNIX0xBVEVOQ1lfMDogIEZMQVNIIFplcm8gd2FpdCBzdGF0ZQorICogICAgICAgICAgIEBhcmcgRkxBU0hfTEFURU5DWV8xOiAgRkxBU0ggT25lIHdhaXQgc3RhdGUKKyAqICAgICAgICAgICBAYXJnIEZMQVNIX0xBVEVOQ1lfMjogIEZMQVNIIFR3byB3YWl0IHN0YXRlcworICogICAgICAgICAgIEBhcmcgRkxBU0hfTEFURU5DWV8zOiAgRkxBU0ggVGhyZWUgd2FpdCBzdGF0ZXMKKyAqICAgICAgICAgICBAYXJnIEZMQVNIX0xBVEVOQ1lfNDogIEZMQVNIIEZvdXIgd2FpdCBzdGF0ZXMKKyAqICAgICAgICAgICBAYXJnIEZMQVNIX0xBVEVOQ1lfNTogIEZMQVNIIEZpdmUgd2FpdCBzdGF0ZXMKKyAqICAgICAgICAgICBAYXJnIEZMQVNIX0xBVEVOQ1lfNjogIEZMQVNIIFNpeCB3YWl0IHN0YXRlcworICogICAgICAgICAgIEBhcmcgRkxBU0hfTEFURU5DWV83OiAgRkxBU0ggU2V2ZW4gd2FpdCBzdGF0ZXMKKyAqICAgICAgICAgICBAYXJnIEZMQVNIX0xBVEVOQ1lfODogIEZMQVNIIEVpZ2h0IHdhaXQgc3RhdGVzCisgKiAgICAgICAgICAgQGFyZyBGTEFTSF9MQVRFTkNZXzk6ICBGTEFTSCBOaW5lIHdhaXQgc3RhdGVzCisgKiAgICAgICAgICAgQGFyZyBGTEFTSF9MQVRFTkNZXzEwOiBGTEFTSCBUZW4gd2FpdCBzdGF0ZQorICogICAgICAgICAgIEBhcmcgRkxBU0hfTEFURU5DWV8xMTogRkxBU0ggRWxldmVuIHdhaXQgc3RhdGUKKyAqICAgICAgICAgICBAYXJnIEZMQVNIX0xBVEVOQ1lfMTI6IEZMQVNIIFR3ZWx2ZSB3YWl0IHN0YXRlcworICogICAgICAgICAgIEBhcmcgRkxBU0hfTEFURU5DWV8xMzogRkxBU0ggVGhpcnRlZW4gd2FpdCBzdGF0ZXMKKyAqICAgICAgICAgICBAYXJnIEZMQVNIX0xBVEVOQ1lfMTQ6IEZMQVNIIEZvdXJ0ZWVuIHdhaXQgc3RhdGVzCisgKiAgICAgICAgICAgQGFyZyBGTEFTSF9MQVRFTkNZXzE1OiBGTEFTSCBGaWZ0ZWVuIHdhaXQgc3RhdGVzCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9GTEFTSF9TRVRfTEFURU5DWShfX0xBVEVOQ1lfXykgXAorICBNT0RJRllfUkVHKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9MQVRFTkNZLCAoX19MQVRFTkNZX18pKQorCisvKioKKyAqIEBicmllZiAgR2V0IHRoZSBGTEFTSCBMYXRlbmN5LgorICogQHJldHZhbCBGTEFTSF9MYXRlbmN5LgorICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzIDoKKyAqICAgICAgICAgICBAYXJnIEZMQVNIX0xBVEVOQ1lfMDogIEZMQVNIIFplcm8gd2FpdCBzdGF0ZQorICogICAgICAgICAgIEBhcmcgRkxBU0hfTEFURU5DWV8xOiAgRkxBU0ggT25lIHdhaXQgc3RhdGUKKyAqICAgICAgICAgICBAYXJnIEZMQVNIX0xBVEVOQ1lfMjogIEZMQVNIIFR3byB3YWl0IHN0YXRlcworICogICAgICAgICAgIEBhcmcgRkxBU0hfTEFURU5DWV8zOiAgRkxBU0ggVGhyZWUgd2FpdCBzdGF0ZXMKKyAqICAgICAgICAgICBAYXJnIEZMQVNIX0xBVEVOQ1lfNDogIEZMQVNIIEZvdXIgd2FpdCBzdGF0ZXMKKyAqICAgICAgICAgICBAYXJnIEZMQVNIX0xBVEVOQ1lfNTogIEZMQVNIIEZpdmUgd2FpdCBzdGF0ZXMKKyAqICAgICAgICAgICBAYXJnIEZMQVNIX0xBVEVOQ1lfNjogIEZMQVNIIFNpeCB3YWl0IHN0YXRlcworICogICAgICAgICAgIEBhcmcgRkxBU0hfTEFURU5DWV83OiAgRkxBU0ggU2V2ZW4gd2FpdCBzdGF0ZXMKKyAqICAgICAgICAgICBAYXJnIEZMQVNIX0xBVEVOQ1lfODogIEZMQVNIIEVpZ2h0IHdhaXQgc3RhdGVzCisgKiAgICAgICAgICAgQGFyZyBGTEFTSF9MQVRFTkNZXzk6ICBGTEFTSCBOaW5lIHdhaXQgc3RhdGVzCisgKiAgICAgICAgICAgQGFyZyBGTEFTSF9MQVRFTkNZXzEwOiBGTEFTSCBUZW4gd2FpdCBzdGF0ZQorICogICAgICAgICAgIEBhcmcgRkxBU0hfTEFURU5DWV8xMTogRkxBU0ggRWxldmVuIHdhaXQgc3RhdGUKKyAqICAgICAgICAgICBAYXJnIEZMQVNIX0xBVEVOQ1lfMTI6IEZMQVNIIFR3ZWx2ZSB3YWl0IHN0YXRlcworICogICAgICAgICAgIEBhcmcgRkxBU0hfTEFURU5DWV8xMzogRkxBU0ggVGhpcnRlZW4gd2FpdCBzdGF0ZXMKKyAqICAgICAgICAgICBAYXJnIEZMQVNIX0xBVEVOQ1lfMTQ6IEZMQVNIIEZvdXJ0ZWVuIHdhaXQgc3RhdGVzCisgKiAgICAgICAgICAgQGFyZyBGTEFTSF9MQVRFTkNZXzE1OiBGTEFTSCBGaWZ0ZWVuIHdhaXQgc3RhdGVzCisgKi8KKyNkZWZpbmUgX19IQUxfRkxBU0hfR0VUX0xBVEVOQ1koKSBSRUFEX0JJVChGTEFTSC0+QUNSLCBGTEFTSF9BQ1JfTEFURU5DWSkKKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSB0aGUgRkxBU0ggcHJlZmV0Y2ggYnVmZmVyLgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfRkxBU0hfUFJFRkVUQ0hfQlVGRkVSX0VOQUJMRSgpIFwKKyAgU0VUX0JJVChGTEFTSC0+QUNSLCBGTEFTSF9BQ1JfUFJGVEVOKQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSB0aGUgRkxBU0ggcHJlZmV0Y2ggYnVmZmVyLgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfRkxBU0hfUFJFRkVUQ0hfQlVGRkVSX0RJU0FCTEUoKSBcCisgIENMRUFSX0JJVChGTEFTSC0+QUNSLCBGTEFTSF9BQ1JfUFJGVEVOKQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIHRoZSBGTEFTSCBpbnN0cnVjdGlvbiBjYWNoZS4KKyAqIEByZXR2YWwgbm9uZQorICovCisjZGVmaW5lIF9fSEFMX0ZMQVNIX0lOU1RSVUNUSU9OX0NBQ0hFX0VOQUJMRSgpIFwKKyAgU0VUX0JJVChGTEFTSC0+QUNSLCBGTEFTSF9BQ1JfSUNFTikKKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgdGhlIEZMQVNIIGluc3RydWN0aW9uIGNhY2hlLgorICogQHJldHZhbCBub25lCisgKi8KKyNkZWZpbmUgX19IQUxfRkxBU0hfSU5TVFJVQ1RJT05fQ0FDSEVfRElTQUJMRSgpIFwKKyAgQ0xFQVJfQklUKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9JQ0VOKQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIHRoZSBGTEFTSCBkYXRhIGNhY2hlLgorICogQHJldHZhbCBub25lCisgKi8KKyNkZWZpbmUgX19IQUxfRkxBU0hfREFUQV9DQUNIRV9FTkFCTEUoKSBTRVRfQklUKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9EQ0VOKQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSB0aGUgRkxBU0ggZGF0YSBjYWNoZS4KKyAqIEByZXR2YWwgbm9uZQorICovCisjZGVmaW5lIF9fSEFMX0ZMQVNIX0RBVEFfQ0FDSEVfRElTQUJMRSgpIENMRUFSX0JJVChGTEFTSC0+QUNSLCBGTEFTSF9BQ1JfRENFTikKKworLyoqCisgKiBAYnJpZWYgIFJlc2V0IHRoZSBGTEFTSCBpbnN0cnVjdGlvbiBDYWNoZS4KKyAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIHVzZWQgb25seSB3aGVuIHRoZSBJbnN0cnVjdGlvbiBDYWNoZSBpcworICogZGlzYWJsZWQuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9GTEFTSF9JTlNUUlVDVElPTl9DQUNIRV9SRVNFVCgpIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgU0VUX0JJVChGTEFTSC0+QUNSLCBGTEFTSF9BQ1JfSUNSU1QpOyAgICAgXAorICAgIENMRUFSX0JJVChGTEFTSC0+QUNSLCBGTEFTSF9BQ1JfSUNSU1QpOyAgIFwKKyAgfSB3aGlsZSAoMCkKKworLyoqCisgKiBAYnJpZWYgIFJlc2V0IHRoZSBGTEFTSCBkYXRhIENhY2hlLgorICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgdXNlZCBvbmx5IHdoZW4gdGhlIGRhdGEgQ2FjaGUgaXMgZGlzYWJsZWQuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9GTEFTSF9EQVRBX0NBQ0hFX1JFU0VUKCkgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTRVRfQklUKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9EQ1JTVCk7ICAgXAorICAgIENMRUFSX0JJVChGTEFTSC0+QUNSLCBGTEFTSF9BQ1JfRENSU1QpOyBcCisgIH0gd2hpbGUgKDApCisKKy8qKgorICogQGJyaWVmICBFbmFibGUgdGhlIEZMQVNIIHBvd2VyIGRvd24gZHVyaW5nIExvdy1wb3dlciBydW4gbW9kZS4KKyAqIEBub3RlICAgV3JpdGluZyB0aGlzIGJpdCB0byAxLCBhdXRvbWF0aWNhbGx5IHRoZSBrZXlzIGFyZQorICogICAgICAgICBsb3N0IGFuZCBhIG5ldyB1bmxvY2sgc2VxdWVuY2UgaXMgbmVjZXNzYXJ5IHRvIHJlLXdyaXRlIGl0IHRvIDAuCisgKi8KKyNkZWZpbmUgX19IQUxfRkxBU0hfUE9XRVJfRE9XTl9FTkFCTEUoKSAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgV1JJVEVfUkVHKEZMQVNILT5QREtFWVIsIEZMQVNIX1BES0VZMSk7IFwKKyAgICBXUklURV9SRUcoRkxBU0gtPlBES0VZUiwgRkxBU0hfUERLRVkyKTsgXAorICAgIFNFVF9CSVQoRkxBU0gtPkFDUiwgRkxBU0hfQUNSX1JVTl9QRCk7ICBcCisgIH0gd2hpbGUgKDApCisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIHRoZSBGTEFTSCBwb3dlciBkb3duIGR1cmluZyBMb3ctcG93ZXIgcnVuIG1vZGUuCisgKiBAbm90ZSAgIFdyaXRpbmcgdGhpcyBiaXQgdG8gMCwgYXV0b21hdGljYWxseSB0aGUga2V5cyBhcmUKKyAqICAgICAgICAgbG9zdCBhbmQgYSBuZXcgdW5sb2NrIHNlcXVlbmNlIGlzIG5lY2Vzc2FyeSB0byByZS13cml0ZSBpdCB0byAxLgorICovCisjZGVmaW5lIF9fSEFMX0ZMQVNIX1BPV0VSX0RPV05fRElTQUJMRSgpICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgV1JJVEVfUkVHKEZMQVNILT5QREtFWVIsIEZMQVNIX1BES0VZMSk7ICBcCisgICAgV1JJVEVfUkVHKEZMQVNILT5QREtFWVIsIEZMQVNIX1BES0VZMik7ICBcCisgICAgQ0xFQVJfQklUKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9SVU5fUEQpOyBcCisgIH0gd2hpbGUgKDApCisKKy8qKgorICogQGJyaWVmICBFbmFibGUgdGhlIEZMQVNIIHBvd2VyIGRvd24gZHVyaW5nIExvdy1Qb3dlciBzbGVlcCBtb2RlCisgKiBAcmV0dmFsIG5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9GTEFTSF9TTEVFUF9QT1dFUkRPV05fRU5BQkxFKCkgXAorICBTRVRfQklUKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9TTEVFUF9QRCkKKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgdGhlIEZMQVNIIHBvd2VyIGRvd24gZHVyaW5nIExvdy1Qb3dlciBzbGVlcCBtb2RlCisgKiBAcmV0dmFsIG5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9GTEFTSF9TTEVFUF9QT1dFUkRPV05fRElTQUJMRSgpIFwKKyAgQ0xFQVJfQklUKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9TTEVFUF9QRCkKKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgRkxBU0hfSW50ZXJydXB0IEZMQVNIIEludGVycnVwdHMgTWFjcm9zCisgKiAgQGJyaWVmIG1hY3JvcyB0byBoYW5kbGUgRkxBU0ggaW50ZXJydXB0cworICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiAgRW5hYmxlIHRoZSBzcGVjaWZpZWQgRkxBU0ggaW50ZXJydXB0LgorICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIEZMQVNIIGludGVycnVwdAorICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgIEBhcmcgRkxBU0hfSVRfRU9QOiBFbmQgb2YgRkxBU0ggT3BlcmF0aW9uIEludGVycnVwdAorICogICAgIEBhcmcgRkxBU0hfSVRfT1BFUlI6IEVycm9yIEludGVycnVwdAorICogICAgIEBhcmcgRkxBU0hfSVRfUkRFUlI6IFBDUk9QIFJlYWQgRXJyb3IgSW50ZXJydXB0CisgKiAgICAgQGFyZyBGTEFTSF9JVF9FQ0NDOiBFQ0MgQ29ycmVjdGlvbiBJbnRlcnJ1cHQKKyAqIEByZXR2YWwgbm9uZQorICovCisjZGVmaW5lIF9fSEFMX0ZMQVNIX0VOQUJMRV9JVChfX0lOVEVSUlVQVF9fKSAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKChfX0lOVEVSUlVQVF9fKSAmIEZMQVNIX0lUX0VDQ0MpICE9IDBVKSB7ICAgICAgICAgICAgICBcCisgICAgICBTRVRfQklUKEZMQVNILT5FQ0NSLCBGTEFTSF9FQ0NSX0VDQ0lFKTsgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKChfX0lOVEVSUlVQVF9fKSAmICh+RkxBU0hfSVRfRUNDQykpICE9IDBVKSB7ICAgICAgICAgICBcCisgICAgICBTRVRfQklUKEZMQVNILT5DUiwgKChfX0lOVEVSUlVQVF9fKSAmICh+RkxBU0hfSVRfRUNDQykpKTsgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgdGhlIHNwZWNpZmllZCBGTEFTSCBpbnRlcnJ1cHQuCisgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gRkxBU0ggaW50ZXJydXB0CisgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgQGFyZyBGTEFTSF9JVF9FT1A6IEVuZCBvZiBGTEFTSCBPcGVyYXRpb24gSW50ZXJydXB0CisgKiAgICAgQGFyZyBGTEFTSF9JVF9PUEVSUjogRXJyb3IgSW50ZXJydXB0CisgKiAgICAgQGFyZyBGTEFTSF9JVF9SREVSUjogUENST1AgUmVhZCBFcnJvciBJbnRlcnJ1cHQKKyAqICAgICBAYXJnIEZMQVNIX0lUX0VDQ0M6IEVDQyBDb3JyZWN0aW9uIEludGVycnVwdAorICogQHJldHZhbCBub25lCisgKi8KKyNkZWZpbmUgX19IQUxfRkxBU0hfRElTQUJMRV9JVChfX0lOVEVSUlVQVF9fKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKChfX0lOVEVSUlVQVF9fKSAmIEZMQVNIX0lUX0VDQ0MpICE9IDBVKSB7ICAgICAgICAgICAgICAgIFwKKyAgICAgIENMRUFSX0JJVChGTEFTSC0+RUNDUiwgRkxBU0hfRUNDUl9FQ0NJRSk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKChfX0lOVEVSUlVQVF9fKSAmICh+RkxBU0hfSVRfRUNDQykpICE9IDBVKSB7ICAgICAgICAgICAgIFwKKyAgICAgIENMRUFSX0JJVChGTEFTSC0+Q1IsICgoX19JTlRFUlJVUFRfXykgJiAofkZMQVNIX0lUX0VDQ0MpKSk7IFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworLyoqCisgKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBGTEFTSCBmbGFnIGlzIHNldCBvciBub3QuCisgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgRkxBU0ggZmxhZyB0byBjaGVjay4KKyAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICBAYXJnIEZMQVNIX0ZMQUdfRU9QOiBGTEFTSCBFbmQgb2YgT3BlcmF0aW9uIGZsYWcKKyAqICAgICBAYXJnIEZMQVNIX0ZMQUdfT1BFUlI6IEZMQVNIIE9wZXJhdGlvbiBlcnJvciBmbGFnCisgKiAgICAgQGFyZyBGTEFTSF9GTEFHX1BST0dFUlI6IEZMQVNIIFByb2dyYW1taW5nIGVycm9yIGZsYWcKKyAqICAgICBAYXJnIEZMQVNIX0ZMQUdfV1JQRVJSOiBGTEFTSCBXcml0ZSBwcm90ZWN0aW9uIGVycm9yIGZsYWcKKyAqICAgICBAYXJnIEZMQVNIX0ZMQUdfUEdBRVJSOiBGTEFTSCBQcm9ncmFtbWluZyBhbGlnbm1lbnQgZXJyb3IgZmxhZworICogICAgIEBhcmcgRkxBU0hfRkxBR19TSVpFUlI6IEZMQVNIIFNpemUgZXJyb3IgZmxhZworICogICAgIEBhcmcgRkxBU0hfRkxBR19QR1NFUlI6IEZMQVNIIFByb2dyYW1taW5nIHNlcXVlbmNlIGVycm9yIGZsYWcKKyAqICAgICBAYXJnIEZMQVNIX0ZMQUdfTUlTRVJSOiBGTEFTSCBGYXN0IHByb2dyYW1taW5nIGRhdGEgbWlzcyBlcnJvciBmbGFnCisgKiAgICAgQGFyZyBGTEFTSF9GTEFHX0ZBU1RFUlI6IEZMQVNIIEZhc3QgcHJvZ3JhbW1pbmcgZXJyb3IgZmxhZworICogICAgIEBhcmcgRkxBU0hfRkxBR19SREVSUjogRkxBU0ggUENST1AgcmVhZCAgZXJyb3IgZmxhZworICogICAgIEBhcmcgRkxBU0hfRkxBR19PUFRWRVJSOiBGTEFTSCBPcHRpb24gdmFsaWRpdHkgZXJyb3IgZmxhZworICogICAgIEBhcmcgRkxBU0hfRkxBR19CU1k6IEZMQVNIIHdyaXRlL2VyYXNlIG9wZXJhdGlvbnMgaW4gcHJvZ3Jlc3MgZmxhZworICogICAgIEBhcmcgRkxBU0hfRkxBR19FQ0NDOiBGTEFTSCBvbmUgRUNDIGVycm9yIGhhcyBiZWVuIGRldGVjdGVkIGFuZCBjb3JyZWN0ZWQKKyAqIGluIDY0IExTQiBiaXRzCisgKiAgICAgQGFyZyBGTEFTSF9GTEFHX0VDQ0Q6IEZMQVNIIHR3byBFQ0MgZXJyb3JzIGhhdmUgYmVlbiBkZXRlY3RlZCBpbiA2NCBMU0IKKyAqIGJpdHMKKyAqICAgICBAYXJnIEZMQVNIX0ZMQUdfRUNDQzIoKik6IEZMQVNIIG9uZSBFQ0MgZXJyb3IgaGFzIGJlZW4gZGV0ZWN0ZWQgYW5kCisgKiBjb3JyZWN0ZWQgaW4gNjQgTVNCIGJpdHMgKG1vZGUgMTI4IGJpdHMgb25seSkKKyAqICAgICBAYXJnIEZMQVNIX0ZMQUdfRUNDRDIoKik6IEZMQVNIIHR3byBFQ0MgZXJyb3JzIGhhdmUgYmVlbiBkZXRlY3RlZCBpbiA2NAorICogTVNCIGJpdHMgKG1vZGUgMTI4IGJpdHMgb25seSkKKyAqIEBub3RlICAoKikgYXZhaWxhYmlsaXR5IGRlcGVuZHMgb24gZGV2aWNlcworICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIEZMQVNIX0ZMQUcgKFNFVCBvciBSRVNFVCkuCisgKi8KKyNkZWZpbmUgX19IQUxfRkxBU0hfR0VUX0ZMQUcoX19GTEFHX18pICAgICAgICAgICAgICAgICAgICAgXAorICAoKCgoX19GTEFHX18pICYgRkxBU0hfRkxBR19FQ0NSX0VSUk9SUykgIT0gMFUpICAgICAgICAgICBcCisgICAgICAgPyAoUkVBRF9CSVQoRkxBU0gtPkVDQ1IsIChfX0ZMQUdfXykpID09IChfX0ZMQUdfXykpIFwKKyAgICAgICA6IChSRUFEX0JJVChGTEFTSC0+U1IsIChfX0ZMQUdfXykpID09IChfX0ZMQUdfXykpKQorCisvKioKKyAqIEBicmllZiAgQ2xlYXIgdGhlIEZMQVNIJ3MgcGVuZGluZyBmbGFncy4KKyAqIEBwYXJhbSAgX19GTEFHX18gc3BlY2lmaWVzIHRoZSBGTEFTSCBmbGFncyB0byBjbGVhci4KKyAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICBAYXJnIEZMQVNIX0ZMQUdfRU9QOiBGTEFTSCBFbmQgb2YgT3BlcmF0aW9uIGZsYWcKKyAqICAgICBAYXJnIEZMQVNIX0ZMQUdfT1BFUlI6IEZMQVNIIE9wZXJhdGlvbiBlcnJvciBmbGFnCisgKiAgICAgQGFyZyBGTEFTSF9GTEFHX1BST0dFUlI6IEZMQVNIIFByb2dyYW1taW5nIGVycm9yIGZsYWcKKyAqICAgICBAYXJnIEZMQVNIX0ZMQUdfV1JQRVJSOiBGTEFTSCBXcml0ZSBwcm90ZWN0aW9uIGVycm9yIGZsYWcKKyAqICAgICBAYXJnIEZMQVNIX0ZMQUdfUEdBRVJSOiBGTEFTSCBQcm9ncmFtbWluZyBhbGlnbm1lbnQgZXJyb3IgZmxhZworICogICAgIEBhcmcgRkxBU0hfRkxBR19TSVpFUlI6IEZMQVNIIFNpemUgZXJyb3IgZmxhZworICogICAgIEBhcmcgRkxBU0hfRkxBR19QR1NFUlI6IEZMQVNIIFByb2dyYW1taW5nIHNlcXVlbmNlIGVycm9yIGZsYWcKKyAqICAgICBAYXJnIEZMQVNIX0ZMQUdfTUlTRVJSOiBGTEFTSCBGYXN0IHByb2dyYW1taW5nIGRhdGEgbWlzcyBlcnJvciBmbGFnCisgKiAgICAgQGFyZyBGTEFTSF9GTEFHX0ZBU1RFUlI6IEZMQVNIIEZhc3QgcHJvZ3JhbW1pbmcgZXJyb3IgZmxhZworICogICAgIEBhcmcgRkxBU0hfRkxBR19SREVSUjogRkxBU0ggUENST1AgcmVhZCAgZXJyb3IgZmxhZworICogICAgIEBhcmcgRkxBU0hfRkxBR19PUFRWRVJSOiBGTEFTSCBPcHRpb24gdmFsaWRpdHkgZXJyb3IgZmxhZworICogICAgIEBhcmcgRkxBU0hfRkxBR19FQ0NDOiBGTEFTSCBvbmUgRUNDIGVycm9yIGhhcyBiZWVuIGRldGVjdGVkIGFuZCBjb3JyZWN0ZWQKKyAqIGluIDY0IExTQiBiaXRzCisgKiAgICAgQGFyZyBGTEFTSF9GTEFHX0VDQ0Q6IEZMQVNIIHR3byBFQ0MgZXJyb3JzIGhhdmUgYmVlbiBkZXRlY3RlZCBpbiA2NCBMU0IKKyAqIGJpdHMKKyAqICAgICBAYXJnIEZMQVNIX0ZMQUdfRUNDQzIoKik6IEZMQVNIIG9uZSBFQ0MgZXJyb3IgaGFzIGJlZW4gZGV0ZWN0ZWQgYW5kCisgKiBjb3JyZWN0ZWQgaW4gNjQgTVNCIGJpdHMgKG1vZGUgMTI4IGJpdHMgb25seSkKKyAqICAgICBAYXJnIEZMQVNIX0ZMQUdfRUNDRDIoKik6IEZMQVNIIHR3byBFQ0MgZXJyb3JzIGhhdmUgYmVlbiBkZXRlY3RlZCBpbiA2NAorICogTVNCIGJpdHMgKG1vZGUgMTI4IGJpdHMgb25seSkKKyAqICAgICBAYXJnIEZMQVNIX0ZMQUdfU1JfRVJST1JTOiBGTEFTSCBBbGwgU1IgZXJyb3JzIGZsYWdzCisgKiAgICAgQGFyZyBGTEFTSF9GTEFHX0VDQ1JfRVJST1JTOiBGTEFTSCBBbGwgRUNDUiBlcnJvcnMgZmxhZ3MKKyAqIEBub3RlICAoKikgYXZhaWxhYmlsaXR5IGRlcGVuZHMgb24gZGV2aWNlcworICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfRkxBU0hfQ0xFQVJfRkxBRyhfX0ZMQUdfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoKF9fRkxBR19fKSAmIEZMQVNIX0ZMQUdfRUNDUl9FUlJPUlMpICE9IDBVKSB7ICAgICAgICAgICAgICAgIFwKKyAgICAgIFNFVF9CSVQoRkxBU0gtPkVDQ1IsICgoX19GTEFHX18pICYgRkxBU0hfRkxBR19FQ0NSX0VSUk9SUykpOyAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoKF9fRkxBR19fKSAmIH4oRkxBU0hfRkxBR19FQ0NSX0VSUk9SUykpICE9IDBVKSB7ICAgICAgICAgICAgIFwKKyAgICAgIFdSSVRFX1JFRyhGTEFTSC0+U1IsICgoX19GTEFHX18pICYgfihGTEFTSF9GTEFHX0VDQ1JfRVJST1JTKSkpOyBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorLyoqCisgKiBAfQorICovCisKKy8qIEluY2x1ZGUgRkxBU0ggSEFMIEV4dGVuZGVkIG1vZHVsZSAqLworI2luY2x1ZGUgInN0bTMyZzR4eF9oYWxfZmxhc2hfZXguaCIKKyNpbmNsdWRlICJzdG0zMmc0eHhfaGFsX2ZsYXNoX3JhbWZ1bmMuaCIKKworLyogRXhwb3J0ZWQgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRkxBU0hfRXhwb3J0ZWRfVmFyaWFibGVzIEZMQVNIIEV4cG9ydGVkIFZhcmlhYmxlcworICogQHsKKyAqLworZXh0ZXJuIEZMQVNIX1Byb2Nlc3NUeXBlRGVmIHBGbGFzaDsKKy8qKgorICogQH0KKyAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIEZMQVNIX0V4cG9ydGVkX0Z1bmN0aW9ucworICogQHsKKyAqLworCisvKiBQcm9ncmFtIG9wZXJhdGlvbiBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIEBhZGR0b2dyb3VwIEZMQVNIX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEKKyAqIEB7CisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GTEFTSF9Qcm9ncmFtKHVpbnQzMl90IFR5cGVQcm9ncmFtLCB1aW50MzJfdCBBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgRGF0YSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkxBU0hfUHJvZ3JhbV9JVCh1aW50MzJfdCBUeXBlUHJvZ3JhbSwgdWludDMyX3QgQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IERhdGEpOworLyogRkxBU0ggSVJRIGhhbmRsZXIgbWV0aG9kICovCit2b2lkIEhBTF9GTEFTSF9JUlFIYW5kbGVyKHZvaWQpOworLyogQ2FsbGJhY2tzIGluIG5vbiBibG9ja2luZyBtb2RlcyAqLwordm9pZCBIQUxfRkxBU0hfRW5kT2ZPcGVyYXRpb25DYWxsYmFjayh1aW50MzJfdCBSZXR1cm5WYWx1ZSk7Cit2b2lkIEhBTF9GTEFTSF9PcGVyYXRpb25FcnJvckNhbGxiYWNrKHVpbnQzMl90IFJldHVyblZhbHVlKTsKKy8qKgorICogQH0KKyAqLworCisvKiBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIEBhZGR0b2dyb3VwIEZMQVNIX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIKKyAqIEB7CisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GTEFTSF9VbmxvY2sodm9pZCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkxBU0hfTG9jayh2b2lkKTsKKy8qIE9wdGlvbiBieXRlcyBjb250cm9sICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkxBU0hfT0JfVW5sb2NrKHZvaWQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIX09CX0xvY2sodm9pZCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkxBU0hfT0JfTGF1bmNoKHZvaWQpOworLyoqCisgKiBAfQorICovCisKKy8qIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogQGFkZHRvZ3JvdXAgRkxBU0hfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMworICogQHsKKyAqLwordWludDMyX3QgSEFMX0ZMQVNIX0dldEVycm9yKHZvaWQpOworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisvKiogQGFkZHRvZ3JvdXAgRkxBU0hfUHJpdmF0ZV9GdW5jdGlvbnMKKyAqIEB7CisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKHVpbnQzMl90IFRpbWVvdXQpOworLyoqCisgKiBAfQorICovCisKKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRkxBU0hfUHJpdmF0ZV9Db25zdGFudHMgRkxBU0ggUHJpdmF0ZSBDb25zdGFudHMKKyAqIEB7CisgKi8KKyNkZWZpbmUgRkxBU0hfU0laRV9EQVRBX1JFR0lTVEVSIEZMQVNIU0laRV9CQVNFCisKKyNpZiBkZWZpbmVkKEZMQVNIX09QVFJfREJBTkspCisjZGVmaW5lIEZMQVNIX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKCgqKCh1aW50MTZfdCAqKUZMQVNIX1NJWkVfREFUQV9SRUdJU1RFUikpID09IDB4RkZGRlUpKSBcCisgICAgICAgPyAoMHgyMDBVTCA8PCAxMFUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgOiAoKCgqKCh1aW50MzJfdCAqKUZMQVNIX1NJWkVfREFUQV9SRUdJU1RFUikpICYgMHhGRkZGVUwpIDw8IDEwVSkpCisjZGVmaW5lIEZMQVNIX0JBTktfU0laRSAoRkxBU0hfU0laRSA+PiAxKQorI2RlZmluZSBGTEFTSF9QQUdFX05CICAgICAgICAgICAgICAgICBcCisgICgoRkxBU0hfU0laRSA9PSAweDAwMDgwMDAwVSkgPyAxMjhVIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICgoRkxBU0hfU0laRSA9PSAweDAwMDQwMDAwVSkgPyA2NFUgOiAzMlUpKQorI2RlZmluZSBGTEFTSF9QQUdFX1NJWkVfMTI4X0JJVFMgMHgxMDAwVSAvKiA0IEtCICovCisjZWxzZQorI2RlZmluZSBGTEFTSF9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKCgoKigodWludDE2X3QgKilGTEFTSF9TSVpFX0RBVEFfUkVHSVNURVIpKSA9PSAweEZGRkZVKSkgXAorICAgICAgID8gKDB4ODBVTCA8PCAxMFUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIDogKCgoKigodWludDMyX3QgKilGTEFTSF9TSVpFX0RBVEFfUkVHSVNURVIpKSAmIDB4RkZGRlVMKSA8PCAxMFUpKQorI2RlZmluZSBGTEFTSF9CQU5LX1NJWkUgKEZMQVNIX1NJWkUpCisjZGVmaW5lIEZMQVNIX1BBR0VfTkIgICAgICAgICAgICAgICAgIFwKKyAgKChGTEFTSF9TSVpFID09IDB4MDAwODAwMDBVKSA/IDI1NlUgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKChGTEFTSF9TSVpFID09IDB4MDAwNDAwMDBVKSA/IDEyOFUgOiA2NFUpKQorI2VuZGlmCisKKyNkZWZpbmUgRkxBU0hfUEFHRV9TSVpFIDB4ODAwVSAvKiAyIEtCICovCisKKyNkZWZpbmUgRkxBU0hfVElNRU9VVF9WQUxVRSAxMDAwVSAvKiAxIHMgICovCisKKy8qKgorICogQH0KKyAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBGTEFTSF9Qcml2YXRlX01hY3JvcyBGTEFTSCBQcml2YXRlIE1hY3JvcworICogIEB7CisgKi8KKworI2RlZmluZSBJU19GTEFTSF9UWVBFRVJBU0UoVkFMVUUpIFwKKyAgKCgoVkFMVUUpID09IEZMQVNIX1RZUEVFUkFTRV9QQUdFUykgfHwgKChWQUxVRSkgPT0gRkxBU0hfVFlQRUVSQVNFX01BU1NFUkFTRSkpCisKKyNpZiBkZWZpbmVkKEZMQVNIX09QVFJfREJBTkspCisjZGVmaW5lIElTX0ZMQVNIX0JBTksoQkFOSykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoQkFOSykgPT0gRkxBU0hfQkFOS18xKSB8fCAoKEJBTkspID09IEZMQVNIX0JBTktfMikgfHwgXAorICAgKChCQU5LKSA9PSBGTEFTSF9CQU5LX0JPVEgpKQorCisjZGVmaW5lIElTX0ZMQVNIX0JBTktfRVhDTFVTSVZFKEJBTkspIFwKKyAgKCgoQkFOSykgPT0gRkxBU0hfQkFOS18xKSB8fCAoKEJBTkspID09IEZMQVNIX0JBTktfMikpCisjZWxzZQorI2RlZmluZSBJU19GTEFTSF9CQU5LKEJBTkspICgoQkFOSykgPT0gRkxBU0hfQkFOS18xKQorCisjZGVmaW5lIElTX0ZMQVNIX0JBTktfRVhDTFVTSVZFKEJBTkspICgoQkFOSykgPT0gRkxBU0hfQkFOS18xKQorI2VuZGlmCisKKyNkZWZpbmUgSVNfRkxBU0hfVFlQRVBST0dSQU0oVkFMVUUpICAgICAgICAgICAgIFwKKyAgKCgoVkFMVUUpID09IEZMQVNIX1RZUEVQUk9HUkFNX0RPVUJMRVdPUkQpIHx8IFwKKyAgICgoVkFMVUUpID09IEZMQVNIX1RZUEVQUk9HUkFNX0ZBU1QpIHx8ICAgICAgIFwKKyAgICgoVkFMVUUpID09IEZMQVNIX1RZUEVQUk9HUkFNX0ZBU1RfQU5EX0xBU1QpKQorCisjZGVmaW5lIElTX0ZMQVNIX01BSU5fTUVNX0FERFJFU1MoQUREUkVTUykgXAorICAoKChBRERSRVNTKSA+PSBGTEFTSF9CQVNFKSAmJiAoKEFERFJFU1MpIDwgKEZMQVNIX0JBU0UgKyBGTEFTSF9TSVpFKSkpCisKKyNkZWZpbmUgSVNfRkxBU0hfT1RQX0FERFJFU1MoQUREUkVTUykgXAorICAoKChBRERSRVNTKSA+PSAweDFGRkY3MDAwVSkgJiYgKChBRERSRVNTKSA8PSAweDFGRkY3M0ZGVSkpCisKKyNkZWZpbmUgSVNfRkxBU0hfUFJPR1JBTV9BRERSRVNTKEFERFJFU1MpIFwKKyAgKElTX0ZMQVNIX01BSU5fTUVNX0FERFJFU1MoQUREUkVTUykgfHwgSVNfRkxBU0hfT1RQX0FERFJFU1MoQUREUkVTUykpCisKKyNkZWZpbmUgSVNfRkxBU0hfUEFHRShQQUdFKSAoKFBBR0UpIDwgRkxBU0hfUEFHRV9OQikKKworI2RlZmluZSBJU19PUFRJT05CWVRFKFZBTFVFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKFZBTFVFKSA8PSAoT1BUSU9OQllURV9XUlAgfCBPUFRJT05CWVRFX1JEUCB8IE9QVElPTkJZVEVfVVNFUiB8IFwKKyAgICAgICAgICAgICAgICBPUFRJT05CWVRFX1BDUk9QIHwgT1BUSU9OQllURV9CT09UX0xPQ0sgfCBPUFRJT05CWVRFX1NFQykpKQorCisjaWYgZGVmaW5lZChGTEFTSF9PUFRSX0RCQU5LKQorI2RlZmluZSBJU19PQl9XUlBBUkVBKFZBTFVFKSAgICAgICAgICAgICAgXAorICAoKChWQUxVRSkgPT0gT0JfV1JQQVJFQV9CQU5LMV9BUkVBQSkgfHwgXAorICAgKChWQUxVRSkgPT0gT0JfV1JQQVJFQV9CQU5LMV9BUkVBQikgfHwgXAorICAgKChWQUxVRSkgPT0gT0JfV1JQQVJFQV9CQU5LMl9BUkVBQSkgfHwgKChWQUxVRSkgPT0gT0JfV1JQQVJFQV9CQU5LMl9BUkVBQikpCisjZWxzZQorI2RlZmluZSBJU19PQl9XUlBBUkVBKFZBTFVFKSBcCisgICgoKFZBTFVFKSA9PSBPQl9XUlBBUkVBX0JBTksxX0FSRUFBKSB8fCAoKFZBTFVFKSA9PSBPQl9XUlBBUkVBX0JBTksxX0FSRUFCKSkKKyNlbmRpZgorCisjZGVmaW5lIElTX09CX0JPT1RfTE9DSyhWQUxVRSkgXAorICAoKChWQUxVRSkgPT0gT0JfQk9PVF9MT0NLX0VOQUJMRSkgfHwgKChWQUxVRSkgPT0gT0JfQk9PVF9MT0NLX0RJU0FCTEUpKQorCisjZGVmaW5lIElTX09CX1JEUF9MRVZFTChMRVZFTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoTEVWRUwpID09IE9CX1JEUF9MRVZFTF8wKSB8fCAoKExFVkVMKSA9PSBPQl9SRFBfTEVWRUxfMSkgfHwgXAorICAgKChMRVZFTCkgPT0gT0JfUkRQX0xFVkVMXzIpKQorCisjZGVmaW5lIElTX09CX1VTRVJfVFlQRShUWVBFKSAoKChUWVBFKSA8PSAweDFGRkZGVSkgJiYgKChUWVBFKSAhPSAwVSkpCisKKyNkZWZpbmUgSVNfT0JfVVNFUl9CT1JfTEVWRUwoTEVWRUwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKChMRVZFTCkgPT0gT0JfQk9SX0xFVkVMXzApIHx8ICgoTEVWRUwpID09IE9CX0JPUl9MRVZFTF8xKSB8fCBcCisgICAoKExFVkVMKSA9PSBPQl9CT1JfTEVWRUxfMikgfHwgKChMRVZFTCkgPT0gT0JfQk9SX0xFVkVMXzMpIHx8IFwKKyAgICgoTEVWRUwpID09IE9CX0JPUl9MRVZFTF80KSkKKworI2RlZmluZSBJU19PQl9VU0VSX1NUT1AoVkFMVUUpIFwKKyAgKCgoVkFMVUUpID09IE9CX1NUT1BfUlNUKSB8fCAoKFZBTFVFKSA9PSBPQl9TVE9QX05PUlNUKSkKKworI2RlZmluZSBJU19PQl9VU0VSX1NUQU5EQlkoVkFMVUUpIFwKKyAgKCgoVkFMVUUpID09IE9CX1NUQU5EQllfUlNUKSB8fCAoKFZBTFVFKSA9PSBPQl9TVEFOREJZX05PUlNUKSkKKworI2RlZmluZSBJU19PQl9VU0VSX1NIVVRET1dOKFZBTFVFKSBcCisgICgoKFZBTFVFKSA9PSBPQl9TSFVURE9XTl9SU1QpIHx8ICgoVkFMVUUpID09IE9CX1NIVVRET1dOX05PUlNUKSkKKworI2RlZmluZSBJU19PQl9VU0VSX0lXREcoVkFMVUUpIFwKKyAgKCgoVkFMVUUpID09IE9CX0lXREdfSFcpIHx8ICgoVkFMVUUpID09IE9CX0lXREdfU1cpKQorCisjZGVmaW5lIElTX09CX1VTRVJfSVdER19TVE9QKFZBTFVFKSBcCisgICgoKFZBTFVFKSA9PSBPQl9JV0RHX1NUT1BfRlJFRVpFKSB8fCAoKFZBTFVFKSA9PSBPQl9JV0RHX1NUT1BfUlVOKSkKKworI2RlZmluZSBJU19PQl9VU0VSX0lXREdfU1REQlkoVkFMVUUpIFwKKyAgKCgoVkFMVUUpID09IE9CX0lXREdfU1REQllfRlJFRVpFKSB8fCAoKFZBTFVFKSA9PSBPQl9JV0RHX1NUREJZX1JVTikpCisKKyNkZWZpbmUgSVNfT0JfVVNFUl9XV0RHKFZBTFVFKSBcCisgICgoKFZBTFVFKSA9PSBPQl9XV0RHX0hXKSB8fCAoKFZBTFVFKSA9PSBPQl9XV0RHX1NXKSkKKworI2lmIGRlZmluZWQoRkxBU0hfT1BUUl9EQkFOSykKKyNkZWZpbmUgSVNfT0JfVVNFUl9CRkIyKFZBTFVFKSBcCisgICgoKFZBTFVFKSA9PSBPQl9CRkIyX0RJU0FCTEUpIHx8ICgoVkFMVUUpID09IE9CX0JGQjJfRU5BQkxFKSkKKworI2RlZmluZSBJU19PQl9VU0VSX0RCQU5LKFZBTFVFKSBcCisgICgoKFZBTFVFKSA9PSBPQl9EQkFOS18xMjhfQklUUykgfHwgKChWQUxVRSkgPT0gT0JfREJBTktfNjRfQklUUykpCisjZW5kaWYKKworI2lmIGRlZmluZWQoRkxBU0hfT1BUUl9QQjRfUFVQRU4pCisjZGVmaW5lIElTX09CX1VTRVJfUEI0X1BVUEVOKFZBTFVFKSBcCisgICgoKFZBTFVFKSA9PSBPQl9QQjRfUFVQRU5fRElTQUJMRSkgfHwgKChWQUxVRSkgPT0gT0JfUEI0X1BVUEVOX0VOQUJMRSkpCisjZW5kaWYKKworI2RlZmluZSBJU19PQl9VU0VSX0JPT1QxKFZBTFVFKSBcCisgICgoKFZBTFVFKSA9PSBPQl9CT09UMV9TUkFNKSB8fCAoKFZBTFVFKSA9PSBPQl9CT09UMV9TWVNURU0pKQorCisjZGVmaW5lIElTX09CX1VTRVJfU1JBTV9QQVJJVFkoVkFMVUUpIFwKKyAgKCgoVkFMVUUpID09IE9CX1NSQU1fUEFSSVRZX0VOQUJMRSkgfHwgKChWQUxVRSkgPT0gT0JfU1JBTV9QQVJJVFlfRElTQUJMRSkpCisKKyNkZWZpbmUgSVNfT0JfVVNFUl9DQ01TUkFNX1JTVChWQUxVRSkgXAorICAoKChWQUxVRSkgPT0gT0JfQ0NNU1JBTV9SU1RfRVJBU0UpIHx8ICgoVkFMVUUpID09IE9CX0NDTVNSQU1fUlNUX05PVF9FUkFTRSkpCisKKyNkZWZpbmUgSVNfT0JfVVNFUl9TV0JPT1QwKFZBTFVFKSBcCisgICgoKFZBTFVFKSA9PSBPQl9CT09UMF9GUk9NX09CKSB8fCAoKFZBTFVFKSA9PSBPQl9CT09UMF9GUk9NX1BJTikpCisKKyNkZWZpbmUgSVNfT0JfVVNFUl9CT09UMChWQUxVRSkgXAorICAoKChWQUxVRSkgPT0gT0JfbkJPT1QwX1JFU0VUKSB8fCAoKFZBTFVFKSA9PSBPQl9uQk9PVDBfU0VUKSkKKworI2RlZmluZSBJU19PQl9VU0VSX05SU1RfTU9ERShWQUxVRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKFZBTFVFKSA9PSBPQl9OUlNUX01PREVfR1BJTykgfHwgKChWQUxVRSkgPT0gT0JfTlJTVF9NT0RFX0lOUFVUX09OTFkpIHx8IFwKKyAgICgoVkFMVUUpID09IE9CX05SU1RfTU9ERV9JTlBVVF9PVVRQVVQpKQorCisjZGVmaW5lIElTX09CX1VTRVJfSVJIRU4oVkFMVUUpIFwKKyAgKCgoVkFMVUUpID09IE9CX0lSSF9FTkFCTEUpIHx8ICgoVkFMVUUpID09IE9CX0lSSF9ESVNBQkxFKSkKKworI2RlZmluZSBJU19PQl9QQ1JPUF9SRFAoVkFMVUUpIFwKKyAgKCgoVkFMVUUpID09IE9CX1BDUk9QX1JEUF9OT1RfRVJBU0UpIHx8ICgoVkFMVUUpID09IE9CX1BDUk9QX1JEUF9FUkFTRSkpCisKKyNkZWZpbmUgSVNfT0JfU0VDTUVNX1NJWkUoVkFMVUUpICgoVkFMVUUpIDw9IEZMQVNIX1BBR0VfTkIpCisKKyNkZWZpbmUgSVNfRkxBU0hfTEFURU5DWShMQVRFTkNZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKExBVEVOQ1kpID09IEZMQVNIX0xBVEVOQ1lfMCkgfHwgKChMQVRFTkNZKSA9PSBGTEFTSF9MQVRFTkNZXzEpIHx8ICAgXAorICAgKChMQVRFTkNZKSA9PSBGTEFTSF9MQVRFTkNZXzIpIHx8ICgoTEFURU5DWSkgPT0gRkxBU0hfTEFURU5DWV8zKSB8fCAgIFwKKyAgICgoTEFURU5DWSkgPT0gRkxBU0hfTEFURU5DWV80KSB8fCAoKExBVEVOQ1kpID09IEZMQVNIX0xBVEVOQ1lfNSkgfHwgICBcCisgICAoKExBVEVOQ1kpID09IEZMQVNIX0xBVEVOQ1lfNikgfHwgKChMQVRFTkNZKSA9PSBGTEFTSF9MQVRFTkNZXzcpIHx8ICAgXAorICAgKChMQVRFTkNZKSA9PSBGTEFTSF9MQVRFTkNZXzgpIHx8ICgoTEFURU5DWSkgPT0gRkxBU0hfTEFURU5DWV85KSB8fCAgIFwKKyAgICgoTEFURU5DWSkgPT0gRkxBU0hfTEFURU5DWV8xMCkgfHwgKChMQVRFTkNZKSA9PSBGTEFTSF9MQVRFTkNZXzExKSB8fCBcCisgICAoKExBVEVOQ1kpID09IEZMQVNIX0xBVEVOQ1lfMTIpIHx8ICgoTEFURU5DWSkgPT0gRkxBU0hfTEFURU5DWV8xMykgfHwgXAorICAgKChMQVRFTkNZKSA9PSBGTEFTSF9MQVRFTkNZXzE0KSB8fCAoKExBVEVOQ1kpID09IEZMQVNIX0xBVEVOQ1lfMTUpKQorLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyRzR4eF9IQUxfRkxBU0hfSCAqLwpkaWZmIC0tZ2l0IGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfaGFsX2ZsYXNoX2V4LmggYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9oYWxfZmxhc2hfZXguaAppbmRleCAwNjMwMTBhLi4xNWE1ZTlkIDEwMDY0NAotLS0gYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9oYWxfZmxhc2hfZXguaAorKysgYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9oYWxfZmxhc2hfZXguaApAQCAtMSw4OSArMSw4OSBAQAotLyoqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEBmaWxlICAgIHN0bTMyZzR4eF9oYWxfZmxhc2hfZXguaA0KLSAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtDQotICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgRkxBU0ggSEFMIEV4dGVuZGVkIG1vZHVsZS4NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQGF0dGVudGlvbg0KLSAqDQotICogQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KLSAqDQotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0ZXJtcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlDQotICppbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb2Z0d2FyZSBjb21wb25lbnQuIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcw0KLSAqd2l0aCB0aGlzIHNvZnR3YXJlLCBpdCBpcyBwcm92aWRlZCBBUy1JUy4NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICovDQotDQotLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaWZuZGVmIFNUTTMyRzR4eF9IQUxfRkxBU0hfRVhfSA0KLSNkZWZpbmUgU1RNMzJHNHh4X0hBTF9GTEFTSF9FWF9IDQotDQotI2lmZGVmIF9fY3BsdXNwbHVzDQotZXh0ZXJuICJDIiB7DQotI2VuZGlmDQotDQotLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaW5jbHVkZSAic3RtMzJnNHh4X2hhbF9kZWYuaCINCi0NCi0vKiogQGFkZHRvZ3JvdXAgU1RNMzJHNHh4X0hBTF9Ecml2ZXINCi0gKiBAew0KLSAqLw0KLQ0KLS8qKiBAYWRkdG9ncm91cCBGTEFTSEV4DQotICogQHsNCi0gKi8NCi0NCi0vKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLQ0KLS8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotDQotLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0NCi0vKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAYWRkdG9ncm91cCBGTEFTSEV4X0V4cG9ydGVkX0Z1bmN0aW9ucw0KLSAqIEB7DQotICovDQotDQotLyogRXh0ZW5kZWQgUHJvZ3JhbSBvcGVyYXRpb24gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qKiBAYWRkdG9ncm91cCBGTEFTSEV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDENCi0gKiBAew0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9GTEFTSEV4X0VyYXNlKEZMQVNIX0VyYXNlSW5pdFR5cGVEZWYgKnBFcmFzZUluaXQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKlBhZ2VFcnJvcik7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIRXhfRXJhc2VfSVQoRkxBU0hfRXJhc2VJbml0VHlwZURlZiAqcEVyYXNlSW5pdCk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIRXhfT0JQcm9ncmFtKEZMQVNIX09CUHJvZ3JhbUluaXRUeXBlRGVmICpwT0JJbml0KTsNCi12b2lkIEhBTF9GTEFTSEV4X09CR2V0Q29uZmlnKEZMQVNIX09CUHJvZ3JhbUluaXRUeXBlRGVmICpwT0JJbml0KTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfRkxBU0hFeF9FbmFibGVTZWNNZW1Qcm90ZWN0aW9uKHVpbnQzMl90IEJhbmspOw0KLXZvaWQgSEFMX0ZMQVNIRXhfRW5hYmxlRGVidWdnZXIodm9pZCk7DQotdm9pZCBIQUxfRkxBU0hFeF9EaXNhYmxlRGVidWdnZXIodm9pZCk7DQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAYWRkdG9ncm91cCBGTEFTSEV4X1ByaXZhdGVfRnVuY3Rpb25zDQotICogQHsNCi0gKi8NCi12b2lkIEZMQVNIX1BhZ2VFcmFzZSh1aW50MzJfdCBQYWdlLCB1aW50MzJfdCBCYW5rcyk7DQotdm9pZCBGTEFTSF9GbHVzaENhY2hlcyh2b2lkKTsNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0jaWZkZWYgX19jcGx1c3BsdXMNCi19DQotI2VuZGlmDQotDQotI2VuZGlmIC8qIFNUTTMyRzR4eF9IQUxfRkxBU0hfRVhfSCAqLw0KKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGZpbGUgICAgc3RtMzJnNHh4X2hhbF9mbGFzaF9leC5oCisgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgRkxBU0ggSEFMIEV4dGVuZGVkIG1vZHVsZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBhdHRlbnRpb24KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRlcm1zIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUKKyAqaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc29mdHdhcmUgY29tcG9uZW50LiBJZiBubyBMSUNFTlNFIGZpbGUgY29tZXMKKyAqd2l0aCB0aGlzIHNvZnR3YXJlLCBpdCBpcyBwcm92aWRlZCBBUy1JUy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMkc0eHhfSEFMX0ZMQVNIX0VYX0gKKyNkZWZpbmUgU1RNMzJHNHh4X0hBTF9GTEFTSF9FWF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmc0eHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHNHh4X0hBTF9Ecml2ZXIKKyAqIEB7CisgKi8KKworLyoqIEBhZGR0b2dyb3VwIEZMQVNIRXgKKyAqIEB7CisgKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBGTEFTSEV4X0V4cG9ydGVkX0Z1bmN0aW9ucworICogQHsKKyAqLworCisvKiBFeHRlbmRlZCBQcm9ncmFtIG9wZXJhdGlvbiBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogQGFkZHRvZ3JvdXAgRkxBU0hFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxCisgKiBAeworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkxBU0hFeF9FcmFzZShGTEFTSF9FcmFzZUluaXRUeXBlRGVmICpwRXJhc2VJbml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKlBhZ2VFcnJvcik7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkxBU0hFeF9FcmFzZV9JVChGTEFTSF9FcmFzZUluaXRUeXBlRGVmICpwRXJhc2VJbml0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GTEFTSEV4X09CUHJvZ3JhbShGTEFTSF9PQlByb2dyYW1Jbml0VHlwZURlZiAqcE9CSW5pdCk7Cit2b2lkIEhBTF9GTEFTSEV4X09CR2V0Q29uZmlnKEZMQVNIX09CUHJvZ3JhbUluaXRUeXBlRGVmICpwT0JJbml0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GTEFTSEV4X0VuYWJsZVNlY01lbVByb3RlY3Rpb24odWludDMyX3QgQmFuayk7Cit2b2lkIEhBTF9GTEFTSEV4X0VuYWJsZURlYnVnZ2VyKHZvaWQpOwordm9pZCBIQUxfRkxBU0hFeF9EaXNhYmxlRGVidWdnZXIodm9pZCk7CisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qKiBAYWRkdG9ncm91cCBGTEFTSEV4X1ByaXZhdGVfRnVuY3Rpb25zCisgKiBAeworICovCit2b2lkIEZMQVNIX1BhZ2VFcmFzZSh1aW50MzJfdCBQYWdlLCB1aW50MzJfdCBCYW5rcyk7Cit2b2lkIEZMQVNIX0ZsdXNoQ2FjaGVzKHZvaWQpOworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyRzR4eF9IQUxfRkxBU0hfRVhfSCAqLwpkaWZmIC0tZ2l0IGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfaGFsX2ZsYXNoX3JhbWZ1bmMuaCBiL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9JbmMvc3RtMzJnNHh4X2hhbF9mbGFzaF9yYW1mdW5jLmgKaW5kZXggYmM0YWJhMC4uZGI3NWYxMCAxMDA2NDQKLS0tIGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfaGFsX2ZsYXNoX3JhbWZ1bmMuaAorKysgYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9oYWxfZmxhc2hfcmFtZnVuYy5oCkBAIC0xLDc0ICsxLDc0IEBACi0vKioNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQGZpbGUgICAgc3RtMzJnNHh4X2hhbF9mbGFzaF9yYW1mdW5jLmgNCi0gKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQ0KLSAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIEZMQVNIIFJBTUZVTkMgZHJpdmVyLg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBAYXR0ZW50aW9uDQotICoNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQotICoNCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRlcm1zIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUNCi0gKmluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4gSWYgbm8gTElDRU5TRSBmaWxlIGNvbWVzDQotICp3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKi8NCi0NCi0vKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpZm5kZWYgU1RNMzJHNHh4X0ZMQVNIX1JBTUZVTkNfSA0KLSNkZWZpbmUgU1RNMzJHNHh4X0ZMQVNIX1JBTUZVTkNfSA0KLQ0KLSNpZmRlZiBfX2NwbHVzcGx1cw0KLWV4dGVybiAiQyIgew0KLSNlbmRpZg0KLQ0KLS8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotI2luY2x1ZGUgInN0bTMyZzR4eF9oYWxfZGVmLmgiDQotDQotLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzR4eF9IQUxfRHJpdmVyDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGFkZHRvZ3JvdXAgRkxBU0hfUkFNRlVOQw0KLSAqIEB7DQotICovDQotDQotLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBhZGR0b2dyb3VwIEZMQVNIX1JBTUZVTkNfRXhwb3J0ZWRfRnVuY3Rpb25zDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGFkZHRvZ3JvdXAgRkxBU0hfUkFNRlVOQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxDQotICogQHsNCi0gKi8NCi0vKiBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zDQotICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLV9fUkFNX0ZVTkMgSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIRXhfRW5hYmxlUnVuUG93ZXJEb3duKHZvaWQpOw0KLV9fUkFNX0ZVTkMgSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIRXhfRGlzYWJsZVJ1blBvd2VyRG93bih2b2lkKTsNCi0jaWYgZGVmaW5lZChGTEFTSF9PUFRSX0RCQU5LKQ0KLV9fUkFNX0ZVTkMgSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIRXhfT0JfREJhbmtDb25maWcodWludDMyX3QgREJhbmtDb25maWcpOw0KLSNlbmRpZg0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotI2lmZGVmIF9fY3BsdXNwbHVzDQotfQ0KLSNlbmRpZg0KLQ0KLSNlbmRpZiAvKiBTVE0zMkc0eHhfRkxBU0hfUkFNRlVOQ19IICovDQorLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAZmlsZSAgICBzdG0zMmc0eHhfaGFsX2ZsYXNoX3JhbWZ1bmMuaAorICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIEZMQVNIIFJBTUZVTkMgZHJpdmVyLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGF0dGVudGlvbgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGVybXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZQorICppbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb2Z0d2FyZSBjb21wb25lbnQuIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcworICp3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyRzR4eF9GTEFTSF9SQU1GVU5DX0gKKyNkZWZpbmUgU1RNMzJHNHh4X0ZMQVNIX1JBTUZVTkNfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnNHh4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzR4eF9IQUxfRHJpdmVyCisgKiBAeworICovCisKKy8qKiBAYWRkdG9ncm91cCBGTEFTSF9SQU1GVU5DCisgKiBAeworICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBGTEFTSF9SQU1GVU5DX0V4cG9ydGVkX0Z1bmN0aW9ucworICogQHsKKyAqLworCisvKiogQGFkZHRvZ3JvdXAgRkxBU0hfUkFNRlVOQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxCisgKiBAeworICovCisvKiBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitfX1JBTV9GVU5DIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9GTEFTSEV4X0VuYWJsZVJ1blBvd2VyRG93bih2b2lkKTsKK19fUkFNX0ZVTkMgSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIRXhfRGlzYWJsZVJ1blBvd2VyRG93bih2b2lkKTsKKyNpZiBkZWZpbmVkKEZMQVNIX09QVFJfREJBTkspCitfX1JBTV9GVU5DIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9GTEFTSEV4X09CX0RCYW5rQ29uZmlnKHVpbnQzMl90IERCYW5rQ29uZmlnKTsKKyNlbmRpZgorLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMkc0eHhfRkxBU0hfUkFNRlVOQ19IICovCmRpZmYgLS1naXQgYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9oYWxfZ3Bpby5oIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfaGFsX2dwaW8uaAppbmRleCBlYzZiMjljLi4zNGEyYTVkIDEwMDY0NAotLS0gYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9oYWxfZ3Bpby5oCisrKyBiL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9JbmMvc3RtMzJnNHh4X2hhbF9ncGlvLmgKQEAgLTEsMzU2ICsxLDM1NiBAQAotLyoqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEBmaWxlICAgIHN0bTMyZzR4eF9oYWxfZ3Bpby5oDQotICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0NCi0gKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBHUElPIEhBTCBtb2R1bGUuDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEBhdHRlbnRpb24NCi0gKg0KLSAqIENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4NCi0gKg0KLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGVybXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZQ0KLSAqIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4NCi0gKiBJZiBubyBMSUNFTlNFIGZpbGUgY29tZXMgd2l0aCB0aGlzIHNvZnR3YXJlLCBpdCBpcyBwcm92aWRlZCBBUy1JUy4NCi0gKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKi8NCi0NCi0vKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpZm5kZWYgU1RNMzJHNHh4X0hBTF9HUElPX0gNCi0jZGVmaW5lIFNUTTMyRzR4eF9IQUxfR1BJT19IDQotDQotI2lmZGVmIF9fY3BsdXNwbHVzDQotZXh0ZXJuICJDIiB7DQotI2VuZGlmDQotDQotLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaW5jbHVkZSAic3RtMzJnNHh4X2hhbF9kZWYuaCINCi0NCi0vKiogQGFkZHRvZ3JvdXAgU1RNMzJHNHh4X0hBTF9Ecml2ZXINCi0gKiBAew0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgR1BJTyBHUElPDQotICogQGJyaWVmIEdQSU8gSEFMIG1vZHVsZSBkcml2ZXINCi0gKiBAew0KLSAqLw0KLQ0KLS8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotDQotLyoqIEBkZWZncm91cCBHUElPX0V4cG9ydGVkX1R5cGVzIEdQSU8gRXhwb3J0ZWQgVHlwZXMNCi0gKiBAew0KLSAqLw0KLS8qKg0KLSAqIEBicmllZiAgIEdQSU8gSW5pdCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbg0KLSAqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gIHVpbnQzMl90IFBpbjsgLyohPCBTcGVjaWZpZXMgdGhlIEdQSU8gcGlucyB0byBiZSBjb25maWd1cmVkLg0KLSAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSB2YWx1ZSBvZiBAcmVmIEdQSU9fcGlucyAqLw0KLQ0KLSAgdWludDMyX3QgTW9kZTsgLyohPCBTcGVjaWZpZXMgdGhlIG9wZXJhdGluZyBtb2RlIGZvciB0aGUgc2VsZWN0ZWQgcGlucy4NCi0gICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEdQSU9fbW9kZSAqLw0KLQ0KLSAgdWludDMyX3QNCi0gICAgICBQdWxsOyAvKiE8IFNwZWNpZmllcyB0aGUgUHVsbC11cCBvciBQdWxsLURvd24gYWN0aXZhdGlvbiBmb3IgdGhlIHNlbGVjdGVkDQotICAgICAgICAgICAgICAgcGlucy4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBHUElPX3B1bGwgKi8NCi0NCi0gIHVpbnQzMl90IFNwZWVkOyAvKiE8IFNwZWNpZmllcyB0aGUgc3BlZWQgZm9yIHRoZSBzZWxlY3RlZCBwaW5zLg0KLSAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEdQSU9fc3BlZWQgKi8NCi0NCi0gIHVpbnQzMl90IEFsdGVybmF0ZTsgLyohPCBQZXJpcGhlcmFsIHRvIGJlIGNvbm5lY3RlZCB0byB0aGUgc2VsZWN0ZWQgcGlucw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgR1BJT0V4X0FsdGVybmF0ZV9mdW5jdGlvbl9zZWxlY3Rpb24gKi8NCi19IEdQSU9fSW5pdFR5cGVEZWY7DQotDQotLyoqDQotICogQGJyaWVmICBHUElPIEJpdCBTRVQgYW5kIEJpdCBSRVNFVCBlbnVtZXJhdGlvbg0KLSAqLw0KLXR5cGVkZWYgZW51bSB7IEdQSU9fUElOX1JFU0VUID0gMFUsIEdQSU9fUElOX1NFVCB9IEdQSU9fUGluU3RhdGU7DQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgR1BJT19FeHBvcnRlZF9Db25zdGFudHMgR1BJTyBFeHBvcnRlZCBDb25zdGFudHMNCi0gKiBAew0KLSAqLw0KLS8qKiBAZGVmZ3JvdXAgR1BJT19waW5zIEdQSU8gcGlucw0KLSAqIEB7DQotICovDQotI2RlZmluZSBHUElPX1BJTl8wICgodWludDE2X3QpMHgwMDAxKSAgIC8qIFBpbiAwIHNlbGVjdGVkICAgICovDQotI2RlZmluZSBHUElPX1BJTl8xICgodWludDE2X3QpMHgwMDAyKSAgIC8qIFBpbiAxIHNlbGVjdGVkICAgICovDQotI2RlZmluZSBHUElPX1BJTl8yICgodWludDE2X3QpMHgwMDA0KSAgIC8qIFBpbiAyIHNlbGVjdGVkICAgICovDQotI2RlZmluZSBHUElPX1BJTl8zICgodWludDE2X3QpMHgwMDA4KSAgIC8qIFBpbiAzIHNlbGVjdGVkICAgICovDQotI2RlZmluZSBHUElPX1BJTl80ICgodWludDE2X3QpMHgwMDEwKSAgIC8qIFBpbiA0IHNlbGVjdGVkICAgICovDQotI2RlZmluZSBHUElPX1BJTl81ICgodWludDE2X3QpMHgwMDIwKSAgIC8qIFBpbiA1IHNlbGVjdGVkICAgICovDQotI2RlZmluZSBHUElPX1BJTl82ICgodWludDE2X3QpMHgwMDQwKSAgIC8qIFBpbiA2IHNlbGVjdGVkICAgICovDQotI2RlZmluZSBHUElPX1BJTl83ICgodWludDE2X3QpMHgwMDgwKSAgIC8qIFBpbiA3IHNlbGVjdGVkICAgICovDQotI2RlZmluZSBHUElPX1BJTl84ICgodWludDE2X3QpMHgwMTAwKSAgIC8qIFBpbiA4IHNlbGVjdGVkICAgICovDQotI2RlZmluZSBHUElPX1BJTl85ICgodWludDE2X3QpMHgwMjAwKSAgIC8qIFBpbiA5IHNlbGVjdGVkICAgICovDQotI2RlZmluZSBHUElPX1BJTl8xMCAoKHVpbnQxNl90KTB4MDQwMCkgIC8qIFBpbiAxMCBzZWxlY3RlZCAgICovDQotI2RlZmluZSBHUElPX1BJTl8xMSAoKHVpbnQxNl90KTB4MDgwMCkgIC8qIFBpbiAxMSBzZWxlY3RlZCAgICovDQotI2RlZmluZSBHUElPX1BJTl8xMiAoKHVpbnQxNl90KTB4MTAwMCkgIC8qIFBpbiAxMiBzZWxlY3RlZCAgICovDQotI2RlZmluZSBHUElPX1BJTl8xMyAoKHVpbnQxNl90KTB4MjAwMCkgIC8qIFBpbiAxMyBzZWxlY3RlZCAgICovDQotI2RlZmluZSBHUElPX1BJTl8xNCAoKHVpbnQxNl90KTB4NDAwMCkgIC8qIFBpbiAxNCBzZWxlY3RlZCAgICovDQotI2RlZmluZSBHUElPX1BJTl8xNSAoKHVpbnQxNl90KTB4ODAwMCkgIC8qIFBpbiAxNSBzZWxlY3RlZCAgICovDQotI2RlZmluZSBHUElPX1BJTl9BbGwgKCh1aW50MTZfdCkweEZGRkYpIC8qIEFsbCBwaW5zIHNlbGVjdGVkICovDQotDQotI2RlZmluZSBHUElPX1BJTl9NQVNLICgweDAwMDBGRkZGVSkgLyogUElOIG1hc2sgZm9yIGFzc2VydCB0ZXN0ICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEdQSU9fbW9kZSBHUElPIG1vZGUNCi0gKiBAYnJpZWYgR1BJTyBDb25maWd1cmF0aW9uIE1vZGUNCi0gKiAgICAgICAgRWxlbWVudHMgdmFsdWVzIGNvbnZlbnRpb246IDB4MDBXWDAwWVoNCi0gKiAgICAgICAgICAgLSBXICA6IEVYVEkgdHJpZ2dlciBkZXRlY3Rpb24gb24gMyBiaXRzDQotICogICAgICAgICAgIC0gWCAgOiBFWFRJIG1vZGUgKElUIG9yIEV2ZW50KSBvbiAyIGJpdHMNCi0gKiAgICAgICAgICAgLSBZICA6IE91dHB1dCB0eXBlIChQdXNoIFB1bGwgb3IgT3BlbiBEcmFpbikgb24gMSBiaXQNCi0gKiAgICAgICAgICAgLSBaICA6IEdQSU8gbW9kZSAoSW5wdXQsIE91dHB1dCwgQWx0ZXJuYXRlIG9yIEFuYWxvZykgb24gMiBiaXRzDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIEdQSU9fTU9ERV9JTlBVVCBNT0RFX0lOUFVUIC8qITwgSW5wdXQgRmxvYXRpbmcgTW9kZSAqLw0KLSNkZWZpbmUgR1BJT19NT0RFX09VVFBVVF9QUCBcDQotICAoTU9ERV9PVVRQVVQgfCBPVVRQVVRfUFApIC8qITwgT3V0cHV0IFB1c2ggUHVsbCBNb2RlICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgR1BJT19NT0RFX09VVFBVVF9PRCBcDQotICAoTU9ERV9PVVRQVVQgfCBPVVRQVVRfT0QpIC8qITwgT3V0cHV0IE9wZW4gRHJhaW4gTW9kZSAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgR1BJT19NT0RFX0FGX1BQIFwNCi0gIChNT0RFX0FGIHwgT1VUUFVUX1BQKSAvKiE8IEFsdGVybmF0ZSBGdW5jdGlvbiBQdXNoIFB1bGwgTW9kZSAgICAgKi8NCi0jZGVmaW5lIEdQSU9fTU9ERV9BRl9PRCBcDQotICAoTU9ERV9BRiB8IE9VVFBVVF9PRCkgLyohPCBBbHRlcm5hdGUgRnVuY3Rpb24gT3BlbiBEcmFpbiBNb2RlICAgICovDQotDQotI2RlZmluZSBHUElPX01PREVfQU5BTE9HIE1PREVfQU5BTE9HIC8qITwgQW5hbG9nIE1vZGUgICovDQotDQotI2RlZmluZSBHUElPX01PREVfSVRfUklTSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChNT0RFX0lOUFVUIHwgRVhUSV9JVCB8IFRSSUdHRVJfUklTSU5HKSAvKiE8IEV4dGVybmFsIEludGVycnVwdCBNb2RlIHdpdGggXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJpc2luZyBlZGdlIHRyaWdnZXIgZGV0ZWN0aW9uICovDQotI2RlZmluZSBHUElPX01PREVfSVRfRkFMTElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKE1PREVfSU5QVVQgfCBFWFRJX0lUIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBUUklHR0VSX0ZBTExJTkcpIC8qITwgRXh0ZXJuYWwgSW50ZXJydXB0IE1vZGUgd2l0aCBGYWxsaW5nIGVkZ2UgdHJpZ2dlciBcDQotICAgICAgICAgICAgICAgICAgICAgICBkZXRlY3Rpb24gICAgICAgICAqLw0KLSNkZWZpbmUgR1BJT19NT0RFX0lUX1JJU0lOR19GQUxMSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKE1PREVfSU5QVVQgfCBFWFRJX0lUIHwgVFJJR0dFUl9SSVNJTkcgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIFRSSUdHRVJfRkFMTElORykgLyohPCBFeHRlcm5hbCBJbnRlcnJ1cHQgTW9kZSB3aXRoIFJpc2luZy9GYWxsaW5nIGVkZ2UgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlciBkZXRlY3Rpb24gICovDQotDQotI2RlZmluZSBHUElPX01PREVfRVZUX1JJU0lORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChNT0RFX0lOUFVUIHwgRVhUSV9FVlQgfCBUUklHR0VSX1JJU0lORykgLyohPCBFeHRlcm5hbCBFdmVudCBNb2RlIHdpdGggXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSaXNpbmcgZWRnZSB0cmlnZ2VyIGRldGVjdGlvbiAqLw0KLSNkZWZpbmUgR1BJT19NT0RFX0VWVF9GQUxMSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKE1PREVfSU5QVVQgfCBFWFRJX0VWVCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIFRSSUdHRVJfRkFMTElORykgLyohPCBFeHRlcm5hbCBFdmVudCBNb2RlIHdpdGggRmFsbGluZyBlZGdlIHRyaWdnZXIgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgZGV0ZWN0aW9uICAgICAgICAgICAgKi8NCi0jZGVmaW5lIEdQSU9fTU9ERV9FVlRfUklTSU5HX0ZBTExJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTU9ERV9JTlBVVCB8IEVYVElfRVZUIHwgVFJJR0dFUl9SSVNJTkcgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIFRSSUdHRVJfRkFMTElORykgLyohPCBFeHRlcm5hbCBFdmVudCBNb2RlIHdpdGggUmlzaW5nL0ZhbGxpbmcgZWRnZSB0cmlnZ2VyIFwNCi0gICAgICAgICAgICAgICAgICAgICAgIGRldGVjdGlvbiAgICAgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgR1BJT19zcGVlZCBHUElPIHNwZWVkDQotICogQGJyaWVmIEdQSU8gT3V0cHV0IE1heGltdW0gZnJlcXVlbmN5DQotICogQHsNCi0gKi8NCi0jZGVmaW5lIEdQSU9fU1BFRURfRlJFUV9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoMHgwMDAwMDAwMFUpIC8qITwgcmFuZ2UgdXAgdG8gNSBNSHosIHBsZWFzZSByZWZlciB0byB0aGUgcHJvZHVjdCBkYXRhc2hlZXQgXA0KLSAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIEdQSU9fU1BFRURfRlJFUV9NRURJVU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKDB4MDAwMDAwMDFVKSAvKiE8IHJhbmdlICA1IE1IeiB0byAyNSBNSHosIHBsZWFzZSByZWZlciB0byB0aGUgcHJvZHVjdCBcDQotICAgICAgICAgICAgICAgICAgIGRhdGFzaGVldCAqLw0KLSNkZWZpbmUgR1BJT19TUEVFRF9GUkVRX0hJR0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoMHgwMDAwMDAwMlUpIC8qITwgcmFuZ2UgMjUgTUh6IHRvIDUwIE1IeiwgcGxlYXNlIHJlZmVyIHRvIHRoZSBwcm9kdWN0IFwNCi0gICAgICAgICAgICAgICAgICAgZGF0YXNoZWV0ICovDQotI2RlZmluZSBHUElPX1NQRUVEX0ZSRVFfVkVSWV9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoMHgwMDAwMDAwM1UpIC8qITwgcmFuZ2UgNTAgTUh6IHRvIDEyMCBNSHosIHBsZWFzZSByZWZlciB0byB0aGUgcHJvZHVjdCBcDQotICAgICAgICAgICAgICAgICAgIGRhdGFzaGVldCAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBHUElPX3B1bGwgR1BJTyBwdWxsDQotICogQGJyaWVmIEdQSU8gUHVsbC1VcCBvciBQdWxsLURvd24gQWN0aXZhdGlvbg0KLSAqIEB7DQotICovDQotI2RlZmluZSBHUElPX05PUFVMTCAoMHgwMDAwMDAwMFUpICAgLyohPCBObyBQdWxsLXVwIG9yIFB1bGwtZG93biBhY3RpdmF0aW9uICAqLw0KLSNkZWZpbmUgR1BJT19QVUxMVVAgKDB4MDAwMDAwMDFVKSAgIC8qITwgUHVsbC11cCBhY3RpdmF0aW9uICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIEdQSU9fUFVMTERPV04gKDB4MDAwMDAwMDJVKSAvKiE8IFB1bGwtZG93biBhY3RpdmF0aW9uICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBkZWZncm91cCBHUElPX0V4cG9ydGVkX01hY3JvcyBHUElPIEV4cG9ydGVkIE1hY3Jvcw0KLSAqIEB7DQotICovDQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgRVhUSSBsaW5lIGZsYWcgaXMgc2V0IG9yIG5vdC4NCi0gKiBAcGFyYW0gIF9fRVhUSV9MSU5FX18gc3BlY2lmaWVzIHRoZSBFWFRJIGxpbmUgZmxhZyB0byBjaGVjay4NCi0gKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBHUElPX1BJTl94IHdoZXJlIHggY2FuIGJlKDAuLjE1KQ0KLSAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0VYVElfTElORV9fIChTRVQgb3IgUkVTRVQpLg0KLSAqLw0KLSNkZWZpbmUgX19IQUxfR1BJT19FWFRJX0dFVF9GTEFHKF9fRVhUSV9MSU5FX18pIChFWFRJLT5QUjEgJiAoX19FWFRJX0xJTkVfXykpDQotDQotLyoqDQotICogQGJyaWVmICBDbGVhciB0aGUgRVhUSSdzIGxpbmUgcGVuZGluZyBmbGFncy4NCi0gKiBAcGFyYW0gIF9fRVhUSV9MSU5FX18gc3BlY2lmaWVzIHRoZSBFWFRJIGxpbmVzIGZsYWdzIHRvIGNsZWFyLg0KLSAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiBHUElPX1BJTl94IHdoZXJlIHggY2FuIGJlDQotICogKDAuLjE1KQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfR1BJT19FWFRJX0NMRUFSX0ZMQUcoX19FWFRJX0xJTkVfXykgKEVYVEktPlBSMSA9IChfX0VYVElfTElORV9fKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBFWFRJIGxpbmUgaXMgYXNzZXJ0ZWQgb3Igbm90Lg0KLSAqIEBwYXJhbSAgX19FWFRJX0xJTkVfXyBzcGVjaWZpZXMgdGhlIEVYVEkgbGluZSB0byBjaGVjay4NCi0gKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgR1BJT19QSU5feCB3aGVyZSB4IGNhbiBiZSgwLi4xNSkNCi0gKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgX19FWFRJX0xJTkVfXyAoU0VUIG9yIFJFU0VUKS4NCi0gKi8NCi0jZGVmaW5lIF9fSEFMX0dQSU9fRVhUSV9HRVRfSVQoX19FWFRJX0xJTkVfXykgKEVYVEktPlBSMSAmIChfX0VYVElfTElORV9fKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgIENsZWFyIHRoZSBFWFRJJ3MgbGluZSBwZW5kaW5nIGJpdHMuDQotICogQHBhcmFtICBfX0VYVElfTElORV9fIHNwZWNpZmllcyB0aGUgRVhUSSBsaW5lcyB0byBjbGVhci4NCi0gKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIEdQSU9fUElOX3ggd2hlcmUgeCBjYW4gYmUNCi0gKiAoMC4uMTUpDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9HUElPX0VYVElfQ0xFQVJfSVQoX19FWFRJX0xJTkVfXykgKEVYVEktPlBSMSA9IChfX0VYVElfTElORV9fKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdlbmVyYXRlIGEgU29mdHdhcmUgaW50ZXJydXB0IG9uIHNlbGVjdGVkIEVYVEkgbGluZS4NCi0gKiBAcGFyYW0gIF9fRVhUSV9MSU5FX18gc3BlY2lmaWVzIHRoZSBFWFRJIGxpbmUgdG8gY2hlY2suDQotICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIEdQSU9fUElOX3ggd2hlcmUgeCBjYW4gYmUoMC4uMTUpDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9HUElPX0VYVElfR0VORVJBVEVfU1dJVChfX0VYVElfTElORV9fKSBcDQotICAoRVhUSS0+U1dJRVIxIHw9IChfX0VYVElfTElORV9fKSkNCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBkZWZncm91cCBHUElPX1ByaXZhdGVfQ29uc3RhbnRzIEdQSU8gUHJpdmF0ZSBDb25zdGFudHMNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgR1BJT19NT0RFX1BvcyAwVQ0KLSNkZWZpbmUgR1BJT19NT0RFICgweDNVTCA8PCBHUElPX01PREVfUG9zKQ0KLSNkZWZpbmUgTU9ERV9JTlBVVCAoMHgwVUwgPDwgR1BJT19NT0RFX1BvcykNCi0jZGVmaW5lIE1PREVfT1VUUFVUICgweDFVTCA8PCBHUElPX01PREVfUG9zKQ0KLSNkZWZpbmUgTU9ERV9BRiAoMHgyVUwgPDwgR1BJT19NT0RFX1BvcykNCi0jZGVmaW5lIE1PREVfQU5BTE9HICgweDNVTCA8PCBHUElPX01PREVfUG9zKQ0KLSNkZWZpbmUgT1VUUFVUX1RZUEVfUG9zIDRVDQotI2RlZmluZSBPVVRQVVRfVFlQRSAoMHgxVUwgPDwgT1VUUFVUX1RZUEVfUG9zKQ0KLSNkZWZpbmUgT1VUUFVUX1BQICgweDBVTCA8PCBPVVRQVVRfVFlQRV9Qb3MpDQotI2RlZmluZSBPVVRQVVRfT0QgKDB4MVVMIDw8IE9VVFBVVF9UWVBFX1BvcykNCi0jZGVmaW5lIEVYVElfTU9ERV9Qb3MgMTZVDQotI2RlZmluZSBFWFRJX01PREUgKDB4M1VMIDw8IEVYVElfTU9ERV9Qb3MpDQotI2RlZmluZSBFWFRJX0lUICgweDFVTCA8PCBFWFRJX01PREVfUG9zKQ0KLSNkZWZpbmUgRVhUSV9FVlQgKDB4MlVMIDw8IEVYVElfTU9ERV9Qb3MpDQotI2RlZmluZSBUUklHR0VSX01PREVfUG9zIDIwVQ0KLSNkZWZpbmUgVFJJR0dFUl9NT0RFICgweDdVTCA8PCBUUklHR0VSX01PREVfUG9zKQ0KLSNkZWZpbmUgVFJJR0dFUl9SSVNJTkcgKDB4MVVMIDw8IFRSSUdHRVJfTU9ERV9Qb3MpDQotI2RlZmluZSBUUklHR0VSX0ZBTExJTkcgKDB4MlVMIDw8IFRSSUdHRVJfTU9ERV9Qb3MpDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEdQSU9fUHJpdmF0ZV9NYWNyb3MgR1BJTyBQcml2YXRlIE1hY3Jvcw0KLSAqIEB7DQotICovDQotI2RlZmluZSBJU19HUElPX1BJTl9BQ1RJT04oQUNUSU9OKSBcDQotICAoKChBQ1RJT04pID09IEdQSU9fUElOX1JFU0VUKSB8fCAoKEFDVElPTikgPT0gR1BJT19QSU5fU0VUKSkNCi0NCi0jZGVmaW5lIElTX0dQSU9fUElOKF9fUElOX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKCgoKHVpbnQzMl90KShfX1BJTl9fKSAmIEdQSU9fUElOX01BU0spICE9IDB4MDBVKSAmJiBcDQotICAgKCgodWludDMyX3QpKF9fUElOX18pICYgfkdQSU9fUElOX01BU0spID09IDB4MDBVKSkNCi0NCi0jZGVmaW5lIElTX0dQSU9fTU9ERShfX01PREVfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoKF9fTU9ERV9fKSA9PSBHUElPX01PREVfSU5QVVQpIHx8ICgoX19NT0RFX18pID09IEdQSU9fTU9ERV9PVVRQVVRfUFApIHx8IFwNCi0gICAoKF9fTU9ERV9fKSA9PSBHUElPX01PREVfT1VUUFVUX09EKSB8fCAoKF9fTU9ERV9fKSA9PSBHUElPX01PREVfQUZfUFApIHx8IFwNCi0gICAoKF9fTU9ERV9fKSA9PSBHUElPX01PREVfQUZfT0QpIHx8ICgoX19NT0RFX18pID09IEdQSU9fTU9ERV9JVF9SSVNJTkcpIHx8IFwNCi0gICAoKF9fTU9ERV9fKSA9PSBHUElPX01PREVfSVRfRkFMTElORykgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fTU9ERV9fKSA9PSBHUElPX01PREVfSVRfUklTSU5HX0ZBTExJTkcpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fTU9ERV9fKSA9PSBHUElPX01PREVfRVZUX1JJU0lORykgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fTU9ERV9fKSA9PSBHUElPX01PREVfRVZUX0ZBTExJTkcpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fTU9ERV9fKSA9PSBHUElPX01PREVfRVZUX1JJU0lOR19GQUxMSU5HKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fTU9ERV9fKSA9PSBHUElPX01PREVfQU5BTE9HKSkNCi0NCi0jZGVmaW5lIElTX0dQSU9fU1BFRUQoX19TUEVFRF9fKSAgICAgICAgICAgICAgXA0KLSAgKCgoX19TUEVFRF9fKSA9PSBHUElPX1NQRUVEX0ZSRVFfTE9XKSB8fCAgICBcDQotICAgKChfX1NQRUVEX18pID09IEdQSU9fU1BFRURfRlJFUV9NRURJVU0pIHx8IFwNCi0gICAoKF9fU1BFRURfXykgPT0gR1BJT19TUEVFRF9GUkVRX0hJR0gpIHx8ICAgXA0KLSAgICgoX19TUEVFRF9fKSA9PSBHUElPX1NQRUVEX0ZSRVFfVkVSWV9ISUdIKSkNCi0NCi0jZGVmaW5lIElTX0dQSU9fUFVMTChfX1BVTExfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoKF9fUFVMTF9fKSA9PSBHUElPX05PUFVMTCkgfHwgKChfX1BVTExfXykgPT0gR1BJT19QVUxMVVApIHx8IFwNCi0gICAoKF9fUFVMTF9fKSA9PSBHUElPX1BVTExET1dOKSkNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIEluY2x1ZGUgR1BJTyBIQUwgRXh0ZW5kZWQgbW9kdWxlICovDQotI2luY2x1ZGUgInN0bTMyZzR4eF9oYWxfZ3Bpb19leC5oIg0KLQ0KLS8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBkZWZncm91cCBHUElPX0V4cG9ydGVkX0Z1bmN0aW9ucyBHUElPIEV4cG9ydGVkIEZ1bmN0aW9ucw0KLSAqICBAYnJpZWYgICAgR1BJTyBFeHBvcnRlZCBGdW5jdGlvbnMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgR1BJT19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uL2RlLWluaXRpYWxpemF0aW9uDQotICogZnVuY3Rpb25zDQotICogIEBicmllZiAgICBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotdm9pZCBIQUxfR1BJT19Jbml0KEdQSU9fVHlwZURlZiAqR1BJT3gsIEdQSU9fSW5pdFR5cGVEZWYgKkdQSU9fSW5pdCk7DQotdm9pZCBIQUxfR1BJT19EZUluaXQoR1BJT19UeXBlRGVmICpHUElPeCwgdWludDMyX3QgR1BJT19QaW4pOw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBHUElPX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucw0KLSAqICBAYnJpZWYgICAgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucw0KLSAqIEB7DQotICovDQotDQotLyogSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1HUElPX1BpblN0YXRlIEhBTF9HUElPX1JlYWRQaW4oR1BJT19UeXBlRGVmICpHUElPeCwgdWludDE2X3QgR1BJT19QaW4pOw0KLXZvaWQgSEFMX0dQSU9fV3JpdGVQaW4oR1BJT19UeXBlRGVmICpHUElPeCwgdWludDE2X3QgR1BJT19QaW4sDQotICAgICAgICAgICAgICAgICAgICAgICBHUElPX1BpblN0YXRlIFBpblN0YXRlKTsNCi12b2lkIEhBTF9HUElPX1RvZ2dsZVBpbihHUElPX1R5cGVEZWYgKkdQSU94LCB1aW50MTZfdCBHUElPX1Bpbik7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0dQSU9fTG9ja1BpbihHUElPX1R5cGVEZWYgKkdQSU94LCB1aW50MTZfdCBHUElPX1Bpbik7DQotdm9pZCBIQUxfR1BJT19FWFRJX0lSUUhhbmRsZXIodWludDE2X3QgR1BJT19QaW4pOw0KLXZvaWQgSEFMX0dQSU9fRVhUSV9DYWxsYmFjayh1aW50MTZfdCBHUElPX1Bpbik7DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0jaWZkZWYgX19jcGx1c3BsdXMNCi19DQotI2VuZGlmDQotDQotI2VuZGlmIC8qIFNUTTMyRzR4eF9IQUxfR1BJT19IICovDQorLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAZmlsZSAgICBzdG0zMmc0eHhfaGFsX2dwaW8uaAorICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIEdQSU8gSEFMIG1vZHVsZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBhdHRlbnRpb24KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRlcm1zIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUKKyAqIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4KKyAqIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcyB3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMkc0eHhfSEFMX0dQSU9fSAorI2RlZmluZSBTVE0zMkc0eHhfSEFMX0dQSU9fSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnNHh4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzR4eF9IQUxfRHJpdmVyCisgKiBAeworICovCisKKy8qKiBAZGVmZ3JvdXAgR1BJTyBHUElPCisgKiBAYnJpZWYgR1BJTyBIQUwgbW9kdWxlIGRyaXZlcgorICogQHsKKyAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIEdQSU9fRXhwb3J0ZWRfVHlwZXMgR1BJTyBFeHBvcnRlZCBUeXBlcworICogQHsKKyAqLworLyoqCisgKiBAYnJpZWYgICBHUElPIEluaXQgc3RydWN0dXJlIGRlZmluaXRpb24KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50MzJfdCBQaW47IC8qITwgU3BlY2lmaWVzIHRoZSBHUElPIHBpbnMgdG8gYmUgY29uZmlndXJlZC4KKyAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSB2YWx1ZSBvZiBAcmVmIEdQSU9fcGlucyAqLworCisgIHVpbnQzMl90IE1vZGU7IC8qITwgU3BlY2lmaWVzIHRoZSBvcGVyYXRpbmcgbW9kZSBmb3IgdGhlIHNlbGVjdGVkIHBpbnMuCisgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEdQSU9fbW9kZSAqLworCisgIHVpbnQzMl90CisgICAgICBQdWxsOyAvKiE8IFNwZWNpZmllcyB0aGUgUHVsbC11cCBvciBQdWxsLURvd24gYWN0aXZhdGlvbiBmb3IgdGhlIHNlbGVjdGVkCisgICAgICAgICAgICAgICBwaW5zLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEdQSU9fcHVsbCAqLworCisgIHVpbnQzMl90IFNwZWVkOyAvKiE8IFNwZWNpZmllcyB0aGUgc3BlZWQgZm9yIHRoZSBzZWxlY3RlZCBwaW5zLgorICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgR1BJT19zcGVlZCAqLworCisgIHVpbnQzMl90IEFsdGVybmF0ZTsgLyohPCBQZXJpcGhlcmFsIHRvIGJlIGNvbm5lY3RlZCB0byB0aGUgc2VsZWN0ZWQgcGlucworICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU9FeF9BbHRlcm5hdGVfZnVuY3Rpb25fc2VsZWN0aW9uICovCit9IEdQSU9fSW5pdFR5cGVEZWY7CisKKy8qKgorICogQGJyaWVmICBHUElPIEJpdCBTRVQgYW5kIEJpdCBSRVNFVCBlbnVtZXJhdGlvbgorICovCit0eXBlZGVmIGVudW0geyBHUElPX1BJTl9SRVNFVCA9IDBVLCBHUElPX1BJTl9TRVQgfSBHUElPX1BpblN0YXRlOworLyoqCisgKiBAfQorICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEdQSU9fRXhwb3J0ZWRfQ29uc3RhbnRzIEdQSU8gRXhwb3J0ZWQgQ29uc3RhbnRzCisgKiBAeworICovCisvKiogQGRlZmdyb3VwIEdQSU9fcGlucyBHUElPIHBpbnMKKyAqIEB7CisgKi8KKyNkZWZpbmUgR1BJT19QSU5fMCAoKHVpbnQxNl90KTB4MDAwMSkgICAvKiBQaW4gMCBzZWxlY3RlZCAgICAqLworI2RlZmluZSBHUElPX1BJTl8xICgodWludDE2X3QpMHgwMDAyKSAgIC8qIFBpbiAxIHNlbGVjdGVkICAgICovCisjZGVmaW5lIEdQSU9fUElOXzIgKCh1aW50MTZfdCkweDAwMDQpICAgLyogUGluIDIgc2VsZWN0ZWQgICAgKi8KKyNkZWZpbmUgR1BJT19QSU5fMyAoKHVpbnQxNl90KTB4MDAwOCkgICAvKiBQaW4gMyBzZWxlY3RlZCAgICAqLworI2RlZmluZSBHUElPX1BJTl80ICgodWludDE2X3QpMHgwMDEwKSAgIC8qIFBpbiA0IHNlbGVjdGVkICAgICovCisjZGVmaW5lIEdQSU9fUElOXzUgKCh1aW50MTZfdCkweDAwMjApICAgLyogUGluIDUgc2VsZWN0ZWQgICAgKi8KKyNkZWZpbmUgR1BJT19QSU5fNiAoKHVpbnQxNl90KTB4MDA0MCkgICAvKiBQaW4gNiBzZWxlY3RlZCAgICAqLworI2RlZmluZSBHUElPX1BJTl83ICgodWludDE2X3QpMHgwMDgwKSAgIC8qIFBpbiA3IHNlbGVjdGVkICAgICovCisjZGVmaW5lIEdQSU9fUElOXzggKCh1aW50MTZfdCkweDAxMDApICAgLyogUGluIDggc2VsZWN0ZWQgICAgKi8KKyNkZWZpbmUgR1BJT19QSU5fOSAoKHVpbnQxNl90KTB4MDIwMCkgICAvKiBQaW4gOSBzZWxlY3RlZCAgICAqLworI2RlZmluZSBHUElPX1BJTl8xMCAoKHVpbnQxNl90KTB4MDQwMCkgIC8qIFBpbiAxMCBzZWxlY3RlZCAgICovCisjZGVmaW5lIEdQSU9fUElOXzExICgodWludDE2X3QpMHgwODAwKSAgLyogUGluIDExIHNlbGVjdGVkICAgKi8KKyNkZWZpbmUgR1BJT19QSU5fMTIgKCh1aW50MTZfdCkweDEwMDApICAvKiBQaW4gMTIgc2VsZWN0ZWQgICAqLworI2RlZmluZSBHUElPX1BJTl8xMyAoKHVpbnQxNl90KTB4MjAwMCkgIC8qIFBpbiAxMyBzZWxlY3RlZCAgICovCisjZGVmaW5lIEdQSU9fUElOXzE0ICgodWludDE2X3QpMHg0MDAwKSAgLyogUGluIDE0IHNlbGVjdGVkICAgKi8KKyNkZWZpbmUgR1BJT19QSU5fMTUgKCh1aW50MTZfdCkweDgwMDApICAvKiBQaW4gMTUgc2VsZWN0ZWQgICAqLworI2RlZmluZSBHUElPX1BJTl9BbGwgKCh1aW50MTZfdCkweEZGRkYpIC8qIEFsbCBwaW5zIHNlbGVjdGVkICovCisKKyNkZWZpbmUgR1BJT19QSU5fTUFTSyAoMHgwMDAwRkZGRlUpIC8qIFBJTiBtYXNrIGZvciBhc3NlcnQgdGVzdCAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgR1BJT19tb2RlIEdQSU8gbW9kZQorICogQGJyaWVmIEdQSU8gQ29uZmlndXJhdGlvbiBNb2RlCisgKiAgICAgICAgRWxlbWVudHMgdmFsdWVzIGNvbnZlbnRpb246IDB4MDBXWDAwWVoKKyAqICAgICAgICAgICAtIFcgIDogRVhUSSB0cmlnZ2VyIGRldGVjdGlvbiBvbiAzIGJpdHMKKyAqICAgICAgICAgICAtIFggIDogRVhUSSBtb2RlIChJVCBvciBFdmVudCkgb24gMiBiaXRzCisgKiAgICAgICAgICAgLSBZICA6IE91dHB1dCB0eXBlIChQdXNoIFB1bGwgb3IgT3BlbiBEcmFpbikgb24gMSBiaXQKKyAqICAgICAgICAgICAtIFogIDogR1BJTyBtb2RlIChJbnB1dCwgT3V0cHV0LCBBbHRlcm5hdGUgb3IgQW5hbG9nKSBvbiAyIGJpdHMKKyAqIEB7CisgKi8KKyNkZWZpbmUgR1BJT19NT0RFX0lOUFVUIE1PREVfSU5QVVQgLyohPCBJbnB1dCBGbG9hdGluZyBNb2RlICovCisjZGVmaW5lIEdQSU9fTU9ERV9PVVRQVVRfUFAgXAorICAoTU9ERV9PVVRQVVQgfCBPVVRQVVRfUFApIC8qITwgT3V0cHV0IFB1c2ggUHVsbCBNb2RlICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBHUElPX01PREVfT1VUUFVUX09EIFwKKyAgKE1PREVfT1VUUFVUIHwgT1VUUFVUX09EKSAvKiE8IE91dHB1dCBPcGVuIERyYWluIE1vZGUgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgR1BJT19NT0RFX0FGX1BQIFwKKyAgKE1PREVfQUYgfCBPVVRQVVRfUFApIC8qITwgQWx0ZXJuYXRlIEZ1bmN0aW9uIFB1c2ggUHVsbCBNb2RlICAgICAqLworI2RlZmluZSBHUElPX01PREVfQUZfT0QgXAorICAoTU9ERV9BRiB8IE9VVFBVVF9PRCkgLyohPCBBbHRlcm5hdGUgRnVuY3Rpb24gT3BlbiBEcmFpbiBNb2RlICAgICovCisKKyNkZWZpbmUgR1BJT19NT0RFX0FOQUxPRyBNT0RFX0FOQUxPRyAvKiE8IEFuYWxvZyBNb2RlICAqLworCisjZGVmaW5lIEdQSU9fTU9ERV9JVF9SSVNJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTU9ERV9JTlBVVCB8IEVYVElfSVQgfCBUUklHR0VSX1JJU0lORykgLyohPCBFeHRlcm5hbCBJbnRlcnJ1cHQgTW9kZSB3aXRoIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJpc2luZyBlZGdlIHRyaWdnZXIgZGV0ZWN0aW9uICovCisjZGVmaW5lIEdQSU9fTU9ERV9JVF9GQUxMSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChNT0RFX0lOUFVUIHwgRVhUSV9JVCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBUUklHR0VSX0ZBTExJTkcpIC8qITwgRXh0ZXJuYWwgSW50ZXJydXB0IE1vZGUgd2l0aCBGYWxsaW5nIGVkZ2UgdHJpZ2dlciBcCisgICAgICAgICAgICAgICAgICAgICAgIGRldGVjdGlvbiAgICAgICAgICovCisjZGVmaW5lIEdQSU9fTU9ERV9JVF9SSVNJTkdfRkFMTElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKE1PREVfSU5QVVQgfCBFWFRJX0lUIHwgVFJJR0dFUl9SSVNJTkcgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgVFJJR0dFUl9GQUxMSU5HKSAvKiE8IEV4dGVybmFsIEludGVycnVwdCBNb2RlIHdpdGggUmlzaW5nL0ZhbGxpbmcgZWRnZSBcCisgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXIgZGV0ZWN0aW9uICAqLworCisjZGVmaW5lIEdQSU9fTU9ERV9FVlRfUklTSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTU9ERV9JTlBVVCB8IEVYVElfRVZUIHwgVFJJR0dFUl9SSVNJTkcpIC8qITwgRXh0ZXJuYWwgRXZlbnQgTW9kZSB3aXRoIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSaXNpbmcgZWRnZSB0cmlnZ2VyIGRldGVjdGlvbiAqLworI2RlZmluZSBHUElPX01PREVfRVZUX0ZBTExJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChNT0RFX0lOUFVUIHwgRVhUSV9FVlQgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIFRSSUdHRVJfRkFMTElORykgLyohPCBFeHRlcm5hbCBFdmVudCBNb2RlIHdpdGggRmFsbGluZyBlZGdlIHRyaWdnZXIgXAorICAgICAgICAgICAgICAgICAgICAgICBkZXRlY3Rpb24gICAgICAgICAgICAqLworI2RlZmluZSBHUElPX01PREVfRVZUX1JJU0lOR19GQUxMSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTU9ERV9JTlBVVCB8IEVYVElfRVZUIHwgVFJJR0dFUl9SSVNJTkcgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgVFJJR0dFUl9GQUxMSU5HKSAvKiE8IEV4dGVybmFsIEV2ZW50IE1vZGUgd2l0aCBSaXNpbmcvRmFsbGluZyBlZGdlIHRyaWdnZXIgXAorICAgICAgICAgICAgICAgICAgICAgICBkZXRlY3Rpb24gICAgICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBHUElPX3NwZWVkIEdQSU8gc3BlZWQKKyAqIEBicmllZiBHUElPIE91dHB1dCBNYXhpbXVtIGZyZXF1ZW5jeQorICogQHsKKyAqLworI2RlZmluZSBHUElPX1NQRUVEX0ZSRVFfTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoMHgwMDAwMDAwMFUpIC8qITwgcmFuZ2UgdXAgdG8gNSBNSHosIHBsZWFzZSByZWZlciB0byB0aGUgcHJvZHVjdCBkYXRhc2hlZXQgXAorICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBHUElPX1NQRUVEX0ZSRVFfTUVESVVNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKDB4MDAwMDAwMDFVKSAvKiE8IHJhbmdlICA1IE1IeiB0byAyNSBNSHosIHBsZWFzZSByZWZlciB0byB0aGUgcHJvZHVjdCBcCisgICAgICAgICAgICAgICAgICAgZGF0YXNoZWV0ICovCisjZGVmaW5lIEdQSU9fU1BFRURfRlJFUV9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoMHgwMDAwMDAwMlUpIC8qITwgcmFuZ2UgMjUgTUh6IHRvIDUwIE1IeiwgcGxlYXNlIHJlZmVyIHRvIHRoZSBwcm9kdWN0IFwKKyAgICAgICAgICAgICAgICAgICBkYXRhc2hlZXQgKi8KKyNkZWZpbmUgR1BJT19TUEVFRF9GUkVRX1ZFUllfSElHSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoMHgwMDAwMDAwM1UpIC8qITwgcmFuZ2UgNTAgTUh6IHRvIDEyMCBNSHosIHBsZWFzZSByZWZlciB0byB0aGUgcHJvZHVjdCBcCisgICAgICAgICAgICAgICAgICAgZGF0YXNoZWV0ICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBHUElPX3B1bGwgR1BJTyBwdWxsCisgKiBAYnJpZWYgR1BJTyBQdWxsLVVwIG9yIFB1bGwtRG93biBBY3RpdmF0aW9uCisgKiBAeworICovCisjZGVmaW5lIEdQSU9fTk9QVUxMICgweDAwMDAwMDAwVSkgICAvKiE8IE5vIFB1bGwtdXAgb3IgUHVsbC1kb3duIGFjdGl2YXRpb24gICovCisjZGVmaW5lIEdQSU9fUFVMTFVQICgweDAwMDAwMDAxVSkgICAvKiE8IFB1bGwtdXAgYWN0aXZhdGlvbiAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEdQSU9fUFVMTERPV04gKDB4MDAwMDAwMDJVKSAvKiE8IFB1bGwtZG93biBhY3RpdmF0aW9uICovCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEdQSU9fRXhwb3J0ZWRfTWFjcm9zIEdQSU8gRXhwb3J0ZWQgTWFjcm9zCisgKiBAeworICovCisKKy8qKgorICogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgRVhUSSBsaW5lIGZsYWcgaXMgc2V0IG9yIG5vdC4KKyAqIEBwYXJhbSAgX19FWFRJX0xJTkVfXyBzcGVjaWZpZXMgdGhlIEVYVEkgbGluZSBmbGFnIHRvIGNoZWNrLgorICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgR1BJT19QSU5feCB3aGVyZSB4IGNhbiBiZSgwLi4xNSkKKyAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0VYVElfTElORV9fIChTRVQgb3IgUkVTRVQpLgorICovCisjZGVmaW5lIF9fSEFMX0dQSU9fRVhUSV9HRVRfRkxBRyhfX0VYVElfTElORV9fKSAoRVhUSS0+UFIxICYgKF9fRVhUSV9MSU5FX18pKQorCisvKioKKyAqIEBicmllZiAgQ2xlYXIgdGhlIEVYVEkncyBsaW5lIHBlbmRpbmcgZmxhZ3MuCisgKiBAcGFyYW0gIF9fRVhUSV9MSU5FX18gc3BlY2lmaWVzIHRoZSBFWFRJIGxpbmVzIGZsYWdzIHRvIGNsZWFyLgorICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIEdQSU9fUElOX3ggd2hlcmUgeCBjYW4gYmUKKyAqICgwLi4xNSkKKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX0dQSU9fRVhUSV9DTEVBUl9GTEFHKF9fRVhUSV9MSU5FX18pIChFWFRJLT5QUjEgPSAoX19FWFRJX0xJTkVfXykpCisKKy8qKgorICogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgRVhUSSBsaW5lIGlzIGFzc2VydGVkIG9yIG5vdC4KKyAqIEBwYXJhbSAgX19FWFRJX0xJTkVfXyBzcGVjaWZpZXMgdGhlIEVYVEkgbGluZSB0byBjaGVjay4KKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBHUElPX1BJTl94IHdoZXJlIHggY2FuIGJlKDAuLjE1KQorICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fRVhUSV9MSU5FX18gKFNFVCBvciBSRVNFVCkuCisgKi8KKyNkZWZpbmUgX19IQUxfR1BJT19FWFRJX0dFVF9JVChfX0VYVElfTElORV9fKSAoRVhUSS0+UFIxICYgKF9fRVhUSV9MSU5FX18pKQorCisvKioKKyAqIEBicmllZiAgQ2xlYXIgdGhlIEVYVEkncyBsaW5lIHBlbmRpbmcgYml0cy4KKyAqIEBwYXJhbSAgX19FWFRJX0xJTkVfXyBzcGVjaWZpZXMgdGhlIEVYVEkgbGluZXMgdG8gY2xlYXIuCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIEdQSU9fUElOX3ggd2hlcmUgeCBjYW4gYmUKKyAqICgwLi4xNSkKKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX0dQSU9fRVhUSV9DTEVBUl9JVChfX0VYVElfTElORV9fKSAoRVhUSS0+UFIxID0gKF9fRVhUSV9MSU5FX18pKQorCisvKioKKyAqIEBicmllZiAgR2VuZXJhdGUgYSBTb2Z0d2FyZSBpbnRlcnJ1cHQgb24gc2VsZWN0ZWQgRVhUSSBsaW5lLgorICogQHBhcmFtICBfX0VYVElfTElORV9fIHNwZWNpZmllcyB0aGUgRVhUSSBsaW5lIHRvIGNoZWNrLgorICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIEdQSU9fUElOX3ggd2hlcmUgeCBjYW4gYmUoMC4uMTUpCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9HUElPX0VYVElfR0VORVJBVEVfU1dJVChfX0VYVElfTElORV9fKSBcCisgIChFWFRJLT5TV0lFUjEgfD0gKF9fRVhUSV9MSU5FX18pKQorCisvKioKKyAqIEB9CisgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgR1BJT19Qcml2YXRlX0NvbnN0YW50cyBHUElPIFByaXZhdGUgQ29uc3RhbnRzCisgKiBAeworICovCisjZGVmaW5lIEdQSU9fTU9ERV9Qb3MgMFUKKyNkZWZpbmUgR1BJT19NT0RFICgweDNVTCA8PCBHUElPX01PREVfUG9zKQorI2RlZmluZSBNT0RFX0lOUFVUICgweDBVTCA8PCBHUElPX01PREVfUG9zKQorI2RlZmluZSBNT0RFX09VVFBVVCAoMHgxVUwgPDwgR1BJT19NT0RFX1BvcykKKyNkZWZpbmUgTU9ERV9BRiAoMHgyVUwgPDwgR1BJT19NT0RFX1BvcykKKyNkZWZpbmUgTU9ERV9BTkFMT0cgKDB4M1VMIDw8IEdQSU9fTU9ERV9Qb3MpCisjZGVmaW5lIE9VVFBVVF9UWVBFX1BvcyA0VQorI2RlZmluZSBPVVRQVVRfVFlQRSAoMHgxVUwgPDwgT1VUUFVUX1RZUEVfUG9zKQorI2RlZmluZSBPVVRQVVRfUFAgKDB4MFVMIDw8IE9VVFBVVF9UWVBFX1BvcykKKyNkZWZpbmUgT1VUUFVUX09EICgweDFVTCA8PCBPVVRQVVRfVFlQRV9Qb3MpCisjZGVmaW5lIEVYVElfTU9ERV9Qb3MgMTZVCisjZGVmaW5lIEVYVElfTU9ERSAoMHgzVUwgPDwgRVhUSV9NT0RFX1BvcykKKyNkZWZpbmUgRVhUSV9JVCAoMHgxVUwgPDwgRVhUSV9NT0RFX1BvcykKKyNkZWZpbmUgRVhUSV9FVlQgKDB4MlVMIDw8IEVYVElfTU9ERV9Qb3MpCisjZGVmaW5lIFRSSUdHRVJfTU9ERV9Qb3MgMjBVCisjZGVmaW5lIFRSSUdHRVJfTU9ERSAoMHg3VUwgPDwgVFJJR0dFUl9NT0RFX1BvcykKKyNkZWZpbmUgVFJJR0dFUl9SSVNJTkcgKDB4MVVMIDw8IFRSSUdHRVJfTU9ERV9Qb3MpCisjZGVmaW5lIFRSSUdHRVJfRkFMTElORyAoMHgyVUwgPDwgVFJJR0dFUl9NT0RFX1BvcykKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEdQSU9fUHJpdmF0ZV9NYWNyb3MgR1BJTyBQcml2YXRlIE1hY3JvcworICogQHsKKyAqLworI2RlZmluZSBJU19HUElPX1BJTl9BQ1RJT04oQUNUSU9OKSBcCisgICgoKEFDVElPTikgPT0gR1BJT19QSU5fUkVTRVQpIHx8ICgoQUNUSU9OKSA9PSBHUElPX1BJTl9TRVQpKQorCisjZGVmaW5lIElTX0dQSU9fUElOKF9fUElOX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKCgodWludDMyX3QpKF9fUElOX18pICYgR1BJT19QSU5fTUFTSykgIT0gMHgwMFUpICYmIFwKKyAgICgoKHVpbnQzMl90KShfX1BJTl9fKSAmIH5HUElPX1BJTl9NQVNLKSA9PSAweDAwVSkpCisKKyNkZWZpbmUgSVNfR1BJT19NT0RFKF9fTU9ERV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKChfX01PREVfXykgPT0gR1BJT19NT0RFX0lOUFVUKSB8fCAoKF9fTU9ERV9fKSA9PSBHUElPX01PREVfT1VUUFVUX1BQKSB8fCBcCisgICAoKF9fTU9ERV9fKSA9PSBHUElPX01PREVfT1VUUFVUX09EKSB8fCAoKF9fTU9ERV9fKSA9PSBHUElPX01PREVfQUZfUFApIHx8IFwKKyAgICgoX19NT0RFX18pID09IEdQSU9fTU9ERV9BRl9PRCkgfHwgKChfX01PREVfXykgPT0gR1BJT19NT0RFX0lUX1JJU0lORykgfHwgXAorICAgKChfX01PREVfXykgPT0gR1BJT19NT0RFX0lUX0ZBTExJTkcpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fTU9ERV9fKSA9PSBHUElPX01PREVfSVRfUklTSU5HX0ZBTExJTkcpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoX19NT0RFX18pID09IEdQSU9fTU9ERV9FVlRfUklTSU5HKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKChfX01PREVfXykgPT0gR1BJT19NT0RFX0VWVF9GQUxMSU5HKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fTU9ERV9fKSA9PSBHUElPX01PREVfRVZUX1JJU0lOR19GQUxMSU5HKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoX19NT0RFX18pID09IEdQSU9fTU9ERV9BTkFMT0cpKQorCisjZGVmaW5lIElTX0dQSU9fU1BFRUQoX19TUEVFRF9fKSAgICAgICAgICAgICAgXAorICAoKChfX1NQRUVEX18pID09IEdQSU9fU1BFRURfRlJFUV9MT1cpIHx8ICAgIFwKKyAgICgoX19TUEVFRF9fKSA9PSBHUElPX1NQRUVEX0ZSRVFfTUVESVVNKSB8fCBcCisgICAoKF9fU1BFRURfXykgPT0gR1BJT19TUEVFRF9GUkVRX0hJR0gpIHx8ICAgXAorICAgKChfX1NQRUVEX18pID09IEdQSU9fU1BFRURfRlJFUV9WRVJZX0hJR0gpKQorCisjZGVmaW5lIElTX0dQSU9fUFVMTChfX1BVTExfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoX19QVUxMX18pID09IEdQSU9fTk9QVUxMKSB8fCAoKF9fUFVMTF9fKSA9PSBHUElPX1BVTExVUCkgfHwgXAorICAgKChfX1BVTExfXykgPT0gR1BJT19QVUxMRE9XTikpCisvKioKKyAqIEB9CisgKi8KKworLyogSW5jbHVkZSBHUElPIEhBTCBFeHRlbmRlZCBtb2R1bGUgKi8KKyNpbmNsdWRlICJzdG0zMmc0eHhfaGFsX2dwaW9fZXguaCIKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgR1BJT19FeHBvcnRlZF9GdW5jdGlvbnMgR1BJTyBFeHBvcnRlZCBGdW5jdGlvbnMKKyAqICBAYnJpZWYgICAgR1BJTyBFeHBvcnRlZCBGdW5jdGlvbnMKKyAqIEB7CisgKi8KKworLyoqIEBkZWZncm91cCBHUElPX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24vZGUtaW5pdGlhbGl6YXRpb24KKyAqIGZ1bmN0aW9ucworICogIEBicmllZiAgICBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMKKyAqIEB7CisgKi8KKworLyogSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgSEFMX0dQSU9fSW5pdChHUElPX1R5cGVEZWYgKkdQSU94LCBHUElPX0luaXRUeXBlRGVmICpHUElPX0luaXQpOwordm9pZCBIQUxfR1BJT19EZUluaXQoR1BJT19UeXBlRGVmICpHUElPeCwgdWludDMyX3QgR1BJT19QaW4pOworCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBHUElPX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICogIEBicmllZiAgICBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCisgKiBAeworICovCisKKy8qIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitHUElPX1BpblN0YXRlIEhBTF9HUElPX1JlYWRQaW4oR1BJT19UeXBlRGVmICpHUElPeCwgdWludDE2X3QgR1BJT19QaW4pOwordm9pZCBIQUxfR1BJT19Xcml0ZVBpbihHUElPX1R5cGVEZWYgKkdQSU94LCB1aW50MTZfdCBHUElPX1BpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgR1BJT19QaW5TdGF0ZSBQaW5TdGF0ZSk7Cit2b2lkIEhBTF9HUElPX1RvZ2dsZVBpbihHUElPX1R5cGVEZWYgKkdQSU94LCB1aW50MTZfdCBHUElPX1Bpbik7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfR1BJT19Mb2NrUGluKEdQSU9fVHlwZURlZiAqR1BJT3gsIHVpbnQxNl90IEdQSU9fUGluKTsKK3ZvaWQgSEFMX0dQSU9fRVhUSV9JUlFIYW5kbGVyKHVpbnQxNl90IEdQSU9fUGluKTsKK3ZvaWQgSEFMX0dQSU9fRVhUSV9DYWxsYmFjayh1aW50MTZfdCBHUElPX1Bpbik7CisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJHNHh4X0hBTF9HUElPX0ggKi8KZGlmZiAtLWdpdCBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9JbmMvc3RtMzJnNHh4X2hhbF9ncGlvX2V4LmggYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9oYWxfZ3Bpb19leC5oCmluZGV4IDZkZGJkZmEuLjA3NjQ2MzggMTAwNjQ0Ci0tLSBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9JbmMvc3RtMzJnNHh4X2hhbF9ncGlvX2V4LmgKKysrIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfaGFsX2dwaW9fZXguaApAQCAtMSw0MDMgKzEsNDAzIEBACi0vKioNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQGZpbGUgICAgc3RtMzJnNHh4X2hhbF9ncGlvX2V4LmgNCi0gKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQ0KLSAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIEdQSU8gSEFMIEV4dGVuZGVkIG1vZHVsZS4NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQGF0dGVudGlvbg0KLSAqDQotICogQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KLSAqDQotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0ZXJtcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlDQotICogaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc29mdHdhcmUgY29tcG9uZW50Lg0KLSAqIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcyB3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLg0KLSAqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqLw0KLQ0KLS8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotI2lmbmRlZiBTVE0zMkc0eHhfSEFMX0dQSU9fRVhfSA0KLSNkZWZpbmUgU1RNMzJHNHh4X0hBTF9HUElPX0VYX0gNCi0NCi0jaWZkZWYgX19jcGx1c3BsdXMNCi1leHRlcm4gIkMiIHsNCi0jZW5kaWYNCi0NCi0vKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpbmNsdWRlICJzdG0zMmc0eHhfaGFsX2RlZi5oIg0KLQ0KLS8qKiBAYWRkdG9ncm91cCBTVE0zMkc0eHhfSEFMX0RyaXZlcg0KLSAqIEB7DQotICovDQotDQotLyoqIEBkZWZncm91cCBHUElPRXggR1BJT0V4DQotICogQGJyaWVmIEdQSU8gRXh0ZW5kZWQgSEFMIG1vZHVsZSBkcml2ZXINCi0gKiBAew0KLSAqLw0KLQ0KLS8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGRlZmdyb3VwIEdQSU9FeF9FeHBvcnRlZF9Db25zdGFudHMgR1BJT0V4IEV4cG9ydGVkIENvbnN0YW50cw0KLSAqIEB7DQotICovDQotDQotLyoqIEBkZWZncm91cCBHUElPRXhfQWx0ZXJuYXRlX2Z1bmN0aW9uX3NlbGVjdGlvbiBHUElPRXggQWx0ZXJuYXRlIGZ1bmN0aW9uDQotICogc2VsZWN0aW9uDQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgICBBRiAwIHNlbGVjdGlvbg0KLSAqLw0KLSNkZWZpbmUgR1BJT19BRjBfUlRDXzUwSHogXA0KLSAgKCh1aW50OF90KTB4MDApIC8qIFJUQ181MEh6IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovDQotI2RlZmluZSBHUElPX0FGMF9NQ08gXA0KLSAgKCh1aW50OF90KTB4MDApIC8qIE1DTyAoTUNPMSBhbmQgTUNPMikgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8NCi0jZGVmaW5lIEdQSU9fQUYwX1NXSiBcDQotICAoKHVpbnQ4X3QpMHgwMCkgLyogU1dKIChTV0QgYW5kIEpUQUcpIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovDQotI2RlZmluZSBHUElPX0FGMF9UUkFDRSAoKHVpbnQ4X3QpMHgwMCkgLyogVFJBQ0UgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgICBBRiAxIHNlbGVjdGlvbg0KLSAqLw0KLSNkZWZpbmUgR1BJT19BRjFfVElNMiAoKHVpbnQ4X3QpMHgwMSkgLyogVElNMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICovDQotI2lmIGRlZmluZWQoVElNNSkNCi0jZGVmaW5lIEdQSU9fQUYxX1RJTTUgKCh1aW50OF90KTB4MDEpICAvKiBUSU01IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUSU01ICovDQotI2RlZmluZSBHUElPX0FGMV9USU0xNiAoKHVpbnQ4X3QpMHgwMSkgLyogVElNMTYgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovDQotI2RlZmluZSBHUElPX0FGMV9USU0xNyAoKHVpbnQ4X3QpMHgwMSkgLyogVElNMTcgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovDQotI2RlZmluZSBHUElPX0FGMV9USU0xN19DT01QMSBcDQotICAoKHVpbnQ4X3QpMHgwMSkgLyogVElNMTcvQ09NUDEgQnJlYWsgaW4gQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovDQotI2RlZmluZSBHUElPX0FGMV9USU0xNSAoKHVpbnQ4X3QpMHgwMSkgLyogVElNMTUgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovDQotI2RlZmluZSBHUElPX0FGMV9MUFRJTTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgodWludDhfdCkweDAxKSAgICAgICAgICAgICAgICAgICAvKiBMUFRJTTEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgR1BJT19BRjFfSVIgKCh1aW50OF90KTB4MDEpIC8qIElSIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgIEFGIDIgc2VsZWN0aW9uDQotICovDQotI2RlZmluZSBHUElPX0FGMl9USU0xICgodWludDhfdCkweDAyKSAvKiBUSU0xIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLw0KLSNkZWZpbmUgR1BJT19BRjJfVElNMiAoKHVpbnQ4X3QpMHgwMikgLyogVElNMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8NCi0jZGVmaW5lIEdQSU9fQUYyX1RJTTMgKCh1aW50OF90KTB4MDIpIC8qIFRJTTMgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovDQotI2RlZmluZSBHUElPX0FGMl9USU00ICgodWludDhfdCkweDAyKSAvKiBUSU00IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLw0KLSNpZiBkZWZpbmVkKFRJTTUpDQotI2RlZmluZSBHUElPX0FGMl9USU01ICgodWludDhfdCkweDAyKSAgLyogVElNNSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUSU01ICovDQotI2RlZmluZSBHUElPX0FGMl9USU04ICgodWludDhfdCkweDAyKSAgLyogVElNOCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8NCi0jZGVmaW5lIEdQSU9fQUYyX1RJTTE1ICgodWludDhfdCkweDAyKSAvKiBUSU0xNSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLw0KLSNkZWZpbmUgR1BJT19BRjJfVElNMTYgKCh1aW50OF90KTB4MDIpIC8qIFRJTTE2IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovDQotI2lmIGRlZmluZWQoVElNMjApDQotI2RlZmluZSBHUElPX0FGMl9USU0yMCAoKHVpbnQ4X3QpMHgwMikgLyogVElNMjAgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUSU0yMCAqLw0KLSNkZWZpbmUgR1BJT19BRjJfVElNMV9DT01QMSBcDQotICAoKHVpbnQ4X3QpMHgwMikgLyogVElNMS9DT01QMSBCcmVhayBpbiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICovDQotI2RlZmluZSBHUElPX0FGMl9USU0xNV9DT01QMSBcDQotICAoKHVpbnQ4X3QpMHgwMikgLyogVElNMTUvQ09NUDEgQnJlYWsgaW4gQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovDQotI2RlZmluZSBHUElPX0FGMl9USU0xNl9DT01QMSBcDQotICAoKHVpbnQ4X3QpMHgwMikgLyogVElNMTYvQ09NUDEgQnJlYWsgaW4gQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovDQotI2lmIGRlZmluZWQoVElNMjApDQotI2RlZmluZSBHUElPX0FGMl9USU0yMF9DT01QMSBcDQotICAoKHVpbnQ4X3QpMHgwMikgLyogVElNMjAvQ09NUDEgQnJlYWsgaW4gQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovDQotI2RlZmluZSBHUElPX0FGMl9USU0yMF9DT01QMiBcDQotICAoKHVpbnQ4X3QpMHgwMikgLyogVElNMjAvQ09NUDIgQnJlYWsgaW4gQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovDQotI2VuZGlmICAgICAgICAgICAgLyogVElNMjAgKi8NCi0jZGVmaW5lIEdQSU9fQUYyX0kyQzMgKCh1aW50OF90KTB4MDIpICAvKiBJMkMzIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLw0KLSNkZWZpbmUgR1BJT19BRjJfQ09NUDEgKCh1aW50OF90KTB4MDIpIC8qIENPTVAxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovDQotDQotLyoqDQotICogQGJyaWVmICAgQUYgMyBzZWxlY3Rpb24NCi0gKi8NCi0jZGVmaW5lIEdQSU9fQUYzX1RJTTE1ICgodWludDhfdCkweDAzKSAvKiBUSU0xNSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLw0KLSNpZiBkZWZpbmVkKFRJTTIwKQ0KLSNkZWZpbmUgR1BJT19BRjNfVElNMjAgKCh1aW50OF90KTB4MDMpIC8qIFRJTTIwIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovDQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVElNMjAgKi8NCi0jZGVmaW5lIEdQSU9fQUYzX1VDUEQxICgodWludDhfdCkweDAzKSAvKiBVQ1BEMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLw0KLSNkZWZpbmUgR1BJT19BRjNfSTJDMyAoKHVpbnQ4X3QpMHgwMykgIC8qIEkyQzMgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgKi8NCi0jaWYgZGVmaW5lZChJMkM0KQ0KLSNkZWZpbmUgR1BJT19BRjNfSTJDNCAoKHVpbnQ4X3QpMHgwMykgLyogSTJDNCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSTJDNCAqLw0KLSNpZiBkZWZpbmVkKEhSVElNMSkNCi0jZGVmaW5lIEdQSU9fQUYzX0hSVElNMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKCh1aW50OF90KTB4MDMpIC8qIEhSVElNMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyBcDQotICAgICAgICAgICAgICAgICAgICovDQotI2VuZGlmICAgICAgICAgICAgLyogSFJUSU0xICovDQotI2lmIGRlZmluZWQoUVVBRFNQSSkNCi0jZGVmaW5lIEdQSU9fQUYzX1FVQURTUEkgXA0KLSAgKCh1aW50OF90KTB4MDMpICAgICAgICAgICAgICAgICAgICAgIC8qIFFVQURTUEkgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBRVUFEU1BJICovDQotI2RlZmluZSBHUElPX0FGM19USU04ICgodWludDhfdCkweDAzKSAgLyogVElNOCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAqLw0KLSNkZWZpbmUgR1BJT19BRjNfU0FJMSAoKHVpbnQ4X3QpMHgwMykgIC8qIFNBSTEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovDQotI2RlZmluZSBHUElPX0FGM19DT01QMyAoKHVpbnQ4X3QpMHgwMykgLyogQ09NUDMgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgICBBRiA0IHNlbGVjdGlvbg0KLSAqLw0KLSNkZWZpbmUgR1BJT19BRjRfVElNMSAoKHVpbnQ4X3QpMHgwNCkgIC8qIFRJTTEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgKi8NCi0jZGVmaW5lIEdQSU9fQUY0X1RJTTggKCh1aW50OF90KTB4MDQpICAvKiBUSU04IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICovDQotI2RlZmluZSBHUElPX0FGNF9USU0xNiAoKHVpbnQ4X3QpMHgwNCkgLyogVElNMTYgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8NCi0jZGVmaW5lIEdQSU9fQUY0X1RJTTE3ICgodWludDhfdCkweDA0KSAvKiBUSU0xNyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLw0KLSNkZWZpbmUgR1BJT19BRjRfVElNOF9DT01QMSBcDQotICAoKHVpbnQ4X3QpMHgwNCkgLyogVElNOC9DT01QMSBCcmVhayBpbiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8NCi0jZGVmaW5lIEdQSU9fQUY0X0kyQzEgKCh1aW50OF90KTB4MDQpIC8qIEkyQzEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgKi8NCi0jZGVmaW5lIEdQSU9fQUY0X0kyQzIgKCh1aW50OF90KTB4MDQpIC8qIEkyQzIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgKi8NCi0jZGVmaW5lIEdQSU9fQUY0X0kyQzMgKCh1aW50OF90KTB4MDQpIC8qIEkyQzMgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgKi8NCi0jaWYgZGVmaW5lZChJMkM0KQ0KLSNkZWZpbmUgR1BJT19BRjRfSTJDNCAoKHVpbnQ4X3QpMHgwNCkgLyogSTJDNCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSTJDNCAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgIEFGIDUgc2VsZWN0aW9uDQotICovDQotI2RlZmluZSBHUElPX0FGNV9TUEkxIFwNCi0gICgodWludDhfdCkweDA1KSAvKiBTUEkxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgICovDQotI2RlZmluZSBHUElPX0FGNV9TUEkyIFwNCi0gICgodWludDhfdCkweDA1KSAvKiBTUEkyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgICovDQotI2lmIGRlZmluZWQoU1BJNCkNCi0jZGVmaW5lIEdQSU9fQUY1X1NQSTQgXA0KLSAgKCh1aW50OF90KTB4MDUpICAgICAgICAgICAgICAgICAgIC8qIFNQSTQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTUEk0ICovDQotI2RlZmluZSBHUElPX0FGNV9JUiAoKHVpbnQ4X3QpMHgwNSkgLyogSVIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8NCi0jZGVmaW5lIEdQSU9fQUY1X1RJTTggXA0KLSAgKCh1aW50OF90KTB4MDUpIC8qIFRJTTggQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAgKi8NCi0jZGVmaW5lIEdQSU9fQUY1X1RJTThfQ09NUDEgXA0KLSAgKCh1aW50OF90KTB4MDUpIC8qIFRJTTgvQ09NUDEgQnJlYWsgaW4gQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovDQotI2RlZmluZSBHUElPX0FGNV9VQVJUNCBcDQotICAoKHVpbnQ4X3QpMHgwNSkgLyogVUFSVDQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAqLw0KLSNpZiBkZWZpbmVkKFVBUlQ1KQ0KLSNkZWZpbmUgR1BJT19BRjVfVUFSVDUgXA0KLSAgKCh1aW50OF90KTB4MDUpIC8qIFVBUlQ1IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgKi8NCi0jZW5kaWYgICAgICAgICAgICAvKiBVQVJUNSAqLw0KLSNkZWZpbmUgR1BJT19BRjVfSTJTMmV4dCBcDQotICAoKHVpbnQ4X3QpMHgwNSkgLyogSTJTMmV4dF9TRCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgIEFGIDYgc2VsZWN0aW9uDQotICovDQotI2RlZmluZSBHUElPX0FGNl9TUEkyIFwNCi0gICgodWludDhfdCkweDA2KSAvKiBTUEkyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgICovDQotI2RlZmluZSBHUElPX0FGNl9TUEkzIFwNCi0gICgodWludDhfdCkweDA2KSAvKiBTUEkzIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgICovDQotI2RlZmluZSBHUElPX0FGNl9USU0xIFwNCi0gICgodWludDhfdCkweDA2KSAvKiBUSU0xIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgICovDQotI2lmIGRlZmluZWQoVElNNSkNCi0jZGVmaW5lIEdQSU9fQUY2X1RJTTUgXA0KLSAgKCh1aW50OF90KTB4MDYpIC8qIFRJTTUgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAgKi8NCi0jZW5kaWYgICAgICAgICAgICAvKiBUSU01ICovDQotI2RlZmluZSBHUElPX0FGNl9USU04IFwNCi0gICgodWludDhfdCkweDA2KSAvKiBUSU04IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgICovDQotI2lmIGRlZmluZWQoVElNMjApDQotI2RlZmluZSBHUElPX0FGNl9USU0yMCBcDQotICAoKHVpbnQ4X3QpMHgwNikgLyogVElNMjAgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAqLw0KLSNlbmRpZiAgICAgICAgICAgIC8qIFRJTTIwICovDQotI2RlZmluZSBHUElPX0FGNl9USU0xX0NPTVAxIFwNCi0gICgodWludDhfdCkweDA2KSAvKiBUSU0xL0NPTVAxIEJyZWFrIGluIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLw0KLSNkZWZpbmUgR1BJT19BRjZfVElNMV9DT01QMiBcDQotICAoKHVpbnQ4X3QpMHgwNikgLyogVElNMS9DT01QMiBCcmVhayBpbiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8NCi0jZGVmaW5lIEdQSU9fQUY2X1RJTThfQ09NUDIgXA0KLSAgKCh1aW50OF90KTB4MDYpIC8qIFRJTTgvQ09NUDIgQnJlYWsgaW4gQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovDQotI2RlZmluZSBHUElPX0FGNl9JUiAoKHVpbnQ4X3QpMHgwNikgLyogSVIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8NCi0jZGVmaW5lIEdQSU9fQUY2X0kyUzNleHQgXA0KLSAgKCh1aW50OF90KTB4MDYpIC8qIEkyUzNleHRfU0QgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgICBBRiA3IHNlbGVjdGlvbg0KLSAqLw0KLSNkZWZpbmUgR1BJT19BRjdfVVNBUlQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKHVpbnQ4X3QpMHgwNykgLyogVVNBUlQxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nIFwNCi0gICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIEdQSU9fQUY3X1VTQVJUMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKCh1aW50OF90KTB4MDcpIC8qIFVTQVJUMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyBcDQotICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBHUElPX0FGN19VU0FSVDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgodWludDhfdCkweDA3KSAvKiBVU0FSVDMgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgXA0KLSAgICAgICAgICAgICAgICAgICAqLw0KLSNpZiBkZWZpbmVkKENPTVA1KQ0KLSNkZWZpbmUgR1BJT19BRjdfQ09NUDUgKCh1aW50OF90KTB4MDcpIC8qIENPTVA1IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovDQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ09NUDUgKi8NCi0jaWYgZGVmaW5lZChDT01QNikNCi0jZGVmaW5lIEdQSU9fQUY3X0NPTVA2ICgodWludDhfdCkweDA3KSAvKiBDT01QNiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENPTVA2ICovDQotI2lmIGRlZmluZWQoQ09NUDcpDQotI2RlZmluZSBHUElPX0FGN19DT01QNyAoKHVpbnQ4X3QpMHgwNykgLyogQ09NUDcgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDT01QNyAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgIEFGIDggc2VsZWN0aW9uDQotICovDQotI2RlZmluZSBHUElPX0FGOF9DT01QMSAoKHVpbnQ4X3QpMHgwOCkgLyogQ09NUDEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8NCi0jZGVmaW5lIEdQSU9fQUY4X0NPTVAyICgodWludDhfdCkweDA4KSAvKiBDT01QMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLw0KLSNkZWZpbmUgR1BJT19BRjhfQ09NUDMgKCh1aW50OF90KTB4MDgpIC8qIENPTVAzIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovDQotI2RlZmluZSBHUElPX0FGOF9DT01QNCAoKHVpbnQ4X3QpMHgwOCkgLyogQ09NUDQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8NCi0jaWYgZGVmaW5lZChDT01QNSkNCi0jZGVmaW5lIEdQSU9fQUY4X0NPTVA1ICgodWludDhfdCkweDA4KSAvKiBDT01QNSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENPTVA1ICovDQotI2lmIGRlZmluZWQoQ09NUDYpDQotI2RlZmluZSBHUElPX0FGOF9DT01QNiAoKHVpbnQ4X3QpMHgwOCkgLyogQ09NUDYgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDT01QNiAqLw0KLSNpZiBkZWZpbmVkKENPTVA3KQ0KLSNkZWZpbmUgR1BJT19BRjhfQ09NUDcgKCh1aW50OF90KTB4MDgpIC8qIENPTVA3IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovDQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ09NUDcgKi8NCi0jZGVmaW5lIEdQSU9fQUY4X0kyQzMgKCh1aW50OF90KTB4MDgpICAvKiBJMkMzIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICovDQotI2lmIGRlZmluZWQoSTJDNCkNCi0jZGVmaW5lIEdQSU9fQUY4X0kyQzQgKCh1aW50OF90KTB4MDgpIC8qIEkyQzQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEkyQzQgKi8NCi0jZGVmaW5lIEdQSU9fQUY4X0xQVUFSVDEgXA0KLSAgKCh1aW50OF90KTB4MDgpICAgICAgICAgICAgICAgICAgICAgIC8qIExQVUFSVDEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8NCi0jZGVmaW5lIEdQSU9fQUY4X1VBUlQ0ICgodWludDhfdCkweDA4KSAvKiBVQVJUNCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLw0KLSNpZiBkZWZpbmVkKFVBUlQ1KQ0KLSNkZWZpbmUgR1BJT19BRjhfVUFSVDUgKCh1aW50OF90KTB4MDgpIC8qIFVBUlQ1IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovDQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVUFSVDUgKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgICBBRiA5IHNlbGVjdGlvbg0KLSAqLw0KLSNkZWZpbmUgR1BJT19BRjlfVElNMSAoKHVpbnQ4X3QpMHgwOSkgIC8qIFRJTTEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgKi8NCi0jZGVmaW5lIEdQSU9fQUY5X1RJTTggKCh1aW50OF90KTB4MDkpICAvKiBUSU04IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICovDQotI2RlZmluZSBHUElPX0FGOV9USU0xNSAoKHVpbnQ4X3QpMHgwOSkgLyogVElNMTUgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8NCi0jZGVmaW5lIEdQSU9fQUY5X1RJTTFfQ09NUDEgXA0KLSAgKCh1aW50OF90KTB4MDkpIC8qIFRJTTEvQ09NUDEgQnJlYWsgaW4gQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAqLw0KLSNkZWZpbmUgR1BJT19BRjlfVElNOF9DT01QMSBcDQotICAoKHVpbnQ4X3QpMHgwOSkgLyogVElNOC9DT01QMSBCcmVhayBpbiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICovDQotI2RlZmluZSBHUElPX0FGOV9USU0xNV9DT01QMSBcDQotICAoKHVpbnQ4X3QpMHgwOSkgLyogVElNMTUvQ09NUDEgQnJlYWsgaW4gQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovDQotI2RlZmluZSBHUElPX0FGOV9GRENBTjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgodWludDhfdCkweDA5KSAvKiBGRENBTjEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgXA0KLSAgICAgICAgICAgICAgICAgICAqLw0KLSNpZiBkZWZpbmVkKEZEQ0FOMikNCi0jZGVmaW5lIEdQSU9fQUY5X0ZEQ0FOMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKCh1aW50OF90KTB4MDkpIC8qIEZEQ0FOMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyBcDQotICAgICAgICAgICAgICAgICAgICovDQotI2VuZGlmICAgICAgICAgICAgLyogRkRDQU4yICovDQotDQotLyoqDQotICogQGJyaWVmICAgQUYgMTAgc2VsZWN0aW9uDQotICovDQotI2RlZmluZSBHUElPX0FGMTBfVElNMiAoKHVpbnQ4X3QpMHgwQSkgIC8qIFRJTTIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovDQotI2RlZmluZSBHUElPX0FGMTBfVElNMyAoKHVpbnQ4X3QpMHgwQSkgIC8qIFRJTTMgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovDQotI2RlZmluZSBHUElPX0FGMTBfVElNNCAoKHVpbnQ4X3QpMHgwQSkgIC8qIFRJTTQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovDQotI2RlZmluZSBHUElPX0FGMTBfVElNOCAoKHVpbnQ4X3QpMHgwQSkgIC8qIFRJTTggQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovDQotI2RlZmluZSBHUElPX0FGMTBfVElNMTcgKCh1aW50OF90KTB4MEEpIC8qIFRJTTE3IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovDQotI2RlZmluZSBHUElPX0FGMTBfVElNOF9DT01QMiBcDQotICAoKHVpbnQ4X3QpMHgwQSkgLyogVElNOC9DT01QMiBCcmVhayBpbiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAqLw0KLSNkZWZpbmUgR1BJT19BRjEwX1RJTTE3X0NPTVAxIFwNCi0gICgodWludDhfdCkweDBBKSAvKiBUSU0xNy9DT01QMSBCcmVhayBpbiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICovDQotI2lmIGRlZmluZWQoUVVBRFNQSSkNCi0jZGVmaW5lIEdQSU9fQUYxMF9RVUFEU1BJIFwNCi0gICgodWludDhfdCkweDBBKSAvKiBPY3RvU1BJIE1hbmFnZXIgUG9ydCAxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovDQotI2VuZGlmICAgICAgICAgICAgLyogUVVBRFNQSSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgIEFGIDExIHNlbGVjdGlvbg0KLSAqLw0KLSNkZWZpbmUgR1BJT19BRjExX0ZEQ0FOMSBcDQotICAoKHVpbnQ4X3QpMHgwQikgLyogRkRDQU4xIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLw0KLSNpZiBkZWZpbmVkKEZEQ0FOMykNCi0jZGVmaW5lIEdQSU9fQUYxMV9GRENBTjMgXA0KLSAgKCh1aW50OF90KTB4MEIpICAgICAgICAgICAgICAgICAgICAgIC8qIEZEQ0FOMyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRENBTjMgKi8NCi0jZGVmaW5lIEdQSU9fQUYxMV9USU0xICgodWludDhfdCkweDBCKSAvKiBUSU0xIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovDQotI2RlZmluZSBHUElPX0FGMTFfVElNOCAoKHVpbnQ4X3QpMHgwQikgLyogVElNOCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLw0KLSNkZWZpbmUgR1BJT19BRjExX1RJTThfQ09NUDEgXA0KLSAgKCh1aW50OF90KTB4MEIpIC8qIFRJTTgvQ09NUDEgQnJlYWsgaW4gQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovDQotI2RlZmluZSBHUElPX0FGMTFfTFBUSU0xIFwNCi0gICgodWludDhfdCkweDBCKSAvKiBMUFRJTTEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovDQotDQotLyoqDQotICogQGJyaWVmICAgQUYgMTIgc2VsZWN0aW9uDQotICovDQotI2RlZmluZSBHUElPX0FGMTJfTFBVQVJUMSBcDQotICAoKHVpbnQ4X3QpMHgwQykgICAgICAgICAgICAgICAgICAgICAgLyogTFBVQVJUMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLw0KLSNkZWZpbmUgR1BJT19BRjEyX1RJTTEgKCh1aW50OF90KTB4MEMpIC8qIFRJTTEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8NCi0jZGVmaW5lIEdQSU9fQUYxMl9USU0xX0NPTVAxIFwNCi0gICgodWludDhfdCkweDBDKSAvKiBUSU0xL0NPTVAxIEJyZWFrIGluIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLw0KLSNkZWZpbmUgR1BJT19BRjEyX1RJTTFfQ09NUDIgXA0KLSAgKCh1aW50OF90KTB4MEMpIC8qIFRJTTEvQ09NUDIgQnJlYWsgaW4gQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovDQotI2lmIGRlZmluZWQoSFJUSU0xKQ0KLSNkZWZpbmUgR1BJT19BRjEyX0hSVElNMSBcDQotICAoKHVpbnQ4X3QpMHgwQykgLyogSFJUSU0xIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLw0KLSNlbmRpZiAgICAgICAgICAgIC8qIEhSVElNMSAqLw0KLSNpZiBkZWZpbmVkKEZNQ19CQU5LMSkNCi0jZGVmaW5lIEdQSU9fQUYxMl9GTUMgKCh1aW50OF90KTB4MEMpICAvKiBGTUMgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICovDQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRk1DX0JBTksxICovDQotI2RlZmluZSBHUElPX0FGMTJfU0FJMSAoKHVpbnQ4X3QpMHgwQykgLyogU0FJMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgICBBRiAxMyBzZWxlY3Rpb24NCi0gKi8NCi0jaWYgZGVmaW5lZChIUlRJTTEpDQotI2RlZmluZSBHUElPX0FGMTNfSFJUSU0xIFwNCi0gICgodWludDhfdCkweDBEKSAgICAgICAgICAgICAgICAgICAgICAvKiBIUlRJTTEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovDQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSFJUSU0xICovDQotI2RlZmluZSBHUElPX0FGMTNfU0FJMSAoKHVpbnQ4X3QpMHgwRCkgLyogU0FJMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgICBBRiAxNCBzZWxlY3Rpb24NCi0gKi8NCi0jZGVmaW5lIEdQSU9fQUYxNF9USU0yICgodWludDhfdCkweDBFKSAgLyogVElNMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICovDQotI2RlZmluZSBHUElPX0FGMTRfVElNMTUgKCh1aW50OF90KTB4MEUpIC8qIFRJTTE1IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovDQotI2RlZmluZSBHUElPX0FGMTRfVUNQRDEgKCh1aW50OF90KTB4MEUpIC8qIFVDUEQxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovDQotI2RlZmluZSBHUElPX0FGMTRfU0FJMSAoKHVpbnQ4X3QpMHgwRSkgIC8qIFNBSTEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovDQotI2RlZmluZSBHUElPX0FGMTRfVUFSVDQgXA0KLSAgKCh1aW50OF90KTB4MEUpIC8qIFVBUlQ0IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgKi8NCi0jaWYgZGVmaW5lZChVQVJUNSkNCi0jZGVmaW5lIEdQSU9fQUYxNF9VQVJUNSBcDQotICAoKHVpbnQ4X3QpMHgwRSkgLyogVUFSVDUgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAqLw0KLSNlbmRpZiAgICAgICAgICAgIC8qIFVBUlQ1ICovDQotDQotLyoqDQotICogQGJyaWVmICAgQUYgMTUgc2VsZWN0aW9uDQotICovDQotI2RlZmluZSBHUElPX0FGMTVfRVZFTlRPVVQgXA0KLSAgKCh1aW50OF90KTB4MEYpIC8qIEVWRU5UT1VUIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovDQotDQotI2RlZmluZSBJU19HUElPX0FGKEFGKSAoKEFGKSA8PSAodWludDhfdCkweDBGKQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgR1BJT0V4X0V4cG9ydGVkX01hY3JvcyBHUElPRXggRXhwb3J0ZWQgTWFjcm9zDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEdQSU9FeF9HZXRfUG9ydF9JbmRleCBHUElPRXggR2V0IFBvcnQgSW5kZXgNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgR1BJT19HRVRfSU5ERVgoX19HUElPeF9fKSAgIFwNCi0gICgoKF9fR1BJT3hfXykgPT0gKEdQSU9BKSkgICA/IDBVTCBcDQotICAgOiAoKF9fR1BJT3hfXykgPT0gKEdQSU9CKSkgPyAxVUwgXA0KLSAgIDogKChfX0dQSU94X18pID09IChHUElPQykpID8gMlVMIFwNCi0gICA6ICgoX19HUElPeF9fKSA9PSAoR1BJT0QpKSA/IDNVTCBcDQotICAgOiAoKF9fR1BJT3hfXykgPT0gKEdQSU9FKSkgPyA0VUwgXA0KLSAgIDogKChfX0dQSU94X18pID09IChHUElPRikpID8gNVVMIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDZVTCkNCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotI2lmZGVmIF9fY3BsdXNwbHVzDQotfQ0KLSNlbmRpZg0KLQ0KLSNlbmRpZiAvKiBTVE0zMkc0eHhfSEFMX0dQSU9fRVhfSCAqLw0KKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGZpbGUgICAgc3RtMzJnNHh4X2hhbF9ncGlvX2V4LmgKKyAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBHUElPIEhBTCBFeHRlbmRlZCBtb2R1bGUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYXR0ZW50aW9uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0ZXJtcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlCisgKiBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb2Z0d2FyZSBjb21wb25lbnQuCisgKiBJZiBubyBMSUNFTlNFIGZpbGUgY29tZXMgd2l0aCB0aGlzIHNvZnR3YXJlLCBpdCBpcyBwcm92aWRlZCBBUy1JUy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJHNHh4X0hBTF9HUElPX0VYX0gKKyNkZWZpbmUgU1RNMzJHNHh4X0hBTF9HUElPX0VYX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzR4eF9oYWxfZGVmLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkc0eHhfSEFMX0RyaXZlcgorICogQHsKKyAqLworCisvKiogQGRlZmdyb3VwIEdQSU9FeCBHUElPRXgKKyAqIEBicmllZiBHUElPIEV4dGVuZGVkIEhBTCBtb2R1bGUgZHJpdmVyCisgKiBAeworICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBHUElPRXhfRXhwb3J0ZWRfQ29uc3RhbnRzIEdQSU9FeCBFeHBvcnRlZCBDb25zdGFudHMKKyAqIEB7CisgKi8KKworLyoqIEBkZWZncm91cCBHUElPRXhfQWx0ZXJuYXRlX2Z1bmN0aW9uX3NlbGVjdGlvbiBHUElPRXggQWx0ZXJuYXRlIGZ1bmN0aW9uCisgKiBzZWxlY3Rpb24KKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgICBBRiAwIHNlbGVjdGlvbgorICovCisjZGVmaW5lIEdQSU9fQUYwX1JUQ181MEh6IFwKKyAgKCh1aW50OF90KTB4MDApIC8qIFJUQ181MEh6IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYwX01DTyBcCisgICgodWludDhfdCkweDAwKSAvKiBNQ08gKE1DTzEgYW5kIE1DTzIpIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYwX1NXSiBcCisgICgodWludDhfdCkweDAwKSAvKiBTV0ogKFNXRCBhbmQgSlRBRykgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjBfVFJBQ0UgKCh1aW50OF90KTB4MDApIC8qIFRSQUNFIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisKKy8qKgorICogQGJyaWVmICAgQUYgMSBzZWxlY3Rpb24KKyAqLworI2RlZmluZSBHUElPX0FGMV9USU0yICgodWludDhfdCkweDAxKSAvKiBUSU0yIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgKi8KKyNpZiBkZWZpbmVkKFRJTTUpCisjZGVmaW5lIEdQSU9fQUYxX1RJTTUgKCh1aW50OF90KTB4MDEpICAvKiBUSU01IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRJTTUgKi8KKyNkZWZpbmUgR1BJT19BRjFfVElNMTYgKCh1aW50OF90KTB4MDEpIC8qIFRJTTE2IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGMV9USU0xNyAoKHVpbnQ4X3QpMHgwMSkgLyogVElNMTcgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUYxX1RJTTE3X0NPTVAxIFwKKyAgKCh1aW50OF90KTB4MDEpIC8qIFRJTTE3L0NPTVAxIEJyZWFrIGluIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGMV9USU0xNSAoKHVpbnQ4X3QpMHgwMSkgLyogVElNMTUgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUYxX0xQVElNMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKHVpbnQ4X3QpMHgwMSkgICAgICAgICAgICAgICAgICAgLyogTFBUSU0xIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBHUElPX0FGMV9JUiAoKHVpbnQ4X3QpMHgwMSkgLyogSVIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICovCisKKy8qKgorICogQGJyaWVmICAgQUYgMiBzZWxlY3Rpb24KKyAqLworI2RlZmluZSBHUElPX0FGMl9USU0xICgodWludDhfdCkweDAyKSAvKiBUSU0xIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGMl9USU0yICgodWludDhfdCkweDAyKSAvKiBUSU0yIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGMl9USU0zICgodWludDhfdCkweDAyKSAvKiBUSU0zIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGMl9USU00ICgodWludDhfdCkweDAyKSAvKiBUSU00IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2lmIGRlZmluZWQoVElNNSkKKyNkZWZpbmUgR1BJT19BRjJfVElNNSAoKHVpbnQ4X3QpMHgwMikgIC8qIFRJTTUgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUSU01ICovCisjZGVmaW5lIEdQSU9fQUYyX1RJTTggKCh1aW50OF90KTB4MDIpICAvKiBUSU04IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGMl9USU0xNSAoKHVpbnQ4X3QpMHgwMikgLyogVElNMTUgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjJfVElNMTYgKCh1aW50OF90KTB4MDIpIC8qIFRJTTE2IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjaWYgZGVmaW5lZChUSU0yMCkKKyNkZWZpbmUgR1BJT19BRjJfVElNMjAgKCh1aW50OF90KTB4MDIpIC8qIFRJTTIwIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUSU0yMCAqLworI2RlZmluZSBHUElPX0FGMl9USU0xX0NPTVAxIFwKKyAgKCh1aW50OF90KTB4MDIpIC8qIFRJTTEvQ09NUDEgQnJlYWsgaW4gQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAqLworI2RlZmluZSBHUElPX0FGMl9USU0xNV9DT01QMSBcCisgICgodWludDhfdCkweDAyKSAvKiBUSU0xNS9DT01QMSBCcmVhayBpbiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjJfVElNMTZfQ09NUDEgXAorICAoKHVpbnQ4X3QpMHgwMikgLyogVElNMTYvQ09NUDEgQnJlYWsgaW4gQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjaWYgZGVmaW5lZChUSU0yMCkKKyNkZWZpbmUgR1BJT19BRjJfVElNMjBfQ09NUDEgXAorICAoKHVpbnQ4X3QpMHgwMikgLyogVElNMjAvQ09NUDEgQnJlYWsgaW4gQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUYyX1RJTTIwX0NPTVAyIFwKKyAgKCh1aW50OF90KTB4MDIpIC8qIFRJTTIwL0NPTVAyIEJyZWFrIGluIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2VuZGlmICAgICAgICAgICAgLyogVElNMjAgKi8KKyNkZWZpbmUgR1BJT19BRjJfSTJDMyAoKHVpbnQ4X3QpMHgwMikgIC8qIEkyQzMgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUYyX0NPTVAxICgodWludDhfdCkweDAyKSAvKiBDT01QMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworCisvKioKKyAqIEBicmllZiAgIEFGIDMgc2VsZWN0aW9uCisgKi8KKyNkZWZpbmUgR1BJT19BRjNfVElNMTUgKCh1aW50OF90KTB4MDMpIC8qIFRJTTE1IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjaWYgZGVmaW5lZChUSU0yMCkKKyNkZWZpbmUgR1BJT19BRjNfVElNMjAgKCh1aW50OF90KTB4MDMpIC8qIFRJTTIwIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUSU0yMCAqLworI2RlZmluZSBHUElPX0FGM19VQ1BEMSAoKHVpbnQ4X3QpMHgwMykgLyogVUNQRDEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjNfSTJDMyAoKHVpbnQ4X3QpMHgwMykgIC8qIEkyQzMgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgKi8KKyNpZiBkZWZpbmVkKEkyQzQpCisjZGVmaW5lIEdQSU9fQUYzX0kyQzQgKCh1aW50OF90KTB4MDMpIC8qIEkyQzQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSTJDNCAqLworI2lmIGRlZmluZWQoSFJUSU0xKQorI2RlZmluZSBHUElPX0FGM19IUlRJTTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCh1aW50OF90KTB4MDMpIC8qIEhSVElNMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyBcCisgICAgICAgICAgICAgICAgICAgKi8KKyNlbmRpZiAgICAgICAgICAgIC8qIEhSVElNMSAqLworI2lmIGRlZmluZWQoUVVBRFNQSSkKKyNkZWZpbmUgR1BJT19BRjNfUVVBRFNQSSBcCisgICgodWludDhfdCkweDAzKSAgICAgICAgICAgICAgICAgICAgICAvKiBRVUFEU1BJIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBRVUFEU1BJICovCisjZGVmaW5lIEdQSU9fQUYzX1RJTTggKCh1aW50OF90KTB4MDMpICAvKiBUSU04IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICovCisjZGVmaW5lIEdQSU9fQUYzX1NBSTEgKCh1aW50OF90KTB4MDMpICAvKiBTQUkxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGM19DT01QMyAoKHVpbnQ4X3QpMHgwMykgLyogQ09NUDMgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKworLyoqCisgKiBAYnJpZWYgICBBRiA0IHNlbGVjdGlvbgorICovCisjZGVmaW5lIEdQSU9fQUY0X1RJTTEgKCh1aW50OF90KTB4MDQpICAvKiBUSU0xIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICovCisjZGVmaW5lIEdQSU9fQUY0X1RJTTggKCh1aW50OF90KTB4MDQpICAvKiBUSU04IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICovCisjZGVmaW5lIEdQSU9fQUY0X1RJTTE2ICgodWludDhfdCkweDA0KSAvKiBUSU0xNiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNF9USU0xNyAoKHVpbnQ4X3QpMHgwNCkgLyogVElNMTcgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjRfVElNOF9DT01QMSBcCisgICgodWludDhfdCkweDA0KSAvKiBUSU04L0NPTVAxIEJyZWFrIGluIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGNF9JMkMxICgodWludDhfdCkweDA0KSAvKiBJMkMxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICovCisjZGVmaW5lIEdQSU9fQUY0X0kyQzIgKCh1aW50OF90KTB4MDQpIC8qIEkyQzIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgKi8KKyNkZWZpbmUgR1BJT19BRjRfSTJDMyAoKHVpbnQ4X3QpMHgwNCkgLyogSTJDMyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAqLworI2lmIGRlZmluZWQoSTJDNCkKKyNkZWZpbmUgR1BJT19BRjRfSTJDNCAoKHVpbnQ4X3QpMHgwNCkgLyogSTJDNCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAqLworI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJMkM0ICovCisKKy8qKgorICogQGJyaWVmICAgQUYgNSBzZWxlY3Rpb24KKyAqLworI2RlZmluZSBHUElPX0FGNV9TUEkxIFwKKyAgKCh1aW50OF90KTB4MDUpIC8qIFNQSTEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjVfU1BJMiBcCisgICgodWludDhfdCkweDA1KSAvKiBTUEkyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgICovCisjaWYgZGVmaW5lZChTUEk0KQorI2RlZmluZSBHUElPX0FGNV9TUEk0IFwKKyAgKCh1aW50OF90KTB4MDUpICAgICAgICAgICAgICAgICAgIC8qIFNQSTQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNQSTQgKi8KKyNkZWZpbmUgR1BJT19BRjVfSVIgKCh1aW50OF90KTB4MDUpIC8qIElSIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY1X1RJTTggXAorICAoKHVpbnQ4X3QpMHgwNSkgLyogVElNOCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICAqLworI2RlZmluZSBHUElPX0FGNV9USU04X0NPTVAxIFwKKyAgKCh1aW50OF90KTB4MDUpIC8qIFRJTTgvQ09NUDEgQnJlYWsgaW4gQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUY1X1VBUlQ0IFwKKyAgKCh1aW50OF90KTB4MDUpIC8qIFVBUlQ0IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgKi8KKyNpZiBkZWZpbmVkKFVBUlQ1KQorI2RlZmluZSBHUElPX0FGNV9VQVJUNSBcCisgICgodWludDhfdCkweDA1KSAvKiBVQVJUNSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICovCisjZW5kaWYgICAgICAgICAgICAvKiBVQVJUNSAqLworI2RlZmluZSBHUElPX0FGNV9JMlMyZXh0IFwKKyAgKCh1aW50OF90KTB4MDUpIC8qIEkyUzJleHRfU0QgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKworLyoqCisgKiBAYnJpZWYgICBBRiA2IHNlbGVjdGlvbgorICovCisjZGVmaW5lIEdQSU9fQUY2X1NQSTIgXAorICAoKHVpbnQ4X3QpMHgwNikgLyogU1BJMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICAqLworI2RlZmluZSBHUElPX0FGNl9TUEkzIFwKKyAgKCh1aW50OF90KTB4MDYpIC8qIFNQSTMgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjZfVElNMSBcCisgICgodWludDhfdCkweDA2KSAvKiBUSU0xIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgICovCisjaWYgZGVmaW5lZChUSU01KQorI2RlZmluZSBHUElPX0FGNl9USU01IFwKKyAgKCh1aW50OF90KTB4MDYpIC8qIFRJTTUgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAgKi8KKyNlbmRpZiAgICAgICAgICAgIC8qIFRJTTUgKi8KKyNkZWZpbmUgR1BJT19BRjZfVElNOCBcCisgICgodWludDhfdCkweDA2KSAvKiBUSU04IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgICovCisjaWYgZGVmaW5lZChUSU0yMCkKKyNkZWZpbmUgR1BJT19BRjZfVElNMjAgXAorICAoKHVpbnQ4X3QpMHgwNikgLyogVElNMjAgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAqLworI2VuZGlmICAgICAgICAgICAgLyogVElNMjAgKi8KKyNkZWZpbmUgR1BJT19BRjZfVElNMV9DT01QMSBcCisgICgodWludDhfdCkweDA2KSAvKiBUSU0xL0NPTVAxIEJyZWFrIGluIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGNl9USU0xX0NPTVAyIFwKKyAgKCh1aW50OF90KTB4MDYpIC8qIFRJTTEvQ09NUDIgQnJlYWsgaW4gQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUY2X1RJTThfQ09NUDIgXAorICAoKHVpbnQ4X3QpMHgwNikgLyogVElNOC9DT01QMiBCcmVhayBpbiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjZfSVIgKCh1aW50OF90KTB4MDYpIC8qIElSIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY2X0kyUzNleHQgXAorICAoKHVpbnQ4X3QpMHgwNikgLyogSTJTM2V4dF9TRCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworCisvKioKKyAqIEBicmllZiAgIEFGIDcgc2VsZWN0aW9uCisgKi8KKyNkZWZpbmUgR1BJT19BRjdfVVNBUlQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgodWludDhfdCkweDA3KSAvKiBVU0FSVDEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgXAorICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEdQSU9fQUY3X1VTQVJUMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKHVpbnQ4X3QpMHgwNykgLyogVVNBUlQyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nIFwKKyAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBHUElPX0FGN19VU0FSVDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCh1aW50OF90KTB4MDcpIC8qIFVTQVJUMyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyBcCisgICAgICAgICAgICAgICAgICAgKi8KKyNpZiBkZWZpbmVkKENPTVA1KQorI2RlZmluZSBHUElPX0FGN19DT01QNSAoKHVpbnQ4X3QpMHgwNykgLyogQ09NUDUgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENPTVA1ICovCisjaWYgZGVmaW5lZChDT01QNikKKyNkZWZpbmUgR1BJT19BRjdfQ09NUDYgKCh1aW50OF90KTB4MDcpIC8qIENPTVA2IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDT01QNiAqLworI2lmIGRlZmluZWQoQ09NUDcpCisjZGVmaW5lIEdQSU9fQUY3X0NPTVA3ICgodWludDhfdCkweDA3KSAvKiBDT01QNyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ09NUDcgKi8KKworLyoqCisgKiBAYnJpZWYgICBBRiA4IHNlbGVjdGlvbgorICovCisjZGVmaW5lIEdQSU9fQUY4X0NPTVAxICgodWludDhfdCkweDA4KSAvKiBDT01QMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGOF9DT01QMiAoKHVpbnQ4X3QpMHgwOCkgLyogQ09NUDIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjhfQ09NUDMgKCh1aW50OF90KTB4MDgpIC8qIENPTVAzIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY4X0NPTVA0ICgodWludDhfdCkweDA4KSAvKiBDT01QNCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2lmIGRlZmluZWQoQ09NUDUpCisjZGVmaW5lIEdQSU9fQUY4X0NPTVA1ICgodWludDhfdCkweDA4KSAvKiBDT01QNSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ09NUDUgKi8KKyNpZiBkZWZpbmVkKENPTVA2KQorI2RlZmluZSBHUElPX0FGOF9DT01QNiAoKHVpbnQ4X3QpMHgwOCkgLyogQ09NUDYgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENPTVA2ICovCisjaWYgZGVmaW5lZChDT01QNykKKyNkZWZpbmUgR1BJT19BRjhfQ09NUDcgKCh1aW50OF90KTB4MDgpIC8qIENPTVA3IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDT01QNyAqLworI2RlZmluZSBHUElPX0FGOF9JMkMzICgodWludDhfdCkweDA4KSAgLyogSTJDMyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAqLworI2lmIGRlZmluZWQoSTJDNCkKKyNkZWZpbmUgR1BJT19BRjhfSTJDNCAoKHVpbnQ4X3QpMHgwOCkgLyogSTJDNCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAqLworI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJMkM0ICovCisjZGVmaW5lIEdQSU9fQUY4X0xQVUFSVDEgXAorICAoKHVpbnQ4X3QpMHgwOCkgICAgICAgICAgICAgICAgICAgICAgLyogTFBVQVJUMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGOF9VQVJUNCAoKHVpbnQ4X3QpMHgwOCkgLyogVUFSVDQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNpZiBkZWZpbmVkKFVBUlQ1KQorI2RlZmluZSBHUElPX0FGOF9VQVJUNSAoKHVpbnQ4X3QpMHgwOCkgLyogVUFSVDUgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVBUlQ1ICovCisKKy8qKgorICogQGJyaWVmICAgQUYgOSBzZWxlY3Rpb24KKyAqLworI2RlZmluZSBHUElPX0FGOV9USU0xICgodWludDhfdCkweDA5KSAgLyogVElNMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAqLworI2RlZmluZSBHUElPX0FGOV9USU04ICgodWludDhfdCkweDA5KSAgLyogVElNOCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAqLworI2RlZmluZSBHUElPX0FGOV9USU0xNSAoKHVpbnQ4X3QpMHgwOSkgLyogVElNMTUgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjlfVElNMV9DT01QMSBcCisgICgodWludDhfdCkweDA5KSAvKiBUSU0xL0NPTVAxIEJyZWFrIGluIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgKi8KKyNkZWZpbmUgR1BJT19BRjlfVElNOF9DT01QMSBcCisgICgodWludDhfdCkweDA5KSAvKiBUSU04L0NPTVAxIEJyZWFrIGluIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgKi8KKyNkZWZpbmUgR1BJT19BRjlfVElNMTVfQ09NUDEgXAorICAoKHVpbnQ4X3QpMHgwOSkgLyogVElNMTUvQ09NUDEgQnJlYWsgaW4gQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUY5X0ZEQ0FOMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKHVpbnQ4X3QpMHgwOSkgLyogRkRDQU4xIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nIFwKKyAgICAgICAgICAgICAgICAgICAqLworI2lmIGRlZmluZWQoRkRDQU4yKQorI2RlZmluZSBHUElPX0FGOV9GRENBTjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCh1aW50OF90KTB4MDkpIC8qIEZEQ0FOMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyBcCisgICAgICAgICAgICAgICAgICAgKi8KKyNlbmRpZiAgICAgICAgICAgIC8qIEZEQ0FOMiAqLworCisvKioKKyAqIEBicmllZiAgIEFGIDEwIHNlbGVjdGlvbgorICovCisjZGVmaW5lIEdQSU9fQUYxMF9USU0yICgodWludDhfdCkweDBBKSAgLyogVElNMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjEwX1RJTTMgKCh1aW50OF90KTB4MEEpICAvKiBUSU0zIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGMTBfVElNNCAoKHVpbnQ4X3QpMHgwQSkgIC8qIFRJTTQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUYxMF9USU04ICgodWludDhfdCkweDBBKSAgLyogVElNOCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjEwX1RJTTE3ICgodWludDhfdCkweDBBKSAvKiBUSU0xNyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMTBfVElNOF9DT01QMiBcCisgICgodWludDhfdCkweDBBKSAvKiBUSU04L0NPTVAyIEJyZWFrIGluIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICovCisjZGVmaW5lIEdQSU9fQUYxMF9USU0xN19DT01QMSBcCisgICgodWludDhfdCkweDBBKSAvKiBUSU0xNy9DT01QMSBCcmVhayBpbiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICovCisjaWYgZGVmaW5lZChRVUFEU1BJKQorI2RlZmluZSBHUElPX0FGMTBfUVVBRFNQSSBcCisgICgodWludDhfdCkweDBBKSAvKiBPY3RvU1BJIE1hbmFnZXIgUG9ydCAxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZW5kaWYgICAgICAgICAgICAvKiBRVUFEU1BJICovCisKKy8qKgorICogQGJyaWVmICAgQUYgMTEgc2VsZWN0aW9uCisgKi8KKyNkZWZpbmUgR1BJT19BRjExX0ZEQ0FOMSBcCisgICgodWludDhfdCkweDBCKSAvKiBGRENBTjEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjaWYgZGVmaW5lZChGRENBTjMpCisjZGVmaW5lIEdQSU9fQUYxMV9GRENBTjMgXAorICAoKHVpbnQ4X3QpMHgwQikgICAgICAgICAgICAgICAgICAgICAgLyogRkRDQU4zIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkRDQU4zICovCisjZGVmaW5lIEdQSU9fQUYxMV9USU0xICgodWludDhfdCkweDBCKSAvKiBUSU0xIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYxMV9USU04ICgodWludDhfdCkweDBCKSAvKiBUSU04IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYxMV9USU04X0NPTVAxIFwKKyAgKCh1aW50OF90KTB4MEIpIC8qIFRJTTgvQ09NUDEgQnJlYWsgaW4gQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUYxMV9MUFRJTTEgXAorICAoKHVpbnQ4X3QpMHgwQikgLyogTFBUSU0xIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworCisvKioKKyAqIEBicmllZiAgIEFGIDEyIHNlbGVjdGlvbgorICovCisjZGVmaW5lIEdQSU9fQUYxMl9MUFVBUlQxIFwKKyAgKCh1aW50OF90KTB4MEMpICAgICAgICAgICAgICAgICAgICAgIC8qIExQVUFSVDEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjEyX1RJTTEgKCh1aW50OF90KTB4MEMpIC8qIFRJTTEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjEyX1RJTTFfQ09NUDEgXAorICAoKHVpbnQ4X3QpMHgwQykgLyogVElNMS9DT01QMSBCcmVhayBpbiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjEyX1RJTTFfQ09NUDIgXAorICAoKHVpbnQ4X3QpMHgwQykgLyogVElNMS9DT01QMiBCcmVhayBpbiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNpZiBkZWZpbmVkKEhSVElNMSkKKyNkZWZpbmUgR1BJT19BRjEyX0hSVElNMSBcCisgICgodWludDhfdCkweDBDKSAvKiBIUlRJTTEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZW5kaWYgICAgICAgICAgICAvKiBIUlRJTTEgKi8KKyNpZiBkZWZpbmVkKEZNQ19CQU5LMSkKKyNkZWZpbmUgR1BJT19BRjEyX0ZNQyAoKHVpbnQ4X3QpMHgwQykgIC8qIEZNQyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZNQ19CQU5LMSAqLworI2RlZmluZSBHUElPX0FGMTJfU0FJMSAoKHVpbnQ4X3QpMHgwQykgLyogU0FJMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKworLyoqCisgKiBAYnJpZWYgICBBRiAxMyBzZWxlY3Rpb24KKyAqLworI2lmIGRlZmluZWQoSFJUSU0xKQorI2RlZmluZSBHUElPX0FGMTNfSFJUSU0xIFwKKyAgKCh1aW50OF90KTB4MEQpICAgICAgICAgICAgICAgICAgICAgIC8qIEhSVElNMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhSVElNMSAqLworI2RlZmluZSBHUElPX0FGMTNfU0FJMSAoKHVpbnQ4X3QpMHgwRCkgLyogU0FJMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKworLyoqCisgKiBAYnJpZWYgICBBRiAxNCBzZWxlY3Rpb24KKyAqLworI2RlZmluZSBHUElPX0FGMTRfVElNMiAoKHVpbnQ4X3QpMHgwRSkgIC8qIFRJTTIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAqLworI2RlZmluZSBHUElPX0FGMTRfVElNMTUgKCh1aW50OF90KTB4MEUpIC8qIFRJTTE1IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYxNF9VQ1BEMSAoKHVpbnQ4X3QpMHgwRSkgLyogVUNQRDEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjE0X1NBSTEgKCh1aW50OF90KTB4MEUpICAvKiBTQUkxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGMTRfVUFSVDQgXAorICAoKHVpbnQ4X3QpMHgwRSkgLyogVUFSVDQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAqLworI2lmIGRlZmluZWQoVUFSVDUpCisjZGVmaW5lIEdQSU9fQUYxNF9VQVJUNSBcCisgICgodWludDhfdCkweDBFKSAvKiBVQVJUNSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICovCisjZW5kaWYgICAgICAgICAgICAvKiBVQVJUNSAqLworCisvKioKKyAqIEBicmllZiAgIEFGIDE1IHNlbGVjdGlvbgorICovCisjZGVmaW5lIEdQSU9fQUYxNV9FVkVOVE9VVCBcCisgICgodWludDhfdCkweDBGKSAvKiBFVkVOVE9VVCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworCisjZGVmaW5lIElTX0dQSU9fQUYoQUYpICgoQUYpIDw9ICh1aW50OF90KTB4MEYpCisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgR1BJT0V4X0V4cG9ydGVkX01hY3JvcyBHUElPRXggRXhwb3J0ZWQgTWFjcm9zCisgKiBAeworICovCisKKy8qKiBAZGVmZ3JvdXAgR1BJT0V4X0dldF9Qb3J0X0luZGV4IEdQSU9FeCBHZXQgUG9ydCBJbmRleAorICogQHsKKyAqLworI2RlZmluZSBHUElPX0dFVF9JTkRFWChfX0dQSU94X18pICAgXAorICAoKChfX0dQSU94X18pID09IChHUElPQSkpICAgPyAwVUwgXAorICAgOiAoKF9fR1BJT3hfXykgPT0gKEdQSU9CKSkgPyAxVUwgXAorICAgOiAoKF9fR1BJT3hfXykgPT0gKEdQSU9DKSkgPyAyVUwgXAorICAgOiAoKF9fR1BJT3hfXykgPT0gKEdQSU9EKSkgPyAzVUwgXAorICAgOiAoKF9fR1BJT3hfXykgPT0gKEdQSU9FKSkgPyA0VUwgXAorICAgOiAoKF9fR1BJT3hfXykgPT0gKEdQSU9GKSkgPyA1VUwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiA2VUwpCisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyRzR4eF9IQUxfR1BJT19FWF9IICovCmRpZmYgLS1naXQgYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9oYWxfaXdkZy5oIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfaGFsX2l3ZGcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjk4M2FlCi0tLSAvZGV2L251bGwKKysrIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfaGFsX2l3ZGcuaApAQCAtMCwwICsxLDI0NSBAQAorLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAZmlsZSAgICBzdG0zMmc0eHhfaGFsX2l3ZGcuaAorICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIElXREcgSEFMIG1vZHVsZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBhdHRlbnRpb24KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRlcm1zIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUKKyAqIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4KKyAqIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcyB3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMkc0eHhfSEFMX0lXREdfSAorI2RlZmluZSBTVE0zMkc0eHhfSEFMX0lXREdfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnNHh4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzR4eF9IQUxfRHJpdmVyCisgKiBAeworICovCisKKy8qKiBAZGVmZ3JvdXAgSVdERyBJV0RHCisgKiBAeworICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIElXREdfRXhwb3J0ZWRfVHlwZXMgSVdERyBFeHBvcnRlZCBUeXBlcworICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiAgSVdERyBJbml0IHN0cnVjdHVyZSBkZWZpbml0aW9uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDMyX3QKKyAgICAgIFByZXNjYWxlcjsgLyohPCBTZWxlY3QgdGhlIHByZXNjYWxlciBvZiB0aGUgSVdERy4KKyAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIElXREdfUHJlc2NhbGVyICovCisKKyAgdWludDMyX3QgUmVsb2FkOyAvKiE8IFNwZWNpZmllcyB0aGUgSVdERyBkb3duLWNvdW50ZXIgcmVsb2FkIHZhbHVlLgorICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQKKyAgICAgICAgICAgICAgICAgICAgICBNYXhfRGF0YSA9IDB4MEZGRiAqLworCisgIHVpbnQzMl90IFdpbmRvdzsgLyohPCBTcGVjaWZpZXMgdGhlIHdpbmRvdyB2YWx1ZSB0byBiZSBjb21wYXJlZCB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICBkb3duLWNvdW50ZXIuIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbgorICAgICAgICAgICAgICAgICAgICAgIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAweDBGRkYgKi8KKworfSBJV0RHX0luaXRUeXBlRGVmOworCisvKioKKyAqIEBicmllZiAgSVdERyBIYW5kbGUgU3RydWN0dXJlIGRlZmluaXRpb24KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBJV0RHX1R5cGVEZWYgKkluc3RhbmNlOyAvKiE8IFJlZ2lzdGVyIGJhc2UgYWRkcmVzcyAgICAqLworCisgIElXREdfSW5pdFR5cGVEZWYgSW5pdDsgLyohPCBJV0RHIHJlcXVpcmVkIHBhcmFtZXRlcnMgKi8KK30gSVdER19IYW5kbGVUeXBlRGVmOworCisvKioKKyAqIEB9CisgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSVdER19FeHBvcnRlZF9Db25zdGFudHMgSVdERyBFeHBvcnRlZCBDb25zdGFudHMKKyAqIEB7CisgKi8KKworLyoqIEBkZWZncm91cCBJV0RHX1ByZXNjYWxlciBJV0RHIFByZXNjYWxlcgorICogQHsKKyAqLworI2RlZmluZSBJV0RHX1BSRVNDQUxFUl80IDB4MDAwMDAwMDB1ICAgLyohPCBJV0RHIHByZXNjYWxlciBzZXQgdG8gNCAgICovCisjZGVmaW5lIElXREdfUFJFU0NBTEVSXzggSVdER19QUl9QUl8wICAvKiE8IElXREcgcHJlc2NhbGVyIHNldCB0byA4ICAgKi8KKyNkZWZpbmUgSVdER19QUkVTQ0FMRVJfMTYgSVdER19QUl9QUl8xIC8qITwgSVdERyBwcmVzY2FsZXIgc2V0IHRvIDE2ICAqLworI2RlZmluZSBJV0RHX1BSRVNDQUxFUl8zMiBcCisgIChJV0RHX1BSX1BSXzEgfCBJV0RHX1BSX1BSXzApICAgICAgICAvKiE8IElXREcgcHJlc2NhbGVyIHNldCB0byAzMiAgKi8KKyNkZWZpbmUgSVdER19QUkVTQ0FMRVJfNjQgSVdER19QUl9QUl8yIC8qITwgSVdERyBwcmVzY2FsZXIgc2V0IHRvIDY0ICAqLworI2RlZmluZSBJV0RHX1BSRVNDQUxFUl8xMjggXAorICAoSVdER19QUl9QUl8yIHwgSVdER19QUl9QUl8wKSAvKiE8IElXREcgcHJlc2NhbGVyIHNldCB0byAxMjggKi8KKyNkZWZpbmUgSVdER19QUkVTQ0FMRVJfMjU2IFwKKyAgKElXREdfUFJfUFJfMiB8IElXREdfUFJfUFJfMSkgLyohPCBJV0RHIHByZXNjYWxlciBzZXQgdG8gMjU2ICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBJV0RHX1dpbmRvd19vcHRpb24gSVdERyBXaW5kb3cgb3B0aW9uCisgKiBAeworICovCisjZGVmaW5lIElXREdfV0lORE9XX0RJU0FCTEUgSVdER19XSU5SX1dJTgorLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisvKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBJV0RHX0V4cG9ydGVkX01hY3JvcyBJV0RHIEV4cG9ydGVkIE1hY3JvcworICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiAgRW5hYmxlIHRoZSBJV0RHIHBlcmlwaGVyYWwuCisgKiBAcGFyYW0gIF9fSEFORExFX18gIElXREcgaGFuZGxlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9JV0RHX1NUQVJUKF9fSEFORExFX18pIFwKKyAgV1JJVEVfUkVHKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPktSLCBJV0RHX0tFWV9FTkFCTEUpCisKKy8qKgorICogQGJyaWVmICBSZWxvYWQgSVdERyBjb3VudGVyIHdpdGggdmFsdWUgZGVmaW5lZCBpbiB0aGUgcmVsb2FkIHJlZ2lzdGVyCisgKiAgICAgICAgICh3cml0ZSBhY2Nlc3MgdG8gSVdER19QUiwgSVdER19STFIgYW5kIElXREdfV0lOUiByZWdpc3RlcnMgZGlzYWJsZWQpLgorICogQHBhcmFtICBfX0hBTkRMRV9fICBJV0RHIGhhbmRsZQorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfSVdER19SRUxPQURfQ09VTlRFUihfX0hBTkRMRV9fKSBcCisgIFdSSVRFX1JFRygoX19IQU5ETEVfXyktPkluc3RhbmNlLT5LUiwgSVdER19LRVlfUkVMT0FEKQorCisvKioKKyAqIEB9CisgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSVdER19FeHBvcnRlZF9GdW5jdGlvbnMgIElXREcgRXhwb3J0ZWQgRnVuY3Rpb25zCisgKiBAeworICovCisKKy8qKiBAZGVmZ3JvdXAgSVdER19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBTdGFydCBmdW5jdGlvbnMKKyAqIEB7CisgKi8KKy8qIEluaXRpYWxpemF0aW9uL1N0YXJ0IGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVdER19Jbml0KElXREdfSGFuZGxlVHlwZURlZiAqaGl3ZGcpOworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgSVdER19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAqIEB7CisgKi8KKy8qIEkvTyBvcGVyYXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVdER19SZWZyZXNoKElXREdfSGFuZGxlVHlwZURlZiAqaGl3ZGcpOworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBJV0RHX1ByaXZhdGVfQ29uc3RhbnRzIElXREcgUHJpdmF0ZSBDb25zdGFudHMKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgIElXREcgS2V5IFJlZ2lzdGVyIEJpdE1hc2sKKyAqLworI2RlZmluZSBJV0RHX0tFWV9SRUxPQUQgMHgwMDAwQUFBQXUgLyohPCBJV0RHIFJlbG9hZCBDb3VudGVyIEVuYWJsZSAgICovCisjZGVmaW5lIElXREdfS0VZX0VOQUJMRSAweDAwMDBDQ0NDdSAvKiE8IElXREcgUGVyaXBoZXJhbCBFbmFibGUgICAgICAgKi8KKyNkZWZpbmUgSVdER19LRVlfV1JJVEVfQUNDRVNTX0VOQUJMRSBcCisgIDB4MDAwMDU1NTV1IC8qITwgSVdERyBLUiBXcml0ZSBBY2Nlc3MgRW5hYmxlICAqLworI2RlZmluZSBJV0RHX0tFWV9XUklURV9BQ0NFU1NfRElTQUJMRSBcCisgIDB4MDAwMDAwMDB1IC8qITwgSVdERyBLUiBXcml0ZSBBY2Nlc3MgRGlzYWJsZSAqLworCisvKioKKyAqIEB9CisgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSVdER19Qcml2YXRlX01hY3JvcyBJV0RHIFByaXZhdGUgTWFjcm9zCisgKiBAeworICovCisKKy8qKgorICogQGJyaWVmICBFbmFibGUgd3JpdGUgYWNjZXNzIHRvIElXREdfUFIsIElXREdfUkxSIGFuZCBJV0RHX1dJTlIgcmVnaXN0ZXJzLgorICogQHBhcmFtICBfX0hBTkRMRV9fICBJV0RHIGhhbmRsZQorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgSVdER19FTkFCTEVfV1JJVEVfQUNDRVNTKF9fSEFORExFX18pIFwKKyAgV1JJVEVfUkVHKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPktSLCBJV0RHX0tFWV9XUklURV9BQ0NFU1NfRU5BQkxFKQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSB3cml0ZSBhY2Nlc3MgdG8gSVdER19QUiwgSVdER19STFIgYW5kIElXREdfV0lOUiByZWdpc3RlcnMuCisgKiBAcGFyYW0gIF9fSEFORExFX18gIElXREcgaGFuZGxlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBJV0RHX0RJU0FCTEVfV1JJVEVfQUNDRVNTKF9fSEFORExFX18pIFwKKyAgV1JJVEVfUkVHKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPktSLCBJV0RHX0tFWV9XUklURV9BQ0NFU1NfRElTQUJMRSkKKworLyoqCisgKiBAYnJpZWYgIENoZWNrIElXREcgcHJlc2NhbGVyIHZhbHVlLgorICogQHBhcmFtICBfX1BSRVNDQUxFUl9fICBJV0RHIHByZXNjYWxlciB2YWx1ZQorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgSVNfSVdER19QUkVTQ0FMRVIoX19QUkVTQ0FMRVJfXykgICAgICBcCisgICgoKF9fUFJFU0NBTEVSX18pID09IElXREdfUFJFU0NBTEVSXzQpIHx8ICAgXAorICAgKChfX1BSRVNDQUxFUl9fKSA9PSBJV0RHX1BSRVNDQUxFUl84KSB8fCAgIFwKKyAgICgoX19QUkVTQ0FMRVJfXykgPT0gSVdER19QUkVTQ0FMRVJfMTYpIHx8ICBcCisgICAoKF9fUFJFU0NBTEVSX18pID09IElXREdfUFJFU0NBTEVSXzMyKSB8fCAgXAorICAgKChfX1BSRVNDQUxFUl9fKSA9PSBJV0RHX1BSRVNDQUxFUl82NCkgfHwgIFwKKyAgICgoX19QUkVTQ0FMRVJfXykgPT0gSVdER19QUkVTQ0FMRVJfMTI4KSB8fCBcCisgICAoKF9fUFJFU0NBTEVSX18pID09IElXREdfUFJFU0NBTEVSXzI1NikpCisKKy8qKgorICogQGJyaWVmICBDaGVjayBJV0RHIHJlbG9hZCB2YWx1ZS4KKyAqIEBwYXJhbSAgX19SRUxPQURfXyAgSVdERyByZWxvYWQgdmFsdWUKKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIElTX0lXREdfUkVMT0FEKF9fUkVMT0FEX18pICgoX19SRUxPQURfXykgPD0gSVdER19STFJfUkwpCisKKy8qKgorICogQGJyaWVmICBDaGVjayBJV0RHIHdpbmRvdyB2YWx1ZS4KKyAqIEBwYXJhbSAgX19XSU5ET1dfXyAgSVdERyB3aW5kb3cgdmFsdWUKKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIElTX0lXREdfV0lORE9XKF9fV0lORE9XX18pICgoX19XSU5ET1dfXykgPD0gSVdER19XSU5SX1dJTikKKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyRzR4eF9IQUxfSVdER19IICovCmRpZmYgLS1naXQgYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9oYWxfcGNkLmggYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9oYWxfcGNkLmgKaW5kZXggZGQ0ZDdlZS4uMGU5MGRjYyAxMDA2NDQKLS0tIGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfaGFsX3BjZC5oCisrKyBiL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9JbmMvc3RtMzJnNHh4X2hhbF9wY2QuaApAQCAtMSwxMDQ5ICsxLDEwNDEgQEAKLS8qKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBAZmlsZSAgICBzdG0zMmc0eHhfaGFsX3BjZC5oDQotICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0NCi0gKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBQQ0QgSEFMIG1vZHVsZS4NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQGF0dGVudGlvbg0KLSAqDQotICogQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KLSAqDQotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0ZXJtcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlDQotICogaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc29mdHdhcmUgY29tcG9uZW50Lg0KLSAqIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcyB3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLg0KLSAqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqLw0KLQ0KLS8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotI2lmbmRlZiBTVE0zMkc0eHhfSEFMX1BDRF9IDQotI2RlZmluZSBTVE0zMkc0eHhfSEFMX1BDRF9IDQotDQotI2lmZGVmIF9fY3BsdXNwbHVzDQotZXh0ZXJuICJDIiB7DQotI2VuZGlmDQotDQotLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaW5jbHVkZSAic3RtMzJnNHh4X2xsX3VzYi5oIg0KLQ0KLSNpZiBkZWZpbmVkKFVTQikNCi0NCi0vKiogQGFkZHRvZ3JvdXAgU1RNMzJHNHh4X0hBTF9Ecml2ZXINCi0gKiBAew0KLSAqLw0KLQ0KLS8qKiBAYWRkdG9ncm91cCBQQ0QNCi0gKiBAew0KLSAqLw0KLQ0KLS8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBkZWZncm91cCBQQ0RfRXhwb3J0ZWRfVHlwZXMgUENEIEV4cG9ydGVkIFR5cGVzDQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFBDRCBTdGF0ZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbg0KLSAqLw0KLXR5cGVkZWYgZW51bSB7DQotICBIQUxfUENEX1NUQVRFX1JFU0VUID0gMHgwMCwNCi0gIEhBTF9QQ0RfU1RBVEVfUkVBRFkgPSAweDAxLA0KLSAgSEFMX1BDRF9TVEFURV9FUlJPUiA9IDB4MDIsDQotICBIQUxfUENEX1NUQVRFX0JVU1kgPSAweDAzLA0KLSAgSEFMX1BDRF9TVEFURV9USU1FT1VUID0gMHgwNA0KLX0gUENEX1N0YXRlVHlwZURlZjsNCi0NCi0vKiBEZXZpY2UgTFBNIHN1c3BlbmQgc3RhdGUgKi8NCi10eXBlZGVmIGVudW0gew0KLSAgTFBNX0wwID0gMHgwMCwgLyogb24gKi8NCi0gIExQTV9MMSA9IDB4MDEsIC8qIExQTSBMMSBzbGVlcCAqLw0KLSAgTFBNX0wyID0gMHgwMiwgLyogc3VzcGVuZCAqLw0KLSAgTFBNX0wzID0gMHgwMywgLyogb2ZmICovDQotfSBQQ0RfTFBNX1N0YXRlVHlwZURlZjsNCi0NCi10eXBlZGVmIGVudW0gew0KLSAgUENEX0xQTV9MMF9BQ1RJVkUgPSAweDAwLCAvKiBvbiAqLw0KLSAgUENEX0xQTV9MMV9BQ1RJVkUgPSAweDAxLCAvKiBMUE0gTDEgc2xlZXAgKi8NCi19IFBDRF9MUE1fTXNnVHlwZURlZjsNCi0NCi10eXBlZGVmIGVudW0gew0KLSAgUENEX0JDRF9FUlJPUiA9IDB4RkYsDQotICBQQ0RfQkNEX0NPTlRBQ1RfREVURUNUSU9OID0gMHhGRSwNCi0gIFBDRF9CQ0RfU1REX0RPV05TVFJFQU1fUE9SVCA9IDB4RkQsDQotICBQQ0RfQkNEX0NIQVJHSU5HX0RPV05TVFJFQU1fUE9SVCA9IDB4RkMsDQotICBQQ0RfQkNEX0RFRElDQVRFRF9DSEFSR0lOR19QT1JUID0gMHhGQiwNCi0gIFBDRF9CQ0RfRElTQ09WRVJZX0NPTVBMRVRFRCA9IDB4MDAsDQotDQotfSBQQ0RfQkNEX01zZ1R5cGVEZWY7DQotDQotdHlwZWRlZiBVU0JfVHlwZURlZiBQQ0RfVHlwZURlZjsNCi10eXBlZGVmIFVTQl9DZmdUeXBlRGVmIFBDRF9Jbml0VHlwZURlZjsNCi10eXBlZGVmIFVTQl9FUFR5cGVEZWYgUENEX0VQVHlwZURlZjsNCi0NCi0vKioNCi0gKiBAYnJpZWYgIFBDRCBIYW5kbGUgU3RydWN0dXJlIGRlZmluaXRpb24NCi0gKi8NCi0jaWYgKFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkNCi10eXBlZGVmIHN0cnVjdCBfX1BDRF9IYW5kbGVUeXBlRGVmDQotI2Vsc2UNCi10eXBlZGVmIHN0cnVjdA0KLSNlbmRpZiAvKiBVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi17DQotICBQQ0RfVHlwZURlZiAqSW5zdGFuY2U7ICAgICAgICAgIC8qITwgUmVnaXN0ZXIgYmFzZSBhZGRyZXNzICAgICAgICAgICAgICovDQotICBQQ0RfSW5pdFR5cGVEZWYgSW5pdDsgICAgICAgICAgIC8qITwgUENEIHJlcXVpcmVkIHBhcmFtZXRlcnMgICAgICAgICAgICovDQotICBfX0lPIHVpbnQ4X3QgVVNCX0FkZHJlc3M7ICAgICAgIC8qITwgVVNCIEFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICovDQotICBQQ0RfRVBUeXBlRGVmIElOX2VwWzhdOyAgICAgICAgIC8qITwgSU4gZW5kcG9pbnQgcGFyYW1ldGVycyAgICAgICAgICAgICAqLw0KLSAgUENEX0VQVHlwZURlZiBPVVRfZXBbOF07ICAgICAgICAvKiE8IE9VVCBlbmRwb2ludCBwYXJhbWV0ZXJzICAgICAgICAgICAgKi8NCi0gIEhBTF9Mb2NrVHlwZURlZiBMb2NrOyAgICAgICAgICAgLyohPCBQQ0QgcGVyaXBoZXJhbCBzdGF0dXMgICAgICAgICAgICAgKi8NCi0gIF9fSU8gUENEX1N0YXRlVHlwZURlZiBTdGF0ZTsgICAgLyohPCBQQ0QgY29tbXVuaWNhdGlvbiBzdGF0ZSAgICAgICAgICAgKi8NCi0gIF9fSU8gdWludDMyX3QgRXJyb3JDb2RlOyAgICAgICAgLyohPCBQQ0QgRXJyb3IgY29kZSAgICAgICAgICAgICAgICAgICAgKi8NCi0gIHVpbnQzMl90IFNldHVwWzEyXTsgICAgICAgICAgICAgLyohPCBTZXR1cCBwYWNrZXQgYnVmZmVyICAgICAgICAgICAgICAgKi8NCi0gIFBDRF9MUE1fU3RhdGVUeXBlRGVmIExQTV9TdGF0ZTsgLyohPCBMUE0gU3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gIHVpbnQzMl90IEJFU0w7DQotDQotICB1aW50MzJfdCBscG1fYWN0aXZlOyAvKiE8IEVuYWJsZSBvciBkaXNhYmxlIHRoZSBMaW5rIFBvd2VyIE1hbmFnZW1lbnQgLg0KLSAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHNldCB0byBFTkFCTEUgb3IgRElTQUJMRSAgICAgICAgKi8NCi0NCi0gIHVpbnQzMl90DQotICAgICAgYmF0dGVyeV9jaGFyZ2luZ19hY3RpdmU7IC8qITwgRW5hYmxlIG9yIGRpc2FibGUgQmF0dGVyeSBjaGFyZ2luZy4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHNldCB0byBFTkFCTEUgb3IgRElTQUJMRSAqLw0KLSAgdm9pZCAqcERhdGE7ICAgICAgICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gdXBwZXIgc3RhY2sgSGFuZGxlciAqLw0KLQ0KLSNpZiAoVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQ0KLSAgdm9pZCAoKlNPRkNhbGxiYWNrKSgNCi0gICAgICBzdHJ1Y3QgX19QQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7IC8qITwgVVNCIE9URyBQQ0QgU09GIGNhbGxiYWNrICovDQotICB2b2lkICgqU2V0dXBTdGFnZUNhbGxiYWNrKShzdHJ1Y3QgX19QQ0RfSGFuZGxlVHlwZURlZiAqDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHBjZCk7IC8qITwgVVNCIE9URyBQQ0QgU2V0dXAgU3RhZ2UgY2FsbGJhY2sgKi8NCi0gIHZvaWQgKCpSZXNldENhbGxiYWNrKSgNCi0gICAgICBzdHJ1Y3QgX19QQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7IC8qITwgVVNCIE9URyBQQ0QgUmVzZXQgY2FsbGJhY2sgKi8NCi0gIHZvaWQgKCpTdXNwZW5kQ2FsbGJhY2spKA0KLSAgICAgIHN0cnVjdCBfX1BDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsgLyohPCBVU0IgT1RHIFBDRCBTdXNwZW5kIGNhbGxiYWNrICovDQotICB2b2lkICgqUmVzdW1lQ2FsbGJhY2spKA0KLSAgICAgIHN0cnVjdCBfX1BDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsgLyohPCBVU0IgT1RHIFBDRCBSZXN1bWUgY2FsbGJhY2sgKi8NCi0gIHZvaWQgKCpDb25uZWN0Q2FsbGJhY2spKA0KLSAgICAgIHN0cnVjdCBfX1BDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsgLyohPCBVU0IgT1RHIFBDRCBDb25uZWN0IGNhbGxiYWNrICovDQotICB2b2lkICgqRGlzY29ubmVjdENhbGxiYWNrKSgNCi0gICAgICBzdHJ1Y3QgX19QQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7IC8qITwgVVNCIE9URyBQQ0QgRGlzY29ubmVjdCBjYWxsYmFjayAqLw0KLQ0KLSAgdm9pZCAoKkRhdGFPdXRTdGFnZUNhbGxiYWNrKSgNCi0gICAgICBzdHJ1Y3QgX19QQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwNCi0gICAgICB1aW50OF90IGVwbnVtKTsgLyohPCBVU0IgT1RHIFBDRCBEYXRhIE9VVCBTdGFnZSBjYWxsYmFjayAgICAgKi8NCi0gIHZvaWQgKCpEYXRhSW5TdGFnZUNhbGxiYWNrKSgNCi0gICAgICBzdHJ1Y3QgX19QQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwNCi0gICAgICB1aW50OF90IGVwbnVtKTsgLyohPCBVU0IgT1RHIFBDRCBEYXRhIElOIFN0YWdlIGNhbGxiYWNrICAgICAgKi8NCi0gIHZvaWQgKCpJU09PVVRJbmNvbXBsZXRlQ2FsbGJhY2spKA0KLSAgICAgIHN0cnVjdCBfX1BDRF9IYW5kbGVUeXBlRGVmICpocGNkLA0KLSAgICAgIHVpbnQ4X3QgZXBudW0pOyAvKiE8IFVTQiBPVEcgUENEIElTTyBPVVQgSW5jb21wbGV0ZSBjYWxsYmFjayAqLw0KLSAgdm9pZCAoKklTT0lOSW5jb21wbGV0ZUNhbGxiYWNrKSgNCi0gICAgICBzdHJ1Y3QgX19QQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwNCi0gICAgICB1aW50OF90IGVwbnVtKTsgLyohPCBVU0IgT1RHIFBDRCBJU08gSU4gSW5jb21wbGV0ZSBjYWxsYmFjayAgKi8NCi0gIHZvaWQgKCpCQ0RDYWxsYmFjaykoc3RydWN0IF9fUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsDQotICAgICAgICAgICAgICAgICAgICAgIFBDRF9CQ0RfTXNnVHlwZURlZiBtc2cpOyAvKiE8IFVTQiBPVEcgUENEIEJDRCBjYWxsYmFjayAqLw0KLSAgdm9pZCAoKkxQTUNhbGxiYWNrKShzdHJ1Y3QgX19QQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwNCi0gICAgICAgICAgICAgICAgICAgICAgUENEX0xQTV9Nc2dUeXBlRGVmIG1zZyk7IC8qITwgVVNCIE9URyBQQ0QgTFBNIGNhbGxiYWNrICovDQotDQotICB2b2lkICgqTXNwSW5pdENhbGxiYWNrKSgNCi0gICAgICBzdHJ1Y3QgX19QQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7IC8qITwgVVNCIE9URyBQQ0QgTXNwIEluaXQgY2FsbGJhY2sgKi8NCi0gIHZvaWQgKCpNc3BEZUluaXRDYWxsYmFjaykoDQotICAgICAgc3RydWN0IF9fUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOyAvKiE8IFVTQiBPVEcgUENEIE1zcCBEZUluaXQgY2FsbGJhY2sgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLX0gUENEX0hhbmRsZVR5cGVEZWY7DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiBJbmNsdWRlIFBDRCBIQUwgRXh0ZW5kZWQgbW9kdWxlICovDQotI2luY2x1ZGUgInN0bTMyZzR4eF9oYWxfcGNkX2V4LmgiDQotDQotLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGRlZmdyb3VwIFBDRF9FeHBvcnRlZF9Db25zdGFudHMgUENEIEV4cG9ydGVkIENvbnN0YW50cw0KLSAqIEB7DQotICovDQotDQotLyoqIEBkZWZncm91cCBQQ0RfU3BlZWQgUENEIFNwZWVkDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFBDRF9TUEVFRF9GVUxMIFVTQkRfRlNfU1BFRUQNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUENEX1BIWV9Nb2R1bGUgUENEIFBIWSBNb2R1bGUNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgUENEX1BIWV9VTFBJIDFVDQotI2RlZmluZSBQQ0RfUEhZX0VNQkVEREVEIDJVDQotI2RlZmluZSBQQ0RfUEhZX1VUTUkgM1UNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUENEX0Vycm9yX0NvZGVfZGVmaW5pdGlvbiBQQ0QgRXJyb3IgQ29kZSBkZWZpbml0aW9uDQotICogQGJyaWVmICBQQ0QgRXJyb3IgQ29kZSBkZWZpbml0aW9uDQotICogQHsNCi0gKi8NCi0jaWYgKFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkNCi0jZGVmaW5lIEhBTF9QQ0RfRVJST1JfSU5WQUxJRF9DQUxMQkFDSyBcDQotICAoMHgwMDAwMDAxMFUpIC8qITwgSW52YWxpZCBDYWxsYmFjayBlcnJvciAgKi8NCi0jZW5kaWYgICAgICAgICAgLyogVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBkZWZncm91cCBQQ0RfRXhwb3J0ZWRfTWFjcm9zIFBDRCBFeHBvcnRlZCBNYWNyb3MNCi0gKiAgQGJyaWVmIG1hY3JvcyB0byBoYW5kbGUgaW50ZXJydXB0cyBhbmQgc3BlY2lmaWMgY2xvY2sgY29uZmlndXJhdGlvbnMNCi0gKiBAew0KLSAqLw0KLQ0KLSNkZWZpbmUgX19IQUxfUENEX0VOQUJMRShfX0hBTkRMRV9fKSBcDQotICAodm9pZClVU0JfRW5hYmxlR2xvYmFsSW50KChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpDQotI2RlZmluZSBfX0hBTF9QQ0RfRElTQUJMRShfX0hBTkRMRV9fKSBcDQotICAodm9pZClVU0JfRGlzYWJsZUdsb2JhbEludCgoX19IQU5ETEVfXyktPkluc3RhbmNlKQ0KLSNkZWZpbmUgX19IQUxfUENEX0dFVF9GTEFHKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgICAgICAgICAgICAgIFwNCi0gICgoVVNCX1JlYWRJbnRlcnJ1cHRzKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpICYgKF9fSU5URVJSVVBUX18pKSA9PSBcDQotICAgKF9fSU5URVJSVVBUX18pKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUENEX0NMRUFSX0ZMQUcoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgXA0KLSAgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1RSKSAmPSAodWludDE2X3QpKH4oX19JTlRFUlJVUFRfXykpKQ0KLQ0KLSNkZWZpbmUgX19IQUxfVVNCX1dBS0VVUF9FWFRJX0VOQUJMRV9JVCgpIEVYVEktPklNUjEgfD0gVVNCX1dBS0VVUF9FWFRJX0xJTkUNCi0jZGVmaW5lIF9fSEFMX1VTQl9XQUtFVVBfRVhUSV9ESVNBQkxFX0lUKCkgRVhUSS0+SU1SMSAmPSB+KFVTQl9XQUtFVVBfRVhUSV9MSU5FKQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGFkZHRvZ3JvdXAgUENEX0V4cG9ydGVkX0Z1bmN0aW9ucyBQQ0QgRXhwb3J0ZWQgRnVuY3Rpb25zDQotICogQHsNCi0gKi8NCi0NCi0vKiBJbml0aWFsaXphdGlvbi9kZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qKiBAYWRkdG9ncm91cCBQQ0RfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQNCi0gKiBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMNCi0gKiBAew0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfSW5pdChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9EZUluaXQoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOw0KLXZvaWQgSEFMX1BDRF9Nc3BJbml0KFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsNCi12b2lkIEhBTF9QQ0RfTXNwRGVJbml0KFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsNCi0NCi0jaWYgKFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkNCi0vKiogQGRlZmdyb3VwIEhBTF9QQ0RfQ2FsbGJhY2tfSURfZW51bWVyYXRpb25fZGVmaW5pdGlvbiBIQUwgVVNCIE9URyBQQ0QNCi0gKiBDYWxsYmFjayBJRCBlbnVtZXJhdGlvbiBkZWZpbml0aW9uDQotICogQGJyaWVmICBIQUwgVVNCIE9URyBQQ0QgQ2FsbGJhY2sgSUQgZW51bWVyYXRpb24gZGVmaW5pdGlvbg0KLSAqIEB7DQotICovDQotdHlwZWRlZiBlbnVtIHsNCi0gIEhBTF9QQ0RfU09GX0NCX0lEID0gMHgwMSwgICAgICAgIC8qITwgVVNCIFBDRCBTT0YgY2FsbGJhY2sgSUQgICAgICAgICAgKi8NCi0gIEhBTF9QQ0RfU0VUVVBTVEFHRV9DQl9JRCA9IDB4MDIsIC8qITwgVVNCIFBDRCBTZXR1cCBTdGFnZSBjYWxsYmFjayBJRCAgKi8NCi0gIEhBTF9QQ0RfUkVTRVRfQ0JfSUQgPSAweDAzLCAgICAgIC8qITwgVVNCIFBDRCBSZXNldCBjYWxsYmFjayBJRCAgICAgICAgKi8NCi0gIEhBTF9QQ0RfU1VTUEVORF9DQl9JRCA9IDB4MDQsICAgIC8qITwgVVNCIFBDRCBTdXNwZW5kIGNhbGxiYWNrIElEICAgICAgKi8NCi0gIEhBTF9QQ0RfUkVTVU1FX0NCX0lEID0gMHgwNSwgICAgIC8qITwgVVNCIFBDRCBSZXN1bWUgY2FsbGJhY2sgSUQgICAgICAgKi8NCi0gIEhBTF9QQ0RfQ09OTkVDVF9DQl9JRCA9IDB4MDYsICAgIC8qITwgVVNCIFBDRCBDb25uZWN0IGNhbGxiYWNrIElEICAgICAgKi8NCi0gIEhBTF9QQ0RfRElTQ09OTkVDVF9DQl9JRCA9IDB4MDcsIC8qITwgVVNCIFBDRCBEaXNjb25uZWN0IGNhbGxiYWNrIElEICAgKi8NCi0NCi0gIEhBTF9QQ0RfTVNQSU5JVF9DQl9JRCA9IDB4MDgsICAvKiE8IFVTQiBQQ0QgTXNwSW5pdCBjYWxsYmFjayBJRCAgICAgICovDQotICBIQUxfUENEX01TUERFSU5JVF9DQl9JRCA9IDB4MDkgLyohPCBVU0IgUENEIE1zcERlSW5pdCBjYWxsYmFjayBJRCAgICAqLw0KLQ0KLX0gSEFMX1BDRF9DYWxsYmFja0lEVHlwZURlZjsNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgSEFMX1BDRF9DYWxsYmFja19wb2ludGVyX2RlZmluaXRpb24gSEFMIFVTQiBPVEcgUENEIENhbGxiYWNrDQotICogcG9pbnRlciBkZWZpbml0aW9uDQotICogQGJyaWVmICBIQUwgVVNCIE9URyBQQ0QgQ2FsbGJhY2sgcG9pbnRlciBkZWZpbml0aW9uDQotICogQHsNCi0gKi8NCi0NCi10eXBlZGVmIHZvaWQgKCpwUENEX0NhbGxiYWNrVHlwZURlZikoDQotICAgIFBDRF9IYW5kbGVUeXBlRGVmDQotICAgICAgICAqaHBjZCk7IC8qITwgcG9pbnRlciB0byBhIGNvbW1vbiBVU0IgT1RHIFBDRCBjYWxsYmFjayBmdW5jdGlvbiAgKi8NCi10eXBlZGVmIHZvaWQgKCpwUENEX0RhdGFPdXRTdGFnZUNhbGxiYWNrVHlwZURlZikoDQotICAgIFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLA0KLSAgICB1aW50OF90IGVwbnVtKTsgLyohPCBwb2ludGVyIHRvIFVTQiBPVEcgUENEIERhdGEgT1VUIFN0YWdlIGNhbGxiYWNrICAgICAqLw0KLXR5cGVkZWYgdm9pZCAoKnBQQ0RfRGF0YUluU3RhZ2VDYWxsYmFja1R5cGVEZWYpKA0KLSAgICBQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwNCi0gICAgdWludDhfdCBlcG51bSk7IC8qITwgcG9pbnRlciB0byBVU0IgT1RHIFBDRCBEYXRhIElOIFN0YWdlIGNhbGxiYWNrICAgICAgKi8NCi10eXBlZGVmIHZvaWQgKCpwUENEX0lzb091dEluY3BsdENhbGxiYWNrVHlwZURlZikoDQotICAgIFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLA0KLSAgICB1aW50OF90IGVwbnVtKTsgLyohPCBwb2ludGVyIHRvIFVTQiBPVEcgUENEIElTTyBPVVQgSW5jb21wbGV0ZSBjYWxsYmFjayAqLw0KLXR5cGVkZWYgdm9pZCAoKnBQQ0RfSXNvSW5JbmNwbHRDYWxsYmFja1R5cGVEZWYpKA0KLSAgICBQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwNCi0gICAgdWludDhfdCBlcG51bSk7IC8qITwgcG9pbnRlciB0byBVU0IgT1RHIFBDRCBJU08gSU4gSW5jb21wbGV0ZSBjYWxsYmFjayAgKi8NCi10eXBlZGVmIHZvaWQgKCpwUENEX0xwbUNhbGxiYWNrVHlwZURlZikoDQotICAgIFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLA0KLSAgICBQQ0RfTFBNX01zZ1R5cGVEZWYgbXNnKTsgLyohPCBwb2ludGVyIHRvIFVTQiBPVEcgUENEIExQTSBjYWxsYmFjayAqLw0KLXR5cGVkZWYgdm9pZCAoKnBQQ0RfQmNkQ2FsbGJhY2tUeXBlRGVmKSgNCi0gICAgUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsDQotICAgIFBDRF9CQ0RfTXNnVHlwZURlZiBtc2cpOyAvKiE8IHBvaW50ZXIgdG8gVVNCIE9URyBQQ0QgQkNEIGNhbGxiYWNrICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1JlZ2lzdGVyQ2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9QQ0RfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBDRF9DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKTsNCi0NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1VuUmVnaXN0ZXJDYWxsYmFjaygNCi0gICAgUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIEhBTF9QQ0RfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCk7DQotDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9SZWdpc3RlckRhdGFPdXRTdGFnZUNhbGxiYWNrKA0KLSAgICBQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgcFBDRF9EYXRhT3V0U3RhZ2VDYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKTsNCi0NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1VuUmVnaXN0ZXJEYXRhT3V0U3RhZ2VDYWxsYmFjaygNCi0gICAgUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOw0KLQ0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfUmVnaXN0ZXJEYXRhSW5TdGFnZUNhbGxiYWNrKA0KLSAgICBQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgcFBDRF9EYXRhSW5TdGFnZUNhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spOw0KLQ0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfVW5SZWdpc3RlckRhdGFJblN0YWdlQ2FsbGJhY2soDQotICAgIFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsNCi0NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1JlZ2lzdGVySXNvT3V0SW5jcGx0Q2FsbGJhY2soDQotICAgIFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCBwUENEX0lzb091dEluY3BsdENhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spOw0KLQ0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfVW5SZWdpc3Rlcklzb091dEluY3BsdENhbGxiYWNrKA0KLSAgICBQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7DQotDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9SZWdpc3Rlcklzb0luSW5jcGx0Q2FsbGJhY2soDQotICAgIFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCBwUENEX0lzb0luSW5jcGx0Q2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjayk7DQotDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9VblJlZ2lzdGVySXNvSW5JbmNwbHRDYWxsYmFjaygNCi0gICAgUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOw0KLQ0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfUmVnaXN0ZXJCY2RDYWxsYmFjaygNCi0gICAgUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHBQQ0RfQmNkQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjayk7DQotDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9VblJlZ2lzdGVyQmNkQ2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOw0KLQ0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfUmVnaXN0ZXJMcG1DYWxsYmFjaygNCi0gICAgUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHBQQ0RfTHBtQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjayk7DQotDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9VblJlZ2lzdGVyTHBtQ2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOw0KLSNlbmRpZiAvKiBVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIEkvTyBvcGVyYXRpb24gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyogTm9uLUJsb2NraW5nIG1vZGU6IEludGVycnVwdCAqLw0KLS8qKiBAYWRkdG9ncm91cCBQQ0RfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBJbnB1dCBhbmQgT3V0cHV0IG9wZXJhdGlvbg0KLSAqIGZ1bmN0aW9ucw0KLSAqIEB7DQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9TdGFydChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9TdG9wKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsNCi12b2lkIEhBTF9QQ0RfSVJRSGFuZGxlcihQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7DQotDQotdm9pZCBIQUxfUENEX1NPRkNhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsNCi12b2lkIEhBTF9QQ0RfU2V0dXBTdGFnZUNhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsNCi12b2lkIEhBTF9QQ0RfUmVzZXRDYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7DQotdm9pZCBIQUxfUENEX1N1c3BlbmRDYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7DQotdm9pZCBIQUxfUENEX1Jlc3VtZUNhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsNCi12b2lkIEhBTF9QQ0RfQ29ubmVjdENhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsNCi12b2lkIEhBTF9QQ0RfRGlzY29ubmVjdENhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsNCi0NCi12b2lkIEhBTF9QQ0RfRGF0YU91dFN0YWdlQ2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHVpbnQ4X3QgZXBudW0pOw0KLXZvaWQgSEFMX1BDRF9EYXRhSW5TdGFnZUNhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCB1aW50OF90IGVwbnVtKTsNCi12b2lkIEhBTF9QQ0RfSVNPT1VUSW5jb21wbGV0ZUNhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCB1aW50OF90IGVwbnVtKTsNCi12b2lkIEhBTF9QQ0RfSVNPSU5JbmNvbXBsZXRlQ2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHVpbnQ4X3QgZXBudW0pOw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKiogQGFkZHRvZ3JvdXAgUENEX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucw0KLSAqIEB7DQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9EZXZDb25uZWN0KFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX0RldkRpc2Nvbm5lY3QoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfU2V0QWRkcmVzcyhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDhfdCBhZGRyZXNzKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX0VQX09wZW4oUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHVpbnQ4X3QgZXBfYWRkciwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgZXBfbXBzLCB1aW50OF90IGVwX3R5cGUpOw0KLQ0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfRVBfQ2xvc2UoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHVpbnQ4X3QgZXBfYWRkcik7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9FUF9SZWNlaXZlKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCB1aW50OF90IGVwX2FkZHIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IGxlbik7DQotDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9FUF9UcmFuc21pdChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDhfdCBlcF9hZGRyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcEJ1ZiwgdWludDMyX3QgbGVuKTsNCi0NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX0VQX1NldFN0YWxsKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCB1aW50OF90IGVwX2FkZHIpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfRVBfQ2xyU3RhbGwoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHVpbnQ4X3QgZXBfYWRkcik7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9FUF9GbHVzaChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDhfdCBlcF9hZGRyKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX0FjdGl2YXRlUmVtb3RlV2FrZXVwKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX0RlQWN0aXZhdGVSZW1vdGVXYWtldXAoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOw0KLXVpbnQzMl90IEhBTF9QQ0RfRVBfR2V0UnhDb3VudChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDhfdCBlcF9hZGRyKTsNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyoqIEBhZGR0b2dyb3VwIFBDRF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA0IFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zDQotICogQHsNCi0gKi8NCi1QQ0RfU3RhdGVUeXBlRGVmIEhBTF9QQ0RfR2V0U3RhdGUoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgUENEX1ByaXZhdGVfQ29uc3RhbnRzIFBDRCBQcml2YXRlIENvbnN0YW50cw0KLSAqIEB7DQotICovDQotLyoqIEBkZWZncm91cCBVU0JfRVhUSV9MaW5lX0ludGVycnVwdCBVU0IgRVhUSSBsaW5lIGludGVycnVwdA0KLSAqIEB7DQotICovDQotDQotI2RlZmluZSBVU0JfV0FLRVVQX0VYVElfTElORSBcDQotICAoMHgxVSA8PCAxOCkgLyohPCBVU0IgRlMgRVhUSSBMaW5lIFdha2VVcCBJbnRlcnJ1cHQgKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUENEX0VQMF9NUFMgUENEIEVQMCBNUFMNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgUENEX0VQME1QU182NCBFUF9NUFNfNjQNCi0jZGVmaW5lIFBDRF9FUDBNUFNfMzIgRVBfTVBTXzMyDQotI2RlZmluZSBQQ0RfRVAwTVBTXzE2IEVQX01QU18xNg0KLSNkZWZpbmUgUENEX0VQME1QU18wOCBFUF9NUFNfOA0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBQQ0RfRU5EUCBQQ0QgRU5EUA0KLSAqIEB7DQotICovDQotI2RlZmluZSBQQ0RfRU5EUDAgMFUNCi0jZGVmaW5lIFBDRF9FTkRQMSAxVQ0KLSNkZWZpbmUgUENEX0VORFAyIDJVDQotI2RlZmluZSBQQ0RfRU5EUDMgM1UNCi0jZGVmaW5lIFBDRF9FTkRQNCA0VQ0KLSNkZWZpbmUgUENEX0VORFA1IDVVDQotI2RlZmluZSBQQ0RfRU5EUDYgNlUNCi0jZGVmaW5lIFBDRF9FTkRQNyA3VQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBQQ0RfRU5EUF9LaW5kIFBDRCBFbmRwb2ludCBLaW5kDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFBDRF9TTkdfQlVGIDBVDQotI2RlZmluZSBQQ0RfREJMX0JVRiAxVQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgUENEX1ByaXZhdGVfTWFjcm9zIFBDRCBQcml2YXRlIE1hY3Jvcw0KLSAqIEB7DQotICovDQotDQotLyoqKioqKioqKioqKioqKioqKioqICBCaXQgZGVmaW5pdGlvbiBmb3IgVVNCX0NPVU5Ubl9SWCByZWdpc3RlciAgKioqKioqKioqKioqKi8NCi0jZGVmaW5lIFVTQl9DTlRSWF9OQkxLX01TSyAoMHgxRlUgPDwgMTApDQotI2RlZmluZSBVU0JfQ05UUlhfQkxTSVpFICgweDFVIDw8IDE1KQ0KLQ0KLS8qIFNldEVORFBPSU5UICovDQotI2RlZmluZSBQQ0RfU0VUX0VORFBPSU5UKFVTQngsIGJFcE51bSwgd1JlZ1ZhbHVlKSBcDQotICAoKihfX0lPIHVpbnQxNl90ICopKCYoVVNCeCktPkVQMFIgKyAoKGJFcE51bSkgKiAyVSkpID0gKHVpbnQxNl90KSh3UmVnVmFsdWUpKQ0KLQ0KLS8qIEdldEVORFBPSU5UICovDQotI2RlZmluZSBQQ0RfR0VUX0VORFBPSU5UKFVTQngsIGJFcE51bSkgXA0KLSAgKCooX19JTyB1aW50MTZfdCAqKSgmKFVTQngpLT5FUDBSICsgKChiRXBOdW0pICogMlUpKSkNCi0NCi0vKiBFTkRQT0lOVCB0cmFuc2ZlciAqLw0KLSNkZWZpbmUgVVNCX0VQMFN0YXJ0WGZlciBVU0JfRVBTdGFydFhmZXINCi0NCi0vKioNCi0gKiBAYnJpZWYgIHNldHMgdGhlIHR5cGUgaW4gdGhlIGVuZHBvaW50IHJlZ2lzdGVyKGJpdHMgRVBfVFlQRVsxOjBdKQ0KLSAqIEBwYXJhbSAgVVNCeCBVU0IgcGVyaXBoZXJhbCBpbnN0YW5jZSByZWdpc3RlciBhZGRyZXNzLg0KLSAqIEBwYXJhbSAgYkVwTnVtIEVuZHBvaW50IE51bWJlci4NCi0gKiBAcGFyYW0gIHdUeXBlIEVuZHBvaW50IFR5cGUuDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBQQ0RfU0VUX0VQVFlQRShVU0J4LCBiRXBOdW0sIHdUeXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChQQ0RfU0VUX0VORFBPSU5UKChVU0J4KSwgKGJFcE51bSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgKChQQ0RfR0VUX0VORFBPSU5UKChVU0J4KSwgKGJFcE51bSkpICYgVVNCX0VQX1RfTUFTSykgfCBcDQotICAgICAgICAgICAgICAgICAgICAgKHdUeXBlKSB8IFVTQl9FUF9DVFJfVFggfCBVU0JfRVBfQ1RSX1JYKSkpDQotDQotLyoqDQotICogQGJyaWVmICBnZXRzIHRoZSB0eXBlIGluIHRoZSBlbmRwb2ludCByZWdpc3RlcihiaXRzIEVQX1RZUEVbMTowXSkNCi0gKiBAcGFyYW0gIFVTQnggVVNCIHBlcmlwaGVyYWwgaW5zdGFuY2UgcmVnaXN0ZXIgYWRkcmVzcy4NCi0gKiBAcGFyYW0gIGJFcE51bSBFbmRwb2ludCBOdW1iZXIuDQotICogQHJldHZhbCBFbmRwb2ludCBUeXBlDQotICovDQotI2RlZmluZSBQQ0RfR0VUX0VQVFlQRShVU0J4LCBiRXBOdW0pIFwNCi0gIChQQ0RfR0VUX0VORFBPSU5UKChVU0J4KSwgKGJFcE51bSkpICYgVVNCX0VQX1RfRklFTEQpDQotDQotLyoqDQotICogQGJyaWVmIGZyZWUgYnVmZmVyIHVzZWQgZnJvbSB0aGUgYXBwbGljYXRpb24gcmVhbGl6aW5nIGl0IHRvIHRoZSBsaW5lDQotICogICAgICAgICB0b2dnbGVzIGJpdCBTV19CVUYgaW4gdGhlIGRvdWJsZSBidWZmZXJlZCBlbmRwb2ludCByZWdpc3Rlcg0KLSAqIEBwYXJhbSBVU0J4IFVTQiBkZXZpY2UuDQotICogQHBhcmFtICAgYkVwTnVtLCBiRGlyDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBQQ0RfRlJFRV9VU0VSX0JVRkZFUihVU0J4LCBiRXBOdW0sIGJEaXIpIFwNCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBpZiAoKGJEaXIpID09IDBVKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgLyogT1VUIGRvdWJsZSBidWZmZXJlZCBlbmRwb2ludCAqLyAgICAgICAgIFwNCi0gICAgICBQQ0RfVFhfRFRPRygoVVNCeCksIChiRXBOdW0pKTsgICAgICAgICAgICAgXA0KLSAgICB9IGVsc2UgaWYgKChiRGlyKSA9PSAxVSkgeyAgICAgICAgICAgICAgICAgICBcDQotICAgICAgLyogSU4gZG91YmxlIGJ1ZmZlcmVkIGVuZHBvaW50ICovICAgICAgICAgIFwNCi0gICAgICBQQ0RfUlhfRFRPRygoVVNCeCksIChiRXBOdW0pKTsgICAgICAgICAgICAgXA0KLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICB9IHdoaWxlICgwKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgc2V0cyB0aGUgc3RhdHVzIGZvciB0eCB0cmFuc2ZlciAoYml0cyBTVEFUX1RYWzE6MF0pLg0KLSAqIEBwYXJhbSAgVVNCeCBVU0IgcGVyaXBoZXJhbCBpbnN0YW5jZSByZWdpc3RlciBhZGRyZXNzLg0KLSAqIEBwYXJhbSAgYkVwTnVtIEVuZHBvaW50IE51bWJlci4NCi0gKiBAcGFyYW0gIHdTdGF0ZSBuZXcgc3RhdGUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIFBDRF9TRVRfRVBfVFhfU1RBVFVTKFVTQngsIGJFcE51bSwgd1N0YXRlKSAgICAgICAgICAgICAgICAgICAgIFwNCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgdWludDE2X3QgX3dSZWdWYWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgX3dSZWdWYWwgPSBQQ0RfR0VUX0VORFBPSU5UKChVU0J4KSwgKGJFcE51bSkpICYgVVNCX0VQVFhfRFRPR01BU0s7IFwNCi0gICAgLyogdG9nZ2xlIGZpcnN0IGJpdCA/ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgaWYgKChVU0JfRVBUWF9EVE9HMSAmICh3U3RhdGUpKSAhPSAwVSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICBfd1JlZ1ZhbCBePSBVU0JfRVBUWF9EVE9HMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgLyogdG9nZ2xlIHNlY29uZCBiaXQgPyAgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgaWYgKChVU0JfRVBUWF9EVE9HMiAmICh3U3RhdGUpKSAhPSAwVSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICBfd1JlZ1ZhbCBePSBVU0JfRVBUWF9EVE9HMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgUENEX1NFVF9FTkRQT0lOVCgoVVNCeCksIChiRXBOdW0pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAoX3dSZWdWYWwgfCBVU0JfRVBfQ1RSX1JYIHwgVVNCX0VQX0NUUl9UWCkpOyAgICAgIFwNCi0gIH0gd2hpbGUgKDApIC8qIFBDRF9TRVRfRVBfVFhfU1RBVFVTICovDQotDQotLyoqDQotICogQGJyaWVmICBzZXRzIHRoZSBzdGF0dXMgZm9yIHJ4IHRyYW5zZmVyIChiaXRzIFNUQVRfVFhbMTowXSkNCi0gKiBAcGFyYW0gIFVTQnggVVNCIHBlcmlwaGVyYWwgaW5zdGFuY2UgcmVnaXN0ZXIgYWRkcmVzcy4NCi0gKiBAcGFyYW0gIGJFcE51bSBFbmRwb2ludCBOdW1iZXIuDQotICogQHBhcmFtICB3U3RhdGUgbmV3IHN0YXRlDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBQQ0RfU0VUX0VQX1JYX1NUQVRVUyhVU0J4LCBiRXBOdW0sIHdTdGF0ZSkgICAgICAgICAgICAgICAgICAgICBcDQotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIHVpbnQxNl90IF93UmVnVmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIF93UmVnVmFsID0gUENEX0dFVF9FTkRQT0lOVCgoVVNCeCksIChiRXBOdW0pKSAmIFVTQl9FUFJYX0RUT0dNQVNLOyBcDQotICAgIC8qIHRvZ2dsZSBmaXJzdCBiaXQgPyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIGlmICgoVVNCX0VQUlhfRFRPRzEgJiAod1N0YXRlKSkgIT0gMFUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgX3dSZWdWYWwgXj0gVVNCX0VQUlhfRFRPRzE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIC8qIHRvZ2dsZSBzZWNvbmQgYml0ID8gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIGlmICgoVVNCX0VQUlhfRFRPRzIgJiAod1N0YXRlKSkgIT0gMFUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgX3dSZWdWYWwgXj0gVVNCX0VQUlhfRFRPRzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIFBDRF9TRVRfRU5EUE9JTlQoKFVTQngpLCAoYkVwTnVtKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgKF93UmVnVmFsIHwgVVNCX0VQX0NUUl9SWCB8IFVTQl9FUF9DVFJfVFgpKTsgICAgICBcDQotICB9IHdoaWxlICgwKSAvKiBQQ0RfU0VUX0VQX1JYX1NUQVRVUyAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgc2V0cyB0aGUgc3RhdHVzIGZvciByeCAmIHR4IChiaXRzIFNUQVRfVFhbMTowXSAmIFNUQVRfUlhbMTowXSkNCi0gKiBAcGFyYW0gIFVTQnggVVNCIHBlcmlwaGVyYWwgaW5zdGFuY2UgcmVnaXN0ZXIgYWRkcmVzcy4NCi0gKiBAcGFyYW0gIGJFcE51bSBFbmRwb2ludCBOdW1iZXIuDQotICogQHBhcmFtICB3U3RhdGVyeCBuZXcgc3RhdGUuDQotICogQHBhcmFtICB3U3RhdGV0eCBuZXcgc3RhdGUuDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBQQ0RfU0VUX0VQX1RYUlhfU1RBVFVTKFVTQngsIGJFcE51bSwgd1N0YXRlcngsIHdTdGF0ZXR4KSAgXA0KLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgdWludDE2X3QgX3dSZWdWYWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBfd1JlZ1ZhbCA9IFBDRF9HRVRfRU5EUE9JTlQoKFVTQngpLCAoYkVwTnVtKSkgJiAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgICAgICAoVVNCX0VQUlhfRFRPR01BU0sgfCBVU0JfRVBUWF9TVEFUKTsgICAgICAgICAgICAgICBcDQotICAgIC8qIHRvZ2dsZSBmaXJzdCBiaXQgPyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBpZiAoKFVTQl9FUFJYX0RUT0cxICYgKHdTdGF0ZXJ4KSkgIT0gMFUpIHsgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICBfd1JlZ1ZhbCBePSBVU0JfRVBSWF9EVE9HMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAvKiB0b2dnbGUgc2Vjb25kIGJpdCA/ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgaWYgKChVU0JfRVBSWF9EVE9HMiAmICh3U3RhdGVyeCkpICE9IDBVKSB7ICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgX3dSZWdWYWwgXj0gVVNCX0VQUlhfRFRPRzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgLyogdG9nZ2xlIGZpcnN0IGJpdCA/ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIGlmICgoVVNCX0VQVFhfRFRPRzEgJiAod1N0YXRldHgpKSAhPSAwVSkgeyAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgIF93UmVnVmFsIF49IFVTQl9FUFRYX0RUT0cxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIC8qIHRvZ2dsZSBzZWNvbmQgYml0ID8gICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBpZiAoKFVTQl9FUFRYX0RUT0cyICYgKHdTdGF0ZXR4KSkgIT0gMFUpIHsgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICBfd1JlZ1ZhbCBePSBVU0JfRVBUWF9EVE9HMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgUENEX1NFVF9FTkRQT0lOVCgoVVNCeCksIChiRXBOdW0pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgKF93UmVnVmFsIHwgVVNCX0VQX0NUUl9SWCB8IFVTQl9FUF9DVFJfVFgpKTsgXA0KLSAgfSB3aGlsZSAoMCkgLyogUENEX1NFVF9FUF9UWFJYX1NUQVRVUyAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgZ2V0cyB0aGUgc3RhdHVzIGZvciB0eC9yeCB0cmFuc2ZlciAoYml0cyBTVEFUX1RYWzE6MF0NCi0gKiAgICAgICAgIC9TVEFUX1JYWzE6MF0pDQotICogQHBhcmFtICBVU0J4IFVTQiBwZXJpcGhlcmFsIGluc3RhbmNlIHJlZ2lzdGVyIGFkZHJlc3MuDQotICogQHBhcmFtICBiRXBOdW0gRW5kcG9pbnQgTnVtYmVyLg0KLSAqIEByZXR2YWwgc3RhdHVzDQotICovDQotI2RlZmluZSBQQ0RfR0VUX0VQX1RYX1NUQVRVUyhVU0J4LCBiRXBOdW0pIFwNCi0gICgodWludDE2X3QpUENEX0dFVF9FTkRQT0lOVCgoVVNCeCksIChiRXBOdW0pKSAmIFVTQl9FUFRYX1NUQVQpDQotI2RlZmluZSBQQ0RfR0VUX0VQX1JYX1NUQVRVUyhVU0J4LCBiRXBOdW0pIFwNCi0gICgodWludDE2X3QpUENEX0dFVF9FTkRQT0lOVCgoVVNCeCksIChiRXBOdW0pKSAmIFVTQl9FUFJYX1NUQVQpDQotDQotLyoqDQotICogQGJyaWVmICBzZXRzIGRpcmVjdGx5IHRoZSBWQUxJRCB0eC9yeC1zdGF0dXMgaW50byB0aGUgZW5kcG9pbnQgcmVnaXN0ZXINCi0gKiBAcGFyYW0gIFVTQnggVVNCIHBlcmlwaGVyYWwgaW5zdGFuY2UgcmVnaXN0ZXIgYWRkcmVzcy4NCi0gKiBAcGFyYW0gIGJFcE51bSBFbmRwb2ludCBOdW1iZXIuDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBQQ0RfU0VUX0VQX1RYX1ZBTElEKFVTQngsIGJFcE51bSkgXA0KLSAgKFBDRF9TRVRfRVBfVFhfU1RBVFVTKChVU0J4KSwgKGJFcE51bSksIFVTQl9FUF9UWF9WQUxJRCkpDQotI2RlZmluZSBQQ0RfU0VUX0VQX1JYX1ZBTElEKFVTQngsIGJFcE51bSkgXA0KLSAgKFBDRF9TRVRfRVBfUlhfU1RBVFVTKChVU0J4KSwgKGJFcE51bSksIFVTQl9FUF9SWF9WQUxJRCkpDQotDQotLyoqDQotICogQGJyaWVmICBjaGVja3Mgc3RhbGwgY29uZGl0aW9uIGluIGFuIGVuZHBvaW50Lg0KLSAqIEBwYXJhbSAgVVNCeCBVU0IgcGVyaXBoZXJhbCBpbnN0YW5jZSByZWdpc3RlciBhZGRyZXNzLg0KLSAqIEBwYXJhbSAgYkVwTnVtIEVuZHBvaW50IE51bWJlci4NCi0gKiBAcmV0dmFsIFRSVUUgPSBlbmRwb2ludCBpbiBzdGFsbCBjb25kaXRpb24uDQotICovDQotI2RlZmluZSBQQ0RfR0VUX0VQX1RYX1NUQUxMX1NUQVRVUyhVU0J4LCBiRXBOdW0pIFwNCi0gIChQQ0RfR0VUX0VQX1RYX1NUQVRVUygoVVNCeCksIChiRXBOdW0pKSA9PSBVU0JfRVBfVFhfU1RBTEwpDQotI2RlZmluZSBQQ0RfR0VUX0VQX1JYX1NUQUxMX1NUQVRVUyhVU0J4LCBiRXBOdW0pIFwNCi0gIChQQ0RfR0VUX0VQX1JYX1NUQVRVUygoVVNCeCksIChiRXBOdW0pKSA9PSBVU0JfRVBfUlhfU1RBTEwpDQotDQotLyoqDQotICogQGJyaWVmICBzZXQgJiBjbGVhciBFUF9LSU5EIGJpdC4NCi0gKiBAcGFyYW0gIFVTQnggVVNCIHBlcmlwaGVyYWwgaW5zdGFuY2UgcmVnaXN0ZXIgYWRkcmVzcy4NCi0gKiBAcGFyYW0gIGJFcE51bSBFbmRwb2ludCBOdW1iZXIuDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBQQ0RfU0VUX0VQX0tJTkQoVVNCeCwgYkVwTnVtKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIHVpbnQxNl90IF93UmVnVmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIF93UmVnVmFsID0gUENEX0dFVF9FTkRQT0lOVCgoVVNCeCksIChiRXBOdW0pKSAmIFVTQl9FUFJFR19NQVNLOyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIFBDRF9TRVRfRU5EUE9JTlQoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICAoVVNCeCksIChiRXBOdW0pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICAoX3dSZWdWYWwgfCBVU0JfRVBfQ1RSX1JYIHwgVVNCX0VQX0NUUl9UWCB8IFVTQl9FUF9LSU5EKSk7ICBcDQotICB9IHdoaWxlICgwKSAvKiBQQ0RfU0VUX0VQX0tJTkQgKi8NCi0NCi0jZGVmaW5lIFBDRF9DTEVBUl9FUF9LSU5EKFVTQngsIGJFcE51bSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICB1aW50MTZfdCBfd1JlZ1ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIF93UmVnVmFsID0gUENEX0dFVF9FTkRQT0lOVCgoVVNCeCksIChiRXBOdW0pKSAmIFVTQl9FUEtJTkRfTUFTSzsgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgUENEX1NFVF9FTkRQT0lOVCgoVVNCeCksIChiRXBOdW0pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgKF93UmVnVmFsIHwgVVNCX0VQX0NUUl9SWCB8IFVTQl9FUF9DVFJfVFgpKTsgICAgXA0KLSAgfSB3aGlsZSAoMCkgLyogUENEX0NMRUFSX0VQX0tJTkQgKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldHMvY2xlYXJzIGRpcmVjdGx5IFNUQVRVU19PVVQgYml0IGluIHRoZSBlbmRwb2ludCByZWdpc3Rlci4NCi0gKiBAcGFyYW0gIFVTQnggVVNCIHBlcmlwaGVyYWwgaW5zdGFuY2UgcmVnaXN0ZXIgYWRkcmVzcy4NCi0gKiBAcGFyYW0gIGJFcE51bSBFbmRwb2ludCBOdW1iZXIuDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBQQ0RfU0VUX09VVF9TVEFUVVMoVVNCeCwgYkVwTnVtKSBQQ0RfU0VUX0VQX0tJTkQoKFVTQngpLCAoYkVwTnVtKSkNCi0jZGVmaW5lIFBDRF9DTEVBUl9PVVRfU1RBVFVTKFVTQngsIGJFcE51bSkgUENEX0NMRUFSX0VQX0tJTkQoKFVTQngpLCAoYkVwTnVtKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldHMvY2xlYXJzIGRpcmVjdGx5IEVQX0tJTkQgYml0IGluIHRoZSBlbmRwb2ludCByZWdpc3Rlci4NCi0gKiBAcGFyYW0gIFVTQnggVVNCIHBlcmlwaGVyYWwgaW5zdGFuY2UgcmVnaXN0ZXIgYWRkcmVzcy4NCi0gKiBAcGFyYW0gIGJFcE51bSBFbmRwb2ludCBOdW1iZXIuDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBQQ0RfU0VUX0JVTEtfRVBfREJVRihVU0J4LCBiRXBOdW0pIFBDRF9TRVRfRVBfS0lORCgoVVNCeCksIChiRXBOdW0pKQ0KLSNkZWZpbmUgUENEX0NMRUFSX0JVTEtfRVBfREJVRihVU0J4LCBiRXBOdW0pIFBDRF9DTEVBUl9FUF9LSU5EKChVU0J4KSwgKGJFcE51bSkpDQotDQotLyoqDQotICogQGJyaWVmICBDbGVhcnMgYml0IENUUl9SWCAvIENUUl9UWCBpbiB0aGUgZW5kcG9pbnQgcmVnaXN0ZXIuDQotICogQHBhcmFtICBVU0J4IFVTQiBwZXJpcGhlcmFsIGluc3RhbmNlIHJlZ2lzdGVyIGFkZHJlc3MuDQotICogQHBhcmFtICBiRXBOdW0gRW5kcG9pbnQgTnVtYmVyLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgUENEX0NMRUFSX1JYX0VQX0NUUihVU0J4LCBiRXBOdW0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgdWludDE2X3QgX3dSZWdWYWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIF93UmVnVmFsID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgIFBDRF9HRVRfRU5EUE9JTlQoKFVTQngpLCAoYkVwTnVtKSkgJiAoMHg3RkZGVSAmIFVTQl9FUFJFR19NQVNLKTsgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIFBDRF9TRVRfRU5EUE9JTlQoKFVTQngpLCAoYkVwTnVtKSwgKF93UmVnVmFsIHwgVVNCX0VQX0NUUl9UWCkpOyAgICAgIFwNCi0gIH0gd2hpbGUgKDApIC8qIFBDRF9DTEVBUl9SWF9FUF9DVFIgKi8NCi0NCi0jZGVmaW5lIFBDRF9DTEVBUl9UWF9FUF9DVFIoVVNCeCwgYkVwTnVtKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIHVpbnQxNl90IF93UmVnVmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBfd1JlZ1ZhbCA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICBQQ0RfR0VUX0VORFBPSU5UKChVU0J4KSwgKGJFcE51bSkpICYgKDB4RkY3RlUgJiBVU0JfRVBSRUdfTUFTSyk7IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBQQ0RfU0VUX0VORFBPSU5UKChVU0J4KSwgKGJFcE51bSksIChfd1JlZ1ZhbCB8IFVTQl9FUF9DVFJfUlgpKTsgICAgICBcDQotICB9IHdoaWxlICgwKSAvKiBQQ0RfQ0xFQVJfVFhfRVBfQ1RSICovDQotDQotLyoqDQotICogQGJyaWVmICBUb2dnbGVzIERUT0dfUlggLyBEVE9HX1RYIGJpdCBpbiB0aGUgZW5kcG9pbnQgcmVnaXN0ZXIuDQotICogQHBhcmFtICBVU0J4IFVTQiBwZXJpcGhlcmFsIGluc3RhbmNlIHJlZ2lzdGVyIGFkZHJlc3MuDQotICogQHBhcmFtICBiRXBOdW0gRW5kcG9pbnQgTnVtYmVyLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgUENEX1JYX0RUT0coVVNCeCwgYkVwTnVtKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIHVpbnQxNl90IF93RVBWYWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgX3dFUFZhbCA9IFBDRF9HRVRfRU5EUE9JTlQoKFVTQngpLCAoYkVwTnVtKSkgJiBVU0JfRVBSRUdfTUFTSzsgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBQQ0RfU0VUX0VORFBPSU5UKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgIChVU0J4KSwgKGJFcE51bSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICAoX3dFUFZhbCB8IFVTQl9FUF9DVFJfUlggfCBVU0JfRVBfQ1RSX1RYIHwgVVNCX0VQX0RUT0dfUlgpKTsgXA0KLSAgfSB3aGlsZSAoMCkgLyogUENEX1JYX0RUT0cgKi8NCi0NCi0jZGVmaW5lIFBDRF9UWF9EVE9HKFVTQngsIGJFcE51bSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICB1aW50MTZfdCBfd0VQVmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIF93RVBWYWwgPSBQQ0RfR0VUX0VORFBPSU5UKChVU0J4KSwgKGJFcE51bSkpICYgVVNCX0VQUkVHX01BU0s7ICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgUENEX1NFVF9FTkRQT0lOVCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICAoVVNCeCksIChiRXBOdW0pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgKF93RVBWYWwgfCBVU0JfRVBfQ1RSX1JYIHwgVVNCX0VQX0NUUl9UWCB8IFVTQl9FUF9EVE9HX1RYKSk7IFwNCi0gIH0gd2hpbGUgKDApIC8qIFBDRF9UWF9EVE9HICovDQotLyoqDQotICogQGJyaWVmICBDbGVhcnMgRFRPR19SWCAvIERUT0dfVFggYml0IGluIHRoZSBlbmRwb2ludCByZWdpc3Rlci4NCi0gKiBAcGFyYW0gIFVTQnggVVNCIHBlcmlwaGVyYWwgaW5zdGFuY2UgcmVnaXN0ZXIgYWRkcmVzcy4NCi0gKiBAcGFyYW0gIGJFcE51bSBFbmRwb2ludCBOdW1iZXIuDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBQQ0RfQ0xFQVJfUlhfRFRPRyhVU0J4LCBiRXBOdW0pICAgICAgICAgICAgXA0KLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgdWludDE2X3QgX3dSZWdWYWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBfd1JlZ1ZhbCA9IFBDRF9HRVRfRU5EUE9JTlQoKFVTQngpLCAoYkVwTnVtKSk7IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIGlmICgoX3dSZWdWYWwgJiBVU0JfRVBfRFRPR19SWCkgIT0gMFUpIHsgICAgICAgXA0KLSAgICAgIFBDRF9SWF9EVE9HKChVU0J4KSwgKGJFcE51bSkpOyAgICAgICAgICAgICAgIFwNCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICB9IHdoaWxlICgwKSAvKiBQQ0RfQ0xFQVJfUlhfRFRPRyAqLw0KLQ0KLSNkZWZpbmUgUENEX0NMRUFSX1RYX0RUT0coVVNCeCwgYkVwTnVtKSAgICAgICAgICAgIFwNCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIHVpbnQxNl90IF93UmVnVmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgX3dSZWdWYWwgPSBQQ0RfR0VUX0VORFBPSU5UKChVU0J4KSwgKGJFcE51bSkpOyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBpZiAoKF93UmVnVmFsICYgVVNCX0VQX0RUT0dfVFgpICE9IDBVKSB7ICAgICAgIFwNCi0gICAgICBQQ0RfVFhfRFRPRygoVVNCeCksIChiRXBOdW0pKTsgICAgICAgICAgICAgICBcDQotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgfSB3aGlsZSAoMCkgLyogUENEX0NMRUFSX1RYX0RUT0cgKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldHMgYWRkcmVzcyBpbiBhbiBlbmRwb2ludCByZWdpc3Rlci4NCi0gKiBAcGFyYW0gIFVTQnggVVNCIHBlcmlwaGVyYWwgaW5zdGFuY2UgcmVnaXN0ZXIgYWRkcmVzcy4NCi0gKiBAcGFyYW0gIGJFcE51bSBFbmRwb2ludCBOdW1iZXIuDQotICogQHBhcmFtICBiQWRkciBBZGRyZXNzLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgUENEX1NFVF9FUF9BRERSRVNTKFVTQngsIGJFcE51bSwgYkFkZHIpICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgdWludDE2X3QgX3dSZWdWYWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIF93UmVnVmFsID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgIChQQ0RfR0VUX0VORFBPSU5UKChVU0J4KSwgKGJFcE51bSkpICYgVVNCX0VQUkVHX01BU0spIHwgKGJBZGRyKTsgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIFBDRF9TRVRfRU5EUE9JTlQoKFVTQngpLCAoYkVwTnVtKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAoX3dSZWdWYWwgfCBVU0JfRVBfQ1RSX1JYIHwgVVNCX0VQX0NUUl9UWCkpOyAgICAgICAgXA0KLSAgfSB3aGlsZSAoMCkgLyogUENEX1NFVF9FUF9BRERSRVNTICovDQotDQotLyoqDQotICogQGJyaWVmICBHZXRzIGFkZHJlc3MgaW4gYW4gZW5kcG9pbnQgcmVnaXN0ZXIuDQotICogQHBhcmFtICBVU0J4IFVTQiBwZXJpcGhlcmFsIGluc3RhbmNlIHJlZ2lzdGVyIGFkZHJlc3MuDQotICogQHBhcmFtICBiRXBOdW0gRW5kcG9pbnQgTnVtYmVyLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgUENEX0dFVF9FUF9BRERSRVNTKFVTQngsIGJFcE51bSkgXA0KLSAgKCh1aW50OF90KShQQ0RfR0VUX0VORFBPSU5UKChVU0J4KSwgKGJFcE51bSkpICYgVVNCX0VQQUREUl9GSUVMRCkpDQotDQotI2RlZmluZSBQQ0RfRVBfVFhfQ05UKFVTQngsIGJFcE51bSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgodWludDE2X3QgKikoKCgodWludDMyX3QpKFVTQngpLT5CVEFCTEUgKyAoKHVpbnQzMl90KShiRXBOdW0pICogOFUpICsgMlUpICogXA0KLSAgICAgICAgICAgICAgICAgUE1BX0FDQ0VTUykgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICAgICAgICAgICgodWludDMyX3QpKFVTQngpICsgMHg0MDBVKSkpDQotDQotI2RlZmluZSBQQ0RfRVBfUlhfQ05UKFVTQngsIGJFcE51bSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgodWludDE2X3QgKikoKCgodWludDMyX3QpKFVTQngpLT5CVEFCTEUgKyAoKHVpbnQzMl90KShiRXBOdW0pICogOFUpICsgNlUpICogXA0KLSAgICAgICAgICAgICAgICAgUE1BX0FDQ0VTUykgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICAgICAgICAgICgodWludDMyX3QpKFVTQngpICsgMHg0MDBVKSkpDQotDQotLyoqDQotICogQGJyaWVmICBzZXRzIGFkZHJlc3Mgb2YgdGhlIHR4L3J4IGJ1ZmZlci4NCi0gKiBAcGFyYW0gIFVTQnggVVNCIHBlcmlwaGVyYWwgaW5zdGFuY2UgcmVnaXN0ZXIgYWRkcmVzcy4NCi0gKiBAcGFyYW0gIGJFcE51bSBFbmRwb2ludCBOdW1iZXIuDQotICogQHBhcmFtICB3QWRkciBhZGRyZXNzIHRvIGJlIHNldCAobXVzdCBiZSB3b3JkIGFsaWduZWQpLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgUENEX1NFVF9FUF9UWF9BRERSRVNTKFVTQngsIGJFcE51bSwgd0FkZHIpICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgX19JTyB1aW50MTZfdCAqX3dSZWdWYWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICB1aW50MzJfdCBfd1JlZ0Jhc2UgPSAodWludDMyX3QpVVNCeDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgX3dSZWdCYXNlICs9ICh1aW50MzJfdCkoVVNCeCktPkJUQUJMRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBfd1JlZ1ZhbCA9IChfX0lPIHVpbnQxNl90ICopKF93UmVnQmFzZSArIDB4NDAwVSArICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgodWludDMyX3QpKGJFcE51bSkgKiA4VSkgKiBQTUFfQUNDRVNTKSk7IFwNCi0gICAgKl93UmVnVmFsID0gKCh3QWRkcikgPj4gMSkgPDwgMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgfSB3aGlsZSAoMCkgLyogUENEX1NFVF9FUF9UWF9BRERSRVNTICovDQotDQotI2RlZmluZSBQQ0RfU0VUX0VQX1JYX0FERFJFU1MoVVNCeCwgYkVwTnVtLCB3QWRkcikgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBfX0lPIHVpbnQxNl90ICpfd1JlZ1ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIHVpbnQzMl90IF93UmVnQmFzZSA9ICh1aW50MzJfdClVU0J4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBfd1JlZ0Jhc2UgKz0gKHVpbnQzMl90KShVU0J4KS0+QlRBQkxFOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIF93UmVnVmFsID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgIChfX0lPIHVpbnQxNl90ICopKF93UmVnQmFzZSArIDB4NDAwVSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoKHVpbnQzMl90KShiRXBOdW0pICogOFUpICsgNFUpICogUE1BX0FDQ0VTUykpOyBcDQotICAgICpfd1JlZ1ZhbCA9ICgod0FkZHIpID4+IDEpIDw8IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIH0gd2hpbGUgKDApIC8qIFBDRF9TRVRfRVBfUlhfQUREUkVTUyAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0cyBhZGRyZXNzIG9mIHRoZSB0eC9yeCBidWZmZXIuDQotICogQHBhcmFtICBVU0J4IFVTQiBwZXJpcGhlcmFsIGluc3RhbmNlIHJlZ2lzdGVyIGFkZHJlc3MuDQotICogQHBhcmFtICBiRXBOdW0gRW5kcG9pbnQgTnVtYmVyLg0KLSAqIEByZXR2YWwgYWRkcmVzcyBvZiB0aGUgYnVmZmVyLg0KLSAqLw0KLSNkZWZpbmUgUENEX0dFVF9FUF9UWF9BRERSRVNTKFVTQngsIGJFcE51bSkgXA0KLSAgKCh1aW50MTZfdCkgKiBQQ0RfRVBfVFhfQUREUkVTUygoVVNCeCksIChiRXBOdW0pKSkNCi0jZGVmaW5lIFBDRF9HRVRfRVBfUlhfQUREUkVTUyhVU0J4LCBiRXBOdW0pIFwNCi0gICgodWludDE2X3QpICogUENEX0VQX1JYX0FERFJFU1MoKFVTQngpLCAoYkVwTnVtKSkpDQotDQotLyoqDQotICogQGJyaWVmICBTZXRzIGNvdW50ZXIgb2YgcnggYnVmZmVyIHdpdGggbm8uIG9mIGJsb2Nrcy4NCi0gKiBAcGFyYW0gIHBkd1JlZyBSZWdpc3RlciBwb2ludGVyDQotICogQHBhcmFtICB3Q291bnQgQ291bnRlci4NCi0gKiBAcGFyYW0gIHdOQmxvY2tzIG5vLiBvZiBCbG9ja3MuDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBQQ0RfQ0FMQ19CTEszMihwZHdSZWcsIHdDb3VudCwgd05CbG9ja3MpICAgICAgICAgICAgICAgICAgIFwNCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAod05CbG9ja3MpID0gKHdDb3VudCkgPj4gNTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIGlmICgoKHdDb3VudCkgJiAweDFmVSkgPT0gMFUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAod05CbG9ja3MpLS07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICoocGR3UmVnKSA9ICh1aW50MTZfdCkoKCh3TkJsb2NrcykgPDwgMTApIHwgVVNCX0NOVFJYX0JMU0laRSk7IFwNCi0gIH0gd2hpbGUgKDApIC8qIFBDRF9DQUxDX0JMSzMyICovDQotDQotI2RlZmluZSBQQ0RfQ0FMQ19CTEsyKHBkd1JlZywgd0NvdW50LCB3TkJsb2NrcykgXA0KLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgKHdOQmxvY2tzKSA9ICh3Q291bnQpID4+IDE7ICAgICAgICAgICAgICAgICBcDQotICAgIGlmICgoKHdDb3VudCkgJiAweDFVKSAhPSAwVSkgeyAgICAgICAgICAgICAgXA0KLSAgICAgICh3TkJsb2NrcykrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICoocGR3UmVnKSA9ICh1aW50MTZfdCkoKHdOQmxvY2tzKSA8PCAxMCk7ICAgXA0KLSAgfSB3aGlsZSAoMCkgLyogUENEX0NBTENfQkxLMiAqLw0KLQ0KLSNkZWZpbmUgUENEX1NFVF9FUF9DTlRfUlhfUkVHKHBkd1JlZywgd0NvdW50KSAgICAgICAgXA0KLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICB1aW50MzJfdCB3TkJsb2NrczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBpZiAoKHdDb3VudCkgPiA2MlUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgIFBDRF9DQUxDX0JMSzMyKChwZHdSZWcpLCAod0NvdW50KSwgd05CbG9ja3MpOyAgXA0KLSAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgIGlmICgod0NvdW50KSA9PSAwVSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgKihwZHdSZWcpICY9ICh1aW50MTZfdCl+VVNCX0NOVFJYX05CTEtfTVNLOyAgXA0KLSAgICAgICAgKihwZHdSZWcpIHw9IFVTQl9DTlRSWF9CTFNJWkU7ICAgICAgICAgICAgICAgXA0KLSAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgUENEX0NBTENfQkxLMigocGR3UmVnKSwgKHdDb3VudCksIHdOQmxvY2tzKTsgXA0KLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgfSB3aGlsZSAoMCkgLyogUENEX1NFVF9FUF9DTlRfUlhfUkVHICovDQotDQotI2RlZmluZSBQQ0RfU0VUX0VQX1JYX0RCVUYwX0NOVChVU0J4LCBiRXBOdW0sIHdDb3VudCkgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICB1aW50MzJfdCBfd1JlZ0Jhc2UgPSAodWludDMyX3QpKFVTQngpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIF9fSU8gdWludDE2X3QgKnBkd1JlZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBfd1JlZ0Jhc2UgKz0gKHVpbnQzMl90KShVU0J4KS0+QlRBQkxFOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIHBkd1JlZyA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgIChfX0lPIHVpbnQxNl90ICopKF93UmVnQmFzZSArIDB4NDAwVSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoKHVpbnQzMl90KShiRXBOdW0pICogOFUpICsgMlUpICogUE1BX0FDQ0VTUykpOyBcDQotICAgIFBDRF9TRVRfRVBfQ05UX1JYX1JFRyhwZHdSZWcsICh3Q291bnQpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIH0gd2hpbGUgKDApDQotDQotLyoqDQotICogQGJyaWVmICBzZXRzIGNvdW50ZXIgZm9yIHRoZSB0eC9yeCBidWZmZXIuDQotICogQHBhcmFtICBVU0J4IFVTQiBwZXJpcGhlcmFsIGluc3RhbmNlIHJlZ2lzdGVyIGFkZHJlc3MuDQotICogQHBhcmFtICBiRXBOdW0gRW5kcG9pbnQgTnVtYmVyLg0KLSAqIEBwYXJhbSAgd0NvdW50IENvdW50ZXIgdmFsdWUuDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBQQ0RfU0VUX0VQX1RYX0NOVChVU0J4LCBiRXBOdW0sIHdDb3VudCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICB1aW50MzJfdCBfd1JlZ0Jhc2UgPSAodWludDMyX3QpKFVTQngpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIF9fSU8gdWludDE2X3QgKl93UmVnVmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBfd1JlZ0Jhc2UgKz0gKHVpbnQzMl90KShVU0J4KS0+QlRBQkxFOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIF93UmVnVmFsID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgIChfX0lPIHVpbnQxNl90ICopKF93UmVnQmFzZSArIDB4NDAwVSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoKHVpbnQzMl90KShiRXBOdW0pICogOFUpICsgMlUpICogUE1BX0FDQ0VTUykpOyBcDQotICAgICpfd1JlZ1ZhbCA9ICh1aW50MTZfdCkod0NvdW50KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIH0gd2hpbGUgKDApDQotDQotI2RlZmluZSBQQ0RfU0VUX0VQX1JYX0NOVChVU0J4LCBiRXBOdW0sIHdDb3VudCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICB1aW50MzJfdCBfd1JlZ0Jhc2UgPSAodWludDMyX3QpKFVTQngpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIF9fSU8gdWludDE2X3QgKl93UmVnVmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBfd1JlZ0Jhc2UgKz0gKHVpbnQzMl90KShVU0J4KS0+QlRBQkxFOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIF93UmVnVmFsID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgIChfX0lPIHVpbnQxNl90ICopKF93UmVnQmFzZSArIDB4NDAwVSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoKHVpbnQzMl90KShiRXBOdW0pICogOFUpICsgNlUpICogUE1BX0FDQ0VTUykpOyBcDQotICAgIFBDRF9TRVRfRVBfQ05UX1JYX1JFRyhfd1JlZ1ZhbCwgKHdDb3VudCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIH0gd2hpbGUgKDApDQotDQotLyoqDQotICogQGJyaWVmICBnZXRzIGNvdW50ZXIgb2YgdGhlIHR4IGJ1ZmZlci4NCi0gKiBAcGFyYW0gIFVTQnggVVNCIHBlcmlwaGVyYWwgaW5zdGFuY2UgcmVnaXN0ZXIgYWRkcmVzcy4NCi0gKiBAcGFyYW0gIGJFcE51bSBFbmRwb2ludCBOdW1iZXIuDQotICogQHJldHZhbCBDb3VudGVyIHZhbHVlDQotICovDQotI2RlZmluZSBQQ0RfR0VUX0VQX1RYX0NOVChVU0J4LCBiRXBOdW0pIFwNCi0gICgodWludDMyX3QpKCpQQ0RfRVBfVFhfQ05UKChVU0J4KSwgKGJFcE51bSkpKSAmIDB4M2ZmVSkNCi0jZGVmaW5lIFBDRF9HRVRfRVBfUlhfQ05UKFVTQngsIGJFcE51bSkgXA0KLSAgKCh1aW50MzJfdCkoKlBDRF9FUF9SWF9DTlQoKFVTQngpLCAoYkVwTnVtKSkpICYgMHgzZmZVKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0cyBidWZmZXIgMC8xIGFkZHJlc3MgaW4gYSBkb3VibGUgYnVmZmVyIGVuZHBvaW50Lg0KLSAqIEBwYXJhbSAgVVNCeCBVU0IgcGVyaXBoZXJhbCBpbnN0YW5jZSByZWdpc3RlciBhZGRyZXNzLg0KLSAqIEBwYXJhbSAgYkVwTnVtIEVuZHBvaW50IE51bWJlci4NCi0gKiBAcGFyYW0gIHdCdWYwQWRkciBidWZmZXIgMCBhZGRyZXNzLg0KLSAqIEByZXR2YWwgQ291bnRlciB2YWx1ZQ0KLSAqLw0KLSNkZWZpbmUgUENEX1NFVF9FUF9EQlVGMF9BRERSKFVTQngsIGJFcE51bSwgd0J1ZjBBZGRyKSAgICBcDQotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgUENEX1NFVF9FUF9UWF9BRERSRVNTKChVU0J4KSwgKGJFcE51bSksICh3QnVmMEFkZHIpKTsgXA0KLSAgfSB3aGlsZSAoMCkgLyogUENEX1NFVF9FUF9EQlVGMF9BRERSICovDQotDQotI2RlZmluZSBQQ0RfU0VUX0VQX0RCVUYxX0FERFIoVVNCeCwgYkVwTnVtLCB3QnVmMUFkZHIpICAgIFwNCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBQQ0RfU0VUX0VQX1JYX0FERFJFU1MoKFVTQngpLCAoYkVwTnVtKSwgKHdCdWYxQWRkcikpOyBcDQotICB9IHdoaWxlICgwKSAvKiBQQ0RfU0VUX0VQX0RCVUYxX0FERFIgKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldHMgYWRkcmVzc2VzIGluIGEgZG91YmxlIGJ1ZmZlciBlbmRwb2ludC4NCi0gKiBAcGFyYW0gIFVTQnggVVNCIHBlcmlwaGVyYWwgaW5zdGFuY2UgcmVnaXN0ZXIgYWRkcmVzcy4NCi0gKiBAcGFyYW0gIGJFcE51bSBFbmRwb2ludCBOdW1iZXIuDQotICogQHBhcmFtICB3QnVmMEFkZHI6IGJ1ZmZlciAwIGFkZHJlc3MuDQotICogQHBhcmFtICB3QnVmMUFkZHIgPSBidWZmZXIgMSBhZGRyZXNzLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgUENEX1NFVF9FUF9EQlVGX0FERFIoVVNCeCwgYkVwTnVtLCB3QnVmMEFkZHIsIHdCdWYxQWRkcikgXA0KLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBQQ0RfU0VUX0VQX0RCVUYwX0FERFIoKFVTQngpLCAoYkVwTnVtKSwgKHdCdWYwQWRkcikpOyAgICAgICAgXA0KLSAgICBQQ0RfU0VUX0VQX0RCVUYxX0FERFIoKFVTQngpLCAoYkVwTnVtKSwgKHdCdWYxQWRkcikpOyAgICAgICAgXA0KLSAgfSB3aGlsZSAoMCkgLyogUENEX1NFVF9FUF9EQlVGX0FERFIgKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldHMgYnVmZmVyIDAvMSBhZGRyZXNzIG9mIGEgZG91YmxlIGJ1ZmZlciBlbmRwb2ludC4NCi0gKiBAcGFyYW0gIFVTQnggVVNCIHBlcmlwaGVyYWwgaW5zdGFuY2UgcmVnaXN0ZXIgYWRkcmVzcy4NCi0gKiBAcGFyYW0gIGJFcE51bSBFbmRwb2ludCBOdW1iZXIuDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBQQ0RfR0VUX0VQX0RCVUYwX0FERFIoVVNCeCwgYkVwTnVtKSBcDQotICAoUENEX0dFVF9FUF9UWF9BRERSRVNTKChVU0J4KSwgKGJFcE51bSkpKQ0KLSNkZWZpbmUgUENEX0dFVF9FUF9EQlVGMV9BRERSKFVTQngsIGJFcE51bSkgXA0KLSAgKFBDRF9HRVRfRVBfUlhfQUREUkVTUygoVVNCeCksIChiRXBOdW0pKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldHMgYnVmZmVyIDAvMSBhZGRyZXNzIG9mIGEgZG91YmxlIGJ1ZmZlciBlbmRwb2ludC4NCi0gKiBAcGFyYW0gIFVTQnggVVNCIHBlcmlwaGVyYWwgaW5zdGFuY2UgcmVnaXN0ZXIgYWRkcmVzcy4NCi0gKiBAcGFyYW0gIGJFcE51bSBFbmRwb2ludCBOdW1iZXIuDQotICogQHBhcmFtICBiRGlyIGVuZHBvaW50IGRpciAgRVBfREJVRl9PVVQgPSBPVVQNCi0gKiAgICAgICAgIEVQX0RCVUZfSU4gID0gSU4NCi0gKiBAcGFyYW0gIHdDb3VudDogQ291bnRlciB2YWx1ZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgUENEX1NFVF9FUF9EQlVGMF9DTlQoVVNCeCwgYkVwTnVtLCBiRGlyLCB3Q291bnQpICAgXA0KLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBpZiAoKGJEaXIpID09IDBVKSAvKiBPVVQgZW5kcG9pbnQgKi8gICAgICAgICAgICAgICAgICAgXA0KLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgIFBDRF9TRVRfRVBfUlhfREJVRjBfQ05UKChVU0J4KSwgKGJFcE51bSksICh3Q291bnQpKTsgXA0KLSAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgIGlmICgoYkRpcikgPT0gMVUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgLyogSU4gZW5kcG9pbnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgUENEX1NFVF9FUF9UWF9DTlQoKFVTQngpLCAoYkVwTnVtKSwgKHdDb3VudCkpOyAgICAgXA0KLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgfSB3aGlsZSAoMCkgLyogU2V0RVBEYmxCdWYwQ291bnQqLw0KLQ0KLSNkZWZpbmUgUENEX1NFVF9FUF9EQlVGMV9DTlQoVVNCeCwgYkVwTnVtLCBiRGlyLCB3Q291bnQpICAgICAgICAgICAgICAgICAgIFwNCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIHVpbnQzMl90IF93QmFzZSA9ICh1aW50MzJfdCkoVVNCeCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBfX0lPIHVpbnQxNl90ICpfd0VQUmVnVmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIGlmICgoYkRpcikgPT0gMFUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgIC8qIE9VVCBlbmRwb2ludCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICBQQ0RfU0VUX0VQX1JYX0NOVCgoVVNCeCksIChiRXBOdW0pLCAod0NvdW50KSk7ICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgIGlmICgoYkRpcikgPT0gMVUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgIC8qIElOIGVuZHBvaW50ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICBfd0Jhc2UgKz0gKHVpbnQzMl90KShVU0J4KS0+QlRBQkxFOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgX3dFUFJlZ1ZhbCA9IChfX0lPIHVpbnQxNl90ICopKF93QmFzZSArIDB4NDAwVSArICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCgodWludDMyX3QpKGJFcE51bSkgKiA4VSkgKyA2VSkgKiBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNQV9BQ0NFU1MpKTsgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgKl93RVBSZWdWYWwgPSAodWludDE2X3QpKHdDb3VudCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgfSB3aGlsZSAoMCkgLyogU2V0RVBEYmxCdWYxQ291bnQgKi8NCi0NCi0jZGVmaW5lIFBDRF9TRVRfRVBfREJVRl9DTlQoVVNCeCwgYkVwTnVtLCBiRGlyLCB3Q291bnQpICAgICAgIFwNCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgUENEX1NFVF9FUF9EQlVGMF9DTlQoKFVTQngpLCAoYkVwTnVtKSwgKGJEaXIpLCAod0NvdW50KSk7IFwNCi0gICAgUENEX1NFVF9FUF9EQlVGMV9DTlQoKFVTQngpLCAoYkVwTnVtKSwgKGJEaXIpLCAod0NvdW50KSk7IFwNCi0gIH0gd2hpbGUgKDApIC8qIFBDRF9TRVRfRVBfREJVRl9DTlQgKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldHMgYnVmZmVyIDAvMSByeC90eCBjb3VudGVyIGZvciBkb3VibGUgYnVmZmVyaW5nLg0KLSAqIEBwYXJhbSAgVVNCeCBVU0IgcGVyaXBoZXJhbCBpbnN0YW5jZSByZWdpc3RlciBhZGRyZXNzLg0KLSAqIEBwYXJhbSAgYkVwTnVtIEVuZHBvaW50IE51bWJlci4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIFBDRF9HRVRfRVBfREJVRjBfQ05UKFVTQngsIGJFcE51bSkgKFBDRF9HRVRfRVBfVFhfQ05UKChVU0J4KSwgKGJFcE51bSkpKQ0KLSNkZWZpbmUgUENEX0dFVF9FUF9EQlVGMV9DTlQoVVNCeCwgYkVwTnVtKSAoUENEX0dFVF9FUF9SWF9DTlQoKFVTQngpLCAoYkVwTnVtKSkpDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotI2VuZGlmIC8qIGRlZmluZWQgKFVTQikgKi8NCi0NCi0jaWZkZWYgX19jcGx1c3BsdXMNCi19DQotI2VuZGlmDQotDQotI2VuZGlmIC8qIFNUTTMyRzR4eF9IQUxfUENEX0ggKi8NCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBmaWxlICAgIHN0bTMyZzR4eF9oYWxfcGNkLmgKKyAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBQQ0QgSEFMIG1vZHVsZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBhdHRlbnRpb24KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRlcm1zIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUKKyAqIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4KKyAqIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcyB3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMkc0eHhfSEFMX1BDRF9ICisjZGVmaW5lIFNUTTMyRzR4eF9IQUxfUENEX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzR4eF9sbF91c2IuaCIKKworI2lmIGRlZmluZWQoVVNCKQorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHNHh4X0hBTF9Ecml2ZXIKKyAqIEB7CisgKi8KKworLyoqIEBhZGR0b2dyb3VwIFBDRAorICogQHsKKyAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBQQ0RfRXhwb3J0ZWRfVHlwZXMgUENEIEV4cG9ydGVkIFR5cGVzCisgKiBAeworICovCisKKy8qKgorICogQGJyaWVmICBQQ0QgU3RhdGUgc3RydWN0dXJlIGRlZmluaXRpb24KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgSEFMX1BDRF9TVEFURV9SRVNFVCA9IDB4MDAsCisgIEhBTF9QQ0RfU1RBVEVfUkVBRFkgPSAweDAxLAorICBIQUxfUENEX1NUQVRFX0VSUk9SID0gMHgwMiwKKyAgSEFMX1BDRF9TVEFURV9CVVNZID0gMHgwMywKKyAgSEFMX1BDRF9TVEFURV9USU1FT1VUID0gMHgwNAorfSBQQ0RfU3RhdGVUeXBlRGVmOworCisvKiBEZXZpY2UgTFBNIHN1c3BlbmQgc3RhdGUgKi8KK3R5cGVkZWYgZW51bSB7CisgIExQTV9MMCA9IDB4MDAsIC8qIG9uICovCisgIExQTV9MMSA9IDB4MDEsIC8qIExQTSBMMSBzbGVlcCAqLworICBMUE1fTDIgPSAweDAyLCAvKiBzdXNwZW5kICovCisgIExQTV9MMyA9IDB4MDMsIC8qIG9mZiAqLworfSBQQ0RfTFBNX1N0YXRlVHlwZURlZjsKKwordHlwZWRlZiBlbnVtIHsKKyAgUENEX0xQTV9MMF9BQ1RJVkUgPSAweDAwLCAvKiBvbiAqLworICBQQ0RfTFBNX0wxX0FDVElWRSA9IDB4MDEsIC8qIExQTSBMMSBzbGVlcCAqLworfSBQQ0RfTFBNX01zZ1R5cGVEZWY7CisKK3R5cGVkZWYgZW51bSB7CisgIFBDRF9CQ0RfRVJST1IgPSAweEZGLAorICBQQ0RfQkNEX0NPTlRBQ1RfREVURUNUSU9OID0gMHhGRSwKKyAgUENEX0JDRF9TVERfRE9XTlNUUkVBTV9QT1JUID0gMHhGRCwKKyAgUENEX0JDRF9DSEFSR0lOR19ET1dOU1RSRUFNX1BPUlQgPSAweEZDLAorICBQQ0RfQkNEX0RFRElDQVRFRF9DSEFSR0lOR19QT1JUID0gMHhGQiwKKyAgUENEX0JDRF9ESVNDT1ZFUllfQ09NUExFVEVEID0gMHgwMCwKKworfSBQQ0RfQkNEX01zZ1R5cGVEZWY7CisKK3R5cGVkZWYgVVNCX1R5cGVEZWYgUENEX1R5cGVEZWY7Cit0eXBlZGVmIFVTQl9DZmdUeXBlRGVmIFBDRF9Jbml0VHlwZURlZjsKK3R5cGVkZWYgVVNCX0VQVHlwZURlZiBQQ0RfRVBUeXBlRGVmOworCisvKioKKyAqIEBicmllZiAgUENEIEhhbmRsZSBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICovCisjaWYgKFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKK3R5cGVkZWYgc3RydWN0IF9fUENEX0hhbmRsZVR5cGVEZWYKKyNlbHNlCit0eXBlZGVmIHN0cnVjdAorI2VuZGlmIC8qIFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyAqLworeworICBQQ0RfVHlwZURlZiAqSW5zdGFuY2U7ICAgICAgICAgIC8qITwgUmVnaXN0ZXIgYmFzZSBhZGRyZXNzICAgICAgICAgICAgICovCisgIFBDRF9Jbml0VHlwZURlZiBJbml0OyAgICAgICAgICAgLyohPCBQQ0QgcmVxdWlyZWQgcGFyYW1ldGVycyAgICAgICAgICAgKi8KKyAgX19JTyB1aW50OF90IFVTQl9BZGRyZXNzOyAgICAgICAvKiE8IFVTQiBBZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAqLworICBQQ0RfRVBUeXBlRGVmIElOX2VwWzhdOyAgICAgICAgIC8qITwgSU4gZW5kcG9pbnQgcGFyYW1ldGVycyAgICAgICAgICAgICovCisgIFBDRF9FUFR5cGVEZWYgT1VUX2VwWzhdOyAgICAgICAgLyohPCBPVVQgZW5kcG9pbnQgcGFyYW1ldGVycyAgICAgICAgICAgKi8KKyAgSEFMX0xvY2tUeXBlRGVmIExvY2s7ICAgICAgICAgICAvKiE8IFBDRCBwZXJpcGhlcmFsIHN0YXR1cyAgICAgICAgICAgICAqLworICBfX0lPIFBDRF9TdGF0ZVR5cGVEZWYgU3RhdGU7ICAgIC8qITwgUENEIGNvbW11bmljYXRpb24gc3RhdGUgICAgICAgICAgICovCisgIF9fSU8gdWludDMyX3QgRXJyb3JDb2RlOyAgICAgICAgLyohPCBQQ0QgRXJyb3IgY29kZSAgICAgICAgICAgICAgICAgICAgKi8KKyAgdWludDMyX3QgU2V0dXBbMTJdOyAgICAgICAgICAgICAvKiE8IFNldHVwIHBhY2tldCBidWZmZXIgICAgICAgICAgICAgICAqLworICBQQ0RfTFBNX1N0YXRlVHlwZURlZiBMUE1fU3RhdGU7IC8qITwgTFBNIFN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHVpbnQzMl90IEJFU0w7CisKKyAgdWludDMyX3QgbHBtX2FjdGl2ZTsgLyohPCBFbmFibGUgb3IgZGlzYWJsZSB0aGUgTGluayBQb3dlciBNYW5hZ2VtZW50IC4KKyAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHNldCB0byBFTkFCTEUgb3IgRElTQUJMRSAgICAgICAgKi8KKworICB1aW50MzJfdAorICAgICAgYmF0dGVyeV9jaGFyZ2luZ19hY3RpdmU7IC8qITwgRW5hYmxlIG9yIGRpc2FibGUgQmF0dGVyeSBjaGFyZ2luZy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgc2V0IHRvIEVOQUJMRSBvciBESVNBQkxFICovCisgIHZvaWQgKnBEYXRhOyAgICAgICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIHVwcGVyIHN0YWNrIEhhbmRsZXIgKi8KKworI2lmIChVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgIHZvaWQgKCpTT0ZDYWxsYmFjaykoCisgICAgICBzdHJ1Y3QgX19QQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7IC8qITwgVVNCIE9URyBQQ0QgU09GIGNhbGxiYWNrICovCisgIHZvaWQgKCpTZXR1cFN0YWdlQ2FsbGJhY2spKHN0cnVjdCBfX1BDRF9IYW5kbGVUeXBlRGVmICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhwY2QpOyAvKiE8IFVTQiBPVEcgUENEIFNldHVwIFN0YWdlIGNhbGxiYWNrICovCisgIHZvaWQgKCpSZXNldENhbGxiYWNrKSgKKyAgICAgIHN0cnVjdCBfX1BDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsgLyohPCBVU0IgT1RHIFBDRCBSZXNldCBjYWxsYmFjayAqLworICB2b2lkICgqU3VzcGVuZENhbGxiYWNrKSgKKyAgICAgIHN0cnVjdCBfX1BDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsgLyohPCBVU0IgT1RHIFBDRCBTdXNwZW5kIGNhbGxiYWNrICovCisgIHZvaWQgKCpSZXN1bWVDYWxsYmFjaykoCisgICAgICBzdHJ1Y3QgX19QQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7IC8qITwgVVNCIE9URyBQQ0QgUmVzdW1lIGNhbGxiYWNrICovCisgIHZvaWQgKCpDb25uZWN0Q2FsbGJhY2spKAorICAgICAgc3RydWN0IF9fUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOyAvKiE8IFVTQiBPVEcgUENEIENvbm5lY3QgY2FsbGJhY2sgKi8KKyAgdm9pZCAoKkRpc2Nvbm5lY3RDYWxsYmFjaykoCisgICAgICBzdHJ1Y3QgX19QQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7IC8qITwgVVNCIE9URyBQQ0QgRGlzY29ubmVjdCBjYWxsYmFjayAqLworCisgIHZvaWQgKCpEYXRhT3V0U3RhZ2VDYWxsYmFjaykoCisgICAgICBzdHJ1Y3QgX19QQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwKKyAgICAgIHVpbnQ4X3QgZXBudW0pOyAvKiE8IFVTQiBPVEcgUENEIERhdGEgT1VUIFN0YWdlIGNhbGxiYWNrICAgICAqLworICB2b2lkICgqRGF0YUluU3RhZ2VDYWxsYmFjaykoCisgICAgICBzdHJ1Y3QgX19QQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwKKyAgICAgIHVpbnQ4X3QgZXBudW0pOyAvKiE8IFVTQiBPVEcgUENEIERhdGEgSU4gU3RhZ2UgY2FsbGJhY2sgICAgICAqLworICB2b2lkICgqSVNPT1VUSW5jb21wbGV0ZUNhbGxiYWNrKSgKKyAgICAgIHN0cnVjdCBfX1BDRF9IYW5kbGVUeXBlRGVmICpocGNkLAorICAgICAgdWludDhfdCBlcG51bSk7IC8qITwgVVNCIE9URyBQQ0QgSVNPIE9VVCBJbmNvbXBsZXRlIGNhbGxiYWNrICovCisgIHZvaWQgKCpJU09JTkluY29tcGxldGVDYWxsYmFjaykoCisgICAgICBzdHJ1Y3QgX19QQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwKKyAgICAgIHVpbnQ4X3QgZXBudW0pOyAvKiE8IFVTQiBPVEcgUENEIElTTyBJTiBJbmNvbXBsZXRlIGNhbGxiYWNrICAqLworICB2b2lkICgqQkNEQ2FsbGJhY2spKHN0cnVjdCBfX1BDRF9IYW5kbGVUeXBlRGVmICpocGNkLAorICAgICAgICAgICAgICAgICAgICAgIFBDRF9CQ0RfTXNnVHlwZURlZiBtc2cpOyAvKiE8IFVTQiBPVEcgUENEIEJDRCBjYWxsYmFjayAqLworICB2b2lkICgqTFBNQ2FsbGJhY2spKHN0cnVjdCBfX1BDRF9IYW5kbGVUeXBlRGVmICpocGNkLAorICAgICAgICAgICAgICAgICAgICAgIFBDRF9MUE1fTXNnVHlwZURlZiBtc2cpOyAvKiE8IFVTQiBPVEcgUENEIExQTSBjYWxsYmFjayAqLworCisgIHZvaWQgKCpNc3BJbml0Q2FsbGJhY2spKAorICAgICAgc3RydWN0IF9fUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOyAvKiE8IFVTQiBPVEcgUENEIE1zcCBJbml0IGNhbGxiYWNrICovCisgIHZvaWQgKCpNc3BEZUluaXRDYWxsYmFjaykoCisgICAgICBzdHJ1Y3QgX19QQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7IC8qITwgVVNCIE9URyBQQ0QgTXNwIERlSW5pdCBjYWxsYmFjayAqLworI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30gUENEX0hhbmRsZVR5cGVEZWY7CisKKy8qKgorICogQH0KKyAqLworCisvKiBJbmNsdWRlIFBDRCBIQUwgRXh0ZW5kZWQgbW9kdWxlICovCisjaW5jbHVkZSAic3RtMzJnNHh4X2hhbF9wY2RfZXguaCIKKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUENEX0V4cG9ydGVkX0NvbnN0YW50cyBQQ0QgRXhwb3J0ZWQgQ29uc3RhbnRzCisgKiBAeworICovCisKKy8qKiBAZGVmZ3JvdXAgUENEX1NwZWVkIFBDRCBTcGVlZAorICogQHsKKyAqLworI2RlZmluZSBQQ0RfU1BFRURfRlVMTCBVU0JEX0ZTX1NQRUVECisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBQQ0RfUEhZX01vZHVsZSBQQ0QgUEhZIE1vZHVsZQorICogQHsKKyAqLworI2RlZmluZSBQQ0RfUEhZX1VMUEkgMVUKKyNkZWZpbmUgUENEX1BIWV9FTUJFRERFRCAyVQorI2RlZmluZSBQQ0RfUEhZX1VUTUkgM1UKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFBDRF9FcnJvcl9Db2RlX2RlZmluaXRpb24gUENEIEVycm9yIENvZGUgZGVmaW5pdGlvbgorICogQGJyaWVmICBQQ0QgRXJyb3IgQ29kZSBkZWZpbml0aW9uCisgKiBAeworICovCisjaWYgKFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyNkZWZpbmUgSEFMX1BDRF9FUlJPUl9JTlZBTElEX0NBTExCQUNLIFwKKyAgKDB4MDAwMDAwMTBVKSAvKiE8IEludmFsaWQgQ2FsbGJhY2sgZXJyb3IgICovCisjZW5kaWYgICAgICAgICAgLyogVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyogRXhwb3J0ZWQgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUENEX0V4cG9ydGVkX01hY3JvcyBQQ0QgRXhwb3J0ZWQgTWFjcm9zCisgKiAgQGJyaWVmIG1hY3JvcyB0byBoYW5kbGUgaW50ZXJydXB0cyBhbmQgc3BlY2lmaWMgY2xvY2sgY29uZmlndXJhdGlvbnMKKyAqIEB7CisgKi8KKyNkZWZpbmUgX19IQUxfUENEX0VOQUJMRShfX0hBTkRMRV9fKSBcCisgICh2b2lkKVVTQl9FbmFibGVHbG9iYWxJbnQoKF9fSEFORExFX18pLT5JbnN0YW5jZSkKKyNkZWZpbmUgX19IQUxfUENEX0RJU0FCTEUoX19IQU5ETEVfXykgXAorICAodm9pZClVU0JfRGlzYWJsZUdsb2JhbEludCgoX19IQU5ETEVfXyktPkluc3RhbmNlKQorCisjZGVmaW5lIF9fSEFMX1BDRF9HRVRfRkxBRyhfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAgICAgICAgICAgICBcCisgICgoVVNCX1JlYWRJbnRlcnJ1cHRzKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpICYgKF9fSU5URVJSVVBUX18pKSA9PSBcCisgICAoX19JTlRFUlJVUFRfXykpCisKKyNkZWZpbmUgX19IQUxfUENEX0NMRUFSX0ZMQUcoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgXAorICAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTVFIpICY9ICh1aW50MTZfdCkofihfX0lOVEVSUlVQVF9fKSkpCisKKyNkZWZpbmUgX19IQUxfVVNCX1dBS0VVUF9FWFRJX0VOQUJMRV9JVCgpIEVYVEktPklNUjEgfD0gVVNCX1dBS0VVUF9FWFRJX0xJTkUKKyNkZWZpbmUgX19IQUxfVVNCX1dBS0VVUF9FWFRJX0RJU0FCTEVfSVQoKSBFWFRJLT5JTVIxICY9IH4oVVNCX1dBS0VVUF9FWFRJX0xJTkUpCisKKy8qKgorICogQH0KKyAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFBDRF9FeHBvcnRlZF9GdW5jdGlvbnMgUENEIEV4cG9ydGVkIEZ1bmN0aW9ucworICogQHsKKyAqLworCisvKiBJbml0aWFsaXphdGlvbi9kZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIEBhZGR0b2dyb3VwIFBDRF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZAorICogZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgKiBAeworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX0luaXQoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9EZUluaXQoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOwordm9pZCBIQUxfUENEX01zcEluaXQoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOwordm9pZCBIQUxfUENEX01zcERlSW5pdChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7CisKKyNpZiAoVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorLyoqIEBkZWZncm91cCBIQUxfUENEX0NhbGxiYWNrX0lEX2VudW1lcmF0aW9uX2RlZmluaXRpb24gSEFMIFVTQiBPVEcgUENECisgKiBDYWxsYmFjayBJRCBlbnVtZXJhdGlvbiBkZWZpbml0aW9uCisgKiBAYnJpZWYgIEhBTCBVU0IgT1RHIFBDRCBDYWxsYmFjayBJRCBlbnVtZXJhdGlvbiBkZWZpbml0aW9uCisgKiBAeworICovCit0eXBlZGVmIGVudW0geworICBIQUxfUENEX1NPRl9DQl9JRCA9IDB4MDEsICAgICAgICAvKiE8IFVTQiBQQ0QgU09GIGNhbGxiYWNrIElEICAgICAgICAgICovCisgIEhBTF9QQ0RfU0VUVVBTVEFHRV9DQl9JRCA9IDB4MDIsIC8qITwgVVNCIFBDRCBTZXR1cCBTdGFnZSBjYWxsYmFjayBJRCAgKi8KKyAgSEFMX1BDRF9SRVNFVF9DQl9JRCA9IDB4MDMsICAgICAgLyohPCBVU0IgUENEIFJlc2V0IGNhbGxiYWNrIElEICAgICAgICAqLworICBIQUxfUENEX1NVU1BFTkRfQ0JfSUQgPSAweDA0LCAgICAvKiE8IFVTQiBQQ0QgU3VzcGVuZCBjYWxsYmFjayBJRCAgICAgICovCisgIEhBTF9QQ0RfUkVTVU1FX0NCX0lEID0gMHgwNSwgICAgIC8qITwgVVNCIFBDRCBSZXN1bWUgY2FsbGJhY2sgSUQgICAgICAgKi8KKyAgSEFMX1BDRF9DT05ORUNUX0NCX0lEID0gMHgwNiwgICAgLyohPCBVU0IgUENEIENvbm5lY3QgY2FsbGJhY2sgSUQgICAgICAqLworICBIQUxfUENEX0RJU0NPTk5FQ1RfQ0JfSUQgPSAweDA3LCAvKiE8IFVTQiBQQ0QgRGlzY29ubmVjdCBjYWxsYmFjayBJRCAgICovCisKKyAgSEFMX1BDRF9NU1BJTklUX0NCX0lEID0gMHgwOCwgIC8qITwgVVNCIFBDRCBNc3BJbml0IGNhbGxiYWNrIElEICAgICAgKi8KKyAgSEFMX1BDRF9NU1BERUlOSVRfQ0JfSUQgPSAweDA5IC8qITwgVVNCIFBDRCBNc3BEZUluaXQgY2FsbGJhY2sgSUQgICAgKi8KKworfSBIQUxfUENEX0NhbGxiYWNrSURUeXBlRGVmOworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1BDRF9DYWxsYmFja19wb2ludGVyX2RlZmluaXRpb24gSEFMIFVTQiBPVEcgUENEIENhbGxiYWNrCisgKiBwb2ludGVyIGRlZmluaXRpb24KKyAqIEBicmllZiAgSEFMIFVTQiBPVEcgUENEIENhbGxiYWNrIHBvaW50ZXIgZGVmaW5pdGlvbgorICogQHsKKyAqLworCit0eXBlZGVmIHZvaWQgKCpwUENEX0NhbGxiYWNrVHlwZURlZikoCisgICAgUENEX0hhbmRsZVR5cGVEZWYKKyAgICAgICAgKmhwY2QpOyAvKiE8IHBvaW50ZXIgdG8gYSBjb21tb24gVVNCIE9URyBQQ0QgY2FsbGJhY2sgZnVuY3Rpb24gICovCit0eXBlZGVmIHZvaWQgKCpwUENEX0RhdGFPdXRTdGFnZUNhbGxiYWNrVHlwZURlZikoCisgICAgUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsCisgICAgdWludDhfdCBlcG51bSk7IC8qITwgcG9pbnRlciB0byBVU0IgT1RHIFBDRCBEYXRhIE9VVCBTdGFnZSBjYWxsYmFjayAgICAgKi8KK3R5cGVkZWYgdm9pZCAoKnBQQ0RfRGF0YUluU3RhZ2VDYWxsYmFja1R5cGVEZWYpKAorICAgIFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLAorICAgIHVpbnQ4X3QgZXBudW0pOyAvKiE8IHBvaW50ZXIgdG8gVVNCIE9URyBQQ0QgRGF0YSBJTiBTdGFnZSBjYWxsYmFjayAgICAgICovCit0eXBlZGVmIHZvaWQgKCpwUENEX0lzb091dEluY3BsdENhbGxiYWNrVHlwZURlZikoCisgICAgUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsCisgICAgdWludDhfdCBlcG51bSk7IC8qITwgcG9pbnRlciB0byBVU0IgT1RHIFBDRCBJU08gT1VUIEluY29tcGxldGUgY2FsbGJhY2sgKi8KK3R5cGVkZWYgdm9pZCAoKnBQQ0RfSXNvSW5JbmNwbHRDYWxsYmFja1R5cGVEZWYpKAorICAgIFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLAorICAgIHVpbnQ4X3QgZXBudW0pOyAvKiE8IHBvaW50ZXIgdG8gVVNCIE9URyBQQ0QgSVNPIElOIEluY29tcGxldGUgY2FsbGJhY2sgICovCit0eXBlZGVmIHZvaWQgKCpwUENEX0xwbUNhbGxiYWNrVHlwZURlZikoCisgICAgUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsCisgICAgUENEX0xQTV9Nc2dUeXBlRGVmIG1zZyk7IC8qITwgcG9pbnRlciB0byBVU0IgT1RHIFBDRCBMUE0gY2FsbGJhY2sgKi8KK3R5cGVkZWYgdm9pZCAoKnBQQ0RfQmNkQ2FsbGJhY2tUeXBlRGVmKSgKKyAgICBQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwKKyAgICBQQ0RfQkNEX01zZ1R5cGVEZWYgbXNnKTsgLyohPCBwb2ludGVyIHRvIFVTQiBPVEcgUENEIEJDRCBjYWxsYmFjayAqLworCisvKioKKyAqIEB9CisgKi8KKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9SZWdpc3RlckNhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9QQ0RfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUENEX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spOworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1VuUmVnaXN0ZXJDYWxsYmFjaygKKyAgICBQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgSEFMX1BDRF9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKTsKKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9SZWdpc3RlckRhdGFPdXRTdGFnZUNhbGxiYWNrKAorICAgIFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCBwUENEX0RhdGFPdXRTdGFnZUNhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spOworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1VuUmVnaXN0ZXJEYXRhT3V0U3RhZ2VDYWxsYmFjaygKKyAgICBQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7CisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfUmVnaXN0ZXJEYXRhSW5TdGFnZUNhbGxiYWNrKAorICAgIFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCBwUENEX0RhdGFJblN0YWdlQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjayk7CisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfVW5SZWdpc3RlckRhdGFJblN0YWdlQ2FsbGJhY2soCisgICAgUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1JlZ2lzdGVySXNvT3V0SW5jcGx0Q2FsbGJhY2soCisgICAgUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHBQQ0RfSXNvT3V0SW5jcGx0Q2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjayk7CisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfVW5SZWdpc3Rlcklzb091dEluY3BsdENhbGxiYWNrKAorICAgIFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsKKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9SZWdpc3Rlcklzb0luSW5jcGx0Q2FsbGJhY2soCisgICAgUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHBQQ0RfSXNvSW5JbmNwbHRDYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKTsKKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9VblJlZ2lzdGVySXNvSW5JbmNwbHRDYWxsYmFjaygKKyAgICBQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7CisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfUmVnaXN0ZXJCY2RDYWxsYmFjaygKKyAgICBQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgcFBDRF9CY2RDYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfVW5SZWdpc3RlckJjZENhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsKKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9SZWdpc3RlckxwbUNhbGxiYWNrKAorICAgIFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCBwUENEX0xwbUNhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9VblJlZ2lzdGVyTHBtQ2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOworI2VuZGlmIC8qIFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyAqLworLyoqCisgKiBAfQorICovCisKKy8qIEkvTyBvcGVyYXRpb24gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBOb24tQmxvY2tpbmcgbW9kZTogSW50ZXJydXB0ICovCisvKiogQGFkZHRvZ3JvdXAgUENEX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSW5wdXQgYW5kIE91dHB1dCBvcGVyYXRpb24KKyAqIGZ1bmN0aW9ucworICogQHsKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9TdGFydChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1N0b3AoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOwordm9pZCBIQUxfUENEX0lSUUhhbmRsZXIoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOworCit2b2lkIEhBTF9QQ0RfU09GQ2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOwordm9pZCBIQUxfUENEX1NldHVwU3RhZ2VDYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7Cit2b2lkIEhBTF9QQ0RfUmVzZXRDYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7Cit2b2lkIEhBTF9QQ0RfU3VzcGVuZENhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsKK3ZvaWQgSEFMX1BDRF9SZXN1bWVDYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7Cit2b2lkIEhBTF9QQ0RfQ29ubmVjdENhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsKK3ZvaWQgSEFMX1BDRF9EaXNjb25uZWN0Q2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOworCit2b2lkIEhBTF9QQ0RfRGF0YU91dFN0YWdlQ2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHVpbnQ4X3QgZXBudW0pOwordm9pZCBIQUxfUENEX0RhdGFJblN0YWdlQ2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHVpbnQ4X3QgZXBudW0pOwordm9pZCBIQUxfUENEX0lTT09VVEluY29tcGxldGVDYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDhfdCBlcG51bSk7Cit2b2lkIEhBTF9QQ0RfSVNPSU5JbmNvbXBsZXRlQ2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHVpbnQ4X3QgZXBudW0pOworLyoqCisgKiBAfQorICovCisKKy8qIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogQGFkZHRvZ3JvdXAgUENEX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICogQHsKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9EZXZDb25uZWN0KFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfRGV2RGlzY29ubmVjdChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1NldEFkZHJlc3MoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHVpbnQ4X3QgYWRkcmVzcyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX0VQX09wZW4oUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHVpbnQ4X3QgZXBfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBlcF9tcHMsIHVpbnQ4X3QgZXBfdHlwZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX0VQX0Nsb3NlKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCB1aW50OF90IGVwX2FkZHIpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9FUF9SZWNlaXZlKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCB1aW50OF90IGVwX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcEJ1ZiwgdWludDMyX3QgbGVuKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfRVBfVHJhbnNtaXQoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHVpbnQ4X3QgZXBfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcEJ1ZiwgdWludDMyX3QgbGVuKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfRVBfU2V0U3RhbGwoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHVpbnQ4X3QgZXBfYWRkcik7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX0VQX0NsclN0YWxsKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCB1aW50OF90IGVwX2FkZHIpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9FUF9GbHVzaChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDhfdCBlcF9hZGRyKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfRVBfQWJvcnQoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHVpbnQ4X3QgZXBfYWRkcik7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX0FjdGl2YXRlUmVtb3RlV2FrZXVwKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfRGVBY3RpdmF0ZVJlbW90ZVdha2V1cChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7Cit1aW50MzJfdCBIQUxfUENEX0VQX0dldFJ4Q291bnQoUENEX0hhbmRsZVR5cGVEZWYgY29uc3QgKmhwY2QsIHVpbnQ4X3QgZXBfYWRkcik7CisvKioKKyAqIEB9CisgKi8KKworLyogUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBAYWRkdG9ncm91cCBQQ0RfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNCBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucworICogQHsKKyAqLworUENEX1N0YXRlVHlwZURlZiBIQUxfUENEX0dldFN0YXRlKFBDRF9IYW5kbGVUeXBlRGVmIGNvbnN0ICpocGNkKTsKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUENEX1ByaXZhdGVfQ29uc3RhbnRzIFBDRCBQcml2YXRlIENvbnN0YW50cworICogQHsKKyAqLworLyoqIEBkZWZncm91cCBVU0JfRVhUSV9MaW5lX0ludGVycnVwdCBVU0IgRVhUSSBsaW5lIGludGVycnVwdAorICogQHsKKyAqLworCisjZGVmaW5lIFVTQl9XQUtFVVBfRVhUSV9MSU5FIFwKKyAgKDB4MVUgPDwgMTgpIC8qITwgVVNCIEZTIEVYVEkgTGluZSBXYWtlVXAgSW50ZXJydXB0ICovCisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFBDRF9FUDBfTVBTIFBDRCBFUDAgTVBTCisgKiBAeworICovCisjZGVmaW5lIFBDRF9FUDBNUFNfNjQgRVBfTVBTXzY0CisjZGVmaW5lIFBDRF9FUDBNUFNfMzIgRVBfTVBTXzMyCisjZGVmaW5lIFBDRF9FUDBNUFNfMTYgRVBfTVBTXzE2CisjZGVmaW5lIFBDRF9FUDBNUFNfMDggRVBfTVBTXzgKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFBDRF9FTkRQIFBDRCBFTkRQCisgKiBAeworICovCisjZGVmaW5lIFBDRF9FTkRQMCAwVQorI2RlZmluZSBQQ0RfRU5EUDEgMVUKKyNkZWZpbmUgUENEX0VORFAyIDJVCisjZGVmaW5lIFBDRF9FTkRQMyAzVQorI2RlZmluZSBQQ0RfRU5EUDQgNFUKKyNkZWZpbmUgUENEX0VORFA1IDVVCisjZGVmaW5lIFBDRF9FTkRQNiA2VQorI2RlZmluZSBQQ0RfRU5EUDcgN1UKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFBDRF9FTkRQX0tpbmQgUENEIEVuZHBvaW50IEtpbmQKKyAqIEB7CisgKi8KKyNkZWZpbmUgUENEX1NOR19CVUYgMFUKKyNkZWZpbmUgUENEX0RCTF9CVUYgMVUKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUENEX1ByaXZhdGVfTWFjcm9zIFBDRCBQcml2YXRlIE1hY3JvcworICogQHsKKyAqLworCisvKioqKioqKioqKioqKioqKioqKiogIEJpdCBkZWZpbml0aW9uIGZvciBVU0JfQ09VTlRuX1JYIHJlZ2lzdGVyICAqKioqKioqKioqKioqLworI2RlZmluZSBVU0JfQ05UUlhfTkJMS19NU0sgKDB4MUZVIDw8IDEwKQorI2RlZmluZSBVU0JfQ05UUlhfQkxTSVpFICgweDFVIDw8IDE1KQorCisvKiBTZXRFTkRQT0lOVCAqLworI2RlZmluZSBQQ0RfU0VUX0VORFBPSU5UKFVTQngsIGJFcE51bSwgd1JlZ1ZhbHVlKSBcCisgICgqKF9fSU8gdWludDE2X3QgKikoJihVU0J4KS0+RVAwUiArICgoYkVwTnVtKSAqIDJVKSkgPSAodWludDE2X3QpKHdSZWdWYWx1ZSkpCisKKy8qIEdldEVORFBPSU5UICovCisjZGVmaW5lIFBDRF9HRVRfRU5EUE9JTlQoVVNCeCwgYkVwTnVtKSBcCisgICgqKF9fSU8gdWludDE2X3QgKikoJihVU0J4KS0+RVAwUiArICgoYkVwTnVtKSAqIDJVKSkpCisKKy8qKgorICogQGJyaWVmICBzZXRzIHRoZSB0eXBlIGluIHRoZSBlbmRwb2ludCByZWdpc3RlcihiaXRzIEVQX1RZUEVbMTowXSkKKyAqIEBwYXJhbSAgVVNCeCBVU0IgcGVyaXBoZXJhbCBpbnN0YW5jZSByZWdpc3RlciBhZGRyZXNzLgorICogQHBhcmFtICBiRXBOdW0gRW5kcG9pbnQgTnVtYmVyLgorICogQHBhcmFtICB3VHlwZSBFbmRwb2ludCBUeXBlLgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgUENEX1NFVF9FUFRZUEUoVVNCeCwgYkVwTnVtLCB3VHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChQQ0RfU0VUX0VORFBPSU5UKChVU0J4KSwgKGJFcE51bSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAoKFBDRF9HRVRfRU5EUE9JTlQoKFVTQngpLCAoYkVwTnVtKSkgJiBVU0JfRVBfVF9NQVNLKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICh3VHlwZSkgfCBVU0JfRVBfQ1RSX1RYIHwgVVNCX0VQX0NUUl9SWCkpKQorCisvKioKKyAqIEBicmllZiAgZ2V0cyB0aGUgdHlwZSBpbiB0aGUgZW5kcG9pbnQgcmVnaXN0ZXIoYml0cyBFUF9UWVBFWzE6MF0pCisgKiBAcGFyYW0gIFVTQnggVVNCIHBlcmlwaGVyYWwgaW5zdGFuY2UgcmVnaXN0ZXIgYWRkcmVzcy4KKyAqIEBwYXJhbSAgYkVwTnVtIEVuZHBvaW50IE51bWJlci4KKyAqIEByZXR2YWwgRW5kcG9pbnQgVHlwZQorICovCisjZGVmaW5lIFBDRF9HRVRfRVBUWVBFKFVTQngsIGJFcE51bSkgXAorICAoUENEX0dFVF9FTkRQT0lOVCgoVVNCeCksIChiRXBOdW0pKSAmIFVTQl9FUF9UX0ZJRUxEKQorCisvKioKKyAqIEBicmllZiBmcmVlIGJ1ZmZlciB1c2VkIGZyb20gdGhlIGFwcGxpY2F0aW9uIHJlYWxpemluZyBpdCB0byB0aGUgbGluZQorICogICAgICAgICB0b2dnbGVzIGJpdCBTV19CVUYgaW4gdGhlIGRvdWJsZSBidWZmZXJlZCBlbmRwb2ludCByZWdpc3RlcgorICogQHBhcmFtIFVTQnggVVNCIGRldmljZS4KKyAqIEBwYXJhbSAgIGJFcE51bSwgYkRpcgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgUENEX0ZSRUVfVVNFUl9CVUZGRVIoVVNCeCwgYkVwTnVtLCBiRGlyKSBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoYkRpcikgPT0gMFUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIC8qIE9VVCBkb3VibGUgYnVmZmVyZWQgZW5kcG9pbnQgKi8gICAgICAgICBcCisgICAgICBQQ0RfVFhfRFRPRygoVVNCeCksIChiRXBOdW0pKTsgICAgICAgICAgICAgXAorICAgIH0gZWxzZSBpZiAoKGJEaXIpID09IDFVKSB7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIC8qIElOIGRvdWJsZSBidWZmZXJlZCBlbmRwb2ludCAqLyAgICAgICAgICBcCisgICAgICBQQ0RfUlhfRFRPRygoVVNCeCksIChiRXBOdW0pKTsgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworLyoqCisgKiBAYnJpZWYgIHNldHMgdGhlIHN0YXR1cyBmb3IgdHggdHJhbnNmZXIgKGJpdHMgU1RBVF9UWFsxOjBdKS4KKyAqIEBwYXJhbSAgVVNCeCBVU0IgcGVyaXBoZXJhbCBpbnN0YW5jZSByZWdpc3RlciBhZGRyZXNzLgorICogQHBhcmFtICBiRXBOdW0gRW5kcG9pbnQgTnVtYmVyLgorICogQHBhcmFtICB3U3RhdGUgbmV3IHN0YXRlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBQQ0RfU0VUX0VQX1RYX1NUQVRVUyhVU0J4LCBiRXBOdW0sIHdTdGF0ZSkgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50MTZfdCBfd1JlZ1ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX3dSZWdWYWwgPSBQQ0RfR0VUX0VORFBPSU5UKChVU0J4KSwgKGJFcE51bSkpICYgVVNCX0VQVFhfRFRPR01BU0s7IFwKKyAgICAvKiB0b2dnbGUgZmlyc3QgYml0ID8gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoVVNCX0VQVFhfRFRPRzEgJiAod1N0YXRlKSkgIT0gMFUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBfd1JlZ1ZhbCBePSBVU0JfRVBUWF9EVE9HMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIHRvZ2dsZSBzZWNvbmQgYml0ID8gICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKChVU0JfRVBUWF9EVE9HMiAmICh3U3RhdGUpKSAhPSAwVSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIF93UmVnVmFsIF49IFVTQl9FUFRYX0RUT0cyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUENEX1NFVF9FTkRQT0lOVCgoVVNCeCksIChiRXBOdW0pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIChfd1JlZ1ZhbCB8IFVTQl9FUF9DVFJfUlggfCBVU0JfRVBfQ1RSX1RYKSk7ICAgICAgXAorICB9IHdoaWxlICgwKSAvKiBQQ0RfU0VUX0VQX1RYX1NUQVRVUyAqLworCisvKioKKyAqIEBicmllZiAgc2V0cyB0aGUgc3RhdHVzIGZvciByeCB0cmFuc2ZlciAoYml0cyBTVEFUX1RYWzE6MF0pCisgKiBAcGFyYW0gIFVTQnggVVNCIHBlcmlwaGVyYWwgaW5zdGFuY2UgcmVnaXN0ZXIgYWRkcmVzcy4KKyAqIEBwYXJhbSAgYkVwTnVtIEVuZHBvaW50IE51bWJlci4KKyAqIEBwYXJhbSAgd1N0YXRlIG5ldyBzdGF0ZQorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgUENEX1NFVF9FUF9SWF9TVEFUVVMoVVNCeCwgYkVwTnVtLCB3U3RhdGUpICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDE2X3QgX3dSZWdWYWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF93UmVnVmFsID0gUENEX0dFVF9FTkRQT0lOVCgoVVNCeCksIChiRXBOdW0pKSAmIFVTQl9FUFJYX0RUT0dNQVNLOyBcCisgICAgLyogdG9nZ2xlIGZpcnN0IGJpdCA/ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKFVTQl9FUFJYX0RUT0cxICYgKHdTdGF0ZSkpICE9IDBVKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgX3dSZWdWYWwgXj0gVVNCX0VQUlhfRFRPRzE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiB0b2dnbGUgc2Vjb25kIGJpdCA/ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoVVNCX0VQUlhfRFRPRzIgJiAod1N0YXRlKSkgIT0gMFUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBfd1JlZ1ZhbCBePSBVU0JfRVBSWF9EVE9HMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFBDRF9TRVRfRU5EUE9JTlQoKFVTQngpLCAoYkVwTnVtKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAoX3dSZWdWYWwgfCBVU0JfRVBfQ1RSX1JYIHwgVVNCX0VQX0NUUl9UWCkpOyAgICAgIFwKKyAgfSB3aGlsZSAoMCkgLyogUENEX1NFVF9FUF9SWF9TVEFUVVMgKi8KKworLyoqCisgKiBAYnJpZWYgIHNldHMgdGhlIHN0YXR1cyBmb3IgcnggJiB0eCAoYml0cyBTVEFUX1RYWzE6MF0gJiBTVEFUX1JYWzE6MF0pCisgKiBAcGFyYW0gIFVTQnggVVNCIHBlcmlwaGVyYWwgaW5zdGFuY2UgcmVnaXN0ZXIgYWRkcmVzcy4KKyAqIEBwYXJhbSAgYkVwTnVtIEVuZHBvaW50IE51bWJlci4KKyAqIEBwYXJhbSAgd1N0YXRlcnggbmV3IHN0YXRlLgorICogQHBhcmFtICB3U3RhdGV0eCBuZXcgc3RhdGUuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBQQ0RfU0VUX0VQX1RYUlhfU1RBVFVTKFVTQngsIGJFcE51bSwgd1N0YXRlcngsIHdTdGF0ZXR4KSAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQxNl90IF93UmVnVmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF93UmVnVmFsID0gUENEX0dFVF9FTkRQT0lOVCgoVVNCeCksIChiRXBOdW0pKSAmICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgKFVTQl9FUFJYX0RUT0dNQVNLIHwgVVNCX0VQVFhfU1RBVCk7ICAgICAgICAgICAgICAgXAorICAgIC8qIHRvZ2dsZSBmaXJzdCBiaXQgPyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoVVNCX0VQUlhfRFRPRzEgJiAod1N0YXRlcngpKSAhPSAwVSkgeyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgX3dSZWdWYWwgXj0gVVNCX0VQUlhfRFRPRzE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIHRvZ2dsZSBzZWNvbmQgYml0ID8gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoVVNCX0VQUlhfRFRPRzIgJiAod1N0YXRlcngpKSAhPSAwVSkgeyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgX3dSZWdWYWwgXj0gVVNCX0VQUlhfRFRPRzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIHRvZ2dsZSBmaXJzdCBiaXQgPyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoVVNCX0VQVFhfRFRPRzEgJiAod1N0YXRldHgpKSAhPSAwVSkgeyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgX3dSZWdWYWwgXj0gVVNCX0VQVFhfRFRPRzE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIHRvZ2dsZSBzZWNvbmQgYml0ID8gICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoVVNCX0VQVFhfRFRPRzIgJiAod1N0YXRldHgpKSAhPSAwVSkgeyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgX3dSZWdWYWwgXj0gVVNCX0VQVFhfRFRPRzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFBDRF9TRVRfRU5EUE9JTlQoKFVTQngpLCAoYkVwTnVtKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgKF93UmVnVmFsIHwgVVNCX0VQX0NUUl9SWCB8IFVTQl9FUF9DVFJfVFgpKTsgXAorICB9IHdoaWxlICgwKSAvKiBQQ0RfU0VUX0VQX1RYUlhfU1RBVFVTICovCisKKy8qKgorICogQGJyaWVmICBnZXRzIHRoZSBzdGF0dXMgZm9yIHR4L3J4IHRyYW5zZmVyIChiaXRzIFNUQVRfVFhbMTowXQorICogICAgICAgICAvU1RBVF9SWFsxOjBdKQorICogQHBhcmFtICBVU0J4IFVTQiBwZXJpcGhlcmFsIGluc3RhbmNlIHJlZ2lzdGVyIGFkZHJlc3MuCisgKiBAcGFyYW0gIGJFcE51bSBFbmRwb2ludCBOdW1iZXIuCisgKiBAcmV0dmFsIHN0YXR1cworICovCisjZGVmaW5lIFBDRF9HRVRfRVBfVFhfU1RBVFVTKFVTQngsIGJFcE51bSkgXAorICAoKHVpbnQxNl90KVBDRF9HRVRfRU5EUE9JTlQoKFVTQngpLCAoYkVwTnVtKSkgJiBVU0JfRVBUWF9TVEFUKQorI2RlZmluZSBQQ0RfR0VUX0VQX1JYX1NUQVRVUyhVU0J4LCBiRXBOdW0pIFwKKyAgKCh1aW50MTZfdClQQ0RfR0VUX0VORFBPSU5UKChVU0J4KSwgKGJFcE51bSkpICYgVVNCX0VQUlhfU1RBVCkKKworLyoqCisgKiBAYnJpZWYgIHNldHMgZGlyZWN0bHkgdGhlIFZBTElEIHR4L3J4LXN0YXR1cyBpbnRvIHRoZSBlbmRwb2ludCByZWdpc3RlcgorICogQHBhcmFtICBVU0J4IFVTQiBwZXJpcGhlcmFsIGluc3RhbmNlIHJlZ2lzdGVyIGFkZHJlc3MuCisgKiBAcGFyYW0gIGJFcE51bSBFbmRwb2ludCBOdW1iZXIuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBQQ0RfU0VUX0VQX1RYX1ZBTElEKFVTQngsIGJFcE51bSkgXAorICAoUENEX1NFVF9FUF9UWF9TVEFUVVMoKFVTQngpLCAoYkVwTnVtKSwgVVNCX0VQX1RYX1ZBTElEKSkKKyNkZWZpbmUgUENEX1NFVF9FUF9SWF9WQUxJRChVU0J4LCBiRXBOdW0pIFwKKyAgKFBDRF9TRVRfRVBfUlhfU1RBVFVTKChVU0J4KSwgKGJFcE51bSksIFVTQl9FUF9SWF9WQUxJRCkpCisKKy8qKgorICogQGJyaWVmICBjaGVja3Mgc3RhbGwgY29uZGl0aW9uIGluIGFuIGVuZHBvaW50LgorICogQHBhcmFtICBVU0J4IFVTQiBwZXJpcGhlcmFsIGluc3RhbmNlIHJlZ2lzdGVyIGFkZHJlc3MuCisgKiBAcGFyYW0gIGJFcE51bSBFbmRwb2ludCBOdW1iZXIuCisgKiBAcmV0dmFsIFRSVUUgPSBlbmRwb2ludCBpbiBzdGFsbCBjb25kaXRpb24uCisgKi8KKyNkZWZpbmUgUENEX0dFVF9FUF9UWF9TVEFMTF9TVEFUVVMoVVNCeCwgYkVwTnVtKSBcCisgIChQQ0RfR0VUX0VQX1RYX1NUQVRVUygoVVNCeCksIChiRXBOdW0pKSA9PSBVU0JfRVBfVFhfU1RBTEwpCisjZGVmaW5lIFBDRF9HRVRfRVBfUlhfU1RBTExfU1RBVFVTKFVTQngsIGJFcE51bSkgXAorICAoUENEX0dFVF9FUF9SWF9TVEFUVVMoKFVTQngpLCAoYkVwTnVtKSkgPT0gVVNCX0VQX1JYX1NUQUxMKQorCisvKioKKyAqIEBicmllZiAgc2V0ICYgY2xlYXIgRVBfS0lORCBiaXQuCisgKiBAcGFyYW0gIFVTQnggVVNCIHBlcmlwaGVyYWwgaW5zdGFuY2UgcmVnaXN0ZXIgYWRkcmVzcy4KKyAqIEBwYXJhbSAgYkVwTnVtIEVuZHBvaW50IE51bWJlci4KKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIFBDRF9TRVRfRVBfS0lORChVU0J4LCBiRXBOdW0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQxNl90IF93UmVnVmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfd1JlZ1ZhbCA9IFBDRF9HRVRfRU5EUE9JTlQoKFVTQngpLCAoYkVwTnVtKSkgJiBVU0JfRVBSRUdfTUFTSzsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUENEX1NFVF9FTkRQT0lOVCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKFVTQngpLCAoYkVwTnVtKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoX3dSZWdWYWwgfCBVU0JfRVBfQ1RSX1JYIHwgVVNCX0VQX0NUUl9UWCB8IFVTQl9FUF9LSU5EKSk7ICBcCisgIH0gd2hpbGUgKDApIC8qIFBDRF9TRVRfRVBfS0lORCAqLworCisjZGVmaW5lIFBDRF9DTEVBUl9FUF9LSU5EKFVTQngsIGJFcE51bSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDE2X3QgX3dSZWdWYWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX3dSZWdWYWwgPSBQQ0RfR0VUX0VORFBPSU5UKChVU0J4KSwgKGJFcE51bSkpICYgVVNCX0VQS0lORF9NQVNLOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUENEX1NFVF9FTkRQT0lOVCgoVVNCeCksIChiRXBOdW0pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAoX3dSZWdWYWwgfCBVU0JfRVBfQ1RSX1JYIHwgVVNCX0VQX0NUUl9UWCkpOyAgICBcCisgIH0gd2hpbGUgKDApIC8qIFBDRF9DTEVBUl9FUF9LSU5EICovCisKKy8qKgorICogQGJyaWVmICBTZXRzL2NsZWFycyBkaXJlY3RseSBTVEFUVVNfT1VUIGJpdCBpbiB0aGUgZW5kcG9pbnQgcmVnaXN0ZXIuCisgKiBAcGFyYW0gIFVTQnggVVNCIHBlcmlwaGVyYWwgaW5zdGFuY2UgcmVnaXN0ZXIgYWRkcmVzcy4KKyAqIEBwYXJhbSAgYkVwTnVtIEVuZHBvaW50IE51bWJlci4KKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIFBDRF9TRVRfT1VUX1NUQVRVUyhVU0J4LCBiRXBOdW0pIFBDRF9TRVRfRVBfS0lORCgoVVNCeCksIChiRXBOdW0pKQorI2RlZmluZSBQQ0RfQ0xFQVJfT1VUX1NUQVRVUyhVU0J4LCBiRXBOdW0pIFBDRF9DTEVBUl9FUF9LSU5EKChVU0J4KSwgKGJFcE51bSkpCisKKy8qKgorICogQGJyaWVmICBTZXRzL2NsZWFycyBkaXJlY3RseSBFUF9LSU5EIGJpdCBpbiB0aGUgZW5kcG9pbnQgcmVnaXN0ZXIuCisgKiBAcGFyYW0gIFVTQnggVVNCIHBlcmlwaGVyYWwgaW5zdGFuY2UgcmVnaXN0ZXIgYWRkcmVzcy4KKyAqIEBwYXJhbSAgYkVwTnVtIEVuZHBvaW50IE51bWJlci4KKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIFBDRF9TRVRfQlVMS19FUF9EQlVGKFVTQngsIGJFcE51bSkgUENEX1NFVF9FUF9LSU5EKChVU0J4KSwgKGJFcE51bSkpCisjZGVmaW5lIFBDRF9DTEVBUl9CVUxLX0VQX0RCVUYoVVNCeCwgYkVwTnVtKSBQQ0RfQ0xFQVJfRVBfS0lORCgoVVNCeCksIChiRXBOdW0pKQorCisvKioKKyAqIEBicmllZiAgQ2xlYXJzIGJpdCBDVFJfUlggLyBDVFJfVFggaW4gdGhlIGVuZHBvaW50IHJlZ2lzdGVyLgorICogQHBhcmFtICBVU0J4IFVTQiBwZXJpcGhlcmFsIGluc3RhbmNlIHJlZ2lzdGVyIGFkZHJlc3MuCisgKiBAcGFyYW0gIGJFcE51bSBFbmRwb2ludCBOdW1iZXIuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBQQ0RfQ0xFQVJfUlhfRVBfQ1RSKFVTQngsIGJFcE51bSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDE2X3QgX3dSZWdWYWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfd1JlZ1ZhbCA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFBDRF9HRVRfRU5EUE9JTlQoKFVTQngpLCAoYkVwTnVtKSkgJiAoMHg3RkZGVSAmIFVTQl9FUFJFR19NQVNLKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBQQ0RfU0VUX0VORFBPSU5UKChVU0J4KSwgKGJFcE51bSksIChfd1JlZ1ZhbCB8IFVTQl9FUF9DVFJfVFgpKTsgICAgICBcCisgIH0gd2hpbGUgKDApIC8qIFBDRF9DTEVBUl9SWF9FUF9DVFIgKi8KKworI2RlZmluZSBQQ0RfQ0xFQVJfVFhfRVBfQ1RSKFVTQngsIGJFcE51bSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDE2X3QgX3dSZWdWYWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfd1JlZ1ZhbCA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFBDRF9HRVRfRU5EUE9JTlQoKFVTQngpLCAoYkVwTnVtKSkgJiAoMHhGRjdGVSAmIFVTQl9FUFJFR19NQVNLKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBQQ0RfU0VUX0VORFBPSU5UKChVU0J4KSwgKGJFcE51bSksIChfd1JlZ1ZhbCB8IFVTQl9FUF9DVFJfUlgpKTsgICAgICBcCisgIH0gd2hpbGUgKDApIC8qIFBDRF9DTEVBUl9UWF9FUF9DVFIgKi8KKworLyoqCisgKiBAYnJpZWYgIFRvZ2dsZXMgRFRPR19SWCAvIERUT0dfVFggYml0IGluIHRoZSBlbmRwb2ludCByZWdpc3Rlci4KKyAqIEBwYXJhbSAgVVNCeCBVU0IgcGVyaXBoZXJhbCBpbnN0YW5jZSByZWdpc3RlciBhZGRyZXNzLgorICogQHBhcmFtICBiRXBOdW0gRW5kcG9pbnQgTnVtYmVyLgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgUENEX1JYX0RUT0coVVNCeCwgYkVwTnVtKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50MTZfdCBfd0VQVmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfd0VQVmFsID0gUENEX0dFVF9FTkRQT0lOVCgoVVNCeCksIChiRXBOdW0pKSAmIFVTQl9FUFJFR19NQVNLOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBQQ0RfU0VUX0VORFBPSU5UKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKFVTQngpLCAoYkVwTnVtKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKF93RVBWYWwgfCBVU0JfRVBfQ1RSX1JYIHwgVVNCX0VQX0NUUl9UWCB8IFVTQl9FUF9EVE9HX1JYKSk7IFwKKyAgfSB3aGlsZSAoMCkgLyogUENEX1JYX0RUT0cgKi8KKworI2RlZmluZSBQQ0RfVFhfRFRPRyhVU0J4LCBiRXBOdW0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQxNl90IF93RVBWYWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF93RVBWYWwgPSBQQ0RfR0VUX0VORFBPSU5UKChVU0J4KSwgKGJFcE51bSkpICYgVVNCX0VQUkVHX01BU0s7ICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFBDRF9TRVRfRU5EUE9JTlQoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoVVNCeCksIChiRXBOdW0pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoX3dFUFZhbCB8IFVTQl9FUF9DVFJfUlggfCBVU0JfRVBfQ1RSX1RYIHwgVVNCX0VQX0RUT0dfVFgpKTsgXAorICB9IHdoaWxlICgwKSAvKiBQQ0RfVFhfRFRPRyAqLworLyoqCisgKiBAYnJpZWYgIENsZWFycyBEVE9HX1JYIC8gRFRPR19UWCBiaXQgaW4gdGhlIGVuZHBvaW50IHJlZ2lzdGVyLgorICogQHBhcmFtICBVU0J4IFVTQiBwZXJpcGhlcmFsIGluc3RhbmNlIHJlZ2lzdGVyIGFkZHJlc3MuCisgKiBAcGFyYW0gIGJFcE51bSBFbmRwb2ludCBOdW1iZXIuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBQQ0RfQ0xFQVJfUlhfRFRPRyhVU0J4LCBiRXBOdW0pICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQxNl90IF93UmVnVmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF93UmVnVmFsID0gUENEX0dFVF9FTkRQT0lOVCgoVVNCeCksIChiRXBOdW0pKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoX3dSZWdWYWwgJiBVU0JfRVBfRFRPR19SWCkgIT0gMFUpIHsgICAgICAgXAorICAgICAgUENEX1JYX0RUT0coKFVTQngpLCAoYkVwTnVtKSk7ICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKSAvKiBQQ0RfQ0xFQVJfUlhfRFRPRyAqLworCisjZGVmaW5lIFBDRF9DTEVBUl9UWF9EVE9HKFVTQngsIGJFcE51bSkgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDE2X3QgX3dSZWdWYWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX3dSZWdWYWwgPSBQQ0RfR0VUX0VORFBPSU5UKChVU0J4KSwgKGJFcE51bSkpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKChfd1JlZ1ZhbCAmIFVTQl9FUF9EVE9HX1RYKSAhPSAwVSkgeyAgICAgICBcCisgICAgICBQQ0RfVFhfRFRPRygoVVNCeCksIChiRXBOdW0pKTsgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApIC8qIFBDRF9DTEVBUl9UWF9EVE9HICovCisKKy8qKgorICogQGJyaWVmICBTZXRzIGFkZHJlc3MgaW4gYW4gZW5kcG9pbnQgcmVnaXN0ZXIuCisgKiBAcGFyYW0gIFVTQnggVVNCIHBlcmlwaGVyYWwgaW5zdGFuY2UgcmVnaXN0ZXIgYWRkcmVzcy4KKyAqIEBwYXJhbSAgYkVwTnVtIEVuZHBvaW50IE51bWJlci4KKyAqIEBwYXJhbSAgYkFkZHIgQWRkcmVzcy4KKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIFBDRF9TRVRfRVBfQUREUkVTUyhVU0J4LCBiRXBOdW0sIGJBZGRyKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50MTZfdCBfd1JlZ1ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF93UmVnVmFsID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKFBDRF9HRVRfRU5EUE9JTlQoKFVTQngpLCAoYkVwTnVtKSkgJiBVU0JfRVBSRUdfTUFTSykgfCAoYkFkZHIpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFBDRF9TRVRfRU5EUE9JTlQoKFVTQngpLCAoYkVwTnVtKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIChfd1JlZ1ZhbCB8IFVTQl9FUF9DVFJfUlggfCBVU0JfRVBfQ1RSX1RYKSk7ICAgICAgICBcCisgIH0gd2hpbGUgKDApIC8qIFBDRF9TRVRfRVBfQUREUkVTUyAqLworCisvKioKKyAqIEBicmllZiAgR2V0cyBhZGRyZXNzIGluIGFuIGVuZHBvaW50IHJlZ2lzdGVyLgorICogQHBhcmFtICBVU0J4IFVTQiBwZXJpcGhlcmFsIGluc3RhbmNlIHJlZ2lzdGVyIGFkZHJlc3MuCisgKiBAcGFyYW0gIGJFcE51bSBFbmRwb2ludCBOdW1iZXIuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBQQ0RfR0VUX0VQX0FERFJFU1MoVVNCeCwgYkVwTnVtKSBcCisgICgodWludDhfdCkoUENEX0dFVF9FTkRQT0lOVCgoVVNCeCksIChiRXBOdW0pKSAmIFVTQl9FUEFERFJfRklFTEQpKQorCisjZGVmaW5lIFBDRF9FUF9UWF9DTlQoVVNCeCwgYkVwTnVtKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKHVpbnQxNl90ICopKCgoKHVpbnQzMl90KShVU0J4KS0+QlRBQkxFICsgKCh1aW50MzJfdCkoYkVwTnVtKSAqIDhVKSArIDJVKSAqIFwKKyAgICAgICAgICAgICAgICAgUE1BX0FDQ0VTUykgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkoVVNCeCkgKyAweDQwMFUpKSkKKworI2RlZmluZSBQQ0RfRVBfUlhfQ05UKFVTQngsIGJFcE51bSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCh1aW50MTZfdCAqKSgoKCh1aW50MzJfdCkoVVNCeCktPkJUQUJMRSArICgodWludDMyX3QpKGJFcE51bSkgKiA4VSkgKyA2VSkgKiBcCisgICAgICAgICAgICAgICAgIFBNQV9BQ0NFU1MpICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICgodWludDMyX3QpKFVTQngpICsgMHg0MDBVKSkpCisKKy8qKgorICogQGJyaWVmICBzZXRzIGFkZHJlc3Mgb2YgdGhlIHR4L3J4IGJ1ZmZlci4KKyAqIEBwYXJhbSAgVVNCeCBVU0IgcGVyaXBoZXJhbCBpbnN0YW5jZSByZWdpc3RlciBhZGRyZXNzLgorICogQHBhcmFtICBiRXBOdW0gRW5kcG9pbnQgTnVtYmVyLgorICogQHBhcmFtICB3QWRkciBhZGRyZXNzIHRvIGJlIHNldCAobXVzdCBiZSB3b3JkIGFsaWduZWQpLgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgUENEX1NFVF9FUF9UWF9BRERSRVNTKFVTQngsIGJFcE51bSwgd0FkZHIpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fSU8gdWludDE2X3QgKl93UmVnVmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50MzJfdCBfd1JlZ0Jhc2UgPSAodWludDMyX3QpVVNCeDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF93UmVnQmFzZSArPSAodWludDMyX3QpKFVTQngpLT5CVEFCTEU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfd1JlZ1ZhbCA9IChfX0lPIHVpbnQxNl90ICopKF93UmVnQmFzZSArIDB4NDAwVSArICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh1aW50MzJfdCkoYkVwTnVtKSAqIDhVKSAqIFBNQV9BQ0NFU1MpKTsgXAorICAgICpfd1JlZ1ZhbCA9ICgod0FkZHIpID4+IDEpIDw8IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkgLyogUENEX1NFVF9FUF9UWF9BRERSRVNTICovCisKKyNkZWZpbmUgUENEX1NFVF9FUF9SWF9BRERSRVNTKFVTQngsIGJFcE51bSwgd0FkZHIpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fSU8gdWludDE2X3QgKl93UmVnVmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50MzJfdCBfd1JlZ0Jhc2UgPSAodWludDMyX3QpVVNCeDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF93UmVnQmFzZSArPSAodWludDMyX3QpKFVTQngpLT5CVEFCTEU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfd1JlZ1ZhbCA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChfX0lPIHVpbnQxNl90ICopKF93UmVnQmFzZSArIDB4NDAwVSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKCgodWludDMyX3QpKGJFcE51bSkgKiA4VSkgKyA0VSkgKiBQTUFfQUNDRVNTKSk7IFwKKyAgICAqX3dSZWdWYWwgPSAoKHdBZGRyKSA+PiAxKSA8PCAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApIC8qIFBDRF9TRVRfRVBfUlhfQUREUkVTUyAqLworCisvKioKKyAqIEBicmllZiAgR2V0cyBhZGRyZXNzIG9mIHRoZSB0eC9yeCBidWZmZXIuCisgKiBAcGFyYW0gIFVTQnggVVNCIHBlcmlwaGVyYWwgaW5zdGFuY2UgcmVnaXN0ZXIgYWRkcmVzcy4KKyAqIEBwYXJhbSAgYkVwTnVtIEVuZHBvaW50IE51bWJlci4KKyAqIEByZXR2YWwgYWRkcmVzcyBvZiB0aGUgYnVmZmVyLgorICovCisjZGVmaW5lIFBDRF9HRVRfRVBfVFhfQUREUkVTUyhVU0J4LCBiRXBOdW0pIFwKKyAgKCh1aW50MTZfdCkgKiBQQ0RfRVBfVFhfQUREUkVTUygoVVNCeCksIChiRXBOdW0pKSkKKyNkZWZpbmUgUENEX0dFVF9FUF9SWF9BRERSRVNTKFVTQngsIGJFcE51bSkgXAorICAoKHVpbnQxNl90KSAqIFBDRF9FUF9SWF9BRERSRVNTKChVU0J4KSwgKGJFcE51bSkpKQorCisvKioKKyAqIEBicmllZiAgU2V0cyBjb3VudGVyIG9mIHJ4IGJ1ZmZlciB3aXRoIG5vLiBvZiBibG9ja3MuCisgKiBAcGFyYW0gIHBkd1JlZyBSZWdpc3RlciBwb2ludGVyCisgKiBAcGFyYW0gIHdDb3VudCBDb3VudGVyLgorICogQHBhcmFtICB3TkJsb2NrcyBuby4gb2YgQmxvY2tzLgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgUENEX0NBTENfQkxLMzIocGR3UmVnLCB3Q291bnQsIHdOQmxvY2tzKSAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKHdOQmxvY2tzKSA9ICh3Q291bnQpID4+IDU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKCh3Q291bnQpICYgMHgxZlUpID09IDBVKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKHdOQmxvY2tzKS0tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAqKHBkd1JlZykgfD0gKHVpbnQxNl90KSgoKHdOQmxvY2tzKSA8PCAxMCkgfCBVU0JfQ05UUlhfQkxTSVpFKTsgXAorICB9IHdoaWxlICgwKSAvKiBQQ0RfQ0FMQ19CTEszMiAqLworCisjZGVmaW5lIFBDRF9DQUxDX0JMSzIocGR3UmVnLCB3Q291bnQsIHdOQmxvY2tzKSBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKHdOQmxvY2tzKSA9ICh3Q291bnQpID4+IDE7ICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCgod0NvdW50KSAmIDB4MVUpICE9IDBVKSB7ICAgICAgICAgICAgICBcCisgICAgICAod05CbG9ja3MpKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKihwZHdSZWcpIHw9ICh1aW50MTZfdCkoKHdOQmxvY2tzKSA8PCAxMCk7ICBcCisgIH0gd2hpbGUgKDApIC8qIFBDRF9DQUxDX0JMSzIgKi8KKworI2RlZmluZSBQQ0RfU0VUX0VQX0NOVF9SWF9SRUcocGR3UmVnLCB3Q291bnQpICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDMyX3Qgd05CbG9ja3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAqKHBkd1JlZykgJj0gMHgzRkZVOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgod0NvdW50KSA9PSAwVSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICoocGR3UmVnKSB8PSBVU0JfQ05UUlhfQkxTSVpFOyAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIGlmICgod0NvdW50KSA8PSA2MlUpIHsgICAgICAgICAgICAgICAgICAgXAorICAgICAgUENEX0NBTENfQkxLMigocGR3UmVnKSwgKHdDb3VudCksIHdOQmxvY2tzKTsgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBQQ0RfQ0FMQ19CTEszMigocGR3UmVnKSwgKHdDb3VudCksIHdOQmxvY2tzKTsgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkgLyogUENEX1NFVF9FUF9DTlRfUlhfUkVHICovCisKKyNkZWZpbmUgUENEX1NFVF9FUF9SWF9EQlVGMF9DTlQoVVNCeCwgYkVwTnVtLCB3Q291bnQpICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQzMl90IF93UmVnQmFzZSA9ICh1aW50MzJfdCkoVVNCeCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX0lPIHVpbnQxNl90ICpwZHdSZWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF93UmVnQmFzZSArPSAodWludDMyX3QpKFVTQngpLT5CVEFCTEU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwZHdSZWcgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChfX0lPIHVpbnQxNl90ICopKF93UmVnQmFzZSArIDB4NDAwVSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKCgodWludDMyX3QpKGJFcE51bSkgKiA4VSkgKyAyVSkgKiBQTUFfQUNDRVNTKSk7IFwKKyAgICBQQ0RfU0VUX0VQX0NOVF9SWF9SRUcocGR3UmVnLCAod0NvdW50KSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKy8qKgorICogQGJyaWVmICBzZXRzIGNvdW50ZXIgZm9yIHRoZSB0eC9yeCBidWZmZXIuCisgKiBAcGFyYW0gIFVTQnggVVNCIHBlcmlwaGVyYWwgaW5zdGFuY2UgcmVnaXN0ZXIgYWRkcmVzcy4KKyAqIEBwYXJhbSAgYkVwTnVtIEVuZHBvaW50IE51bWJlci4KKyAqIEBwYXJhbSAgd0NvdW50IENvdW50ZXIgdmFsdWUuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBQQ0RfU0VUX0VQX1RYX0NOVChVU0J4LCBiRXBOdW0sIHdDb3VudCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDMyX3QgX3dSZWdCYXNlID0gKHVpbnQzMl90KShVU0J4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fSU8gdWludDE2X3QgKl93UmVnVmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX3dSZWdCYXNlICs9ICh1aW50MzJfdCkoVVNCeCktPkJUQUJMRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF93UmVnVmFsID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKF9fSU8gdWludDE2X3QgKikoX3dSZWdCYXNlICsgMHg0MDBVICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICgoKCh1aW50MzJfdCkoYkVwTnVtKSAqIDhVKSArIDJVKSAqIFBNQV9BQ0NFU1MpKTsgXAorICAgICpfd1JlZ1ZhbCA9ICh1aW50MTZfdCkod0NvdW50KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBQQ0RfU0VUX0VQX1JYX0NOVChVU0J4LCBiRXBOdW0sIHdDb3VudCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDMyX3QgX3dSZWdCYXNlID0gKHVpbnQzMl90KShVU0J4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fSU8gdWludDE2X3QgKl93UmVnVmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX3dSZWdCYXNlICs9ICh1aW50MzJfdCkoVVNCeCktPkJUQUJMRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF93UmVnVmFsID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKF9fSU8gdWludDE2X3QgKikoX3dSZWdCYXNlICsgMHg0MDBVICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICgoKCh1aW50MzJfdCkoYkVwTnVtKSAqIDhVKSArIDZVKSAqIFBNQV9BQ0NFU1MpKTsgXAorICAgIFBDRF9TRVRfRVBfQ05UX1JYX1JFRyhfd1JlZ1ZhbCwgKHdDb3VudCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworLyoqCisgKiBAYnJpZWYgIGdldHMgY291bnRlciBvZiB0aGUgdHggYnVmZmVyLgorICogQHBhcmFtICBVU0J4IFVTQiBwZXJpcGhlcmFsIGluc3RhbmNlIHJlZ2lzdGVyIGFkZHJlc3MuCisgKiBAcGFyYW0gIGJFcE51bSBFbmRwb2ludCBOdW1iZXIuCisgKiBAcmV0dmFsIENvdW50ZXIgdmFsdWUKKyAqLworI2RlZmluZSBQQ0RfR0VUX0VQX1RYX0NOVChVU0J4LCBiRXBOdW0pIFwKKyAgKCh1aW50MzJfdCkoKlBDRF9FUF9UWF9DTlQoKFVTQngpLCAoYkVwTnVtKSkpICYgMHgzZmZVKQorI2RlZmluZSBQQ0RfR0VUX0VQX1JYX0NOVChVU0J4LCBiRXBOdW0pIFwKKyAgKCh1aW50MzJfdCkoKlBDRF9FUF9SWF9DTlQoKFVTQngpLCAoYkVwTnVtKSkpICYgMHgzZmZVKQorCisvKioKKyAqIEBicmllZiAgU2V0cyBidWZmZXIgMC8xIGFkZHJlc3MgaW4gYSBkb3VibGUgYnVmZmVyIGVuZHBvaW50LgorICogQHBhcmFtICBVU0J4IFVTQiBwZXJpcGhlcmFsIGluc3RhbmNlIHJlZ2lzdGVyIGFkZHJlc3MuCisgKiBAcGFyYW0gIGJFcE51bSBFbmRwb2ludCBOdW1iZXIuCisgKiBAcGFyYW0gIHdCdWYwQWRkciBidWZmZXIgMCBhZGRyZXNzLgorICogQHJldHZhbCBDb3VudGVyIHZhbHVlCisgKi8KKyNkZWZpbmUgUENEX1NFVF9FUF9EQlVGMF9BRERSKFVTQngsIGJFcE51bSwgd0J1ZjBBZGRyKSAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFBDRF9TRVRfRVBfVFhfQUREUkVTUygoVVNCeCksIChiRXBOdW0pLCAod0J1ZjBBZGRyKSk7IFwKKyAgfSB3aGlsZSAoMCkgLyogUENEX1NFVF9FUF9EQlVGMF9BRERSICovCisKKyNkZWZpbmUgUENEX1NFVF9FUF9EQlVGMV9BRERSKFVTQngsIGJFcE51bSwgd0J1ZjFBZGRyKSAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFBDRF9TRVRfRVBfUlhfQUREUkVTUygoVVNCeCksIChiRXBOdW0pLCAod0J1ZjFBZGRyKSk7IFwKKyAgfSB3aGlsZSAoMCkgLyogUENEX1NFVF9FUF9EQlVGMV9BRERSICovCisKKy8qKgorICogQGJyaWVmICBTZXRzIGFkZHJlc3NlcyBpbiBhIGRvdWJsZSBidWZmZXIgZW5kcG9pbnQuCisgKiBAcGFyYW0gIFVTQnggVVNCIHBlcmlwaGVyYWwgaW5zdGFuY2UgcmVnaXN0ZXIgYWRkcmVzcy4KKyAqIEBwYXJhbSAgYkVwTnVtIEVuZHBvaW50IE51bWJlci4KKyAqIEBwYXJhbSAgd0J1ZjBBZGRyOiBidWZmZXIgMCBhZGRyZXNzLgorICogQHBhcmFtICB3QnVmMUFkZHIgPSBidWZmZXIgMSBhZGRyZXNzLgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgUENEX1NFVF9FUF9EQlVGX0FERFIoVVNCeCwgYkVwTnVtLCB3QnVmMEFkZHIsIHdCdWYxQWRkcikgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUENEX1NFVF9FUF9EQlVGMF9BRERSKChVU0J4KSwgKGJFcE51bSksICh3QnVmMEFkZHIpKTsgICAgICAgIFwKKyAgICBQQ0RfU0VUX0VQX0RCVUYxX0FERFIoKFVTQngpLCAoYkVwTnVtKSwgKHdCdWYxQWRkcikpOyAgICAgICAgXAorICB9IHdoaWxlICgwKSAvKiBQQ0RfU0VUX0VQX0RCVUZfQUREUiAqLworCisvKioKKyAqIEBicmllZiAgR2V0cyBidWZmZXIgMC8xIGFkZHJlc3Mgb2YgYSBkb3VibGUgYnVmZmVyIGVuZHBvaW50LgorICogQHBhcmFtICBVU0J4IFVTQiBwZXJpcGhlcmFsIGluc3RhbmNlIHJlZ2lzdGVyIGFkZHJlc3MuCisgKiBAcGFyYW0gIGJFcE51bSBFbmRwb2ludCBOdW1iZXIuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBQQ0RfR0VUX0VQX0RCVUYwX0FERFIoVVNCeCwgYkVwTnVtKSBcCisgIChQQ0RfR0VUX0VQX1RYX0FERFJFU1MoKFVTQngpLCAoYkVwTnVtKSkpCisjZGVmaW5lIFBDRF9HRVRfRVBfREJVRjFfQUREUihVU0J4LCBiRXBOdW0pIFwKKyAgKFBDRF9HRVRfRVBfUlhfQUREUkVTUygoVVNCeCksIChiRXBOdW0pKSkKKworLyoqCisgKiBAYnJpZWYgIEdldHMgYnVmZmVyIDAvMSBhZGRyZXNzIG9mIGEgZG91YmxlIGJ1ZmZlciBlbmRwb2ludC4KKyAqIEBwYXJhbSAgVVNCeCBVU0IgcGVyaXBoZXJhbCBpbnN0YW5jZSByZWdpc3RlciBhZGRyZXNzLgorICogQHBhcmFtICBiRXBOdW0gRW5kcG9pbnQgTnVtYmVyLgorICogQHBhcmFtICBiRGlyIGVuZHBvaW50IGRpciAgRVBfREJVRl9PVVQgPSBPVVQKKyAqICAgICAgICAgRVBfREJVRl9JTiAgPSBJTgorICogQHBhcmFtICB3Q291bnQ6IENvdW50ZXIgdmFsdWUKKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIFBDRF9TRVRfRVBfREJVRjBfQ05UKFVTQngsIGJFcE51bSwgYkRpciwgd0NvdW50KSAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoYkRpcikgPT0gMFUpIC8qIE9VVCBlbmRwb2ludCAqLyAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFBDRF9TRVRfRVBfUlhfREJVRjBfQ05UKChVU0J4KSwgKGJFcE51bSksICh3Q291bnQpKTsgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAoKGJEaXIpID09IDFVKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgLyogSU4gZW5kcG9pbnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBQQ0RfU0VUX0VQX1RYX0NOVCgoVVNCeCksIChiRXBOdW0pLCAod0NvdW50KSk7ICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKSAvKiBTZXRFUERibEJ1ZjBDb3VudCovCisKKyNkZWZpbmUgUENEX1NFVF9FUF9EQlVGMV9DTlQoVVNCeCwgYkVwTnVtLCBiRGlyLCB3Q291bnQpICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50MzJfdCBfd0Jhc2UgPSAodWludDMyX3QpKFVTQngpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX0lPIHVpbnQxNl90ICpfd0VQUmVnVmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKGJEaXIpID09IDBVKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIC8qIE9VVCBlbmRwb2ludCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFBDRF9TRVRfRVBfUlhfQ05UKChVU0J4KSwgKGJFcE51bSksICh3Q291bnQpKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGlmICgoYkRpcikgPT0gMVUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgLyogSU4gZW5kcG9pbnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX3dCYXNlICs9ICh1aW50MzJfdCkoVVNCeCktPkJUQUJMRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX3dFUFJlZ1ZhbCA9IChfX0lPIHVpbnQxNl90ICopKF93QmFzZSArIDB4NDAwVSArICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKCh1aW50MzJfdCkoYkVwTnVtKSAqIDhVKSArIDZVKSAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTUFfQUNDRVNTKSk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKl93RVBSZWdWYWwgPSAodWludDE2X3QpKHdDb3VudCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkgLyogU2V0RVBEYmxCdWYxQ291bnQgKi8KKworI2RlZmluZSBQQ0RfU0VUX0VQX0RCVUZfQ05UKFVTQngsIGJFcE51bSwgYkRpciwgd0NvdW50KSAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBQQ0RfU0VUX0VQX0RCVUYwX0NOVCgoVVNCeCksIChiRXBOdW0pLCAoYkRpciksICh3Q291bnQpKTsgXAorICAgIFBDRF9TRVRfRVBfREJVRjFfQ05UKChVU0J4KSwgKGJFcE51bSksIChiRGlyKSwgKHdDb3VudCkpOyBcCisgIH0gd2hpbGUgKDApIC8qIFBDRF9TRVRfRVBfREJVRl9DTlQgKi8KKworLyoqCisgKiBAYnJpZWYgIEdldHMgYnVmZmVyIDAvMSByeC90eCBjb3VudGVyIGZvciBkb3VibGUgYnVmZmVyaW5nLgorICogQHBhcmFtICBVU0J4IFVTQiBwZXJpcGhlcmFsIGluc3RhbmNlIHJlZ2lzdGVyIGFkZHJlc3MuCisgKiBAcGFyYW0gIGJFcE51bSBFbmRwb2ludCBOdW1iZXIuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBQQ0RfR0VUX0VQX0RCVUYwX0NOVChVU0J4LCBiRXBOdW0pIChQQ0RfR0VUX0VQX1RYX0NOVCgoVVNCeCksIChiRXBOdW0pKSkKKyNkZWZpbmUgUENEX0dFVF9FUF9EQlVGMV9DTlQoVVNCeCwgYkVwTnVtKSAoUENEX0dFVF9FUF9SWF9DTlQoKFVTQngpLCAoYkVwTnVtKSkpCisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCisjZW5kaWYgLyogZGVmaW5lZCAoVVNCKSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJHNHh4X0hBTF9QQ0RfSCAqLwpkaWZmIC0tZ2l0IGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfaGFsX3BjZF9leC5oIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfaGFsX3BjZF9leC5oCmluZGV4IDA3OGUzYmEuLjA2N2QzYTUgMTAwNjQ0Ci0tLSBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9JbmMvc3RtMzJnNHh4X2hhbF9wY2RfZXguaAorKysgYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9oYWxfcGNkX2V4LmgKQEAgLTEsODMgKzEsODMgQEAKLS8qKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBAZmlsZSAgICBzdG0zMmc0eHhfaGFsX3BjZF9leC5oDQotICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0NCi0gKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBQQ0QgSEFMIEV4dGVuc2lvbiBtb2R1bGUuDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEBhdHRlbnRpb24NCi0gKg0KLSAqIENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4NCi0gKg0KLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGVybXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZQ0KLSAqIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4NCi0gKiBJZiBubyBMSUNFTlNFIGZpbGUgY29tZXMgd2l0aCB0aGlzIHNvZnR3YXJlLCBpdCBpcyBwcm92aWRlZCBBUy1JUy4NCi0gKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKi8NCi0NCi0vKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpZm5kZWYgU1RNMzJHNHh4X0hBTF9QQ0RfRVhfSA0KLSNkZWZpbmUgU1RNMzJHNHh4X0hBTF9QQ0RfRVhfSA0KLQ0KLSNpZmRlZiBfX2NwbHVzcGx1cw0KLWV4dGVybiAiQyIgew0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLw0KLQ0KLS8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotI2luY2x1ZGUgInN0bTMyZzR4eF9oYWxfZGVmLmgiDQotDQotI2lmIGRlZmluZWQoVVNCKQ0KLS8qKiBAYWRkdG9ncm91cCBTVE0zMkc0eHhfSEFMX0RyaXZlcg0KLSAqIEB7DQotICovDQotDQotLyoqIEBhZGR0b2dyb3VwIFBDREV4DQotICogQHsNCi0gKi8NCi0vKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogRXhwb3J0ZWQgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAYWRkdG9ncm91cCBQQ0RFeF9FeHBvcnRlZF9GdW5jdGlvbnMgUENERXggRXhwb3J0ZWQgRnVuY3Rpb25zDQotICogQHsNCi0gKi8NCi0vKiogQGFkZHRvZ3JvdXAgUENERXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zDQotICogQHsNCi0gKi8NCi0NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfUENERXhfUE1BQ29uZmlnKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCB1aW50MTZfdCBlcF9hZGRyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgZXBfa2luZCwgdWludDMyX3QgcG1hYWRyZXNzKTsNCi0NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfUENERXhfQWN0aXZhdGVMUE0oUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RFeF9EZUFjdGl2YXRlTFBNKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsNCi0NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfUENERXhfQWN0aXZhdGVCQ0QoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RFeF9EZUFjdGl2YXRlQkNEKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsNCi12b2lkIEhBTF9QQ0RFeF9CQ0RfVkJVU0RldGVjdChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7DQotDQotdm9pZCBIQUxfUENERXhfTFBNX0NhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCBQQ0RfTFBNX01zZ1R5cGVEZWYgbXNnKTsNCi12b2lkIEhBTF9QQ0RFeF9CQ0RfQ2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIFBDRF9CQ0RfTXNnVHlwZURlZiBtc2cpOw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotI2VuZGlmIC8qIGRlZmluZWQgKFVTQikgKi8NCi0NCi0jaWZkZWYgX19jcGx1c3BsdXMNCi19DQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovDQotDQotI2VuZGlmIC8qIFNUTTMyRzR4eF9IQUxfUENEX0VYX0ggKi8NCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBmaWxlICAgIHN0bTMyZzR4eF9oYWxfcGNkX2V4LmgKKyAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBQQ0QgSEFMIEV4dGVuc2lvbiBtb2R1bGUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYXR0ZW50aW9uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0ZXJtcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlCisgKiBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb2Z0d2FyZSBjb21wb25lbnQuCisgKiBJZiBubyBMSUNFTlNFIGZpbGUgY29tZXMgd2l0aCB0aGlzIHNvZnR3YXJlLCBpdCBpcyBwcm92aWRlZCBBUy1JUy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJHNHh4X0hBTF9QQ0RfRVhfSAorI2RlZmluZSBTVE0zMkc0eHhfSEFMX1BDRF9FWF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmc0eHhfaGFsX2RlZi5oIgorCisjaWYgZGVmaW5lZChVU0IpCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHNHh4X0hBTF9Ecml2ZXIKKyAqIEB7CisgKi8KKworLyoqIEBhZGR0b2dyb3VwIFBDREV4CisgKiBAeworICovCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFBDREV4X0V4cG9ydGVkX0Z1bmN0aW9ucyBQQ0RFeCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAqIEB7CisgKi8KKy8qKiBAYWRkdG9ncm91cCBQQ0RFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAqIEB7CisgKi8KKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDREV4X1BNQUNvbmZpZyhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDE2X3QgZXBfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgZXBfa2luZCwgdWludDMyX3QgcG1hYWRyZXNzKTsKKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDREV4X0FjdGl2YXRlTFBNKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RFeF9EZUFjdGl2YXRlTFBNKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsKKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDREV4X0FjdGl2YXRlQkNEKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RFeF9EZUFjdGl2YXRlQkNEKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsKK3ZvaWQgSEFMX1BDREV4X0JDRF9WQlVTRGV0ZWN0KFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsKKwordm9pZCBIQUxfUENERXhfTFBNX0NhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCBQQ0RfTFBNX01zZ1R5cGVEZWYgbXNnKTsKK3ZvaWQgSEFMX1BDREV4X0JDRF9DYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgUENEX0JDRF9Nc2dUeXBlRGVmIG1zZyk7CisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworI2VuZGlmIC8qIGRlZmluZWQgKFVTQikgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmIC8qIFNUTTMyRzR4eF9IQUxfUENEX0VYX0ggKi8KZGlmZiAtLWdpdCBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9JbmMvc3RtMzJnNHh4X2hhbF9wd3IuaCBiL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9JbmMvc3RtMzJnNHh4X2hhbF9wd3IuaAppbmRleCBkODBlNDllLi5kMDZlZmM3IDEwMDY0NAotLS0gYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9oYWxfcHdyLmgKKysrIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfaGFsX3B3ci5oCkBAIC0xLDQ1NSArMSw0NTUgQEAKLS8qKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBAZmlsZSAgICBzdG0zMmc0eHhfaGFsX3B3ci5oDQotICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0NCi0gKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBQV1IgSEFMIG1vZHVsZS4NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQGF0dGVudGlvbg0KLSAqDQotICogQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KLSAqDQotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0ZXJtcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlDQotICogaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc29mdHdhcmUgY29tcG9uZW50Lg0KLSAqIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcyB3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLg0KLSAqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqLw0KLQ0KLS8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotI2lmbmRlZiBTVE0zMkc0eHhfSEFMX1BXUl9IDQotI2RlZmluZSBTVE0zMkc0eHhfSEFMX1BXUl9IDQotDQotI2lmZGVmIF9fY3BsdXNwbHVzDQotZXh0ZXJuICJDIiB7DQotI2VuZGlmDQotDQotLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaW5jbHVkZSAic3RtMzJnNHh4X2hhbF9kZWYuaCINCi0NCi0vKiogQGFkZHRvZ3JvdXAgU1RNMzJHNHh4X0hBTF9Ecml2ZXINCi0gKiBAew0KLSAqLw0KLQ0KLS8qKiBAYWRkdG9ncm91cCBQV1INCi0gKiBAew0KLSAqLw0KLQ0KLS8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotDQotLyoqIEBkZWZncm91cCBQV1JfRXhwb3J0ZWRfVHlwZXMgUFdSIEV4cG9ydGVkIFR5cGVzDQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFBXUiBQVkQgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbg0KLSAqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gIHVpbnQzMl90IFBWRExldmVsOyAvKiE8IFBWRExldmVsOiBTcGVjaWZpZXMgdGhlIFBWRCBkZXRlY3Rpb24gbGV2ZWwuDQotICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgUFdSX1BWRF9kZXRlY3Rpb25fbGV2ZWwuICovDQotDQotICB1aW50MzJfdCBNb2RlOyAvKiE8IE1vZGU6IFNwZWNpZmllcyB0aGUgb3BlcmF0aW5nIG1vZGUgZm9yIHRoZSBzZWxlY3RlZCBwaW5zLg0KLSAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFBXUl9QVkRfTW9kZS4gKi8NCi19IFBXUl9QVkRUeXBlRGVmOw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0NCi0vKiogQGRlZmdyb3VwIFBXUl9FeHBvcnRlZF9Db25zdGFudHMgUFdSIEV4cG9ydGVkIENvbnN0YW50cw0KLSAqIEB7DQotICovDQotDQotLyoqIEBkZWZncm91cCBQV1JfUFZEX2RldGVjdGlvbl9sZXZlbCBQcm9ncmFtbWFibGUgVm9sdGFnZSBEZXRlY3Rpb24gbGV2ZWxzDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFBXUl9QVkRMRVZFTF8wIFBXUl9DUjJfUExTX0xFVjAgLyohPCBQVkQgdGhyZXNob2xkIGFyb3VuZCAyLjAgViAqLw0KLSNkZWZpbmUgUFdSX1BWRExFVkVMXzEgUFdSX0NSMl9QTFNfTEVWMSAvKiE8IFBWRCB0aHJlc2hvbGQgYXJvdW5kIDIuMiBWICovDQotI2RlZmluZSBQV1JfUFZETEVWRUxfMiBQV1JfQ1IyX1BMU19MRVYyIC8qITwgUFZEIHRocmVzaG9sZCBhcm91bmQgMi40IFYgKi8NCi0jZGVmaW5lIFBXUl9QVkRMRVZFTF8zIFBXUl9DUjJfUExTX0xFVjMgLyohPCBQVkQgdGhyZXNob2xkIGFyb3VuZCAyLjUgViAqLw0KLSNkZWZpbmUgUFdSX1BWRExFVkVMXzQgUFdSX0NSMl9QTFNfTEVWNCAvKiE8IFBWRCB0aHJlc2hvbGQgYXJvdW5kIDIuNiBWICovDQotI2RlZmluZSBQV1JfUFZETEVWRUxfNSBQV1JfQ1IyX1BMU19MRVY1IC8qITwgUFZEIHRocmVzaG9sZCBhcm91bmQgMi44IFYgKi8NCi0jZGVmaW5lIFBXUl9QVkRMRVZFTF82IFBXUl9DUjJfUExTX0xFVjYgLyohPCBQVkQgdGhyZXNob2xkIGFyb3VuZCAyLjkgViAqLw0KLSNkZWZpbmUgUFdSX1BWRExFVkVMXzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIFBXUl9DUjJfUExTX0xFVjcgLyohPCBFeHRlcm5hbCBpbnB1dCBhbmFsb2cgdm9sdGFnZSAoY29tcGFyZWQgaW50ZXJuYWxseSB0byBcDQotICAgICAgICAgICAgICAgICAgICAgIFZSRUZJTlQpICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFBXUl9QVkRfTW9kZSAgUFdSIFBWRCBpbnRlcnJ1cHQgYW5kIGV2ZW50IG1vZGUNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgUFdSX1BWRF9NT0RFX05PUk1BTCAoKHVpbnQzMl90KTB4MDAwMDAwMDApIC8qITwgQmFzaWMgbW9kZSBpcyB1c2VkICovDQotI2RlZmluZSBQV1JfUFZEX01PREVfSVRfUklTSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgodWludDMyX3QpMHgwMDAxMDAwMSkgLyohPCBFeHRlcm5hbCBJbnRlcnJ1cHQgTW9kZSB3aXRoIFJpc2luZyBlZGdlIHRyaWdnZXIgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRlY3Rpb24gKi8NCi0jZGVmaW5lIFBXUl9QVkRfTU9ERV9JVF9GQUxMSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKHVpbnQzMl90KTB4MDAwMTAwMDIpIC8qITwgRXh0ZXJuYWwgSW50ZXJydXB0IE1vZGUgd2l0aCBGYWxsaW5nIGVkZ2UgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyIGRldGVjdGlvbiAqLw0KLSNkZWZpbmUgUFdSX1BWRF9NT0RFX0lUX1JJU0lOR19GQUxMSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKHVpbnQzMl90KTB4MDAwMTAwMDMpIC8qITwgRXh0ZXJuYWwgSW50ZXJydXB0IE1vZGUgd2l0aCBSaXNpbmcvRmFsbGluZyBlZGdlIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlciBkZXRlY3Rpb24gKi8NCi0jZGVmaW5lIFBXUl9QVkRfTU9ERV9FVkVOVF9SSVNJTkcgXA0KLSAgKCh1aW50MzJfdCkweDAwMDIwMDAxKSAvKiE8IEV2ZW50IE1vZGUgd2l0aCBSaXNpbmcgZWRnZSB0cmlnZ2VyIGRldGVjdGlvbiAqLw0KLSNkZWZpbmUgUFdSX1BWRF9NT0RFX0VWRU5UX0ZBTExJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKCh1aW50MzJfdCkweDAwMDIwMDAyKSAvKiE8IEV2ZW50IE1vZGUgd2l0aCBGYWxsaW5nIGVkZ2UgdHJpZ2dlciBkZXRlY3Rpb24gXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFBXUl9QVkRfTU9ERV9FVkVOVF9SSVNJTkdfRkFMTElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgodWludDMyX3QpMHgwMDAyMDAwMykgLyohPCBFdmVudCBNb2RlIHdpdGggUmlzaW5nL0ZhbGxpbmcgZWRnZSB0cmlnZ2VyIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0ZWN0aW9uICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFBXUl9SZWd1bGF0b3Jfc3RhdGVfaW5fU0xFRVBfU1RPUF9tb2RlICBQV1IgcmVndWxhdG9yIG1vZGUNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgUFdSX01BSU5SRUdVTEFUT1JfT04gXA0KLSAgKCh1aW50MzJfdCkweDAwMDAwMDAwKSAvKiE8IFJlZ3VsYXRvciBpbiBtYWluIG1vZGUgICAgICAqLw0KLSNkZWZpbmUgUFdSX0xPV1BPV0VSUkVHVUxBVE9SX09OICAgICAgICAgICAgICAgXA0KLSAgUFdSX0NSMV9MUFIgLyohPCBSZWd1bGF0b3IgaW4gbG93LXBvd2VyIG1vZGUgXA0KLSAgICAgICAgICAgICAgICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFBXUl9TTEVFUF9tb2RlX2VudHJ5ICBQV1IgU0xFRVAgbW9kZSBlbnRyeQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBQV1JfU0xFRVBFTlRSWV9XRkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKHVpbnQ4X3QpMHgwMSkgLyohPCBXYWl0IEZvciBJbnRlcnJ1cHRpb24gaW5zdHJ1Y3Rpb24gdG8gZW50ZXIgU2xlZXAgbW9kZSBcDQotICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBQV1JfU0xFRVBFTlRSWV9XRkUgXA0KLSAgKCh1aW50OF90KTB4MDIpIC8qITwgV2FpdCBGb3IgRXZlbnQgaW5zdHJ1Y3Rpb24gdG8gZW50ZXIgU2xlZXAgbW9kZSAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBQV1JfU1RPUF9tb2RlX2VudHJ5ICBQV1IgU1RPUCBtb2RlIGVudHJ5DQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFBXUl9TVE9QRU5UUllfV0ZJIFwNCi0gICgodWludDhfdCkweDAxKSAvKiE8IFdhaXQgRm9yIEludGVycnVwdGlvbiBpbnN0cnVjdGlvbiB0byBlbnRlciBTdG9wIG1vZGUgKi8NCi0jZGVmaW5lIFBXUl9TVE9QRU5UUllfV0ZFIFwNCi0gICgodWludDhfdCkweDAyKSAvKiE8IFdhaXQgRm9yIEV2ZW50IGluc3RydWN0aW9uIHRvIGVudGVyIFN0b3AgbW9kZSAgICAgICAgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUFdSX1BWRF9FWFRJX0xJTkUgIFBXUiBQVkQgZXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgUFdSX0VYVElfTElORV9QVkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgodWludDMyX3QpMHgwMDAxMDAwMCkgLyohPCBFeHRlcm5hbCBpbnRlcnJ1cHQgbGluZSAxNiBDb25uZWN0ZWQgdG8gdGhlIFBWRCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVEkgTGluZSAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBQV1JfUFZEX0VWRU5UX0xJTkUgIFBXUiBQVkQgZXZlbnQgbGluZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBQV1JfRVZFTlRfTElORV9QVkQgXA0KLSAgKCh1aW50MzJfdCkweDAwMDEwMDAwKSAvKiE8IEV2ZW50IGxpbmUgMTYgQ29ubmVjdGVkIHRvIHRoZSBQVkQgRXZlbnQgTGluZSAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgUFdSX0V4cG9ydGVkX01hY3JvcyAgUFdSIEV4cG9ydGVkIE1hY3Jvcw0KLSAqIEB7DQotICovDQotDQotLyoqIEBicmllZiAgQ2hlY2sgd2hldGhlciBvciBub3QgYSBzcGVjaWZpYyBQV1IgZmxhZyBpcyBzZXQuDQotICAqIEBwYXJhbSAgX19GTEFHX186IHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4NCi0gICogICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICAgICAgICAgQGFyZyBAcmVmIFBXUl9GTEFHX1dVRjEgV2FrZSBVcCBGbGFnIDEuIEluZGljYXRlcyB0aGF0IGEgd2FrZXVwDQotZXZlbnQNCi0gICogICAgICAgICAgICAgICAgICB3YXMgcmVjZWl2ZWQgZnJvbSB0aGUgV0tVUCBwaW4gMS4NCi0gICogICAgICAgICAgICBAYXJnIEByZWYgUFdSX0ZMQUdfV1VGMiBXYWtlIFVwIEZsYWcgMi4gSW5kaWNhdGVzIHRoYXQgYSB3YWtldXANCi1ldmVudA0KLSAgKiAgICAgICAgICAgICAgICAgIHdhcyByZWNlaXZlZCBmcm9tIHRoZSBXS1VQIHBpbiAyLg0KLSAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfRkxBR19XVUYzIFdha2UgVXAgRmxhZyAzLiBJbmRpY2F0ZXMgdGhhdCBhIHdha2V1cA0KLWV2ZW50DQotICAqICAgICAgICAgICAgICAgICAgd2FzIHJlY2VpdmVkIGZyb20gdGhlIFdLVVAgcGluIDMuDQotICAqICAgICAgICAgICAgQGFyZyBAcmVmIFBXUl9GTEFHX1dVRjQgV2FrZSBVcCBGbGFnIDQuIEluZGljYXRlcyB0aGF0IGEgd2FrZXVwDQotZXZlbnQNCi0gICogICAgICAgICAgICAgICAgICB3YXMgcmVjZWl2ZWQgZnJvbSB0aGUgV0tVUCBwaW4gNC4NCi0gICogICAgICAgICAgICBAYXJnIEByZWYgUFdSX0ZMQUdfV1VGNSBXYWtlIFVwIEZsYWcgNS4gSW5kaWNhdGVzIHRoYXQgYSB3YWtldXANCi1ldmVudA0KLSAgKiAgICAgICAgICAgICAgICAgIHdhcyByZWNlaXZlZCBmcm9tIHRoZSBXS1VQIHBpbiA1Lg0KLSAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfRkxBR19TQiBTdGFuZEJ5IEZsYWcuIEluZGljYXRlcyB0aGF0IHRoZSBzeXN0ZW0NCi0gICogICAgICAgICAgICAgICAgICBlbnRlcmVkIFN0YW5kQnkgbW9kZS4NCi0gICogICAgICAgICAgICBAYXJnIEByZWYgUFdSX0ZMQUdfV1VGSSBXYWtlLVVwIEZsYWcgSW50ZXJuYWwuIFNldCB3aGVuIGEgd2FrZXVwDQotaXMgZGV0ZWN0ZWQgb24NCi0gICogICAgICAgICAgICAgICAgIHRoZSBpbnRlcm5hbCB3YWtldXAgbGluZS4NCi0gICogICAgICAgICAgICBAYXJnIEByZWYgUFdSX0ZMQUdfUkVHTFBTIExvdyBQb3dlciBSZWd1bGF0b3IgU3RhcnRlZC4gSW5kaWNhdGVzDQotd2hldGhlciBvciBub3QgdGhlDQotICAqICAgICAgICAgICAgICAgICBsb3ctcG93ZXIgcmVndWxhdG9yIGlzIHJlYWR5Lg0KLSAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfRkxBR19SRUdMUEYgTG93IFBvd2VyIFJlZ3VsYXRvciBGbGFnLiBJbmRpY2F0ZXMNCi13aGV0aGVyIHRoZQ0KLSAgKiAgICAgICAgICAgICAgICAgcmVndWxhdG9yIGlzIHJlYWR5IGluIG1haW4gbW9kZSBvciBpcyBpbiBsb3ctcG93ZXIgbW9kZS4NCi0gICogICAgICAgICAgICBAYXJnIEByZWYgUFdSX0ZMQUdfVk9TRiBWb2x0YWdlIFNjYWxpbmcgRmxhZy4gSW5kaWNhdGVzIHdoZXRoZXINCi10aGUgcmVndWxhdG9yIGlzIHJlYWR5DQotICAqICAgICAgICAgICAgICAgICBpbiB0aGUgc2VsZWN0ZWQgdm9sdGFnZSByYW5nZSBvciBpcyBzdGlsbCBjaGFuZ2luZyB0byB0aGUNCi1yZXF1aXJlZCB2b2x0YWdlIGxldmVsLg0KLSAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfRkxBR19QVkRPIFBvd2VyIFZvbHRhZ2UgRGV0ZWN0b3IgT3V0cHV0LiBJbmRpY2F0ZXMNCi13aGV0aGVyIFZERCB2b2x0YWdlIGlzDQotICAqICAgICAgICAgICAgICAgICAgYmVsb3cgb3IgYWJvdmUgdGhlIHNlbGVjdGVkIFBWRCB0aHJlc2hvbGQuDQotQGlmIFBXUl9DUjJfUFZNRTENCi0gICogICAgICAgICAgICBAYXJnIEByZWYgUFdSX0ZMQUdfUFZNTzEgUGVyaXBoZXJhbCBWb2x0YWdlIE1vbml0b3JpbmcgT3V0cHV0IDEuDQotSW5kaWNhdGVzIHdoZXRoZXIgVkREVVNCIHZvbHRhZ2UgaXMNCi0gICogICAgICAgICAgICAgICAgICBpcyBiZWxvdyBvciBhYm92ZSBQVk0xIHRocmVzaG9sZCAoYXBwbGljYWJsZSB3aGVuIFVTQg0KLWZlYXR1cmUgaXMgc3VwcG9ydGVkKS4NCi1AZW5kaWYNCi1AaWYgUFdSX0NSMl9QVk1FMg0KLSAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfRkxBR19QVk1PMiBQZXJpcGhlcmFsIFZvbHRhZ2UgTW9uaXRvcmluZyBPdXRwdXQgMi4NCi1JbmRpY2F0ZXMgd2hldGhlciBWRERJTzIgdm9sdGFnZSBpcw0KLSAgKiAgICAgICAgICAgICAgICAgIGlzIGJlbG93IG9yIGFib3ZlIFBWTTIgdGhyZXNob2xkIChhcHBsaWNhYmxlIHdoZW4gVkRESU8yIGlzDQotcHJlc2VudCBvbiBkZXZpY2UpLg0KLUBlbmRpZg0KLSAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfRkxBR19QVk1PMyBQZXJpcGhlcmFsIFZvbHRhZ2UgTW9uaXRvcmluZyBPdXRwdXQgMy4NCi1JbmRpY2F0ZXMgd2hldGhlciBWRERBIHZvbHRhZ2UgaXMNCi0gICogICAgICAgICAgICAgICAgICBpcyBiZWxvdyBvciBhYm92ZSBQVk0zIHRocmVzaG9sZC4NCi0gICogICAgICAgICAgICBAYXJnIEByZWYgUFdSX0ZMQUdfUFZNTzQgUGVyaXBoZXJhbCBWb2x0YWdlIE1vbml0b3JpbmcgT3V0cHV0IDQuDQotSW5kaWNhdGVzIHdoZXRoZXIgVkREQSB2b2x0YWdlIGlzDQotICAqICAgICAgICAgICAgICAgICAgaXMgYmVsb3cgb3IgYWJvdmUgUFZNNCB0aHJlc2hvbGQuDQotICAqDQotICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0ZMQUdfXyAoVFJVRSBvciBGQUxTRSkuDQotICAqLw0KLSNkZWZpbmUgX19IQUxfUFdSX0dFVF9GTEFHKF9fRkxBR19fKSAgICAgICAgICAgICBcDQotICAoKCgoKHVpbnQ4X3QpKF9fRkxBR19fKSkgPj4gNVUpID09IDEpICAgICAgICAgIFwNCi0gICAgICAgPyAoUFdSLT5TUjEgJiAoMVUgPDwgKChfX0ZMQUdfXykgJiAzMVUpKSkgXA0KLSAgICAgICA6IChQV1ItPlNSMiAmICgxVSA8PCAoKF9fRkxBR19fKSAmIDMxVSkpKSkNCi0NCi0vKiogQGJyaWVmICBDbGVhciBhIHNwZWNpZmljIFBXUiBmbGFnLg0KLSAqIEBwYXJhbSAgX19GTEFHX186IHNwZWNpZmllcyB0aGUgZmxhZyB0byBjbGVhci4NCi0gKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFBXUl9GTEFHX1dVRjEgV2FrZSBVcCBGbGFnIDEuIEluZGljYXRlcyB0aGF0IGEgd2FrZXVwDQotICogZXZlbnQgd2FzIHJlY2VpdmVkIGZyb20gdGhlIFdLVVAgcGluIDEuDQotICogICAgICAgICAgICBAYXJnIEByZWYgUFdSX0ZMQUdfV1VGMiBXYWtlIFVwIEZsYWcgMi4gSW5kaWNhdGVzIHRoYXQgYSB3YWtldXANCi0gKiBldmVudCB3YXMgcmVjZWl2ZWQgZnJvbSB0aGUgV0tVUCBwaW4gMi4NCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfRkxBR19XVUYzIFdha2UgVXAgRmxhZyAzLiBJbmRpY2F0ZXMgdGhhdCBhIHdha2V1cA0KLSAqIGV2ZW50IHdhcyByZWNlaXZlZCBmcm9tIHRoZSBXS1VQIHBpbiAzLg0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFBXUl9GTEFHX1dVRjQgV2FrZSBVcCBGbGFnIDQuIEluZGljYXRlcyB0aGF0IGEgd2FrZXVwDQotICogZXZlbnQgd2FzIHJlY2VpdmVkIGZyb20gdGhlIFdLVVAgcGluIDQuDQotICogICAgICAgICAgICBAYXJnIEByZWYgUFdSX0ZMQUdfV1VGNSBXYWtlIFVwIEZsYWcgNS4gSW5kaWNhdGVzIHRoYXQgYSB3YWtldXANCi0gKiBldmVudCB3YXMgcmVjZWl2ZWQgZnJvbSB0aGUgV0tVUCBwaW4gNS4NCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfRkxBR19XVSBFbmNvbXBhc3NlcyBhbGwgZml2ZSBXYWtlIFVwIEZsYWdzLg0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFBXUl9GTEFHX1NCIFN0YW5kYnkgRmxhZy4gSW5kaWNhdGVzIHRoYXQgdGhlIHN5c3RlbQ0KLSAqICAgICAgICAgICAgICAgICAgZW50ZXJlZCBTdGFuZGJ5IG1vZGUuDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9QV1JfQ0xFQVJfRkxBRyhfX0ZMQUdfXykgICAgXA0KLSAgKCgoKHVpbnQ4X3QpKF9fRkxBR19fKSkgPT0gUFdSX0ZMQUdfV1UpIFwNCi0gICAgICAgPyAoUFdSLT5TQ1IgPSAoX19GTEFHX18pKSAgICAgICAgICBcDQotICAgICAgIDogKFBXUi0+U0NSID0gKDFVIDw8ICgoX19GTEFHX18pICYgMzFVKSkpKQ0KLS8qKg0KLSAqIEBicmllZiBFbmFibGUgdGhlIFBWRCBFeHRlbmRlZCBJbnRlcnJ1cHQgTGluZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1BXUl9QVkRfRVhUSV9FTkFCTEVfSVQoKSBTRVRfQklUKEVYVEktPklNUjEsIFBXUl9FWFRJX0xJTkVfUFZEKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBEaXNhYmxlIHRoZSBQVkQgRXh0ZW5kZWQgSW50ZXJydXB0IExpbmUuDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9QV1JfUFZEX0VYVElfRElTQUJMRV9JVCgpIENMRUFSX0JJVChFWFRJLT5JTVIxLCBQV1JfRVhUSV9MSU5FX1BWRCkNCi0NCi0vKioNCi0gKiBAYnJpZWYgRW5hYmxlIHRoZSBQVkQgRXZlbnQgTGluZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1BXUl9QVkRfRVhUSV9FTkFCTEVfRVZFTlQoKSBcDQotICBTRVRfQklUKEVYVEktPkVNUjEsIFBXUl9FVkVOVF9MSU5FX1BWRCkNCi0NCi0vKioNCi0gKiBAYnJpZWYgRGlzYWJsZSB0aGUgUFZEIEV2ZW50IExpbmUuDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9QV1JfUFZEX0VYVElfRElTQUJMRV9FVkVOVCgpIFwNCi0gIENMRUFSX0JJVChFWFRJLT5FTVIxLCBQV1JfRVZFTlRfTElORV9QVkQpDQotDQotLyoqDQotICogQGJyaWVmIEVuYWJsZSB0aGUgUFZEIEV4dGVuZGVkIEludGVycnVwdCBSaXNpbmcgVHJpZ2dlci4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1BXUl9QVkRfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKSBcDQotICBTRVRfQklUKEVYVEktPlJUU1IxLCBQV1JfRVhUSV9MSU5FX1BWRCkNCi0NCi0vKioNCi0gKiBAYnJpZWYgRGlzYWJsZSB0aGUgUFZEIEV4dGVuZGVkIEludGVycnVwdCBSaXNpbmcgVHJpZ2dlci4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1BXUl9QVkRfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCkgXA0KLSAgQ0xFQVJfQklUKEVYVEktPlJUU1IxLCBQV1JfRVhUSV9MSU5FX1BWRCkNCi0NCi0vKioNCi0gKiBAYnJpZWYgRW5hYmxlIHRoZSBQVkQgRXh0ZW5kZWQgSW50ZXJydXB0IEZhbGxpbmcgVHJpZ2dlci4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1BXUl9QVkRfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCkgXA0KLSAgU0VUX0JJVChFWFRJLT5GVFNSMSwgUFdSX0VYVElfTElORV9QVkQpDQotDQotLyoqDQotICogQGJyaWVmIERpc2FibGUgdGhlIFBWRCBFeHRlbmRlZCBJbnRlcnJ1cHQgRmFsbGluZyBUcmlnZ2VyLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUFdSX1BWRF9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCkgXA0KLSAgQ0xFQVJfQklUKEVYVEktPkZUU1IxLCBQV1JfRVhUSV9MSU5FX1BWRCkNCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSB0aGUgUFZEIEV4dGVuZGVkIEludGVycnVwdCBSaXNpbmcgJiBGYWxsaW5nIFRyaWdnZXIuDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9QV1JfUFZEX0VYVElfRU5BQkxFX1JJU0lOR19GQUxMSU5HX0VER0UoKSBcDQotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIF9fSEFMX1BXUl9QVkRfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKTsgICAgICAgICAgICBcDQotICAgIF9fSEFMX1BXUl9QVkRfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCk7ICAgICAgICAgICBcDQotICB9IHdoaWxlICgwKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBEaXNhYmxlIHRoZSBQVkQgRXh0ZW5kZWQgSW50ZXJydXB0IFJpc2luZyAmIEZhbGxpbmcgVHJpZ2dlci4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1BXUl9QVkRfRVhUSV9ESVNBQkxFX1JJU0lOR19GQUxMSU5HX0VER0UoKSBcDQotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBfX0hBTF9QV1JfUFZEX0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpOyAgICAgICAgICAgIFwNCi0gICAgX19IQUxfUFdSX1BWRF9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCk7ICAgICAgICAgICBcDQotICB9IHdoaWxlICgwKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2VuZXJhdGUgYSBTb2Z0d2FyZSBpbnRlcnJ1cHQgb24gc2VsZWN0ZWQgRVhUSSBsaW5lLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUFdSX1BWRF9FWFRJX0dFTkVSQVRFX1NXSVQoKSBcDQotICBTRVRfQklUKEVYVEktPlNXSUVSMSwgUFdSX0VYVElfTElORV9QVkQpDQotDQotLyoqDQotICogQGJyaWVmIENoZWNrIHdoZXRoZXIgb3Igbm90IHRoZSBQVkQgRVhUSSBpbnRlcnJ1cHQgZmxhZyBpcyBzZXQuDQotICogQHJldHZhbCBFWFRJIFBWRCBMaW5lIFN0YXR1cy4NCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1BXUl9QVkRfRVhUSV9HRVRfRkxBRygpIChFWFRJLT5QUjEgJiBQV1JfRVhUSV9MSU5FX1BWRCkNCi0NCi0vKioNCi0gKiBAYnJpZWYgQ2xlYXIgdGhlIFBWRCBFWFRJIGludGVycnVwdCBmbGFnLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUFdSX1BWRF9FWFRJX0NMRUFSX0ZMQUcoKSBXUklURV9SRUcoRVhUSS0+UFIxLCBQV1JfRVhUSV9MSU5FX1BWRCkNCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGFkZHRvZ3JvdXAgIFBXUl9Qcml2YXRlX01hY3JvcyAgIFBXUiBQcml2YXRlIE1hY3Jvcw0KLSAqIEB7DQotICovDQotDQotI2RlZmluZSBJU19QV1JfUFZEX0xFVkVMKExFVkVMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKChMRVZFTCkgPT0gUFdSX1BWRExFVkVMXzApIHx8ICgoTEVWRUwpID09IFBXUl9QVkRMRVZFTF8xKSB8fCBcDQotICAgKChMRVZFTCkgPT0gUFdSX1BWRExFVkVMXzIpIHx8ICgoTEVWRUwpID09IFBXUl9QVkRMRVZFTF8zKSB8fCBcDQotICAgKChMRVZFTCkgPT0gUFdSX1BWRExFVkVMXzQpIHx8ICgoTEVWRUwpID09IFBXUl9QVkRMRVZFTF81KSB8fCBcDQotICAgKChMRVZFTCkgPT0gUFdSX1BWRExFVkVMXzYpIHx8ICgoTEVWRUwpID09IFBXUl9QVkRMRVZFTF83KSkNCi0NCi0jZGVmaW5lIElTX1BXUl9QVkRfTU9ERShNT0RFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKCgoTU9ERSkgPT0gUFdSX1BWRF9NT0RFX05PUk1BTCkgfHwgKChNT0RFKSA9PSBQV1JfUFZEX01PREVfSVRfUklTSU5HKSB8fCBcDQotICAgKChNT0RFKSA9PSBQV1JfUFZEX01PREVfSVRfRkFMTElORykgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKE1PREUpID09IFBXUl9QVkRfTU9ERV9JVF9SSVNJTkdfRkFMTElORykgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoTU9ERSkgPT0gUFdSX1BWRF9NT0RFX0VWRU5UX1JJU0lORykgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKChNT0RFKSA9PSBQV1JfUFZEX01PREVfRVZFTlRfRkFMTElORykgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKE1PREUpID09IFBXUl9QVkRfTU9ERV9FVkVOVF9SSVNJTkdfRkFMTElORykpDQotDQotI2RlZmluZSBJU19QV1JfUkVHVUxBVE9SKFJFR1VMQVRPUikgICAgICAgICBcDQotICAoKChSRUdVTEFUT1IpID09IFBXUl9NQUlOUkVHVUxBVE9SX09OKSB8fCBcDQotICAgKChSRUdVTEFUT1IpID09IFBXUl9MT1dQT1dFUlJFR1VMQVRPUl9PTikpDQotDQotI2RlZmluZSBJU19QV1JfU0xFRVBfRU5UUlkoRU5UUlkpIFwNCi0gICgoKEVOVFJZKSA9PSBQV1JfU0xFRVBFTlRSWV9XRkkpIHx8ICgoRU5UUlkpID09IFBXUl9TTEVFUEVOVFJZX1dGRSkpDQotDQotI2RlZmluZSBJU19QV1JfU1RPUF9FTlRSWShFTlRSWSkgXA0KLSAgKCgoRU5UUlkpID09IFBXUl9TVE9QRU5UUllfV0ZJKSB8fCAoKEVOVFJZKSA9PSBQV1JfU1RPUEVOVFJZX1dGRSkpDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiBJbmNsdWRlIFBXUiBIQUwgRXh0ZW5kZWQgbW9kdWxlICovDQotI2luY2x1ZGUgInN0bTMyZzR4eF9oYWxfcHdyX2V4LmgiDQotDQotLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0NCi0vKiogQGFkZHRvZ3JvdXAgUFdSX0V4cG9ydGVkX0Z1bmN0aW9ucyBQV1IgRXhwb3J0ZWQgRnVuY3Rpb25zDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGFkZHRvZ3JvdXAgUFdSX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kDQotICogZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zDQotICogQHsNCi0gKi8NCi0NCi0vKiBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zDQotICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi12b2lkIEhBTF9QV1JfRGVJbml0KHZvaWQpOw0KLXZvaWQgSEFMX1BXUl9FbmFibGVCa1VwQWNjZXNzKHZvaWQpOw0KLXZvaWQgSEFMX1BXUl9EaXNhYmxlQmtVcEFjY2Vzcyh2b2lkKTsNCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAYWRkdG9ncm91cCBQV1JfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zDQotICogQHsNCi0gKi8NCi0NCi0vKiBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zDQotICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9QV1JfQ29uZmlnUFZEKFBXUl9QVkRUeXBlRGVmICpzQ29uZmlnUFZEKTsNCi12b2lkIEhBTF9QV1JfRW5hYmxlUFZEKHZvaWQpOw0KLXZvaWQgSEFMX1BXUl9EaXNhYmxlUFZEKHZvaWQpOw0KLQ0KLS8qIFdha2VVcCBwaW5zIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotdm9pZCBIQUxfUFdSX0VuYWJsZVdha2VVcFBpbih1aW50MzJfdCBXYWtlVXBQaW5Qb2xhcml0eSk7DQotdm9pZCBIQUxfUFdSX0Rpc2FibGVXYWtlVXBQaW4odWludDMyX3QgV2FrZVVwUGlueCk7DQotDQotLyogTG93IFBvd2VyIG1vZGVzIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi12b2lkIEhBTF9QV1JfRW50ZXJTTEVFUE1vZGUodWludDMyX3QgUmVndWxhdG9yLCB1aW50OF90IFNMRUVQRW50cnkpOw0KLXZvaWQgSEFMX1BXUl9FbnRlclNUT1BNb2RlKHVpbnQzMl90IFJlZ3VsYXRvciwgdWludDhfdCBTVE9QRW50cnkpOw0KLXZvaWQgSEFMX1BXUl9FbnRlclNUQU5EQllNb2RlKHZvaWQpOw0KLQ0KLXZvaWQgSEFMX1BXUl9FbmFibGVTbGVlcE9uRXhpdCh2b2lkKTsNCi12b2lkIEhBTF9QV1JfRGlzYWJsZVNsZWVwT25FeGl0KHZvaWQpOw0KLXZvaWQgSEFMX1BXUl9FbmFibGVTRVZPblBlbmQodm9pZCk7DQotdm9pZCBIQUxfUFdSX0Rpc2FibGVTRVZPblBlbmQodm9pZCk7DQotDQotdm9pZCBIQUxfUFdSX1BWRENhbGxiYWNrKHZvaWQpOw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotI2lmZGVmIF9fY3BsdXNwbHVzDQotfQ0KLSNlbmRpZg0KLQ0KLSNlbmRpZiAvKiBTVE0zMkc0eHhfSEFMX1BXUl9IICovDQorLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAZmlsZSAgICBzdG0zMmc0eHhfaGFsX3B3ci5oCisgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgUFdSIEhBTCBtb2R1bGUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYXR0ZW50aW9uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0ZXJtcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlCisgKiBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb2Z0d2FyZSBjb21wb25lbnQuCisgKiBJZiBubyBMSUNFTlNFIGZpbGUgY29tZXMgd2l0aCB0aGlzIHNvZnR3YXJlLCBpdCBpcyBwcm92aWRlZCBBUy1JUy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJHNHh4X0hBTF9QV1JfSAorI2RlZmluZSBTVE0zMkc0eHhfSEFMX1BXUl9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmc0eHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHNHh4X0hBTF9Ecml2ZXIKKyAqIEB7CisgKi8KKworLyoqIEBhZGR0b2dyb3VwIFBXUgorICogQHsKKyAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIFBXUl9FeHBvcnRlZF9UeXBlcyBQV1IgRXhwb3J0ZWQgVHlwZXMKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgIFBXUiBQVkQgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQzMl90IFBWRExldmVsOyAvKiE8IFBWRExldmVsOiBTcGVjaWZpZXMgdGhlIFBWRCBkZXRlY3Rpb24gbGV2ZWwuCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgIFBXUl9QVkRfZGV0ZWN0aW9uX2xldmVsLiAqLworCisgIHVpbnQzMl90IE1vZGU7IC8qITwgTW9kZTogU3BlY2lmaWVzIHRoZSBvcGVyYXRpbmcgbW9kZSBmb3IgdGhlIHNlbGVjdGVkIHBpbnMuCisgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBQV1JfUFZEX01vZGUuICovCit9IFBXUl9QVkRUeXBlRGVmOworCisvKioKKyAqIEB9CisgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBQV1JfRXhwb3J0ZWRfQ29uc3RhbnRzIFBXUiBFeHBvcnRlZCBDb25zdGFudHMKKyAqIEB7CisgKi8KKworLyoqIEBkZWZncm91cCBQV1JfUFZEX2RldGVjdGlvbl9sZXZlbCBQcm9ncmFtbWFibGUgVm9sdGFnZSBEZXRlY3Rpb24gbGV2ZWxzCisgKiBAeworICovCisjZGVmaW5lIFBXUl9QVkRMRVZFTF8wIFBXUl9DUjJfUExTX0xFVjAgLyohPCBQVkQgdGhyZXNob2xkIGFyb3VuZCAyLjAgViAqLworI2RlZmluZSBQV1JfUFZETEVWRUxfMSBQV1JfQ1IyX1BMU19MRVYxIC8qITwgUFZEIHRocmVzaG9sZCBhcm91bmQgMi4yIFYgKi8KKyNkZWZpbmUgUFdSX1BWRExFVkVMXzIgUFdSX0NSMl9QTFNfTEVWMiAvKiE8IFBWRCB0aHJlc2hvbGQgYXJvdW5kIDIuNCBWICovCisjZGVmaW5lIFBXUl9QVkRMRVZFTF8zIFBXUl9DUjJfUExTX0xFVjMgLyohPCBQVkQgdGhyZXNob2xkIGFyb3VuZCAyLjUgViAqLworI2RlZmluZSBQV1JfUFZETEVWRUxfNCBQV1JfQ1IyX1BMU19MRVY0IC8qITwgUFZEIHRocmVzaG9sZCBhcm91bmQgMi42IFYgKi8KKyNkZWZpbmUgUFdSX1BWRExFVkVMXzUgUFdSX0NSMl9QTFNfTEVWNSAvKiE8IFBWRCB0aHJlc2hvbGQgYXJvdW5kIDIuOCBWICovCisjZGVmaW5lIFBXUl9QVkRMRVZFTF82IFBXUl9DUjJfUExTX0xFVjYgLyohPCBQVkQgdGhyZXNob2xkIGFyb3VuZCAyLjkgViAqLworI2RlZmluZSBQV1JfUFZETEVWRUxfNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBQV1JfQ1IyX1BMU19MRVY3IC8qITwgRXh0ZXJuYWwgaW5wdXQgYW5hbG9nIHZvbHRhZ2UgKGNvbXBhcmVkIGludGVybmFsbHkgdG8gXAorICAgICAgICAgICAgICAgICAgICAgIFZSRUZJTlQpICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBQV1JfUFZEX01vZGUgIFBXUiBQVkQgaW50ZXJydXB0IGFuZCBldmVudCBtb2RlCisgKiBAeworICovCisjZGVmaW5lIFBXUl9QVkRfTU9ERV9OT1JNQUwgKCh1aW50MzJfdCkweDAwMDAwMDAwKSAvKiE8IEJhc2ljIG1vZGUgaXMgdXNlZCAqLworI2RlZmluZSBQV1JfUFZEX01PREVfSVRfUklTSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCh1aW50MzJfdCkweDAwMDEwMDAxKSAvKiE8IEV4dGVybmFsIEludGVycnVwdCBNb2RlIHdpdGggUmlzaW5nIGVkZ2UgdHJpZ2dlciBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0ZWN0aW9uICovCisjZGVmaW5lIFBXUl9QVkRfTU9ERV9JVF9GQUxMSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgodWludDMyX3QpMHgwMDAxMDAwMikgLyohPCBFeHRlcm5hbCBJbnRlcnJ1cHQgTW9kZSB3aXRoIEZhbGxpbmcgZWRnZSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlciBkZXRlY3Rpb24gKi8KKyNkZWZpbmUgUFdSX1BWRF9NT0RFX0lUX1JJU0lOR19GQUxMSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgodWludDMyX3QpMHgwMDAxMDAwMykgLyohPCBFeHRlcm5hbCBJbnRlcnJ1cHQgTW9kZSB3aXRoIFJpc2luZy9GYWxsaW5nIGVkZ2UgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXIgZGV0ZWN0aW9uICovCisjZGVmaW5lIFBXUl9QVkRfTU9ERV9FVkVOVF9SSVNJTkcgXAorICAoKHVpbnQzMl90KTB4MDAwMjAwMDEpIC8qITwgRXZlbnQgTW9kZSB3aXRoIFJpc2luZyBlZGdlIHRyaWdnZXIgZGV0ZWN0aW9uICovCisjZGVmaW5lIFBXUl9QVkRfTU9ERV9FVkVOVF9GQUxMSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCh1aW50MzJfdCkweDAwMDIwMDAyKSAvKiE8IEV2ZW50IE1vZGUgd2l0aCBGYWxsaW5nIGVkZ2UgdHJpZ2dlciBkZXRlY3Rpb24gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBQV1JfUFZEX01PREVfRVZFTlRfUklTSU5HX0ZBTExJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgodWludDMyX3QpMHgwMDAyMDAwMykgLyohPCBFdmVudCBNb2RlIHdpdGggUmlzaW5nL0ZhbGxpbmcgZWRnZSB0cmlnZ2VyIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRlY3Rpb24gKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFBXUl9SZWd1bGF0b3Jfc3RhdGVfaW5fU0xFRVBfU1RPUF9tb2RlICBQV1IgcmVndWxhdG9yIG1vZGUKKyAqIEB7CisgKi8KKyNkZWZpbmUgUFdSX01BSU5SRUdVTEFUT1JfT04gXAorICAoKHVpbnQzMl90KTB4MDAwMDAwMDApIC8qITwgUmVndWxhdG9yIGluIG1haW4gbW9kZSAgICAgICovCisjZGVmaW5lIFBXUl9MT1dQT1dFUlJFR1VMQVRPUl9PTiAgICAgICAgICAgICAgIFwKKyAgUFdSX0NSMV9MUFIgLyohPCBSZWd1bGF0b3IgaW4gbG93LXBvd2VyIG1vZGUgXAorICAgICAgICAgICAgICAgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFBXUl9TTEVFUF9tb2RlX2VudHJ5ICBQV1IgU0xFRVAgbW9kZSBlbnRyeQorICogQHsKKyAqLworI2RlZmluZSBQV1JfU0xFRVBFTlRSWV9XRkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgodWludDhfdCkweDAxKSAvKiE8IFdhaXQgRm9yIEludGVycnVwdGlvbiBpbnN0cnVjdGlvbiB0byBlbnRlciBTbGVlcCBtb2RlIFwKKyAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBQV1JfU0xFRVBFTlRSWV9XRkUgXAorICAoKHVpbnQ4X3QpMHgwMikgLyohPCBXYWl0IEZvciBFdmVudCBpbnN0cnVjdGlvbiB0byBlbnRlciBTbGVlcCBtb2RlICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBQV1JfU1RPUF9tb2RlX2VudHJ5ICBQV1IgU1RPUCBtb2RlIGVudHJ5CisgKiBAeworICovCisjZGVmaW5lIFBXUl9TVE9QRU5UUllfV0ZJIFwKKyAgKCh1aW50OF90KTB4MDEpIC8qITwgV2FpdCBGb3IgSW50ZXJydXB0aW9uIGluc3RydWN0aW9uIHRvIGVudGVyIFN0b3AgbW9kZSAqLworI2RlZmluZSBQV1JfU1RPUEVOVFJZX1dGRSBcCisgICgodWludDhfdCkweDAyKSAvKiE8IFdhaXQgRm9yIEV2ZW50IGluc3RydWN0aW9uIHRvIGVudGVyIFN0b3AgbW9kZSAgICAgICAgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFBXUl9QVkRfRVhUSV9MSU5FICBQV1IgUFZEIGV4dGVybmFsIGludGVycnVwdCBsaW5lCisgKiBAeworICovCisjZGVmaW5lIFBXUl9FWFRJX0xJTkVfUFZEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgodWludDMyX3QpMHgwMDAxMDAwMCkgLyohPCBFeHRlcm5hbCBpbnRlcnJ1cHQgbGluZSAxNiBDb25uZWN0ZWQgdG8gdGhlIFBWRCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUSSBMaW5lICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBQV1JfUFZEX0VWRU5UX0xJTkUgIFBXUiBQVkQgZXZlbnQgbGluZQorICogQHsKKyAqLworI2RlZmluZSBQV1JfRVZFTlRfTElORV9QVkQgXAorICAoKHVpbnQzMl90KTB4MDAwMTAwMDApIC8qITwgRXZlbnQgbGluZSAxNiBDb25uZWN0ZWQgdG8gdGhlIFBWRCBFdmVudCBMaW5lICovCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFBXUl9FeHBvcnRlZF9NYWNyb3MgIFBXUiBFeHBvcnRlZCBNYWNyb3MKKyAqIEB7CisgKi8KKworLyoqIEBicmllZiAgQ2hlY2sgd2hldGhlciBvciBub3QgYSBzcGVjaWZpYyBQV1IgZmxhZyBpcyBzZXQuCisgICogQHBhcmFtICBfX0ZMQUdfXzogc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNoZWNrLgorICAqICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFBXUl9GTEFHX1dVRjEgV2FrZSBVcCBGbGFnIDEuIEluZGljYXRlcyB0aGF0IGEgd2FrZXVwCitldmVudAorICAqICAgICAgICAgICAgICAgICAgd2FzIHJlY2VpdmVkIGZyb20gdGhlIFdLVVAgcGluIDEuCisgICogICAgICAgICAgICBAYXJnIEByZWYgUFdSX0ZMQUdfV1VGMiBXYWtlIFVwIEZsYWcgMi4gSW5kaWNhdGVzIHRoYXQgYSB3YWtldXAKK2V2ZW50CisgICogICAgICAgICAgICAgICAgICB3YXMgcmVjZWl2ZWQgZnJvbSB0aGUgV0tVUCBwaW4gMi4KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfRkxBR19XVUYzIFdha2UgVXAgRmxhZyAzLiBJbmRpY2F0ZXMgdGhhdCBhIHdha2V1cAorZXZlbnQKKyAgKiAgICAgICAgICAgICAgICAgIHdhcyByZWNlaXZlZCBmcm9tIHRoZSBXS1VQIHBpbiAzLgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFBXUl9GTEFHX1dVRjQgV2FrZSBVcCBGbGFnIDQuIEluZGljYXRlcyB0aGF0IGEgd2FrZXVwCitldmVudAorICAqICAgICAgICAgICAgICAgICAgd2FzIHJlY2VpdmVkIGZyb20gdGhlIFdLVVAgcGluIDQuCisgICogICAgICAgICAgICBAYXJnIEByZWYgUFdSX0ZMQUdfV1VGNSBXYWtlIFVwIEZsYWcgNS4gSW5kaWNhdGVzIHRoYXQgYSB3YWtldXAKK2V2ZW50CisgICogICAgICAgICAgICAgICAgICB3YXMgcmVjZWl2ZWQgZnJvbSB0aGUgV0tVUCBwaW4gNS4KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfRkxBR19TQiBTdGFuZEJ5IEZsYWcuIEluZGljYXRlcyB0aGF0IHRoZSBzeXN0ZW0KKyAgKiAgICAgICAgICAgICAgICAgIGVudGVyZWQgU3RhbmRCeSBtb2RlLgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFBXUl9GTEFHX1dVRkkgV2FrZS1VcCBGbGFnIEludGVybmFsLiBTZXQgd2hlbiBhIHdha2V1cAoraXMgZGV0ZWN0ZWQgb24KKyAgKiAgICAgICAgICAgICAgICAgdGhlIGludGVybmFsIHdha2V1cCBsaW5lLgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFBXUl9GTEFHX1JFR0xQUyBMb3cgUG93ZXIgUmVndWxhdG9yIFN0YXJ0ZWQuIEluZGljYXRlcword2hldGhlciBvciBub3QgdGhlCisgICogICAgICAgICAgICAgICAgIGxvdy1wb3dlciByZWd1bGF0b3IgaXMgcmVhZHkuCisgICogICAgICAgICAgICBAYXJnIEByZWYgUFdSX0ZMQUdfUkVHTFBGIExvdyBQb3dlciBSZWd1bGF0b3IgRmxhZy4gSW5kaWNhdGVzCit3aGV0aGVyIHRoZQorICAqICAgICAgICAgICAgICAgICByZWd1bGF0b3IgaXMgcmVhZHkgaW4gbWFpbiBtb2RlIG9yIGlzIGluIGxvdy1wb3dlciBtb2RlLgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFBXUl9GTEFHX1ZPU0YgVm9sdGFnZSBTY2FsaW5nIEZsYWcuIEluZGljYXRlcyB3aGV0aGVyCit0aGUgcmVndWxhdG9yIGlzIHJlYWR5CisgICogICAgICAgICAgICAgICAgIGluIHRoZSBzZWxlY3RlZCB2b2x0YWdlIHJhbmdlIG9yIGlzIHN0aWxsIGNoYW5naW5nIHRvIHRoZQorcmVxdWlyZWQgdm9sdGFnZSBsZXZlbC4KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfRkxBR19QVkRPIFBvd2VyIFZvbHRhZ2UgRGV0ZWN0b3IgT3V0cHV0LiBJbmRpY2F0ZXMKK3doZXRoZXIgVkREIHZvbHRhZ2UgaXMKKyAgKiAgICAgICAgICAgICAgICAgIGJlbG93IG9yIGFib3ZlIHRoZSBzZWxlY3RlZCBQVkQgdGhyZXNob2xkLgorQGlmIFBXUl9DUjJfUFZNRTEKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfRkxBR19QVk1PMSBQZXJpcGhlcmFsIFZvbHRhZ2UgTW9uaXRvcmluZyBPdXRwdXQgMS4KK0luZGljYXRlcyB3aGV0aGVyIFZERFVTQiB2b2x0YWdlIGlzCisgICogICAgICAgICAgICAgICAgICBpcyBiZWxvdyBvciBhYm92ZSBQVk0xIHRocmVzaG9sZCAoYXBwbGljYWJsZSB3aGVuIFVTQgorZmVhdHVyZSBpcyBzdXBwb3J0ZWQpLgorQGVuZGlmCitAaWYgUFdSX0NSMl9QVk1FMgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFBXUl9GTEFHX1BWTU8yIFBlcmlwaGVyYWwgVm9sdGFnZSBNb25pdG9yaW5nIE91dHB1dCAyLgorSW5kaWNhdGVzIHdoZXRoZXIgVkRESU8yIHZvbHRhZ2UgaXMKKyAgKiAgICAgICAgICAgICAgICAgIGlzIGJlbG93IG9yIGFib3ZlIFBWTTIgdGhyZXNob2xkIChhcHBsaWNhYmxlIHdoZW4gVkRESU8yIGlzCitwcmVzZW50IG9uIGRldmljZSkuCitAZW5kaWYKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfRkxBR19QVk1PMyBQZXJpcGhlcmFsIFZvbHRhZ2UgTW9uaXRvcmluZyBPdXRwdXQgMy4KK0luZGljYXRlcyB3aGV0aGVyIFZEREEgdm9sdGFnZSBpcworICAqICAgICAgICAgICAgICAgICAgaXMgYmVsb3cgb3IgYWJvdmUgUFZNMyB0aHJlc2hvbGQuCisgICogICAgICAgICAgICBAYXJnIEByZWYgUFdSX0ZMQUdfUFZNTzQgUGVyaXBoZXJhbCBWb2x0YWdlIE1vbml0b3JpbmcgT3V0cHV0IDQuCitJbmRpY2F0ZXMgd2hldGhlciBWRERBIHZvbHRhZ2UgaXMKKyAgKiAgICAgICAgICAgICAgICAgIGlzIGJlbG93IG9yIGFib3ZlIFBWTTQgdGhyZXNob2xkLgorICAqCisgICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fRkxBR19fIChUUlVFIG9yIEZBTFNFKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUFdSX0dFVF9GTEFHKF9fRkxBR19fKSAgICAgICAgICAgICBcCisgICgoKCgodWludDhfdCkoX19GTEFHX18pKSA+PiA1VSkgPT0gMSkgICAgICAgICAgXAorICAgICAgID8gKFBXUi0+U1IxICYgKDFVIDw8ICgoX19GTEFHX18pICYgMzFVKSkpIFwKKyAgICAgICA6IChQV1ItPlNSMiAmICgxVSA8PCAoKF9fRkxBR19fKSAmIDMxVSkpKSkKKworLyoqIEBicmllZiAgQ2xlYXIgYSBzcGVjaWZpYyBQV1IgZmxhZy4KKyAqIEBwYXJhbSAgX19GTEFHX186IHNwZWNpZmllcyB0aGUgZmxhZyB0byBjbGVhci4KKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfRkxBR19XVUYxIFdha2UgVXAgRmxhZyAxLiBJbmRpY2F0ZXMgdGhhdCBhIHdha2V1cAorICogZXZlbnQgd2FzIHJlY2VpdmVkIGZyb20gdGhlIFdLVVAgcGluIDEuCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfRkxBR19XVUYyIFdha2UgVXAgRmxhZyAyLiBJbmRpY2F0ZXMgdGhhdCBhIHdha2V1cAorICogZXZlbnQgd2FzIHJlY2VpdmVkIGZyb20gdGhlIFdLVVAgcGluIDIuCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfRkxBR19XVUYzIFdha2UgVXAgRmxhZyAzLiBJbmRpY2F0ZXMgdGhhdCBhIHdha2V1cAorICogZXZlbnQgd2FzIHJlY2VpdmVkIGZyb20gdGhlIFdLVVAgcGluIDMuCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfRkxBR19XVUY0IFdha2UgVXAgRmxhZyA0LiBJbmRpY2F0ZXMgdGhhdCBhIHdha2V1cAorICogZXZlbnQgd2FzIHJlY2VpdmVkIGZyb20gdGhlIFdLVVAgcGluIDQuCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfRkxBR19XVUY1IFdha2UgVXAgRmxhZyA1LiBJbmRpY2F0ZXMgdGhhdCBhIHdha2V1cAorICogZXZlbnQgd2FzIHJlY2VpdmVkIGZyb20gdGhlIFdLVVAgcGluIDUuCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfRkxBR19XVSBFbmNvbXBhc3NlcyBhbGwgZml2ZSBXYWtlIFVwIEZsYWdzLgorICogICAgICAgICAgICBAYXJnIEByZWYgUFdSX0ZMQUdfU0IgU3RhbmRieSBGbGFnLiBJbmRpY2F0ZXMgdGhhdCB0aGUgc3lzdGVtCisgKiAgICAgICAgICAgICAgICAgIGVudGVyZWQgU3RhbmRieSBtb2RlLgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfUFdSX0NMRUFSX0ZMQUcoX19GTEFHX18pICAgIFwKKyAgKCgoKHVpbnQ4X3QpKF9fRkxBR19fKSkgPT0gUFdSX0ZMQUdfV1UpIFwKKyAgICAgICA/IChQV1ItPlNDUiA9IChfX0ZMQUdfXykpICAgICAgICAgIFwKKyAgICAgICA6IChQV1ItPlNDUiA9ICgxVSA8PCAoKF9fRkxBR19fKSAmIDMxVSkpKSkKKy8qKgorICogQGJyaWVmIEVuYWJsZSB0aGUgUFZEIEV4dGVuZGVkIEludGVycnVwdCBMaW5lLgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWRF9FWFRJX0VOQUJMRV9JVCgpIFNFVF9CSVQoRVhUSS0+SU1SMSwgUFdSX0VYVElfTElORV9QVkQpCisKKy8qKgorICogQGJyaWVmIERpc2FibGUgdGhlIFBWRCBFeHRlbmRlZCBJbnRlcnJ1cHQgTGluZS4KKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX1BXUl9QVkRfRVhUSV9ESVNBQkxFX0lUKCkgQ0xFQVJfQklUKEVYVEktPklNUjEsIFBXUl9FWFRJX0xJTkVfUFZEKQorCisvKioKKyAqIEBicmllZiBFbmFibGUgdGhlIFBWRCBFdmVudCBMaW5lLgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWRF9FWFRJX0VOQUJMRV9FVkVOVCgpIFwKKyAgU0VUX0JJVChFWFRJLT5FTVIxLCBQV1JfRVZFTlRfTElORV9QVkQpCisKKy8qKgorICogQGJyaWVmIERpc2FibGUgdGhlIFBWRCBFdmVudCBMaW5lLgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWRF9FWFRJX0RJU0FCTEVfRVZFTlQoKSBcCisgIENMRUFSX0JJVChFWFRJLT5FTVIxLCBQV1JfRVZFTlRfTElORV9QVkQpCisKKy8qKgorICogQGJyaWVmIEVuYWJsZSB0aGUgUFZEIEV4dGVuZGVkIEludGVycnVwdCBSaXNpbmcgVHJpZ2dlci4KKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX1BXUl9QVkRfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKSBcCisgIFNFVF9CSVQoRVhUSS0+UlRTUjEsIFBXUl9FWFRJX0xJTkVfUFZEKQorCisvKioKKyAqIEBicmllZiBEaXNhYmxlIHRoZSBQVkQgRXh0ZW5kZWQgSW50ZXJydXB0IFJpc2luZyBUcmlnZ2VyLgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWRF9FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKSBcCisgIENMRUFSX0JJVChFWFRJLT5SVFNSMSwgUFdSX0VYVElfTElORV9QVkQpCisKKy8qKgorICogQGJyaWVmIEVuYWJsZSB0aGUgUFZEIEV4dGVuZGVkIEludGVycnVwdCBGYWxsaW5nIFRyaWdnZXIuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9QV1JfUFZEX0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRSgpIFwKKyAgU0VUX0JJVChFWFRJLT5GVFNSMSwgUFdSX0VYVElfTElORV9QVkQpCisKKy8qKgorICogQGJyaWVmIERpc2FibGUgdGhlIFBWRCBFeHRlbmRlZCBJbnRlcnJ1cHQgRmFsbGluZyBUcmlnZ2VyLgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWRF9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCkgXAorICBDTEVBUl9CSVQoRVhUSS0+RlRTUjEsIFBXUl9FWFRJX0xJTkVfUFZEKQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIHRoZSBQVkQgRXh0ZW5kZWQgSW50ZXJydXB0IFJpc2luZyAmIEZhbGxpbmcgVHJpZ2dlci4KKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX1BXUl9QVkRfRVhUSV9FTkFCTEVfUklTSU5HX0ZBTExJTkdfRURHRSgpIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fSEFMX1BXUl9QVkRfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKTsgICAgICAgICAgICBcCisgICAgX19IQUxfUFdSX1BWRF9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKTsgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworLyoqCisgKiBAYnJpZWYgRGlzYWJsZSB0aGUgUFZEIEV4dGVuZGVkIEludGVycnVwdCBSaXNpbmcgJiBGYWxsaW5nIFRyaWdnZXIuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9QV1JfUFZEX0VYVElfRElTQUJMRV9SSVNJTkdfRkFMTElOR19FREdFKCkgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fSEFMX1BXUl9QVkRfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCk7ICAgICAgICAgICAgXAorICAgIF9fSEFMX1BXUl9QVkRfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpOyAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisvKioKKyAqIEBicmllZiAgR2VuZXJhdGUgYSBTb2Z0d2FyZSBpbnRlcnJ1cHQgb24gc2VsZWN0ZWQgRVhUSSBsaW5lLgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWRF9FWFRJX0dFTkVSQVRFX1NXSVQoKSBcCisgIFNFVF9CSVQoRVhUSS0+U1dJRVIxLCBQV1JfRVhUSV9MSU5FX1BWRCkKKworLyoqCisgKiBAYnJpZWYgQ2hlY2sgd2hldGhlciBvciBub3QgdGhlIFBWRCBFWFRJIGludGVycnVwdCBmbGFnIGlzIHNldC4KKyAqIEByZXR2YWwgRVhUSSBQVkQgTGluZSBTdGF0dXMuCisgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWRF9FWFRJX0dFVF9GTEFHKCkgKEVYVEktPlBSMSAmIFBXUl9FWFRJX0xJTkVfUFZEKQorCisvKioKKyAqIEBicmllZiBDbGVhciB0aGUgUFZEIEVYVEkgaW50ZXJydXB0IGZsYWcuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9QV1JfUFZEX0VYVElfQ0xFQVJfRkxBRygpIFdSSVRFX1JFRyhFWFRJLT5QUjEsIFBXUl9FWFRJX0xJTkVfUFZEKQorCisvKioKKyAqIEB9CisgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwICBQV1JfUHJpdmF0ZV9NYWNyb3MgICBQV1IgUHJpdmF0ZSBNYWNyb3MKKyAqIEB7CisgKi8KKworI2RlZmluZSBJU19QV1JfUFZEX0xFVkVMKExFVkVMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKExFVkVMKSA9PSBQV1JfUFZETEVWRUxfMCkgfHwgKChMRVZFTCkgPT0gUFdSX1BWRExFVkVMXzEpIHx8IFwKKyAgICgoTEVWRUwpID09IFBXUl9QVkRMRVZFTF8yKSB8fCAoKExFVkVMKSA9PSBQV1JfUFZETEVWRUxfMykgfHwgXAorICAgKChMRVZFTCkgPT0gUFdSX1BWRExFVkVMXzQpIHx8ICgoTEVWRUwpID09IFBXUl9QVkRMRVZFTF81KSB8fCBcCisgICAoKExFVkVMKSA9PSBQV1JfUFZETEVWRUxfNikgfHwgKChMRVZFTCkgPT0gUFdSX1BWRExFVkVMXzcpKQorCisjZGVmaW5lIElTX1BXUl9QVkRfTU9ERShNT0RFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKChNT0RFKSA9PSBQV1JfUFZEX01PREVfTk9STUFMKSB8fCAoKE1PREUpID09IFBXUl9QVkRfTU9ERV9JVF9SSVNJTkcpIHx8IFwKKyAgICgoTU9ERSkgPT0gUFdSX1BWRF9NT0RFX0lUX0ZBTExJTkcpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKE1PREUpID09IFBXUl9QVkRfTU9ERV9JVF9SSVNJTkdfRkFMTElORykgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKChNT0RFKSA9PSBQV1JfUFZEX01PREVfRVZFTlRfUklTSU5HKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoTU9ERSkgPT0gUFdSX1BWRF9NT0RFX0VWRU5UX0ZBTExJTkcpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKE1PREUpID09IFBXUl9QVkRfTU9ERV9FVkVOVF9SSVNJTkdfRkFMTElORykpCisKKyNkZWZpbmUgSVNfUFdSX1JFR1VMQVRPUihSRUdVTEFUT1IpICAgICAgICAgXAorICAoKChSRUdVTEFUT1IpID09IFBXUl9NQUlOUkVHVUxBVE9SX09OKSB8fCBcCisgICAoKFJFR1VMQVRPUikgPT0gUFdSX0xPV1BPV0VSUkVHVUxBVE9SX09OKSkKKworI2RlZmluZSBJU19QV1JfU0xFRVBfRU5UUlkoRU5UUlkpIFwKKyAgKCgoRU5UUlkpID09IFBXUl9TTEVFUEVOVFJZX1dGSSkgfHwgKChFTlRSWSkgPT0gUFdSX1NMRUVQRU5UUllfV0ZFKSkKKworI2RlZmluZSBJU19QV1JfU1RPUF9FTlRSWShFTlRSWSkgXAorICAoKChFTlRSWSkgPT0gUFdSX1NUT1BFTlRSWV9XRkkpIHx8ICgoRU5UUlkpID09IFBXUl9TVE9QRU5UUllfV0ZFKSkKKworLyoqCisgKiBAfQorICovCisKKy8qIEluY2x1ZGUgUFdSIEhBTCBFeHRlbmRlZCBtb2R1bGUgKi8KKyNpbmNsdWRlICJzdG0zMmc0eHhfaGFsX3B3cl9leC5oIgorCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGFkZHRvZ3JvdXAgUFdSX0V4cG9ydGVkX0Z1bmN0aW9ucyBQV1IgRXhwb3J0ZWQgRnVuY3Rpb25zCisgKiBAeworICovCisKKy8qKiBAYWRkdG9ncm91cCBQV1JfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQKKyAqIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICogQHsKKyAqLworCisvKiBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBIQUxfUFdSX0RlSW5pdCh2b2lkKTsKK3ZvaWQgSEFMX1BXUl9FbmFibGVCa1VwQWNjZXNzKHZvaWQpOwordm9pZCBIQUxfUFdSX0Rpc2FibGVCa1VwQWNjZXNzKHZvaWQpOworCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBhZGR0b2dyb3VwIFBXUl9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAqIEB7CisgKi8KKworLyogUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BXUl9Db25maWdQVkQoUFdSX1BWRFR5cGVEZWYgKnNDb25maWdQVkQpOwordm9pZCBIQUxfUFdSX0VuYWJsZVBWRCh2b2lkKTsKK3ZvaWQgSEFMX1BXUl9EaXNhYmxlUFZEKHZvaWQpOworCisvKiBXYWtlVXAgcGlucyBjb25maWd1cmF0aW9uIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBIQUxfUFdSX0VuYWJsZVdha2VVcFBpbih1aW50MzJfdCBXYWtlVXBQaW5Qb2xhcml0eSk7Cit2b2lkIEhBTF9QV1JfRGlzYWJsZVdha2VVcFBpbih1aW50MzJfdCBXYWtlVXBQaW54KTsKKworLyogTG93IFBvd2VyIG1vZGVzIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgSEFMX1BXUl9FbnRlclNMRUVQTW9kZSh1aW50MzJfdCBSZWd1bGF0b3IsIHVpbnQ4X3QgU0xFRVBFbnRyeSk7Cit2b2lkIEhBTF9QV1JfRW50ZXJTVE9QTW9kZSh1aW50MzJfdCBSZWd1bGF0b3IsIHVpbnQ4X3QgU1RPUEVudHJ5KTsKK3ZvaWQgSEFMX1BXUl9FbnRlclNUQU5EQllNb2RlKHZvaWQpOworCit2b2lkIEhBTF9QV1JfRW5hYmxlU2xlZXBPbkV4aXQodm9pZCk7Cit2b2lkIEhBTF9QV1JfRGlzYWJsZVNsZWVwT25FeGl0KHZvaWQpOwordm9pZCBIQUxfUFdSX0VuYWJsZVNFVk9uUGVuZCh2b2lkKTsKK3ZvaWQgSEFMX1BXUl9EaXNhYmxlU0VWT25QZW5kKHZvaWQpOworCit2b2lkIEhBTF9QV1JfUFZEQ2FsbGJhY2sodm9pZCk7CisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJHNHh4X0hBTF9QV1JfSCAqLwpkaWZmIC0tZ2l0IGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfaGFsX3B3cl9leC5oIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfaGFsX3B3cl9leC5oCmluZGV4IGM3NTkwNjQuLjlmY2NkODYgMTAwNjQ0Ci0tLSBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9JbmMvc3RtMzJnNHh4X2hhbF9wd3JfZXguaAorKysgYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9oYWxfcHdyX2V4LmgKQEAgLTEsODg3ICsxLDg4NyBAQAotLyoqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEBmaWxlICAgIHN0bTMyZzR4eF9oYWxfcHdyX2V4LmgNCi0gKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQ0KLSAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFBXUiBIQUwgRXh0ZW5kZWQgbW9kdWxlLg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBAYXR0ZW50aW9uDQotICoNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQotICoNCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRlcm1zIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUNCi0gKiBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb2Z0d2FyZSBjb21wb25lbnQuDQotICogSWYgbm8gTElDRU5TRSBmaWxlIGNvbWVzIHdpdGggdGhpcyBzb2Z0d2FyZSwgaXQgaXMgcHJvdmlkZWQgQVMtSVMuDQotICoNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICovDQotDQotLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaWZuZGVmIFNUTTMyRzR4eF9IQUxfUFdSX0VYX0gNCi0jZGVmaW5lIFNUTTMyRzR4eF9IQUxfUFdSX0VYX0gNCi0NCi0jaWZkZWYgX19jcGx1c3BsdXMNCi1leHRlcm4gIkMiIHsNCi0jZW5kaWYNCi0NCi0vKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpbmNsdWRlICJzdG0zMmc0eHhfaGFsX2RlZi5oIg0KLQ0KLS8qKiBAYWRkdG9ncm91cCBTVE0zMkc0eHhfSEFMX0RyaXZlcg0KLSAqIEB7DQotICovDQotDQotLyoqIEBhZGR0b2dyb3VwIFBXUkV4DQotICogQHsNCi0gKi8NCi0NCi0vKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUFdSRXhfRXhwb3J0ZWRfVHlwZXMgUFdSIEV4dGVuZGVkIEV4cG9ydGVkIFR5cGVzDQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFBXUiBQVk0gY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbg0KLSAqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gIHVpbnQzMl90IFBWTVR5cGU7IC8qITwgUFZNVHlwZTogU3BlY2lmaWVzIHdoaWNoIHZvbHRhZ2UgaXMgbW9uaXRvcmVkIGFuZA0KLSAgICAgICAgICAgICAgICAgICAgICAgYWdhaW5zdCB3aGljaCB0aHJlc2hvbGQuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mDQotICAgICAgICAgICAgICAgICAgICAgICBAcmVmIFBXUkV4X1BWTV9UeXBlLiAqLw0KLSAgdWludDMyX3QgTW9kZTsgLyohPCBNb2RlOiBTcGVjaWZpZXMgdGhlIG9wZXJhdGluZyBtb2RlIGZvciB0aGUgc2VsZWN0ZWQgcGlucy4NCi0gICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBQV1JFeF9QVk1fTW9kZS4gKi8NCi19IFBXUl9QVk1UeXBlRGVmOw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0NCi0vKiogQGRlZmdyb3VwIFBXUkV4X0V4cG9ydGVkX0NvbnN0YW50cyAgUFdSIEV4dGVuZGVkIEV4cG9ydGVkIENvbnN0YW50cw0KLSAqIEB7DQotICovDQotDQotLyoqIEBkZWZncm91cCBQV1JFeF9XVVBfUG9sYXJpdHkgU2hpZnQgdG8gYXBwbHkgdG8gcmV0cmlldmUgcG9sYXJpdHkgaW5mb3JtYXRpb24NCi0gKiBmcm9tIFBXUl9XQUtFVVBfUElOeV94eHggY29uc3RhbnRzDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFBXUl9XVVBfUE9MQVJJVFlfU0hJRlQgXA0KLSAgMHgwNVUgLyohPCBJbnRlcm5hbCBjb25zdGFudCB1c2VkIHRvIHJldHJpZXZlIHdha2V1cCBwaW4gcG9sYXJpcnkgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUFdSRXhfV2FrZVVwX1BpbnMgIFBXUiB3YWtlLXVwIHBpbnMNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgUFdSX1dBS0VVUF9QSU4xIFwNCi0gIFBXUl9DUjNfRVdVUDEgLyohPCBXYWtldXAgcGluIDEgKHdpdGggaGlnaCBsZXZlbCBwb2xhcml0eSkgKi8NCi0jZGVmaW5lIFBXUl9XQUtFVVBfUElOMiBcDQotICBQV1JfQ1IzX0VXVVAyIC8qITwgV2FrZXVwIHBpbiAyICh3aXRoIGhpZ2ggbGV2ZWwgcG9sYXJpdHkpICovDQotI2RlZmluZSBQV1JfV0FLRVVQX1BJTjMgXA0KLSAgUFdSX0NSM19FV1VQMyAvKiE8IFdha2V1cCBwaW4gMyAod2l0aCBoaWdoIGxldmVsIHBvbGFyaXR5KSAqLw0KLSNkZWZpbmUgUFdSX1dBS0VVUF9QSU40IFwNCi0gIFBXUl9DUjNfRVdVUDQgLyohPCBXYWtldXAgcGluIDQgKHdpdGggaGlnaCBsZXZlbCBwb2xhcml0eSkgKi8NCi0jZGVmaW5lIFBXUl9XQUtFVVBfUElONSBcDQotICBQV1JfQ1IzX0VXVVA1IC8qITwgV2FrZXVwIHBpbiA1ICh3aXRoIGhpZ2ggbGV2ZWwgcG9sYXJpdHkpICovDQotI2RlZmluZSBQV1JfV0FLRVVQX1BJTjFfSElHSCBcDQotICBQV1JfQ1IzX0VXVVAxIC8qITwgV2FrZXVwIHBpbiAxICh3aXRoIGhpZ2ggbGV2ZWwgcG9sYXJpdHkpICovDQotI2RlZmluZSBQV1JfV0FLRVVQX1BJTjJfSElHSCBcDQotICBQV1JfQ1IzX0VXVVAyIC8qITwgV2FrZXVwIHBpbiAyICh3aXRoIGhpZ2ggbGV2ZWwgcG9sYXJpdHkpICovDQotI2RlZmluZSBQV1JfV0FLRVVQX1BJTjNfSElHSCBcDQotICBQV1JfQ1IzX0VXVVAzIC8qITwgV2FrZXVwIHBpbiAzICh3aXRoIGhpZ2ggbGV2ZWwgcG9sYXJpdHkpICovDQotI2RlZmluZSBQV1JfV0FLRVVQX1BJTjRfSElHSCBcDQotICBQV1JfQ1IzX0VXVVA0IC8qITwgV2FrZXVwIHBpbiA0ICh3aXRoIGhpZ2ggbGV2ZWwgcG9sYXJpdHkpICovDQotI2RlZmluZSBQV1JfV0FLRVVQX1BJTjVfSElHSCBcDQotICBQV1JfQ1IzX0VXVVA1IC8qITwgV2FrZXVwIHBpbiA1ICh3aXRoIGhpZ2ggbGV2ZWwgcG9sYXJpdHkpICovDQotI2RlZmluZSBQV1JfV0FLRVVQX1BJTjFfTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICh1aW50MzJfdCkoKFBXUl9DUjRfV1AxIDw8IFBXUl9XVVBfUE9MQVJJVFlfU0hJRlQpIHwgXA0KLSAgICAgICAgICAgICBQV1JfQ1IzX0VXVVAxKSAvKiE8IFdha2V1cCBwaW4gMSAod2l0aCBsb3cgbGV2ZWwgcG9sYXJpdHkpICovDQotI2RlZmluZSBQV1JfV0FLRVVQX1BJTjJfTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICh1aW50MzJfdCkoKFBXUl9DUjRfV1AyIDw8IFBXUl9XVVBfUE9MQVJJVFlfU0hJRlQpIHwgXA0KLSAgICAgICAgICAgICBQV1JfQ1IzX0VXVVAyKSAvKiE8IFdha2V1cCBwaW4gMiAod2l0aCBsb3cgbGV2ZWwgcG9sYXJpdHkpICovDQotI2RlZmluZSBQV1JfV0FLRVVQX1BJTjNfTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICh1aW50MzJfdCkoKFBXUl9DUjRfV1AzIDw8IFBXUl9XVVBfUE9MQVJJVFlfU0hJRlQpIHwgXA0KLSAgICAgICAgICAgICBQV1JfQ1IzX0VXVVAzKSAvKiE8IFdha2V1cCBwaW4gMyAod2l0aCBsb3cgbGV2ZWwgcG9sYXJpdHkpICovDQotI2RlZmluZSBQV1JfV0FLRVVQX1BJTjRfTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICh1aW50MzJfdCkoKFBXUl9DUjRfV1A0IDw8IFBXUl9XVVBfUE9MQVJJVFlfU0hJRlQpIHwgXA0KLSAgICAgICAgICAgICBQV1JfQ1IzX0VXVVA0KSAvKiE8IFdha2V1cCBwaW4gNCAod2l0aCBsb3cgbGV2ZWwgcG9sYXJpdHkpICovDQotI2RlZmluZSBQV1JfV0FLRVVQX1BJTjVfTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICh1aW50MzJfdCkoKFBXUl9DUjRfV1A1IDw8IFBXUl9XVVBfUE9MQVJJVFlfU0hJRlQpIHwgXA0KLSAgICAgICAgICAgICBQV1JfQ1IzX0VXVVA1KSAvKiE8IFdha2V1cCBwaW4gNSAod2l0aCBsb3cgbGV2ZWwgcG9sYXJpdHkpICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFBXUkV4X1BWTV9UeXBlIFBlcmlwaGVyYWwgVm9sdGFnZSBNb25pdG9yaW5nIHR5cGUNCi0gKiBAew0KLSAqLw0KLSNpZiBkZWZpbmVkKFBXUl9DUjJfUFZNRTEpDQotI2RlZmluZSBQV1JfUFZNXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIFBXUl9DUjJfUFZNRTEgLyohPCBQZXJpcGhlcmFsIFZvbHRhZ2UgTW9uaXRvcmluZyAxIGVuYWJsZTogVkREVVNCIHZlcnN1cyAxLjIgXA0KLSAgICAgICAgICAgICAgICAgICBWIChhcHBsaWNhYmxlIHdoZW4gVVNCIGZlYXR1cmUgaXMgc3VwcG9ydGVkKSAqLw0KLSNlbmRpZiAgICAgICAgICAvKiBQV1JfQ1IyX1BWTUUxICovDQotI2lmIGRlZmluZWQoUFdSX0NSMl9QVk1FMikNCi0jZGVmaW5lIFBXUl9QVk1fMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgUFdSX0NSMl9QVk1FMiAvKiE8IFBlcmlwaGVyYWwgVm9sdGFnZSBNb25pdG9yaW5nIDIgZW5hYmxlOiBWRERJTzIgdmVyc3VzIDAuOSBcDQotICAgICAgICAgICAgICAgICAgIFYgKGFwcGxpY2FibGUgd2hlbiBWRERJTzIgaXMgcHJlc2VudCBvbiBkZXZpY2UpICovDQotI2VuZGlmICAgICAgICAgIC8qIFBXUl9DUjJfUFZNRTIgKi8NCi0jZGVmaW5lIFBXUl9QVk1fMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBQV1JfQ1IyX1BWTUUzIC8qITwgUGVyaXBoZXJhbCBWb2x0YWdlIE1vbml0b3JpbmcgMyBlbmFibGU6IFZEREEgdmVyc3VzIDEuNjIgXA0KLSAgICAgICAgICAgICAgICAgICBWICovDQotI2RlZmluZSBQV1JfUFZNXzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIFBXUl9DUjJfUFZNRTQgLyohPCBQZXJpcGhlcmFsIFZvbHRhZ2UgTW9uaXRvcmluZyA0IGVuYWJsZTogVkREQSB2ZXJzdXMgMi4yIFYgXA0KLSAgICAgICAgICAgICAgICAgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUFdSRXhfUFZNX01vZGUgIFBXUiBQVk0gaW50ZXJydXB0IGFuZCBldmVudCBtb2RlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFBXUl9QVk1fTU9ERV9OT1JNQUwgMHgwMDAwMDAwMFUgLyohPCBiYXNpYyBtb2RlIGlzIHVzZWQgKi8NCi0jZGVmaW5lIFBXUl9QVk1fTU9ERV9JVF9SSVNJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAweDAwMDEwMDAxVSAvKiE8IEV4dGVybmFsIEludGVycnVwdCBNb2RlIHdpdGggUmlzaW5nIGVkZ2UgdHJpZ2dlciBkZXRlY3Rpb24gXA0KLSAgICAgICAgICAgICAgICovDQotI2RlZmluZSBQV1JfUFZNX01PREVfSVRfRkFMTElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIDB4MDAwMTAwMDJVIC8qITwgRXh0ZXJuYWwgSW50ZXJydXB0IE1vZGUgd2l0aCBGYWxsaW5nIGVkZ2UgdHJpZ2dlciBkZXRlY3Rpb24gXA0KLSAgICAgICAgICAgICAgICovDQotI2RlZmluZSBQV1JfUFZNX01PREVfSVRfUklTSU5HX0ZBTExJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIDB4MDAwMTAwMDNVIC8qITwgRXh0ZXJuYWwgSW50ZXJydXB0IE1vZGUgd2l0aCBSaXNpbmcvRmFsbGluZyBlZGdlIHRyaWdnZXIgXA0KLSAgICAgICAgICAgICAgICAgZGV0ZWN0aW9uICovDQotI2RlZmluZSBQV1JfUFZNX01PREVfRVZFTlRfUklTSU5HIFwNCi0gIDB4MDAwMjAwMDFVIC8qITwgRXZlbnQgTW9kZSB3aXRoIFJpc2luZyBlZGdlIHRyaWdnZXIgZGV0ZWN0aW9uICovDQotI2RlZmluZSBQV1JfUFZNX01PREVfRVZFTlRfRkFMTElORyBcDQotICAweDAwMDIwMDAyVSAvKiE8IEV2ZW50IE1vZGUgd2l0aCBGYWxsaW5nIGVkZ2UgdHJpZ2dlciBkZXRlY3Rpb24gKi8NCi0jZGVmaW5lIFBXUl9QVk1fTU9ERV9FVkVOVF9SSVNJTkdfRkFMTElORyBcDQotICAweDAwMDIwMDAzVSAvKiE8IEV2ZW50IE1vZGUgd2l0aCBSaXNpbmcvRmFsbGluZyBlZGdlIHRyaWdnZXIgZGV0ZWN0aW9uICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFBXUkV4X1JlZ3VsYXRvcl9Wb2x0YWdlX1NjYWxlICBQV1IgUmVndWxhdG9yIHZvbHRhZ2Ugc2NhbGUNCi0gKiBAew0KLSAqLw0KLSNpZiBkZWZpbmVkKFBXUl9DUjVfUjFNT0RFKQ0KLSNkZWZpbmUgUFdSX1JFR1VMQVRPUl9WT0xUQUdFX1NDQUxFMV9CT09TVCBcDQotICAoKHVpbnQzMl90KTB4MDAwMDAwMDApIC8qITwgVm9sdGFnZSBzY2FsaW5nIHJhbmdlIDEgYm9vc3QgbW9kZSAgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgLypQV1JfQ1I1X1IxTU9ERSAqLw0KLSNkZWZpbmUgUFdSX1JFR1VMQVRPUl9WT0xUQUdFX1NDQUxFMSBcDQotICBQV1JfQ1IxX1ZPU18wIC8qITwgVm9sdGFnZSBzY2FsaW5nIHJhbmdlIDEgbm9ybWFsIG1vZGUgKi8NCi0jZGVmaW5lIFBXUl9SRUdVTEFUT1JfVk9MVEFHRV9TQ0FMRTIgXA0KLSAgUFdSX0NSMV9WT1NfMSAvKiE8IFZvbHRhZ2Ugc2NhbGluZyByYW5nZSAyICAgICAgICAgICAgICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFBXUkV4X1ZCQVRfQmF0dGVyeV9DaGFyZ2luZ19TZWxlY3Rpb24gUFdSIGJhdHRlcnkgY2hhcmdpbmcNCi0gKiByZXNpc3RvciBzZWxlY3Rpb24NCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgUFdSX0JBVFRFUllfQ0hBUkdJTkdfUkVTSVNUT1JfNSBcDQotICAweDAwMDAwMDAwVSAvKiE8IFZCQVQgY2hhcmdpbmcgdGhyb3VnaCBhIDUga09obXMgcmVzaXN0b3IgICAqLw0KLSNkZWZpbmUgUFdSX0JBVFRFUllfQ0hBUkdJTkdfUkVTSVNUT1JfMV81IFwNCi0gIFBXUl9DUjRfVkJSUyAvKiE8IFZCQVQgY2hhcmdpbmcgdGhyb3VnaCBhIDEuNSBrT2htcyByZXNpc3RvciAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBQV1JFeF9WQkFUX0JhdHRlcnlfQ2hhcmdpbmcgUFdSIGJhdHRlcnkgY2hhcmdpbmcNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgUFdSX0JBVFRFUllfQ0hBUkdJTkdfRElTQUJMRSAweDAwMDAwMDAwVQ0KLSNkZWZpbmUgUFdSX0JBVFRFUllfQ0hBUkdJTkdfRU5BQkxFIFBXUl9DUjRfVkJFDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFBXUkV4X0dQSU9fQml0X051bWJlciBHUElPIGJpdCBudW1iZXIgZm9yIEkvTyBzZXR0aW5nIGluDQotICogc3RhbmRieS9zaHV0ZG93biBtb2RlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFBXUl9HUElPX0JJVF8wIFBXUl9QVUNSQV9QQTAgICAvKiE8IEdQSU8gcG9ydCBJL08gcGluIDAgICovDQotI2RlZmluZSBQV1JfR1BJT19CSVRfMSBQV1JfUFVDUkFfUEExICAgLyohPCBHUElPIHBvcnQgSS9PIHBpbiAxICAqLw0KLSNkZWZpbmUgUFdSX0dQSU9fQklUXzIgUFdSX1BVQ1JBX1BBMiAgIC8qITwgR1BJTyBwb3J0IEkvTyBwaW4gMiAgKi8NCi0jZGVmaW5lIFBXUl9HUElPX0JJVF8zIFBXUl9QVUNSQV9QQTMgICAvKiE8IEdQSU8gcG9ydCBJL08gcGluIDMgICovDQotI2RlZmluZSBQV1JfR1BJT19CSVRfNCBQV1JfUFVDUkFfUEE0ICAgLyohPCBHUElPIHBvcnQgSS9PIHBpbiA0ICAqLw0KLSNkZWZpbmUgUFdSX0dQSU9fQklUXzUgUFdSX1BVQ1JBX1BBNSAgIC8qITwgR1BJTyBwb3J0IEkvTyBwaW4gNSAgKi8NCi0jZGVmaW5lIFBXUl9HUElPX0JJVF82IFBXUl9QVUNSQV9QQTYgICAvKiE8IEdQSU8gcG9ydCBJL08gcGluIDYgICovDQotI2RlZmluZSBQV1JfR1BJT19CSVRfNyBQV1JfUFVDUkFfUEE3ICAgLyohPCBHUElPIHBvcnQgSS9PIHBpbiA3ICAqLw0KLSNkZWZpbmUgUFdSX0dQSU9fQklUXzggUFdSX1BVQ1JBX1BBOCAgIC8qITwgR1BJTyBwb3J0IEkvTyBwaW4gOCAgKi8NCi0jZGVmaW5lIFBXUl9HUElPX0JJVF85IFBXUl9QVUNSQV9QQTkgICAvKiE8IEdQSU8gcG9ydCBJL08gcGluIDkgICovDQotI2RlZmluZSBQV1JfR1BJT19CSVRfMTAgUFdSX1BVQ1JBX1BBMTAgLyohPCBHUElPIHBvcnQgSS9PIHBpbiAxMCAqLw0KLSNkZWZpbmUgUFdSX0dQSU9fQklUXzExIFBXUl9QVUNSQV9QQTExIC8qITwgR1BJTyBwb3J0IEkvTyBwaW4gMTEgKi8NCi0jZGVmaW5lIFBXUl9HUElPX0JJVF8xMiBQV1JfUFVDUkFfUEExMiAvKiE8IEdQSU8gcG9ydCBJL08gcGluIDEyICovDQotI2RlZmluZSBQV1JfR1BJT19CSVRfMTMgUFdSX1BVQ1JBX1BBMTMgLyohPCBHUElPIHBvcnQgSS9PIHBpbiAxMyAqLw0KLSNkZWZpbmUgUFdSX0dQSU9fQklUXzE0IFBXUl9QRENSQV9QQTE0IC8qITwgR1BJTyBwb3J0IEkvTyBwaW4gMTQgKi8NCi0jZGVmaW5lIFBXUl9HUElPX0JJVF8xNSBQV1JfUFVDUkFfUEExNSAvKiE8IEdQSU8gcG9ydCBJL08gcGluIDE1ICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFBXUkV4X0dQSU8gR1BJTyBwb3J0DQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFBXUl9HUElPX0EgMHgwMDAwMDAwMFUgLyohPCBHUElPIHBvcnQgQSAqLw0KLSNkZWZpbmUgUFdSX0dQSU9fQiAweDAwMDAwMDAxVSAvKiE8IEdQSU8gcG9ydCBCICovDQotI2RlZmluZSBQV1JfR1BJT19DIDB4MDAwMDAwMDJVIC8qITwgR1BJTyBwb3J0IEMgKi8NCi0jZGVmaW5lIFBXUl9HUElPX0QgMHgwMDAwMDAwM1UgLyohPCBHUElPIHBvcnQgRCAqLw0KLSNkZWZpbmUgUFdSX0dQSU9fRSAweDAwMDAwMDA0VSAvKiE8IEdQSU8gcG9ydCBFICovDQotI2RlZmluZSBQV1JfR1BJT19GIDB4MDAwMDAwMDVVIC8qITwgR1BJTyBwb3J0IEYgKi8NCi0jZGVmaW5lIFBXUl9HUElPX0cgMHgwMDAwMDAwNlUgLyohPCBHUElPIHBvcnQgRyAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBQV1JFeF9QVk1fRVhUSV9MSU5FIFBXUiBQVk0gZXh0ZXJuYWwgaW50ZXJydXB0cyBsaW5lcw0KLSAqIEB7DQotICovDQotI2lmIGRlZmluZWQoUFdSX0NSMl9QVk1FMSkNCi0jZGVmaW5lIFBXUl9FWFRJX0xJTkVfUFZNMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAweDAwMDAwMDA4VSAvKiE8IEV4dGVybmFsIGludGVycnVwdCBsaW5lIDM1IENvbm5lY3RlZCB0byB0aGUgUFZNMSBFWFRJIExpbmUgXA0KLSAgICAgICAgICAgICAgICovDQotI2VuZGlmICAgICAgICAvKiBQV1JfQ1IyX1BWTUUxICovDQotI2lmIGRlZmluZWQoUFdSX0NSMl9QVk1FMikNCi0jZGVmaW5lIFBXUl9FWFRJX0xJTkVfUFZNMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAweDAwMDAwMDEwVSAvKiE8IEV4dGVybmFsIGludGVycnVwdCBsaW5lIDM2IENvbm5lY3RlZCB0byB0aGUgUFZNMiBFWFRJIExpbmUgXA0KLSAgICAgICAgICAgICAgICovDQotI2VuZGlmICAgICAgICAvKiBQV1JfQ1IyX1BWTUUyICovDQotI2RlZmluZSBQV1JfRVhUSV9MSU5FX1BWTTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgMHgwMDAwMDAyMFUgLyohPCBFeHRlcm5hbCBpbnRlcnJ1cHQgbGluZSAzNyBDb25uZWN0ZWQgdG8gdGhlIFBWTTMgRVhUSSBMaW5lIFwNCi0gICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgUFdSX0VYVElfTElORV9QVk00ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIDB4MDAwMDAwNDBVIC8qITwgRXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUgMzggQ29ubmVjdGVkIHRvIHRoZSBQVk00IEVYVEkgTGluZSBcDQotICAgICAgICAgICAgICAgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUFdSRXhfUFZNX0VWRU5UX0xJTkUgUFdSIFBWTSBldmVudCBsaW5lcw0KLSAqIEB7DQotICovDQotI2lmIGRlZmluZWQoUFdSX0NSMl9QVk1FMSkNCi0jZGVmaW5lIFBXUl9FVkVOVF9MSU5FX1BWTTEgXA0KLSAgMHgwMDAwMDAwOFUgLyohPCBFdmVudCBsaW5lIDM1IENvbm5lY3RlZCB0byB0aGUgUFZNMSBFWFRJIExpbmUgKi8NCi0jZW5kaWYgICAgICAgIC8qIFBXUl9DUjJfUFZNRTEgKi8NCi0jaWYgZGVmaW5lZChQV1JfQ1IyX1BWTUUyKQ0KLSNkZWZpbmUgUFdSX0VWRU5UX0xJTkVfUFZNMiBcDQotICAweDAwMDAwMDEwVSAvKiE8IEV2ZW50IGxpbmUgMzYgQ29ubmVjdGVkIHRvIHRoZSBQVk0yIEVYVEkgTGluZSAqLw0KLSNlbmRpZiAgICAgICAgLyogUFdSX0NSMl9QVk1FMiAqLw0KLSNkZWZpbmUgUFdSX0VWRU5UX0xJTkVfUFZNMyBcDQotICAweDAwMDAwMDIwVSAvKiE8IEV2ZW50IGxpbmUgMzcgQ29ubmVjdGVkIHRvIHRoZSBQVk0zIEVYVEkgTGluZSAqLw0KLSNkZWZpbmUgUFdSX0VWRU5UX0xJTkVfUFZNNCBcDQotICAweDAwMDAwMDQwVSAvKiE8IEV2ZW50IGxpbmUgMzggQ29ubmVjdGVkIHRvIHRoZSBQVk00IEVYVEkgTGluZSAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBQV1JFeF9GbGFnICBQV1IgU3RhdHVzIEZsYWdzDQotICogICAgICAgIEVsZW1lbnRzIHZhbHVlcyBjb252ZW50aW9uOiAwMDAwIDAwMDAgMFhYWSBZWVlZYg0KLSAqICAgICAgICAgICAtIFkgWVlZWSAgOiBGbGFnIHBvc2l0aW9uIGluIHRoZSBYWCByZWdpc3RlciAoNSBiaXRzKQ0KLSAqICAgICAgICAgICAtIFhYICA6IFN0YXR1cyByZWdpc3RlciAoMiBiaXRzKQ0KLSAqICAgICAgICAgICAgICAgICAtIDAxOiBTUjEgcmVnaXN0ZXINCi0gKiAgICAgICAgICAgICAgICAgLSAxMDogU1IyIHJlZ2lzdGVyDQotICogICAgICAgIFRoZSBvbmx5IGV4Y2VwdGlvbiBpcyBQV1JfRkxBR19XVSwgZW5jb21wYXNzaW5nIGFsbA0KLSAqICAgICAgICB3YWtlLXVwIGZsYWdzIGFuZCBzZXQgdG8gUFdSX1NSMV9XVUYuDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFBXUl9GTEFHX1dVRjEgMHgwMDIwVSAvKiE8IFdha2V1cCBldmVudCBvbiB3YWtldXAgcGluIDEgKi8NCi0jZGVmaW5lIFBXUl9GTEFHX1dVRjIgMHgwMDIxVSAvKiE8IFdha2V1cCBldmVudCBvbiB3YWtldXAgcGluIDIgKi8NCi0jZGVmaW5lIFBXUl9GTEFHX1dVRjMgMHgwMDIyVSAvKiE8IFdha2V1cCBldmVudCBvbiB3YWtldXAgcGluIDMgKi8NCi0jZGVmaW5lIFBXUl9GTEFHX1dVRjQgMHgwMDIzVSAvKiE8IFdha2V1cCBldmVudCBvbiB3YWtldXAgcGluIDQgKi8NCi0jZGVmaW5lIFBXUl9GTEFHX1dVRjUgMHgwMDI0VSAvKiE8IFdha2V1cCBldmVudCBvbiB3YWtldXAgcGluIDUgKi8NCi0jZGVmaW5lIFBXUl9GTEFHX1dVIFwNCi0gIFBXUl9TUjFfV1VGICAgICAgICAgICAgICAgICAvKiE8IEVuY29tcGFzcyB3YWtldXAgZXZlbnQgb24gYWxsIHdha2V1cCBwaW5zICovDQotI2RlZmluZSBQV1JfRkxBR19TQiAweDAwMjhVICAgLyohPCBTdGFuZGJ5IGZsYWcgKi8NCi0jZGVmaW5lIFBXUl9GTEFHX1dVRkkgMHgwMDJGVSAvKiE8IFdha2V1cCBvbiBpbnRlcm5hbCB3YWtldXAgbGluZSAqLw0KLQ0KLSNkZWZpbmUgUFdSX0ZMQUdfUkVHTFBTIDB4MDA0OFUgLyohPCBMb3ctcG93ZXIgcmVndWxhdG9yIHN0YXJ0IGZsYWcgKi8NCi0jZGVmaW5lIFBXUl9GTEFHX1JFR0xQRiAweDAwNDlVIC8qITwgTG93LXBvd2VyIHJlZ3VsYXRvciBmbGFnICovDQotI2RlZmluZSBQV1JfRkxBR19WT1NGIDB4MDA0QVUgICAvKiE8IFZvbHRhZ2Ugc2NhbGluZyBmbGFnICovDQotI2RlZmluZSBQV1JfRkxBR19QVkRPIDB4MDA0QlUgICAvKiE8IFBvd2VyIFZvbHRhZ2UgRGV0ZWN0b3Igb3V0cHV0IGZsYWcgKi8NCi0jaWYgZGVmaW5lZChQV1JfQ1IyX1BWTUUxKQ0KLSNkZWZpbmUgUFdSX0ZMQUdfUFZNTzEgMHgwMDRDVSAvKiE8IFBvd2VyIFZvbHRhZ2UgTW9uaXRvcmluZyAxIG91dHB1dCBmbGFnICovDQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBXUl9DUjJfUFZNRTEgKi8NCi0jaWYgZGVmaW5lZChQV1JfQ1IyX1BWTUUyKQ0KLSNkZWZpbmUgUFdSX0ZMQUdfUFZNTzIgMHgwMDREVSAvKiE8IFBvd2VyIFZvbHRhZ2UgTW9uaXRvcmluZyAyIG91dHB1dCBmbGFnICovDQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBXUl9DUjJfUFZNRTIgKi8NCi0jZGVmaW5lIFBXUl9GTEFHX1BWTU8zIDB4MDA0RVUgLyohPCBQb3dlciBWb2x0YWdlIE1vbml0b3JpbmcgMyBvdXRwdXQgZmxhZyAqLw0KLSNkZWZpbmUgUFdSX0ZMQUdfUFZNTzQgMHgwMDRGVSAvKiE8IFBvd2VyIFZvbHRhZ2UgTW9uaXRvcmluZyA0IG91dHB1dCBmbGFnICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBkZWZncm91cCBQV1JFeF9FeHBvcnRlZF9NYWNyb3MgUFdSIEV4dGVuZGVkIEV4cG9ydGVkIE1hY3Jvcw0KLSAqIEB7DQotICovDQotDQotI2lmIGRlZmluZWQoUFdSX0NSMl9QVk1FMSkNCi0vKioNCi0gKiBAYnJpZWYgRW5hYmxlIHRoZSBQVk0xIEV4dGVuZGVkIEludGVycnVwdCBMaW5lLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUFdSX1BWTTFfRVhUSV9FTkFCTEVfSVQoKSBTRVRfQklUKEVYVEktPklNUjIsIFBXUl9FWFRJX0xJTkVfUFZNMSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgRGlzYWJsZSB0aGUgUFZNMSBFeHRlbmRlZCBJbnRlcnJ1cHQgTGluZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1BXUl9QVk0xX0VYVElfRElTQUJMRV9JVCgpIFwNCi0gIENMRUFSX0JJVChFWFRJLT5JTVIyLCBQV1JfRVhUSV9MSU5FX1BWTTEpDQotDQotLyoqDQotICogQGJyaWVmIEVuYWJsZSB0aGUgUFZNMSBFdmVudCBMaW5lLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUFdSX1BWTTFfRVhUSV9FTkFCTEVfRVZFTlQoKSBcDQotICBTRVRfQklUKEVYVEktPkVNUjIsIFBXUl9FVkVOVF9MSU5FX1BWTTEpDQotDQotLyoqDQotICogQGJyaWVmIERpc2FibGUgdGhlIFBWTTEgRXZlbnQgTGluZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1BXUl9QVk0xX0VYVElfRElTQUJMRV9FVkVOVCgpIFwNCi0gIENMRUFSX0JJVChFWFRJLT5FTVIyLCBQV1JfRVZFTlRfTElORV9QVk0xKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBFbmFibGUgdGhlIFBWTTEgRXh0ZW5kZWQgSW50ZXJydXB0IFJpc2luZyBUcmlnZ2VyLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUFdSX1BWTTFfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKSBcDQotICBTRVRfQklUKEVYVEktPlJUU1IyLCBQV1JfRVhUSV9MSU5FX1BWTTEpDQotDQotLyoqDQotICogQGJyaWVmIERpc2FibGUgdGhlIFBWTTEgRXh0ZW5kZWQgSW50ZXJydXB0IFJpc2luZyBUcmlnZ2VyLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUFdSX1BWTTFfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCkgXA0KLSAgQ0xFQVJfQklUKEVYVEktPlJUU1IyLCBQV1JfRVhUSV9MSU5FX1BWTTEpDQotDQotLyoqDQotICogQGJyaWVmIEVuYWJsZSB0aGUgUFZNMSBFeHRlbmRlZCBJbnRlcnJ1cHQgRmFsbGluZyBUcmlnZ2VyLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUFdSX1BWTTFfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCkgXA0KLSAgU0VUX0JJVChFWFRJLT5GVFNSMiwgUFdSX0VYVElfTElORV9QVk0xKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBEaXNhYmxlIHRoZSBQVk0xIEV4dGVuZGVkIEludGVycnVwdCBGYWxsaW5nIFRyaWdnZXIuDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9QV1JfUFZNMV9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCkgXA0KLSAgQ0xFQVJfQklUKEVYVEktPkZUU1IyLCBQV1JfRVhUSV9MSU5FX1BWTTEpDQotDQotLyoqDQotICogQGJyaWVmICBQVk0xIEVYVEkgbGluZSBjb25maWd1cmF0aW9uOiBzZXQgcmlzaW5nICYgZmFsbGluZyBlZGdlIHRyaWdnZXIuDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9QV1JfUFZNMV9FWFRJX0VOQUJMRV9SSVNJTkdfRkFMTElOR19FREdFKCkgXA0KLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgX19IQUxfUFdSX1BWTTFfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKTsgICAgICAgICAgICBcDQotICAgIF9fSEFMX1BXUl9QVk0xX0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRSgpOyAgICAgICAgICAgXA0KLSAgfSB3aGlsZSAoMCkNCi0NCi0vKioNCi0gKiBAYnJpZWYgRGlzYWJsZSB0aGUgUFZNMSBFeHRlbmRlZCBJbnRlcnJ1cHQgUmlzaW5nICYgRmFsbGluZyBUcmlnZ2VyLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUFdSX1BWTTFfRVhUSV9ESVNBQkxFX1JJU0lOR19GQUxMSU5HX0VER0UoKSBcDQotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgX19IQUxfUFdSX1BWTTFfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCk7ICAgICAgICAgICAgXA0KLSAgICBfX0hBTF9QV1JfUFZNMV9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCk7ICAgICAgICAgICBcDQotICB9IHdoaWxlICgwKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2VuZXJhdGUgYSBTb2Z0d2FyZSBpbnRlcnJ1cHQgb24gc2VsZWN0ZWQgRVhUSSBsaW5lLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUFdSX1BWTTFfRVhUSV9HRU5FUkFURV9TV0lUKCkgXA0KLSAgU0VUX0JJVChFWFRJLT5TV0lFUjIsIFBXUl9FWFRJX0xJTkVfUFZNMSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIFBWTTEgRVhUSSBpbnRlcnJ1cHQgZmxhZyBpcyBzZXQgb3Igbm90Lg0KLSAqIEByZXR2YWwgRVhUSSBQVk0xIExpbmUgU3RhdHVzLg0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUFdSX1BWTTFfRVhUSV9HRVRfRkxBRygpIChFWFRJLT5QUjIgJiBQV1JfRVhUSV9MSU5FX1BWTTEpDQotDQotLyoqDQotICogQGJyaWVmIENsZWFyIHRoZSBQVk0xIEVYVEkgZmxhZy4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1BXUl9QVk0xX0VYVElfQ0xFQVJfRkxBRygpIFwNCi0gIFdSSVRFX1JFRyhFWFRJLT5QUjIsIFBXUl9FWFRJX0xJTkVfUFZNMSkNCi0NCi0jZW5kaWYgLyogUFdSX0NSMl9QVk1FMSAqLw0KLQ0KLSNpZiBkZWZpbmVkKFBXUl9DUjJfUFZNRTIpDQotLyoqDQotICogQGJyaWVmIEVuYWJsZSB0aGUgUFZNMiBFeHRlbmRlZCBJbnRlcnJ1cHQgTGluZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1BXUl9QVk0yX0VYVElfRU5BQkxFX0lUKCkgU0VUX0JJVChFWFRJLT5JTVIyLCBQV1JfRVhUSV9MSU5FX1BWTTIpDQotDQotLyoqDQotICogQGJyaWVmIERpc2FibGUgdGhlIFBWTTIgRXh0ZW5kZWQgSW50ZXJydXB0IExpbmUuDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9QV1JfUFZNMl9FWFRJX0RJU0FCTEVfSVQoKSBcDQotICBDTEVBUl9CSVQoRVhUSS0+SU1SMiwgUFdSX0VYVElfTElORV9QVk0yKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBFbmFibGUgdGhlIFBWTTIgRXZlbnQgTGluZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1BXUl9QVk0yX0VYVElfRU5BQkxFX0VWRU5UKCkgXA0KLSAgU0VUX0JJVChFWFRJLT5FTVIyLCBQV1JfRVZFTlRfTElORV9QVk0yKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBEaXNhYmxlIHRoZSBQVk0yIEV2ZW50IExpbmUuDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9QV1JfUFZNMl9FWFRJX0RJU0FCTEVfRVZFTlQoKSBcDQotICBDTEVBUl9CSVQoRVhUSS0+RU1SMiwgUFdSX0VWRU5UX0xJTkVfUFZNMikNCi0NCi0vKioNCi0gKiBAYnJpZWYgRW5hYmxlIHRoZSBQVk0yIEV4dGVuZGVkIEludGVycnVwdCBSaXNpbmcgVHJpZ2dlci4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1BXUl9QVk0yX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCkgXA0KLSAgU0VUX0JJVChFWFRJLT5SVFNSMiwgUFdSX0VYVElfTElORV9QVk0yKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBEaXNhYmxlIHRoZSBQVk0yIEV4dGVuZGVkIEludGVycnVwdCBSaXNpbmcgVHJpZ2dlci4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1BXUl9QVk0yX0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpIFwNCi0gIENMRUFSX0JJVChFWFRJLT5SVFNSMiwgUFdSX0VYVElfTElORV9QVk0yKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBFbmFibGUgdGhlIFBWTTIgRXh0ZW5kZWQgSW50ZXJydXB0IEZhbGxpbmcgVHJpZ2dlci4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1BXUl9QVk0yX0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRSgpIFwNCi0gIFNFVF9CSVQoRVhUSS0+RlRTUjIsIFBXUl9FWFRJX0xJTkVfUFZNMikNCi0NCi0vKioNCi0gKiBAYnJpZWYgRGlzYWJsZSB0aGUgUFZNMiBFeHRlbmRlZCBJbnRlcnJ1cHQgRmFsbGluZyBUcmlnZ2VyLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUFdSX1BWTTJfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpIFwNCi0gIENMRUFSX0JJVChFWFRJLT5GVFNSMiwgUFdSX0VYVElfTElORV9QVk0yKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUFZNMiBFWFRJIGxpbmUgY29uZmlndXJhdGlvbjogc2V0IHJpc2luZyAmIGZhbGxpbmcgZWRnZSB0cmlnZ2VyLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUFdSX1BWTTJfRVhUSV9FTkFCTEVfUklTSU5HX0ZBTExJTkdfRURHRSgpIFwNCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIF9fSEFMX1BXUl9QVk0yX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCk7ICAgICAgICAgICAgXA0KLSAgICBfX0hBTF9QV1JfUFZNMl9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKTsgICAgICAgICAgIFwNCi0gIH0gd2hpbGUgKDApDQotDQotLyoqDQotICogQGJyaWVmIERpc2FibGUgdGhlIFBWTTIgRXh0ZW5kZWQgSW50ZXJydXB0IFJpc2luZyAmIEZhbGxpbmcgVHJpZ2dlci4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1BXUl9QVk0yX0VYVElfRElTQUJMRV9SSVNJTkdfRkFMTElOR19FREdFKCkgXA0KLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIF9fSEFMX1BXUl9QVk0yX0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpOyAgICAgICAgICAgIFwNCi0gICAgX19IQUxfUFdSX1BWTTJfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpOyAgICAgICAgICAgXA0KLSAgfSB3aGlsZSAoMCkNCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdlbmVyYXRlIGEgU29mdHdhcmUgaW50ZXJydXB0IG9uIHNlbGVjdGVkIEVYVEkgbGluZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1BXUl9QVk0yX0VYVElfR0VORVJBVEVfU1dJVCgpIFwNCi0gIFNFVF9CSVQoRVhUSS0+U1dJRVIyLCBQV1JfRVhUSV9MSU5FX1BWTTIpDQotDQotLyoqDQotICogQGJyaWVmIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBQVk0yIEVYVEkgaW50ZXJydXB0IGZsYWcgaXMgc2V0IG9yIG5vdC4NCi0gKiBAcmV0dmFsIEVYVEkgUFZNMiBMaW5lIFN0YXR1cy4NCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1BXUl9QVk0yX0VYVElfR0VUX0ZMQUcoKSAoRVhUSS0+UFIyICYgUFdSX0VYVElfTElORV9QVk0yKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBDbGVhciB0aGUgUFZNMiBFWFRJIGZsYWcuDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9QV1JfUFZNMl9FWFRJX0NMRUFSX0ZMQUcoKSBcDQotICBXUklURV9SRUcoRVhUSS0+UFIyLCBQV1JfRVhUSV9MSU5FX1BWTTIpDQotDQotI2VuZGlmIC8qIFBXUl9DUjJfUFZNRTIgKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgRW5hYmxlIHRoZSBQVk0zIEV4dGVuZGVkIEludGVycnVwdCBMaW5lLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUFdSX1BWTTNfRVhUSV9FTkFCTEVfSVQoKSBTRVRfQklUKEVYVEktPklNUjIsIFBXUl9FWFRJX0xJTkVfUFZNMykNCi0NCi0vKioNCi0gKiBAYnJpZWYgRGlzYWJsZSB0aGUgUFZNMyBFeHRlbmRlZCBJbnRlcnJ1cHQgTGluZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1BXUl9QVk0zX0VYVElfRElTQUJMRV9JVCgpIFwNCi0gIENMRUFSX0JJVChFWFRJLT5JTVIyLCBQV1JfRVhUSV9MSU5FX1BWTTMpDQotDQotLyoqDQotICogQGJyaWVmIEVuYWJsZSB0aGUgUFZNMyBFdmVudCBMaW5lLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUFdSX1BWTTNfRVhUSV9FTkFCTEVfRVZFTlQoKSBcDQotICBTRVRfQklUKEVYVEktPkVNUjIsIFBXUl9FVkVOVF9MSU5FX1BWTTMpDQotDQotLyoqDQotICogQGJyaWVmIERpc2FibGUgdGhlIFBWTTMgRXZlbnQgTGluZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1BXUl9QVk0zX0VYVElfRElTQUJMRV9FVkVOVCgpIFwNCi0gIENMRUFSX0JJVChFWFRJLT5FTVIyLCBQV1JfRVZFTlRfTElORV9QVk0zKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBFbmFibGUgdGhlIFBWTTMgRXh0ZW5kZWQgSW50ZXJydXB0IFJpc2luZyBUcmlnZ2VyLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUFdSX1BWTTNfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKSBcDQotICBTRVRfQklUKEVYVEktPlJUU1IyLCBQV1JfRVhUSV9MSU5FX1BWTTMpDQotDQotLyoqDQotICogQGJyaWVmIERpc2FibGUgdGhlIFBWTTMgRXh0ZW5kZWQgSW50ZXJydXB0IFJpc2luZyBUcmlnZ2VyLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUFdSX1BWTTNfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCkgXA0KLSAgQ0xFQVJfQklUKEVYVEktPlJUU1IyLCBQV1JfRVhUSV9MSU5FX1BWTTMpDQotDQotLyoqDQotICogQGJyaWVmIEVuYWJsZSB0aGUgUFZNMyBFeHRlbmRlZCBJbnRlcnJ1cHQgRmFsbGluZyBUcmlnZ2VyLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUFdSX1BWTTNfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCkgXA0KLSAgU0VUX0JJVChFWFRJLT5GVFNSMiwgUFdSX0VYVElfTElORV9QVk0zKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBEaXNhYmxlIHRoZSBQVk0zIEV4dGVuZGVkIEludGVycnVwdCBGYWxsaW5nIFRyaWdnZXIuDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9QV1JfUFZNM19FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCkgXA0KLSAgQ0xFQVJfQklUKEVYVEktPkZUU1IyLCBQV1JfRVhUSV9MSU5FX1BWTTMpDQotDQotLyoqDQotICogQGJyaWVmICBQVk0zIEVYVEkgbGluZSBjb25maWd1cmF0aW9uOiBzZXQgcmlzaW5nICYgZmFsbGluZyBlZGdlIHRyaWdnZXIuDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9QV1JfUFZNM19FWFRJX0VOQUJMRV9SSVNJTkdfRkFMTElOR19FREdFKCkgXA0KLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgX19IQUxfUFdSX1BWTTNfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKTsgICAgICAgICAgICBcDQotICAgIF9fSEFMX1BXUl9QVk0zX0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRSgpOyAgICAgICAgICAgXA0KLSAgfSB3aGlsZSAoMCkNCi0NCi0vKioNCi0gKiBAYnJpZWYgRGlzYWJsZSB0aGUgUFZNMyBFeHRlbmRlZCBJbnRlcnJ1cHQgUmlzaW5nICYgRmFsbGluZyBUcmlnZ2VyLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUFdSX1BWTTNfRVhUSV9ESVNBQkxFX1JJU0lOR19GQUxMSU5HX0VER0UoKSBcDQotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgX19IQUxfUFdSX1BWTTNfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCk7ICAgICAgICAgICAgXA0KLSAgICBfX0hBTF9QV1JfUFZNM19FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCk7ICAgICAgICAgICBcDQotICB9IHdoaWxlICgwKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2VuZXJhdGUgYSBTb2Z0d2FyZSBpbnRlcnJ1cHQgb24gc2VsZWN0ZWQgRVhUSSBsaW5lLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUFdSX1BWTTNfRVhUSV9HRU5FUkFURV9TV0lUKCkgXA0KLSAgU0VUX0JJVChFWFRJLT5TV0lFUjIsIFBXUl9FWFRJX0xJTkVfUFZNMykNCi0NCi0vKioNCi0gKiBAYnJpZWYgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIFBWTTMgRVhUSSBpbnRlcnJ1cHQgZmxhZyBpcyBzZXQgb3Igbm90Lg0KLSAqIEByZXR2YWwgRVhUSSBQVk0zIExpbmUgU3RhdHVzLg0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUFdSX1BWTTNfRVhUSV9HRVRfRkxBRygpIChFWFRJLT5QUjIgJiBQV1JfRVhUSV9MSU5FX1BWTTMpDQotDQotLyoqDQotICogQGJyaWVmIENsZWFyIHRoZSBQVk0zIEVYVEkgZmxhZy4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1BXUl9QVk0zX0VYVElfQ0xFQVJfRkxBRygpIFwNCi0gIFdSSVRFX1JFRyhFWFRJLT5QUjIsIFBXUl9FWFRJX0xJTkVfUFZNMykNCi0NCi0vKioNCi0gKiBAYnJpZWYgRW5hYmxlIHRoZSBQVk00IEV4dGVuZGVkIEludGVycnVwdCBMaW5lLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUFdSX1BWTTRfRVhUSV9FTkFCTEVfSVQoKSBTRVRfQklUKEVYVEktPklNUjIsIFBXUl9FWFRJX0xJTkVfUFZNNCkNCi0NCi0vKioNCi0gKiBAYnJpZWYgRGlzYWJsZSB0aGUgUFZNNCBFeHRlbmRlZCBJbnRlcnJ1cHQgTGluZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1BXUl9QVk00X0VYVElfRElTQUJMRV9JVCgpIFwNCi0gIENMRUFSX0JJVChFWFRJLT5JTVIyLCBQV1JfRVhUSV9MSU5FX1BWTTQpDQotDQotLyoqDQotICogQGJyaWVmIEVuYWJsZSB0aGUgUFZNNCBFdmVudCBMaW5lLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUFdSX1BWTTRfRVhUSV9FTkFCTEVfRVZFTlQoKSBcDQotICBTRVRfQklUKEVYVEktPkVNUjIsIFBXUl9FVkVOVF9MSU5FX1BWTTQpDQotDQotLyoqDQotICogQGJyaWVmIERpc2FibGUgdGhlIFBWTTQgRXZlbnQgTGluZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1BXUl9QVk00X0VYVElfRElTQUJMRV9FVkVOVCgpIFwNCi0gIENMRUFSX0JJVChFWFRJLT5FTVIyLCBQV1JfRVZFTlRfTElORV9QVk00KQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBFbmFibGUgdGhlIFBWTTQgRXh0ZW5kZWQgSW50ZXJydXB0IFJpc2luZyBUcmlnZ2VyLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUFdSX1BWTTRfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKSBcDQotICBTRVRfQklUKEVYVEktPlJUU1IyLCBQV1JfRVhUSV9MSU5FX1BWTTQpDQotDQotLyoqDQotICogQGJyaWVmIERpc2FibGUgdGhlIFBWTTQgRXh0ZW5kZWQgSW50ZXJydXB0IFJpc2luZyBUcmlnZ2VyLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUFdSX1BWTTRfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCkgXA0KLSAgQ0xFQVJfQklUKEVYVEktPlJUU1IyLCBQV1JfRVhUSV9MSU5FX1BWTTQpDQotDQotLyoqDQotICogQGJyaWVmIEVuYWJsZSB0aGUgUFZNNCBFeHRlbmRlZCBJbnRlcnJ1cHQgRmFsbGluZyBUcmlnZ2VyLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUFdSX1BWTTRfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCkgXA0KLSAgU0VUX0JJVChFWFRJLT5GVFNSMiwgUFdSX0VYVElfTElORV9QVk00KQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBEaXNhYmxlIHRoZSBQVk00IEV4dGVuZGVkIEludGVycnVwdCBGYWxsaW5nIFRyaWdnZXIuDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9QV1JfUFZNNF9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCkgXA0KLSAgQ0xFQVJfQklUKEVYVEktPkZUU1IyLCBQV1JfRVhUSV9MSU5FX1BWTTQpDQotDQotLyoqDQotICogQGJyaWVmICBQVk00IEVYVEkgbGluZSBjb25maWd1cmF0aW9uOiBzZXQgcmlzaW5nICYgZmFsbGluZyBlZGdlIHRyaWdnZXIuDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9QV1JfUFZNNF9FWFRJX0VOQUJMRV9SSVNJTkdfRkFMTElOR19FREdFKCkgXA0KLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgX19IQUxfUFdSX1BWTTRfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKTsgICAgICAgICAgICBcDQotICAgIF9fSEFMX1BXUl9QVk00X0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRSgpOyAgICAgICAgICAgXA0KLSAgfSB3aGlsZSAoMCkNCi0NCi0vKioNCi0gKiBAYnJpZWYgRGlzYWJsZSB0aGUgUFZNNCBFeHRlbmRlZCBJbnRlcnJ1cHQgUmlzaW5nICYgRmFsbGluZyBUcmlnZ2VyLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUFdSX1BWTTRfRVhUSV9ESVNBQkxFX1JJU0lOR19GQUxMSU5HX0VER0UoKSBcDQotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgX19IQUxfUFdSX1BWTTRfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCk7ICAgICAgICAgICAgXA0KLSAgICBfX0hBTF9QV1JfUFZNNF9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCk7ICAgICAgICAgICBcDQotICB9IHdoaWxlICgwKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2VuZXJhdGUgYSBTb2Z0d2FyZSBpbnRlcnJ1cHQgb24gc2VsZWN0ZWQgRVhUSSBsaW5lLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUFdSX1BWTTRfRVhUSV9HRU5FUkFURV9TV0lUKCkgXA0KLSAgU0VUX0JJVChFWFRJLT5TV0lFUjIsIFBXUl9FWFRJX0xJTkVfUFZNNCkNCi0NCi0vKioNCi0gKiBAYnJpZWYgQ2hlY2sgd2hldGhlciBvciBub3QgdGhlIHNwZWNpZmllZCBQVk00IEVYVEkgaW50ZXJydXB0IGZsYWcgaXMgc2V0Lg0KLSAqIEByZXR2YWwgRVhUSSBQVk00IExpbmUgU3RhdHVzLg0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUFdSX1BWTTRfRVhUSV9HRVRfRkxBRygpIChFWFRJLT5QUjIgJiBQV1JfRVhUSV9MSU5FX1BWTTQpDQotDQotLyoqDQotICogQGJyaWVmIENsZWFyIHRoZSBQVk00IEVYVEkgZmxhZy4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1BXUl9QVk00X0VYVElfQ0xFQVJfRkxBRygpIFwNCi0gIFdSSVRFX1JFRyhFWFRJLT5QUjIsIFBXUl9FWFRJX0xJTkVfUFZNNCkNCi0NCi0vKioNCi0gKiBAYnJpZWYgQ29uZmlndXJlIHRoZSBtYWluIGludGVybmFsIHJlZ3VsYXRvciBvdXRwdXQgdm9sdGFnZS4NCi0gKiBAcGFyYW0gIF9fUkVHVUxBVE9SX186IHNwZWNpZmllcyB0aGUgcmVndWxhdG9yIG91dHB1dCB2b2x0YWdlIHRvIGFjaGlldmUNCi0gKiAgICAgICAgIGEgdHJhZGVvZmYgYmV0d2VlbiBwZXJmb3JtYW5jZSBhbmQgcG93ZXIgY29uc3VtcHRpb24uDQotICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfUkVHVUxBVE9SX1ZPTFRBR0VfU0NBTEUxX0JPT1NUICBSZWd1bGF0b3Igdm9sdGFnZQ0KLSAqIG91dHB1dCByYW5nZSAxIG1vZGUsIHR5cGljYWwgb3V0cHV0IHZvbHRhZ2UgYXQgMS4yOCBWLCBzeXN0ZW0gZnJlcXVlbmN5IHVwIHRvDQotICogMTcwIE1Iei4NCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfUkVHVUxBVE9SX1ZPTFRBR0VfU0NBTEUxICBSZWd1bGF0b3Igdm9sdGFnZSBvdXRwdXQNCi0gKiByYW5nZSAxIG1vZGUsIHR5cGljYWwgb3V0cHV0IHZvbHRhZ2UgYXQgMS4yIFYsIHN5c3RlbSBmcmVxdWVuY3kgdXAgdG8gMTUwDQotICogTUh6Lg0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFBXUl9SRUdVTEFUT1JfVk9MVEFHRV9TQ0FMRTIgIFJlZ3VsYXRvciB2b2x0YWdlIG91dHB1dA0KLSAqIHJhbmdlIDIgbW9kZSwgdHlwaWNhbCBvdXRwdXQgdm9sdGFnZSBhdCAxLjAgViwgc3lzdGVtIGZyZXF1ZW5jeSB1cCB0byAyNiBNSHouDQotICogQG5vdGUgIFRoaXMgbWFjcm8gaXMgc2ltaWxhciB0byBIQUxfUFdSRXhfQ29udHJvbFZvbHRhZ2VTY2FsaW5nKCkgQVBJIGJ1dA0KLSAqIGRvZXNuJ3QgY2hlY2sgd2hldGhlciBvciBub3QgVk9TRiBmbGFnIGlzIGNsZWFyZWQgd2hlbiBtb3ZpbmcgZnJvbSByYW5nZSAyIHRvDQotICogcmFuZ2UgMS4gVXNlciBtYXkgcmVzb3J0IHRvIF9fSEFMX1BXUl9HRVRfRkxBRygpIG1hY3JvIHRvIGNoZWNrIFZPU0YgYml0DQotICogcmVzZXR0aW5nLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUFdSX1ZPTFRBR0VTQ0FMSU5HX0NPTkZJRyhfX1JFR1VMQVRPUl9fKSAgXA0KLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBNT0RJRllfUkVHKFBXUi0+Q1IxLCBQV1JfQ1IxX1ZPUywgKF9fUkVHVUxBVE9SX18pKTsgXA0KLSAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyAgXA0KLSAgICB0bXByZWcgPSBSRUFEX0JJVChQV1ItPkNSMSwgUFdSX0NSMV9WT1MpOyAgICAgICAgICAgXA0KLSAgICBVTlVTRUQodG1wcmVnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgfSB3aGlsZSAoMCkNCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGFkZHRvZ3JvdXAgIFBXUkV4X1ByaXZhdGVfTWFjcm9zICAgUFdSIEV4dGVuZGVkIFByaXZhdGUgTWFjcm9zDQotICogQHsNCi0gKi8NCi0NCi0jZGVmaW5lIElTX1BXUl9XQUtFVVBfUElOKFBJTikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKCgoUElOKSA9PSBQV1JfV0FLRVVQX1BJTjEpIHx8ICgoUElOKSA9PSBQV1JfV0FLRVVQX1BJTjIpIHx8ICAgICAgICAgICBcDQotICAgKChQSU4pID09IFBXUl9XQUtFVVBfUElOMykgfHwgKChQSU4pID09IFBXUl9XQUtFVVBfUElONCkgfHwgICAgICAgICAgIFwNCi0gICAoKFBJTikgPT0gUFdSX1dBS0VVUF9QSU41KSB8fCAoKFBJTikgPT0gUFdSX1dBS0VVUF9QSU4xX0hJR0gpIHx8ICAgICAgXA0KLSAgICgoUElOKSA9PSBQV1JfV0FLRVVQX1BJTjJfSElHSCkgfHwgKChQSU4pID09IFBXUl9XQUtFVVBfUElOM19ISUdIKSB8fCBcDQotICAgKChQSU4pID09IFBXUl9XQUtFVVBfUElONF9ISUdIKSB8fCAoKFBJTikgPT0gUFdSX1dBS0VVUF9QSU41X0hJR0gpIHx8IFwNCi0gICAoKFBJTikgPT0gUFdSX1dBS0VVUF9QSU4xX0xPVykgfHwgKChQSU4pID09IFBXUl9XQUtFVVBfUElOMl9MT1cpIHx8ICAgXA0KLSAgICgoUElOKSA9PSBQV1JfV0FLRVVQX1BJTjNfTE9XKSB8fCAoKFBJTikgPT0gUFdSX1dBS0VVUF9QSU40X0xPVykgfHwgICBcDQotICAgKChQSU4pID09IFBXUl9XQUtFVVBfUElONV9MT1cpKQ0KLQ0KLSNkZWZpbmUgSVNfUFdSX1BWTV9UWVBFKFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoKFRZUEUpID09IFBXUl9QVk1fMSkgfHwgKChUWVBFKSA9PSBQV1JfUFZNXzIpIHx8ICgoVFlQRSkgPT0gUFdSX1BWTV8zKSB8fCBcDQotICAgKChUWVBFKSA9PSBQV1JfUFZNXzQpKQ0KLQ0KLSNkZWZpbmUgSVNfUFdSX1BWTV9NT0RFKE1PREUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKChNT0RFKSA9PSBQV1JfUFZNX01PREVfTk9STUFMKSB8fCAoKE1PREUpID09IFBXUl9QVk1fTU9ERV9JVF9SSVNJTkcpIHx8IFwNCi0gICAoKE1PREUpID09IFBXUl9QVk1fTU9ERV9JVF9GQUxMSU5HKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoTU9ERSkgPT0gUFdSX1BWTV9NT0RFX0lUX1JJU0lOR19GQUxMSU5HKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKChNT0RFKSA9PSBQV1JfUFZNX01PREVfRVZFTlRfUklTSU5HKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKE1PREUpID09IFBXUl9QVk1fTU9ERV9FVkVOVF9GQUxMSU5HKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoTU9ERSkgPT0gUFdSX1BWTV9NT0RFX0VWRU5UX1JJU0lOR19GQUxMSU5HKSkNCi0NCi0jaWYgZGVmaW5lZChQV1JfQ1I1X1IxTU9ERSkNCi0jZGVmaW5lIElTX1BXUl9WT0xUQUdFX1NDQUxJTkdfUkFOR0UoUkFOR0UpICAgICAgICAgICBcDQotICAoKChSQU5HRSkgPT0gUFdSX1JFR1VMQVRPUl9WT0xUQUdFX1NDQUxFMV9CT09TVCkgfHwgXA0KLSAgICgoUkFOR0UpID09IFBXUl9SRUdVTEFUT1JfVk9MVEFHRV9TQ0FMRTEpIHx8ICAgICAgIFwNCi0gICAoKFJBTkdFKSA9PSBQV1JfUkVHVUxBVE9SX1ZPTFRBR0VfU0NBTEUyKSkNCi0jZWxzZQ0KLSNkZWZpbmUgSVNfUFdSX1ZPTFRBR0VfU0NBTElOR19SQU5HRShSQU5HRSkgICAgIFwNCi0gICgoKFJBTkdFKSA9PSBQV1JfUkVHVUxBVE9SX1ZPTFRBR0VfU0NBTEUxKSB8fCBcDQotICAgKChSQU5HRSkgPT0gUFdSX1JFR1VMQVRPUl9WT0xUQUdFX1NDQUxFMikpDQotI2VuZGlmDQotDQotI2RlZmluZSBJU19QV1JfQkFUVEVSWV9SRVNJU1RPUl9TRUxFQ1QoUkVTSVNUT1IpICAgICAgXA0KLSAgKCgoUkVTSVNUT1IpID09IFBXUl9CQVRURVJZX0NIQVJHSU5HX1JFU0lTVE9SXzUpIHx8IFwNCi0gICAoKFJFU0lTVE9SKSA9PSBQV1JfQkFUVEVSWV9DSEFSR0lOR19SRVNJU1RPUl8xXzUpKQ0KLQ0KLSNkZWZpbmUgSVNfUFdSX0JBVFRFUllfQ0hBUkdJTkcoQ0hBUkdJTkcpICAgICAgICAgIFwNCi0gICgoKENIQVJHSU5HKSA9PSBQV1JfQkFUVEVSWV9DSEFSR0lOR19ESVNBQkxFKSB8fCBcDQotICAgKChDSEFSR0lORykgPT0gUFdSX0JBVFRFUllfQ0hBUkdJTkdfRU5BQkxFKSkNCi0NCi0jZGVmaW5lIElTX1BXUl9HUElPX0JJVF9OVU1CRVIoQklUX05VTUJFUikgXA0KLSAgKCgoQklUX05VTUJFUikgJiBHUElPX1BJTl9NQVNLKSAhPSAodWludDMyX3QpMHgwMFUpDQotI2RlZmluZSBJU19QV1JfR1BJTyhHUElPKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoKEdQSU8pID09IFBXUl9HUElPX0EpIHx8ICgoR1BJTykgPT0gUFdSX0dQSU9fQikgfHwgXA0KLSAgICgoR1BJTykgPT0gUFdSX0dQSU9fQykgfHwgKChHUElPKSA9PSBQV1JfR1BJT19EKSB8fCBcDQotICAgKChHUElPKSA9PSBQV1JfR1BJT19FKSB8fCAoKEdQSU8pID09IFBXUl9HUElPX0YpIHx8ICgoR1BJTykgPT0gUFdSX0dQSU9fRykpDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGFkZHRvZ3JvdXAgUFdSRXhfRXhwb3J0ZWRfRnVuY3Rpb25zIFBXUiBFeHRlbmRlZCBFeHBvcnRlZCBGdW5jdGlvbnMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKiBAYWRkdG9ncm91cCBQV1JFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEV4dGVuZGVkIFBlcmlwaGVyYWwgQ29udHJvbA0KLSAqIGZ1bmN0aW9ucw0KLSAqIEB7DQotICovDQotDQotLyogUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi11aW50MzJfdCBIQUxfUFdSRXhfR2V0Vm9sdGFnZVJhbmdlKHZvaWQpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9QV1JFeF9Db250cm9sVm9sdGFnZVNjYWxpbmcodWludDMyX3QgVm9sdGFnZVNjYWxpbmcpOw0KLXZvaWQgSEFMX1BXUkV4X0VuYWJsZUJhdHRlcnlDaGFyZ2luZyh1aW50MzJfdCBSZXNpc3RvclNlbGVjdGlvbik7DQotdm9pZCBIQUxfUFdSRXhfRGlzYWJsZUJhdHRlcnlDaGFyZ2luZyh2b2lkKTsNCi12b2lkIEhBTF9QV1JFeF9FbmFibGVJbnRlcm5hbFdha2VVcExpbmUodm9pZCk7DQotdm9pZCBIQUxfUFdSRXhfRGlzYWJsZUludGVybmFsV2FrZVVwTGluZSh2b2lkKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfUFdSRXhfRW5hYmxlR1BJT1B1bGxVcCh1aW50MzJfdCBHUElPLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEdQSU9OdW1iZXIpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9QV1JFeF9EaXNhYmxlR1BJT1B1bGxVcCh1aW50MzJfdCBHUElPLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBHUElPTnVtYmVyKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfUFdSRXhfRW5hYmxlR1BJT1B1bGxEb3duKHVpbnQzMl90IEdQSU8sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBHUElPTnVtYmVyKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfUFdSRXhfRGlzYWJsZUdQSU9QdWxsRG93bih1aW50MzJfdCBHUElPLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEdQSU9OdW1iZXIpOw0KLXZvaWQgSEFMX1BXUkV4X0VuYWJsZVB1bGxVcFB1bGxEb3duQ29uZmlnKHZvaWQpOw0KLXZvaWQgSEFMX1BXUkV4X0Rpc2FibGVQdWxsVXBQdWxsRG93bkNvbmZpZyh2b2lkKTsNCi12b2lkIEhBTF9QV1JFeF9FbmFibGVTUkFNMkNvbnRlbnRSZXRlbnRpb24odm9pZCk7DQotdm9pZCBIQUxfUFdSRXhfRGlzYWJsZVNSQU0yQ29udGVudFJldGVudGlvbih2b2lkKTsNCi0jaWYgZGVmaW5lZChQV1JfQ1IyX1BWTUUxKQ0KLXZvaWQgSEFMX1BXUkV4X0VuYWJsZVBWTTEodm9pZCk7DQotdm9pZCBIQUxfUFdSRXhfRGlzYWJsZVBWTTEodm9pZCk7DQotI2VuZGlmIC8qIFBXUl9DUjJfUFZNRTEgKi8NCi0jaWYgZGVmaW5lZChQV1JfQ1IyX1BWTUUyKQ0KLXZvaWQgSEFMX1BXUkV4X0VuYWJsZVBWTTIodm9pZCk7DQotdm9pZCBIQUxfUFdSRXhfRGlzYWJsZVBWTTIodm9pZCk7DQotI2VuZGlmIC8qIFBXUl9DUjJfUFZNRTIgKi8NCi12b2lkIEhBTF9QV1JFeF9FbmFibGVQVk0zKHZvaWQpOw0KLXZvaWQgSEFMX1BXUkV4X0Rpc2FibGVQVk0zKHZvaWQpOw0KLXZvaWQgSEFMX1BXUkV4X0VuYWJsZVBWTTQodm9pZCk7DQotdm9pZCBIQUxfUFdSRXhfRGlzYWJsZVBWTTQodm9pZCk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BXUkV4X0NvbmZpZ1BWTShQV1JfUFZNVHlwZURlZiAqc0NvbmZpZ1BWTSk7DQotDQotLyogTG93IFBvd2VyIG1vZGVzIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi12b2lkIEhBTF9QV1JFeF9FbmFibGVMb3dQb3dlclJ1bk1vZGUodm9pZCk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BXUkV4X0Rpc2FibGVMb3dQb3dlclJ1bk1vZGUodm9pZCk7DQotdm9pZCBIQUxfUFdSRXhfRW50ZXJTVE9QME1vZGUodWludDhfdCBTVE9QRW50cnkpOw0KLXZvaWQgSEFMX1BXUkV4X0VudGVyU1RPUDFNb2RlKHVpbnQ4X3QgU1RPUEVudHJ5KTsNCi12b2lkIEhBTF9QV1JFeF9FbnRlclNIVVRET1dOTW9kZSh2b2lkKTsNCi0NCi12b2lkIEhBTF9QV1JFeF9QVkRfUFZNX0lSUUhhbmRsZXIodm9pZCk7DQotI2lmIGRlZmluZWQoUFdSX0NSMl9QVk1FMSkNCi12b2lkIEhBTF9QV1JFeF9QVk0xQ2FsbGJhY2sodm9pZCk7DQotI2VuZGlmIC8qIFBXUl9DUjJfUFZNRTEgKi8NCi0jaWYgZGVmaW5lZChQV1JfQ1IyX1BWTUUyKQ0KLXZvaWQgSEFMX1BXUkV4X1BWTTJDYWxsYmFjayh2b2lkKTsNCi0jZW5kaWYgLyogUFdSX0NSMl9QVk1FMiAqLw0KLXZvaWQgSEFMX1BXUkV4X1BWTTNDYWxsYmFjayh2b2lkKTsNCi12b2lkIEhBTF9QV1JFeF9QVk00Q2FsbGJhY2sodm9pZCk7DQotDQotI2lmIGRlZmluZWQoUFdSX0NSM19VQ1BEX1NUREJZKQ0KLXZvaWQgSEFMX1BXUkV4X0VuYWJsZVVDUERTdGFuZGJ5TW9kZSh2b2lkKTsNCi12b2lkIEhBTF9QV1JFeF9EaXNhYmxlVUNQRFN0YW5kYnlNb2RlKHZvaWQpOw0KLSNlbmRpZiAvKiBQV1JfQ1IzX1VDUERfU1REQlkgKi8NCi0jaWYgZGVmaW5lZChQV1JfQ1IzX1VDUERfREJESVMpDQotdm9pZCBIQUxfUFdSRXhfRW5hYmxlVUNQRERlYWRCYXR0ZXJ5KHZvaWQpOw0KLXZvaWQgSEFMX1BXUkV4X0Rpc2FibGVVQ1BERGVhZEJhdHRlcnkodm9pZCk7DQotI2VuZGlmIC8qIFBXUl9DUjNfVUNQRF9EQkRJUyAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotI2lmZGVmIF9fY3BsdXNwbHVzDQotfQ0KLSNlbmRpZg0KLQ0KLSNlbmRpZiAvKiBTVE0zMkc0eHhfSEFMX1BXUl9FWF9IICovDQorLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAZmlsZSAgICBzdG0zMmc0eHhfaGFsX3B3cl9leC5oCisgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgUFdSIEhBTCBFeHRlbmRlZCBtb2R1bGUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYXR0ZW50aW9uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0ZXJtcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlCisgKiBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb2Z0d2FyZSBjb21wb25lbnQuCisgKiBJZiBubyBMSUNFTlNFIGZpbGUgY29tZXMgd2l0aCB0aGlzIHNvZnR3YXJlLCBpdCBpcyBwcm92aWRlZCBBUy1JUy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJHNHh4X0hBTF9QV1JfRVhfSAorI2RlZmluZSBTVE0zMkc0eHhfSEFMX1BXUl9FWF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmc0eHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHNHh4X0hBTF9Ecml2ZXIKKyAqIEB7CisgKi8KKworLyoqIEBhZGR0b2dyb3VwIFBXUkV4CisgKiBAeworICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgUFdSRXhfRXhwb3J0ZWRfVHlwZXMgUFdSIEV4dGVuZGVkIEV4cG9ydGVkIFR5cGVzCisgKiBAeworICovCisKKy8qKgorICogQGJyaWVmICBQV1IgUFZNIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlIGRlZmluaXRpb24KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50MzJfdCBQVk1UeXBlOyAvKiE8IFBWTVR5cGU6IFNwZWNpZmllcyB3aGljaCB2b2x0YWdlIGlzIG1vbml0b3JlZCBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgYWdhaW5zdCB3aGljaCB0aHJlc2hvbGQuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mCisgICAgICAgICAgICAgICAgICAgICAgIEByZWYgUFdSRXhfUFZNX1R5cGUuICovCisgIHVpbnQzMl90IE1vZGU7IC8qITwgTW9kZTogU3BlY2lmaWVzIHRoZSBvcGVyYXRpbmcgbW9kZSBmb3IgdGhlIHNlbGVjdGVkIHBpbnMuCisgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBQV1JFeF9QVk1fTW9kZS4gKi8KK30gUFdSX1BWTVR5cGVEZWY7CisKKy8qKgorICogQH0KKyAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIFBXUkV4X0V4cG9ydGVkX0NvbnN0YW50cyAgUFdSIEV4dGVuZGVkIEV4cG9ydGVkIENvbnN0YW50cworICogQHsKKyAqLworCisvKiogQGRlZmdyb3VwIFBXUkV4X1dVUF9Qb2xhcml0eSBTaGlmdCB0byBhcHBseSB0byByZXRyaWV2ZSBwb2xhcml0eSBpbmZvcm1hdGlvbgorICogZnJvbSBQV1JfV0FLRVVQX1BJTnlfeHh4IGNvbnN0YW50cworICogQHsKKyAqLworI2RlZmluZSBQV1JfV1VQX1BPTEFSSVRZX1NISUZUIFwKKyAgMHgwNVUgLyohPCBJbnRlcm5hbCBjb25zdGFudCB1c2VkIHRvIHJldHJpZXZlIHdha2V1cCBwaW4gcG9sYXJpcnkgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFBXUkV4X1dha2VVcF9QaW5zICBQV1Igd2FrZS11cCBwaW5zCisgKiBAeworICovCisjZGVmaW5lIFBXUl9XQUtFVVBfUElOMSBcCisgIFBXUl9DUjNfRVdVUDEgLyohPCBXYWtldXAgcGluIDEgKHdpdGggaGlnaCBsZXZlbCBwb2xhcml0eSkgKi8KKyNkZWZpbmUgUFdSX1dBS0VVUF9QSU4yIFwKKyAgUFdSX0NSM19FV1VQMiAvKiE8IFdha2V1cCBwaW4gMiAod2l0aCBoaWdoIGxldmVsIHBvbGFyaXR5KSAqLworI2RlZmluZSBQV1JfV0FLRVVQX1BJTjMgXAorICBQV1JfQ1IzX0VXVVAzIC8qITwgV2FrZXVwIHBpbiAzICh3aXRoIGhpZ2ggbGV2ZWwgcG9sYXJpdHkpICovCisjZGVmaW5lIFBXUl9XQUtFVVBfUElONCBcCisgIFBXUl9DUjNfRVdVUDQgLyohPCBXYWtldXAgcGluIDQgKHdpdGggaGlnaCBsZXZlbCBwb2xhcml0eSkgKi8KKyNkZWZpbmUgUFdSX1dBS0VVUF9QSU41IFwKKyAgUFdSX0NSM19FV1VQNSAvKiE8IFdha2V1cCBwaW4gNSAod2l0aCBoaWdoIGxldmVsIHBvbGFyaXR5KSAqLworI2RlZmluZSBQV1JfV0FLRVVQX1BJTjFfSElHSCBcCisgIFBXUl9DUjNfRVdVUDEgLyohPCBXYWtldXAgcGluIDEgKHdpdGggaGlnaCBsZXZlbCBwb2xhcml0eSkgKi8KKyNkZWZpbmUgUFdSX1dBS0VVUF9QSU4yX0hJR0ggXAorICBQV1JfQ1IzX0VXVVAyIC8qITwgV2FrZXVwIHBpbiAyICh3aXRoIGhpZ2ggbGV2ZWwgcG9sYXJpdHkpICovCisjZGVmaW5lIFBXUl9XQUtFVVBfUElOM19ISUdIIFwKKyAgUFdSX0NSM19FV1VQMyAvKiE8IFdha2V1cCBwaW4gMyAod2l0aCBoaWdoIGxldmVsIHBvbGFyaXR5KSAqLworI2RlZmluZSBQV1JfV0FLRVVQX1BJTjRfSElHSCBcCisgIFBXUl9DUjNfRVdVUDQgLyohPCBXYWtldXAgcGluIDQgKHdpdGggaGlnaCBsZXZlbCBwb2xhcml0eSkgKi8KKyNkZWZpbmUgUFdSX1dBS0VVUF9QSU41X0hJR0ggXAorICBQV1JfQ1IzX0VXVVA1IC8qITwgV2FrZXVwIHBpbiA1ICh3aXRoIGhpZ2ggbGV2ZWwgcG9sYXJpdHkpICovCisjZGVmaW5lIFBXUl9XQUtFVVBfUElOMV9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAodWludDMyX3QpKChQV1JfQ1I0X1dQMSA8PCBQV1JfV1VQX1BPTEFSSVRZX1NISUZUKSB8IFwKKyAgICAgICAgICAgICBQV1JfQ1IzX0VXVVAxKSAvKiE8IFdha2V1cCBwaW4gMSAod2l0aCBsb3cgbGV2ZWwgcG9sYXJpdHkpICovCisjZGVmaW5lIFBXUl9XQUtFVVBfUElOMl9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAodWludDMyX3QpKChQV1JfQ1I0X1dQMiA8PCBQV1JfV1VQX1BPTEFSSVRZX1NISUZUKSB8IFwKKyAgICAgICAgICAgICBQV1JfQ1IzX0VXVVAyKSAvKiE8IFdha2V1cCBwaW4gMiAod2l0aCBsb3cgbGV2ZWwgcG9sYXJpdHkpICovCisjZGVmaW5lIFBXUl9XQUtFVVBfUElOM19MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAodWludDMyX3QpKChQV1JfQ1I0X1dQMyA8PCBQV1JfV1VQX1BPTEFSSVRZX1NISUZUKSB8IFwKKyAgICAgICAgICAgICBQV1JfQ1IzX0VXVVAzKSAvKiE8IFdha2V1cCBwaW4gMyAod2l0aCBsb3cgbGV2ZWwgcG9sYXJpdHkpICovCisjZGVmaW5lIFBXUl9XQUtFVVBfUElONF9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAodWludDMyX3QpKChQV1JfQ1I0X1dQNCA8PCBQV1JfV1VQX1BPTEFSSVRZX1NISUZUKSB8IFwKKyAgICAgICAgICAgICBQV1JfQ1IzX0VXVVA0KSAvKiE8IFdha2V1cCBwaW4gNCAod2l0aCBsb3cgbGV2ZWwgcG9sYXJpdHkpICovCisjZGVmaW5lIFBXUl9XQUtFVVBfUElONV9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAodWludDMyX3QpKChQV1JfQ1I0X1dQNSA8PCBQV1JfV1VQX1BPTEFSSVRZX1NISUZUKSB8IFwKKyAgICAgICAgICAgICBQV1JfQ1IzX0VXVVA1KSAvKiE8IFdha2V1cCBwaW4gNSAod2l0aCBsb3cgbGV2ZWwgcG9sYXJpdHkpICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBQV1JFeF9QVk1fVHlwZSBQZXJpcGhlcmFsIFZvbHRhZ2UgTW9uaXRvcmluZyB0eXBlCisgKiBAeworICovCisjaWYgZGVmaW5lZChQV1JfQ1IyX1BWTUUxKQorI2RlZmluZSBQV1JfUFZNXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgUFdSX0NSMl9QVk1FMSAvKiE8IFBlcmlwaGVyYWwgVm9sdGFnZSBNb25pdG9yaW5nIDEgZW5hYmxlOiBWRERVU0IgdmVyc3VzIDEuMiBcCisgICAgICAgICAgICAgICAgICAgViAoYXBwbGljYWJsZSB3aGVuIFVTQiBmZWF0dXJlIGlzIHN1cHBvcnRlZCkgKi8KKyNlbmRpZiAgICAgICAgICAvKiBQV1JfQ1IyX1BWTUUxICovCisjaWYgZGVmaW5lZChQV1JfQ1IyX1BWTUUyKQorI2RlZmluZSBQV1JfUFZNXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgUFdSX0NSMl9QVk1FMiAvKiE8IFBlcmlwaGVyYWwgVm9sdGFnZSBNb25pdG9yaW5nIDIgZW5hYmxlOiBWRERJTzIgdmVyc3VzIDAuOSBcCisgICAgICAgICAgICAgICAgICAgViAoYXBwbGljYWJsZSB3aGVuIFZERElPMiBpcyBwcmVzZW50IG9uIGRldmljZSkgKi8KKyNlbmRpZiAgICAgICAgICAvKiBQV1JfQ1IyX1BWTUUyICovCisjZGVmaW5lIFBXUl9QVk1fMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFBXUl9DUjJfUFZNRTMgLyohPCBQZXJpcGhlcmFsIFZvbHRhZ2UgTW9uaXRvcmluZyAzIGVuYWJsZTogVkREQSB2ZXJzdXMgMS42MiBcCisgICAgICAgICAgICAgICAgICAgViAqLworI2RlZmluZSBQV1JfUFZNXzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgUFdSX0NSMl9QVk1FNCAvKiE8IFBlcmlwaGVyYWwgVm9sdGFnZSBNb25pdG9yaW5nIDQgZW5hYmxlOiBWRERBIHZlcnN1cyAyLjIgViBcCisgICAgICAgICAgICAgICAgICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBQV1JFeF9QVk1fTW9kZSAgUFdSIFBWTSBpbnRlcnJ1cHQgYW5kIGV2ZW50IG1vZGUKKyAqIEB7CisgKi8KKyNkZWZpbmUgUFdSX1BWTV9NT0RFX05PUk1BTCAweDAwMDAwMDAwVSAvKiE8IGJhc2ljIG1vZGUgaXMgdXNlZCAqLworI2RlZmluZSBQV1JfUFZNX01PREVfSVRfUklTSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAweDAwMDEwMDAxVSAvKiE8IEV4dGVybmFsIEludGVycnVwdCBNb2RlIHdpdGggUmlzaW5nIGVkZ2UgdHJpZ2dlciBkZXRlY3Rpb24gXAorICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUFdSX1BWTV9NT0RFX0lUX0ZBTExJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMTAwMDJVIC8qITwgRXh0ZXJuYWwgSW50ZXJydXB0IE1vZGUgd2l0aCBGYWxsaW5nIGVkZ2UgdHJpZ2dlciBkZXRlY3Rpb24gXAorICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUFdSX1BWTV9NT0RFX0lUX1JJU0lOR19GQUxMSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMTAwMDNVIC8qITwgRXh0ZXJuYWwgSW50ZXJydXB0IE1vZGUgd2l0aCBSaXNpbmcvRmFsbGluZyBlZGdlIHRyaWdnZXIgXAorICAgICAgICAgICAgICAgICBkZXRlY3Rpb24gKi8KKyNkZWZpbmUgUFdSX1BWTV9NT0RFX0VWRU5UX1JJU0lORyBcCisgIDB4MDAwMjAwMDFVIC8qITwgRXZlbnQgTW9kZSB3aXRoIFJpc2luZyBlZGdlIHRyaWdnZXIgZGV0ZWN0aW9uICovCisjZGVmaW5lIFBXUl9QVk1fTU9ERV9FVkVOVF9GQUxMSU5HIFwKKyAgMHgwMDAyMDAwMlUgLyohPCBFdmVudCBNb2RlIHdpdGggRmFsbGluZyBlZGdlIHRyaWdnZXIgZGV0ZWN0aW9uICovCisjZGVmaW5lIFBXUl9QVk1fTU9ERV9FVkVOVF9SSVNJTkdfRkFMTElORyBcCisgIDB4MDAwMjAwMDNVIC8qITwgRXZlbnQgTW9kZSB3aXRoIFJpc2luZy9GYWxsaW5nIGVkZ2UgdHJpZ2dlciBkZXRlY3Rpb24gKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFBXUkV4X1JlZ3VsYXRvcl9Wb2x0YWdlX1NjYWxlICBQV1IgUmVndWxhdG9yIHZvbHRhZ2Ugc2NhbGUKKyAqIEB7CisgKi8KKyNpZiBkZWZpbmVkKFBXUl9DUjVfUjFNT0RFKQorI2RlZmluZSBQV1JfUkVHVUxBVE9SX1ZPTFRBR0VfU0NBTEUxX0JPT1NUIFwKKyAgKCh1aW50MzJfdCkweDAwMDAwMDAwKSAvKiE8IFZvbHRhZ2Ugc2NhbGluZyByYW5nZSAxIGJvb3N0IG1vZGUgICovCisjZW5kaWYgICAgICAgICAgICAgICAgICAgLypQV1JfQ1I1X1IxTU9ERSAqLworI2RlZmluZSBQV1JfUkVHVUxBVE9SX1ZPTFRBR0VfU0NBTEUxIFwKKyAgUFdSX0NSMV9WT1NfMCAvKiE8IFZvbHRhZ2Ugc2NhbGluZyByYW5nZSAxIG5vcm1hbCBtb2RlICovCisjZGVmaW5lIFBXUl9SRUdVTEFUT1JfVk9MVEFHRV9TQ0FMRTIgXAorICBQV1JfQ1IxX1ZPU18xIC8qITwgVm9sdGFnZSBzY2FsaW5nIHJhbmdlIDIgICAgICAgICAgICAgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFBXUkV4X1ZCQVRfQmF0dGVyeV9DaGFyZ2luZ19TZWxlY3Rpb24gUFdSIGJhdHRlcnkgY2hhcmdpbmcKKyAqIHJlc2lzdG9yIHNlbGVjdGlvbgorICogQHsKKyAqLworI2RlZmluZSBQV1JfQkFUVEVSWV9DSEFSR0lOR19SRVNJU1RPUl81IFwKKyAgMHgwMDAwMDAwMFUgLyohPCBWQkFUIGNoYXJnaW5nIHRocm91Z2ggYSA1IGtPaG1zIHJlc2lzdG9yICAgKi8KKyNkZWZpbmUgUFdSX0JBVFRFUllfQ0hBUkdJTkdfUkVTSVNUT1JfMV81IFwKKyAgUFdSX0NSNF9WQlJTIC8qITwgVkJBVCBjaGFyZ2luZyB0aHJvdWdoIGEgMS41IGtPaG1zIHJlc2lzdG9yICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBQV1JFeF9WQkFUX0JhdHRlcnlfQ2hhcmdpbmcgUFdSIGJhdHRlcnkgY2hhcmdpbmcKKyAqIEB7CisgKi8KKyNkZWZpbmUgUFdSX0JBVFRFUllfQ0hBUkdJTkdfRElTQUJMRSAweDAwMDAwMDAwVQorI2RlZmluZSBQV1JfQkFUVEVSWV9DSEFSR0lOR19FTkFCTEUgUFdSX0NSNF9WQkUKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFBXUkV4X0dQSU9fQml0X051bWJlciBHUElPIGJpdCBudW1iZXIgZm9yIEkvTyBzZXR0aW5nIGluCisgKiBzdGFuZGJ5L3NodXRkb3duIG1vZGUKKyAqIEB7CisgKi8KKyNkZWZpbmUgUFdSX0dQSU9fQklUXzAgUFdSX1BVQ1JBX1BBMCAgIC8qITwgR1BJTyBwb3J0IEkvTyBwaW4gMCAgKi8KKyNkZWZpbmUgUFdSX0dQSU9fQklUXzEgUFdSX1BVQ1JBX1BBMSAgIC8qITwgR1BJTyBwb3J0IEkvTyBwaW4gMSAgKi8KKyNkZWZpbmUgUFdSX0dQSU9fQklUXzIgUFdSX1BVQ1JBX1BBMiAgIC8qITwgR1BJTyBwb3J0IEkvTyBwaW4gMiAgKi8KKyNkZWZpbmUgUFdSX0dQSU9fQklUXzMgUFdSX1BVQ1JBX1BBMyAgIC8qITwgR1BJTyBwb3J0IEkvTyBwaW4gMyAgKi8KKyNkZWZpbmUgUFdSX0dQSU9fQklUXzQgUFdSX1BVQ1JBX1BBNCAgIC8qITwgR1BJTyBwb3J0IEkvTyBwaW4gNCAgKi8KKyNkZWZpbmUgUFdSX0dQSU9fQklUXzUgUFdSX1BVQ1JBX1BBNSAgIC8qITwgR1BJTyBwb3J0IEkvTyBwaW4gNSAgKi8KKyNkZWZpbmUgUFdSX0dQSU9fQklUXzYgUFdSX1BVQ1JBX1BBNiAgIC8qITwgR1BJTyBwb3J0IEkvTyBwaW4gNiAgKi8KKyNkZWZpbmUgUFdSX0dQSU9fQklUXzcgUFdSX1BVQ1JBX1BBNyAgIC8qITwgR1BJTyBwb3J0IEkvTyBwaW4gNyAgKi8KKyNkZWZpbmUgUFdSX0dQSU9fQklUXzggUFdSX1BVQ1JBX1BBOCAgIC8qITwgR1BJTyBwb3J0IEkvTyBwaW4gOCAgKi8KKyNkZWZpbmUgUFdSX0dQSU9fQklUXzkgUFdSX1BVQ1JBX1BBOSAgIC8qITwgR1BJTyBwb3J0IEkvTyBwaW4gOSAgKi8KKyNkZWZpbmUgUFdSX0dQSU9fQklUXzEwIFBXUl9QVUNSQV9QQTEwIC8qITwgR1BJTyBwb3J0IEkvTyBwaW4gMTAgKi8KKyNkZWZpbmUgUFdSX0dQSU9fQklUXzExIFBXUl9QVUNSQV9QQTExIC8qITwgR1BJTyBwb3J0IEkvTyBwaW4gMTEgKi8KKyNkZWZpbmUgUFdSX0dQSU9fQklUXzEyIFBXUl9QVUNSQV9QQTEyIC8qITwgR1BJTyBwb3J0IEkvTyBwaW4gMTIgKi8KKyNkZWZpbmUgUFdSX0dQSU9fQklUXzEzIFBXUl9QVUNSQV9QQTEzIC8qITwgR1BJTyBwb3J0IEkvTyBwaW4gMTMgKi8KKyNkZWZpbmUgUFdSX0dQSU9fQklUXzE0IFBXUl9QRENSQV9QQTE0IC8qITwgR1BJTyBwb3J0IEkvTyBwaW4gMTQgKi8KKyNkZWZpbmUgUFdSX0dQSU9fQklUXzE1IFBXUl9QVUNSQV9QQTE1IC8qITwgR1BJTyBwb3J0IEkvTyBwaW4gMTUgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFBXUkV4X0dQSU8gR1BJTyBwb3J0CisgKiBAeworICovCisjZGVmaW5lIFBXUl9HUElPX0EgMHgwMDAwMDAwMFUgLyohPCBHUElPIHBvcnQgQSAqLworI2RlZmluZSBQV1JfR1BJT19CIDB4MDAwMDAwMDFVIC8qITwgR1BJTyBwb3J0IEIgKi8KKyNkZWZpbmUgUFdSX0dQSU9fQyAweDAwMDAwMDAyVSAvKiE8IEdQSU8gcG9ydCBDICovCisjZGVmaW5lIFBXUl9HUElPX0QgMHgwMDAwMDAwM1UgLyohPCBHUElPIHBvcnQgRCAqLworI2RlZmluZSBQV1JfR1BJT19FIDB4MDAwMDAwMDRVIC8qITwgR1BJTyBwb3J0IEUgKi8KKyNkZWZpbmUgUFdSX0dQSU9fRiAweDAwMDAwMDA1VSAvKiE8IEdQSU8gcG9ydCBGICovCisjZGVmaW5lIFBXUl9HUElPX0cgMHgwMDAwMDAwNlUgLyohPCBHUElPIHBvcnQgRyAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgUFdSRXhfUFZNX0VYVElfTElORSBQV1IgUFZNIGV4dGVybmFsIGludGVycnVwdHMgbGluZXMKKyAqIEB7CisgKi8KKyNpZiBkZWZpbmVkKFBXUl9DUjJfUFZNRTEpCisjZGVmaW5lIFBXUl9FWFRJX0xJTkVfUFZNMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMDAwMDhVIC8qITwgRXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUgMzUgQ29ubmVjdGVkIHRvIHRoZSBQVk0xIEVYVEkgTGluZSBcCisgICAgICAgICAgICAgICAqLworI2VuZGlmICAgICAgICAvKiBQV1JfQ1IyX1BWTUUxICovCisjaWYgZGVmaW5lZChQV1JfQ1IyX1BWTUUyKQorI2RlZmluZSBQV1JfRVhUSV9MSU5FX1BWTTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAweDAwMDAwMDEwVSAvKiE8IEV4dGVybmFsIGludGVycnVwdCBsaW5lIDM2IENvbm5lY3RlZCB0byB0aGUgUFZNMiBFWFRJIExpbmUgXAorICAgICAgICAgICAgICAgKi8KKyNlbmRpZiAgICAgICAgLyogUFdSX0NSMl9QVk1FMiAqLworI2RlZmluZSBQV1JfRVhUSV9MSU5FX1BWTTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAweDAwMDAwMDIwVSAvKiE8IEV4dGVybmFsIGludGVycnVwdCBsaW5lIDM3IENvbm5lY3RlZCB0byB0aGUgUFZNMyBFWFRJIExpbmUgXAorICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUFdSX0VYVElfTElORV9QVk00ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwMDAwMDA0MFUgLyohPCBFeHRlcm5hbCBpbnRlcnJ1cHQgbGluZSAzOCBDb25uZWN0ZWQgdG8gdGhlIFBWTTQgRVhUSSBMaW5lIFwKKyAgICAgICAgICAgICAgICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBQV1JFeF9QVk1fRVZFTlRfTElORSBQV1IgUFZNIGV2ZW50IGxpbmVzCisgKiBAeworICovCisjaWYgZGVmaW5lZChQV1JfQ1IyX1BWTUUxKQorI2RlZmluZSBQV1JfRVZFTlRfTElORV9QVk0xIFwKKyAgMHgwMDAwMDAwOFUgLyohPCBFdmVudCBsaW5lIDM1IENvbm5lY3RlZCB0byB0aGUgUFZNMSBFWFRJIExpbmUgKi8KKyNlbmRpZiAgICAgICAgLyogUFdSX0NSMl9QVk1FMSAqLworI2lmIGRlZmluZWQoUFdSX0NSMl9QVk1FMikKKyNkZWZpbmUgUFdSX0VWRU5UX0xJTkVfUFZNMiBcCisgIDB4MDAwMDAwMTBVIC8qITwgRXZlbnQgbGluZSAzNiBDb25uZWN0ZWQgdG8gdGhlIFBWTTIgRVhUSSBMaW5lICovCisjZW5kaWYgICAgICAgIC8qIFBXUl9DUjJfUFZNRTIgKi8KKyNkZWZpbmUgUFdSX0VWRU5UX0xJTkVfUFZNMyBcCisgIDB4MDAwMDAwMjBVIC8qITwgRXZlbnQgbGluZSAzNyBDb25uZWN0ZWQgdG8gdGhlIFBWTTMgRVhUSSBMaW5lICovCisjZGVmaW5lIFBXUl9FVkVOVF9MSU5FX1BWTTQgXAorICAweDAwMDAwMDQwVSAvKiE8IEV2ZW50IGxpbmUgMzggQ29ubmVjdGVkIHRvIHRoZSBQVk00IEVYVEkgTGluZSAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgUFdSRXhfRmxhZyAgUFdSIFN0YXR1cyBGbGFncworICogICAgICAgIEVsZW1lbnRzIHZhbHVlcyBjb252ZW50aW9uOiAwMDAwIDAwMDAgMFhYWSBZWVlZYgorICogICAgICAgICAgIC0gWSBZWVlZICA6IEZsYWcgcG9zaXRpb24gaW4gdGhlIFhYIHJlZ2lzdGVyICg1IGJpdHMpCisgKiAgICAgICAgICAgLSBYWCAgOiBTdGF0dXMgcmVnaXN0ZXIgKDIgYml0cykKKyAqICAgICAgICAgICAgICAgICAtIDAxOiBTUjEgcmVnaXN0ZXIKKyAqICAgICAgICAgICAgICAgICAtIDEwOiBTUjIgcmVnaXN0ZXIKKyAqICAgICAgICBUaGUgb25seSBleGNlcHRpb24gaXMgUFdSX0ZMQUdfV1UsIGVuY29tcGFzc2luZyBhbGwKKyAqICAgICAgICB3YWtlLXVwIGZsYWdzIGFuZCBzZXQgdG8gUFdSX1NSMV9XVUYuCisgKiBAeworICovCisjZGVmaW5lIFBXUl9GTEFHX1dVRjEgMHgwMDIwVSAvKiE8IFdha2V1cCBldmVudCBvbiB3YWtldXAgcGluIDEgKi8KKyNkZWZpbmUgUFdSX0ZMQUdfV1VGMiAweDAwMjFVIC8qITwgV2FrZXVwIGV2ZW50IG9uIHdha2V1cCBwaW4gMiAqLworI2RlZmluZSBQV1JfRkxBR19XVUYzIDB4MDAyMlUgLyohPCBXYWtldXAgZXZlbnQgb24gd2FrZXVwIHBpbiAzICovCisjZGVmaW5lIFBXUl9GTEFHX1dVRjQgMHgwMDIzVSAvKiE8IFdha2V1cCBldmVudCBvbiB3YWtldXAgcGluIDQgKi8KKyNkZWZpbmUgUFdSX0ZMQUdfV1VGNSAweDAwMjRVIC8qITwgV2FrZXVwIGV2ZW50IG9uIHdha2V1cCBwaW4gNSAqLworI2RlZmluZSBQV1JfRkxBR19XVSBcCisgIFBXUl9TUjFfV1VGICAgICAgICAgICAgICAgICAvKiE8IEVuY29tcGFzcyB3YWtldXAgZXZlbnQgb24gYWxsIHdha2V1cCBwaW5zICovCisjZGVmaW5lIFBXUl9GTEFHX1NCIDB4MDAyOFUgICAvKiE8IFN0YW5kYnkgZmxhZyAqLworI2RlZmluZSBQV1JfRkxBR19XVUZJIDB4MDAyRlUgLyohPCBXYWtldXAgb24gaW50ZXJuYWwgd2FrZXVwIGxpbmUgKi8KKworI2RlZmluZSBQV1JfRkxBR19SRUdMUFMgMHgwMDQ4VSAvKiE8IExvdy1wb3dlciByZWd1bGF0b3Igc3RhcnQgZmxhZyAqLworI2RlZmluZSBQV1JfRkxBR19SRUdMUEYgMHgwMDQ5VSAvKiE8IExvdy1wb3dlciByZWd1bGF0b3IgZmxhZyAqLworI2RlZmluZSBQV1JfRkxBR19WT1NGIDB4MDA0QVUgICAvKiE8IFZvbHRhZ2Ugc2NhbGluZyBmbGFnICovCisjZGVmaW5lIFBXUl9GTEFHX1BWRE8gMHgwMDRCVSAgIC8qITwgUG93ZXIgVm9sdGFnZSBEZXRlY3RvciBvdXRwdXQgZmxhZyAqLworI2lmIGRlZmluZWQoUFdSX0NSMl9QVk1FMSkKKyNkZWZpbmUgUFdSX0ZMQUdfUFZNTzEgMHgwMDRDVSAvKiE8IFBvd2VyIFZvbHRhZ2UgTW9uaXRvcmluZyAxIG91dHB1dCBmbGFnICovCisjZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgLyogUFdSX0NSMl9QVk1FMSAqLworI2lmIGRlZmluZWQoUFdSX0NSMl9QVk1FMikKKyNkZWZpbmUgUFdSX0ZMQUdfUFZNTzIgMHgwMDREVSAvKiE8IFBvd2VyIFZvbHRhZ2UgTW9uaXRvcmluZyAyIG91dHB1dCBmbGFnICovCisjZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgLyogUFdSX0NSMl9QVk1FMiAqLworI2RlZmluZSBQV1JfRkxBR19QVk1PMyAweDAwNEVVIC8qITwgUG93ZXIgVm9sdGFnZSBNb25pdG9yaW5nIDMgb3V0cHV0IGZsYWcgKi8KKyNkZWZpbmUgUFdSX0ZMQUdfUFZNTzQgMHgwMDRGVSAvKiE8IFBvd2VyIFZvbHRhZ2UgTW9uaXRvcmluZyA0IG91dHB1dCBmbGFnICovCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFBXUkV4X0V4cG9ydGVkX01hY3JvcyBQV1IgRXh0ZW5kZWQgRXhwb3J0ZWQgTWFjcm9zCisgKiBAeworICovCisKKyNpZiBkZWZpbmVkKFBXUl9DUjJfUFZNRTEpCisvKioKKyAqIEBicmllZiBFbmFibGUgdGhlIFBWTTEgRXh0ZW5kZWQgSW50ZXJydXB0IExpbmUuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9QV1JfUFZNMV9FWFRJX0VOQUJMRV9JVCgpIFNFVF9CSVQoRVhUSS0+SU1SMiwgUFdSX0VYVElfTElORV9QVk0xKQorCisvKioKKyAqIEBicmllZiBEaXNhYmxlIHRoZSBQVk0xIEV4dGVuZGVkIEludGVycnVwdCBMaW5lLgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWTTFfRVhUSV9ESVNBQkxFX0lUKCkgXAorICBDTEVBUl9CSVQoRVhUSS0+SU1SMiwgUFdSX0VYVElfTElORV9QVk0xKQorCisvKioKKyAqIEBicmllZiBFbmFibGUgdGhlIFBWTTEgRXZlbnQgTGluZS4KKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX1BXUl9QVk0xX0VYVElfRU5BQkxFX0VWRU5UKCkgXAorICBTRVRfQklUKEVYVEktPkVNUjIsIFBXUl9FVkVOVF9MSU5FX1BWTTEpCisKKy8qKgorICogQGJyaWVmIERpc2FibGUgdGhlIFBWTTEgRXZlbnQgTGluZS4KKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX1BXUl9QVk0xX0VYVElfRElTQUJMRV9FVkVOVCgpIFwKKyAgQ0xFQVJfQklUKEVYVEktPkVNUjIsIFBXUl9FVkVOVF9MSU5FX1BWTTEpCisKKy8qKgorICogQGJyaWVmIEVuYWJsZSB0aGUgUFZNMSBFeHRlbmRlZCBJbnRlcnJ1cHQgUmlzaW5nIFRyaWdnZXIuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9QV1JfUFZNMV9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpIFwKKyAgU0VUX0JJVChFWFRJLT5SVFNSMiwgUFdSX0VYVElfTElORV9QVk0xKQorCisvKioKKyAqIEBicmllZiBEaXNhYmxlIHRoZSBQVk0xIEV4dGVuZGVkIEludGVycnVwdCBSaXNpbmcgVHJpZ2dlci4KKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX1BXUl9QVk0xX0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpIFwKKyAgQ0xFQVJfQklUKEVYVEktPlJUU1IyLCBQV1JfRVhUSV9MSU5FX1BWTTEpCisKKy8qKgorICogQGJyaWVmIEVuYWJsZSB0aGUgUFZNMSBFeHRlbmRlZCBJbnRlcnJ1cHQgRmFsbGluZyBUcmlnZ2VyLgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWTTFfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCkgXAorICBTRVRfQklUKEVYVEktPkZUU1IyLCBQV1JfRVhUSV9MSU5FX1BWTTEpCisKKy8qKgorICogQGJyaWVmIERpc2FibGUgdGhlIFBWTTEgRXh0ZW5kZWQgSW50ZXJydXB0IEZhbGxpbmcgVHJpZ2dlci4KKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX1BXUl9QVk0xX0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKSBcCisgIENMRUFSX0JJVChFWFRJLT5GVFNSMiwgUFdSX0VYVElfTElORV9QVk0xKQorCisvKioKKyAqIEBicmllZiAgUFZNMSBFWFRJIGxpbmUgY29uZmlndXJhdGlvbjogc2V0IHJpc2luZyAmIGZhbGxpbmcgZWRnZSB0cmlnZ2VyLgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWTTFfRVhUSV9FTkFCTEVfUklTSU5HX0ZBTExJTkdfRURHRSgpIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX0hBTF9QV1JfUFZNMV9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpOyAgICAgICAgICAgIFwKKyAgICBfX0hBTF9QV1JfUFZNMV9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKTsgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworLyoqCisgKiBAYnJpZWYgRGlzYWJsZSB0aGUgUFZNMSBFeHRlbmRlZCBJbnRlcnJ1cHQgUmlzaW5nICYgRmFsbGluZyBUcmlnZ2VyLgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWTTFfRVhUSV9ESVNBQkxFX1JJU0lOR19GQUxMSU5HX0VER0UoKSBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fSEFMX1BXUl9QVk0xX0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpOyAgICAgICAgICAgIFwKKyAgICBfX0hBTF9QV1JfUFZNMV9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCk7ICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKy8qKgorICogQGJyaWVmICBHZW5lcmF0ZSBhIFNvZnR3YXJlIGludGVycnVwdCBvbiBzZWxlY3RlZCBFWFRJIGxpbmUuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9QV1JfUFZNMV9FWFRJX0dFTkVSQVRFX1NXSVQoKSBcCisgIFNFVF9CSVQoRVhUSS0+U1dJRVIyLCBQV1JfRVhUSV9MSU5FX1BWTTEpCisKKy8qKgorICogQGJyaWVmIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBQVk0xIEVYVEkgaW50ZXJydXB0IGZsYWcgaXMgc2V0IG9yIG5vdC4KKyAqIEByZXR2YWwgRVhUSSBQVk0xIExpbmUgU3RhdHVzLgorICovCisjZGVmaW5lIF9fSEFMX1BXUl9QVk0xX0VYVElfR0VUX0ZMQUcoKSAoRVhUSS0+UFIyICYgUFdSX0VYVElfTElORV9QVk0xKQorCisvKioKKyAqIEBicmllZiBDbGVhciB0aGUgUFZNMSBFWFRJIGZsYWcuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9QV1JfUFZNMV9FWFRJX0NMRUFSX0ZMQUcoKSBcCisgIFdSSVRFX1JFRyhFWFRJLT5QUjIsIFBXUl9FWFRJX0xJTkVfUFZNMSkKKworI2VuZGlmIC8qIFBXUl9DUjJfUFZNRTEgKi8KKworI2lmIGRlZmluZWQoUFdSX0NSMl9QVk1FMikKKy8qKgorICogQGJyaWVmIEVuYWJsZSB0aGUgUFZNMiBFeHRlbmRlZCBJbnRlcnJ1cHQgTGluZS4KKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX1BXUl9QVk0yX0VYVElfRU5BQkxFX0lUKCkgU0VUX0JJVChFWFRJLT5JTVIyLCBQV1JfRVhUSV9MSU5FX1BWTTIpCisKKy8qKgorICogQGJyaWVmIERpc2FibGUgdGhlIFBWTTIgRXh0ZW5kZWQgSW50ZXJydXB0IExpbmUuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9QV1JfUFZNMl9FWFRJX0RJU0FCTEVfSVQoKSBcCisgIENMRUFSX0JJVChFWFRJLT5JTVIyLCBQV1JfRVhUSV9MSU5FX1BWTTIpCisKKy8qKgorICogQGJyaWVmIEVuYWJsZSB0aGUgUFZNMiBFdmVudCBMaW5lLgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWTTJfRVhUSV9FTkFCTEVfRVZFTlQoKSBcCisgIFNFVF9CSVQoRVhUSS0+RU1SMiwgUFdSX0VWRU5UX0xJTkVfUFZNMikKKworLyoqCisgKiBAYnJpZWYgRGlzYWJsZSB0aGUgUFZNMiBFdmVudCBMaW5lLgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWTTJfRVhUSV9ESVNBQkxFX0VWRU5UKCkgXAorICBDTEVBUl9CSVQoRVhUSS0+RU1SMiwgUFdSX0VWRU5UX0xJTkVfUFZNMikKKworLyoqCisgKiBAYnJpZWYgRW5hYmxlIHRoZSBQVk0yIEV4dGVuZGVkIEludGVycnVwdCBSaXNpbmcgVHJpZ2dlci4KKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX1BXUl9QVk0yX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCkgXAorICBTRVRfQklUKEVYVEktPlJUU1IyLCBQV1JfRVhUSV9MSU5FX1BWTTIpCisKKy8qKgorICogQGJyaWVmIERpc2FibGUgdGhlIFBWTTIgRXh0ZW5kZWQgSW50ZXJydXB0IFJpc2luZyBUcmlnZ2VyLgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWTTJfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCkgXAorICBDTEVBUl9CSVQoRVhUSS0+UlRTUjIsIFBXUl9FWFRJX0xJTkVfUFZNMikKKworLyoqCisgKiBAYnJpZWYgRW5hYmxlIHRoZSBQVk0yIEV4dGVuZGVkIEludGVycnVwdCBGYWxsaW5nIFRyaWdnZXIuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9QV1JfUFZNMl9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKSBcCisgIFNFVF9CSVQoRVhUSS0+RlRTUjIsIFBXUl9FWFRJX0xJTkVfUFZNMikKKworLyoqCisgKiBAYnJpZWYgRGlzYWJsZSB0aGUgUFZNMiBFeHRlbmRlZCBJbnRlcnJ1cHQgRmFsbGluZyBUcmlnZ2VyLgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWTTJfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpIFwKKyAgQ0xFQVJfQklUKEVYVEktPkZUU1IyLCBQV1JfRVhUSV9MSU5FX1BWTTIpCisKKy8qKgorICogQGJyaWVmICBQVk0yIEVYVEkgbGluZSBjb25maWd1cmF0aW9uOiBzZXQgcmlzaW5nICYgZmFsbGluZyBlZGdlIHRyaWdnZXIuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9QV1JfUFZNMl9FWFRJX0VOQUJMRV9SSVNJTkdfRkFMTElOR19FREdFKCkgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fSEFMX1BXUl9QVk0yX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCk7ICAgICAgICAgICAgXAorICAgIF9fSEFMX1BXUl9QVk0yX0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRSgpOyAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisvKioKKyAqIEBicmllZiBEaXNhYmxlIHRoZSBQVk0yIEV4dGVuZGVkIEludGVycnVwdCBSaXNpbmcgJiBGYWxsaW5nIFRyaWdnZXIuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9QV1JfUFZNMl9FWFRJX0RJU0FCTEVfUklTSU5HX0ZBTExJTkdfRURHRSgpIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19IQUxfUFdSX1BWTTJfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCk7ICAgICAgICAgICAgXAorICAgIF9fSEFMX1BXUl9QVk0yX0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKTsgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworLyoqCisgKiBAYnJpZWYgIEdlbmVyYXRlIGEgU29mdHdhcmUgaW50ZXJydXB0IG9uIHNlbGVjdGVkIEVYVEkgbGluZS4KKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX1BXUl9QVk0yX0VYVElfR0VORVJBVEVfU1dJVCgpIFwKKyAgU0VUX0JJVChFWFRJLT5TV0lFUjIsIFBXUl9FWFRJX0xJTkVfUFZNMikKKworLyoqCisgKiBAYnJpZWYgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIFBWTTIgRVhUSSBpbnRlcnJ1cHQgZmxhZyBpcyBzZXQgb3Igbm90LgorICogQHJldHZhbCBFWFRJIFBWTTIgTGluZSBTdGF0dXMuCisgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWTTJfRVhUSV9HRVRfRkxBRygpIChFWFRJLT5QUjIgJiBQV1JfRVhUSV9MSU5FX1BWTTIpCisKKy8qKgorICogQGJyaWVmIENsZWFyIHRoZSBQVk0yIEVYVEkgZmxhZy4KKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX1BXUl9QVk0yX0VYVElfQ0xFQVJfRkxBRygpIFwKKyAgV1JJVEVfUkVHKEVYVEktPlBSMiwgUFdSX0VYVElfTElORV9QVk0yKQorCisjZW5kaWYgLyogUFdSX0NSMl9QVk1FMiAqLworCisvKioKKyAqIEBicmllZiBFbmFibGUgdGhlIFBWTTMgRXh0ZW5kZWQgSW50ZXJydXB0IExpbmUuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9QV1JfUFZNM19FWFRJX0VOQUJMRV9JVCgpIFNFVF9CSVQoRVhUSS0+SU1SMiwgUFdSX0VYVElfTElORV9QVk0zKQorCisvKioKKyAqIEBicmllZiBEaXNhYmxlIHRoZSBQVk0zIEV4dGVuZGVkIEludGVycnVwdCBMaW5lLgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWTTNfRVhUSV9ESVNBQkxFX0lUKCkgXAorICBDTEVBUl9CSVQoRVhUSS0+SU1SMiwgUFdSX0VYVElfTElORV9QVk0zKQorCisvKioKKyAqIEBicmllZiBFbmFibGUgdGhlIFBWTTMgRXZlbnQgTGluZS4KKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX1BXUl9QVk0zX0VYVElfRU5BQkxFX0VWRU5UKCkgXAorICBTRVRfQklUKEVYVEktPkVNUjIsIFBXUl9FVkVOVF9MSU5FX1BWTTMpCisKKy8qKgorICogQGJyaWVmIERpc2FibGUgdGhlIFBWTTMgRXZlbnQgTGluZS4KKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX1BXUl9QVk0zX0VYVElfRElTQUJMRV9FVkVOVCgpIFwKKyAgQ0xFQVJfQklUKEVYVEktPkVNUjIsIFBXUl9FVkVOVF9MSU5FX1BWTTMpCisKKy8qKgorICogQGJyaWVmIEVuYWJsZSB0aGUgUFZNMyBFeHRlbmRlZCBJbnRlcnJ1cHQgUmlzaW5nIFRyaWdnZXIuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9QV1JfUFZNM19FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpIFwKKyAgU0VUX0JJVChFWFRJLT5SVFNSMiwgUFdSX0VYVElfTElORV9QVk0zKQorCisvKioKKyAqIEBicmllZiBEaXNhYmxlIHRoZSBQVk0zIEV4dGVuZGVkIEludGVycnVwdCBSaXNpbmcgVHJpZ2dlci4KKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX1BXUl9QVk0zX0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpIFwKKyAgQ0xFQVJfQklUKEVYVEktPlJUU1IyLCBQV1JfRVhUSV9MSU5FX1BWTTMpCisKKy8qKgorICogQGJyaWVmIEVuYWJsZSB0aGUgUFZNMyBFeHRlbmRlZCBJbnRlcnJ1cHQgRmFsbGluZyBUcmlnZ2VyLgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWTTNfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCkgXAorICBTRVRfQklUKEVYVEktPkZUU1IyLCBQV1JfRVhUSV9MSU5FX1BWTTMpCisKKy8qKgorICogQGJyaWVmIERpc2FibGUgdGhlIFBWTTMgRXh0ZW5kZWQgSW50ZXJydXB0IEZhbGxpbmcgVHJpZ2dlci4KKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX1BXUl9QVk0zX0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKSBcCisgIENMRUFSX0JJVChFWFRJLT5GVFNSMiwgUFdSX0VYVElfTElORV9QVk0zKQorCisvKioKKyAqIEBicmllZiAgUFZNMyBFWFRJIGxpbmUgY29uZmlndXJhdGlvbjogc2V0IHJpc2luZyAmIGZhbGxpbmcgZWRnZSB0cmlnZ2VyLgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWTTNfRVhUSV9FTkFCTEVfUklTSU5HX0ZBTExJTkdfRURHRSgpIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX0hBTF9QV1JfUFZNM19FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpOyAgICAgICAgICAgIFwKKyAgICBfX0hBTF9QV1JfUFZNM19FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKTsgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworLyoqCisgKiBAYnJpZWYgRGlzYWJsZSB0aGUgUFZNMyBFeHRlbmRlZCBJbnRlcnJ1cHQgUmlzaW5nICYgRmFsbGluZyBUcmlnZ2VyLgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWTTNfRVhUSV9ESVNBQkxFX1JJU0lOR19GQUxMSU5HX0VER0UoKSBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fSEFMX1BXUl9QVk0zX0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpOyAgICAgICAgICAgIFwKKyAgICBfX0hBTF9QV1JfUFZNM19FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCk7ICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKy8qKgorICogQGJyaWVmICBHZW5lcmF0ZSBhIFNvZnR3YXJlIGludGVycnVwdCBvbiBzZWxlY3RlZCBFWFRJIGxpbmUuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9QV1JfUFZNM19FWFRJX0dFTkVSQVRFX1NXSVQoKSBcCisgIFNFVF9CSVQoRVhUSS0+U1dJRVIyLCBQV1JfRVhUSV9MSU5FX1BWTTMpCisKKy8qKgorICogQGJyaWVmIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBQVk0zIEVYVEkgaW50ZXJydXB0IGZsYWcgaXMgc2V0IG9yIG5vdC4KKyAqIEByZXR2YWwgRVhUSSBQVk0zIExpbmUgU3RhdHVzLgorICovCisjZGVmaW5lIF9fSEFMX1BXUl9QVk0zX0VYVElfR0VUX0ZMQUcoKSAoRVhUSS0+UFIyICYgUFdSX0VYVElfTElORV9QVk0zKQorCisvKioKKyAqIEBicmllZiBDbGVhciB0aGUgUFZNMyBFWFRJIGZsYWcuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9QV1JfUFZNM19FWFRJX0NMRUFSX0ZMQUcoKSBcCisgIFdSSVRFX1JFRyhFWFRJLT5QUjIsIFBXUl9FWFRJX0xJTkVfUFZNMykKKworLyoqCisgKiBAYnJpZWYgRW5hYmxlIHRoZSBQVk00IEV4dGVuZGVkIEludGVycnVwdCBMaW5lLgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWTTRfRVhUSV9FTkFCTEVfSVQoKSBTRVRfQklUKEVYVEktPklNUjIsIFBXUl9FWFRJX0xJTkVfUFZNNCkKKworLyoqCisgKiBAYnJpZWYgRGlzYWJsZSB0aGUgUFZNNCBFeHRlbmRlZCBJbnRlcnJ1cHQgTGluZS4KKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX1BXUl9QVk00X0VYVElfRElTQUJMRV9JVCgpIFwKKyAgQ0xFQVJfQklUKEVYVEktPklNUjIsIFBXUl9FWFRJX0xJTkVfUFZNNCkKKworLyoqCisgKiBAYnJpZWYgRW5hYmxlIHRoZSBQVk00IEV2ZW50IExpbmUuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9QV1JfUFZNNF9FWFRJX0VOQUJMRV9FVkVOVCgpIFwKKyAgU0VUX0JJVChFWFRJLT5FTVIyLCBQV1JfRVZFTlRfTElORV9QVk00KQorCisvKioKKyAqIEBicmllZiBEaXNhYmxlIHRoZSBQVk00IEV2ZW50IExpbmUuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9QV1JfUFZNNF9FWFRJX0RJU0FCTEVfRVZFTlQoKSBcCisgIENMRUFSX0JJVChFWFRJLT5FTVIyLCBQV1JfRVZFTlRfTElORV9QVk00KQorCisvKioKKyAqIEBicmllZiBFbmFibGUgdGhlIFBWTTQgRXh0ZW5kZWQgSW50ZXJydXB0IFJpc2luZyBUcmlnZ2VyLgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWTTRfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKSBcCisgIFNFVF9CSVQoRVhUSS0+UlRTUjIsIFBXUl9FWFRJX0xJTkVfUFZNNCkKKworLyoqCisgKiBAYnJpZWYgRGlzYWJsZSB0aGUgUFZNNCBFeHRlbmRlZCBJbnRlcnJ1cHQgUmlzaW5nIFRyaWdnZXIuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9QV1JfUFZNNF9FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKSBcCisgIENMRUFSX0JJVChFWFRJLT5SVFNSMiwgUFdSX0VYVElfTElORV9QVk00KQorCisvKioKKyAqIEBicmllZiBFbmFibGUgdGhlIFBWTTQgRXh0ZW5kZWQgSW50ZXJydXB0IEZhbGxpbmcgVHJpZ2dlci4KKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX1BXUl9QVk00X0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRSgpIFwKKyAgU0VUX0JJVChFWFRJLT5GVFNSMiwgUFdSX0VYVElfTElORV9QVk00KQorCisvKioKKyAqIEBicmllZiBEaXNhYmxlIHRoZSBQVk00IEV4dGVuZGVkIEludGVycnVwdCBGYWxsaW5nIFRyaWdnZXIuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9QV1JfUFZNNF9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCkgXAorICBDTEVBUl9CSVQoRVhUSS0+RlRTUjIsIFBXUl9FWFRJX0xJTkVfUFZNNCkKKworLyoqCisgKiBAYnJpZWYgIFBWTTQgRVhUSSBsaW5lIGNvbmZpZ3VyYXRpb246IHNldCByaXNpbmcgJiBmYWxsaW5nIGVkZ2UgdHJpZ2dlci4KKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX1BXUl9QVk00X0VYVElfRU5BQkxFX1JJU0lOR19GQUxMSU5HX0VER0UoKSBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19IQUxfUFdSX1BWTTRfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKTsgICAgICAgICAgICBcCisgICAgX19IQUxfUFdSX1BWTTRfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCk7ICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKy8qKgorICogQGJyaWVmIERpc2FibGUgdGhlIFBWTTQgRXh0ZW5kZWQgSW50ZXJydXB0IFJpc2luZyAmIEZhbGxpbmcgVHJpZ2dlci4KKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX1BXUl9QVk00X0VYVElfRElTQUJMRV9SSVNJTkdfRkFMTElOR19FREdFKCkgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX0hBTF9QV1JfUFZNNF9FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKTsgICAgICAgICAgICBcCisgICAgX19IQUxfUFdSX1BWTTRfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpOyAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisvKioKKyAqIEBicmllZiAgR2VuZXJhdGUgYSBTb2Z0d2FyZSBpbnRlcnJ1cHQgb24gc2VsZWN0ZWQgRVhUSSBsaW5lLgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWTTRfRVhUSV9HRU5FUkFURV9TV0lUKCkgXAorICBTRVRfQklUKEVYVEktPlNXSUVSMiwgUFdSX0VYVElfTElORV9QVk00KQorCisvKioKKyAqIEBicmllZiBDaGVjayB3aGV0aGVyIG9yIG5vdCB0aGUgc3BlY2lmaWVkIFBWTTQgRVhUSSBpbnRlcnJ1cHQgZmxhZyBpcyBzZXQuCisgKiBAcmV0dmFsIEVYVEkgUFZNNCBMaW5lIFN0YXR1cy4KKyAqLworI2RlZmluZSBfX0hBTF9QV1JfUFZNNF9FWFRJX0dFVF9GTEFHKCkgKEVYVEktPlBSMiAmIFBXUl9FWFRJX0xJTkVfUFZNNCkKKworLyoqCisgKiBAYnJpZWYgQ2xlYXIgdGhlIFBWTTQgRVhUSSBmbGFnLgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWTTRfRVhUSV9DTEVBUl9GTEFHKCkgXAorICBXUklURV9SRUcoRVhUSS0+UFIyLCBQV1JfRVhUSV9MSU5FX1BWTTQpCisKKy8qKgorICogQGJyaWVmIENvbmZpZ3VyZSB0aGUgbWFpbiBpbnRlcm5hbCByZWd1bGF0b3Igb3V0cHV0IHZvbHRhZ2UuCisgKiBAcGFyYW0gIF9fUkVHVUxBVE9SX186IHNwZWNpZmllcyB0aGUgcmVndWxhdG9yIG91dHB1dCB2b2x0YWdlIHRvIGFjaGlldmUKKyAqICAgICAgICAgYSB0cmFkZW9mZiBiZXR3ZWVuIHBlcmZvcm1hbmNlIGFuZCBwb3dlciBjb25zdW1wdGlvbi4KKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfUkVHVUxBVE9SX1ZPTFRBR0VfU0NBTEUxX0JPT1NUICBSZWd1bGF0b3Igdm9sdGFnZQorICogb3V0cHV0IHJhbmdlIDEgbW9kZSwgdHlwaWNhbCBvdXRwdXQgdm9sdGFnZSBhdCAxLjI4IFYsIHN5c3RlbSBmcmVxdWVuY3kgdXAgdG8KKyAqIDE3MCBNSHouCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfUkVHVUxBVE9SX1ZPTFRBR0VfU0NBTEUxICBSZWd1bGF0b3Igdm9sdGFnZSBvdXRwdXQKKyAqIHJhbmdlIDEgbW9kZSwgdHlwaWNhbCBvdXRwdXQgdm9sdGFnZSBhdCAxLjIgViwgc3lzdGVtIGZyZXF1ZW5jeSB1cCB0byAxNTAKKyAqIE1Iei4KKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFBXUl9SRUdVTEFUT1JfVk9MVEFHRV9TQ0FMRTIgIFJlZ3VsYXRvciB2b2x0YWdlIG91dHB1dAorICogcmFuZ2UgMiBtb2RlLCB0eXBpY2FsIG91dHB1dCB2b2x0YWdlIGF0IDEuMCBWLCBzeXN0ZW0gZnJlcXVlbmN5IHVwIHRvIDI2IE1Iei4KKyAqIEBub3RlICBUaGlzIG1hY3JvIGlzIHNpbWlsYXIgdG8gSEFMX1BXUkV4X0NvbnRyb2xWb2x0YWdlU2NhbGluZygpIEFQSSBidXQKKyAqIGRvZXNuJ3QgY2hlY2sgd2hldGhlciBvciBub3QgVk9TRiBmbGFnIGlzIGNsZWFyZWQgd2hlbiBtb3ZpbmcgZnJvbSByYW5nZSAyIHRvCisgKiByYW5nZSAxLiBVc2VyIG1heSByZXNvcnQgdG8gX19IQUxfUFdSX0dFVF9GTEFHKCkgbWFjcm8gdG8gY2hlY2sgVk9TRiBiaXQKKyAqIHJlc2V0dGluZy4KKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX1BXUl9WT0xUQUdFU0NBTElOR19DT05GSUcoX19SRUdVTEFUT1JfXykgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTU9ESUZZX1JFRyhQV1ItPkNSMSwgUFdSX0NSMV9WT1MsIChfX1JFR1VMQVRPUl9fKSk7IFwKKyAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyAgXAorICAgIHRtcHJlZyA9IFJFQURfQklUKFBXUi0+Q1IxLCBQV1JfQ1IxX1ZPUyk7ICAgICAgICAgICBcCisgICAgVU5VU0VEKHRtcHJlZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworLyoqCisgKiBAfQorICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCAgUFdSRXhfUHJpdmF0ZV9NYWNyb3MgICBQV1IgRXh0ZW5kZWQgUHJpdmF0ZSBNYWNyb3MKKyAqIEB7CisgKi8KKworI2RlZmluZSBJU19QV1JfV0FLRVVQX1BJTihQSU4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoUElOKSA9PSBQV1JfV0FLRVVQX1BJTjEpIHx8ICgoUElOKSA9PSBQV1JfV0FLRVVQX1BJTjIpIHx8ICAgICAgICAgICBcCisgICAoKFBJTikgPT0gUFdSX1dBS0VVUF9QSU4zKSB8fCAoKFBJTikgPT0gUFdSX1dBS0VVUF9QSU40KSB8fCAgICAgICAgICAgXAorICAgKChQSU4pID09IFBXUl9XQUtFVVBfUElONSkgfHwgKChQSU4pID09IFBXUl9XQUtFVVBfUElOMV9ISUdIKSB8fCAgICAgIFwKKyAgICgoUElOKSA9PSBQV1JfV0FLRVVQX1BJTjJfSElHSCkgfHwgKChQSU4pID09IFBXUl9XQUtFVVBfUElOM19ISUdIKSB8fCBcCisgICAoKFBJTikgPT0gUFdSX1dBS0VVUF9QSU40X0hJR0gpIHx8ICgoUElOKSA9PSBQV1JfV0FLRVVQX1BJTjVfSElHSCkgfHwgXAorICAgKChQSU4pID09IFBXUl9XQUtFVVBfUElOMV9MT1cpIHx8ICgoUElOKSA9PSBQV1JfV0FLRVVQX1BJTjJfTE9XKSB8fCAgIFwKKyAgICgoUElOKSA9PSBQV1JfV0FLRVVQX1BJTjNfTE9XKSB8fCAoKFBJTikgPT0gUFdSX1dBS0VVUF9QSU40X0xPVykgfHwgICBcCisgICAoKFBJTikgPT0gUFdSX1dBS0VVUF9QSU41X0xPVykpCisKKyNkZWZpbmUgSVNfUFdSX1BWTV9UWVBFKFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoVFlQRSkgPT0gUFdSX1BWTV8xKSB8fCAoKFRZUEUpID09IFBXUl9QVk1fMikgfHwgKChUWVBFKSA9PSBQV1JfUFZNXzMpIHx8IFwKKyAgICgoVFlQRSkgPT0gUFdSX1BWTV80KSkKKworI2RlZmluZSBJU19QV1JfUFZNX01PREUoTU9ERSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoTU9ERSkgPT0gUFdSX1BWTV9NT0RFX05PUk1BTCkgfHwgKChNT0RFKSA9PSBQV1JfUFZNX01PREVfSVRfUklTSU5HKSB8fCBcCisgICAoKE1PREUpID09IFBXUl9QVk1fTU9ERV9JVF9GQUxMSU5HKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKChNT0RFKSA9PSBQV1JfUFZNX01PREVfSVRfUklTSU5HX0ZBTExJTkcpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoTU9ERSkgPT0gUFdSX1BWTV9NT0RFX0VWRU5UX1JJU0lORykgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKE1PREUpID09IFBXUl9QVk1fTU9ERV9FVkVOVF9GQUxMSU5HKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKChNT0RFKSA9PSBQV1JfUFZNX01PREVfRVZFTlRfUklTSU5HX0ZBTExJTkcpKQorCisjaWYgZGVmaW5lZChQV1JfQ1I1X1IxTU9ERSkKKyNkZWZpbmUgSVNfUFdSX1ZPTFRBR0VfU0NBTElOR19SQU5HRShSQU5HRSkgICAgICAgICAgIFwKKyAgKCgoUkFOR0UpID09IFBXUl9SRUdVTEFUT1JfVk9MVEFHRV9TQ0FMRTFfQk9PU1QpIHx8IFwKKyAgICgoUkFOR0UpID09IFBXUl9SRUdVTEFUT1JfVk9MVEFHRV9TQ0FMRTEpIHx8ICAgICAgIFwKKyAgICgoUkFOR0UpID09IFBXUl9SRUdVTEFUT1JfVk9MVEFHRV9TQ0FMRTIpKQorI2Vsc2UKKyNkZWZpbmUgSVNfUFdSX1ZPTFRBR0VfU0NBTElOR19SQU5HRShSQU5HRSkgICAgIFwKKyAgKCgoUkFOR0UpID09IFBXUl9SRUdVTEFUT1JfVk9MVEFHRV9TQ0FMRTEpIHx8IFwKKyAgICgoUkFOR0UpID09IFBXUl9SRUdVTEFUT1JfVk9MVEFHRV9TQ0FMRTIpKQorI2VuZGlmCisKKyNkZWZpbmUgSVNfUFdSX0JBVFRFUllfUkVTSVNUT1JfU0VMRUNUKFJFU0lTVE9SKSAgICAgIFwKKyAgKCgoUkVTSVNUT1IpID09IFBXUl9CQVRURVJZX0NIQVJHSU5HX1JFU0lTVE9SXzUpIHx8IFwKKyAgICgoUkVTSVNUT1IpID09IFBXUl9CQVRURVJZX0NIQVJHSU5HX1JFU0lTVE9SXzFfNSkpCisKKyNkZWZpbmUgSVNfUFdSX0JBVFRFUllfQ0hBUkdJTkcoQ0hBUkdJTkcpICAgICAgICAgIFwKKyAgKCgoQ0hBUkdJTkcpID09IFBXUl9CQVRURVJZX0NIQVJHSU5HX0RJU0FCTEUpIHx8IFwKKyAgICgoQ0hBUkdJTkcpID09IFBXUl9CQVRURVJZX0NIQVJHSU5HX0VOQUJMRSkpCisKKyNkZWZpbmUgSVNfUFdSX0dQSU9fQklUX05VTUJFUihCSVRfTlVNQkVSKSBcCisgICgoKEJJVF9OVU1CRVIpICYgR1BJT19QSU5fTUFTSykgIT0gKHVpbnQzMl90KTB4MDBVKQorI2RlZmluZSBJU19QV1JfR1BJTyhHUElPKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoR1BJTykgPT0gUFdSX0dQSU9fQSkgfHwgKChHUElPKSA9PSBQV1JfR1BJT19CKSB8fCBcCisgICAoKEdQSU8pID09IFBXUl9HUElPX0MpIHx8ICgoR1BJTykgPT0gUFdSX0dQSU9fRCkgfHwgXAorICAgKChHUElPKSA9PSBQV1JfR1BJT19FKSB8fCAoKEdQSU8pID09IFBXUl9HUElPX0YpIHx8ICgoR1BJTykgPT0gUFdSX0dQSU9fRykpCisKKy8qKgorICogQH0KKyAqLworCisvKiogQGFkZHRvZ3JvdXAgUFdSRXhfRXhwb3J0ZWRfRnVuY3Rpb25zIFBXUiBFeHRlbmRlZCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAqIEB7CisgKi8KKworLyoqIEBhZGR0b2dyb3VwIFBXUkV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgRXh0ZW5kZWQgUGVyaXBoZXJhbCBDb250cm9sCisgKiBmdW5jdGlvbnMKKyAqIEB7CisgKi8KKworLyogUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IEhBTF9QV1JFeF9HZXRWb2x0YWdlUmFuZ2Uodm9pZCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUFdSRXhfQ29udHJvbFZvbHRhZ2VTY2FsaW5nKHVpbnQzMl90IFZvbHRhZ2VTY2FsaW5nKTsKK3ZvaWQgSEFMX1BXUkV4X0VuYWJsZUJhdHRlcnlDaGFyZ2luZyh1aW50MzJfdCBSZXNpc3RvclNlbGVjdGlvbik7Cit2b2lkIEhBTF9QV1JFeF9EaXNhYmxlQmF0dGVyeUNoYXJnaW5nKHZvaWQpOwordm9pZCBIQUxfUFdSRXhfRW5hYmxlSW50ZXJuYWxXYWtlVXBMaW5lKHZvaWQpOwordm9pZCBIQUxfUFdSRXhfRGlzYWJsZUludGVybmFsV2FrZVVwTGluZSh2b2lkKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QV1JFeF9FbmFibGVHUElPUHVsbFVwKHVpbnQzMl90IEdQSU8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBHUElPTnVtYmVyKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QV1JFeF9EaXNhYmxlR1BJT1B1bGxVcCh1aW50MzJfdCBHUElPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEdQSU9OdW1iZXIpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BXUkV4X0VuYWJsZUdQSU9QdWxsRG93bih1aW50MzJfdCBHUElPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBHUElPTnVtYmVyKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QV1JFeF9EaXNhYmxlR1BJT1B1bGxEb3duKHVpbnQzMl90IEdQSU8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBHUElPTnVtYmVyKTsKK3ZvaWQgSEFMX1BXUkV4X0VuYWJsZVB1bGxVcFB1bGxEb3duQ29uZmlnKHZvaWQpOwordm9pZCBIQUxfUFdSRXhfRGlzYWJsZVB1bGxVcFB1bGxEb3duQ29uZmlnKHZvaWQpOwordm9pZCBIQUxfUFdSRXhfRW5hYmxlU1JBTTJDb250ZW50UmV0ZW50aW9uKHZvaWQpOwordm9pZCBIQUxfUFdSRXhfRGlzYWJsZVNSQU0yQ29udGVudFJldGVudGlvbih2b2lkKTsKKyNpZiBkZWZpbmVkKFBXUl9DUjJfUFZNRTEpCit2b2lkIEhBTF9QV1JFeF9FbmFibGVQVk0xKHZvaWQpOwordm9pZCBIQUxfUFdSRXhfRGlzYWJsZVBWTTEodm9pZCk7CisjZW5kaWYgLyogUFdSX0NSMl9QVk1FMSAqLworI2lmIGRlZmluZWQoUFdSX0NSMl9QVk1FMikKK3ZvaWQgSEFMX1BXUkV4X0VuYWJsZVBWTTIodm9pZCk7Cit2b2lkIEhBTF9QV1JFeF9EaXNhYmxlUFZNMih2b2lkKTsKKyNlbmRpZiAvKiBQV1JfQ1IyX1BWTUUyICovCit2b2lkIEhBTF9QV1JFeF9FbmFibGVQVk0zKHZvaWQpOwordm9pZCBIQUxfUFdSRXhfRGlzYWJsZVBWTTModm9pZCk7Cit2b2lkIEhBTF9QV1JFeF9FbmFibGVQVk00KHZvaWQpOwordm9pZCBIQUxfUFdSRXhfRGlzYWJsZVBWTTQodm9pZCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUFdSRXhfQ29uZmlnUFZNKFBXUl9QVk1UeXBlRGVmICpzQ29uZmlnUFZNKTsKKworLyogTG93IFBvd2VyIG1vZGVzIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgSEFMX1BXUkV4X0VuYWJsZUxvd1Bvd2VyUnVuTW9kZSh2b2lkKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QV1JFeF9EaXNhYmxlTG93UG93ZXJSdW5Nb2RlKHZvaWQpOwordm9pZCBIQUxfUFdSRXhfRW50ZXJTVE9QME1vZGUodWludDhfdCBTVE9QRW50cnkpOwordm9pZCBIQUxfUFdSRXhfRW50ZXJTVE9QMU1vZGUodWludDhfdCBTVE9QRW50cnkpOwordm9pZCBIQUxfUFdSRXhfRW50ZXJTSFVURE9XTk1vZGUodm9pZCk7CisKK3ZvaWQgSEFMX1BXUkV4X1BWRF9QVk1fSVJRSGFuZGxlcih2b2lkKTsKKyNpZiBkZWZpbmVkKFBXUl9DUjJfUFZNRTEpCit2b2lkIEhBTF9QV1JFeF9QVk0xQ2FsbGJhY2sodm9pZCk7CisjZW5kaWYgLyogUFdSX0NSMl9QVk1FMSAqLworI2lmIGRlZmluZWQoUFdSX0NSMl9QVk1FMikKK3ZvaWQgSEFMX1BXUkV4X1BWTTJDYWxsYmFjayh2b2lkKTsKKyNlbmRpZiAvKiBQV1JfQ1IyX1BWTUUyICovCit2b2lkIEhBTF9QV1JFeF9QVk0zQ2FsbGJhY2sodm9pZCk7Cit2b2lkIEhBTF9QV1JFeF9QVk00Q2FsbGJhY2sodm9pZCk7CisKKyNpZiBkZWZpbmVkKFBXUl9DUjNfVUNQRF9TVERCWSkKK3ZvaWQgSEFMX1BXUkV4X0VuYWJsZVVDUERTdGFuZGJ5TW9kZSh2b2lkKTsKK3ZvaWQgSEFMX1BXUkV4X0Rpc2FibGVVQ1BEU3RhbmRieU1vZGUodm9pZCk7CisjZW5kaWYgLyogUFdSX0NSM19VQ1BEX1NUREJZICovCisjaWYgZGVmaW5lZChQV1JfQ1IzX1VDUERfREJESVMpCit2b2lkIEhBTF9QV1JFeF9FbmFibGVVQ1BERGVhZEJhdHRlcnkodm9pZCk7Cit2b2lkIEhBTF9QV1JFeF9EaXNhYmxlVUNQRERlYWRCYXR0ZXJ5KHZvaWQpOworI2VuZGlmIC8qIFBXUl9DUjNfVUNQRF9EQkRJUyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyRzR4eF9IQUxfUFdSX0VYX0ggKi8KZGlmZiAtLWdpdCBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9JbmMvc3RtMzJnNHh4X2hhbF9yY2MuaCBiL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9JbmMvc3RtMzJnNHh4X2hhbF9yY2MuaAppbmRleCBjZWI3OTQyLi45NWUxMTg1IDEwMDY0NAotLS0gYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9oYWxfcmNjLmgKKysrIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfaGFsX3JjYy5oCkBAIC0xLDQxNjIgKzEsNDE2MiBAQAotLyoqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEBmaWxlICAgIHN0bTMyZzR4eF9oYWxfcmNjLmgNCi0gKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQ0KLSAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFJDQyBIQUwgbW9kdWxlLg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBAYXR0ZW50aW9uDQotICoNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQotICoNCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRlcm1zIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUNCi0gKmluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4gSWYgbm8gTElDRU5TRSBmaWxlIGNvbWVzDQotICp3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKi8NCi0NCi0vKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpZm5kZWYgU1RNMzJHNHh4X0hBTF9SQ0NfSA0KLSNkZWZpbmUgU1RNMzJHNHh4X0hBTF9SQ0NfSA0KLQ0KLSNpZmRlZiBfX2NwbHVzcGx1cw0KLWV4dGVybiAiQyIgew0KLSNlbmRpZg0KLQ0KLS8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotI2luY2x1ZGUgInN0bTMyZzR4eF9oYWxfZGVmLmgiDQotDQotLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzR4eF9IQUxfRHJpdmVyDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGFkZHRvZ3JvdXAgUkNDDQotICogQHsNCi0gKi8NCi0NCi0vKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgUkNDX0V4cG9ydGVkX1R5cGVzIFJDQyBFeHBvcnRlZCBUeXBlcw0KLSAqIEB7DQotICovDQotDQotLyoqDQotICogQGJyaWVmICBSQ0MgUExMIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlIGRlZmluaXRpb24NCi0gKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICB1aW50MzJfdA0KLSAgICAgIFBMTFN0YXRlOyAvKiE8IFRoZSBuZXcgc3RhdGUgb2YgdGhlIFBMTC4NCi0gICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ19QTExfQ29uZmlnICovDQotDQotICB1aW50MzJfdCBQTExTb3VyY2U7IC8qITwgUkNDX1BMTFNvdXJjZTogUExMIGVudHJ5IGNsb2NrIHNvdXJjZS4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NfUExMX0Nsb2NrX1NvdXJjZSAgICAgICAgICAgICAgICovDQotDQotICB1aW50MzJfdCBQTExNOyAvKiE8IFBMTE06IERpdmlzaW9uIGZhY3RvciBmb3IgUExMIFZDTyBpbnB1dCBjbG9jay4NCi0gICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgIFJDQ19QTExNX0Nsb2NrX0RpdmlkZXIgICAgICAgICAgICAgKi8NCi0NCi0gIHVpbnQzMl90IFBMTE47IC8qITwgUExMTjogTXVsdGlwbGljYXRpb24gZmFjdG9yIGZvciBQTEwgVkNPIG91dHB1dCBjbG9jay4NCi0gICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gOCBhbmQNCi0gICAgICAgICAgICAgICAgICAgIE1heF9EYXRhID0gMTI3ICAgICovDQotDQotICB1aW50MzJfdCBQTExQOyAvKiE8IFBMTFA6IERpdmlzaW9uIGZhY3RvciBmb3IgQURDIGNsb2NrLg0KLSAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgUkNDX1BMTFBfQ2xvY2tfRGl2aWRlciAgICAgICAgICAgICAqLw0KLQ0KLSAgdWludDMyX3QgUExMUTsgLyohPCBQTExROiBEaXZpc2lvbiBmYWN0b3IgZm9yIFNBSSwgSTJTLCBVU0IsIEZEQ0FOIGFuZCBRVUFEU1BJDQotICAgICAgICAgICAgICAgICAgICBjbG9ja3MuIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBvZiBAcmVmDQotICAgICAgICAgICAgICAgICAgICBSQ0NfUExMUV9DbG9ja19EaXZpZGVyICAgICAgICAgICAgICovDQotDQotICB1aW50MzJfdCBQTExSOyAvKiE8IFBMTFI6IERpdmlzaW9uIGZvciB0aGUgbWFpbiBzeXN0ZW0gY2xvY2suDQotICAgICAgICAgICAgICAgICAgICAgIFVzZXIgaGF2ZSB0byBzZXQgdGhlIFBMTFIgcGFyYW1ldGVyIGNvcnJlY3RseSB0byBub3QNCi0gICAgICAgICAgICAgICAgICAgIGV4Y2VlZCBtYXggZnJlcXVlbmN5IDE3ME1IWi4gVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlDQotICAgICAgICAgICAgICAgICAgICBvZiBAcmVmIFJDQ19QTExSX0Nsb2NrX0RpdmlkZXIgICAgICAgICAgICAgKi8NCi0NCi19IFJDQ19QTExJbml0VHlwZURlZjsNCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJDQyBJbnRlcm5hbC9FeHRlcm5hbCBPc2NpbGxhdG9yIChIU0UsIEhTSSwgTFNFIGFuZCBMU0kpDQotICogY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbg0KLSAqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gIHVpbnQzMl90IE9zY2lsbGF0b3JUeXBlOyAvKiE8IFRoZSBvc2NpbGxhdG9ycyB0byBiZSBjb25maWd1cmVkLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19Pc2NpbGxhdG9yX1R5cGUgICAgICAgICAgICAgICAgICAgKi8NCi0NCi0gIHVpbnQzMl90DQotICAgICAgSFNFU3RhdGU7IC8qITwgVGhlIG5ldyBzdGF0ZSBvZiB0aGUgSFNFLg0KLSAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX0hTRV9Db25maWcgKi8NCi0NCi0gIHVpbnQzMl90DQotICAgICAgTFNFU3RhdGU7IC8qITwgVGhlIG5ldyBzdGF0ZSBvZiB0aGUgTFNFLg0KLSAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX0xTRV9Db25maWcgKi8NCi0NCi0gIHVpbnQzMl90DQotICAgICAgSFNJU3RhdGU7IC8qITwgVGhlIG5ldyBzdGF0ZSBvZiB0aGUgSFNJLg0KLSAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX0hTSV9Db25maWcgKi8NCi0NCi0gIHVpbnQzMl90IEhTSUNhbGlicmF0aW9uVmFsdWU7IC8qITwgVGhlIGNhbGlicmF0aW9uIHRyaW1taW5nIHZhbHVlIChkZWZhdWx0IGlzDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NfSFNJQ0FMSUJSQVRJT05fREVGQVVMVCkuIFRoaXMgcGFyYW1ldGVyDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAwIGFuZA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4X0RhdGEgPSAweEZGICovDQotDQotICB1aW50MzJfdA0KLSAgICAgIExTSVN0YXRlOyAvKiE8IFRoZSBuZXcgc3RhdGUgb2YgdGhlIExTSS4NCi0gICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ19MU0lfQ29uZmlnICovDQotDQotICB1aW50MzJfdA0KLSAgICAgIEhTSTQ4U3RhdGU7IC8qITwgVGhlIG5ldyBzdGF0ZSBvZiB0aGUgSFNJNDguDQotICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ19IU0k0OF9Db25maWcgKi8NCi0NCi0gIFJDQ19QTExJbml0VHlwZURlZiBQTEw7IC8qITwgTWFpbiBQTEwgc3RydWN0dXJlIHBhcmFtZXRlcnMgKi8NCi0NCi19IFJDQ19Pc2NJbml0VHlwZURlZjsNCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJDQyBTeXN0ZW0sIEFIQiBhbmQgQVBCIGJ1c3NlcyBjbG9jayBjb25maWd1cmF0aW9uIHN0cnVjdHVyZQ0KLSAqIGRlZmluaXRpb24NCi0gKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICB1aW50MzJfdCBDbG9ja1R5cGU7IC8qITwgVGhlIGNsb2NrIHRvIGJlIGNvbmZpZ3VyZWQuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NfU3lzdGVtX0Nsb2NrX1R5cGUgICAgICAqLw0KLQ0KLSAgdWludDMyX3QgU1lTQ0xLU291cmNlOyAvKiE8IFRoZSBjbG9jayBzb3VyY2UgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgKFNZU0NMSykuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NfU3lzdGVtX0Nsb2NrX1NvdXJjZSAgICAqLw0KLQ0KLSAgdWludDMyX3QNCi0gICAgICBBSEJDTEtEaXZpZGVyOyAvKiE8IFRoZSBBSEIgY2xvY2sgKEhDTEspIGRpdmlkZXIuIFRoaXMgY2xvY2sgaXMgZGVyaXZlZA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gdGhlIHN5c3RlbSBjbG9jayAoU1lTQ0xLKS4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGENCi0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBvZiBAcmVmIFJDQ19BSEJfQ2xvY2tfU291cmNlICAgICAgICovDQotDQotICB1aW50MzJfdA0KLSAgICAgIEFQQjFDTEtEaXZpZGVyOyAvKiE8IFRoZSBBUEIxIGNsb2NrIChQQ0xLMSkgZGl2aWRlci4gVGhpcyBjbG9jayBpcyBkZXJpdmVkDQotICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gdGhlIEFIQiBjbG9jayAoSENMSykuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhDQotICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIG9mIEByZWYgUkNDX0FQQjFfQVBCMl9DbG9ja19Tb3VyY2UgKi8NCi0NCi0gIHVpbnQzMl90DQotICAgICAgQVBCMkNMS0RpdmlkZXI7IC8qITwgVGhlIEFQQjIgY2xvY2sgKFBDTEsyKSBkaXZpZGVyLiBUaGlzIGNsb2NrIGlzIGRlcml2ZWQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgQUhCIGNsb2NrIChIQ0xLKS4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGENCi0gICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgb2YgQHJlZiBSQ0NfQVBCMV9BUEIyX0Nsb2NrX1NvdXJjZSAqLw0KLQ0KLX0gUkNDX0Nsa0luaXRUeXBlRGVmOw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGRlZmdyb3VwIFJDQ19FeHBvcnRlZF9Db25zdGFudHMgUkNDIEV4cG9ydGVkIENvbnN0YW50cw0KLSAqIEB7DQotICovDQotDQotLyoqIEBkZWZncm91cCBSQ0NfVGltZW91dF9WYWx1ZSBUaW1lb3V0IFZhbHVlcw0KLSAqIEB7DQotICovDQotI2RlZmluZSBSQ0NfREJQX1RJTUVPVVRfVkFMVUUgMlUgLyogMiBtcyAobWluaW11bSBUaWNrICsgMSkgKi8NCi0jZGVmaW5lIFJDQ19MU0VfVElNRU9VVF9WQUxVRSBMU0VfU1RBUlRVUF9USU1FT1VUDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFJDQ19Pc2NpbGxhdG9yX1R5cGUgT3NjaWxsYXRvciBUeXBlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFJDQ19PU0NJTExBVE9SVFlQRV9OT05FIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgT3NjaWxsYXRvciBjb25maWd1cmF0aW9uIHVuY2hhbmdlZCAqLw0KLSNkZWZpbmUgUkNDX09TQ0lMTEFUT1JUWVBFX0hTRSAweDAwMDAwMDAxVSAgIC8qITwgSFNFIHRvIGNvbmZpZ3VyZSAqLw0KLSNkZWZpbmUgUkNDX09TQ0lMTEFUT1JUWVBFX0hTSSAweDAwMDAwMDAyVSAgIC8qITwgSFNJIHRvIGNvbmZpZ3VyZSAqLw0KLSNkZWZpbmUgUkNDX09TQ0lMTEFUT1JUWVBFX0xTRSAweDAwMDAwMDA0VSAgIC8qITwgTFNFIHRvIGNvbmZpZ3VyZSAqLw0KLSNkZWZpbmUgUkNDX09TQ0lMTEFUT1JUWVBFX0xTSSAweDAwMDAwMDA4VSAgIC8qITwgTFNJIHRvIGNvbmZpZ3VyZSAqLw0KLSNkZWZpbmUgUkNDX09TQ0lMTEFUT1JUWVBFX0hTSTQ4IDB4MDAwMDAwMjBVIC8qITwgSFNJNDggdG8gY29uZmlndXJlICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFJDQ19IU0VfQ29uZmlnIEhTRSBDb25maWcNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgUkNDX0hTRV9PRkYgMHgwMDAwMDAwMFUgLyohPCBIU0UgY2xvY2sgZGVhY3RpdmF0aW9uICovDQotI2RlZmluZSBSQ0NfSFNFX09OIFJDQ19DUl9IU0VPTiAvKiE8IEhTRSBjbG9jayBhY3RpdmF0aW9uICovDQotI2RlZmluZSBSQ0NfSFNFX0JZUEFTUyBcDQotICAoUkNDX0NSX0hTRUJZUCB8IFJDQ19DUl9IU0VPTikgLyohPCBFeHRlcm5hbCBjbG9jayBzb3VyY2UgZm9yIEhTRSBjbG9jayAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBSQ0NfTFNFX0NvbmZpZyBMU0UgQ29uZmlnDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFJDQ19MU0VfT0ZGIDB4MDAwMDAwMDBVICAgLyohPCBMU0UgY2xvY2sgZGVhY3RpdmF0aW9uICovDQotI2RlZmluZSBSQ0NfTFNFX09OIFJDQ19CRENSX0xTRU9OIC8qITwgTFNFIGNsb2NrIGFjdGl2YXRpb24gKi8NCi0jZGVmaW5lIFJDQ19MU0VfQllQQVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoUkNDX0JEQ1JfTFNFQllQIHwgUkNDX0JEQ1JfTFNFT04pIC8qITwgRXh0ZXJuYWwgY2xvY2sgc291cmNlIGZvciBMU0UgY2xvY2sgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDX0hTSV9Db25maWcgSFNJIENvbmZpZw0KLSAqIEB7DQotICovDQotI2RlZmluZSBSQ0NfSFNJX09GRiAweDAwMDAwMDAwVSAvKiE8IEhTSSBjbG9jayBkZWFjdGl2YXRpb24gKi8NCi0jZGVmaW5lIFJDQ19IU0lfT04gUkNDX0NSX0hTSU9OIC8qITwgSFNJIGNsb2NrIGFjdGl2YXRpb24gKi8NCi0jZGVmaW5lIFJDQ19IU0lDQUxJQlJBVElPTl9ERUZBVUxUIFwNCi0gIDB4NDBVIC8qIERlZmF1bHQgSFNJIGNhbGlicmF0aW9uIHRyaW1taW5nIHZhbHVlICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFJDQ19MU0lfQ29uZmlnIExTSSBDb25maWcNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgUkNDX0xTSV9PRkYgMHgwMDAwMDAwMFUgIC8qITwgTFNJIGNsb2NrIGRlYWN0aXZhdGlvbiAqLw0KLSNkZWZpbmUgUkNDX0xTSV9PTiBSQ0NfQ1NSX0xTSU9OIC8qITwgTFNJIGNsb2NrIGFjdGl2YXRpb24gKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDX0hTSTQ4X0NvbmZpZyBIU0k0OCBDb25maWcNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgUkNDX0hTSTQ4X09GRiAweDAwMDAwMDAwVSAgICAgIC8qITwgSFNJNDggY2xvY2sgZGVhY3RpdmF0aW9uICovDQotI2RlZmluZSBSQ0NfSFNJNDhfT04gUkNDX0NSUkNSX0hTSTQ4T04gLyohPCBIU0k0OCBjbG9jayBhY3RpdmF0aW9uICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFJDQ19QTExfQ29uZmlnIFBMTCBDb25maWcNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgUkNDX1BMTF9OT05FIDB4MDAwMDAwMDBVIC8qITwgUExMIGNvbmZpZ3VyYXRpb24gdW5jaGFuZ2VkICovDQotI2RlZmluZSBSQ0NfUExMX09GRiAweDAwMDAwMDAxVSAgLyohPCBQTEwgZGVhY3RpdmF0aW9uICovDQotI2RlZmluZSBSQ0NfUExMX09OIDB4MDAwMDAwMDJVICAgLyohPCBQTEwgYWN0aXZhdGlvbiAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBSQ0NfUExMTV9DbG9ja19EaXZpZGVyIFBMTE0gQ2xvY2sgRGl2aWRlcg0KLSAqIEB7DQotICovDQotI2RlZmluZSBSQ0NfUExMTV9ESVYxIDB4MDAwMDAwMDFVICAvKiE8IFBMTE0gZGl2aXNpb24gZmFjdG9yID0gMSAgKi8NCi0jZGVmaW5lIFJDQ19QTExNX0RJVjIgMHgwMDAwMDAwMlUgIC8qITwgUExMTSBkaXZpc2lvbiBmYWN0b3IgPSAyICAqLw0KLSNkZWZpbmUgUkNDX1BMTE1fRElWMyAweDAwMDAwMDAzVSAgLyohPCBQTExNIGRpdmlzaW9uIGZhY3RvciA9IDMgICovDQotI2RlZmluZSBSQ0NfUExMTV9ESVY0IDB4MDAwMDAwMDRVICAvKiE8IFBMTE0gZGl2aXNpb24gZmFjdG9yID0gNCAgKi8NCi0jZGVmaW5lIFJDQ19QTExNX0RJVjUgMHgwMDAwMDAwNVUgIC8qITwgUExMTSBkaXZpc2lvbiBmYWN0b3IgPSA1ICAqLw0KLSNkZWZpbmUgUkNDX1BMTE1fRElWNiAweDAwMDAwMDA2VSAgLyohPCBQTExNIGRpdmlzaW9uIGZhY3RvciA9IDYgICovDQotI2RlZmluZSBSQ0NfUExMTV9ESVY3IDB4MDAwMDAwMDdVICAvKiE8IFBMTE0gZGl2aXNpb24gZmFjdG9yID0gNyAgKi8NCi0jZGVmaW5lIFJDQ19QTExNX0RJVjggMHgwMDAwMDAwOFUgIC8qITwgUExMTSBkaXZpc2lvbiBmYWN0b3IgPSA4ICAqLw0KLSNkZWZpbmUgUkNDX1BMTE1fRElWOSAweDAwMDAwMDA5VSAgLyohPCBQTExNIGRpdmlzaW9uIGZhY3RvciA9IDkgICovDQotI2RlZmluZSBSQ0NfUExMTV9ESVYxMCAweDAwMDAwMDBBVSAvKiE8IFBMTE0gZGl2aXNpb24gZmFjdG9yID0gMTAgKi8NCi0jZGVmaW5lIFJDQ19QTExNX0RJVjExIDB4MDAwMDAwMEJVIC8qITwgUExMTSBkaXZpc2lvbiBmYWN0b3IgPSAxMSAqLw0KLSNkZWZpbmUgUkNDX1BMTE1fRElWMTIgMHgwMDAwMDAwQ1UgLyohPCBQTExNIGRpdmlzaW9uIGZhY3RvciA9IDEyICovDQotI2RlZmluZSBSQ0NfUExMTV9ESVYxMyAweDAwMDAwMDBEVSAvKiE8IFBMTE0gZGl2aXNpb24gZmFjdG9yID0gMTMgKi8NCi0jZGVmaW5lIFJDQ19QTExNX0RJVjE0IDB4MDAwMDAwMEVVIC8qITwgUExMTSBkaXZpc2lvbiBmYWN0b3IgPSAxNCAqLw0KLSNkZWZpbmUgUkNDX1BMTE1fRElWMTUgMHgwMDAwMDAwRlUgLyohPCBQTExNIGRpdmlzaW9uIGZhY3RvciA9IDE1ICovDQotI2RlZmluZSBSQ0NfUExMTV9ESVYxNiAweDAwMDAwMDEwVSAvKiE8IFBMTE0gZGl2aXNpb24gZmFjdG9yID0gMTYgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDX1BMTFBfQ2xvY2tfRGl2aWRlciBQTExQIENsb2NrIERpdmlkZXINCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgUkNDX1BMTFBfRElWMiAweDAwMDAwMDAyVSAgLyohPCBQTExQIGRpdmlzaW9uIGZhY3RvciA9IDIgICovDQotI2RlZmluZSBSQ0NfUExMUF9ESVYzIDB4MDAwMDAwMDNVICAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gMyAgKi8NCi0jZGVmaW5lIFJDQ19QTExQX0RJVjQgMHgwMDAwMDAwNFUgIC8qITwgUExMUCBkaXZpc2lvbiBmYWN0b3IgPSA0ICAqLw0KLSNkZWZpbmUgUkNDX1BMTFBfRElWNSAweDAwMDAwMDA1VSAgLyohPCBQTExQIGRpdmlzaW9uIGZhY3RvciA9IDUgICovDQotI2RlZmluZSBSQ0NfUExMUF9ESVY2IDB4MDAwMDAwMDZVICAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gNiAgKi8NCi0jZGVmaW5lIFJDQ19QTExQX0RJVjcgMHgwMDAwMDAwN1UgIC8qITwgUExMUCBkaXZpc2lvbiBmYWN0b3IgPSA3ICAqLw0KLSNkZWZpbmUgUkNDX1BMTFBfRElWOCAweDAwMDAwMDA4VSAgLyohPCBQTExQIGRpdmlzaW9uIGZhY3RvciA9IDggICovDQotI2RlZmluZSBSQ0NfUExMUF9ESVY5IDB4MDAwMDAwMDlVICAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gOSAgKi8NCi0jZGVmaW5lIFJDQ19QTExQX0RJVjEwIDB4MDAwMDAwMEFVIC8qITwgUExMUCBkaXZpc2lvbiBmYWN0b3IgPSAxMCAqLw0KLSNkZWZpbmUgUkNDX1BMTFBfRElWMTEgMHgwMDAwMDAwQlUgLyohPCBQTExQIGRpdmlzaW9uIGZhY3RvciA9IDExICovDQotI2RlZmluZSBSQ0NfUExMUF9ESVYxMiAweDAwMDAwMDBDVSAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gMTIgKi8NCi0jZGVmaW5lIFJDQ19QTExQX0RJVjEzIDB4MDAwMDAwMERVIC8qITwgUExMUCBkaXZpc2lvbiBmYWN0b3IgPSAxMyAqLw0KLSNkZWZpbmUgUkNDX1BMTFBfRElWMTQgMHgwMDAwMDAwRVUgLyohPCBQTExQIGRpdmlzaW9uIGZhY3RvciA9IDE0ICovDQotI2RlZmluZSBSQ0NfUExMUF9ESVYxNSAweDAwMDAwMDBGVSAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gMTUgKi8NCi0jZGVmaW5lIFJDQ19QTExQX0RJVjE2IDB4MDAwMDAwMTBVIC8qITwgUExMUCBkaXZpc2lvbiBmYWN0b3IgPSAxNiAqLw0KLSNkZWZpbmUgUkNDX1BMTFBfRElWMTcgMHgwMDAwMDAxMVUgLyohPCBQTExQIGRpdmlzaW9uIGZhY3RvciA9IDE3ICovDQotI2RlZmluZSBSQ0NfUExMUF9ESVYxOCAweDAwMDAwMDEyVSAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gMTggKi8NCi0jZGVmaW5lIFJDQ19QTExQX0RJVjE5IDB4MDAwMDAwMTNVIC8qITwgUExMUCBkaXZpc2lvbiBmYWN0b3IgPSAxOSAqLw0KLSNkZWZpbmUgUkNDX1BMTFBfRElWMjAgMHgwMDAwMDAxNFUgLyohPCBQTExQIGRpdmlzaW9uIGZhY3RvciA9IDIwICovDQotI2RlZmluZSBSQ0NfUExMUF9ESVYyMSAweDAwMDAwMDE1VSAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gMjEgKi8NCi0jZGVmaW5lIFJDQ19QTExQX0RJVjIyIDB4MDAwMDAwMTZVIC8qITwgUExMUCBkaXZpc2lvbiBmYWN0b3IgPSAyMiAqLw0KLSNkZWZpbmUgUkNDX1BMTFBfRElWMjMgMHgwMDAwMDAxN1UgLyohPCBQTExQIGRpdmlzaW9uIGZhY3RvciA9IDIzICovDQotI2RlZmluZSBSQ0NfUExMUF9ESVYyNCAweDAwMDAwMDE4VSAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gMjQgKi8NCi0jZGVmaW5lIFJDQ19QTExQX0RJVjI1IDB4MDAwMDAwMTlVIC8qITwgUExMUCBkaXZpc2lvbiBmYWN0b3IgPSAyNSAqLw0KLSNkZWZpbmUgUkNDX1BMTFBfRElWMjYgMHgwMDAwMDAxQVUgLyohPCBQTExQIGRpdmlzaW9uIGZhY3RvciA9IDI2ICovDQotI2RlZmluZSBSQ0NfUExMUF9ESVYyNyAweDAwMDAwMDFCVSAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gMjcgKi8NCi0jZGVmaW5lIFJDQ19QTExQX0RJVjI4IDB4MDAwMDAwMUNVIC8qITwgUExMUCBkaXZpc2lvbiBmYWN0b3IgPSAyOCAqLw0KLSNkZWZpbmUgUkNDX1BMTFBfRElWMjkgMHgwMDAwMDAxRFUgLyohPCBQTExQIGRpdmlzaW9uIGZhY3RvciA9IDI5ICovDQotI2RlZmluZSBSQ0NfUExMUF9ESVYzMCAweDAwMDAwMDFFVSAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gMzAgKi8NCi0jZGVmaW5lIFJDQ19QTExQX0RJVjMxIDB4MDAwMDAwMUZVIC8qITwgUExMUCBkaXZpc2lvbiBmYWN0b3IgPSAzMSAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBSQ0NfUExMUV9DbG9ja19EaXZpZGVyIFBMTFEgQ2xvY2sgRGl2aWRlcg0KLSAqIEB7DQotICovDQotI2RlZmluZSBSQ0NfUExMUV9ESVYyIDB4MDAwMDAwMDJVIC8qITwgUExMUSBkaXZpc2lvbiBmYWN0b3IgPSAyICovDQotI2RlZmluZSBSQ0NfUExMUV9ESVY0IDB4MDAwMDAwMDRVIC8qITwgUExMUSBkaXZpc2lvbiBmYWN0b3IgPSA0ICovDQotI2RlZmluZSBSQ0NfUExMUV9ESVY2IDB4MDAwMDAwMDZVIC8qITwgUExMUSBkaXZpc2lvbiBmYWN0b3IgPSA2ICovDQotI2RlZmluZSBSQ0NfUExMUV9ESVY4IDB4MDAwMDAwMDhVIC8qITwgUExMUSBkaXZpc2lvbiBmYWN0b3IgPSA4ICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFJDQ19QTExSX0Nsb2NrX0RpdmlkZXIgUExMUiBDbG9jayBEaXZpZGVyDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFJDQ19QTExSX0RJVjIgMHgwMDAwMDAwMlUgLyohPCBQTExSIGRpdmlzaW9uIGZhY3RvciA9IDIgKi8NCi0jZGVmaW5lIFJDQ19QTExSX0RJVjQgMHgwMDAwMDAwNFUgLyohPCBQTExSIGRpdmlzaW9uIGZhY3RvciA9IDQgKi8NCi0jZGVmaW5lIFJDQ19QTExSX0RJVjYgMHgwMDAwMDAwNlUgLyohPCBQTExSIGRpdmlzaW9uIGZhY3RvciA9IDYgKi8NCi0jZGVmaW5lIFJDQ19QTExSX0RJVjggMHgwMDAwMDAwOFUgLyohPCBQTExSIGRpdmlzaW9uIGZhY3RvciA9IDggKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDX1BMTF9DbG9ja19Tb3VyY2UgUExMIENsb2NrIFNvdXJjZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBSQ0NfUExMU09VUkNFX05PTkUgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBObyBjbG9jayBzZWxlY3RlZCBhcyBQTEwgZW50cnkgY2xvY2sgc291cmNlICAqLw0KLSNkZWZpbmUgUkNDX1BMTFNPVVJDRV9IU0kgXA0KLSAgUkNDX1BMTENGR1JfUExMU1JDX0hTSSAvKiE8IEhTSSBjbG9jayBzZWxlY3RlZCBhcyBQTEwgZW50cnkgY2xvY2sgc291cmNlICovDQotI2RlZmluZSBSQ0NfUExMU09VUkNFX0hTRSBcDQotICBSQ0NfUExMQ0ZHUl9QTExTUkNfSFNFIC8qITwgSFNFIGNsb2NrIHNlbGVjdGVkIGFzIFBMTCBlbnRyeSBjbG9jayBzb3VyY2UgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDX1BMTF9DbG9ja19PdXRwdXQgUExMIENsb2NrIE91dHB1dA0KLSAqIEB7DQotICovDQotI2RlZmluZSBSQ0NfUExMX0FEQ0NMSyBcDQotICBSQ0NfUExMQ0ZHUl9QTExQRU4gLyohPCBQTExBRENDTEsgc2VsZWN0aW9uIGZyb20gbWFpbiBQTEwgKi8NCi0jZGVmaW5lIFJDQ19QTExfNDhNMUNMSyBcDQotICBSQ0NfUExMQ0ZHUl9QTExRRU4gLyohPCBQTEw0OE0xQ0xLIHNlbGVjdGlvbiBmcm9tIG1haW4gUExMICovDQotI2RlZmluZSBSQ0NfUExMX1NZU0NMSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgUkNDX1BMTENGR1JfUExMUkVOIC8qITwgUExMQ0xLIHNlbGVjdGlvbiBmcm9tIG1haW4gUExMIFwNCi0gICAgICAgICAgICAgICAgICAgICAgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDX1N5c3RlbV9DbG9ja19UeXBlIFN5c3RlbSBDbG9jayBUeXBlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFJDQ19DTE9DS1RZUEVfU1lTQ0xLIDB4MDAwMDAwMDFVIC8qITwgU1lTQ0xLIHRvIGNvbmZpZ3VyZSAqLw0KLSNkZWZpbmUgUkNDX0NMT0NLVFlQRV9IQ0xLIDB4MDAwMDAwMDJVICAgLyohPCBIQ0xLIHRvIGNvbmZpZ3VyZSAqLw0KLSNkZWZpbmUgUkNDX0NMT0NLVFlQRV9QQ0xLMSAweDAwMDAwMDA0VSAgLyohPCBQQ0xLMSB0byBjb25maWd1cmUgKi8NCi0jZGVmaW5lIFJDQ19DTE9DS1RZUEVfUENMSzIgMHgwMDAwMDAwOFUgIC8qITwgUENMSzIgdG8gY29uZmlndXJlICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFJDQ19TeXN0ZW1fQ2xvY2tfU291cmNlIFN5c3RlbSBDbG9jayBTb3VyY2UNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgUkNDX1NZU0NMS1NPVVJDRV9IU0kgXA0KLSAgUkNDX0NGR1JfU1dfSFNJIC8qITwgSFNJIHNlbGVjdGlvbiBhcyBzeXN0ZW0gY2xvY2sgKi8NCi0jZGVmaW5lIFJDQ19TWVNDTEtTT1VSQ0VfSFNFIFwNCi0gIFJDQ19DRkdSX1NXX0hTRSAvKiE8IEhTRSBzZWxlY3Rpb24gYXMgc3lzdGVtIGNsb2NrICovDQotI2RlZmluZSBSQ0NfU1lTQ0xLU09VUkNFX1BMTENMSyBcDQotICBSQ0NfQ0ZHUl9TV19QTEwgLyohPCBQTEwgc2VsZWN0aW9uIGFzIHN5c3RlbSBjbG9jayAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBSQ0NfU3lzdGVtX0Nsb2NrX1NvdXJjZV9TdGF0dXMgU3lzdGVtIENsb2NrIFNvdXJjZSBTdGF0dXMNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgUkNDX1NZU0NMS1NPVVJDRV9TVEFUVVNfSFNJIFwNCi0gIFJDQ19DRkdSX1NXU19IU0kgLyohPCBIU0kgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgKi8NCi0jZGVmaW5lIFJDQ19TWVNDTEtTT1VSQ0VfU1RBVFVTX0hTRSBcDQotICBSQ0NfQ0ZHUl9TV1NfSFNFIC8qITwgSFNFIHVzZWQgYXMgc3lzdGVtIGNsb2NrICovDQotI2RlZmluZSBSQ0NfU1lTQ0xLU09VUkNFX1NUQVRVU19QTExDTEsgXA0KLSAgUkNDX0NGR1JfU1dTX1BMTCAvKiE8IFBMTCB1c2VkIGFzIHN5c3RlbSBjbG9jayAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBSQ0NfQUhCX0Nsb2NrX1NvdXJjZSBBSEIgQ2xvY2sgU291cmNlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFJDQ19TWVNDTEtfRElWMSBSQ0NfQ0ZHUl9IUFJFX0RJVjEgICAgIC8qITwgU1lTQ0xLIG5vdCBkaXZpZGVkICovDQotI2RlZmluZSBSQ0NfU1lTQ0xLX0RJVjIgUkNDX0NGR1JfSFBSRV9ESVYyICAgICAvKiE8IFNZU0NMSyBkaXZpZGVkIGJ5IDIgKi8NCi0jZGVmaW5lIFJDQ19TWVNDTEtfRElWNCBSQ0NfQ0ZHUl9IUFJFX0RJVjQgICAgIC8qITwgU1lTQ0xLIGRpdmlkZWQgYnkgNCAqLw0KLSNkZWZpbmUgUkNDX1NZU0NMS19ESVY4IFJDQ19DRkdSX0hQUkVfRElWOCAgICAgLyohPCBTWVNDTEsgZGl2aWRlZCBieSA4ICovDQotI2RlZmluZSBSQ0NfU1lTQ0xLX0RJVjE2IFJDQ19DRkdSX0hQUkVfRElWMTYgICAvKiE8IFNZU0NMSyBkaXZpZGVkIGJ5IDE2ICovDQotI2RlZmluZSBSQ0NfU1lTQ0xLX0RJVjY0IFJDQ19DRkdSX0hQUkVfRElWNjQgICAvKiE8IFNZU0NMSyBkaXZpZGVkIGJ5IDY0ICovDQotI2RlZmluZSBSQ0NfU1lTQ0xLX0RJVjEyOCBSQ0NfQ0ZHUl9IUFJFX0RJVjEyOCAvKiE8IFNZU0NMSyBkaXZpZGVkIGJ5IDEyOCAqLw0KLSNkZWZpbmUgUkNDX1NZU0NMS19ESVYyNTYgUkNDX0NGR1JfSFBSRV9ESVYyNTYgLyohPCBTWVNDTEsgZGl2aWRlZCBieSAyNTYgKi8NCi0jZGVmaW5lIFJDQ19TWVNDTEtfRElWNTEyIFJDQ19DRkdSX0hQUkVfRElWNTEyIC8qITwgU1lTQ0xLIGRpdmlkZWQgYnkgNTEyICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFJDQ19BUEIxX0FQQjJfQ2xvY2tfU291cmNlIEFQQjEgQVBCMiBDbG9jayBTb3VyY2UNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgUkNDX0hDTEtfRElWMSBSQ0NfQ0ZHUl9QUFJFMV9ESVYxICAgLyohPCBIQ0xLIG5vdCBkaXZpZGVkICovDQotI2RlZmluZSBSQ0NfSENMS19ESVYyIFJDQ19DRkdSX1BQUkUxX0RJVjIgICAvKiE8IEhDTEsgZGl2aWRlZCBieSAyICovDQotI2RlZmluZSBSQ0NfSENMS19ESVY0IFJDQ19DRkdSX1BQUkUxX0RJVjQgICAvKiE8IEhDTEsgZGl2aWRlZCBieSA0ICovDQotI2RlZmluZSBSQ0NfSENMS19ESVY4IFJDQ19DRkdSX1BQUkUxX0RJVjggICAvKiE8IEhDTEsgZGl2aWRlZCBieSA4ICovDQotI2RlZmluZSBSQ0NfSENMS19ESVYxNiBSQ0NfQ0ZHUl9QUFJFMV9ESVYxNiAvKiE8IEhDTEsgZGl2aWRlZCBieSAxNiAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBSQ0NfUlRDX0Nsb2NrX1NvdXJjZSBSVEMgQ2xvY2sgU291cmNlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFJDQ19SVENDTEtTT1VSQ0VfTk9ORSAweDAwMDAwMDAwVSAvKiE8IE5vIGNsb2NrIHVzZWQgYXMgUlRDIGNsb2NrICovDQotI2RlZmluZSBSQ0NfUlRDQ0xLU09VUkNFX0xTRSBcDQotICBSQ0NfQkRDUl9SVENTRUxfMCAvKiE8IExTRSBvc2NpbGxhdG9yIGNsb2NrIHVzZWQgYXMgUlRDIGNsb2NrICovDQotI2RlZmluZSBSQ0NfUlRDQ0xLU09VUkNFX0xTSSBcDQotICBSQ0NfQkRDUl9SVENTRUxfMSAvKiE8IExTSSBvc2NpbGxhdG9yIGNsb2NrIHVzZWQgYXMgUlRDIGNsb2NrICovDQotI2RlZmluZSBSQ0NfUlRDQ0xLU09VUkNFX0hTRV9ESVYzMiBcDQotICBSQ0NfQkRDUl9SVENTRUwgLyohPCBIU0Ugb3NjaWxsYXRvciBjbG9jayBkaXZpZGVkIGJ5IDMyIHVzZWQgYXMgUlRDIGNsb2NrICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFJDQ19NQ09fSW5kZXggTUNPIEluZGV4DQotICogQHsNCi0gKi8NCi0vKiAzMiAgICAgMjggICAgICAyMCAgICAgICAxNiAgICAgIDANCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSAgIHwgTUNPICAgfCBHUElPICB8IEdQSU8gIHwgR1BJTyAgfA0KLSAgIHwgSW5kZXggfCAgQUYgICB8IFBvcnQgIHwgIFBpbiAgfA0KLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLQ0KLSNkZWZpbmUgUkNDX01DT19HUElPUE9SVF9QT1MgMTZVDQotI2RlZmluZSBSQ0NfTUNPX0dQSU9QT1JUX01BU0sgKDB4RlVMIDw8IFJDQ19NQ09fR1BJT1BPUlRfUE9TKQ0KLSNkZWZpbmUgUkNDX01DT19HUElPQUZfUE9TIDIwVQ0KLSNkZWZpbmUgUkNDX01DT19HUElPQUZfTUFTSyAoMHhGRlVMIDw8IFJDQ19NQ09fR1BJT0FGX1BPUykNCi0jZGVmaW5lIFJDQ19NQ09fSU5ERVhfUE9TIDI4VQ0KLSNkZWZpbmUgUkNDX01DT19JTkRFWF9NQVNLICgweDFVTCA8PCBSQ0NfTUNPX0lOREVYX1BPUykNCi0jZGVmaW5lIFJDQ19NQ08xX0lOREVYICgweDBVTCA8PCBSQ0NfTUNPX0lOREVYX1BPUykgLyohPCBNQ08xIGluZGV4ICovDQotI2RlZmluZSBSQ0NfTUNPX1BBOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoUkNDX01DTzFfSU5ERVggfCAoR1BJT19BRjBfTUNPIDw8IFJDQ19NQ09fR1BJT0FGX1BPUykgfCBcDQotICAgKEdQSU9fR0VUX0lOREVYKEdQSU9BKSA8PCBSQ0NfTUNPX0dQSU9QT1JUX1BPUykgfCBHUElPX1BJTl84KQ0KLSNkZWZpbmUgUkNDX01DT19QRzEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKFJDQ19NQ08xX0lOREVYIHwgKEdQSU9fQUYwX01DTyA8PCBSQ0NfTUNPX0dQSU9BRl9QT1MpIHwgXA0KLSAgIChHUElPX0dFVF9JTkRFWChHUElPRykgPDwgUkNDX01DT19HUElPUE9SVF9QT1MpIHwgR1BJT19QSU5fMTApDQotDQotLyogTGVnYWN5IERlZmluZXMqLw0KLSNkZWZpbmUgUkNDX01DTzEgUkNDX01DT19QQTgNCi0jZGVmaW5lIFJDQ19NQ08gXA0KLSAgUkNDX01DTzEgLyohPCBNQ08xIHRvIGJlIGNvbXBsaWFudCB3aXRoIG90aGVyIGZhbWlsaWVzIHdpdGggMiBNQ09zKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDX01DTzFfQ2xvY2tfU291cmNlIE1DTzEgQ2xvY2sgU291cmNlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFJDQ19NQ08xU09VUkNFX05PQ0xPQ0sgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBNQ08xIG91dHB1dCBkaXNhYmxlZCwgbm8gY2xvY2sgb24gTUNPMSAqLw0KLSNkZWZpbmUgUkNDX01DTzFTT1VSQ0VfU1lTQ0xLIFwNCi0gIFJDQ19DRkdSX01DT1NFTF8wIC8qITwgU1lTQ0xLIHNlbGVjdGlvbiBhcyBNQ08xIHNvdXJjZSAqLw0KLSNkZWZpbmUgUkNDX01DTzFTT1VSQ0VfSFNJIFwNCi0gIChSQ0NfQ0ZHUl9NQ09TRUxfMCB8IFJDQ19DRkdSX01DT1NFTF8xKSAvKiE8IEhTSSBzZWxlY3Rpb24gYXMgTUNPMSBzb3VyY2UgKi8NCi0jZGVmaW5lIFJDQ19NQ08xU09VUkNFX0hTRSBcDQotICBSQ0NfQ0ZHUl9NQ09TRUxfMiAvKiE8IEhTRSBzZWxlY3Rpb24gYXMgTUNPMSBzb3VyY2UgKi8NCi0jZGVmaW5lIFJDQ19NQ08xU09VUkNFX1BMTENMSyBcDQotICAoUkNDX0NGR1JfTUNPU0VMXzAgfCAgICAgICAgXA0KLSAgIFJDQ19DRkdSX01DT1NFTF8yKSAvKiE8IFBMTENMSyBzZWxlY3Rpb24gYXMgTUNPMSBzb3VyY2UgKi8NCi0jZGVmaW5lIFJDQ19NQ08xU09VUkNFX0xTSSBcDQotICAoUkNDX0NGR1JfTUNPU0VMXzEgfCBSQ0NfQ0ZHUl9NQ09TRUxfMikgLyohPCBMU0kgc2VsZWN0aW9uIGFzIE1DTzEgc291cmNlICovDQotI2RlZmluZSBSQ0NfTUNPMVNPVVJDRV9MU0UgICAgICAgICAgICAgICAgIFwNCi0gIChSQ0NfQ0ZHUl9NQ09TRUxfMCB8IFJDQ19DRkdSX01DT1NFTF8xIHwgXA0KLSAgIFJDQ19DRkdSX01DT1NFTF8yKSAvKiE8IExTRSBzZWxlY3Rpb24gYXMgTUNPMSBzb3VyY2UgKi8NCi0jZGVmaW5lIFJDQ19NQ08xU09VUkNFX0hTSTQ4IFwNCi0gIFJDQ19DRkdSX01DT1NFTF8zIC8qITwgSFNJNDggc2VsZWN0aW9uIGFzIE1DTzEgc291cmNlICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFJDQ19NQ094X0Nsb2NrX1ByZXNjYWxlciBNQ08xIENsb2NrIFByZXNjYWxlcg0KLSAqIEB7DQotICovDQotI2RlZmluZSBSQ0NfTUNPRElWXzEgUkNDX0NGR1JfTUNPUFJFX0RJVjEgICAvKiE8IE1DTyBub3QgZGl2aWRlZCAgKi8NCi0jZGVmaW5lIFJDQ19NQ09ESVZfMiBSQ0NfQ0ZHUl9NQ09QUkVfRElWMiAgIC8qITwgTUNPIGRpdmlkZWQgYnkgMiAqLw0KLSNkZWZpbmUgUkNDX01DT0RJVl80IFJDQ19DRkdSX01DT1BSRV9ESVY0ICAgLyohPCBNQ08gZGl2aWRlZCBieSA0ICovDQotI2RlZmluZSBSQ0NfTUNPRElWXzggUkNDX0NGR1JfTUNPUFJFX0RJVjggICAvKiE8IE1DTyBkaXZpZGVkIGJ5IDggKi8NCi0jZGVmaW5lIFJDQ19NQ09ESVZfMTYgUkNDX0NGR1JfTUNPUFJFX0RJVjE2IC8qITwgTUNPIGRpdmlkZWQgYnkgMTYgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDX0ludGVycnVwdCBJbnRlcnJ1cHRzDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFJDQ19JVF9MU0lSRFkgUkNDX0NJRlJfTFNJUkRZRiAvKiE8IExTSSBSZWFkeSBJbnRlcnJ1cHQgZmxhZyAqLw0KLSNkZWZpbmUgUkNDX0lUX0xTRVJEWSBSQ0NfQ0lGUl9MU0VSRFlGIC8qITwgTFNFIFJlYWR5IEludGVycnVwdCBmbGFnICovDQotI2RlZmluZSBSQ0NfSVRfSFNJUkRZIFJDQ19DSUZSX0hTSVJEWUYgLyohPCBIU0kxNiBSZWFkeSBJbnRlcnJ1cHQgZmxhZyAqLw0KLSNkZWZpbmUgUkNDX0lUX0hTRVJEWSBSQ0NfQ0lGUl9IU0VSRFlGIC8qITwgSFNFIFJlYWR5IEludGVycnVwdCBmbGFnICovDQotI2RlZmluZSBSQ0NfSVRfUExMUkRZIFJDQ19DSUZSX1BMTFJEWUYgLyohPCBQTEwgUmVhZHkgSW50ZXJydXB0IGZsYWcgKi8NCi0jZGVmaW5lIFJDQ19JVF9DU1MgUkNDX0NJRlJfQ1NTRiAvKiE8IENsb2NrIFNlY3VyaXR5IFN5c3RlbSBJbnRlcnJ1cHQgZmxhZyAqLw0KLSNkZWZpbmUgUkNDX0lUX0xTRUNTUyBcDQotICBSQ0NfQ0lGUl9MU0VDU1NGIC8qITwgTFNFIENsb2NrIFNlY3VyaXR5IFN5c3RlbSBJbnRlcnJ1cHQgZmxhZyAqLw0KLSNkZWZpbmUgUkNDX0lUX0hTSTQ4UkRZIFJDQ19DSUZSX0hTSTQ4UkRZRiAvKiE8IEhTSTQ4IFJlYWR5IEludGVycnVwdCBmbGFnICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFJDQ19GbGFnIEZsYWdzDQotICogICAgICAgIEVsZW1lbnRzIHZhbHVlcyBjb252ZW50aW9uOiBYWFhZWVlZWWINCi0gKiAgICAgICAgICAgLSBZWVlZWSAgOiBGbGFnIHBvc2l0aW9uIGluIHRoZSByZWdpc3Rlcg0KLSAqICAgICAgICAgICAtIFhYWCAgOiBSZWdpc3RlciBpbmRleA0KLSAqICAgICAgICAgICAgICAgICAtIDAwMTogQ1IgcmVnaXN0ZXINCi0gKiAgICAgICAgICAgICAgICAgLSAwMTA6IEJEQ1IgcmVnaXN0ZXINCi0gKiAgICAgICAgICAgICAgICAgLSAwMTE6IENTUiByZWdpc3Rlcg0KLSAqICAgICAgICAgICAgICAgICAtIDEwMDogQ1JSQ1IgcmVnaXN0ZXINCi0gKiBAew0KLSAqLw0KLS8qIEZsYWdzIGluIHRoZSBDUiByZWdpc3RlciAqLw0KLSNkZWZpbmUgUkNDX0ZMQUdfSFNJUkRZIFwNCi0gICgoQ1JfUkVHX0lOREVYIDw8IDVVKSB8IFJDQ19DUl9IU0lSRFlfUG9zKSAvKiE8IEhTSSBSZWFkeSBmbGFnICovDQotI2RlZmluZSBSQ0NfRkxBR19IU0VSRFkgXA0KLSAgKChDUl9SRUdfSU5ERVggPDwgNVUpIHwgUkNDX0NSX0hTRVJEWV9Qb3MpIC8qITwgSFNFIFJlYWR5IGZsYWcgKi8NCi0jZGVmaW5lIFJDQ19GTEFHX1BMTFJEWSBcDQotICAoKENSX1JFR19JTkRFWCA8PCA1VSkgfCBSQ0NfQ1JfUExMUkRZX1BvcykgLyohPCBQTEwgUmVhZHkgZmxhZyAqLw0KLQ0KLS8qIEZsYWdzIGluIHRoZSBCRENSIHJlZ2lzdGVyICovDQotI2RlZmluZSBSQ0NfRkxBR19MU0VSRFkgXA0KLSAgKChCRENSX1JFR19JTkRFWCA8PCA1VSkgfCBSQ0NfQkRDUl9MU0VSRFlfUG9zKSAvKiE8IExTRSBSZWFkeSBmbGFnICovDQotI2RlZmluZSBSQ0NfRkxBR19MU0VDU1NEICAgIFwNCi0gICgoQkRDUl9SRUdfSU5ERVggPDwgNVUpIHwgXA0KLSAgIFJDQ19CRENSX0xTRUNTU0RfUG9zKSAvKiE8IExTRSBDbG9jayBTZWN1cml0eSBTeXN0ZW0gSW50ZXJydXB0IGZsYWcgKi8NCi0NCi0vKiBGbGFncyBpbiB0aGUgQ1NSIHJlZ2lzdGVyICovDQotI2RlZmluZSBSQ0NfRkxBR19MU0lSRFkgXA0KLSAgKChDU1JfUkVHX0lOREVYIDw8IDVVKSB8IFJDQ19DU1JfTFNJUkRZX1BvcykgLyohPCBMU0kgUmVhZHkgZmxhZyAqLw0KLSNkZWZpbmUgUkNDX0ZMQUdfT0JMUlNUICAgIFwNCi0gICgoQ1NSX1JFR19JTkRFWCA8PCA1VSkgfCBcDQotICAgUkNDX0NTUl9PQkxSU1RGX1BvcykgLyohPCBPcHRpb24gQnl0ZSBMb2FkZXIgcmVzZXQgZmxhZyAqLw0KLSNkZWZpbmUgUkNDX0ZMQUdfUElOUlNUIFwNCi0gICgoQ1NSX1JFR19JTkRFWCA8PCA1VSkgfCBSQ0NfQ1NSX1BJTlJTVEZfUG9zKSAvKiE8IFBJTiByZXNldCBmbGFnICovDQotI2RlZmluZSBSQ0NfRkxBR19CT1JSU1QgXA0KLSAgKChDU1JfUkVHX0lOREVYIDw8IDVVKSB8IFJDQ19DU1JfQk9SUlNURl9Qb3MpIC8qITwgQk9SIHJlc2V0IGZsYWcgKi8NCi0jZGVmaW5lIFJDQ19GTEFHX1NGVFJTVCBcDQotICAoKENTUl9SRUdfSU5ERVggPDwgNVUpIHwgUkNDX0NTUl9TRlRSU1RGX1BvcykgLyohPCBTb2Z0d2FyZSBSZXNldCBmbGFnICovDQotI2RlZmluZSBSQ0NfRkxBR19JV0RHUlNUICAgXA0KLSAgKChDU1JfUkVHX0lOREVYIDw8IDVVKSB8IFwNCi0gICBSQ0NfQ1NSX0lXREdSU1RGX1BvcykgLyohPCBJbmRlcGVuZGVudCBXYXRjaGRvZyByZXNldCBmbGFnICovDQotI2RlZmluZSBSQ0NfRkxBR19XV0RHUlNUICAgXA0KLSAgKChDU1JfUkVHX0lOREVYIDw8IDVVKSB8IFwNCi0gICBSQ0NfQ1NSX1dXREdSU1RGX1BvcykgLyohPCBXaW5kb3cgd2F0Y2hkb2cgcmVzZXQgZmxhZyAqLw0KLSNkZWZpbmUgUkNDX0ZMQUdfTFBXUlJTVCBcDQotICAoKENTUl9SRUdfSU5ERVggPDwgNVUpIHwgUkNDX0NTUl9MUFdSUlNURl9Qb3MpIC8qITwgTG93LVBvd2VyIHJlc2V0IGZsYWcgKi8NCi0NCi0vKiBGbGFncyBpbiB0aGUgQ1JSQ1IgcmVnaXN0ZXIgKi8NCi0jZGVmaW5lIFJDQ19GTEFHX0hTSTQ4UkRZIFwNCi0gICgoQ1JSQ1JfUkVHX0lOREVYIDw8IDVVKSB8IFJDQ19DUlJDUl9IU0k0OFJEWV9Qb3MpIC8qITwgSFNJNDggUmVhZHkgZmxhZyAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBSQ0NfTFNFRHJpdmVfQ29uZmlnIExTRSBEcml2ZSBDb25maWcNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgUkNDX0xTRURSSVZFX0xPVyAweDAwMDAwMDAwVSAvKiE8IExTRSBsb3cgZHJpdmUgY2FwYWJpbGl0eSAqLw0KLSNkZWZpbmUgUkNDX0xTRURSSVZFX01FRElVTUxPVyBcDQotICBSQ0NfQkRDUl9MU0VEUlZfMCAvKiE8IExTRSBtZWRpdW0gbG93IGRyaXZlIGNhcGFiaWxpdHkgKi8NCi0jZGVmaW5lIFJDQ19MU0VEUklWRV9NRURJVU1ISUdIIFwNCi0gIFJDQ19CRENSX0xTRURSVl8xIC8qITwgTFNFIG1lZGl1bSBoaWdoIGRyaXZlIGNhcGFiaWxpdHkgKi8NCi0jZGVmaW5lIFJDQ19MU0VEUklWRV9ISUdIIFJDQ19CRENSX0xTRURSViAvKiE8IExTRSBoaWdoIGRyaXZlIGNhcGFiaWxpdHkgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogRXhwb3J0ZWQgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0NCi0vKiogQGRlZmdyb3VwIFJDQ19FeHBvcnRlZF9NYWNyb3MgUkNDIEV4cG9ydGVkIE1hY3Jvcw0KLSAqIEB7DQotICovDQotDQotLyoqIEBkZWZncm91cCBSQ0NfQUhCMV9QZXJpcGhlcmFsX0Nsb2NrX0VuYWJsZV9EaXNhYmxlIEFIQjEgUGVyaXBoZXJhbCBDbG9jaw0KLSAqIEVuYWJsZSBEaXNhYmxlDQotICogQGJyaWVmICBFbmFibGUgb3IgZGlzYWJsZSB0aGUgQUhCMSBwZXJpcGhlcmFsIGNsb2NrLg0KLSAqIEBub3RlICAgQWZ0ZXIgcmVzZXQsIHRoZSBwZXJpcGhlcmFsIGNsb2NrICh1c2VkIGZvciByZWdpc3RlcnMgcmVhZC93cml0ZQ0KLSAqIGFjY2VzcykgaXMgZGlzYWJsZWQgYW5kIHRoZSBhcHBsaWNhdGlvbiBzb2Z0d2FyZSBoYXMgdG8gZW5hYmxlIHRoaXMgY2xvY2sNCi0gKiBiZWZvcmUgdXNpbmcgaXQuDQotICogQHsNCi0gKi8NCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19ETUExX0NMS19FTkFCTEUoKSAgICAgICAgICAgICAgICAgICAgICBcDQotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgU0VUX0JJVChSQ0MtPkFIQjFFTlIsIFJDQ19BSEIxRU5SX0RNQTFFTik7ICAgICAgICAgICBcDQotICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovICAgXA0KLSAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFIQjFFTlIsIFJDQ19BSEIxRU5SX0RNQTFFTik7IFwNCi0gICAgVU5VU0VEKHRtcHJlZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICB9IHdoaWxlICgwKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0RNQTJfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBTRVRfQklUKFJDQy0+QUhCMUVOUiwgUkNDX0FIQjFFTlJfRE1BMkVOKTsgICAgICAgICAgIFwNCi0gICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gICBcDQotICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QUhCMUVOUiwgUkNDX0FIQjFFTlJfRE1BMkVOKTsgXA0KLSAgICBVTlVTRUQodG1wcmVnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIH0gd2hpbGUgKDApDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfRE1BTVVYMV9DTEtfRU5BQkxFKCkgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgX19JTyB1aW50MzJfdCB0bXByZWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIFNFVF9CSVQoUkNDLT5BSEIxRU5SLCBSQ0NfQUhCMUVOUl9ETUFNVVgxRU4pOyAgICAgICAgICAgXA0KLSAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyAgICAgIFwNCi0gICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BSEIxRU5SLCBSQ0NfQUhCMUVOUl9ETUFNVVgxRU4pOyBcDQotICAgIFVOVVNFRCh0bXByZWcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgfSB3aGlsZSAoMCkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19DT1JESUNfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgX19JTyB1aW50MzJfdCB0bXByZWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgU0VUX0JJVChSQ0MtPkFIQjFFTlIsIFJDQ19BSEIxRU5SX0NPUkRJQ0VOKTsgICAgICAgICAgIFwNCi0gICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gICAgIFwNCi0gICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BSEIxRU5SLCBSQ0NfQUhCMUVOUl9DT1JESUNFTik7IFwNCi0gICAgVU5VU0VEKHRtcHJlZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIH0gd2hpbGUgKDApDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfRk1BQ19DTEtfRU5BQkxFKCkgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgX19JTyB1aW50MzJfdCB0bXByZWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIFNFVF9CSVQoUkNDLT5BSEIxRU5SLCBSQ0NfQUhCMUVOUl9GTUFDRU4pOyAgICAgICAgICAgXA0KLSAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyAgIFwNCi0gICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BSEIxRU5SLCBSQ0NfQUhCMUVOUl9GTUFDRU4pOyBcDQotICAgIFVOVVNFRCh0bXByZWcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgfSB3aGlsZSAoMCkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19GTEFTSF9DTEtfRU5BQkxFKCkgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgU0VUX0JJVChSQ0MtPkFIQjFFTlIsIFJDQ19BSEIxRU5SX0ZMQVNIRU4pOyAgICAgICAgICAgXA0KLSAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyAgICBcDQotICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QUhCMUVOUiwgUkNDX0FIQjFFTlJfRkxBU0hFTik7IFwNCi0gICAgVU5VU0VEKHRtcHJlZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgfSB3aGlsZSAoMCkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19DUkNfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgX19JTyB1aW50MzJfdCB0bXByZWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgU0VUX0JJVChSQ0MtPkFIQjFFTlIsIFJDQ19BSEIxRU5SX0NSQ0VOKTsgICAgICAgICAgIFwNCi0gICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gIFwNCi0gICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BSEIxRU5SLCBSQ0NfQUhCMUVOUl9DUkNFTik7IFwNCi0gICAgVU5VU0VEKHRtcHJlZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIH0gd2hpbGUgKDApDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfRE1BMV9DTEtfRElTQUJMRSgpIENMRUFSX0JJVChSQ0MtPkFIQjFFTlIsIFJDQ19BSEIxRU5SX0RNQTFFTikNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19ETUEyX0NMS19ESVNBQkxFKCkgQ0xFQVJfQklUKFJDQy0+QUhCMUVOUiwgUkNDX0FIQjFFTlJfRE1BMkVOKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0RNQU1VWDFfQ0xLX0RJU0FCTEUoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BSEIxRU5SLCBSQ0NfQUhCMUVOUl9ETUFNVVgxRU4pDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfQ09SRElDX0NMS19ESVNBQkxFKCkgXA0KLSAgQ0xFQVJfQklUKFJDQy0+QUhCMUVOUiwgUkNDX0FIQjFFTlJfQ09SRElDRU4pDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfRk1BQ19DTEtfRElTQUJMRSgpIENMRUFSX0JJVChSQ0MtPkFIQjFFTlIsIFJDQ19BSEIxRU5SX0ZNQUNFTikNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19GTEFTSF9DTEtfRElTQUJMRSgpIFwNCi0gIENMRUFSX0JJVChSQ0MtPkFIQjFFTlIsIFJDQ19BSEIxRU5SX0ZMQVNIRU4pDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfQ1JDX0NMS19ESVNBQkxFKCkgQ0xFQVJfQklUKFJDQy0+QUhCMUVOUiwgUkNDX0FIQjFFTlJfQ1JDRU4pDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFJDQ19BSEIyX1BlcmlwaGVyYWxfQ2xvY2tfRW5hYmxlX0Rpc2FibGUgQUhCMiBQZXJpcGhlcmFsIENsb2NrDQotICogRW5hYmxlIERpc2FibGUNCi0gKiBAYnJpZWYgIEVuYWJsZSBvciBkaXNhYmxlIHRoZSBBSEIyIHBlcmlwaGVyYWwgY2xvY2suDQotICogQG5vdGUgICBBZnRlciByZXNldCwgdGhlIHBlcmlwaGVyYWwgY2xvY2sgKHVzZWQgZm9yIHJlZ2lzdGVycyByZWFkL3dyaXRlDQotICogYWNjZXNzKSBpcyBkaXNhYmxlZCBhbmQgdGhlIGFwcGxpY2F0aW9uIHNvZnR3YXJlIGhhcyB0byBlbmFibGUgdGhpcyBjbG9jaw0KLSAqIGJlZm9yZSB1c2luZyBpdC4NCi0gKiBAew0KLSAqLw0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0dQSU9BX0NMS19FTkFCTEUoKSAgICAgICAgICAgICAgICAgICAgICBcDQotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgX19JTyB1aW50MzJfdCB0bXByZWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBTRVRfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfR1BJT0FFTik7ICAgICAgICAgICBcDQotICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovICAgIFwNCi0gICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BSEIyRU5SLCBSQ0NfQUhCMkVOUl9HUElPQUVOKTsgXA0KLSAgICBVTlVTRUQodG1wcmVnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICB9IHdoaWxlICgwKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0dQSU9CX0NMS19FTkFCTEUoKSAgICAgICAgICAgICAgICAgICAgICBcDQotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgX19JTyB1aW50MzJfdCB0bXByZWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBTRVRfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfR1BJT0JFTik7ICAgICAgICAgICBcDQotICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovICAgIFwNCi0gICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BSEIyRU5SLCBSQ0NfQUhCMkVOUl9HUElPQkVOKTsgXA0KLSAgICBVTlVTRUQodG1wcmVnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICB9IHdoaWxlICgwKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0dQSU9DX0NMS19FTkFCTEUoKSAgICAgICAgICAgICAgICAgICAgICBcDQotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgX19JTyB1aW50MzJfdCB0bXByZWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBTRVRfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfR1BJT0NFTik7ICAgICAgICAgICBcDQotICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovICAgIFwNCi0gICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BSEIyRU5SLCBSQ0NfQUhCMkVOUl9HUElPQ0VOKTsgXA0KLSAgICBVTlVTRUQodG1wcmVnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICB9IHdoaWxlICgwKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0dQSU9EX0NMS19FTkFCTEUoKSAgICAgICAgICAgICAgICAgICAgICBcDQotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgX19JTyB1aW50MzJfdCB0bXByZWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBTRVRfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfR1BJT0RFTik7ICAgICAgICAgICBcDQotICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovICAgIFwNCi0gICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BSEIyRU5SLCBSQ0NfQUhCMkVOUl9HUElPREVOKTsgXA0KLSAgICBVTlVTRUQodG1wcmVnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICB9IHdoaWxlICgwKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0dQSU9FX0NMS19FTkFCTEUoKSAgICAgICAgICAgICAgICAgICAgICBcDQotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgX19JTyB1aW50MzJfdCB0bXByZWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBTRVRfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfR1BJT0VFTik7ICAgICAgICAgICBcDQotICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovICAgIFwNCi0gICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BSEIyRU5SLCBSQ0NfQUhCMkVOUl9HUElPRUVOKTsgXA0KLSAgICBVTlVTRUQodG1wcmVnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICB9IHdoaWxlICgwKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0dQSU9GX0NMS19FTkFCTEUoKSAgICAgICAgICAgICAgICAgICAgICBcDQotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgX19JTyB1aW50MzJfdCB0bXByZWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBTRVRfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfR1BJT0ZFTik7ICAgICAgICAgICBcDQotICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovICAgIFwNCi0gICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BSEIyRU5SLCBSQ0NfQUhCMkVOUl9HUElPRkVOKTsgXA0KLSAgICBVTlVTRUQodG1wcmVnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICB9IHdoaWxlICgwKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0dQSU9HX0NMS19FTkFCTEUoKSAgICAgICAgICAgICAgICAgICAgICBcDQotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgX19JTyB1aW50MzJfdCB0bXByZWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBTRVRfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfR1BJT0dFTik7ICAgICAgICAgICBcDQotICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovICAgIFwNCi0gICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BSEIyRU5SLCBSQ0NfQUhCMkVOUl9HUElPR0VOKTsgXA0KLSAgICBVTlVTRUQodG1wcmVnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICB9IHdoaWxlICgwKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0FEQzEyX0NMS19FTkFCTEUoKSAgICAgICAgICAgICAgICAgICAgICBcDQotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgX19JTyB1aW50MzJfdCB0bXByZWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBTRVRfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfQURDMTJFTik7ICAgICAgICAgICBcDQotICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovICAgIFwNCi0gICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BSEIyRU5SLCBSQ0NfQUhCMkVOUl9BREMxMkVOKTsgXA0KLSAgICBVTlVTRUQodG1wcmVnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICB9IHdoaWxlICgwKQ0KLQ0KLSNpZiBkZWZpbmVkKEFEQzM0NV9DT01NT04pDQotI2RlZmluZSBfX0hBTF9SQ0NfQURDMzQ1X0NMS19FTkFCTEUoKSAgICAgICAgICAgICAgICAgICAgICBcDQotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIFNFVF9CSVQoUkNDLT5BSEIyRU5SLCBSQ0NfQUhCMkVOUl9BREMzNDVFTik7ICAgICAgICAgICBcDQotICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovICAgICBcDQotICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfQURDMzQ1RU4pOyBcDQotICAgIFVOVVNFRCh0bXByZWcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICB9IHdoaWxlICgwKQ0KLSNlbmRpZiAvKiBBREMzNDVfQ09NTU9OICovDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfREFDMV9DTEtfRU5BQkxFKCkgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgX19JTyB1aW50MzJfdCB0bXByZWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIFNFVF9CSVQoUkNDLT5BSEIyRU5SLCBSQ0NfQUhCMkVOUl9EQUMxRU4pOyAgICAgICAgICAgXA0KLSAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyAgIFwNCi0gICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BSEIyRU5SLCBSQ0NfQUhCMkVOUl9EQUMxRU4pOyBcDQotICAgIFVOVVNFRCh0bXByZWcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgfSB3aGlsZSAoMCkNCi0NCi0jaWYgZGVmaW5lZChEQUMyKQ0KLSNkZWZpbmUgX19IQUxfUkNDX0RBQzJfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBTRVRfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfREFDMkVOKTsgICAgICAgICAgIFwNCi0gICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gICBcDQotICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfREFDMkVOKTsgXA0KLSAgICBVTlVTRUQodG1wcmVnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIH0gd2hpbGUgKDApDQotI2VuZGlmIC8qIERBQzIgKi8NCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19EQUMzX0NMS19FTkFCTEUoKSAgICAgICAgICAgICAgICAgICAgICBcDQotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgU0VUX0JJVChSQ0MtPkFIQjJFTlIsIFJDQ19BSEIyRU5SX0RBQzNFTik7ICAgICAgICAgICBcDQotICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovICAgXA0KLSAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFIQjJFTlIsIFJDQ19BSEIyRU5SX0RBQzNFTik7IFwNCi0gICAgVU5VU0VEKHRtcHJlZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICB9IHdoaWxlICgwKQ0KLQ0KLSNpZiBkZWZpbmVkKERBQzQpDQotI2RlZmluZSBfX0hBTF9SQ0NfREFDNF9DTEtfRU5BQkxFKCkgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgX19JTyB1aW50MzJfdCB0bXByZWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIFNFVF9CSVQoUkNDLT5BSEIyRU5SLCBSQ0NfQUhCMkVOUl9EQUM0RU4pOyAgICAgICAgICAgXA0KLSAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyAgIFwNCi0gICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BSEIyRU5SLCBSQ0NfQUhCMkVOUl9EQUM0RU4pOyBcDQotICAgIFVOVVNFRCh0bXByZWcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgfSB3aGlsZSAoMCkNCi0jZW5kaWYgLyogREFDNCAqLw0KLQ0KLSNpZiBkZWZpbmVkKEFFUykNCi0jZGVmaW5lIF9fSEFMX1JDQ19BRVNfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgX19JTyB1aW50MzJfdCB0bXByZWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgU0VUX0JJVChSQ0MtPkFIQjJFTlIsIFJDQ19BSEIyRU5SX0FFU0VOKTsgICAgICAgICAgIFwNCi0gICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gIFwNCi0gICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BSEIyRU5SLCBSQ0NfQUhCMkVOUl9BRVNFTik7IFwNCi0gICAgVU5VU0VEKHRtcHJlZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIH0gd2hpbGUgKDApDQotI2VuZGlmIC8qIEFFUyAqLw0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1JOR19DTEtfRU5BQkxFKCkgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBTRVRfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfUk5HRU4pOyAgICAgICAgICAgXA0KLSAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyAgXA0KLSAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFIQjJFTlIsIFJDQ19BSEIyRU5SX1JOR0VOKTsgXA0KLSAgICBVTlVTRUQodG1wcmVnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgfSB3aGlsZSAoMCkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19HUElPQV9DTEtfRElTQUJMRSgpIFwNCi0gIENMRUFSX0JJVChSQ0MtPkFIQjJFTlIsIFJDQ19BSEIyRU5SX0dQSU9BRU4pDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0JfQ0xLX0RJU0FCTEUoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BSEIyRU5SLCBSQ0NfQUhCMkVOUl9HUElPQkVOKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0dQSU9DX0NMS19ESVNBQkxFKCkgXA0KLSAgQ0xFQVJfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfR1BJT0NFTikNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19HUElPRF9DTEtfRElTQUJMRSgpIFwNCi0gIENMRUFSX0JJVChSQ0MtPkFIQjJFTlIsIFJDQ19BSEIyRU5SX0dQSU9ERU4pDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0VfQ0xLX0RJU0FCTEUoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BSEIyRU5SLCBSQ0NfQUhCMkVOUl9HUElPRUVOKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0dQSU9GX0NMS19ESVNBQkxFKCkgXA0KLSAgQ0xFQVJfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfR1BJT0ZFTikNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19HUElPR19DTEtfRElTQUJMRSgpIFwNCi0gIENMRUFSX0JJVChSQ0MtPkFIQjJFTlIsIFJDQ19BSEIyRU5SX0dQSU9HRU4pDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfQURDMTJfQ0xLX0RJU0FCTEUoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BSEIyRU5SLCBSQ0NfQUhCMkVOUl9BREMxMkVOKQ0KLQ0KLSNpZiBkZWZpbmVkKEFEQzM0NV9DT01NT04pDQotI2RlZmluZSBfX0hBTF9SQ0NfQURDMzQ1X0NMS19ESVNBQkxFKCkgXA0KLSAgQ0xFQVJfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfQURDMzQ1RU4pDQotI2VuZGlmIC8qIEFEQzM0NV9DT01NT04gKi8NCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19EQUMxX0NMS19ESVNBQkxFKCkgQ0xFQVJfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfREFDMUVOKQ0KLQ0KLSNpZiBkZWZpbmVkKERBQzIpDQotI2RlZmluZSBfX0hBTF9SQ0NfREFDMl9DTEtfRElTQUJMRSgpIENMRUFSX0JJVChSQ0MtPkFIQjJFTlIsIFJDQ19BSEIyRU5SX0RBQzJFTikNCi0jZW5kaWYgLyogREFDMiAqLw0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0RBQzNfQ0xLX0RJU0FCTEUoKSBDTEVBUl9CSVQoUkNDLT5BSEIyRU5SLCBSQ0NfQUhCMkVOUl9EQUMzRU4pDQotDQotI2lmIGRlZmluZWQoREFDNCkNCi0jZGVmaW5lIF9fSEFMX1JDQ19EQUM0X0NMS19ESVNBQkxFKCkgQ0xFQVJfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfREFDNEVOKQ0KLSNlbmRpZiAvKiBEQUM0ICovDQotDQotI2lmIGRlZmluZWQoQUVTKQ0KLSNkZWZpbmUgX19IQUxfUkNDX0FFU19DTEtfRElTQUJMRSgpIENMRUFSX0JJVChSQ0MtPkFIQjJFTlIsIFJDQ19BSEIyRU5SX0FFU0VOKTsNCi0jZW5kaWYgLyogQUVTICovDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfUk5HX0NMS19ESVNBQkxFKCkgQ0xFQVJfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfUk5HRU4pDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFJDQ19BSEIzX0Nsb2NrX0VuYWJsZV9EaXNhYmxlIEFIQjMgUGVyaXBoZXJhbCBDbG9jayBFbmFibGUgRGlzYWJsZQ0KLSAqIEBicmllZiAgRW5hYmxlIG9yIGRpc2FibGUgdGhlIEFIQjMgcGVyaXBoZXJhbCBjbG9jay4NCi0gKiBAbm90ZSAgIEFmdGVyIHJlc2V0LCB0aGUgcGVyaXBoZXJhbCBjbG9jayAodXNlZCBmb3IgcmVnaXN0ZXJzIHJlYWQvd3JpdGUNCi0gKiBhY2Nlc3MpIGlzIGRpc2FibGVkIGFuZCB0aGUgYXBwbGljYXRpb24gc29mdHdhcmUgaGFzIHRvIGVuYWJsZSB0aGlzIGNsb2NrDQotICogYmVmb3JlIHVzaW5nIGl0Lg0KLSAqIEB7DQotICovDQotDQotI2lmIGRlZmluZWQoRk1DX0JBTksxKQ0KLSNkZWZpbmUgX19IQUxfUkNDX0ZNQ19DTEtfRU5BQkxFKCkgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBTRVRfQklUKFJDQy0+QUhCM0VOUiwgUkNDX0FIQjNFTlJfRk1DRU4pOyAgICAgICAgICAgXA0KLSAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyAgXA0KLSAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFIQjNFTlIsIFJDQ19BSEIzRU5SX0ZNQ0VOKTsgXA0KLSAgICBVTlVTRUQodG1wcmVnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgfSB3aGlsZSAoMCkNCi0jZW5kaWYgLyogRk1DX0JBTksxICovDQotDQotI2lmIGRlZmluZWQoUVVBRFNQSSkNCi0jZGVmaW5lIF9fSEFMX1JDQ19RU1BJX0NMS19FTkFCTEUoKSAgICAgICAgICAgICAgICAgICAgICBcDQotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgU0VUX0JJVChSQ0MtPkFIQjNFTlIsIFJDQ19BSEIzRU5SX1FTUElFTik7ICAgICAgICAgICBcDQotICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovICAgXA0KLSAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFIQjNFTlIsIFJDQ19BSEIzRU5SX1FTUElFTik7IFwNCi0gICAgVU5VU0VEKHRtcHJlZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICB9IHdoaWxlICgwKQ0KLSNlbmRpZiAvKiBRVUFEU1BJICovDQotDQotI2lmIGRlZmluZWQoRk1DX0JBTksxKQ0KLSNkZWZpbmUgX19IQUxfUkNDX0ZNQ19DTEtfRElTQUJMRSgpIENMRUFSX0JJVChSQ0MtPkFIQjNFTlIsIFJDQ19BSEIzRU5SX0ZNQ0VOKQ0KLSNlbmRpZiAvKiBGTUNfQkFOSzEgKi8NCi0NCi0jaWYgZGVmaW5lZChRVUFEU1BJKQ0KLSNkZWZpbmUgX19IQUxfUkNDX1FTUElfQ0xLX0RJU0FCTEUoKSBDTEVBUl9CSVQoUkNDLT5BSEIzRU5SLCBSQ0NfQUhCM0VOUl9RU1BJRU4pDQotI2VuZGlmIC8qIFFVQURTUEkgKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDX0FQQjFfQ2xvY2tfRW5hYmxlX0Rpc2FibGUgQVBCMSBQZXJpcGhlcmFsIENsb2NrIEVuYWJsZSBEaXNhYmxlDQotICogQGJyaWVmICBFbmFibGUgb3IgZGlzYWJsZSB0aGUgQVBCMSBwZXJpcGhlcmFsIGNsb2NrLg0KLSAqIEBub3RlICAgQWZ0ZXIgcmVzZXQsIHRoZSBwZXJpcGhlcmFsIGNsb2NrICh1c2VkIGZvciByZWdpc3RlcnMgcmVhZC93cml0ZQ0KLSAqIGFjY2VzcykgaXMgZGlzYWJsZWQgYW5kIHRoZSBhcHBsaWNhdGlvbiBzb2Z0d2FyZSBoYXMgdG8gZW5hYmxlIHRoaXMgY2xvY2sNCi0gKiBiZWZvcmUgdXNpbmcgaXQuDQotICogQHsNCi0gKi8NCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19USU0yX0NMS19FTkFCTEUoKSAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgX19JTyB1aW50MzJfdCB0bXByZWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgU0VUX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfVElNMkVOKTsgICAgICAgICAgIFwNCi0gICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gICAgIFwNCi0gICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1RJTTJFTik7IFwNCi0gICAgVU5VU0VEKHRtcHJlZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIH0gd2hpbGUgKDApDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfVElNM19DTEtfRU5BQkxFKCkgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIFNFVF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1RJTTNFTik7ICAgICAgICAgICBcDQotICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovICAgICBcDQotICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9USU0zRU4pOyBcDQotICAgIFVOVVNFRCh0bXByZWcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICB9IHdoaWxlICgwKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1RJTTRfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBTRVRfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9USU00RU4pOyAgICAgICAgICAgXA0KLSAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyAgICAgXA0KLSAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfVElNNEVOKTsgXA0KLSAgICBVTlVTRUQodG1wcmVnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgfSB3aGlsZSAoMCkNCi0NCi0jaWYgZGVmaW5lZChUSU01KQ0KLSNkZWZpbmUgX19IQUxfUkNDX1RJTTVfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBTRVRfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9USU01RU4pOyAgICAgICAgICAgXA0KLSAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyAgICAgXA0KLSAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfVElNNUVOKTsgXA0KLSAgICBVTlVTRUQodG1wcmVnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgfSB3aGlsZSAoMCkNCi0jZW5kaWYgLyogVElNNSAqLw0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1RJTTZfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBTRVRfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9USU02RU4pOyAgICAgICAgICAgXA0KLSAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyAgICAgXA0KLSAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfVElNNkVOKTsgXA0KLSAgICBVTlVTRUQodG1wcmVnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgfSB3aGlsZSAoMCkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19USU03X0NMS19FTkFCTEUoKSAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgX19JTyB1aW50MzJfdCB0bXByZWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgU0VUX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfVElNN0VOKTsgICAgICAgICAgIFwNCi0gICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gICAgIFwNCi0gICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1RJTTdFTik7IFwNCi0gICAgVU5VU0VEKHRtcHJlZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIH0gd2hpbGUgKDApDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfQ1JTX0NMS19FTkFCTEUoKSAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIFNFVF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX0NSU0VOKTsgICAgICAgICAgIFwNCi0gICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gICAgXA0KLSAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfQ1JTRU4pOyBcDQotICAgIFVOVVNFRCh0bXByZWcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIH0gd2hpbGUgKDApDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfUlRDQVBCX0NMS19FTkFCTEUoKSAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIFNFVF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1JUQ0FQQkVOKTsgICAgICAgICAgIFwNCi0gICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gICAgICAgXA0KLSAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfUlRDQVBCRU4pOyBcDQotICAgIFVOVVNFRCh0bXByZWcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIH0gd2hpbGUgKDApDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfV1dER19DTEtfRU5BQkxFKCkgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIFNFVF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1dXREdFTik7ICAgICAgICAgICBcDQotICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovICAgICBcDQotICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9XV0RHRU4pOyBcDQotICAgIFVOVVNFRCh0bXByZWcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICB9IHdoaWxlICgwKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1NQSTJfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBTRVRfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9TUEkyRU4pOyAgICAgICAgICAgXA0KLSAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyAgICAgXA0KLSAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfU1BJMkVOKTsgXA0KLSAgICBVTlVTRUQodG1wcmVnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgfSB3aGlsZSAoMCkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19TUEkzX0NMS19FTkFCTEUoKSAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgX19JTyB1aW50MzJfdCB0bXByZWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgU0VUX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfU1BJM0VOKTsgICAgICAgICAgIFwNCi0gICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gICAgIFwNCi0gICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1NQSTNFTik7IFwNCi0gICAgVU5VU0VEKHRtcHJlZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIH0gd2hpbGUgKDApDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQyX0NMS19FTkFCTEUoKSAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIFNFVF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1VTQVJUMkVOKTsgICAgICAgICAgIFwNCi0gICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gICAgICAgXA0KLSAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfVVNBUlQyRU4pOyBcDQotICAgIFVOVVNFRCh0bXByZWcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIH0gd2hpbGUgKDApDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQzX0NMS19FTkFCTEUoKSAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIFNFVF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1VTQVJUM0VOKTsgICAgICAgICAgIFwNCi0gICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gICAgICAgXA0KLSAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfVVNBUlQzRU4pOyBcDQotICAgIFVOVVNFRCh0bXByZWcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIH0gd2hpbGUgKDApDQotDQotI2lmIGRlZmluZWQoVUFSVDQpDQotI2RlZmluZSBfX0hBTF9SQ0NfVUFSVDRfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgX19JTyB1aW50MzJfdCB0bXByZWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIFNFVF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1VBUlQ0RU4pOyAgICAgICAgICAgXA0KLSAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyAgICAgIFwNCi0gICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1VBUlQ0RU4pOyBcDQotICAgIFVOVVNFRCh0bXByZWcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgfSB3aGlsZSAoMCkNCi0jZW5kaWYgLyogVUFSVDQgKi8NCi0NCi0jaWYgZGVmaW5lZChVQVJUNSkNCi0jZGVmaW5lIF9fSEFMX1JDQ19VQVJUNV9DTEtfRU5BQkxFKCkgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgU0VUX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfVUFSVDVFTik7ICAgICAgICAgICBcDQotICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovICAgICAgXA0KLSAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfVUFSVDVFTik7IFwNCi0gICAgVU5VU0VEKHRtcHJlZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICB9IHdoaWxlICgwKQ0KLSNlbmRpZiAvKiBVQVJUNSAqLw0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0kyQzFfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBTRVRfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9JMkMxRU4pOyAgICAgICAgICAgXA0KLSAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyAgICAgXA0KLSAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfSTJDMUVOKTsgXA0KLSAgICBVTlVTRUQodG1wcmVnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgfSB3aGlsZSAoMCkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19JMkMyX0NMS19FTkFCTEUoKSAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgX19JTyB1aW50MzJfdCB0bXByZWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgU0VUX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfSTJDMkVOKTsgICAgICAgICAgIFwNCi0gICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gICAgIFwNCi0gICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX0kyQzJFTik7IFwNCi0gICAgVU5VU0VEKHRtcHJlZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIH0gd2hpbGUgKDApDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfVVNCX0NMS19FTkFCTEUoKSAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIFNFVF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1VTQkVOKTsgICAgICAgICAgIFwNCi0gICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gICAgXA0KLSAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfVVNCRU4pOyBcDQotICAgIFVOVVNFRCh0bXByZWcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIH0gd2hpbGUgKDApDQotDQotI2lmIGRlZmluZWQoRkRDQU4xKQ0KLSNkZWZpbmUgX19IQUxfUkNDX0ZEQ0FOX0NMS19FTkFCTEUoKSAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBTRVRfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9GRENBTkVOKTsgICAgICAgICAgIFwNCi0gICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gICAgICBcDQotICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9GRENBTkVOKTsgXA0KLSAgICBVTlVTRUQodG1wcmVnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIH0gd2hpbGUgKDApDQotI2VuZGlmIC8qIEZEQ0FOMSAqLw0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1BXUl9DTEtfRU5BQkxFKCkgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgX19JTyB1aW50MzJfdCB0bXByZWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBTRVRfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9QV1JFTik7ICAgICAgICAgICBcDQotICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovICAgIFwNCi0gICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1BXUkVOKTsgXA0KLSAgICBVTlVTRUQodG1wcmVnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICB9IHdoaWxlICgwKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0kyQzNfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBTRVRfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9JMkMzRU4pOyAgICAgICAgICAgXA0KLSAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyAgICAgXA0KLSAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfSTJDM0VOKTsgXA0KLSAgICBVTlVTRUQodG1wcmVnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgfSB3aGlsZSAoMCkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19MUFRJTTFfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgU0VUX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfTFBUSU0xRU4pOyAgICAgICAgICAgXA0KLSAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyAgICAgICBcDQotICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9MUFRJTTFFTik7IFwNCi0gICAgVU5VU0VEKHRtcHJlZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgfSB3aGlsZSAoMCkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19MUFVBUlQxX0NMS19FTkFCTEUoKSAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgX19JTyB1aW50MzJfdCB0bXByZWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgU0VUX0JJVChSQ0MtPkFQQjFFTlIyLCBSQ0NfQVBCMUVOUjJfTFBVQVJUMUVOKTsgICAgICAgICAgIFwNCi0gICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gICAgICAgIFwNCi0gICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEIxRU5SMiwgUkNDX0FQQjFFTlIyX0xQVUFSVDFFTik7IFwNCi0gICAgVU5VU0VEKHRtcHJlZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIH0gd2hpbGUgKDApDQotDQotI2lmIGRlZmluZWQoSTJDNCkNCi0jZGVmaW5lIF9fSEFMX1JDQ19JMkM0X0NMS19FTkFCTEUoKSAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgX19JTyB1aW50MzJfdCB0bXByZWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgU0VUX0JJVChSQ0MtPkFQQjFFTlIyLCBSQ0NfQVBCMUVOUjJfSTJDNEVOKTsgICAgICAgICAgIFwNCi0gICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gICAgIFwNCi0gICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEIxRU5SMiwgUkNDX0FQQjFFTlIyX0kyQzRFTik7IFwNCi0gICAgVU5VU0VEKHRtcHJlZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIH0gd2hpbGUgKDApDQotI2VuZGlmIC8qIEkyQzQgKi8NCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19VQ1BEMV9DTEtfRU5BQkxFKCkgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgU0VUX0JJVChSQ0MtPkFQQjFFTlIyLCBSQ0NfQVBCMUVOUjJfVUNQRDFFTik7ICAgICAgICAgICBcDQotICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovICAgICAgXA0KLSAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQjFFTlIyLCBSQ0NfQVBCMUVOUjJfVUNQRDFFTik7IFwNCi0gICAgVU5VU0VEKHRtcHJlZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICB9IHdoaWxlICgwKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1RJTTJfQ0xLX0RJU0FCTEUoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1RJTTJFTikNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19USU0zX0NMS19ESVNBQkxFKCkgXA0KLSAgQ0xFQVJfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9USU0zRU4pDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfVElNNF9DTEtfRElTQUJMRSgpIFwNCi0gIENMRUFSX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfVElNNEVOKQ0KLQ0KLSNpZiBkZWZpbmVkKFRJTTUpDQotI2RlZmluZSBfX0hBTF9SQ0NfVElNNV9DTEtfRElTQUJMRSgpIFwNCi0gIENMRUFSX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfVElNNUVOKQ0KLSNlbmRpZiAvKiBUSU01ICovDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfVElNNl9DTEtfRElTQUJMRSgpIFwNCi0gIENMRUFSX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfVElNNkVOKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1RJTTdfQ0xLX0RJU0FCTEUoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1RJTTdFTikNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19DUlNfQ0xLX0RJU0FCTEUoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX0NSU0VOKTsNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19SVENBUEJfQ0xLX0RJU0FCTEUoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1JUQ0FQQkVOKTsNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19XV0RHX0NMS19ESVNBQkxFKCkgXA0KLSAgQ0xFQVJfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9XV0RHMkVOKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1NQSTJfQ0xLX0RJU0FCTEUoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1NQSTJFTikNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19TUEkzX0NMS19ESVNBQkxFKCkgXA0KLSAgQ0xFQVJfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9TUEkzRU4pDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQyX0NMS19ESVNBQkxFKCkgXA0KLSAgQ0xFQVJfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9VU0FSVDJFTikNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDNfQ0xLX0RJU0FCTEUoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1VTQVJUM0VOKQ0KLQ0KLSNpZiBkZWZpbmVkKFVBUlQ0KQ0KLSNkZWZpbmUgX19IQUxfUkNDX1VBUlQ0X0NMS19ESVNBQkxFKCkgXA0KLSAgQ0xFQVJfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9VQVJUNEVOKQ0KLSNlbmRpZiAvKiBVQVJUNCAqLw0KLQ0KLSNpZiBkZWZpbmVkKFVBUlQ1KQ0KLSNkZWZpbmUgX19IQUxfUkNDX1VBUlQ1X0NMS19ESVNBQkxFKCkgXA0KLSAgQ0xFQVJfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9VQVJUNUVOKQ0KLSNlbmRpZiAvKiBVQVJUNSAqLw0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0kyQzFfQ0xLX0RJU0FCTEUoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX0kyQzFFTikNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19JMkMyX0NMS19ESVNBQkxFKCkgXA0KLSAgQ0xFQVJfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9JMkMyRU4pDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfVVNCX0NMS19ESVNBQkxFKCkgQ0xFQVJfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9VU0JFTikNCi0NCi0jaWYgZGVmaW5lZChGRENBTjEpDQotI2RlZmluZSBfX0hBTF9SQ0NfRkRDQU5fQ0xLX0RJU0FCTEUoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX0ZEQ0FORU4pDQotI2VuZGlmIC8qIEZEQ0FOMSAqLw0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1BXUl9DTEtfRElTQUJMRSgpIENMRUFSX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfUFdSRU4pDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfSTJDM19DTEtfRElTQUJMRSgpIFwNCi0gIENMRUFSX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfSTJDM0VOKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0xQVElNMV9DTEtfRElTQUJMRSgpIFwNCi0gIENMRUFSX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfTFBUSU0xRU4pDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfTFBVQVJUMV9DTEtfRElTQUJMRSgpIFwNCi0gIENMRUFSX0JJVChSQ0MtPkFQQjFFTlIyLCBSQ0NfQVBCMUVOUjJfTFBVQVJUMUVOKQ0KLQ0KLSNpZiBkZWZpbmVkKEkyQzQpDQotI2RlZmluZSBfX0hBTF9SQ0NfSTJDNF9DTEtfRElTQUJMRSgpIFwNCi0gIENMRUFSX0JJVChSQ0MtPkFQQjFFTlIyLCBSQ0NfQVBCMUVOUjJfSTJDNEVOKQ0KLSNlbmRpZiAvKiBJMkM0ICovDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfVUNQRDFfQ0xLX0RJU0FCTEUoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BUEIxRU5SMiwgUkNDX0FQQjFFTlIyX1VDUEQxRU4pDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFJDQ19BUEIyX0Nsb2NrX0VuYWJsZV9EaXNhYmxlIEFQQjIgUGVyaXBoZXJhbCBDbG9jayBFbmFibGUgRGlzYWJsZQ0KLSAqIEBicmllZiAgRW5hYmxlIG9yIGRpc2FibGUgdGhlIEFQQjIgcGVyaXBoZXJhbCBjbG9jay4NCi0gKiBAbm90ZSAgIEFmdGVyIHJlc2V0LCB0aGUgcGVyaXBoZXJhbCBjbG9jayAodXNlZCBmb3IgcmVnaXN0ZXJzIHJlYWQvd3JpdGUNCi0gKiBhY2Nlc3MpIGlzIGRpc2FibGVkIGFuZCB0aGUgYXBwbGljYXRpb24gc29mdHdhcmUgaGFzIHRvIGVuYWJsZSB0aGlzIGNsb2NrDQotICogYmVmb3JlIHVzaW5nIGl0Lg0KLSAqIEB7DQotICovDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfU1lTQ0ZHX0NMS19FTkFCTEUoKSAgICAgICAgICAgICAgICAgICAgICBcDQotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIFNFVF9CSVQoUkNDLT5BUEIyRU5SLCBSQ0NfQVBCMkVOUl9TWVNDRkdFTik7ICAgICAgICAgICBcDQotICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovICAgICBcDQotICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfU1lTQ0ZHRU4pOyBcDQotICAgIFVOVVNFRCh0bXByZWcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICB9IHdoaWxlICgwKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1RJTTFfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBTRVRfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfVElNMUVOKTsgICAgICAgICAgIFwNCi0gICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gICBcDQotICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfVElNMUVOKTsgXA0KLSAgICBVTlVTRUQodG1wcmVnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIH0gd2hpbGUgKDApDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfU1BJMV9DTEtfRU5BQkxFKCkgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgX19JTyB1aW50MzJfdCB0bXByZWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIFNFVF9CSVQoUkNDLT5BUEIyRU5SLCBSQ0NfQVBCMkVOUl9TUEkxRU4pOyAgICAgICAgICAgXA0KLSAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyAgIFwNCi0gICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEIyRU5SLCBSQ0NfQVBCMkVOUl9TUEkxRU4pOyBcDQotICAgIFVOVVNFRCh0bXByZWcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgfSB3aGlsZSAoMCkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19USU04X0NMS19FTkFCTEUoKSAgICAgICAgICAgICAgICAgICAgICBcDQotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgU0VUX0JJVChSQ0MtPkFQQjJFTlIsIFJDQ19BUEIyRU5SX1RJTThFTik7ICAgICAgICAgICBcDQotICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovICAgXA0KLSAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQjJFTlIsIFJDQ19BUEIyRU5SX1RJTThFTik7IFwNCi0gICAgVU5VU0VEKHRtcHJlZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICB9IHdoaWxlICgwKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1VTQVJUMV9DTEtfRU5BQkxFKCkgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBTRVRfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfVVNBUlQxRU4pOyAgICAgICAgICAgXA0KLSAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyAgICAgXA0KLSAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQjJFTlIsIFJDQ19BUEIyRU5SX1VTQVJUMUVOKTsgXA0KLSAgICBVTlVTRUQodG1wcmVnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgfSB3aGlsZSAoMCkNCi0NCi0jaWYgZGVmaW5lZChTUEk0KQ0KLSNkZWZpbmUgX19IQUxfUkNDX1NQSTRfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBTRVRfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfU1BJNEVOKTsgICAgICAgICAgIFwNCi0gICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gICBcDQotICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfU1BJNEVOKTsgXA0KLSAgICBVTlVTRUQodG1wcmVnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIH0gd2hpbGUgKDApDQotI2VuZGlmIC8qIFNQSTQgKi8NCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19USU0xNV9DTEtfRU5BQkxFKCkgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgU0VUX0JJVChSQ0MtPkFQQjJFTlIsIFJDQ19BUEIyRU5SX1RJTTE1RU4pOyAgICAgICAgICAgXA0KLSAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyAgICBcDQotICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfVElNMTVFTik7IFwNCi0gICAgVU5VU0VEKHRtcHJlZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgfSB3aGlsZSAoMCkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19USU0xNl9DTEtfRU5BQkxFKCkgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgU0VUX0JJVChSQ0MtPkFQQjJFTlIsIFJDQ19BUEIyRU5SX1RJTTE2RU4pOyAgICAgICAgICAgXA0KLSAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyAgICBcDQotICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfVElNMTZFTik7IFwNCi0gICAgVU5VU0VEKHRtcHJlZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgfSB3aGlsZSAoMCkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19USU0xN19DTEtfRU5BQkxFKCkgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgU0VUX0JJVChSQ0MtPkFQQjJFTlIsIFJDQ19BUEIyRU5SX1RJTTE3RU4pOyAgICAgICAgICAgXA0KLSAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyAgICBcDQotICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfVElNMTdFTik7IFwNCi0gICAgVU5VU0VEKHRtcHJlZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgfSB3aGlsZSAoMCkNCi0NCi0jaWYgZGVmaW5lZChUSU0yMCkNCi0jZGVmaW5lIF9fSEFMX1JDQ19USU0yMF9DTEtfRU5BQkxFKCkgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgU0VUX0JJVChSQ0MtPkFQQjJFTlIsIFJDQ19BUEIyRU5SX1RJTTIwRU4pOyAgICAgICAgICAgXA0KLSAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyAgICBcDQotICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfVElNMjBFTik7IFwNCi0gICAgVU5VU0VEKHRtcHJlZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgfSB3aGlsZSAoMCkNCi0jZW5kaWYgLyogVElNMjAgKi8NCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19TQUkxX0NMS19FTkFCTEUoKSAgICAgICAgICAgICAgICAgICAgICBcDQotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgU0VUX0JJVChSQ0MtPkFQQjJFTlIsIFJDQ19BUEIyRU5SX1NBSTFFTik7ICAgICAgICAgICBcDQotICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovICAgXA0KLSAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQjJFTlIsIFJDQ19BUEIyRU5SX1NBSTFFTik7IFwNCi0gICAgVU5VU0VEKHRtcHJlZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICB9IHdoaWxlICgwKQ0KLQ0KLSNpZiBkZWZpbmVkKEhSVElNMSkNCi0jZGVmaW5lIF9fSEFMX1JDQ19IUlRJTTFfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgX19JTyB1aW50MzJfdCB0bXByZWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgU0VUX0JJVChSQ0MtPkFQQjJFTlIsIFJDQ19BUEIyRU5SX0hSVElNMUVOKTsgICAgICAgICAgIFwNCi0gICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gICAgIFwNCi0gICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEIyRU5SLCBSQ0NfQVBCMkVOUl9IUlRJTTFFTik7IFwNCi0gICAgVU5VU0VEKHRtcHJlZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIH0gd2hpbGUgKDApDQotI2VuZGlmIC8qIEhSVElNMSAqLw0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1NZU0NGR19DTEtfRElTQUJMRSgpIFwNCi0gIENMRUFSX0JJVChSQ0MtPkFQQjJFTlIsIFJDQ19BUEIyRU5SX1NZU0NGR0VOKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1RJTTFfQ0xLX0RJU0FCTEUoKSBDTEVBUl9CSVQoUkNDLT5BUEIyRU5SLCBSQ0NfQVBCMkVOUl9USU0xRU4pDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfU1BJMV9DTEtfRElTQUJMRSgpIENMRUFSX0JJVChSQ0MtPkFQQjJFTlIsIFJDQ19BUEIyRU5SX1NQSTFFTikNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19USU04X0NMS19ESVNBQkxFKCkgQ0xFQVJfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfVElNOEVOKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1VTQVJUMV9DTEtfRElTQUJMRSgpIFwNCi0gIENMRUFSX0JJVChSQ0MtPkFQQjJFTlIsIFJDQ19BUEIyRU5SX1VTQVJUMUVOKQ0KLQ0KLSNpZiBkZWZpbmVkKFNQSTQpDQotI2RlZmluZSBfX0hBTF9SQ0NfU1BJNF9DTEtfRElTQUJMRSgpIENMRUFSX0JJVChSQ0MtPkFQQjJFTlIsIFJDQ19BUEIyRU5SX1NQSTRFTikNCi0jZW5kaWYgLyogU1BJNCAqLw0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1RJTTE1X0NMS19ESVNBQkxFKCkgXA0KLSAgQ0xFQVJfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfVElNMTVFTikNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19USU0xNl9DTEtfRElTQUJMRSgpIFwNCi0gIENMRUFSX0JJVChSQ0MtPkFQQjJFTlIsIFJDQ19BUEIyRU5SX1RJTTE2RU4pDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfVElNMTdfQ0xLX0RJU0FCTEUoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BUEIyRU5SLCBSQ0NfQVBCMkVOUl9USU0xN0VOKQ0KLQ0KLSNpZiBkZWZpbmVkKFRJTTIwKQ0KLSNkZWZpbmUgX19IQUxfUkNDX1RJTTIwX0NMS19ESVNBQkxFKCkgXA0KLSAgQ0xFQVJfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfVElNMjBFTikNCi0jZW5kaWYgLyogVElNMjAgKi8NCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19TQUkxX0NMS19ESVNBQkxFKCkgQ0xFQVJfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfU0FJMUVOKQ0KLQ0KLSNpZiBkZWZpbmVkKEhSVElNMSkNCi0jZGVmaW5lIF9fSEFMX1JDQ19IUlRJTTFfQ0xLX0RJU0FCTEUoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BUEIyRU5SLCBSQ0NfQVBCMkVOUl9IUlRJTTFFTikNCi0jZW5kaWYgLyogSFJUSU0xICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFJDQ19BSEIxX1BlcmlwaGVyYWxfQ2xvY2tfRW5hYmxlX0Rpc2FibGVfU3RhdHVzIEFIQjEgUGVyaXBoZXJhbA0KLSAqIENsb2NrIEVuYWJsZWQgb3IgRGlzYWJsZWQgU3RhdHVzDQotICogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBBSEIxIHBlcmlwaGVyYWwgY2xvY2sgaXMgZW5hYmxlZCBvciBub3QuDQotICogQG5vdGUgICBBZnRlciByZXNldCwgdGhlIHBlcmlwaGVyYWwgY2xvY2sgKHVzZWQgZm9yIHJlZ2lzdGVycyByZWFkL3dyaXRlDQotICogYWNjZXNzKSBpcyBkaXNhYmxlZCBhbmQgdGhlIGFwcGxpY2F0aW9uIHNvZnR3YXJlIGhhcyB0byBlbmFibGUgdGhpcyBjbG9jaw0KLSAqIGJlZm9yZSB1c2luZyBpdC4NCi0gKiBAew0KLSAqLw0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0RNQTFfSVNfQ0xLX0VOQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BSEIxRU5SLCBSQ0NfQUhCMUVOUl9ETUExRU4pICE9IDBVKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0RNQTJfSVNfQ0xLX0VOQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BSEIxRU5SLCBSQ0NfQUhCMUVOUl9ETUEyRU4pICE9IDBVKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0RNQU1VWDFfSVNfQ0xLX0VOQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BSEIxRU5SLCBSQ0NfQUhCMUVOUl9ETUFNVVgxRU4pICE9IDBVKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0NPUkRJQ19JU19DTEtfRU5BQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFIQjFFTlIsIFJDQ19BSEIxRU5SX0NPUkRJQ0VOKSAhPSAwVSkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19GTUFDX0lTX0NMS19FTkFCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QUhCMUVOUiwgUkNDX0FIQjFFTlJfRk1BQ0VOKSAhPSAwVSkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19GTEFTSF9JU19DTEtfRU5BQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFIQjFFTlIsIFJDQ19BSEIxRU5SX0ZMQVNIRU4pICE9IDBVKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0NSQ19JU19DTEtfRU5BQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFIQjFFTlIsIFJDQ19BSEIxRU5SX0NSQ0VOKSAhPSAwVSkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19ETUExX0lTX0NMS19ESVNBQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFIQjFFTlIsIFJDQ19BSEIxRU5SX0RNQTFFTikgPT0gMFUpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfRE1BMl9JU19DTEtfRElTQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BSEIxRU5SLCBSQ0NfQUhCMUVOUl9ETUEyRU4pID09IDBVKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0RNQU1VWDFfSVNfQ0xLX0RJU0FCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QUhCMUVOUiwgUkNDX0FIQjFFTlJfRE1BTVVYMUVOKSA9PSAwVSkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19DT1JESUNfSVNfQ0xLX0RJU0FCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QUhCMUVOUiwgUkNDX0FIQjFFTlJfQ09SRElDRU4pID09IDBVKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0ZNQUNfSVNfQ0xLX0RJU0FCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QUhCMUVOUiwgUkNDX0FIQjFFTlJfRk1BQ0VOKSA9PSAwVSkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19GTEFTSF9JU19DTEtfRElTQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BSEIxRU5SLCBSQ0NfQUhCMUVOUl9GTEFTSEVOKSA9PSAwVSkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19DUkNfSVNfQ0xLX0RJU0FCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QUhCMUVOUiwgUkNDX0FIQjFFTlJfQ1JDRU4pID09IDBVKQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBSQ0NfQUhCMl9DbG9ja19FbmFibGVfRGlzYWJsZV9TdGF0dXMgQUhCMiBQZXJpcGhlcmFsIENsb2NrIEVuYWJsZWQNCi0gKiBvciBEaXNhYmxlZCBTdGF0dXMNCi0gKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIEFIQjIgcGVyaXBoZXJhbCBjbG9jayBpcyBlbmFibGVkIG9yIG5vdC4NCi0gKiBAbm90ZSAgIEFmdGVyIHJlc2V0LCB0aGUgcGVyaXBoZXJhbCBjbG9jayAodXNlZCBmb3IgcmVnaXN0ZXJzIHJlYWQvd3JpdGUNCi0gKiBhY2Nlc3MpIGlzIGRpc2FibGVkIGFuZCB0aGUgYXBwbGljYXRpb24gc29mdHdhcmUgaGFzIHRvIGVuYWJsZSB0aGlzIGNsb2NrDQotICogYmVmb3JlIHVzaW5nIGl0Lg0KLSAqIEB7DQotICovDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0FfSVNfQ0xLX0VOQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BSEIyRU5SLCBSQ0NfQUhCMkVOUl9HUElPQUVOKSAhPSAwVSkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19HUElPQl9JU19DTEtfRU5BQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFIQjJFTlIsIFJDQ19BSEIyRU5SX0dQSU9CRU4pICE9IDBVKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0dQSU9DX0lTX0NMS19FTkFCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfR1BJT0NFTikgIT0gMFUpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0RfSVNfQ0xLX0VOQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BSEIyRU5SLCBSQ0NfQUhCMkVOUl9HUElPREVOKSAhPSAwVSkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19HUElPRV9JU19DTEtfRU5BQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFIQjJFTlIsIFJDQ19BSEIyRU5SX0dQSU9FRU4pICE9IDBVKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0dQSU9GX0lTX0NMS19FTkFCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfR1BJT0ZFTikgIT0gMFUpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0dfSVNfQ0xLX0VOQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BSEIyRU5SLCBSQ0NfQUhCMkVOUl9HUElPR0VOKSAhPSAwVSkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19BREMxMl9JU19DTEtfRU5BQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFIQjJFTlIsIFJDQ19BSEIyRU5SX0FEQzEyRU4pICE9IDBVKQ0KLQ0KLSNpZiBkZWZpbmVkKEFEQzM0NV9DT01NT04pDQotI2RlZmluZSBfX0hBTF9SQ0NfQURDMzQ1X0lTX0NMS19FTkFCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfQURDMzQ1RU4pICE9IDBVKQ0KLSNlbmRpZiAvKiBBREMzNDVfQ09NTU9OICovDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfREFDMV9JU19DTEtfRU5BQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFIQjJFTlIsIFJDQ19BSEIyRU5SX0RBQzFFTikgIT0gMFUpDQotDQotI2lmIGRlZmluZWQoREFDMikNCi0jZGVmaW5lIF9fSEFMX1JDQ19EQUMyX0lTX0NMS19FTkFCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfREFDMkVOKSAhPSAwVSkNCi0jZW5kaWYgLyogREFDMiAqLw0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0RBQzNfSVNfQ0xLX0VOQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BSEIyRU5SLCBSQ0NfQUhCMkVOUl9EQUMzRU4pICE9IDBVKQ0KLQ0KLSNpZiBkZWZpbmVkKERBQzQpDQotI2RlZmluZSBfX0hBTF9SQ0NfREFDNF9JU19DTEtfRU5BQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFIQjJFTlIsIFJDQ19BSEIyRU5SX0RBQzRFTikgIT0gMFUpDQotI2VuZGlmIC8qIERBQzQgKi8NCi0NCi0jaWYgZGVmaW5lZChBRVMpDQotI2RlZmluZSBfX0hBTF9SQ0NfQUVTX0lTX0NMS19FTkFCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfQUVTRU4pICE9IDBVKQ0KLSNlbmRpZiAvKiBBRVMgKi8NCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19STkdfSVNfQ0xLX0VOQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BSEIyRU5SLCBSQ0NfQUhCMkVOUl9STkdFTikgIT0gMFUpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0FfSVNfQ0xLX0RJU0FCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfR1BJT0FFTikgPT0gMFUpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0JfSVNfQ0xLX0RJU0FCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfR1BJT0JFTikgPT0gMFUpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0NfSVNfQ0xLX0RJU0FCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfR1BJT0NFTikgPT0gMFUpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0RfSVNfQ0xLX0RJU0FCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfR1BJT0RFTikgPT0gMFUpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0VfSVNfQ0xLX0RJU0FCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfR1BJT0VFTikgPT0gMFUpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0ZfSVNfQ0xLX0RJU0FCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfR1BJT0ZFTikgPT0gMFUpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0dfSVNfQ0xLX0RJU0FCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfR1BJT0dFTikgPT0gMFUpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfQURDMTJfSVNfQ0xLX0RJU0FCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfQURDMTJFTikgPT0gMFUpDQotDQotI2lmIGRlZmluZWQoQURDMzQ1X0NPTU1PTikNCi0jZGVmaW5lIF9fSEFMX1JDQ19BREMzNDVfSVNfQ0xLX0RJU0FCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfQURDMzQ1RU4pID09IDBVKQ0KLSNlbmRpZiAvKiBBREMzNDVfQ09NTU9OICovDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfREFDMV9JU19DTEtfRElTQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BSEIyRU5SLCBSQ0NfQUhCMkVOUl9EQUMxRU4pID09IDBVKQ0KLQ0KLSNpZiBkZWZpbmVkKERBQzIpDQotI2RlZmluZSBfX0hBTF9SQ0NfREFDMl9JU19DTEtfRElTQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BSEIyRU5SLCBSQ0NfQUhCMkVOUl9EQUMyRU4pID09IDBVKQ0KLSNlbmRpZiAvKiBEQUMyICovDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfREFDM19JU19DTEtfRElTQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BSEIyRU5SLCBSQ0NfQUhCMkVOUl9EQUMzRU4pID09IDBVKQ0KLQ0KLSNpZiBkZWZpbmVkKERBQzQpDQotI2RlZmluZSBfX0hBTF9SQ0NfREFDNF9JU19DTEtfRElTQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BSEIyRU5SLCBSQ0NfQUhCMkVOUl9EQUM0RU4pID09IDBVKQ0KLSNlbmRpZiAvKiBEQUM0ICovDQotDQotI2lmIGRlZmluZWQoQUVTKQ0KLSNkZWZpbmUgX19IQUxfUkNDX0FFU19JU19DTEtfRElTQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BSEIyRU5SLCBSQ0NfQUhCMkVOUl9BRVNFTikgPT0gMFUpDQotI2VuZGlmIC8qIEFFUyAqLw0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1JOR19JU19DTEtfRElTQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BSEIyRU5SLCBSQ0NfQUhCMkVOUl9STkdFTikgPT0gMFUpDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFJDQ19BSEIzX0Nsb2NrX0VuYWJsZV9EaXNhYmxlX1N0YXR1cyBBSEIzIFBlcmlwaGVyYWwgQ2xvY2sgRW5hYmxlZA0KLSAqIG9yIERpc2FibGVkIFN0YXR1cw0KLSAqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgQUhCMyBwZXJpcGhlcmFsIGNsb2NrIGlzIGVuYWJsZWQgb3Igbm90Lg0KLSAqIEBub3RlICAgQWZ0ZXIgcmVzZXQsIHRoZSBwZXJpcGhlcmFsIGNsb2NrICh1c2VkIGZvciByZWdpc3RlcnMgcmVhZC93cml0ZQ0KLSAqIGFjY2VzcykgaXMgZGlzYWJsZWQgYW5kIHRoZSBhcHBsaWNhdGlvbiBzb2Z0d2FyZSBoYXMgdG8gZW5hYmxlIHRoaXMgY2xvY2sNCi0gKiBiZWZvcmUgdXNpbmcgaXQuDQotICogQHsNCi0gKi8NCi0NCi0jaWYgZGVmaW5lZChGTUNfQkFOSzEpDQotI2RlZmluZSBfX0hBTF9SQ0NfRk1DX0lTX0NMS19FTkFCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QUhCM0VOUiwgUkNDX0FIQjNFTlJfRk1DRU4pICE9IDBVKQ0KLSNlbmRpZiAvKiBGTUNfQkFOSzEgKi8NCi0NCi0jaWYgZGVmaW5lZChRVUFEU1BJKQ0KLSNkZWZpbmUgX19IQUxfUkNDX1FTUElfSVNfQ0xLX0VOQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BSEIzRU5SLCBSQ0NfQUhCM0VOUl9RU1BJRU4pICE9IDBVKQ0KLSNlbmRpZiAvKiBRVUFEU1BJICovDQotDQotI2lmIGRlZmluZWQoRk1DX0JBTksxKQ0KLSNkZWZpbmUgX19IQUxfUkNDX0ZNQ19JU19DTEtfRElTQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BSEIzRU5SLCBSQ0NfQUhCM0VOUl9GTUNFTikgPT0gMFUpDQotI2VuZGlmIC8qIEZNQ19CQU5LMSAqLw0KLQ0KLSNpZiBkZWZpbmVkKFFVQURTUEkpDQotI2RlZmluZSBfX0hBTF9SQ0NfUVNQSV9JU19DTEtfRElTQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BSEIzRU5SLCBSQ0NfQUhCM0VOUl9RU1BJRU4pID09IDBVKQ0KLSNlbmRpZiAvKiBRVUFEU1BJICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFJDQ19BUEIxX0Nsb2NrX0VuYWJsZV9EaXNhYmxlX1N0YXR1cyBBUEIxIFBlcmlwaGVyYWwgQ2xvY2sgRW5hYmxlZA0KLSAqIG9yIERpc2FibGVkIFN0YXR1cw0KLSAqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgQVBCMSBwZXJpcGhlcmFsIGNsb2NrIGlzIGVuYWJsZWQgb3Igbm90Lg0KLSAqIEBub3RlICAgQWZ0ZXIgcmVzZXQsIHRoZSBwZXJpcGhlcmFsIGNsb2NrICh1c2VkIGZvciByZWdpc3RlcnMgcmVhZC93cml0ZQ0KLSAqIGFjY2VzcykgaXMgZGlzYWJsZWQgYW5kIHRoZSBhcHBsaWNhdGlvbiBzb2Z0d2FyZSBoYXMgdG8gZW5hYmxlIHRoaXMgY2xvY2sNCi0gKiBiZWZvcmUgdXNpbmcgaXQuDQotICogQHsNCi0gKi8NCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19USU0yX0lTX0NMS19FTkFCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9USU0yRU4pICE9IDBVKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1RJTTNfSVNfQ0xLX0VOQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1RJTTNFTikgIT0gMFUpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfVElNNF9JU19DTEtfRU5BQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfVElNNEVOKSAhPSAwVSkNCi0NCi0jaWYgZGVmaW5lZChUSU01KQ0KLSNkZWZpbmUgX19IQUxfUkNDX1RJTTVfSVNfQ0xLX0VOQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1RJTTVFTikgIT0gMFUpDQotI2VuZGlmIC8qIFRJTTUgKi8NCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19USU02X0lTX0NMS19FTkFCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9USU02RU4pICE9IDBVKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1RJTTdfSVNfQ0xLX0VOQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1RJTTdFTikgIT0gMFUpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfQ1JTX0lTX0NMS19FTkFCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9DUlNFTikgIT0gMFUpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfUlRDQVBCX0lTX0NMS19FTkFCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9SVENBUEJFTikgIT0gMFUpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfV1dER19JU19DTEtfRU5BQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfV1dER0VOKSAhPSAwVSkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19TUEkyX0lTX0NMS19FTkFCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9TUEkyRU4pICE9IDBVKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1NQSTNfSVNfQ0xLX0VOQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1NQSTNFTikgIT0gMFUpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQyX0lTX0NMS19FTkFCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9VU0FSVDJFTikgIT0gMFUpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQzX0lTX0NMS19FTkFCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9VU0FSVDNFTikgIT0gMFUpDQotDQotI2lmIGRlZmluZWQoVUFSVDQpDQotI2RlZmluZSBfX0hBTF9SQ0NfVUFSVDRfSVNfQ0xLX0VOQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1VBUlQ0RU4pICE9IDBVKQ0KLSNlbmRpZiAvKiBVQVJUNCAqLw0KLQ0KLSNpZiBkZWZpbmVkKFVBUlQ1KQ0KLSNkZWZpbmUgX19IQUxfUkNDX1VBUlQ1X0lTX0NMS19FTkFCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9VQVJUNUVOKSAhPSAwVSkNCi0jZW5kaWYgLyogVUFSVDUgKi8NCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19JMkMxX0lTX0NMS19FTkFCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9JMkMxRU4pICE9IDBVKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0kyQzJfSVNfQ0xLX0VOQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX0kyQzJFTikgIT0gMFUpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfVVNCX0lTX0NMS19FTkFCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9VU0JFTikgIT0gMFUpDQotDQotI2lmIGRlZmluZWQoRkRDQU4xKQ0KLSNkZWZpbmUgX19IQUxfUkNDX0ZEQ0FOX0lTX0NMS19FTkFCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9GRENBTkVOKSAhPSAwVSkNCi0jZW5kaWYgLyogRkRDQU4xICovDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfUFdSX0lTX0NMS19FTkFCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9QV1JFTikgIT0gMFUpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfSTJDM19JU19DTEtfRU5BQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfSTJDM0VOKSAhPSAwVSkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19MUFRJTTFfSVNfQ0xLX0VOQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX0xQVElNMUVOKSAhPSAwVSkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19MUFVBUlQxX0lTX0NMS19FTkFCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QVBCMUVOUjIsIFJDQ19BUEIxRU5SMl9MUFVBUlQxRU4pICE9IDBVKQ0KLQ0KLSNpZiBkZWZpbmVkKEkyQzQpDQotI2RlZmluZSBfX0hBTF9SQ0NfSTJDNF9JU19DTEtfRU5BQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIyLCBSQ0NfQVBCMUVOUjJfSTJDNEVOKSAhPSAwVSkNCi0jZW5kaWYgLyogSTJDNCAqLw0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1VDUEQxX0lTX0NMS19FTkFCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QVBCMUVOUjIsIFJDQ19BUEIxRU5SMl9VQ1BEMUVOKSAhPSAwVSkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19USU0yX0lTX0NMS19ESVNBQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfVElNMkVOKSA9PSAwVSkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19USU0zX0lTX0NMS19ESVNBQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfVElNM0VOKSA9PSAwVSkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19USU00X0lTX0NMS19ESVNBQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfVElNNEVOKSA9PSAwVSkNCi0NCi0jaWYgZGVmaW5lZChUSU01KQ0KLSNkZWZpbmUgX19IQUxfUkNDX1RJTTVfSVNfQ0xLX0RJU0FCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9USU01RU4pID09IDBVKQ0KLSNlbmRpZiAvKiBUSU01ICovDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfVElNNl9JU19DTEtfRElTQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1RJTTZFTikgPT0gMFUpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfVElNN19JU19DTEtfRElTQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1RJTTdFTikgPT0gMFUpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfQ1JTX0lTX0NMS19ESVNBQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfQ1JTRU4pID09IDBVKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1JUQ0FQQl9JU19DTEtfRElTQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1JUQ0FQQkVOKSA9PSAwVSkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19XV0RHX0lTX0NMS19ESVNBQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfV1dER0VOKSA9PSAwVSkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19TUEkyX0lTX0NMS19ESVNBQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfU1BJMkVOKSA9PSAwVSkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19TUEkzX0lTX0NMS19ESVNBQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfU1BJM0VOKSA9PSAwVSkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDJfSVNfQ0xLX0RJU0FCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9VU0FSVDJFTikgPT0gMFUpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQzX0lTX0NMS19ESVNBQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfVVNBUlQzRU4pID09IDBVKQ0KLQ0KLSNpZiBkZWZpbmVkKFVBUlQ0KQ0KLSNkZWZpbmUgX19IQUxfUkNDX1VBUlQ0X0lTX0NMS19ESVNBQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfVUFSVDRFTikgPT0gMFUpDQotI2VuZGlmIC8qIFVBUlQ0ICovDQotDQotI2lmIGRlZmluZWQoVUFSVDUpDQotI2RlZmluZSBfX0hBTF9SQ0NfVUFSVDVfSVNfQ0xLX0RJU0FCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9VQVJUNUVOKSA9PSAwVSkNCi0jZW5kaWYgLyogVUFSVDUgKi8NCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19JMkMxX0lTX0NMS19ESVNBQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfSTJDMUVOKSA9PSAwVSkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19JMkMyX0lTX0NMS19ESVNBQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfSTJDMkVOKSA9PSAwVSkNCi0NCi0jaWYgZGVmaW5lZChVU0IpDQotI2RlZmluZSBfX0hBTF9SQ0NfVVNCX0lTX0NMS19ESVNBQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfVVNCRU4pID09IDBVKQ0KLSNlbmRpZiAvKiBVU0IgKi8NCi0NCi0jaWYgZGVmaW5lZChGRENBTjEpDQotI2RlZmluZSBfX0hBTF9SQ0NfRkRDQU5fSVNfQ0xLX0RJU0FCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9GRENBTkVOKSA9PSAwVSkNCi0jZW5kaWYgLyogRkRDQU4xICovDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfUFdSX0lTX0NMS19ESVNBQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfUFdSRU4pID09IDBVKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0kyQzNfSVNfQ0xLX0RJU0FCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9JMkMzRU4pID09IDBVKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0xQVElNMV9JU19DTEtfRElTQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX0xQVElNMUVOKSA9PSAwVSkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19MUFVBUlQxX0lTX0NMS19ESVNBQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIyLCBSQ0NfQVBCMUVOUjJfTFBVQVJUMUVOKSA9PSAwVSkNCi0NCi0jaWYgZGVmaW5lZChJMkM0KQ0KLSNkZWZpbmUgX19IQUxfUkNDX0kyQzRfSVNfQ0xLX0RJU0FCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QVBCMUVOUjIsIFJDQ19BUEIxRU5SMl9JMkM0RU4pID09IDBVKQ0KLSNlbmRpZiAvKiBJMkM0ICovDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfVUNQRDFfSVNfQ0xLX0RJU0FCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QVBCMUVOUjIsIFJDQ19BUEIxRU5SMl9VQ1BEMUVOKSA9PSAwVSkNCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDX0FQQjJfQ2xvY2tfRW5hYmxlX0Rpc2FibGVfU3RhdHVzIEFQQjIgUGVyaXBoZXJhbCBDbG9jayBFbmFibGVkDQotICogb3IgRGlzYWJsZWQgU3RhdHVzDQotICogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBBUEIyIHBlcmlwaGVyYWwgY2xvY2sgaXMgZW5hYmxlZCBvciBub3QuDQotICogQG5vdGUgICBBZnRlciByZXNldCwgdGhlIHBlcmlwaGVyYWwgY2xvY2sgKHVzZWQgZm9yIHJlZ2lzdGVycyByZWFkL3dyaXRlDQotICogYWNjZXNzKSBpcyBkaXNhYmxlZCBhbmQgdGhlIGFwcGxpY2F0aW9uIHNvZnR3YXJlIGhhcyB0byBlbmFibGUgdGhpcyBjbG9jaw0KLSAqIGJlZm9yZSB1c2luZyBpdC4NCi0gKiBAew0KLSAqLw0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1NZU0NGR19JU19DTEtfRU5BQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFQQjJFTlIsIFJDQ19BUEIyRU5SX1NZU0NGR0VOKSAhPSAwVSkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19USU0xX0lTX0NMS19FTkFCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfVElNMUVOKSAhPSAwVSkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19TUEkxX0lTX0NMS19FTkFCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfU1BJMUVOKSAhPSAwVSkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19USU04X0lTX0NMS19FTkFCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfVElNOEVOKSAhPSAwVSkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDFfSVNfQ0xLX0VOQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BUEIyRU5SLCBSQ0NfQVBCMkVOUl9VU0FSVDFFTikgIT0gMFUpDQotDQotI2lmIGRlZmluZWQoU1BJNCkNCi0jZGVmaW5lIF9fSEFMX1JDQ19TUEk0X0lTX0NMS19FTkFCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfU1BJNEVOKSAhPSAwVSkNCi0jZW5kaWYgLyogU1BJNCAqLw0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1RJTTE1X0lTX0NMS19FTkFCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfVElNMTVFTikgIT0gMFUpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfVElNMTZfSVNfQ0xLX0VOQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BUEIyRU5SLCBSQ0NfQVBCMkVOUl9USU0xNkVOKSAhPSAwVSkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19USU0xN19JU19DTEtfRU5BQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFQQjJFTlIsIFJDQ19BUEIyRU5SX1RJTTE3RU4pICE9IDBVKQ0KLQ0KLSNpZiBkZWZpbmVkKFRJTTIwKQ0KLSNkZWZpbmUgX19IQUxfUkNDX1RJTTIwX0lTX0NMS19FTkFCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfVElNMjBFTikgIT0gMFUpDQotI2VuZGlmIC8qIFRJTTIwICovDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfU0FJMV9JU19DTEtfRU5BQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFQQjJFTlIsIFJDQ19BUEIyRU5SX1NBSTFFTikgIT0gMFUpDQotDQotI2lmIGRlZmluZWQoSFJUSU0xKQ0KLSNkZWZpbmUgX19IQUxfUkNDX0hSVElNMV9JU19DTEtfRU5BQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFQQjJFTlIsIFJDQ19BUEIyRU5SX0hSVElNMUVOKSAhPSAwVSkNCi0jZW5kaWYgLyogSFJUSU0xICovDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfU1lTQ0ZHX0lTX0NMS19ESVNBQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFQQjJFTlIsIFJDQ19BUEIyRU5SX1NZU0NGR0VOKSA9PSAwVSkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19USU0xX0lTX0NMS19ESVNBQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFQQjJFTlIsIFJDQ19BUEIyRU5SX1RJTTFFTikgPT0gMFUpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfU1BJMV9JU19DTEtfRElTQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BUEIyRU5SLCBSQ0NfQVBCMkVOUl9TUEkxRU4pID09IDBVKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1RJTThfSVNfQ0xLX0RJU0FCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfVElNOEVOKSA9PSAwVSkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDFfSVNfQ0xLX0RJU0FCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfVVNBUlQxRU4pID09IDBVKQ0KLQ0KLSNpZiBkZWZpbmVkKFNQSTQpDQotI2RlZmluZSBfX0hBTF9SQ0NfU1BJNF9JU19DTEtfRElTQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BUEIyRU5SLCBSQ0NfQVBCMkVOUl9TUEk0RU4pID09IDBVKQ0KLSNlbmRpZiAvKiBTUEk0ICovDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfVElNMTVfSVNfQ0xLX0RJU0FCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfVElNMTVFTikgPT0gMFUpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfVElNMTZfSVNfQ0xLX0RJU0FCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfVElNMTZFTikgPT0gMFUpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfVElNMTdfSVNfQ0xLX0RJU0FCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfVElNMTdFTikgPT0gMFUpDQotDQotI2lmIGRlZmluZWQoVElNMjApDQotI2RlZmluZSBfX0hBTF9SQ0NfVElNMjBfSVNfQ0xLX0RJU0FCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfVElNMjBFTikgPT0gMFUpDQotI2VuZGlmIC8qIFRJTTIwICovDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfU0FJMV9JU19DTEtfRElTQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BUEIyRU5SLCBSQ0NfQVBCMkVOUl9TQUkxRU4pID09IDBVKQ0KLQ0KLSNpZiBkZWZpbmVkKEhSVElNMSkNCi0jZGVmaW5lIF9fSEFMX1JDQ19IUlRJTTFfSVNfQ0xLX0RJU0FCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfSFJUSU0xRU4pID09IDBVKQ0KLSNlbmRpZiAvKiBIUlRJTTEgKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDX0FIQjFfRm9yY2VfUmVsZWFzZV9SZXNldCBBSEIxIFBlcmlwaGVyYWwgRm9yY2UgUmVsZWFzZSBSZXNldA0KLSAqIEBicmllZiAgRm9yY2Ugb3IgcmVsZWFzZSBBSEIxIHBlcmlwaGVyYWwgcmVzZXQuDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1JDQ19BSEIxX0ZPUkNFX1JFU0VUKCkgV1JJVEVfUkVHKFJDQy0+QUhCMVJTVFIsIDB4RkZGRkZGRkZVKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0RNQTFfRk9SQ0VfUkVTRVQoKSBcDQotICBTRVRfQklUKFJDQy0+QUhCMVJTVFIsIFJDQ19BSEIxUlNUUl9ETUExUlNUKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0RNQTJfRk9SQ0VfUkVTRVQoKSBcDQotICBTRVRfQklUKFJDQy0+QUhCMVJTVFIsIFJDQ19BSEIxUlNUUl9ETUEyUlNUKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0RNQU1VWDFfRk9SQ0VfUkVTRVQoKSBcDQotICBTRVRfQklUKFJDQy0+QUhCMVJTVFIsIFJDQ19BSEIxUlNUUl9ETUFNVVgxUlNUKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0NPUkRJQ19GT1JDRV9SRVNFVCgpIFwNCi0gIFNFVF9CSVQoUkNDLT5BSEIxUlNUUiwgUkNDX0FIQjFSU1RSX0NPUkRJQ1JTVCkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19GTUFDX0ZPUkNFX1JFU0VUKCkgXA0KLSAgU0VUX0JJVChSQ0MtPkFIQjFSU1RSLCBSQ0NfQUhCMVJTVFJfRk1BQ1JTVCkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19GTEFTSF9GT1JDRV9SRVNFVCgpIFwNCi0gIFNFVF9CSVQoUkNDLT5BSEIxUlNUUiwgUkNDX0FIQjFSU1RSX0ZMQVNIUlNUKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0NSQ19GT1JDRV9SRVNFVCgpIFNFVF9CSVQoUkNDLT5BSEIxUlNUUiwgUkNDX0FIQjFSU1RSX0NSQ1JTVCkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19BSEIxX1JFTEVBU0VfUkVTRVQoKSBXUklURV9SRUcoUkNDLT5BSEIxUlNUUiwgMHgwMDAwMDAwMFUpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfRE1BMV9SRUxFQVNFX1JFU0VUKCkgXA0KLSAgQ0xFQVJfQklUKFJDQy0+QUhCMVJTVFIsIFJDQ19BSEIxUlNUUl9ETUExUlNUKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0RNQTJfUkVMRUFTRV9SRVNFVCgpIFwNCi0gIENMRUFSX0JJVChSQ0MtPkFIQjFSU1RSLCBSQ0NfQUhCMVJTVFJfRE1BMlJTVCkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19ETUFNVVgxX1JFTEVBU0VfUkVTRVQoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BSEIxUlNUUiwgUkNDX0FIQjFSU1RSX0RNQU1VWDFSU1QpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfQ09SRElDX1JFTEVBU0VfUkVTRVQoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BSEIxUlNUUiwgUkNDX0FIQjFSU1RSX0NPUkRJQ1JTVCkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19GTUFDX1JFTEVBU0VfUkVTRVQoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BSEIxUlNUUiwgUkNDX0FIQjFSU1RSX0ZNQUNSU1QpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfRkxBU0hfUkVMRUFTRV9SRVNFVCgpIFwNCi0gIENMRUFSX0JJVChSQ0MtPkFIQjFSU1RSLCBSQ0NfQUhCMVJTVFJfRkxBU0hSU1QpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfQ1JDX1JFTEVBU0VfUkVTRVQoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BSEIxUlNUUiwgUkNDX0FIQjFSU1RSX0NSQ1JTVCkNCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDX0FIQjJfRm9yY2VfUmVsZWFzZV9SZXNldCBBSEIyIFBlcmlwaGVyYWwgRm9yY2UgUmVsZWFzZSBSZXNldA0KLSAqIEBicmllZiAgRm9yY2Ugb3IgcmVsZWFzZSBBSEIyIHBlcmlwaGVyYWwgcmVzZXQuDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1JDQ19BSEIyX0ZPUkNFX1JFU0VUKCkgV1JJVEVfUkVHKFJDQy0+QUhCMlJTVFIsIDB4RkZGRkZGRkZVKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0dQSU9BX0ZPUkNFX1JFU0VUKCkgXA0KLSAgU0VUX0JJVChSQ0MtPkFIQjJSU1RSLCBSQ0NfQUhCMlJTVFJfR1BJT0FSU1QpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0JfRk9SQ0VfUkVTRVQoKSBcDQotICBTRVRfQklUKFJDQy0+QUhCMlJTVFIsIFJDQ19BSEIyUlNUUl9HUElPQlJTVCkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19HUElPQ19GT1JDRV9SRVNFVCgpIFwNCi0gIFNFVF9CSVQoUkNDLT5BSEIyUlNUUiwgUkNDX0FIQjJSU1RSX0dQSU9DUlNUKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0dQSU9EX0ZPUkNFX1JFU0VUKCkgXA0KLSAgU0VUX0JJVChSQ0MtPkFIQjJSU1RSLCBSQ0NfQUhCMlJTVFJfR1BJT0RSU1QpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0VfRk9SQ0VfUkVTRVQoKSBcDQotICBTRVRfQklUKFJDQy0+QUhCMlJTVFIsIFJDQ19BSEIyUlNUUl9HUElPRVJTVCkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19HUElPRl9GT1JDRV9SRVNFVCgpIFwNCi0gIFNFVF9CSVQoUkNDLT5BSEIyUlNUUiwgUkNDX0FIQjJSU1RSX0dQSU9GUlNUKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0dQSU9HX0ZPUkNFX1JFU0VUKCkgXA0KLSAgU0VUX0JJVChSQ0MtPkFIQjJSU1RSLCBSQ0NfQUhCMlJTVFJfR1BJT0dSU1QpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfQURDMTJfRk9SQ0VfUkVTRVQoKSBcDQotICBTRVRfQklUKFJDQy0+QUhCMlJTVFIsIFJDQ19BSEIyUlNUUl9BREMxMlJTVCkNCi0NCi0jaWYgZGVmaW5lZChBREMzNDVfQ09NTU9OKQ0KLSNkZWZpbmUgX19IQUxfUkNDX0FEQzM0NV9GT1JDRV9SRVNFVCgpIFwNCi0gIFNFVF9CSVQoUkNDLT5BSEIyUlNUUiwgUkNDX0FIQjJSU1RSX0FEQzM0NVJTVCkNCi0jZW5kaWYgLyogQURDMzQ1X0NPTU1PTiAqLw0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0RBQzFfRk9SQ0VfUkVTRVQoKSBcDQotICBTRVRfQklUKFJDQy0+QUhCMlJTVFIsIFJDQ19BSEIyUlNUUl9EQUMxUlNUKQ0KLQ0KLSNpZiBkZWZpbmVkKERBQzIpDQotI2RlZmluZSBfX0hBTF9SQ0NfREFDMl9GT1JDRV9SRVNFVCgpIFwNCi0gIFNFVF9CSVQoUkNDLT5BSEIyUlNUUiwgUkNDX0FIQjJSU1RSX0RBQzJSU1QpDQotI2VuZGlmIC8qIERBQzIgKi8NCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19EQUMzX0ZPUkNFX1JFU0VUKCkgXA0KLSAgU0VUX0JJVChSQ0MtPkFIQjJSU1RSLCBSQ0NfQUhCMlJTVFJfREFDM1JTVCkNCi0NCi0jaWYgZGVmaW5lZChEQUM0KQ0KLSNkZWZpbmUgX19IQUxfUkNDX0RBQzRfRk9SQ0VfUkVTRVQoKSBcDQotICBTRVRfQklUKFJDQy0+QUhCMlJTVFIsIFJDQ19BSEIyUlNUUl9EQUM0UlNUKQ0KLSNlbmRpZiAvKiBEQUM0ICovDQotDQotI2lmIGRlZmluZWQoQUVTKQ0KLSNkZWZpbmUgX19IQUxfUkNDX0FFU19GT1JDRV9SRVNFVCgpIFNFVF9CSVQoUkNDLT5BSEIyUlNUUiwgUkNDX0FIQjJSU1RSX0FFU1JTVCkNCi0jZW5kaWYgLyogQUVTICovDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfUk5HX0ZPUkNFX1JFU0VUKCkgU0VUX0JJVChSQ0MtPkFIQjJSU1RSLCBSQ0NfQUhCMlJTVFJfUk5HUlNUKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0FIQjJfUkVMRUFTRV9SRVNFVCgpIFdSSVRFX1JFRyhSQ0MtPkFIQjJSU1RSLCAweDAwMDAwMDAwVSkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19HUElPQV9SRUxFQVNFX1JFU0VUKCkgXA0KLSAgQ0xFQVJfQklUKFJDQy0+QUhCMlJTVFIsIFJDQ19BSEIyUlNUUl9HUElPQVJTVCkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19HUElPQl9SRUxFQVNFX1JFU0VUKCkgXA0KLSAgQ0xFQVJfQklUKFJDQy0+QUhCMlJTVFIsIFJDQ19BSEIyUlNUUl9HUElPQlJTVCkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19HUElPQ19SRUxFQVNFX1JFU0VUKCkgXA0KLSAgQ0xFQVJfQklUKFJDQy0+QUhCMlJTVFIsIFJDQ19BSEIyUlNUUl9HUElPQ1JTVCkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19HUElPRF9SRUxFQVNFX1JFU0VUKCkgXA0KLSAgQ0xFQVJfQklUKFJDQy0+QUhCMlJTVFIsIFJDQ19BSEIyUlNUUl9HUElPRFJTVCkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19HUElPRV9SRUxFQVNFX1JFU0VUKCkgXA0KLSAgQ0xFQVJfQklUKFJDQy0+QUhCMlJTVFIsIFJDQ19BSEIyUlNUUl9HUElPRVJTVCkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19HUElPRl9SRUxFQVNFX1JFU0VUKCkgXA0KLSAgQ0xFQVJfQklUKFJDQy0+QUhCMlJTVFIsIFJDQ19BSEIyUlNUUl9HUElPRlJTVCkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19HUElPR19SRUxFQVNFX1JFU0VUKCkgXA0KLSAgQ0xFQVJfQklUKFJDQy0+QUhCMlJTVFIsIFJDQ19BSEIyUlNUUl9HUElPR1JTVCkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19BREMxMl9SRUxFQVNFX1JFU0VUKCkgXA0KLSAgQ0xFQVJfQklUKFJDQy0+QUhCMlJTVFIsIFJDQ19BSEIyUlNUUl9BREMxMlJTVCkNCi0NCi0jaWYgZGVmaW5lZChBREMzNDVfQ09NTU9OKQ0KLSNkZWZpbmUgX19IQUxfUkNDX0FEQzM0NV9SRUxFQVNFX1JFU0VUKCkgXA0KLSAgQ0xFQVJfQklUKFJDQy0+QUhCMlJTVFIsIFJDQ19BSEIyUlNUUl9BREMzNDVSU1QpDQotI2VuZGlmIC8qIEFEQzM0NV9DT01NT04gKi8NCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19EQUMxX1JFTEVBU0VfUkVTRVQoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BSEIyUlNUUiwgUkNDX0FIQjJSU1RSX0RBQzFSU1QpDQotDQotI2lmIGRlZmluZWQoREFDMikNCi0jZGVmaW5lIF9fSEFMX1JDQ19EQUMyX1JFTEVBU0VfUkVTRVQoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BSEIyUlNUUiwgUkNDX0FIQjJSU1RSX0RBQzJSU1QpDQotI2VuZGlmIC8qIERBQzIgKi8NCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19EQUMzX1JFTEVBU0VfUkVTRVQoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BSEIyUlNUUiwgUkNDX0FIQjJSU1RSX0RBQzNSU1QpDQotDQotI2lmIGRlZmluZWQoREFDNCkNCi0jZGVmaW5lIF9fSEFMX1JDQ19EQUM0X1JFTEVBU0VfUkVTRVQoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BSEIyUlNUUiwgUkNDX0FIQjJSU1RSX0RBQzRSU1QpDQotI2VuZGlmIC8qIERBQzQgKi8NCi0NCi0jaWYgZGVmaW5lZChBRVMpDQotI2RlZmluZSBfX0hBTF9SQ0NfQUVTX1JFTEVBU0VfUkVTRVQoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BSEIyUlNUUiwgUkNDX0FIQjJSU1RSX0FFU1JTVCkNCi0jZW5kaWYgLyogQUVTICovDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfUk5HX1JFTEVBU0VfUkVTRVQoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BSEIyUlNUUiwgUkNDX0FIQjJSU1RSX1JOR1JTVCkNCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDX0FIQjNfRm9yY2VfUmVsZWFzZV9SZXNldCBBSEIzIFBlcmlwaGVyYWwgRm9yY2UgUmVsZWFzZSBSZXNldA0KLSAqIEBicmllZiAgRm9yY2Ugb3IgcmVsZWFzZSBBSEIzIHBlcmlwaGVyYWwgcmVzZXQuDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1JDQ19BSEIzX0ZPUkNFX1JFU0VUKCkgV1JJVEVfUkVHKFJDQy0+QUhCM1JTVFIsIDB4RkZGRkZGRkZVKQ0KLQ0KLSNpZiBkZWZpbmVkKEZNQ19CQU5LMSkNCi0jZGVmaW5lIF9fSEFMX1JDQ19GTUNfRk9SQ0VfUkVTRVQoKSBTRVRfQklUKFJDQy0+QUhCM1JTVFIsIFJDQ19BSEIzUlNUUl9GTUNSU1QpDQotI2VuZGlmIC8qIEZNQ19CQU5LMSAqLw0KLQ0KLSNpZiBkZWZpbmVkKFFVQURTUEkpDQotI2RlZmluZSBfX0hBTF9SQ0NfUVNQSV9GT1JDRV9SRVNFVCgpIFwNCi0gIFNFVF9CSVQoUkNDLT5BSEIzUlNUUiwgUkNDX0FIQjNSU1RSX1FTUElSU1QpDQotI2VuZGlmIC8qIFFVQURTUEkgKi8NCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19BSEIzX1JFTEVBU0VfUkVTRVQoKSBXUklURV9SRUcoUkNDLT5BSEIzUlNUUiwgMHgwMDAwMDAwMFUpDQotDQotI2lmIGRlZmluZWQoRk1DX0JBTksxKQ0KLSNkZWZpbmUgX19IQUxfUkNDX0ZNQ19SRUxFQVNFX1JFU0VUKCkgXA0KLSAgQ0xFQVJfQklUKFJDQy0+QUhCM1JTVFIsIFJDQ19BSEIzUlNUUl9GTUNSU1QpDQotI2VuZGlmIC8qIEZNQ19CQU5LMSAqLw0KLQ0KLSNpZiBkZWZpbmVkKFFVQURTUEkpDQotI2RlZmluZSBfX0hBTF9SQ0NfUVNQSV9SRUxFQVNFX1JFU0VUKCkgXA0KLSAgQ0xFQVJfQklUKFJDQy0+QUhCM1JTVFIsIFJDQ19BSEIzUlNUUl9RU1BJUlNUKQ0KLSNlbmRpZiAvKiBRVUFEU1BJICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFJDQ19BUEIxX0ZvcmNlX1JlbGVhc2VfUmVzZXQgQVBCMSBQZXJpcGhlcmFsIEZvcmNlIFJlbGVhc2UgUmVzZXQNCi0gKiBAYnJpZWYgIEZvcmNlIG9yIHJlbGVhc2UgQVBCMSBwZXJpcGhlcmFsIHJlc2V0Lg0KLSAqIEB7DQotICovDQotI2RlZmluZSBfX0hBTF9SQ0NfQVBCMV9GT1JDRV9SRVNFVCgpIFdSSVRFX1JFRyhSQ0MtPkFQQjFSU1RSMSwgMHhGRkZGRkZGRlUpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfVElNMl9GT1JDRV9SRVNFVCgpIFwNCi0gIFNFVF9CSVQoUkNDLT5BUEIxUlNUUjEsIFJDQ19BUEIxUlNUUjFfVElNMlJTVCkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19USU0zX0ZPUkNFX1JFU0VUKCkgXA0KLSAgU0VUX0JJVChSQ0MtPkFQQjFSU1RSMSwgUkNDX0FQQjFSU1RSMV9USU0zUlNUKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1RJTTRfRk9SQ0VfUkVTRVQoKSBcDQotICBTRVRfQklUKFJDQy0+QVBCMVJTVFIxLCBSQ0NfQVBCMVJTVFIxX1RJTTRSU1QpDQotDQotI2lmIGRlZmluZWQoVElNNSkNCi0jZGVmaW5lIF9fSEFMX1JDQ19USU01X0ZPUkNFX1JFU0VUKCkgXA0KLSAgU0VUX0JJVChSQ0MtPkFQQjFSU1RSMSwgUkNDX0FQQjFSU1RSMV9USU01UlNUKQ0KLSNlbmRpZiAvKiBUSU01ICovDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfVElNNl9GT1JDRV9SRVNFVCgpIFwNCi0gIFNFVF9CSVQoUkNDLT5BUEIxUlNUUjEsIFJDQ19BUEIxUlNUUjFfVElNNlJTVCkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19USU03X0ZPUkNFX1JFU0VUKCkgXA0KLSAgU0VUX0JJVChSQ0MtPkFQQjFSU1RSMSwgUkNDX0FQQjFSU1RSMV9USU03UlNUKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0NSU19GT1JDRV9SRVNFVCgpIFwNCi0gIFNFVF9CSVQoUkNDLT5BUEIxUlNUUjEsIFJDQ19BUEIxUlNUUjFfQ1JTUlNUKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1NQSTJfRk9SQ0VfUkVTRVQoKSBcDQotICBTRVRfQklUKFJDQy0+QVBCMVJTVFIxLCBSQ0NfQVBCMVJTVFIxX1NQSTJSU1QpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfU1BJM19GT1JDRV9SRVNFVCgpIFwNCi0gIFNFVF9CSVQoUkNDLT5BUEIxUlNUUjEsIFJDQ19BUEIxUlNUUjFfU1BJM1JTVCkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDJfRk9SQ0VfUkVTRVQoKSBcDQotICBTRVRfQklUKFJDQy0+QVBCMVJTVFIxLCBSQ0NfQVBCMVJTVFIxX1VTQVJUMlJTVCkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDNfRk9SQ0VfUkVTRVQoKSBcDQotICBTRVRfQklUKFJDQy0+QVBCMVJTVFIxLCBSQ0NfQVBCMVJTVFIxX1VTQVJUM1JTVCkNCi0NCi0jaWYgZGVmaW5lZChVQVJUNCkNCi0jZGVmaW5lIF9fSEFMX1JDQ19VQVJUNF9GT1JDRV9SRVNFVCgpIFwNCi0gIFNFVF9CSVQoUkNDLT5BUEIxUlNUUjEsIFJDQ19BUEIxUlNUUjFfVUFSVDRSU1QpDQotI2VuZGlmIC8qIFVBUlQ0ICovDQotDQotI2lmIGRlZmluZWQoVUFSVDUpDQotI2RlZmluZSBfX0hBTF9SQ0NfVUFSVDVfRk9SQ0VfUkVTRVQoKSBcDQotICBTRVRfQklUKFJDQy0+QVBCMVJTVFIxLCBSQ0NfQVBCMVJTVFIxX1VBUlQ1UlNUKQ0KLSNlbmRpZiAvKiBVQVJUNSAqLw0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0kyQzFfRk9SQ0VfUkVTRVQoKSBcDQotICBTRVRfQklUKFJDQy0+QVBCMVJTVFIxLCBSQ0NfQVBCMVJTVFIxX0kyQzFSU1QpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfSTJDMl9GT1JDRV9SRVNFVCgpIFwNCi0gIFNFVF9CSVQoUkNDLT5BUEIxUlNUUjEsIFJDQ19BUEIxUlNUUjFfSTJDMlJTVCkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19VU0JfRk9SQ0VfUkVTRVQoKSBcDQotICBTRVRfQklUKFJDQy0+QVBCMVJTVFIxLCBSQ0NfQVBCMVJTVFIxX1VTQlJTVCkNCi0NCi0jaWYgZGVmaW5lZChGRENBTjEpDQotI2RlZmluZSBfX0hBTF9SQ0NfRkRDQU5fRk9SQ0VfUkVTRVQoKSBcDQotICBTRVRfQklUKFJDQy0+QVBCMVJTVFIxLCBSQ0NfQVBCMVJTVFIxX0ZEQ0FOUlNUKQ0KLSNlbmRpZiAvKiBGRENBTjEgKi8NCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19QV1JfRk9SQ0VfUkVTRVQoKSBcDQotICBTRVRfQklUKFJDQy0+QVBCMVJTVFIxLCBSQ0NfQVBCMVJTVFIxX1BXUlJTVCkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19JMkMzX0ZPUkNFX1JFU0VUKCkgXA0KLSAgU0VUX0JJVChSQ0MtPkFQQjFSU1RSMSwgUkNDX0FQQjFSU1RSMV9JMkMzUlNUKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0xQVElNMV9GT1JDRV9SRVNFVCgpIFwNCi0gIFNFVF9CSVQoUkNDLT5BUEIxUlNUUjEsIFJDQ19BUEIxUlNUUjFfTFBUSU0xUlNUKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0xQVUFSVDFfRk9SQ0VfUkVTRVQoKSBcDQotICBTRVRfQklUKFJDQy0+QVBCMVJTVFIyLCBSQ0NfQVBCMVJTVFIyX0xQVUFSVDFSU1QpDQotDQotI2lmIGRlZmluZWQoSTJDNCkNCi0jZGVmaW5lIF9fSEFMX1JDQ19JMkM0X0ZPUkNFX1JFU0VUKCkgXA0KLSAgU0VUX0JJVChSQ0MtPkFQQjFSU1RSMiwgUkNDX0FQQjFSU1RSMl9JMkM0UlNUKQ0KLSNlbmRpZiAvKiBJMkM0ICovDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfVUNQRDFfRk9SQ0VfUkVTRVQoKSBcDQotICBTRVRfQklUKFJDQy0+QVBCMVJTVFIyLCBSQ0NfQVBCMVJTVFIyX1VDUEQxUlNUKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0FQQjFfUkVMRUFTRV9SRVNFVCgpIFdSSVRFX1JFRyhSQ0MtPkFQQjFSU1RSMSwgMHgwMDAwMDAwMFUpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfVElNMl9SRUxFQVNFX1JFU0VUKCkgXA0KLSAgQ0xFQVJfQklUKFJDQy0+QVBCMVJTVFIxLCBSQ0NfQVBCMVJTVFIxX1RJTTJSU1QpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfVElNM19SRUxFQVNFX1JFU0VUKCkgXA0KLSAgQ0xFQVJfQklUKFJDQy0+QVBCMVJTVFIxLCBSQ0NfQVBCMVJTVFIxX1RJTTNSU1QpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfVElNNF9SRUxFQVNFX1JFU0VUKCkgXA0KLSAgQ0xFQVJfQklUKFJDQy0+QVBCMVJTVFIxLCBSQ0NfQVBCMVJTVFIxX1RJTTRSU1QpDQotDQotI2lmIGRlZmluZWQoVElNNSkNCi0jZGVmaW5lIF9fSEFMX1JDQ19USU01X1JFTEVBU0VfUkVTRVQoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BUEIxUlNUUjEsIFJDQ19BUEIxUlNUUjFfVElNNVJTVCkNCi0jZW5kaWYgLyogVElNNSAqLw0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1RJTTZfUkVMRUFTRV9SRVNFVCgpIFwNCi0gIENMRUFSX0JJVChSQ0MtPkFQQjFSU1RSMSwgUkNDX0FQQjFSU1RSMV9USU02UlNUKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1RJTTdfUkVMRUFTRV9SRVNFVCgpIFwNCi0gIENMRUFSX0JJVChSQ0MtPkFQQjFSU1RSMSwgUkNDX0FQQjFSU1RSMV9USU03UlNUKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0NSU19SRUxFQVNFX1JFU0VUKCkgXA0KLSAgQ0xFQVJfQklUKFJDQy0+QVBCMVJTVFIxLCBSQ0NfQVBCMVJTVFIxX0NSU1JTVCkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19TUEkyX1JFTEVBU0VfUkVTRVQoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BUEIxUlNUUjEsIFJDQ19BUEIxUlNUUjFfU1BJMlJTVCkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19TUEkzX1JFTEVBU0VfUkVTRVQoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BUEIxUlNUUjEsIFJDQ19BUEIxUlNUUjFfU1BJM1JTVCkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDJfUkVMRUFTRV9SRVNFVCgpIFwNCi0gIENMRUFSX0JJVChSQ0MtPkFQQjFSU1RSMSwgUkNDX0FQQjFSU1RSMV9VU0FSVDJSU1QpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQzX1JFTEVBU0VfUkVTRVQoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BUEIxUlNUUjEsIFJDQ19BUEIxUlNUUjFfVVNBUlQzUlNUKQ0KLQ0KLSNpZiBkZWZpbmVkKFVBUlQ0KQ0KLSNkZWZpbmUgX19IQUxfUkNDX1VBUlQ0X1JFTEVBU0VfUkVTRVQoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BUEIxUlNUUjEsIFJDQ19BUEIxUlNUUjFfVUFSVDRSU1QpDQotI2VuZGlmIC8qIFVBUlQ0ICovDQotDQotI2lmIGRlZmluZWQoVUFSVDUpDQotI2RlZmluZSBfX0hBTF9SQ0NfVUFSVDVfUkVMRUFTRV9SRVNFVCgpIFwNCi0gIENMRUFSX0JJVChSQ0MtPkFQQjFSU1RSMSwgUkNDX0FQQjFSU1RSMV9VQVJUNVJTVCkNCi0jZW5kaWYgLyogVUFSVDUgKi8NCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19JMkMxX1JFTEVBU0VfUkVTRVQoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BUEIxUlNUUjEsIFJDQ19BUEIxUlNUUjFfSTJDMVJTVCkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19JMkMyX1JFTEVBU0VfUkVTRVQoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BUEIxUlNUUjEsIFJDQ19BUEIxUlNUUjFfSTJDMlJTVCkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19VU0JfUkVMRUFTRV9SRVNFVCgpIFwNCi0gIENMRUFSX0JJVChSQ0MtPkFQQjFSU1RSMSwgUkNDX0FQQjFSU1RSMV9VU0JSU1QpDQotDQotI2lmIGRlZmluZWQoRkRDQU4xKQ0KLSNkZWZpbmUgX19IQUxfUkNDX0ZEQ0FOX1JFTEVBU0VfUkVTRVQoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BUEIxUlNUUjEsIFJDQ19BUEIxUlNUUjFfRkRDQU5SU1QpDQotI2VuZGlmIC8qIEZEQ0FOMSAqLw0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1BXUl9SRUxFQVNFX1JFU0VUKCkgXA0KLSAgQ0xFQVJfQklUKFJDQy0+QVBCMVJTVFIxLCBSQ0NfQVBCMVJTVFIxX1BXUlJTVCkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19JMkMzX1JFTEVBU0VfUkVTRVQoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BUEIxUlNUUjEsIFJDQ19BUEIxUlNUUjFfSTJDM1JTVCkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19MUFRJTTFfUkVMRUFTRV9SRVNFVCgpIFwNCi0gIENMRUFSX0JJVChSQ0MtPkFQQjFSU1RSMSwgUkNDX0FQQjFSU1RSMV9MUFRJTTFSU1QpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfTFBVQVJUMV9SRUxFQVNFX1JFU0VUKCkgXA0KLSAgQ0xFQVJfQklUKFJDQy0+QVBCMVJTVFIyLCBSQ0NfQVBCMVJTVFIyX0xQVUFSVDFSU1QpDQotDQotI2lmIGRlZmluZWQoSTJDNCkNCi0jZGVmaW5lIF9fSEFMX1JDQ19JMkM0X1JFTEVBU0VfUkVTRVQoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BUEIxUlNUUjIsIFJDQ19BUEIxUlNUUjJfSTJDNFJTVCkNCi0jZW5kaWYgLyogSTJDNCAqLw0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1VDUEQxX1JFTEVBU0VfUkVTRVQoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BUEIxUlNUUjIsIFJDQ19BUEIxUlNUUjJfVUNQRDFSU1QpDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFJDQ19BUEIyX0ZvcmNlX1JlbGVhc2VfUmVzZXQgQVBCMiBQZXJpcGhlcmFsIEZvcmNlIFJlbGVhc2UgUmVzZXQNCi0gKiBAYnJpZWYgIEZvcmNlIG9yIHJlbGVhc2UgQVBCMiBwZXJpcGhlcmFsIHJlc2V0Lg0KLSAqIEB7DQotICovDQotI2RlZmluZSBfX0hBTF9SQ0NfQVBCMl9GT1JDRV9SRVNFVCgpIFdSSVRFX1JFRyhSQ0MtPkFQQjJSU1RSLCAweEZGRkZGRkZGVSkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19TWVNDRkdfRk9SQ0VfUkVTRVQoKSBcDQotICBTRVRfQklUKFJDQy0+QVBCMlJTVFIsIFJDQ19BUEIyUlNUUl9TWVNDRkdSU1QpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfVElNMV9GT1JDRV9SRVNFVCgpIFwNCi0gIFNFVF9CSVQoUkNDLT5BUEIyUlNUUiwgUkNDX0FQQjJSU1RSX1RJTTFSU1QpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfU1BJMV9GT1JDRV9SRVNFVCgpIFwNCi0gIFNFVF9CSVQoUkNDLT5BUEIyUlNUUiwgUkNDX0FQQjJSU1RSX1NQSTFSU1QpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfVElNOF9GT1JDRV9SRVNFVCgpIFwNCi0gIFNFVF9CSVQoUkNDLT5BUEIyUlNUUiwgUkNDX0FQQjJSU1RSX1RJTThSU1QpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQxX0ZPUkNFX1JFU0VUKCkgXA0KLSAgU0VUX0JJVChSQ0MtPkFQQjJSU1RSLCBSQ0NfQVBCMlJTVFJfVVNBUlQxUlNUKQ0KLQ0KLSNpZiBkZWZpbmVkKFNQSTQpDQotI2RlZmluZSBfX0hBTF9SQ0NfU1BJNF9GT1JDRV9SRVNFVCgpIFwNCi0gIFNFVF9CSVQoUkNDLT5BUEIyUlNUUiwgUkNDX0FQQjJSU1RSX1NQSTRSU1QpDQotI2VuZGlmIC8qIFNQSTQgKi8NCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19USU0xNV9GT1JDRV9SRVNFVCgpIFwNCi0gIFNFVF9CSVQoUkNDLT5BUEIyUlNUUiwgUkNDX0FQQjJSU1RSX1RJTTE1UlNUKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1RJTTE2X0ZPUkNFX1JFU0VUKCkgXA0KLSAgU0VUX0JJVChSQ0MtPkFQQjJSU1RSLCBSQ0NfQVBCMlJTVFJfVElNMTZSU1QpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfVElNMTdfRk9SQ0VfUkVTRVQoKSBcDQotICBTRVRfQklUKFJDQy0+QVBCMlJTVFIsIFJDQ19BUEIyUlNUUl9USU0xN1JTVCkNCi0NCi0jaWYgZGVmaW5lZChUSU0yMCkNCi0jZGVmaW5lIF9fSEFMX1JDQ19USU0yMF9GT1JDRV9SRVNFVCgpIFwNCi0gIFNFVF9CSVQoUkNDLT5BUEIyUlNUUiwgUkNDX0FQQjJSU1RSX1RJTTIwUlNUKQ0KLSNlbmRpZiAvKiBUSU0yMCAqLw0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1NBSTFfRk9SQ0VfUkVTRVQoKSBcDQotICBTRVRfQklUKFJDQy0+QVBCMlJTVFIsIFJDQ19BUEIyUlNUUl9TQUkxUlNUKQ0KLQ0KLSNpZiBkZWZpbmVkKEhSVElNMSkNCi0jZGVmaW5lIF9fSEFMX1JDQ19IUlRJTTFfRk9SQ0VfUkVTRVQoKSBcDQotICBTRVRfQklUKFJDQy0+QVBCMlJTVFIsIFJDQ19BUEIyUlNUUl9IUlRJTTFSU1QpDQotI2VuZGlmIC8qIEhSVElNMSAqLw0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0FQQjJfUkVMRUFTRV9SRVNFVCgpIFdSSVRFX1JFRyhSQ0MtPkFQQjJSU1RSLCAweDAwMDAwMDAwVSkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19TWVNDRkdfUkVMRUFTRV9SRVNFVCgpIFwNCi0gIENMRUFSX0JJVChSQ0MtPkFQQjJSU1RSLCBSQ0NfQVBCMlJTVFJfU1lTQ0ZHUlNUKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1RJTTFfUkVMRUFTRV9SRVNFVCgpIFwNCi0gIENMRUFSX0JJVChSQ0MtPkFQQjJSU1RSLCBSQ0NfQVBCMlJTVFJfVElNMVJTVCkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19TUEkxX1JFTEVBU0VfUkVTRVQoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BUEIyUlNUUiwgUkNDX0FQQjJSU1RSX1NQSTFSU1QpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfVElNOF9SRUxFQVNFX1JFU0VUKCkgXA0KLSAgQ0xFQVJfQklUKFJDQy0+QVBCMlJTVFIsIFJDQ19BUEIyUlNUUl9USU04UlNUKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1VTQVJUMV9SRUxFQVNFX1JFU0VUKCkgXA0KLSAgQ0xFQVJfQklUKFJDQy0+QVBCMlJTVFIsIFJDQ19BUEIyUlNUUl9VU0FSVDFSU1QpDQotDQotI2lmIGRlZmluZWQoU1BJNCkNCi0jZGVmaW5lIF9fSEFMX1JDQ19TUEk0X1JFTEVBU0VfUkVTRVQoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BUEIyUlNUUiwgUkNDX0FQQjJSU1RSX1NQSTRSU1QpDQotI2VuZGlmIC8qIFNQSTQgKi8NCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19USU0xNV9SRUxFQVNFX1JFU0VUKCkgXA0KLSAgQ0xFQVJfQklUKFJDQy0+QVBCMlJTVFIsIFJDQ19BUEIyUlNUUl9USU0xNVJTVCkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19USU0xNl9SRUxFQVNFX1JFU0VUKCkgXA0KLSAgQ0xFQVJfQklUKFJDQy0+QVBCMlJTVFIsIFJDQ19BUEIyUlNUUl9USU0xNlJTVCkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19USU0xN19SRUxFQVNFX1JFU0VUKCkgXA0KLSAgQ0xFQVJfQklUKFJDQy0+QVBCMlJTVFIsIFJDQ19BUEIyUlNUUl9USU0xN1JTVCkNCi0NCi0jaWYgZGVmaW5lZChUSU0yMCkNCi0jZGVmaW5lIF9fSEFMX1JDQ19USU0yMF9SRUxFQVNFX1JFU0VUKCkgXA0KLSAgQ0xFQVJfQklUKFJDQy0+QVBCMlJTVFIsIFJDQ19BUEIyUlNUUl9USU0yMFJTVCkNCi0jZW5kaWYgLyogVElNMjAgKi8NCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19TQUkxX1JFTEVBU0VfUkVTRVQoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BUEIyUlNUUiwgUkNDX0FQQjJSU1RSX1NBSTFSU1QpDQotDQotI2lmIGRlZmluZWQoSFJUSU0xKQ0KLSNkZWZpbmUgX19IQUxfUkNDX0hSVElNMV9SRUxFQVNFX1JFU0VUKCkgXA0KLSAgQ0xFQVJfQklUKFJDQy0+QVBCMlJTVFIsIFJDQ19BUEIyUlNUUl9IUlRJTTFSU1QpDQotI2VuZGlmIC8qIEhSVElNMSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBSQ0NfQUhCMV9DbG9ja19TbGVlcF9FbmFibGVfRGlzYWJsZSBBSEIxIFBlcmlwaGVyYWwgQ2xvY2sgU2xlZXANCi0gKiBFbmFibGUgRGlzYWJsZQ0KLSAqIEBicmllZiAgRW5hYmxlIG9yIGRpc2FibGUgdGhlIEFIQjEgcGVyaXBoZXJhbCBjbG9jayBkdXJpbmcgTG93IFBvd2VyIChTbGVlcCkNCi0gKiBtb2RlLg0KLSAqIEBub3RlICAgUGVyaXBoZXJhbCBjbG9jayBnYXRpbmcgaW4gU0xFRVAgbW9kZSBjYW4gYmUgdXNlZCB0byBmdXJ0aGVyIHJlZHVjZQ0KLSAqICAgICAgICAgcG93ZXIgY29uc3VtcHRpb24uDQotICogQG5vdGUgICBBZnRlciB3YWtldXAgZnJvbSBTTEVFUCBtb2RlLCB0aGUgcGVyaXBoZXJhbCBjbG9jayBpcyBlbmFibGVkIGFnYWluLg0KLSAqIEBub3RlICAgQnkgZGVmYXVsdCwgYWxsIHBlcmlwaGVyYWwgY2xvY2tzIGFyZSBlbmFibGVkIGR1cmluZyBTTEVFUCBtb2RlLg0KLSAqIEB7DQotICovDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfRE1BMV9DTEtfU0xFRVBfRU5BQkxFKCkgXA0KLSAgU0VUX0JJVChSQ0MtPkFIQjFTTUVOUiwgUkNDX0FIQjFTTUVOUl9ETUExU01FTikNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19ETUEyX0NMS19TTEVFUF9FTkFCTEUoKSBcDQotICBTRVRfQklUKFJDQy0+QUhCMVNNRU5SLCBSQ0NfQUhCMVNNRU5SX0RNQTJTTUVOKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0RNQU1VWDFfQ0xLX1NMRUVQX0VOQUJMRSgpIFwNCi0gIFNFVF9CSVQoUkNDLT5BSEIxU01FTlIsIFJDQ19BSEIxU01FTlJfRE1BTVVYMVNNRU4pDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfQ09SRElDX0NMS19TTEVFUF9FTkFCTEUoKSBcDQotICBTRVRfQklUKFJDQy0+QUhCMVNNRU5SLCBSQ0NfQUhCMVNNRU5SX0NPUkRJQ1NNRU4pDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfRk1BQ19DTEtfU0xFRVBfRU5BQkxFKCkgXA0KLSAgU0VUX0JJVChSQ0MtPkFIQjFTTUVOUiwgUkNDX0FIQjFTTUVOUl9GTUFDU01FTikNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19GTEFTSF9DTEtfU0xFRVBfRU5BQkxFKCkgXA0KLSAgU0VUX0JJVChSQ0MtPkFIQjFTTUVOUiwgUkNDX0FIQjFTTUVOUl9GTEFTSFNNRU4pDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfU1JBTTFfQ0xLX1NMRUVQX0VOQUJMRSgpIFwNCi0gIFNFVF9CSVQoUkNDLT5BSEIxU01FTlIsIFJDQ19BSEIxU01FTlJfU1JBTTFTTUVOKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0NSQ19DTEtfU0xFRVBfRU5BQkxFKCkgXA0KLSAgU0VUX0JJVChSQ0MtPkFIQjFTTUVOUiwgUkNDX0FIQjFTTUVOUl9DUkNTTUVOKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0RNQTFfQ0xLX1NMRUVQX0RJU0FCTEUoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BSEIxU01FTlIsIFJDQ19BSEIxU01FTlJfRE1BMVNNRU4pDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfRE1BMl9DTEtfU0xFRVBfRElTQUJMRSgpIFwNCi0gIENMRUFSX0JJVChSQ0MtPkFIQjFTTUVOUiwgUkNDX0FIQjFTTUVOUl9ETUEyU01FTikNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19ETUFNVVgxX0NMS19TTEVFUF9ESVNBQkxFKCkgXA0KLSAgQ0xFQVJfQklUKFJDQy0+QUhCMVNNRU5SLCBSQ0NfQUhCMVNNRU5SX0RNQU1VWDFTTUVOKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0NPUkRJQ19DTEtfU0xFRVBfRElTQUJMRSgpIFwNCi0gIENMRUFSX0JJVChSQ0MtPkFIQjFTTUVOUiwgUkNDX0FIQjFTTUVOUl9DT1JESUNTTUVOKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0ZNQUNfQ0xLX1NMRUVQX0RJU0FCTEUoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BSEIxU01FTlIsIFJDQ19BSEIxU01FTlJfRk1BQ1NNRU4pDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfRkxBU0hfQ0xLX1NMRUVQX0RJU0FCTEUoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BSEIxU01FTlIsIFJDQ19BSEIxU01FTlJfRkxBU0hTTUVOKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1NSQU0xX0NMS19TTEVFUF9ESVNBQkxFKCkgXA0KLSAgQ0xFQVJfQklUKFJDQy0+QUhCMVNNRU5SLCBSQ0NfQUhCMVNNRU5SX1NSQU0xU01FTikNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19DUkNfQ0xLX1NMRUVQX0RJU0FCTEUoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BSEIxU01FTlIsIFJDQ19BSEIxU01FTlJfQ1JDU01FTikNCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDX0FIQjJfQ2xvY2tfU2xlZXBfRW5hYmxlX0Rpc2FibGUgQUhCMiBQZXJpcGhlcmFsIENsb2NrIFNsZWVwDQotICogRW5hYmxlIERpc2FibGUNCi0gKiBAYnJpZWYgIEVuYWJsZSBvciBkaXNhYmxlIHRoZSBBSEIyIHBlcmlwaGVyYWwgY2xvY2sgZHVyaW5nIExvdyBQb3dlciAoU2xlZXApDQotICogbW9kZS4NCi0gKiBAbm90ZSAgIFBlcmlwaGVyYWwgY2xvY2sgZ2F0aW5nIGluIFNMRUVQIG1vZGUgY2FuIGJlIHVzZWQgdG8gZnVydGhlciByZWR1Y2UNCi0gKiAgICAgICAgIHBvd2VyIGNvbnN1bXB0aW9uLg0KLSAqIEBub3RlICAgQWZ0ZXIgd2FrZXVwIGZyb20gU0xFRVAgbW9kZSwgdGhlIHBlcmlwaGVyYWwgY2xvY2sgaXMgZW5hYmxlZCBhZ2Fpbi4NCi0gKiBAbm90ZSAgIEJ5IGRlZmF1bHQsIGFsbCBwZXJpcGhlcmFsIGNsb2NrcyBhcmUgZW5hYmxlZCBkdXJpbmcgU0xFRVAgbW9kZS4NCi0gKiBAew0KLSAqLw0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0dQSU9BX0NMS19TTEVFUF9FTkFCTEUoKSBcDQotICBTRVRfQklUKFJDQy0+QUhCMlNNRU5SLCBSQ0NfQUhCMlNNRU5SX0dQSU9BU01FTikNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19HUElPQl9DTEtfU0xFRVBfRU5BQkxFKCkgXA0KLSAgU0VUX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9HUElPQlNNRU4pDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0NfQ0xLX1NMRUVQX0VOQUJMRSgpIFwNCi0gIFNFVF9CSVQoUkNDLT5BSEIyU01FTlIsIFJDQ19BSEIyU01FTlJfR1BJT0NTTUVOKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0dQSU9EX0NMS19TTEVFUF9FTkFCTEUoKSBcDQotICBTRVRfQklUKFJDQy0+QUhCMlNNRU5SLCBSQ0NfQUhCMlNNRU5SX0dQSU9EU01FTikNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19HUElPRV9DTEtfU0xFRVBfRU5BQkxFKCkgXA0KLSAgU0VUX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9HUElPRVNNRU4pDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0ZfQ0xLX1NMRUVQX0VOQUJMRSgpIFwNCi0gIFNFVF9CSVQoUkNDLT5BSEIyU01FTlIsIFJDQ19BSEIyU01FTlJfR1BJT0ZTTUVOKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0dQSU9HX0NMS19TTEVFUF9FTkFCTEUoKSBcDQotICBTRVRfQklUKFJDQy0+QUhCMlNNRU5SLCBSQ0NfQUhCMlNNRU5SX0dQSU9HU01FTikNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19TUkFNMl9DTEtfU0xFRVBfRU5BQkxFKCkgXA0KLSAgU0VUX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9TUkFNMlNNRU4pDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfQ0NNX0NMS19TTEVFUF9FTkFCTEUoKSBcDQotICBTRVRfQklUKFJDQy0+QUhCMlNNRU5SLCBSQ0NfQUhCMlNNRU5SX0NDTVNSQU1TTUVOKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0FEQzEyX0NMS19TTEVFUF9FTkFCTEUoKSBcDQotICBTRVRfQklUKFJDQy0+QUhCMlNNRU5SLCBSQ0NfQUhCMlNNRU5SX0FEQzEyU01FTikNCi0NCi0jaWYgZGVmaW5lZChBREMzNDVfQ09NTU9OKQ0KLSNkZWZpbmUgX19IQUxfUkNDX0FEQzM0NV9DTEtfU0xFRVBfRU5BQkxFKCkgXA0KLSAgU0VUX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9BREMzNDVTTUVOKQ0KLSNlbmRpZiAvKiBBREMzNDVfQ09NTU9OICovDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfREFDMV9DTEtfU0xFRVBfRU5BQkxFKCkgXA0KLSAgU0VUX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9EQUMxU01FTikNCi0NCi0jaWYgZGVmaW5lZChEQUMyKQ0KLSNkZWZpbmUgX19IQUxfUkNDX0RBQzJfQ0xLX1NMRUVQX0VOQUJMRSgpIFwNCi0gIFNFVF9CSVQoUkNDLT5BSEIyU01FTlIsIFJDQ19BSEIyU01FTlJfREFDMlNNRU4pDQotI2VuZGlmIC8qIERBQzIgKi8NCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19EQUMzX0NMS19TTEVFUF9FTkFCTEUoKSBcDQotICBTRVRfQklUKFJDQy0+QUhCMlNNRU5SLCBSQ0NfQUhCMlNNRU5SX0RBQzNTTUVOKQ0KLQ0KLSNpZiBkZWZpbmVkKERBQzQpDQotI2RlZmluZSBfX0hBTF9SQ0NfREFDNF9DTEtfU0xFRVBfRU5BQkxFKCkgXA0KLSAgU0VUX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9EQUM0U01FTikNCi0jZW5kaWYgLyogREFDNCAqLw0KLQ0KLSNpZiBkZWZpbmVkKEFFUykNCi0jZGVmaW5lIF9fSEFMX1JDQ19BRVNfQ0xLX1NMRUVQX0VOQUJMRSgpIFwNCi0gIFNFVF9CSVQoUkNDLT5BSEIyU01FTlIsIFJDQ19BSEIyU01FTlJfQUVTU01FTikNCi0jZW5kaWYgLyogQUVTICovDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfUk5HX0NMS19TTEVFUF9FTkFCTEUoKSBcDQotICBTRVRfQklUKFJDQy0+QUhCMlNNRU5SLCBSQ0NfQUhCMlNNRU5SX1JOR1NNRU4pDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0FfQ0xLX1NMRUVQX0RJU0FCTEUoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BSEIyU01FTlIsIFJDQ19BSEIyU01FTlJfR1BJT0FTTUVOKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0dQSU9CX0NMS19TTEVFUF9ESVNBQkxFKCkgXA0KLSAgQ0xFQVJfQklUKFJDQy0+QUhCMlNNRU5SLCBSQ0NfQUhCMlNNRU5SX0dQSU9CU01FTikNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19HUElPQ19DTEtfU0xFRVBfRElTQUJMRSgpIFwNCi0gIENMRUFSX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9HUElPQ1NNRU4pDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0RfQ0xLX1NMRUVQX0RJU0FCTEUoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BSEIyU01FTlIsIFJDQ19BSEIyU01FTlJfR1BJT0RTTUVOKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0dQSU9FX0NMS19TTEVFUF9ESVNBQkxFKCkgXA0KLSAgQ0xFQVJfQklUKFJDQy0+QUhCMlNNRU5SLCBSQ0NfQUhCMlNNRU5SX0dQSU9FU01FTikNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19HUElPRl9DTEtfU0xFRVBfRElTQUJMRSgpIFwNCi0gIENMRUFSX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9HUElPRlNNRU4pDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0dfQ0xLX1NMRUVQX0RJU0FCTEUoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BSEIyU01FTlIsIFJDQ19BSEIyU01FTlJfR1BJT0dTTUVOKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1NSQU0yX0NMS19TTEVFUF9ESVNBQkxFKCkgXA0KLSAgQ0xFQVJfQklUKFJDQy0+QUhCMlNNRU5SLCBSQ0NfQUhCMlNNRU5SX1NSQU0yU01FTikNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19DQ01fQ0xLX1NMRUVQX0RJU0FCTEUoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BSEIyU01FTlIsIFJDQ19BSEIyU01FTlJfQ0NNU1JBTVNNRU4pDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfQURDMTJfQ0xLX1NMRUVQX0RJU0FCTEUoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BSEIyU01FTlIsIFJDQ19BSEIyU01FTlJfQURDMTJTTUVOKQ0KLQ0KLSNpZiBkZWZpbmVkKEFEQzM0NV9DT01NT04pDQotI2RlZmluZSBfX0hBTF9SQ0NfQURDMzQ1X0NMS19TTEVFUF9ESVNBQkxFKCkgXA0KLSAgQ0xFQVJfQklUKFJDQy0+QUhCMlNNRU5SLCBSQ0NfQUhCMlNNRU5SX0FEQzM0NVNNRU4pDQotI2VuZGlmIC8qIEFEQzM0NV9DT01NT04gKi8NCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19EQUMxX0NMS19TTEVFUF9ESVNBQkxFKCkgXA0KLSAgQ0xFQVJfQklUKFJDQy0+QUhCMlNNRU5SLCBSQ0NfQUhCMlNNRU5SX0RBQzFTTUVOKQ0KLQ0KLSNpZiBkZWZpbmVkKERBQzIpDQotI2RlZmluZSBfX0hBTF9SQ0NfREFDMl9DTEtfU0xFRVBfRElTQUJMRSgpIFwNCi0gIENMRUFSX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9EQUMyU01FTikNCi0jZW5kaWYgLyogREFDMiAqLw0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0RBQzNfQ0xLX1NMRUVQX0RJU0FCTEUoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BSEIyU01FTlIsIFJDQ19BSEIyU01FTlJfREFDM1NNRU4pDQotDQotI2lmIGRlZmluZWQoREFDNCkNCi0jZGVmaW5lIF9fSEFMX1JDQ19EQUM0X0NMS19TTEVFUF9ESVNBQkxFKCkgXA0KLSAgQ0xFQVJfQklUKFJDQy0+QUhCMlNNRU5SLCBSQ0NfQUhCMlNNRU5SX0RBQzRTTUVOKQ0KLSNlbmRpZiAvKiBEQUM0ICovDQotDQotI2lmIGRlZmluZWQoQUVTKQ0KLSNkZWZpbmUgX19IQUxfUkNDX0FFU19DTEtfU0xFRVBfRElTQUJMRSgpIFwNCi0gIENMRUFSX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9BRVNTTUVOKQ0KLSNlbmRpZiAvKiBBRVMgKi8NCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19STkdfQ0xLX1NMRUVQX0RJU0FCTEUoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BSEIyU01FTlIsIFJDQ19BSEIyU01FTlJfUk5HU01FTikNCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDX0FIQjNfQ2xvY2tfU2xlZXBfRW5hYmxlX0Rpc2FibGUgQUhCMyBQZXJpcGhlcmFsIENsb2NrIFNsZWVwDQotICogRW5hYmxlIERpc2FibGUNCi0gKiBAYnJpZWYgIEVuYWJsZSBvciBkaXNhYmxlIHRoZSBBSEIzIHBlcmlwaGVyYWwgY2xvY2sgZHVyaW5nIExvdyBQb3dlciAoU2xlZXApDQotICogbW9kZS4NCi0gKiBAbm90ZSAgIFBlcmlwaGVyYWwgY2xvY2sgZ2F0aW5nIGluIFNMRUVQIG1vZGUgY2FuIGJlIHVzZWQgdG8gZnVydGhlciByZWR1Y2UNCi0gKiAgICAgICAgIHBvd2VyIGNvbnN1bXB0aW9uLg0KLSAqIEBub3RlICAgQWZ0ZXIgd2FrZXVwIGZyb20gU0xFRVAgbW9kZSwgdGhlIHBlcmlwaGVyYWwgY2xvY2sgaXMgZW5hYmxlZCBhZ2Fpbi4NCi0gKiBAbm90ZSAgIEJ5IGRlZmF1bHQsIGFsbCBwZXJpcGhlcmFsIGNsb2NrcyBhcmUgZW5hYmxlZCBkdXJpbmcgU0xFRVAgbW9kZS4NCi0gKiBAew0KLSAqLw0KLQ0KLSNpZiBkZWZpbmVkKEZNQ19CQU5LMSkNCi0jZGVmaW5lIF9fSEFMX1JDQ19GTUNfQ0xLX1NMRUVQX0VOQUJMRSgpIFwNCi0gIFNFVF9CSVQoUkNDLT5BSEIzU01FTlIsIFJDQ19BSEIzU01FTlJfRk1DU01FTikNCi0jZW5kaWYgLyogRk1DX0JBTksxICovDQotDQotI2lmIGRlZmluZWQoUVVBRFNQSSkNCi0jZGVmaW5lIF9fSEFMX1JDQ19RU1BJX0NMS19TTEVFUF9FTkFCTEUoKSBcDQotICBTRVRfQklUKFJDQy0+QUhCM1NNRU5SLCBSQ0NfQUhCM1NNRU5SX1FTUElTTUVOKQ0KLSNlbmRpZiAvKiBRVUFEU1BJICovDQotDQotI2lmIGRlZmluZWQoRk1DX0JBTksxKQ0KLSNkZWZpbmUgX19IQUxfUkNDX0ZNQ19DTEtfU0xFRVBfRElTQUJMRSgpIFwNCi0gIENMRUFSX0JJVChSQ0MtPkFIQjNTTUVOUiwgUkNDX0FIQjNTTUVOUl9GTUNTTUVOKQ0KLSNlbmRpZiAvKiBGTUNfQkFOSzEgKi8NCi0NCi0jaWYgZGVmaW5lZChRVUFEU1BJKQ0KLSNkZWZpbmUgX19IQUxfUkNDX1FTUElfQ0xLX1NMRUVQX0RJU0FCTEUoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BSEIzU01FTlIsIFJDQ19BSEIzU01FTlJfUVNQSVNNRU4pDQotI2VuZGlmIC8qIFFVQURTUEkgKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDX0FQQjFfQ2xvY2tfU2xlZXBfRW5hYmxlX0Rpc2FibGUgQVBCMSBQZXJpcGhlcmFsIENsb2NrIFNsZWVwDQotICogRW5hYmxlIERpc2FibGUNCi0gKiBAYnJpZWYgIEVuYWJsZSBvciBkaXNhYmxlIHRoZSBBUEIxIHBlcmlwaGVyYWwgY2xvY2sgZHVyaW5nIExvdyBQb3dlciAoU2xlZXApDQotICogbW9kZS4NCi0gKiBAbm90ZSAgIFBlcmlwaGVyYWwgY2xvY2sgZ2F0aW5nIGluIFNMRUVQIG1vZGUgY2FuIGJlIHVzZWQgdG8gZnVydGhlciByZWR1Y2UNCi0gKiAgICAgICAgIHBvd2VyIGNvbnN1bXB0aW9uLg0KLSAqIEBub3RlICAgQWZ0ZXIgd2FrZXVwIGZyb20gU0xFRVAgbW9kZSwgdGhlIHBlcmlwaGVyYWwgY2xvY2sgaXMgZW5hYmxlZCBhZ2Fpbi4NCi0gKiBAbm90ZSAgIEJ5IGRlZmF1bHQsIGFsbCBwZXJpcGhlcmFsIGNsb2NrcyBhcmUgZW5hYmxlZCBkdXJpbmcgU0xFRVAgbW9kZS4NCi0gKiBAew0KLSAqLw0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1RJTTJfQ0xLX1NMRUVQX0VOQUJMRSgpIFwNCi0gIFNFVF9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9USU0yU01FTikNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19USU0zX0NMS19TTEVFUF9FTkFCTEUoKSBcDQotICBTRVRfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfVElNM1NNRU4pDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfVElNNF9DTEtfU0xFRVBfRU5BQkxFKCkgXA0KLSAgU0VUX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX1RJTTRTTUVOKQ0KLQ0KLSNpZiBkZWZpbmVkKFRJTTUpDQotI2RlZmluZSBfX0hBTF9SQ0NfVElNNV9DTEtfU0xFRVBfRU5BQkxFKCkgXA0KLSAgU0VUX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX1RJTTVTTUVOKQ0KLSNlbmRpZiAvKiBUSU01ICovDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfVElNNl9DTEtfU0xFRVBfRU5BQkxFKCkgXA0KLSAgU0VUX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX1RJTTZTTUVOKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1RJTTdfQ0xLX1NMRUVQX0VOQUJMRSgpIFwNCi0gIFNFVF9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9USU03U01FTikNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19DUlNfQ0xLX1NMRUVQX0VOQUJMRSgpIFwNCi0gIFNFVF9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9DUlNTTUVOKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1JUQ0FQQl9DTEtfU0xFRVBfRU5BQkxFKCkgXA0KLSAgU0VUX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX1JUQ0FQQlNNRU4pDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfV1dER19DTEtfU0xFRVBfRU5BQkxFKCkgXA0KLSAgU0VUX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX1dXREdTTUVOKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1NQSTJfQ0xLX1NMRUVQX0VOQUJMRSgpIFwNCi0gIFNFVF9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9TUEkyU01FTikNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19TUEkzX0NMS19TTEVFUF9FTkFCTEUoKSBcDQotICBTRVRfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfU1BJM1NNRU4pDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQyX0NMS19TTEVFUF9FTkFCTEUoKSBcDQotICBTRVRfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfVVNBUlQyU01FTikNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDNfQ0xLX1NMRUVQX0VOQUJMRSgpIFwNCi0gIFNFVF9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9VU0FSVDNTTUVOKQ0KLQ0KLSNpZiBkZWZpbmVkKFVBUlQ0KQ0KLSNkZWZpbmUgX19IQUxfUkNDX1VBUlQ0X0NMS19TTEVFUF9FTkFCTEUoKSBcDQotICBTRVRfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfVUFSVDRTTUVOKQ0KLSNlbmRpZiAvKiBVQVJUNCAqLw0KLQ0KLSNpZiBkZWZpbmVkKFVBUlQ1KQ0KLSNkZWZpbmUgX19IQUxfUkNDX1VBUlQ1X0NMS19TTEVFUF9FTkFCTEUoKSBcDQotICBTRVRfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfVUFSVDVTTUVOKQ0KLSNlbmRpZiAvKiBVQVJUNSAqLw0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0kyQzFfQ0xLX1NMRUVQX0VOQUJMRSgpIFwNCi0gIFNFVF9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9JMkMxU01FTikNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19JMkMyX0NMS19TTEVFUF9FTkFCTEUoKSBcDQotICBTRVRfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfSTJDMlNNRU4pDQotDQotI2lmIGRlZmluZWQoVVNCKQ0KLSNkZWZpbmUgX19IQUxfUkNDX1VTQl9DTEtfU0xFRVBfRU5BQkxFKCkgXA0KLSAgU0VUX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX1VTQlNNRU4pDQotI2VuZGlmIC8qIFVTQiAqLw0KLQ0KLSNpZiBkZWZpbmVkKEZEQ0FOMSkNCi0jZGVmaW5lIF9fSEFMX1JDQ19GRENBTl9DTEtfU0xFRVBfRU5BQkxFKCkgXA0KLSAgU0VUX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX0ZEQ0FOU01FTikNCi0jZW5kaWYgLyogRkRDQU4xICovDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfUFdSX0NMS19TTEVFUF9FTkFCTEUoKSBcDQotICBTRVRfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfUFdSU01FTikNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19JMkMzX0NMS19TTEVFUF9FTkFCTEUoKSBcDQotICBTRVRfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfSTJDM1NNRU4pDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfTFBUSU0xX0NMS19TTEVFUF9FTkFCTEUoKSBcDQotICBTRVRfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfTFBUSU0xU01FTikNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19MUFVBUlQxX0NMS19TTEVFUF9FTkFCTEUoKSBcDQotICBTRVRfQklUKFJDQy0+QVBCMVNNRU5SMiwgUkNDX0FQQjFTTUVOUjJfTFBVQVJUMVNNRU4pDQotDQotI2lmIGRlZmluZWQoSTJDNCkNCi0jZGVmaW5lIF9fSEFMX1JDQ19JMkM0X0NMS19TTEVFUF9FTkFCTEUoKSBcDQotICBTRVRfQklUKFJDQy0+QVBCMVNNRU5SMiwgUkNDX0FQQjFTTUVOUjJfSTJDNFNNRU4pDQotI2VuZGlmIC8qIEkyQzQgKi8NCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19VQ1BEMV9DTEtfU0xFRVBfRU5BQkxFKCkgXA0KLSAgU0VUX0JJVChSQ0MtPkFQQjFTTUVOUjIsIFJDQ19BUEIxU01FTlIyX1VDUEQxU01FTikNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19USU0yX0NMS19TTEVFUF9ESVNBQkxFKCkgXA0KLSAgQ0xFQVJfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfVElNMlNNRU4pDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfVElNM19DTEtfU0xFRVBfRElTQUJMRSgpIFwNCi0gIENMRUFSX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX1RJTTNTTUVOKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1RJTTRfQ0xLX1NMRUVQX0RJU0FCTEUoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9USU00U01FTikNCi0NCi0jaWYgZGVmaW5lZChUSU01KQ0KLSNkZWZpbmUgX19IQUxfUkNDX1RJTTVfQ0xLX1NMRUVQX0RJU0FCTEUoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9USU01U01FTikNCi0jZW5kaWYgLyogVElNNSAqLw0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1RJTTZfQ0xLX1NMRUVQX0RJU0FCTEUoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9USU02U01FTikNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19USU03X0NMS19TTEVFUF9ESVNBQkxFKCkgXA0KLSAgQ0xFQVJfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfVElNN1NNRU4pDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfQ1JTX0NMS19TTEVFUF9ESVNBQkxFKCkgXA0KLSAgQ0xFQVJfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfQ1JTU01FTikNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19SVENBUEJfQ0xLX1NMRUVQX0RJU0FCTEUoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9SVENBUEJTTUVOKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1dXREdfQ0xLX1NMRUVQX0RJU0FCTEUoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9XV0RHU01FTikNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19TUEkyX0NMS19TTEVFUF9ESVNBQkxFKCkgXA0KLSAgQ0xFQVJfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfU1BJMlNNRU4pDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfU1BJM19DTEtfU0xFRVBfRElTQUJMRSgpIFwNCi0gIENMRUFSX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX1NQSTNTTUVOKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1VTQVJUMl9DTEtfU0xFRVBfRElTQUJMRSgpIFwNCi0gIENMRUFSX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX1VTQVJUMlNNRU4pDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQzX0NMS19TTEVFUF9ESVNBQkxFKCkgXA0KLSAgQ0xFQVJfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfVVNBUlQzU01FTikNCi0NCi0jaWYgZGVmaW5lZChVQVJUNCkNCi0jZGVmaW5lIF9fSEFMX1JDQ19VQVJUNF9DTEtfU0xFRVBfRElTQUJMRSgpIFwNCi0gIENMRUFSX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX1VBUlQ0U01FTikNCi0jZW5kaWYgLyogVUFSVDQgKi8NCi0NCi0jaWYgZGVmaW5lZChVQVJUNSkNCi0jZGVmaW5lIF9fSEFMX1JDQ19VQVJUNV9DTEtfU0xFRVBfRElTQUJMRSgpIFwNCi0gIENMRUFSX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX1VBUlQ1U01FTikNCi0jZW5kaWYgLyogVUFSVDUgKi8NCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19JMkMxX0NMS19TTEVFUF9ESVNBQkxFKCkgXA0KLSAgQ0xFQVJfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfSTJDMVNNRU4pDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfSTJDMl9DTEtfU0xFRVBfRElTQUJMRSgpIFwNCi0gIENMRUFSX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX0kyQzJTTUVOKQ0KLQ0KLSNpZiBkZWZpbmVkKFVTQikNCi0jZGVmaW5lIF9fSEFMX1JDQ19VU0JfQ0xLX1NMRUVQX0RJU0FCTEUoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9VU0JTTUVOKQ0KLSNlbmRpZiAvKiBVU0IgKi8NCi0NCi0jaWYgZGVmaW5lZChGRENBTjEpDQotI2RlZmluZSBfX0hBTF9SQ0NfRkRDQU5fQ0xLX1NMRUVQX0RJU0FCTEUoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9GRENBTlNNRU4pDQotI2VuZGlmIC8qIEZEQ0FOMSAqLw0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1BXUl9DTEtfU0xFRVBfRElTQUJMRSgpIFwNCi0gIENMRUFSX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX1BXUlNNRU4pDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfSTJDM19DTEtfU0xFRVBfRElTQUJMRSgpIFwNCi0gIENMRUFSX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX0kyQzNTTUVOKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0xQVElNMV9DTEtfU0xFRVBfRElTQUJMRSgpIFwNCi0gIENMRUFSX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX0xQVElNMVNNRU4pDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfTFBVQVJUMV9DTEtfU0xFRVBfRElTQUJMRSgpIFwNCi0gIENMRUFSX0JJVChSQ0MtPkFQQjFTTUVOUjIsIFJDQ19BUEIxU01FTlIyX0xQVUFSVDFTTUVOKQ0KLQ0KLSNpZiBkZWZpbmVkKEkyQzQpDQotI2RlZmluZSBfX0hBTF9SQ0NfSTJDNF9DTEtfU0xFRVBfRElTQUJMRSgpIFwNCi0gIENMRUFSX0JJVChSQ0MtPkFQQjFTTUVOUjIsIFJDQ19BUEIxU01FTlIyX0kyQzRTTUVOKQ0KLSNlbmRpZiAvKiBJMkM0ICovDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfVUNQRDFfQ0xLX1NMRUVQX0RJU0FCTEUoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BUEIxU01FTlIyLCBSQ0NfQVBCMVNNRU5SMl9VQ1BEMVNNRU4pDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFJDQ19BUEIyX0Nsb2NrX1NsZWVwX0VuYWJsZV9EaXNhYmxlIEFQQjIgUGVyaXBoZXJhbCBDbG9jayBTbGVlcA0KLSAqIEVuYWJsZSBEaXNhYmxlDQotICogQGJyaWVmICBFbmFibGUgb3IgZGlzYWJsZSB0aGUgQVBCMiBwZXJpcGhlcmFsIGNsb2NrIGR1cmluZyBMb3cgUG93ZXIgKFNsZWVwKQ0KLSAqIG1vZGUuDQotICogQG5vdGUgICBQZXJpcGhlcmFsIGNsb2NrIGdhdGluZyBpbiBTTEVFUCBtb2RlIGNhbiBiZSB1c2VkIHRvIGZ1cnRoZXIgcmVkdWNlDQotICogICAgICAgICBwb3dlciBjb25zdW1wdGlvbi4NCi0gKiBAbm90ZSAgIEFmdGVyIHdha2V1cCBmcm9tIFNMRUVQIG1vZGUsIHRoZSBwZXJpcGhlcmFsIGNsb2NrIGlzIGVuYWJsZWQgYWdhaW4uDQotICogQG5vdGUgICBCeSBkZWZhdWx0LCBhbGwgcGVyaXBoZXJhbCBjbG9ja3MgYXJlIGVuYWJsZWQgZHVyaW5nIFNMRUVQIG1vZGUuDQotICogQHsNCi0gKi8NCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19TWVNDRkdfQ0xLX1NMRUVQX0VOQUJMRSgpIFwNCi0gIFNFVF9CSVQoUkNDLT5BUEIyU01FTlIsIFJDQ19BUEIyU01FTlJfU1lTQ0ZHU01FTikNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19USU0xX0NMS19TTEVFUF9FTkFCTEUoKSBcDQotICBTRVRfQklUKFJDQy0+QVBCMlNNRU5SLCBSQ0NfQVBCMlNNRU5SX1RJTTFTTUVOKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1NQSTFfQ0xLX1NMRUVQX0VOQUJMRSgpIFwNCi0gIFNFVF9CSVQoUkNDLT5BUEIyU01FTlIsIFJDQ19BUEIyU01FTlJfU1BJMVNNRU4pDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfVElNOF9DTEtfU0xFRVBfRU5BQkxFKCkgXA0KLSAgU0VUX0JJVChSQ0MtPkFQQjJTTUVOUiwgUkNDX0FQQjJTTUVOUl9USU04U01FTikNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDFfQ0xLX1NMRUVQX0VOQUJMRSgpIFwNCi0gIFNFVF9CSVQoUkNDLT5BUEIyU01FTlIsIFJDQ19BUEIyU01FTlJfVVNBUlQxU01FTikNCi0NCi0jaWYgZGVmaW5lZChTUEk0KQ0KLSNkZWZpbmUgX19IQUxfUkNDX1NQSTRfQ0xLX1NMRUVQX0VOQUJMRSgpIFwNCi0gIFNFVF9CSVQoUkNDLT5BUEIyU01FTlIsIFJDQ19BUEIyU01FTlJfU1BJNFNNRU4pDQotI2VuZGlmIC8qIFNQSTQgKi8NCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19USU0xNV9DTEtfU0xFRVBfRU5BQkxFKCkgXA0KLSAgU0VUX0JJVChSQ0MtPkFQQjJTTUVOUiwgUkNDX0FQQjJTTUVOUl9USU0xNVNNRU4pDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfVElNMTZfQ0xLX1NMRUVQX0VOQUJMRSgpIFwNCi0gIFNFVF9CSVQoUkNDLT5BUEIyU01FTlIsIFJDQ19BUEIyU01FTlJfVElNMTZTTUVOKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1RJTTE3X0NMS19TTEVFUF9FTkFCTEUoKSBcDQotICBTRVRfQklUKFJDQy0+QVBCMlNNRU5SLCBSQ0NfQVBCMlNNRU5SX1RJTTE3U01FTikNCi0NCi0jaWYgZGVmaW5lZChUSU0yMCkNCi0jZGVmaW5lIF9fSEFMX1JDQ19USU0yMF9DTEtfU0xFRVBfRU5BQkxFKCkgXA0KLSAgU0VUX0JJVChSQ0MtPkFQQjJTTUVOUiwgUkNDX0FQQjJTTUVOUl9USU0yMFNNRU4pDQotI2VuZGlmIC8qIFRJTTIwICovDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfU0FJMV9DTEtfU0xFRVBfRU5BQkxFKCkgXA0KLSAgU0VUX0JJVChSQ0MtPkFQQjJTTUVOUiwgUkNDX0FQQjJTTUVOUl9TQUkxU01FTikNCi0NCi0jaWYgZGVmaW5lZChIUlRJTTEpDQotI2RlZmluZSBfX0hBTF9SQ0NfSFJUSU0xX0NMS19TTEVFUF9FTkFCTEUoKSBcDQotICBTRVRfQklUKFJDQy0+QVBCMlNNRU5SLCBSQ0NfQVBCMlNNRU5SX0hSVElNMVNNRU4pDQotI2VuZGlmIC8qIEhSVElNMSAqLw0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1NZU0NGR19DTEtfU0xFRVBfRElTQUJMRSgpIFwNCi0gIENMRUFSX0JJVChSQ0MtPkFQQjJTTUVOUiwgUkNDX0FQQjJTTUVOUl9TWVNDRkdTTUVOKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1RJTTFfQ0xLX1NMRUVQX0RJU0FCTEUoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BUEIyU01FTlIsIFJDQ19BUEIyU01FTlJfVElNMVNNRU4pDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfU1BJMV9DTEtfU0xFRVBfRElTQUJMRSgpIFwNCi0gIENMRUFSX0JJVChSQ0MtPkFQQjJTTUVOUiwgUkNDX0FQQjJTTUVOUl9TUEkxU01FTikNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19USU04X0NMS19TTEVFUF9ESVNBQkxFKCkgXA0KLSAgQ0xFQVJfQklUKFJDQy0+QVBCMlNNRU5SLCBSQ0NfQVBCMlNNRU5SX1RJTThTTUVOKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1VTQVJUMV9DTEtfU0xFRVBfRElTQUJMRSgpIFwNCi0gIENMRUFSX0JJVChSQ0MtPkFQQjJTTUVOUiwgUkNDX0FQQjJTTUVOUl9VU0FSVDFTTUVOKQ0KLQ0KLSNpZiBkZWZpbmVkKFNQSTQpDQotI2RlZmluZSBfX0hBTF9SQ0NfU1BJNF9DTEtfU0xFRVBfRElTQUJMRSgpIFwNCi0gIENMRUFSX0JJVChSQ0MtPkFQQjJTTUVOUiwgUkNDX0FQQjJTTUVOUl9TUEk0U01FTikNCi0jZW5kaWYgLyogU1BJNCAqLw0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1RJTTE1X0NMS19TTEVFUF9ESVNBQkxFKCkgXA0KLSAgQ0xFQVJfQklUKFJDQy0+QVBCMlNNRU5SLCBSQ0NfQVBCMlNNRU5SX1RJTTE1U01FTikNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19USU0xNl9DTEtfU0xFRVBfRElTQUJMRSgpIFwNCi0gIENMRUFSX0JJVChSQ0MtPkFQQjJTTUVOUiwgUkNDX0FQQjJTTUVOUl9USU0xNlNNRU4pDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfVElNMTdfQ0xLX1NMRUVQX0RJU0FCTEUoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BUEIyU01FTlIsIFJDQ19BUEIyU01FTlJfVElNMTdTTUVOKQ0KLQ0KLSNpZiBkZWZpbmVkKFRJTTIwKQ0KLSNkZWZpbmUgX19IQUxfUkNDX1RJTTIwX0NMS19TTEVFUF9ESVNBQkxFKCkgXA0KLSAgQ0xFQVJfQklUKFJDQy0+QVBCMlNNRU5SLCBSQ0NfQVBCMlNNRU5SX1RJTTIwU01FTikNCi0jZW5kaWYgLyogVElNMjAgKi8NCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19TQUkxX0NMS19TTEVFUF9ESVNBQkxFKCkgXA0KLSAgQ0xFQVJfQklUKFJDQy0+QVBCMlNNRU5SLCBSQ0NfQVBCMlNNRU5SX1NBSTFTTUVOKQ0KLQ0KLSNpZiBkZWZpbmVkKEhSVElNMSkNCi0jZGVmaW5lIF9fSEFMX1JDQ19IUlRJTTFfQ0xLX1NMRUVQX0RJU0FCTEUoKSBcDQotICBDTEVBUl9CSVQoUkNDLT5BUEIyU01FTlIsIFJDQ19BUEIyU01FTlJfSFJUSU0xU01FTikNCi0jZW5kaWYgLyogSFJUSU0xICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFJDQ19BSEIxX0Nsb2NrX1NsZWVwX0VuYWJsZV9EaXNhYmxlX1N0YXR1cyBBSEIxIFBlcmlwaGVyYWwgQ2xvY2sNCi0gKiBTbGVlcCBFbmFibGVkIG9yIERpc2FibGVkIFN0YXR1cw0KLSAqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgQUhCMSBwZXJpcGhlcmFsIGNsb2NrIGR1cmluZyBMb3cgUG93ZXIgKFNsZWVwKSBtb2RlDQotICogaXMgZW5hYmxlZCBvciBub3QuDQotICogQG5vdGUgICBQZXJpcGhlcmFsIGNsb2NrIGdhdGluZyBpbiBTTEVFUCBtb2RlIGNhbiBiZSB1c2VkIHRvIGZ1cnRoZXIgcmVkdWNlDQotICogICAgICAgICBwb3dlciBjb25zdW1wdGlvbi4NCi0gKiBAbm90ZSAgIEFmdGVyIHdha2V1cCBmcm9tIFNMRUVQIG1vZGUsIHRoZSBwZXJpcGhlcmFsIGNsb2NrIGlzIGVuYWJsZWQgYWdhaW4uDQotICogQG5vdGUgICBCeSBkZWZhdWx0LCBhbGwgcGVyaXBoZXJhbCBjbG9ja3MgYXJlIGVuYWJsZWQgZHVyaW5nIFNMRUVQIG1vZGUuDQotICogQHsNCi0gKi8NCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19ETUExX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QUhCMVNNRU5SLCBSQ0NfQUhCMVNNRU5SX0RNQTFTTUVOKSAhPSAwVSkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19ETUEyX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QUhCMVNNRU5SLCBSQ0NfQUhCMVNNRU5SX0RNQTJTTUVOKSAhPSAwVSkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19ETUFNVVgxX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QUhCMVNNRU5SLCBSQ0NfQUhCMVNNRU5SX0RNQU1VWDFTTUVOKSAhPSAwVSkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19DT1JESUNfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BSEIxU01FTlIsIFJDQ19BSEIxU01FTlJfQ09SRElDU01FTikgIT0gMFUpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfRk1BQ19JU19DTEtfU0xFRVBfRU5BQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFIQjFTTUVOUiwgUkNDX0FIQjFTTUVOUl9GTUFDU01FTikgIT0gMFUpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfRkxBU0hfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BSEIxU01FTlIsIFJDQ19BSEIxU01FTlJfRkxBU0hTTUVOKSAhPSAwVSkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19TUkFNMV9JU19DTEtfU0xFRVBfRU5BQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFIQjFTTUVOUiwgUkNDX0FIQjFTTUVOUl9TUkFNMVNNRU4pICE9IDBVKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0NSQ19JU19DTEtfU0xFRVBfRU5BQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFIQjFTTUVOUiwgUkNDX0FIQjFTTUVOUl9DUkNTTUVOKSAhPSAwVSkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19ETUExX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFIQjFTTUVOUiwgUkNDX0FIQjFTTUVOUl9ETUExU01FTikgPT0gMFUpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfRE1BMl9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BSEIxU01FTlIsIFJDQ19BSEIxU01FTlJfRE1BMlNNRU4pID09IDBVKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0RNQU1VWDFfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QUhCMVNNRU5SLCBSQ0NfQUhCMVNNRU5SX0RNQU1VWDFTTUVOKSA9PSAwVSkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19DT1JESUNfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QUhCMVNNRU5SLCBSQ0NfQUhCMVNNRU5SX0NPUkRJQ1NNRU4pID09IDBVKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0ZNQUNfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QUhCMVNNRU5SLCBSQ0NfQUhCMVNNRU5SX0ZNQUNTTUVOKSA9PSAwVSkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19GTEFTSF9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BSEIxU01FTlIsIFJDQ19BSEIxU01FTlJfRkxBU0hTTUVOKSA9PSAwVSkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19TUkFNMV9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BSEIxU01FTlIsIFJDQ19BSEIxU01FTlJfU1JBTTFTTUVOKSA9PSAwVSkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19DUkNfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QUhCMVNNRU5SLCBSQ0NfQUhCMVNNRU5SX0NSQ1NNRU4pID09IDBVKQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBSQ0NfQUhCMl9DbG9ja19TbGVlcF9FbmFibGVfRGlzYWJsZV9TdGF0dXMgQUhCMiBQZXJpcGhlcmFsIENsb2NrDQotICogU2xlZXAgRW5hYmxlZCBvciBEaXNhYmxlZCBTdGF0dXMNCi0gKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIEFIQjIgcGVyaXBoZXJhbCBjbG9jayBkdXJpbmcgTG93IFBvd2VyIChTbGVlcCkgbW9kZQ0KLSAqIGlzIGVuYWJsZWQgb3Igbm90Lg0KLSAqIEBub3RlICAgUGVyaXBoZXJhbCBjbG9jayBnYXRpbmcgaW4gU0xFRVAgbW9kZSBjYW4gYmUgdXNlZCB0byBmdXJ0aGVyIHJlZHVjZQ0KLSAqICAgICAgICAgcG93ZXIgY29uc3VtcHRpb24uDQotICogQG5vdGUgICBBZnRlciB3YWtldXAgZnJvbSBTTEVFUCBtb2RlLCB0aGUgcGVyaXBoZXJhbCBjbG9jayBpcyBlbmFibGVkIGFnYWluLg0KLSAqIEBub3RlICAgQnkgZGVmYXVsdCwgYWxsIHBlcmlwaGVyYWwgY2xvY2tzIGFyZSBlbmFibGVkIGR1cmluZyBTTEVFUCBtb2RlLg0KLSAqIEB7DQotICovDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0FfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BSEIyU01FTlIsIFJDQ19BSEIyU01FTlJfR1BJT0FTTUVOKSAhPSAwVSkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19HUElPQl9JU19DTEtfU0xFRVBfRU5BQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9HUElPQlNNRU4pICE9IDBVKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0dQSU9DX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QUhCMlNNRU5SLCBSQ0NfQUhCMlNNRU5SX0dQSU9DU01FTikgIT0gMFUpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0RfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BSEIyU01FTlIsIFJDQ19BSEIyU01FTlJfR1BJT0RTTUVOKSAhPSAwVSkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19HUElPRV9JU19DTEtfU0xFRVBfRU5BQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9HUElPRVNNRU4pICE9IDBVKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0dQSU9GX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QUhCMlNNRU5SLCBSQ0NfQUhCMlNNRU5SX0dQSU9GU01FTikgIT0gMFUpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0dfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BSEIyU01FTlIsIFJDQ19BSEIyU01FTlJfR1BJT0dTTUVOKSAhPSAwVSkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19TUkFNMl9JU19DTEtfU0xFRVBfRU5BQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9TUkFNMlNNRU4pICE9IDBVKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0NDTV9JU19DTEtfU0xFRVBfRU5BQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9DQ01TUkFNU01FTikgIT0gMFUpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfQURDMTJfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BSEIyU01FTlIsIFJDQ19BSEIyU01FTlJfQURDMTJTTUVOKSAhPSAwVSkNCi0NCi0jaWYgZGVmaW5lZChBREMzNDVfQ09NTU9OKQ0KLSNkZWZpbmUgX19IQUxfUkNDX0FEQzM0NV9JU19DTEtfU0xFRVBfRU5BQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9BREMzNDVTTUVOKSAhPSAwVSkNCi0jZW5kaWYgLyogQURDMzQ1X0NPTU1PTiAqLw0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0RBQzFfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BSEIyU01FTlIsIFJDQ19BSEIyU01FTlJfREFDMVNNRU4pICE9IDBVKQ0KLQ0KLSNpZiBkZWZpbmVkKERBQzIpDQotI2RlZmluZSBfX0hBTF9SQ0NfREFDMl9JU19DTEtfU0xFRVBfRU5BQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9EQUMyU01FTikgIT0gMFUpDQotI2VuZGlmIC8qIERBQzIgKi8NCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19EQUMzX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QUhCMlNNRU5SLCBSQ0NfQUhCMlNNRU5SX0RBQzNTTUVOKSAhPSAwVSkNCi0NCi0jaWYgZGVmaW5lZChEQUM0KQ0KLSNkZWZpbmUgX19IQUxfUkNDX0RBQzRfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BSEIyU01FTlIsIFJDQ19BSEIyU01FTlJfREFDNFNNRU4pICE9IDBVKQ0KLSNlbmRpZiAvKiBEQUM0ICovDQotDQotI2lmIGRlZmluZWQoQUVTKQ0KLSNkZWZpbmUgX19IQUxfUkNDX0FFU19JU19DTEtfU0xFRVBfRU5BQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9BRVNTTUVOKSAhPSAwVSkNCi0jZW5kaWYgLyogQUVTICovDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfUk5HX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QUhCMlNNRU5SLCBSQ0NfQUhCMlNNRU5SX1JOR1NNRU4pICE9IDBVKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0dQSU9BX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9HUElPQVNNRU4pID09IDBVKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0dQSU9CX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9HUElPQlNNRU4pID09IDBVKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0dQSU9DX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9HUElPQ1NNRU4pID09IDBVKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0dQSU9EX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9HUElPRFNNRU4pID09IDBVKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0dQSU9FX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9HUElPRVNNRU4pID09IDBVKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0dQSU9GX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9HUElPRlNNRU4pID09IDBVKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0dQSU9HX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9HUElPR1NNRU4pID09IDBVKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1NSQU0yX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9TUkFNMlNNRU4pID09IDBVKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0NDTV9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BSEIyU01FTlIsIFJDQ19BSEIyU01FTlJfQ0NNU1JBTVNNRU4pID09IDBVKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0FEQzEyX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9BREMxMlNNRU4pID09IDBVKQ0KLQ0KLSNpZiBkZWZpbmVkKEFEQzM0NV9DT01NT04pDQotI2RlZmluZSBfX0hBTF9SQ0NfQURDMzQ1X0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9BREMzNDVTTUVOKSA9PSAwVSkNCi0jZW5kaWYgLyogQURDMzQ1X0NPTU1PTiAqLw0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0RBQzFfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QUhCMlNNRU5SLCBSQ0NfQUhCMlNNRU5SX0RBQzFTTUVOKSA9PSAwVSkNCi0NCi0jaWYgZGVmaW5lZChEQUMyKQ0KLSNkZWZpbmUgX19IQUxfUkNDX0RBQzJfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QUhCMlNNRU5SLCBSQ0NfQUhCMlNNRU5SX0RBQzJTTUVOKSA9PSAwVSkNCi0jZW5kaWYgLyogREFDMiAqLw0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0RBQzNfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QUhCMlNNRU5SLCBSQ0NfQUhCMlNNRU5SX0RBQzNTTUVOKSA9PSAwVSkNCi0NCi0jaWYgZGVmaW5lZChEQUM0KQ0KLSNkZWZpbmUgX19IQUxfUkNDX0RBQzRfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QUhCMlNNRU5SLCBSQ0NfQUhCMlNNRU5SX0RBQzRTTUVOKSA9PSAwVSkNCi0jZW5kaWYgLyogREFDNCAqLw0KLQ0KLSNpZiBkZWZpbmVkKEFFUykNCi0jZGVmaW5lIF9fSEFMX1JDQ19BRVNfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QUhCMlNNRU5SLCBSQ0NfQUhCMlNNRU5SX0FFU1NNRU4pID09IDBVKQ0KLSNlbmRpZiAvKiBBRVMgKi8NCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19STkdfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QUhCMlNNRU5SLCBSQ0NfQUhCMlNNRU5SX1JOR1NNRU4pID09IDBVKQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBSQ0NfQUhCM19DbG9ja19TbGVlcF9FbmFibGVfRGlzYWJsZV9TdGF0dXMgQUhCMyBQZXJpcGhlcmFsIENsb2NrDQotICogU2xlZXAgRW5hYmxlZCBvciBEaXNhYmxlZCBTdGF0dXMNCi0gKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIEFIQjMgcGVyaXBoZXJhbCBjbG9jayBkdXJpbmcgTG93IFBvd2VyIChTbGVlcCkgbW9kZQ0KLSAqIGlzIGVuYWJsZWQgb3Igbm90Lg0KLSAqIEBub3RlICAgUGVyaXBoZXJhbCBjbG9jayBnYXRpbmcgaW4gU0xFRVAgbW9kZSBjYW4gYmUgdXNlZCB0byBmdXJ0aGVyIHJlZHVjZQ0KLSAqICAgICAgICAgcG93ZXIgY29uc3VtcHRpb24uDQotICogQG5vdGUgICBBZnRlciB3YWtldXAgZnJvbSBTTEVFUCBtb2RlLCB0aGUgcGVyaXBoZXJhbCBjbG9jayBpcyBlbmFibGVkIGFnYWluLg0KLSAqIEBub3RlICAgQnkgZGVmYXVsdCwgYWxsIHBlcmlwaGVyYWwgY2xvY2tzIGFyZSBlbmFibGVkIGR1cmluZyBTTEVFUCBtb2RlLg0KLSAqIEB7DQotICovDQotDQotI2lmIGRlZmluZWQoRk1DX0JBTksxKQ0KLSNkZWZpbmUgX19IQUxfUkNDX0ZNQ19JU19DTEtfU0xFRVBfRU5BQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFIQjNTTUVOUiwgUkNDX0FIQjNTTUVOUl9GTUNTTUVOKSAhPSAwVSkNCi0jZW5kaWYgLyogRk1DX0JBTksxICovDQotDQotI2lmIGRlZmluZWQoUVVBRFNQSSkNCi0jZGVmaW5lIF9fSEFMX1JDQ19RU1BJX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QUhCM1NNRU5SLCBSQ0NfQUhCM1NNRU5SX1FTUElTTUVOKSAhPSAwVSkNCi0jZW5kaWYgLyogUVVBRFNQSSAqLw0KLQ0KLSNpZiBkZWZpbmVkKEZNQ19CQU5LMSkNCi0jZGVmaW5lIF9fSEFMX1JDQ19GTUNfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QUhCM1NNRU5SLCBSQ0NfQUhCM1NNRU5SX0ZNQ1NNRU4pID09IDBVKQ0KLSNlbmRpZiAvKiBGTUNfQkFOSzEgKi8NCi0NCi0jaWYgZGVmaW5lZChRVUFEU1BJKQ0KLSNkZWZpbmUgX19IQUxfUkNDX1FTUElfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QUhCM1NNRU5SLCBSQ0NfQUhCM1NNRU5SX1FTUElTTUVOKSA9PSAwVSkNCi0jZW5kaWYgLyogUVVBRFNQSSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBSQ0NfQVBCMV9DbG9ja19TbGVlcF9FbmFibGVfRGlzYWJsZV9TdGF0dXMgQVBCMSBQZXJpcGhlcmFsIENsb2NrDQotICogU2xlZXAgRW5hYmxlZCBvciBEaXNhYmxlZCBTdGF0dXMNCi0gKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIEFQQjEgcGVyaXBoZXJhbCBjbG9jayBkdXJpbmcgTG93IFBvd2VyIChTbGVlcCkgbW9kZQ0KLSAqIGlzIGVuYWJsZWQgb3Igbm90Lg0KLSAqIEBub3RlICAgUGVyaXBoZXJhbCBjbG9jayBnYXRpbmcgaW4gU0xFRVAgbW9kZSBjYW4gYmUgdXNlZCB0byBmdXJ0aGVyIHJlZHVjZQ0KLSAqICAgICAgICAgcG93ZXIgY29uc3VtcHRpb24uDQotICogQG5vdGUgICBBZnRlciB3YWtldXAgZnJvbSBTTEVFUCBtb2RlLCB0aGUgcGVyaXBoZXJhbCBjbG9jayBpcyBlbmFibGVkIGFnYWluLg0KLSAqIEBub3RlICAgQnkgZGVmYXVsdCwgYWxsIHBlcmlwaGVyYWwgY2xvY2tzIGFyZSBlbmFibGVkIGR1cmluZyBTTEVFUCBtb2RlLg0KLSAqIEB7DQotICovDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfVElNMl9JU19DTEtfU0xFRVBfRU5BQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX1RJTTJTTUVOKSAhPSAwVSkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19USU0zX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfVElNM1NNRU4pICE9IDBVKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1RJTTRfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9USU00U01FTikgIT0gMFUpDQotDQotI2lmIGRlZmluZWQoVElNNSkNCi0jZGVmaW5lIF9fSEFMX1JDQ19USU01X0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfVElNNVNNRU4pICE9IDBVKQ0KLSNlbmRpZiAvKiBUSU01ICovDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfVElNNl9JU19DTEtfU0xFRVBfRU5BQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX1RJTTZTTUVOKSAhPSAwVSkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19USU03X0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfVElNN1NNRU4pICE9IDBVKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0NSU19JU19DTEtfU0xFRVBfRU5BQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX0NSU1NNRU4pICE9IDBVKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1JUQ0FQQl9JU19DTEtfU0xFRVBfRU5BQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX1JUQ0FQQlNNRU4pICE9IDBVKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1dXREdfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9XV0RHU01FTikgIT0gMFUpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfU1BJMl9JU19DTEtfU0xFRVBfRU5BQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX1NQSTJTTUVOKSAhPSAwVSkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19TUEkzX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfU1BJM1NNRU4pICE9IDBVKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1VTQVJUMl9JU19DTEtfU0xFRVBfRU5BQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX1VTQVJUMlNNRU4pICE9IDBVKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1VTQVJUM19JU19DTEtfU0xFRVBfRU5BQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX1VTQVJUM1NNRU4pICE9IDBVKQ0KLQ0KLSNpZiBkZWZpbmVkKFVBUlQ0KQ0KLSNkZWZpbmUgX19IQUxfUkNDX1VBUlQ0X0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfVUFSVDRTTUVOKSAhPSAwVSkNCi0jZW5kaWYgLyogVUFSVDQgKi8NCi0NCi0jaWYgZGVmaW5lZChVQVJUNSkNCi0jZGVmaW5lIF9fSEFMX1JDQ19VQVJUNV9JU19DTEtfU0xFRVBfRU5BQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX1VBUlQ1U01FTikgIT0gMFUpDQotI2VuZGlmIC8qIFVBUlQ1ICovDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfSTJDMV9JU19DTEtfU0xFRVBfRU5BQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX0kyQzFTTUVOKSAhPSAwVSkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19JMkMyX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfSTJDMlNNRU4pICE9IDBVKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1VTQl9JU19DTEtfU0xFRVBfRU5BQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX1VTQlNNRU4pICE9IDBVKQ0KLQ0KLSNpZiBkZWZpbmVkKEZEQ0FOMSkNCi0jZGVmaW5lIF9fSEFMX1JDQ19GRENBTl9JU19DTEtfU0xFRVBfRU5BQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX0ZEQ0FOU01FTikgIT0gMFUpDQotI2VuZGlmIC8qIEZEQ0FOMSAqLw0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1BXUl9JU19DTEtfU0xFRVBfRU5BQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX1BXUlNNRU4pICE9IDBVKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0kyQzNfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9JMkMzU01FTikgIT0gMFUpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfTFBUSU0xX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfTFBUSU0xU01FTikgIT0gMFUpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfTFBVQVJUMV9JU19DTEtfU0xFRVBfRU5BQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUjIsIFJDQ19BUEIxU01FTlIyX0xQVUFSVDFTTUVOKSAhPSAwVSkNCi0NCi0jaWYgZGVmaW5lZChJMkM0KQ0KLSNkZWZpbmUgX19IQUxfUkNDX0kyQzRfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIyLCBSQ0NfQVBCMVNNRU5SMl9JMkM0U01FTikgIT0gMFUpDQotI2VuZGlmIC8qIEkyQzQgKi8NCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19VQ1BEMV9JU19DTEtfU0xFRVBfRU5BQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUjIsIFJDQ19BUEIxU01FTlIyX1VDUEQxU01FTikgIT0gMFUpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfVElNMl9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9USU0yU01FTikgPT0gMFUpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfVElNM19JU19DTEtfU0xFRVBfRElTQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9USU0zU01FTikgPT0gMFUpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfVElNNF9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9USU00U01FTikgPT0gMFUpDQotDQotI2lmIGRlZmluZWQoVElNNSkNCi0jZGVmaW5lIF9fSEFMX1JDQ19USU01X0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX1RJTTVTTUVOKSA9PSAwVSkNCi0jZW5kaWYgLyogVElNNSAqLw0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1RJTTZfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfVElNNlNNRU4pID09IDBVKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1RJTTdfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfVElNN1NNRU4pID09IDBVKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0NSU19JU19DTEtfU0xFRVBfRElTQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9DUlNTTUVOKSA9PSAwVSkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19SVENBUEJfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfUlRDQVBCU01FTikgPT0gMFUpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfV1dER19JU19DTEtfU0xFRVBfRElTQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9XV0RHU01FTikgPT0gMFUpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfU1BJMl9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9TUEkyU01FTikgPT0gMFUpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfU1BJM19JU19DTEtfU0xFRVBfRElTQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9TUEkzU01FTikgPT0gMFUpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQyX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX1VTQVJUMlNNRU4pID09IDBVKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1VTQVJUM19JU19DTEtfU0xFRVBfRElTQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9VU0FSVDNTTUVOKSA9PSAwVSkNCi0NCi0jaWYgZGVmaW5lZChVQVJUNCkNCi0jZGVmaW5lIF9fSEFMX1JDQ19VQVJUNF9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9VQVJUNFNNRU4pID09IDBVKQ0KLSNlbmRpZiAvKiBVQVJUNCAqLw0KLQ0KLSNpZiBkZWZpbmVkKFVBUlQ1KQ0KLSNkZWZpbmUgX19IQUxfUkNDX1VBUlQ1X0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX1VBUlQ1U01FTikgPT0gMFUpDQotI2VuZGlmIC8qIFVBUlQ1ICovDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfSTJDMV9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9JMkMxU01FTikgPT0gMFUpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfSTJDMl9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9JMkMyU01FTikgPT0gMFUpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfVVNCX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX1VTQlNNRU4pID09IDBVKQ0KLQ0KLSNpZiBkZWZpbmVkKEZEQ0FOMSkNCi0jZGVmaW5lIF9fSEFMX1JDQ19GRENBTl9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9GRENBTlNNRU4pID09IDBVKQ0KLSNlbmRpZiAvKiBGRENBTjEgKi8NCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19QV1JfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfUFdSU01FTikgPT0gMFUpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfSTJDM19JU19DTEtfU0xFRVBfRElTQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9JMkMzU01FTikgPT0gMFUpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfTFBUSU0xX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX0xQVElNMVNNRU4pID09IDBVKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0xQVUFSVDFfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QVBCMVNNRU5SMiwgUkNDX0FQQjFTTUVOUjJfTFBVQVJUMVNNRU4pID09IDBVKQ0KLQ0KLSNpZiBkZWZpbmVkKEkyQzQpDQotI2RlZmluZSBfX0hBTF9SQ0NfSTJDNF9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIyLCBSQ0NfQVBCMVNNRU5SMl9JMkM0U01FTikgPT0gMFUpDQotI2VuZGlmIC8qIEkyQzQgKi8NCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19VQ1BEMV9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIyLCBSQ0NfQVBCMVNNRU5SMl9VQ1BEMVNNRU4pID09IDBVKQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBSQ0NfQVBCMl9DbG9ja19TbGVlcF9FbmFibGVfRGlzYWJsZV9TdGF0dXMgQVBCMiBQZXJpcGhlcmFsIENsb2NrDQotICogU2xlZXAgRW5hYmxlZCBvciBEaXNhYmxlZCBTdGF0dXMNCi0gKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIEFQQjIgcGVyaXBoZXJhbCBjbG9jayBkdXJpbmcgTG93IFBvd2VyIChTbGVlcCkgbW9kZQ0KLSAqIGlzIGVuYWJsZWQgb3Igbm90Lg0KLSAqIEBub3RlICAgUGVyaXBoZXJhbCBjbG9jayBnYXRpbmcgaW4gU0xFRVAgbW9kZSBjYW4gYmUgdXNlZCB0byBmdXJ0aGVyIHJlZHVjZQ0KLSAqICAgICAgICAgcG93ZXIgY29uc3VtcHRpb24uDQotICogQG5vdGUgICBBZnRlciB3YWtldXAgZnJvbSBTTEVFUCBtb2RlLCB0aGUgcGVyaXBoZXJhbCBjbG9jayBpcyBlbmFibGVkIGFnYWluLg0KLSAqIEBub3RlICAgQnkgZGVmYXVsdCwgYWxsIHBlcmlwaGVyYWwgY2xvY2tzIGFyZSBlbmFibGVkIGR1cmluZyBTTEVFUCBtb2RlLg0KLSAqIEB7DQotICovDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfU1lTQ0ZHX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QVBCMlNNRU5SLCBSQ0NfQVBCMlNNRU5SX1NZU0NGR1NNRU4pICE9IDBVKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1RJTTFfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BUEIyU01FTlIsIFJDQ19BUEIyU01FTlJfVElNMVNNRU4pICE9IDBVKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1NQSTFfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BUEIyU01FTlIsIFJDQ19BUEIyU01FTlJfU1BJMVNNRU4pICE9IDBVKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1RJTThfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BUEIyU01FTlIsIFJDQ19BUEIyU01FTlJfVElNOFNNRU4pICE9IDBVKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1VTQVJUMV9JU19DTEtfU0xFRVBfRU5BQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFQQjJTTUVOUiwgUkNDX0FQQjJTTUVOUl9VU0FSVDFTTUVOKSAhPSAwVSkNCi0NCi0jaWYgZGVmaW5lZChTUEk0KQ0KLSNkZWZpbmUgX19IQUxfUkNDX1NQSTRfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BUEIyU01FTlIsIFJDQ19BUEIyU01FTlJfU1BJNFNNRU4pICE9IDBVKQ0KLSNlbmRpZiAvKiBTUEk0ICovDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfVElNMTVfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BUEIyU01FTlIsIFJDQ19BUEIyU01FTlJfVElNMTVTTUVOKSAhPSAwVSkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19USU0xNl9JU19DTEtfU0xFRVBfRU5BQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFQQjJTTUVOUiwgUkNDX0FQQjJTTUVOUl9USU0xNlNNRU4pICE9IDBVKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1RJTTE3X0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QVBCMlNNRU5SLCBSQ0NfQVBCMlNNRU5SX1RJTTE3U01FTikgIT0gMFUpDQotDQotI2lmIGRlZmluZWQoVElNMjApDQotI2RlZmluZSBfX0hBTF9SQ0NfVElNMjBfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BUEIyU01FTlIsIFJDQ19BUEIyU01FTlJfVElNMjBTTUVOKSAhPSAwVSkNCi0jZW5kaWYgLyogVElNMjAgKi8NCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19TQUkxX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QVBCMlNNRU5SLCBSQ0NfQVBCMlNNRU5SX1NBSTFTTUVOKSAhPSAwVSkNCi0NCi0jaWYgZGVmaW5lZChIUlRJTTEpDQotI2RlZmluZSBfX0hBTF9SQ0NfSFJUSU0xX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QVBCMlNNRU5SLCBSQ0NfQVBCMlNNRU5SX0hSVElNMVNNRU4pICE9IDBVKQ0KLSNlbmRpZiAvKiBIUlRJTTEgKi8NCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19TWVNDRkdfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QVBCMlNNRU5SLCBSQ0NfQVBCMlNNRU5SX1NZU0NGR1NNRU4pID09IDBVKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1RJTTFfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+QVBCMlNNRU5SLCBSQ0NfQVBCMlNNRU5SX1RJTTFTTUVOKSA9PSAwVSkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19TUEkxX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFQQjJTTUVOUiwgUkNDX0FQQjJTTUVOUl9TUEkxU01FTikgPT0gMFUpDQotDQotI2RlZmluZSBfX0hBTF9SQ0NfVElNOF9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BUEIyU01FTlIsIFJDQ19BUEIyU01FTlJfVElNOFNNRU4pID09IDBVKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1VTQVJUMV9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BUEIyU01FTlIsIFJDQ19BUEIyU01FTlJfVVNBUlQxU01FTikgPT0gMFUpDQotDQotI2lmIGRlZmluZWQoU1BJNCkNCi0jZGVmaW5lIF9fSEFMX1JDQ19TUEk0X0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFQQjJTTUVOUiwgUkNDX0FQQjJTTUVOUl9TUEk0U01FTikgPT0gMFUpDQotI2VuZGlmIC8qIFNQSTQgKi8NCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19USU0xNV9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BUEIyU01FTlIsIFJDQ19BUEIyU01FTlJfVElNMTVTTUVOKSA9PSAwVSkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19USU0xNl9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BUEIyU01FTlIsIFJDQ19BUEIyU01FTlJfVElNMTZTTUVOKSA9PSAwVSkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19USU0xN19JU19DTEtfU0xFRVBfRElTQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BUEIyU01FTlIsIFJDQ19BUEIyU01FTlJfVElNMTdTTUVOKSA9PSAwVSkNCi0NCi0jaWYgZGVmaW5lZChUSU0yMCkNCi0jZGVmaW5lIF9fSEFMX1JDQ19USU0yMF9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BUEIyU01FTlIsIFJDQ19BUEIyU01FTlJfVElNMjBTTUVOKSA9PSAwVSkNCi0jZW5kaWYgLyogVElNMjAgKi8NCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19TQUkxX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkFQQjJTTUVOUiwgUkNDX0FQQjJTTUVOUl9TQUkxU01FTikgPT0gMFUpDQotDQotI2lmIGRlZmluZWQoSFJUSU0xKQ0KLSNkZWZpbmUgX19IQUxfUkNDX0hSVElNMV9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5BUEIyU01FTlIsIFJDQ19BUEIyU01FTlJfSFJUSU0xU01FTikgPT0gMFUpDQotI2VuZGlmIC8qIEhSVElNMSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBSQ0NfQmFja3VwX0RvbWFpbl9SZXNldCBSQ0MgQmFja3VwIERvbWFpbiBSZXNldA0KLSAqIEB7DQotICovDQotDQotLyoqIEBicmllZiAgTWFjcm9zIHRvIGZvcmNlIG9yIHJlbGVhc2UgdGhlIEJhY2t1cCBkb21haW4gcmVzZXQuDQotICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIHJlc2V0cyB0aGUgUlRDIHBlcmlwaGVyYWwgKGluY2x1ZGluZyB0aGUgYmFja3VwDQotICogcmVnaXN0ZXJzKSBhbmQgdGhlIFJUQyBjbG9jayBzb3VyY2Ugc2VsZWN0aW9uIGluIFJDQ19DU1IgcmVnaXN0ZXIuDQotICogQG5vdGUgICBUaGUgQktQU1JBTSBpcyBub3QgYWZmZWN0ZWQgYnkgdGhpcyByZXNldC4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1JDQ19CQUNLVVBSRVNFVF9GT1JDRSgpIFNFVF9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9CRFJTVCkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19CQUNLVVBSRVNFVF9SRUxFQVNFKCkgQ0xFQVJfQklUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfQkRSU1QpDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFJDQ19SVENfQ2xvY2tfQ29uZmlndXJhdGlvbiBSQ0MgUlRDIENsb2NrIENvbmZpZ3VyYXRpb24NCi0gKiBAew0KLSAqLw0KLQ0KLS8qKiBAYnJpZWYgIE1hY3JvcyB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgUlRDIGNsb2NrLg0KLSAqIEBub3RlICAgQXMgdGhlIFJUQyBpcyBpbiB0aGUgQmFja3VwIGRvbWFpbiBhbmQgd3JpdGUgYWNjZXNzIGlzIGRlbmllZCB0bw0KLSAqICAgICAgICAgdGhpcyBkb21haW4gYWZ0ZXIgcmVzZXQsIHlvdSBoYXZlIHRvIGVuYWJsZSB3cml0ZSBhY2Nlc3MgdXNpbmcNCi0gKiAgICAgICAgIEhBTF9QV1JfRW5hYmxlQmtVcEFjY2VzcygpIGZ1bmN0aW9uIGJlZm9yZSB0byBjb25maWd1cmUgdGhlIFJUQw0KLSAqICAgICAgICAgKHRvIGJlIGRvbmUgb25jZSBhZnRlciByZXNldCkuDQotICogQG5vdGUgICBUaGVzZSBtYWNyb3MgbXVzdCBiZSB1c2VkIGFmdGVyIHRoZSBSVEMgY2xvY2sgc291cmNlIHdhcyBzZWxlY3RlZC4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1JDQ19SVENfRU5BQkxFKCkgU0VUX0JJVChSQ0MtPkJEQ1IsIFJDQ19CRENSX1JUQ0VOKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1JUQ19ESVNBQkxFKCkgQ0xFQVJfQklUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfUlRDRU4pDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGJyaWVmICBNYWNyb3MgdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhlIEludGVybmFsIEhpZ2ggU3BlZWQgMTZNSHogb3NjaWxsYXRvcg0KLSAqIChIU0kpLg0KLSAqIEBub3RlICAgVGhlIEhTSSBpcyBzdG9wcGVkIGJ5IGhhcmR3YXJlIHdoZW4gZW50ZXJpbmcgU1RPUCBhbmQgU1RBTkRCWSBtb2Rlcy4NCi0gKiAgICAgICAgIEl0IGlzIHVzZWQgKGVuYWJsZWQgYnkgaGFyZHdhcmUpIGFzIHN5c3RlbSBjbG9jayBzb3VyY2UgYWZ0ZXIgc3RhcnR1cA0KLSAqICAgICAgICAgZnJvbSBSZXNldCwgd2FrZXVwIGZyb20gU1RPUCBhbmQgU1RBTkRCWSBtb2RlLCBvciBpbiBjYXNlIG9mIGZhaWx1cmUNCi0gKiAgICAgICAgIG9mIHRoZSBIU0UgdXNlZCBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGFzIHN5c3RlbSBjbG9jayAoaWYgdGhlIENsb2NrDQotICogICAgICAgICBTZWN1cml0eSBTeXN0ZW0gQ1NTIGlzIGVuYWJsZWQpLg0KLSAqIEBub3RlICAgSFNJIGNhbiBub3QgYmUgc3RvcHBlZCBpZiBpdCBpcyB1c2VkIGFzIHN5c3RlbSBjbG9jayBzb3VyY2UuIEluIHRoaXMNCi0gKiBjYXNlLCB5b3UgaGF2ZSB0byBzZWxlY3QgYW5vdGhlciBzb3VyY2Ugb2YgdGhlIHN5c3RlbSBjbG9jayB0aGVuIHN0b3AgdGhlDQotICogSFNJLg0KLSAqIEBub3RlICAgQWZ0ZXIgZW5hYmxpbmcgdGhlIEhTSSwgdGhlIGFwcGxpY2F0aW9uIHNvZnR3YXJlIHNob3VsZCB3YWl0IG9uDQotICogSFNJUkRZIGZsYWcgdG8gYmUgc2V0IGluZGljYXRpbmcgdGhhdCBIU0kgY2xvY2sgaXMgc3RhYmxlIGFuZCBjYW4gYmUgdXNlZCBhcw0KLSAqICAgICAgICAgc3lzdGVtIGNsb2NrIHNvdXJjZS4NCi0gKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQotICogQG5vdGUgICBXaGVuIHRoZSBIU0kgaXMgc3RvcHBlZCwgSFNJUkRZIGZsYWcgZ29lcyBsb3cgYWZ0ZXIgNiBIU0kgb3NjaWxsYXRvcg0KLSAqICAgICAgICAgY2xvY2sgY3ljbGVzLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUkNDX0hTSV9FTkFCTEUoKSBTRVRfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0lPTikNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19IU0lfRElTQUJMRSgpIENMRUFSX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJT04pDQotDQotLyoqIEBicmllZiAgTWFjcm8gdG8gYWRqdXN0IHRoZSBJbnRlcm5hbCBIaWdoIFNwZWVkIDE2TUh6IG9zY2lsbGF0b3IgKEhTSSkNCi0gKiBjYWxpYnJhdGlvbiB2YWx1ZS4NCi0gKiBAbm90ZSAgIFRoZSBjYWxpYnJhdGlvbiBpcyB1c2VkIHRvIGNvbXBlbnNhdGUgZm9yIHRoZSB2YXJpYXRpb25zIGluIHZvbHRhZ2UNCi0gKiAgICAgICAgIGFuZCB0ZW1wZXJhdHVyZSB0aGF0IGluZmx1ZW5jZSB0aGUgZnJlcXVlbmN5IG9mIHRoZSBpbnRlcm5hbCBIU0kgUkMuDQotICogQHBhcmFtICBfX0hTSUNBTElCUkFUSU9OVkFMVUVfXyBzcGVjaWZpZXMgdGhlIGNhbGlicmF0aW9uIHRyaW1taW5nIHZhbHVlDQotICogICAgICAgICAoZGVmYXVsdCBpcyBSQ0NfSFNJQ0FMSUJSQVRJT05fREVGQVVMVCkuDQotICogICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMHg3Ri4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1JDQ19IU0lfQ0FMSUJSQVRJT05WQUxVRV9BREpVU1QoX19IU0lDQUxJQlJBVElPTlZBTFVFX18pIFwNCi0gIE1PRElGWV9SRUcoUkNDLT5JQ1NDUiwgUkNDX0lDU0NSX0hTSVRSSU0sICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgICAgKF9fSFNJQ0FMSUJSQVRJT05WQUxVRV9fKSA8PCBSQ0NfSUNTQ1JfSFNJVFJJTV9Qb3MpDQotDQotLyoqDQotICogQGJyaWVmICAgIE1hY3JvcyB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgZm9yY2Ugb2YgdGhlIEludGVybmFsIEhpZ2ggU3BlZWQNCi0gKiBvc2NpbGxhdG9yIChIU0kpIGluIFNUT1AgbW9kZSB0byBiZSBxdWlja2x5IGF2YWlsYWJsZSBhcyBrZXJuZWwgY2xvY2sgZm9yDQotICogVVNBUlRzIGFuZCBJMkNzLg0KLSAqIEBub3RlICAgICBLZWVwaW5nIHRoZSBIU0kgT04gaW4gU1RPUCBtb2RlIGFsbG93cyB0byBhdm9pZCBzbG93aW5nIGRvd24gdGhlDQotICogY29tbXVuaWNhdGlvbiBzcGVlZCBiZWNhdXNlIG9mIHRoZSBIU0kgc3RhcnR1cCB0aW1lLg0KLSAqIEBub3RlICAgICBUaGUgZW5hYmxlIG9mIHRoaXMgZnVuY3Rpb24gaGFzIG5vdCBlZmZlY3Qgb24gdGhlIEhTSU9OIGJpdC4NCi0gKiAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1JDQ19IU0lTVE9QX0VOQUJMRSgpIFNFVF9CSVQoUkNDLT5DUiwgUkNDX0NSX0hTSUtFUk9OKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0hTSVNUT1BfRElTQUJMRSgpIENMRUFSX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJS0VST04pDQotDQotLyoqIEBicmllZiAgTWFjcm9zIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBJbnRlcm5hbCBMb3cgU3BlZWQgb3NjaWxsYXRvciAoTFNJKS4NCi0gKiBAbm90ZSAgIEFmdGVyIGVuYWJsaW5nIHRoZSBMU0ksIHRoZSBhcHBsaWNhdGlvbiBzb2Z0d2FyZSBzaG91bGQgd2FpdCBvbg0KLSAqICAgICAgICAgTFNJUkRZIGZsYWcgdG8gYmUgc2V0IGluZGljYXRpbmcgdGhhdCBMU0kgY2xvY2sgaXMgc3RhYmxlIGFuZCBjYW4NCi0gKiAgICAgICAgIGJlIHVzZWQgdG8gY2xvY2sgdGhlIElXREcgYW5kL29yIHRoZSBSVEMuDQotICogQG5vdGUgICBMU0kgY2FuIG5vdCBiZSBkaXNhYmxlZCBpZiB0aGUgSVdERyBpcyBydW5uaW5nLg0KLSAqIEBub3RlICAgV2hlbiB0aGUgTFNJIGlzIHN0b3BwZWQsIExTSVJEWSBmbGFnIGdvZXMgbG93IGFmdGVyIDYgTFNJIG9zY2lsbGF0b3INCi0gKiAgICAgICAgIGNsb2NrIGN5Y2xlcy4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1JDQ19MU0lfRU5BQkxFKCkgU0VUX0JJVChSQ0MtPkNTUiwgUkNDX0NTUl9MU0lPTikNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19MU0lfRElTQUJMRSgpIENMRUFSX0JJVChSQ0MtPkNTUiwgUkNDX0NTUl9MU0lPTikNCi0NCi0vKioNCi0gKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgRXh0ZXJuYWwgSGlnaCBTcGVlZCBvc2NpbGxhdG9yIChIU0UpLg0KLSAqIEBub3RlICAgVHJhbnNpdGlvbiBIU0UgQnlwYXNzIHRvIEhTRSBPbiBhbmQgSFNFIE9uIHRvIEhTRSBCeXBhc3MgYXJlIG5vdA0KLSAqICAgICAgICAgc3VwcG9ydGVkIGJ5IHRoaXMgbWFjcm8uIFVzZXIgc2hvdWxkIHJlcXVlc3QgYSB0cmFuc2l0aW9uIHRvIEhTRSBPZmYNCi0gKiAgICAgICAgIGZpcnN0IGFuZCB0aGVuIEhTRSBPbiBvciBIU0UgQnlwYXNzLg0KLSAqIEBub3RlICAgQWZ0ZXIgZW5hYmxpbmcgdGhlIEhTRSAoUkNDX0hTRV9PTiBvciBSQ0NfSFNFX0J5cGFzcyksIHRoZQ0KLSAqIGFwcGxpY2F0aW9uIHNvZnR3YXJlIHNob3VsZCB3YWl0IG9uIEhTRVJEWSBmbGFnIHRvIGJlIHNldCBpbmRpY2F0aW5nIHRoYXQgSFNFDQotICogY2xvY2sgaXMgc3RhYmxlIGFuZCBjYW4gYmUgdXNlZCB0byBjbG9jayB0aGUgUExMIGFuZC9vciBzeXN0ZW0gY2xvY2suDQotICogQG5vdGUgICBIU0Ugc3RhdGUgY2FuIG5vdCBiZSBjaGFuZ2VkIGlmIGl0IGlzIHVzZWQgZGlyZWN0bHkgb3IgdGhyb3VnaCB0aGUNCi0gKiAgICAgICAgIFBMTCBhcyBzeXN0ZW0gY2xvY2suIEluIHRoaXMgY2FzZSwgeW91IGhhdmUgdG8gc2VsZWN0IGFub3RoZXIgc291cmNlDQotICogICAgICAgICBvZiB0aGUgc3lzdGVtIGNsb2NrIHRoZW4gY2hhbmdlIHRoZSBIU0Ugc3RhdGUgKGV4LiBkaXNhYmxlIGl0KS4NCi0gKiBAbm90ZSAgIFRoZSBIU0UgaXMgc3RvcHBlZCBieSBoYXJkd2FyZSB3aGVuIGVudGVyaW5nIFNUT1AgYW5kIFNUQU5EQlkgbW9kZXMuDQotICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIHJlc2V0IHRoZSBDU1NPTiBiaXQsIHNvIGlmIHRoZSBjbG9jayBzZWN1cml0eQ0KLSAqIHN5c3RlbShDU1MpIHdhcyBwcmV2aW91c2x5IGVuYWJsZWQgeW91IGhhdmUgdG8gZW5hYmxlIGl0IGFnYWluIGFmdGVyIGNhbGxpbmcNCi0gKiB0aGlzIGZ1bmN0aW9uLg0KLSAqIEBwYXJhbSAgX19TVEFURV9fIHNwZWNpZmllcyB0aGUgbmV3IHN0YXRlIG9mIHRoZSBIU0UuDQotICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19IU0VfT0ZGICBUdXJuIE9GRiB0aGUgSFNFIG9zY2lsbGF0b3IsIEhTRVJEWSBmbGFnDQotICogZ29lcyBsb3cgYWZ0ZXIgNiBIU0Ugb3NjaWxsYXRvciBjbG9jayBjeWNsZXMuDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0hTRV9PTiAgVHVybiBPTiB0aGUgSFNFIG9zY2lsbGF0b3IuDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0hTRV9CWVBBU1MgIEhTRSBvc2NpbGxhdG9yIGJ5cGFzc2VkIHdpdGggZXh0ZXJuYWwNCi0gKiBjbG9jay4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1JDQ19IU0VfQ09ORklHKF9fU1RBVEVfXykgICAgICAgICBcDQotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBpZiAoKF9fU1RBVEVfXykgPT0gUkNDX0hTRV9PTikgeyAgICAgICAgICAgIFwNCi0gICAgICBTRVRfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0VPTik7ICAgICAgICAgICBcDQotICAgIH0gZWxzZSBpZiAoKF9fU1RBVEVfXykgPT0gUkNDX0hTRV9CWVBBU1MpIHsgXA0KLSAgICAgIFNFVF9CSVQoUkNDLT5DUiwgUkNDX0NSX0hTRUJZUCk7ICAgICAgICAgIFwNCi0gICAgICBTRVRfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0VPTik7ICAgICAgICAgICBcDQotICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgIENMRUFSX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNFT04pOyAgICAgICAgIFwNCi0gICAgICBDTEVBUl9CSVQoUkNDLT5DUiwgUkNDX0NSX0hTRUJZUCk7ICAgICAgICBcDQotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgfSB3aGlsZSAoMCkNCi0NCi0vKioNCi0gKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgRXh0ZXJuYWwgTG93IFNwZWVkIG9zY2lsbGF0b3IgKExTRSkuDQotICogQG5vdGUgICBUcmFuc2l0aW9ucyBMU0UgQnlwYXNzIHRvIExTRSBPbiBhbmQgTFNFIE9uIHRvIExTRSBCeXBhc3MgYXJlIG5vdA0KLSAqICAgICAgICAgc3VwcG9ydGVkIGJ5IHRoaXMgbWFjcm8uIFVzZXIgc2hvdWxkIHJlcXVlc3QgYSB0cmFuc2l0aW9uIHRvIExTRSBPZmYNCi0gKiAgICAgICAgIGZpcnN0IGFuZCB0aGVuIExTRSBPbiBvciBMU0UgQnlwYXNzLg0KLSAqIEBub3RlICAgQXMgdGhlIExTRSBpcyBpbiB0aGUgQmFja3VwIGRvbWFpbiBhbmQgd3JpdGUgYWNjZXNzIGlzIGRlbmllZCB0bw0KLSAqICAgICAgICAgdGhpcyBkb21haW4gYWZ0ZXIgcmVzZXQsIHlvdSBoYXZlIHRvIGVuYWJsZSB3cml0ZSBhY2Nlc3MgdXNpbmcNCi0gKiAgICAgICAgIEhBTF9QV1JfRW5hYmxlQmtVcEFjY2VzcygpIGZ1bmN0aW9uIGJlZm9yZSB0byBjb25maWd1cmUgdGhlIExTRQ0KLSAqICAgICAgICAgKHRvIGJlIGRvbmUgb25jZSBhZnRlciByZXNldCkuDQotICogQG5vdGUgICBBZnRlciBlbmFibGluZyB0aGUgTFNFIChSQ0NfTFNFX09OIG9yIFJDQ19MU0VfQllQQVNTKSwgdGhlDQotICogYXBwbGljYXRpb24gc29mdHdhcmUgc2hvdWxkIHdhaXQgb24gTFNFUkRZIGZsYWcgdG8gYmUgc2V0IGluZGljYXRpbmcgdGhhdCBMU0UNCi0gKiBjbG9jayBpcyBzdGFibGUgYW5kIGNhbiBiZSB1c2VkIHRvIGNsb2NrIHRoZSBSVEMuDQotICogQHBhcmFtICBfX1NUQVRFX18gc3BlY2lmaWVzIHRoZSBuZXcgc3RhdGUgb2YgdGhlIExTRS4NCi0gKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0xTRV9PRkYgIFR1cm4gT0ZGIHRoZSBMU0Ugb3NjaWxsYXRvciwgTFNFUkRZIGZsYWcNCi0gKiBnb2VzIGxvdyBhZnRlciA2IExTRSBvc2NpbGxhdG9yIGNsb2NrIGN5Y2xlcy4NCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFNFX09OICBUdXJuIE9OIHRoZSBMU0Ugb3NjaWxsYXRvci4NCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFNFX0JZUEFTUyAgTFNFIG9zY2lsbGF0b3IgYnlwYXNzZWQgd2l0aCBleHRlcm5hbA0KLSAqIGNsb2NrLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUkNDX0xTRV9DT05GSUcoX19TVEFURV9fKSAgICAgICAgIFwNCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIGlmICgoX19TVEFURV9fKSA9PSBSQ0NfTFNFX09OKSB7ICAgICAgICAgICAgXA0KLSAgICAgIFNFVF9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9MU0VPTik7ICAgICAgIFwNCi0gICAgfSBlbHNlIGlmICgoX19TVEFURV9fKSA9PSBSQ0NfTFNFX0JZUEFTUykgeyBcDQotICAgICAgU0VUX0JJVChSQ0MtPkJEQ1IsIFJDQ19CRENSX0xTRUJZUCk7ICAgICAgXA0KLSAgICAgIFNFVF9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9MU0VPTik7ICAgICAgIFwNCi0gICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgQ0xFQVJfQklUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfTFNFT04pOyAgICAgXA0KLSAgICAgIENMRUFSX0JJVChSQ0MtPkJEQ1IsIFJDQ19CRENSX0xTRUJZUCk7ICAgIFwNCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICB9IHdoaWxlICgwKQ0KLQ0KLS8qKiBAYnJpZWYgIE1hY3JvcyB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgSW50ZXJuYWwgSGlnaCBTcGVlZCA0OE1IeiBvc2NpbGxhdG9yDQotICogKEhTSTQ4KS4NCi0gKiBAbm90ZSAgIFRoZSBIU0k0OCBpcyBzdG9wcGVkIGJ5IGhhcmR3YXJlIHdoZW4gZW50ZXJpbmcgU1RPUCBhbmQgU1RBTkRCWQ0KLSAqIG1vZGVzLg0KLSAqIEBub3RlICAgQWZ0ZXIgZW5hYmxpbmcgdGhlIEhTSTQ4LCB0aGUgYXBwbGljYXRpb24gc29mdHdhcmUgc2hvdWxkIHdhaXQgb24NCi0gKiBIU0k0OFJEWSBmbGFnIHRvIGJlIHNldCBpbmRpY2F0aW5nIHRoYXQgSFNJNDggY2xvY2sgaXMgc3RhYmxlLiBUaGlzIHBhcmFtZXRlcg0KLSAqIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9SQ0NfSFNJNDhfRU5BQkxFKCkgU0VUX0JJVChSQ0MtPkNSUkNSLCBSQ0NfQ1JSQ1JfSFNJNDhPTikNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19IU0k0OF9ESVNBQkxFKCkgQ0xFQVJfQklUKFJDQy0+Q1JSQ1IsIFJDQ19DUlJDUl9IU0k0OE9OKQ0KLQ0KLS8qKiBAYnJpZWYgIE1hY3JvcyB0byBjb25maWd1cmUgdGhlIFJUQyBjbG9jayAoUlRDQ0xLKS4NCi0gKiBAbm90ZSAgIEFzIHRoZSBSVEMgY2xvY2sgY29uZmlndXJhdGlvbiBiaXRzIGFyZSBpbiB0aGUgQmFja3VwIGRvbWFpbiBhbmQNCi0gKiB3cml0ZSBhY2Nlc3MgaXMgZGVuaWVkIHRvIHRoaXMgZG9tYWluIGFmdGVyIHJlc2V0LCB5b3UgaGF2ZSB0byBlbmFibGUgd3JpdGUNCi0gKiAgICAgICAgIGFjY2VzcyB1c2luZyB0aGUgUG93ZXIgQmFja3VwIEFjY2VzcyBtYWNybyBiZWZvcmUgdG8gY29uZmlndXJlDQotICogICAgICAgICB0aGUgUlRDIGNsb2NrIHNvdXJjZSAodG8gYmUgZG9uZSBvbmNlIGFmdGVyIHJlc2V0KS4NCi0gKiBAbm90ZSAgIE9uY2UgdGhlIFJUQyBjbG9jayBpcyBjb25maWd1cmVkIGl0IGNhbm5vdCBiZSBjaGFuZ2VkIHVubGVzcyB0aGUNCi0gKiAgICAgICAgIEJhY2t1cCBkb21haW4gaXMgcmVzZXQgdXNpbmcgX19IQUxfUkNDX0JBQ0tVUFJFU0VUX0ZPUkNFKCkgbWFjcm8sIG9yDQotICogYnkgYSBQb3dlciBPbiBSZXNldCAoUE9SKS4NCi0gKg0KLSAqIEBwYXJhbSAgX19SVENfQ0xLU09VUkNFX18gc3BlY2lmaWVzIHRoZSBSVEMgY2xvY2sgc291cmNlLg0KLSAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUlRDQ0xLU09VUkNFX05PTkUgIE5vIGNsb2NrIHNlbGVjdGVkIGFzIFJUQyBjbG9jay4NCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUlRDQ0xLU09VUkNFX0xTRSAgTFNFIHNlbGVjdGVkIGFzIFJUQyBjbG9jay4NCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUlRDQ0xLU09VUkNFX0xTSSAgTFNJIHNlbGVjdGVkIGFzIFJUQyBjbG9jay4NCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUlRDQ0xLU09VUkNFX0hTRV9ESVYzMiAgSFNFIGNsb2NrIGRpdmlkZWQgYnkgMzINCi0gKiBzZWxlY3RlZA0KLSAqDQotICogQG5vdGUgICBJZiB0aGUgTFNFIG9yIExTSSBpcyB1c2VkIGFzIFJUQyBjbG9jayBzb3VyY2UsIHRoZSBSVEMgY29udGludWVzIHRvDQotICogICAgICAgICB3b3JrIGluIFNUT1AgYW5kIFNUQU5EQlkgbW9kZXMsIGFuZCBjYW4gYmUgdXNlZCBhcyB3YWtldXAgc291cmNlLg0KLSAqICAgICAgICAgSG93ZXZlciwgd2hlbiB0aGUgSFNFIGNsb2NrIGlzIHVzZWQgYXMgUlRDIGNsb2NrIHNvdXJjZSwgdGhlIFJUQw0KLSAqICAgICAgICAgY2Fubm90IGJlIHVzZWQgaW4gU1RPUCBhbmQgU1RBTkRCWSBtb2Rlcy4NCi0gKiBAbm90ZSAgIFRoZSBtYXhpbXVtIGlucHV0IGNsb2NrIGZyZXF1ZW5jeSBmb3IgUlRDIGlzIDFNSHogKHdoZW4gdXNpbmcgSFNFIGFzDQotICogICAgICAgICBSVEMgY2xvY2sgc291cmNlKS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1JDQ19SVENfQ09ORklHKF9fUlRDX0NMS1NPVVJDRV9fKSBcDQotICBNT0RJRllfUkVHKFJDQy0+QkRDUiwgUkNDX0JEQ1JfUlRDU0VMLCAoX19SVENfQ0xLU09VUkNFX18pKQ0KLQ0KLS8qKiBAYnJpZWYgIE1hY3JvIHRvIGdldCB0aGUgUlRDIGNsb2NrIHNvdXJjZS4NCi0gKiBAcmV0dmFsIFRoZSByZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6DQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1JUQ0NMS1NPVVJDRV9OT05FICBObyBjbG9jayBzZWxlY3RlZCBhcyBSVEMgY2xvY2suDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1JUQ0NMS1NPVVJDRV9MU0UgIExTRSBzZWxlY3RlZCBhcyBSVEMgY2xvY2suDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1JUQ0NMS1NPVVJDRV9MU0kgIExTSSBzZWxlY3RlZCBhcyBSVEMgY2xvY2suDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1JUQ0NMS1NPVVJDRV9IU0VfRElWMzIgIEhTRSBjbG9jayBkaXZpZGVkIGJ5IDMyDQotICogc2VsZWN0ZWQNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1JDQ19HRVRfUlRDX1NPVVJDRSgpIChSRUFEX0JJVChSQ0MtPkJEQ1IsIFJDQ19CRENSX1JUQ1NFTCkpDQotDQotLyoqIEBicmllZiAgTWFjcm9zIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBtYWluIFBMTC4NCi0gKiBAbm90ZSAgIEFmdGVyIGVuYWJsaW5nIHRoZSBtYWluIFBMTCwgdGhlIGFwcGxpY2F0aW9uIHNvZnR3YXJlIHNob3VsZCB3YWl0IG9uDQotICogICAgICAgICBQTExSRFkgZmxhZyB0byBiZSBzZXQgaW5kaWNhdGluZyB0aGF0IFBMTCBjbG9jayBpcyBzdGFibGUgYW5kIGNhbg0KLSAqICAgICAgICAgYmUgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgc291cmNlLg0KLSAqIEBub3RlICAgVGhlIG1haW4gUExMIGNhbiBub3QgYmUgZGlzYWJsZWQgaWYgaXQgaXMgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgc291cmNlDQotICogQG5vdGUgICBUaGUgbWFpbiBQTEwgaXMgZGlzYWJsZWQgYnkgaGFyZHdhcmUgd2hlbiBlbnRlcmluZyBTVE9QIGFuZCBTVEFOREJZDQotICogbW9kZXMuDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9SQ0NfUExMX0VOQUJMRSgpIFNFVF9CSVQoUkNDLT5DUiwgUkNDX0NSX1BMTE9OKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX1BMTF9ESVNBQkxFKCkgQ0xFQVJfQklUKFJDQy0+Q1IsIFJDQ19DUl9QTExPTikNCi0NCi0vKiogQGJyaWVmICBNYWNybyB0byBjb25maWd1cmUgdGhlIFBMTCBjbG9jayBzb3VyY2UuDQotICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgdXNlZCBvbmx5IHdoZW4gdGhlIG1haW4gUExMIGlzIGRpc2FibGVkLg0KLSAqIEBwYXJhbSAgX19QTExTT1VSQ0VfXyBzcGVjaWZpZXMgdGhlIFBMTCBlbnRyeSBjbG9jayBzb3VyY2UuDQotICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QTExTT1VSQ0VfTk9ORSAgTm8gY2xvY2sgc2VsZWN0ZWQgYXMgUExMIGNsb2NrIGVudHJ5DQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BMTFNPVVJDRV9IU0kgIEhTSSBvc2NpbGxhdG9yIGNsb2NrIHNlbGVjdGVkIGFzIFBMTA0KLSAqIGNsb2NrIGVudHJ5DQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BMTFNPVVJDRV9IU0UgIEhTRSBvc2NpbGxhdG9yIGNsb2NrIHNlbGVjdGVkIGFzIFBMTA0KLSAqIGNsb2NrIGVudHJ5DQotICogQHJldHZhbCBOb25lDQotICoNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1JDQ19QTExfUExMU09VUkNFX0NPTkZJRyhfX1BMTFNPVVJDRV9fKSBcDQotICBNT0RJRllfUkVHKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMU1JDLCAoX19QTExTT1VSQ0VfXykpDQotDQotLyoqIEBicmllZiAgTWFjcm8gdG8gY29uZmlndXJlIHRoZSBQTEwgc291cmNlIGRpdmlzaW9uIGZhY3RvciBNLg0KLSAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIHVzZWQgb25seSB3aGVuIHRoZSBtYWluIFBMTCBpcyBkaXNhYmxlZC4NCi0gKiBAcGFyYW0gIF9fUExMTV9fIHNwZWNpZmllcyB0aGUgZGl2aXNpb24gZmFjdG9yIGZvciBQTEwgVkNPIGlucHV0IGNsb2NrDQotICogICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfUExMTV9DbG9ja19EaXZpZGVyLg0KLSAqIEBub3RlICAgWW91IGhhdmUgdG8gc2V0IHRoZSBQTExNIHBhcmFtZXRlciBjb3JyZWN0bHkgdG8gZW5zdXJlIHRoYXQgdGhlIFZDTw0KLSAqIGlucHV0IGZyZXF1ZW5jeSByYW5nZXMgZnJvbSAyLjY2IHRvIDggTUh6LiBJdCBpcyByZWNvbW1lbmRlZCB0byBzZWxlY3QgYQ0KLSAqIGZyZXF1ZW5jeSBvZiA4IE1IeiB0byBsaW1pdCBQTEwgaml0dGVyLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqDQotICovDQotI2RlZmluZSBfX0hBTF9SQ0NfUExMX1BMTE1fQ09ORklHKF9fUExMTV9fKSAgXA0KLSAgTU9ESUZZX1JFRyhSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTE0sIFwNCi0gICAgICAgICAgICAgKChfX1BMTE1fXyktMSkgPDwgUkNDX1BMTENGR1JfUExMTV9Qb3MpDQotDQotLyoqDQotICogQGJyaWVmICBNYWNybyB0byBjb25maWd1cmUgdGhlIG1haW4gUExMIGNsb2NrIHNvdXJjZSwgbXVsdGlwbGljYXRpb24gYW5kDQotICogZGl2aXNpb24gZmFjdG9ycy4NCi0gKiBAbm90ZSAgIFRoaXMgbWFjcm8gbXVzdCBiZSB1c2VkIG9ubHkgd2hlbiB0aGUgbWFpbiBQTEwgaXMgZGlzYWJsZWQuDQotICogQG5vdGUgICBUaGlzIG1hY3JvIHByZXNlcnZlcyB0aGUgUExMJ3Mgb3V0cHV0IGNsb2NrcyBlbmFibGUgc3RhdGUuDQotICoNCi0gKiBAcGFyYW0gIF9fUExMU09VUkNFX18gc3BlY2lmaWVzIHRoZSBQTEwgZW50cnkgY2xvY2sgc291cmNlLg0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BMTFNPVVJDRV9OT05FICBObyBjbG9jayBzZWxlY3RlZCBhcyBQTEwgY2xvY2sgZW50cnkNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUExMU09VUkNFX0hTSSAgSFNJIG9zY2lsbGF0b3IgY2xvY2sgc2VsZWN0ZWQgYXMgUExMDQotICogY2xvY2sgZW50cnkNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUExMU09VUkNFX0hTRSAgSFNFIG9zY2lsbGF0b3IgY2xvY2sgc2VsZWN0ZWQgYXMgUExMDQotICogY2xvY2sgZW50cnkNCi0gKg0KLSAqIEBwYXJhbSAgX19QTExNX18gc3BlY2lmaWVzIHRoZSBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTCBWQ08gaW5wdXQgY2xvY2suDQotICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX1BMTE1fQ2xvY2tfRGl2aWRlcg0KLSAqIEBub3RlICAgWW91IGhhdmUgdG8gc2V0IHRoZSBQTExNIHBhcmFtZXRlciBjb3JyZWN0bHkgdG8gZW5zdXJlIHRoYXQgdGhlIFZDTw0KLSAqIGlucHV0IGZyZXF1ZW5jeSByYW5nZXMgZnJvbSAyLjY2IHRvIDggTUh6LiBJdCBpcyByZWNvbW1lbmRlZCB0byBzZWxlY3QgYQ0KLSAqIGZyZXF1ZW5jeSBvZiA4IE1IeiB0byBsaW1pdCBQTEwgaml0dGVyLg0KLSAqDQotICogQHBhcmFtICBfX1BMTE5fXyBzcGVjaWZpZXMgdGhlIG11bHRpcGxpY2F0aW9uIGZhY3RvciBmb3IgUExMIFZDTyBvdXRwdXQNCi0gKiBjbG9jay4gVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIDggYW5kIDEyNy4NCi0gKiBAbm90ZSAgIFlvdSBoYXZlIHRvIHNldCB0aGUgUExMTiBwYXJhbWV0ZXIgY29ycmVjdGx5IHRvIGVuc3VyZSB0aGF0IHRoZSBWQ08NCi0gKiAgICAgICAgIG91dHB1dCBmcmVxdWVuY3kgaXMgYmV0d2VlbiA2NCBhbmQgMzQ0IE1Iei4NCi0gKg0KLSAqIEBwYXJhbSAgX19QTExQX18gc3BlY2lmaWVzIHRoZSBkaXZpc2lvbiBmYWN0b3IgZm9yIFNBSSBjbG9jay4NCi0gKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGluIHRoZSByYW5nZSAoMiB0byAzMSkuDQotICoNCi0gKiBAcGFyYW0gIF9fUExMUV9fIHNwZWNpZmllcyB0aGUgZGl2aXNpb24gZmFjdG9yIGZvciBPVEcgRlMsIFNETU1DMSBhbmQgUk5HDQotICogY2xvY2tzLiBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGluIHRoZSByYW5nZSAoMiwgNCwgNiBvciA4KS4NCi0gKiBAbm90ZSAgIElmIHRoZSBVU0IgT1RHIEZTIGlzIHVzZWQgaW4geW91ciBhcHBsaWNhdGlvbiwgeW91IGhhdmUgdG8gc2V0IHRoZQ0KLSAqICAgICAgICAgUExMUSBwYXJhbWV0ZXIgY29ycmVjdGx5IHRvIGhhdmUgNDggTUh6IGNsb2NrIGZvciB0aGUgVVNCLiBIb3dldmVyLA0KLSAqICAgICAgICAgdGhlIFNETU1DMSBhbmQgUk5HIG5lZWQgYSBmcmVxdWVuY3kgbG93ZXIgdGhhbiBvciBlcXVhbCB0byA0OCBNSHogdG8NCi0gKiB3b3JrIGNvcnJlY3RseS4NCi0gKiBAcGFyYW0gIF9fUExMUl9fIHNwZWNpZmllcyB0aGUgZGl2aXNpb24gZmFjdG9yIGZvciB0aGUgbWFpbiBzeXN0ZW0gY2xvY2suDQotICogQG5vdGUgICBZb3UgaGF2ZSB0byBzZXQgdGhlIFBMTFIgcGFyYW1ldGVyIGNvcnJlY3RseSB0byBub3QgZXhjZWVkIDE3ME1IWi4NCi0gKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGluIHRoZSByYW5nZSAoMiwgNCwgNiBvciA4KS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1JDQ19QTExfQ09ORklHKF9fUExMU09VUkNFX18sIF9fUExMTV9fLCBfX1BMTE5fXywgX19QTExQX18sICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19QTExRX18sIF9fUExMUl9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBNT0RJRllfUkVHKFJDQy0+UExMQ0ZHUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgICAgKFJDQ19QTExDRkdSX1BMTFNSQyB8IFJDQ19QTExDRkdSX1BMTE0gfCBSQ0NfUExMQ0ZHUl9QTExOIHwgICAgXA0KLSAgICAgICAgICAgICAgUkNDX1BMTENGR1JfUExMUSB8IFJDQ19QTExDRkdSX1BMTFIgfCBSQ0NfUExMQ0ZHUl9QTExQRElWKSwgICBcDQotICAgICAgICAgICAgICgoX19QTExTT1VSQ0VfXykgfCAoKChfX1BMTE1fXyktMVUpIDw8IFJDQ19QTExDRkdSX1BMTE1fUG9zKSB8IFwNCi0gICAgICAgICAgICAgICgoX19QTExOX18pIDw8IFJDQ19QTExDRkdSX1BMTE5fUG9zKSB8ICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAgICAgKCgoKF9fUExMUV9fKSA+PiAxVSkgLSAxVSkgPDwgUkNDX1BMTENGR1JfUExMUV9Qb3MpIHwgICAgICAgICBcDQotICAgICAgICAgICAgICAoKCgoX19QTExSX18pID4+IDFVKSAtIDFVKSA8PCBSQ0NfUExMQ0ZHUl9QTExSX1BvcykgfCAgICAgICAgIFwNCi0gICAgICAgICAgICAgICgoX19QTExQX18pIDw8IFJDQ19QTExDRkdSX1BMTFBESVZfUG9zKSkpDQotDQotLyoqIEBicmllZiAgTWFjcm8gdG8gZ2V0IHRoZSBvc2NpbGxhdG9yIHVzZWQgYXMgUExMIGNsb2NrIHNvdXJjZS4NCi0gKiBAcmV0dmFsIFRoZSBvc2NpbGxhdG9yIHVzZWQgYXMgUExMIGNsb2NrIHNvdXJjZS4gVGhlIHJldHVybmVkIHZhbHVlIGNhbiBiZQ0KLSAqIG9uZSBvZiB0aGUgZm9sbG93aW5nOg0KLSAqICAgICAgICAgICAgICAtIFJDQ19QTExTT1VSQ0VfTk9ORTogTm8gb3NjaWxsYXRvciBpcyB1c2VkIGFzIFBMTCBjbG9jayBzb3VyY2UuDQotICogICAgICAgICAgICAgIC0gUkNDX1BMTFNPVVJDRV9IU0k6IEhTSSBvc2NpbGxhdG9yIGlzIHVzZWQgYXMgUExMIGNsb2NrIHNvdXJjZS4NCi0gKiAgICAgICAgICAgICAgLSBSQ0NfUExMU09VUkNFX0hTRTogSFNFIG9zY2lsbGF0b3IgaXMgdXNlZCBhcyBQTEwgY2xvY2sgc291cmNlLg0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUkNDX0dFVF9QTExfT1NDU09VUkNFKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMU1JDKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSBvciBkaXNhYmxlIGVhY2ggY2xvY2sgb3V0cHV0IChSQ0NfUExMX1NZU0NMSywgUkNDX1BMTF80OE0xQ0xLLA0KLSAqIFJDQ19QTExfQURDQ0xLKQ0KLSAqIEBub3RlICAgRW5hYmxpbmcvZGlzYWJsaW5nIGNsb2NrIG91dHB1dHMgUkNDX1BMTF9BRENDTEsgYW5kIFJDQ19QTExfNDhNMUNMSw0KLSAqIGNhbiBiZSBkb25lIGF0IGFueXRpbWUgd2l0aG91dCB0aGUgbmVlZCB0byBzdG9wIHRoZSBQTEwgaW4gb3JkZXIgdG8gc2F2ZQ0KLSAqIHBvd2VyLiBCdXQgUkNDX1BMTF9TWVNDTEsgY2Fubm90IGJlIHN0b3BwZWQgaWYgdXNlZCBhcyBTeXN0ZW0gQ2xvY2suDQotICogQHBhcmFtICBfX1BMTENMT0NLT1VUX18gc3BlY2lmaWVzIHRoZSBQTEwgY2xvY2sgdG8gYmUgb3V0cHV0Lg0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb3IgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUExMX0FEQ0NMSyAgVGhpcyBjbG9jayBpcyB1c2VkIHRvIGdlbmVyYXRlIGEgY2xvY2sNCi0gKiBvbiBBREMuDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BMTF80OE0xQ0xLICBUaGlzIENsb2NrIGlzIHVzZWQgdG8gZ2VuZXJhdGUgdGhlDQotICogY2xvY2sgZm9yIHRoZSBVU0IgKDQ4IE1IeiksIEZEQ0FOICg8PTQ4IE1IeikgYW5kIFFTUEkgKDw9NDggTUh6KS4NCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUExMX1NZU0NMSyAgVGhpcyBDbG9jayBpcyB1c2VkIHRvIGdlbmVyYXRlIHRoZSBoaWdoDQotICogc3BlZWQgc3lzdGVtIGNsb2NrICh1cCB0byAxNzBNSHopDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9SQ0NfUExMQ0xLT1VUX0VOQUJMRShfX1BMTENMT0NLT1VUX18pIFwNCi0gIFNFVF9CSVQoUkNDLT5QTExDRkdSLCAoX19QTExDTE9DS09VVF9fKSkNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19QTExDTEtPVVRfRElTQUJMRShfX1BMTENMT0NLT1VUX18pIFwNCi0gIENMRUFSX0JJVChSQ0MtPlBMTENGR1IsIChfX1BMTENMT0NLT1VUX18pKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IGNsb2NrIG91dHB1dCBlbmFibGUgc3RhdHVzIChSQ0NfUExMX1NZU0NMSywgUkNDX1BMTF80OE0xQ0xLLA0KLSAqIFJDQ19QTExfU0FJM0NMSykNCi0gKiBAcGFyYW0gIF9fUExMQ0xPQ0tPVVRfXyBzcGVjaWZpZXMgdGhlIG91dHB1dCBQTEwgY2xvY2sgdG8gYmUgY2hlY2tlZC4NCi0gKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QTExfQURDQ0xLICBUaGlzIGNsb2NrIGlzIHVzZWQgdG8gZ2VuZXJhdGUgYSBjbG9jaw0KLSAqIG9uIEFEQy4NCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUExMXzQ4TTFDTEsgIFRoaXMgQ2xvY2sgaXMgdXNlZCB0byBnZW5lcmF0ZSB0aGUNCi0gKiBjbG9jayBmb3IgdGhlIFVTQiAoNDggTUh6KSwgRkRDQU4gKDw9NDggTUh6KSBhbmQgUVNQSSAoPD00OCBNSHopLg0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QTExfU1lTQ0xLICBUaGlzIENsb2NrIGlzIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGhpZ2gNCi0gKiBzcGVlZCBzeXN0ZW0gY2xvY2sgKHVwIHRvIDE3ME1IeikNCi0gKiBAcmV0dmFsIFNFVCAvIFJFU0VUDQotICovDQotI2RlZmluZSBfX0hBTF9SQ0NfR0VUX1BMTENMS09VVF9DT05GSUcoX19QTExDTE9DS09VVF9fKSBcDQotICBSRUFEX0JJVChSQ0MtPlBMTENGR1IsIChfX1BMTENMT0NLT1VUX18pKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgTWFjcm8gdG8gY29uZmlndXJlIHRoZSBzeXN0ZW0gY2xvY2sgc291cmNlLg0KLSAqIEBwYXJhbSAgX19TWVNDTEtTT1VSQ0VfXyBzcGVjaWZpZXMgdGhlIHN5c3RlbSBjbG9jayBzb3VyY2UuDQotICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgICAgLSBSQ0NfU1lTQ0xLU09VUkNFX0hTSTogSFNJIG9zY2lsbGF0b3IgaXMgdXNlZCBhcyBzeXN0ZW0gY2xvY2sNCi0gKiBzb3VyY2UuDQotICogICAgICAgICAgICAgIC0gUkNDX1NZU0NMS1NPVVJDRV9IU0U6IEhTRSBvc2NpbGxhdG9yIGlzIHVzZWQgYXMgc3lzdGVtIGNsb2NrDQotICogc291cmNlLg0KLSAqICAgICAgICAgICAgICAtIFJDQ19TWVNDTEtTT1VSQ0VfUExMQ0xLOiBQTEwgb3V0cHV0IGlzIHVzZWQgYXMgc3lzdGVtIGNsb2NrDQotICogc291cmNlLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUkNDX1NZU0NMS19DT05GSUcoX19TWVNDTEtTT1VSQ0VfXykgXA0KLSAgTU9ESUZZX1JFRyhSQ0MtPkNGR1IsIFJDQ19DRkdSX1NXLCAoX19TWVNDTEtTT1VSQ0VfXykpDQotDQotLyoqIEBicmllZiAgTWFjcm8gdG8gZ2V0IHRoZSBjbG9jayBzb3VyY2UgdXNlZCBhcyBzeXN0ZW0gY2xvY2suDQotICogQHJldHZhbCBUaGUgY2xvY2sgc291cmNlIHVzZWQgYXMgc3lzdGVtIGNsb2NrLiBUaGUgcmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZQ0KLSAqICAgICAgICAgb2YgdGhlIGZvbGxvd2luZzoNCi0gKiAgICAgICAgICAgICAgLSBSQ0NfU1lTQ0xLU09VUkNFX1NUQVRVU19IU0k6IEhTSSB1c2VkIGFzIHN5c3RlbSBjbG9jay4NCi0gKiAgICAgICAgICAgICAgLSBSQ0NfU1lTQ0xLU09VUkNFX1NUQVRVU19IU0U6IEhTRSB1c2VkIGFzIHN5c3RlbSBjbG9jay4NCi0gKiAgICAgICAgICAgICAgLSBSQ0NfU1lTQ0xLU09VUkNFX1NUQVRVU19QTExDTEs6IFBMTCB1c2VkIGFzIHN5c3RlbSBjbG9jay4NCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1JDQ19HRVRfU1lTQ0xLX1NPVVJDRSgpIChSRUFEX0JJVChSQ0MtPkNGR1IsIFJDQ19DRkdSX1NXUykpDQotDQotLyoqDQotICogQGJyaWVmICBNYWNybyB0byBjb25maWd1cmUgdGhlIEV4dGVybmFsIExvdyBTcGVlZCBvc2NpbGxhdG9yIChMU0UpIGRyaXZlDQotICogY2FwYWJpbGl0eS4NCi0gKiBAbm90ZSAgIEFzIHRoZSBMU0UgaXMgaW4gdGhlIEJhY2t1cCBkb21haW4gYW5kIHdyaXRlIGFjY2VzcyBpcyBkZW5pZWQgdG8NCi0gKiAgICAgICAgIHRoaXMgZG9tYWluIGFmdGVyIHJlc2V0LCB5b3UgaGF2ZSB0byBlbmFibGUgd3JpdGUgYWNjZXNzIHVzaW5nDQotICogICAgICAgICBIQUxfUFdSX0VuYWJsZUJrVXBBY2Nlc3MoKSBmdW5jdGlvbiBiZWZvcmUgdG8gY29uZmlndXJlIHRoZSBMU0UNCi0gKiAgICAgICAgICh0byBiZSBkb25lIG9uY2UgYWZ0ZXIgcmVzZXQpLg0KLSAqIEBwYXJhbSAgX19MU0VEUklWRV9fIHNwZWNpZmllcyB0aGUgbmV3IHN0YXRlIG9mIHRoZSBMU0UgZHJpdmUgY2FwYWJpbGl0eS4NCi0gKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19MU0VEUklWRV9MT1cgIExTRSBvc2NpbGxhdG9yIGxvdyBkcml2ZSBjYXBhYmlsaXR5Lg0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19MU0VEUklWRV9NRURJVU1MT1cgIExTRSBvc2NpbGxhdG9yIG1lZGl1bSBsb3cgZHJpdmUNCi0gKiBjYXBhYmlsaXR5Lg0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19MU0VEUklWRV9NRURJVU1ISUdIICBMU0Ugb3NjaWxsYXRvciBtZWRpdW0gaGlnaA0KLSAqIGRyaXZlIGNhcGFiaWxpdHkuDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0xTRURSSVZFX0hJR0ggIExTRSBvc2NpbGxhdG9yIGhpZ2ggZHJpdmUgY2FwYWJpbGl0eS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1JDQ19MU0VEUklWRV9DT05GSUcoX19MU0VEUklWRV9fKSBcDQotICBNT0RJRllfUkVHKFJDQy0+QkRDUiwgUkNDX0JEQ1JfTFNFRFJWLCAoX19MU0VEUklWRV9fKSkNCi0NCi0vKiogQGJyaWVmICBNYWNybyB0byBjb25maWd1cmUgdGhlIE1DTyBjbG9jay4NCi0gKiBAcGFyYW0gIF9fTUNPQ0xLU09VUkNFX18gc3BlY2lmaWVzIHRoZSBNQ08gY2xvY2sgc291cmNlLg0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DTzFTT1VSQ0VfTk9DTE9DSyAgTUNPIG91dHB1dCBkaXNhYmxlZA0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ08xU09VUkNFX1NZU0NMSyAgU3lzdGVtICBjbG9jayBzZWxlY3RlZCBhcyBNQ08NCi0gKiBzb3VyY2UNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPMVNPVVJDRV9IU0kgIEhTSSBjbG9jayBzZWxlY3RlZCBhcyBNQ08gc291cmNlDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DTzFTT1VSQ0VfSFNFICBIU0UgY2xvY2sgc2VsZWN0ZWQgYXMgTUNPIHNvdXJjZWUNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPMVNPVVJDRV9QTExDTEsgIE1haW4gUExMIGNsb2NrIHNlbGVjdGVkIGFzIE1DTw0KLSAqIHNvdXJjZQ0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ08xU09VUkNFX0xTSSAgTFNJIGNsb2NrIHNlbGVjdGVkIGFzIE1DTyBzb3VyY2UNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPMVNPVVJDRV9MU0UgIExTRSBjbG9jayBzZWxlY3RlZCBhcyBNQ08gc291cmNlDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DTzFTT1VSQ0VfSFNJNDggIEhTSTQ4IGNsb2NrIHNlbGVjdGVkIGFzIE1DTyBzb3VyY2UNCi0gKiBmb3IgZGV2aWNlcyB3aXRoIEhTSTQ4DQotICogQHBhcmFtICBfX01DT0RJVl9fIHNwZWNpZmllcyB0aGUgTUNPIGNsb2NrIHByZXNjYWxlci4NCi0gKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ09ESVZfMSAgIE1DTyBjbG9jayBzb3VyY2UgaXMgZGl2aWRlZCBieSAxDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DT0RJVl8yICAgTUNPIGNsb2NrIHNvdXJjZSBpcyBkaXZpZGVkIGJ5IDINCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPRElWXzQgICBNQ08gY2xvY2sgc291cmNlIGlzIGRpdmlkZWQgYnkgNA0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ09ESVZfOCAgIE1DTyBjbG9jayBzb3VyY2UgaXMgZGl2aWRlZCBieSA4DQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DT0RJVl8xNiAgTUNPIGNsb2NrIHNvdXJjZSBpcyBkaXZpZGVkIGJ5IDE2DQotICovDQotI2RlZmluZSBfX0hBTF9SQ0NfTUNPMV9DT05GSUcoX19NQ09DTEtTT1VSQ0VfXywgX19NQ09ESVZfXykgIFwNCi0gIE1PRElGWV9SRUcoUkNDLT5DRkdSLCAoUkNDX0NGR1JfTUNPU0VMIHwgUkNDX0NGR1JfTUNPUFJFKSwgXA0KLSAgICAgICAgICAgICAoKF9fTUNPQ0xLU09VUkNFX18pIHwgKF9fTUNPRElWX18pKSkNCi0NCi0vKiogQGRlZmdyb3VwIFJDQ19GbGFnc19JbnRlcnJ1cHRzX01hbmFnZW1lbnQgRmxhZ3MgSW50ZXJydXB0cyBNYW5hZ2VtZW50DQotICogQGJyaWVmIG1hY3JvcyB0byBtYW5hZ2UgdGhlIHNwZWNpZmllZCBSQ0MgRmxhZ3MgYW5kIGludGVycnVwdHMuDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGJyaWVmICBFbmFibGUgUkNDIGludGVycnVwdCAoUGVyZm9ybSBCeXRlIGFjY2VzcyB0byBSQ0NfQ0lSWzE0OjhdIGJpdHMgdG8NCi0gKiBlbmFibGUgdGhlIHNlbGVjdGVkIGludGVycnVwdHMpLg0KLSAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFJDQyBpbnRlcnJ1cHQgc291cmNlcyB0byBiZSBlbmFibGVkLg0KLSAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfTFNJUkRZICBMU0kgcmVhZHkgaW50ZXJydXB0DQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX0xTRVJEWSAgTFNFIHJlYWR5IGludGVycnVwdA0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JVF9IU0lSRFkgIEhTSSByZWFkeSBpbnRlcnJ1cHQNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfSFNFUkRZICBIU0UgcmVhZHkgaW50ZXJydXB0DQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX1BMTFJEWSAgTWFpbiBQTEwgcmVhZHkgaW50ZXJydXB0DQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX0xTRUNTUyAgTFNFIENsb2NrIHNlY3VyaXR5IHN5c3RlbSBpbnRlcnJ1cHQNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfSFNJNDhSRFkgIEhTSTQ4IHJlYWR5IGludGVycnVwdCBmb3IgZGV2aWNlcyB3aXRoDQotICogSFNJNDgNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1JDQ19FTkFCTEVfSVQoX19JTlRFUlJVUFRfXykgU0VUX0JJVChSQ0MtPkNJRVIsIChfX0lOVEVSUlVQVF9fKSkNCi0NCi0vKiogQGJyaWVmIERpc2FibGUgUkNDIGludGVycnVwdCAoUGVyZm9ybSBCeXRlIGFjY2VzcyB0byBSQ0NfQ0lSWzE0OjhdIGJpdHMgdG8NCi0gKiBkaXNhYmxlIHRoZSBzZWxlY3RlZCBpbnRlcnJ1cHRzKS4NCi0gKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBSQ0MgaW50ZXJydXB0IHNvdXJjZXMgdG8gYmUgZGlzYWJsZWQuDQotICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JVF9MU0lSRFkgIExTSSByZWFkeSBpbnRlcnJ1cHQNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfTFNFUkRZICBMU0UgcmVhZHkgaW50ZXJydXB0DQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX0hTSVJEWSAgSFNJIHJlYWR5IGludGVycnVwdA0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JVF9IU0VSRFkgIEhTRSByZWFkeSBpbnRlcnJ1cHQNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfUExMUkRZICBNYWluIFBMTCByZWFkeSBpbnRlcnJ1cHQNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfTFNFQ1NTICBMU0UgQ2xvY2sgc2VjdXJpdHkgc3lzdGVtIGludGVycnVwdA0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JVF9IU0k0OFJEWSAgSFNJNDggcmVhZHkgaW50ZXJydXB0IGZvciBkZXZpY2VzIHdpdGgNCi0gKiBIU0k0OA0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUkNDX0RJU0FCTEVfSVQoX19JTlRFUlJVUFRfXykgXA0KLSAgQ0xFQVJfQklUKFJDQy0+Q0lFUiwgKF9fSU5URVJSVVBUX18pKQ0KLQ0KLS8qKiBAYnJpZWYgIENsZWFyIHRoZSBSQ0MncyBpbnRlcnJ1cHQgcGVuZGluZyBiaXRzIChQZXJmb3JtIEJ5dGUgYWNjZXNzIHRvDQotICogUkNDX0NJUlsyMzoxNl0gYml0cyB0byBjbGVhciB0aGUgc2VsZWN0ZWQgaW50ZXJydXB0IHBlbmRpbmcgYml0cy4NCi0gKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBpbnRlcnJ1cHQgcGVuZGluZyBiaXQgdG8gY2xlYXIuDQotICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JVF9MU0lSRFkgIExTSSByZWFkeSBpbnRlcnJ1cHQNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfTFNFUkRZICBMU0UgcmVhZHkgaW50ZXJydXB0DQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX0hTSVJEWSAgSFNJIHJlYWR5IGludGVycnVwdA0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JVF9IU0VSRFkgIEhTRSByZWFkeSBpbnRlcnJ1cHQNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfUExMUkRZICBNYWluIFBMTCByZWFkeSBpbnRlcnJ1cHQNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfQ1NTICBIU0UgQ2xvY2sgc2VjdXJpdHkgc3lzdGVtIGludGVycnVwdA0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JVF9MU0VDU1MgIExTRSBDbG9jayBzZWN1cml0eSBzeXN0ZW0gaW50ZXJydXB0DQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX0hTSTQ4UkRZICBIU0k0OCByZWFkeSBpbnRlcnJ1cHQgZm9yIGRldmljZXMgd2l0aA0KLSAqIEhTSTQ4DQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9SQ0NfQ0xFQVJfSVQoX19JTlRFUlJVUFRfXykgKFJDQy0+Q0lDUiA9IChfX0lOVEVSUlVQVF9fKSkNCi0NCi0vKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBSQ0MgaW50ZXJydXB0IGhhcyBvY2N1cnJlZCBvciBub3QuDQotICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgUkNDIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suDQotICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JVF9MU0lSRFkgIExTSSByZWFkeSBpbnRlcnJ1cHQNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfTFNFUkRZICBMU0UgcmVhZHkgaW50ZXJydXB0DQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX0hTSVJEWSAgSFNJIHJlYWR5IGludGVycnVwdA0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JVF9IU0VSRFkgIEhTRSByZWFkeSBpbnRlcnJ1cHQNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfUExMUkRZICBNYWluIFBMTCByZWFkeSBpbnRlcnJ1cHQNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfQ1NTICBIU0UgQ2xvY2sgc2VjdXJpdHkgc3lzdGVtIGludGVycnVwdA0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JVF9MU0VDU1MgIExTRSBDbG9jayBzZWN1cml0eSBzeXN0ZW0gaW50ZXJydXB0DQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX0hTSTQ4UkRZIEhTSTQ4IHJlYWR5IGludGVycnVwdCBmb3IgZGV2aWNlcyB3aXRoDQotICogSFNJNDgNCi0gKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgX19JTlRFUlJVUFRfXyAoVFJVRSBvciBGQUxTRSkuDQotICovDQotI2RlZmluZSBfX0hBTF9SQ0NfR0VUX0lUKF9fSU5URVJSVVBUX18pIFwNCi0gICgoUkNDLT5DSUZSICYgKF9fSU5URVJSVVBUX18pKSA9PSAoX19JTlRFUlJVUFRfXykpDQotDQotLyoqIEBicmllZiBTZXQgUk1WRiBiaXQgdG8gY2xlYXIgdGhlIHJlc2V0IGZsYWdzLg0KLSAqICAgICAgICBUaGUgcmVzZXQgZmxhZ3MgYXJlOiBSQ0NfRkxBR19GV1JSU1QsIFJDQ19GTEFHX09CTFJTVCwNCi0gKiBSQ0NfRkxBR19QSU5SU1QsIFJDQ19GTEFHX0JPUlJTVCwgUkNDX0ZMQUdfU0ZUUlNULCBSQ0NfRkxBR19JV0RHUlNULA0KLSAqIFJDQ19GTEFHX1dXREdSU1QgYW5kIFJDQ19GTEFHX0xQV1JSU1QuDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9SQ0NfQ0xFQVJfUkVTRVRfRkxBR1MoKSAoUkNDLT5DU1IgfD0gUkNDX0NTUl9STVZGKQ0KLQ0KLS8qKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNlbGVjdGVkIFJDQyBmbGFnIGlzIHNldCBvciBub3QuDQotICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2hlY2suDQotICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19GTEFHX0hTSVJEWSAgSFNJIG9zY2lsbGF0b3IgY2xvY2sgcmVhZHkNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfRkxBR19IU0VSRFkgIEhTRSBvc2NpbGxhdG9yIGNsb2NrIHJlYWR5DQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0ZMQUdfUExMUkRZICBNYWluIFBMTCBjbG9jayByZWFkeQ0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19GTEFHX0hTSTQ4UkRZICBIU0k0OCBjbG9jayByZWFkeSBmb3IgZGV2aWNlcyB3aXRoDQotICogSFNJNDgNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfRkxBR19MU0VSRFkgIExTRSBvc2NpbGxhdG9yIGNsb2NrIHJlYWR5DQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0ZMQUdfTFNFQ1NTRCAgQ2xvY2sgc2VjdXJpdHkgc3lzdGVtIGZhaWx1cmUgb24gTFNFDQotICogb3NjaWxsYXRvciBkZXRlY3Rpb24NCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfRkxBR19MU0lSRFkgIExTSSBvc2NpbGxhdG9yIGNsb2NrIHJlYWR5DQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0ZMQUdfQk9SUlNUICBCT1IgcmVzZXQNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfRkxBR19PQkxSU1QgIE9CTFJTVCByZXNldA0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19GTEFHX1BJTlJTVCAgUGluIHJlc2V0DQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0ZMQUdfU0ZUUlNUICBTb2Z0d2FyZSByZXNldA0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19GTEFHX0lXREdSU1QgIEluZGVwZW5kZW50IFdhdGNoZG9nIHJlc2V0DQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0ZMQUdfV1dER1JTVCAgV2luZG93IFdhdGNoZG9nIHJlc2V0DQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0ZMQUdfTFBXUlJTVCAgTG93IFBvd2VyIHJlc2V0DQotICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fRkxBR19fIChUUlVFIG9yIEZBTFNFKS4NCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1JDQ19HRVRfRkxBRyhfX0ZMQUdfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKCgoKCgoX19GTEFHX18pID4+IDVVKSA9PSAxVSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICA/IFJDQy0+Q1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgOiAoKCgoX19GTEFHX18pID4+IDVVKSA9PSA0VSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICAgICAgICAgICA/IFJDQy0+Q1JSQ1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgOiAoKCgoX19GTEFHX18pID4+IDVVKSA9PSAyVSkgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICA/IFJDQy0+QkRDUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgOiAoKCgoX19GTEFHX18pID4+IDVVKSA9PSAzVSkgPyBSQ0MtPkNTUiAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUkNDLT5DSUZSKSkpKSAmIFwNCi0gICAgICgodWludDMyX3QpMVUgPDwgKChfX0ZMQUdfXykgJiBSQ0NfRkxBR19NQVNLKSkpICE9IDBVKSAgICAgICAgICAgICBcDQotICAgICAgID8gMVUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICA6IDBVKQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAYWRkdG9ncm91cCBSQ0NfUHJpdmF0ZV9Db25zdGFudHMNCi0gKiBAew0KLSAqLw0KLS8qIERlZmluZXMgdXNlZCBmb3IgRmxhZ3MgKi8NCi0jZGVmaW5lIENSX1JFR19JTkRFWCAxVQ0KLSNkZWZpbmUgQkRDUl9SRUdfSU5ERVggMlUNCi0jZGVmaW5lIENTUl9SRUdfSU5ERVggM1UNCi0jZGVmaW5lIENSUkNSX1JFR19JTkRFWCA0VQ0KLQ0KLSNkZWZpbmUgUkNDX0ZMQUdfTUFTSyAweDFGVQ0KLQ0KLS8qIERlZmluZSB1c2VkIGZvciBJU19SQ0NfQ0xPQ0tUWVBFKCkgKi8NCi0jZGVmaW5lIFJDQ19DTE9DS1RZUEVfQUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoUkNDX0NMT0NLVFlQRV9TWVNDTEsgfCBSQ0NfQ0xPQ0tUWVBFX0hDTEsgfCBSQ0NfQ0xPQ0tUWVBFX1BDTEsxIHwgXA0KLSAgIFJDQ19DTE9DS1RZUEVfUENMSzIpIC8qITwgQWxsIGNsY29rdHlwZSB0byBjb25maWd1cmUgKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBhZGR0b2dyb3VwIFJDQ19Qcml2YXRlX01hY3Jvcw0KLSAqIEB7DQotICovDQotDQotI2RlZmluZSBJU19SQ0NfT1NDSUxMQVRPUlRZUEUoX19PU0NJTExBVE9SX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKCgoX19PU0NJTExBVE9SX18pID09IFJDQ19PU0NJTExBVE9SVFlQRV9OT05FKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKChfX09TQ0lMTEFUT1JfXykgJiBSQ0NfT1NDSUxMQVRPUlRZUEVfSFNFKSA9PSBSQ0NfT1NDSUxMQVRPUlRZUEVfSFNFKSB8fCBcDQotICAgKCgoX19PU0NJTExBVE9SX18pICYgUkNDX09TQ0lMTEFUT1JUWVBFX0hTSSkgPT0gUkNDX09TQ0lMTEFUT1JUWVBFX0hTSSkgfHwgXA0KLSAgICgoKF9fT1NDSUxMQVRPUl9fKSAmIFJDQ19PU0NJTExBVE9SVFlQRV9IU0k0OCkgPT0gICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgUkNDX09TQ0lMTEFUT1JUWVBFX0hTSTQ4KSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKCgoX19PU0NJTExBVE9SX18pICYgUkNDX09TQ0lMTEFUT1JUWVBFX0xTSSkgPT0gUkNDX09TQ0lMTEFUT1JUWVBFX0xTSSkgfHwgXA0KLSAgICgoKF9fT1NDSUxMQVRPUl9fKSAmIFJDQ19PU0NJTExBVE9SVFlQRV9MU0UpID09IFJDQ19PU0NJTExBVE9SVFlQRV9MU0UpKQ0KLQ0KLSNkZWZpbmUgSVNfUkNDX0hTRShfX0hTRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKCgoX19IU0VfXykgPT0gUkNDX0hTRV9PRkYpIHx8ICgoX19IU0VfXykgPT0gUkNDX0hTRV9PTikgfHwgXA0KLSAgICgoX19IU0VfXykgPT0gUkNDX0hTRV9CWVBBU1MpKQ0KLQ0KLSNkZWZpbmUgSVNfUkNDX0xTRShfX0xTRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKCgoX19MU0VfXykgPT0gUkNDX0xTRV9PRkYpIHx8ICgoX19MU0VfXykgPT0gUkNDX0xTRV9PTikgfHwgXA0KLSAgICgoX19MU0VfXykgPT0gUkNDX0xTRV9CWVBBU1MpKQ0KLQ0KLSNkZWZpbmUgSVNfUkNDX0hTSShfX0hTSV9fKSBcDQotICAoKChfX0hTSV9fKSA9PSBSQ0NfSFNJX09GRikgfHwgKChfX0hTSV9fKSA9PSBSQ0NfSFNJX09OKSkNCi0NCi0jZGVmaW5lIElTX1JDQ19IU0lfQ0FMSUJSQVRJT05fVkFMVUUoX19WQUxVRV9fKSBcDQotICAoKF9fVkFMVUVfXykgPD0gKFJDQ19JQ1NDUl9IU0lUUklNID4+IFJDQ19JQ1NDUl9IU0lUUklNX1BvcykpDQotDQotI2RlZmluZSBJU19SQ0NfTFNJKF9fTFNJX18pIFwNCi0gICgoKF9fTFNJX18pID09IFJDQ19MU0lfT0ZGKSB8fCAoKF9fTFNJX18pID09IFJDQ19MU0lfT04pKQ0KLQ0KLSNkZWZpbmUgSVNfUkNDX0hTSTQ4KF9fSFNJNDhfXykgXA0KLSAgKCgoX19IU0k0OF9fKSA9PSBSQ0NfSFNJNDhfT0ZGKSB8fCAoKF9fSFNJNDhfXykgPT0gUkNDX0hTSTQ4X09OKSkNCi0NCi0jZGVmaW5lIElTX1JDQ19QTEwoX19QTExfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKCgoX19QTExfXykgPT0gUkNDX1BMTF9OT05FKSB8fCAoKF9fUExMX18pID09IFJDQ19QTExfT0ZGKSB8fCBcDQotICAgKChfX1BMTF9fKSA9PSBSQ0NfUExMX09OKSkNCi0NCi0jZGVmaW5lIElTX1JDQ19QTExTT1VSQ0UoX19TT1VSQ0VfXykgICAgICAgXA0KLSAgKCgoX19TT1VSQ0VfXykgPT0gUkNDX1BMTFNPVVJDRV9OT05FKSB8fCBcDQotICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfUExMU09VUkNFX0hTSSkgfHwgKChfX1NPVVJDRV9fKSA9PSBSQ0NfUExMU09VUkNFX0hTRSkpDQotDQotI2RlZmluZSBJU19SQ0NfUExMTV9WQUxVRShfX1ZBTFVFX18pIFwNCi0gICgoMVUgPD0gKF9fVkFMVUVfXykpICYmICgoX19WQUxVRV9fKSA8PSAxNlUpKQ0KLQ0KLSNkZWZpbmUgSVNfUkNDX1BMTE5fVkFMVUUoX19WQUxVRV9fKSBcDQotICAoKDhVIDw9IChfX1ZBTFVFX18pKSAmJiAoKF9fVkFMVUVfXykgPD0gMTI3VSkpDQotDQotI2RlZmluZSBJU19SQ0NfUExMUF9WQUxVRShfX1ZBTFVFX18pIFwNCi0gICgoKF9fVkFMVUVfXykgPj0gMlUpICYmICgoX19WQUxVRV9fKSA8PSAzMVUpKQ0KLQ0KLSNkZWZpbmUgSVNfUkNDX1BMTFFfVkFMVUUoX19WQUxVRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoKF9fVkFMVUVfXykgPT0gMlUpIHx8ICgoX19WQUxVRV9fKSA9PSA0VSkgfHwgKChfX1ZBTFVFX18pID09IDZVKSB8fCBcDQotICAgKChfX1ZBTFVFX18pID09IDhVKSkNCi0NCi0jZGVmaW5lIElTX1JDQ19QTExSX1ZBTFVFKF9fVkFMVUVfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKChfX1ZBTFVFX18pID09IDJVKSB8fCAoKF9fVkFMVUVfXykgPT0gNFUpIHx8ICgoX19WQUxVRV9fKSA9PSA2VSkgfHwgXA0KLSAgICgoX19WQUxVRV9fKSA9PSA4VSkpDQotDQotI2RlZmluZSBJU19SQ0NfQ0xPQ0tUWVBFKF9fQ0xLX18pICAgICAgICAgICAgICAgICBcDQotICAoKCgoX19DTEtfXykgJiBSQ0NfQ0xPQ0tUWVBFX0FMTCkgIT0gMHgwMFVMKSAmJiBcDQotICAgKCgoX19DTEtfXykgJiB+UkNDX0NMT0NLVFlQRV9BTEwpID09IDB4MDBVTCkpDQotDQotI2RlZmluZSBJU19SQ0NfU1lTQ0xLU09VUkNFKF9fU09VUkNFX18pICAgICAgXA0KLSAgKCgoX19TT1VSQ0VfXykgPT0gUkNDX1NZU0NMS1NPVVJDRV9IU0kpIHx8IFwNCi0gICAoKF9fU09VUkNFX18pID09IFJDQ19TWVNDTEtTT1VSQ0VfSFNFKSB8fCBcDQotICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfU1lTQ0xLU09VUkNFX1BMTENMSykpDQotDQotI2RlZmluZSBJU19SQ0NfSENMSyhfX0hDTEtfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKChfX0hDTEtfXykgPT0gUkNDX1NZU0NMS19ESVYxKSB8fCAoKF9fSENMS19fKSA9PSBSQ0NfU1lTQ0xLX0RJVjIpIHx8ICAgICBcDQotICAgKChfX0hDTEtfXykgPT0gUkNDX1NZU0NMS19ESVY0KSB8fCAoKF9fSENMS19fKSA9PSBSQ0NfU1lTQ0xLX0RJVjgpIHx8ICAgICBcDQotICAgKChfX0hDTEtfXykgPT0gUkNDX1NZU0NMS19ESVYxNikgfHwgKChfX0hDTEtfXykgPT0gUkNDX1NZU0NMS19ESVY2NCkgfHwgICBcDQotICAgKChfX0hDTEtfXykgPT0gUkNDX1NZU0NMS19ESVYxMjgpIHx8ICgoX19IQ0xLX18pID09IFJDQ19TWVNDTEtfRElWMjU2KSB8fCBcDQotICAgKChfX0hDTEtfXykgPT0gUkNDX1NZU0NMS19ESVY1MTIpKQ0KLQ0KLSNkZWZpbmUgSVNfUkNDX1BDTEsoX19QQ0xLX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoKF9fUENMS19fKSA9PSBSQ0NfSENMS19ESVYxKSB8fCAoKF9fUENMS19fKSA9PSBSQ0NfSENMS19ESVYyKSB8fCBcDQotICAgKChfX1BDTEtfXykgPT0gUkNDX0hDTEtfRElWNCkgfHwgKChfX1BDTEtfXykgPT0gUkNDX0hDTEtfRElWOCkgfHwgXA0KLSAgICgoX19QQ0xLX18pID09IFJDQ19IQ0xLX0RJVjE2KSkNCi0NCi0jZGVmaW5lIElTX1JDQ19SVENDTEtTT1VSQ0UoX19TT1VSQ0VfXykgICAgICAgXA0KLSAgKCgoX19TT1VSQ0VfXykgPT0gUkNDX1JUQ0NMS1NPVVJDRV9OT05FKSB8fCBcDQotICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfUlRDQ0xLU09VUkNFX0xTRSkgfHwgIFwNCi0gICAoKF9fU09VUkNFX18pID09IFJDQ19SVENDTEtTT1VSQ0VfTFNJKSB8fCAgXA0KLSAgICgoX19TT1VSQ0VfXykgPT0gUkNDX1JUQ0NMS1NPVVJDRV9IU0VfRElWMzIpKQ0KLQ0KLSNkZWZpbmUgSVNfUkNDX01DTyhfX01DT1hfXykgXA0KLSAgKCgoX19NQ09YX18pID09IFJDQ19NQ09fUEE4KSB8fCAoKF9fTUNPWF9fKSA9PSBSQ0NfTUNPX1BHMTApKQ0KLQ0KLSNkZWZpbmUgSVNfUkNDX01DTzFTT1VSQ0UoX19TT1VSQ0VfXykgICAgICAgICAgXA0KLSAgKCgoX19TT1VSQ0VfXykgPT0gUkNDX01DTzFTT1VSQ0VfTk9DTE9DSykgfHwgXA0KLSAgICgoX19TT1VSQ0VfXykgPT0gUkNDX01DTzFTT1VSQ0VfU1lTQ0xLKSB8fCAgXA0KLSAgICgoX19TT1VSQ0VfXykgPT0gUkNDX01DTzFTT1VSQ0VfSFNJKSB8fCAgICAgXA0KLSAgICgoX19TT1VSQ0VfXykgPT0gUkNDX01DTzFTT1VSQ0VfSFNFKSB8fCAgICAgXA0KLSAgICgoX19TT1VSQ0VfXykgPT0gUkNDX01DTzFTT1VSQ0VfUExMQ0xLKSB8fCAgXA0KLSAgICgoX19TT1VSQ0VfXykgPT0gUkNDX01DTzFTT1VSQ0VfTFNJKSB8fCAgICAgXA0KLSAgICgoX19TT1VSQ0VfXykgPT0gUkNDX01DTzFTT1VSQ0VfTFNFKSB8fCAgICAgXA0KLSAgICgoX19TT1VSQ0VfXykgPT0gUkNDX01DTzFTT1VSQ0VfSFNJNDgpKQ0KLQ0KLSNkZWZpbmUgSVNfUkNDX01DT0RJVihfX0RJVl9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKCgoX19ESVZfXykgPT0gUkNDX01DT0RJVl8xKSB8fCAoKF9fRElWX18pID09IFJDQ19NQ09ESVZfMikgfHwgXA0KLSAgICgoX19ESVZfXykgPT0gUkNDX01DT0RJVl80KSB8fCAoKF9fRElWX18pID09IFJDQ19NQ09ESVZfOCkgfHwgXA0KLSAgICgoX19ESVZfXykgPT0gUkNDX01DT0RJVl8xNikpDQotDQotI2RlZmluZSBJU19SQ0NfTFNFX0RSSVZFKF9fRFJJVkVfXykgICAgICAgICAgICBcDQotICAoKChfX0RSSVZFX18pID09IFJDQ19MU0VEUklWRV9MT1cpIHx8ICAgICAgICBcDQotICAgKChfX0RSSVZFX18pID09IFJDQ19MU0VEUklWRV9NRURJVU1MT1cpIHx8ICBcDQotICAgKChfX0RSSVZFX18pID09IFJDQ19MU0VEUklWRV9NRURJVU1ISUdIKSB8fCBcDQotICAgKChfX0RSSVZFX18pID09IFJDQ19MU0VEUklWRV9ISUdIKSkNCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIEluY2x1ZGUgUkNDIEhBTCBFeHRlbmRlZCBtb2R1bGUgKi8NCi0jaW5jbHVkZSAic3RtMzJnNHh4X2hhbF9yY2NfZXguaCINCi0NCi0vKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAYWRkdG9ncm91cCBSQ0NfRXhwb3J0ZWRfRnVuY3Rpb25zDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGFkZHRvZ3JvdXAgUkNDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDENCi0gKiBAew0KLSAqLw0KLQ0KLS8qIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMNCi0gKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JDQ19EZUluaXQodm9pZCk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JDQ19Pc2NDb25maWcoUkNDX09zY0luaXRUeXBlRGVmICpSQ0NfT3NjSW5pdFN0cnVjdCk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JDQ19DbG9ja0NvbmZpZyhSQ0NfQ2xrSW5pdFR5cGVEZWYgKlJDQ19DbGtJbml0U3RydWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRkxhdGVuY3kpOw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBhZGR0b2dyb3VwIFJDQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyDQotICogQHsNCi0gKi8NCi0NCi0vKiBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zDQotICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXZvaWQgSEFMX1JDQ19NQ09Db25maWcodWludDMyX3QgUkNDX01DT3gsIHVpbnQzMl90IFJDQ19NQ09Tb3VyY2UsDQotICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBSQ0NfTUNPRGl2KTsNCi12b2lkIEhBTF9SQ0NfRW5hYmxlQ1NTKHZvaWQpOw0KLXZvaWQgSEFMX1JDQ19FbmFibGVMU0VDU1Modm9pZCk7DQotdm9pZCBIQUxfUkNDX0Rpc2FibGVMU0VDU1Modm9pZCk7DQotdWludDMyX3QgSEFMX1JDQ19HZXRTeXNDbG9ja0ZyZXEodm9pZCk7DQotdWludDMyX3QgSEFMX1JDQ19HZXRIQ0xLRnJlcSh2b2lkKTsNCi11aW50MzJfdCBIQUxfUkNDX0dldFBDTEsxRnJlcSh2b2lkKTsNCi11aW50MzJfdCBIQUxfUkNDX0dldFBDTEsyRnJlcSh2b2lkKTsNCi12b2lkIEhBTF9SQ0NfR2V0T3NjQ29uZmlnKFJDQ19Pc2NJbml0VHlwZURlZiAqUkNDX09zY0luaXRTdHJ1Y3QpOw0KLXZvaWQgSEFMX1JDQ19HZXRDbG9ja0NvbmZpZyhSQ0NfQ2xrSW5pdFR5cGVEZWYgKlJDQ19DbGtJbml0U3RydWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcEZMYXRlbmN5KTsNCi0vKiBDU1MgTk1JIElSUSBoYW5kbGVyICovDQotdm9pZCBIQUxfUkNDX05NSV9JUlFIYW5kbGVyKHZvaWQpOw0KLS8qIFVzZXIgQ2FsbGJhY2tzIGluIG5vbiBibG9ja2luZyBtb2RlIChJVCBtb2RlKSAqLw0KLXZvaWQgSEFMX1JDQ19DU1NDYWxsYmFjayh2b2lkKTsNCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLSNpZmRlZiBfX2NwbHVzcGx1cw0KLX0NCi0jZW5kaWYNCi0NCi0jZW5kaWYgLyogU1RNMzJHNHh4X0hBTF9SQ0NfSCAqLw0KKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGZpbGUgICAgc3RtMzJnNHh4X2hhbF9yY2MuaAorICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFJDQyBIQUwgbW9kdWxlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGF0dGVudGlvbgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGVybXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZQorICppbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb2Z0d2FyZSBjb21wb25lbnQuIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcworICp3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyRzR4eF9IQUxfUkNDX0gKKyNkZWZpbmUgU1RNMzJHNHh4X0hBTF9SQ0NfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnNHh4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzR4eF9IQUxfRHJpdmVyCisgKiBAeworICovCisKKy8qKiBAYWRkdG9ncm91cCBSQ0MKKyAqIEB7CisgKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUkNDX0V4cG9ydGVkX1R5cGVzIFJDQyBFeHBvcnRlZCBUeXBlcworICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiAgUkNDIFBMTCBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDMyX3QKKyAgICAgIFBMTFN0YXRlOyAvKiE8IFRoZSBuZXcgc3RhdGUgb2YgdGhlIFBMTC4KKyAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX1BMTF9Db25maWcgKi8KKworICB1aW50MzJfdCBQTExTb3VyY2U7IC8qITwgUkNDX1BMTFNvdXJjZTogUExMIGVudHJ5IGNsb2NrIHNvdXJjZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BMTF9DbG9ja19Tb3VyY2UgICAgICAgICAgICAgICAqLworCisgIHVpbnQzMl90IFBMTE07IC8qITwgUExMTTogRGl2aXNpb24gZmFjdG9yIGZvciBQTEwgVkNPIGlucHV0IGNsb2NrLgorICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgIFJDQ19QTExNX0Nsb2NrX0RpdmlkZXIgICAgICAgICAgICAgKi8KKworICB1aW50MzJfdCBQTExOOyAvKiE8IFBMTE46IE11bHRpcGxpY2F0aW9uIGZhY3RvciBmb3IgUExMIFZDTyBvdXRwdXQgY2xvY2suCisgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gOCBhbmQKKyAgICAgICAgICAgICAgICAgICAgTWF4X0RhdGEgPSAxMjcgICAgKi8KKworICB1aW50MzJfdCBQTExQOyAvKiE8IFBMTFA6IERpdmlzaW9uIGZhY3RvciBmb3IgQURDIGNsb2NrLgorICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgIFJDQ19QTExQX0Nsb2NrX0RpdmlkZXIgICAgICAgICAgICAgKi8KKworICB1aW50MzJfdCBQTExROyAvKiE8IFBMTFE6IERpdmlzaW9uIGZhY3RvciBmb3IgU0FJLCBJMlMsIFVTQiwgRkRDQU4gYW5kIFFVQURTUEkKKyAgICAgICAgICAgICAgICAgICAgY2xvY2tzLiBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICBSQ0NfUExMUV9DbG9ja19EaXZpZGVyICAgICAgICAgICAgICovCisKKyAgdWludDMyX3QgUExMUjsgLyohPCBQTExSOiBEaXZpc2lvbiBmb3IgdGhlIG1haW4gc3lzdGVtIGNsb2NrLgorICAgICAgICAgICAgICAgICAgICAgIFVzZXIgaGF2ZSB0byBzZXQgdGhlIFBMTFIgcGFyYW1ldGVyIGNvcnJlY3RseSB0byBub3QKKyAgICAgICAgICAgICAgICAgICAgZXhjZWVkIG1heCBmcmVxdWVuY3kgMTcwTUhaLiBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgb2YgQHJlZiBSQ0NfUExMUl9DbG9ja19EaXZpZGVyICAgICAgICAgICAgICovCisKK30gUkNDX1BMTEluaXRUeXBlRGVmOworCisvKioKKyAqIEBicmllZiAgUkNDIEludGVybmFsL0V4dGVybmFsIE9zY2lsbGF0b3IgKEhTRSwgSFNJLCBMU0UgYW5kIExTSSkKKyAqIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlIGRlZmluaXRpb24KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50MzJfdCBPc2NpbGxhdG9yVHlwZTsgLyohPCBUaGUgb3NjaWxsYXRvcnMgdG8gYmUgY29uZmlndXJlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX09zY2lsbGF0b3JfVHlwZSAgICAgICAgICAgICAgICAgICAqLworCisgIHVpbnQzMl90CisgICAgICBIU0VTdGF0ZTsgLyohPCBUaGUgbmV3IHN0YXRlIG9mIHRoZSBIU0UuCisgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ19IU0VfQ29uZmlnICovCisKKyAgdWludDMyX3QKKyAgICAgIExTRVN0YXRlOyAvKiE8IFRoZSBuZXcgc3RhdGUgb2YgdGhlIExTRS4KKyAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX0xTRV9Db25maWcgKi8KKworICB1aW50MzJfdAorICAgICAgSFNJU3RhdGU7IC8qITwgVGhlIG5ldyBzdGF0ZSBvZiB0aGUgSFNJLgorICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfSFNJX0NvbmZpZyAqLworCisgIHVpbnQzMl90IEhTSUNhbGlicmF0aW9uVmFsdWU7IC8qITwgVGhlIGNhbGlicmF0aW9uIHRyaW1taW5nIHZhbHVlIChkZWZhdWx0IGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19IU0lDQUxJQlJBVElPTl9ERUZBVUxUKS4gVGhpcyBwYXJhbWV0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMCBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4X0RhdGEgPSAweEZGICovCisKKyAgdWludDMyX3QKKyAgICAgIExTSVN0YXRlOyAvKiE8IFRoZSBuZXcgc3RhdGUgb2YgdGhlIExTSS4KKyAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX0xTSV9Db25maWcgKi8KKworICB1aW50MzJfdAorICAgICAgSFNJNDhTdGF0ZTsgLyohPCBUaGUgbmV3IHN0YXRlIG9mIHRoZSBIU0k0OC4KKyAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfSFNJNDhfQ29uZmlnICovCisKKyAgUkNDX1BMTEluaXRUeXBlRGVmIFBMTDsgLyohPCBNYWluIFBMTCBzdHJ1Y3R1cmUgcGFyYW1ldGVycyAqLworCit9IFJDQ19Pc2NJbml0VHlwZURlZjsKKworLyoqCisgKiBAYnJpZWYgIFJDQyBTeXN0ZW0sIEFIQiBhbmQgQVBCIGJ1c3NlcyBjbG9jayBjb25maWd1cmF0aW9uIHN0cnVjdHVyZQorICogZGVmaW5pdGlvbgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQzMl90IENsb2NrVHlwZTsgLyohPCBUaGUgY2xvY2sgdG8gYmUgY29uZmlndXJlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NfU3lzdGVtX0Nsb2NrX1R5cGUgICAgICAqLworCisgIHVpbnQzMl90IFNZU0NMS1NvdXJjZTsgLyohPCBUaGUgY2xvY2sgc291cmNlIHVzZWQgYXMgc3lzdGVtIGNsb2NrIChTWVNDTEspLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19TeXN0ZW1fQ2xvY2tfU291cmNlICAgICovCisKKyAgdWludDMyX3QKKyAgICAgIEFIQkNMS0RpdmlkZXI7IC8qITwgVGhlIEFIQiBjbG9jayAoSENMSykgZGl2aWRlci4gVGhpcyBjbG9jayBpcyBkZXJpdmVkCisgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHRoZSBzeXN0ZW0gY2xvY2sgKFNZU0NMSykuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBvZiBAcmVmIFJDQ19BSEJfQ2xvY2tfU291cmNlICAgICAgICovCisKKyAgdWludDMyX3QKKyAgICAgIEFQQjFDTEtEaXZpZGVyOyAvKiE8IFRoZSBBUEIxIGNsb2NrIChQQ0xLMSkgZGl2aWRlci4gVGhpcyBjbG9jayBpcyBkZXJpdmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgQUhCIGNsb2NrIChIQ0xLKS4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBvZiBAcmVmIFJDQ19BUEIxX0FQQjJfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QKKyAgICAgIEFQQjJDTEtEaXZpZGVyOyAvKiE8IFRoZSBBUEIyIGNsb2NrIChQQ0xLMikgZGl2aWRlci4gVGhpcyBjbG9jayBpcyBkZXJpdmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgQUhCIGNsb2NrIChIQ0xLKS4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBvZiBAcmVmIFJDQ19BUEIxX0FQQjJfQ2xvY2tfU291cmNlICovCisKK30gUkNDX0Nsa0luaXRUeXBlRGVmOworCisvKioKKyAqIEB9CisgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUkNDX0V4cG9ydGVkX0NvbnN0YW50cyBSQ0MgRXhwb3J0ZWQgQ29uc3RhbnRzCisgKiBAeworICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX1RpbWVvdXRfVmFsdWUgVGltZW91dCBWYWx1ZXMKKyAqIEB7CisgKi8KKyNkZWZpbmUgUkNDX0RCUF9USU1FT1VUX1ZBTFVFIDJVIC8qIDIgbXMgKG1pbmltdW0gVGljayArIDEpICovCisjZGVmaW5lIFJDQ19MU0VfVElNRU9VVF9WQUxVRSBMU0VfU1RBUlRVUF9USU1FT1VUCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfT3NjaWxsYXRvcl9UeXBlIE9zY2lsbGF0b3IgVHlwZQorICogQHsKKyAqLworI2RlZmluZSBSQ0NfT1NDSUxMQVRPUlRZUEVfTk9ORSBcCisgIDB4MDAwMDAwMDBVIC8qITwgT3NjaWxsYXRvciBjb25maWd1cmF0aW9uIHVuY2hhbmdlZCAqLworI2RlZmluZSBSQ0NfT1NDSUxMQVRPUlRZUEVfSFNFIDB4MDAwMDAwMDFVICAgLyohPCBIU0UgdG8gY29uZmlndXJlICovCisjZGVmaW5lIFJDQ19PU0NJTExBVE9SVFlQRV9IU0kgMHgwMDAwMDAwMlUgICAvKiE8IEhTSSB0byBjb25maWd1cmUgKi8KKyNkZWZpbmUgUkNDX09TQ0lMTEFUT1JUWVBFX0xTRSAweDAwMDAwMDA0VSAgIC8qITwgTFNFIHRvIGNvbmZpZ3VyZSAqLworI2RlZmluZSBSQ0NfT1NDSUxMQVRPUlRZUEVfTFNJIDB4MDAwMDAwMDhVICAgLyohPCBMU0kgdG8gY29uZmlndXJlICovCisjZGVmaW5lIFJDQ19PU0NJTExBVE9SVFlQRV9IU0k0OCAweDAwMDAwMDIwVSAvKiE8IEhTSTQ4IHRvIGNvbmZpZ3VyZSAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0hTRV9Db25maWcgSFNFIENvbmZpZworICogQHsKKyAqLworI2RlZmluZSBSQ0NfSFNFX09GRiAweDAwMDAwMDAwVSAvKiE8IEhTRSBjbG9jayBkZWFjdGl2YXRpb24gKi8KKyNkZWZpbmUgUkNDX0hTRV9PTiBSQ0NfQ1JfSFNFT04gLyohPCBIU0UgY2xvY2sgYWN0aXZhdGlvbiAqLworI2RlZmluZSBSQ0NfSFNFX0JZUEFTUyBcCisgIChSQ0NfQ1JfSFNFQllQIHwgUkNDX0NSX0hTRU9OKSAvKiE8IEV4dGVybmFsIGNsb2NrIHNvdXJjZSBmb3IgSFNFIGNsb2NrICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTFNFX0NvbmZpZyBMU0UgQ29uZmlnCisgKiBAeworICovCisjZGVmaW5lIFJDQ19MU0VfT0ZGIDB4MDAwMDAwMDBVICAgLyohPCBMU0UgY2xvY2sgZGVhY3RpdmF0aW9uICovCisjZGVmaW5lIFJDQ19MU0VfT04gUkNDX0JEQ1JfTFNFT04gLyohPCBMU0UgY2xvY2sgYWN0aXZhdGlvbiAqLworI2RlZmluZSBSQ0NfTFNFX0JZUEFTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoUkNDX0JEQ1JfTFNFQllQIHwgUkNDX0JEQ1JfTFNFT04pIC8qITwgRXh0ZXJuYWwgY2xvY2sgc291cmNlIGZvciBMU0UgY2xvY2sgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0hTSV9Db25maWcgSFNJIENvbmZpZworICogQHsKKyAqLworI2RlZmluZSBSQ0NfSFNJX09GRiAweDAwMDAwMDAwVSAvKiE8IEhTSSBjbG9jayBkZWFjdGl2YXRpb24gKi8KKyNkZWZpbmUgUkNDX0hTSV9PTiBSQ0NfQ1JfSFNJT04gLyohPCBIU0kgY2xvY2sgYWN0aXZhdGlvbiAqLworI2RlZmluZSBSQ0NfSFNJQ0FMSUJSQVRJT05fREVGQVVMVCBcCisgIDB4NDBVIC8qIERlZmF1bHQgSFNJIGNhbGlicmF0aW9uIHRyaW1taW5nIHZhbHVlICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTFNJX0NvbmZpZyBMU0kgQ29uZmlnCisgKiBAeworICovCisjZGVmaW5lIFJDQ19MU0lfT0ZGIDB4MDAwMDAwMDBVICAvKiE8IExTSSBjbG9jayBkZWFjdGl2YXRpb24gKi8KKyNkZWZpbmUgUkNDX0xTSV9PTiBSQ0NfQ1NSX0xTSU9OIC8qITwgTFNJIGNsb2NrIGFjdGl2YXRpb24gKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFJDQ19IU0k0OF9Db25maWcgSFNJNDggQ29uZmlnCisgKiBAeworICovCisjZGVmaW5lIFJDQ19IU0k0OF9PRkYgMHgwMDAwMDAwMFUgICAgICAvKiE8IEhTSTQ4IGNsb2NrIGRlYWN0aXZhdGlvbiAqLworI2RlZmluZSBSQ0NfSFNJNDhfT04gUkNDX0NSUkNSX0hTSTQ4T04gLyohPCBIU0k0OCBjbG9jayBhY3RpdmF0aW9uICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfUExMX0NvbmZpZyBQTEwgQ29uZmlnCisgKiBAeworICovCisjZGVmaW5lIFJDQ19QTExfTk9ORSAweDAwMDAwMDAwVSAvKiE8IFBMTCBjb25maWd1cmF0aW9uIHVuY2hhbmdlZCAqLworI2RlZmluZSBSQ0NfUExMX09GRiAweDAwMDAwMDAxVSAgLyohPCBQTEwgZGVhY3RpdmF0aW9uICovCisjZGVmaW5lIFJDQ19QTExfT04gMHgwMDAwMDAwMlUgICAvKiE8IFBMTCBhY3RpdmF0aW9uICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfUExMTV9DbG9ja19EaXZpZGVyIFBMTE0gQ2xvY2sgRGl2aWRlcgorICogQHsKKyAqLworI2RlZmluZSBSQ0NfUExMTV9ESVYxIDB4MDAwMDAwMDFVICAvKiE8IFBMTE0gZGl2aXNpb24gZmFjdG9yID0gMSAgKi8KKyNkZWZpbmUgUkNDX1BMTE1fRElWMiAweDAwMDAwMDAyVSAgLyohPCBQTExNIGRpdmlzaW9uIGZhY3RvciA9IDIgICovCisjZGVmaW5lIFJDQ19QTExNX0RJVjMgMHgwMDAwMDAwM1UgIC8qITwgUExMTSBkaXZpc2lvbiBmYWN0b3IgPSAzICAqLworI2RlZmluZSBSQ0NfUExMTV9ESVY0IDB4MDAwMDAwMDRVICAvKiE8IFBMTE0gZGl2aXNpb24gZmFjdG9yID0gNCAgKi8KKyNkZWZpbmUgUkNDX1BMTE1fRElWNSAweDAwMDAwMDA1VSAgLyohPCBQTExNIGRpdmlzaW9uIGZhY3RvciA9IDUgICovCisjZGVmaW5lIFJDQ19QTExNX0RJVjYgMHgwMDAwMDAwNlUgIC8qITwgUExMTSBkaXZpc2lvbiBmYWN0b3IgPSA2ICAqLworI2RlZmluZSBSQ0NfUExMTV9ESVY3IDB4MDAwMDAwMDdVICAvKiE8IFBMTE0gZGl2aXNpb24gZmFjdG9yID0gNyAgKi8KKyNkZWZpbmUgUkNDX1BMTE1fRElWOCAweDAwMDAwMDA4VSAgLyohPCBQTExNIGRpdmlzaW9uIGZhY3RvciA9IDggICovCisjZGVmaW5lIFJDQ19QTExNX0RJVjkgMHgwMDAwMDAwOVUgIC8qITwgUExMTSBkaXZpc2lvbiBmYWN0b3IgPSA5ICAqLworI2RlZmluZSBSQ0NfUExMTV9ESVYxMCAweDAwMDAwMDBBVSAvKiE8IFBMTE0gZGl2aXNpb24gZmFjdG9yID0gMTAgKi8KKyNkZWZpbmUgUkNDX1BMTE1fRElWMTEgMHgwMDAwMDAwQlUgLyohPCBQTExNIGRpdmlzaW9uIGZhY3RvciA9IDExICovCisjZGVmaW5lIFJDQ19QTExNX0RJVjEyIDB4MDAwMDAwMENVIC8qITwgUExMTSBkaXZpc2lvbiBmYWN0b3IgPSAxMiAqLworI2RlZmluZSBSQ0NfUExMTV9ESVYxMyAweDAwMDAwMDBEVSAvKiE8IFBMTE0gZGl2aXNpb24gZmFjdG9yID0gMTMgKi8KKyNkZWZpbmUgUkNDX1BMTE1fRElWMTQgMHgwMDAwMDAwRVUgLyohPCBQTExNIGRpdmlzaW9uIGZhY3RvciA9IDE0ICovCisjZGVmaW5lIFJDQ19QTExNX0RJVjE1IDB4MDAwMDAwMEZVIC8qITwgUExMTSBkaXZpc2lvbiBmYWN0b3IgPSAxNSAqLworI2RlZmluZSBSQ0NfUExMTV9ESVYxNiAweDAwMDAwMDEwVSAvKiE8IFBMTE0gZGl2aXNpb24gZmFjdG9yID0gMTYgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFJDQ19QTExQX0Nsb2NrX0RpdmlkZXIgUExMUCBDbG9jayBEaXZpZGVyCisgKiBAeworICovCisjZGVmaW5lIFJDQ19QTExQX0RJVjIgMHgwMDAwMDAwMlUgIC8qITwgUExMUCBkaXZpc2lvbiBmYWN0b3IgPSAyICAqLworI2RlZmluZSBSQ0NfUExMUF9ESVYzIDB4MDAwMDAwMDNVICAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gMyAgKi8KKyNkZWZpbmUgUkNDX1BMTFBfRElWNCAweDAwMDAwMDA0VSAgLyohPCBQTExQIGRpdmlzaW9uIGZhY3RvciA9IDQgICovCisjZGVmaW5lIFJDQ19QTExQX0RJVjUgMHgwMDAwMDAwNVUgIC8qITwgUExMUCBkaXZpc2lvbiBmYWN0b3IgPSA1ICAqLworI2RlZmluZSBSQ0NfUExMUF9ESVY2IDB4MDAwMDAwMDZVICAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gNiAgKi8KKyNkZWZpbmUgUkNDX1BMTFBfRElWNyAweDAwMDAwMDA3VSAgLyohPCBQTExQIGRpdmlzaW9uIGZhY3RvciA9IDcgICovCisjZGVmaW5lIFJDQ19QTExQX0RJVjggMHgwMDAwMDAwOFUgIC8qITwgUExMUCBkaXZpc2lvbiBmYWN0b3IgPSA4ICAqLworI2RlZmluZSBSQ0NfUExMUF9ESVY5IDB4MDAwMDAwMDlVICAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gOSAgKi8KKyNkZWZpbmUgUkNDX1BMTFBfRElWMTAgMHgwMDAwMDAwQVUgLyohPCBQTExQIGRpdmlzaW9uIGZhY3RvciA9IDEwICovCisjZGVmaW5lIFJDQ19QTExQX0RJVjExIDB4MDAwMDAwMEJVIC8qITwgUExMUCBkaXZpc2lvbiBmYWN0b3IgPSAxMSAqLworI2RlZmluZSBSQ0NfUExMUF9ESVYxMiAweDAwMDAwMDBDVSAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gMTIgKi8KKyNkZWZpbmUgUkNDX1BMTFBfRElWMTMgMHgwMDAwMDAwRFUgLyohPCBQTExQIGRpdmlzaW9uIGZhY3RvciA9IDEzICovCisjZGVmaW5lIFJDQ19QTExQX0RJVjE0IDB4MDAwMDAwMEVVIC8qITwgUExMUCBkaXZpc2lvbiBmYWN0b3IgPSAxNCAqLworI2RlZmluZSBSQ0NfUExMUF9ESVYxNSAweDAwMDAwMDBGVSAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gMTUgKi8KKyNkZWZpbmUgUkNDX1BMTFBfRElWMTYgMHgwMDAwMDAxMFUgLyohPCBQTExQIGRpdmlzaW9uIGZhY3RvciA9IDE2ICovCisjZGVmaW5lIFJDQ19QTExQX0RJVjE3IDB4MDAwMDAwMTFVIC8qITwgUExMUCBkaXZpc2lvbiBmYWN0b3IgPSAxNyAqLworI2RlZmluZSBSQ0NfUExMUF9ESVYxOCAweDAwMDAwMDEyVSAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gMTggKi8KKyNkZWZpbmUgUkNDX1BMTFBfRElWMTkgMHgwMDAwMDAxM1UgLyohPCBQTExQIGRpdmlzaW9uIGZhY3RvciA9IDE5ICovCisjZGVmaW5lIFJDQ19QTExQX0RJVjIwIDB4MDAwMDAwMTRVIC8qITwgUExMUCBkaXZpc2lvbiBmYWN0b3IgPSAyMCAqLworI2RlZmluZSBSQ0NfUExMUF9ESVYyMSAweDAwMDAwMDE1VSAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gMjEgKi8KKyNkZWZpbmUgUkNDX1BMTFBfRElWMjIgMHgwMDAwMDAxNlUgLyohPCBQTExQIGRpdmlzaW9uIGZhY3RvciA9IDIyICovCisjZGVmaW5lIFJDQ19QTExQX0RJVjIzIDB4MDAwMDAwMTdVIC8qITwgUExMUCBkaXZpc2lvbiBmYWN0b3IgPSAyMyAqLworI2RlZmluZSBSQ0NfUExMUF9ESVYyNCAweDAwMDAwMDE4VSAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gMjQgKi8KKyNkZWZpbmUgUkNDX1BMTFBfRElWMjUgMHgwMDAwMDAxOVUgLyohPCBQTExQIGRpdmlzaW9uIGZhY3RvciA9IDI1ICovCisjZGVmaW5lIFJDQ19QTExQX0RJVjI2IDB4MDAwMDAwMUFVIC8qITwgUExMUCBkaXZpc2lvbiBmYWN0b3IgPSAyNiAqLworI2RlZmluZSBSQ0NfUExMUF9ESVYyNyAweDAwMDAwMDFCVSAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gMjcgKi8KKyNkZWZpbmUgUkNDX1BMTFBfRElWMjggMHgwMDAwMDAxQ1UgLyohPCBQTExQIGRpdmlzaW9uIGZhY3RvciA9IDI4ICovCisjZGVmaW5lIFJDQ19QTExQX0RJVjI5IDB4MDAwMDAwMURVIC8qITwgUExMUCBkaXZpc2lvbiBmYWN0b3IgPSAyOSAqLworI2RlZmluZSBSQ0NfUExMUF9ESVYzMCAweDAwMDAwMDFFVSAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gMzAgKi8KKyNkZWZpbmUgUkNDX1BMTFBfRElWMzEgMHgwMDAwMDAxRlUgLyohPCBQTExQIGRpdmlzaW9uIGZhY3RvciA9IDMxICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfUExMUV9DbG9ja19EaXZpZGVyIFBMTFEgQ2xvY2sgRGl2aWRlcgorICogQHsKKyAqLworI2RlZmluZSBSQ0NfUExMUV9ESVYyIDB4MDAwMDAwMDJVIC8qITwgUExMUSBkaXZpc2lvbiBmYWN0b3IgPSAyICovCisjZGVmaW5lIFJDQ19QTExRX0RJVjQgMHgwMDAwMDAwNFUgLyohPCBQTExRIGRpdmlzaW9uIGZhY3RvciA9IDQgKi8KKyNkZWZpbmUgUkNDX1BMTFFfRElWNiAweDAwMDAwMDA2VSAvKiE8IFBMTFEgZGl2aXNpb24gZmFjdG9yID0gNiAqLworI2RlZmluZSBSQ0NfUExMUV9ESVY4IDB4MDAwMDAwMDhVIC8qITwgUExMUSBkaXZpc2lvbiBmYWN0b3IgPSA4ICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfUExMUl9DbG9ja19EaXZpZGVyIFBMTFIgQ2xvY2sgRGl2aWRlcgorICogQHsKKyAqLworI2RlZmluZSBSQ0NfUExMUl9ESVYyIDB4MDAwMDAwMDJVIC8qITwgUExMUiBkaXZpc2lvbiBmYWN0b3IgPSAyICovCisjZGVmaW5lIFJDQ19QTExSX0RJVjQgMHgwMDAwMDAwNFUgLyohPCBQTExSIGRpdmlzaW9uIGZhY3RvciA9IDQgKi8KKyNkZWZpbmUgUkNDX1BMTFJfRElWNiAweDAwMDAwMDA2VSAvKiE8IFBMTFIgZGl2aXNpb24gZmFjdG9yID0gNiAqLworI2RlZmluZSBSQ0NfUExMUl9ESVY4IDB4MDAwMDAwMDhVIC8qITwgUExMUiBkaXZpc2lvbiBmYWN0b3IgPSA4ICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfUExMX0Nsb2NrX1NvdXJjZSBQTEwgQ2xvY2sgU291cmNlCisgKiBAeworICovCisjZGVmaW5lIFJDQ19QTExTT1VSQ0VfTk9ORSBcCisgIDB4MDAwMDAwMDBVIC8qITwgTm8gY2xvY2sgc2VsZWN0ZWQgYXMgUExMIGVudHJ5IGNsb2NrIHNvdXJjZSAgKi8KKyNkZWZpbmUgUkNDX1BMTFNPVVJDRV9IU0kgXAorICBSQ0NfUExMQ0ZHUl9QTExTUkNfSFNJIC8qITwgSFNJIGNsb2NrIHNlbGVjdGVkIGFzIFBMTCBlbnRyeSBjbG9jayBzb3VyY2UgKi8KKyNkZWZpbmUgUkNDX1BMTFNPVVJDRV9IU0UgXAorICBSQ0NfUExMQ0ZHUl9QTExTUkNfSFNFIC8qITwgSFNFIGNsb2NrIHNlbGVjdGVkIGFzIFBMTCBlbnRyeSBjbG9jayBzb3VyY2UgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFJDQ19QTExfQ2xvY2tfT3V0cHV0IFBMTCBDbG9jayBPdXRwdXQKKyAqIEB7CisgKi8KKyNkZWZpbmUgUkNDX1BMTF9BRENDTEsgXAorICBSQ0NfUExMQ0ZHUl9QTExQRU4gLyohPCBQTExBRENDTEsgc2VsZWN0aW9uIGZyb20gbWFpbiBQTEwgKi8KKyNkZWZpbmUgUkNDX1BMTF80OE0xQ0xLIFwKKyAgUkNDX1BMTENGR1JfUExMUUVOIC8qITwgUExMNDhNMUNMSyBzZWxlY3Rpb24gZnJvbSBtYWluIFBMTCAqLworI2RlZmluZSBSQ0NfUExMX1NZU0NMSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBSQ0NfUExMQ0ZHUl9QTExSRU4gLyohPCBQTExDTEsgc2VsZWN0aW9uIGZyb20gbWFpbiBQTEwgXAorICAgICAgICAgICAgICAgICAgICAgICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfU3lzdGVtX0Nsb2NrX1R5cGUgU3lzdGVtIENsb2NrIFR5cGUKKyAqIEB7CisgKi8KKyNkZWZpbmUgUkNDX0NMT0NLVFlQRV9TWVNDTEsgMHgwMDAwMDAwMVUgLyohPCBTWVNDTEsgdG8gY29uZmlndXJlICovCisjZGVmaW5lIFJDQ19DTE9DS1RZUEVfSENMSyAweDAwMDAwMDAyVSAgIC8qITwgSENMSyB0byBjb25maWd1cmUgKi8KKyNkZWZpbmUgUkNDX0NMT0NLVFlQRV9QQ0xLMSAweDAwMDAwMDA0VSAgLyohPCBQQ0xLMSB0byBjb25maWd1cmUgKi8KKyNkZWZpbmUgUkNDX0NMT0NLVFlQRV9QQ0xLMiAweDAwMDAwMDA4VSAgLyohPCBQQ0xLMiB0byBjb25maWd1cmUgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFJDQ19TeXN0ZW1fQ2xvY2tfU291cmNlIFN5c3RlbSBDbG9jayBTb3VyY2UKKyAqIEB7CisgKi8KKyNkZWZpbmUgUkNDX1NZU0NMS1NPVVJDRV9IU0kgXAorICBSQ0NfQ0ZHUl9TV19IU0kgLyohPCBIU0kgc2VsZWN0aW9uIGFzIHN5c3RlbSBjbG9jayAqLworI2RlZmluZSBSQ0NfU1lTQ0xLU09VUkNFX0hTRSBcCisgIFJDQ19DRkdSX1NXX0hTRSAvKiE8IEhTRSBzZWxlY3Rpb24gYXMgc3lzdGVtIGNsb2NrICovCisjZGVmaW5lIFJDQ19TWVNDTEtTT1VSQ0VfUExMQ0xLIFwKKyAgUkNDX0NGR1JfU1dfUExMIC8qITwgUExMIHNlbGVjdGlvbiBhcyBzeXN0ZW0gY2xvY2sgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFJDQ19TeXN0ZW1fQ2xvY2tfU291cmNlX1N0YXR1cyBTeXN0ZW0gQ2xvY2sgU291cmNlIFN0YXR1cworICogQHsKKyAqLworI2RlZmluZSBSQ0NfU1lTQ0xLU09VUkNFX1NUQVRVU19IU0kgXAorICBSQ0NfQ0ZHUl9TV1NfSFNJIC8qITwgSFNJIHVzZWQgYXMgc3lzdGVtIGNsb2NrICovCisjZGVmaW5lIFJDQ19TWVNDTEtTT1VSQ0VfU1RBVFVTX0hTRSBcCisgIFJDQ19DRkdSX1NXU19IU0UgLyohPCBIU0UgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgKi8KKyNkZWZpbmUgUkNDX1NZU0NMS1NPVVJDRV9TVEFUVVNfUExMQ0xLIFwKKyAgUkNDX0NGR1JfU1dTX1BMTCAvKiE8IFBMTCB1c2VkIGFzIHN5c3RlbSBjbG9jayAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0FIQl9DbG9ja19Tb3VyY2UgQUhCIENsb2NrIFNvdXJjZQorICogQHsKKyAqLworI2RlZmluZSBSQ0NfU1lTQ0xLX0RJVjEgUkNDX0NGR1JfSFBSRV9ESVYxICAgICAvKiE8IFNZU0NMSyBub3QgZGl2aWRlZCAqLworI2RlZmluZSBSQ0NfU1lTQ0xLX0RJVjIgUkNDX0NGR1JfSFBSRV9ESVYyICAgICAvKiE8IFNZU0NMSyBkaXZpZGVkIGJ5IDIgKi8KKyNkZWZpbmUgUkNDX1NZU0NMS19ESVY0IFJDQ19DRkdSX0hQUkVfRElWNCAgICAgLyohPCBTWVNDTEsgZGl2aWRlZCBieSA0ICovCisjZGVmaW5lIFJDQ19TWVNDTEtfRElWOCBSQ0NfQ0ZHUl9IUFJFX0RJVjggICAgIC8qITwgU1lTQ0xLIGRpdmlkZWQgYnkgOCAqLworI2RlZmluZSBSQ0NfU1lTQ0xLX0RJVjE2IFJDQ19DRkdSX0hQUkVfRElWMTYgICAvKiE8IFNZU0NMSyBkaXZpZGVkIGJ5IDE2ICovCisjZGVmaW5lIFJDQ19TWVNDTEtfRElWNjQgUkNDX0NGR1JfSFBSRV9ESVY2NCAgIC8qITwgU1lTQ0xLIGRpdmlkZWQgYnkgNjQgKi8KKyNkZWZpbmUgUkNDX1NZU0NMS19ESVYxMjggUkNDX0NGR1JfSFBSRV9ESVYxMjggLyohPCBTWVNDTEsgZGl2aWRlZCBieSAxMjggKi8KKyNkZWZpbmUgUkNDX1NZU0NMS19ESVYyNTYgUkNDX0NGR1JfSFBSRV9ESVYyNTYgLyohPCBTWVNDTEsgZGl2aWRlZCBieSAyNTYgKi8KKyNkZWZpbmUgUkNDX1NZU0NMS19ESVY1MTIgUkNDX0NGR1JfSFBSRV9ESVY1MTIgLyohPCBTWVNDTEsgZGl2aWRlZCBieSA1MTIgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFJDQ19BUEIxX0FQQjJfQ2xvY2tfU291cmNlIEFQQjEgQVBCMiBDbG9jayBTb3VyY2UKKyAqIEB7CisgKi8KKyNkZWZpbmUgUkNDX0hDTEtfRElWMSBSQ0NfQ0ZHUl9QUFJFMV9ESVYxICAgLyohPCBIQ0xLIG5vdCBkaXZpZGVkICovCisjZGVmaW5lIFJDQ19IQ0xLX0RJVjIgUkNDX0NGR1JfUFBSRTFfRElWMiAgIC8qITwgSENMSyBkaXZpZGVkIGJ5IDIgKi8KKyNkZWZpbmUgUkNDX0hDTEtfRElWNCBSQ0NfQ0ZHUl9QUFJFMV9ESVY0ICAgLyohPCBIQ0xLIGRpdmlkZWQgYnkgNCAqLworI2RlZmluZSBSQ0NfSENMS19ESVY4IFJDQ19DRkdSX1BQUkUxX0RJVjggICAvKiE8IEhDTEsgZGl2aWRlZCBieSA4ICovCisjZGVmaW5lIFJDQ19IQ0xLX0RJVjE2IFJDQ19DRkdSX1BQUkUxX0RJVjE2IC8qITwgSENMSyBkaXZpZGVkIGJ5IDE2ICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfUlRDX0Nsb2NrX1NvdXJjZSBSVEMgQ2xvY2sgU291cmNlCisgKiBAeworICovCisjZGVmaW5lIFJDQ19SVENDTEtTT1VSQ0VfTk9ORSAweDAwMDAwMDAwVSAvKiE8IE5vIGNsb2NrIHVzZWQgYXMgUlRDIGNsb2NrICovCisjZGVmaW5lIFJDQ19SVENDTEtTT1VSQ0VfTFNFIFwKKyAgUkNDX0JEQ1JfUlRDU0VMXzAgLyohPCBMU0Ugb3NjaWxsYXRvciBjbG9jayB1c2VkIGFzIFJUQyBjbG9jayAqLworI2RlZmluZSBSQ0NfUlRDQ0xLU09VUkNFX0xTSSBcCisgIFJDQ19CRENSX1JUQ1NFTF8xIC8qITwgTFNJIG9zY2lsbGF0b3IgY2xvY2sgdXNlZCBhcyBSVEMgY2xvY2sgKi8KKyNkZWZpbmUgUkNDX1JUQ0NMS1NPVVJDRV9IU0VfRElWMzIgXAorICBSQ0NfQkRDUl9SVENTRUwgLyohPCBIU0Ugb3NjaWxsYXRvciBjbG9jayBkaXZpZGVkIGJ5IDMyIHVzZWQgYXMgUlRDIGNsb2NrICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTUNPX0luZGV4IE1DTyBJbmRleAorICogQHsKKyAqLworLyogMzIgICAgIDI4ICAgICAgMjAgICAgICAgMTYgICAgICAwCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgfCBNQ08gICB8IEdQSU8gIHwgR1BJTyAgfCBHUElPICB8CisgICB8IEluZGV4IHwgIEFGICAgfCBQb3J0ICB8ICBQaW4gIHwKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIFJDQ19NQ09fR1BJT1BPUlRfUE9TIDE2VQorI2RlZmluZSBSQ0NfTUNPX0dQSU9QT1JUX01BU0sgKDB4RlVMIDw8IFJDQ19NQ09fR1BJT1BPUlRfUE9TKQorI2RlZmluZSBSQ0NfTUNPX0dQSU9BRl9QT1MgMjBVCisjZGVmaW5lIFJDQ19NQ09fR1BJT0FGX01BU0sgKDB4RkZVTCA8PCBSQ0NfTUNPX0dQSU9BRl9QT1MpCisjZGVmaW5lIFJDQ19NQ09fSU5ERVhfUE9TIDI4VQorI2RlZmluZSBSQ0NfTUNPX0lOREVYX01BU0sgKDB4MVVMIDw8IFJDQ19NQ09fSU5ERVhfUE9TKQorI2RlZmluZSBSQ0NfTUNPMV9JTkRFWCAoMHgwVUwgPDwgUkNDX01DT19JTkRFWF9QT1MpIC8qITwgTUNPMSBpbmRleCAqLworI2RlZmluZSBSQ0NfTUNPX1BBOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChSQ0NfTUNPMV9JTkRFWCB8IChHUElPX0FGMF9NQ08gPDwgUkNDX01DT19HUElPQUZfUE9TKSB8IFwKKyAgIChHUElPX0dFVF9JTkRFWChHUElPQSkgPDwgUkNDX01DT19HUElPUE9SVF9QT1MpIHwgR1BJT19QSU5fOCkKKyNkZWZpbmUgUkNDX01DT19QRzEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoUkNDX01DTzFfSU5ERVggfCAoR1BJT19BRjBfTUNPIDw8IFJDQ19NQ09fR1BJT0FGX1BPUykgfCBcCisgICAoR1BJT19HRVRfSU5ERVgoR1BJT0cpIDw8IFJDQ19NQ09fR1BJT1BPUlRfUE9TKSB8IEdQSU9fUElOXzEwKQorCisvKiBMZWdhY3kgRGVmaW5lcyovCisjZGVmaW5lIFJDQ19NQ08xIFJDQ19NQ09fUEE4CisjZGVmaW5lIFJDQ19NQ08gXAorICBSQ0NfTUNPMSAvKiE8IE1DTzEgdG8gYmUgY29tcGxpYW50IHdpdGggb3RoZXIgZmFtaWxpZXMgd2l0aCAyIE1DT3MqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX01DTzFfQ2xvY2tfU291cmNlIE1DTzEgQ2xvY2sgU291cmNlCisgKiBAeworICovCisjZGVmaW5lIFJDQ19NQ08xU09VUkNFX05PQ0xPQ0sgXAorICAweDAwMDAwMDAwVSAvKiE8IE1DTzEgb3V0cHV0IGRpc2FibGVkLCBubyBjbG9jayBvbiBNQ08xICovCisjZGVmaW5lIFJDQ19NQ08xU09VUkNFX1NZU0NMSyBcCisgIFJDQ19DRkdSX01DT1NFTF8wIC8qITwgU1lTQ0xLIHNlbGVjdGlvbiBhcyBNQ08xIHNvdXJjZSAqLworI2RlZmluZSBSQ0NfTUNPMVNPVVJDRV9IU0kgXAorICAoUkNDX0NGR1JfTUNPU0VMXzAgfCBSQ0NfQ0ZHUl9NQ09TRUxfMSkgLyohPCBIU0kgc2VsZWN0aW9uIGFzIE1DTzEgc291cmNlICovCisjZGVmaW5lIFJDQ19NQ08xU09VUkNFX0hTRSBcCisgIFJDQ19DRkdSX01DT1NFTF8yIC8qITwgSFNFIHNlbGVjdGlvbiBhcyBNQ08xIHNvdXJjZSAqLworI2RlZmluZSBSQ0NfTUNPMVNPVVJDRV9QTExDTEsgXAorICAoUkNDX0NGR1JfTUNPU0VMXzAgfCAgICAgICAgXAorICAgUkNDX0NGR1JfTUNPU0VMXzIpIC8qITwgUExMQ0xLIHNlbGVjdGlvbiBhcyBNQ08xIHNvdXJjZSAqLworI2RlZmluZSBSQ0NfTUNPMVNPVVJDRV9MU0kgXAorICAoUkNDX0NGR1JfTUNPU0VMXzEgfCBSQ0NfQ0ZHUl9NQ09TRUxfMikgLyohPCBMU0kgc2VsZWN0aW9uIGFzIE1DTzEgc291cmNlICovCisjZGVmaW5lIFJDQ19NQ08xU09VUkNFX0xTRSAgICAgICAgICAgICAgICAgXAorICAoUkNDX0NGR1JfTUNPU0VMXzAgfCBSQ0NfQ0ZHUl9NQ09TRUxfMSB8IFwKKyAgIFJDQ19DRkdSX01DT1NFTF8yKSAvKiE8IExTRSBzZWxlY3Rpb24gYXMgTUNPMSBzb3VyY2UgKi8KKyNkZWZpbmUgUkNDX01DTzFTT1VSQ0VfSFNJNDggXAorICBSQ0NfQ0ZHUl9NQ09TRUxfMyAvKiE8IEhTSTQ4IHNlbGVjdGlvbiBhcyBNQ08xIHNvdXJjZSAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX01DT3hfQ2xvY2tfUHJlc2NhbGVyIE1DTzEgQ2xvY2sgUHJlc2NhbGVyCisgKiBAeworICovCisjZGVmaW5lIFJDQ19NQ09ESVZfMSBSQ0NfQ0ZHUl9NQ09QUkVfRElWMSAgIC8qITwgTUNPIG5vdCBkaXZpZGVkICAqLworI2RlZmluZSBSQ0NfTUNPRElWXzIgUkNDX0NGR1JfTUNPUFJFX0RJVjIgICAvKiE8IE1DTyBkaXZpZGVkIGJ5IDIgKi8KKyNkZWZpbmUgUkNDX01DT0RJVl80IFJDQ19DRkdSX01DT1BSRV9ESVY0ICAgLyohPCBNQ08gZGl2aWRlZCBieSA0ICovCisjZGVmaW5lIFJDQ19NQ09ESVZfOCBSQ0NfQ0ZHUl9NQ09QUkVfRElWOCAgIC8qITwgTUNPIGRpdmlkZWQgYnkgOCAqLworI2RlZmluZSBSQ0NfTUNPRElWXzE2IFJDQ19DRkdSX01DT1BSRV9ESVYxNiAvKiE8IE1DTyBkaXZpZGVkIGJ5IDE2ICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfSW50ZXJydXB0IEludGVycnVwdHMKKyAqIEB7CisgKi8KKyNkZWZpbmUgUkNDX0lUX0xTSVJEWSBSQ0NfQ0lGUl9MU0lSRFlGIC8qITwgTFNJIFJlYWR5IEludGVycnVwdCBmbGFnICovCisjZGVmaW5lIFJDQ19JVF9MU0VSRFkgUkNDX0NJRlJfTFNFUkRZRiAvKiE8IExTRSBSZWFkeSBJbnRlcnJ1cHQgZmxhZyAqLworI2RlZmluZSBSQ0NfSVRfSFNJUkRZIFJDQ19DSUZSX0hTSVJEWUYgLyohPCBIU0kxNiBSZWFkeSBJbnRlcnJ1cHQgZmxhZyAqLworI2RlZmluZSBSQ0NfSVRfSFNFUkRZIFJDQ19DSUZSX0hTRVJEWUYgLyohPCBIU0UgUmVhZHkgSW50ZXJydXB0IGZsYWcgKi8KKyNkZWZpbmUgUkNDX0lUX1BMTFJEWSBSQ0NfQ0lGUl9QTExSRFlGIC8qITwgUExMIFJlYWR5IEludGVycnVwdCBmbGFnICovCisjZGVmaW5lIFJDQ19JVF9DU1MgUkNDX0NJRlJfQ1NTRiAvKiE8IENsb2NrIFNlY3VyaXR5IFN5c3RlbSBJbnRlcnJ1cHQgZmxhZyAqLworI2RlZmluZSBSQ0NfSVRfTFNFQ1NTIFwKKyAgUkNDX0NJRlJfTFNFQ1NTRiAvKiE8IExTRSBDbG9jayBTZWN1cml0eSBTeXN0ZW0gSW50ZXJydXB0IGZsYWcgKi8KKyNkZWZpbmUgUkNDX0lUX0hTSTQ4UkRZIFJDQ19DSUZSX0hTSTQ4UkRZRiAvKiE8IEhTSTQ4IFJlYWR5IEludGVycnVwdCBmbGFnICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfRmxhZyBGbGFncworICogICAgICAgIEVsZW1lbnRzIHZhbHVlcyBjb252ZW50aW9uOiBYWFhZWVlZWWIKKyAqICAgICAgICAgICAtIFlZWVlZICA6IEZsYWcgcG9zaXRpb24gaW4gdGhlIHJlZ2lzdGVyCisgKiAgICAgICAgICAgLSBYWFggIDogUmVnaXN0ZXIgaW5kZXgKKyAqICAgICAgICAgICAgICAgICAtIDAwMTogQ1IgcmVnaXN0ZXIKKyAqICAgICAgICAgICAgICAgICAtIDAxMDogQkRDUiByZWdpc3RlcgorICogICAgICAgICAgICAgICAgIC0gMDExOiBDU1IgcmVnaXN0ZXIKKyAqICAgICAgICAgICAgICAgICAtIDEwMDogQ1JSQ1IgcmVnaXN0ZXIKKyAqIEB7CisgKi8KKy8qIEZsYWdzIGluIHRoZSBDUiByZWdpc3RlciAqLworI2RlZmluZSBSQ0NfRkxBR19IU0lSRFkgXAorICAoKENSX1JFR19JTkRFWCA8PCA1VSkgfCBSQ0NfQ1JfSFNJUkRZX1BvcykgLyohPCBIU0kgUmVhZHkgZmxhZyAqLworI2RlZmluZSBSQ0NfRkxBR19IU0VSRFkgXAorICAoKENSX1JFR19JTkRFWCA8PCA1VSkgfCBSQ0NfQ1JfSFNFUkRZX1BvcykgLyohPCBIU0UgUmVhZHkgZmxhZyAqLworI2RlZmluZSBSQ0NfRkxBR19QTExSRFkgXAorICAoKENSX1JFR19JTkRFWCA8PCA1VSkgfCBSQ0NfQ1JfUExMUkRZX1BvcykgLyohPCBQTEwgUmVhZHkgZmxhZyAqLworCisvKiBGbGFncyBpbiB0aGUgQkRDUiByZWdpc3RlciAqLworI2RlZmluZSBSQ0NfRkxBR19MU0VSRFkgXAorICAoKEJEQ1JfUkVHX0lOREVYIDw8IDVVKSB8IFJDQ19CRENSX0xTRVJEWV9Qb3MpIC8qITwgTFNFIFJlYWR5IGZsYWcgKi8KKyNkZWZpbmUgUkNDX0ZMQUdfTFNFQ1NTRCAgICBcCisgICgoQkRDUl9SRUdfSU5ERVggPDwgNVUpIHwgXAorICAgUkNDX0JEQ1JfTFNFQ1NTRF9Qb3MpIC8qITwgTFNFIENsb2NrIFNlY3VyaXR5IFN5c3RlbSBJbnRlcnJ1cHQgZmxhZyAqLworCisvKiBGbGFncyBpbiB0aGUgQ1NSIHJlZ2lzdGVyICovCisjZGVmaW5lIFJDQ19GTEFHX0xTSVJEWSBcCisgICgoQ1NSX1JFR19JTkRFWCA8PCA1VSkgfCBSQ0NfQ1NSX0xTSVJEWV9Qb3MpIC8qITwgTFNJIFJlYWR5IGZsYWcgKi8KKyNkZWZpbmUgUkNDX0ZMQUdfT0JMUlNUICAgIFwKKyAgKChDU1JfUkVHX0lOREVYIDw8IDVVKSB8IFwKKyAgIFJDQ19DU1JfT0JMUlNURl9Qb3MpIC8qITwgT3B0aW9uIEJ5dGUgTG9hZGVyIHJlc2V0IGZsYWcgKi8KKyNkZWZpbmUgUkNDX0ZMQUdfUElOUlNUIFwKKyAgKChDU1JfUkVHX0lOREVYIDw8IDVVKSB8IFJDQ19DU1JfUElOUlNURl9Qb3MpIC8qITwgUElOIHJlc2V0IGZsYWcgKi8KKyNkZWZpbmUgUkNDX0ZMQUdfQk9SUlNUIFwKKyAgKChDU1JfUkVHX0lOREVYIDw8IDVVKSB8IFJDQ19DU1JfQk9SUlNURl9Qb3MpIC8qITwgQk9SIHJlc2V0IGZsYWcgKi8KKyNkZWZpbmUgUkNDX0ZMQUdfU0ZUUlNUIFwKKyAgKChDU1JfUkVHX0lOREVYIDw8IDVVKSB8IFJDQ19DU1JfU0ZUUlNURl9Qb3MpIC8qITwgU29mdHdhcmUgUmVzZXQgZmxhZyAqLworI2RlZmluZSBSQ0NfRkxBR19JV0RHUlNUICAgXAorICAoKENTUl9SRUdfSU5ERVggPDwgNVUpIHwgXAorICAgUkNDX0NTUl9JV0RHUlNURl9Qb3MpIC8qITwgSW5kZXBlbmRlbnQgV2F0Y2hkb2cgcmVzZXQgZmxhZyAqLworI2RlZmluZSBSQ0NfRkxBR19XV0RHUlNUICAgXAorICAoKENTUl9SRUdfSU5ERVggPDwgNVUpIHwgXAorICAgUkNDX0NTUl9XV0RHUlNURl9Qb3MpIC8qITwgV2luZG93IHdhdGNoZG9nIHJlc2V0IGZsYWcgKi8KKyNkZWZpbmUgUkNDX0ZMQUdfTFBXUlJTVCBcCisgICgoQ1NSX1JFR19JTkRFWCA8PCA1VSkgfCBSQ0NfQ1NSX0xQV1JSU1RGX1BvcykgLyohPCBMb3ctUG93ZXIgcmVzZXQgZmxhZyAqLworCisvKiBGbGFncyBpbiB0aGUgQ1JSQ1IgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkNDX0ZMQUdfSFNJNDhSRFkgXAorICAoKENSUkNSX1JFR19JTkRFWCA8PCA1VSkgfCBSQ0NfQ1JSQ1JfSFNJNDhSRFlfUG9zKSAvKiE8IEhTSTQ4IFJlYWR5IGZsYWcgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MU0VEcml2ZV9Db25maWcgTFNFIERyaXZlIENvbmZpZworICogQHsKKyAqLworI2RlZmluZSBSQ0NfTFNFRFJJVkVfTE9XIDB4MDAwMDAwMDBVIC8qITwgTFNFIGxvdyBkcml2ZSBjYXBhYmlsaXR5ICovCisjZGVmaW5lIFJDQ19MU0VEUklWRV9NRURJVU1MT1cgXAorICBSQ0NfQkRDUl9MU0VEUlZfMCAvKiE8IExTRSBtZWRpdW0gbG93IGRyaXZlIGNhcGFiaWxpdHkgKi8KKyNkZWZpbmUgUkNDX0xTRURSSVZFX01FRElVTUhJR0ggXAorICBSQ0NfQkRDUl9MU0VEUlZfMSAvKiE8IExTRSBtZWRpdW0gaGlnaCBkcml2ZSBjYXBhYmlsaXR5ICovCisjZGVmaW5lIFJDQ19MU0VEUklWRV9ISUdIIFJDQ19CRENSX0xTRURSViAvKiE8IExTRSBoaWdoIGRyaXZlIGNhcGFiaWxpdHkgKi8KKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyogRXhwb3J0ZWQgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBSQ0NfRXhwb3J0ZWRfTWFjcm9zIFJDQyBFeHBvcnRlZCBNYWNyb3MKKyAqIEB7CisgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfQUhCMV9QZXJpcGhlcmFsX0Nsb2NrX0VuYWJsZV9EaXNhYmxlIEFIQjEgUGVyaXBoZXJhbCBDbG9jaworICogRW5hYmxlIERpc2FibGUKKyAqIEBicmllZiAgRW5hYmxlIG9yIGRpc2FibGUgdGhlIEFIQjEgcGVyaXBoZXJhbCBjbG9jay4KKyAqIEBub3RlICAgQWZ0ZXIgcmVzZXQsIHRoZSBwZXJpcGhlcmFsIGNsb2NrICh1c2VkIGZvciByZWdpc3RlcnMgcmVhZC93cml0ZQorICogYWNjZXNzKSBpcyBkaXNhYmxlZCBhbmQgdGhlIGFwcGxpY2F0aW9uIHNvZnR3YXJlIGhhcyB0byBlbmFibGUgdGhpcyBjbG9jaworICogYmVmb3JlIHVzaW5nIGl0LgorICogQHsKKyAqLworCisjZGVmaW5lIF9fSEFMX1JDQ19ETUExX0NMS19FTkFCTEUoKSAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19JTyB1aW50MzJfdCB0bXByZWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgU0VUX0JJVChSQ0MtPkFIQjFFTlIsIFJDQ19BSEIxRU5SX0RNQTFFTik7ICAgICAgICAgICBcCisgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gICBcCisgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BSEIxRU5SLCBSQ0NfQUhCMUVOUl9ETUExRU4pOyBcCisgICAgVU5VU0VEKHRtcHJlZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgX19IQUxfUkNDX0RNQTJfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTRVRfQklUKFJDQy0+QUhCMUVOUiwgUkNDX0FIQjFFTlJfRE1BMkVOKTsgICAgICAgICAgIFwKKyAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyAgIFwKKyAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFIQjFFTlIsIFJDQ19BSEIxRU5SX0RNQTJFTik7IFwKKyAgICBVTlVTRUQodG1wcmVnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBfX0hBTF9SQ0NfRE1BTVVYMV9DTEtfRU5BQkxFKCkgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFNFVF9CSVQoUkNDLT5BSEIxRU5SLCBSQ0NfQUhCMUVOUl9ETUFNVVgxRU4pOyAgICAgICAgICAgXAorICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovICAgICAgXAorICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QUhCMUVOUiwgUkNDX0FIQjFFTlJfRE1BTVVYMUVOKTsgXAorICAgIFVOVVNFRCh0bXByZWcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIF9fSEFMX1JDQ19DT1JESUNfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgU0VUX0JJVChSQ0MtPkFIQjFFTlIsIFJDQ19BSEIxRU5SX0NPUkRJQ0VOKTsgICAgICAgICAgIFwKKyAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyAgICAgXAorICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QUhCMUVOUiwgUkNDX0FIQjFFTlJfQ09SRElDRU4pOyBcCisgICAgVU5VU0VEKHRtcHJlZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBfX0hBTF9SQ0NfRk1BQ19DTEtfRU5BQkxFKCkgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFNFVF9CSVQoUkNDLT5BSEIxRU5SLCBSQ0NfQUhCMUVOUl9GTUFDRU4pOyAgICAgICAgICAgXAorICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovICAgXAorICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QUhCMUVOUiwgUkNDX0FIQjFFTlJfRk1BQ0VOKTsgXAorICAgIFVOVVNFRCh0bXByZWcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIF9fSEFMX1JDQ19GTEFTSF9DTEtfRU5BQkxFKCkgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgU0VUX0JJVChSQ0MtPkFIQjFFTlIsIFJDQ19BSEIxRU5SX0ZMQVNIRU4pOyAgICAgICAgICAgXAorICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovICAgIFwKKyAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFIQjFFTlIsIFJDQ19BSEIxRU5SX0ZMQVNIRU4pOyBcCisgICAgVU5VU0VEKHRtcHJlZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIF9fSEFMX1JDQ19DUkNfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgU0VUX0JJVChSQ0MtPkFIQjFFTlIsIFJDQ19BSEIxRU5SX0NSQ0VOKTsgICAgICAgICAgIFwKKyAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyAgXAorICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QUhCMUVOUiwgUkNDX0FIQjFFTlJfQ1JDRU4pOyBcCisgICAgVU5VU0VEKHRtcHJlZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBfX0hBTF9SQ0NfRE1BMV9DTEtfRElTQUJMRSgpIENMRUFSX0JJVChSQ0MtPkFIQjFFTlIsIFJDQ19BSEIxRU5SX0RNQTFFTikKKworI2RlZmluZSBfX0hBTF9SQ0NfRE1BMl9DTEtfRElTQUJMRSgpIENMRUFSX0JJVChSQ0MtPkFIQjFFTlIsIFJDQ19BSEIxRU5SX0RNQTJFTikKKworI2RlZmluZSBfX0hBTF9SQ0NfRE1BTVVYMV9DTEtfRElTQUJMRSgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QUhCMUVOUiwgUkNDX0FIQjFFTlJfRE1BTVVYMUVOKQorCisjZGVmaW5lIF9fSEFMX1JDQ19DT1JESUNfQ0xLX0RJU0FCTEUoKSBcCisgIENMRUFSX0JJVChSQ0MtPkFIQjFFTlIsIFJDQ19BSEIxRU5SX0NPUkRJQ0VOKQorCisjZGVmaW5lIF9fSEFMX1JDQ19GTUFDX0NMS19ESVNBQkxFKCkgQ0xFQVJfQklUKFJDQy0+QUhCMUVOUiwgUkNDX0FIQjFFTlJfRk1BQ0VOKQorCisjZGVmaW5lIF9fSEFMX1JDQ19GTEFTSF9DTEtfRElTQUJMRSgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QUhCMUVOUiwgUkNDX0FIQjFFTlJfRkxBU0hFTikKKworI2RlZmluZSBfX0hBTF9SQ0NfQ1JDX0NMS19ESVNBQkxFKCkgQ0xFQVJfQklUKFJDQy0+QUhCMUVOUiwgUkNDX0FIQjFFTlJfQ1JDRU4pCisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFJDQ19BSEIyX1BlcmlwaGVyYWxfQ2xvY2tfRW5hYmxlX0Rpc2FibGUgQUhCMiBQZXJpcGhlcmFsIENsb2NrCisgKiBFbmFibGUgRGlzYWJsZQorICogQGJyaWVmICBFbmFibGUgb3IgZGlzYWJsZSB0aGUgQUhCMiBwZXJpcGhlcmFsIGNsb2NrLgorICogQG5vdGUgICBBZnRlciByZXNldCwgdGhlIHBlcmlwaGVyYWwgY2xvY2sgKHVzZWQgZm9yIHJlZ2lzdGVycyByZWFkL3dyaXRlCisgKiBhY2Nlc3MpIGlzIGRpc2FibGVkIGFuZCB0aGUgYXBwbGljYXRpb24gc29mdHdhcmUgaGFzIHRvIGVuYWJsZSB0aGlzIGNsb2NrCisgKiBiZWZvcmUgdXNpbmcgaXQuCisgKiBAeworICovCisKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9BX0NMS19FTkFCTEUoKSAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTRVRfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfR1BJT0FFTik7ICAgICAgICAgICBcCisgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gICAgXAorICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfR1BJT0FFTik7IFwKKyAgICBVTlVTRUQodG1wcmVnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9CX0NMS19FTkFCTEUoKSAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTRVRfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfR1BJT0JFTik7ICAgICAgICAgICBcCisgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gICAgXAorICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfR1BJT0JFTik7IFwKKyAgICBVTlVTRUQodG1wcmVnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9DX0NMS19FTkFCTEUoKSAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTRVRfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfR1BJT0NFTik7ICAgICAgICAgICBcCisgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gICAgXAorICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfR1BJT0NFTik7IFwKKyAgICBVTlVTRUQodG1wcmVnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9EX0NMS19FTkFCTEUoKSAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTRVRfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfR1BJT0RFTik7ICAgICAgICAgICBcCisgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gICAgXAorICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfR1BJT0RFTik7IFwKKyAgICBVTlVTRUQodG1wcmVnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9FX0NMS19FTkFCTEUoKSAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTRVRfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfR1BJT0VFTik7ICAgICAgICAgICBcCisgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gICAgXAorICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfR1BJT0VFTik7IFwKKyAgICBVTlVTRUQodG1wcmVnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9GX0NMS19FTkFCTEUoKSAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTRVRfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfR1BJT0ZFTik7ICAgICAgICAgICBcCisgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gICAgXAorICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfR1BJT0ZFTik7IFwKKyAgICBVTlVTRUQodG1wcmVnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9HX0NMS19FTkFCTEUoKSAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTRVRfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfR1BJT0dFTik7ICAgICAgICAgICBcCisgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gICAgXAorICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfR1BJT0dFTik7IFwKKyAgICBVTlVTRUQodG1wcmVnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgX19IQUxfUkNDX0FEQzEyX0NMS19FTkFCTEUoKSAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTRVRfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfQURDMTJFTik7ICAgICAgICAgICBcCisgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gICAgXAorICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfQURDMTJFTik7IFwKKyAgICBVTlVTRUQodG1wcmVnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNpZiBkZWZpbmVkKEFEQzM0NV9DT01NT04pCisjZGVmaW5lIF9fSEFMX1JDQ19BREMzNDVfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgU0VUX0JJVChSQ0MtPkFIQjJFTlIsIFJDQ19BSEIyRU5SX0FEQzM0NUVOKTsgICAgICAgICAgIFwKKyAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyAgICAgXAorICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfQURDMzQ1RU4pOyBcCisgICAgVU5VU0VEKHRtcHJlZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBBREMzNDVfQ09NTU9OICovCisKKyNkZWZpbmUgX19IQUxfUkNDX0RBQzFfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTRVRfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfREFDMUVOKTsgICAgICAgICAgIFwKKyAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyAgIFwKKyAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFIQjJFTlIsIFJDQ19BSEIyRU5SX0RBQzFFTik7IFwKKyAgICBVTlVTRUQodG1wcmVnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2lmIGRlZmluZWQoREFDMikKKyNkZWZpbmUgX19IQUxfUkNDX0RBQzJfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTRVRfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfREFDMkVOKTsgICAgICAgICAgIFwKKyAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyAgIFwKKyAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFIQjJFTlIsIFJDQ19BSEIyRU5SX0RBQzJFTik7IFwKKyAgICBVTlVTRUQodG1wcmVnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBEQUMyICovCisKKyNkZWZpbmUgX19IQUxfUkNDX0RBQzNfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTRVRfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfREFDM0VOKTsgICAgICAgICAgIFwKKyAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyAgIFwKKyAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFIQjJFTlIsIFJDQ19BSEIyRU5SX0RBQzNFTik7IFwKKyAgICBVTlVTRUQodG1wcmVnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2lmIGRlZmluZWQoREFDNCkKKyNkZWZpbmUgX19IQUxfUkNDX0RBQzRfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTRVRfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfREFDNEVOKTsgICAgICAgICAgIFwKKyAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyAgIFwKKyAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFIQjJFTlIsIFJDQ19BSEIyRU5SX0RBQzRFTik7IFwKKyAgICBVTlVTRUQodG1wcmVnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBEQUM0ICovCisKKyNpZiBkZWZpbmVkKEFFUykKKyNkZWZpbmUgX19IQUxfUkNDX0FFU19DTEtfRU5BQkxFKCkgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19JTyB1aW50MzJfdCB0bXByZWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTRVRfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfQUVTRU4pOyAgICAgICAgICAgXAorICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovICBcCisgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BSEIyRU5SLCBSQ0NfQUhCMkVOUl9BRVNFTik7IFwKKyAgICBVTlVTRUQodG1wcmVnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorI2VuZGlmIC8qIEFFUyAqLworCisjZGVmaW5lIF9fSEFMX1JDQ19STkdfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgU0VUX0JJVChSQ0MtPkFIQjJFTlIsIFJDQ19BSEIyRU5SX1JOR0VOKTsgICAgICAgICAgIFwKKyAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyAgXAorICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfUk5HRU4pOyBcCisgICAgVU5VU0VEKHRtcHJlZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0FfQ0xLX0RJU0FCTEUoKSBcCisgIENMRUFSX0JJVChSQ0MtPkFIQjJFTlIsIFJDQ19BSEIyRU5SX0dQSU9BRU4pCisKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9CX0NMS19ESVNBQkxFKCkgXAorICBDTEVBUl9CSVQoUkNDLT5BSEIyRU5SLCBSQ0NfQUhCMkVOUl9HUElPQkVOKQorCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPQ19DTEtfRElTQUJMRSgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfR1BJT0NFTikKKworI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0RfQ0xLX0RJU0FCTEUoKSBcCisgIENMRUFSX0JJVChSQ0MtPkFIQjJFTlIsIFJDQ19BSEIyRU5SX0dQSU9ERU4pCisKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9FX0NMS19ESVNBQkxFKCkgXAorICBDTEVBUl9CSVQoUkNDLT5BSEIyRU5SLCBSQ0NfQUhCMkVOUl9HUElPRUVOKQorCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPRl9DTEtfRElTQUJMRSgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfR1BJT0ZFTikKKworI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0dfQ0xLX0RJU0FCTEUoKSBcCisgIENMRUFSX0JJVChSQ0MtPkFIQjJFTlIsIFJDQ19BSEIyRU5SX0dQSU9HRU4pCisKKyNkZWZpbmUgX19IQUxfUkNDX0FEQzEyX0NMS19ESVNBQkxFKCkgXAorICBDTEVBUl9CSVQoUkNDLT5BSEIyRU5SLCBSQ0NfQUhCMkVOUl9BREMxMkVOKQorCisjaWYgZGVmaW5lZChBREMzNDVfQ09NTU9OKQorI2RlZmluZSBfX0hBTF9SQ0NfQURDMzQ1X0NMS19ESVNBQkxFKCkgXAorICBDTEVBUl9CSVQoUkNDLT5BSEIyRU5SLCBSQ0NfQUhCMkVOUl9BREMzNDVFTikKKyNlbmRpZiAvKiBBREMzNDVfQ09NTU9OICovCisKKyNkZWZpbmUgX19IQUxfUkNDX0RBQzFfQ0xLX0RJU0FCTEUoKSBDTEVBUl9CSVQoUkNDLT5BSEIyRU5SLCBSQ0NfQUhCMkVOUl9EQUMxRU4pCisKKyNpZiBkZWZpbmVkKERBQzIpCisjZGVmaW5lIF9fSEFMX1JDQ19EQUMyX0NMS19ESVNBQkxFKCkgQ0xFQVJfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfREFDMkVOKQorI2VuZGlmIC8qIERBQzIgKi8KKworI2RlZmluZSBfX0hBTF9SQ0NfREFDM19DTEtfRElTQUJMRSgpIENMRUFSX0JJVChSQ0MtPkFIQjJFTlIsIFJDQ19BSEIyRU5SX0RBQzNFTikKKworI2lmIGRlZmluZWQoREFDNCkKKyNkZWZpbmUgX19IQUxfUkNDX0RBQzRfQ0xLX0RJU0FCTEUoKSBDTEVBUl9CSVQoUkNDLT5BSEIyRU5SLCBSQ0NfQUhCMkVOUl9EQUM0RU4pCisjZW5kaWYgLyogREFDNCAqLworCisjaWYgZGVmaW5lZChBRVMpCisjZGVmaW5lIF9fSEFMX1JDQ19BRVNfQ0xLX0RJU0FCTEUoKSBDTEVBUl9CSVQoUkNDLT5BSEIyRU5SLCBSQ0NfQUhCMkVOUl9BRVNFTik7CisjZW5kaWYgLyogQUVTICovCisKKyNkZWZpbmUgX19IQUxfUkNDX1JOR19DTEtfRElTQUJMRSgpIENMRUFSX0JJVChSQ0MtPkFIQjJFTlIsIFJDQ19BSEIyRU5SX1JOR0VOKQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfQUhCM19DbG9ja19FbmFibGVfRGlzYWJsZSBBSEIzIFBlcmlwaGVyYWwgQ2xvY2sgRW5hYmxlIERpc2FibGUKKyAqIEBicmllZiAgRW5hYmxlIG9yIGRpc2FibGUgdGhlIEFIQjMgcGVyaXBoZXJhbCBjbG9jay4KKyAqIEBub3RlICAgQWZ0ZXIgcmVzZXQsIHRoZSBwZXJpcGhlcmFsIGNsb2NrICh1c2VkIGZvciByZWdpc3RlcnMgcmVhZC93cml0ZQorICogYWNjZXNzKSBpcyBkaXNhYmxlZCBhbmQgdGhlIGFwcGxpY2F0aW9uIHNvZnR3YXJlIGhhcyB0byBlbmFibGUgdGhpcyBjbG9jaworICogYmVmb3JlIHVzaW5nIGl0LgorICogQHsKKyAqLworCisjaWYgZGVmaW5lZChGTUNfQkFOSzEpCisjZGVmaW5lIF9fSEFMX1JDQ19GTUNfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgU0VUX0JJVChSQ0MtPkFIQjNFTlIsIFJDQ19BSEIzRU5SX0ZNQ0VOKTsgICAgICAgICAgIFwKKyAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyAgXAorICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QUhCM0VOUiwgUkNDX0FIQjNFTlJfRk1DRU4pOyBcCisgICAgVU5VU0VEKHRtcHJlZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBGTUNfQkFOSzEgKi8KKworI2lmIGRlZmluZWQoUVVBRFNQSSkKKyNkZWZpbmUgX19IQUxfUkNDX1FTUElfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTRVRfQklUKFJDQy0+QUhCM0VOUiwgUkNDX0FIQjNFTlJfUVNQSUVOKTsgICAgICAgICAgIFwKKyAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyAgIFwKKyAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFIQjNFTlIsIFJDQ19BSEIzRU5SX1FTUElFTik7IFwKKyAgICBVTlVTRUQodG1wcmVnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBRVUFEU1BJICovCisKKyNpZiBkZWZpbmVkKEZNQ19CQU5LMSkKKyNkZWZpbmUgX19IQUxfUkNDX0ZNQ19DTEtfRElTQUJMRSgpIENMRUFSX0JJVChSQ0MtPkFIQjNFTlIsIFJDQ19BSEIzRU5SX0ZNQ0VOKQorI2VuZGlmIC8qIEZNQ19CQU5LMSAqLworCisjaWYgZGVmaW5lZChRVUFEU1BJKQorI2RlZmluZSBfX0hBTF9SQ0NfUVNQSV9DTEtfRElTQUJMRSgpIENMRUFSX0JJVChSQ0MtPkFIQjNFTlIsIFJDQ19BSEIzRU5SX1FTUElFTikKKyNlbmRpZiAvKiBRVUFEU1BJICovCisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFJDQ19BUEIxX0Nsb2NrX0VuYWJsZV9EaXNhYmxlIEFQQjEgUGVyaXBoZXJhbCBDbG9jayBFbmFibGUgRGlzYWJsZQorICogQGJyaWVmICBFbmFibGUgb3IgZGlzYWJsZSB0aGUgQVBCMSBwZXJpcGhlcmFsIGNsb2NrLgorICogQG5vdGUgICBBZnRlciByZXNldCwgdGhlIHBlcmlwaGVyYWwgY2xvY2sgKHVzZWQgZm9yIHJlZ2lzdGVycyByZWFkL3dyaXRlCisgKiBhY2Nlc3MpIGlzIGRpc2FibGVkIGFuZCB0aGUgYXBwbGljYXRpb24gc29mdHdhcmUgaGFzIHRvIGVuYWJsZSB0aGlzIGNsb2NrCisgKiBiZWZvcmUgdXNpbmcgaXQuCisgKiBAeworICovCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTJfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19JTyB1aW50MzJfdCB0bXByZWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTRVRfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9USU0yRU4pOyAgICAgICAgICAgXAorICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovICAgICBcCisgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1RJTTJFTik7IFwKKyAgICBVTlVTRUQodG1wcmVnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIF9fSEFMX1JDQ19USU0zX0NMS19FTkFCTEUoKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgU0VUX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfVElNM0VOKTsgICAgICAgICAgIFwKKyAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyAgICAgXAorICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9USU0zRU4pOyBcCisgICAgVU5VU0VEKHRtcHJlZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBfX0hBTF9SQ0NfVElNNF9DTEtfRU5BQkxFKCkgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFNFVF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1RJTTRFTik7ICAgICAgICAgICBcCisgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gICAgIFwKKyAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfVElNNEVOKTsgXAorICAgIFVOVVNFRCh0bXByZWcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNpZiBkZWZpbmVkKFRJTTUpCisjZGVmaW5lIF9fSEFMX1JDQ19USU01X0NMS19FTkFCTEUoKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgU0VUX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfVElNNUVOKTsgICAgICAgICAgIFwKKyAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyAgICAgXAorICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9USU01RU4pOyBcCisgICAgVU5VU0VEKHRtcHJlZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBUSU01ICovCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTZfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19JTyB1aW50MzJfdCB0bXByZWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTRVRfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9USU02RU4pOyAgICAgICAgICAgXAorICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovICAgICBcCisgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1RJTTZFTik7IFwKKyAgICBVTlVTRUQodG1wcmVnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIF9fSEFMX1JDQ19USU03X0NMS19FTkFCTEUoKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgU0VUX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfVElNN0VOKTsgICAgICAgICAgIFwKKyAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyAgICAgXAorICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9USU03RU4pOyBcCisgICAgVU5VU0VEKHRtcHJlZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBfX0hBTF9SQ0NfQ1JTX0NMS19FTkFCTEUoKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19JTyB1aW50MzJfdCB0bXByZWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFNFVF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX0NSU0VOKTsgICAgICAgICAgIFwKKyAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyAgICBcCisgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX0NSU0VOKTsgXAorICAgIFVOVVNFRCh0bXByZWcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBfX0hBTF9SQ0NfUlRDQVBCX0NMS19FTkFCTEUoKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19JTyB1aW50MzJfdCB0bXByZWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFNFVF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1JUQ0FQQkVOKTsgICAgICAgICAgIFwKKyAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyAgICAgICBcCisgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1JUQ0FQQkVOKTsgXAorICAgIFVOVVNFRCh0bXByZWcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBfX0hBTF9SQ0NfV1dER19DTEtfRU5BQkxFKCkgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFNFVF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1dXREdFTik7ICAgICAgICAgICBcCisgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gICAgIFwKKyAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfV1dER0VOKTsgXAorICAgIFVOVVNFRCh0bXByZWcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgX19IQUxfUkNDX1NQSTJfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19JTyB1aW50MzJfdCB0bXByZWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTRVRfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9TUEkyRU4pOyAgICAgICAgICAgXAorICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovICAgICBcCisgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1NQSTJFTik7IFwKKyAgICBVTlVTRUQodG1wcmVnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkzX0NMS19FTkFCTEUoKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgU0VUX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfU1BJM0VOKTsgICAgICAgICAgIFwKKyAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyAgICAgXAorICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9TUEkzRU4pOyBcCisgICAgVU5VU0VEKHRtcHJlZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQyX0NMS19FTkFCTEUoKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19JTyB1aW50MzJfdCB0bXByZWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFNFVF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1VTQVJUMkVOKTsgICAgICAgICAgIFwKKyAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyAgICAgICBcCisgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1VTQVJUMkVOKTsgXAorICAgIFVOVVNFRCh0bXByZWcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQzX0NMS19FTkFCTEUoKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19JTyB1aW50MzJfdCB0bXByZWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFNFVF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1VTQVJUM0VOKTsgICAgICAgICAgIFwKKyAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyAgICAgICBcCisgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1VTQVJUM0VOKTsgXAorICAgIFVOVVNFRCh0bXByZWcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2lmIGRlZmluZWQoVUFSVDQpCisjZGVmaW5lIF9fSEFMX1JDQ19VQVJUNF9DTEtfRU5BQkxFKCkgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19JTyB1aW50MzJfdCB0bXByZWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgU0VUX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfVUFSVDRFTik7ICAgICAgICAgICBcCisgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gICAgICBcCisgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1VBUlQ0RU4pOyBcCisgICAgVU5VU0VEKHRtcHJlZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisjZW5kaWYgLyogVUFSVDQgKi8KKworI2lmIGRlZmluZWQoVUFSVDUpCisjZGVmaW5lIF9fSEFMX1JDQ19VQVJUNV9DTEtfRU5BQkxFKCkgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19JTyB1aW50MzJfdCB0bXByZWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgU0VUX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfVUFSVDVFTik7ICAgICAgICAgICBcCisgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gICAgICBcCisgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1VBUlQ1RU4pOyBcCisgICAgVU5VU0VEKHRtcHJlZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisjZW5kaWYgLyogVUFSVDUgKi8KKworI2RlZmluZSBfX0hBTF9SQ0NfSTJDMV9DTEtfRU5BQkxFKCkgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFNFVF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX0kyQzFFTik7ICAgICAgICAgICBcCisgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gICAgIFwKKyAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfSTJDMUVOKTsgXAorICAgIFVOVVNFRCh0bXByZWcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzJfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19JTyB1aW50MzJfdCB0bXByZWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTRVRfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9JMkMyRU4pOyAgICAgICAgICAgXAorICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovICAgICBcCisgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX0kyQzJFTik7IFwKKyAgICBVTlVTRUQodG1wcmVnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIF9fSEFMX1JDQ19VU0JfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgU0VUX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfVVNCRU4pOyAgICAgICAgICAgXAorICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovICAgIFwKKyAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfVVNCRU4pOyBcCisgICAgVU5VU0VEKHRtcHJlZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjaWYgZGVmaW5lZChGRENBTjEpCisjZGVmaW5lIF9fSEFMX1JDQ19GRENBTl9DTEtfRU5BQkxFKCkgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19JTyB1aW50MzJfdCB0bXByZWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgU0VUX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfRkRDQU5FTik7ICAgICAgICAgICBcCisgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gICAgICBcCisgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX0ZEQ0FORU4pOyBcCisgICAgVU5VU0VEKHRtcHJlZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisjZW5kaWYgLyogRkRDQU4xICovCisKKyNkZWZpbmUgX19IQUxfUkNDX1BXUl9DTEtfRU5BQkxFKCkgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTRVRfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9QV1JFTik7ICAgICAgICAgICBcCisgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gICAgXAorICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9QV1JFTik7IFwKKyAgICBVTlVTRUQodG1wcmVnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzNfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19JTyB1aW50MzJfdCB0bXByZWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTRVRfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9JMkMzRU4pOyAgICAgICAgICAgXAorICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovICAgICBcCisgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX0kyQzNFTik7IFwKKyAgICBVTlVTRUQodG1wcmVnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIF9fSEFMX1JDQ19MUFRJTTFfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgU0VUX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfTFBUSU0xRU4pOyAgICAgICAgICAgXAorICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovICAgICAgIFwKKyAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfTFBUSU0xRU4pOyBcCisgICAgVU5VU0VEKHRtcHJlZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIF9fSEFMX1JDQ19MUFVBUlQxX0NMS19FTkFCTEUoKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgU0VUX0JJVChSQ0MtPkFQQjFFTlIyLCBSQ0NfQVBCMUVOUjJfTFBVQVJUMUVOKTsgICAgICAgICAgIFwKKyAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyAgICAgICAgXAorICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCMUVOUjIsIFJDQ19BUEIxRU5SMl9MUFVBUlQxRU4pOyBcCisgICAgVU5VU0VEKHRtcHJlZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2lmIGRlZmluZWQoSTJDNCkKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzRfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19JTyB1aW50MzJfdCB0bXByZWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTRVRfQklUKFJDQy0+QVBCMUVOUjIsIFJDQ19BUEIxRU5SMl9JMkM0RU4pOyAgICAgICAgICAgXAorICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovICAgICBcCisgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEIxRU5SMiwgUkNDX0FQQjFFTlIyX0kyQzRFTik7IFwKKyAgICBVTlVTRUQodG1wcmVnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorI2VuZGlmIC8qIEkyQzQgKi8KKworI2RlZmluZSBfX0hBTF9SQ0NfVUNQRDFfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFNFVF9CSVQoUkNDLT5BUEIxRU5SMiwgUkNDX0FQQjFFTlIyX1VDUEQxRU4pOyAgICAgICAgICAgXAorICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovICAgICAgXAorICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCMUVOUjIsIFJDQ19BUEIxRU5SMl9VQ1BEMUVOKTsgXAorICAgIFVOVVNFRCh0bXByZWcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIF9fSEFMX1JDQ19USU0yX0NMS19ESVNBQkxFKCkgXAorICBDTEVBUl9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1RJTTJFTikKKworI2RlZmluZSBfX0hBTF9SQ0NfVElNM19DTEtfRElTQUJMRSgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9USU0zRU4pCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTRfQ0xLX0RJU0FCTEUoKSBcCisgIENMRUFSX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfVElNNEVOKQorCisjaWYgZGVmaW5lZChUSU01KQorI2RlZmluZSBfX0hBTF9SQ0NfVElNNV9DTEtfRElTQUJMRSgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9USU01RU4pCisjZW5kaWYgLyogVElNNSAqLworCisjZGVmaW5lIF9fSEFMX1JDQ19USU02X0NMS19ESVNBQkxFKCkgXAorICBDTEVBUl9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1RJTTZFTikKKworI2RlZmluZSBfX0hBTF9SQ0NfVElNN19DTEtfRElTQUJMRSgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9USU03RU4pCisKKyNkZWZpbmUgX19IQUxfUkNDX0NSU19DTEtfRElTQUJMRSgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9DUlNFTik7CisKKyNkZWZpbmUgX19IQUxfUkNDX1JUQ0FQQl9DTEtfRElTQUJMRSgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9SVENBUEJFTik7CisKKyNkZWZpbmUgX19IQUxfUkNDX1dXREdfQ0xLX0RJU0FCTEUoKSBcCisgIENMRUFSX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfV1dER0VOKQorCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkyX0NMS19ESVNBQkxFKCkgXAorICBDTEVBUl9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1NQSTJFTikKKworI2RlZmluZSBfX0hBTF9SQ0NfU1BJM19DTEtfRElTQUJMRSgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9TUEkzRU4pCisKKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUMl9DTEtfRElTQUJMRSgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9VU0FSVDJFTikKKworI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQzX0NMS19ESVNBQkxFKCkgXAorICBDTEVBUl9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1VTQVJUM0VOKQorCisjaWYgZGVmaW5lZChVQVJUNCkKKyNkZWZpbmUgX19IQUxfUkNDX1VBUlQ0X0NMS19ESVNBQkxFKCkgXAorICBDTEVBUl9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1VBUlQ0RU4pCisjZW5kaWYgLyogVUFSVDQgKi8KKworI2lmIGRlZmluZWQoVUFSVDUpCisjZGVmaW5lIF9fSEFMX1JDQ19VQVJUNV9DTEtfRElTQUJMRSgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9VQVJUNUVOKQorI2VuZGlmIC8qIFVBUlQ1ICovCisKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzFfQ0xLX0RJU0FCTEUoKSBcCisgIENMRUFSX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfSTJDMUVOKQorCisjZGVmaW5lIF9fSEFMX1JDQ19JMkMyX0NMS19ESVNBQkxFKCkgXAorICBDTEVBUl9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX0kyQzJFTikKKworI2RlZmluZSBfX0hBTF9SQ0NfVVNCX0NMS19ESVNBQkxFKCkgQ0xFQVJfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9VU0JFTikKKworI2lmIGRlZmluZWQoRkRDQU4xKQorI2RlZmluZSBfX0hBTF9SQ0NfRkRDQU5fQ0xLX0RJU0FCTEUoKSBcCisgIENMRUFSX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfRkRDQU5FTikKKyNlbmRpZiAvKiBGRENBTjEgKi8KKworI2RlZmluZSBfX0hBTF9SQ0NfUFdSX0NMS19ESVNBQkxFKCkgQ0xFQVJfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9QV1JFTikKKworI2RlZmluZSBfX0hBTF9SQ0NfSTJDM19DTEtfRElTQUJMRSgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9JMkMzRU4pCisKKyNkZWZpbmUgX19IQUxfUkNDX0xQVElNMV9DTEtfRElTQUJMRSgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9MUFRJTTFFTikKKworI2RlZmluZSBfX0hBTF9SQ0NfTFBVQVJUMV9DTEtfRElTQUJMRSgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QVBCMUVOUjIsIFJDQ19BUEIxRU5SMl9MUFVBUlQxRU4pCisKKyNpZiBkZWZpbmVkKEkyQzQpCisjZGVmaW5lIF9fSEFMX1JDQ19JMkM0X0NMS19ESVNBQkxFKCkgXAorICBDTEVBUl9CSVQoUkNDLT5BUEIxRU5SMiwgUkNDX0FQQjFFTlIyX0kyQzRFTikKKyNlbmRpZiAvKiBJMkM0ICovCisKKyNkZWZpbmUgX19IQUxfUkNDX1VDUEQxX0NMS19ESVNBQkxFKCkgXAorICBDTEVBUl9CSVQoUkNDLT5BUEIxRU5SMiwgUkNDX0FQQjFFTlIyX1VDUEQxRU4pCisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFJDQ19BUEIyX0Nsb2NrX0VuYWJsZV9EaXNhYmxlIEFQQjIgUGVyaXBoZXJhbCBDbG9jayBFbmFibGUgRGlzYWJsZQorICogQGJyaWVmICBFbmFibGUgb3IgZGlzYWJsZSB0aGUgQVBCMiBwZXJpcGhlcmFsIGNsb2NrLgorICogQG5vdGUgICBBZnRlciByZXNldCwgdGhlIHBlcmlwaGVyYWwgY2xvY2sgKHVzZWQgZm9yIHJlZ2lzdGVycyByZWFkL3dyaXRlCisgKiBhY2Nlc3MpIGlzIGRpc2FibGVkIGFuZCB0aGUgYXBwbGljYXRpb24gc29mdHdhcmUgaGFzIHRvIGVuYWJsZSB0aGlzIGNsb2NrCisgKiBiZWZvcmUgdXNpbmcgaXQuCisgKiBAeworICovCisKKyNkZWZpbmUgX19IQUxfUkNDX1NZU0NGR19DTEtfRU5BQkxFKCkgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19JTyB1aW50MzJfdCB0bXByZWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTRVRfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfU1lTQ0ZHRU4pOyAgICAgICAgICAgXAorICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovICAgICBcCisgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEIyRU5SLCBSQ0NfQVBCMkVOUl9TWVNDRkdFTik7IFwKKyAgICBVTlVTRUQodG1wcmVnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xX0NMS19FTkFCTEUoKSAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19JTyB1aW50MzJfdCB0bXByZWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgU0VUX0JJVChSQ0MtPkFQQjJFTlIsIFJDQ19BUEIyRU5SX1RJTTFFTik7ICAgICAgICAgICBcCisgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gICBcCisgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEIyRU5SLCBSQ0NfQVBCMkVOUl9USU0xRU4pOyBcCisgICAgVU5VU0VEKHRtcHJlZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgX19IQUxfUkNDX1NQSTFfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTRVRfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfU1BJMUVOKTsgICAgICAgICAgIFwKKyAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyAgIFwKKyAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQjJFTlIsIFJDQ19BUEIyRU5SX1NQSTFFTik7IFwKKyAgICBVTlVTRUQodG1wcmVnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBfX0hBTF9SQ0NfVElNOF9DTEtfRU5BQkxFKCkgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFNFVF9CSVQoUkNDLT5BUEIyRU5SLCBSQ0NfQVBCMkVOUl9USU04RU4pOyAgICAgICAgICAgXAorICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovICAgXAorICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfVElNOEVOKTsgXAorICAgIFVOVVNFRCh0bXByZWcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDFfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgU0VUX0JJVChSQ0MtPkFQQjJFTlIsIFJDQ19BUEIyRU5SX1VTQVJUMUVOKTsgICAgICAgICAgIFwKKyAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyAgICAgXAorICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfVVNBUlQxRU4pOyBcCisgICAgVU5VU0VEKHRtcHJlZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2lmIGRlZmluZWQoU1BJNCkKKyNkZWZpbmUgX19IQUxfUkNDX1NQSTRfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTRVRfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfU1BJNEVOKTsgICAgICAgICAgIFwKKyAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyAgIFwKKyAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQjJFTlIsIFJDQ19BUEIyRU5SX1NQSTRFTik7IFwKKyAgICBVTlVTRUQodG1wcmVnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBTUEk0ICovCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTE1X0NMS19FTkFCTEUoKSAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTRVRfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfVElNMTVFTik7ICAgICAgICAgICBcCisgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gICAgXAorICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfVElNMTVFTik7IFwKKyAgICBVTlVTRUQodG1wcmVnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTE2X0NMS19FTkFCTEUoKSAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTRVRfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfVElNMTZFTik7ICAgICAgICAgICBcCisgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gICAgXAorICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfVElNMTZFTik7IFwKKyAgICBVTlVTRUQodG1wcmVnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTE3X0NMS19FTkFCTEUoKSAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTRVRfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfVElNMTdFTik7ICAgICAgICAgICBcCisgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gICAgXAorICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfVElNMTdFTik7IFwKKyAgICBVTlVTRUQodG1wcmVnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNpZiBkZWZpbmVkKFRJTTIwKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMjBfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19JTyB1aW50MzJfdCB0bXByZWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFNFVF9CSVQoUkNDLT5BUEIyRU5SLCBSQ0NfQVBCMkVOUl9USU0yMEVOKTsgICAgICAgICAgIFwKKyAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyAgICBcCisgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEIyRU5SLCBSQ0NfQVBCMkVOUl9USU0yMEVOKTsgXAorICAgIFVOVVNFRCh0bXByZWcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBUSU0yMCAqLworCisjZGVmaW5lIF9fSEFMX1JDQ19TQUkxX0NMS19FTkFCTEUoKSAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19JTyB1aW50MzJfdCB0bXByZWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgU0VUX0JJVChSQ0MtPkFQQjJFTlIsIFJDQ19BUEIyRU5SX1NBSTFFTik7ICAgICAgICAgICBcCisgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gICBcCisgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEIyRU5SLCBSQ0NfQVBCMkVOUl9TQUkxRU4pOyBcCisgICAgVU5VU0VEKHRtcHJlZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNpZiBkZWZpbmVkKEhSVElNMSkKKyNkZWZpbmUgX19IQUxfUkNDX0hSVElNMV9DTEtfRU5BQkxFKCkgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19JTyB1aW50MzJfdCB0bXByZWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTRVRfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfSFJUSU0xRU4pOyAgICAgICAgICAgXAorICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovICAgICBcCisgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEIyRU5SLCBSQ0NfQVBCMkVOUl9IUlRJTTFFTik7IFwKKyAgICBVTlVTRUQodG1wcmVnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorI2VuZGlmIC8qIEhSVElNMSAqLworCisjZGVmaW5lIF9fSEFMX1JDQ19TWVNDRkdfQ0xLX0RJU0FCTEUoKSBcCisgIENMRUFSX0JJVChSQ0MtPkFQQjJFTlIsIFJDQ19BUEIyRU5SX1NZU0NGR0VOKQorCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xX0NMS19ESVNBQkxFKCkgQ0xFQVJfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfVElNMUVOKQorCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkxX0NMS19ESVNBQkxFKCkgQ0xFQVJfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfU1BJMUVOKQorCisjZGVmaW5lIF9fSEFMX1JDQ19USU04X0NMS19ESVNBQkxFKCkgQ0xFQVJfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfVElNOEVOKQorCisjZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDFfQ0xLX0RJU0FCTEUoKSBcCisgIENMRUFSX0JJVChSQ0MtPkFQQjJFTlIsIFJDQ19BUEIyRU5SX1VTQVJUMUVOKQorCisjaWYgZGVmaW5lZChTUEk0KQorI2RlZmluZSBfX0hBTF9SQ0NfU1BJNF9DTEtfRElTQUJMRSgpIENMRUFSX0JJVChSQ0MtPkFQQjJFTlIsIFJDQ19BUEIyRU5SX1NQSTRFTikKKyNlbmRpZiAvKiBTUEk0ICovCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTE1X0NMS19ESVNBQkxFKCkgXAorICBDTEVBUl9CSVQoUkNDLT5BUEIyRU5SLCBSQ0NfQVBCMkVOUl9USU0xNUVOKQorCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xNl9DTEtfRElTQUJMRSgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfVElNMTZFTikKKworI2RlZmluZSBfX0hBTF9SQ0NfVElNMTdfQ0xLX0RJU0FCTEUoKSBcCisgIENMRUFSX0JJVChSQ0MtPkFQQjJFTlIsIFJDQ19BUEIyRU5SX1RJTTE3RU4pCisKKyNpZiBkZWZpbmVkKFRJTTIwKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMjBfQ0xLX0RJU0FCTEUoKSBcCisgIENMRUFSX0JJVChSQ0MtPkFQQjJFTlIsIFJDQ19BUEIyRU5SX1RJTTIwRU4pCisjZW5kaWYgLyogVElNMjAgKi8KKworI2RlZmluZSBfX0hBTF9SQ0NfU0FJMV9DTEtfRElTQUJMRSgpIENMRUFSX0JJVChSQ0MtPkFQQjJFTlIsIFJDQ19BUEIyRU5SX1NBSTFFTikKKworI2lmIGRlZmluZWQoSFJUSU0xKQorI2RlZmluZSBfX0hBTF9SQ0NfSFJUSU0xX0NMS19ESVNBQkxFKCkgXAorICBDTEVBUl9CSVQoUkNDLT5BUEIyRU5SLCBSQ0NfQVBCMkVOUl9IUlRJTTFFTikKKyNlbmRpZiAvKiBIUlRJTTEgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0FIQjFfUGVyaXBoZXJhbF9DbG9ja19FbmFibGVfRGlzYWJsZV9TdGF0dXMgQUhCMSBQZXJpcGhlcmFsCisgKiBDbG9jayBFbmFibGVkIG9yIERpc2FibGVkIFN0YXR1cworICogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBBSEIxIHBlcmlwaGVyYWwgY2xvY2sgaXMgZW5hYmxlZCBvciBub3QuCisgKiBAbm90ZSAgIEFmdGVyIHJlc2V0LCB0aGUgcGVyaXBoZXJhbCBjbG9jayAodXNlZCBmb3IgcmVnaXN0ZXJzIHJlYWQvd3JpdGUKKyAqIGFjY2VzcykgaXMgZGlzYWJsZWQgYW5kIHRoZSBhcHBsaWNhdGlvbiBzb2Z0d2FyZSBoYXMgdG8gZW5hYmxlIHRoaXMgY2xvY2sKKyAqIGJlZm9yZSB1c2luZyBpdC4KKyAqIEB7CisgKi8KKworI2RlZmluZSBfX0hBTF9SQ0NfRE1BMV9JU19DTEtfRU5BQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QUhCMUVOUiwgUkNDX0FIQjFFTlJfRE1BMUVOKSAhPSAwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfRE1BMl9JU19DTEtfRU5BQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QUhCMUVOUiwgUkNDX0FIQjFFTlJfRE1BMkVOKSAhPSAwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfRE1BTVVYMV9JU19DTEtfRU5BQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QUhCMUVOUiwgUkNDX0FIQjFFTlJfRE1BTVVYMUVOKSAhPSAwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfQ09SRElDX0lTX0NMS19FTkFCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BSEIxRU5SLCBSQ0NfQUhCMUVOUl9DT1JESUNFTikgIT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX0ZNQUNfSVNfQ0xLX0VOQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFIQjFFTlIsIFJDQ19BSEIxRU5SX0ZNQUNFTikgIT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX0ZMQVNIX0lTX0NMS19FTkFCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BSEIxRU5SLCBSQ0NfQUhCMUVOUl9GTEFTSEVOKSAhPSAwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfQ1JDX0lTX0NMS19FTkFCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BSEIxRU5SLCBSQ0NfQUhCMUVOUl9DUkNFTikgIT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX0RNQTFfSVNfQ0xLX0RJU0FCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BSEIxRU5SLCBSQ0NfQUhCMUVOUl9ETUExRU4pID09IDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19ETUEyX0lTX0NMS19ESVNBQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QUhCMUVOUiwgUkNDX0FIQjFFTlJfRE1BMkVOKSA9PSAwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfRE1BTVVYMV9JU19DTEtfRElTQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFIQjFFTlIsIFJDQ19BSEIxRU5SX0RNQU1VWDFFTikgPT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX0NPUkRJQ19JU19DTEtfRElTQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFIQjFFTlIsIFJDQ19BSEIxRU5SX0NPUkRJQ0VOKSA9PSAwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfRk1BQ19JU19DTEtfRElTQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFIQjFFTlIsIFJDQ19BSEIxRU5SX0ZNQUNFTikgPT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX0ZMQVNIX0lTX0NMS19ESVNBQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QUhCMUVOUiwgUkNDX0FIQjFFTlJfRkxBU0hFTikgPT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX0NSQ19JU19DTEtfRElTQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFIQjFFTlIsIFJDQ19BSEIxRU5SX0NSQ0VOKSA9PSAwVSkKKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0FIQjJfQ2xvY2tfRW5hYmxlX0Rpc2FibGVfU3RhdHVzIEFIQjIgUGVyaXBoZXJhbCBDbG9jayBFbmFibGVkCisgKiBvciBEaXNhYmxlZCBTdGF0dXMKKyAqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgQUhCMiBwZXJpcGhlcmFsIGNsb2NrIGlzIGVuYWJsZWQgb3Igbm90LgorICogQG5vdGUgICBBZnRlciByZXNldCwgdGhlIHBlcmlwaGVyYWwgY2xvY2sgKHVzZWQgZm9yIHJlZ2lzdGVycyByZWFkL3dyaXRlCisgKiBhY2Nlc3MpIGlzIGRpc2FibGVkIGFuZCB0aGUgYXBwbGljYXRpb24gc29mdHdhcmUgaGFzIHRvIGVuYWJsZSB0aGlzIGNsb2NrCisgKiBiZWZvcmUgdXNpbmcgaXQuCisgKiBAeworICovCisKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9BX0lTX0NMS19FTkFCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BSEIyRU5SLCBSQ0NfQUhCMkVOUl9HUElPQUVOKSAhPSAwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0JfSVNfQ0xLX0VOQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFIQjJFTlIsIFJDQ19BSEIyRU5SX0dQSU9CRU4pICE9IDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPQ19JU19DTEtfRU5BQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfR1BJT0NFTikgIT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9EX0lTX0NMS19FTkFCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BSEIyRU5SLCBSQ0NfQUhCMkVOUl9HUElPREVOKSAhPSAwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0VfSVNfQ0xLX0VOQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFIQjJFTlIsIFJDQ19BSEIyRU5SX0dQSU9FRU4pICE9IDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPRl9JU19DTEtfRU5BQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfR1BJT0ZFTikgIT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9HX0lTX0NMS19FTkFCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BSEIyRU5SLCBSQ0NfQUhCMkVOUl9HUElPR0VOKSAhPSAwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfQURDMTJfSVNfQ0xLX0VOQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFIQjJFTlIsIFJDQ19BSEIyRU5SX0FEQzEyRU4pICE9IDBVKQorCisjaWYgZGVmaW5lZChBREMzNDVfQ09NTU9OKQorI2RlZmluZSBfX0hBTF9SQ0NfQURDMzQ1X0lTX0NMS19FTkFCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BSEIyRU5SLCBSQ0NfQUhCMkVOUl9BREMzNDVFTikgIT0gMFUpCisjZW5kaWYgLyogQURDMzQ1X0NPTU1PTiAqLworCisjZGVmaW5lIF9fSEFMX1JDQ19EQUMxX0lTX0NMS19FTkFCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BSEIyRU5SLCBSQ0NfQUhCMkVOUl9EQUMxRU4pICE9IDBVKQorCisjaWYgZGVmaW5lZChEQUMyKQorI2RlZmluZSBfX0hBTF9SQ0NfREFDMl9JU19DTEtfRU5BQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfREFDMkVOKSAhPSAwVSkKKyNlbmRpZiAvKiBEQUMyICovCisKKyNkZWZpbmUgX19IQUxfUkNDX0RBQzNfSVNfQ0xLX0VOQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFIQjJFTlIsIFJDQ19BSEIyRU5SX0RBQzNFTikgIT0gMFUpCisKKyNpZiBkZWZpbmVkKERBQzQpCisjZGVmaW5lIF9fSEFMX1JDQ19EQUM0X0lTX0NMS19FTkFCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BSEIyRU5SLCBSQ0NfQUhCMkVOUl9EQUM0RU4pICE9IDBVKQorI2VuZGlmIC8qIERBQzQgKi8KKworI2lmIGRlZmluZWQoQUVTKQorI2RlZmluZSBfX0hBTF9SQ0NfQUVTX0lTX0NMS19FTkFCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BSEIyRU5SLCBSQ0NfQUhCMkVOUl9BRVNFTikgIT0gMFUpCisjZW5kaWYgLyogQUVTICovCisKKyNkZWZpbmUgX19IQUxfUkNDX1JOR19JU19DTEtfRU5BQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfUk5HRU4pICE9IDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPQV9JU19DTEtfRElTQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFIQjJFTlIsIFJDQ19BSEIyRU5SX0dQSU9BRU4pID09IDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPQl9JU19DTEtfRElTQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFIQjJFTlIsIFJDQ19BSEIyRU5SX0dQSU9CRU4pID09IDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPQ19JU19DTEtfRElTQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFIQjJFTlIsIFJDQ19BSEIyRU5SX0dQSU9DRU4pID09IDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPRF9JU19DTEtfRElTQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFIQjJFTlIsIFJDQ19BSEIyRU5SX0dQSU9ERU4pID09IDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPRV9JU19DTEtfRElTQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFIQjJFTlIsIFJDQ19BSEIyRU5SX0dQSU9FRU4pID09IDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPRl9JU19DTEtfRElTQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFIQjJFTlIsIFJDQ19BSEIyRU5SX0dQSU9GRU4pID09IDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPR19JU19DTEtfRElTQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFIQjJFTlIsIFJDQ19BSEIyRU5SX0dQSU9HRU4pID09IDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19BREMxMl9JU19DTEtfRElTQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFIQjJFTlIsIFJDQ19BSEIyRU5SX0FEQzEyRU4pID09IDBVKQorCisjaWYgZGVmaW5lZChBREMzNDVfQ09NTU9OKQorI2RlZmluZSBfX0hBTF9SQ0NfQURDMzQ1X0lTX0NMS19ESVNBQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfQURDMzQ1RU4pID09IDBVKQorI2VuZGlmIC8qIEFEQzM0NV9DT01NT04gKi8KKworI2RlZmluZSBfX0hBTF9SQ0NfREFDMV9JU19DTEtfRElTQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFIQjJFTlIsIFJDQ19BSEIyRU5SX0RBQzFFTikgPT0gMFUpCisKKyNpZiBkZWZpbmVkKERBQzIpCisjZGVmaW5lIF9fSEFMX1JDQ19EQUMyX0lTX0NMS19ESVNBQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QUhCMkVOUiwgUkNDX0FIQjJFTlJfREFDMkVOKSA9PSAwVSkKKyNlbmRpZiAvKiBEQUMyICovCisKKyNkZWZpbmUgX19IQUxfUkNDX0RBQzNfSVNfQ0xLX0RJU0FCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BSEIyRU5SLCBSQ0NfQUhCMkVOUl9EQUMzRU4pID09IDBVKQorCisjaWYgZGVmaW5lZChEQUM0KQorI2RlZmluZSBfX0hBTF9SQ0NfREFDNF9JU19DTEtfRElTQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFIQjJFTlIsIFJDQ19BSEIyRU5SX0RBQzRFTikgPT0gMFUpCisjZW5kaWYgLyogREFDNCAqLworCisjaWYgZGVmaW5lZChBRVMpCisjZGVmaW5lIF9fSEFMX1JDQ19BRVNfSVNfQ0xLX0RJU0FCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BSEIyRU5SLCBSQ0NfQUhCMkVOUl9BRVNFTikgPT0gMFUpCisjZW5kaWYgLyogQUVTICovCisKKyNkZWZpbmUgX19IQUxfUkNDX1JOR19JU19DTEtfRElTQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFIQjJFTlIsIFJDQ19BSEIyRU5SX1JOR0VOKSA9PSAwVSkKKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0FIQjNfQ2xvY2tfRW5hYmxlX0Rpc2FibGVfU3RhdHVzIEFIQjMgUGVyaXBoZXJhbCBDbG9jayBFbmFibGVkCisgKiBvciBEaXNhYmxlZCBTdGF0dXMKKyAqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgQUhCMyBwZXJpcGhlcmFsIGNsb2NrIGlzIGVuYWJsZWQgb3Igbm90LgorICogQG5vdGUgICBBZnRlciByZXNldCwgdGhlIHBlcmlwaGVyYWwgY2xvY2sgKHVzZWQgZm9yIHJlZ2lzdGVycyByZWFkL3dyaXRlCisgKiBhY2Nlc3MpIGlzIGRpc2FibGVkIGFuZCB0aGUgYXBwbGljYXRpb24gc29mdHdhcmUgaGFzIHRvIGVuYWJsZSB0aGlzIGNsb2NrCisgKiBiZWZvcmUgdXNpbmcgaXQuCisgKiBAeworICovCisKKyNpZiBkZWZpbmVkKEZNQ19CQU5LMSkKKyNkZWZpbmUgX19IQUxfUkNDX0ZNQ19JU19DTEtfRU5BQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QUhCM0VOUiwgUkNDX0FIQjNFTlJfRk1DRU4pICE9IDBVKQorI2VuZGlmIC8qIEZNQ19CQU5LMSAqLworCisjaWYgZGVmaW5lZChRVUFEU1BJKQorI2RlZmluZSBfX0hBTF9SQ0NfUVNQSV9JU19DTEtfRU5BQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QUhCM0VOUiwgUkNDX0FIQjNFTlJfUVNQSUVOKSAhPSAwVSkKKyNlbmRpZiAvKiBRVUFEU1BJICovCisKKyNpZiBkZWZpbmVkKEZNQ19CQU5LMSkKKyNkZWZpbmUgX19IQUxfUkNDX0ZNQ19JU19DTEtfRElTQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFIQjNFTlIsIFJDQ19BSEIzRU5SX0ZNQ0VOKSA9PSAwVSkKKyNlbmRpZiAvKiBGTUNfQkFOSzEgKi8KKworI2lmIGRlZmluZWQoUVVBRFNQSSkKKyNkZWZpbmUgX19IQUxfUkNDX1FTUElfSVNfQ0xLX0RJU0FCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BSEIzRU5SLCBSQ0NfQUhCM0VOUl9RU1BJRU4pID09IDBVKQorI2VuZGlmIC8qIFFVQURTUEkgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0FQQjFfQ2xvY2tfRW5hYmxlX0Rpc2FibGVfU3RhdHVzIEFQQjEgUGVyaXBoZXJhbCBDbG9jayBFbmFibGVkCisgKiBvciBEaXNhYmxlZCBTdGF0dXMKKyAqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgQVBCMSBwZXJpcGhlcmFsIGNsb2NrIGlzIGVuYWJsZWQgb3Igbm90LgorICogQG5vdGUgICBBZnRlciByZXNldCwgdGhlIHBlcmlwaGVyYWwgY2xvY2sgKHVzZWQgZm9yIHJlZ2lzdGVycyByZWFkL3dyaXRlCisgKiBhY2Nlc3MpIGlzIGRpc2FibGVkIGFuZCB0aGUgYXBwbGljYXRpb24gc29mdHdhcmUgaGFzIHRvIGVuYWJsZSB0aGlzIGNsb2NrCisgKiBiZWZvcmUgdXNpbmcgaXQuCisgKiBAeworICovCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTJfSVNfQ0xLX0VOQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfVElNMkVOKSAhPSAwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfVElNM19JU19DTEtfRU5BQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9USU0zRU4pICE9IDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19USU00X0lTX0NMS19FTkFCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1RJTTRFTikgIT0gMFUpCisKKyNpZiBkZWZpbmVkKFRJTTUpCisjZGVmaW5lIF9fSEFMX1JDQ19USU01X0lTX0NMS19FTkFCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1RJTTVFTikgIT0gMFUpCisjZW5kaWYgLyogVElNNSAqLworCisjZGVmaW5lIF9fSEFMX1JDQ19USU02X0lTX0NMS19FTkFCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1RJTTZFTikgIT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTdfSVNfQ0xLX0VOQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfVElNN0VOKSAhPSAwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfQ1JTX0lTX0NMS19FTkFCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX0NSU0VOKSAhPSAwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfUlRDQVBCX0lTX0NMS19FTkFCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1JUQ0FQQkVOKSAhPSAwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfV1dER19JU19DTEtfRU5BQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9XV0RHRU4pICE9IDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkyX0lTX0NMS19FTkFCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1NQSTJFTikgIT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX1NQSTNfSVNfQ0xLX0VOQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfU1BJM0VOKSAhPSAwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQyX0lTX0NMS19FTkFCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1VTQVJUMkVOKSAhPSAwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQzX0lTX0NMS19FTkFCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1VTQVJUM0VOKSAhPSAwVSkKKworI2lmIGRlZmluZWQoVUFSVDQpCisjZGVmaW5lIF9fSEFMX1JDQ19VQVJUNF9JU19DTEtfRU5BQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9VQVJUNEVOKSAhPSAwVSkKKyNlbmRpZiAvKiBVQVJUNCAqLworCisjaWYgZGVmaW5lZChVQVJUNSkKKyNkZWZpbmUgX19IQUxfUkNDX1VBUlQ1X0lTX0NMS19FTkFCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1VBUlQ1RU4pICE9IDBVKQorI2VuZGlmIC8qIFVBUlQ1ICovCisKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzFfSVNfQ0xLX0VOQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfSTJDMUVOKSAhPSAwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfSTJDMl9JU19DTEtfRU5BQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9JMkMyRU4pICE9IDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19VU0JfSVNfQ0xLX0VOQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfVVNCRU4pICE9IDBVKQorCisjaWYgZGVmaW5lZChGRENBTjEpCisjZGVmaW5lIF9fSEFMX1JDQ19GRENBTl9JU19DTEtfRU5BQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9GRENBTkVOKSAhPSAwVSkKKyNlbmRpZiAvKiBGRENBTjEgKi8KKworI2RlZmluZSBfX0hBTF9SQ0NfUFdSX0lTX0NMS19FTkFCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1BXUkVOKSAhPSAwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfSTJDM19JU19DTEtfRU5BQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9JMkMzRU4pICE9IDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19MUFRJTTFfSVNfQ0xLX0VOQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfTFBUSU0xRU4pICE9IDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19MUFVBUlQxX0lTX0NMS19FTkFCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BUEIxRU5SMiwgUkNDX0FQQjFFTlIyX0xQVUFSVDFFTikgIT0gMFUpCisKKyNpZiBkZWZpbmVkKEkyQzQpCisjZGVmaW5lIF9fSEFMX1JDQ19JMkM0X0lTX0NMS19FTkFCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BUEIxRU5SMiwgUkNDX0FQQjFFTlIyX0kyQzRFTikgIT0gMFUpCisjZW5kaWYgLyogSTJDNCAqLworCisjZGVmaW5lIF9fSEFMX1JDQ19VQ1BEMV9JU19DTEtfRU5BQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QVBCMUVOUjIsIFJDQ19BUEIxRU5SMl9VQ1BEMUVOKSAhPSAwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfVElNMl9JU19DTEtfRElTQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfVElNMkVOKSA9PSAwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfVElNM19JU19DTEtfRElTQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfVElNM0VOKSA9PSAwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfVElNNF9JU19DTEtfRElTQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfVElNNEVOKSA9PSAwVSkKKworI2lmIGRlZmluZWQoVElNNSkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTVfSVNfQ0xLX0RJU0FCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1RJTTVFTikgPT0gMFUpCisjZW5kaWYgLyogVElNNSAqLworCisjZGVmaW5lIF9fSEFMX1JDQ19USU02X0lTX0NMS19ESVNBQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9USU02RU4pID09IDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19USU03X0lTX0NMS19ESVNBQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9USU03RU4pID09IDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19DUlNfSVNfQ0xLX0RJU0FCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX0NSU0VOKSA9PSAwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfUlRDQVBCX0lTX0NMS19ESVNBQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9SVENBUEJFTikgPT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX1dXREdfSVNfQ0xLX0RJU0FCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1dXREdFTikgPT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX1NQSTJfSVNfQ0xLX0RJU0FCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1NQSTJFTikgPT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX1NQSTNfSVNfQ0xLX0RJU0FCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1NQSTNFTikgPT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUMl9JU19DTEtfRElTQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfVVNBUlQyRU4pID09IDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDNfSVNfQ0xLX0RJU0FCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX1VTQVJUM0VOKSA9PSAwVSkKKworI2lmIGRlZmluZWQoVUFSVDQpCisjZGVmaW5lIF9fSEFMX1JDQ19VQVJUNF9JU19DTEtfRElTQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfVUFSVDRFTikgPT0gMFUpCisjZW5kaWYgLyogVUFSVDQgKi8KKworI2lmIGRlZmluZWQoVUFSVDUpCisjZGVmaW5lIF9fSEFMX1JDQ19VQVJUNV9JU19DTEtfRElTQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfVUFSVDVFTikgPT0gMFUpCisjZW5kaWYgLyogVUFSVDUgKi8KKworI2RlZmluZSBfX0hBTF9SQ0NfSTJDMV9JU19DTEtfRElTQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfSTJDMUVOKSA9PSAwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfSTJDMl9JU19DTEtfRElTQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfSTJDMkVOKSA9PSAwVSkKKworI2lmIGRlZmluZWQoVVNCKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNCX0lTX0NMS19ESVNBQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9VU0JFTikgPT0gMFUpCisjZW5kaWYgLyogVVNCICovCisKKyNpZiBkZWZpbmVkKEZEQ0FOMSkKKyNkZWZpbmUgX19IQUxfUkNDX0ZEQ0FOX0lTX0NMS19ESVNBQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9GRENBTkVOKSA9PSAwVSkKKyNlbmRpZiAvKiBGRENBTjEgKi8KKworI2RlZmluZSBfX0hBTF9SQ0NfUFdSX0lTX0NMS19ESVNBQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QVBCMUVOUjEsIFJDQ19BUEIxRU5SMV9QV1JFTikgPT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzNfSVNfQ0xLX0RJU0FCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BUEIxRU5SMSwgUkNDX0FQQjFFTlIxX0kyQzNFTikgPT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX0xQVElNMV9JU19DTEtfRElTQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIxLCBSQ0NfQVBCMUVOUjFfTFBUSU0xRU4pID09IDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19MUFVBUlQxX0lTX0NMS19ESVNBQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QVBCMUVOUjIsIFJDQ19BUEIxRU5SMl9MUFVBUlQxRU4pID09IDBVKQorCisjaWYgZGVmaW5lZChJMkM0KQorI2RlZmluZSBfX0hBTF9SQ0NfSTJDNF9JU19DTEtfRElTQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIyLCBSQ0NfQVBCMUVOUjJfSTJDNEVOKSA9PSAwVSkKKyNlbmRpZiAvKiBJMkM0ICovCisKKyNkZWZpbmUgX19IQUxfUkNDX1VDUEQxX0lTX0NMS19ESVNBQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QVBCMUVOUjIsIFJDQ19BUEIxRU5SMl9VQ1BEMUVOKSA9PSAwVSkKKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0FQQjJfQ2xvY2tfRW5hYmxlX0Rpc2FibGVfU3RhdHVzIEFQQjIgUGVyaXBoZXJhbCBDbG9jayBFbmFibGVkCisgKiBvciBEaXNhYmxlZCBTdGF0dXMKKyAqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgQVBCMiBwZXJpcGhlcmFsIGNsb2NrIGlzIGVuYWJsZWQgb3Igbm90LgorICogQG5vdGUgICBBZnRlciByZXNldCwgdGhlIHBlcmlwaGVyYWwgY2xvY2sgKHVzZWQgZm9yIHJlZ2lzdGVycyByZWFkL3dyaXRlCisgKiBhY2Nlc3MpIGlzIGRpc2FibGVkIGFuZCB0aGUgYXBwbGljYXRpb24gc29mdHdhcmUgaGFzIHRvIGVuYWJsZSB0aGlzIGNsb2NrCisgKiBiZWZvcmUgdXNpbmcgaXQuCisgKiBAeworICovCisKKyNkZWZpbmUgX19IQUxfUkNDX1NZU0NGR19JU19DTEtfRU5BQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfU1lTQ0ZHRU4pICE9IDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xX0lTX0NMS19FTkFCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BUEIyRU5SLCBSQ0NfQVBCMkVOUl9USU0xRU4pICE9IDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkxX0lTX0NMS19FTkFCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BUEIyRU5SLCBSQ0NfQVBCMkVOUl9TUEkxRU4pICE9IDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19USU04X0lTX0NMS19FTkFCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BUEIyRU5SLCBSQ0NfQVBCMkVOUl9USU04RU4pICE9IDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDFfSVNfQ0xLX0VOQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFQQjJFTlIsIFJDQ19BUEIyRU5SX1VTQVJUMUVOKSAhPSAwVSkKKworI2lmIGRlZmluZWQoU1BJNCkKKyNkZWZpbmUgX19IQUxfUkNDX1NQSTRfSVNfQ0xLX0VOQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFQQjJFTlIsIFJDQ19BUEIyRU5SX1NQSTRFTikgIT0gMFUpCisjZW5kaWYgLyogU1BJNCAqLworCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xNV9JU19DTEtfRU5BQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfVElNMTVFTikgIT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTE2X0lTX0NMS19FTkFCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BUEIyRU5SLCBSQ0NfQVBCMkVOUl9USU0xNkVOKSAhPSAwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfVElNMTdfSVNfQ0xLX0VOQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFQQjJFTlIsIFJDQ19BUEIyRU5SX1RJTTE3RU4pICE9IDBVKQorCisjaWYgZGVmaW5lZChUSU0yMCkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTIwX0lTX0NMS19FTkFCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BUEIyRU5SLCBSQ0NfQVBCMkVOUl9USU0yMEVOKSAhPSAwVSkKKyNlbmRpZiAvKiBUSU0yMCAqLworCisjZGVmaW5lIF9fSEFMX1JDQ19TQUkxX0lTX0NMS19FTkFCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BUEIyRU5SLCBSQ0NfQVBCMkVOUl9TQUkxRU4pICE9IDBVKQorCisjaWYgZGVmaW5lZChIUlRJTTEpCisjZGVmaW5lIF9fSEFMX1JDQ19IUlRJTTFfSVNfQ0xLX0VOQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFQQjJFTlIsIFJDQ19BUEIyRU5SX0hSVElNMUVOKSAhPSAwVSkKKyNlbmRpZiAvKiBIUlRJTTEgKi8KKworI2RlZmluZSBfX0hBTF9SQ0NfU1lTQ0ZHX0lTX0NMS19ESVNBQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfU1lTQ0ZHRU4pID09IDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xX0lTX0NMS19ESVNBQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfVElNMUVOKSA9PSAwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfU1BJMV9JU19DTEtfRElTQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFQQjJFTlIsIFJDQ19BUEIyRU5SX1NQSTFFTikgPT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTThfSVNfQ0xLX0RJU0FCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BUEIyRU5SLCBSQ0NfQVBCMkVOUl9USU04RU4pID09IDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDFfSVNfQ0xLX0RJU0FCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BUEIyRU5SLCBSQ0NfQVBCMkVOUl9VU0FSVDFFTikgPT0gMFUpCisKKyNpZiBkZWZpbmVkKFNQSTQpCisjZGVmaW5lIF9fSEFMX1JDQ19TUEk0X0lTX0NMS19ESVNBQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfU1BJNEVOKSA9PSAwVSkKKyNlbmRpZiAvKiBTUEk0ICovCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTE1X0lTX0NMS19ESVNBQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfVElNMTVFTikgPT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTE2X0lTX0NMS19ESVNBQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfVElNMTZFTikgPT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTE3X0lTX0NMS19ESVNBQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfVElNMTdFTikgPT0gMFUpCisKKyNpZiBkZWZpbmVkKFRJTTIwKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMjBfSVNfQ0xLX0RJU0FCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BUEIyRU5SLCBSQ0NfQVBCMkVOUl9USU0yMEVOKSA9PSAwVSkKKyNlbmRpZiAvKiBUSU0yMCAqLworCisjZGVmaW5lIF9fSEFMX1JDQ19TQUkxX0lTX0NMS19ESVNBQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfU0FJMUVOKSA9PSAwVSkKKworI2lmIGRlZmluZWQoSFJUSU0xKQorI2RlZmluZSBfX0hBTF9SQ0NfSFJUSU0xX0lTX0NMS19ESVNBQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfSFJUSU0xRU4pID09IDBVKQorI2VuZGlmIC8qIEhSVElNMSAqLworCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfQUhCMV9Gb3JjZV9SZWxlYXNlX1Jlc2V0IEFIQjEgUGVyaXBoZXJhbCBGb3JjZSBSZWxlYXNlIFJlc2V0CisgKiBAYnJpZWYgIEZvcmNlIG9yIHJlbGVhc2UgQUhCMSBwZXJpcGhlcmFsIHJlc2V0LgorICogQHsKKyAqLworI2RlZmluZSBfX0hBTF9SQ0NfQUhCMV9GT1JDRV9SRVNFVCgpIFdSSVRFX1JFRyhSQ0MtPkFIQjFSU1RSLCAweEZGRkZGRkZGVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfRE1BMV9GT1JDRV9SRVNFVCgpIFwKKyAgU0VUX0JJVChSQ0MtPkFIQjFSU1RSLCBSQ0NfQUhCMVJTVFJfRE1BMVJTVCkKKworI2RlZmluZSBfX0hBTF9SQ0NfRE1BMl9GT1JDRV9SRVNFVCgpIFwKKyAgU0VUX0JJVChSQ0MtPkFIQjFSU1RSLCBSQ0NfQUhCMVJTVFJfRE1BMlJTVCkKKworI2RlZmluZSBfX0hBTF9SQ0NfRE1BTVVYMV9GT1JDRV9SRVNFVCgpIFwKKyAgU0VUX0JJVChSQ0MtPkFIQjFSU1RSLCBSQ0NfQUhCMVJTVFJfRE1BTVVYMVJTVCkKKworI2RlZmluZSBfX0hBTF9SQ0NfQ09SRElDX0ZPUkNFX1JFU0VUKCkgXAorICBTRVRfQklUKFJDQy0+QUhCMVJTVFIsIFJDQ19BSEIxUlNUUl9DT1JESUNSU1QpCisKKyNkZWZpbmUgX19IQUxfUkNDX0ZNQUNfRk9SQ0VfUkVTRVQoKSBcCisgIFNFVF9CSVQoUkNDLT5BSEIxUlNUUiwgUkNDX0FIQjFSU1RSX0ZNQUNSU1QpCisKKyNkZWZpbmUgX19IQUxfUkNDX0ZMQVNIX0ZPUkNFX1JFU0VUKCkgXAorICBTRVRfQklUKFJDQy0+QUhCMVJTVFIsIFJDQ19BSEIxUlNUUl9GTEFTSFJTVCkKKworI2RlZmluZSBfX0hBTF9SQ0NfQ1JDX0ZPUkNFX1JFU0VUKCkgU0VUX0JJVChSQ0MtPkFIQjFSU1RSLCBSQ0NfQUhCMVJTVFJfQ1JDUlNUKQorCisjZGVmaW5lIF9fSEFMX1JDQ19BSEIxX1JFTEVBU0VfUkVTRVQoKSBXUklURV9SRUcoUkNDLT5BSEIxUlNUUiwgMHgwMDAwMDAwMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX0RNQTFfUkVMRUFTRV9SRVNFVCgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QUhCMVJTVFIsIFJDQ19BSEIxUlNUUl9ETUExUlNUKQorCisjZGVmaW5lIF9fSEFMX1JDQ19ETUEyX1JFTEVBU0VfUkVTRVQoKSBcCisgIENMRUFSX0JJVChSQ0MtPkFIQjFSU1RSLCBSQ0NfQUhCMVJTVFJfRE1BMlJTVCkKKworI2RlZmluZSBfX0hBTF9SQ0NfRE1BTVVYMV9SRUxFQVNFX1JFU0VUKCkgXAorICBDTEVBUl9CSVQoUkNDLT5BSEIxUlNUUiwgUkNDX0FIQjFSU1RSX0RNQU1VWDFSU1QpCisKKyNkZWZpbmUgX19IQUxfUkNDX0NPUkRJQ19SRUxFQVNFX1JFU0VUKCkgXAorICBDTEVBUl9CSVQoUkNDLT5BSEIxUlNUUiwgUkNDX0FIQjFSU1RSX0NPUkRJQ1JTVCkKKworI2RlZmluZSBfX0hBTF9SQ0NfRk1BQ19SRUxFQVNFX1JFU0VUKCkgXAorICBDTEVBUl9CSVQoUkNDLT5BSEIxUlNUUiwgUkNDX0FIQjFSU1RSX0ZNQUNSU1QpCisKKyNkZWZpbmUgX19IQUxfUkNDX0ZMQVNIX1JFTEVBU0VfUkVTRVQoKSBcCisgIENMRUFSX0JJVChSQ0MtPkFIQjFSU1RSLCBSQ0NfQUhCMVJTVFJfRkxBU0hSU1QpCisKKyNkZWZpbmUgX19IQUxfUkNDX0NSQ19SRUxFQVNFX1JFU0VUKCkgXAorICBDTEVBUl9CSVQoUkNDLT5BSEIxUlNUUiwgUkNDX0FIQjFSU1RSX0NSQ1JTVCkKKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0FIQjJfRm9yY2VfUmVsZWFzZV9SZXNldCBBSEIyIFBlcmlwaGVyYWwgRm9yY2UgUmVsZWFzZSBSZXNldAorICogQGJyaWVmICBGb3JjZSBvciByZWxlYXNlIEFIQjIgcGVyaXBoZXJhbCByZXNldC4KKyAqIEB7CisgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0FIQjJfRk9SQ0VfUkVTRVQoKSBXUklURV9SRUcoUkNDLT5BSEIyUlNUUiwgMHhGRkZGRkZGRlUpCisKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9BX0ZPUkNFX1JFU0VUKCkgXAorICBTRVRfQklUKFJDQy0+QUhCMlJTVFIsIFJDQ19BSEIyUlNUUl9HUElPQVJTVCkKKworI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0JfRk9SQ0VfUkVTRVQoKSBcCisgIFNFVF9CSVQoUkNDLT5BSEIyUlNUUiwgUkNDX0FIQjJSU1RSX0dQSU9CUlNUKQorCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPQ19GT1JDRV9SRVNFVCgpIFwKKyAgU0VUX0JJVChSQ0MtPkFIQjJSU1RSLCBSQ0NfQUhCMlJTVFJfR1BJT0NSU1QpCisKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9EX0ZPUkNFX1JFU0VUKCkgXAorICBTRVRfQklUKFJDQy0+QUhCMlJTVFIsIFJDQ19BSEIyUlNUUl9HUElPRFJTVCkKKworI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0VfRk9SQ0VfUkVTRVQoKSBcCisgIFNFVF9CSVQoUkNDLT5BSEIyUlNUUiwgUkNDX0FIQjJSU1RSX0dQSU9FUlNUKQorCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPRl9GT1JDRV9SRVNFVCgpIFwKKyAgU0VUX0JJVChSQ0MtPkFIQjJSU1RSLCBSQ0NfQUhCMlJTVFJfR1BJT0ZSU1QpCisKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9HX0ZPUkNFX1JFU0VUKCkgXAorICBTRVRfQklUKFJDQy0+QUhCMlJTVFIsIFJDQ19BSEIyUlNUUl9HUElPR1JTVCkKKworI2RlZmluZSBfX0hBTF9SQ0NfQURDMTJfRk9SQ0VfUkVTRVQoKSBcCisgIFNFVF9CSVQoUkNDLT5BSEIyUlNUUiwgUkNDX0FIQjJSU1RSX0FEQzEyUlNUKQorCisjaWYgZGVmaW5lZChBREMzNDVfQ09NTU9OKQorI2RlZmluZSBfX0hBTF9SQ0NfQURDMzQ1X0ZPUkNFX1JFU0VUKCkgXAorICBTRVRfQklUKFJDQy0+QUhCMlJTVFIsIFJDQ19BSEIyUlNUUl9BREMzNDVSU1QpCisjZW5kaWYgLyogQURDMzQ1X0NPTU1PTiAqLworCisjZGVmaW5lIF9fSEFMX1JDQ19EQUMxX0ZPUkNFX1JFU0VUKCkgXAorICBTRVRfQklUKFJDQy0+QUhCMlJTVFIsIFJDQ19BSEIyUlNUUl9EQUMxUlNUKQorCisjaWYgZGVmaW5lZChEQUMyKQorI2RlZmluZSBfX0hBTF9SQ0NfREFDMl9GT1JDRV9SRVNFVCgpIFwKKyAgU0VUX0JJVChSQ0MtPkFIQjJSU1RSLCBSQ0NfQUhCMlJTVFJfREFDMlJTVCkKKyNlbmRpZiAvKiBEQUMyICovCisKKyNkZWZpbmUgX19IQUxfUkNDX0RBQzNfRk9SQ0VfUkVTRVQoKSBcCisgIFNFVF9CSVQoUkNDLT5BSEIyUlNUUiwgUkNDX0FIQjJSU1RSX0RBQzNSU1QpCisKKyNpZiBkZWZpbmVkKERBQzQpCisjZGVmaW5lIF9fSEFMX1JDQ19EQUM0X0ZPUkNFX1JFU0VUKCkgXAorICBTRVRfQklUKFJDQy0+QUhCMlJTVFIsIFJDQ19BSEIyUlNUUl9EQUM0UlNUKQorI2VuZGlmIC8qIERBQzQgKi8KKworI2lmIGRlZmluZWQoQUVTKQorI2RlZmluZSBfX0hBTF9SQ0NfQUVTX0ZPUkNFX1JFU0VUKCkgU0VUX0JJVChSQ0MtPkFIQjJSU1RSLCBSQ0NfQUhCMlJTVFJfQUVTUlNUKQorI2VuZGlmIC8qIEFFUyAqLworCisjZGVmaW5lIF9fSEFMX1JDQ19STkdfRk9SQ0VfUkVTRVQoKSBTRVRfQklUKFJDQy0+QUhCMlJTVFIsIFJDQ19BSEIyUlNUUl9STkdSU1QpCisKKyNkZWZpbmUgX19IQUxfUkNDX0FIQjJfUkVMRUFTRV9SRVNFVCgpIFdSSVRFX1JFRyhSQ0MtPkFIQjJSU1RSLCAweDAwMDAwMDAwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0FfUkVMRUFTRV9SRVNFVCgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QUhCMlJTVFIsIFJDQ19BSEIyUlNUUl9HUElPQVJTVCkKKworI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0JfUkVMRUFTRV9SRVNFVCgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QUhCMlJTVFIsIFJDQ19BSEIyUlNUUl9HUElPQlJTVCkKKworI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0NfUkVMRUFTRV9SRVNFVCgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QUhCMlJTVFIsIFJDQ19BSEIyUlNUUl9HUElPQ1JTVCkKKworI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0RfUkVMRUFTRV9SRVNFVCgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QUhCMlJTVFIsIFJDQ19BSEIyUlNUUl9HUElPRFJTVCkKKworI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0VfUkVMRUFTRV9SRVNFVCgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QUhCMlJTVFIsIFJDQ19BSEIyUlNUUl9HUElPRVJTVCkKKworI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0ZfUkVMRUFTRV9SRVNFVCgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QUhCMlJTVFIsIFJDQ19BSEIyUlNUUl9HUElPRlJTVCkKKworI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0dfUkVMRUFTRV9SRVNFVCgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QUhCMlJTVFIsIFJDQ19BSEIyUlNUUl9HUElPR1JTVCkKKworI2RlZmluZSBfX0hBTF9SQ0NfQURDMTJfUkVMRUFTRV9SRVNFVCgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QUhCMlJTVFIsIFJDQ19BSEIyUlNUUl9BREMxMlJTVCkKKworI2lmIGRlZmluZWQoQURDMzQ1X0NPTU1PTikKKyNkZWZpbmUgX19IQUxfUkNDX0FEQzM0NV9SRUxFQVNFX1JFU0VUKCkgXAorICBDTEVBUl9CSVQoUkNDLT5BSEIyUlNUUiwgUkNDX0FIQjJSU1RSX0FEQzM0NVJTVCkKKyNlbmRpZiAvKiBBREMzNDVfQ09NTU9OICovCisKKyNkZWZpbmUgX19IQUxfUkNDX0RBQzFfUkVMRUFTRV9SRVNFVCgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QUhCMlJTVFIsIFJDQ19BSEIyUlNUUl9EQUMxUlNUKQorCisjaWYgZGVmaW5lZChEQUMyKQorI2RlZmluZSBfX0hBTF9SQ0NfREFDMl9SRUxFQVNFX1JFU0VUKCkgXAorICBDTEVBUl9CSVQoUkNDLT5BSEIyUlNUUiwgUkNDX0FIQjJSU1RSX0RBQzJSU1QpCisjZW5kaWYgLyogREFDMiAqLworCisjZGVmaW5lIF9fSEFMX1JDQ19EQUMzX1JFTEVBU0VfUkVTRVQoKSBcCisgIENMRUFSX0JJVChSQ0MtPkFIQjJSU1RSLCBSQ0NfQUhCMlJTVFJfREFDM1JTVCkKKworI2lmIGRlZmluZWQoREFDNCkKKyNkZWZpbmUgX19IQUxfUkNDX0RBQzRfUkVMRUFTRV9SRVNFVCgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QUhCMlJTVFIsIFJDQ19BSEIyUlNUUl9EQUM0UlNUKQorI2VuZGlmIC8qIERBQzQgKi8KKworI2lmIGRlZmluZWQoQUVTKQorI2RlZmluZSBfX0hBTF9SQ0NfQUVTX1JFTEVBU0VfUkVTRVQoKSBcCisgIENMRUFSX0JJVChSQ0MtPkFIQjJSU1RSLCBSQ0NfQUhCMlJTVFJfQUVTUlNUKQorI2VuZGlmIC8qIEFFUyAqLworCisjZGVmaW5lIF9fSEFMX1JDQ19STkdfUkVMRUFTRV9SRVNFVCgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QUhCMlJTVFIsIFJDQ19BSEIyUlNUUl9STkdSU1QpCisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFJDQ19BSEIzX0ZvcmNlX1JlbGVhc2VfUmVzZXQgQUhCMyBQZXJpcGhlcmFsIEZvcmNlIFJlbGVhc2UgUmVzZXQKKyAqIEBicmllZiAgRm9yY2Ugb3IgcmVsZWFzZSBBSEIzIHBlcmlwaGVyYWwgcmVzZXQuCisgKiBAeworICovCisjZGVmaW5lIF9fSEFMX1JDQ19BSEIzX0ZPUkNFX1JFU0VUKCkgV1JJVEVfUkVHKFJDQy0+QUhCM1JTVFIsIDB4RkZGRkZGRkZVKQorCisjaWYgZGVmaW5lZChGTUNfQkFOSzEpCisjZGVmaW5lIF9fSEFMX1JDQ19GTUNfRk9SQ0VfUkVTRVQoKSBTRVRfQklUKFJDQy0+QUhCM1JTVFIsIFJDQ19BSEIzUlNUUl9GTUNSU1QpCisjZW5kaWYgLyogRk1DX0JBTksxICovCisKKyNpZiBkZWZpbmVkKFFVQURTUEkpCisjZGVmaW5lIF9fSEFMX1JDQ19RU1BJX0ZPUkNFX1JFU0VUKCkgXAorICBTRVRfQklUKFJDQy0+QUhCM1JTVFIsIFJDQ19BSEIzUlNUUl9RU1BJUlNUKQorI2VuZGlmIC8qIFFVQURTUEkgKi8KKworI2RlZmluZSBfX0hBTF9SQ0NfQUhCM19SRUxFQVNFX1JFU0VUKCkgV1JJVEVfUkVHKFJDQy0+QUhCM1JTVFIsIDB4MDAwMDAwMDBVKQorCisjaWYgZGVmaW5lZChGTUNfQkFOSzEpCisjZGVmaW5lIF9fSEFMX1JDQ19GTUNfUkVMRUFTRV9SRVNFVCgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QUhCM1JTVFIsIFJDQ19BSEIzUlNUUl9GTUNSU1QpCisjZW5kaWYgLyogRk1DX0JBTksxICovCisKKyNpZiBkZWZpbmVkKFFVQURTUEkpCisjZGVmaW5lIF9fSEFMX1JDQ19RU1BJX1JFTEVBU0VfUkVTRVQoKSBcCisgIENMRUFSX0JJVChSQ0MtPkFIQjNSU1RSLCBSQ0NfQUhCM1JTVFJfUVNQSVJTVCkKKyNlbmRpZiAvKiBRVUFEU1BJICovCisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFJDQ19BUEIxX0ZvcmNlX1JlbGVhc2VfUmVzZXQgQVBCMSBQZXJpcGhlcmFsIEZvcmNlIFJlbGVhc2UgUmVzZXQKKyAqIEBicmllZiAgRm9yY2Ugb3IgcmVsZWFzZSBBUEIxIHBlcmlwaGVyYWwgcmVzZXQuCisgKiBAeworICovCisjZGVmaW5lIF9fSEFMX1JDQ19BUEIxX0ZPUkNFX1JFU0VUKCkgV1JJVEVfUkVHKFJDQy0+QVBCMVJTVFIxLCAweEZGRkZGRkZGVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfVElNMl9GT1JDRV9SRVNFVCgpIFwKKyAgU0VUX0JJVChSQ0MtPkFQQjFSU1RSMSwgUkNDX0FQQjFSU1RSMV9USU0yUlNUKQorCisjZGVmaW5lIF9fSEFMX1JDQ19USU0zX0ZPUkNFX1JFU0VUKCkgXAorICBTRVRfQklUKFJDQy0+QVBCMVJTVFIxLCBSQ0NfQVBCMVJTVFIxX1RJTTNSU1QpCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTRfRk9SQ0VfUkVTRVQoKSBcCisgIFNFVF9CSVQoUkNDLT5BUEIxUlNUUjEsIFJDQ19BUEIxUlNUUjFfVElNNFJTVCkKKworI2lmIGRlZmluZWQoVElNNSkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTVfRk9SQ0VfUkVTRVQoKSBcCisgIFNFVF9CSVQoUkNDLT5BUEIxUlNUUjEsIFJDQ19BUEIxUlNUUjFfVElNNVJTVCkKKyNlbmRpZiAvKiBUSU01ICovCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTZfRk9SQ0VfUkVTRVQoKSBcCisgIFNFVF9CSVQoUkNDLT5BUEIxUlNUUjEsIFJDQ19BUEIxUlNUUjFfVElNNlJTVCkKKworI2RlZmluZSBfX0hBTF9SQ0NfVElNN19GT1JDRV9SRVNFVCgpIFwKKyAgU0VUX0JJVChSQ0MtPkFQQjFSU1RSMSwgUkNDX0FQQjFSU1RSMV9USU03UlNUKQorCisjZGVmaW5lIF9fSEFMX1JDQ19DUlNfRk9SQ0VfUkVTRVQoKSBcCisgIFNFVF9CSVQoUkNDLT5BUEIxUlNUUjEsIFJDQ19BUEIxUlNUUjFfQ1JTUlNUKQorCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkyX0ZPUkNFX1JFU0VUKCkgXAorICBTRVRfQklUKFJDQy0+QVBCMVJTVFIxLCBSQ0NfQVBCMVJTVFIxX1NQSTJSU1QpCisKKyNkZWZpbmUgX19IQUxfUkNDX1NQSTNfRk9SQ0VfUkVTRVQoKSBcCisgIFNFVF9CSVQoUkNDLT5BUEIxUlNUUjEsIFJDQ19BUEIxUlNUUjFfU1BJM1JTVCkKKworI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQyX0ZPUkNFX1JFU0VUKCkgXAorICBTRVRfQklUKFJDQy0+QVBCMVJTVFIxLCBSQ0NfQVBCMVJTVFIxX1VTQVJUMlJTVCkKKworI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQzX0ZPUkNFX1JFU0VUKCkgXAorICBTRVRfQklUKFJDQy0+QVBCMVJTVFIxLCBSQ0NfQVBCMVJTVFIxX1VTQVJUM1JTVCkKKworI2lmIGRlZmluZWQoVUFSVDQpCisjZGVmaW5lIF9fSEFMX1JDQ19VQVJUNF9GT1JDRV9SRVNFVCgpIFwKKyAgU0VUX0JJVChSQ0MtPkFQQjFSU1RSMSwgUkNDX0FQQjFSU1RSMV9VQVJUNFJTVCkKKyNlbmRpZiAvKiBVQVJUNCAqLworCisjaWYgZGVmaW5lZChVQVJUNSkKKyNkZWZpbmUgX19IQUxfUkNDX1VBUlQ1X0ZPUkNFX1JFU0VUKCkgXAorICBTRVRfQklUKFJDQy0+QVBCMVJTVFIxLCBSQ0NfQVBCMVJTVFIxX1VBUlQ1UlNUKQorI2VuZGlmIC8qIFVBUlQ1ICovCisKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzFfRk9SQ0VfUkVTRVQoKSBcCisgIFNFVF9CSVQoUkNDLT5BUEIxUlNUUjEsIFJDQ19BUEIxUlNUUjFfSTJDMVJTVCkKKworI2RlZmluZSBfX0hBTF9SQ0NfSTJDMl9GT1JDRV9SRVNFVCgpIFwKKyAgU0VUX0JJVChSQ0MtPkFQQjFSU1RSMSwgUkNDX0FQQjFSU1RSMV9JMkMyUlNUKQorCisjZGVmaW5lIF9fSEFMX1JDQ19VU0JfRk9SQ0VfUkVTRVQoKSBcCisgIFNFVF9CSVQoUkNDLT5BUEIxUlNUUjEsIFJDQ19BUEIxUlNUUjFfVVNCUlNUKQorCisjaWYgZGVmaW5lZChGRENBTjEpCisjZGVmaW5lIF9fSEFMX1JDQ19GRENBTl9GT1JDRV9SRVNFVCgpIFwKKyAgU0VUX0JJVChSQ0MtPkFQQjFSU1RSMSwgUkNDX0FQQjFSU1RSMV9GRENBTlJTVCkKKyNlbmRpZiAvKiBGRENBTjEgKi8KKworI2RlZmluZSBfX0hBTF9SQ0NfUFdSX0ZPUkNFX1JFU0VUKCkgXAorICBTRVRfQklUKFJDQy0+QVBCMVJTVFIxLCBSQ0NfQVBCMVJTVFIxX1BXUlJTVCkKKworI2RlZmluZSBfX0hBTF9SQ0NfSTJDM19GT1JDRV9SRVNFVCgpIFwKKyAgU0VUX0JJVChSQ0MtPkFQQjFSU1RSMSwgUkNDX0FQQjFSU1RSMV9JMkMzUlNUKQorCisjZGVmaW5lIF9fSEFMX1JDQ19MUFRJTTFfRk9SQ0VfUkVTRVQoKSBcCisgIFNFVF9CSVQoUkNDLT5BUEIxUlNUUjEsIFJDQ19BUEIxUlNUUjFfTFBUSU0xUlNUKQorCisjZGVmaW5lIF9fSEFMX1JDQ19MUFVBUlQxX0ZPUkNFX1JFU0VUKCkgXAorICBTRVRfQklUKFJDQy0+QVBCMVJTVFIyLCBSQ0NfQVBCMVJTVFIyX0xQVUFSVDFSU1QpCisKKyNpZiBkZWZpbmVkKEkyQzQpCisjZGVmaW5lIF9fSEFMX1JDQ19JMkM0X0ZPUkNFX1JFU0VUKCkgXAorICBTRVRfQklUKFJDQy0+QVBCMVJTVFIyLCBSQ0NfQVBCMVJTVFIyX0kyQzRSU1QpCisjZW5kaWYgLyogSTJDNCAqLworCisjZGVmaW5lIF9fSEFMX1JDQ19VQ1BEMV9GT1JDRV9SRVNFVCgpIFwKKyAgU0VUX0JJVChSQ0MtPkFQQjFSU1RSMiwgUkNDX0FQQjFSU1RSMl9VQ1BEMVJTVCkKKworI2RlZmluZSBfX0hBTF9SQ0NfQVBCMV9SRUxFQVNFX1JFU0VUKCkgV1JJVEVfUkVHKFJDQy0+QVBCMVJTVFIxLCAweDAwMDAwMDAwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfVElNMl9SRUxFQVNFX1JFU0VUKCkgXAorICBDTEVBUl9CSVQoUkNDLT5BUEIxUlNUUjEsIFJDQ19BUEIxUlNUUjFfVElNMlJTVCkKKworI2RlZmluZSBfX0hBTF9SQ0NfVElNM19SRUxFQVNFX1JFU0VUKCkgXAorICBDTEVBUl9CSVQoUkNDLT5BUEIxUlNUUjEsIFJDQ19BUEIxUlNUUjFfVElNM1JTVCkKKworI2RlZmluZSBfX0hBTF9SQ0NfVElNNF9SRUxFQVNFX1JFU0VUKCkgXAorICBDTEVBUl9CSVQoUkNDLT5BUEIxUlNUUjEsIFJDQ19BUEIxUlNUUjFfVElNNFJTVCkKKworI2lmIGRlZmluZWQoVElNNSkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTVfUkVMRUFTRV9SRVNFVCgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QVBCMVJTVFIxLCBSQ0NfQVBCMVJTVFIxX1RJTTVSU1QpCisjZW5kaWYgLyogVElNNSAqLworCisjZGVmaW5lIF9fSEFMX1JDQ19USU02X1JFTEVBU0VfUkVTRVQoKSBcCisgIENMRUFSX0JJVChSQ0MtPkFQQjFSU1RSMSwgUkNDX0FQQjFSU1RSMV9USU02UlNUKQorCisjZGVmaW5lIF9fSEFMX1JDQ19USU03X1JFTEVBU0VfUkVTRVQoKSBcCisgIENMRUFSX0JJVChSQ0MtPkFQQjFSU1RSMSwgUkNDX0FQQjFSU1RSMV9USU03UlNUKQorCisjZGVmaW5lIF9fSEFMX1JDQ19DUlNfUkVMRUFTRV9SRVNFVCgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QVBCMVJTVFIxLCBSQ0NfQVBCMVJTVFIxX0NSU1JTVCkKKworI2RlZmluZSBfX0hBTF9SQ0NfU1BJMl9SRUxFQVNFX1JFU0VUKCkgXAorICBDTEVBUl9CSVQoUkNDLT5BUEIxUlNUUjEsIFJDQ19BUEIxUlNUUjFfU1BJMlJTVCkKKworI2RlZmluZSBfX0hBTF9SQ0NfU1BJM19SRUxFQVNFX1JFU0VUKCkgXAorICBDTEVBUl9CSVQoUkNDLT5BUEIxUlNUUjEsIFJDQ19BUEIxUlNUUjFfU1BJM1JTVCkKKworI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQyX1JFTEVBU0VfUkVTRVQoKSBcCisgIENMRUFSX0JJVChSQ0MtPkFQQjFSU1RSMSwgUkNDX0FQQjFSU1RSMV9VU0FSVDJSU1QpCisKKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUM19SRUxFQVNFX1JFU0VUKCkgXAorICBDTEVBUl9CSVQoUkNDLT5BUEIxUlNUUjEsIFJDQ19BUEIxUlNUUjFfVVNBUlQzUlNUKQorCisjaWYgZGVmaW5lZChVQVJUNCkKKyNkZWZpbmUgX19IQUxfUkNDX1VBUlQ0X1JFTEVBU0VfUkVTRVQoKSBcCisgIENMRUFSX0JJVChSQ0MtPkFQQjFSU1RSMSwgUkNDX0FQQjFSU1RSMV9VQVJUNFJTVCkKKyNlbmRpZiAvKiBVQVJUNCAqLworCisjaWYgZGVmaW5lZChVQVJUNSkKKyNkZWZpbmUgX19IQUxfUkNDX1VBUlQ1X1JFTEVBU0VfUkVTRVQoKSBcCisgIENMRUFSX0JJVChSQ0MtPkFQQjFSU1RSMSwgUkNDX0FQQjFSU1RSMV9VQVJUNVJTVCkKKyNlbmRpZiAvKiBVQVJUNSAqLworCisjZGVmaW5lIF9fSEFMX1JDQ19JMkMxX1JFTEVBU0VfUkVTRVQoKSBcCisgIENMRUFSX0JJVChSQ0MtPkFQQjFSU1RSMSwgUkNDX0FQQjFSU1RSMV9JMkMxUlNUKQorCisjZGVmaW5lIF9fSEFMX1JDQ19JMkMyX1JFTEVBU0VfUkVTRVQoKSBcCisgIENMRUFSX0JJVChSQ0MtPkFQQjFSU1RSMSwgUkNDX0FQQjFSU1RSMV9JMkMyUlNUKQorCisjZGVmaW5lIF9fSEFMX1JDQ19VU0JfUkVMRUFTRV9SRVNFVCgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QVBCMVJTVFIxLCBSQ0NfQVBCMVJTVFIxX1VTQlJTVCkKKworI2lmIGRlZmluZWQoRkRDQU4xKQorI2RlZmluZSBfX0hBTF9SQ0NfRkRDQU5fUkVMRUFTRV9SRVNFVCgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QVBCMVJTVFIxLCBSQ0NfQVBCMVJTVFIxX0ZEQ0FOUlNUKQorI2VuZGlmIC8qIEZEQ0FOMSAqLworCisjZGVmaW5lIF9fSEFMX1JDQ19QV1JfUkVMRUFTRV9SRVNFVCgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QVBCMVJTVFIxLCBSQ0NfQVBCMVJTVFIxX1BXUlJTVCkKKworI2RlZmluZSBfX0hBTF9SQ0NfSTJDM19SRUxFQVNFX1JFU0VUKCkgXAorICBDTEVBUl9CSVQoUkNDLT5BUEIxUlNUUjEsIFJDQ19BUEIxUlNUUjFfSTJDM1JTVCkKKworI2RlZmluZSBfX0hBTF9SQ0NfTFBUSU0xX1JFTEVBU0VfUkVTRVQoKSBcCisgIENMRUFSX0JJVChSQ0MtPkFQQjFSU1RSMSwgUkNDX0FQQjFSU1RSMV9MUFRJTTFSU1QpCisKKyNkZWZpbmUgX19IQUxfUkNDX0xQVUFSVDFfUkVMRUFTRV9SRVNFVCgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QVBCMVJTVFIyLCBSQ0NfQVBCMVJTVFIyX0xQVUFSVDFSU1QpCisKKyNpZiBkZWZpbmVkKEkyQzQpCisjZGVmaW5lIF9fSEFMX1JDQ19JMkM0X1JFTEVBU0VfUkVTRVQoKSBcCisgIENMRUFSX0JJVChSQ0MtPkFQQjFSU1RSMiwgUkNDX0FQQjFSU1RSMl9JMkM0UlNUKQorI2VuZGlmIC8qIEkyQzQgKi8KKworI2RlZmluZSBfX0hBTF9SQ0NfVUNQRDFfUkVMRUFTRV9SRVNFVCgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QVBCMVJTVFIyLCBSQ0NfQVBCMVJTVFIyX1VDUEQxUlNUKQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfQVBCMl9Gb3JjZV9SZWxlYXNlX1Jlc2V0IEFQQjIgUGVyaXBoZXJhbCBGb3JjZSBSZWxlYXNlIFJlc2V0CisgKiBAYnJpZWYgIEZvcmNlIG9yIHJlbGVhc2UgQVBCMiBwZXJpcGhlcmFsIHJlc2V0LgorICogQHsKKyAqLworI2RlZmluZSBfX0hBTF9SQ0NfQVBCMl9GT1JDRV9SRVNFVCgpIFdSSVRFX1JFRyhSQ0MtPkFQQjJSU1RSLCAweEZGRkZGRkZGVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfU1lTQ0ZHX0ZPUkNFX1JFU0VUKCkgXAorICBTRVRfQklUKFJDQy0+QVBCMlJTVFIsIFJDQ19BUEIyUlNUUl9TWVNDRkdSU1QpCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTFfRk9SQ0VfUkVTRVQoKSBcCisgIFNFVF9CSVQoUkNDLT5BUEIyUlNUUiwgUkNDX0FQQjJSU1RSX1RJTTFSU1QpCisKKyNkZWZpbmUgX19IQUxfUkNDX1NQSTFfRk9SQ0VfUkVTRVQoKSBcCisgIFNFVF9CSVQoUkNDLT5BUEIyUlNUUiwgUkNDX0FQQjJSU1RSX1NQSTFSU1QpCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTThfRk9SQ0VfUkVTRVQoKSBcCisgIFNFVF9CSVQoUkNDLT5BUEIyUlNUUiwgUkNDX0FQQjJSU1RSX1RJTThSU1QpCisKKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUMV9GT1JDRV9SRVNFVCgpIFwKKyAgU0VUX0JJVChSQ0MtPkFQQjJSU1RSLCBSQ0NfQVBCMlJTVFJfVVNBUlQxUlNUKQorCisjaWYgZGVmaW5lZChTUEk0KQorI2RlZmluZSBfX0hBTF9SQ0NfU1BJNF9GT1JDRV9SRVNFVCgpIFwKKyAgU0VUX0JJVChSQ0MtPkFQQjJSU1RSLCBSQ0NfQVBCMlJTVFJfU1BJNFJTVCkKKyNlbmRpZiAvKiBTUEk0ICovCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTE1X0ZPUkNFX1JFU0VUKCkgXAorICBTRVRfQklUKFJDQy0+QVBCMlJTVFIsIFJDQ19BUEIyUlNUUl9USU0xNVJTVCkKKworI2RlZmluZSBfX0hBTF9SQ0NfVElNMTZfRk9SQ0VfUkVTRVQoKSBcCisgIFNFVF9CSVQoUkNDLT5BUEIyUlNUUiwgUkNDX0FQQjJSU1RSX1RJTTE2UlNUKQorCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xN19GT1JDRV9SRVNFVCgpIFwKKyAgU0VUX0JJVChSQ0MtPkFQQjJSU1RSLCBSQ0NfQVBCMlJTVFJfVElNMTdSU1QpCisKKyNpZiBkZWZpbmVkKFRJTTIwKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMjBfRk9SQ0VfUkVTRVQoKSBcCisgIFNFVF9CSVQoUkNDLT5BUEIyUlNUUiwgUkNDX0FQQjJSU1RSX1RJTTIwUlNUKQorI2VuZGlmIC8qIFRJTTIwICovCisKKyNkZWZpbmUgX19IQUxfUkNDX1NBSTFfRk9SQ0VfUkVTRVQoKSBcCisgIFNFVF9CSVQoUkNDLT5BUEIyUlNUUiwgUkNDX0FQQjJSU1RSX1NBSTFSU1QpCisKKyNpZiBkZWZpbmVkKEhSVElNMSkKKyNkZWZpbmUgX19IQUxfUkNDX0hSVElNMV9GT1JDRV9SRVNFVCgpIFwKKyAgU0VUX0JJVChSQ0MtPkFQQjJSU1RSLCBSQ0NfQVBCMlJTVFJfSFJUSU0xUlNUKQorI2VuZGlmIC8qIEhSVElNMSAqLworCisjZGVmaW5lIF9fSEFMX1JDQ19BUEIyX1JFTEVBU0VfUkVTRVQoKSBXUklURV9SRUcoUkNDLT5BUEIyUlNUUiwgMHgwMDAwMDAwMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX1NZU0NGR19SRUxFQVNFX1JFU0VUKCkgXAorICBDTEVBUl9CSVQoUkNDLT5BUEIyUlNUUiwgUkNDX0FQQjJSU1RSX1NZU0NGR1JTVCkKKworI2RlZmluZSBfX0hBTF9SQ0NfVElNMV9SRUxFQVNFX1JFU0VUKCkgXAorICBDTEVBUl9CSVQoUkNDLT5BUEIyUlNUUiwgUkNDX0FQQjJSU1RSX1RJTTFSU1QpCisKKyNkZWZpbmUgX19IQUxfUkNDX1NQSTFfUkVMRUFTRV9SRVNFVCgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QVBCMlJTVFIsIFJDQ19BUEIyUlNUUl9TUEkxUlNUKQorCisjZGVmaW5lIF9fSEFMX1JDQ19USU04X1JFTEVBU0VfUkVTRVQoKSBcCisgIENMRUFSX0JJVChSQ0MtPkFQQjJSU1RSLCBSQ0NfQVBCMlJTVFJfVElNOFJTVCkKKworI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQxX1JFTEVBU0VfUkVTRVQoKSBcCisgIENMRUFSX0JJVChSQ0MtPkFQQjJSU1RSLCBSQ0NfQVBCMlJTVFJfVVNBUlQxUlNUKQorCisjaWYgZGVmaW5lZChTUEk0KQorI2RlZmluZSBfX0hBTF9SQ0NfU1BJNF9SRUxFQVNFX1JFU0VUKCkgXAorICBDTEVBUl9CSVQoUkNDLT5BUEIyUlNUUiwgUkNDX0FQQjJSU1RSX1NQSTRSU1QpCisjZW5kaWYgLyogU1BJNCAqLworCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xNV9SRUxFQVNFX1JFU0VUKCkgXAorICBDTEVBUl9CSVQoUkNDLT5BUEIyUlNUUiwgUkNDX0FQQjJSU1RSX1RJTTE1UlNUKQorCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xNl9SRUxFQVNFX1JFU0VUKCkgXAorICBDTEVBUl9CSVQoUkNDLT5BUEIyUlNUUiwgUkNDX0FQQjJSU1RSX1RJTTE2UlNUKQorCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xN19SRUxFQVNFX1JFU0VUKCkgXAorICBDTEVBUl9CSVQoUkNDLT5BUEIyUlNUUiwgUkNDX0FQQjJSU1RSX1RJTTE3UlNUKQorCisjaWYgZGVmaW5lZChUSU0yMCkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTIwX1JFTEVBU0VfUkVTRVQoKSBcCisgIENMRUFSX0JJVChSQ0MtPkFQQjJSU1RSLCBSQ0NfQVBCMlJTVFJfVElNMjBSU1QpCisjZW5kaWYgLyogVElNMjAgKi8KKworI2RlZmluZSBfX0hBTF9SQ0NfU0FJMV9SRUxFQVNFX1JFU0VUKCkgXAorICBDTEVBUl9CSVQoUkNDLT5BUEIyUlNUUiwgUkNDX0FQQjJSU1RSX1NBSTFSU1QpCisKKyNpZiBkZWZpbmVkKEhSVElNMSkKKyNkZWZpbmUgX19IQUxfUkNDX0hSVElNMV9SRUxFQVNFX1JFU0VUKCkgXAorICBDTEVBUl9CSVQoUkNDLT5BUEIyUlNUUiwgUkNDX0FQQjJSU1RSX0hSVElNMVJTVCkKKyNlbmRpZiAvKiBIUlRJTTEgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0FIQjFfQ2xvY2tfU2xlZXBfRW5hYmxlX0Rpc2FibGUgQUhCMSBQZXJpcGhlcmFsIENsb2NrIFNsZWVwCisgKiBFbmFibGUgRGlzYWJsZQorICogQGJyaWVmICBFbmFibGUgb3IgZGlzYWJsZSB0aGUgQUhCMSBwZXJpcGhlcmFsIGNsb2NrIGR1cmluZyBMb3cgUG93ZXIgKFNsZWVwKQorICogbW9kZS4KKyAqIEBub3RlICAgUGVyaXBoZXJhbCBjbG9jayBnYXRpbmcgaW4gU0xFRVAgbW9kZSBjYW4gYmUgdXNlZCB0byBmdXJ0aGVyIHJlZHVjZQorICogICAgICAgICBwb3dlciBjb25zdW1wdGlvbi4KKyAqIEBub3RlICAgQWZ0ZXIgd2FrZXVwIGZyb20gU0xFRVAgbW9kZSwgdGhlIHBlcmlwaGVyYWwgY2xvY2sgaXMgZW5hYmxlZCBhZ2Fpbi4KKyAqIEBub3RlICAgQnkgZGVmYXVsdCwgYWxsIHBlcmlwaGVyYWwgY2xvY2tzIGFyZSBlbmFibGVkIGR1cmluZyBTTEVFUCBtb2RlLgorICogQHsKKyAqLworCisjZGVmaW5lIF9fSEFMX1JDQ19ETUExX0NMS19TTEVFUF9FTkFCTEUoKSBcCisgIFNFVF9CSVQoUkNDLT5BSEIxU01FTlIsIFJDQ19BSEIxU01FTlJfRE1BMVNNRU4pCisKKyNkZWZpbmUgX19IQUxfUkNDX0RNQTJfQ0xLX1NMRUVQX0VOQUJMRSgpIFwKKyAgU0VUX0JJVChSQ0MtPkFIQjFTTUVOUiwgUkNDX0FIQjFTTUVOUl9ETUEyU01FTikKKworI2RlZmluZSBfX0hBTF9SQ0NfRE1BTVVYMV9DTEtfU0xFRVBfRU5BQkxFKCkgXAorICBTRVRfQklUKFJDQy0+QUhCMVNNRU5SLCBSQ0NfQUhCMVNNRU5SX0RNQU1VWDFTTUVOKQorCisjZGVmaW5lIF9fSEFMX1JDQ19DT1JESUNfQ0xLX1NMRUVQX0VOQUJMRSgpIFwKKyAgU0VUX0JJVChSQ0MtPkFIQjFTTUVOUiwgUkNDX0FIQjFTTUVOUl9DT1JESUNTTUVOKQorCisjZGVmaW5lIF9fSEFMX1JDQ19GTUFDX0NMS19TTEVFUF9FTkFCTEUoKSBcCisgIFNFVF9CSVQoUkNDLT5BSEIxU01FTlIsIFJDQ19BSEIxU01FTlJfRk1BQ1NNRU4pCisKKyNkZWZpbmUgX19IQUxfUkNDX0ZMQVNIX0NMS19TTEVFUF9FTkFCTEUoKSBcCisgIFNFVF9CSVQoUkNDLT5BSEIxU01FTlIsIFJDQ19BSEIxU01FTlJfRkxBU0hTTUVOKQorCisjZGVmaW5lIF9fSEFMX1JDQ19TUkFNMV9DTEtfU0xFRVBfRU5BQkxFKCkgXAorICBTRVRfQklUKFJDQy0+QUhCMVNNRU5SLCBSQ0NfQUhCMVNNRU5SX1NSQU0xU01FTikKKworI2RlZmluZSBfX0hBTF9SQ0NfQ1JDX0NMS19TTEVFUF9FTkFCTEUoKSBcCisgIFNFVF9CSVQoUkNDLT5BSEIxU01FTlIsIFJDQ19BSEIxU01FTlJfQ1JDU01FTikKKworI2RlZmluZSBfX0hBTF9SQ0NfRE1BMV9DTEtfU0xFRVBfRElTQUJMRSgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QUhCMVNNRU5SLCBSQ0NfQUhCMVNNRU5SX0RNQTFTTUVOKQorCisjZGVmaW5lIF9fSEFMX1JDQ19ETUEyX0NMS19TTEVFUF9ESVNBQkxFKCkgXAorICBDTEVBUl9CSVQoUkNDLT5BSEIxU01FTlIsIFJDQ19BSEIxU01FTlJfRE1BMlNNRU4pCisKKyNkZWZpbmUgX19IQUxfUkNDX0RNQU1VWDFfQ0xLX1NMRUVQX0RJU0FCTEUoKSBcCisgIENMRUFSX0JJVChSQ0MtPkFIQjFTTUVOUiwgUkNDX0FIQjFTTUVOUl9ETUFNVVgxU01FTikKKworI2RlZmluZSBfX0hBTF9SQ0NfQ09SRElDX0NMS19TTEVFUF9ESVNBQkxFKCkgXAorICBDTEVBUl9CSVQoUkNDLT5BSEIxU01FTlIsIFJDQ19BSEIxU01FTlJfQ09SRElDU01FTikKKworI2RlZmluZSBfX0hBTF9SQ0NfRk1BQ19DTEtfU0xFRVBfRElTQUJMRSgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QUhCMVNNRU5SLCBSQ0NfQUhCMVNNRU5SX0ZNQUNTTUVOKQorCisjZGVmaW5lIF9fSEFMX1JDQ19GTEFTSF9DTEtfU0xFRVBfRElTQUJMRSgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QUhCMVNNRU5SLCBSQ0NfQUhCMVNNRU5SX0ZMQVNIU01FTikKKworI2RlZmluZSBfX0hBTF9SQ0NfU1JBTTFfQ0xLX1NMRUVQX0RJU0FCTEUoKSBcCisgIENMRUFSX0JJVChSQ0MtPkFIQjFTTUVOUiwgUkNDX0FIQjFTTUVOUl9TUkFNMVNNRU4pCisKKyNkZWZpbmUgX19IQUxfUkNDX0NSQ19DTEtfU0xFRVBfRElTQUJMRSgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QUhCMVNNRU5SLCBSQ0NfQUhCMVNNRU5SX0NSQ1NNRU4pCisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFJDQ19BSEIyX0Nsb2NrX1NsZWVwX0VuYWJsZV9EaXNhYmxlIEFIQjIgUGVyaXBoZXJhbCBDbG9jayBTbGVlcAorICogRW5hYmxlIERpc2FibGUKKyAqIEBicmllZiAgRW5hYmxlIG9yIGRpc2FibGUgdGhlIEFIQjIgcGVyaXBoZXJhbCBjbG9jayBkdXJpbmcgTG93IFBvd2VyIChTbGVlcCkKKyAqIG1vZGUuCisgKiBAbm90ZSAgIFBlcmlwaGVyYWwgY2xvY2sgZ2F0aW5nIGluIFNMRUVQIG1vZGUgY2FuIGJlIHVzZWQgdG8gZnVydGhlciByZWR1Y2UKKyAqICAgICAgICAgcG93ZXIgY29uc3VtcHRpb24uCisgKiBAbm90ZSAgIEFmdGVyIHdha2V1cCBmcm9tIFNMRUVQIG1vZGUsIHRoZSBwZXJpcGhlcmFsIGNsb2NrIGlzIGVuYWJsZWQgYWdhaW4uCisgKiBAbm90ZSAgIEJ5IGRlZmF1bHQsIGFsbCBwZXJpcGhlcmFsIGNsb2NrcyBhcmUgZW5hYmxlZCBkdXJpbmcgU0xFRVAgbW9kZS4KKyAqIEB7CisgKi8KKworI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0FfQ0xLX1NMRUVQX0VOQUJMRSgpIFwKKyAgU0VUX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9HUElPQVNNRU4pCisKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9CX0NMS19TTEVFUF9FTkFCTEUoKSBcCisgIFNFVF9CSVQoUkNDLT5BSEIyU01FTlIsIFJDQ19BSEIyU01FTlJfR1BJT0JTTUVOKQorCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPQ19DTEtfU0xFRVBfRU5BQkxFKCkgXAorICBTRVRfQklUKFJDQy0+QUhCMlNNRU5SLCBSQ0NfQUhCMlNNRU5SX0dQSU9DU01FTikKKworI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0RfQ0xLX1NMRUVQX0VOQUJMRSgpIFwKKyAgU0VUX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9HUElPRFNNRU4pCisKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9FX0NMS19TTEVFUF9FTkFCTEUoKSBcCisgIFNFVF9CSVQoUkNDLT5BSEIyU01FTlIsIFJDQ19BSEIyU01FTlJfR1BJT0VTTUVOKQorCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPRl9DTEtfU0xFRVBfRU5BQkxFKCkgXAorICBTRVRfQklUKFJDQy0+QUhCMlNNRU5SLCBSQ0NfQUhCMlNNRU5SX0dQSU9GU01FTikKKworI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0dfQ0xLX1NMRUVQX0VOQUJMRSgpIFwKKyAgU0VUX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9HUElPR1NNRU4pCisKKyNkZWZpbmUgX19IQUxfUkNDX1NSQU0yX0NMS19TTEVFUF9FTkFCTEUoKSBcCisgIFNFVF9CSVQoUkNDLT5BSEIyU01FTlIsIFJDQ19BSEIyU01FTlJfU1JBTTJTTUVOKQorCisjZGVmaW5lIF9fSEFMX1JDQ19DQ01fQ0xLX1NMRUVQX0VOQUJMRSgpIFwKKyAgU0VUX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9DQ01TUkFNU01FTikKKworI2RlZmluZSBfX0hBTF9SQ0NfQURDMTJfQ0xLX1NMRUVQX0VOQUJMRSgpIFwKKyAgU0VUX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9BREMxMlNNRU4pCisKKyNpZiBkZWZpbmVkKEFEQzM0NV9DT01NT04pCisjZGVmaW5lIF9fSEFMX1JDQ19BREMzNDVfQ0xLX1NMRUVQX0VOQUJMRSgpIFwKKyAgU0VUX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9BREMzNDVTTUVOKQorI2VuZGlmIC8qIEFEQzM0NV9DT01NT04gKi8KKworI2RlZmluZSBfX0hBTF9SQ0NfREFDMV9DTEtfU0xFRVBfRU5BQkxFKCkgXAorICBTRVRfQklUKFJDQy0+QUhCMlNNRU5SLCBSQ0NfQUhCMlNNRU5SX0RBQzFTTUVOKQorCisjaWYgZGVmaW5lZChEQUMyKQorI2RlZmluZSBfX0hBTF9SQ0NfREFDMl9DTEtfU0xFRVBfRU5BQkxFKCkgXAorICBTRVRfQklUKFJDQy0+QUhCMlNNRU5SLCBSQ0NfQUhCMlNNRU5SX0RBQzJTTUVOKQorI2VuZGlmIC8qIERBQzIgKi8KKworI2RlZmluZSBfX0hBTF9SQ0NfREFDM19DTEtfU0xFRVBfRU5BQkxFKCkgXAorICBTRVRfQklUKFJDQy0+QUhCMlNNRU5SLCBSQ0NfQUhCMlNNRU5SX0RBQzNTTUVOKQorCisjaWYgZGVmaW5lZChEQUM0KQorI2RlZmluZSBfX0hBTF9SQ0NfREFDNF9DTEtfU0xFRVBfRU5BQkxFKCkgXAorICBTRVRfQklUKFJDQy0+QUhCMlNNRU5SLCBSQ0NfQUhCMlNNRU5SX0RBQzRTTUVOKQorI2VuZGlmIC8qIERBQzQgKi8KKworI2lmIGRlZmluZWQoQUVTKQorI2RlZmluZSBfX0hBTF9SQ0NfQUVTX0NMS19TTEVFUF9FTkFCTEUoKSBcCisgIFNFVF9CSVQoUkNDLT5BSEIyU01FTlIsIFJDQ19BSEIyU01FTlJfQUVTU01FTikKKyNlbmRpZiAvKiBBRVMgKi8KKworI2RlZmluZSBfX0hBTF9SQ0NfUk5HX0NMS19TTEVFUF9FTkFCTEUoKSBcCisgIFNFVF9CSVQoUkNDLT5BSEIyU01FTlIsIFJDQ19BSEIyU01FTlJfUk5HU01FTikKKworI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0FfQ0xLX1NMRUVQX0RJU0FCTEUoKSBcCisgIENMRUFSX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9HUElPQVNNRU4pCisKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9CX0NMS19TTEVFUF9ESVNBQkxFKCkgXAorICBDTEVBUl9CSVQoUkNDLT5BSEIyU01FTlIsIFJDQ19BSEIyU01FTlJfR1BJT0JTTUVOKQorCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPQ19DTEtfU0xFRVBfRElTQUJMRSgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QUhCMlNNRU5SLCBSQ0NfQUhCMlNNRU5SX0dQSU9DU01FTikKKworI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0RfQ0xLX1NMRUVQX0RJU0FCTEUoKSBcCisgIENMRUFSX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9HUElPRFNNRU4pCisKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9FX0NMS19TTEVFUF9ESVNBQkxFKCkgXAorICBDTEVBUl9CSVQoUkNDLT5BSEIyU01FTlIsIFJDQ19BSEIyU01FTlJfR1BJT0VTTUVOKQorCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPRl9DTEtfU0xFRVBfRElTQUJMRSgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QUhCMlNNRU5SLCBSQ0NfQUhCMlNNRU5SX0dQSU9GU01FTikKKworI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0dfQ0xLX1NMRUVQX0RJU0FCTEUoKSBcCisgIENMRUFSX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9HUElPR1NNRU4pCisKKyNkZWZpbmUgX19IQUxfUkNDX1NSQU0yX0NMS19TTEVFUF9ESVNBQkxFKCkgXAorICBDTEVBUl9CSVQoUkNDLT5BSEIyU01FTlIsIFJDQ19BSEIyU01FTlJfU1JBTTJTTUVOKQorCisjZGVmaW5lIF9fSEFMX1JDQ19DQ01fQ0xLX1NMRUVQX0RJU0FCTEUoKSBcCisgIENMRUFSX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9DQ01TUkFNU01FTikKKworI2RlZmluZSBfX0hBTF9SQ0NfQURDMTJfQ0xLX1NMRUVQX0RJU0FCTEUoKSBcCisgIENMRUFSX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9BREMxMlNNRU4pCisKKyNpZiBkZWZpbmVkKEFEQzM0NV9DT01NT04pCisjZGVmaW5lIF9fSEFMX1JDQ19BREMzNDVfQ0xLX1NMRUVQX0RJU0FCTEUoKSBcCisgIENMRUFSX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9BREMzNDVTTUVOKQorI2VuZGlmIC8qIEFEQzM0NV9DT01NT04gKi8KKworI2RlZmluZSBfX0hBTF9SQ0NfREFDMV9DTEtfU0xFRVBfRElTQUJMRSgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QUhCMlNNRU5SLCBSQ0NfQUhCMlNNRU5SX0RBQzFTTUVOKQorCisjaWYgZGVmaW5lZChEQUMyKQorI2RlZmluZSBfX0hBTF9SQ0NfREFDMl9DTEtfU0xFRVBfRElTQUJMRSgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QUhCMlNNRU5SLCBSQ0NfQUhCMlNNRU5SX0RBQzJTTUVOKQorI2VuZGlmIC8qIERBQzIgKi8KKworI2RlZmluZSBfX0hBTF9SQ0NfREFDM19DTEtfU0xFRVBfRElTQUJMRSgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QUhCMlNNRU5SLCBSQ0NfQUhCMlNNRU5SX0RBQzNTTUVOKQorCisjaWYgZGVmaW5lZChEQUM0KQorI2RlZmluZSBfX0hBTF9SQ0NfREFDNF9DTEtfU0xFRVBfRElTQUJMRSgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QUhCMlNNRU5SLCBSQ0NfQUhCMlNNRU5SX0RBQzRTTUVOKQorI2VuZGlmIC8qIERBQzQgKi8KKworI2lmIGRlZmluZWQoQUVTKQorI2RlZmluZSBfX0hBTF9SQ0NfQUVTX0NMS19TTEVFUF9ESVNBQkxFKCkgXAorICBDTEVBUl9CSVQoUkNDLT5BSEIyU01FTlIsIFJDQ19BSEIyU01FTlJfQUVTU01FTikKKyNlbmRpZiAvKiBBRVMgKi8KKworI2RlZmluZSBfX0hBTF9SQ0NfUk5HX0NMS19TTEVFUF9ESVNBQkxFKCkgXAorICBDTEVBUl9CSVQoUkNDLT5BSEIyU01FTlIsIFJDQ19BSEIyU01FTlJfUk5HU01FTikKKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0FIQjNfQ2xvY2tfU2xlZXBfRW5hYmxlX0Rpc2FibGUgQUhCMyBQZXJpcGhlcmFsIENsb2NrIFNsZWVwCisgKiBFbmFibGUgRGlzYWJsZQorICogQGJyaWVmICBFbmFibGUgb3IgZGlzYWJsZSB0aGUgQUhCMyBwZXJpcGhlcmFsIGNsb2NrIGR1cmluZyBMb3cgUG93ZXIgKFNsZWVwKQorICogbW9kZS4KKyAqIEBub3RlICAgUGVyaXBoZXJhbCBjbG9jayBnYXRpbmcgaW4gU0xFRVAgbW9kZSBjYW4gYmUgdXNlZCB0byBmdXJ0aGVyIHJlZHVjZQorICogICAgICAgICBwb3dlciBjb25zdW1wdGlvbi4KKyAqIEBub3RlICAgQWZ0ZXIgd2FrZXVwIGZyb20gU0xFRVAgbW9kZSwgdGhlIHBlcmlwaGVyYWwgY2xvY2sgaXMgZW5hYmxlZCBhZ2Fpbi4KKyAqIEBub3RlICAgQnkgZGVmYXVsdCwgYWxsIHBlcmlwaGVyYWwgY2xvY2tzIGFyZSBlbmFibGVkIGR1cmluZyBTTEVFUCBtb2RlLgorICogQHsKKyAqLworCisjaWYgZGVmaW5lZChGTUNfQkFOSzEpCisjZGVmaW5lIF9fSEFMX1JDQ19GTUNfQ0xLX1NMRUVQX0VOQUJMRSgpIFwKKyAgU0VUX0JJVChSQ0MtPkFIQjNTTUVOUiwgUkNDX0FIQjNTTUVOUl9GTUNTTUVOKQorI2VuZGlmIC8qIEZNQ19CQU5LMSAqLworCisjaWYgZGVmaW5lZChRVUFEU1BJKQorI2RlZmluZSBfX0hBTF9SQ0NfUVNQSV9DTEtfU0xFRVBfRU5BQkxFKCkgXAorICBTRVRfQklUKFJDQy0+QUhCM1NNRU5SLCBSQ0NfQUhCM1NNRU5SX1FTUElTTUVOKQorI2VuZGlmIC8qIFFVQURTUEkgKi8KKworI2lmIGRlZmluZWQoRk1DX0JBTksxKQorI2RlZmluZSBfX0hBTF9SQ0NfRk1DX0NMS19TTEVFUF9ESVNBQkxFKCkgXAorICBDTEVBUl9CSVQoUkNDLT5BSEIzU01FTlIsIFJDQ19BSEIzU01FTlJfRk1DU01FTikKKyNlbmRpZiAvKiBGTUNfQkFOSzEgKi8KKworI2lmIGRlZmluZWQoUVVBRFNQSSkKKyNkZWZpbmUgX19IQUxfUkNDX1FTUElfQ0xLX1NMRUVQX0RJU0FCTEUoKSBcCisgIENMRUFSX0JJVChSQ0MtPkFIQjNTTUVOUiwgUkNDX0FIQjNTTUVOUl9RU1BJU01FTikKKyNlbmRpZiAvKiBRVUFEU1BJICovCisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFJDQ19BUEIxX0Nsb2NrX1NsZWVwX0VuYWJsZV9EaXNhYmxlIEFQQjEgUGVyaXBoZXJhbCBDbG9jayBTbGVlcAorICogRW5hYmxlIERpc2FibGUKKyAqIEBicmllZiAgRW5hYmxlIG9yIGRpc2FibGUgdGhlIEFQQjEgcGVyaXBoZXJhbCBjbG9jayBkdXJpbmcgTG93IFBvd2VyIChTbGVlcCkKKyAqIG1vZGUuCisgKiBAbm90ZSAgIFBlcmlwaGVyYWwgY2xvY2sgZ2F0aW5nIGluIFNMRUVQIG1vZGUgY2FuIGJlIHVzZWQgdG8gZnVydGhlciByZWR1Y2UKKyAqICAgICAgICAgcG93ZXIgY29uc3VtcHRpb24uCisgKiBAbm90ZSAgIEFmdGVyIHdha2V1cCBmcm9tIFNMRUVQIG1vZGUsIHRoZSBwZXJpcGhlcmFsIGNsb2NrIGlzIGVuYWJsZWQgYWdhaW4uCisgKiBAbm90ZSAgIEJ5IGRlZmF1bHQsIGFsbCBwZXJpcGhlcmFsIGNsb2NrcyBhcmUgZW5hYmxlZCBkdXJpbmcgU0xFRVAgbW9kZS4KKyAqIEB7CisgKi8KKworI2RlZmluZSBfX0hBTF9SQ0NfVElNMl9DTEtfU0xFRVBfRU5BQkxFKCkgXAorICBTRVRfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfVElNMlNNRU4pCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTNfQ0xLX1NMRUVQX0VOQUJMRSgpIFwKKyAgU0VUX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX1RJTTNTTUVOKQorCisjZGVmaW5lIF9fSEFMX1JDQ19USU00X0NMS19TTEVFUF9FTkFCTEUoKSBcCisgIFNFVF9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9USU00U01FTikKKworI2lmIGRlZmluZWQoVElNNSkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTVfQ0xLX1NMRUVQX0VOQUJMRSgpIFwKKyAgU0VUX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX1RJTTVTTUVOKQorI2VuZGlmIC8qIFRJTTUgKi8KKworI2RlZmluZSBfX0hBTF9SQ0NfVElNNl9DTEtfU0xFRVBfRU5BQkxFKCkgXAorICBTRVRfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfVElNNlNNRU4pCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTdfQ0xLX1NMRUVQX0VOQUJMRSgpIFwKKyAgU0VUX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX1RJTTdTTUVOKQorCisjZGVmaW5lIF9fSEFMX1JDQ19DUlNfQ0xLX1NMRUVQX0VOQUJMRSgpIFwKKyAgU0VUX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX0NSU1NNRU4pCisKKyNkZWZpbmUgX19IQUxfUkNDX1JUQ0FQQl9DTEtfU0xFRVBfRU5BQkxFKCkgXAorICBTRVRfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfUlRDQVBCU01FTikKKworI2RlZmluZSBfX0hBTF9SQ0NfV1dER19DTEtfU0xFRVBfRU5BQkxFKCkgXAorICBTRVRfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfV1dER1NNRU4pCisKKyNkZWZpbmUgX19IQUxfUkNDX1NQSTJfQ0xLX1NMRUVQX0VOQUJMRSgpIFwKKyAgU0VUX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX1NQSTJTTUVOKQorCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkzX0NMS19TTEVFUF9FTkFCTEUoKSBcCisgIFNFVF9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9TUEkzU01FTikKKworI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQyX0NMS19TTEVFUF9FTkFCTEUoKSBcCisgIFNFVF9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9VU0FSVDJTTUVOKQorCisjZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDNfQ0xLX1NMRUVQX0VOQUJMRSgpIFwKKyAgU0VUX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX1VTQVJUM1NNRU4pCisKKyNpZiBkZWZpbmVkKFVBUlQ0KQorI2RlZmluZSBfX0hBTF9SQ0NfVUFSVDRfQ0xLX1NMRUVQX0VOQUJMRSgpIFwKKyAgU0VUX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX1VBUlQ0U01FTikKKyNlbmRpZiAvKiBVQVJUNCAqLworCisjaWYgZGVmaW5lZChVQVJUNSkKKyNkZWZpbmUgX19IQUxfUkNDX1VBUlQ1X0NMS19TTEVFUF9FTkFCTEUoKSBcCisgIFNFVF9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9VQVJUNVNNRU4pCisjZW5kaWYgLyogVUFSVDUgKi8KKworI2RlZmluZSBfX0hBTF9SQ0NfSTJDMV9DTEtfU0xFRVBfRU5BQkxFKCkgXAorICBTRVRfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfSTJDMVNNRU4pCisKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzJfQ0xLX1NMRUVQX0VOQUJMRSgpIFwKKyAgU0VUX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX0kyQzJTTUVOKQorCisjaWYgZGVmaW5lZChVU0IpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0JfQ0xLX1NMRUVQX0VOQUJMRSgpIFwKKyAgU0VUX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX1VTQlNNRU4pCisjZW5kaWYgLyogVVNCICovCisKKyNpZiBkZWZpbmVkKEZEQ0FOMSkKKyNkZWZpbmUgX19IQUxfUkNDX0ZEQ0FOX0NMS19TTEVFUF9FTkFCTEUoKSBcCisgIFNFVF9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9GRENBTlNNRU4pCisjZW5kaWYgLyogRkRDQU4xICovCisKKyNkZWZpbmUgX19IQUxfUkNDX1BXUl9DTEtfU0xFRVBfRU5BQkxFKCkgXAorICBTRVRfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfUFdSU01FTikKKworI2RlZmluZSBfX0hBTF9SQ0NfSTJDM19DTEtfU0xFRVBfRU5BQkxFKCkgXAorICBTRVRfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfSTJDM1NNRU4pCisKKyNkZWZpbmUgX19IQUxfUkNDX0xQVElNMV9DTEtfU0xFRVBfRU5BQkxFKCkgXAorICBTRVRfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfTFBUSU0xU01FTikKKworI2RlZmluZSBfX0hBTF9SQ0NfTFBVQVJUMV9DTEtfU0xFRVBfRU5BQkxFKCkgXAorICBTRVRfQklUKFJDQy0+QVBCMVNNRU5SMiwgUkNDX0FQQjFTTUVOUjJfTFBVQVJUMVNNRU4pCisKKyNpZiBkZWZpbmVkKEkyQzQpCisjZGVmaW5lIF9fSEFMX1JDQ19JMkM0X0NMS19TTEVFUF9FTkFCTEUoKSBcCisgIFNFVF9CSVQoUkNDLT5BUEIxU01FTlIyLCBSQ0NfQVBCMVNNRU5SMl9JMkM0U01FTikKKyNlbmRpZiAvKiBJMkM0ICovCisKKyNkZWZpbmUgX19IQUxfUkNDX1VDUEQxX0NMS19TTEVFUF9FTkFCTEUoKSBcCisgIFNFVF9CSVQoUkNDLT5BUEIxU01FTlIyLCBSQ0NfQVBCMVNNRU5SMl9VQ1BEMVNNRU4pCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTJfQ0xLX1NMRUVQX0RJU0FCTEUoKSBcCisgIENMRUFSX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX1RJTTJTTUVOKQorCisjZGVmaW5lIF9fSEFMX1JDQ19USU0zX0NMS19TTEVFUF9ESVNBQkxFKCkgXAorICBDTEVBUl9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9USU0zU01FTikKKworI2RlZmluZSBfX0hBTF9SQ0NfVElNNF9DTEtfU0xFRVBfRElTQUJMRSgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfVElNNFNNRU4pCisKKyNpZiBkZWZpbmVkKFRJTTUpCisjZGVmaW5lIF9fSEFMX1JDQ19USU01X0NMS19TTEVFUF9ESVNBQkxFKCkgXAorICBDTEVBUl9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9USU01U01FTikKKyNlbmRpZiAvKiBUSU01ICovCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTZfQ0xLX1NMRUVQX0RJU0FCTEUoKSBcCisgIENMRUFSX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX1RJTTZTTUVOKQorCisjZGVmaW5lIF9fSEFMX1JDQ19USU03X0NMS19TTEVFUF9ESVNBQkxFKCkgXAorICBDTEVBUl9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9USU03U01FTikKKworI2RlZmluZSBfX0hBTF9SQ0NfQ1JTX0NMS19TTEVFUF9ESVNBQkxFKCkgXAorICBDTEVBUl9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9DUlNTTUVOKQorCisjZGVmaW5lIF9fSEFMX1JDQ19SVENBUEJfQ0xLX1NMRUVQX0RJU0FCTEUoKSBcCisgIENMRUFSX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX1JUQ0FQQlNNRU4pCisKKyNkZWZpbmUgX19IQUxfUkNDX1dXREdfQ0xLX1NMRUVQX0RJU0FCTEUoKSBcCisgIENMRUFSX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX1dXREdTTUVOKQorCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkyX0NMS19TTEVFUF9ESVNBQkxFKCkgXAorICBDTEVBUl9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9TUEkyU01FTikKKworI2RlZmluZSBfX0hBTF9SQ0NfU1BJM19DTEtfU0xFRVBfRElTQUJMRSgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfU1BJM1NNRU4pCisKKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUMl9DTEtfU0xFRVBfRElTQUJMRSgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfVVNBUlQyU01FTikKKworI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQzX0NMS19TTEVFUF9ESVNBQkxFKCkgXAorICBDTEVBUl9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9VU0FSVDNTTUVOKQorCisjaWYgZGVmaW5lZChVQVJUNCkKKyNkZWZpbmUgX19IQUxfUkNDX1VBUlQ0X0NMS19TTEVFUF9ESVNBQkxFKCkgXAorICBDTEVBUl9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9VQVJUNFNNRU4pCisjZW5kaWYgLyogVUFSVDQgKi8KKworI2lmIGRlZmluZWQoVUFSVDUpCisjZGVmaW5lIF9fSEFMX1JDQ19VQVJUNV9DTEtfU0xFRVBfRElTQUJMRSgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfVUFSVDVTTUVOKQorI2VuZGlmIC8qIFVBUlQ1ICovCisKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzFfQ0xLX1NMRUVQX0RJU0FCTEUoKSBcCisgIENMRUFSX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX0kyQzFTTUVOKQorCisjZGVmaW5lIF9fSEFMX1JDQ19JMkMyX0NMS19TTEVFUF9ESVNBQkxFKCkgXAorICBDTEVBUl9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9JMkMyU01FTikKKworI2lmIGRlZmluZWQoVVNCKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNCX0NMS19TTEVFUF9ESVNBQkxFKCkgXAorICBDTEVBUl9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9VU0JTTUVOKQorI2VuZGlmIC8qIFVTQiAqLworCisjaWYgZGVmaW5lZChGRENBTjEpCisjZGVmaW5lIF9fSEFMX1JDQ19GRENBTl9DTEtfU0xFRVBfRElTQUJMRSgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfRkRDQU5TTUVOKQorI2VuZGlmIC8qIEZEQ0FOMSAqLworCisjZGVmaW5lIF9fSEFMX1JDQ19QV1JfQ0xLX1NMRUVQX0RJU0FCTEUoKSBcCisgIENMRUFSX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX1BXUlNNRU4pCisKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzNfQ0xLX1NMRUVQX0RJU0FCTEUoKSBcCisgIENMRUFSX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX0kyQzNTTUVOKQorCisjZGVmaW5lIF9fSEFMX1JDQ19MUFRJTTFfQ0xLX1NMRUVQX0RJU0FCTEUoKSBcCisgIENMRUFSX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX0xQVElNMVNNRU4pCisKKyNkZWZpbmUgX19IQUxfUkNDX0xQVUFSVDFfQ0xLX1NMRUVQX0RJU0FCTEUoKSBcCisgIENMRUFSX0JJVChSQ0MtPkFQQjFTTUVOUjIsIFJDQ19BUEIxU01FTlIyX0xQVUFSVDFTTUVOKQorCisjaWYgZGVmaW5lZChJMkM0KQorI2RlZmluZSBfX0hBTF9SQ0NfSTJDNF9DTEtfU0xFRVBfRElTQUJMRSgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QVBCMVNNRU5SMiwgUkNDX0FQQjFTTUVOUjJfSTJDNFNNRU4pCisjZW5kaWYgLyogSTJDNCAqLworCisjZGVmaW5lIF9fSEFMX1JDQ19VQ1BEMV9DTEtfU0xFRVBfRElTQUJMRSgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QVBCMVNNRU5SMiwgUkNDX0FQQjFTTUVOUjJfVUNQRDFTTUVOKQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfQVBCMl9DbG9ja19TbGVlcF9FbmFibGVfRGlzYWJsZSBBUEIyIFBlcmlwaGVyYWwgQ2xvY2sgU2xlZXAKKyAqIEVuYWJsZSBEaXNhYmxlCisgKiBAYnJpZWYgIEVuYWJsZSBvciBkaXNhYmxlIHRoZSBBUEIyIHBlcmlwaGVyYWwgY2xvY2sgZHVyaW5nIExvdyBQb3dlciAoU2xlZXApCisgKiBtb2RlLgorICogQG5vdGUgICBQZXJpcGhlcmFsIGNsb2NrIGdhdGluZyBpbiBTTEVFUCBtb2RlIGNhbiBiZSB1c2VkIHRvIGZ1cnRoZXIgcmVkdWNlCisgKiAgICAgICAgIHBvd2VyIGNvbnN1bXB0aW9uLgorICogQG5vdGUgICBBZnRlciB3YWtldXAgZnJvbSBTTEVFUCBtb2RlLCB0aGUgcGVyaXBoZXJhbCBjbG9jayBpcyBlbmFibGVkIGFnYWluLgorICogQG5vdGUgICBCeSBkZWZhdWx0LCBhbGwgcGVyaXBoZXJhbCBjbG9ja3MgYXJlIGVuYWJsZWQgZHVyaW5nIFNMRUVQIG1vZGUuCisgKiBAeworICovCisKKyNkZWZpbmUgX19IQUxfUkNDX1NZU0NGR19DTEtfU0xFRVBfRU5BQkxFKCkgXAorICBTRVRfQklUKFJDQy0+QVBCMlNNRU5SLCBSQ0NfQVBCMlNNRU5SX1NZU0NGR1NNRU4pCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTFfQ0xLX1NMRUVQX0VOQUJMRSgpIFwKKyAgU0VUX0JJVChSQ0MtPkFQQjJTTUVOUiwgUkNDX0FQQjJTTUVOUl9USU0xU01FTikKKworI2RlZmluZSBfX0hBTF9SQ0NfU1BJMV9DTEtfU0xFRVBfRU5BQkxFKCkgXAorICBTRVRfQklUKFJDQy0+QVBCMlNNRU5SLCBSQ0NfQVBCMlNNRU5SX1NQSTFTTUVOKQorCisjZGVmaW5lIF9fSEFMX1JDQ19USU04X0NMS19TTEVFUF9FTkFCTEUoKSBcCisgIFNFVF9CSVQoUkNDLT5BUEIyU01FTlIsIFJDQ19BUEIyU01FTlJfVElNOFNNRU4pCisKKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUMV9DTEtfU0xFRVBfRU5BQkxFKCkgXAorICBTRVRfQklUKFJDQy0+QVBCMlNNRU5SLCBSQ0NfQVBCMlNNRU5SX1VTQVJUMVNNRU4pCisKKyNpZiBkZWZpbmVkKFNQSTQpCisjZGVmaW5lIF9fSEFMX1JDQ19TUEk0X0NMS19TTEVFUF9FTkFCTEUoKSBcCisgIFNFVF9CSVQoUkNDLT5BUEIyU01FTlIsIFJDQ19BUEIyU01FTlJfU1BJNFNNRU4pCisjZW5kaWYgLyogU1BJNCAqLworCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xNV9DTEtfU0xFRVBfRU5BQkxFKCkgXAorICBTRVRfQklUKFJDQy0+QVBCMlNNRU5SLCBSQ0NfQVBCMlNNRU5SX1RJTTE1U01FTikKKworI2RlZmluZSBfX0hBTF9SQ0NfVElNMTZfQ0xLX1NMRUVQX0VOQUJMRSgpIFwKKyAgU0VUX0JJVChSQ0MtPkFQQjJTTUVOUiwgUkNDX0FQQjJTTUVOUl9USU0xNlNNRU4pCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTE3X0NMS19TTEVFUF9FTkFCTEUoKSBcCisgIFNFVF9CSVQoUkNDLT5BUEIyU01FTlIsIFJDQ19BUEIyU01FTlJfVElNMTdTTUVOKQorCisjaWYgZGVmaW5lZChUSU0yMCkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTIwX0NMS19TTEVFUF9FTkFCTEUoKSBcCisgIFNFVF9CSVQoUkNDLT5BUEIyU01FTlIsIFJDQ19BUEIyU01FTlJfVElNMjBTTUVOKQorI2VuZGlmIC8qIFRJTTIwICovCisKKyNkZWZpbmUgX19IQUxfUkNDX1NBSTFfQ0xLX1NMRUVQX0VOQUJMRSgpIFwKKyAgU0VUX0JJVChSQ0MtPkFQQjJTTUVOUiwgUkNDX0FQQjJTTUVOUl9TQUkxU01FTikKKworI2lmIGRlZmluZWQoSFJUSU0xKQorI2RlZmluZSBfX0hBTF9SQ0NfSFJUSU0xX0NMS19TTEVFUF9FTkFCTEUoKSBcCisgIFNFVF9CSVQoUkNDLT5BUEIyU01FTlIsIFJDQ19BUEIyU01FTlJfSFJUSU0xU01FTikKKyNlbmRpZiAvKiBIUlRJTTEgKi8KKworI2RlZmluZSBfX0hBTF9SQ0NfU1lTQ0ZHX0NMS19TTEVFUF9ESVNBQkxFKCkgXAorICBDTEVBUl9CSVQoUkNDLT5BUEIyU01FTlIsIFJDQ19BUEIyU01FTlJfU1lTQ0ZHU01FTikKKworI2RlZmluZSBfX0hBTF9SQ0NfVElNMV9DTEtfU0xFRVBfRElTQUJMRSgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QVBCMlNNRU5SLCBSQ0NfQVBCMlNNRU5SX1RJTTFTTUVOKQorCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkxX0NMS19TTEVFUF9ESVNBQkxFKCkgXAorICBDTEVBUl9CSVQoUkNDLT5BUEIyU01FTlIsIFJDQ19BUEIyU01FTlJfU1BJMVNNRU4pCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTThfQ0xLX1NMRUVQX0RJU0FCTEUoKSBcCisgIENMRUFSX0JJVChSQ0MtPkFQQjJTTUVOUiwgUkNDX0FQQjJTTUVOUl9USU04U01FTikKKworI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQxX0NMS19TTEVFUF9ESVNBQkxFKCkgXAorICBDTEVBUl9CSVQoUkNDLT5BUEIyU01FTlIsIFJDQ19BUEIyU01FTlJfVVNBUlQxU01FTikKKworI2lmIGRlZmluZWQoU1BJNCkKKyNkZWZpbmUgX19IQUxfUkNDX1NQSTRfQ0xLX1NMRUVQX0RJU0FCTEUoKSBcCisgIENMRUFSX0JJVChSQ0MtPkFQQjJTTUVOUiwgUkNDX0FQQjJTTUVOUl9TUEk0U01FTikKKyNlbmRpZiAvKiBTUEk0ICovCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTE1X0NMS19TTEVFUF9ESVNBQkxFKCkgXAorICBDTEVBUl9CSVQoUkNDLT5BUEIyU01FTlIsIFJDQ19BUEIyU01FTlJfVElNMTVTTUVOKQorCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xNl9DTEtfU0xFRVBfRElTQUJMRSgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QVBCMlNNRU5SLCBSQ0NfQVBCMlNNRU5SX1RJTTE2U01FTikKKworI2RlZmluZSBfX0hBTF9SQ0NfVElNMTdfQ0xLX1NMRUVQX0RJU0FCTEUoKSBcCisgIENMRUFSX0JJVChSQ0MtPkFQQjJTTUVOUiwgUkNDX0FQQjJTTUVOUl9USU0xN1NNRU4pCisKKyNpZiBkZWZpbmVkKFRJTTIwKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMjBfQ0xLX1NMRUVQX0RJU0FCTEUoKSBcCisgIENMRUFSX0JJVChSQ0MtPkFQQjJTTUVOUiwgUkNDX0FQQjJTTUVOUl9USU0yMFNNRU4pCisjZW5kaWYgLyogVElNMjAgKi8KKworI2RlZmluZSBfX0hBTF9SQ0NfU0FJMV9DTEtfU0xFRVBfRElTQUJMRSgpIFwKKyAgQ0xFQVJfQklUKFJDQy0+QVBCMlNNRU5SLCBSQ0NfQVBCMlNNRU5SX1NBSTFTTUVOKQorCisjaWYgZGVmaW5lZChIUlRJTTEpCisjZGVmaW5lIF9fSEFMX1JDQ19IUlRJTTFfQ0xLX1NMRUVQX0RJU0FCTEUoKSBcCisgIENMRUFSX0JJVChSQ0MtPkFQQjJTTUVOUiwgUkNDX0FQQjJTTUVOUl9IUlRJTTFTTUVOKQorI2VuZGlmIC8qIEhSVElNMSAqLworCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfQUhCMV9DbG9ja19TbGVlcF9FbmFibGVfRGlzYWJsZV9TdGF0dXMgQUhCMSBQZXJpcGhlcmFsIENsb2NrCisgKiBTbGVlcCBFbmFibGVkIG9yIERpc2FibGVkIFN0YXR1cworICogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBBSEIxIHBlcmlwaGVyYWwgY2xvY2sgZHVyaW5nIExvdyBQb3dlciAoU2xlZXApIG1vZGUKKyAqIGlzIGVuYWJsZWQgb3Igbm90LgorICogQG5vdGUgICBQZXJpcGhlcmFsIGNsb2NrIGdhdGluZyBpbiBTTEVFUCBtb2RlIGNhbiBiZSB1c2VkIHRvIGZ1cnRoZXIgcmVkdWNlCisgKiAgICAgICAgIHBvd2VyIGNvbnN1bXB0aW9uLgorICogQG5vdGUgICBBZnRlciB3YWtldXAgZnJvbSBTTEVFUCBtb2RlLCB0aGUgcGVyaXBoZXJhbCBjbG9jayBpcyBlbmFibGVkIGFnYWluLgorICogQG5vdGUgICBCeSBkZWZhdWx0LCBhbGwgcGVyaXBoZXJhbCBjbG9ja3MgYXJlIGVuYWJsZWQgZHVyaW5nIFNMRUVQIG1vZGUuCisgKiBAeworICovCisKKyNkZWZpbmUgX19IQUxfUkNDX0RNQTFfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFIQjFTTUVOUiwgUkNDX0FIQjFTTUVOUl9ETUExU01FTikgIT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX0RNQTJfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFIQjFTTUVOUiwgUkNDX0FIQjFTTUVOUl9ETUEyU01FTikgIT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX0RNQU1VWDFfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFIQjFTTUVOUiwgUkNDX0FIQjFTTUVOUl9ETUFNVVgxU01FTikgIT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX0NPUkRJQ19JU19DTEtfU0xFRVBfRU5BQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QUhCMVNNRU5SLCBSQ0NfQUhCMVNNRU5SX0NPUkRJQ1NNRU4pICE9IDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19GTUFDX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BSEIxU01FTlIsIFJDQ19BSEIxU01FTlJfRk1BQ1NNRU4pICE9IDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19GTEFTSF9JU19DTEtfU0xFRVBfRU5BQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QUhCMVNNRU5SLCBSQ0NfQUhCMVNNRU5SX0ZMQVNIU01FTikgIT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX1NSQU0xX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BSEIxU01FTlIsIFJDQ19BSEIxU01FTlJfU1JBTTFTTUVOKSAhPSAwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfQ1JDX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BSEIxU01FTlIsIFJDQ19BSEIxU01FTlJfQ1JDU01FTikgIT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX0RNQTFfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BSEIxU01FTlIsIFJDQ19BSEIxU01FTlJfRE1BMVNNRU4pID09IDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19ETUEyX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QUhCMVNNRU5SLCBSQ0NfQUhCMVNNRU5SX0RNQTJTTUVOKSA9PSAwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfRE1BTVVYMV9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFIQjFTTUVOUiwgUkNDX0FIQjFTTUVOUl9ETUFNVVgxU01FTikgPT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX0NPUkRJQ19JU19DTEtfU0xFRVBfRElTQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFIQjFTTUVOUiwgUkNDX0FIQjFTTUVOUl9DT1JESUNTTUVOKSA9PSAwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfRk1BQ19JU19DTEtfU0xFRVBfRElTQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFIQjFTTUVOUiwgUkNDX0FIQjFTTUVOUl9GTUFDU01FTikgPT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX0ZMQVNIX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QUhCMVNNRU5SLCBSQ0NfQUhCMVNNRU5SX0ZMQVNIU01FTikgPT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX1NSQU0xX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QUhCMVNNRU5SLCBSQ0NfQUhCMVNNRU5SX1NSQU0xU01FTikgPT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX0NSQ19JU19DTEtfU0xFRVBfRElTQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFIQjFTTUVOUiwgUkNDX0FIQjFTTUVOUl9DUkNTTUVOKSA9PSAwVSkKKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0FIQjJfQ2xvY2tfU2xlZXBfRW5hYmxlX0Rpc2FibGVfU3RhdHVzIEFIQjIgUGVyaXBoZXJhbCBDbG9jaworICogU2xlZXAgRW5hYmxlZCBvciBEaXNhYmxlZCBTdGF0dXMKKyAqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgQUhCMiBwZXJpcGhlcmFsIGNsb2NrIGR1cmluZyBMb3cgUG93ZXIgKFNsZWVwKSBtb2RlCisgKiBpcyBlbmFibGVkIG9yIG5vdC4KKyAqIEBub3RlICAgUGVyaXBoZXJhbCBjbG9jayBnYXRpbmcgaW4gU0xFRVAgbW9kZSBjYW4gYmUgdXNlZCB0byBmdXJ0aGVyIHJlZHVjZQorICogICAgICAgICBwb3dlciBjb25zdW1wdGlvbi4KKyAqIEBub3RlICAgQWZ0ZXIgd2FrZXVwIGZyb20gU0xFRVAgbW9kZSwgdGhlIHBlcmlwaGVyYWwgY2xvY2sgaXMgZW5hYmxlZCBhZ2Fpbi4KKyAqIEBub3RlICAgQnkgZGVmYXVsdCwgYWxsIHBlcmlwaGVyYWwgY2xvY2tzIGFyZSBlbmFibGVkIGR1cmluZyBTTEVFUCBtb2RlLgorICogQHsKKyAqLworCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPQV9JU19DTEtfU0xFRVBfRU5BQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QUhCMlNNRU5SLCBSQ0NfQUhCMlNNRU5SX0dQSU9BU01FTikgIT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9CX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BSEIyU01FTlIsIFJDQ19BSEIyU01FTlJfR1BJT0JTTUVOKSAhPSAwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0NfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9HUElPQ1NNRU4pICE9IDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPRF9JU19DTEtfU0xFRVBfRU5BQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QUhCMlNNRU5SLCBSQ0NfQUhCMlNNRU5SX0dQSU9EU01FTikgIT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9FX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BSEIyU01FTlIsIFJDQ19BSEIyU01FTlJfR1BJT0VTTUVOKSAhPSAwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0ZfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9HUElPRlNNRU4pICE9IDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPR19JU19DTEtfU0xFRVBfRU5BQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QUhCMlNNRU5SLCBSQ0NfQUhCMlNNRU5SX0dQSU9HU01FTikgIT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX1NSQU0yX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BSEIyU01FTlIsIFJDQ19BSEIyU01FTlJfU1JBTTJTTUVOKSAhPSAwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfQ0NNX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BSEIyU01FTlIsIFJDQ19BSEIyU01FTlJfQ0NNU1JBTVNNRU4pICE9IDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19BREMxMl9JU19DTEtfU0xFRVBfRU5BQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QUhCMlNNRU5SLCBSQ0NfQUhCMlNNRU5SX0FEQzEyU01FTikgIT0gMFUpCisKKyNpZiBkZWZpbmVkKEFEQzM0NV9DT01NT04pCisjZGVmaW5lIF9fSEFMX1JDQ19BREMzNDVfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9BREMzNDVTTUVOKSAhPSAwVSkKKyNlbmRpZiAvKiBBREMzNDVfQ09NTU9OICovCisKKyNkZWZpbmUgX19IQUxfUkNDX0RBQzFfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9EQUMxU01FTikgIT0gMFUpCisKKyNpZiBkZWZpbmVkKERBQzIpCisjZGVmaW5lIF9fSEFMX1JDQ19EQUMyX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BSEIyU01FTlIsIFJDQ19BSEIyU01FTlJfREFDMlNNRU4pICE9IDBVKQorI2VuZGlmIC8qIERBQzIgKi8KKworI2RlZmluZSBfX0hBTF9SQ0NfREFDM19JU19DTEtfU0xFRVBfRU5BQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QUhCMlNNRU5SLCBSQ0NfQUhCMlNNRU5SX0RBQzNTTUVOKSAhPSAwVSkKKworI2lmIGRlZmluZWQoREFDNCkKKyNkZWZpbmUgX19IQUxfUkNDX0RBQzRfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9EQUM0U01FTikgIT0gMFUpCisjZW5kaWYgLyogREFDNCAqLworCisjaWYgZGVmaW5lZChBRVMpCisjZGVmaW5lIF9fSEFMX1JDQ19BRVNfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9BRVNTTUVOKSAhPSAwVSkKKyNlbmRpZiAvKiBBRVMgKi8KKworI2RlZmluZSBfX0hBTF9SQ0NfUk5HX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BSEIyU01FTlIsIFJDQ19BSEIyU01FTlJfUk5HU01FTikgIT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9BX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QUhCMlNNRU5SLCBSQ0NfQUhCMlNNRU5SX0dQSU9BU01FTikgPT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9CX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QUhCMlNNRU5SLCBSQ0NfQUhCMlNNRU5SX0dQSU9CU01FTikgPT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9DX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QUhCMlNNRU5SLCBSQ0NfQUhCMlNNRU5SX0dQSU9DU01FTikgPT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9EX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QUhCMlNNRU5SLCBSQ0NfQUhCMlNNRU5SX0dQSU9EU01FTikgPT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9FX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QUhCMlNNRU5SLCBSQ0NfQUhCMlNNRU5SX0dQSU9FU01FTikgPT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9GX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QUhCMlNNRU5SLCBSQ0NfQUhCMlNNRU5SX0dQSU9GU01FTikgPT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9HX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QUhCMlNNRU5SLCBSQ0NfQUhCMlNNRU5SX0dQSU9HU01FTikgPT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX1NSQU0yX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QUhCMlNNRU5SLCBSQ0NfQUhCMlNNRU5SX1NSQU0yU01FTikgPT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX0NDTV9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9DQ01TUkFNU01FTikgPT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX0FEQzEyX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QUhCMlNNRU5SLCBSQ0NfQUhCMlNNRU5SX0FEQzEyU01FTikgPT0gMFUpCisKKyNpZiBkZWZpbmVkKEFEQzM0NV9DT01NT04pCisjZGVmaW5lIF9fSEFMX1JDQ19BREMzNDVfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BSEIyU01FTlIsIFJDQ19BSEIyU01FTlJfQURDMzQ1U01FTikgPT0gMFUpCisjZW5kaWYgLyogQURDMzQ1X0NPTU1PTiAqLworCisjZGVmaW5lIF9fSEFMX1JDQ19EQUMxX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QUhCMlNNRU5SLCBSQ0NfQUhCMlNNRU5SX0RBQzFTTUVOKSA9PSAwVSkKKworI2lmIGRlZmluZWQoREFDMikKKyNkZWZpbmUgX19IQUxfUkNDX0RBQzJfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BSEIyU01FTlIsIFJDQ19BSEIyU01FTlJfREFDMlNNRU4pID09IDBVKQorI2VuZGlmIC8qIERBQzIgKi8KKworI2RlZmluZSBfX0hBTF9SQ0NfREFDM19JU19DTEtfU0xFRVBfRElTQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9EQUMzU01FTikgPT0gMFUpCisKKyNpZiBkZWZpbmVkKERBQzQpCisjZGVmaW5lIF9fSEFMX1JDQ19EQUM0X0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QUhCMlNNRU5SLCBSQ0NfQUhCMlNNRU5SX0RBQzRTTUVOKSA9PSAwVSkKKyNlbmRpZiAvKiBEQUM0ICovCisKKyNpZiBkZWZpbmVkKEFFUykKKyNkZWZpbmUgX19IQUxfUkNDX0FFU19JU19DTEtfU0xFRVBfRElTQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9BRVNTTUVOKSA9PSAwVSkKKyNlbmRpZiAvKiBBRVMgKi8KKworI2RlZmluZSBfX0hBTF9SQ0NfUk5HX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QUhCMlNNRU5SLCBSQ0NfQUhCMlNNRU5SX1JOR1NNRU4pID09IDBVKQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfQUhCM19DbG9ja19TbGVlcF9FbmFibGVfRGlzYWJsZV9TdGF0dXMgQUhCMyBQZXJpcGhlcmFsIENsb2NrCisgKiBTbGVlcCBFbmFibGVkIG9yIERpc2FibGVkIFN0YXR1cworICogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBBSEIzIHBlcmlwaGVyYWwgY2xvY2sgZHVyaW5nIExvdyBQb3dlciAoU2xlZXApIG1vZGUKKyAqIGlzIGVuYWJsZWQgb3Igbm90LgorICogQG5vdGUgICBQZXJpcGhlcmFsIGNsb2NrIGdhdGluZyBpbiBTTEVFUCBtb2RlIGNhbiBiZSB1c2VkIHRvIGZ1cnRoZXIgcmVkdWNlCisgKiAgICAgICAgIHBvd2VyIGNvbnN1bXB0aW9uLgorICogQG5vdGUgICBBZnRlciB3YWtldXAgZnJvbSBTTEVFUCBtb2RlLCB0aGUgcGVyaXBoZXJhbCBjbG9jayBpcyBlbmFibGVkIGFnYWluLgorICogQG5vdGUgICBCeSBkZWZhdWx0LCBhbGwgcGVyaXBoZXJhbCBjbG9ja3MgYXJlIGVuYWJsZWQgZHVyaW5nIFNMRUVQIG1vZGUuCisgKiBAeworICovCisKKyNpZiBkZWZpbmVkKEZNQ19CQU5LMSkKKyNkZWZpbmUgX19IQUxfUkNDX0ZNQ19JU19DTEtfU0xFRVBfRU5BQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QUhCM1NNRU5SLCBSQ0NfQUhCM1NNRU5SX0ZNQ1NNRU4pICE9IDBVKQorI2VuZGlmIC8qIEZNQ19CQU5LMSAqLworCisjaWYgZGVmaW5lZChRVUFEU1BJKQorI2RlZmluZSBfX0hBTF9SQ0NfUVNQSV9JU19DTEtfU0xFRVBfRU5BQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QUhCM1NNRU5SLCBSQ0NfQUhCM1NNRU5SX1FTUElTTUVOKSAhPSAwVSkKKyNlbmRpZiAvKiBRVUFEU1BJICovCisKKyNpZiBkZWZpbmVkKEZNQ19CQU5LMSkKKyNkZWZpbmUgX19IQUxfUkNDX0ZNQ19JU19DTEtfU0xFRVBfRElTQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFIQjNTTUVOUiwgUkNDX0FIQjNTTUVOUl9GTUNTTUVOKSA9PSAwVSkKKyNlbmRpZiAvKiBGTUNfQkFOSzEgKi8KKworI2lmIGRlZmluZWQoUVVBRFNQSSkKKyNkZWZpbmUgX19IQUxfUkNDX1FTUElfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BSEIzU01FTlIsIFJDQ19BSEIzU01FTlJfUVNQSVNNRU4pID09IDBVKQorI2VuZGlmIC8qIFFVQURTUEkgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0FQQjFfQ2xvY2tfU2xlZXBfRW5hYmxlX0Rpc2FibGVfU3RhdHVzIEFQQjEgUGVyaXBoZXJhbCBDbG9jaworICogU2xlZXAgRW5hYmxlZCBvciBEaXNhYmxlZCBTdGF0dXMKKyAqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgQVBCMSBwZXJpcGhlcmFsIGNsb2NrIGR1cmluZyBMb3cgUG93ZXIgKFNsZWVwKSBtb2RlCisgKiBpcyBlbmFibGVkIG9yIG5vdC4KKyAqIEBub3RlICAgUGVyaXBoZXJhbCBjbG9jayBnYXRpbmcgaW4gU0xFRVAgbW9kZSBjYW4gYmUgdXNlZCB0byBmdXJ0aGVyIHJlZHVjZQorICogICAgICAgICBwb3dlciBjb25zdW1wdGlvbi4KKyAqIEBub3RlICAgQWZ0ZXIgd2FrZXVwIGZyb20gU0xFRVAgbW9kZSwgdGhlIHBlcmlwaGVyYWwgY2xvY2sgaXMgZW5hYmxlZCBhZ2Fpbi4KKyAqIEBub3RlICAgQnkgZGVmYXVsdCwgYWxsIHBlcmlwaGVyYWwgY2xvY2tzIGFyZSBlbmFibGVkIGR1cmluZyBTTEVFUCBtb2RlLgorICogQHsKKyAqLworCisjZGVmaW5lIF9fSEFMX1JDQ19USU0yX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9USU0yU01FTikgIT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTNfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX1RJTTNTTUVOKSAhPSAwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfVElNNF9JU19DTEtfU0xFRVBfRU5BQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfVElNNFNNRU4pICE9IDBVKQorCisjaWYgZGVmaW5lZChUSU01KQorI2RlZmluZSBfX0hBTF9SQ0NfVElNNV9JU19DTEtfU0xFRVBfRU5BQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfVElNNVNNRU4pICE9IDBVKQorI2VuZGlmIC8qIFRJTTUgKi8KKworI2RlZmluZSBfX0hBTF9SQ0NfVElNNl9JU19DTEtfU0xFRVBfRU5BQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfVElNNlNNRU4pICE9IDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19USU03X0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9USU03U01FTikgIT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX0NSU19JU19DTEtfU0xFRVBfRU5BQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfQ1JTU01FTikgIT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX1JUQ0FQQl9JU19DTEtfU0xFRVBfRU5BQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfUlRDQVBCU01FTikgIT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX1dXREdfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX1dXREdTTUVOKSAhPSAwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfU1BJMl9JU19DTEtfU0xFRVBfRU5BQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfU1BJMlNNRU4pICE9IDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkzX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9TUEkzU01FTikgIT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUMl9JU19DTEtfU0xFRVBfRU5BQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfVVNBUlQyU01FTikgIT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUM19JU19DTEtfU0xFRVBfRU5BQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfVVNBUlQzU01FTikgIT0gMFUpCisKKyNpZiBkZWZpbmVkKFVBUlQ0KQorI2RlZmluZSBfX0hBTF9SQ0NfVUFSVDRfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX1VBUlQ0U01FTikgIT0gMFUpCisjZW5kaWYgLyogVUFSVDQgKi8KKworI2lmIGRlZmluZWQoVUFSVDUpCisjZGVmaW5lIF9fSEFMX1JDQ19VQVJUNV9JU19DTEtfU0xFRVBfRU5BQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfVUFSVDVTTUVOKSAhPSAwVSkKKyNlbmRpZiAvKiBVQVJUNSAqLworCisjZGVmaW5lIF9fSEFMX1JDQ19JMkMxX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9JMkMxU01FTikgIT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzJfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX0kyQzJTTUVOKSAhPSAwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfVVNCX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9VU0JTTUVOKSAhPSAwVSkKKworI2lmIGRlZmluZWQoRkRDQU4xKQorI2RlZmluZSBfX0hBTF9SQ0NfRkRDQU5fSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX0ZEQ0FOU01FTikgIT0gMFUpCisjZW5kaWYgLyogRkRDQU4xICovCisKKyNkZWZpbmUgX19IQUxfUkNDX1BXUl9JU19DTEtfU0xFRVBfRU5BQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfUFdSU01FTikgIT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzNfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX0kyQzNTTUVOKSAhPSAwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfTFBUSU0xX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9MUFRJTTFTTUVOKSAhPSAwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfTFBVQVJUMV9JU19DTEtfU0xFRVBfRU5BQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QVBCMVNNRU5SMiwgUkNDX0FQQjFTTUVOUjJfTFBVQVJUMVNNRU4pICE9IDBVKQorCisjaWYgZGVmaW5lZChJMkM0KQorI2RlZmluZSBfX0hBTF9SQ0NfSTJDNF9JU19DTEtfU0xFRVBfRU5BQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QVBCMVNNRU5SMiwgUkNDX0FQQjFTTUVOUjJfSTJDNFNNRU4pICE9IDBVKQorI2VuZGlmIC8qIEkyQzQgKi8KKworI2RlZmluZSBfX0hBTF9SQ0NfVUNQRDFfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUjIsIFJDQ19BUEIxU01FTlIyX1VDUEQxU01FTikgIT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTJfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9USU0yU01FTikgPT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTNfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9USU0zU01FTikgPT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTRfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9USU00U01FTikgPT0gMFUpCisKKyNpZiBkZWZpbmVkKFRJTTUpCisjZGVmaW5lIF9fSEFMX1JDQ19USU01X0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfVElNNVNNRU4pID09IDBVKQorI2VuZGlmIC8qIFRJTTUgKi8KKworI2RlZmluZSBfX0hBTF9SQ0NfVElNNl9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX1RJTTZTTUVOKSA9PSAwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfVElNN19JU19DTEtfU0xFRVBfRElTQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX1RJTTdTTUVOKSA9PSAwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfQ1JTX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfQ1JTU01FTikgPT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX1JUQ0FQQl9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX1JUQ0FQQlNNRU4pID09IDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19XV0RHX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfV1dER1NNRU4pID09IDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkyX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfU1BJMlNNRU4pID09IDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkzX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfU1BJM1NNRU4pID09IDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDJfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9VU0FSVDJTTUVOKSA9PSAwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQzX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfVVNBUlQzU01FTikgPT0gMFUpCisKKyNpZiBkZWZpbmVkKFVBUlQ0KQorI2RlZmluZSBfX0hBTF9SQ0NfVUFSVDRfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9VQVJUNFNNRU4pID09IDBVKQorI2VuZGlmIC8qIFVBUlQ0ICovCisKKyNpZiBkZWZpbmVkKFVBUlQ1KQorI2RlZmluZSBfX0hBTF9SQ0NfVUFSVDVfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9VQVJUNVNNRU4pID09IDBVKQorI2VuZGlmIC8qIFVBUlQ1ICovCisKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzFfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9JMkMxU01FTikgPT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzJfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9JMkMyU01FTikgPT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX1VTQl9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX1VTQlNNRU4pID09IDBVKQorCisjaWYgZGVmaW5lZChGRENBTjEpCisjZGVmaW5lIF9fSEFMX1JDQ19GRENBTl9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX0ZEQ0FOU01FTikgPT0gMFUpCisjZW5kaWYgLyogRkRDQU4xICovCisKKyNkZWZpbmUgX19IQUxfUkNDX1BXUl9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX1BXUlNNRU4pID09IDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19JMkMzX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfSTJDM1NNRU4pID09IDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19MUFRJTTFfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9MUFRJTTFTTUVOKSA9PSAwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfTFBVQVJUMV9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUjIsIFJDQ19BUEIxU01FTlIyX0xQVUFSVDFTTUVOKSA9PSAwVSkKKworI2lmIGRlZmluZWQoSTJDNCkKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzRfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIyLCBSQ0NfQVBCMVNNRU5SMl9JMkM0U01FTikgPT0gMFUpCisjZW5kaWYgLyogSTJDNCAqLworCisjZGVmaW5lIF9fSEFMX1JDQ19VQ1BEMV9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUjIsIFJDQ19BUEIxU01FTlIyX1VDUEQxU01FTikgPT0gMFUpCisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFJDQ19BUEIyX0Nsb2NrX1NsZWVwX0VuYWJsZV9EaXNhYmxlX1N0YXR1cyBBUEIyIFBlcmlwaGVyYWwgQ2xvY2sKKyAqIFNsZWVwIEVuYWJsZWQgb3IgRGlzYWJsZWQgU3RhdHVzCisgKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIEFQQjIgcGVyaXBoZXJhbCBjbG9jayBkdXJpbmcgTG93IFBvd2VyIChTbGVlcCkgbW9kZQorICogaXMgZW5hYmxlZCBvciBub3QuCisgKiBAbm90ZSAgIFBlcmlwaGVyYWwgY2xvY2sgZ2F0aW5nIGluIFNMRUVQIG1vZGUgY2FuIGJlIHVzZWQgdG8gZnVydGhlciByZWR1Y2UKKyAqICAgICAgICAgcG93ZXIgY29uc3VtcHRpb24uCisgKiBAbm90ZSAgIEFmdGVyIHdha2V1cCBmcm9tIFNMRUVQIG1vZGUsIHRoZSBwZXJpcGhlcmFsIGNsb2NrIGlzIGVuYWJsZWQgYWdhaW4uCisgKiBAbm90ZSAgIEJ5IGRlZmF1bHQsIGFsbCBwZXJpcGhlcmFsIGNsb2NrcyBhcmUgZW5hYmxlZCBkdXJpbmcgU0xFRVAgbW9kZS4KKyAqIEB7CisgKi8KKworI2RlZmluZSBfX0hBTF9SQ0NfU1lTQ0ZHX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BUEIyU01FTlIsIFJDQ19BUEIyU01FTlJfU1lTQ0ZHU01FTikgIT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTFfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFQQjJTTUVOUiwgUkNDX0FQQjJTTUVOUl9USU0xU01FTikgIT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX1NQSTFfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFQQjJTTUVOUiwgUkNDX0FQQjJTTUVOUl9TUEkxU01FTikgIT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTThfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFQQjJTTUVOUiwgUkNDX0FQQjJTTUVOUl9USU04U01FTikgIT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUMV9JU19DTEtfU0xFRVBfRU5BQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QVBCMlNNRU5SLCBSQ0NfQVBCMlNNRU5SX1VTQVJUMVNNRU4pICE9IDBVKQorCisjaWYgZGVmaW5lZChTUEk0KQorI2RlZmluZSBfX0hBTF9SQ0NfU1BJNF9JU19DTEtfU0xFRVBfRU5BQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QVBCMlNNRU5SLCBSQ0NfQVBCMlNNRU5SX1NQSTRTTUVOKSAhPSAwVSkKKyNlbmRpZiAvKiBTUEk0ICovCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTE1X0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BUEIyU01FTlIsIFJDQ19BUEIyU01FTlJfVElNMTVTTUVOKSAhPSAwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfVElNMTZfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFQQjJTTUVOUiwgUkNDX0FQQjJTTUVOUl9USU0xNlNNRU4pICE9IDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xN19JU19DTEtfU0xFRVBfRU5BQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QVBCMlNNRU5SLCBSQ0NfQVBCMlNNRU5SX1RJTTE3U01FTikgIT0gMFUpCisKKyNpZiBkZWZpbmVkKFRJTTIwKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMjBfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFQQjJTTUVOUiwgUkNDX0FQQjJTTUVOUl9USU0yMFNNRU4pICE9IDBVKQorI2VuZGlmIC8qIFRJTTIwICovCisKKyNkZWZpbmUgX19IQUxfUkNDX1NBSTFfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFQQjJTTUVOUiwgUkNDX0FQQjJTTUVOUl9TQUkxU01FTikgIT0gMFUpCisKKyNpZiBkZWZpbmVkKEhSVElNMSkKKyNkZWZpbmUgX19IQUxfUkNDX0hSVElNMV9JU19DTEtfU0xFRVBfRU5BQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QVBCMlNNRU5SLCBSQ0NfQVBCMlNNRU5SX0hSVElNMVNNRU4pICE9IDBVKQorI2VuZGlmIC8qIEhSVElNMSAqLworCisjZGVmaW5lIF9fSEFMX1JDQ19TWVNDRkdfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BUEIyU01FTlIsIFJDQ19BUEIyU01FTlJfU1lTQ0ZHU01FTikgPT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTFfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BUEIyU01FTlIsIFJDQ19BUEIyU01FTlJfVElNMVNNRU4pID09IDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkxX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpIFwKKyAgKFJFQURfQklUKFJDQy0+QVBCMlNNRU5SLCBSQ0NfQVBCMlNNRU5SX1NQSTFTTUVOKSA9PSAwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfVElNOF9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFQQjJTTUVOUiwgUkNDX0FQQjJTTUVOUl9USU04U01FTikgPT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUMV9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFQQjJTTUVOUiwgUkNDX0FQQjJTTUVOUl9VU0FSVDFTTUVOKSA9PSAwVSkKKworI2lmIGRlZmluZWQoU1BJNCkKKyNkZWZpbmUgX19IQUxfUkNDX1NQSTRfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BUEIyU01FTlIsIFJDQ19BUEIyU01FTlJfU1BJNFNNRU4pID09IDBVKQorI2VuZGlmIC8qIFNQSTQgKi8KKworI2RlZmluZSBfX0hBTF9SQ0NfVElNMTVfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BUEIyU01FTlIsIFJDQ19BUEIyU01FTlJfVElNMTVTTUVOKSA9PSAwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfVElNMTZfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BUEIyU01FTlIsIFJDQ19BUEIyU01FTlJfVElNMTZTTUVOKSA9PSAwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfVElNMTdfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BUEIyU01FTlIsIFJDQ19BUEIyU01FTlJfVElNMTdTTUVOKSA9PSAwVSkKKworI2lmIGRlZmluZWQoVElNMjApCisjZGVmaW5lIF9fSEFMX1JDQ19USU0yMF9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSBcCisgIChSRUFEX0JJVChSQ0MtPkFQQjJTTUVOUiwgUkNDX0FQQjJTTUVOUl9USU0yMFNNRU4pID09IDBVKQorI2VuZGlmIC8qIFRJTTIwICovCisKKyNkZWZpbmUgX19IQUxfUkNDX1NBSTFfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BUEIyU01FTlIsIFJDQ19BUEIyU01FTlJfU0FJMVNNRU4pID09IDBVKQorCisjaWYgZGVmaW5lZChIUlRJTTEpCisjZGVmaW5lIF9fSEFMX1JDQ19IUlRJTTFfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgXAorICAoUkVBRF9CSVQoUkNDLT5BUEIyU01FTlIsIFJDQ19BUEIyU01FTlJfSFJUSU0xU01FTikgPT0gMFUpCisjZW5kaWYgLyogSFJUSU0xICovCisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFJDQ19CYWNrdXBfRG9tYWluX1Jlc2V0IFJDQyBCYWNrdXAgRG9tYWluIFJlc2V0CisgKiBAeworICovCisKKy8qKiBAYnJpZWYgIE1hY3JvcyB0byBmb3JjZSBvciByZWxlYXNlIHRoZSBCYWNrdXAgZG9tYWluIHJlc2V0LgorICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIHJlc2V0cyB0aGUgUlRDIHBlcmlwaGVyYWwgKGluY2x1ZGluZyB0aGUgYmFja3VwCisgKiByZWdpc3RlcnMpIGFuZCB0aGUgUlRDIGNsb2NrIHNvdXJjZSBzZWxlY3Rpb24gaW4gUkNDX0NTUiByZWdpc3Rlci4KKyAqIEBub3RlICAgVGhlIEJLUFNSQU0gaXMgbm90IGFmZmVjdGVkIGJ5IHRoaXMgcmVzZXQuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9SQ0NfQkFDS1VQUkVTRVRfRk9SQ0UoKSBTRVRfQklUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfQkRSU1QpCisKKyNkZWZpbmUgX19IQUxfUkNDX0JBQ0tVUFJFU0VUX1JFTEVBU0UoKSBDTEVBUl9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9CRFJTVCkKKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX1JUQ19DbG9ja19Db25maWd1cmF0aW9uIFJDQyBSVEMgQ2xvY2sgQ29uZmlndXJhdGlvbgorICogQHsKKyAqLworCisvKiogQGJyaWVmICBNYWNyb3MgdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhlIFJUQyBjbG9jay4KKyAqIEBub3RlICAgQXMgdGhlIFJUQyBpcyBpbiB0aGUgQmFja3VwIGRvbWFpbiBhbmQgd3JpdGUgYWNjZXNzIGlzIGRlbmllZCB0bworICogICAgICAgICB0aGlzIGRvbWFpbiBhZnRlciByZXNldCwgeW91IGhhdmUgdG8gZW5hYmxlIHdyaXRlIGFjY2VzcyB1c2luZworICogICAgICAgICBIQUxfUFdSX0VuYWJsZUJrVXBBY2Nlc3MoKSBmdW5jdGlvbiBiZWZvcmUgdG8gY29uZmlndXJlIHRoZSBSVEMKKyAqICAgICAgICAgKHRvIGJlIGRvbmUgb25jZSBhZnRlciByZXNldCkuCisgKiBAbm90ZSAgIFRoZXNlIG1hY3JvcyBtdXN0IGJlIHVzZWQgYWZ0ZXIgdGhlIFJUQyBjbG9jayBzb3VyY2Ugd2FzIHNlbGVjdGVkLgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfUkNDX1JUQ19FTkFCTEUoKSBTRVRfQklUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfUlRDRU4pCisKKyNkZWZpbmUgX19IQUxfUkNDX1JUQ19ESVNBQkxFKCkgQ0xFQVJfQklUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfUlRDRU4pCisKKy8qKgorICogQH0KKyAqLworCisvKiogQGJyaWVmICBNYWNyb3MgdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhlIEludGVybmFsIEhpZ2ggU3BlZWQgMTZNSHogb3NjaWxsYXRvcgorICogKEhTSSkuCisgKiBAbm90ZSAgIFRoZSBIU0kgaXMgc3RvcHBlZCBieSBoYXJkd2FyZSB3aGVuIGVudGVyaW5nIFNUT1AgYW5kIFNUQU5EQlkgbW9kZXMuCisgKiAgICAgICAgIEl0IGlzIHVzZWQgKGVuYWJsZWQgYnkgaGFyZHdhcmUpIGFzIHN5c3RlbSBjbG9jayBzb3VyY2UgYWZ0ZXIgc3RhcnR1cAorICogICAgICAgICBmcm9tIFJlc2V0LCB3YWtldXAgZnJvbSBTVE9QIGFuZCBTVEFOREJZIG1vZGUsIG9yIGluIGNhc2Ugb2YgZmFpbHVyZQorICogICAgICAgICBvZiB0aGUgSFNFIHVzZWQgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBhcyBzeXN0ZW0gY2xvY2sgKGlmIHRoZSBDbG9jaworICogICAgICAgICBTZWN1cml0eSBTeXN0ZW0gQ1NTIGlzIGVuYWJsZWQpLgorICogQG5vdGUgICBIU0kgY2FuIG5vdCBiZSBzdG9wcGVkIGlmIGl0IGlzIHVzZWQgYXMgc3lzdGVtIGNsb2NrIHNvdXJjZS4gSW4gdGhpcworICogY2FzZSwgeW91IGhhdmUgdG8gc2VsZWN0IGFub3RoZXIgc291cmNlIG9mIHRoZSBzeXN0ZW0gY2xvY2sgdGhlbiBzdG9wIHRoZQorICogSFNJLgorICogQG5vdGUgICBBZnRlciBlbmFibGluZyB0aGUgSFNJLCB0aGUgYXBwbGljYXRpb24gc29mdHdhcmUgc2hvdWxkIHdhaXQgb24KKyAqIEhTSVJEWSBmbGFnIHRvIGJlIHNldCBpbmRpY2F0aW5nIHRoYXQgSFNJIGNsb2NrIGlzIHN0YWJsZSBhbmQgY2FuIGJlIHVzZWQgYXMKKyAqICAgICAgICAgc3lzdGVtIGNsb2NrIHNvdXJjZS4KKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4KKyAqIEBub3RlICAgV2hlbiB0aGUgSFNJIGlzIHN0b3BwZWQsIEhTSVJEWSBmbGFnIGdvZXMgbG93IGFmdGVyIDYgSFNJIG9zY2lsbGF0b3IKKyAqICAgICAgICAgY2xvY2sgY3ljbGVzLgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0hTSV9FTkFCTEUoKSBTRVRfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0lPTikKKworI2RlZmluZSBfX0hBTF9SQ0NfSFNJX0RJU0FCTEUoKSBDTEVBUl9CSVQoUkNDLT5DUiwgUkNDX0NSX0hTSU9OKQorCisvKiogQGJyaWVmICBNYWNybyB0byBhZGp1c3QgdGhlIEludGVybmFsIEhpZ2ggU3BlZWQgMTZNSHogb3NjaWxsYXRvciAoSFNJKQorICogY2FsaWJyYXRpb24gdmFsdWUuCisgKiBAbm90ZSAgIFRoZSBjYWxpYnJhdGlvbiBpcyB1c2VkIHRvIGNvbXBlbnNhdGUgZm9yIHRoZSB2YXJpYXRpb25zIGluIHZvbHRhZ2UKKyAqICAgICAgICAgYW5kIHRlbXBlcmF0dXJlIHRoYXQgaW5mbHVlbmNlIHRoZSBmcmVxdWVuY3kgb2YgdGhlIGludGVybmFsIEhTSSBSQy4KKyAqIEBwYXJhbSAgX19IU0lDQUxJQlJBVElPTlZBTFVFX18gc3BlY2lmaWVzIHRoZSBjYWxpYnJhdGlvbiB0cmltbWluZyB2YWx1ZQorICogICAgICAgICAoZGVmYXVsdCBpcyBSQ0NfSFNJQ0FMSUJSQVRJT05fREVGQVVMVCkuCisgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAweDdGLgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0hTSV9DQUxJQlJBVElPTlZBTFVFX0FESlVTVChfX0hTSUNBTElCUkFUSU9OVkFMVUVfXykgXAorICBNT0RJRllfUkVHKFJDQy0+SUNTQ1IsIFJDQ19JQ1NDUl9IU0lUUklNLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgKF9fSFNJQ0FMSUJSQVRJT05WQUxVRV9fKSA8PCBSQ0NfSUNTQ1JfSFNJVFJJTV9Qb3MpCisKKy8qKgorICogQGJyaWVmICAgIE1hY3JvcyB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgZm9yY2Ugb2YgdGhlIEludGVybmFsIEhpZ2ggU3BlZWQKKyAqIG9zY2lsbGF0b3IgKEhTSSkgaW4gU1RPUCBtb2RlIHRvIGJlIHF1aWNrbHkgYXZhaWxhYmxlIGFzIGtlcm5lbCBjbG9jayBmb3IKKyAqIFVTQVJUcyBhbmQgSTJDcy4KKyAqIEBub3RlICAgICBLZWVwaW5nIHRoZSBIU0kgT04gaW4gU1RPUCBtb2RlIGFsbG93cyB0byBhdm9pZCBzbG93aW5nIGRvd24gdGhlCisgKiBjb21tdW5pY2F0aW9uIHNwZWVkIGJlY2F1c2Ugb2YgdGhlIEhTSSBzdGFydHVwIHRpbWUuCisgKiBAbm90ZSAgICAgVGhlIGVuYWJsZSBvZiB0aGlzIGZ1bmN0aW9uIGhhcyBub3QgZWZmZWN0IG9uIHRoZSBIU0lPTiBiaXQuCisgKiAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4KKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX1JDQ19IU0lTVE9QX0VOQUJMRSgpIFNFVF9CSVQoUkNDLT5DUiwgUkNDX0NSX0hTSUtFUk9OKQorCisjZGVmaW5lIF9fSEFMX1JDQ19IU0lTVE9QX0RJU0FCTEUoKSBDTEVBUl9CSVQoUkNDLT5DUiwgUkNDX0NSX0hTSUtFUk9OKQorCisvKiogQGJyaWVmICBNYWNyb3MgdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhlIEludGVybmFsIExvdyBTcGVlZCBvc2NpbGxhdG9yIChMU0kpLgorICogQG5vdGUgICBBZnRlciBlbmFibGluZyB0aGUgTFNJLCB0aGUgYXBwbGljYXRpb24gc29mdHdhcmUgc2hvdWxkIHdhaXQgb24KKyAqICAgICAgICAgTFNJUkRZIGZsYWcgdG8gYmUgc2V0IGluZGljYXRpbmcgdGhhdCBMU0kgY2xvY2sgaXMgc3RhYmxlIGFuZCBjYW4KKyAqICAgICAgICAgYmUgdXNlZCB0byBjbG9jayB0aGUgSVdERyBhbmQvb3IgdGhlIFJUQy4KKyAqIEBub3RlICAgTFNJIGNhbiBub3QgYmUgZGlzYWJsZWQgaWYgdGhlIElXREcgaXMgcnVubmluZy4KKyAqIEBub3RlICAgV2hlbiB0aGUgTFNJIGlzIHN0b3BwZWQsIExTSVJEWSBmbGFnIGdvZXMgbG93IGFmdGVyIDYgTFNJIG9zY2lsbGF0b3IKKyAqICAgICAgICAgY2xvY2sgY3ljbGVzLgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0xTSV9FTkFCTEUoKSBTRVRfQklUKFJDQy0+Q1NSLCBSQ0NfQ1NSX0xTSU9OKQorCisjZGVmaW5lIF9fSEFMX1JDQ19MU0lfRElTQUJMRSgpIENMRUFSX0JJVChSQ0MtPkNTUiwgUkNDX0NTUl9MU0lPTikKKworLyoqCisgKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgRXh0ZXJuYWwgSGlnaCBTcGVlZCBvc2NpbGxhdG9yIChIU0UpLgorICogQG5vdGUgICBUcmFuc2l0aW9uIEhTRSBCeXBhc3MgdG8gSFNFIE9uIGFuZCBIU0UgT24gdG8gSFNFIEJ5cGFzcyBhcmUgbm90CisgKiAgICAgICAgIHN1cHBvcnRlZCBieSB0aGlzIG1hY3JvLiBVc2VyIHNob3VsZCByZXF1ZXN0IGEgdHJhbnNpdGlvbiB0byBIU0UgT2ZmCisgKiAgICAgICAgIGZpcnN0IGFuZCB0aGVuIEhTRSBPbiBvciBIU0UgQnlwYXNzLgorICogQG5vdGUgICBBZnRlciBlbmFibGluZyB0aGUgSFNFIChSQ0NfSFNFX09OIG9yIFJDQ19IU0VfQnlwYXNzKSwgdGhlCisgKiBhcHBsaWNhdGlvbiBzb2Z0d2FyZSBzaG91bGQgd2FpdCBvbiBIU0VSRFkgZmxhZyB0byBiZSBzZXQgaW5kaWNhdGluZyB0aGF0IEhTRQorICogY2xvY2sgaXMgc3RhYmxlIGFuZCBjYW4gYmUgdXNlZCB0byBjbG9jayB0aGUgUExMIGFuZC9vciBzeXN0ZW0gY2xvY2suCisgKiBAbm90ZSAgIEhTRSBzdGF0ZSBjYW4gbm90IGJlIGNoYW5nZWQgaWYgaXQgaXMgdXNlZCBkaXJlY3RseSBvciB0aHJvdWdoIHRoZQorICogICAgICAgICBQTEwgYXMgc3lzdGVtIGNsb2NrLiBJbiB0aGlzIGNhc2UsIHlvdSBoYXZlIHRvIHNlbGVjdCBhbm90aGVyIHNvdXJjZQorICogICAgICAgICBvZiB0aGUgc3lzdGVtIGNsb2NrIHRoZW4gY2hhbmdlIHRoZSBIU0Ugc3RhdGUgKGV4LiBkaXNhYmxlIGl0KS4KKyAqIEBub3RlICAgVGhlIEhTRSBpcyBzdG9wcGVkIGJ5IGhhcmR3YXJlIHdoZW4gZW50ZXJpbmcgU1RPUCBhbmQgU1RBTkRCWSBtb2Rlcy4KKyAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiByZXNldCB0aGUgQ1NTT04gYml0LCBzbyBpZiB0aGUgY2xvY2sgc2VjdXJpdHkKKyAqIHN5c3RlbShDU1MpIHdhcyBwcmV2aW91c2x5IGVuYWJsZWQgeW91IGhhdmUgdG8gZW5hYmxlIGl0IGFnYWluIGFmdGVyIGNhbGxpbmcKKyAqIHRoaXMgZnVuY3Rpb24uCisgKiBAcGFyYW0gIF9fU1RBVEVfXyBzcGVjaWZpZXMgdGhlIG5ldyBzdGF0ZSBvZiB0aGUgSFNFLgorICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0hTRV9PRkYgIFR1cm4gT0ZGIHRoZSBIU0Ugb3NjaWxsYXRvciwgSFNFUkRZIGZsYWcKKyAqIGdvZXMgbG93IGFmdGVyIDYgSFNFIG9zY2lsbGF0b3IgY2xvY2sgY3ljbGVzLgorICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0hTRV9PTiAgVHVybiBPTiB0aGUgSFNFIG9zY2lsbGF0b3IuCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSFNFX0JZUEFTUyAgSFNFIG9zY2lsbGF0b3IgYnlwYXNzZWQgd2l0aCBleHRlcm5hbAorICogY2xvY2suCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9SQ0NfSFNFX0NPTkZJRyhfX1NUQVRFX18pICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoX19TVEFURV9fKSA9PSBSQ0NfSFNFX09OKSB7ICAgICAgICAgICAgXAorICAgICAgU0VUX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNFT04pOyAgICAgICAgICAgXAorICAgIH0gZWxzZSBpZiAoKF9fU1RBVEVfXykgPT0gUkNDX0hTRV9CWVBBU1MpIHsgXAorICAgICAgU0VUX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNFQllQKTsgICAgICAgICAgXAorICAgICAgU0VUX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNFT04pOyAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0xFQVJfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0VPTik7ICAgICAgICAgXAorICAgICAgQ0xFQVJfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0VCWVApOyAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisvKioKKyAqIEBicmllZiAgTWFjcm8gdG8gY29uZmlndXJlIHRoZSBFeHRlcm5hbCBMb3cgU3BlZWQgb3NjaWxsYXRvciAoTFNFKS4KKyAqIEBub3RlICAgVHJhbnNpdGlvbnMgTFNFIEJ5cGFzcyB0byBMU0UgT24gYW5kIExTRSBPbiB0byBMU0UgQnlwYXNzIGFyZSBub3QKKyAqICAgICAgICAgc3VwcG9ydGVkIGJ5IHRoaXMgbWFjcm8uIFVzZXIgc2hvdWxkIHJlcXVlc3QgYSB0cmFuc2l0aW9uIHRvIExTRSBPZmYKKyAqICAgICAgICAgZmlyc3QgYW5kIHRoZW4gTFNFIE9uIG9yIExTRSBCeXBhc3MuCisgKiBAbm90ZSAgIEFzIHRoZSBMU0UgaXMgaW4gdGhlIEJhY2t1cCBkb21haW4gYW5kIHdyaXRlIGFjY2VzcyBpcyBkZW5pZWQgdG8KKyAqICAgICAgICAgdGhpcyBkb21haW4gYWZ0ZXIgcmVzZXQsIHlvdSBoYXZlIHRvIGVuYWJsZSB3cml0ZSBhY2Nlc3MgdXNpbmcKKyAqICAgICAgICAgSEFMX1BXUl9FbmFibGVCa1VwQWNjZXNzKCkgZnVuY3Rpb24gYmVmb3JlIHRvIGNvbmZpZ3VyZSB0aGUgTFNFCisgKiAgICAgICAgICh0byBiZSBkb25lIG9uY2UgYWZ0ZXIgcmVzZXQpLgorICogQG5vdGUgICBBZnRlciBlbmFibGluZyB0aGUgTFNFIChSQ0NfTFNFX09OIG9yIFJDQ19MU0VfQllQQVNTKSwgdGhlCisgKiBhcHBsaWNhdGlvbiBzb2Z0d2FyZSBzaG91bGQgd2FpdCBvbiBMU0VSRFkgZmxhZyB0byBiZSBzZXQgaW5kaWNhdGluZyB0aGF0IExTRQorICogY2xvY2sgaXMgc3RhYmxlIGFuZCBjYW4gYmUgdXNlZCB0byBjbG9jayB0aGUgUlRDLgorICogQHBhcmFtICBfX1NUQVRFX18gc3BlY2lmaWVzIHRoZSBuZXcgc3RhdGUgb2YgdGhlIExTRS4KKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19MU0VfT0ZGICBUdXJuIE9GRiB0aGUgTFNFIG9zY2lsbGF0b3IsIExTRVJEWSBmbGFnCisgKiBnb2VzIGxvdyBhZnRlciA2IExTRSBvc2NpbGxhdG9yIGNsb2NrIGN5Y2xlcy4KKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19MU0VfT04gIFR1cm4gT04gdGhlIExTRSBvc2NpbGxhdG9yLgorICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0xTRV9CWVBBU1MgIExTRSBvc2NpbGxhdG9yIGJ5cGFzc2VkIHdpdGggZXh0ZXJuYWwKKyAqIGNsb2NrLgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0xTRV9DT05GSUcoX19TVEFURV9fKSAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKF9fU1RBVEVfXykgPT0gUkNDX0xTRV9PTikgeyAgICAgICAgICAgIFwKKyAgICAgIFNFVF9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9MU0VPTik7ICAgICAgIFwKKyAgICB9IGVsc2UgaWYgKChfX1NUQVRFX18pID09IFJDQ19MU0VfQllQQVNTKSB7IFwKKyAgICAgIFNFVF9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9MU0VCWVApOyAgICAgIFwKKyAgICAgIFNFVF9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9MU0VPTik7ICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIENMRUFSX0JJVChSQ0MtPkJEQ1IsIFJDQ19CRENSX0xTRU9OKTsgICAgIFwKKyAgICAgIENMRUFSX0JJVChSQ0MtPkJEQ1IsIFJDQ19CRENSX0xTRUJZUCk7ICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworLyoqIEBicmllZiAgTWFjcm9zIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBJbnRlcm5hbCBIaWdoIFNwZWVkIDQ4TUh6IG9zY2lsbGF0b3IKKyAqIChIU0k0OCkuCisgKiBAbm90ZSAgIFRoZSBIU0k0OCBpcyBzdG9wcGVkIGJ5IGhhcmR3YXJlIHdoZW4gZW50ZXJpbmcgU1RPUCBhbmQgU1RBTkRCWQorICogbW9kZXMuCisgKiBAbm90ZSAgIEFmdGVyIGVuYWJsaW5nIHRoZSBIU0k0OCwgdGhlIGFwcGxpY2F0aW9uIHNvZnR3YXJlIHNob3VsZCB3YWl0IG9uCisgKiBIU0k0OFJEWSBmbGFnIHRvIGJlIHNldCBpbmRpY2F0aW5nIHRoYXQgSFNJNDggY2xvY2sgaXMgc3RhYmxlLiBUaGlzIHBhcmFtZXRlcgorICogY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4KKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX1JDQ19IU0k0OF9FTkFCTEUoKSBTRVRfQklUKFJDQy0+Q1JSQ1IsIFJDQ19DUlJDUl9IU0k0OE9OKQorCisjZGVmaW5lIF9fSEFMX1JDQ19IU0k0OF9ESVNBQkxFKCkgQ0xFQVJfQklUKFJDQy0+Q1JSQ1IsIFJDQ19DUlJDUl9IU0k0OE9OKQorCisvKiogQGJyaWVmICBNYWNyb3MgdG8gY29uZmlndXJlIHRoZSBSVEMgY2xvY2sgKFJUQ0NMSykuCisgKiBAbm90ZSAgIEFzIHRoZSBSVEMgY2xvY2sgY29uZmlndXJhdGlvbiBiaXRzIGFyZSBpbiB0aGUgQmFja3VwIGRvbWFpbiBhbmQKKyAqIHdyaXRlIGFjY2VzcyBpcyBkZW5pZWQgdG8gdGhpcyBkb21haW4gYWZ0ZXIgcmVzZXQsIHlvdSBoYXZlIHRvIGVuYWJsZSB3cml0ZQorICogICAgICAgICBhY2Nlc3MgdXNpbmcgdGhlIFBvd2VyIEJhY2t1cCBBY2Nlc3MgbWFjcm8gYmVmb3JlIHRvIGNvbmZpZ3VyZQorICogICAgICAgICB0aGUgUlRDIGNsb2NrIHNvdXJjZSAodG8gYmUgZG9uZSBvbmNlIGFmdGVyIHJlc2V0KS4KKyAqIEBub3RlICAgT25jZSB0aGUgUlRDIGNsb2NrIGlzIGNvbmZpZ3VyZWQgaXQgY2Fubm90IGJlIGNoYW5nZWQgdW5sZXNzIHRoZQorICogICAgICAgICBCYWNrdXAgZG9tYWluIGlzIHJlc2V0IHVzaW5nIF9fSEFMX1JDQ19CQUNLVVBSRVNFVF9GT1JDRSgpIG1hY3JvLCBvcgorICogYnkgYSBQb3dlciBPbiBSZXNldCAoUE9SKS4KKyAqCisgKiBAcGFyYW0gIF9fUlRDX0NMS1NPVVJDRV9fIHNwZWNpZmllcyB0aGUgUlRDIGNsb2NrIHNvdXJjZS4KKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19SVENDTEtTT1VSQ0VfTk9ORSAgTm8gY2xvY2sgc2VsZWN0ZWQgYXMgUlRDIGNsb2NrLgorICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1JUQ0NMS1NPVVJDRV9MU0UgIExTRSBzZWxlY3RlZCBhcyBSVEMgY2xvY2suCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUlRDQ0xLU09VUkNFX0xTSSAgTFNJIHNlbGVjdGVkIGFzIFJUQyBjbG9jay4KKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19SVENDTEtTT1VSQ0VfSFNFX0RJVjMyICBIU0UgY2xvY2sgZGl2aWRlZCBieSAzMgorICogc2VsZWN0ZWQKKyAqCisgKiBAbm90ZSAgIElmIHRoZSBMU0Ugb3IgTFNJIGlzIHVzZWQgYXMgUlRDIGNsb2NrIHNvdXJjZSwgdGhlIFJUQyBjb250aW51ZXMgdG8KKyAqICAgICAgICAgd29yayBpbiBTVE9QIGFuZCBTVEFOREJZIG1vZGVzLCBhbmQgY2FuIGJlIHVzZWQgYXMgd2FrZXVwIHNvdXJjZS4KKyAqICAgICAgICAgSG93ZXZlciwgd2hlbiB0aGUgSFNFIGNsb2NrIGlzIHVzZWQgYXMgUlRDIGNsb2NrIHNvdXJjZSwgdGhlIFJUQworICogICAgICAgICBjYW5ub3QgYmUgdXNlZCBpbiBTVE9QIGFuZCBTVEFOREJZIG1vZGVzLgorICogQG5vdGUgICBUaGUgbWF4aW11bSBpbnB1dCBjbG9jayBmcmVxdWVuY3kgZm9yIFJUQyBpcyAxTUh6ICh3aGVuIHVzaW5nIEhTRSBhcworICogICAgICAgICBSVEMgY2xvY2sgc291cmNlKS4KKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX1JDQ19SVENfQ09ORklHKF9fUlRDX0NMS1NPVVJDRV9fKSBcCisgIE1PRElGWV9SRUcoUkNDLT5CRENSLCBSQ0NfQkRDUl9SVENTRUwsIChfX1JUQ19DTEtTT1VSQ0VfXykpCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGdldCB0aGUgUlRDIGNsb2NrIHNvdXJjZS4KKyAqIEByZXR2YWwgVGhlIHJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19SVENDTEtTT1VSQ0VfTk9ORSAgTm8gY2xvY2sgc2VsZWN0ZWQgYXMgUlRDIGNsb2NrLgorICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1JUQ0NMS1NPVVJDRV9MU0UgIExTRSBzZWxlY3RlZCBhcyBSVEMgY2xvY2suCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUlRDQ0xLU09VUkNFX0xTSSAgTFNJIHNlbGVjdGVkIGFzIFJUQyBjbG9jay4KKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19SVENDTEtTT1VSQ0VfSFNFX0RJVjMyICBIU0UgY2xvY2sgZGl2aWRlZCBieSAzMgorICogc2VsZWN0ZWQKKyAqLworI2RlZmluZSBfX0hBTF9SQ0NfR0VUX1JUQ19TT1VSQ0UoKSAoUkVBRF9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9SVENTRUwpKQorCisvKiogQGJyaWVmICBNYWNyb3MgdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhlIG1haW4gUExMLgorICogQG5vdGUgICBBZnRlciBlbmFibGluZyB0aGUgbWFpbiBQTEwsIHRoZSBhcHBsaWNhdGlvbiBzb2Z0d2FyZSBzaG91bGQgd2FpdCBvbgorICogICAgICAgICBQTExSRFkgZmxhZyB0byBiZSBzZXQgaW5kaWNhdGluZyB0aGF0IFBMTCBjbG9jayBpcyBzdGFibGUgYW5kIGNhbgorICogICAgICAgICBiZSB1c2VkIGFzIHN5c3RlbSBjbG9jayBzb3VyY2UuCisgKiBAbm90ZSAgIFRoZSBtYWluIFBMTCBjYW4gbm90IGJlIGRpc2FibGVkIGlmIGl0IGlzIHVzZWQgYXMgc3lzdGVtIGNsb2NrIHNvdXJjZQorICogQG5vdGUgICBUaGUgbWFpbiBQTEwgaXMgZGlzYWJsZWQgYnkgaGFyZHdhcmUgd2hlbiBlbnRlcmluZyBTVE9QIGFuZCBTVEFOREJZCisgKiBtb2Rlcy4KKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX1JDQ19QTExfRU5BQkxFKCkgU0VUX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfUExMT04pCisKKyNkZWZpbmUgX19IQUxfUkNDX1BMTF9ESVNBQkxFKCkgQ0xFQVJfQklUKFJDQy0+Q1IsIFJDQ19DUl9QTExPTikKKworLyoqIEBicmllZiAgTWFjcm8gdG8gY29uZmlndXJlIHRoZSBQTEwgY2xvY2sgc291cmNlLgorICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgdXNlZCBvbmx5IHdoZW4gdGhlIG1haW4gUExMIGlzIGRpc2FibGVkLgorICogQHBhcmFtICBfX1BMTFNPVVJDRV9fIHNwZWNpZmllcyB0aGUgUExMIGVudHJ5IGNsb2NrIHNvdXJjZS4KKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QTExTT1VSQ0VfTk9ORSAgTm8gY2xvY2sgc2VsZWN0ZWQgYXMgUExMIGNsb2NrIGVudHJ5CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUExMU09VUkNFX0hTSSAgSFNJIG9zY2lsbGF0b3IgY2xvY2sgc2VsZWN0ZWQgYXMgUExMCisgKiBjbG9jayBlbnRyeQorICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BMTFNPVVJDRV9IU0UgIEhTRSBvc2NpbGxhdG9yIGNsb2NrIHNlbGVjdGVkIGFzIFBMTAorICogY2xvY2sgZW50cnkKKyAqIEByZXR2YWwgTm9uZQorICoKKyAqLworI2RlZmluZSBfX0hBTF9SQ0NfUExMX1BMTFNPVVJDRV9DT05GSUcoX19QTExTT1VSQ0VfXykgXAorICBNT0RJRllfUkVHKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMU1JDLCAoX19QTExTT1VSQ0VfXykpCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgUExMIHNvdXJjZSBkaXZpc2lvbiBmYWN0b3IgTS4KKyAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIHVzZWQgb25seSB3aGVuIHRoZSBtYWluIFBMTCBpcyBkaXNhYmxlZC4KKyAqIEBwYXJhbSAgX19QTExNX18gc3BlY2lmaWVzIHRoZSBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTCBWQ08gaW5wdXQgY2xvY2sKKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX1BMTE1fQ2xvY2tfRGl2aWRlci4KKyAqIEBub3RlICAgWW91IGhhdmUgdG8gc2V0IHRoZSBQTExNIHBhcmFtZXRlciBjb3JyZWN0bHkgdG8gZW5zdXJlIHRoYXQgdGhlIFZDTworICogaW5wdXQgZnJlcXVlbmN5IHJhbmdlcyBmcm9tIDIuNjYgdG8gOCBNSHouIEl0IGlzIHJlY29tbWVuZGVkIHRvIHNlbGVjdCBhCisgKiBmcmVxdWVuY3kgb2YgOCBNSHogdG8gbGltaXQgUExMIGppdHRlci4KKyAqIEByZXR2YWwgTm9uZQorICoKKyAqLworI2RlZmluZSBfX0hBTF9SQ0NfUExMX1BMTE1fQ09ORklHKF9fUExMTV9fKSAgXAorICBNT0RJRllfUkVHKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMTSwgXAorICAgICAgICAgICAgICgoX19QTExNX18pLTEpIDw8IFJDQ19QTExDRkdSX1BMTE1fUG9zKQorCisvKioKKyAqIEBicmllZiAgTWFjcm8gdG8gY29uZmlndXJlIHRoZSBtYWluIFBMTCBjbG9jayBzb3VyY2UsIG11bHRpcGxpY2F0aW9uIGFuZAorICogZGl2aXNpb24gZmFjdG9ycy4KKyAqIEBub3RlICAgVGhpcyBtYWNybyBtdXN0IGJlIHVzZWQgb25seSB3aGVuIHRoZSBtYWluIFBMTCBpcyBkaXNhYmxlZC4KKyAqIEBub3RlICAgVGhpcyBtYWNybyBwcmVzZXJ2ZXMgdGhlIFBMTCdzIG91dHB1dCBjbG9ja3MgZW5hYmxlIHN0YXRlLgorICoKKyAqIEBwYXJhbSAgX19QTExTT1VSQ0VfXyBzcGVjaWZpZXMgdGhlIFBMTCBlbnRyeSBjbG9jayBzb3VyY2UuCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BMTFNPVVJDRV9OT05FICBObyBjbG9jayBzZWxlY3RlZCBhcyBQTEwgY2xvY2sgZW50cnkKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QTExTT1VSQ0VfSFNJICBIU0kgb3NjaWxsYXRvciBjbG9jayBzZWxlY3RlZCBhcyBQTEwKKyAqIGNsb2NrIGVudHJ5CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUExMU09VUkNFX0hTRSAgSFNFIG9zY2lsbGF0b3IgY2xvY2sgc2VsZWN0ZWQgYXMgUExMCisgKiBjbG9jayBlbnRyeQorICoKKyAqIEBwYXJhbSAgX19QTExNX18gc3BlY2lmaWVzIHRoZSBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTCBWQ08gaW5wdXQgY2xvY2suCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfUExMTV9DbG9ja19EaXZpZGVyCisgKiBAbm90ZSAgIFlvdSBoYXZlIHRvIHNldCB0aGUgUExMTSBwYXJhbWV0ZXIgY29ycmVjdGx5IHRvIGVuc3VyZSB0aGF0IHRoZSBWQ08KKyAqIGlucHV0IGZyZXF1ZW5jeSByYW5nZXMgZnJvbSAyLjY2IHRvIDggTUh6LiBJdCBpcyByZWNvbW1lbmRlZCB0byBzZWxlY3QgYQorICogZnJlcXVlbmN5IG9mIDggTUh6IHRvIGxpbWl0IFBMTCBqaXR0ZXIuCisgKgorICogQHBhcmFtICBfX1BMTE5fXyBzcGVjaWZpZXMgdGhlIG11bHRpcGxpY2F0aW9uIGZhY3RvciBmb3IgUExMIFZDTyBvdXRwdXQKKyAqIGNsb2NrLiBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gOCBhbmQgMTI3LgorICogQG5vdGUgICBZb3UgaGF2ZSB0byBzZXQgdGhlIFBMTE4gcGFyYW1ldGVyIGNvcnJlY3RseSB0byBlbnN1cmUgdGhhdCB0aGUgVkNPCisgKiAgICAgICAgIG91dHB1dCBmcmVxdWVuY3kgaXMgYmV0d2VlbiA2NCBhbmQgMzQ0IE1Iei4KKyAqCisgKiBAcGFyYW0gIF9fUExMUF9fIHNwZWNpZmllcyB0aGUgZGl2aXNpb24gZmFjdG9yIGZvciBTQUkgY2xvY2suCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGluIHRoZSByYW5nZSAoMiB0byAzMSkuCisgKgorICogQHBhcmFtICBfX1BMTFFfXyBzcGVjaWZpZXMgdGhlIGRpdmlzaW9uIGZhY3RvciBmb3IgT1RHIEZTLCBTRE1NQzEgYW5kIFJORworICogY2xvY2tzLiBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGluIHRoZSByYW5nZSAoMiwgNCwgNiBvciA4KS4KKyAqIEBub3RlICAgSWYgdGhlIFVTQiBPVEcgRlMgaXMgdXNlZCBpbiB5b3VyIGFwcGxpY2F0aW9uLCB5b3UgaGF2ZSB0byBzZXQgdGhlCisgKiAgICAgICAgIFBMTFEgcGFyYW1ldGVyIGNvcnJlY3RseSB0byBoYXZlIDQ4IE1IeiBjbG9jayBmb3IgdGhlIFVTQi4gSG93ZXZlciwKKyAqICAgICAgICAgdGhlIFNETU1DMSBhbmQgUk5HIG5lZWQgYSBmcmVxdWVuY3kgbG93ZXIgdGhhbiBvciBlcXVhbCB0byA0OCBNSHogdG8KKyAqIHdvcmsgY29ycmVjdGx5LgorICogQHBhcmFtICBfX1BMTFJfXyBzcGVjaWZpZXMgdGhlIGRpdmlzaW9uIGZhY3RvciBmb3IgdGhlIG1haW4gc3lzdGVtIGNsb2NrLgorICogQG5vdGUgICBZb3UgaGF2ZSB0byBzZXQgdGhlIFBMTFIgcGFyYW1ldGVyIGNvcnJlY3RseSB0byBub3QgZXhjZWVkIDE3ME1IWi4KKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgaW4gdGhlIHJhbmdlICgyLCA0LCA2IG9yIDgpLgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfUkNDX1BMTF9DT05GSUcoX19QTExTT1VSQ0VfXywgX19QTExNX18sIF9fUExMTl9fLCBfX1BMTFBfXywgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fUExMUV9fLCBfX1BMTFJfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBNT0RJRllfUkVHKFJDQy0+UExMQ0ZHUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAoUkNDX1BMTENGR1JfUExMU1JDIHwgUkNDX1BMTENGR1JfUExMTSB8IFJDQ19QTExDRkdSX1BMTE4gfCAgICBcCisgICAgICAgICAgICAgIFJDQ19QTExDRkdSX1BMTFEgfCBSQ0NfUExMQ0ZHUl9QTExSIHwgUkNDX1BMTENGR1JfUExMUERJViksICAgXAorICAgICAgICAgICAgICgoX19QTExTT1VSQ0VfXykgfCAoKChfX1BMTE1fXyktMVUpIDw8IFJDQ19QTExDRkdSX1BMTE1fUG9zKSB8IFwKKyAgICAgICAgICAgICAgKChfX1BMTE5fXykgPDwgUkNDX1BMTENGR1JfUExMTl9Qb3MpIHwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICgoKChfX1BMTFFfXykgPj4gMVUpIC0gMVUpIDw8IFJDQ19QTExDRkdSX1BMTFFfUG9zKSB8ICAgICAgICAgXAorICAgICAgICAgICAgICAoKCgoX19QTExSX18pID4+IDFVKSAtIDFVKSA8PCBSQ0NfUExMQ0ZHUl9QTExSX1BvcykgfCAgICAgICAgIFwKKyAgICAgICAgICAgICAgKChfX1BMTFBfXykgPDwgUkNDX1BMTENGR1JfUExMUERJVl9Qb3MpKSkKKworLyoqIEBicmllZiAgTWFjcm8gdG8gZ2V0IHRoZSBvc2NpbGxhdG9yIHVzZWQgYXMgUExMIGNsb2NrIHNvdXJjZS4KKyAqIEByZXR2YWwgVGhlIG9zY2lsbGF0b3IgdXNlZCBhcyBQTEwgY2xvY2sgc291cmNlLiBUaGUgcmV0dXJuZWQgdmFsdWUgY2FuIGJlCisgKiBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKyAqICAgICAgICAgICAgICAtIFJDQ19QTExTT1VSQ0VfTk9ORTogTm8gb3NjaWxsYXRvciBpcyB1c2VkIGFzIFBMTCBjbG9jayBzb3VyY2UuCisgKiAgICAgICAgICAgICAgLSBSQ0NfUExMU09VUkNFX0hTSTogSFNJIG9zY2lsbGF0b3IgaXMgdXNlZCBhcyBQTEwgY2xvY2sgc291cmNlLgorICogICAgICAgICAgICAgIC0gUkNDX1BMTFNPVVJDRV9IU0U6IEhTRSBvc2NpbGxhdG9yIGlzIHVzZWQgYXMgUExMIGNsb2NrIHNvdXJjZS4KKyAqLworI2RlZmluZSBfX0hBTF9SQ0NfR0VUX1BMTF9PU0NTT1VSQ0UoKSBcCisgIChSRUFEX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTFNSQykpCisKKy8qKgorICogQGJyaWVmICBFbmFibGUgb3IgZGlzYWJsZSBlYWNoIGNsb2NrIG91dHB1dCAoUkNDX1BMTF9TWVNDTEssIFJDQ19QTExfNDhNMUNMSywKKyAqIFJDQ19QTExfQURDQ0xLKQorICogQG5vdGUgICBFbmFibGluZy9kaXNhYmxpbmcgY2xvY2sgb3V0cHV0cyBSQ0NfUExMX0FEQ0NMSyBhbmQgUkNDX1BMTF80OE0xQ0xLCisgKiBjYW4gYmUgZG9uZSBhdCBhbnl0aW1lIHdpdGhvdXQgdGhlIG5lZWQgdG8gc3RvcCB0aGUgUExMIGluIG9yZGVyIHRvIHNhdmUKKyAqIHBvd2VyLiBCdXQgUkNDX1BMTF9TWVNDTEsgY2Fubm90IGJlIHN0b3BwZWQgaWYgdXNlZCBhcyBTeXN0ZW0gQ2xvY2suCisgKiBAcGFyYW0gIF9fUExMQ0xPQ0tPVVRfXyBzcGVjaWZpZXMgdGhlIFBMTCBjbG9jayB0byBiZSBvdXRwdXQuCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9yIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUExMX0FEQ0NMSyAgVGhpcyBjbG9jayBpcyB1c2VkIHRvIGdlbmVyYXRlIGEgY2xvY2sKKyAqIG9uIEFEQy4KKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QTExfNDhNMUNMSyAgVGhpcyBDbG9jayBpcyB1c2VkIHRvIGdlbmVyYXRlIHRoZQorICogY2xvY2sgZm9yIHRoZSBVU0IgKDQ4IE1IeiksIEZEQ0FOICg8PTQ4IE1IeikgYW5kIFFTUEkgKDw9NDggTUh6KS4KKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QTExfU1lTQ0xLICBUaGlzIENsb2NrIGlzIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGhpZ2gKKyAqIHNwZWVkIHN5c3RlbSBjbG9jayAodXAgdG8gMTcwTUh6KQorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfUkNDX1BMTENMS09VVF9FTkFCTEUoX19QTExDTE9DS09VVF9fKSBcCisgIFNFVF9CSVQoUkNDLT5QTExDRkdSLCAoX19QTExDTE9DS09VVF9fKSkKKworI2RlZmluZSBfX0hBTF9SQ0NfUExMQ0xLT1VUX0RJU0FCTEUoX19QTExDTE9DS09VVF9fKSBcCisgIENMRUFSX0JJVChSQ0MtPlBMTENGR1IsIChfX1BMTENMT0NLT1VUX18pKQorCisvKioKKyAqIEBicmllZiAgR2V0IGNsb2NrIG91dHB1dCBlbmFibGUgc3RhdHVzIChSQ0NfUExMX1NZU0NMSywgUkNDX1BMTF80OE0xQ0xLLAorICogUkNDX1BMTF9TQUkzQ0xLKQorICogQHBhcmFtICBfX1BMTENMT0NLT1VUX18gc3BlY2lmaWVzIHRoZSBvdXRwdXQgUExMIGNsb2NrIHRvIGJlIGNoZWNrZWQuCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BMTF9BRENDTEsgIFRoaXMgY2xvY2sgaXMgdXNlZCB0byBnZW5lcmF0ZSBhIGNsb2NrCisgKiBvbiBBREMuCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUExMXzQ4TTFDTEsgIFRoaXMgQ2xvY2sgaXMgdXNlZCB0byBnZW5lcmF0ZSB0aGUKKyAqIGNsb2NrIGZvciB0aGUgVVNCICg0OCBNSHopLCBGRENBTiAoPD00OCBNSHopIGFuZCBRU1BJICg8PTQ4IE1IeikuCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUExMX1NZU0NMSyAgVGhpcyBDbG9jayBpcyB1c2VkIHRvIGdlbmVyYXRlIHRoZSBoaWdoCisgKiBzcGVlZCBzeXN0ZW0gY2xvY2sgKHVwIHRvIDE3ME1IeikKKyAqIEByZXR2YWwgU0VUIC8gUkVTRVQKKyAqLworI2RlZmluZSBfX0hBTF9SQ0NfR0VUX1BMTENMS09VVF9DT05GSUcoX19QTExDTE9DS09VVF9fKSBcCisgIFJFQURfQklUKFJDQy0+UExMQ0ZHUiwgKF9fUExMQ0xPQ0tPVVRfXykpCisKKy8qKgorICogQGJyaWVmICBNYWNybyB0byBjb25maWd1cmUgdGhlIHN5c3RlbSBjbG9jayBzb3VyY2UuCisgKiBAcGFyYW0gIF9fU1lTQ0xLU09VUkNFX18gc3BlY2lmaWVzIHRoZSBzeXN0ZW0gY2xvY2sgc291cmNlLgorICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgICAtIFJDQ19TWVNDTEtTT1VSQ0VfSFNJOiBIU0kgb3NjaWxsYXRvciBpcyB1c2VkIGFzIHN5c3RlbSBjbG9jaworICogc291cmNlLgorICogICAgICAgICAgICAgIC0gUkNDX1NZU0NMS1NPVVJDRV9IU0U6IEhTRSBvc2NpbGxhdG9yIGlzIHVzZWQgYXMgc3lzdGVtIGNsb2NrCisgKiBzb3VyY2UuCisgKiAgICAgICAgICAgICAgLSBSQ0NfU1lTQ0xLU09VUkNFX1BMTENMSzogUExMIG91dHB1dCBpcyB1c2VkIGFzIHN5c3RlbSBjbG9jaworICogc291cmNlLgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfUkNDX1NZU0NMS19DT05GSUcoX19TWVNDTEtTT1VSQ0VfXykgXAorICBNT0RJRllfUkVHKFJDQy0+Q0ZHUiwgUkNDX0NGR1JfU1csIChfX1NZU0NMS1NPVVJDRV9fKSkKKworLyoqIEBicmllZiAgTWFjcm8gdG8gZ2V0IHRoZSBjbG9jayBzb3VyY2UgdXNlZCBhcyBzeXN0ZW0gY2xvY2suCisgKiBAcmV0dmFsIFRoZSBjbG9jayBzb3VyY2UgdXNlZCBhcyBzeXN0ZW0gY2xvY2suIFRoZSByZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lCisgKiAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmc6CisgKiAgICAgICAgICAgICAgLSBSQ0NfU1lTQ0xLU09VUkNFX1NUQVRVU19IU0k6IEhTSSB1c2VkIGFzIHN5c3RlbSBjbG9jay4KKyAqICAgICAgICAgICAgICAtIFJDQ19TWVNDTEtTT1VSQ0VfU1RBVFVTX0hTRTogSFNFIHVzZWQgYXMgc3lzdGVtIGNsb2NrLgorICogICAgICAgICAgICAgIC0gUkNDX1NZU0NMS1NPVVJDRV9TVEFUVVNfUExMQ0xLOiBQTEwgdXNlZCBhcyBzeXN0ZW0gY2xvY2suCisgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0dFVF9TWVNDTEtfU09VUkNFKCkgKFJFQURfQklUKFJDQy0+Q0ZHUiwgUkNDX0NGR1JfU1dTKSkKKworLyoqCisgKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgRXh0ZXJuYWwgTG93IFNwZWVkIG9zY2lsbGF0b3IgKExTRSkgZHJpdmUKKyAqIGNhcGFiaWxpdHkuCisgKiBAbm90ZSAgIEFzIHRoZSBMU0UgaXMgaW4gdGhlIEJhY2t1cCBkb21haW4gYW5kIHdyaXRlIGFjY2VzcyBpcyBkZW5pZWQgdG8KKyAqICAgICAgICAgdGhpcyBkb21haW4gYWZ0ZXIgcmVzZXQsIHlvdSBoYXZlIHRvIGVuYWJsZSB3cml0ZSBhY2Nlc3MgdXNpbmcKKyAqICAgICAgICAgSEFMX1BXUl9FbmFibGVCa1VwQWNjZXNzKCkgZnVuY3Rpb24gYmVmb3JlIHRvIGNvbmZpZ3VyZSB0aGUgTFNFCisgKiAgICAgICAgICh0byBiZSBkb25lIG9uY2UgYWZ0ZXIgcmVzZXQpLgorICogQHBhcmFtICBfX0xTRURSSVZFX18gc3BlY2lmaWVzIHRoZSBuZXcgc3RhdGUgb2YgdGhlIExTRSBkcml2ZSBjYXBhYmlsaXR5LgorICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19MU0VEUklWRV9MT1cgIExTRSBvc2NpbGxhdG9yIGxvdyBkcml2ZSBjYXBhYmlsaXR5LgorICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0xTRURSSVZFX01FRElVTUxPVyAgTFNFIG9zY2lsbGF0b3IgbWVkaXVtIGxvdyBkcml2ZQorICogY2FwYWJpbGl0eS4KKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19MU0VEUklWRV9NRURJVU1ISUdIICBMU0Ugb3NjaWxsYXRvciBtZWRpdW0gaGlnaAorICogZHJpdmUgY2FwYWJpbGl0eS4KKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19MU0VEUklWRV9ISUdIICBMU0Ugb3NjaWxsYXRvciBoaWdoIGRyaXZlIGNhcGFiaWxpdHkuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9SQ0NfTFNFRFJJVkVfQ09ORklHKF9fTFNFRFJJVkVfXykgXAorICBNT0RJRllfUkVHKFJDQy0+QkRDUiwgUkNDX0JEQ1JfTFNFRFJWLCAoX19MU0VEUklWRV9fKSkKKworLyoqIEBicmllZiAgTWFjcm8gdG8gY29uZmlndXJlIHRoZSBNQ08gY2xvY2suCisgKiBAcGFyYW0gIF9fTUNPQ0xLU09VUkNFX18gc3BlY2lmaWVzIHRoZSBNQ08gY2xvY2sgc291cmNlLgorICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ08xU09VUkNFX05PQ0xPQ0sgIE1DTyBvdXRwdXQgZGlzYWJsZWQKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ08xU09VUkNFX1NZU0NMSyAgU3lzdGVtICBjbG9jayBzZWxlY3RlZCBhcyBNQ08KKyAqIHNvdXJjZQorICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DTzFTT1VSQ0VfSFNJICBIU0kgY2xvY2sgc2VsZWN0ZWQgYXMgTUNPIHNvdXJjZQorICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DTzFTT1VSQ0VfSFNFICBIU0UgY2xvY2sgc2VsZWN0ZWQgYXMgTUNPIHNvdXJjZQorICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DTzFTT1VSQ0VfUExMQ0xLICBNYWluIFBMTCBjbG9jayBzZWxlY3RlZCBhcyBNQ08KKyAqIHNvdXJjZQorICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DTzFTT1VSQ0VfTFNJICBMU0kgY2xvY2sgc2VsZWN0ZWQgYXMgTUNPIHNvdXJjZQorICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DTzFTT1VSQ0VfTFNFICBMU0UgY2xvY2sgc2VsZWN0ZWQgYXMgTUNPIHNvdXJjZQorICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DTzFTT1VSQ0VfSFNJNDggIEhTSTQ4IGNsb2NrIHNlbGVjdGVkIGFzIE1DTyBzb3VyY2UKKyAqIGZvciBkZXZpY2VzIHdpdGggSFNJNDgKKyAqIEBwYXJhbSAgX19NQ09ESVZfXyBzcGVjaWZpZXMgdGhlIE1DTyBjbG9jayBwcmVzY2FsZXIuCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DT0RJVl8xICAgTUNPIGNsb2NrIHNvdXJjZSBpcyBkaXZpZGVkIGJ5IDEKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ09ESVZfMiAgIE1DTyBjbG9jayBzb3VyY2UgaXMgZGl2aWRlZCBieSAyCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPRElWXzQgICBNQ08gY2xvY2sgc291cmNlIGlzIGRpdmlkZWQgYnkgNAorICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DT0RJVl84ICAgTUNPIGNsb2NrIHNvdXJjZSBpcyBkaXZpZGVkIGJ5IDgKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ09ESVZfMTYgIE1DTyBjbG9jayBzb3VyY2UgaXMgZGl2aWRlZCBieSAxNgorICovCisjZGVmaW5lIF9fSEFMX1JDQ19NQ08xX0NPTkZJRyhfX01DT0NMS1NPVVJDRV9fLCBfX01DT0RJVl9fKSAgXAorICBNT0RJRllfUkVHKFJDQy0+Q0ZHUiwgKFJDQ19DRkdSX01DT1NFTCB8IFJDQ19DRkdSX01DT1BSRSksIFwKKyAgICAgICAgICAgICAoKF9fTUNPQ0xLU09VUkNFX18pIHwgKF9fTUNPRElWX18pKSkKKworLyoqIEBkZWZncm91cCBSQ0NfRmxhZ3NfSW50ZXJydXB0c19NYW5hZ2VtZW50IEZsYWdzIEludGVycnVwdHMgTWFuYWdlbWVudAorICogQGJyaWVmIG1hY3JvcyB0byBtYW5hZ2UgdGhlIHNwZWNpZmllZCBSQ0MgRmxhZ3MgYW5kIGludGVycnVwdHMuCisgKiBAeworICovCisKKy8qKiBAYnJpZWYgIEVuYWJsZSBSQ0MgaW50ZXJydXB0IChQZXJmb3JtIEJ5dGUgYWNjZXNzIHRvIFJDQ19DSVJbMTQ6OF0gYml0cyB0bworICogZW5hYmxlIHRoZSBzZWxlY3RlZCBpbnRlcnJ1cHRzKS4KKyAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFJDQyBpbnRlcnJ1cHQgc291cmNlcyB0byBiZSBlbmFibGVkLgorICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX0xTSVJEWSAgTFNJIHJlYWR5IGludGVycnVwdAorICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX0xTRVJEWSAgTFNFIHJlYWR5IGludGVycnVwdAorICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX0hTSVJEWSAgSFNJIHJlYWR5IGludGVycnVwdAorICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX0hTRVJEWSAgSFNFIHJlYWR5IGludGVycnVwdAorICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX1BMTFJEWSAgTWFpbiBQTEwgcmVhZHkgaW50ZXJydXB0CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfTFNFQ1NTICBMU0UgQ2xvY2sgc2VjdXJpdHkgc3lzdGVtIGludGVycnVwdAorICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX0hTSTQ4UkRZICBIU0k0OCByZWFkeSBpbnRlcnJ1cHQgZm9yIGRldmljZXMgd2l0aAorICogSFNJNDgKKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX1JDQ19FTkFCTEVfSVQoX19JTlRFUlJVUFRfXykgU0VUX0JJVChSQ0MtPkNJRVIsIChfX0lOVEVSUlVQVF9fKSkKKworLyoqIEBicmllZiBEaXNhYmxlIFJDQyBpbnRlcnJ1cHQgKFBlcmZvcm0gQnl0ZSBhY2Nlc3MgdG8gUkNDX0NJUlsxNDo4XSBiaXRzIHRvCisgKiBkaXNhYmxlIHRoZSBzZWxlY3RlZCBpbnRlcnJ1cHRzKS4KKyAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFJDQyBpbnRlcnJ1cHQgc291cmNlcyB0byBiZSBkaXNhYmxlZC4KKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JVF9MU0lSRFkgIExTSSByZWFkeSBpbnRlcnJ1cHQKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JVF9MU0VSRFkgIExTRSByZWFkeSBpbnRlcnJ1cHQKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JVF9IU0lSRFkgIEhTSSByZWFkeSBpbnRlcnJ1cHQKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JVF9IU0VSRFkgIEhTRSByZWFkeSBpbnRlcnJ1cHQKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JVF9QTExSRFkgIE1haW4gUExMIHJlYWR5IGludGVycnVwdAorICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX0xTRUNTUyAgTFNFIENsb2NrIHNlY3VyaXR5IHN5c3RlbSBpbnRlcnJ1cHQKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JVF9IU0k0OFJEWSAgSFNJNDggcmVhZHkgaW50ZXJydXB0IGZvciBkZXZpY2VzIHdpdGgKKyAqIEhTSTQ4CisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9SQ0NfRElTQUJMRV9JVChfX0lOVEVSUlVQVF9fKSBcCisgIENMRUFSX0JJVChSQ0MtPkNJRVIsIChfX0lOVEVSUlVQVF9fKSkKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIFJDQydzIGludGVycnVwdCBwZW5kaW5nIGJpdHMgKFBlcmZvcm0gQnl0ZSBhY2Nlc3MgdG8KKyAqIFJDQ19DSVJbMjM6MTZdIGJpdHMgdG8gY2xlYXIgdGhlIHNlbGVjdGVkIGludGVycnVwdCBwZW5kaW5nIGJpdHMuCisgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBpbnRlcnJ1cHQgcGVuZGluZyBiaXQgdG8gY2xlYXIuCisgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfTFNJUkRZICBMU0kgcmVhZHkgaW50ZXJydXB0CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfTFNFUkRZICBMU0UgcmVhZHkgaW50ZXJydXB0CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfSFNJUkRZICBIU0kgcmVhZHkgaW50ZXJydXB0CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfSFNFUkRZICBIU0UgcmVhZHkgaW50ZXJydXB0CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfUExMUkRZICBNYWluIFBMTCByZWFkeSBpbnRlcnJ1cHQKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JVF9DU1MgIEhTRSBDbG9jayBzZWN1cml0eSBzeXN0ZW0gaW50ZXJydXB0CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfTFNFQ1NTICBMU0UgQ2xvY2sgc2VjdXJpdHkgc3lzdGVtIGludGVycnVwdAorICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX0hTSTQ4UkRZICBIU0k0OCByZWFkeSBpbnRlcnJ1cHQgZm9yIGRldmljZXMgd2l0aAorICogSFNJNDgKKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX1JDQ19DTEVBUl9JVChfX0lOVEVSUlVQVF9fKSAoUkNDLT5DSUNSID0gKF9fSU5URVJSVVBUX18pKQorCisvKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBSQ0MgaW50ZXJydXB0IGhhcyBvY2N1cnJlZCBvciBub3QuCisgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBSQ0MgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjay4KKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JVF9MU0lSRFkgIExTSSByZWFkeSBpbnRlcnJ1cHQKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JVF9MU0VSRFkgIExTRSByZWFkeSBpbnRlcnJ1cHQKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JVF9IU0lSRFkgIEhTSSByZWFkeSBpbnRlcnJ1cHQKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JVF9IU0VSRFkgIEhTRSByZWFkeSBpbnRlcnJ1cHQKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JVF9QTExSRFkgIE1haW4gUExMIHJlYWR5IGludGVycnVwdAorICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX0NTUyAgSFNFIENsb2NrIHNlY3VyaXR5IHN5c3RlbSBpbnRlcnJ1cHQKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JVF9MU0VDU1MgIExTRSBDbG9jayBzZWN1cml0eSBzeXN0ZW0gaW50ZXJydXB0CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfSFNJNDhSRFkgSFNJNDggcmVhZHkgaW50ZXJydXB0IGZvciBkZXZpY2VzIHdpdGgKKyAqIEhTSTQ4CisgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgX19JTlRFUlJVUFRfXyAoVFJVRSBvciBGQUxTRSkuCisgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0dFVF9JVChfX0lOVEVSUlVQVF9fKSBcCisgICgoUkNDLT5DSUZSICYgKF9fSU5URVJSVVBUX18pKSA9PSAoX19JTlRFUlJVUFRfXykpCisKKy8qKiBAYnJpZWYgU2V0IFJNVkYgYml0IHRvIGNsZWFyIHRoZSByZXNldCBmbGFncy4KKyAqICAgICAgICBUaGUgcmVzZXQgZmxhZ3MgYXJlOiBSQ0NfRkxBR19GV1JSU1QsIFJDQ19GTEFHX09CTFJTVCwKKyAqIFJDQ19GTEFHX1BJTlJTVCwgUkNDX0ZMQUdfQk9SUlNULCBSQ0NfRkxBR19TRlRSU1QsIFJDQ19GTEFHX0lXREdSU1QsCisgKiBSQ0NfRkxBR19XV0RHUlNUIGFuZCBSQ0NfRkxBR19MUFdSUlNULgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0NMRUFSX1JFU0VUX0ZMQUdTKCkgKFJDQy0+Q1NSIHw9IFJDQ19DU1JfUk1WRikKKworLyoqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc2VsZWN0ZWQgUkNDIGZsYWcgaXMgc2V0IG9yIG5vdC4KKyAqIEBwYXJhbSAgX19GTEFHX18gc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNoZWNrLgorICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0ZMQUdfSFNJUkRZICBIU0kgb3NjaWxsYXRvciBjbG9jayByZWFkeQorICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0ZMQUdfSFNFUkRZICBIU0Ugb3NjaWxsYXRvciBjbG9jayByZWFkeQorICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0ZMQUdfUExMUkRZICBNYWluIFBMTCBjbG9jayByZWFkeQorICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0ZMQUdfSFNJNDhSRFkgIEhTSTQ4IGNsb2NrIHJlYWR5IGZvciBkZXZpY2VzIHdpdGgKKyAqIEhTSTQ4CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfRkxBR19MU0VSRFkgIExTRSBvc2NpbGxhdG9yIGNsb2NrIHJlYWR5CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfRkxBR19MU0VDU1NEICBDbG9jayBzZWN1cml0eSBzeXN0ZW0gZmFpbHVyZSBvbiBMU0UKKyAqIG9zY2lsbGF0b3IgZGV0ZWN0aW9uCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfRkxBR19MU0lSRFkgIExTSSBvc2NpbGxhdG9yIGNsb2NrIHJlYWR5CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfRkxBR19CT1JSU1QgIEJPUiByZXNldAorICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0ZMQUdfT0JMUlNUICBPQkxSU1QgcmVzZXQKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19GTEFHX1BJTlJTVCAgUGluIHJlc2V0CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfRkxBR19TRlRSU1QgIFNvZnR3YXJlIHJlc2V0CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfRkxBR19JV0RHUlNUICBJbmRlcGVuZGVudCBXYXRjaGRvZyByZXNldAorICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0ZMQUdfV1dER1JTVCAgV2luZG93IFdhdGNoZG9nIHJlc2V0CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfRkxBR19MUFdSUlNUICBMb3cgUG93ZXIgcmVzZXQKKyAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0ZMQUdfXyAoVFJVRSBvciBGQUxTRSkuCisgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0dFVF9GTEFHKF9fRkxBR19fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoKCgoKF9fRkxBR19fKSA+PiA1VSkgPT0gMVUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICA/IFJDQy0+Q1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICA6ICgoKChfX0ZMQUdfXykgPj4gNVUpID09IDRVKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgPyBSQ0MtPkNSUkNSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgOiAoKCgoX19GTEFHX18pID4+IDVVKSA9PSAyVSkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgID8gUkNDLT5CRENSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIDogKCgoKF9fRkxBR19fKSA+PiA1VSkgPT0gM1UpID8gUkNDLT5DU1IgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUkNDLT5DSUZSKSkpKSAmIFwKKyAgICAgKCh1aW50MzJfdCkxVSA8PCAoKF9fRkxBR19fKSAmIFJDQ19GTEFHX01BU0spKSkgIT0gMFUpICAgICAgICAgICAgIFwKKyAgICAgICA/IDFVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICA6IDBVKQorCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgUkNDX1ByaXZhdGVfQ29uc3RhbnRzCisgKiBAeworICovCisvKiBEZWZpbmVzIHVzZWQgZm9yIEZsYWdzICovCisjZGVmaW5lIENSX1JFR19JTkRFWCAxVQorI2RlZmluZSBCRENSX1JFR19JTkRFWCAyVQorI2RlZmluZSBDU1JfUkVHX0lOREVYIDNVCisjZGVmaW5lIENSUkNSX1JFR19JTkRFWCA0VQorCisjZGVmaW5lIFJDQ19GTEFHX01BU0sgMHgxRlUKKworLyogRGVmaW5lIHVzZWQgZm9yIElTX1JDQ19DTE9DS1RZUEUoKSAqLworI2RlZmluZSBSQ0NfQ0xPQ0tUWVBFX0FMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoUkNDX0NMT0NLVFlQRV9TWVNDTEsgfCBSQ0NfQ0xPQ0tUWVBFX0hDTEsgfCBSQ0NfQ0xPQ0tUWVBFX1BDTEsxIHwgXAorICAgUkNDX0NMT0NLVFlQRV9QQ0xLMikgLyohPCBBbGwgY2xjb2t0eXBlIHRvIGNvbmZpZ3VyZSAqLworCisvKioKKyAqIEB9CisgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBSQ0NfUHJpdmF0ZV9NYWNyb3MKKyAqIEB7CisgKi8KKworI2RlZmluZSBJU19SQ0NfT1NDSUxMQVRPUlRZUEUoX19PU0NJTExBVE9SX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKChfX09TQ0lMTEFUT1JfXykgPT0gUkNDX09TQ0lMTEFUT1JUWVBFX05PTkUpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKCgoX19PU0NJTExBVE9SX18pICYgUkNDX09TQ0lMTEFUT1JUWVBFX0hTRSkgPT0gUkNDX09TQ0lMTEFUT1JUWVBFX0hTRSkgfHwgXAorICAgKCgoX19PU0NJTExBVE9SX18pICYgUkNDX09TQ0lMTEFUT1JUWVBFX0hTSSkgPT0gUkNDX09TQ0lMTEFUT1JUWVBFX0hTSSkgfHwgXAorICAgKCgoX19PU0NJTExBVE9SX18pICYgUkNDX09TQ0lMTEFUT1JUWVBFX0hTSTQ4KSA9PSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFJDQ19PU0NJTExBVE9SVFlQRV9IU0k0OCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKCgoX19PU0NJTExBVE9SX18pICYgUkNDX09TQ0lMTEFUT1JUWVBFX0xTSSkgPT0gUkNDX09TQ0lMTEFUT1JUWVBFX0xTSSkgfHwgXAorICAgKCgoX19PU0NJTExBVE9SX18pICYgUkNDX09TQ0lMTEFUT1JUWVBFX0xTRSkgPT0gUkNDX09TQ0lMTEFUT1JUWVBFX0xTRSkpCisKKyNkZWZpbmUgSVNfUkNDX0hTRShfX0hTRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKChfX0hTRV9fKSA9PSBSQ0NfSFNFX09GRikgfHwgKChfX0hTRV9fKSA9PSBSQ0NfSFNFX09OKSB8fCBcCisgICAoKF9fSFNFX18pID09IFJDQ19IU0VfQllQQVNTKSkKKworI2RlZmluZSBJU19SQ0NfTFNFKF9fTFNFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKF9fTFNFX18pID09IFJDQ19MU0VfT0ZGKSB8fCAoKF9fTFNFX18pID09IFJDQ19MU0VfT04pIHx8IFwKKyAgICgoX19MU0VfXykgPT0gUkNDX0xTRV9CWVBBU1MpKQorCisjZGVmaW5lIElTX1JDQ19IU0koX19IU0lfXykgXAorICAoKChfX0hTSV9fKSA9PSBSQ0NfSFNJX09GRikgfHwgKChfX0hTSV9fKSA9PSBSQ0NfSFNJX09OKSkKKworI2RlZmluZSBJU19SQ0NfSFNJX0NBTElCUkFUSU9OX1ZBTFVFKF9fVkFMVUVfXykgXAorICAoKF9fVkFMVUVfXykgPD0gKFJDQ19JQ1NDUl9IU0lUUklNID4+IFJDQ19JQ1NDUl9IU0lUUklNX1BvcykpCisKKyNkZWZpbmUgSVNfUkNDX0xTSShfX0xTSV9fKSBcCisgICgoKF9fTFNJX18pID09IFJDQ19MU0lfT0ZGKSB8fCAoKF9fTFNJX18pID09IFJDQ19MU0lfT04pKQorCisjZGVmaW5lIElTX1JDQ19IU0k0OChfX0hTSTQ4X18pIFwKKyAgKCgoX19IU0k0OF9fKSA9PSBSQ0NfSFNJNDhfT0ZGKSB8fCAoKF9fSFNJNDhfXykgPT0gUkNDX0hTSTQ4X09OKSkKKworI2RlZmluZSBJU19SQ0NfUExMKF9fUExMX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoX19QTExfXykgPT0gUkNDX1BMTF9OT05FKSB8fCAoKF9fUExMX18pID09IFJDQ19QTExfT0ZGKSB8fCBcCisgICAoKF9fUExMX18pID09IFJDQ19QTExfT04pKQorCisjZGVmaW5lIElTX1JDQ19QTExTT1VSQ0UoX19TT1VSQ0VfXykgICAgICAgXAorICAoKChfX1NPVVJDRV9fKSA9PSBSQ0NfUExMU09VUkNFX05PTkUpIHx8IFwKKyAgICgoX19TT1VSQ0VfXykgPT0gUkNDX1BMTFNPVVJDRV9IU0kpIHx8ICgoX19TT1VSQ0VfXykgPT0gUkNDX1BMTFNPVVJDRV9IU0UpKQorCisjZGVmaW5lIElTX1JDQ19QTExNX1ZBTFVFKF9fVkFMVUVfXykgXAorICAoKDFVIDw9IChfX1ZBTFVFX18pKSAmJiAoKF9fVkFMVUVfXykgPD0gMTZVKSkKKworI2RlZmluZSBJU19SQ0NfUExMTl9WQUxVRShfX1ZBTFVFX18pIFwKKyAgKCg4VSA8PSAoX19WQUxVRV9fKSkgJiYgKChfX1ZBTFVFX18pIDw9IDEyN1UpKQorCisjZGVmaW5lIElTX1JDQ19QTExQX1ZBTFVFKF9fVkFMVUVfXykgXAorICAoKChfX1ZBTFVFX18pID49IDJVKSAmJiAoKF9fVkFMVUVfXykgPD0gMzFVKSkKKworI2RlZmluZSBJU19SQ0NfUExMUV9WQUxVRShfX1ZBTFVFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKChfX1ZBTFVFX18pID09IDJVKSB8fCAoKF9fVkFMVUVfXykgPT0gNFUpIHx8ICgoX19WQUxVRV9fKSA9PSA2VSkgfHwgXAorICAgKChfX1ZBTFVFX18pID09IDhVKSkKKworI2RlZmluZSBJU19SQ0NfUExMUl9WQUxVRShfX1ZBTFVFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKChfX1ZBTFVFX18pID09IDJVKSB8fCAoKF9fVkFMVUVfXykgPT0gNFUpIHx8ICgoX19WQUxVRV9fKSA9PSA2VSkgfHwgXAorICAgKChfX1ZBTFVFX18pID09IDhVKSkKKworI2RlZmluZSBJU19SQ0NfQ0xPQ0tUWVBFKF9fQ0xLX18pICAgICAgICAgICAgICAgICBcCisgICgoKChfX0NMS19fKSAmIFJDQ19DTE9DS1RZUEVfQUxMKSAhPSAweDAwVUwpICYmIFwKKyAgICgoKF9fQ0xLX18pICYgflJDQ19DTE9DS1RZUEVfQUxMKSA9PSAweDAwVUwpKQorCisjZGVmaW5lIElTX1JDQ19TWVNDTEtTT1VSQ0UoX19TT1VSQ0VfXykgICAgICBcCisgICgoKF9fU09VUkNFX18pID09IFJDQ19TWVNDTEtTT1VSQ0VfSFNJKSB8fCBcCisgICAoKF9fU09VUkNFX18pID09IFJDQ19TWVNDTEtTT1VSQ0VfSFNFKSB8fCBcCisgICAoKF9fU09VUkNFX18pID09IFJDQ19TWVNDTEtTT1VSQ0VfUExMQ0xLKSkKKworI2RlZmluZSBJU19SQ0NfSENMSyhfX0hDTEtfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKF9fSENMS19fKSA9PSBSQ0NfU1lTQ0xLX0RJVjEpIHx8ICgoX19IQ0xLX18pID09IFJDQ19TWVNDTEtfRElWMikgfHwgICAgIFwKKyAgICgoX19IQ0xLX18pID09IFJDQ19TWVNDTEtfRElWNCkgfHwgKChfX0hDTEtfXykgPT0gUkNDX1NZU0NMS19ESVY4KSB8fCAgICAgXAorICAgKChfX0hDTEtfXykgPT0gUkNDX1NZU0NMS19ESVYxNikgfHwgKChfX0hDTEtfXykgPT0gUkNDX1NZU0NMS19ESVY2NCkgfHwgICBcCisgICAoKF9fSENMS19fKSA9PSBSQ0NfU1lTQ0xLX0RJVjEyOCkgfHwgKChfX0hDTEtfXykgPT0gUkNDX1NZU0NMS19ESVYyNTYpIHx8IFwKKyAgICgoX19IQ0xLX18pID09IFJDQ19TWVNDTEtfRElWNTEyKSkKKworI2RlZmluZSBJU19SQ0NfUENMSyhfX1BDTEtfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKChfX1BDTEtfXykgPT0gUkNDX0hDTEtfRElWMSkgfHwgKChfX1BDTEtfXykgPT0gUkNDX0hDTEtfRElWMikgfHwgXAorICAgKChfX1BDTEtfXykgPT0gUkNDX0hDTEtfRElWNCkgfHwgKChfX1BDTEtfXykgPT0gUkNDX0hDTEtfRElWOCkgfHwgXAorICAgKChfX1BDTEtfXykgPT0gUkNDX0hDTEtfRElWMTYpKQorCisjZGVmaW5lIElTX1JDQ19SVENDTEtTT1VSQ0UoX19TT1VSQ0VfXykgICAgICAgXAorICAoKChfX1NPVVJDRV9fKSA9PSBSQ0NfUlRDQ0xLU09VUkNFX05PTkUpIHx8IFwKKyAgICgoX19TT1VSQ0VfXykgPT0gUkNDX1JUQ0NMS1NPVVJDRV9MU0UpIHx8ICBcCisgICAoKF9fU09VUkNFX18pID09IFJDQ19SVENDTEtTT1VSQ0VfTFNJKSB8fCAgXAorICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfUlRDQ0xLU09VUkNFX0hTRV9ESVYzMikpCisKKyNkZWZpbmUgSVNfUkNDX01DTyhfX01DT1hfXykgXAorICAoKChfX01DT1hfXykgPT0gUkNDX01DT19QQTgpIHx8ICgoX19NQ09YX18pID09IFJDQ19NQ09fUEcxMCkpCisKKyNkZWZpbmUgSVNfUkNDX01DTzFTT1VSQ0UoX19TT1VSQ0VfXykgICAgICAgICAgXAorICAoKChfX1NPVVJDRV9fKSA9PSBSQ0NfTUNPMVNPVVJDRV9OT0NMT0NLKSB8fCBcCisgICAoKF9fU09VUkNFX18pID09IFJDQ19NQ08xU09VUkNFX1NZU0NMSykgfHwgIFwKKyAgICgoX19TT1VSQ0VfXykgPT0gUkNDX01DTzFTT1VSQ0VfSFNJKSB8fCAgICAgXAorICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfTUNPMVNPVVJDRV9IU0UpIHx8ICAgICBcCisgICAoKF9fU09VUkNFX18pID09IFJDQ19NQ08xU09VUkNFX1BMTENMSykgfHwgIFwKKyAgICgoX19TT1VSQ0VfXykgPT0gUkNDX01DTzFTT1VSQ0VfTFNJKSB8fCAgICAgXAorICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfTUNPMVNPVVJDRV9MU0UpIHx8ICAgICBcCisgICAoKF9fU09VUkNFX18pID09IFJDQ19NQ08xU09VUkNFX0hTSTQ4KSkKKworI2RlZmluZSBJU19SQ0NfTUNPRElWKF9fRElWX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKF9fRElWX18pID09IFJDQ19NQ09ESVZfMSkgfHwgKChfX0RJVl9fKSA9PSBSQ0NfTUNPRElWXzIpIHx8IFwKKyAgICgoX19ESVZfXykgPT0gUkNDX01DT0RJVl80KSB8fCAoKF9fRElWX18pID09IFJDQ19NQ09ESVZfOCkgfHwgXAorICAgKChfX0RJVl9fKSA9PSBSQ0NfTUNPRElWXzE2KSkKKworI2RlZmluZSBJU19SQ0NfTFNFX0RSSVZFKF9fRFJJVkVfXykgICAgICAgICAgICBcCisgICgoKF9fRFJJVkVfXykgPT0gUkNDX0xTRURSSVZFX0xPVykgfHwgICAgICAgIFwKKyAgICgoX19EUklWRV9fKSA9PSBSQ0NfTFNFRFJJVkVfTUVESVVNTE9XKSB8fCAgXAorICAgKChfX0RSSVZFX18pID09IFJDQ19MU0VEUklWRV9NRURJVU1ISUdIKSB8fCBcCisgICAoKF9fRFJJVkVfXykgPT0gUkNDX0xTRURSSVZFX0hJR0gpKQorCisvKioKKyAqIEB9CisgKi8KKworLyogSW5jbHVkZSBSQ0MgSEFMIEV4dGVuZGVkIG1vZHVsZSAqLworI2luY2x1ZGUgInN0bTMyZzR4eF9oYWxfcmNjX2V4LmgiCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgUkNDX0V4cG9ydGVkX0Z1bmN0aW9ucworICogQHsKKyAqLworCisvKiogQGFkZHRvZ3JvdXAgUkNDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEKKyAqIEB7CisgKi8KKworLyogSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JDQ19EZUluaXQodm9pZCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUkNDX09zY0NvbmZpZyhSQ0NfT3NjSW5pdFR5cGVEZWYgKlJDQ19Pc2NJbml0U3RydWN0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SQ0NfQ2xvY2tDb25maWcoUkNDX0Nsa0luaXRUeXBlRGVmICpSQ0NfQ2xrSW5pdFN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRkxhdGVuY3kpOworCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBhZGR0b2dyb3VwIFJDQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyCisgKiBAeworICovCisKKy8qIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgSEFMX1JDQ19NQ09Db25maWcodWludDMyX3QgUkNDX01DT3gsIHVpbnQzMl90IFJDQ19NQ09Tb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFJDQ19NQ09EaXYpOwordm9pZCBIQUxfUkNDX0VuYWJsZUNTUyh2b2lkKTsKK3ZvaWQgSEFMX1JDQ19FbmFibGVMU0VDU1Modm9pZCk7Cit2b2lkIEhBTF9SQ0NfRGlzYWJsZUxTRUNTUyh2b2lkKTsKK3VpbnQzMl90IEhBTF9SQ0NfR2V0U3lzQ2xvY2tGcmVxKHZvaWQpOwordWludDMyX3QgSEFMX1JDQ19HZXRIQ0xLRnJlcSh2b2lkKTsKK3VpbnQzMl90IEhBTF9SQ0NfR2V0UENMSzFGcmVxKHZvaWQpOwordWludDMyX3QgSEFMX1JDQ19HZXRQQ0xLMkZyZXEodm9pZCk7Cit2b2lkIEhBTF9SQ0NfR2V0T3NjQ29uZmlnKFJDQ19Pc2NJbml0VHlwZURlZiAqUkNDX09zY0luaXRTdHJ1Y3QpOwordm9pZCBIQUxfUkNDX0dldENsb2NrQ29uZmlnKFJDQ19DbGtJbml0VHlwZURlZiAqUkNDX0Nsa0luaXRTdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBGTGF0ZW5jeSk7CisvKiBDU1MgTk1JIElSUSBoYW5kbGVyICovCit2b2lkIEhBTF9SQ0NfTk1JX0lSUUhhbmRsZXIodm9pZCk7CisvKiBVc2VyIENhbGxiYWNrcyBpbiBub24gYmxvY2tpbmcgbW9kZSAoSVQgbW9kZSkgKi8KK3ZvaWQgSEFMX1JDQ19DU1NDYWxsYmFjayh2b2lkKTsKKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMkc0eHhfSEFMX1JDQ19IICovCmRpZmYgLS1naXQgYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9oYWxfcmNjX2V4LmggYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9oYWxfcmNjX2V4LmgKaW5kZXggNTcxOTgzMS4uOGFhYTIwYiAxMDA2NDQKLS0tIGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfaGFsX3JjY19leC5oCisrKyBiL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9JbmMvc3RtMzJnNHh4X2hhbF9yY2NfZXguaApAQCAtMSwxNzY4ICsxLDE4MDggQEAKLS8qKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBAZmlsZSAgICBzdG0zMmc0eHhfaGFsX3JjY19leC5oDQotICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0NCi0gKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBSQ0MgSEFMIEV4dGVuZGVkIG1vZHVsZS4NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQGF0dGVudGlvbg0KLSAqDQotICogQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KLSAqDQotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0ZXJtcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlDQotICppbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb2Z0d2FyZSBjb21wb25lbnQuIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcw0KLSAqd2l0aCB0aGlzIHNvZnR3YXJlLCBpdCBpcyBwcm92aWRlZCBBUy1JUy4NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICovDQotDQotLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaWZuZGVmIFNUTTMyRzR4eF9IQUxfUkNDX0VYX0gNCi0jZGVmaW5lIFNUTTMyRzR4eF9IQUxfUkNDX0VYX0gNCi0NCi0jaWZkZWYgX19jcGx1c3BsdXMNCi1leHRlcm4gIkMiIHsNCi0jZW5kaWYNCi0NCi0vKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpbmNsdWRlICJzdG0zMmc0eHhfaGFsX2RlZi5oIg0KLQ0KLS8qKiBAYWRkdG9ncm91cCBTVE0zMkc0eHhfSEFMX0RyaXZlcg0KLSAqIEB7DQotICovDQotDQotLyoqIEBhZGR0b2dyb3VwIFJDQ0V4DQotICogQHsNCi0gKi8NCi0NCi0vKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDRXhfRXhwb3J0ZWRfVHlwZXMgUkNDRXggRXhwb3J0ZWQgVHlwZXMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUkNDIGV4dGVuZGVkIGNsb2NrcyBzdHJ1Y3R1cmUgZGVmaW5pdGlvbg0KLSAqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gIHVpbnQzMl90IFBlcmlwaENsb2NrU2VsZWN0aW9uOyAvKiE8IFRoZSBFeHRlbmRlZCBDbG9jayB0byBiZSBjb25maWd1cmVkLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ0V4X1BlcmlwaF9DbG9ja19TZWxlY3Rpb24gKi8NCi0NCi0gIHVpbnQzMl90IFVzYXJ0MUNsb2NrU2VsZWN0aW9uOyAvKiE8IFNwZWNpZmllcyBVU0FSVDEgY2xvY2sgc291cmNlLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ0V4X1VTQVJUMV9DbG9ja19Tb3VyY2UgKi8NCi0NCi0gIHVpbnQzMl90IFVzYXJ0MkNsb2NrU2VsZWN0aW9uOyAvKiE8IFNwZWNpZmllcyBVU0FSVDIgY2xvY2sgc291cmNlLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ0V4X1VTQVJUMl9DbG9ja19Tb3VyY2UgKi8NCi0NCi0gIHVpbnQzMl90IFVzYXJ0M0Nsb2NrU2VsZWN0aW9uOyAvKiE8IFNwZWNpZmllcyBVU0FSVDMgY2xvY2sgc291cmNlLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ0V4X1VTQVJUM19DbG9ja19Tb3VyY2UgKi8NCi0NCi0jaWYgZGVmaW5lZChVQVJUNCkNCi0gIHVpbnQzMl90IFVhcnQ0Q2xvY2tTZWxlY3Rpb247IC8qITwgU3BlY2lmaWVzIFVBUlQ0IGNsb2NrIHNvdXJjZS4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDRXhfVUFSVDRfQ2xvY2tfU291cmNlICovDQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVQVJUNCAqLw0KLQ0KLSNpZiBkZWZpbmVkKFVBUlQ1KQ0KLSAgdWludDMyX3QgVWFydDVDbG9ja1NlbGVjdGlvbjsgLyohPCBTcGVjaWZpZXMgVUFSVDUgY2xvY2sgc291cmNlLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NFeF9VQVJUNV9DbG9ja19Tb3VyY2UgKi8NCi0NCi0jZW5kaWYgLyogVUFSVDUgKi8NCi0NCi0gIHVpbnQzMl90IExwdWFydDFDbG9ja1NlbGVjdGlvbjsgLyohPCBTcGVjaWZpZXMgTFBVQVJUMSBjbG9jayBzb3VyY2UuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NFeF9MUFVBUlQxX0Nsb2NrX1NvdXJjZSAqLw0KLQ0KLSAgdWludDMyX3QgSTJjMUNsb2NrU2VsZWN0aW9uOyAvKiE8IFNwZWNpZmllcyBJMkMxIGNsb2NrIHNvdXJjZS4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ0V4X0kyQzFfQ2xvY2tfU291cmNlICovDQotDQotICB1aW50MzJfdCBJMmMyQ2xvY2tTZWxlY3Rpb247IC8qITwgU3BlY2lmaWVzIEkyQzIgY2xvY2sgc291cmNlLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDRXhfSTJDMl9DbG9ja19Tb3VyY2UgKi8NCi0NCi0gIHVpbnQzMl90IEkyYzNDbG9ja1NlbGVjdGlvbjsgLyohPCBTcGVjaWZpZXMgSTJDMyBjbG9jayBzb3VyY2UuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NFeF9JMkMzX0Nsb2NrX1NvdXJjZSAqLw0KLQ0KLSNpZiBkZWZpbmVkKEkyQzQpDQotDQotICB1aW50MzJfdCBJMmM0Q2xvY2tTZWxlY3Rpb247IC8qITwgU3BlY2lmaWVzIEkyQzQgY2xvY2sgc291cmNlLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDRXhfSTJDNF9DbG9ja19Tb3VyY2UgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgLyogSTJDNCAqLw0KLQ0KLSAgdWludDMyX3QgTHB0aW0xQ2xvY2tTZWxlY3Rpb247IC8qITwgU3BlY2lmaWVzIExQVElNMSBjbG9jayBzb3VyY2UuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDRXhfTFBUSU0xX0Nsb2NrX1NvdXJjZSAqLw0KLQ0KLSAgdWludDMyX3QgU2FpMUNsb2NrU2VsZWN0aW9uOyAvKiE8IFNwZWNpZmllcyBTQUkxIGNsb2NrIHNvdXJjZS4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ0V4X1NBSTFfQ2xvY2tfU291cmNlICovDQotDQotICB1aW50MzJfdCBJMnNDbG9ja1NlbGVjdGlvbjsgLyohPCBTcGVjaWZpZXMgSTJTIGNsb2NrIHNvdXJjZS4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDRXhfSTJTX0Nsb2NrX1NvdXJjZSAqLw0KLSNpZiBkZWZpbmVkKEZEQ0FOMSkNCi0NCi0gIHVpbnQzMl90IEZkY2FuQ2xvY2tTZWxlY3Rpb247IC8qITwgU3BlY2lmaWVzIEZEQ0FOIGNsb2NrIHNvdXJjZS4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NFeF9GRENBTl9DbG9ja19Tb3VyY2UgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZEQ0FOMSAqLw0KLSNpZiBkZWZpbmVkKFVTQikNCi0NCi0gIHVpbnQzMl90IFVzYkNsb2NrU2VsZWN0aW9uOyAvKiE8IFNwZWNpZmllcyBVU0IgY2xvY2sgc291cmNlICh3YXJuaW5nOiBzYW1lDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlIGZvciBSTkcpLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIEByZWYgUkNDRXhfVVNCX0Nsb2NrX1NvdXJjZSAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVTQiAqLw0KLQ0KLSAgdWludDMyX3QgUm5nQ2xvY2tTZWxlY3Rpb247IC8qITwgU3BlY2lmaWVzIFJORyBjbG9jayBzb3VyY2UgKHdhcm5pbmc6IHNhbWUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UgZm9yIFVTQikuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgQHJlZiBSQ0NFeF9STkdfQ2xvY2tfU291cmNlICovDQotDQotICB1aW50MzJfdCBBZGMxMkNsb2NrU2VsZWN0aW9uOyAvKiE8IFNwZWNpZmllcyBBREMxMiBpbnRlcmZhY2UgY2xvY2sgc291cmNlLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NFeF9BREMxMl9DbG9ja19Tb3VyY2UgKi8NCi0NCi0jaWYgZGVmaW5lZChBREMzNDVfQ09NTU9OKQ0KLSAgdWludDMyX3QgQWRjMzQ1Q2xvY2tTZWxlY3Rpb247IC8qITwgU3BlY2lmaWVzIEFEQzM0NSBpbnRlcmZhY2UgY2xvY2sgc291cmNlLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ0V4X0FEQzM0NV9DbG9ja19Tb3VyY2UgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBREMzNDVfQ09NTU9OICovDQotDQotI2lmIGRlZmluZWQoUVVBRFNQSSkNCi0gIHVpbnQzMl90IFFzcGlDbG9ja1NlbGVjdGlvbjsgLyohPCBTcGVjaWZpZXMgUXVhZFNQSSBjbG9jayBzb3VyY2UuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NFeF9RU1BJX0Nsb2NrX1NvdXJjZSAqLw0KLSNlbmRpZg0KLQ0KLSAgdWludDMyX3QgUlRDQ2xvY2tTZWxlY3Rpb247IC8qITwgU3BlY2lmaWVzIFJUQyBjbG9jayBzb3VyY2UuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1JUQ19DbG9ja19Tb3VyY2UgKi8NCi19IFJDQ19QZXJpcGhDTEtJbml0VHlwZURlZjsNCi0NCi0vKioNCi0gKiBAYnJpZWYgUkNDX0NSUyBJbml0IHN0cnVjdHVyZSBkZWZpbml0aW9uDQotICovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgdWludDMyX3QgUHJlc2NhbGVyOyAvKiE8IFNwZWNpZmllcyB0aGUgZGl2aXNpb24gZmFjdG9yIG9mIHRoZSBTWU5DIHNpZ25hbC4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ0V4X0NSU19TeW5jaHJvRGl2aWRlciAqLw0KLQ0KLSAgdWludDMyX3QgU291cmNlOyAvKiE8IFNwZWNpZmllcyB0aGUgU1lOQyBzaWduYWwgc291cmNlLg0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgUkNDRXhfQ1JTX1N5bmNocm9Tb3VyY2UgKi8NCi0NCi0gIHVpbnQzMl90IFBvbGFyaXR5OyAvKiE8IFNwZWNpZmllcyB0aGUgaW5wdXQgcG9sYXJpdHkgZm9yIHRoZSBTWU5DIHNpZ25hbA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgIFJDQ0V4X0NSU19TeW5jaHJvUG9sYXJpdHkgKi8NCi0NCi0gIHVpbnQzMl90DQotICAgICAgUmVsb2FkVmFsdWU7IC8qITwgU3BlY2lmaWVzIHRoZSB2YWx1ZSB0byBiZSBsb2FkZWQgaW4gdGhlIGZyZXF1ZW5jeSBlcnJvcg0KLSAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyIHdpdGggZWFjaCBTWU5DIGV2ZW50LiBJdCBjYW4gYmUgY2FsY3VsYXRlZCBpbg0KLSAgICAgICAgICAgICAgICAgICAgICB1c2luZyBtYWNybw0KLSAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9SQ0NfQ1JTX1JFTE9BRFZBTFVFX0NBTENVTEFURShfX0ZUQVJHRVRfXywNCi0gICAgICAgICAgICAgICAgICAgICAgX19GU1lOQ19fKSBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQNCi0gICAgICAgICAgICAgICAgICAgICAgMHhGRkZGIG9yIGEgdmFsdWUgb2YgQHJlZiBSQ0NFeF9DUlNfUmVsb2FkVmFsdWVEZWZhdWx0IC4qLw0KLQ0KLSAgdWludDMyX3QgRXJyb3JMaW1pdFZhbHVlOyAvKiE8IFNwZWNpZmllcyB0aGUgdmFsdWUgdG8gYmUgdXNlZCB0byBldmFsdWF0ZSB0aGUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwdHVyZWQgZnJlcXVlbmN5IGVycm9yIHZhbHVlLiBUaGlzIHBhcmFtZXRlcg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMHhGRiBvciBhIHZhbHVlIG9mDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgUkNDRXhfQ1JTX0Vycm9yTGltaXREZWZhdWx0ICovDQotDQotICB1aW50MzJfdA0KLSAgICAgIEhTSTQ4Q2FsaWJyYXRpb25WYWx1ZTsgLyohPCBTcGVjaWZpZXMgYSB1c2VyLXByb2dyYW1tYWJsZSB0cmltbWluZyB2YWx1ZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIEhTSTQ4IG9zY2lsbGF0b3IuIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMHg3RiBvciBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ0V4X0NSU19IU0k0OENhbGlicmF0aW9uRGVmYXVsdCAqLw0KLQ0KLX0gUkNDX0NSU0luaXRUeXBlRGVmOw0KLQ0KLS8qKg0KLSAqIEBicmllZiBSQ0NfQ1JTIFN5bmNocm9uaXphdGlvbiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbg0KLSAqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gIHVpbnQzMl90DQotICAgICAgUmVsb2FkVmFsdWU7IC8qITwgU3BlY2lmaWVzIHRoZSB2YWx1ZSBsb2FkZWQgaW4gdGhlIENvdW50ZXIgcmVsb2FkIHZhbHVlLg0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAweEZGRkYgKi8NCi0NCi0gIHVpbnQzMl90IEhTSTQ4Q2FsaWJyYXRpb25WYWx1ZTsgLyohPCBTcGVjaWZpZXMgdmFsdWUgbG9hZGVkIGluIEhTSTQ4DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zY2lsbGF0b3Igc21vb3RoIHRyaW1taW5nLiBUaGlzIHBhcmFtZXRlcg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMHg3RiAqLw0KLQ0KLSAgdWludDMyX3QgRnJlcUVycm9yQ2FwdHVyZTsgLyohPCBTcGVjaWZpZXMgdGhlIHZhbHVlIGxvYWRlZCBpbiB0aGUgLkZFQ0FQLCB0aGUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZXF1ZW5jeSBlcnJvciBjb3VudGVyIHZhbHVlIGxhdGNoZWQgaW4gdGhlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lIG9mIHRoZSBsYXN0IFNZTkMgZXZlbnQuIFRoaXMgcGFyYW1ldGVyIG11c3QNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMHhGRkZGICovDQotDQotICB1aW50MzJfdA0KLSAgICAgIEZyZXFFcnJvckRpcmVjdGlvbjsgLyohPCBTcGVjaWZpZXMgdGhlIHZhbHVlIGxvYWRlZCBpbiB0aGUgLkZFRElSLCB0aGUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50aW5nIGRpcmVjdGlvbiBvZiB0aGUgZnJlcXVlbmN5IGVycm9yIGNvdW50ZXINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGNoZWQgaW4gdGhlIHRpbWUgb2YgdGhlIGxhc3QgU1lOQyBldmVudC4gSXQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dzIHdoZXRoZXIgdGhlIGFjdHVhbCBmcmVxdWVuY3kgaXMgYmVsb3cgb3INCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3ZlIHRoZSB0YXJnZXQuIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBvZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBSQ0NFeF9DUlNfRnJlcUVycm9yRGlyZWN0aW9uKi8NCi0NCi19IFJDQ19DUlNTeW5jaHJvSW5mb1R5cGVEZWY7DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgUkNDRXhfRXhwb3J0ZWRfQ29uc3RhbnRzIFJDQ0V4IEV4cG9ydGVkIENvbnN0YW50cw0KLSAqIEB7DQotICovDQotDQotLyoqIEBkZWZncm91cCBSQ0NFeF9MU0NPX0Nsb2NrX1NvdXJjZSBMb3cgU3BlZWQgQ2xvY2sgU291cmNlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFJDQ19MU0NPU09VUkNFX0xTSSBcDQotICAweDAwMDAwMDAwVSAvKiE8IExTSSBzZWxlY3Rpb24gZm9yIGxvdyBzcGVlZCBjbG9jayBvdXRwdXQgKi8NCi0jZGVmaW5lIFJDQ19MU0NPU09VUkNFX0xTRSBcDQotICBSQ0NfQkRDUl9MU0NPU0VMIC8qITwgTFNFIHNlbGVjdGlvbiBmb3IgbG93IHNwZWVkIGNsb2NrIG91dHB1dCAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBSQ0NFeF9QZXJpcGhfQ2xvY2tfU2VsZWN0aW9uIFBlcmlwaCBDbG9jayBTZWxlY3Rpb24NCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgUkNDX1BFUklQSENMS19VU0FSVDEgMHgwMDAwMDAwMVUNCi0jZGVmaW5lIFJDQ19QRVJJUEhDTEtfVVNBUlQyIDB4MDAwMDAwMDJVDQotI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX1VTQVJUMyAweDAwMDAwMDA0VQ0KLSNpZiBkZWZpbmVkKFVBUlQ0KQ0KLSNkZWZpbmUgUkNDX1BFUklQSENMS19VQVJUNCAweDAwMDAwMDA4VQ0KLSNlbmRpZiAvKiBVQVJUNCAqLw0KLSNpZiBkZWZpbmVkKFVBUlQ1KQ0KLSNkZWZpbmUgUkNDX1BFUklQSENMS19VQVJUNSAweDAwMDAwMDEwVQ0KLSNlbmRpZiAvKiBVQVJUNSAqLw0KLSNkZWZpbmUgUkNDX1BFUklQSENMS19MUFVBUlQxIDB4MDAwMDAwMjBVDQotI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX0kyQzEgMHgwMDAwMDA0MFUNCi0jZGVmaW5lIFJDQ19QRVJJUEhDTEtfSTJDMiAweDAwMDAwMDgwVQ0KLSNkZWZpbmUgUkNDX1BFUklQSENMS19JMkMzIDB4MDAwMDAxMDBVDQotI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX0xQVElNMSAweDAwMDAwMjAwVQ0KLSNkZWZpbmUgUkNDX1BFUklQSENMS19TQUkxIDB4MDAwMDA0MDBVDQotI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX0kyUyAweDAwMDAwODAwVQ0KLSNpZiBkZWZpbmVkKEZEQ0FOMSkNCi0jZGVmaW5lIFJDQ19QRVJJUEhDTEtfRkRDQU4gMHgwMDAwMTAwMFUNCi0jZW5kaWYgLyogRkRDQU4xICovDQotI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX1VTQiAweDAwMDAyMDAwVQ0KLSNkZWZpbmUgUkNDX1BFUklQSENMS19STkcgMHgwMDAwNDAwMFUNCi0jZGVmaW5lIFJDQ19QRVJJUEhDTEtfQURDMTIgMHgwMDAwODAwMFUNCi0jaWYgZGVmaW5lZChBREMzNDVfQ09NTU9OKQ0KLSNkZWZpbmUgUkNDX1BFUklQSENMS19BREMzNDUgMHgwMDAxMDAwMFUNCi0jZW5kaWYgLyogQURDMzQ1X0NPTU1PTiAqLw0KLSNpZiBkZWZpbmVkKEkyQzQpDQotI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX0kyQzQgMHgwMDAyMDAwMFUNCi0jZW5kaWYgLyogSTJDNCAqLw0KLSNpZiBkZWZpbmVkKFFVQURTUEkpDQotI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX1FTUEkgMHgwMDA0MDAwMFUNCi0jZW5kaWYgLyogUVVBRFNQSSAqLw0KLSNkZWZpbmUgUkNDX1BFUklQSENMS19SVEMgMHgwMDA4MDAwMFUNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDRXhfVVNBUlQxX0Nsb2NrX1NvdXJjZSBVU0FSVDEgQ2xvY2sgU291cmNlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFJDQ19VU0FSVDFDTEtTT1VSQ0VfUENMSzIgMHgwMDAwMDAwMFUNCi0jZGVmaW5lIFJDQ19VU0FSVDFDTEtTT1VSQ0VfU1lTQ0xLIFJDQ19DQ0lQUl9VU0FSVDFTRUxfMA0KLSNkZWZpbmUgUkNDX1VTQVJUMUNMS1NPVVJDRV9IU0kgUkNDX0NDSVBSX1VTQVJUMVNFTF8xDQotI2RlZmluZSBSQ0NfVVNBUlQxQ0xLU09VUkNFX0xTRSAoUkNDX0NDSVBSX1VTQVJUMVNFTF8wIHwgUkNDX0NDSVBSX1VTQVJUMVNFTF8xKQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBSQ0NFeF9VU0FSVDJfQ2xvY2tfU291cmNlIFVTQVJUMiBDbG9jayBTb3VyY2UNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgUkNDX1VTQVJUMkNMS1NPVVJDRV9QQ0xLMSAweDAwMDAwMDAwVQ0KLSNkZWZpbmUgUkNDX1VTQVJUMkNMS1NPVVJDRV9TWVNDTEsgUkNDX0NDSVBSX1VTQVJUMlNFTF8wDQotI2RlZmluZSBSQ0NfVVNBUlQyQ0xLU09VUkNFX0hTSSBSQ0NfQ0NJUFJfVVNBUlQyU0VMXzENCi0jZGVmaW5lIFJDQ19VU0FSVDJDTEtTT1VSQ0VfTFNFIChSQ0NfQ0NJUFJfVVNBUlQyU0VMXzAgfCBSQ0NfQ0NJUFJfVVNBUlQyU0VMXzEpDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFJDQ0V4X1VTQVJUM19DbG9ja19Tb3VyY2UgVVNBUlQzIENsb2NrIFNvdXJjZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBSQ0NfVVNBUlQzQ0xLU09VUkNFX1BDTEsxIDB4MDAwMDAwMDBVDQotI2RlZmluZSBSQ0NfVVNBUlQzQ0xLU09VUkNFX1NZU0NMSyBSQ0NfQ0NJUFJfVVNBUlQzU0VMXzANCi0jZGVmaW5lIFJDQ19VU0FSVDNDTEtTT1VSQ0VfSFNJIFJDQ19DQ0lQUl9VU0FSVDNTRUxfMQ0KLSNkZWZpbmUgUkNDX1VTQVJUM0NMS1NPVVJDRV9MU0UgKFJDQ19DQ0lQUl9VU0FSVDNTRUxfMCB8IFJDQ19DQ0lQUl9VU0FSVDNTRUxfMSkNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLSNpZiBkZWZpbmVkKFVBUlQ0KQ0KLS8qKiBAZGVmZ3JvdXAgUkNDRXhfVUFSVDRfQ2xvY2tfU291cmNlIFVBUlQ0IENsb2NrIFNvdXJjZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBSQ0NfVUFSVDRDTEtTT1VSQ0VfUENMSzEgMHgwMDAwMDAwMFUNCi0jZGVmaW5lIFJDQ19VQVJUNENMS1NPVVJDRV9TWVNDTEsgUkNDX0NDSVBSX1VBUlQ0U0VMXzANCi0jZGVmaW5lIFJDQ19VQVJUNENMS1NPVVJDRV9IU0kgUkNDX0NDSVBSX1VBUlQ0U0VMXzENCi0jZGVmaW5lIFJDQ19VQVJUNENMS1NPVVJDRV9MU0UgKFJDQ19DQ0lQUl9VQVJUNFNFTF8wIHwgUkNDX0NDSVBSX1VBUlQ0U0VMXzEpDQotLyoqDQotICogQH0NCi0gKi8NCi0jZW5kaWYgLyogVUFSVDQgKi8NCi0NCi0jaWYgZGVmaW5lZChVQVJUNSkNCi0vKiogQGRlZmdyb3VwIFJDQ0V4X1VBUlQ1X0Nsb2NrX1NvdXJjZSBVQVJUNSBDbG9jayBTb3VyY2UNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgUkNDX1VBUlQ1Q0xLU09VUkNFX1BDTEsxIDB4MDAwMDAwMDBVDQotI2RlZmluZSBSQ0NfVUFSVDVDTEtTT1VSQ0VfU1lTQ0xLIFJDQ19DQ0lQUl9VQVJUNVNFTF8wDQotI2RlZmluZSBSQ0NfVUFSVDVDTEtTT1VSQ0VfSFNJIFJDQ19DQ0lQUl9VQVJUNVNFTF8xDQotI2RlZmluZSBSQ0NfVUFSVDVDTEtTT1VSQ0VfTFNFIChSQ0NfQ0NJUFJfVUFSVDVTRUxfMCB8IFJDQ19DQ0lQUl9VQVJUNVNFTF8xKQ0KLS8qKg0KLSAqIEB9DQotICovDQotI2VuZGlmIC8qIFVBUlQ1ICovDQotDQotLyoqIEBkZWZncm91cCBSQ0NFeF9MUFVBUlQxX0Nsb2NrX1NvdXJjZSBMUFVBUlQxIENsb2NrIFNvdXJjZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBSQ0NfTFBVQVJUMUNMS1NPVVJDRV9QQ0xLMSAweDAwMDAwMDAwVQ0KLSNkZWZpbmUgUkNDX0xQVUFSVDFDTEtTT1VSQ0VfU1lTQ0xLIFJDQ19DQ0lQUl9MUFVBUlQxU0VMXzANCi0jZGVmaW5lIFJDQ19MUFVBUlQxQ0xLU09VUkNFX0hTSSBSQ0NfQ0NJUFJfTFBVQVJUMVNFTF8xDQotI2RlZmluZSBSQ0NfTFBVQVJUMUNMS1NPVVJDRV9MU0UgXA0KLSAgKFJDQ19DQ0lQUl9MUFVBUlQxU0VMXzAgfCBSQ0NfQ0NJUFJfTFBVQVJUMVNFTF8xKQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBSQ0NFeF9JMkMxX0Nsb2NrX1NvdXJjZSBJMkMxIENsb2NrIFNvdXJjZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBSQ0NfSTJDMUNMS1NPVVJDRV9QQ0xLMSAweDAwMDAwMDAwVQ0KLSNkZWZpbmUgUkNDX0kyQzFDTEtTT1VSQ0VfU1lTQ0xLIFJDQ19DQ0lQUl9JMkMxU0VMXzANCi0jZGVmaW5lIFJDQ19JMkMxQ0xLU09VUkNFX0hTSSBSQ0NfQ0NJUFJfSTJDMVNFTF8xDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFJDQ0V4X0kyQzJfQ2xvY2tfU291cmNlIEkyQzIgQ2xvY2sgU291cmNlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFJDQ19JMkMyQ0xLU09VUkNFX1BDTEsxIDB4MDAwMDAwMDBVDQotI2RlZmluZSBSQ0NfSTJDMkNMS1NPVVJDRV9TWVNDTEsgUkNDX0NDSVBSX0kyQzJTRUxfMA0KLSNkZWZpbmUgUkNDX0kyQzJDTEtTT1VSQ0VfSFNJIFJDQ19DQ0lQUl9JMkMyU0VMXzENCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDRXhfSTJDM19DbG9ja19Tb3VyY2UgSTJDMyBDbG9jayBTb3VyY2UNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgUkNDX0kyQzNDTEtTT1VSQ0VfUENMSzEgMHgwMDAwMDAwMFUNCi0jZGVmaW5lIFJDQ19JMkMzQ0xLU09VUkNFX1NZU0NMSyBSQ0NfQ0NJUFJfSTJDM1NFTF8wDQotI2RlZmluZSBSQ0NfSTJDM0NMS1NPVVJDRV9IU0kgUkNDX0NDSVBSX0kyQzNTRUxfMQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBSQ0NFeF9MUFRJTTFfQ2xvY2tfU291cmNlIExQVElNMSBDbG9jayBTb3VyY2UNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgUkNDX0xQVElNMUNMS1NPVVJDRV9QQ0xLMSAweDAwMDAwMDAwVQ0KLSNkZWZpbmUgUkNDX0xQVElNMUNMS1NPVVJDRV9MU0kgUkNDX0NDSVBSX0xQVElNMVNFTF8wDQotI2RlZmluZSBSQ0NfTFBUSU0xQ0xLU09VUkNFX0hTSSBSQ0NfQ0NJUFJfTFBUSU0xU0VMXzENCi0jZGVmaW5lIFJDQ19MUFRJTTFDTEtTT1VSQ0VfTFNFIFJDQ19DQ0lQUl9MUFRJTTFTRUwNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDRXhfU0FJMV9DbG9ja19Tb3VyY2UgU0FJMSBDbG9jayBTb3VyY2UNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgUkNDX1NBSTFDTEtTT1VSQ0VfU1lTQ0xLIDB4MDAwMDAwMDBVDQotI2RlZmluZSBSQ0NfU0FJMUNMS1NPVVJDRV9QTEwgUkNDX0NDSVBSX1NBSTFTRUxfMA0KLSNkZWZpbmUgUkNDX1NBSTFDTEtTT1VSQ0VfRVhUIFJDQ19DQ0lQUl9TQUkxU0VMXzENCi0jZGVmaW5lIFJDQ19TQUkxQ0xLU09VUkNFX0hTSSAoUkNDX0NDSVBSX1NBSTFTRUxfMSB8IFJDQ19DQ0lQUl9TQUkxU0VMXzApDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFJDQ0V4X0kyU19DbG9ja19Tb3VyY2UgSTJTIENsb2NrIFNvdXJjZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBSQ0NfSTJTQ0xLU09VUkNFX1NZU0NMSyAweDAwMDAwMDAwVQ0KLSNkZWZpbmUgUkNDX0kyU0NMS1NPVVJDRV9QTEwgUkNDX0NDSVBSX0kyUzIzU0VMXzANCi0jZGVmaW5lIFJDQ19JMlNDTEtTT1VSQ0VfRVhUIFJDQ19DQ0lQUl9JMlMyM1NFTF8xDQotI2RlZmluZSBSQ0NfSTJTQ0xLU09VUkNFX0hTSSAoUkNDX0NDSVBSX0kyUzIzU0VMXzEgfCBSQ0NfQ0NJUFJfSTJTMjNTRUxfMCkNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLSNpZiBkZWZpbmVkKEZEQ0FOMSkNCi0vKiogQGRlZmdyb3VwIFJDQ0V4X0ZEQ0FOX0Nsb2NrX1NvdXJjZSBGRENBTiBDbG9jayBTb3VyY2UNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgUkNDX0ZEQ0FOQ0xLU09VUkNFX0hTRSAweDAwMDAwMDAwVQ0KLSNkZWZpbmUgUkNDX0ZEQ0FOQ0xLU09VUkNFX1BMTCBSQ0NfQ0NJUFJfRkRDQU5TRUxfMA0KLSNkZWZpbmUgUkNDX0ZEQ0FOQ0xLU09VUkNFX1BDTEsxIFJDQ19DQ0lQUl9GRENBTlNFTF8xDQotLyoqDQotICogQH0NCi0gKi8NCi0jZW5kaWYgLyogRkRDQU4xICovDQotDQotLyoqIEBkZWZncm91cCBSQ0NFeF9STkdfQ2xvY2tfU291cmNlIFJORyBDbG9jayBTb3VyY2UNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgUkNDX1JOR0NMS1NPVVJDRV9IU0k0OCAweDAwMDAwMDAwVQ0KLSNkZWZpbmUgUkNDX1JOR0NMS1NPVVJDRV9QTEwgUkNDX0NDSVBSX0NMSzQ4U0VMXzENCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDRXhfVVNCX0Nsb2NrX1NvdXJjZSBVU0IgQ2xvY2sgU291cmNlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFJDQ19VU0JDTEtTT1VSQ0VfSFNJNDggMHgwMDAwMDAwMFUNCi0jZGVmaW5lIFJDQ19VU0JDTEtTT1VSQ0VfUExMIFJDQ19DQ0lQUl9DTEs0OFNFTF8xDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFJDQ0V4X0FEQzEyX0Nsb2NrX1NvdXJjZSBBREMxMiBDbG9jayBTb3VyY2UNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgUkNDX0FEQzEyQ0xLU09VUkNFX05PTkUgMHgwMDAwMDAwMFUNCi0jZGVmaW5lIFJDQ19BREMxMkNMS1NPVVJDRV9QTEwgUkNDX0NDSVBSX0FEQzEyU0VMXzANCi0jZGVmaW5lIFJDQ19BREMxMkNMS1NPVVJDRV9TWVNDTEsgUkNDX0NDSVBSX0FEQzEyU0VMXzENCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLSNpZiBkZWZpbmVkKEFEQzM0NV9DT01NT04pDQotLyoqIEBkZWZncm91cCBSQ0NFeF9BREMzNDVfQ2xvY2tfU291cmNlIEFEQzM0NSBDbG9jayBTb3VyY2UNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgUkNDX0FEQzM0NUNMS1NPVVJDRV9OT05FIDB4MDAwMDAwMDBVDQotI2RlZmluZSBSQ0NfQURDMzQ1Q0xLU09VUkNFX1BMTCBSQ0NfQ0NJUFJfQURDMzQ1U0VMXzANCi0jZGVmaW5lIFJDQ19BREMzNDVDTEtTT1VSQ0VfU1lTQ0xLIFJDQ19DQ0lQUl9BREMzNDVTRUxfMQ0KLS8qKg0KLSAqIEB9DQotICovDQotI2VuZGlmIC8qIEFEQzM0NV9DT01NT04gKi8NCi0NCi0jaWYgZGVmaW5lZChJMkM0KQ0KLS8qKiBAZGVmZ3JvdXAgUkNDRXhfSTJDNF9DbG9ja19Tb3VyY2UgSTJDNCBDbG9jayBTb3VyY2UNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgUkNDX0kyQzRDTEtTT1VSQ0VfUENMSzEgMHgwMDAwMDAwMFUNCi0jZGVmaW5lIFJDQ19JMkM0Q0xLU09VUkNFX1NZU0NMSyBSQ0NfQ0NJUFIyX0kyQzRTRUxfMA0KLSNkZWZpbmUgUkNDX0kyQzRDTEtTT1VSQ0VfSFNJIFJDQ19DQ0lQUjJfSTJDNFNFTF8xDQotLyoqDQotICogQH0NCi0gKi8NCi0jZW5kaWYgLyogSTJDNCAqLw0KLQ0KLSNpZiBkZWZpbmVkKFFVQURTUEkpDQotLyoqIEBkZWZncm91cCBSQ0NFeF9RU1BJX0Nsb2NrX1NvdXJjZSBRdWFkU1BJIENsb2NrIFNvdXJjZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBSQ0NfUVNQSUNMS1NPVVJDRV9TWVNDTEsgMHgwMDAwMDAwMFUNCi0jZGVmaW5lIFJDQ19RU1BJQ0xLU09VUkNFX0hTSSBSQ0NfQ0NJUFIyX1FTUElTRUxfMA0KLSNkZWZpbmUgUkNDX1FTUElDTEtTT1VSQ0VfUExMIFJDQ19DQ0lQUjJfUVNQSVNFTF8xDQotLyoqDQotICogQH0NCi0gKi8NCi0jZW5kaWYgLyogUVVBRFNQSSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDRXhfRVhUSV9MSU5FX0xTRUNTUyAgUkNDIExTRSBDU1MgZXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgUkNDX0VYVElfTElORV9MU0VDU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBFWFRJX0lNUjFfSU0xOSAvKiE8IEV4dGVybmFsIGludGVycnVwdCBsaW5lIDE5IGNvbm5lY3RlZCB0byB0aGUgTFNFIENTUyBFWFRJIFwNCi0gICAgICAgICAgICAgICAgICAgIExpbmUgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDRXhfQ1JTX1N0YXR1cyBSQ0NFeCBDUlMgU3RhdHVzDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFJDQ19DUlNfTk9ORSAweDAwMDAwMDAwVQ0KLSNkZWZpbmUgUkNDX0NSU19USU1FT1VUIDB4MDAwMDAwMDFVDQotI2RlZmluZSBSQ0NfQ1JTX1NZTkNPSyAweDAwMDAwMDAyVQ0KLSNkZWZpbmUgUkNDX0NSU19TWU5DV0FSTiAweDAwMDAwMDA0VQ0KLSNkZWZpbmUgUkNDX0NSU19TWU5DRVJSIDB4MDAwMDAwMDhVDQotI2RlZmluZSBSQ0NfQ1JTX1NZTkNNSVNTIDB4MDAwMDAwMTBVDQotI2RlZmluZSBSQ0NfQ1JTX1RSSU1PVkYgMHgwMDAwMDAyMFUNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDRXhfQ1JTX1N5bmNocm9Tb3VyY2UgUkNDRXggQ1JTIFN5bmNocm9Tb3VyY2UNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgUkNDX0NSU19TWU5DX1NPVVJDRV9HUElPICAgICAgICAgICAgICBcDQotICAweDAwMDAwMDAwVSAvKiE8IFN5bmNocm8gU2lnbmFsIHNvdXJjZSBHUElPIFwNCi0gICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgUkNDX0NSU19TWU5DX1NPVVJDRV9MU0UgXA0KLSAgQ1JTX0NGR1JfU1lOQ1NSQ18wIC8qITwgU3luY2hybyBTaWduYWwgc291cmNlIExTRSAqLw0KLSNkZWZpbmUgUkNDX0NSU19TWU5DX1NPVVJDRV9VU0IgXA0KLSAgQ1JTX0NGR1JfU1lOQ1NSQ18xIC8qITwgU3luY2hybyBTaWduYWwgc291cmNlIFVTQiBTT0YgKGRlZmF1bHQpKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDRXhfQ1JTX1N5bmNocm9EaXZpZGVyIFJDQ0V4IENSUyBTeW5jaHJvRGl2aWRlcg0KLSAqIEB7DQotICovDQotI2RlZmluZSBSQ0NfQ1JTX1NZTkNfRElWMSBcDQotICAweDAwMDAwMDAwVSAvKiE8IFN5bmNocm8gU2lnbmFsIG5vdCBkaXZpZGVkIChkZWZhdWx0KSAqLw0KLSNkZWZpbmUgUkNDX0NSU19TWU5DX0RJVjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIENSU19DRkdSX1NZTkNESVZfMCAvKiE8IFN5bmNocm8gU2lnbmFsIGRpdmlkZWQgYnkgMiBcDQotICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBSQ0NfQ1JTX1NZTkNfRElWNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgQ1JTX0NGR1JfU1lOQ0RJVl8xIC8qITwgU3luY2hybyBTaWduYWwgZGl2aWRlZCBieSA0IFwNCi0gICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFJDQ19DUlNfU1lOQ19ESVY4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChDUlNfQ0ZHUl9TWU5DRElWXzEgfCBDUlNfQ0ZHUl9TWU5DRElWXzApIC8qITwgU3luY2hybyBTaWduYWwgZGl2aWRlZCBieSA4IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgUkNDX0NSU19TWU5DX0RJVjE2IFwNCi0gIENSU19DRkdSX1NZTkNESVZfMiAvKiE8IFN5bmNocm8gU2lnbmFsIGRpdmlkZWQgYnkgMTYgKi8NCi0jZGVmaW5lIFJDQ19DUlNfU1lOQ19ESVYzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQ1JTX0NGR1JfU1lOQ0RJVl8yIHwgQ1JTX0NGR1JfU1lOQ0RJVl8wKSAvKiE8IFN5bmNocm8gU2lnbmFsIGRpdmlkZWQgYnkgMzIgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBSQ0NfQ1JTX1NZTkNfRElWNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKENSU19DRkdSX1NZTkNESVZfMiB8IENSU19DRkdSX1NZTkNESVZfMSkgLyohPCBTeW5jaHJvIFNpZ25hbCBkaXZpZGVkIGJ5IDY0IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgUkNDX0NSU19TWU5DX0RJVjEyOCBcDQotICBDUlNfQ0ZHUl9TWU5DRElWIC8qITwgU3luY2hybyBTaWduYWwgZGl2aWRlZCBieSAxMjggKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDRXhfQ1JTX1N5bmNocm9Qb2xhcml0eSBSQ0NFeCBDUlMgU3luY2hyb1BvbGFyaXR5DQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFJDQ19DUlNfU1lOQ19QT0xBUklUWV9SSVNJTkcgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBTeW5jaHJvIEFjdGl2ZSBvbiByaXNpbmcgZWRnZSAoZGVmYXVsdCkgKi8NCi0jZGVmaW5lIFJDQ19DUlNfU1lOQ19QT0xBUklUWV9GQUxMSU5HIFwNCi0gIENSU19DRkdSX1NZTkNQT0wgLyohPCBTeW5jaHJvIEFjdGl2ZSBvbiBmYWxsaW5nIGVkZ2UgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDRXhfQ1JTX1JlbG9hZFZhbHVlRGVmYXVsdCBSQ0NFeCBDUlMgUmVsb2FkVmFsdWVEZWZhdWx0DQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFJDQ19DUlNfUkVMT0FEVkFMVUVfREVGQVVMVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgMHgwMDAwQkI3RlUgLyohPCBUaGUgcmVzZXQgdmFsdWUgb2YgdGhlIFJFTE9BRCBmaWVsZCBjb3JyZXNwb25kcyAgICAgICBcDQotICAgICAgICAgICAgICAgICAgIHRvIGEgdGFyZ2V0IGZyZXF1ZW5jeSBvZiA0OCBNSHogYW5kIGEgc3luY2hyb25pemF0aW9uIFwNCi0gICAgICAgICAgICAgICAgIHNpZ25hbCBmcmVxdWVuY3kgb2YgMSBrSHogKFNPRiBzaWduYWwgZnJvbSBVU0IpLiAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBSQ0NFeF9DUlNfRXJyb3JMaW1pdERlZmF1bHQgUkNDRXggQ1JTIEVycm9yTGltaXREZWZhdWx0DQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFJDQ19DUlNfRVJST1JMSU1JVF9ERUZBVUxUIFwNCi0gIDB4MDAwMDAwMjJVIC8qITwgRGVmYXVsdCBGcmVxdWVuY3kgZXJyb3IgbGltaXQgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDRXhfQ1JTX0hTSTQ4Q2FsaWJyYXRpb25EZWZhdWx0IFJDQ0V4IENSUw0KLSAqIEhTSTQ4Q2FsaWJyYXRpb25EZWZhdWx0DQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFJDQ19DUlNfSFNJNDhDQUxJQlJBVElPTl9ERUZBVUxUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgMHgwMDAwMDAyMFUgLyohPCBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAzMiwgd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIG1pZGRsZSBvZiBcDQotICAgICAgICAgICAgICAgICB0aGUgdHJpbW1pbmcgaW50ZXJ2YWwuIFRoZSB0cmltbWluZyBzdGVwIGlzIGFyb3VuZCA2NyBrSHogICAgIFwNCi0gICAgICAgICAgICAgICAgIGJldHdlZW4gdHdvIGNvbnNlY3V0aXZlIFRSSU0gc3RlcHMuIEEgaGlnaGVyIFRSSU0gdmFsdWUgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kcyB0byBhIGhpZ2hlciBvdXRwdXQgZnJlcXVlbmN5ICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFJDQ0V4X0NSU19GcmVxRXJyb3JEaXJlY3Rpb24gUkNDRXggQ1JTIEZyZXFFcnJvckRpcmVjdGlvbg0KLSAqIEB7DQotICovDQotI2RlZmluZSBSQ0NfQ1JTX0ZSRVFFUlJPUkRJUl9VUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBVcGNvdW50aW5nIGRpcmVjdGlvbiwgdGhlIGFjdHVhbCBmcmVxdWVuY3kgaXMgYWJvdmUgdGhlIFwNCi0gICAgICAgICAgICAgICAgIHRhcmdldCAqLw0KLSNkZWZpbmUgUkNDX0NSU19GUkVRRVJST1JESVJfRE9XTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBDUlNfSVNSX0ZFRElSIC8qITwgRG93bmNvdW50aW5nIGRpcmVjdGlvbiwgdGhlIGFjdHVhbCBmcmVxdWVuY3kgaXMgYmVsb3cgdGhlIFwNCi0gICAgICAgICAgICAgICAgICAgdGFyZ2V0ICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFJDQ0V4X0NSU19JbnRlcnJ1cHRfU291cmNlcyBSQ0NFeCBDUlMgSW50ZXJydXB0IFNvdXJjZXMNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgUkNDX0NSU19JVF9TWU5DT0sgQ1JTX0NSX1NZTkNPS0lFICAgICAvKiE8IFNZTkMgZXZlbnQgT0sgKi8NCi0jZGVmaW5lIFJDQ19DUlNfSVRfU1lOQ1dBUk4gQ1JTX0NSX1NZTkNXQVJOSUUgLyohPCBTWU5DIHdhcm5pbmcgKi8NCi0jZGVmaW5lIFJDQ19DUlNfSVRfRVJSIENSU19DUl9FUlJJRSAgICAgICAgICAgLyohPCBFcnJvciAqLw0KLSNkZWZpbmUgUkNDX0NSU19JVF9FU1lOQyBDUlNfQ1JfRVNZTkNJRSAgICAgICAvKiE8IEV4cGVjdGVkIFNZTkMgKi8NCi0jZGVmaW5lIFJDQ19DUlNfSVRfU1lOQ0VSUiBDUlNfQ1JfRVJSSUUgICAgICAgLyohPCBTWU5DIGVycm9yICovDQotI2RlZmluZSBSQ0NfQ1JTX0lUX1NZTkNNSVNTIENSU19DUl9FUlJJRSAgICAgIC8qITwgU1lOQyBtaXNzZWQgKi8NCi0jZGVmaW5lIFJDQ19DUlNfSVRfVFJJTU9WRiBDUlNfQ1JfRVJSSUUgLyohPCBUcmltbWluZyBvdmVyZmxvdyBvciB1bmRlcmZsb3cgKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDRXhfQ1JTX0ZsYWdzIFJDQ0V4IENSUyBGbGFncw0KLSAqIEB7DQotICovDQotI2RlZmluZSBSQ0NfQ1JTX0ZMQUdfU1lOQ09LIENSU19JU1JfU1lOQ09LRiAgICAgLyohPCBTWU5DIGV2ZW50IE9LIGZsYWcgICAgICovDQotI2RlZmluZSBSQ0NfQ1JTX0ZMQUdfU1lOQ1dBUk4gQ1JTX0lTUl9TWU5DV0FSTkYgLyohPCBTWU5DIHdhcm5pbmcgZmxhZyAgICAgICovDQotI2RlZmluZSBSQ0NfQ1JTX0ZMQUdfRVJSIENSU19JU1JfRVJSRiAgICAgICAgICAgLyohPCBFcnJvciBmbGFnICAgICAgICAqLw0KLSNkZWZpbmUgUkNDX0NSU19GTEFHX0VTWU5DIENSU19JU1JfRVNZTkNGICAgICAgIC8qITwgRXhwZWN0ZWQgU1lOQyBmbGFnICAgICAqLw0KLSNkZWZpbmUgUkNDX0NSU19GTEFHX1NZTkNFUlIgQ1JTX0lTUl9TWU5DRVJSICAgIC8qITwgU1lOQyBlcnJvciAqLw0KLSNkZWZpbmUgUkNDX0NSU19GTEFHX1NZTkNNSVNTIENSU19JU1JfU1lOQ01JU1MgIC8qITwgU1lOQyBtaXNzZWQqLw0KLSNkZWZpbmUgUkNDX0NSU19GTEFHX1RSSU1PVkYgXA0KLSAgQ1JTX0lTUl9UUklNT1ZGIC8qITwgVHJpbW1pbmcgb3ZlcmZsb3cgb3IgdW5kZXJmbG93ICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBkZWZncm91cCBSQ0NFeF9FeHBvcnRlZF9NYWNyb3MgUkNDRXggRXhwb3J0ZWQgTWFjcm9zDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGJyaWVmICBNYWNybyB0byBjb25maWd1cmUgdGhlIFVTQVJUMSBjbG9jayAoVVNBUlQxQ0xLKS4NCi0gKg0KLSAqIEBwYXJhbSAgX19VU0FSVDFfQ0xLU09VUkNFX18gc3BlY2lmaWVzIHRoZSBVU0FSVDEgY2xvY2sgc291cmNlLg0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VTQVJUMUNMS1NPVVJDRV9QQ0xLMiAgUENMSzIgc2VsZWN0ZWQgYXMgVVNBUlQxDQotICogY2xvY2sNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVVNBUlQxQ0xLU09VUkNFX0hTSSAgSFNJIHNlbGVjdGVkIGFzIFVTQVJUMSBjbG9jaw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VU0FSVDFDTEtTT1VSQ0VfU1lTQ0xLICBTeXN0ZW0gQ2xvY2sgc2VsZWN0ZWQgYXMNCi0gKiBVU0FSVDEgY2xvY2sNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVVNBUlQxQ0xLU09VUkNFX0xTRSAgTFNFIHNlbGVjdGVkIGFzIFVTQVJUMSBjbG9jaw0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUkNDX1VTQVJUMV9DT05GSUcoX19VU0FSVDFfQ0xLU09VUkNFX18pIFwNCi0gIE1PRElGWV9SRUcoUkNDLT5DQ0lQUiwgUkNDX0NDSVBSX1VTQVJUMVNFTCwgKF9fVVNBUlQxX0NMS1NPVVJDRV9fKSkNCi0NCi0vKiogQGJyaWVmICBNYWNybyB0byBnZXQgdGhlIFVTQVJUMSBjbG9jayBzb3VyY2UuDQotICogQHJldHZhbCBUaGUgY2xvY2sgc291cmNlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VTQVJUMUNMS1NPVVJDRV9QQ0xLMiAgUENMSzIgc2VsZWN0ZWQgYXMgVVNBUlQxDQotICogY2xvY2sNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVVNBUlQxQ0xLU09VUkNFX0hTSSAgSFNJIHNlbGVjdGVkIGFzIFVTQVJUMSBjbG9jaw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VU0FSVDFDTEtTT1VSQ0VfU1lTQ0xLICBTeXN0ZW0gQ2xvY2sgc2VsZWN0ZWQgYXMNCi0gKiBVU0FSVDEgY2xvY2sNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVVNBUlQxQ0xLU09VUkNFX0xTRSAgTFNFIHNlbGVjdGVkIGFzIFVTQVJUMSBjbG9jaw0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUkNDX0dFVF9VU0FSVDFfU09VUkNFKCkgXA0KLSAgKFJFQURfQklUKFJDQy0+Q0NJUFIsIFJDQ19DQ0lQUl9VU0FSVDFTRUwpKQ0KLQ0KLS8qKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgVVNBUlQyIGNsb2NrIChVU0FSVDJDTEspLg0KLSAqDQotICogQHBhcmFtICBfX1VTQVJUMl9DTEtTT1VSQ0VfXyBzcGVjaWZpZXMgdGhlIFVTQVJUMiBjbG9jayBzb3VyY2UuDQotICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVVNBUlQyQ0xLU09VUkNFX1BDTEsxICBQQ0xLMSBzZWxlY3RlZCBhcyBVU0FSVDINCi0gKiBjbG9jaw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VU0FSVDJDTEtTT1VSQ0VfSFNJICBIU0kgc2VsZWN0ZWQgYXMgVVNBUlQyIGNsb2NrDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VTQVJUMkNMS1NPVVJDRV9TWVNDTEsgIFN5c3RlbSBDbG9jayBzZWxlY3RlZCBhcw0KLSAqIFVTQVJUMiBjbG9jaw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VU0FSVDJDTEtTT1VSQ0VfTFNFICBMU0Ugc2VsZWN0ZWQgYXMgVVNBUlQyIGNsb2NrDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQyX0NPTkZJRyhfX1VTQVJUMl9DTEtTT1VSQ0VfXykgXA0KLSAgTU9ESUZZX1JFRyhSQ0MtPkNDSVBSLCBSQ0NfQ0NJUFJfVVNBUlQyU0VMLCAoX19VU0FSVDJfQ0xLU09VUkNFX18pKQ0KLQ0KLS8qKiBAYnJpZWYgIE1hY3JvIHRvIGdldCB0aGUgVVNBUlQyIGNsb2NrIHNvdXJjZS4NCi0gKiBAcmV0dmFsIFRoZSBjbG9jayBzb3VyY2UgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVVNBUlQyQ0xLU09VUkNFX1BDTEsxICBQQ0xLMSBzZWxlY3RlZCBhcyBVU0FSVDINCi0gKiBjbG9jaw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VU0FSVDJDTEtTT1VSQ0VfSFNJICBIU0kgc2VsZWN0ZWQgYXMgVVNBUlQyIGNsb2NrDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VTQVJUMkNMS1NPVVJDRV9TWVNDTEsgIFN5c3RlbSBDbG9jayBzZWxlY3RlZCBhcw0KLSAqIFVTQVJUMiBjbG9jaw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VU0FSVDJDTEtTT1VSQ0VfTFNFICBMU0Ugc2VsZWN0ZWQgYXMgVVNBUlQyIGNsb2NrDQotICovDQotI2RlZmluZSBfX0hBTF9SQ0NfR0VUX1VTQVJUMl9TT1VSQ0UoKSBcDQotICAoUkVBRF9CSVQoUkNDLT5DQ0lQUiwgUkNDX0NDSVBSX1VTQVJUMlNFTCkpDQotDQotLyoqIEBicmllZiAgTWFjcm8gdG8gY29uZmlndXJlIHRoZSBVU0FSVDMgY2xvY2sgKFVTQVJUM0NMSykuDQotICoNCi0gKiBAcGFyYW0gIF9fVVNBUlQzX0NMS1NPVVJDRV9fIHNwZWNpZmllcyB0aGUgVVNBUlQzIGNsb2NrIHNvdXJjZS4NCi0gKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VU0FSVDNDTEtTT1VSQ0VfUENMSzEgIFBDTEsxIHNlbGVjdGVkIGFzIFVTQVJUMw0KLSAqIGNsb2NrDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VTQVJUM0NMS1NPVVJDRV9IU0kgIEhTSSBzZWxlY3RlZCBhcyBVU0FSVDMgY2xvY2sNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVVNBUlQzQ0xLU09VUkNFX1NZU0NMSyAgU3lzdGVtIENsb2NrIHNlbGVjdGVkIGFzDQotICogVVNBUlQzIGNsb2NrDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VTQVJUM0NMS1NPVVJDRV9MU0UgIExTRSBzZWxlY3RlZCBhcyBVU0FSVDMgY2xvY2sNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDNfQ09ORklHKF9fVVNBUlQzX0NMS1NPVVJDRV9fKSBcDQotICBNT0RJRllfUkVHKFJDQy0+Q0NJUFIsIFJDQ19DQ0lQUl9VU0FSVDNTRUwsIChfX1VTQVJUM19DTEtTT1VSQ0VfXykpDQotDQotLyoqIEBicmllZiAgTWFjcm8gdG8gZ2V0IHRoZSBVU0FSVDMgY2xvY2sgc291cmNlLg0KLSAqIEByZXR2YWwgVGhlIGNsb2NrIHNvdXJjZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VU0FSVDNDTEtTT1VSQ0VfUENMSzEgIFBDTEsxIHNlbGVjdGVkIGFzIFVTQVJUMw0KLSAqIGNsb2NrDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VTQVJUM0NMS1NPVVJDRV9IU0kgIEhTSSBzZWxlY3RlZCBhcyBVU0FSVDMgY2xvY2sNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVVNBUlQzQ0xLU09VUkNFX1NZU0NMSyAgU3lzdGVtIENsb2NrIHNlbGVjdGVkIGFzDQotICogVVNBUlQzIGNsb2NrDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VTQVJUM0NMS1NPVVJDRV9MU0UgIExTRSBzZWxlY3RlZCBhcyBVU0FSVDMgY2xvY2sNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1JDQ19HRVRfVVNBUlQzX1NPVVJDRSgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkNDSVBSLCBSQ0NfQ0NJUFJfVVNBUlQzU0VMKSkNCi0NCi0jaWYgZGVmaW5lZChVQVJUNCkNCi0vKiogQGJyaWVmICBNYWNybyB0byBjb25maWd1cmUgdGhlIFVBUlQ0IGNsb2NrIChVQVJUNENMSykuDQotICoNCi0gKiBAcGFyYW0gIF9fVUFSVDRfQ0xLU09VUkNFX18gc3BlY2lmaWVzIHRoZSBVQVJUNCBjbG9jayBzb3VyY2UuDQotICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVUFSVDRDTEtTT1VSQ0VfUENMSzEgIFBDTEsxIHNlbGVjdGVkIGFzIFVBUlQ0IGNsb2NrDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VBUlQ0Q0xLU09VUkNFX0hTSSAgSFNJIHNlbGVjdGVkIGFzIFVBUlQ0IGNsb2NrDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VBUlQ0Q0xLU09VUkNFX1NZU0NMSyAgU3lzdGVtIENsb2NrIHNlbGVjdGVkIGFzDQotICogVUFSVDQgY2xvY2sNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVUFSVDRDTEtTT1VSQ0VfTFNFICBMU0Ugc2VsZWN0ZWQgYXMgVUFSVDQgY2xvY2sNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1JDQ19VQVJUNF9DT05GSUcoX19VQVJUNF9DTEtTT1VSQ0VfXykgXA0KLSAgTU9ESUZZX1JFRyhSQ0MtPkNDSVBSLCBSQ0NfQ0NJUFJfVUFSVDRTRUwsIChfX1VBUlQ0X0NMS1NPVVJDRV9fKSkNCi0NCi0vKiogQGJyaWVmICBNYWNybyB0byBnZXQgdGhlIFVBUlQ0IGNsb2NrIHNvdXJjZS4NCi0gKiBAcmV0dmFsIFRoZSBjbG9jayBzb3VyY2UgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVUFSVDRDTEtTT1VSQ0VfUENMSzEgIFBDTEsxIHNlbGVjdGVkIGFzIFVBUlQ0IGNsb2NrDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VBUlQ0Q0xLU09VUkNFX0hTSSAgSFNJIHNlbGVjdGVkIGFzIFVBUlQ0IGNsb2NrDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VBUlQ0Q0xLU09VUkNFX1NZU0NMSyAgU3lzdGVtIENsb2NrIHNlbGVjdGVkIGFzDQotICogVUFSVDQgY2xvY2sNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVUFSVDRDTEtTT1VSQ0VfTFNFICBMU0Ugc2VsZWN0ZWQgYXMgVUFSVDQgY2xvY2sNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1JDQ19HRVRfVUFSVDRfU09VUkNFKCkgKFJFQURfQklUKFJDQy0+Q0NJUFIsIFJDQ19DQ0lQUl9VQVJUNFNFTCkpDQotI2VuZGlmIC8qIFVBUlQ0ICovDQotDQotI2lmIGRlZmluZWQoVUFSVDUpDQotDQotLyoqIEBicmllZiAgTWFjcm8gdG8gY29uZmlndXJlIHRoZSBVQVJUNSBjbG9jayAoVUFSVDVDTEspLg0KLSAqDQotICogQHBhcmFtICBfX1VBUlQ1X0NMS1NPVVJDRV9fIHNwZWNpZmllcyB0aGUgVUFSVDUgY2xvY2sgc291cmNlLg0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VBUlQ1Q0xLU09VUkNFX1BDTEsxICBQQ0xLMSBzZWxlY3RlZCBhcyBVQVJUNSBjbG9jaw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VQVJUNUNMS1NPVVJDRV9IU0kgIEhTSSBzZWxlY3RlZCBhcyBVQVJUNSBjbG9jaw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VQVJUNUNMS1NPVVJDRV9TWVNDTEsgIFN5c3RlbSBDbG9jayBzZWxlY3RlZCBhcw0KLSAqIFVBUlQ1IGNsb2NrDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VBUlQ1Q0xLU09VUkNFX0xTRSAgTFNFIHNlbGVjdGVkIGFzIFVBUlQ1IGNsb2NrDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9SQ0NfVUFSVDVfQ09ORklHKF9fVUFSVDVfQ0xLU09VUkNFX18pIFwNCi0gIE1PRElGWV9SRUcoUkNDLT5DQ0lQUiwgUkNDX0NDSVBSX1VBUlQ1U0VMLCAoX19VQVJUNV9DTEtTT1VSQ0VfXykpDQotDQotLyoqIEBicmllZiAgTWFjcm8gdG8gZ2V0IHRoZSBVQVJUNSBjbG9jayBzb3VyY2UuDQotICogQHJldHZhbCBUaGUgY2xvY2sgc291cmNlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VBUlQ1Q0xLU09VUkNFX1BDTEsxICBQQ0xLMSBzZWxlY3RlZCBhcyBVQVJUNSBjbG9jaw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VQVJUNUNMS1NPVVJDRV9IU0kgIEhTSSBzZWxlY3RlZCBhcyBVQVJUNSBjbG9jaw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VQVJUNUNMS1NPVVJDRV9TWVNDTEsgIFN5c3RlbSBDbG9jayBzZWxlY3RlZCBhcw0KLSAqIFVBUlQ1IGNsb2NrDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VBUlQ1Q0xLU09VUkNFX0xTRSAgTFNFIHNlbGVjdGVkIGFzIFVBUlQ1IGNsb2NrDQotICovDQotI2RlZmluZSBfX0hBTF9SQ0NfR0VUX1VBUlQ1X1NPVVJDRSgpIChSRUFEX0JJVChSQ0MtPkNDSVBSLCBSQ0NfQ0NJUFJfVUFSVDVTRUwpKQ0KLQ0KLSNlbmRpZiAvKiBVQVJUNSAqLw0KLQ0KLS8qKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgTFBVQVJUMSBjbG9jayAoTFBVQVJUMUNMSykuDQotICoNCi0gKiBAcGFyYW0gIF9fTFBVQVJUMV9DTEtTT1VSQ0VfXyBzcGVjaWZpZXMgdGhlIExQVUFSVDEgY2xvY2sgc291cmNlLg0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0xQVUFSVDFDTEtTT1VSQ0VfUENMSzEgIFBDTEsxIHNlbGVjdGVkIGFzIExQVUFSVDENCi0gKiBjbG9jaw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19MUFVBUlQxQ0xLU09VUkNFX0hTSSAgSFNJIHNlbGVjdGVkIGFzIExQVUFSVDEgY2xvY2sNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFBVQVJUMUNMS1NPVVJDRV9TWVNDTEsgIFN5c3RlbSBDbG9jayBzZWxlY3RlZCBhcw0KLSAqIExQVUFSVDEgY2xvY2sNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFBVQVJUMUNMS1NPVVJDRV9MU0UgIExTRSBzZWxlY3RlZCBhcyBMUFVBUlQxIGNsb2NrDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9SQ0NfTFBVQVJUMV9DT05GSUcoX19MUFVBUlQxX0NMS1NPVVJDRV9fKSBcDQotICBNT0RJRllfUkVHKFJDQy0+Q0NJUFIsIFJDQ19DQ0lQUl9MUFVBUlQxU0VMLCAoX19MUFVBUlQxX0NMS1NPVVJDRV9fKSkNCi0NCi0vKiogQGJyaWVmICBNYWNybyB0byBnZXQgdGhlIExQVUFSVDEgY2xvY2sgc291cmNlLg0KLSAqIEByZXR2YWwgVGhlIGNsb2NrIHNvdXJjZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19MUFVBUlQxQ0xLU09VUkNFX1BDTEsxICBQQ0xLMSBzZWxlY3RlZCBhcyBMUFVBUlQxDQotICogY2xvY2sNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFBVQVJUMUNMS1NPVVJDRV9IU0kgIEhTSSBzZWxlY3RlZCBhcyBMUFVBUlQxIGNsb2NrDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0xQVUFSVDFDTEtTT1VSQ0VfU1lTQ0xLICBTeXN0ZW0gQ2xvY2sgc2VsZWN0ZWQgYXMNCi0gKiBMUFVBUlQxIGNsb2NrDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0xQVUFSVDFDTEtTT1VSQ0VfTFNFICBMU0Ugc2VsZWN0ZWQgYXMgTFBVQVJUMSBjbG9jaw0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUkNDX0dFVF9MUFVBUlQxX1NPVVJDRSgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkNDSVBSLCBSQ0NfQ0NJUFJfTFBVQVJUMVNFTCkpDQotDQotLyoqIEBicmllZiAgTWFjcm8gdG8gY29uZmlndXJlIHRoZSBJMkMxIGNsb2NrIChJMkMxQ0xLKS4NCi0gKg0KLSAqIEBwYXJhbSAgX19JMkMxX0NMS1NPVVJDRV9fIHNwZWNpZmllcyB0aGUgSTJDMSBjbG9jayBzb3VyY2UuDQotICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSTJDMUNMS1NPVVJDRV9QQ0xLMSAgUENMSzEgc2VsZWN0ZWQgYXMgSTJDMSBjbG9jaw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JMkMxQ0xLU09VUkNFX0hTSSAgSFNJIHNlbGVjdGVkIGFzIEkyQzEgY2xvY2sNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSTJDMUNMS1NPVVJDRV9TWVNDTEsgIFN5c3RlbSBDbG9jayBzZWxlY3RlZCBhcyBJMkMxDQotICogY2xvY2sNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1JDQ19JMkMxX0NPTkZJRyhfX0kyQzFfQ0xLU09VUkNFX18pIFwNCi0gIE1PRElGWV9SRUcoUkNDLT5DQ0lQUiwgUkNDX0NDSVBSX0kyQzFTRUwsIChfX0kyQzFfQ0xLU09VUkNFX18pKQ0KLQ0KLS8qKiBAYnJpZWYgIE1hY3JvIHRvIGdldCB0aGUgSTJDMSBjbG9jayBzb3VyY2UuDQotICogQHJldHZhbCBUaGUgY2xvY2sgc291cmNlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0kyQzFDTEtTT1VSQ0VfUENMSzEgIFBDTEsxIHNlbGVjdGVkIGFzIEkyQzEgY2xvY2sNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSTJDMUNMS1NPVVJDRV9IU0kgIEhTSSBzZWxlY3RlZCBhcyBJMkMxIGNsb2NrDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0kyQzFDTEtTT1VSQ0VfU1lTQ0xLICBTeXN0ZW0gQ2xvY2sgc2VsZWN0ZWQgYXMgSTJDMQ0KLSAqIGNsb2NrDQotICovDQotI2RlZmluZSBfX0hBTF9SQ0NfR0VUX0kyQzFfU09VUkNFKCkgKFJFQURfQklUKFJDQy0+Q0NJUFIsIFJDQ19DQ0lQUl9JMkMxU0VMKSkNCi0NCi0vKiogQGJyaWVmICBNYWNybyB0byBjb25maWd1cmUgdGhlIEkyQzIgY2xvY2sgKEkyQzJDTEspLg0KLSAqDQotICogQHBhcmFtICBfX0kyQzJfQ0xLU09VUkNFX18gc3BlY2lmaWVzIHRoZSBJMkMyIGNsb2NrIHNvdXJjZS4NCi0gKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JMkMyQ0xLU09VUkNFX1BDTEsxICBQQ0xLMSBzZWxlY3RlZCBhcyBJMkMyIGNsb2NrDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0kyQzJDTEtTT1VSQ0VfSFNJICBIU0kgc2VsZWN0ZWQgYXMgSTJDMiBjbG9jaw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JMkMyQ0xLU09VUkNFX1NZU0NMSyAgU3lzdGVtIENsb2NrIHNlbGVjdGVkIGFzIEkyQzINCi0gKiBjbG9jaw0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUkNDX0kyQzJfQ09ORklHKF9fSTJDMl9DTEtTT1VSQ0VfXykgXA0KLSAgTU9ESUZZX1JFRyhSQ0MtPkNDSVBSLCBSQ0NfQ0NJUFJfSTJDMlNFTCwgKF9fSTJDMl9DTEtTT1VSQ0VfXykpDQotDQotLyoqIEBicmllZiAgTWFjcm8gdG8gZ2V0IHRoZSBJMkMyIGNsb2NrIHNvdXJjZS4NCi0gKiBAcmV0dmFsIFRoZSBjbG9jayBzb3VyY2UgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSTJDMkNMS1NPVVJDRV9QQ0xLMSAgUENMSzEgc2VsZWN0ZWQgYXMgSTJDMiBjbG9jaw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JMkMyQ0xLU09VUkNFX0hTSSAgSFNJIHNlbGVjdGVkIGFzIEkyQzIgY2xvY2sNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSTJDMkNMS1NPVVJDRV9TWVNDTEsgIFN5c3RlbSBDbG9jayBzZWxlY3RlZCBhcyBJMkMyDQotICogY2xvY2sNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1JDQ19HRVRfSTJDMl9TT1VSQ0UoKSAoUkVBRF9CSVQoUkNDLT5DQ0lQUiwgUkNDX0NDSVBSX0kyQzJTRUwpKQ0KLQ0KLS8qKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgSTJDMyBjbG9jayAoSTJDM0NMSykuDQotICoNCi0gKiBAcGFyYW0gIF9fSTJDM19DTEtTT1VSQ0VfXyBzcGVjaWZpZXMgdGhlIEkyQzMgY2xvY2sgc291cmNlLg0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0kyQzNDTEtTT1VSQ0VfUENMSzEgIFBDTEsxIHNlbGVjdGVkIGFzIEkyQzMgY2xvY2sNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSTJDM0NMS1NPVVJDRV9IU0kgIEhTSSBzZWxlY3RlZCBhcyBJMkMzIGNsb2NrDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0kyQzNDTEtTT1VSQ0VfU1lTQ0xLICBTeXN0ZW0gQ2xvY2sgc2VsZWN0ZWQgYXMgSTJDMw0KLSAqIGNsb2NrDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9SQ0NfSTJDM19DT05GSUcoX19JMkMzX0NMS1NPVVJDRV9fKSBcDQotICBNT0RJRllfUkVHKFJDQy0+Q0NJUFIsIFJDQ19DQ0lQUl9JMkMzU0VMLCAoX19JMkMzX0NMS1NPVVJDRV9fKSkNCi0NCi0vKiogQGJyaWVmICBNYWNybyB0byBnZXQgdGhlIEkyQzMgY2xvY2sgc291cmNlLg0KLSAqIEByZXR2YWwgVGhlIGNsb2NrIHNvdXJjZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JMkMzQ0xLU09VUkNFX1BDTEsxICBQQ0xLMSBzZWxlY3RlZCBhcyBJMkMzIGNsb2NrDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0kyQzNDTEtTT1VSQ0VfSFNJICBIU0kgc2VsZWN0ZWQgYXMgSTJDMyBjbG9jaw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JMkMzQ0xLU09VUkNFX1NZU0NMSyAgU3lzdGVtIENsb2NrIHNlbGVjdGVkIGFzIEkyQzMNCi0gKiBjbG9jaw0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUkNDX0dFVF9JMkMzX1NPVVJDRSgpIChSRUFEX0JJVChSQ0MtPkNDSVBSLCBSQ0NfQ0NJUFJfSTJDM1NFTCkpDQotDQotI2lmIGRlZmluZWQoSTJDNCkNCi0NCi0vKiogQGJyaWVmICBNYWNybyB0byBjb25maWd1cmUgdGhlIEkyQzQgY2xvY2sgKEkyQzRDTEspLg0KLSAqDQotICogQHBhcmFtICBfX0kyQzRfQ0xLU09VUkNFX18gc3BlY2lmaWVzIHRoZSBJMkM0IGNsb2NrIHNvdXJjZS4NCi0gKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JMkM0Q0xLU09VUkNFX1BDTEsxICBQQ0xLMSBzZWxlY3RlZCBhcyBJMkM0IGNsb2NrDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0kyQzRDTEtTT1VSQ0VfSFNJICBIU0kgc2VsZWN0ZWQgYXMgSTJDNCBjbG9jaw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JMkM0Q0xLU09VUkNFX1NZU0NMSyAgU3lzdGVtIENsb2NrIHNlbGVjdGVkIGFzIEkyQzQNCi0gKiBjbG9jaw0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUkNDX0kyQzRfQ09ORklHKF9fSTJDNF9DTEtTT1VSQ0VfXykgXA0KLSAgTU9ESUZZX1JFRyhSQ0MtPkNDSVBSMiwgUkNDX0NDSVBSMl9JMkM0U0VMLCAoX19JMkM0X0NMS1NPVVJDRV9fKSkNCi0NCi0vKiogQGJyaWVmICBNYWNybyB0byBnZXQgdGhlIEkyQzQgY2xvY2sgc291cmNlLg0KLSAqIEByZXR2YWwgVGhlIGNsb2NrIHNvdXJjZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JMkM0Q0xLU09VUkNFX1BDTEsxICBQQ0xLMSBzZWxlY3RlZCBhcyBJMkM0IGNsb2NrDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0kyQzRDTEtTT1VSQ0VfSFNJICBIU0kgc2VsZWN0ZWQgYXMgSTJDNCBjbG9jaw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JMkM0Q0xLU09VUkNFX1NZU0NMSyAgU3lzdGVtIENsb2NrIHNlbGVjdGVkIGFzIEkyQzQNCi0gKiBjbG9jaw0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUkNDX0dFVF9JMkM0X1NPVVJDRSgpIChSRUFEX0JJVChSQ0MtPkNDSVBSMiwgUkNDX0NDSVBSMl9JMkM0U0VMKSkNCi0NCi0jZW5kaWYgLyogSTJDNCAqLw0KLQ0KLS8qKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgTFBUSU0xIGNsb2NrIChMUFRJTTFDTEspLg0KLSAqDQotICogQHBhcmFtICBfX0xQVElNMV9DTEtTT1VSQ0VfXyBzcGVjaWZpZXMgdGhlIExQVElNMSBjbG9jayBzb3VyY2UuDQotICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFBUSU0xQ0xLU09VUkNFX1BDTEsxICBQQ0xLMSBzZWxlY3RlZCBhcyBMUFRJTTENCi0gKiBjbG9jaw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19MUFRJTTFDTEtTT1VSQ0VfTFNJICBIU0kgc2VsZWN0ZWQgYXMgTFBUSU0xIGNsb2NrDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0xQVElNMUNMS1NPVVJDRV9IU0kgIExTSSBzZWxlY3RlZCBhcyBMUFRJTTEgY2xvY2sNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFBUSU0xQ0xLU09VUkNFX0xTRSAgTFNFIHNlbGVjdGVkIGFzIExQVElNMSBjbG9jaw0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUkNDX0xQVElNMV9DT05GSUcoX19MUFRJTTFfQ0xLU09VUkNFX18pIFwNCi0gIE1PRElGWV9SRUcoUkNDLT5DQ0lQUiwgUkNDX0NDSVBSX0xQVElNMVNFTCwgKF9fTFBUSU0xX0NMS1NPVVJDRV9fKSkNCi0NCi0vKiogQGJyaWVmICBNYWNybyB0byBnZXQgdGhlIExQVElNMSBjbG9jayBzb3VyY2UuDQotICogQHJldHZhbCBUaGUgY2xvY2sgc291cmNlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0xQVElNMUNMS1NPVVJDRV9QQ0xLMSAgUENMSzEgc2VsZWN0ZWQgYXMgTFBVQVJUMQ0KLSAqIGNsb2NrDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0xQVElNMUNMS1NPVVJDRV9MU0kgIEhTSSBzZWxlY3RlZCBhcyBMUFVBUlQxIGNsb2NrDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0xQVElNMUNMS1NPVVJDRV9IU0kgIFN5c3RlbSBDbG9jayBzZWxlY3RlZCBhcw0KLSAqIExQVUFSVDEgY2xvY2sNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFBUSU0xQ0xLU09VUkNFX0xTRSAgTFNFIHNlbGVjdGVkIGFzIExQVUFSVDEgY2xvY2sNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1JDQ19HRVRfTFBUSU0xX1NPVVJDRSgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkNDSVBSLCBSQ0NfQ0NJUFJfTFBUSU0xU0VMKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgU0FJMSBjbG9jayBzb3VyY2UuDQotICogQHBhcmFtICBfX1NBSTFfQ0xLU09VUkNFX18gZGVmaW5lcyB0aGUgU0FJMSBjbG9jayBzb3VyY2UuIFRoaXMgY2xvY2sgaXMNCi0gKiBkZXJpdmVkIGZyb20gdGhlIEhTSSwgc3lzdGVtIFBMTCwgU3lzdGVtIENsb2NrIG9yIGV4dGVybmFsIGNsb2NrLiBUaGlzDQotICogcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19TQUkxQ0xLU09VUkNFX1NZU0NMSyBTQUkxIGNsb2NrID0gU3lzdGVtIENsb2NrDQotICogICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19TQUkxQ0xLU09VUkNFX1BMTCAgICBTQUkxIGNsb2NrID0gUExMICJRIiBjbG9jaw0KLSAqICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfU0FJMUNMS1NPVVJDRV9FWFQgICAgU0FJMSBjbG9jayA9IEVYVA0KLSAqICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfU0FJMUNMS1NPVVJDRV9IU0kgICAgU0FJMSBjbG9jayA9IEhTSQ0KLSAqDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9SQ0NfU0FJMV9DT05GSUcoX19TQUkxX0NMS1NPVVJDRV9fKSBcDQotICBNT0RJRllfUkVHKFJDQy0+Q0NJUFIsIFJDQ19DQ0lQUl9TQUkxU0VMLCAoX19TQUkxX0NMS1NPVVJDRV9fKSkNCi0NCi0vKiogQGJyaWVmICBNYWNybyB0byBnZXQgdGhlIFNBSTEgY2xvY2sgc291cmNlLg0KLSAqIEByZXR2YWwgVGhlIGNsb2NrIHNvdXJjZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfU0FJMUNMS1NPVVJDRV9TWVNDTEsgU0FJMSBjbG9jayA9IFN5c3RlbSBDbG9jaw0KLSAqICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfU0FJMUNMS1NPVVJDRV9QTEwgICAgU0FJMSBjbG9jayA9IFBMTCAiUSIgY2xvY2sNCi0gKiAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX1NBSTFDTEtTT1VSQ0VfRVhUICAgIFNBSTEgY2xvY2sgPSBFWFQNCi0gKiAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX1NBSTFDTEtTT1VSQ0VfSFNJICAgIFNBSTEgY2xvY2sgPSBIU0kNCi0gKg0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUkNDX0dFVF9TQUkxX1NPVVJDRSgpIChSRUFEX0JJVChSQ0MtPkNDSVBSLCBSQ0NfQ0NJUFJfU0FJMVNFTCkpDQotDQotLyoqDQotICogQGJyaWVmICBNYWNybyB0byBjb25maWd1cmUgdGhlIEkyUyBjbG9jayBzb3VyY2UuDQotICogQHBhcmFtICBfX0kyU19DTEtTT1VSQ0VfXyBkZWZpbmVzIHRoZSBJMlMgY2xvY2sgc291cmNlLiBUaGlzIGNsb2NrIGlzIGRlcml2ZWQNCi0gKiAgICAgICAgIGZyb20gdGhlIEhTSSwgc3lzdGVtIFBMTCwgU3lzdGVtIENsb2NrIG9yIGV4dGVybmFsIGNsb2NrLg0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JMlNDTEtTT1VSQ0VfU1lTQ0xLIEkyUyBjbG9jayA9IFN5c3RlbSBDbG9jaw0KLSAqICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSTJTQ0xLU09VUkNFX1BMTCAgICBJMlMgY2xvY2sgPSBQTEwgIlEiIGNsb2NrDQotICogICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JMlNDTEtTT1VSQ0VfRVhUICAgIEkyUyBjbG9jayA9IEVYVA0KLSAqICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSTJTQ0xLU09VUkNFX0hTSSAgICBJMlMgY2xvY2sgPSBIU0kNCi0gKg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUkNDX0kyU19DT05GSUcoX19JMlNfQ0xLU09VUkNFX18pIFwNCi0gIE1PRElGWV9SRUcoUkNDLT5DQ0lQUiwgUkNDX0NDSVBSX0kyUzIzU0VMLCAoX19JMlNfQ0xLU09VUkNFX18pKQ0KLQ0KLS8qKiBAYnJpZWYgIE1hY3JvIHRvIGdldCB0aGUgSTJTIGNsb2NrIHNvdXJjZS4NCi0gKiBAcmV0dmFsIFRoZSBjbG9jayBzb3VyY2UgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0kyU0NMS1NPVVJDRV9TWVNDTEsgSTJTIGNsb2NrID0gU3lzdGVtIENsb2NrDQotICogICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JMlNDTEtTT1VSQ0VfUExMICAgIEkyUyBjbG9jayA9IFBMTCAiUSIgY2xvY2sNCi0gKiAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0kyU0NMS1NPVVJDRV9FWFQgICAgSTJTIGNsb2NrID0gRVhUDQotICogICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JMlNDTEtTT1VSQ0VfSFNJICAgIEkyUyBjbG9jayA9IEhTSQ0KLSAqDQotICovDQotI2RlZmluZSBfX0hBTF9SQ0NfR0VUX0kyU19TT1VSQ0UoKSBcDQotICAoKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPkNDSVBSLCBSQ0NfQ0NJUFJfSTJTMjNTRUwpKSkNCi0NCi0jaWYgZGVmaW5lZChGRENBTjEpDQotLyoqDQotICogQGJyaWVmICBNYWNybyB0byBjb25maWd1cmUgdGhlIEZEQ0FOIGNsb2NrIHNvdXJjZS4NCi0gKiBAcGFyYW0gIF9fRkRDQU5fQ0xLU09VUkNFX18gZGVmaW5lcyB0aGUgRkRDQU4gY2xvY2sgc291cmNlLiBUaGlzIGNsb2NrIGlzDQotICogZGVyaXZlZCBmcm9tIHRoZSBIU0UsIHN5c3RlbSBQTEwgb3IgUENMSzEuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlDQotICogZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0ZEQ0FOQ0xLU09VUkNFX0hTRSAgIEZEQ0FOIGNsb2NrID0gSFNFDQotICogICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19GRENBTkNMS1NPVVJDRV9QTEwgICBGRENBTiBjbG9jayA9IFBMTCAiUSIgY2xvY2sNCi0gKiAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0ZEQ0FOQ0xLU09VUkNFX1BDTEsxIEZEQ0FOIGNsb2NrID0gUENMSzENCi0gKg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUkNDX0ZEQ0FOX0NPTkZJRyhfX0ZEQ0FOX0NMS1NPVVJDRV9fKSBcDQotICBNT0RJRllfUkVHKFJDQy0+Q0NJUFIsIFJDQ19DQ0lQUl9GRENBTlNFTCwgKHVpbnQzMl90KShfX0ZEQ0FOX0NMS1NPVVJDRV9fKSkNCi0NCi0vKiogQGJyaWVmICBNYWNybyB0byBnZXQgdGhlIEZEQ0FOIGNsb2NrIHNvdXJjZS4NCi0gKiBAcmV0dmFsIFRoZSBjbG9jayBzb3VyY2UgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0ZEQ0FOQ0xLU09VUkNFX0hTRSAgIEZEQ0FOIGNsb2NrID0gSFNFDQotICogICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19GRENBTkNMS1NPVVJDRV9QTEwgICBGRENBTiBjbG9jayA9IFBMTCAiUSIgY2xvY2sNCi0gKiAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0ZEQ0FOQ0xLU09VUkNFX1BDTEsxIEZEQ0FOIGNsb2NrID0gUENMSzENCi0gKg0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUkNDX0dFVF9GRENBTl9TT1VSQ0UoKSBcDQotICAoKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPkNDSVBSLCBSQ0NfQ0NJUFJfRkRDQU5TRUwpKSkNCi0jZW5kaWYgLyogRkRDQU4xICovDQotDQotLyoqIEBicmllZiAgTWFjcm8gdG8gY29uZmlndXJlIHRoZSBSTkcgY2xvY2suDQotICoNCi0gKiBAbm90ZSAgVVNCIGFuZCBSTkcgcGVyaXBoZXJhbHMgc2hhcmUgdGhlIHNhbWUgNDhNSHogY2xvY2sgc291cmNlLg0KLSAqDQotICogQHBhcmFtICBfX1JOR19DTEtTT1VSQ0VfXyBzcGVjaWZpZXMgdGhlIFJORyBjbG9jayBzb3VyY2UuDQotICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19STkdDTEtTT1VSQ0VfSFNJNDggIEhTSTQ4IHNlbGVjdGVkIGFzIFJORyBjbG9jayBmb3INCi0gKiBkZXZpY2VzIHdpdGggSFNJNDgNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUk5HQ0xLU09VUkNFX1BMTCAgUExMIENsb2NrIHNlbGVjdGVkIGFzIFJORyBjbG9jaw0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUkNDX1JOR19DT05GSUcoX19STkdfQ0xLU09VUkNFX18pIFwNCi0gIE1PRElGWV9SRUcoUkNDLT5DQ0lQUiwgUkNDX0NDSVBSX0NMSzQ4U0VMLCAoX19STkdfQ0xLU09VUkNFX18pKQ0KLQ0KLS8qKiBAYnJpZWYgIE1hY3JvIHRvIGdldCB0aGUgUk5HIGNsb2NrLg0KLSAqIEByZXR2YWwgVGhlIGNsb2NrIHNvdXJjZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19STkdDTEtTT1VSQ0VfSFNJNDggIEhTSTQ4IHNlbGVjdGVkIGFzIFJORyBjbG9jayBmb3INCi0gKiBkZXZpY2VzIHdpdGggSFNJNDgNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUk5HQ0xLU09VUkNFX1BMTCAgUExMICJRIiBjbG9jayBzZWxlY3RlZCBhcyBSTkcNCi0gKiBjbG9jaw0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUkNDX0dFVF9STkdfU09VUkNFKCkgKFJFQURfQklUKFJDQy0+Q0NJUFIsIFJDQ19DQ0lQUl9DTEs0OFNFTCkpDQotDQotI2lmIGRlZmluZWQoVVNCKQ0KLQ0KLS8qKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgVVNCIGNsb2NrIChVU0JDTEspLg0KLSAqDQotICogQG5vdGUgIFVTQiwgUk5HIHBlcmlwaGVyYWxzIHNoYXJlIHRoZSBzYW1lIDQ4TUh6IGNsb2NrIHNvdXJjZS4NCi0gKg0KLSAqIEBwYXJhbSAgX19VU0JfQ0xLU09VUkNFX18gc3BlY2lmaWVzIHRoZSBVU0IgY2xvY2sgc291cmNlLg0KLSAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVVNCQ0xLU09VUkNFX0hTSTQ4ICBIU0k0OCBzZWxlY3RlZCBhcyA0OE1IeiBjbG9jaw0KLSAqIGZvciBkZXZpY2VzIHdpdGggSFNJNDgNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVVNCQ0xLU09VUkNFX1BMTCAgUExMICJRIiBjbG9jayAoUExMNDhNMUNMSykNCi0gKiBzZWxlY3RlZCBhcyBVU0IgY2xvY2sNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1JDQ19VU0JfQ09ORklHKF9fVVNCX0NMS1NPVVJDRV9fKSBcDQotICBNT0RJRllfUkVHKFJDQy0+Q0NJUFIsIFJDQ19DQ0lQUl9DTEs0OFNFTCwgKF9fVVNCX0NMS1NPVVJDRV9fKSkNCi0NCi0vKiogQGJyaWVmICBNYWNybyB0byBnZXQgdGhlIFVTQiBjbG9jayBzb3VyY2UuDQotICogQHJldHZhbCBUaGUgY2xvY2sgc291cmNlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VTQkNMS1NPVVJDRV9IU0k0OCAgSFNJNDggc2VsZWN0ZWQgYXMgNDhNSHogY2xvY2sNCi0gKiBmb3IgZGV2aWNlcyB3aXRoIEhTSTQ4DQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VTQkNMS1NPVVJDRV9QTEwgIFBMTCAiUSIgY2xvY2sgKFBMTDQ4TTFDTEspDQotICogc2VsZWN0ZWQgYXMgVVNCIGNsb2NrDQotICovDQotI2RlZmluZSBfX0hBTF9SQ0NfR0VUX1VTQl9TT1VSQ0UoKSAoUkVBRF9CSVQoUkNDLT5DQ0lQUiwgUkNDX0NDSVBSX0NMSzQ4U0VMKSkNCi0NCi0jZW5kaWYgLyogVVNCICovDQotDQotLyoqIEBicmllZiAgTWFjcm8gdG8gY29uZmlndXJlIHRoZSBBREMxMiBpbnRlcmZhY2UgY2xvY2suDQotICogQHBhcmFtICBfX0FEQzEyX0NMS1NPVVJDRV9fIHNwZWNpZmllcyB0aGUgQURDMTIgZGlnaXRhbCBpbnRlcmZhY2UgY2xvY2sNCi0gKiBzb3VyY2UuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0FEQzEyQ0xLU09VUkNFX05PTkUgICAgTm8gY2xvY2sgc2VsZWN0ZWQgYXMgQURDMTINCi0gKiBjbG9jaw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BREMxMkNMS1NPVVJDRV9QTEwgICAgIFBMTCBDbG9jayBzZWxlY3RlZCBhcyBBREMxMg0KLSAqIGNsb2NrDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0FEQzEyQ0xLU09VUkNFX1NZU0NMSyAgU3lzdGVtIENsb2NrIHNlbGVjdGVkIGFzDQotICogQURDMTIgY2xvY2sNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1JDQ19BREMxMl9DT05GSUcoX19BREMxMl9DTEtTT1VSQ0VfXykgXA0KLSAgTU9ESUZZX1JFRyhSQ0MtPkNDSVBSLCBSQ0NfQ0NJUFJfQURDMTJTRUwsIChfX0FEQzEyX0NMS1NPVVJDRV9fKSkNCi0NCi0vKiogQGJyaWVmICBNYWNybyB0byBnZXQgdGhlIEFEQzEyIGNsb2NrIHNvdXJjZS4NCi0gKiBAcmV0dmFsIFRoZSBjbG9jayBzb3VyY2UgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQURDMTJDTEtTT1VSQ0VfTk9ORSAgICBObyBjbG9jayBzZWxlY3RlZCBhcyBBREMxMg0KLSAqIGNsb2NrDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0FEQzEyQ0xLU09VUkNFX1BMTCAgICAgUExMIENsb2NrIHNlbGVjdGVkIGFzIEFEQzEyDQotICogY2xvY2sNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQURDMTJDTEtTT1VSQ0VfU1lTQ0xLICBTeXN0ZW0gQ2xvY2sgc2VsZWN0ZWQgYXMNCi0gKiBBREMxMiBjbG9jaw0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUkNDX0dFVF9BREMxMl9TT1VSQ0UoKSAoUkVBRF9CSVQoUkNDLT5DQ0lQUiwgUkNDX0NDSVBSX0FEQzEyU0VMKSkNCi0NCi0jaWYgZGVmaW5lZChBREMzNDVfQ09NTU9OKQ0KLS8qKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgQURDMzQ1IGludGVyZmFjZSBjbG9jay4NCi0gKiBAcGFyYW0gIF9fQURDMzQ1X0NMS1NPVVJDRV9fIHNwZWNpZmllcyB0aGUgQURDMzQ1IGRpZ2l0YWwgaW50ZXJmYWNlIGNsb2NrDQotICogc291cmNlLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BREMzNDVDTEtTT1VSQ0VfTk9ORSAgICBObyBjbG9jayBzZWxlY3RlZCBhcyBBREMzNDUNCi0gKiBjbG9jaw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BREMzNDVDTEtTT1VSQ0VfUExMICAgICBQTEwgQ2xvY2sgc2VsZWN0ZWQgYXMgQURDMzQ1DQotICogY2xvY2sNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQURDMzQ1Q0xLU09VUkNFX1NZU0NMSyAgU3lzdGVtIENsb2NrIHNlbGVjdGVkIGFzDQotICogQURDMzQ1IGNsb2NrDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9SQ0NfQURDMzQ1X0NPTkZJRyhfX0FEQzM0NV9DTEtTT1VSQ0VfXykgXA0KLSAgTU9ESUZZX1JFRyhSQ0MtPkNDSVBSLCBSQ0NfQ0NJUFJfQURDMzQ1U0VMLCBfX0FEQzM0NV9DTEtTT1VSQ0VfXykNCi0NCi0vKiogQGJyaWVmICBNYWNybyB0byBnZXQgdGhlIEFEQzM0NSBjbG9jayBzb3VyY2UuDQotICogQHJldHZhbCBUaGUgY2xvY2sgc291cmNlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0FEQzM0NUNMS1NPVVJDRV9OT05FICAgIE5vIGNsb2NrIHNlbGVjdGVkIGFzIEFEQzM0NQ0KLSAqIGNsb2NrDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0FEQzM0NUNMS1NPVVJDRV9QTEwgICAgIFBMTCBDbG9jayBzZWxlY3RlZCBhcyBBREMzNDUNCi0gKiBjbG9jaw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BREMzNDVDTEtTT1VSQ0VfU1lTQ0xLICBTeXN0ZW0gQ2xvY2sgc2VsZWN0ZWQgYXMNCi0gKiBBREMzNDUgY2xvY2sNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1JDQ19HRVRfQURDMzQ1X1NPVVJDRSgpIFwNCi0gIChSRUFEX0JJVChSQ0MtPkNDSVBSLCBSQ0NfQ0NJUFJfQURDMzQ1U0VMKSkNCi0jZW5kaWYgLyogQURDMzQ1X0NPTU1PTiAqLw0KLQ0KLSNpZiBkZWZpbmVkKFFVQURTUEkpDQotDQotLyoqIEBicmllZiAgTWFjcm8gdG8gY29uZmlndXJlIHRoZSBRdWFkU1BJIGNsb2NrLg0KLSAqIEBwYXJhbSAgX19RU1BJX0NMS1NPVVJDRV9fIHNwZWNpZmllcyB0aGUgUXVhZFNQSSBjbG9jayBzb3VyY2UuDQotICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19RU1BJQ0xLU09VUkNFX1NZU0NMSyAgU3lzdGVtIENsb2NrIHNlbGVjdGVkIGFzDQotICogUXVhZFNQSSBjbG9jaw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19RU1BJQ0xLU09VUkNFX0hTSSAgICAgSFNJIGNsb2NrIHNlbGVjdGVkIGFzIFF1YWRTUEkNCi0gKiBjbG9jaw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19RU1BJQ0xLU09VUkNFX1BMTCAgICAgUExMIFEgZGl2aWRlciBjbG9jayBzZWxlY3RlZA0KLSAqIGFzIFF1YWRTUEkgY2xvY2sNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1JDQ19RU1BJX0NPTkZJRyhfX1FTUElfQ0xLU09VUkNFX18pIFwNCi0gIE1PRElGWV9SRUcoUkNDLT5DQ0lQUjIsIFJDQ19DQ0lQUjJfUVNQSVNFTCwgX19RU1BJX0NMS1NPVVJDRV9fKQ0KLQ0KLS8qKiBAYnJpZWYgIE1hY3JvIHRvIGdldCB0aGUgUXVhZFNQSSBjbG9jayBzb3VyY2UuDQotICogQHJldHZhbCBUaGUgY2xvY2sgc291cmNlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1FTUElDTEtTT1VSQ0VfU1lTQ0xLICBTeXN0ZW0gQ2xvY2sgc2VsZWN0ZWQgYXMNCi0gKiBRdWFkU1BJIGNsb2NrDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1FTUElDTEtTT1VSQ0VfSFNJICAgICBIU0kgY2xvY2sgc2VsZWN0ZWQgYXMgUXVhZFNQSQ0KLSAqIGNsb2NrDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1FTUElDTEtTT1VSQ0VfUExMICAgICBQTEwgUSBkaXZpZGVyIGNsb2NrIHNlbGVjdGVkDQotICogYXMgUXVhZFNQSSBjbG9jaw0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUkNDX0dFVF9RU1BJX1NPVVJDRSgpIChSRUFEX0JJVChSQ0MtPkNDSVBSMiwgUkNDX0NDSVBSMl9RU1BJU0VMKSkNCi0NCi0jZW5kaWYgLyogUVVBRFNQSSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDRXhfRmxhZ3NfSW50ZXJydXB0c19NYW5hZ2VtZW50IEZsYWdzIEludGVycnVwdHMgTWFuYWdlbWVudA0KLSAqIEBicmllZiBtYWNyb3MgdG8gbWFuYWdlIHRoZSBzcGVjaWZpZWQgUkNDIEZsYWdzIGFuZCBpbnRlcnJ1cHRzLg0KLSAqIEB7DQotICovDQotDQotLyoqDQotICogQGJyaWVmIEVuYWJsZSB0aGUgUkNDIExTRSBDU1MgRXh0ZW5kZWQgSW50ZXJydXB0IExpbmUuDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9SQ0NfTFNFQ1NTX0VYVElfRU5BQkxFX0lUKCkgXA0KLSAgU0VUX0JJVChFWFRJLT5JTVIxLCBSQ0NfRVhUSV9MSU5FX0xTRUNTUykNCi0NCi0vKioNCi0gKiBAYnJpZWYgRGlzYWJsZSB0aGUgUkNDIExTRSBDU1MgRXh0ZW5kZWQgSW50ZXJydXB0IExpbmUuDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9SQ0NfTFNFQ1NTX0VYVElfRElTQUJMRV9JVCgpIFwNCi0gIENMRUFSX0JJVChFWFRJLT5JTVIxLCBSQ0NfRVhUSV9MSU5FX0xTRUNTUykNCi0NCi0vKioNCi0gKiBAYnJpZWYgRW5hYmxlIHRoZSBSQ0MgTFNFIENTUyBFdmVudCBMaW5lLg0KLSAqIEByZXR2YWwgTm9uZS4NCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1JDQ19MU0VDU1NfRVhUSV9FTkFCTEVfRVZFTlQoKSBcDQotICBTRVRfQklUKEVYVEktPkVNUjEsIFJDQ19FWFRJX0xJTkVfTFNFQ1NTKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBEaXNhYmxlIHRoZSBSQ0MgTFNFIENTUyBFdmVudCBMaW5lLg0KLSAqIEByZXR2YWwgTm9uZS4NCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1JDQ19MU0VDU1NfRVhUSV9ESVNBQkxFX0VWRU5UKCkgXA0KLSAgQ0xFQVJfQklUKEVYVEktPkVNUjEsIFJDQ19FWFRJX0xJTkVfTFNFQ1NTKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIHRoZSBSQ0MgTFNFIENTUyBFeHRlbmRlZCBJbnRlcnJ1cHQgRmFsbGluZyBUcmlnZ2VyLg0KLSAqIEByZXR2YWwgTm9uZS4NCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1JDQ19MU0VDU1NfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCkgXA0KLSAgU0VUX0JJVChFWFRJLT5GVFNSMSwgUkNDX0VYVElfTElORV9MU0VDU1MpDQotDQotLyoqDQotICogQGJyaWVmIERpc2FibGUgdGhlIFJDQyBMU0UgQ1NTIEV4dGVuZGVkIEludGVycnVwdCBGYWxsaW5nIFRyaWdnZXIuDQotICogQHJldHZhbCBOb25lLg0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUkNDX0xTRUNTU19FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCkgXA0KLSAgQ0xFQVJfQklUKEVYVEktPkZUU1IxLCBSQ0NfRVhUSV9MSU5FX0xTRUNTUykNCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSB0aGUgUkNDIExTRSBDU1MgRXh0ZW5kZWQgSW50ZXJydXB0IFJpc2luZyBUcmlnZ2VyLg0KLSAqIEByZXR2YWwgTm9uZS4NCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1JDQ19MU0VDU1NfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKSBcDQotICBTRVRfQklUKEVYVEktPlJUU1IxLCBSQ0NfRVhUSV9MSU5FX0xTRUNTUykNCi0NCi0vKioNCi0gKiBAYnJpZWYgRGlzYWJsZSB0aGUgUkNDIExTRSBDU1MgRXh0ZW5kZWQgSW50ZXJydXB0IFJpc2luZyBUcmlnZ2VyLg0KLSAqIEByZXR2YWwgTm9uZS4NCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1JDQ19MU0VDU1NfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCkgXA0KLSAgQ0xFQVJfQklUKEVYVEktPlJUU1IxLCBSQ0NfRVhUSV9MSU5FX0xTRUNTUykNCi0NCi0vKioNCi0gKiBAYnJpZWYgRW5hYmxlIHRoZSBSQ0MgTFNFIENTUyBFeHRlbmRlZCBJbnRlcnJ1cHQgUmlzaW5nICYgRmFsbGluZyBUcmlnZ2VyLg0KLSAqIEByZXR2YWwgTm9uZS4NCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1JDQ19MU0VDU1NfRVhUSV9FTkFCTEVfUklTSU5HX0ZBTExJTkdfRURHRSgpIFwNCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgX19IQUxfUkNDX0xTRUNTU19FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpOyAgICAgICAgICAgIFwNCi0gICAgX19IQUxfUkNDX0xTRUNTU19FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKTsgICAgICAgICAgIFwNCi0gIH0gd2hpbGUgKDApDQotDQotLyoqDQotICogQGJyaWVmIERpc2FibGUgdGhlIFJDQyBMU0UgQ1NTIEV4dGVuZGVkIEludGVycnVwdCBSaXNpbmcgJiBGYWxsaW5nIFRyaWdnZXIuDQotICogQHJldHZhbCBOb25lLg0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUkNDX0xTRUNTU19FWFRJX0RJU0FCTEVfUklTSU5HX0ZBTExJTkdfRURHRSgpIFwNCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIF9fSEFMX1JDQ19MU0VDU1NfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCk7ICAgICAgICAgICAgXA0KLSAgICBfX0hBTF9SQ0NfTFNFQ1NTX0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKTsgICAgICAgICAgIFwNCi0gIH0gd2hpbGUgKDApDQotDQotLyoqDQotICogQGJyaWVmIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBSQ0MgTFNFIENTUyBFWFRJIGludGVycnVwdCBmbGFnIGlzIHNldCBvcg0KLSAqIG5vdC4NCi0gKiBAcmV0dmFsIEVYVEkgUkNDIExTRSBDU1MgTGluZSBTdGF0dXMuDQotICovDQotI2RlZmluZSBfX0hBTF9SQ0NfTFNFQ1NTX0VYVElfR0VUX0ZMQUcoKSBcDQotICAoUkVBRF9CSVQoRVhUSS0+UFIxLCBSQ0NfRVhUSV9MSU5FX0xTRUNTUykgPT0gUkNDX0VYVElfTElORV9MU0VDU1MpDQotDQotLyoqDQotICogQGJyaWVmIENsZWFyIHRoZSBSQ0MgTFNFIENTUyBFWFRJIGZsYWcuDQotICogQHJldHZhbCBOb25lLg0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUkNDX0xTRUNTU19FWFRJX0NMRUFSX0ZMQUcoKSBcDQotICBXUklURV9SRUcoRVhUSS0+UFIxLCBSQ0NfRVhUSV9MSU5FX0xTRUNTUykNCi0NCi0vKioNCi0gKiBAYnJpZWYgR2VuZXJhdGUgYSBTb2Z0d2FyZSBpbnRlcnJ1cHQgb24gdGhlIFJDQyBMU0UgQ1NTIEVYVEkgbGluZS4NCi0gKiBAcmV0dmFsIE5vbmUuDQotICovDQotI2RlZmluZSBfX0hBTF9SQ0NfTFNFQ1NTX0VYVElfR0VORVJBVEVfU1dJVCgpIFwNCi0gIFNFVF9CSVQoRVhUSS0+U1dJRVIxLCBSQ0NfRVhUSV9MSU5FX0xTRUNTUykNCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSB0aGUgc3BlY2lmaWVkIENSUyBpbnRlcnJ1cHRzLg0KLSAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIENSUyBpbnRlcnJ1cHQgc291cmNlcyB0byBiZSBlbmFibGVkLg0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQ1JTX0lUX1NZTkNPSyAgU1lOQyBldmVudCBPSyBpbnRlcnJ1cHQNCi0gKiAgICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfSVRfU1lOQ1dBUk4gIFNZTkMgd2FybmluZyBpbnRlcnJ1cHQNCi0gKiAgICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfSVRfRVJSICBTeW5jaHJvbml6YXRpb24gb3IgdHJpbW1pbmcgZXJyb3INCi0gKiBpbnRlcnJ1cHQNCi0gKiAgICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfSVRfRVNZTkMgIEV4cGVjdGVkIFNZTkMgaW50ZXJydXB0DQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9SQ0NfQ1JTX0VOQUJMRV9JVChfX0lOVEVSUlVQVF9fKSBTRVRfQklUKENSUy0+Q1IsIChfX0lOVEVSUlVQVF9fKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgdGhlIHNwZWNpZmllZCBDUlMgaW50ZXJydXB0cy4NCi0gKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBDUlMgaW50ZXJydXB0IHNvdXJjZXMgdG8gYmUgZGlzYWJsZWQuDQotICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfSVRfU1lOQ09LICBTWU5DIGV2ZW50IE9LIGludGVycnVwdA0KLSAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19JVF9TWU5DV0FSTiAgU1lOQyB3YXJuaW5nIGludGVycnVwdA0KLSAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19JVF9FUlIgIFN5bmNocm9uaXphdGlvbiBvciB0cmltbWluZyBlcnJvcg0KLSAqIGludGVycnVwdA0KLSAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19JVF9FU1lOQyAgRXhwZWN0ZWQgU1lOQyBpbnRlcnJ1cHQNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1JDQ19DUlNfRElTQUJMRV9JVChfX0lOVEVSUlVQVF9fKSBcDQotICBDTEVBUl9CSVQoQ1JTLT5DUiwgKF9fSU5URVJSVVBUX18pKQ0KLQ0KLS8qKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIENSUyBpbnRlcnJ1cHQgaGFzIG9jY3VycmVkIG9yIG5vdC4NCi0gKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBDUlMgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjay4NCi0gKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQ1JTX0lUX1NZTkNPSyAgU1lOQyBldmVudCBPSyBpbnRlcnJ1cHQNCi0gKiAgICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfSVRfU1lOQ1dBUk4gIFNZTkMgd2FybmluZyBpbnRlcnJ1cHQNCi0gKiAgICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfSVRfRVJSICBTeW5jaHJvbml6YXRpb24gb3IgdHJpbW1pbmcgZXJyb3INCi0gKiBpbnRlcnJ1cHQNCi0gKiAgICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfSVRfRVNZTkMgIEV4cGVjdGVkIFNZTkMgaW50ZXJydXB0DQotICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fSU5URVJSVVBUX18gKFNFVCBvciBSRVNFVCkuDQotICovDQotI2RlZmluZSBfX0hBTF9SQ0NfQ1JTX0dFVF9JVF9TT1VSQ0UoX19JTlRFUlJVUFRfXykgXA0KLSAgKChSRUFEX0JJVChDUlMtPkNSLCAoX19JTlRFUlJVUFRfXykpICE9IDBVKSA/IFNFVCA6IFJFU0VUKQ0KLQ0KLS8qKiBAYnJpZWYgIENsZWFyIHRoZSBDUlMgaW50ZXJydXB0IHBlbmRpbmcgYml0cw0KLSAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIGludGVycnVwdCBwZW5kaW5nIGJpdCB0byBjbGVhci4NCi0gKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQ1JTX0lUX1NZTkNPSyAgU1lOQyBldmVudCBPSyBpbnRlcnJ1cHQNCi0gKiAgICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfSVRfU1lOQ1dBUk4gIFNZTkMgd2FybmluZyBpbnRlcnJ1cHQNCi0gKiAgICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfSVRfRVJSICBTeW5jaHJvbml6YXRpb24gb3IgdHJpbW1pbmcgZXJyb3INCi0gKiBpbnRlcnJ1cHQNCi0gKiAgICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfSVRfRVNZTkMgIEV4cGVjdGVkIFNZTkMgaW50ZXJydXB0DQotICogICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQ1JTX0lUX1RSSU1PVkYgIFRyaW1taW5nIG92ZXJmbG93IG9yIHVuZGVyZmxvdw0KLSAqIGludGVycnVwdA0KLSAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19JVF9TWU5DRVJSICBTWU5DIGVycm9yIGludGVycnVwdA0KLSAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19JVF9TWU5DTUlTUyAgU1lOQyBtaXNzZWQgaW50ZXJydXB0DQotICovDQotLyogQ1JTIElUIEVycm9yIE1hc2sgKi8NCi0jZGVmaW5lIFJDQ19DUlNfSVRfRVJST1JfTUFTSyBcDQotICAoUkNDX0NSU19JVF9UUklNT1ZGIHwgUkNDX0NSU19JVF9TWU5DRVJSIHwgUkNDX0NSU19JVF9TWU5DTUlTUykNCi0NCi0jZGVmaW5lIF9fSEFMX1JDQ19DUlNfQ0xFQVJfSVQoX19JTlRFUlJVUFRfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIGlmICgoKF9fSU5URVJSVVBUX18pICYgUkNDX0NSU19JVF9FUlJPUl9NQVNLKSAhPSAwVSkgeyAgICAgICAgICAgICAgICAgIFwNCi0gICAgICBXUklURV9SRUcoQ1JTLT5JQ1IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAgICAgICBDUlNfSUNSX0VSUkMgfCAoKF9fSU5URVJSVVBUX18pICYgflJDQ19DUlNfSVRfRVJST1JfTUFTSykpOyBcDQotICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICBXUklURV9SRUcoQ1JTLT5JQ1IsIChfX0lOVEVSUlVQVF9fKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICB9IHdoaWxlICgwKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIENSUyBmbGFnIGlzIHNldCBvciBub3QuDQotICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2hlY2suDQotICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfRkxBR19TWU5DT0sgIFNZTkMgZXZlbnQgT0sNCi0gKiAgICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfRkxBR19TWU5DV0FSTiAgU1lOQyB3YXJuaW5nDQotICogICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQ1JTX0ZMQUdfRVJSICBFcnJvcg0KLSAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19GTEFHX0VTWU5DICBFeHBlY3RlZCBTWU5DDQotICogICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQ1JTX0ZMQUdfVFJJTU9WRiAgVHJpbW1pbmcgb3ZlcmZsb3cgb3IgdW5kZXJmbG93DQotICogICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQ1JTX0ZMQUdfU1lOQ0VSUiAgU1lOQyBlcnJvcg0KLSAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19GTEFHX1NZTkNNSVNTICBTWU5DIG1pc3NlZA0KLSAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfRkxBR18gKFRSVUUgb3IgRkFMU0UpLg0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUkNDX0NSU19HRVRfRkxBRyhfX0ZMQUdfXykgXA0KLSAgKFJFQURfQklUKENSUy0+SVNSLCAoX19GTEFHX18pKSA9PSAoX19GTEFHX18pKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2xlYXIgdGhlIENSUyBzcGVjaWZpZWQgRkxBRy4NCi0gKiBAcGFyYW0gX19GTEFHX18gc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNsZWFyLg0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQ1JTX0ZMQUdfU1lOQ09LICBTWU5DIGV2ZW50IE9LDQotICogICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQ1JTX0ZMQUdfU1lOQ1dBUk4gIFNZTkMgd2FybmluZw0KLSAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19GTEFHX0VSUiAgRXJyb3INCi0gKiAgICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfRkxBR19FU1lOQyAgRXhwZWN0ZWQgU1lOQw0KLSAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19GTEFHX1RSSU1PVkYgIFRyaW1taW5nIG92ZXJmbG93IG9yIHVuZGVyZmxvdw0KLSAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19GTEFHX1NZTkNFUlIgIFNZTkMgZXJyb3INCi0gKiAgICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfRkxBR19TWU5DTUlTUyAgU1lOQyBtaXNzZWQNCi0gKiBAbm90ZSBSQ0NfQ1JTX0ZMQUdfRVJSIGNsZWFycyBSQ0NfQ1JTX0ZMQUdfVFJJTU9WRiwgUkNDX0NSU19GTEFHX1NZTkNFUlIsDQotICogUkNDX0NSU19GTEFHX1NZTkNNSVNTIGFuZCBjb25zZXF1ZW50bHkgUkNDX0NSU19GTEFHX0VSUg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLQ0KLS8qIENSUyBGbGFnIEVycm9yIE1hc2sgKi8NCi0jZGVmaW5lIFJDQ19DUlNfRkxBR19FUlJPUl9NQVNLIFwNCi0gIChSQ0NfQ1JTX0ZMQUdfVFJJTU9WRiB8IFJDQ19DUlNfRkxBR19TWU5DRVJSIHwgUkNDX0NSU19GTEFHX1NZTkNNSVNTKQ0KLQ0KLSNkZWZpbmUgX19IQUxfUkNDX0NSU19DTEVBUl9GTEFHKF9fRkxBR19fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgaWYgKCgoX19GTEFHX18pICYgUkNDX0NSU19GTEFHX0VSUk9SX01BU0spICE9IDBVKSB7ICAgICAgICAgICAgICAgICAgXA0KLSAgICAgIFdSSVRFX1JFRyhDUlMtPklDUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICAgICAgICAgIENSU19JQ1JfRVJSQyB8ICgoX19GTEFHX18pICYgflJDQ19DUlNfRkxBR19FUlJPUl9NQVNLKSk7IFwNCi0gICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgIFdSSVRFX1JFRyhDUlMtPklDUiwgKF9fRkxBR19fKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIH0gd2hpbGUgKDApDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFJDQ0V4X0NSU19FeHRlbmRlZF9GZWF0dXJlcyBSQ0NFeCBDUlMgRXh0ZW5kZWQgRmVhdHVyZXMNCi0gKiBAew0KLSAqLw0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIHRoZSBvc2NpbGxhdG9yIGNsb2NrIGZvciBmcmVxdWVuY3kgZXJyb3IgY291bnRlci4NCi0gKiBAbm90ZSAgIHdoZW4gdGhlIENFTiBiaXQgaXMgc2V0IHRoZSBDUlNfQ0ZHUiByZWdpc3RlciBiZWNvbWVzDQotICogd3JpdGUtcHJvdGVjdGVkLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUkNDX0NSU19GUkVRX0VSUk9SX0NPVU5URVJfRU5BQkxFKCkgU0VUX0JJVChDUlMtPkNSLCBDUlNfQ1JfQ0VOKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSB0aGUgb3NjaWxsYXRvciBjbG9jayBmb3IgZnJlcXVlbmN5IGVycm9yIGNvdW50ZXIuDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9SQ0NfQ1JTX0ZSRVFfRVJST1JfQ09VTlRFUl9ESVNBQkxFKCkgXA0KLSAgQ0xFQVJfQklUKENSUy0+Q1IsIENSU19DUl9DRU4pDQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgdGhlIGF1dG9tYXRpYyBoYXJkd2FyZSBhZGp1c3RtZW50IG9mIFRSSU0gYml0cy4NCi0gKiBAbm90ZSAgIFdoZW4gdGhlIEFVVE9UUklNRU4gYml0IGlzIHNldCB0aGUgQ1JTX0NGR1IgcmVnaXN0ZXIgYmVjb21lcw0KLSAqIHdyaXRlLXByb3RlY3RlZC4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1JDQ19DUlNfQVVUT01BVElDX0NBTElCX0VOQUJMRSgpIFwNCi0gIFNFVF9CSVQoQ1JTLT5DUiwgQ1JTX0NSX0FVVE9UUklNRU4pDQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgb3IgZGlzYWJsZSB0aGUgYXV0b21hdGljIGhhcmR3YXJlIGFkanVzdG1lbnQgb2YgVFJJTSBiaXRzLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUkNDX0NSU19BVVRPTUFUSUNfQ0FMSUJfRElTQUJMRSgpIFwNCi0gIENMRUFSX0JJVChDUlMtPkNSLCBDUlNfQ1JfQVVUT1RSSU1FTikNCi0NCi0vKioNCi0gKiBAYnJpZWYgIE1hY3JvIHRvIGNhbGN1bGF0ZSByZWxvYWQgdmFsdWUgdG8gYmUgc2V0IGluIENSUyByZWdpc3RlciBhY2NvcmRpbmcNCi0gKiB0byB0YXJnZXQgYW5kIHN5bmMgZnJlcXVlbmNpZXMNCi0gKiBAbm90ZSAgIFRoZSBSRUxPQUQgdmFsdWUgc2hvdWxkIGJlIHNlbGVjdGVkIGFjY29yZGluZyB0byB0aGUgcmF0aW8gYmV0d2Vlbg0KLSAqIHRoZSB0YXJnZXQgZnJlcXVlbmN5IGFuZCB0aGUgZnJlcXVlbmN5IG9mIHRoZSBzeW5jaHJvbml6YXRpb24gc291cmNlIGFmdGVyDQotICogcHJlc2NhbGluZy4gSXQgaXMgdGhlbiBkZWNyZWFzZWQgYnkgb25lIGluIG9yZGVyIHRvIHJlYWNoIHRoZSBleHBlY3RlZA0KLSAqIHN5bmNocm9uaXphdGlvbiBvbiB0aGUgemVybyB2YWx1ZS4gVGhlIGZvcm11bGEgaXMgdGhlIGZvbGxvd2luZzogUkVMT0FEID0NCi0gKiAoZlRBUkdFVCAvIGZTWU5DKSAtMQ0KLSAqIEBwYXJhbSAgX19GVEFSR0VUX18gVGFyZ2V0IGZyZXF1ZW5jeSAodmFsdWUgaW4gSHopDQotICogQHBhcmFtICBfX0ZTWU5DX18gU3luY2hyb25pemF0aW9uIHNpZ25hbCBmcmVxdWVuY3kgKHZhbHVlIGluIEh6KQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfUkNDX0NSU19SRUxPQURWQUxVRV9DQUxDVUxBVEUoX19GVEFSR0VUX18sIF9fRlNZTkNfXykgXA0KLSAgKCgoX19GVEFSR0VUX18pIC8gKF9fRlNZTkNfXykpIC0gMVUpDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBhZGR0b2dyb3VwIFJDQ0V4X0V4cG9ydGVkX0Z1bmN0aW9ucw0KLSAqIEB7DQotICovDQotDQotLyoqIEBhZGR0b2dyb3VwIFJDQ0V4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDENCi0gKiBAew0KLSAqLw0KLQ0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9SQ0NFeF9QZXJpcGhDTEtDb25maWcoDQotICAgIFJDQ19QZXJpcGhDTEtJbml0VHlwZURlZiAqUGVyaXBoQ2xrSW5pdCk7DQotdm9pZCBIQUxfUkNDRXhfR2V0UGVyaXBoQ0xLQ29uZmlnKFJDQ19QZXJpcGhDTEtJbml0VHlwZURlZiAqUGVyaXBoQ2xrSW5pdCk7DQotdWludDMyX3QgSEFMX1JDQ0V4X0dldFBlcmlwaENMS0ZyZXEodWludDMyX3QgUGVyaXBoQ2xrKTsNCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAYWRkdG9ncm91cCBSQ0NFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyDQotICogQHsNCi0gKi8NCi0NCi12b2lkIEhBTF9SQ0NFeF9FbmFibGVMU0VDU1Modm9pZCk7DQotdm9pZCBIQUxfUkNDRXhfRGlzYWJsZUxTRUNTUyh2b2lkKTsNCi12b2lkIEhBTF9SQ0NFeF9FbmFibGVMU0VDU1NfSVQodm9pZCk7DQotdm9pZCBIQUxfUkNDRXhfTFNFQ1NTX0lSUUhhbmRsZXIodm9pZCk7DQotdm9pZCBIQUxfUkNDRXhfTFNFQ1NTX0NhbGxiYWNrKHZvaWQpOw0KLXZvaWQgSEFMX1JDQ0V4X0VuYWJsZUxTQ08odWludDMyX3QgTFNDT1NvdXJjZSk7DQotdm9pZCBIQUxfUkNDRXhfRGlzYWJsZUxTQ08odm9pZCk7DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGFkZHRvZ3JvdXAgUkNDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMw0KLSAqIEB7DQotICovDQotDQotdm9pZCBIQUxfUkNDRXhfQ1JTQ29uZmlnKFJDQ19DUlNJbml0VHlwZURlZiAqcEluaXQpOw0KLXZvaWQgSEFMX1JDQ0V4X0NSU1NvZnR3YXJlU3luY2hyb25pemF0aW9uR2VuZXJhdGUodm9pZCk7DQotdm9pZCBIQUxfUkNDRXhfQ1JTR2V0U3luY2hyb25pemF0aW9uSW5mbygNCi0gICAgUkNDX0NSU1N5bmNocm9JbmZvVHlwZURlZiAqcFN5bmNocm9JbmZvKTsNCi11aW50MzJfdCBIQUxfUkNDRXhfQ1JTV2FpdFN5bmNocm9uaXphdGlvbih1aW50MzJfdCBUaW1lb3V0KTsNCi12b2lkIEhBTF9SQ0NFeF9DUlNfSVJRSGFuZGxlcih2b2lkKTsNCi12b2lkIEhBTF9SQ0NFeF9DUlNfU3luY09rQ2FsbGJhY2sodm9pZCk7DQotdm9pZCBIQUxfUkNDRXhfQ1JTX1N5bmNXYXJuQ2FsbGJhY2sodm9pZCk7DQotdm9pZCBIQUxfUkNDRXhfQ1JTX0V4cGVjdGVkU3luY0NhbGxiYWNrKHZvaWQpOw0KLXZvaWQgSEFMX1JDQ0V4X0NSU19FcnJvckNhbGxiYWNrKHVpbnQzMl90IEVycm9yKTsNCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGFkZHRvZ3JvdXAgUkNDRXhfUHJpdmF0ZV9NYWNyb3MNCi0gKiBAew0KLSAqLw0KLQ0KLSNkZWZpbmUgSVNfUkNDX0xTQ09TT1VSQ0UoX19TT1VSQ0VfXykgXA0KLSAgKCgoX19TT1VSQ0VfXykgPT0gUkNDX0xTQ09TT1VSQ0VfTFNJKSB8fCAoKF9fU09VUkNFX18pID09IFJDQ19MU0NPU09VUkNFX0xTRSkpDQotDQotI2lmIGRlZmluZWQoU1RNMzJHNDc0eHgpIHx8IGRlZmluZWQoU1RNMzJHNDg0eHgpDQotDQotI2RlZmluZSBJU19SQ0NfUEVSSVBIQ0xPQ0soX19TRUxFQ1RJT05fXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKCgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19VU0FSVDEpID09IFJDQ19QRVJJUEhDTEtfVVNBUlQxKSB8fCAgIFwNCi0gICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfVVNBUlQyKSA9PSBSQ0NfUEVSSVBIQ0xLX1VTQVJUMikgfHwgICBcDQotICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX1VTQVJUMykgPT0gUkNDX1BFUklQSENMS19VU0FSVDMpIHx8ICAgXA0KLSAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19VQVJUNCkgPT0gUkNDX1BFUklQSENMS19VQVJUNCkgfHwgICAgIFwNCi0gICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfVUFSVDUpID09IFJDQ19QRVJJUEhDTEtfVUFSVDUpIHx8ICAgICBcDQotICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0xQVUFSVDEpID09IFJDQ19QRVJJUEhDTEtfTFBVQVJUMSkgfHwgXA0KLSAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19JMkMxKSA9PSBSQ0NfUEVSSVBIQ0xLX0kyQzEpIHx8ICAgICAgIFwNCi0gICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfSTJDMikgPT0gUkNDX1BFUklQSENMS19JMkMyKSB8fCAgICAgICBcDQotICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0kyQzMpID09IFJDQ19QRVJJUEhDTEtfSTJDMykgfHwgICAgICAgXA0KLSAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19JMkM0KSA9PSBSQ0NfUEVSSVBIQ0xLX0kyQzQpIHx8ICAgICAgIFwNCi0gICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfTFBUSU0xKSA9PSBSQ0NfUEVSSVBIQ0xLX0xQVElNMSkgfHwgICBcDQotICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX1NBSTEpID09IFJDQ19QRVJJUEhDTEtfU0FJMSkgfHwgICAgICAgXA0KLSAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19JMlMpID09IFJDQ19QRVJJUEhDTEtfSTJTKSB8fCAgICAgICAgIFwNCi0gICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfRkRDQU4pID09IFJDQ19QRVJJUEhDTEtfRkRDQU4pIHx8ICAgICBcDQotICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX1VTQikgPT0gUkNDX1BFUklQSENMS19VU0IpIHx8ICAgICAgICAgXA0KLSAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19STkcpID09IFJDQ19QRVJJUEhDTEtfUk5HKSB8fCAgICAgICAgIFwNCi0gICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfQURDMTIpID09IFJDQ19QRVJJUEhDTEtfQURDMTIpIHx8ICAgICBcDQotICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0FEQzM0NSkgPT0gUkNDX1BFUklQSENMS19BREMzNDUpIHx8ICAgXA0KLSAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19RU1BJKSA9PSBSQ0NfUEVSSVBIQ0xLX1FTUEkpIHx8ICAgICAgIFwNCi0gICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfUlRDKSA9PSBSQ0NfUEVSSVBIQ0xLX1JUQykpDQotI2VsaWYgZGVmaW5lZChTVE0zMkc0OTF4eCkgfHwgZGVmaW5lZChTVE0zMkc0QTF4eCkNCi0NCi0jZGVmaW5lIElTX1JDQ19QRVJJUEhDTE9DSyhfX1NFTEVDVElPTl9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX1VTQVJUMSkgPT0gUkNDX1BFUklQSENMS19VU0FSVDEpIHx8ICAgXA0KLSAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19VU0FSVDIpID09IFJDQ19QRVJJUEhDTEtfVVNBUlQyKSB8fCAgIFwNCi0gICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfVVNBUlQzKSA9PSBSQ0NfUEVSSVBIQ0xLX1VTQVJUMykgfHwgICBcDQotICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX1VBUlQ0KSA9PSBSQ0NfUEVSSVBIQ0xLX1VBUlQ0KSB8fCAgICAgXA0KLSAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19VQVJUNSkgPT0gUkNDX1BFUklQSENMS19VQVJUNSkgfHwgICAgIFwNCi0gICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfTFBVQVJUMSkgPT0gUkNDX1BFUklQSENMS19MUFVBUlQxKSB8fCBcDQotICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0kyQzEpID09IFJDQ19QRVJJUEhDTEtfSTJDMSkgfHwgICAgICAgXA0KLSAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19JMkMyKSA9PSBSQ0NfUEVSSVBIQ0xLX0kyQzIpIHx8ICAgICAgIFwNCi0gICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfSTJDMykgPT0gUkNDX1BFUklQSENMS19JMkMzKSB8fCAgICAgICBcDQotICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0xQVElNMSkgPT0gUkNDX1BFUklQSENMS19MUFRJTTEpIHx8ICAgXA0KLSAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19TQUkxKSA9PSBSQ0NfUEVSSVBIQ0xLX1NBSTEpIHx8ICAgICAgIFwNCi0gICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfSTJTKSA9PSBSQ0NfUEVSSVBIQ0xLX0kyUykgfHwgICAgICAgICBcDQotICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0ZEQ0FOKSA9PSBSQ0NfUEVSSVBIQ0xLX0ZEQ0FOKSB8fCAgICAgXA0KLSAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19VU0IpID09IFJDQ19QRVJJUEhDTEtfVVNCKSB8fCAgICAgICAgIFwNCi0gICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfUk5HKSA9PSBSQ0NfUEVSSVBIQ0xLX1JORykgfHwgICAgICAgICBcDQotICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0FEQzEyKSA9PSBSQ0NfUEVSSVBIQ0xLX0FEQzEyKSB8fCAgICAgXA0KLSAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19BREMzNDUpID09IFJDQ19QRVJJUEhDTEtfQURDMzQ1KSB8fCAgIFwNCi0gICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfUVNQSSkgPT0gUkNDX1BFUklQSENMS19RU1BJKSB8fCAgICAgICBcDQotICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX1JUQykgPT0gUkNDX1BFUklQSENMS19SVEMpKQ0KLSNlbGlmIGRlZmluZWQoU1RNMzJHNDczeHgpIHx8IGRlZmluZWQoU1RNMzJHNDgzeHgpDQotDQotI2RlZmluZSBJU19SQ0NfUEVSSVBIQ0xPQ0soX19TRUxFQ1RJT05fXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKCgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19VU0FSVDEpID09IFJDQ19QRVJJUEhDTEtfVVNBUlQxKSB8fCAgIFwNCi0gICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfVVNBUlQyKSA9PSBSQ0NfUEVSSVBIQ0xLX1VTQVJUMikgfHwgICBcDQotICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX1VTQVJUMykgPT0gUkNDX1BFUklQSENMS19VU0FSVDMpIHx8ICAgXA0KLSAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19VQVJUNCkgPT0gUkNDX1BFUklQSENMS19VQVJUNCkgfHwgICAgIFwNCi0gICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfVUFSVDUpID09IFJDQ19QRVJJUEhDTEtfVUFSVDUpIHx8ICAgICBcDQotICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0xQVUFSVDEpID09IFJDQ19QRVJJUEhDTEtfTFBVQVJUMSkgfHwgXA0KLSAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19JMkMxKSA9PSBSQ0NfUEVSSVBIQ0xLX0kyQzEpIHx8ICAgICAgIFwNCi0gICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfSTJDMikgPT0gUkNDX1BFUklQSENMS19JMkMyKSB8fCAgICAgICBcDQotICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0kyQzMpID09IFJDQ19QRVJJUEhDTEtfSTJDMykgfHwgICAgICAgXA0KLSAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19JMkM0KSA9PSBSQ0NfUEVSSVBIQ0xLX0kyQzQpIHx8ICAgICAgIFwNCi0gICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfTFBUSU0xKSA9PSBSQ0NfUEVSSVBIQ0xLX0xQVElNMSkgfHwgICBcDQotICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX1NBSTEpID09IFJDQ19QRVJJUEhDTEtfU0FJMSkgfHwgICAgICAgXA0KLSAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19JMlMpID09IFJDQ19QRVJJUEhDTEtfSTJTKSB8fCAgICAgICAgIFwNCi0gICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfRkRDQU4pID09IFJDQ19QRVJJUEhDTEtfRkRDQU4pIHx8ICAgICBcDQotICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX1VTQikgPT0gUkNDX1BFUklQSENMS19VU0IpIHx8ICAgICAgICAgXA0KLSAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19STkcpID09IFJDQ19QRVJJUEhDTEtfUk5HKSB8fCAgICAgICAgIFwNCi0gICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfQURDMTIpID09IFJDQ19QRVJJUEhDTEtfQURDMTIpIHx8ICAgICBcDQotICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0FEQzM0NSkgPT0gUkNDX1BFUklQSENMS19BREMzNDUpIHx8ICAgXA0KLSAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19RU1BJKSA9PSBSQ0NfUEVSSVBIQ0xLX1FTUEkpIHx8ICAgICAgIFwNCi0gICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfUlRDKSA9PSBSQ0NfUEVSSVBIQ0xLX1JUQykpDQotDQotI2VsaWYgZGVmaW5lZChTVE0zMkc0NzF4eCkNCi0NCi0jZGVmaW5lIElTX1JDQ19QRVJJUEhDTE9DSyhfX1NFTEVDVElPTl9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX1VTQVJUMSkgPT0gUkNDX1BFUklQSENMS19VU0FSVDEpIHx8ICAgXA0KLSAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19VU0FSVDIpID09IFJDQ19QRVJJUEhDTEtfVVNBUlQyKSB8fCAgIFwNCi0gICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfVVNBUlQzKSA9PSBSQ0NfUEVSSVBIQ0xLX1VTQVJUMykgfHwgICBcDQotICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX1VBUlQ0KSA9PSBSQ0NfUEVSSVBIQ0xLX1VBUlQ0KSB8fCAgICAgXA0KLSAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19VQVJUNSkgPT0gUkNDX1BFUklQSENMS19VQVJUNSkgfHwgICAgIFwNCi0gICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfTFBVQVJUMSkgPT0gUkNDX1BFUklQSENMS19MUFVBUlQxKSB8fCBcDQotICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0kyQzEpID09IFJDQ19QRVJJUEhDTEtfSTJDMSkgfHwgICAgICAgXA0KLSAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19JMkMyKSA9PSBSQ0NfUEVSSVBIQ0xLX0kyQzIpIHx8ICAgICAgIFwNCi0gICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfSTJDMykgPT0gUkNDX1BFUklQSENMS19JMkMzKSB8fCAgICAgICBcDQotICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0kyQzQpID09IFJDQ19QRVJJUEhDTEtfSTJDNCkgfHwgICAgICAgXA0KLSAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19MUFRJTTEpID09IFJDQ19QRVJJUEhDTEtfTFBUSU0xKSB8fCAgIFwNCi0gICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfU0FJMSkgPT0gUkNDX1BFUklQSENMS19TQUkxKSB8fCAgICAgICBcDQotICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0kyUykgPT0gUkNDX1BFUklQSENMS19JMlMpIHx8ICAgICAgICAgXA0KLSAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19VU0IpID09IFJDQ19QRVJJUEhDTEtfVVNCKSB8fCAgICAgICAgIFwNCi0gICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfUk5HKSA9PSBSQ0NfUEVSSVBIQ0xLX1JORykgfHwgICAgICAgICBcDQotICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0FEQzEyKSA9PSBSQ0NfUEVSSVBIQ0xLX0FEQzEyKSB8fCAgICAgXA0KLSAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19SVEMpID09IFJDQ19QRVJJUEhDTEtfUlRDKSkNCi0NCi0jZWxpZiBkZWZpbmVkKFNUTTMyRzQzMXh4KSB8fCBkZWZpbmVkKFNUTTMyRzQ0MXh4KQ0KLQ0KLSNkZWZpbmUgSVNfUkNDX1BFUklQSENMT0NLKF9fU0VMRUNUSU9OX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfVVNBUlQxKSA9PSBSQ0NfUEVSSVBIQ0xLX1VTQVJUMSkgfHwgICBcDQotICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX1VTQVJUMikgPT0gUkNDX1BFUklQSENMS19VU0FSVDIpIHx8ICAgXA0KLSAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19VU0FSVDMpID09IFJDQ19QRVJJUEhDTEtfVVNBUlQzKSB8fCAgIFwNCi0gICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfVUFSVDQpID09IFJDQ19QRVJJUEhDTEtfVUFSVDQpIHx8ICAgICBcDQotICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0xQVUFSVDEpID09IFJDQ19QRVJJUEhDTEtfTFBVQVJUMSkgfHwgXA0KLSAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19JMkMxKSA9PSBSQ0NfUEVSSVBIQ0xLX0kyQzEpIHx8ICAgICAgIFwNCi0gICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfSTJDMikgPT0gUkNDX1BFUklQSENMS19JMkMyKSB8fCAgICAgICBcDQotICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0kyQzMpID09IFJDQ19QRVJJUEhDTEtfSTJDMykgfHwgICAgICAgXA0KLSAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19MUFRJTTEpID09IFJDQ19QRVJJUEhDTEtfTFBUSU0xKSB8fCAgIFwNCi0gICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfU0FJMSkgPT0gUkNDX1BFUklQSENMS19TQUkxKSB8fCAgICAgICBcDQotICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0kyUykgPT0gUkNDX1BFUklQSENMS19JMlMpIHx8ICAgICAgICAgXA0KLSAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19GRENBTikgPT0gUkNDX1BFUklQSENMS19GRENBTikgfHwgICAgIFwNCi0gICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfVVNCKSA9PSBSQ0NfUEVSSVBIQ0xLX1VTQikgfHwgICAgICAgICBcDQotICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX1JORykgPT0gUkNDX1BFUklQSENMS19STkcpIHx8ICAgICAgICAgXA0KLSAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19BREMxMikgPT0gUkNDX1BFUklQSENMS19BREMxMikgfHwgICAgIFwNCi0gICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfUlRDKSA9PSBSQ0NfUEVSSVBIQ0xLX1JUQykpDQotDQotI2VsaWYgZGVmaW5lZChTVE0zMkdCSzFDQikNCi0jZGVmaW5lIElTX1JDQ19QRVJJUEhDTE9DSyhfX1NFTEVDVElPTl9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX1VTQVJUMSkgPT0gUkNDX1BFUklQSENMS19VU0FSVDEpIHx8ICAgXA0KLSAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19VU0FSVDIpID09IFJDQ19QRVJJUEhDTEtfVVNBUlQyKSB8fCAgIFwNCi0gICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfVVNBUlQzKSA9PSBSQ0NfUEVSSVBIQ0xLX1VTQVJUMykgfHwgICBcDQotICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0xQVUFSVDEpID09IFJDQ19QRVJJUEhDTEtfTFBVQVJUMSkgfHwgXA0KLSAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19JMkMxKSA9PSBSQ0NfUEVSSVBIQ0xLX0kyQzEpIHx8ICAgICAgIFwNCi0gICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfSTJDMikgPT0gUkNDX1BFUklQSENMS19JMkMyKSB8fCAgICAgICBcDQotICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0kyQzMpID09IFJDQ19QRVJJUEhDTEtfSTJDMykgfHwgICAgICAgXA0KLSAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19MUFRJTTEpID09IFJDQ19QRVJJUEhDTEtfTFBUSU0xKSB8fCAgIFwNCi0gICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfU0FJMSkgPT0gUkNDX1BFUklQSENMS19TQUkxKSB8fCAgICAgICBcDQotICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0kyUykgPT0gUkNDX1BFUklQSENMS19JMlMpIHx8ICAgICAgICAgXA0KLSAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19GRENBTikgPT0gUkNDX1BFUklQSENMS19GRENBTikgfHwgICAgIFwNCi0gICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfVVNCKSA9PSBSQ0NfUEVSSVBIQ0xLX1VTQikgfHwgICAgICAgICBcDQotICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX1JORykgPT0gUkNDX1BFUklQSENMS19STkcpIHx8ICAgICAgICAgXA0KLSAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19BREMxMikgPT0gUkNDX1BFUklQSENMS19BREMxMikgfHwgICAgIFwNCi0gICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfUlRDKSA9PSBSQ0NfUEVSSVBIQ0xLX1JUQykpDQotDQotI2VuZGlmIC8qIFNUTTMyRzQ3NHh4IHx8IFNUTTMyRzQ4NHh4ICovDQotDQotI2RlZmluZSBJU19SQ0NfVVNBUlQxQ0xLU09VUkNFKF9fU09VUkNFX18pICAgICAgICAgXA0KLSAgKCgoX19TT1VSQ0VfXykgPT0gUkNDX1VTQVJUMUNMS1NPVVJDRV9QQ0xLMikgfHwgIFwNCi0gICAoKF9fU09VUkNFX18pID09IFJDQ19VU0FSVDFDTEtTT1VSQ0VfU1lTQ0xLKSB8fCBcDQotICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfVVNBUlQxQ0xLU09VUkNFX0xTRSkgfHwgICAgXA0KLSAgICgoX19TT1VSQ0VfXykgPT0gUkNDX1VTQVJUMUNMS1NPVVJDRV9IU0kpKQ0KLQ0KLSNkZWZpbmUgSVNfUkNDX1VTQVJUMkNMS1NPVVJDRShfX1NPVVJDRV9fKSAgICAgICAgIFwNCi0gICgoKF9fU09VUkNFX18pID09IFJDQ19VU0FSVDJDTEtTT1VSQ0VfUENMSzEpIHx8ICBcDQotICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfVVNBUlQyQ0xLU09VUkNFX1NZU0NMSykgfHwgXA0KLSAgICgoX19TT1VSQ0VfXykgPT0gUkNDX1VTQVJUMkNMS1NPVVJDRV9MU0UpIHx8ICAgIFwNCi0gICAoKF9fU09VUkNFX18pID09IFJDQ19VU0FSVDJDTEtTT1VSQ0VfSFNJKSkNCi0NCi0jZGVmaW5lIElTX1JDQ19VU0FSVDNDTEtTT1VSQ0UoX19TT1VSQ0VfXykgICAgICAgICBcDQotICAoKChfX1NPVVJDRV9fKSA9PSBSQ0NfVVNBUlQzQ0xLU09VUkNFX1BDTEsxKSB8fCAgXA0KLSAgICgoX19TT1VSQ0VfXykgPT0gUkNDX1VTQVJUM0NMS1NPVVJDRV9TWVNDTEspIHx8IFwNCi0gICAoKF9fU09VUkNFX18pID09IFJDQ19VU0FSVDNDTEtTT1VSQ0VfTFNFKSB8fCAgICBcDQotICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfVVNBUlQzQ0xLU09VUkNFX0hTSSkpDQotDQotI2lmIGRlZmluZWQoVUFSVDQpDQotI2RlZmluZSBJU19SQ0NfVUFSVDRDTEtTT1VSQ0UoX19TT1VSQ0VfXykgICAgICAgICBcDQotICAoKChfX1NPVVJDRV9fKSA9PSBSQ0NfVUFSVDRDTEtTT1VSQ0VfUENMSzEpIHx8ICBcDQotICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfVUFSVDRDTEtTT1VSQ0VfU1lTQ0xLKSB8fCBcDQotICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfVUFSVDRDTEtTT1VSQ0VfTFNFKSB8fCAgICBcDQotICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfVUFSVDRDTEtTT1VSQ0VfSFNJKSkNCi0jZW5kaWYgLyogVUFSVDQgKi8NCi0NCi0jaWYgZGVmaW5lZChVQVJUNSkNCi0jZGVmaW5lIElTX1JDQ19VQVJUNUNMS1NPVVJDRShfX1NPVVJDRV9fKSAgICAgICAgIFwNCi0gICgoKF9fU09VUkNFX18pID09IFJDQ19VQVJUNUNMS1NPVVJDRV9QQ0xLMSkgfHwgIFwNCi0gICAoKF9fU09VUkNFX18pID09IFJDQ19VQVJUNUNMS1NPVVJDRV9TWVNDTEspIHx8IFwNCi0gICAoKF9fU09VUkNFX18pID09IFJDQ19VQVJUNUNMS1NPVVJDRV9MU0UpIHx8ICAgIFwNCi0gICAoKF9fU09VUkNFX18pID09IFJDQ19VQVJUNUNMS1NPVVJDRV9IU0kpKQ0KLQ0KLSNlbmRpZiAvKiBVQVJUNSAqLw0KLQ0KLSNkZWZpbmUgSVNfUkNDX0xQVUFSVDFDTEtTT1VSQ0UoX19TT1VSQ0VfXykgICAgICAgICBcDQotICAoKChfX1NPVVJDRV9fKSA9PSBSQ0NfTFBVQVJUMUNMS1NPVVJDRV9QQ0xLMSkgfHwgIFwNCi0gICAoKF9fU09VUkNFX18pID09IFJDQ19MUFVBUlQxQ0xLU09VUkNFX1NZU0NMSykgfHwgXA0KLSAgICgoX19TT1VSQ0VfXykgPT0gUkNDX0xQVUFSVDFDTEtTT1VSQ0VfTFNFKSB8fCAgICBcDQotICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfTFBVQVJUMUNMS1NPVVJDRV9IU0kpKQ0KLQ0KLSNkZWZpbmUgSVNfUkNDX0kyQzFDTEtTT1VSQ0UoX19TT1VSQ0VfXykgICAgICAgICBcDQotICAoKChfX1NPVVJDRV9fKSA9PSBSQ0NfSTJDMUNMS1NPVVJDRV9QQ0xLMSkgfHwgIFwNCi0gICAoKF9fU09VUkNFX18pID09IFJDQ19JMkMxQ0xLU09VUkNFX1NZU0NMSykgfHwgXA0KLSAgICgoX19TT1VSQ0VfXykgPT0gUkNDX0kyQzFDTEtTT1VSQ0VfSFNJKSkNCi0NCi0jZGVmaW5lIElTX1JDQ19JMkMyQ0xLU09VUkNFKF9fU09VUkNFX18pICAgICAgICAgXA0KLSAgKCgoX19TT1VSQ0VfXykgPT0gUkNDX0kyQzJDTEtTT1VSQ0VfUENMSzEpIHx8ICBcDQotICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfSTJDMkNMS1NPVVJDRV9TWVNDTEspIHx8IFwNCi0gICAoKF9fU09VUkNFX18pID09IFJDQ19JMkMyQ0xLU09VUkNFX0hTSSkpDQotDQotI2RlZmluZSBJU19SQ0NfSTJDM0NMS1NPVVJDRShfX1NPVVJDRV9fKSAgICAgICAgIFwNCi0gICgoKF9fU09VUkNFX18pID09IFJDQ19JMkMzQ0xLU09VUkNFX1BDTEsxKSB8fCAgXA0KLSAgICgoX19TT1VSQ0VfXykgPT0gUkNDX0kyQzNDTEtTT1VSQ0VfU1lTQ0xLKSB8fCBcDQotICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfSTJDM0NMS1NPVVJDRV9IU0kpKQ0KLQ0KLSNpZiBkZWZpbmVkKEkyQzQpDQotDQotI2RlZmluZSBJU19SQ0NfSTJDNENMS1NPVVJDRShfX1NPVVJDRV9fKSAgICAgICAgIFwNCi0gICgoKF9fU09VUkNFX18pID09IFJDQ19JMkM0Q0xLU09VUkNFX1BDTEsxKSB8fCAgXA0KLSAgICgoX19TT1VSQ0VfXykgPT0gUkNDX0kyQzRDTEtTT1VSQ0VfU1lTQ0xLKSB8fCBcDQotICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfSTJDNENMS1NPVVJDRV9IU0kpKQ0KLQ0KLSNlbmRpZiAvKiBJMkM0ICovDQotDQotI2RlZmluZSBJU19SQ0NfTFBUSU0xQ0xLU09VUkNFKF9fU09VUkNFX18pICAgICAgICBcDQotICAoKChfX1NPVVJDRV9fKSA9PSBSQ0NfTFBUSU0xQ0xLU09VUkNFX1BDTEsxKSB8fCBcDQotICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfTFBUSU0xQ0xLU09VUkNFX0xTSSkgfHwgICBcDQotICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfTFBUSU0xQ0xLU09VUkNFX0hTSSkgfHwgICBcDQotICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfTFBUSU0xQ0xLU09VUkNFX0xTRSkpDQotDQotI2RlZmluZSBJU19SQ0NfU0FJMUNMS1NPVVJDRShfX1NPVVJDRV9fKSAgICAgICAgIFwNCi0gICgoKF9fU09VUkNFX18pID09IFJDQ19TQUkxQ0xLU09VUkNFX1NZU0NMSykgfHwgXA0KLSAgICgoX19TT1VSQ0VfXykgPT0gUkNDX1NBSTFDTEtTT1VSQ0VfUExMKSB8fCAgICBcDQotICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfU0FJMUNMS1NPVVJDRV9FWFQpIHx8ICAgIFwNCi0gICAoKF9fU09VUkNFX18pID09IFJDQ19TQUkxQ0xLU09VUkNFX0hTSSkpDQotDQotI2RlZmluZSBJU19SQ0NfSTJTQ0xLU09VUkNFKF9fU09VUkNFX18pICAgICAgICAgXA0KLSAgKCgoX19TT1VSQ0VfXykgPT0gUkNDX0kyU0NMS1NPVVJDRV9TWVNDTEspIHx8IFwNCi0gICAoKF9fU09VUkNFX18pID09IFJDQ19JMlNDTEtTT1VSQ0VfUExMKSB8fCAgICBcDQotICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfSTJTQ0xLU09VUkNFX0VYVCkgfHwgICAgXA0KLSAgICgoX19TT1VSQ0VfXykgPT0gUkNDX0kyU0NMS1NPVVJDRV9IU0kpKQ0KLQ0KLSNpZiBkZWZpbmVkKEZEQ0FOMSkNCi0jZGVmaW5lIElTX1JDQ19GRENBTkNMS1NPVVJDRShfX1NPVVJDRV9fKSAgICAgIFwNCi0gICgoKF9fU09VUkNFX18pID09IFJDQ19GRENBTkNMS1NPVVJDRV9IU0UpIHx8IFwNCi0gICAoKF9fU09VUkNFX18pID09IFJDQ19GRENBTkNMS1NPVVJDRV9QTEwpIHx8IFwNCi0gICAoKF9fU09VUkNFX18pID09IFJDQ19GRENBTkNMS1NPVVJDRV9QQ0xLMSkpDQotDQotI2VuZGlmIC8qIEZEQ0FOMSAqLw0KLSNkZWZpbmUgSVNfUkNDX1JOR0NMS1NPVVJDRShfX1NPVVJDRV9fKSAgICAgICAgXA0KLSAgKCgoX19TT1VSQ0VfXykgPT0gUkNDX1JOR0NMS1NPVVJDRV9IU0k0OCkgfHwgXA0KLSAgICgoX19TT1VSQ0VfXykgPT0gUkNDX1JOR0NMS1NPVVJDRV9QTEwpKQ0KLQ0KLSNpZiBkZWZpbmVkKFVTQikNCi0jZGVmaW5lIElTX1JDQ19VU0JDTEtTT1VSQ0UoX19TT1VSQ0VfXykgICAgICAgIFwNCi0gICgoKF9fU09VUkNFX18pID09IFJDQ19VU0JDTEtTT1VSQ0VfSFNJNDgpIHx8IFwNCi0gICAoKF9fU09VUkNFX18pID09IFJDQ19VU0JDTEtTT1VSQ0VfUExMKSkNCi0NCi0jZW5kaWYgLyogVVNCICovDQotDQotI2RlZmluZSBJU19SQ0NfQURDMTJDTEtTT1VSQ0UoX19TT1VSQ0VfXykgICAgICAgXA0KLSAgKCgoX19TT1VSQ0VfXykgPT0gUkNDX0FEQzEyQ0xLU09VUkNFX05PTkUpIHx8IFwNCi0gICAoKF9fU09VUkNFX18pID09IFJDQ19BREMxMkNMS1NPVVJDRV9QTEwpIHx8ICBcDQotICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfQURDMTJDTEtTT1VSQ0VfU1lTQ0xLKSkNCi0NCi0jaWYgZGVmaW5lZChBREMzNDVfQ09NTU9OKQ0KLSNkZWZpbmUgSVNfUkNDX0FEQzM0NUNMS1NPVVJDRShfX1NPVVJDRV9fKSAgICAgICBcDQotICAoKChfX1NPVVJDRV9fKSA9PSBSQ0NfQURDMzQ1Q0xLU09VUkNFX05PTkUpIHx8IFwNCi0gICAoKF9fU09VUkNFX18pID09IFJDQ19BREMzNDVDTEtTT1VSQ0VfUExMKSB8fCAgXA0KLSAgICgoX19TT1VSQ0VfXykgPT0gUkNDX0FEQzM0NUNMS1NPVVJDRV9TWVNDTEspKQ0KLSNlbmRpZiAvKiBBREMzNDVfQ09NTU9OICovDQotDQotI2lmIGRlZmluZWQoUVVBRFNQSSkNCi0NCi0jZGVmaW5lIElTX1JDQ19RU1BJQ0xLU09VUkNFKF9fU09VUkNFX18pICAgICAgICAgXA0KLSAgKCgoX19TT1VSQ0VfXykgPT0gUkNDX1FTUElDTEtTT1VSQ0VfSFNJKSB8fCAgICBcDQotICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfUVNQSUNMS1NPVVJDRV9TWVNDTEspIHx8IFwNCi0gICAoKF9fU09VUkNFX18pID09IFJDQ19RU1BJQ0xLU09VUkNFX1BMTCkpDQotDQotI2VuZGlmIC8qIFFVQURTUEkgKi8NCi0NCi0jZGVmaW5lIElTX1JDQ19DUlNfU1lOQ19TT1VSQ0UoX19TT1VSQ0VfXykgICAgICAgXA0KLSAgKCgoX19TT1VSQ0VfXykgPT0gUkNDX0NSU19TWU5DX1NPVVJDRV9HUElPKSB8fCBcDQotICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfQ1JTX1NZTkNfU09VUkNFX0xTRSkgfHwgIFwNCi0gICAoKF9fU09VUkNFX18pID09IFJDQ19DUlNfU1lOQ19TT1VSQ0VfVVNCKSkNCi0NCi0jZGVmaW5lIElTX1JDQ19DUlNfU1lOQ19ESVYoX19ESVZfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoKF9fRElWX18pID09IFJDQ19DUlNfU1lOQ19ESVYxKSB8fCAoKF9fRElWX18pID09IFJDQ19DUlNfU1lOQ19ESVYyKSB8fCAgIFwNCi0gICAoKF9fRElWX18pID09IFJDQ19DUlNfU1lOQ19ESVY0KSB8fCAoKF9fRElWX18pID09IFJDQ19DUlNfU1lOQ19ESVY4KSB8fCAgIFwNCi0gICAoKF9fRElWX18pID09IFJDQ19DUlNfU1lOQ19ESVYxNikgfHwgKChfX0RJVl9fKSA9PSBSQ0NfQ1JTX1NZTkNfRElWMzIpIHx8IFwNCi0gICAoKF9fRElWX18pID09IFJDQ19DUlNfU1lOQ19ESVY2NCkgfHwgKChfX0RJVl9fKSA9PSBSQ0NfQ1JTX1NZTkNfRElWMTI4KSkNCi0NCi0jZGVmaW5lIElTX1JDQ19DUlNfU1lOQ19QT0xBUklUWShfX1BPTEFSSVRZX18pICAgICAgICAgXA0KLSAgKCgoX19QT0xBUklUWV9fKSA9PSBSQ0NfQ1JTX1NZTkNfUE9MQVJJVFlfUklTSU5HKSB8fCBcDQotICAgKChfX1BPTEFSSVRZX18pID09IFJDQ19DUlNfU1lOQ19QT0xBUklUWV9GQUxMSU5HKSkNCi0NCi0jZGVmaW5lIElTX1JDQ19DUlNfUkVMT0FEVkFMVUUoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pIDw9IDB4RkZGRlUpKQ0KLQ0KLSNkZWZpbmUgSVNfUkNDX0NSU19FUlJPUkxJTUlUKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA8PSAweEZGVSkpDQotDQotI2RlZmluZSBJU19SQ0NfQ1JTX0hTSTQ4Q0FMSUJSQVRJT04oX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pIDw9IDB4M0ZVKSkNCi0NCi0jZGVmaW5lIElTX1JDQ19DUlNfRlJFUUVSUk9SRElSKF9fRElSX18pICAgICBcDQotICAoKChfX0RJUl9fKSA9PSBSQ0NfQ1JTX0ZSRVFFUlJPUkRJUl9VUCkgfHwgXA0KLSAgICgoX19ESVJfXykgPT0gUkNDX0NSU19GUkVRRVJST1JESVJfRE9XTikpDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotI2lmZGVmIF9fY3BsdXNwbHVzDQotfQ0KLSNlbmRpZg0KLQ0KLSNlbmRpZiAvKiBTVE0zMkc0eHhfSEFMX1JDQ19FWF9IICovDQorLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAZmlsZSAgICBzdG0zMmc0eHhfaGFsX3JjY19leC5oCisgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgUkNDIEhBTCBFeHRlbmRlZCBtb2R1bGUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYXR0ZW50aW9uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0ZXJtcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlCisgKmluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4gSWYgbm8gTElDRU5TRSBmaWxlIGNvbWVzCisgKndpdGggdGhpcyBzb2Z0d2FyZSwgaXQgaXMgcHJvdmlkZWQgQVMtSVMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJHNHh4X0hBTF9SQ0NfRVhfSAorI2RlZmluZSBTVE0zMkc0eHhfSEFMX1JDQ19FWF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmc0eHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHNHh4X0hBTF9Ecml2ZXIKKyAqIEB7CisgKi8KKworLyoqIEBhZGR0b2dyb3VwIFJDQ0V4CisgKiBAeworICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfRXhwb3J0ZWRfVHlwZXMgUkNDRXggRXhwb3J0ZWQgVHlwZXMKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgIFJDQyBleHRlbmRlZCBjbG9ja3Mgc3RydWN0dXJlIGRlZmluaXRpb24KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50MzJfdCBQZXJpcGhDbG9ja1NlbGVjdGlvbjsgLyohPCBUaGUgRXh0ZW5kZWQgQ2xvY2sgdG8gYmUgY29uZmlndXJlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDRXhfUGVyaXBoX0Nsb2NrX1NlbGVjdGlvbiAqLworCisgIHVpbnQzMl90IFVzYXJ0MUNsb2NrU2VsZWN0aW9uOyAvKiE8IFNwZWNpZmllcyBVU0FSVDEgY2xvY2sgc291cmNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NFeF9VU0FSVDFfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgVXNhcnQyQ2xvY2tTZWxlY3Rpb247IC8qITwgU3BlY2lmaWVzIFVTQVJUMiBjbG9jayBzb3VyY2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ0V4X1VTQVJUMl9DbG9ja19Tb3VyY2UgKi8KKyNpZiBkZWZpbmVkKFVTQVJUMykKKyAgdWludDMyX3QgVXNhcnQzQ2xvY2tTZWxlY3Rpb247IC8qITwgU3BlY2lmaWVzIFVTQVJUMyBjbG9jayBzb3VyY2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ0V4X1VTQVJUM19DbG9ja19Tb3VyY2UgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVBUlQzICovCisKKyNpZiBkZWZpbmVkKFVBUlQ0KQorICB1aW50MzJfdCBVYXJ0NENsb2NrU2VsZWN0aW9uOyAvKiE8IFNwZWNpZmllcyBVQVJUNCBjbG9jayBzb3VyY2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NFeF9VQVJUNF9DbG9ja19Tb3VyY2UgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVUFSVDQgKi8KKworI2lmIGRlZmluZWQoVUFSVDUpCisgIHVpbnQzMl90IFVhcnQ1Q2xvY2tTZWxlY3Rpb247IC8qITwgU3BlY2lmaWVzIFVBUlQ1IGNsb2NrIHNvdXJjZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ0V4X1VBUlQ1X0Nsb2NrX1NvdXJjZSAqLworCisjZW5kaWYgLyogVUFSVDUgKi8KKworICB1aW50MzJfdCBMcHVhcnQxQ2xvY2tTZWxlY3Rpb247IC8qITwgU3BlY2lmaWVzIExQVUFSVDEgY2xvY2sgc291cmNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ0V4X0xQVUFSVDFfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgSTJjMUNsb2NrU2VsZWN0aW9uOyAvKiE8IFNwZWNpZmllcyBJMkMxIGNsb2NrIHNvdXJjZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NFeF9JMkMxX0Nsb2NrX1NvdXJjZSAqLworCisgIHVpbnQzMl90IEkyYzJDbG9ja1NlbGVjdGlvbjsgLyohPCBTcGVjaWZpZXMgSTJDMiBjbG9jayBzb3VyY2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDRXhfSTJDMl9DbG9ja19Tb3VyY2UgKi8KKworICB1aW50MzJfdCBJMmMzQ2xvY2tTZWxlY3Rpb247IC8qITwgU3BlY2lmaWVzIEkyQzMgY2xvY2sgc291cmNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ0V4X0kyQzNfQ2xvY2tfU291cmNlICovCisKKyNpZiBkZWZpbmVkKEkyQzQpCisKKyAgdWludDMyX3QgSTJjNENsb2NrU2VsZWN0aW9uOyAvKiE8IFNwZWNpZmllcyBJMkM0IGNsb2NrIHNvdXJjZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NFeF9JMkM0X0Nsb2NrX1NvdXJjZSAqLworI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEkyQzQgKi8KKworICB1aW50MzJfdCBMcHRpbTFDbG9ja1NlbGVjdGlvbjsgLyohPCBTcGVjaWZpZXMgTFBUSU0xIGNsb2NrIHNvdXJjZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDRXhfTFBUSU0xX0Nsb2NrX1NvdXJjZSAqLworCisgIHVpbnQzMl90IFNhaTFDbG9ja1NlbGVjdGlvbjsgLyohPCBTcGVjaWZpZXMgU0FJMSBjbG9jayBzb3VyY2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDRXhfU0FJMV9DbG9ja19Tb3VyY2UgKi8KKworICB1aW50MzJfdCBJMnNDbG9ja1NlbGVjdGlvbjsgLyohPCBTcGVjaWZpZXMgSTJTIGNsb2NrIHNvdXJjZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ0V4X0kyU19DbG9ja19Tb3VyY2UgKi8KKyNpZiBkZWZpbmVkKEZEQ0FOMSkKKworICB1aW50MzJfdCBGZGNhbkNsb2NrU2VsZWN0aW9uOyAvKiE8IFNwZWNpZmllcyBGRENBTiBjbG9jayBzb3VyY2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ0V4X0ZEQ0FOX0Nsb2NrX1NvdXJjZSAqLworI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRENBTjEgKi8KKyNpZiBkZWZpbmVkKFVTQikKKworICB1aW50MzJfdCBVc2JDbG9ja1NlbGVjdGlvbjsgLyohPCBTcGVjaWZpZXMgVVNCIGNsb2NrIHNvdXJjZSAod2FybmluZzogc2FtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlIGZvciBSTkcpLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgQHJlZiBSQ0NFeF9VU0JfQ2xvY2tfU291cmNlICovCisjZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAvKiBVU0IgKi8KKworICB1aW50MzJfdCBSbmdDbG9ja1NlbGVjdGlvbjsgLyohPCBTcGVjaWZpZXMgUk5HIGNsb2NrIHNvdXJjZSAod2FybmluZzogc2FtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlIGZvciBVU0IpLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgQHJlZiBSQ0NFeF9STkdfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgQWRjMTJDbG9ja1NlbGVjdGlvbjsgLyohPCBTcGVjaWZpZXMgQURDMTIgaW50ZXJmYWNlIGNsb2NrIHNvdXJjZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ0V4X0FEQzEyX0Nsb2NrX1NvdXJjZSAqLworCisjaWYgZGVmaW5lZChBREMzNDVfQ09NTU9OKQorICB1aW50MzJfdCBBZGMzNDVDbG9ja1NlbGVjdGlvbjsgLyohPCBTcGVjaWZpZXMgQURDMzQ1IGludGVyZmFjZSBjbG9jayBzb3VyY2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ0V4X0FEQzM0NV9DbG9ja19Tb3VyY2UgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFEQzM0NV9DT01NT04gKi8KKworI2lmIGRlZmluZWQoUVVBRFNQSSkKKyAgdWludDMyX3QgUXNwaUNsb2NrU2VsZWN0aW9uOyAvKiE8IFNwZWNpZmllcyBRdWFkU1BJIGNsb2NrIHNvdXJjZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NFeF9RU1BJX0Nsb2NrX1NvdXJjZSAqLworI2VuZGlmCisKKyAgdWludDMyX3QgUlRDQ2xvY2tTZWxlY3Rpb247IC8qITwgU3BlY2lmaWVzIFJUQyBjbG9jayBzb3VyY2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19SVENfQ2xvY2tfU291cmNlICovCit9IFJDQ19QZXJpcGhDTEtJbml0VHlwZURlZjsKKworLyoqCisgKiBAYnJpZWYgUkNDX0NSUyBJbml0IHN0cnVjdHVyZSBkZWZpbml0aW9uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDMyX3QgUHJlc2NhbGVyOyAvKiE8IFNwZWNpZmllcyB0aGUgZGl2aXNpb24gZmFjdG9yIG9mIHRoZSBTWU5DIHNpZ25hbC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NFeF9DUlNfU3luY2hyb0RpdmlkZXIgKi8KKworICB1aW50MzJfdCBTb3VyY2U7IC8qITwgU3BlY2lmaWVzIHRoZSBTWU5DIHNpZ25hbCBzb3VyY2UuCisgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgUkNDRXhfQ1JTX1N5bmNocm9Tb3VyY2UgKi8KKworICB1aW50MzJfdCBQb2xhcml0eTsgLyohPCBTcGVjaWZpZXMgdGhlIGlucHV0IHBvbGFyaXR5IGZvciB0aGUgU1lOQyBzaWduYWwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgUkNDRXhfQ1JTX1N5bmNocm9Qb2xhcml0eSAqLworCisgIHVpbnQzMl90CisgICAgICBSZWxvYWRWYWx1ZTsgLyohPCBTcGVjaWZpZXMgdGhlIHZhbHVlIHRvIGJlIGxvYWRlZCBpbiB0aGUgZnJlcXVlbmN5IGVycm9yCisgICAgICAgICAgICAgICAgICAgICAgY291bnRlciB3aXRoIGVhY2ggU1lOQyBldmVudC4gSXQgY2FuIGJlIGNhbGN1bGF0ZWQgaW4KKyAgICAgICAgICAgICAgICAgICAgICB1c2luZyBtYWNybworICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1JDQ19DUlNfUkVMT0FEVkFMVUVfQ0FMQ1VMQVRFKF9fRlRBUkdFVF9fLAorICAgICAgICAgICAgICAgICAgICAgIF9fRlNZTkNfXykgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIDAgYW5kCisgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGIG9yIGEgdmFsdWUgb2YgQHJlZiBSQ0NFeF9DUlNfUmVsb2FkVmFsdWVEZWZhdWx0IC4qLworCisgIHVpbnQzMl90IEVycm9yTGltaXRWYWx1ZTsgLyohPCBTcGVjaWZpZXMgdGhlIHZhbHVlIHRvIGJlIHVzZWQgdG8gZXZhbHVhdGUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwdHVyZWQgZnJlcXVlbmN5IGVycm9yIHZhbHVlLiBUaGlzIHBhcmFtZXRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAweEZGIG9yIGEgdmFsdWUgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIFJDQ0V4X0NSU19FcnJvckxpbWl0RGVmYXVsdCAqLworCisgIHVpbnQzMl90CisgICAgICBIU0k0OENhbGlicmF0aW9uVmFsdWU7IC8qITwgU3BlY2lmaWVzIGEgdXNlci1wcm9ncmFtbWFibGUgdHJpbW1pbmcgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIEhTSTQ4IG9zY2lsbGF0b3IuIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAweDdGIG9yIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NFeF9DUlNfSFNJNDhDYWxpYnJhdGlvbkRlZmF1bHQgKi8KKworfSBSQ0NfQ1JTSW5pdFR5cGVEZWY7CisKKy8qKgorICogQGJyaWVmIFJDQ19DUlMgU3luY2hyb25pemF0aW9uIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDMyX3QKKyAgICAgIFJlbG9hZFZhbHVlOyAvKiE8IFNwZWNpZmllcyB0aGUgdmFsdWUgbG9hZGVkIGluIHRoZSBDb3VudGVyIHJlbG9hZCB2YWx1ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAweEZGRkYgKi8KKworICB1aW50MzJfdCBIU0k0OENhbGlicmF0aW9uVmFsdWU7IC8qITwgU3BlY2lmaWVzIHZhbHVlIGxvYWRlZCBpbiBIU0k0OAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zY2lsbGF0b3Igc21vb3RoIHRyaW1taW5nLiBUaGlzIHBhcmFtZXRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAweDdGICovCisKKyAgdWludDMyX3QgRnJlcUVycm9yQ2FwdHVyZTsgLyohPCBTcGVjaWZpZXMgdGhlIHZhbHVlIGxvYWRlZCBpbiB0aGUgLkZFQ0FQLCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlcXVlbmN5IGVycm9yIGNvdW50ZXIgdmFsdWUgbGF0Y2hlZCBpbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSBvZiB0aGUgbGFzdCBTWU5DIGV2ZW50LiBUaGlzIHBhcmFtZXRlciBtdXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMHhGRkZGICovCisKKyAgdWludDMyX3QKKyAgICAgIEZyZXFFcnJvckRpcmVjdGlvbjsgLyohPCBTcGVjaWZpZXMgdGhlIHZhbHVlIGxvYWRlZCBpbiB0aGUgLkZFRElSLCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRpbmcgZGlyZWN0aW9uIG9mIHRoZSBmcmVxdWVuY3kgZXJyb3IgY291bnRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRjaGVkIGluIHRoZSB0aW1lIG9mIHRoZSBsYXN0IFNZTkMgZXZlbnQuIEl0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dzIHdoZXRoZXIgdGhlIGFjdHVhbCBmcmVxdWVuY3kgaXMgYmVsb3cgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvdmUgdGhlIHRhcmdldC4gVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgUkNDRXhfQ1JTX0ZyZXFFcnJvckRpcmVjdGlvbiovCisKK30gUkNDX0NSU1N5bmNocm9JbmZvVHlwZURlZjsKKworLyoqCisgKiBAfQorICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJDQ0V4X0V4cG9ydGVkX0NvbnN0YW50cyBSQ0NFeCBFeHBvcnRlZCBDb25zdGFudHMKKyAqIEB7CisgKi8KKworLyoqIEBkZWZncm91cCBSQ0NFeF9MU0NPX0Nsb2NrX1NvdXJjZSBMb3cgU3BlZWQgQ2xvY2sgU291cmNlCisgKiBAeworICovCisjZGVmaW5lIFJDQ19MU0NPU09VUkNFX0xTSSBcCisgIDB4MDAwMDAwMDBVIC8qITwgTFNJIHNlbGVjdGlvbiBmb3IgbG93IHNwZWVkIGNsb2NrIG91dHB1dCAqLworI2RlZmluZSBSQ0NfTFNDT1NPVVJDRV9MU0UgXAorICBSQ0NfQkRDUl9MU0NPU0VMIC8qITwgTFNFIHNlbGVjdGlvbiBmb3IgbG93IHNwZWVkIGNsb2NrIG91dHB1dCAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfUGVyaXBoX0Nsb2NrX1NlbGVjdGlvbiBQZXJpcGggQ2xvY2sgU2VsZWN0aW9uCisgKiBAeworICovCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfVVNBUlQxIDB4MDAwMDAwMDFVCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfVVNBUlQyIDB4MDAwMDAwMDJVCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfVVNBUlQzIDB4MDAwMDAwMDRVCisjaWYgZGVmaW5lZChVQVJUNCkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19VQVJUNCAweDAwMDAwMDA4VQorI2VuZGlmIC8qIFVBUlQ0ICovCisjaWYgZGVmaW5lZChVQVJUNSkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19VQVJUNSAweDAwMDAwMDEwVQorI2VuZGlmIC8qIFVBUlQ1ICovCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfTFBVQVJUMSAweDAwMDAwMDIwVQorI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX0kyQzEgMHgwMDAwMDA0MFUKKyNkZWZpbmUgUkNDX1BFUklQSENMS19JMkMyIDB4MDAwMDAwODBVCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfSTJDMyAweDAwMDAwMTAwVQorI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX0xQVElNMSAweDAwMDAwMjAwVQorI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX1NBSTEgMHgwMDAwMDQwMFUKKyNkZWZpbmUgUkNDX1BFUklQSENMS19JMlMgMHgwMDAwMDgwMFUKKyNpZiBkZWZpbmVkKEZEQ0FOMSkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19GRENBTiAweDAwMDAxMDAwVQorI2VuZGlmIC8qIEZEQ0FOMSAqLworI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX1VTQiAweDAwMDAyMDAwVQorI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX1JORyAweDAwMDA0MDAwVQorI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX0FEQzEyIDB4MDAwMDgwMDBVCisjaWYgZGVmaW5lZChBREMzNDVfQ09NTU9OKQorI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX0FEQzM0NSAweDAwMDEwMDAwVQorI2VuZGlmIC8qIEFEQzM0NV9DT01NT04gKi8KKyNpZiBkZWZpbmVkKEkyQzQpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfSTJDNCAweDAwMDIwMDAwVQorI2VuZGlmIC8qIEkyQzQgKi8KKyNpZiBkZWZpbmVkKFFVQURTUEkpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfUVNQSSAweDAwMDQwMDAwVQorI2VuZGlmIC8qIFFVQURTUEkgKi8KKyNkZWZpbmUgUkNDX1BFUklQSENMS19SVEMgMHgwMDA4MDAwMFUKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFJDQ0V4X1VTQVJUMV9DbG9ja19Tb3VyY2UgVVNBUlQxIENsb2NrIFNvdXJjZQorICogQHsKKyAqLworI2RlZmluZSBSQ0NfVVNBUlQxQ0xLU09VUkNFX1BDTEsyIDB4MDAwMDAwMDBVCisjZGVmaW5lIFJDQ19VU0FSVDFDTEtTT1VSQ0VfU1lTQ0xLIFJDQ19DQ0lQUl9VU0FSVDFTRUxfMAorI2RlZmluZSBSQ0NfVVNBUlQxQ0xLU09VUkNFX0hTSSBSQ0NfQ0NJUFJfVVNBUlQxU0VMXzEKKyNkZWZpbmUgUkNDX1VTQVJUMUNMS1NPVVJDRV9MU0UgKFJDQ19DQ0lQUl9VU0FSVDFTRUxfMCB8IFJDQ19DQ0lQUl9VU0FSVDFTRUxfMSkKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFJDQ0V4X1VTQVJUMl9DbG9ja19Tb3VyY2UgVVNBUlQyIENsb2NrIFNvdXJjZQorICogQHsKKyAqLworI2RlZmluZSBSQ0NfVVNBUlQyQ0xLU09VUkNFX1BDTEsxIDB4MDAwMDAwMDBVCisjZGVmaW5lIFJDQ19VU0FSVDJDTEtTT1VSQ0VfU1lTQ0xLIFJDQ19DQ0lQUl9VU0FSVDJTRUxfMAorI2RlZmluZSBSQ0NfVVNBUlQyQ0xLU09VUkNFX0hTSSBSQ0NfQ0NJUFJfVVNBUlQyU0VMXzEKKyNkZWZpbmUgUkNDX1VTQVJUMkNMS1NPVVJDRV9MU0UgKFJDQ19DQ0lQUl9VU0FSVDJTRUxfMCB8IFJDQ19DQ0lQUl9VU0FSVDJTRUxfMSkKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFJDQ0V4X1VTQVJUM19DbG9ja19Tb3VyY2UgVVNBUlQzIENsb2NrIFNvdXJjZQorICogQHsKKyAqLworI2RlZmluZSBSQ0NfVVNBUlQzQ0xLU09VUkNFX1BDTEsxIDB4MDAwMDAwMDBVCisjZGVmaW5lIFJDQ19VU0FSVDNDTEtTT1VSQ0VfU1lTQ0xLIFJDQ19DQ0lQUl9VU0FSVDNTRUxfMAorI2RlZmluZSBSQ0NfVVNBUlQzQ0xLU09VUkNFX0hTSSBSQ0NfQ0NJUFJfVVNBUlQzU0VMXzEKKyNkZWZpbmUgUkNDX1VTQVJUM0NMS1NPVVJDRV9MU0UgKFJDQ19DQ0lQUl9VU0FSVDNTRUxfMCB8IFJDQ19DQ0lQUl9VU0FSVDNTRUxfMSkKKy8qKgorICogQH0KKyAqLworCisjaWYgZGVmaW5lZChVQVJUNCkKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfVUFSVDRfQ2xvY2tfU291cmNlIFVBUlQ0IENsb2NrIFNvdXJjZQorICogQHsKKyAqLworI2RlZmluZSBSQ0NfVUFSVDRDTEtTT1VSQ0VfUENMSzEgMHgwMDAwMDAwMFUKKyNkZWZpbmUgUkNDX1VBUlQ0Q0xLU09VUkNFX1NZU0NMSyBSQ0NfQ0NJUFJfVUFSVDRTRUxfMAorI2RlZmluZSBSQ0NfVUFSVDRDTEtTT1VSQ0VfSFNJIFJDQ19DQ0lQUl9VQVJUNFNFTF8xCisjZGVmaW5lIFJDQ19VQVJUNENMS1NPVVJDRV9MU0UgKFJDQ19DQ0lQUl9VQVJUNFNFTF8wIHwgUkNDX0NDSVBSX1VBUlQ0U0VMXzEpCisvKioKKyAqIEB9CisgKi8KKyNlbmRpZiAvKiBVQVJUNCAqLworCisjaWYgZGVmaW5lZChVQVJUNSkKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfVUFSVDVfQ2xvY2tfU291cmNlIFVBUlQ1IENsb2NrIFNvdXJjZQorICogQHsKKyAqLworI2RlZmluZSBSQ0NfVUFSVDVDTEtTT1VSQ0VfUENMSzEgMHgwMDAwMDAwMFUKKyNkZWZpbmUgUkNDX1VBUlQ1Q0xLU09VUkNFX1NZU0NMSyBSQ0NfQ0NJUFJfVUFSVDVTRUxfMAorI2RlZmluZSBSQ0NfVUFSVDVDTEtTT1VSQ0VfSFNJIFJDQ19DQ0lQUl9VQVJUNVNFTF8xCisjZGVmaW5lIFJDQ19VQVJUNUNMS1NPVVJDRV9MU0UgKFJDQ19DQ0lQUl9VQVJUNVNFTF8wIHwgUkNDX0NDSVBSX1VBUlQ1U0VMXzEpCisvKioKKyAqIEB9CisgKi8KKyNlbmRpZiAvKiBVQVJUNSAqLworCisvKiogQGRlZmdyb3VwIFJDQ0V4X0xQVUFSVDFfQ2xvY2tfU291cmNlIExQVUFSVDEgQ2xvY2sgU291cmNlCisgKiBAeworICovCisjZGVmaW5lIFJDQ19MUFVBUlQxQ0xLU09VUkNFX1BDTEsxIDB4MDAwMDAwMDBVCisjZGVmaW5lIFJDQ19MUFVBUlQxQ0xLU09VUkNFX1NZU0NMSyBSQ0NfQ0NJUFJfTFBVQVJUMVNFTF8wCisjZGVmaW5lIFJDQ19MUFVBUlQxQ0xLU09VUkNFX0hTSSBSQ0NfQ0NJUFJfTFBVQVJUMVNFTF8xCisjZGVmaW5lIFJDQ19MUFVBUlQxQ0xLU09VUkNFX0xTRSBcCisgIChSQ0NfQ0NJUFJfTFBVQVJUMVNFTF8wIHwgUkNDX0NDSVBSX0xQVUFSVDFTRUxfMSkKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFJDQ0V4X0kyQzFfQ2xvY2tfU291cmNlIEkyQzEgQ2xvY2sgU291cmNlCisgKiBAeworICovCisjZGVmaW5lIFJDQ19JMkMxQ0xLU09VUkNFX1BDTEsxIDB4MDAwMDAwMDBVCisjZGVmaW5lIFJDQ19JMkMxQ0xLU09VUkNFX1NZU0NMSyBSQ0NfQ0NJUFJfSTJDMVNFTF8wCisjZGVmaW5lIFJDQ19JMkMxQ0xLU09VUkNFX0hTSSBSQ0NfQ0NJUFJfSTJDMVNFTF8xCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBSQ0NFeF9JMkMyX0Nsb2NrX1NvdXJjZSBJMkMyIENsb2NrIFNvdXJjZQorICogQHsKKyAqLworI2RlZmluZSBSQ0NfSTJDMkNMS1NPVVJDRV9QQ0xLMSAweDAwMDAwMDAwVQorI2RlZmluZSBSQ0NfSTJDMkNMS1NPVVJDRV9TWVNDTEsgUkNDX0NDSVBSX0kyQzJTRUxfMAorI2RlZmluZSBSQ0NfSTJDMkNMS1NPVVJDRV9IU0kgUkNDX0NDSVBSX0kyQzJTRUxfMQorLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfSTJDM19DbG9ja19Tb3VyY2UgSTJDMyBDbG9jayBTb3VyY2UKKyAqIEB7CisgKi8KKyNkZWZpbmUgUkNDX0kyQzNDTEtTT1VSQ0VfUENMSzEgMHgwMDAwMDAwMFUKKyNkZWZpbmUgUkNDX0kyQzNDTEtTT1VSQ0VfU1lTQ0xLIFJDQ19DQ0lQUl9JMkMzU0VMXzAKKyNkZWZpbmUgUkNDX0kyQzNDTEtTT1VSQ0VfSFNJIFJDQ19DQ0lQUl9JMkMzU0VMXzEKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFJDQ0V4X0xQVElNMV9DbG9ja19Tb3VyY2UgTFBUSU0xIENsb2NrIFNvdXJjZQorICogQHsKKyAqLworI2RlZmluZSBSQ0NfTFBUSU0xQ0xLU09VUkNFX1BDTEsxIDB4MDAwMDAwMDBVCisjZGVmaW5lIFJDQ19MUFRJTTFDTEtTT1VSQ0VfTFNJIFJDQ19DQ0lQUl9MUFRJTTFTRUxfMAorI2RlZmluZSBSQ0NfTFBUSU0xQ0xLU09VUkNFX0hTSSBSQ0NfQ0NJUFJfTFBUSU0xU0VMXzEKKyNkZWZpbmUgUkNDX0xQVElNMUNMS1NPVVJDRV9MU0UgUkNDX0NDSVBSX0xQVElNMVNFTAorLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfU0FJMV9DbG9ja19Tb3VyY2UgU0FJMSBDbG9jayBTb3VyY2UKKyAqIEB7CisgKi8KKyNkZWZpbmUgUkNDX1NBSTFDTEtTT1VSQ0VfU1lTQ0xLIDB4MDAwMDAwMDBVCisjZGVmaW5lIFJDQ19TQUkxQ0xLU09VUkNFX1BMTCBSQ0NfQ0NJUFJfU0FJMVNFTF8wCisjZGVmaW5lIFJDQ19TQUkxQ0xLU09VUkNFX0VYVCBSQ0NfQ0NJUFJfU0FJMVNFTF8xCisjZGVmaW5lIFJDQ19TQUkxQ0xLU09VUkNFX0hTSSAoUkNDX0NDSVBSX1NBSTFTRUxfMSB8IFJDQ19DQ0lQUl9TQUkxU0VMXzApCisvKioKKyAqIEB9CisgKi8KKworI2lmIGRlZmluZWQoU1BJX0kyU19TVVBQT1JUKQorLyoqIEBkZWZncm91cCBSQ0NFeF9JMlNfQ2xvY2tfU291cmNlIEkyUyBDbG9jayBTb3VyY2UKKyAqIEB7CisgKi8KKyNkZWZpbmUgUkNDX0kyU0NMS1NPVVJDRV9TWVNDTEsgMHgwMDAwMDAwMFUKKyNkZWZpbmUgUkNDX0kyU0NMS1NPVVJDRV9QTEwgUkNDX0NDSVBSX0kyUzIzU0VMXzAKKyNkZWZpbmUgUkNDX0kyU0NMS1NPVVJDRV9FWFQgUkNDX0NDSVBSX0kyUzIzU0VMXzEKKyNkZWZpbmUgUkNDX0kyU0NMS1NPVVJDRV9IU0kgKFJDQ19DQ0lQUl9JMlMyM1NFTF8xIHwgUkNDX0NDSVBSX0kyUzIzU0VMXzApCisvKioKKyAqIEB9CisgKi8KKyNlbmRpZiAvKiBTUElfSTJTX1NVUFBPUlQgKi8KKworI2lmIGRlZmluZWQoRkRDQU4xKQorLyoqIEBkZWZncm91cCBSQ0NFeF9GRENBTl9DbG9ja19Tb3VyY2UgRkRDQU4gQ2xvY2sgU291cmNlCisgKiBAeworICovCisjZGVmaW5lIFJDQ19GRENBTkNMS1NPVVJDRV9IU0UgMHgwMDAwMDAwMFUKKyNkZWZpbmUgUkNDX0ZEQ0FOQ0xLU09VUkNFX1BMTCBSQ0NfQ0NJUFJfRkRDQU5TRUxfMAorI2RlZmluZSBSQ0NfRkRDQU5DTEtTT1VSQ0VfUENMSzEgUkNDX0NDSVBSX0ZEQ0FOU0VMXzEKKy8qKgorICogQH0KKyAqLworI2VuZGlmIC8qIEZEQ0FOMSAqLworCisvKiogQGRlZmdyb3VwIFJDQ0V4X1JOR19DbG9ja19Tb3VyY2UgUk5HIENsb2NrIFNvdXJjZQorICogQHsKKyAqLworI2RlZmluZSBSQ0NfUk5HQ0xLU09VUkNFX0hTSTQ4IDB4MDAwMDAwMDBVCisjZGVmaW5lIFJDQ19STkdDTEtTT1VSQ0VfUExMIFJDQ19DQ0lQUl9DTEs0OFNFTF8xCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBSQ0NFeF9VU0JfQ2xvY2tfU291cmNlIFVTQiBDbG9jayBTb3VyY2UKKyAqIEB7CisgKi8KKyNkZWZpbmUgUkNDX1VTQkNMS1NPVVJDRV9IU0k0OCAweDAwMDAwMDAwVQorI2RlZmluZSBSQ0NfVVNCQ0xLU09VUkNFX1BMTCBSQ0NfQ0NJUFJfQ0xLNDhTRUxfMQorLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfQURDMTJfQ2xvY2tfU291cmNlIEFEQzEyIENsb2NrIFNvdXJjZQorICogQHsKKyAqLworI2RlZmluZSBSQ0NfQURDMTJDTEtTT1VSQ0VfTk9ORSAweDAwMDAwMDAwVQorI2RlZmluZSBSQ0NfQURDMTJDTEtTT1VSQ0VfUExMIFJDQ19DQ0lQUl9BREMxMlNFTF8wCisjZGVmaW5lIFJDQ19BREMxMkNMS1NPVVJDRV9TWVNDTEsgUkNDX0NDSVBSX0FEQzEyU0VMXzEKKy8qKgorICogQH0KKyAqLworCisjaWYgZGVmaW5lZChBREMzNDVfQ09NTU9OKQorLyoqIEBkZWZncm91cCBSQ0NFeF9BREMzNDVfQ2xvY2tfU291cmNlIEFEQzM0NSBDbG9jayBTb3VyY2UKKyAqIEB7CisgKi8KKyNkZWZpbmUgUkNDX0FEQzM0NUNMS1NPVVJDRV9OT05FIDB4MDAwMDAwMDBVCisjZGVmaW5lIFJDQ19BREMzNDVDTEtTT1VSQ0VfUExMIFJDQ19DQ0lQUl9BREMzNDVTRUxfMAorI2RlZmluZSBSQ0NfQURDMzQ1Q0xLU09VUkNFX1NZU0NMSyBSQ0NfQ0NJUFJfQURDMzQ1U0VMXzEKKy8qKgorICogQH0KKyAqLworI2VuZGlmIC8qIEFEQzM0NV9DT01NT04gKi8KKworI2lmIGRlZmluZWQoSTJDNCkKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfSTJDNF9DbG9ja19Tb3VyY2UgSTJDNCBDbG9jayBTb3VyY2UKKyAqIEB7CisgKi8KKyNkZWZpbmUgUkNDX0kyQzRDTEtTT1VSQ0VfUENMSzEgMHgwMDAwMDAwMFUKKyNkZWZpbmUgUkNDX0kyQzRDTEtTT1VSQ0VfU1lTQ0xLIFJDQ19DQ0lQUjJfSTJDNFNFTF8wCisjZGVmaW5lIFJDQ19JMkM0Q0xLU09VUkNFX0hTSSBSQ0NfQ0NJUFIyX0kyQzRTRUxfMQorLyoqCisgKiBAfQorICovCisjZW5kaWYgLyogSTJDNCAqLworCisjaWYgZGVmaW5lZChRVUFEU1BJKQorLyoqIEBkZWZncm91cCBSQ0NFeF9RU1BJX0Nsb2NrX1NvdXJjZSBRdWFkU1BJIENsb2NrIFNvdXJjZQorICogQHsKKyAqLworI2RlZmluZSBSQ0NfUVNQSUNMS1NPVVJDRV9TWVNDTEsgMHgwMDAwMDAwMFUKKyNkZWZpbmUgUkNDX1FTUElDTEtTT1VSQ0VfSFNJIFJDQ19DQ0lQUjJfUVNQSVNFTF8wCisjZGVmaW5lIFJDQ19RU1BJQ0xLU09VUkNFX1BMTCBSQ0NfQ0NJUFIyX1FTUElTRUxfMQorLyoqCisgKiBAfQorICovCisjZW5kaWYgLyogUVVBRFNQSSAqLworCisvKiogQGRlZmdyb3VwIFJDQ0V4X0VYVElfTElORV9MU0VDU1MgIFJDQyBMU0UgQ1NTIGV4dGVybmFsIGludGVycnVwdCBsaW5lCisgKiBAeworICovCisjZGVmaW5lIFJDQ19FWFRJX0xJTkVfTFNFQ1NTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFWFRJX0lNUjFfSU0xOSAvKiE8IEV4dGVybmFsIGludGVycnVwdCBsaW5lIDE5IGNvbm5lY3RlZCB0byB0aGUgTFNFIENTUyBFWFRJIFwKKyAgICAgICAgICAgICAgICAgICAgTGluZSAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfQ1JTX1N0YXR1cyBSQ0NFeCBDUlMgU3RhdHVzCisgKiBAeworICovCisjZGVmaW5lIFJDQ19DUlNfTk9ORSAweDAwMDAwMDAwVQorI2RlZmluZSBSQ0NfQ1JTX1RJTUVPVVQgMHgwMDAwMDAwMVUKKyNkZWZpbmUgUkNDX0NSU19TWU5DT0sgMHgwMDAwMDAwMlUKKyNkZWZpbmUgUkNDX0NSU19TWU5DV0FSTiAweDAwMDAwMDA0VQorI2RlZmluZSBSQ0NfQ1JTX1NZTkNFUlIgMHgwMDAwMDAwOFUKKyNkZWZpbmUgUkNDX0NSU19TWU5DTUlTUyAweDAwMDAwMDEwVQorI2RlZmluZSBSQ0NfQ1JTX1RSSU1PVkYgMHgwMDAwMDAyMFUKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFJDQ0V4X0NSU19TeW5jaHJvU291cmNlIFJDQ0V4IENSUyBTeW5jaHJvU291cmNlCisgKiBAeworICovCisjZGVmaW5lIFJDQ19DUlNfU1lOQ19TT1VSQ0VfR1BJTyAgICAgICAgICAgICAgXAorICAweDAwMDAwMDAwVSAvKiE8IFN5bmNocm8gU2lnbmFsIHNvdXJjZSBHUElPIFwKKyAgICAgICAgICAgICAgICovCisjZGVmaW5lIFJDQ19DUlNfU1lOQ19TT1VSQ0VfTFNFIFwKKyAgQ1JTX0NGR1JfU1lOQ1NSQ18wIC8qITwgU3luY2hybyBTaWduYWwgc291cmNlIExTRSAqLworI2RlZmluZSBSQ0NfQ1JTX1NZTkNfU09VUkNFX1VTQiBcCisgIENSU19DRkdSX1NZTkNTUkNfMSAvKiE8IFN5bmNocm8gU2lnbmFsIHNvdXJjZSBVU0IgU09GIChkZWZhdWx0KSovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBSQ0NFeF9DUlNfU3luY2hyb0RpdmlkZXIgUkNDRXggQ1JTIFN5bmNocm9EaXZpZGVyCisgKiBAeworICovCisjZGVmaW5lIFJDQ19DUlNfU1lOQ19ESVYxIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBTeW5jaHJvIFNpZ25hbCBub3QgZGl2aWRlZCAoZGVmYXVsdCkgKi8KKyNkZWZpbmUgUkNDX0NSU19TWU5DX0RJVjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQ1JTX0NGR1JfU1lOQ0RJVl8wIC8qITwgU3luY2hybyBTaWduYWwgZGl2aWRlZCBieSAyIFwKKyAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSQ0NfQ1JTX1NZTkNfRElWNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBDUlNfQ0ZHUl9TWU5DRElWXzEgLyohPCBTeW5jaHJvIFNpZ25hbCBkaXZpZGVkIGJ5IDQgXAorICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFJDQ19DUlNfU1lOQ19ESVY4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKENSU19DRkdSX1NZTkNESVZfMSB8IENSU19DRkdSX1NZTkNESVZfMCkgLyohPCBTeW5jaHJvIFNpZ25hbCBkaXZpZGVkIGJ5IDggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUkNDX0NSU19TWU5DX0RJVjE2IFwKKyAgQ1JTX0NGR1JfU1lOQ0RJVl8yIC8qITwgU3luY2hybyBTaWduYWwgZGl2aWRlZCBieSAxNiAqLworI2RlZmluZSBSQ0NfQ1JTX1NZTkNfRElWMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQ1JTX0NGR1JfU1lOQ0RJVl8yIHwgQ1JTX0NGR1JfU1lOQ0RJVl8wKSAvKiE8IFN5bmNocm8gU2lnbmFsIGRpdmlkZWQgYnkgMzIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUkNDX0NSU19TWU5DX0RJVjY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKENSU19DRkdSX1NZTkNESVZfMiB8IENSU19DRkdSX1NZTkNESVZfMSkgLyohPCBTeW5jaHJvIFNpZ25hbCBkaXZpZGVkIGJ5IDY0IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFJDQ19DUlNfU1lOQ19ESVYxMjggXAorICBDUlNfQ0ZHUl9TWU5DRElWIC8qITwgU3luY2hybyBTaWduYWwgZGl2aWRlZCBieSAxMjggKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFJDQ0V4X0NSU19TeW5jaHJvUG9sYXJpdHkgUkNDRXggQ1JTIFN5bmNocm9Qb2xhcml0eQorICogQHsKKyAqLworI2RlZmluZSBSQ0NfQ1JTX1NZTkNfUE9MQVJJVFlfUklTSU5HIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBTeW5jaHJvIEFjdGl2ZSBvbiByaXNpbmcgZWRnZSAoZGVmYXVsdCkgKi8KKyNkZWZpbmUgUkNDX0NSU19TWU5DX1BPTEFSSVRZX0ZBTExJTkcgXAorICBDUlNfQ0ZHUl9TWU5DUE9MIC8qITwgU3luY2hybyBBY3RpdmUgb24gZmFsbGluZyBlZGdlICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBSQ0NFeF9DUlNfUmVsb2FkVmFsdWVEZWZhdWx0IFJDQ0V4IENSUyBSZWxvYWRWYWx1ZURlZmF1bHQKKyAqIEB7CisgKi8KKyNkZWZpbmUgUkNDX0NSU19SRUxPQURWQUxVRV9ERUZBVUxUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMEJCN0ZVIC8qITwgVGhlIHJlc2V0IHZhbHVlIG9mIHRoZSBSRUxPQUQgZmllbGQgY29ycmVzcG9uZHMgICAgICAgXAorICAgICAgICAgICAgICAgICAgIHRvIGEgdGFyZ2V0IGZyZXF1ZW5jeSBvZiA0OCBNSHogYW5kIGEgc3luY2hyb25pemF0aW9uIFwKKyAgICAgICAgICAgICAgICAgc2lnbmFsIGZyZXF1ZW5jeSBvZiAxIGtIeiAoU09GIHNpZ25hbCBmcm9tIFVTQikuICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBSQ0NFeF9DUlNfRXJyb3JMaW1pdERlZmF1bHQgUkNDRXggQ1JTIEVycm9yTGltaXREZWZhdWx0CisgKiBAeworICovCisjZGVmaW5lIFJDQ19DUlNfRVJST1JMSU1JVF9ERUZBVUxUIFwKKyAgMHgwMDAwMDAyMlUgLyohPCBEZWZhdWx0IEZyZXF1ZW5jeSBlcnJvciBsaW1pdCAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfQ1JTX0hTSTQ4Q2FsaWJyYXRpb25EZWZhdWx0IFJDQ0V4IENSUworICogSFNJNDhDYWxpYnJhdGlvbkRlZmF1bHQKKyAqIEB7CisgKi8KKyNkZWZpbmUgUkNDX0NSU19IU0k0OENBTElCUkFUSU9OX0RFRkFVTFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMDAwNDBVIC8qITwgVGhlIGRlZmF1bHQgdmFsdWUgaXMgNjQsIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZSBtaWRkbGUgb2YgXAorICAgICAgICAgICAgICAgICB0aGUgdHJpbW1pbmcgaW50ZXJ2YWwuIFRoZSB0cmltbWluZyBzdGVwIGlzIGFyb3VuZCA2NyBrSHogICAgIFwKKyAgICAgICAgICAgICAgICAgYmV0d2VlbiB0d28gY29uc2VjdXRpdmUgVFJJTSBzdGVwcy4gQSBoaWdoZXIgVFJJTSB2YWx1ZSAgICAgICBcCisgICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZHMgdG8gYSBoaWdoZXIgb3V0cHV0IGZyZXF1ZW5jeSAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfQ1JTX0ZyZXFFcnJvckRpcmVjdGlvbiBSQ0NFeCBDUlMgRnJlcUVycm9yRGlyZWN0aW9uCisgKiBAeworICovCisjZGVmaW5lIFJDQ19DUlNfRlJFUUVSUk9SRElSX1VQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMDAwMDBVIC8qITwgVXBjb3VudGluZyBkaXJlY3Rpb24sIHRoZSBhY3R1YWwgZnJlcXVlbmN5IGlzIGFib3ZlIHRoZSBcCisgICAgICAgICAgICAgICAgIHRhcmdldCAqLworI2RlZmluZSBSQ0NfQ1JTX0ZSRVFFUlJPUkRJUl9ET1dOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQ1JTX0lTUl9GRURJUiAvKiE8IERvd25jb3VudGluZyBkaXJlY3Rpb24sIHRoZSBhY3R1YWwgZnJlcXVlbmN5IGlzIGJlbG93IHRoZSBcCisgICAgICAgICAgICAgICAgICAgdGFyZ2V0ICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBSQ0NFeF9DUlNfSW50ZXJydXB0X1NvdXJjZXMgUkNDRXggQ1JTIEludGVycnVwdCBTb3VyY2VzCisgKiBAeworICovCisjZGVmaW5lIFJDQ19DUlNfSVRfU1lOQ09LIENSU19DUl9TWU5DT0tJRSAgICAgLyohPCBTWU5DIGV2ZW50IE9LICovCisjZGVmaW5lIFJDQ19DUlNfSVRfU1lOQ1dBUk4gQ1JTX0NSX1NZTkNXQVJOSUUgLyohPCBTWU5DIHdhcm5pbmcgKi8KKyNkZWZpbmUgUkNDX0NSU19JVF9FUlIgQ1JTX0NSX0VSUklFICAgICAgICAgICAvKiE8IEVycm9yICovCisjZGVmaW5lIFJDQ19DUlNfSVRfRVNZTkMgQ1JTX0NSX0VTWU5DSUUgICAgICAgLyohPCBFeHBlY3RlZCBTWU5DICovCisjZGVmaW5lIFJDQ19DUlNfSVRfU1lOQ0VSUiBDUlNfQ1JfRVJSSUUgICAgICAgLyohPCBTWU5DIGVycm9yICovCisjZGVmaW5lIFJDQ19DUlNfSVRfU1lOQ01JU1MgQ1JTX0NSX0VSUklFICAgICAgLyohPCBTWU5DIG1pc3NlZCAqLworI2RlZmluZSBSQ0NfQ1JTX0lUX1RSSU1PVkYgQ1JTX0NSX0VSUklFIC8qITwgVHJpbW1pbmcgb3ZlcmZsb3cgb3IgdW5kZXJmbG93ICovCisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFJDQ0V4X0NSU19GbGFncyBSQ0NFeCBDUlMgRmxhZ3MKKyAqIEB7CisgKi8KKyNkZWZpbmUgUkNDX0NSU19GTEFHX1NZTkNPSyBDUlNfSVNSX1NZTkNPS0YgICAgIC8qITwgU1lOQyBldmVudCBPSyBmbGFnICAgICAqLworI2RlZmluZSBSQ0NfQ1JTX0ZMQUdfU1lOQ1dBUk4gQ1JTX0lTUl9TWU5DV0FSTkYgLyohPCBTWU5DIHdhcm5pbmcgZmxhZyAgICAgICovCisjZGVmaW5lIFJDQ19DUlNfRkxBR19FUlIgQ1JTX0lTUl9FUlJGICAgICAgICAgICAvKiE8IEVycm9yIGZsYWcgICAgICAgICovCisjZGVmaW5lIFJDQ19DUlNfRkxBR19FU1lOQyBDUlNfSVNSX0VTWU5DRiAgICAgICAvKiE8IEV4cGVjdGVkIFNZTkMgZmxhZyAgICAgKi8KKyNkZWZpbmUgUkNDX0NSU19GTEFHX1NZTkNFUlIgQ1JTX0lTUl9TWU5DRVJSICAgIC8qITwgU1lOQyBlcnJvciAqLworI2RlZmluZSBSQ0NfQ1JTX0ZMQUdfU1lOQ01JU1MgQ1JTX0lTUl9TWU5DTUlTUyAgLyohPCBTWU5DIG1pc3NlZCovCisjZGVmaW5lIFJDQ19DUlNfRkxBR19UUklNT1ZGIFwKKyAgQ1JTX0lTUl9UUklNT1ZGIC8qITwgVHJpbW1pbmcgb3ZlcmZsb3cgb3IgdW5kZXJmbG93ICovCisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyogRXhwb3J0ZWQgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUkNDRXhfRXhwb3J0ZWRfTWFjcm9zIFJDQ0V4IEV4cG9ydGVkIE1hY3JvcworICogQHsKKyAqLworCisvKiogQGJyaWVmICBNYWNybyB0byBjb25maWd1cmUgdGhlIFVTQVJUMSBjbG9jayAoVVNBUlQxQ0xLKS4KKyAqCisgKiBAcGFyYW0gIF9fVVNBUlQxX0NMS1NPVVJDRV9fIHNwZWNpZmllcyB0aGUgVVNBUlQxIGNsb2NrIHNvdXJjZS4KKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVVNBUlQxQ0xLU09VUkNFX1BDTEsyICBQQ0xLMiBzZWxlY3RlZCBhcyBVU0FSVDEKKyAqIGNsb2NrCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVVNBUlQxQ0xLU09VUkNFX0hTSSAgSFNJIHNlbGVjdGVkIGFzIFVTQVJUMSBjbG9jaworICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VTQVJUMUNMS1NPVVJDRV9TWVNDTEsgIFN5c3RlbSBDbG9jayBzZWxlY3RlZCBhcworICogVVNBUlQxIGNsb2NrCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVVNBUlQxQ0xLU09VUkNFX0xTRSAgTFNFIHNlbGVjdGVkIGFzIFVTQVJUMSBjbG9jaworICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUMV9DT05GSUcoX19VU0FSVDFfQ0xLU09VUkNFX18pIFwKKyAgTU9ESUZZX1JFRyhSQ0MtPkNDSVBSLCBSQ0NfQ0NJUFJfVVNBUlQxU0VMLCAoX19VU0FSVDFfQ0xLU09VUkNFX18pKQorCisvKiogQGJyaWVmICBNYWNybyB0byBnZXQgdGhlIFVTQVJUMSBjbG9jayBzb3VyY2UuCisgKiBAcmV0dmFsIFRoZSBjbG9jayBzb3VyY2UgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VU0FSVDFDTEtTT1VSQ0VfUENMSzIgIFBDTEsyIHNlbGVjdGVkIGFzIFVTQVJUMQorICogY2xvY2sKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VU0FSVDFDTEtTT1VSQ0VfSFNJICBIU0kgc2VsZWN0ZWQgYXMgVVNBUlQxIGNsb2NrCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVVNBUlQxQ0xLU09VUkNFX1NZU0NMSyAgU3lzdGVtIENsb2NrIHNlbGVjdGVkIGFzCisgKiBVU0FSVDEgY2xvY2sKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VU0FSVDFDTEtTT1VSQ0VfTFNFICBMU0Ugc2VsZWN0ZWQgYXMgVVNBUlQxIGNsb2NrCisgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0dFVF9VU0FSVDFfU09VUkNFKCkgXAorICAoUkVBRF9CSVQoUkNDLT5DQ0lQUiwgUkNDX0NDSVBSX1VTQVJUMVNFTCkpCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgVVNBUlQyIGNsb2NrIChVU0FSVDJDTEspLgorICoKKyAqIEBwYXJhbSAgX19VU0FSVDJfQ0xLU09VUkNFX18gc3BlY2lmaWVzIHRoZSBVU0FSVDIgY2xvY2sgc291cmNlLgorICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VU0FSVDJDTEtTT1VSQ0VfUENMSzEgIFBDTEsxIHNlbGVjdGVkIGFzIFVTQVJUMgorICogY2xvY2sKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VU0FSVDJDTEtTT1VSQ0VfSFNJICBIU0kgc2VsZWN0ZWQgYXMgVVNBUlQyIGNsb2NrCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVVNBUlQyQ0xLU09VUkNFX1NZU0NMSyAgU3lzdGVtIENsb2NrIHNlbGVjdGVkIGFzCisgKiBVU0FSVDIgY2xvY2sKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VU0FSVDJDTEtTT1VSQ0VfTFNFICBMU0Ugc2VsZWN0ZWQgYXMgVVNBUlQyIGNsb2NrCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQyX0NPTkZJRyhfX1VTQVJUMl9DTEtTT1VSQ0VfXykgXAorICBNT0RJRllfUkVHKFJDQy0+Q0NJUFIsIFJDQ19DQ0lQUl9VU0FSVDJTRUwsIChfX1VTQVJUMl9DTEtTT1VSQ0VfXykpCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGdldCB0aGUgVVNBUlQyIGNsb2NrIHNvdXJjZS4KKyAqIEByZXR2YWwgVGhlIGNsb2NrIHNvdXJjZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VTQVJUMkNMS1NPVVJDRV9QQ0xLMSAgUENMSzEgc2VsZWN0ZWQgYXMgVVNBUlQyCisgKiBjbG9jaworICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VTQVJUMkNMS1NPVVJDRV9IU0kgIEhTSSBzZWxlY3RlZCBhcyBVU0FSVDIgY2xvY2sKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VU0FSVDJDTEtTT1VSQ0VfU1lTQ0xLICBTeXN0ZW0gQ2xvY2sgc2VsZWN0ZWQgYXMKKyAqIFVTQVJUMiBjbG9jaworICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VTQVJUMkNMS1NPVVJDRV9MU0UgIExTRSBzZWxlY3RlZCBhcyBVU0FSVDIgY2xvY2sKKyAqLworI2RlZmluZSBfX0hBTF9SQ0NfR0VUX1VTQVJUMl9TT1VSQ0UoKSBcCisgIChSRUFEX0JJVChSQ0MtPkNDSVBSLCBSQ0NfQ0NJUFJfVVNBUlQyU0VMKSkKKworLyoqIEBicmllZiAgTWFjcm8gdG8gY29uZmlndXJlIHRoZSBVU0FSVDMgY2xvY2sgKFVTQVJUM0NMSykuCisgKgorICogQHBhcmFtICBfX1VTQVJUM19DTEtTT1VSQ0VfXyBzcGVjaWZpZXMgdGhlIFVTQVJUMyBjbG9jayBzb3VyY2UuCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VTQVJUM0NMS1NPVVJDRV9QQ0xLMSAgUENMSzEgc2VsZWN0ZWQgYXMgVVNBUlQzCisgKiBjbG9jaworICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VTQVJUM0NMS1NPVVJDRV9IU0kgIEhTSSBzZWxlY3RlZCBhcyBVU0FSVDMgY2xvY2sKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VU0FSVDNDTEtTT1VSQ0VfU1lTQ0xLICBTeXN0ZW0gQ2xvY2sgc2VsZWN0ZWQgYXMKKyAqIFVTQVJUMyBjbG9jaworICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VTQVJUM0NMS1NPVVJDRV9MU0UgIExTRSBzZWxlY3RlZCBhcyBVU0FSVDMgY2xvY2sKKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDNfQ09ORklHKF9fVVNBUlQzX0NMS1NPVVJDRV9fKSBcCisgIE1PRElGWV9SRUcoUkNDLT5DQ0lQUiwgUkNDX0NDSVBSX1VTQVJUM1NFTCwgKF9fVVNBUlQzX0NMS1NPVVJDRV9fKSkKKworLyoqIEBicmllZiAgTWFjcm8gdG8gZ2V0IHRoZSBVU0FSVDMgY2xvY2sgc291cmNlLgorICogQHJldHZhbCBUaGUgY2xvY2sgc291cmNlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVVNBUlQzQ0xLU09VUkNFX1BDTEsxICBQQ0xLMSBzZWxlY3RlZCBhcyBVU0FSVDMKKyAqIGNsb2NrCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVVNBUlQzQ0xLU09VUkNFX0hTSSAgSFNJIHNlbGVjdGVkIGFzIFVTQVJUMyBjbG9jaworICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VTQVJUM0NMS1NPVVJDRV9TWVNDTEsgIFN5c3RlbSBDbG9jayBzZWxlY3RlZCBhcworICogVVNBUlQzIGNsb2NrCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVVNBUlQzQ0xLU09VUkNFX0xTRSAgTFNFIHNlbGVjdGVkIGFzIFVTQVJUMyBjbG9jaworICovCisjZGVmaW5lIF9fSEFMX1JDQ19HRVRfVVNBUlQzX1NPVVJDRSgpIFwKKyAgKFJFQURfQklUKFJDQy0+Q0NJUFIsIFJDQ19DQ0lQUl9VU0FSVDNTRUwpKQorCisjaWYgZGVmaW5lZChVQVJUNCkKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgVUFSVDQgY2xvY2sgKFVBUlQ0Q0xLKS4KKyAqCisgKiBAcGFyYW0gIF9fVUFSVDRfQ0xLU09VUkNFX18gc3BlY2lmaWVzIHRoZSBVQVJUNCBjbG9jayBzb3VyY2UuCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VBUlQ0Q0xLU09VUkNFX1BDTEsxICBQQ0xLMSBzZWxlY3RlZCBhcyBVQVJUNCBjbG9jaworICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VBUlQ0Q0xLU09VUkNFX0hTSSAgSFNJIHNlbGVjdGVkIGFzIFVBUlQ0IGNsb2NrCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVUFSVDRDTEtTT1VSQ0VfU1lTQ0xLICBTeXN0ZW0gQ2xvY2sgc2VsZWN0ZWQgYXMKKyAqIFVBUlQ0IGNsb2NrCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVUFSVDRDTEtTT1VSQ0VfTFNFICBMU0Ugc2VsZWN0ZWQgYXMgVUFSVDQgY2xvY2sKKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX1JDQ19VQVJUNF9DT05GSUcoX19VQVJUNF9DTEtTT1VSQ0VfXykgXAorICBNT0RJRllfUkVHKFJDQy0+Q0NJUFIsIFJDQ19DQ0lQUl9VQVJUNFNFTCwgKF9fVUFSVDRfQ0xLU09VUkNFX18pKQorCisvKiogQGJyaWVmICBNYWNybyB0byBnZXQgdGhlIFVBUlQ0IGNsb2NrIHNvdXJjZS4KKyAqIEByZXR2YWwgVGhlIGNsb2NrIHNvdXJjZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VBUlQ0Q0xLU09VUkNFX1BDTEsxICBQQ0xLMSBzZWxlY3RlZCBhcyBVQVJUNCBjbG9jaworICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VBUlQ0Q0xLU09VUkNFX0hTSSAgSFNJIHNlbGVjdGVkIGFzIFVBUlQ0IGNsb2NrCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVUFSVDRDTEtTT1VSQ0VfU1lTQ0xLICBTeXN0ZW0gQ2xvY2sgc2VsZWN0ZWQgYXMKKyAqIFVBUlQ0IGNsb2NrCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVUFSVDRDTEtTT1VSQ0VfTFNFICBMU0Ugc2VsZWN0ZWQgYXMgVUFSVDQgY2xvY2sKKyAqLworI2RlZmluZSBfX0hBTF9SQ0NfR0VUX1VBUlQ0X1NPVVJDRSgpIChSRUFEX0JJVChSQ0MtPkNDSVBSLCBSQ0NfQ0NJUFJfVUFSVDRTRUwpKQorI2VuZGlmIC8qIFVBUlQ0ICovCisKKyNpZiBkZWZpbmVkKFVBUlQ1KQorCisvKiogQGJyaWVmICBNYWNybyB0byBjb25maWd1cmUgdGhlIFVBUlQ1IGNsb2NrIChVQVJUNUNMSykuCisgKgorICogQHBhcmFtICBfX1VBUlQ1X0NMS1NPVVJDRV9fIHNwZWNpZmllcyB0aGUgVUFSVDUgY2xvY2sgc291cmNlLgorICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VQVJUNUNMS1NPVVJDRV9QQ0xLMSAgUENMSzEgc2VsZWN0ZWQgYXMgVUFSVDUgY2xvY2sKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VQVJUNUNMS1NPVVJDRV9IU0kgIEhTSSBzZWxlY3RlZCBhcyBVQVJUNSBjbG9jaworICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VBUlQ1Q0xLU09VUkNFX1NZU0NMSyAgU3lzdGVtIENsb2NrIHNlbGVjdGVkIGFzCisgKiBVQVJUNSBjbG9jaworICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VBUlQ1Q0xLU09VUkNFX0xTRSAgTFNFIHNlbGVjdGVkIGFzIFVBUlQ1IGNsb2NrCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9SQ0NfVUFSVDVfQ09ORklHKF9fVUFSVDVfQ0xLU09VUkNFX18pIFwKKyAgTU9ESUZZX1JFRyhSQ0MtPkNDSVBSLCBSQ0NfQ0NJUFJfVUFSVDVTRUwsIChfX1VBUlQ1X0NMS1NPVVJDRV9fKSkKKworLyoqIEBicmllZiAgTWFjcm8gdG8gZ2V0IHRoZSBVQVJUNSBjbG9jayBzb3VyY2UuCisgKiBAcmV0dmFsIFRoZSBjbG9jayBzb3VyY2UgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VQVJUNUNMS1NPVVJDRV9QQ0xLMSAgUENMSzEgc2VsZWN0ZWQgYXMgVUFSVDUgY2xvY2sKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VQVJUNUNMS1NPVVJDRV9IU0kgIEhTSSBzZWxlY3RlZCBhcyBVQVJUNSBjbG9jaworICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VBUlQ1Q0xLU09VUkNFX1NZU0NMSyAgU3lzdGVtIENsb2NrIHNlbGVjdGVkIGFzCisgKiBVQVJUNSBjbG9jaworICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VBUlQ1Q0xLU09VUkNFX0xTRSAgTFNFIHNlbGVjdGVkIGFzIFVBUlQ1IGNsb2NrCisgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0dFVF9VQVJUNV9TT1VSQ0UoKSAoUkVBRF9CSVQoUkNDLT5DQ0lQUiwgUkNDX0NDSVBSX1VBUlQ1U0VMKSkKKworI2VuZGlmIC8qIFVBUlQ1ICovCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgTFBVQVJUMSBjbG9jayAoTFBVQVJUMUNMSykuCisgKgorICogQHBhcmFtICBfX0xQVUFSVDFfQ0xLU09VUkNFX18gc3BlY2lmaWVzIHRoZSBMUFVBUlQxIGNsb2NrIHNvdXJjZS4KKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFBVQVJUMUNMS1NPVVJDRV9QQ0xLMSAgUENMSzEgc2VsZWN0ZWQgYXMgTFBVQVJUMQorICogY2xvY2sKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19MUFVBUlQxQ0xLU09VUkNFX0hTSSAgSFNJIHNlbGVjdGVkIGFzIExQVUFSVDEgY2xvY2sKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19MUFVBUlQxQ0xLU09VUkNFX1NZU0NMSyAgU3lzdGVtIENsb2NrIHNlbGVjdGVkIGFzCisgKiBMUFVBUlQxIGNsb2NrCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFBVQVJUMUNMS1NPVVJDRV9MU0UgIExTRSBzZWxlY3RlZCBhcyBMUFVBUlQxIGNsb2NrCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9SQ0NfTFBVQVJUMV9DT05GSUcoX19MUFVBUlQxX0NMS1NPVVJDRV9fKSBcCisgIE1PRElGWV9SRUcoUkNDLT5DQ0lQUiwgUkNDX0NDSVBSX0xQVUFSVDFTRUwsIChfX0xQVUFSVDFfQ0xLU09VUkNFX18pKQorCisvKiogQGJyaWVmICBNYWNybyB0byBnZXQgdGhlIExQVUFSVDEgY2xvY2sgc291cmNlLgorICogQHJldHZhbCBUaGUgY2xvY2sgc291cmNlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFBVQVJUMUNMS1NPVVJDRV9QQ0xLMSAgUENMSzEgc2VsZWN0ZWQgYXMgTFBVQVJUMQorICogY2xvY2sKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19MUFVBUlQxQ0xLU09VUkNFX0hTSSAgSFNJIHNlbGVjdGVkIGFzIExQVUFSVDEgY2xvY2sKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19MUFVBUlQxQ0xLU09VUkNFX1NZU0NMSyAgU3lzdGVtIENsb2NrIHNlbGVjdGVkIGFzCisgKiBMUFVBUlQxIGNsb2NrCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFBVQVJUMUNMS1NPVVJDRV9MU0UgIExTRSBzZWxlY3RlZCBhcyBMUFVBUlQxIGNsb2NrCisgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0dFVF9MUFVBUlQxX1NPVVJDRSgpIFwKKyAgKFJFQURfQklUKFJDQy0+Q0NJUFIsIFJDQ19DQ0lQUl9MUFVBUlQxU0VMKSkKKworLyoqIEBicmllZiAgTWFjcm8gdG8gY29uZmlndXJlIHRoZSBJMkMxIGNsb2NrIChJMkMxQ0xLKS4KKyAqCisgKiBAcGFyYW0gIF9fSTJDMV9DTEtTT1VSQ0VfXyBzcGVjaWZpZXMgdGhlIEkyQzEgY2xvY2sgc291cmNlLgorICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JMkMxQ0xLU09VUkNFX1BDTEsxICBQQ0xLMSBzZWxlY3RlZCBhcyBJMkMxIGNsb2NrCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSTJDMUNMS1NPVVJDRV9IU0kgIEhTSSBzZWxlY3RlZCBhcyBJMkMxIGNsb2NrCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSTJDMUNMS1NPVVJDRV9TWVNDTEsgIFN5c3RlbSBDbG9jayBzZWxlY3RlZCBhcyBJMkMxCisgKiBjbG9jaworICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0kyQzFfQ09ORklHKF9fSTJDMV9DTEtTT1VSQ0VfXykgXAorICBNT0RJRllfUkVHKFJDQy0+Q0NJUFIsIFJDQ19DQ0lQUl9JMkMxU0VMLCAoX19JMkMxX0NMS1NPVVJDRV9fKSkKKworLyoqIEBicmllZiAgTWFjcm8gdG8gZ2V0IHRoZSBJMkMxIGNsb2NrIHNvdXJjZS4KKyAqIEByZXR2YWwgVGhlIGNsb2NrIHNvdXJjZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0kyQzFDTEtTT1VSQ0VfUENMSzEgIFBDTEsxIHNlbGVjdGVkIGFzIEkyQzEgY2xvY2sKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JMkMxQ0xLU09VUkNFX0hTSSAgSFNJIHNlbGVjdGVkIGFzIEkyQzEgY2xvY2sKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JMkMxQ0xLU09VUkNFX1NZU0NMSyAgU3lzdGVtIENsb2NrIHNlbGVjdGVkIGFzIEkyQzEKKyAqIGNsb2NrCisgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0dFVF9JMkMxX1NPVVJDRSgpIChSRUFEX0JJVChSQ0MtPkNDSVBSLCBSQ0NfQ0NJUFJfSTJDMVNFTCkpCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgSTJDMiBjbG9jayAoSTJDMkNMSykuCisgKgorICogQHBhcmFtICBfX0kyQzJfQ0xLU09VUkNFX18gc3BlY2lmaWVzIHRoZSBJMkMyIGNsb2NrIHNvdXJjZS4KKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSTJDMkNMS1NPVVJDRV9QQ0xLMSAgUENMSzEgc2VsZWN0ZWQgYXMgSTJDMiBjbG9jaworICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0kyQzJDTEtTT1VSQ0VfSFNJICBIU0kgc2VsZWN0ZWQgYXMgSTJDMiBjbG9jaworICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0kyQzJDTEtTT1VSQ0VfU1lTQ0xLICBTeXN0ZW0gQ2xvY2sgc2VsZWN0ZWQgYXMgSTJDMgorICogY2xvY2sKKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX1JDQ19JMkMyX0NPTkZJRyhfX0kyQzJfQ0xLU09VUkNFX18pIFwKKyAgTU9ESUZZX1JFRyhSQ0MtPkNDSVBSLCBSQ0NfQ0NJUFJfSTJDMlNFTCwgKF9fSTJDMl9DTEtTT1VSQ0VfXykpCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGdldCB0aGUgSTJDMiBjbG9jayBzb3VyY2UuCisgKiBAcmV0dmFsIFRoZSBjbG9jayBzb3VyY2UgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JMkMyQ0xLU09VUkNFX1BDTEsxICBQQ0xLMSBzZWxlY3RlZCBhcyBJMkMyIGNsb2NrCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSTJDMkNMS1NPVVJDRV9IU0kgIEhTSSBzZWxlY3RlZCBhcyBJMkMyIGNsb2NrCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSTJDMkNMS1NPVVJDRV9TWVNDTEsgIFN5c3RlbSBDbG9jayBzZWxlY3RlZCBhcyBJMkMyCisgKiBjbG9jaworICovCisjZGVmaW5lIF9fSEFMX1JDQ19HRVRfSTJDMl9TT1VSQ0UoKSAoUkVBRF9CSVQoUkNDLT5DQ0lQUiwgUkNDX0NDSVBSX0kyQzJTRUwpKQorCisvKiogQGJyaWVmICBNYWNybyB0byBjb25maWd1cmUgdGhlIEkyQzMgY2xvY2sgKEkyQzNDTEspLgorICoKKyAqIEBwYXJhbSAgX19JMkMzX0NMS1NPVVJDRV9fIHNwZWNpZmllcyB0aGUgSTJDMyBjbG9jayBzb3VyY2UuCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0kyQzNDTEtTT1VSQ0VfUENMSzEgIFBDTEsxIHNlbGVjdGVkIGFzIEkyQzMgY2xvY2sKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JMkMzQ0xLU09VUkNFX0hTSSAgSFNJIHNlbGVjdGVkIGFzIEkyQzMgY2xvY2sKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JMkMzQ0xLU09VUkNFX1NZU0NMSyAgU3lzdGVtIENsb2NrIHNlbGVjdGVkIGFzIEkyQzMKKyAqIGNsb2NrCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9SQ0NfSTJDM19DT05GSUcoX19JMkMzX0NMS1NPVVJDRV9fKSBcCisgIE1PRElGWV9SRUcoUkNDLT5DQ0lQUiwgUkNDX0NDSVBSX0kyQzNTRUwsIChfX0kyQzNfQ0xLU09VUkNFX18pKQorCisvKiogQGJyaWVmICBNYWNybyB0byBnZXQgdGhlIEkyQzMgY2xvY2sgc291cmNlLgorICogQHJldHZhbCBUaGUgY2xvY2sgc291cmNlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSTJDM0NMS1NPVVJDRV9QQ0xLMSAgUENMSzEgc2VsZWN0ZWQgYXMgSTJDMyBjbG9jaworICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0kyQzNDTEtTT1VSQ0VfSFNJICBIU0kgc2VsZWN0ZWQgYXMgSTJDMyBjbG9jaworICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0kyQzNDTEtTT1VSQ0VfU1lTQ0xLICBTeXN0ZW0gQ2xvY2sgc2VsZWN0ZWQgYXMgSTJDMworICogY2xvY2sKKyAqLworI2RlZmluZSBfX0hBTF9SQ0NfR0VUX0kyQzNfU09VUkNFKCkgKFJFQURfQklUKFJDQy0+Q0NJUFIsIFJDQ19DQ0lQUl9JMkMzU0VMKSkKKworI2lmIGRlZmluZWQoSTJDNCkKKworLyoqIEBicmllZiAgTWFjcm8gdG8gY29uZmlndXJlIHRoZSBJMkM0IGNsb2NrIChJMkM0Q0xLKS4KKyAqCisgKiBAcGFyYW0gIF9fSTJDNF9DTEtTT1VSQ0VfXyBzcGVjaWZpZXMgdGhlIEkyQzQgY2xvY2sgc291cmNlLgorICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JMkM0Q0xLU09VUkNFX1BDTEsxICBQQ0xLMSBzZWxlY3RlZCBhcyBJMkM0IGNsb2NrCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSTJDNENMS1NPVVJDRV9IU0kgIEhTSSBzZWxlY3RlZCBhcyBJMkM0IGNsb2NrCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSTJDNENMS1NPVVJDRV9TWVNDTEsgIFN5c3RlbSBDbG9jayBzZWxlY3RlZCBhcyBJMkM0CisgKiBjbG9jaworICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0kyQzRfQ09ORklHKF9fSTJDNF9DTEtTT1VSQ0VfXykgXAorICBNT0RJRllfUkVHKFJDQy0+Q0NJUFIyLCBSQ0NfQ0NJUFIyX0kyQzRTRUwsIChfX0kyQzRfQ0xLU09VUkNFX18pKQorCisvKiogQGJyaWVmICBNYWNybyB0byBnZXQgdGhlIEkyQzQgY2xvY2sgc291cmNlLgorICogQHJldHZhbCBUaGUgY2xvY2sgc291cmNlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSTJDNENMS1NPVVJDRV9QQ0xLMSAgUENMSzEgc2VsZWN0ZWQgYXMgSTJDNCBjbG9jaworICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0kyQzRDTEtTT1VSQ0VfSFNJICBIU0kgc2VsZWN0ZWQgYXMgSTJDNCBjbG9jaworICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0kyQzRDTEtTT1VSQ0VfU1lTQ0xLICBTeXN0ZW0gQ2xvY2sgc2VsZWN0ZWQgYXMgSTJDNAorICogY2xvY2sKKyAqLworI2RlZmluZSBfX0hBTF9SQ0NfR0VUX0kyQzRfU09VUkNFKCkgKFJFQURfQklUKFJDQy0+Q0NJUFIyLCBSQ0NfQ0NJUFIyX0kyQzRTRUwpKQorCisjZW5kaWYgLyogSTJDNCAqLworCisvKiogQGJyaWVmICBNYWNybyB0byBjb25maWd1cmUgdGhlIExQVElNMSBjbG9jayAoTFBUSU0xQ0xLKS4KKyAqCisgKiBAcGFyYW0gIF9fTFBUSU0xX0NMS1NPVVJDRV9fIHNwZWNpZmllcyB0aGUgTFBUSU0xIGNsb2NrIHNvdXJjZS4KKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFBUSU0xQ0xLU09VUkNFX1BDTEsxICBQQ0xLMSBzZWxlY3RlZCBhcyBMUFRJTTEKKyAqIGNsb2NrCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFBUSU0xQ0xLU09VUkNFX0xTSSAgSFNJIHNlbGVjdGVkIGFzIExQVElNMSBjbG9jaworICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0xQVElNMUNMS1NPVVJDRV9IU0kgIExTSSBzZWxlY3RlZCBhcyBMUFRJTTEgY2xvY2sKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19MUFRJTTFDTEtTT1VSQ0VfTFNFICBMU0Ugc2VsZWN0ZWQgYXMgTFBUSU0xIGNsb2NrCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9SQ0NfTFBUSU0xX0NPTkZJRyhfX0xQVElNMV9DTEtTT1VSQ0VfXykgXAorICBNT0RJRllfUkVHKFJDQy0+Q0NJUFIsIFJDQ19DQ0lQUl9MUFRJTTFTRUwsIChfX0xQVElNMV9DTEtTT1VSQ0VfXykpCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGdldCB0aGUgTFBUSU0xIGNsb2NrIHNvdXJjZS4KKyAqIEByZXR2YWwgVGhlIGNsb2NrIHNvdXJjZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0xQVElNMUNMS1NPVVJDRV9QQ0xLMSAgUENMSzEgc2VsZWN0ZWQgYXMgTFBVQVJUMQorICogY2xvY2sKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19MUFRJTTFDTEtTT1VSQ0VfTFNJICBIU0kgc2VsZWN0ZWQgYXMgTFBVQVJUMSBjbG9jaworICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0xQVElNMUNMS1NPVVJDRV9IU0kgIFN5c3RlbSBDbG9jayBzZWxlY3RlZCBhcworICogTFBVQVJUMSBjbG9jaworICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0xQVElNMUNMS1NPVVJDRV9MU0UgIExTRSBzZWxlY3RlZCBhcyBMUFVBUlQxIGNsb2NrCisgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0dFVF9MUFRJTTFfU09VUkNFKCkgXAorICAoUkVBRF9CSVQoUkNDLT5DQ0lQUiwgUkNDX0NDSVBSX0xQVElNMVNFTCkpCisKKy8qKgorICogQGJyaWVmICBNYWNybyB0byBjb25maWd1cmUgdGhlIFNBSTEgY2xvY2sgc291cmNlLgorICogQHBhcmFtICBfX1NBSTFfQ0xLU09VUkNFX18gZGVmaW5lcyB0aGUgU0FJMSBjbG9jayBzb3VyY2UuIFRoaXMgY2xvY2sgaXMKKyAqIGRlcml2ZWQgZnJvbSB0aGUgSFNJLCBzeXN0ZW0gUExMLCBTeXN0ZW0gQ2xvY2sgb3IgZXh0ZXJuYWwgY2xvY2suIFRoaXMKKyAqIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19TQUkxQ0xLU09VUkNFX1NZU0NMSyBTQUkxIGNsb2NrID0gU3lzdGVtIENsb2NrCisgKiAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX1NBSTFDTEtTT1VSQ0VfUExMICAgIFNBSTEgY2xvY2sgPSBQTEwgIlEiIGNsb2NrCisgKiAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX1NBSTFDTEtTT1VSQ0VfRVhUICAgIFNBSTEgY2xvY2sgPSBFWFQKKyAqICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfU0FJMUNMS1NPVVJDRV9IU0kgICAgU0FJMSBjbG9jayA9IEhTSQorICoKKyAqIEByZXR2YWwgTm9uZQorICovCisKKyNpZiBkZWZpbmVkKFNBSTEpCisjZGVmaW5lIF9fSEFMX1JDQ19TQUkxX0NPTkZJRyhfX1NBSTFfQ0xLU09VUkNFX18pIFwKKyAgTU9ESUZZX1JFRyhSQ0MtPkNDSVBSLCBSQ0NfQ0NJUFJfU0FJMVNFTCwgKF9fU0FJMV9DTEtTT1VSQ0VfXykpCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGdldCB0aGUgU0FJMSBjbG9jayBzb3VyY2UuCisgKiBAcmV0dmFsIFRoZSBjbG9jayBzb3VyY2UgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfU0FJMUNMS1NPVVJDRV9TWVNDTEsgU0FJMSBjbG9jayA9IFN5c3RlbSBDbG9jaworICogICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19TQUkxQ0xLU09VUkNFX1BMTCAgICBTQUkxIGNsb2NrID0gUExMICJRIiBjbG9jaworICogICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19TQUkxQ0xLU09VUkNFX0VYVCAgICBTQUkxIGNsb2NrID0gRVhUCisgKiAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX1NBSTFDTEtTT1VSQ0VfSFNJICAgIFNBSTEgY2xvY2sgPSBIU0kKKyAqCisgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0dFVF9TQUkxX1NPVVJDRSgpIChSRUFEX0JJVChSQ0MtPkNDSVBSLCBSQ0NfQ0NJUFJfU0FJMVNFTCkpCisjZW5kaWYgLyogU0FJMSAqLworCisjaWYgZGVmaW5lZChTUElfSTJTX1NVUFBPUlQpCisvKioKKyAqIEBicmllZiAgTWFjcm8gdG8gY29uZmlndXJlIHRoZSBJMlMgY2xvY2sgc291cmNlLgorICogQHBhcmFtICBfX0kyU19DTEtTT1VSQ0VfXyBkZWZpbmVzIHRoZSBJMlMgY2xvY2sgc291cmNlLiBUaGlzIGNsb2NrIGlzIGRlcml2ZWQKKyAqICAgICAgICAgZnJvbSB0aGUgSFNJLCBzeXN0ZW0gUExMLCBTeXN0ZW0gQ2xvY2sgb3IgZXh0ZXJuYWwgY2xvY2suCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JMlNDTEtTT1VSQ0VfU1lTQ0xLIEkyUyBjbG9jayA9IFN5c3RlbSBDbG9jaworICogICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JMlNDTEtTT1VSQ0VfUExMICAgIEkyUyBjbG9jayA9IFBMTCAiUSIgY2xvY2sKKyAqICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSTJTQ0xLU09VUkNFX0VYVCAgICBJMlMgY2xvY2sgPSBFWFQKKyAqICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSTJTQ0xLU09VUkNFX0hTSSAgICBJMlMgY2xvY2sgPSBIU0kKKyAqCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9SQ0NfSTJTX0NPTkZJRyhfX0kyU19DTEtTT1VSQ0VfXykgXAorICBNT0RJRllfUkVHKFJDQy0+Q0NJUFIsIFJDQ19DQ0lQUl9JMlMyM1NFTCwgKF9fSTJTX0NMS1NPVVJDRV9fKSkKKworLyoqIEBicmllZiAgTWFjcm8gdG8gZ2V0IHRoZSBJMlMgY2xvY2sgc291cmNlLgorICogQHJldHZhbCBUaGUgY2xvY2sgc291cmNlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0kyU0NMS1NPVVJDRV9TWVNDTEsgSTJTIGNsb2NrID0gU3lzdGVtIENsb2NrCisgKiAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0kyU0NMS1NPVVJDRV9QTEwgICAgSTJTIGNsb2NrID0gUExMICJRIiBjbG9jaworICogICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JMlNDTEtTT1VSQ0VfRVhUICAgIEkyUyBjbG9jayA9IEVYVAorICogICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JMlNDTEtTT1VSQ0VfSFNJICAgIEkyUyBjbG9jayA9IEhTSQorICoKKyAqLworI2RlZmluZSBfX0hBTF9SQ0NfR0VUX0kyU19TT1VSQ0UoKSBcCisgICgodWludDMyX3QpKFJFQURfQklUKFJDQy0+Q0NJUFIsIFJDQ19DQ0lQUl9JMlMyM1NFTCkpKQorI2VuZGlmIC8qIFNQSV9JMlNfU1VQUE9SVCAqLworCisjaWYgZGVmaW5lZChGRENBTjEpCisvKioKKyAqIEBicmllZiAgTWFjcm8gdG8gY29uZmlndXJlIHRoZSBGRENBTiBjbG9jayBzb3VyY2UuCisgKiBAcGFyYW0gIF9fRkRDQU5fQ0xLU09VUkNFX18gZGVmaW5lcyB0aGUgRkRDQU4gY2xvY2sgc291cmNlLiBUaGlzIGNsb2NrIGlzCisgKiBkZXJpdmVkIGZyb20gdGhlIEhTRSwgc3lzdGVtIFBMTCBvciBQQ0xLMS4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUKKyAqIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0ZEQ0FOQ0xLU09VUkNFX0hTRSAgIEZEQ0FOIGNsb2NrID0gSFNFCisgKiAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0ZEQ0FOQ0xLU09VUkNFX1BMTCAgIEZEQ0FOIGNsb2NrID0gUExMICJRIiBjbG9jaworICogICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19GRENBTkNMS1NPVVJDRV9QQ0xLMSBGRENBTiBjbG9jayA9IFBDTEsxCisgKgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0ZEQ0FOX0NPTkZJRyhfX0ZEQ0FOX0NMS1NPVVJDRV9fKSBcCisgIE1PRElGWV9SRUcoUkNDLT5DQ0lQUiwgUkNDX0NDSVBSX0ZEQ0FOU0VMLCAodWludDMyX3QpKF9fRkRDQU5fQ0xLU09VUkNFX18pKQorCisvKiogQGJyaWVmICBNYWNybyB0byBnZXQgdGhlIEZEQ0FOIGNsb2NrIHNvdXJjZS4KKyAqIEByZXR2YWwgVGhlIGNsb2NrIHNvdXJjZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19GRENBTkNMS1NPVVJDRV9IU0UgICBGRENBTiBjbG9jayA9IEhTRQorICogICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19GRENBTkNMS1NPVVJDRV9QTEwgICBGRENBTiBjbG9jayA9IFBMTCAiUSIgY2xvY2sKKyAqICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfRkRDQU5DTEtTT1VSQ0VfUENMSzEgRkRDQU4gY2xvY2sgPSBQQ0xLMQorICoKKyAqLworI2RlZmluZSBfX0hBTF9SQ0NfR0VUX0ZEQ0FOX1NPVVJDRSgpIFwKKyAgKCh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DQ0lQUiwgUkNDX0NDSVBSX0ZEQ0FOU0VMKSkpCisjZW5kaWYgLyogRkRDQU4xICovCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgUk5HIGNsb2NrLgorICoKKyAqIEBub3RlICBVU0IgYW5kIFJORyBwZXJpcGhlcmFscyBzaGFyZSB0aGUgc2FtZSA0OE1IeiBjbG9jayBzb3VyY2UuCisgKgorICogQHBhcmFtICBfX1JOR19DTEtTT1VSQ0VfXyBzcGVjaWZpZXMgdGhlIFJORyBjbG9jayBzb3VyY2UuCisgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUk5HQ0xLU09VUkNFX0hTSTQ4ICBIU0k0OCBzZWxlY3RlZCBhcyBSTkcgY2xvY2sgZm9yCisgKiBkZXZpY2VzIHdpdGggSFNJNDgKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19STkdDTEtTT1VSQ0VfUExMICBQTEwgQ2xvY2sgc2VsZWN0ZWQgYXMgUk5HIGNsb2NrCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9SQ0NfUk5HX0NPTkZJRyhfX1JOR19DTEtTT1VSQ0VfXykgXAorICBNT0RJRllfUkVHKFJDQy0+Q0NJUFIsIFJDQ19DQ0lQUl9DTEs0OFNFTCwgKF9fUk5HX0NMS1NPVVJDRV9fKSkKKworLyoqIEBicmllZiAgTWFjcm8gdG8gZ2V0IHRoZSBSTkcgY2xvY2suCisgKiBAcmV0dmFsIFRoZSBjbG9jayBzb3VyY2UgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19STkdDTEtTT1VSQ0VfSFNJNDggIEhTSTQ4IHNlbGVjdGVkIGFzIFJORyBjbG9jayBmb3IKKyAqIGRldmljZXMgd2l0aCBIU0k0OAorICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1JOR0NMS1NPVVJDRV9QTEwgIFBMTCAiUSIgY2xvY2sgc2VsZWN0ZWQgYXMgUk5HCisgKiBjbG9jaworICovCisjZGVmaW5lIF9fSEFMX1JDQ19HRVRfUk5HX1NPVVJDRSgpIChSRUFEX0JJVChSQ0MtPkNDSVBSLCBSQ0NfQ0NJUFJfQ0xLNDhTRUwpKQorCisjaWYgZGVmaW5lZChVU0IpCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgVVNCIGNsb2NrIChVU0JDTEspLgorICoKKyAqIEBub3RlICBVU0IsIFJORyBwZXJpcGhlcmFscyBzaGFyZSB0aGUgc2FtZSA0OE1IeiBjbG9jayBzb3VyY2UuCisgKgorICogQHBhcmFtICBfX1VTQl9DTEtTT1VSQ0VfXyBzcGVjaWZpZXMgdGhlIFVTQiBjbG9jayBzb3VyY2UuCisgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVVNCQ0xLU09VUkNFX0hTSTQ4ICBIU0k0OCBzZWxlY3RlZCBhcyA0OE1IeiBjbG9jaworICogZm9yIGRldmljZXMgd2l0aCBIU0k0OAorICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VTQkNMS1NPVVJDRV9QTEwgIFBMTCAiUSIgY2xvY2sgKFBMTDQ4TTFDTEspCisgKiBzZWxlY3RlZCBhcyBVU0IgY2xvY2sKKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX1JDQ19VU0JfQ09ORklHKF9fVVNCX0NMS1NPVVJDRV9fKSBcCisgIE1PRElGWV9SRUcoUkNDLT5DQ0lQUiwgUkNDX0NDSVBSX0NMSzQ4U0VMLCAoX19VU0JfQ0xLU09VUkNFX18pKQorCisvKiogQGJyaWVmICBNYWNybyB0byBnZXQgdGhlIFVTQiBjbG9jayBzb3VyY2UuCisgKiBAcmV0dmFsIFRoZSBjbG9jayBzb3VyY2UgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VU0JDTEtTT1VSQ0VfSFNJNDggIEhTSTQ4IHNlbGVjdGVkIGFzIDQ4TUh6IGNsb2NrCisgKiBmb3IgZGV2aWNlcyB3aXRoIEhTSTQ4CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVVNCQ0xLU09VUkNFX1BMTCAgUExMICJRIiBjbG9jayAoUExMNDhNMUNMSykKKyAqIHNlbGVjdGVkIGFzIFVTQiBjbG9jaworICovCisjZGVmaW5lIF9fSEFMX1JDQ19HRVRfVVNCX1NPVVJDRSgpIChSRUFEX0JJVChSQ0MtPkNDSVBSLCBSQ0NfQ0NJUFJfQ0xLNDhTRUwpKQorCisjZW5kaWYgLyogVVNCICovCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgQURDMTIgaW50ZXJmYWNlIGNsb2NrLgorICogQHBhcmFtICBfX0FEQzEyX0NMS1NPVVJDRV9fIHNwZWNpZmllcyB0aGUgQURDMTIgZGlnaXRhbCBpbnRlcmZhY2UgY2xvY2sKKyAqIHNvdXJjZS4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BREMxMkNMS1NPVVJDRV9OT05FICAgIE5vIGNsb2NrIHNlbGVjdGVkIGFzIEFEQzEyCisgKiBjbG9jaworICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0FEQzEyQ0xLU09VUkNFX1BMTCAgICAgUExMIENsb2NrIHNlbGVjdGVkIGFzIEFEQzEyCisgKiBjbG9jaworICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0FEQzEyQ0xLU09VUkNFX1NZU0NMSyAgU3lzdGVtIENsb2NrIHNlbGVjdGVkIGFzCisgKiBBREMxMiBjbG9jaworICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0FEQzEyX0NPTkZJRyhfX0FEQzEyX0NMS1NPVVJDRV9fKSBcCisgIE1PRElGWV9SRUcoUkNDLT5DQ0lQUiwgUkNDX0NDSVBSX0FEQzEyU0VMLCAoX19BREMxMl9DTEtTT1VSQ0VfXykpCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGdldCB0aGUgQURDMTIgY2xvY2sgc291cmNlLgorICogQHJldHZhbCBUaGUgY2xvY2sgc291cmNlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQURDMTJDTEtTT1VSQ0VfTk9ORSAgICBObyBjbG9jayBzZWxlY3RlZCBhcyBBREMxMgorICogY2xvY2sKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BREMxMkNMS1NPVVJDRV9QTEwgICAgIFBMTCBDbG9jayBzZWxlY3RlZCBhcyBBREMxMgorICogY2xvY2sKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BREMxMkNMS1NPVVJDRV9TWVNDTEsgIFN5c3RlbSBDbG9jayBzZWxlY3RlZCBhcworICogQURDMTIgY2xvY2sKKyAqLworI2RlZmluZSBfX0hBTF9SQ0NfR0VUX0FEQzEyX1NPVVJDRSgpIChSRUFEX0JJVChSQ0MtPkNDSVBSLCBSQ0NfQ0NJUFJfQURDMTJTRUwpKQorCisjaWYgZGVmaW5lZChBREMzNDVfQ09NTU9OKQorLyoqIEBicmllZiAgTWFjcm8gdG8gY29uZmlndXJlIHRoZSBBREMzNDUgaW50ZXJmYWNlIGNsb2NrLgorICogQHBhcmFtICBfX0FEQzM0NV9DTEtTT1VSQ0VfXyBzcGVjaWZpZXMgdGhlIEFEQzM0NSBkaWdpdGFsIGludGVyZmFjZSBjbG9jaworICogc291cmNlLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0FEQzM0NUNMS1NPVVJDRV9OT05FICAgIE5vIGNsb2NrIHNlbGVjdGVkIGFzIEFEQzM0NQorICogY2xvY2sKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BREMzNDVDTEtTT1VSQ0VfUExMICAgICBQTEwgQ2xvY2sgc2VsZWN0ZWQgYXMgQURDMzQ1CisgKiBjbG9jaworICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0FEQzM0NUNMS1NPVVJDRV9TWVNDTEsgIFN5c3RlbSBDbG9jayBzZWxlY3RlZCBhcworICogQURDMzQ1IGNsb2NrCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9SQ0NfQURDMzQ1X0NPTkZJRyhfX0FEQzM0NV9DTEtTT1VSQ0VfXykgXAorICBNT0RJRllfUkVHKFJDQy0+Q0NJUFIsIFJDQ19DQ0lQUl9BREMzNDVTRUwsIF9fQURDMzQ1X0NMS1NPVVJDRV9fKQorCisvKiogQGJyaWVmICBNYWNybyB0byBnZXQgdGhlIEFEQzM0NSBjbG9jayBzb3VyY2UuCisgKiBAcmV0dmFsIFRoZSBjbG9jayBzb3VyY2UgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BREMzNDVDTEtTT1VSQ0VfTk9ORSAgICBObyBjbG9jayBzZWxlY3RlZCBhcyBBREMzNDUKKyAqIGNsb2NrCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQURDMzQ1Q0xLU09VUkNFX1BMTCAgICAgUExMIENsb2NrIHNlbGVjdGVkIGFzIEFEQzM0NQorICogY2xvY2sKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BREMzNDVDTEtTT1VSQ0VfU1lTQ0xLICBTeXN0ZW0gQ2xvY2sgc2VsZWN0ZWQgYXMKKyAqIEFEQzM0NSBjbG9jaworICovCisjZGVmaW5lIF9fSEFMX1JDQ19HRVRfQURDMzQ1X1NPVVJDRSgpIFwKKyAgKFJFQURfQklUKFJDQy0+Q0NJUFIsIFJDQ19DQ0lQUl9BREMzNDVTRUwpKQorI2VuZGlmIC8qIEFEQzM0NV9DT01NT04gKi8KKworI2lmIGRlZmluZWQoUVVBRFNQSSkKKworLyoqIEBicmllZiAgTWFjcm8gdG8gY29uZmlndXJlIHRoZSBRdWFkU1BJIGNsb2NrLgorICogQHBhcmFtICBfX1FTUElfQ0xLU09VUkNFX18gc3BlY2lmaWVzIHRoZSBRdWFkU1BJIGNsb2NrIHNvdXJjZS4KKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19RU1BJQ0xLU09VUkNFX1NZU0NMSyAgU3lzdGVtIENsb2NrIHNlbGVjdGVkIGFzCisgKiBRdWFkU1BJIGNsb2NrCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUVNQSUNMS1NPVVJDRV9IU0kgICAgIEhTSSBjbG9jayBzZWxlY3RlZCBhcyBRdWFkU1BJCisgKiBjbG9jaworICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1FTUElDTEtTT1VSQ0VfUExMICAgICBQTEwgUSBkaXZpZGVyIGNsb2NrIHNlbGVjdGVkCisgKiBhcyBRdWFkU1BJIGNsb2NrCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9SQ0NfUVNQSV9DT05GSUcoX19RU1BJX0NMS1NPVVJDRV9fKSBcCisgIE1PRElGWV9SRUcoUkNDLT5DQ0lQUjIsIFJDQ19DQ0lQUjJfUVNQSVNFTCwgX19RU1BJX0NMS1NPVVJDRV9fKQorCisvKiogQGJyaWVmICBNYWNybyB0byBnZXQgdGhlIFF1YWRTUEkgY2xvY2sgc291cmNlLgorICogQHJldHZhbCBUaGUgY2xvY2sgc291cmNlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUVNQSUNMS1NPVVJDRV9TWVNDTEsgIFN5c3RlbSBDbG9jayBzZWxlY3RlZCBhcworICogUXVhZFNQSSBjbG9jaworICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1FTUElDTEtTT1VSQ0VfSFNJICAgICBIU0kgY2xvY2sgc2VsZWN0ZWQgYXMgUXVhZFNQSQorICogY2xvY2sKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19RU1BJQ0xLU09VUkNFX1BMTCAgICAgUExMIFEgZGl2aWRlciBjbG9jayBzZWxlY3RlZAorICogYXMgUXVhZFNQSSBjbG9jaworICovCisjZGVmaW5lIF9fSEFMX1JDQ19HRVRfUVNQSV9TT1VSQ0UoKSAoUkVBRF9CSVQoUkNDLT5DQ0lQUjIsIFJDQ19DQ0lQUjJfUVNQSVNFTCkpCisKKyNlbmRpZiAvKiBRVUFEU1BJICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfRmxhZ3NfSW50ZXJydXB0c19NYW5hZ2VtZW50IEZsYWdzIEludGVycnVwdHMgTWFuYWdlbWVudAorICogQGJyaWVmIG1hY3JvcyB0byBtYW5hZ2UgdGhlIHNwZWNpZmllZCBSQ0MgRmxhZ3MgYW5kIGludGVycnVwdHMuCisgKiBAeworICovCisKKy8qKgorICogQGJyaWVmIEVuYWJsZSB0aGUgUkNDIExTRSBDU1MgRXh0ZW5kZWQgSW50ZXJydXB0IExpbmUuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9SQ0NfTFNFQ1NTX0VYVElfRU5BQkxFX0lUKCkgXAorICBTRVRfQklUKEVYVEktPklNUjEsIFJDQ19FWFRJX0xJTkVfTFNFQ1NTKQorCisvKioKKyAqIEBicmllZiBEaXNhYmxlIHRoZSBSQ0MgTFNFIENTUyBFeHRlbmRlZCBJbnRlcnJ1cHQgTGluZS4KKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX1JDQ19MU0VDU1NfRVhUSV9ESVNBQkxFX0lUKCkgXAorICBDTEVBUl9CSVQoRVhUSS0+SU1SMSwgUkNDX0VYVElfTElORV9MU0VDU1MpCisKKy8qKgorICogQGJyaWVmIEVuYWJsZSB0aGUgUkNDIExTRSBDU1MgRXZlbnQgTGluZS4KKyAqIEByZXR2YWwgTm9uZS4KKyAqLworI2RlZmluZSBfX0hBTF9SQ0NfTFNFQ1NTX0VYVElfRU5BQkxFX0VWRU5UKCkgXAorICBTRVRfQklUKEVYVEktPkVNUjEsIFJDQ19FWFRJX0xJTkVfTFNFQ1NTKQorCisvKioKKyAqIEBicmllZiBEaXNhYmxlIHRoZSBSQ0MgTFNFIENTUyBFdmVudCBMaW5lLgorICogQHJldHZhbCBOb25lLgorICovCisjZGVmaW5lIF9fSEFMX1JDQ19MU0VDU1NfRVhUSV9ESVNBQkxFX0VWRU5UKCkgXAorICBDTEVBUl9CSVQoRVhUSS0+RU1SMSwgUkNDX0VYVElfTElORV9MU0VDU1MpCisKKy8qKgorICogQGJyaWVmICBFbmFibGUgdGhlIFJDQyBMU0UgQ1NTIEV4dGVuZGVkIEludGVycnVwdCBGYWxsaW5nIFRyaWdnZXIuCisgKiBAcmV0dmFsIE5vbmUuCisgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0xTRUNTU19FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKSBcCisgIFNFVF9CSVQoRVhUSS0+RlRTUjEsIFJDQ19FWFRJX0xJTkVfTFNFQ1NTKQorCisvKioKKyAqIEBicmllZiBEaXNhYmxlIHRoZSBSQ0MgTFNFIENTUyBFeHRlbmRlZCBJbnRlcnJ1cHQgRmFsbGluZyBUcmlnZ2VyLgorICogQHJldHZhbCBOb25lLgorICovCisjZGVmaW5lIF9fSEFMX1JDQ19MU0VDU1NfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpIFwKKyAgQ0xFQVJfQklUKEVYVEktPkZUU1IxLCBSQ0NfRVhUSV9MSU5FX0xTRUNTUykKKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSB0aGUgUkNDIExTRSBDU1MgRXh0ZW5kZWQgSW50ZXJydXB0IFJpc2luZyBUcmlnZ2VyLgorICogQHJldHZhbCBOb25lLgorICovCisjZGVmaW5lIF9fSEFMX1JDQ19MU0VDU1NfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKSBcCisgIFNFVF9CSVQoRVhUSS0+UlRTUjEsIFJDQ19FWFRJX0xJTkVfTFNFQ1NTKQorCisvKioKKyAqIEBicmllZiBEaXNhYmxlIHRoZSBSQ0MgTFNFIENTUyBFeHRlbmRlZCBJbnRlcnJ1cHQgUmlzaW5nIFRyaWdnZXIuCisgKiBAcmV0dmFsIE5vbmUuCisgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0xTRUNTU19FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKSBcCisgIENMRUFSX0JJVChFWFRJLT5SVFNSMSwgUkNDX0VYVElfTElORV9MU0VDU1MpCisKKy8qKgorICogQGJyaWVmIEVuYWJsZSB0aGUgUkNDIExTRSBDU1MgRXh0ZW5kZWQgSW50ZXJydXB0IFJpc2luZyAmIEZhbGxpbmcgVHJpZ2dlci4KKyAqIEByZXR2YWwgTm9uZS4KKyAqLworI2RlZmluZSBfX0hBTF9SQ0NfTFNFQ1NTX0VYVElfRU5BQkxFX1JJU0lOR19GQUxMSU5HX0VER0UoKSBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX0hBTF9SQ0NfTFNFQ1NTX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCk7ICAgICAgICAgICAgXAorICAgIF9fSEFMX1JDQ19MU0VDU1NfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCk7ICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKy8qKgorICogQGJyaWVmIERpc2FibGUgdGhlIFJDQyBMU0UgQ1NTIEV4dGVuZGVkIEludGVycnVwdCBSaXNpbmcgJiBGYWxsaW5nIFRyaWdnZXIuCisgKiBAcmV0dmFsIE5vbmUuCisgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0xTRUNTU19FWFRJX0RJU0FCTEVfUklTSU5HX0ZBTExJTkdfRURHRSgpIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX0hBTF9SQ0NfTFNFQ1NTX0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpOyAgICAgICAgICAgIFwKKyAgICBfX0hBTF9SQ0NfTFNFQ1NTX0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKTsgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworLyoqCisgKiBAYnJpZWYgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIFJDQyBMU0UgQ1NTIEVYVEkgaW50ZXJydXB0IGZsYWcgaXMgc2V0IG9yCisgKiBub3QuCisgKiBAcmV0dmFsIEVYVEkgUkNDIExTRSBDU1MgTGluZSBTdGF0dXMuCisgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0xTRUNTU19FWFRJX0dFVF9GTEFHKCkgXAorICAoUkVBRF9CSVQoRVhUSS0+UFIxLCBSQ0NfRVhUSV9MSU5FX0xTRUNTUykgPT0gUkNDX0VYVElfTElORV9MU0VDU1MpCisKKy8qKgorICogQGJyaWVmIENsZWFyIHRoZSBSQ0MgTFNFIENTUyBFWFRJIGZsYWcuCisgKiBAcmV0dmFsIE5vbmUuCisgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0xTRUNTU19FWFRJX0NMRUFSX0ZMQUcoKSBcCisgIFdSSVRFX1JFRyhFWFRJLT5QUjEsIFJDQ19FWFRJX0xJTkVfTFNFQ1NTKQorCisvKioKKyAqIEBicmllZiBHZW5lcmF0ZSBhIFNvZnR3YXJlIGludGVycnVwdCBvbiB0aGUgUkNDIExTRSBDU1MgRVhUSSBsaW5lLgorICogQHJldHZhbCBOb25lLgorICovCisjZGVmaW5lIF9fSEFMX1JDQ19MU0VDU1NfRVhUSV9HRU5FUkFURV9TV0lUKCkgXAorICBTRVRfQklUKEVYVEktPlNXSUVSMSwgUkNDX0VYVElfTElORV9MU0VDU1MpCisKKy8qKgorICogQGJyaWVmICBFbmFibGUgdGhlIHNwZWNpZmllZCBDUlMgaW50ZXJydXB0cy4KKyAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIENSUyBpbnRlcnJ1cHQgc291cmNlcyB0byBiZSBlbmFibGVkLgorICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19JVF9TWU5DT0sgIFNZTkMgZXZlbnQgT0sgaW50ZXJydXB0CisgKiAgICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfSVRfU1lOQ1dBUk4gIFNZTkMgd2FybmluZyBpbnRlcnJ1cHQKKyAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19JVF9FUlIgIFN5bmNocm9uaXphdGlvbiBvciB0cmltbWluZyBlcnJvcgorICogaW50ZXJydXB0CisgKiAgICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfSVRfRVNZTkMgIEV4cGVjdGVkIFNZTkMgaW50ZXJydXB0CisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9SQ0NfQ1JTX0VOQUJMRV9JVChfX0lOVEVSUlVQVF9fKSBTRVRfQklUKENSUy0+Q1IsIChfX0lOVEVSUlVQVF9fKSkKKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgdGhlIHNwZWNpZmllZCBDUlMgaW50ZXJydXB0cy4KKyAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIENSUyBpbnRlcnJ1cHQgc291cmNlcyB0byBiZSBkaXNhYmxlZC4KKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfSVRfU1lOQ09LICBTWU5DIGV2ZW50IE9LIGludGVycnVwdAorICogICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQ1JTX0lUX1NZTkNXQVJOICBTWU5DIHdhcm5pbmcgaW50ZXJydXB0CisgKiAgICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfSVRfRVJSICBTeW5jaHJvbml6YXRpb24gb3IgdHJpbW1pbmcgZXJyb3IKKyAqIGludGVycnVwdAorICogICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQ1JTX0lUX0VTWU5DICBFeHBlY3RlZCBTWU5DIGludGVycnVwdAorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0NSU19ESVNBQkxFX0lUKF9fSU5URVJSVVBUX18pIFwKKyAgQ0xFQVJfQklUKENSUy0+Q1IsIChfX0lOVEVSUlVQVF9fKSkKKworLyoqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgQ1JTIGludGVycnVwdCBoYXMgb2NjdXJyZWQgb3Igbm90LgorICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgQ1JTIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suCisgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfSVRfU1lOQ09LICBTWU5DIGV2ZW50IE9LIGludGVycnVwdAorICogICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQ1JTX0lUX1NZTkNXQVJOICBTWU5DIHdhcm5pbmcgaW50ZXJydXB0CisgKiAgICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfSVRfRVJSICBTeW5jaHJvbml6YXRpb24gb3IgdHJpbW1pbmcgZXJyb3IKKyAqIGludGVycnVwdAorICogICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQ1JTX0lUX0VTWU5DICBFeHBlY3RlZCBTWU5DIGludGVycnVwdAorICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fSU5URVJSVVBUX18gKFNFVCBvciBSRVNFVCkuCisgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0NSU19HRVRfSVRfU09VUkNFKF9fSU5URVJSVVBUX18pIFwKKyAgKChSRUFEX0JJVChDUlMtPkNSLCAoX19JTlRFUlJVUFRfXykpICE9IDBVKSA/IFNFVCA6IFJFU0VUKQorCisvKiogQGJyaWVmICBDbGVhciB0aGUgQ1JTIGludGVycnVwdCBwZW5kaW5nIGJpdHMKKyAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIGludGVycnVwdCBwZW5kaW5nIGJpdCB0byBjbGVhci4KKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19JVF9TWU5DT0sgIFNZTkMgZXZlbnQgT0sgaW50ZXJydXB0CisgKiAgICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfSVRfU1lOQ1dBUk4gIFNZTkMgd2FybmluZyBpbnRlcnJ1cHQKKyAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19JVF9FUlIgIFN5bmNocm9uaXphdGlvbiBvciB0cmltbWluZyBlcnJvcgorICogaW50ZXJydXB0CisgKiAgICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfSVRfRVNZTkMgIEV4cGVjdGVkIFNZTkMgaW50ZXJydXB0CisgKiAgICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfSVRfVFJJTU9WRiAgVHJpbW1pbmcgb3ZlcmZsb3cgb3IgdW5kZXJmbG93CisgKiBpbnRlcnJ1cHQKKyAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19JVF9TWU5DRVJSICBTWU5DIGVycm9yIGludGVycnVwdAorICogICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQ1JTX0lUX1NZTkNNSVNTICBTWU5DIG1pc3NlZCBpbnRlcnJ1cHQKKyAqLworLyogQ1JTIElUIEVycm9yIE1hc2sgKi8KKyNkZWZpbmUgUkNDX0NSU19JVF9FUlJPUl9NQVNLIFwKKyAgKFJDQ19DUlNfSVRfVFJJTU9WRiB8IFJDQ19DUlNfSVRfU1lOQ0VSUiB8IFJDQ19DUlNfSVRfU1lOQ01JU1MpCisKKyNkZWZpbmUgX19IQUxfUkNDX0NSU19DTEVBUl9JVChfX0lOVEVSUlVQVF9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoKF9fSU5URVJSVVBUX18pICYgUkNDX0NSU19JVF9FUlJPUl9NQVNLKSAhPSAwVSkgeyAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFdSSVRFX1JFRyhDUlMtPklDUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQ1JTX0lDUl9FUlJDIHwgKChfX0lOVEVSUlVQVF9fKSAmIH5SQ0NfQ1JTX0lUX0VSUk9SX01BU0spKTsgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFdSSVRFX1JFRyhDUlMtPklDUiwgKF9fSU5URVJSVVBUX18pKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisvKioKKyAqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIENSUyBmbGFnIGlzIHNldCBvciBub3QuCisgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4KKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfRkxBR19TWU5DT0sgIFNZTkMgZXZlbnQgT0sKKyAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19GTEFHX1NZTkNXQVJOICBTWU5DIHdhcm5pbmcKKyAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19GTEFHX0VSUiAgRXJyb3IKKyAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19GTEFHX0VTWU5DICBFeHBlY3RlZCBTWU5DCisgKiAgICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfRkxBR19UUklNT1ZGICBUcmltbWluZyBvdmVyZmxvdyBvciB1bmRlcmZsb3cKKyAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19GTEFHX1NZTkNFUlIgIFNZTkMgZXJyb3IKKyAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19GTEFHX1NZTkNNSVNTICBTWU5DIG1pc3NlZAorICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9GTEFHXyAoVFJVRSBvciBGQUxTRSkuCisgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0NSU19HRVRfRkxBRyhfX0ZMQUdfXykgXAorICAoUkVBRF9CSVQoQ1JTLT5JU1IsIChfX0ZMQUdfXykpID09IChfX0ZMQUdfXykpCisKKy8qKgorICogQGJyaWVmICBDbGVhciB0aGUgQ1JTIHNwZWNpZmllZCBGTEFHLgorICogQHBhcmFtIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgZmxhZyB0byBjbGVhci4KKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfRkxBR19TWU5DT0sgIFNZTkMgZXZlbnQgT0sKKyAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19GTEFHX1NZTkNXQVJOICBTWU5DIHdhcm5pbmcKKyAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19GTEFHX0VSUiAgRXJyb3IKKyAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19GTEFHX0VTWU5DICBFeHBlY3RlZCBTWU5DCisgKiAgICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfRkxBR19UUklNT1ZGICBUcmltbWluZyBvdmVyZmxvdyBvciB1bmRlcmZsb3cKKyAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19GTEFHX1NZTkNFUlIgIFNZTkMgZXJyb3IKKyAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19GTEFHX1NZTkNNSVNTICBTWU5DIG1pc3NlZAorICogQG5vdGUgUkNDX0NSU19GTEFHX0VSUiBjbGVhcnMgUkNDX0NSU19GTEFHX1RSSU1PVkYsIFJDQ19DUlNfRkxBR19TWU5DRVJSLAorICogUkNDX0NSU19GTEFHX1NZTkNNSVNTIGFuZCBjb25zZXF1ZW50bHkgUkNDX0NSU19GTEFHX0VSUgorICogQHJldHZhbCBOb25lCisgKi8KKworLyogQ1JTIEZsYWcgRXJyb3IgTWFzayAqLworI2RlZmluZSBSQ0NfQ1JTX0ZMQUdfRVJST1JfTUFTSyBcCisgIChSQ0NfQ1JTX0ZMQUdfVFJJTU9WRiB8IFJDQ19DUlNfRkxBR19TWU5DRVJSIHwgUkNDX0NSU19GTEFHX1NZTkNNSVNTKQorCisjZGVmaW5lIF9fSEFMX1JDQ19DUlNfQ0xFQVJfRkxBRyhfX0ZMQUdfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKChfX0ZMQUdfXykgJiBSQ0NfQ1JTX0ZMQUdfRVJST1JfTUFTSykgIT0gMFUpIHsgICAgICAgICAgICAgICAgICBcCisgICAgICBXUklURV9SRUcoQ1JTLT5JQ1IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIENSU19JQ1JfRVJSQyB8ICgoX19GTEFHX18pICYgflJDQ19DUlNfRkxBR19FUlJPUl9NQVNLKSk7IFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBXUklURV9SRUcoQ1JTLT5JQ1IsIChfX0ZMQUdfXykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfQ1JTX0V4dGVuZGVkX0ZlYXR1cmVzIFJDQ0V4IENSUyBFeHRlbmRlZCBGZWF0dXJlcworICogQHsKKyAqLworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSB0aGUgb3NjaWxsYXRvciBjbG9jayBmb3IgZnJlcXVlbmN5IGVycm9yIGNvdW50ZXIuCisgKiBAbm90ZSAgIHdoZW4gdGhlIENFTiBiaXQgaXMgc2V0IHRoZSBDUlNfQ0ZHUiByZWdpc3RlciBiZWNvbWVzCisgKiB3cml0ZS1wcm90ZWN0ZWQuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9SQ0NfQ1JTX0ZSRVFfRVJST1JfQ09VTlRFUl9FTkFCTEUoKSBTRVRfQklUKENSUy0+Q1IsIENSU19DUl9DRU4pCisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIHRoZSBvc2NpbGxhdG9yIGNsb2NrIGZvciBmcmVxdWVuY3kgZXJyb3IgY291bnRlci4KKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX1JDQ19DUlNfRlJFUV9FUlJPUl9DT1VOVEVSX0RJU0FCTEUoKSBcCisgIENMRUFSX0JJVChDUlMtPkNSLCBDUlNfQ1JfQ0VOKQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIHRoZSBhdXRvbWF0aWMgaGFyZHdhcmUgYWRqdXN0bWVudCBvZiBUUklNIGJpdHMuCisgKiBAbm90ZSAgIFdoZW4gdGhlIEFVVE9UUklNRU4gYml0IGlzIHNldCB0aGUgQ1JTX0NGR1IgcmVnaXN0ZXIgYmVjb21lcworICogd3JpdGUtcHJvdGVjdGVkLgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0NSU19BVVRPTUFUSUNfQ0FMSUJfRU5BQkxFKCkgXAorICBTRVRfQklUKENSUy0+Q1IsIENSU19DUl9BVVRPVFJJTUVOKQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIG9yIGRpc2FibGUgdGhlIGF1dG9tYXRpYyBoYXJkd2FyZSBhZGp1c3RtZW50IG9mIFRSSU0gYml0cy4KKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX1JDQ19DUlNfQVVUT01BVElDX0NBTElCX0RJU0FCTEUoKSBcCisgIENMRUFSX0JJVChDUlMtPkNSLCBDUlNfQ1JfQVVUT1RSSU1FTikKKworLyoqCisgKiBAYnJpZWYgIE1hY3JvIHRvIGNhbGN1bGF0ZSByZWxvYWQgdmFsdWUgdG8gYmUgc2V0IGluIENSUyByZWdpc3RlciBhY2NvcmRpbmcKKyAqIHRvIHRhcmdldCBhbmQgc3luYyBmcmVxdWVuY2llcworICogQG5vdGUgICBUaGUgUkVMT0FEIHZhbHVlIHNob3VsZCBiZSBzZWxlY3RlZCBhY2NvcmRpbmcgdG8gdGhlIHJhdGlvIGJldHdlZW4KKyAqIHRoZSB0YXJnZXQgZnJlcXVlbmN5IGFuZCB0aGUgZnJlcXVlbmN5IG9mIHRoZSBzeW5jaHJvbml6YXRpb24gc291cmNlIGFmdGVyCisgKiBwcmVzY2FsaW5nLiBJdCBpcyB0aGVuIGRlY3JlYXNlZCBieSBvbmUgaW4gb3JkZXIgdG8gcmVhY2ggdGhlIGV4cGVjdGVkCisgKiBzeW5jaHJvbml6YXRpb24gb24gdGhlIHplcm8gdmFsdWUuIFRoZSBmb3JtdWxhIGlzIHRoZSBmb2xsb3dpbmc6IFJFTE9BRCA9CisgKiAoZlRBUkdFVCAvIGZTWU5DKSAtMQorICogQHBhcmFtICBfX0ZUQVJHRVRfXyBUYXJnZXQgZnJlcXVlbmN5ICh2YWx1ZSBpbiBIeikKKyAqIEBwYXJhbSAgX19GU1lOQ19fIFN5bmNocm9uaXphdGlvbiBzaWduYWwgZnJlcXVlbmN5ICh2YWx1ZSBpbiBIeikKKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX1JDQ19DUlNfUkVMT0FEVkFMVUVfQ0FMQ1VMQVRFKF9fRlRBUkdFVF9fLCBfX0ZTWU5DX18pIFwKKyAgKCgoX19GVEFSR0VUX18pIC8gKF9fRlNZTkNfXykpIC0gMVUpCisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBSQ0NFeF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAqIEB7CisgKi8KKworLyoqIEBhZGR0b2dyb3VwIFJDQ0V4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEKKyAqIEB7CisgKi8KKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JDQ0V4X1BlcmlwaENMS0NvbmZpZygKKyAgICBSQ0NfUGVyaXBoQ0xLSW5pdFR5cGVEZWYgKlBlcmlwaENsa0luaXQpOwordm9pZCBIQUxfUkNDRXhfR2V0UGVyaXBoQ0xLQ29uZmlnKFJDQ19QZXJpcGhDTEtJbml0VHlwZURlZiAqUGVyaXBoQ2xrSW5pdCk7Cit1aW50MzJfdCBIQUxfUkNDRXhfR2V0UGVyaXBoQ0xLRnJlcSh1aW50MzJfdCBQZXJpcGhDbGspOworCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBhZGR0b2dyb3VwIFJDQ0V4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIKKyAqIEB7CisgKi8KKwordm9pZCBIQUxfUkNDRXhfRW5hYmxlTFNFQ1NTKHZvaWQpOwordm9pZCBIQUxfUkNDRXhfRGlzYWJsZUxTRUNTUyh2b2lkKTsKK3ZvaWQgSEFMX1JDQ0V4X0VuYWJsZUxTRUNTU19JVCh2b2lkKTsKK3ZvaWQgSEFMX1JDQ0V4X0xTRUNTU19JUlFIYW5kbGVyKHZvaWQpOwordm9pZCBIQUxfUkNDRXhfTFNFQ1NTX0NhbGxiYWNrKHZvaWQpOwordm9pZCBIQUxfUkNDRXhfRW5hYmxlTFNDTyh1aW50MzJfdCBMU0NPU291cmNlKTsKK3ZvaWQgSEFMX1JDQ0V4X0Rpc2FibGVMU0NPKHZvaWQpOworCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBhZGR0b2dyb3VwIFJDQ0V4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMKKyAqIEB7CisgKi8KKwordm9pZCBIQUxfUkNDRXhfQ1JTQ29uZmlnKFJDQ19DUlNJbml0VHlwZURlZiAqcEluaXQpOwordm9pZCBIQUxfUkNDRXhfQ1JTU29mdHdhcmVTeW5jaHJvbml6YXRpb25HZW5lcmF0ZSh2b2lkKTsKK3ZvaWQgSEFMX1JDQ0V4X0NSU0dldFN5bmNocm9uaXphdGlvbkluZm8oCisgICAgUkNDX0NSU1N5bmNocm9JbmZvVHlwZURlZiAqcFN5bmNocm9JbmZvKTsKK3VpbnQzMl90IEhBTF9SQ0NFeF9DUlNXYWl0U3luY2hyb25pemF0aW9uKHVpbnQzMl90IFRpbWVvdXQpOwordm9pZCBIQUxfUkNDRXhfQ1JTX0lSUUhhbmRsZXIodm9pZCk7Cit2b2lkIEhBTF9SQ0NFeF9DUlNfU3luY09rQ2FsbGJhY2sodm9pZCk7Cit2b2lkIEhBTF9SQ0NFeF9DUlNfU3luY1dhcm5DYWxsYmFjayh2b2lkKTsKK3ZvaWQgSEFMX1JDQ0V4X0NSU19FeHBlY3RlZFN5bmNDYWxsYmFjayh2b2lkKTsKK3ZvaWQgSEFMX1JDQ0V4X0NSU19FcnJvckNhbGxiYWNrKHVpbnQzMl90IEVycm9yKTsKKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFJDQ0V4X1ByaXZhdGVfTWFjcm9zCisgKiBAeworICovCisKKyNkZWZpbmUgSVNfUkNDX0xTQ09TT1VSQ0UoX19TT1VSQ0VfXykgXAorICAoKChfX1NPVVJDRV9fKSA9PSBSQ0NfTFNDT1NPVVJDRV9MU0kpIHx8ICgoX19TT1VSQ0VfXykgPT0gUkNDX0xTQ09TT1VSQ0VfTFNFKSkKKworI2lmIGRlZmluZWQoU1RNMzJHNDc0eHgpIHx8IGRlZmluZWQoU1RNMzJHNDg0eHgpCisKKyNkZWZpbmUgSVNfUkNDX1BFUklQSENMT0NLKF9fU0VMRUNUSU9OX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19VU0FSVDEpID09IFJDQ19QRVJJUEhDTEtfVVNBUlQxKSB8fCAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19VU0FSVDIpID09IFJDQ19QRVJJUEhDTEtfVVNBUlQyKSB8fCAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19VU0FSVDMpID09IFJDQ19QRVJJUEhDTEtfVVNBUlQzKSB8fCAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19VQVJUNCkgPT0gUkNDX1BFUklQSENMS19VQVJUNCkgfHwgICAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19VQVJUNSkgPT0gUkNDX1BFUklQSENMS19VQVJUNSkgfHwgICAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19MUFVBUlQxKSA9PSBSQ0NfUEVSSVBIQ0xLX0xQVUFSVDEpIHx8IFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19JMkMxKSA9PSBSQ0NfUEVSSVBIQ0xLX0kyQzEpIHx8ICAgICAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19JMkMyKSA9PSBSQ0NfUEVSSVBIQ0xLX0kyQzIpIHx8ICAgICAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19JMkMzKSA9PSBSQ0NfUEVSSVBIQ0xLX0kyQzMpIHx8ICAgICAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19JMkM0KSA9PSBSQ0NfUEVSSVBIQ0xLX0kyQzQpIHx8ICAgICAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19MUFRJTTEpID09IFJDQ19QRVJJUEhDTEtfTFBUSU0xKSB8fCAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19TQUkxKSA9PSBSQ0NfUEVSSVBIQ0xLX1NBSTEpIHx8ICAgICAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19JMlMpID09IFJDQ19QRVJJUEhDTEtfSTJTKSB8fCAgICAgICAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19GRENBTikgPT0gUkNDX1BFUklQSENMS19GRENBTikgfHwgICAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19VU0IpID09IFJDQ19QRVJJUEhDTEtfVVNCKSB8fCAgICAgICAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19STkcpID09IFJDQ19QRVJJUEhDTEtfUk5HKSB8fCAgICAgICAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19BREMxMikgPT0gUkNDX1BFUklQSENMS19BREMxMikgfHwgICAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19BREMzNDUpID09IFJDQ19QRVJJUEhDTEtfQURDMzQ1KSB8fCAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19RU1BJKSA9PSBSQ0NfUEVSSVBIQ0xLX1FTUEkpIHx8ICAgICAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19SVEMpID09IFJDQ19QRVJJUEhDTEtfUlRDKSkKKyNlbGlmIGRlZmluZWQoU1RNMzJHNDkxeHgpIHx8IGRlZmluZWQoU1RNMzJHNEExeHgpCisKKyNkZWZpbmUgSVNfUkNDX1BFUklQSENMT0NLKF9fU0VMRUNUSU9OX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19VU0FSVDEpID09IFJDQ19QRVJJUEhDTEtfVVNBUlQxKSB8fCAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19VU0FSVDIpID09IFJDQ19QRVJJUEhDTEtfVVNBUlQyKSB8fCAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19VU0FSVDMpID09IFJDQ19QRVJJUEhDTEtfVVNBUlQzKSB8fCAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19VQVJUNCkgPT0gUkNDX1BFUklQSENMS19VQVJUNCkgfHwgICAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19VQVJUNSkgPT0gUkNDX1BFUklQSENMS19VQVJUNSkgfHwgICAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19MUFVBUlQxKSA9PSBSQ0NfUEVSSVBIQ0xLX0xQVUFSVDEpIHx8IFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19JMkMxKSA9PSBSQ0NfUEVSSVBIQ0xLX0kyQzEpIHx8ICAgICAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19JMkMyKSA9PSBSQ0NfUEVSSVBIQ0xLX0kyQzIpIHx8ICAgICAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19JMkMzKSA9PSBSQ0NfUEVSSVBIQ0xLX0kyQzMpIHx8ICAgICAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19MUFRJTTEpID09IFJDQ19QRVJJUEhDTEtfTFBUSU0xKSB8fCAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19TQUkxKSA9PSBSQ0NfUEVSSVBIQ0xLX1NBSTEpIHx8ICAgICAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19JMlMpID09IFJDQ19QRVJJUEhDTEtfSTJTKSB8fCAgICAgICAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19GRENBTikgPT0gUkNDX1BFUklQSENMS19GRENBTikgfHwgICAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19VU0IpID09IFJDQ19QRVJJUEhDTEtfVVNCKSB8fCAgICAgICAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19STkcpID09IFJDQ19QRVJJUEhDTEtfUk5HKSB8fCAgICAgICAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19BREMxMikgPT0gUkNDX1BFUklQSENMS19BREMxMikgfHwgICAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19BREMzNDUpID09IFJDQ19QRVJJUEhDTEtfQURDMzQ1KSB8fCAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19RU1BJKSA9PSBSQ0NfUEVSSVBIQ0xLX1FTUEkpIHx8ICAgICAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19SVEMpID09IFJDQ19QRVJJUEhDTEtfUlRDKSkKKyNlbGlmIGRlZmluZWQoU1RNMzJHNDczeHgpIHx8IGRlZmluZWQoU1RNMzJHNDgzeHgpCisKKyNkZWZpbmUgSVNfUkNDX1BFUklQSENMT0NLKF9fU0VMRUNUSU9OX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19VU0FSVDEpID09IFJDQ19QRVJJUEhDTEtfVVNBUlQxKSB8fCAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19VU0FSVDIpID09IFJDQ19QRVJJUEhDTEtfVVNBUlQyKSB8fCAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19VU0FSVDMpID09IFJDQ19QRVJJUEhDTEtfVVNBUlQzKSB8fCAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19VQVJUNCkgPT0gUkNDX1BFUklQSENMS19VQVJUNCkgfHwgICAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19VQVJUNSkgPT0gUkNDX1BFUklQSENMS19VQVJUNSkgfHwgICAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19MUFVBUlQxKSA9PSBSQ0NfUEVSSVBIQ0xLX0xQVUFSVDEpIHx8IFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19JMkMxKSA9PSBSQ0NfUEVSSVBIQ0xLX0kyQzEpIHx8ICAgICAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19JMkMyKSA9PSBSQ0NfUEVSSVBIQ0xLX0kyQzIpIHx8ICAgICAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19JMkMzKSA9PSBSQ0NfUEVSSVBIQ0xLX0kyQzMpIHx8ICAgICAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19JMkM0KSA9PSBSQ0NfUEVSSVBIQ0xLX0kyQzQpIHx8ICAgICAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19MUFRJTTEpID09IFJDQ19QRVJJUEhDTEtfTFBUSU0xKSB8fCAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19TQUkxKSA9PSBSQ0NfUEVSSVBIQ0xLX1NBSTEpIHx8ICAgICAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19JMlMpID09IFJDQ19QRVJJUEhDTEtfSTJTKSB8fCAgICAgICAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19GRENBTikgPT0gUkNDX1BFUklQSENMS19GRENBTikgfHwgICAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19VU0IpID09IFJDQ19QRVJJUEhDTEtfVVNCKSB8fCAgICAgICAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19STkcpID09IFJDQ19QRVJJUEhDTEtfUk5HKSB8fCAgICAgICAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19BREMxMikgPT0gUkNDX1BFUklQSENMS19BREMxMikgfHwgICAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19BREMzNDUpID09IFJDQ19QRVJJUEhDTEtfQURDMzQ1KSB8fCAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19RU1BJKSA9PSBSQ0NfUEVSSVBIQ0xLX1FTUEkpIHx8ICAgICAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19SVEMpID09IFJDQ19QRVJJUEhDTEtfUlRDKSkKKworI2VsaWYgZGVmaW5lZChTVE0zMkc0NzF4eCkKKworI2RlZmluZSBJU19SQ0NfUEVSSVBIQ0xPQ0soX19TRUxFQ1RJT05fXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX1VTQVJUMSkgPT0gUkNDX1BFUklQSENMS19VU0FSVDEpIHx8ICAgXAorICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX1VTQVJUMikgPT0gUkNDX1BFUklQSENMS19VU0FSVDIpIHx8ICAgXAorICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX1VTQVJUMykgPT0gUkNDX1BFUklQSENMS19VU0FSVDMpIHx8ICAgXAorICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX1VBUlQ0KSA9PSBSQ0NfUEVSSVBIQ0xLX1VBUlQ0KSB8fCAgICAgXAorICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX1VBUlQ1KSA9PSBSQ0NfUEVSSVBIQ0xLX1VBUlQ1KSB8fCAgICAgXAorICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0xQVUFSVDEpID09IFJDQ19QRVJJUEhDTEtfTFBVQVJUMSkgfHwgXAorICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0kyQzEpID09IFJDQ19QRVJJUEhDTEtfSTJDMSkgfHwgICAgICAgXAorICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0kyQzIpID09IFJDQ19QRVJJUEhDTEtfSTJDMikgfHwgICAgICAgXAorICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0kyQzMpID09IFJDQ19QRVJJUEhDTEtfSTJDMykgfHwgICAgICAgXAorICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0kyQzQpID09IFJDQ19QRVJJUEhDTEtfSTJDNCkgfHwgICAgICAgXAorICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0xQVElNMSkgPT0gUkNDX1BFUklQSENMS19MUFRJTTEpIHx8ICAgXAorICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX1NBSTEpID09IFJDQ19QRVJJUEhDTEtfU0FJMSkgfHwgICAgICAgXAorICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0kyUykgPT0gUkNDX1BFUklQSENMS19JMlMpIHx8ICAgICAgICAgXAorICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX1VTQikgPT0gUkNDX1BFUklQSENMS19VU0IpIHx8ICAgICAgICAgXAorICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX1JORykgPT0gUkNDX1BFUklQSENMS19STkcpIHx8ICAgICAgICAgXAorICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0FEQzEyKSA9PSBSQ0NfUEVSSVBIQ0xLX0FEQzEyKSB8fCAgICAgXAorICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX1JUQykgPT0gUkNDX1BFUklQSENMS19SVEMpKQorCisjZWxpZiBkZWZpbmVkKFNUTTMyRzQzMXh4KSB8fCBkZWZpbmVkKFNUTTMyRzQ0MXh4KQorI2RlZmluZSBJU19SQ0NfUEVSSVBIQ0xPQ0soX19TRUxFQ1RJT05fXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX1VTQVJUMSkgPT0gUkNDX1BFUklQSENMS19VU0FSVDEpIHx8ICAgXAorICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX1VTQVJUMikgPT0gUkNDX1BFUklQSENMS19VU0FSVDIpIHx8ICAgXAorICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX1VTQVJUMykgPT0gUkNDX1BFUklQSENMS19VU0FSVDMpIHx8ICAgXAorICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX1VBUlQ0KSA9PSBSQ0NfUEVSSVBIQ0xLX1VBUlQ0KSB8fCAgICAgXAorICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0xQVUFSVDEpID09IFJDQ19QRVJJUEhDTEtfTFBVQVJUMSkgfHwgXAorICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0kyQzEpID09IFJDQ19QRVJJUEhDTEtfSTJDMSkgfHwgICAgICAgXAorICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0kyQzIpID09IFJDQ19QRVJJUEhDTEtfSTJDMikgfHwgICAgICAgXAorICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0kyQzMpID09IFJDQ19QRVJJUEhDTEtfSTJDMykgfHwgICAgICAgXAorICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0xQVElNMSkgPT0gUkNDX1BFUklQSENMS19MUFRJTTEpIHx8ICAgXAorICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX1NBSTEpID09IFJDQ19QRVJJUEhDTEtfU0FJMSkgfHwgICAgICAgXAorICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0kyUykgPT0gUkNDX1BFUklQSENMS19JMlMpIHx8ICAgICAgICAgXAorICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0ZEQ0FOKSA9PSBSQ0NfUEVSSVBIQ0xLX0ZEQ0FOKSB8fCAgICAgXAorICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX1VTQikgPT0gUkNDX1BFUklQSENMS19VU0IpIHx8ICAgICAgICAgXAorICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX1JORykgPT0gUkNDX1BFUklQSENMS19STkcpIHx8ICAgICAgICAgXAorICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0FEQzEyKSA9PSBSQ0NfUEVSSVBIQ0xLX0FEQzEyKSB8fCAgICAgXAorICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX1JUQykgPT0gUkNDX1BFUklQSENMS19SVEMpKQorCisjZWxpZiBkZWZpbmVkKFNUTTMyRzQxMXhCKSB8fCBkZWZpbmVkKFNUTTMyRzQxMXhDKQorI2RlZmluZSBJU19SQ0NfUEVSSVBIQ0xPQ0soX19TRUxFQ1RJT05fXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX1VTQVJUMSkgPT0gUkNDX1BFUklQSENMS19VU0FSVDEpIHx8ICAgXAorICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX1VTQVJUMikgPT0gUkNDX1BFUklQSENMS19VU0FSVDIpIHx8ICAgXAorICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX1VBUlQ0KSA9PSBSQ0NfUEVSSVBIQ0xLX1VBUlQ0KSB8fCAgICAgXAorICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0xQVUFSVDEpID09IFJDQ19QRVJJUEhDTEtfTFBVQVJUMSkgfHwgXAorICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0kyQzEpID09IFJDQ19QRVJJUEhDTEtfSTJDMSkgfHwgICAgICAgXAorICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0kyQzIpID09IFJDQ19QRVJJUEhDTEtfSTJDMikgfHwgICAgICAgXAorICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0xQVElNMSkgPT0gUkNDX1BFUklQSENMS19MUFRJTTEpIHx8ICAgXAorICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0kyUykgPT0gUkNDX1BFUklQSENMS19JMlMpIHx8ICAgICAgICAgXAorICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0ZEQ0FOKSA9PSBSQ0NfUEVSSVBIQ0xLX0ZEQ0FOKSB8fCAgICAgXAorICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX1JORykgPT0gUkNDX1BFUklQSENMS19STkcpIHx8ICAgICAgICAgXAorICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0FEQzEyKSA9PSBSQ0NfUEVSSVBIQ0xLX0FEQzEyKSB8fCAgICAgXAorICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX1JUQykgPT0gUkNDX1BFUklQSENMS19SVEMpKQorI2VsaWYgZGVmaW5lZChTVE0zMkc0MTR4eCkKKyNkZWZpbmUgSVNfUkNDX1BFUklQSENMT0NLKF9fU0VMRUNUSU9OX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19VU0FSVDEpID09IFJDQ19QRVJJUEhDTEtfVVNBUlQxKSB8fCAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19VU0FSVDIpID09IFJDQ19QRVJJUEhDTEtfVVNBUlQyKSB8fCAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19VQVJUNCkgPT0gUkNDX1BFUklQSENMS19VQVJUNCkgfHwgICAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19VQVJUNSkgPT0gUkNDX1BFUklQSENMS19VQVJUNSkgfHwgICAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19MUFVBUlQxKSA9PSBSQ0NfUEVSSVBIQ0xLX0xQVUFSVDEpIHx8IFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19JMkMxKSA9PSBSQ0NfUEVSSVBIQ0xLX0kyQzEpIHx8ICAgICAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19JMkMyKSA9PSBSQ0NfUEVSSVBIQ0xLX0kyQzIpIHx8ICAgICAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19JMkMzKSA9PSBSQ0NfUEVSSVBIQ0xLX0kyQzMpIHx8ICAgICAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19MUFRJTTEpID09IFJDQ19QRVJJUEhDTEtfTFBUSU0xKSB8fCAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19JMlMpID09IFJDQ19QRVJJUEhDTEtfSTJTKSB8fCAgICAgICAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19GRENBTikgPT0gUkNDX1BFUklQSENMS19GRENBTikgfHwgICAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19STkcpID09IFJDQ19QRVJJUEhDTEtfUk5HKSB8fCAgICAgICAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19BREMxMikgPT0gUkNDX1BFUklQSENMS19BREMxMikgfHwgICAgIFwKKyAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19SVEMpID09IFJDQ19QRVJJUEhDTEtfUlRDKSkKKyNlbGlmIGRlZmluZWQoU1RNMzJHQksxQ0IpCisjZGVmaW5lIElTX1JDQ19QRVJJUEhDTE9DSyhfX1NFTEVDVElPTl9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfVVNBUlQxKSA9PSBSQ0NfUEVSSVBIQ0xLX1VTQVJUMSkgfHwgICBcCisgICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfVVNBUlQyKSA9PSBSQ0NfUEVSSVBIQ0xLX1VTQVJUMikgfHwgICBcCisgICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfVVNBUlQzKSA9PSBSQ0NfUEVSSVBIQ0xLX1VTQVJUMykgfHwgICBcCisgICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfTFBVQVJUMSkgPT0gUkNDX1BFUklQSENMS19MUFVBUlQxKSB8fCBcCisgICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfSTJDMSkgPT0gUkNDX1BFUklQSENMS19JMkMxKSB8fCAgICAgICBcCisgICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfSTJDMikgPT0gUkNDX1BFUklQSENMS19JMkMyKSB8fCAgICAgICBcCisgICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfSTJDMykgPT0gUkNDX1BFUklQSENMS19JMkMzKSB8fCAgICAgICBcCisgICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfTFBUSU0xKSA9PSBSQ0NfUEVSSVBIQ0xLX0xQVElNMSkgfHwgICBcCisgICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfU0FJMSkgPT0gUkNDX1BFUklQSENMS19TQUkxKSB8fCAgICAgICBcCisgICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfSTJTKSA9PSBSQ0NfUEVSSVBIQ0xLX0kyUykgfHwgICAgICAgICBcCisgICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfRkRDQU4pID09IFJDQ19QRVJJUEhDTEtfRkRDQU4pIHx8ICAgICBcCisgICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfVVNCKSA9PSBSQ0NfUEVSSVBIQ0xLX1VTQikgfHwgICAgICAgICBcCisgICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfUk5HKSA9PSBSQ0NfUEVSSVBIQ0xLX1JORykgfHwgICAgICAgICBcCisgICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfQURDMTIpID09IFJDQ19QRVJJUEhDTEtfQURDMTIpIHx8ICAgICBcCisgICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfUlRDKSA9PSBSQ0NfUEVSSVBIQ0xLX1JUQykpCisKKyNlbmRpZiAvKiBTVE0zMkc0NzR4eCB8fCBTVE0zMkc0ODR4eCAqLworCisjZGVmaW5lIElTX1JDQ19VU0FSVDFDTEtTT1VSQ0UoX19TT1VSQ0VfXykgICAgICAgICBcCisgICgoKF9fU09VUkNFX18pID09IFJDQ19VU0FSVDFDTEtTT1VSQ0VfUENMSzIpIHx8ICBcCisgICAoKF9fU09VUkNFX18pID09IFJDQ19VU0FSVDFDTEtTT1VSQ0VfU1lTQ0xLKSB8fCBcCisgICAoKF9fU09VUkNFX18pID09IFJDQ19VU0FSVDFDTEtTT1VSQ0VfTFNFKSB8fCAgICBcCisgICAoKF9fU09VUkNFX18pID09IFJDQ19VU0FSVDFDTEtTT1VSQ0VfSFNJKSkKKworI2RlZmluZSBJU19SQ0NfVVNBUlQyQ0xLU09VUkNFKF9fU09VUkNFX18pICAgICAgICAgXAorICAoKChfX1NPVVJDRV9fKSA9PSBSQ0NfVVNBUlQyQ0xLU09VUkNFX1BDTEsxKSB8fCAgXAorICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfVVNBUlQyQ0xLU09VUkNFX1NZU0NMSykgfHwgXAorICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfVVNBUlQyQ0xLU09VUkNFX0xTRSkgfHwgICAgXAorICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfVVNBUlQyQ0xLU09VUkNFX0hTSSkpCisKKyNkZWZpbmUgSVNfUkNDX1VTQVJUM0NMS1NPVVJDRShfX1NPVVJDRV9fKSAgICAgICAgIFwKKyAgKCgoX19TT1VSQ0VfXykgPT0gUkNDX1VTQVJUM0NMS1NPVVJDRV9QQ0xLMSkgfHwgIFwKKyAgICgoX19TT1VSQ0VfXykgPT0gUkNDX1VTQVJUM0NMS1NPVVJDRV9TWVNDTEspIHx8IFwKKyAgICgoX19TT1VSQ0VfXykgPT0gUkNDX1VTQVJUM0NMS1NPVVJDRV9MU0UpIHx8ICAgIFwKKyAgICgoX19TT1VSQ0VfXykgPT0gUkNDX1VTQVJUM0NMS1NPVVJDRV9IU0kpKQorCisjaWYgZGVmaW5lZChVQVJUNCkKKyNkZWZpbmUgSVNfUkNDX1VBUlQ0Q0xLU09VUkNFKF9fU09VUkNFX18pICAgICAgICAgXAorICAoKChfX1NPVVJDRV9fKSA9PSBSQ0NfVUFSVDRDTEtTT1VSQ0VfUENMSzEpIHx8ICBcCisgICAoKF9fU09VUkNFX18pID09IFJDQ19VQVJUNENMS1NPVVJDRV9TWVNDTEspIHx8IFwKKyAgICgoX19TT1VSQ0VfXykgPT0gUkNDX1VBUlQ0Q0xLU09VUkNFX0xTRSkgfHwgICAgXAorICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfVUFSVDRDTEtTT1VSQ0VfSFNJKSkKKyNlbmRpZiAvKiBVQVJUNCAqLworCisjaWYgZGVmaW5lZChVQVJUNSkKKyNkZWZpbmUgSVNfUkNDX1VBUlQ1Q0xLU09VUkNFKF9fU09VUkNFX18pICAgICAgICAgXAorICAoKChfX1NPVVJDRV9fKSA9PSBSQ0NfVUFSVDVDTEtTT1VSQ0VfUENMSzEpIHx8ICBcCisgICAoKF9fU09VUkNFX18pID09IFJDQ19VQVJUNUNMS1NPVVJDRV9TWVNDTEspIHx8IFwKKyAgICgoX19TT1VSQ0VfXykgPT0gUkNDX1VBUlQ1Q0xLU09VUkNFX0xTRSkgfHwgICAgXAorICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfVUFSVDVDTEtTT1VSQ0VfSFNJKSkKKworI2VuZGlmIC8qIFVBUlQ1ICovCisKKyNkZWZpbmUgSVNfUkNDX0xQVUFSVDFDTEtTT1VSQ0UoX19TT1VSQ0VfXykgICAgICAgICBcCisgICgoKF9fU09VUkNFX18pID09IFJDQ19MUFVBUlQxQ0xLU09VUkNFX1BDTEsxKSB8fCAgXAorICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfTFBVQVJUMUNMS1NPVVJDRV9TWVNDTEspIHx8IFwKKyAgICgoX19TT1VSQ0VfXykgPT0gUkNDX0xQVUFSVDFDTEtTT1VSQ0VfTFNFKSB8fCAgICBcCisgICAoKF9fU09VUkNFX18pID09IFJDQ19MUFVBUlQxQ0xLU09VUkNFX0hTSSkpCisKKyNkZWZpbmUgSVNfUkNDX0kyQzFDTEtTT1VSQ0UoX19TT1VSQ0VfXykgICAgICAgICBcCisgICgoKF9fU09VUkNFX18pID09IFJDQ19JMkMxQ0xLU09VUkNFX1BDTEsxKSB8fCAgXAorICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfSTJDMUNMS1NPVVJDRV9TWVNDTEspIHx8IFwKKyAgICgoX19TT1VSQ0VfXykgPT0gUkNDX0kyQzFDTEtTT1VSQ0VfSFNJKSkKKworI2RlZmluZSBJU19SQ0NfSTJDMkNMS1NPVVJDRShfX1NPVVJDRV9fKSAgICAgICAgIFwKKyAgKCgoX19TT1VSQ0VfXykgPT0gUkNDX0kyQzJDTEtTT1VSQ0VfUENMSzEpIHx8ICBcCisgICAoKF9fU09VUkNFX18pID09IFJDQ19JMkMyQ0xLU09VUkNFX1NZU0NMSykgfHwgXAorICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfSTJDMkNMS1NPVVJDRV9IU0kpKQorCisjZGVmaW5lIElTX1JDQ19JMkMzQ0xLU09VUkNFKF9fU09VUkNFX18pICAgICAgICAgXAorICAoKChfX1NPVVJDRV9fKSA9PSBSQ0NfSTJDM0NMS1NPVVJDRV9QQ0xLMSkgfHwgIFwKKyAgICgoX19TT1VSQ0VfXykgPT0gUkNDX0kyQzNDTEtTT1VSQ0VfU1lTQ0xLKSB8fCBcCisgICAoKF9fU09VUkNFX18pID09IFJDQ19JMkMzQ0xLU09VUkNFX0hTSSkpCisKKyNpZiBkZWZpbmVkKEkyQzQpCisKKyNkZWZpbmUgSVNfUkNDX0kyQzRDTEtTT1VSQ0UoX19TT1VSQ0VfXykgICAgICAgICBcCisgICgoKF9fU09VUkNFX18pID09IFJDQ19JMkM0Q0xLU09VUkNFX1BDTEsxKSB8fCAgXAorICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfSTJDNENMS1NPVVJDRV9TWVNDTEspIHx8IFwKKyAgICgoX19TT1VSQ0VfXykgPT0gUkNDX0kyQzRDTEtTT1VSQ0VfSFNJKSkKKworI2VuZGlmIC8qIEkyQzQgKi8KKworI2RlZmluZSBJU19SQ0NfTFBUSU0xQ0xLU09VUkNFKF9fU09VUkNFX18pICAgICAgICBcCisgICgoKF9fU09VUkNFX18pID09IFJDQ19MUFRJTTFDTEtTT1VSQ0VfUENMSzEpIHx8IFwKKyAgICgoX19TT1VSQ0VfXykgPT0gUkNDX0xQVElNMUNMS1NPVVJDRV9MU0kpIHx8ICAgXAorICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfTFBUSU0xQ0xLU09VUkNFX0hTSSkgfHwgICBcCisgICAoKF9fU09VUkNFX18pID09IFJDQ19MUFRJTTFDTEtTT1VSQ0VfTFNFKSkKKworI2lmIGRlZmluZWQoU0FJMSkKKyNkZWZpbmUgSVNfUkNDX1NBSTFDTEtTT1VSQ0UoX19TT1VSQ0VfXykgICAgICAgICBcCisgICgoKF9fU09VUkNFX18pID09IFJDQ19TQUkxQ0xLU09VUkNFX1NZU0NMSykgfHwgXAorICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfU0FJMUNMS1NPVVJDRV9QTEwpIHx8ICAgIFwKKyAgICgoX19TT1VSQ0VfXykgPT0gUkNDX1NBSTFDTEtTT1VSQ0VfRVhUKSB8fCAgICBcCisgICAoKF9fU09VUkNFX18pID09IFJDQ19TQUkxQ0xLU09VUkNFX0hTSSkpCisjZW5kaWYgLyogU0FJMSAqLworCisjZGVmaW5lIElTX1JDQ19JMlNDTEtTT1VSQ0UoX19TT1VSQ0VfXykgICAgICAgICBcCisgICgoKF9fU09VUkNFX18pID09IFJDQ19JMlNDTEtTT1VSQ0VfU1lTQ0xLKSB8fCBcCisgICAoKF9fU09VUkNFX18pID09IFJDQ19JMlNDTEtTT1VSQ0VfUExMKSB8fCAgICBcCisgICAoKF9fU09VUkNFX18pID09IFJDQ19JMlNDTEtTT1VSQ0VfRVhUKSB8fCAgICBcCisgICAoKF9fU09VUkNFX18pID09IFJDQ19JMlNDTEtTT1VSQ0VfSFNJKSkKKworI2lmIGRlZmluZWQoRkRDQU4xKQorI2RlZmluZSBJU19SQ0NfRkRDQU5DTEtTT1VSQ0UoX19TT1VSQ0VfXykgICAgICBcCisgICgoKF9fU09VUkNFX18pID09IFJDQ19GRENBTkNMS1NPVVJDRV9IU0UpIHx8IFwKKyAgICgoX19TT1VSQ0VfXykgPT0gUkNDX0ZEQ0FOQ0xLU09VUkNFX1BMTCkgfHwgXAorICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfRkRDQU5DTEtTT1VSQ0VfUENMSzEpKQorCisjZW5kaWYgLyogRkRDQU4xICovCisjZGVmaW5lIElTX1JDQ19STkdDTEtTT1VSQ0UoX19TT1VSQ0VfXykgICAgICAgIFwKKyAgKCgoX19TT1VSQ0VfXykgPT0gUkNDX1JOR0NMS1NPVVJDRV9IU0k0OCkgfHwgXAorICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfUk5HQ0xLU09VUkNFX1BMTCkpCisKKyNpZiBkZWZpbmVkKFVTQikKKyNkZWZpbmUgSVNfUkNDX1VTQkNMS1NPVVJDRShfX1NPVVJDRV9fKSAgICAgICAgXAorICAoKChfX1NPVVJDRV9fKSA9PSBSQ0NfVVNCQ0xLU09VUkNFX0hTSTQ4KSB8fCBcCisgICAoKF9fU09VUkNFX18pID09IFJDQ19VU0JDTEtTT1VSQ0VfUExMKSkKKworI2VuZGlmIC8qIFVTQiAqLworCisjZGVmaW5lIElTX1JDQ19BREMxMkNMS1NPVVJDRShfX1NPVVJDRV9fKSAgICAgICBcCisgICgoKF9fU09VUkNFX18pID09IFJDQ19BREMxMkNMS1NPVVJDRV9OT05FKSB8fCBcCisgICAoKF9fU09VUkNFX18pID09IFJDQ19BREMxMkNMS1NPVVJDRV9QTEwpIHx8ICBcCisgICAoKF9fU09VUkNFX18pID09IFJDQ19BREMxMkNMS1NPVVJDRV9TWVNDTEspKQorCisjaWYgZGVmaW5lZChBREMzNDVfQ09NTU9OKQorI2RlZmluZSBJU19SQ0NfQURDMzQ1Q0xLU09VUkNFKF9fU09VUkNFX18pICAgICAgIFwKKyAgKCgoX19TT1VSQ0VfXykgPT0gUkNDX0FEQzM0NUNMS1NPVVJDRV9OT05FKSB8fCBcCisgICAoKF9fU09VUkNFX18pID09IFJDQ19BREMzNDVDTEtTT1VSQ0VfUExMKSB8fCAgXAorICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfQURDMzQ1Q0xLU09VUkNFX1NZU0NMSykpCisjZW5kaWYgLyogQURDMzQ1X0NPTU1PTiAqLworCisjaWYgZGVmaW5lZChRVUFEU1BJKQorCisjZGVmaW5lIElTX1JDQ19RU1BJQ0xLU09VUkNFKF9fU09VUkNFX18pICAgICAgICAgXAorICAoKChfX1NPVVJDRV9fKSA9PSBSQ0NfUVNQSUNMS1NPVVJDRV9IU0kpIHx8ICAgIFwKKyAgICgoX19TT1VSQ0VfXykgPT0gUkNDX1FTUElDTEtTT1VSQ0VfU1lTQ0xLKSB8fCBcCisgICAoKF9fU09VUkNFX18pID09IFJDQ19RU1BJQ0xLU09VUkNFX1BMTCkpCisKKyNlbmRpZiAvKiBRVUFEU1BJICovCisKKyNkZWZpbmUgSVNfUkNDX0NSU19TWU5DX1NPVVJDRShfX1NPVVJDRV9fKSAgICAgICBcCisgICgoKF9fU09VUkNFX18pID09IFJDQ19DUlNfU1lOQ19TT1VSQ0VfR1BJTykgfHwgXAorICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfQ1JTX1NZTkNfU09VUkNFX0xTRSkgfHwgIFwKKyAgICgoX19TT1VSQ0VfXykgPT0gUkNDX0NSU19TWU5DX1NPVVJDRV9VU0IpKQorCisjZGVmaW5lIElTX1JDQ19DUlNfU1lOQ19ESVYoX19ESVZfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoX19ESVZfXykgPT0gUkNDX0NSU19TWU5DX0RJVjEpIHx8ICgoX19ESVZfXykgPT0gUkNDX0NSU19TWU5DX0RJVjIpIHx8ICAgXAorICAgKChfX0RJVl9fKSA9PSBSQ0NfQ1JTX1NZTkNfRElWNCkgfHwgKChfX0RJVl9fKSA9PSBSQ0NfQ1JTX1NZTkNfRElWOCkgfHwgICBcCisgICAoKF9fRElWX18pID09IFJDQ19DUlNfU1lOQ19ESVYxNikgfHwgKChfX0RJVl9fKSA9PSBSQ0NfQ1JTX1NZTkNfRElWMzIpIHx8IFwKKyAgICgoX19ESVZfXykgPT0gUkNDX0NSU19TWU5DX0RJVjY0KSB8fCAoKF9fRElWX18pID09IFJDQ19DUlNfU1lOQ19ESVYxMjgpKQorCisjZGVmaW5lIElTX1JDQ19DUlNfU1lOQ19QT0xBUklUWShfX1BPTEFSSVRZX18pICAgICAgICAgXAorICAoKChfX1BPTEFSSVRZX18pID09IFJDQ19DUlNfU1lOQ19QT0xBUklUWV9SSVNJTkcpIHx8IFwKKyAgICgoX19QT0xBUklUWV9fKSA9PSBSQ0NfQ1JTX1NZTkNfUE9MQVJJVFlfRkFMTElORykpCisKKyNkZWZpbmUgSVNfUkNDX0NSU19SRUxPQURWQUxVRShfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPD0gMHhGRkZGVSkpCisKKyNkZWZpbmUgSVNfUkNDX0NSU19FUlJPUkxJTUlUKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA8PSAweEZGVSkpCisKKyNkZWZpbmUgSVNfUkNDX0NSU19IU0k0OENBTElCUkFUSU9OKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA8PSAweDNGVSkpCisKKyNkZWZpbmUgSVNfUkNDX0NSU19GUkVRRVJST1JESVIoX19ESVJfXykgICAgIFwKKyAgKCgoX19ESVJfXykgPT0gUkNDX0NSU19GUkVRRVJST1JESVJfVVApIHx8IFwKKyAgICgoX19ESVJfXykgPT0gUkNDX0NSU19GUkVRRVJST1JESVJfRE9XTikpCisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMkc0eHhfSEFMX1JDQ19FWF9IICovCmRpZmYgLS1naXQgYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9oYWxfc3BpLmggYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9oYWxfc3BpLmgKaW5kZXggNTgzNDk0OC4uMDUwNjA5MSAxMDA2NDQKLS0tIGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfaGFsX3NwaS5oCisrKyBiL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9JbmMvc3RtMzJnNHh4X2hhbF9zcGkuaApAQCAtMSw5NDcgKzEsOTQ5IEBACi0vKioNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQGZpbGUgICAgc3RtMzJnNHh4X2hhbF9zcGkuaA0KLSAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtDQotICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgU1BJIEhBTCBtb2R1bGUuDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEBhdHRlbnRpb24NCi0gKg0KLSAqIENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4NCi0gKg0KLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGVybXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZQ0KLSAqIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4NCi0gKiBJZiBubyBMSUNFTlNFIGZpbGUgY29tZXMgd2l0aCB0aGlzIHNvZnR3YXJlLCBpdCBpcyBwcm92aWRlZCBBUy1JUy4NCi0gKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKi8NCi0NCi0vKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpZm5kZWYgU1RNMzJHNHh4X0hBTF9TUElfSA0KLSNkZWZpbmUgU1RNMzJHNHh4X0hBTF9TUElfSA0KLQ0KLSNpZmRlZiBfX2NwbHVzcGx1cw0KLWV4dGVybiAiQyIgew0KLSNlbmRpZg0KLQ0KLS8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotI2luY2x1ZGUgInN0bTMyZzR4eF9oYWxfZGVmLmgiDQotDQotLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzR4eF9IQUxfRHJpdmVyDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGFkZHRvZ3JvdXAgU1BJDQotICogQHsNCi0gKi8NCi0NCi0vKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgU1BJX0V4cG9ydGVkX1R5cGVzIFNQSSBFeHBvcnRlZCBUeXBlcw0KLSAqIEB7DQotICovDQotDQotLyoqDQotICogQGJyaWVmICBTUEkgQ29uZmlndXJhdGlvbiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbg0KLSAqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gIHVpbnQzMl90IE1vZGU7IC8qITwgU3BlY2lmaWVzIHRoZSBTUEkgb3BlcmF0aW5nIG1vZGUuDQotICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU1BJX01vZGUgKi8NCi0NCi0gIHVpbnQzMl90DQotICAgICAgRGlyZWN0aW9uOyAvKiE8IFNwZWNpZmllcyB0aGUgU1BJIGJpZGlyZWN0aW9uYWwgbW9kZSBzdGF0ZS4NCi0gICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfRGlyZWN0aW9uICovDQotDQotICB1aW50MzJfdCBEYXRhU2l6ZTsgLyohPCBTcGVjaWZpZXMgdGhlIFNQSSBkYXRhIHNpemUuDQotICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9EYXRhX1NpemUgKi8NCi0NCi0gIHVpbnQzMl90IENMS1BvbGFyaXR5OyAvKiE8IFNwZWNpZmllcyB0aGUgc2VyaWFsIGNsb2NrIHN0ZWFkeSBzdGF0ZS4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBTUElfQ2xvY2tfUG9sYXJpdHkgKi8NCi0NCi0gIHVpbnQzMl90DQotICAgICAgQ0xLUGhhc2U7IC8qITwgU3BlY2lmaWVzIHRoZSBjbG9jayBhY3RpdmUgZWRnZSBmb3IgdGhlIGJpdCBjYXB0dXJlLg0KLSAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU1BJX0Nsb2NrX1BoYXNlICovDQotDQotICB1aW50MzJfdCBOU1M7IC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIE5TUyBzaWduYWwgaXMgbWFuYWdlZCBieQ0KLSAgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlIChOU1MgcGluKSBvciBieSBzb2Z0d2FyZSB1c2luZyB0aGUgU1NJIGJpdC4NCi0gICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmDQotICAgICAgICAgICAgICAgICAgIFNQSV9TbGF2ZV9TZWxlY3RfbWFuYWdlbWVudCAqLw0KLQ0KLSAgdWludDMyX3QgQmF1ZFJhdGVQcmVzY2FsZXI7IC8qITwgU3BlY2lmaWVzIHRoZSBCYXVkIFJhdGUgcHJlc2NhbGVyIHZhbHVlIHdoaWNoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgdHJhbnNtaXQgYW5kDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZSBTQ0sgY2xvY2suIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgb2YgQHJlZiBTUElfQmF1ZFJhdGVfUHJlc2NhbGVyDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBUaGUgY29tbXVuaWNhdGlvbiBjbG9jayBpcyBkZXJpdmVkIGZyb20NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWFzdGVyIGNsb2NrLiBUaGUgc2xhdmUgY2xvY2sgZG9lcyBub3QgbmVlZA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHNldC4gKi8NCi0NCi0gIHVpbnQzMl90IEZpcnN0Qml0OyAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIGRhdGEgdHJhbnNmZXJzIHN0YXJ0IGZyb20gTVNCIG9yIExTQg0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJpdC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgIFNQSV9NU0JfTFNCX3RyYW5zbWlzc2lvbiAqLw0KLQ0KLSAgdWludDMyX3QgVElNb2RlOyAvKiE8IFNwZWNpZmllcyBpZiB0aGUgVEkgbW9kZSBpcyBlbmFibGVkIG9yIG5vdC4NCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9USV9tb2RlICovDQotDQotICB1aW50MzJfdCBDUkNDYWxjdWxhdGlvbjsgLyohPCBTcGVjaWZpZXMgaWYgdGhlIENSQyBjYWxjdWxhdGlvbiBpcyBlbmFibGVkIG9yDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90LiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BJX0NSQ19DYWxjdWxhdGlvbiAqLw0KLQ0KLSAgdWludDMyX3QgQ1JDUG9seW5vbWlhbDsgLyohPCBTcGVjaWZpZXMgdGhlIHBvbHlub21pYWwgdXNlZCBmb3IgdGhlIENSQw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsY3VsYXRpb24uIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYW4gb2RkIG51bWJlcg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmV0d2VlbiBNaW5fRGF0YSA9IDEgYW5kIE1heF9EYXRhID0gNjU1MzUgKi8NCi0NCi0gIHVpbnQzMl90IENSQ0xlbmd0aDsgLyohPCBTcGVjaWZpZXMgdGhlIENSQyBMZW5ndGggdXNlZCBmb3IgdGhlIENSQw0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjYWxjdWxhdGlvbi4gQ1JDIExlbmd0aCBpcyBvbmx5IHVzZWQgd2l0aCBEYXRhOCBhbmQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgRGF0YTE2LCBub3Qgb3RoZXIgZGF0YSBzaXplIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhDQotICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIG9mIEByZWYgU1BJX0NSQ19sZW5ndGggKi8NCi0NCi0gIHVpbnQzMl90DQotICAgICAgTlNTUE1vZGU7IC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIE5TU1Agc2lnbmFsIGlzIGVuYWJsZWQgb3Igbm90IC4NCi0gICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9OU1NQX01vZGUNCi0gICAgICAgICAgICAgICAgICAgICBUaGlzIG1vZGUgaXMgYWN0aXZhdGVkIGJ5IHRoZSBOU1NQIGJpdCBpbiB0aGUgU1BJeF9DUjINCi0gICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgYW5kIGl0IHRha2VzIGVmZmVjdCBvbmx5IGlmIHRoZSBTUEkgaW50ZXJmYWNlIGlzDQotICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZWQgYXMgTW90b3JvbGEgU1BJIG1hc3RlciAoRlJGPTApIHdpdGggY2FwdHVyZSBvbiB0aGUNCi0gICAgICAgICAgICAgICAgICAgZmlyc3QgZWRnZSAoU1BJeF9DUjEgQ1BIQSA9IDAsIENQT0wgc2V0dGluZyBpcyBpZ25vcmVkKS4uICovDQotfSBTUElfSW5pdFR5cGVEZWY7DQotDQotLyoqDQotICogQGJyaWVmICBIQUwgU1BJIFN0YXRlIHN0cnVjdHVyZSBkZWZpbml0aW9uDQotICovDQotdHlwZWRlZiBlbnVtIHsNCi0gIEhBTF9TUElfU1RBVEVfUkVTRVQgPSAweDAwVSwgLyohPCBQZXJpcGhlcmFsIG5vdCBJbml0aWFsaXplZCAqLw0KLSAgSEFMX1NQSV9TVEFURV9SRUFEWSA9IDB4MDFVLCAvKiE8IFBlcmlwaGVyYWwgSW5pdGlhbGl6ZWQgYW5kIHJlYWR5IGZvciB1c2UgKi8NCi0gIEhBTF9TUElfU1RBVEVfQlVTWSA9IDB4MDJVLCAgLyohPCBhbiBpbnRlcm5hbCBwcm9jZXNzIGlzIG9uZ29pbmcgICovDQotICBIQUxfU1BJX1NUQVRFX0JVU1lfVFggPSAweDAzVSwgLyohPCBEYXRhIFRyYW5zbWlzc2lvbiBwcm9jZXNzIGlzIG9uZ29pbmcgKi8NCi0gIEhBTF9TUElfU1RBVEVfQlVTWV9SWCA9IDB4MDRVLCAvKiE8IERhdGEgUmVjZXB0aW9uIHByb2Nlc3MgaXMgb25nb2luZyAqLw0KLSAgSEFMX1NQSV9TVEFURV9CVVNZX1RYX1JYID0NCi0gICAgICAweDA1VSwgLyohPCBEYXRhIFRyYW5zbWlzc2lvbiBhbmQgUmVjZXB0aW9uIHByb2Nlc3MgaXMgb25nb2luZyAqLw0KLSAgSEFMX1NQSV9TVEFURV9FUlJPUiA9IDB4MDZVLCAvKiE8IFNQSSBlcnJvciBzdGF0ZSAqLw0KLSAgSEFMX1NQSV9TVEFURV9BQk9SVCA9IDB4MDdVICAvKiE8IFNQSSBhYm9ydCBpcyBvbmdvaW5nICAqLw0KLX0gSEFMX1NQSV9TdGF0ZVR5cGVEZWY7DQotDQotLyoqDQotICogQGJyaWVmICBTUEkgaGFuZGxlIFN0cnVjdHVyZSBkZWZpbml0aW9uDQotICovDQotdHlwZWRlZiBzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiB7DQotICBTUElfVHlwZURlZiAqSW5zdGFuY2U7IC8qITwgU1BJIHJlZ2lzdGVycyBiYXNlIGFkZHJlc3MgICAgICAgICAgICAgICAqLw0KLQ0KLSAgU1BJX0luaXRUeXBlRGVmIEluaXQ7IC8qITwgU1BJIGNvbW11bmljYXRpb24gcGFyYW1ldGVycyAgICAgICAgICAgICAqLw0KLQ0KLSAgdWludDhfdCAqcFR4QnVmZlB0cjsgLyohPCBQb2ludGVyIHRvIFNQSSBUeCB0cmFuc2ZlciBCdWZmZXIgICAgICAgICovDQotDQotICB1aW50MTZfdCBUeFhmZXJTaXplOyAvKiE8IFNQSSBUeCBUcmFuc2ZlciBzaXplICAgICAgICAgICAgICAgICAgICAgKi8NCi0NCi0gIF9fSU8gdWludDE2X3QgVHhYZmVyQ291bnQ7IC8qITwgU1BJIFR4IFRyYW5zZmVyIENvdW50ZXIgICAgICAgICAgICAgICAgICAqLw0KLQ0KLSAgdWludDhfdCAqcFJ4QnVmZlB0cjsgLyohPCBQb2ludGVyIHRvIFNQSSBSeCB0cmFuc2ZlciBCdWZmZXIgICAgICAgICovDQotDQotICB1aW50MTZfdCBSeFhmZXJTaXplOyAvKiE8IFNQSSBSeCBUcmFuc2ZlciBzaXplICAgICAgICAgICAgICAgICAgICAgKi8NCi0NCi0gIF9fSU8gdWludDE2X3QgUnhYZmVyQ291bnQ7IC8qITwgU1BJIFJ4IFRyYW5zZmVyIENvdW50ZXIgICAgICAgICAgICAgICAgICAqLw0KLQ0KLSAgdWludDMyX3QgQ1JDU2l6ZTsgLyohPCBTUEkgQ1JDIHNpemUgdXNlZCBmb3IgdGhlIHRyYW5zZmVyICAgICAgICovDQotDQotICB2b2lkICgqUnhJU1IpKA0KLSAgICAgIHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsgLyohPCBmdW5jdGlvbiBwb2ludGVyIG9uIFJ4IElTUiAqLw0KLQ0KLSAgdm9pZCAoKlR4SVNSKSgNCi0gICAgICBzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7IC8qITwgZnVuY3Rpb24gcG9pbnRlciBvbiBUeCBJU1IgKi8NCi0NCi0gIERNQV9IYW5kbGVUeXBlRGVmICpoZG1hdHg7IC8qITwgU1BJIFR4IERNQSBIYW5kbGUgcGFyYW1ldGVycyAgICAgICAgICAgICAqLw0KLQ0KLSAgRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWFyeDsgLyohPCBTUEkgUnggRE1BIEhhbmRsZSBwYXJhbWV0ZXJzICAgICAgICAgICAgICovDQotDQotICBIQUxfTG9ja1R5cGVEZWYgTG9jazsgLyohPCBMb2NraW5nIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotDQotICBfX0lPIEhBTF9TUElfU3RhdGVUeXBlRGVmIFN0YXRlOyAvKiE8IFNQSSBjb21tdW5pY2F0aW9uIHN0YXRlICovDQotDQotICBfX0lPIHVpbnQzMl90IEVycm9yQ29kZTsgLyohPCBTUEkgRXJyb3IgY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotDQotI2lmIChVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpDQotICB2b2lkICgqVHhDcGx0Q2FsbGJhY2spKA0KLSAgICAgIHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsgLyohPCBTUEkgVHggQ29tcGxldGVkIGNhbGxiYWNrICovDQotICB2b2lkICgqUnhDcGx0Q2FsbGJhY2spKA0KLSAgICAgIHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsgLyohPCBTUEkgUnggQ29tcGxldGVkIGNhbGxiYWNrICovDQotICB2b2lkICgqVHhSeENwbHRDYWxsYmFjaykoDQotICAgICAgc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOyAvKiE8IFNQSSBUeFJ4IENvbXBsZXRlZCBjYWxsYmFjayAqLw0KLSAgdm9pZCAoKlR4SGFsZkNwbHRDYWxsYmFjaykoDQotICAgICAgc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOyAvKiE8IFNQSSBUeCBIYWxmIENvbXBsZXRlZCBjYWxsYmFjayAqLw0KLSAgdm9pZCAoKlJ4SGFsZkNwbHRDYWxsYmFjaykoDQotICAgICAgc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOyAvKiE8IFNQSSBSeCBIYWxmIENvbXBsZXRlZCBjYWxsYmFjayAqLw0KLSAgdm9pZCAoKlR4UnhIYWxmQ3BsdENhbGxiYWNrKSgNCi0gICAgICBzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZg0KLSAgICAgICAgICAqaHNwaSk7IC8qITwgU1BJIFR4UnggSGFsZiBDb21wbGV0ZWQgY2FsbGJhY2sgICAqLw0KLSAgdm9pZCAoKkVycm9yQ2FsbGJhY2spKA0KLSAgICAgIHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsgLyohPCBTUEkgRXJyb3IgY2FsbGJhY2sgKi8NCi0gIHZvaWQgKCpBYm9ydENwbHRDYWxsYmFjaykoDQotICAgICAgc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOyAvKiE8IFNQSSBBYm9ydCBjYWxsYmFjayAqLw0KLSAgdm9pZCAoKk1zcEluaXRDYWxsYmFjaykoDQotICAgICAgc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOyAvKiE8IFNQSSBNc3AgSW5pdCBjYWxsYmFjayAqLw0KLSAgdm9pZCAoKk1zcERlSW5pdENhbGxiYWNrKSgNCi0gICAgICBzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7IC8qITwgU1BJIE1zcCBEZUluaXQgY2FsbGJhY2sgKi8NCi0NCi0jZW5kaWYgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotfSBTUElfSGFuZGxlVHlwZURlZjsNCi0NCi0jaWYgKFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkNCi0vKioNCi0gKiBAYnJpZWYgIEhBTCBTUEkgQ2FsbGJhY2sgSUQgZW51bWVyYXRpb24gZGVmaW5pdGlvbg0KLSAqLw0KLXR5cGVkZWYgZW51bSB7DQotICBIQUxfU1BJX1RYX0NPTVBMRVRFX0NCX0lEID0gMHgwMFUsICAgIC8qITwgU1BJIFR4IENvbXBsZXRlZCBjYWxsYmFjayBJRCAgICAqLw0KLSAgSEFMX1NQSV9SWF9DT01QTEVURV9DQl9JRCA9IDB4MDFVLCAgICAvKiE8IFNQSSBSeCBDb21wbGV0ZWQgY2FsbGJhY2sgSUQgICAgKi8NCi0gIEhBTF9TUElfVFhfUlhfQ09NUExFVEVfQ0JfSUQgPSAweDAyVSwgLyohPCBTUEkgVHhSeCBDb21wbGV0ZWQgY2FsbGJhY2sgSUQgKi8NCi0gIEhBTF9TUElfVFhfSEFMRl9DT01QTEVURV9DQl9JRCA9DQotICAgICAgMHgwM1UsIC8qITwgU1BJIFR4IEhhbGYgQ29tcGxldGVkIGNhbGxiYWNrIElEICAgICovDQotICBIQUxfU1BJX1JYX0hBTEZfQ09NUExFVEVfQ0JfSUQgPQ0KLSAgICAgIDB4MDRVLCAvKiE8IFNQSSBSeCBIYWxmIENvbXBsZXRlZCBjYWxsYmFjayBJRCAgICAqLw0KLSAgSEFMX1NQSV9UWF9SWF9IQUxGX0NPTVBMRVRFX0NCX0lEID0NCi0gICAgICAweDA1VSwgICAgICAgICAgICAgICAgICAgICAgLyohPCBTUEkgVHhSeCBIYWxmIENvbXBsZXRlZCBjYWxsYmFjayBJRCAgKi8NCi0gIEhBTF9TUElfRVJST1JfQ0JfSUQgPSAweDA2VSwgICAgLyohPCBTUEkgRXJyb3IgY2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgKi8NCi0gIEhBTF9TUElfQUJPUlRfQ0JfSUQgPSAweDA3VSwgICAgLyohPCBTUEkgQWJvcnQgY2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgKi8NCi0gIEhBTF9TUElfTVNQSU5JVF9DQl9JRCA9IDB4MDhVLCAgLyohPCBTUEkgTXNwIEluaXQgY2FsbGJhY2sgSUQgICAgICAgICAgICAgKi8NCi0gIEhBTF9TUElfTVNQREVJTklUX0NCX0lEID0gMHgwOVUgLyohPCBTUEkgTXNwIERlSW5pdCBjYWxsYmFjayBJRCAgICAgICAgICAgKi8NCi0NCi19IEhBTF9TUElfQ2FsbGJhY2tJRFR5cGVEZWY7DQotDQotLyoqDQotICogQGJyaWVmICBIQUwgU1BJIENhbGxiYWNrIHBvaW50ZXIgZGVmaW5pdGlvbg0KLSAqLw0KLXR5cGVkZWYgdm9pZCAoKnBTUElfQ2FsbGJhY2tUeXBlRGVmKSgNCi0gICAgU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOyAvKiE8IHBvaW50ZXIgdG8gYW4gU1BJIGNhbGxiYWNrIGZ1bmN0aW9uICovDQotDQotI2VuZGlmIC8qIFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGRlZmdyb3VwIFNQSV9FeHBvcnRlZF9Db25zdGFudHMgU1BJIEV4cG9ydGVkIENvbnN0YW50cw0KLSAqIEB7DQotICovDQotDQotLyoqIEBkZWZncm91cCBTUElfRXJyb3JfQ29kZSBTUEkgRXJyb3IgQ29kZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBIQUxfU1BJX0VSUk9SX05PTkUgXA0KLSAgKDB4MDAwMDAwMDBVKSAvKiE8IE5vIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBIQUxfU1BJX0VSUk9SX01PREYgXA0KLSAgKDB4MDAwMDAwMDFVKSAvKiE8IE1PREYgZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBIQUxfU1BJX0VSUk9SX0NSQyBcDQotICAoMHgwMDAwMDAwMlUpIC8qITwgQ1JDIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIEhBTF9TUElfRVJST1JfT1ZSIFwNCi0gICgweDAwMDAwMDA0VSkgLyohPCBPVlIgZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgSEFMX1NQSV9FUlJPUl9GUkUgXA0KLSAgKDB4MDAwMDAwMDhVKSAvKiE8IEZSRSBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBIQUxfU1BJX0VSUk9SX0RNQSBcDQotICAoMHgwMDAwMDAxMFUpIC8qITwgRE1BIHRyYW5zZmVyIGVycm9yICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIEhBTF9TUElfRVJST1JfRkxBRyBcDQotICAoMHgwMDAwMDAyMFUpIC8qITwgRXJyb3Igb24gUlhORS9UWEUvQlNZL0ZUTFZML0ZSTFZMIEZsYWcgKi8NCi0jZGVmaW5lIEhBTF9TUElfRVJST1JfQUJPUlQgXA0KLSAgKDB4MDAwMDAwNDBVKSAvKiE8IEVycm9yIGR1cmluZyBTUEkgQWJvcnQgcHJvY2VkdXJlICAgICAgICovDQotI2lmIChVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpDQotI2RlZmluZSBIQUxfU1BJX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0sgXA0KLSAgKDB4MDAwMDAwODBVKSAvKiE8IEludmFsaWQgQ2FsbGJhY2sgZXJyb3IgICAgICAgICAgICAgICAgICovDQotI2VuZGlmICAgICAgICAgIC8qIFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBTUElfTW9kZSBTUEkgTW9kZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBTUElfTU9ERV9TTEFWRSAoMHgwMDAwMDAwMFUpDQotI2RlZmluZSBTUElfTU9ERV9NQVNURVIgKFNQSV9DUjFfTVNUUiB8IFNQSV9DUjFfU1NJKQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBTUElfRGlyZWN0aW9uIFNQSSBEaXJlY3Rpb24gTW9kZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBTUElfRElSRUNUSU9OXzJMSU5FUyAoMHgwMDAwMDAwMFUpDQotI2RlZmluZSBTUElfRElSRUNUSU9OXzJMSU5FU19SWE9OTFkgU1BJX0NSMV9SWE9OTFkNCi0jZGVmaW5lIFNQSV9ESVJFQ1RJT05fMUxJTkUgU1BJX0NSMV9CSURJTU9ERQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBTUElfRGF0YV9TaXplIFNQSSBEYXRhIFNpemUNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgU1BJX0RBVEFTSVpFXzRCSVQgKDB4MDAwMDAzMDBVKQ0KLSNkZWZpbmUgU1BJX0RBVEFTSVpFXzVCSVQgKDB4MDAwMDA0MDBVKQ0KLSNkZWZpbmUgU1BJX0RBVEFTSVpFXzZCSVQgKDB4MDAwMDA1MDBVKQ0KLSNkZWZpbmUgU1BJX0RBVEFTSVpFXzdCSVQgKDB4MDAwMDA2MDBVKQ0KLSNkZWZpbmUgU1BJX0RBVEFTSVpFXzhCSVQgKDB4MDAwMDA3MDBVKQ0KLSNkZWZpbmUgU1BJX0RBVEFTSVpFXzlCSVQgKDB4MDAwMDA4MDBVKQ0KLSNkZWZpbmUgU1BJX0RBVEFTSVpFXzEwQklUICgweDAwMDAwOTAwVSkNCi0jZGVmaW5lIFNQSV9EQVRBU0laRV8xMUJJVCAoMHgwMDAwMEEwMFUpDQotI2RlZmluZSBTUElfREFUQVNJWkVfMTJCSVQgKDB4MDAwMDBCMDBVKQ0KLSNkZWZpbmUgU1BJX0RBVEFTSVpFXzEzQklUICgweDAwMDAwQzAwVSkNCi0jZGVmaW5lIFNQSV9EQVRBU0laRV8xNEJJVCAoMHgwMDAwMEQwMFUpDQotI2RlZmluZSBTUElfREFUQVNJWkVfMTVCSVQgKDB4MDAwMDBFMDBVKQ0KLSNkZWZpbmUgU1BJX0RBVEFTSVpFXzE2QklUICgweDAwMDAwRjAwVSkNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgU1BJX0Nsb2NrX1BvbGFyaXR5IFNQSSBDbG9jayBQb2xhcml0eQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBTUElfUE9MQVJJVFlfTE9XICgweDAwMDAwMDAwVSkNCi0jZGVmaW5lIFNQSV9QT0xBUklUWV9ISUdIIFNQSV9DUjFfQ1BPTA0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBTUElfQ2xvY2tfUGhhc2UgU1BJIENsb2NrIFBoYXNlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFNQSV9QSEFTRV8xRURHRSAoMHgwMDAwMDAwMFUpDQotI2RlZmluZSBTUElfUEhBU0VfMkVER0UgU1BJX0NSMV9DUEhBDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFNQSV9TbGF2ZV9TZWxlY3RfbWFuYWdlbWVudCBTUEkgU2xhdmUgU2VsZWN0IE1hbmFnZW1lbnQNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgU1BJX05TU19TT0ZUIFNQSV9DUjFfU1NNDQotI2RlZmluZSBTUElfTlNTX0hBUkRfSU5QVVQgKDB4MDAwMDAwMDBVKQ0KLSNkZWZpbmUgU1BJX05TU19IQVJEX09VVFBVVCAoU1BJX0NSMl9TU09FIDw8IDE2VSkNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgU1BJX05TU1BfTW9kZSBTUEkgTlNTIFB1bHNlIE1vZGUNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgU1BJX05TU19QVUxTRV9FTkFCTEUgU1BJX0NSMl9OU1NQDQotI2RlZmluZSBTUElfTlNTX1BVTFNFX0RJU0FCTEUgKDB4MDAwMDAwMDBVKQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBTUElfQmF1ZFJhdGVfUHJlc2NhbGVyIFNQSSBCYXVkUmF0ZSBQcmVzY2FsZXINCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgU1BJX0JBVURSQVRFUFJFU0NBTEVSXzIgKDB4MDAwMDAwMDBVKQ0KLSNkZWZpbmUgU1BJX0JBVURSQVRFUFJFU0NBTEVSXzQgKFNQSV9DUjFfQlJfMCkNCi0jZGVmaW5lIFNQSV9CQVVEUkFURVBSRVNDQUxFUl84IChTUElfQ1IxX0JSXzEpDQotI2RlZmluZSBTUElfQkFVRFJBVEVQUkVTQ0FMRVJfMTYgKFNQSV9DUjFfQlJfMSB8IFNQSV9DUjFfQlJfMCkNCi0jZGVmaW5lIFNQSV9CQVVEUkFURVBSRVNDQUxFUl8zMiAoU1BJX0NSMV9CUl8yKQ0KLSNkZWZpbmUgU1BJX0JBVURSQVRFUFJFU0NBTEVSXzY0IChTUElfQ1IxX0JSXzIgfCBTUElfQ1IxX0JSXzApDQotI2RlZmluZSBTUElfQkFVRFJBVEVQUkVTQ0FMRVJfMTI4IChTUElfQ1IxX0JSXzIgfCBTUElfQ1IxX0JSXzEpDQotI2RlZmluZSBTUElfQkFVRFJBVEVQUkVTQ0FMRVJfMjU2IChTUElfQ1IxX0JSXzIgfCBTUElfQ1IxX0JSXzEgfCBTUElfQ1IxX0JSXzApDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFNQSV9NU0JfTFNCX3RyYW5zbWlzc2lvbiBTUEkgTVNCIExTQiBUcmFuc21pc3Npb24NCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgU1BJX0ZJUlNUQklUX01TQiAoMHgwMDAwMDAwMFUpDQotI2RlZmluZSBTUElfRklSU1RCSVRfTFNCIFNQSV9DUjFfTFNCRklSU1QNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgU1BJX1RJX21vZGUgU1BJIFRJIE1vZGUNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgU1BJX1RJTU9ERV9ESVNBQkxFICgweDAwMDAwMDAwVSkNCi0jZGVmaW5lIFNQSV9USU1PREVfRU5BQkxFIFNQSV9DUjJfRlJGDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFNQSV9DUkNfQ2FsY3VsYXRpb24gU1BJIENSQyBDYWxjdWxhdGlvbg0KLSAqIEB7DQotICovDQotI2RlZmluZSBTUElfQ1JDQ0FMQ1VMQVRJT05fRElTQUJMRSAoMHgwMDAwMDAwMFUpDQotI2RlZmluZSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFIFNQSV9DUjFfQ1JDRU4NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgU1BJX0NSQ19sZW5ndGggU1BJIENSQyBMZW5ndGgNCi0gKiBAew0KLSAqIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgIFNQSV9DUkNfTEVOR1RIX0RBVEFTSVpFOiBhbGlnbmVkIHdpdGggdGhlIGRhdGEgc2l6ZQ0KLSAqICAgICBTUElfQ1JDX0xFTkdUSF84QklUICAgIDogQ1JDIDhiaXQNCi0gKiAgICAgU1BJX0NSQ19MRU5HVEhfMTZCSVQgICA6IENSQyAxNmJpdA0KLSAqLw0KLSNkZWZpbmUgU1BJX0NSQ19MRU5HVEhfREFUQVNJWkUgKDB4MDAwMDAwMDBVKQ0KLSNkZWZpbmUgU1BJX0NSQ19MRU5HVEhfOEJJVCAoMHgwMDAwMDAwMVUpDQotI2RlZmluZSBTUElfQ1JDX0xFTkdUSF8xNkJJVCAoMHgwMDAwMDAwMlUpDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFNQSV9GSUZPX3JlY2VwdGlvbl90aHJlc2hvbGQgU1BJIEZJRk8gUmVjZXB0aW9uIFRocmVzaG9sZA0KLSAqIEB7DQotICogVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgU1BJX1JYRklGT19USFJFU0hPTEQgb3IgU1BJX1JYRklGT19USFJFU0hPTERfUUYgOg0KLSAqICAgICAgICAgIFJYTkUgZXZlbnQgaXMgZ2VuZXJhdGVkIGlmIHRoZSBGSUZPDQotICogICAgICAgICAgbGV2ZWwgaXMgZ3JlYXRlciBvciBlcXVhbCB0byAxLzQoOC1iaXRzKS4NCi0gKiAgICAgU1BJX1JYRklGT19USFJFU0hPTERfSEY6IFJYTkUgZXZlbnQgaXMgZ2VuZXJhdGVkIGlmIHRoZSBGSUZPDQotICogICAgICAgICAgbGV2ZWwgaXMgZ3JlYXRlciBvciBlcXVhbCB0byAxLzIoMTYgYml0cykuICovDQotI2RlZmluZSBTUElfUlhGSUZPX1RIUkVTSE9MRCBTUElfQ1IyX0ZSWFRIDQotI2RlZmluZSBTUElfUlhGSUZPX1RIUkVTSE9MRF9RRiBTUElfQ1IyX0ZSWFRIDQotI2RlZmluZSBTUElfUlhGSUZPX1RIUkVTSE9MRF9IRiAoMHgwMDAwMDAwMFUpDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFNQSV9JbnRlcnJ1cHRfZGVmaW5pdGlvbiBTUEkgSW50ZXJydXB0IERlZmluaXRpb24NCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgU1BJX0lUX1RYRSBTUElfQ1IyX1RYRUlFDQotI2RlZmluZSBTUElfSVRfUlhORSBTUElfQ1IyX1JYTkVJRQ0KLSNkZWZpbmUgU1BJX0lUX0VSUiBTUElfQ1IyX0VSUklFDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFNQSV9GbGFnc19kZWZpbml0aW9uIFNQSSBGbGFncyBEZWZpbml0aW9uDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFNQSV9GTEFHX1JYTkUgXA0KLSAgU1BJX1NSX1JYTkUgLyogU1BJIHN0YXR1cyBmbGFnOiBSeCBidWZmZXIgbm90IGVtcHR5IGZsYWcgICAgICAgKi8NCi0jZGVmaW5lIFNQSV9GTEFHX1RYRSBcDQotICBTUElfU1JfVFhFIC8qIFNQSSBzdGF0dXMgZmxhZzogVHggYnVmZmVyIGVtcHR5IGZsYWcgICAgICAgICAgICovDQotI2RlZmluZSBTUElfRkxBR19CU1kgXA0KLSAgU1BJX1NSX0JTWSAvKiBTUEkgc3RhdHVzIGZsYWc6IEJ1c3kgZmxhZyAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgU1BJX0ZMQUdfQ1JDRVJSIFwNCi0gIFNQSV9TUl9DUkNFUlIgLyogU1BJIEVycm9yIGZsYWc6IENSQyBlcnJvciBmbGFnICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFNQSV9GTEFHX01PREYgXA0KLSAgU1BJX1NSX01PREYgLyogU1BJIEVycm9yIGZsYWc6IE1vZGUgZmF1bHQgZmxhZyAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFNQSV9GTEFHX09WUiBcDQotICBTUElfU1JfT1ZSIC8qIFNQSSBFcnJvciBmbGFnOiBPdmVycnVuIGZsYWcgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBTUElfRkxBR19GUkUgXA0KLSAgU1BJX1NSX0ZSRSAvKiBTUEkgRXJyb3IgZmxhZzogVEkgbW9kZSBmcmFtZSBmb3JtYXQgZXJyb3IgZmxhZyAqLw0KLSNkZWZpbmUgU1BJX0ZMQUdfRlRMVkwgXA0KLSAgU1BJX1NSX0ZUTFZMIC8qIFNQSSBmaWZvIHRyYW5zbWlzc2lvbiBsZXZlbCAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBTUElfRkxBR19GUkxWTCBcDQotICBTUElfU1JfRlJMVkwgLyogU1BJIGZpZm8gcmVjZXB0aW9uIGxldmVsICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFNQSV9GTEFHX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKFNQSV9TUl9SWE5FIHwgU1BJX1NSX1RYRSB8IFNQSV9TUl9CU1kgfCBTUElfU1JfQ1JDRVJSIHwgU1BJX1NSX01PREYgfCBcDQotICAgU1BJX1NSX09WUiB8IFNQSV9TUl9GUkUgfCBTUElfU1JfRlRMVkwgfCBTUElfU1JfRlJMVkwpDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFNQSV90cmFuc21pc3Npb25fZmlmb19zdGF0dXNfbGV2ZWwgU1BJIFRyYW5zbWlzc2lvbiBGSUZPIFN0YXR1cw0KLSAqIExldmVsDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFNQSV9GVExWTF9FTVBUWSAoMHgwMDAwMDAwMFUpDQotI2RlZmluZSBTUElfRlRMVkxfUVVBUlRFUl9GVUxMICgweDAwMDAwODAwVSkNCi0jZGVmaW5lIFNQSV9GVExWTF9IQUxGX0ZVTEwgKDB4MDAwMDEwMDBVKQ0KLSNkZWZpbmUgU1BJX0ZUTFZMX0ZVTEwgKDB4MDAwMDE4MDBVKQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBTUElfcmVjZXB0aW9uX2ZpZm9fc3RhdHVzX2xldmVsIFNQSSBSZWNlcHRpb24gRklGTyBTdGF0dXMgTGV2ZWwNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgU1BJX0ZSTFZMX0VNUFRZICgweDAwMDAwMDAwVSkNCi0jZGVmaW5lIFNQSV9GUkxWTF9RVUFSVEVSX0ZVTEwgKDB4MDAwMDAyMDBVKQ0KLSNkZWZpbmUgU1BJX0ZSTFZMX0hBTEZfRlVMTCAoMHgwMDAwMDQwMFUpDQotI2RlZmluZSBTUElfRlJMVkxfRlVMTCAoMHgwMDAwMDYwMFUpDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBkZWZncm91cCBTUElfRXhwb3J0ZWRfTWFjcm9zIFNQSSBFeHBvcnRlZCBNYWNyb3MNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKiBAYnJpZWYgIFJlc2V0IFNQSSBoYW5kbGUgc3RhdGUuDQotICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU1BJIEhhbmRsZS4NCi0gKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBTUEkgd2hlcmUgeDogMSwgMiwgb3IgMyB0byBzZWxlY3QgdGhlIFNQSQ0KLSAqIHBlcmlwaGVyYWwuDQotICogQHJldHZhbCBOb25lDQotICovDQotI2lmIChVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpDQotI2RlZmluZSBfX0hBTF9TUElfUkVTRVRfSEFORExFX1NUQVRFKF9fSEFORExFX18pIFwNCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAoX19IQU5ETEVfXyktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9SRVNFVDsgICBcDQotICAgIChfX0hBTkRMRV9fKS0+TXNwSW5pdENhbGxiYWNrID0gTlVMTDsgICAgICAgIFwNCi0gICAgKF9fSEFORExFX18pLT5Nc3BEZUluaXRDYWxsYmFjayA9IE5VTEw7ICAgICAgXA0KLSAgfSB3aGlsZSAoMCkNCi0jZWxzZQ0KLSNkZWZpbmUgX19IQUxfU1BJX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSBcDQotICAoKF9fSEFORExFX18pLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfUkVTRVQpDQotI2VuZGlmIC8qIFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLQ0KLS8qKiBAYnJpZWYgIEVuYWJsZSB0aGUgc3BlY2lmaWVkIFNQSSBpbnRlcnJ1cHRzLg0KLSAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNQSSBIYW5kbGUuDQotICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgU1BJIHdoZXJlIHg6IDEsIDIsIG9yIDMgdG8gc2VsZWN0IHRoZSBTUEkNCi0gKiBwZXJpcGhlcmFsLg0KLSAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIGludGVycnVwdCBzb3VyY2UgdG8gZW5hYmxlLg0KLSAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgU1BJX0lUX1RYRTogVHggYnVmZmVyIGVtcHR5IGludGVycnVwdCBlbmFibGUNCi0gKiAgICAgICAgICAgIEBhcmcgU1BJX0lUX1JYTkU6IFJYIGJ1ZmZlciBub3QgZW1wdHkgaW50ZXJydXB0IGVuYWJsZQ0KLSAqICAgICAgICAgICAgQGFyZyBTUElfSVRfRVJSOiBFcnJvciBpbnRlcnJ1cHQgZW5hYmxlDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9TUElfRU5BQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pIFwNCi0gIFNFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IyLCAoX19JTlRFUlJVUFRfXykpDQotDQotLyoqIEBicmllZiAgRGlzYWJsZSB0aGUgc3BlY2lmaWVkIFNQSSBpbnRlcnJ1cHRzLg0KLSAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNQSSBoYW5kbGUuDQotICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgU1BJeCB3aGVyZSB4OiAxLCAyLCBvciAzIHRvIHNlbGVjdCB0aGUgU1BJDQotICogcGVyaXBoZXJhbC4NCi0gKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBpbnRlcnJ1cHQgc291cmNlIHRvIGRpc2FibGUuDQotICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBTUElfSVRfVFhFOiBUeCBidWZmZXIgZW1wdHkgaW50ZXJydXB0IGVuYWJsZQ0KLSAqICAgICAgICAgICAgQGFyZyBTUElfSVRfUlhORTogUlggYnVmZmVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQgZW5hYmxlDQotICogICAgICAgICAgICBAYXJnIFNQSV9JVF9FUlI6IEVycm9yIGludGVycnVwdCBlbmFibGUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1NQSV9ESVNBQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pIFwNCi0gIENMRUFSX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjIsIChfX0lOVEVSUlVQVF9fKSkNCi0NCi0vKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgU1BJIGludGVycnVwdCBzb3VyY2UgaXMgZW5hYmxlZCBvciBub3QuDQotICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU1BJIEhhbmRsZS4NCi0gKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBTUEkgd2hlcmUgeDogMSwgMiwgb3IgMyB0byBzZWxlY3QgdGhlIFNQSQ0KLSAqIHBlcmlwaGVyYWwuDQotICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgU1BJIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suDQotICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgU1BJX0lUX1RYRTogVHggYnVmZmVyIGVtcHR5IGludGVycnVwdCBlbmFibGUNCi0gKiAgICAgICAgICAgIEBhcmcgU1BJX0lUX1JYTkU6IFJYIGJ1ZmZlciBub3QgZW1wdHkgaW50ZXJydXB0IGVuYWJsZQ0KLSAqICAgICAgICAgICAgQGFyZyBTUElfSVRfRVJSOiBFcnJvciBpbnRlcnJ1cHQgZW5hYmxlDQotICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fSVRfXyAoVFJVRSBvciBGQUxTRSkuDQotICovDQotI2RlZmluZSBfX0hBTF9TUElfR0VUX0lUX1NPVVJDRShfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAgICAgICAgICAgXA0KLSAgKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IyICYgKF9fSU5URVJSVVBUX18pKSA9PSAoX19JTlRFUlJVUFRfXykpIFwNCi0gICAgICAgPyBTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgIDogUkVTRVQpDQotDQotLyoqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIFNQSSBmbGFnIGlzIHNldCBvciBub3QuDQotICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU1BJIEhhbmRsZS4NCi0gKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBTUEkgd2hlcmUgeDogMSwgMiwgb3IgMyB0byBzZWxlY3QgdGhlIFNQSQ0KLSAqIHBlcmlwaGVyYWwuDQotICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2hlY2suDQotICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBTUElfRkxBR19SWE5FOiBSZWNlaXZlIGJ1ZmZlciBub3QgZW1wdHkgZmxhZw0KLSAqICAgICAgICAgICAgQGFyZyBTUElfRkxBR19UWEU6IFRyYW5zbWl0IGJ1ZmZlciBlbXB0eSBmbGFnDQotICogICAgICAgICAgICBAYXJnIFNQSV9GTEFHX0NSQ0VSUjogQ1JDIGVycm9yIGZsYWcNCi0gKiAgICAgICAgICAgIEBhcmcgU1BJX0ZMQUdfTU9ERjogTW9kZSBmYXVsdCBmbGFnDQotICogICAgICAgICAgICBAYXJnIFNQSV9GTEFHX09WUjogT3ZlcnJ1biBmbGFnDQotICogICAgICAgICAgICBAYXJnIFNQSV9GTEFHX0JTWTogQnVzeSBmbGFnDQotICogICAgICAgICAgICBAYXJnIFNQSV9GTEFHX0ZSRTogRnJhbWUgZm9ybWF0IGVycm9yIGZsYWcNCi0gKiAgICAgICAgICAgIEBhcmcgU1BJX0ZMQUdfRlRMVkw6IFNQSSBmaWZvIHRyYW5zbWlzc2lvbiBsZXZlbA0KLSAqICAgICAgICAgICAgQGFyZyBTUElfRkxBR19GUkxWTDogU1BJIGZpZm8gcmVjZXB0aW9uIGxldmVsDQotICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fRkxBR19fIChUUlVFIG9yIEZBTFNFKS4NCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1NQSV9HRVRfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgXA0KLSAgKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+U1IpICYgKF9fRkxBR19fKSkgPT0gKF9fRkxBR19fKSkNCi0NCi0vKiogQGJyaWVmICBDbGVhciB0aGUgU1BJIENSQ0VSUiBwZW5kaW5nIGZsYWcuDQotICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU1BJIEhhbmRsZS4NCi0gKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBTUEkgd2hlcmUgeDogMSwgMiwgb3IgMyB0byBzZWxlY3QgdGhlIFNQSQ0KLSAqIHBlcmlwaGVyYWwuDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9TUElfQ0xFQVJfQ1JDRVJSRkxBRyhfX0hBTkRMRV9fKSBcDQotICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+U1IgPSAodWludDE2X3QpKH5TUElfRkxBR19DUkNFUlIpKQ0KLQ0KLS8qKiBAYnJpZWYgIENsZWFyIHRoZSBTUEkgTU9ERiBwZW5kaW5nIGZsYWcuDQotICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU1BJIEhhbmRsZS4NCi0gKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBTUEkgd2hlcmUgeDogMSwgMiwgb3IgMyB0byBzZWxlY3QgdGhlIFNQSQ0KLSAqIHBlcmlwaGVyYWwuDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9TUElfQ0xFQVJfTU9ERkZMQUcoX19IQU5ETEVfXykgICAgICAgICAgICAgXA0KLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgX19JTyB1aW50MzJfdCB0bXByZWdfbW9kZiA9IDB4MDBVOyAgICAgICAgICAgICAgICAgICBcDQotICAgIHRtcHJlZ19tb2RmID0gKF9fSEFORExFX18pLT5JbnN0YW5jZS0+U1I7ICAgICAgICAgICAgXA0KLSAgICBDTEVBUl9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxLCBTUElfQ1IxX1NQRSk7IFwNCi0gICAgVU5VU0VEKHRtcHJlZ19tb2RmKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICB9IHdoaWxlICgwVSkNCi0NCi0vKiogQGJyaWVmICBDbGVhciB0aGUgU1BJIE9WUiBwZW5kaW5nIGZsYWcuDQotICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU1BJIEhhbmRsZS4NCi0gKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBTUEkgd2hlcmUgeDogMSwgMiwgb3IgMyB0byBzZWxlY3QgdGhlIFNQSQ0KLSAqIHBlcmlwaGVyYWwuDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9TUElfQ0xFQVJfT1ZSRkxBRyhfX0hBTkRMRV9fKSAgXA0KLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgX19JTyB1aW50MzJfdCB0bXByZWdfb3ZyID0gMHgwMFU7ICAgICAgICBcDQotICAgIHRtcHJlZ19vdnIgPSAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5EUjsgXA0KLSAgICB0bXByZWdfb3ZyID0gKF9fSEFORExFX18pLT5JbnN0YW5jZS0+U1I7IFwNCi0gICAgVU5VU0VEKHRtcHJlZ19vdnIpOyAgICAgICAgICAgICAgICAgICAgICBcDQotICB9IHdoaWxlICgwVSkNCi0NCi0vKiogQGJyaWVmICBDbGVhciB0aGUgU1BJIEZSRSBwZW5kaW5nIGZsYWcuDQotICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU1BJIEhhbmRsZS4NCi0gKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBTUEkgd2hlcmUgeDogMSwgMiwgb3IgMyB0byBzZWxlY3QgdGhlIFNQSQ0KLSAqIHBlcmlwaGVyYWwuDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9TUElfQ0xFQVJfRlJFRkxBRyhfX0hBTkRMRV9fKSAgXA0KLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgX19JTyB1aW50MzJfdCB0bXByZWdfZnJlID0gMHgwMFU7ICAgICAgICBcDQotICAgIHRtcHJlZ19mcmUgPSAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5TUjsgXA0KLSAgICBVTlVTRUQodG1wcmVnX2ZyZSk7ICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIH0gd2hpbGUgKDBVKQ0KLQ0KLS8qKiBAYnJpZWYgIEVuYWJsZSB0aGUgU1BJIHBlcmlwaGVyYWwuDQotICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU1BJIEhhbmRsZS4NCi0gKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBTUEkgd2hlcmUgeDogMSwgMiwgb3IgMyB0byBzZWxlY3QgdGhlIFNQSQ0KLSAqIHBlcmlwaGVyYWwuDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9TUElfRU5BQkxFKF9fSEFORExFX18pIFwNCi0gIFNFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxLCBTUElfQ1IxX1NQRSkNCi0NCi0vKiogQGJyaWVmICBEaXNhYmxlIHRoZSBTUEkgcGVyaXBoZXJhbC4NCi0gKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTUEkgSGFuZGxlLg0KLSAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIFNQSSB3aGVyZSB4OiAxLCAyLCBvciAzIHRvIHNlbGVjdCB0aGUgU1BJDQotICogcGVyaXBoZXJhbC4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1NQSV9ESVNBQkxFKF9fSEFORExFX18pIFwNCi0gIENMRUFSX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEsIFNQSV9DUjFfU1BFKQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGRlZmdyb3VwIFNQSV9Qcml2YXRlX01hY3JvcyBTUEkgUHJpdmF0ZSBNYWNyb3MNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKiBAYnJpZWYgIFNldCB0aGUgU1BJIHRyYW5zbWl0LW9ubHkgbW9kZS4NCi0gKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTUEkgSGFuZGxlLg0KLSAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIFNQSSB3aGVyZSB4OiAxLCAyLCBvciAzIHRvIHNlbGVjdCB0aGUgU1BJDQotICogcGVyaXBoZXJhbC4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIFNQSV8xTElORV9UWChfX0hBTkRMRV9fKSBcDQotICBTRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSwgU1BJX0NSMV9CSURJT0UpDQotDQotLyoqIEBicmllZiAgU2V0IHRoZSBTUEkgcmVjZWl2ZS1vbmx5IG1vZGUuDQotICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU1BJIEhhbmRsZS4NCi0gKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBTUEkgd2hlcmUgeDogMSwgMiwgb3IgMyB0byBzZWxlY3QgdGhlIFNQSQ0KLSAqIHBlcmlwaGVyYWwuDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBTUElfMUxJTkVfUlgoX19IQU5ETEVfXykgXA0KLSAgQ0xFQVJfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSwgU1BJX0NSMV9CSURJT0UpDQotDQotLyoqIEBicmllZiAgUmVzZXQgdGhlIENSQyBjYWxjdWxhdGlvbiBvZiB0aGUgU1BJLg0KLSAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNQSSBIYW5kbGUuDQotICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgU1BJIHdoZXJlIHg6IDEsIDIsIG9yIDMgdG8gc2VsZWN0IHRoZSBTUEkNCi0gKiBwZXJpcGhlcmFsLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgU1BJX1JFU0VUX0NSQyhfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBDTEVBUl9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxLCBTUElfQ1IxX0NSQ0VOKTsgXA0KLSAgICBTRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSwgU1BJX0NSMV9DUkNFTik7ICAgXA0KLSAgfSB3aGlsZSAoMFUpDQotDQotLyoqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIFNQSSBmbGFnIGlzIHNldCBvciBub3QuDQotICogQHBhcmFtICBfX1NSX18gIGNvcHkgb2YgU1BJIFNSIHJlZ2lzdGVyLg0KLSAqIEBwYXJhbSAgX19GTEFHX18gc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNoZWNrLg0KLSAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgU1BJX0ZMQUdfUlhORTogUmVjZWl2ZSBidWZmZXIgbm90IGVtcHR5IGZsYWcNCi0gKiAgICAgICAgICAgIEBhcmcgU1BJX0ZMQUdfVFhFOiBUcmFuc21pdCBidWZmZXIgZW1wdHkgZmxhZw0KLSAqICAgICAgICAgICAgQGFyZyBTUElfRkxBR19DUkNFUlI6IENSQyBlcnJvciBmbGFnDQotICogICAgICAgICAgICBAYXJnIFNQSV9GTEFHX01PREY6IE1vZGUgZmF1bHQgZmxhZw0KLSAqICAgICAgICAgICAgQGFyZyBTUElfRkxBR19PVlI6IE92ZXJydW4gZmxhZw0KLSAqICAgICAgICAgICAgQGFyZyBTUElfRkxBR19CU1k6IEJ1c3kgZmxhZw0KLSAqICAgICAgICAgICAgQGFyZyBTUElfRkxBR19GUkU6IEZyYW1lIGZvcm1hdCBlcnJvciBmbGFnDQotICogICAgICAgICAgICBAYXJnIFNQSV9GTEFHX0ZUTFZMOiBTUEkgZmlmbyB0cmFuc21pc3Npb24gbGV2ZWwNCi0gKiAgICAgICAgICAgIEBhcmcgU1BJX0ZMQUdfRlJMVkw6IFNQSSBmaWZvIHJlY2VwdGlvbiBsZXZlbA0KLSAqIEByZXR2YWwgU0VUIG9yIFJFU0VULg0KLSAqLw0KLSNkZWZpbmUgU1BJX0NIRUNLX0ZMQUcoX19TUl9fLCBfX0ZMQUdfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKCgoX19TUl9fKSAmICgoX19GTEFHX18pICYgU1BJX0ZMQUdfTUFTSykpID09ICgoX19GTEFHX18pICYgU1BJX0ZMQUdfTUFTSykpIFwNCi0gICAgICAgPyBTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICA6IFJFU0VUKQ0KLQ0KLS8qKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBTUEkgSW50ZXJydXB0IGlzIHNldCBvciBub3QuDQotICogQHBhcmFtICBfX0NSMl9fICBjb3B5IG9mIFNQSSBDUjIgcmVnaXN0ZXIuDQotICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgU1BJIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suDQotICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBTUElfSVRfVFhFOiBUeCBidWZmZXIgZW1wdHkgaW50ZXJydXB0IGVuYWJsZQ0KLSAqICAgICAgICAgICAgQGFyZyBTUElfSVRfUlhORTogUlggYnVmZmVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQgZW5hYmxlDQotICogICAgICAgICAgICBAYXJnIFNQSV9JVF9FUlI6IEVycm9yIGludGVycnVwdCBlbmFibGUNCi0gKiBAcmV0dmFsIFNFVCBvciBSRVNFVC4NCi0gKi8NCi0jZGVmaW5lIFNQSV9DSEVDS19JVF9TT1VSQ0UoX19DUjJfXywgX19JTlRFUlJVUFRfXykgXA0KLSAgKCgoKF9fQ1IyX18pICYgKF9fSU5URVJSVVBUX18pKSA9PSAoX19JTlRFUlJVUFRfXykpID8gU0VUIDogUkVTRVQpDQotDQotLyoqIEBicmllZiAgQ2hlY2tzIGlmIFNQSSBNb2RlIHBhcmFtZXRlciBpcyBpbiBhbGxvd2VkIHJhbmdlLg0KLSAqIEBwYXJhbSAgX19NT0RFX18gc3BlY2lmaWVzIHRoZSBTUEkgTW9kZS4NCi0gKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU1BJX01vZGUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIElTX1NQSV9NT0RFKF9fTU9ERV9fKSBcDQotICAoKChfX01PREVfXykgPT0gU1BJX01PREVfU0xBVkUpIHx8ICgoX19NT0RFX18pID09IFNQSV9NT0RFX01BU1RFUikpDQotDQotLyoqIEBicmllZiAgQ2hlY2tzIGlmIFNQSSBEaXJlY3Rpb24gTW9kZSBwYXJhbWV0ZXIgaXMgaW4gYWxsb3dlZCByYW5nZS4NCi0gKiBAcGFyYW0gIF9fTU9ERV9fIHNwZWNpZmllcyB0aGUgU1BJIERpcmVjdGlvbiBNb2RlLg0KLSAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfRGlyZWN0aW9uDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBJU19TUElfRElSRUNUSU9OKF9fTU9ERV9fKSAgICAgICAgICAgICAgICBcDQotICAoKChfX01PREVfXykgPT0gU1BJX0RJUkVDVElPTl8yTElORVMpIHx8ICAgICAgICBcDQotICAgKChfX01PREVfXykgPT0gU1BJX0RJUkVDVElPTl8yTElORVNfUlhPTkxZKSB8fCBcDQotICAgKChfX01PREVfXykgPT0gU1BJX0RJUkVDVElPTl8xTElORSkpDQotDQotLyoqIEBicmllZiAgQ2hlY2tzIGlmIFNQSSBEaXJlY3Rpb24gTW9kZSBwYXJhbWV0ZXIgaXMgMiBsaW5lcy4NCi0gKiBAcGFyYW0gIF9fTU9ERV9fIHNwZWNpZmllcyB0aGUgU1BJIERpcmVjdGlvbiBNb2RlLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgSVNfU1BJX0RJUkVDVElPTl8yTElORVMoX19NT0RFX18pICgoX19NT0RFX18pID09IFNQSV9ESVJFQ1RJT05fMkxJTkVTKQ0KLQ0KLS8qKiBAYnJpZWYgIENoZWNrcyBpZiBTUEkgRGlyZWN0aW9uIE1vZGUgcGFyYW1ldGVyIGlzIDEgb3IgMiBsaW5lcy4NCi0gKiBAcGFyYW0gIF9fTU9ERV9fIHNwZWNpZmllcyB0aGUgU1BJIERpcmVjdGlvbiBNb2RlLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgSVNfU1BJX0RJUkVDVElPTl8yTElORVNfT1JfMUxJTkUoX19NT0RFX18pIFwNCi0gICgoKF9fTU9ERV9fKSA9PSBTUElfRElSRUNUSU9OXzJMSU5FUykgfHwgKChfX01PREVfXykgPT0gU1BJX0RJUkVDVElPTl8xTElORSkpDQotDQotLyoqIEBicmllZiAgQ2hlY2tzIGlmIFNQSSBEYXRhIFNpemUgcGFyYW1ldGVyIGlzIGluIGFsbG93ZWQgcmFuZ2UuDQotICogQHBhcmFtICBfX0RBVEFTSVpFX18gc3BlY2lmaWVzIHRoZSBTUEkgRGF0YSBTaXplLg0KLSAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfRGF0YV9TaXplDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBJU19TUElfREFUQVNJWkUoX19EQVRBU0laRV9fKSAgICAgICAgXA0KLSAgKCgoX19EQVRBU0laRV9fKSA9PSBTUElfREFUQVNJWkVfMTZCSVQpIHx8IFwNCi0gICAoKF9fREFUQVNJWkVfXykgPT0gU1BJX0RBVEFTSVpFXzE1QklUKSB8fCBcDQotICAgKChfX0RBVEFTSVpFX18pID09IFNQSV9EQVRBU0laRV8xNEJJVCkgfHwgXA0KLSAgICgoX19EQVRBU0laRV9fKSA9PSBTUElfREFUQVNJWkVfMTNCSVQpIHx8IFwNCi0gICAoKF9fREFUQVNJWkVfXykgPT0gU1BJX0RBVEFTSVpFXzEyQklUKSB8fCBcDQotICAgKChfX0RBVEFTSVpFX18pID09IFNQSV9EQVRBU0laRV8xMUJJVCkgfHwgXA0KLSAgICgoX19EQVRBU0laRV9fKSA9PSBTUElfREFUQVNJWkVfMTBCSVQpIHx8IFwNCi0gICAoKF9fREFUQVNJWkVfXykgPT0gU1BJX0RBVEFTSVpFXzlCSVQpIHx8ICBcDQotICAgKChfX0RBVEFTSVpFX18pID09IFNQSV9EQVRBU0laRV84QklUKSB8fCAgXA0KLSAgICgoX19EQVRBU0laRV9fKSA9PSBTUElfREFUQVNJWkVfN0JJVCkgfHwgIFwNCi0gICAoKF9fREFUQVNJWkVfXykgPT0gU1BJX0RBVEFTSVpFXzZCSVQpIHx8ICBcDQotICAgKChfX0RBVEFTSVpFX18pID09IFNQSV9EQVRBU0laRV81QklUKSB8fCAgXA0KLSAgICgoX19EQVRBU0laRV9fKSA9PSBTUElfREFUQVNJWkVfNEJJVCkpDQotDQotLyoqIEBicmllZiAgQ2hlY2tzIGlmIFNQSSBTZXJpYWwgY2xvY2sgc3RlYWR5IHN0YXRlIHBhcmFtZXRlciBpcyBpbiBhbGxvd2VkDQotICogcmFuZ2UuDQotICogQHBhcmFtICBfX0NQT0xfXyBzcGVjaWZpZXMgdGhlIFNQSSBzZXJpYWwgY2xvY2sgc3RlYWR5IHN0YXRlLg0KLSAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfQ2xvY2tfUG9sYXJpdHkNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIElTX1NQSV9DUE9MKF9fQ1BPTF9fKSBcDQotICAoKChfX0NQT0xfXykgPT0gU1BJX1BPTEFSSVRZX0xPVykgfHwgKChfX0NQT0xfXykgPT0gU1BJX1BPTEFSSVRZX0hJR0gpKQ0KLQ0KLS8qKiBAYnJpZWYgIENoZWNrcyBpZiBTUEkgQ2xvY2sgUGhhc2UgcGFyYW1ldGVyIGlzIGluIGFsbG93ZWQgcmFuZ2UuDQotICogQHBhcmFtICBfX0NQSEFfXyBzcGVjaWZpZXMgdGhlIFNQSSBDbG9jayBQaGFzZS4NCi0gKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU1BJX0Nsb2NrX1BoYXNlDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBJU19TUElfQ1BIQShfX0NQSEFfXykgXA0KLSAgKCgoX19DUEhBX18pID09IFNQSV9QSEFTRV8xRURHRSkgfHwgKChfX0NQSEFfXykgPT0gU1BJX1BIQVNFXzJFREdFKSkNCi0NCi0vKiogQGJyaWVmICBDaGVja3MgaWYgU1BJIFNsYXZlIFNlbGVjdCBwYXJhbWV0ZXIgaXMgaW4gYWxsb3dlZCByYW5nZS4NCi0gKiBAcGFyYW0gIF9fTlNTX18gc3BlY2lmaWVzIHRoZSBTUEkgU2xhdmUgU2VsZWN0IG1hbmFnZW1lbnQgcGFyYW1ldGVyLg0KLSAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfU2xhdmVfU2VsZWN0X21hbmFnZW1lbnQNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIElTX1NQSV9OU1MoX19OU1NfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoKF9fTlNTX18pID09IFNQSV9OU1NfU09GVCkgfHwgKChfX05TU19fKSA9PSBTUElfTlNTX0hBUkRfSU5QVVQpIHx8IFwNCi0gICAoKF9fTlNTX18pID09IFNQSV9OU1NfSEFSRF9PVVRQVVQpKQ0KLQ0KLS8qKiBAYnJpZWYgIENoZWNrcyBpZiBTUEkgTlNTIFB1bHNlIHBhcmFtZXRlciBpcyBpbiBhbGxvd2VkIHJhbmdlLg0KLSAqIEBwYXJhbSAgX19OU1NQX18gc3BlY2lmaWVzIHRoZSBTUEkgTlNTIFB1bHNlIE1vZGUgcGFyYW1ldGVyLg0KLSAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfTlNTUF9Nb2RlDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBJU19TUElfTlNTUChfX05TU1BfXykgICAgICAgICAgICAgIFwNCi0gICgoKF9fTlNTUF9fKSA9PSBTUElfTlNTX1BVTFNFX0VOQUJMRSkgfHwgXA0KLSAgICgoX19OU1NQX18pID09IFNQSV9OU1NfUFVMU0VfRElTQUJMRSkpDQotDQotLyoqIEBicmllZiAgQ2hlY2tzIGlmIFNQSSBCYXVkcmF0ZSBwcmVzY2FsZXIgcGFyYW1ldGVyIGlzIGluIGFsbG93ZWQgcmFuZ2UuDQotICogQHBhcmFtICBfX1BSRVNDQUxFUl9fIHNwZWNpZmllcyB0aGUgU1BJIEJhdWRyYXRlIHByZXNjYWxlci4NCi0gKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU1BJX0JhdWRSYXRlX1ByZXNjYWxlcg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgSVNfU1BJX0JBVURSQVRFX1BSRVNDQUxFUihfX1BSRVNDQUxFUl9fKSAgICAgXA0KLSAgKCgoX19QUkVTQ0FMRVJfXykgPT0gU1BJX0JBVURSQVRFUFJFU0NBTEVSXzIpIHx8ICAgXA0KLSAgICgoX19QUkVTQ0FMRVJfXykgPT0gU1BJX0JBVURSQVRFUFJFU0NBTEVSXzQpIHx8ICAgXA0KLSAgICgoX19QUkVTQ0FMRVJfXykgPT0gU1BJX0JBVURSQVRFUFJFU0NBTEVSXzgpIHx8ICAgXA0KLSAgICgoX19QUkVTQ0FMRVJfXykgPT0gU1BJX0JBVURSQVRFUFJFU0NBTEVSXzE2KSB8fCAgXA0KLSAgICgoX19QUkVTQ0FMRVJfXykgPT0gU1BJX0JBVURSQVRFUFJFU0NBTEVSXzMyKSB8fCAgXA0KLSAgICgoX19QUkVTQ0FMRVJfXykgPT0gU1BJX0JBVURSQVRFUFJFU0NBTEVSXzY0KSB8fCAgXA0KLSAgICgoX19QUkVTQ0FMRVJfXykgPT0gU1BJX0JBVURSQVRFUFJFU0NBTEVSXzEyOCkgfHwgXA0KLSAgICgoX19QUkVTQ0FMRVJfXykgPT0gU1BJX0JBVURSQVRFUFJFU0NBTEVSXzI1NikpDQotDQotLyoqIEBicmllZiAgQ2hlY2tzIGlmIFNQSSBNU0IgTFNCIHRyYW5zbWlzc2lvbiBwYXJhbWV0ZXIgaXMgaW4gYWxsb3dlZCByYW5nZS4NCi0gKiBAcGFyYW0gIF9fQklUX18gc3BlY2lmaWVzIHRoZSBTUEkgTVNCIExTQiB0cmFuc21pc3Npb24gKHdoZXRoZXIgZGF0YSB0cmFuc2Zlcg0KLSAqIHN0YXJ0cyBmcm9tIE1TQiBvciBMU0IgYml0KS4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAqIFNQSV9NU0JfTFNCX3RyYW5zbWlzc2lvbg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgSVNfU1BJX0ZJUlNUX0JJVChfX0JJVF9fKSBcDQotICAoKChfX0JJVF9fKSA9PSBTUElfRklSU1RCSVRfTVNCKSB8fCAoKF9fQklUX18pID09IFNQSV9GSVJTVEJJVF9MU0IpKQ0KLQ0KLS8qKiBAYnJpZWYgIENoZWNrcyBpZiBTUEkgVEkgbW9kZSBwYXJhbWV0ZXIgaXMgaW4gYWxsb3dlZCByYW5nZS4NCi0gKiBAcGFyYW0gIF9fTU9ERV9fIHNwZWNpZmllcyB0aGUgU1BJIFRJIG1vZGUuDQotICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9USV9tb2RlDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBJU19TUElfVElNT0RFKF9fTU9ERV9fKSBcDQotICAoKChfX01PREVfXykgPT0gU1BJX1RJTU9ERV9ESVNBQkxFKSB8fCAoKF9fTU9ERV9fKSA9PSBTUElfVElNT0RFX0VOQUJMRSkpDQotDQotLyoqIEBicmllZiAgQ2hlY2tzIGlmIFNQSSBDUkMgY2FsY3VsYXRpb24gZW5hYmxlZCBzdGF0ZSBpcyBpbiBhbGxvd2VkIHJhbmdlLg0KLSAqIEBwYXJhbSAgX19DQUxDVUxBVElPTl9fIHNwZWNpZmllcyB0aGUgU1BJIENSQyBjYWxjdWxhdGlvbiBlbmFibGUgc3RhdGUuDQotICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9DUkNfQ2FsY3VsYXRpb24NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIElTX1NQSV9DUkNfQ0FMQ1VMQVRJT04oX19DQUxDVUxBVElPTl9fKSAgICAgICAgIFwNCi0gICgoKF9fQ0FMQ1VMQVRJT05fXykgPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0RJU0FCTEUpIHx8IFwNCi0gICAoKF9fQ0FMQ1VMQVRJT05fXykgPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkpDQotDQotLyoqIEBicmllZiAgQ2hlY2tzIGlmIFNQSSBDUkMgbGVuZ3RoIGlzIGluIGFsbG93ZWQgcmFuZ2UuDQotICogQHBhcmFtICBfX0xFTkdUSF9fIHNwZWNpZmllcyB0aGUgU1BJIENSQyBsZW5ndGguDQotICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9DUkNfbGVuZ3RoDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBJU19TUElfQ1JDX0xFTkdUSChfX0xFTkdUSF9fKSAgICAgICAgICAgXA0KLSAgKCgoX19MRU5HVEhfXykgPT0gU1BJX0NSQ19MRU5HVEhfREFUQVNJWkUpIHx8IFwNCi0gICAoKF9fTEVOR1RIX18pID09IFNQSV9DUkNfTEVOR1RIXzhCSVQpIHx8ICAgICBcDQotICAgKChfX0xFTkdUSF9fKSA9PSBTUElfQ1JDX0xFTkdUSF8xNkJJVCkpDQotDQotLyoqIEBicmllZiAgQ2hlY2tzIGlmIFNQSSBwb2x5bm9taWFsIHZhbHVlIHRvIGJlIHVzZWQgZm9yIHRoZSBDUkMgY2FsY3VsYXRpb24sDQotICogaXMgaW4gYWxsb3dlZCByYW5nZS4NCi0gKiBAcGFyYW0gIF9fUE9MWU5PTUlBTF9fIHNwZWNpZmllcyB0aGUgU1BJIHBvbHlub21pYWwgdmFsdWUgdG8gYmUgdXNlZCBmb3IgdGhlDQotICogQ1JDIGNhbGN1bGF0aW9uLiBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZA0KLSAqIE1heF9EYXRhID0gNjU1MzUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIElTX1NQSV9DUkNfUE9MWU5PTUlBTChfX1BPTFlOT01JQUxfXykgICAgICAgICAgICAgICAgICAgICBcDQotICAoKChfX1BPTFlOT01JQUxfXykgPj0gMHgxVSkgJiYgKChfX1BPTFlOT01JQUxfXykgPD0gMHhGRkZGVSkgJiYgXA0KLSAgICgoKF9fUE9MWU5PTUlBTF9fKSAmIDB4MVUpICE9IDBVKSkNCi0NCi0vKiogQGJyaWVmICBDaGVja3MgaWYgRE1BIGhhbmRsZSBpcyB2YWxpZC4NCi0gKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIGEgRE1BIEhhbmRsZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIElTX1NQSV9ETUFfSEFORExFKF9fSEFORExFX18pICgoX19IQU5ETEVfXykgIT0gTlVMTCkNCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIEluY2x1ZGUgU1BJIEhBTCBFeHRlbmRlZCBtb2R1bGUgKi8NCi0jaW5jbHVkZSAic3RtMzJnNHh4X2hhbF9zcGlfZXguaCINCi0NCi0vKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAYWRkdG9ncm91cCBTUElfRXhwb3J0ZWRfRnVuY3Rpb25zDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGFkZHRvZ3JvdXAgU1BJX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDENCi0gKiBAew0KLSAqLw0KLS8qIEluaXRpYWxpemF0aW9uL2RlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9Jbml0KFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX0RlSW5pdChTUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7DQotdm9pZCBIQUxfU1BJX01zcEluaXQoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOw0KLXZvaWQgSEFMX1NQSV9Nc3BEZUluaXQoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOw0KLQ0KLS8qIENhbGxiYWNrcyBSZWdpc3Rlci9VblJlZ2lzdGVyIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotI2lmIChVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9SZWdpc3RlckNhbGxiYWNrKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfU1BJX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTUElfQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjayk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9VblJlZ2lzdGVyQ2FsbGJhY2soDQotICAgIFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLCBIQUxfU1BJX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpOw0KLSNlbmRpZiAvKiBVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAYWRkdG9ncm91cCBTUElfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMg0KLSAqIEB7DQotICovDQotLyogSS9PIG9wZXJhdGlvbiBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX1RyYW5zbWl0KFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLCB1aW50OF90ICpwRGF0YSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfUmVjZWl2ZShTUElfSGFuZGxlVHlwZURlZiAqaHNwaSwgdWludDhfdCAqcERhdGEsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfVHJhbnNtaXRSZWNlaXZlKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBUeERhdGEsIHVpbnQ4X3QgKnBSeERhdGEsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9UcmFuc21pdF9JVChTUElfSGFuZGxlVHlwZURlZiAqaHNwaSwgdWludDhfdCAqcERhdGEsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBTaXplKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX1JlY2VpdmVfSVQoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGksIHVpbnQ4X3QgKnBEYXRhLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBTaXplKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX1RyYW5zbWl0UmVjZWl2ZV9JVChTUElfSGFuZGxlVHlwZURlZiAqaHNwaSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwVHhEYXRhLCB1aW50OF90ICpwUnhEYXRhLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IFNpemUpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfVHJhbnNtaXRfRE1BKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLCB1aW50OF90ICpwRGF0YSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBTaXplKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX1JlY2VpdmVfRE1BKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLCB1aW50OF90ICpwRGF0YSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IFNpemUpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfVHJhbnNtaXRSZWNlaXZlX0RNQShTUElfSGFuZGxlVHlwZURlZiAqaHNwaSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcFR4RGF0YSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcFJ4RGF0YSwgdWludDE2X3QgU2l6ZSk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9ETUFQYXVzZShTUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9ETUFSZXN1bWUoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfRE1BU3RvcChTUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7DQotLyogVHJhbnNmZXIgQWJvcnQgZnVuY3Rpb25zICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9BYm9ydChTUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9BYm9ydF9JVChTUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7DQotDQotdm9pZCBIQUxfU1BJX0lSUUhhbmRsZXIoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOw0KLXZvaWQgSEFMX1NQSV9UeENwbHRDYWxsYmFjayhTUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7DQotdm9pZCBIQUxfU1BJX1J4Q3BsdENhbGxiYWNrKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsNCi12b2lkIEhBTF9TUElfVHhSeENwbHRDYWxsYmFjayhTUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7DQotdm9pZCBIQUxfU1BJX1R4SGFsZkNwbHRDYWxsYmFjayhTUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7DQotdm9pZCBIQUxfU1BJX1J4SGFsZkNwbHRDYWxsYmFjayhTUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7DQotdm9pZCBIQUxfU1BJX1R4UnhIYWxmQ3BsdENhbGxiYWNrKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsNCi12b2lkIEhBTF9TUElfRXJyb3JDYWxsYmFjayhTUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7DQotdm9pZCBIQUxfU1BJX0Fib3J0Q3BsdENhbGxiYWNrKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAYWRkdG9ncm91cCBTUElfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMw0KLSAqIEB7DQotICovDQotLyogUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3IgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1IQUxfU1BJX1N0YXRlVHlwZURlZiBIQUxfU1BJX0dldFN0YXRlKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsNCi11aW50MzJfdCBIQUxfU1BJX0dldEVycm9yKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLSNpZmRlZiBfX2NwbHVzcGx1cw0KLX0NCi0jZW5kaWYNCi0NCi0jZW5kaWYgLyogU1RNMzJHNHh4X0hBTF9TUElfSCAqLw0KKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGZpbGUgICAgc3RtMzJnNHh4X2hhbF9zcGkuaAorICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFNQSSBIQUwgbW9kdWxlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGF0dGVudGlvbgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGVybXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZQorICogaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc29mdHdhcmUgY29tcG9uZW50LgorICogSWYgbm8gTElDRU5TRSBmaWxlIGNvbWVzIHdpdGggdGhpcyBzb2Z0d2FyZSwgaXQgaXMgcHJvdmlkZWQgQVMtSVMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyRzR4eF9IQUxfU1BJX0gKKyNkZWZpbmUgU1RNMzJHNHh4X0hBTF9TUElfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnNHh4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzR4eF9IQUxfRHJpdmVyCisgKiBAeworICovCisKKy8qKiBAYWRkdG9ncm91cCBTUEkKKyAqIEB7CisgKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgU1BJX0V4cG9ydGVkX1R5cGVzIFNQSSBFeHBvcnRlZCBUeXBlcworICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiAgU1BJIENvbmZpZ3VyYXRpb24gU3RydWN0dXJlIGRlZmluaXRpb24KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50MzJfdCBNb2RlOyAvKiE8IFNwZWNpZmllcyB0aGUgU1BJIG9wZXJhdGluZyBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU1BJX01vZGUgKi8KKworICB1aW50MzJfdAorICAgICAgRGlyZWN0aW9uOyAvKiE8IFNwZWNpZmllcyB0aGUgU1BJIGJpZGlyZWN0aW9uYWwgbW9kZSBzdGF0ZS4KKyAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9EaXJlY3Rpb24gKi8KKworICB1aW50MzJfdCBEYXRhU2l6ZTsgLyohPCBTcGVjaWZpZXMgdGhlIFNQSSBkYXRhIHNpemUuCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU1BJX0RhdGFfU2l6ZSAqLworCisgIHVpbnQzMl90IENMS1BvbGFyaXR5OyAvKiE8IFNwZWNpZmllcyB0aGUgc2VyaWFsIGNsb2NrIHN0ZWFkeSBzdGF0ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BJX0Nsb2NrX1BvbGFyaXR5ICovCisKKyAgdWludDMyX3QKKyAgICAgIENMS1BoYXNlOyAvKiE8IFNwZWNpZmllcyB0aGUgY2xvY2sgYWN0aXZlIGVkZ2UgZm9yIHRoZSBiaXQgY2FwdHVyZS4KKyAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU1BJX0Nsb2NrX1BoYXNlICovCisKKyAgdWludDMyX3QgTlNTOyAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBOU1Mgc2lnbmFsIGlzIG1hbmFnZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlIChOU1MgcGluKSBvciBieSBzb2Z0d2FyZSB1c2luZyB0aGUgU1NJIGJpdC4KKyAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICBTUElfU2xhdmVfU2VsZWN0X21hbmFnZW1lbnQgKi8KKworICB1aW50MzJfdCBCYXVkUmF0ZVByZXNjYWxlcjsgLyohPCBTcGVjaWZpZXMgdGhlIEJhdWQgUmF0ZSBwcmVzY2FsZXIgdmFsdWUgd2hpY2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgdXNlZCB0byBjb25maWd1cmUgdGhlIHRyYW5zbWl0IGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZSBTQ0sgY2xvY2suIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBvZiBAcmVmIFNQSV9CYXVkUmF0ZV9QcmVzY2FsZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgVGhlIGNvbW11bmljYXRpb24gY2xvY2sgaXMgZGVyaXZlZCBmcm9tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWFzdGVyIGNsb2NrLiBUaGUgc2xhdmUgY2xvY2sgZG9lcyBub3QgbmVlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgc2V0LiAqLworCisgIHVpbnQzMl90IEZpcnN0Qml0OyAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIGRhdGEgdHJhbnNmZXJzIHN0YXJ0IGZyb20gTVNCIG9yIExTQgorICAgICAgICAgICAgICAgICAgICAgICAgYml0LiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgICBTUElfTVNCX0xTQl90cmFuc21pc3Npb24gKi8KKworICB1aW50MzJfdCBUSU1vZGU7IC8qITwgU3BlY2lmaWVzIGlmIHRoZSBUSSBtb2RlIGlzIGVuYWJsZWQgb3Igbm90LgorICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfVElfbW9kZSAqLworCisgIHVpbnQzMl90IENSQ0NhbGN1bGF0aW9uOyAvKiE8IFNwZWNpZmllcyBpZiB0aGUgQ1JDIGNhbGN1bGF0aW9uIGlzIGVuYWJsZWQgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BJX0NSQ19DYWxjdWxhdGlvbiAqLworCisgIHVpbnQzMl90IENSQ1BvbHlub21pYWw7IC8qITwgU3BlY2lmaWVzIHRoZSBwb2x5bm9taWFsIHVzZWQgZm9yIHRoZSBDUkMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsY3VsYXRpb24uIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYW4gb2RkIG51bWJlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXR3ZWVuIE1pbl9EYXRhID0gMSBhbmQgTWF4X0RhdGEgPSA2NTUzNSAqLworCisgIHVpbnQzMl90IENSQ0xlbmd0aDsgLyohPCBTcGVjaWZpZXMgdGhlIENSQyBMZW5ndGggdXNlZCBmb3IgdGhlIENSQworICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGN1bGF0aW9uLiBDUkMgTGVuZ3RoIGlzIG9ubHkgdXNlZCB3aXRoIERhdGE4IGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgIERhdGExNiwgbm90IG90aGVyIGRhdGEgc2l6ZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYQorICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIG9mIEByZWYgU1BJX0NSQ19sZW5ndGggKi8KKworICB1aW50MzJfdAorICAgICAgTlNTUE1vZGU7IC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIE5TU1Agc2lnbmFsIGlzIGVuYWJsZWQgb3Igbm90IC4KKyAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU1BJX05TU1BfTW9kZQorICAgICAgICAgICAgICAgICAgICAgVGhpcyBtb2RlIGlzIGFjdGl2YXRlZCBieSB0aGUgTlNTUCBiaXQgaW4gdGhlIFNQSXhfQ1IyCisgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgYW5kIGl0IHRha2VzIGVmZmVjdCBvbmx5IGlmIHRoZSBTUEkgaW50ZXJmYWNlIGlzCisgICAgICAgICAgICAgICAgICAgY29uZmlndXJlZCBhcyBNb3Rvcm9sYSBTUEkgbWFzdGVyIChGUkY9MCkgd2l0aCBjYXB0dXJlIG9uIHRoZQorICAgICAgICAgICAgICAgICAgIGZpcnN0IGVkZ2UgKFNQSXhfQ1IxIENQSEEgPSAwLCBDUE9MIHNldHRpbmcgaXMgaWdub3JlZCkuLiAqLworfSBTUElfSW5pdFR5cGVEZWY7CisKKy8qKgorICogQGJyaWVmICBIQUwgU1BJIFN0YXRlIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgKi8KK3R5cGVkZWYgZW51bSB7CisgIEhBTF9TUElfU1RBVEVfUkVTRVQgPSAweDAwVSwgLyohPCBQZXJpcGhlcmFsIG5vdCBJbml0aWFsaXplZCAqLworICBIQUxfU1BJX1NUQVRFX1JFQURZID0gMHgwMVUsIC8qITwgUGVyaXBoZXJhbCBJbml0aWFsaXplZCBhbmQgcmVhZHkgZm9yIHVzZSAqLworICBIQUxfU1BJX1NUQVRFX0JVU1kgPSAweDAyVSwgIC8qITwgYW4gaW50ZXJuYWwgcHJvY2VzcyBpcyBvbmdvaW5nICAqLworICBIQUxfU1BJX1NUQVRFX0JVU1lfVFggPSAweDAzVSwgLyohPCBEYXRhIFRyYW5zbWlzc2lvbiBwcm9jZXNzIGlzIG9uZ29pbmcgKi8KKyAgSEFMX1NQSV9TVEFURV9CVVNZX1JYID0gMHgwNFUsIC8qITwgRGF0YSBSZWNlcHRpb24gcHJvY2VzcyBpcyBvbmdvaW5nICovCisgIEhBTF9TUElfU1RBVEVfQlVTWV9UWF9SWCA9CisgICAgICAweDA1VSwgLyohPCBEYXRhIFRyYW5zbWlzc2lvbiBhbmQgUmVjZXB0aW9uIHByb2Nlc3MgaXMgb25nb2luZyAqLworICBIQUxfU1BJX1NUQVRFX0VSUk9SID0gMHgwNlUsIC8qITwgU1BJIGVycm9yIHN0YXRlICovCisgIEhBTF9TUElfU1RBVEVfQUJPUlQgPSAweDA3VSAgLyohPCBTUEkgYWJvcnQgaXMgb25nb2luZyAgKi8KK30gSEFMX1NQSV9TdGF0ZVR5cGVEZWY7CisKKy8qKgorICogQGJyaWVmICBTUEkgaGFuZGxlIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgKi8KK3R5cGVkZWYgc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgeworICBTUElfVHlwZURlZiAqSW5zdGFuY2U7IC8qITwgU1BJIHJlZ2lzdGVycyBiYXNlIGFkZHJlc3MgICAgICAgICAgICAgICAqLworCisgIFNQSV9Jbml0VHlwZURlZiBJbml0OyAvKiE8IFNQSSBjb21tdW5pY2F0aW9uIHBhcmFtZXRlcnMgICAgICAgICAgICAgKi8KKworICBjb25zdCB1aW50OF90ICpwVHhCdWZmUHRyOyAvKiE8IFBvaW50ZXIgdG8gU1BJIFR4IHRyYW5zZmVyIEJ1ZmZlciAgICAgICAgKi8KKworICB1aW50MTZfdCBUeFhmZXJTaXplOyAvKiE8IFNQSSBUeCBUcmFuc2ZlciBzaXplICAgICAgICAgICAgICAgICAgICAgKi8KKworICBfX0lPIHVpbnQxNl90IFR4WGZlckNvdW50OyAvKiE8IFNQSSBUeCBUcmFuc2ZlciBDb3VudGVyICAgICAgICAgICAgICAgICAgKi8KKworICB1aW50OF90ICpwUnhCdWZmUHRyOyAvKiE8IFBvaW50ZXIgdG8gU1BJIFJ4IHRyYW5zZmVyIEJ1ZmZlciAgICAgICAgKi8KKworICB1aW50MTZfdCBSeFhmZXJTaXplOyAvKiE8IFNQSSBSeCBUcmFuc2ZlciBzaXplICAgICAgICAgICAgICAgICAgICAgKi8KKworICBfX0lPIHVpbnQxNl90IFJ4WGZlckNvdW50OyAvKiE8IFNQSSBSeCBUcmFuc2ZlciBDb3VudGVyICAgICAgICAgICAgICAgICAgKi8KKworICB1aW50MzJfdCBDUkNTaXplOyAvKiE8IFNQSSBDUkMgc2l6ZSB1c2VkIGZvciB0aGUgdHJhbnNmZXIgICAgICAgKi8KKworICB2b2lkICgqUnhJU1IpKAorICAgICAgc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOyAvKiE8IGZ1bmN0aW9uIHBvaW50ZXIgb24gUnggSVNSICovCisKKyAgdm9pZCAoKlR4SVNSKSgKKyAgICAgIHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsgLyohPCBmdW5jdGlvbiBwb2ludGVyIG9uIFR4IElTUiAqLworCisgIERNQV9IYW5kbGVUeXBlRGVmICpoZG1hdHg7IC8qITwgU1BJIFR4IERNQSBIYW5kbGUgcGFyYW1ldGVycyAgICAgICAgICAgICAqLworCisgIERNQV9IYW5kbGVUeXBlRGVmICpoZG1hcng7IC8qITwgU1BJIFJ4IERNQSBIYW5kbGUgcGFyYW1ldGVycyAgICAgICAgICAgICAqLworCisgIEhBTF9Mb2NrVHlwZURlZiBMb2NrOyAvKiE8IExvY2tpbmcgb2JqZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICBfX0lPIEhBTF9TUElfU3RhdGVUeXBlRGVmIFN0YXRlOyAvKiE8IFNQSSBjb21tdW5pY2F0aW9uIHN0YXRlICovCisKKyAgX19JTyB1aW50MzJfdCBFcnJvckNvZGU7IC8qITwgU1BJIEVycm9yIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjaWYgKFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgdm9pZCAoKlR4Q3BsdENhbGxiYWNrKSgKKyAgICAgIHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsgLyohPCBTUEkgVHggQ29tcGxldGVkIGNhbGxiYWNrICovCisgIHZvaWQgKCpSeENwbHRDYWxsYmFjaykoCisgICAgICBzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7IC8qITwgU1BJIFJ4IENvbXBsZXRlZCBjYWxsYmFjayAqLworICB2b2lkICgqVHhSeENwbHRDYWxsYmFjaykoCisgICAgICBzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7IC8qITwgU1BJIFR4UnggQ29tcGxldGVkIGNhbGxiYWNrICovCisgIHZvaWQgKCpUeEhhbGZDcGx0Q2FsbGJhY2spKAorICAgICAgc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOyAvKiE8IFNQSSBUeCBIYWxmIENvbXBsZXRlZCBjYWxsYmFjayAqLworICB2b2lkICgqUnhIYWxmQ3BsdENhbGxiYWNrKSgKKyAgICAgIHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsgLyohPCBTUEkgUnggSGFsZiBDb21wbGV0ZWQgY2FsbGJhY2sgKi8KKyAgdm9pZCAoKlR4UnhIYWxmQ3BsdENhbGxiYWNrKSgKKyAgICAgIHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmCisgICAgICAgICAgKmhzcGkpOyAvKiE8IFNQSSBUeFJ4IEhhbGYgQ29tcGxldGVkIGNhbGxiYWNrICAgKi8KKyAgdm9pZCAoKkVycm9yQ2FsbGJhY2spKAorICAgICAgc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOyAvKiE8IFNQSSBFcnJvciBjYWxsYmFjayAqLworICB2b2lkICgqQWJvcnRDcGx0Q2FsbGJhY2spKAorICAgICAgc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOyAvKiE8IFNQSSBBYm9ydCBjYWxsYmFjayAqLworICB2b2lkICgqTXNwSW5pdENhbGxiYWNrKSgKKyAgICAgIHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsgLyohPCBTUEkgTXNwIEluaXQgY2FsbGJhY2sgKi8KKyAgdm9pZCAoKk1zcERlSW5pdENhbGxiYWNrKSgKKyAgICAgIHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsgLyohPCBTUEkgTXNwIERlSW5pdCBjYWxsYmFjayAqLworCisjZW5kaWYgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9IFNQSV9IYW5kbGVUeXBlRGVmOworCisjaWYgKFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKy8qKgorICogQGJyaWVmICBIQUwgU1BJIENhbGxiYWNrIElEIGVudW1lcmF0aW9uIGRlZmluaXRpb24KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgSEFMX1NQSV9UWF9DT01QTEVURV9DQl9JRCA9IDB4MDBVLCAgICAvKiE8IFNQSSBUeCBDb21wbGV0ZWQgY2FsbGJhY2sgSUQgICAgKi8KKyAgSEFMX1NQSV9SWF9DT01QTEVURV9DQl9JRCA9IDB4MDFVLCAgICAvKiE8IFNQSSBSeCBDb21wbGV0ZWQgY2FsbGJhY2sgSUQgICAgKi8KKyAgSEFMX1NQSV9UWF9SWF9DT01QTEVURV9DQl9JRCA9IDB4MDJVLCAvKiE8IFNQSSBUeFJ4IENvbXBsZXRlZCBjYWxsYmFjayBJRCAqLworICBIQUxfU1BJX1RYX0hBTEZfQ09NUExFVEVfQ0JfSUQgPQorICAgICAgMHgwM1UsIC8qITwgU1BJIFR4IEhhbGYgQ29tcGxldGVkIGNhbGxiYWNrIElEICAgICovCisgIEhBTF9TUElfUlhfSEFMRl9DT01QTEVURV9DQl9JRCA9CisgICAgICAweDA0VSwgLyohPCBTUEkgUnggSGFsZiBDb21wbGV0ZWQgY2FsbGJhY2sgSUQgICAgKi8KKyAgSEFMX1NQSV9UWF9SWF9IQUxGX0NPTVBMRVRFX0NCX0lEID0KKyAgICAgIDB4MDVVLCAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNQSSBUeFJ4IEhhbGYgQ29tcGxldGVkIGNhbGxiYWNrIElEICAqLworICBIQUxfU1BJX0VSUk9SX0NCX0lEID0gMHgwNlUsICAgIC8qITwgU1BJIEVycm9yIGNhbGxiYWNrIElEICAgICAgICAgICAgICAgICovCisgIEhBTF9TUElfQUJPUlRfQ0JfSUQgPSAweDA3VSwgICAgLyohPCBTUEkgQWJvcnQgY2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgKi8KKyAgSEFMX1NQSV9NU1BJTklUX0NCX0lEID0gMHgwOFUsICAvKiE8IFNQSSBNc3AgSW5pdCBjYWxsYmFjayBJRCAgICAgICAgICAgICAqLworICBIQUxfU1BJX01TUERFSU5JVF9DQl9JRCA9IDB4MDlVIC8qITwgU1BJIE1zcCBEZUluaXQgY2FsbGJhY2sgSUQgICAgICAgICAgICovCisKK30gSEFMX1NQSV9DYWxsYmFja0lEVHlwZURlZjsKKworLyoqCisgKiBAYnJpZWYgIEhBTCBTUEkgQ2FsbGJhY2sgcG9pbnRlciBkZWZpbml0aW9uCisgKi8KK3R5cGVkZWYgdm9pZCAoKnBTUElfQ2FsbGJhY2tUeXBlRGVmKSgKKyAgICBTUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7IC8qITwgcG9pbnRlciB0byBhbiBTUEkgY2FsbGJhY2sgZnVuY3Rpb24gKi8KKworI2VuZGlmIC8qIFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyAqLworLyoqCisgKiBAfQorICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFNQSV9FeHBvcnRlZF9Db25zdGFudHMgU1BJIEV4cG9ydGVkIENvbnN0YW50cworICogQHsKKyAqLworCisvKiogQGRlZmdyb3VwIFNQSV9FcnJvcl9Db2RlIFNQSSBFcnJvciBDb2RlCisgKiBAeworICovCisjZGVmaW5lIEhBTF9TUElfRVJST1JfTk9ORSBcCisgICgweDAwMDAwMDAwVSkgLyohPCBObyBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfU1BJX0VSUk9SX01PREYgXAorICAoMHgwMDAwMDAwMVUpIC8qITwgTU9ERiBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1NQSV9FUlJPUl9DUkMgXAorICAoMHgwMDAwMDAwMlUpIC8qITwgQ1JDIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1NQSV9FUlJPUl9PVlIgXAorICAoMHgwMDAwMDAwNFUpIC8qITwgT1ZSIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1NQSV9FUlJPUl9GUkUgXAorICAoMHgwMDAwMDAwOFUpIC8qITwgRlJFIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1NQSV9FUlJPUl9ETUEgXAorICAoMHgwMDAwMDAxMFUpIC8qITwgRE1BIHRyYW5zZmVyIGVycm9yICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1NQSV9FUlJPUl9GTEFHIFwKKyAgKDB4MDAwMDAwMjBVKSAvKiE8IEVycm9yIG9uIFJYTkUvVFhFL0JTWS9GVExWTC9GUkxWTCBGbGFnICovCisjZGVmaW5lIEhBTF9TUElfRVJST1JfQUJPUlQgXAorICAoMHgwMDAwMDA0MFUpIC8qITwgRXJyb3IgZHVyaW5nIFNQSSBBYm9ydCBwcm9jZWR1cmUgICAgICAgKi8KKyNpZiAoVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorI2RlZmluZSBIQUxfU1BJX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0sgXAorICAoMHgwMDAwMDA4MFUpIC8qITwgSW52YWxpZCBDYWxsYmFjayBlcnJvciAgICAgICAgICAgICAgICAgKi8KKyNlbmRpZiAgICAgICAgICAvKiBVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFNQSV9Nb2RlIFNQSSBNb2RlCisgKiBAeworICovCisjZGVmaW5lIFNQSV9NT0RFX1NMQVZFICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgU1BJX01PREVfTUFTVEVSIChTUElfQ1IxX01TVFIgfCBTUElfQ1IxX1NTSSkKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFNQSV9EaXJlY3Rpb24gU1BJIERpcmVjdGlvbiBNb2RlCisgKiBAeworICovCisjZGVmaW5lIFNQSV9ESVJFQ1RJT05fMkxJTkVTICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgU1BJX0RJUkVDVElPTl8yTElORVNfUlhPTkxZIFNQSV9DUjFfUlhPTkxZCisjZGVmaW5lIFNQSV9ESVJFQ1RJT05fMUxJTkUgU1BJX0NSMV9CSURJTU9ERQorLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0RhdGFfU2l6ZSBTUEkgRGF0YSBTaXplCisgKiBAeworICovCisjZGVmaW5lIFNQSV9EQVRBU0laRV80QklUICgweDAwMDAwMzAwVSkKKyNkZWZpbmUgU1BJX0RBVEFTSVpFXzVCSVQgKDB4MDAwMDA0MDBVKQorI2RlZmluZSBTUElfREFUQVNJWkVfNkJJVCAoMHgwMDAwMDUwMFUpCisjZGVmaW5lIFNQSV9EQVRBU0laRV83QklUICgweDAwMDAwNjAwVSkKKyNkZWZpbmUgU1BJX0RBVEFTSVpFXzhCSVQgKDB4MDAwMDA3MDBVKQorI2RlZmluZSBTUElfREFUQVNJWkVfOUJJVCAoMHgwMDAwMDgwMFUpCisjZGVmaW5lIFNQSV9EQVRBU0laRV8xMEJJVCAoMHgwMDAwMDkwMFUpCisjZGVmaW5lIFNQSV9EQVRBU0laRV8xMUJJVCAoMHgwMDAwMEEwMFUpCisjZGVmaW5lIFNQSV9EQVRBU0laRV8xMkJJVCAoMHgwMDAwMEIwMFUpCisjZGVmaW5lIFNQSV9EQVRBU0laRV8xM0JJVCAoMHgwMDAwMEMwMFUpCisjZGVmaW5lIFNQSV9EQVRBU0laRV8xNEJJVCAoMHgwMDAwMEQwMFUpCisjZGVmaW5lIFNQSV9EQVRBU0laRV8xNUJJVCAoMHgwMDAwMEUwMFUpCisjZGVmaW5lIFNQSV9EQVRBU0laRV8xNkJJVCAoMHgwMDAwMEYwMFUpCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBTUElfQ2xvY2tfUG9sYXJpdHkgU1BJIENsb2NrIFBvbGFyaXR5CisgKiBAeworICovCisjZGVmaW5lIFNQSV9QT0xBUklUWV9MT1cgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBTUElfUE9MQVJJVFlfSElHSCBTUElfQ1IxX0NQT0wKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFNQSV9DbG9ja19QaGFzZSBTUEkgQ2xvY2sgUGhhc2UKKyAqIEB7CisgKi8KKyNkZWZpbmUgU1BJX1BIQVNFXzFFREdFICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgU1BJX1BIQVNFXzJFREdFIFNQSV9DUjFfQ1BIQQorLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX1NsYXZlX1NlbGVjdF9tYW5hZ2VtZW50IFNQSSBTbGF2ZSBTZWxlY3QgTWFuYWdlbWVudAorICogQHsKKyAqLworI2RlZmluZSBTUElfTlNTX1NPRlQgU1BJX0NSMV9TU00KKyNkZWZpbmUgU1BJX05TU19IQVJEX0lOUFVUICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgU1BJX05TU19IQVJEX09VVFBVVCAoU1BJX0NSMl9TU09FIDw8IDE2VSkKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFNQSV9OU1NQX01vZGUgU1BJIE5TUyBQdWxzZSBNb2RlCisgKiBAeworICovCisjZGVmaW5lIFNQSV9OU1NfUFVMU0VfRU5BQkxFIFNQSV9DUjJfTlNTUAorI2RlZmluZSBTUElfTlNTX1BVTFNFX0RJU0FCTEUgKDB4MDAwMDAwMDBVKQorLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0JhdWRSYXRlX1ByZXNjYWxlciBTUEkgQmF1ZFJhdGUgUHJlc2NhbGVyCisgKiBAeworICovCisjZGVmaW5lIFNQSV9CQVVEUkFURVBSRVNDQUxFUl8yICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgU1BJX0JBVURSQVRFUFJFU0NBTEVSXzQgKFNQSV9DUjFfQlJfMCkKKyNkZWZpbmUgU1BJX0JBVURSQVRFUFJFU0NBTEVSXzggKFNQSV9DUjFfQlJfMSkKKyNkZWZpbmUgU1BJX0JBVURSQVRFUFJFU0NBTEVSXzE2IChTUElfQ1IxX0JSXzEgfCBTUElfQ1IxX0JSXzApCisjZGVmaW5lIFNQSV9CQVVEUkFURVBSRVNDQUxFUl8zMiAoU1BJX0NSMV9CUl8yKQorI2RlZmluZSBTUElfQkFVRFJBVEVQUkVTQ0FMRVJfNjQgKFNQSV9DUjFfQlJfMiB8IFNQSV9DUjFfQlJfMCkKKyNkZWZpbmUgU1BJX0JBVURSQVRFUFJFU0NBTEVSXzEyOCAoU1BJX0NSMV9CUl8yIHwgU1BJX0NSMV9CUl8xKQorI2RlZmluZSBTUElfQkFVRFJBVEVQUkVTQ0FMRVJfMjU2IChTUElfQ1IxX0JSXzIgfCBTUElfQ1IxX0JSXzEgfCBTUElfQ1IxX0JSXzApCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBTUElfTVNCX0xTQl90cmFuc21pc3Npb24gU1BJIE1TQiBMU0IgVHJhbnNtaXNzaW9uCisgKiBAeworICovCisjZGVmaW5lIFNQSV9GSVJTVEJJVF9NU0IgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBTUElfRklSU1RCSVRfTFNCIFNQSV9DUjFfTFNCRklSU1QKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFNQSV9USV9tb2RlIFNQSSBUSSBNb2RlCisgKiBAeworICovCisjZGVmaW5lIFNQSV9USU1PREVfRElTQUJMRSAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIFNQSV9USU1PREVfRU5BQkxFIFNQSV9DUjJfRlJGCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBTUElfQ1JDX0NhbGN1bGF0aW9uIFNQSSBDUkMgQ2FsY3VsYXRpb24KKyAqIEB7CisgKi8KKyNkZWZpbmUgU1BJX0NSQ0NBTENVTEFUSU9OX0RJU0FCTEUgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFIFNQSV9DUjFfQ1JDRU4KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFNQSV9DUkNfbGVuZ3RoIFNQSSBDUkMgTGVuZ3RoCisgKiBAeworICogVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICBTUElfQ1JDX0xFTkdUSF9EQVRBU0laRTogYWxpZ25lZCB3aXRoIHRoZSBkYXRhIHNpemUKKyAqICAgICBTUElfQ1JDX0xFTkdUSF84QklUICAgIDogQ1JDIDhiaXQKKyAqICAgICBTUElfQ1JDX0xFTkdUSF8xNkJJVCAgIDogQ1JDIDE2Yml0CisgKi8KKyNkZWZpbmUgU1BJX0NSQ19MRU5HVEhfREFUQVNJWkUgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBTUElfQ1JDX0xFTkdUSF84QklUICgweDAwMDAwMDAxVSkKKyNkZWZpbmUgU1BJX0NSQ19MRU5HVEhfMTZCSVQgKDB4MDAwMDAwMDJVKQorLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0ZJRk9fcmVjZXB0aW9uX3RocmVzaG9sZCBTUEkgRklGTyBSZWNlcHRpb24gVGhyZXNob2xkCisgKiBAeworICogVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICBTUElfUlhGSUZPX1RIUkVTSE9MRCBvciBTUElfUlhGSUZPX1RIUkVTSE9MRF9RRiA6CisgKiAgICAgICAgICBSWE5FIGV2ZW50IGlzIGdlbmVyYXRlZCBpZiB0aGUgRklGTworICogICAgICAgICAgbGV2ZWwgaXMgZ3JlYXRlciBvciBlcXVhbCB0byAxLzQoOC1iaXRzKS4KKyAqICAgICBTUElfUlhGSUZPX1RIUkVTSE9MRF9IRjogUlhORSBldmVudCBpcyBnZW5lcmF0ZWQgaWYgdGhlIEZJRk8KKyAqICAgICAgICAgIGxldmVsIGlzIGdyZWF0ZXIgb3IgZXF1YWwgdG8gMS8yKDE2IGJpdHMpLiAqLworI2RlZmluZSBTUElfUlhGSUZPX1RIUkVTSE9MRCBTUElfQ1IyX0ZSWFRICisjZGVmaW5lIFNQSV9SWEZJRk9fVEhSRVNIT0xEX1FGIFNQSV9DUjJfRlJYVEgKKyNkZWZpbmUgU1BJX1JYRklGT19USFJFU0hPTERfSEYgKDB4MDAwMDAwMDBVKQorLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0ludGVycnVwdF9kZWZpbml0aW9uIFNQSSBJbnRlcnJ1cHQgRGVmaW5pdGlvbgorICogQHsKKyAqLworI2RlZmluZSBTUElfSVRfVFhFIFNQSV9DUjJfVFhFSUUKKyNkZWZpbmUgU1BJX0lUX1JYTkUgU1BJX0NSMl9SWE5FSUUKKyNkZWZpbmUgU1BJX0lUX0VSUiBTUElfQ1IyX0VSUklFCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBTUElfRmxhZ3NfZGVmaW5pdGlvbiBTUEkgRmxhZ3MgRGVmaW5pdGlvbgorICogQHsKKyAqLworI2RlZmluZSBTUElfRkxBR19SWE5FIFwKKyAgU1BJX1NSX1JYTkUgLyogU1BJIHN0YXR1cyBmbGFnOiBSeCBidWZmZXIgbm90IGVtcHR5IGZsYWcgICAgICAgKi8KKyNkZWZpbmUgU1BJX0ZMQUdfVFhFIFwKKyAgU1BJX1NSX1RYRSAvKiBTUEkgc3RhdHVzIGZsYWc6IFR4IGJ1ZmZlciBlbXB0eSBmbGFnICAgICAgICAgICAqLworI2RlZmluZSBTUElfRkxBR19CU1kgXAorICBTUElfU1JfQlNZIC8qIFNQSSBzdGF0dXMgZmxhZzogQnVzeSBmbGFnICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNQSV9GTEFHX0NSQ0VSUiBcCisgIFNQSV9TUl9DUkNFUlIgLyogU1BJIEVycm9yIGZsYWc6IENSQyBlcnJvciBmbGFnICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU1BJX0ZMQUdfTU9ERiBcCisgIFNQSV9TUl9NT0RGIC8qIFNQSSBFcnJvciBmbGFnOiBNb2RlIGZhdWx0IGZsYWcgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNQSV9GTEFHX09WUiBcCisgIFNQSV9TUl9PVlIgLyogU1BJIEVycm9yIGZsYWc6IE92ZXJydW4gZmxhZyAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU1BJX0ZMQUdfRlJFIFwKKyAgU1BJX1NSX0ZSRSAvKiBTUEkgRXJyb3IgZmxhZzogVEkgbW9kZSBmcmFtZSBmb3JtYXQgZXJyb3IgZmxhZyAqLworI2RlZmluZSBTUElfRkxBR19GVExWTCBcCisgIFNQSV9TUl9GVExWTCAvKiBTUEkgZmlmbyB0cmFuc21pc3Npb24gbGV2ZWwgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTUElfRkxBR19GUkxWTCBcCisgIFNQSV9TUl9GUkxWTCAvKiBTUEkgZmlmbyByZWNlcHRpb24gbGV2ZWwgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTUElfRkxBR19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKFNQSV9TUl9SWE5FIHwgU1BJX1NSX1RYRSB8IFNQSV9TUl9CU1kgfCBTUElfU1JfQ1JDRVJSIHwgU1BJX1NSX01PREYgfCBcCisgICBTUElfU1JfT1ZSIHwgU1BJX1NSX0ZSRSB8IFNQSV9TUl9GVExWTCB8IFNQSV9TUl9GUkxWTCkKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFNQSV90cmFuc21pc3Npb25fZmlmb19zdGF0dXNfbGV2ZWwgU1BJIFRyYW5zbWlzc2lvbiBGSUZPIFN0YXR1cworICogTGV2ZWwKKyAqIEB7CisgKi8KKyNkZWZpbmUgU1BJX0ZUTFZMX0VNUFRZICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgU1BJX0ZUTFZMX1FVQVJURVJfRlVMTCAoMHgwMDAwMDgwMFUpCisjZGVmaW5lIFNQSV9GVExWTF9IQUxGX0ZVTEwgKDB4MDAwMDEwMDBVKQorI2RlZmluZSBTUElfRlRMVkxfRlVMTCAoMHgwMDAwMTgwMFUpCisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFNQSV9yZWNlcHRpb25fZmlmb19zdGF0dXNfbGV2ZWwgU1BJIFJlY2VwdGlvbiBGSUZPIFN0YXR1cyBMZXZlbAorICogQHsKKyAqLworI2RlZmluZSBTUElfRlJMVkxfRU1QVFkgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBTUElfRlJMVkxfUVVBUlRFUl9GVUxMICgweDAwMDAwMjAwVSkKKyNkZWZpbmUgU1BJX0ZSTFZMX0hBTEZfRlVMTCAoMHgwMDAwMDQwMFUpCisjZGVmaW5lIFNQSV9GUkxWTF9GVUxMICgweDAwMDAwNjAwVSkKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyogRXhwb3J0ZWQgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgU1BJX0V4cG9ydGVkX01hY3JvcyBTUEkgRXhwb3J0ZWQgTWFjcm9zCisgKiBAeworICovCisKKy8qKiBAYnJpZWYgIFJlc2V0IFNQSSBoYW5kbGUgc3RhdGUuCisgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTUEkgSGFuZGxlLgorICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgU1BJIHdoZXJlIHg6IDEsIDIsIG9yIDMgdG8gc2VsZWN0IHRoZSBTUEkKKyAqIHBlcmlwaGVyYWwuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2lmIChVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisjZGVmaW5lIF9fSEFMX1NQSV9SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoX19IQU5ETEVfXyktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9SRVNFVDsgICBcCisgICAgKF9fSEFORExFX18pLT5Nc3BJbml0Q2FsbGJhY2sgPSBOVUxMOyAgICAgICAgXAorICAgIChfX0hBTkRMRV9fKS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBOVUxMOyAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIF9fSEFMX1NQSV9SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgXAorICAoKF9fSEFORExFX18pLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfUkVTRVQpCisjZW5kaWYgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qKiBAYnJpZWYgIEVuYWJsZSB0aGUgc3BlY2lmaWVkIFNQSSBpbnRlcnJ1cHRzLgorICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU1BJIEhhbmRsZS4KKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIFNQSSB3aGVyZSB4OiAxLCAyLCBvciAzIHRvIHNlbGVjdCB0aGUgU1BJCisgKiBwZXJpcGhlcmFsLgorICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IHNvdXJjZSB0byBlbmFibGUuCisgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgU1BJX0lUX1RYRTogVHggYnVmZmVyIGVtcHR5IGludGVycnVwdCBlbmFibGUKKyAqICAgICAgICAgICAgQGFyZyBTUElfSVRfUlhORTogUlggYnVmZmVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQgZW5hYmxlCisgKiAgICAgICAgICAgIEBhcmcgU1BJX0lUX0VSUjogRXJyb3IgaW50ZXJydXB0IGVuYWJsZQorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfU1BJX0VOQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSBcCisgIFNFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IyLCAoX19JTlRFUlJVUFRfXykpCisKKy8qKiBAYnJpZWYgIERpc2FibGUgdGhlIHNwZWNpZmllZCBTUEkgaW50ZXJydXB0cy4KKyAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNQSSBoYW5kbGUuCisgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBTUEl4IHdoZXJlIHg6IDEsIDIsIG9yIDMgdG8gc2VsZWN0IHRoZSBTUEkKKyAqIHBlcmlwaGVyYWwuCisgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBpbnRlcnJ1cHQgc291cmNlIHRvIGRpc2FibGUuCisgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgU1BJX0lUX1RYRTogVHggYnVmZmVyIGVtcHR5IGludGVycnVwdCBlbmFibGUKKyAqICAgICAgICAgICAgQGFyZyBTUElfSVRfUlhORTogUlggYnVmZmVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQgZW5hYmxlCisgKiAgICAgICAgICAgIEBhcmcgU1BJX0lUX0VSUjogRXJyb3IgaW50ZXJydXB0IGVuYWJsZQorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfU1BJX0RJU0FCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgXAorICBDTEVBUl9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IyLCAoX19JTlRFUlJVUFRfXykpCisKKy8qKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBTUEkgaW50ZXJydXB0IHNvdXJjZSBpcyBlbmFibGVkIG9yIG5vdC4KKyAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNQSSBIYW5kbGUuCisgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBTUEkgd2hlcmUgeDogMSwgMiwgb3IgMyB0byBzZWxlY3QgdGhlIFNQSQorICogcGVyaXBoZXJhbC4KKyAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFNQSSBpbnRlcnJ1cHQgc291cmNlIHRvIGNoZWNrLgorICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBTUElfSVRfVFhFOiBUeCBidWZmZXIgZW1wdHkgaW50ZXJydXB0IGVuYWJsZQorICogICAgICAgICAgICBAYXJnIFNQSV9JVF9SWE5FOiBSWCBidWZmZXIgbm90IGVtcHR5IGludGVycnVwdCBlbmFibGUKKyAqICAgICAgICAgICAgQGFyZyBTUElfSVRfRVJSOiBFcnJvciBpbnRlcnJ1cHQgZW5hYmxlCisgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgX19JVF9fIChUUlVFIG9yIEZBTFNFKS4KKyAqLworI2RlZmluZSBfX0hBTF9TUElfR0VUX0lUX1NPVVJDRShfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAgICAgICAgICAgXAorICAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjIgJiAoX19JTlRFUlJVUFRfXykpID09IChfX0lOVEVSUlVQVF9fKSkgXAorICAgICAgID8gU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIDogUkVTRVQpCisKKy8qKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBTUEkgZmxhZyBpcyBzZXQgb3Igbm90LgorICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU1BJIEhhbmRsZS4KKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIFNQSSB3aGVyZSB4OiAxLCAyLCBvciAzIHRvIHNlbGVjdCB0aGUgU1BJCisgKiBwZXJpcGhlcmFsLgorICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2hlY2suCisgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgU1BJX0ZMQUdfUlhORTogUmVjZWl2ZSBidWZmZXIgbm90IGVtcHR5IGZsYWcKKyAqICAgICAgICAgICAgQGFyZyBTUElfRkxBR19UWEU6IFRyYW5zbWl0IGJ1ZmZlciBlbXB0eSBmbGFnCisgKiAgICAgICAgICAgIEBhcmcgU1BJX0ZMQUdfQ1JDRVJSOiBDUkMgZXJyb3IgZmxhZworICogICAgICAgICAgICBAYXJnIFNQSV9GTEFHX01PREY6IE1vZGUgZmF1bHQgZmxhZworICogICAgICAgICAgICBAYXJnIFNQSV9GTEFHX09WUjogT3ZlcnJ1biBmbGFnCisgKiAgICAgICAgICAgIEBhcmcgU1BJX0ZMQUdfQlNZOiBCdXN5IGZsYWcKKyAqICAgICAgICAgICAgQGFyZyBTUElfRkxBR19GUkU6IEZyYW1lIGZvcm1hdCBlcnJvciBmbGFnCisgKiAgICAgICAgICAgIEBhcmcgU1BJX0ZMQUdfRlRMVkw6IFNQSSBmaWZvIHRyYW5zbWlzc2lvbiBsZXZlbAorICogICAgICAgICAgICBAYXJnIFNQSV9GTEFHX0ZSTFZMOiBTUEkgZmlmbyByZWNlcHRpb24gbGV2ZWwKKyAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0ZMQUdfXyAoVFJVRSBvciBGQUxTRSkuCisgKi8KKyNkZWZpbmUgX19IQUxfU1BJX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSBcCisgICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlNSKSAmIChfX0ZMQUdfXykpID09IChfX0ZMQUdfXykpCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBTUEkgQ1JDRVJSIHBlbmRpbmcgZmxhZy4KKyAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNQSSBIYW5kbGUuCisgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBTUEkgd2hlcmUgeDogMSwgMiwgb3IgMyB0byBzZWxlY3QgdGhlIFNQSQorICogcGVyaXBoZXJhbC4KKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX1NQSV9DTEVBUl9DUkNFUlJGTEFHKF9fSEFORExFX18pIFwKKyAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlNSID0gKHVpbnQxNl90KSh+U1BJX0ZMQUdfQ1JDRVJSKSkKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIFNQSSBNT0RGIHBlbmRpbmcgZmxhZy4KKyAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNQSSBIYW5kbGUuCisgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBTUEkgd2hlcmUgeDogMSwgMiwgb3IgMyB0byBzZWxlY3QgdGhlIFNQSQorICogcGVyaXBoZXJhbC4KKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX1NQSV9DTEVBUl9NT0RGRkxBRyhfX0hBTkRMRV9fKSAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19JTyB1aW50MzJfdCB0bXByZWdfbW9kZiA9IDB4MDBVOyAgICAgICAgICAgICAgICAgICBcCisgICAgdG1wcmVnX21vZGYgPSAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5TUjsgICAgICAgICAgICBcCisgICAgQ0xFQVJfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSwgU1BJX0NSMV9TUEUpOyBcCisgICAgVU5VU0VEKHRtcHJlZ19tb2RmKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDBVKQorCisvKiogQGJyaWVmICBDbGVhciB0aGUgU1BJIE9WUiBwZW5kaW5nIGZsYWcuCisgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTUEkgSGFuZGxlLgorICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgU1BJIHdoZXJlIHg6IDEsIDIsIG9yIDMgdG8gc2VsZWN0IHRoZSBTUEkKKyAqIHBlcmlwaGVyYWwuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9TUElfQ0xFQVJfT1ZSRkxBRyhfX0hBTkRMRV9fKSAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fSU8gdWludDMyX3QgdG1wcmVnX292ciA9IDB4MDBVOyAgICAgICAgXAorICAgIHRtcHJlZ19vdnIgPSAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5EUjsgXAorICAgIHRtcHJlZ19vdnIgPSAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5TUjsgXAorICAgIFVOVVNFRCh0bXByZWdfb3ZyKTsgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwVSkKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIFNQSSBGUkUgcGVuZGluZyBmbGFnLgorICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU1BJIEhhbmRsZS4KKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIFNQSSB3aGVyZSB4OiAxLCAyLCBvciAzIHRvIHNlbGVjdCB0aGUgU1BJCisgKiBwZXJpcGhlcmFsLgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfU1BJX0NMRUFSX0ZSRUZMQUcoX19IQU5ETEVfXykgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX0lPIHVpbnQzMl90IHRtcHJlZ19mcmUgPSAweDAwVTsgICAgICAgIFwKKyAgICB0bXByZWdfZnJlID0gKF9fSEFORExFX18pLT5JbnN0YW5jZS0+U1I7IFwKKyAgICBVTlVTRUQodG1wcmVnX2ZyZSk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMFUpCisKKy8qKiBAYnJpZWYgIEVuYWJsZSB0aGUgU1BJIHBlcmlwaGVyYWwuCisgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTUEkgSGFuZGxlLgorICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgU1BJIHdoZXJlIHg6IDEsIDIsIG9yIDMgdG8gc2VsZWN0IHRoZSBTUEkKKyAqIHBlcmlwaGVyYWwuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9TUElfRU5BQkxFKF9fSEFORExFX18pIFwKKyAgU0VUX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEsIFNQSV9DUjFfU1BFKQorCisvKiogQGJyaWVmICBEaXNhYmxlIHRoZSBTUEkgcGVyaXBoZXJhbC4KKyAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNQSSBIYW5kbGUuCisgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBTUEkgd2hlcmUgeDogMSwgMiwgb3IgMyB0byBzZWxlY3QgdGhlIFNQSQorICogcGVyaXBoZXJhbC4KKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX1NQSV9ESVNBQkxFKF9fSEFORExFX18pIFwKKyAgQ0xFQVJfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSwgU1BJX0NSMV9TUEUpCisKKy8qKgorICogQH0KKyAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBTUElfUHJpdmF0ZV9NYWNyb3MgU1BJIFByaXZhdGUgTWFjcm9zCisgKiBAeworICovCisKKy8qKiBAYnJpZWYgIFNldCB0aGUgU1BJIHRyYW5zbWl0LW9ubHkgbW9kZS4KKyAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNQSSBIYW5kbGUuCisgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBTUEkgd2hlcmUgeDogMSwgMiwgb3IgMyB0byBzZWxlY3QgdGhlIFNQSQorICogcGVyaXBoZXJhbC4KKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIFNQSV8xTElORV9UWChfX0hBTkRMRV9fKSBcCisgIFNFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxLCBTUElfQ1IxX0JJRElPRSkKKworLyoqIEBicmllZiAgU2V0IHRoZSBTUEkgcmVjZWl2ZS1vbmx5IG1vZGUuCisgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTUEkgSGFuZGxlLgorICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgU1BJIHdoZXJlIHg6IDEsIDIsIG9yIDMgdG8gc2VsZWN0IHRoZSBTUEkKKyAqIHBlcmlwaGVyYWwuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBTUElfMUxJTkVfUlgoX19IQU5ETEVfXykgXAorICBDTEVBUl9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxLCBTUElfQ1IxX0JJRElPRSkKKworLyoqIEBicmllZiAgUmVzZXQgdGhlIENSQyBjYWxjdWxhdGlvbiBvZiB0aGUgU1BJLgorICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU1BJIEhhbmRsZS4KKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIFNQSSB3aGVyZSB4OiAxLCAyLCBvciAzIHRvIHNlbGVjdCB0aGUgU1BJCisgKiBwZXJpcGhlcmFsLgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgU1BJX1JFU0VUX0NSQyhfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQ0xFQVJfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSwgU1BJX0NSMV9DUkNFTik7IFwKKyAgICBTRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSwgU1BJX0NSMV9DUkNFTik7ICAgXAorICB9IHdoaWxlICgwVSkKKworLyoqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIFNQSSBmbGFnIGlzIHNldCBvciBub3QuCisgKiBAcGFyYW0gIF9fU1JfXyAgY29weSBvZiBTUEkgU1IgcmVnaXN0ZXIuCisgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4KKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBTUElfRkxBR19SWE5FOiBSZWNlaXZlIGJ1ZmZlciBub3QgZW1wdHkgZmxhZworICogICAgICAgICAgICBAYXJnIFNQSV9GTEFHX1RYRTogVHJhbnNtaXQgYnVmZmVyIGVtcHR5IGZsYWcKKyAqICAgICAgICAgICAgQGFyZyBTUElfRkxBR19DUkNFUlI6IENSQyBlcnJvciBmbGFnCisgKiAgICAgICAgICAgIEBhcmcgU1BJX0ZMQUdfTU9ERjogTW9kZSBmYXVsdCBmbGFnCisgKiAgICAgICAgICAgIEBhcmcgU1BJX0ZMQUdfT1ZSOiBPdmVycnVuIGZsYWcKKyAqICAgICAgICAgICAgQGFyZyBTUElfRkxBR19CU1k6IEJ1c3kgZmxhZworICogICAgICAgICAgICBAYXJnIFNQSV9GTEFHX0ZSRTogRnJhbWUgZm9ybWF0IGVycm9yIGZsYWcKKyAqICAgICAgICAgICAgQGFyZyBTUElfRkxBR19GVExWTDogU1BJIGZpZm8gdHJhbnNtaXNzaW9uIGxldmVsCisgKiAgICAgICAgICAgIEBhcmcgU1BJX0ZMQUdfRlJMVkw6IFNQSSBmaWZvIHJlY2VwdGlvbiBsZXZlbAorICogQHJldHZhbCBTRVQgb3IgUkVTRVQuCisgKi8KKyNkZWZpbmUgU1BJX0NIRUNLX0ZMQUcoX19TUl9fLCBfX0ZMQUdfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKChfX1NSX18pICYgKChfX0ZMQUdfXykgJiBTUElfRkxBR19NQVNLKSkgPT0gKChfX0ZMQUdfXykgJiBTUElfRkxBR19NQVNLKSkgXAorICAgICAgID8gU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICA6IFJFU0VUKQorCisvKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgU1BJIEludGVycnVwdCBpcyBzZXQgb3Igbm90LgorICogQHBhcmFtICBfX0NSMl9fICBjb3B5IG9mIFNQSSBDUjIgcmVnaXN0ZXIuCisgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBTUEkgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjay4KKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBTUElfSVRfVFhFOiBUeCBidWZmZXIgZW1wdHkgaW50ZXJydXB0IGVuYWJsZQorICogICAgICAgICAgICBAYXJnIFNQSV9JVF9SWE5FOiBSWCBidWZmZXIgbm90IGVtcHR5IGludGVycnVwdCBlbmFibGUKKyAqICAgICAgICAgICAgQGFyZyBTUElfSVRfRVJSOiBFcnJvciBpbnRlcnJ1cHQgZW5hYmxlCisgKiBAcmV0dmFsIFNFVCBvciBSRVNFVC4KKyAqLworI2RlZmluZSBTUElfQ0hFQ0tfSVRfU09VUkNFKF9fQ1IyX18sIF9fSU5URVJSVVBUX18pIFwKKyAgKCgoKF9fQ1IyX18pICYgKF9fSU5URVJSVVBUX18pKSA9PSAoX19JTlRFUlJVUFRfXykpID8gU0VUIDogUkVTRVQpCisKKy8qKiBAYnJpZWYgIENoZWNrcyBpZiBTUEkgTW9kZSBwYXJhbWV0ZXIgaXMgaW4gYWxsb3dlZCByYW5nZS4KKyAqIEBwYXJhbSAgX19NT0RFX18gc3BlY2lmaWVzIHRoZSBTUEkgTW9kZS4KKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfTW9kZQorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgSVNfU1BJX01PREUoX19NT0RFX18pIFwKKyAgKCgoX19NT0RFX18pID09IFNQSV9NT0RFX1NMQVZFKSB8fCAoKF9fTU9ERV9fKSA9PSBTUElfTU9ERV9NQVNURVIpKQorCisvKiogQGJyaWVmICBDaGVja3MgaWYgU1BJIERpcmVjdGlvbiBNb2RlIHBhcmFtZXRlciBpcyBpbiBhbGxvd2VkIHJhbmdlLgorICogQHBhcmFtICBfX01PREVfXyBzcGVjaWZpZXMgdGhlIFNQSSBEaXJlY3Rpb24gTW9kZS4KKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfRGlyZWN0aW9uCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBJU19TUElfRElSRUNUSU9OKF9fTU9ERV9fKSAgICAgICAgICAgICAgICBcCisgICgoKF9fTU9ERV9fKSA9PSBTUElfRElSRUNUSU9OXzJMSU5FUykgfHwgICAgICAgIFwKKyAgICgoX19NT0RFX18pID09IFNQSV9ESVJFQ1RJT05fMkxJTkVTX1JYT05MWSkgfHwgXAorICAgKChfX01PREVfXykgPT0gU1BJX0RJUkVDVElPTl8xTElORSkpCisKKy8qKiBAYnJpZWYgIENoZWNrcyBpZiBTUEkgRGlyZWN0aW9uIE1vZGUgcGFyYW1ldGVyIGlzIDIgbGluZXMuCisgKiBAcGFyYW0gIF9fTU9ERV9fIHNwZWNpZmllcyB0aGUgU1BJIERpcmVjdGlvbiBNb2RlLgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgSVNfU1BJX0RJUkVDVElPTl8yTElORVMoX19NT0RFX18pICgoX19NT0RFX18pID09IFNQSV9ESVJFQ1RJT05fMkxJTkVTKQorCisvKiogQGJyaWVmICBDaGVja3MgaWYgU1BJIERpcmVjdGlvbiBNb2RlIHBhcmFtZXRlciBpcyAxIG9yIDIgbGluZXMuCisgKiBAcGFyYW0gIF9fTU9ERV9fIHNwZWNpZmllcyB0aGUgU1BJIERpcmVjdGlvbiBNb2RlLgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgSVNfU1BJX0RJUkVDVElPTl8yTElORVNfT1JfMUxJTkUoX19NT0RFX18pIFwKKyAgKCgoX19NT0RFX18pID09IFNQSV9ESVJFQ1RJT05fMkxJTkVTKSB8fCAoKF9fTU9ERV9fKSA9PSBTUElfRElSRUNUSU9OXzFMSU5FKSkKKworLyoqIEBicmllZiAgQ2hlY2tzIGlmIFNQSSBEYXRhIFNpemUgcGFyYW1ldGVyIGlzIGluIGFsbG93ZWQgcmFuZ2UuCisgKiBAcGFyYW0gIF9fREFUQVNJWkVfXyBzcGVjaWZpZXMgdGhlIFNQSSBEYXRhIFNpemUuCisgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU1BJX0RhdGFfU2l6ZQorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgSVNfU1BJX0RBVEFTSVpFKF9fREFUQVNJWkVfXykgICAgICAgIFwKKyAgKCgoX19EQVRBU0laRV9fKSA9PSBTUElfREFUQVNJWkVfMTZCSVQpIHx8IFwKKyAgICgoX19EQVRBU0laRV9fKSA9PSBTUElfREFUQVNJWkVfMTVCSVQpIHx8IFwKKyAgICgoX19EQVRBU0laRV9fKSA9PSBTUElfREFUQVNJWkVfMTRCSVQpIHx8IFwKKyAgICgoX19EQVRBU0laRV9fKSA9PSBTUElfREFUQVNJWkVfMTNCSVQpIHx8IFwKKyAgICgoX19EQVRBU0laRV9fKSA9PSBTUElfREFUQVNJWkVfMTJCSVQpIHx8IFwKKyAgICgoX19EQVRBU0laRV9fKSA9PSBTUElfREFUQVNJWkVfMTFCSVQpIHx8IFwKKyAgICgoX19EQVRBU0laRV9fKSA9PSBTUElfREFUQVNJWkVfMTBCSVQpIHx8IFwKKyAgICgoX19EQVRBU0laRV9fKSA9PSBTUElfREFUQVNJWkVfOUJJVCkgfHwgIFwKKyAgICgoX19EQVRBU0laRV9fKSA9PSBTUElfREFUQVNJWkVfOEJJVCkgfHwgIFwKKyAgICgoX19EQVRBU0laRV9fKSA9PSBTUElfREFUQVNJWkVfN0JJVCkgfHwgIFwKKyAgICgoX19EQVRBU0laRV9fKSA9PSBTUElfREFUQVNJWkVfNkJJVCkgfHwgIFwKKyAgICgoX19EQVRBU0laRV9fKSA9PSBTUElfREFUQVNJWkVfNUJJVCkgfHwgIFwKKyAgICgoX19EQVRBU0laRV9fKSA9PSBTUElfREFUQVNJWkVfNEJJVCkpCisKKy8qKiBAYnJpZWYgIENoZWNrcyBpZiBTUEkgU2VyaWFsIGNsb2NrIHN0ZWFkeSBzdGF0ZSBwYXJhbWV0ZXIgaXMgaW4gYWxsb3dlZAorICogcmFuZ2UuCisgKiBAcGFyYW0gIF9fQ1BPTF9fIHNwZWNpZmllcyB0aGUgU1BJIHNlcmlhbCBjbG9jayBzdGVhZHkgc3RhdGUuCisgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU1BJX0Nsb2NrX1BvbGFyaXR5CisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBJU19TUElfQ1BPTChfX0NQT0xfXykgXAorICAoKChfX0NQT0xfXykgPT0gU1BJX1BPTEFSSVRZX0xPVykgfHwgKChfX0NQT0xfXykgPT0gU1BJX1BPTEFSSVRZX0hJR0gpKQorCisvKiogQGJyaWVmICBDaGVja3MgaWYgU1BJIENsb2NrIFBoYXNlIHBhcmFtZXRlciBpcyBpbiBhbGxvd2VkIHJhbmdlLgorICogQHBhcmFtICBfX0NQSEFfXyBzcGVjaWZpZXMgdGhlIFNQSSBDbG9jayBQaGFzZS4KKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfQ2xvY2tfUGhhc2UKKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIElTX1NQSV9DUEhBKF9fQ1BIQV9fKSBcCisgICgoKF9fQ1BIQV9fKSA9PSBTUElfUEhBU0VfMUVER0UpIHx8ICgoX19DUEhBX18pID09IFNQSV9QSEFTRV8yRURHRSkpCisKKy8qKiBAYnJpZWYgIENoZWNrcyBpZiBTUEkgU2xhdmUgU2VsZWN0IHBhcmFtZXRlciBpcyBpbiBhbGxvd2VkIHJhbmdlLgorICogQHBhcmFtICBfX05TU19fIHNwZWNpZmllcyB0aGUgU1BJIFNsYXZlIFNlbGVjdCBtYW5hZ2VtZW50IHBhcmFtZXRlci4KKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfU2xhdmVfU2VsZWN0X21hbmFnZW1lbnQKKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIElTX1NQSV9OU1MoX19OU1NfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoX19OU1NfXykgPT0gU1BJX05TU19TT0ZUKSB8fCAoKF9fTlNTX18pID09IFNQSV9OU1NfSEFSRF9JTlBVVCkgfHwgXAorICAgKChfX05TU19fKSA9PSBTUElfTlNTX0hBUkRfT1VUUFVUKSkKKworLyoqIEBicmllZiAgQ2hlY2tzIGlmIFNQSSBOU1MgUHVsc2UgcGFyYW1ldGVyIGlzIGluIGFsbG93ZWQgcmFuZ2UuCisgKiBAcGFyYW0gIF9fTlNTUF9fIHNwZWNpZmllcyB0aGUgU1BJIE5TUyBQdWxzZSBNb2RlIHBhcmFtZXRlci4KKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfTlNTUF9Nb2RlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBJU19TUElfTlNTUChfX05TU1BfXykgICAgICAgICAgICAgIFwKKyAgKCgoX19OU1NQX18pID09IFNQSV9OU1NfUFVMU0VfRU5BQkxFKSB8fCBcCisgICAoKF9fTlNTUF9fKSA9PSBTUElfTlNTX1BVTFNFX0RJU0FCTEUpKQorCisvKiogQGJyaWVmICBDaGVja3MgaWYgU1BJIEJhdWRyYXRlIHByZXNjYWxlciBwYXJhbWV0ZXIgaXMgaW4gYWxsb3dlZCByYW5nZS4KKyAqIEBwYXJhbSAgX19QUkVTQ0FMRVJfXyBzcGVjaWZpZXMgdGhlIFNQSSBCYXVkcmF0ZSBwcmVzY2FsZXIuCisgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU1BJX0JhdWRSYXRlX1ByZXNjYWxlcgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgSVNfU1BJX0JBVURSQVRFX1BSRVNDQUxFUihfX1BSRVNDQUxFUl9fKSAgICAgXAorICAoKChfX1BSRVNDQUxFUl9fKSA9PSBTUElfQkFVRFJBVEVQUkVTQ0FMRVJfMikgfHwgICBcCisgICAoKF9fUFJFU0NBTEVSX18pID09IFNQSV9CQVVEUkFURVBSRVNDQUxFUl80KSB8fCAgIFwKKyAgICgoX19QUkVTQ0FMRVJfXykgPT0gU1BJX0JBVURSQVRFUFJFU0NBTEVSXzgpIHx8ICAgXAorICAgKChfX1BSRVNDQUxFUl9fKSA9PSBTUElfQkFVRFJBVEVQUkVTQ0FMRVJfMTYpIHx8ICBcCisgICAoKF9fUFJFU0NBTEVSX18pID09IFNQSV9CQVVEUkFURVBSRVNDQUxFUl8zMikgfHwgIFwKKyAgICgoX19QUkVTQ0FMRVJfXykgPT0gU1BJX0JBVURSQVRFUFJFU0NBTEVSXzY0KSB8fCAgXAorICAgKChfX1BSRVNDQUxFUl9fKSA9PSBTUElfQkFVRFJBVEVQUkVTQ0FMRVJfMTI4KSB8fCBcCisgICAoKF9fUFJFU0NBTEVSX18pID09IFNQSV9CQVVEUkFURVBSRVNDQUxFUl8yNTYpKQorCisvKiogQGJyaWVmICBDaGVja3MgaWYgU1BJIE1TQiBMU0IgdHJhbnNtaXNzaW9uIHBhcmFtZXRlciBpcyBpbiBhbGxvd2VkIHJhbmdlLgorICogQHBhcmFtICBfX0JJVF9fIHNwZWNpZmllcyB0aGUgU1BJIE1TQiBMU0IgdHJhbnNtaXNzaW9uICh3aGV0aGVyIGRhdGEgdHJhbnNmZXIKKyAqIHN0YXJ0cyBmcm9tIE1TQiBvciBMU0IgYml0KS4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICogU1BJX01TQl9MU0JfdHJhbnNtaXNzaW9uCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBJU19TUElfRklSU1RfQklUKF9fQklUX18pIFwKKyAgKCgoX19CSVRfXykgPT0gU1BJX0ZJUlNUQklUX01TQikgfHwgKChfX0JJVF9fKSA9PSBTUElfRklSU1RCSVRfTFNCKSkKKworLyoqIEBicmllZiAgQ2hlY2tzIGlmIFNQSSBUSSBtb2RlIHBhcmFtZXRlciBpcyBpbiBhbGxvd2VkIHJhbmdlLgorICogQHBhcmFtICBfX01PREVfXyBzcGVjaWZpZXMgdGhlIFNQSSBUSSBtb2RlLgorICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9USV9tb2RlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBJU19TUElfVElNT0RFKF9fTU9ERV9fKSBcCisgICgoKF9fTU9ERV9fKSA9PSBTUElfVElNT0RFX0RJU0FCTEUpIHx8ICgoX19NT0RFX18pID09IFNQSV9USU1PREVfRU5BQkxFKSkKKworLyoqIEBicmllZiAgQ2hlY2tzIGlmIFNQSSBDUkMgY2FsY3VsYXRpb24gZW5hYmxlZCBzdGF0ZSBpcyBpbiBhbGxvd2VkIHJhbmdlLgorICogQHBhcmFtICBfX0NBTENVTEFUSU9OX18gc3BlY2lmaWVzIHRoZSBTUEkgQ1JDIGNhbGN1bGF0aW9uIGVuYWJsZSBzdGF0ZS4KKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfQ1JDX0NhbGN1bGF0aW9uCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBJU19TUElfQ1JDX0NBTENVTEFUSU9OKF9fQ0FMQ1VMQVRJT05fXykgICAgICAgICBcCisgICgoKF9fQ0FMQ1VMQVRJT05fXykgPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0RJU0FCTEUpIHx8IFwKKyAgICgoX19DQUxDVUxBVElPTl9fKSA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKSkKKworLyoqIEBicmllZiAgQ2hlY2tzIGlmIFNQSSBDUkMgbGVuZ3RoIGlzIGluIGFsbG93ZWQgcmFuZ2UuCisgKiBAcGFyYW0gIF9fTEVOR1RIX18gc3BlY2lmaWVzIHRoZSBTUEkgQ1JDIGxlbmd0aC4KKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfQ1JDX2xlbmd0aAorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgSVNfU1BJX0NSQ19MRU5HVEgoX19MRU5HVEhfXykgICAgICAgICAgIFwKKyAgKCgoX19MRU5HVEhfXykgPT0gU1BJX0NSQ19MRU5HVEhfREFUQVNJWkUpIHx8IFwKKyAgICgoX19MRU5HVEhfXykgPT0gU1BJX0NSQ19MRU5HVEhfOEJJVCkgfHwgICAgIFwKKyAgICgoX19MRU5HVEhfXykgPT0gU1BJX0NSQ19MRU5HVEhfMTZCSVQpKQorCisvKiogQGJyaWVmICBDaGVja3MgaWYgU1BJIHBvbHlub21pYWwgdmFsdWUgdG8gYmUgdXNlZCBmb3IgdGhlIENSQyBjYWxjdWxhdGlvbiwKKyAqIGlzIGluIGFsbG93ZWQgcmFuZ2UuCisgKiBAcGFyYW0gIF9fUE9MWU5PTUlBTF9fIHNwZWNpZmllcyB0aGUgU1BJIHBvbHlub21pYWwgdmFsdWUgdG8gYmUgdXNlZCBmb3IgdGhlCisgKiBDUkMgY2FsY3VsYXRpb24uIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kCisgKiBNYXhfRGF0YSA9IDY1NTM1CisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBJU19TUElfQ1JDX1BPTFlOT01JQUwoX19QT0xZTk9NSUFMX18pICAgICAgICAgICAgICAgICAgICAgXAorICAoKChfX1BPTFlOT01JQUxfXykgPj0gMHgxVSkgJiYgKChfX1BPTFlOT01JQUxfXykgPD0gMHhGRkZGVSkgJiYgXAorICAgKCgoX19QT0xZTk9NSUFMX18pICYgMHgxVSkgIT0gMFUpKQorCisvKiogQGJyaWVmICBDaGVja3MgaWYgRE1BIGhhbmRsZSBpcyB2YWxpZC4KKyAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgYSBETUEgSGFuZGxlLgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgSVNfU1BJX0RNQV9IQU5ETEUoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKSAhPSBOVUxMKQorCisvKioKKyAqIEB9CisgKi8KKworLyogSW5jbHVkZSBTUEkgSEFMIEV4dGVuZGVkIG1vZHVsZSAqLworI2luY2x1ZGUgInN0bTMyZzR4eF9oYWxfc3BpX2V4LmgiCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgU1BJX0V4cG9ydGVkX0Z1bmN0aW9ucworICogQHsKKyAqLworCisvKiogQGFkZHRvZ3JvdXAgU1BJX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEKKyAqIEB7CisgKi8KKy8qIEluaXRpYWxpemF0aW9uL2RlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX0luaXQoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9EZUluaXQoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOwordm9pZCBIQUxfU1BJX01zcEluaXQoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOwordm9pZCBIQUxfU1BJX01zcERlSW5pdChTUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7CisKKy8qIENhbGxiYWNrcyBSZWdpc3Rlci9VblJlZ2lzdGVyIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgKFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfUmVnaXN0ZXJDYWxsYmFjayhTUElfSGFuZGxlVHlwZURlZiAqaHNwaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfU1BJX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNQSV9DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfVW5SZWdpc3RlckNhbGxiYWNrKAorICAgIFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLCBIQUxfU1BJX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpOworI2VuZGlmIC8qIFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAYWRkdG9ncm91cCBTUElfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMgorICogQHsKKyAqLworLyogSS9PIG9wZXJhdGlvbiBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfVHJhbnNtaXQoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lb3V0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfUmVjZWl2ZShTUElfSGFuZGxlVHlwZURlZiAqaHNwaSwgdWludDhfdCAqcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX1RyYW5zbWl0UmVjZWl2ZShTUElfSGFuZGxlVHlwZURlZiAqaHNwaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnBUeERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwUnhEYXRhLCB1aW50MTZfdCBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZW91dCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX1RyYW5zbWl0X0lUKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX1JlY2VpdmVfSVQoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGksIHVpbnQ4X3QgKnBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IFNpemUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9UcmFuc21pdFJlY2VpdmVfSVQoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpwVHhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcFJ4RGF0YSwgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX1RyYW5zbWl0X0RNQShTUElfSGFuZGxlVHlwZURlZiAqaHNwaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfUmVjZWl2ZV9ETUEoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGksIHVpbnQ4X3QgKnBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBTaXplKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfVHJhbnNtaXRSZWNlaXZlX0RNQShTUElfSGFuZGxlVHlwZURlZiAqaHNwaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpwVHhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBSeERhdGEsIHVpbnQxNl90IFNpemUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9ETUFQYXVzZShTUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX0RNQVJlc3VtZShTUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX0RNQVN0b3AoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOworLyogVHJhbnNmZXIgQWJvcnQgZnVuY3Rpb25zICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX0Fib3J0KFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfQWJvcnRfSVQoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOworCit2b2lkIEhBTF9TUElfSVJRSGFuZGxlcihTUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7Cit2b2lkIEhBTF9TUElfVHhDcGx0Q2FsbGJhY2soU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOwordm9pZCBIQUxfU1BJX1J4Q3BsdENhbGxiYWNrKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKK3ZvaWQgSEFMX1NQSV9UeFJ4Q3BsdENhbGxiYWNrKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKK3ZvaWQgSEFMX1NQSV9UeEhhbGZDcGx0Q2FsbGJhY2soU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOwordm9pZCBIQUxfU1BJX1J4SGFsZkNwbHRDYWxsYmFjayhTUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7Cit2b2lkIEhBTF9TUElfVHhSeEhhbGZDcGx0Q2FsbGJhY2soU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOwordm9pZCBIQUxfU1BJX0Vycm9yQ2FsbGJhY2soU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOwordm9pZCBIQUxfU1BJX0Fib3J0Q3BsdENhbGxiYWNrKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKKy8qKgorICogQH0KKyAqLworCisvKiogQGFkZHRvZ3JvdXAgU1BJX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMKKyAqIEB7CisgKi8KKy8qIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9yIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU1BJX1N0YXRlVHlwZURlZiBIQUxfU1BJX0dldFN0YXRlKGNvbnN0IFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKK3VpbnQzMl90IEhBTF9TUElfR2V0RXJyb3IoY29uc3QgU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMkc0eHhfSEFMX1NQSV9IICovCmRpZmYgLS1naXQgYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9oYWxfc3BpX2V4LmggYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9oYWxfc3BpX2V4LmgKaW5kZXggNTc1MzUzMC4uZTI5OTk3NyAxMDA2NDQKLS0tIGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfaGFsX3NwaV9leC5oCisrKyBiL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9JbmMvc3RtMzJnNHh4X2hhbF9zcGlfZXguaApAQCAtMSw3MiArMSw3MiBAQAotLyoqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEBmaWxlICAgIHN0bTMyZzR4eF9oYWxfc3BpX2V4LmgNCi0gKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQ0KLSAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFNQSSBIQUwgRXh0ZW5kZWQgbW9kdWxlLg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBAYXR0ZW50aW9uDQotICoNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQotICoNCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRlcm1zIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUNCi0gKiBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb2Z0d2FyZSBjb21wb25lbnQuDQotICogSWYgbm8gTElDRU5TRSBmaWxlIGNvbWVzIHdpdGggdGhpcyBzb2Z0d2FyZSwgaXQgaXMgcHJvdmlkZWQgQVMtSVMuDQotICoNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICovDQotDQotLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaWZuZGVmIFNUTTMyRzR4eF9IQUxfU1BJX0VYX0gNCi0jZGVmaW5lIFNUTTMyRzR4eF9IQUxfU1BJX0VYX0gNCi0NCi0jaWZkZWYgX19jcGx1c3BsdXMNCi1leHRlcm4gIkMiIHsNCi0jZW5kaWYNCi0NCi0vKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpbmNsdWRlICJzdG0zMmc0eHhfaGFsX2RlZi5oIg0KLQ0KLS8qKiBAYWRkdG9ncm91cCBTVE0zMkc0eHhfSEFMX0RyaXZlcg0KLSAqIEB7DQotICovDQotDQotLyoqIEBhZGR0b2dyb3VwIFNQSUV4DQotICogQHsNCi0gKi8NCi0NCi0vKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogRXhwb3J0ZWQgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAYWRkdG9ncm91cCBTUElFeF9FeHBvcnRlZF9GdW5jdGlvbnMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyogSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKiogQGFkZHRvZ3JvdXAgU1BJRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMQ0KLSAqIEB7DQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSUV4X0ZsdXNoUnhGaWZvKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLSNpZmRlZiBfX2NwbHVzcGx1cw0KLX0NCi0jZW5kaWYNCi0NCi0jZW5kaWYgLyogU1RNMzJHNHh4X0hBTF9TUElfRVhfSCAqLw0KKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGZpbGUgICAgc3RtMzJnNHh4X2hhbF9zcGlfZXguaAorICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFNQSSBIQUwgRXh0ZW5kZWQgbW9kdWxlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGF0dGVudGlvbgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGVybXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZQorICogaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc29mdHdhcmUgY29tcG9uZW50LgorICogSWYgbm8gTElDRU5TRSBmaWxlIGNvbWVzIHdpdGggdGhpcyBzb2Z0d2FyZSwgaXQgaXMgcHJvdmlkZWQgQVMtSVMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyRzR4eF9IQUxfU1BJX0VYX0gKKyNkZWZpbmUgU1RNMzJHNHh4X0hBTF9TUElfRVhfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnNHh4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzR4eF9IQUxfRHJpdmVyCisgKiBAeworICovCisKKy8qKiBAYWRkdG9ncm91cCBTUElFeAorICogQHsKKyAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFNQSUV4X0V4cG9ydGVkX0Z1bmN0aW9ucworICogQHsKKyAqLworCisvKiBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBAYWRkdG9ncm91cCBTUElFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxCisgKiBAeworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJRXhfRmx1c2hSeEZpZm8oY29uc3QgU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMkc0eHhfSEFMX1NQSV9FWF9IICovCmRpZmYgLS1naXQgYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9oYWxfdGltLmggYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9oYWxfdGltLmgKaW5kZXggYzkyYWFkNi4uN2Y2NDQwNyAxMDA2NDQKLS0tIGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfaGFsX3RpbS5oCisrKyBiL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9JbmMvc3RtMzJnNHh4X2hhbF90aW0uaApAQCAtMSwzMjkwICsxLDMyOTQgQEAKLS8qKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBAZmlsZSAgICBzdG0zMmc0eHhfaGFsX3RpbS5oDQotICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0NCi0gKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBUSU0gSEFMIG1vZHVsZS4NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQGF0dGVudGlvbg0KLSAqDQotICogQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KLSAqDQotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0ZXJtcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlDQotICogaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc29mdHdhcmUgY29tcG9uZW50Lg0KLSAqIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcyB3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLg0KLSAqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqLw0KLQ0KLS8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotI2lmbmRlZiBTVE0zMkc0eHhfSEFMX1RJTV9IDQotI2RlZmluZSBTVE0zMkc0eHhfSEFMX1RJTV9IDQotDQotI2lmZGVmIF9fY3BsdXNwbHVzDQotZXh0ZXJuICJDIiB7DQotI2VuZGlmDQotDQotLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaW5jbHVkZSAic3RtMzJnNHh4X2hhbF9kZWYuaCINCi0NCi0vKiogQGFkZHRvZ3JvdXAgU1RNMzJHNHh4X0hBTF9Ecml2ZXINCi0gKiBAew0KLSAqLw0KLQ0KLS8qKiBAYWRkdG9ncm91cCBUSU0NCi0gKiBAew0KLSAqLw0KLQ0KLS8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBkZWZncm91cCBUSU1fRXhwb3J0ZWRfVHlwZXMgVElNIEV4cG9ydGVkIFR5cGVzDQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFRJTSBUaW1lIGJhc2UgQ29uZmlndXJhdGlvbiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbg0KLSAqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gIHVpbnQzMl90DQotICAgICAgUHJlc2NhbGVyOyAvKiE8IFNwZWNpZmllcyB0aGUgcHJlc2NhbGVyIHZhbHVlIHVzZWQgdG8gZGl2aWRlIHRoZSBUSU0NCi0gICAgICAgICAgICAgICAgICAgIGNsb2NrLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9DQotICAgICAgICAgICAgICAgICAgICAweDAwMDAgYW5kIE1heF9EYXRhID0gMHhGRkZGIE1hY3JvIF9fSEFMX1RJTV9DQUxDX1BTQygpIGNhbg0KLSAgICAgICAgICAgICAgICAgICAgYmUgdXNlZCB0byBjYWxjdWxhdGUgcHJlc2NhbGVyIHZhbHVlICovDQotDQotICB1aW50MzJfdCBDb3VudGVyTW9kZTsgLyohPCBTcGVjaWZpZXMgdGhlIGNvdW50ZXIgbW9kZS4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fQ291bnRlcl9Nb2RlICovDQotDQotICB1aW50MzJfdA0KLSAgICAgIFBlcmlvZDsgLyohPCBTcGVjaWZpZXMgdGhlIHBlcmlvZCB2YWx1ZSB0byBiZSBsb2FkZWQgaW50byB0aGUgYWN0aXZlDQotICAgICAgICAgICAgICAgICAgIEF1dG8tUmVsb2FkIFJlZ2lzdGVyIGF0IHRoZSBuZXh0IHVwZGF0ZSBldmVudC4NCi0gICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAwMDAgYW5kDQotICAgICAgICAgICAgICAgICBNYXhfRGF0YSA9IDB4RkZGRiAob3IgMHhGRkVGIGlmIGRpdGhlcmluZyBpcyBhY3RpdmF0ZWQpTWFjcm9zDQotICAgICAgICAgICAgICAgICBfX0hBTF9USU1fQ0FMQ19QRVJJT0QoKSwNCi0gICAgICAgICAgICAgICAgICAgIF9fSEFMX1RJTV9DQUxDX1BFUklPRF9ESVRIRVIoKSxfX0hBTF9USU1fQ0FMQ19QRVJJT0RfQllfREVMQVkoKSwNCi0gICAgICAgICAgICAgICAgICAgIF9fSEFMX1RJTV9DQUxDX1BFUklPRF9ESVRIRVJfQllfREVMQVkoKWNhbiBiZSB1c2VkIHRvDQotICAgICAgICAgICAgICAgICBjYWxjdWxhdGUgUGVyaW9kIHZhbHVlICovDQotDQotICB1aW50MzJfdCBDbG9ja0RpdmlzaW9uOyAvKiE8IFNwZWNpZmllcyB0aGUgY2xvY2sgZGl2aXNpb24uDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9DbG9ja0RpdmlzaW9uICovDQotDQotICB1aW50MzJfdCBSZXBldGl0aW9uQ291bnRlcjsgLyohPCBTcGVjaWZpZXMgdGhlIHJlcGV0aXRpb24gY291bnRlciB2YWx1ZS4gRWFjaA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUgdGhlIFJDUiBkb3duY291bnRlciByZWFjaGVzIHplcm8sIGFuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlIGV2ZW50IGlzIGdlbmVyYXRlZCBhbmQgY291bnRpbmcgcmVzdGFydHMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHRoZSBSQ1IgdmFsdWUgKE4pLiBUaGlzIG1lYW5zIGluIFBXTSBtb2RlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCAoTisxKSBjb3JyZXNwb25kcyB0bzoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHRoZSBudW1iZXIgb2YgUFdNIHBlcmlvZHMgaW4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGdlLWFsaWduZWQgbW9kZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gdGhlIG51bWJlciBvZiBoYWxmIFBXTSBwZXJpb2QgaW4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXItYWxpZ25lZCBtb2RlIEdQIHRpbWVyczogdGhpcyBwYXJhbWV0ZXINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAwIGFuZA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heF9EYXRhID0gMHhGRi4gQWR2YW5jZWQgdGltZXJzOiB0aGlzDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwIGFuZCBNYXhfRGF0YSA9IDB4RkZGRi4gKi8NCi0NCi0gIHVpbnQzMl90IEF1dG9SZWxvYWRQcmVsb2FkOyAvKiE8IFNwZWNpZmllcyB0aGUgYXV0by1yZWxvYWQgcHJlbG9hZC4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9BdXRvUmVsb2FkUHJlbG9hZCAqLw0KLX0gVElNX0Jhc2VfSW5pdFR5cGVEZWY7DQotDQotLyoqDQotICogQGJyaWVmICBUSU0gT3V0cHV0IENvbXBhcmUgQ29uZmlndXJhdGlvbiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbg0KLSAqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gIHVpbnQzMl90IE9DTW9kZTsgLyohPCBTcGVjaWZpZXMgdGhlIFRJTSBtb2RlLg0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgVElNX091dHB1dF9Db21wYXJlX2FuZF9QV01fbW9kZXMgKi8NCi0NCi0gIHVpbnQzMl90IFB1bHNlOyAvKiE8IFNwZWNpZmllcyB0aGUgcHVsc2UgdmFsdWUgdG8gYmUgbG9hZGVkIGludG8gdGhlIENhcHR1cmUNCi0gICAgICAgICAgICAgICAgICAgICBDb21wYXJlIFJlZ2lzdGVyLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBudW1iZXIgYmV0d2Vlbg0KLSAgICAgICAgICAgICAgICAgICAgIE1pbl9EYXRhID0gMHgwMDAwIGFuZCBNYXhfRGF0YSA9IDB4RkZGRiAob3IgMHhGRkVGIGlmDQotICAgICAgICAgICAgICAgICAgICAgZGl0aGVyaW5nIGlzIGFjdGl2YXRlZCkgTWFjcm9zIF9fSEFMX1RJTV9DQUxDX1BVTFNFKCksDQotICAgICAgICAgICAgICAgICAgICAgX19IQUxfVElNX0NBTENfUFVMU0VfRElUSEVSKCkgY2FuIGJlIHVzZWQgdG8gY2FsY3VsYXRlDQotICAgICAgICAgICAgICAgICAgICAgICBQdWxzZSB2YWx1ZSAqLw0KLQ0KLSAgdWludDMyX3QgT0NQb2xhcml0eTsgLyohPCBTcGVjaWZpZXMgdGhlIG91dHB1dCBwb2xhcml0eS4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX091dHB1dF9Db21wYXJlX1BvbGFyaXR5ICovDQotDQotICB1aW50MzJfdCBPQ05Qb2xhcml0eTsgLyohPCBTcGVjaWZpZXMgdGhlIGNvbXBsZW1lbnRhcnkgb3V0cHV0IHBvbGFyaXR5Lg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9PdXRwdXRfQ29tcGFyZV9OX1BvbGFyaXR5DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBUaGlzIHBhcmFtZXRlciBpcyB2YWxpZCBvbmx5IGZvciB0aW1lcg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlcyBzdXBwb3J0aW5nIGJyZWFrIGZlYXR1cmUuICovDQotDQotICB1aW50MzJfdCBPQ0Zhc3RNb2RlOyAvKiE8IFNwZWNpZmllcyB0aGUgRmFzdCBtb2RlIHN0YXRlLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fT3V0cHV0X0Zhc3RfU3RhdGUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgVGhpcyBwYXJhbWV0ZXIgaXMgdmFsaWQgb25seSBpbiBQV00xIGFuZCBQV00yDQotICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlLiAqLw0KLQ0KLSAgdWludDMyX3QgT0NJZGxlU3RhdGU7IC8qITwgU3BlY2lmaWVzIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgcGluIHN0YXRlIGR1cmluZw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIElkbGUgc3RhdGUuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fT3V0cHV0X0NvbXBhcmVfSWRsZV9TdGF0ZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgVGhpcyBwYXJhbWV0ZXIgaXMgdmFsaWQgb25seSBmb3IgdGltZXINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZXMgc3VwcG9ydGluZyBicmVhayBmZWF0dXJlLiAqLw0KLQ0KLSAgdWludDMyX3QgT0NOSWRsZVN0YXRlOyAvKiE8IFNwZWNpZmllcyB0aGUgVElNIE91dHB1dCBDb21wYXJlIHBpbiBzdGF0ZSBkdXJpbmcNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRsZSBzdGF0ZS4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fT3V0cHV0X0NvbXBhcmVfTl9JZGxlX1N0YXRlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgVGhpcyBwYXJhbWV0ZXIgaXMgdmFsaWQgb25seSBmb3IgdGltZXINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VzIHN1cHBvcnRpbmcgYnJlYWsgZmVhdHVyZS4gKi8NCi19IFRJTV9PQ19Jbml0VHlwZURlZjsNCi0NCi0vKioNCi0gKiBAYnJpZWYgIFRJTSBPbmUgUHVsc2UgTW9kZSBDb25maWd1cmF0aW9uIFN0cnVjdHVyZSBkZWZpbml0aW9uDQotICovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgdWludDMyX3QgT0NNb2RlOyAvKiE8IFNwZWNpZmllcyB0aGUgVElNIG1vZGUuDQotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICBUSU1fT3V0cHV0X0NvbXBhcmVfYW5kX1BXTV9tb2RlcyAqLw0KLQ0KLSAgdWludDMyX3QgUHVsc2U7IC8qITwgU3BlY2lmaWVzIHRoZSBwdWxzZSB2YWx1ZSB0byBiZSBsb2FkZWQgaW50byB0aGUgQ2FwdHVyZQ0KLSAgICAgICAgICAgICAgICAgICAgIENvbXBhcmUgUmVnaXN0ZXIuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuDQotICAgICAgICAgICAgICAgICAgICAgTWluX0RhdGEgPSAweDAwMDAgYW5kIE1heF9EYXRhID0gMHhGRkZGIChvciAweEZGRUYgaWYNCi0gICAgICAgICAgICAgICAgICAgICBkaXRoZXJpbmcgaXMgYWN0aXZhdGVkKSBNYWNyb3MgX19IQUxfVElNX0NBTENfUFVMU0UoKSwNCi0gICAgICAgICAgICAgICAgICAgICBfX0hBTF9USU1fQ0FMQ19QVUxTRV9ESVRIRVIoKSBjYW4gYmUgdXNlZCB0byBjYWxjdWxhdGUNCi0gICAgICAgICAgICAgICAgICAgICAgIFB1bHNlIHZhbHVlICovDQotDQotICB1aW50MzJfdCBPQ1BvbGFyaXR5OyAvKiE8IFNwZWNpZmllcyB0aGUgb3V0cHV0IHBvbGFyaXR5Lg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fT3V0cHV0X0NvbXBhcmVfUG9sYXJpdHkgKi8NCi0NCi0gIHVpbnQzMl90IE9DTlBvbGFyaXR5OyAvKiE8IFNwZWNpZmllcyB0aGUgY29tcGxlbWVudGFyeSBvdXRwdXQgcG9sYXJpdHkuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX091dHB1dF9Db21wYXJlX05fUG9sYXJpdHkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIFRoaXMgcGFyYW1ldGVyIGlzIHZhbGlkIG9ubHkgZm9yIHRpbWVyDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VzIHN1cHBvcnRpbmcgYnJlYWsgZmVhdHVyZS4gKi8NCi0NCi0gIHVpbnQzMl90IE9DSWRsZVN0YXRlOyAvKiE8IFNwZWNpZmllcyB0aGUgVElNIE91dHB1dCBDb21wYXJlIHBpbiBzdGF0ZSBkdXJpbmcNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBJZGxlIHN0YXRlLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX091dHB1dF9Db21wYXJlX0lkbGVfU3RhdGUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIFRoaXMgcGFyYW1ldGVyIGlzIHZhbGlkIG9ubHkgZm9yIHRpbWVyDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VzIHN1cHBvcnRpbmcgYnJlYWsgZmVhdHVyZS4gKi8NCi0NCi0gIHVpbnQzMl90IE9DTklkbGVTdGF0ZTsgLyohPCBTcGVjaWZpZXMgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBwaW4gc3RhdGUgZHVyaW5nDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkbGUgc3RhdGUuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX091dHB1dF9Db21wYXJlX05fSWRsZV9TdGF0ZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIFRoaXMgcGFyYW1ldGVyIGlzIHZhbGlkIG9ubHkgZm9yIHRpbWVyDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlcyBzdXBwb3J0aW5nIGJyZWFrIGZlYXR1cmUuICovDQotDQotICB1aW50MzJfdCBJQ1BvbGFyaXR5OyAvKiE8IFNwZWNpZmllcyB0aGUgYWN0aXZlIGVkZ2Ugb2YgdGhlIGlucHV0IHNpZ25hbC4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX0lucHV0X0NhcHR1cmVfUG9sYXJpdHkgKi8NCi0NCi0gIHVpbnQzMl90IElDU2VsZWN0aW9uOyAvKiE8IFNwZWNpZmllcyB0aGUgaW5wdXQuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fSW5wdXRfQ2FwdHVyZV9TZWxlY3Rpb24gKi8NCi0NCi0gIHVpbnQzMl90IElDRmlsdGVyOyAvKiE8IFNwZWNpZmllcyB0aGUgaW5wdXQgY2FwdHVyZSBmaWx0ZXIuDQotICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwDQotICAgICAgICAgICAgICAgICAgICAgICAgYW5kIE1heF9EYXRhID0gMHhGICovDQotfSBUSU1fT25lUHVsc2VfSW5pdFR5cGVEZWY7DQotDQotLyoqDQotICogQGJyaWVmICBUSU0gSW5wdXQgQ2FwdHVyZSBDb25maWd1cmF0aW9uIFN0cnVjdHVyZSBkZWZpbml0aW9uDQotICovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgdWludDMyX3QgSUNQb2xhcml0eTsgLyohPCBTcGVjaWZpZXMgdGhlIGFjdGl2ZSBlZGdlIG9mIHRoZSBpbnB1dCBzaWduYWwuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9JbnB1dF9DYXB0dXJlX1BvbGFyaXR5ICovDQotDQotICB1aW50MzJfdCBJQ1NlbGVjdGlvbjsgLyohPCBTcGVjaWZpZXMgdGhlIGlucHV0Lg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9JbnB1dF9DYXB0dXJlX1NlbGVjdGlvbiAqLw0KLQ0KLSAgdWludDMyX3QgSUNQcmVzY2FsZXI7IC8qITwgU3BlY2lmaWVzIHRoZSBJbnB1dCBDYXB0dXJlIFByZXNjYWxlci4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fSW5wdXRfQ2FwdHVyZV9QcmVzY2FsZXIgKi8NCi0NCi0gIHVpbnQzMl90IElDRmlsdGVyOyAvKiE8IFNwZWNpZmllcyB0aGUgaW5wdXQgY2FwdHVyZSBmaWx0ZXIuDQotICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBNYXhfRGF0YSA9IDB4RiAqLw0KLX0gVElNX0lDX0luaXRUeXBlRGVmOw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgVElNIEVuY29kZXIgQ29uZmlndXJhdGlvbiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbg0KLSAqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gIHVpbnQzMl90IEVuY29kZXJNb2RlOyAvKiE8IFNwZWNpZmllcyB0aGUgYWN0aXZlIGVkZ2Ugb2YgdGhlIGlucHV0IHNpZ25hbC4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fRW5jb2Rlcl9Nb2RlICovDQotDQotICB1aW50MzJfdCBJQzFQb2xhcml0eTsgLyohPCBTcGVjaWZpZXMgdGhlIGFjdGl2ZSBlZGdlIG9mIHRoZSBpbnB1dCBzaWduYWwuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX0VuY29kZXJfSW5wdXRfUG9sYXJpdHkgKi8NCi0NCi0gIHVpbnQzMl90IElDMVNlbGVjdGlvbjsgLyohPCBTcGVjaWZpZXMgdGhlIGlucHV0Lg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX0lucHV0X0NhcHR1cmVfU2VsZWN0aW9uICovDQotDQotICB1aW50MzJfdCBJQzFQcmVzY2FsZXI7IC8qITwgU3BlY2lmaWVzIHRoZSBJbnB1dCBDYXB0dXJlIFByZXNjYWxlci4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9JbnB1dF9DYXB0dXJlX1ByZXNjYWxlciAqLw0KLQ0KLSAgdWludDMyX3QgSUMxRmlsdGVyOyAvKiE8IFNwZWNpZmllcyB0aGUgaW5wdXQgY2FwdHVyZSBmaWx0ZXIuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDANCi0gICAgICAgICAgICAgICAgICAgICAgICAgYW5kIE1heF9EYXRhID0gMHhGICovDQotDQotICB1aW50MzJfdCBJQzJQb2xhcml0eTsgLyohPCBTcGVjaWZpZXMgdGhlIGFjdGl2ZSBlZGdlIG9mIHRoZSBpbnB1dCBzaWduYWwuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX0VuY29kZXJfSW5wdXRfUG9sYXJpdHkgKi8NCi0NCi0gIHVpbnQzMl90IElDMlNlbGVjdGlvbjsgLyohPCBTcGVjaWZpZXMgdGhlIGlucHV0Lg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fSW5wdXRfQ2FwdHVyZV9TZWxlY3Rpb24gKi8NCi0NCi0gIHVpbnQzMl90IElDMlByZXNjYWxlcjsgLyohPCBTcGVjaWZpZXMgdGhlIElucHV0IENhcHR1cmUgUHJlc2NhbGVyLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX0lucHV0X0NhcHR1cmVfUHJlc2NhbGVyICovDQotDQotICB1aW50MzJfdCBJQzJGaWx0ZXI7IC8qITwgU3BlY2lmaWVzIHRoZSBpbnB1dCBjYXB0dXJlIGZpbHRlci4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgTWF4X0RhdGEgPSAweEYgKi8NCi19IFRJTV9FbmNvZGVyX0luaXRUeXBlRGVmOw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2xvY2sgQ29uZmlndXJhdGlvbiBIYW5kbGUgU3RydWN0dXJlIGRlZmluaXRpb24NCi0gKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICB1aW50MzJfdCBDbG9ja1NvdXJjZTsgICAgLyohPCBUSU0gY2xvY2sgc291cmNlcw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9DbG9ja19Tb3VyY2UgKi8NCi0gIHVpbnQzMl90IENsb2NrUG9sYXJpdHk7ICAvKiE8IFRJTSBjbG9jayBwb2xhcml0eQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9DbG9ja19Qb2xhcml0eSAqLw0KLSAgdWludDMyX3QgQ2xvY2tQcmVzY2FsZXI7IC8qITwgVElNIGNsb2NrIHByZXNjYWxlcg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9DbG9ja19QcmVzY2FsZXIgKi8NCi0gIHVpbnQzMl90IENsb2NrRmlsdGVyOyAgICAvKiE8IFRJTSBjbG9jayBmaWx0ZXINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAgYW5kIE1heF9EYXRhID0gMHhGICovDQotfSBUSU1fQ2xvY2tDb25maWdUeXBlRGVmOw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgVElNIENsZWFyIElucHV0IENvbmZpZ3VyYXRpb24gSGFuZGxlIFN0cnVjdHVyZSBkZWZpbml0aW9uDQotICovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgdWludDMyX3QgQ2xlYXJJbnB1dFN0YXRlOyAgICAgLyohPCBUSU0gY2xlYXIgSW5wdXQgc3RhdGUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIEVOQUJMRSBvciBESVNBQkxFICovDQotICB1aW50MzJfdCBDbGVhcklucHV0U291cmNlOyAgICAvKiE8IFRJTSBjbGVhciBJbnB1dCBzb3VyY2VzDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9DbGVhcklucHV0X1NvdXJjZSAqLw0KLSAgdWludDMyX3QgQ2xlYXJJbnB1dFBvbGFyaXR5OyAgLyohPCBUSU0gQ2xlYXIgSW5wdXQgcG9sYXJpdHkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX0NsZWFySW5wdXRfUG9sYXJpdHkgKi8NCi0gIHVpbnQzMl90IENsZWFySW5wdXRQcmVzY2FsZXI7IC8qITwgVElNIENsZWFyIElucHV0IHByZXNjYWxlcg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIDA6IFdoZW4gT0NSZWYgY2xlYXINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmUgaXMgdXNlZCB3aXRoIEVUUiBzb3VyY2UsIEVUUg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2NhbGVyIG11c3QgYmUgb2ZmICovDQotICB1aW50MzJfdCBDbGVhcklucHV0RmlsdGVyOyAgICAvKiE8IFRJTSBDbGVhciBJbnB1dCBmaWx0ZXINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgbnVtYmVyIGJldHdlZW4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pbl9EYXRhID0gMHgwIGFuZCBNYXhfRGF0YSA9IDB4RiAqLw0KLX0gVElNX0NsZWFySW5wdXRDb25maWdUeXBlRGVmOw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgVElNIE1hc3RlciBjb25maWd1cmF0aW9uIFN0cnVjdHVyZSBkZWZpbml0aW9uDQotICogQG5vdGUgICBBZHZhbmNlZCB0aW1lcnMgcHJvdmlkZSBUUkdPMiBpbnRlcm5hbCBsaW5lIHdoaWNoIGlzIHJlZGlyZWN0ZWQNCi0gKiAgICAgICAgIHRvIHRoZSBBREMNCi0gKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICB1aW50MzJfdCBNYXN0ZXJPdXRwdXRUcmlnZ2VyOyAgLyohPCBUcmlnZ2VyIG91dHB1dCAoVFJHTykgc2VsZWN0aW9uDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX01hc3Rlcl9Nb2RlX1NlbGVjdGlvbiAqLw0KLSAgdWludDMyX3QgTWFzdGVyT3V0cHV0VHJpZ2dlcjI7IC8qITwgVHJpZ2dlciBvdXRwdXQyIChUUkdPMikgc2VsZWN0aW9uDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX01hc3Rlcl9Nb2RlX1NlbGVjdGlvbl8yICovDQotICB1aW50MzJfdA0KLSAgICAgIE1hc3RlclNsYXZlTW9kZTsgLyohPCBNYXN0ZXIvc2xhdmUgbW9kZSBzZWxlY3Rpb24NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX01hc3Rlcl9TbGF2ZV9Nb2RlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIFdoZW4gdGhlIE1hc3Rlci9zbGF2ZSBtb2RlIGlzIGVuYWJsZWQsIHRoZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0IG9mIGFuIGV2ZW50IG9uIHRoZSB0cmlnZ2VyIGlucHV0IChUUkdJKSBpcw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXllZCB0byBhbGxvdyBhIHBlcmZlY3Qgc3luY2hyb25pemF0aW9uIGJldHdlZW4gdGhlDQotICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IHRpbWVyIGFuZCBpdHMgc2xhdmVzICh0aHJvdWdoIFRSR08pLiBJdCBpcyBub3QNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmRhdG9yeSBpbiBjYXNlIG9mIHRpbWVyIHN5bmNocm9uaXphdGlvbiBtb2RlLiAqLw0KLX0gVElNX01hc3RlckNvbmZpZ1R5cGVEZWY7DQotDQotLyoqDQotICogQGJyaWVmICBUSU0gU2xhdmUgY29uZmlndXJhdGlvbiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbg0KLSAqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gIHVpbnQzMl90DQotICAgICAgU2xhdmVNb2RlOyAgICAgICAgICAgICAvKiE8IFNsYXZlIG1vZGUgc2VsZWN0aW9uDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX1NsYXZlX01vZGUgKi8NCi0gIHVpbnQzMl90IElucHV0VHJpZ2dlcjsgICAgIC8qITwgSW5wdXQgVHJpZ2dlciBzb3VyY2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX1RyaWdnZXJfU2VsZWN0aW9uICovDQotICB1aW50MzJfdCBUcmlnZ2VyUG9sYXJpdHk7ICAvKiE8IElucHV0IFRyaWdnZXIgcG9sYXJpdHkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX1RyaWdnZXJfUG9sYXJpdHkgKi8NCi0gIHVpbnQzMl90IFRyaWdnZXJQcmVzY2FsZXI7IC8qITwgSW5wdXQgdHJpZ2dlciBwcmVzY2FsZXINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX1RyaWdnZXJfUHJlc2NhbGVyICovDQotICB1aW50MzJfdCBUcmlnZ2VyRmlsdGVyOyAgICAvKiE8IElucHV0IHRyaWdnZXIgZmlsdGVyDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MCBhbmQgTWF4X0RhdGEgPSAweEYgICovDQotDQotfSBUSU1fU2xhdmVDb25maWdUeXBlRGVmOw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgVElNIEJyZWFrIGlucHV0KHMpIGFuZCBEZWFkIHRpbWUgY29uZmlndXJhdGlvbiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbg0KLSAqIEBub3RlICAgMiBicmVhayBpbnB1dHMgY2FuIGJlIGNvbmZpZ3VyZWQgKEJLSU4gYW5kIEJLSU4yKSB3aXRoIGNvbmZpZ3VyYWJsZQ0KLSAqICAgICAgICBmaWx0ZXIgYW5kIHBvbGFyaXR5Lg0KLSAqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gIHVpbnQzMl90DQotICAgICAgT2ZmU3RhdGVSdW5Nb2RlOyAvKiE8IFRJTSBvZmYgc3RhdGUgaW4gcnVuIG1vZGUsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhDQotICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBvZiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fT1NTUl9PZmZfU3RhdGVfU2VsZWN0aW9uX2Zvcl9SdW5fbW9kZV9zdGF0ZSAqLw0KLQ0KLSAgdWludDMyX3QNCi0gICAgICBPZmZTdGF0ZUlETEVNb2RlOyAvKiE8IFRJTSBvZmYgc3RhdGUgaW4gSURMRSBtb2RlLCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fT1NTSV9PZmZfU3RhdGVfU2VsZWN0aW9uX2Zvcl9JZGxlX21vZGVfc3RhdGUgKi8NCi0NCi0gIHVpbnQzMl90IExvY2tMZXZlbDsgLyohPCBUSU0gTG9jayBsZXZlbCwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fTG9ja19sZXZlbCAqLw0KLQ0KLSAgdWludDMyX3QgRGVhZFRpbWU7IC8qITwgVElNIGRlYWQgVGltZSwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgbnVtYmVyIGJldHdlZW4NCi0gICAgICAgICAgICAgICAgICAgICAgICBNaW5fRGF0YSA9IDB4MDAgYW5kIE1heF9EYXRhID0gMHhGRiAqLw0KLQ0KLSAgdWludDMyX3QgQnJlYWtTdGF0ZTsgLyohPCBUSU0gQnJlYWsgU3RhdGUsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mDQotICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIFRJTV9CcmVha19JbnB1dF9lbmFibGVfZGlzYWJsZSAqLw0KLQ0KLSAgdWludDMyX3QgQnJlYWtQb2xhcml0eTsgLyohPCBUSU0gQnJlYWsgaW5wdXQgcG9sYXJpdHksIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBvZiBAcmVmIFRJTV9CcmVha19Qb2xhcml0eSAqLw0KLQ0KLSAgdWludDMyX3QNCi0gICAgICBCcmVha0ZpbHRlcjsgLyohPCBTcGVjaWZpZXMgdGhlIGJyZWFrIGlucHV0IGZpbHRlci5UaGlzIHBhcmFtZXRlciBjYW4gYmUgYQ0KLSAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MCBhbmQgTWF4X0RhdGEgPSAweEYgKi8NCi0NCi0gIHVpbnQzMl90IEJyZWFrQUZNb2RlOyAvKiE8IFNwZWNpZmllcyB0aGUgYWx0ZXJuYXRlIGZ1bmN0aW9uIG1vZGUgb2YgdGhlIGJyZWFrDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9CcmVha19JbnB1dF9BRl9Nb2RlICovDQotDQotICB1aW50MzJfdCBCcmVhazJTdGF0ZTsgLyohPCBUSU0gQnJlYWsyIFN0YXRlLCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgVElNX0JyZWFrMl9JbnB1dF9lbmFibGVfZGlzYWJsZSAqLw0KLQ0KLSAgdWludDMyX3QgQnJlYWsyUG9sYXJpdHk7IC8qITwgVElNIEJyZWFrMiBpbnB1dCBwb2xhcml0eSwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSB2YWx1ZSBvZiBAcmVmIFRJTV9CcmVhazJfUG9sYXJpdHkgKi8NCi0NCi0gIHVpbnQzMl90IEJyZWFrMkZpbHRlcjsgLyohPCBUSU0gYnJlYWsyIGlucHV0IGZpbHRlci5UaGlzIHBhcmFtZXRlciBjYW4gYmUgYQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MCBhbmQgTWF4X0RhdGEgPSAweEYgKi8NCi0NCi0gIHVpbnQzMl90IEJyZWFrMkFGTW9kZTsgLyohPCBTcGVjaWZpZXMgdGhlIGFsdGVybmF0ZSBmdW5jdGlvbiBtb2RlIG9mIHRoZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazIgaW5wdXQuVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fQnJlYWsyX0lucHV0X0FGX01vZGUgKi8NCi0NCi0gIHVpbnQzMl90DQotICAgICAgQXV0b21hdGljT3V0cHV0OyAvKiE8IFRJTSBBdXRvbWF0aWMgT3V0cHV0IEVuYWJsZSBzdGF0ZSwgVGhpcyBwYXJhbWV0ZXINCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0FPRV9CaXRfU2V0X1Jlc2V0ICovDQotDQotfSBUSU1fQnJlYWtEZWFkVGltZUNvbmZpZ1R5cGVEZWY7DQotDQotLyoqDQotICogQGJyaWVmICBIQUwgU3RhdGUgc3RydWN0dXJlcyBkZWZpbml0aW9uDQotICovDQotdHlwZWRlZiBlbnVtIHsNCi0gIEhBTF9USU1fU1RBVEVfUkVTRVQgPQ0KLSAgICAgIDB4MDBVLCAvKiE8IFBlcmlwaGVyYWwgbm90IHlldCBpbml0aWFsaXplZCBvciBkaXNhYmxlZCAgKi8NCi0gIEhBTF9USU1fU1RBVEVfUkVBRFkgPSAweDAxVSwgLyohPCBQZXJpcGhlcmFsIEluaXRpYWxpemVkIGFuZCByZWFkeSBmb3IgdXNlICovDQotICBIQUxfVElNX1NUQVRFX0JVU1kgPSAweDAyVSwgIC8qITwgQW4gaW50ZXJuYWwgcHJvY2VzcyBpcyBvbmdvaW5nICAqLw0KLSAgSEFMX1RJTV9TVEFURV9USU1FT1VUID0gMHgwM1UsIC8qITwgVGltZW91dCBzdGF0ZSAqLw0KLSAgSEFMX1RJTV9TVEFURV9FUlJPUiA9IDB4MDRVICAgIC8qITwgUmVjZXB0aW9uIHByb2Nlc3MgaXMgb25nb2luZyAgICAqLw0KLX0gSEFMX1RJTV9TdGF0ZVR5cGVEZWY7DQotDQotLyoqDQotICogQGJyaWVmICBUSU0gQ2hhbm5lbCBTdGF0ZXMgZGVmaW5pdGlvbg0KLSAqLw0KLXR5cGVkZWYgZW51bSB7DQotICBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVTRVQgPSAweDAwVSwgLyohPCBUSU0gQ2hhbm5lbCBpbml0aWFsIHN0YXRlICovDQotICBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkgPSAweDAxVSwgLyohPCBUSU0gQ2hhbm5lbCByZWFkeSBmb3IgdXNlICovDQotICBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSA9DQotICAgICAgMHgwMlUsIC8qITwgQW4gaW50ZXJuYWwgcHJvY2VzcyBpcyBvbmdvaW5nIG9uIHRoZSBUSU0gY2hhbm5lbCAqLw0KLX0gSEFMX1RJTV9DaGFubmVsU3RhdGVUeXBlRGVmOw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRE1BIEJ1cnN0IFN0YXRlcyBkZWZpbml0aW9uDQotICovDQotdHlwZWRlZiBlbnVtIHsNCi0gIEhBTF9ETUFfQlVSU1RfU1RBVEVfUkVTRVQgPSAweDAwVSwgLyohPCBETUEgQnVyc3QgaW5pdGlhbCBzdGF0ZSAqLw0KLSAgSEFMX0RNQV9CVVJTVF9TVEFURV9SRUFEWSA9IDB4MDFVLCAvKiE8IERNQSBCdXJzdCByZWFkeSBmb3IgdXNlICovDQotICBIQUxfRE1BX0JVUlNUX1NUQVRFX0JVU1kgPSAweDAyVSwgIC8qITwgT25nb2luZyBETUEgQnVyc3QgICAgICAgKi8NCi19IEhBTF9USU1fRE1BQnVyc3RTdGF0ZVR5cGVEZWY7DQotDQotLyoqDQotICogQGJyaWVmICBIQUwgQWN0aXZlIGNoYW5uZWwgc3RydWN0dXJlcyBkZWZpbml0aW9uDQotICovDQotdHlwZWRlZiBlbnVtIHsNCi0gIEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfMSA9IDB4MDFVLCAgICAgIC8qITwgVGhlIGFjdGl2ZSBjaGFubmVsIGlzIDEgICAgICovDQotICBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzIgPSAweDAyVSwgICAgICAvKiE8IFRoZSBhY3RpdmUgY2hhbm5lbCBpcyAyICAgICAqLw0KLSAgSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF8zID0gMHgwNFUsICAgICAgLyohPCBUaGUgYWN0aXZlIGNoYW5uZWwgaXMgMyAgICAgKi8NCi0gIEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfNCA9IDB4MDhVLCAgICAgIC8qITwgVGhlIGFjdGl2ZSBjaGFubmVsIGlzIDQgICAgICovDQotICBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzUgPSAweDEwVSwgICAgICAvKiE8IFRoZSBhY3RpdmUgY2hhbm5lbCBpcyA1ICAgICAqLw0KLSAgSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF82ID0gMHgyMFUsICAgICAgLyohPCBUaGUgYWN0aXZlIGNoYW5uZWwgaXMgNiAgICAgKi8NCi0gIEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfQ0xFQVJFRCA9IDB4MDBVIC8qITwgQWxsIGFjdGl2ZSBjaGFubmVscyBjbGVhcmVkICovDQotfSBIQUxfVElNX0FjdGl2ZUNoYW5uZWw7DQotDQotLyoqDQotICogQGJyaWVmICBUSU0gVGltZSBCYXNlIEhhbmRsZSBTdHJ1Y3R1cmUgZGVmaW5pdGlvbg0KLSAqLw0KLSNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpDQotdHlwZWRlZiBzdHJ1Y3QgX19USU1fSGFuZGxlVHlwZURlZg0KLSNlbHNlDQotdHlwZWRlZiBzdHJ1Y3QNCi0jZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotew0KLSAgVElNX1R5cGVEZWYgKkluc3RhbmNlOyAgICAgICAgIC8qITwgUmVnaXN0ZXIgYmFzZSBhZGRyZXNzICAgICAgICAgKi8NCi0gIFRJTV9CYXNlX0luaXRUeXBlRGVmIEluaXQ7ICAgICAvKiE8IFRJTSBUaW1lIEJhc2UgcmVxdWlyZWQgcGFyYW1ldGVycyAgICAgKi8NCi0gIEhBTF9USU1fQWN0aXZlQ2hhbm5lbCBDaGFubmVsOyAvKiE8IEFjdGl2ZSBjaGFubmVsICovDQotICBETUFfSGFuZGxlVHlwZURlZg0KLSAgICAgICpoZG1hWzddOyAgICAgICAgICAgICAgICAgICAgLyohPCBETUEgSGFuZGxlcnMgYXJyYXkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBhcnJheSBpcyBhY2Nlc3NlZCBieSBhIEByZWYgRE1BX0hhbmRsZV9pbmRleCAqLw0KLSAgSEFMX0xvY2tUeXBlRGVmIExvY2s7ICAgICAgICAgICAgLyohPCBMb2NraW5nIG9iamVjdCAgICAgICAgICAgICovDQotICBfX0lPIEhBTF9USU1fU3RhdGVUeXBlRGVmIFN0YXRlOyAvKiE8IFRJTSBvcGVyYXRpb24gc3RhdGUgKi8NCi0gIF9fSU8gSEFMX1RJTV9DaGFubmVsU3RhdGVUeXBlRGVmDQotICAgICAgQ2hhbm5lbFN0YXRlWzZdOyAvKiE8IFRJTSBjaGFubmVsIG9wZXJhdGlvbiBzdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gIF9fSU8gSEFMX1RJTV9DaGFubmVsU3RhdGVUeXBlRGVmDQotICAgICAgQ2hhbm5lbE5TdGF0ZVs0XTsgLyohPCBUSU0gY29tcGxlbWVudGFyeSBjaGFubmVsIG9wZXJhdGlvbiBzdGF0ZSAqLw0KLSAgX19JTyBIQUxfVElNX0RNQUJ1cnN0U3RhdGVUeXBlRGVmDQotICAgICAgRE1BQnVyc3RTdGF0ZTsgLyohPCBETUEgYnVyc3Qgb3BlcmF0aW9uIHN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICovDQotDQotI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkNCi0gIHZvaWQgKCpCYXNlX01zcEluaXRDYWxsYmFjaykoDQotICAgICAgc3RydWN0IF9fVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOyAvKiE8IFRJTSBCYXNlIE1zcCBJbml0IENhbGxiYWNrICovDQotICB2b2lkICgqQmFzZV9Nc3BEZUluaXRDYWxsYmFjaykoDQotICAgICAgc3RydWN0IF9fVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOyAvKiE8IFRJTSBCYXNlIE1zcCBEZUluaXQgQ2FsbGJhY2sgKi8NCi0gIHZvaWQgKCpJQ19Nc3BJbml0Q2FsbGJhY2spKA0KLSAgICAgIHN0cnVjdCBfX1RJTV9IYW5kbGVUeXBlRGVmICpodGltKTsgLyohPCBUSU0gSUMgTXNwIEluaXQgQ2FsbGJhY2sgKi8NCi0gIHZvaWQgKCpJQ19Nc3BEZUluaXRDYWxsYmFjaykoDQotICAgICAgc3RydWN0IF9fVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOyAvKiE8IFRJTSBJQyBNc3AgRGVJbml0IENhbGxiYWNrICovDQotICB2b2lkICgqT0NfTXNwSW5pdENhbGxiYWNrKSgNCi0gICAgICBzdHJ1Y3QgX19USU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7IC8qITwgVElNIE9DIE1zcCBJbml0IENhbGxiYWNrICovDQotICB2b2lkICgqT0NfTXNwRGVJbml0Q2FsbGJhY2spKA0KLSAgICAgIHN0cnVjdCBfX1RJTV9IYW5kbGVUeXBlRGVmICpodGltKTsgLyohPCBUSU0gT0MgTXNwIERlSW5pdCBDYWxsYmFjayAqLw0KLSAgdm9pZCAoKlBXTV9Nc3BJbml0Q2FsbGJhY2spKA0KLSAgICAgIHN0cnVjdCBfX1RJTV9IYW5kbGVUeXBlRGVmICpodGltKTsgLyohPCBUSU0gUFdNIE1zcCBJbml0IENhbGxiYWNrICovDQotICB2b2lkICgqUFdNX01zcERlSW5pdENhbGxiYWNrKSgNCi0gICAgICBzdHJ1Y3QgX19USU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7IC8qITwgVElNIFBXTSBNc3AgRGVJbml0IENhbGxiYWNrICovDQotICB2b2lkICgqT25lUHVsc2VfTXNwSW5pdENhbGxiYWNrKSgNCi0gICAgICBzdHJ1Y3QgX19USU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7IC8qITwgVElNIE9uZSBQdWxzZSBNc3AgSW5pdCBDYWxsYmFjayAqLw0KLSAgdm9pZCAoKk9uZVB1bHNlX01zcERlSW5pdENhbGxiYWNrKSgNCi0gICAgICBzdHJ1Y3QgX19USU1fSGFuZGxlVHlwZURlZg0KLSAgICAgICAgICAqaHRpbSk7IC8qITwgVElNIE9uZSBQdWxzZSBNc3AgRGVJbml0IENhbGxiYWNrICovDQotICB2b2lkICgqRW5jb2Rlcl9Nc3BJbml0Q2FsbGJhY2spKA0KLSAgICAgIHN0cnVjdCBfX1RJTV9IYW5kbGVUeXBlRGVmICpodGltKTsgLyohPCBUSU0gRW5jb2RlciBNc3AgSW5pdCBDYWxsYmFjayAqLw0KLSAgdm9pZCAoKkVuY29kZXJfTXNwRGVJbml0Q2FsbGJhY2spKA0KLSAgICAgIHN0cnVjdCBfX1RJTV9IYW5kbGVUeXBlRGVmICpodGltKTsgLyohPCBUSU0gRW5jb2RlciBNc3AgRGVJbml0IENhbGxiYWNrICovDQotICB2b2lkICgqSGFsbFNlbnNvcl9Nc3BJbml0Q2FsbGJhY2spKA0KLSAgICAgIHN0cnVjdCBfX1RJTV9IYW5kbGVUeXBlRGVmDQotICAgICAgICAgICpodGltKTsgLyohPCBUSU0gSGFsbCBTZW5zb3IgTXNwIEluaXQgQ2FsbGJhY2sgKi8NCi0gIHZvaWQgKCpIYWxsU2Vuc29yX01zcERlSW5pdENhbGxiYWNrKSgNCi0gICAgICBzdHJ1Y3QgX19USU1fSGFuZGxlVHlwZURlZg0KLSAgICAgICAgICAqaHRpbSk7IC8qITwgVElNIEhhbGwgU2Vuc29yIE1zcCBEZUluaXQgQ2FsbGJhY2sgKi8NCi0gIHZvaWQgKCpQZXJpb2RFbGFwc2VkQ2FsbGJhY2spKA0KLSAgICAgIHN0cnVjdCBfX1RJTV9IYW5kbGVUeXBlRGVmICpodGltKTsgLyohPCBUSU0gUGVyaW9kIEVsYXBzZWQgQ2FsbGJhY2sgKi8NCi0gIHZvaWQgKCpQZXJpb2RFbGFwc2VkSGFsZkNwbHRDYWxsYmFjaykoDQotICAgICAgc3RydWN0IF9fVElNX0hhbmRsZVR5cGVEZWYNCi0gICAgICAgICAgKmh0aW0pOyAvKiE8IFRJTSBQZXJpb2QgRWxhcHNlZCBoYWxmIGNvbXBsZXRlIENhbGxiYWNrICovDQotICB2b2lkICgqVHJpZ2dlckNhbGxiYWNrKSgNCi0gICAgICBzdHJ1Y3QgX19USU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7IC8qITwgVElNIFRyaWdnZXIgQ2FsbGJhY2sgKi8NCi0gIHZvaWQgKCpUcmlnZ2VySGFsZkNwbHRDYWxsYmFjaykoDQotICAgICAgc3RydWN0IF9fVElNX0hhbmRsZVR5cGVEZWYNCi0gICAgICAgICAgKmh0aW0pOyAvKiE8IFRJTSBUcmlnZ2VyIGhhbGYgY29tcGxldGUgQ2FsbGJhY2sgKi8NCi0gIHZvaWQgKCpJQ19DYXB0dXJlQ2FsbGJhY2spKA0KLSAgICAgIHN0cnVjdCBfX1RJTV9IYW5kbGVUeXBlRGVmICpodGltKTsgLyohPCBUSU0gSW5wdXQgQ2FwdHVyZSBDYWxsYmFjayAqLw0KLSAgdm9pZCAoKklDX0NhcHR1cmVIYWxmQ3BsdENhbGxiYWNrKSgNCi0gICAgICBzdHJ1Y3QgX19USU1fSGFuZGxlVHlwZURlZg0KLSAgICAgICAgICAqaHRpbSk7IC8qITwgVElNIElucHV0IENhcHR1cmUgaGFsZiBjb21wbGV0ZSBDYWxsYmFjayAqLw0KLSAgdm9pZCAoKk9DX0RlbGF5RWxhcHNlZENhbGxiYWNrKSgNCi0gICAgICBzdHJ1Y3QgX19USU1fSGFuZGxlVHlwZURlZg0KLSAgICAgICAgICAqaHRpbSk7IC8qITwgVElNIE91dHB1dCBDb21wYXJlIERlbGF5IEVsYXBzZWQgQ2FsbGJhY2sgKi8NCi0gIHZvaWQgKCpQV01fUHVsc2VGaW5pc2hlZENhbGxiYWNrKSgNCi0gICAgICBzdHJ1Y3QgX19USU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7IC8qITwgVElNIFBXTSBQdWxzZSBGaW5pc2hlZCBDYWxsYmFjayAqLw0KLSAgdm9pZCAoKlBXTV9QdWxzZUZpbmlzaGVkSGFsZkNwbHRDYWxsYmFjaykoDQotICAgICAgc3RydWN0IF9fVElNX0hhbmRsZVR5cGVEZWYNCi0gICAgICAgICAgKmh0aW0pOyAvKiE8IFRJTSBQV00gUHVsc2UgRmluaXNoZWQgaGFsZiBjb21wbGV0ZSBDYWxsYmFjayAqLw0KLSAgdm9pZCAoKkVycm9yQ2FsbGJhY2spKA0KLSAgICAgIHN0cnVjdCBfX1RJTV9IYW5kbGVUeXBlRGVmICpodGltKTsgLyohPCBUSU0gRXJyb3IgQ2FsbGJhY2sgKi8NCi0gIHZvaWQgKCpDb21tdXRhdGlvbkNhbGxiYWNrKSgNCi0gICAgICBzdHJ1Y3QgX19USU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7IC8qITwgVElNIENvbW11dGF0aW9uIENhbGxiYWNrICovDQotICB2b2lkICgqQ29tbXV0YXRpb25IYWxmQ3BsdENhbGxiYWNrKSgNCi0gICAgICBzdHJ1Y3QgX19USU1fSGFuZGxlVHlwZURlZg0KLSAgICAgICAgICAqaHRpbSk7IC8qITwgVElNIENvbW11dGF0aW9uIGhhbGYgY29tcGxldGUgQ2FsbGJhY2sgKi8NCi0gIHZvaWQgKCpCcmVha0NhbGxiYWNrKSgNCi0gICAgICBzdHJ1Y3QgX19USU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7IC8qITwgVElNIEJyZWFrIENhbGxiYWNrICovDQotICB2b2lkICgqQnJlYWsyQ2FsbGJhY2spKA0KLSAgICAgIHN0cnVjdCBfX1RJTV9IYW5kbGVUeXBlRGVmICpodGltKTsgLyohPCBUSU0gQnJlYWsyIENhbGxiYWNrICovDQotICB2b2lkICgqRW5jb2RlckluZGV4Q2FsbGJhY2spKA0KLSAgICAgIHN0cnVjdCBfX1RJTV9IYW5kbGVUeXBlRGVmICpodGltKTsgLyohPCBUSU0gRW5jb2RlciBJbmRleCBDYWxsYmFjayAqLw0KLSAgdm9pZCAoKkRpcmVjdGlvbkNoYW5nZUNhbGxiYWNrKSgNCi0gICAgICBzdHJ1Y3QgX19USU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7IC8qITwgVElNIERpcmVjdGlvbiBDaGFuZ2UgQ2FsbGJhY2sgKi8NCi0gIHZvaWQgKCpJbmRleEVycm9yQ2FsbGJhY2spKA0KLSAgICAgIHN0cnVjdCBfX1RJTV9IYW5kbGVUeXBlRGVmICpodGltKTsgLyohPCBUSU0gSW5kZXggRXJyb3IgQ2FsbGJhY2sgKi8NCi0gIHZvaWQgKCpUcmFuc2l0aW9uRXJyb3JDYWxsYmFjaykoDQotICAgICAgc3RydWN0IF9fVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOyAvKiE8IFRJTSBUcmFuc2l0aW9uIEVycm9yIENhbGxiYWNrICovDQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi19IFRJTV9IYW5kbGVUeXBlRGVmOw0KLQ0KLSNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpDQotLyoqDQotICogQGJyaWVmICBIQUwgVElNIENhbGxiYWNrIElEIGVudW1lcmF0aW9uIGRlZmluaXRpb24NCi0gKi8NCi10eXBlZGVmIGVudW0gew0KLSAgSEFMX1RJTV9CQVNFX01TUElOSVRfQ0JfSUQgPSAweDAwVSAvKiE8IFRJTSBCYXNlIE1zcEluaXQgQ2FsbGJhY2sgSUQgKi8NCi0gICwNCi0gIEhBTF9USU1fQkFTRV9NU1BERUlOSVRfQ0JfSUQgPSAweDAxVSAvKiE8IFRJTSBCYXNlIE1zcERlSW5pdCBDYWxsYmFjayBJRCAqLw0KLSAgLA0KLSAgSEFMX1RJTV9JQ19NU1BJTklUX0NCX0lEID0gMHgwMlUgLyohPCBUSU0gSUMgTXNwSW5pdCBDYWxsYmFjayBJRCAqLw0KLSAgLA0KLSAgSEFMX1RJTV9JQ19NU1BERUlOSVRfQ0JfSUQgPSAweDAzVSAvKiE8IFRJTSBJQyBNc3BEZUluaXQgQ2FsbGJhY2sgSUQgKi8NCi0gICwNCi0gIEhBTF9USU1fT0NfTVNQSU5JVF9DQl9JRCA9IDB4MDRVIC8qITwgVElNIE9DIE1zcEluaXQgQ2FsbGJhY2sgSUQgKi8NCi0gICwNCi0gIEhBTF9USU1fT0NfTVNQREVJTklUX0NCX0lEID0gMHgwNVUgLyohPCBUSU0gT0MgTXNwRGVJbml0IENhbGxiYWNrIElEICovDQotICAsDQotICBIQUxfVElNX1BXTV9NU1BJTklUX0NCX0lEID0gMHgwNlUgLyohPCBUSU0gUFdNIE1zcEluaXQgQ2FsbGJhY2sgSUQgKi8NCi0gICwNCi0gIEhBTF9USU1fUFdNX01TUERFSU5JVF9DQl9JRCA9IDB4MDdVIC8qITwgVElNIFBXTSBNc3BEZUluaXQgQ2FsbGJhY2sgSUQgKi8NCi0gICwNCi0gIEhBTF9USU1fT05FX1BVTFNFX01TUElOSVRfQ0JfSUQgPQ0KLSAgICAgIDB4MDhVIC8qITwgVElNIE9uZSBQdWxzZSBNc3BJbml0IENhbGxiYWNrIElEICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAsDQotICBIQUxfVElNX09ORV9QVUxTRV9NU1BERUlOSVRfQ0JfSUQgPQ0KLSAgICAgIDB4MDlVIC8qITwgVElNIE9uZSBQdWxzZSBNc3BEZUluaXQgQ2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgICAgICAgICovDQotICAsDQotICBIQUxfVElNX0VOQ09ERVJfTVNQSU5JVF9DQl9JRCA9IDB4MEFVIC8qITwgVElNIEVuY29kZXIgTXNwSW5pdCBDYWxsYmFjayBJRCAqLw0KLSAgLA0KLSAgSEFMX1RJTV9FTkNPREVSX01TUERFSU5JVF9DQl9JRCA9DQotICAgICAgMHgwQlUgLyohPCBUSU0gRW5jb2RlciBNc3BEZUluaXQgQ2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICwNCi0gIEhBTF9USU1fSEFMTF9TRU5TT1JfTVNQSU5JVF9DQl9JRCA9DQotICAgICAgMHgwQ1UgLyohPCBUSU0gSGFsbCBTZW5zb3IgTXNwRGVJbml0IENhbGxiYWNrIElEICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICwNCi0gIEhBTF9USU1fSEFMTF9TRU5TT1JfTVNQREVJTklUX0NCX0lEID0NCi0gICAgICAweDBEVSAvKiE8IFRJTSBIYWxsIFNlbnNvciBNc3BEZUluaXQgQ2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgLA0KLSAgSEFMX1RJTV9QRVJJT0RfRUxBUFNFRF9DQl9JRCA9IDB4MEVVIC8qITwgVElNIFBlcmlvZCBFbGFwc2VkIENhbGxiYWNrIElEICovDQotICAsDQotICBIQUxfVElNX1BFUklPRF9FTEFQU0VEX0hBTEZfQ0JfSUQgPQ0KLSAgICAgIDB4MEZVIC8qITwgVElNIFBlcmlvZCBFbGFwc2VkIGhhbGYgY29tcGxldGUgQ2FsbGJhY2sgSUQgICAgICAgICAgICAgICAqLw0KLSAgLA0KLSAgSEFMX1RJTV9UUklHR0VSX0NCX0lEID0gMHgxMFUgLyohPCBUSU0gVHJpZ2dlciBDYWxsYmFjayBJRCAqLw0KLSAgLA0KLSAgSEFMX1RJTV9UUklHR0VSX0hBTEZfQ0JfSUQgPQ0KLSAgICAgIDB4MTFVIC8qITwgVElNIFRyaWdnZXIgaGFsZiBjb21wbGV0ZSBDYWxsYmFjayBJRCAgICAgICAgICAgICAgICAgICAgICAqLw0KLQ0KLSAgLA0KLSAgSEFMX1RJTV9JQ19DQVBUVVJFX0NCX0lEID0gMHgxMlUgLyohPCBUSU0gSW5wdXQgQ2FwdHVyZSBDYWxsYmFjayBJRCAqLw0KLSAgLA0KLSAgSEFMX1RJTV9JQ19DQVBUVVJFX0hBTEZfQ0JfSUQgPQ0KLSAgICAgIDB4MTNVIC8qITwgVElNIElucHV0IENhcHR1cmUgaGFsZiBjb21wbGV0ZSBDYWxsYmFjayBJRCAgICAgICAgICAgICAgICAqLw0KLSAgLA0KLSAgSEFMX1RJTV9PQ19ERUxBWV9FTEFQU0VEX0NCX0lEID0NCi0gICAgICAweDE0VSAvKiE8IFRJTSBPdXRwdXQgQ29tcGFyZSBEZWxheSBFbGFwc2VkIENhbGxiYWNrIElEICAgICAgICAgICAgICAgKi8NCi0gICwNCi0gIEhBTF9USU1fUFdNX1BVTFNFX0ZJTklTSEVEX0NCX0lEID0NCi0gICAgICAweDE1VSAvKiE8IFRJTSBQV00gUHVsc2UgRmluaXNoZWQgQ2FsbGJhY2sgSUQgICAgICAgICAgICovDQotICAsDQotICBIQUxfVElNX1BXTV9QVUxTRV9GSU5JU0hFRF9IQUxGX0NCX0lEID0NCi0gICAgICAweDE2VSAvKiE8IFRJTSBQV00gUHVsc2UgRmluaXNoZWQgaGFsZiBjb21wbGV0ZSBDYWxsYmFjayBJRCAgICAgICAgICAgKi8NCi0gICwNCi0gIEhBTF9USU1fRVJST1JfQ0JfSUQgPSAweDE3VSAvKiE8IFRJTSBFcnJvciBDYWxsYmFjayBJRCAqLw0KLSAgLA0KLSAgSEFMX1RJTV9DT01NVVRBVElPTl9DQl9JRCA9IDB4MThVIC8qITwgVElNIENvbW11dGF0aW9uIENhbGxiYWNrIElEICovDQotICAsDQotICBIQUxfVElNX0NPTU1VVEFUSU9OX0hBTEZfQ0JfSUQgPQ0KLSAgICAgIDB4MTlVIC8qITwgVElNIENvbW11dGF0aW9uIGhhbGYgY29tcGxldGUgQ2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgICAqLw0KLSAgLA0KLSAgSEFMX1RJTV9CUkVBS19DQl9JRCA9IDB4MUFVIC8qITwgVElNIEJyZWFrIENhbGxiYWNrIElEICovDQotICAsDQotICBIQUxfVElNX0JSRUFLMl9DQl9JRCA9IDB4MUJVIC8qITwgVElNIEJyZWFrMiBDYWxsYmFjayBJRCAqLw0KLSAgLA0KLSAgSEFMX1RJTV9FTkNPREVSX0lOREVYX0NCX0lEID0gMHgxQ1UgLyohPCBUSU0gRW5jb2RlciBJbmRleCBDYWxsYmFjayBJRCAqLw0KLSAgLA0KLSAgSEFMX1RJTV9ESVJFQ1RJT05fQ0hBTkdFX0NCX0lEID0NCi0gICAgICAweDFEVSAvKiE8IFRJTSBEaXJlY3Rpb24gQ2hhbmdlIENhbGxiYWNrIElEICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICwNCi0gIEhBTF9USU1fSU5ERVhfRVJST1JfQ0JfSUQgPSAweDFFVSAvKiE8IFRJTSBJbmRleCBFcnJvciBDYWxsYmFjayBJRCAqLw0KLSAgLA0KLSAgSEFMX1RJTV9UUkFOU0lUSU9OX0VSUk9SX0NCX0lEID0NCi0gICAgICAweDFGVSAvKiE8IFRJTSBUcmFuc2l0aW9uIEVycm9yIENhbGxiYWNrIElEICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi19IEhBTF9USU1fQ2FsbGJhY2tJRFR5cGVEZWY7DQotDQotLyoqDQotICogQGJyaWVmICBIQUwgVElNIENhbGxiYWNrIHBvaW50ZXIgZGVmaW5pdGlvbg0KLSAqLw0KLXR5cGVkZWYgdm9pZCAoKnBUSU1fQ2FsbGJhY2tUeXBlRGVmKSgNCi0gICAgVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOyAvKiE8IHBvaW50ZXIgdG8gdGhlIFRJTSBjYWxsYmFjayBmdW5jdGlvbiAqLw0KLQ0KLSNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLS8qIEVuZCBvZiBleHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotDQotLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGRlZmdyb3VwIFRJTV9FeHBvcnRlZF9Db25zdGFudHMgVElNIEV4cG9ydGVkIENvbnN0YW50cw0KLSAqIEB7DQotICovDQotDQotLyoqIEBkZWZncm91cCBUSU1fQ2xlYXJJbnB1dF9Tb3VyY2UgVElNIENsZWFyIElucHV0IFNvdXJjZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBUSU1fQ0xFQVJJTlBVVFNPVVJDRV9OT05FIDB4RkZGRkZGRkZVIC8qITwgT0NSRUZfQ0xSIGlzIGRpc2FibGVkICovDQotI2RlZmluZSBUSU1fQ0xFQVJJTlBVVFNPVVJDRV9FVFIgXA0KLSAgMHgwMDAwMDAwMVUgLyohPCBPQ1JFRl9DTFIgaXMgY29ubmVjdGVkIHRvIEVUUkYgaW5wdXQgKi8NCi0jZGVmaW5lIFRJTV9DTEVBUklOUFVUU09VUkNFX0NPTVAxIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgT0NSRUZfQ0xSX0lOVCBpcyBjb25uZWN0ZWQgdG8gQ09NUDEgb3V0cHV0ICovDQotI2RlZmluZSBUSU1fQ0xFQVJJTlBVVFNPVVJDRV9DT01QMiBcDQotICBUSU0xX0FGMl9PQ1JTRUxfMCAvKiE8IE9DUkVGX0NMUl9JTlQgaXMgY29ubmVjdGVkIHRvIENPTVAyIG91dHB1dCAqLw0KLSNkZWZpbmUgVElNX0NMRUFSSU5QVVRTT1VSQ0VfQ09NUDMgXA0KLSAgVElNMV9BRjJfT0NSU0VMXzEgLyohPCBPQ1JFRl9DTFJfSU5UIGlzIGNvbm5lY3RlZCB0byBDT01QMyBvdXRwdXQgKi8NCi0jZGVmaW5lIFRJTV9DTEVBUklOUFVUU09VUkNFX0NPTVA0IFwNCi0gIChUSU0xX0FGMl9PQ1JTRUxfMSB8ICAgICAgICAgICAgIFwNCi0gICBUSU0xX0FGMl9PQ1JTRUxfMCkgLyohPCBPQ1JFRl9DTFJfSU5UIGlzIGNvbm5lY3RlZCB0byBDT01QNCBvdXRwdXQgKi8NCi0jaWYgZGVmaW5lZChDT01QNSkNCi0jZGVmaW5lIFRJTV9DTEVBUklOUFVUU09VUkNFX0NPTVA1IFwNCi0gIFRJTTFfQUYyX09DUlNFTF8yIC8qITwgT0NSRUZfQ0xSX0lOVCBpcyBjb25uZWN0ZWQgdG8gQ09NUDUgb3V0cHV0ICovDQotI2VuZGlmICAgICAgICAgICAgICAvKiBDT01QNSAqLw0KLSNpZiBkZWZpbmVkKENPTVA2KQ0KLSNkZWZpbmUgVElNX0NMRUFSSU5QVVRTT1VSQ0VfQ09NUDYgXA0KLSAgKFRJTTFfQUYyX09DUlNFTF8yIHwgICAgICAgICAgICAgXA0KLSAgIFRJTTFfQUYyX09DUlNFTF8wKSAvKiE8IE9DUkVGX0NMUl9JTlQgaXMgY29ubmVjdGVkIHRvIENPTVA2IG91dHB1dCAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgICAvKiBDT01QNiAqLw0KLSNpZiBkZWZpbmVkKENPTVA3KQ0KLSNkZWZpbmUgVElNX0NMRUFSSU5QVVRTT1VSQ0VfQ09NUDcgXA0KLSAgKFRJTTFfQUYyX09DUlNFTF8yIHwgICAgICAgICAgICAgXA0KLSAgIFRJTTFfQUYyX09DUlNFTF8xKSAvKiE8IE9DUkVGX0NMUl9JTlQgaXMgY29ubmVjdGVkIHRvIENPTVA3IG91dHB1dCAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgICAvKiBDT01QNyAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBUSU1fRE1BX0Jhc2VfYWRkcmVzcyBUSU0gRE1BIEJhc2UgQWRkcmVzcw0KLSAqIEB7DQotICovDQotI2RlZmluZSBUSU1fRE1BQkFTRV9DUjEgMHgwMDAwMDAwMFUNCi0jZGVmaW5lIFRJTV9ETUFCQVNFX0NSMiAweDAwMDAwMDAxVQ0KLSNkZWZpbmUgVElNX0RNQUJBU0VfU01DUiAweDAwMDAwMDAyVQ0KLSNkZWZpbmUgVElNX0RNQUJBU0VfRElFUiAweDAwMDAwMDAzVQ0KLSNkZWZpbmUgVElNX0RNQUJBU0VfU1IgMHgwMDAwMDAwNFUNCi0jZGVmaW5lIFRJTV9ETUFCQVNFX0VHUiAweDAwMDAwMDA1VQ0KLSNkZWZpbmUgVElNX0RNQUJBU0VfQ0NNUjEgMHgwMDAwMDAwNlUNCi0jZGVmaW5lIFRJTV9ETUFCQVNFX0NDTVIyIDB4MDAwMDAwMDdVDQotI2RlZmluZSBUSU1fRE1BQkFTRV9DQ0VSIDB4MDAwMDAwMDhVDQotI2RlZmluZSBUSU1fRE1BQkFTRV9DTlQgMHgwMDAwMDAwOVUNCi0jZGVmaW5lIFRJTV9ETUFCQVNFX1BTQyAweDAwMDAwMDBBVQ0KLSNkZWZpbmUgVElNX0RNQUJBU0VfQVJSIDB4MDAwMDAwMEJVDQotI2RlZmluZSBUSU1fRE1BQkFTRV9SQ1IgMHgwMDAwMDAwQ1UNCi0jZGVmaW5lIFRJTV9ETUFCQVNFX0NDUjEgMHgwMDAwMDAwRFUNCi0jZGVmaW5lIFRJTV9ETUFCQVNFX0NDUjIgMHgwMDAwMDAwRVUNCi0jZGVmaW5lIFRJTV9ETUFCQVNFX0NDUjMgMHgwMDAwMDAwRlUNCi0jZGVmaW5lIFRJTV9ETUFCQVNFX0NDUjQgMHgwMDAwMDAxMFUNCi0jZGVmaW5lIFRJTV9ETUFCQVNFX0JEVFIgMHgwMDAwMDAxMVUNCi0jZGVmaW5lIFRJTV9ETUFCQVNFX0NDUjUgMHgwMDAwMDAxMlUNCi0jZGVmaW5lIFRJTV9ETUFCQVNFX0NDUjYgMHgwMDAwMDAxM1UNCi0jZGVmaW5lIFRJTV9ETUFCQVNFX0NDTVIzIDB4MDAwMDAwMTRVDQotI2RlZmluZSBUSU1fRE1BQkFTRV9EVFIyIDB4MDAwMDAwMTVVDQotI2RlZmluZSBUSU1fRE1BQkFTRV9FQ1IgMHgwMDAwMDAxNlUNCi0jZGVmaW5lIFRJTV9ETUFCQVNFX1RJU0VMIDB4MDAwMDAwMTdVDQotI2RlZmluZSBUSU1fRE1BQkFTRV9BRjEgMHgwMDAwMDAxOFUNCi0jZGVmaW5lIFRJTV9ETUFCQVNFX0FGMiAweDAwMDAwMDE5VQ0KLSNkZWZpbmUgVElNX0RNQUJBU0VfT1IgMHgwMDAwMDAxQVUNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0V2ZW50X1NvdXJjZSBUSU0gRXZlbnQgU291cmNlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFRJTV9FVkVOVFNPVVJDRV9VUERBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIFRJTV9FR1JfVUcgLyohPCBSZWluaXRpYWxpemUgdGhlIGNvdW50ZXIgYW5kIGdlbmVyYXRlcyBhbiB1cGRhdGUgb2YgdGhlIFwNCi0gICAgICAgICAgICAgICAgcmVnaXN0ZXJzICovDQotI2RlZmluZSBUSU1fRVZFTlRTT1VSQ0VfQ0MxIFwNCi0gIFRJTV9FR1JfQ0MxRyAvKiE8IEEgY2FwdHVyZS9jb21wYXJlIGV2ZW50IGlzIGdlbmVyYXRlZCBvbiBjaGFubmVsIDEgKi8NCi0jZGVmaW5lIFRJTV9FVkVOVFNPVVJDRV9DQzIgXA0KLSAgVElNX0VHUl9DQzJHIC8qITwgQSBjYXB0dXJlL2NvbXBhcmUgZXZlbnQgaXMgZ2VuZXJhdGVkIG9uIGNoYW5uZWwgMiAqLw0KLSNkZWZpbmUgVElNX0VWRU5UU09VUkNFX0NDMyBcDQotICBUSU1fRUdSX0NDM0cgLyohPCBBIGNhcHR1cmUvY29tcGFyZSBldmVudCBpcyBnZW5lcmF0ZWQgb24gY2hhbm5lbCAzICovDQotI2RlZmluZSBUSU1fRVZFTlRTT1VSQ0VfQ0M0IFwNCi0gIFRJTV9FR1JfQ0M0RyAvKiE8IEEgY2FwdHVyZS9jb21wYXJlIGV2ZW50IGlzIGdlbmVyYXRlZCBvbiBjaGFubmVsIDQgKi8NCi0jZGVmaW5lIFRJTV9FVkVOVFNPVVJDRV9DT00gXA0KLSAgVElNX0VHUl9DT01HIC8qITwgQSBjb21tdXRhdGlvbiBldmVudCBpcyBnZW5lcmF0ZWQgKi8NCi0jZGVmaW5lIFRJTV9FVkVOVFNPVVJDRV9UUklHR0VSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBUSU1fRUdSX1RHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEEgdHJpZ2dlciBldmVudCBpcyBnZW5lcmF0ZWQgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBUSU1fRVZFTlRTT1VSQ0VfQlJFQUsgVElNX0VHUl9CRyAvKiE8IEEgYnJlYWsgZXZlbnQgaXMgZ2VuZXJhdGVkICovDQotI2RlZmluZSBUSU1fRVZFTlRTT1VSQ0VfQlJFQUsyICAgICAgICAgICAgICAgICAgXA0KLSAgVElNX0VHUl9CMkcgLyohPCBBIGJyZWFrIDIgZXZlbnQgaXMgZ2VuZXJhdGVkIFwNCi0gICAgICAgICAgICAgICAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBUSU1fSW5wdXRfQ2hhbm5lbF9Qb2xhcml0eSBUSU0gSW5wdXQgQ2hhbm5lbCBwb2xhcml0eQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBUSU1fSU5QVVRDSEFOTkVMUE9MQVJJVFlfUklTSU5HIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgUG9sYXJpdHkgZm9yIFRJeCBzb3VyY2UgKi8NCi0jZGVmaW5lIFRJTV9JTlBVVENIQU5ORUxQT0xBUklUWV9GQUxMSU5HIFwNCi0gIFRJTV9DQ0VSX0NDMVAgLyohPCBQb2xhcml0eSBmb3IgVEl4IHNvdXJjZSAqLw0KLSNkZWZpbmUgVElNX0lOUFVUQ0hBTk5FTFBPTEFSSVRZX0JPVEhFREdFIFwNCi0gIChUSU1fQ0NFUl9DQzFQIHwgVElNX0NDRVJfQ0MxTlApIC8qITwgUG9sYXJpdHkgZm9yIFRJeCBzb3VyY2UgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0VUUl9Qb2xhcml0eSBUSU0gRVRSIFBvbGFyaXR5DQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFRJTV9FVFJQT0xBUklUWV9JTlZFUlRFRCBUSU1fU01DUl9FVFAgLyohPCBQb2xhcml0eSBmb3IgRVRSIHNvdXJjZSAqLw0KLSNkZWZpbmUgVElNX0VUUlBPTEFSSVRZX05PTklOVkVSVEVEICAgICAgICBcDQotICAweDAwMDAwMDAwVSAvKiE8IFBvbGFyaXR5IGZvciBFVFIgc291cmNlIFwNCi0gICAgICAgICAgICAgICAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBUSU1fRVRSX1ByZXNjYWxlciBUSU0gRVRSIFByZXNjYWxlcg0KLSAqIEB7DQotICovDQotI2RlZmluZSBUSU1fRVRSUFJFU0NBTEVSX0RJVjEgMHgwMDAwMDAwMFUgLyohPCBObyBwcmVzY2FsZXIgaXMgdXNlZCAqLw0KLSNkZWZpbmUgVElNX0VUUlBSRVNDQUxFUl9ESVYyIFwNCi0gIFRJTV9TTUNSX0VUUFNfMCAvKiE8IEVUUiBpbnB1dCBzb3VyY2UgaXMgZGl2aWRlZCBieSAyICovDQotI2RlZmluZSBUSU1fRVRSUFJFU0NBTEVSX0RJVjQgXA0KLSAgVElNX1NNQ1JfRVRQU18xIC8qITwgRVRSIGlucHV0IHNvdXJjZSBpcyBkaXZpZGVkIGJ5IDQgKi8NCi0jZGVmaW5lIFRJTV9FVFJQUkVTQ0FMRVJfRElWOCBcDQotICBUSU1fU01DUl9FVFBTIC8qITwgRVRSIGlucHV0IHNvdXJjZSBpcyBkaXZpZGVkIGJ5IDggKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0NvdW50ZXJfTW9kZSBUSU0gQ291bnRlciBNb2RlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFRJTV9DT1VOVEVSTU9ERV9VUCAweDAwMDAwMDAwVSAgIC8qITwgQ291bnRlciB1c2VkIGFzIHVwLWNvdW50ZXIgICAqLw0KLSNkZWZpbmUgVElNX0NPVU5URVJNT0RFX0RPV04gVElNX0NSMV9ESVIgLyohPCBDb3VudGVyIHVzZWQgYXMgZG93bi1jb3VudGVyICovDQotI2RlZmluZSBUSU1fQ09VTlRFUk1PREVfQ0VOVEVSQUxJR05FRDEgXA0KLSAgVElNX0NSMV9DTVNfMCAvKiE8IENlbnRlci1hbGlnbmVkIG1vZGUgMSAgICAgICAgKi8NCi0jZGVmaW5lIFRJTV9DT1VOVEVSTU9ERV9DRU5URVJBTElHTkVEMiBcDQotICBUSU1fQ1IxX0NNU18xIC8qITwgQ2VudGVyLWFsaWduZWQgbW9kZSAyICAgICAgICAqLw0KLSNkZWZpbmUgVElNX0NPVU5URVJNT0RFX0NFTlRFUkFMSUdORUQzIFwNCi0gIFRJTV9DUjFfQ01TIC8qITwgQ2VudGVyLWFsaWduZWQgbW9kZSAzICAgICAgICAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBUSU1fVXBkYXRlX0ludGVycnVwdF9GbGFnX1JlbWFwIFRJTSBVcGRhdGUgSW50ZXJydXB0IEZsYWcgUmVtYXANCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgVElNX1VJRlJFTUFQX0RJU0FCTEUgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBVcGRhdGUgaW50ZXJydXB0IGZsYWcgcmVtYXAgZGlzYWJsZWQgKi8NCi0jZGVmaW5lIFRJTV9VSUZSRU1BUF9FTkFCTEUgXA0KLSAgVElNX0NSMV9VSUZSRU1BUCAvKiE8IFVwZGF0ZSBpbnRlcnJ1cHQgZmxhZyByZW1hcCBlbmFibGVkICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9DbG9ja0RpdmlzaW9uIFRJTSBDbG9jayBEaXZpc2lvbg0KLSAqIEB7DQotICovDQotI2RlZmluZSBUSU1fQ0xPQ0tESVZJU0lPTl9ESVYxIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgQ2xvY2sgZGl2aXNpb246IHREVFM9dENLX0lOVCAgICovDQotI2RlZmluZSBUSU1fQ0xPQ0tESVZJU0lPTl9ESVYyIFwNCi0gIFRJTV9DUjFfQ0tEXzAgLyohPCBDbG9jayBkaXZpc2lvbjogdERUUz0yKnRDS19JTlQgKi8NCi0jZGVmaW5lIFRJTV9DTE9DS0RJVklTSU9OX0RJVjQgXA0KLSAgVElNX0NSMV9DS0RfMSAvKiE8IENsb2NrIGRpdmlzaW9uOiB0RFRTPTQqdENLX0lOVCAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBUSU1fT3V0cHV0X0NvbXBhcmVfU3RhdGUgVElNIE91dHB1dCBDb21wYXJlIFN0YXRlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFRJTV9PVVRQVVRTVEFURV9ESVNBQkxFIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgQ2FwdHVyZS9Db21wYXJlIDEgb3V0cHV0IGRpc2FibGVkICovDQotI2RlZmluZSBUSU1fT1VUUFVUU1RBVEVfRU5BQkxFIFwNCi0gIFRJTV9DQ0VSX0NDMUUgLyohPCBDYXB0dXJlL0NvbXBhcmUgMSBvdXRwdXQgZW5hYmxlZCAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBUSU1fQXV0b1JlbG9hZFByZWxvYWQgVElNIEF1dG8tUmVsb2FkIFByZWxvYWQNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgVElNX0FVVE9SRUxPQURfUFJFTE9BRF9ESVNBQkxFIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgVElNeF9BUlIgcmVnaXN0ZXIgaXMgbm90IGJ1ZmZlcmVkICovDQotI2RlZmluZSBUSU1fQVVUT1JFTE9BRF9QUkVMT0FEX0VOQUJMRSBcDQotICBUSU1fQ1IxX0FSUEUgLyohPCBUSU14X0FSUiByZWdpc3RlciBpcyBidWZmZXJlZCAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBUSU1fT3V0cHV0X0Zhc3RfU3RhdGUgVElNIE91dHB1dCBGYXN0IFN0YXRlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFRJTV9PQ0ZBU1RfRElTQUJMRSAweDAwMDAwMDAwVSAgICAvKiE8IE91dHB1dCBDb21wYXJlIGZhc3QgZGlzYWJsZSAqLw0KLSNkZWZpbmUgVElNX09DRkFTVF9FTkFCTEUgVElNX0NDTVIxX09DMUZFIC8qITwgT3V0cHV0IENvbXBhcmUgZmFzdCBlbmFibGUgICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9PdXRwdXRfQ29tcGFyZV9OX1N0YXRlIFRJTSBDb21wbGVtZW50YXJ5IE91dHB1dCBDb21wYXJlIFN0YXRlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFRJTV9PVVRQVVROU1RBVEVfRElTQUJMRSAweDAwMDAwMDAwVSAgIC8qITwgT0N4TiBpcyBkaXNhYmxlZCAgKi8NCi0jZGVmaW5lIFRJTV9PVVRQVVROU1RBVEVfRU5BQkxFIFRJTV9DQ0VSX0NDMU5FIC8qITwgT0N4TiBpcyBlbmFibGVkICAgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX091dHB1dF9Db21wYXJlX1BvbGFyaXR5IFRJTSBPdXRwdXQgQ29tcGFyZSBQb2xhcml0eQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBUSU1fT0NQT0xBUklUWV9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBDYXB0dXJlL0NvbXBhcmUgb3V0cHV0IHBvbGFyaXR5IFwNCi0gICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgVElNX09DUE9MQVJJVFlfTE9XIFwNCi0gIFRJTV9DQ0VSX0NDMVAgLyohPCBDYXB0dXJlL0NvbXBhcmUgb3V0cHV0IHBvbGFyaXR5ICAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBUSU1fT3V0cHV0X0NvbXBhcmVfTl9Qb2xhcml0eSBUSU0gQ29tcGxlbWVudGFyeSBPdXRwdXQgQ29tcGFyZQ0KLSAqIFBvbGFyaXR5DQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFRJTV9PQ05QT0xBUklUWV9ISUdIIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgQ2FwdHVyZS9Db21wYXJlIGNvbXBsZW1lbnRhcnkgb3V0cHV0IHBvbGFyaXR5ICovDQotI2RlZmluZSBUSU1fT0NOUE9MQVJJVFlfTE9XIFwNCi0gIFRJTV9DQ0VSX0NDMU5QIC8qITwgQ2FwdHVyZS9Db21wYXJlIGNvbXBsZW1lbnRhcnkgb3V0cHV0IHBvbGFyaXR5ICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9PdXRwdXRfQ29tcGFyZV9JZGxlX1N0YXRlIFRJTSBPdXRwdXQgQ29tcGFyZSBJZGxlIFN0YXRlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFRJTV9PQ0lETEVTVEFURV9TRVQgXA0KLSAgVElNX0NSMl9PSVMxIC8qITwgT3V0cHV0IElkbGUgc3RhdGU6IE9DeD0xIHdoZW4gTU9FPTAgKi8NCi0jZGVmaW5lIFRJTV9PQ0lETEVTVEFURV9SRVNFVCBcDQotICAweDAwMDAwMDAwVSAvKiE8IE91dHB1dCBJZGxlIHN0YXRlOiBPQ3g9MCB3aGVuIE1PRT0wICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9PdXRwdXRfQ29tcGFyZV9OX0lkbGVfU3RhdGUgVElNIENvbXBsZW1lbnRhcnkgT3V0cHV0IENvbXBhcmUNCi0gKiBJZGxlIFN0YXRlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFRJTV9PQ05JRExFU1RBVEVfU0VUIFwNCi0gIFRJTV9DUjJfT0lTMU4gLyohPCBDb21wbGVtZW50YXJ5IG91dHB1dCBJZGxlIHN0YXRlOiBPQ3hOPTEgd2hlbiBNT0U9MCAqLw0KLSNkZWZpbmUgVElNX09DTklETEVTVEFURV9SRVNFVCBcDQotICAweDAwMDAwMDAwVSAvKiE8IENvbXBsZW1lbnRhcnkgb3V0cHV0IElkbGUgc3RhdGU6IE9DeE49MCB3aGVuIE1PRT0wICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9JbnB1dF9DYXB0dXJlX1BvbGFyaXR5IFRJTSBJbnB1dCBDYXB0dXJlIFBvbGFyaXR5DQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFRJTV9JQ1BPTEFSSVRZX1JJU0lORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBUSU1fSU5QVVRDSEFOTkVMUE9MQVJJVFlfUklTSU5HIC8qITwgQ2FwdHVyZSB0cmlnZ2VyZWQgYnkgcmlzaW5nIGVkZ2Ugb24gXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lciBpbnB1dCAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBUSU1fSUNQT0xBUklUWV9GQUxMSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBUSU1fSU5QVVRDSEFOTkVMUE9MQVJJVFlfRkFMTElORyAvKiE8IENhcHR1cmUgdHJpZ2dlcmVkIGJ5IGZhbGxpbmcgZWRnZSBvbiBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lciBpbnB1dCAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFRJTV9JQ1BPTEFSSVRZX0JPVEhFREdFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBUSU1fSU5QVVRDSEFOTkVMUE9MQVJJVFlfQk9USEVER0UgLyohPCBDYXB0dXJlIHRyaWdnZXJlZCBieSBib3RoIHJpc2luZyBhbmQgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbGxpbmcgZWRnZXMgb24gdGltZXIgaW5wdXQqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBUSU1fRW5jb2Rlcl9JbnB1dF9Qb2xhcml0eSBUSU0gRW5jb2RlciBJbnB1dCBQb2xhcml0eQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBUSU1fRU5DT0RFUklOUFVUUE9MQVJJVFlfUklTSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIFRJTV9JTlBVVENIQU5ORUxQT0xBUklUWV9SSVNJTkcgLyohPCBFbmNvZGVyIGlucHV0IHdpdGggcmlzaW5nIGVkZ2UgcG9sYXJpdHkgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFRJTV9FTkNPREVSSU5QVVRQT0xBUklUWV9GQUxMSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBUSU1fSU5QVVRDSEFOTkVMUE9MQVJJVFlfRkFMTElORyAvKiE8IEVuY29kZXIgaW5wdXQgd2l0aCBmYWxsaW5nIGVkZ2UgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9sYXJpdHkgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0lucHV0X0NhcHR1cmVfU2VsZWN0aW9uIFRJTSBJbnB1dCBDYXB0dXJlIFNlbGVjdGlvbg0KLSAqIEB7DQotICovDQotI2RlZmluZSBUSU1fSUNTRUxFQ1RJT05fRElSRUNUVEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgVElNX0NDTVIxX0NDMVNfMCAvKiE8IFRJTSBJbnB1dCAxLCAyLCAzIG9yIDQgaXMgc2VsZWN0ZWQgdG8gYmUgY29ubmVjdGVkIHRvIFwNCi0gICAgICAgICAgICAgICAgICAgICAgSUMxLCBJQzIsIElDMyBvciBJQzQsIHJlc3BlY3RpdmVseSAqLw0KLSNkZWZpbmUgVElNX0lDU0VMRUNUSU9OX0lORElSRUNUVEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIFRJTV9DQ01SMV9DQzFTXzEgLyohPCBUSU0gSW5wdXQgMSwgMiwgMyBvciA0IGlzIHNlbGVjdGVkIHRvIGJlIGNvbm5lY3RlZCB0byBcDQotICAgICAgICAgICAgICAgICAgICAgIElDMiwgSUMxLCBJQzQgb3IgSUMzLCByZXNwZWN0aXZlbHkgKi8NCi0jZGVmaW5lIFRJTV9JQ1NFTEVDVElPTl9UUkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgVElNX0NDTVIxX0NDMVMgLyohPCBUSU0gSW5wdXQgMSwgMiwgMyBvciA0IGlzIHNlbGVjdGVkIHRvIGJlIGNvbm5lY3RlZCB0byBcDQotICAgICAgICAgICAgICAgICAgICBUUkMgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0lucHV0X0NhcHR1cmVfUHJlc2NhbGVyIFRJTSBJbnB1dCBDYXB0dXJlIFByZXNjYWxlcg0KLSAqIEB7DQotICovDQotI2RlZmluZSBUSU1fSUNQU0NfRElWMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAweDAwMDAwMDAwVSAvKiE8IENhcHR1cmUgcGVyZm9ybWVkIGVhY2ggdGltZSBhbiBlZGdlIGlzIGRldGVjdGVkIG9uIHRoZSBcDQotICAgICAgICAgICAgICAgICBjYXB0dXJlIGlucHV0ICovDQotI2RlZmluZSBUSU1fSUNQU0NfRElWMiBcDQotICBUSU1fQ0NNUjFfSUMxUFNDXzAgLyohPCBDYXB0dXJlIHBlcmZvcm1lZCBvbmNlIGV2ZXJ5IDIgZXZlbnRzICovDQotI2RlZmluZSBUSU1fSUNQU0NfRElWNCBcDQotICBUSU1fQ0NNUjFfSUMxUFNDXzEgLyohPCBDYXB0dXJlIHBlcmZvcm1lZCBvbmNlIGV2ZXJ5IDQgZXZlbnRzICovDQotI2RlZmluZSBUSU1fSUNQU0NfRElWOCBcDQotICBUSU1fQ0NNUjFfSUMxUFNDIC8qITwgQ2FwdHVyZSBwZXJmb3JtZWQgb25jZSBldmVyeSA4IGV2ZW50cyAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBUSU1fT25lX1B1bHNlX01vZGUgVElNIE9uZSBQdWxzZSBNb2RlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFRJTV9PUE1PREVfU0lOR0xFIFwNCi0gIFRJTV9DUjFfT1BNIC8qITwgQ291bnRlciBzdG9wcyBjb3VudGluZyBhdCB0aGUgbmV4dCB1cGRhdGUgZXZlbnQgKi8NCi0jZGVmaW5lIFRJTV9PUE1PREVfUkVQRVRJVElWRSBcDQotICAweDAwMDAwMDAwVSAvKiE8IENvdW50ZXIgaXMgbm90IHN0b3BwZWQgYXQgdXBkYXRlIGV2ZW50ICAgICAgICAgICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9FbmNvZGVyX01vZGUgVElNIEVuY29kZXIgTW9kZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBUSU1fRU5DT0RFUk1PREVfVEkxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIFRJTV9TTUNSX1NNU18wIC8qITwgUXVhZHJhdHVyZSBlbmNvZGVyIG1vZGUgMSwgeDIgbW9kZSwgY291bnRzIHVwL2Rvd24gb24gXA0KLSAgICAgICAgICAgICAgICAgICAgVEkxRlAxIGVkZ2UgZGVwZW5kaW5nIG9uIFRJMkZQMiBsZXZlbCAgKi8NCi0jZGVmaW5lIFRJTV9FTkNPREVSTU9ERV9USTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgVElNX1NNQ1JfU01TXzEgLyohPCBRdWFkcmF0dXJlIGVuY29kZXIgbW9kZSAyLCB4MiBtb2RlLCBjb3VudHMgdXAvZG93biBvbiBcDQotICAgICAgICAgICAgICAgICAgICBUSTJGUDIgZWRnZSBkZXBlbmRpbmcgb24gVEkxRlAxIGxldmVsLiAqLw0KLSNkZWZpbmUgVElNX0VOQ09ERVJNT0RFX1RJMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChUSU1fU01DUl9TTVNfMSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgVElNX1NNQ1JfU01TXzApIC8qITwgUXVhZHJhdHVyZSBlbmNvZGVyIG1vZGUgMywgeDQgbW9kZSwgY291bnRzIHVwL2Rvd24gb24gXA0KLSAgICAgICAgICAgICAgICAgICAgICBib3RoIFRJMUZQMSBhbmQgVEkyRlAyIGVkZ2VzIGRlcGVuZGluZyBvbiB0aGUgbGV2ZWwgb2YgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgdGhlIG90aGVyIGlucHV0LiAqLw0KLSNkZWZpbmUgVElNX0VOQ09ERVJNT0RFX0NMT0NLUExVU0RJUkVDVElPTl9YMiBcDQotICAoVElNX1NNQ1JfU01TXzMgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBUSU1fU01DUl9TTVNfMSkgLyohPCBFbmNvZGVyIG1vZGU6IENsb2NrIHBsdXMgZGlyZWN0aW9uLCB4MiBtb2RlICovDQotI2RlZmluZSBUSU1fRU5DT0RFUk1PREVfQ0xPQ0tQTFVTRElSRUNUSU9OX1gxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChUSU1fU01DUl9TTVNfMyB8IFRJTV9TTUNSX1NNU18xIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIFRJTV9TTUNSX1NNU18wKSAvKiE8IEVuY29kZXIgbW9kZTogQ2xvY2sgcGx1cyBkaXJlY3Rpb24sIHgxIG1vZGUsIFRJMkZQMiBcDQotICAgICAgICAgICAgICAgICAgICAgIGVkZ2Ugc2Vuc2l0aXZpdHkgaXMgc2V0IGJ5IENDMlAgKi8NCi0jZGVmaW5lIFRJTV9FTkNPREVSTU9ERV9ESVJFQ1RJT05BTENMT0NLX1gyIFwNCi0gIChUSU1fU01DUl9TTVNfMyB8ICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBUSU1fU01DUl9TTVNfMikgLyohPCBFbmNvZGVyIG1vZGU6IERpcmVjdGlvbmFsIENsb2NrLCB4MiBtb2RlICovDQotI2RlZmluZSBUSU1fRU5DT0RFUk1PREVfRElSRUNUSU9OQUxDTE9DS19YMV9USTEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoVElNX1NNQ1JfU01TXzMgfCBUSU1fU01DUl9TTVNfMiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgVElNX1NNQ1JfU01TXzApIC8qITwgRW5jb2RlciBtb2RlOiBEaXJlY3Rpb25hbCBDbG9jaywgeDEgbW9kZSwgVEkxRlAxIGFuZCBcDQotICAgICAgICAgICAgICAgICAgICAgIFRJMkZQMiBlZGdlIHNlbnNpdGl2aXR5IGlzIHNldCBieSBDQzFQIGFuZCBDQzJQICovDQotI2RlZmluZSBUSU1fRU5DT0RFUk1PREVfWDFfVEkxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoVElNX1NNQ1JfU01TXzMgfCBUSU1fU01DUl9TTVNfMiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgVElNX1NNQ1JfU01TXzEpIC8qITwgUXVhZHJhdHVyZSBlbmNvZGVyIG1vZGU6IHgxIG1vZGUsIGNvdW50aW5nIG9uIFRJMUZQMSBcDQotICAgICAgICAgICAgICAgICAgICAgIGVkZ2VzIG9ubHksIGVkZ2Ugc2Vuc2l0aXZpdHkgaXMgc2V0IGJ5IENDMVAgKi8NCi0jZGVmaW5lIFRJTV9FTkNPREVSTU9ERV9YMV9USTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChUSU1fU01DUl9TTVNfMyB8IFRJTV9TTUNSX1NNU18yIHwgVElNX1NNQ1JfU01TXzEgfCAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBUSU1fU01DUl9TTVNfMCkgLyohPCBRdWFkcmF0dXJlIGVuY29kZXIgbW9kZTogeDEgbW9kZSwgY291bnRpbmcgb24gVEkyRlAyIFwNCi0gICAgICAgICAgICAgICAgICAgICAgZWRnZXMgb25seSwgZWRnZSBzZW5zaXRpdml0eSBpcyBzZXQgYnkgQ0MxUCAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBUSU1fSW50ZXJydXB0X2RlZmluaXRpb24gVElNIGludGVycnVwdCBEZWZpbml0aW9uDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFRJTV9JVF9VUERBVEUgVElNX0RJRVJfVUlFICAvKiE8IFVwZGF0ZSBpbnRlcnJ1cHQgICAgICAgICAgICAqLw0KLSNkZWZpbmUgVElNX0lUX0NDMSBUSU1fRElFUl9DQzFJRSAgIC8qITwgQ2FwdHVyZS9Db21wYXJlIDEgaW50ZXJydXB0ICovDQotI2RlZmluZSBUSU1fSVRfQ0MyIFRJTV9ESUVSX0NDMklFICAgLyohPCBDYXB0dXJlL0NvbXBhcmUgMiBpbnRlcnJ1cHQgKi8NCi0jZGVmaW5lIFRJTV9JVF9DQzMgVElNX0RJRVJfQ0MzSUUgICAvKiE8IENhcHR1cmUvQ29tcGFyZSAzIGludGVycnVwdCAqLw0KLSNkZWZpbmUgVElNX0lUX0NDNCBUSU1fRElFUl9DQzRJRSAgIC8qITwgQ2FwdHVyZS9Db21wYXJlIDQgaW50ZXJydXB0ICovDQotI2RlZmluZSBUSU1fSVRfQ09NIFRJTV9ESUVSX0NPTUlFICAgLyohPCBDb21tdXRhdGlvbiBpbnRlcnJ1cHQgICAgICAgKi8NCi0jZGVmaW5lIFRJTV9JVF9UUklHR0VSIFRJTV9ESUVSX1RJRSAvKiE8IFRyaWdnZXIgaW50ZXJydXB0ICAgICAgICAgICAqLw0KLSNkZWZpbmUgVElNX0lUX0JSRUFLIFRJTV9ESUVSX0JJRSAgIC8qITwgQnJlYWsgaW50ZXJydXB0ICAgICAgICAgICAgICovDQotI2RlZmluZSBUSU1fSVRfSURYIFRJTV9ESUVSX0lEWElFICAgLyohPCBJbmRleCBpbnRlcnJ1cHQgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFRJTV9JVF9ESVIgVElNX0RJRVJfRElSSUUgICAvKiE8IERpcmVjdGlvbiBjaGFuZ2UgaW50ZXJydXB0ICAqLw0KLSNkZWZpbmUgVElNX0lUX0lFUlIgVElNX0RJRVJfSUVSUklFIC8qITwgSW5kZXggZXJyb3IgaW50ZXJydXB0ICAgICAgICovDQotI2RlZmluZSBUSU1fSVRfVEVSUiBUSU1fRElFUl9URVJSSUUgLyohPCBUcmFuc2l0aW9uIGVycm9yIGludGVycnVwdCAgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0NvbW11dGF0aW9uX1NvdXJjZSAgVElNIENvbW11dGF0aW9uIFNvdXJjZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBUSU1fQ09NTVVUQVRJT05fVFJHSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgVElNX0NSMl9DQ1VTIC8qITwgV2hlbiBDYXB0dXJlL2NvbXBhcmUgY29udHJvbCBiaXRzIGFyZSBwcmVsb2FkZWQsIHRoZXkgYXJlIFwNCi0gICAgICAgICAgICAgICAgICB1cGRhdGVkIGJ5IHNldHRpbmcgdGhlIENPTUcgYml0IG9yIHdoZW4gYW4gcmlzaW5nIGVkZ2UgICAgICBcDQotICAgICAgICAgICAgICAgICAgb2NjdXJzIG9uIHRyaWdnZXIgaW5wdXQgKi8NCi0jZGVmaW5lIFRJTV9DT01NVVRBVElPTl9TT0ZUV0FSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgV2hlbiBDYXB0dXJlL2NvbXBhcmUgY29udHJvbCBiaXRzIGFyZSBwcmVsb2FkZWQsIHRoZXkgYXJlIFwNCi0gICAgICAgICAgICAgICAgIHVwZGF0ZWQgYnkgc2V0dGluZyB0aGUgQ09NRyBiaXQgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0RNQV9zb3VyY2VzIFRJTSBETUEgU291cmNlcw0KLSAqIEB7DQotICovDQotI2RlZmluZSBUSU1fRE1BX1VQREFURSBcDQotICBUSU1fRElFUl9VREUgLyohPCBETUEgcmVxdWVzdCBpcyB0cmlnZ2VyZWQgYnkgdGhlIHVwZGF0ZSBldmVudCAqLw0KLSNkZWZpbmUgVElNX0RNQV9DQzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIFRJTV9ESUVSX0NDMURFIC8qITwgRE1BIHJlcXVlc3QgaXMgdHJpZ2dlcmVkIGJ5IHRoZSBjYXB0dXJlL2NvbXBhcmUgbWFjdGggMSBcDQotICAgICAgICAgICAgICAgICAgICBldmVudCAqLw0KLSNkZWZpbmUgVElNX0RNQV9DQzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIFRJTV9ESUVSX0NDMkRFIC8qITwgRE1BIHJlcXVlc3QgaXMgdHJpZ2dlcmVkIGJ5IHRoZSBjYXB0dXJlL2NvbXBhcmUgbWFjdGggMiBcDQotICAgICAgICAgICAgICAgICAgICBldmVudCBldmVudCAqLw0KLSNkZWZpbmUgVElNX0RNQV9DQzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIFRJTV9ESUVSX0NDM0RFIC8qITwgRE1BIHJlcXVlc3QgaXMgdHJpZ2dlcmVkIGJ5IHRoZSBjYXB0dXJlL2NvbXBhcmUgbWFjdGggMyBcDQotICAgICAgICAgICAgICAgICAgICBldmVudCBldmVudCAqLw0KLSNkZWZpbmUgVElNX0RNQV9DQzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIFRJTV9ESUVSX0NDNERFIC8qITwgRE1BIHJlcXVlc3QgaXMgdHJpZ2dlcmVkIGJ5IHRoZSBjYXB0dXJlL2NvbXBhcmUgbWFjdGggNCBcDQotICAgICAgICAgICAgICAgICAgICBldmVudCBldmVudCAqLw0KLSNkZWZpbmUgVElNX0RNQV9DT00gXA0KLSAgVElNX0RJRVJfQ09NREUgLyohPCBETUEgcmVxdWVzdCBpcyB0cmlnZ2VyZWQgYnkgdGhlIGNvbW11dGF0aW9uIGV2ZW50ICovDQotI2RlZmluZSBUSU1fRE1BX1RSSUdHRVIgXA0KLSAgVElNX0RJRVJfVERFIC8qITwgRE1BIHJlcXVlc3QgaXMgdHJpZ2dlcmVkIGJ5IHRoZSB0cmlnZ2VyIGV2ZW50ICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9GbGFnX2RlZmluaXRpb24gVElNIEZsYWcgRGVmaW5pdGlvbg0KLSAqIEB7DQotICovDQotI2RlZmluZSBUSU1fRkxBR19VUERBVEUgVElNX1NSX1VJRiAgLyohPCBVcGRhdGUgaW50ZXJydXB0IGZsYWcgICAgICAgICAqLw0KLSNkZWZpbmUgVElNX0ZMQUdfQ0MxIFRJTV9TUl9DQzFJRiAgIC8qITwgQ2FwdHVyZS9Db21wYXJlIDEgaW50ZXJydXB0IGZsYWcgKi8NCi0jZGVmaW5lIFRJTV9GTEFHX0NDMiBUSU1fU1JfQ0MySUYgICAvKiE8IENhcHR1cmUvQ29tcGFyZSAyIGludGVycnVwdCBmbGFnICovDQotI2RlZmluZSBUSU1fRkxBR19DQzMgVElNX1NSX0NDM0lGICAgLyohPCBDYXB0dXJlL0NvbXBhcmUgMyBpbnRlcnJ1cHQgZmxhZyAqLw0KLSNkZWZpbmUgVElNX0ZMQUdfQ0M0IFRJTV9TUl9DQzRJRiAgIC8qITwgQ2FwdHVyZS9Db21wYXJlIDQgaW50ZXJydXB0IGZsYWcgKi8NCi0jZGVmaW5lIFRJTV9GTEFHX0NDNSBUSU1fU1JfQ0M1SUYgICAvKiE8IENhcHR1cmUvQ29tcGFyZSA1IGludGVycnVwdCBmbGFnICovDQotI2RlZmluZSBUSU1fRkxBR19DQzYgVElNX1NSX0NDNklGICAgLyohPCBDYXB0dXJlL0NvbXBhcmUgNiBpbnRlcnJ1cHQgZmxhZyAqLw0KLSNkZWZpbmUgVElNX0ZMQUdfQ09NIFRJTV9TUl9DT01JRiAgIC8qITwgQ29tbXV0YXRpb24gaW50ZXJydXB0IGZsYWcgICAgKi8NCi0jZGVmaW5lIFRJTV9GTEFHX1RSSUdHRVIgVElNX1NSX1RJRiAvKiE8IFRyaWdnZXIgaW50ZXJydXB0IGZsYWcgICAgICAgICovDQotI2RlZmluZSBUSU1fRkxBR19CUkVBSyBUSU1fU1JfQklGICAgLyohPCBCcmVhayBpbnRlcnJ1cHQgZmxhZyAgICAgICAgICAqLw0KLSNkZWZpbmUgVElNX0ZMQUdfQlJFQUsyIFRJTV9TUl9CMklGIC8qITwgQnJlYWsgMiBpbnRlcnJ1cHQgZmxhZyAgICAgICAgKi8NCi0jZGVmaW5lIFRJTV9GTEFHX1NZU1RFTV9CUkVBSyBUSU1fU1JfU0JJRiAvKiE8IFN5c3RlbSBCcmVhayBpbnRlcnJ1cHQgZmxhZyAqLw0KLSNkZWZpbmUgVElNX0ZMQUdfQ0MxT0YgVElNX1NSX0NDMU9GICAgICAgIC8qITwgQ2FwdHVyZSAxIG92ZXJjYXB0dXJlIGZsYWcgICAgKi8NCi0jZGVmaW5lIFRJTV9GTEFHX0NDMk9GIFRJTV9TUl9DQzJPRiAgICAgICAvKiE8IENhcHR1cmUgMiBvdmVyY2FwdHVyZSBmbGFnICAgICovDQotI2RlZmluZSBUSU1fRkxBR19DQzNPRiBUSU1fU1JfQ0MzT0YgICAgICAgLyohPCBDYXB0dXJlIDMgb3ZlcmNhcHR1cmUgZmxhZyAgICAqLw0KLSNkZWZpbmUgVElNX0ZMQUdfQ0M0T0YgVElNX1NSX0NDNE9GICAgICAgIC8qITwgQ2FwdHVyZSA0IG92ZXJjYXB0dXJlIGZsYWcgICAgKi8NCi0jZGVmaW5lIFRJTV9GTEFHX0lEWCBUSU1fU1JfSURYRiAgICAgICAgICAvKiE8IEVuY29kZXIgaW5kZXggZmxhZyAgICAgICAgICAgICovDQotI2RlZmluZSBUSU1fRkxBR19ESVIgVElNX1NSX0RJUkYgICAgICAgICAgLyohPCBEaXJlY3Rpb24gY2hhbmdlIGZsYWcgICAgICAgICAqLw0KLSNkZWZpbmUgVElNX0ZMQUdfSUVSUiBUSU1fU1JfSUVSUkYgICAgICAgIC8qITwgSW5kZXggZXJyb3IgZmxhZyAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFRJTV9GTEFHX1RFUlIgVElNX1NSX1RFUlJGICAgICAgICAvKiE8IFRyYW5zaXRpb24gZXJyb3IgZmxhZyAgICAgICAgICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9DaGFubmVsIFRJTSBDaGFubmVsDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFRJTV9DSEFOTkVMXzEgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBDYXB0dXJlL2NvbXBhcmUgY2hhbm5lbCAxIGlkZW50aWZpZXIgICAgICAqLw0KLSNkZWZpbmUgVElNX0NIQU5ORUxfMiBcDQotICAweDAwMDAwMDA0VSAvKiE8IENhcHR1cmUvY29tcGFyZSBjaGFubmVsIDIgaWRlbnRpZmllciAgICAgICovDQotI2RlZmluZSBUSU1fQ0hBTk5FTF8zIFwNCi0gIDB4MDAwMDAwMDhVIC8qITwgQ2FwdHVyZS9jb21wYXJlIGNoYW5uZWwgMyBpZGVudGlmaWVyICAgICAgKi8NCi0jZGVmaW5lIFRJTV9DSEFOTkVMXzQgXA0KLSAgMHgwMDAwMDAwQ1UgLyohPCBDYXB0dXJlL2NvbXBhcmUgY2hhbm5lbCA0IGlkZW50aWZpZXIgICAgICAqLw0KLSNkZWZpbmUgVElNX0NIQU5ORUxfNSBcDQotICAweDAwMDAwMDEwVSAvKiE8IENvbXBhcmUgY2hhbm5lbCA1IGlkZW50aWZpZXIgICAgICAgICAgICAgICovDQotI2RlZmluZSBUSU1fQ0hBTk5FTF82IFwNCi0gIDB4MDAwMDAwMTRVIC8qITwgQ29tcGFyZSBjaGFubmVsIDYgaWRlbnRpZmllciAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFRJTV9DSEFOTkVMX0FMTCBcDQotICAweDAwMDAwMDNDVSAvKiE8IEdsb2JhbCBDYXB0dXJlL2NvbXBhcmUgY2hhbm5lbCBpZGVudGlmaWVyICAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBUSU1fQ2xvY2tfU291cmNlIFRJTSBDbG9jayBTb3VyY2UNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgVElNX0NMT0NLU09VUkNFX0VUUk1PREUyIFwNCi0gIFRJTV9TTUNSX0VUUFNfMSAvKiE8IEV4dGVybmFsIGNsb2NrIHNvdXJjZSBtb2RlIDIgKi8NCi0jZGVmaW5lIFRJTV9DTE9DS1NPVVJDRV9JTlRFUk5BTCBUSU1fU01DUl9FVFBTXzAgLyohPCBJbnRlcm5hbCBjbG9jayBzb3VyY2UgKi8NCi0jZGVmaW5lIFRJTV9DTE9DS1NPVVJDRV9JVFIwIFwNCi0gIFRJTV9UU19JVFIwIC8qITwgRXh0ZXJuYWwgY2xvY2sgc291cmNlIG1vZGUgMSAoSVRSMCkgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFRJTV9DTE9DS1NPVVJDRV9JVFIxIFwNCi0gIFRJTV9UU19JVFIxIC8qITwgRXh0ZXJuYWwgY2xvY2sgc291cmNlIG1vZGUgMSAoSVRSMSkgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFRJTV9DTE9DS1NPVVJDRV9JVFIyIFwNCi0gIFRJTV9UU19JVFIyIC8qITwgRXh0ZXJuYWwgY2xvY2sgc291cmNlIG1vZGUgMSAoSVRSMikgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFRJTV9DTE9DS1NPVVJDRV9JVFIzIFwNCi0gIFRJTV9UU19JVFIzIC8qITwgRXh0ZXJuYWwgY2xvY2sgc291cmNlIG1vZGUgMSAoSVRSMykgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFRJTV9DTE9DS1NPVVJDRV9USTFFRCBcDQotICBUSU1fVFNfVEkxRl9FRCAvKiE8IEV4dGVybmFsIGNsb2NrIHNvdXJjZSBtb2RlIDEgKFRUSTFGUDEgKyBlZGdlIGRldGVjdC4pICovDQotI2RlZmluZSBUSU1fQ0xPQ0tTT1VSQ0VfVEkxIFwNCi0gIFRJTV9UU19USTFGUDEgLyohPCBFeHRlcm5hbCBjbG9jayBzb3VyY2UgbW9kZSAxIChUVEkxRlAxKSAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgVElNX0NMT0NLU09VUkNFX1RJMiBcDQotICBUSU1fVFNfVEkyRlAyIC8qITwgRXh0ZXJuYWwgY2xvY2sgc291cmNlIG1vZGUgMSAoVFRJMkZQMikgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFRJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMSBcDQotICBUSU1fVFNfRVRSRiAvKiE8IEV4dGVybmFsIGNsb2NrIHNvdXJjZSBtb2RlIDEgKEVUUkYpICAgICAgICAgICAgICAgICAgICovDQotI2lmIGRlZmluZWQoVElNNSkNCi0jZGVmaW5lIFRJTV9DTE9DS1NPVVJDRV9JVFI0IFwNCi0gIFRJTV9UU19JVFI0IC8qITwgRXh0ZXJuYWwgY2xvY2sgc291cmNlIG1vZGUgMSAoSVRSNCkgICAgICAgICAgICAgICAgICAgKi8NCi0jZW5kaWYgICAgICAgIC8qIFRJTTUgKi8NCi0jZGVmaW5lIFRJTV9DTE9DS1NPVVJDRV9JVFI1IFwNCi0gIFRJTV9UU19JVFI1IC8qITwgRXh0ZXJuYWwgY2xvY2sgc291cmNlIG1vZGUgMSAoSVRSNSkgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFRJTV9DTE9DS1NPVVJDRV9JVFI2IFwNCi0gIFRJTV9UU19JVFI2IC8qITwgRXh0ZXJuYWwgY2xvY2sgc291cmNlIG1vZGUgMSAoSVRSNikgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFRJTV9DTE9DS1NPVVJDRV9JVFI3IFwNCi0gIFRJTV9UU19JVFI3IC8qITwgRXh0ZXJuYWwgY2xvY2sgc291cmNlIG1vZGUgMSAoSVRSNykgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFRJTV9DTE9DS1NPVVJDRV9JVFI4IFwNCi0gIFRJTV9UU19JVFI4IC8qITwgRXh0ZXJuYWwgY2xvY2sgc291cmNlIG1vZGUgMSAoSVRSOCkgICAgICAgICAgICAgICAgICAgKi8NCi0jaWYgZGVmaW5lZChUSU0yMCkNCi0jZGVmaW5lIFRJTV9DTE9DS1NPVVJDRV9JVFI5IFwNCi0gIFRJTV9UU19JVFI5IC8qITwgRXh0ZXJuYWwgY2xvY2sgc291cmNlIG1vZGUgMSAoSVRSOSkgICAgICAgICAgICAgICAgICAgKi8NCi0jZW5kaWYgICAgICAgIC8qIFRJTTIwICovDQotI2RlZmluZSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMTAgXA0KLSAgVElNX1RTX0lUUjEwIC8qITwgRXh0ZXJuYWwgY2xvY2sgc291cmNlIG1vZGUgMSAoSVRSMTApICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFRJTV9DTE9DS1NPVVJDRV9JVFIxMSBcDQotICBUSU1fVFNfSVRSMTEgLyohPCBFeHRlcm5hbCBjbG9jayBzb3VyY2UgbW9kZSAxIChJVFIxMSkgICAgICAgICAgICAgICAgICAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBUSU1fQ2xvY2tfUG9sYXJpdHkgVElNIENsb2NrIFBvbGFyaXR5DQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFRJTV9DTE9DS1BPTEFSSVRZX0lOVkVSVEVEIFwNCi0gIFRJTV9FVFJQT0xBUklUWV9JTlZFUlRFRCAvKiE8IFBvbGFyaXR5IGZvciBFVFJ4IGNsb2NrIHNvdXJjZXMgKi8NCi0jZGVmaW5lIFRJTV9DTE9DS1BPTEFSSVRZX05PTklOVkVSVEVEIFwNCi0gIFRJTV9FVFJQT0xBUklUWV9OT05JTlZFUlRFRCAvKiE8IFBvbGFyaXR5IGZvciBFVFJ4IGNsb2NrIHNvdXJjZXMgKi8NCi0jZGVmaW5lIFRJTV9DTE9DS1BPTEFSSVRZX1JJU0lORyBcDQotICBUSU1fSU5QVVRDSEFOTkVMUE9MQVJJVFlfUklTSU5HIC8qITwgUG9sYXJpdHkgZm9yIFRJeCBjbG9jayBzb3VyY2VzICovDQotI2RlZmluZSBUSU1fQ0xPQ0tQT0xBUklUWV9GQUxMSU5HIFwNCi0gIFRJTV9JTlBVVENIQU5ORUxQT0xBUklUWV9GQUxMSU5HIC8qITwgUG9sYXJpdHkgZm9yIFRJeCBjbG9jayBzb3VyY2VzICovDQotI2RlZmluZSBUSU1fQ0xPQ0tQT0xBUklUWV9CT1RIRURHRSBcDQotICBUSU1fSU5QVVRDSEFOTkVMUE9MQVJJVFlfQk9USEVER0UgLyohPCBQb2xhcml0eSBmb3IgVEl4IGNsb2NrIHNvdXJjZXMgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0Nsb2NrX1ByZXNjYWxlciBUSU0gQ2xvY2sgUHJlc2NhbGVyDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFRJTV9DTE9DS1BSRVNDQUxFUl9ESVYxIFwNCi0gIFRJTV9FVFJQUkVTQ0FMRVJfRElWMSAvKiE8IE5vIHByZXNjYWxlciBpcyB1c2VkICovDQotI2RlZmluZSBUSU1fQ0xPQ0tQUkVTQ0FMRVJfRElWMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBUSU1fRVRSUFJFU0NBTEVSX0RJVjIgLyohPCBQcmVzY2FsZXIgZm9yIEV4dGVybmFsIEVUUiBDbG9jazogQ2FwdHVyZSBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybWVkIG9uY2UgZXZlcnkgMiBldmVudHMuICovDQotI2RlZmluZSBUSU1fQ0xPQ0tQUkVTQ0FMRVJfRElWNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBUSU1fRVRSUFJFU0NBTEVSX0RJVjQgLyohPCBQcmVzY2FsZXIgZm9yIEV4dGVybmFsIEVUUiBDbG9jazogQ2FwdHVyZSBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybWVkIG9uY2UgZXZlcnkgNCBldmVudHMuICovDQotI2RlZmluZSBUSU1fQ0xPQ0tQUkVTQ0FMRVJfRElWOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBUSU1fRVRSUFJFU0NBTEVSX0RJVjggLyohPCBQcmVzY2FsZXIgZm9yIEV4dGVybmFsIEVUUiBDbG9jazogQ2FwdHVyZSBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybWVkIG9uY2UgZXZlcnkgOCBldmVudHMuICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9DbGVhcklucHV0X1BvbGFyaXR5IFRJTSBDbGVhciBJbnB1dCBQb2xhcml0eQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBUSU1fQ0xFQVJJTlBVVFBPTEFSSVRZX0lOVkVSVEVEIFwNCi0gIFRJTV9FVFJQT0xBUklUWV9JTlZFUlRFRCAvKiE8IFBvbGFyaXR5IGZvciBFVFJ4IHBpbiAqLw0KLSNkZWZpbmUgVElNX0NMRUFSSU5QVVRQT0xBUklUWV9OT05JTlZFUlRFRCBcDQotICBUSU1fRVRSUE9MQVJJVFlfTk9OSU5WRVJURUQgLyohPCBQb2xhcml0eSBmb3IgRVRSeCBwaW4gKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0NsZWFySW5wdXRfUHJlc2NhbGVyIFRJTSBDbGVhciBJbnB1dCBQcmVzY2FsZXINCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgVElNX0NMRUFSSU5QVVRQUkVTQ0FMRVJfRElWMSBcDQotICBUSU1fRVRSUFJFU0NBTEVSX0RJVjEgLyohPCBObyBwcmVzY2FsZXIgaXMgdXNlZCAqLw0KLSNkZWZpbmUgVElNX0NMRUFSSU5QVVRQUkVTQ0FMRVJfRElWMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBUSU1fRVRSUFJFU0NBTEVSX0RJVjIgLyohPCBQcmVzY2FsZXIgZm9yIEV4dGVybmFsIEVUUiBwaW46IENhcHR1cmUgcGVyZm9ybWVkIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBvbmNlIGV2ZXJ5IDIgZXZlbnRzLiAqLw0KLSNkZWZpbmUgVElNX0NMRUFSSU5QVVRQUkVTQ0FMRVJfRElWNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBUSU1fRVRSUFJFU0NBTEVSX0RJVjQgLyohPCBQcmVzY2FsZXIgZm9yIEV4dGVybmFsIEVUUiBwaW46IENhcHR1cmUgcGVyZm9ybWVkIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBvbmNlIGV2ZXJ5IDQgZXZlbnRzLiAqLw0KLSNkZWZpbmUgVElNX0NMRUFSSU5QVVRQUkVTQ0FMRVJfRElWOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBUSU1fRVRSUFJFU0NBTEVSX0RJVjggLyohPCBQcmVzY2FsZXIgZm9yIEV4dGVybmFsIEVUUiBwaW46IENhcHR1cmUgcGVyZm9ybWVkIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBvbmNlIGV2ZXJ5IDggZXZlbnRzLiAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBUSU1fT1NTUl9PZmZfU3RhdGVfU2VsZWN0aW9uX2Zvcl9SdW5fbW9kZV9zdGF0ZSBUSU0gT1NTUiBPZmZTdGF0ZQ0KLSAqIFNlbGVjdGlvbiBmb3IgUnVuIG1vZGUgc3RhdGUNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgVElNX09TU1JfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBUSU1fQkRUUl9PU1NSIC8qITwgV2hlbiBpbmFjdGl2ZSwgT0MvT0NOIG91dHB1dHMgYXJlIGVuYWJsZWQgKHN0aWxsIFwNCi0gICAgICAgICAgICAgICAgICAgY29udHJvbGxlZCBieSB0aGUgdGltZXIpICAgICAgICAgICAqLw0KLSNkZWZpbmUgVElNX09TU1JfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgV2hlbiBpbmFjdGl2ZSwgT0MvT0NOIG91dHB1dHMgYXJlIGRpc2FibGVkIChub3QgY29udHJvbGxlZCBcDQotICAgICAgICAgICAgICAgICBhbnkgbG9uZ2VyIGJ5IHRoZSB0aW1lcikgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX09TU0lfT2ZmX1N0YXRlX1NlbGVjdGlvbl9mb3JfSWRsZV9tb2RlX3N0YXRlIFRJTSBPU1NJIE9mZlN0YXRlDQotICogU2VsZWN0aW9uIGZvciBJZGxlIG1vZGUgc3RhdGUNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgVElNX09TU0lfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBUSU1fQkRUUl9PU1NJIC8qITwgV2hlbiBpbmFjdGl2ZSwgT0MvT0NOIG91dHB1dHMgYXJlIGVuYWJsZWQgKHN0aWxsIFwNCi0gICAgICAgICAgICAgICAgICAgY29udHJvbGxlZCBieSB0aGUgdGltZXIpICAgICAgICAgICAqLw0KLSNkZWZpbmUgVElNX09TU0lfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgV2hlbiBpbmFjdGl2ZSwgT0MvT0NOIG91dHB1dHMgYXJlIGRpc2FibGVkIChub3QgY29udHJvbGxlZCBcDQotICAgICAgICAgICAgICAgICBhbnkgbG9uZ2VyIGJ5IHRoZSB0aW1lcikgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLS8qKiBAZGVmZ3JvdXAgVElNX0xvY2tfbGV2ZWwgIFRJTSBMb2NrIGxldmVsDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFRJTV9MT0NLTEVWRUxfT0ZGIDB4MDAwMDAwMDBVICAgLyohPCBMT0NLIE9GRiAgICAgKi8NCi0jZGVmaW5lIFRJTV9MT0NLTEVWRUxfMSBUSU1fQkRUUl9MT0NLXzAgLyohPCBMT0NLIExldmVsIDEgKi8NCi0jZGVmaW5lIFRJTV9MT0NLTEVWRUxfMiBUSU1fQkRUUl9MT0NLXzEgLyohPCBMT0NLIExldmVsIDIgKi8NCi0jZGVmaW5lIFRJTV9MT0NLTEVWRUxfMyBUSU1fQkRUUl9MT0NLICAgLyohPCBMT0NLIExldmVsIDMgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0JyZWFrX0lucHV0X2VuYWJsZV9kaXNhYmxlIFRJTSBCcmVhayBJbnB1dCBFbmFibGUNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgVElNX0JSRUFLX0VOQUJMRSBUSU1fQkRUUl9CS0UgLyohPCBCcmVhayBpbnB1dCBCUksgaXMgZW5hYmxlZCAgKi8NCi0jZGVmaW5lIFRJTV9CUkVBS19ESVNBQkxFIDB4MDAwMDAwMDBVIC8qITwgQnJlYWsgaW5wdXQgQlJLIGlzIGRpc2FibGVkICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9CcmVha19Qb2xhcml0eSBUSU0gQnJlYWsgSW5wdXQgUG9sYXJpdHkNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgVElNX0JSRUFLUE9MQVJJVFlfTE9XICAgICAgICAgICAgICAgICAgICBcDQotICAweDAwMDAwMDAwVSAvKiE8IEJyZWFrIGlucHV0IEJSSyBpcyBhY3RpdmUgbG93IFwNCi0gICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgVElNX0JSRUFLUE9MQVJJVFlfSElHSCBcDQotICBUSU1fQkRUUl9CS1AgLyohPCBCcmVhayBpbnB1dCBCUksgaXMgYWN0aXZlIGhpZ2ggKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0JyZWFrX0lucHV0X0FGX01vZGUgVElNIEJyZWFrIElucHV0IEFsdGVybmF0ZSBGdW5jdGlvbiBNb2RlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFRJTV9CUkVBS19BRk1PREVfSU5QVVQgICAgICAgICAgICAgICAgICAgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBCcmVhayBpbnB1dCBCUksgaW4gaW5wdXQgbW9kZSBcDQotICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFRJTV9CUkVBS19BRk1PREVfQklESVJFQ1RJT05BTCBcDQotICBUSU1fQkRUUl9CS0JJRCAvKiE8IEJyZWFrIGlucHV0IEJSSyBpbiBiaWRpcmVjdGlvbmFsIG1vZGUgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0JyZWFrMl9JbnB1dF9lbmFibGVfZGlzYWJsZSBUSU0gQnJlYWsgaW5wdXQgMiBFbmFibGUNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgVElNX0JSRUFLMl9ESVNBQkxFIDB4MDAwMDAwMDBVICAvKiE8IEJyZWFrIGlucHV0IEJSSzIgaXMgZGlzYWJsZWQgICovDQotI2RlZmluZSBUSU1fQlJFQUsyX0VOQUJMRSBUSU1fQkRUUl9CSzJFIC8qITwgQnJlYWsgaW5wdXQgQlJLMiBpcyBlbmFibGVkICAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBUSU1fQnJlYWsyX1BvbGFyaXR5IFRJTSBCcmVhayBJbnB1dCAyIFBvbGFyaXR5DQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFRJTV9CUkVBSzJQT0xBUklUWV9MT1cgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBCcmVhayBpbnB1dCBCUksyIGlzIGFjdGl2ZSBsb3cgICAqLw0KLSNkZWZpbmUgVElNX0JSRUFLMlBPTEFSSVRZX0hJR0ggXA0KLSAgVElNX0JEVFJfQksyUCAvKiE8IEJyZWFrIGlucHV0IEJSSzIgaXMgYWN0aXZlIGhpZ2ggICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9CcmVhazJfSW5wdXRfQUZfTW9kZSBUSU0gQnJlYWsyIElucHV0IEFsdGVybmF0ZSBGdW5jdGlvbiBNb2RlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFRJTV9CUkVBSzJfQUZNT0RFX0lOUFVUIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgQnJlYWsyIGlucHV0IEJSSzIgaW4gaW5wdXQgbW9kZSAqLw0KLSNkZWZpbmUgVElNX0JSRUFLMl9BRk1PREVfQklESVJFQ1RJT05BTCBcDQotICBUSU1fQkRUUl9CSzJCSUQgLyohPCBCcmVhazIgaW5wdXQgQlJLMiBpbiBiaWRpcmVjdGlvbmFsIG1vZGUgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0FPRV9CaXRfU2V0X1Jlc2V0IFRJTSBBdXRvbWF0aWMgT3V0cHV0IEVuYWJsZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBUSU1fQVVUT01BVElDT1VUUFVUX0RJU0FCTEUgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBNT0UgY2FuIGJlIHNldCBvbmx5IGJ5IHNvZnR3YXJlICovDQotI2RlZmluZSBUSU1fQVVUT01BVElDT1VUUFVUX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIFRJTV9CRFRSX0FPRSAvKiE8IE1PRSBjYW4gYmUgc2V0IGJ5IHNvZnR3YXJlIG9yIGF1dG9tYXRpY2FsbHkgYXQgdGhlIG5leHQgXA0KLSAgICAgICAgICAgICAgICAgIHVwZGF0ZSBldmVudCAoaWYgbm9uZSBvZiB0aGUgYnJlYWsgaW5wdXRzIEJSSyBhbmQgQlJLMiBpcyBcDQotICAgICAgICAgICAgICAgICAgYWN0aXZlKSAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBUSU1fR3JvdXBfQ2hhbm5lbDUgVElNIEdyb3VwIENoYW5uZWwgNSBhbmQgQ2hhbm5lbCAxLCAyIG9yIDMNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgVElNX0dST1VQQ0g1X05PTkUgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBObyBlZmZlY3Qgb2YgT0M1UkVGIG9uIE9DMVJFRkMsIE9DMlJFRkMgYW5kIE9DM1JFRkMgKi8NCi0jZGVmaW5lIFRJTV9HUk9VUENINV9PQzFSRUZDIFwNCi0gIFRJTV9DQ1I1X0dDNUMxIC8qITwgT0MxUkVGQyBpcyB0aGUgbG9naWNhbCBBTkQgb2YgT0MxUkVGQyBhbmQgT0M1UkVGICAgICovDQotI2RlZmluZSBUSU1fR1JPVVBDSDVfT0MyUkVGQyBcDQotICBUSU1fQ0NSNV9HQzVDMiAvKiE8IE9DMlJFRkMgaXMgdGhlIGxvZ2ljYWwgQU5EIG9mIE9DMlJFRkMgYW5kIE9DNVJFRiAgICAqLw0KLSNkZWZpbmUgVElNX0dST1VQQ0g1X09DM1JFRkMgXA0KLSAgVElNX0NDUjVfR0M1QzMgLyohPCBPQzNSRUZDIGlzIHRoZSBsb2dpY2FsIEFORCBvZiBPQzNSRUZDIGFuZCBPQzVSRUYgICAgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX01hc3Rlcl9Nb2RlX1NlbGVjdGlvbiBUSU0gTWFzdGVyIE1vZGUgU2VsZWN0aW9uDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFRJTV9UUkdPX1JFU0VUIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgVElNeF9FR1IuVUcgYml0IGlzIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQgKFRSR08pICovDQotI2RlZmluZSBUSU1fVFJHT19FTkFCTEUgXA0KLSAgVElNX0NSMl9NTVNfMCAvKiE8IFRJTXhfQ1IxLkNFTiBiaXQgaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAoVFJHTykgKi8NCi0jZGVmaW5lIFRJTV9UUkdPX1VQREFURSBcDQotICBUSU1fQ1IyX01NU18xIC8qITwgVXBkYXRlIGV2ZW50IGlzIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQgKFRSR08pICovDQotI2RlZmluZSBUSU1fVFJHT19PQzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChUSU1fQ1IyX01NU18xIHwgVElNX0NSMl9NTVNfMCkgLyohPCBDYXB0dXJlIG9yIGEgY29tcGFyZSBtYXRjaCAxIGlzIHVzZWQgYXMgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyIG91dHB1dCAoVFJHTykgKi8NCi0jZGVmaW5lIFRJTV9UUkdPX09DMVJFRiBcDQotICBUSU1fQ1IyX01NU18yIC8qITwgT0MxUkVGIHNpZ25hbCBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0IChUUkdPKSAqLw0KLSNkZWZpbmUgVElNX1RSR09fT0MyUkVGIFwNCi0gIChUSU1fQ1IyX01NU18yIHwgICAgICBcDQotICAgVElNX0NSMl9NTVNfMCkgLyohPCBPQzJSRUYgc2lnbmFsIGlzIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQoVFJHTykgKi8NCi0jZGVmaW5lIFRJTV9UUkdPX09DM1JFRiBcDQotICAoVElNX0NSMl9NTVNfMiB8ICAgICAgXA0KLSAgIFRJTV9DUjJfTU1TXzEpIC8qITwgT0MzUkVGIHNpZ25hbCBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0KFRSR08pICovDQotI2RlZmluZSBUSU1fVFJHT19PQzRSRUYgICAgICAgICAgICBcDQotICAoVElNX0NSMl9NTVNfMiB8IFRJTV9DUjJfTU1TXzEgfCBcDQotICAgVElNX0NSMl9NTVNfMCkgLyohPCBPQzRSRUYgc2lnbmFsIGlzIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQoVFJHTykgKi8NCi0jZGVmaW5lIFRJTV9UUkdPX0VOQ09ERVJfQ0xLIFwNCi0gIFRJTV9DUjJfTU1TXzMgLyohPCBFbmNvZGVyIGNsb2NrIGlzIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQoVFJHTykgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX01hc3Rlcl9Nb2RlX1NlbGVjdGlvbl8yIFRJTSBNYXN0ZXIgTW9kZSBTZWxlY3Rpb24gMiAoVFJHTzIpDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFRJTV9UUkdPMl9SRVNFVCBcDQotICAweDAwMDAwMDAwVSAvKiE8IFRJTXhfRUdSLlVHIGJpdCBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0IChUUkdPMikgKi8NCi0jZGVmaW5lIFRJTV9UUkdPMl9FTkFCTEUgXA0KLSAgVElNX0NSMl9NTVMyXzAgLyohPCBUSU14X0NSMS5DRU4gYml0IGlzIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQgKFRSR08yKSAqLw0KLSNkZWZpbmUgVElNX1RSR08yX1VQREFURSBcDQotICBUSU1fQ1IyX01NUzJfMSAvKiE8IFVwZGF0ZSBldmVudCBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0IChUUkdPMikgKi8NCi0jZGVmaW5lIFRJTV9UUkdPMl9PQzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoVElNX0NSMl9NTVMyXzEgfCBUSU1fQ1IyX01NUzJfMCkgLyohPCBDYXB0dXJlIG9yIGEgY29tcGFyZSBtYXRjaCAxIGlzIHVzZWQgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzIHRyaWdnZXIgb3V0cHV0IChUUkdPMikgKi8NCi0jZGVmaW5lIFRJTV9UUkdPMl9PQzFSRUYgXA0KLSAgVElNX0NSMl9NTVMyXzIgLyohPCBPQzFSRUYgc2lnbmFsIGlzIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQgKFRSR08yKSAqLw0KLSNkZWZpbmUgVElNX1RSR08yX09DMlJFRiBcDQotICAoVElNX0NSMl9NTVMyXzIgfCAgICAgIFwNCi0gICBUSU1fQ1IyX01NUzJfMCkgLyohPCBPQzJSRUYgc2lnbmFsIGlzIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQgKFRSR08yKSAqLw0KLSNkZWZpbmUgVElNX1RSR08yX09DM1JFRiBcDQotICAoVElNX0NSMl9NTVMyXzIgfCAgICAgIFwNCi0gICBUSU1fQ1IyX01NUzJfMSkgLyohPCBPQzNSRUYgc2lnbmFsIGlzIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQgKFRSR08yKSAqLw0KLSNkZWZpbmUgVElNX1RSR08yX09DNFJFRiAgICAgICAgICAgICBcDQotICAoVElNX0NSMl9NTVMyXzIgfCBUSU1fQ1IyX01NUzJfMSB8IFwNCi0gICBUSU1fQ1IyX01NUzJfMCkgLyohPCBPQzRSRUYgc2lnbmFsIGlzIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQgKFRSR08yKSAqLw0KLSNkZWZpbmUgVElNX1RSR08yX09DNVJFRiBcDQotICBUSU1fQ1IyX01NUzJfMyAvKiE8IE9DNVJFRiBzaWduYWwgaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAoVFJHTzIpICovDQotI2RlZmluZSBUSU1fVFJHTzJfT0M2UkVGIFwNCi0gIChUSU1fQ1IyX01NUzJfMyB8ICAgICAgXA0KLSAgIFRJTV9DUjJfTU1TMl8wKSAvKiE8IE9DNlJFRiBzaWduYWwgaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAoVFJHTzIpICovDQotI2RlZmluZSBUSU1fVFJHTzJfT0M0UkVGX1JJU0lOR0ZBTExJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKFRJTV9DUjJfTU1TMl8zIHwgVElNX0NSMl9NTVMyXzEpIC8qITwgT0M0UkVGIHJpc2luZyBvciBmYWxsaW5nIGVkZ2VzIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZSBwdWxzZXMgb24gVFJHTzIgICAgICAgICovDQotI2RlZmluZSBUSU1fVFJHTzJfT0M2UkVGX1JJU0lOR0ZBTExJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoVElNX0NSMl9NTVMyXzMgfCBUSU1fQ1IyX01NUzJfMSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgVElNX0NSMl9NTVMyXzApIC8qITwgT0M2UkVGIHJpc2luZyBvciBmYWxsaW5nIGVkZ2VzIGdlbmVyYXRlIHB1bHNlcyBvbiBcDQotICAgICAgICAgICAgICAgICAgICAgIFRSR08yICAgICAgICAqLw0KLSNkZWZpbmUgVElNX1RSR08yX09DNFJFRl9SSVNJTkdfT0M2UkVGX1JJU0lORyAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKFRJTV9DUjJfTU1TMl8zIHwgVElNX0NSMl9NTVMyXzIpIC8qITwgT0M0UkVGIG9yIE9DNlJFRiByaXNpbmcgZWRnZXMgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlIHB1bHNlcyBvbiBUUkdPMiAgICAgICAgICovDQotI2RlZmluZSBUSU1fVFJHTzJfT0M0UkVGX1JJU0lOR19PQzZSRUZfRkFMTElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKFRJTV9DUjJfTU1TMl8zIHwgVElNX0NSMl9NTVMyXzIgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBUSU1fQ1IyX01NUzJfMCkgLyohPCBPQzRSRUYgcmlzaW5nIG9yIE9DNlJFRiBmYWxsaW5nIGVkZ2VzIGdlbmVyYXRlIHB1bHNlcyBcDQotICAgICAgICAgICAgICAgICAgICAgIG9uIFRSR08yICovDQotI2RlZmluZSBUSU1fVFJHTzJfT0M1UkVGX1JJU0lOR19PQzZSRUZfUklTSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChUSU1fQ1IyX01NUzJfMyB8IFRJTV9DUjJfTU1TMl8yIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIFRJTV9DUjJfTU1TMl8xKSAvKiE8IE9DNVJFRiBvciBPQzZSRUYgcmlzaW5nIGVkZ2VzIGdlbmVyYXRlIHB1bHNlcyBvbiBUUkdPMiBcDQotICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgVElNX1RSR08yX09DNVJFRl9SSVNJTkdfT0M2UkVGX0ZBTExJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoVElNX0NSMl9NTVMyXzMgfCBUSU1fQ1IyX01NUzJfMiB8IFRJTV9DUjJfTU1TMl8xIHwgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBUSU1fQ1IyX01NUzJfMCkgLyohPCBPQzVSRUYgb3IgT0M2UkVGIHJpc2luZyBlZGdlcyBnZW5lcmF0ZSBwdWxzZXMgb24gVFJHTzIgXA0KLSAgICAgICAgICAgICAgICAgICAgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX01hc3Rlcl9TbGF2ZV9Nb2RlIFRJTSBNYXN0ZXIvU2xhdmUgTW9kZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBUSU1fTUFTVEVSU0xBVkVNT0RFX0VOQUJMRSBUSU1fU01DUl9NU00gLyohPCBObyBhY3Rpb24gKi8NCi0jZGVmaW5lIFRJTV9NQVNURVJTTEFWRU1PREVfRElTQUJMRSBcDQotICAweDAwMDAwMDAwVSAvKiE8IE1hc3Rlci9zbGF2ZSBtb2RlIGlzIHNlbGVjdGVkICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9TbGF2ZV9Nb2RlIFRJTSBTbGF2ZSBtb2RlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFRJTV9TTEFWRU1PREVfRElTQUJMRSAweDAwMDAwMDAwVSAgLyohPCBTbGF2ZSBtb2RlIGRpc2FibGVkICAqLw0KLSNkZWZpbmUgVElNX1NMQVZFTU9ERV9SRVNFVCBUSU1fU01DUl9TTVNfMiAvKiE8IFJlc2V0IE1vZGUgKi8NCi0jZGVmaW5lIFRJTV9TTEFWRU1PREVfR0FURUQgXA0KLSAgKFRJTV9TTUNSX1NNU18yIHwgVElNX1NNQ1JfU01TXzApIC8qITwgR2F0ZWQgTW9kZSAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFRJTV9TTEFWRU1PREVfVFJJR0dFUiBcDQotICAoVElNX1NNQ1JfU01TXzIgfCBUSU1fU01DUl9TTVNfMSkgLyohPCBUcmlnZ2VyIE1vZGUgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgVElNX1NMQVZFTU9ERV9FWFRFUk5BTDEgICAgICBcDQotICAoVElNX1NNQ1JfU01TXzIgfCBUSU1fU01DUl9TTVNfMSB8IFwNCi0gICBUSU1fU01DUl9TTVNfMCkgLyohPCBFeHRlcm5hbCBDbG9jayBNb2RlIDEgICAgICAgICAqLw0KLSNkZWZpbmUgVElNX1NMQVZFTU9ERV9DT01CSU5FRF9SRVNFVFRSSUdHRVIgXA0KLSAgVElNX1NNQ1JfU01TXzMgLyohPCBDb21iaW5lZCByZXNldCArIHRyaWdnZXIgbW9kZSAqLw0KLSNkZWZpbmUgVElNX1NMQVZFTU9ERV9DT01CSU5FRF9HQVRFRFJFU0VUIFwNCi0gIChUSU1fU01DUl9TTVNfMyB8IFRJTV9TTUNSX1NNU18wKSAvKiE8IENvbWJpbmVkIGdhdGVkICsgcmVzZXQgbW9kZSAgICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9PdXRwdXRfQ29tcGFyZV9hbmRfUFdNX21vZGVzIFRJTSBPdXRwdXQgQ29tcGFyZSBhbmQgUFdNIE1vZGVzDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFRJTV9PQ01PREVfVElNSU5HIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgRnJvemVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFRJTV9PQ01PREVfQUNUSVZFIFwNCi0gIFRJTV9DQ01SMV9PQzFNXzAgLyohPCBTZXQgY2hhbm5lbCB0byBhY3RpdmUgbGV2ZWwgb24gbWF0Y2ggICAqLw0KLSNkZWZpbmUgVElNX09DTU9ERV9JTkFDVElWRSBcDQotICBUSU1fQ0NNUjFfT0MxTV8xIC8qITwgU2V0IGNoYW5uZWwgdG8gaW5hY3RpdmUgbGV2ZWwgb24gbWF0Y2ggKi8NCi0jZGVmaW5lIFRJTV9PQ01PREVfVE9HR0xFIChUSU1fQ0NNUjFfT0MxTV8xIHwgVElNX0NDTVIxX09DMU1fMCkgLyohPCBUb2dnbGUgKi8NCi0jZGVmaW5lIFRJTV9PQ01PREVfUFdNMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChUSU1fQ0NNUjFfT0MxTV8yIHwgVElNX0NDTVIxX09DMU1fMSkgLyohPCBQV00gbW9kZSAxIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBUSU1fT0NNT0RFX1BXTTIgXA0KLSAgKFRJTV9DQ01SMV9PQzFNXzIgfCBUSU1fQ0NNUjFfT0MxTV8xIHwgVElNX0NDTVIxX09DMU1fMCkgLyohPCBQV00gbW9kZSAyICovDQotI2RlZmluZSBUSU1fT0NNT0RFX0ZPUkNFRF9BQ1RJVkUgXA0KLSAgKFRJTV9DQ01SMV9PQzFNXzIgfCBUSU1fQ0NNUjFfT0MxTV8wKSAvKiE8IEZvcmNlIGFjdGl2ZSBsZXZlbCAqLw0KLSNkZWZpbmUgVElNX09DTU9ERV9GT1JDRURfSU5BQ1RJVkUgXA0KLSAgVElNX0NDTVIxX09DMU1fMiAvKiE8IEZvcmNlIGluYWN0aXZlIGxldmVsICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBUSU1fT0NNT0RFX1JFVFJJR0VSUkFCTEVfT1BNMSBcDQotICBUSU1fQ0NNUjFfT0MxTV8zIC8qITwgUmV0cmlnZXJyYWJsZSBPUE0gbW9kZSAxICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFRJTV9PQ01PREVfUkVUUklHRVJSQUJMRV9PUE0yIFwNCi0gIChUSU1fQ0NNUjFfT0MxTV8zIHwgVElNX0NDTVIxX09DMU1fMCkgLyohPCBSZXRyaWdlcnJhYmxlIE9QTSBtb2RlIDIgKi8NCi0jZGVmaW5lIFRJTV9PQ01PREVfQ09NQklORURfUFdNMSBcDQotICAoVElNX0NDTVIxX09DMU1fMyB8IFRJTV9DQ01SMV9PQzFNXzIpIC8qITwgQ29tYmluZWQgUFdNIG1vZGUgMSAqLw0KLSNkZWZpbmUgVElNX09DTU9ERV9DT01CSU5FRF9QV00yICAgICAgICAgXA0KLSAgKFRJTV9DQ01SMV9PQzFNXzMgfCBUSU1fQ0NNUjFfT0MxTV8wIHwgXA0KLSAgIFRJTV9DQ01SMV9PQzFNXzIpIC8qITwgQ29tYmluZWQgUFdNIG1vZGUgMiAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFRJTV9PQ01PREVfQVNTWU1FVFJJQ19QV00xICAgICAgIFwNCi0gIChUSU1fQ0NNUjFfT0MxTV8zIHwgVElNX0NDTVIxX09DMU1fMSB8IFwNCi0gICBUSU1fQ0NNUjFfT0MxTV8yKSAvKiE8IEFzeW1tZXRyaWMgUFdNIG1vZGUgMSAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBUSU1fT0NNT0RFX0FTU1lNRVRSSUNfUFdNMiBcDQotICBUSU1fQ0NNUjFfT0MxTSAvKiE8IEFzeW1tZXRyaWMgUFdNIG1vZGUgMiAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBUSU1fT0NNT0RFX1BVTFNFX09OX0NPTVBBUkUgXA0KLSAgKFRJTV9DQ01SMl9PQzNNXzMgfCAgICAgICAgICAgICAgIFwNCi0gICBUSU1fQ0NNUjJfT0MzTV8xKSAvKiE8IFB1bHNlIG9uIGNvbXBhcmUgKENIMyZDSDQgb25seSkgICAgICAgICovDQotI2RlZmluZSBUSU1fT0NNT0RFX0RJUkVDVElPTl9PVVRQVVQgICAgICBcDQotICAoVElNX0NDTVIyX09DM01fMyB8IFRJTV9DQ01SMl9PQzNNXzEgfCBcDQotICAgVElNX0NDTVIyX09DM01fMCkgLyohPCBEaXJlY3Rpb24gb3V0cHV0IChDSDMmQ0g0IG9ubHkpICAgICAgICAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBUSU1fVHJpZ2dlcl9TZWxlY3Rpb24gVElNIFRyaWdnZXIgU2VsZWN0aW9uDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFRJTV9UU19JVFIwIDB4MDAwMDAwMDBVICAgLyohPCBJbnRlcm5hbCBUcmlnZ2VyIDAgKElUUjApICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgVElNX1RTX0lUUjEgVElNX1NNQ1JfVFNfMCAvKiE8IEludGVybmFsIFRyaWdnZXIgMSAoSVRSMSkgKi8NCi0jZGVmaW5lIFRJTV9UU19JVFIyIFRJTV9TTUNSX1RTXzEgLyohPCBJbnRlcm5hbCBUcmlnZ2VyIDIgKElUUjIpICovDQotI2RlZmluZSBUSU1fVFNfSVRSMyBcDQotICAoVElNX1NNQ1JfVFNfMCB8IFRJTV9TTUNSX1RTXzEpIC8qITwgSW50ZXJuYWwgVHJpZ2dlciAzIChJVFIzKSAqLw0KLSNkZWZpbmUgVElNX1RTX1RJMUZfRUQgXA0KLSAgVElNX1NNQ1JfVFNfMiAvKiE8IFRJMSBFZGdlIERldGVjdG9yIChUSTFGX0VEKSAgICAgICAgICAgICovDQotI2RlZmluZSBUSU1fVFNfVEkxRlAxIFwNCi0gIChUSU1fU01DUl9UU18wIHwgVElNX1NNQ1JfVFNfMikgLyohPCBGaWx0ZXJlZCBUaW1lciBJbnB1dCAxIChUSTFGUDEpICovDQotI2RlZmluZSBUSU1fVFNfVEkyRlAyIFwNCi0gIChUSU1fU01DUl9UU18xIHwgVElNX1NNQ1JfVFNfMikgLyohPCBGaWx0ZXJlZCBUaW1lciBJbnB1dCAyIChUSTJGUDIpICovDQotI2RlZmluZSBUSU1fVFNfRVRSRiAgICAgICAgICAgICAgICBcDQotICAoVElNX1NNQ1JfVFNfMCB8IFRJTV9TTUNSX1RTXzEgfCBcDQotICAgVElNX1NNQ1JfVFNfMikgLyohPCBGaWx0ZXJlZCBFeHRlcm5hbCBUcmlnZ2VyIGlucHV0IChFVFJGKSAqLw0KLSNpZiBkZWZpbmVkKFRJTTUpDQotI2RlZmluZSBUSU1fVFNfSVRSNCBUSU1fU01DUl9UU18zIC8qITwgSW50ZXJuYWwgVHJpZ2dlciA0IChJVFI5KSAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUSU01ICovDQotI2RlZmluZSBUSU1fVFNfSVRSNSBcDQotICAoVElNX1NNQ1JfVFNfMCB8IFRJTV9TTUNSX1RTXzMpIC8qITwgSW50ZXJuYWwgVHJpZ2dlciA1IChJVFI1KSAqLw0KLSNkZWZpbmUgVElNX1RTX0lUUjYgXA0KLSAgKFRJTV9TTUNSX1RTXzEgfCBUSU1fU01DUl9UU18zKSAvKiE8IEludGVybmFsIFRyaWdnZXIgNiAoSVRSNikgKi8NCi0jZGVmaW5lIFRJTV9UU19JVFI3ICAgICAgICAgICAgICAgIFwNCi0gIChUSU1fU01DUl9UU18wIHwgVElNX1NNQ1JfVFNfMSB8IFwNCi0gICBUSU1fU01DUl9UU18zKSAvKiE8IEludGVybmFsIFRyaWdnZXIgNyAoSVRSNykgICAgICAgICAgICAgICovDQotI2RlZmluZSBUSU1fVFNfSVRSOCBcDQotICAoVElNX1NNQ1JfVFNfMiB8IFRJTV9TTUNSX1RTXzMpIC8qITwgSW50ZXJuYWwgVHJpZ2dlciA4IChJVFI4KSAqLw0KLSNpZiBkZWZpbmVkKFRJTTIwKQ0KLSNkZWZpbmUgVElNX1RTX0lUUjkgICAgICAgICAgICAgICAgXA0KLSAgKFRJTV9TTUNSX1RTXzAgfCBUSU1fU01DUl9UU18yIHwgXA0KLSAgIFRJTV9TTUNSX1RTXzMpIC8qITwgSW50ZXJuYWwgVHJpZ2dlciA5IChJVFI5KSAgICAgICAgICAgICAgKi8NCi0jZW5kaWYgICAgICAgICAgICAvKiBUSU0yMCAqLw0KLSNkZWZpbmUgVElNX1RTX0lUUjEwICAgICAgICAgICAgICAgXA0KLSAgKFRJTV9TTUNSX1RTXzEgfCBUSU1fU01DUl9UU18yIHwgXA0KLSAgIFRJTV9TTUNSX1RTXzMpIC8qITwgSW50ZXJuYWwgVHJpZ2dlciAxMCAoSVRSMTApICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFRJTV9UU19JVFIxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoVElNX1NNQ1JfVFNfMCB8IFRJTV9TTUNSX1RTXzEgfCBUSU1fU01DUl9UU18yIHwgXA0KLSAgIFRJTV9TTUNSX1RTXzMpICAgICAgICAgICAgICAgLyohPCBJbnRlcm5hbCBUcmlnZ2VyIDExIChJVFIxMSkgICAgICAgICAgICAqLw0KLSNkZWZpbmUgVElNX1RTX05PTkUgMHhGRkZGRkZGRlUgLyohPCBObyB0cmlnZ2VyIHNlbGVjdGVkICAgICAgICAgICAgICAgICAgICAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBUSU1fVHJpZ2dlcl9Qb2xhcml0eSBUSU0gVHJpZ2dlciBQb2xhcml0eQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBUSU1fVFJJR0dFUlBPTEFSSVRZX0lOVkVSVEVEIFwNCi0gIFRJTV9FVFJQT0xBUklUWV9JTlZFUlRFRCAvKiE8IFBvbGFyaXR5IGZvciBFVFJ4IHRyaWdnZXIgc291cmNlcyAqLw0KLSNkZWZpbmUgVElNX1RSSUdHRVJQT0xBUklUWV9OT05JTlZFUlRFRCBcDQotICBUSU1fRVRSUE9MQVJJVFlfTk9OSU5WRVJURUQgLyohPCBQb2xhcml0eSBmb3IgRVRSeCB0cmlnZ2VyIHNvdXJjZXMgKi8NCi0jZGVmaW5lIFRJTV9UUklHR0VSUE9MQVJJVFlfUklTSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIFRJTV9JTlBVVENIQU5ORUxQT0xBUklUWV9SSVNJTkcgLyohPCBQb2xhcml0eSBmb3IgVEl4RlB4IG9yIFRJMV9FRCB0cmlnZ2VyIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcyAqLw0KLSNkZWZpbmUgVElNX1RSSUdHRVJQT0xBUklUWV9GQUxMSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIFRJTV9JTlBVVENIQU5ORUxQT0xBUklUWV9GQUxMSU5HIC8qITwgUG9sYXJpdHkgZm9yIFRJeEZQeCBvciBUSTFfRUQgdHJpZ2dlciBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzICovDQotI2RlZmluZSBUSU1fVFJJR0dFUlBPTEFSSVRZX0JPVEhFREdFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIFRJTV9JTlBVVENIQU5ORUxQT0xBUklUWV9CT1RIRURHRSAvKiE8IFBvbGFyaXR5IGZvciBUSXhGUHggb3IgVEkxX0VEIHRyaWdnZXIgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXMgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX1RyaWdnZXJfUHJlc2NhbGVyIFRJTSBUcmlnZ2VyIFByZXNjYWxlcg0KLSAqIEB7DQotICovDQotI2RlZmluZSBUSU1fVFJJR0dFUlBSRVNDQUxFUl9ESVYxIFwNCi0gIFRJTV9FVFJQUkVTQ0FMRVJfRElWMSAvKiE8IE5vIHByZXNjYWxlciBpcyB1c2VkICovDQotI2RlZmluZSBUSU1fVFJJR0dFUlBSRVNDQUxFUl9ESVYyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIFRJTV9FVFJQUkVTQ0FMRVJfRElWMiAvKiE8IFByZXNjYWxlciBmb3IgRXh0ZXJuYWwgRVRSIFRyaWdnZXI6IENhcHR1cmUgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1lZCBvbmNlIGV2ZXJ5IDIgZXZlbnRzLiAqLw0KLSNkZWZpbmUgVElNX1RSSUdHRVJQUkVTQ0FMRVJfRElWNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBUSU1fRVRSUFJFU0NBTEVSX0RJVjQgLyohPCBQcmVzY2FsZXIgZm9yIEV4dGVybmFsIEVUUiBUcmlnZ2VyOiBDYXB0dXJlIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtZWQgb25jZSBldmVyeSA0IGV2ZW50cy4gKi8NCi0jZGVmaW5lIFRJTV9UUklHR0VSUFJFU0NBTEVSX0RJVjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgVElNX0VUUlBSRVNDQUxFUl9ESVY4IC8qITwgUHJlc2NhbGVyIGZvciBFeHRlcm5hbCBFVFIgVHJpZ2dlcjogQ2FwdHVyZSBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybWVkIG9uY2UgZXZlcnkgOCBldmVudHMuICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9USTFfU2VsZWN0aW9uIFRJTSBUSTEgSW5wdXQgU2VsZWN0aW9uDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFRJTV9USTFTRUxFQ1RJT05fQ0gxIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgVGhlIFRJTXhfQ0gxIHBpbiBpcyBjb25uZWN0ZWQgdG8gVEkxIGlucHV0ICovDQotI2RlZmluZSBUSU1fVEkxU0VMRUNUSU9OX1hPUkNPTUJJTkFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIFRJTV9DUjJfVEkxUyAvKiE8IFRoZSBUSU14X0NIMSwgQ0gyIGFuZCBDSDMgcGlucyBhcmUgY29ubmVjdGVkIHRvIHRoZSBUSTEgXA0KLSAgICAgICAgICAgICAgICAgIGlucHV0IChYT1IgY29tYmluYXRpb24pICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9ETUFfQnVyc3RfTGVuZ3RoIFRJTSBETUEgQnVyc3QgTGVuZ3RoDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFRJTV9ETUFCVVJTVExFTkdUSF8xVFJBTlNGRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBUaGUgdHJhbnNmZXIgaXMgZG9uZSB0byAxIHJlZ2lzdGVyIHN0YXJ0aW5nIGZyb20gVElNeF9DUjEgKyBcDQotICAgICAgICAgICAgICAgICBUSU14X0RDUi5EQkEgICAqLw0KLSNkZWZpbmUgVElNX0RNQUJVUlNUTEVOR1RIXzJUUkFOU0ZFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIDB4MDAwMDAxMDBVIC8qITwgVGhlIHRyYW5zZmVyIGlzIGRvbmUgdG8gMiByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSBUSU14X0NSMSBcDQotICAgICAgICAgICAgICAgICArIFRJTXhfRENSLkRCQSAgKi8NCi0jZGVmaW5lIFRJTV9ETUFCVVJTVExFTkdUSF8zVFJBTlNGRVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAweDAwMDAwMjAwVSAvKiE8IFRoZSB0cmFuc2ZlciBpcyBkb25lIHRvIDMgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gVElNeF9DUjEgXA0KLSAgICAgICAgICAgICAgICAgKyBUSU14X0RDUi5EQkEgICovDQotI2RlZmluZSBUSU1fRE1BQlVSU1RMRU5HVEhfNFRSQU5TRkVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgMHgwMDAwMDMwMFUgLyohPCBUaGUgdHJhbnNmZXIgaXMgZG9uZSB0byA0IHJlZ2lzdGVycyBzdGFydGluZyBmcm9tIFRJTXhfQ1IxIFwNCi0gICAgICAgICAgICAgICAgICsgVElNeF9EQ1IuREJBICAqLw0KLSNkZWZpbmUgVElNX0RNQUJVUlNUTEVOR1RIXzVUUkFOU0ZFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIDB4MDAwMDA0MDBVIC8qITwgVGhlIHRyYW5zZmVyIGlzIGRvbmUgdG8gNSByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSBUSU14X0NSMSBcDQotICAgICAgICAgICAgICAgICArIFRJTXhfRENSLkRCQSAgKi8NCi0jZGVmaW5lIFRJTV9ETUFCVVJTVExFTkdUSF82VFJBTlNGRVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAweDAwMDAwNTAwVSAvKiE8IFRoZSB0cmFuc2ZlciBpcyBkb25lIHRvIDYgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gVElNeF9DUjEgXA0KLSAgICAgICAgICAgICAgICAgKyBUSU14X0RDUi5EQkEgICovDQotI2RlZmluZSBUSU1fRE1BQlVSU1RMRU5HVEhfN1RSQU5TRkVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgMHgwMDAwMDYwMFUgLyohPCBUaGUgdHJhbnNmZXIgaXMgZG9uZSB0byA3IHJlZ2lzdGVycyBzdGFydGluZyBmcm9tIFRJTXhfQ1IxIFwNCi0gICAgICAgICAgICAgICAgICsgVElNeF9EQ1IuREJBICAqLw0KLSNkZWZpbmUgVElNX0RNQUJVUlNUTEVOR1RIXzhUUkFOU0ZFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIDB4MDAwMDA3MDBVIC8qITwgVGhlIHRyYW5zZmVyIGlzIGRvbmUgdG8gOCByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSBUSU14X0NSMSBcDQotICAgICAgICAgICAgICAgICArIFRJTXhfRENSLkRCQSAgKi8NCi0jZGVmaW5lIFRJTV9ETUFCVVJTVExFTkdUSF85VFJBTlNGRVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAweDAwMDAwODAwVSAvKiE8IFRoZSB0cmFuc2ZlciBpcyBkb25lIHRvIDkgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gVElNeF9DUjEgXA0KLSAgICAgICAgICAgICAgICAgKyBUSU14X0RDUi5EQkEgICovDQotI2RlZmluZSBUSU1fRE1BQlVSU1RMRU5HVEhfMTBUUkFOU0ZFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIDB4MDAwMDA5MDBVIC8qITwgVGhlIHRyYW5zZmVyIGlzIGRvbmUgdG8gMTAgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gVElNeF9DUjEgXA0KLSAgICAgICAgICAgICAgICAgKyBUSU14X0RDUi5EQkEgKi8NCi0jZGVmaW5lIFRJTV9ETUFCVVJTVExFTkdUSF8xMVRSQU5TRkVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgMHgwMDAwMEEwMFUgLyohPCBUaGUgdHJhbnNmZXIgaXMgZG9uZSB0byAxMSByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSBUSU14X0NSMSBcDQotICAgICAgICAgICAgICAgICArIFRJTXhfRENSLkRCQSAqLw0KLSNkZWZpbmUgVElNX0RNQUJVUlNUTEVOR1RIXzEyVFJBTlNGRVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAweDAwMDAwQjAwVSAvKiE8IFRoZSB0cmFuc2ZlciBpcyBkb25lIHRvIDEyIHJlZ2lzdGVycyBzdGFydGluZyBmcm9tIFRJTXhfQ1IxIFwNCi0gICAgICAgICAgICAgICAgICsgVElNeF9EQ1IuREJBICovDQotI2RlZmluZSBUSU1fRE1BQlVSU1RMRU5HVEhfMTNUUkFOU0ZFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIDB4MDAwMDBDMDBVIC8qITwgVGhlIHRyYW5zZmVyIGlzIGRvbmUgdG8gMTMgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gVElNeF9DUjEgXA0KLSAgICAgICAgICAgICAgICAgKyBUSU14X0RDUi5EQkEgKi8NCi0jZGVmaW5lIFRJTV9ETUFCVVJTVExFTkdUSF8xNFRSQU5TRkVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgMHgwMDAwMEQwMFUgLyohPCBUaGUgdHJhbnNmZXIgaXMgZG9uZSB0byAxNCByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSBUSU14X0NSMSBcDQotICAgICAgICAgICAgICAgICArIFRJTXhfRENSLkRCQSAqLw0KLSNkZWZpbmUgVElNX0RNQUJVUlNUTEVOR1RIXzE1VFJBTlNGRVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAweDAwMDAwRTAwVSAvKiE8IFRoZSB0cmFuc2ZlciBpcyBkb25lIHRvIDE1IHJlZ2lzdGVycyBzdGFydGluZyBmcm9tIFRJTXhfQ1IxIFwNCi0gICAgICAgICAgICAgICAgICsgVElNeF9EQ1IuREJBICovDQotI2RlZmluZSBUSU1fRE1BQlVSU1RMRU5HVEhfMTZUUkFOU0ZFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIDB4MDAwMDBGMDBVIC8qITwgVGhlIHRyYW5zZmVyIGlzIGRvbmUgdG8gMTYgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gVElNeF9DUjEgXA0KLSAgICAgICAgICAgICAgICAgKyBUSU14X0RDUi5EQkEgKi8NCi0jZGVmaW5lIFRJTV9ETUFCVVJTVExFTkdUSF8xN1RSQU5TRkVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgMHgwMDAwMTAwMFUgLyohPCBUaGUgdHJhbnNmZXIgaXMgZG9uZSB0byAxNyByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSBUSU14X0NSMSBcDQotICAgICAgICAgICAgICAgICArIFRJTXhfRENSLkRCQSAqLw0KLSNkZWZpbmUgVElNX0RNQUJVUlNUTEVOR1RIXzE4VFJBTlNGRVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAweDAwMDAxMTAwVSAvKiE8IFRoZSB0cmFuc2ZlciBpcyBkb25lIHRvIDE4IHJlZ2lzdGVycyBzdGFydGluZyBmcm9tIFRJTXhfQ1IxIFwNCi0gICAgICAgICAgICAgICAgICsgVElNeF9EQ1IuREJBICovDQotI2RlZmluZSBUSU1fRE1BQlVSU1RMRU5HVEhfMTlUUkFOU0ZFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIDB4MDAwMDEyMDBVIC8qITwgVGhlIHRyYW5zZmVyIGlzIGRvbmUgdG8gMTkgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gVElNeF9DUjEgXA0KLSAgICAgICAgICAgICAgICAgKyBUSU14X0RDUi5EQkEgKi8NCi0jZGVmaW5lIFRJTV9ETUFCVVJTVExFTkdUSF8yMFRSQU5TRkVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgMHgwMDAwMTMwMFUgLyohPCBUaGUgdHJhbnNmZXIgaXMgZG9uZSB0byAyMCByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSBUSU14X0NSMSBcDQotICAgICAgICAgICAgICAgICArIFRJTXhfRENSLkRCQSAqLw0KLSNkZWZpbmUgVElNX0RNQUJVUlNUTEVOR1RIXzIxVFJBTlNGRVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAweDAwMDAxNDAwVSAvKiE8IFRoZSB0cmFuc2ZlciBpcyBkb25lIHRvIDIxIHJlZ2lzdGVycyBzdGFydGluZyBmcm9tIFRJTXhfQ1IxIFwNCi0gICAgICAgICAgICAgICAgICsgVElNeF9EQ1IuREJBICovDQotI2RlZmluZSBUSU1fRE1BQlVSU1RMRU5HVEhfMjJUUkFOU0ZFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIDB4MDAwMDE1MDBVIC8qITwgVGhlIHRyYW5zZmVyIGlzIGRvbmUgdG8gMjIgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gVElNeF9DUjEgXA0KLSAgICAgICAgICAgICAgICAgKyBUSU14X0RDUi5EQkEgKi8NCi0jZGVmaW5lIFRJTV9ETUFCVVJTVExFTkdUSF8yM1RSQU5TRkVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgMHgwMDAwMTYwMFUgLyohPCBUaGUgdHJhbnNmZXIgaXMgZG9uZSB0byAyMyByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSBUSU14X0NSMSBcDQotICAgICAgICAgICAgICAgICArIFRJTXhfRENSLkRCQSAqLw0KLSNkZWZpbmUgVElNX0RNQUJVUlNUTEVOR1RIXzI0VFJBTlNGRVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAweDAwMDAxNzAwVSAvKiE8IFRoZSB0cmFuc2ZlciBpcyBkb25lIHRvIDI0IHJlZ2lzdGVycyBzdGFydGluZyBmcm9tIFRJTXhfQ1IxIFwNCi0gICAgICAgICAgICAgICAgICsgVElNeF9EQ1IuREJBICovDQotI2RlZmluZSBUSU1fRE1BQlVSU1RMRU5HVEhfMjVUUkFOU0ZFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIDB4MDAwMDE4MDBVIC8qITwgVGhlIHRyYW5zZmVyIGlzIGRvbmUgdG8gMjUgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gVElNeF9DUjEgXA0KLSAgICAgICAgICAgICAgICAgKyBUSU14X0RDUi5EQkEgKi8NCi0jZGVmaW5lIFRJTV9ETUFCVVJTVExFTkdUSF8yNlRSQU5TRkVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgMHgwMDAwMTkwMFUgLyohPCBUaGUgdHJhbnNmZXIgaXMgZG9uZSB0byAyNiByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSBUSU14X0NSMSBcDQotICAgICAgICAgICAgICAgICArIFRJTXhfRENSLkRCQSAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBETUFfSGFuZGxlX2luZGV4IFRJTSBETUEgSGFuZGxlIEluZGV4DQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFRJTV9ETUFfSURfVVBEQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKCh1aW50MTZfdCkweDAwMDApIC8qITwgSW5kZXggb2YgdGhlIERNQSBoYW5kbGUgdXNlZCBmb3IgVXBkYXRlIERNQSByZXF1ZXN0cyBcDQotICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBUSU1fRE1BX0lEX0NDMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKHVpbnQxNl90KTB4MDAwMSkgLyohPCBJbmRleCBvZiB0aGUgRE1BIGhhbmRsZSB1c2VkIGZvciBDYXB0dXJlL0NvbXBhcmUgMSBcDQotICAgICAgICAgICAgICAgICAgICAgICAgRE1BIHJlcXVlc3RzICovDQotI2RlZmluZSBUSU1fRE1BX0lEX0NDMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKHVpbnQxNl90KTB4MDAwMikgLyohPCBJbmRleCBvZiB0aGUgRE1BIGhhbmRsZSB1c2VkIGZvciBDYXB0dXJlL0NvbXBhcmUgMiBcDQotICAgICAgICAgICAgICAgICAgICAgICAgRE1BIHJlcXVlc3RzICovDQotI2RlZmluZSBUSU1fRE1BX0lEX0NDMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKHVpbnQxNl90KTB4MDAwMykgLyohPCBJbmRleCBvZiB0aGUgRE1BIGhhbmRsZSB1c2VkIGZvciBDYXB0dXJlL0NvbXBhcmUgMyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgRE1BIHJlcXVlc3RzICovDQotI2RlZmluZSBUSU1fRE1BX0lEX0NDNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKHVpbnQxNl90KTB4MDAwNCkgLyohPCBJbmRleCBvZiB0aGUgRE1BIGhhbmRsZSB1c2VkIGZvciBDYXB0dXJlL0NvbXBhcmUgNCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgRE1BIHJlcXVlc3RzICovDQotI2RlZmluZSBUSU1fRE1BX0lEX0NPTU1VVEFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKCh1aW50MTZfdCkweDAwMDUpIC8qITwgSW5kZXggb2YgdGhlIERNQSBoYW5kbGUgdXNlZCBmb3IgQ29tbXV0YXRpb24gRE1BIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0cyAqLw0KLSNkZWZpbmUgVElNX0RNQV9JRF9UUklHR0VSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKCh1aW50MTZfdCkweDAwMDYpIC8qITwgSW5kZXggb2YgdGhlIERNQSBoYW5kbGUgdXNlZCBmb3IgVHJpZ2dlciBETUEgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RzICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIENoYW5uZWxfQ0NfU3RhdGUgVElNIENhcHR1cmUvQ29tcGFyZSBDaGFubmVsIFN0YXRlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFRJTV9DQ3hfRU5BQkxFIDB4MDAwMDAwMDFVIC8qITwgSW5wdXQgb3Igb3V0cHV0IGNoYW5uZWwgaXMgZW5hYmxlZCAqLw0KLSNkZWZpbmUgVElNX0NDeF9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAweDAwMDAwMDAwVSAvKiE8IElucHV0IG9yIG91dHB1dCBjaGFubmVsIGlzIGRpc2FibGVkIFwNCi0gICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgVElNX0NDeE5fRU5BQkxFIFwNCi0gIDB4MDAwMDAwMDRVIC8qITwgQ29tcGxlbWVudGFyeSBvdXRwdXQgY2hhbm5lbCBpcyBlbmFibGVkICovDQotI2RlZmluZSBUSU1fQ0N4Tl9ESVNBQkxFIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgQ29tcGxlbWVudGFyeSBvdXRwdXQgY2hhbm5lbCBpcyBlbmFibGVkICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9CcmVha19TeXN0ZW0gVElNIEJyZWFrIFN5c3RlbQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBUSU1fQlJFQUtfU1lTVEVNX0VDQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgU1lTQ0ZHX0NGR1IyX0VDQ0wgLyohPCBFbmFibGVzIGFuZCBsb2NrcyB0aGUgRUNDIGVycm9yIHNpZ25hbCB3aXRoIEJyZWFrIFwNCi0gICAgICAgICAgICAgICAgICAgICAgIElucHV0IG9mIFRJTTEvOC8xNS8xNi8xNy8yMCAqLw0KLSNkZWZpbmUgVElNX0JSRUFLX1NZU1RFTV9QVkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBTWVNDRkdfQ0ZHUjJfUFZETCAvKiE8IEVuYWJsZXMgYW5kIGxvY2tzIHRoZSBQVkQgY29ubmVjdGlvbiB3aXRoICAgICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgIFRJTTEvOC8xNS8xNi8xNy8yMCBCcmVhayBJbnB1dCBhbmQgYWxzbyB0aGUgUFZERSBhbmQgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgUExTIGJpdHMgb2YgdGhlIFBvd2VyIENvbnRyb2wgSW50ZXJmYWNlICovDQotI2RlZmluZSBUSU1fQlJFQUtfU1lTVEVNX1NSQU1fUEFSSVRZX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIFNZU0NGR19DRkdSMl9TUEwgLyohPCBFbmFibGVzIGFuZCBsb2NrcyB0aGUgU1JBTV9QQVJJVFkgZXJyb3Igc2lnbmFsIHdpdGggXA0KLSAgICAgICAgICAgICAgICAgICAgICBCcmVhayBJbnB1dCBvZiBUSU0xLzgvMTUvMTYvMTcvMjAgKi8NCi0jZGVmaW5lIFRJTV9CUkVBS19TWVNURU1fTE9DS1VQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIFNZU0NGR19DRkdSMl9DTEwgLyohPCBFbmFibGVzIGFuZCBsb2NrcyB0aGUgTE9DS1VQIG91dHB1dCBvZiBDb3J0ZXhNNCB3aXRoIFwNCi0gICAgICAgICAgICAgICAgICAgICAgQnJlYWsgSW5wdXQgb2YgVElNMS84LzE1LzE2LzE3LzIwICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLS8qIEVuZCBvZiBleHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotDQotLyogRXhwb3J0ZWQgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGRlZmdyb3VwIFRJTV9FeHBvcnRlZF9NYWNyb3MgVElNIEV4cG9ydGVkIE1hY3Jvcw0KLSAqIEB7DQotICovDQotDQotLyoqIEBicmllZiAgUmVzZXQgVElNIGhhbmRsZSBzdGF0ZS4NCi0gKiBAcGFyYW0gIF9fSEFORExFX18gVElNIGhhbmRsZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQ0KLSNkZWZpbmUgX19IQUxfVElNX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgIFwNCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIChfX0hBTkRMRV9fKS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFU0VUOyAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAoX19IQU5ETEVfXyktPkNoYW5uZWxTdGF0ZVswXSA9IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRVNFVDsgIFwNCi0gICAgKF9fSEFORExFX18pLT5DaGFubmVsU3RhdGVbMV0gPSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVTRVQ7ICBcDQotICAgIChfX0hBTkRMRV9fKS0+Q2hhbm5lbFN0YXRlWzJdID0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFU0VUOyAgXA0KLSAgICAoX19IQU5ETEVfXyktPkNoYW5uZWxTdGF0ZVszXSA9IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRVNFVDsgIFwNCi0gICAgKF9fSEFORExFX18pLT5DaGFubmVsU3RhdGVbNF0gPSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVTRVQ7ICBcDQotICAgIChfX0hBTkRMRV9fKS0+Q2hhbm5lbFN0YXRlWzVdID0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFU0VUOyAgXA0KLSAgICAoX19IQU5ETEVfXyktPkNoYW5uZWxOU3RhdGVbMF0gPSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVTRVQ7IFwNCi0gICAgKF9fSEFORExFX18pLT5DaGFubmVsTlN0YXRlWzFdID0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFU0VUOyBcDQotICAgIChfX0hBTkRMRV9fKS0+Q2hhbm5lbE5TdGF0ZVsyXSA9IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRVNFVDsgXA0KLSAgICAoX19IQU5ETEVfXyktPkNoYW5uZWxOU3RhdGVbM10gPSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVTRVQ7IFwNCi0gICAgKF9fSEFORExFX18pLT5ETUFCdXJzdFN0YXRlID0gSEFMX0RNQV9CVVJTVF9TVEFURV9SRVNFVDsgICAgICBcDQotICAgIChfX0hBTkRMRV9fKS0+QmFzZV9Nc3BJbml0Q2FsbGJhY2sgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAoX19IQU5ETEVfXyktPkJhc2VfTXNwRGVJbml0Q2FsbGJhY2sgPSBOVUxMOyAgICAgICAgICAgICAgICAgIFwNCi0gICAgKF9fSEFORExFX18pLT5JQ19Nc3BJbml0Q2FsbGJhY2sgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIChfX0hBTkRMRV9fKS0+SUNfTXNwRGVJbml0Q2FsbGJhY2sgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAoX19IQU5ETEVfXyktPk9DX01zcEluaXRDYWxsYmFjayA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgKF9fSEFORExFX18pLT5PQ19Nc3BEZUluaXRDYWxsYmFjayA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICBcDQotICAgIChfX0hBTkRMRV9fKS0+UFdNX01zcEluaXRDYWxsYmFjayA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAoX19IQU5ETEVfXyktPlBXTV9Nc3BEZUluaXRDYWxsYmFjayA9IE5VTEw7ICAgICAgICAgICAgICAgICAgIFwNCi0gICAgKF9fSEFORExFX18pLT5PbmVQdWxzZV9Nc3BJbml0Q2FsbGJhY2sgPSBOVUxMOyAgICAgICAgICAgICAgICBcDQotICAgIChfX0hBTkRMRV9fKS0+T25lUHVsc2VfTXNwRGVJbml0Q2FsbGJhY2sgPSBOVUxMOyAgICAgICAgICAgICAgXA0KLSAgICAoX19IQU5ETEVfXyktPkVuY29kZXJfTXNwSW5pdENhbGxiYWNrID0gTlVMTDsgICAgICAgICAgICAgICAgIFwNCi0gICAgKF9fSEFORExFX18pLT5FbmNvZGVyX01zcERlSW5pdENhbGxiYWNrID0gTlVMTDsgICAgICAgICAgICAgICBcDQotICAgIChfX0hBTkRMRV9fKS0+SGFsbFNlbnNvcl9Nc3BJbml0Q2FsbGJhY2sgPSBOVUxMOyAgICAgICAgICAgICAgXA0KLSAgICAoX19IQU5ETEVfXyktPkhhbGxTZW5zb3JfTXNwRGVJbml0Q2FsbGJhY2sgPSBOVUxMOyAgICAgICAgICAgIFwNCi0gIH0gd2hpbGUgKDApDQotI2Vsc2UNCi0jZGVmaW5lIF9fSEFMX1RJTV9SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICBcDQotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAoX19IQU5ETEVfXyktPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRVNFVDsgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgKF9fSEFORExFX18pLT5DaGFubmVsU3RhdGVbMF0gPSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVTRVQ7ICBcDQotICAgIChfX0hBTkRMRV9fKS0+Q2hhbm5lbFN0YXRlWzFdID0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFU0VUOyAgXA0KLSAgICAoX19IQU5ETEVfXyktPkNoYW5uZWxTdGF0ZVsyXSA9IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRVNFVDsgIFwNCi0gICAgKF9fSEFORExFX18pLT5DaGFubmVsU3RhdGVbM10gPSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVTRVQ7ICBcDQotICAgIChfX0hBTkRMRV9fKS0+Q2hhbm5lbFN0YXRlWzRdID0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFU0VUOyAgXA0KLSAgICAoX19IQU5ETEVfXyktPkNoYW5uZWxTdGF0ZVs1XSA9IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRVNFVDsgIFwNCi0gICAgKF9fSEFORExFX18pLT5DaGFubmVsTlN0YXRlWzBdID0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFU0VUOyBcDQotICAgIChfX0hBTkRMRV9fKS0+Q2hhbm5lbE5TdGF0ZVsxXSA9IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRVNFVDsgXA0KLSAgICAoX19IQU5ETEVfXyktPkNoYW5uZWxOU3RhdGVbMl0gPSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVTRVQ7IFwNCi0gICAgKF9fSEFORExFX18pLT5DaGFubmVsTlN0YXRlWzNdID0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFU0VUOyBcDQotICAgIChfX0hBTkRMRV9fKS0+RE1BQnVyc3RTdGF0ZSA9IEhBTF9ETUFfQlVSU1RfU1RBVEVfUkVTRVQ7ICAgICAgXA0KLSAgfSB3aGlsZSAoMCkNCi0jZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgdGhlIFRJTSBwZXJpcGhlcmFsLg0KLSAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9USU1fRU5BQkxFKF9fSEFORExFX18pIFwNCi0gICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgfD0gKFRJTV9DUjFfQ0VOKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSB0aGUgVElNIG1haW4gT3V0cHV0Lg0KLSAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9USU1fTU9FX0VOQUJMRShfX0hBTkRMRV9fKSBcDQotICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+QkRUUiB8PSAoVElNX0JEVFJfTU9FKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgdGhlIFRJTSBwZXJpcGhlcmFsLg0KLSAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9USU1fRElTQUJMRShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBpZiAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDRVIgJiBUSU1fQ0NFUl9DQ3hFX01BU0spID09IDBVTCkgeyAgICBcDQotICAgICAgaWYgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ0VSICYgVElNX0NDRVJfQ0N4TkVfTUFTSykgPT0gMFVMKSB7IFwNCi0gICAgICAgIChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSAmPSB+KFRJTV9DUjFfQ0VOKTsgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIH0gd2hpbGUgKDApDQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIHRoZSBUSU0gbWFpbiBPdXRwdXQuDQotICogQHBhcmFtICBfX0hBTkRMRV9fIFRJTSBoYW5kbGUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKiBAbm90ZSBUaGUgTWFpbiBPdXRwdXQgRW5hYmxlIG9mIGEgdGltZXIgaW5zdGFuY2UgaXMgZGlzYWJsZWQgb25seSBpZiBhbGwgdGhlDQotICogQ0N4IGFuZCBDQ3hOIGNoYW5uZWxzIGhhdmUgYmVlbiBkaXNhYmxlZA0KLSAqLw0KLSNkZWZpbmUgX19IQUxfVElNX01PRV9ESVNBQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgaWYgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ0VSICYgVElNX0NDRVJfQ0N4RV9NQVNLKSA9PSAwVUwpIHsgICAgXA0KLSAgICAgIGlmICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NFUiAmIFRJTV9DQ0VSX0NDeE5FX01BU0spID09IDBVTCkgeyBcDQotICAgICAgICAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5CRFRSICY9IH4oVElNX0JEVFJfTU9FKTsgICAgICAgICAgICAgICAgIFwNCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICB9IHdoaWxlICgwKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSB0aGUgVElNIG1haW4gT3V0cHV0Lg0KLSAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlDQotICogQHJldHZhbCBOb25lDQotICogQG5vdGUgVGhlIE1haW4gT3V0cHV0IEVuYWJsZSBvZiBhIHRpbWVyIGluc3RhbmNlIGlzIGRpc2FibGVkIHVuY29uZGl0aW9uYWxseQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfVElNX01PRV9ESVNBQkxFX1VOQ09ORElUSU9OQUxMWShfX0hBTkRMRV9fKSBcDQotICAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5CRFRSICY9IH4oVElNX0JEVFJfTU9FKQ0KLQ0KLS8qKiBAYnJpZWYgIEVuYWJsZSB0aGUgc3BlY2lmaWVkIFRJTSBpbnRlcnJ1cHQuDQotICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVElNIEhhbmRsZS4NCi0gKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBUSU0gaW50ZXJydXB0IHNvdXJjZSB0byBlbmFibGUuDQotICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0lUX1VQREFURTogVXBkYXRlIGludGVycnVwdA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfQ0MxOiAgIENhcHR1cmUvQ29tcGFyZSAxIGludGVycnVwdA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfQ0MyOiAgQ2FwdHVyZS9Db21wYXJlIDIgaW50ZXJydXB0DQotICogICAgICAgICAgICBAYXJnIFRJTV9JVF9DQzM6ICBDYXB0dXJlL0NvbXBhcmUgMyBpbnRlcnJ1cHQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0lUX0NDNDogIENhcHR1cmUvQ29tcGFyZSA0IGludGVycnVwdA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfQ09NOiAgIENvbW11dGF0aW9uIGludGVycnVwdA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfVFJJR0dFUjogVHJpZ2dlciBpbnRlcnJ1cHQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0lUX0JSRUFLOiBCcmVhayBpbnRlcnJ1cHQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0lUX0lEWDogSW5kZXggaW50ZXJydXB0DQotICogICAgICAgICAgICBAYXJnIFRJTV9JVF9ESVI6IERpcmVjdGlvbiBjaGFuZ2UgaW50ZXJydXB0DQotICogICAgICAgICAgICBAYXJnIFRJTV9JVF9JRVJSOiBJbmRleCBlcnJvciBpbnRlcnJ1cHQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0lUX1RFUlI6IFRyYW5zaXRpb24gZXJyb3IgaW50ZXJydXB0DQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9USU1fRU5BQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pIFwNCi0gICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5ESUVSIHw9IChfX0lOVEVSUlVQVF9fKSkNCi0NCi0vKiogQGJyaWVmICBEaXNhYmxlIHRoZSBzcGVjaWZpZWQgVElNIGludGVycnVwdC4NCi0gKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBUSU0gSGFuZGxlLg0KLSAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFRJTSBpbnRlcnJ1cHQgc291cmNlIHRvIGRpc2FibGUuDQotICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0lUX1VQREFURTogVXBkYXRlIGludGVycnVwdA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfQ0MxOiAgIENhcHR1cmUvQ29tcGFyZSAxIGludGVycnVwdA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfQ0MyOiAgQ2FwdHVyZS9Db21wYXJlIDIgaW50ZXJydXB0DQotICogICAgICAgICAgICBAYXJnIFRJTV9JVF9DQzM6ICBDYXB0dXJlL0NvbXBhcmUgMyBpbnRlcnJ1cHQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0lUX0NDNDogIENhcHR1cmUvQ29tcGFyZSA0IGludGVycnVwdA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfQ09NOiAgIENvbW11dGF0aW9uIGludGVycnVwdA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfVFJJR0dFUjogVHJpZ2dlciBpbnRlcnJ1cHQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0lUX0JSRUFLOiBCcmVhayBpbnRlcnJ1cHQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0lUX0lEWDogSW5kZXggaW50ZXJydXB0DQotICogICAgICAgICAgICBAYXJnIFRJTV9JVF9ESVI6IERpcmVjdGlvbiBjaGFuZ2UgaW50ZXJydXB0DQotICogICAgICAgICAgICBAYXJnIFRJTV9JVF9JRVJSOiBJbmRleCBlcnJvciBpbnRlcnJ1cHQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0lUX1RFUlI6IFRyYW5zaXRpb24gZXJyb3IgaW50ZXJydXB0DQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9USU1fRElTQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSBcDQotICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+RElFUiAmPSB+KF9fSU5URVJSVVBUX18pKQ0KLQ0KLS8qKiBAYnJpZWYgIEVuYWJsZSB0aGUgc3BlY2lmaWVkIERNQSByZXF1ZXN0Lg0KLSAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFRJTSBIYW5kbGUuDQotICogQHBhcmFtICBfX0RNQV9fIHNwZWNpZmllcyB0aGUgVElNIERNQSByZXF1ZXN0IHRvIGVuYWJsZS4NCi0gKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX1VQREFURTogVXBkYXRlIERNQSByZXF1ZXN0DQotICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfQ0MxOiAgIENhcHR1cmUvQ29tcGFyZSAxIERNQSByZXF1ZXN0DQotICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfQ0MyOiAgQ2FwdHVyZS9Db21wYXJlIDIgRE1BIHJlcXVlc3QNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9DQzM6ICBDYXB0dXJlL0NvbXBhcmUgMyBETUEgcmVxdWVzdA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX0NDNDogIENhcHR1cmUvQ29tcGFyZSA0IERNQSByZXF1ZXN0DQotICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfQ09NOiAgIENvbW11dGF0aW9uIERNQSByZXF1ZXN0DQotICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfVFJJR0dFUjogVHJpZ2dlciBETUEgcmVxdWVzdA0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfVElNX0VOQUJMRV9ETUEoX19IQU5ETEVfXywgX19ETUFfXykgXA0KLSAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkRJRVIgfD0gKF9fRE1BX18pKQ0KLQ0KLS8qKiBAYnJpZWYgIERpc2FibGUgdGhlIHNwZWNpZmllZCBETUEgcmVxdWVzdC4NCi0gKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBUSU0gSGFuZGxlLg0KLSAqIEBwYXJhbSAgX19ETUFfXyBzcGVjaWZpZXMgdGhlIFRJTSBETUEgcmVxdWVzdCB0byBkaXNhYmxlLg0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfVVBEQVRFOiBVcGRhdGUgRE1BIHJlcXVlc3QNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9DQzE6ICAgQ2FwdHVyZS9Db21wYXJlIDEgRE1BIHJlcXVlc3QNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9DQzI6ICBDYXB0dXJlL0NvbXBhcmUgMiBETUEgcmVxdWVzdA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX0NDMzogIENhcHR1cmUvQ29tcGFyZSAzIERNQSByZXF1ZXN0DQotICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfQ0M0OiAgQ2FwdHVyZS9Db21wYXJlIDQgRE1BIHJlcXVlc3QNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9DT006ICAgQ29tbXV0YXRpb24gRE1BIHJlcXVlc3QNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9UUklHR0VSOiBUcmlnZ2VyIERNQSByZXF1ZXN0DQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9USU1fRElTQUJMRV9ETUEoX19IQU5ETEVfXywgX19ETUFfXykgXA0KLSAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkRJRVIgJj0gfihfX0RNQV9fKSkNCi0NCi0vKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgVElNIGludGVycnVwdCBmbGFnIGlzIHNldCBvciBub3QuDQotICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVElNIEhhbmRsZS4NCi0gKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgVElNIGludGVycnVwdCBmbGFnIHRvIGNoZWNrLg0KLSAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19VUERBVEU6IFVwZGF0ZSBpbnRlcnJ1cHQgZmxhZw0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DQzE6IENhcHR1cmUvQ29tcGFyZSAxIGludGVycnVwdCBmbGFnDQotICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX0NDMjogQ2FwdHVyZS9Db21wYXJlIDIgaW50ZXJydXB0IGZsYWcNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0ZMQUdfQ0MzOiBDYXB0dXJlL0NvbXBhcmUgMyBpbnRlcnJ1cHQgZmxhZw0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DQzQ6IENhcHR1cmUvQ29tcGFyZSA0IGludGVycnVwdCBmbGFnDQotICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX0NDNTogQ29tcGFyZSA1IGludGVycnVwdCBmbGFnDQotICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX0NDNjogQ29tcGFyZSA2IGludGVycnVwdCBmbGFnDQotICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX0NPTTogIENvbW11dGF0aW9uIGludGVycnVwdCBmbGFnDQotICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX1RSSUdHRVI6IFRyaWdnZXIgaW50ZXJydXB0IGZsYWcNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0ZMQUdfQlJFQUs6IEJyZWFrIGludGVycnVwdCBmbGFnDQotICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX0JSRUFLMjogQnJlYWsgMiBpbnRlcnJ1cHQgZmxhZw0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19TWVNURU1fQlJFQUs6IFN5c3RlbSBCcmVhayBpbnRlcnJ1cHQgZmxhZw0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DQzFPRjogQ2FwdHVyZS9Db21wYXJlIDEgb3ZlcmNhcHR1cmUgZmxhZw0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DQzJPRjogQ2FwdHVyZS9Db21wYXJlIDIgb3ZlcmNhcHR1cmUgZmxhZw0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DQzNPRjogQ2FwdHVyZS9Db21wYXJlIDMgb3ZlcmNhcHR1cmUgZmxhZw0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DQzRPRjogQ2FwdHVyZS9Db21wYXJlIDQgb3ZlcmNhcHR1cmUgZmxhZw0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19JRFg6IEluZGV4IGludGVycnVwdCBmbGFnDQotICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX0RJUjogRGlyZWN0aW9uIGNoYW5nZSBpbnRlcnJ1cHQgZmxhZw0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19JRVJSOiBJbmRleCBlcnJvciBpbnRlcnJ1cHQgZmxhZw0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19URVJSOiBUcmFuc2l0aW9uIGVycm9yIGludGVycnVwdCBmbGFnDQotICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fRkxBR19fIChUUlVFIG9yIEZBTFNFKS4NCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1RJTV9HRVRfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgXA0KLSAgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5TUiAmIChfX0ZMQUdfXykpID09IChfX0ZMQUdfXykpDQotDQotLyoqIEBicmllZiAgQ2xlYXIgdGhlIHNwZWNpZmllZCBUSU0gaW50ZXJydXB0IGZsYWcuDQotICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVElNIEhhbmRsZS4NCi0gKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgVElNIGludGVycnVwdCBmbGFnIHRvIGNsZWFyLg0KLSAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19VUERBVEU6IFVwZGF0ZSBpbnRlcnJ1cHQgZmxhZw0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DQzE6IENhcHR1cmUvQ29tcGFyZSAxIGludGVycnVwdCBmbGFnDQotICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX0NDMjogQ2FwdHVyZS9Db21wYXJlIDIgaW50ZXJydXB0IGZsYWcNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0ZMQUdfQ0MzOiBDYXB0dXJlL0NvbXBhcmUgMyBpbnRlcnJ1cHQgZmxhZw0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DQzQ6IENhcHR1cmUvQ29tcGFyZSA0IGludGVycnVwdCBmbGFnDQotICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX0NDNTogQ29tcGFyZSA1IGludGVycnVwdCBmbGFnDQotICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX0NDNjogQ29tcGFyZSA2IGludGVycnVwdCBmbGFnDQotICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX0NPTTogIENvbW11dGF0aW9uIGludGVycnVwdCBmbGFnDQotICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX1RSSUdHRVI6IFRyaWdnZXIgaW50ZXJydXB0IGZsYWcNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0ZMQUdfQlJFQUs6IEJyZWFrIGludGVycnVwdCBmbGFnDQotICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX0JSRUFLMjogQnJlYWsgMiBpbnRlcnJ1cHQgZmxhZw0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19TWVNURU1fQlJFQUs6IFN5c3RlbSBCcmVhayBpbnRlcnJ1cHQgZmxhZw0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DQzFPRjogQ2FwdHVyZS9Db21wYXJlIDEgb3ZlcmNhcHR1cmUgZmxhZw0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DQzJPRjogQ2FwdHVyZS9Db21wYXJlIDIgb3ZlcmNhcHR1cmUgZmxhZw0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DQzNPRjogQ2FwdHVyZS9Db21wYXJlIDMgb3ZlcmNhcHR1cmUgZmxhZw0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DQzRPRjogQ2FwdHVyZS9Db21wYXJlIDQgb3ZlcmNhcHR1cmUgZmxhZw0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19JRFg6IEluZGV4IGludGVycnVwdCBmbGFnDQotICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX0RJUjogRGlyZWN0aW9uIGNoYW5nZSBpbnRlcnJ1cHQgZmxhZw0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19JRVJSOiBJbmRleCBlcnJvciBpbnRlcnJ1cHQgZmxhZw0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19URVJSOiBUcmFuc2l0aW9uIGVycm9yIGludGVycnVwdCBmbGFnDQotICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fRkxBR19fIChUUlVFIG9yIEZBTFNFKS4NCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1RJTV9DTEVBUl9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSBcDQotICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+U1IgPSB+KF9fRkxBR19fKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBUSU0gaW50ZXJydXB0IHNvdXJjZSBpcyBlbmFibGVkIG9yIG5vdC4NCi0gKiBAcGFyYW0gIF9fSEFORExFX18gVElNIGhhbmRsZQ0KLSAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFRJTSBpbnRlcnJ1cHQgc291cmNlIHRvIGNoZWNrLg0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIFRJTV9JVF9VUERBVEU6IFVwZGF0ZSBpbnRlcnJ1cHQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0lUX0NDMTogICBDYXB0dXJlL0NvbXBhcmUgMSBpbnRlcnJ1cHQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0lUX0NDMjogIENhcHR1cmUvQ29tcGFyZSAyIGludGVycnVwdA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfQ0MzOiAgQ2FwdHVyZS9Db21wYXJlIDMgaW50ZXJydXB0DQotICogICAgICAgICAgICBAYXJnIFRJTV9JVF9DQzQ6ICBDYXB0dXJlL0NvbXBhcmUgNCBpbnRlcnJ1cHQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0lUX0NPTTogICBDb21tdXRhdGlvbiBpbnRlcnJ1cHQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0lUX1RSSUdHRVI6IFRyaWdnZXIgaW50ZXJydXB0DQotICogICAgICAgICAgICBAYXJnIFRJTV9JVF9CUkVBSzogQnJlYWsgaW50ZXJydXB0DQotICogICAgICAgICAgICBAYXJnIFRJTV9JVF9JRFg6IEluZGV4IGludGVycnVwdA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfRElSOiBEaXJlY3Rpb24gY2hhbmdlIGludGVycnVwdA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfSUVSUjogSW5kZXggZXJyb3IgaW50ZXJydXB0DQotICogICAgICAgICAgICBAYXJnIFRJTV9JVF9URVJSOiBUcmFuc2l0aW9uIGVycm9yIGludGVycnVwdA0KLSAqIEByZXR2YWwgVGhlIHN0YXRlIG9mIFRJTV9JVCAoU0VUIG9yIFJFU0VUKS4NCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1RJTV9HRVRfSVRfU09VUkNFKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgICAgICAgICAgICAgXA0KLSAgKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+RElFUiAmIChfX0lOVEVSUlVQVF9fKSkgPT0gKF9fSU5URVJSVVBUX18pKSBcDQotICAgICAgID8gU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgOiBSRVNFVCkNCi0NCi0vKiogQGJyaWVmIENsZWFyIHRoZSBUSU0gaW50ZXJydXB0IHBlbmRpbmcgYml0cy4NCi0gKiBAcGFyYW0gIF9fSEFORExFX18gVElNIGhhbmRsZQ0KLSAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIGludGVycnVwdCBwZW5kaW5nIGJpdCB0byBjbGVhci4NCi0gKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfVVBEQVRFOiBVcGRhdGUgaW50ZXJydXB0DQotICogICAgICAgICAgICBAYXJnIFRJTV9JVF9DQzE6ICAgQ2FwdHVyZS9Db21wYXJlIDEgaW50ZXJydXB0DQotICogICAgICAgICAgICBAYXJnIFRJTV9JVF9DQzI6ICBDYXB0dXJlL0NvbXBhcmUgMiBpbnRlcnJ1cHQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0lUX0NDMzogIENhcHR1cmUvQ29tcGFyZSAzIGludGVycnVwdA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfQ0M0OiAgQ2FwdHVyZS9Db21wYXJlIDQgaW50ZXJydXB0DQotICogICAgICAgICAgICBAYXJnIFRJTV9JVF9DT006ICAgQ29tbXV0YXRpb24gaW50ZXJydXB0DQotICogICAgICAgICAgICBAYXJnIFRJTV9JVF9UUklHR0VSOiBUcmlnZ2VyIGludGVycnVwdA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfQlJFQUs6IEJyZWFrIGludGVycnVwdA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfSURYOiBJbmRleCBpbnRlcnJ1cHQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0lUX0RJUjogRGlyZWN0aW9uIGNoYW5nZSBpbnRlcnJ1cHQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0lUX0lFUlI6IEluZGV4IGVycm9yIGludGVycnVwdA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfVEVSUjogVHJhbnNpdGlvbiBlcnJvciBpbnRlcnJ1cHQNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1RJTV9DTEVBUl9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSBcDQotICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+U1IgPSB+KF9fSU5URVJSVVBUX18pKQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIEZvcmNlIGEgY29udGludW91cyBjb3B5IG9mIHRoZSB1cGRhdGUgaW50ZXJydXB0IGZsYWcgKFVJRikgaW50byB0aGUNCi10aW1lciBjb3VudGVyIHJlZ2lzdGVyIChiaXQgMzEpLg0KLSAgKiBAbm90ZSBUaGlzIGFsbG93cyBib3RoIHRoZSBjb3VudGVyIHZhbHVlIGFuZCBhIHBvdGVudGlhbCByb2xsLW92ZXIgY29uZGl0aW9uDQotc2lnbmFsbGVkIGJ5IHRoZSBVSUZDUFkgZmxhZyB0byBiZSByZWFkDQotICAqICAgICAgIGluIGFuIGF0b21pYyB3YXkuDQotICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi1tb2RlLg0KLSAgKi8NCi0jZGVmaW5lIF9fSEFMX1RJTV9VSUZSRU1BUF9FTkFCTEUoX19IQU5ETEVfXykgXA0KLSAgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgfD0gVElNX0NSMV9VSUZSRU1BUCkpDQotDQotLyoqDQotICAqIEBicmllZiAgRGlzYWJsZSB1cGRhdGUgaW50ZXJydXB0IGZsYWcgKFVJRikgcmVtYXBwaW5nLg0KLSAgKiBAcGFyYW0gIF9fSEFORExFX18gVElNIGhhbmRsZS4NCi0gICogQHJldHZhbCBOb25lDQotbW9kZS4NCi0gICovDQotI2RlZmluZSBfX0hBTF9USU1fVUlGUkVNQVBfRElTQUJMRShfX0hBTkRMRV9fKSBcDQotICAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSAmPSB+VElNX0NSMV9VSUZSRU1BUCkpDQotDQotLyoqDQotICAqIEBicmllZiAgR2V0IHVwZGF0ZSBpbnRlcnJ1cHQgZmxhZyAoVUlGKSBjb3B5IHN0YXR1cy4NCi0gICogQHBhcmFtICBfX0NPVU5URVJfXyBDb3VudGVyIHZhbHVlLg0KLSAgKiBAcmV0dmFsIFRoZSBzdGF0ZSBvZiBVSUZDUFkgKFRSVUUgb3IgRkFMU0UpLg0KLW1vZGUuDQotICAqLw0KLSNkZWZpbmUgX19IQUxfVElNX0dFVF9VSUZDUFkoX19DT1VOVEVSX18pIFwNCi0gICgoKF9fQ09VTlRFUl9fKSAmIChUSU1fQ05UX1VJRkNQWSkpID09IChUSU1fQ05UX1VJRkNQWSkpDQotDQotLyoqDQotICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIFRJTSBDb3VudGVyIGlzIHVzZWQgYXMgZG93bmNvdW50ZXIuDQotICogQHBhcmFtICBfX0hBTkRMRV9fIFRJTSBoYW5kbGUuDQotICogQHJldHZhbCBGYWxzZSAoQ291bnRlciB1c2VkIGFzIHVwY291bnRlcikgb3IgVHJ1ZSAoQ291bnRlciB1c2VkIGFzDQotICogZG93bmNvdW50ZXIpDQotICogQG5vdGUgVGhpcyBtYWNybyBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIHRvIGdldCB0aGUgY291bnRpbmcgbW9kZSB3aGVuIHRoZQ0KLSAqIHRpbWVyIG9wZXJhdGVzIGluIENlbnRlci1hbGlnbmVkIG1vZGUgb3IgRW5jb2RlciBtb2RlLg0KLSAqLw0KLSNkZWZpbmUgX19IQUxfVElNX0lTX1RJTV9DT1VOVElOR19ET1dOKF9fSEFORExFX18pIFwNCi0gICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxICYgKFRJTV9DUjFfRElSKSkgPT0gKFRJTV9DUjFfRElSKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCB0aGUgVElNIFByZXNjYWxlciBvbiBydW50aW1lLg0KLSAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlLg0KLSAqIEBwYXJhbSAgX19QUkVTQ19fIHNwZWNpZmllcyB0aGUgUHJlc2NhbGVyIG5ldyB2YWx1ZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1RJTV9TRVRfUFJFU0NBTEVSKF9fSEFORExFX18sIF9fUFJFU0NfXykgXA0KLSAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlBTQyA9IChfX1BSRVNDX18pKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IHRoZSBUSU0gQ291bnRlciBSZWdpc3RlciB2YWx1ZSBvbiBydW50aW1lLg0KLSAqIE5vdGUgUGxlYXNlIGNoZWNrIGlmIHRoZSBiaXQgMzEgb2YgQ05UIHJlZ2lzdGVyIGlzIHVzZWQgYXMgVUlGIGNvcHkgb3Igbm90LA0KLSAqIHRoaXMgbWF5IGFmZmVjdCB0aGUgY291bnRlciByYW5nZSBpbiBjYXNlIG9mIDMyIGJpdHMgY291bnRlciBUSU0gaW5zdGFuY2UuDQotICogICAgICBCaXQgMzEgb2YgQ05UIGNhbiBiZSBlbmFibGVkL2Rpc2FibGVkIHVzaW5nDQotICogX19IQUxfVElNX1VJRlJFTUFQX0VOQUJMRSgpL19fSEFMX1RJTV9VSUZSRU1BUF9ESVNBQkxFKCkgbWFjcm9zLg0KLSAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlLg0KLSAqIEBwYXJhbSAgX19DT1VOVEVSX18gc3BlY2lmaWVzIHRoZSBDb3VudGVyIHJlZ2lzdGVyIG5ldyB2YWx1ZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1RJTV9TRVRfQ09VTlRFUihfX0hBTkRMRV9fLCBfX0NPVU5URVJfXykgXA0KLSAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNOVCA9IChfX0NPVU5URVJfXykpDQotDQotLyoqDQotICogQGJyaWVmICBHZXQgdGhlIFRJTSBDb3VudGVyIFJlZ2lzdGVyIHZhbHVlIG9uIHJ1bnRpbWUuDQotICogQHBhcmFtICBfX0hBTkRMRV9fIFRJTSBoYW5kbGUuDQotICogQHJldHZhbCAxNi1iaXQgb3IgMzItYml0IHZhbHVlIG9mIHRoZSB0aW1lciBjb3VudGVyIHJlZ2lzdGVyIChUSU14X0NOVCkNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1RJTV9HRVRfQ09VTlRFUihfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q05UKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IHRoZSBUSU0gQXV0b3JlbG9hZCBSZWdpc3RlciB2YWx1ZSBvbiBydW50aW1lIHdpdGhvdXQgY2FsbGluZw0KLSAqIGFub3RoZXIgdGltZSBhbnkgSW5pdCBmdW5jdGlvbi4NCi0gKiBAcGFyYW0gIF9fSEFORExFX18gVElNIGhhbmRsZS4NCi0gKiBAcGFyYW0gIF9fQVVUT1JFTE9BRF9fIHNwZWNpZmllcyB0aGUgQ291bnRlciByZWdpc3RlciBuZXcgdmFsdWUuDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9USU1fU0VUX0FVVE9SRUxPQUQoX19IQU5ETEVfXywgX19BVVRPUkVMT0FEX18pIFwNCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5BUlIgPSAoX19BVVRPUkVMT0FEX18pOyAgICAgICAgICBcDQotICAgIChfX0hBTkRMRV9fKS0+SW5pdC5QZXJpb2QgPSAoX19BVVRPUkVMT0FEX18pOyAgICAgICAgICAgIFwNCi0gIH0gd2hpbGUgKDApDQotDQotLyoqDQotICogQGJyaWVmICBHZXQgdGhlIFRJTSBBdXRvcmVsb2FkIFJlZ2lzdGVyIHZhbHVlIG9uIHJ1bnRpbWUuDQotICogQHBhcmFtICBfX0hBTkRMRV9fIFRJTSBoYW5kbGUuDQotICogQHJldHZhbCAxNi1iaXQgb3IgMzItYml0IHZhbHVlIG9mIHRoZSB0aW1lciBhdXRvLXJlbG9hZCByZWdpc3RlcihUSU14X0FSUikNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1RJTV9HRVRfQVVUT1JFTE9BRChfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+QVJSKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IHRoZSBUSU0gQ2xvY2sgRGl2aXNpb24gdmFsdWUgb24gcnVudGltZSB3aXRob3V0IGNhbGxpbmcgYW5vdGhlcg0KLSAqIHRpbWUgYW55IEluaXQgZnVuY3Rpb24uDQotICogQHBhcmFtICBfX0hBTkRMRV9fIFRJTSBoYW5kbGUuDQotICogQHBhcmFtICBfX0NLRF9fIHNwZWNpZmllcyB0aGUgY2xvY2sgZGl2aXNpb24gdmFsdWUuDQotICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlOg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0xPQ0tESVZJU0lPTl9ESVYxOiB0RFRTPXRDS19JTlQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NMT0NLRElWSVNJT05fRElWMjogdERUUz0yKnRDS19JTlQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NMT0NLRElWSVNJT05fRElWNDogdERUUz00KnRDS19JTlQNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1RJTV9TRVRfQ0xPQ0tESVZJU0lPTihfX0hBTkRMRV9fLCBfX0NLRF9fKSBcDQotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgJj0gKH5USU1fQ1IxX0NLRCk7ICAgICAgIFwNCi0gICAgKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxIHw9IChfX0NLRF9fKTsgICAgICAgICAgICBcDQotICAgIChfX0hBTkRMRV9fKS0+SW5pdC5DbG9ja0RpdmlzaW9uID0gKF9fQ0tEX18pOyAgICAgICAgXA0KLSAgfSB3aGlsZSAoMCkNCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCB0aGUgVElNIENsb2NrIERpdmlzaW9uIHZhbHVlIG9uIHJ1bnRpbWUuDQotICogQHBhcmFtICBfX0hBTkRMRV9fIFRJTSBoYW5kbGUuDQotICogQHJldHZhbCBUaGUgY2xvY2sgZGl2aXNpb24gY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NMT0NLRElWSVNJT05fRElWMTogdERUUz10Q0tfSU5UDQotICogICAgICAgICAgICBAYXJnIFRJTV9DTE9DS0RJVklTSU9OX0RJVjI6IHREVFM9Mip0Q0tfSU5UDQotICogICAgICAgICAgICBAYXJnIFRJTV9DTE9DS0RJVklTSU9OX0RJVjQ6IHREVFM9NCp0Q0tfSU5UDQotICovDQotI2RlZmluZSBfX0hBTF9USU1fR0VUX0NMT0NLRElWSVNJT04oX19IQU5ETEVfXykgXA0KLSAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSAmIFRJTV9DUjFfQ0tEKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IHRoZSBUSU0gSW5wdXQgQ2FwdHVyZSBwcmVzY2FsZXIgb24gcnVudGltZSB3aXRob3V0IGNhbGxpbmcNCi0gKiBhbm90aGVyIHRpbWUgSEFMX1RJTV9JQ19Db25maWdDaGFubmVsKCkgZnVuY3Rpb24uDQotICogQHBhcmFtICBfX0hBTkRMRV9fIFRJTSBoYW5kbGUuDQotICogQHBhcmFtICBfX0NIQU5ORUxfXyBUSU0gQ2hhbm5lbHMgdG8gYmUgY29uZmlndXJlZC4NCi0gKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkDQotICogQHBhcmFtICBfX0lDUFNDX18gc3BlY2lmaWVzIHRoZSBJbnB1dCBDYXB0dXJlNCBwcmVzY2FsZXIgbmV3IHZhbHVlLg0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIFRJTV9JQ1BTQ19ESVYxOiBubyBwcmVzY2FsZXINCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0lDUFNDX0RJVjI6IGNhcHR1cmUgaXMgZG9uZSBvbmNlIGV2ZXJ5IDIgZXZlbnRzDQotICogICAgICAgICAgICBAYXJnIFRJTV9JQ1BTQ19ESVY0OiBjYXB0dXJlIGlzIGRvbmUgb25jZSBldmVyeSA0IGV2ZW50cw0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fSUNQU0NfRElWODogY2FwdHVyZSBpcyBkb25lIG9uY2UgZXZlcnkgOCBldmVudHMNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1RJTV9TRVRfSUNQUkVTQ0FMRVIoX19IQU5ETEVfXywgX19DSEFOTkVMX18sIF9fSUNQU0NfXykgICBcDQotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBUSU1fUkVTRVRfSUNQUkVTQ0FMRVJWQUxVRSgoX19IQU5ETEVfXyksIChfX0NIQU5ORUxfXykpOyAgICAgICAgICAgIFwNCi0gICAgVElNX1NFVF9JQ1BSRVNDQUxFUlZBTFVFKChfX0hBTkRMRV9fKSwgKF9fQ0hBTk5FTF9fKSwgKF9fSUNQU0NfXykpOyBcDQotICB9IHdoaWxlICgwKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IHRoZSBUSU0gSW5wdXQgQ2FwdHVyZSBwcmVzY2FsZXIgb24gcnVudGltZS4NCi0gKiBAcGFyYW0gIF9fSEFORExFX18gVElNIGhhbmRsZS4NCi0gKiBAcGFyYW0gIF9fQ0hBTk5FTF9fIFRJTSBDaGFubmVscyB0byBiZSBjb25maWd1cmVkLg0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IGdldCBpbnB1dCBjYXB0dXJlIDEgcHJlc2NhbGVyIHZhbHVlDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IGdldCBpbnB1dCBjYXB0dXJlIDIgcHJlc2NhbGVyIHZhbHVlDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IGdldCBpbnB1dCBjYXB0dXJlIDMgcHJlc2NhbGVyIHZhbHVlDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IGdldCBpbnB1dCBjYXB0dXJlIDQgcHJlc2NhbGVyIHZhbHVlDQotICogQHJldHZhbCBUaGUgaW5wdXQgY2FwdHVyZSBwcmVzY2FsZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0lDUFNDX0RJVjE6IG5vIHByZXNjYWxlcg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fSUNQU0NfRElWMjogY2FwdHVyZSBpcyBkb25lIG9uY2UgZXZlcnkgMiBldmVudHMNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0lDUFNDX0RJVjQ6IGNhcHR1cmUgaXMgZG9uZSBvbmNlIGV2ZXJ5IDQgZXZlbnRzDQotICogICAgICAgICAgICBAYXJnIFRJTV9JQ1BTQ19ESVY4OiBjYXB0dXJlIGlzIGRvbmUgb25jZSBldmVyeSA4IGV2ZW50cw0KLSAqLw0KLSNkZWZpbmUgX19IQUxfVElNX0dFVF9JQ1BSRVNDQUxFUihfX0hBTkRMRV9fLCBfX0NIQU5ORUxfXykgICAgICAgICAgXA0KLSAgKCgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMSAmIFRJTV9DQ01SMV9JQzFQU0MpICAgICAgICAgXA0KLSAgIDogKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICA/ICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjEgJiBUSU1fQ0NNUjFfSUMyUFNDKSA+PiA4VSkgXA0KLSAgIDogKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMiAmIFRJTV9DQ01SMl9JQzNQU0MpICAgICAgICAgXA0KLSAgICAgICA6ICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjIgJiBUSU1fQ0NNUjJfSUM0UFNDKSkgPj4gOFUpDQotDQotLyoqDQotICogQGJyaWVmICBTZXQgdGhlIFRJTSBDYXB0dXJlIENvbXBhcmUgUmVnaXN0ZXIgdmFsdWUgb24gcnVudGltZSB3aXRob3V0IGNhbGxpbmcNCi0gKiBhbm90aGVyIHRpbWUgQ29uZmlnQ2hhbm5lbCBmdW5jdGlvbi4NCi0gKiBAcGFyYW0gIF9fSEFORExFX18gVElNIGhhbmRsZS4NCi0gKiBAcGFyYW0gIF9fQ0hBTk5FTF9fIFRJTSBDaGFubmVscyB0byBiZSBjb25maWd1cmVkLg0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNTogVElNIENoYW5uZWwgNSBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF82OiBUSU0gQ2hhbm5lbCA2IHNlbGVjdGVkDQotICogQHBhcmFtICBfX0NPTVBBUkVfXyBzcGVjaWZpZXMgdGhlIENhcHR1cmUgQ29tcGFyZSByZWdpc3RlciBuZXcgdmFsdWUuDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9USU1fU0VUX0NPTVBBUkUoX19IQU5ETEVfXywgX19DSEFOTkVMX18sIF9fQ09NUEFSRV9fKSBcDQotICAoKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDUjEgPSAoX19DT01QQVJFX18pKSAgICAgICAgICAgICBcDQotICAgOiAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDUjIgPSAoX19DT01QQVJFX18pKSAgICAgICAgICAgICBcDQotICAgOiAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDUjMgPSAoX19DT01QQVJFX18pKSAgICAgICAgICAgICBcDQotICAgOiAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF80KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDUjQgPSAoX19DT01QQVJFX18pKSAgICAgICAgICAgICBcDQotICAgOiAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF81KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDUjUgPSAoX19DT01QQVJFX18pKSAgICAgICAgICAgICBcDQotICAgICAgIDogKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDUjYgPSAoX19DT01QQVJFX18pKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCB0aGUgVElNIENhcHR1cmUgQ29tcGFyZSBSZWdpc3RlciB2YWx1ZSBvbiBydW50aW1lLg0KLSAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlLg0KLSAqIEBwYXJhbSAgX19DSEFOTkVMX18gVElNIENoYW5uZWwgYXNzb2NpYXRlZCB3aXRoIHRoZSBjYXB0dXJlIGNvbXBhcmUgcmVnaXN0ZXINCi0gKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBnZXQgY2FwdHVyZS9jb21wYXJlIDEgcmVnaXN0ZXIgdmFsdWUNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogZ2V0IGNhcHR1cmUvY29tcGFyZSAyIHJlZ2lzdGVyIHZhbHVlDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IGdldCBjYXB0dXJlL2NvbXBhcmUgMyByZWdpc3RlciB2YWx1ZQ0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBnZXQgY2FwdHVyZS9jb21wYXJlIDQgcmVnaXN0ZXIgdmFsdWUNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNTogZ2V0IGNhcHR1cmUvY29tcGFyZSA1IHJlZ2lzdGVyIHZhbHVlDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzY6IGdldCBjYXB0dXJlL2NvbXBhcmUgNiByZWdpc3RlciB2YWx1ZQ0KLSAqIEByZXR2YWwgMTYtYml0IG9yIDMyLWJpdCB2YWx1ZSBvZiB0aGUgY2FwdHVyZS9jb21wYXJlIHJlZ2lzdGVyIChUSU14X0NDUnkpDQotICovDQotI2RlZmluZSBfX0hBTF9USU1fR0VUX0NPTVBBUkUoX19IQU5ETEVfXywgX19DSEFOTkVMX18pICAgICAgICAgICAgICAgICBcDQotICAoKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMSkgICA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ1IxKSBcDQotICAgOiAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8yKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ1IyKSBcDQotICAgOiAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8zKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ1IzKSBcDQotICAgOiAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF80KSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ1I0KSBcDQotICAgOiAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF81KSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ1I1KSBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ1I2KSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCB0aGUgVElNIE91dHB1dCBjb21wYXJlIHByZWxvYWQuDQotICogQHBhcmFtICBfX0hBTkRMRV9fIFRJTSBoYW5kbGUuDQotICogQHBhcmFtICBfX0NIQU5ORUxfXyBUSU0gQ2hhbm5lbHMgdG8gYmUgY29uZmlndXJlZC4NCi0gKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzU6IFRJTSBDaGFubmVsIDUgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNjogVElNIENoYW5uZWwgNiBzZWxlY3RlZA0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfVElNX0VOQUJMRV9PQ3hQUkVMT0FEKF9fSEFORExFX18sIF9fQ0hBTk5FTF9fKSBcDQotICAoKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMSkgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjEgfD0gVElNX0NDTVIxX09DMVBFKSAgXA0KLSAgIDogKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMikgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIxIHw9IFRJTV9DQ01SMV9PQzJQRSkgIFwNCi0gICA6ICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzMpICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMiB8PSBUSU1fQ0NNUjJfT0MzUEUpICBcDQotICAgOiAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF80KSAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjIgfD0gVElNX0NDTVIyX09DNFBFKSAgXA0KLSAgIDogKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfNSkgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIzIHw9IFRJTV9DQ01SM19PQzVQRSkgIFwNCi0gICAgICAgOiAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjMgfD0gVElNX0NDTVIzX09DNlBFKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJlc2V0IHRoZSBUSU0gT3V0cHV0IGNvbXBhcmUgcHJlbG9hZC4NCi0gKiBAcGFyYW0gIF9fSEFORExFX18gVElNIGhhbmRsZS4NCi0gKiBAcGFyYW0gIF9fQ0hBTk5FTF9fIFRJTSBDaGFubmVscyB0byBiZSBjb25maWd1cmVkLg0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNTogVElNIENoYW5uZWwgNSBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF82OiBUSU0gQ2hhbm5lbCA2IHNlbGVjdGVkDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9USU1fRElTQUJMRV9PQ3hQUkVMT0FEKF9fSEFORExFX18sIF9fQ0hBTk5FTF9fKSBcDQotICAoKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIxICY9IH5USU1fQ0NNUjFfT0MxUEUpICBcDQotICAgOiAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8yKSAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIxICY9IH5USU1fQ0NNUjFfT0MyUEUpICBcDQotICAgOiAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8zKSAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIyICY9IH5USU1fQ0NNUjJfT0MzUEUpICBcDQotICAgOiAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF80KSAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIyICY9IH5USU1fQ0NNUjJfT0M0UEUpICBcDQotICAgOiAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF81KSAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIzICY9IH5USU1fQ0NNUjNfT0M1UEUpICBcDQotICAgICAgIDogKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIzICY9IH5USU1fQ0NNUjNfT0M2UEUpKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIGZhc3QgbW9kZSBmb3IgYSBnaXZlbiBjaGFubmVsLg0KLSAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlLg0KLSAqIEBwYXJhbSAgX19DSEFOTkVMX18gVElNIENoYW5uZWxzIHRvIGJlIGNvbmZpZ3VyZWQuDQotICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF81OiBUSU0gQ2hhbm5lbCA1IHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzY6IFRJTSBDaGFubmVsIDYgc2VsZWN0ZWQNCi0gKiBAbm90ZSAgV2hlbiBmYXN0IG1vZGUgaXMgZW5hYmxlZCBhbiBhY3RpdmUgZWRnZSBvbiB0aGUgdHJpZ2dlciBpbnB1dCBhY3RzDQotICogICAgICAgIGxpa2UgYSBjb21wYXJlIG1hdGNoIG9uIENDeCBvdXRwdXQuIERlbGF5IHRvIHNhbXBsZSB0aGUgdHJpZ2dlcg0KLSAqICAgICAgICBpbnB1dCBhbmQgdG8gYWN0aXZhdGUgQ0N4IG91dHB1dCBpcyByZWR1Y2VkIHRvIDMgY2xvY2sgY3ljbGVzLg0KLSAqIEBub3RlICBGYXN0IG1vZGUgYWN0cyBvbmx5IGlmIHRoZSBjaGFubmVsIGlzIGNvbmZpZ3VyZWQgaW4gUFdNMSBvciBQV00yIG1vZGUuDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9USU1fRU5BQkxFX09DeEZBU1QoX19IQU5ETEVfXywgX19DSEFOTkVMX18pICAgXA0KLSAgKCgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzEpICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjEgfD0gVElNX0NDTVIxX09DMUZFKSBcDQotICAgOiAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8yKSAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMSB8PSBUSU1fQ0NNUjFfT0MyRkUpIFwNCi0gICA6ICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzMpICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIyIHw9IFRJTV9DQ01SMl9PQzNGRSkgXA0KLSAgIDogKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfNCkgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjIgfD0gVElNX0NDTVIyX09DNEZFKSBcDQotICAgOiAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF81KSAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMyB8PSBUSU1fQ0NNUjNfT0M1RkUpIFwNCi0gICAgICAgOiAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjMgfD0gVElNX0NDTVIzX09DNkZFKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgZmFzdCBtb2RlIGZvciBhIGdpdmVuIGNoYW5uZWwuDQotICogQHBhcmFtICBfX0hBTkRMRV9fIFRJTSBoYW5kbGUuDQotICogQHBhcmFtICBfX0NIQU5ORUxfXyBUSU0gQ2hhbm5lbHMgdG8gYmUgY29uZmlndXJlZC4NCi0gKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzU6IFRJTSBDaGFubmVsIDUgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNjogVElNIENoYW5uZWwgNiBzZWxlY3RlZA0KLSAqIEBub3RlICBXaGVuIGZhc3QgbW9kZSBpcyBkaXNhYmxlZCBDQ3ggb3V0cHV0IGJlaGF2ZXMgbm9ybWFsbHkgZGVwZW5kaW5nDQotICogICAgICAgIG9uIGNvdW50ZXIgYW5kIENDUnggdmFsdWVzIGV2ZW4gd2hlbiB0aGUgdHJpZ2dlciBpcyBPTi4gVGhlIG1pbmltdW0NCi0gKiAgICAgICAgZGVsYXkgdG8gYWN0aXZhdGUgQ0N4IG91dHB1dCB3aGVuIGFuIGFjdGl2ZSBlZGdlIG9jY3VycyBvbiB0aGUNCi0gKiAgICAgICAgdHJpZ2dlciBpbnB1dCBpcyA1IGNsb2NrIGN5Y2xlcy4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1RJTV9ESVNBQkxFX09DeEZBU1QoX19IQU5ETEVfXywgX19DSEFOTkVMX18pICAgXA0KLSAgKCgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzEpICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIxICY9IH5USU1fQ0NNUjFfT0MxRkUpIFwNCi0gICA6ICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzIpICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMSAmPSB+VElNX0NDTVIxX09DMkZFKSBcDQotICAgOiAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8zKSAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjIgJj0gflRJTV9DQ01SMl9PQzNGRSkgXA0KLSAgIDogKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfNCkgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIyICY9IH5USU1fQ0NNUjJfT0M0RkUpIFwNCi0gICA6ICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzUpICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMyAmPSB+VElNX0NDTVIzX09DNUZFKSBcDQotICAgICAgIDogKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIzICY9IH5USU1fQ0NNUjNfT0M2RkUpKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IHRoZSBVcGRhdGUgUmVxdWVzdCBTb3VyY2UgKFVSUykgYml0IG9mIHRoZSBUSU14X0NSMSByZWdpc3Rlci4NCi0gKiBAcGFyYW0gIF9fSEFORExFX18gVElNIGhhbmRsZS4NCi0gKiBAbm90ZSAgV2hlbiB0aGUgVVJTIGJpdCBvZiB0aGUgVElNeF9DUjEgcmVnaXN0ZXIgaXMgc2V0LCBvbmx5IGNvdW50ZXINCi0gKiAgICAgICAgb3ZlcmZsb3cvdW5kZXJmbG93IGdlbmVyYXRlcyBhbiB1cGRhdGUgaW50ZXJydXB0IG9yIERNQSByZXF1ZXN0IChpZg0KLSAqICAgICAgICBlbmFibGVkKQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfVElNX1VSU19FTkFCTEUoX19IQU5ETEVfXykgXA0KLSAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSB8PSBUSU1fQ1IxX1VSUykNCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJlc2V0IHRoZSBVcGRhdGUgUmVxdWVzdCBTb3VyY2UgKFVSUykgYml0IG9mIHRoZSBUSU14X0NSMSByZWdpc3Rlci4NCi0gKiBAcGFyYW0gIF9fSEFORExFX18gVElNIGhhbmRsZS4NCi0gKiBAbm90ZSAgV2hlbiB0aGUgVVJTIGJpdCBvZiB0aGUgVElNeF9DUjEgcmVnaXN0ZXIgaXMgcmVzZXQsIGFueSBvZiB0aGUNCi0gKiAgICAgICAgZm9sbG93aW5nIGV2ZW50cyBnZW5lcmF0ZSBhbiB1cGRhdGUgaW50ZXJydXB0IG9yIERNQSByZXF1ZXN0IChpZg0KLSAqICAgICAgICBlbmFibGVkKToNCi0gKiAgICAgICAgICAgXyBDb3VudGVyIG92ZXJmbG93IHVuZGVyZmxvdw0KLSAqICAgICAgICAgICBfIFNldHRpbmcgdGhlIFVHIGJpdA0KLSAqICAgICAgICAgICBfIFVwZGF0ZSBnZW5lcmF0aW9uIHRocm91Z2ggdGhlIHNsYXZlIG1vZGUgY29udHJvbGxlcg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfVElNX1VSU19ESVNBQkxFKF9fSEFORExFX18pIFwNCi0gICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgJj0gflRJTV9DUjFfVVJTKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IHRoZSBUSU0gQ2FwdHVyZSB4IGlucHV0IHBvbGFyaXR5IG9uIHJ1bnRpbWUuDQotICogQHBhcmFtICBfX0hBTkRMRV9fIFRJTSBoYW5kbGUuDQotICogQHBhcmFtICBfX0NIQU5ORUxfXyBUSU0gQ2hhbm5lbHMgdG8gYmUgY29uZmlndXJlZC4NCi0gKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkDQotICogQHBhcmFtICBfX1BPTEFSSVRZX18gUG9sYXJpdHkgZm9yIFRJeCBzb3VyY2UNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0lOUFVUQ0hBTk5FTFBPTEFSSVRZX1JJU0lORzogUmlzaW5nIEVkZ2UNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0lOUFVUQ0hBTk5FTFBPTEFSSVRZX0ZBTExJTkc6IEZhbGxpbmcgRWRnZQ0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fSU5QVVRDSEFOTkVMUE9MQVJJVFlfQk9USEVER0U6IFJpc2luZyBhbmQgRmFsbGluZyBFZGdlDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9USU1fU0VUX0NBUFRVUkVQT0xBUklUWShfX0hBTkRMRV9fLCBfX0NIQU5ORUxfXywgX19QT0xBUklUWV9fKSBcDQotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIFRJTV9SRVNFVF9DQVBUVVJFUE9MQVJJVFkoKF9fSEFORExFX18pLCAoX19DSEFOTkVMX18pKTsgICAgICAgICAgICAgICAgICBcDQotICAgIFRJTV9TRVRfQ0FQVFVSRVBPTEFSSVRZKChfX0hBTkRMRV9fKSwgKF9fQ0hBTk5FTF9fKSwgKF9fUE9MQVJJVFlfXykpOyAgICBcDQotICB9IHdoaWxlICgwKQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotLyogRW5kIG9mIGV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0NCi0vKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgVElNX1ByaXZhdGVfQ29uc3RhbnRzIFRJTSBQcml2YXRlIENvbnN0YW50cw0KLSAqIEB7DQotICovDQotLyogVGhlIGNvdW50ZXIgb2YgYSB0aW1lciBpbnN0YW5jZSBpcyBkaXNhYmxlZCBvbmx5IGlmIGFsbCB0aGUgQ0N4IGFuZCBDQ3hODQotICAgY2hhbm5lbHMgaGF2ZSBiZWVuIGRpc2FibGVkICovDQotI2RlZmluZSBUSU1fQ0NFUl9DQ3hFX01BU0sgXA0KLSAgKCh1aW50MzJfdCkoVElNX0NDRVJfQ0MxRSB8IFRJTV9DQ0VSX0NDMkUgfCBUSU1fQ0NFUl9DQzNFIHwgVElNX0NDRVJfQ0M0RSkpDQotI2RlZmluZSBUSU1fQ0NFUl9DQ3hORV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKHVpbnQzMl90KShUSU1fQ0NFUl9DQzFORSB8IFRJTV9DQ0VSX0NDMk5FIHwgVElNX0NDRVJfQ0MzTkUgfCBcDQotICAgICAgICAgICAgICBUSU1fQ0NFUl9DQzRORSkpDQotLyoqDQotICogQH0NCi0gKi8NCi0vKiBFbmQgb2YgcHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLQ0KLS8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBkZWZncm91cCBUSU1fUHJpdmF0ZV9NYWNyb3MgVElNIFByaXZhdGUgTWFjcm9zDQotICogQHsNCi0gKi8NCi0jaWYgZGVmaW5lZChDT01QNSkgJiYgZGVmaW5lZChDT01QNikgJiYgZGVmaW5lZChDT01QNykNCi0jZGVmaW5lIElTX1RJTV9DTEVBUklOUFVUX1NPVVJDRShfX01PREVfXykgICAgICAgXA0KLSAgKCgoX19NT0RFX18pID09IFRJTV9DTEVBUklOUFVUU09VUkNFX0VUUikgfHwgICBcDQotICAgKChfX01PREVfXykgPT0gVElNX0NMRUFSSU5QVVRTT1VSQ0VfQ09NUDEpIHx8IFwNCi0gICAoKF9fTU9ERV9fKSA9PSBUSU1fQ0xFQVJJTlBVVFNPVVJDRV9DT01QMikgfHwgXA0KLSAgICgoX19NT0RFX18pID09IFRJTV9DTEVBUklOUFVUU09VUkNFX0NPTVAzKSB8fCBcDQotICAgKChfX01PREVfXykgPT0gVElNX0NMRUFSSU5QVVRTT1VSQ0VfQ09NUDQpIHx8IFwNCi0gICAoKF9fTU9ERV9fKSA9PSBUSU1fQ0xFQVJJTlBVVFNPVVJDRV9DT01QNSkgfHwgXA0KLSAgICgoX19NT0RFX18pID09IFRJTV9DTEVBUklOUFVUU09VUkNFX0NPTVA2KSB8fCBcDQotICAgKChfX01PREVfXykgPT0gVElNX0NMRUFSSU5QVVRTT1VSQ0VfQ09NUDcpIHx8IFwNCi0gICAoKF9fTU9ERV9fKSA9PSBUSU1fQ0xFQVJJTlBVVFNPVVJDRV9OT05FKSkNCi0jZWxzZSAvKiBDT01QNSAmJiBDT01QNiAmJiBDT01QNyAqLw0KLSNkZWZpbmUgSVNfVElNX0NMRUFSSU5QVVRfU09VUkNFKF9fTU9ERV9fKSAgICAgICBcDQotICAoKChfX01PREVfXykgPT0gVElNX0NMRUFSSU5QVVRTT1VSQ0VfRVRSKSB8fCAgIFwNCi0gICAoKF9fTU9ERV9fKSA9PSBUSU1fQ0xFQVJJTlBVVFNPVVJDRV9DT01QMSkgfHwgXA0KLSAgICgoX19NT0RFX18pID09IFRJTV9DTEVBUklOUFVUU09VUkNFX0NPTVAyKSB8fCBcDQotICAgKChfX01PREVfXykgPT0gVElNX0NMRUFSSU5QVVRTT1VSQ0VfQ09NUDMpIHx8IFwNCi0gICAoKF9fTU9ERV9fKSA9PSBUSU1fQ0xFQVJJTlBVVFNPVVJDRV9DT01QNCkgfHwgXA0KLSAgICgoX19NT0RFX18pID09IFRJTV9DTEVBUklOUFVUU09VUkNFX05PTkUpKQ0KLSNlbmRpZiAvKiBDT01QNSAmJiBDT01QNiAmJiBDT01QNyAqLw0KLQ0KLSNkZWZpbmUgSVNfVElNX0RNQV9CQVNFKF9fQkFTRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKCgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX0NSMSkgfHwgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQ1IyKSB8fCAgICAgXA0KLSAgICgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX1NNQ1IpIHx8ICgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX0RJRVIpIHx8ICAgXA0KLSAgICgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX1NSKSB8fCAoKF9fQkFTRV9fKSA9PSBUSU1fRE1BQkFTRV9FR1IpIHx8ICAgICAgXA0KLSAgICgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX0NDTVIxKSB8fCAoKF9fQkFTRV9fKSA9PSBUSU1fRE1BQkFTRV9DQ01SMikgfHwgXA0KLSAgICgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX0NDRVIpIHx8ICgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX0NOVCkgfHwgICAgXA0KLSAgICgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX1BTQykgfHwgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQVJSKSB8fCAgICAgXA0KLSAgICgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX1JDUikgfHwgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQ0NSMSkgfHwgICAgXA0KLSAgICgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX0NDUjIpIHx8ICgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX0NDUjMpIHx8ICAgXA0KLSAgICgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX0NDUjQpIHx8ICgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX0JEVFIpIHx8ICAgXA0KLSAgICgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX0NDTVIzKSB8fCAoKF9fQkFTRV9fKSA9PSBUSU1fRE1BQkFTRV9DQ1I1KSB8fCAgXA0KLSAgICgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX0NDUjYpIHx8ICgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX0FGMSkgfHwgICAgXA0KLSAgICgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX0FGMikgfHwgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfVElTRUwpIHx8ICAgXA0KLSAgICgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX0RUUjIpIHx8ICgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX0VDUikgfHwgICAgXA0KLSAgICgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX09SKSkNCi0NCi0jZGVmaW5lIElTX1RJTV9FVkVOVF9TT1VSQ0UoX19TT1VSQ0VfXykgICAgICAgICAgICAgXA0KLSAgKCgoKF9fU09VUkNFX18pICYgMHhGRkZGRkUwMFUpID09IDB4MDAwMDAwMDBVKSAmJiBcDQotICAgKChfX1NPVVJDRV9fKSAhPSAweDAwMDAwMDAwVSkpDQotDQotI2RlZmluZSBJU19USU1fQ09VTlRFUl9NT0RFKF9fTU9ERV9fKSAgICAgICAgICAgICAgICBcDQotICAoKChfX01PREVfXykgPT0gVElNX0NPVU5URVJNT0RFX1VQKSB8fCAgICAgICAgICAgICBcDQotICAgKChfX01PREVfXykgPT0gVElNX0NPVU5URVJNT0RFX0RPV04pIHx8ICAgICAgICAgICBcDQotICAgKChfX01PREVfXykgPT0gVElNX0NPVU5URVJNT0RFX0NFTlRFUkFMSUdORUQxKSB8fCBcDQotICAgKChfX01PREVfXykgPT0gVElNX0NPVU5URVJNT0RFX0NFTlRFUkFMSUdORUQyKSB8fCBcDQotICAgKChfX01PREVfXykgPT0gVElNX0NPVU5URVJNT0RFX0NFTlRFUkFMSUdORUQzKSkNCi0NCi0jZGVmaW5lIElTX1RJTV9VSUZSRU1BUF9NT0RFKF9fTU9ERV9fKSBcDQotICAoKChfX01PREVfXykgPT0gVElNX1VJRlJFTUFQX0RJU0FCTEUpIHx8ICgoX19NT0RFX18pID09IFRJTV9VSUZSRU1BUF9FTkFMRSkpDQotDQotI2RlZmluZSBJU19USU1fQ0xPQ0tESVZJU0lPTl9ESVYoX19ESVZfXykgICBcDQotICAoKChfX0RJVl9fKSA9PSBUSU1fQ0xPQ0tESVZJU0lPTl9ESVYxKSB8fCBcDQotICAgKChfX0RJVl9fKSA9PSBUSU1fQ0xPQ0tESVZJU0lPTl9ESVYyKSB8fCBcDQotICAgKChfX0RJVl9fKSA9PSBUSU1fQ0xPQ0tESVZJU0lPTl9ESVY0KSkNCi0NCi0jZGVmaW5lIElTX1RJTV9BVVRPUkVMT0FEX1BSRUxPQUQoUFJFTE9BRCkgICAgICAgICAgXA0KLSAgKCgoUFJFTE9BRCkgPT0gVElNX0FVVE9SRUxPQURfUFJFTE9BRF9ESVNBQkxFKSB8fCBcDQotICAgKChQUkVMT0FEKSA9PSBUSU1fQVVUT1JFTE9BRF9QUkVMT0FEX0VOQUJMRSkpDQotDQotI2RlZmluZSBJU19USU1fRkFTVF9TVEFURShfX1NUQVRFX18pIFwNCi0gICgoKF9fU1RBVEVfXykgPT0gVElNX09DRkFTVF9ESVNBQkxFKSB8fCAoKF9fU1RBVEVfXykgPT0gVElNX09DRkFTVF9FTkFCTEUpKQ0KLQ0KLSNkZWZpbmUgSVNfVElNX09DX1BPTEFSSVRZKF9fUE9MQVJJVFlfXykgICAgICBcDQotICAoKChfX1BPTEFSSVRZX18pID09IFRJTV9PQ1BPTEFSSVRZX0hJR0gpIHx8IFwNCi0gICAoKF9fUE9MQVJJVFlfXykgPT0gVElNX09DUE9MQVJJVFlfTE9XKSkNCi0NCi0jZGVmaW5lIElTX1RJTV9PQ05fUE9MQVJJVFkoX19QT0xBUklUWV9fKSAgICAgIFwNCi0gICgoKF9fUE9MQVJJVFlfXykgPT0gVElNX09DTlBPTEFSSVRZX0hJR0gpIHx8IFwNCi0gICAoKF9fUE9MQVJJVFlfXykgPT0gVElNX09DTlBPTEFSSVRZX0xPVykpDQotDQotI2RlZmluZSBJU19USU1fT0NJRExFX1NUQVRFKF9fU1RBVEVfXykgICAgIFwNCi0gICgoKF9fU1RBVEVfXykgPT0gVElNX09DSURMRVNUQVRFX1NFVCkgfHwgXA0KLSAgICgoX19TVEFURV9fKSA9PSBUSU1fT0NJRExFU1RBVEVfUkVTRVQpKQ0KLQ0KLSNkZWZpbmUgSVNfVElNX09DTklETEVfU1RBVEUoX19TVEFURV9fKSAgICAgXA0KLSAgKCgoX19TVEFURV9fKSA9PSBUSU1fT0NOSURMRVNUQVRFX1NFVCkgfHwgXA0KLSAgICgoX19TVEFURV9fKSA9PSBUSU1fT0NOSURMRVNUQVRFX1JFU0VUKSkNCi0NCi0jZGVmaW5lIElTX1RJTV9FTkNPREVSSU5QVVRfUE9MQVJJVFkoX19QT0xBUklUWV9fKSAgICAgICAgXA0KLSAgKCgoX19QT0xBUklUWV9fKSA9PSBUSU1fRU5DT0RFUklOUFVUUE9MQVJJVFlfUklTSU5HKSB8fCBcDQotICAgKChfX1BPTEFSSVRZX18pID09IFRJTV9FTkNPREVSSU5QVVRQT0xBUklUWV9GQUxMSU5HKSkNCi0NCi0jZGVmaW5lIElTX1RJTV9JQ19QT0xBUklUWShfX1BPTEFSSVRZX18pICAgICAgICAgXA0KLSAgKCgoX19QT0xBUklUWV9fKSA9PSBUSU1fSUNQT0xBUklUWV9SSVNJTkcpIHx8ICBcDQotICAgKChfX1BPTEFSSVRZX18pID09IFRJTV9JQ1BPTEFSSVRZX0ZBTExJTkcpIHx8IFwNCi0gICAoKF9fUE9MQVJJVFlfXykgPT0gVElNX0lDUE9MQVJJVFlfQk9USEVER0UpKQ0KLQ0KLSNkZWZpbmUgSVNfVElNX0lDX1NFTEVDVElPTihfX1NFTEVDVElPTl9fKSAgICAgICAgICAgIFwNCi0gICgoKF9fU0VMRUNUSU9OX18pID09IFRJTV9JQ1NFTEVDVElPTl9ESVJFQ1RUSSkgfHwgICBcDQotICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fSUNTRUxFQ1RJT05fSU5ESVJFQ1RUSSkgfHwgXA0KLSAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX0lDU0VMRUNUSU9OX1RSQykpDQotDQotI2RlZmluZSBJU19USU1fSUNfUFJFU0NBTEVSKF9fUFJFU0NBTEVSX18pIFwNCi0gICgoKF9fUFJFU0NBTEVSX18pID09IFRJTV9JQ1BTQ19ESVYxKSB8fCAgXA0KLSAgICgoX19QUkVTQ0FMRVJfXykgPT0gVElNX0lDUFNDX0RJVjIpIHx8ICBcDQotICAgKChfX1BSRVNDQUxFUl9fKSA9PSBUSU1fSUNQU0NfRElWNCkgfHwgKChfX1BSRVNDQUxFUl9fKSA9PSBUSU1fSUNQU0NfRElWOCkpDQotDQotI2RlZmluZSBJU19USU1fT1BNX01PREUoX19NT0RFX18pIFwNCi0gICgoKF9fTU9ERV9fKSA9PSBUSU1fT1BNT0RFX1NJTkdMRSkgfHwgKChfX01PREVfXykgPT0gVElNX09QTU9ERV9SRVBFVElUSVZFKSkNCi0NCi0jZGVmaW5lIElTX1RJTV9FTkNPREVSX01PREUoX19NT0RFX18pICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKChfX01PREVfXykgPT0gVElNX0VOQ09ERVJNT0RFX1RJMSkgfHwgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoX19NT0RFX18pID09IFRJTV9FTkNPREVSTU9ERV9USTIpIHx8ICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fTU9ERV9fKSA9PSBUSU1fRU5DT0RFUk1PREVfVEkxMikgfHwgICAgICAgICAgICAgICAgICAgICBcDQotICAgKChfX01PREVfXykgPT0gVElNX0VOQ09ERVJNT0RFX0NMT0NLUExVU0RJUkVDVElPTl9YMikgfHwgICAgXA0KLSAgICgoX19NT0RFX18pID09IFRJTV9FTkNPREVSTU9ERV9DTE9DS1BMVVNESVJFQ1RJT05fWDEpIHx8ICAgIFwNCi0gICAoKF9fTU9ERV9fKSA9PSBUSU1fRU5DT0RFUk1PREVfRElSRUNUSU9OQUxDTE9DS19YMikgfHwgICAgICBcDQotICAgKChfX01PREVfXykgPT0gVElNX0VOQ09ERVJNT0RFX0RJUkVDVElPTkFMQ0xPQ0tfWDFfVEkxMikgfHwgXA0KLSAgICgoX19NT0RFX18pID09IFRJTV9FTkNPREVSTU9ERV9YMV9USTEpIHx8ICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fTU9ERV9fKSA9PSBUSU1fRU5DT0RFUk1PREVfWDFfVEkyKSkNCi0NCi0jZGVmaW5lIElTX1RJTV9ETUFfU09VUkNFKF9fU09VUkNFX18pICAgICAgICAgICAgICAgXA0KLSAgKCgoKF9fU09VUkNFX18pICYgMHhGRkZGODBGRlUpID09IDB4MDAwMDAwMDBVKSAmJiBcDQotICAgKChfX1NPVVJDRV9fKSAhPSAweDAwMDAwMDAwVSkpDQotDQotI2RlZmluZSBJU19USU1fQ0hBTk5FTFMoX19DSEFOTkVMX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKCgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzEpIHx8ICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzIpIHx8IFwNCi0gICAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8zKSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF80KSB8fCBcDQotICAgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfNSkgfHwgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfNikgfHwgXA0KLSAgICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMX0FMTCkpDQotDQotI2RlZmluZSBJU19USU1fT1BNX0NIQU5ORUxTKF9fQ0hBTk5FTF9fKSBcDQotICAoKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMSkgfHwgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMikpDQotDQotI2RlZmluZSBJU19USU1fQ09NUExFTUVOVEFSWV9DSEFOTkVMUyhfX0NIQU5ORUxfXykgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKCgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzEpIHx8ICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzIpIHx8IFwNCi0gICAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8zKSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF80KSkNCi0NCi0jaWYgZGVmaW5lZChUSU01KSAmJiBkZWZpbmVkKFRJTTIwKQ0KLSNkZWZpbmUgSVNfVElNX0NMT0NLU09VUkNFKF9fQ0xPQ0tfXykgICAgICAgICAgIFwNCi0gICgoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lOVEVSTkFMKSB8fCBcDQotICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMikgfHwgXA0KLSAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMCkgfHwgICAgIFwNCi0gICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjEpIHx8ICAgICBcDQotICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIyKSB8fCAgICAgXA0KLSAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMykgfHwgICAgIFwNCi0gICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMUVEKSB8fCAgICBcDQotICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTEpIHx8ICAgICAgXA0KLSAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkyKSB8fCAgICAgIFwNCi0gICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0VUUk1PREUxKSB8fCBcDQotICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI0KSB8fCAgICAgXA0KLSAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNSkgfHwgICAgIFwNCi0gICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjYpIHx8ICAgICBcDQotICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI3KSB8fCAgICAgXA0KLSAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSOCkgfHwgICAgIFwNCi0gICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjkpIHx8ICAgICBcDQotICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIxMCkgfHwgICAgXA0KLSAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMTEpKQ0KLSNlbGlmIGRlZmluZWQoVElNNSkNCi0jZGVmaW5lIElTX1RJTV9DTE9DS1NPVVJDRShfX0NMT0NLX18pICAgICAgICAgICBcDQotICAoKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JTlRFUk5BTCkgfHwgXA0KLSAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTIpIHx8IFwNCi0gICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjApIHx8ICAgICBcDQotICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIxKSB8fCAgICAgXA0KLSAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMikgfHwgICAgIFwNCi0gICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjMpIHx8ICAgICBcDQotICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTFFRCkgfHwgICAgXA0KLSAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkxKSB8fCAgICAgIFwNCi0gICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMikgfHwgICAgICBcDQotICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMSkgfHwgXA0KLSAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNCkgfHwgICAgIFwNCi0gICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjUpIHx8ICAgICBcDQotICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI2KSB8fCAgICAgXA0KLSAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNykgfHwgICAgIFwNCi0gICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjgpIHx8ICAgICBcDQotICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIxMSkpDQotI2VsaWYgZGVmaW5lZChUSU0yMCkNCi0jZGVmaW5lIElTX1RJTV9DTE9DS1NPVVJDRShfX0NMT0NLX18pICAgICAgICAgICBcDQotICAoKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JTlRFUk5BTCkgfHwgXA0KLSAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTIpIHx8IFwNCi0gICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjApIHx8ICAgICBcDQotICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIxKSB8fCAgICAgXA0KLSAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMikgfHwgICAgIFwNCi0gICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjMpIHx8ICAgICBcDQotICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTFFRCkgfHwgICAgXA0KLSAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkxKSB8fCAgICAgIFwNCi0gICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMikgfHwgICAgICBcDQotICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMSkgfHwgXA0KLSAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNSkgfHwgICAgIFwNCi0gICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjYpIHx8ICAgICBcDQotICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI3KSB8fCAgICAgXA0KLSAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSOCkgfHwgICAgIFwNCi0gICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjkpIHx8ICAgICBcDQotICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIxMSkpDQotI2Vsc2UNCi0jZGVmaW5lIElTX1RJTV9DTE9DS1NPVVJDRShfX0NMT0NLX18pICAgICAgICAgICBcDQotICAoKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JTlRFUk5BTCkgfHwgXA0KLSAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTIpIHx8IFwNCi0gICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjApIHx8ICAgICBcDQotICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIxKSB8fCAgICAgXA0KLSAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMikgfHwgICAgIFwNCi0gICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjMpIHx8ICAgICBcDQotICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTFFRCkgfHwgICAgXA0KLSAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkxKSB8fCAgICAgIFwNCi0gICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMikgfHwgICAgICBcDQotICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMSkgfHwgXA0KLSAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNSkgfHwgICAgIFwNCi0gICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjYpIHx8ICAgICBcDQotICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI3KSB8fCAgICAgXA0KLSAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSOCkgfHwgICAgIFwNCi0gICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjExKSkNCi0jZW5kaWYgLyogVElNNSAmJiBUSU0yMCAqLw0KLQ0KLSNkZWZpbmUgSVNfVElNX0NMT0NLUE9MQVJJVFkoX19QT0xBUklUWV9fKSAgICAgICAgICAgICAgXA0KLSAgKCgoX19QT0xBUklUWV9fKSA9PSBUSU1fQ0xPQ0tQT0xBUklUWV9JTlZFUlRFRCkgfHwgICAgXA0KLSAgICgoX19QT0xBUklUWV9fKSA9PSBUSU1fQ0xPQ0tQT0xBUklUWV9OT05JTlZFUlRFRCkgfHwgXA0KLSAgICgoX19QT0xBUklUWV9fKSA9PSBUSU1fQ0xPQ0tQT0xBUklUWV9SSVNJTkcpIHx8ICAgICAgXA0KLSAgICgoX19QT0xBUklUWV9fKSA9PSBUSU1fQ0xPQ0tQT0xBUklUWV9GQUxMSU5HKSB8fCAgICAgXA0KLSAgICgoX19QT0xBUklUWV9fKSA9PSBUSU1fQ0xPQ0tQT0xBUklUWV9CT1RIRURHRSkpDQotDQotI2RlZmluZSBJU19USU1fQ0xPQ0tQUkVTQ0FMRVIoX19QUkVTQ0FMRVJfXykgICAgICAgXA0KLSAgKCgoX19QUkVTQ0FMRVJfXykgPT0gVElNX0NMT0NLUFJFU0NBTEVSX0RJVjEpIHx8IFwNCi0gICAoKF9fUFJFU0NBTEVSX18pID09IFRJTV9DTE9DS1BSRVNDQUxFUl9ESVYyKSB8fCBcDQotICAgKChfX1BSRVNDQUxFUl9fKSA9PSBUSU1fQ0xPQ0tQUkVTQ0FMRVJfRElWNCkgfHwgXA0KLSAgICgoX19QUkVTQ0FMRVJfXykgPT0gVElNX0NMT0NLUFJFU0NBTEVSX0RJVjgpKQ0KLQ0KLSNkZWZpbmUgSVNfVElNX0NMT0NLRklMVEVSKF9fSUNGSUxURVJfXykgKChfX0lDRklMVEVSX18pIDw9IDB4RlUpDQotDQotI2RlZmluZSBJU19USU1fQ0xFQVJJTlBVVF9QT0xBUklUWShfX1BPTEFSSVRZX18pICAgICAgICAgIFwNCi0gICgoKF9fUE9MQVJJVFlfXykgPT0gVElNX0NMRUFSSU5QVVRQT0xBUklUWV9JTlZFUlRFRCkgfHwgXA0KLSAgICgoX19QT0xBUklUWV9fKSA9PSBUSU1fQ0xFQVJJTlBVVFBPTEFSSVRZX05PTklOVkVSVEVEKSkNCi0NCi0jZGVmaW5lIElTX1RJTV9DTEVBUklOUFVUX1BSRVNDQUxFUihfX1BSRVNDQUxFUl9fKSAgICAgIFwNCi0gICgoKF9fUFJFU0NBTEVSX18pID09IFRJTV9DTEVBUklOUFVUUFJFU0NBTEVSX0RJVjEpIHx8IFwNCi0gICAoKF9fUFJFU0NBTEVSX18pID09IFRJTV9DTEVBUklOUFVUUFJFU0NBTEVSX0RJVjIpIHx8IFwNCi0gICAoKF9fUFJFU0NBTEVSX18pID09IFRJTV9DTEVBUklOUFVUUFJFU0NBTEVSX0RJVjQpIHx8IFwNCi0gICAoKF9fUFJFU0NBTEVSX18pID09IFRJTV9DTEVBUklOUFVUUFJFU0NBTEVSX0RJVjgpKQ0KLQ0KLSNkZWZpbmUgSVNfVElNX0NMRUFSSU5QVVRfRklMVEVSKF9fSUNGSUxURVJfXykgKChfX0lDRklMVEVSX18pIDw9IDB4RlUpDQotDQotI2RlZmluZSBJU19USU1fT1NTUl9TVEFURShfX1NUQVRFX18pIFwNCi0gICgoKF9fU1RBVEVfXykgPT0gVElNX09TU1JfRU5BQkxFKSB8fCAoKF9fU1RBVEVfXykgPT0gVElNX09TU1JfRElTQUJMRSkpDQotDQotI2RlZmluZSBJU19USU1fT1NTSV9TVEFURShfX1NUQVRFX18pIFwNCi0gICgoKF9fU1RBVEVfXykgPT0gVElNX09TU0lfRU5BQkxFKSB8fCAoKF9fU1RBVEVfXykgPT0gVElNX09TU0lfRElTQUJMRSkpDQotDQotI2RlZmluZSBJU19USU1fTE9DS19MRVZFTChfX0xFVkVMX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKChfX0xFVkVMX18pID09IFRJTV9MT0NLTEVWRUxfT0ZGKSB8fCAoKF9fTEVWRUxfXykgPT0gVElNX0xPQ0tMRVZFTF8xKSB8fCBcDQotICAgKChfX0xFVkVMX18pID09IFRJTV9MT0NLTEVWRUxfMikgfHwgKChfX0xFVkVMX18pID09IFRJTV9MT0NLTEVWRUxfMykpDQotDQotI2RlZmluZSBJU19USU1fQlJFQUtfRklMVEVSKF9fQlJLRklMVEVSX18pICgoX19CUktGSUxURVJfXykgPD0gMHhGVUwpDQotDQotI2RlZmluZSBJU19USU1fQlJFQUtfU1RBVEUoX19TVEFURV9fKSBcDQotICAoKChfX1NUQVRFX18pID09IFRJTV9CUkVBS19FTkFCTEUpIHx8ICgoX19TVEFURV9fKSA9PSBUSU1fQlJFQUtfRElTQUJMRSkpDQotDQotI2RlZmluZSBJU19USU1fQlJFQUtfUE9MQVJJVFkoX19QT0xBUklUWV9fKSAgICAgXA0KLSAgKCgoX19QT0xBUklUWV9fKSA9PSBUSU1fQlJFQUtQT0xBUklUWV9MT1cpIHx8IFwNCi0gICAoKF9fUE9MQVJJVFlfXykgPT0gVElNX0JSRUFLUE9MQVJJVFlfSElHSCkpDQotDQotI2RlZmluZSBJU19USU1fQlJFQUtfQUZNT0RFKF9fQUZNT0RFX18pICAgICAgICBcDQotICAoKChfX0FGTU9ERV9fKSA9PSBUSU1fQlJFQUtfQUZNT0RFX0lOUFVUKSB8fCBcDQotICAgKChfX0FGTU9ERV9fKSA9PSBUSU1fQlJFQUtfQUZNT0RFX0JJRElSRUNUSU9OQUwpKQ0KLQ0KLSNkZWZpbmUgSVNfVElNX0JSRUFLMl9TVEFURShfX1NUQVRFX18pIFwNCi0gICgoKF9fU1RBVEVfXykgPT0gVElNX0JSRUFLMl9FTkFCTEUpIHx8ICgoX19TVEFURV9fKSA9PSBUSU1fQlJFQUsyX0RJU0FCTEUpKQ0KLQ0KLSNkZWZpbmUgSVNfVElNX0JSRUFLMl9QT0xBUklUWShfX1BPTEFSSVRZX18pICAgICBcDQotICAoKChfX1BPTEFSSVRZX18pID09IFRJTV9CUkVBSzJQT0xBUklUWV9MT1cpIHx8IFwNCi0gICAoKF9fUE9MQVJJVFlfXykgPT0gVElNX0JSRUFLMlBPTEFSSVRZX0hJR0gpKQ0KLQ0KLSNkZWZpbmUgSVNfVElNX0JSRUFLMl9BRk1PREUoX19BRk1PREVfXykgICAgICAgIFwNCi0gICgoKF9fQUZNT0RFX18pID09IFRJTV9CUkVBSzJfQUZNT0RFX0lOUFVUKSB8fCBcDQotICAgKChfX0FGTU9ERV9fKSA9PSBUSU1fQlJFQUsyX0FGTU9ERV9CSURJUkVDVElPTkFMKSkNCi0NCi0jZGVmaW5lIElTX1RJTV9BVVRPTUFUSUNfT1VUUFVUX1NUQVRFKF9fU1RBVEVfXykgIFwNCi0gICgoKF9fU1RBVEVfXykgPT0gVElNX0FVVE9NQVRJQ09VVFBVVF9FTkFCTEUpIHx8IFwNCi0gICAoKF9fU1RBVEVfXykgPT0gVElNX0FVVE9NQVRJQ09VVFBVVF9ESVNBQkxFKSkNCi0NCi0jZGVmaW5lIElTX1RJTV9HUk9VUENINShfX09DUkVGX18pIFwNCi0gICgoKChfX09DUkVGX18pICYgMHgxRkZGRkZGRlUpID09IDB4MDAwMDAwMDBVKSkNCi0NCi0jZGVmaW5lIElTX1RJTV9UUkdPX1NPVVJDRShfX1NPVVJDRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoKF9fU09VUkNFX18pID09IFRJTV9UUkdPX1JFU0VUKSB8fCAoKF9fU09VUkNFX18pID09IFRJTV9UUkdPX0VOQUJMRSkgfHwgIFwNCi0gICAoKF9fU09VUkNFX18pID09IFRJTV9UUkdPX1VQREFURSkgfHwgKChfX1NPVVJDRV9fKSA9PSBUSU1fVFJHT19PQzEpIHx8ICAgIFwNCi0gICAoKF9fU09VUkNFX18pID09IFRJTV9UUkdPX09DMVJFRikgfHwgKChfX1NPVVJDRV9fKSA9PSBUSU1fVFJHT19PQzJSRUYpIHx8IFwNCi0gICAoKF9fU09VUkNFX18pID09IFRJTV9UUkdPX09DM1JFRikgfHwgKChfX1NPVVJDRV9fKSA9PSBUSU1fVFJHT19PQzRSRUYpIHx8IFwNCi0gICAoKF9fU09VUkNFX18pID09IFRJTV9UUkdPX0VOQ09ERVJfQ0xLKSkNCi0NCi0jZGVmaW5lIElTX1RJTV9UUkdPMl9TT1VSQ0UoX19TT1VSQ0VfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKCgoX19TT1VSQ0VfXykgPT0gVElNX1RSR08yX1JFU0VUKSB8fCAoKF9fU09VUkNFX18pID09IFRJTV9UUkdPMl9FTkFCTEUpIHx8ICBcDQotICAgKChfX1NPVVJDRV9fKSA9PSBUSU1fVFJHTzJfVVBEQVRFKSB8fCAoKF9fU09VUkNFX18pID09IFRJTV9UUkdPMl9PQzEpIHx8ICAgIFwNCi0gICAoKF9fU09VUkNFX18pID09IFRJTV9UUkdPMl9PQzFSRUYpIHx8ICgoX19TT1VSQ0VfXykgPT0gVElNX1RSR08yX09DMlJFRikgfHwgXA0KLSAgICgoX19TT1VSQ0VfXykgPT0gVElNX1RSR08yX09DM1JFRikgfHwgKChfX1NPVVJDRV9fKSA9PSBUSU1fVFJHTzJfT0MzUkVGKSB8fCBcDQotICAgKChfX1NPVVJDRV9fKSA9PSBUSU1fVFJHTzJfT0M0UkVGKSB8fCAoKF9fU09VUkNFX18pID09IFRJTV9UUkdPMl9PQzVSRUYpIHx8IFwNCi0gICAoKF9fU09VUkNFX18pID09IFRJTV9UUkdPMl9PQzZSRUYpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoX19TT1VSQ0VfXykgPT0gVElNX1RSR08yX09DNFJFRl9SSVNJTkdGQUxMSU5HKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKChfX1NPVVJDRV9fKSA9PSBUSU1fVFJHTzJfT0M2UkVGX1JJU0lOR0ZBTExJTkcpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fU09VUkNFX18pID09IFRJTV9UUkdPMl9PQzRSRUZfUklTSU5HX09DNlJFRl9SSVNJTkcpIHx8ICAgICAgICAgICAgICAgICAgXA0KLSAgICgoX19TT1VSQ0VfXykgPT0gVElNX1RSR08yX09DNFJFRl9SSVNJTkdfT0M2UkVGX0ZBTExJTkcpIHx8ICAgICAgICAgICAgICAgICBcDQotICAgKChfX1NPVVJDRV9fKSA9PSBUSU1fVFJHTzJfT0M1UkVGX1JJU0lOR19PQzZSRUZfUklTSU5HKSB8fCAgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fU09VUkNFX18pID09IFRJTV9UUkdPMl9PQzVSRUZfUklTSU5HX09DNlJFRl9GQUxMSU5HKSkNCi0NCi0jZGVmaW5lIElTX1RJTV9NU01fU1RBVEUoX19TVEFURV9fKSAgICAgICAgICAgICAgIFwNCi0gICgoKF9fU1RBVEVfXykgPT0gVElNX01BU1RFUlNMQVZFTU9ERV9FTkFCTEUpIHx8IFwNCi0gICAoKF9fU1RBVEVfXykgPT0gVElNX01BU1RFUlNMQVZFTU9ERV9ESVNBQkxFKSkNCi0NCi0jZGVmaW5lIElTX1RJTV9TTEFWRV9NT0RFKF9fTU9ERV9fKSAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKCgoX19NT0RFX18pID09IFRJTV9TTEFWRU1PREVfRElTQUJMRSkgfHwgICAgICAgICAgICAgICBcDQotICAgKChfX01PREVfXykgPT0gVElNX1NMQVZFTU9ERV9SRVNFVCkgfHwgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fTU9ERV9fKSA9PSBUSU1fU0xBVkVNT0RFX0dBVEVEKSB8fCAgICAgICAgICAgICAgICAgXA0KLSAgICgoX19NT0RFX18pID09IFRJTV9TTEFWRU1PREVfVFJJR0dFUikgfHwgICAgICAgICAgICAgICBcDQotICAgKChfX01PREVfXykgPT0gVElNX1NMQVZFTU9ERV9FWFRFUk5BTDEpIHx8ICAgICAgICAgICAgIFwNCi0gICAoKF9fTU9ERV9fKSA9PSBUSU1fU0xBVkVNT0RFX0NPTUJJTkVEX1JFU0VUVFJJR0dFUikgfHwgXA0KLSAgICgoX19NT0RFX18pID09IFRJTV9TTEFWRU1PREVfQ09NQklORURfR0FURURSRVNFVCkpDQotDQotI2RlZmluZSBJU19USU1fUFdNX01PREUoX19NT0RFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoKF9fTU9ERV9fKSA9PSBUSU1fT0NNT0RFX1BXTTEpIHx8ICgoX19NT0RFX18pID09IFRJTV9PQ01PREVfUFdNMikgfHwgXA0KLSAgICgoX19NT0RFX18pID09IFRJTV9PQ01PREVfQ09NQklORURfUFdNMSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKChfX01PREVfXykgPT0gVElNX09DTU9ERV9DT01CSU5FRF9QV00yKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fTU9ERV9fKSA9PSBUSU1fT0NNT0RFX0FTU1lNRVRSSUNfUFdNMSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoX19NT0RFX18pID09IFRJTV9PQ01PREVfQVNTWU1FVFJJQ19QV00yKSkNCi0NCi0jZGVmaW5lIElTX1RJTV9PQ19NT0RFKF9fTU9ERV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKCgoX19NT0RFX18pID09IFRJTV9PQ01PREVfVElNSU5HKSB8fCAoKF9fTU9ERV9fKSA9PSBUSU1fT0NNT0RFX0FDVElWRSkgfHwgICBcDQotICAgKChfX01PREVfXykgPT0gVElNX09DTU9ERV9JTkFDVElWRSkgfHwgKChfX01PREVfXykgPT0gVElNX09DTU9ERV9UT0dHTEUpIHx8IFwNCi0gICAoKF9fTU9ERV9fKSA9PSBUSU1fT0NNT0RFX0ZPUkNFRF9BQ1RJVkUpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoX19NT0RFX18pID09IFRJTV9PQ01PREVfRk9SQ0VEX0lOQUNUSVZFKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKChfX01PREVfXykgPT0gVElNX09DTU9ERV9SRVRSSUdFUlJBQkxFX09QTTEpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fTU9ERV9fKSA9PSBUSU1fT0NNT0RFX1JFVFJJR0VSUkFCTEVfT1BNMikgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoX19NT0RFX18pID09IFRJTV9PQ01PREVfRElSRUNUSU9OX09VVFBVVCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKChfX01PREVfXykgPT0gVElNX09DTU9ERV9QVUxTRV9PTl9DT01QQVJFKSkNCi0NCi0jaWYgZGVmaW5lZChUSU01KSAmJiBkZWZpbmVkKFRJTTIwKQ0KLQ0KLSNkZWZpbmUgSVNfVElNX0lOVEVSTkFMX1RSSUdHRVJFVkVOVF9TRUxFQ1RJT04oX19TRUxFQ1RJT05fXykgICAgICAgICAgICAgICAgXA0KLSAgKCgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjApIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjEpIHx8ICAgXA0KLSAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjIpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjMpIHx8ICAgXA0KLSAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjQpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjUpIHx8ICAgXA0KLSAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjYpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjcpIHx8ICAgXA0KLSAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjgpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjkpIHx8ICAgXA0KLSAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjEwKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxMSkgfHwgXA0KLSAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX05PTkUpKQ0KLSNlbGlmIGRlZmluZWQoVElNNSkNCi0jZGVmaW5lIElTX1RJTV9JTlRFUk5BTF9UUklHR0VSRVZFTlRfU0VMRUNUSU9OKF9fU0VMRUNUSU9OX18pICAgICAgICAgICAgICAgXA0KLSAgKCgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjApIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjEpIHx8ICBcDQotICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMikgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMykgfHwgIFwNCi0gICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI0KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI1KSB8fCAgXA0KLSAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjYpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjcpIHx8ICBcDQotICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSOCkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMTApIHx8IFwNCi0gICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxMSkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfTk9ORSkpDQotI2VsaWYgZGVmaW5lZChUSU0yMCkNCi0jZGVmaW5lIElTX1RJTV9JTlRFUk5BTF9UUklHR0VSRVZFTlRfU0VMRUNUSU9OKF9fU0VMRUNUSU9OX18pICAgICAgICAgICAgICAgXA0KLSAgKCgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjApIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjEpIHx8ICBcDQotICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMikgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMykgfHwgIFwNCi0gICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI1KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI2KSB8fCAgXA0KLSAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjcpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjgpIHx8ICBcDQotICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSOSkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMTEpIHx8IFwNCi0gICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19OT05FKSkNCi0jZWxzZQ0KLSNkZWZpbmUgSVNfVElNX0lOVEVSTkFMX1RSSUdHRVJFVkVOVF9TRUxFQ1RJT04oX19TRUxFQ1RJT05fXykgICAgICAgICAgICAgIFwNCi0gICgoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIwKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxKSB8fCBcDQotICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMikgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMykgfHwgXA0KLSAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjUpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjYpIHx8IFwNCi0gICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI3KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI4KSB8fCBcDQotICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMTEpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX05PTkUpKQ0KLSNlbmRpZiAvKiBUSU01ICYmIFRJTTIwICovDQotDQotI2RlZmluZSBJU19USU1fVFJJR0dFUlBPTEFSSVRZKF9fUE9MQVJJVFlfXykgICAgICAgICAgICAgIFwNCi0gICgoKF9fUE9MQVJJVFlfXykgPT0gVElNX1RSSUdHRVJQT0xBUklUWV9JTlZFUlRFRCkgfHwgICAgXA0KLSAgICgoX19QT0xBUklUWV9fKSA9PSBUSU1fVFJJR0dFUlBPTEFSSVRZX05PTklOVkVSVEVEKSB8fCBcDQotICAgKChfX1BPTEFSSVRZX18pID09IFRJTV9UUklHR0VSUE9MQVJJVFlfUklTSU5HKSB8fCAgICAgIFwNCi0gICAoKF9fUE9MQVJJVFlfXykgPT0gVElNX1RSSUdHRVJQT0xBUklUWV9GQUxMSU5HKSB8fCAgICAgXA0KLSAgICgoX19QT0xBUklUWV9fKSA9PSBUSU1fVFJJR0dFUlBPTEFSSVRZX0JPVEhFREdFKSkNCi0NCi0jZGVmaW5lIElTX1RJTV9UUklHR0VSUFJFU0NBTEVSKF9fUFJFU0NBTEVSX18pICAgICAgIFwNCi0gICgoKF9fUFJFU0NBTEVSX18pID09IFRJTV9UUklHR0VSUFJFU0NBTEVSX0RJVjEpIHx8IFwNCi0gICAoKF9fUFJFU0NBTEVSX18pID09IFRJTV9UUklHR0VSUFJFU0NBTEVSX0RJVjIpIHx8IFwNCi0gICAoKF9fUFJFU0NBTEVSX18pID09IFRJTV9UUklHR0VSUFJFU0NBTEVSX0RJVjQpIHx8IFwNCi0gICAoKF9fUFJFU0NBTEVSX18pID09IFRJTV9UUklHR0VSUFJFU0NBTEVSX0RJVjgpKQ0KLQ0KLSNkZWZpbmUgSVNfVElNX1RSSUdHRVJGSUxURVIoX19JQ0ZJTFRFUl9fKSAoKF9fSUNGSUxURVJfXykgPD0gMHhGVSkNCi0NCi0jZGVmaW5lIElTX1RJTV9USTFTRUxFQ1RJT04oX19USTFTRUxFQ1RJT05fXykgICAgICBcDQotICAoKChfX1RJMVNFTEVDVElPTl9fKSA9PSBUSU1fVEkxU0VMRUNUSU9OX0NIMSkgfHwgXA0KLSAgICgoX19USTFTRUxFQ1RJT05fXykgPT0gVElNX1RJMVNFTEVDVElPTl9YT1JDT01CSU5BVElPTikpDQotDQotI2RlZmluZSBJU19USU1fRE1BX0xFTkdUSChfX0xFTkdUSF9fKSAgICAgICAgICAgICAgICAgIFwNCi0gICgoKF9fTEVOR1RIX18pID09IFRJTV9ETUFCVVJTVExFTkdUSF8xVFJBTlNGRVIpIHx8ICAgXA0KLSAgICgoX19MRU5HVEhfXykgPT0gVElNX0RNQUJVUlNUTEVOR1RIXzJUUkFOU0ZFUlMpIHx8ICBcDQotICAgKChfX0xFTkdUSF9fKSA9PSBUSU1fRE1BQlVSU1RMRU5HVEhfM1RSQU5TRkVSUykgfHwgIFwNCi0gICAoKF9fTEVOR1RIX18pID09IFRJTV9ETUFCVVJTVExFTkdUSF80VFJBTlNGRVJTKSB8fCAgXA0KLSAgICgoX19MRU5HVEhfXykgPT0gVElNX0RNQUJVUlNUTEVOR1RIXzVUUkFOU0ZFUlMpIHx8ICBcDQotICAgKChfX0xFTkdUSF9fKSA9PSBUSU1fRE1BQlVSU1RMRU5HVEhfNlRSQU5TRkVSUykgfHwgIFwNCi0gICAoKF9fTEVOR1RIX18pID09IFRJTV9ETUFCVVJTVExFTkdUSF83VFJBTlNGRVJTKSB8fCAgXA0KLSAgICgoX19MRU5HVEhfXykgPT0gVElNX0RNQUJVUlNUTEVOR1RIXzhUUkFOU0ZFUlMpIHx8ICBcDQotICAgKChfX0xFTkdUSF9fKSA9PSBUSU1fRE1BQlVSU1RMRU5HVEhfOVRSQU5TRkVSUykgfHwgIFwNCi0gICAoKF9fTEVOR1RIX18pID09IFRJTV9ETUFCVVJTVExFTkdUSF8xMFRSQU5TRkVSUykgfHwgXA0KLSAgICgoX19MRU5HVEhfXykgPT0gVElNX0RNQUJVUlNUTEVOR1RIXzExVFJBTlNGRVJTKSB8fCBcDQotICAgKChfX0xFTkdUSF9fKSA9PSBUSU1fRE1BQlVSU1RMRU5HVEhfMTJUUkFOU0ZFUlMpIHx8IFwNCi0gICAoKF9fTEVOR1RIX18pID09IFRJTV9ETUFCVVJTVExFTkdUSF8xM1RSQU5TRkVSUykgfHwgXA0KLSAgICgoX19MRU5HVEhfXykgPT0gVElNX0RNQUJVUlNUTEVOR1RIXzE0VFJBTlNGRVJTKSB8fCBcDQotICAgKChfX0xFTkdUSF9fKSA9PSBUSU1fRE1BQlVSU1RMRU5HVEhfMTVUUkFOU0ZFUlMpIHx8IFwNCi0gICAoKF9fTEVOR1RIX18pID09IFRJTV9ETUFCVVJTVExFTkdUSF8xNlRSQU5TRkVSUykgfHwgXA0KLSAgICgoX19MRU5HVEhfXykgPT0gVElNX0RNQUJVUlNUTEVOR1RIXzE3VFJBTlNGRVJTKSB8fCBcDQotICAgKChfX0xFTkdUSF9fKSA9PSBUSU1fRE1BQlVSU1RMRU5HVEhfMThUUkFOU0ZFUlMpIHx8IFwNCi0gICAoKF9fTEVOR1RIX18pID09IFRJTV9ETUFCVVJTVExFTkdUSF8xOVRSQU5TRkVSUykgfHwgXA0KLSAgICgoX19MRU5HVEhfXykgPT0gVElNX0RNQUJVUlNUTEVOR1RIXzIwVFJBTlNGRVJTKSB8fCBcDQotICAgKChfX0xFTkdUSF9fKSA9PSBUSU1fRE1BQlVSU1RMRU5HVEhfMjFUUkFOU0ZFUlMpIHx8IFwNCi0gICAoKF9fTEVOR1RIX18pID09IFRJTV9ETUFCVVJTVExFTkdUSF8yMlRSQU5TRkVSUykgfHwgXA0KLSAgICgoX19MRU5HVEhfXykgPT0gVElNX0RNQUJVUlNUTEVOR1RIXzIzVFJBTlNGRVJTKSB8fCBcDQotICAgKChfX0xFTkdUSF9fKSA9PSBUSU1fRE1BQlVSU1RMRU5HVEhfMjRUUkFOU0ZFUlMpIHx8IFwNCi0gICAoKF9fTEVOR1RIX18pID09IFRJTV9ETUFCVVJTVExFTkdUSF8yNVRSQU5TRkVSUykgfHwgXA0KLSAgICgoX19MRU5HVEhfXykgPT0gVElNX0RNQUJVUlNUTEVOR1RIXzI2VFJBTlNGRVJTKSkNCi0NCi0jZGVmaW5lIElTX1RJTV9ETUFfREFUQV9MRU5HVEgoTEVOR1RIKSBcDQotICAoKChMRU5HVEgpID49IDB4MVUpICYmICgoTEVOR1RIKSA8IDB4MTAwMDBVKSkNCi0NCi0jZGVmaW5lIElTX1RJTV9JQ19GSUxURVIoX19JQ0ZJTFRFUl9fKSAoKF9fSUNGSUxURVJfXykgPD0gMHhGVSkNCi0NCi0jZGVmaW5lIElTX1RJTV9ERUFEVElNRShfX0RFQURUSU1FX18pICgoX19ERUFEVElNRV9fKSA8PSAweEZGVSkNCi0NCi0jZGVmaW5lIElTX1RJTV9CUkVBS19TWVNURU0oX19DT05GSUdfXykgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoKF9fQ09ORklHX18pID09IFRJTV9CUkVBS19TWVNURU1fRUNDKSB8fCAgICAgICAgICAgICAgIFwNCi0gICAoKF9fQ09ORklHX18pID09IFRJTV9CUkVBS19TWVNURU1fUFZEKSB8fCAgICAgICAgICAgICAgIFwNCi0gICAoKF9fQ09ORklHX18pID09IFRJTV9CUkVBS19TWVNURU1fU1JBTV9QQVJJVFlfRVJST1IpIHx8IFwNCi0gICAoKF9fQ09ORklHX18pID09IFRJTV9CUkVBS19TWVNURU1fTE9DS1VQKSkNCi0NCi0jZGVmaW5lIElTX1RJTV9TTEFWRU1PREVfVFJJR0dFUl9FTkFCTEVEKF9fVFJJR0dFUl9fKSBcDQotICAoKChfX1RSSUdHRVJfXykgPT0gVElNX1NMQVZFTU9ERV9UUklHR0VSKSB8fCAgICAgICAgXA0KLSAgICgoX19UUklHR0VSX18pID09IFRJTV9TTEFWRU1PREVfQ09NQklORURfUkVTRVRUUklHR0VSKSkNCi0NCi0jZGVmaW5lIFRJTV9TRVRfSUNQUkVTQ0FMRVJWQUxVRShfX0hBTkRMRV9fLCBfX0NIQU5ORUxfXywgX19JQ1BTQ19fKSBcDQotICAoKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMSB8PSAoX19JQ1BTQ19fKSkgICAgICAgICAgICAgIFwNCi0gICA6ICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIxIHw9ICgoX19JQ1BTQ19fKSA8PCA4VSkpICAgICAgXA0KLSAgIDogKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjIgfD0gKF9fSUNQU0NfXykpICAgICAgICAgICAgICBcDQotICAgICAgIDogKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIyIHw9ICgoX19JQ1BTQ19fKSA8PCA4VSkpKQ0KLQ0KLSNkZWZpbmUgVElNX1JFU0VUX0lDUFJFU0NBTEVSVkFMVUUoX19IQU5ETEVfXywgX19DSEFOTkVMX18pICAgXA0KLSAgKCgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMSAmPSB+VElNX0NDTVIxX0lDMVBTQykgXA0KLSAgIDogKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMikgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMSAmPSB+VElNX0NDTVIxX0lDMlBTQykgXA0KLSAgIDogKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMykgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMiAmPSB+VElNX0NDTVIyX0lDM1BTQykgXA0KLSAgICAgICA6ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMiAmPSB+VElNX0NDTVIyX0lDNFBTQykpDQotDQotI2RlZmluZSBUSU1fU0VUX0NBUFRVUkVQT0xBUklUWShfX0hBTkRMRV9fLCBfX0NIQU5ORUxfXywgX19QT0xBUklUWV9fKSBcDQotICAoKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDRVIgfD0gKF9fUE9MQVJJVFlfXykpICAgICAgICAgICAgICBcDQotICAgOiAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDRVIgfD0gKChfX1BPTEFSSVRZX18pIDw8IDRVKSkgICAgICBcDQotICAgOiAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDRVIgfD0gKChfX1BPTEFSSVRZX18pIDw8IDhVKSkgICAgICBcDQotICAgICAgIDogKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDRVIgfD0gKCgoX19QT0xBUklUWV9fKSA8PCAxMlUpKSkpDQotDQotI2RlZmluZSBUSU1fUkVTRVRfQ0FQVFVSRVBPTEFSSVRZKF9fSEFORExFX18sIF9fQ0hBTk5FTF9fKSAgICAgICAgICAgICAgICAgICBcDQotICAoKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDRVIgJj0gfihUSU1fQ0NFUl9DQzFQIHwgVElNX0NDRVJfQ0MxTlApKSBcDQotICAgOiAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDRVIgJj0gfihUSU1fQ0NFUl9DQzJQIHwgVElNX0NDRVJfQ0MyTlApKSBcDQotICAgOiAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDRVIgJj0gfihUSU1fQ0NFUl9DQzNQIHwgVElNX0NDRVJfQ0MzTlApKSBcDQotICAgICAgIDogKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDRVIgJj0gfihUSU1fQ0NFUl9DQzRQIHwgVElNX0NDRVJfQ0M0TlApKSkNCi0NCi0jZGVmaW5lIFRJTV9DSEFOTkVMX1NUQVRFX0dFVChfX0hBTkRMRV9fLCBfX0NIQU5ORUxfXykgICAgICAgICAgICAgICAgXA0KLSAgKCgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzEpICAgPyAoX19IQU5ETEVfXyktPkNoYW5uZWxTdGF0ZVswXSBcDQotICAgOiAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8yKSA/IChfX0hBTkRMRV9fKS0+Q2hhbm5lbFN0YXRlWzFdIFwNCi0gICA6ICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzMpID8gKF9fSEFORExFX18pLT5DaGFubmVsU3RhdGVbMl0gXA0KLSAgIDogKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfNCkgPyAoX19IQU5ETEVfXyktPkNoYW5uZWxTdGF0ZVszXSBcDQotICAgOiAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF81KSA/IChfX0hBTkRMRV9fKS0+Q2hhbm5lbFN0YXRlWzRdIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKF9fSEFORExFX18pLT5DaGFubmVsU3RhdGVbNV0pDQotDQotI2RlZmluZSBUSU1fQ0hBTk5FTF9TVEFURV9TRVQoX19IQU5ETEVfXywgX19DSEFOTkVMX18sIF9fQ0hBTk5FTF9TVEFURV9fKSBcDQotICAoKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgID8gKChfX0hBTkRMRV9fKS0+Q2hhbm5lbFN0YXRlWzBdID0gKF9fQ0hBTk5FTF9TVEFURV9fKSkgICAgICAgICAgICBcDQotICAgOiAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgID8gKChfX0hBTkRMRV9fKS0+Q2hhbm5lbFN0YXRlWzFdID0gKF9fQ0hBTk5FTF9TVEFURV9fKSkgICAgICAgICAgICBcDQotICAgOiAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgID8gKChfX0hBTkRMRV9fKS0+Q2hhbm5lbFN0YXRlWzJdID0gKF9fQ0hBTk5FTF9TVEFURV9fKSkgICAgICAgICAgICBcDQotICAgOiAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF80KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgID8gKChfX0hBTkRMRV9fKS0+Q2hhbm5lbFN0YXRlWzNdID0gKF9fQ0hBTk5FTF9TVEFURV9fKSkgICAgICAgICAgICBcDQotICAgOiAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF81KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgID8gKChfX0hBTkRMRV9fKS0+Q2hhbm5lbFN0YXRlWzRdID0gKF9fQ0hBTk5FTF9TVEFURV9fKSkgICAgICAgICAgICBcDQotICAgICAgIDogKChfX0hBTkRMRV9fKS0+Q2hhbm5lbFN0YXRlWzVdID0gKF9fQ0hBTk5FTF9TVEFURV9fKSkpDQotDQotI2RlZmluZSBUSU1fQ0hBTk5FTF9TVEFURV9TRVRfQUxMKF9fSEFORExFX18sIF9fQ0hBTk5FTF9TVEFURV9fKSBcDQotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIChfX0hBTkRMRV9fKS0+Q2hhbm5lbFN0YXRlWzBdID0gKF9fQ0hBTk5FTF9TVEFURV9fKTsgICAgICAgICBcDQotICAgIChfX0hBTkRMRV9fKS0+Q2hhbm5lbFN0YXRlWzFdID0gKF9fQ0hBTk5FTF9TVEFURV9fKTsgICAgICAgICBcDQotICAgIChfX0hBTkRMRV9fKS0+Q2hhbm5lbFN0YXRlWzJdID0gKF9fQ0hBTk5FTF9TVEFURV9fKTsgICAgICAgICBcDQotICAgIChfX0hBTkRMRV9fKS0+Q2hhbm5lbFN0YXRlWzNdID0gKF9fQ0hBTk5FTF9TVEFURV9fKTsgICAgICAgICBcDQotICAgIChfX0hBTkRMRV9fKS0+Q2hhbm5lbFN0YXRlWzRdID0gKF9fQ0hBTk5FTF9TVEFURV9fKTsgICAgICAgICBcDQotICAgIChfX0hBTkRMRV9fKS0+Q2hhbm5lbFN0YXRlWzVdID0gKF9fQ0hBTk5FTF9TVEFURV9fKTsgICAgICAgICBcDQotICB9IHdoaWxlICgwKQ0KLQ0KLSNkZWZpbmUgVElNX0NIQU5ORUxfTl9TVEFURV9HRVQoX19IQU5ETEVfXywgX19DSEFOTkVMX18pICAgICAgICAgICAgICAgXA0KLSAgKCgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzEpICAgPyAoX19IQU5ETEVfXyktPkNoYW5uZWxOU3RhdGVbMF0gXA0KLSAgIDogKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMikgPyAoX19IQU5ETEVfXyktPkNoYW5uZWxOU3RhdGVbMV0gXA0KLSAgIDogKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMykgPyAoX19IQU5ETEVfXyktPkNoYW5uZWxOU3RhdGVbMl0gXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoX19IQU5ETEVfXyktPkNoYW5uZWxOU3RhdGVbM10pDQotDQotI2RlZmluZSBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChfX0hBTkRMRV9fLCBfX0NIQU5ORUxfXywgX19DSEFOTkVMX1NUQVRFX18pIFwNCi0gICgoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICA/ICgoX19IQU5ETEVfXyktPkNoYW5uZWxOU3RhdGVbMF0gPSAoX19DSEFOTkVMX1NUQVRFX18pKSAgICAgICAgICAgICBcDQotICAgOiAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgPyAoKF9fSEFORExFX18pLT5DaGFubmVsTlN0YXRlWzFdID0gKF9fQ0hBTk5FTF9TVEFURV9fKSkgICAgICAgICAgICAgXA0KLSAgIDogKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgID8gKChfX0hBTkRMRV9fKS0+Q2hhbm5lbE5TdGF0ZVsyXSA9IChfX0NIQU5ORUxfU1RBVEVfXykpICAgICAgICAgICAgIFwNCi0gICAgICAgOiAoKF9fSEFORExFX18pLT5DaGFubmVsTlN0YXRlWzNdID0gKF9fQ0hBTk5FTF9TVEFURV9fKSkpDQotDQotI2RlZmluZSBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVF9BTEwoX19IQU5ETEVfXywgX19DSEFOTkVMX1NUQVRFX18pIFwNCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAoX19IQU5ETEVfXyktPkNoYW5uZWxOU3RhdGVbMF0gPSAoX19DSEFOTkVMX1NUQVRFX18pOyAgICAgICAgICBcDQotICAgIChfX0hBTkRMRV9fKS0+Q2hhbm5lbE5TdGF0ZVsxXSA9IChfX0NIQU5ORUxfU1RBVEVfXyk7ICAgICAgICAgIFwNCi0gICAgKF9fSEFORExFX18pLT5DaGFubmVsTlN0YXRlWzJdID0gKF9fQ0hBTk5FTF9TVEFURV9fKTsgICAgICAgICAgXA0KLSAgICAoX19IQU5ETEVfXyktPkNoYW5uZWxOU3RhdGVbM10gPSAoX19DSEFOTkVMX1NUQVRFX18pOyAgICAgICAgICBcDQotICB9IHdoaWxlICgwKQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotLyogRW5kIG9mIHByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0NCi0vKiBJbmNsdWRlIFRJTSBIQUwgRXh0ZW5kZWQgbW9kdWxlICovDQotI2luY2x1ZGUgInN0bTMyZzR4eF9oYWxfdGltX2V4LmgiDQotDQotLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGFkZHRvZ3JvdXAgVElNX0V4cG9ydGVkX0Z1bmN0aW9ucyBUSU0gRXhwb3J0ZWQgRnVuY3Rpb25zDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGFkZHRvZ3JvdXAgVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgVElNIFRpbWUgQmFzZSBmdW5jdGlvbnMNCi0gKiAgQGJyaWVmICAgVGltZSBCYXNlIGZ1bmN0aW9ucw0KLSAqIEB7DQotICovDQotLyogVGltZSBCYXNlIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0Jhc2VfSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9CYXNlX0RlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7DQotdm9pZCBIQUxfVElNX0Jhc2VfTXNwSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7DQotdm9pZCBIQUxfVElNX0Jhc2VfTXNwRGVJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsNCi0vKiBCbG9ja2luZyBtb2RlOiBQb2xsaW5nICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9CYXNlX1N0YXJ0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0Jhc2VfU3RvcChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7DQotLyogTm9uLUJsb2NraW5nIG1vZGU6IEludGVycnVwdCAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fQmFzZV9TdGFydF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9CYXNlX1N0b3BfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOw0KLS8qIE5vbi1CbG9ja2luZyBtb2RlOiBETUEgKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0Jhc2VfU3RhcnRfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBEYXRhLCB1aW50MTZfdCBMZW5ndGgpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fQmFzZV9TdG9wX0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7DQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGFkZHRvZ3JvdXAgVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgVElNIE91dHB1dCBDb21wYXJlIGZ1bmN0aW9ucw0KLSAqICBAYnJpZWYgICBUSU0gT3V0cHV0IENvbXBhcmUgZnVuY3Rpb25zDQotICogQHsNCi0gKi8NCi0vKiBUaW1lciBPdXRwdXQgQ29tcGFyZSBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT0NfSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PQ19EZUluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOw0KLXZvaWQgSEFMX1RJTV9PQ19Nc3BJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsNCi12b2lkIEhBTF9USU1fT0NfTXNwRGVJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsNCi0vKiBCbG9ja2luZyBtb2RlOiBQb2xsaW5nICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PQ19TdGFydChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PQ19TdG9wKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKTsNCi0vKiBOb24tQmxvY2tpbmcgbW9kZTogSW50ZXJydXB0ICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PQ19TdGFydF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT0NfU3RvcF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCk7DQotLyogTm9uLUJsb2NraW5nIG1vZGU6IERNQSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT0NfU3RhcnRfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90ICpwRGF0YSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBMZW5ndGgpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT0NfU3RvcF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKTsNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAYWRkdG9ncm91cCBUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBUSU0gUFdNIGZ1bmN0aW9ucw0KLSAqICBAYnJpZWYgICBUSU0gUFdNIGZ1bmN0aW9ucw0KLSAqIEB7DQotICovDQotLyogVGltZXIgUFdNIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1BXTV9Jbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1BXTV9EZUluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOw0KLXZvaWQgSEFMX1RJTV9QV01fTXNwSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7DQotdm9pZCBIQUxfVElNX1BXTV9Nc3BEZUluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOw0KLS8qIEJsb2NraW5nIG1vZGU6IFBvbGxpbmcgKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1BXTV9TdGFydChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9QV01fU3RvcChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCk7DQotLyogTm9uLUJsb2NraW5nIG1vZGU6IEludGVycnVwdCAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fUFdNX1N0YXJ0X0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fUFdNX1N0b3BfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKTsNCi0vKiBOb24tQmxvY2tpbmcgbW9kZTogRE1BICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9QV01fU3RhcnRfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCAqcERhdGEsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IExlbmd0aCk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9QV01fU3RvcF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCk7DQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGFkZHRvZ3JvdXAgVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQgVElNIElucHV0IENhcHR1cmUgZnVuY3Rpb25zDQotICogIEBicmllZiAgIFRJTSBJbnB1dCBDYXB0dXJlIGZ1bmN0aW9ucw0KLSAqIEB7DQotICovDQotLyogVGltZXIgSW5wdXQgQ2FwdHVyZSBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0lDX0luaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fSUNfRGVJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsNCi12b2lkIEhBTF9USU1fSUNfTXNwSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7DQotdm9pZCBIQUxfVElNX0lDX01zcERlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7DQotLyogQmxvY2tpbmcgbW9kZTogUG9sbGluZyAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fSUNfU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fSUNfU3RvcChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCk7DQotLyogTm9uLUJsb2NraW5nIG1vZGU6IEludGVycnVwdCAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fSUNfU3RhcnRfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0lDX1N0b3BfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpOw0KLS8qIE5vbi1CbG9ja2luZyBtb2RlOiBETUEgKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0lDX1N0YXJ0X0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCAqcERhdGEsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgTGVuZ3RoKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0lDX1N0b3BfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCk7DQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGFkZHRvZ3JvdXAgVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDUgVElNIE9uZSBQdWxzZSBmdW5jdGlvbnMNCi0gKiAgQGJyaWVmICAgVElNIE9uZSBQdWxzZSBmdW5jdGlvbnMNCi0gKiBAew0KLSAqLw0KLS8qIFRpbWVyIE9uZSBQdWxzZSBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PbmVQdWxzZV9Jbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBPbmVQdWxzZU1vZGUpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT25lUHVsc2VfRGVJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsNCi12b2lkIEhBTF9USU1fT25lUHVsc2VfTXNwSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7DQotdm9pZCBIQUxfVElNX09uZVB1bHNlX01zcERlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7DQotLyogQmxvY2tpbmcgbW9kZTogUG9sbGluZyAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT25lUHVsc2VfU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBPdXRwdXRDaGFubmVsKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09uZVB1bHNlX1N0b3AoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE91dHB1dENoYW5uZWwpOw0KLS8qIE5vbi1CbG9ja2luZyBtb2RlOiBJbnRlcnJ1cHQgKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09uZVB1bHNlX1N0YXJ0X0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgT3V0cHV0Q2hhbm5lbCk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PbmVQdWxzZV9TdG9wX0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBPdXRwdXRDaGFubmVsKTsNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAYWRkdG9ncm91cCBUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNiBUSU0gRW5jb2RlciBmdW5jdGlvbnMNCi0gKiAgQGJyaWVmICAgVElNIEVuY29kZXIgZnVuY3Rpb25zDQotICogQHsNCi0gKi8NCi0vKiBUaW1lciBFbmNvZGVyIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fRW5jb2Rlcl9Jbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9FbmNvZGVyX0luaXRUeXBlRGVmICpzQ29uZmlnKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0VuY29kZXJfRGVJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsNCi12b2lkIEhBTF9USU1fRW5jb2Rlcl9Nc3BJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsNCi12b2lkIEhBTF9USU1fRW5jb2Rlcl9Nc3BEZUluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOw0KLS8qIEJsb2NraW5nIG1vZGU6IFBvbGxpbmcgKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0VuY29kZXJfU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fRW5jb2Rlcl9TdG9wKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpOw0KLS8qIE5vbi1CbG9ja2luZyBtb2RlOiBJbnRlcnJ1cHQgKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0VuY29kZXJfU3RhcnRfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fRW5jb2Rlcl9TdG9wX0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpOw0KLS8qIE5vbi1CbG9ja2luZyBtb2RlOiBETUEgKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0VuY29kZXJfU3RhcnRfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgKnBEYXRhMSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwRGF0YTIsIHVpbnQxNl90IExlbmd0aCk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9FbmNvZGVyX1N0b3BfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKTsNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAYWRkdG9ncm91cCBUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNyBUSU0gSVJRIGhhbmRsZXIgbWFuYWdlbWVudA0KLSAqICBAYnJpZWYgICBJUlEgaGFuZGxlciBtYW5hZ2VtZW50DQotICogQHsNCi0gKi8NCi0vKiBJbnRlcnJ1cHQgSGFuZGxlciBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXZvaWQgSEFMX1RJTV9JUlFIYW5kbGVyKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDggVElNIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMNCi0gKiAgQGJyaWVmICAgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucw0KLSAqIEB7DQotICovDQotLyogQ29udHJvbCBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09DX0NvbmZpZ0NoYW5uZWwoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9PQ19Jbml0VHlwZURlZiAqc0NvbmZpZywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9QV01fQ29uZmlnQ2hhbm5lbChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9PQ19Jbml0VHlwZURlZiAqc0NvbmZpZywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fSUNfQ29uZmlnQ2hhbm5lbChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX0lDX0luaXRUeXBlRGVmICpzQ29uZmlnLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09uZVB1bHNlX0NvbmZpZ0NoYW5uZWwoDQotICAgIFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCBUSU1fT25lUHVsc2VfSW5pdFR5cGVEZWYgKnNDb25maWcsDQotICAgIHVpbnQzMl90IE91dHB1dENoYW5uZWwsIHVpbnQzMl90IElucHV0Q2hhbm5lbCk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9Db25maWdPQ3JlZkNsZWFyKA0KLSAgICBUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgVElNX0NsZWFySW5wdXRDb25maWdUeXBlRGVmICpzQ2xlYXJJbnB1dENvbmZpZywNCi0gICAgdWludDMyX3QgQ2hhbm5lbCk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9Db25maWdDbG9ja1NvdXJjZSgNCi0gICAgVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIFRJTV9DbG9ja0NvbmZpZ1R5cGVEZWYgKnNDbG9ja1NvdXJjZUNvbmZpZyk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9Db25maWdUSTFJbnB1dChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRJMV9TZWxlY3Rpb24pOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fU2xhdmVDb25maWdTeW5jaHJvKA0KLSAgICBUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgVElNX1NsYXZlQ29uZmlnVHlwZURlZiAqc1NsYXZlQ29uZmlnKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1NsYXZlQ29uZmlnU3luY2hyb19JVCgNCi0gICAgVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIFRJTV9TbGF2ZUNvbmZpZ1R5cGVEZWYgKnNTbGF2ZUNvbmZpZyk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9ETUFCdXJzdF9Xcml0ZVN0YXJ0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBCdXJzdEJhc2VBZGRyZXNzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBCdXJzdFJlcXVlc3RTcmMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpCdXJzdEJ1ZmZlciwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQnVyc3RMZW5ndGgpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fRE1BQnVyc3RfTXVsdGlXcml0ZVN0YXJ0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEJ1cnN0QmFzZUFkZHJlc3MsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQnVyc3RSZXF1ZXN0U3JjLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpCdXJzdEJ1ZmZlciwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBCdXJzdExlbmd0aCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBEYXRhTGVuZ3RoKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0RNQUJ1cnN0X1dyaXRlU3RvcChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBCdXJzdFJlcXVlc3RTcmMpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fRE1BQnVyc3RfUmVhZFN0YXJ0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEJ1cnN0QmFzZUFkZHJlc3MsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQnVyc3RSZXF1ZXN0U3JjLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpCdXJzdEJ1ZmZlciwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBCdXJzdExlbmd0aCk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9ETUFCdXJzdF9NdWx0aVJlYWRTdGFydChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEJ1cnN0QmFzZUFkZHJlc3MsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBCdXJzdFJlcXVlc3RTcmMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqQnVyc3RCdWZmZXIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBCdXJzdExlbmd0aCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IERhdGFMZW5ndGgpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fRE1BQnVyc3RfUmVhZFN0b3AoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBCdXJzdFJlcXVlc3RTcmMpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fR2VuZXJhdGVFdmVudChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRXZlbnRTb3VyY2UpOw0KLXVpbnQzMl90IEhBTF9USU1fUmVhZENhcHR1cmVkVmFsdWUoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpOw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwOSBUSU0gQ2FsbGJhY2tzIGZ1bmN0aW9ucw0KLSAqICBAYnJpZWYgICBUSU0gQ2FsbGJhY2tzIGZ1bmN0aW9ucw0KLSAqIEB7DQotICovDQotLyogQ2FsbGJhY2sgaW4gbm9uIGJsb2NraW5nIG1vZGVzIChJbnRlcnJ1cHQgYW5kIERNQSkgKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi12b2lkIEhBTF9USU1fUGVyaW9kRWxhcHNlZENhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsNCi12b2lkIEhBTF9USU1fUGVyaW9kRWxhcHNlZEhhbGZDcGx0Q2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOw0KLXZvaWQgSEFMX1RJTV9PQ19EZWxheUVsYXBzZWRDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7DQotdm9pZCBIQUxfVElNX0lDX0NhcHR1cmVDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7DQotdm9pZCBIQUxfVElNX0lDX0NhcHR1cmVIYWxmQ3BsdENhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsNCi12b2lkIEhBTF9USU1fUFdNX1B1bHNlRmluaXNoZWRDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7DQotdm9pZCBIQUxfVElNX1BXTV9QdWxzZUZpbmlzaGVkSGFsZkNwbHRDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7DQotdm9pZCBIQUxfVElNX1RyaWdnZXJDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7DQotdm9pZCBIQUxfVElNX1RyaWdnZXJIYWxmQ3BsdENhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsNCi12b2lkIEhBTF9USU1fRXJyb3JDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7DQotDQotLyogQ2FsbGJhY2tzIFJlZ2lzdGVyL1VuUmVnaXN0ZXIgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0jaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQ0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fUmVnaXN0ZXJDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1RJTV9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVElNX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fVW5SZWdpc3RlckNhbGxiYWNrKA0KLSAgICBUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgSEFMX1RJTV9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKTsNCi0jZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxMCBUSU0gUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMNCi0gKiAgQGJyaWVmICBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucw0KLSAqIEB7DQotICovDQotLyogUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1IQUxfVElNX1N0YXRlVHlwZURlZiBIQUxfVElNX0Jhc2VfR2V0U3RhdGUoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOw0KLUhBTF9USU1fU3RhdGVUeXBlRGVmIEhBTF9USU1fT0NfR2V0U3RhdGUoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOw0KLUhBTF9USU1fU3RhdGVUeXBlRGVmIEhBTF9USU1fUFdNX0dldFN0YXRlKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsNCi1IQUxfVElNX1N0YXRlVHlwZURlZiBIQUxfVElNX0lDX0dldFN0YXRlKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsNCi1IQUxfVElNX1N0YXRlVHlwZURlZiBIQUxfVElNX09uZVB1bHNlX0dldFN0YXRlKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsNCi1IQUxfVElNX1N0YXRlVHlwZURlZiBIQUxfVElNX0VuY29kZXJfR2V0U3RhdGUoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOw0KLQ0KLS8qIFBlcmlwaGVyYWwgQ2hhbm5lbCBzdGF0ZSBmdW5jdGlvbnMNCi0gKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotSEFMX1RJTV9BY3RpdmVDaGFubmVsIEhBTF9USU1fR2V0QWN0aXZlQ2hhbm5lbChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7DQotSEFMX1RJTV9DaGFubmVsU3RhdGVUeXBlRGVmIEhBTF9USU1fR2V0Q2hhbm5lbFN0YXRlKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKTsNCi1IQUxfVElNX0RNQUJ1cnN0U3RhdGVUeXBlRGVmIEhBTF9USU1fRE1BQnVyc3RTdGF0ZShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7DQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLS8qIEVuZCBvZiBleHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotDQotLyogUHJpdmF0ZSBmdW5jdGlvbnMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGRlZmdyb3VwIFRJTV9Qcml2YXRlX0Z1bmN0aW9ucyBUSU0gUHJpdmF0ZSBGdW5jdGlvbnMNCi0gKiBAew0KLSAqLw0KLXZvaWQgVElNX0Jhc2VfU2V0Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCBUSU1fQmFzZV9Jbml0VHlwZURlZiAqU3RydWN0dXJlKTsNCi12b2lkIFRJTV9USTFfU2V0Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBUSU1fSUNQb2xhcml0eSwNCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRJTV9JQ1NlbGVjdGlvbiwgdWludDMyX3QgVElNX0lDRmlsdGVyKTsNCi12b2lkIFRJTV9PQzJfU2V0Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCBUSU1fT0NfSW5pdFR5cGVEZWYgKk9DX0NvbmZpZyk7DQotdm9pZCBUSU1fRVRSX1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgVElNX0V4dFRSR1ByZXNjYWxlciwNCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRJTV9FeHRUUkdQb2xhcml0eSwgdWludDMyX3QgRXh0VFJHRmlsdGVyKTsNCi0NCi12b2lkIFRJTV9ETUFEZWxheVB1bHNlSGFsZkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOw0KLXZvaWQgVElNX0RNQUVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsNCi12b2lkIFRJTV9ETUFDYXB0dXJlQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7DQotdm9pZCBUSU1fRE1BQ2FwdHVyZUhhbGZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsNCi12b2lkIFRJTV9DQ3hDaGFubmVsQ21kKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDaGFubmVsLA0KLSAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbFN0YXRlKTsNCi0NCi0jaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQ0KLXZvaWQgVElNX1Jlc2V0Q2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOw0KLSNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLS8qIEVuZCBvZiBwcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLSNpZmRlZiBfX2NwbHVzcGx1cw0KLX0NCi0jZW5kaWYNCi0NCi0jZW5kaWYgLyogU1RNMzJHNHh4X0hBTF9USU1fSCAqLw0KKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGZpbGUgICAgc3RtMzJnNHh4X2hhbF90aW0uaAorICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFRJTSBIQUwgbW9kdWxlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGF0dGVudGlvbgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGVybXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZQorICogaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc29mdHdhcmUgY29tcG9uZW50LgorICogSWYgbm8gTElDRU5TRSBmaWxlIGNvbWVzIHdpdGggdGhpcyBzb2Z0d2FyZSwgaXQgaXMgcHJvdmlkZWQgQVMtSVMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyRzR4eF9IQUxfVElNX0gKKyNkZWZpbmUgU1RNMzJHNHh4X0hBTF9USU1fSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnNHh4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzR4eF9IQUxfRHJpdmVyCisgKiBAeworICovCisKKy8qKiBAYWRkdG9ncm91cCBUSU0KKyAqIEB7CisgKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVElNX0V4cG9ydGVkX1R5cGVzIFRJTSBFeHBvcnRlZCBUeXBlcworICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiAgVElNIFRpbWUgYmFzZSBDb25maWd1cmF0aW9uIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDMyX3QKKyAgICAgIFByZXNjYWxlcjsgLyohPCBTcGVjaWZpZXMgdGhlIHByZXNjYWxlciB2YWx1ZSB1c2VkIHRvIGRpdmlkZSB0aGUgVElNCisgICAgICAgICAgICAgICAgICAgIGNsb2NrLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9CisgICAgICAgICAgICAgICAgICAgIDB4MDAwMCBhbmQgTWF4X0RhdGEgPSAweEZGRkYgTWFjcm8gX19IQUxfVElNX0NBTENfUFNDKCkgY2FuCisgICAgICAgICAgICAgICAgICAgIGJlIHVzZWQgdG8gY2FsY3VsYXRlIHByZXNjYWxlciB2YWx1ZSAqLworCisgIHVpbnQzMl90IENvdW50ZXJNb2RlOyAvKiE8IFNwZWNpZmllcyB0aGUgY291bnRlciBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fQ291bnRlcl9Nb2RlICovCisKKyAgdWludDMyX3QKKyAgICAgIFBlcmlvZDsgLyohPCBTcGVjaWZpZXMgdGhlIHBlcmlvZCB2YWx1ZSB0byBiZSBsb2FkZWQgaW50byB0aGUgYWN0aXZlCisgICAgICAgICAgICAgICAgICAgQXV0by1SZWxvYWQgUmVnaXN0ZXIgYXQgdGhlIG5leHQgdXBkYXRlIGV2ZW50LgorICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMDAwIGFuZAorICAgICAgICAgICAgICAgICBNYXhfRGF0YSA9IDB4RkZGRiAob3IgMHhGRkVGIGlmIGRpdGhlcmluZyBpcyBhY3RpdmF0ZWQpTWFjcm9zCisgICAgICAgICAgICAgICAgIF9fSEFMX1RJTV9DQUxDX1BFUklPRCgpLAorICAgICAgICAgICAgICAgICAgICBfX0hBTF9USU1fQ0FMQ19QRVJJT0RfRElUSEVSKCksX19IQUxfVElNX0NBTENfUEVSSU9EX0JZX0RFTEFZKCksCisgICAgICAgICAgICAgICAgICAgIF9fSEFMX1RJTV9DQUxDX1BFUklPRF9ESVRIRVJfQllfREVMQVkoKWNhbiBiZSB1c2VkIHRvCisgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZSBQZXJpb2QgdmFsdWUgKi8KKworICB1aW50MzJfdCBDbG9ja0RpdmlzaW9uOyAvKiE8IFNwZWNpZmllcyB0aGUgY2xvY2sgZGl2aXNpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fQ2xvY2tEaXZpc2lvbiAqLworCisgIHVpbnQzMl90IFJlcGV0aXRpb25Db3VudGVyOyAvKiE8IFNwZWNpZmllcyB0aGUgcmVwZXRpdGlvbiBjb3VudGVyIHZhbHVlLiBFYWNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lIHRoZSBSQ1IgZG93bmNvdW50ZXIgcmVhY2hlcyB6ZXJvLCBhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlIGV2ZW50IGlzIGdlbmVyYXRlZCBhbmQgY291bnRpbmcgcmVzdGFydHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gdGhlIFJDUiB2YWx1ZSAoTikuIFRoaXMgbWVhbnMgaW4gUFdNIG1vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgKE4rMSkgY29ycmVzcG9uZHMgdG86CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHRoZSBudW1iZXIgb2YgUFdNIHBlcmlvZHMgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkZ2UtYWxpZ25lZCBtb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHRoZSBudW1iZXIgb2YgaGFsZiBQV00gcGVyaW9kIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXItYWxpZ25lZCBtb2RlIEdQIHRpbWVyczogdGhpcyBwYXJhbWV0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MDAgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhfRGF0YSA9IDB4RkYuIEFkdmFuY2VkIHRpbWVyczogdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAgYW5kIE1heF9EYXRhID0gMHhGRkZGLiAqLworCisgIHVpbnQzMl90IEF1dG9SZWxvYWRQcmVsb2FkOyAvKiE8IFNwZWNpZmllcyB0aGUgYXV0by1yZWxvYWQgcHJlbG9hZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fQXV0b1JlbG9hZFByZWxvYWQgKi8KK30gVElNX0Jhc2VfSW5pdFR5cGVEZWY7CisKKy8qKgorICogQGJyaWVmICBUSU0gT3V0cHV0IENvbXBhcmUgQ29uZmlndXJhdGlvbiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQzMl90IE9DTW9kZTsgLyohPCBTcGVjaWZpZXMgdGhlIFRJTSBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgIFRJTV9PdXRwdXRfQ29tcGFyZV9hbmRfUFdNX21vZGVzICovCisKKyAgdWludDMyX3QgUHVsc2U7IC8qITwgU3BlY2lmaWVzIHRoZSBwdWxzZSB2YWx1ZSB0byBiZSBsb2FkZWQgaW50byB0aGUgQ2FwdHVyZQorICAgICAgICAgICAgICAgICAgICAgQ29tcGFyZSBSZWdpc3Rlci4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgbnVtYmVyIGJldHdlZW4KKyAgICAgICAgICAgICAgICAgICAgIE1pbl9EYXRhID0gMHgwMDAwIGFuZCBNYXhfRGF0YSA9IDB4RkZGRiAob3IgMHhGRkVGIGlmCisgICAgICAgICAgICAgICAgICAgICBkaXRoZXJpbmcgaXMgYWN0aXZhdGVkKSBNYWNyb3MgX19IQUxfVElNX0NBTENfUFVMU0UoKSwKKyAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1RJTV9DQUxDX1BVTFNFX0RJVEhFUigpIGNhbiBiZSB1c2VkIHRvIGNhbGN1bGF0ZQorICAgICAgICAgICAgICAgICAgICAgICBQdWxzZSB2YWx1ZSAqLworCisgIHVpbnQzMl90IE9DUG9sYXJpdHk7IC8qITwgU3BlY2lmaWVzIHRoZSBvdXRwdXQgcG9sYXJpdHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fT3V0cHV0X0NvbXBhcmVfUG9sYXJpdHkgKi8KKworICB1aW50MzJfdCBPQ05Qb2xhcml0eTsgLyohPCBTcGVjaWZpZXMgdGhlIGNvbXBsZW1lbnRhcnkgb3V0cHV0IHBvbGFyaXR5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fT3V0cHV0X0NvbXBhcmVfTl9Qb2xhcml0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBUaGlzIHBhcmFtZXRlciBpcyB2YWxpZCBvbmx5IGZvciB0aW1lcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VzIHN1cHBvcnRpbmcgYnJlYWsgZmVhdHVyZS4gKi8KKworICB1aW50MzJfdCBPQ0Zhc3RNb2RlOyAvKiE8IFNwZWNpZmllcyB0aGUgRmFzdCBtb2RlIHN0YXRlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX091dHB1dF9GYXN0X1N0YXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgVGhpcyBwYXJhbWV0ZXIgaXMgdmFsaWQgb25seSBpbiBQV00xIGFuZCBQV00yCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUuICovCisKKyAgdWludDMyX3QgT0NJZGxlU3RhdGU7IC8qITwgU3BlY2lmaWVzIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgcGluIHN0YXRlIGR1cmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRsZSBzdGF0ZS4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX091dHB1dF9Db21wYXJlX0lkbGVfU3RhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgVGhpcyBwYXJhbWV0ZXIgaXMgdmFsaWQgb25seSBmb3IgdGltZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlcyBzdXBwb3J0aW5nIGJyZWFrIGZlYXR1cmUuICovCisKKyAgdWludDMyX3QgT0NOSWRsZVN0YXRlOyAvKiE8IFNwZWNpZmllcyB0aGUgVElNIE91dHB1dCBDb21wYXJlIHBpbiBzdGF0ZSBkdXJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZGxlIHN0YXRlLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX091dHB1dF9Db21wYXJlX05fSWRsZV9TdGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgVGhpcyBwYXJhbWV0ZXIgaXMgdmFsaWQgb25seSBmb3IgdGltZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZXMgc3VwcG9ydGluZyBicmVhayBmZWF0dXJlLiAqLworfSBUSU1fT0NfSW5pdFR5cGVEZWY7CisKKy8qKgorICogQGJyaWVmICBUSU0gT25lIFB1bHNlIE1vZGUgQ29uZmlndXJhdGlvbiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQzMl90IE9DTW9kZTsgLyohPCBTcGVjaWZpZXMgdGhlIFRJTSBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgIFRJTV9PdXRwdXRfQ29tcGFyZV9hbmRfUFdNX21vZGVzICovCisKKyAgdWludDMyX3QgUHVsc2U7IC8qITwgU3BlY2lmaWVzIHRoZSBwdWxzZSB2YWx1ZSB0byBiZSBsb2FkZWQgaW50byB0aGUgQ2FwdHVyZQorICAgICAgICAgICAgICAgICAgICAgQ29tcGFyZSBSZWdpc3Rlci4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgbnVtYmVyIGJldHdlZW4KKyAgICAgICAgICAgICAgICAgICAgIE1pbl9EYXRhID0gMHgwMDAwIGFuZCBNYXhfRGF0YSA9IDB4RkZGRiAob3IgMHhGRkVGIGlmCisgICAgICAgICAgICAgICAgICAgICBkaXRoZXJpbmcgaXMgYWN0aXZhdGVkKSBNYWNyb3MgX19IQUxfVElNX0NBTENfUFVMU0UoKSwKKyAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1RJTV9DQUxDX1BVTFNFX0RJVEhFUigpIGNhbiBiZSB1c2VkIHRvIGNhbGN1bGF0ZQorICAgICAgICAgICAgICAgICAgICAgICBQdWxzZSB2YWx1ZSAqLworCisgIHVpbnQzMl90IE9DUG9sYXJpdHk7IC8qITwgU3BlY2lmaWVzIHRoZSBvdXRwdXQgcG9sYXJpdHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fT3V0cHV0X0NvbXBhcmVfUG9sYXJpdHkgKi8KKworICB1aW50MzJfdCBPQ05Qb2xhcml0eTsgLyohPCBTcGVjaWZpZXMgdGhlIGNvbXBsZW1lbnRhcnkgb3V0cHV0IHBvbGFyaXR5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fT3V0cHV0X0NvbXBhcmVfTl9Qb2xhcml0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBUaGlzIHBhcmFtZXRlciBpcyB2YWxpZCBvbmx5IGZvciB0aW1lcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VzIHN1cHBvcnRpbmcgYnJlYWsgZmVhdHVyZS4gKi8KKworICB1aW50MzJfdCBPQ0lkbGVTdGF0ZTsgLyohPCBTcGVjaWZpZXMgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBwaW4gc3RhdGUgZHVyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJZGxlIHN0YXRlLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fT3V0cHV0X0NvbXBhcmVfSWRsZV9TdGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBUaGlzIHBhcmFtZXRlciBpcyB2YWxpZCBvbmx5IGZvciB0aW1lcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VzIHN1cHBvcnRpbmcgYnJlYWsgZmVhdHVyZS4gKi8KKworICB1aW50MzJfdCBPQ05JZGxlU3RhdGU7IC8qITwgU3BlY2lmaWVzIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgcGluIHN0YXRlIGR1cmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkbGUgc3RhdGUuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fT3V0cHV0X0NvbXBhcmVfTl9JZGxlX1N0YXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBUaGlzIHBhcmFtZXRlciBpcyB2YWxpZCBvbmx5IGZvciB0aW1lcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlcyBzdXBwb3J0aW5nIGJyZWFrIGZlYXR1cmUuICovCisKKyAgdWludDMyX3QgSUNQb2xhcml0eTsgLyohPCBTcGVjaWZpZXMgdGhlIGFjdGl2ZSBlZGdlIG9mIHRoZSBpbnB1dCBzaWduYWwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fSW5wdXRfQ2FwdHVyZV9Qb2xhcml0eSAqLworCisgIHVpbnQzMl90IElDU2VsZWN0aW9uOyAvKiE8IFNwZWNpZmllcyB0aGUgaW5wdXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX0lucHV0X0NhcHR1cmVfU2VsZWN0aW9uICovCisKKyAgdWludDMyX3QgSUNGaWx0ZXI7IC8qITwgU3BlY2lmaWVzIHRoZSBpbnB1dCBjYXB0dXJlIGZpbHRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MAorICAgICAgICAgICAgICAgICAgICAgICAgYW5kIE1heF9EYXRhID0gMHhGICovCit9IFRJTV9PbmVQdWxzZV9Jbml0VHlwZURlZjsKKworLyoqCisgKiBAYnJpZWYgIFRJTSBJbnB1dCBDYXB0dXJlIENvbmZpZ3VyYXRpb24gU3RydWN0dXJlIGRlZmluaXRpb24KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50MzJfdCBJQ1BvbGFyaXR5OyAvKiE8IFNwZWNpZmllcyB0aGUgYWN0aXZlIGVkZ2Ugb2YgdGhlIGlucHV0IHNpZ25hbC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9JbnB1dF9DYXB0dXJlX1BvbGFyaXR5ICovCisKKyAgdWludDMyX3QgSUNTZWxlY3Rpb247IC8qITwgU3BlY2lmaWVzIHRoZSBpbnB1dC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX0lucHV0X0NhcHR1cmVfU2VsZWN0aW9uICovCisKKyAgdWludDMyX3QgSUNQcmVzY2FsZXI7IC8qITwgU3BlY2lmaWVzIHRoZSBJbnB1dCBDYXB0dXJlIFByZXNjYWxlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX0lucHV0X0NhcHR1cmVfUHJlc2NhbGVyICovCisKKyAgdWludDMyX3QgSUNGaWx0ZXI7IC8qITwgU3BlY2lmaWVzIHRoZSBpbnB1dCBjYXB0dXJlIGZpbHRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBNYXhfRGF0YSA9IDB4RiAqLworfSBUSU1fSUNfSW5pdFR5cGVEZWY7CisKKy8qKgorICogQGJyaWVmICBUSU0gRW5jb2RlciBDb25maWd1cmF0aW9uIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDMyX3QgRW5jb2Rlck1vZGU7IC8qITwgU3BlY2lmaWVzIHRoZSBhY3RpdmUgZWRnZSBvZiB0aGUgaW5wdXQgc2lnbmFsLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fRW5jb2Rlcl9Nb2RlICovCisKKyAgdWludDMyX3QgSUMxUG9sYXJpdHk7IC8qITwgU3BlY2lmaWVzIHRoZSBhY3RpdmUgZWRnZSBvZiB0aGUgaW5wdXQgc2lnbmFsLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fRW5jb2Rlcl9JbnB1dF9Qb2xhcml0eSAqLworCisgIHVpbnQzMl90IElDMVNlbGVjdGlvbjsgLyohPCBTcGVjaWZpZXMgdGhlIGlucHV0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9JbnB1dF9DYXB0dXJlX1NlbGVjdGlvbiAqLworCisgIHVpbnQzMl90IElDMVByZXNjYWxlcjsgLyohPCBTcGVjaWZpZXMgdGhlIElucHV0IENhcHR1cmUgUHJlc2NhbGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9JbnB1dF9DYXB0dXJlX1ByZXNjYWxlciAqLworCisgIHVpbnQzMl90IElDMUZpbHRlcjsgLyohPCBTcGVjaWZpZXMgdGhlIGlucHV0IGNhcHR1cmUgZmlsdGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAKKyAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgTWF4X0RhdGEgPSAweEYgKi8KKworICB1aW50MzJfdCBJQzJQb2xhcml0eTsgLyohPCBTcGVjaWZpZXMgdGhlIGFjdGl2ZSBlZGdlIG9mIHRoZSBpbnB1dCBzaWduYWwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9FbmNvZGVyX0lucHV0X1BvbGFyaXR5ICovCisKKyAgdWludDMyX3QgSUMyU2VsZWN0aW9uOyAvKiE8IFNwZWNpZmllcyB0aGUgaW5wdXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fSW5wdXRfQ2FwdHVyZV9TZWxlY3Rpb24gKi8KKworICB1aW50MzJfdCBJQzJQcmVzY2FsZXI7IC8qITwgU3BlY2lmaWVzIHRoZSBJbnB1dCBDYXB0dXJlIFByZXNjYWxlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fSW5wdXRfQ2FwdHVyZV9QcmVzY2FsZXIgKi8KKworICB1aW50MzJfdCBJQzJGaWx0ZXI7IC8qITwgU3BlY2lmaWVzIHRoZSBpbnB1dCBjYXB0dXJlIGZpbHRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwCisgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIE1heF9EYXRhID0gMHhGICovCit9IFRJTV9FbmNvZGVyX0luaXRUeXBlRGVmOworCisvKioKKyAqIEBicmllZiAgQ2xvY2sgQ29uZmlndXJhdGlvbiBIYW5kbGUgU3RydWN0dXJlIGRlZmluaXRpb24KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50MzJfdCBDbG9ja1NvdXJjZTsgICAgLyohPCBUSU0gY2xvY2sgc291cmNlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fQ2xvY2tfU291cmNlICovCisgIHVpbnQzMl90IENsb2NrUG9sYXJpdHk7ICAvKiE8IFRJTSBjbG9jayBwb2xhcml0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fQ2xvY2tfUG9sYXJpdHkgKi8KKyAgdWludDMyX3QgQ2xvY2tQcmVzY2FsZXI7IC8qITwgVElNIGNsb2NrIHByZXNjYWxlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fQ2xvY2tfUHJlc2NhbGVyICovCisgIHVpbnQzMl90IENsb2NrRmlsdGVyOyAgICAvKiE8IFRJTSBjbG9jayBmaWx0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwIGFuZCBNYXhfRGF0YSA9IDB4RiAqLworfSBUSU1fQ2xvY2tDb25maWdUeXBlRGVmOworCisvKioKKyAqIEBicmllZiAgVElNIENsZWFyIElucHV0IENvbmZpZ3VyYXRpb24gSGFuZGxlIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDMyX3QgQ2xlYXJJbnB1dFN0YXRlOyAgICAgLyohPCBUSU0gY2xlYXIgSW5wdXQgc3RhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgRU5BQkxFIG9yIERJU0FCTEUgKi8KKyAgdWludDMyX3QgQ2xlYXJJbnB1dFNvdXJjZTsgICAgLyohPCBUSU0gY2xlYXIgSW5wdXQgc291cmNlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX0NsZWFySW5wdXRfU291cmNlICovCisgIHVpbnQzMl90IENsZWFySW5wdXRQb2xhcml0eTsgIC8qITwgVElNIENsZWFyIElucHV0IHBvbGFyaXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fQ2xlYXJJbnB1dF9Qb2xhcml0eSAqLworICB1aW50MzJfdCBDbGVhcklucHV0UHJlc2NhbGVyOyAvKiE8IFRJTSBDbGVhciBJbnB1dCBwcmVzY2FsZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIDA6IFdoZW4gT0NSZWYgY2xlYXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZSBpcyB1c2VkIHdpdGggRVRSIHNvdXJjZSwgRVRSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNjYWxlciBtdXN0IGJlIG9mZiAqLworICB1aW50MzJfdCBDbGVhcklucHV0RmlsdGVyOyAgICAvKiE8IFRJTSBDbGVhciBJbnB1dCBmaWx0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBudW1iZXIgYmV0d2VlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNaW5fRGF0YSA9IDB4MCBhbmQgTWF4X0RhdGEgPSAweEYgKi8KK30gVElNX0NsZWFySW5wdXRDb25maWdUeXBlRGVmOworCisvKioKKyAqIEBicmllZiAgVElNIE1hc3RlciBjb25maWd1cmF0aW9uIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgKiBAbm90ZSAgIEFkdmFuY2VkIHRpbWVycyBwcm92aWRlIFRSR08yIGludGVybmFsIGxpbmUgd2hpY2ggaXMgcmVkaXJlY3RlZAorICogICAgICAgICB0byB0aGUgQURDCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDMyX3QgTWFzdGVyT3V0cHV0VHJpZ2dlcjsgIC8qITwgVHJpZ2dlciBvdXRwdXQgKFRSR08pIHNlbGVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fTWFzdGVyX01vZGVfU2VsZWN0aW9uICovCisgIHVpbnQzMl90IE1hc3Rlck91dHB1dFRyaWdnZXIyOyAvKiE8IFRyaWdnZXIgb3V0cHV0MiAoVFJHTzIpIHNlbGVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fTWFzdGVyX01vZGVfU2VsZWN0aW9uXzIgKi8KKyAgdWludDMyX3QKKyAgICAgIE1hc3RlclNsYXZlTW9kZTsgLyohPCBNYXN0ZXIvc2xhdmUgbW9kZSBzZWxlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9NYXN0ZXJfU2xhdmVfTW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIFdoZW4gdGhlIE1hc3Rlci9zbGF2ZSBtb2RlIGlzIGVuYWJsZWQsIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3Qgb2YgYW4gZXZlbnQgb24gdGhlIHRyaWdnZXIgaW5wdXQgKFRSR0kpIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5ZWQgdG8gYWxsb3cgYSBwZXJmZWN0IHN5bmNocm9uaXphdGlvbiBiZXR3ZWVuIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IHRpbWVyIGFuZCBpdHMgc2xhdmVzICh0aHJvdWdoIFRSR08pLiBJdCBpcyBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFuZGF0b3J5IGluIGNhc2Ugb2YgdGltZXIgc3luY2hyb25pemF0aW9uIG1vZGUuICovCit9IFRJTV9NYXN0ZXJDb25maWdUeXBlRGVmOworCisvKioKKyAqIEBicmllZiAgVElNIFNsYXZlIGNvbmZpZ3VyYXRpb24gU3RydWN0dXJlIGRlZmluaXRpb24KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50MzJfdAorICAgICAgU2xhdmVNb2RlOyAgICAgICAgICAgICAvKiE8IFNsYXZlIG1vZGUgc2VsZWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fU2xhdmVfTW9kZSAqLworICB1aW50MzJfdCBJbnB1dFRyaWdnZXI7ICAgICAvKiE8IElucHV0IFRyaWdnZXIgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fVHJpZ2dlcl9TZWxlY3Rpb24gKi8KKyAgdWludDMyX3QgVHJpZ2dlclBvbGFyaXR5OyAgLyohPCBJbnB1dCBUcmlnZ2VyIHBvbGFyaXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fVHJpZ2dlcl9Qb2xhcml0eSAqLworICB1aW50MzJfdCBUcmlnZ2VyUHJlc2NhbGVyOyAvKiE8IElucHV0IHRyaWdnZXIgcHJlc2NhbGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fVHJpZ2dlcl9QcmVzY2FsZXIgKi8KKyAgdWludDMyX3QgVHJpZ2dlckZpbHRlcjsgICAgLyohPCBJbnB1dCB0cmlnZ2VyIGZpbHRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwIGFuZCBNYXhfRGF0YSA9IDB4RiAgKi8KKworfSBUSU1fU2xhdmVDb25maWdUeXBlRGVmOworCisvKioKKyAqIEBicmllZiAgVElNIEJyZWFrIGlucHV0KHMpIGFuZCBEZWFkIHRpbWUgY29uZmlndXJhdGlvbiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICogQG5vdGUgICAyIGJyZWFrIGlucHV0cyBjYW4gYmUgY29uZmlndXJlZCAoQktJTiBhbmQgQktJTjIpIHdpdGggY29uZmlndXJhYmxlCisgKiAgICAgICAgZmlsdGVyIGFuZCBwb2xhcml0eS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50MzJfdAorICAgICAgT2ZmU3RhdGVSdW5Nb2RlOyAvKiE8IFRJTSBvZmYgc3RhdGUgaW4gcnVuIG1vZGUsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX09TU1JfT2ZmX1N0YXRlX1NlbGVjdGlvbl9mb3JfUnVuX21vZGVfc3RhdGUgKi8KKworICB1aW50MzJfdAorICAgICAgT2ZmU3RhdGVJRExFTW9kZTsgLyohPCBUSU0gb2ZmIHN0YXRlIGluIElETEUgbW9kZSwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9PU1NJX09mZl9TdGF0ZV9TZWxlY3Rpb25fZm9yX0lkbGVfbW9kZV9zdGF0ZSAqLworCisgIHVpbnQzMl90IExvY2tMZXZlbDsgLyohPCBUSU0gTG9jayBsZXZlbCwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9Mb2NrX2xldmVsICovCisKKyAgdWludDMyX3QgRGVhZFRpbWU7IC8qITwgVElNIGRlYWQgVGltZSwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgbnVtYmVyIGJldHdlZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIE1pbl9EYXRhID0gMHgwMCBhbmQgTWF4X0RhdGEgPSAweEZGICovCisKKyAgdWludDMyX3QgQnJlYWtTdGF0ZTsgLyohPCBUSU0gQnJlYWsgU3RhdGUsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgVElNX0JyZWFrX0lucHV0X2VuYWJsZV9kaXNhYmxlICovCisKKyAgdWludDMyX3QgQnJlYWtQb2xhcml0eTsgLyohPCBUSU0gQnJlYWsgaW5wdXQgcG9sYXJpdHksIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIG9mIEByZWYgVElNX0JyZWFrX1BvbGFyaXR5ICovCisKKyAgdWludDMyX3QKKyAgICAgIEJyZWFrRmlsdGVyOyAvKiE8IFNwZWNpZmllcyB0aGUgYnJlYWsgaW5wdXQgZmlsdGVyLlRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhCisgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAgYW5kIE1heF9EYXRhID0gMHhGICovCisKKyAgdWludDMyX3QgQnJlYWtBRk1vZGU7IC8qITwgU3BlY2lmaWVzIHRoZSBhbHRlcm5hdGUgZnVuY3Rpb24gbW9kZSBvZiB0aGUgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LlRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9CcmVha19JbnB1dF9BRl9Nb2RlICovCisKKyAgdWludDMyX3QgQnJlYWsyU3RhdGU7IC8qITwgVElNIEJyZWFrMiBTdGF0ZSwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgVElNX0JyZWFrMl9JbnB1dF9lbmFibGVfZGlzYWJsZSAqLworCisgIHVpbnQzMl90IEJyZWFrMlBvbGFyaXR5OyAvKiE8IFRJTSBCcmVhazIgaW5wdXQgcG9sYXJpdHksIFRoaXMgcGFyYW1ldGVyIGNhbiBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSB2YWx1ZSBvZiBAcmVmIFRJTV9CcmVhazJfUG9sYXJpdHkgKi8KKworICB1aW50MzJfdCBCcmVhazJGaWx0ZXI7IC8qITwgVElNIGJyZWFrMiBpbnB1dCBmaWx0ZXIuVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MCBhbmQgTWF4X0RhdGEgPSAweEYgKi8KKworICB1aW50MzJfdCBCcmVhazJBRk1vZGU7IC8qITwgU3BlY2lmaWVzIHRoZSBhbHRlcm5hdGUgZnVuY3Rpb24gbW9kZSBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazIgaW5wdXQuVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9CcmVhazJfSW5wdXRfQUZfTW9kZSAqLworCisgIHVpbnQzMl90CisgICAgICBBdXRvbWF0aWNPdXRwdXQ7IC8qITwgVElNIEF1dG9tYXRpYyBPdXRwdXQgRW5hYmxlIHN0YXRlLCBUaGlzIHBhcmFtZXRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9BT0VfQml0X1NldF9SZXNldCAqLworCit9IFRJTV9CcmVha0RlYWRUaW1lQ29uZmlnVHlwZURlZjsKKworLyoqCisgKiBAYnJpZWYgIEhBTCBTdGF0ZSBzdHJ1Y3R1cmVzIGRlZmluaXRpb24KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgSEFMX1RJTV9TVEFURV9SRVNFVCA9CisgICAgICAweDAwVSwgLyohPCBQZXJpcGhlcmFsIG5vdCB5ZXQgaW5pdGlhbGl6ZWQgb3IgZGlzYWJsZWQgICovCisgIEhBTF9USU1fU1RBVEVfUkVBRFkgPSAweDAxVSwgLyohPCBQZXJpcGhlcmFsIEluaXRpYWxpemVkIGFuZCByZWFkeSBmb3IgdXNlICovCisgIEhBTF9USU1fU1RBVEVfQlVTWSA9IDB4MDJVLCAgLyohPCBBbiBpbnRlcm5hbCBwcm9jZXNzIGlzIG9uZ29pbmcgICovCisgIEhBTF9USU1fU1RBVEVfVElNRU9VVCA9IDB4MDNVLCAvKiE8IFRpbWVvdXQgc3RhdGUgKi8KKyAgSEFMX1RJTV9TVEFURV9FUlJPUiA9IDB4MDRVICAgIC8qITwgUmVjZXB0aW9uIHByb2Nlc3MgaXMgb25nb2luZyAgICAqLworfSBIQUxfVElNX1N0YXRlVHlwZURlZjsKKworLyoqCisgKiBAYnJpZWYgIFRJTSBDaGFubmVsIFN0YXRlcyBkZWZpbml0aW9uCisgKi8KK3R5cGVkZWYgZW51bSB7CisgIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRVNFVCA9IDB4MDBVLCAvKiE8IFRJTSBDaGFubmVsIGluaXRpYWwgc3RhdGUgKi8KKyAgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZID0gMHgwMVUsIC8qITwgVElNIENoYW5uZWwgcmVhZHkgZm9yIHVzZSAqLworICBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSA9CisgICAgICAweDAyVSwgLyohPCBBbiBpbnRlcm5hbCBwcm9jZXNzIGlzIG9uZ29pbmcgb24gdGhlIFRJTSBjaGFubmVsICovCit9IEhBTF9USU1fQ2hhbm5lbFN0YXRlVHlwZURlZjsKKworLyoqCisgKiBAYnJpZWYgIERNQSBCdXJzdCBTdGF0ZXMgZGVmaW5pdGlvbgorICovCit0eXBlZGVmIGVudW0geworICBIQUxfRE1BX0JVUlNUX1NUQVRFX1JFU0VUID0gMHgwMFUsIC8qITwgRE1BIEJ1cnN0IGluaXRpYWwgc3RhdGUgKi8KKyAgSEFMX0RNQV9CVVJTVF9TVEFURV9SRUFEWSA9IDB4MDFVLCAvKiE8IERNQSBCdXJzdCByZWFkeSBmb3IgdXNlICovCisgIEhBTF9ETUFfQlVSU1RfU1RBVEVfQlVTWSA9IDB4MDJVLCAgLyohPCBPbmdvaW5nIERNQSBCdXJzdCAgICAgICAqLworfSBIQUxfVElNX0RNQUJ1cnN0U3RhdGVUeXBlRGVmOworCisvKioKKyAqIEBicmllZiAgSEFMIEFjdGl2ZSBjaGFubmVsIHN0cnVjdHVyZXMgZGVmaW5pdGlvbgorICovCit0eXBlZGVmIGVudW0geworICBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzEgPSAweDAxVSwgICAgICAvKiE8IFRoZSBhY3RpdmUgY2hhbm5lbCBpcyAxICAgICAqLworICBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzIgPSAweDAyVSwgICAgICAvKiE8IFRoZSBhY3RpdmUgY2hhbm5lbCBpcyAyICAgICAqLworICBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzMgPSAweDA0VSwgICAgICAvKiE8IFRoZSBhY3RpdmUgY2hhbm5lbCBpcyAzICAgICAqLworICBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzQgPSAweDA4VSwgICAgICAvKiE8IFRoZSBhY3RpdmUgY2hhbm5lbCBpcyA0ICAgICAqLworICBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzUgPSAweDEwVSwgICAgICAvKiE8IFRoZSBhY3RpdmUgY2hhbm5lbCBpcyA1ICAgICAqLworICBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzYgPSAweDIwVSwgICAgICAvKiE8IFRoZSBhY3RpdmUgY2hhbm5lbCBpcyA2ICAgICAqLworICBIQUxfVElNX0FDVElWRV9DSEFOTkVMX0NMRUFSRUQgPSAweDAwVSAvKiE8IEFsbCBhY3RpdmUgY2hhbm5lbHMgY2xlYXJlZCAqLworfSBIQUxfVElNX0FjdGl2ZUNoYW5uZWw7CisKKy8qKgorICogQGJyaWVmICBUSU0gVGltZSBCYXNlIEhhbmRsZSBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICovCisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQordHlwZWRlZiBzdHJ1Y3QgX19USU1fSGFuZGxlVHlwZURlZgorI2Vsc2UKK3R5cGVkZWYgc3RydWN0CisjZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCit7CisgIFRJTV9UeXBlRGVmICpJbnN0YW5jZTsgICAgICAgICAvKiE8IFJlZ2lzdGVyIGJhc2UgYWRkcmVzcyAgICAgICAgICovCisgIFRJTV9CYXNlX0luaXRUeXBlRGVmIEluaXQ7ICAgICAvKiE8IFRJTSBUaW1lIEJhc2UgcmVxdWlyZWQgcGFyYW1ldGVycyAgICAgKi8KKyAgSEFMX1RJTV9BY3RpdmVDaGFubmVsIENoYW5uZWw7IC8qITwgQWN0aXZlIGNoYW5uZWwgKi8KKyAgRE1BX0hhbmRsZVR5cGVEZWYKKyAgICAgICpoZG1hWzddOyAgICAgICAgICAgICAgICAgICAgLyohPCBETUEgSGFuZGxlcnMgYXJyYXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGFycmF5IGlzIGFjY2Vzc2VkIGJ5IGEgQHJlZiBETUFfSGFuZGxlX2luZGV4ICovCisgIEhBTF9Mb2NrVHlwZURlZiBMb2NrOyAgICAgICAgICAgIC8qITwgTG9ja2luZyBvYmplY3QgICAgICAgICAgICAqLworICBfX0lPIEhBTF9USU1fU3RhdGVUeXBlRGVmIFN0YXRlOyAvKiE8IFRJTSBvcGVyYXRpb24gc3RhdGUgKi8KKyAgX19JTyBIQUxfVElNX0NoYW5uZWxTdGF0ZVR5cGVEZWYKKyAgICAgIENoYW5uZWxTdGF0ZVs2XTsgLyohPCBUSU0gY2hhbm5lbCBvcGVyYXRpb24gc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICovCisgIF9fSU8gSEFMX1RJTV9DaGFubmVsU3RhdGVUeXBlRGVmCisgICAgICBDaGFubmVsTlN0YXRlWzRdOyAvKiE8IFRJTSBjb21wbGVtZW50YXJ5IGNoYW5uZWwgb3BlcmF0aW9uIHN0YXRlICovCisgIF9fSU8gSEFMX1RJTV9ETUFCdXJzdFN0YXRlVHlwZURlZgorICAgICAgRE1BQnVyc3RTdGF0ZTsgLyohPCBETUEgYnVyc3Qgb3BlcmF0aW9uIHN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIHZvaWQgKCpCYXNlX01zcEluaXRDYWxsYmFjaykoCisgICAgICBzdHJ1Y3QgX19USU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7IC8qITwgVElNIEJhc2UgTXNwIEluaXQgQ2FsbGJhY2sgKi8KKyAgdm9pZCAoKkJhc2VfTXNwRGVJbml0Q2FsbGJhY2spKAorICAgICAgc3RydWN0IF9fVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOyAvKiE8IFRJTSBCYXNlIE1zcCBEZUluaXQgQ2FsbGJhY2sgKi8KKyAgdm9pZCAoKklDX01zcEluaXRDYWxsYmFjaykoCisgICAgICBzdHJ1Y3QgX19USU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7IC8qITwgVElNIElDIE1zcCBJbml0IENhbGxiYWNrICovCisgIHZvaWQgKCpJQ19Nc3BEZUluaXRDYWxsYmFjaykoCisgICAgICBzdHJ1Y3QgX19USU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7IC8qITwgVElNIElDIE1zcCBEZUluaXQgQ2FsbGJhY2sgKi8KKyAgdm9pZCAoKk9DX01zcEluaXRDYWxsYmFjaykoCisgICAgICBzdHJ1Y3QgX19USU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7IC8qITwgVElNIE9DIE1zcCBJbml0IENhbGxiYWNrICovCisgIHZvaWQgKCpPQ19Nc3BEZUluaXRDYWxsYmFjaykoCisgICAgICBzdHJ1Y3QgX19USU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7IC8qITwgVElNIE9DIE1zcCBEZUluaXQgQ2FsbGJhY2sgKi8KKyAgdm9pZCAoKlBXTV9Nc3BJbml0Q2FsbGJhY2spKAorICAgICAgc3RydWN0IF9fVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOyAvKiE8IFRJTSBQV00gTXNwIEluaXQgQ2FsbGJhY2sgKi8KKyAgdm9pZCAoKlBXTV9Nc3BEZUluaXRDYWxsYmFjaykoCisgICAgICBzdHJ1Y3QgX19USU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7IC8qITwgVElNIFBXTSBNc3AgRGVJbml0IENhbGxiYWNrICovCisgIHZvaWQgKCpPbmVQdWxzZV9Nc3BJbml0Q2FsbGJhY2spKAorICAgICAgc3RydWN0IF9fVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOyAvKiE8IFRJTSBPbmUgUHVsc2UgTXNwIEluaXQgQ2FsbGJhY2sgKi8KKyAgdm9pZCAoKk9uZVB1bHNlX01zcERlSW5pdENhbGxiYWNrKSgKKyAgICAgIHN0cnVjdCBfX1RJTV9IYW5kbGVUeXBlRGVmCisgICAgICAgICAgKmh0aW0pOyAvKiE8IFRJTSBPbmUgUHVsc2UgTXNwIERlSW5pdCBDYWxsYmFjayAqLworICB2b2lkICgqRW5jb2Rlcl9Nc3BJbml0Q2FsbGJhY2spKAorICAgICAgc3RydWN0IF9fVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOyAvKiE8IFRJTSBFbmNvZGVyIE1zcCBJbml0IENhbGxiYWNrICovCisgIHZvaWQgKCpFbmNvZGVyX01zcERlSW5pdENhbGxiYWNrKSgKKyAgICAgIHN0cnVjdCBfX1RJTV9IYW5kbGVUeXBlRGVmICpodGltKTsgLyohPCBUSU0gRW5jb2RlciBNc3AgRGVJbml0IENhbGxiYWNrICovCisgIHZvaWQgKCpIYWxsU2Vuc29yX01zcEluaXRDYWxsYmFjaykoCisgICAgICBzdHJ1Y3QgX19USU1fSGFuZGxlVHlwZURlZgorICAgICAgICAgICpodGltKTsgLyohPCBUSU0gSGFsbCBTZW5zb3IgTXNwIEluaXQgQ2FsbGJhY2sgKi8KKyAgdm9pZCAoKkhhbGxTZW5zb3JfTXNwRGVJbml0Q2FsbGJhY2spKAorICAgICAgc3RydWN0IF9fVElNX0hhbmRsZVR5cGVEZWYKKyAgICAgICAgICAqaHRpbSk7IC8qITwgVElNIEhhbGwgU2Vuc29yIE1zcCBEZUluaXQgQ2FsbGJhY2sgKi8KKyAgdm9pZCAoKlBlcmlvZEVsYXBzZWRDYWxsYmFjaykoCisgICAgICBzdHJ1Y3QgX19USU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7IC8qITwgVElNIFBlcmlvZCBFbGFwc2VkIENhbGxiYWNrICovCisgIHZvaWQgKCpQZXJpb2RFbGFwc2VkSGFsZkNwbHRDYWxsYmFjaykoCisgICAgICBzdHJ1Y3QgX19USU1fSGFuZGxlVHlwZURlZgorICAgICAgICAgICpodGltKTsgLyohPCBUSU0gUGVyaW9kIEVsYXBzZWQgaGFsZiBjb21wbGV0ZSBDYWxsYmFjayAqLworICB2b2lkICgqVHJpZ2dlckNhbGxiYWNrKSgKKyAgICAgIHN0cnVjdCBfX1RJTV9IYW5kbGVUeXBlRGVmICpodGltKTsgLyohPCBUSU0gVHJpZ2dlciBDYWxsYmFjayAqLworICB2b2lkICgqVHJpZ2dlckhhbGZDcGx0Q2FsbGJhY2spKAorICAgICAgc3RydWN0IF9fVElNX0hhbmRsZVR5cGVEZWYKKyAgICAgICAgICAqaHRpbSk7IC8qITwgVElNIFRyaWdnZXIgaGFsZiBjb21wbGV0ZSBDYWxsYmFjayAqLworICB2b2lkICgqSUNfQ2FwdHVyZUNhbGxiYWNrKSgKKyAgICAgIHN0cnVjdCBfX1RJTV9IYW5kbGVUeXBlRGVmICpodGltKTsgLyohPCBUSU0gSW5wdXQgQ2FwdHVyZSBDYWxsYmFjayAqLworICB2b2lkICgqSUNfQ2FwdHVyZUhhbGZDcGx0Q2FsbGJhY2spKAorICAgICAgc3RydWN0IF9fVElNX0hhbmRsZVR5cGVEZWYKKyAgICAgICAgICAqaHRpbSk7IC8qITwgVElNIElucHV0IENhcHR1cmUgaGFsZiBjb21wbGV0ZSBDYWxsYmFjayAqLworICB2b2lkICgqT0NfRGVsYXlFbGFwc2VkQ2FsbGJhY2spKAorICAgICAgc3RydWN0IF9fVElNX0hhbmRsZVR5cGVEZWYKKyAgICAgICAgICAqaHRpbSk7IC8qITwgVElNIE91dHB1dCBDb21wYXJlIERlbGF5IEVsYXBzZWQgQ2FsbGJhY2sgKi8KKyAgdm9pZCAoKlBXTV9QdWxzZUZpbmlzaGVkQ2FsbGJhY2spKAorICAgICAgc3RydWN0IF9fVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOyAvKiE8IFRJTSBQV00gUHVsc2UgRmluaXNoZWQgQ2FsbGJhY2sgKi8KKyAgdm9pZCAoKlBXTV9QdWxzZUZpbmlzaGVkSGFsZkNwbHRDYWxsYmFjaykoCisgICAgICBzdHJ1Y3QgX19USU1fSGFuZGxlVHlwZURlZgorICAgICAgICAgICpodGltKTsgLyohPCBUSU0gUFdNIFB1bHNlIEZpbmlzaGVkIGhhbGYgY29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgdm9pZCAoKkVycm9yQ2FsbGJhY2spKAorICAgICAgc3RydWN0IF9fVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOyAvKiE8IFRJTSBFcnJvciBDYWxsYmFjayAqLworICB2b2lkICgqQ29tbXV0YXRpb25DYWxsYmFjaykoCisgICAgICBzdHJ1Y3QgX19USU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7IC8qITwgVElNIENvbW11dGF0aW9uIENhbGxiYWNrICovCisgIHZvaWQgKCpDb21tdXRhdGlvbkhhbGZDcGx0Q2FsbGJhY2spKAorICAgICAgc3RydWN0IF9fVElNX0hhbmRsZVR5cGVEZWYKKyAgICAgICAgICAqaHRpbSk7IC8qITwgVElNIENvbW11dGF0aW9uIGhhbGYgY29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgdm9pZCAoKkJyZWFrQ2FsbGJhY2spKAorICAgICAgc3RydWN0IF9fVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOyAvKiE8IFRJTSBCcmVhayBDYWxsYmFjayAqLworICB2b2lkICgqQnJlYWsyQ2FsbGJhY2spKAorICAgICAgc3RydWN0IF9fVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOyAvKiE8IFRJTSBCcmVhazIgQ2FsbGJhY2sgKi8KKyAgdm9pZCAoKkVuY29kZXJJbmRleENhbGxiYWNrKSgKKyAgICAgIHN0cnVjdCBfX1RJTV9IYW5kbGVUeXBlRGVmICpodGltKTsgLyohPCBUSU0gRW5jb2RlciBJbmRleCBDYWxsYmFjayAqLworICB2b2lkICgqRGlyZWN0aW9uQ2hhbmdlQ2FsbGJhY2spKAorICAgICAgc3RydWN0IF9fVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOyAvKiE8IFRJTSBEaXJlY3Rpb24gQ2hhbmdlIENhbGxiYWNrICovCisgIHZvaWQgKCpJbmRleEVycm9yQ2FsbGJhY2spKAorICAgICAgc3RydWN0IF9fVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOyAvKiE8IFRJTSBJbmRleCBFcnJvciBDYWxsYmFjayAqLworICB2b2lkICgqVHJhbnNpdGlvbkVycm9yQ2FsbGJhY2spKAorICAgICAgc3RydWN0IF9fVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOyAvKiE8IFRJTSBUcmFuc2l0aW9uIEVycm9yIENhbGxiYWNrICovCisjZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfSBUSU1fSGFuZGxlVHlwZURlZjsKKworI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKy8qKgorICogQGJyaWVmICBIQUwgVElNIENhbGxiYWNrIElEIGVudW1lcmF0aW9uIGRlZmluaXRpb24KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgSEFMX1RJTV9CQVNFX01TUElOSVRfQ0JfSUQgPSAweDAwVSAvKiE8IFRJTSBCYXNlIE1zcEluaXQgQ2FsbGJhY2sgSUQgKi8KKyAgLAorICBIQUxfVElNX0JBU0VfTVNQREVJTklUX0NCX0lEID0gMHgwMVUgLyohPCBUSU0gQmFzZSBNc3BEZUluaXQgQ2FsbGJhY2sgSUQgKi8KKyAgLAorICBIQUxfVElNX0lDX01TUElOSVRfQ0JfSUQgPSAweDAyVSAvKiE8IFRJTSBJQyBNc3BJbml0IENhbGxiYWNrIElEICovCisgICwKKyAgSEFMX1RJTV9JQ19NU1BERUlOSVRfQ0JfSUQgPSAweDAzVSAvKiE8IFRJTSBJQyBNc3BEZUluaXQgQ2FsbGJhY2sgSUQgKi8KKyAgLAorICBIQUxfVElNX09DX01TUElOSVRfQ0JfSUQgPSAweDA0VSAvKiE8IFRJTSBPQyBNc3BJbml0IENhbGxiYWNrIElEICovCisgICwKKyAgSEFMX1RJTV9PQ19NU1BERUlOSVRfQ0JfSUQgPSAweDA1VSAvKiE8IFRJTSBPQyBNc3BEZUluaXQgQ2FsbGJhY2sgSUQgKi8KKyAgLAorICBIQUxfVElNX1BXTV9NU1BJTklUX0NCX0lEID0gMHgwNlUgLyohPCBUSU0gUFdNIE1zcEluaXQgQ2FsbGJhY2sgSUQgKi8KKyAgLAorICBIQUxfVElNX1BXTV9NU1BERUlOSVRfQ0JfSUQgPSAweDA3VSAvKiE8IFRJTSBQV00gTXNwRGVJbml0IENhbGxiYWNrIElEICovCisgICwKKyAgSEFMX1RJTV9PTkVfUFVMU0VfTVNQSU5JVF9DQl9JRCA9CisgICAgICAweDA4VSAvKiE8IFRJTSBPbmUgUHVsc2UgTXNwSW5pdCBDYWxsYmFjayBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLAorICBIQUxfVElNX09ORV9QVUxTRV9NU1BERUlOSVRfQ0JfSUQgPQorICAgICAgMHgwOVUgLyohPCBUSU0gT25lIFB1bHNlIE1zcERlSW5pdCBDYWxsYmFjayBJRCAgICAgICAgICAgICAgICAgICAgICAgICovCisgICwKKyAgSEFMX1RJTV9FTkNPREVSX01TUElOSVRfQ0JfSUQgPSAweDBBVSAvKiE8IFRJTSBFbmNvZGVyIE1zcEluaXQgQ2FsbGJhY2sgSUQgKi8KKyAgLAorICBIQUxfVElNX0VOQ09ERVJfTVNQREVJTklUX0NCX0lEID0KKyAgICAgIDB4MEJVIC8qITwgVElNIEVuY29kZXIgTXNwRGVJbml0IENhbGxiYWNrIElEICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAsCisgIEhBTF9USU1fSEFMTF9TRU5TT1JfTVNQSU5JVF9DQl9JRCA9CisgICAgICAweDBDVSAvKiE8IFRJTSBIYWxsIFNlbnNvciBNc3BEZUluaXQgQ2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLAorICBIQUxfVElNX0hBTExfU0VOU09SX01TUERFSU5JVF9DQl9JRCA9CisgICAgICAweDBEVSAvKiE8IFRJTSBIYWxsIFNlbnNvciBNc3BEZUluaXQgQ2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLAorICBIQUxfVElNX1BFUklPRF9FTEFQU0VEX0NCX0lEID0gMHgwRVUgLyohPCBUSU0gUGVyaW9kIEVsYXBzZWQgQ2FsbGJhY2sgSUQgKi8KKyAgLAorICBIQUxfVElNX1BFUklPRF9FTEFQU0VEX0hBTEZfQ0JfSUQgPQorICAgICAgMHgwRlUgLyohPCBUSU0gUGVyaW9kIEVsYXBzZWQgaGFsZiBjb21wbGV0ZSBDYWxsYmFjayBJRCAgICAgICAgICAgICAgICovCisgICwKKyAgSEFMX1RJTV9UUklHR0VSX0NCX0lEID0gMHgxMFUgLyohPCBUSU0gVHJpZ2dlciBDYWxsYmFjayBJRCAqLworICAsCisgIEhBTF9USU1fVFJJR0dFUl9IQUxGX0NCX0lEID0KKyAgICAgIDB4MTFVIC8qITwgVElNIFRyaWdnZXIgaGFsZiBjb21wbGV0ZSBDYWxsYmFjayBJRCAgICAgICAgICAgICAgICAgICAgICAqLworICAsCisgIEhBTF9USU1fSUNfQ0FQVFVSRV9DQl9JRCA9IDB4MTJVIC8qITwgVElNIElucHV0IENhcHR1cmUgQ2FsbGJhY2sgSUQgKi8KKyAgLAorICBIQUxfVElNX0lDX0NBUFRVUkVfSEFMRl9DQl9JRCA9CisgICAgICAweDEzVSAvKiE8IFRJTSBJbnB1dCBDYXB0dXJlIGhhbGYgY29tcGxldGUgQ2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgKi8KKyAgLAorICBIQUxfVElNX09DX0RFTEFZX0VMQVBTRURfQ0JfSUQgPQorICAgICAgMHgxNFUgLyohPCBUSU0gT3V0cHV0IENvbXBhcmUgRGVsYXkgRWxhcHNlZCBDYWxsYmFjayBJRCAgICAgICAgICAgICAgICovCisgICwKKyAgSEFMX1RJTV9QV01fUFVMU0VfRklOSVNIRURfQ0JfSUQgPQorICAgICAgMHgxNVUgLyohPCBUSU0gUFdNIFB1bHNlIEZpbmlzaGVkIENhbGxiYWNrIElEICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICwKKyAgSEFMX1RJTV9QV01fUFVMU0VfRklOSVNIRURfSEFMRl9DQl9JRCA9CisgICAgICAweDE2VSAvKiE8IFRJTSBQV00gUHVsc2UgRmluaXNoZWQgaGFsZiBjb21wbGV0ZSBDYWxsYmFjayBJRCAgICAgICAgICAgKi8KKyAgLAorICBIQUxfVElNX0VSUk9SX0NCX0lEID0gMHgxN1UgLyohPCBUSU0gRXJyb3IgQ2FsbGJhY2sgSUQgKi8KKyAgLAorICBIQUxfVElNX0NPTU1VVEFUSU9OX0NCX0lEID0gMHgxOFUgLyohPCBUSU0gQ29tbXV0YXRpb24gQ2FsbGJhY2sgSUQgKi8KKyAgLAorICBIQUxfVElNX0NPTU1VVEFUSU9OX0hBTEZfQ0JfSUQgPQorICAgICAgMHgxOVUgLyohPCBUSU0gQ29tbXV0YXRpb24gaGFsZiBjb21wbGV0ZSBDYWxsYmFjayBJRCAgICAgICAgICAgICAgICAgICovCisgICwKKyAgSEFMX1RJTV9CUkVBS19DQl9JRCA9IDB4MUFVIC8qITwgVElNIEJyZWFrIENhbGxiYWNrIElEICovCisgICwKKyAgSEFMX1RJTV9CUkVBSzJfQ0JfSUQgPSAweDFCVSAvKiE8IFRJTSBCcmVhazIgQ2FsbGJhY2sgSUQgKi8KKyAgLAorICBIQUxfVElNX0VOQ09ERVJfSU5ERVhfQ0JfSUQgPSAweDFDVSAvKiE8IFRJTSBFbmNvZGVyIEluZGV4IENhbGxiYWNrIElEICovCisgICwKKyAgSEFMX1RJTV9ESVJFQ1RJT05fQ0hBTkdFX0NCX0lEID0KKyAgICAgIDB4MURVIC8qITwgVElNIERpcmVjdGlvbiBDaGFuZ2UgQ2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAsCisgIEhBTF9USU1fSU5ERVhfRVJST1JfQ0JfSUQgPSAweDFFVSAvKiE8IFRJTSBJbmRleCBFcnJvciBDYWxsYmFjayBJRCAqLworICAsCisgIEhBTF9USU1fVFJBTlNJVElPTl9FUlJPUl9DQl9JRCA9CisgICAgICAweDFGVSAvKiE8IFRJTSBUcmFuc2l0aW9uIEVycm9yIENhbGxiYWNrIElEICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK30gSEFMX1RJTV9DYWxsYmFja0lEVHlwZURlZjsKKworLyoqCisgKiBAYnJpZWYgIEhBTCBUSU0gQ2FsbGJhY2sgcG9pbnRlciBkZWZpbml0aW9uCisgKi8KK3R5cGVkZWYgdm9pZCAoKnBUSU1fQ2FsbGJhY2tUeXBlRGVmKSgKKyAgICBUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7IC8qITwgcG9pbnRlciB0byB0aGUgVElNIGNhbGxiYWNrIGZ1bmN0aW9uICovCisKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqCisgKiBAfQorICovCisvKiBFbmQgb2YgZXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBUSU1fRXhwb3J0ZWRfQ29uc3RhbnRzIFRJTSBFeHBvcnRlZCBDb25zdGFudHMKKyAqIEB7CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1fQ2xlYXJJbnB1dF9Tb3VyY2UgVElNIENsZWFyIElucHV0IFNvdXJjZQorICogQHsKKyAqLworI2RlZmluZSBUSU1fQ0xFQVJJTlBVVFNPVVJDRV9OT05FIDB4RkZGRkZGRkZVIC8qITwgT0NSRUZfQ0xSIGlzIGRpc2FibGVkICovCisjZGVmaW5lIFRJTV9DTEVBUklOUFVUU09VUkNFX0VUUiBcCisgIDB4MDAwMDAwMDFVIC8qITwgT0NSRUZfQ0xSIGlzIGNvbm5lY3RlZCB0byBFVFJGIGlucHV0ICovCisjZGVmaW5lIFRJTV9DTEVBUklOUFVUU09VUkNFX0NPTVAxIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBPQ1JFRl9DTFJfSU5UIGlzIGNvbm5lY3RlZCB0byBDT01QMSBvdXRwdXQgKi8KKyNkZWZpbmUgVElNX0NMRUFSSU5QVVRTT1VSQ0VfQ09NUDIgXAorICBUSU0xX0FGMl9PQ1JTRUxfMCAvKiE8IE9DUkVGX0NMUl9JTlQgaXMgY29ubmVjdGVkIHRvIENPTVAyIG91dHB1dCAqLworI2RlZmluZSBUSU1fQ0xFQVJJTlBVVFNPVVJDRV9DT01QMyBcCisgIFRJTTFfQUYyX09DUlNFTF8xIC8qITwgT0NSRUZfQ0xSX0lOVCBpcyBjb25uZWN0ZWQgdG8gQ09NUDMgb3V0cHV0ICovCisjZGVmaW5lIFRJTV9DTEVBUklOUFVUU09VUkNFX0NPTVA0IFwKKyAgKFRJTTFfQUYyX09DUlNFTF8xIHwgICAgICAgICAgICAgXAorICAgVElNMV9BRjJfT0NSU0VMXzApIC8qITwgT0NSRUZfQ0xSX0lOVCBpcyBjb25uZWN0ZWQgdG8gQ09NUDQgb3V0cHV0ICovCisjaWYgZGVmaW5lZChDT01QNSkKKyNkZWZpbmUgVElNX0NMRUFSSU5QVVRTT1VSQ0VfQ09NUDUgXAorICBUSU0xX0FGMl9PQ1JTRUxfMiAvKiE8IE9DUkVGX0NMUl9JTlQgaXMgY29ubmVjdGVkIHRvIENPTVA1IG91dHB1dCAqLworI2VuZGlmICAgICAgICAgICAgICAvKiBDT01QNSAqLworI2lmIGRlZmluZWQoQ09NUDYpCisjZGVmaW5lIFRJTV9DTEVBUklOUFVUU09VUkNFX0NPTVA2IFwKKyAgKFRJTTFfQUYyX09DUlNFTF8yIHwgICAgICAgICAgICAgXAorICAgVElNMV9BRjJfT0NSU0VMXzApIC8qITwgT0NSRUZfQ0xSX0lOVCBpcyBjb25uZWN0ZWQgdG8gQ09NUDYgb3V0cHV0ICovCisjZW5kaWYgICAgICAgICAgICAgICAgLyogQ09NUDYgKi8KKyNpZiBkZWZpbmVkKENPTVA3KQorI2RlZmluZSBUSU1fQ0xFQVJJTlBVVFNPVVJDRV9DT01QNyBcCisgIChUSU0xX0FGMl9PQ1JTRUxfMiB8ICAgICAgICAgICAgIFwKKyAgIFRJTTFfQUYyX09DUlNFTF8xKSAvKiE8IE9DUkVGX0NMUl9JTlQgaXMgY29ubmVjdGVkIHRvIENPTVA3IG91dHB1dCAqLworI2VuZGlmICAgICAgICAgICAgICAgIC8qIENPTVA3ICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1fRE1BX0Jhc2VfYWRkcmVzcyBUSU0gRE1BIEJhc2UgQWRkcmVzcworICogQHsKKyAqLworI2RlZmluZSBUSU1fRE1BQkFTRV9DUjEgMHgwMDAwMDAwMFUKKyNkZWZpbmUgVElNX0RNQUJBU0VfQ1IyIDB4MDAwMDAwMDFVCisjZGVmaW5lIFRJTV9ETUFCQVNFX1NNQ1IgMHgwMDAwMDAwMlUKKyNkZWZpbmUgVElNX0RNQUJBU0VfRElFUiAweDAwMDAwMDAzVQorI2RlZmluZSBUSU1fRE1BQkFTRV9TUiAweDAwMDAwMDA0VQorI2RlZmluZSBUSU1fRE1BQkFTRV9FR1IgMHgwMDAwMDAwNVUKKyNkZWZpbmUgVElNX0RNQUJBU0VfQ0NNUjEgMHgwMDAwMDAwNlUKKyNkZWZpbmUgVElNX0RNQUJBU0VfQ0NNUjIgMHgwMDAwMDAwN1UKKyNkZWZpbmUgVElNX0RNQUJBU0VfQ0NFUiAweDAwMDAwMDA4VQorI2RlZmluZSBUSU1fRE1BQkFTRV9DTlQgMHgwMDAwMDAwOVUKKyNkZWZpbmUgVElNX0RNQUJBU0VfUFNDIDB4MDAwMDAwMEFVCisjZGVmaW5lIFRJTV9ETUFCQVNFX0FSUiAweDAwMDAwMDBCVQorI2RlZmluZSBUSU1fRE1BQkFTRV9SQ1IgMHgwMDAwMDAwQ1UKKyNkZWZpbmUgVElNX0RNQUJBU0VfQ0NSMSAweDAwMDAwMDBEVQorI2RlZmluZSBUSU1fRE1BQkFTRV9DQ1IyIDB4MDAwMDAwMEVVCisjZGVmaW5lIFRJTV9ETUFCQVNFX0NDUjMgMHgwMDAwMDAwRlUKKyNkZWZpbmUgVElNX0RNQUJBU0VfQ0NSNCAweDAwMDAwMDEwVQorI2RlZmluZSBUSU1fRE1BQkFTRV9CRFRSIDB4MDAwMDAwMTFVCisjZGVmaW5lIFRJTV9ETUFCQVNFX0NDUjUgMHgwMDAwMDAxMlUKKyNkZWZpbmUgVElNX0RNQUJBU0VfQ0NSNiAweDAwMDAwMDEzVQorI2RlZmluZSBUSU1fRE1BQkFTRV9DQ01SMyAweDAwMDAwMDE0VQorI2RlZmluZSBUSU1fRE1BQkFTRV9EVFIyIDB4MDAwMDAwMTVVCisjZGVmaW5lIFRJTV9ETUFCQVNFX0VDUiAweDAwMDAwMDE2VQorI2RlZmluZSBUSU1fRE1BQkFTRV9USVNFTCAweDAwMDAwMDE3VQorI2RlZmluZSBUSU1fRE1BQkFTRV9BRjEgMHgwMDAwMDAxOFUKKyNkZWZpbmUgVElNX0RNQUJBU0VfQUYyIDB4MDAwMDAwMTlVCisjZGVmaW5lIFRJTV9ETUFCQVNFX09SIDB4MDAwMDAwMUFVCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1fRXZlbnRfU291cmNlIFRJTSBFdmVudCBTb3VyY2UKKyAqIEB7CisgKi8KKyNkZWZpbmUgVElNX0VWRU5UU09VUkNFX1VQREFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUSU1fRUdSX1VHIC8qITwgUmVpbml0aWFsaXplIHRoZSBjb3VudGVyIGFuZCBnZW5lcmF0ZXMgYW4gdXBkYXRlIG9mIHRoZSBcCisgICAgICAgICAgICAgICAgcmVnaXN0ZXJzICovCisjZGVmaW5lIFRJTV9FVkVOVFNPVVJDRV9DQzEgXAorICBUSU1fRUdSX0NDMUcgLyohPCBBIGNhcHR1cmUvY29tcGFyZSBldmVudCBpcyBnZW5lcmF0ZWQgb24gY2hhbm5lbCAxICovCisjZGVmaW5lIFRJTV9FVkVOVFNPVVJDRV9DQzIgXAorICBUSU1fRUdSX0NDMkcgLyohPCBBIGNhcHR1cmUvY29tcGFyZSBldmVudCBpcyBnZW5lcmF0ZWQgb24gY2hhbm5lbCAyICovCisjZGVmaW5lIFRJTV9FVkVOVFNPVVJDRV9DQzMgXAorICBUSU1fRUdSX0NDM0cgLyohPCBBIGNhcHR1cmUvY29tcGFyZSBldmVudCBpcyBnZW5lcmF0ZWQgb24gY2hhbm5lbCAzICovCisjZGVmaW5lIFRJTV9FVkVOVFNPVVJDRV9DQzQgXAorICBUSU1fRUdSX0NDNEcgLyohPCBBIGNhcHR1cmUvY29tcGFyZSBldmVudCBpcyBnZW5lcmF0ZWQgb24gY2hhbm5lbCA0ICovCisjZGVmaW5lIFRJTV9FVkVOVFNPVVJDRV9DT00gXAorICBUSU1fRUdSX0NPTUcgLyohPCBBIGNvbW11dGF0aW9uIGV2ZW50IGlzIGdlbmVyYXRlZCAqLworI2RlZmluZSBUSU1fRVZFTlRTT1VSQ0VfVFJJR0dFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUSU1fRUdSX1RHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEEgdHJpZ2dlciBldmVudCBpcyBnZW5lcmF0ZWQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX0VWRU5UU09VUkNFX0JSRUFLIFRJTV9FR1JfQkcgLyohPCBBIGJyZWFrIGV2ZW50IGlzIGdlbmVyYXRlZCAqLworI2RlZmluZSBUSU1fRVZFTlRTT1VSQ0VfQlJFQUsyICAgICAgICAgICAgICAgICAgXAorICBUSU1fRUdSX0IyRyAvKiE8IEEgYnJlYWsgMiBldmVudCBpcyBnZW5lcmF0ZWQgXAorICAgICAgICAgICAgICAgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFRJTV9JbnB1dF9DaGFubmVsX1BvbGFyaXR5IFRJTSBJbnB1dCBDaGFubmVsIHBvbGFyaXR5CisgKiBAeworICovCisjZGVmaW5lIFRJTV9JTlBVVENIQU5ORUxQT0xBUklUWV9SSVNJTkcgXAorICAweDAwMDAwMDAwVSAvKiE8IFBvbGFyaXR5IGZvciBUSXggc291cmNlICovCisjZGVmaW5lIFRJTV9JTlBVVENIQU5ORUxQT0xBUklUWV9GQUxMSU5HIFwKKyAgVElNX0NDRVJfQ0MxUCAvKiE8IFBvbGFyaXR5IGZvciBUSXggc291cmNlICovCisjZGVmaW5lIFRJTV9JTlBVVENIQU5ORUxQT0xBUklUWV9CT1RIRURHRSBcCisgIChUSU1fQ0NFUl9DQzFQIHwgVElNX0NDRVJfQ0MxTlApIC8qITwgUG9sYXJpdHkgZm9yIFRJeCBzb3VyY2UgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFRJTV9FVFJfUG9sYXJpdHkgVElNIEVUUiBQb2xhcml0eQorICogQHsKKyAqLworI2RlZmluZSBUSU1fRVRSUE9MQVJJVFlfSU5WRVJURUQgVElNX1NNQ1JfRVRQIC8qITwgUG9sYXJpdHkgZm9yIEVUUiBzb3VyY2UgKi8KKyNkZWZpbmUgVElNX0VUUlBPTEFSSVRZX05PTklOVkVSVEVEICAgICAgICBcCisgIDB4MDAwMDAwMDBVIC8qITwgUG9sYXJpdHkgZm9yIEVUUiBzb3VyY2UgXAorICAgICAgICAgICAgICAgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFRJTV9FVFJfUHJlc2NhbGVyIFRJTSBFVFIgUHJlc2NhbGVyCisgKiBAeworICovCisjZGVmaW5lIFRJTV9FVFJQUkVTQ0FMRVJfRElWMSAweDAwMDAwMDAwVSAvKiE8IE5vIHByZXNjYWxlciBpcyB1c2VkICovCisjZGVmaW5lIFRJTV9FVFJQUkVTQ0FMRVJfRElWMiBcCisgIFRJTV9TTUNSX0VUUFNfMCAvKiE8IEVUUiBpbnB1dCBzb3VyY2UgaXMgZGl2aWRlZCBieSAyICovCisjZGVmaW5lIFRJTV9FVFJQUkVTQ0FMRVJfRElWNCBcCisgIFRJTV9TTUNSX0VUUFNfMSAvKiE8IEVUUiBpbnB1dCBzb3VyY2UgaXMgZGl2aWRlZCBieSA0ICovCisjZGVmaW5lIFRJTV9FVFJQUkVTQ0FMRVJfRElWOCBcCisgIFRJTV9TTUNSX0VUUFMgLyohPCBFVFIgaW5wdXQgc291cmNlIGlzIGRpdmlkZWQgYnkgOCAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0NvdW50ZXJfTW9kZSBUSU0gQ291bnRlciBNb2RlCisgKiBAeworICovCisjZGVmaW5lIFRJTV9DT1VOVEVSTU9ERV9VUCAweDAwMDAwMDAwVSAgIC8qITwgQ291bnRlciB1c2VkIGFzIHVwLWNvdW50ZXIgICAqLworI2RlZmluZSBUSU1fQ09VTlRFUk1PREVfRE9XTiBUSU1fQ1IxX0RJUiAvKiE8IENvdW50ZXIgdXNlZCBhcyBkb3duLWNvdW50ZXIgKi8KKyNkZWZpbmUgVElNX0NPVU5URVJNT0RFX0NFTlRFUkFMSUdORUQxIFwKKyAgVElNX0NSMV9DTVNfMCAvKiE8IENlbnRlci1hbGlnbmVkIG1vZGUgMSAgICAgICAgKi8KKyNkZWZpbmUgVElNX0NPVU5URVJNT0RFX0NFTlRFUkFMSUdORUQyIFwKKyAgVElNX0NSMV9DTVNfMSAvKiE8IENlbnRlci1hbGlnbmVkIG1vZGUgMiAgICAgICAgKi8KKyNkZWZpbmUgVElNX0NPVU5URVJNT0RFX0NFTlRFUkFMSUdORUQzIFwKKyAgVElNX0NSMV9DTVMgLyohPCBDZW50ZXItYWxpZ25lZCBtb2RlIDMgICAgICAgICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1fVXBkYXRlX0ludGVycnVwdF9GbGFnX1JlbWFwIFRJTSBVcGRhdGUgSW50ZXJydXB0IEZsYWcgUmVtYXAKKyAqIEB7CisgKi8KKyNkZWZpbmUgVElNX1VJRlJFTUFQX0RJU0FCTEUgXAorICAweDAwMDAwMDAwVSAvKiE8IFVwZGF0ZSBpbnRlcnJ1cHQgZmxhZyByZW1hcCBkaXNhYmxlZCAqLworI2RlZmluZSBUSU1fVUlGUkVNQVBfRU5BQkxFIFwKKyAgVElNX0NSMV9VSUZSRU1BUCAvKiE8IFVwZGF0ZSBpbnRlcnJ1cHQgZmxhZyByZW1hcCBlbmFibGVkICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1fQ2xvY2tEaXZpc2lvbiBUSU0gQ2xvY2sgRGl2aXNpb24KKyAqIEB7CisgKi8KKyNkZWZpbmUgVElNX0NMT0NLRElWSVNJT05fRElWMSBcCisgIDB4MDAwMDAwMDBVIC8qITwgQ2xvY2sgZGl2aXNpb246IHREVFM9dENLX0lOVCAgICovCisjZGVmaW5lIFRJTV9DTE9DS0RJVklTSU9OX0RJVjIgXAorICBUSU1fQ1IxX0NLRF8wIC8qITwgQ2xvY2sgZGl2aXNpb246IHREVFM9Mip0Q0tfSU5UICovCisjZGVmaW5lIFRJTV9DTE9DS0RJVklTSU9OX0RJVjQgXAorICBUSU1fQ1IxX0NLRF8xIC8qITwgQ2xvY2sgZGl2aXNpb246IHREVFM9NCp0Q0tfSU5UICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1fT3V0cHV0X0NvbXBhcmVfU3RhdGUgVElNIE91dHB1dCBDb21wYXJlIFN0YXRlCisgKiBAeworICovCisjZGVmaW5lIFRJTV9PVVRQVVRTVEFURV9ESVNBQkxFIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBDYXB0dXJlL0NvbXBhcmUgMSBvdXRwdXQgZGlzYWJsZWQgKi8KKyNkZWZpbmUgVElNX09VVFBVVFNUQVRFX0VOQUJMRSBcCisgIFRJTV9DQ0VSX0NDMUUgLyohPCBDYXB0dXJlL0NvbXBhcmUgMSBvdXRwdXQgZW5hYmxlZCAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0F1dG9SZWxvYWRQcmVsb2FkIFRJTSBBdXRvLVJlbG9hZCBQcmVsb2FkCisgKiBAeworICovCisjZGVmaW5lIFRJTV9BVVRPUkVMT0FEX1BSRUxPQURfRElTQUJMRSBcCisgIDB4MDAwMDAwMDBVIC8qITwgVElNeF9BUlIgcmVnaXN0ZXIgaXMgbm90IGJ1ZmZlcmVkICovCisjZGVmaW5lIFRJTV9BVVRPUkVMT0FEX1BSRUxPQURfRU5BQkxFIFwKKyAgVElNX0NSMV9BUlBFIC8qITwgVElNeF9BUlIgcmVnaXN0ZXIgaXMgYnVmZmVyZWQgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX091dHB1dF9GYXN0X1N0YXRlIFRJTSBPdXRwdXQgRmFzdCBTdGF0ZQorICogQHsKKyAqLworI2RlZmluZSBUSU1fT0NGQVNUX0RJU0FCTEUgMHgwMDAwMDAwMFUgICAgLyohPCBPdXRwdXQgQ29tcGFyZSBmYXN0IGRpc2FibGUgKi8KKyNkZWZpbmUgVElNX09DRkFTVF9FTkFCTEUgVElNX0NDTVIxX09DMUZFIC8qITwgT3V0cHV0IENvbXBhcmUgZmFzdCBlbmFibGUgICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1fT3V0cHV0X0NvbXBhcmVfTl9TdGF0ZSBUSU0gQ29tcGxlbWVudGFyeSBPdXRwdXQgQ29tcGFyZSBTdGF0ZQorICogQHsKKyAqLworI2RlZmluZSBUSU1fT1VUUFVUTlNUQVRFX0RJU0FCTEUgMHgwMDAwMDAwMFUgICAvKiE8IE9DeE4gaXMgZGlzYWJsZWQgICovCisjZGVmaW5lIFRJTV9PVVRQVVROU1RBVEVfRU5BQkxFIFRJTV9DQ0VSX0NDMU5FIC8qITwgT0N4TiBpcyBlbmFibGVkICAgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFRJTV9PdXRwdXRfQ29tcGFyZV9Qb2xhcml0eSBUSU0gT3V0cHV0IENvbXBhcmUgUG9sYXJpdHkKKyAqIEB7CisgKi8KKyNkZWZpbmUgVElNX09DUE9MQVJJVFlfSElHSCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBDYXB0dXJlL0NvbXBhcmUgb3V0cHV0IHBvbGFyaXR5IFwKKyAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9PQ1BPTEFSSVRZX0xPVyBcCisgIFRJTV9DQ0VSX0NDMVAgLyohPCBDYXB0dXJlL0NvbXBhcmUgb3V0cHV0IHBvbGFyaXR5ICAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX091dHB1dF9Db21wYXJlX05fUG9sYXJpdHkgVElNIENvbXBsZW1lbnRhcnkgT3V0cHV0IENvbXBhcmUKKyAqIFBvbGFyaXR5CisgKiBAeworICovCisjZGVmaW5lIFRJTV9PQ05QT0xBUklUWV9ISUdIIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBDYXB0dXJlL0NvbXBhcmUgY29tcGxlbWVudGFyeSBvdXRwdXQgcG9sYXJpdHkgKi8KKyNkZWZpbmUgVElNX09DTlBPTEFSSVRZX0xPVyBcCisgIFRJTV9DQ0VSX0NDMU5QIC8qITwgQ2FwdHVyZS9Db21wYXJlIGNvbXBsZW1lbnRhcnkgb3V0cHV0IHBvbGFyaXR5ICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1fT3V0cHV0X0NvbXBhcmVfSWRsZV9TdGF0ZSBUSU0gT3V0cHV0IENvbXBhcmUgSWRsZSBTdGF0ZQorICogQHsKKyAqLworI2RlZmluZSBUSU1fT0NJRExFU1RBVEVfU0VUIFwKKyAgVElNX0NSMl9PSVMxIC8qITwgT3V0cHV0IElkbGUgc3RhdGU6IE9DeD0xIHdoZW4gTU9FPTAgKi8KKyNkZWZpbmUgVElNX09DSURMRVNUQVRFX1JFU0VUIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBPdXRwdXQgSWRsZSBzdGF0ZTogT0N4PTAgd2hlbiBNT0U9MCAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX091dHB1dF9Db21wYXJlX05fSWRsZV9TdGF0ZSBUSU0gQ29tcGxlbWVudGFyeSBPdXRwdXQgQ29tcGFyZQorICogSWRsZSBTdGF0ZQorICogQHsKKyAqLworI2RlZmluZSBUSU1fT0NOSURMRVNUQVRFX1NFVCBcCisgIFRJTV9DUjJfT0lTMU4gLyohPCBDb21wbGVtZW50YXJ5IG91dHB1dCBJZGxlIHN0YXRlOiBPQ3hOPTEgd2hlbiBNT0U9MCAqLworI2RlZmluZSBUSU1fT0NOSURMRVNUQVRFX1JFU0VUIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBDb21wbGVtZW50YXJ5IG91dHB1dCBJZGxlIHN0YXRlOiBPQ3hOPTAgd2hlbiBNT0U9MCAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0lucHV0X0NhcHR1cmVfUG9sYXJpdHkgVElNIElucHV0IENhcHR1cmUgUG9sYXJpdHkKKyAqIEB7CisgKi8KKyNkZWZpbmUgVElNX0lDUE9MQVJJVFlfUklTSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVElNX0lOUFVUQ0hBTk5FTFBPTEFSSVRZX1JJU0lORyAvKiE8IENhcHR1cmUgdHJpZ2dlcmVkIGJ5IHJpc2luZyBlZGdlIG9uIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lciBpbnB1dCAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9JQ1BPTEFSSVRZX0ZBTExJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVElNX0lOUFVUQ0hBTk5FTFBPTEFSSVRZX0ZBTExJTkcgLyohPCBDYXB0dXJlIHRyaWdnZXJlZCBieSBmYWxsaW5nIGVkZ2Ugb24gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lciBpbnB1dCAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX0lDUE9MQVJJVFlfQk9USEVER0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVElNX0lOUFVUQ0hBTk5FTFBPTEFSSVRZX0JPVEhFREdFIC8qITwgQ2FwdHVyZSB0cmlnZ2VyZWQgYnkgYm90aCByaXNpbmcgYW5kIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbGxpbmcgZWRnZXMgb24gdGltZXIgaW5wdXQqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0VuY29kZXJfSW5wdXRfUG9sYXJpdHkgVElNIEVuY29kZXIgSW5wdXQgUG9sYXJpdHkKKyAqIEB7CisgKi8KKyNkZWZpbmUgVElNX0VOQ09ERVJJTlBVVFBPTEFSSVRZX1JJU0lORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRJTV9JTlBVVENIQU5ORUxQT0xBUklUWV9SSVNJTkcgLyohPCBFbmNvZGVyIGlucHV0IHdpdGggcmlzaW5nIGVkZ2UgcG9sYXJpdHkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fRU5DT0RFUklOUFVUUE9MQVJJVFlfRkFMTElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUSU1fSU5QVVRDSEFOTkVMUE9MQVJJVFlfRkFMTElORyAvKiE8IEVuY29kZXIgaW5wdXQgd2l0aCBmYWxsaW5nIGVkZ2UgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2xhcml0eSAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0lucHV0X0NhcHR1cmVfU2VsZWN0aW9uIFRJTSBJbnB1dCBDYXB0dXJlIFNlbGVjdGlvbgorICogQHsKKyAqLworI2RlZmluZSBUSU1fSUNTRUxFQ1RJT05fRElSRUNUVEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUSU1fQ0NNUjFfQ0MxU18wIC8qITwgVElNIElucHV0IDEsIDIsIDMgb3IgNCBpcyBzZWxlY3RlZCB0byBiZSBjb25uZWN0ZWQgdG8gXAorICAgICAgICAgICAgICAgICAgICAgIElDMSwgSUMyLCBJQzMgb3IgSUM0LCByZXNwZWN0aXZlbHkgKi8KKyNkZWZpbmUgVElNX0lDU0VMRUNUSU9OX0lORElSRUNUVEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVElNX0NDTVIxX0NDMVNfMSAvKiE8IFRJTSBJbnB1dCAxLCAyLCAzIG9yIDQgaXMgc2VsZWN0ZWQgdG8gYmUgY29ubmVjdGVkIHRvIFwKKyAgICAgICAgICAgICAgICAgICAgICBJQzIsIElDMSwgSUM0IG9yIElDMywgcmVzcGVjdGl2ZWx5ICovCisjZGVmaW5lIFRJTV9JQ1NFTEVDVElPTl9UUkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUSU1fQ0NNUjFfQ0MxUyAvKiE8IFRJTSBJbnB1dCAxLCAyLCAzIG9yIDQgaXMgc2VsZWN0ZWQgdG8gYmUgY29ubmVjdGVkIHRvIFwKKyAgICAgICAgICAgICAgICAgICAgVFJDICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1fSW5wdXRfQ2FwdHVyZV9QcmVzY2FsZXIgVElNIElucHV0IENhcHR1cmUgUHJlc2NhbGVyCisgKiBAeworICovCisjZGVmaW5lIFRJTV9JQ1BTQ19ESVYxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBDYXB0dXJlIHBlcmZvcm1lZCBlYWNoIHRpbWUgYW4gZWRnZSBpcyBkZXRlY3RlZCBvbiB0aGUgXAorICAgICAgICAgICAgICAgICBjYXB0dXJlIGlucHV0ICovCisjZGVmaW5lIFRJTV9JQ1BTQ19ESVYyIFwKKyAgVElNX0NDTVIxX0lDMVBTQ18wIC8qITwgQ2FwdHVyZSBwZXJmb3JtZWQgb25jZSBldmVyeSAyIGV2ZW50cyAqLworI2RlZmluZSBUSU1fSUNQU0NfRElWNCBcCisgIFRJTV9DQ01SMV9JQzFQU0NfMSAvKiE8IENhcHR1cmUgcGVyZm9ybWVkIG9uY2UgZXZlcnkgNCBldmVudHMgKi8KKyNkZWZpbmUgVElNX0lDUFNDX0RJVjggXAorICBUSU1fQ0NNUjFfSUMxUFNDIC8qITwgQ2FwdHVyZSBwZXJmb3JtZWQgb25jZSBldmVyeSA4IGV2ZW50cyAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX09uZV9QdWxzZV9Nb2RlIFRJTSBPbmUgUHVsc2UgTW9kZQorICogQHsKKyAqLworI2RlZmluZSBUSU1fT1BNT0RFX1NJTkdMRSBcCisgIFRJTV9DUjFfT1BNIC8qITwgQ291bnRlciBzdG9wcyBjb3VudGluZyBhdCB0aGUgbmV4dCB1cGRhdGUgZXZlbnQgKi8KKyNkZWZpbmUgVElNX09QTU9ERV9SRVBFVElUSVZFIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBDb3VudGVyIGlzIG5vdCBzdG9wcGVkIGF0IHVwZGF0ZSBldmVudCAgICAgICAgICAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0VuY29kZXJfTW9kZSBUSU0gRW5jb2RlciBNb2RlCisgKiBAeworICovCisjZGVmaW5lIFRJTV9FTkNPREVSTU9ERV9USTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUSU1fU01DUl9TTVNfMCAvKiE8IFF1YWRyYXR1cmUgZW5jb2RlciBtb2RlIDEsIHgyIG1vZGUsIGNvdW50cyB1cC9kb3duIG9uIFwKKyAgICAgICAgICAgICAgICAgICAgVEkxRlAxIGVkZ2UgZGVwZW5kaW5nIG9uIFRJMkZQMiBsZXZlbCAgKi8KKyNkZWZpbmUgVElNX0VOQ09ERVJNT0RFX1RJMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRJTV9TTUNSX1NNU18xIC8qITwgUXVhZHJhdHVyZSBlbmNvZGVyIG1vZGUgMiwgeDIgbW9kZSwgY291bnRzIHVwL2Rvd24gb24gXAorICAgICAgICAgICAgICAgICAgICBUSTJGUDIgZWRnZSBkZXBlbmRpbmcgb24gVEkxRlAxIGxldmVsLiAqLworI2RlZmluZSBUSU1fRU5DT0RFUk1PREVfVEkxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoVElNX1NNQ1JfU01TXzEgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgVElNX1NNQ1JfU01TXzApIC8qITwgUXVhZHJhdHVyZSBlbmNvZGVyIG1vZGUgMywgeDQgbW9kZSwgY291bnRzIHVwL2Rvd24gb24gXAorICAgICAgICAgICAgICAgICAgICAgIGJvdGggVEkxRlAxIGFuZCBUSTJGUDIgZWRnZXMgZGVwZW5kaW5nIG9uIHRoZSBsZXZlbCBvZiAgXAorICAgICAgICAgICAgICAgICAgICAgIHRoZSBvdGhlciBpbnB1dC4gKi8KKyNkZWZpbmUgVElNX0VOQ09ERVJNT0RFX0NMT0NLUExVU0RJUkVDVElPTl9YMiBcCisgIChUSU1fU01DUl9TTVNfMyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgVElNX1NNQ1JfU01TXzEpIC8qITwgRW5jb2RlciBtb2RlOiBDbG9jayBwbHVzIGRpcmVjdGlvbiwgeDIgbW9kZSAqLworI2RlZmluZSBUSU1fRU5DT0RFUk1PREVfQ0xPQ0tQTFVTRElSRUNUSU9OX1gxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKFRJTV9TTUNSX1NNU18zIHwgVElNX1NNQ1JfU01TXzEgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBUSU1fU01DUl9TTVNfMCkgLyohPCBFbmNvZGVyIG1vZGU6IENsb2NrIHBsdXMgZGlyZWN0aW9uLCB4MSBtb2RlLCBUSTJGUDIgXAorICAgICAgICAgICAgICAgICAgICAgIGVkZ2Ugc2Vuc2l0aXZpdHkgaXMgc2V0IGJ5IENDMlAgKi8KKyNkZWZpbmUgVElNX0VOQ09ERVJNT0RFX0RJUkVDVElPTkFMQ0xPQ0tfWDIgXAorICAoVElNX1NNQ1JfU01TXzMgfCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBUSU1fU01DUl9TTVNfMikgLyohPCBFbmNvZGVyIG1vZGU6IERpcmVjdGlvbmFsIENsb2NrLCB4MiBtb2RlICovCisjZGVmaW5lIFRJTV9FTkNPREVSTU9ERV9ESVJFQ1RJT05BTENMT0NLX1gxX1RJMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKFRJTV9TTUNSX1NNU18zIHwgVElNX1NNQ1JfU01TXzIgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgVElNX1NNQ1JfU01TXzApIC8qITwgRW5jb2RlciBtb2RlOiBEaXJlY3Rpb25hbCBDbG9jaywgeDEgbW9kZSwgVEkxRlAxIGFuZCBcCisgICAgICAgICAgICAgICAgICAgICAgVEkyRlAyIGVkZ2Ugc2Vuc2l0aXZpdHkgaXMgc2V0IGJ5IENDMVAgYW5kIENDMlAgKi8KKyNkZWZpbmUgVElNX0VOQ09ERVJNT0RFX1gxX1RJMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoVElNX1NNQ1JfU01TXzMgfCBUSU1fU01DUl9TTVNfMiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBUSU1fU01DUl9TTVNfMSkgLyohPCBRdWFkcmF0dXJlIGVuY29kZXIgbW9kZTogeDEgbW9kZSwgY291bnRpbmcgb24gVEkxRlAxIFwKKyAgICAgICAgICAgICAgICAgICAgICBlZGdlcyBvbmx5LCBlZGdlIHNlbnNpdGl2aXR5IGlzIHNldCBieSBDQzFQICovCisjZGVmaW5lIFRJTV9FTkNPREVSTU9ERV9YMV9USTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKFRJTV9TTUNSX1NNU18zIHwgVElNX1NNQ1JfU01TXzIgfCBUSU1fU01DUl9TTVNfMSB8ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgVElNX1NNQ1JfU01TXzApIC8qITwgUXVhZHJhdHVyZSBlbmNvZGVyIG1vZGU6IHgxIG1vZGUsIGNvdW50aW5nIG9uIFRJMkZQMiBcCisgICAgICAgICAgICAgICAgICAgICAgZWRnZXMgb25seSwgZWRnZSBzZW5zaXRpdml0eSBpcyBzZXQgYnkgQ0MxUCAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0ludGVycnVwdF9kZWZpbml0aW9uIFRJTSBpbnRlcnJ1cHQgRGVmaW5pdGlvbgorICogQHsKKyAqLworI2RlZmluZSBUSU1fSVRfVVBEQVRFIFRJTV9ESUVSX1VJRSAgLyohPCBVcGRhdGUgaW50ZXJydXB0ICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX0lUX0NDMSBUSU1fRElFUl9DQzFJRSAgIC8qITwgQ2FwdHVyZS9Db21wYXJlIDEgaW50ZXJydXB0ICovCisjZGVmaW5lIFRJTV9JVF9DQzIgVElNX0RJRVJfQ0MySUUgICAvKiE8IENhcHR1cmUvQ29tcGFyZSAyIGludGVycnVwdCAqLworI2RlZmluZSBUSU1fSVRfQ0MzIFRJTV9ESUVSX0NDM0lFICAgLyohPCBDYXB0dXJlL0NvbXBhcmUgMyBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgVElNX0lUX0NDNCBUSU1fRElFUl9DQzRJRSAgIC8qITwgQ2FwdHVyZS9Db21wYXJlIDQgaW50ZXJydXB0ICovCisjZGVmaW5lIFRJTV9JVF9DT00gVElNX0RJRVJfQ09NSUUgICAvKiE8IENvbW11dGF0aW9uIGludGVycnVwdCAgICAgICAqLworI2RlZmluZSBUSU1fSVRfVFJJR0dFUiBUSU1fRElFUl9USUUgLyohPCBUcmlnZ2VyIGludGVycnVwdCAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX0lUX0JSRUFLIFRJTV9ESUVSX0JJRSAgIC8qITwgQnJlYWsgaW50ZXJydXB0ICAgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9JVF9JRFggVElNX0RJRVJfSURYSUUgICAvKiE8IEluZGV4IGludGVycnVwdCAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fSVRfRElSIFRJTV9ESUVSX0RJUklFICAgLyohPCBEaXJlY3Rpb24gY2hhbmdlIGludGVycnVwdCAgKi8KKyNkZWZpbmUgVElNX0lUX0lFUlIgVElNX0RJRVJfSUVSUklFIC8qITwgSW5kZXggZXJyb3IgaW50ZXJydXB0ICAgICAgICovCisjZGVmaW5lIFRJTV9JVF9URVJSIFRJTV9ESUVSX1RFUlJJRSAvKiE8IFRyYW5zaXRpb24gZXJyb3IgaW50ZXJydXB0ICAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0NvbW11dGF0aW9uX1NvdXJjZSAgVElNIENvbW11dGF0aW9uIFNvdXJjZQorICogQHsKKyAqLworI2RlZmluZSBUSU1fQ09NTVVUQVRJT05fVFJHSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUSU1fQ1IyX0NDVVMgLyohPCBXaGVuIENhcHR1cmUvY29tcGFyZSBjb250cm9sIGJpdHMgYXJlIHByZWxvYWRlZCwgdGhleSBhcmUgXAorICAgICAgICAgICAgICAgICAgdXBkYXRlZCBieSBzZXR0aW5nIHRoZSBDT01HIGJpdCBvciB3aGVuIGFuIHJpc2luZyBlZGdlICAgICAgXAorICAgICAgICAgICAgICAgICAgb2NjdXJzIG9uIHRyaWdnZXIgaW5wdXQgKi8KKyNkZWZpbmUgVElNX0NPTU1VVEFUSU9OX1NPRlRXQVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAweDAwMDAwMDAwVSAvKiE8IFdoZW4gQ2FwdHVyZS9jb21wYXJlIGNvbnRyb2wgYml0cyBhcmUgcHJlbG9hZGVkLCB0aGV5IGFyZSBcCisgICAgICAgICAgICAgICAgIHVwZGF0ZWQgYnkgc2V0dGluZyB0aGUgQ09NRyBiaXQgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFRJTV9ETUFfc291cmNlcyBUSU0gRE1BIFNvdXJjZXMKKyAqIEB7CisgKi8KKyNkZWZpbmUgVElNX0RNQV9VUERBVEUgXAorICBUSU1fRElFUl9VREUgLyohPCBETUEgcmVxdWVzdCBpcyB0cmlnZ2VyZWQgYnkgdGhlIHVwZGF0ZSBldmVudCAqLworI2RlZmluZSBUSU1fRE1BX0NDMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUSU1fRElFUl9DQzFERSAvKiE8IERNQSByZXF1ZXN0IGlzIHRyaWdnZXJlZCBieSB0aGUgY2FwdHVyZS9jb21wYXJlIG1hY3RoIDEgXAorICAgICAgICAgICAgICAgICAgICBldmVudCAqLworI2RlZmluZSBUSU1fRE1BX0NDMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUSU1fRElFUl9DQzJERSAvKiE8IERNQSByZXF1ZXN0IGlzIHRyaWdnZXJlZCBieSB0aGUgY2FwdHVyZS9jb21wYXJlIG1hY3RoIDIgXAorICAgICAgICAgICAgICAgICAgICBldmVudCBldmVudCAqLworI2RlZmluZSBUSU1fRE1BX0NDMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUSU1fRElFUl9DQzNERSAvKiE8IERNQSByZXF1ZXN0IGlzIHRyaWdnZXJlZCBieSB0aGUgY2FwdHVyZS9jb21wYXJlIG1hY3RoIDMgXAorICAgICAgICAgICAgICAgICAgICBldmVudCBldmVudCAqLworI2RlZmluZSBUSU1fRE1BX0NDNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUSU1fRElFUl9DQzRERSAvKiE8IERNQSByZXF1ZXN0IGlzIHRyaWdnZXJlZCBieSB0aGUgY2FwdHVyZS9jb21wYXJlIG1hY3RoIDQgXAorICAgICAgICAgICAgICAgICAgICBldmVudCBldmVudCAqLworI2RlZmluZSBUSU1fRE1BX0NPTSBcCisgIFRJTV9ESUVSX0NPTURFIC8qITwgRE1BIHJlcXVlc3QgaXMgdHJpZ2dlcmVkIGJ5IHRoZSBjb21tdXRhdGlvbiBldmVudCAqLworI2RlZmluZSBUSU1fRE1BX1RSSUdHRVIgXAorICBUSU1fRElFUl9UREUgLyohPCBETUEgcmVxdWVzdCBpcyB0cmlnZ2VyZWQgYnkgdGhlIHRyaWdnZXIgZXZlbnQgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFRJTV9DQ19ETUFfUmVxdWVzdCBDQ3ggRE1BIHJlcXVlc3Qgc2VsZWN0aW9uCisgKiBAeworICovCisjZGVmaW5lIFRJTV9DQ0RNQVJFUVVFU1RfQ0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAweDAwMDAwMDAwVSAvKiE8IENDeCBETUEgcmVxdWVzdCBzZW50IHdoZW4gY2FwdHVyZSBvciBjb21wYXJlIG1hdGNoIGV2ZW50IFwKKyAgICAgICAgICAgICAgICAgb2NjdXJzICovCisjZGVmaW5lIFRJTV9DQ0RNQVJFUVVFU1RfVVBEQVRFIFwKKyAgVElNX0NSMl9DQ0RTIC8qITwgQ0N4IERNQSByZXF1ZXN0cyBzZW50IHdoZW4gdXBkYXRlIGV2ZW50IG9jY3VycyAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0ZsYWdfZGVmaW5pdGlvbiBUSU0gRmxhZyBEZWZpbml0aW9uCisgKiBAeworICovCisjZGVmaW5lIFRJTV9GTEFHX1VQREFURSBUSU1fU1JfVUlGICAvKiE8IFVwZGF0ZSBpbnRlcnJ1cHQgZmxhZyAgICAgICAgICovCisjZGVmaW5lIFRJTV9GTEFHX0NDMSBUSU1fU1JfQ0MxSUYgICAvKiE8IENhcHR1cmUvQ29tcGFyZSAxIGludGVycnVwdCBmbGFnICovCisjZGVmaW5lIFRJTV9GTEFHX0NDMiBUSU1fU1JfQ0MySUYgICAvKiE8IENhcHR1cmUvQ29tcGFyZSAyIGludGVycnVwdCBmbGFnICovCisjZGVmaW5lIFRJTV9GTEFHX0NDMyBUSU1fU1JfQ0MzSUYgICAvKiE8IENhcHR1cmUvQ29tcGFyZSAzIGludGVycnVwdCBmbGFnICovCisjZGVmaW5lIFRJTV9GTEFHX0NDNCBUSU1fU1JfQ0M0SUYgICAvKiE8IENhcHR1cmUvQ29tcGFyZSA0IGludGVycnVwdCBmbGFnICovCisjZGVmaW5lIFRJTV9GTEFHX0NDNSBUSU1fU1JfQ0M1SUYgICAvKiE8IENhcHR1cmUvQ29tcGFyZSA1IGludGVycnVwdCBmbGFnICovCisjZGVmaW5lIFRJTV9GTEFHX0NDNiBUSU1fU1JfQ0M2SUYgICAvKiE8IENhcHR1cmUvQ29tcGFyZSA2IGludGVycnVwdCBmbGFnICovCisjZGVmaW5lIFRJTV9GTEFHX0NPTSBUSU1fU1JfQ09NSUYgICAvKiE8IENvbW11dGF0aW9uIGludGVycnVwdCBmbGFnICAgICovCisjZGVmaW5lIFRJTV9GTEFHX1RSSUdHRVIgVElNX1NSX1RJRiAvKiE8IFRyaWdnZXIgaW50ZXJydXB0IGZsYWcgICAgICAgICovCisjZGVmaW5lIFRJTV9GTEFHX0JSRUFLIFRJTV9TUl9CSUYgICAvKiE8IEJyZWFrIGludGVycnVwdCBmbGFnICAgICAgICAgICovCisjZGVmaW5lIFRJTV9GTEFHX0JSRUFLMiBUSU1fU1JfQjJJRiAvKiE8IEJyZWFrIDIgaW50ZXJydXB0IGZsYWcgICAgICAgICovCisjZGVmaW5lIFRJTV9GTEFHX1NZU1RFTV9CUkVBSyBUSU1fU1JfU0JJRiAvKiE8IFN5c3RlbSBCcmVhayBpbnRlcnJ1cHQgZmxhZyAqLworI2RlZmluZSBUSU1fRkxBR19DQzFPRiBUSU1fU1JfQ0MxT0YgICAgICAgLyohPCBDYXB0dXJlIDEgb3ZlcmNhcHR1cmUgZmxhZyAgICAqLworI2RlZmluZSBUSU1fRkxBR19DQzJPRiBUSU1fU1JfQ0MyT0YgICAgICAgLyohPCBDYXB0dXJlIDIgb3ZlcmNhcHR1cmUgZmxhZyAgICAqLworI2RlZmluZSBUSU1fRkxBR19DQzNPRiBUSU1fU1JfQ0MzT0YgICAgICAgLyohPCBDYXB0dXJlIDMgb3ZlcmNhcHR1cmUgZmxhZyAgICAqLworI2RlZmluZSBUSU1fRkxBR19DQzRPRiBUSU1fU1JfQ0M0T0YgICAgICAgLyohPCBDYXB0dXJlIDQgb3ZlcmNhcHR1cmUgZmxhZyAgICAqLworI2RlZmluZSBUSU1fRkxBR19JRFggVElNX1NSX0lEWEYgICAgICAgICAgLyohPCBFbmNvZGVyIGluZGV4IGZsYWcgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fRkxBR19ESVIgVElNX1NSX0RJUkYgICAgICAgICAgLyohPCBEaXJlY3Rpb24gY2hhbmdlIGZsYWcgICAgICAgICAqLworI2RlZmluZSBUSU1fRkxBR19JRVJSIFRJTV9TUl9JRVJSRiAgICAgICAgLyohPCBJbmRleCBlcnJvciBmbGFnICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fRkxBR19URVJSIFRJTV9TUl9URVJSRiAgICAgICAgLyohPCBUcmFuc2l0aW9uIGVycm9yIGZsYWcgICAgICAgICAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0NoYW5uZWwgVElNIENoYW5uZWwKKyAqIEB7CisgKi8KKyNkZWZpbmUgVElNX0NIQU5ORUxfMSBcCisgIDB4MDAwMDAwMDBVIC8qITwgQ2FwdHVyZS9jb21wYXJlIGNoYW5uZWwgMSBpZGVudGlmaWVyICAgICAgKi8KKyNkZWZpbmUgVElNX0NIQU5ORUxfMiBcCisgIDB4MDAwMDAwMDRVIC8qITwgQ2FwdHVyZS9jb21wYXJlIGNoYW5uZWwgMiBpZGVudGlmaWVyICAgICAgKi8KKyNkZWZpbmUgVElNX0NIQU5ORUxfMyBcCisgIDB4MDAwMDAwMDhVIC8qITwgQ2FwdHVyZS9jb21wYXJlIGNoYW5uZWwgMyBpZGVudGlmaWVyICAgICAgKi8KKyNkZWZpbmUgVElNX0NIQU5ORUxfNCBcCisgIDB4MDAwMDAwMENVIC8qITwgQ2FwdHVyZS9jb21wYXJlIGNoYW5uZWwgNCBpZGVudGlmaWVyICAgICAgKi8KKyNkZWZpbmUgVElNX0NIQU5ORUxfNSBcCisgIDB4MDAwMDAwMTBVIC8qITwgQ29tcGFyZSBjaGFubmVsIDUgaWRlbnRpZmllciAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX0NIQU5ORUxfNiBcCisgIDB4MDAwMDAwMTRVIC8qITwgQ29tcGFyZSBjaGFubmVsIDYgaWRlbnRpZmllciAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX0NIQU5ORUxfQUxMIFwKKyAgMHgwMDAwMDAzQ1UgLyohPCBHbG9iYWwgQ2FwdHVyZS9jb21wYXJlIGNoYW5uZWwgaWRlbnRpZmllciAgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFRJTV9DbG9ja19Tb3VyY2UgVElNIENsb2NrIFNvdXJjZQorICogQHsKKyAqLworI2RlZmluZSBUSU1fQ0xPQ0tTT1VSQ0VfSU5URVJOQUwgVElNX1NNQ1JfRVRQU18wIC8qITwgSW50ZXJuYWwgY2xvY2sgc291cmNlICovCisjZGVmaW5lIFRJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMSBcCisgIFRJTV9UU19FVFJGIC8qITwgRXh0ZXJuYWwgY2xvY2sgc291cmNlIG1vZGUgMSAoRVRSRikgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX0NMT0NLU09VUkNFX0VUUk1PREUyIFwKKyAgVElNX1NNQ1JfRVRQU18xIC8qITwgRXh0ZXJuYWwgY2xvY2sgc291cmNlIG1vZGUgMiAqLworI2RlZmluZSBUSU1fQ0xPQ0tTT1VSQ0VfVEkxRUQgXAorICBUSU1fVFNfVEkxRl9FRCAvKiE8IEV4dGVybmFsIGNsb2NrIHNvdXJjZSBtb2RlIDEgKFRUSTFGUDEgKyBlZGdlIGRldGVjdC4pICovCisjZGVmaW5lIFRJTV9DTE9DS1NPVVJDRV9USTEgXAorICBUSU1fVFNfVEkxRlAxIC8qITwgRXh0ZXJuYWwgY2xvY2sgc291cmNlIG1vZGUgMSAoVFRJMUZQMSkgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX0NMT0NLU09VUkNFX1RJMiBcCisgIFRJTV9UU19USTJGUDIgLyohPCBFeHRlcm5hbCBjbG9jayBzb3VyY2UgbW9kZSAxIChUVEkyRlAyKSAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMCBcCisgIFRJTV9UU19JVFIwIC8qITwgRXh0ZXJuYWwgY2xvY2sgc291cmNlIG1vZGUgMSAoSVRSMCkgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX0NMT0NLU09VUkNFX0lUUjEgXAorICBUSU1fVFNfSVRSMSAvKiE8IEV4dGVybmFsIGNsb2NrIHNvdXJjZSBtb2RlIDEgKElUUjEpICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9DTE9DS1NPVVJDRV9JVFIyIFwKKyAgVElNX1RTX0lUUjIgLyohPCBFeHRlcm5hbCBjbG9jayBzb3VyY2UgbW9kZSAxIChJVFIyKSAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMyBcCisgIFRJTV9UU19JVFIzIC8qITwgRXh0ZXJuYWwgY2xvY2sgc291cmNlIG1vZGUgMSAoSVRSMykgICAgICAgICAgICAgICAgICAgKi8KKyNpZiBkZWZpbmVkKFRJTTUpCisjZGVmaW5lIFRJTV9DTE9DS1NPVVJDRV9JVFI0IFwKKyAgVElNX1RTX0lUUjQgLyohPCBFeHRlcm5hbCBjbG9jayBzb3VyY2UgbW9kZSAxIChJVFI0KSAgICAgICAgICAgICAgICAgICAqLworI2VuZGlmICAgICAgICAvKiBUSU01ICovCisjZGVmaW5lIFRJTV9DTE9DS1NPVVJDRV9JVFI1IFwKKyAgVElNX1RTX0lUUjUgLyohPCBFeHRlcm5hbCBjbG9jayBzb3VyY2UgbW9kZSAxIChJVFI1KSAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNiBcCisgIFRJTV9UU19JVFI2IC8qITwgRXh0ZXJuYWwgY2xvY2sgc291cmNlIG1vZGUgMSAoSVRSNikgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX0NMT0NLU09VUkNFX0lUUjcgXAorICBUSU1fVFNfSVRSNyAvKiE8IEV4dGVybmFsIGNsb2NrIHNvdXJjZSBtb2RlIDEgKElUUjcpICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9DTE9DS1NPVVJDRV9JVFI4IFwKKyAgVElNX1RTX0lUUjggLyohPCBFeHRlcm5hbCBjbG9jayBzb3VyY2UgbW9kZSAxIChJVFI4KSAgICAgICAgICAgICAgICAgICAqLworI2lmIGRlZmluZWQoVElNMjApCisjZGVmaW5lIFRJTV9DTE9DS1NPVVJDRV9JVFI5IFwKKyAgVElNX1RTX0lUUjkgLyohPCBFeHRlcm5hbCBjbG9jayBzb3VyY2UgbW9kZSAxIChJVFI5KSAgICAgICAgICAgICAgICAgICAqLworI2VuZGlmICAgICAgICAvKiBUSU0yMCAqLworI2RlZmluZSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMTAgXAorICBUSU1fVFNfSVRSMTAgLyohPCBFeHRlcm5hbCBjbG9jayBzb3VyY2UgbW9kZSAxIChJVFIxMCkgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMTEgXAorICBUSU1fVFNfSVRSMTEgLyohPCBFeHRlcm5hbCBjbG9jayBzb3VyY2UgbW9kZSAxIChJVFIxMSkgICAgICAgICAgICAgICAgICAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0Nsb2NrX1BvbGFyaXR5IFRJTSBDbG9jayBQb2xhcml0eQorICogQHsKKyAqLworI2RlZmluZSBUSU1fQ0xPQ0tQT0xBUklUWV9JTlZFUlRFRCBcCisgIFRJTV9FVFJQT0xBUklUWV9JTlZFUlRFRCAvKiE8IFBvbGFyaXR5IGZvciBFVFJ4IGNsb2NrIHNvdXJjZXMgKi8KKyNkZWZpbmUgVElNX0NMT0NLUE9MQVJJVFlfTk9OSU5WRVJURUQgXAorICBUSU1fRVRSUE9MQVJJVFlfTk9OSU5WRVJURUQgLyohPCBQb2xhcml0eSBmb3IgRVRSeCBjbG9jayBzb3VyY2VzICovCisjZGVmaW5lIFRJTV9DTE9DS1BPTEFSSVRZX1JJU0lORyBcCisgIFRJTV9JTlBVVENIQU5ORUxQT0xBUklUWV9SSVNJTkcgLyohPCBQb2xhcml0eSBmb3IgVEl4IGNsb2NrIHNvdXJjZXMgKi8KKyNkZWZpbmUgVElNX0NMT0NLUE9MQVJJVFlfRkFMTElORyBcCisgIFRJTV9JTlBVVENIQU5ORUxQT0xBUklUWV9GQUxMSU5HIC8qITwgUG9sYXJpdHkgZm9yIFRJeCBjbG9jayBzb3VyY2VzICovCisjZGVmaW5lIFRJTV9DTE9DS1BPTEFSSVRZX0JPVEhFREdFIFwKKyAgVElNX0lOUFVUQ0hBTk5FTFBPTEFSSVRZX0JPVEhFREdFIC8qITwgUG9sYXJpdHkgZm9yIFRJeCBjbG9jayBzb3VyY2VzICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1fQ2xvY2tfUHJlc2NhbGVyIFRJTSBDbG9jayBQcmVzY2FsZXIKKyAqIEB7CisgKi8KKyNkZWZpbmUgVElNX0NMT0NLUFJFU0NBTEVSX0RJVjEgXAorICBUSU1fRVRSUFJFU0NBTEVSX0RJVjEgLyohPCBObyBwcmVzY2FsZXIgaXMgdXNlZCAqLworI2RlZmluZSBUSU1fQ0xPQ0tQUkVTQ0FMRVJfRElWMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRJTV9FVFJQUkVTQ0FMRVJfRElWMiAvKiE8IFByZXNjYWxlciBmb3IgRXh0ZXJuYWwgRVRSIENsb2NrOiBDYXB0dXJlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1lZCBvbmNlIGV2ZXJ5IDIgZXZlbnRzLiAqLworI2RlZmluZSBUSU1fQ0xPQ0tQUkVTQ0FMRVJfRElWNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRJTV9FVFJQUkVTQ0FMRVJfRElWNCAvKiE8IFByZXNjYWxlciBmb3IgRXh0ZXJuYWwgRVRSIENsb2NrOiBDYXB0dXJlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1lZCBvbmNlIGV2ZXJ5IDQgZXZlbnRzLiAqLworI2RlZmluZSBUSU1fQ0xPQ0tQUkVTQ0FMRVJfRElWOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRJTV9FVFJQUkVTQ0FMRVJfRElWOCAvKiE8IFByZXNjYWxlciBmb3IgRXh0ZXJuYWwgRVRSIENsb2NrOiBDYXB0dXJlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1lZCBvbmNlIGV2ZXJ5IDggZXZlbnRzLiAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0NsZWFySW5wdXRfUG9sYXJpdHkgVElNIENsZWFyIElucHV0IFBvbGFyaXR5CisgKiBAeworICovCisjZGVmaW5lIFRJTV9DTEVBUklOUFVUUE9MQVJJVFlfSU5WRVJURUQgXAorICBUSU1fRVRSUE9MQVJJVFlfSU5WRVJURUQgLyohPCBQb2xhcml0eSBmb3IgRVRSeCBwaW4gKi8KKyNkZWZpbmUgVElNX0NMRUFSSU5QVVRQT0xBUklUWV9OT05JTlZFUlRFRCBcCisgIFRJTV9FVFJQT0xBUklUWV9OT05JTlZFUlRFRCAvKiE8IFBvbGFyaXR5IGZvciBFVFJ4IHBpbiAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0NsZWFySW5wdXRfUHJlc2NhbGVyIFRJTSBDbGVhciBJbnB1dCBQcmVzY2FsZXIKKyAqIEB7CisgKi8KKyNkZWZpbmUgVElNX0NMRUFSSU5QVVRQUkVTQ0FMRVJfRElWMSBcCisgIFRJTV9FVFJQUkVTQ0FMRVJfRElWMSAvKiE8IE5vIHByZXNjYWxlciBpcyB1c2VkICovCisjZGVmaW5lIFRJTV9DTEVBUklOUFVUUFJFU0NBTEVSX0RJVjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUSU1fRVRSUFJFU0NBTEVSX0RJVjIgLyohPCBQcmVzY2FsZXIgZm9yIEV4dGVybmFsIEVUUiBwaW46IENhcHR1cmUgcGVyZm9ybWVkIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uY2UgZXZlcnkgMiBldmVudHMuICovCisjZGVmaW5lIFRJTV9DTEVBUklOUFVUUFJFU0NBTEVSX0RJVjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUSU1fRVRSUFJFU0NBTEVSX0RJVjQgLyohPCBQcmVzY2FsZXIgZm9yIEV4dGVybmFsIEVUUiBwaW46IENhcHR1cmUgcGVyZm9ybWVkIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uY2UgZXZlcnkgNCBldmVudHMuICovCisjZGVmaW5lIFRJTV9DTEVBUklOUFVUUFJFU0NBTEVSX0RJVjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUSU1fRVRSUFJFU0NBTEVSX0RJVjggLyohPCBQcmVzY2FsZXIgZm9yIEV4dGVybmFsIEVUUiBwaW46IENhcHR1cmUgcGVyZm9ybWVkIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uY2UgZXZlcnkgOCBldmVudHMuICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1fT1NTUl9PZmZfU3RhdGVfU2VsZWN0aW9uX2Zvcl9SdW5fbW9kZV9zdGF0ZSBUSU0gT1NTUiBPZmZTdGF0ZQorICogU2VsZWN0aW9uIGZvciBSdW4gbW9kZSBzdGF0ZQorICogQHsKKyAqLworI2RlZmluZSBUSU1fT1NTUl9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVElNX0JEVFJfT1NTUiAvKiE8IFdoZW4gaW5hY3RpdmUsIE9DL09DTiBvdXRwdXRzIGFyZSBlbmFibGVkIChzdGlsbCBcCisgICAgICAgICAgICAgICAgICAgY29udHJvbGxlZCBieSB0aGUgdGltZXIpICAgICAgICAgICAqLworI2RlZmluZSBUSU1fT1NTUl9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAweDAwMDAwMDAwVSAvKiE8IFdoZW4gaW5hY3RpdmUsIE9DL09DTiBvdXRwdXRzIGFyZSBkaXNhYmxlZCAobm90IGNvbnRyb2xsZWQgXAorICAgICAgICAgICAgICAgICBhbnkgbG9uZ2VyIGJ5IHRoZSB0aW1lcikgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFRJTV9PU1NJX09mZl9TdGF0ZV9TZWxlY3Rpb25fZm9yX0lkbGVfbW9kZV9zdGF0ZSBUSU0gT1NTSSBPZmZTdGF0ZQorICogU2VsZWN0aW9uIGZvciBJZGxlIG1vZGUgc3RhdGUKKyAqIEB7CisgKi8KKyNkZWZpbmUgVElNX09TU0lfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRJTV9CRFRSX09TU0kgLyohPCBXaGVuIGluYWN0aXZlLCBPQy9PQ04gb3V0cHV0cyBhcmUgZW5hYmxlZCAoc3RpbGwgXAorICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZWQgYnkgdGhlIHRpbWVyKSAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX09TU0lfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBXaGVuIGluYWN0aXZlLCBPQy9PQ04gb3V0cHV0cyBhcmUgZGlzYWJsZWQgKG5vdCBjb250cm9sbGVkIFwKKyAgICAgICAgICAgICAgICAgYW55IGxvbmdlciBieSB0aGUgdGltZXIpICovCisvKioKKyAqIEB9CisgKi8KKy8qKiBAZGVmZ3JvdXAgVElNX0xvY2tfbGV2ZWwgIFRJTSBMb2NrIGxldmVsCisgKiBAeworICovCisjZGVmaW5lIFRJTV9MT0NLTEVWRUxfT0ZGIDB4MDAwMDAwMDBVICAgLyohPCBMT0NLIE9GRiAgICAgKi8KKyNkZWZpbmUgVElNX0xPQ0tMRVZFTF8xIFRJTV9CRFRSX0xPQ0tfMCAvKiE8IExPQ0sgTGV2ZWwgMSAqLworI2RlZmluZSBUSU1fTE9DS0xFVkVMXzIgVElNX0JEVFJfTE9DS18xIC8qITwgTE9DSyBMZXZlbCAyICovCisjZGVmaW5lIFRJTV9MT0NLTEVWRUxfMyBUSU1fQkRUUl9MT0NLICAgLyohPCBMT0NLIExldmVsIDMgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFRJTV9CcmVha19JbnB1dF9lbmFibGVfZGlzYWJsZSBUSU0gQnJlYWsgSW5wdXQgRW5hYmxlCisgKiBAeworICovCisjZGVmaW5lIFRJTV9CUkVBS19FTkFCTEUgVElNX0JEVFJfQktFIC8qITwgQnJlYWsgaW5wdXQgQlJLIGlzIGVuYWJsZWQgICovCisjZGVmaW5lIFRJTV9CUkVBS19ESVNBQkxFIDB4MDAwMDAwMDBVIC8qITwgQnJlYWsgaW5wdXQgQlJLIGlzIGRpc2FibGVkICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1fQnJlYWtfUG9sYXJpdHkgVElNIEJyZWFrIElucHV0IFBvbGFyaXR5CisgKiBAeworICovCisjZGVmaW5lIFRJTV9CUkVBS1BPTEFSSVRZX0xPVyAgICAgICAgICAgICAgICAgICAgXAorICAweDAwMDAwMDAwVSAvKiE8IEJyZWFrIGlucHV0IEJSSyBpcyBhY3RpdmUgbG93IFwKKyAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9CUkVBS1BPTEFSSVRZX0hJR0ggXAorICBUSU1fQkRUUl9CS1AgLyohPCBCcmVhayBpbnB1dCBCUksgaXMgYWN0aXZlIGhpZ2ggKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFRJTV9CcmVha19JbnB1dF9BRl9Nb2RlIFRJTSBCcmVhayBJbnB1dCBBbHRlcm5hdGUgRnVuY3Rpb24gTW9kZQorICogQHsKKyAqLworI2RlZmluZSBUSU1fQlJFQUtfQUZNT0RFX0lOUFVUICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBCcmVhayBpbnB1dCBCUksgaW4gaW5wdXQgbW9kZSBcCisgICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fQlJFQUtfQUZNT0RFX0JJRElSRUNUSU9OQUwgXAorICBUSU1fQkRUUl9CS0JJRCAvKiE8IEJyZWFrIGlucHV0IEJSSyBpbiBiaWRpcmVjdGlvbmFsIG1vZGUgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFRJTV9CcmVhazJfSW5wdXRfZW5hYmxlX2Rpc2FibGUgVElNIEJyZWFrIGlucHV0IDIgRW5hYmxlCisgKiBAeworICovCisjZGVmaW5lIFRJTV9CUkVBSzJfRElTQUJMRSAweDAwMDAwMDAwVSAgLyohPCBCcmVhayBpbnB1dCBCUksyIGlzIGRpc2FibGVkICAqLworI2RlZmluZSBUSU1fQlJFQUsyX0VOQUJMRSBUSU1fQkRUUl9CSzJFIC8qITwgQnJlYWsgaW5wdXQgQlJLMiBpcyBlbmFibGVkICAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0JyZWFrMl9Qb2xhcml0eSBUSU0gQnJlYWsgSW5wdXQgMiBQb2xhcml0eQorICogQHsKKyAqLworI2RlZmluZSBUSU1fQlJFQUsyUE9MQVJJVFlfTE9XIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBCcmVhayBpbnB1dCBCUksyIGlzIGFjdGl2ZSBsb3cgICAqLworI2RlZmluZSBUSU1fQlJFQUsyUE9MQVJJVFlfSElHSCBcCisgIFRJTV9CRFRSX0JLMlAgLyohPCBCcmVhayBpbnB1dCBCUksyIGlzIGFjdGl2ZSBoaWdoICAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0JyZWFrMl9JbnB1dF9BRl9Nb2RlIFRJTSBCcmVhazIgSW5wdXQgQWx0ZXJuYXRlIEZ1bmN0aW9uIE1vZGUKKyAqIEB7CisgKi8KKyNkZWZpbmUgVElNX0JSRUFLMl9BRk1PREVfSU5QVVQgXAorICAweDAwMDAwMDAwVSAvKiE8IEJyZWFrMiBpbnB1dCBCUksyIGluIGlucHV0IG1vZGUgKi8KKyNkZWZpbmUgVElNX0JSRUFLMl9BRk1PREVfQklESVJFQ1RJT05BTCBcCisgIFRJTV9CRFRSX0JLMkJJRCAvKiE8IEJyZWFrMiBpbnB1dCBCUksyIGluIGJpZGlyZWN0aW9uYWwgbW9kZSAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0FPRV9CaXRfU2V0X1Jlc2V0IFRJTSBBdXRvbWF0aWMgT3V0cHV0IEVuYWJsZQorICogQHsKKyAqLworI2RlZmluZSBUSU1fQVVUT01BVElDT1VUUFVUX0RJU0FCTEUgXAorICAweDAwMDAwMDAwVSAvKiE8IE1PRSBjYW4gYmUgc2V0IG9ubHkgYnkgc29mdHdhcmUgKi8KKyNkZWZpbmUgVElNX0FVVE9NQVRJQ09VVFBVVF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRJTV9CRFRSX0FPRSAvKiE8IE1PRSBjYW4gYmUgc2V0IGJ5IHNvZnR3YXJlIG9yIGF1dG9tYXRpY2FsbHkgYXQgdGhlIG5leHQgXAorICAgICAgICAgICAgICAgICAgdXBkYXRlIGV2ZW50IChpZiBub25lIG9mIHRoZSBicmVhayBpbnB1dHMgQlJLIGFuZCBCUksyIGlzIFwKKyAgICAgICAgICAgICAgICAgIGFjdGl2ZSkgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFRJTV9Hcm91cF9DaGFubmVsNSBUSU0gR3JvdXAgQ2hhbm5lbCA1IGFuZCBDaGFubmVsIDEsIDIgb3IgMworICogQHsKKyAqLworI2RlZmluZSBUSU1fR1JPVVBDSDVfTk9ORSBcCisgIDB4MDAwMDAwMDBVIC8qITwgTm8gZWZmZWN0IG9mIE9DNVJFRiBvbiBPQzFSRUZDLCBPQzJSRUZDIGFuZCBPQzNSRUZDICovCisjZGVmaW5lIFRJTV9HUk9VUENINV9PQzFSRUZDIFwKKyAgVElNX0NDUjVfR0M1QzEgLyohPCBPQzFSRUZDIGlzIHRoZSBsb2dpY2FsIEFORCBvZiBPQzFSRUZDIGFuZCBPQzVSRUYgICAgKi8KKyNkZWZpbmUgVElNX0dST1VQQ0g1X09DMlJFRkMgXAorICBUSU1fQ0NSNV9HQzVDMiAvKiE8IE9DMlJFRkMgaXMgdGhlIGxvZ2ljYWwgQU5EIG9mIE9DMlJFRkMgYW5kIE9DNVJFRiAgICAqLworI2RlZmluZSBUSU1fR1JPVVBDSDVfT0MzUkVGQyBcCisgIFRJTV9DQ1I1X0dDNUMzIC8qITwgT0MzUkVGQyBpcyB0aGUgbG9naWNhbCBBTkQgb2YgT0MzUkVGQyBhbmQgT0M1UkVGICAgICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTWFzdGVyX01vZGVfU2VsZWN0aW9uIFRJTSBNYXN0ZXIgTW9kZSBTZWxlY3Rpb24KKyAqIEB7CisgKi8KKyNkZWZpbmUgVElNX1RSR09fUkVTRVQgXAorICAweDAwMDAwMDAwVSAvKiE8IFRJTXhfRUdSLlVHIGJpdCBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0IChUUkdPKSAqLworI2RlZmluZSBUSU1fVFJHT19FTkFCTEUgXAorICBUSU1fQ1IyX01NU18wIC8qITwgVElNeF9DUjEuQ0VOIGJpdCBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0IChUUkdPKSAqLworI2RlZmluZSBUSU1fVFJHT19VUERBVEUgXAorICBUSU1fQ1IyX01NU18xIC8qITwgVXBkYXRlIGV2ZW50IGlzIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQgKFRSR08pICovCisjZGVmaW5lIFRJTV9UUkdPX09DMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoVElNX0NSMl9NTVNfMSB8IFRJTV9DUjJfTU1TXzApIC8qITwgQ2FwdHVyZSBvciBhIGNvbXBhcmUgbWF0Y2ggMSBpcyB1c2VkIGFzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyIG91dHB1dCAoVFJHTykgKi8KKyNkZWZpbmUgVElNX1RSR09fT0MxUkVGIFwKKyAgVElNX0NSMl9NTVNfMiAvKiE8IE9DMVJFRiBzaWduYWwgaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAoVFJHTykgKi8KKyNkZWZpbmUgVElNX1RSR09fT0MyUkVGIFwKKyAgKFRJTV9DUjJfTU1TXzIgfCAgICAgIFwKKyAgIFRJTV9DUjJfTU1TXzApIC8qITwgT0MyUkVGIHNpZ25hbCBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0KFRSR08pICovCisjZGVmaW5lIFRJTV9UUkdPX09DM1JFRiBcCisgIChUSU1fQ1IyX01NU18yIHwgICAgICBcCisgICBUSU1fQ1IyX01NU18xKSAvKiE8IE9DM1JFRiBzaWduYWwgaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dChUUkdPKSAqLworI2RlZmluZSBUSU1fVFJHT19PQzRSRUYgICAgICAgICAgICBcCisgIChUSU1fQ1IyX01NU18yIHwgVElNX0NSMl9NTVNfMSB8IFwKKyAgIFRJTV9DUjJfTU1TXzApIC8qITwgT0M0UkVGIHNpZ25hbCBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0KFRSR08pICovCisjZGVmaW5lIFRJTV9UUkdPX0VOQ09ERVJfQ0xLIFwKKyAgVElNX0NSMl9NTVNfMyAvKiE8IEVuY29kZXIgY2xvY2sgaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dChUUkdPKSAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX01hc3Rlcl9Nb2RlX1NlbGVjdGlvbl8yIFRJTSBNYXN0ZXIgTW9kZSBTZWxlY3Rpb24gMiAoVFJHTzIpCisgKiBAeworICovCisjZGVmaW5lIFRJTV9UUkdPMl9SRVNFVCBcCisgIDB4MDAwMDAwMDBVIC8qITwgVElNeF9FR1IuVUcgYml0IGlzIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQgKFRSR08yKSAqLworI2RlZmluZSBUSU1fVFJHTzJfRU5BQkxFIFwKKyAgVElNX0NSMl9NTVMyXzAgLyohPCBUSU14X0NSMS5DRU4gYml0IGlzIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQgKFRSR08yKSAqLworI2RlZmluZSBUSU1fVFJHTzJfVVBEQVRFIFwKKyAgVElNX0NSMl9NTVMyXzEgLyohPCBVcGRhdGUgZXZlbnQgaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAoVFJHTzIpICovCisjZGVmaW5lIFRJTV9UUkdPMl9PQzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChUSU1fQ1IyX01NUzJfMSB8IFRJTV9DUjJfTU1TMl8wKSAvKiE8IENhcHR1cmUgb3IgYSBjb21wYXJlIG1hdGNoIDEgaXMgdXNlZCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcyB0cmlnZ2VyIG91dHB1dCAoVFJHTzIpICovCisjZGVmaW5lIFRJTV9UUkdPMl9PQzFSRUYgXAorICBUSU1fQ1IyX01NUzJfMiAvKiE8IE9DMVJFRiBzaWduYWwgaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAoVFJHTzIpICovCisjZGVmaW5lIFRJTV9UUkdPMl9PQzJSRUYgXAorICAoVElNX0NSMl9NTVMyXzIgfCAgICAgIFwKKyAgIFRJTV9DUjJfTU1TMl8wKSAvKiE8IE9DMlJFRiBzaWduYWwgaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAoVFJHTzIpICovCisjZGVmaW5lIFRJTV9UUkdPMl9PQzNSRUYgXAorICAoVElNX0NSMl9NTVMyXzIgfCAgICAgIFwKKyAgIFRJTV9DUjJfTU1TMl8xKSAvKiE8IE9DM1JFRiBzaWduYWwgaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAoVFJHTzIpICovCisjZGVmaW5lIFRJTV9UUkdPMl9PQzRSRUYgICAgICAgICAgICAgXAorICAoVElNX0NSMl9NTVMyXzIgfCBUSU1fQ1IyX01NUzJfMSB8IFwKKyAgIFRJTV9DUjJfTU1TMl8wKSAvKiE8IE9DNFJFRiBzaWduYWwgaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAoVFJHTzIpICovCisjZGVmaW5lIFRJTV9UUkdPMl9PQzVSRUYgXAorICBUSU1fQ1IyX01NUzJfMyAvKiE8IE9DNVJFRiBzaWduYWwgaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAoVFJHTzIpICovCisjZGVmaW5lIFRJTV9UUkdPMl9PQzZSRUYgXAorICAoVElNX0NSMl9NTVMyXzMgfCAgICAgIFwKKyAgIFRJTV9DUjJfTU1TMl8wKSAvKiE8IE9DNlJFRiBzaWduYWwgaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAoVFJHTzIpICovCisjZGVmaW5lIFRJTV9UUkdPMl9PQzRSRUZfUklTSU5HRkFMTElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChUSU1fQ1IyX01NUzJfMyB8IFRJTV9DUjJfTU1TMl8xKSAvKiE8IE9DNFJFRiByaXNpbmcgb3IgZmFsbGluZyBlZGdlcyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZSBwdWxzZXMgb24gVFJHTzIgICAgICAgICovCisjZGVmaW5lIFRJTV9UUkdPMl9PQzZSRUZfUklTSU5HRkFMTElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKFRJTV9DUjJfTU1TMl8zIHwgVElNX0NSMl9NTVMyXzEgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgVElNX0NSMl9NTVMyXzApIC8qITwgT0M2UkVGIHJpc2luZyBvciBmYWxsaW5nIGVkZ2VzIGdlbmVyYXRlIHB1bHNlcyBvbiBcCisgICAgICAgICAgICAgICAgICAgICAgVFJHTzIgICAgICAgICovCisjZGVmaW5lIFRJTV9UUkdPMl9PQzRSRUZfUklTSU5HX09DNlJFRl9SSVNJTkcgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKFRJTV9DUjJfTU1TMl8zIHwgVElNX0NSMl9NTVMyXzIpIC8qITwgT0M0UkVGIG9yIE9DNlJFRiByaXNpbmcgZWRnZXMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGUgcHVsc2VzIG9uIFRSR08yICAgICAgICAgKi8KKyNkZWZpbmUgVElNX1RSR08yX09DNFJFRl9SSVNJTkdfT0M2UkVGX0ZBTExJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKFRJTV9DUjJfTU1TMl8zIHwgVElNX0NSMl9NTVMyXzIgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIFRJTV9DUjJfTU1TMl8wKSAvKiE8IE9DNFJFRiByaXNpbmcgb3IgT0M2UkVGIGZhbGxpbmcgZWRnZXMgZ2VuZXJhdGUgcHVsc2VzIFwKKyAgICAgICAgICAgICAgICAgICAgICBvbiBUUkdPMiAqLworI2RlZmluZSBUSU1fVFJHTzJfT0M1UkVGX1JJU0lOR19PQzZSRUZfUklTSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKFRJTV9DUjJfTU1TMl8zIHwgVElNX0NSMl9NTVMyXzIgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBUSU1fQ1IyX01NUzJfMSkgLyohPCBPQzVSRUYgb3IgT0M2UkVGIHJpc2luZyBlZGdlcyBnZW5lcmF0ZSBwdWxzZXMgb24gVFJHTzIgXAorICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fVFJHTzJfT0M1UkVGX1JJU0lOR19PQzZSRUZfRkFMTElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKFRJTV9DUjJfTU1TMl8zIHwgVElNX0NSMl9NTVMyXzIgfCBUSU1fQ1IyX01NUzJfMSB8ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBUSU1fQ1IyX01NUzJfMCkgLyohPCBPQzVSRUYgb3IgT0M2UkVGIHJpc2luZyBlZGdlcyBnZW5lcmF0ZSBwdWxzZXMgb24gVFJHTzIgXAorICAgICAgICAgICAgICAgICAgICAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX01hc3Rlcl9TbGF2ZV9Nb2RlIFRJTSBNYXN0ZXIvU2xhdmUgTW9kZQorICogQHsKKyAqLworI2RlZmluZSBUSU1fTUFTVEVSU0xBVkVNT0RFX0VOQUJMRSBUSU1fU01DUl9NU00gLyohPCBObyBhY3Rpb24gKi8KKyNkZWZpbmUgVElNX01BU1RFUlNMQVZFTU9ERV9ESVNBQkxFIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBNYXN0ZXIvc2xhdmUgbW9kZSBpcyBzZWxlY3RlZCAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX1NsYXZlX01vZGUgVElNIFNsYXZlIG1vZGUKKyAqIEB7CisgKi8KKyNkZWZpbmUgVElNX1NMQVZFTU9ERV9ESVNBQkxFIDB4MDAwMDAwMDBVICAvKiE8IFNsYXZlIG1vZGUgZGlzYWJsZWQgICovCisjZGVmaW5lIFRJTV9TTEFWRU1PREVfUkVTRVQgVElNX1NNQ1JfU01TXzIgLyohPCBSZXNldCBNb2RlICovCisjZGVmaW5lIFRJTV9TTEFWRU1PREVfR0FURUQgXAorICAoVElNX1NNQ1JfU01TXzIgfCBUSU1fU01DUl9TTVNfMCkgLyohPCBHYXRlZCBNb2RlICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fU0xBVkVNT0RFX1RSSUdHRVIgXAorICAoVElNX1NNQ1JfU01TXzIgfCBUSU1fU01DUl9TTVNfMSkgLyohPCBUcmlnZ2VyIE1vZGUgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fU0xBVkVNT0RFX0VYVEVSTkFMMSAgICAgIFwKKyAgKFRJTV9TTUNSX1NNU18yIHwgVElNX1NNQ1JfU01TXzEgfCBcCisgICBUSU1fU01DUl9TTVNfMCkgLyohPCBFeHRlcm5hbCBDbG9jayBNb2RlIDEgICAgICAgICAqLworI2RlZmluZSBUSU1fU0xBVkVNT0RFX0NPTUJJTkVEX1JFU0VUVFJJR0dFUiBcCisgIFRJTV9TTUNSX1NNU18zIC8qITwgQ29tYmluZWQgcmVzZXQgKyB0cmlnZ2VyIG1vZGUgKi8KKyNkZWZpbmUgVElNX1NMQVZFTU9ERV9DT01CSU5FRF9HQVRFRFJFU0VUIFwKKyAgKFRJTV9TTUNSX1NNU18zIHwgVElNX1NNQ1JfU01TXzApIC8qITwgQ29tYmluZWQgZ2F0ZWQgKyByZXNldCBtb2RlICAgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFRJTV9PdXRwdXRfQ29tcGFyZV9hbmRfUFdNX21vZGVzIFRJTSBPdXRwdXQgQ29tcGFyZSBhbmQgUFdNIE1vZGVzCisgKiBAeworICovCisjZGVmaW5lIFRJTV9PQ01PREVfVElNSU5HIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBGcm96ZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fT0NNT0RFX0FDVElWRSBcCisgIFRJTV9DQ01SMV9PQzFNXzAgLyohPCBTZXQgY2hhbm5lbCB0byBhY3RpdmUgbGV2ZWwgb24gbWF0Y2ggICAqLworI2RlZmluZSBUSU1fT0NNT0RFX0lOQUNUSVZFIFwKKyAgVElNX0NDTVIxX09DMU1fMSAvKiE8IFNldCBjaGFubmVsIHRvIGluYWN0aXZlIGxldmVsIG9uIG1hdGNoICovCisjZGVmaW5lIFRJTV9PQ01PREVfVE9HR0xFIChUSU1fQ0NNUjFfT0MxTV8xIHwgVElNX0NDTVIxX09DMU1fMCkgLyohPCBUb2dnbGUgKi8KKyNkZWZpbmUgVElNX09DTU9ERV9QV00xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoVElNX0NDTVIxX09DMU1fMiB8IFRJTV9DQ01SMV9PQzFNXzEpIC8qITwgUFdNIG1vZGUgMSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9PQ01PREVfUFdNMiBcCisgIChUSU1fQ0NNUjFfT0MxTV8yIHwgVElNX0NDTVIxX09DMU1fMSB8IFRJTV9DQ01SMV9PQzFNXzApIC8qITwgUFdNIG1vZGUgMiAqLworI2RlZmluZSBUSU1fT0NNT0RFX0ZPUkNFRF9BQ1RJVkUgXAorICAoVElNX0NDTVIxX09DMU1fMiB8IFRJTV9DQ01SMV9PQzFNXzApIC8qITwgRm9yY2UgYWN0aXZlIGxldmVsICovCisjZGVmaW5lIFRJTV9PQ01PREVfRk9SQ0VEX0lOQUNUSVZFIFwKKyAgVElNX0NDTVIxX09DMU1fMiAvKiE8IEZvcmNlIGluYWN0aXZlIGxldmVsICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9PQ01PREVfUkVUUklHRVJSQUJMRV9PUE0xIFwKKyAgVElNX0NDTVIxX09DMU1fMyAvKiE8IFJldHJpZ2VycmFibGUgT1BNIG1vZGUgMSAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9PQ01PREVfUkVUUklHRVJSQUJMRV9PUE0yIFwKKyAgKFRJTV9DQ01SMV9PQzFNXzMgfCBUSU1fQ0NNUjFfT0MxTV8wKSAvKiE8IFJldHJpZ2VycmFibGUgT1BNIG1vZGUgMiAqLworI2RlZmluZSBUSU1fT0NNT0RFX0NPTUJJTkVEX1BXTTEgXAorICAoVElNX0NDTVIxX09DMU1fMyB8IFRJTV9DQ01SMV9PQzFNXzIpIC8qITwgQ29tYmluZWQgUFdNIG1vZGUgMSAqLworI2RlZmluZSBUSU1fT0NNT0RFX0NPTUJJTkVEX1BXTTIgICAgICAgICBcCisgIChUSU1fQ0NNUjFfT0MxTV8zIHwgVElNX0NDTVIxX09DMU1fMCB8IFwKKyAgIFRJTV9DQ01SMV9PQzFNXzIpIC8qITwgQ29tYmluZWQgUFdNIG1vZGUgMiAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX09DTU9ERV9BU1lNTUVUUklDX1BXTTEgICAgICAgXAorICAoVElNX0NDTVIxX09DMU1fMyB8IFRJTV9DQ01SMV9PQzFNXzEgfCBcCisgICBUSU1fQ0NNUjFfT0MxTV8yKSAvKiE8IEFzeW1tZXRyaWMgUFdNIG1vZGUgMSAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9PQ01PREVfQVNZTU1FVFJJQ19QV00yIFwKKyAgVElNX0NDTVIxX09DMU0gLyohPCBBc3ltbWV0cmljIFBXTSBtb2RlIDIgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fT0NNT0RFX1BVTFNFX09OX0NPTVBBUkUgXAorICAoVElNX0NDTVIyX09DM01fMyB8ICAgICAgICAgICAgICAgXAorICAgVElNX0NDTVIyX09DM01fMSkgLyohPCBQdWxzZSBvbiBjb21wYXJlIChDSDMmQ0g0IG9ubHkpICAgICAgICAqLworI2RlZmluZSBUSU1fT0NNT0RFX0RJUkVDVElPTl9PVVRQVVQgICAgICBcCisgIChUSU1fQ0NNUjJfT0MzTV8zIHwgVElNX0NDTVIyX09DM01fMSB8IFwKKyAgIFRJTV9DQ01SMl9PQzNNXzApIC8qITwgRGlyZWN0aW9uIG91dHB1dCAoQ0gzJkNINCBvbmx5KSAgICAgICAgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFRJTV9UcmlnZ2VyX1NlbGVjdGlvbiBUSU0gVHJpZ2dlciBTZWxlY3Rpb24KKyAqIEB7CisgKi8KKyNkZWZpbmUgVElNX1RTX0lUUjAgMHgwMDAwMDAwMFUgICAvKiE8IEludGVybmFsIFRyaWdnZXIgMCAoSVRSMCkgICAgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9UU19JVFIxIFRJTV9TTUNSX1RTXzAgLyohPCBJbnRlcm5hbCBUcmlnZ2VyIDEgKElUUjEpICovCisjZGVmaW5lIFRJTV9UU19JVFIyIFRJTV9TTUNSX1RTXzEgLyohPCBJbnRlcm5hbCBUcmlnZ2VyIDIgKElUUjIpICovCisjZGVmaW5lIFRJTV9UU19JVFIzIFwKKyAgKFRJTV9TTUNSX1RTXzAgfCBUSU1fU01DUl9UU18xKSAvKiE8IEludGVybmFsIFRyaWdnZXIgMyAoSVRSMykgKi8KKyNpZiBkZWZpbmVkKFRJTTUpCisjZGVmaW5lIFRJTV9UU19JVFI0IFRJTV9TTUNSX1RTXzMgLyohPCBJbnRlcm5hbCBUcmlnZ2VyIDQgKElUUjkpICovCisjZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVElNNSAqLworI2RlZmluZSBUSU1fVFNfSVRSNSBcCisgIChUSU1fU01DUl9UU18wIHwgVElNX1NNQ1JfVFNfMykgLyohPCBJbnRlcm5hbCBUcmlnZ2VyIDUgKElUUjUpICovCisjZGVmaW5lIFRJTV9UU19JVFI2IFwKKyAgKFRJTV9TTUNSX1RTXzEgfCBUSU1fU01DUl9UU18zKSAvKiE8IEludGVybmFsIFRyaWdnZXIgNiAoSVRSNikgKi8KKyNkZWZpbmUgVElNX1RTX0lUUjcgICAgICAgICAgICAgICAgXAorICAoVElNX1NNQ1JfVFNfMCB8IFRJTV9TTUNSX1RTXzEgfCBcCisgICBUSU1fU01DUl9UU18zKSAvKiE8IEludGVybmFsIFRyaWdnZXIgNyAoSVRSNykgICAgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9UU19JVFI4IFwKKyAgKFRJTV9TTUNSX1RTXzIgfCBUSU1fU01DUl9UU18zKSAvKiE8IEludGVybmFsIFRyaWdnZXIgOCAoSVRSOCkgKi8KKyNpZiBkZWZpbmVkKFRJTTIwKQorI2RlZmluZSBUSU1fVFNfSVRSOSAgICAgICAgICAgICAgICBcCisgIChUSU1fU01DUl9UU18wIHwgVElNX1NNQ1JfVFNfMiB8IFwKKyAgIFRJTV9TTUNSX1RTXzMpIC8qITwgSW50ZXJuYWwgVHJpZ2dlciA5IChJVFI5KSAgICAgICAgICAgICAgKi8KKyNlbmRpZiAgICAgICAgICAgIC8qIFRJTTIwICovCisjZGVmaW5lIFRJTV9UU19JVFIxMCAgICAgICAgICAgICAgIFwKKyAgKFRJTV9TTUNSX1RTXzEgfCBUSU1fU01DUl9UU18yIHwgXAorICAgVElNX1NNQ1JfVFNfMykgLyohPCBJbnRlcm5hbCBUcmlnZ2VyIDEwIChJVFIxMCkgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fVFNfSVRSMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoVElNX1NNQ1JfVFNfMCB8IFRJTV9TTUNSX1RTXzEgfCBUSU1fU01DUl9UU18yIHwgXAorICAgVElNX1NNQ1JfVFNfMykgLyohPCBJbnRlcm5hbCBUcmlnZ2VyIDExIChJVFIxMSkgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fVFNfVEkxRl9FRCBcCisgIFRJTV9TTUNSX1RTXzIgLyohPCBUSTEgRWRnZSBEZXRlY3RvciAoVEkxRl9FRCkgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fVFNfVEkxRlAxIFwKKyAgKFRJTV9TTUNSX1RTXzAgfCBUSU1fU01DUl9UU18yKSAvKiE8IEZpbHRlcmVkIFRpbWVyIElucHV0IDEgKFRJMUZQMSkgKi8KKyNkZWZpbmUgVElNX1RTX1RJMkZQMiBcCisgIChUSU1fU01DUl9UU18xIHwgVElNX1NNQ1JfVFNfMikgLyohPCBGaWx0ZXJlZCBUaW1lciBJbnB1dCAyIChUSTJGUDIpICovCisjZGVmaW5lIFRJTV9UU19FVFJGICAgICAgICAgICAgICAgIFwKKyAgKFRJTV9TTUNSX1RTXzAgfCBUSU1fU01DUl9UU18xIHwgXAorICAgVElNX1NNQ1JfVFNfMikgICAgICAgICAgICAgICAvKiE8IEZpbHRlcmVkIEV4dGVybmFsIFRyaWdnZXIgaW5wdXQgKEVUUkYpICovCisjZGVmaW5lIFRJTV9UU19OT05FIDB4MDAwMEZGRkZVIC8qITwgTm8gdHJpZ2dlciBzZWxlY3RlZCAgICAgICAgICAgICAgICAgICAgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFRJTV9UcmlnZ2VyX1BvbGFyaXR5IFRJTSBUcmlnZ2VyIFBvbGFyaXR5CisgKiBAeworICovCisjZGVmaW5lIFRJTV9UUklHR0VSUE9MQVJJVFlfSU5WRVJURUQgXAorICBUSU1fRVRSUE9MQVJJVFlfSU5WRVJURUQgLyohPCBQb2xhcml0eSBmb3IgRVRSeCB0cmlnZ2VyIHNvdXJjZXMgKi8KKyNkZWZpbmUgVElNX1RSSUdHRVJQT0xBUklUWV9OT05JTlZFUlRFRCBcCisgIFRJTV9FVFJQT0xBUklUWV9OT05JTlZFUlRFRCAvKiE8IFBvbGFyaXR5IGZvciBFVFJ4IHRyaWdnZXIgc291cmNlcyAqLworI2RlZmluZSBUSU1fVFJJR0dFUlBPTEFSSVRZX1JJU0lORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRJTV9JTlBVVENIQU5ORUxQT0xBUklUWV9SSVNJTkcgLyohPCBQb2xhcml0eSBmb3IgVEl4RlB4IG9yIFRJMV9FRCB0cmlnZ2VyIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzICovCisjZGVmaW5lIFRJTV9UUklHR0VSUE9MQVJJVFlfRkFMTElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRJTV9JTlBVVENIQU5ORUxQT0xBUklUWV9GQUxMSU5HIC8qITwgUG9sYXJpdHkgZm9yIFRJeEZQeCBvciBUSTFfRUQgdHJpZ2dlciBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXMgKi8KKyNkZWZpbmUgVElNX1RSSUdHRVJQT0xBUklUWV9CT1RIRURHRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRJTV9JTlBVVENIQU5ORUxQT0xBUklUWV9CT1RIRURHRSAvKiE8IFBvbGFyaXR5IGZvciBUSXhGUHggb3IgVEkxX0VEIHRyaWdnZXIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcyAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX1RyaWdnZXJfUHJlc2NhbGVyIFRJTSBUcmlnZ2VyIFByZXNjYWxlcgorICogQHsKKyAqLworI2RlZmluZSBUSU1fVFJJR0dFUlBSRVNDQUxFUl9ESVYxIFwKKyAgVElNX0VUUlBSRVNDQUxFUl9ESVYxIC8qITwgTm8gcHJlc2NhbGVyIGlzIHVzZWQgKi8KKyNkZWZpbmUgVElNX1RSSUdHRVJQUkVTQ0FMRVJfRElWMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRJTV9FVFJQUkVTQ0FMRVJfRElWMiAvKiE8IFByZXNjYWxlciBmb3IgRXh0ZXJuYWwgRVRSIFRyaWdnZXI6IENhcHR1cmUgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybWVkIG9uY2UgZXZlcnkgMiBldmVudHMuICovCisjZGVmaW5lIFRJTV9UUklHR0VSUFJFU0NBTEVSX0RJVjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUSU1fRVRSUFJFU0NBTEVSX0RJVjQgLyohPCBQcmVzY2FsZXIgZm9yIEV4dGVybmFsIEVUUiBUcmlnZ2VyOiBDYXB0dXJlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1lZCBvbmNlIGV2ZXJ5IDQgZXZlbnRzLiAqLworI2RlZmluZSBUSU1fVFJJR0dFUlBSRVNDQUxFUl9ESVY4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVElNX0VUUlBSRVNDQUxFUl9ESVY4IC8qITwgUHJlc2NhbGVyIGZvciBFeHRlcm5hbCBFVFIgVHJpZ2dlcjogQ2FwdHVyZSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtZWQgb25jZSBldmVyeSA4IGV2ZW50cy4gKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFRJTV9USTFfU2VsZWN0aW9uIFRJTSBUSTEgSW5wdXQgU2VsZWN0aW9uCisgKiBAeworICovCisjZGVmaW5lIFRJTV9USTFTRUxFQ1RJT05fQ0gxIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBUaGUgVElNeF9DSDEgcGluIGlzIGNvbm5lY3RlZCB0byBUSTEgaW5wdXQgKi8KKyNkZWZpbmUgVElNX1RJMVNFTEVDVElPTl9YT1JDT01CSU5BVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRJTV9DUjJfVEkxUyAvKiE8IFRoZSBUSU14X0NIMSwgQ0gyIGFuZCBDSDMgcGlucyBhcmUgY29ubmVjdGVkIHRvIHRoZSBUSTEgXAorICAgICAgICAgICAgICAgICAgaW5wdXQgKFhPUiBjb21iaW5hdGlvbikgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFRJTV9ETUFfQnVyc3RfTGVuZ3RoIFRJTSBETUEgQnVyc3QgTGVuZ3RoCisgKiBAeworICovCisjZGVmaW5lIFRJTV9ETUFCVVJTVExFTkdUSF8xVFJBTlNGRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAweDAwMDAwMDAwVSAvKiE8IFRoZSB0cmFuc2ZlciBpcyBkb25lIHRvIDEgcmVnaXN0ZXIgc3RhcnRpbmcgZnJvbSBUSU14X0NSMSArIFwKKyAgICAgICAgICAgICAgICAgVElNeF9EQ1IuREJBICAgKi8KKyNkZWZpbmUgVElNX0RNQUJVUlNUTEVOR1RIXzJUUkFOU0ZFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwMDAwMDEwMFUgLyohPCBUaGUgdHJhbnNmZXIgaXMgZG9uZSB0byAyIHJlZ2lzdGVycyBzdGFydGluZyBmcm9tIFRJTXhfQ1IxIFwKKyAgICAgICAgICAgICAgICAgKyBUSU14X0RDUi5EQkEgICovCisjZGVmaW5lIFRJTV9ETUFCVVJTVExFTkdUSF8zVFJBTlNGRVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMDAyMDBVIC8qITwgVGhlIHRyYW5zZmVyIGlzIGRvbmUgdG8gMyByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSBUSU14X0NSMSBcCisgICAgICAgICAgICAgICAgICsgVElNeF9EQ1IuREJBICAqLworI2RlZmluZSBUSU1fRE1BQlVSU1RMRU5HVEhfNFRSQU5TRkVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAweDAwMDAwMzAwVSAvKiE8IFRoZSB0cmFuc2ZlciBpcyBkb25lIHRvIDQgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gVElNeF9DUjEgXAorICAgICAgICAgICAgICAgICArIFRJTXhfRENSLkRCQSAgKi8KKyNkZWZpbmUgVElNX0RNQUJVUlNUTEVOR1RIXzVUUkFOU0ZFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwMDAwMDQwMFUgLyohPCBUaGUgdHJhbnNmZXIgaXMgZG9uZSB0byA1IHJlZ2lzdGVycyBzdGFydGluZyBmcm9tIFRJTXhfQ1IxIFwKKyAgICAgICAgICAgICAgICAgKyBUSU14X0RDUi5EQkEgICovCisjZGVmaW5lIFRJTV9ETUFCVVJTVExFTkdUSF82VFJBTlNGRVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMDA1MDBVIC8qITwgVGhlIHRyYW5zZmVyIGlzIGRvbmUgdG8gNiByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSBUSU14X0NSMSBcCisgICAgICAgICAgICAgICAgICsgVElNeF9EQ1IuREJBICAqLworI2RlZmluZSBUSU1fRE1BQlVSU1RMRU5HVEhfN1RSQU5TRkVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAweDAwMDAwNjAwVSAvKiE8IFRoZSB0cmFuc2ZlciBpcyBkb25lIHRvIDcgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gVElNeF9DUjEgXAorICAgICAgICAgICAgICAgICArIFRJTXhfRENSLkRCQSAgKi8KKyNkZWZpbmUgVElNX0RNQUJVUlNUTEVOR1RIXzhUUkFOU0ZFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwMDAwMDcwMFUgLyohPCBUaGUgdHJhbnNmZXIgaXMgZG9uZSB0byA4IHJlZ2lzdGVycyBzdGFydGluZyBmcm9tIFRJTXhfQ1IxIFwKKyAgICAgICAgICAgICAgICAgKyBUSU14X0RDUi5EQkEgICovCisjZGVmaW5lIFRJTV9ETUFCVVJTVExFTkdUSF85VFJBTlNGRVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMDA4MDBVIC8qITwgVGhlIHRyYW5zZmVyIGlzIGRvbmUgdG8gOSByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSBUSU14X0NSMSBcCisgICAgICAgICAgICAgICAgICsgVElNeF9EQ1IuREJBICAqLworI2RlZmluZSBUSU1fRE1BQlVSU1RMRU5HVEhfMTBUUkFOU0ZFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwMDAwMDkwMFUgLyohPCBUaGUgdHJhbnNmZXIgaXMgZG9uZSB0byAxMCByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSBUSU14X0NSMSBcCisgICAgICAgICAgICAgICAgICsgVElNeF9EQ1IuREJBICovCisjZGVmaW5lIFRJTV9ETUFCVVJTVExFTkdUSF8xMVRSQU5TRkVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAweDAwMDAwQTAwVSAvKiE8IFRoZSB0cmFuc2ZlciBpcyBkb25lIHRvIDExIHJlZ2lzdGVycyBzdGFydGluZyBmcm9tIFRJTXhfQ1IxIFwKKyAgICAgICAgICAgICAgICAgKyBUSU14X0RDUi5EQkEgKi8KKyNkZWZpbmUgVElNX0RNQUJVUlNUTEVOR1RIXzEyVFJBTlNGRVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMDBCMDBVIC8qITwgVGhlIHRyYW5zZmVyIGlzIGRvbmUgdG8gMTIgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gVElNeF9DUjEgXAorICAgICAgICAgICAgICAgICArIFRJTXhfRENSLkRCQSAqLworI2RlZmluZSBUSU1fRE1BQlVSU1RMRU5HVEhfMTNUUkFOU0ZFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwMDAwMEMwMFUgLyohPCBUaGUgdHJhbnNmZXIgaXMgZG9uZSB0byAxMyByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSBUSU14X0NSMSBcCisgICAgICAgICAgICAgICAgICsgVElNeF9EQ1IuREJBICovCisjZGVmaW5lIFRJTV9ETUFCVVJTVExFTkdUSF8xNFRSQU5TRkVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAweDAwMDAwRDAwVSAvKiE8IFRoZSB0cmFuc2ZlciBpcyBkb25lIHRvIDE0IHJlZ2lzdGVycyBzdGFydGluZyBmcm9tIFRJTXhfQ1IxIFwKKyAgICAgICAgICAgICAgICAgKyBUSU14X0RDUi5EQkEgKi8KKyNkZWZpbmUgVElNX0RNQUJVUlNUTEVOR1RIXzE1VFJBTlNGRVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMDBFMDBVIC8qITwgVGhlIHRyYW5zZmVyIGlzIGRvbmUgdG8gMTUgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gVElNeF9DUjEgXAorICAgICAgICAgICAgICAgICArIFRJTXhfRENSLkRCQSAqLworI2RlZmluZSBUSU1fRE1BQlVSU1RMRU5HVEhfMTZUUkFOU0ZFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwMDAwMEYwMFUgLyohPCBUaGUgdHJhbnNmZXIgaXMgZG9uZSB0byAxNiByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSBUSU14X0NSMSBcCisgICAgICAgICAgICAgICAgICsgVElNeF9EQ1IuREJBICovCisjZGVmaW5lIFRJTV9ETUFCVVJTVExFTkdUSF8xN1RSQU5TRkVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAweDAwMDAxMDAwVSAvKiE8IFRoZSB0cmFuc2ZlciBpcyBkb25lIHRvIDE3IHJlZ2lzdGVycyBzdGFydGluZyBmcm9tIFRJTXhfQ1IxIFwKKyAgICAgICAgICAgICAgICAgKyBUSU14X0RDUi5EQkEgKi8KKyNkZWZpbmUgVElNX0RNQUJVUlNUTEVOR1RIXzE4VFJBTlNGRVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMDExMDBVIC8qITwgVGhlIHRyYW5zZmVyIGlzIGRvbmUgdG8gMTggcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gVElNeF9DUjEgXAorICAgICAgICAgICAgICAgICArIFRJTXhfRENSLkRCQSAqLworI2RlZmluZSBUSU1fRE1BQlVSU1RMRU5HVEhfMTlUUkFOU0ZFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwMDAwMTIwMFUgLyohPCBUaGUgdHJhbnNmZXIgaXMgZG9uZSB0byAxOSByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSBUSU14X0NSMSBcCisgICAgICAgICAgICAgICAgICsgVElNeF9EQ1IuREJBICovCisjZGVmaW5lIFRJTV9ETUFCVVJTVExFTkdUSF8yMFRSQU5TRkVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAweDAwMDAxMzAwVSAvKiE8IFRoZSB0cmFuc2ZlciBpcyBkb25lIHRvIDIwIHJlZ2lzdGVycyBzdGFydGluZyBmcm9tIFRJTXhfQ1IxIFwKKyAgICAgICAgICAgICAgICAgKyBUSU14X0RDUi5EQkEgKi8KKyNkZWZpbmUgVElNX0RNQUJVUlNUTEVOR1RIXzIxVFJBTlNGRVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMDE0MDBVIC8qITwgVGhlIHRyYW5zZmVyIGlzIGRvbmUgdG8gMjEgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gVElNeF9DUjEgXAorICAgICAgICAgICAgICAgICArIFRJTXhfRENSLkRCQSAqLworI2RlZmluZSBUSU1fRE1BQlVSU1RMRU5HVEhfMjJUUkFOU0ZFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwMDAwMTUwMFUgLyohPCBUaGUgdHJhbnNmZXIgaXMgZG9uZSB0byAyMiByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSBUSU14X0NSMSBcCisgICAgICAgICAgICAgICAgICsgVElNeF9EQ1IuREJBICovCisjZGVmaW5lIFRJTV9ETUFCVVJTVExFTkdUSF8yM1RSQU5TRkVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAweDAwMDAxNjAwVSAvKiE8IFRoZSB0cmFuc2ZlciBpcyBkb25lIHRvIDIzIHJlZ2lzdGVycyBzdGFydGluZyBmcm9tIFRJTXhfQ1IxIFwKKyAgICAgICAgICAgICAgICAgKyBUSU14X0RDUi5EQkEgKi8KKyNkZWZpbmUgVElNX0RNQUJVUlNUTEVOR1RIXzI0VFJBTlNGRVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMDE3MDBVIC8qITwgVGhlIHRyYW5zZmVyIGlzIGRvbmUgdG8gMjQgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gVElNeF9DUjEgXAorICAgICAgICAgICAgICAgICArIFRJTXhfRENSLkRCQSAqLworI2RlZmluZSBUSU1fRE1BQlVSU1RMRU5HVEhfMjVUUkFOU0ZFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwMDAwMTgwMFUgLyohPCBUaGUgdHJhbnNmZXIgaXMgZG9uZSB0byAyNSByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSBUSU14X0NSMSBcCisgICAgICAgICAgICAgICAgICsgVElNeF9EQ1IuREJBICovCisjZGVmaW5lIFRJTV9ETUFCVVJTVExFTkdUSF8yNlRSQU5TRkVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAweDAwMDAxOTAwVSAvKiE8IFRoZSB0cmFuc2ZlciBpcyBkb25lIHRvIDI2IHJlZ2lzdGVycyBzdGFydGluZyBmcm9tIFRJTXhfQ1IxIFwKKyAgICAgICAgICAgICAgICAgKyBUSU14X0RDUi5EQkEgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIERNQV9IYW5kbGVfaW5kZXggVElNIERNQSBIYW5kbGUgSW5kZXgKKyAqIEB7CisgKi8KKyNkZWZpbmUgVElNX0RNQV9JRF9VUERBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgodWludDE2X3QpMHgwMDAwKSAvKiE8IEluZGV4IG9mIHRoZSBETUEgaGFuZGxlIHVzZWQgZm9yIFVwZGF0ZSBETUEgcmVxdWVzdHMgXAorICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9ETUFfSURfQ0MxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCh1aW50MTZfdCkweDAwMDEpIC8qITwgSW5kZXggb2YgdGhlIERNQSBoYW5kbGUgdXNlZCBmb3IgQ2FwdHVyZS9Db21wYXJlIDEgXAorICAgICAgICAgICAgICAgICAgICAgICAgRE1BIHJlcXVlc3RzICovCisjZGVmaW5lIFRJTV9ETUFfSURfQ0MyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCh1aW50MTZfdCkweDAwMDIpIC8qITwgSW5kZXggb2YgdGhlIERNQSBoYW5kbGUgdXNlZCBmb3IgQ2FwdHVyZS9Db21wYXJlIDIgXAorICAgICAgICAgICAgICAgICAgICAgICAgRE1BIHJlcXVlc3RzICovCisjZGVmaW5lIFRJTV9ETUFfSURfQ0MzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCh1aW50MTZfdCkweDAwMDMpIC8qITwgSW5kZXggb2YgdGhlIERNQSBoYW5kbGUgdXNlZCBmb3IgQ2FwdHVyZS9Db21wYXJlIDMgXAorICAgICAgICAgICAgICAgICAgICAgICAgRE1BIHJlcXVlc3RzICovCisjZGVmaW5lIFRJTV9ETUFfSURfQ0M0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCh1aW50MTZfdCkweDAwMDQpIC8qITwgSW5kZXggb2YgdGhlIERNQSBoYW5kbGUgdXNlZCBmb3IgQ2FwdHVyZS9Db21wYXJlIDQgXAorICAgICAgICAgICAgICAgICAgICAgICAgRE1BIHJlcXVlc3RzICovCisjZGVmaW5lIFRJTV9ETUFfSURfQ09NTVVUQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgodWludDE2X3QpMHgwMDA1KSAvKiE8IEluZGV4IG9mIHRoZSBETUEgaGFuZGxlIHVzZWQgZm9yIENvbW11dGF0aW9uIERNQSBcCisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0cyAqLworI2RlZmluZSBUSU1fRE1BX0lEX1RSSUdHRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgodWludDE2X3QpMHgwMDA2KSAvKiE8IEluZGV4IG9mIHRoZSBETUEgaGFuZGxlIHVzZWQgZm9yIFRyaWdnZXIgRE1BIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RzICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBDaGFubmVsX0NDX1N0YXRlIFRJTSBDYXB0dXJlL0NvbXBhcmUgQ2hhbm5lbCBTdGF0ZQorICogQHsKKyAqLworI2RlZmluZSBUSU1fQ0N4X0VOQUJMRSAweDAwMDAwMDAxVSAvKiE8IElucHV0IG9yIG91dHB1dCBjaGFubmVsIGlzIGVuYWJsZWQgKi8KKyNkZWZpbmUgVElNX0NDeF9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMDAwMDBVIC8qITwgSW5wdXQgb3Igb3V0cHV0IGNoYW5uZWwgaXMgZGlzYWJsZWQgXAorICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX0NDeE5fRU5BQkxFIFwKKyAgMHgwMDAwMDAwNFUgLyohPCBDb21wbGVtZW50YXJ5IG91dHB1dCBjaGFubmVsIGlzIGVuYWJsZWQgKi8KKyNkZWZpbmUgVElNX0NDeE5fRElTQUJMRSBcCisgIDB4MDAwMDAwMDBVIC8qITwgQ29tcGxlbWVudGFyeSBvdXRwdXQgY2hhbm5lbCBpcyBlbmFibGVkICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1fQnJlYWtfU3lzdGVtIFRJTSBCcmVhayBTeXN0ZW0KKyAqIEB7CisgKi8KKyNkZWZpbmUgVElNX0JSRUFLX1NZU1RFTV9FQ0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU1lTQ0ZHX0NGR1IyX0VDQ0wgLyohPCBFbmFibGVzIGFuZCBsb2NrcyB0aGUgRUNDIGVycm9yIHNpZ25hbCB3aXRoIEJyZWFrIFwKKyAgICAgICAgICAgICAgICAgICAgICAgSW5wdXQgb2YgVElNMS84LzE1LzE2LzE3LzIwICovCisjZGVmaW5lIFRJTV9CUkVBS19TWVNURU1fUFZEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBTWVNDRkdfQ0ZHUjJfUFZETCAvKiE8IEVuYWJsZXMgYW5kIGxvY2tzIHRoZSBQVkQgY29ubmVjdGlvbiB3aXRoICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgVElNMS84LzE1LzE2LzE3LzIwIEJyZWFrIElucHV0IGFuZCBhbHNvIHRoZSBQVkRFIGFuZCBcCisgICAgICAgICAgICAgICAgICAgICAgIFBMUyBiaXRzIG9mIHRoZSBQb3dlciBDb250cm9sIEludGVyZmFjZSAqLworI2RlZmluZSBUSU1fQlJFQUtfU1lTVEVNX1NSQU1fUEFSSVRZX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU1lTQ0ZHX0NGR1IyX1NQTCAvKiE8IEVuYWJsZXMgYW5kIGxvY2tzIHRoZSBTUkFNX1BBUklUWSBlcnJvciBzaWduYWwgd2l0aCBcCisgICAgICAgICAgICAgICAgICAgICAgQnJlYWsgSW5wdXQgb2YgVElNMS84LzE1LzE2LzE3LzIwICovCisjZGVmaW5lIFRJTV9CUkVBS19TWVNURU1fTE9DS1VQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU1lTQ0ZHX0NGR1IyX0NMTCAvKiE8IEVuYWJsZXMgYW5kIGxvY2tzIHRoZSBMT0NLVVAgb3V0cHV0IG9mIENvcnRleE00IHdpdGggXAorICAgICAgICAgICAgICAgICAgICAgIEJyZWFrIElucHV0IG9mIFRJTTEvOC8xNS8xNi8xNy8yMCAqLworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworLyogRW5kIG9mIGV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVElNX0V4cG9ydGVkX01hY3JvcyBUSU0gRXhwb3J0ZWQgTWFjcm9zCisgKiBAeworICovCisKKy8qKiBAYnJpZWYgIFJlc2V0IFRJTSBoYW5kbGUgc3RhdGUuCisgKiBAcGFyYW0gIF9fSEFORExFX18gVElNIGhhbmRsZS4KKyAqIEByZXR2YWwgTm9uZQorICovCisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorI2RlZmluZSBfX0hBTF9USU1fUkVTRVRfSEFORExFX1NUQVRFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChfX0hBTkRMRV9fKS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFU0VUOyAgICAgICAgICAgICAgICAgICAgXAorICAgIChfX0hBTkRMRV9fKS0+Q2hhbm5lbFN0YXRlWzBdID0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFU0VUOyAgXAorICAgIChfX0hBTkRMRV9fKS0+Q2hhbm5lbFN0YXRlWzFdID0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFU0VUOyAgXAorICAgIChfX0hBTkRMRV9fKS0+Q2hhbm5lbFN0YXRlWzJdID0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFU0VUOyAgXAorICAgIChfX0hBTkRMRV9fKS0+Q2hhbm5lbFN0YXRlWzNdID0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFU0VUOyAgXAorICAgIChfX0hBTkRMRV9fKS0+Q2hhbm5lbFN0YXRlWzRdID0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFU0VUOyAgXAorICAgIChfX0hBTkRMRV9fKS0+Q2hhbm5lbFN0YXRlWzVdID0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFU0VUOyAgXAorICAgIChfX0hBTkRMRV9fKS0+Q2hhbm5lbE5TdGF0ZVswXSA9IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRVNFVDsgXAorICAgIChfX0hBTkRMRV9fKS0+Q2hhbm5lbE5TdGF0ZVsxXSA9IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRVNFVDsgXAorICAgIChfX0hBTkRMRV9fKS0+Q2hhbm5lbE5TdGF0ZVsyXSA9IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRVNFVDsgXAorICAgIChfX0hBTkRMRV9fKS0+Q2hhbm5lbE5TdGF0ZVszXSA9IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRVNFVDsgXAorICAgIChfX0hBTkRMRV9fKS0+RE1BQnVyc3RTdGF0ZSA9IEhBTF9ETUFfQlVSU1RfU1RBVEVfUkVTRVQ7ICAgICAgXAorICAgIChfX0hBTkRMRV9fKS0+QmFzZV9Nc3BJbml0Q2FsbGJhY2sgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgXAorICAgIChfX0hBTkRMRV9fKS0+QmFzZV9Nc3BEZUluaXRDYWxsYmFjayA9IE5VTEw7ICAgICAgICAgICAgICAgICAgXAorICAgIChfX0hBTkRMRV9fKS0+SUNfTXNwSW5pdENhbGxiYWNrID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChfX0hBTkRMRV9fKS0+SUNfTXNwRGVJbml0Q2FsbGJhY2sgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgXAorICAgIChfX0hBTkRMRV9fKS0+T0NfTXNwSW5pdENhbGxiYWNrID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChfX0hBTkRMRV9fKS0+T0NfTXNwRGVJbml0Q2FsbGJhY2sgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgXAorICAgIChfX0hBTkRMRV9fKS0+UFdNX01zcEluaXRDYWxsYmFjayA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIChfX0hBTkRMRV9fKS0+UFdNX01zcERlSW5pdENhbGxiYWNrID0gTlVMTDsgICAgICAgICAgICAgICAgICAgXAorICAgIChfX0hBTkRMRV9fKS0+T25lUHVsc2VfTXNwSW5pdENhbGxiYWNrID0gTlVMTDsgICAgICAgICAgICAgICAgXAorICAgIChfX0hBTkRMRV9fKS0+T25lUHVsc2VfTXNwRGVJbml0Q2FsbGJhY2sgPSBOVUxMOyAgICAgICAgICAgICAgXAorICAgIChfX0hBTkRMRV9fKS0+RW5jb2Rlcl9Nc3BJbml0Q2FsbGJhY2sgPSBOVUxMOyAgICAgICAgICAgICAgICAgXAorICAgIChfX0hBTkRMRV9fKS0+RW5jb2Rlcl9Nc3BEZUluaXRDYWxsYmFjayA9IE5VTEw7ICAgICAgICAgICAgICAgXAorICAgIChfX0hBTkRMRV9fKS0+SGFsbFNlbnNvcl9Nc3BJbml0Q2FsbGJhY2sgPSBOVUxMOyAgICAgICAgICAgICAgXAorICAgIChfX0hBTkRMRV9fKS0+SGFsbFNlbnNvcl9Nc3BEZUluaXRDYWxsYmFjayA9IE5VTEw7ICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgX19IQUxfVElNX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoX19IQU5ETEVfXyktPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRVNFVDsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoX19IQU5ETEVfXyktPkNoYW5uZWxTdGF0ZVswXSA9IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRVNFVDsgIFwKKyAgICAoX19IQU5ETEVfXyktPkNoYW5uZWxTdGF0ZVsxXSA9IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRVNFVDsgIFwKKyAgICAoX19IQU5ETEVfXyktPkNoYW5uZWxTdGF0ZVsyXSA9IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRVNFVDsgIFwKKyAgICAoX19IQU5ETEVfXyktPkNoYW5uZWxTdGF0ZVszXSA9IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRVNFVDsgIFwKKyAgICAoX19IQU5ETEVfXyktPkNoYW5uZWxTdGF0ZVs0XSA9IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRVNFVDsgIFwKKyAgICAoX19IQU5ETEVfXyktPkNoYW5uZWxTdGF0ZVs1XSA9IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRVNFVDsgIFwKKyAgICAoX19IQU5ETEVfXyktPkNoYW5uZWxOU3RhdGVbMF0gPSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVTRVQ7IFwKKyAgICAoX19IQU5ETEVfXyktPkNoYW5uZWxOU3RhdGVbMV0gPSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVTRVQ7IFwKKyAgICAoX19IQU5ETEVfXyktPkNoYW5uZWxOU3RhdGVbMl0gPSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVTRVQ7IFwKKyAgICAoX19IQU5ETEVfXyktPkNoYW5uZWxOU3RhdGVbM10gPSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVTRVQ7IFwKKyAgICAoX19IQU5ETEVfXyktPkRNQUJ1cnN0U3RhdGUgPSBIQUxfRE1BX0JVUlNUX1NUQVRFX1JFU0VUOyAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSB0aGUgVElNIHBlcmlwaGVyYWwuCisgKiBAcGFyYW0gIF9fSEFORExFX18gVElNIGhhbmRsZQorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfVElNX0VOQUJMRShfX0hBTkRMRV9fKSBcCisgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgfD0gKFRJTV9DUjFfQ0VOKSkKKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSB0aGUgVElNIG1haW4gT3V0cHV0LgorICogQHBhcmFtICBfX0hBTkRMRV9fIFRJTSBoYW5kbGUKKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX1RJTV9NT0VfRU5BQkxFKF9fSEFORExFX18pIFwKKyAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkJEVFIgfD0gKFRJTV9CRFRSX01PRSkpCisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIHRoZSBUSU0gcGVyaXBoZXJhbC4KKyAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9USU1fRElTQUJMRShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ0VSICYgVElNX0NDRVJfQ0N4RV9NQVNLKSA9PSAwVUwpIHsgICAgXAorICAgICAgaWYgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ0VSICYgVElNX0NDRVJfQ0N4TkVfTUFTSykgPT0gMFVMKSB7IFwKKyAgICAgICAgKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxICY9IH4oVElNX0NSMV9DRU4pOyAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgdGhlIFRJTSBtYWluIE91dHB1dC4KKyAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlCisgKiBAcmV0dmFsIE5vbmUKKyAqIEBub3RlIFRoZSBNYWluIE91dHB1dCBFbmFibGUgb2YgYSB0aW1lciBpbnN0YW5jZSBpcyBkaXNhYmxlZCBvbmx5IGlmIGFsbCB0aGUKKyAqIENDeCBhbmQgQ0N4TiBjaGFubmVscyBoYXZlIGJlZW4gZGlzYWJsZWQKKyAqLworI2RlZmluZSBfX0hBTF9USU1fTU9FX0RJU0FCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ0VSICYgVElNX0NDRVJfQ0N4RV9NQVNLKSA9PSAwVUwpIHsgICAgXAorICAgICAgaWYgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ0VSICYgVElNX0NDRVJfQ0N4TkVfTUFTSykgPT0gMFVMKSB7IFwKKyAgICAgICAgKF9fSEFORExFX18pLT5JbnN0YW5jZS0+QkRUUiAmPSB+KFRJTV9CRFRSX01PRSk7ICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgdGhlIFRJTSBtYWluIE91dHB1dC4KKyAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlCisgKiBAcmV0dmFsIE5vbmUKKyAqIEBub3RlIFRoZSBNYWluIE91dHB1dCBFbmFibGUgb2YgYSB0aW1lciBpbnN0YW5jZSBpcyBkaXNhYmxlZCB1bmNvbmRpdGlvbmFsbHkKKyAqLworI2RlZmluZSBfX0hBTF9USU1fTU9FX0RJU0FCTEVfVU5DT05ESVRJT05BTExZKF9fSEFORExFX18pIFwKKyAgKF9fSEFORExFX18pLT5JbnN0YW5jZS0+QkRUUiAmPSB+KFRJTV9CRFRSX01PRSkKKworLyoqIEBicmllZiAgRW5hYmxlIHRoZSBzcGVjaWZpZWQgVElNIGludGVycnVwdC4KKyAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFRJTSBIYW5kbGUuCisgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBUSU0gaW50ZXJydXB0IHNvdXJjZSB0byBlbmFibGUuCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIFRJTV9JVF9VUERBVEU6IFVwZGF0ZSBpbnRlcnJ1cHQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfQ0MxOiAgIENhcHR1cmUvQ29tcGFyZSAxIGludGVycnVwdAorICogICAgICAgICAgICBAYXJnIFRJTV9JVF9DQzI6ICBDYXB0dXJlL0NvbXBhcmUgMiBpbnRlcnJ1cHQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfQ0MzOiAgQ2FwdHVyZS9Db21wYXJlIDMgaW50ZXJydXB0CisgKiAgICAgICAgICAgIEBhcmcgVElNX0lUX0NDNDogIENhcHR1cmUvQ29tcGFyZSA0IGludGVycnVwdAorICogICAgICAgICAgICBAYXJnIFRJTV9JVF9DT006ICAgQ29tbXV0YXRpb24gaW50ZXJydXB0CisgKiAgICAgICAgICAgIEBhcmcgVElNX0lUX1RSSUdHRVI6IFRyaWdnZXIgaW50ZXJydXB0CisgKiAgICAgICAgICAgIEBhcmcgVElNX0lUX0JSRUFLOiBCcmVhayBpbnRlcnJ1cHQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfSURYOiBJbmRleCBpbnRlcnJ1cHQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfRElSOiBEaXJlY3Rpb24gY2hhbmdlIGludGVycnVwdAorICogICAgICAgICAgICBAYXJnIFRJTV9JVF9JRVJSOiBJbmRleCBlcnJvciBpbnRlcnJ1cHQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfVEVSUjogVHJhbnNpdGlvbiBlcnJvciBpbnRlcnJ1cHQKKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX1RJTV9FTkFCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgXAorICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+RElFUiB8PSAoX19JTlRFUlJVUFRfXykpCisKKy8qKiBAYnJpZWYgIERpc2FibGUgdGhlIHNwZWNpZmllZCBUSU0gaW50ZXJydXB0LgorICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVElNIEhhbmRsZS4KKyAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFRJTSBpbnRlcnJ1cHQgc291cmNlIHRvIGRpc2FibGUuCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIFRJTV9JVF9VUERBVEU6IFVwZGF0ZSBpbnRlcnJ1cHQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfQ0MxOiAgIENhcHR1cmUvQ29tcGFyZSAxIGludGVycnVwdAorICogICAgICAgICAgICBAYXJnIFRJTV9JVF9DQzI6ICBDYXB0dXJlL0NvbXBhcmUgMiBpbnRlcnJ1cHQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfQ0MzOiAgQ2FwdHVyZS9Db21wYXJlIDMgaW50ZXJydXB0CisgKiAgICAgICAgICAgIEBhcmcgVElNX0lUX0NDNDogIENhcHR1cmUvQ29tcGFyZSA0IGludGVycnVwdAorICogICAgICAgICAgICBAYXJnIFRJTV9JVF9DT006ICAgQ29tbXV0YXRpb24gaW50ZXJydXB0CisgKiAgICAgICAgICAgIEBhcmcgVElNX0lUX1RSSUdHRVI6IFRyaWdnZXIgaW50ZXJydXB0CisgKiAgICAgICAgICAgIEBhcmcgVElNX0lUX0JSRUFLOiBCcmVhayBpbnRlcnJ1cHQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfSURYOiBJbmRleCBpbnRlcnJ1cHQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfRElSOiBEaXJlY3Rpb24gY2hhbmdlIGludGVycnVwdAorICogICAgICAgICAgICBAYXJnIFRJTV9JVF9JRVJSOiBJbmRleCBlcnJvciBpbnRlcnJ1cHQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfVEVSUjogVHJhbnNpdGlvbiBlcnJvciBpbnRlcnJ1cHQKKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX1RJTV9ESVNBQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pIFwKKyAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkRJRVIgJj0gfihfX0lOVEVSUlVQVF9fKSkKKworLyoqIEBicmllZiAgRW5hYmxlIHRoZSBzcGVjaWZpZWQgRE1BIHJlcXVlc3QuCisgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBUSU0gSGFuZGxlLgorICogQHBhcmFtICBfX0RNQV9fIHNwZWNpZmllcyB0aGUgVElNIERNQSByZXF1ZXN0IHRvIGVuYWJsZS4KKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9VUERBVEU6IFVwZGF0ZSBETUEgcmVxdWVzdAorICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfQ0MxOiAgIENhcHR1cmUvQ29tcGFyZSAxIERNQSByZXF1ZXN0CisgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9DQzI6ICBDYXB0dXJlL0NvbXBhcmUgMiBETUEgcmVxdWVzdAorICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfQ0MzOiAgQ2FwdHVyZS9Db21wYXJlIDMgRE1BIHJlcXVlc3QKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX0NDNDogIENhcHR1cmUvQ29tcGFyZSA0IERNQSByZXF1ZXN0CisgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9DT006ICAgQ29tbXV0YXRpb24gRE1BIHJlcXVlc3QKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX1RSSUdHRVI6IFRyaWdnZXIgRE1BIHJlcXVlc3QKKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX1RJTV9FTkFCTEVfRE1BKF9fSEFORExFX18sIF9fRE1BX18pIFwKKyAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkRJRVIgfD0gKF9fRE1BX18pKQorCisvKiogQGJyaWVmICBEaXNhYmxlIHRoZSBzcGVjaWZpZWQgRE1BIHJlcXVlc3QuCisgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBUSU0gSGFuZGxlLgorICogQHBhcmFtICBfX0RNQV9fIHNwZWNpZmllcyB0aGUgVElNIERNQSByZXF1ZXN0IHRvIGRpc2FibGUuCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfVVBEQVRFOiBVcGRhdGUgRE1BIHJlcXVlc3QKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX0NDMTogICBDYXB0dXJlL0NvbXBhcmUgMSBETUEgcmVxdWVzdAorICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfQ0MyOiAgQ2FwdHVyZS9Db21wYXJlIDIgRE1BIHJlcXVlc3QKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX0NDMzogIENhcHR1cmUvQ29tcGFyZSAzIERNQSByZXF1ZXN0CisgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9DQzQ6ICBDYXB0dXJlL0NvbXBhcmUgNCBETUEgcmVxdWVzdAorICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfQ09NOiAgIENvbW11dGF0aW9uIERNQSByZXF1ZXN0CisgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9UUklHR0VSOiBUcmlnZ2VyIERNQSByZXF1ZXN0CisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9USU1fRElTQUJMRV9ETUEoX19IQU5ETEVfXywgX19ETUFfXykgXAorICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+RElFUiAmPSB+KF9fRE1BX18pKQorCisvKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgVElNIGludGVycnVwdCBmbGFnIGlzIHNldCBvciBub3QuCisgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBUSU0gSGFuZGxlLgorICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIFRJTSBpbnRlcnJ1cHQgZmxhZyB0byBjaGVjay4KKyAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX1VQREFURTogVXBkYXRlIGludGVycnVwdCBmbGFnCisgKiAgICAgICAgICAgIEBhcmcgVElNX0ZMQUdfQ0MxOiBDYXB0dXJlL0NvbXBhcmUgMSBpbnRlcnJ1cHQgZmxhZworICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX0NDMjogQ2FwdHVyZS9Db21wYXJlIDIgaW50ZXJydXB0IGZsYWcKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DQzM6IENhcHR1cmUvQ29tcGFyZSAzIGludGVycnVwdCBmbGFnCisgKiAgICAgICAgICAgIEBhcmcgVElNX0ZMQUdfQ0M0OiBDYXB0dXJlL0NvbXBhcmUgNCBpbnRlcnJ1cHQgZmxhZworICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX0NDNTogQ29tcGFyZSA1IGludGVycnVwdCBmbGFnCisgKiAgICAgICAgICAgIEBhcmcgVElNX0ZMQUdfQ0M2OiBDb21wYXJlIDYgaW50ZXJydXB0IGZsYWcKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DT006ICBDb21tdXRhdGlvbiBpbnRlcnJ1cHQgZmxhZworICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX1RSSUdHRVI6IFRyaWdnZXIgaW50ZXJydXB0IGZsYWcKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19CUkVBSzogQnJlYWsgaW50ZXJydXB0IGZsYWcKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19CUkVBSzI6IEJyZWFrIDIgaW50ZXJydXB0IGZsYWcKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19TWVNURU1fQlJFQUs6IFN5c3RlbSBCcmVhayBpbnRlcnJ1cHQgZmxhZworICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX0NDMU9GOiBDYXB0dXJlL0NvbXBhcmUgMSBvdmVyY2FwdHVyZSBmbGFnCisgKiAgICAgICAgICAgIEBhcmcgVElNX0ZMQUdfQ0MyT0Y6IENhcHR1cmUvQ29tcGFyZSAyIG92ZXJjYXB0dXJlIGZsYWcKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DQzNPRjogQ2FwdHVyZS9Db21wYXJlIDMgb3ZlcmNhcHR1cmUgZmxhZworICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX0NDNE9GOiBDYXB0dXJlL0NvbXBhcmUgNCBvdmVyY2FwdHVyZSBmbGFnCisgKiAgICAgICAgICAgIEBhcmcgVElNX0ZMQUdfSURYOiBJbmRleCBpbnRlcnJ1cHQgZmxhZworICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX0RJUjogRGlyZWN0aW9uIGNoYW5nZSBpbnRlcnJ1cHQgZmxhZworICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX0lFUlI6IEluZGV4IGVycm9yIGludGVycnVwdCBmbGFnCisgKiAgICAgICAgICAgIEBhcmcgVElNX0ZMQUdfVEVSUjogVHJhbnNpdGlvbiBlcnJvciBpbnRlcnJ1cHQgZmxhZworICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fRkxBR19fIChUUlVFIG9yIEZBTFNFKS4KKyAqLworI2RlZmluZSBfX0hBTF9USU1fR0VUX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pIFwKKyAgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5TUiAmIChfX0ZMQUdfXykpID09IChfX0ZMQUdfXykpCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBzcGVjaWZpZWQgVElNIGludGVycnVwdCBmbGFnLgorICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVElNIEhhbmRsZS4KKyAqIEBwYXJhbSAgX19GTEFHX18gc3BlY2lmaWVzIHRoZSBUSU0gaW50ZXJydXB0IGZsYWcgdG8gY2xlYXIuCisgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19VUERBVEU6IFVwZGF0ZSBpbnRlcnJ1cHQgZmxhZworICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX0NDMTogQ2FwdHVyZS9Db21wYXJlIDEgaW50ZXJydXB0IGZsYWcKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DQzI6IENhcHR1cmUvQ29tcGFyZSAyIGludGVycnVwdCBmbGFnCisgKiAgICAgICAgICAgIEBhcmcgVElNX0ZMQUdfQ0MzOiBDYXB0dXJlL0NvbXBhcmUgMyBpbnRlcnJ1cHQgZmxhZworICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX0NDNDogQ2FwdHVyZS9Db21wYXJlIDQgaW50ZXJydXB0IGZsYWcKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DQzU6IENvbXBhcmUgNSBpbnRlcnJ1cHQgZmxhZworICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX0NDNjogQ29tcGFyZSA2IGludGVycnVwdCBmbGFnCisgKiAgICAgICAgICAgIEBhcmcgVElNX0ZMQUdfQ09NOiAgQ29tbXV0YXRpb24gaW50ZXJydXB0IGZsYWcKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19UUklHR0VSOiBUcmlnZ2VyIGludGVycnVwdCBmbGFnCisgKiAgICAgICAgICAgIEBhcmcgVElNX0ZMQUdfQlJFQUs6IEJyZWFrIGludGVycnVwdCBmbGFnCisgKiAgICAgICAgICAgIEBhcmcgVElNX0ZMQUdfQlJFQUsyOiBCcmVhayAyIGludGVycnVwdCBmbGFnCisgKiAgICAgICAgICAgIEBhcmcgVElNX0ZMQUdfU1lTVEVNX0JSRUFLOiBTeXN0ZW0gQnJlYWsgaW50ZXJydXB0IGZsYWcKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DQzFPRjogQ2FwdHVyZS9Db21wYXJlIDEgb3ZlcmNhcHR1cmUgZmxhZworICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX0NDMk9GOiBDYXB0dXJlL0NvbXBhcmUgMiBvdmVyY2FwdHVyZSBmbGFnCisgKiAgICAgICAgICAgIEBhcmcgVElNX0ZMQUdfQ0MzT0Y6IENhcHR1cmUvQ29tcGFyZSAzIG92ZXJjYXB0dXJlIGZsYWcKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DQzRPRjogQ2FwdHVyZS9Db21wYXJlIDQgb3ZlcmNhcHR1cmUgZmxhZworICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX0lEWDogSW5kZXggaW50ZXJydXB0IGZsYWcKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19ESVI6IERpcmVjdGlvbiBjaGFuZ2UgaW50ZXJydXB0IGZsYWcKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19JRVJSOiBJbmRleCBlcnJvciBpbnRlcnJ1cHQgZmxhZworICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX1RFUlI6IFRyYW5zaXRpb24gZXJyb3IgaW50ZXJydXB0IGZsYWcKKyAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0ZMQUdfXyAoVFJVRSBvciBGQUxTRSkuCisgKi8KKyNkZWZpbmUgX19IQUxfVElNX0NMRUFSX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pIFwKKyAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlNSID0gfihfX0ZMQUdfXykpCisKKy8qKgorICogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgVElNIGludGVycnVwdCBzb3VyY2UgaXMgZW5hYmxlZCBvciBub3QuCisgKiBAcGFyYW0gIF9fSEFORExFX18gVElNIGhhbmRsZQorICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgVElNIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIFRJTV9JVF9VUERBVEU6IFVwZGF0ZSBpbnRlcnJ1cHQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfQ0MxOiAgIENhcHR1cmUvQ29tcGFyZSAxIGludGVycnVwdAorICogICAgICAgICAgICBAYXJnIFRJTV9JVF9DQzI6ICBDYXB0dXJlL0NvbXBhcmUgMiBpbnRlcnJ1cHQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfQ0MzOiAgQ2FwdHVyZS9Db21wYXJlIDMgaW50ZXJydXB0CisgKiAgICAgICAgICAgIEBhcmcgVElNX0lUX0NDNDogIENhcHR1cmUvQ29tcGFyZSA0IGludGVycnVwdAorICogICAgICAgICAgICBAYXJnIFRJTV9JVF9DT006ICAgQ29tbXV0YXRpb24gaW50ZXJydXB0CisgKiAgICAgICAgICAgIEBhcmcgVElNX0lUX1RSSUdHRVI6IFRyaWdnZXIgaW50ZXJydXB0CisgKiAgICAgICAgICAgIEBhcmcgVElNX0lUX0JSRUFLOiBCcmVhayBpbnRlcnJ1cHQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfSURYOiBJbmRleCBpbnRlcnJ1cHQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfRElSOiBEaXJlY3Rpb24gY2hhbmdlIGludGVycnVwdAorICogICAgICAgICAgICBAYXJnIFRJTV9JVF9JRVJSOiBJbmRleCBlcnJvciBpbnRlcnJ1cHQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfVEVSUjogVHJhbnNpdGlvbiBlcnJvciBpbnRlcnJ1cHQKKyAqIEByZXR2YWwgVGhlIHN0YXRlIG9mIFRJTV9JVCAoU0VUIG9yIFJFU0VUKS4KKyAqLworI2RlZmluZSBfX0hBTF9USU1fR0VUX0lUX1NPVVJDRShfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAgICAgICAgICAgIFwKKyAgKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+RElFUiAmIChfX0lOVEVSUlVQVF9fKSkgPT0gKF9fSU5URVJSVVBUX18pKSBcCisgICAgICAgPyBTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIDogUkVTRVQpCisKKy8qKiBAYnJpZWYgQ2xlYXIgdGhlIFRJTSBpbnRlcnJ1cHQgcGVuZGluZyBiaXRzLgorICogQHBhcmFtICBfX0hBTkRMRV9fIFRJTSBoYW5kbGUKKyAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIGludGVycnVwdCBwZW5kaW5nIGJpdCB0byBjbGVhci4KKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgVElNX0lUX1VQREFURTogVXBkYXRlIGludGVycnVwdAorICogICAgICAgICAgICBAYXJnIFRJTV9JVF9DQzE6ICAgQ2FwdHVyZS9Db21wYXJlIDEgaW50ZXJydXB0CisgKiAgICAgICAgICAgIEBhcmcgVElNX0lUX0NDMjogIENhcHR1cmUvQ29tcGFyZSAyIGludGVycnVwdAorICogICAgICAgICAgICBAYXJnIFRJTV9JVF9DQzM6ICBDYXB0dXJlL0NvbXBhcmUgMyBpbnRlcnJ1cHQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfQ0M0OiAgQ2FwdHVyZS9Db21wYXJlIDQgaW50ZXJydXB0CisgKiAgICAgICAgICAgIEBhcmcgVElNX0lUX0NPTTogICBDb21tdXRhdGlvbiBpbnRlcnJ1cHQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfVFJJR0dFUjogVHJpZ2dlciBpbnRlcnJ1cHQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfQlJFQUs6IEJyZWFrIGludGVycnVwdAorICogICAgICAgICAgICBAYXJnIFRJTV9JVF9JRFg6IEluZGV4IGludGVycnVwdAorICogICAgICAgICAgICBAYXJnIFRJTV9JVF9ESVI6IERpcmVjdGlvbiBjaGFuZ2UgaW50ZXJydXB0CisgKiAgICAgICAgICAgIEBhcmcgVElNX0lUX0lFUlI6IEluZGV4IGVycm9yIGludGVycnVwdAorICogICAgICAgICAgICBAYXJnIFRJTV9JVF9URVJSOiBUcmFuc2l0aW9uIGVycm9yIGludGVycnVwdAorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfVElNX0NMRUFSX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pIFwKKyAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlNSID0gfihfX0lOVEVSUlVQVF9fKSkKKworLyoqCisgICogQGJyaWVmICBGb3JjZSBhIGNvbnRpbnVvdXMgY29weSBvZiB0aGUgdXBkYXRlIGludGVycnVwdCBmbGFnIChVSUYpIGludG8gdGhlCit0aW1lciBjb3VudGVyIHJlZ2lzdGVyIChiaXQgMzEpLgorICAqIEBub3RlIFRoaXMgYWxsb3dzIGJvdGggdGhlIGNvdW50ZXIgdmFsdWUgYW5kIGEgcG90ZW50aWFsIHJvbGwtb3ZlciBjb25kaXRpb24KK3NpZ25hbGxlZCBieSB0aGUgVUlGQ1BZIGZsYWcgdG8gYmUgcmVhZAorICAqICAgICAgIGluIGFuIGF0b21pYyB3YXkuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRJTSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCittb2RlLgorICAqLworI2RlZmluZSBfX0hBTF9USU1fVUlGUkVNQVBfRU5BQkxFKF9fSEFORExFX18pIFwKKyAgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgfD0gVElNX0NSMV9VSUZSRU1BUCkpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB1cGRhdGUgaW50ZXJydXB0IGZsYWcgKFVJRikgcmVtYXBwaW5nLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorbW9kZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfVElNX1VJRlJFTUFQX0RJU0FCTEUoX19IQU5ETEVfXykgXAorICAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSAmPSB+VElNX0NSMV9VSUZSRU1BUCkpCisKKy8qKgorICAqIEBicmllZiAgR2V0IHVwZGF0ZSBpbnRlcnJ1cHQgZmxhZyAoVUlGKSBjb3B5IHN0YXR1cy4KKyAgKiBAcGFyYW0gIF9fQ09VTlRFUl9fIENvdW50ZXIgdmFsdWUuCisgICogQHJldHZhbCBUaGUgc3RhdGUgb2YgVUlGQ1BZIChUUlVFIG9yIEZBTFNFKS4KK21vZGUuCisgICovCisjZGVmaW5lIF9fSEFMX1RJTV9HRVRfVUlGQ1BZKF9fQ09VTlRFUl9fKSBcCisgICgoKF9fQ09VTlRFUl9fKSAmIChUSU1fQ05UX1VJRkNQWSkpID09IChUSU1fQ05UX1VJRkNQWSkpCisKKy8qKgorICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIFRJTSBDb3VudGVyIGlzIHVzZWQgYXMgZG93bmNvdW50ZXIuCisgKiBAcGFyYW0gIF9fSEFORExFX18gVElNIGhhbmRsZS4KKyAqIEByZXR2YWwgRmFsc2UgKENvdW50ZXIgdXNlZCBhcyB1cGNvdW50ZXIpIG9yIFRydWUgKENvdW50ZXIgdXNlZCBhcworICogZG93bmNvdW50ZXIpCisgKiBAbm90ZSBUaGlzIG1hY3JvIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgdG8gZ2V0IHRoZSBjb3VudGluZyBtb2RlIHdoZW4gdGhlCisgKiB0aW1lciBvcGVyYXRlcyBpbiBDZW50ZXItYWxpZ25lZCBtb2RlIG9yIEVuY29kZXIgbW9kZS4KKyAqLworI2RlZmluZSBfX0hBTF9USU1fSVNfVElNX0NPVU5USU5HX0RPV04oX19IQU5ETEVfXykgXAorICAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSAmIChUSU1fQ1IxX0RJUikpID09IChUSU1fQ1IxX0RJUikpCisKKy8qKgorICogQGJyaWVmICBTZXQgdGhlIFRJTSBQcmVzY2FsZXIgb24gcnVudGltZS4KKyAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlLgorICogQHBhcmFtICBfX1BSRVNDX18gc3BlY2lmaWVzIHRoZSBQcmVzY2FsZXIgbmV3IHZhbHVlLgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfVElNX1NFVF9QUkVTQ0FMRVIoX19IQU5ETEVfXywgX19QUkVTQ19fKSBcCisgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5QU0MgPSAoX19QUkVTQ19fKSkKKworLyoqCisgKiBAYnJpZWYgIFNldCB0aGUgVElNIENvdW50ZXIgUmVnaXN0ZXIgdmFsdWUgb24gcnVudGltZS4KKyAqIE5vdGUgUGxlYXNlIGNoZWNrIGlmIHRoZSBiaXQgMzEgb2YgQ05UIHJlZ2lzdGVyIGlzIHVzZWQgYXMgVUlGIGNvcHkgb3Igbm90LAorICogdGhpcyBtYXkgYWZmZWN0IHRoZSBjb3VudGVyIHJhbmdlIGluIGNhc2Ugb2YgMzIgYml0cyBjb3VudGVyIFRJTSBpbnN0YW5jZS4KKyAqICAgICAgQml0IDMxIG9mIENOVCBjYW4gYmUgZW5hYmxlZC9kaXNhYmxlZCB1c2luZworICogX19IQUxfVElNX1VJRlJFTUFQX0VOQUJMRSgpL19fSEFMX1RJTV9VSUZSRU1BUF9ESVNBQkxFKCkgbWFjcm9zLgorICogQHBhcmFtICBfX0hBTkRMRV9fIFRJTSBoYW5kbGUuCisgKiBAcGFyYW0gIF9fQ09VTlRFUl9fIHNwZWNpZmllcyB0aGUgQ291bnRlciByZWdpc3RlciBuZXcgdmFsdWUuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9USU1fU0VUX0NPVU5URVIoX19IQU5ETEVfXywgX19DT1VOVEVSX18pIFwKKyAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNOVCA9IChfX0NPVU5URVJfXykpCisKKy8qKgorICogQGJyaWVmICBHZXQgdGhlIFRJTSBDb3VudGVyIFJlZ2lzdGVyIHZhbHVlIG9uIHJ1bnRpbWUuCisgKiBAcGFyYW0gIF9fSEFORExFX18gVElNIGhhbmRsZS4KKyAqIEByZXR2YWwgMTYtYml0IG9yIDMyLWJpdCB2YWx1ZSBvZiB0aGUgdGltZXIgY291bnRlciByZWdpc3RlciAoVElNeF9DTlQpCisgKi8KKyNkZWZpbmUgX19IQUxfVElNX0dFVF9DT1VOVEVSKF9fSEFORExFX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DTlQpCisKKy8qKgorICogQGJyaWVmICBTZXQgdGhlIFRJTSBBdXRvcmVsb2FkIFJlZ2lzdGVyIHZhbHVlIG9uIHJ1bnRpbWUgd2l0aG91dCBjYWxsaW5nCisgKiBhbm90aGVyIHRpbWUgYW55IEluaXQgZnVuY3Rpb24uCisgKiBAcGFyYW0gIF9fSEFORExFX18gVElNIGhhbmRsZS4KKyAqIEBwYXJhbSAgX19BVVRPUkVMT0FEX18gc3BlY2lmaWVzIHRoZSBDb3VudGVyIHJlZ2lzdGVyIG5ldyB2YWx1ZS4KKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX1RJTV9TRVRfQVVUT1JFTE9BRChfX0hBTkRMRV9fLCBfX0FVVE9SRUxPQURfXykgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5BUlIgPSAoX19BVVRPUkVMT0FEX18pOyAgICAgICAgICBcCisgICAgKF9fSEFORExFX18pLT5Jbml0LlBlcmlvZCA9IChfX0FVVE9SRUxPQURfXyk7ICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisvKioKKyAqIEBicmllZiAgR2V0IHRoZSBUSU0gQXV0b3JlbG9hZCBSZWdpc3RlciB2YWx1ZSBvbiBydW50aW1lLgorICogQHBhcmFtICBfX0hBTkRMRV9fIFRJTSBoYW5kbGUuCisgKiBAcmV0dmFsIDE2LWJpdCBvciAzMi1iaXQgdmFsdWUgb2YgdGhlIHRpbWVyIGF1dG8tcmVsb2FkIHJlZ2lzdGVyKFRJTXhfQVJSKQorICovCisjZGVmaW5lIF9fSEFMX1RJTV9HRVRfQVVUT1JFTE9BRChfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+QVJSKQorCisvKioKKyAqIEBicmllZiAgU2V0IHRoZSBUSU0gQ2xvY2sgRGl2aXNpb24gdmFsdWUgb24gcnVudGltZSB3aXRob3V0IGNhbGxpbmcgYW5vdGhlcgorICogdGltZSBhbnkgSW5pdCBmdW5jdGlvbi4KKyAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlLgorICogQHBhcmFtICBfX0NLRF9fIHNwZWNpZmllcyB0aGUgY2xvY2sgZGl2aXNpb24gdmFsdWUuCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWU6CisgKiAgICAgICAgICAgIEBhcmcgVElNX0NMT0NLRElWSVNJT05fRElWMTogdERUUz10Q0tfSU5UCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NMT0NLRElWSVNJT05fRElWMjogdERUUz0yKnRDS19JTlQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0xPQ0tESVZJU0lPTl9ESVY0OiB0RFRTPTQqdENLX0lOVAorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfVElNX1NFVF9DTE9DS0RJVklTSU9OKF9fSEFORExFX18sIF9fQ0tEX18pIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgJj0gKH5USU1fQ1IxX0NLRCk7ICAgICAgIFwKKyAgICAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgfD0gKF9fQ0tEX18pOyAgICAgICAgICAgIFwKKyAgICAoX19IQU5ETEVfXyktPkluaXQuQ2xvY2tEaXZpc2lvbiA9IChfX0NLRF9fKTsgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworLyoqCisgKiBAYnJpZWYgIEdldCB0aGUgVElNIENsb2NrIERpdmlzaW9uIHZhbHVlIG9uIHJ1bnRpbWUuCisgKiBAcGFyYW0gIF9fSEFORExFX18gVElNIGhhbmRsZS4KKyAqIEByZXR2YWwgVGhlIGNsb2NrIGRpdmlzaW9uIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgVElNX0NMT0NLRElWSVNJT05fRElWMTogdERUUz10Q0tfSU5UCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NMT0NLRElWSVNJT05fRElWMjogdERUUz0yKnRDS19JTlQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0xPQ0tESVZJU0lPTl9ESVY0OiB0RFRTPTQqdENLX0lOVAorICovCisjZGVmaW5lIF9fSEFMX1RJTV9HRVRfQ0xPQ0tESVZJU0lPTihfX0hBTkRMRV9fKSBcCisgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgJiBUSU1fQ1IxX0NLRCkKKworLyoqCisgKiBAYnJpZWYgIFNldCB0aGUgVElNIElucHV0IENhcHR1cmUgcHJlc2NhbGVyIG9uIHJ1bnRpbWUgd2l0aG91dCBjYWxsaW5nCisgKiBhbm90aGVyIHRpbWUgSEFMX1RJTV9JQ19Db25maWdDaGFubmVsKCkgZnVuY3Rpb24uCisgKiBAcGFyYW0gIF9fSEFORExFX18gVElNIGhhbmRsZS4KKyAqIEBwYXJhbSAgX19DSEFOTkVMX18gVElNIENoYW5uZWxzIHRvIGJlIGNvbmZpZ3VyZWQuCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAqIEBwYXJhbSAgX19JQ1BTQ19fIHNwZWNpZmllcyB0aGUgSW5wdXQgQ2FwdHVyZTQgcHJlc2NhbGVyIG5ldyB2YWx1ZS4KKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgVElNX0lDUFNDX0RJVjE6IG5vIHByZXNjYWxlcgorICogICAgICAgICAgICBAYXJnIFRJTV9JQ1BTQ19ESVYyOiBjYXB0dXJlIGlzIGRvbmUgb25jZSBldmVyeSAyIGV2ZW50cworICogICAgICAgICAgICBAYXJnIFRJTV9JQ1BTQ19ESVY0OiBjYXB0dXJlIGlzIGRvbmUgb25jZSBldmVyeSA0IGV2ZW50cworICogICAgICAgICAgICBAYXJnIFRJTV9JQ1BTQ19ESVY4OiBjYXB0dXJlIGlzIGRvbmUgb25jZSBldmVyeSA4IGV2ZW50cworICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfVElNX1NFVF9JQ1BSRVNDQUxFUihfX0hBTkRMRV9fLCBfX0NIQU5ORUxfXywgX19JQ1BTQ19fKSAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUSU1fUkVTRVRfSUNQUkVTQ0FMRVJWQUxVRSgoX19IQU5ETEVfXyksIChfX0NIQU5ORUxfXykpOyAgICAgICAgICAgIFwKKyAgICBUSU1fU0VUX0lDUFJFU0NBTEVSVkFMVUUoKF9fSEFORExFX18pLCAoX19DSEFOTkVMX18pLCAoX19JQ1BTQ19fKSk7IFwKKyAgfSB3aGlsZSAoMCkKKworLyoqCisgKiBAYnJpZWYgIEdldCB0aGUgVElNIElucHV0IENhcHR1cmUgcHJlc2NhbGVyIG9uIHJ1bnRpbWUuCisgKiBAcGFyYW0gIF9fSEFORExFX18gVElNIGhhbmRsZS4KKyAqIEBwYXJhbSAgX19DSEFOTkVMX18gVElNIENoYW5uZWxzIHRvIGJlIGNvbmZpZ3VyZWQuCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IGdldCBpbnB1dCBjYXB0dXJlIDEgcHJlc2NhbGVyIHZhbHVlCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogZ2V0IGlucHV0IGNhcHR1cmUgMiBwcmVzY2FsZXIgdmFsdWUKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBnZXQgaW5wdXQgY2FwdHVyZSAzIHByZXNjYWxlciB2YWx1ZQorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IGdldCBpbnB1dCBjYXB0dXJlIDQgcHJlc2NhbGVyIHZhbHVlCisgKiBAcmV0dmFsIFRoZSBpbnB1dCBjYXB0dXJlIHByZXNjYWxlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIFRJTV9JQ1BTQ19ESVYxOiBubyBwcmVzY2FsZXIKKyAqICAgICAgICAgICAgQGFyZyBUSU1fSUNQU0NfRElWMjogY2FwdHVyZSBpcyBkb25lIG9uY2UgZXZlcnkgMiBldmVudHMKKyAqICAgICAgICAgICAgQGFyZyBUSU1fSUNQU0NfRElWNDogY2FwdHVyZSBpcyBkb25lIG9uY2UgZXZlcnkgNCBldmVudHMKKyAqICAgICAgICAgICAgQGFyZyBUSU1fSUNQU0NfRElWODogY2FwdHVyZSBpcyBkb25lIG9uY2UgZXZlcnkgOCBldmVudHMKKyAqLworI2RlZmluZSBfX0hBTF9USU1fR0VUX0lDUFJFU0NBTEVSKF9fSEFORExFX18sIF9fQ0hBTk5FTF9fKSAgICAgICAgICBcCisgICgoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMSAmIFRJTV9DQ01SMV9JQzFQU0MpICAgICAgICAgXAorICAgOiAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgPyAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIxICYgVElNX0NDTVIxX0lDMlBTQykgPj4gOFUpIFwKKyAgIDogKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIyICYgVElNX0NDTVIyX0lDM1BTQykgICAgICAgICBcCisgICAgICAgOiAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIyICYgVElNX0NDTVIyX0lDNFBTQykpID4+IDhVKQorCisvKioKKyAqIEBicmllZiAgU2V0IHRoZSBUSU0gQ2FwdHVyZSBDb21wYXJlIFJlZ2lzdGVyIHZhbHVlIG9uIHJ1bnRpbWUgd2l0aG91dCBjYWxsaW5nCisgKiBhbm90aGVyIHRpbWUgQ29uZmlnQ2hhbm5lbCBmdW5jdGlvbi4KKyAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlLgorICogQHBhcmFtICBfX0NIQU5ORUxfXyBUSU0gQ2hhbm5lbHMgdG8gYmUgY29uZmlndXJlZC4KKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzU6IFRJTSBDaGFubmVsIDUgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF82OiBUSU0gQ2hhbm5lbCA2IHNlbGVjdGVkCisgKiBAcGFyYW0gIF9fQ09NUEFSRV9fIHNwZWNpZmllcyB0aGUgQ2FwdHVyZSBDb21wYXJlIHJlZ2lzdGVyIG5ldyB2YWx1ZS4KKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX1RJTV9TRVRfQ09NUEFSRShfX0hBTkRMRV9fLCBfX0NIQU5ORUxfXywgX19DT01QQVJFX18pIFwKKyAgKCgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDUjEgPSAoX19DT01QQVJFX18pKSAgICAgICAgICAgICBcCisgICA6ICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ1IyID0gKF9fQ09NUEFSRV9fKSkgICAgICAgICAgICAgXAorICAgOiAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NSMyA9IChfX0NPTVBBUkVfXykpICAgICAgICAgICAgIFwKKyAgIDogKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfNCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDUjQgPSAoX19DT01QQVJFX18pKSAgICAgICAgICAgICBcCisgICA6ICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ1I1ID0gKF9fQ09NUEFSRV9fKSkgICAgICAgICAgICAgXAorICAgICAgIDogKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDUjYgPSAoX19DT01QQVJFX18pKSkKKworLyoqCisgKiBAYnJpZWYgIEdldCB0aGUgVElNIENhcHR1cmUgQ29tcGFyZSBSZWdpc3RlciB2YWx1ZSBvbiBydW50aW1lLgorICogQHBhcmFtICBfX0hBTkRMRV9fIFRJTSBoYW5kbGUuCisgKiBAcGFyYW0gIF9fQ0hBTk5FTF9fIFRJTSBDaGFubmVsIGFzc29jaWF0ZWQgd2l0aCB0aGUgY2FwdHVyZSBjb21wYXJlIHJlZ2lzdGVyCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IGdldCBjYXB0dXJlL2NvbXBhcmUgMSByZWdpc3RlciB2YWx1ZQorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IGdldCBjYXB0dXJlL2NvbXBhcmUgMiByZWdpc3RlciB2YWx1ZQorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IGdldCBjYXB0dXJlL2NvbXBhcmUgMyByZWdpc3RlciB2YWx1ZQorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IGdldCBjYXB0dXJlL2NvbXBhcmUgNCByZWdpc3RlciB2YWx1ZQorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzU6IGdldCBjYXB0dXJlL2NvbXBhcmUgNSByZWdpc3RlciB2YWx1ZQorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzY6IGdldCBjYXB0dXJlL2NvbXBhcmUgNiByZWdpc3RlciB2YWx1ZQorICogQHJldHZhbCAxNi1iaXQgb3IgMzItYml0IHZhbHVlIG9mIHRoZSBjYXB0dXJlL2NvbXBhcmUgcmVnaXN0ZXIgKFRJTXhfQ0NSeSkKKyAqLworI2RlZmluZSBfX0hBTF9USU1fR0VUX0NPTVBBUkUoX19IQU5ETEVfXywgX19DSEFOTkVMX18pICAgICAgICAgICAgICAgICBcCisgICgoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8xKSAgID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDUjEpIFwKKyAgIDogKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMikgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NSMikgXAorICAgOiAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8zKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ1IzKSBcCisgICA6ICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzQpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDUjQpIFwKKyAgIDogKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfNSkgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NSNSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ1I2KSkKKworLyoqCisgKiBAYnJpZWYgIFNldCB0aGUgVElNIE91dHB1dCBjb21wYXJlIHByZWxvYWQuCisgKiBAcGFyYW0gIF9fSEFORExFX18gVElNIGhhbmRsZS4KKyAqIEBwYXJhbSAgX19DSEFOTkVMX18gVElNIENoYW5uZWxzIHRvIGJlIGNvbmZpZ3VyZWQuCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF81OiBUSU0gQ2hhbm5lbCA1IHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNjogVElNIENoYW5uZWwgNiBzZWxlY3RlZAorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfVElNX0VOQUJMRV9PQ3hQUkVMT0FEKF9fSEFORExFX18sIF9fQ0hBTk5FTF9fKSBcCisgICgoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIxIHw9IFRJTV9DQ01SMV9PQzFQRSkgIFwKKyAgIDogKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMikgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjEgfD0gVElNX0NDTVIxX09DMlBFKSAgXAorICAgOiAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8zKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMiB8PSBUSU1fQ0NNUjJfT0MzUEUpICBcCisgICA6ICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzQpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIyIHw9IFRJTV9DQ01SMl9PQzRQRSkgIFwKKyAgIDogKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfNSkgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjMgfD0gVElNX0NDTVIzX09DNVBFKSAgXAorICAgICAgIDogKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIzIHw9IFRJTV9DQ01SM19PQzZQRSkpCisKKy8qKgorICogQGJyaWVmICBSZXNldCB0aGUgVElNIE91dHB1dCBjb21wYXJlIHByZWxvYWQuCisgKiBAcGFyYW0gIF9fSEFORExFX18gVElNIGhhbmRsZS4KKyAqIEBwYXJhbSAgX19DSEFOTkVMX18gVElNIENoYW5uZWxzIHRvIGJlIGNvbmZpZ3VyZWQuCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF81OiBUSU0gQ2hhbm5lbCA1IHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNjogVElNIENoYW5uZWwgNiBzZWxlY3RlZAorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfVElNX0RJU0FCTEVfT0N4UFJFTE9BRChfX0hBTkRMRV9fLCBfX0NIQU5ORUxfXykgXAorICAoKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjEgJj0gflRJTV9DQ01SMV9PQzFQRSkgIFwKKyAgIDogKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMikgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIxICY9IH5USU1fQ0NNUjFfT0MyUEUpICBcCisgICA6ICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzMpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMiAmPSB+VElNX0NDTVIyX09DM1BFKSAgXAorICAgOiAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF80KSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjIgJj0gflRJTV9DQ01SMl9PQzRQRSkgIFwKKyAgIDogKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfNSkgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIzICY9IH5USU1fQ0NNUjNfT0M1UEUpICBcCisgICAgICAgOiAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjMgJj0gflRJTV9DQ01SM19PQzZQRSkpCisKKy8qKgorICogQGJyaWVmICBFbmFibGUgZmFzdCBtb2RlIGZvciBhIGdpdmVuIGNoYW5uZWwuCisgKiBAcGFyYW0gIF9fSEFORExFX18gVElNIGhhbmRsZS4KKyAqIEBwYXJhbSAgX19DSEFOTkVMX18gVElNIENoYW5uZWxzIHRvIGJlIGNvbmZpZ3VyZWQuCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF81OiBUSU0gQ2hhbm5lbCA1IHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNjogVElNIENoYW5uZWwgNiBzZWxlY3RlZAorICogQG5vdGUgIFdoZW4gZmFzdCBtb2RlIGlzIGVuYWJsZWQgYW4gYWN0aXZlIGVkZ2Ugb24gdGhlIHRyaWdnZXIgaW5wdXQgYWN0cworICogICAgICAgIGxpa2UgYSBjb21wYXJlIG1hdGNoIG9uIENDeCBvdXRwdXQuIERlbGF5IHRvIHNhbXBsZSB0aGUgdHJpZ2dlcgorICogICAgICAgIGlucHV0IGFuZCB0byBhY3RpdmF0ZSBDQ3ggb3V0cHV0IGlzIHJlZHVjZWQgdG8gMyBjbG9jayBjeWNsZXMuCisgKiBAbm90ZSAgRmFzdCBtb2RlIGFjdHMgb25seSBpZiB0aGUgY2hhbm5lbCBpcyBjb25maWd1cmVkIGluIFBXTTEgb3IgUFdNMiBtb2RlLgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfVElNX0VOQUJMRV9PQ3hGQVNUKF9fSEFORExFX18sIF9fQ0hBTk5FTF9fKSAgIFwKKyAgKCgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzEpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMSB8PSBUSU1fQ0NNUjFfT0MxRkUpIFwKKyAgIDogKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMikgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMSB8PSBUSU1fQ0NNUjFfT0MyRkUpIFwKKyAgIDogKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMykgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMiB8PSBUSU1fQ0NNUjJfT0MzRkUpIFwKKyAgIDogKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfNCkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMiB8PSBUSU1fQ0NNUjJfT0M0RkUpIFwKKyAgIDogKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfNSkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMyB8PSBUSU1fQ0NNUjNfT0M1RkUpIFwKKyAgICAgICA6ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMyB8PSBUSU1fQ0NNUjNfT0M2RkUpKQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBmYXN0IG1vZGUgZm9yIGEgZ2l2ZW4gY2hhbm5lbC4KKyAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlLgorICogQHBhcmFtICBfX0NIQU5ORUxfXyBUSU0gQ2hhbm5lbHMgdG8gYmUgY29uZmlndXJlZC4KKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzU6IFRJTSBDaGFubmVsIDUgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF82OiBUSU0gQ2hhbm5lbCA2IHNlbGVjdGVkCisgKiBAbm90ZSAgV2hlbiBmYXN0IG1vZGUgaXMgZGlzYWJsZWQgQ0N4IG91dHB1dCBiZWhhdmVzIG5vcm1hbGx5IGRlcGVuZGluZworICogICAgICAgIG9uIGNvdW50ZXIgYW5kIENDUnggdmFsdWVzIGV2ZW4gd2hlbiB0aGUgdHJpZ2dlciBpcyBPTi4gVGhlIG1pbmltdW0KKyAqICAgICAgICBkZWxheSB0byBhY3RpdmF0ZSBDQ3ggb3V0cHV0IHdoZW4gYW4gYWN0aXZlIGVkZ2Ugb2NjdXJzIG9uIHRoZQorICogICAgICAgIHRyaWdnZXIgaW5wdXQgaXMgNSBjbG9jayBjeWNsZXMuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9USU1fRElTQUJMRV9PQ3hGQVNUKF9fSEFORExFX18sIF9fQ0hBTk5FTF9fKSAgIFwKKyAgKCgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzEpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjEgJj0gflRJTV9DQ01SMV9PQzFGRSkgXAorICAgOiAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8yKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMSAmPSB+VElNX0NDTVIxX09DMkZFKSBcCisgICA6ICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzMpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIyICY9IH5USU1fQ0NNUjJfT0MzRkUpIFwKKyAgIDogKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfNCkgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjIgJj0gflRJTV9DQ01SMl9PQzRGRSkgXAorICAgOiAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF81KSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMyAmPSB+VElNX0NDTVIzX09DNUZFKSBcCisgICAgICAgOiAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjMgJj0gflRJTV9DQ01SM19PQzZGRSkpCisKKy8qKgorICogQGJyaWVmICBTZXQgdGhlIFVwZGF0ZSBSZXF1ZXN0IFNvdXJjZSAoVVJTKSBiaXQgb2YgdGhlIFRJTXhfQ1IxIHJlZ2lzdGVyLgorICogQHBhcmFtICBfX0hBTkRMRV9fIFRJTSBoYW5kbGUuCisgKiBAbm90ZSAgV2hlbiB0aGUgVVJTIGJpdCBvZiB0aGUgVElNeF9DUjEgcmVnaXN0ZXIgaXMgc2V0LCBvbmx5IGNvdW50ZXIKKyAqICAgICAgICBvdmVyZmxvdy91bmRlcmZsb3cgZ2VuZXJhdGVzIGFuIHVwZGF0ZSBpbnRlcnJ1cHQgb3IgRE1BIHJlcXVlc3QgKGlmCisgKiAgICAgICAgZW5hYmxlZCkKKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX1RJTV9VUlNfRU5BQkxFKF9fSEFORExFX18pIFwKKyAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSB8PSBUSU1fQ1IxX1VSUykKKworLyoqCisgKiBAYnJpZWYgIFJlc2V0IHRoZSBVcGRhdGUgUmVxdWVzdCBTb3VyY2UgKFVSUykgYml0IG9mIHRoZSBUSU14X0NSMSByZWdpc3Rlci4KKyAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlLgorICogQG5vdGUgIFdoZW4gdGhlIFVSUyBiaXQgb2YgdGhlIFRJTXhfQ1IxIHJlZ2lzdGVyIGlzIHJlc2V0LCBhbnkgb2YgdGhlCisgKiAgICAgICAgZm9sbG93aW5nIGV2ZW50cyBnZW5lcmF0ZSBhbiB1cGRhdGUgaW50ZXJydXB0IG9yIERNQSByZXF1ZXN0IChpZgorICogICAgICAgIGVuYWJsZWQpOgorICogICAgICAgICAgIF8gQ291bnRlciBvdmVyZmxvdyB1bmRlcmZsb3cKKyAqICAgICAgICAgICBfIFNldHRpbmcgdGhlIFVHIGJpdAorICogICAgICAgICAgIF8gVXBkYXRlIGdlbmVyYXRpb24gdGhyb3VnaCB0aGUgc2xhdmUgbW9kZSBjb250cm9sbGVyCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9USU1fVVJTX0RJU0FCTEUoX19IQU5ETEVfXykgXAorICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxICY9IH5USU1fQ1IxX1VSUykKKworLyoqCisgKiBAYnJpZWYgIFNldCB0aGUgVElNIENhcHR1cmUgeCBpbnB1dCBwb2xhcml0eSBvbiBydW50aW1lLgorICogQHBhcmFtICBfX0hBTkRMRV9fIFRJTSBoYW5kbGUuCisgKiBAcGFyYW0gIF9fQ0hBTk5FTF9fIFRJTSBDaGFubmVscyB0byBiZSBjb25maWd1cmVkLgorICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkCisgKiBAcGFyYW0gIF9fUE9MQVJJVFlfXyBQb2xhcml0eSBmb3IgVEl4IHNvdXJjZQorICogICAgICAgICAgICBAYXJnIFRJTV9JTlBVVENIQU5ORUxQT0xBUklUWV9SSVNJTkc6IFJpc2luZyBFZGdlCisgKiAgICAgICAgICAgIEBhcmcgVElNX0lOUFVUQ0hBTk5FTFBPTEFSSVRZX0ZBTExJTkc6IEZhbGxpbmcgRWRnZQorICogICAgICAgICAgICBAYXJnIFRJTV9JTlBVVENIQU5ORUxQT0xBUklUWV9CT1RIRURHRTogUmlzaW5nIGFuZCBGYWxsaW5nIEVkZ2UKKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX1RJTV9TRVRfQ0FQVFVSRVBPTEFSSVRZKF9fSEFORExFX18sIF9fQ0hBTk5FTF9fLCBfX1BPTEFSSVRZX18pIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRJTV9SRVNFVF9DQVBUVVJFUE9MQVJJVFkoKF9fSEFORExFX18pLCAoX19DSEFOTkVMX18pKTsgICAgICAgICAgICAgICAgICBcCisgICAgVElNX1NFVF9DQVBUVVJFUE9MQVJJVFkoKF9fSEFORExFX18pLCAoX19DSEFOTkVMX18pLCAoX19QT0xBUklUWV9fKSk7ICAgIFwKKyAgfSB3aGlsZSAoMCkKKworLyoqIEBicmllZiAgU2VsZWN0IHRoZSBDYXB0dXJlL2NvbXBhcmUgRE1BIHJlcXVlc3Qgc291cmNlLgorICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVElNIEhhbmRsZS4KKyAqIEBwYXJhbSAgX19DQ0RNQV9fIHNwZWNpZmllcyBDYXB0dXJlL2NvbXBhcmUgRE1BIHJlcXVlc3Qgc291cmNlCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIFRJTV9DQ0RNQVJFUVVFU1RfQ0M6IENDeCBETUEgcmVxdWVzdCBnZW5lcmF0ZWQgb24KKyAqIENhcHR1cmUvQ29tcGFyZSBldmVudAorICogICAgICAgICAgICBAYXJnIFRJTV9DQ0RNQVJFUVVFU1RfVVBEQVRFOiBDQ3ggRE1BIHJlcXVlc3QgZ2VuZXJhdGVkIG9uIFVwZGF0ZQorICogZXZlbnQKKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX1RJTV9TRUxFQ1RfQ0NETUFSRVFVRVNUKF9fSEFORExFX18sIF9fQ0NETUFfXykgXAorICBNT0RJRllfUkVHKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMiwgVElNX0NSMl9DQ0RTLCAoX19DQ0RNQV9fKSkKKworLyoqCisgKiBAfQorICovCisvKiBFbmQgb2YgZXhwb3J0ZWQgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBUSU1fUHJpdmF0ZV9Db25zdGFudHMgVElNIFByaXZhdGUgQ29uc3RhbnRzCisgKiBAeworICovCisvKiBUaGUgY291bnRlciBvZiBhIHRpbWVyIGluc3RhbmNlIGlzIGRpc2FibGVkIG9ubHkgaWYgYWxsIHRoZSBDQ3ggYW5kIENDeE4KKyAgIGNoYW5uZWxzIGhhdmUgYmVlbiBkaXNhYmxlZCAqLworI2RlZmluZSBUSU1fQ0NFUl9DQ3hFX01BU0sgXAorICAoKHVpbnQzMl90KShUSU1fQ0NFUl9DQzFFIHwgVElNX0NDRVJfQ0MyRSB8IFRJTV9DQ0VSX0NDM0UgfCBUSU1fQ0NFUl9DQzRFKSkKKyNkZWZpbmUgVElNX0NDRVJfQ0N4TkVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKHVpbnQzMl90KShUSU1fQ0NFUl9DQzFORSB8IFRJTV9DQ0VSX0NDMk5FIHwgVElNX0NDRVJfQ0MzTkUgfCBcCisgICAgICAgICAgICAgIFRJTV9DQ0VSX0NDNE5FKSkKKy8qKgorICogQH0KKyAqLworLyogRW5kIG9mIHByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVElNX1ByaXZhdGVfTWFjcm9zIFRJTSBQcml2YXRlIE1hY3JvcworICogQHsKKyAqLworI2lmIGRlZmluZWQoQ09NUDUpICYmIGRlZmluZWQoQ09NUDYpICYmIGRlZmluZWQoQ09NUDcpCisjZGVmaW5lIElTX1RJTV9DTEVBUklOUFVUX1NPVVJDRShfX01PREVfXykgICAgICAgXAorICAoKChfX01PREVfXykgPT0gVElNX0NMRUFSSU5QVVRTT1VSQ0VfRVRSKSB8fCAgIFwKKyAgICgoX19NT0RFX18pID09IFRJTV9DTEVBUklOUFVUU09VUkNFX0NPTVAxKSB8fCBcCisgICAoKF9fTU9ERV9fKSA9PSBUSU1fQ0xFQVJJTlBVVFNPVVJDRV9DT01QMikgfHwgXAorICAgKChfX01PREVfXykgPT0gVElNX0NMRUFSSU5QVVRTT1VSQ0VfQ09NUDMpIHx8IFwKKyAgICgoX19NT0RFX18pID09IFRJTV9DTEVBUklOUFVUU09VUkNFX0NPTVA0KSB8fCBcCisgICAoKF9fTU9ERV9fKSA9PSBUSU1fQ0xFQVJJTlBVVFNPVVJDRV9DT01QNSkgfHwgXAorICAgKChfX01PREVfXykgPT0gVElNX0NMRUFSSU5QVVRTT1VSQ0VfQ09NUDYpIHx8IFwKKyAgICgoX19NT0RFX18pID09IFRJTV9DTEVBUklOUFVUU09VUkNFX0NPTVA3KSB8fCBcCisgICAoKF9fTU9ERV9fKSA9PSBUSU1fQ0xFQVJJTlBVVFNPVVJDRV9OT05FKSkKKyNlbHNlIC8qIENPTVA1ICYmIENPTVA2ICYmIENPTVA3ICovCisjZGVmaW5lIElTX1RJTV9DTEVBUklOUFVUX1NPVVJDRShfX01PREVfXykgICAgICAgXAorICAoKChfX01PREVfXykgPT0gVElNX0NMRUFSSU5QVVRTT1VSQ0VfRVRSKSB8fCAgIFwKKyAgICgoX19NT0RFX18pID09IFRJTV9DTEVBUklOUFVUU09VUkNFX0NPTVAxKSB8fCBcCisgICAoKF9fTU9ERV9fKSA9PSBUSU1fQ0xFQVJJTlBVVFNPVVJDRV9DT01QMikgfHwgXAorICAgKChfX01PREVfXykgPT0gVElNX0NMRUFSSU5QVVRTT1VSQ0VfQ09NUDMpIHx8IFwKKyAgICgoX19NT0RFX18pID09IFRJTV9DTEVBUklOUFVUU09VUkNFX0NPTVA0KSB8fCBcCisgICAoKF9fTU9ERV9fKSA9PSBUSU1fQ0xFQVJJTlBVVFNPVVJDRV9OT05FKSkKKyNlbmRpZiAvKiBDT01QNSAmJiBDT01QNiAmJiBDT01QNyAqLworCisjZGVmaW5lIElTX1RJTV9ETUFfQkFTRShfX0JBU0VfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX0NSMSkgfHwgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQ1IyKSB8fCAgICAgXAorICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfU01DUikgfHwgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfRElFUikgfHwgICBcCisgICAoKF9fQkFTRV9fKSA9PSBUSU1fRE1BQkFTRV9TUikgfHwgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfRUdSKSB8fCAgICAgIFwKKyAgICgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX0NDTVIxKSB8fCAoKF9fQkFTRV9fKSA9PSBUSU1fRE1BQkFTRV9DQ01SMikgfHwgXAorICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQ0NFUikgfHwgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQ05UKSB8fCAgICBcCisgICAoKF9fQkFTRV9fKSA9PSBUSU1fRE1BQkFTRV9QU0MpIHx8ICgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX0FSUikgfHwgICAgIFwKKyAgICgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX1JDUikgfHwgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQ0NSMSkgfHwgICAgXAorICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQ0NSMikgfHwgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQ0NSMykgfHwgICBcCisgICAoKF9fQkFTRV9fKSA9PSBUSU1fRE1BQkFTRV9DQ1I0KSB8fCAoKF9fQkFTRV9fKSA9PSBUSU1fRE1BQkFTRV9CRFRSKSB8fCAgIFwKKyAgICgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX0NDTVIzKSB8fCAoKF9fQkFTRV9fKSA9PSBUSU1fRE1BQkFTRV9DQ1I1KSB8fCAgXAorICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQ0NSNikgfHwgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQUYxKSB8fCAgICBcCisgICAoKF9fQkFTRV9fKSA9PSBUSU1fRE1BQkFTRV9BRjIpIHx8ICgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX1RJU0VMKSB8fCAgIFwKKyAgICgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX0RUUjIpIHx8ICgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX0VDUikgfHwgICAgXAorICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfT1IpKQorCisjZGVmaW5lIElTX1RJTV9FVkVOVF9TT1VSQ0UoX19TT1VSQ0VfXykgICAgICAgICAgICAgXAorICAoKCgoX19TT1VSQ0VfXykgJiAweEZGRkZGRTAwVSkgPT0gMHgwMDAwMDAwMFUpICYmIFwKKyAgICgoX19TT1VSQ0VfXykgIT0gMHgwMDAwMDAwMFUpKQorCisjZGVmaW5lIElTX1RJTV9DT1VOVEVSX01PREUoX19NT0RFX18pICAgICAgICAgICAgICAgIFwKKyAgKCgoX19NT0RFX18pID09IFRJTV9DT1VOVEVSTU9ERV9VUCkgfHwgICAgICAgICAgICAgXAorICAgKChfX01PREVfXykgPT0gVElNX0NPVU5URVJNT0RFX0RPV04pIHx8ICAgICAgICAgICBcCisgICAoKF9fTU9ERV9fKSA9PSBUSU1fQ09VTlRFUk1PREVfQ0VOVEVSQUxJR05FRDEpIHx8IFwKKyAgICgoX19NT0RFX18pID09IFRJTV9DT1VOVEVSTU9ERV9DRU5URVJBTElHTkVEMikgfHwgXAorICAgKChfX01PREVfXykgPT0gVElNX0NPVU5URVJNT0RFX0NFTlRFUkFMSUdORUQzKSkKKworI2RlZmluZSBJU19USU1fVUlGUkVNQVBfTU9ERShfX01PREVfXykgXAorICAoKChfX01PREVfXykgPT0gVElNX1VJRlJFTUFQX0RJU0FCTEUpIHx8ICgoX19NT0RFX18pID09IFRJTV9VSUZSRU1BUF9FTkFCTEUpKQorCisjZGVmaW5lIElTX1RJTV9DTE9DS0RJVklTSU9OX0RJVihfX0RJVl9fKSAgIFwKKyAgKCgoX19ESVZfXykgPT0gVElNX0NMT0NLRElWSVNJT05fRElWMSkgfHwgXAorICAgKChfX0RJVl9fKSA9PSBUSU1fQ0xPQ0tESVZJU0lPTl9ESVYyKSB8fCBcCisgICAoKF9fRElWX18pID09IFRJTV9DTE9DS0RJVklTSU9OX0RJVjQpKQorCisjZGVmaW5lIElTX1RJTV9BVVRPUkVMT0FEX1BSRUxPQUQoUFJFTE9BRCkgICAgICAgICAgXAorICAoKChQUkVMT0FEKSA9PSBUSU1fQVVUT1JFTE9BRF9QUkVMT0FEX0RJU0FCTEUpIHx8IFwKKyAgICgoUFJFTE9BRCkgPT0gVElNX0FVVE9SRUxPQURfUFJFTE9BRF9FTkFCTEUpKQorCisjZGVmaW5lIElTX1RJTV9GQVNUX1NUQVRFKF9fU1RBVEVfXykgXAorICAoKChfX1NUQVRFX18pID09IFRJTV9PQ0ZBU1RfRElTQUJMRSkgfHwgKChfX1NUQVRFX18pID09IFRJTV9PQ0ZBU1RfRU5BQkxFKSkKKworI2RlZmluZSBJU19USU1fT0NfUE9MQVJJVFkoX19QT0xBUklUWV9fKSAgICAgIFwKKyAgKCgoX19QT0xBUklUWV9fKSA9PSBUSU1fT0NQT0xBUklUWV9ISUdIKSB8fCBcCisgICAoKF9fUE9MQVJJVFlfXykgPT0gVElNX09DUE9MQVJJVFlfTE9XKSkKKworI2RlZmluZSBJU19USU1fT0NOX1BPTEFSSVRZKF9fUE9MQVJJVFlfXykgICAgICBcCisgICgoKF9fUE9MQVJJVFlfXykgPT0gVElNX09DTlBPTEFSSVRZX0hJR0gpIHx8IFwKKyAgICgoX19QT0xBUklUWV9fKSA9PSBUSU1fT0NOUE9MQVJJVFlfTE9XKSkKKworI2RlZmluZSBJU19USU1fT0NJRExFX1NUQVRFKF9fU1RBVEVfXykgICAgIFwKKyAgKCgoX19TVEFURV9fKSA9PSBUSU1fT0NJRExFU1RBVEVfU0VUKSB8fCBcCisgICAoKF9fU1RBVEVfXykgPT0gVElNX09DSURMRVNUQVRFX1JFU0VUKSkKKworI2RlZmluZSBJU19USU1fT0NOSURMRV9TVEFURShfX1NUQVRFX18pICAgICBcCisgICgoKF9fU1RBVEVfXykgPT0gVElNX09DTklETEVTVEFURV9TRVQpIHx8IFwKKyAgICgoX19TVEFURV9fKSA9PSBUSU1fT0NOSURMRVNUQVRFX1JFU0VUKSkKKworI2RlZmluZSBJU19USU1fRU5DT0RFUklOUFVUX1BPTEFSSVRZKF9fUE9MQVJJVFlfXykgICAgICAgIFwKKyAgKCgoX19QT0xBUklUWV9fKSA9PSBUSU1fRU5DT0RFUklOUFVUUE9MQVJJVFlfUklTSU5HKSB8fCBcCisgICAoKF9fUE9MQVJJVFlfXykgPT0gVElNX0VOQ09ERVJJTlBVVFBPTEFSSVRZX0ZBTExJTkcpKQorCisjZGVmaW5lIElTX1RJTV9JQ19QT0xBUklUWShfX1BPTEFSSVRZX18pICAgICAgICAgXAorICAoKChfX1BPTEFSSVRZX18pID09IFRJTV9JQ1BPTEFSSVRZX1JJU0lORykgfHwgIFwKKyAgICgoX19QT0xBUklUWV9fKSA9PSBUSU1fSUNQT0xBUklUWV9GQUxMSU5HKSB8fCBcCisgICAoKF9fUE9MQVJJVFlfXykgPT0gVElNX0lDUE9MQVJJVFlfQk9USEVER0UpKQorCisjZGVmaW5lIElTX1RJTV9JQ19TRUxFQ1RJT04oX19TRUxFQ1RJT05fXykgICAgICAgICAgICBcCisgICgoKF9fU0VMRUNUSU9OX18pID09IFRJTV9JQ1NFTEVDVElPTl9ESVJFQ1RUSSkgfHwgICBcCisgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9JQ1NFTEVDVElPTl9JTkRJUkVDVFRJKSB8fCBcCisgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9JQ1NFTEVDVElPTl9UUkMpKQorCisjZGVmaW5lIElTX1RJTV9JQ19QUkVTQ0FMRVIoX19QUkVTQ0FMRVJfXykgXAorICAoKChfX1BSRVNDQUxFUl9fKSA9PSBUSU1fSUNQU0NfRElWMSkgfHwgIFwKKyAgICgoX19QUkVTQ0FMRVJfXykgPT0gVElNX0lDUFNDX0RJVjIpIHx8ICBcCisgICAoKF9fUFJFU0NBTEVSX18pID09IFRJTV9JQ1BTQ19ESVY0KSB8fCAoKF9fUFJFU0NBTEVSX18pID09IFRJTV9JQ1BTQ19ESVY4KSkKKworI2RlZmluZSBJU19USU1fQ0NYX0NIQU5ORUwoX19JTlNUQU5DRV9fLCBfX0NIQU5ORUxfXykgXAorICAoSVNfVElNX0NDWF9JTlNUQU5DRShfX0lOU1RBTkNFX18sIF9fQ0hBTk5FTF9fKSAmJiAgXAorICAgKChfX0NIQU5ORUxfXykgIT0gKFRJTV9DSEFOTkVMXzUpKSAmJiAoKF9fQ0hBTk5FTF9fKSAhPSAoVElNX0NIQU5ORUxfNikpKQorCisjZGVmaW5lIElTX1RJTV9PUE1fTU9ERShfX01PREVfXykgXAorICAoKChfX01PREVfXykgPT0gVElNX09QTU9ERV9TSU5HTEUpIHx8ICgoX19NT0RFX18pID09IFRJTV9PUE1PREVfUkVQRVRJVElWRSkpCisKKyNkZWZpbmUgSVNfVElNX0VOQ09ERVJfTU9ERShfX01PREVfXykgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoX19NT0RFX18pID09IFRJTV9FTkNPREVSTU9ERV9USTEpIHx8ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoX19NT0RFX18pID09IFRJTV9FTkNPREVSTU9ERV9USTIpIHx8ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoX19NT0RFX18pID09IFRJTV9FTkNPREVSTU9ERV9USTEyKSB8fCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoX19NT0RFX18pID09IFRJTV9FTkNPREVSTU9ERV9DTE9DS1BMVVNESVJFQ1RJT05fWDIpIHx8ICAgIFwKKyAgICgoX19NT0RFX18pID09IFRJTV9FTkNPREVSTU9ERV9DTE9DS1BMVVNESVJFQ1RJT05fWDEpIHx8ICAgIFwKKyAgICgoX19NT0RFX18pID09IFRJTV9FTkNPREVSTU9ERV9ESVJFQ1RJT05BTENMT0NLX1gyKSB8fCAgICAgIFwKKyAgICgoX19NT0RFX18pID09IFRJTV9FTkNPREVSTU9ERV9ESVJFQ1RJT05BTENMT0NLX1gxX1RJMTIpIHx8IFwKKyAgICgoX19NT0RFX18pID09IFRJTV9FTkNPREVSTU9ERV9YMV9USTEpIHx8ICAgICAgICAgICAgICAgICAgIFwKKyAgICgoX19NT0RFX18pID09IFRJTV9FTkNPREVSTU9ERV9YMV9USTIpKQorCisjZGVmaW5lIElTX1RJTV9ETUFfU09VUkNFKF9fU09VUkNFX18pICAgICAgICAgICAgICAgXAorICAoKCgoX19TT1VSQ0VfXykgJiAweEZGRkY4MEZGVSkgPT0gMHgwMDAwMDAwMFUpICYmIFwKKyAgICgoX19TT1VSQ0VfXykgIT0gMHgwMDAwMDAwMFUpKQorCisjZGVmaW5lIElTX1RJTV9DSEFOTkVMUyhfX0NIQU5ORUxfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8xKSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8yKSB8fCBcCisgICAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8zKSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF80KSB8fCBcCisgICAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF81KSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF82KSB8fCBcCisgICAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF9BTEwpKQorCisjZGVmaW5lIElTX1RJTV9PUE1fQ0hBTk5FTFMoX19DSEFOTkVMX18pIFwKKyAgKCgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzEpIHx8ICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzIpKQorCisjZGVmaW5lIElTX1RJTV9QRVJJT0QoX19IQU5ETEVfXywgX19QRVJJT0RfXykgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoSVNfVElNXzMyQl9DT1VOVEVSX0lOU1RBTkNFKCgoX19IQU5ETEVfXyktPkluc3RhbmNlKSkgPT0gMFUpICAgICAgICBcCisgICAgICAgPyAoKFJFQURfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSwgVElNX0NSMV9ESVRIRU4pID09IDBVKSBcCisgICAgICAgICAgICAgID8gKCgoX19QRVJJT0RfXykgPiAwVSkgJiYgKChfX1BFUklPRF9fKSA8PSAweDAwMDBGRkZGVSkpICBcCisgICAgICAgICAgICAgIDogKCgoX19QRVJJT0RfXykgPiAwVSkgJiYgKChfX1BFUklPRF9fKSA8PSAweDAwMEZGRkVGVSkpKSBcCisgICAgICAgOiAoKF9fUEVSSU9EX18pID4gMFUpKQorCisjZGVmaW5lIElTX1RJTV9DT01QTEVNRU5UQVJZX0NIQU5ORUxTKF9fQ0hBTk5FTF9fKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8xKSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8yKSB8fCBcCisgICAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8zKSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF80KSkKKworI2lmIGRlZmluZWQoVElNNSkgJiYgZGVmaW5lZChUSU0yMCkKKyNkZWZpbmUgSVNfVElNX0NMT0NLU09VUkNFKF9fQ0xPQ0tfXykgICAgICAgICAgIFwKKyAgKCgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSU5URVJOQUwpIHx8IFwKKyAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTEpIHx8IFwKKyAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTIpIHx8IFwKKyAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkxRUQpIHx8ICAgIFwKKyAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkxKSB8fCAgICAgIFwKKyAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkyKSB8fCAgICAgIFwKKyAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMCkgfHwgICAgIFwKKyAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMSkgfHwgICAgIFwKKyAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMikgfHwgICAgIFwKKyAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMykgfHwgICAgIFwKKyAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNCkgfHwgICAgIFwKKyAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNSkgfHwgICAgIFwKKyAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNikgfHwgICAgIFwKKyAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNykgfHwgICAgIFwKKyAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSOCkgfHwgICAgIFwKKyAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSOSkgfHwgICAgIFwKKyAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMTApIHx8ICAgIFwKKyAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMTEpKQorI2VsaWYgZGVmaW5lZChUSU01KQorI2RlZmluZSBJU19USU1fQ0xPQ0tTT1VSQ0UoX19DTE9DS19fKSAgICAgICAgICAgXAorICAoKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JTlRFUk5BTCkgfHwgXAorICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMSkgfHwgXAorICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMikgfHwgXAorICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTFFRCkgfHwgICAgXAorICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTEpIHx8ICAgICAgXAorICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTIpIHx8ICAgICAgXAorICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIwKSB8fCAgICAgXAorICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIxKSB8fCAgICAgXAorICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIyKSB8fCAgICAgXAorICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIzKSB8fCAgICAgXAorICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI0KSB8fCAgICAgXAorICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI1KSB8fCAgICAgXAorICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI2KSB8fCAgICAgXAorICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI3KSB8fCAgICAgXAorICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI4KSB8fCAgICAgXAorICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIxMSkpCisjZWxpZiBkZWZpbmVkKFRJTTIwKQorI2RlZmluZSBJU19USU1fQ0xPQ0tTT1VSQ0UoX19DTE9DS19fKSAgICAgICAgICAgXAorICAoKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JTlRFUk5BTCkgfHwgXAorICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMSkgfHwgXAorICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMikgfHwgXAorICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTFFRCkgfHwgICAgXAorICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTEpIHx8ICAgICAgXAorICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTIpIHx8ICAgICAgXAorICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIwKSB8fCAgICAgXAorICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIxKSB8fCAgICAgXAorICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIyKSB8fCAgICAgXAorICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIzKSB8fCAgICAgXAorICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI1KSB8fCAgICAgXAorICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI2KSB8fCAgICAgXAorICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI3KSB8fCAgICAgXAorICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI4KSB8fCAgICAgXAorICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI5KSB8fCAgICAgXAorICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIxMSkpCisjZWxzZQorI2RlZmluZSBJU19USU1fQ0xPQ0tTT1VSQ0UoX19DTE9DS19fKSAgICAgICAgICAgXAorICAoKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JTlRFUk5BTCkgfHwgXAorICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMSkgfHwgXAorICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMikgfHwgXAorICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTFFRCkgfHwgICAgXAorICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTEpIHx8ICAgICAgXAorICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTIpIHx8ICAgICAgXAorICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIwKSB8fCAgICAgXAorICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIxKSB8fCAgICAgXAorICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIyKSB8fCAgICAgXAorICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIzKSB8fCAgICAgXAorICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI1KSB8fCAgICAgXAorICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI2KSB8fCAgICAgXAorICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI3KSB8fCAgICAgXAorICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI4KSB8fCAgICAgXAorICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIxMSkpCisjZW5kaWYgLyogVElNNSAmJiBUSU0yMCAqLworCisjZGVmaW5lIElTX1RJTV9DTE9DS1BPTEFSSVRZKF9fUE9MQVJJVFlfXykgICAgICAgICAgICAgIFwKKyAgKCgoX19QT0xBUklUWV9fKSA9PSBUSU1fQ0xPQ0tQT0xBUklUWV9JTlZFUlRFRCkgfHwgICAgXAorICAgKChfX1BPTEFSSVRZX18pID09IFRJTV9DTE9DS1BPTEFSSVRZX05PTklOVkVSVEVEKSB8fCBcCisgICAoKF9fUE9MQVJJVFlfXykgPT0gVElNX0NMT0NLUE9MQVJJVFlfUklTSU5HKSB8fCAgICAgIFwKKyAgICgoX19QT0xBUklUWV9fKSA9PSBUSU1fQ0xPQ0tQT0xBUklUWV9GQUxMSU5HKSB8fCAgICAgXAorICAgKChfX1BPTEFSSVRZX18pID09IFRJTV9DTE9DS1BPTEFSSVRZX0JPVEhFREdFKSkKKworI2RlZmluZSBJU19USU1fQ0xPQ0tQUkVTQ0FMRVIoX19QUkVTQ0FMRVJfXykgICAgICAgXAorICAoKChfX1BSRVNDQUxFUl9fKSA9PSBUSU1fQ0xPQ0tQUkVTQ0FMRVJfRElWMSkgfHwgXAorICAgKChfX1BSRVNDQUxFUl9fKSA9PSBUSU1fQ0xPQ0tQUkVTQ0FMRVJfRElWMikgfHwgXAorICAgKChfX1BSRVNDQUxFUl9fKSA9PSBUSU1fQ0xPQ0tQUkVTQ0FMRVJfRElWNCkgfHwgXAorICAgKChfX1BSRVNDQUxFUl9fKSA9PSBUSU1fQ0xPQ0tQUkVTQ0FMRVJfRElWOCkpCisKKyNkZWZpbmUgSVNfVElNX0NMT0NLRklMVEVSKF9fSUNGSUxURVJfXykgKChfX0lDRklMVEVSX18pIDw9IDB4RlUpCisKKyNkZWZpbmUgSVNfVElNX0NMRUFSSU5QVVRfUE9MQVJJVFkoX19QT0xBUklUWV9fKSAgICAgICAgICBcCisgICgoKF9fUE9MQVJJVFlfXykgPT0gVElNX0NMRUFSSU5QVVRQT0xBUklUWV9JTlZFUlRFRCkgfHwgXAorICAgKChfX1BPTEFSSVRZX18pID09IFRJTV9DTEVBUklOUFVUUE9MQVJJVFlfTk9OSU5WRVJURUQpKQorCisjZGVmaW5lIElTX1RJTV9DTEVBUklOUFVUX1BSRVNDQUxFUihfX1BSRVNDQUxFUl9fKSAgICAgIFwKKyAgKCgoX19QUkVTQ0FMRVJfXykgPT0gVElNX0NMRUFSSU5QVVRQUkVTQ0FMRVJfRElWMSkgfHwgXAorICAgKChfX1BSRVNDQUxFUl9fKSA9PSBUSU1fQ0xFQVJJTlBVVFBSRVNDQUxFUl9ESVYyKSB8fCBcCisgICAoKF9fUFJFU0NBTEVSX18pID09IFRJTV9DTEVBUklOUFVUUFJFU0NBTEVSX0RJVjQpIHx8IFwKKyAgICgoX19QUkVTQ0FMRVJfXykgPT0gVElNX0NMRUFSSU5QVVRQUkVTQ0FMRVJfRElWOCkpCisKKyNkZWZpbmUgSVNfVElNX0NMRUFSSU5QVVRfRklMVEVSKF9fSUNGSUxURVJfXykgKChfX0lDRklMVEVSX18pIDw9IDB4RlUpCisKKyNkZWZpbmUgSVNfVElNX09TU1JfU1RBVEUoX19TVEFURV9fKSBcCisgICgoKF9fU1RBVEVfXykgPT0gVElNX09TU1JfRU5BQkxFKSB8fCAoKF9fU1RBVEVfXykgPT0gVElNX09TU1JfRElTQUJMRSkpCisKKyNkZWZpbmUgSVNfVElNX09TU0lfU1RBVEUoX19TVEFURV9fKSBcCisgICgoKF9fU1RBVEVfXykgPT0gVElNX09TU0lfRU5BQkxFKSB8fCAoKF9fU1RBVEVfXykgPT0gVElNX09TU0lfRElTQUJMRSkpCisKKyNkZWZpbmUgSVNfVElNX0xPQ0tfTEVWRUwoX19MRVZFTF9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKChfX0xFVkVMX18pID09IFRJTV9MT0NLTEVWRUxfT0ZGKSB8fCAoKF9fTEVWRUxfXykgPT0gVElNX0xPQ0tMRVZFTF8xKSB8fCBcCisgICAoKF9fTEVWRUxfXykgPT0gVElNX0xPQ0tMRVZFTF8yKSB8fCAoKF9fTEVWRUxfXykgPT0gVElNX0xPQ0tMRVZFTF8zKSkKKworI2RlZmluZSBJU19USU1fQlJFQUtfRklMVEVSKF9fQlJLRklMVEVSX18pICgoX19CUktGSUxURVJfXykgPD0gMHhGVUwpCisKKyNkZWZpbmUgSVNfVElNX0JSRUFLX1NUQVRFKF9fU1RBVEVfXykgXAorICAoKChfX1NUQVRFX18pID09IFRJTV9CUkVBS19FTkFCTEUpIHx8ICgoX19TVEFURV9fKSA9PSBUSU1fQlJFQUtfRElTQUJMRSkpCisKKyNkZWZpbmUgSVNfVElNX0JSRUFLX1BPTEFSSVRZKF9fUE9MQVJJVFlfXykgICAgIFwKKyAgKCgoX19QT0xBUklUWV9fKSA9PSBUSU1fQlJFQUtQT0xBUklUWV9MT1cpIHx8IFwKKyAgICgoX19QT0xBUklUWV9fKSA9PSBUSU1fQlJFQUtQT0xBUklUWV9ISUdIKSkKKworI2RlZmluZSBJU19USU1fQlJFQUtfQUZNT0RFKF9fQUZNT0RFX18pICAgICAgICBcCisgICgoKF9fQUZNT0RFX18pID09IFRJTV9CUkVBS19BRk1PREVfSU5QVVQpIHx8IFwKKyAgICgoX19BRk1PREVfXykgPT0gVElNX0JSRUFLX0FGTU9ERV9CSURJUkVDVElPTkFMKSkKKworI2RlZmluZSBJU19USU1fQlJFQUsyX1NUQVRFKF9fU1RBVEVfXykgXAorICAoKChfX1NUQVRFX18pID09IFRJTV9CUkVBSzJfRU5BQkxFKSB8fCAoKF9fU1RBVEVfXykgPT0gVElNX0JSRUFLMl9ESVNBQkxFKSkKKworI2RlZmluZSBJU19USU1fQlJFQUsyX1BPTEFSSVRZKF9fUE9MQVJJVFlfXykgICAgIFwKKyAgKCgoX19QT0xBUklUWV9fKSA9PSBUSU1fQlJFQUsyUE9MQVJJVFlfTE9XKSB8fCBcCisgICAoKF9fUE9MQVJJVFlfXykgPT0gVElNX0JSRUFLMlBPTEFSSVRZX0hJR0gpKQorCisjZGVmaW5lIElTX1RJTV9CUkVBSzJfQUZNT0RFKF9fQUZNT0RFX18pICAgICAgICBcCisgICgoKF9fQUZNT0RFX18pID09IFRJTV9CUkVBSzJfQUZNT0RFX0lOUFVUKSB8fCBcCisgICAoKF9fQUZNT0RFX18pID09IFRJTV9CUkVBSzJfQUZNT0RFX0JJRElSRUNUSU9OQUwpKQorCisjZGVmaW5lIElTX1RJTV9BVVRPTUFUSUNfT1VUUFVUX1NUQVRFKF9fU1RBVEVfXykgIFwKKyAgKCgoX19TVEFURV9fKSA9PSBUSU1fQVVUT01BVElDT1VUUFVUX0VOQUJMRSkgfHwgXAorICAgKChfX1NUQVRFX18pID09IFRJTV9BVVRPTUFUSUNPVVRQVVRfRElTQUJMRSkpCisKKyNkZWZpbmUgSVNfVElNX0dST1VQQ0g1KF9fT0NSRUZfXykgXAorICAoKCgoX19PQ1JFRl9fKSAmIDB4MUZGRkZGRkZVKSA9PSAweDAwMDAwMDAwVSkpCisKKyNkZWZpbmUgSVNfVElNX1RSR09fU09VUkNFKF9fU09VUkNFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKChfX1NPVVJDRV9fKSA9PSBUSU1fVFJHT19SRVNFVCkgfHwgKChfX1NPVVJDRV9fKSA9PSBUSU1fVFJHT19FTkFCTEUpIHx8ICBcCisgICAoKF9fU09VUkNFX18pID09IFRJTV9UUkdPX1VQREFURSkgfHwgKChfX1NPVVJDRV9fKSA9PSBUSU1fVFJHT19PQzEpIHx8ICAgIFwKKyAgICgoX19TT1VSQ0VfXykgPT0gVElNX1RSR09fT0MxUkVGKSB8fCAoKF9fU09VUkNFX18pID09IFRJTV9UUkdPX09DMlJFRikgfHwgXAorICAgKChfX1NPVVJDRV9fKSA9PSBUSU1fVFJHT19PQzNSRUYpIHx8ICgoX19TT1VSQ0VfXykgPT0gVElNX1RSR09fT0M0UkVGKSB8fCBcCisgICAoKF9fU09VUkNFX18pID09IFRJTV9UUkdPX0VOQ09ERVJfQ0xLKSkKKworI2RlZmluZSBJU19USU1fVFJHTzJfU09VUkNFKF9fU09VUkNFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoX19TT1VSQ0VfXykgPT0gVElNX1RSR08yX1JFU0VUKSB8fCAoKF9fU09VUkNFX18pID09IFRJTV9UUkdPMl9FTkFCTEUpIHx8ICBcCisgICAoKF9fU09VUkNFX18pID09IFRJTV9UUkdPMl9VUERBVEUpIHx8ICgoX19TT1VSQ0VfXykgPT0gVElNX1RSR08yX09DMSkgfHwgICAgXAorICAgKChfX1NPVVJDRV9fKSA9PSBUSU1fVFJHTzJfT0MxUkVGKSB8fCAoKF9fU09VUkNFX18pID09IFRJTV9UUkdPMl9PQzJSRUYpIHx8IFwKKyAgICgoX19TT1VSQ0VfXykgPT0gVElNX1RSR08yX09DM1JFRikgfHwgKChfX1NPVVJDRV9fKSA9PSBUSU1fVFJHTzJfT0MzUkVGKSB8fCBcCisgICAoKF9fU09VUkNFX18pID09IFRJTV9UUkdPMl9PQzRSRUYpIHx8ICgoX19TT1VSQ0VfXykgPT0gVElNX1RSR08yX09DNVJFRikgfHwgXAorICAgKChfX1NPVVJDRV9fKSA9PSBUSU1fVFJHTzJfT0M2UkVGKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoX19TT1VSQ0VfXykgPT0gVElNX1RSR08yX09DNFJFRl9SSVNJTkdGQUxMSU5HKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fU09VUkNFX18pID09IFRJTV9UUkdPMl9PQzZSRUZfUklTSU5HRkFMTElORykgfHwgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKChfX1NPVVJDRV9fKSA9PSBUSU1fVFJHTzJfT0M0UkVGX1JJU0lOR19PQzZSRUZfUklTSU5HKSB8fCAgICAgICAgICAgICAgICAgIFwKKyAgICgoX19TT1VSQ0VfXykgPT0gVElNX1RSR08yX09DNFJFRl9SSVNJTkdfT0M2UkVGX0ZBTExJTkcpIHx8ICAgICAgICAgICAgICAgICBcCisgICAoKF9fU09VUkNFX18pID09IFRJTV9UUkdPMl9PQzVSRUZfUklTSU5HX09DNlJFRl9SSVNJTkcpIHx8ICAgICAgICAgICAgICAgICAgXAorICAgKChfX1NPVVJDRV9fKSA9PSBUSU1fVFJHTzJfT0M1UkVGX1JJU0lOR19PQzZSRUZfRkFMTElORykpCisKKyNkZWZpbmUgSVNfVElNX01TTV9TVEFURShfX1NUQVRFX18pICAgICAgICAgICAgICAgXAorICAoKChfX1NUQVRFX18pID09IFRJTV9NQVNURVJTTEFWRU1PREVfRU5BQkxFKSB8fCBcCisgICAoKF9fU1RBVEVfXykgPT0gVElNX01BU1RFUlNMQVZFTU9ERV9ESVNBQkxFKSkKKworI2RlZmluZSBJU19USU1fU0xBVkVfTU9ERShfX01PREVfXykgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoX19NT0RFX18pID09IFRJTV9TTEFWRU1PREVfRElTQUJMRSkgfHwgICAgICAgICAgICAgICBcCisgICAoKF9fTU9ERV9fKSA9PSBUSU1fU0xBVkVNT0RFX1JFU0VUKSB8fCAgICAgICAgICAgICAgICAgXAorICAgKChfX01PREVfXykgPT0gVElNX1NMQVZFTU9ERV9HQVRFRCkgfHwgICAgICAgICAgICAgICAgIFwKKyAgICgoX19NT0RFX18pID09IFRJTV9TTEFWRU1PREVfVFJJR0dFUikgfHwgICAgICAgICAgICAgICBcCisgICAoKF9fTU9ERV9fKSA9PSBUSU1fU0xBVkVNT0RFX0VYVEVSTkFMMSkgfHwgICAgICAgICAgICAgXAorICAgKChfX01PREVfXykgPT0gVElNX1NMQVZFTU9ERV9DT01CSU5FRF9SRVNFVFRSSUdHRVIpIHx8IFwKKyAgICgoX19NT0RFX18pID09IFRJTV9TTEFWRU1PREVfQ09NQklORURfR0FURURSRVNFVCkpCisKKyNkZWZpbmUgSVNfVElNX1BXTV9NT0RFKF9fTU9ERV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKF9fTU9ERV9fKSA9PSBUSU1fT0NNT0RFX1BXTTEpIHx8ICgoX19NT0RFX18pID09IFRJTV9PQ01PREVfUFdNMikgfHwgXAorICAgKChfX01PREVfXykgPT0gVElNX09DTU9ERV9DT01CSU5FRF9QV00xKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoX19NT0RFX18pID09IFRJTV9PQ01PREVfQ09NQklORURfUFdNMikgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fTU9ERV9fKSA9PSBUSU1fT0NNT0RFX0FTWU1NRVRSSUNfUFdNMSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKChfX01PREVfXykgPT0gVElNX09DTU9ERV9BU1lNTUVUUklDX1BXTTIpKQorCisjZGVmaW5lIElTX1RJTV9PQ19NT0RFKF9fTU9ERV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKChfX01PREVfXykgPT0gVElNX09DTU9ERV9USU1JTkcpIHx8ICgoX19NT0RFX18pID09IFRJTV9PQ01PREVfQUNUSVZFKSB8fCAgIFwKKyAgICgoX19NT0RFX18pID09IFRJTV9PQ01PREVfSU5BQ1RJVkUpIHx8ICgoX19NT0RFX18pID09IFRJTV9PQ01PREVfVE9HR0xFKSB8fCBcCisgICAoKF9fTU9ERV9fKSA9PSBUSU1fT0NNT0RFX0ZPUkNFRF9BQ1RJVkUpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKChfX01PREVfXykgPT0gVElNX09DTU9ERV9GT1JDRURfSU5BQ1RJVkUpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoX19NT0RFX18pID09IFRJTV9PQ01PREVfUkVUUklHRVJSQUJMRV9PUE0xKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fTU9ERV9fKSA9PSBUSU1fT0NNT0RFX1JFVFJJR0VSUkFCTEVfT1BNMikgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKChfX01PREVfXykgPT0gVElNX09DTU9ERV9ESVJFQ1RJT05fT1VUUFVUKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoX19NT0RFX18pID09IFRJTV9PQ01PREVfUFVMU0VfT05fQ09NUEFSRSkpCisKKyNkZWZpbmUgSVNfVElNX1RSSUdHRVJQT0xBUklUWShfX1BPTEFSSVRZX18pICAgICAgICAgICAgICBcCisgICgoKF9fUE9MQVJJVFlfXykgPT0gVElNX1RSSUdHRVJQT0xBUklUWV9JTlZFUlRFRCkgfHwgICAgXAorICAgKChfX1BPTEFSSVRZX18pID09IFRJTV9UUklHR0VSUE9MQVJJVFlfTk9OSU5WRVJURUQpIHx8IFwKKyAgICgoX19QT0xBUklUWV9fKSA9PSBUSU1fVFJJR0dFUlBPTEFSSVRZX1JJU0lORykgfHwgICAgICBcCisgICAoKF9fUE9MQVJJVFlfXykgPT0gVElNX1RSSUdHRVJQT0xBUklUWV9GQUxMSU5HKSB8fCAgICAgXAorICAgKChfX1BPTEFSSVRZX18pID09IFRJTV9UUklHR0VSUE9MQVJJVFlfQk9USEVER0UpKQorCisjZGVmaW5lIElTX1RJTV9UUklHR0VSUFJFU0NBTEVSKF9fUFJFU0NBTEVSX18pICAgICAgIFwKKyAgKCgoX19QUkVTQ0FMRVJfXykgPT0gVElNX1RSSUdHRVJQUkVTQ0FMRVJfRElWMSkgfHwgXAorICAgKChfX1BSRVNDQUxFUl9fKSA9PSBUSU1fVFJJR0dFUlBSRVNDQUxFUl9ESVYyKSB8fCBcCisgICAoKF9fUFJFU0NBTEVSX18pID09IFRJTV9UUklHR0VSUFJFU0NBTEVSX0RJVjQpIHx8IFwKKyAgICgoX19QUkVTQ0FMRVJfXykgPT0gVElNX1RSSUdHRVJQUkVTQ0FMRVJfRElWOCkpCisKKyNkZWZpbmUgSVNfVElNX1RSSUdHRVJGSUxURVIoX19JQ0ZJTFRFUl9fKSAoKF9fSUNGSUxURVJfXykgPD0gMHhGVSkKKworI2RlZmluZSBJU19USU1fVEkxU0VMRUNUSU9OKF9fVEkxU0VMRUNUSU9OX18pICAgICAgXAorICAoKChfX1RJMVNFTEVDVElPTl9fKSA9PSBUSU1fVEkxU0VMRUNUSU9OX0NIMSkgfHwgXAorICAgKChfX1RJMVNFTEVDVElPTl9fKSA9PSBUSU1fVEkxU0VMRUNUSU9OX1hPUkNPTUJJTkFUSU9OKSkKKworI2RlZmluZSBJU19USU1fRE1BX0xFTkdUSChfX0xFTkdUSF9fKSAgICAgICAgICAgICAgICAgIFwKKyAgKCgoX19MRU5HVEhfXykgPT0gVElNX0RNQUJVUlNUTEVOR1RIXzFUUkFOU0ZFUikgfHwgICBcCisgICAoKF9fTEVOR1RIX18pID09IFRJTV9ETUFCVVJTVExFTkdUSF8yVFJBTlNGRVJTKSB8fCAgXAorICAgKChfX0xFTkdUSF9fKSA9PSBUSU1fRE1BQlVSU1RMRU5HVEhfM1RSQU5TRkVSUykgfHwgIFwKKyAgICgoX19MRU5HVEhfXykgPT0gVElNX0RNQUJVUlNUTEVOR1RIXzRUUkFOU0ZFUlMpIHx8ICBcCisgICAoKF9fTEVOR1RIX18pID09IFRJTV9ETUFCVVJTVExFTkdUSF81VFJBTlNGRVJTKSB8fCAgXAorICAgKChfX0xFTkdUSF9fKSA9PSBUSU1fRE1BQlVSU1RMRU5HVEhfNlRSQU5TRkVSUykgfHwgIFwKKyAgICgoX19MRU5HVEhfXykgPT0gVElNX0RNQUJVUlNUTEVOR1RIXzdUUkFOU0ZFUlMpIHx8ICBcCisgICAoKF9fTEVOR1RIX18pID09IFRJTV9ETUFCVVJTVExFTkdUSF84VFJBTlNGRVJTKSB8fCAgXAorICAgKChfX0xFTkdUSF9fKSA9PSBUSU1fRE1BQlVSU1RMRU5HVEhfOVRSQU5TRkVSUykgfHwgIFwKKyAgICgoX19MRU5HVEhfXykgPT0gVElNX0RNQUJVUlNUTEVOR1RIXzEwVFJBTlNGRVJTKSB8fCBcCisgICAoKF9fTEVOR1RIX18pID09IFRJTV9ETUFCVVJTVExFTkdUSF8xMVRSQU5TRkVSUykgfHwgXAorICAgKChfX0xFTkdUSF9fKSA9PSBUSU1fRE1BQlVSU1RMRU5HVEhfMTJUUkFOU0ZFUlMpIHx8IFwKKyAgICgoX19MRU5HVEhfXykgPT0gVElNX0RNQUJVUlNUTEVOR1RIXzEzVFJBTlNGRVJTKSB8fCBcCisgICAoKF9fTEVOR1RIX18pID09IFRJTV9ETUFCVVJTVExFTkdUSF8xNFRSQU5TRkVSUykgfHwgXAorICAgKChfX0xFTkdUSF9fKSA9PSBUSU1fRE1BQlVSU1RMRU5HVEhfMTVUUkFOU0ZFUlMpIHx8IFwKKyAgICgoX19MRU5HVEhfXykgPT0gVElNX0RNQUJVUlNUTEVOR1RIXzE2VFJBTlNGRVJTKSB8fCBcCisgICAoKF9fTEVOR1RIX18pID09IFRJTV9ETUFCVVJTVExFTkdUSF8xN1RSQU5TRkVSUykgfHwgXAorICAgKChfX0xFTkdUSF9fKSA9PSBUSU1fRE1BQlVSU1RMRU5HVEhfMThUUkFOU0ZFUlMpIHx8IFwKKyAgICgoX19MRU5HVEhfXykgPT0gVElNX0RNQUJVUlNUTEVOR1RIXzE5VFJBTlNGRVJTKSB8fCBcCisgICAoKF9fTEVOR1RIX18pID09IFRJTV9ETUFCVVJTVExFTkdUSF8yMFRSQU5TRkVSUykgfHwgXAorICAgKChfX0xFTkdUSF9fKSA9PSBUSU1fRE1BQlVSU1RMRU5HVEhfMjFUUkFOU0ZFUlMpIHx8IFwKKyAgICgoX19MRU5HVEhfXykgPT0gVElNX0RNQUJVUlNUTEVOR1RIXzIyVFJBTlNGRVJTKSB8fCBcCisgICAoKF9fTEVOR1RIX18pID09IFRJTV9ETUFCVVJTVExFTkdUSF8yM1RSQU5TRkVSUykgfHwgXAorICAgKChfX0xFTkdUSF9fKSA9PSBUSU1fRE1BQlVSU1RMRU5HVEhfMjRUUkFOU0ZFUlMpIHx8IFwKKyAgICgoX19MRU5HVEhfXykgPT0gVElNX0RNQUJVUlNUTEVOR1RIXzI1VFJBTlNGRVJTKSB8fCBcCisgICAoKF9fTEVOR1RIX18pID09IFRJTV9ETUFCVVJTVExFTkdUSF8yNlRSQU5TRkVSUykpCisKKyNkZWZpbmUgSVNfVElNX0RNQV9EQVRBX0xFTkdUSChMRU5HVEgpIFwKKyAgKCgoTEVOR1RIKSA+PSAweDFVKSAmJiAoKExFTkdUSCkgPCAweDEwMDAwVSkpCisKKyNkZWZpbmUgSVNfVElNX0lDX0ZJTFRFUihfX0lDRklMVEVSX18pICgoX19JQ0ZJTFRFUl9fKSA8PSAweEZVKQorCisjZGVmaW5lIElTX1RJTV9ERUFEVElNRShfX0RFQURUSU1FX18pICgoX19ERUFEVElNRV9fKSA8PSAweEZGVSkKKworI2RlZmluZSBJU19USU1fQlJFQUtfU1lTVEVNKF9fQ09ORklHX18pICAgICAgICAgICAgICAgICAgICBcCisgICgoKF9fQ09ORklHX18pID09IFRJTV9CUkVBS19TWVNURU1fRUNDKSB8fCAgICAgICAgICAgICAgIFwKKyAgICgoX19DT05GSUdfXykgPT0gVElNX0JSRUFLX1NZU1RFTV9QVkQpIHx8ICAgICAgICAgICAgICAgXAorICAgKChfX0NPTkZJR19fKSA9PSBUSU1fQlJFQUtfU1lTVEVNX1NSQU1fUEFSSVRZX0VSUk9SKSB8fCBcCisgICAoKF9fQ09ORklHX18pID09IFRJTV9CUkVBS19TWVNURU1fTE9DS1VQKSkKKworI2RlZmluZSBJU19USU1fU0xBVkVNT0RFX1RSSUdHRVJfRU5BQkxFRChfX1RSSUdHRVJfXykgXAorICAoKChfX1RSSUdHRVJfXykgPT0gVElNX1NMQVZFTU9ERV9UUklHR0VSKSB8fCAgICAgICAgXAorICAgKChfX1RSSUdHRVJfXykgPT0gVElNX1NMQVZFTU9ERV9DT01CSU5FRF9SRVNFVFRSSUdHRVIpKQorCisjZGVmaW5lIFRJTV9TRVRfSUNQUkVTQ0FMRVJWQUxVRShfX0hBTkRMRV9fLCBfX0NIQU5ORUxfXywgX19JQ1BTQ19fKSBcCisgICgoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjEgfD0gKF9fSUNQU0NfXykpICAgICAgICAgICAgICBcCisgICA6ICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjEgfD0gKChfX0lDUFNDX18pIDw8IDhVKSkgICAgICBcCisgICA6ICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjIgfD0gKF9fSUNQU0NfXykpICAgICAgICAgICAgICBcCisgICAgICAgOiAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjIgfD0gKChfX0lDUFNDX18pIDw8IDhVKSkpCisKKyNkZWZpbmUgVElNX1JFU0VUX0lDUFJFU0NBTEVSVkFMVUUoX19IQU5ETEVfXywgX19DSEFOTkVMX18pICAgXAorICAoKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjEgJj0gflRJTV9DQ01SMV9JQzFQU0MpIFwKKyAgIDogKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMikgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIxICY9IH5USU1fQ0NNUjFfSUMyUFNDKSBcCisgICA6ICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzMpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMiAmPSB+VElNX0NDTVIyX0lDM1BTQykgXAorICAgICAgIDogKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIyICY9IH5USU1fQ0NNUjJfSUM0UFNDKSkKKworI2RlZmluZSBUSU1fU0VUX0NBUFRVUkVQT0xBUklUWShfX0hBTkRMRV9fLCBfX0NIQU5ORUxfXywgX19QT0xBUklUWV9fKSBcCisgICgoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ0VSIHw9IChfX1BPTEFSSVRZX18pKSAgICAgICAgICAgICAgXAorICAgOiAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NFUiB8PSAoKF9fUE9MQVJJVFlfXykgPDwgNFUpKSAgICAgIFwKKyAgIDogKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDRVIgfD0gKChfX1BPTEFSSVRZX18pIDw8IDhVKSkgICAgICBcCisgICAgICAgOiAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NFUiB8PSAoKChfX1BPTEFSSVRZX18pIDw8IDEyVSkpKSkKKworI2RlZmluZSBUSU1fUkVTRVRfQ0FQVFVSRVBPTEFSSVRZKF9fSEFORExFX18sIF9fQ0hBTk5FTF9fKSAgICAgICAgICAgICAgICAgICBcCisgICgoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ0VSICY9IH4oVElNX0NDRVJfQ0MxUCB8IFRJTV9DQ0VSX0NDMU5QKSkgXAorICAgOiAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NFUiAmPSB+KFRJTV9DQ0VSX0NDMlAgfCBUSU1fQ0NFUl9DQzJOUCkpIFwKKyAgIDogKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDRVIgJj0gfihUSU1fQ0NFUl9DQzNQIHwgVElNX0NDRVJfQ0MzTlApKSBcCisgICAgICAgOiAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NFUiAmPSB+KFRJTV9DQ0VSX0NDNFAgfCBUSU1fQ0NFUl9DQzROUCkpKQorCisjZGVmaW5lIFRJTV9DSEFOTkVMX1NUQVRFX0dFVChfX0hBTkRMRV9fLCBfX0NIQU5ORUxfXykgICAgICAgICAgICAgICAgXAorICAoKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMSkgICA/IChfX0hBTkRMRV9fKS0+Q2hhbm5lbFN0YXRlWzBdIFwKKyAgIDogKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMikgPyAoX19IQU5ETEVfXyktPkNoYW5uZWxTdGF0ZVsxXSBcCisgICA6ICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzMpID8gKF9fSEFORExFX18pLT5DaGFubmVsU3RhdGVbMl0gXAorICAgOiAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF80KSA/IChfX0hBTkRMRV9fKS0+Q2hhbm5lbFN0YXRlWzNdIFwKKyAgIDogKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfNSkgPyAoX19IQU5ETEVfXyktPkNoYW5uZWxTdGF0ZVs0XSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKF9fSEFORExFX18pLT5DaGFubmVsU3RhdGVbNV0pCisKKyNkZWZpbmUgVElNX0NIQU5ORUxfU1RBVEVfU0VUKF9fSEFORExFX18sIF9fQ0hBTk5FTF9fLCBfX0NIQU5ORUxfU1RBVEVfXykgXAorICAoKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgPyAoKF9fSEFORExFX18pLT5DaGFubmVsU3RhdGVbMF0gPSAoX19DSEFOTkVMX1NUQVRFX18pKSAgICAgICAgICAgIFwKKyAgIDogKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgID8gKChfX0hBTkRMRV9fKS0+Q2hhbm5lbFN0YXRlWzFdID0gKF9fQ0hBTk5FTF9TVEFURV9fKSkgICAgICAgICAgICBcCisgICA6ICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICA/ICgoX19IQU5ETEVfXyktPkNoYW5uZWxTdGF0ZVsyXSA9IChfX0NIQU5ORUxfU1RBVEVfXykpICAgICAgICAgICAgXAorICAgOiAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF80KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgPyAoKF9fSEFORExFX18pLT5DaGFubmVsU3RhdGVbM10gPSAoX19DSEFOTkVMX1NUQVRFX18pKSAgICAgICAgICAgIFwKKyAgIDogKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfNSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgID8gKChfX0hBTkRMRV9fKS0+Q2hhbm5lbFN0YXRlWzRdID0gKF9fQ0hBTk5FTF9TVEFURV9fKSkgICAgICAgICAgICBcCisgICAgICAgOiAoKF9fSEFORExFX18pLT5DaGFubmVsU3RhdGVbNV0gPSAoX19DSEFOTkVMX1NUQVRFX18pKSkKKworI2RlZmluZSBUSU1fQ0hBTk5FTF9TVEFURV9TRVRfQUxMKF9fSEFORExFX18sIF9fQ0hBTk5FTF9TVEFURV9fKSBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoX19IQU5ETEVfXyktPkNoYW5uZWxTdGF0ZVswXSA9IChfX0NIQU5ORUxfU1RBVEVfXyk7ICAgICAgICAgXAorICAgIChfX0hBTkRMRV9fKS0+Q2hhbm5lbFN0YXRlWzFdID0gKF9fQ0hBTk5FTF9TVEFURV9fKTsgICAgICAgICBcCisgICAgKF9fSEFORExFX18pLT5DaGFubmVsU3RhdGVbMl0gPSAoX19DSEFOTkVMX1NUQVRFX18pOyAgICAgICAgIFwKKyAgICAoX19IQU5ETEVfXyktPkNoYW5uZWxTdGF0ZVszXSA9IChfX0NIQU5ORUxfU1RBVEVfXyk7ICAgICAgICAgXAorICAgIChfX0hBTkRMRV9fKS0+Q2hhbm5lbFN0YXRlWzRdID0gKF9fQ0hBTk5FTF9TVEFURV9fKTsgICAgICAgICBcCisgICAgKF9fSEFORExFX18pLT5DaGFubmVsU3RhdGVbNV0gPSAoX19DSEFOTkVMX1NUQVRFX18pOyAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBUSU1fQ0hBTk5FTF9OX1NUQVRFX0dFVChfX0hBTkRMRV9fLCBfX0NIQU5ORUxfXykgICAgICAgICAgICAgICBcCisgICgoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8xKSAgID8gKF9fSEFORExFX18pLT5DaGFubmVsTlN0YXRlWzBdIFwKKyAgIDogKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMikgPyAoX19IQU5ETEVfXyktPkNoYW5uZWxOU3RhdGVbMV0gXAorICAgOiAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8zKSA/IChfX0hBTkRMRV9fKS0+Q2hhbm5lbE5TdGF0ZVsyXSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKF9fSEFORExFX18pLT5DaGFubmVsTlN0YXRlWzNdKQorCisjZGVmaW5lIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKF9fSEFORExFX18sIF9fQ0hBTk5FTF9fLCBfX0NIQU5ORUxfU1RBVEVfXykgXAorICAoKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICA/ICgoX19IQU5ETEVfXyktPkNoYW5uZWxOU3RhdGVbMF0gPSAoX19DSEFOTkVMX1NUQVRFX18pKSAgICAgICAgICAgICBcCisgICA6ICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgID8gKChfX0hBTkRMRV9fKS0+Q2hhbm5lbE5TdGF0ZVsxXSA9IChfX0NIQU5ORUxfU1RBVEVfXykpICAgICAgICAgICAgIFwKKyAgIDogKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgPyAoKF9fSEFORExFX18pLT5DaGFubmVsTlN0YXRlWzJdID0gKF9fQ0hBTk5FTF9TVEFURV9fKSkgICAgICAgICAgICAgXAorICAgICAgIDogKChfX0hBTkRMRV9fKS0+Q2hhbm5lbE5TdGF0ZVszXSA9IChfX0NIQU5ORUxfU1RBVEVfXykpKQorCisjZGVmaW5lIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUX0FMTChfX0hBTkRMRV9fLCBfX0NIQU5ORUxfU1RBVEVfXykgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoX19IQU5ETEVfXyktPkNoYW5uZWxOU3RhdGVbMF0gPSAoX19DSEFOTkVMX1NUQVRFX18pOyAgICAgICAgICBcCisgICAgKF9fSEFORExFX18pLT5DaGFubmVsTlN0YXRlWzFdID0gKF9fQ0hBTk5FTF9TVEFURV9fKTsgICAgICAgICAgXAorICAgIChfX0hBTkRMRV9fKS0+Q2hhbm5lbE5TdGF0ZVsyXSA9IChfX0NIQU5ORUxfU1RBVEVfXyk7ICAgICAgICAgIFwKKyAgICAoX19IQU5ETEVfXyktPkNoYW5uZWxOU3RhdGVbM10gPSAoX19DSEFOTkVMX1NUQVRFX18pOyAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKy8qKgorICogQH0KKyAqLworLyogRW5kIG9mIHByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogSW5jbHVkZSBUSU0gSEFMIEV4dGVuZGVkIG1vZHVsZSAqLworI2luY2x1ZGUgInN0bTMyZzR4eF9oYWxfdGltX2V4LmgiCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgVElNX0V4cG9ydGVkX0Z1bmN0aW9ucyBUSU0gRXhwb3J0ZWQgRnVuY3Rpb25zCisgKiBAeworICovCisKKy8qKiBAYWRkdG9ncm91cCBUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBUSU0gVGltZSBCYXNlIGZ1bmN0aW9ucworICogIEBicmllZiAgIFRpbWUgQmFzZSBmdW5jdGlvbnMKKyAqIEB7CisgKi8KKy8qIFRpbWUgQmFzZSBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0Jhc2VfSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0Jhc2VfRGVJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK3ZvaWQgSEFMX1RJTV9CYXNlX01zcEluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOwordm9pZCBIQUxfVElNX0Jhc2VfTXNwRGVJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKKy8qIEJsb2NraW5nIG1vZGU6IFBvbGxpbmcgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fQmFzZV9TdGFydChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0Jhc2VfU3RvcChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CisvKiBOb24tQmxvY2tpbmcgbW9kZTogSW50ZXJydXB0ICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0Jhc2VfU3RhcnRfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9CYXNlX1N0b3BfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworLyogTm9uLUJsb2NraW5nIG1vZGU6IERNQSAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9CYXNlX1N0YXJ0X0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgKnBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBMZW5ndGgpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9CYXNlX1N0b3BfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKKy8qKgorICogQH0KKyAqLworCisvKiogQGFkZHRvZ3JvdXAgVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgVElNIE91dHB1dCBDb21wYXJlIGZ1bmN0aW9ucworICogIEBicmllZiAgIFRJTSBPdXRwdXQgQ29tcGFyZSBmdW5jdGlvbnMKKyAqIEB7CisgKi8KKy8qIFRpbWVyIE91dHB1dCBDb21wYXJlIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09DX0luaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PQ19EZUluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOwordm9pZCBIQUxfVElNX09DX01zcEluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOwordm9pZCBIQUxfVElNX09DX01zcERlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CisvKiBCbG9ja2luZyBtb2RlOiBQb2xsaW5nICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09DX1N0YXJ0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT0NfU3RvcChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCk7CisvKiBOb24tQmxvY2tpbmcgbW9kZTogSW50ZXJydXB0ICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09DX1N0YXJ0X0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT0NfU3RvcF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCk7CisvKiBOb24tQmxvY2tpbmcgbW9kZTogRE1BICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09DX1N0YXJ0X0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwsIGNvbnN0IHVpbnQzMl90ICpwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IExlbmd0aCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09DX1N0b3BfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKTsKKy8qKgorICogQH0KKyAqLworCisvKiogQGFkZHRvZ3JvdXAgVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgVElNIFBXTSBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICBUSU0gUFdNIGZ1bmN0aW9ucworICogQHsKKyAqLworLyogVGltZXIgUFdNIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fUFdNX0luaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9QV01fRGVJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK3ZvaWQgSEFMX1RJTV9QV01fTXNwSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7Cit2b2lkIEhBTF9USU1fUFdNX01zcERlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CisvKiBCbG9ja2luZyBtb2RlOiBQb2xsaW5nICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1BXTV9TdGFydChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1BXTV9TdG9wKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKTsKKy8qIE5vbi1CbG9ja2luZyBtb2RlOiBJbnRlcnJ1cHQgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fUFdNX1N0YXJ0X0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1BXTV9TdG9wX0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKTsKKy8qIE5vbi1CbG9ja2luZyBtb2RlOiBETUEgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fUFdNX1N0YXJ0X0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsLCBjb25zdCB1aW50MzJfdCAqcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgTGVuZ3RoKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fUFdNX1N0b3BfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCk7CisvKioKKyAqIEB9CisgKi8KKworLyoqIEBhZGR0b2dyb3VwIFRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA0IFRJTSBJbnB1dCBDYXB0dXJlIGZ1bmN0aW9ucworICogIEBicmllZiAgIFRJTSBJbnB1dCBDYXB0dXJlIGZ1bmN0aW9ucworICogQHsKKyAqLworLyogVGltZXIgSW5wdXQgQ2FwdHVyZSBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fSUNfSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0lDX0RlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7Cit2b2lkIEhBTF9USU1fSUNfTXNwSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7Cit2b2lkIEhBTF9USU1fSUNfTXNwRGVJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKKy8qIEJsb2NraW5nIG1vZGU6IFBvbGxpbmcgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fSUNfU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9JQ19TdG9wKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKTsKKy8qIE5vbi1CbG9ja2luZyBtb2RlOiBJbnRlcnJ1cHQgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fSUNfU3RhcnRfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9JQ19TdG9wX0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKTsKKy8qIE5vbi1CbG9ja2luZyBtb2RlOiBETUEgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fSUNfU3RhcnRfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgKnBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgTGVuZ3RoKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fSUNfU3RvcF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpOworLyoqCisgKiBAfQorICovCisKKy8qKiBAYWRkdG9ncm91cCBUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNSBUSU0gT25lIFB1bHNlIGZ1bmN0aW9ucworICogIEBicmllZiAgIFRJTSBPbmUgUHVsc2UgZnVuY3Rpb25zCisgKiBAeworICovCisvKiBUaW1lciBPbmUgUHVsc2UgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PbmVQdWxzZV9Jbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE9uZVB1bHNlTW9kZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09uZVB1bHNlX0RlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7Cit2b2lkIEhBTF9USU1fT25lUHVsc2VfTXNwSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7Cit2b2lkIEhBTF9USU1fT25lUHVsc2VfTXNwRGVJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKKy8qIEJsb2NraW5nIG1vZGU6IFBvbGxpbmcgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT25lUHVsc2VfU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE91dHB1dENoYW5uZWwpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PbmVQdWxzZV9TdG9wKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE91dHB1dENoYW5uZWwpOworLyogTm9uLUJsb2NraW5nIG1vZGU6IEludGVycnVwdCAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PbmVQdWxzZV9TdGFydF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgT3V0cHV0Q2hhbm5lbCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09uZVB1bHNlX1N0b3BfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgT3V0cHV0Q2hhbm5lbCk7CisvKioKKyAqIEB9CisgKi8KKworLyoqIEBhZGR0b2dyb3VwIFRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA2IFRJTSBFbmNvZGVyIGZ1bmN0aW9ucworICogIEBicmllZiAgIFRJTSBFbmNvZGVyIGZ1bmN0aW9ucworICogQHsKKyAqLworLyogVGltZXIgRW5jb2RlciBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fRW5jb2Rlcl9Jbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVElNX0VuY29kZXJfSW5pdFR5cGVEZWYgKnNDb25maWcpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9FbmNvZGVyX0RlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7Cit2b2lkIEhBTF9USU1fRW5jb2Rlcl9Nc3BJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK3ZvaWQgSEFMX1RJTV9FbmNvZGVyX01zcERlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CisvKiBCbG9ja2luZyBtb2RlOiBQb2xsaW5nICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0VuY29kZXJfU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0VuY29kZXJfU3RvcChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpOworLyogTm9uLUJsb2NraW5nIG1vZGU6IEludGVycnVwdCAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9FbmNvZGVyX1N0YXJ0X0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9FbmNvZGVyX1N0b3BfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKTsKKy8qIE5vbi1CbG9ja2luZyBtb2RlOiBETUEgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fRW5jb2Rlcl9TdGFydF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90ICpwRGF0YTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwRGF0YTIsIHVpbnQxNl90IExlbmd0aCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0VuY29kZXJfU3RvcF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCk7CisvKioKKyAqIEB9CisgKi8KKworLyoqIEBhZGR0b2dyb3VwIFRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA3IFRJTSBJUlEgaGFuZGxlciBtYW5hZ2VtZW50CisgKiAgQGJyaWVmICAgSVJRIGhhbmRsZXIgbWFuYWdlbWVudAorICogQHsKKyAqLworLyogSW50ZXJydXB0IEhhbmRsZXIgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgSEFMX1RJTV9JUlFIYW5kbGVyKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA4IFRJTSBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICogQHsKKyAqLworLyogQ29udHJvbCBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT0NfQ29uZmlnQ2hhbm5lbChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUSU1fT0NfSW5pdFR5cGVEZWYgKnNDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1BXTV9Db25maWdDaGFubmVsKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUSU1fT0NfSW5pdFR5cGVEZWYgKnNDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9JQ19Db25maWdDaGFubmVsKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRJTV9JQ19Jbml0VHlwZURlZiAqc0NvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT25lUHVsc2VfQ29uZmlnQ2hhbm5lbCgKKyAgICBUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgVElNX09uZVB1bHNlX0luaXRUeXBlRGVmICpzQ29uZmlnLAorICAgIHVpbnQzMl90IE91dHB1dENoYW5uZWwsIHVpbnQzMl90IElucHV0Q2hhbm5lbCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0NvbmZpZ09DcmVmQ2xlYXIoCisgICAgVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgY29uc3QgVElNX0NsZWFySW5wdXRDb25maWdUeXBlRGVmICpzQ2xlYXJJbnB1dENvbmZpZywgdWludDMyX3QgQ2hhbm5lbCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0NvbmZpZ0Nsb2NrU291cmNlKAorICAgIFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCBjb25zdCBUSU1fQ2xvY2tDb25maWdUeXBlRGVmICpzQ2xvY2tTb3VyY2VDb25maWcpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9Db25maWdUSTFJbnB1dChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVEkxX1NlbGVjdGlvbik7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1NsYXZlQ29uZmlnU3luY2hybygKKyAgICBUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgY29uc3QgVElNX1NsYXZlQ29uZmlnVHlwZURlZiAqc1NsYXZlQ29uZmlnKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fU2xhdmVDb25maWdTeW5jaHJvX0lUKAorICAgIFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCBjb25zdCBUSU1fU2xhdmVDb25maWdUeXBlRGVmICpzU2xhdmVDb25maWcpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9ETUFCdXJzdF9Xcml0ZVN0YXJ0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEJ1cnN0QmFzZUFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQnVyc3RSZXF1ZXN0U3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90ICpCdXJzdEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBCdXJzdExlbmd0aCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0RNQUJ1cnN0X011bHRpV3JpdGVTdGFydChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEJ1cnN0QmFzZUFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBCdXJzdFJlcXVlc3RTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCAqQnVyc3RCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBCdXJzdExlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IERhdGFMZW5ndGgpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9ETUFCdXJzdF9Xcml0ZVN0b3AoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBCdXJzdFJlcXVlc3RTcmMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9ETUFCdXJzdF9SZWFkU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBCdXJzdEJhc2VBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQnVyc3RSZXF1ZXN0U3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKkJ1cnN0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQnVyc3RMZW5ndGgpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9ETUFCdXJzdF9NdWx0aVJlYWRTdGFydChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQnVyc3RCYXNlQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQnVyc3RSZXF1ZXN0U3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqQnVyc3RCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEJ1cnN0TGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBEYXRhTGVuZ3RoKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fRE1BQnVyc3RfUmVhZFN0b3AoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEJ1cnN0UmVxdWVzdFNyYyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0dlbmVyYXRlRXZlbnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRXZlbnRTb3VyY2UpOwordWludDMyX3QgSEFMX1RJTV9SZWFkQ2FwdHVyZWRWYWx1ZShjb25zdCBUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCk7CisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwOSBUSU0gQ2FsbGJhY2tzIGZ1bmN0aW9ucworICogIEBicmllZiAgIFRJTSBDYWxsYmFja3MgZnVuY3Rpb25zCisgKiBAeworICovCisvKiBDYWxsYmFjayBpbiBub24gYmxvY2tpbmcgbW9kZXMgKEludGVycnVwdCBhbmQgRE1BKSAqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBIQUxfVElNX1BlcmlvZEVsYXBzZWRDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7Cit2b2lkIEhBTF9USU1fUGVyaW9kRWxhcHNlZEhhbGZDcGx0Q2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOwordm9pZCBIQUxfVElNX09DX0RlbGF5RWxhcHNlZENhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK3ZvaWQgSEFMX1RJTV9JQ19DYXB0dXJlQ2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOwordm9pZCBIQUxfVElNX0lDX0NhcHR1cmVIYWxmQ3BsdENhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK3ZvaWQgSEFMX1RJTV9QV01fUHVsc2VGaW5pc2hlZENhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK3ZvaWQgSEFMX1RJTV9QV01fUHVsc2VGaW5pc2hlZEhhbGZDcGx0Q2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOwordm9pZCBIQUxfVElNX1RyaWdnZXJDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7Cit2b2lkIEhBTF9USU1fVHJpZ2dlckhhbGZDcGx0Q2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOwordm9pZCBIQUxfVElNX0Vycm9yQ2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworCisvKiBDYWxsYmFja3MgUmVnaXN0ZXIvVW5SZWdpc3RlciBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fUmVnaXN0ZXJDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfVElNX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRJTV9DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fVW5SZWdpc3RlckNhbGxiYWNrKAorICAgIFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCBIQUxfVElNX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMTAgVElNIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zCisgKiAgQGJyaWVmICBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucworICogQHsKKyAqLworLyogUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9USU1fU3RhdGVUeXBlRGVmIEhBTF9USU1fQmFzZV9HZXRTdGF0ZShjb25zdCBUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CitIQUxfVElNX1N0YXRlVHlwZURlZiBIQUxfVElNX09DX0dldFN0YXRlKGNvbnN0IFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK0hBTF9USU1fU3RhdGVUeXBlRGVmIEhBTF9USU1fUFdNX0dldFN0YXRlKGNvbnN0IFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK0hBTF9USU1fU3RhdGVUeXBlRGVmIEhBTF9USU1fSUNfR2V0U3RhdGUoY29uc3QgVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworSEFMX1RJTV9TdGF0ZVR5cGVEZWYgSEFMX1RJTV9PbmVQdWxzZV9HZXRTdGF0ZShjb25zdCBUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CitIQUxfVElNX1N0YXRlVHlwZURlZiBIQUxfVElNX0VuY29kZXJfR2V0U3RhdGUoY29uc3QgVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworCisvKiBQZXJpcGhlcmFsIENoYW5uZWwgc3RhdGUgZnVuY3Rpb25zCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfVElNX0FjdGl2ZUNoYW5uZWwgSEFMX1RJTV9HZXRBY3RpdmVDaGFubmVsKGNvbnN0IFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK0hBTF9USU1fQ2hhbm5lbFN0YXRlVHlwZURlZiBIQUxfVElNX0dldENoYW5uZWxTdGF0ZSgKKyAgICBjb25zdCBUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCk7CitIQUxfVElNX0RNQUJ1cnN0U3RhdGVUeXBlRGVmIEhBTF9USU1fRE1BQnVyc3RTdGF0ZSgKKyAgICBjb25zdCBUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCisvKiBFbmQgb2YgZXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBQcml2YXRlIGZ1bmN0aW9ucy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBUSU1fUHJpdmF0ZV9GdW5jdGlvbnMgVElNIFByaXZhdGUgRnVuY3Rpb25zCisgKiBAeworICovCit2b2lkIFRJTV9CYXNlX1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRJTV9CYXNlX0luaXRUeXBlRGVmICpTdHJ1Y3R1cmUpOwordm9pZCBUSU1fVEkxX1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgVElNX0lDUG9sYXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRJTV9JQ1NlbGVjdGlvbiwgdWludDMyX3QgVElNX0lDRmlsdGVyKTsKK3ZvaWQgVElNX09DMl9TZXRDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIGNvbnN0IFRJTV9PQ19Jbml0VHlwZURlZiAqT0NfQ29uZmlnKTsKK3ZvaWQgVElNX0VUUl9TZXRDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IFRJTV9FeHRUUkdQcmVzY2FsZXIsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRJTV9FeHRUUkdQb2xhcml0eSwgdWludDMyX3QgRXh0VFJHRmlsdGVyKTsKKwordm9pZCBUSU1fRE1BRGVsYXlQdWxzZUhhbGZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3ZvaWQgVElNX0RNQUVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3ZvaWQgVElNX0RNQUNhcHR1cmVDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3ZvaWQgVElNX0RNQUNhcHR1cmVIYWxmQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7Cit2b2lkIFRJTV9DQ3hDaGFubmVsQ21kKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsU3RhdGUpOworCisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQordm9pZCBUSU1fUmVzZXRDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CisjZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qKgorICogQH0KKyAqLworLyogRW5kIG9mIHByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJHNHh4X0hBTF9USU1fSCAqLwpkaWZmIC0tZ2l0IGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfaGFsX3RpbV9leC5oIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfaGFsX3RpbV9leC5oCmluZGV4IDAxNThkNjQuLjc3NjQ1MzYgMTAwNjQ0Ci0tLSBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9JbmMvc3RtMzJnNHh4X2hhbF90aW1fZXguaAorKysgYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9oYWxfdGltX2V4LmgKQEAgLTEsMjE5NyArMSwyMTkyIEBACi0vKioNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQGZpbGUgICAgc3RtMzJnNHh4X2hhbF90aW1fZXguaA0KLSAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtDQotICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgVElNIEhBTCBFeHRlbmRlZCBtb2R1bGUuDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEBhdHRlbnRpb24NCi0gKg0KLSAqIENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4NCi0gKg0KLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGVybXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZQ0KLSAqIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4NCi0gKiBJZiBubyBMSUNFTlNFIGZpbGUgY29tZXMgd2l0aCB0aGlzIHNvZnR3YXJlLCBpdCBpcyBwcm92aWRlZCBBUy1JUy4NCi0gKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKi8NCi0NCi0vKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpZm5kZWYgU1RNMzJHNHh4X0hBTF9USU1fRVhfSA0KLSNkZWZpbmUgU1RNMzJHNHh4X0hBTF9USU1fRVhfSA0KLQ0KLSNpZmRlZiBfX2NwbHVzcGx1cw0KLWV4dGVybiAiQyIgew0KLSNlbmRpZg0KLQ0KLS8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotI2luY2x1ZGUgInN0bTMyZzR4eF9oYWxfZGVmLmgiDQotDQotLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzR4eF9IQUxfRHJpdmVyDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGFkZHRvZ3JvdXAgVElNRXgNCi0gKiBAew0KLSAqLw0KLQ0KLS8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBkZWZncm91cCBUSU1FeF9FeHBvcnRlZF9UeXBlcyBUSU0gRXh0ZW5kZWQgRXhwb3J0ZWQgVHlwZXMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgVElNIEhhbGwgc2Vuc29yIENvbmZpZ3VyYXRpb24gU3RydWN0dXJlIGRlZmluaXRpb24NCi0gKi8NCi0NCi10eXBlZGVmIHN0cnVjdCB7DQotICB1aW50MzJfdCBJQzFQb2xhcml0eTsgLyohPCBTcGVjaWZpZXMgdGhlIGFjdGl2ZSBlZGdlIG9mIHRoZSBpbnB1dCBzaWduYWwuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX0lucHV0X0NhcHR1cmVfUG9sYXJpdHkgKi8NCi0NCi0gIHVpbnQzMl90IElDMVByZXNjYWxlcjsgLyohPCBTcGVjaWZpZXMgdGhlIElucHV0IENhcHR1cmUgUHJlc2NhbGVyLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX0lucHV0X0NhcHR1cmVfUHJlc2NhbGVyICovDQotDQotICB1aW50MzJfdCBJQzFGaWx0ZXI7IC8qITwgU3BlY2lmaWVzIHRoZSBpbnB1dCBjYXB0dXJlIGZpbHRlci4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgTWF4X0RhdGEgPSAweEYgKi8NCi0NCi0gIHVpbnQzMl90IENvbW11dGF0aW9uX0RlbGF5OyAvKiE8IFNwZWNpZmllcyB0aGUgcHVsc2UgdmFsdWUgdG8gYmUgbG9hZGVkIGludG8NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgQ2FwdHVyZSBDb21wYXJlIFJlZ2lzdGVyLiBUaGlzIHBhcmFtZXRlcg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMDAwIGFuZA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heF9EYXRhID0gMHhGRkZGICovDQotfSBUSU1fSGFsbFNlbnNvcl9Jbml0VHlwZURlZjsNCi0NCi0vKioNCi0gKiBAYnJpZWYgIFRJTSBCcmVhay9CcmVhazIgaW5wdXQgY29uZmlndXJhdGlvbg0KLSAqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gIHVpbnQzMl90IFNvdXJjZTsgICAvKiE8IFNwZWNpZmllcyB0aGUgc291cmNlIG9mIHRoZSB0aW1lciBicmVhayBpbnB1dC4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICBUSU1FeF9CcmVha19JbnB1dF9Tb3VyY2UgKi8NCi0gIHVpbnQzMl90IEVuYWJsZTsgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0aGUgYnJlYWsgaW5wdXQgc291cmNlIGlzDQotICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZC4gICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgVElNRXhfQnJlYWtfSW5wdXRfU291cmNlX0VuYWJsZSAqLw0KLSAgdWludDMyX3QgUG9sYXJpdHk7IC8qITwgU3BlY2lmaWVzIHRoZSBicmVhayBpbnB1dCBzb3VyY2UgcG9sYXJpdHkuDQotICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgVElNRXhfQnJlYWtfSW5wdXRfU291cmNlX1BvbGFyaXR5ICovDQotfSBUSU1FeF9CcmVha0lucHV0Q29uZmlnVHlwZURlZjsNCi0NCi0vKioNCi0gKiBAYnJpZWYgIFRJTSBFbmNvZGVyIGluZGV4IGNvbmZpZ3VyYXRpb24NCi0gKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICB1aW50MzJfdCBQb2xhcml0eTsgLyohPCBUSU0gRW5jb2RlciBpbmRleCBwb2xhcml0eS5UaGlzIHBhcmFtZXRlciBjYW4gYmUgYQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIG9mIEByZWYgVElNRXhfRW5jb2Rlcl9JbmRleF9Qb2xhcml0eSAqLw0KLQ0KLSAgdWludDMyX3QgUHJlc2NhbGVyOyAvKiE8IFRJTSBFbmNvZGVyIGluZGV4IHByZXNjYWxlci5UaGlzIHBhcmFtZXRlciBjYW4gYmUgYQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBvZiBAcmVmIFRJTUV4X0VuY29kZXJfSW5kZXhfUHJlc2NhbGVyICovDQotDQotICB1aW50MzJfdCBGaWx0ZXI7IC8qITwgVElNIEVuY29kZXIgaW5kZXggZmlsdGVyLlRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlcg0KLSAgICAgICAgICAgICAgICAgICAgICBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwIGFuZCBNYXhfRGF0YSA9IDB4RiAqLw0KLQ0KLSAgRnVuY3Rpb25hbFN0YXRlIEZpcnN0SW5kZXhFbmFibGU7IC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRoZSBlbmNvZGVyDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgaW5kZXggaXMgZW5hYmxlZC5UaGlzIHBhcmFtZXRlcg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGNhbiBiZSBFTkFCTEUgb3IgRElTQUJMRS4gKi8NCi0NCi0gIHVpbnQzMl90IFBvc2l0aW9uOyAvKiE8IFNwZWNpZmllcyBpbiB3aGljaCBBQiBpbnB1dCBjb25maWd1cmF0aW9uIHRoZSBpbmRleA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50IHJlc2V0cyB0aGUgY291bnRlci5UaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIG9mIEByZWYgVElNRXhfRW5jb2Rlcl9JbmRleF9Qb3NpdGlvbiAqLw0KLQ0KLSAgdWludDMyX3QgRGlyZWN0aW9uOyAvKiE8IFNwZWNpZmllcyBpbiB3aGljaCBjb3VudGVyIGRpcmVjdGlvbiB0aGUgaW5kZXggZXZlbnQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXRzIHRoZSBjb3VudGVyLlRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mDQotICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgVElNRXhfRW5jb2Rlcl9JbmRleF9EaXJlY3Rpb24gKi8NCi0NCi19IFRJTUV4X0VuY29kZXJJbmRleENvbmZpZ1R5cGVEZWY7DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0vKiBFbmQgb2YgZXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLQ0KLS8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBkZWZncm91cCBUSU1FeF9FeHBvcnRlZF9Db25zdGFudHMgVElNIEV4dGVuZGVkIEV4cG9ydGVkIENvbnN0YW50cw0KLSAqIEB7DQotICovDQotDQotLyoqIEBkZWZncm91cCBUSU1FeF9SZW1hcCBUSU0gRXh0ZW5kZWQgUmVtYXBwaW5nDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFRJTV9USU0xX0VUUl9HUElPIDB4MDAwMDAwMDBVIC8qICE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gR1BJTyAqLw0KLSNkZWZpbmUgVElNX1RJTTFfRVRSX0NPTVAxIFwNCi0gIFRJTTFfQUYxX0VUUlNFTF8wIC8qICE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDFfT1VUICovDQotI2RlZmluZSBUSU1fVElNMV9FVFJfQ09NUDIgXA0KLSAgVElNMV9BRjFfRVRSU0VMXzEgLyogITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QMl9PVVQgKi8NCi0jZGVmaW5lIFRJTV9USU0xX0VUUl9DT01QMyBcDQotICAoVElNMV9BRjFfRVRSU0VMXzEgfCAgICAgXA0KLSAgIFRJTTFfQUYxX0VUUlNFTF8wKSAvKiAhPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVAzX09VVCAqLw0KLSNkZWZpbmUgVElNX1RJTTFfRVRSX0NPTVA0IFwNCi0gIFRJTTFfQUYxX0VUUlNFTF8yIC8qICE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDRfT1VUICovDQotI2lmIGRlZmluZWQoQ09NUDUpDQotI2RlZmluZSBUSU1fVElNMV9FVFJfQ09NUDUgXA0KLSAgKFRJTTFfQUYxX0VUUlNFTF8yIHwgICAgIFwNCi0gICBUSU0xX0FGMV9FVFJTRUxfMCkgLyogITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QNV9PVVQgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgLyogQ09NUDUgKi8NCi0jaWYgZGVmaW5lZChDT01QNikNCi0jZGVmaW5lIFRJTV9USU0xX0VUUl9DT01QNiBcDQotICAoVElNMV9BRjFfRVRSU0VMXzIgfCAgICAgXA0KLSAgIFRJTTFfQUYxX0VUUlNFTF8xKSAvKiAhPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVA2X09VVCAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgICAvKiBDT01QNiAqLw0KLSNpZiBkZWZpbmVkKENPTVA3KQ0KLSNkZWZpbmUgVElNX1RJTTFfRVRSX0NPTVA3ICAgICAgICAgICAgICAgICBcDQotICAoVElNMV9BRjFfRVRSU0VMXzIgfCBUSU0xX0FGMV9FVFJTRUxfMSB8IFwNCi0gICBUSU0xX0FGMV9FVFJTRUxfMCkgLyogITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QN19PVVQgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgLyogQ09NUDcgKi8NCi0jZGVmaW5lIFRJTV9USU0xX0VUUl9BREMxX0FXRDEgICAgICAgICAgICAgICAgICAgXA0KLSAgVElNMV9BRjFfRVRSU0VMXzMgLyogITwgQURDMSBhbmFsb2cgd2F0Y2hkb2cgMSBcDQotICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFRJTV9USU0xX0VUUl9BREMxX0FXRDIgXA0KLSAgKFRJTTFfQUYxX0VUUlNFTF8zIHwgVElNMV9BRjFfRVRSU0VMXzApIC8qICE8IEFEQzEgYW5hbG9nIHdhdGNoZG9nIDIgKi8NCi0jZGVmaW5lIFRJTV9USU0xX0VUUl9BREMxX0FXRDMgXA0KLSAgKFRJTTFfQUYxX0VUUlNFTF8zIHwgVElNMV9BRjFfRVRSU0VMXzEpIC8qICE8IEFEQzEgYW5hbG9nIHdhdGNoZG9nIDMgKi8NCi0jaWYgZGVmaW5lZChBREM0KQ0KLSNkZWZpbmUgVElNX1RJTTFfRVRSX0FEQzRfQVdEMSAgICAgICAgICAgICBcDQotICAoVElNMV9BRjFfRVRSU0VMXzMgfCBUSU0xX0FGMV9FVFJTRUxfMSB8IFwNCi0gICBUSU0xX0FGMV9FVFJTRUxfMCkgLyogITwgQURDNCBhbmFsb2cgd2F0Y2hkb2cgMSAqLw0KLSNkZWZpbmUgVElNX1RJTTFfRVRSX0FEQzRfQVdEMiBcDQotICAoVElNMV9BRjFfRVRSU0VMXzMgfCBUSU0xX0FGMV9FVFJTRUxfMikgLyogITwgQURDNCBhbmFsb2cgd2F0Y2hkb2cgMiAqLw0KLSNkZWZpbmUgVElNX1RJTTFfRVRSX0FEQzRfQVdEMyAgICAgICAgICAgICBcDQotICAoVElNMV9BRjFfRVRSU0VMXzMgfCBUSU0xX0FGMV9FVFJTRUxfMiB8IFwNCi0gICBUSU0xX0FGMV9FVFJTRUxfMCkgLyogITwgQURDNCBhbmFsb2cgd2F0Y2hkb2cgMyAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgICAvKiBBREM0ICovDQotDQotI2RlZmluZSBUSU1fVElNMl9FVFJfR1BJTyAweDAwMDAwMDAwVSAvKiAhPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIEdQSU8gKi8NCi0jZGVmaW5lIFRJTV9USU0yX0VUUl9DT01QMSBcDQotICBUSU0xX0FGMV9FVFJTRUxfMCAvKiAhPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVAxX09VVCAqLw0KLSNkZWZpbmUgVElNX1RJTTJfRVRSX0NPTVAyIFwNCi0gIFRJTTFfQUYxX0VUUlNFTF8xIC8qICE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDJfT1VUICovDQotI2RlZmluZSBUSU1fVElNMl9FVFJfQ09NUDMgXA0KLSAgKFRJTTFfQUYxX0VUUlNFTF8xIHwgICAgIFwNCi0gICBUSU0xX0FGMV9FVFJTRUxfMCkgLyogITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QM19PVVQgKi8NCi0jZGVmaW5lIFRJTV9USU0yX0VUUl9DT01QNCBcDQotICBUSU0xX0FGMV9FVFJTRUxfMiAvKiAhPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVA0X09VVCAqLw0KLSNpZiBkZWZpbmVkKENPTVA1KQ0KLSNkZWZpbmUgVElNX1RJTTJfRVRSX0NPTVA1IFwNCi0gIChUSU0xX0FGMV9FVFJTRUxfMiB8ICAgICBcDQotICAgVElNMV9BRjFfRVRSU0VMXzApIC8qICE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDVfT1VUICovDQotI2VuZGlmICAgICAgICAgICAgICAgIC8qIENPTVA1ICovDQotI2lmIGRlZmluZWQoQ09NUDYpDQotI2RlZmluZSBUSU1fVElNMl9FVFJfQ09NUDYgXA0KLSAgKFRJTTFfQUYxX0VUUlNFTF8yIHwgICAgIFwNCi0gICBUSU0xX0FGMV9FVFJTRUxfMSkgLyogITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QNl9PVVQgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgLyogQ09NUDYgKi8NCi0jaWYgZGVmaW5lZChDT01QNykNCi0jZGVmaW5lIFRJTV9USU0yX0VUUl9DT01QNyAgICAgICAgICAgICAgICAgXA0KLSAgKFRJTTFfQUYxX0VUUlNFTF8yIHwgVElNMV9BRjFfRVRSU0VMXzEgfCBcDQotICAgVElNMV9BRjFfRVRSU0VMXzApIC8qICE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDdfT1VUICovDQotI2VuZGlmICAgICAgICAgICAgICAgIC8qIENPTVA3ICovDQotI2RlZmluZSBUSU1fVElNMl9FVFJfVElNM19FVFIgXA0KLSAgVElNMV9BRjFfRVRSU0VMXzMgLyogITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBUSU0zIEVUUiAqLw0KLSNkZWZpbmUgVElNX1RJTTJfRVRSX1RJTTRfRVRSIFwNCi0gIChUSU0xX0FGMV9FVFJTRUxfMyB8ICAgICAgICBcDQotICAgVElNMV9BRjFfRVRSU0VMXzApIC8qICE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gVElNNCBFVFIgKi8NCi0jaWYgZGVmaW5lZChUSU01KQ0KLSNkZWZpbmUgVElNX1RJTTJfRVRSX1RJTTVfRVRSIFwNCi0gIChUSU0xX0FGMV9FVFJTRUxfMyB8ICAgICAgICBcDQotICAgVElNMV9BRjFfRVRSU0VMXzEpIC8qICE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gVElNNSBFVFIgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgLyogVElNNSAqLw0KLSNkZWZpbmUgVElNX1RJTTJfRVRSX0xTRSAgICAgICAgICAgICAgICAgICBcDQotICAoVElNMV9BRjFfRVRSU0VMXzMgfCBUSU0xX0FGMV9FVFJTRUxfMSB8IFwNCi0gICBUSU0xX0FGMV9FVFJTRUxfMCkgLyogITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBMU0UgKi8NCi0NCi0jZGVmaW5lIFRJTV9USU0zX0VUUl9HUElPIDB4MDAwMDAwMDBVIC8qICE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gR1BJTyAqLw0KLSNkZWZpbmUgVElNX1RJTTNfRVRSX0NPTVAxIFwNCi0gIFRJTTFfQUYxX0VUUlNFTF8wIC8qICE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDFfT1VUICovDQotI2RlZmluZSBUSU1fVElNM19FVFJfQ09NUDIgXA0KLSAgVElNMV9BRjFfRVRSU0VMXzEgLyogITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QMl9PVVQgKi8NCi0jZGVmaW5lIFRJTV9USU0zX0VUUl9DT01QMyBcDQotICAoVElNMV9BRjFfRVRSU0VMXzEgfCAgICAgXA0KLSAgIFRJTTFfQUYxX0VUUlNFTF8wKSAvKiAhPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVAzX09VVCAqLw0KLSNkZWZpbmUgVElNX1RJTTNfRVRSX0NPTVA0IFwNCi0gIFRJTTFfQUYxX0VUUlNFTF8yIC8qICE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDRfT1VUICovDQotI2lmIGRlZmluZWQoQ09NUDUpDQotI2RlZmluZSBUSU1fVElNM19FVFJfQ09NUDUgXA0KLSAgKFRJTTFfQUYxX0VUUlNFTF8yIHwgICAgIFwNCi0gICBUSU0xX0FGMV9FVFJTRUxfMCkgLyogITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QNV9PVVQgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgLyogQ09NUDUgKi8NCi0jaWYgZGVmaW5lZChDT01QNikNCi0jZGVmaW5lIFRJTV9USU0zX0VUUl9DT01QNiBcDQotICAoVElNMV9BRjFfRVRSU0VMXzIgfCAgICAgXA0KLSAgIFRJTTFfQUYxX0VUUlNFTF8xKSAvKiAhPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVA2X09VVCAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgICAvKiBDT01QNiAqLw0KLSNpZiBkZWZpbmVkKENPTVA3KQ0KLSNkZWZpbmUgVElNX1RJTTNfRVRSX0NPTVA3ICAgICAgICAgICAgICAgICBcDQotICAoVElNMV9BRjFfRVRSU0VMXzIgfCBUSU0xX0FGMV9FVFJTRUxfMSB8IFwNCi0gICBUSU0xX0FGMV9FVFJTRUxfMCkgLyogITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QN19PVVQgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgLyogQ09NUDcgKi8NCi0jZGVmaW5lIFRJTV9USU0zX0VUUl9USU0yX0VUUiBcDQotICBUSU0xX0FGMV9FVFJTRUxfMyAvKiAhPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIFRJTTIgRVRSICovDQotI2RlZmluZSBUSU1fVElNM19FVFJfVElNNF9FVFIgXA0KLSAgKFRJTTFfQUYxX0VUUlNFTF8zIHwgICAgICAgIFwNCi0gICBUSU0xX0FGMV9FVFJTRUxfMCkgLyogITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBUSU00IEVUUiAqLw0KLSNkZWZpbmUgVElNX1RJTTNfRVRSX0FEQzJfQVdEMSAgICAgICAgICAgICBcDQotICAoVElNMV9BRjFfRVRSU0VMXzMgfCBUSU0xX0FGMV9FVFJTRUxfMSB8IFwNCi0gICBUSU0xX0FGMV9FVFJTRUxfMCkgLyogITwgQURDMiBhbmFsb2cgd2F0Y2hkb2cgMSAqLw0KLSNkZWZpbmUgVElNX1RJTTNfRVRSX0FEQzJfQVdEMiBcDQotICAoVElNMV9BRjFfRVRSU0VMXzMgfCBUSU0xX0FGMV9FVFJTRUxfMikgLyogITwgQURDMiBhbmFsb2cgd2F0Y2hkb2cgMiAqLw0KLSNkZWZpbmUgVElNX1RJTTNfRVRSX0FEQzJfQVdEMyAgICAgICAgICAgICBcDQotICAoVElNMV9BRjFfRVRSU0VMXzMgfCBUSU0xX0FGMV9FVFJTRUxfMiB8IFwNCi0gICBUSU0xX0FGMV9FVFJTRUxfMCkgLyogITwgQURDMiBhbmFsb2cgd2F0Y2hkb2cgMyAqLw0KLQ0KLSNkZWZpbmUgVElNX1RJTTRfRVRSX0dQSU8gMHgwMDAwMDAwMFUgLyogITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBHUElPICovDQotI2RlZmluZSBUSU1fVElNNF9FVFJfQ09NUDEgXA0KLSAgVElNMV9BRjFfRVRSU0VMXzAgLyogITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QMV9PVVQgKi8NCi0jZGVmaW5lIFRJTV9USU00X0VUUl9DT01QMiBcDQotICBUSU0xX0FGMV9FVFJTRUxfMSAvKiAhPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVAyX09VVCAqLw0KLSNkZWZpbmUgVElNX1RJTTRfRVRSX0NPTVAzIFwNCi0gIChUSU0xX0FGMV9FVFJTRUxfMSB8ICAgICBcDQotICAgVElNMV9BRjFfRVRSU0VMXzApIC8qICE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDNfT1VUICovDQotI2RlZmluZSBUSU1fVElNNF9FVFJfQ09NUDQgXA0KLSAgVElNMV9BRjFfRVRSU0VMXzIgLyogITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QNF9PVVQgKi8NCi0jaWYgZGVmaW5lZChDT01QNSkNCi0jZGVmaW5lIFRJTV9USU00X0VUUl9DT01QNSBcDQotICAoVElNMV9BRjFfRVRSU0VMXzIgfCAgICAgXA0KLSAgIFRJTTFfQUYxX0VUUlNFTF8wKSAvKiAhPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVA1X09VVCAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgICAvKiBDT01QNSAqLw0KLSNpZiBkZWZpbmVkKENPTVA2KQ0KLSNkZWZpbmUgVElNX1RJTTRfRVRSX0NPTVA2IFwNCi0gIChUSU0xX0FGMV9FVFJTRUxfMiB8ICAgICBcDQotICAgVElNMV9BRjFfRVRSU0VMXzEpIC8qICE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDZfT1VUICovDQotI2VuZGlmICAgICAgICAgICAgICAgIC8qIENPTVA2ICovDQotI2lmIGRlZmluZWQoQ09NUDcpDQotI2RlZmluZSBUSU1fVElNNF9FVFJfQ09NUDcgICAgICAgICAgICAgICAgIFwNCi0gIChUSU0xX0FGMV9FVFJTRUxfMiB8IFRJTTFfQUYxX0VUUlNFTF8xIHwgXA0KLSAgIFRJTTFfQUYxX0VUUlNFTF8wKSAvKiAhPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVA3X09VVCAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgICAvKiBDT01QNyAqLw0KLSNkZWZpbmUgVElNX1RJTTRfRVRSX1RJTTNfRVRSIFwNCi0gIFRJTTFfQUYxX0VUUlNFTF8zIC8qICE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gVElNMyBFVFIgKi8NCi0jaWYgZGVmaW5lZChUSU01KQ0KLSNkZWZpbmUgVElNX1RJTTRfRVRSX1RJTTVfRVRSIFwNCi0gIChUSU0xX0FGMV9FVFJTRUxfMyB8ICAgICAgICBcDQotICAgVElNMV9BRjFfRVRSU0VMXzApIC8qICE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gVElNNSBFVFIgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgLyogVElNNSAqLw0KLQ0KLSNpZiBkZWZpbmVkKFRJTTUpDQotI2RlZmluZSBUSU1fVElNNV9FVFJfR1BJTyAweDAwMDAwMDAwVSAvKiAhPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIEdQSU8gKi8NCi0jZGVmaW5lIFRJTV9USU01X0VUUl9DT01QMSBcDQotICBUSU0xX0FGMV9FVFJTRUxfMCAvKiAhPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVAxX09VVCAqLw0KLSNkZWZpbmUgVElNX1RJTTVfRVRSX0NPTVAyIFwNCi0gIFRJTTFfQUYxX0VUUlNFTF8xIC8qICE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDJfT1VUICovDQotI2RlZmluZSBUSU1fVElNNV9FVFJfQ09NUDMgXA0KLSAgKFRJTTFfQUYxX0VUUlNFTF8xIHwgICAgIFwNCi0gICBUSU0xX0FGMV9FVFJTRUxfMCkgLyogITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QM19PVVQgKi8NCi0jZGVmaW5lIFRJTV9USU01X0VUUl9DT01QNCBcDQotICBUSU0xX0FGMV9FVFJTRUxfMiAvKiAhPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVA0X09VVCAqLw0KLSNpZiBkZWZpbmVkKENPTVA1KQ0KLSNkZWZpbmUgVElNX1RJTTVfRVRSX0NPTVA1IFwNCi0gIChUSU0xX0FGMV9FVFJTRUxfMiB8ICAgICBcDQotICAgVElNMV9BRjFfRVRSU0VMXzApIC8qICE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDVfT1VUICovDQotI2VuZGlmICAgICAgICAgICAgICAgIC8qIENPTVA1ICovDQotI2lmIGRlZmluZWQoQ09NUDYpDQotI2RlZmluZSBUSU1fVElNNV9FVFJfQ09NUDYgXA0KLSAgKFRJTTFfQUYxX0VUUlNFTF8yIHwgICAgIFwNCi0gICBUSU0xX0FGMV9FVFJTRUxfMSkgLyogITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QNl9PVVQgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgLyogQ09NUDYgKi8NCi0jaWYgZGVmaW5lZChDT01QNykNCi0jZGVmaW5lIFRJTV9USU01X0VUUl9DT01QNyAgICAgICAgICAgICAgICAgXA0KLSAgKFRJTTFfQUYxX0VUUlNFTF8yIHwgVElNMV9BRjFfRVRSU0VMXzEgfCBcDQotICAgVElNMV9BRjFfRVRSU0VMXzApIC8qICE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDdfT1VUICovDQotI2VuZGlmICAgICAgICAgICAgICAgIC8qIENPTVA3ICovDQotI2RlZmluZSBUSU1fVElNNV9FVFJfVElNMl9FVFIgXA0KLSAgVElNMV9BRjFfRVRSU0VMXzMgLyogITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBUSU0yIEVUUiAqLw0KLSNkZWZpbmUgVElNX1RJTTVfRVRSX1RJTTNfRVRSIFwNCi0gIChUSU0xX0FGMV9FVFJTRUxfMyB8ICAgICAgICBcDQotICAgVElNMV9BRjFfRVRSU0VMXzApIC8qICE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gVElNMyBFVFIgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgLyogVElNNSAqLw0KLQ0KLSNkZWZpbmUgVElNX1RJTThfRVRSX0dQSU8gMHgwMDAwMDAwMFUgLyogITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBHUElPICovDQotI2RlZmluZSBUSU1fVElNOF9FVFJfQ09NUDEgXA0KLSAgVElNMV9BRjFfRVRSU0VMXzAgLyogITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QMV9PVVQgKi8NCi0jZGVmaW5lIFRJTV9USU04X0VUUl9DT01QMiBcDQotICBUSU0xX0FGMV9FVFJTRUxfMSAvKiAhPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVAyX09VVCAqLw0KLSNkZWZpbmUgVElNX1RJTThfRVRSX0NPTVAzIFwNCi0gIChUSU0xX0FGMV9FVFJTRUxfMSB8ICAgICBcDQotICAgVElNMV9BRjFfRVRSU0VMXzApIC8qICE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDNfT1VUICovDQotI2RlZmluZSBUSU1fVElNOF9FVFJfQ09NUDQgXA0KLSAgVElNMV9BRjFfRVRSU0VMXzIgLyogITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QNF9PVVQgKi8NCi0jaWYgZGVmaW5lZChDT01QNSkNCi0jZGVmaW5lIFRJTV9USU04X0VUUl9DT01QNSBcDQotICAoVElNMV9BRjFfRVRSU0VMXzIgfCAgICAgXA0KLSAgIFRJTTFfQUYxX0VUUlNFTF8wKSAvKiAhPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVA1X09VVCAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgICAvKiBDT01QNSAqLw0KLSNpZiBkZWZpbmVkKENPTVA2KQ0KLSNkZWZpbmUgVElNX1RJTThfRVRSX0NPTVA2IFwNCi0gIChUSU0xX0FGMV9FVFJTRUxfMiB8ICAgICBcDQotICAgVElNMV9BRjFfRVRSU0VMXzEpIC8qICE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDZfT1VUICovDQotI2VuZGlmICAgICAgICAgICAgICAgIC8qIENPTVA2ICovDQotI2lmIGRlZmluZWQoQ09NUDcpDQotI2RlZmluZSBUSU1fVElNOF9FVFJfQ09NUDcgICAgICAgICAgICAgICAgIFwNCi0gIChUSU0xX0FGMV9FVFJTRUxfMiB8IFRJTTFfQUYxX0VUUlNFTF8xIHwgXA0KLSAgIFRJTTFfQUYxX0VUUlNFTF8wKSAvKiAhPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVA3X09VVCAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgICAvKiBDT01QNyAqLw0KLSNkZWZpbmUgVElNX1RJTThfRVRSX0FEQzJfQVdEMSAgICAgICAgICAgICAgICAgICBcDQotICBUSU0xX0FGMV9FVFJTRUxfMyAvKiAhPCBBREMyIGFuYWxvZyB3YXRjaGRvZyAxIFwNCi0gICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgVElNX1RJTThfRVRSX0FEQzJfQVdEMiBcDQotICAoVElNMV9BRjFfRVRSU0VMXzMgfCBUSU0xX0FGMV9FVFJTRUxfMCkgLyogITwgQURDMiBhbmFsb2cgd2F0Y2hkb2cgMiAqLw0KLSNkZWZpbmUgVElNX1RJTThfRVRSX0FEQzJfQVdEMyBcDQotICAoVElNMV9BRjFfRVRSU0VMXzMgfCBUSU0xX0FGMV9FVFJTRUxfMSkgLyogITwgQURDMiBhbmFsb2cgd2F0Y2hkb2cgMyAqLw0KLSNpZiBkZWZpbmVkKEFEQzMpDQotI2RlZmluZSBUSU1fVElNOF9FVFJfQURDM19BV0QxICAgICAgICAgICAgIFwNCi0gIChUSU0xX0FGMV9FVFJTRUxfMyB8IFRJTTFfQUYxX0VUUlNFTF8xIHwgXA0KLSAgIFRJTTFfQUYxX0VUUlNFTF8wKSAvKiAhPCBBREMzIGFuYWxvZyB3YXRjaGRvZyAxICovDQotI2RlZmluZSBUSU1fVElNOF9FVFJfQURDM19BV0QyIFwNCi0gIChUSU0xX0FGMV9FVFJTRUxfMyB8IFRJTTFfQUYxX0VUUlNFTF8yKSAvKiAhPCBBREMzIGFuYWxvZyB3YXRjaGRvZyAyICovDQotI2RlZmluZSBUSU1fVElNOF9FVFJfQURDM19BV0QzICAgICAgICAgICAgIFwNCi0gIChUSU0xX0FGMV9FVFJTRUxfMyB8IFRJTTFfQUYxX0VUUlNFTF8yIHwgXA0KLSAgIFRJTTFfQUYxX0VUUlNFTF8wKSAvKiAhPCBBREMzIGFuYWxvZyB3YXRjaGRvZyAzICovDQotI2VuZGlmICAgICAgICAgICAgICAgIC8qIEFEQzMgKi8NCi0NCi0jaWYgZGVmaW5lZChUSU0yMCkNCi0jZGVmaW5lIFRJTV9USU0yMF9FVFJfR1BJTyAweDAwMDAwMDAwVSAvKiAhPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIEdQSU8gKi8NCi0jZGVmaW5lIFRJTV9USU0yMF9FVFJfQ09NUDEgXA0KLSAgVElNMV9BRjFfRVRSU0VMXzAgLyogITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QMV9PVVQgKi8NCi0jZGVmaW5lIFRJTV9USU0yMF9FVFJfQ09NUDIgXA0KLSAgVElNMV9BRjFfRVRSU0VMXzEgLyogITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QMl9PVVQgKi8NCi0jZGVmaW5lIFRJTV9USU0yMF9FVFJfQ09NUDMgXA0KLSAgKFRJTTFfQUYxX0VUUlNFTF8xIHwgICAgICBcDQotICAgVElNMV9BRjFfRVRSU0VMXzApIC8qICE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDNfT1VUICovDQotI2RlZmluZSBUSU1fVElNMjBfRVRSX0NPTVA0IFwNCi0gIFRJTTFfQUYxX0VUUlNFTF8yIC8qICE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDRfT1VUICovDQotI2lmIGRlZmluZWQoQ09NUDUpDQotI2RlZmluZSBUSU1fVElNMjBfRVRSX0NPTVA1IFwNCi0gIChUSU0xX0FGMV9FVFJTRUxfMiB8ICAgICAgXA0KLSAgIFRJTTFfQUYxX0VUUlNFTF8wKSAvKiAhPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVA1X09VVCAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgICAvKiBDT01QNSAqLw0KLSNpZiBkZWZpbmVkKENPTVA2KQ0KLSNkZWZpbmUgVElNX1RJTTIwX0VUUl9DT01QNiBcDQotICAoVElNMV9BRjFfRVRSU0VMXzIgfCAgICAgIFwNCi0gICBUSU0xX0FGMV9FVFJTRUxfMSkgLyogITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QNl9PVVQgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgLyogQ09NUDYgKi8NCi0jaWYgZGVmaW5lZChDT01QNykNCi0jZGVmaW5lIFRJTV9USU0yMF9FVFJfQ09NUDcgICAgICAgICAgICAgICAgXA0KLSAgKFRJTTFfQUYxX0VUUlNFTF8yIHwgVElNMV9BRjFfRVRSU0VMXzEgfCBcDQotICAgVElNMV9BRjFfRVRSU0VMXzApIC8qICE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDdfT1VUICovDQotI2VuZGlmICAgICAgICAgICAgICAgIC8qIENPTVA3ICovDQotI2RlZmluZSBUSU1fVElNMjBfRVRSX0FEQzNfQVdEMSBcDQotICBUSU0xX0FGMV9FVFJTRUxfMyAvKiAhPCBBREMzIGFuYWxvZyB3YXRjaGRvZyAxICovDQotI2RlZmluZSBUSU1fVElNMjBfRVRSX0FEQzNfQVdEMiBcDQotICAoVElNMV9BRjFfRVRSU0VMXzMgfCBUSU0xX0FGMV9FVFJTRUxfMCkgLyogITwgQURDMyBhbmFsb2cgd2F0Y2hkb2cgMiAqLw0KLSNkZWZpbmUgVElNX1RJTTIwX0VUUl9BREMzX0FXRDMgXA0KLSAgKFRJTTFfQUYxX0VUUlNFTF8zIHwgVElNMV9BRjFfRVRSU0VMXzEpIC8qICE8IEFEQzMgYW5hbG9nIHdhdGNoZG9nIDMgKi8NCi0jaWYgZGVmaW5lZChBREM1KQ0KLSNkZWZpbmUgVElNX1RJTTIwX0VUUl9BREM1X0FXRDEgICAgICAgICAgICBcDQotICAoVElNMV9BRjFfRVRSU0VMXzMgfCBUSU0xX0FGMV9FVFJTRUxfMSB8IFwNCi0gICBUSU0xX0FGMV9FVFJTRUxfMCkgLyogITwgQURDNSBhbmFsb2cgd2F0Y2hkb2cgMSAqLw0KLSNkZWZpbmUgVElNX1RJTTIwX0VUUl9BREM1X0FXRDIgXA0KLSAgKFRJTTFfQUYxX0VUUlNFTF8zIHwgVElNMV9BRjFfRVRSU0VMXzIpIC8qICE8IEFEQzUgYW5hbG9nIHdhdGNoZG9nIDIgKi8NCi0jZGVmaW5lIFRJTV9USU0yMF9FVFJfQURDNV9BV0QzICAgICAgICAgICAgXA0KLSAgKFRJTTFfQUYxX0VUUlNFTF8zIHwgVElNMV9BRjFfRVRSU0VMXzIgfCBcDQotICAgVElNMV9BRjFfRVRSU0VMXzApIC8qICE8IEFEQzUgYW5hbG9nIHdhdGNoZG9nIDMgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgLyogQURDNSAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgICAvKiBUSU0yMCAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBUSU1FeF9CcmVha19JbnB1dCBUSU0gRXh0ZW5kZWQgQnJlYWsgaW5wdXQNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgVElNX0JSRUFLSU5QVVRfQlJLIDB4MDAwMDAwMDFVICAvKiE8IFRpbWVyIGJyZWFrIGlucHV0ICAqLw0KLSNkZWZpbmUgVElNX0JSRUFLSU5QVVRfQlJLMiAweDAwMDAwMDAyVSAvKiE8IFRpbWVyIGJyZWFrMiBpbnB1dCAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBUSU1FeF9CcmVha19JbnB1dF9Tb3VyY2UgVElNIEV4dGVuZGVkIEJyZWFrIGlucHV0IHNvdXJjZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBUSU1fQlJFQUtJTlBVVFNPVVJDRV9CS0lOIFwNCi0gIDB4MDAwMDAwMDFVIC8qICE8IEFuIGV4dGVybmFsIHNvdXJjZSAoR1BJTykgaXMgY29ubmVjdGVkIHRvIHRoZSBCS0lOIHBpbiAgKi8NCi0jZGVmaW5lIFRJTV9CUkVBS0lOUFVUU09VUkNFX0NPTVAxIFwNCi0gIDB4MDAwMDAwMDJVIC8qICE8IFRoZSBDT01QMSBvdXRwdXQgaXMgY29ubmVjdGVkIHRvIHRoZSBicmVhayBpbnB1dCAqLw0KLSNkZWZpbmUgVElNX0JSRUFLSU5QVVRTT1VSQ0VfQ09NUDIgXA0KLSAgMHgwMDAwMDAwNFUgLyogITwgVGhlIENPTVAyIG91dHB1dCBpcyBjb25uZWN0ZWQgdG8gdGhlIGJyZWFrIGlucHV0ICovDQotI2RlZmluZSBUSU1fQlJFQUtJTlBVVFNPVVJDRV9DT01QMyBcDQotICAweDAwMDAwMDA4VSAvKiAhPCBUaGUgQ09NUDMgb3V0cHV0IGlzIGNvbm5lY3RlZCB0byB0aGUgYnJlYWsgaW5wdXQgKi8NCi0jZGVmaW5lIFRJTV9CUkVBS0lOUFVUU09VUkNFX0NPTVA0IFwNCi0gIDB4MDAwMDAwMTBVIC8qICE8IFRoZSBDT01QNCBvdXRwdXQgaXMgY29ubmVjdGVkIHRvIHRoZSBicmVhayBpbnB1dCAqLw0KLSNpZiBkZWZpbmVkKENPTVA1KQ0KLSNkZWZpbmUgVElNX0JSRUFLSU5QVVRTT1VSQ0VfQ09NUDUgXA0KLSAgMHgwMDAwMDAyMFUgLyogITwgVGhlIENPTVA1IG91dHB1dCBpcyBjb25uZWN0ZWQgdG8gdGhlIGJyZWFrIGlucHV0ICovDQotI2VuZGlmICAgICAgICAvKiBDT01QNSAqLw0KLSNpZiBkZWZpbmVkKENPTVA2KQ0KLSNkZWZpbmUgVElNX0JSRUFLSU5QVVRTT1VSQ0VfQ09NUDYgXA0KLSAgMHgwMDAwMDA0MFUgLyogITwgVGhlIENPTVA2IG91dHB1dCBpcyBjb25uZWN0ZWQgdG8gdGhlIGJyZWFrIGlucHV0ICovDQotI2VuZGlmICAgICAgICAvKiBDT01QNiAqLw0KLSNpZiBkZWZpbmVkKENPTVA3KQ0KLSNkZWZpbmUgVElNX0JSRUFLSU5QVVRTT1VSQ0VfQ09NUDcgXA0KLSAgMHgwMDAwMDA4MFUgLyogITwgVGhlIENPTVA3IG91dHB1dCBpcyBjb25uZWN0ZWQgdG8gdGhlIGJyZWFrIGlucHV0ICovDQotI2VuZGlmICAgICAgICAvKiBDT01QNyAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBUSU1FeF9CcmVha19JbnB1dF9Tb3VyY2VfRW5hYmxlIFRJTSBFeHRlbmRlZCBCcmVhayBpbnB1dCBzb3VyY2UNCi0gKiBlbmFibGluZw0KLSAqIEB7DQotICovDQotI2RlZmluZSBUSU1fQlJFQUtJTlBVVFNPVVJDRV9ESVNBQkxFIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgQnJlYWsgaW5wdXQgc291cmNlIGlzIGRpc2FibGVkICovDQotI2RlZmluZSBUSU1fQlJFQUtJTlBVVFNPVVJDRV9FTkFCTEUgXA0KLSAgMHgwMDAwMDAwMVUgLyohPCBCcmVhayBpbnB1dCBzb3VyY2UgaXMgZW5hYmxlZCAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBUSU1FeF9CcmVha19JbnB1dF9Tb3VyY2VfUG9sYXJpdHkgVElNIEV4dGVuZGVkIEJyZWFrIGlucHV0DQotICogcG9sYXJpdHkNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgVElNX0JSRUFLSU5QVVRTT1VSQ0VfUE9MQVJJVFlfTE9XIFwNCi0gIDB4MDAwMDAwMDFVIC8qITwgQnJlYWsgaW5wdXQgc291cmNlIGlzIGFjdGl2ZSBsb3cgKi8NCi0jZGVmaW5lIFRJTV9CUkVBS0lOUFVUU09VUkNFX1BPTEFSSVRZX0hJR0ggXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBCcmVhayBpbnB1dCBzb3VyY2UgaXMgYWN0aXZlX2hpZ2ggKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNRXhfVGltZXJfSW5wdXRfU2VsZWN0aW9uIFRJTSBFeHRlbmRlZCBUaW1lciBpbnB1dCBzZWxlY3Rpb24NCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgVElNX1RJTTFfVEkxX0dQSU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBUSU0xIGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIEdQSU8gXA0KLSAgICAgICAgICAgICAgICovDQotI2RlZmluZSBUSU1fVElNMV9USTFfQ09NUDEgXA0KLSAgVElNX1RJU0VMX1RJMVNFTF8wIC8qITwgVElNMSBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QMV9PVVQgKi8NCi0jZGVmaW5lIFRJTV9USU0xX1RJMV9DT01QMiBcDQotICBUSU1fVElTRUxfVEkxU0VMXzEgLyohPCBUSU0xIGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVAyX09VVCAqLw0KLSNkZWZpbmUgVElNX1RJTTFfVEkxX0NPTVAzIFwNCi0gIChUSU1fVElTRUxfVEkxU0VMXzEgfCAgICBcDQotICAgVElNX1RJU0VMX1RJMVNFTF8wKSAvKiE8IFRJTTEgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDNfT1VUICovDQotI2RlZmluZSBUSU1fVElNMV9USTFfQ09NUDQgXA0KLSAgVElNX1RJU0VMX1RJMVNFTF8yIC8qITwgVElNMSBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QNF9PVVQgKi8NCi0NCi0jZGVmaW5lIFRJTV9USU0yX1RJMV9HUElPICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgVElNMiBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBHUElPIFwNCi0gICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgVElNX1RJTTJfVEkxX0NPTVAxIFwNCi0gIFRJTV9USVNFTF9USTFTRUxfMCAvKiE8IFRJTTIgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDFfT1VUICovDQotI2RlZmluZSBUSU1fVElNMl9USTFfQ09NUDIgXA0KLSAgVElNX1RJU0VMX1RJMVNFTF8xIC8qITwgVElNMiBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QMl9PVVQgKi8NCi0jZGVmaW5lIFRJTV9USU0yX1RJMV9DT01QMyBcDQotICAoVElNX1RJU0VMX1RJMVNFTF8xIHwgICAgXA0KLSAgIFRJTV9USVNFTF9USTFTRUxfMCkgLyohPCBUSU0yIGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVAzX09VVCAqLw0KLSNkZWZpbmUgVElNX1RJTTJfVEkxX0NPTVA0IFwNCi0gIFRJTV9USVNFTF9USTFTRUxfMiAvKiE8IFRJTTIgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDRfT1VUICovDQotI2lmIGRlZmluZWQoQ09NUDUpDQotI2RlZmluZSBUSU1fVElNMl9USTFfQ09NUDUgXA0KLSAgKFRJTV9USVNFTF9USTFTRUxfMiB8ICAgIFwNCi0gICBUSU1fVElTRUxfVEkxU0VMXzApIC8qITwgVElNMiBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QNV9PVVQgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgIC8qIENPTVA1ICovDQotDQotI2RlZmluZSBUSU1fVElNMl9USTJfR1BJTyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAweDAwMDAwMDAwVSAvKiE8IFRJTTIgaW5wdXQgMiBpcyBjb25uZWN0ZWQgdG8gR1BJTyBcDQotICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFRJTV9USU0yX1RJMl9DT01QMSBcDQotICBUSU1fVElTRUxfVEkyU0VMXzAgLyohPCBUSU0yIGlucHV0IDIgaXMgY29ubmVjdGVkIHRvIENPTVAxX09VVCAqLw0KLSNkZWZpbmUgVElNX1RJTTJfVEkyX0NPTVAyIFwNCi0gIFRJTV9USVNFTF9USTJTRUxfMSAvKiE8IFRJTTIgaW5wdXQgMiBpcyBjb25uZWN0ZWQgdG8gQ09NUDJfT1VUICovDQotI2RlZmluZSBUSU1fVElNMl9USTJfQ09NUDMgXA0KLSAgKFRJTV9USVNFTF9USTJTRUxfMSB8ICAgIFwNCi0gICBUSU1fVElTRUxfVEkyU0VMXzApIC8qITwgVElNMiBpbnB1dCAyIGlzIGNvbm5lY3RlZCB0byBDT01QM19PVVQgKi8NCi0jZGVmaW5lIFRJTV9USU0yX1RJMl9DT01QNCBcDQotICBUSU1fVElTRUxfVEkyU0VMXzIgLyohPCBUSU0yIGlucHV0IDIgaXMgY29ubmVjdGVkIHRvIENPTVA0X09VVCAqLw0KLSNpZiBkZWZpbmVkKENPTVA2KQ0KLSNkZWZpbmUgVElNX1RJTTJfVEkyX0NPTVA2IFwNCi0gIChUSU1fVElTRUxfVEkyU0VMXzIgfCAgICBcDQotICAgVElNX1RJU0VMX1RJMlNFTF8wKSAvKiE8IFRJTTIgaW5wdXQgMiBpcyBjb25uZWN0ZWQgdG8gQ09NUDZfT1VUICovDQotI2VuZGlmICAgICAgICAgICAgICAgICAvKiBDT01QNiAqLw0KLQ0KLSNkZWZpbmUgVElNX1RJTTJfVEkzX0dQSU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBUSU0yIGlucHV0IDMgaXMgY29ubmVjdGVkIHRvIEdQSU8gXA0KLSAgICAgICAgICAgICAgICovDQotI2RlZmluZSBUSU1fVElNMl9USTNfQ09NUDQgXA0KLSAgVElNX1RJU0VMX1RJM1NFTF8wIC8qITwgVElNMiBpbnB1dCAzIGlzIGNvbm5lY3RlZCB0byBDT01QNF9PVVQgKi8NCi0NCi0jZGVmaW5lIFRJTV9USU0yX1RJNF9HUElPICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgVElNMiBpbnB1dCA0IGlzIGNvbm5lY3RlZCB0byBHUElPIFwNCi0gICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgVElNX1RJTTJfVEk0X0NPTVAxIFwNCi0gIFRJTV9USVNFTF9USTRTRUxfMCAvKiE8IFRJTTIgaW5wdXQgNCBpcyBjb25uZWN0ZWQgdG8gQ09NUDFfT1VUICovDQotI2RlZmluZSBUSU1fVElNMl9USTRfQ09NUDIgXA0KLSAgVElNX1RJU0VMX1RJNFNFTF8xIC8qITwgVElNMiBpbnB1dCA0IGlzIGNvbm5lY3RlZCB0byBDT01QMl9PVVQgKi8NCi0NCi0jZGVmaW5lIFRJTV9USU0zX1RJMV9HUElPICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgVElNMyBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBHUElPIFwNCi0gICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgVElNX1RJTTNfVEkxX0NPTVAxIFwNCi0gIFRJTV9USVNFTF9USTFTRUxfMCAvKiE8IFRJTTMgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDFfT1VUICovDQotI2RlZmluZSBUSU1fVElNM19USTFfQ09NUDIgXA0KLSAgVElNX1RJU0VMX1RJMVNFTF8xIC8qITwgVElNMyBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QMl9PVVQgKi8NCi0jZGVmaW5lIFRJTV9USU0zX1RJMV9DT01QMyBcDQotICAoVElNX1RJU0VMX1RJMVNFTF8xIHwgICAgXA0KLSAgIFRJTV9USVNFTF9USTFTRUxfMCkgLyohPCBUSU0zIGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVAzX09VVCAqLw0KLSNkZWZpbmUgVElNX1RJTTNfVEkxX0NPTVA0IFwNCi0gIFRJTV9USVNFTF9USTFTRUxfMiAvKiE8IFRJTTMgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDRfT1VUICovDQotI2lmIGRlZmluZWQoQ09NUDUpDQotI2RlZmluZSBUSU1fVElNM19USTFfQ09NUDUgXA0KLSAgKFRJTV9USVNFTF9USTFTRUxfMiB8ICAgIFwNCi0gICBUSU1fVElTRUxfVEkxU0VMXzApIC8qITwgVElNMyBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QNV9PVVQgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgIC8qIENPTVA1ICovDQotI2lmIGRlZmluZWQoQ09NUDYpDQotI2RlZmluZSBUSU1fVElNM19USTFfQ09NUDYgXA0KLSAgKFRJTV9USVNFTF9USTFTRUxfMiB8ICAgIFwNCi0gICBUSU1fVElTRUxfVEkxU0VMXzEpIC8qITwgVElNMyBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QNl9PVVQgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgIC8qIENPTVA2ICovDQotI2lmIGRlZmluZWQoQ09NUDcpDQotI2RlZmluZSBUSU1fVElNM19USTFfQ09NUDcgICAgICAgICAgICAgICAgICAgXA0KLSAgKFRJTV9USVNFTF9USTFTRUxfMiB8IFRJTV9USVNFTF9USTFTRUxfMSB8IFwNCi0gICBUSU1fVElTRUxfVEkxU0VMXzApIC8qITwgVElNMyBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QN19PVVQgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgIC8qIENPTVA3ICovDQotDQotI2RlZmluZSBUSU1fVElNM19USTJfR1BJTyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAweDAwMDAwMDAwVSAvKiE8IFRJTTMgaW5wdXQgMiBpcyBjb25uZWN0ZWQgdG8gR1BJTyBcDQotICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFRJTV9USU0zX1RJMl9DT01QMSBcDQotICBUSU1fVElTRUxfVEkyU0VMXzAgLyohPCBUSU0zIGlucHV0IDIgaXMgY29ubmVjdGVkIHRvIENPTVAxX09VVCAqLw0KLSNkZWZpbmUgVElNX1RJTTNfVEkyX0NPTVAyIFwNCi0gIFRJTV9USVNFTF9USTJTRUxfMSAvKiE8IFRJTTMgaW5wdXQgMiBpcyBjb25uZWN0ZWQgdG8gQ09NUDJfT1VUICovDQotI2RlZmluZSBUSU1fVElNM19USTJfQ09NUDMgXA0KLSAgKFRJTV9USVNFTF9USTJTRUxfMSB8ICAgIFwNCi0gICBUSU1fVElTRUxfVEkyU0VMXzApIC8qITwgVElNMyBpbnB1dCAyIGlzIGNvbm5lY3RlZCB0byBDT01QM19PVVQgKi8NCi0jZGVmaW5lIFRJTV9USU0zX1RJMl9DT01QNCBcDQotICBUSU1fVElTRUxfVEkyU0VMXzIgLyohPCBUSU0zIGlucHV0IDIgaXMgY29ubmVjdGVkIHRvIENPTVA0X09VVCAqLw0KLSNpZiBkZWZpbmVkKENPTVA1KQ0KLSNkZWZpbmUgVElNX1RJTTNfVEkyX0NPTVA1IFwNCi0gIChUSU1fVElTRUxfVEkyU0VMXzIgfCAgICBcDQotICAgVElNX1RJU0VMX1RJMlNFTF8wKSAvKiE8IFRJTTMgaW5wdXQgMiBpcyBjb25uZWN0ZWQgdG8gQ09NUDVfT1VUICovDQotI2VuZGlmICAgICAgICAgICAgICAgICAvKiBDT01QNSAqLw0KLSNpZiBkZWZpbmVkKENPTVA2KQ0KLSNkZWZpbmUgVElNX1RJTTNfVEkyX0NPTVA2IFwNCi0gIChUSU1fVElTRUxfVEkyU0VMXzIgfCAgICBcDQotICAgVElNX1RJU0VMX1RJMlNFTF8xKSAvKiE8IFRJTTMgaW5wdXQgMiBpcyBjb25uZWN0ZWQgdG8gQ09NUDZfT1VUICovDQotI2VuZGlmICAgICAgICAgICAgICAgICAvKiBDT01QNiAqLw0KLSNpZiBkZWZpbmVkKENPTVA3KQ0KLSNkZWZpbmUgVElNX1RJTTNfVEkyX0NPTVA3ICAgICAgICAgICAgICAgICAgIFwNCi0gIChUSU1fVElTRUxfVEkyU0VMXzIgfCBUSU1fVElTRUxfVEkyU0VMXzEgfCBcDQotICAgVElNX1RJU0VMX1RJMlNFTF8wKSAvKiE8IFRJTTMgaW5wdXQgMiBpcyBjb25uZWN0ZWQgdG8gQ09NUDdfT1VUICovDQotI2VuZGlmICAgICAgICAgICAgICAgICAvKiBDT01QNyAqLw0KLQ0KLSNkZWZpbmUgVElNX1RJTTNfVEkzX0dQSU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBUSU0zIGlucHV0IDMgaXMgY29ubmVjdGVkIHRvIEdQSU8gXA0KLSAgICAgICAgICAgICAgICovDQotI2RlZmluZSBUSU1fVElNM19USTNfQ09NUDMgXA0KLSAgVElNX1RJU0VMX1RJM1NFTF8wIC8qITwgVElNMyBpbnB1dCAzIGlzIGNvbm5lY3RlZCB0byBDT01QM19PVVQgKi8NCi0NCi0jZGVmaW5lIFRJTV9USU00X1RJMV9HUElPICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgVElNNCBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBHUElPIFwNCi0gICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgVElNX1RJTTRfVEkxX0NPTVAxIFwNCi0gIFRJTV9USVNFTF9USTFTRUxfMCAvKiE8IFRJTTQgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDFfT1VUICovDQotI2RlZmluZSBUSU1fVElNNF9USTFfQ09NUDIgXA0KLSAgVElNX1RJU0VMX1RJMVNFTF8xIC8qITwgVElNNCBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QMl9PVVQgKi8NCi0jZGVmaW5lIFRJTV9USU00X1RJMV9DT01QMyBcDQotICAoVElNX1RJU0VMX1RJMVNFTF8xIHwgICAgXA0KLSAgIFRJTV9USVNFTF9USTFTRUxfMCkgLyohPCBUSU00IGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVAzX09VVCAqLw0KLSNkZWZpbmUgVElNX1RJTTRfVEkxX0NPTVA0IFwNCi0gIFRJTV9USVNFTF9USTFTRUxfMiAvKiE8IFRJTTQgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDRfT1VUICovDQotI2lmIGRlZmluZWQoQ09NUDUpDQotI2RlZmluZSBUSU1fVElNNF9USTFfQ09NUDUgXA0KLSAgKFRJTV9USVNFTF9USTFTRUxfMiB8ICAgIFwNCi0gICBUSU1fVElTRUxfVEkxU0VMXzApIC8qITwgVElNNCBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QNV9PVVQgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgIC8qIENPTVA1ICovDQotI2lmIGRlZmluZWQoQ09NUDYpDQotI2RlZmluZSBUSU1fVElNNF9USTFfQ09NUDYgXA0KLSAgKFRJTV9USVNFTF9USTFTRUxfMiB8ICAgIFwNCi0gICBUSU1fVElTRUxfVEkxU0VMXzEpIC8qITwgVElNNCBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QNl9PVVQgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgIC8qIENPTVA2ICovDQotI2lmIGRlZmluZWQoQ09NUDcpDQotI2RlZmluZSBUSU1fVElNNF9USTFfQ09NUDcgICAgICAgICAgICAgICAgICAgXA0KLSAgKFRJTV9USVNFTF9USTFTRUxfMiB8IFRJTV9USVNFTF9USTFTRUxfMSB8IFwNCi0gICBUSU1fVElTRUxfVEkxU0VMXzApIC8qITwgVElNNCBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QN19PVVQgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgIC8qIENPTVA3ICovDQotDQotI2RlZmluZSBUSU1fVElNNF9USTJfR1BJTyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAweDAwMDAwMDAwVSAvKiE8IFRJTTQgaW5wdXQgMiBpcyBjb25uZWN0ZWQgdG8gR1BJTyBcDQotICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFRJTV9USU00X1RJMl9DT01QMSBcDQotICBUSU1fVElTRUxfVEkyU0VMXzAgLyohPCBUSU00IGlucHV0IDIgaXMgY29ubmVjdGVkIHRvIENPTVAxX09VVCAqLw0KLSNkZWZpbmUgVElNX1RJTTRfVEkyX0NPTVAyIFwNCi0gIFRJTV9USVNFTF9USTJTRUxfMSAvKiE8IFRJTTQgaW5wdXQgMiBpcyBjb25uZWN0ZWQgdG8gQ09NUDJfT1VUICovDQotI2RlZmluZSBUSU1fVElNNF9USTJfQ09NUDMgXA0KLSAgKFRJTV9USVNFTF9USTJTRUxfMSB8ICAgIFwNCi0gICBUSU1fVElTRUxfVEkyU0VMXzApIC8qITwgVElNNCBpbnB1dCAyIGlzIGNvbm5lY3RlZCB0byBDT01QM19PVVQgKi8NCi0jZGVmaW5lIFRJTV9USU00X1RJMl9DT01QNCBcDQotICBUSU1fVElTRUxfVEkyU0VMXzIgLyohPCBUSU00IGlucHV0IDIgaXMgY29ubmVjdGVkIHRvIENPTVA0X09VVCAqLw0KLSNpZiBkZWZpbmVkKENPTVA1KQ0KLSNkZWZpbmUgVElNX1RJTTRfVEkyX0NPTVA1IFwNCi0gIChUSU1fVElTRUxfVEkyU0VMXzIgfCAgICBcDQotICAgVElNX1RJU0VMX1RJMlNFTF8wKSAvKiE8IFRJTTQgaW5wdXQgMiBpcyBjb25uZWN0ZWQgdG8gQ09NUDVfT1VUICovDQotI2VuZGlmICAgICAgICAgICAgICAgICAvKiBDT01QNSAqLw0KLSNpZiBkZWZpbmVkKENPTVA2KQ0KLSNkZWZpbmUgVElNX1RJTTRfVEkyX0NPTVA2IFwNCi0gIChUSU1fVElTRUxfVEkyU0VMXzIgfCAgICBcDQotICAgVElNX1RJU0VMX1RJMlNFTF8xKSAvKiE8IFRJTTQgaW5wdXQgMiBpcyBjb25uZWN0ZWQgdG8gQ09NUDZfT1VUICovDQotI2VuZGlmICAgICAgICAgICAgICAgICAvKiBDT01QNiAqLw0KLSNpZiBkZWZpbmVkKENPTVA3KQ0KLSNkZWZpbmUgVElNX1RJTTRfVEkyX0NPTVA3ICAgICAgICAgICAgICAgICAgIFwNCi0gIChUSU1fVElTRUxfVEkyU0VMXzIgfCBUSU1fVElTRUxfVEkyU0VMXzEgfCBcDQotICAgVElNX1RJU0VMX1RJMlNFTF8wKSAvKiE8IFRJTTQgaW5wdXQgMiBpcyBjb25uZWN0ZWQgdG8gQ09NUDdfT1VUICovDQotI2VuZGlmICAgICAgICAgICAgICAgICAvKiBDT01QNyAqLw0KLQ0KLSNkZWZpbmUgVElNX1RJTTRfVEkzX0dQSU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBUSU00IGlucHV0IDMgaXMgY29ubmVjdGVkIHRvIEdQSU8gXA0KLSAgICAgICAgICAgICAgICovDQotI2lmIGRlZmluZWQoQ09NUDUpDQotI2RlZmluZSBUSU1fVElNNF9USTNfQ09NUDUgXA0KLSAgVElNX1RJU0VMX1RJM1NFTF8wIC8qITwgVElNNCBpbnB1dCAzIGlzIGNvbm5lY3RlZCB0byBDT01QNV9PVVQgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAvKiBDT01QNSAqLw0KLQ0KLSNkZWZpbmUgVElNX1RJTTRfVEk0X0dQSU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBUSU00IGlucHV0IDQgaXMgY29ubmVjdGVkIHRvIEdQSU8gXA0KLSAgICAgICAgICAgICAgICovDQotI2lmIGRlZmluZWQoQ09NUDYpDQotI2RlZmluZSBUSU1fVElNNF9USTRfQ09NUDYgXA0KLSAgVElNX1RJU0VMX1RJNFNFTF8wIC8qITwgVElNNCBpbnB1dCA0IGlzIGNvbm5lY3RlZCB0byBDT01QNl9PVVQgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAvKiBDT01QNiAqLw0KLQ0KLSNpZiBkZWZpbmVkKFRJTTUpDQotI2RlZmluZSBUSU1fVElNNV9USTFfR1BJTyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAweDAwMDAwMDAwVSAvKiE8IFRJTTUgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gR1BJTyBcDQotICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFRJTV9USU01X1RJMV9MU0kgXA0KLSAgVElNX1RJU0VMX1RJMVNFTF8wIC8qITwgVElNNSBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBMU0kgKi8NCi0jZGVmaW5lIFRJTV9USU01X1RJMV9MU0UgXA0KLSAgVElNX1RJU0VMX1RJMVNFTF8xIC8qITwgVElNNSBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBMU0UgKi8NCi0jZGVmaW5lIFRJTV9USU01X1RJMV9SVENfV0sgXA0KLSAgKFRJTV9USVNFTF9USTFTRUxfMSB8ICAgICBcDQotICAgVElNX1RJU0VMX1RJMVNFTF8wKSAvKiE8IFRJTTUgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gUlRDX1dBS0VVUCAqLw0KLSNkZWZpbmUgVElNX1RJTTVfVEkxX0NPTVAxIFwNCi0gIFRJTV9USVNFTF9USTFTRUxfMiAvKiE8IFRJTTUgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDFfT1VUICovDQotI2RlZmluZSBUSU1fVElNNV9USTFfQ09NUDIgXA0KLSAgKFRJTV9USVNFTF9USTFTRUxfMiB8ICAgIFwNCi0gICBUSU1fVElTRUxfVEkxU0VMXzApIC8qITwgVElNNSBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QMl9PVVQgKi8NCi0jZGVmaW5lIFRJTV9USU01X1RJMV9DT01QMyBcDQotICAoVElNX1RJU0VMX1RJMVNFTF8yIHwgICAgXA0KLSAgIFRJTV9USVNFTF9USTFTRUxfMSkgLyohPCBUSU01IGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVAzX09VVCAqLw0KLSNkZWZpbmUgVElNX1RJTTVfVEkxX0NPTVA0ICAgICAgICAgICAgICAgICAgIFwNCi0gIChUSU1fVElTRUxfVEkxU0VMXzIgfCBUSU1fVElTRUxfVEkxU0VMXzEgfCBcDQotICAgVElNX1RJU0VMX1RJMVNFTF8wKSAvKiE8IFRJTTUgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDRfT1VUICovDQotI2lmIGRlZmluZWQoQ09NUDUpDQotI2RlZmluZSBUSU1fVElNNV9USTFfQ09NUDUgXA0KLSAgVElNX1RJU0VMX1RJMVNFTF8zIC8qITwgVElNNSBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QNV9PVVQgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAvKiBDT01QNSAqLw0KLSNpZiBkZWZpbmVkKENPTVA2KQ0KLSNkZWZpbmUgVElNX1RJTTVfVEkxX0NPTVA2IFwNCi0gIChUSU1fVElTRUxfVEkxU0VMXzMgfCAgICBcDQotICAgVElNX1RJU0VMX1RJMVNFTF8wKSAvKiE8IFRJTTUgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDZfT1VUICovDQotI2VuZGlmICAgICAgICAgICAgICAgICAvKiBDT01QNiAqLw0KLSNpZiBkZWZpbmVkKENPTVA3KQ0KLSNkZWZpbmUgVElNX1RJTTVfVEkxX0NPTVA3IFwNCi0gIChUSU1fVElTRUxfVEkxU0VMXzMgfCAgICBcDQotICAgVElNX1RJU0VMX1RJMVNFTF8xKSAvKiE8IFRJTTUgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDdfT1VUICovDQotI2VuZGlmICAgICAgICAgICAgICAgICAvKiBDT01QNyAqLw0KLQ0KLSNkZWZpbmUgVElNX1RJTTVfVEkyX0dQSU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBUSU01IGlucHV0IDIgaXMgY29ubmVjdGVkIHRvIEdQSU8gXA0KLSAgICAgICAgICAgICAgICovDQotI2RlZmluZSBUSU1fVElNNV9USTJfQ09NUDEgXA0KLSAgVElNX1RJU0VMX1RJMlNFTF8wIC8qITwgVElNNSBpbnB1dCAyIGlzIGNvbm5lY3RlZCB0byBDT01QMV9PVVQgKi8NCi0jZGVmaW5lIFRJTV9USU01X1RJMl9DT01QMiBcDQotICBUSU1fVElTRUxfVEkyU0VMXzEgLyohPCBUSU01IGlucHV0IDIgaXMgY29ubmVjdGVkIHRvIENPTVAyX09VVCAqLw0KLSNkZWZpbmUgVElNX1RJTTVfVEkyX0NPTVAzIFwNCi0gIChUSU1fVElTRUxfVEkyU0VMXzEgfCAgICBcDQotICAgVElNX1RJU0VMX1RJMlNFTF8wKSAvKiE8IFRJTTUgaW5wdXQgMiBpcyBjb25uZWN0ZWQgdG8gQ09NUDNfT1VUICovDQotI2RlZmluZSBUSU1fVElNNV9USTJfQ09NUDQgXA0KLSAgVElNX1RJU0VMX1RJMlNFTF8yIC8qITwgVElNNSBpbnB1dCAyIGlzIGNvbm5lY3RlZCB0byBDT01QNF9PVVQgKi8NCi0jaWYgZGVmaW5lZChDT01QNSkNCi0jZGVmaW5lIFRJTV9USU01X1RJMl9DT01QNSBcDQotICAoVElNX1RJU0VMX1RJMlNFTF8yIHwgICAgXA0KLSAgIFRJTV9USVNFTF9USTJTRUxfMCkgLyohPCBUSU01IGlucHV0IDIgaXMgY29ubmVjdGVkIHRvIENPTVA1X09VVCAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgICAgLyogQ09NUDUgKi8NCi0jaWYgZGVmaW5lZChDT01QNikNCi0jZGVmaW5lIFRJTV9USU01X1RJMl9DT01QNiBcDQotICAoVElNX1RJU0VMX1RJMlNFTF8yIHwgICAgXA0KLSAgIFRJTV9USVNFTF9USTJTRUxfMSkgLyohPCBUSU01IGlucHV0IDIgaXMgY29ubmVjdGVkIHRvIENPTVA2X09VVCAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgICAgLyogQ09NUDYgKi8NCi0jaWYgZGVmaW5lZChDT01QNykNCi0jZGVmaW5lIFRJTV9USU01X1RJMl9DT01QNyAgICAgICAgICAgICAgICAgICBcDQotICAoVElNX1RJU0VMX1RJMlNFTF8yIHwgVElNX1RJU0VMX1RJMlNFTF8xIHwgXA0KLSAgIFRJTV9USVNFTF9USTJTRUxfMCkgLyohPCBUSU01IGlucHV0IDIgaXMgY29ubmVjdGVkIHRvIENPTVA3X09VVCAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgICAgLyogQ09NUDcgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgIC8qIFRJTTUgKi8NCi0NCi0jZGVmaW5lIFRJTV9USU04X1RJMV9HUElPICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgVElNOCBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBHUElPIFwNCi0gICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgVElNX1RJTThfVEkxX0NPTVAxIFwNCi0gIFRJTV9USVNFTF9USTFTRUxfMCAvKiE8IFRJTTggaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDFfT1VUICovDQotI2RlZmluZSBUSU1fVElNOF9USTFfQ09NUDIgXA0KLSAgVElNX1RJU0VMX1RJMVNFTF8xIC8qITwgVElNOCBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QMl9PVVQgKi8NCi0jZGVmaW5lIFRJTV9USU04X1RJMV9DT01QMyBcDQotICAoVElNX1RJU0VMX1RJMVNFTF8xIHwgICAgXA0KLSAgIFRJTV9USVNFTF9USTFTRUxfMCkgLyohPCBUSU04IGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVAzX09VVCAqLw0KLSNkZWZpbmUgVElNX1RJTThfVEkxX0NPTVA0IFwNCi0gIFRJTV9USVNFTF9USTFTRUxfMiAvKiE8IFRJTTggaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDRfT1VUICovDQotDQotI2RlZmluZSBUSU1fVElNMTVfVEkxX0dQSU8gXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBUSU0xNSBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBHUElPICovDQotI2RlZmluZSBUSU1fVElNMTVfVEkxX0xTRSBcDQotICBUSU1fVElTRUxfVEkxU0VMXzAgLyohPCBUSU0xNSBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBMU0UgKi8NCi0jZGVmaW5lIFRJTV9USU0xNV9USTFfQ09NUDEgXA0KLSAgVElNX1RJU0VMX1RJMVNFTF8xIC8qITwgVElNMTUgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDFfT1VUICovDQotI2RlZmluZSBUSU1fVElNMTVfVEkxX0NPTVAyIFwNCi0gIChUSU1fVElTRUxfVEkxU0VMXzEgfCAgICAgXA0KLSAgIFRJTV9USVNFTF9USTFTRUxfMCkgLyohPCBUSU0xNSBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QMl9PVVQgKi8NCi0jaWYgZGVmaW5lZChDT01QNSkNCi0jZGVmaW5lIFRJTV9USU0xNV9USTFfQ09NUDUgXA0KLSAgVElNX1RJU0VMX1RJMVNFTF8yIC8qITwgVElNMTUgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDVfT1VUICovDQotI2VuZGlmICAgICAgICAgICAgICAgLyogQ09NUDUgKi8NCi0jaWYgZGVmaW5lZChDT01QNykNCi0jZGVmaW5lIFRJTV9USU0xNV9USTFfQ09NUDcgXA0KLSAgKFRJTV9USVNFTF9USTFTRUxfMiB8ICAgICBcDQotICAgVElNX1RJU0VMX1RJMVNFTF8wKSAvKiE8IFRJTTE1IGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVA3X09VVCAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgICAgLyogQ09NUDcgKi8NCi0NCi0jZGVmaW5lIFRJTV9USU0xNV9USTJfR1BJTyBcDQotICAweDAwMDAwMDAwVSAvKiE8IFRJTTE1IGlucHV0IDIgaXMgY29ubmVjdGVkIHRvIEdQSU8gKi8NCi0jZGVmaW5lIFRJTV9USU0xNV9USTJfQ09NUDIgXA0KLSAgVElNX1RJU0VMX1RJMlNFTF8wIC8qITwgVElNMTUgaW5wdXQgMiBpcyBjb25uZWN0ZWQgdG8gQ09NUDJfT1VUICovDQotI2RlZmluZSBUSU1fVElNMTVfVEkyX0NPTVAzIFwNCi0gIFRJTV9USVNFTF9USTJTRUxfMSAvKiE8IFRJTTE1IGlucHV0IDIgaXMgY29ubmVjdGVkIHRvIENPTVAzX09VVCAqLw0KLSNpZiBkZWZpbmVkKENPTVA2KQ0KLSNkZWZpbmUgVElNX1RJTTE1X1RJMl9DT01QNiBcDQotICAoVElNX1RJU0VMX1RJMlNFTF8xIHwgICAgIFwNCi0gICBUSU1fVElTRUxfVEkyU0VMXzApIC8qITwgVElNMTUgaW5wdXQgMiBpcyBjb25uZWN0ZWQgdG8gQ09NUDZfT1VUICovDQotI2VuZGlmICAgICAgICAgICAgICAgICAvKiBDT01QNiAqLw0KLSNpZiBkZWZpbmVkKENPTVA3KQ0KLSNkZWZpbmUgVElNX1RJTTE1X1RJMl9DT01QNyBcDQotICBUSU1fVElTRUxfVEkyU0VMXzIgLyohPCBUSU0xNSBpbnB1dCAyIGlzIGNvbm5lY3RlZCB0byBDT01QN19PVVQgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAvKiBDT01QNyAqLw0KLQ0KLSNkZWZpbmUgVElNX1RJTTE2X1RJMV9HUElPIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgVElNMTYgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gR1BJTyAqLw0KLSNpZiBkZWZpbmVkKENPTVA2KQ0KLSNkZWZpbmUgVElNX1RJTTE2X1RJMV9DT01QNiBcDQotICBUSU1fVElTRUxfVEkxU0VMXzAgLyohPCBUSU0xNiBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QNl9PVVQgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAvKiBDT01QNiAqLw0KLSNkZWZpbmUgVElNX1RJTTE2X1RJMV9NQ08gXA0KLSAgVElNX1RJU0VMX1RJMVNFTF8xIC8qITwgVElNMTYgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gTUNPICovDQotI2RlZmluZSBUSU1fVElNMTZfVEkxX0hTRV8zMiBcDQotICAoVElNX1RJU0VMX1RJMVNFTF8xIHwgICAgICBcDQotICAgVElNX1RJU0VMX1RJMVNFTF8wKSAvKiE8IFRJTTE2IGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIEhTRS8zMiAqLw0KLSNkZWZpbmUgVElNX1RJTTE2X1RJMV9SVENfV0sgXA0KLSAgVElNX1RJU0VMX1RJMVNFTF8yIC8qITwgVElNMTYgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gUlRDX1dBS0VVUCAqLw0KLSNkZWZpbmUgVElNX1RJTTE2X1RJMV9MU0UgXA0KLSAgKFRJTV9USVNFTF9USTFTRUxfMiB8ICAgXA0KLSAgIFRJTV9USVNFTF9USTFTRUxfMCkgLyohPCBUSU0xNiBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBMU0UgKi8NCi0jZGVmaW5lIFRJTV9USU0xNl9USTFfTFNJIFwNCi0gIChUSU1fVElTRUxfVEkxU0VMXzIgfCAgIFwNCi0gICBUSU1fVElTRUxfVEkxU0VMXzEpIC8qITwgVElNMTYgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gTFNJICovDQotDQotI2RlZmluZSBUSU1fVElNMTdfVEkxX0dQSU8gXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBUSU0xNyBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBHUElPICovDQotI2lmIGRlZmluZWQoQ09NUDUpDQotI2RlZmluZSBUSU1fVElNMTdfVEkxX0NPTVA1IFwNCi0gIFRJTV9USVNFTF9USTFTRUxfMCAvKiE8IFRJTTE3IGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVA1X09VVCAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgIC8qIENPTVA1ICovDQotI2RlZmluZSBUSU1fVElNMTdfVEkxX01DTyBcDQotICBUSU1fVElTRUxfVEkxU0VMXzEgLyohPCBUSU0xNyBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBNQ08gKi8NCi0jZGVmaW5lIFRJTV9USU0xN19USTFfSFNFXzMyIFwNCi0gIChUSU1fVElTRUxfVEkxU0VMXzEgfCAgICAgIFwNCi0gICBUSU1fVElTRUxfVEkxU0VMXzApIC8qITwgVElNMTcgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gSFNFLzMyICovDQotI2RlZmluZSBUSU1fVElNMTdfVEkxX1JUQ19XSyBcDQotICBUSU1fVElTRUxfVEkxU0VMXzIgLyohPCBUSU0xNyBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBSVENfV0FLRVVQICovDQotI2RlZmluZSBUSU1fVElNMTdfVEkxX0xTRSBcDQotICAoVElNX1RJU0VMX1RJMVNFTF8yIHwgICBcDQotICAgVElNX1RJU0VMX1RJMVNFTF8wKSAvKiE8IFRJTTE3IGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIExTRSAqLw0KLSNkZWZpbmUgVElNX1RJTTE3X1RJMV9MU0kgXA0KLSAgKFRJTV9USVNFTF9USTFTRUxfMiB8ICAgXA0KLSAgIFRJTV9USVNFTF9USTFTRUxfMSkgLyohPCBUSU0xNyBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBMU0kgKi8NCi0NCi0jaWYgZGVmaW5lZChUSU0yMCkNCi0jZGVmaW5lIFRJTV9USU0yMF9USTFfR1BJTyBcDQotICAweDAwMDAwMDAwVSAvKiE8IFRJTTIwIGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIEdQSU8gKi8NCi0jZGVmaW5lIFRJTV9USU0yMF9USTFfQ09NUDEgXA0KLSAgVElNX1RJU0VMX1RJMVNFTF8wIC8qITwgVElNMjAgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDFfT1VUICovDQotI2RlZmluZSBUSU1fVElNMjBfVEkxX0NPTVAyIFwNCi0gIFRJTV9USVNFTF9USTFTRUxfMSAvKiE8IFRJTTIwIGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVAyX09VVCAqLw0KLSNkZWZpbmUgVElNX1RJTTIwX1RJMV9DT01QMyBcDQotICAoVElNX1RJU0VMX1RJMVNFTF8xIHwgICAgIFwNCi0gICBUSU1fVElTRUxfVEkxU0VMXzApIC8qITwgVElNMjAgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDNfT1VUICovDQotI2RlZmluZSBUSU1fVElNMjBfVEkxX0NPTVA0IFwNCi0gIFRJTV9USVNFTF9USTFTRUxfMiAvKiE8IFRJTTIwIGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVA0X09VVCAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgIC8qIFRJTTIwICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTUV4X1NNU19QcmVsb2FkX0VuYWJsZSBUSU0gRXh0ZW5kZWQgQml0ZmllbGQgU01TIHByZWxvYWQNCi0gKiBlbmFibGluZw0KLSAqIEB7DQotICovDQotI2RlZmluZSBUSU1fU01TX1BSRUxPQURfU09VUkNFX1VQREFURSBcDQotICAweDAwMDAwMDAwVSAvKiE8IFByZWxhb2Qgb2YgU01TIGJpdGZpZWxkIGlzIGRpc2FibGVkICovDQotI2RlZmluZSBUSU1fU01TX1BSRUxPQURfU09VUkNFX0lOREVYIFwNCi0gIFRJTV9TTUNSX1NNU1BTIC8qITwgUHJlbG9hZCBvZiBTTVMgYml0ZmllbGQgaXMgZW5hYmxlZCAgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNRXhfRW5jb2Rlcl9JbmRleF9Qb3NpdGlvbiBUSU0gRXh0ZW5kZWQgRW5jb2RlciBpbmRleCBwb3NpdGlvbg0KLSAqIEB7DQotICovDQotI2RlZmluZSBUSU1fRU5DT0RFUklOREVYX1BPU0lUSU9OXzAwIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgRW5jb2RlciBpbmRleCBwb3NpdGlvbiBpcyBBQj0wMCAqLw0KLSNkZWZpbmUgVElNX0VOQ09ERVJJTkRFWF9QT1NJVElPTl8wMSBcDQotICBUSU1fRUNSX0lQT1NfMCAvKiE8IEVuY29kZXIgaW5kZXggcG9zaXRpb24gaXMgQUI9MDEgKi8NCi0jZGVmaW5lIFRJTV9FTkNPREVSSU5ERVhfUE9TSVRJT05fMTAgXA0KLSAgVElNX0VDUl9JUE9TXzEgLyohPCBFbmNvZGVyIGluZGV4IHBvc2l0aW9uIGlzIEFCPTEwICovDQotI2RlZmluZSBUSU1fRU5DT0RFUklOREVYX1BPU0lUSU9OXzExIFwNCi0gIChUSU1fRUNSX0lQT1NfMSB8IFRJTV9FQ1JfSVBPU18wKSAvKiE8IEVuY29kZXIgaW5kZXggcG9zaXRpb24gaXMgQUI9MTEgKi8NCi0jZGVmaW5lIFRJTV9FTkNPREVSSU5ERVhfUE9TSVRJT05fMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAweDAwMDAwMDAwVSAvKiE8IEluIGRpcmVjdGlvbmFsIGNsb2NrIG1vZGUgb3IgY2xvY2sgcGx1cyBkaXJlY3Rpb24gbW9kZSwgXA0KLSAgICAgICAgICAgICAgICAgaW5kZXggcmVzZXRzIHRoZSBjb3VudGVyIHdoZW4gY2xvY2sgaXMgMCAqLw0KLSNkZWZpbmUgVElNX0VOQ09ERVJJTkRFWF9QT1NJVElPTl8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIFRJTV9FQ1JfSVBPU18wIC8qITwgSW4gZGlyZWN0aW9uYWwgY2xvY2sgbW9kZSBvciBjbG9jayBwbHVzIGRpcmVjdGlvbiBtb2RlLCBcDQotICAgICAgICAgICAgICAgICAgICBpbmRleCByZXNldHMgdGhlIGNvdW50ZXIgd2hlbiBjbG9jayBpcyAxICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTUV4X0VuY29kZXJfSW5kZXhfRGlyZWN0aW9uIFRJTSBFeHRlbmRlZCBFbmNvZGVyIGluZGV4IGRpcmVjdGlvbg0KLSAqIEB7DQotICovDQotI2RlZmluZSBUSU1fRU5DT0RFUklOREVYX0RJUkVDVElPTl9VUF9ET1dOIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgSW5kZXggcmVzZXRzIHRoZSBjb3VudGVyIHdoYXRldmVyIHRoZSBkaXJlY3Rpb24gICovDQotI2RlZmluZSBUSU1fRU5DT0RFUklOREVYX0RJUkVDVElPTl9VUCBcDQotICBUSU1fRUNSX0lESVJfMCAvKiE8IEluZGV4IHJlc2V0cyB0aGUgY291bnRlciB3aGVuIHVwLWNvdW50aW5nIG9ubHkgICAqLw0KLSNkZWZpbmUgVElNX0VOQ09ERVJJTkRFWF9ESVJFQ1RJT05fRE9XTiBcDQotICBUSU1fRUNSX0lESVJfMSAvKiE8IEluZGV4IHJlc2V0cyB0aGUgY291bnRlciB3aGVuIGRvd24tY291bnRpbmcgb25seSAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBUSU1FeF9FbmNvZGVyX0luZGV4X1BvbGFyaXR5IFRJTSBFeHRlbmRlZCBFbmNvZGVyIGluZGV4IHBvbGFyaXR5DQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFRJTV9FTkNPREVSSU5ERVhfUE9MQVJJVFlfSU5WRVJURUQgXA0KLSAgVElNX0VUUlBPTEFSSVRZX0lOVkVSVEVEIC8qITwgUG9sYXJpdHkgZm9yIEVUUnggcGluICovDQotI2RlZmluZSBUSU1fRU5DT0RFUklOREVYX1BPTEFSSVRZX05PTklOVkVSVEVEIFwNCi0gIFRJTV9FVFJQT0xBUklUWV9OT05JTlZFUlRFRCAvKiE8IFBvbGFyaXR5IGZvciBFVFJ4IHBpbiAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBUSU1FeF9FbmNvZGVyX0luZGV4X1ByZXNjYWxlciBUSU0gRXh0ZW5kZWQgRW5jb2RkZXIgaW5kZXgNCi0gKiBwcmVzY2FsZXINCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgVElNX0VOQ09ERVJJTkRFWF9QUkVTQ0FMRVJfRElWMSBcDQotICBUSU1fRVRSUFJFU0NBTEVSX0RJVjEgLyohPCBObyBwcmVzY2FsZXIgaXMgdXNlZCAqLw0KLSNkZWZpbmUgVElNX0VOQ09ERVJJTkRFWF9QUkVTQ0FMRVJfRElWMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBUSU1fRVRSUFJFU0NBTEVSX0RJVjIgLyohPCBQcmVzY2FsZXIgZm9yIEV4dGVybmFsIEVUUiBwaW46IENhcHR1cmUgcGVyZm9ybWVkIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBvbmNlIGV2ZXJ5IDIgZXZlbnRzLiAqLw0KLSNkZWZpbmUgVElNX0VOQ09ERVJJTkRFWF9QUkVTQ0FMRVJfRElWNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBUSU1fRVRSUFJFU0NBTEVSX0RJVjQgLyohPCBQcmVzY2FsZXIgZm9yIEV4dGVybmFsIEVUUiBwaW46IENhcHR1cmUgcGVyZm9ybWVkIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBvbmNlIGV2ZXJ5IDQgZXZlbnRzLiAqLw0KLSNkZWZpbmUgVElNX0VOQ09ERVJJTkRFWF9QUkVTQ0FMRVJfRElWOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBUSU1fRVRSUFJFU0NBTEVSX0RJVjggLyohPCBQcmVzY2FsZXIgZm9yIEV4dGVybmFsIEVUUiBwaW46IENhcHR1cmUgcGVyZm9ybWVkIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBvbmNlIGV2ZXJ5IDggZXZlbnRzLiAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0vKiBFbmQgb2YgZXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLQ0KLS8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBkZWZncm91cCBUSU1FeF9FeHBvcnRlZF9NYWNyb3MgVElNIEV4dGVuZGVkIEV4cG9ydGVkIE1hY3Jvcw0KLSAqIEB7DQotICovDQotDQotLyoqDQotICogQGJyaWVmICBIRUxQRVIgbWFjcm8gY2FsY3VsYXRpbmcgdGhlIHByZXNjYWxlciB2YWx1ZSB0byBhY2hpZXZlIHRoZSByZXF1aXJlZA0KLSAqIGNvdW50ZXIgY2xvY2sgZnJlcXVlbmN5Lg0KLSAqIEBub3RlICAgZXg6IEByZWYgX19IQUxfVElNX0NBTENfUFNDKDgwMDAwMDAwLCAxMDAwMDAwKTsNCi0gKiBAcGFyYW0gIF9fVElNQ0xLX18gdGltZXIgaW5wdXQgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikNCi0gKiBAcGFyYW0gIF9fQ05UQ0xLX18gY291bnRlciBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQ0KLSAqIEByZXR2YWwgUHJlc2NhbGVyIHZhbHVlICAoYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUzNSkNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1RJTV9DQUxDX1BTQyhfX1RJTUNMS19fLCBfX0NOVENMS19fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKF9fVElNQ0xLX18pID49IChfX0NOVENMS19fKSkgPyAodWludDMyX3QpKChfX1RJTUNMS19fKSAvIChfX0NOVENMS19fKS0xVSkgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFUNCi0NCi0vKioNCi0gKiBAYnJpZWYgIEhFTFBFUiBtYWNybyBjYWxjdWxhdGluZyB0aGUgYXV0by1yZWxvYWQgdmFsdWUgdG8gYWNoaWV2ZSB0aGUNCi0gKiByZXF1aXJlZCBvdXRwdXQgc2lnbmFsIGZyZXF1ZW5jeS4NCi0gKiBAbm90ZSAgIGV4OiBAcmVmIF9fSEFMX1RJTV9DQUxDX1BFUklPRCgxMDAwMDAwLCAwLCAxMDAwMCk7DQotICogQHBhcmFtICBfX1RJTUNMS19fIHRpbWVyIGlucHV0IGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopDQotICogQHBhcmFtICBfX1BTQ19fIHByZXNjYWxlcg0KLSAqIEBwYXJhbSAgX19GUkVRX18gb3V0cHV0IHNpZ25hbCBmcmVxdWVuY3kgKGluIEh6KQ0KLSAqIEByZXR2YWwgIEF1dG8tcmVsb2FkIHZhbHVlICAoYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUzNSkNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1RJTV9DQUxDX1BFUklPRChfX1RJTUNMS19fLCBfX1BTQ19fLCBfX0ZSRVFfXykgIFwNCi0gICgoKF9fVElNQ0xLX18pIC8gKChfX1BTQ19fKSArIDFVKSkgPj0gKF9fRlJFUV9fKSkgICAgICAgICAgIFwNCi0gICAgICA/ICgoX19USU1DTEtfXykgLyAoKF9fRlJFUV9fKSAqICgoX19QU0NfXykgKyAxVSkpIC0gMVUpIFwNCi0gICAgICA6IDBVDQotDQotLyoqDQotICogQGJyaWVmICBIRUxQRVIgbWFjcm8gY2FsY3VsYXRpbmcgdGhlIGF1dG8tcmVsb2FkIHZhbHVlLCB3aXRoIGRpdGhlcmluZw0KLSAqIGZlYXR1cmUgZW5hYmxlZCwgdG8gYWNoaWV2ZSB0aGUgcmVxdWlyZWQgb3V0cHV0IHNpZ25hbCBmcmVxdWVuY3kuDQotICogQG5vdGUgICBleDogQHJlZiBfX0hBTF9USU1fQ0FMQ19QRVJJT0RfRElUSEVSKDEwMDAwMDAsIDAsIDEwMDAwKTsNCi0gKiBAbm90ZSAgIFRoaXMgbWFjcm8gc2hvdWxkIGJlIHVzZWQgb25seSBpZiBkaXRoZXJpbmcgaXMgYWxyZWFkeSBlbmFibGVkDQotICogQHBhcmFtICBfX1RJTUNMS19fIHRpbWVyIGlucHV0IGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopDQotICogQHBhcmFtICBfX1BTQ19fIHByZXNjYWxlcg0KLSAqIEBwYXJhbSAgX19GUkVRX18gb3V0cHV0IHNpZ25hbCBmcmVxdWVuY3kgKGluIEh6KQ0KLSAqIEByZXR2YWwgIEF1dG8tcmVsb2FkIHZhbHVlICAoYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUxOSkNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1RJTV9DQUxDX1BFUklPRF9ESVRIRVIoX19USU1DTEtfXywgX19QU0NfXywgX19GUkVRX18pIFwNCi0gICgoKF9fVElNQ0xLX18pIC8gKChfX1BTQ19fKSArIDFVKSkgPj0gKF9fRlJFUV9fKSkgICAgICAgICAgICAgICAgIFwNCi0gICAgICA/ICh1aW50MzJfdCkoKCh1aW50NjRfdCkoX19USU1DTEtfXykgKiAxNiAvICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAoKF9fRlJFUV9fKSAqICgoX19QU0NfXykgKyAxVSkpIC0gICAgICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgIDE2VSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICA6IDBVDQotDQotLyoqDQotICogQGJyaWVmICBIRUxQRVIgbWFjcm8gY2FsY3VsYXRpbmcgdGhlIGNvbXBhcmUgdmFsdWUgcmVxdWlyZWQgdG8gYWNoaWV2ZSB0aGUNCi0gKiByZXF1aXJlZCB0aW1lciBvdXRwdXQgY29tcGFyZSBhY3RpdmUvaW5hY3RpdmUgZGVsYXkuDQotICogQG5vdGUgICBleDogQHJlZiBfX0hBTF9USU1fQ0FMQ19QVUxTRSgxMDAwMDAwLCAwLCAxMCk7DQotICogQHBhcmFtICBfX1RJTUNMS19fIHRpbWVyIGlucHV0IGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopDQotICogQHBhcmFtICBfX1BTQ19fIHByZXNjYWxlcg0KLSAqIEBwYXJhbSAgX19ERUxBWV9fIHRpbWVyIG91dHB1dCBjb21wYXJlIGFjdGl2ZS9pbmFjdGl2ZSBkZWxheSAoaW4gdXMpDQotICogQHJldHZhbCBDb21wYXJlIHZhbHVlICAoYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUzNSkNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1RJTV9DQUxDX1BVTFNFKF9fVElNQ0xLX18sIF9fUFNDX18sIF9fREVMQVlfXykgICAgIFwNCi0gICgodWludDMyX3QpKCgodWludDY0X3QpKF9fVElNQ0xLX18pICogKHVpbnQ2NF90KShfX0RFTEFZX18pKSAvIFwNCi0gICAgICAgICAgICAgICgodWludDY0X3QpMTAwMDAwMFUgKiAodWludDY0X3QpKChfX1BTQ19fKSArIDFVKSkpKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSEVMUEVSIG1hY3JvIGNhbGN1bGF0aW5nIHRoZSBjb21wYXJlIHZhbHVlLCB3aXRoIGRpdGhlcmluZyBmZWF0dXJlDQotICogZW5hYmxlZCwgdG8gYWNoaWV2ZSB0aGUgcmVxdWlyZWQgdGltZXIgb3V0cHV0IGNvbXBhcmUgYWN0aXZlL2luYWN0aXZlIGRlbGF5Lg0KLSAqIEBub3RlICAgZXg6IEByZWYgX19IQUxfVElNX0NBTENfUFVMU0VfRElUSEVSKDEwMDAwMDAsIDAsIDEwKTsNCi0gKiBAbm90ZSAgIFRoaXMgbWFjcm8gc2hvdWxkIGJlIHVzZWQgb25seSBpZiBkaXRoZXJpbmcgaXMgYWxyZWFkeSBlbmFibGVkDQotICogQHBhcmFtICBfX1RJTUNMS19fIHRpbWVyIGlucHV0IGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopDQotICogQHBhcmFtICBfX1BTQ19fIHByZXNjYWxlcg0KLSAqIEBwYXJhbSAgX19ERUxBWV9fIHRpbWVyIG91dHB1dCBjb21wYXJlIGFjdGl2ZS9pbmFjdGl2ZSBkZWxheSAoaW4gdXMpDQotICogQHJldHZhbCBDb21wYXJlIHZhbHVlICAoYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUxOSkNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1RJTV9DQUxDX1BVTFNFX0RJVEhFUihfX1RJTUNMS19fLCBfX1BTQ19fLCBfX0RFTEFZX18pICAgIFwNCi0gICgodWludDMyX3QpKCgodWludDY0X3QpKF9fVElNQ0xLX18pICogKHVpbnQ2NF90KShfX0RFTEFZX18pICogMTZVKSAvIFwNCi0gICAgICAgICAgICAgICgodWludDY0X3QpMTAwMDAwMFUgKiAodWludDY0X3QpKChfX1BTQ19fKSArIDFVKSkpKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSEVMUEVSIG1hY3JvIGNhbGN1bGF0aW5nIHRoZSBhdXRvLXJlbG9hZCB2YWx1ZSB0byBhY2hpZXZlIHRoZQ0KLSAqIHJlcXVpcmVkIHB1bHNlIGR1cmF0aW9uICh3aGVuIHRoZSB0aW1lciBvcGVyYXRlcyBpbiBvbmUgcHVsc2UgbW9kZSkuDQotICogQG5vdGUgICBleDogQHJlZiBfX0hBTF9USU1fQ0FMQ19QRVJJT0RfQllfREVMQVkoMTAwMDAwMCwgMCwgMTAsIDIwKTsNCi0gKiBAcGFyYW0gIF9fVElNQ0xLX18gdGltZXIgaW5wdXQgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikNCi0gKiBAcGFyYW0gIF9fUFNDX18gcHJlc2NhbGVyDQotICogQHBhcmFtICBfX0RFTEFZX18gdGltZXIgb3V0cHV0IGNvbXBhcmUgYWN0aXZlL2luYWN0aXZlIGRlbGF5IChpbiB1cykNCi0gKiBAcGFyYW0gIF9fUFVMU0VfXyBwdWxzZSBkdXJhdGlvbiAoaW4gdXMpDQotICogQHJldHZhbCBBdXRvLXJlbG9hZCB2YWx1ZSAgKGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9NjU1MzUpDQotICovDQotI2RlZmluZSBfX0hBTF9USU1fQ0FMQ19QRVJJT0RfQllfREVMQVkoX19USU1DTEtfXywgX19QU0NfXywgX19ERUxBWV9fLCAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fUFVMU0VfXykgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgodWludDMyX3QpKF9fSEFMX1RJTV9DQUxDX1BVTFNFKChfX1RJTUNMS19fKSwgKF9fUFNDX18pLCAoX19QVUxTRV9fKSkgKyBcDQotICAgICAgICAgICAgICBfX0hBTF9USU1fQ0FMQ19QVUxTRSgoX19USU1DTEtfXyksIChfX1BTQ19fKSwgKF9fREVMQVlfXykpKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgIEhFTFBFUiBtYWNybyBjYWxjdWxhdGluZyB0aGUgYXV0by1yZWxvYWQgdmFsdWUsIHdpdGggZGl0aGVyaW5nDQotICogZmVhdHVyZSBlbmFibGVkLCB0byBhY2hpZXZlIHRoZSByZXF1aXJlZCBwdWxzZSBkdXJhdGlvbiAod2hlbiB0aGUgdGltZXINCi0gKiBvcGVyYXRlcyBpbiBvbmUgcHVsc2UgbW9kZSkuDQotICogQG5vdGUgICBleDogQHJlZiBfX0hBTF9USU1fQ0FMQ19QRVJJT0RfRElUSEVSX0JZX0RFTEFZKDEwMDAwMDAsIDAsIDEwLCAyMCk7DQotICogQG5vdGUgICBUaGlzIG1hY3JvIHNob3VsZCBiZSB1c2VkIG9ubHkgaWYgZGl0aGVyaW5nIGlzIGFscmVhZHkgZW5hYmxlZA0KLSAqIEBwYXJhbSAgX19USU1DTEtfXyB0aW1lciBpbnB1dCBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQ0KLSAqIEBwYXJhbSAgX19QU0NfXyBwcmVzY2FsZXINCi0gKiBAcGFyYW0gIF9fREVMQVlfXyB0aW1lciBvdXRwdXQgY29tcGFyZSBhY3RpdmUvaW5hY3RpdmUgZGVsYXkgKGluIHVzKQ0KLSAqIEBwYXJhbSAgX19QVUxTRV9fIHB1bHNlIGR1cmF0aW9uIChpbiB1cykNCi0gKiBAcmV0dmFsIEF1dG8tcmVsb2FkIHZhbHVlICAoYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUxOSkNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1RJTV9DQUxDX1BFUklPRF9ESVRIRVJfQllfREVMQVkoX19USU1DTEtfXywgX19QU0NfXywgX19ERUxBWV9fLCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fUFVMU0VfXykgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKCh1aW50MzJfdCkoX19IQUxfVElNX0NBTENfUFVMU0VfRElUSEVSKChfX1RJTUNMS19fKSwgKF9fUFNDX18pLCAgICAgICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19QVUxTRV9fKSkgKyAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICAgICAgICBfX0hBTF9USU1fQ0FMQ19QVUxTRV9ESVRIRVIoKF9fVElNQ0xLX18pLCAoX19QU0NfXyksICAgICAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0RFTEFZX18pKSkpDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0vKiBFbmQgb2YgZXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLQ0KLS8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBkZWZncm91cCBUSU1FeF9Qcml2YXRlX01hY3JvcyBUSU0gRXh0ZW5kZWQgUHJpdmF0ZSBNYWNyb3MNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgSVNfVElNX1JFTUFQKF9fUkVNQVBfXykgKCgoKF9fUkVNQVBfXykgJiAweEZGRkMzRkZGVSkgPT0gMHgwMDAwMDAwMFUpKQ0KLQ0KLSNkZWZpbmUgSVNfVElNX0JSRUFLSU5QVVQoX19CUkVBS0lOUFVUX18pICAgICAgXA0KLSAgKCgoX19CUkVBS0lOUFVUX18pID09IFRJTV9CUkVBS0lOUFVUX0JSSykgfHwgXA0KLSAgICgoX19CUkVBS0lOUFVUX18pID09IFRJTV9CUkVBS0lOUFVUX0JSSzIpKQ0KLQ0KLSNpZiBkZWZpbmVkKENPTVA1KSAmJiBkZWZpbmVkKENPTVA2KSAmJiBkZWZpbmVkKENPTVA3KQ0KLSNkZWZpbmUgSVNfVElNX0JSRUFLSU5QVVRTT1VSQ0UoX19TT1VSQ0VfXykgICAgICAgIFwNCi0gICgoKF9fU09VUkNFX18pID09IFRJTV9CUkVBS0lOUFVUU09VUkNFX0JLSU4pIHx8ICBcDQotICAgKChfX1NPVVJDRV9fKSA9PSBUSU1fQlJFQUtJTlBVVFNPVVJDRV9DT01QMSkgfHwgXA0KLSAgICgoX19TT1VSQ0VfXykgPT0gVElNX0JSRUFLSU5QVVRTT1VSQ0VfQ09NUDIpIHx8IFwNCi0gICAoKF9fU09VUkNFX18pID09IFRJTV9CUkVBS0lOUFVUU09VUkNFX0NPTVAzKSB8fCBcDQotICAgKChfX1NPVVJDRV9fKSA9PSBUSU1fQlJFQUtJTlBVVFNPVVJDRV9DT01QNCkgfHwgXA0KLSAgICgoX19TT1VSQ0VfXykgPT0gVElNX0JSRUFLSU5QVVRTT1VSQ0VfQ09NUDUpIHx8IFwNCi0gICAoKF9fU09VUkNFX18pID09IFRJTV9CUkVBS0lOUFVUU09VUkNFX0NPTVA2KSB8fCBcDQotICAgKChfX1NPVVJDRV9fKSA9PSBUSU1fQlJFQUtJTlBVVFNPVVJDRV9DT01QNykpDQotDQotI2Vsc2UNCi0jZGVmaW5lIElTX1RJTV9CUkVBS0lOUFVUU09VUkNFKF9fU09VUkNFX18pICAgICAgICBcDQotICAoKChfX1NPVVJDRV9fKSA9PSBUSU1fQlJFQUtJTlBVVFNPVVJDRV9CS0lOKSB8fCAgXA0KLSAgICgoX19TT1VSQ0VfXykgPT0gVElNX0JSRUFLSU5QVVRTT1VSQ0VfQ09NUDEpIHx8IFwNCi0gICAoKF9fU09VUkNFX18pID09IFRJTV9CUkVBS0lOUFVUU09VUkNFX0NPTVAyKSB8fCBcDQotICAgKChfX1NPVVJDRV9fKSA9PSBUSU1fQlJFQUtJTlBVVFNPVVJDRV9DT01QMykgfHwgXA0KLSAgICgoX19TT1VSQ0VfXykgPT0gVElNX0JSRUFLSU5QVVRTT1VSQ0VfQ09NUDQpKQ0KLQ0KLSNlbmRpZiAvKiBDT01QNSAmJiBDT01QNiAmJiBDT01QNyAqLw0KLSNkZWZpbmUgSVNfVElNX0JSRUFLSU5QVVRTT1VSQ0VfU1RBVEUoX19TVEFURV9fKSAgICBcDQotICAoKChfX1NUQVRFX18pID09IFRJTV9CUkVBS0lOUFVUU09VUkNFX0RJU0FCTEUpIHx8IFwNCi0gICAoKF9fU1RBVEVfXykgPT0gVElNX0JSRUFLSU5QVVRTT1VSQ0VfRU5BQkxFKSkNCi0NCi0jZGVmaW5lIElTX1RJTV9CUkVBS0lOUFVUU09VUkNFX1BPTEFSSVRZKF9fUE9MQVJJVFlfXykgICAgICBcDQotICAoKChfX1BPTEFSSVRZX18pID09IFRJTV9CUkVBS0lOUFVUU09VUkNFX1BPTEFSSVRZX0xPVykgfHwgXA0KLSAgICgoX19QT0xBUklUWV9fKSA9PSBUSU1fQlJFQUtJTlBVVFNPVVJDRV9QT0xBUklUWV9ISUdIKSkNCi0NCi0jZGVmaW5lIElTX1RJTV9USVNFTChfX1RJU0VMX18pICgoKChfX1RJU0VMX18pICYgMHhGMEYwRjBGMFUpID09IDB4MDAwMDAwMDBVKSkNCi0NCi0jZGVmaW5lIElTX1RJTV9USVNFTF9USVhfSU5TVEFOQ0UoSU5TVEFOQ0UsIENIQU5ORUwpIFwNCi0gIChJU19USU1fQ0NYX0lOU1RBTkNFKElOU1RBTkNFLCBDSEFOTkVMKSAmJiAoKENIQU5ORUwpIDwgVElNX0NIQU5ORUxfNSkpDQotDQotI2lmIGRlZmluZWQoVElNNSkgJiYgZGVmaW5lZChUSU0yMCkNCi0jZGVmaW5lIElTX1RJTV9DTE9DS1NPVVJDRV9JTlNUQU5DRShJTlNUQU5DRSwgX19DTE9DS19fKSAgICAgICAgICAgICAgICAgICBcDQotICAoKCgoSU5TVEFOQ0UpID09IFRJTTEpICYmICgoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lOVEVSTkFMKSB8fCAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMikgfHwgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMSkgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjIpIHx8ICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIzKSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkxRUQpIHx8ICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMSkgfHwgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTIpIHx8ICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTEpIHx8ICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjQpIHx8ICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI1KSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNikgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjcpIHx8ICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI4KSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSOSkgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjEwKSkpIHx8ICAgXA0KLSAgICgoKElOU1RBTkNFKSA9PSBUSU0yKSAmJiAoKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JTlRFUk5BTCkgfHwgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTIpIHx8ICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjApIHx8ICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIyKSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMykgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMUVEKSB8fCAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTEpIHx8ICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkyKSB8fCAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0VUUk1PREUxKSB8fCAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI0KSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNSkgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjYpIHx8ICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI3KSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSOCkgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjkpIHx8ICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIxMCkgfHwgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMTEpKSkgfHwgICBcDQotICAgKCgoSU5TVEFOQ0UpID09IFRJTTMpICYmICgoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lOVEVSTkFMKSB8fCAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMikgfHwgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMCkgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjEpIHx8ICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIzKSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkxRUQpIHx8ICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMSkgfHwgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTIpIHx8ICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTEpIHx8ICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjQpIHx8ICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI1KSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNikgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjcpIHx8ICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI4KSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSOSkgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjEwKSkpIHx8ICAgXA0KLSAgICgoKElOU1RBTkNFKSA9PSBUSU00KSAmJiAoKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JTlRFUk5BTCkgfHwgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTIpIHx8ICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjApIHx8ICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIxKSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMikgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjQpIHx8ICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTFFRCkgfHwgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkxKSB8fCAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMikgfHwgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMSkgfHwgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNSkgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjYpIHx8ICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI3KSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSOCkgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjkpIHx8ICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIxMCkpKSB8fCAgIFwNCi0gICAoKChJTlNUQU5DRSkgPT0gVElNNSkgJiYgKCgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSU5URVJOQUwpIHx8ICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0VUUk1PREUyKSB8fCAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIwKSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMSkgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjIpIHx8ICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIzKSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkxRUQpIHx8ICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMSkgfHwgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTIpIHx8ICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTEpIHx8ICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjUpIHx8ICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI2KSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNykgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjgpIHx8ICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI5KSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMTApKSkgfHwgICBcDQotICAgKCgoSU5TVEFOQ0UpID09IFRJTTgpICYmICgoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lOVEVSTkFMKSB8fCAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMikgfHwgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMCkgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjEpIHx8ICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIyKSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMykgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMUVEKSB8fCAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTEpIHx8ICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkyKSB8fCAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0VUUk1PREUxKSB8fCAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI0KSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNikgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjcpIHx8ICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI4KSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSOSkgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjEwKSkpIHx8ICAgXA0KLSAgICgoKElOU1RBTkNFKSA9PSBUSU0xNSkgJiYgKCgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSU5URVJOQUwpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjApIHx8ICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIxKSB8fCAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMikgfHwgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjMpIHx8ICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTFFRCkgfHwgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkxKSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMikgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI0KSB8fCAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNSkgfHwgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjcpIHx8ICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI4KSB8fCAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSOSkgfHwgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjEwKSkpIHx8ICBcDQotICAgKCgoSU5TVEFOQ0UpID09IFRJTTIwKSAmJiAoKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JTlRFUk5BTCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTIpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjApIHx8ICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIxKSB8fCAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMikgfHwgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjMpIHx8ICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTFFRCkgfHwgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkxKSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMikgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNCkgfHwgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjUpIHx8ICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI2KSB8fCAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNykgfHwgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjgpIHx8ICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIxMCkpKSkNCi0NCi0jZGVmaW5lIElTX1RJTV9UUklHR0VSX0lOU1RBTkNFKElOU1RBTkNFLCBfX1NFTEVDVElPTl9fKSAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKCgoKElOU1RBTkNFKSA9PSBUSU0xKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICgoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIyKSB8fCAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjMpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkxRl9FRCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTFGUDEpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMkZQMikgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfRVRSRikgfHwgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNCkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNSkgfHwgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI2KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI3KSB8fCAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjgpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjkpIHx8ICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMTApKSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKCgoSU5TVEFOQ0UpID09IFRJTTIpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgKCgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjApIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjIpIHx8ICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMykgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTFGX0VEKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMUZQMSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkyRlAyKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19FVFJGKSB8fCBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI0KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI1KSB8fCAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjYpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjcpIHx8ICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSOCkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSOSkgfHwgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxMCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjExKSkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoKElOU1RBTkNFKSA9PSBUSU0zKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICgoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIwKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxKSB8fCAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjMpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkxRl9FRCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTFGUDEpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMkZQMikgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfRVRSRikgfHwgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNCkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNSkgfHwgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI2KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI3KSB8fCAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjgpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjkpIHx8ICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMTApKSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKCgoSU5TVEFOQ0UpID09IFRJTTQpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgKCgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjApIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjEpIHx8ICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMikgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNCkgfHwgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTFGX0VEKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMUZQMSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkyRlAyKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19FVFJGKSB8fCBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI1KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI2KSB8fCAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjcpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjgpIHx8ICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSOSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxMCkpKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKChJTlNUQU5DRSkgPT0gVElNNSkgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAoKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMCkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMSkgfHwgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIyKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIzKSB8fCAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMUZfRUQpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkxRlAxKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTJGUDIpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0VUUkYpIHx8IFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjUpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjYpIHx8ICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNykgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSOCkgfHwgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI5KSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjEwKSkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoKElOU1RBTkNFKSA9PSBUSU04KSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICgoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIwKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxKSB8fCAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjIpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjMpIHx8ICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkxRl9FRCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTFGUDEpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMkZQMikgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfRVRSRikgfHwgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNCkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNikgfHwgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI3KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI4KSB8fCAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMTApKSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKCgoSU5TVEFOQ0UpID09IFRJTTE1KSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgKCgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjApIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjEpIHx8ICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMikgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMykgfHwgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTFGX0VEKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMUZQMSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkyRlAyKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI0KSB8fCBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI1KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI3KSB8fCAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjgpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjkpIHx8ICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMTApKSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKCgoSU5TVEFOQ0UpID09IFRJTTIwKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgKCgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjApIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjEpIHx8ICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMikgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMykgfHwgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTFGX0VEKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMUZQMSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkyRlAyKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19FVFJGKSB8fCBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI0KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI1KSB8fCAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjYpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjcpIHx8ICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSOCkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMTApKSkpDQotDQotI2RlZmluZSBJU19USU1fSU5URVJOQUxfVFJJR0dFUkVWRU5UX0lOU1RBTkNFKElOU1RBTkNFLCBfX1NFTEVDVElPTl9fKSAgICAgICAgXA0KLSAgKCgoKElOU1RBTkNFKSA9PSBUSU0xKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgKCgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjEpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjIpIHx8ICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIzKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI0KSB8fCAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNSkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNikgfHwgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjcpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjgpIHx8ICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI5KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxMCkgfHwgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfTk9ORSkpKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKChJTlNUQU5DRSkgPT0gVElNMikgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICgoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIwKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIyKSB8fCAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMykgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNCkgfHwgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjUpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjYpIHx8ICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI3KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI4KSB8fCAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSOSkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMTApIHx8IFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjExKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19OT05FKSkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoKElOU1RBTkNFKSA9PSBUSU0zKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgKCgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjApIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjEpIHx8ICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIzKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI0KSB8fCAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNSkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNikgfHwgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjcpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjgpIHx8ICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI5KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxMCkgfHwgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfTk9ORSkpKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKChJTlNUQU5DRSkgPT0gVElNNCkgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICgoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIwKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxKSB8fCAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMikgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNCkgfHwgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjUpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjYpIHx8ICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI3KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI4KSB8fCAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSOSkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMTApIHx8IFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX05PTkUpKSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKCgoSU5TVEFOQ0UpID09IFRJTTUpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAoKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMCkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMSkgfHwgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjIpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjMpIHx8ICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI1KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI2KSB8fCAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNykgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSOCkgfHwgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjkpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjEwKSB8fCBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19OT05FKSkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoKElOU1RBTkNFKSA9PSBUSU04KSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgKCgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjApIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjEpIHx8ICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIyKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIzKSB8fCAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNCkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNikgfHwgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjcpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjgpIHx8ICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI5KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxMCkgfHwgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfTk9ORSkpKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKChJTlNUQU5DRSkgPT0gVElNMTUpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICgoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIwKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxKSB8fCAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMikgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMykgfHwgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjQpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjUpIHx8ICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI3KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI4KSB8fCAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSOSkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMTApIHx8IFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX05PTkUpKSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKCgoSU5TVEFOQ0UpID09IFRJTTIwKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAoKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMCkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMSkgfHwgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjIpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjMpIHx8ICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI0KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI1KSB8fCAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNikgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNykgfHwgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjgpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjEwKSB8fCBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19OT05FKSkpKQ0KLQ0KLSNlbGlmIGRlZmluZWQoVElNNSkNCi0jZGVmaW5lIElTX1RJTV9DTE9DS1NPVVJDRV9JTlNUQU5DRShJTlNUQU5DRSwgX19DTE9DS19fKSAgICAgICAgICAgICAgICAgICBcDQotICAoKCgoSU5TVEFOQ0UpID09IFRJTTEpICYmICgoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lOVEVSTkFMKSB8fCAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMikgfHwgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMSkgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjIpIHx8ICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIzKSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkxRUQpIHx8ICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMSkgfHwgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTIpIHx8ICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTEpIHx8ICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjQpIHx8ICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI1KSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNikgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjcpIHx8ICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI4KSkpIHx8ICAgIFwNCi0gICAoKChJTlNUQU5DRSkgPT0gVElNMikgJiYgKCgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSU5URVJOQUwpIHx8ICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0VUUk1PREUyKSB8fCAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIwKSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMikgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjMpIHx8ICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTFFRCkgfHwgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkxKSB8fCAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMikgfHwgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMSkgfHwgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNCkgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjUpIHx8ICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI2KSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNykgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjgpIHx8ICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIxMSkpKSB8fCAgIFwNCi0gICAoKChJTlNUQU5DRSkgPT0gVElNMykgJiYgKCgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSU5URVJOQUwpIHx8ICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0VUUk1PREUyKSB8fCAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIwKSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMSkgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjMpIHx8ICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTFFRCkgfHwgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkxKSB8fCAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMikgfHwgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMSkgfHwgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNCkgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjUpIHx8ICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI2KSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNykgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjgpKSkgfHwgICAgXA0KLSAgICgoKElOU1RBTkNFKSA9PSBUSU00KSAmJiAoKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JTlRFUk5BTCkgfHwgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTIpIHx8ICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjApIHx8ICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIxKSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMikgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMUVEKSB8fCAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTEpIHx8ICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkyKSB8fCAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0VUUk1PREUxKSB8fCAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI0KSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNSkgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjYpIHx8ICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI3KSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSOCkpKSB8fCAgICBcDQotICAgKCgoSU5TVEFOQ0UpID09IFRJTTUpICYmICgoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lOVEVSTkFMKSB8fCAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMikgfHwgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMCkgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjEpIHx8ICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIyKSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMykgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMUVEKSB8fCAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTEpIHx8ICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkyKSB8fCAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0VUUk1PREUxKSB8fCAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI1KSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNikgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjcpIHx8ICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI4KSkpIHx8ICAgIFwNCi0gICAoKChJTlNUQU5DRSkgPT0gVElNOCkgJiYgKCgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSU5URVJOQUwpIHx8ICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0VUUk1PREUyKSB8fCAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIwKSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMSkgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjIpIHx8ICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIzKSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkxRUQpIHx8ICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMSkgfHwgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTIpIHx8ICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTEpIHx8ICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjQpIHx8ICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI2KSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNykgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjgpKSkgfHwgICAgXA0KLSAgICgoKElOU1RBTkNFKSA9PSBUSU0xNSkgJiYgKCgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSU5URVJOQUwpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjApIHx8ICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIxKSB8fCAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMikgfHwgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjMpIHx8ICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTFFRCkgfHwgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkxKSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMikgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI0KSB8fCAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNSkgfHwgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjcpIHx8ICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI4KSkpKQ0KLQ0KLSNkZWZpbmUgSVNfVElNX1RSSUdHRVJfSU5TVEFOQ0UoSU5TVEFOQ0UsIF9fU0VMRUNUSU9OX18pICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKCgoSU5TVEFOQ0UpID09IFRJTTEpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgKCgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjEpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjIpIHx8ICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMykgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTFGX0VEKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMUZQMSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkyRlAyKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19FVFJGKSB8fCBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI0KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI1KSB8fCAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjYpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjcpIHx8ICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSOCkpKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKCgoSU5TVEFOQ0UpID09IFRJTTIpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgKCgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjApIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjIpIHx8ICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMykgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTFGX0VEKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMUZQMSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkyRlAyKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19FVFJGKSB8fCBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI0KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI1KSB8fCAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjYpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjcpIHx8ICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSOCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxMSkpKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKChJTlNUQU5DRSkgPT0gVElNMykgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAoKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMCkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMSkgfHwgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIzKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMUZfRUQpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkxRlAxKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTJGUDIpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0VUUkYpIHx8IFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjQpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjUpIHx8ICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNikgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNykgfHwgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI4KSkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKChJTlNUQU5DRSkgPT0gVElNNCkgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAoKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMCkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMSkgfHwgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIyKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMUZfRUQpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkxRlAxKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTJGUDIpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0VUUkYpIHx8IFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjQpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjUpIHx8ICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNikgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNykgfHwgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI4KSkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKChJTlNUQU5DRSkgPT0gVElNNSkgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAoKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMCkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMSkgfHwgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIyKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIzKSB8fCAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMUZfRUQpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkxRlAxKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTJGUDIpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0VUUkYpIHx8IFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjUpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjYpIHx8ICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNykgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSOCkpKSB8fCBcDQotICAgKCgoSU5TVEFOQ0UpID09IFRJTTgpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgKCgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjApIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjEpIHx8ICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMikgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMykgfHwgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTFGX0VEKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMUZQMSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkyRlAyKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19FVFJGKSB8fCBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI0KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI2KSB8fCAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjcpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjgpKSkgfHwgXA0KLSAgICgoKElOU1RBTkNFKSA9PSBUSU0xNSkgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICgoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIwKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxKSB8fCAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjIpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjMpIHx8ICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkxRl9FRCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTFGUDEpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMkZQMikgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNCkgfHwgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNSkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNykgfHwgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI4KSkpKQ0KLQ0KLSNkZWZpbmUgSVNfVElNX0lOVEVSTkFMX1RSSUdHRVJFVkVOVF9JTlNUQU5DRShJTlNUQU5DRSwgX19TRUxFQ1RJT05fXykgICAgICAgXA0KLSAgKCgoKElOU1RBTkNFKSA9PSBUSU0xKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAoKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMSkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMikgfHwgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMykgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNCkgfHwgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNSkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNikgfHwgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNykgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSOCkgfHwgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfTk9ORSkpKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoKElOU1RBTkNFKSA9PSBUSU0yKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAoKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMCkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMikgfHwgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMykgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNCkgfHwgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNSkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNikgfHwgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNykgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSOCkgfHwgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMTEpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfTk9ORSkpKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoKElOU1RBTkNFKSA9PSBUSU0zKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAoKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMCkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMSkgfHwgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMykgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNCkgfHwgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNSkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNikgfHwgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNykgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSOCkgfHwgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfTk9ORSkpKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoKElOU1RBTkNFKSA9PSBUSU00KSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAoKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMCkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMSkgfHwgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMikgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNCkgfHwgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNSkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNikgfHwgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNykgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSOCkgfHwgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfTk9ORSkpKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoKElOU1RBTkNFKSA9PSBUSU01KSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAoKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMCkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMSkgfHwgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMikgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMykgfHwgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNSkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNikgfHwgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNykgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSOCkgfHwgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfTk9ORSkpKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoKElOU1RBTkNFKSA9PSBUSU04KSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAoKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMCkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMSkgfHwgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMikgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMykgfHwgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNCkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNikgfHwgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNykgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSOCkgfHwgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfTk9ORSkpKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoKElOU1RBTkNFKSA9PSBUSU0xNSkgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAoKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMCkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMSkgfHwgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMikgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMykgfHwgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNCkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNSkgfHwgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNykgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSOCkgfHwgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfTk9ORSkpKSkNCi0jZWxpZiBkZWZpbmVkKFRJTTIwKQ0KLSNkZWZpbmUgSVNfVElNX0NMT0NLU09VUkNFX0lOU1RBTkNFKElOU1RBTkNFLCBfX0NMT0NLX18pICAgICAgICAgICAgICAgICAgIFwNCi0gICgoKChJTlNUQU5DRSkgPT0gVElNMSkgJiYgKCgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSU5URVJOQUwpIHx8ICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0VUUk1PREUyKSB8fCAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIxKSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMikgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjMpIHx8ICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTFFRCkgfHwgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkxKSB8fCAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMikgfHwgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMSkgfHwgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNSkgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjYpIHx8ICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI3KSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSOCkgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjkpKSkgfHwgICAgXA0KLSAgICgoKElOU1RBTkNFKSA9PSBUSU0yKSAmJiAoKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JTlRFUk5BTCkgfHwgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTIpIHx8ICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjApIHx8ICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIyKSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMykgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMUVEKSB8fCAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTEpIHx8ICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkyKSB8fCAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0VUUk1PREUxKSB8fCAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI1KSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNikgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjcpIHx8ICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI4KSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSOSkgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjExKSkpIHx8ICAgXA0KLSAgICgoKElOU1RBTkNFKSA9PSBUSU0zKSAmJiAoKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JTlRFUk5BTCkgfHwgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTIpIHx8ICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjApIHx8ICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIxKSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMykgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMUVEKSB8fCAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTEpIHx8ICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkyKSB8fCAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0VUUk1PREUxKSB8fCAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI1KSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNikgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjcpIHx8ICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI4KSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSOSkpKSB8fCAgICBcDQotICAgKCgoSU5TVEFOQ0UpID09IFRJTTQpICYmICgoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lOVEVSTkFMKSB8fCAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMikgfHwgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMCkgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjEpIHx8ICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIyKSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkxRUQpIHx8ICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMSkgfHwgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTIpIHx8ICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTEpIHx8ICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjUpIHx8ICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI2KSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNykgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjgpIHx8ICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI5KSkpIHx8ICAgIFwNCi0gICAoKChJTlNUQU5DRSkgPT0gVElNOCkgJiYgKCgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSU5URVJOQUwpIHx8ICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0VUUk1PREUyKSB8fCAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIwKSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMSkgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjIpIHx8ICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIzKSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkxRUQpIHx8ICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMSkgfHwgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTIpIHx8ICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTEpIHx8ICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjYpIHx8ICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI3KSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSOCkgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjkpKSkgfHwgICAgXA0KLSAgICgoKElOU1RBTkNFKSA9PSBUSU0xNSkgJiYgKCgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSU5URVJOQUwpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjApIHx8ICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIxKSB8fCAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMikgfHwgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjMpIHx8ICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTFFRCkgfHwgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkxKSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMikgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI1KSB8fCAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNykgfHwgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjgpIHx8ICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI5KSkpIHx8ICAgXA0KLSAgICgoKElOU1RBTkNFKSA9PSBUSU0yMCkgJiYgKCgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSU5URVJOQUwpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0VUUk1PREUyKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIwKSB8fCAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMSkgfHwgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjIpIHx8ICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIzKSB8fCAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkxRUQpIHx8ICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMSkgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTIpIHx8ICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTEpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjUpIHx8ICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI2KSB8fCAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNykgfHwgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjgpKSkpDQotDQotI2RlZmluZSBJU19USU1fVFJJR0dFUl9JTlNUQU5DRShJTlNUQU5DRSwgX19TRUxFQ1RJT05fXykgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoKChJTlNUQU5DRSkgPT0gVElNMSkgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAoKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMSkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMikgfHwgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIzKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMUZfRUQpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkxRlAxKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTJGUDIpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0VUUkYpIHx8IFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjUpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjYpIHx8ICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNykgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSOCkgfHwgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI5KSkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKChJTlNUQU5DRSkgPT0gVElNMikgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAoKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMCkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMikgfHwgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIzKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMUZfRUQpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkxRlAxKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTJGUDIpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0VUUkYpIHx8IFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjUpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjYpIHx8ICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNykgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSOCkgfHwgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI5KSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjExKSkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoKElOU1RBTkNFKSA9PSBUSU0zKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICgoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIwKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxKSB8fCAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjMpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkxRl9FRCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTFGUDEpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMkZQMikgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfRVRSRikgfHwgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNSkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNikgfHwgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI3KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI4KSB8fCAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjkpKSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoKElOU1RBTkNFKSA9PSBUSU00KSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICgoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIwKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxKSB8fCAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjIpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkxRl9FRCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTFGUDEpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMkZQMikgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfRVRSRikgfHwgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNSkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNikgfHwgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI3KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI4KSB8fCAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjkpKSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoKElOU1RBTkNFKSA9PSBUSU04KSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICgoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIwKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxKSB8fCAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjIpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjMpIHx8ICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkxRl9FRCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTFGUDEpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMkZQMikgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfRVRSRikgfHwgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNikgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNykgfHwgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI4KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI5KSkpIHx8IFwNCi0gICAoKChJTlNUQU5DRSkgPT0gVElNMTUpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAoKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMCkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMSkgfHwgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIyKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIzKSB8fCAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMUZfRUQpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkxRlAxKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTJGUDIpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjUpIHx8IFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjcpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjgpIHx8ICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSOSkpKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKCgoSU5TVEFOQ0UpID09IFRJTTIwKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgKCgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjApIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjEpIHx8ICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMikgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMykgfHwgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTFGX0VEKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMUZQMSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkyRlAyKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19FVFJGKSB8fCBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI1KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI2KSB8fCAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjcpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjgpKSkpDQotDQotI2RlZmluZSBJU19USU1fSU5URVJOQUxfVFJJR0dFUkVWRU5UX0lOU1RBTkNFKElOU1RBTkNFLCBfX1NFTEVDVElPTl9fKSAgICAgICBcDQotICAoKCgoSU5TVEFOQ0UpID09IFRJTTEpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICgoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIyKSB8fCBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIzKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI1KSB8fCBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI2KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI3KSB8fCBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI4KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI5KSB8fCBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19OT05FKSkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKCgoSU5TVEFOQ0UpID09IFRJTTIpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICgoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIwKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIyKSB8fCBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIzKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI1KSB8fCBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI2KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI3KSB8fCBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI4KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI5KSB8fCBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxMSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19OT05FKSkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKCgoSU5TVEFOQ0UpID09IFRJTTMpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICgoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIwKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxKSB8fCBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIzKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI1KSB8fCBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI2KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI3KSB8fCBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI4KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI5KSB8fCBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19OT05FKSkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKCgoSU5TVEFOQ0UpID09IFRJTTQpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICgoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIwKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxKSB8fCBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIyKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI1KSB8fCBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI2KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI3KSB8fCBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI4KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI5KSB8fCBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19OT05FKSkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKCgoSU5TVEFOQ0UpID09IFRJTTgpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICgoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIwKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxKSB8fCBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIyKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIzKSB8fCBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI2KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI3KSB8fCBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI4KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI5KSB8fCBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19OT05FKSkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKCgoSU5TVEFOQ0UpID09IFRJTTE1KSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICgoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIwKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxKSB8fCBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIyKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIzKSB8fCBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI1KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI3KSB8fCBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI4KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI5KSB8fCBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19OT05FKSkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKCgoSU5TVEFOQ0UpID09IFRJTTIwKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICgoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIwKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxKSB8fCBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIyKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIzKSB8fCBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI1KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI2KSB8fCBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI3KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI4KSB8fCBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19OT05FKSkpKQ0KLSNlbHNlDQotI2RlZmluZSBJU19USU1fQ0xPQ0tTT1VSQ0VfSU5TVEFOQ0UoSU5TVEFOQ0UsIF9fQ0xPQ0tfXykgICAgICAgICAgICAgICAgICAgXA0KLSAgKCgoKElOU1RBTkNFKSA9PSBUSU0xKSAmJiAoKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JTlRFUk5BTCkgfHwgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTIpIHx8ICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjEpIHx8ICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIyKSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMykgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMUVEKSB8fCAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTEpIHx8ICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkyKSB8fCAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0VUUk1PREUxKSB8fCAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI1KSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNikgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjcpIHx8ICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI4KSkpIHx8ICAgIFwNCi0gICAoKChJTlNUQU5DRSkgPT0gVElNMikgJiYgKCgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSU5URVJOQUwpIHx8ICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0VUUk1PREUyKSB8fCAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIwKSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMikgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjMpIHx8ICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTFFRCkgfHwgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkxKSB8fCAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMikgfHwgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMSkgfHwgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNSkgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjYpIHx8ICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI3KSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSOCkgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjExKSkpIHx8ICAgXA0KLSAgICgoKElOU1RBTkNFKSA9PSBUSU0zKSAmJiAoKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JTlRFUk5BTCkgfHwgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTIpIHx8ICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjApIHx8ICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIxKSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMykgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMUVEKSB8fCAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTEpIHx8ICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkyKSB8fCAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0VUUk1PREUxKSB8fCAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI1KSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNikgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjcpIHx8ICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI4KSkpIHx8ICAgIFwNCi0gICAoKChJTlNUQU5DRSkgPT0gVElNNCkgJiYgKCgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSU5URVJOQUwpIHx8ICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0VUUk1PREUyKSB8fCAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIwKSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMSkgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjIpIHx8ICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTFFRCkgfHwgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkxKSB8fCAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMikgfHwgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMSkgfHwgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNSkgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjYpIHx8ICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI3KSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSOCkpKSB8fCAgICBcDQotICAgKCgoSU5TVEFOQ0UpID09IFRJTTgpICYmICgoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lOVEVSTkFMKSB8fCAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMikgfHwgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMCkgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjEpIHx8ICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIyKSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMykgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMUVEKSB8fCAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTEpIHx8ICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkyKSB8fCAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0VUUk1PREUxKSB8fCAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI2KSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNykgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjgpKSkgfHwgICAgXA0KLSAgICgoKElOU1RBTkNFKSA9PSBUSU0xNSkgJiYgKCgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSU5URVJOQUwpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjApIHx8ICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIxKSB8fCAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMikgfHwgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjMpIHx8ICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTFFRCkgfHwgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkxKSB8fCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMikgfHwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI1KSB8fCAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNykgfHwgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjgpKSkpDQotDQotI2RlZmluZSBJU19USU1fVFJJR0dFUl9JTlNUQU5DRShJTlNUQU5DRSwgX19TRUxFQ1RJT05fXykgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoKChJTlNUQU5DRSkgPT0gVElNMSkgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAoKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMSkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMikgfHwgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIzKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMUZfRUQpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkxRlAxKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTJGUDIpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0VUUkYpIHx8IFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjUpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjYpIHx8ICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNykgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSOCkpKSB8fCBcDQotICAgKCgoSU5TVEFOQ0UpID09IFRJTTIpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgKCgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjApIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjIpIHx8ICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMykgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTFGX0VEKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMUZQMSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkyRlAyKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19FVFJGKSB8fCBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI1KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI2KSB8fCAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjcpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjgpIHx8ICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMTEpKSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKCgoSU5TVEFOQ0UpID09IFRJTTMpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgKCgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjApIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjEpIHx8ICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMykgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTFGX0VEKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMUZQMSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkyRlAyKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19FVFJGKSB8fCBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI1KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI2KSB8fCAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjcpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjgpKSkgfHwgXA0KLSAgICgoKElOU1RBTkNFKSA9PSBUSU00KSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICgoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIwKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxKSB8fCAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjIpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkxRl9FRCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTFGUDEpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMkZQMikgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfRVRSRikgfHwgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNSkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNikgfHwgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI3KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI4KSkpIHx8IFwNCi0gICAoKChJTlNUQU5DRSkgPT0gVElNOCkgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAoKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMCkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMSkgfHwgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIyKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIzKSB8fCAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMUZfRUQpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkxRlAxKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTJGUDIpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0VUUkYpIHx8IFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjYpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjcpIHx8ICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSOCkpKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKCgoSU5TVEFOQ0UpID09IFRJTTE1KSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgKCgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjApIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjEpIHx8ICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMikgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMykgfHwgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTFGX0VEKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMUZQMSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkyRlAyKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI1KSB8fCBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI3KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI4KSkpKQ0KLQ0KLSNkZWZpbmUgSVNfVElNX0lOVEVSTkFMX1RSSUdHRVJFVkVOVF9JTlNUQU5DRShJTlNUQU5DRSwgX19TRUxFQ1RJT05fXykgICAgICAgICBcDQotICAoKCgoSU5TVEFOQ0UpID09IFRJTTEpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgKCgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjEpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjIpIHx8ICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMykgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNSkgfHwgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI2KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI3KSB8fCAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjgpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX05PTkUpKSkgfHwgXA0KLSAgICgoKElOU1RBTkNFKSA9PSBUSU0yKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICgoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIwKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIyKSB8fCAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjMpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjUpIHx8ICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNikgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNykgfHwgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI4KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxMSkgfHwgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX05PTkUpKSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoKElOU1RBTkNFKSA9PSBUSU0zKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICgoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIwKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxKSB8fCAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjMpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjUpIHx8ICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNikgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNykgfHwgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI4KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19OT05FKSkpIHx8IFwNCi0gICAoKChJTlNUQU5DRSkgPT0gVElNNCkgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAoKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMCkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMSkgfHwgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIyKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI1KSB8fCAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjYpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjcpIHx8ICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSOCkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfTk9ORSkpKSB8fCBcDQotICAgKCgoSU5TVEFOQ0UpID09IFRJTTgpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgKCgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjApIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjEpIHx8ICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMikgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMykgfHwgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI2KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI3KSB8fCAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjgpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX05PTkUpKSkgfHwgXA0KLSAgICgoKElOU1RBTkNFKSA9PSBUSU0xNSkgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICgoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIwKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxKSB8fCAgIFwNCi0gICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjIpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjMpIHx8ICAgXA0KLSAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNSkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNykgfHwgICBcDQotICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI4KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19OT05FKSkpKQ0KLQ0KLSNlbmRpZiAvKiBUSU01ICYmIFRJTTIwICovDQotI2RlZmluZSBJU19USU1fT0NfQ0hBTk5FTF9NT0RFKF9fTU9ERV9fLCBfX0NIQU5ORUxfXykgXA0KLSAgKElTX1RJTV9PQ19NT0RFKF9fTU9ERV9fKSAmJiAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKCgoX19NT0RFX18pID09IFRJTV9PQ01PREVfRElSRUNUSU9OX09VVFBVVCkgfHwgICBcDQotICAgICAoKF9fTU9ERV9fKSA9PSBUSU1fT0NNT0RFX1BVTFNFX09OX0NPTVBBUkUpKSAgICAgXA0KLSAgICAgICAgPyAoKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMykgfHwgICAgICAgIFwNCi0gICAgICAgICAgICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzQpKSAgICAgICAgICBcDQotICAgICAgICA6ICgxID09IDEpKSkNCi0NCi0jZGVmaW5lIElTX1RJTV9QVUxTRU9OQ09NUEFSRV9DSEFOTkVMKF9fQ0hBTk5FTF9fKSBcDQotICAoKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMykgfHwgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfNCkpDQotDQotI2RlZmluZSBJU19USU1fUFVMU0VPTkNPTVBBUkVfSU5TVEFOQ0UoSU5TVEFOQ0UpIElTX1RJTV9DQzNfSU5TVEFOQ0UoSU5TVEFOQ0UpDQotDQotI2RlZmluZSBJU19USU1fUFVMU0VPTkNPTVBBUkVfV0lEVEgoX19XSURUSF9fKSAoKF9fV0lEVEhfXykgPD0gMHhGRlUpDQotDQotI2RlZmluZSBJU19USU1fUFVMU0VPTkNPTVBBUkVfV0lEVEhQUkVTQ0FMRVIoX19QUkVTQ0FMRVJfXykgXA0KLSAgKChfX1BSRVNDQUxFUl9fKSA8PSAweDdVKQ0KLQ0KLSNkZWZpbmUgSVNfVElNX1NMQVZFX1BSRUxPQURfU09VUkNFKF9fU09VUkNFX18pICAgICAgIFwNCi0gICgoKF9fU09VUkNFX18pID09IFRJTV9TTVNfUFJFTE9BRF9TT1VSQ0VfVVBEQVRFKSB8fCBcDQotICAgKChfX1NPVVJDRV9fKSA9PSBUSU1fU01TX1BSRUxPQURfU09VUkNFX0lOREVYKSkNCi0NCi0jZGVmaW5lIElTX1RJTV9FTkNPREVSSU5ERVhfUE9MQVJJVFkoX19QT0xBUklUWV9fKSAgICAgICAgICAgXA0KLSAgKCgoX19QT0xBUklUWV9fKSA9PSBUSU1fRU5DT0RFUklOREVYX1BPTEFSSVRZX0lOVkVSVEVEKSB8fCBcDQotICAgKChfX1BPTEFSSVRZX18pID09IFRJTV9FTkNPREVSSU5ERVhfUE9MQVJJVFlfTk9OSU5WRVJURUQpKQ0KLQ0KLSNkZWZpbmUgSVNfVElNX0VOQ09ERVJJTkRFWF9QUkVTQ0FMRVIoX19QUkVTQ0FMRVJfXykgICAgICAgXA0KLSAgKCgoX19QUkVTQ0FMRVJfXykgPT0gVElNX0VOQ09ERVJJTkRFWF9QUkVTQ0FMRVJfRElWMSkgfHwgXA0KLSAgICgoX19QUkVTQ0FMRVJfXykgPT0gVElNX0VOQ09ERVJJTkRFWF9QUkVTQ0FMRVJfRElWMikgfHwgXA0KLSAgICgoX19QUkVTQ0FMRVJfXykgPT0gVElNX0VOQ09ERVJJTkRFWF9QUkVTQ0FMRVJfRElWNCkgfHwgXA0KLSAgICgoX19QUkVTQ0FMRVJfXykgPT0gVElNX0VOQ09ERVJJTkRFWF9QUkVTQ0FMRVJfRElWOCkpDQotDQotI2RlZmluZSBJU19USU1fRU5DT0RFUklOREVYX0ZJTFRFUihfX0ZJTFRFUl9fKSAoKF9fRklMVEVSX18pIDw9IDB4RlVMKQ0KLQ0KLSNkZWZpbmUgSVNfVElNX0VOQ09ERVJJTkRFWF9QT1NJVElPTihfX1BPU0lUSU9OX18pICAgICBcDQotICAoKChfX1BPU0lUSU9OX18pID09IFRJTV9FTkNPREVSSU5ERVhfUE9TSVRJT05fMDApIHx8IFwNCi0gICAoKF9fUE9TSVRJT05fXykgPT0gVElNX0VOQ09ERVJJTkRFWF9QT1NJVElPTl8wMSkgfHwgXA0KLSAgICgoX19QT1NJVElPTl9fKSA9PSBUSU1fRU5DT0RFUklOREVYX1BPU0lUSU9OXzEwKSB8fCBcDQotICAgKChfX1BPU0lUSU9OX18pID09IFRJTV9FTkNPREVSSU5ERVhfUE9TSVRJT05fMTEpIHx8IFwNCi0gICAoKF9fUE9TSVRJT05fXykgPT0gVElNX0VOQ09ERVJJTkRFWF9QT1NJVElPTl8wKSB8fCAgXA0KLSAgICgoX19QT1NJVElPTl9fKSA9PSBUSU1fRU5DT0RFUklOREVYX1BPU0lUSU9OXzEpKQ0KLQ0KLSNkZWZpbmUgSVNfVElNX0VOQ09ERVJJTkRFWF9ESVJFQ1RJT04oX19ESVJFQ1RJT05fXykgICAgICAgICAgXA0KLSAgKCgoX19ESVJFQ1RJT05fXykgPT0gVElNX0VOQ09ERVJJTkRFWF9ESVJFQ1RJT05fVVBfRE9XTikgfHwgXA0KLSAgICgoX19ESVJFQ1RJT05fXykgPT0gVElNX0VOQ09ERVJJTkRFWF9ESVJFQ1RJT05fVVApIHx8ICAgICAgXA0KLSAgICgoX19ESVJFQ1RJT05fXykgPT0gVElNX0VOQ09ERVJJTkRFWF9ESVJFQ1RJT05fRE9XTikpDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0vKiBFbmQgb2YgcHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLQ0KLS8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBhZGR0b2dyb3VwIFRJTUV4X0V4cG9ydGVkX0Z1bmN0aW9ucyBUSU0gRXh0ZW5kZWQgRXhwb3J0ZWQgRnVuY3Rpb25zDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGFkZHRvZ3JvdXAgVElNRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBFeHRlbmRlZCBUaW1lciBIYWxsIFNlbnNvcg0KLSAqIGZ1bmN0aW9ucw0KLSAqICBAYnJpZWYgICAgVGltZXIgSGFsbCBTZW5zb3IgZnVuY3Rpb25zDQotICogQHsNCi0gKi8NCi0vKiAgVGltZXIgSGFsbCBTZW5zb3IgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9IYWxsU2Vuc29yX0luaXQoDQotICAgIFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCBUSU1fSGFsbFNlbnNvcl9Jbml0VHlwZURlZiAqc0NvbmZpZyk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0hhbGxTZW5zb3JfRGVJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsNCi0NCi12b2lkIEhBTF9USU1FeF9IYWxsU2Vuc29yX01zcEluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOw0KLXZvaWQgSEFMX1RJTUV4X0hhbGxTZW5zb3JfTXNwRGVJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsNCi0NCi0vKiBCbG9ja2luZyBtb2RlOiBQb2xsaW5nICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0hhbGxTZW5zb3JfU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9IYWxsU2Vuc29yX1N0b3AoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOw0KLS8qIE5vbi1CbG9ja2luZyBtb2RlOiBJbnRlcnJ1cHQgKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfSGFsbFNlbnNvcl9TdGFydF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0hhbGxTZW5zb3JfU3RvcF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7DQotLyogTm9uLUJsb2NraW5nIG1vZGU6IERNQSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9IYWxsU2Vuc29yX1N0YXJ0X0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBEYXRhLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBMZW5ndGgpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9IYWxsU2Vuc29yX1N0b3BfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAYWRkdG9ncm91cCBUSU1FeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIEV4dGVuZGVkIFRpbWVyIENvbXBsZW1lbnRhcnkNCi0gKiBPdXRwdXQgQ29tcGFyZSBmdW5jdGlvbnMNCi0gKiAgQGJyaWVmICAgVGltZXIgQ29tcGxlbWVudGFyeSBPdXRwdXQgQ29tcGFyZSBmdW5jdGlvbnMNCi0gKiBAew0KLSAqLw0KLS8qICBUaW1lciBDb21wbGVtZW50YXJ5IE91dHB1dCBDb21wYXJlIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyogQmxvY2tpbmcgbW9kZTogUG9sbGluZyAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9PQ05fU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfT0NOX1N0b3AoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpOw0KLQ0KLS8qIE5vbi1CbG9ja2luZyBtb2RlOiBJbnRlcnJ1cHQgKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfT0NOX1N0YXJ0X0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X09DTl9TdG9wX0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKTsNCi0NCi0vKiBOb24tQmxvY2tpbmcgbW9kZTogRE1BICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X09DTl9TdGFydF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgKnBEYXRhLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IExlbmd0aCk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X09DTl9TdG9wX0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpOw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBhZGR0b2dyb3VwIFRJTUV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgRXh0ZW5kZWQgVGltZXIgQ29tcGxlbWVudGFyeSBQV00NCi0gKiBmdW5jdGlvbnMNCi0gKiAgQGJyaWVmICAgIFRpbWVyIENvbXBsZW1lbnRhcnkgUFdNIGZ1bmN0aW9ucw0KLSAqIEB7DQotICovDQotLyogIFRpbWVyIENvbXBsZW1lbnRhcnkgUFdNIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKiBCbG9ja2luZyBtb2RlOiBQb2xsaW5nICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X1BXTU5fU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X1BXTU5fU3RvcChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpOw0KLQ0KLS8qIE5vbi1CbG9ja2luZyBtb2RlOiBJbnRlcnJ1cHQgKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfUFdNTl9TdGFydF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfUFdNTl9TdG9wX0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCk7DQotLyogTm9uLUJsb2NraW5nIG1vZGU6IERNQSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9QV01OX1N0YXJ0X0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgKnBEYXRhLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBMZW5ndGgpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9QV01OX1N0b3BfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpOw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBhZGR0b2dyb3VwIFRJTUV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQgRXh0ZW5kZWQgVGltZXIgQ29tcGxlbWVudGFyeSBPbmUNCi0gKiBQdWxzZSBmdW5jdGlvbnMNCi0gKiAgQGJyaWVmICAgIFRpbWVyIENvbXBsZW1lbnRhcnkgT25lIFB1bHNlIGZ1bmN0aW9ucw0KLSAqIEB7DQotICovDQotLyogIFRpbWVyIENvbXBsZW1lbnRhcnkgT25lIFB1bHNlIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKiBCbG9ja2luZyBtb2RlOiBQb2xsaW5nICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X09uZVB1bHNlTl9TdGFydChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE91dHB1dENoYW5uZWwpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9PbmVQdWxzZU5fU3RvcChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgT3V0cHV0Q2hhbm5lbCk7DQotDQotLyogTm9uLUJsb2NraW5nIG1vZGU6IEludGVycnVwdCAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9PbmVQdWxzZU5fU3RhcnRfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBPdXRwdXRDaGFubmVsKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfT25lUHVsc2VOX1N0b3BfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE91dHB1dENoYW5uZWwpOw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBhZGR0b2dyb3VwIFRJTUV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDUgRXh0ZW5kZWQgUGVyaXBoZXJhbCBDb250cm9sDQotICogZnVuY3Rpb25zDQotICogIEBicmllZiAgICBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zDQotICogQHsNCi0gKi8NCi0vKiBFeHRlbmRlZCBDb250cm9sIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9Db25maWdDb21tdXRFdmVudChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgSW5wdXRUcmlnZ2VyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDb21tdXRhdGlvblNvdXJjZSk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0NvbmZpZ0NvbW11dEV2ZW50X0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBJbnB1dFRyaWdnZXIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENvbW11dGF0aW9uU291cmNlKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfQ29uZmlnQ29tbXV0RXZlbnRfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgSW5wdXRUcmlnZ2VyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ29tbXV0YXRpb25Tb3VyY2UpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9NYXN0ZXJDb25maWdTeW5jaHJvbml6YXRpb24oDQotICAgIFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCBUSU1fTWFzdGVyQ29uZmlnVHlwZURlZiAqc01hc3RlckNvbmZpZyk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0NvbmZpZ0JyZWFrRGVhZFRpbWUoDQotICAgIFRJTV9IYW5kbGVUeXBlRGVmICpodGltLA0KLSAgICBUSU1fQnJlYWtEZWFkVGltZUNvbmZpZ1R5cGVEZWYgKnNCcmVha0RlYWRUaW1lQ29uZmlnKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfQ29uZmlnQnJlYWtJbnB1dCgNCi0gICAgVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IEJyZWFrSW5wdXQsDQotICAgIFRJTUV4X0JyZWFrSW5wdXRDb25maWdUeXBlRGVmICpzQnJlYWtJbnB1dENvbmZpZyk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0dyb3VwQ2hhbm5lbDUoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbHMpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9SZW1hcENvbmZpZyhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUmVtYXApOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9USVNlbGVjdGlvbihUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVElTZWxlY3Rpb24sIHVpbnQzMl90IENoYW5uZWwpOw0KLQ0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9EaXNhcm1CcmVha0lucHV0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEJyZWFrSW5wdXQpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9SZUFybUJyZWFrSW5wdXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBCcmVha0lucHV0KTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfRGl0aGVyaW5nRW5hYmxlKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfRGl0aGVyaW5nRGlzYWJsZShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X09DX0NvbmZpZ1B1bHNlT25Db21wYXJlKA0KLSAgICBUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgUHVsc2VXaWR0aFByZXNjYWxlciwgdWludDMyX3QgUHVsc2VXaWR0aCk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0NvbmZpZ1NsYXZlTW9kZVByZWxvYWQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgU291cmNlKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfRW5hYmxlU2xhdmVNb2RlUHJlbG9hZChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0Rpc2FibGVTbGF2ZU1vZGVQcmVsb2FkKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfRW5hYmxlRGVhZFRpbWVQcmVsb2FkKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfRGlzYWJsZURlYWRUaW1lUHJlbG9hZChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0NvbmZpZ0RlYWRUaW1lKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBEZWFkdGltZSk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0NvbmZpZ0FzeW1tZXRyaWNhbERlYWRUaW1lKA0KLSAgICBUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgRmFsbGluZ0RlYWR0aW1lKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfRW5hYmxlQXN5bW1ldHJpY2FsRGVhZFRpbWUoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9EaXNhYmxlQXN5bW1ldHJpY2FsRGVhZFRpbWUoDQotICAgIFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfQ29uZmlnRW5jb2RlckluZGV4KA0KLSAgICBUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwNCi0gICAgVElNRXhfRW5jb2RlckluZGV4Q29uZmlnVHlwZURlZiAqc0VuY29kZXJJbmRleENvbmZpZyk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0VuYWJsZUVuY29kZXJJbmRleChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0Rpc2FibGVFbmNvZGVySW5kZXgoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9FbmFibGVFbmNvZGVyRmlyc3RJbmRleChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0Rpc2FibGVFbmNvZGVyRmlyc3RJbmRleChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7DQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGFkZHRvZ3JvdXAgVElNRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNiBFeHRlbmRlZCBDYWxsYmFja3MgZnVuY3Rpb25zDQotICogQGJyaWVmICAgIEV4dGVuZGVkIENhbGxiYWNrcyBmdW5jdGlvbnMNCi0gKiBAew0KLSAqLw0KLS8qIEV4dGVuZGVkIENhbGxiYWNrICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotdm9pZCBIQUxfVElNRXhfQ29tbXV0Q2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOw0KLXZvaWQgSEFMX1RJTUV4X0NvbW11dEhhbGZDcGx0Q2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOw0KLXZvaWQgSEFMX1RJTUV4X0JyZWFrQ2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOw0KLXZvaWQgSEFMX1RJTUV4X0JyZWFrMkNhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsNCi12b2lkIEhBTF9USU1FeF9FbmNvZGVySW5kZXhDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7DQotdm9pZCBIQUxfVElNRXhfRGlyZWN0aW9uQ2hhbmdlQ2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOw0KLXZvaWQgSEFMX1RJTUV4X0luZGV4RXJyb3JDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7DQotdm9pZCBIQUxfVElNRXhfVHJhbnNpdGlvbkVycm9yQ2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBhZGR0b2dyb3VwIFRJTUV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDcgRXh0ZW5kZWQgUGVyaXBoZXJhbCBTdGF0ZQ0KLSAqIGZ1bmN0aW9ucw0KLSAqIEBicmllZiAgICBFeHRlbmRlZCBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucw0KLSAqIEB7DQotICovDQotLyogRXh0ZW5kZWQgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1IQUxfVElNX1N0YXRlVHlwZURlZiBIQUxfVElNRXhfSGFsbFNlbnNvcl9HZXRTdGF0ZShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7DQotSEFMX1RJTV9DaGFubmVsU3RhdGVUeXBlRGVmIEhBTF9USU1FeF9HZXRDaGFubmVsTlN0YXRlKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsTik7DQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLS8qIEVuZCBvZiBleHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotDQotLyogUHJpdmF0ZSBmdW5jdGlvbnMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGFkZHRvZ3JvdXAgVElNRXhfUHJpdmF0ZV9GdW5jdGlvbnMgVElNIEV4dGVuZGVkIFByaXZhdGUgRnVuY3Rpb25zDQotICogQHsNCi0gKi8NCi12b2lkIFRJTUV4X0RNQUNvbW11dGF0aW9uQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7DQotdm9pZCBUSU1FeF9ETUFDb21tdXRhdGlvbkhhbGZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLS8qIEVuZCBvZiBwcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLSNpZmRlZiBfX2NwbHVzcGx1cw0KLX0NCi0jZW5kaWYNCi0NCi0jZW5kaWYgLyogU1RNMzJHNHh4X0hBTF9USU1fRVhfSCAqLw0KKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGZpbGUgICAgc3RtMzJnNHh4X2hhbF90aW1fZXguaAorICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFRJTSBIQUwgRXh0ZW5kZWQgbW9kdWxlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGF0dGVudGlvbgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGVybXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZQorICogaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc29mdHdhcmUgY29tcG9uZW50LgorICogSWYgbm8gTElDRU5TRSBmaWxlIGNvbWVzIHdpdGggdGhpcyBzb2Z0d2FyZSwgaXQgaXMgcHJvdmlkZWQgQVMtSVMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyRzR4eF9IQUxfVElNX0VYX0gKKyNkZWZpbmUgU1RNMzJHNHh4X0hBTF9USU1fRVhfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnNHh4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzR4eF9IQUxfRHJpdmVyCisgKiBAeworICovCisKKy8qKiBAYWRkdG9ncm91cCBUSU1FeAorICogQHsKKyAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBUSU1FeF9FeHBvcnRlZF9UeXBlcyBUSU0gRXh0ZW5kZWQgRXhwb3J0ZWQgVHlwZXMKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgIFRJTSBIYWxsIHNlbnNvciBDb25maWd1cmF0aW9uIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50MzJfdCBJQzFQb2xhcml0eTsgLyohPCBTcGVjaWZpZXMgdGhlIGFjdGl2ZSBlZGdlIG9mIHRoZSBpbnB1dCBzaWduYWwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9JbnB1dF9DYXB0dXJlX1BvbGFyaXR5ICovCisKKyAgdWludDMyX3QgSUMxUHJlc2NhbGVyOyAvKiE8IFNwZWNpZmllcyB0aGUgSW5wdXQgQ2FwdHVyZSBQcmVzY2FsZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX0lucHV0X0NhcHR1cmVfUHJlc2NhbGVyICovCisKKyAgdWludDMyX3QgSUMxRmlsdGVyOyAvKiE8IFNwZWNpZmllcyB0aGUgaW5wdXQgY2FwdHVyZSBmaWx0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MAorICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBNYXhfRGF0YSA9IDB4RiAqLworCisgIHVpbnQzMl90IENvbW11dGF0aW9uX0RlbGF5OyAvKiE8IFNwZWNpZmllcyB0aGUgcHVsc2UgdmFsdWUgdG8gYmUgbG9hZGVkIGludG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBDYXB0dXJlIENvbXBhcmUgUmVnaXN0ZXIuIFRoaXMgcGFyYW1ldGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW4gYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MDAwMCBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heF9EYXRhID0gMHhGRkZGICovCit9IFRJTV9IYWxsU2Vuc29yX0luaXRUeXBlRGVmOworCisvKioKKyAqIEBicmllZiAgVElNIEJyZWFrL0JyZWFrMiBpbnB1dCBjb25maWd1cmF0aW9uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDMyX3QgU291cmNlOyAgIC8qITwgU3BlY2lmaWVzIHRoZSBzb3VyY2Ugb2YgdGhlIHRpbWVyIGJyZWFrIGlucHV0LgorICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgICBUSU1FeF9CcmVha19JbnB1dF9Tb3VyY2UgKi8KKyAgdWludDMyX3QgRW5hYmxlOyAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRoZSBicmVhayBpbnB1dCBzb3VyY2UgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQuICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgVElNRXhfQnJlYWtfSW5wdXRfU291cmNlX0VuYWJsZSAqLworICB1aW50MzJfdCBQb2xhcml0eTsgLyohPCBTcGVjaWZpZXMgdGhlIGJyZWFrIGlucHV0IHNvdXJjZSBwb2xhcml0eS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgVElNRXhfQnJlYWtfSW5wdXRfU291cmNlX1BvbGFyaXR5ICovCit9IFRJTUV4X0JyZWFrSW5wdXRDb25maWdUeXBlRGVmOworCisvKioKKyAqIEBicmllZiAgVElNIEVuY29kZXIgaW5kZXggY29uZmlndXJhdGlvbgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQzMl90IFBvbGFyaXR5OyAvKiE8IFRJTSBFbmNvZGVyIGluZGV4IHBvbGFyaXR5LlRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBvZiBAcmVmIFRJTUV4X0VuY29kZXJfSW5kZXhfUG9sYXJpdHkgKi8KKworICB1aW50MzJfdCBQcmVzY2FsZXI7IC8qITwgVElNIEVuY29kZXIgaW5kZXggcHJlc2NhbGVyLlRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhCisgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgb2YgQHJlZiBUSU1FeF9FbmNvZGVyX0luZGV4X1ByZXNjYWxlciAqLworCisgIHVpbnQzMl90IEZpbHRlcjsgLyohPCBUSU0gRW5jb2RlciBpbmRleCBmaWx0ZXIuVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgbnVtYmVyCisgICAgICAgICAgICAgICAgICAgICAgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MCBhbmQgTWF4X0RhdGEgPSAweEYgKi8KKworICBGdW5jdGlvbmFsU3RhdGUgRmlyc3RJbmRleEVuYWJsZTsgLyohPCBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGhlIGVuY29kZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0IGluZGV4IGlzIGVuYWJsZWQuVGhpcyBwYXJhbWV0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGNhbiBiZSBFTkFCTEUgb3IgRElTQUJMRS4gKi8KKworICB1aW50MzJfdCBQb3NpdGlvbjsgLyohPCBTcGVjaWZpZXMgaW4gd2hpY2ggQUIgaW5wdXQgY29uZmlndXJhdGlvbiB0aGUgaW5kZXgKKyAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50IHJlc2V0cyB0aGUgY291bnRlci5UaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgb2YgQHJlZiBUSU1FeF9FbmNvZGVyX0luZGV4X1Bvc2l0aW9uICovCisKKyAgdWludDMyX3QgRGlyZWN0aW9uOyAvKiE8IFNwZWNpZmllcyBpbiB3aGljaCBjb3VudGVyIGRpcmVjdGlvbiB0aGUgaW5kZXggZXZlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXNldHMgdGhlIGNvdW50ZXIuVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIFRJTUV4X0VuY29kZXJfSW5kZXhfRGlyZWN0aW9uICovCisKK30gVElNRXhfRW5jb2RlckluZGV4Q29uZmlnVHlwZURlZjsKKworLyoqCisgKiBAfQorICovCisvKiBFbmQgb2YgZXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBUSU1FeF9FeHBvcnRlZF9Db25zdGFudHMgVElNIEV4dGVuZGVkIEV4cG9ydGVkIENvbnN0YW50cworICogQHsKKyAqLworCisvKiogQGRlZmdyb3VwIFRJTUV4X1JlbWFwIFRJTSBFeHRlbmRlZCBSZW1hcHBpbmcKKyAqIEB7CisgKi8KKyNkZWZpbmUgVElNX1RJTTFfRVRSX0dQSU8gMHgwMDAwMDAwMFUgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIEdQSU8gKi8KKyNkZWZpbmUgVElNX1RJTTFfRVRSX0NPTVAxIFwKKyAgVElNMV9BRjFfRVRSU0VMXzAgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVAxX09VVCAqLworI2RlZmluZSBUSU1fVElNMV9FVFJfQ09NUDIgXAorICBUSU0xX0FGMV9FVFJTRUxfMSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDJfT1VUICovCisjZGVmaW5lIFRJTV9USU0xX0VUUl9DT01QMyBcCisgIChUSU0xX0FGMV9FVFJTRUxfMSB8ICAgICBcCisgICBUSU0xX0FGMV9FVFJTRUxfMCkgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVAzX09VVCAqLworI2RlZmluZSBUSU1fVElNMV9FVFJfQ09NUDQgXAorICBUSU0xX0FGMV9FVFJTRUxfMiAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDRfT1VUICovCisjaWYgZGVmaW5lZChDT01QNSkKKyNkZWZpbmUgVElNX1RJTTFfRVRSX0NPTVA1IFwKKyAgKFRJTTFfQUYxX0VUUlNFTF8yIHwgICAgIFwKKyAgIFRJTTFfQUYxX0VUUlNFTF8wKSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDVfT1VUICovCisjZW5kaWYgICAgICAgICAgICAgICAgLyogQ09NUDUgKi8KKyNpZiBkZWZpbmVkKENPTVA2KQorI2RlZmluZSBUSU1fVElNMV9FVFJfQ09NUDYgXAorICAoVElNMV9BRjFfRVRSU0VMXzIgfCAgICAgXAorICAgVElNMV9BRjFfRVRSU0VMXzEpIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QNl9PVVQgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAvKiBDT01QNiAqLworI2lmIGRlZmluZWQoQ09NUDcpCisjZGVmaW5lIFRJTV9USU0xX0VUUl9DT01QNyAgICAgICAgICAgICAgICAgXAorICAoVElNMV9BRjFfRVRSU0VMXzIgfCBUSU0xX0FGMV9FVFJTRUxfMSB8IFwKKyAgIFRJTTFfQUYxX0VUUlNFTF8wKSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDdfT1VUICovCisjZW5kaWYgICAgICAgICAgICAgICAgLyogQ09NUDcgKi8KKyNkZWZpbmUgVElNX1RJTTFfRVRSX0FEQzFfQVdEMSAgICAgICAgICAgICAgICAgIFwKKyAgVElNMV9BRjFfRVRSU0VMXzMgLyohPCBBREMxIGFuYWxvZyB3YXRjaGRvZyAxIFwKKyAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9USU0xX0VUUl9BREMxX0FXRDIgXAorICAoVElNMV9BRjFfRVRSU0VMXzMgfCBUSU0xX0FGMV9FVFJTRUxfMCkgLyohPCBBREMxIGFuYWxvZyB3YXRjaGRvZyAyICovCisjZGVmaW5lIFRJTV9USU0xX0VUUl9BREMxX0FXRDMgXAorICAoVElNMV9BRjFfRVRSU0VMXzMgfCBUSU0xX0FGMV9FVFJTRUxfMSkgLyohPCBBREMxIGFuYWxvZyB3YXRjaGRvZyAzICovCisjaWYgZGVmaW5lZChBREM0KQorI2RlZmluZSBUSU1fVElNMV9FVFJfQURDNF9BV0QxICAgICAgICAgICAgIFwKKyAgKFRJTTFfQUYxX0VUUlNFTF8zIHwgVElNMV9BRjFfRVRSU0VMXzEgfCBcCisgICBUSU0xX0FGMV9FVFJTRUxfMCkgLyohPCBBREM0IGFuYWxvZyB3YXRjaGRvZyAxICovCisjZGVmaW5lIFRJTV9USU0xX0VUUl9BREM0X0FXRDIgXAorICAoVElNMV9BRjFfRVRSU0VMXzMgfCBUSU0xX0FGMV9FVFJTRUxfMikgLyohPCBBREM0IGFuYWxvZyB3YXRjaGRvZyAyICovCisjZGVmaW5lIFRJTV9USU0xX0VUUl9BREM0X0FXRDMgICAgICAgICAgICAgXAorICAoVElNMV9BRjFfRVRSU0VMXzMgfCBUSU0xX0FGMV9FVFJTRUxfMiB8IFwKKyAgIFRJTTFfQUYxX0VUUlNFTF8wKSAvKiE8IEFEQzQgYW5hbG9nIHdhdGNoZG9nIDMgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAvKiBBREM0ICovCisKKyNkZWZpbmUgVElNX1RJTTJfRVRSX0dQSU8gMHgwMDAwMDAwMFUgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIEdQSU8gKi8KKyNkZWZpbmUgVElNX1RJTTJfRVRSX0NPTVAxIFwKKyAgVElNMV9BRjFfRVRSU0VMXzAgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVAxX09VVCAqLworI2RlZmluZSBUSU1fVElNMl9FVFJfQ09NUDIgXAorICBUSU0xX0FGMV9FVFJTRUxfMSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDJfT1VUICovCisjZGVmaW5lIFRJTV9USU0yX0VUUl9DT01QMyBcCisgIChUSU0xX0FGMV9FVFJTRUxfMSB8ICAgICBcCisgICBUSU0xX0FGMV9FVFJTRUxfMCkgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVAzX09VVCAqLworI2RlZmluZSBUSU1fVElNMl9FVFJfQ09NUDQgXAorICBUSU0xX0FGMV9FVFJTRUxfMiAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDRfT1VUICovCisjaWYgZGVmaW5lZChDT01QNSkKKyNkZWZpbmUgVElNX1RJTTJfRVRSX0NPTVA1IFwKKyAgKFRJTTFfQUYxX0VUUlNFTF8yIHwgICAgIFwKKyAgIFRJTTFfQUYxX0VUUlNFTF8wKSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDVfT1VUICovCisjZW5kaWYgICAgICAgICAgICAgICAgLyogQ09NUDUgKi8KKyNpZiBkZWZpbmVkKENPTVA2KQorI2RlZmluZSBUSU1fVElNMl9FVFJfQ09NUDYgXAorICAoVElNMV9BRjFfRVRSU0VMXzIgfCAgICAgXAorICAgVElNMV9BRjFfRVRSU0VMXzEpIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QNl9PVVQgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAvKiBDT01QNiAqLworI2lmIGRlZmluZWQoQ09NUDcpCisjZGVmaW5lIFRJTV9USU0yX0VUUl9DT01QNyAgICAgICAgICAgICAgICAgXAorICAoVElNMV9BRjFfRVRSU0VMXzIgfCBUSU0xX0FGMV9FVFJTRUxfMSB8IFwKKyAgIFRJTTFfQUYxX0VUUlNFTF8wKSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDdfT1VUICovCisjZW5kaWYgICAgICAgICAgICAgICAgLyogQ09NUDcgKi8KKyNkZWZpbmUgVElNX1RJTTJfRVRSX1RJTTNfRVRSIFwKKyAgVElNMV9BRjFfRVRSU0VMXzMgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIFRJTTMgRVRSICovCisjZGVmaW5lIFRJTV9USU0yX0VUUl9USU00X0VUUiBcCisgIChUSU0xX0FGMV9FVFJTRUxfMyB8ICAgICAgICBcCisgICBUSU0xX0FGMV9FVFJTRUxfMCkgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIFRJTTQgRVRSICovCisjaWYgZGVmaW5lZChUSU01KQorI2RlZmluZSBUSU1fVElNMl9FVFJfVElNNV9FVFIgXAorICAoVElNMV9BRjFfRVRSU0VMXzMgfCAgICAgICAgXAorICAgVElNMV9BRjFfRVRSU0VMXzEpIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBUSU01IEVUUiAqLworI2VuZGlmICAgICAgICAgICAgICAgIC8qIFRJTTUgKi8KKyNkZWZpbmUgVElNX1RJTTJfRVRSX0xTRSAgICAgICAgICAgICAgICAgICBcCisgIChUSU0xX0FGMV9FVFJTRUxfMyB8IFRJTTFfQUYxX0VUUlNFTF8xIHwgXAorICAgVElNMV9BRjFfRVRSU0VMXzApIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBMU0UgKi8KKworI2RlZmluZSBUSU1fVElNM19FVFJfR1BJTyAweDAwMDAwMDAwVSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gR1BJTyAqLworI2RlZmluZSBUSU1fVElNM19FVFJfQ09NUDEgXAorICBUSU0xX0FGMV9FVFJTRUxfMCAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDFfT1VUICovCisjZGVmaW5lIFRJTV9USU0zX0VUUl9DT01QMiBcCisgIFRJTTFfQUYxX0VUUlNFTF8xIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QMl9PVVQgKi8KKyNkZWZpbmUgVElNX1RJTTNfRVRSX0NPTVAzIFwKKyAgKFRJTTFfQUYxX0VUUlNFTF8xIHwgICAgIFwKKyAgIFRJTTFfQUYxX0VUUlNFTF8wKSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDNfT1VUICovCisjZGVmaW5lIFRJTV9USU0zX0VUUl9DT01QNCBcCisgIFRJTTFfQUYxX0VUUlNFTF8yIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QNF9PVVQgKi8KKyNpZiBkZWZpbmVkKENPTVA1KQorI2RlZmluZSBUSU1fVElNM19FVFJfQ09NUDUgXAorICAoVElNMV9BRjFfRVRSU0VMXzIgfCAgICAgXAorICAgVElNMV9BRjFfRVRSU0VMXzApIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QNV9PVVQgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAvKiBDT01QNSAqLworI2lmIGRlZmluZWQoQ09NUDYpCisjZGVmaW5lIFRJTV9USU0zX0VUUl9DT01QNiBcCisgIChUSU0xX0FGMV9FVFJTRUxfMiB8ICAgICBcCisgICBUSU0xX0FGMV9FVFJTRUxfMSkgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVA2X09VVCAqLworI2VuZGlmICAgICAgICAgICAgICAgIC8qIENPTVA2ICovCisjaWYgZGVmaW5lZChDT01QNykKKyNkZWZpbmUgVElNX1RJTTNfRVRSX0NPTVA3ICAgICAgICAgICAgICAgICBcCisgIChUSU0xX0FGMV9FVFJTRUxfMiB8IFRJTTFfQUYxX0VUUlNFTF8xIHwgXAorICAgVElNMV9BRjFfRVRSU0VMXzApIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QN19PVVQgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAvKiBDT01QNyAqLworI2RlZmluZSBUSU1fVElNM19FVFJfVElNMl9FVFIgXAorICBUSU0xX0FGMV9FVFJTRUxfMyAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gVElNMiBFVFIgKi8KKyNkZWZpbmUgVElNX1RJTTNfRVRSX1RJTTRfRVRSIFwKKyAgKFRJTTFfQUYxX0VUUlNFTF8zIHwgICAgICAgIFwKKyAgIFRJTTFfQUYxX0VUUlNFTF8wKSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gVElNNCBFVFIgKi8KKyNkZWZpbmUgVElNX1RJTTNfRVRSX0FEQzJfQVdEMSAgICAgICAgICAgICBcCisgIChUSU0xX0FGMV9FVFJTRUxfMyB8IFRJTTFfQUYxX0VUUlNFTF8xIHwgXAorICAgVElNMV9BRjFfRVRSU0VMXzApIC8qITwgQURDMiBhbmFsb2cgd2F0Y2hkb2cgMSAqLworI2RlZmluZSBUSU1fVElNM19FVFJfQURDMl9BV0QyIFwKKyAgKFRJTTFfQUYxX0VUUlNFTF8zIHwgVElNMV9BRjFfRVRSU0VMXzIpIC8qITwgQURDMiBhbmFsb2cgd2F0Y2hkb2cgMiAqLworI2RlZmluZSBUSU1fVElNM19FVFJfQURDMl9BV0QzICAgICAgICAgICAgIFwKKyAgKFRJTTFfQUYxX0VUUlNFTF8zIHwgVElNMV9BRjFfRVRSU0VMXzIgfCBcCisgICBUSU0xX0FGMV9FVFJTRUxfMCkgLyohPCBBREMyIGFuYWxvZyB3YXRjaGRvZyAzICovCisKKyNkZWZpbmUgVElNX1RJTTRfRVRSX0dQSU8gMHgwMDAwMDAwMFUgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIEdQSU8gKi8KKyNkZWZpbmUgVElNX1RJTTRfRVRSX0NPTVAxIFwKKyAgVElNMV9BRjFfRVRSU0VMXzAgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVAxX09VVCAqLworI2RlZmluZSBUSU1fVElNNF9FVFJfQ09NUDIgXAorICBUSU0xX0FGMV9FVFJTRUxfMSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDJfT1VUICovCisjZGVmaW5lIFRJTV9USU00X0VUUl9DT01QMyBcCisgIChUSU0xX0FGMV9FVFJTRUxfMSB8ICAgICBcCisgICBUSU0xX0FGMV9FVFJTRUxfMCkgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVAzX09VVCAqLworI2RlZmluZSBUSU1fVElNNF9FVFJfQ09NUDQgXAorICBUSU0xX0FGMV9FVFJTRUxfMiAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDRfT1VUICovCisjaWYgZGVmaW5lZChDT01QNSkKKyNkZWZpbmUgVElNX1RJTTRfRVRSX0NPTVA1IFwKKyAgKFRJTTFfQUYxX0VUUlNFTF8yIHwgICAgIFwKKyAgIFRJTTFfQUYxX0VUUlNFTF8wKSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDVfT1VUICovCisjZW5kaWYgICAgICAgICAgICAgICAgLyogQ09NUDUgKi8KKyNpZiBkZWZpbmVkKENPTVA2KQorI2RlZmluZSBUSU1fVElNNF9FVFJfQ09NUDYgXAorICAoVElNMV9BRjFfRVRSU0VMXzIgfCAgICAgXAorICAgVElNMV9BRjFfRVRSU0VMXzEpIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QNl9PVVQgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAvKiBDT01QNiAqLworI2lmIGRlZmluZWQoQ09NUDcpCisjZGVmaW5lIFRJTV9USU00X0VUUl9DT01QNyAgICAgICAgICAgICAgICAgXAorICAoVElNMV9BRjFfRVRSU0VMXzIgfCBUSU0xX0FGMV9FVFJTRUxfMSB8IFwKKyAgIFRJTTFfQUYxX0VUUlNFTF8wKSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDdfT1VUICovCisjZW5kaWYgICAgICAgICAgICAgICAgLyogQ09NUDcgKi8KKyNkZWZpbmUgVElNX1RJTTRfRVRSX1RJTTNfRVRSIFwKKyAgVElNMV9BRjFfRVRSU0VMXzMgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIFRJTTMgRVRSICovCisjaWYgZGVmaW5lZChUSU01KQorI2RlZmluZSBUSU1fVElNNF9FVFJfVElNNV9FVFIgXAorICAoVElNMV9BRjFfRVRSU0VMXzMgfCAgICAgICAgXAorICAgVElNMV9BRjFfRVRSU0VMXzApIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBUSU01IEVUUiAqLworI2VuZGlmICAgICAgICAgICAgICAgIC8qIFRJTTUgKi8KKworI2lmIGRlZmluZWQoVElNNSkKKyNkZWZpbmUgVElNX1RJTTVfRVRSX0dQSU8gMHgwMDAwMDAwMFUgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIEdQSU8gKi8KKyNkZWZpbmUgVElNX1RJTTVfRVRSX0NPTVAxIFwKKyAgVElNMV9BRjFfRVRSU0VMXzAgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVAxX09VVCAqLworI2RlZmluZSBUSU1fVElNNV9FVFJfQ09NUDIgXAorICBUSU0xX0FGMV9FVFJTRUxfMSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDJfT1VUICovCisjZGVmaW5lIFRJTV9USU01X0VUUl9DT01QMyBcCisgIChUSU0xX0FGMV9FVFJTRUxfMSB8ICAgICBcCisgICBUSU0xX0FGMV9FVFJTRUxfMCkgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVAzX09VVCAqLworI2RlZmluZSBUSU1fVElNNV9FVFJfQ09NUDQgXAorICBUSU0xX0FGMV9FVFJTRUxfMiAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDRfT1VUICovCisjaWYgZGVmaW5lZChDT01QNSkKKyNkZWZpbmUgVElNX1RJTTVfRVRSX0NPTVA1IFwKKyAgKFRJTTFfQUYxX0VUUlNFTF8yIHwgICAgIFwKKyAgIFRJTTFfQUYxX0VUUlNFTF8wKSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDVfT1VUICovCisjZW5kaWYgICAgICAgICAgICAgICAgLyogQ09NUDUgKi8KKyNpZiBkZWZpbmVkKENPTVA2KQorI2RlZmluZSBUSU1fVElNNV9FVFJfQ09NUDYgXAorICAoVElNMV9BRjFfRVRSU0VMXzIgfCAgICAgXAorICAgVElNMV9BRjFfRVRSU0VMXzEpIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QNl9PVVQgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAvKiBDT01QNiAqLworI2lmIGRlZmluZWQoQ09NUDcpCisjZGVmaW5lIFRJTV9USU01X0VUUl9DT01QNyAgICAgICAgICAgICAgICAgXAorICAoVElNMV9BRjFfRVRSU0VMXzIgfCBUSU0xX0FGMV9FVFJTRUxfMSB8IFwKKyAgIFRJTTFfQUYxX0VUUlNFTF8wKSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDdfT1VUICovCisjZW5kaWYgICAgICAgICAgICAgICAgLyogQ09NUDcgKi8KKyNkZWZpbmUgVElNX1RJTTVfRVRSX1RJTTJfRVRSIFwKKyAgVElNMV9BRjFfRVRSU0VMXzMgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIFRJTTIgRVRSICovCisjZGVmaW5lIFRJTV9USU01X0VUUl9USU0zX0VUUiBcCisgIChUSU0xX0FGMV9FVFJTRUxfMyB8ICAgICAgICBcCisgICBUSU0xX0FGMV9FVFJTRUxfMCkgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIFRJTTMgRVRSICovCisjZW5kaWYgICAgICAgICAgICAgICAgLyogVElNNSAqLworCisjZGVmaW5lIFRJTV9USU04X0VUUl9HUElPIDB4MDAwMDAwMDBVIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBHUElPICovCisjZGVmaW5lIFRJTV9USU04X0VUUl9DT01QMSBcCisgIFRJTTFfQUYxX0VUUlNFTF8wIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QMV9PVVQgKi8KKyNkZWZpbmUgVElNX1RJTThfRVRSX0NPTVAyIFwKKyAgVElNMV9BRjFfRVRSU0VMXzEgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVAyX09VVCAqLworI2RlZmluZSBUSU1fVElNOF9FVFJfQ09NUDMgXAorICAoVElNMV9BRjFfRVRSU0VMXzEgfCAgICAgXAorICAgVElNMV9BRjFfRVRSU0VMXzApIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QM19PVVQgKi8KKyNkZWZpbmUgVElNX1RJTThfRVRSX0NPTVA0IFwKKyAgVElNMV9BRjFfRVRSU0VMXzIgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVA0X09VVCAqLworI2lmIGRlZmluZWQoQ09NUDUpCisjZGVmaW5lIFRJTV9USU04X0VUUl9DT01QNSBcCisgIChUSU0xX0FGMV9FVFJTRUxfMiB8ICAgICBcCisgICBUSU0xX0FGMV9FVFJTRUxfMCkgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVA1X09VVCAqLworI2VuZGlmICAgICAgICAgICAgICAgIC8qIENPTVA1ICovCisjaWYgZGVmaW5lZChDT01QNikKKyNkZWZpbmUgVElNX1RJTThfRVRSX0NPTVA2IFwKKyAgKFRJTTFfQUYxX0VUUlNFTF8yIHwgICAgIFwKKyAgIFRJTTFfQUYxX0VUUlNFTF8xKSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDZfT1VUICovCisjZW5kaWYgICAgICAgICAgICAgICAgLyogQ09NUDYgKi8KKyNpZiBkZWZpbmVkKENPTVA3KQorI2RlZmluZSBUSU1fVElNOF9FVFJfQ09NUDcgICAgICAgICAgICAgICAgIFwKKyAgKFRJTTFfQUYxX0VUUlNFTF8yIHwgVElNMV9BRjFfRVRSU0VMXzEgfCBcCisgICBUSU0xX0FGMV9FVFJTRUxfMCkgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVA3X09VVCAqLworI2VuZGlmICAgICAgICAgICAgICAgIC8qIENPTVA3ICovCisjZGVmaW5lIFRJTV9USU04X0VUUl9BREMyX0FXRDEgICAgICAgICAgICAgICAgICBcCisgIFRJTTFfQUYxX0VUUlNFTF8zIC8qITwgQURDMiBhbmFsb2cgd2F0Y2hkb2cgMSBcCisgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fVElNOF9FVFJfQURDMl9BV0QyIFwKKyAgKFRJTTFfQUYxX0VUUlNFTF8zIHwgVElNMV9BRjFfRVRSU0VMXzApIC8qITwgQURDMiBhbmFsb2cgd2F0Y2hkb2cgMiAqLworI2RlZmluZSBUSU1fVElNOF9FVFJfQURDMl9BV0QzIFwKKyAgKFRJTTFfQUYxX0VUUlNFTF8zIHwgVElNMV9BRjFfRVRSU0VMXzEpIC8qITwgQURDMiBhbmFsb2cgd2F0Y2hkb2cgMyAqLworI2lmIGRlZmluZWQoQURDMykKKyNkZWZpbmUgVElNX1RJTThfRVRSX0FEQzNfQVdEMSAgICAgICAgICAgICBcCisgIChUSU0xX0FGMV9FVFJTRUxfMyB8IFRJTTFfQUYxX0VUUlNFTF8xIHwgXAorICAgVElNMV9BRjFfRVRSU0VMXzApIC8qITwgQURDMyBhbmFsb2cgd2F0Y2hkb2cgMSAqLworI2RlZmluZSBUSU1fVElNOF9FVFJfQURDM19BV0QyIFwKKyAgKFRJTTFfQUYxX0VUUlNFTF8zIHwgVElNMV9BRjFfRVRSU0VMXzIpIC8qITwgQURDMyBhbmFsb2cgd2F0Y2hkb2cgMiAqLworI2RlZmluZSBUSU1fVElNOF9FVFJfQURDM19BV0QzICAgICAgICAgICAgIFwKKyAgKFRJTTFfQUYxX0VUUlNFTF8zIHwgVElNMV9BRjFfRVRSU0VMXzIgfCBcCisgICBUSU0xX0FGMV9FVFJTRUxfMCkgLyohPCBBREMzIGFuYWxvZyB3YXRjaGRvZyAzICovCisjZW5kaWYgICAgICAgICAgICAgICAgLyogQURDMyAqLworCisjaWYgZGVmaW5lZChUSU0yMCkKKyNkZWZpbmUgVElNX1RJTTIwX0VUUl9HUElPIDB4MDAwMDAwMDBVIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBHUElPICovCisjZGVmaW5lIFRJTV9USU0yMF9FVFJfQ09NUDEgXAorICBUSU0xX0FGMV9FVFJTRUxfMCAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDFfT1VUICovCisjZGVmaW5lIFRJTV9USU0yMF9FVFJfQ09NUDIgXAorICBUSU0xX0FGMV9FVFJTRUxfMSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDJfT1VUICovCisjZGVmaW5lIFRJTV9USU0yMF9FVFJfQ09NUDMgXAorICAoVElNMV9BRjFfRVRSU0VMXzEgfCAgICAgIFwKKyAgIFRJTTFfQUYxX0VUUlNFTF8wKSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDNfT1VUICovCisjZGVmaW5lIFRJTV9USU0yMF9FVFJfQ09NUDQgXAorICBUSU0xX0FGMV9FVFJTRUxfMiAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDRfT1VUICovCisjaWYgZGVmaW5lZChDT01QNSkKKyNkZWZpbmUgVElNX1RJTTIwX0VUUl9DT01QNSBcCisgIChUSU0xX0FGMV9FVFJTRUxfMiB8ICAgICAgXAorICAgVElNMV9BRjFfRVRSU0VMXzApIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QNV9PVVQgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAvKiBDT01QNSAqLworI2lmIGRlZmluZWQoQ09NUDYpCisjZGVmaW5lIFRJTV9USU0yMF9FVFJfQ09NUDYgXAorICAoVElNMV9BRjFfRVRSU0VMXzIgfCAgICAgIFwKKyAgIFRJTTFfQUYxX0VUUlNFTF8xKSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDZfT1VUICovCisjZW5kaWYgICAgICAgICAgICAgICAgLyogQ09NUDYgKi8KKyNpZiBkZWZpbmVkKENPTVA3KQorI2RlZmluZSBUSU1fVElNMjBfRVRSX0NPTVA3ICAgICAgICAgICAgICAgIFwKKyAgKFRJTTFfQUYxX0VUUlNFTF8yIHwgVElNMV9BRjFfRVRSU0VMXzEgfCBcCisgICBUSU0xX0FGMV9FVFJTRUxfMCkgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVA3X09VVCAqLworI2VuZGlmICAgICAgICAgICAgICAgIC8qIENPTVA3ICovCisjZGVmaW5lIFRJTV9USU0yMF9FVFJfQURDM19BV0QxICAgICAgICAgICAgICAgICBcCisgIFRJTTFfQUYxX0VUUlNFTF8zIC8qITwgQURDMyBhbmFsb2cgd2F0Y2hkb2cgMSBcCisgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fVElNMjBfRVRSX0FEQzNfQVdEMiBcCisgIChUSU0xX0FGMV9FVFJTRUxfMyB8IFRJTTFfQUYxX0VUUlNFTF8wKSAvKiE8IEFEQzMgYW5hbG9nIHdhdGNoZG9nIDIgKi8KKyNkZWZpbmUgVElNX1RJTTIwX0VUUl9BREMzX0FXRDMgXAorICAoVElNMV9BRjFfRVRSU0VMXzMgfCBUSU0xX0FGMV9FVFJTRUxfMSkgLyohPCBBREMzIGFuYWxvZyB3YXRjaGRvZyAzICovCisjaWYgZGVmaW5lZChBREM1KQorI2RlZmluZSBUSU1fVElNMjBfRVRSX0FEQzVfQVdEMSAgICAgICAgICAgIFwKKyAgKFRJTTFfQUYxX0VUUlNFTF8zIHwgVElNMV9BRjFfRVRSU0VMXzEgfCBcCisgICBUSU0xX0FGMV9FVFJTRUxfMCkgLyohPCBBREM1IGFuYWxvZyB3YXRjaGRvZyAxICovCisjZGVmaW5lIFRJTV9USU0yMF9FVFJfQURDNV9BV0QyIFwKKyAgKFRJTTFfQUYxX0VUUlNFTF8zIHwgVElNMV9BRjFfRVRSU0VMXzIpIC8qITwgQURDNSBhbmFsb2cgd2F0Y2hkb2cgMiAqLworI2RlZmluZSBUSU1fVElNMjBfRVRSX0FEQzVfQVdEMyAgICAgICAgICAgIFwKKyAgKFRJTTFfQUYxX0VUUlNFTF8zIHwgVElNMV9BRjFfRVRSU0VMXzIgfCBcCisgICBUSU0xX0FGMV9FVFJTRUxfMCkgLyohPCBBREM1IGFuYWxvZyB3YXRjaGRvZyAzICovCisjZW5kaWYgICAgICAgICAgICAgICAgLyogQURDNSAqLworI2VuZGlmICAgICAgICAgICAgICAgIC8qIFRJTTIwICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1FeF9CcmVha19JbnB1dCBUSU0gRXh0ZW5kZWQgQnJlYWsgaW5wdXQKKyAqIEB7CisgKi8KKyNkZWZpbmUgVElNX0JSRUFLSU5QVVRfQlJLIDB4MDAwMDAwMDFVICAvKiE8IFRpbWVyIGJyZWFrIGlucHV0ICAqLworI2RlZmluZSBUSU1fQlJFQUtJTlBVVF9CUksyIDB4MDAwMDAwMDJVIC8qITwgVGltZXIgYnJlYWsyIGlucHV0ICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1FeF9CcmVha19JbnB1dF9Tb3VyY2UgVElNIEV4dGVuZGVkIEJyZWFrIGlucHV0IHNvdXJjZQorICogQHsKKyAqLworI2RlZmluZSBUSU1fQlJFQUtJTlBVVFNPVVJDRV9CS0lOIFwKKyAgMHgwMDAwMDAwMVUgLyohPCBBbiBleHRlcm5hbCBzb3VyY2UgKEdQSU8pIGlzIGNvbm5lY3RlZCB0byB0aGUgQktJTiBwaW4gICovCisjZGVmaW5lIFRJTV9CUkVBS0lOUFVUU09VUkNFX0NPTVAxIFwKKyAgMHgwMDAwMDAwMlUgLyohPCBUaGUgQ09NUDEgb3V0cHV0IGlzIGNvbm5lY3RlZCB0byB0aGUgYnJlYWsgaW5wdXQgKi8KKyNkZWZpbmUgVElNX0JSRUFLSU5QVVRTT1VSQ0VfQ09NUDIgXAorICAweDAwMDAwMDA0VSAvKiE8IFRoZSBDT01QMiBvdXRwdXQgaXMgY29ubmVjdGVkIHRvIHRoZSBicmVhayBpbnB1dCAqLworI2RlZmluZSBUSU1fQlJFQUtJTlBVVFNPVVJDRV9DT01QMyBcCisgIDB4MDAwMDAwMDhVIC8qITwgVGhlIENPTVAzIG91dHB1dCBpcyBjb25uZWN0ZWQgdG8gdGhlIGJyZWFrIGlucHV0ICovCisjZGVmaW5lIFRJTV9CUkVBS0lOUFVUU09VUkNFX0NPTVA0IFwKKyAgMHgwMDAwMDAxMFUgLyohPCBUaGUgQ09NUDQgb3V0cHV0IGlzIGNvbm5lY3RlZCB0byB0aGUgYnJlYWsgaW5wdXQgKi8KKyNpZiBkZWZpbmVkKENPTVA1KQorI2RlZmluZSBUSU1fQlJFQUtJTlBVVFNPVVJDRV9DT01QNSBcCisgIDB4MDAwMDAwMjBVIC8qITwgVGhlIENPTVA1IG91dHB1dCBpcyBjb25uZWN0ZWQgdG8gdGhlIGJyZWFrIGlucHV0ICovCisjZW5kaWYgICAgICAgIC8qIENPTVA1ICovCisjaWYgZGVmaW5lZChDT01QNikKKyNkZWZpbmUgVElNX0JSRUFLSU5QVVRTT1VSQ0VfQ09NUDYgXAorICAweDAwMDAwMDQwVSAvKiE8IFRoZSBDT01QNiBvdXRwdXQgaXMgY29ubmVjdGVkIHRvIHRoZSBicmVhayBpbnB1dCAqLworI2VuZGlmICAgICAgICAvKiBDT01QNiAqLworI2lmIGRlZmluZWQoQ09NUDcpCisjZGVmaW5lIFRJTV9CUkVBS0lOUFVUU09VUkNFX0NPTVA3IFwKKyAgMHgwMDAwMDA4MFUgLyohPCBUaGUgQ09NUDcgb3V0cHV0IGlzIGNvbm5lY3RlZCB0byB0aGUgYnJlYWsgaW5wdXQgKi8KKyNlbmRpZiAgICAgICAgLyogQ09NUDcgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFRJTUV4X0JyZWFrX0lucHV0X1NvdXJjZV9FbmFibGUgVElNIEV4dGVuZGVkIEJyZWFrIGlucHV0IHNvdXJjZQorICogZW5hYmxpbmcKKyAqIEB7CisgKi8KKyNkZWZpbmUgVElNX0JSRUFLSU5QVVRTT1VSQ0VfRElTQUJMRSBcCisgIDB4MDAwMDAwMDBVIC8qITwgQnJlYWsgaW5wdXQgc291cmNlIGlzIGRpc2FibGVkICovCisjZGVmaW5lIFRJTV9CUkVBS0lOUFVUU09VUkNFX0VOQUJMRSBcCisgIDB4MDAwMDAwMDFVIC8qITwgQnJlYWsgaW5wdXQgc291cmNlIGlzIGVuYWJsZWQgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFRJTUV4X0JyZWFrX0lucHV0X1NvdXJjZV9Qb2xhcml0eSBUSU0gRXh0ZW5kZWQgQnJlYWsgaW5wdXQKKyAqIHBvbGFyaXR5CisgKiBAeworICovCisjZGVmaW5lIFRJTV9CUkVBS0lOUFVUU09VUkNFX1BPTEFSSVRZX0xPVyBcCisgIDB4MDAwMDAwMDFVIC8qITwgQnJlYWsgaW5wdXQgc291cmNlIGlzIGFjdGl2ZSBsb3cgKi8KKyNkZWZpbmUgVElNX0JSRUFLSU5QVVRTT1VSQ0VfUE9MQVJJVFlfSElHSCBcCisgIDB4MDAwMDAwMDBVIC8qITwgQnJlYWsgaW5wdXQgc291cmNlIGlzIGFjdGl2ZV9oaWdoICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1FeF9UaW1lcl9JbnB1dF9TZWxlY3Rpb24gVElNIEV4dGVuZGVkIFRpbWVyIGlucHV0IHNlbGVjdGlvbgorICogQHsKKyAqLworI2RlZmluZSBUSU1fVElNMV9USTFfR1BJTyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMDAwMDBVIC8qITwgVElNMSBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBHUElPIFwKKyAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9USU0xX1RJMV9DT01QMSBcCisgIFRJTV9USVNFTF9USTFTRUxfMCAvKiE8IFRJTTEgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDFfT1VUICovCisjZGVmaW5lIFRJTV9USU0xX1RJMV9DT01QMiBcCisgIFRJTV9USVNFTF9USTFTRUxfMSAvKiE8IFRJTTEgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDJfT1VUICovCisjZGVmaW5lIFRJTV9USU0xX1RJMV9DT01QMyBcCisgIChUSU1fVElTRUxfVEkxU0VMXzEgfCAgICBcCisgICBUSU1fVElTRUxfVEkxU0VMXzApIC8qITwgVElNMSBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QM19PVVQgKi8KKyNkZWZpbmUgVElNX1RJTTFfVEkxX0NPTVA0IFwKKyAgVElNX1RJU0VMX1RJMVNFTF8yIC8qITwgVElNMSBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QNF9PVVQgKi8KKworI2RlZmluZSBUSU1fVElNMl9USTFfR1BJTyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMDAwMDBVIC8qITwgVElNMiBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBHUElPIFwKKyAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9USU0yX1RJMV9DT01QMSBcCisgIFRJTV9USVNFTF9USTFTRUxfMCAvKiE8IFRJTTIgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDFfT1VUICovCisjZGVmaW5lIFRJTV9USU0yX1RJMV9DT01QMiBcCisgIFRJTV9USVNFTF9USTFTRUxfMSAvKiE8IFRJTTIgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDJfT1VUICovCisjZGVmaW5lIFRJTV9USU0yX1RJMV9DT01QMyBcCisgIChUSU1fVElTRUxfVEkxU0VMXzEgfCAgICBcCisgICBUSU1fVElTRUxfVEkxU0VMXzApIC8qITwgVElNMiBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QM19PVVQgKi8KKyNkZWZpbmUgVElNX1RJTTJfVEkxX0NPTVA0IFwKKyAgVElNX1RJU0VMX1RJMVNFTF8yIC8qITwgVElNMiBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QNF9PVVQgKi8KKyNpZiBkZWZpbmVkKENPTVA1KQorI2RlZmluZSBUSU1fVElNMl9USTFfQ09NUDUgXAorICAoVElNX1RJU0VMX1RJMVNFTF8yIHwgICAgXAorICAgVElNX1RJU0VMX1RJMVNFTF8wKSAvKiE8IFRJTTIgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDVfT1VUICovCisjZW5kaWYgICAgICAgICAgICAgICAgIC8qIENPTVA1ICovCisKKyNkZWZpbmUgVElNX1RJTTJfVEkyX0dQSU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAweDAwMDAwMDAwVSAvKiE8IFRJTTIgaW5wdXQgMiBpcyBjb25uZWN0ZWQgdG8gR1BJTyBcCisgICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fVElNMl9USTJfQ09NUDEgXAorICBUSU1fVElTRUxfVEkyU0VMXzAgLyohPCBUSU0yIGlucHV0IDIgaXMgY29ubmVjdGVkIHRvIENPTVAxX09VVCAqLworI2RlZmluZSBUSU1fVElNMl9USTJfQ09NUDIgXAorICBUSU1fVElTRUxfVEkyU0VMXzEgLyohPCBUSU0yIGlucHV0IDIgaXMgY29ubmVjdGVkIHRvIENPTVAyX09VVCAqLworI2RlZmluZSBUSU1fVElNMl9USTJfQ09NUDMgXAorICAoVElNX1RJU0VMX1RJMlNFTF8xIHwgICAgXAorICAgVElNX1RJU0VMX1RJMlNFTF8wKSAvKiE8IFRJTTIgaW5wdXQgMiBpcyBjb25uZWN0ZWQgdG8gQ09NUDNfT1VUICovCisjZGVmaW5lIFRJTV9USU0yX1RJMl9DT01QNCBcCisgIFRJTV9USVNFTF9USTJTRUxfMiAvKiE8IFRJTTIgaW5wdXQgMiBpcyBjb25uZWN0ZWQgdG8gQ09NUDRfT1VUICovCisjaWYgZGVmaW5lZChDT01QNikKKyNkZWZpbmUgVElNX1RJTTJfVEkyX0NPTVA2IFwKKyAgKFRJTV9USVNFTF9USTJTRUxfMiB8ICAgIFwKKyAgIFRJTV9USVNFTF9USTJTRUxfMCkgLyohPCBUSU0yIGlucHV0IDIgaXMgY29ubmVjdGVkIHRvIENPTVA2X09VVCAqLworI2VuZGlmICAgICAgICAgICAgICAgICAvKiBDT01QNiAqLworCisjZGVmaW5lIFRJTV9USU0yX1RJM19HUElPICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBUSU0yIGlucHV0IDMgaXMgY29ubmVjdGVkIHRvIEdQSU8gXAorICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX1RJTTJfVEkzX0NPTVA0IFwKKyAgVElNX1RJU0VMX1RJM1NFTF8wIC8qITwgVElNMiBpbnB1dCAzIGlzIGNvbm5lY3RlZCB0byBDT01QNF9PVVQgKi8KKworI2RlZmluZSBUSU1fVElNMl9USTRfR1BJTyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMDAwMDBVIC8qITwgVElNMiBpbnB1dCA0IGlzIGNvbm5lY3RlZCB0byBHUElPIFwKKyAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9USU0yX1RJNF9DT01QMSBcCisgIFRJTV9USVNFTF9USTRTRUxfMCAvKiE8IFRJTTIgaW5wdXQgNCBpcyBjb25uZWN0ZWQgdG8gQ09NUDFfT1VUICovCisjZGVmaW5lIFRJTV9USU0yX1RJNF9DT01QMiBcCisgIFRJTV9USVNFTF9USTRTRUxfMSAvKiE8IFRJTTIgaW5wdXQgNCBpcyBjb25uZWN0ZWQgdG8gQ09NUDJfT1VUICovCisKKyNkZWZpbmUgVElNX1RJTTNfVEkxX0dQSU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAweDAwMDAwMDAwVSAvKiE8IFRJTTMgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gR1BJTyBcCisgICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fVElNM19USTFfQ09NUDEgXAorICBUSU1fVElTRUxfVEkxU0VMXzAgLyohPCBUSU0zIGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVAxX09VVCAqLworI2RlZmluZSBUSU1fVElNM19USTFfQ09NUDIgXAorICBUSU1fVElTRUxfVEkxU0VMXzEgLyohPCBUSU0zIGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVAyX09VVCAqLworI2RlZmluZSBUSU1fVElNM19USTFfQ09NUDMgXAorICAoVElNX1RJU0VMX1RJMVNFTF8xIHwgICAgXAorICAgVElNX1RJU0VMX1RJMVNFTF8wKSAvKiE8IFRJTTMgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDNfT1VUICovCisjZGVmaW5lIFRJTV9USU0zX1RJMV9DT01QNCBcCisgIFRJTV9USVNFTF9USTFTRUxfMiAvKiE8IFRJTTMgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDRfT1VUICovCisjaWYgZGVmaW5lZChDT01QNSkKKyNkZWZpbmUgVElNX1RJTTNfVEkxX0NPTVA1IFwKKyAgKFRJTV9USVNFTF9USTFTRUxfMiB8ICAgIFwKKyAgIFRJTV9USVNFTF9USTFTRUxfMCkgLyohPCBUSU0zIGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVA1X09VVCAqLworI2VuZGlmICAgICAgICAgICAgICAgICAvKiBDT01QNSAqLworI2lmIGRlZmluZWQoQ09NUDYpCisjZGVmaW5lIFRJTV9USU0zX1RJMV9DT01QNiBcCisgIChUSU1fVElTRUxfVEkxU0VMXzIgfCAgICBcCisgICBUSU1fVElTRUxfVEkxU0VMXzEpIC8qITwgVElNMyBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QNl9PVVQgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAgLyogQ09NUDYgKi8KKyNpZiBkZWZpbmVkKENPTVA3KQorI2RlZmluZSBUSU1fVElNM19USTFfQ09NUDcgICAgICAgICAgICAgICAgICAgXAorICAoVElNX1RJU0VMX1RJMVNFTF8yIHwgVElNX1RJU0VMX1RJMVNFTF8xIHwgXAorICAgVElNX1RJU0VMX1RJMVNFTF8wKSAvKiE8IFRJTTMgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDdfT1VUICovCisjZW5kaWYgICAgICAgICAgICAgICAgIC8qIENPTVA3ICovCisKKyNkZWZpbmUgVElNX1RJTTNfVEkyX0dQSU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAweDAwMDAwMDAwVSAvKiE8IFRJTTMgaW5wdXQgMiBpcyBjb25uZWN0ZWQgdG8gR1BJTyBcCisgICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fVElNM19USTJfQ09NUDEgXAorICBUSU1fVElTRUxfVEkyU0VMXzAgLyohPCBUSU0zIGlucHV0IDIgaXMgY29ubmVjdGVkIHRvIENPTVAxX09VVCAqLworI2RlZmluZSBUSU1fVElNM19USTJfQ09NUDIgXAorICBUSU1fVElTRUxfVEkyU0VMXzEgLyohPCBUSU0zIGlucHV0IDIgaXMgY29ubmVjdGVkIHRvIENPTVAyX09VVCAqLworI2RlZmluZSBUSU1fVElNM19USTJfQ09NUDMgXAorICAoVElNX1RJU0VMX1RJMlNFTF8xIHwgICAgXAorICAgVElNX1RJU0VMX1RJMlNFTF8wKSAvKiE8IFRJTTMgaW5wdXQgMiBpcyBjb25uZWN0ZWQgdG8gQ09NUDNfT1VUICovCisjZGVmaW5lIFRJTV9USU0zX1RJMl9DT01QNCBcCisgIFRJTV9USVNFTF9USTJTRUxfMiAvKiE8IFRJTTMgaW5wdXQgMiBpcyBjb25uZWN0ZWQgdG8gQ09NUDRfT1VUICovCisjaWYgZGVmaW5lZChDT01QNSkKKyNkZWZpbmUgVElNX1RJTTNfVEkyX0NPTVA1IFwKKyAgKFRJTV9USVNFTF9USTJTRUxfMiB8ICAgIFwKKyAgIFRJTV9USVNFTF9USTJTRUxfMCkgLyohPCBUSU0zIGlucHV0IDIgaXMgY29ubmVjdGVkIHRvIENPTVA1X09VVCAqLworI2VuZGlmICAgICAgICAgICAgICAgICAvKiBDT01QNSAqLworI2lmIGRlZmluZWQoQ09NUDYpCisjZGVmaW5lIFRJTV9USU0zX1RJMl9DT01QNiBcCisgIChUSU1fVElTRUxfVEkyU0VMXzIgfCAgICBcCisgICBUSU1fVElTRUxfVEkyU0VMXzEpIC8qITwgVElNMyBpbnB1dCAyIGlzIGNvbm5lY3RlZCB0byBDT01QNl9PVVQgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAgLyogQ09NUDYgKi8KKyNpZiBkZWZpbmVkKENPTVA3KQorI2RlZmluZSBUSU1fVElNM19USTJfQ09NUDcgICAgICAgICAgICAgICAgICAgXAorICAoVElNX1RJU0VMX1RJMlNFTF8yIHwgVElNX1RJU0VMX1RJMlNFTF8xIHwgXAorICAgVElNX1RJU0VMX1RJMlNFTF8wKSAvKiE8IFRJTTMgaW5wdXQgMiBpcyBjb25uZWN0ZWQgdG8gQ09NUDdfT1VUICovCisjZW5kaWYgICAgICAgICAgICAgICAgIC8qIENPTVA3ICovCisKKyNkZWZpbmUgVElNX1RJTTNfVEkzX0dQSU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAweDAwMDAwMDAwVSAvKiE8IFRJTTMgaW5wdXQgMyBpcyBjb25uZWN0ZWQgdG8gR1BJTyBcCisgICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fVElNM19USTNfQ09NUDMgXAorICBUSU1fVElTRUxfVEkzU0VMXzAgLyohPCBUSU0zIGlucHV0IDMgaXMgY29ubmVjdGVkIHRvIENPTVAzX09VVCAqLworCisjZGVmaW5lIFRJTV9USU00X1RJMV9HUElPICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBUSU00IGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIEdQSU8gXAorICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX1RJTTRfVEkxX0NPTVAxIFwKKyAgVElNX1RJU0VMX1RJMVNFTF8wIC8qITwgVElNNCBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QMV9PVVQgKi8KKyNkZWZpbmUgVElNX1RJTTRfVEkxX0NPTVAyIFwKKyAgVElNX1RJU0VMX1RJMVNFTF8xIC8qITwgVElNNCBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QMl9PVVQgKi8KKyNkZWZpbmUgVElNX1RJTTRfVEkxX0NPTVAzIFwKKyAgKFRJTV9USVNFTF9USTFTRUxfMSB8ICAgIFwKKyAgIFRJTV9USVNFTF9USTFTRUxfMCkgLyohPCBUSU00IGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVAzX09VVCAqLworI2RlZmluZSBUSU1fVElNNF9USTFfQ09NUDQgXAorICBUSU1fVElTRUxfVEkxU0VMXzIgLyohPCBUSU00IGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVA0X09VVCAqLworI2lmIGRlZmluZWQoQ09NUDUpCisjZGVmaW5lIFRJTV9USU00X1RJMV9DT01QNSBcCisgIChUSU1fVElTRUxfVEkxU0VMXzIgfCAgICBcCisgICBUSU1fVElTRUxfVEkxU0VMXzApIC8qITwgVElNNCBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QNV9PVVQgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAgLyogQ09NUDUgKi8KKyNpZiBkZWZpbmVkKENPTVA2KQorI2RlZmluZSBUSU1fVElNNF9USTFfQ09NUDYgXAorICAoVElNX1RJU0VMX1RJMVNFTF8yIHwgICAgXAorICAgVElNX1RJU0VMX1RJMVNFTF8xKSAvKiE8IFRJTTQgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDZfT1VUICovCisjZW5kaWYgICAgICAgICAgICAgICAgIC8qIENPTVA2ICovCisjaWYgZGVmaW5lZChDT01QNykKKyNkZWZpbmUgVElNX1RJTTRfVEkxX0NPTVA3ICAgICAgICAgICAgICAgICAgIFwKKyAgKFRJTV9USVNFTF9USTFTRUxfMiB8IFRJTV9USVNFTF9USTFTRUxfMSB8IFwKKyAgIFRJTV9USVNFTF9USTFTRUxfMCkgLyohPCBUSU00IGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVA3X09VVCAqLworI2VuZGlmICAgICAgICAgICAgICAgICAvKiBDT01QNyAqLworCisjZGVmaW5lIFRJTV9USU00X1RJMl9HUElPICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBUSU00IGlucHV0IDIgaXMgY29ubmVjdGVkIHRvIEdQSU8gXAorICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX1RJTTRfVEkyX0NPTVAxIFwKKyAgVElNX1RJU0VMX1RJMlNFTF8wIC8qITwgVElNNCBpbnB1dCAyIGlzIGNvbm5lY3RlZCB0byBDT01QMV9PVVQgKi8KKyNkZWZpbmUgVElNX1RJTTRfVEkyX0NPTVAyIFwKKyAgVElNX1RJU0VMX1RJMlNFTF8xIC8qITwgVElNNCBpbnB1dCAyIGlzIGNvbm5lY3RlZCB0byBDT01QMl9PVVQgKi8KKyNkZWZpbmUgVElNX1RJTTRfVEkyX0NPTVAzIFwKKyAgKFRJTV9USVNFTF9USTJTRUxfMSB8ICAgIFwKKyAgIFRJTV9USVNFTF9USTJTRUxfMCkgLyohPCBUSU00IGlucHV0IDIgaXMgY29ubmVjdGVkIHRvIENPTVAzX09VVCAqLworI2RlZmluZSBUSU1fVElNNF9USTJfQ09NUDQgXAorICBUSU1fVElTRUxfVEkyU0VMXzIgLyohPCBUSU00IGlucHV0IDIgaXMgY29ubmVjdGVkIHRvIENPTVA0X09VVCAqLworI2lmIGRlZmluZWQoQ09NUDUpCisjZGVmaW5lIFRJTV9USU00X1RJMl9DT01QNSBcCisgIChUSU1fVElTRUxfVEkyU0VMXzIgfCAgICBcCisgICBUSU1fVElTRUxfVEkyU0VMXzApIC8qITwgVElNNCBpbnB1dCAyIGlzIGNvbm5lY3RlZCB0byBDT01QNV9PVVQgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAgLyogQ09NUDUgKi8KKyNpZiBkZWZpbmVkKENPTVA2KQorI2RlZmluZSBUSU1fVElNNF9USTJfQ09NUDYgXAorICAoVElNX1RJU0VMX1RJMlNFTF8yIHwgICAgXAorICAgVElNX1RJU0VMX1RJMlNFTF8xKSAvKiE8IFRJTTQgaW5wdXQgMiBpcyBjb25uZWN0ZWQgdG8gQ09NUDZfT1VUICovCisjZW5kaWYgICAgICAgICAgICAgICAgIC8qIENPTVA2ICovCisjaWYgZGVmaW5lZChDT01QNykKKyNkZWZpbmUgVElNX1RJTTRfVEkyX0NPTVA3ICAgICAgICAgICAgICAgICAgIFwKKyAgKFRJTV9USVNFTF9USTJTRUxfMiB8IFRJTV9USVNFTF9USTJTRUxfMSB8IFwKKyAgIFRJTV9USVNFTF9USTJTRUxfMCkgLyohPCBUSU00IGlucHV0IDIgaXMgY29ubmVjdGVkIHRvIENPTVA3X09VVCAqLworI2VuZGlmICAgICAgICAgICAgICAgICAvKiBDT01QNyAqLworCisjZGVmaW5lIFRJTV9USU00X1RJM19HUElPICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBUSU00IGlucHV0IDMgaXMgY29ubmVjdGVkIHRvIEdQSU8gXAorICAgICAgICAgICAgICAgKi8KKyNpZiBkZWZpbmVkKENPTVA1KQorI2RlZmluZSBUSU1fVElNNF9USTNfQ09NUDUgXAorICBUSU1fVElTRUxfVEkzU0VMXzAgLyohPCBUSU00IGlucHV0IDMgaXMgY29ubmVjdGVkIHRvIENPTVA1X09VVCAqLworI2VuZGlmICAgICAgICAgICAgICAgLyogQ09NUDUgKi8KKworI2RlZmluZSBUSU1fVElNNF9USTRfR1BJTyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMDAwMDBVIC8qITwgVElNNCBpbnB1dCA0IGlzIGNvbm5lY3RlZCB0byBHUElPIFwKKyAgICAgICAgICAgICAgICovCisjaWYgZGVmaW5lZChDT01QNikKKyNkZWZpbmUgVElNX1RJTTRfVEk0X0NPTVA2IFwKKyAgVElNX1RJU0VMX1RJNFNFTF8wIC8qITwgVElNNCBpbnB1dCA0IGlzIGNvbm5lY3RlZCB0byBDT01QNl9PVVQgKi8KKyNlbmRpZiAgICAgICAgICAgICAgIC8qIENPTVA2ICovCisKKyNpZiBkZWZpbmVkKFRJTTUpCisjZGVmaW5lIFRJTV9USU01X1RJMV9HUElPICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBUSU01IGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIEdQSU8gXAorICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX1RJTTVfVEkxX0xTSSBcCisgIFRJTV9USVNFTF9USTFTRUxfMCAvKiE8IFRJTTUgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gTFNJICovCisjZGVmaW5lIFRJTV9USU01X1RJMV9MU0UgXAorICBUSU1fVElTRUxfVEkxU0VMXzEgLyohPCBUSU01IGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIExTRSAqLworI2RlZmluZSBUSU1fVElNNV9USTFfUlRDX1dLIFwKKyAgKFRJTV9USVNFTF9USTFTRUxfMSB8ICAgICBcCisgICBUSU1fVElTRUxfVEkxU0VMXzApIC8qITwgVElNNSBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBSVENfV0FLRVVQICovCisjZGVmaW5lIFRJTV9USU01X1RJMV9DT01QMSBcCisgIFRJTV9USVNFTF9USTFTRUxfMiAvKiE8IFRJTTUgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDFfT1VUICovCisjZGVmaW5lIFRJTV9USU01X1RJMV9DT01QMiBcCisgIChUSU1fVElTRUxfVEkxU0VMXzIgfCAgICBcCisgICBUSU1fVElTRUxfVEkxU0VMXzApIC8qITwgVElNNSBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QMl9PVVQgKi8KKyNkZWZpbmUgVElNX1RJTTVfVEkxX0NPTVAzIFwKKyAgKFRJTV9USVNFTF9USTFTRUxfMiB8ICAgIFwKKyAgIFRJTV9USVNFTF9USTFTRUxfMSkgLyohPCBUSU01IGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVAzX09VVCAqLworI2RlZmluZSBUSU1fVElNNV9USTFfQ09NUDQgICAgICAgICAgICAgICAgICAgXAorICAoVElNX1RJU0VMX1RJMVNFTF8yIHwgVElNX1RJU0VMX1RJMVNFTF8xIHwgXAorICAgVElNX1RJU0VMX1RJMVNFTF8wKSAvKiE8IFRJTTUgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDRfT1VUICovCisjaWYgZGVmaW5lZChDT01QNSkKKyNkZWZpbmUgVElNX1RJTTVfVEkxX0NPTVA1IFwKKyAgVElNX1RJU0VMX1RJMVNFTF8zIC8qITwgVElNNSBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QNV9PVVQgKi8KKyNlbmRpZiAgICAgICAgICAgICAgIC8qIENPTVA1ICovCisjaWYgZGVmaW5lZChDT01QNikKKyNkZWZpbmUgVElNX1RJTTVfVEkxX0NPTVA2IFwKKyAgKFRJTV9USVNFTF9USTFTRUxfMyB8ICAgIFwKKyAgIFRJTV9USVNFTF9USTFTRUxfMCkgLyohPCBUSU01IGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVA2X09VVCAqLworI2VuZGlmICAgICAgICAgICAgICAgICAvKiBDT01QNiAqLworI2lmIGRlZmluZWQoQ09NUDcpCisjZGVmaW5lIFRJTV9USU01X1RJMV9DT01QNyBcCisgIChUSU1fVElTRUxfVEkxU0VMXzMgfCAgICBcCisgICBUSU1fVElTRUxfVEkxU0VMXzEpIC8qITwgVElNNSBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QN19PVVQgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAgLyogQ09NUDcgKi8KKworI2RlZmluZSBUSU1fVElNNV9USTJfR1BJTyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMDAwMDBVIC8qITwgVElNNSBpbnB1dCAyIGlzIGNvbm5lY3RlZCB0byBHUElPIFwKKyAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9USU01X1RJMl9DT01QMSBcCisgIFRJTV9USVNFTF9USTJTRUxfMCAvKiE8IFRJTTUgaW5wdXQgMiBpcyBjb25uZWN0ZWQgdG8gQ09NUDFfT1VUICovCisjZGVmaW5lIFRJTV9USU01X1RJMl9DT01QMiBcCisgIFRJTV9USVNFTF9USTJTRUxfMSAvKiE8IFRJTTUgaW5wdXQgMiBpcyBjb25uZWN0ZWQgdG8gQ09NUDJfT1VUICovCisjZGVmaW5lIFRJTV9USU01X1RJMl9DT01QMyBcCisgIChUSU1fVElTRUxfVEkyU0VMXzEgfCAgICBcCisgICBUSU1fVElTRUxfVEkyU0VMXzApIC8qITwgVElNNSBpbnB1dCAyIGlzIGNvbm5lY3RlZCB0byBDT01QM19PVVQgKi8KKyNkZWZpbmUgVElNX1RJTTVfVEkyX0NPTVA0IFwKKyAgVElNX1RJU0VMX1RJMlNFTF8yIC8qITwgVElNNSBpbnB1dCAyIGlzIGNvbm5lY3RlZCB0byBDT01QNF9PVVQgKi8KKyNpZiBkZWZpbmVkKENPTVA1KQorI2RlZmluZSBUSU1fVElNNV9USTJfQ09NUDUgXAorICAoVElNX1RJU0VMX1RJMlNFTF8yIHwgICAgXAorICAgVElNX1RJU0VMX1RJMlNFTF8wKSAvKiE8IFRJTTUgaW5wdXQgMiBpcyBjb25uZWN0ZWQgdG8gQ09NUDVfT1VUICovCisjZW5kaWYgICAgICAgICAgICAgICAgIC8qIENPTVA1ICovCisjaWYgZGVmaW5lZChDT01QNikKKyNkZWZpbmUgVElNX1RJTTVfVEkyX0NPTVA2IFwKKyAgKFRJTV9USVNFTF9USTJTRUxfMiB8ICAgIFwKKyAgIFRJTV9USVNFTF9USTJTRUxfMSkgLyohPCBUSU01IGlucHV0IDIgaXMgY29ubmVjdGVkIHRvIENPTVA2X09VVCAqLworI2VuZGlmICAgICAgICAgICAgICAgICAvKiBDT01QNiAqLworI2lmIGRlZmluZWQoQ09NUDcpCisjZGVmaW5lIFRJTV9USU01X1RJMl9DT01QNyAgICAgICAgICAgICAgICAgICBcCisgIChUSU1fVElTRUxfVEkyU0VMXzIgfCBUSU1fVElTRUxfVEkyU0VMXzEgfCBcCisgICBUSU1fVElTRUxfVEkyU0VMXzApIC8qITwgVElNNSBpbnB1dCAyIGlzIGNvbm5lY3RlZCB0byBDT01QN19PVVQgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAgLyogQ09NUDcgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAgLyogVElNNSAqLworCisjZGVmaW5lIFRJTV9USU04X1RJMV9HUElPICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBUSU04IGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIEdQSU8gXAorICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX1RJTThfVEkxX0NPTVAxIFwKKyAgVElNX1RJU0VMX1RJMVNFTF8wIC8qITwgVElNOCBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QMV9PVVQgKi8KKyNkZWZpbmUgVElNX1RJTThfVEkxX0NPTVAyIFwKKyAgVElNX1RJU0VMX1RJMVNFTF8xIC8qITwgVElNOCBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QMl9PVVQgKi8KKyNkZWZpbmUgVElNX1RJTThfVEkxX0NPTVAzIFwKKyAgKFRJTV9USVNFTF9USTFTRUxfMSB8ICAgIFwKKyAgIFRJTV9USVNFTF9USTFTRUxfMCkgLyohPCBUSU04IGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVAzX09VVCAqLworI2RlZmluZSBUSU1fVElNOF9USTFfQ09NUDQgXAorICBUSU1fVElTRUxfVEkxU0VMXzIgLyohPCBUSU04IGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVA0X09VVCAqLworCisjZGVmaW5lIFRJTV9USU0xNV9USTFfR1BJTyBcCisgIDB4MDAwMDAwMDBVIC8qITwgVElNMTUgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gR1BJTyAqLworI2RlZmluZSBUSU1fVElNMTVfVEkxX0xTRSBcCisgIFRJTV9USVNFTF9USTFTRUxfMCAvKiE8IFRJTTE1IGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIExTRSAqLworI2RlZmluZSBUSU1fVElNMTVfVEkxX0NPTVAxIFwKKyAgVElNX1RJU0VMX1RJMVNFTF8xIC8qITwgVElNMTUgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDFfT1VUICovCisjZGVmaW5lIFRJTV9USU0xNV9USTFfQ09NUDIgXAorICAoVElNX1RJU0VMX1RJMVNFTF8xIHwgICAgIFwKKyAgIFRJTV9USVNFTF9USTFTRUxfMCkgLyohPCBUSU0xNSBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QMl9PVVQgKi8KKyNpZiBkZWZpbmVkKENPTVA1KQorI2RlZmluZSBUSU1fVElNMTVfVEkxX0NPTVA1IFwKKyAgVElNX1RJU0VMX1RJMVNFTF8yIC8qITwgVElNMTUgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDVfT1VUICovCisjZW5kaWYgICAgICAgICAgICAgICAvKiBDT01QNSAqLworI2lmIGRlZmluZWQoQ09NUDcpCisjZGVmaW5lIFRJTV9USU0xNV9USTFfQ09NUDcgXAorICAoVElNX1RJU0VMX1RJMVNFTF8yIHwgICAgIFwKKyAgIFRJTV9USVNFTF9USTFTRUxfMCkgLyohPCBUSU0xNSBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QN19PVVQgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAgLyogQ09NUDcgKi8KKworI2RlZmluZSBUSU1fVElNMTVfVEkyX0dQSU8gXAorICAweDAwMDAwMDAwVSAvKiE8IFRJTTE1IGlucHV0IDIgaXMgY29ubmVjdGVkIHRvIEdQSU8gKi8KKyNkZWZpbmUgVElNX1RJTTE1X1RJMl9DT01QMiBcCisgIFRJTV9USVNFTF9USTJTRUxfMCAvKiE8IFRJTTE1IGlucHV0IDIgaXMgY29ubmVjdGVkIHRvIENPTVAyX09VVCAqLworI2RlZmluZSBUSU1fVElNMTVfVEkyX0NPTVAzIFwKKyAgVElNX1RJU0VMX1RJMlNFTF8xIC8qITwgVElNMTUgaW5wdXQgMiBpcyBjb25uZWN0ZWQgdG8gQ09NUDNfT1VUICovCisjaWYgZGVmaW5lZChDT01QNikKKyNkZWZpbmUgVElNX1RJTTE1X1RJMl9DT01QNiBcCisgIChUSU1fVElTRUxfVEkyU0VMXzEgfCAgICAgXAorICAgVElNX1RJU0VMX1RJMlNFTF8wKSAvKiE8IFRJTTE1IGlucHV0IDIgaXMgY29ubmVjdGVkIHRvIENPTVA2X09VVCAqLworI2VuZGlmICAgICAgICAgICAgICAgICAvKiBDT01QNiAqLworI2lmIGRlZmluZWQoQ09NUDcpCisjZGVmaW5lIFRJTV9USU0xNV9USTJfQ09NUDcgXAorICBUSU1fVElTRUxfVEkyU0VMXzIgLyohPCBUSU0xNSBpbnB1dCAyIGlzIGNvbm5lY3RlZCB0byBDT01QN19PVVQgKi8KKyNlbmRpZiAgICAgICAgICAgICAgIC8qIENPTVA3ICovCisKKyNkZWZpbmUgVElNX1RJTTE2X1RJMV9HUElPIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBUSU0xNiBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBHUElPICovCisjaWYgZGVmaW5lZChDT01QNikKKyNkZWZpbmUgVElNX1RJTTE2X1RJMV9DT01QNiBcCisgIFRJTV9USVNFTF9USTFTRUxfMCAvKiE8IFRJTTE2IGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVA2X09VVCAqLworI2VuZGlmICAgICAgICAgICAgICAgLyogQ09NUDYgKi8KKyNkZWZpbmUgVElNX1RJTTE2X1RJMV9NQ08gXAorICBUSU1fVElTRUxfVEkxU0VMXzEgLyohPCBUSU0xNiBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBNQ08gKi8KKyNkZWZpbmUgVElNX1RJTTE2X1RJMV9IU0VfMzIgXAorICAoVElNX1RJU0VMX1RJMVNFTF8xIHwgICAgICBcCisgICBUSU1fVElTRUxfVEkxU0VMXzApIC8qITwgVElNMTYgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gSFNFLzMyICovCisjZGVmaW5lIFRJTV9USU0xNl9USTFfUlRDX1dLIFwKKyAgVElNX1RJU0VMX1RJMVNFTF8yIC8qITwgVElNMTYgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gUlRDX1dBS0VVUCAqLworI2RlZmluZSBUSU1fVElNMTZfVEkxX0xTRSBcCisgIChUSU1fVElTRUxfVEkxU0VMXzIgfCAgIFwKKyAgIFRJTV9USVNFTF9USTFTRUxfMCkgLyohPCBUSU0xNiBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBMU0UgKi8KKyNkZWZpbmUgVElNX1RJTTE2X1RJMV9MU0kgXAorICAoVElNX1RJU0VMX1RJMVNFTF8yIHwgICBcCisgICBUSU1fVElTRUxfVEkxU0VMXzEpIC8qITwgVElNMTYgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gTFNJICovCisKKyNkZWZpbmUgVElNX1RJTTE3X1RJMV9HUElPIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBUSU0xNyBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBHUElPICovCisjaWYgZGVmaW5lZChDT01QNSkKKyNkZWZpbmUgVElNX1RJTTE3X1RJMV9DT01QNSBcCisgIFRJTV9USVNFTF9USTFTRUxfMCAvKiE8IFRJTTE3IGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVA1X09VVCAqLworI2VuZGlmICAgICAgICAgICAgICAgLyogQ09NUDUgKi8KKyNkZWZpbmUgVElNX1RJTTE3X1RJMV9NQ08gXAorICBUSU1fVElTRUxfVEkxU0VMXzEgLyohPCBUSU0xNyBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBNQ08gKi8KKyNkZWZpbmUgVElNX1RJTTE3X1RJMV9IU0VfMzIgXAorICAoVElNX1RJU0VMX1RJMVNFTF8xIHwgICAgICBcCisgICBUSU1fVElTRUxfVEkxU0VMXzApIC8qITwgVElNMTcgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gSFNFLzMyICovCisjZGVmaW5lIFRJTV9USU0xN19USTFfUlRDX1dLIFwKKyAgVElNX1RJU0VMX1RJMVNFTF8yIC8qITwgVElNMTcgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gUlRDX1dBS0VVUCAqLworI2RlZmluZSBUSU1fVElNMTdfVEkxX0xTRSBcCisgIChUSU1fVElTRUxfVEkxU0VMXzIgfCAgIFwKKyAgIFRJTV9USVNFTF9USTFTRUxfMCkgLyohPCBUSU0xNyBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBMU0UgKi8KKyNkZWZpbmUgVElNX1RJTTE3X1RJMV9MU0kgXAorICAoVElNX1RJU0VMX1RJMVNFTF8yIHwgICBcCisgICBUSU1fVElTRUxfVEkxU0VMXzEpIC8qITwgVElNMTcgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gTFNJICovCisKKyNpZiBkZWZpbmVkKFRJTTIwKQorI2RlZmluZSBUSU1fVElNMjBfVEkxX0dQSU8gXAorICAweDAwMDAwMDAwVSAvKiE8IFRJTTIwIGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIEdQSU8gKi8KKyNkZWZpbmUgVElNX1RJTTIwX1RJMV9DT01QMSBcCisgIFRJTV9USVNFTF9USTFTRUxfMCAvKiE8IFRJTTIwIGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVAxX09VVCAqLworI2RlZmluZSBUSU1fVElNMjBfVEkxX0NPTVAyIFwKKyAgVElNX1RJU0VMX1RJMVNFTF8xIC8qITwgVElNMjAgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDJfT1VUICovCisjZGVmaW5lIFRJTV9USU0yMF9USTFfQ09NUDMgXAorICAoVElNX1RJU0VMX1RJMVNFTF8xIHwgICAgIFwKKyAgIFRJTV9USVNFTF9USTFTRUxfMCkgLyohPCBUSU0yMCBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QM19PVVQgKi8KKyNkZWZpbmUgVElNX1RJTTIwX1RJMV9DT01QNCBcCisgIFRJTV9USVNFTF9USTFTRUxfMiAvKiE8IFRJTTIwIGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVA0X09VVCAqLworI2VuZGlmICAgICAgICAgICAgICAgLyogVElNMjAgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFRJTUV4X1NNU19QcmVsb2FkX0VuYWJsZSBUSU0gRXh0ZW5kZWQgQml0ZmllbGQgU01TIHByZWxvYWQKKyAqIGVuYWJsaW5nCisgKiBAeworICovCisjZGVmaW5lIFRJTV9TTVNfUFJFTE9BRF9TT1VSQ0VfVVBEQVRFIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBQcmVsYW9kIG9mIFNNUyBiaXRmaWVsZCBpcyBkaXNhYmxlZCAqLworI2RlZmluZSBUSU1fU01TX1BSRUxPQURfU09VUkNFX0lOREVYIFwKKyAgVElNX1NNQ1JfU01TUFMgLyohPCBQcmVsb2FkIG9mIFNNUyBiaXRmaWVsZCBpcyBlbmFibGVkICAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVElNRXhfRW5jb2Rlcl9JbmRleF9Qb3NpdGlvbiBUSU0gRXh0ZW5kZWQgRW5jb2RlciBpbmRleCBwb3NpdGlvbgorICogQHsKKyAqLworI2RlZmluZSBUSU1fRU5DT0RFUklOREVYX1BPU0lUSU9OXzAwIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBFbmNvZGVyIGluZGV4IHBvc2l0aW9uIGlzIEFCPTAwICovCisjZGVmaW5lIFRJTV9FTkNPREVSSU5ERVhfUE9TSVRJT05fMDEgXAorICBUSU1fRUNSX0lQT1NfMCAvKiE8IEVuY29kZXIgaW5kZXggcG9zaXRpb24gaXMgQUI9MDEgKi8KKyNkZWZpbmUgVElNX0VOQ09ERVJJTkRFWF9QT1NJVElPTl8xMCBcCisgIFRJTV9FQ1JfSVBPU18xIC8qITwgRW5jb2RlciBpbmRleCBwb3NpdGlvbiBpcyBBQj0xMCAqLworI2RlZmluZSBUSU1fRU5DT0RFUklOREVYX1BPU0lUSU9OXzExIFwKKyAgKFRJTV9FQ1JfSVBPU18xIHwgVElNX0VDUl9JUE9TXzApIC8qITwgRW5jb2RlciBpbmRleCBwb3NpdGlvbiBpcyBBQj0xMSAqLworI2RlZmluZSBUSU1fRU5DT0RFUklOREVYX1BPU0lUSU9OXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAweDAwMDAwMDAwVSAvKiE8IEluIGRpcmVjdGlvbmFsIGNsb2NrIG1vZGUgb3IgY2xvY2sgcGx1cyBkaXJlY3Rpb24gbW9kZSwgXAorICAgICAgICAgICAgICAgICBpbmRleCByZXNldHMgdGhlIGNvdW50ZXIgd2hlbiBjbG9jayBpcyAwICovCisjZGVmaW5lIFRJTV9FTkNPREVSSU5ERVhfUE9TSVRJT05fMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRJTV9FQ1JfSVBPU18wIC8qITwgSW4gZGlyZWN0aW9uYWwgY2xvY2sgbW9kZSBvciBjbG9jayBwbHVzIGRpcmVjdGlvbiBtb2RlLCBcCisgICAgICAgICAgICAgICAgICAgIGluZGV4IHJlc2V0cyB0aGUgY291bnRlciB3aGVuIGNsb2NrIGlzIDEgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFRJTUV4X0VuY29kZXJfSW5kZXhfRGlyZWN0aW9uIFRJTSBFeHRlbmRlZCBFbmNvZGVyIGluZGV4IGRpcmVjdGlvbgorICogQHsKKyAqLworI2RlZmluZSBUSU1fRU5DT0RFUklOREVYX0RJUkVDVElPTl9VUF9ET1dOIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBJbmRleCByZXNldHMgdGhlIGNvdW50ZXIgd2hhdGV2ZXIgdGhlIGRpcmVjdGlvbiAgKi8KKyNkZWZpbmUgVElNX0VOQ09ERVJJTkRFWF9ESVJFQ1RJT05fVVAgXAorICBUSU1fRUNSX0lESVJfMCAvKiE8IEluZGV4IHJlc2V0cyB0aGUgY291bnRlciB3aGVuIHVwLWNvdW50aW5nIG9ubHkgICAqLworI2RlZmluZSBUSU1fRU5DT0RFUklOREVYX0RJUkVDVElPTl9ET1dOIFwKKyAgVElNX0VDUl9JRElSXzEgLyohPCBJbmRleCByZXNldHMgdGhlIGNvdW50ZXIgd2hlbiBkb3duLWNvdW50aW5nIG9ubHkgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFRJTUV4X0VuY29kZXJfSW5kZXhfUG9sYXJpdHkgVElNIEV4dGVuZGVkIEVuY29kZXIgaW5kZXggcG9sYXJpdHkKKyAqIEB7CisgKi8KKyNkZWZpbmUgVElNX0VOQ09ERVJJTkRFWF9QT0xBUklUWV9JTlZFUlRFRCBcCisgIFRJTV9FVFJQT0xBUklUWV9JTlZFUlRFRCAvKiE8IFBvbGFyaXR5IGZvciBFVFJ4IHBpbiAqLworI2RlZmluZSBUSU1fRU5DT0RFUklOREVYX1BPTEFSSVRZX05PTklOVkVSVEVEIFwKKyAgVElNX0VUUlBPTEFSSVRZX05PTklOVkVSVEVEIC8qITwgUG9sYXJpdHkgZm9yIEVUUnggcGluICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1FeF9FbmNvZGVyX0luZGV4X1ByZXNjYWxlciBUSU0gRXh0ZW5kZWQgRW5jb2RkZXIgaW5kZXgKKyAqIHByZXNjYWxlcgorICogQHsKKyAqLworI2RlZmluZSBUSU1fRU5DT0RFUklOREVYX1BSRVNDQUxFUl9ESVYxIFwKKyAgVElNX0VUUlBSRVNDQUxFUl9ESVYxIC8qITwgTm8gcHJlc2NhbGVyIGlzIHVzZWQgKi8KKyNkZWZpbmUgVElNX0VOQ09ERVJJTkRFWF9QUkVTQ0FMRVJfRElWMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRJTV9FVFJQUkVTQ0FMRVJfRElWMiAvKiE8IFByZXNjYWxlciBmb3IgRXh0ZXJuYWwgRVRSIHBpbjogQ2FwdHVyZSBwZXJmb3JtZWQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb25jZSBldmVyeSAyIGV2ZW50cy4gKi8KKyNkZWZpbmUgVElNX0VOQ09ERVJJTkRFWF9QUkVTQ0FMRVJfRElWNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRJTV9FVFJQUkVTQ0FMRVJfRElWNCAvKiE8IFByZXNjYWxlciBmb3IgRXh0ZXJuYWwgRVRSIHBpbjogQ2FwdHVyZSBwZXJmb3JtZWQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb25jZSBldmVyeSA0IGV2ZW50cy4gKi8KKyNkZWZpbmUgVElNX0VOQ09ERVJJTkRFWF9QUkVTQ0FMRVJfRElWOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRJTV9FVFJQUkVTQ0FMRVJfRElWOCAvKiE8IFByZXNjYWxlciBmb3IgRXh0ZXJuYWwgRVRSIHBpbjogQ2FwdHVyZSBwZXJmb3JtZWQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb25jZSBldmVyeSA4IGV2ZW50cy4gKi8KKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKy8qIEVuZCBvZiBleHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFRJTUV4X0V4cG9ydGVkX01hY3JvcyBUSU0gRXh0ZW5kZWQgRXhwb3J0ZWQgTWFjcm9zCisgKiBAeworICovCisKKy8qKgorICogQGJyaWVmICBIRUxQRVIgbWFjcm8gY2FsY3VsYXRpbmcgdGhlIHByZXNjYWxlciB2YWx1ZSB0byBhY2hpZXZlIHRoZSByZXF1aXJlZAorICogY291bnRlciBjbG9jayBmcmVxdWVuY3kuCisgKiBAbm90ZSAgIGV4OiBAcmVmIF9fSEFMX1RJTV9DQUxDX1BTQyg4MDAwMDAwMCwgMTAwMDAwMCk7CisgKiBAcGFyYW0gIF9fVElNQ0xLX18gdGltZXIgaW5wdXQgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAqIEBwYXJhbSAgX19DTlRDTEtfXyBjb3VudGVyIGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopCisgKiBAcmV0dmFsIFByZXNjYWxlciB2YWx1ZSAgKGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9NjU1MzUpCisgKi8KKyNkZWZpbmUgX19IQUxfVElNX0NBTENfUFNDKF9fVElNQ0xLX18sIF9fQ05UQ0xLX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChfX1RJTUNMS19fKSA+PSAoX19DTlRDTEtfXykpID8gKHVpbnQzMl90KSgoX19USU1DTEtfXykgLyAoX19DTlRDTEtfXyktMVUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFUKKworLyoqCisgKiBAYnJpZWYgIEhFTFBFUiBtYWNybyBjYWxjdWxhdGluZyB0aGUgYXV0by1yZWxvYWQgdmFsdWUgdG8gYWNoaWV2ZSB0aGUKKyAqIHJlcXVpcmVkIG91dHB1dCBzaWduYWwgZnJlcXVlbmN5LgorICogQG5vdGUgICBleDogQHJlZiBfX0hBTF9USU1fQ0FMQ19QRVJJT0QoMTAwMDAwMCwgMCwgMTAwMDApOworICogQHBhcmFtICBfX1RJTUNMS19fIHRpbWVyIGlucHV0IGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopCisgKiBAcGFyYW0gIF9fUFNDX18gcHJlc2NhbGVyCisgKiBAcGFyYW0gIF9fRlJFUV9fIG91dHB1dCBzaWduYWwgZnJlcXVlbmN5IChpbiBIeikKKyAqIEByZXR2YWwgIEF1dG8tcmVsb2FkIHZhbHVlICAoYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUzNSkKKyAqLworI2RlZmluZSBfX0hBTF9USU1fQ0FMQ19QRVJJT0QoX19USU1DTEtfXywgX19QU0NfXywgX19GUkVRX18pICBcCisgICgoKF9fVElNQ0xLX18pIC8gKChfX1BTQ19fKSArIDFVKSkgPj0gKF9fRlJFUV9fKSkgICAgICAgICAgIFwKKyAgICAgID8gKChfX1RJTUNMS19fKSAvICgoX19GUkVRX18pICogKChfX1BTQ19fKSArIDFVKSkgLSAxVSkgXAorICAgICAgOiAwVQorCisvKioKKyAqIEBicmllZiAgSEVMUEVSIG1hY3JvIGNhbGN1bGF0aW5nIHRoZSBhdXRvLXJlbG9hZCB2YWx1ZSwgd2l0aCBkaXRoZXJpbmcKKyAqIGZlYXR1cmUgZW5hYmxlZCwgdG8gYWNoaWV2ZSB0aGUgcmVxdWlyZWQgb3V0cHV0IHNpZ25hbCBmcmVxdWVuY3kuCisgKiBAbm90ZSAgIGV4OiBAcmVmIF9fSEFMX1RJTV9DQUxDX1BFUklPRF9ESVRIRVIoMTAwMDAwMCwgMCwgMTAwMDApOworICogQG5vdGUgICBUaGlzIG1hY3JvIHNob3VsZCBiZSB1c2VkIG9ubHkgaWYgZGl0aGVyaW5nIGlzIGFscmVhZHkgZW5hYmxlZAorICogQHBhcmFtICBfX1RJTUNMS19fIHRpbWVyIGlucHV0IGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopCisgKiBAcGFyYW0gIF9fUFNDX18gcHJlc2NhbGVyCisgKiBAcGFyYW0gIF9fRlJFUV9fIG91dHB1dCBzaWduYWwgZnJlcXVlbmN5IChpbiBIeikKKyAqIEByZXR2YWwgIEF1dG8tcmVsb2FkIHZhbHVlICAoYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUxOSkKKyAqLworI2RlZmluZSBfX0hBTF9USU1fQ0FMQ19QRVJJT0RfRElUSEVSKF9fVElNQ0xLX18sIF9fUFNDX18sIF9fRlJFUV9fKSBcCisgICgoKF9fVElNQ0xLX18pIC8gKChfX1BTQ19fKSArIDFVKSkgPj0gKF9fRlJFUV9fKSkgICAgICAgICAgICAgICAgIFwKKyAgICAgID8gKHVpbnQzMl90KSgoKHVpbnQ2NF90KShfX1RJTUNMS19fKSAqIDE2IC8gICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKChfX0ZSRVFfXykgKiAoKF9fUFNDX18pICsgMVUpKSAtICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIDE2VSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDogMFUKKworLyoqCisgKiBAYnJpZWYgIEhFTFBFUiBtYWNybyBjYWxjdWxhdGluZyB0aGUgY29tcGFyZSB2YWx1ZSByZXF1aXJlZCB0byBhY2hpZXZlIHRoZQorICogcmVxdWlyZWQgdGltZXIgb3V0cHV0IGNvbXBhcmUgYWN0aXZlL2luYWN0aXZlIGRlbGF5LgorICogQG5vdGUgICBleDogQHJlZiBfX0hBTF9USU1fQ0FMQ19QVUxTRSgxMDAwMDAwLCAwLCAxMCk7CisgKiBAcGFyYW0gIF9fVElNQ0xLX18gdGltZXIgaW5wdXQgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAqIEBwYXJhbSAgX19QU0NfXyBwcmVzY2FsZXIKKyAqIEBwYXJhbSAgX19ERUxBWV9fIHRpbWVyIG91dHB1dCBjb21wYXJlIGFjdGl2ZS9pbmFjdGl2ZSBkZWxheSAoaW4gdXMpCisgKiBAcmV0dmFsIENvbXBhcmUgdmFsdWUgIChiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTY1NTM1KQorICovCisjZGVmaW5lIF9fSEFMX1RJTV9DQUxDX1BVTFNFKF9fVElNQ0xLX18sIF9fUFNDX18sIF9fREVMQVlfXykgICAgIFwKKyAgKCh1aW50MzJfdCkoKCh1aW50NjRfdCkoX19USU1DTEtfXykgKiAodWludDY0X3QpKF9fREVMQVlfXykpIC8gXAorICAgICAgICAgICAgICAoKHVpbnQ2NF90KTEwMDAwMDBVICogKHVpbnQ2NF90KSgoX19QU0NfXykgKyAxVSkpKSkKKworLyoqCisgKiBAYnJpZWYgIEhFTFBFUiBtYWNybyBjYWxjdWxhdGluZyB0aGUgY29tcGFyZSB2YWx1ZSwgd2l0aCBkaXRoZXJpbmcgZmVhdHVyZQorICogZW5hYmxlZCwgdG8gYWNoaWV2ZSB0aGUgcmVxdWlyZWQgdGltZXIgb3V0cHV0IGNvbXBhcmUgYWN0aXZlL2luYWN0aXZlIGRlbGF5LgorICogQG5vdGUgICBleDogQHJlZiBfX0hBTF9USU1fQ0FMQ19QVUxTRV9ESVRIRVIoMTAwMDAwMCwgMCwgMTApOworICogQG5vdGUgICBUaGlzIG1hY3JvIHNob3VsZCBiZSB1c2VkIG9ubHkgaWYgZGl0aGVyaW5nIGlzIGFscmVhZHkgZW5hYmxlZAorICogQHBhcmFtICBfX1RJTUNMS19fIHRpbWVyIGlucHV0IGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopCisgKiBAcGFyYW0gIF9fUFNDX18gcHJlc2NhbGVyCisgKiBAcGFyYW0gIF9fREVMQVlfXyB0aW1lciBvdXRwdXQgY29tcGFyZSBhY3RpdmUvaW5hY3RpdmUgZGVsYXkgKGluIHVzKQorICogQHJldHZhbCBDb21wYXJlIHZhbHVlICAoYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUxOSkKKyAqLworI2RlZmluZSBfX0hBTF9USU1fQ0FMQ19QVUxTRV9ESVRIRVIoX19USU1DTEtfXywgX19QU0NfXywgX19ERUxBWV9fKSAgICBcCisgICgodWludDMyX3QpKCgodWludDY0X3QpKF9fVElNQ0xLX18pICogKHVpbnQ2NF90KShfX0RFTEFZX18pICogMTZVKSAvIFwKKyAgICAgICAgICAgICAgKCh1aW50NjRfdCkxMDAwMDAwVSAqICh1aW50NjRfdCkoKF9fUFNDX18pICsgMVUpKSkpCisKKy8qKgorICogQGJyaWVmICBIRUxQRVIgbWFjcm8gY2FsY3VsYXRpbmcgdGhlIGF1dG8tcmVsb2FkIHZhbHVlIHRvIGFjaGlldmUgdGhlCisgKiByZXF1aXJlZCBwdWxzZSBkdXJhdGlvbiAod2hlbiB0aGUgdGltZXIgb3BlcmF0ZXMgaW4gb25lIHB1bHNlIG1vZGUpLgorICogQG5vdGUgICBleDogQHJlZiBfX0hBTF9USU1fQ0FMQ19QRVJJT0RfQllfREVMQVkoMTAwMDAwMCwgMCwgMTAsIDIwKTsKKyAqIEBwYXJhbSAgX19USU1DTEtfXyB0aW1lciBpbnB1dCBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQorICogQHBhcmFtICBfX1BTQ19fIHByZXNjYWxlcgorICogQHBhcmFtICBfX0RFTEFZX18gdGltZXIgb3V0cHV0IGNvbXBhcmUgYWN0aXZlL2luYWN0aXZlIGRlbGF5IChpbiB1cykKKyAqIEBwYXJhbSAgX19QVUxTRV9fIHB1bHNlIGR1cmF0aW9uIChpbiB1cykKKyAqIEByZXR2YWwgQXV0by1yZWxvYWQgdmFsdWUgIChiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTY1NTM1KQorICovCisjZGVmaW5lIF9fSEFMX1RJTV9DQUxDX1BFUklPRF9CWV9ERUxBWShfX1RJTUNMS19fLCBfX1BTQ19fLCBfX0RFTEFZX18sICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX1BVTFNFX18pICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgodWludDMyX3QpKF9fSEFMX1RJTV9DQUxDX1BVTFNFKChfX1RJTUNMS19fKSwgKF9fUFNDX18pLCAoX19QVUxTRV9fKSkgKyBcCisgICAgICAgICAgICAgIF9fSEFMX1RJTV9DQUxDX1BVTFNFKChfX1RJTUNMS19fKSwgKF9fUFNDX18pLCAoX19ERUxBWV9fKSkpKQorCisvKioKKyAqIEBicmllZiAgSEVMUEVSIG1hY3JvIGNhbGN1bGF0aW5nIHRoZSBhdXRvLXJlbG9hZCB2YWx1ZSwgd2l0aCBkaXRoZXJpbmcKKyAqIGZlYXR1cmUgZW5hYmxlZCwgdG8gYWNoaWV2ZSB0aGUgcmVxdWlyZWQgcHVsc2UgZHVyYXRpb24gKHdoZW4gdGhlIHRpbWVyCisgKiBvcGVyYXRlcyBpbiBvbmUgcHVsc2UgbW9kZSkuCisgKiBAbm90ZSAgIGV4OiBAcmVmIF9fSEFMX1RJTV9DQUxDX1BFUklPRF9ESVRIRVJfQllfREVMQVkoMTAwMDAwMCwgMCwgMTAsIDIwKTsKKyAqIEBub3RlICAgVGhpcyBtYWNybyBzaG91bGQgYmUgdXNlZCBvbmx5IGlmIGRpdGhlcmluZyBpcyBhbHJlYWR5IGVuYWJsZWQKKyAqIEBwYXJhbSAgX19USU1DTEtfXyB0aW1lciBpbnB1dCBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQorICogQHBhcmFtICBfX1BTQ19fIHByZXNjYWxlcgorICogQHBhcmFtICBfX0RFTEFZX18gdGltZXIgb3V0cHV0IGNvbXBhcmUgYWN0aXZlL2luYWN0aXZlIGRlbGF5IChpbiB1cykKKyAqIEBwYXJhbSAgX19QVUxTRV9fIHB1bHNlIGR1cmF0aW9uIChpbiB1cykKKyAqIEByZXR2YWwgQXV0by1yZWxvYWQgdmFsdWUgIChiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTY1NTE5KQorICovCisjZGVmaW5lIF9fSEFMX1RJTV9DQUxDX1BFUklPRF9ESVRIRVJfQllfREVMQVkoX19USU1DTEtfXywgX19QU0NfXywgX19ERUxBWV9fLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19QVUxTRV9fKSAgICAgICAgICAgICAgICAgICAgICBcCisgICgodWludDMyX3QpKF9fSEFMX1RJTV9DQUxDX1BVTFNFX0RJVEhFUigoX19USU1DTEtfXyksIChfX1BTQ19fKSwgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19QVUxTRV9fKSkgKyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIF9fSEFMX1RJTV9DQUxDX1BVTFNFX0RJVEhFUigoX19USU1DTEtfXyksIChfX1BTQ19fKSwgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19ERUxBWV9fKSkpKQorCisvKioKKyAqIEB9CisgKi8KKy8qIEVuZCBvZiBleHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFRJTUV4X1ByaXZhdGVfTWFjcm9zIFRJTSBFeHRlbmRlZCBQcml2YXRlIE1hY3JvcworICogQHsKKyAqLworI2RlZmluZSBJU19USU1fUkVNQVAoX19SRU1BUF9fKSAoKCgoX19SRU1BUF9fKSAmIDB4RkZGQzNGRkZVKSA9PSAweDAwMDAwMDAwVSkpCisKKyNkZWZpbmUgSVNfVElNX0JSRUFLSU5QVVQoX19CUkVBS0lOUFVUX18pICAgICAgXAorICAoKChfX0JSRUFLSU5QVVRfXykgPT0gVElNX0JSRUFLSU5QVVRfQlJLKSB8fCBcCisgICAoKF9fQlJFQUtJTlBVVF9fKSA9PSBUSU1fQlJFQUtJTlBVVF9CUksyKSkKKworI2lmIGRlZmluZWQoQ09NUDUpICYmIGRlZmluZWQoQ09NUDYpICYmIGRlZmluZWQoQ09NUDcpCisjZGVmaW5lIElTX1RJTV9CUkVBS0lOUFVUU09VUkNFKF9fU09VUkNFX18pICAgICAgICBcCisgICgoKF9fU09VUkNFX18pID09IFRJTV9CUkVBS0lOUFVUU09VUkNFX0JLSU4pIHx8ICBcCisgICAoKF9fU09VUkNFX18pID09IFRJTV9CUkVBS0lOUFVUU09VUkNFX0NPTVAxKSB8fCBcCisgICAoKF9fU09VUkNFX18pID09IFRJTV9CUkVBS0lOUFVUU09VUkNFX0NPTVAyKSB8fCBcCisgICAoKF9fU09VUkNFX18pID09IFRJTV9CUkVBS0lOUFVUU09VUkNFX0NPTVAzKSB8fCBcCisgICAoKF9fU09VUkNFX18pID09IFRJTV9CUkVBS0lOUFVUU09VUkNFX0NPTVA0KSB8fCBcCisgICAoKF9fU09VUkNFX18pID09IFRJTV9CUkVBS0lOUFVUU09VUkNFX0NPTVA1KSB8fCBcCisgICAoKF9fU09VUkNFX18pID09IFRJTV9CUkVBS0lOUFVUU09VUkNFX0NPTVA2KSB8fCBcCisgICAoKF9fU09VUkNFX18pID09IFRJTV9CUkVBS0lOUFVUU09VUkNFX0NPTVA3KSkKKworI2Vsc2UKKyNkZWZpbmUgSVNfVElNX0JSRUFLSU5QVVRTT1VSQ0UoX19TT1VSQ0VfXykgICAgICAgIFwKKyAgKCgoX19TT1VSQ0VfXykgPT0gVElNX0JSRUFLSU5QVVRTT1VSQ0VfQktJTikgfHwgIFwKKyAgICgoX19TT1VSQ0VfXykgPT0gVElNX0JSRUFLSU5QVVRTT1VSQ0VfQ09NUDEpIHx8IFwKKyAgICgoX19TT1VSQ0VfXykgPT0gVElNX0JSRUFLSU5QVVRTT1VSQ0VfQ09NUDIpIHx8IFwKKyAgICgoX19TT1VSQ0VfXykgPT0gVElNX0JSRUFLSU5QVVRTT1VSQ0VfQ09NUDMpIHx8IFwKKyAgICgoX19TT1VSQ0VfXykgPT0gVElNX0JSRUFLSU5QVVRTT1VSQ0VfQ09NUDQpKQorCisjZW5kaWYgLyogQ09NUDUgJiYgQ09NUDYgJiYgQ09NUDcgKi8KKyNkZWZpbmUgSVNfVElNX0JSRUFLSU5QVVRTT1VSQ0VfU1RBVEUoX19TVEFURV9fKSAgICBcCisgICgoKF9fU1RBVEVfXykgPT0gVElNX0JSRUFLSU5QVVRTT1VSQ0VfRElTQUJMRSkgfHwgXAorICAgKChfX1NUQVRFX18pID09IFRJTV9CUkVBS0lOUFVUU09VUkNFX0VOQUJMRSkpCisKKyNkZWZpbmUgSVNfVElNX0JSRUFLSU5QVVRTT1VSQ0VfUE9MQVJJVFkoX19QT0xBUklUWV9fKSAgICAgIFwKKyAgKCgoX19QT0xBUklUWV9fKSA9PSBUSU1fQlJFQUtJTlBVVFNPVVJDRV9QT0xBUklUWV9MT1cpIHx8IFwKKyAgICgoX19QT0xBUklUWV9fKSA9PSBUSU1fQlJFQUtJTlBVVFNPVVJDRV9QT0xBUklUWV9ISUdIKSkKKworI2RlZmluZSBJU19USU1fVElTRUwoX19USVNFTF9fKSAoKCgoX19USVNFTF9fKSAmIDB4RjBGMEYwRjBVKSA9PSAweDAwMDAwMDAwVSkpCisKKyNkZWZpbmUgSVNfVElNX1RJU0VMX1RJWF9JTlNUQU5DRShJTlNUQU5DRSwgQ0hBTk5FTCkgXAorICAoSVNfVElNX0NDWF9JTlNUQU5DRShJTlNUQU5DRSwgQ0hBTk5FTCkgJiYgKChDSEFOTkVMKSA8IFRJTV9DSEFOTkVMXzUpKQorCisjaWYgZGVmaW5lZChUSU01KSAmJiBkZWZpbmVkKFRJTTIwKQorI2RlZmluZSBJU19USU1fQ0xPQ0tTT1VSQ0VfSU5TVEFOQ0UoSU5TVEFOQ0UsIF9fQ0xPQ0tfXykgICAgICAgICAgICAgICAgICAgXAorICAoKCgoSU5TVEFOQ0UpID09IFRJTTEpICYmICgoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lOVEVSTkFMKSB8fCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0VUUk1PREUxKSB8fCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0VUUk1PREUyKSB8fCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMUVEKSB8fCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMSkgfHwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMikgfHwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjEpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjIpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjMpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjQpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjUpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjYpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjcpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjgpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjkpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjEwKSkpIHx8ICAgXAorICAgKCgoSU5TVEFOQ0UpID09IFRJTTIpICYmICgoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lOVEVSTkFMKSB8fCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0VUUk1PREUxKSB8fCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0VUUk1PREUyKSB8fCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMUVEKSB8fCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMSkgfHwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMikgfHwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjApIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjIpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjMpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjQpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjUpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjYpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjcpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjgpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjkpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjEwKSB8fCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjExKSkpIHx8ICAgXAorICAgKCgoSU5TVEFOQ0UpID09IFRJTTMpICYmICgoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lOVEVSTkFMKSB8fCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0VUUk1PREUxKSB8fCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0VUUk1PREUyKSB8fCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMUVEKSB8fCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMSkgfHwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMikgfHwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjApIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjEpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjMpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjQpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjUpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjYpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjcpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjgpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjkpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjEwKSkpIHx8ICAgXAorICAgKCgoSU5TVEFOQ0UpID09IFRJTTQpICYmICgoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lOVEVSTkFMKSB8fCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0VUUk1PREUxKSB8fCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0VUUk1PREUyKSB8fCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMUVEKSB8fCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMSkgfHwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMikgfHwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjApIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjEpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjIpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjQpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjUpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjYpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjcpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjgpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjkpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjEwKSkpIHx8ICAgXAorICAgKCgoSU5TVEFOQ0UpID09IFRJTTUpICYmICgoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lOVEVSTkFMKSB8fCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0VUUk1PREUxKSB8fCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0VUUk1PREUyKSB8fCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMUVEKSB8fCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMSkgfHwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMikgfHwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjApIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjEpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjIpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjMpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjUpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjYpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjcpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjgpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjkpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjEwKSkpIHx8ICAgXAorICAgKCgoSU5TVEFOQ0UpID09IFRJTTgpICYmICgoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lOVEVSTkFMKSB8fCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0VUUk1PREUxKSB8fCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0VUUk1PREUyKSB8fCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMUVEKSB8fCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMSkgfHwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMikgfHwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjApIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjEpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjIpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjMpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjQpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjYpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjcpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjgpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjkpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjEwKSkpIHx8ICAgXAorICAgKCgoSU5TVEFOQ0UpID09IFRJTTE1KSAmJiAoKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JTlRFUk5BTCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTFFRCkgfHwgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTEpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTIpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIwKSB8fCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIxKSB8fCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIyKSB8fCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIzKSB8fCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI0KSB8fCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI1KSB8fCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI3KSB8fCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI4KSB8fCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI5KSB8fCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIxMCkpKSB8fCAgXAorICAgKCgoSU5TVEFOQ0UpID09IFRJTTIwKSAmJiAoKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JTlRFUk5BTCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTFFRCkgfHwgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTEpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTIpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIwKSB8fCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIxKSB8fCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIyKSB8fCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIzKSB8fCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI0KSB8fCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI1KSB8fCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI2KSB8fCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI3KSB8fCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI4KSB8fCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIxMCkpKSkKKworI2RlZmluZSBJU19USU1fVFJJR0dFUl9JTlNUQU5DRShJTlNUQU5DRSwgX19TRUxFQ1RJT05fXykgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoKElOU1RBTkNFKSA9PSBUSU0xKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMUZfRUQpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTFGUDEpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkyRlAyKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19FVFJGKSB8fCBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjEpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjIpIHx8ICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIzKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI0KSB8fCAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNSkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNikgfHwgICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjcpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjgpIHx8ICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI5KSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMTApKSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKChJTlNUQU5DRSkgPT0gVElNMikgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTFGX0VEKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkxRlAxKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMkZQMikgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfRVRSRikgfHwgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIwKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIyKSB8fCAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMykgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNCkgfHwgICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjUpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjYpIHx8ICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI3KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI4KSB8fCAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSOSkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMTApIHx8ICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjExKSkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKCgoSU5TVEFOQ0UpID09IFRJTTMpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkxRl9FRCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMUZQMSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTJGUDIpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0VUUkYpIHx8IFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMCkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMSkgfHwgICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjMpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjQpIHx8ICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI1KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI2KSB8fCAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNykgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSOCkgfHwgICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxMCkpKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoKElOU1RBTkNFKSA9PSBUSU00KSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMUZfRUQpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTFGUDEpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkyRlAyKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19FVFJGKSB8fCBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjApIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjEpIHx8ICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIyKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI0KSB8fCAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNSkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNikgfHwgICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjcpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjgpIHx8ICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI5KSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMTApKSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKChJTlNUQU5DRSkgPT0gVElNNSkgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTFGX0VEKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkxRlAxKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMkZQMikgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfRVRSRikgfHwgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIwKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxKSB8fCAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMikgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMykgfHwgICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjUpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjYpIHx8ICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI3KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI4KSB8fCAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSOSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjEwKSkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKCgoSU5TVEFOQ0UpID09IFRJTTgpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkxRl9FRCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMUZQMSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTJGUDIpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0VUUkYpIHx8IFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMCkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMSkgfHwgICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjIpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjMpIHx8ICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI0KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI2KSB8fCAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNykgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSOCkgfHwgICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxMCkpKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoKElOU1RBTkNFKSA9PSBUSU0xNSkgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMUZfRUQpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTFGUDEpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkyRlAyKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIwKSB8fCBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjEpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjIpIHx8ICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIzKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI0KSB8fCAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNSkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNykgfHwgICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjgpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjkpIHx8ICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxMCkpKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoKElOU1RBTkNFKSA9PSBUSU0yMCkgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMUZfRUQpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTFGUDEpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkyRlAyKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19FVFJGKSB8fCBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjApIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjEpIHx8ICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIyKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIzKSB8fCAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNCkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNSkgfHwgICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjYpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjcpIHx8ICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI4KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxMCkpKSkKKworI2RlZmluZSBJU19USU1fSU5URVJOQUxfVFJJR0dFUkVWRU5UX0lOU1RBTkNFKElOU1RBTkNFLCBfX1NFTEVDVElPTl9fKSAgICAgICAgXAorICAoKCgoSU5TVEFOQ0UpID09IFRJTTEpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIyKSB8fCAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIzKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI0KSB8fCAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI1KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI2KSB8fCAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI3KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI4KSB8fCAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI5KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxMCkgfHwgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19OT05FKSkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKCgoSU5TVEFOQ0UpID09IFRJTTIpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIwKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIyKSB8fCAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIzKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI0KSB8fCAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI1KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI2KSB8fCAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI3KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI4KSB8fCAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI5KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxMCkgfHwgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxMSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19OT05FKSkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKCgoSU5TVEFOQ0UpID09IFRJTTMpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIwKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxKSB8fCAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIzKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI0KSB8fCAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI1KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI2KSB8fCAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI3KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI4KSB8fCAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI5KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxMCkgfHwgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19OT05FKSkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKCgoSU5TVEFOQ0UpID09IFRJTTQpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIwKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxKSB8fCAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIyKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI0KSB8fCAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI1KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI2KSB8fCAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI3KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI4KSB8fCAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI5KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxMCkgfHwgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19OT05FKSkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKCgoSU5TVEFOQ0UpID09IFRJTTUpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIwKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxKSB8fCAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIyKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIzKSB8fCAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI1KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI2KSB8fCAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI3KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI4KSB8fCAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI5KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxMCkgfHwgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19OT05FKSkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKCgoSU5TVEFOQ0UpID09IFRJTTgpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIwKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxKSB8fCAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIyKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIzKSB8fCAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI0KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI2KSB8fCAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI3KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI4KSB8fCAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI5KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxMCkgfHwgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19OT05FKSkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKCgoSU5TVEFOQ0UpID09IFRJTTE1KSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIwKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxKSB8fCAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIyKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIzKSB8fCAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI0KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI1KSB8fCAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI3KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI4KSB8fCAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI5KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxMCkgfHwgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19OT05FKSkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKCgoSU5TVEFOQ0UpID09IFRJTTIwKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIwKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxKSB8fCAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIyKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIzKSB8fCAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI0KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI1KSB8fCAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI2KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI3KSB8fCAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI4KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxMCkgfHwgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19OT05FKSkpKQorCisjZWxpZiBkZWZpbmVkKFRJTTUpCisjZGVmaW5lIElTX1RJTV9DTE9DS1NPVVJDRV9JTlNUQU5DRShJTlNUQU5DRSwgX19DTE9DS19fKSAgICAgICAgICAgICAgICAgICBcCisgICgoKChJTlNUQU5DRSkgPT0gVElNMSkgJiYgKCgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSU5URVJOQUwpIHx8ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTEpIHx8ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTIpIHx8ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkxRUQpIHx8ICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkxKSB8fCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkyKSB8fCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMSkgfHwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMikgfHwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMykgfHwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNCkgfHwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNSkgfHwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNikgfHwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNykgfHwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSOCkpKSB8fCAgICBcCisgICAoKChJTlNUQU5DRSkgPT0gVElNMikgJiYgKCgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSU5URVJOQUwpIHx8ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTEpIHx8ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTIpIHx8ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkxRUQpIHx8ICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkxKSB8fCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkyKSB8fCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMCkgfHwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMikgfHwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMykgfHwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNCkgfHwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNSkgfHwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNikgfHwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNykgfHwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSOCkgfHwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMTEpKSkgfHwgICBcCisgICAoKChJTlNUQU5DRSkgPT0gVElNMykgJiYgKCgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSU5URVJOQUwpIHx8ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTEpIHx8ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTIpIHx8ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkxRUQpIHx8ICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkxKSB8fCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkyKSB8fCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMCkgfHwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMSkgfHwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMykgfHwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNCkgfHwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNSkgfHwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNikgfHwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNykgfHwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSOCkpKSB8fCAgICBcCisgICAoKChJTlNUQU5DRSkgPT0gVElNNCkgJiYgKCgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSU5URVJOQUwpIHx8ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTEpIHx8ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTIpIHx8ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkxRUQpIHx8ICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkxKSB8fCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkyKSB8fCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMCkgfHwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMSkgfHwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMikgfHwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNCkgfHwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNSkgfHwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNikgfHwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNykgfHwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSOCkpKSB8fCAgICBcCisgICAoKChJTlNUQU5DRSkgPT0gVElNNSkgJiYgKCgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSU5URVJOQUwpIHx8ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTEpIHx8ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTIpIHx8ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkxRUQpIHx8ICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkxKSB8fCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkyKSB8fCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMCkgfHwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMSkgfHwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMikgfHwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMykgfHwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNSkgfHwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNikgfHwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNykgfHwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSOCkpKSB8fCAgICBcCisgICAoKChJTlNUQU5DRSkgPT0gVElNOCkgJiYgKCgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSU5URVJOQUwpIHx8ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTEpIHx8ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTIpIHx8ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkxRUQpIHx8ICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkxKSB8fCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkyKSB8fCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMCkgfHwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMSkgfHwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMikgfHwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMykgfHwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNCkgfHwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNikgfHwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNykgfHwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSOCkpKSB8fCAgICBcCisgICAoKChJTlNUQU5DRSkgPT0gVElNMTUpICYmICgoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lOVEVSTkFMKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMUVEKSB8fCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMSkgfHwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMikgfHwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjApIHx8ICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjEpIHx8ICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjIpIHx8ICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjMpIHx8ICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjQpIHx8ICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjUpIHx8ICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjcpIHx8ICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjgpKSkpCisKKyNkZWZpbmUgSVNfVElNX1RSSUdHRVJfSU5TVEFOQ0UoSU5TVEFOQ0UsIF9fU0VMRUNUSU9OX18pICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKChJTlNUQU5DRSkgPT0gVElNMSkgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTFGX0VEKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkxRlAxKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMkZQMikgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfRVRSRikgfHwgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIyKSB8fCAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMykgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNCkgfHwgICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjUpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjYpIHx8ICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI3KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI4KSkpIHx8IFwKKyAgICgoKElOU1RBTkNFKSA9PSBUSU0yKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMUZfRUQpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTFGUDEpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkyRlAyKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19FVFJGKSB8fCBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjApIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjIpIHx8ICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIzKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI0KSB8fCAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNSkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNikgfHwgICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjcpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjgpIHx8ICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxMSkpKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoKElOU1RBTkNFKSA9PSBUSU0zKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMUZfRUQpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTFGUDEpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkyRlAyKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19FVFJGKSB8fCBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjApIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjEpIHx8ICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIzKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI0KSB8fCAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNSkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNikgfHwgICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjcpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjgpKSkgfHwgXAorICAgKCgoSU5TVEFOQ0UpID09IFRJTTQpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkxRl9FRCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMUZQMSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTJGUDIpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0VUUkYpIHx8IFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMCkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMSkgfHwgICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjIpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjQpIHx8ICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI1KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI2KSB8fCAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNykgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSOCkpKSB8fCBcCisgICAoKChJTlNUQU5DRSkgPT0gVElNNSkgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTFGX0VEKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkxRlAxKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMkZQMikgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfRVRSRikgfHwgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIwKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxKSB8fCAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMikgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMykgfHwgICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjUpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjYpIHx8ICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI3KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI4KSkpIHx8IFwKKyAgICgoKElOU1RBTkNFKSA9PSBUSU04KSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMUZfRUQpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTFGUDEpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkyRlAyKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19FVFJGKSB8fCBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjApIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjEpIHx8ICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIyKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIzKSB8fCAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNCkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNikgfHwgICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjcpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjgpKSkgfHwgXAorICAgKCgoSU5TVEFOQ0UpID09IFRJTTE1KSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkxRl9FRCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMUZQMSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTJGUDIpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjApIHx8IFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMSkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMikgfHwgICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjMpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjQpIHx8ICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI1KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI3KSB8fCAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSOCkpKSkKKworI2RlZmluZSBJU19USU1fSU5URVJOQUxfVFJJR0dFUkVWRU5UX0lOU1RBTkNFKElOU1RBTkNFLCBfX1NFTEVDVElPTl9fKSAgICAgICBcCisgICgoKChJTlNUQU5DRSkgPT0gVElNMSkgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMSkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMikgfHwgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIzKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI0KSB8fCBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjUpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjYpIHx8IFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNykgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSOCkgfHwgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19OT05FKSkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKChJTlNUQU5DRSkgPT0gVElNMikgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMCkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMikgfHwgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIzKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI0KSB8fCBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjUpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjYpIHx8IFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNykgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSOCkgfHwgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxMSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX05PTkUpKSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoKElOU1RBTkNFKSA9PSBUSU0zKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIwKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxKSB8fCBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjMpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjQpIHx8IFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNSkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNikgfHwgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI3KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI4KSB8fCBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX05PTkUpKSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoKElOU1RBTkNFKSA9PSBUSU00KSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIwKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxKSB8fCBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjIpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjQpIHx8IFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNSkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNikgfHwgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI3KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI4KSB8fCBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX05PTkUpKSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoKElOU1RBTkNFKSA9PSBUSU01KSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIwKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxKSB8fCBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjIpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjMpIHx8IFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNSkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNikgfHwgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI3KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI4KSB8fCBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX05PTkUpKSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoKElOU1RBTkNFKSA9PSBUSU04KSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIwKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxKSB8fCBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjIpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjMpIHx8IFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNCkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNikgfHwgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI3KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI4KSB8fCBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX05PTkUpKSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoKElOU1RBTkNFKSA9PSBUSU0xNSkgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIwKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxKSB8fCBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjIpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjMpIHx8IFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNCkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNSkgfHwgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI3KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI4KSB8fCBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX05PTkUpKSkpCisjZWxpZiBkZWZpbmVkKFRJTTIwKQorI2RlZmluZSBJU19USU1fQ0xPQ0tTT1VSQ0VfSU5TVEFOQ0UoSU5TVEFOQ0UsIF9fQ0xPQ0tfXykgICAgICAgICAgICAgICAgICAgXAorICAoKCgoSU5TVEFOQ0UpID09IFRJTTEpICYmICgoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lOVEVSTkFMKSB8fCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0VUUk1PREUxKSB8fCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0VUUk1PREUyKSB8fCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMUVEKSB8fCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMSkgfHwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMikgfHwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjEpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjIpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjMpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjUpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjYpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjcpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjgpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjkpKSkgfHwgICAgXAorICAgKCgoSU5TVEFOQ0UpID09IFRJTTIpICYmICgoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lOVEVSTkFMKSB8fCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0VUUk1PREUxKSB8fCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0VUUk1PREUyKSB8fCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMUVEKSB8fCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMSkgfHwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMikgfHwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjApIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjIpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjMpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjUpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjYpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjcpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjgpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjkpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjExKSkpIHx8ICAgXAorICAgKCgoSU5TVEFOQ0UpID09IFRJTTMpICYmICgoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lOVEVSTkFMKSB8fCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0VUUk1PREUxKSB8fCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0VUUk1PREUyKSB8fCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMUVEKSB8fCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMSkgfHwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMikgfHwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjApIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjEpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjMpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjUpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjYpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjcpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjgpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjkpKSkgfHwgICAgXAorICAgKCgoSU5TVEFOQ0UpID09IFRJTTQpICYmICgoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lOVEVSTkFMKSB8fCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0VUUk1PREUxKSB8fCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0VUUk1PREUyKSB8fCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMUVEKSB8fCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMSkgfHwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMikgfHwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjApIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjEpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjIpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjUpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjYpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjcpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjgpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjkpKSkgfHwgICAgXAorICAgKCgoSU5TVEFOQ0UpID09IFRJTTgpICYmICgoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lOVEVSTkFMKSB8fCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0VUUk1PREUxKSB8fCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0VUUk1PREUyKSB8fCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMUVEKSB8fCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMSkgfHwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMikgfHwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjApIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjEpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjIpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjMpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjYpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjcpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjgpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjkpKSkgfHwgICAgXAorICAgKCgoSU5TVEFOQ0UpID09IFRJTTE1KSAmJiAoKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JTlRFUk5BTCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTFFRCkgfHwgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTEpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTIpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIwKSB8fCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIxKSB8fCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIyKSB8fCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIzKSB8fCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI1KSB8fCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI3KSB8fCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI4KSB8fCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI5KSkpIHx8ICAgXAorICAgKCgoSU5TVEFOQ0UpID09IFRJTTIwKSAmJiAoKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JTlRFUk5BTCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTFFRCkgfHwgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTEpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTIpIHx8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIwKSB8fCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIxKSB8fCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIyKSB8fCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIzKSB8fCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI1KSB8fCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI2KSB8fCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI3KSB8fCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI4KSkpKQorCisjZGVmaW5lIElTX1RJTV9UUklHR0VSX0lOU1RBTkNFKElOU1RBTkNFLCBfX1NFTEVDVElPTl9fKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKCgoSU5TVEFOQ0UpID09IFRJTTEpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkxRl9FRCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMUZQMSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTJGUDIpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0VUUkYpIHx8IFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMSkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMikgfHwgICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjMpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjUpIHx8ICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI2KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI3KSB8fCAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSOCkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSOSkpKSB8fCBcCisgICAoKChJTlNUQU5DRSkgPT0gVElNMikgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTFGX0VEKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkxRlAxKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMkZQMikgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfRVRSRikgfHwgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIwKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIyKSB8fCAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMykgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNSkgfHwgICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjYpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjcpIHx8ICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI4KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI5KSB8fCAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMTEpKSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKChJTlNUQU5DRSkgPT0gVElNMykgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTFGX0VEKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkxRlAxKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMkZQMikgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfRVRSRikgfHwgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIwKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxKSB8fCAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMykgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNSkgfHwgICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjYpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjcpIHx8ICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI4KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI5KSkpIHx8IFwKKyAgICgoKElOU1RBTkNFKSA9PSBUSU00KSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMUZfRUQpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTFGUDEpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkyRlAyKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19FVFJGKSB8fCBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjApIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjEpIHx8ICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIyKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI1KSB8fCAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNikgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNykgfHwgICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjgpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjkpKSkgfHwgXAorICAgKCgoSU5TVEFOQ0UpID09IFRJTTgpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkxRl9FRCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMUZQMSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTJGUDIpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0VUUkYpIHx8IFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMCkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMSkgfHwgICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjIpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjMpIHx8ICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI2KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI3KSB8fCAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSOCkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSOSkpKSB8fCBcCisgICAoKChJTlNUQU5DRSkgPT0gVElNMTUpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTFGX0VEKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkxRlAxKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMkZQMikgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMCkgfHwgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIyKSB8fCAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMykgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNSkgfHwgICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjcpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjgpIHx8ICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI5KSkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoKElOU1RBTkNFKSA9PSBUSU0yMCkgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMUZfRUQpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTFGUDEpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkyRlAyKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19FVFJGKSB8fCBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjApIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjEpIHx8ICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIyKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIzKSB8fCAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNSkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNikgfHwgICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjcpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjgpKSkpCisKKyNkZWZpbmUgSVNfVElNX0lOVEVSTkFMX1RSSUdHRVJFVkVOVF9JTlNUQU5DRShJTlNUQU5DRSwgX19TRUxFQ1RJT05fXykgICAgICAgXAorICAoKCgoSU5TVEFOQ0UpID09IFRJTTEpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjEpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjIpIHx8IFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMykgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNSkgfHwgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI2KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI3KSB8fCBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjgpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjkpIHx8IFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfTk9ORSkpKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKCgoSU5TVEFOQ0UpID09IFRJTTIpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjApIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjIpIHx8IFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMykgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNSkgfHwgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI2KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI3KSB8fCBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjgpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjkpIHx8IFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMTEpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19OT05FKSkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKChJTlNUQU5DRSkgPT0gVElNMykgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMCkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMSkgfHwgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIzKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI1KSB8fCBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjYpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjcpIHx8IFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSOCkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSOSkgfHwgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19OT05FKSkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKChJTlNUQU5DRSkgPT0gVElNNCkgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMCkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMSkgfHwgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIyKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI1KSB8fCBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjYpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjcpIHx8IFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSOCkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSOSkgfHwgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19OT05FKSkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKChJTlNUQU5DRSkgPT0gVElNOCkgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMCkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMSkgfHwgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIyKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIzKSB8fCBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjYpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjcpIHx8IFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSOCkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSOSkgfHwgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19OT05FKSkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKChJTlNUQU5DRSkgPT0gVElNMTUpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMCkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMSkgfHwgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIyKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIzKSB8fCBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjUpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjcpIHx8IFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSOCkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSOSkgfHwgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19OT05FKSkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKChJTlNUQU5DRSkgPT0gVElNMjApICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMCkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMSkgfHwgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIyKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIzKSB8fCBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjUpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjYpIHx8IFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNykgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSOCkgfHwgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19OT05FKSkpKQorI2Vsc2UKKyNkZWZpbmUgSVNfVElNX0NMT0NLU09VUkNFX0lOU1RBTkNFKElOU1RBTkNFLCBfX0NMT0NLX18pICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoKElOU1RBTkNFKSA9PSBUSU0xKSAmJiAoKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JTlRFUk5BTCkgfHwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMSkgfHwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMikgfHwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTFFRCkgfHwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTEpIHx8ICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTIpIHx8ICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIxKSB8fCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIyKSB8fCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIzKSB8fCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI1KSB8fCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI2KSB8fCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI3KSB8fCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI4KSkpIHx8ICAgIFwKKyAgICgoKElOU1RBTkNFKSA9PSBUSU0yKSAmJiAoKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JTlRFUk5BTCkgfHwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMikgfHwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMSkgfHwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTFFRCkgfHwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTEpIHx8ICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTIpIHx8ICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIwKSB8fCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIyKSB8fCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIzKSB8fCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI1KSB8fCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI2KSB8fCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI3KSB8fCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI4KSB8fCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIxMSkpKSB8fCAgIFwKKyAgICgoKElOU1RBTkNFKSA9PSBUSU0zKSAmJiAoKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JTlRFUk5BTCkgfHwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMSkgfHwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMikgfHwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTFFRCkgfHwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTEpIHx8ICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTIpIHx8ICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIwKSB8fCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIxKSB8fCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIzKSB8fCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI1KSB8fCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI2KSB8fCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI3KSB8fCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI4KSkpIHx8ICAgIFwKKyAgICgoKElOU1RBTkNFKSA9PSBUSU00KSAmJiAoKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JTlRFUk5BTCkgfHwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMikgfHwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMSkgfHwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTFFRCkgfHwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTEpIHx8ICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTIpIHx8ICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIwKSB8fCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIxKSB8fCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIyKSB8fCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI1KSB8fCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI2KSB8fCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI3KSB8fCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI4KSkpIHx8ICAgIFwKKyAgICgoKElOU1RBTkNFKSA9PSBUSU04KSAmJiAoKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JTlRFUk5BTCkgfHwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMikgfHwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMSkgfHwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTFFRCkgfHwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTEpIHx8ICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTIpIHx8ICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIwKSB8fCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIxKSB8fCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIyKSB8fCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIzKSB8fCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI2KSB8fCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI3KSB8fCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFI4KSkpIHx8ICAgIFwKKyAgICgoKElOU1RBTkNFKSA9PSBUSU0xNSkgJiYgKCgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSU5URVJOQUwpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkxRUQpIHx8ICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkxKSB8fCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfVEkyKSB8fCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMCkgfHwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMSkgfHwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMikgfHwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMykgfHwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNSkgfHwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNykgfHwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS19fKSA9PSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSOCkpKSkKKworI2RlZmluZSBJU19USU1fVFJJR0dFUl9JTlNUQU5DRShJTlNUQU5DRSwgX19TRUxFQ1RJT05fXykgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoKElOU1RBTkNFKSA9PSBUSU0xKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMUZfRUQpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTFGUDEpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkyRlAyKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19FVFJGKSB8fCBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjEpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjIpIHx8ICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIzKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI1KSB8fCAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNikgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNykgfHwgICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjgpKSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKCgoSU5TVEFOQ0UpID09IFRJTTIpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkxRl9FRCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMUZQMSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTJGUDIpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0VUUkYpIHx8IFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMCkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMikgfHwgICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjMpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjUpIHx8ICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI2KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI3KSB8fCAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSOCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjExKSkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKCgoSU5TVEFOQ0UpID09IFRJTTMpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkxRl9FRCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMUZQMSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTJGUDIpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0VUUkYpIHx8IFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMCkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMSkgfHwgICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjMpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjUpIHx8ICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI2KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI3KSB8fCAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSOCkpKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKChJTlNUQU5DRSkgPT0gVElNNCkgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTFGX0VEKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkxRlAxKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMkZQMikgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfRVRSRikgfHwgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIwKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxKSB8fCAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMikgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNSkgfHwgICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjYpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjcpIHx8ICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI4KSkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoKElOU1RBTkNFKSA9PSBUSU04KSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMUZfRUQpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTFGUDEpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkyRlAyKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19FVFJGKSB8fCBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjApIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjEpIHx8ICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIyKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIzKSB8fCAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNikgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNykgfHwgICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjgpKSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKCgoSU5TVEFOQ0UpID09IFRJTTE1KSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkxRl9FRCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMUZQMSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTJGUDIpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjApIHx8IFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMSkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMikgfHwgICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjMpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjUpIHx8ICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI3KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI4KSkpKQorCisjZGVmaW5lIElTX1RJTV9JTlRFUk5BTF9UUklHR0VSRVZFTlRfSU5TVEFOQ0UoSU5TVEFOQ0UsIF9fU0VMRUNUSU9OX18pICAgICAgICAgXAorICAoKCgoSU5TVEFOQ0UpID09IFRJTTEpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMSkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMikgfHwgICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjMpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjUpIHx8ICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI2KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI3KSB8fCAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSOCkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfTk9ORSkpKSB8fCBcCisgICAoKChJTlNUQU5DRSkgPT0gVElNMikgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIwKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIyKSB8fCAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMykgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNSkgfHwgICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjYpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjcpIHx8ICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI4KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxMSkgfHwgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfTk9ORSkpKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKChJTlNUQU5DRSkgPT0gVElNMykgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIwKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxKSB8fCAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMykgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNSkgfHwgICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjYpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjcpIHx8ICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI4KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19OT05FKSkpIHx8IFwKKyAgICgoKElOU1RBTkNFKSA9PSBUSU00KSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjApIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjEpIHx8ICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIyKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI1KSB8fCAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNikgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSNykgfHwgICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjgpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX05PTkUpKSkgfHwgXAorICAgKCgoSU5TVEFOQ0UpID09IFRJTTgpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMCkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMSkgfHwgICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjIpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjMpIHx8ICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI2KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI3KSB8fCAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSOCkgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfTk9ORSkpKSB8fCBcCisgICAoKChJTlNUQU5DRSkgPT0gVElNMTUpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIwKSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxKSB8fCAgIFwKKyAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMikgfHwgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMykgfHwgICBcCisgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjUpIHx8ICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjcpIHx8ICAgXAorICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFI4KSB8fCAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19OT05FKSkpKQorCisjZW5kaWYgLyogVElNNSAmJiBUSU0yMCAqLworCisjZGVmaW5lIElTX1RJTV9PQ19DSEFOTkVMX01PREUoX19NT0RFX18sIF9fQ0hBTk5FTF9fKSBcCisgIChJU19USU1fT0NfTU9ERShfX01PREVfXykgJiYgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKCgoX19NT0RFX18pID09IFRJTV9PQ01PREVfRElSRUNUSU9OX09VVFBVVCkgfHwgICBcCisgICAgICgoX19NT0RFX18pID09IFRJTV9PQ01PREVfUFVMU0VfT05fQ09NUEFSRSkpICAgICBcCisgICAgICAgID8gKCgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzMpIHx8ICAgICAgICBcCisgICAgICAgICAgICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzQpKSAgICAgICAgICBcCisgICAgICAgIDogKDEgPT0gMSkpKQorCisjZGVmaW5lIElTX1RJTV9QVUxTRU9OQ09NUEFSRV9DSEFOTkVMKF9fQ0hBTk5FTF9fKSBcCisgICgoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8zKSB8fCAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF80KSkKKworI2RlZmluZSBJU19USU1fUFVMU0VPTkNPTVBBUkVfSU5TVEFOQ0UoSU5TVEFOQ0UpIElTX1RJTV9DQzNfSU5TVEFOQ0UoSU5TVEFOQ0UpCisKKyNkZWZpbmUgSVNfVElNX1BVTFNFT05DT01QQVJFX1dJRFRIKF9fV0lEVEhfXykgKChfX1dJRFRIX18pIDw9IDB4RkZVKQorCisjZGVmaW5lIElTX1RJTV9QVUxTRU9OQ09NUEFSRV9XSURUSFBSRVNDQUxFUihfX1BSRVNDQUxFUl9fKSBcCisgICgoX19QUkVTQ0FMRVJfXykgPD0gMHg3VSkKKworI2RlZmluZSBJU19USU1fU0xBVkVfUFJFTE9BRF9TT1VSQ0UoX19TT1VSQ0VfXykgICAgICAgXAorICAoKChfX1NPVVJDRV9fKSA9PSBUSU1fU01TX1BSRUxPQURfU09VUkNFX1VQREFURSkgfHwgXAorICAgKChfX1NPVVJDRV9fKSA9PSBUSU1fU01TX1BSRUxPQURfU09VUkNFX0lOREVYKSkKKworI2RlZmluZSBJU19USU1fRU5DT0RFUklOREVYX1BPTEFSSVRZKF9fUE9MQVJJVFlfXykgICAgICAgICAgIFwKKyAgKCgoX19QT0xBUklUWV9fKSA9PSBUSU1fRU5DT0RFUklOREVYX1BPTEFSSVRZX0lOVkVSVEVEKSB8fCBcCisgICAoKF9fUE9MQVJJVFlfXykgPT0gVElNX0VOQ09ERVJJTkRFWF9QT0xBUklUWV9OT05JTlZFUlRFRCkpCisKKyNkZWZpbmUgSVNfVElNX0VOQ09ERVJJTkRFWF9QUkVTQ0FMRVIoX19QUkVTQ0FMRVJfXykgICAgICAgXAorICAoKChfX1BSRVNDQUxFUl9fKSA9PSBUSU1fRU5DT0RFUklOREVYX1BSRVNDQUxFUl9ESVYxKSB8fCBcCisgICAoKF9fUFJFU0NBTEVSX18pID09IFRJTV9FTkNPREVSSU5ERVhfUFJFU0NBTEVSX0RJVjIpIHx8IFwKKyAgICgoX19QUkVTQ0FMRVJfXykgPT0gVElNX0VOQ09ERVJJTkRFWF9QUkVTQ0FMRVJfRElWNCkgfHwgXAorICAgKChfX1BSRVNDQUxFUl9fKSA9PSBUSU1fRU5DT0RFUklOREVYX1BSRVNDQUxFUl9ESVY4KSkKKworI2RlZmluZSBJU19USU1fRU5DT0RFUklOREVYX0ZJTFRFUihfX0ZJTFRFUl9fKSAoKF9fRklMVEVSX18pIDw9IDB4RlVMKQorCisjZGVmaW5lIElTX1RJTV9FTkNPREVSSU5ERVhfUE9TSVRJT04oX19QT1NJVElPTl9fKSAgICAgXAorICAoKChfX1BPU0lUSU9OX18pID09IFRJTV9FTkNPREVSSU5ERVhfUE9TSVRJT05fMDApIHx8IFwKKyAgICgoX19QT1NJVElPTl9fKSA9PSBUSU1fRU5DT0RFUklOREVYX1BPU0lUSU9OXzAxKSB8fCBcCisgICAoKF9fUE9TSVRJT05fXykgPT0gVElNX0VOQ09ERVJJTkRFWF9QT1NJVElPTl8xMCkgfHwgXAorICAgKChfX1BPU0lUSU9OX18pID09IFRJTV9FTkNPREVSSU5ERVhfUE9TSVRJT05fMTEpIHx8IFwKKyAgICgoX19QT1NJVElPTl9fKSA9PSBUSU1fRU5DT0RFUklOREVYX1BPU0lUSU9OXzApIHx8ICBcCisgICAoKF9fUE9TSVRJT05fXykgPT0gVElNX0VOQ09ERVJJTkRFWF9QT1NJVElPTl8xKSkKKworI2RlZmluZSBJU19USU1fRU5DT0RFUklOREVYX0RJUkVDVElPTihfX0RJUkVDVElPTl9fKSAgICAgICAgICBcCisgICgoKF9fRElSRUNUSU9OX18pID09IFRJTV9FTkNPREVSSU5ERVhfRElSRUNUSU9OX1VQX0RPV04pIHx8IFwKKyAgICgoX19ESVJFQ1RJT05fXykgPT0gVElNX0VOQ09ERVJJTkRFWF9ESVJFQ1RJT05fVVApIHx8ICAgICAgXAorICAgKChfX0RJUkVDVElPTl9fKSA9PSBUSU1fRU5DT0RFUklOREVYX0RJUkVDVElPTl9ET1dOKSkKKy8qKgorICogQH0KKyAqLworLyogRW5kIG9mIHByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBUSU1FeF9FeHBvcnRlZF9GdW5jdGlvbnMgVElNIEV4dGVuZGVkIEV4cG9ydGVkIEZ1bmN0aW9ucworICogQHsKKyAqLworCisvKiogQGFkZHRvZ3JvdXAgVElNRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBFeHRlbmRlZCBUaW1lciBIYWxsIFNlbnNvcgorICogZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgIFRpbWVyIEhhbGwgU2Vuc29yIGZ1bmN0aW9ucworICogQHsKKyAqLworLyogIFRpbWVyIEhhbGwgU2Vuc29yIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9IYWxsU2Vuc29yX0luaXQoCisgICAgVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIGNvbnN0IFRJTV9IYWxsU2Vuc29yX0luaXRUeXBlRGVmICpzQ29uZmlnKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9IYWxsU2Vuc29yX0RlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CisKK3ZvaWQgSEFMX1RJTUV4X0hhbGxTZW5zb3JfTXNwSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7Cit2b2lkIEhBTF9USU1FeF9IYWxsU2Vuc29yX01zcERlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CisKKy8qIEJsb2NraW5nIG1vZGU6IFBvbGxpbmcgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9IYWxsU2Vuc29yX1N0YXJ0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9IYWxsU2Vuc29yX1N0b3AoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworLyogTm9uLUJsb2NraW5nIG1vZGU6IEludGVycnVwdCAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0hhbGxTZW5zb3JfU3RhcnRfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0hhbGxTZW5zb3JfU3RvcF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CisvKiBOb24tQmxvY2tpbmcgbW9kZTogRE1BICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfSGFsbFNlbnNvcl9TdGFydF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IExlbmd0aCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfSGFsbFNlbnNvcl9TdG9wX0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CisvKioKKyAqIEB9CisgKi8KKworLyoqIEBhZGR0b2dyb3VwIFRJTUV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgRXh0ZW5kZWQgVGltZXIgQ29tcGxlbWVudGFyeQorICogT3V0cHV0IENvbXBhcmUgZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgVGltZXIgQ29tcGxlbWVudGFyeSBPdXRwdXQgQ29tcGFyZSBmdW5jdGlvbnMKKyAqIEB7CisgKi8KKy8qICBUaW1lciBDb21wbGVtZW50YXJ5IE91dHB1dCBDb21wYXJlIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBCbG9ja2luZyBtb2RlOiBQb2xsaW5nICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfT0NOX1N0YXJ0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9PQ05fU3RvcChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCk7CisKKy8qIE5vbi1CbG9ja2luZyBtb2RlOiBJbnRlcnJ1cHQgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9PQ05fU3RhcnRfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X09DTl9TdG9wX0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpOworCisvKiBOb24tQmxvY2tpbmcgbW9kZTogRE1BICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfT0NOX1N0YXJ0X0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCAqcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBMZW5ndGgpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X09DTl9TdG9wX0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCk7CisvKioKKyAqIEB9CisgKi8KKworLyoqIEBhZGR0b2dyb3VwIFRJTUV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgRXh0ZW5kZWQgVGltZXIgQ29tcGxlbWVudGFyeSBQV00KKyAqIGZ1bmN0aW9ucworICogIEBicmllZiAgICBUaW1lciBDb21wbGVtZW50YXJ5IFBXTSBmdW5jdGlvbnMKKyAqIEB7CisgKi8KKy8qICBUaW1lciBDb21wbGVtZW50YXJ5IFBXTSBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBCbG9ja2luZyBtb2RlOiBQb2xsaW5nICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfUFdNTl9TdGFydChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X1BXTU5fU3RvcChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCk7CisKKy8qIE5vbi1CbG9ja2luZyBtb2RlOiBJbnRlcnJ1cHQgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9QV01OX1N0YXJ0X0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfUFdNTl9TdG9wX0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKTsKKy8qIE5vbi1CbG9ja2luZyBtb2RlOiBETUEgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9QV01OX1N0YXJ0X0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90ICpwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBMZW5ndGgpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X1BXTU5fU3RvcF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKTsKKy8qKgorICogQH0KKyAqLworCisvKiogQGFkZHRvZ3JvdXAgVElNRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNCBFeHRlbmRlZCBUaW1lciBDb21wbGVtZW50YXJ5IE9uZQorICogUHVsc2UgZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgIFRpbWVyIENvbXBsZW1lbnRhcnkgT25lIFB1bHNlIGZ1bmN0aW9ucworICogQHsKKyAqLworLyogIFRpbWVyIENvbXBsZW1lbnRhcnkgT25lIFB1bHNlIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEJsb2NraW5nIG1vZGU6IFBvbGxpbmcgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9PbmVQdWxzZU5fU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE91dHB1dENoYW5uZWwpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X09uZVB1bHNlTl9TdG9wKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE91dHB1dENoYW5uZWwpOworCisvKiBOb24tQmxvY2tpbmcgbW9kZTogSW50ZXJydXB0ICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfT25lUHVsc2VOX1N0YXJ0X0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBPdXRwdXRDaGFubmVsKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9PbmVQdWxzZU5fU3RvcF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBPdXRwdXRDaGFubmVsKTsKKy8qKgorICogQH0KKyAqLworCisvKiogQGFkZHRvZ3JvdXAgVElNRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNSBFeHRlbmRlZCBQZXJpcGhlcmFsIENvbnRyb2wKKyAqIGZ1bmN0aW9ucworICogIEBicmllZiAgICBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgKiBAeworICovCisvKiBFeHRlbmRlZCBDb250cm9sIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0NvbmZpZ0NvbW11dEV2ZW50KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IElucHV0VHJpZ2dlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDb21tdXRhdGlvblNvdXJjZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfQ29uZmlnQ29tbXV0RXZlbnRfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgSW5wdXRUcmlnZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENvbW11dGF0aW9uU291cmNlKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9Db25maWdDb21tdXRFdmVudF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IElucHV0VHJpZ2dlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ29tbXV0YXRpb25Tb3VyY2UpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X01hc3RlckNvbmZpZ1N5bmNocm9uaXphdGlvbigKKyAgICBUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgY29uc3QgVElNX01hc3RlckNvbmZpZ1R5cGVEZWYgKnNNYXN0ZXJDb25maWcpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0NvbmZpZ0JyZWFrRGVhZFRpbWUoCisgICAgVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgY29uc3QgVElNX0JyZWFrRGVhZFRpbWVDb25maWdUeXBlRGVmICpzQnJlYWtEZWFkVGltZUNvbmZpZyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfQ29uZmlnQnJlYWtJbnB1dCgKKyAgICBUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQnJlYWtJbnB1dCwKKyAgICBjb25zdCBUSU1FeF9CcmVha0lucHV0Q29uZmlnVHlwZURlZiAqc0JyZWFrSW5wdXRDb25maWcpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0dyb3VwQ2hhbm5lbDUoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVscyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfUmVtYXBDb25maWcoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUmVtYXApOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X1RJU2VsZWN0aW9uKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRJU2VsZWN0aW9uLCB1aW50MzJfdCBDaGFubmVsKTsKKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0Rpc2FybUJyZWFrSW5wdXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBCcmVha0lucHV0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9SZUFybUJyZWFrSW5wdXQoY29uc3QgVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEJyZWFrSW5wdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0RpdGhlcmluZ0VuYWJsZShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfRGl0aGVyaW5nRGlzYWJsZShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfT0NfQ29uZmlnUHVsc2VPbkNvbXBhcmUoCisgICAgVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IFB1bHNlV2lkdGhQcmVzY2FsZXIsIHVpbnQzMl90IFB1bHNlV2lkdGgpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0NvbmZpZ1NsYXZlTW9kZVByZWxvYWQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBTb3VyY2UpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0VuYWJsZVNsYXZlTW9kZVByZWxvYWQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0Rpc2FibGVTbGF2ZU1vZGVQcmVsb2FkKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9FbmFibGVEZWFkVGltZVByZWxvYWQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0Rpc2FibGVEZWFkVGltZVByZWxvYWQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0NvbmZpZ0RlYWRUaW1lKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IERlYWR0aW1lKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9Db25maWdBc3ltbWV0cmljYWxEZWFkVGltZSgKKyAgICBUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgRmFsbGluZ0RlYWR0aW1lKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9FbmFibGVBc3ltbWV0cmljYWxEZWFkVGltZShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfRGlzYWJsZUFzeW1tZXRyaWNhbERlYWRUaW1lKAorICAgIFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9Db25maWdFbmNvZGVySW5kZXgoCisgICAgVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgVElNRXhfRW5jb2RlckluZGV4Q29uZmlnVHlwZURlZiAqc0VuY29kZXJJbmRleENvbmZpZyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfRW5hYmxlRW5jb2RlckluZGV4KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9EaXNhYmxlRW5jb2RlckluZGV4KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9FbmFibGVFbmNvZGVyRmlyc3RJbmRleChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfRGlzYWJsZUVuY29kZXJGaXJzdEluZGV4KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKKy8qKgorICogQH0KKyAqLworCisvKiogQGFkZHRvZ3JvdXAgVElNRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNiBFeHRlbmRlZCBDYWxsYmFja3MgZnVuY3Rpb25zCisgKiBAYnJpZWYgICAgRXh0ZW5kZWQgQ2FsbGJhY2tzIGZ1bmN0aW9ucworICogQHsKKyAqLworLyogRXh0ZW5kZWQgQ2FsbGJhY2sgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgSEFMX1RJTUV4X0NvbW11dENhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK3ZvaWQgSEFMX1RJTUV4X0NvbW11dEhhbGZDcGx0Q2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOwordm9pZCBIQUxfVElNRXhfQnJlYWtDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7Cit2b2lkIEhBTF9USU1FeF9CcmVhazJDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7Cit2b2lkIEhBTF9USU1FeF9FbmNvZGVySW5kZXhDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7Cit2b2lkIEhBTF9USU1FeF9EaXJlY3Rpb25DaGFuZ2VDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7Cit2b2lkIEhBTF9USU1FeF9JbmRleEVycm9yQ2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOwordm9pZCBIQUxfVElNRXhfVHJhbnNpdGlvbkVycm9yQ2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworLyoqCisgKiBAfQorICovCisKKy8qKiBAYWRkdG9ncm91cCBUSU1FeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA3IEV4dGVuZGVkIFBlcmlwaGVyYWwgU3RhdGUKKyAqIGZ1bmN0aW9ucworICogQGJyaWVmICAgIEV4dGVuZGVkIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zCisgKiBAeworICovCisvKiBFeHRlbmRlZCBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1RJTV9TdGF0ZVR5cGVEZWYgSEFMX1RJTUV4X0hhbGxTZW5zb3JfR2V0U3RhdGUoCisgICAgY29uc3QgVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworSEFMX1RJTV9DaGFubmVsU3RhdGVUeXBlRGVmIEhBTF9USU1FeF9HZXRDaGFubmVsTlN0YXRlKAorICAgIGNvbnN0IFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsTik7CisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCisvKiBFbmQgb2YgZXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBQcml2YXRlIGZ1bmN0aW9ucy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFRJTUV4X1ByaXZhdGVfRnVuY3Rpb25zIFRJTSBFeHRlbmRlZCBQcml2YXRlIEZ1bmN0aW9ucworICogQHsKKyAqLwordm9pZCBUSU1FeF9ETUFDb21tdXRhdGlvbkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOwordm9pZCBUSU1FeF9ETUFDb21tdXRhdGlvbkhhbGZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKKy8qKgorICogQH0KKyAqLworLyogRW5kIG9mIHByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJHNHh4X0hBTF9USU1fRVhfSCAqLwpkaWZmIC0tZ2l0IGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfaGFsX3VhcnQuaCBiL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9JbmMvc3RtMzJnNHh4X2hhbF91YXJ0LmgKaW5kZXggZTI5NjBjOC4uNDZlY2IzYyAxMDA2NDQKLS0tIGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfaGFsX3VhcnQuaAorKysgYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9oYWxfdWFydC5oCkBAIC0xLDE5OTMgKzEsMjAxNiBAQAotLyoqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEBmaWxlICAgIHN0bTMyZzR4eF9oYWxfdWFydC5oDQotICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0NCi0gKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBVQVJUIEhBTCBtb2R1bGUuDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEBhdHRlbnRpb24NCi0gKg0KLSAqIENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4NCi0gKg0KLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGVybXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZQ0KLSAqIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4NCi0gKiBJZiBubyBMSUNFTlNFIGZpbGUgY29tZXMgd2l0aCB0aGlzIHNvZnR3YXJlLCBpdCBpcyBwcm92aWRlZCBBUy1JUy4NCi0gKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKi8NCi0NCi0vKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpZm5kZWYgU1RNMzJHNHh4X0hBTF9VQVJUX0gNCi0jZGVmaW5lIFNUTTMyRzR4eF9IQUxfVUFSVF9IDQotDQotI2lmZGVmIF9fY3BsdXNwbHVzDQotZXh0ZXJuICJDIiB7DQotI2VuZGlmDQotDQotLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaW5jbHVkZSAic3RtMzJnNHh4X2hhbF9kZWYuaCINCi0NCi0vKiogQGFkZHRvZ3JvdXAgU1RNMzJHNHh4X0hBTF9Ecml2ZXINCi0gKiBAew0KLSAqLw0KLQ0KLS8qKiBAYWRkdG9ncm91cCBVQVJUDQotICogQHsNCi0gKi8NCi0NCi0vKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgVUFSVF9FeHBvcnRlZF9UeXBlcyBVQVJUIEV4cG9ydGVkIFR5cGVzDQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgVUFSVCBJbml0IFN0cnVjdHVyZSBkZWZpbml0aW9uDQotICovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgdWludDMyX3QNCi0gICAgICBCYXVkUmF0ZTsgLyohPCBUaGlzIG1lbWJlciBjb25maWd1cmVzIHRoZSBVQVJUIGNvbW11bmljYXRpb24gYmF1ZCByYXRlLg0KLSAgICAgICAgICAgICAgICAgICAgIFRoZSBiYXVkIHJhdGUgcmVnaXN0ZXIgaXMgY29tcHV0ZWQgdXNpbmcgdGhlIGZvbGxvd2luZw0KLSAgICAgICAgICAgICAgICAgICBmb3JtdWxhOiBMUFVBUlQ6DQotICAgICAgICAgICAgICAgICAgICAgPT09PT09PQ0KLSAgICAgICAgICAgICAgICAgICAgIEJhdWQgUmF0ZSBSZWdpc3RlciA9ICgoMjU2ICogbHB1YXJ0X2tlcl9ja3ByZXMpIC8NCi0gICAgICAgICAgICAgICAgICAgKChodWFydC0+SW5pdC5CYXVkUmF0ZSkpKSB3aGVyZSBscHVhcnRfa2VyX2NrX3ByZXMgaXMgdGhlDQotICAgICAgICAgICAgICAgICAgIFVBUlQgaW5wdXQgY2xvY2sgZGl2aWRlZCBieSBhIHByZXNjYWxlciBVQVJUOg0KLSAgICAgICAgICAgICAgICAgICAgID09PT09DQotICAgICAgICAgICAgICAgICAgICAgLSBJZiBvdmVyc2FtcGxpbmcgaXMgMTYgb3IgaW4gTElOIG1vZGUsDQotICAgICAgICAgICAgICAgICAgICAgICAgQmF1ZCBSYXRlIFJlZ2lzdGVyID0gKCh1YXJ0X2tlcl9ja3ByZXMpIC8NCi0gICAgICAgICAgICAgICAgICAgKChodWFydC0+SW5pdC5CYXVkUmF0ZSkpKQ0KLSAgICAgICAgICAgICAgICAgICAgIC0gSWYgb3ZlcnNhbXBsaW5nIGlzIDgsDQotICAgICAgICAgICAgICAgICAgICAgICAgQmF1ZCBSYXRlIFJlZ2lzdGVyWzE1OjRdID0gKCgyICogdWFydF9rZXJfY2twcmVzKSAvDQotICAgICAgICAgICAgICAgICAgICAgICAgKChodWFydC0+SW5pdC5CYXVkUmF0ZSkpKVsxNTo0XQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIEJhdWQgUmF0ZSBSZWdpc3RlclszXSA9ICAwDQotICAgICAgICAgICAgICAgICAgICAgICAgQmF1ZCBSYXRlIFJlZ2lzdGVyWzI6MF0gPSAgKCgoMiAqIHVhcnRfa2VyX2NrcHJlcykgLw0KLSAgICAgICAgICAgICAgICAgICAgICAgICgoaHVhcnQtPkluaXQuQmF1ZFJhdGUpKSlbMzowXSkgPj4gMQ0KLSAgICAgICAgICAgICAgICAgICAgIHdoZXJlIHVhcnRfa2VyX2NrX3ByZXMgaXMgdGhlIFVBUlQgaW5wdXQgY2xvY2sgZGl2aWRlZCBieSBhDQotICAgICAgICAgICAgICAgICAgIHByZXNjYWxlciAqLw0KLQ0KLSAgdWludDMyX3QgV29yZExlbmd0aDsgLyohPCBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBkYXRhIGJpdHMgdHJhbnNtaXR0ZWQgb3INCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVkIGluIGEgZnJhbWUuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mDQotICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIFVBUlRFeF9Xb3JkX0xlbmd0aC4gKi8NCi0NCi0gIHVpbnQzMl90DQotICAgICAgU3RvcEJpdHM7IC8qITwgU3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygc3RvcCBiaXRzIHRyYW5zbWl0dGVkLg0KLSAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVUFSVF9TdG9wX0JpdHMuICovDQotDQotICB1aW50MzJfdCBQYXJpdHk7IC8qITwgU3BlY2lmaWVzIHRoZSBwYXJpdHkgbW9kZS4NCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFVBUlRfUGFyaXR5DQotICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgV2hlbiBwYXJpdHkgaXMgZW5hYmxlZCwgdGhlIGNvbXB1dGVkIHBhcml0eSBpcw0KLSAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRlZCBhdCB0aGUgTVNCIHBvc2l0aW9uIG9mIHRoZSB0cmFuc21pdHRlZCBkYXRhICg5dGgNCi0gICAgICAgICAgICAgICAgICAgICAgYml0IHdoZW4gdGhlIHdvcmQgbGVuZ3RoIGlzIHNldCB0byA5IGRhdGEgYml0czsgOHRoIGJpdA0KLSAgICAgICAgICAgICAgICAgICAgICB3aGVuIHRoZSB3b3JkIGxlbmd0aCBpcyBzZXQgdG8gOCBkYXRhIGJpdHMpLiAqLw0KLQ0KLSAgdWludDMyX3QNCi0gICAgICBNb2RlOyAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBSZWNlaXZlIG9yIFRyYW5zbWl0IG1vZGUgaXMgZW5hYmxlZCBvcg0KLSAgICAgICAgICAgICAgIGRpc2FibGVkLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFVBUlRfTW9kZS4gKi8NCi0NCi0gIHVpbnQzMl90IEh3Rmxvd0N0bDsgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgaGFyZHdhcmUgZmxvdyBjb250cm9sIG1vZGUgaXMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZCBvciBkaXNhYmxlZC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YNCi0gICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBVQVJUX0hhcmR3YXJlX0Zsb3dfQ29udHJvbC4gKi8NCi0NCi0gIHVpbnQzMl90IE92ZXJTYW1wbGluZzsgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgT3ZlciBzYW1wbGluZyA4IGlzIGVuYWJsZWQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgZGlzYWJsZWQsIHRvIGFjaGlldmUgaGlnaGVyIHNwZWVkICh1cCB0bw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmX1BDTEsvOCkuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVUFSVF9PdmVyX1NhbXBsaW5nLiAqLw0KLQ0KLSAgdWludDMyX3QgT25lQml0U2FtcGxpbmc7IC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgYSBzaW5nbGUgc2FtcGxlIG9yIHRocmVlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcycgbWFqb3JpdHkgdm90ZSBpcyBzZWxlY3RlZC4gU2VsZWN0aW5nIHRoZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmdsZSBzYW1wbGUgbWV0aG9kIGluY3JlYXNlcyB0aGUgcmVjZWl2ZXINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2xlcmFuY2UgdG8gY2xvY2sgZGV2aWF0aW9ucy4gVGhpcyBwYXJhbWV0ZXIgY2FuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgYSB2YWx1ZSBvZiBAcmVmIFVBUlRfT25lQml0X1NhbXBsaW5nLiAqLw0KLQ0KLSAgdWludDMyX3QgQ2xvY2tQcmVzY2FsZXI7IC8qITwgU3BlY2lmaWVzIHRoZSBwcmVzY2FsZXIgdmFsdWUgdXNlZCB0byBkaXZpZGUgdGhlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUFSVCBjbG9jayBzb3VyY2UuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgQHJlZiBVQVJUX0Nsb2NrUHJlc2NhbGVyLiAqLw0KLQ0KLX0gVUFSVF9Jbml0VHlwZURlZjsNCi0NCi0vKioNCi0gKiBAYnJpZWYgIFVBUlQgQWR2YW5jZWQgRmVhdHVyZXMgaW5pdGlhbGl6YXRpb24gc3RydWN0dXJlIGRlZmluaXRpb24NCi0gKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICB1aW50MzJfdA0KLSAgICAgIEFkdkZlYXR1cmVJbml0OyAvKiE8IFNwZWNpZmllcyB3aGljaCBhZHZhbmNlZCBVQVJUIGZlYXR1cmVzIGlzDQotICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVkLiBTZXZlcmFsIEFkdmFuY2VkIEZlYXR1cmVzIG1heSBiZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplZCBhdCB0aGUgc2FtZSB0aW1lIC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGENCi0gICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgb2YNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIFVBUlRfQWR2YW5jZWRfRmVhdHVyZXNfSW5pdGlhbGl6YXRpb25fVHlwZS4gKi8NCi0NCi0gIHVpbnQzMl90IFR4UGluTGV2ZWxJbnZlcnQ7IC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIFRYIHBpbiBhY3RpdmUgbGV2ZWwgaXMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmVydGVkLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQVJUX1R4X0ludi4gKi8NCi0NCi0gIHVpbnQzMl90IFJ4UGluTGV2ZWxJbnZlcnQ7IC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIFJYIHBpbiBhY3RpdmUgbGV2ZWwgaXMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmVydGVkLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQVJUX1J4X0ludi4gKi8NCi0NCi0gIHVpbnQzMl90IERhdGFJbnZlcnQ7IC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgZGF0YSBhcmUgaW52ZXJ0ZWQgKHBvc2l0aXZlL2RpcmVjdA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgbG9naWMgdnMgbmVnYXRpdmUvaW52ZXJ0ZWQgbG9naWMpLiBUaGlzIHBhcmFtZXRlciBjYW4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGEgdmFsdWUgb2YgQHJlZiBVQVJUX0RhdGFfSW52LiAqLw0KLQ0KLSAgdWludDMyX3QgU3dhcDsgLyohPCBTcGVjaWZpZXMgd2hldGhlciBUWCBhbmQgUlggcGlucyBhcmUgc3dhcHBlZC4NCi0gICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVQVJUX1J4X1R4X1N3YXAuICovDQotDQotICB1aW50MzJfdCBPdmVycnVuRGlzYWJsZTsgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgcmVjZXB0aW9uIG92ZXJydW4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRlY3Rpb24gaXMgZGlzYWJsZWQuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgb2YgQHJlZiBVQVJUX092ZXJydW5fRGlzYWJsZS4gKi8NCi0NCi0gIHVpbnQzMl90DQotICAgICAgRE1BRGlzYWJsZW9uUnhFcnJvcjsgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgRE1BIGlzIGRpc2FibGVkIGluIGNhc2Ugb2YNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlcHRpb24gZXJyb3IuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBVQVJUX0RNQV9EaXNhYmxlX29uX1J4X0Vycm9yLiAqLw0KLQ0KLSAgdWludDMyX3QgQXV0b0JhdWRSYXRlRW5hYmxlOyAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIGF1dG8gQmF1ZCByYXRlIGRldGVjdGlvbg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBlbmFibGVkLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIFVBUlRfQXV0b0JhdWRSYXRlX0VuYWJsZS4gKi8NCi0NCi0gIHVpbnQzMl90IEF1dG9CYXVkUmF0ZU1vZGU7IC8qITwgSWYgYXV0byBCYXVkIHJhdGUgZGV0ZWN0aW9uIGlzIGVuYWJsZWQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgaG93IHRoZSByYXRlIGRldGVjdGlvbiBpcyBjYXJyaWVkIG91dC4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUFSVF9BdXRvQmF1ZF9SYXRlX01vZGUuICovDQotDQotICB1aW50MzJfdA0KLSAgICAgIE1TQkZpcnN0OyAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIE1TQiBpcyBzZW50IGZpcnN0IG9uIFVBUlQgbGluZS4NCi0gICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFVBUlRfTVNCX0ZpcnN0LiAqLw0KLX0gVUFSVF9BZHZGZWF0dXJlSW5pdFR5cGVEZWY7DQotDQotLyoqDQotICogQGJyaWVmIEhBTCBVQVJUIFN0YXRlIGRlZmluaXRpb24NCi0gKiBAbm90ZSAgSEFMIFVBUlQgU3RhdGUgdmFsdWUgaXMgYSBjb21iaW5hdGlvbiBvZiAyIGRpZmZlcmVudCBzdWJzdGF0ZXM6DQotICogICAgICAgIGdTdGF0ZSBhbmQgUnhTdGF0ZSAoc2VlIEByZWYgVUFSVF9TdGF0ZV9EZWZpbml0aW9uKS4NCi0gKiAgICAgICAgLSBnU3RhdGUgY29udGFpbnMgVUFSVCBzdGF0ZSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGdsb2JhbCBIYW5kbGUNCi0gKiBtYW5hZ2VtZW50IGFuZCBhbHNvIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gVHggb3BlcmF0aW9ucy4gZ1N0YXRlIHZhbHVlIGNvZGluZw0KLSAqIGZvbGxvdyBiZWxvdyBkZXNjcmliZWQgYml0bWFwIDogYjctYjYgIEVycm9yIGluZm9ybWF0aW9uIDAwIDogTm8gRXJyb3IgMDEgOg0KLSAqIChOb3QgVXNlZCkgMTAgOiBUaW1lb3V0IDExIDogRXJyb3IgYjUgICAgIFBlcmlwaGVyYWwgaW5pdGlhbGl6YXRpb24gc3RhdHVzIDANCi0gKiA6IFJlc2V0IChQZXJpcGhlcmFsIG5vdCBpbml0aWFsaXplZCkgMSAgOiBJbml0IGRvbmUgKFBlcmlwaGVyYWwgaW5pdGlhbGl6ZWQuDQotICogSEFMIFVBUlQgSW5pdCBmdW5jdGlvbiBhbHJlYWR5IGNhbGxlZCkgYjQtYjMgIChub3QgdXNlZCkgeHggOiBTaG91bGQgYmUgc2V0DQotICogdG8gMDAgYjIgICAgIEludHJpbnNpYyBwcm9jZXNzIHN0YXRlIDAgIDogUmVhZHkgMSAgOiBCdXN5IChQZXJpcGhlcmFsIGJ1c3kNCi0gKiB3aXRoIHNvbWUgY29uZmlndXJhdGlvbiBvciBpbnRlcm5hbCBvcGVyYXRpb25zKSBiMSAgICAgKG5vdCB1c2VkKSB4ICA6IFNob3VsZA0KLSAqIGJlIHNldCB0byAwIGIwICAgICBUeCBzdGF0ZSAwICA6IFJlYWR5IChubyBUeCBvcGVyYXRpb24gb25nb2luZykgMSAgOiBCdXN5DQotICogKFR4IG9wZXJhdGlvbiBvbmdvaW5nKQ0KLSAqICAgICAgICAtIFJ4U3RhdGUgY29udGFpbnMgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBSeCBvcGVyYXRpb25zLg0KLSAqICAgICAgICAgIFJ4U3RhdGUgdmFsdWUgY29kaW5nIGZvbGxvdyBiZWxvdyBkZXNjcmliZWQgYml0bWFwIDoNCi0gKiAgICAgICAgICBiNy1iNiAgKG5vdCB1c2VkKQ0KLSAqICAgICAgICAgICAgIHh4IDogU2hvdWxkIGJlIHNldCB0byAwMA0KLSAqICAgICAgICAgIGI1ICAgICBQZXJpcGhlcmFsIGluaXRpYWxpemF0aW9uIHN0YXR1cw0KLSAqICAgICAgICAgICAgIDAgIDogUmVzZXQgKFBlcmlwaGVyYWwgbm90IGluaXRpYWxpemVkKQ0KLSAqICAgICAgICAgICAgIDEgIDogSW5pdCBkb25lIChQZXJpcGhlcmFsIGluaXRpYWxpemVkKQ0KLSAqICAgICAgICAgIGI0LWIyICAobm90IHVzZWQpDQotICogICAgICAgICAgICB4eHggOiBTaG91bGQgYmUgc2V0IHRvIDAwMA0KLSAqICAgICAgICAgIGIxICAgICBSeCBzdGF0ZQ0KLSAqICAgICAgICAgICAgIDAgIDogUmVhZHkgKG5vIFJ4IG9wZXJhdGlvbiBvbmdvaW5nKQ0KLSAqICAgICAgICAgICAgIDEgIDogQnVzeSAoUnggb3BlcmF0aW9uIG9uZ29pbmcpDQotICogICAgICAgICAgYjAgICAgIChub3QgdXNlZCkNCi0gKiAgICAgICAgICAgICB4ICA6IFNob3VsZCBiZSBzZXQgdG8gMC4NCi0gKi8NCi10eXBlZGVmIHVpbnQzMl90IEhBTF9VQVJUX1N0YXRlVHlwZURlZjsNCi0NCi0vKioNCi0gKiBAYnJpZWYgVUFSVCBjbG9jayBzb3VyY2VzIGRlZmluaXRpb24NCi0gKi8NCi10eXBlZGVmIGVudW0gew0KLSAgVUFSVF9DTE9DS1NPVVJDRV9QQ0xLMSA9IDB4MDBVLCAgICAvKiE8IFBDTEsxIGNsb2NrIHNvdXJjZSAgKi8NCi0gIFVBUlRfQ0xPQ0tTT1VSQ0VfUENMSzIgPSAweDAxVSwgICAgLyohPCBQQ0xLMiBjbG9jayBzb3VyY2UgICovDQotICBVQVJUX0NMT0NLU09VUkNFX0hTSSA9IDB4MDJVLCAgICAgIC8qITwgSFNJIGNsb2NrIHNvdXJjZSAgICAqLw0KLSAgVUFSVF9DTE9DS1NPVVJDRV9TWVNDTEsgPSAweDA0VSwgICAvKiE8IFNZU0NMSyBjbG9jayBzb3VyY2UgKi8NCi0gIFVBUlRfQ0xPQ0tTT1VSQ0VfTFNFID0gMHgwOFUsICAgICAgLyohPCBMU0UgY2xvY2sgc291cmNlICAgICAgICovDQotICBVQVJUX0NMT0NLU09VUkNFX1VOREVGSU5FRCA9IDB4MTBVIC8qITwgVW5kZWZpbmVkIGNsb2NrIHNvdXJjZSAqLw0KLX0gVUFSVF9DbG9ja1NvdXJjZVR5cGVEZWY7DQotDQotLyoqDQotICogQGJyaWVmIEhBTCBVQVJUIFJlY2VwdGlvbiB0eXBlIGRlZmluaXRpb24NCi0gKiBAbm90ZSAgSEFMIFVBUlQgUmVjZXB0aW9uIHR5cGUgdmFsdWUgYWltcyB0byBpZGVudGlmeSB3aGljaCB0eXBlIG9mIFJlY2VwdGlvbg0KLSAqIGlzIG9uZ29pbmcuIEl0IGlzIGV4cGVjdGVkIHRvIGFkbWl0IGZvbGxvd2luZyB2YWx1ZXMgOg0KLSAqICAgICAgICAgICBIQUxfVUFSVF9SRUNFUFRJT05fU1RBTkRBUkQgICAgICAgICA9IDB4MDBVLA0KLSAqICAgICAgICAgICBIQUxfVUFSVF9SRUNFUFRJT05fVE9JRExFICAgICAgICAgICA9IDB4MDFVLA0KLSAqICAgICAgICAgICBIQUxfVUFSVF9SRUNFUFRJT05fVE9SVE8gICAgICAgICAgICA9IDB4MDJVLA0KLSAqICAgICAgICAgICBIQUxfVUFSVF9SRUNFUFRJT05fVE9DSEFSTUFUQ0ggICAgICA9IDB4MDNVLA0KLSAqLw0KLXR5cGVkZWYgdWludDMyX3QgSEFMX1VBUlRfUnhUeXBlVHlwZURlZjsNCi0NCi0vKioNCi0gKiBAYnJpZWYgIFVBUlQgaGFuZGxlIFN0cnVjdHVyZSBkZWZpbml0aW9uDQotICovDQotdHlwZWRlZiBzdHJ1Y3QgX19VQVJUX0hhbmRsZVR5cGVEZWYgew0KLSAgVVNBUlRfVHlwZURlZiAqSW5zdGFuY2U7IC8qITwgVUFSVCByZWdpc3RlcnMgYmFzZSBhZGRyZXNzICAgICAgICAqLw0KLQ0KLSAgVUFSVF9Jbml0VHlwZURlZiBJbml0OyAvKiE8IFVBUlQgY29tbXVuaWNhdGlvbiBwYXJhbWV0ZXJzICAgICAgKi8NCi0NCi0gIFVBUlRfQWR2RmVhdHVyZUluaXRUeXBlRGVmDQotICAgICAgQWR2YW5jZWRJbml0OyAvKiE8IFVBUlQgQWR2YW5jZWQgRmVhdHVyZXMgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycyAqLw0KLQ0KLSAgY29uc3QgdWludDhfdCAqcFR4QnVmZlB0cjsgLyohPCBQb2ludGVyIHRvIFVBUlQgVHggdHJhbnNmZXIgQnVmZmVyICovDQotDQotICB1aW50MTZfdCBUeFhmZXJTaXplOyAvKiE8IFVBUlQgVHggVHJhbnNmZXIgc2l6ZSAgICAgICAgICAgICAgKi8NCi0NCi0gIF9fSU8gdWludDE2X3QgVHhYZmVyQ291bnQ7IC8qITwgVUFSVCBUeCBUcmFuc2ZlciBDb3VudGVyICAgICAgICAgICAqLw0KLQ0KLSAgdWludDhfdCAqcFJ4QnVmZlB0cjsgLyohPCBQb2ludGVyIHRvIFVBUlQgUnggdHJhbnNmZXIgQnVmZmVyICovDQotDQotICB1aW50MTZfdCBSeFhmZXJTaXplOyAvKiE8IFVBUlQgUnggVHJhbnNmZXIgc2l6ZSAgICAgICAgICAgICAgKi8NCi0NCi0gIF9fSU8gdWludDE2X3QgUnhYZmVyQ291bnQ7IC8qITwgVUFSVCBSeCBUcmFuc2ZlciBDb3VudGVyICAgICAgICAgICAqLw0KLQ0KLSAgdWludDE2X3QgTWFzazsgLyohPCBVQVJUIFJ4IFJEUiByZWdpc3RlciBtYXNrICAgICAgICAgICovDQotDQotICB1aW50MzJfdA0KLSAgICAgIEZpZm9Nb2RlOyAvKiE8IFNwZWNpZmllcyBpZiB0aGUgRklGTyBtb2RlIGlzIGJlaW5nIHVzZWQuDQotICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVQVJURXhfRklGT19tb2RlLiAqLw0KLQ0KLSAgdWludDE2X3QgTmJSeERhdGFUb1Byb2Nlc3M7IC8qITwgTnVtYmVyIG9mIGRhdGEgdG8gcHJvY2VzcyBkdXJpbmcgUlggSVNSDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uICovDQotDQotICB1aW50MTZfdCBOYlR4RGF0YVRvUHJvY2VzczsgLyohPCBOdW1iZXIgb2YgZGF0YSB0byBwcm9jZXNzIGR1cmluZyBUWCBJU1INCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb24gKi8NCi0NCi0gIF9fSU8gSEFMX1VBUlRfUnhUeXBlVHlwZURlZiBSZWNlcHRpb25UeXBlOyAvKiE8IFR5cGUgb2Ygb25nb2luZyByZWNlcHRpb24gKi8NCi0NCi0gIHZvaWQgKCpSeElTUikoc3RydWN0IF9fVUFSVF9IYW5kbGVUeXBlRGVmDQotICAgICAgICAgICAgICAgICAgICAqaHVhcnQpOyAvKiE8IEZ1bmN0aW9uIHBvaW50ZXIgb24gUnggSVJRIGhhbmRsZXIgKi8NCi0NCi0gIHZvaWQgKCpUeElTUikoc3RydWN0IF9fVUFSVF9IYW5kbGVUeXBlRGVmDQotICAgICAgICAgICAgICAgICAgICAqaHVhcnQpOyAvKiE8IEZ1bmN0aW9uIHBvaW50ZXIgb24gVHggSVJRIGhhbmRsZXIgKi8NCi0NCi0gIERNQV9IYW5kbGVUeXBlRGVmICpoZG1hdHg7IC8qITwgVUFSVCBUeCBETUEgSGFuZGxlIHBhcmFtZXRlcnMgICAgICAqLw0KLQ0KLSAgRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWFyeDsgLyohPCBVQVJUIFJ4IERNQSBIYW5kbGUgcGFyYW1ldGVycyAgICAgICovDQotDQotICBIQUxfTG9ja1R5cGVEZWYgTG9jazsgLyohPCBMb2NraW5nIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICovDQotDQotICBfX0lPIEhBTF9VQVJUX1N0YXRlVHlwZURlZg0KLSAgICAgIGdTdGF0ZTsgLyohPCBVQVJUIHN0YXRlIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gZ2xvYmFsIEhhbmRsZSBtYW5hZ2VtZW50DQotICAgICAgICAgICAgICAgICAgIGFuZCBhbHNvIHJlbGF0ZWQgdG8gVHggb3BlcmF0aW9ucy4gVGhpcyBwYXJhbWV0ZXINCi0gICAgICAgICAgICAgICAgICAgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBIQUxfVUFSVF9TdGF0ZVR5cGVEZWYgKi8NCi0NCi0gIF9fSU8gSEFMX1VBUlRfU3RhdGVUeXBlRGVmDQotICAgICAgUnhTdGF0ZTsgLyohPCBVQVJUIHN0YXRlIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gUnggb3BlcmF0aW9ucy4gVGhpcw0KLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSEFMX1VBUlRfU3RhdGVUeXBlRGVmICovDQotDQotICBfX0lPIHVpbnQzMl90IEVycm9yQ29kZTsgLyohPCBVQVJUIEVycm9yIGNvZGUgICAgICAgICAgICAgICAgICAgICovDQotDQotI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpDQotICB2b2lkICgqVHhIYWxmQ3BsdENhbGxiYWNrKShzdHJ1Y3QgX19VQVJUX0hhbmRsZVR5cGVEZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaHVhcnQpOyAvKiE8IFVBUlQgVHggSGFsZiBDb21wbGV0ZSBDYWxsYmFjayAqLw0KLSAgdm9pZCAoKlR4Q3BsdENhbGxiYWNrKSgNCi0gICAgICBzdHJ1Y3QgX19VQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsgLyohPCBVQVJUIFR4IENvbXBsZXRlIENhbGxiYWNrICovDQotICB2b2lkICgqUnhIYWxmQ3BsdENhbGxiYWNrKShzdHJ1Y3QgX19VQVJUX0hhbmRsZVR5cGVEZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaHVhcnQpOyAvKiE8IFVBUlQgUnggSGFsZiBDb21wbGV0ZSBDYWxsYmFjayAqLw0KLSAgdm9pZCAoKlJ4Q3BsdENhbGxiYWNrKSgNCi0gICAgICBzdHJ1Y3QgX19VQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsgLyohPCBVQVJUIFJ4IENvbXBsZXRlIENhbGxiYWNrICovDQotICB2b2lkICgqRXJyb3JDYWxsYmFjaykoDQotICAgICAgc3RydWN0IF9fVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7IC8qITwgVUFSVCBFcnJvciBDYWxsYmFjayAqLw0KLSAgdm9pZCAoKkFib3J0Q3BsdENhbGxiYWNrKSgNCi0gICAgICBzdHJ1Y3QgX19VQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsgLyohPCBVQVJUIEFib3J0IENvbXBsZXRlIENhbGxiYWNrICovDQotICB2b2lkICgqQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjaykoDQotICAgICAgc3RydWN0IF9fVUFSVF9IYW5kbGVUeXBlRGVmDQotICAgICAgICAgICpodWFydCk7IC8qITwgVUFSVCBBYm9ydCBUcmFuc21pdCBDb21wbGV0ZSBDYWxsYmFjayAqLw0KLSAgdm9pZCAoKkFib3J0UmVjZWl2ZUNwbHRDYWxsYmFjaykoDQotICAgICAgc3RydWN0IF9fVUFSVF9IYW5kbGVUeXBlRGVmDQotICAgICAgICAgICpodWFydCk7IC8qITwgVUFSVCBBYm9ydCBSZWNlaXZlIENvbXBsZXRlIENhbGxiYWNrICAqLw0KLSAgdm9pZCAoKldha2V1cENhbGxiYWNrKSgNCi0gICAgICBzdHJ1Y3QgX19VQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsgLyohPCBVQVJUIFdha2V1cCBDYWxsYmFjayAqLw0KLSAgdm9pZCAoKlJ4Rmlmb0Z1bGxDYWxsYmFjaykoDQotICAgICAgc3RydWN0IF9fVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7IC8qITwgVUFSVCBSeCBGaWZvIEZ1bGwgQ2FsbGJhY2sgKi8NCi0gIHZvaWQgKCpUeEZpZm9FbXB0eUNhbGxiYWNrKSgNCi0gICAgICBzdHJ1Y3QgX19VQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsgLyohPCBVQVJUIFR4IEZpZm8gRW1wdHkgQ2FsbGJhY2sgKi8NCi0gIHZvaWQgKCpSeEV2ZW50Q2FsbGJhY2spKHN0cnVjdCBfX1VBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBQb3MpOyAvKiE8IFVBUlQgUmVjZXB0aW9uIEV2ZW50IENhbGxiYWNrICovDQotDQotICB2b2lkICgqTXNwSW5pdENhbGxiYWNrKSgNCi0gICAgICBzdHJ1Y3QgX19VQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsgLyohPCBVQVJUIE1zcCBJbml0IGNhbGxiYWNrICovDQotICB2b2lkICgqTXNwRGVJbml0Q2FsbGJhY2spKA0KLSAgICAgIHN0cnVjdCBfX1VBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOyAvKiE8IFVBUlQgTXNwIERlSW5pdCBjYWxsYmFjayAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotDQotfSBVQVJUX0hhbmRsZVR5cGVEZWY7DQotDQotI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpDQotLyoqDQotICogQGJyaWVmICBIQUwgVUFSVCBDYWxsYmFjayBJRCBlbnVtZXJhdGlvbiBkZWZpbml0aW9uDQotICovDQotdHlwZWRlZiBlbnVtIHsNCi0gIEhBTF9VQVJUX1RYX0hBTEZDT01QTEVURV9DQl9JRCA9DQotICAgICAgMHgwMFUsIC8qITwgVUFSVCBUeCBIYWxmIENvbXBsZXRlIENhbGxiYWNrIElEICAgICAgICAqLw0KLSAgSEFMX1VBUlRfVFhfQ09NUExFVEVfQ0JfSUQgPSAweDAxVSwgLyohPCBVQVJUIFR4IENvbXBsZXRlIENhbGxiYWNrIElEICovDQotICBIQUxfVUFSVF9SWF9IQUxGQ09NUExFVEVfQ0JfSUQgPQ0KLSAgICAgIDB4MDJVLCAvKiE8IFVBUlQgUnggSGFsZiBDb21wbGV0ZSBDYWxsYmFjayBJRCAgICAgICAgKi8NCi0gIEhBTF9VQVJUX1JYX0NPTVBMRVRFX0NCX0lEID0gMHgwM1UsIC8qITwgVUFSVCBSeCBDb21wbGV0ZSBDYWxsYmFjayBJRCAqLw0KLSAgSEFMX1VBUlRfRVJST1JfQ0JfSUQgPSAweDA0VSwgLyohPCBVQVJUIEVycm9yIENhbGxiYWNrIElEICAgICAgICAgICAgICAgICAgICovDQotICBIQUxfVUFSVF9BQk9SVF9DT01QTEVURV9DQl9JRCA9IDB4MDVVLCAvKiE8IFVBUlQgQWJvcnQgQ29tcGxldGUgQ2FsbGJhY2sgSUQgKi8NCi0gIEhBTF9VQVJUX0FCT1JUX1RSQU5TTUlUX0NPTVBMRVRFX0NCX0lEID0NCi0gICAgICAweDA2VSwgLyohPCBVQVJUIEFib3J0IFRyYW5zbWl0IENvbXBsZXRlIENhbGxiYWNrIElEICovDQotICBIQUxfVUFSVF9BQk9SVF9SRUNFSVZFX0NPTVBMRVRFX0NCX0lEID0NCi0gICAgICAweDA3VSwgLyohPCBVQVJUIEFib3J0IFJlY2VpdmUgQ29tcGxldGUgQ2FsbGJhY2sgSUQgICovDQotICBIQUxfVUFSVF9XQUtFVVBfQ0JfSUQgPSAweDA4VSwgICAgICAgIC8qITwgVUFSVCBXYWtldXAgQ2FsbGJhY2sgSUQgICAgICAgICovDQotICBIQUxfVUFSVF9SWF9GSUZPX0ZVTExfQ0JfSUQgPSAweDA5VSwgIC8qITwgVUFSVCBSeCBGaWZvIEZ1bGwgQ2FsbGJhY2sgSUQgICovDQotICBIQUxfVUFSVF9UWF9GSUZPX0VNUFRZX0NCX0lEID0gMHgwQVUsIC8qITwgVUFSVCBUeCBGaWZvIEVtcHR5IENhbGxiYWNrIElEICovDQotDQotICBIQUxfVUFSVF9NU1BJTklUX0NCX0lEID0gMHgwQlUsICAvKiE8IFVBUlQgTXNwSW5pdCBjYWxsYmFjayBJRCAgKi8NCi0gIEhBTF9VQVJUX01TUERFSU5JVF9DQl9JRCA9IDB4MENVIC8qITwgVUFSVCBNc3BEZUluaXQgY2FsbGJhY2sgSUQgKi8NCi0NCi19IEhBTF9VQVJUX0NhbGxiYWNrSURUeXBlRGVmOw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSEFMIFVBUlQgQ2FsbGJhY2sgcG9pbnRlciBkZWZpbml0aW9uDQotICovDQotdHlwZWRlZiB2b2lkICgqcFVBUlRfQ2FsbGJhY2tUeXBlRGVmKSgNCi0gICAgVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7IC8qITwgcG9pbnRlciB0byBhbiBVQVJUIGNhbGxiYWNrIGZ1bmN0aW9uICovDQotdHlwZWRlZiB2b2lkICgqcFVBUlRfUnhFdmVudENhbGxiYWNrVHlwZURlZikoDQotICAgIHN0cnVjdCBfX1VBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsDQotICAgIHVpbnQxNl90IFBvcyk7IC8qITwgcG9pbnRlciB0byBhIFVBUlQgUnggRXZlbnQgc3BlY2lmaWMgY2FsbGJhY2sgZnVuY3Rpb24gKi8NCi0NCi0jZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGRlZmdyb3VwIFVBUlRfRXhwb3J0ZWRfQ29uc3RhbnRzIFVBUlQgRXhwb3J0ZWQgQ29uc3RhbnRzDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFVBUlRfU3RhdGVfRGVmaW5pdGlvbiBVQVJUIFN0YXRlIENvZGUgRGVmaW5pdGlvbg0KLSAqIEB7DQotICovDQotI2RlZmluZSBIQUxfVUFSVF9TVEFURV9SRVNFVCAgICAgICAgICAgICAgICAgICAgIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgUGVyaXBoZXJhbCBpcyBub3QgaW5pdGlhbGl6ZWQgXA0KLSAgICAgICAgICAgICAgICAgICBWYWx1ZSBpcyBhbGxvd2VkIGZvciBnU3RhdGUgYW5kIFJ4U3RhdGUgKi8NCi0jZGVmaW5lIEhBTF9VQVJUX1NUQVRFX1JFQURZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAweDAwMDAwMDIwVSAvKiE8IFBlcmlwaGVyYWwgSW5pdGlhbGl6ZWQgYW5kIHJlYWR5IGZvciB1c2UgXA0KLSAgICAgICAgICAgICAgICAgICBWYWx1ZSBpcyBhbGxvd2VkIGZvciBnU3RhdGUgYW5kIFJ4U3RhdGUgKi8NCi0jZGVmaW5lIEhBTF9VQVJUX1NUQVRFX0JVU1kgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIDB4MDAwMDAwMjRVIC8qITwgYW4gaW50ZXJuYWwgcHJvY2VzcyBpcyBvbmdvaW5nIFwNCi0gICAgICAgICAgICAgICAgICAgVmFsdWUgaXMgYWxsb3dlZCBmb3IgZ1N0YXRlIG9ubHkgKi8NCi0jZGVmaW5lIEhBTF9VQVJUX1NUQVRFX0JVU1lfVFggICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIDB4MDAwMDAwMjFVIC8qITwgRGF0YSBUcmFuc21pc3Npb24gcHJvY2VzcyBpcyBvbmdvaW5nIFwNCi0gICAgICAgICAgICAgICAgICAgVmFsdWUgaXMgYWxsb3dlZCBmb3IgZ1N0YXRlIG9ubHkgKi8NCi0jZGVmaW5lIEhBTF9VQVJUX1NUQVRFX0JVU1lfUlggICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIDB4MDAwMDAwMjJVIC8qITwgRGF0YSBSZWNlcHRpb24gcHJvY2VzcyBpcyBvbmdvaW5nIFwNCi0gICAgICAgICAgICAgICAgICAgVmFsdWUgaXMgYWxsb3dlZCBmb3IgUnhTdGF0ZSBvbmx5ICovDQotI2RlZmluZSBIQUxfVUFSVF9TVEFURV9CVVNZX1RYX1JYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgMHgwMDAwMDAyM1UgLyohPCBEYXRhIFRyYW5zbWlzc2lvbiBhbmQgUmVjZXB0aW9uIHByb2Nlc3MgaXMgb25nb2luZyAgICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgTm90IHRvIGJlIHVzZWQgZm9yIG5laXRoZXIgZ1N0YXRlIG5vciBSeFN0YXRlLlZhbHVlIGlzICAgICBcDQotICAgICAgICAgICAgICAgICByZXN1bHQgb2YgY29tYmluYXRpb24gKE9yKSBiZXR3ZWVuIGdTdGF0ZSBhbmQgUnhTdGF0ZSB2YWx1ZXMgXA0KLSAgICAgICAgICAgICAgICovDQotI2RlZmluZSBIQUxfVUFSVF9TVEFURV9USU1FT1VUICAgXA0KLSAgMHgwMDAwMDBBMFUgLyohPCBUaW1lb3V0IHN0YXRlIFwNCi0gICAgICAgICAgICAgICAgICAgVmFsdWUgaXMgYWxsb3dlZCBmb3IgZ1N0YXRlIG9ubHkgKi8NCi0jZGVmaW5lIEhBTF9VQVJUX1NUQVRFX0VSUk9SIFwNCi0gIDB4MDAwMDAwRTBVIC8qITwgRXJyb3IgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgVmFsdWUgaXMgYWxsb3dlZCBmb3IgZ1N0YXRlIG9ubHkgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVUFSVF9FcnJvcl9EZWZpbml0aW9uICAgVUFSVCBFcnJvciBEZWZpbml0aW9uDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIEhBTF9VQVJUX0VSUk9SX05PTkUgKDB4MDAwMDAwMDBVKSAvKiE8IE5vIGVycm9yICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBIQUxfVUFSVF9FUlJPUl9QRSAoMHgwMDAwMDAwMVUpICAgLyohPCBQYXJpdHkgZXJyb3IgICAgICAgICAgICAqLw0KLSNkZWZpbmUgSEFMX1VBUlRfRVJST1JfTkUgKDB4MDAwMDAwMDJVKSAgIC8qITwgTm9pc2UgZXJyb3IgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIEhBTF9VQVJUX0VSUk9SX0ZFICgweDAwMDAwMDA0VSkgICAvKiE8IEZyYW1lIGVycm9yICAgICAgICAgICAgICovDQotI2RlZmluZSBIQUxfVUFSVF9FUlJPUl9PUkUgKDB4MDAwMDAwMDhVKSAgLyohPCBPdmVycnVuIGVycm9yICAgICAgICAgICAqLw0KLSNkZWZpbmUgSEFMX1VBUlRfRVJST1JfRE1BICgweDAwMDAwMDEwVSkgIC8qITwgRE1BIHRyYW5zZmVyIGVycm9yICAgICAgKi8NCi0jZGVmaW5lIEhBTF9VQVJUX0VSUk9SX1JUTyAoMHgwMDAwMDAyMFUpICAvKiE8IFJlY2VpdmVyIFRpbWVvdXQgZXJyb3IgICovDQotDQotI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpDQotI2RlZmluZSBIQUxfVUFSVF9FUlJPUl9JTlZBTElEX0NBTExCQUNLIFwNCi0gICgweDAwMDAwMDQwVSkgLyohPCBJbnZhbGlkIENhbGxiYWNrIGVycm9yICAqLw0KLSNlbmRpZiAgICAgICAgICAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFVBUlRfU3RvcF9CaXRzICAgVUFSVCBOdW1iZXIgb2YgU3RvcCBCaXRzDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFVBUlRfU1RPUEJJVFNfMF81ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgVVNBUlRfQ1IyX1NUT1BfMCAgICAgICAgICAgICAgICAgIC8qITwgVUFSVCBmcmFtZSB3aXRoIDAuNSBzdG9wIGJpdCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBVQVJUX1NUT1BCSVRTXzEgMHgwMDAwMDAwMFUgLyohPCBVQVJUIGZyYW1lIHdpdGggMSBzdG9wIGJpdCAgICAqLw0KLSNkZWZpbmUgVUFSVF9TVE9QQklUU18xXzUgXA0KLSAgKFVTQVJUX0NSMl9TVE9QXzAgfCBVU0FSVF9DUjJfU1RPUF8xKSAgLyohPCBVQVJUIGZyYW1lIHdpdGggMS41IHN0b3AgYml0cyAqLw0KLSNkZWZpbmUgVUFSVF9TVE9QQklUU18yIFVTQVJUX0NSMl9TVE9QXzEgLyohPCBVQVJUIGZyYW1lIHdpdGggMiBzdG9wIGJpdHMgICAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBVQVJUX1Bhcml0eSAgVUFSVCBQYXJpdHkNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgVUFSVF9QQVJJVFlfTk9ORSAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAvKiE8IE5vIHBhcml0eSAgICovDQotI2RlZmluZSBVQVJUX1BBUklUWV9FVkVOIFVTQVJUX0NSMV9QQ0UgICAgICAgICAgICAgICAgIC8qITwgRXZlbiBwYXJpdHkgKi8NCi0jZGVmaW5lIFVBUlRfUEFSSVRZX09ERCAoVVNBUlRfQ1IxX1BDRSB8IFVTQVJUX0NSMV9QUykgLyohPCBPZGQgcGFyaXR5ICAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBVQVJUX0hhcmR3YXJlX0Zsb3dfQ29udHJvbCBVQVJUIEhhcmR3YXJlIEZsb3cgQ29udHJvbA0KLSAqIEB7DQotICovDQotI2RlZmluZSBVQVJUX0hXQ09OVFJPTF9OT05FIDB4MDAwMDAwMDBVICAgLyohPCBObyBoYXJkd2FyZSBjb250cm9sICAgICAgICovDQotI2RlZmluZSBVQVJUX0hXQ09OVFJPTF9SVFMgVVNBUlRfQ1IzX1JUU0UgLyohPCBSZXF1ZXN0IFRvIFNlbmQgICAgICAgICAgICovDQotI2RlZmluZSBVQVJUX0hXQ09OVFJPTF9DVFMgVVNBUlRfQ1IzX0NUU0UgLyohPCBDbGVhciBUbyBTZW5kICAgICAgICAgICAgICovDQotI2RlZmluZSBVQVJUX0hXQ09OVFJPTF9SVFNfQ1RTIFwNCi0gIChVU0FSVF9DUjNfUlRTRSB8IFVTQVJUX0NSM19DVFNFKSAvKiE8IFJlcXVlc3QgYW5kIENsZWFyIFRvIFNlbmQgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVUFSVF9Nb2RlIFVBUlQgVHJhbnNmZXIgTW9kZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBVQVJUX01PREVfUlggVVNBUlRfQ1IxX1JFICAgICAgICAgICAgICAgICAgICAgLyohPCBSWCBtb2RlICAgICAgICAqLw0KLSNkZWZpbmUgVUFSVF9NT0RFX1RYIFVTQVJUX0NSMV9URSAgICAgICAgICAgICAgICAgICAgIC8qITwgVFggbW9kZSAgICAgICAgKi8NCi0jZGVmaW5lIFVBUlRfTU9ERV9UWF9SWCAoVVNBUlRfQ1IxX1RFIHwgVVNBUlRfQ1IxX1JFKSAvKiE8IFJYIGFuZCBUWCBtb2RlICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFVBUlRfU3RhdGUgIFVBUlQgU3RhdGUNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgVUFSVF9TVEFURV9ESVNBQkxFIDB4MDAwMDAwMDBVIC8qITwgVUFSVCBkaXNhYmxlZCAgKi8NCi0jZGVmaW5lIFVBUlRfU1RBVEVfRU5BQkxFIFVTQVJUX0NSMV9VRSAvKiE8IFVBUlQgZW5hYmxlZCAgICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFVBUlRfT3Zlcl9TYW1wbGluZyBVQVJUIE92ZXIgU2FtcGxpbmcNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgVUFSVF9PVkVSU0FNUExJTkdfMTYgMHgwMDAwMDAwMFUgICAgLyohPCBPdmVyc2FtcGxpbmcgYnkgMTYgKi8NCi0jZGVmaW5lIFVBUlRfT1ZFUlNBTVBMSU5HXzggVVNBUlRfQ1IxX09WRVI4IC8qITwgT3ZlcnNhbXBsaW5nIGJ5IDggICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFVBUlRfT25lQml0X1NhbXBsaW5nIFVBUlQgT25lIEJpdCBTYW1wbGluZyBNZXRob2QNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgVUFSVF9PTkVfQklUX1NBTVBMRV9ESVNBQkxFICAgICAgICAgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBPbmUtYml0IHNhbXBsaW5nIGRpc2FibGUgXA0KLSAgICAgICAgICAgICAgICovDQotI2RlZmluZSBVQVJUX09ORV9CSVRfU0FNUExFX0VOQUJMRSBcDQotICBVU0FSVF9DUjNfT05FQklUIC8qITwgT25lLWJpdCBzYW1wbGluZyBlbmFibGUgICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFVBUlRfQ2xvY2tQcmVzY2FsZXIgIFVBUlQgQ2xvY2sgUHJlc2NhbGVyDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFVBUlRfUFJFU0NBTEVSX0RJVjEgMHgwMDAwMDAwMFUgICAvKiE8IGZjbGtfcHJlcyA9IGZjbGsgICAgICovDQotI2RlZmluZSBVQVJUX1BSRVNDQUxFUl9ESVYyIDB4MDAwMDAwMDFVICAgLyohPCBmY2xrX3ByZXMgPSBmY2xrLzIgICAqLw0KLSNkZWZpbmUgVUFSVF9QUkVTQ0FMRVJfRElWNCAweDAwMDAwMDAyVSAgIC8qITwgZmNsa19wcmVzID0gZmNsay80ICAgKi8NCi0jZGVmaW5lIFVBUlRfUFJFU0NBTEVSX0RJVjYgMHgwMDAwMDAwM1UgICAvKiE8IGZjbGtfcHJlcyA9IGZjbGsvNiAgICovDQotI2RlZmluZSBVQVJUX1BSRVNDQUxFUl9ESVY4IDB4MDAwMDAwMDRVICAgLyohPCBmY2xrX3ByZXMgPSBmY2xrLzggICAqLw0KLSNkZWZpbmUgVUFSVF9QUkVTQ0FMRVJfRElWMTAgMHgwMDAwMDAwNVUgIC8qITwgZmNsa19wcmVzID0gZmNsay8xMCAgKi8NCi0jZGVmaW5lIFVBUlRfUFJFU0NBTEVSX0RJVjEyIDB4MDAwMDAwMDZVICAvKiE8IGZjbGtfcHJlcyA9IGZjbGsvMTIgICovDQotI2RlZmluZSBVQVJUX1BSRVNDQUxFUl9ESVYxNiAweDAwMDAwMDA3VSAgLyohPCBmY2xrX3ByZXMgPSBmY2xrLzE2ICAqLw0KLSNkZWZpbmUgVUFSVF9QUkVTQ0FMRVJfRElWMzIgMHgwMDAwMDAwOFUgIC8qITwgZmNsa19wcmVzID0gZmNsay8zMiAgKi8NCi0jZGVmaW5lIFVBUlRfUFJFU0NBTEVSX0RJVjY0IDB4MDAwMDAwMDlVICAvKiE8IGZjbGtfcHJlcyA9IGZjbGsvNjQgICovDQotI2RlZmluZSBVQVJUX1BSRVNDQUxFUl9ESVYxMjggMHgwMDAwMDAwQVUgLyohPCBmY2xrX3ByZXMgPSBmY2xrLzEyOCAqLw0KLSNkZWZpbmUgVUFSVF9QUkVTQ0FMRVJfRElWMjU2IDB4MDAwMDAwMEJVIC8qITwgZmNsa19wcmVzID0gZmNsay8yNTYgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVUFSVF9BdXRvQmF1ZF9SYXRlX01vZGUgICAgVUFSVCBBZHZhbmNlZCBGZWF0dXJlIEF1dG9CYXVkIFJhdGUNCi0gKiBNb2RlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9BVVRPQkFVRFJBVEVfT05TVEFSVEJJVCBcDQotICAweDAwMDAwMDAwVSAvKiE8IEF1dG8gQmF1ZCByYXRlIGRldGVjdGlvbiAgICAgXA0KLSAgICAgICAgICAgICAgICAgICBvbiBzdGFydCBiaXQgICAgICAgICAgICAgICovDQotI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfQVVUT0JBVURSQVRFX09ORkFMTElOR0VER0UgIFwNCi0gIFVTQVJUX0NSMl9BQlJNT0RFXzAgLyohPCBBdXRvIEJhdWQgcmF0ZSBkZXRlY3Rpb24gXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIGZhbGxpbmcgZWRnZSAgICAgICAgICAgKi8NCi0jZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9BVVRPQkFVRFJBVEVfT04wWDdGRlJBTUUgICAgXA0KLSAgVVNBUlRfQ1IyX0FCUk1PREVfMSAvKiE8IEF1dG8gQmF1ZCByYXRlIGRldGVjdGlvbiBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gMHg3RiBmcmFtZSBkZXRlY3Rpb24gICAqLw0KLSNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX0FVVE9CQVVEUkFURV9PTjBYNTVGUkFNRSAgXA0KLSAgVVNBUlRfQ1IyX0FCUk1PREUgLyohPCBBdXRvIEJhdWQgcmF0ZSBkZXRlY3Rpb24gXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBvbiAweDU1IGZyYW1lIGRldGVjdGlvbiAgICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFVBUlRfUmVjZWl2ZXJfVGltZW91dCBVQVJUIFJlY2VpdmVyIFRpbWVvdXQNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgVUFSVF9SRUNFSVZFUl9USU1FT1VUX0RJU0FCTEUgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBVQVJUIFJlY2VpdmVyIFRpbWVvdXQgZGlzYWJsZSAqLw0KLSNkZWZpbmUgVUFSVF9SRUNFSVZFUl9USU1FT1VUX0VOQUJMRSBcDQotICBVU0FSVF9DUjJfUlRPRU4gLyohPCBVQVJUIFJlY2VpdmVyIFRpbWVvdXQgZW5hYmxlICAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBVQVJUX0xJTiAgICBVQVJUIExvY2FsIEludGVyY29ubmVjdGlvbiBOZXR3b3JrIG1vZGUNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgVUFSVF9MSU5fRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgTG9jYWwgSW50ZXJjb25uZWN0IE5ldHdvcmsgZGlzYWJsZSBcDQotICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFVBUlRfTElOX0VOQUJMRSBcDQotICBVU0FSVF9DUjJfTElORU4gLyohPCBMb2NhbCBJbnRlcmNvbm5lY3QgTmV0d29yayBlbmFibGUgICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFVBUlRfTElOX0JyZWFrX0RldGVjdGlvbiAgVUFSVCBMSU4gQnJlYWsgRGV0ZWN0aW9uDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFVBUlRfTElOQlJFQUtERVRFQ1RMRU5HVEhfMTBCIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgTElOIDEwLWJpdCBicmVhayBkZXRlY3Rpb24gbGVuZ3RoICovDQotI2RlZmluZSBVQVJUX0xJTkJSRUFLREVURUNUTEVOR1RIXzExQiBcDQotICBVU0FSVF9DUjJfTEJETCAvKiE8IExJTiAxMS1iaXQgYnJlYWsgZGV0ZWN0aW9uIGxlbmd0aCAgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVUFSVF9ETUFfVHggICAgVUFSVCBETUEgVHgNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgVUFSVF9ETUFfVFhfRElTQUJMRSAweDAwMDAwMDAwVSAgIC8qITwgVUFSVCBETUEgVFggZGlzYWJsZWQgKi8NCi0jZGVmaW5lIFVBUlRfRE1BX1RYX0VOQUJMRSBVU0FSVF9DUjNfRE1BVCAvKiE8IFVBUlQgRE1BIFRYIGVuYWJsZWQgICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFVBUlRfRE1BX1J4ICAgVUFSVCBETUEgUngNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgVUFSVF9ETUFfUlhfRElTQUJMRSAweDAwMDAwMDAwVSAgIC8qITwgVUFSVCBETUEgUlggZGlzYWJsZWQgKi8NCi0jZGVmaW5lIFVBUlRfRE1BX1JYX0VOQUJMRSBVU0FSVF9DUjNfRE1BUiAvKiE8IFVBUlQgRE1BIFJYIGVuYWJsZWQgICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFVBUlRfSGFsZl9EdXBsZXhfU2VsZWN0aW9uICBVQVJUIEhhbGYgRHVwbGV4IFNlbGVjdGlvbg0KLSAqIEB7DQotICovDQotI2RlZmluZSBVQVJUX0hBTEZfRFVQTEVYX0RJU0FCTEUgMHgwMDAwMDAwMFUgLyohPCBVQVJUIGhhbGYtZHVwbGV4IGRpc2FibGVkICovDQotI2RlZmluZSBVQVJUX0hBTEZfRFVQTEVYX0VOQUJMRSBcDQotICBVU0FSVF9DUjNfSERTRUwgLyohPCBVQVJUIGhhbGYtZHVwbGV4IGVuYWJsZWQgICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFVBUlRfV2FrZVVwX01ldGhvZHMgICBVQVJUIFdha2VVcCBNZXRob2RzDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFVBUlRfV0FLRVVQTUVUSE9EX0lETEVMSU5FIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgVUFSVCB3YWtlLXVwIG9uIGlkbGUgbGluZSAgICAqLw0KLSNkZWZpbmUgVUFSVF9XQUtFVVBNRVRIT0RfQUREUkVTU01BUksgXA0KLSAgVVNBUlRfQ1IxX1dBS0UgLyohPCBVQVJUIHdha2UtdXAgb24gYWRkcmVzcyBtYXJrICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFVBUlRfUmVxdWVzdF9QYXJhbWV0ZXJzIFVBUlQgUmVxdWVzdCBQYXJhbWV0ZXJzDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFVBUlRfQVVUT0JBVURfUkVRVUVTVCBcDQotICBVU0FSVF9SUVJfQUJSUlEgLyohPCBBdXRvLUJhdWQgUmF0ZSBSZXF1ZXN0ICAgICAgKi8NCi0jZGVmaW5lIFVBUlRfU0VOREJSRUFLX1JFUVVFU1QgXA0KLSAgVVNBUlRfUlFSX1NCS1JRIC8qITwgU2VuZCBCcmVhayBSZXF1ZXN0ICAgICAgICAgICovDQotI2RlZmluZSBVQVJUX01VVEVfTU9ERV9SRVFVRVNUIFwNCi0gIFVTQVJUX1JRUl9NTVJRIC8qITwgTXV0ZSBNb2RlIFJlcXVlc3QgICAgICAgICAgICovDQotI2RlZmluZSBVQVJUX1JYREFUQV9GTFVTSF9SRVFVRVNUIFwNCi0gIFVTQVJUX1JRUl9SWEZSUSAvKiE8IFJlY2VpdmUgRGF0YSBmbHVzaCBSZXF1ZXN0ICAqLw0KLSNkZWZpbmUgVUFSVF9UWERBVEFfRkxVU0hfUkVRVUVTVCBcDQotICBVU0FSVF9SUVJfVFhGUlEgLyohPCBUcmFuc21pdCBkYXRhIGZsdXNoIFJlcXVlc3QgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVUFSVF9BZHZhbmNlZF9GZWF0dXJlc19Jbml0aWFsaXphdGlvbl9UeXBlICBVQVJUIEFkdmFuY2VkIEZlYXR1cmUNCi0gKiBJbml0aWFsaXphdGlvbiBUeXBlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9OT19JTklUIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgTm8gYWR2YW5jZWQgZmVhdHVyZSBpbml0aWFsaXphdGlvbiAgICAgICAqLw0KLSNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX1RYSU5WRVJUX0lOSVQgXA0KLSAgMHgwMDAwMDAwMVUgLyohPCBUWCBwaW4gYWN0aXZlIGxldmVsIGludmVyc2lvbiAgICAgICAgICAgICovDQotI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfUlhJTlZFUlRfSU5JVCBcDQotICAweDAwMDAwMDAyVSAvKiE8IFJYIHBpbiBhY3RpdmUgbGV2ZWwgaW52ZXJzaW9uICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9EQVRBSU5WRVJUX0lOSVQgXA0KLSAgMHgwMDAwMDAwNFUgLyohPCBCaW5hcnkgZGF0YSBpbnZlcnNpb24gICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfU1dBUF9JTklUIFwNCi0gIDB4MDAwMDAwMDhVIC8qITwgVFgvUlggcGlucyBzd2FwICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX1JYT1ZFUlJVTkRJU0FCTEVfSU5JVCBcDQotICAweDAwMDAwMDEwVSAvKiE8IFJYIG92ZXJydW4gZGlzYWJsZSAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9ETUFESVNBQkxFT05FUlJPUl9JTklUIFwNCi0gIDB4MDAwMDAwMjBVIC8qITwgRE1BIGRpc2FibGUgb24gUmVjZXB0aW9uIEVycm9yICAgICAgICAgICAqLw0KLSNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX0FVVE9CQVVEUkFURV9JTklUIFwNCi0gIDB4MDAwMDAwNDBVIC8qITwgQXV0byBCYXVkIHJhdGUgZGV0ZWN0aW9uIGluaXRpYWxpemF0aW9uICAqLw0KLSNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX01TQkZJUlNUX0lOSVQgXA0KLSAgMHgwMDAwMDA4MFUgLyohPCBNb3N0IHNpZ25pZmljYW50IGJpdCBzZW50L3JlY2VpdmVkIGZpcnN0ICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFVBUlRfVHhfSW52IFVBUlQgQWR2YW5jZWQgRmVhdHVyZSBUWCBQaW4gQWN0aXZlIExldmVsIEludmVyc2lvbg0KLSAqIEB7DQotICovDQotI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfVFhJTlZfRElTQUJMRSBcDQotICAweDAwMDAwMDAwVSAvKiE8IFRYIHBpbiBhY3RpdmUgbGV2ZWwgaW52ZXJzaW9uIGRpc2FibGUgKi8NCi0jZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9UWElOVl9FTkFCTEUgXA0KLSAgVVNBUlRfQ1IyX1RYSU5WIC8qITwgVFggcGluIGFjdGl2ZSBsZXZlbCBpbnZlcnNpb24gZW5hYmxlICAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBVQVJUX1J4X0ludiBVQVJUIEFkdmFuY2VkIEZlYXR1cmUgUlggUGluIEFjdGl2ZSBMZXZlbCBJbnZlcnNpb24NCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX1JYSU5WX0RJU0FCTEUgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBSWCBwaW4gYWN0aXZlIGxldmVsIGludmVyc2lvbiBkaXNhYmxlICovDQotI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfUlhJTlZfRU5BQkxFIFwNCi0gIFVTQVJUX0NSMl9SWElOViAvKiE8IFJYIHBpbiBhY3RpdmUgbGV2ZWwgaW52ZXJzaW9uIGVuYWJsZSAgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVUFSVF9EYXRhX0ludiAgVUFSVCBBZHZhbmNlZCBGZWF0dXJlIEJpbmFyeSBEYXRhIEludmVyc2lvbg0KLSAqIEB7DQotICovDQotI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfREFUQUlOVl9ESVNBQkxFIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgQmluYXJ5IGRhdGEgaW52ZXJzaW9uIGRpc2FibGUgKi8NCi0jZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9EQVRBSU5WX0VOQUJMRSBcDQotICBVU0FSVF9DUjJfREFUQUlOViAvKiE8IEJpbmFyeSBkYXRhIGludmVyc2lvbiBlbmFibGUgICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFVBUlRfUnhfVHhfU3dhcCBVQVJUIEFkdmFuY2VkIEZlYXR1cmUgUlggVFggUGlucyBTd2FwDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9TV0FQX0RJU0FCTEUgICAgICAgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBUWC9SWCBwaW5zIHN3YXAgZGlzYWJsZSBcDQotICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9TV0FQX0VOQUJMRSBcDQotICBVU0FSVF9DUjJfU1dBUCAvKiE8IFRYL1JYIHBpbnMgc3dhcCBlbmFibGUgICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFVBUlRfT3ZlcnJ1bl9EaXNhYmxlICBVQVJUIEFkdmFuY2VkIEZlYXR1cmUgT3ZlcnJ1biBEaXNhYmxlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9PVkVSUlVOX0VOQUJMRSAweDAwMDAwMDAwVSAvKiE8IFJYIG92ZXJydW4gZW5hYmxlICAqLw0KLSNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX09WRVJSVU5fRElTQUJMRSBcDQotICBVU0FSVF9DUjNfT1ZSRElTIC8qITwgUlggb3ZlcnJ1biBkaXNhYmxlICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFVBUlRfQXV0b0JhdWRSYXRlX0VuYWJsZSAgVUFSVCBBZHZhbmNlZCBGZWF0dXJlIEF1dG8gQmF1ZFJhdGUNCi0gKiBFbmFibGUNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX0FVVE9CQVVEUkFURV9ESVNBQkxFIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgUlggQXV0byBCYXVkIHJhdGUgZGV0ZWN0aW9uIGVuYWJsZSAgKi8NCi0jZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9BVVRPQkFVRFJBVEVfRU5BQkxFIFwNCi0gIFVTQVJUX0NSMl9BQlJFTiAvKiE8IFJYIEF1dG8gQmF1ZCByYXRlIGRldGVjdGlvbiBkaXNhYmxlICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFVBUlRfRE1BX0Rpc2FibGVfb25fUnhfRXJyb3IgICBVQVJUIEFkdmFuY2VkIEZlYXR1cmUgRE1BIERpc2FibGUNCi0gKiBPbiBSeCBFcnJvcg0KLSAqIEB7DQotICovDQotI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfRE1BX0VOQUJMRU9OUlhFUlJPUiBcDQotICAweDAwMDAwMDAwVSAvKiE8IERNQSBlbmFibGUgb24gUmVjZXB0aW9uIEVycm9yICAqLw0KLSNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX0RNQV9ESVNBQkxFT05SWEVSUk9SIFwNCi0gIFVTQVJUX0NSM19ERFJFIC8qITwgRE1BIGRpc2FibGUgb24gUmVjZXB0aW9uIEVycm9yICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFVBUlRfTVNCX0ZpcnN0ICAgVUFSVCBBZHZhbmNlZCBGZWF0dXJlIE1TQiBGaXJzdA0KLSAqIEB7DQotICovDQotI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfTVNCRklSU1RfRElTQUJMRSAgICAgICAgICAgICAgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBNb3N0IHNpZ25pZmljYW50IGJpdCBzZW50L3JlY2VpdmVkIFwNCi0gICAgICAgICAgICAgICAgICAgZmlyc3QgZGlzYWJsZSAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX01TQkZJUlNUX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICBcDQotICBVU0FSVF9DUjJfTVNCRklSU1QgLyohPCBNb3N0IHNpZ25pZmljYW50IGJpdCBzZW50L3JlY2VpdmVkIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0IGVuYWJsZSAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVUFSVF9TdG9wX01vZGVfRW5hYmxlICAgVUFSVCBBZHZhbmNlZCBGZWF0dXJlIFN0b3AgTW9kZSBFbmFibGUNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX1NUT1BNT0RFX0RJU0FCTEUgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBVQVJUIHN0b3AgbW9kZSBkaXNhYmxlICovDQotI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfU1RPUE1PREVfRU5BQkxFIFwNCi0gIFVTQVJUX0NSMV9VRVNNIC8qITwgVUFSVCBzdG9wIG1vZGUgZW5hYmxlICAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBVQVJUX011dGVfTW9kZSAgIFVBUlQgQWR2YW5jZWQgRmVhdHVyZSBNdXRlIE1vZGUgRW5hYmxlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9NVVRFTU9ERV9ESVNBQkxFIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgVUFSVCBtdXRlIG1vZGUgZGlzYWJsZSAqLw0KLSNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX01VVEVNT0RFX0VOQUJMRSBcDQotICBVU0FSVF9DUjFfTU1FIC8qITwgVUFSVCBtdXRlIG1vZGUgZW5hYmxlICAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBVQVJUX0NSMl9BRERSRVNTX0xTQl9QT1MgICAgVUFSVCBBZGRyZXNzLW1hdGNoaW5nIExTQiBQb3NpdGlvbiBJbg0KLSAqIENSMiBSZWdpc3Rlcg0KLSAqIEB7DQotICovDQotI2RlZmluZSBVQVJUX0NSMl9BRERSRVNTX0xTQl9QT1MgXA0KLSAgMjRVIC8qITwgVUFSVCBhZGRyZXNzLW1hdGNoaW5nIExTQiBwb3NpdGlvbiBpbiBDUjIgcmVnaXN0ZXIgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVUFSVF9XYWtlVXBfZnJvbV9TdG9wX1NlbGVjdGlvbiAgIFVBUlQgV2FrZVVwIEZyb20gU3RvcCBTZWxlY3Rpb24NCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgVUFSVF9XQUtFVVBfT05fQUREUkVTUyBcDQotICAweDAwMDAwMDAwVSAvKiE8IFVBUlQgd2FrZS11cCBvbiBhZGRyZXNzICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFVBUlRfV0FLRVVQX09OX1NUQVJUQklUIFwNCi0gIFVTQVJUX0NSM19XVVNfMSAvKiE8IFVBUlQgd2FrZS11cCBvbiBzdGFydCBiaXQgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFVBUlRfV0FLRVVQX09OX1JFQUREQVRBX05PTkVNUFRZICAgICAgICAgICAgICAgICAgIFwNCi0gIFVTQVJUX0NSM19XVVMgLyohPCBVQVJUIHdha2UtdXAgb24gcmVjZWl2ZSBkYXRhIHJlZ2lzdGVyIFwNCi0gICAgICAgICAgICAgICAgICAgICBub3QgZW1wdHkgb3IgUlhGSUZPIGlzIG5vdCBlbXB0eSAgICAgICAgICAgICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFVBUlRfRHJpdmVyRW5hYmxlX1BvbGFyaXR5ICAgICAgVUFSVCBEcml2ZXJFbmFibGUgUG9sYXJpdHkNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgVUFSVF9ERV9QT0xBUklUWV9ISUdIIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgRHJpdmVyIGVuYWJsZSBzaWduYWwgaXMgYWN0aXZlIGhpZ2ggKi8NCi0jZGVmaW5lIFVBUlRfREVfUE9MQVJJVFlfTE9XIFwNCi0gIFVTQVJUX0NSM19ERVAgLyohPCBEcml2ZXIgZW5hYmxlIHNpZ25hbCBpcyBhY3RpdmUgbG93ICAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBVQVJUX0NSMV9ERUFUX0FERFJFU1NfTFNCX1BPUyAgICBVQVJUIERyaXZlciBFbmFibGUgQXNzZXJ0aW9uIFRpbWUNCi0gKiBMU0IgUG9zaXRpb24gSW4gQ1IxIFJlZ2lzdGVyDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFVBUlRfQ1IxX0RFQVRfQUREUkVTU19MU0JfUE9TICAgICAgICAgICAgXA0KLSAgMjFVIC8qITwgVUFSVCBEcml2ZXIgRW5hYmxlIGFzc2VydGlvbiB0aW1lIExTQiBcDQotICAgICAgICAgICBwb3NpdGlvbiBpbiBDUjEgcmVnaXN0ZXIgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVUFSVF9DUjFfREVEVF9BRERSRVNTX0xTQl9QT1MgICAgVUFSVCBEcml2ZXIgRW5hYmxlIERlQXNzZXJ0aW9uDQotICogVGltZSBMU0IgUG9zaXRpb24gSW4gQ1IxIFJlZ2lzdGVyDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFVBUlRfQ1IxX0RFRFRfQUREUkVTU19MU0JfUE9TICAgICAgICAgICAgICAgXA0KLSAgMTZVIC8qITwgVUFSVCBEcml2ZXIgRW5hYmxlIGRlLWFzc2VydGlvbiB0aW1lIExTQiBcDQotICAgICAgICAgICBwb3NpdGlvbiBpbiBDUjEgcmVnaXN0ZXIgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVUFSVF9JbnRlcnJ1cHRpb25fTWFzayAgICBVQVJUIEludGVycnVwdGlvbnMgRmxhZyBNYXNrDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFVBUlRfSVRfTUFTSyAweDAwMUZVIC8qITwgVUFSVCBpbnRlcnJ1cHRpb25zIGZsYWdzIG1hc2sgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVUFSVF9UaW1lT3V0X1ZhbHVlICAgIFVBUlQgcG9sbGluZy1iYXNlZCBjb21tdW5pY2F0aW9ucyB0aW1lLW91dA0KLSAqIHZhbHVlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIEhBTF9VQVJUX1RJTUVPVVRfVkFMVUUgXA0KLSAgMHgxRkZGRkZGVSAvKiE8IFVBUlQgcG9sbGluZy1iYXNlZCBjb21tdW5pY2F0aW9ucyB0aW1lLW91dCB2YWx1ZSAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBVQVJUX0ZsYWdzICAgICBVQVJUIFN0YXR1cyBGbGFncw0KLSAqICAgICAgICBFbGVtZW50cyB2YWx1ZXMgY29udmVudGlvbjogMHhYWFhYDQotICogICAgICAgICAgIC0gMHhYWFhYICA6IEZsYWcgbWFzayBpbiB0aGUgSVNSIHJlZ2lzdGVyDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFVBUlRfRkxBR19UWEZUIFwNCi0gIFVTQVJUX0lTUl9UWEZUIC8qITwgVUFSVCBUWEZJRk8gdGhyZXNob2xkIGZsYWcgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFVBUlRfRkxBR19SWEZUIFwNCi0gIFVTQVJUX0lTUl9SWEZUIC8qITwgVUFSVCBSWEZJRk8gdGhyZXNob2xkIGZsYWcgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFVBUlRfRkxBR19SWEZGIFwNCi0gIFVTQVJUX0lTUl9SWEZGIC8qITwgVUFSVCBSWEZJRk8gRnVsbCBmbGFnICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFVBUlRfRkxBR19UWEZFIFwNCi0gIFVTQVJUX0lTUl9UWEZFIC8qITwgVUFSVCBUWEZJRk8gRW1wdHkgZmxhZyAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFVBUlRfRkxBR19SRUFDSyBcDQotICBVU0FSVF9JU1JfUkVBQ0sgLyohPCBVQVJUIHJlY2VpdmUgZW5hYmxlIGFja25vd2xlZGdlIGZsYWcgICAgICAqLw0KLSNkZWZpbmUgVUFSVF9GTEFHX1RFQUNLIFwNCi0gIFVTQVJUX0lTUl9URUFDSyAvKiE8IFVBUlQgdHJhbnNtaXQgZW5hYmxlIGFja25vd2xlZGdlIGZsYWcgICAgICovDQotI2RlZmluZSBVQVJUX0ZMQUdfV1VGIFwNCi0gIFVTQVJUX0lTUl9XVUYgLyohPCBVQVJUIHdha2UtdXAgZnJvbSBzdG9wIG1vZGUgZmxhZyAgICAgICAgICAqLw0KLSNkZWZpbmUgVUFSVF9GTEFHX1JXVSBcDQotICBVU0FSVF9JU1JfUldVIC8qITwgVUFSVCByZWNlaXZlciB3YWtlLXVwIGZyb20gbXV0ZSBtb2RlIGZsYWcgKi8NCi0jZGVmaW5lIFVBUlRfRkxBR19TQktGIFwNCi0gIFVTQVJUX0lTUl9TQktGIC8qITwgVUFSVCBzZW5kIGJyZWFrIGZsYWcgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFVBUlRfRkxBR19DTUYgXA0KLSAgVVNBUlRfSVNSX0NNRiAvKiE8IFVBUlQgY2hhcmFjdGVyIG1hdGNoIGZsYWcgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBVQVJUX0ZMQUdfQlVTWSBcDQotICBVU0FSVF9JU1JfQlVTWSAvKiE8IFVBUlQgYnVzeSBmbGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBVQVJUX0ZMQUdfQUJSRiBcDQotICBVU0FSVF9JU1JfQUJSRiAvKiE8IFVBUlQgYXV0byBCYXVkIHJhdGUgZmxhZyAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBVQVJUX0ZMQUdfQUJSRSBcDQotICBVU0FSVF9JU1JfQUJSRSAvKiE8IFVBUlQgYXV0byBCYXVkIHJhdGUgZXJyb3IgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBVQVJUX0ZMQUdfUlRPRiBcDQotICBVU0FSVF9JU1JfUlRPRiAvKiE8IFVBUlQgcmVjZWl2ZXIgdGltZW91dCBmbGFnICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBVQVJUX0ZMQUdfQ1RTIFwNCi0gIFVTQVJUX0lTUl9DVFMgLyohPCBVQVJUIGNsZWFyIHRvIHNlbmQgZmxhZyAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgVUFSVF9GTEFHX0NUU0lGIFwNCi0gIFVTQVJUX0lTUl9DVFNJRiAvKiE8IFVBUlQgY2xlYXIgdG8gc2VuZCBpbnRlcnJ1cHQgZmxhZyAgICAgICAgICovDQotI2RlZmluZSBVQVJUX0ZMQUdfTEJERiBcDQotICBVU0FSVF9JU1JfTEJERiAvKiE8IFVBUlQgTElOIGJyZWFrIGRldGVjdGlvbiBmbGFnICAgICAgICAgICAgICovDQotI2RlZmluZSBVQVJUX0ZMQUdfVFhFIFwNCi0gIFVTQVJUX0lTUl9UWEVfVFhGTkYgLyohPCBVQVJUIHRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgZW1wdHkgICAgICAgICAqLw0KLSNkZWZpbmUgVUFSVF9GTEFHX1RYRk5GIFwNCi0gIFVTQVJUX0lTUl9UWEVfVFhGTkYgLyohPCBVQVJUIFRYRklGTyBub3QgZnVsbCAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgVUFSVF9GTEFHX1RDIFwNCi0gIFVTQVJUX0lTUl9UQyAvKiE8IFVBUlQgdHJhbnNtaXNzaW9uIGNvbXBsZXRlICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBVQVJUX0ZMQUdfUlhORSBcDQotICBVU0FSVF9JU1JfUlhORV9SWEZORSAvKiE8IFVBUlQgcmVhZCBkYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSAgICAgICAgICovDQotI2RlZmluZSBVQVJUX0ZMQUdfUlhGTkUgXA0KLSAgVVNBUlRfSVNSX1JYTkVfUlhGTkUgLyohPCBVQVJUIFJYRklGTyBub3QgZW1wdHkgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgVUFSVF9GTEFHX0lETEUgXA0KLSAgVVNBUlRfSVNSX0lETEUgLyohPCBVQVJUIGlkbGUgZmxhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgVUFSVF9GTEFHX09SRSBcDQotICBVU0FSVF9JU1JfT1JFIC8qITwgVUFSVCBvdmVycnVuIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFVBUlRfRkxBR19ORSBcDQotICBVU0FSVF9JU1JfTkUgLyohPCBVQVJUIG5vaXNlIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgVUFSVF9GTEFHX0ZFIFwNCi0gIFVTQVJUX0lTUl9GRSAvKiE8IFVBUlQgZnJhbWUgZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBVQVJUX0ZMQUdfUEUgXA0KLSAgVVNBUlRfSVNSX1BFIC8qITwgVUFSVCBwYXJpdHkgZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVUFSVF9JbnRlcnJ1cHRfZGVmaW5pdGlvbiAgIFVBUlQgSW50ZXJydXB0cyBEZWZpbml0aW9uDQotICogICAgICAgIEVsZW1lbnRzIHZhbHVlcyBjb252ZW50aW9uOiAwMDBaWlpaWjBYWFlZWVlZYg0KLSAqICAgICAgICAgICAtIFlZWVlZICA6IEludGVycnVwdCBzb3VyY2UgcG9zaXRpb24gaW4gdGhlIFhYIHJlZ2lzdGVyICg1Yml0cykNCi0gKiAgICAgICAgICAgLSBYWCAgOiBJbnRlcnJ1cHQgc291cmNlIHJlZ2lzdGVyICgyYml0cykNCi0gKiAgICAgICAgICAgICAgICAgLSAwMTogQ1IxIHJlZ2lzdGVyDQotICogICAgICAgICAgICAgICAgIC0gMTA6IENSMiByZWdpc3Rlcg0KLSAqICAgICAgICAgICAgICAgICAtIDExOiBDUjMgcmVnaXN0ZXINCi0gKiAgICAgICAgICAgLSBaWlpaWiAgOiBGbGFnIHBvc2l0aW9uIGluIHRoZSBJU1IgcmVnaXN0ZXIoNWJpdHMpDQotICogICAgICAgIEVsZW1lbnRzIHZhbHVlcyBjb252ZW50aW9uOiAwMDAwMDAwMDBYWFlZWVlZYg0KLSAqICAgICAgICAgICAtIFlZWVlZICA6IEludGVycnVwdCBzb3VyY2UgcG9zaXRpb24gaW4gdGhlIFhYIHJlZ2lzdGVyICg1Yml0cykNCi0gKiAgICAgICAgICAgLSBYWCAgOiBJbnRlcnJ1cHQgc291cmNlIHJlZ2lzdGVyICgyYml0cykNCi0gKiAgICAgICAgICAgICAgICAgLSAwMTogQ1IxIHJlZ2lzdGVyDQotICogICAgICAgICAgICAgICAgIC0gMTA6IENSMiByZWdpc3Rlcg0KLSAqICAgICAgICAgICAgICAgICAtIDExOiBDUjMgcmVnaXN0ZXINCi0gKiAgICAgICAgRWxlbWVudHMgdmFsdWVzIGNvbnZlbnRpb246IDAwMDBaWlpaMDAwMDAwMDBiDQotICogICAgICAgICAgIC0gWlpaWiAgOiBGbGFnIHBvc2l0aW9uIGluIHRoZSBJU1IgcmVnaXN0ZXIoNGJpdHMpDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFVBUlRfSVRfUEUgXA0KLSAgMHgwMDI4VSAvKiE8IFVBUlQgcGFyaXR5IGVycm9yIGludGVycnVwdGlvbiAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFVBUlRfSVRfVFhFIFwNCi0gIDB4MDcyN1UgLyohPCBVQVJUIHRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgZW1wdHkgaW50ZXJydXB0aW9uICovDQotI2RlZmluZSBVQVJUX0lUX1RYRk5GIFwNCi0gIDB4MDcyN1UgLyohPCBVQVJUIFRYIEZJRk8gbm90IGZ1bGwgaW50ZXJydXB0aW9uICAgICAgICAgICAgICovDQotI2RlZmluZSBVQVJUX0lUX1RDIFwNCi0gIDB4MDYyNlUgLyohPCBVQVJUIHRyYW5zbWlzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHRpb24gICAgICAgICovDQotI2RlZmluZSBVQVJUX0lUX1JYTkUgXA0KLSAgMHgwNTI1VSAvKiE8IFVBUlQgcmVhZCBkYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBpbnRlcnJ1cHRpb24gKi8NCi0jZGVmaW5lIFVBUlRfSVRfUlhGTkUgXA0KLSAgMHgwNTI1VSAvKiE8IFVBUlQgUlhGSUZPIG5vdCBlbXB0eSBpbnRlcnJ1cHRpb24gICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFVBUlRfSVRfSURMRSBcDQotICAweDA0MjRVIC8qITwgVUFSVCBpZGxlIGludGVycnVwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgVUFSVF9JVF9MQkQgXA0KLSAgMHgwODQ2VSAvKiE8IFVBUlQgTElOIGJyZWFrIGRldGVjdGlvbiBpbnRlcnJ1cHRpb24gICAgICAgICAgKi8NCi0jZGVmaW5lIFVBUlRfSVRfQ1RTIFwNCi0gIDB4MDk2QVUgLyohPCBVQVJUIENUUyBpbnRlcnJ1cHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBVQVJUX0lUX0NNIFwNCi0gIDB4MTEyRVUgLyohPCBVQVJUIGNoYXJhY3RlciBtYXRjaCBpbnRlcnJ1cHRpb24gICAgICAgICAgICAgICovDQotI2RlZmluZSBVQVJUX0lUX1dVRiBcDQotICAweDE0NzZVIC8qITwgVUFSVCB3YWtlLXVwIGZyb20gc3RvcCBtb2RlIGludGVycnVwdGlvbiAgICAgICAqLw0KLSNkZWZpbmUgVUFSVF9JVF9SWEZGIFwNCi0gIDB4MTgzRlUgLyohPCBVQVJUIFJYRklGTyBmdWxsIGludGVycnVwdGlvbiAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBVQVJUX0lUX1RYRkUgXA0KLSAgMHgxNzNFVSAvKiE8IFVBUlQgVFhGSUZPIGVtcHR5IGludGVycnVwdGlvbiAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFVBUlRfSVRfUlhGVCBcDQotICAweDFBN0NVIC8qITwgVUFSVCBSWEZJRk8gdGhyZXNob2xkIHJlYWNoZWQgaW50ZXJydXB0aW9uICAgICAqLw0KLSNkZWZpbmUgVUFSVF9JVF9UWEZUIFwNCi0gIDB4MUI3N1UgLyohPCBVQVJUIFRYRklGTyB0aHJlc2hvbGQgcmVhY2hlZCBpbnRlcnJ1cHRpb24gICAgICovDQotI2RlZmluZSBVQVJUX0lUX1JUTyBcDQotICAweDBCM0FVIC8qITwgVUFSVCByZWNlaXZlciB0aW1lb3V0IGludGVycnVwdGlvbiAgICAgICAgICAgICAqLw0KLQ0KLSNkZWZpbmUgVUFSVF9JVF9FUlIgXA0KLSAgMHgwMDYwVSAvKiE8IFVBUlQgZXJyb3IgaW50ZXJydXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0NCi0jZGVmaW5lIFVBUlRfSVRfT1JFIFwNCi0gIDB4MDMwMFUgLyohPCBVQVJUIG92ZXJydW4gZXJyb3IgaW50ZXJydXB0aW9uICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBVQVJUX0lUX05FIFwNCi0gIDB4MDIwMFUgLyohPCBVQVJUIG5vaXNlIGVycm9yIGludGVycnVwdGlvbiAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBVQVJUX0lUX0ZFIFwNCi0gIDB4MDEwMFUgLyohPCBVQVJUIGZyYW1lIGVycm9yIGludGVycnVwdGlvbiAgICAgICAgICAgICAgICAgICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFVBUlRfSVRfQ0xFQVJfRmxhZ3MgIFVBUlQgSW50ZXJydXB0aW9uIENsZWFyIEZsYWdzDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFVBUlRfQ0xFQVJfUEVGIFVTQVJUX0lDUl9QRUNGIC8qITwgUGFyaXR5IEVycm9yIENsZWFyIEZsYWcgKi8NCi0jZGVmaW5lIFVBUlRfQ0xFQVJfRkVGIFVTQVJUX0lDUl9GRUNGIC8qITwgRnJhbWluZyBFcnJvciBDbGVhciBGbGFnICovDQotI2RlZmluZSBVQVJUX0NMRUFSX05FRiBVU0FSVF9JQ1JfTkVDRiAvKiE8IE5vaXNlIEVycm9yIGRldGVjdGVkIENsZWFyIEZsYWcgKi8NCi0jZGVmaW5lIFVBUlRfQ0xFQVJfT1JFRiBcDQotICBVU0FSVF9JQ1JfT1JFQ0YgLyohPCBPdmVycnVuIEVycm9yIENsZWFyIEZsYWcgICAgICAgICAgKi8NCi0jZGVmaW5lIFVBUlRfQ0xFQVJfSURMRUYgXA0KLSAgVVNBUlRfSUNSX0lETEVDRiAvKiE8IElETEUgbGluZSBkZXRlY3RlZCBDbGVhciBGbGFnICAgICAqLw0KLSNkZWZpbmUgVUFSVF9DTEVBUl9UWEZFQ0YgXA0KLSAgVVNBUlRfSUNSX1RYRkVDRiAgICAgICAgICAgICAgICAgICAgLyohPCBUWEZJRk8gZW1wdHkgY2xlYXIgZmxhZyAgICAgICAgICAgKi8NCi0jZGVmaW5lIFVBUlRfQ0xFQVJfVENGIFVTQVJUX0lDUl9UQ0NGIC8qITwgVHJhbnNtaXNzaW9uIENvbXBsZXRlIENsZWFyIEZsYWcgKi8NCi0jZGVmaW5lIFVBUlRfQ0xFQVJfTEJERiBcDQotICBVU0FSVF9JQ1JfTEJEQ0YgLyohPCBMSU4gQnJlYWsgRGV0ZWN0aW9uIENsZWFyIEZsYWcgICAgKi8NCi0jZGVmaW5lIFVBUlRfQ0xFQVJfQ1RTRiBcDQotICBVU0FSVF9JQ1JfQ1RTQ0YgICAgICAgICAgICAgICAgICAgICAvKiE8IENUUyBJbnRlcnJ1cHQgQ2xlYXIgRmxhZyAgICAgICAgICAqLw0KLSNkZWZpbmUgVUFSVF9DTEVBUl9DTUYgVVNBUlRfSUNSX0NNQ0YgLyohPCBDaGFyYWN0ZXIgTWF0Y2ggQ2xlYXIgRmxhZyAqLw0KLSNkZWZpbmUgVUFSVF9DTEVBUl9XVUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgVVNBUlRfSUNSX1dVQ0YgLyohPCBXYWtlIFVwIGZyb20gc3RvcCBtb2RlIENsZWFyIEZsYWcgXA0KLSAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBVQVJUX0NMRUFSX1JUT0YgXA0KLSAgVVNBUlRfSUNSX1JUT0NGIC8qITwgVUFSVCByZWNlaXZlciB0aW1lb3V0IGNsZWFyIGZsYWcgICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFVBUlRfUkVDRVBUSU9OX1RZUEVfVmFsdWVzICBVQVJUIFJlY2VwdGlvbiB0eXBlIHZhbHVlcw0KLSAqIEB7DQotICovDQotI2RlZmluZSBIQUxfVUFSVF9SRUNFUFRJT05fU1RBTkRBUkQgXA0KLSAgKDB4MDAwMDAwMDBVKSAvKiE8IFN0YW5kYXJkIHJlY2VwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIEhBTF9VQVJUX1JFQ0VQVElPTl9UT0lETEUgXA0KLSAgKDB4MDAwMDAwMDFVKSAvKiE8IFJlY2VwdGlvbiB0aWxsIGNvbXBsZXRpb24gb3IgSURMRSBldmVudCAgKi8NCi0jZGVmaW5lIEhBTF9VQVJUX1JFQ0VQVElPTl9UT1JUTyBcDQotICAoMHgwMDAwMDAwMlUpIC8qITwgUmVjZXB0aW9uIHRpbGwgY29tcGxldGlvbiBvciBSVE8gZXZlbnQgICAqLw0KLSNkZWZpbmUgSEFMX1VBUlRfUkVDRVBUSU9OX1RPQ0hBUk1BVENIIFwNCi0gICgweDAwMDAwMDAzVSkgLyohPCBSZWNlcHRpb24gdGlsbCBjb21wbGV0aW9uIG9yIENNIGV2ZW50ICAgICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBkZWZncm91cCBVQVJUX0V4cG9ydGVkX01hY3JvcyBVQVJUIEV4cG9ydGVkIE1hY3Jvcw0KLSAqIEB7DQotICovDQotDQotLyoqIEBicmllZiAgUmVzZXQgVUFSVCBoYW5kbGUgc3RhdGVzLg0KLSAqIEBwYXJhbSAgX19IQU5ETEVfXyBVQVJUIGhhbmRsZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkNCi0jZGVmaW5lIF9fSEFMX1VBUlRfUkVTRVRfSEFORExFX1NUQVRFKF9fSEFORExFX18pIFwNCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgKF9fSEFORExFX18pLT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRVNFVDsgIFwNCi0gICAgKF9fSEFORExFX18pLT5SeFN0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVTRVQ7IFwNCi0gICAgKF9fSEFORExFX18pLT5Nc3BJbml0Q2FsbGJhY2sgPSBOVUxMOyAgICAgICAgIFwNCi0gICAgKF9fSEFORExFX18pLT5Nc3BEZUluaXRDYWxsYmFjayA9IE5VTEw7ICAgICAgIFwNCi0gIH0gd2hpbGUgKDBVKQ0KLSNlbHNlDQotI2RlZmluZSBfX0hBTF9VQVJUX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSBcDQotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIChfX0hBTkRMRV9fKS0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVTRVQ7ICBcDQotICAgIChfX0hBTkRMRV9fKS0+UnhTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFU0VUOyBcDQotICB9IHdoaWxlICgwVSkNCi0jZW5kaWYgLypVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotDQotLyoqIEBicmllZiAgRmx1c2ggdGhlIFVBUlQgRGF0YSByZWdpc3RlcnMuDQotICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9VQVJUX0ZMVVNIX0RSUkVHSVNURVIoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgU0VUX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5SUVIsIFVBUlRfUlhEQVRBX0ZMVVNIX1JFUVVFU1QpOyBcDQotICAgIFNFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+UlFSLCBVQVJUX1RYREFUQV9GTFVTSF9SRVFVRVNUKTsgXA0KLSAgfSB3aGlsZSAoMFUpDQotDQotLyoqIEBicmllZiAgQ2xlYXIgdGhlIHNwZWNpZmllZCBVQVJUIHBlbmRpbmcgZmxhZy4NCi0gKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4NCi0gKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4NCi0gKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQ0xFQVJfUEVGICAgICAgUGFyaXR5IEVycm9yIENsZWFyIEZsYWcNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0NMRUFSX0ZFRiAgICAgIEZyYW1pbmcgRXJyb3IgQ2xlYXIgRmxhZw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQ0xFQVJfTkVGICAgICAgTm9pc2UgZGV0ZWN0ZWQgQ2xlYXIgRmxhZw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQ0xFQVJfT1JFRiAgICAgT3ZlcnJ1biBFcnJvciBDbGVhciBGbGFnDQotICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9JRExFRiAgICBJRExFIGxpbmUgZGV0ZWN0ZWQgQ2xlYXIgRmxhZw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQ0xFQVJfVFhGRUNGICAgVFhGSUZPIGVtcHR5IGNsZWFyIEZsYWcNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0NMRUFSX1RDRiAgICAgIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBDbGVhciBGbGFnDQotICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9SVE9GICAgICBSZWNlaXZlciBUaW1lb3V0IGNsZWFyIGZsYWcNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0NMRUFSX0xCREYgICAgIExJTiBCcmVhayBEZXRlY3Rpb24gQ2xlYXIgRmxhZw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQ0xFQVJfQ1RTRiAgICAgQ1RTIEludGVycnVwdCBDbGVhciBGbGFnDQotICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9DTUYgICAgICBDaGFyYWN0ZXIgTWF0Y2ggQ2xlYXIgRmxhZw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQ0xFQVJfV1VGICAgICAgV2FrZSBVcCBmcm9tIHN0b3AgbW9kZSBDbGVhciBGbGFnDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9VQVJUX0NMRUFSX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pIFwNCi0gICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JQ1IgPSAoX19GTEFHX18pKQ0KLQ0KLS8qKiBAYnJpZWYgIENsZWFyIHRoZSBVQVJUIFBFIHBlbmRpbmcgZmxhZy4NCi0gKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1VBUlRfQ0xFQVJfUEVGTEFHKF9fSEFORExFX18pIFwNCi0gIF9fSEFMX1VBUlRfQ0xFQVJfRkxBRygoX19IQU5ETEVfXyksIFVBUlRfQ0xFQVJfUEVGKQ0KLQ0KLS8qKiBAYnJpZWYgIENsZWFyIHRoZSBVQVJUIEZFIHBlbmRpbmcgZmxhZy4NCi0gKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1VBUlRfQ0xFQVJfRkVGTEFHKF9fSEFORExFX18pIFwNCi0gIF9fSEFMX1VBUlRfQ0xFQVJfRkxBRygoX19IQU5ETEVfXyksIFVBUlRfQ0xFQVJfRkVGKQ0KLQ0KLS8qKiBAYnJpZWYgIENsZWFyIHRoZSBVQVJUIE5FIHBlbmRpbmcgZmxhZy4NCi0gKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1VBUlRfQ0xFQVJfTkVGTEFHKF9fSEFORExFX18pIFwNCi0gIF9fSEFMX1VBUlRfQ0xFQVJfRkxBRygoX19IQU5ETEVfXyksIFVBUlRfQ0xFQVJfTkVGKQ0KLQ0KLS8qKiBAYnJpZWYgIENsZWFyIHRoZSBVQVJUIE9SRSBwZW5kaW5nIGZsYWcuDQotICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9VQVJUX0NMRUFSX09SRUZMQUcoX19IQU5ETEVfXykgXA0KLSAgX19IQUxfVUFSVF9DTEVBUl9GTEFHKChfX0hBTkRMRV9fKSwgVUFSVF9DTEVBUl9PUkVGKQ0KLQ0KLS8qKiBAYnJpZWYgIENsZWFyIHRoZSBVQVJUIElETEUgcGVuZGluZyBmbGFnLg0KLSAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVBUlQgSGFuZGxlLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfVUFSVF9DTEVBUl9JRExFRkxBRyhfX0hBTkRMRV9fKSBcDQotICBfX0hBTF9VQVJUX0NMRUFSX0ZMQUcoKF9fSEFORExFX18pLCBVQVJUX0NMRUFSX0lETEVGKQ0KLQ0KLS8qKiBAYnJpZWYgIENsZWFyIHRoZSBVQVJUIFRYIEZJRk8gZW1wdHkgY2xlYXIgZmxhZy4NCi0gKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1VBUlRfQ0xFQVJfVFhGRUNGKF9fSEFORExFX18pIFwNCi0gIF9fSEFMX1VBUlRfQ0xFQVJfRkxBRygoX19IQU5ETEVfXyksIFVBUlRfQ0xFQVJfVFhGRUNGKQ0KLQ0KLS8qKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBVQVJUIGZsYWcgaXMgc2V0IG9yIG5vdC4NCi0gKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4NCi0gKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4NCi0gKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0ZMQUdfVFhGVCAgVFhGSUZPIHRocmVzaG9sZCBmbGFnDQotICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX1JYRlQgIFJYRklGTyB0aHJlc2hvbGQgZmxhZw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfRkxBR19SWEZGICBSWEZJRk8gRnVsbCBmbGFnDQotICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX1RYRkUgIFRYRklGTyBFbXB0eSBmbGFnDQotICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX1JFQUNLIFJlY2VpdmUgZW5hYmxlIGFja25vd2xlZGdlIGZsYWcNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0ZMQUdfVEVBQ0sgVHJhbnNtaXQgZW5hYmxlIGFja25vd2xlZGdlIGZsYWcNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0ZMQUdfV1VGICAgV2FrZSB1cCBmcm9tIHN0b3AgbW9kZSBmbGFnDQotICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX1JXVSAgIFJlY2VpdmVyIHdha2UgdXAgZmxhZyAoaWYgdGhlIFVBUlQgaW4NCi0gKiBtdXRlIG1vZGUpDQotICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX1NCS0YgIFNlbmQgQnJlYWsgZmxhZw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfRkxBR19DTUYgICBDaGFyYWN0ZXIgbWF0Y2ggZmxhZw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfRkxBR19CVVNZICBCdXN5IGZsYWcNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0ZMQUdfQUJSRiAgQXV0byBCYXVkIHJhdGUgZGV0ZWN0aW9uIGZsYWcNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0ZMQUdfQUJSRSAgQXV0byBCYXVkIHJhdGUgZGV0ZWN0aW9uIGVycm9yIGZsYWcNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0ZMQUdfQ1RTICAgQ1RTIENoYW5nZSBmbGFnDQotICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX0xCREYgIExJTiBCcmVhayBkZXRlY3Rpb24gZmxhZw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfRkxBR19UWEUgICBUcmFuc21pdCBkYXRhIHJlZ2lzdGVyIGVtcHR5IGZsYWcNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0ZMQUdfVFhGTkYgVUFSVCBUWEZJRk8gbm90IGZ1bGwgZmxhZw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfRkxBR19UQyAgICBUcmFuc21pc3Npb24gQ29tcGxldGUgZmxhZw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfRkxBR19SWE5FICBSZWNlaXZlIGRhdGEgcmVnaXN0ZXIgbm90IGVtcHR5IGZsYWcNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0ZMQUdfUlhGTkUgVUFSVCBSWEZJRk8gbm90IGVtcHR5IGZsYWcNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0ZMQUdfUlRPRiAgUmVjZWl2ZXIgVGltZW91dCBmbGFnDQotICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX0lETEUgIElkbGUgTGluZSBkZXRlY3Rpb24gZmxhZw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfRkxBR19PUkUgICBPdmVycnVuIEVycm9yIGZsYWcNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0ZMQUdfTkUgICAgTm9pc2UgRXJyb3IgZmxhZw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfRkxBR19GRSAgICBGcmFtaW5nIEVycm9yIGZsYWcNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0ZMQUdfUEUgICAgUGFyaXR5IEVycm9yIGZsYWcNCi0gKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgX19GTEFHX18gKFRSVUUgb3IgRkFMU0UpLg0KLSAqLw0KLSNkZWZpbmUgX19IQUxfVUFSVF9HRVRfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgXA0KLSAgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IgJiAoX19GTEFHX18pKSA9PSAoX19GTEFHX18pKQ0KLQ0KLS8qKiBAYnJpZWYgIEVuYWJsZSB0aGUgc3BlY2lmaWVkIFVBUlQgaW50ZXJydXB0Lg0KLSAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVBUlQgSGFuZGxlLg0KLSAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFVBUlQgaW50ZXJydXB0IHNvdXJjZSB0byBlbmFibGUuDQotICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1JYRkYgIFJYRklGTyBGdWxsIGludGVycnVwdA0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfVFhGRSAgVFhGSUZPIEVtcHR5IGludGVycnVwdA0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfUlhGVCAgUlhGSUZPIHRocmVzaG9sZCBpbnRlcnJ1cHQNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1RYRlQgIFRYRklGTyB0aHJlc2hvbGQgaW50ZXJydXB0DQotICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9XVUYgICBXYWtldXAgZnJvbSBzdG9wIG1vZGUgaW50ZXJydXB0DQotICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9DTSAgICBDaGFyYWN0ZXIgbWF0Y2ggaW50ZXJydXB0DQotICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9DVFMgICBDVFMgY2hhbmdlIGludGVycnVwdA0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfTEJEICAgTElOIEJyZWFrIGRldGVjdGlvbiBpbnRlcnJ1cHQNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1RYRSAgIFRyYW5zbWl0IERhdGEgUmVnaXN0ZXIgZW1wdHkgaW50ZXJydXB0DQotICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9UWEZORiBUWCBGSUZPIG5vdCBmdWxsIGludGVycnVwdA0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfVEMgICAgVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGludGVycnVwdA0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfUlhORSAgUmVjZWl2ZSBEYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1JYRk5FIFJYRklGTyBub3QgZW1wdHkgaW50ZXJydXB0DQotICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9SVE8gICBSZWNlaXZlIFRpbWVvdXQgaW50ZXJydXB0DQotICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9JRExFICBJZGxlIGxpbmUgZGV0ZWN0aW9uIGludGVycnVwdA0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfUEUgICAgUGFyaXR5IEVycm9yIGludGVycnVwdA0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfRVJSICAgRXJyb3IgaW50ZXJydXB0IChmcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsDQotICogb3ZlcnJ1biBlcnJvcikNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1VBUlRfRU5BQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pIFwNCi0gICgoKCgodWludDhfdCkoX19JTlRFUlJVUFRfXykpID4+IDVVKSA9PSAxVSkgICAgICAgICAgIFwNCi0gICAgICAgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxIHw9ICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgKDFVIDw8ICgoX19JTlRFUlJVUFRfXykgJiBVQVJUX0lUX01BU0spKSkgICAgIFwNCi0gICA6ICgoKCh1aW50OF90KShfX0lOVEVSUlVQVF9fKSkgPj4gNVUpID09IDJVKSAgICAgICAgIFwNCi0gICAgICAgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IyIHw9ICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgKDFVIDw8ICgoX19JTlRFUlJVUFRfXykgJiBVQVJUX0lUX01BU0spKSkgICAgIFwNCi0gICAgICAgOiAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IzIHw9ICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgKDFVIDw8ICgoX19JTlRFUlJVUFRfXykgJiBVQVJUX0lUX01BU0spKSkpDQotDQotLyoqIEBicmllZiAgRGlzYWJsZSB0aGUgc3BlY2lmaWVkIFVBUlQgaW50ZXJydXB0Lg0KLSAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVBUlQgSGFuZGxlLg0KLSAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFVBUlQgaW50ZXJydXB0IHNvdXJjZSB0byBkaXNhYmxlLg0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9SWEZGICBSWEZJRk8gRnVsbCBpbnRlcnJ1cHQNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1RYRkUgIFRYRklGTyBFbXB0eSBpbnRlcnJ1cHQNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1JYRlQgIFJYRklGTyB0aHJlc2hvbGQgaW50ZXJydXB0DQotICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9UWEZUICBUWEZJRk8gdGhyZXNob2xkIGludGVycnVwdA0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfV1VGICAgV2FrZXVwIGZyb20gc3RvcCBtb2RlIGludGVycnVwdA0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfQ00gICAgQ2hhcmFjdGVyIG1hdGNoIGludGVycnVwdA0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfQ1RTICAgQ1RTIGNoYW5nZSBpbnRlcnJ1cHQNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX0xCRCAgIExJTiBCcmVhayBkZXRlY3Rpb24gaW50ZXJydXB0DQotICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9UWEUgICBUcmFuc21pdCBEYXRhIFJlZ2lzdGVyIGVtcHR5IGludGVycnVwdA0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfVFhGTkYgVFggRklGTyBub3QgZnVsbCBpbnRlcnJ1cHQNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1RDICAgIFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHQNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1JYTkUgIFJlY2VpdmUgRGF0YSByZWdpc3RlciBub3QgZW1wdHkgaW50ZXJydXB0DQotICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9SWEZORSBSWEZJRk8gbm90IGVtcHR5IGludGVycnVwdA0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfUlRPICAgUmVjZWl2ZSBUaW1lb3V0IGludGVycnVwdA0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfSURMRSAgSWRsZSBsaW5lIGRldGVjdGlvbiBpbnRlcnJ1cHQNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1BFICAgIFBhcml0eSBFcnJvciBpbnRlcnJ1cHQNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX0VSUiAgIEVycm9yIGludGVycnVwdCAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLA0KLSAqIG92ZXJydW4gZXJyb3IpDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9VQVJUX0RJU0FCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgXA0KLSAgKCgoKCh1aW50OF90KShfX0lOVEVSUlVQVF9fKSkgPj4gNVUpID09IDFVKSAgICAgICAgICAgIFwNCi0gICAgICAgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxICY9ICAgICAgICAgICAgICAgICBcDQotICAgICAgICAgIH4oMVUgPDwgKChfX0lOVEVSUlVQVF9fKSAmIFVBUlRfSVRfTUFTSykpKSAgICAgXA0KLSAgIDogKCgoKHVpbnQ4X3QpKF9fSU5URVJSVVBUX18pKSA+PiA1VSkgPT0gMlUpICAgICAgICAgIFwNCi0gICAgICAgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IyICY9ICAgICAgICAgICAgICAgICBcDQotICAgICAgICAgIH4oMVUgPDwgKChfX0lOVEVSUlVQVF9fKSAmIFVBUlRfSVRfTUFTSykpKSAgICAgXA0KLSAgICAgICA6ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjMgJj0gICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgfigxVSA8PCAoKF9fSU5URVJSVVBUX18pICYgVUFSVF9JVF9NQVNLKSkpKQ0KLQ0KLS8qKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBVQVJUIGludGVycnVwdCBoYXMgb2NjdXJyZWQgb3Igbm90Lg0KLSAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVBUlQgSGFuZGxlLg0KLSAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFVBUlQgaW50ZXJydXB0IHRvIGNoZWNrLg0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9SWEZGICBSWEZJRk8gRnVsbCBpbnRlcnJ1cHQNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1RYRkUgIFRYRklGTyBFbXB0eSBpbnRlcnJ1cHQNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1JYRlQgIFJYRklGTyB0aHJlc2hvbGQgaW50ZXJydXB0DQotICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9UWEZUICBUWEZJRk8gdGhyZXNob2xkIGludGVycnVwdA0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfV1VGICAgV2FrZXVwIGZyb20gc3RvcCBtb2RlIGludGVycnVwdA0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfQ00gICAgQ2hhcmFjdGVyIG1hdGNoIGludGVycnVwdA0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfQ1RTICAgQ1RTIGNoYW5nZSBpbnRlcnJ1cHQNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX0xCRCAgIExJTiBCcmVhayBkZXRlY3Rpb24gaW50ZXJydXB0DQotICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9UWEUgICBUcmFuc21pdCBEYXRhIFJlZ2lzdGVyIGVtcHR5IGludGVycnVwdA0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfVFhGTkYgVFggRklGTyBub3QgZnVsbCBpbnRlcnJ1cHQNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1RDICAgIFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHQNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1JYTkUgIFJlY2VpdmUgRGF0YSByZWdpc3RlciBub3QgZW1wdHkgaW50ZXJydXB0DQotICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9SWEZORSBSWEZJRk8gbm90IGVtcHR5IGludGVycnVwdA0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfUlRPICAgUmVjZWl2ZSBUaW1lb3V0IGludGVycnVwdA0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfSURMRSAgSWRsZSBsaW5lIGRldGVjdGlvbiBpbnRlcnJ1cHQNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1BFICAgIFBhcml0eSBFcnJvciBpbnRlcnJ1cHQNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX0VSUiAgIEVycm9yIGludGVycnVwdCAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLA0KLSAqIG92ZXJydW4gZXJyb3IpDQotICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fSU5URVJSVVBUX18gKFNFVCBvciBSRVNFVCkuDQotICovDQotI2RlZmluZSBfX0hBTF9VQVJUX0dFVF9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVNSICYgKDFVIDw8ICgoX19JTlRFUlJVUFRfXykgPj4gOFUpKSkgIT0gUkVTRVQpIFwNCi0gICAgICAgPyBTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgIDogUkVTRVQpDQotDQotLyoqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIFVBUlQgaW50ZXJydXB0IHNvdXJjZSBpcyBlbmFibGVkIG9yIG5vdC4NCi0gKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4NCi0gKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBVQVJUIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suDQotICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1JYRkYgIFJYRklGTyBGdWxsIGludGVycnVwdA0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfVFhGRSAgVFhGSUZPIEVtcHR5IGludGVycnVwdA0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfUlhGVCAgUlhGSUZPIHRocmVzaG9sZCBpbnRlcnJ1cHQNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1RYRlQgIFRYRklGTyB0aHJlc2hvbGQgaW50ZXJydXB0DQotICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9XVUYgICBXYWtldXAgZnJvbSBzdG9wIG1vZGUgaW50ZXJydXB0DQotICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9DTSAgICBDaGFyYWN0ZXIgbWF0Y2ggaW50ZXJydXB0DQotICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9DVFMgICBDVFMgY2hhbmdlIGludGVycnVwdA0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfTEJEICAgTElOIEJyZWFrIGRldGVjdGlvbiBpbnRlcnJ1cHQNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1RYRSAgIFRyYW5zbWl0IERhdGEgUmVnaXN0ZXIgZW1wdHkgaW50ZXJydXB0DQotICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9UWEZORiBUWCBGSUZPIG5vdCBmdWxsIGludGVycnVwdA0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfVEMgICAgVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGludGVycnVwdA0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfUlhORSAgUmVjZWl2ZSBEYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1JYRk5FIFJYRklGTyBub3QgZW1wdHkgaW50ZXJydXB0DQotICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9SVE8gICBSZWNlaXZlIFRpbWVvdXQgaW50ZXJydXB0DQotICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9JRExFICBJZGxlIGxpbmUgZGV0ZWN0aW9uIGludGVycnVwdA0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfUEUgICAgUGFyaXR5IEVycm9yIGludGVycnVwdA0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfRVJSICAgRXJyb3IgaW50ZXJydXB0IChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsDQotICogb3ZlcnJ1biBlcnJvcikNCi0gKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgX19JTlRFUlJVUFRfXyAoU0VUIG9yIFJFU0VUKS4NCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1VBUlRfR0VUX0lUX1NPVVJDRShfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAgICAgICBcDQotICAoKCgoKCgoKHVpbnQ4X3QpKF9fSU5URVJSVVBUX18pKSA+PiA1VSkgPT0gMVUpICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICA/IChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgOiAoKCgoKHVpbnQ4X3QpKF9fSU5URVJSVVBUX18pKSA+PiA1VSkgPT0gMlUpICAgICAgICAgICAgICBcDQotICAgICAgICAgICAgICAgICA/IChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMiAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgOiAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjMpKSAmICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgxVSA8PCAoKCh1aW50MTZfdCkoX19JTlRFUlJVUFRfXykpICYgVUFSVF9JVF9NQVNLKSkpICE9IFJFU0VUKSBcDQotICAgICAgID8gU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICA6IFJFU0VUKQ0KLQ0KLS8qKiBAYnJpZWYgIENsZWFyIHRoZSBzcGVjaWZpZWQgVUFSVCBJU1IgZmxhZywgaW4gc2V0dGluZyB0aGUgcHJvcGVyIElDUg0KLSAqIHJlZ2lzdGVyIGZsYWcuDQotICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuDQotICogQHBhcmFtICBfX0lUX0NMRUFSX18gc3BlY2lmaWVzIHRoZSBpbnRlcnJ1cHQgY2xlYXIgcmVnaXN0ZXIgZmxhZyB0aGF0IG5lZWRzDQotICogdG8gYmUgc2V0IHRvIGNsZWFyIHRoZSBjb3JyZXNwb25kaW5nIGludGVycnVwdCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mDQotICogdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9QRUYgICAgUGFyaXR5IEVycm9yIENsZWFyIEZsYWcNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0NMRUFSX0ZFRiAgICBGcmFtaW5nIEVycm9yIENsZWFyIEZsYWcNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0NMRUFSX05FRiAgICBOb2lzZSBkZXRlY3RlZCBDbGVhciBGbGFnDQotICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9PUkVGICAgT3ZlcnJ1biBFcnJvciBDbGVhciBGbGFnDQotICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9JRExFRiAgSURMRSBsaW5lIGRldGVjdGVkIENsZWFyIEZsYWcNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0NMRUFSX1JUT0YgICBSZWNlaXZlciB0aW1lb3V0IGNsZWFyIGZsYWcNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0NMRUFSX1RYRkVDRiBUWEZJRk8gZW1wdHkgQ2xlYXIgRmxhZw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQ0xFQVJfVENGICAgIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBDbGVhciBGbGFnDQotICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9MQkRGICAgTElOIEJyZWFrIERldGVjdGlvbiBDbGVhciBGbGFnDQotICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9DVFNGICAgQ1RTIEludGVycnVwdCBDbGVhciBGbGFnDQotICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9DTUYgICAgQ2hhcmFjdGVyIE1hdGNoIENsZWFyIEZsYWcNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0NMRUFSX1dVRiAgICBXYWtlIFVwIGZyb20gc3RvcCBtb2RlIENsZWFyIEZsYWcNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1VBUlRfQ0xFQVJfSVQoX19IQU5ETEVfXywgX19JVF9DTEVBUl9fKSBcDQotICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SUNSID0gKHVpbnQzMl90KShfX0lUX0NMRUFSX18pKQ0KLQ0KLS8qKiBAYnJpZWYgIFNldCBhIHNwZWNpZmljIFVBUlQgcmVxdWVzdCBmbGFnLg0KLSAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVBUlQgSGFuZGxlLg0KLSAqIEBwYXJhbSAgX19SRVFfXyBzcGVjaWZpZXMgdGhlIHJlcXVlc3QgZmxhZyB0byBzZXQNCi0gKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQVVUT0JBVURfUkVRVUVTVCBBdXRvLUJhdWQgUmF0ZSBSZXF1ZXN0DQotICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9TRU5EQlJFQUtfUkVRVUVTVCBTZW5kIEJyZWFrIFJlcXVlc3QNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX01VVEVfTU9ERV9SRVFVRVNUIE11dGUgTW9kZSBSZXF1ZXN0DQotICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9SWERBVEFfRkxVU0hfUkVRVUVTVCBSZWNlaXZlIERhdGEgZmx1c2ggUmVxdWVzdA0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfVFhEQVRBX0ZMVVNIX1JFUVVFU1QgVHJhbnNtaXQgZGF0YSBmbHVzaCBSZXF1ZXN0DQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9VQVJUX1NFTkRfUkVRKF9fSEFORExFX18sIF9fUkVRX18pIFwNCi0gICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5SUVIgfD0gKHVpbnQxNl90KShfX1JFUV9fKSkNCi0NCi0vKiogQGJyaWVmICBFbmFibGUgdGhlIFVBUlQgb25lIGJpdCBzYW1wbGUgbWV0aG9kLg0KLSAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVBUlQgSGFuZGxlLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfVUFSVF9PTkVfQklUX1NBTVBMRV9FTkFCTEUoX19IQU5ETEVfXykgXA0KLSAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMyB8PSBVU0FSVF9DUjNfT05FQklUKQ0KLQ0KLS8qKiBAYnJpZWYgIERpc2FibGUgdGhlIFVBUlQgb25lIGJpdCBzYW1wbGUgbWV0aG9kLg0KLSAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVBUlQgSGFuZGxlLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfVUFSVF9PTkVfQklUX1NBTVBMRV9ESVNBQkxFKF9fSEFORExFX18pIFwNCi0gICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjMgJj0gflVTQVJUX0NSM19PTkVCSVQpDQotDQotLyoqIEBicmllZiAgRW5hYmxlIFVBUlQuDQotICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9VQVJUX0VOQUJMRShfX0hBTkRMRV9fKSBcDQotICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxIHw9IFVTQVJUX0NSMV9VRSkNCi0NCi0vKiogQGJyaWVmICBEaXNhYmxlIFVBUlQuDQotICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9VQVJUX0RJU0FCTEUoX19IQU5ETEVfXykgXA0KLSAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSAmPSB+VVNBUlRfQ1IxX1VFKQ0KLQ0KLS8qKiBAYnJpZWYgIEVuYWJsZSBDVFMgZmxvdyBjb250cm9sLg0KLSAqIEBub3RlICAgVGhpcyBtYWNybyBhbGxvd3MgdG8gZW5hYmxlIENUUyBoYXJkd2FyZSBmbG93IGNvbnRyb2wgZm9yIGEgZ2l2ZW4NCi0gKiBVQVJUIGluc3RhbmNlLCB3aXRob3V0IG5lZWQgdG8gY2FsbCBIQUxfVUFSVF9Jbml0KCkgZnVuY3Rpb24uIEFzIGludm9sdmluZw0KLSAqIGRpcmVjdCBhY2Nlc3MgdG8gVUFSVCByZWdpc3RlcnMsIHVzYWdlIG9mIHRoaXMgbWFjcm8gc2hvdWxkIGJlIGZ1bGx5IGVuZG9yc2VkDQotICogYnkgdXNlci4NCi0gKiBAbm90ZSAgIEFzIG1hY3JvIGlzIGV4cGVjdGVkIHRvIGJlIHVzZWQgZm9yIG1vZGlmeWluZyBDVFMgSHcgZmxvdyBjb250cm9sDQotICogZmVhdHVyZSBhY3RpdmF0aW9uLCB3aXRob3V0IG5lZWQgZm9yIFVTQVJUIGluc3RhbmNlIERlaW5pdC9Jbml0LCBmb2xsb3dpbmcNCi0gKiBjb25kaXRpb25zIGZvciBtYWNybyBjYWxsIHNob3VsZCBiZSBmdWxmaWxsZWQgOg0KLSAqICAgICAgICAgICAtIFVBUlQgaW5zdGFuY2Ugc2hvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIGluaXRpYWxpc2VkICh0aHJvdWdoIGNhbGwNCi0gKiBvZiBIQUxfVUFSVF9Jbml0KCkgKQ0KLSAqICAgICAgICAgICAtIG1hY3JvIGNvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4gY29ycmVzcG9uZGluZyBVQVJUIGluc3RhbmNlIGlzDQotICogZGlzYWJsZWQgKGkuZS4gX19IQUxfVUFSVF9ESVNBQkxFKF9fSEFORExFX18pKSBhbmQgc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IGFuDQotICogRW5hYmxlIG1hY3JvIChpLmUuIF9fSEFMX1VBUlRfRU5BQkxFKF9fSEFORExFX18pKS4NCi0gKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1VBUlRfSFdDT05UUk9MX0NUU19FTkFCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgIFwNCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgQVRPTUlDX1NFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfQ1RTRSk7IFwNCi0gICAgKF9fSEFORExFX18pLT5Jbml0Lkh3Rmxvd0N0bCB8PSBVU0FSVF9DUjNfQ1RTRTsgICAgICAgICAgICAgIFwNCi0gIH0gd2hpbGUgKDBVKQ0KLQ0KLS8qKiBAYnJpZWYgIERpc2FibGUgQ1RTIGZsb3cgY29udHJvbC4NCi0gKiBAbm90ZSAgIFRoaXMgbWFjcm8gYWxsb3dzIHRvIGRpc2FibGUgQ1RTIGhhcmR3YXJlIGZsb3cgY29udHJvbCBmb3IgYSBnaXZlbg0KLSAqIFVBUlQgaW5zdGFuY2UsIHdpdGhvdXQgbmVlZCB0byBjYWxsIEhBTF9VQVJUX0luaXQoKSBmdW5jdGlvbi4gQXMgaW52b2x2aW5nDQotICogZGlyZWN0IGFjY2VzcyB0byBVQVJUIHJlZ2lzdGVycywgdXNhZ2Ugb2YgdGhpcyBtYWNybyBzaG91bGQgYmUgZnVsbHkgZW5kb3JzZWQNCi0gKiBieSB1c2VyLg0KLSAqIEBub3RlICAgQXMgbWFjcm8gaXMgZXhwZWN0ZWQgdG8gYmUgdXNlZCBmb3IgbW9kaWZ5aW5nIENUUyBIdyBmbG93IGNvbnRyb2wNCi0gKiBmZWF0dXJlIGFjdGl2YXRpb24sIHdpdGhvdXQgbmVlZCBmb3IgVVNBUlQgaW5zdGFuY2UgRGVpbml0L0luaXQsIGZvbGxvd2luZw0KLSAqIGNvbmRpdGlvbnMgZm9yIG1hY3JvIGNhbGwgc2hvdWxkIGJlIGZ1bGZpbGxlZCA6DQotICogICAgICAgICAgIC0gVUFSVCBpbnN0YW5jZSBzaG91bGQgaGF2ZSBhbHJlYWR5IGJlZW4gaW5pdGlhbGlzZWQgKHRocm91Z2ggY2FsbA0KLSAqIG9mIEhBTF9VQVJUX0luaXQoKSApDQotICogICAgICAgICAgIC0gbWFjcm8gY291bGQgb25seSBiZSBjYWxsZWQgd2hlbiBjb3JyZXNwb25kaW5nIFVBUlQgaW5zdGFuY2UgaXMNCi0gKiBkaXNhYmxlZCAoaS5lLiBfX0hBTF9VQVJUX0RJU0FCTEUoX19IQU5ETEVfXykpIGFuZCBzaG91bGQgYmUgZm9sbG93ZWQgYnkgYW4NCi0gKiBFbmFibGUgbWFjcm8gKGkuZS4gX19IQUxfVUFSVF9FTkFCTEUoX19IQU5ETEVfXykpLg0KLSAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVBUlQgSGFuZGxlLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgX19IQUxfVUFSVF9IV0NPTlRST0xfQ1RTX0RJU0FCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICBcDQotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgQVRPTUlDX0NMRUFSX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19DVFNFKTsgXA0KLSAgICAoX19IQU5ETEVfXyktPkluaXQuSHdGbG93Q3RsICY9IH4oVVNBUlRfQ1IzX0NUU0UpOyAgICAgICAgICAgICBcDQotICB9IHdoaWxlICgwVSkNCi0NCi0vKiogQGJyaWVmICBFbmFibGUgUlRTIGZsb3cgY29udHJvbC4NCi0gKiBAbm90ZSAgIFRoaXMgbWFjcm8gYWxsb3dzIHRvIGVuYWJsZSBSVFMgaGFyZHdhcmUgZmxvdyBjb250cm9sIGZvciBhIGdpdmVuDQotICogVUFSVCBpbnN0YW5jZSwgd2l0aG91dCBuZWVkIHRvIGNhbGwgSEFMX1VBUlRfSW5pdCgpIGZ1bmN0aW9uLiBBcyBpbnZvbHZpbmcNCi0gKiBkaXJlY3QgYWNjZXNzIHRvIFVBUlQgcmVnaXN0ZXJzLCB1c2FnZSBvZiB0aGlzIG1hY3JvIHNob3VsZCBiZSBmdWxseSBlbmRvcnNlZA0KLSAqIGJ5IHVzZXIuDQotICogQG5vdGUgICBBcyBtYWNybyBpcyBleHBlY3RlZCB0byBiZSB1c2VkIGZvciBtb2RpZnlpbmcgUlRTIEh3IGZsb3cgY29udHJvbA0KLSAqIGZlYXR1cmUgYWN0aXZhdGlvbiwgd2l0aG91dCBuZWVkIGZvciBVU0FSVCBpbnN0YW5jZSBEZWluaXQvSW5pdCwgZm9sbG93aW5nDQotICogY29uZGl0aW9ucyBmb3IgbWFjcm8gY2FsbCBzaG91bGQgYmUgZnVsZmlsbGVkIDoNCi0gKiAgICAgICAgICAgLSBVQVJUIGluc3RhbmNlIHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiBpbml0aWFsaXNlZCAodGhyb3VnaCBjYWxsDQotICogb2YgSEFMX1VBUlRfSW5pdCgpICkNCi0gKiAgICAgICAgICAgLSBtYWNybyBjb3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuIGNvcnJlc3BvbmRpbmcgVUFSVCBpbnN0YW5jZSBpcw0KLSAqIGRpc2FibGVkIChpLmUuIF9fSEFMX1VBUlRfRElTQUJMRShfX0hBTkRMRV9fKSkgYW5kIHNob3VsZCBiZSBmb2xsb3dlZCBieSBhbg0KLSAqIEVuYWJsZSBtYWNybyAoaS5lLiBfX0hBTF9VQVJUX0VOQUJMRShfX0hBTkRMRV9fKSkuDQotICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBfX0hBTF9VQVJUX0hXQ09OVFJPTF9SVFNfRU5BQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICBcDQotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIEFUT01JQ19TRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX1JUU0UpOyBcDQotICAgIChfX0hBTkRMRV9fKS0+SW5pdC5Id0Zsb3dDdGwgfD0gVVNBUlRfQ1IzX1JUU0U7ICAgICAgICAgICAgICBcDQotICB9IHdoaWxlICgwVSkNCi0NCi0vKiogQGJyaWVmICBEaXNhYmxlIFJUUyBmbG93IGNvbnRyb2wuDQotICogQG5vdGUgICBUaGlzIG1hY3JvIGFsbG93cyB0byBkaXNhYmxlIFJUUyBoYXJkd2FyZSBmbG93IGNvbnRyb2wgZm9yIGEgZ2l2ZW4NCi0gKiBVQVJUIGluc3RhbmNlLCB3aXRob3V0IG5lZWQgdG8gY2FsbCBIQUxfVUFSVF9Jbml0KCkgZnVuY3Rpb24uIEFzIGludm9sdmluZw0KLSAqIGRpcmVjdCBhY2Nlc3MgdG8gVUFSVCByZWdpc3RlcnMsIHVzYWdlIG9mIHRoaXMgbWFjcm8gc2hvdWxkIGJlIGZ1bGx5IGVuZG9yc2VkDQotICogYnkgdXNlci4NCi0gKiBAbm90ZSAgIEFzIG1hY3JvIGlzIGV4cGVjdGVkIHRvIGJlIHVzZWQgZm9yIG1vZGlmeWluZyBSVFMgSHcgZmxvdyBjb250cm9sDQotICogZmVhdHVyZSBhY3RpdmF0aW9uLCB3aXRob3V0IG5lZWQgZm9yIFVTQVJUIGluc3RhbmNlIERlaW5pdC9Jbml0LCBmb2xsb3dpbmcNCi0gKiBjb25kaXRpb25zIGZvciBtYWNybyBjYWxsIHNob3VsZCBiZSBmdWxmaWxsZWQgOg0KLSAqICAgICAgICAgICAtIFVBUlQgaW5zdGFuY2Ugc2hvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIGluaXRpYWxpc2VkICh0aHJvdWdoIGNhbGwNCi0gKiBvZiBIQUxfVUFSVF9Jbml0KCkgKQ0KLSAqICAgICAgICAgICAtIG1hY3JvIGNvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4gY29ycmVzcG9uZGluZyBVQVJUIGluc3RhbmNlIGlzDQotICogZGlzYWJsZWQgKGkuZS4gX19IQUxfVUFSVF9ESVNBQkxFKF9fSEFORExFX18pKSBhbmQgc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IGFuDQotICogRW5hYmxlIG1hY3JvIChpLmUuIF9fSEFMX1VBUlRfRU5BQkxFKF9fSEFORExFX18pKS4NCi0gKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIF9fSEFMX1VBUlRfSFdDT05UUk9MX1JUU19ESVNBQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgXA0KLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIEFUT01JQ19DTEVBUl9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfUlRTRSk7IFwNCi0gICAgKF9fSEFORExFX18pLT5Jbml0Lkh3Rmxvd0N0bCAmPSB+KFVTQVJUX0NSM19SVFNFKTsgICAgICAgICAgICAgXA0KLSAgfSB3aGlsZSAoMFUpDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBkZWZncm91cCBVQVJUX1ByaXZhdGVfTWFjcm9zICAgVUFSVCBQcml2YXRlIE1hY3Jvcw0KLSAqIEB7DQotICovDQotLyoqIEBicmllZiAgR2V0IFVBUlQgY2xvayBkaXZpc2lvbiBmYWN0b3IgZnJvbSBjbG9jayBwcmVzY2FsZXIgdmFsdWUuDQotICogQHBhcmFtICBfX0NMT0NLUFJFU0NBTEVSX18gVUFSVCBwcmVzY2FsZXIgdmFsdWUuDQotICogQHJldHZhbCBVQVJUIGNsb2NrIGRpdmlzaW9uIGZhY3Rvcg0KLSAqLw0KLSNkZWZpbmUgVUFSVF9HRVRfRElWX0ZBQ1RPUihfX0NMT0NLUFJFU0NBTEVSX18pICAgICAgICAgICAgIFwNCi0gICgoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gVUFSVF9QUkVTQ0FMRVJfRElWMSkgICAgID8gMVUgICBcDQotICAgOiAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gVUFSVF9QUkVTQ0FMRVJfRElWMikgICA/IDJVICAgXA0KLSAgIDogKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFVBUlRfUFJFU0NBTEVSX0RJVjQpICAgPyA0VSAgIFwNCi0gICA6ICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBVQVJUX1BSRVNDQUxFUl9ESVY2KSAgID8gNlUgICBcDQotICAgOiAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gVUFSVF9QUkVTQ0FMRVJfRElWOCkgICA/IDhVICAgXA0KLSAgIDogKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFVBUlRfUFJFU0NBTEVSX0RJVjEwKSAgPyAxMFUgIFwNCi0gICA6ICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBVQVJUX1BSRVNDQUxFUl9ESVYxMikgID8gMTJVICBcDQotICAgOiAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gVUFSVF9QUkVTQ0FMRVJfRElWMTYpICA/IDE2VSAgXA0KLSAgIDogKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFVBUlRfUFJFU0NBTEVSX0RJVjMyKSAgPyAzMlUgIFwNCi0gICA6ICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBVQVJUX1BSRVNDQUxFUl9ESVY2NCkgID8gNjRVICBcDQotICAgOiAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gVUFSVF9QUkVTQ0FMRVJfRElWMTI4KSA/IDEyOFUgXA0KLSAgIDogKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFVBUlRfUFJFU0NBTEVSX0RJVjI1NikgPyAyNTZVIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMVUpDQotDQotLyoqIEBicmllZiAgQlJSIGRpdmlzaW9uIG9wZXJhdGlvbiB0byBzZXQgQlJSIHJlZ2lzdGVyIHdpdGggTFBVQVJULg0KLSAqIEBwYXJhbSAgX19QQ0xLX18gTFBVQVJUIGNsb2NrLg0KLSAqIEBwYXJhbSAgX19CQVVEX18gQmF1ZCByYXRlIHNldCBieSB0aGUgdXNlci4NCi0gKiBAcGFyYW0gIF9fQ0xPQ0tQUkVTQ0FMRVJfXyBVQVJUIHByZXNjYWxlciB2YWx1ZS4NCi0gKiBAcmV0dmFsIERpdmlzaW9uIHJlc3VsdA0KLSAqLw0KLSNkZWZpbmUgVUFSVF9ESVZfTFBVQVJUKF9fUENMS19fLCBfX0JBVURfXywgX19DTE9DS1BSRVNDQUxFUl9fKSBcDQotICAoKHVpbnQzMl90KSgoKCgoKHVpbnQ2NF90KShfX1BDTEtfXykpIC8gICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgICAgICAgIChVQVJUUHJlc2NUYWJsZVsoX19DTE9DS1BSRVNDQUxFUl9fKV0pKSAqICAgICAgXA0KLSAgICAgICAgICAgICAgICAyNTZVKSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICAgICAgICAgKHVpbnQzMl90KSgoX19CQVVEX18pIC8gMlUpKSAvICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgICAgIChfX0JBVURfXykpKQ0KLQ0KLS8qKiBAYnJpZWYgIEJSUiBkaXZpc2lvbiBvcGVyYXRpb24gdG8gc2V0IEJSUiByZWdpc3RlciBpbiA4LWJpdCBvdmVyc2FtcGxpbmcNCi0gKiBtb2RlLg0KLSAqIEBwYXJhbSAgX19QQ0xLX18gVUFSVCBjbG9jay4NCi0gKiBAcGFyYW0gIF9fQkFVRF9fIEJhdWQgcmF0ZSBzZXQgYnkgdGhlIHVzZXIuDQotICogQHBhcmFtICBfX0NMT0NLUFJFU0NBTEVSX18gVUFSVCBwcmVzY2FsZXIgdmFsdWUuDQotICogQHJldHZhbCBEaXZpc2lvbiByZXN1bHQNCi0gKi8NCi0jZGVmaW5lIFVBUlRfRElWX1NBTVBMSU5HOChfX1BDTEtfXywgX19CQVVEX18sIF9fQ0xPQ0tQUkVTQ0FMRVJfXykgXA0KLSAgKCgoKChfX1BDTEtfXykgLyBVQVJUUHJlc2NUYWJsZVsoX19DTE9DS1BSRVNDQUxFUl9fKV0pICogMlUpICsgICBcDQotICAgICgoX19CQVVEX18pIC8gMlUpKSAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoX19CQVVEX18pKQ0KLQ0KLS8qKiBAYnJpZWYgIEJSUiBkaXZpc2lvbiBvcGVyYXRpb24gdG8gc2V0IEJSUiByZWdpc3RlciBpbiAxNi1iaXQgb3ZlcnNhbXBsaW5nDQotICogbW9kZS4NCi0gKiBAcGFyYW0gIF9fUENMS19fIFVBUlQgY2xvY2suDQotICogQHBhcmFtICBfX0JBVURfXyBCYXVkIHJhdGUgc2V0IGJ5IHRoZSB1c2VyLg0KLSAqIEBwYXJhbSAgX19DTE9DS1BSRVNDQUxFUl9fIFVBUlQgcHJlc2NhbGVyIHZhbHVlLg0KLSAqIEByZXR2YWwgRGl2aXNpb24gcmVzdWx0DQotICovDQotI2RlZmluZSBVQVJUX0RJVl9TQU1QTElORzE2KF9fUENMS19fLCBfX0JBVURfXywgX19DTE9DS1BSRVNDQUxFUl9fKSAgICAgICAgICAgIFwNCi0gICgoKChfX1BDTEtfXykgLyBVQVJUUHJlc2NUYWJsZVsoX19DTE9DS1BSRVNDQUxFUl9fKV0pICsgKChfX0JBVURfXykgLyAyVSkpIC8gXA0KLSAgIChfX0JBVURfXykpDQotDQotLyoqIEBicmllZiAgQ2hlY2sgd2hldGhlciBvciBub3QgVUFSVCBpbnN0YW5jZSBpcyBMb3cgUG93ZXIgVUFSVC4NCi0gKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4NCi0gKiBAcmV0dmFsIFNFVCAoaW5zdGFuY2UgaXMgTFBVQVJUKSBvciBSRVNFVCAoaW5zdGFuY2UgaXNuJ3QgTFBVQVJUKQ0KLSAqLw0KLSNkZWZpbmUgVUFSVF9JTlNUQU5DRV9MT1dQT1dFUihfX0hBTkRMRV9fKSBcDQotICAoSVNfTFBVQVJUX0lOU1RBTkNFKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpKQ0KLQ0KLS8qKiBAYnJpZWYgIENoZWNrIFVBUlQgQmF1ZCByYXRlLg0KLSAqIEBwYXJhbSAgX19CQVVEUkFURV9fIEJhdWRyYXRlIHNwZWNpZmllZCBieSB0aGUgdXNlci4NCi0gKiAgICAgICAgIFRoZSBtYXhpbXVtIEJhdWQgUmF0ZSBpcyBkZXJpdmVkIGZyb20gdGhlIG1heGltdW0gY2xvY2sgb24gRzQgKGkuZS4NCi0gKiAxNTAgTUh6KSBkaXZpZGVkIGJ5IHRoZSBzbWFsbGVzdCBvdmVyc2FtcGxpbmcgdXNlZCBvbiB0aGUgVVNBUlQgKGkuZS4gOCkNCi0gKiBAcmV0dmFsIFNFVCAoX19CQVVEUkFURV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19CQVVEUkFURV9fIGlzIGludmFsaWQpDQotICovDQotI2RlZmluZSBJU19VQVJUX0JBVURSQVRFKF9fQkFVRFJBVEVfXykgKChfX0JBVURSQVRFX18pIDwgMTg3NTAwMDFVKQ0KLQ0KLS8qKiBAYnJpZWYgIENoZWNrIFVBUlQgYXNzZXJ0aW9uIHRpbWUuDQotICogQHBhcmFtICBfX1RJTUVfXyA1LWJpdCB2YWx1ZSBhc3NlcnRpb24gdGltZS4NCi0gKiBAcmV0dmFsIFRlc3QgcmVzdWx0IChUUlVFIG9yIEZBTFNFKS4NCi0gKi8NCi0jZGVmaW5lIElTX1VBUlRfQVNTRVJUSU9OVElNRShfX1RJTUVfXykgKChfX1RJTUVfXykgPD0gMHgxRlUpDQotDQotLyoqIEBicmllZiAgQ2hlY2sgVUFSVCBkZWFzc2VydGlvbiB0aW1lLg0KLSAqIEBwYXJhbSAgX19USU1FX18gNS1iaXQgdmFsdWUgZGVhc3NlcnRpb24gdGltZS4NCi0gKiBAcmV0dmFsIFRlc3QgcmVzdWx0IChUUlVFIG9yIEZBTFNFKS4NCi0gKi8NCi0jZGVmaW5lIElTX1VBUlRfREVBU1NFUlRJT05USU1FKF9fVElNRV9fKSAoKF9fVElNRV9fKSA8PSAweDFGVSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCBmcmFtZSBudW1iZXIgb2Ygc3RvcCBiaXRzIGlzIHZhbGlkLg0KLSAqIEBwYXJhbSBfX1NUT1BCSVRTX18gVUFSVCBmcmFtZSBudW1iZXIgb2Ygc3RvcCBiaXRzLg0KLSAqIEByZXR2YWwgU0VUIChfX1NUT1BCSVRTX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1NUT1BCSVRTX18gaXMgaW52YWxpZCkNCi0gKi8NCi0jZGVmaW5lIElTX1VBUlRfU1RPUEJJVFMoX19TVE9QQklUU19fKSAgICAgIFwNCi0gICgoKF9fU1RPUEJJVFNfXykgPT0gVUFSVF9TVE9QQklUU18wXzUpIHx8IFwNCi0gICAoKF9fU1RPUEJJVFNfXykgPT0gVUFSVF9TVE9QQklUU18xKSB8fCAgIFwNCi0gICAoKF9fU1RPUEJJVFNfXykgPT0gVUFSVF9TVE9QQklUU18xXzUpIHx8IFwNCi0gICAoKF9fU1RPUEJJVFNfXykgPT0gVUFSVF9TVE9QQklUU18yKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgRW5zdXJlIHRoYXQgTFBVQVJUIGZyYW1lIG51bWJlciBvZiBzdG9wIGJpdHMgaXMgdmFsaWQuDQotICogQHBhcmFtIF9fU1RPUEJJVFNfXyBMUFVBUlQgZnJhbWUgbnVtYmVyIG9mIHN0b3AgYml0cy4NCi0gKiBAcmV0dmFsIFNFVCAoX19TVE9QQklUU19fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19TVE9QQklUU19fIGlzIGludmFsaWQpDQotICovDQotI2RlZmluZSBJU19MUFVBUlRfU1RPUEJJVFMoX19TVE9QQklUU19fKSBcDQotICAoKChfX1NUT1BCSVRTX18pID09IFVBUlRfU1RPUEJJVFNfMSkgfHwgKChfX1NUT1BCSVRTX18pID09IFVBUlRfU1RPUEJJVFNfMikpDQotDQotLyoqDQotICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgZnJhbWUgcGFyaXR5IGlzIHZhbGlkLg0KLSAqIEBwYXJhbSBfX1BBUklUWV9fIFVBUlQgZnJhbWUgcGFyaXR5Lg0KLSAqIEByZXR2YWwgU0VUIChfX1BBUklUWV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19QQVJJVFlfXyBpcyBpbnZhbGlkKQ0KLSAqLw0KLSNkZWZpbmUgSVNfVUFSVF9QQVJJVFkoX19QQVJJVFlfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKChfX1BBUklUWV9fKSA9PSBVQVJUX1BBUklUWV9OT05FKSB8fCAoKF9fUEFSSVRZX18pID09IFVBUlRfUEFSSVRZX0VWRU4pIHx8IFwNCi0gICAoKF9fUEFSSVRZX18pID09IFVBUlRfUEFSSVRZX09ERCkpDQotDQotLyoqDQotICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgaGFyZHdhcmUgZmxvdyBjb250cm9sIGlzIHZhbGlkLg0KLSAqIEBwYXJhbSBfX0NPTlRST0xfXyBVQVJUIGhhcmR3YXJlIGZsb3cgY29udHJvbC4NCi0gKiBAcmV0dmFsIFNFVCAoX19DT05UUk9MX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0NPTlRST0xfXyBpcyBpbnZhbGlkKQ0KLSAqLw0KLSNkZWZpbmUgSVNfVUFSVF9IQVJEV0FSRV9GTE9XX0NPTlRST0woX19DT05UUk9MX18pIFwNCi0gICgoKF9fQ09OVFJPTF9fKSA9PSBVQVJUX0hXQ09OVFJPTF9OT05FKSB8fCAgICAgICBcDQotICAgKChfX0NPTlRST0xfXykgPT0gVUFSVF9IV0NPTlRST0xfUlRTKSB8fCAgICAgICAgXA0KLSAgICgoX19DT05UUk9MX18pID09IFVBUlRfSFdDT05UUk9MX0NUUykgfHwgICAgICAgIFwNCi0gICAoKF9fQ09OVFJPTF9fKSA9PSBVQVJUX0hXQ09OVFJPTF9SVFNfQ1RTKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCBjb21tdW5pY2F0aW9uIG1vZGUgaXMgdmFsaWQuDQotICogQHBhcmFtIF9fTU9ERV9fIFVBUlQgY29tbXVuaWNhdGlvbiBtb2RlLg0KLSAqIEByZXR2YWwgU0VUIChfX01PREVfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fTU9ERV9fIGlzIGludmFsaWQpDQotICovDQotI2RlZmluZSBJU19VQVJUX01PREUoX19NT0RFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKCgoX19NT0RFX18pICYgKH4oKHVpbnQzMl90KShVQVJUX01PREVfVFhfUlgpKSkpID09IDB4MDBVKSAmJiBcDQotICAgKChfX01PREVfXykgIT0gMHgwMFUpKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIHN0YXRlIGlzIHZhbGlkLg0KLSAqIEBwYXJhbSBfX1NUQVRFX18gVUFSVCBzdGF0ZS4NCi0gKiBAcmV0dmFsIFNFVCAoX19TVEFURV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19TVEFURV9fIGlzIGludmFsaWQpDQotICovDQotI2RlZmluZSBJU19VQVJUX1NUQVRFKF9fU1RBVEVfXykgXA0KLSAgKCgoX19TVEFURV9fKSA9PSBVQVJUX1NUQVRFX0RJU0FCTEUpIHx8ICgoX19TVEFURV9fKSA9PSBVQVJUX1NUQVRFX0VOQUJMRSkpDQotDQotLyoqDQotICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgb3ZlcnNhbXBsaW5nIGlzIHZhbGlkLg0KLSAqIEBwYXJhbSBfX1NBTVBMSU5HX18gVUFSVCBvdmVyc2FtcGxpbmcuDQotICogQHJldHZhbCBTRVQgKF9fU0FNUExJTkdfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fU0FNUExJTkdfXyBpcyBpbnZhbGlkKQ0KLSAqLw0KLSNkZWZpbmUgSVNfVUFSVF9PVkVSU0FNUExJTkcoX19TQU1QTElOR19fKSAgICAgXA0KLSAgKCgoX19TQU1QTElOR19fKSA9PSBVQVJUX09WRVJTQU1QTElOR18xNikgfHwgXA0KLSAgICgoX19TQU1QTElOR19fKSA9PSBVQVJUX09WRVJTQU1QTElOR184KSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCBmcmFtZSBzYW1wbGluZyBpcyB2YWxpZC4NCi0gKiBAcGFyYW0gX19PTkVCSVRfXyBVQVJUIGZyYW1lIHNhbXBsaW5nLg0KLSAqIEByZXR2YWwgU0VUIChfX09ORUJJVF9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19PTkVCSVRfXyBpcyBpbnZhbGlkKQ0KLSAqLw0KLSNkZWZpbmUgSVNfVUFSVF9PTkVfQklUX1NBTVBMRShfX09ORUJJVF9fKSAgICAgICAgICBcDQotICAoKChfX09ORUJJVF9fKSA9PSBVQVJUX09ORV9CSVRfU0FNUExFX0RJU0FCTEUpIHx8IFwNCi0gICAoKF9fT05FQklUX18pID09IFVBUlRfT05FX0JJVF9TQU1QTEVfRU5BQkxFKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCBhdXRvIEJhdWQgcmF0ZSBkZXRlY3Rpb24gbW9kZSBpcyB2YWxpZC4NCi0gKiBAcGFyYW0gX19NT0RFX18gVUFSVCBhdXRvIEJhdWQgcmF0ZSBkZXRlY3Rpb24gbW9kZS4NCi0gKiBAcmV0dmFsIFNFVCAoX19NT0RFX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX01PREVfXyBpcyBpbnZhbGlkKQ0KLSAqLw0KLSNkZWZpbmUgSVNfVUFSVF9BRFZGRUFUVVJFX0FVVE9CQVVEUkFURU1PREUoX19NT0RFX18pICAgICAgICAgICAgXA0KLSAgKCgoX19NT0RFX18pID09IFVBUlRfQURWRkVBVFVSRV9BVVRPQkFVRFJBVEVfT05TVEFSVEJJVCkgfHwgICAgXA0KLSAgICgoX19NT0RFX18pID09IFVBUlRfQURWRkVBVFVSRV9BVVRPQkFVRFJBVEVfT05GQUxMSU5HRURHRSkgfHwgXA0KLSAgICgoX19NT0RFX18pID09IFVBUlRfQURWRkVBVFVSRV9BVVRPQkFVRFJBVEVfT04wWDdGRlJBTUUpIHx8ICAgXA0KLSAgICgoX19NT0RFX18pID09IFVBUlRfQURWRkVBVFVSRV9BVVRPQkFVRFJBVEVfT04wWDU1RlJBTUUpKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIHJlY2VpdmVyIHRpbWVvdXQgc2V0dGluZyBpcyB2YWxpZC4NCi0gKiBAcGFyYW0gX19USU1FT1VUX18gVUFSVCByZWNlaXZlciB0aW1lb3V0IHNldHRpbmcuDQotICogQHJldHZhbCBTRVQgKF9fVElNRU9VVF9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19USU1FT1VUX18gaXMgaW52YWxpZCkNCi0gKi8NCi0jZGVmaW5lIElTX1VBUlRfUkVDRUlWRVJfVElNRU9VVChfX1RJTUVPVVRfXykgICAgICAgICAgXA0KLSAgKCgoX19USU1FT1VUX18pID09IFVBUlRfUkVDRUlWRVJfVElNRU9VVF9ESVNBQkxFKSB8fCBcDQotICAgKChfX1RJTUVPVVRfXykgPT0gVUFSVF9SRUNFSVZFUl9USU1FT1VUX0VOQUJMRSkpDQotDQotLyoqIEBicmllZiAgQ2hlY2sgdGhlIHJlY2VpdmVyIHRpbWVvdXQgdmFsdWUuDQotICogQG5vdGUgICBUaGUgbWF4aW11bSBVQVJUIHJlY2VpdmVyIHRpbWVvdXQgdmFsdWUgaXMgMHhGRkZGRkYuDQotICogQHBhcmFtICBfX1RJTUVPVVRWQUxVRV9fIHJlY2VpdmVyIHRpbWVvdXQgdmFsdWUuDQotICogQHJldHZhbCBUZXN0IHJlc3VsdCAoVFJVRSBvciBGQUxTRSkNCi0gKi8NCi0jZGVmaW5lIElTX1VBUlRfUkVDRUlWRVJfVElNRU9VVF9WQUxVRShfX1RJTUVPVVRWQUxVRV9fKSBcDQotICAoKF9fVElNRU9VVFZBTFVFX18pIDw9IDB4RkZGRkZGVSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCBMSU4gc3RhdGUgaXMgdmFsaWQuDQotICogQHBhcmFtIF9fTElOX18gVUFSVCBMSU4gc3RhdGUuDQotICogQHJldHZhbCBTRVQgKF9fTElOX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0xJTl9fIGlzIGludmFsaWQpDQotICovDQotI2RlZmluZSBJU19VQVJUX0xJTihfX0xJTl9fKSBcDQotICAoKChfX0xJTl9fKSA9PSBVQVJUX0xJTl9ESVNBQkxFKSB8fCAoKF9fTElOX18pID09IFVBUlRfTElOX0VOQUJMRSkpDQotDQotLyoqDQotICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgTElOIGJyZWFrIGRldGVjdGlvbiBsZW5ndGggaXMgdmFsaWQuDQotICogQHBhcmFtIF9fTEVOR1RIX18gVUFSVCBMSU4gYnJlYWsgZGV0ZWN0aW9uIGxlbmd0aC4NCi0gKiBAcmV0dmFsIFNFVCAoX19MRU5HVEhfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fTEVOR1RIX18gaXMgaW52YWxpZCkNCi0gKi8NCi0jZGVmaW5lIElTX1VBUlRfTElOX0JSRUFLX0RFVEVDVF9MRU5HVEgoX19MRU5HVEhfXykgICBcDQotICAoKChfX0xFTkdUSF9fKSA9PSBVQVJUX0xJTkJSRUFLREVURUNUTEVOR1RIXzEwQikgfHwgXA0KLSAgICgoX19MRU5HVEhfXykgPT0gVUFSVF9MSU5CUkVBS0RFVEVDVExFTkdUSF8xMUIpKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIERNQSBUWCBzdGF0ZSBpcyB2YWxpZC4NCi0gKiBAcGFyYW0gX19ETUFUWF9fIFVBUlQgRE1BIFRYIHN0YXRlLg0KLSAqIEByZXR2YWwgU0VUIChfX0RNQVRYX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0RNQVRYX18gaXMgaW52YWxpZCkNCi0gKi8NCi0jZGVmaW5lIElTX1VBUlRfRE1BX1RYKF9fRE1BVFhfXykgXA0KLSAgKCgoX19ETUFUWF9fKSA9PSBVQVJUX0RNQV9UWF9ESVNBQkxFKSB8fCAoKF9fRE1BVFhfXykgPT0gVUFSVF9ETUFfVFhfRU5BQkxFKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCBETUEgUlggc3RhdGUgaXMgdmFsaWQuDQotICogQHBhcmFtIF9fRE1BUlhfXyBVQVJUIERNQSBSWCBzdGF0ZS4NCi0gKiBAcmV0dmFsIFNFVCAoX19ETUFSWF9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19ETUFSWF9fIGlzIGludmFsaWQpDQotICovDQotI2RlZmluZSBJU19VQVJUX0RNQV9SWChfX0RNQVJYX18pIFwNCi0gICgoKF9fRE1BUlhfXykgPT0gVUFSVF9ETUFfUlhfRElTQUJMRSkgfHwgKChfX0RNQVJYX18pID09IFVBUlRfRE1BX1JYX0VOQUJMRSkpDQotDQotLyoqDQotICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgaGFsZi1kdXBsZXggc3RhdGUgaXMgdmFsaWQuDQotICogQHBhcmFtIF9fSERTRUxfXyBVQVJUIGhhbGYtZHVwbGV4IHN0YXRlLg0KLSAqIEByZXR2YWwgU0VUIChfX0hEU0VMX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0hEU0VMX18gaXMgaW52YWxpZCkNCi0gKi8NCi0jZGVmaW5lIElTX1VBUlRfSEFMRl9EVVBMRVgoX19IRFNFTF9fKSAgICAgICAgICBcDQotICAoKChfX0hEU0VMX18pID09IFVBUlRfSEFMRl9EVVBMRVhfRElTQUJMRSkgfHwgXA0KLSAgICgoX19IRFNFTF9fKSA9PSBVQVJUX0hBTEZfRFVQTEVYX0VOQUJMRSkpDQotDQotLyoqDQotICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgd2FrZS11cCBtZXRob2QgaXMgdmFsaWQuDQotICogQHBhcmFtIF9fV0FLRVVQX18gVUFSVCB3YWtlLXVwIG1ldGhvZCAuDQotICogQHJldHZhbCBTRVQgKF9fV0FLRVVQX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1dBS0VVUF9fIGlzIGludmFsaWQpDQotICovDQotI2RlZmluZSBJU19VQVJUX1dBS0VVUE1FVEhPRChfX1dBS0VVUF9fKSAgICAgICAgICAgXA0KLSAgKCgoX19XQUtFVVBfXykgPT0gVUFSVF9XQUtFVVBNRVRIT0RfSURMRUxJTkUpIHx8IFwNCi0gICAoKF9fV0FLRVVQX18pID09IFVBUlRfV0FLRVVQTUVUSE9EX0FERFJFU1NNQVJLKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCByZXF1ZXN0IHBhcmFtZXRlciBpcyB2YWxpZC4NCi0gKiBAcGFyYW0gX19QQVJBTV9fIFVBUlQgcmVxdWVzdCBwYXJhbWV0ZXIuDQotICogQHJldHZhbCBTRVQgKF9fUEFSQU1fXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fUEFSQU1fXyBpcyBpbnZhbGlkKQ0KLSAqLw0KLSNkZWZpbmUgSVNfVUFSVF9SRVFVRVNUX1BBUkFNRVRFUihfX1BBUkFNX18pICAgICBcDQotICAoKChfX1BBUkFNX18pID09IFVBUlRfQVVUT0JBVURfUkVRVUVTVCkgfHwgICAgIFwNCi0gICAoKF9fUEFSQU1fXykgPT0gVUFSVF9TRU5EQlJFQUtfUkVRVUVTVCkgfHwgICAgXA0KLSAgICgoX19QQVJBTV9fKSA9PSBVQVJUX01VVEVfTU9ERV9SRVFVRVNUKSB8fCAgICBcDQotICAgKChfX1BBUkFNX18pID09IFVBUlRfUlhEQVRBX0ZMVVNIX1JFUVVFU1QpIHx8IFwNCi0gICAoKF9fUEFSQU1fXykgPT0gVUFSVF9UWERBVEFfRkxVU0hfUkVRVUVTVCkpDQotDQotLyoqDQotICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgYWR2YW5jZWQgZmVhdHVyZXMgaW5pdGlhbGl6YXRpb24gaXMgdmFsaWQuDQotICogQHBhcmFtIF9fSU5JVF9fIFVBUlQgYWR2YW5jZWQgZmVhdHVyZXMgaW5pdGlhbGl6YXRpb24uDQotICogQHJldHZhbCBTRVQgKF9fSU5JVF9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19JTklUX18gaXMgaW52YWxpZCkNCi0gKi8NCi0jZGVmaW5lIElTX1VBUlRfQURWRkVBVFVSRV9JTklUKF9fSU5JVF9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKF9fSU5JVF9fKSA8PSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIChVQVJUX0FEVkZFQVRVUkVfTk9fSU5JVCB8IFVBUlRfQURWRkVBVFVSRV9UWElOVkVSVF9JTklUIHwgICAgICAgICAgIFwNCi0gICAgVUFSVF9BRFZGRUFUVVJFX1JYSU5WRVJUX0lOSVQgfCBVQVJUX0FEVkZFQVRVUkVfREFUQUlOVkVSVF9JTklUIHwgICBcDQotICAgIFVBUlRfQURWRkVBVFVSRV9TV0FQX0lOSVQgfCBVQVJUX0FEVkZFQVRVUkVfUlhPVkVSUlVORElTQUJMRV9JTklUIHwgXA0KLSAgICBVQVJUX0FEVkZFQVRVUkVfRE1BRElTQUJMRU9ORVJST1JfSU5JVCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgVUFSVF9BRFZGRUFUVVJFX0FVVE9CQVVEUkFURV9JTklUIHwgVUFSVF9BRFZGRUFUVVJFX01TQkZJUlNUX0lOSVQpKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIGZyYW1lIFRYIGludmVyc2lvbiBzZXR0aW5nIGlzIHZhbGlkLg0KLSAqIEBwYXJhbSBfX1RYSU5WX18gVUFSVCBmcmFtZSBUWCBpbnZlcnNpb24gc2V0dGluZy4NCi0gKiBAcmV0dmFsIFNFVCAoX19UWElOVl9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19UWElOVl9fIGlzIGludmFsaWQpDQotICovDQotI2RlZmluZSBJU19VQVJUX0FEVkZFQVRVUkVfVFhJTlYoX19UWElOVl9fKSAgICAgICAgICBcDQotICAoKChfX1RYSU5WX18pID09IFVBUlRfQURWRkVBVFVSRV9UWElOVl9ESVNBQkxFKSB8fCBcDQotICAgKChfX1RYSU5WX18pID09IFVBUlRfQURWRkVBVFVSRV9UWElOVl9FTkFCTEUpKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIGZyYW1lIFJYIGludmVyc2lvbiBzZXR0aW5nIGlzIHZhbGlkLg0KLSAqIEBwYXJhbSBfX1JYSU5WX18gVUFSVCBmcmFtZSBSWCBpbnZlcnNpb24gc2V0dGluZy4NCi0gKiBAcmV0dmFsIFNFVCAoX19SWElOVl9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19SWElOVl9fIGlzIGludmFsaWQpDQotICovDQotI2RlZmluZSBJU19VQVJUX0FEVkZFQVRVUkVfUlhJTlYoX19SWElOVl9fKSAgICAgICAgICBcDQotICAoKChfX1JYSU5WX18pID09IFVBUlRfQURWRkVBVFVSRV9SWElOVl9ESVNBQkxFKSB8fCBcDQotICAgKChfX1JYSU5WX18pID09IFVBUlRfQURWRkVBVFVSRV9SWElOVl9FTkFCTEUpKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIGZyYW1lIGRhdGEgaW52ZXJzaW9uIHNldHRpbmcgaXMgdmFsaWQuDQotICogQHBhcmFtIF9fREFUQUlOVl9fIFVBUlQgZnJhbWUgZGF0YSBpbnZlcnNpb24gc2V0dGluZy4NCi0gKiBAcmV0dmFsIFNFVCAoX19EQVRBSU5WX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0RBVEFJTlZfXyBpcyBpbnZhbGlkKQ0KLSAqLw0KLSNkZWZpbmUgSVNfVUFSVF9BRFZGRUFUVVJFX0RBVEFJTlYoX19EQVRBSU5WX18pICAgICAgICAgIFwNCi0gICgoKF9fREFUQUlOVl9fKSA9PSBVQVJUX0FEVkZFQVRVUkVfREFUQUlOVl9ESVNBQkxFKSB8fCBcDQotICAgKChfX0RBVEFJTlZfXykgPT0gVUFSVF9BRFZGRUFUVVJFX0RBVEFJTlZfRU5BQkxFKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCBmcmFtZSBSWC9UWCBwaW5zIHN3YXAgc2V0dGluZyBpcyB2YWxpZC4NCi0gKiBAcGFyYW0gX19TV0FQX18gVUFSVCBmcmFtZSBSWC9UWCBwaW5zIHN3YXAgc2V0dGluZy4NCi0gKiBAcmV0dmFsIFNFVCAoX19TV0FQX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1NXQVBfXyBpcyBpbnZhbGlkKQ0KLSAqLw0KLSNkZWZpbmUgSVNfVUFSVF9BRFZGRUFUVVJFX1NXQVAoX19TV0FQX18pICAgICAgICAgIFwNCi0gICgoKF9fU1dBUF9fKSA9PSBVQVJUX0FEVkZFQVRVUkVfU1dBUF9ESVNBQkxFKSB8fCBcDQotICAgKChfX1NXQVBfXykgPT0gVUFSVF9BRFZGRUFUVVJFX1NXQVBfRU5BQkxFKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCBmcmFtZSBvdmVycnVuIHNldHRpbmcgaXMgdmFsaWQuDQotICogQHBhcmFtIF9fT1ZFUlJVTl9fIFVBUlQgZnJhbWUgb3ZlcnJ1biBzZXR0aW5nLg0KLSAqIEByZXR2YWwgU0VUIChfX09WRVJSVU5fXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fT1ZFUlJVTl9fIGlzIGludmFsaWQpDQotICovDQotI2RlZmluZSBJU19VQVJUX09WRVJSVU4oX19PVkVSUlVOX18pICAgICAgICAgICAgICAgICAgICBcDQotICAoKChfX09WRVJSVU5fXykgPT0gVUFSVF9BRFZGRUFUVVJFX09WRVJSVU5fRU5BQkxFKSB8fCBcDQotICAgKChfX09WRVJSVU5fXykgPT0gVUFSVF9BRFZGRUFUVVJFX09WRVJSVU5fRElTQUJMRSkpDQotDQotLyoqDQotICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgYXV0byBCYXVkIHJhdGUgc3RhdGUgaXMgdmFsaWQuDQotICogQHBhcmFtIF9fQVVUT0JBVURSQVRFX18gVUFSVCBhdXRvIEJhdWQgcmF0ZSBzdGF0ZS4NCi0gKiBAcmV0dmFsIFNFVCAoX19BVVRPQkFVRFJBVEVfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fQVVUT0JBVURSQVRFX18gaXMNCi0gKiBpbnZhbGlkKQ0KLSAqLw0KLSNkZWZpbmUgSVNfVUFSVF9BRFZGRUFUVVJFX0FVVE9CQVVEUkFURShfX0FVVE9CQVVEUkFURV9fKSAgICAgICAgICBcDQotICAoKChfX0FVVE9CQVVEUkFURV9fKSA9PSBVQVJUX0FEVkZFQVRVUkVfQVVUT0JBVURSQVRFX0RJU0FCTEUpIHx8IFwNCi0gICAoKF9fQVVUT0JBVURSQVRFX18pID09IFVBUlRfQURWRkVBVFVSRV9BVVRPQkFVRFJBVEVfRU5BQkxFKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCBETUEgZW5hYmxpbmcgb3IgZGlzYWJsaW5nIG9uIGVycm9yIHNldHRpbmcgaXMgdmFsaWQuDQotICogQHBhcmFtIF9fRE1BX18gVUFSVCBETUEgZW5hYmxpbmcgb3IgZGlzYWJsaW5nIG9uIGVycm9yIHNldHRpbmcuDQotICogQHJldHZhbCBTRVQgKF9fRE1BX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0RNQV9fIGlzIGludmFsaWQpDQotICovDQotI2RlZmluZSBJU19VQVJUX0FEVkZFQVRVUkVfRE1BT05SWEVSUk9SKF9fRE1BX18pICAgICAgICAgXA0KLSAgKCgoX19ETUFfXykgPT0gVUFSVF9BRFZGRUFUVVJFX0RNQV9FTkFCTEVPTlJYRVJST1IpIHx8IFwNCi0gICAoKF9fRE1BX18pID09IFVBUlRfQURWRkVBVFVSRV9ETUFfRElTQUJMRU9OUlhFUlJPUikpDQotDQotLyoqDQotICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgZnJhbWUgTVNCIGZpcnN0IHNldHRpbmcgaXMgdmFsaWQuDQotICogQHBhcmFtIF9fTVNCRklSU1RfXyBVQVJUIGZyYW1lIE1TQiBmaXJzdCBzZXR0aW5nLg0KLSAqIEByZXR2YWwgU0VUIChfX01TQkZJUlNUX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX01TQkZJUlNUX18gaXMgaW52YWxpZCkNCi0gKi8NCi0jZGVmaW5lIElTX1VBUlRfQURWRkVBVFVSRV9NU0JGSVJTVChfX01TQkZJUlNUX18pICAgICAgICAgIFwNCi0gICgoKF9fTVNCRklSU1RfXykgPT0gVUFSVF9BRFZGRUFUVVJFX01TQkZJUlNUX0RJU0FCTEUpIHx8IFwNCi0gICAoKF9fTVNCRklSU1RfXykgPT0gVUFSVF9BRFZGRUFUVVJFX01TQkZJUlNUX0VOQUJMRSkpDQotDQotLyoqDQotICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgc3RvcCBtb2RlIHN0YXRlIGlzIHZhbGlkLg0KLSAqIEBwYXJhbSBfX1NUT1BNT0RFX18gVUFSVCBzdG9wIG1vZGUgc3RhdGUuDQotICogQHJldHZhbCBTRVQgKF9fU1RPUE1PREVfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fU1RPUE1PREVfXyBpcyBpbnZhbGlkKQ0KLSAqLw0KLSNkZWZpbmUgSVNfVUFSVF9BRFZGRUFUVVJFX1NUT1BNT0RFKF9fU1RPUE1PREVfXykgICAgICAgICAgXA0KLSAgKCgoX19TVE9QTU9ERV9fKSA9PSBVQVJUX0FEVkZFQVRVUkVfU1RPUE1PREVfRElTQUJMRSkgfHwgXA0KLSAgICgoX19TVE9QTU9ERV9fKSA9PSBVQVJUX0FEVkZFQVRVUkVfU1RPUE1PREVfRU5BQkxFKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCBtdXRlIG1vZGUgc3RhdGUgaXMgdmFsaWQuDQotICogQHBhcmFtIF9fTVVURV9fIFVBUlQgbXV0ZSBtb2RlIHN0YXRlLg0KLSAqIEByZXR2YWwgU0VUIChfX01VVEVfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fTVVURV9fIGlzIGludmFsaWQpDQotICovDQotI2RlZmluZSBJU19VQVJUX01VVEVfTU9ERShfX01VVEVfXykgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoKF9fTVVURV9fKSA9PSBVQVJUX0FEVkZFQVRVUkVfTVVURU1PREVfRElTQUJMRSkgfHwgXA0KLSAgICgoX19NVVRFX18pID09IFVBUlRfQURWRkVBVFVSRV9NVVRFTU9ERV9FTkFCTEUpKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIHdha2UtdXAgc2VsZWN0aW9uIGlzIHZhbGlkLg0KLSAqIEBwYXJhbSBfX1dBS0VfXyBVQVJUIHdha2UtdXAgc2VsZWN0aW9uLg0KLSAqIEByZXR2YWwgU0VUIChfX1dBS0VfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fV0FLRV9fIGlzIGludmFsaWQpDQotICovDQotI2RlZmluZSBJU19VQVJUX1dBS0VVUF9TRUxFQ1RJT04oX19XQUtFX18pICAgIFwNCi0gICgoKF9fV0FLRV9fKSA9PSBVQVJUX1dBS0VVUF9PTl9BRERSRVNTKSB8fCAgXA0KLSAgICgoX19XQUtFX18pID09IFVBUlRfV0FLRVVQX09OX1NUQVJUQklUKSB8fCBcDQotICAgKChfX1dBS0VfXykgPT0gVUFSVF9XQUtFVVBfT05fUkVBRERBVEFfTk9ORU1QVFkpKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIGRyaXZlciBlbmFibGUgcG9sYXJpdHkgaXMgdmFsaWQuDQotICogQHBhcmFtIF9fUE9MQVJJVFlfXyBVQVJUIGRyaXZlciBlbmFibGUgcG9sYXJpdHkuDQotICogQHJldHZhbCBTRVQgKF9fUE9MQVJJVFlfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fUE9MQVJJVFlfXyBpcyBpbnZhbGlkKQ0KLSAqLw0KLSNkZWZpbmUgSVNfVUFSVF9ERV9QT0xBUklUWShfX1BPTEFSSVRZX18pICAgICAgIFwNCi0gICgoKF9fUE9MQVJJVFlfXykgPT0gVUFSVF9ERV9QT0xBUklUWV9ISUdIKSB8fCBcDQotICAgKChfX1BPTEFSSVRZX18pID09IFVBUlRfREVfUE9MQVJJVFlfTE9XKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCBQcmVzY2FsZXIgaXMgdmFsaWQuDQotICogQHBhcmFtIF9fQ0xPQ0tQUkVTQ0FMRVJfXyBVQVJUIFByZXNjYWxlciB2YWx1ZS4NCi0gKiBAcmV0dmFsIFNFVCAoX19DTE9DS1BSRVNDQUxFUl9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19DTE9DS1BSRVNDQUxFUl9fIGlzDQotICogaW52YWxpZCkNCi0gKi8NCi0jZGVmaW5lIElTX1VBUlRfUFJFU0NBTEVSKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgICAgICAgICBcDQotICAoKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFVBUlRfUFJFU0NBTEVSX0RJVjEpIHx8ICAgXA0KLSAgICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBVQVJUX1BSRVNDQUxFUl9ESVYyKSB8fCAgIFwNCi0gICAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gVUFSVF9QUkVTQ0FMRVJfRElWNCkgfHwgICBcDQotICAgKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFVBUlRfUFJFU0NBTEVSX0RJVjYpIHx8ICAgXA0KLSAgICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBVQVJUX1BSRVNDQUxFUl9ESVY4KSB8fCAgIFwNCi0gICAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gVUFSVF9QUkVTQ0FMRVJfRElWMTApIHx8ICBcDQotICAgKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFVBUlRfUFJFU0NBTEVSX0RJVjEyKSB8fCAgXA0KLSAgICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBVQVJUX1BSRVNDQUxFUl9ESVYxNikgfHwgIFwNCi0gICAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gVUFSVF9QUkVTQ0FMRVJfRElWMzIpIHx8ICBcDQotICAgKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFVBUlRfUFJFU0NBTEVSX0RJVjY0KSB8fCAgXA0KLSAgICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBVQVJUX1BSRVNDQUxFUl9ESVYxMjgpIHx8IFwNCi0gICAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gVUFSVF9QUkVTQ0FMRVJfRElWMjU2KSkNCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIEluY2x1ZGUgVUFSVCBIQUwgRXh0ZW5kZWQgbW9kdWxlICovDQotI2luY2x1ZGUgInN0bTMyZzR4eF9oYWxfdWFydF9leC5oIg0KLQ0KLS8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBhZGR0b2dyb3VwIFVBUlRfRXhwb3J0ZWRfRnVuY3Rpb25zIFVBUlQgRXhwb3J0ZWQgRnVuY3Rpb25zDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGFkZHRvZ3JvdXAgVUFSVF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZA0KLSAqIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucw0KLSAqIEB7DQotICovDQotDQotLyogSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9Jbml0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9IYWxmRHVwbGV4X0luaXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xJTl9Jbml0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEJyZWFrRGV0ZWN0TGVuZ3RoKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfTXVsdGlQcm9jZXNzb3JfSW5pdChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgQWRkcmVzcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBXYWtlVXBNZXRob2QpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0RlSW5pdChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsNCi12b2lkIEhBTF9VQVJUX01zcEluaXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7DQotdm9pZCBIQUxfVUFSVF9Nc3BEZUluaXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7DQotDQotLyogQ2FsbGJhY2tzIFJlZ2lzdGVyL1VuUmVnaXN0ZXIgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0jaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9SZWdpc3RlckNhbGxiYWNrKA0KLSAgICBVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCBIQUxfVUFSVF9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELA0KLSAgICBwVUFSVF9DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9VblJlZ2lzdGVyQ2FsbGJhY2soDQotICAgIFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIEhBTF9VQVJUX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpOw0KLQ0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX1JlZ2lzdGVyUnhFdmVudENhbGxiYWNrKA0KLSAgICBVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCBwVUFSVF9SeEV2ZW50Q2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjayk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfVW5SZWdpc3RlclJ4RXZlbnRDYWxsYmFjayhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsNCi0jZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBhZGR0b2dyb3VwIFVBUlRfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zDQotICogQHsNCi0gKi8NCi0NCi0vKiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX1RyYW5zbWl0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZW91dCk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfUmVjZWl2ZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCB1aW50OF90ICpwRGF0YSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX1RyYW5zbWl0X0lUKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX1JlY2VpdmVfSVQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwgdWludDhfdCAqcERhdGEsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBTaXplKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9UcmFuc21pdF9ETUEoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX1JlY2VpdmVfRE1BKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0RNQVBhdXNlKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0RNQVJlc3VtZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9ETUFTdG9wKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOw0KLS8qIFRyYW5zZmVyIEFib3J0IGZ1bmN0aW9ucyAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0Fib3J0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0Fib3J0VHJhbnNtaXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfQWJvcnRSZWNlaXZlKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0Fib3J0X0lUKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0Fib3J0VHJhbnNtaXRfSVQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfQWJvcnRSZWNlaXZlX0lUKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOw0KLQ0KLXZvaWQgSEFMX1VBUlRfSVJRSGFuZGxlcihVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsNCi12b2lkIEhBTF9VQVJUX1R4SGFsZkNwbHRDYWxsYmFjayhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsNCi12b2lkIEhBTF9VQVJUX1R4Q3BsdENhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOw0KLXZvaWQgSEFMX1VBUlRfUnhIYWxmQ3BsdENhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOw0KLXZvaWQgSEFMX1VBUlRfUnhDcGx0Q2FsbGJhY2soVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7DQotdm9pZCBIQUxfVUFSVF9FcnJvckNhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOw0KLXZvaWQgSEFMX1VBUlRfQWJvcnRDcGx0Q2FsbGJhY2soVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7DQotdm9pZCBIQUxfVUFSVF9BYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOw0KLXZvaWQgSEFMX1VBUlRfQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOw0KLQ0KLXZvaWQgSEFMX1VBUlRFeF9SeEV2ZW50Q2FsbGJhY2soVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwgdWludDE2X3QgU2l6ZSk7DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGFkZHRvZ3JvdXAgVUFSVF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMNCi0gKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotdm9pZCBIQUxfVUFSVF9SZWNlaXZlclRpbWVvdXRfQ29uZmlnKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVvdXRWYWx1ZSk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfRW5hYmxlUmVjZWl2ZXJUaW1lb3V0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0Rpc2FibGVSZWNlaXZlclRpbWVvdXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7DQotDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xJTl9TZW5kQnJlYWsoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX011bHRpUHJvY2Vzc29yX0VuYWJsZU11dGVNb2RlKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9NdWx0aVByb2Nlc3Nvcl9EaXNhYmxlTXV0ZU1vZGUoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7DQotdm9pZCBIQUxfTXVsdGlQcm9jZXNzb3JfRW50ZXJNdXRlTW9kZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfSGFsZkR1cGxleF9FbmFibGVUcmFuc21pdHRlcihVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfSGFsZkR1cGxleF9FbmFibGVSZWNlaXZlcihVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsNCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAYWRkdG9ncm91cCBVQVJUX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3INCi0gKiBmdW5jdGlvbnMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9ycyBmdW5jdGlvbnMNCi0gKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1IQUxfVUFSVF9TdGF0ZVR5cGVEZWYgSEFMX1VBUlRfR2V0U3RhdGUoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7DQotdWludDMyX3QgSEFMX1VBUlRfR2V0RXJyb3IoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIFByaXZhdGUgZnVuY3Rpb25zDQotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAYWRkdG9ncm91cCBVQVJUX1ByaXZhdGVfRnVuY3Rpb25zIFVBUlQgUHJpdmF0ZSBGdW5jdGlvbnMNCi0gKiBAew0KLSAqLw0KLSNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQ0KLXZvaWQgVUFSVF9Jbml0Q2FsbGJhY2tzVG9EZWZhdWx0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOw0KLSNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotSEFMX1N0YXR1c1R5cGVEZWYgVUFSVF9TZXRDb25maWcoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7DQotSEFMX1N0YXR1c1R5cGVEZWYgVUFSVF9DaGVja0lkbGVTdGF0ZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsNCi1IQUxfU3RhdHVzVHlwZURlZiBVQVJUX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRmxhZywgRmxhZ1N0YXR1cyBTdGF0dXMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpY2tzdGFydCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZW91dCk7DQotdm9pZCBVQVJUX0FkdkZlYXR1cmVDb25maWcoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7DQotSEFMX1N0YXR1c1R5cGVEZWYgVUFSVF9TdGFydF9SZWNlaXZlX0lUKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBVQVJUX1N0YXJ0X1JlY2VpdmVfRE1BKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiBQcml2YXRlIHZhcmlhYmxlcw0KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGRlZmdyb3VwIFVBUlRfUHJpdmF0ZV92YXJpYWJsZXMgVUFSVCBQcml2YXRlIHZhcmlhYmxlcw0KLSAqIEB7DQotICovDQotLyogUHJlc2NhbGVyIFRhYmxlIHVzZWQgaW4gQlJSIGNvbXB1dGF0aW9uIG1hY3Jvcy4NCi0gICBEZWNsYXJlZCBhcyBleHRlcm4gaGVyZSB0byBhbGxvdyB1c2Ugb2YgcHJpdmF0ZSBVQVJUIG1hY3Jvcywgb3V0c2lkZSBvZiBIQUwNCi0gICBVQVJUIGZ1bmN0aW9ucyAqLw0KLWV4dGVybiBjb25zdCB1aW50MTZfdCBVQVJUUHJlc2NUYWJsZVsxMl07DQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotI2lmZGVmIF9fY3BsdXNwbHVzDQotfQ0KLSNlbmRpZg0KLQ0KLSNlbmRpZiAvKiBTVE0zMkc0eHhfSEFMX1VBUlRfSCAqLw0KKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGZpbGUgICAgc3RtMzJnNHh4X2hhbF91YXJ0LmgKKyAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBVQVJUIEhBTCBtb2R1bGUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYXR0ZW50aW9uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0ZXJtcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlCisgKiBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb2Z0d2FyZSBjb21wb25lbnQuCisgKiBJZiBubyBMSUNFTlNFIGZpbGUgY29tZXMgd2l0aCB0aGlzIHNvZnR3YXJlLCBpdCBpcyBwcm92aWRlZCBBUy1JUy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJHNHh4X0hBTF9VQVJUX0gKKyNkZWZpbmUgU1RNMzJHNHh4X0hBTF9VQVJUX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzR4eF9oYWxfZGVmLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkc0eHhfSEFMX0RyaXZlcgorICogQHsKKyAqLworCisvKiogQGFkZHRvZ3JvdXAgVUFSVAorICogQHsKKyAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBVQVJUX0V4cG9ydGVkX1R5cGVzIFVBUlQgRXhwb3J0ZWQgVHlwZXMKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgVUFSVCBJbml0IFN0cnVjdHVyZSBkZWZpbml0aW9uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDMyX3QKKyAgICAgIEJhdWRSYXRlOyAvKiE8IFRoaXMgbWVtYmVyIGNvbmZpZ3VyZXMgdGhlIFVBUlQgY29tbXVuaWNhdGlvbiBiYXVkIHJhdGUuCisgICAgICAgICAgICAgICAgICAgICBUaGUgYmF1ZCByYXRlIHJlZ2lzdGVyIGlzIGNvbXB1dGVkIHVzaW5nIHRoZSBmb2xsb3dpbmcKKyAgICAgICAgICAgICAgICAgICBmb3JtdWxhOiBMUFVBUlQ6CisgICAgICAgICAgICAgICAgICAgICA9PT09PT09CisgICAgICAgICAgICAgICAgICAgICBCYXVkIFJhdGUgUmVnaXN0ZXIgPSAoKDI1NiAqIGxwdWFydF9rZXJfY2twcmVzKSAvCisgICAgICAgICAgICAgICAgICAgKChodWFydC0+SW5pdC5CYXVkUmF0ZSkpKSB3aGVyZSBscHVhcnRfa2VyX2NrX3ByZXMgaXMgdGhlCisgICAgICAgICAgICAgICAgICAgVUFSVCBpbnB1dCBjbG9jayBkaXZpZGVkIGJ5IGEgcHJlc2NhbGVyIFVBUlQ6CisgICAgICAgICAgICAgICAgICAgICA9PT09PQorICAgICAgICAgICAgICAgICAgICAgLSBJZiBvdmVyc2FtcGxpbmcgaXMgMTYgb3IgaW4gTElOIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBCYXVkIFJhdGUgUmVnaXN0ZXIgPSAoKHVhcnRfa2VyX2NrcHJlcykgLworICAgICAgICAgICAgICAgICAgICgoaHVhcnQtPkluaXQuQmF1ZFJhdGUpKSkKKyAgICAgICAgICAgICAgICAgICAgIC0gSWYgb3ZlcnNhbXBsaW5nIGlzIDgsCisgICAgICAgICAgICAgICAgICAgICAgICBCYXVkIFJhdGUgUmVnaXN0ZXJbMTU6NF0gPSAoKDIgKiB1YXJ0X2tlcl9ja3ByZXMpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICgoaHVhcnQtPkluaXQuQmF1ZFJhdGUpKSlbMTU6NF0KKyAgICAgICAgICAgICAgICAgICAgICAgIEJhdWQgUmF0ZSBSZWdpc3RlclszXSA9ICAwCisgICAgICAgICAgICAgICAgICAgICAgICBCYXVkIFJhdGUgUmVnaXN0ZXJbMjowXSA9ICAoKCgyICogdWFydF9rZXJfY2twcmVzKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAoKGh1YXJ0LT5Jbml0LkJhdWRSYXRlKSkpWzM6MF0pID4+IDEKKyAgICAgICAgICAgICAgICAgICAgIHdoZXJlIHVhcnRfa2VyX2NrX3ByZXMgaXMgdGhlIFVBUlQgaW5wdXQgY2xvY2sgZGl2aWRlZCBieSBhCisgICAgICAgICAgICAgICAgICAgcHJlc2NhbGVyICovCisKKyAgdWludDMyX3QgV29yZExlbmd0aDsgLyohPCBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBkYXRhIGJpdHMgdHJhbnNtaXR0ZWQgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZWQgaW4gYSBmcmFtZS4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBVQVJURXhfV29yZF9MZW5ndGguICovCisKKyAgdWludDMyX3QKKyAgICAgIFN0b3BCaXRzOyAvKiE8IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHN0b3AgYml0cyB0cmFuc21pdHRlZC4KKyAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVUFSVF9TdG9wX0JpdHMuICovCisKKyAgdWludDMyX3QgUGFyaXR5OyAvKiE8IFNwZWNpZmllcyB0aGUgcGFyaXR5IG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFVBUlRfUGFyaXR5CisgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBXaGVuIHBhcml0eSBpcyBlbmFibGVkLCB0aGUgY29tcHV0ZWQgcGFyaXR5IGlzCisgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0ZWQgYXQgdGhlIE1TQiBwb3NpdGlvbiBvZiB0aGUgdHJhbnNtaXR0ZWQgZGF0YSAoOXRoCisgICAgICAgICAgICAgICAgICAgICAgYml0IHdoZW4gdGhlIHdvcmQgbGVuZ3RoIGlzIHNldCB0byA5IGRhdGEgYml0czsgOHRoIGJpdAorICAgICAgICAgICAgICAgICAgICAgIHdoZW4gdGhlIHdvcmQgbGVuZ3RoIGlzIHNldCB0byA4IGRhdGEgYml0cykuICovCisKKyAgdWludDMyX3QKKyAgICAgIE1vZGU7IC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIFJlY2VpdmUgb3IgVHJhbnNtaXQgbW9kZSBpcyBlbmFibGVkIG9yCisgICAgICAgICAgICAgICBkaXNhYmxlZC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVQVJUX01vZGUuICovCisKKyAgdWludDMyX3QgSHdGbG93Q3RsOyAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBoYXJkd2FyZSBmbG93IGNvbnRyb2wgbW9kZSBpcworICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQgb3IgZGlzYWJsZWQuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBVQVJUX0hhcmR3YXJlX0Zsb3dfQ29udHJvbC4gKi8KKworICB1aW50MzJfdCBPdmVyU2FtcGxpbmc7IC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIE92ZXIgc2FtcGxpbmcgOCBpcyBlbmFibGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgZGlzYWJsZWQsIHRvIGFjaGlldmUgaGlnaGVyIHNwZWVkICh1cCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZfUENMSy84KS4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVBUlRfT3Zlcl9TYW1wbGluZy4gKi8KKworICB1aW50MzJfdCBPbmVCaXRTYW1wbGluZzsgLyohPCBTcGVjaWZpZXMgd2hldGhlciBhIHNpbmdsZSBzYW1wbGUgb3IgdGhyZWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMnIG1ham9yaXR5IHZvdGUgaXMgc2VsZWN0ZWQuIFNlbGVjdGluZyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmdsZSBzYW1wbGUgbWV0aG9kIGluY3JlYXNlcyB0aGUgcmVjZWl2ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvbGVyYW5jZSB0byBjbG9jayBkZXZpYXRpb25zLiBUaGlzIHBhcmFtZXRlciBjYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGEgdmFsdWUgb2YgQHJlZiBVQVJUX09uZUJpdF9TYW1wbGluZy4gKi8KKworICB1aW50MzJfdCBDbG9ja1ByZXNjYWxlcjsgLyohPCBTcGVjaWZpZXMgdGhlIHByZXNjYWxlciB2YWx1ZSB1c2VkIHRvIGRpdmlkZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVBUlQgY2xvY2sgc291cmNlLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgQHJlZiBVQVJUX0Nsb2NrUHJlc2NhbGVyLiAqLworCit9IFVBUlRfSW5pdFR5cGVEZWY7CisKKy8qKgorICogQGJyaWVmICBVQVJUIEFkdmFuY2VkIEZlYXR1cmVzIGluaXRpYWxpemF0aW9uIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDMyX3QKKyAgICAgIEFkdkZlYXR1cmVJbml0OyAvKiE8IFNwZWNpZmllcyB3aGljaCBhZHZhbmNlZCBVQVJUIGZlYXR1cmVzIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZWQuIFNldmVyYWwgQWR2YW5jZWQgRmVhdHVyZXMgbWF5IGJlCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZWQgYXQgdGhlIHNhbWUgdGltZSAuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhCisgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgVUFSVF9BZHZhbmNlZF9GZWF0dXJlc19Jbml0aWFsaXphdGlvbl9UeXBlLiAqLworCisgIHVpbnQzMl90IFR4UGluTGV2ZWxJbnZlcnQ7IC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIFRYIHBpbiBhY3RpdmUgbGV2ZWwgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52ZXJ0ZWQuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUFSVF9UeF9JbnYuICovCisKKyAgdWludDMyX3QgUnhQaW5MZXZlbEludmVydDsgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgUlggcGluIGFjdGl2ZSBsZXZlbCBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZlcnRlZC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQVJUX1J4X0ludi4gKi8KKworICB1aW50MzJfdCBEYXRhSW52ZXJ0OyAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIGRhdGEgYXJlIGludmVydGVkIChwb3NpdGl2ZS9kaXJlY3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbG9naWMgdnMgbmVnYXRpdmUvaW52ZXJ0ZWQgbG9naWMpLiBUaGlzIHBhcmFtZXRlciBjYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgYSB2YWx1ZSBvZiBAcmVmIFVBUlRfRGF0YV9JbnYuICovCisKKyAgdWludDMyX3QgU3dhcDsgLyohPCBTcGVjaWZpZXMgd2hldGhlciBUWCBhbmQgUlggcGlucyBhcmUgc3dhcHBlZC4KKyAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFVBUlRfUnhfVHhfU3dhcC4gKi8KKworICB1aW50MzJfdCBPdmVycnVuRGlzYWJsZTsgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgcmVjZXB0aW9uIG92ZXJydW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGVjdGlvbiBpcyBkaXNhYmxlZC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIG9mIEByZWYgVUFSVF9PdmVycnVuX0Rpc2FibGUuICovCisKKyAgdWludDMyX3QKKyAgICAgIERNQURpc2FibGVvblJ4RXJyb3I7IC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIERNQSBpcyBkaXNhYmxlZCBpbiBjYXNlIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlcHRpb24gZXJyb3IuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIFVBUlRfRE1BX0Rpc2FibGVfb25fUnhfRXJyb3IuICovCisKKyAgdWludDMyX3QgQXV0b0JhdWRSYXRlRW5hYmxlOyAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIGF1dG8gQmF1ZCByYXRlIGRldGVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGVuYWJsZWQuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBVQVJUX0F1dG9CYXVkUmF0ZV9FbmFibGUuICovCisKKyAgdWludDMyX3QgQXV0b0JhdWRSYXRlTW9kZTsgLyohPCBJZiBhdXRvIEJhdWQgcmF0ZSBkZXRlY3Rpb24gaXMgZW5hYmxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIGhvdyB0aGUgcmF0ZSBkZXRlY3Rpb24gaXMgY2FycmllZCBvdXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQVJUX0F1dG9CYXVkX1JhdGVfTW9kZS4gKi8KKworICB1aW50MzJfdAorICAgICAgTVNCRmlyc3Q7IC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgTVNCIGlzIHNlbnQgZmlyc3Qgb24gVUFSVCBsaW5lLgorICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVQVJUX01TQl9GaXJzdC4gKi8KK30gVUFSVF9BZHZGZWF0dXJlSW5pdFR5cGVEZWY7CisKKy8qKgorICogQGJyaWVmIEhBTCBVQVJUIFN0YXRlIGRlZmluaXRpb24KKyAqIEBub3RlICBIQUwgVUFSVCBTdGF0ZSB2YWx1ZSBpcyBhIGNvbWJpbmF0aW9uIG9mIDIgZGlmZmVyZW50IHN1YnN0YXRlczoKKyAqICAgICAgICBnU3RhdGUgYW5kIFJ4U3RhdGUgKHNlZSBAcmVmIFVBUlRfU3RhdGVfRGVmaW5pdGlvbikuCisgKiAgICAgICAgLSBnU3RhdGUgY29udGFpbnMgVUFSVCBzdGF0ZSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGdsb2JhbCBIYW5kbGUKKyAqIG1hbmFnZW1lbnQgYW5kIGFsc28gaW5mb3JtYXRpb24gcmVsYXRlZCB0byBUeCBvcGVyYXRpb25zLiBnU3RhdGUgdmFsdWUgY29kaW5nCisgKiBmb2xsb3cgYmVsb3cgZGVzY3JpYmVkIGJpdG1hcCA6IGI3LWI2ICBFcnJvciBpbmZvcm1hdGlvbiAwMCA6IE5vIEVycm9yIDAxIDoKKyAqIChOb3QgVXNlZCkgMTAgOiBUaW1lb3V0IDExIDogRXJyb3IgYjUgICAgIFBlcmlwaGVyYWwgaW5pdGlhbGl6YXRpb24gc3RhdHVzIDAKKyAqIDogUmVzZXQgKFBlcmlwaGVyYWwgbm90IGluaXRpYWxpemVkKSAxICA6IEluaXQgZG9uZSAoUGVyaXBoZXJhbCBpbml0aWFsaXplZC4KKyAqIEhBTCBVQVJUIEluaXQgZnVuY3Rpb24gYWxyZWFkeSBjYWxsZWQpIGI0LWIzICAobm90IHVzZWQpIHh4IDogU2hvdWxkIGJlIHNldAorICogdG8gMDAgYjIgICAgIEludHJpbnNpYyBwcm9jZXNzIHN0YXRlIDAgIDogUmVhZHkgMSAgOiBCdXN5IChQZXJpcGhlcmFsIGJ1c3kKKyAqIHdpdGggc29tZSBjb25maWd1cmF0aW9uIG9yIGludGVybmFsIG9wZXJhdGlvbnMpIGIxICAgICAobm90IHVzZWQpIHggIDogU2hvdWxkCisgKiBiZSBzZXQgdG8gMCBiMCAgICAgVHggc3RhdGUgMCAgOiBSZWFkeSAobm8gVHggb3BlcmF0aW9uIG9uZ29pbmcpIDEgIDogQnVzeQorICogKFR4IG9wZXJhdGlvbiBvbmdvaW5nKQorICogICAgICAgIC0gUnhTdGF0ZSBjb250YWlucyBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIFJ4IG9wZXJhdGlvbnMuCisgKiAgICAgICAgICBSeFN0YXRlIHZhbHVlIGNvZGluZyBmb2xsb3cgYmVsb3cgZGVzY3JpYmVkIGJpdG1hcCA6CisgKiAgICAgICAgICBiNy1iNiAgKG5vdCB1c2VkKQorICogICAgICAgICAgICAgeHggOiBTaG91bGQgYmUgc2V0IHRvIDAwCisgKiAgICAgICAgICBiNSAgICAgUGVyaXBoZXJhbCBpbml0aWFsaXphdGlvbiBzdGF0dXMKKyAqICAgICAgICAgICAgIDAgIDogUmVzZXQgKFBlcmlwaGVyYWwgbm90IGluaXRpYWxpemVkKQorICogICAgICAgICAgICAgMSAgOiBJbml0IGRvbmUgKFBlcmlwaGVyYWwgaW5pdGlhbGl6ZWQpCisgKiAgICAgICAgICBiNC1iMiAgKG5vdCB1c2VkKQorICogICAgICAgICAgICB4eHggOiBTaG91bGQgYmUgc2V0IHRvIDAwMAorICogICAgICAgICAgYjEgICAgIFJ4IHN0YXRlCisgKiAgICAgICAgICAgICAwICA6IFJlYWR5IChubyBSeCBvcGVyYXRpb24gb25nb2luZykKKyAqICAgICAgICAgICAgIDEgIDogQnVzeSAoUnggb3BlcmF0aW9uIG9uZ29pbmcpCisgKiAgICAgICAgICBiMCAgICAgKG5vdCB1c2VkKQorICogICAgICAgICAgICAgeCAgOiBTaG91bGQgYmUgc2V0IHRvIDAuCisgKi8KK3R5cGVkZWYgdWludDMyX3QgSEFMX1VBUlRfU3RhdGVUeXBlRGVmOworCisvKioKKyAqIEBicmllZiBVQVJUIGNsb2NrIHNvdXJjZXMgZGVmaW5pdGlvbgorICovCit0eXBlZGVmIGVudW0geworICBVQVJUX0NMT0NLU09VUkNFX1BDTEsxID0gMHgwMFUsICAgIC8qITwgUENMSzEgY2xvY2sgc291cmNlICAqLworICBVQVJUX0NMT0NLU09VUkNFX1BDTEsyID0gMHgwMVUsICAgIC8qITwgUENMSzIgY2xvY2sgc291cmNlICAqLworICBVQVJUX0NMT0NLU09VUkNFX0hTSSA9IDB4MDJVLCAgICAgIC8qITwgSFNJIGNsb2NrIHNvdXJjZSAgICAqLworICBVQVJUX0NMT0NLU09VUkNFX1NZU0NMSyA9IDB4MDRVLCAgIC8qITwgU1lTQ0xLIGNsb2NrIHNvdXJjZSAqLworICBVQVJUX0NMT0NLU09VUkNFX0xTRSA9IDB4MDhVLCAgICAgIC8qITwgTFNFIGNsb2NrIHNvdXJjZSAgICAgICAqLworICBVQVJUX0NMT0NLU09VUkNFX1VOREVGSU5FRCA9IDB4MTBVIC8qITwgVW5kZWZpbmVkIGNsb2NrIHNvdXJjZSAqLworfSBVQVJUX0Nsb2NrU291cmNlVHlwZURlZjsKKworLyoqCisgKiBAYnJpZWYgSEFMIFVBUlQgUmVjZXB0aW9uIHR5cGUgZGVmaW5pdGlvbgorICogQG5vdGUgIEhBTCBVQVJUIFJlY2VwdGlvbiB0eXBlIHZhbHVlIGFpbXMgdG8gaWRlbnRpZnkgd2hpY2ggdHlwZSBvZiBSZWNlcHRpb24KKyAqIGlzIG9uZ29pbmcuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVUFSVF9SZWNlcHRpb25fVHlwZV9WYWx1ZXMKKyAqIDogSEFMX1VBUlRfUkVDRVBUSU9OX1NUQU5EQVJEICAgICAgICAgPSAweDAwVSwgSEFMX1VBUlRfUkVDRVBUSU9OX1RPSURMRSA9CisgKiAweDAxVSwgSEFMX1VBUlRfUkVDRVBUSU9OX1RPUlRPICAgICAgICAgICAgPSAweDAyVSwKKyAqICAgICAgICAgICBIQUxfVUFSVF9SRUNFUFRJT05fVE9DSEFSTUFUQ0ggICAgICA9IDB4MDNVLAorICovCit0eXBlZGVmIHVpbnQzMl90IEhBTF9VQVJUX1J4VHlwZVR5cGVEZWY7CisKKy8qKgorICogQGJyaWVmIEhBTCBVQVJUIFJ4IEV2ZW50IHR5cGUgZGVmaW5pdGlvbgorICogQG5vdGUgIEhBTCBVQVJUIFJ4IEV2ZW50IHR5cGUgdmFsdWUgYWltcyB0byBpZGVudGlmeSB3aGljaCB0eXBlIG9mIEV2ZW50IGhhcworICogb2NjdXJyZWQgbGVhZGluZyB0byBjYWxsIG9mIHRoZSBSeEV2ZW50IGNhbGxiYWNrLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYQorICogdmFsdWUgb2YgQHJlZiBVQVJUX1J4RXZlbnRfVHlwZV9WYWx1ZXMgOiBIQUxfVUFSVF9SWEVWRU5UX1RDID0gMHgwMFUsCisgKiAgICAgICAgICAgSEFMX1VBUlRfUlhFVkVOVF9IVCAgICAgICAgICAgICAgICAgPSAweDAxVSwKKyAqICAgICAgICAgICBIQUxfVUFSVF9SWEVWRU5UX0lETEUgICAgICAgICAgICAgICA9IDB4MDJVLAorICovCit0eXBlZGVmIHVpbnQzMl90IEhBTF9VQVJUX1J4RXZlbnRUeXBlVHlwZURlZjsKKworLyoqCisgKiBAYnJpZWYgIFVBUlQgaGFuZGxlIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgKi8KK3R5cGVkZWYgc3RydWN0IF9fVUFSVF9IYW5kbGVUeXBlRGVmIHsKKyAgVVNBUlRfVHlwZURlZiAqSW5zdGFuY2U7IC8qITwgVUFSVCByZWdpc3RlcnMgYmFzZSBhZGRyZXNzICAgICAgICAqLworCisgIFVBUlRfSW5pdFR5cGVEZWYgSW5pdDsgLyohPCBVQVJUIGNvbW11bmljYXRpb24gcGFyYW1ldGVycyAgICAgICovCisKKyAgVUFSVF9BZHZGZWF0dXJlSW5pdFR5cGVEZWYKKyAgICAgIEFkdmFuY2VkSW5pdDsgLyohPCBVQVJUIEFkdmFuY2VkIEZlYXR1cmVzIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMgKi8KKworICBjb25zdCB1aW50OF90ICpwVHhCdWZmUHRyOyAvKiE8IFBvaW50ZXIgdG8gVUFSVCBUeCB0cmFuc2ZlciBCdWZmZXIgKi8KKworICB1aW50MTZfdCBUeFhmZXJTaXplOyAvKiE8IFVBUlQgVHggVHJhbnNmZXIgc2l6ZSAgICAgICAgICAgICAgKi8KKworICBfX0lPIHVpbnQxNl90IFR4WGZlckNvdW50OyAvKiE8IFVBUlQgVHggVHJhbnNmZXIgQ291bnRlciAgICAgICAgICAgKi8KKworICB1aW50OF90ICpwUnhCdWZmUHRyOyAvKiE8IFBvaW50ZXIgdG8gVUFSVCBSeCB0cmFuc2ZlciBCdWZmZXIgKi8KKworICB1aW50MTZfdCBSeFhmZXJTaXplOyAvKiE8IFVBUlQgUnggVHJhbnNmZXIgc2l6ZSAgICAgICAgICAgICAgKi8KKworICBfX0lPIHVpbnQxNl90IFJ4WGZlckNvdW50OyAvKiE8IFVBUlQgUnggVHJhbnNmZXIgQ291bnRlciAgICAgICAgICAgKi8KKworICB1aW50MTZfdCBNYXNrOyAvKiE8IFVBUlQgUnggUkRSIHJlZ2lzdGVyIG1hc2sgICAgICAgICAgKi8KKworICB1aW50MzJfdAorICAgICAgRmlmb01vZGU7IC8qITwgU3BlY2lmaWVzIGlmIHRoZSBGSUZPIG1vZGUgaXMgYmVpbmcgdXNlZC4KKyAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVUFSVEV4X0ZJRk9fbW9kZS4gKi8KKworICB1aW50MTZfdCBOYlJ4RGF0YVRvUHJvY2VzczsgLyohPCBOdW1iZXIgb2YgZGF0YSB0byBwcm9jZXNzIGR1cmluZyBSWCBJU1IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbiAqLworCisgIHVpbnQxNl90IE5iVHhEYXRhVG9Qcm9jZXNzOyAvKiE8IE51bWJlciBvZiBkYXRhIHRvIHByb2Nlc3MgZHVyaW5nIFRYIElTUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uICovCisKKyAgX19JTyBIQUxfVUFSVF9SeFR5cGVUeXBlRGVmIFJlY2VwdGlvblR5cGU7IC8qITwgVHlwZSBvZiBvbmdvaW5nIHJlY2VwdGlvbiAqLworCisgIF9fSU8gSEFMX1VBUlRfUnhFdmVudFR5cGVUeXBlRGVmIFJ4RXZlbnRUeXBlOyAvKiE8IFR5cGUgb2YgUnggRXZlbnQgKi8KKworICB2b2lkICgqUnhJU1IpKHN0cnVjdCBfX1VBUlRfSGFuZGxlVHlwZURlZgorICAgICAgICAgICAgICAgICAgICAqaHVhcnQpOyAvKiE8IEZ1bmN0aW9uIHBvaW50ZXIgb24gUnggSVJRIGhhbmRsZXIgKi8KKworICB2b2lkICgqVHhJU1IpKHN0cnVjdCBfX1VBUlRfSGFuZGxlVHlwZURlZgorICAgICAgICAgICAgICAgICAgICAqaHVhcnQpOyAvKiE8IEZ1bmN0aW9uIHBvaW50ZXIgb24gVHggSVJRIGhhbmRsZXIgKi8KKworICBETUFfSGFuZGxlVHlwZURlZiAqaGRtYXR4OyAvKiE8IFVBUlQgVHggRE1BIEhhbmRsZSBwYXJhbWV0ZXJzICAgICAgKi8KKworICBETUFfSGFuZGxlVHlwZURlZiAqaGRtYXJ4OyAvKiE8IFVBUlQgUnggRE1BIEhhbmRsZSBwYXJhbWV0ZXJzICAgICAgKi8KKworICBIQUxfTG9ja1R5cGVEZWYgTG9jazsgLyohPCBMb2NraW5nIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICovCisKKyAgX19JTyBIQUxfVUFSVF9TdGF0ZVR5cGVEZWYKKyAgICAgIGdTdGF0ZTsgLyohPCBVQVJUIHN0YXRlIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gZ2xvYmFsIEhhbmRsZSBtYW5hZ2VtZW50CisgICAgICAgICAgICAgICAgICAgYW5kIGFsc28gcmVsYXRlZCB0byBUeCBvcGVyYXRpb25zLiBUaGlzIHBhcmFtZXRlcgorICAgICAgICAgICAgICAgICAgIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSEFMX1VBUlRfU3RhdGVUeXBlRGVmICovCisKKyAgX19JTyBIQUxfVUFSVF9TdGF0ZVR5cGVEZWYKKyAgICAgIFJ4U3RhdGU7IC8qITwgVUFSVCBzdGF0ZSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIFJ4IG9wZXJhdGlvbnMuIFRoaXMKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSEFMX1VBUlRfU3RhdGVUeXBlRGVmICovCisKKyAgX19JTyB1aW50MzJfdCBFcnJvckNvZGU7IC8qITwgVUFSVCBFcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAqLworCisjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgdm9pZCAoKlR4SGFsZkNwbHRDYWxsYmFjaykoc3RydWN0IF9fVUFSVF9IYW5kbGVUeXBlRGVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaHVhcnQpOyAvKiE8IFVBUlQgVHggSGFsZiBDb21wbGV0ZSBDYWxsYmFjayAqLworICB2b2lkICgqVHhDcGx0Q2FsbGJhY2spKAorICAgICAgc3RydWN0IF9fVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7IC8qITwgVUFSVCBUeCBDb21wbGV0ZSBDYWxsYmFjayAqLworICB2b2lkICgqUnhIYWxmQ3BsdENhbGxiYWNrKShzdHJ1Y3QgX19VQVJUX0hhbmRsZVR5cGVEZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpodWFydCk7IC8qITwgVUFSVCBSeCBIYWxmIENvbXBsZXRlIENhbGxiYWNrICovCisgIHZvaWQgKCpSeENwbHRDYWxsYmFjaykoCisgICAgICBzdHJ1Y3QgX19VQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsgLyohPCBVQVJUIFJ4IENvbXBsZXRlIENhbGxiYWNrICovCisgIHZvaWQgKCpFcnJvckNhbGxiYWNrKSgKKyAgICAgIHN0cnVjdCBfX1VBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOyAvKiE8IFVBUlQgRXJyb3IgQ2FsbGJhY2sgKi8KKyAgdm9pZCAoKkFib3J0Q3BsdENhbGxiYWNrKSgKKyAgICAgIHN0cnVjdCBfX1VBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOyAvKiE8IFVBUlQgQWJvcnQgQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgdm9pZCAoKkFib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2spKAorICAgICAgc3RydWN0IF9fVUFSVF9IYW5kbGVUeXBlRGVmCisgICAgICAgICAgKmh1YXJ0KTsgLyohPCBVQVJUIEFib3J0IFRyYW5zbWl0IENvbXBsZXRlIENhbGxiYWNrICovCisgIHZvaWQgKCpBYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2spKAorICAgICAgc3RydWN0IF9fVUFSVF9IYW5kbGVUeXBlRGVmCisgICAgICAgICAgKmh1YXJ0KTsgLyohPCBVQVJUIEFib3J0IFJlY2VpdmUgQ29tcGxldGUgQ2FsbGJhY2sgICovCisgIHZvaWQgKCpXYWtldXBDYWxsYmFjaykoCisgICAgICBzdHJ1Y3QgX19VQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsgLyohPCBVQVJUIFdha2V1cCBDYWxsYmFjayAqLworICB2b2lkICgqUnhGaWZvRnVsbENhbGxiYWNrKSgKKyAgICAgIHN0cnVjdCBfX1VBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOyAvKiE8IFVBUlQgUnggRmlmbyBGdWxsIENhbGxiYWNrICovCisgIHZvaWQgKCpUeEZpZm9FbXB0eUNhbGxiYWNrKSgKKyAgICAgIHN0cnVjdCBfX1VBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOyAvKiE8IFVBUlQgVHggRmlmbyBFbXB0eSBDYWxsYmFjayAqLworICB2b2lkICgqUnhFdmVudENhbGxiYWNrKShzdHJ1Y3QgX19VQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBQb3MpOyAvKiE8IFVBUlQgUmVjZXB0aW9uIEV2ZW50IENhbGxiYWNrICovCisKKyAgdm9pZCAoKk1zcEluaXRDYWxsYmFjaykoCisgICAgICBzdHJ1Y3QgX19VQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsgLyohPCBVQVJUIE1zcCBJbml0IGNhbGxiYWNrICovCisgIHZvaWQgKCpNc3BEZUluaXRDYWxsYmFjaykoCisgICAgICBzdHJ1Y3QgX19VQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsgLyohPCBVQVJUIE1zcCBEZUluaXQgY2FsbGJhY2sgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKK30gVUFSVF9IYW5kbGVUeXBlRGVmOworCisjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKy8qKgorICogQGJyaWVmICBIQUwgVUFSVCBDYWxsYmFjayBJRCBlbnVtZXJhdGlvbiBkZWZpbml0aW9uCisgKi8KK3R5cGVkZWYgZW51bSB7CisgIEhBTF9VQVJUX1RYX0hBTEZDT01QTEVURV9DQl9JRCA9CisgICAgICAweDAwVSwgLyohPCBVQVJUIFR4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2sgSUQgICAgICAgICovCisgIEhBTF9VQVJUX1RYX0NPTVBMRVRFX0NCX0lEID0gMHgwMVUsIC8qITwgVUFSVCBUeCBDb21wbGV0ZSBDYWxsYmFjayBJRCAqLworICBIQUxfVUFSVF9SWF9IQUxGQ09NUExFVEVfQ0JfSUQgPQorICAgICAgMHgwMlUsIC8qITwgVUFSVCBSeCBIYWxmIENvbXBsZXRlIENhbGxiYWNrIElEICAgICAgICAqLworICBIQUxfVUFSVF9SWF9DT01QTEVURV9DQl9JRCA9IDB4MDNVLCAvKiE8IFVBUlQgUnggQ29tcGxldGUgQ2FsbGJhY2sgSUQgKi8KKyAgSEFMX1VBUlRfRVJST1JfQ0JfSUQgPSAweDA0VSwgLyohPCBVQVJUIEVycm9yIENhbGxiYWNrIElEICAgICAgICAgICAgICAgICAgICovCisgIEhBTF9VQVJUX0FCT1JUX0NPTVBMRVRFX0NCX0lEID0gMHgwNVUsIC8qITwgVUFSVCBBYm9ydCBDb21wbGV0ZSBDYWxsYmFjayBJRCAqLworICBIQUxfVUFSVF9BQk9SVF9UUkFOU01JVF9DT01QTEVURV9DQl9JRCA9CisgICAgICAweDA2VSwgLyohPCBVQVJUIEFib3J0IFRyYW5zbWl0IENvbXBsZXRlIENhbGxiYWNrIElEICovCisgIEhBTF9VQVJUX0FCT1JUX1JFQ0VJVkVfQ09NUExFVEVfQ0JfSUQgPQorICAgICAgMHgwN1UsIC8qITwgVUFSVCBBYm9ydCBSZWNlaXZlIENvbXBsZXRlIENhbGxiYWNrIElEICAqLworICBIQUxfVUFSVF9XQUtFVVBfQ0JfSUQgPSAweDA4VSwgICAgICAgIC8qITwgVUFSVCBXYWtldXAgQ2FsbGJhY2sgSUQgICAgICAgICovCisgIEhBTF9VQVJUX1JYX0ZJRk9fRlVMTF9DQl9JRCA9IDB4MDlVLCAgLyohPCBVQVJUIFJ4IEZpZm8gRnVsbCBDYWxsYmFjayBJRCAgKi8KKyAgSEFMX1VBUlRfVFhfRklGT19FTVBUWV9DQl9JRCA9IDB4MEFVLCAvKiE8IFVBUlQgVHggRmlmbyBFbXB0eSBDYWxsYmFjayBJRCAqLworCisgIEhBTF9VQVJUX01TUElOSVRfQ0JfSUQgPSAweDBCVSwgIC8qITwgVUFSVCBNc3BJbml0IGNhbGxiYWNrIElEICAqLworICBIQUxfVUFSVF9NU1BERUlOSVRfQ0JfSUQgPSAweDBDVSAvKiE8IFVBUlQgTXNwRGVJbml0IGNhbGxiYWNrIElEICovCisKK30gSEFMX1VBUlRfQ2FsbGJhY2tJRFR5cGVEZWY7CisKKy8qKgorICogQGJyaWVmICBIQUwgVUFSVCBDYWxsYmFjayBwb2ludGVyIGRlZmluaXRpb24KKyAqLwordHlwZWRlZiB2b2lkICgqcFVBUlRfQ2FsbGJhY2tUeXBlRGVmKSgKKyAgICBVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsgLyohPCBwb2ludGVyIHRvIGFuIFVBUlQgY2FsbGJhY2sgZnVuY3Rpb24gKi8KK3R5cGVkZWYgdm9pZCAoKnBVQVJUX1J4RXZlbnRDYWxsYmFja1R5cGVEZWYpKAorICAgIHN0cnVjdCBfX1VBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsCisgICAgdWludDE2X3QgUG9zKTsgLyohPCBwb2ludGVyIHRvIGEgVUFSVCBSeCBFdmVudCBzcGVjaWZpYyBjYWxsYmFjayBmdW5jdGlvbiAqLworCisjZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVUFSVF9FeHBvcnRlZF9Db25zdGFudHMgVUFSVCBFeHBvcnRlZCBDb25zdGFudHMKKyAqIEB7CisgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX1N0YXRlX0RlZmluaXRpb24gVUFSVCBTdGF0ZSBDb2RlIERlZmluaXRpb24KKyAqIEB7CisgKi8KKyNkZWZpbmUgSEFMX1VBUlRfU1RBVEVfUkVTRVQgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMDAwMDBVIC8qITwgUGVyaXBoZXJhbCBpcyBub3QgaW5pdGlhbGl6ZWQgXAorICAgICAgICAgICAgICAgICAgIFZhbHVlIGlzIGFsbG93ZWQgZm9yIGdTdGF0ZSBhbmQgUnhTdGF0ZSAqLworI2RlZmluZSBIQUxfVUFSVF9TVEFURV9SRUFEWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAweDAwMDAwMDIwVSAvKiE8IFBlcmlwaGVyYWwgSW5pdGlhbGl6ZWQgYW5kIHJlYWR5IGZvciB1c2UgXAorICAgICAgICAgICAgICAgICAgIFZhbHVlIGlzIGFsbG93ZWQgZm9yIGdTdGF0ZSBhbmQgUnhTdGF0ZSAqLworI2RlZmluZSBIQUxfVUFSVF9TVEFURV9CVVNZICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMDAwMjRVIC8qITwgYW4gaW50ZXJuYWwgcHJvY2VzcyBpcyBvbmdvaW5nIFwKKyAgICAgICAgICAgICAgICAgICBWYWx1ZSBpcyBhbGxvd2VkIGZvciBnU3RhdGUgb25seSAqLworI2RlZmluZSBIQUxfVUFSVF9TVEFURV9CVVNZX1RYICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMDAwMjFVIC8qITwgRGF0YSBUcmFuc21pc3Npb24gcHJvY2VzcyBpcyBvbmdvaW5nIFwKKyAgICAgICAgICAgICAgICAgICBWYWx1ZSBpcyBhbGxvd2VkIGZvciBnU3RhdGUgb25seSAqLworI2RlZmluZSBIQUxfVUFSVF9TVEFURV9CVVNZX1JYICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMDAwMjJVIC8qITwgRGF0YSBSZWNlcHRpb24gcHJvY2VzcyBpcyBvbmdvaW5nIFwKKyAgICAgICAgICAgICAgICAgICBWYWx1ZSBpcyBhbGxvd2VkIGZvciBSeFN0YXRlIG9ubHkgKi8KKyNkZWZpbmUgSEFMX1VBUlRfU1RBVEVfQlVTWV9UWF9SWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwMDAwMDAyM1UgLyohPCBEYXRhIFRyYW5zbWlzc2lvbiBhbmQgUmVjZXB0aW9uIHByb2Nlc3MgaXMgb25nb2luZyAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBOb3QgdG8gYmUgdXNlZCBmb3IgbmVpdGhlciBnU3RhdGUgbm9yIFJ4U3RhdGUuVmFsdWUgaXMgICAgIFwKKyAgICAgICAgICAgICAgICAgcmVzdWx0IG9mIGNvbWJpbmF0aW9uIChPcikgYmV0d2VlbiBnU3RhdGUgYW5kIFJ4U3RhdGUgdmFsdWVzIFwKKyAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9VQVJUX1NUQVRFX1RJTUVPVVQgICBcCisgIDB4MDAwMDAwQTBVIC8qITwgVGltZW91dCBzdGF0ZSBcCisgICAgICAgICAgICAgICAgICAgVmFsdWUgaXMgYWxsb3dlZCBmb3IgZ1N0YXRlIG9ubHkgKi8KKyNkZWZpbmUgSEFMX1VBUlRfU1RBVEVfRVJST1IgXAorICAweDAwMDAwMEUwVSAvKiE8IEVycm9yICAgICBcCisgICAgICAgICAgICAgICAgICAgVmFsdWUgaXMgYWxsb3dlZCBmb3IgZ1N0YXRlIG9ubHkgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfRXJyb3JfRGVmaW5pdGlvbiAgIFVBUlQgRXJyb3IgRGVmaW5pdGlvbgorICogQHsKKyAqLworI2RlZmluZSBIQUxfVUFSVF9FUlJPUl9OT05FICgweDAwMDAwMDAwVSkgLyohPCBObyBlcnJvciAgICAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfVUFSVF9FUlJPUl9QRSAoMHgwMDAwMDAwMVUpICAgLyohPCBQYXJpdHkgZXJyb3IgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfVUFSVF9FUlJPUl9ORSAoMHgwMDAwMDAwMlUpICAgLyohPCBOb2lzZSBlcnJvciAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfVUFSVF9FUlJPUl9GRSAoMHgwMDAwMDAwNFUpICAgLyohPCBGcmFtZSBlcnJvciAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfVUFSVF9FUlJPUl9PUkUgKDB4MDAwMDAwMDhVKSAgLyohPCBPdmVycnVuIGVycm9yICAgICAgICAgICAqLworI2RlZmluZSBIQUxfVUFSVF9FUlJPUl9ETUEgKDB4MDAwMDAwMTBVKSAgLyohPCBETUEgdHJhbnNmZXIgZXJyb3IgICAgICAqLworI2RlZmluZSBIQUxfVUFSVF9FUlJPUl9SVE8gKDB4MDAwMDAwMjBVKSAgLyohPCBSZWNlaXZlciBUaW1lb3V0IGVycm9yICAqLworCisjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyNkZWZpbmUgSEFMX1VBUlRfRVJST1JfSU5WQUxJRF9DQUxMQkFDSyBcCisgICgweDAwMDAwMDQwVSkgLyohPCBJbnZhbGlkIENhbGxiYWNrIGVycm9yICAqLworI2VuZGlmICAgICAgICAgIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfU3RvcF9CaXRzICAgVUFSVCBOdW1iZXIgb2YgU3RvcCBCaXRzCisgKiBAeworICovCisjZGVmaW5lIFVBUlRfU1RPUEJJVFNfMF81ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBVU0FSVF9DUjJfU1RPUF8wICAgICAgICAgICAgICAgICAgLyohPCBVQVJUIGZyYW1lIHdpdGggMC41IHN0b3AgYml0IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX1NUT1BCSVRTXzEgMHgwMDAwMDAwMFUgLyohPCBVQVJUIGZyYW1lIHdpdGggMSBzdG9wIGJpdCAgICAqLworI2RlZmluZSBVQVJUX1NUT1BCSVRTXzFfNSBcCisgIChVU0FSVF9DUjJfU1RPUF8wIHwgVVNBUlRfQ1IyX1NUT1BfMSkgIC8qITwgVUFSVCBmcmFtZSB3aXRoIDEuNSBzdG9wIGJpdHMgKi8KKyNkZWZpbmUgVUFSVF9TVE9QQklUU18yIFVTQVJUX0NSMl9TVE9QXzEgLyohPCBVQVJUIGZyYW1lIHdpdGggMiBzdG9wIGJpdHMgICAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9QYXJpdHkgIFVBUlQgUGFyaXR5CisgKiBAeworICovCisjZGVmaW5lIFVBUlRfUEFSSVRZX05PTkUgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgLyohPCBObyBwYXJpdHkgICAqLworI2RlZmluZSBVQVJUX1BBUklUWV9FVkVOIFVTQVJUX0NSMV9QQ0UgICAgICAgICAgICAgICAgIC8qITwgRXZlbiBwYXJpdHkgKi8KKyNkZWZpbmUgVUFSVF9QQVJJVFlfT0REIChVU0FSVF9DUjFfUENFIHwgVVNBUlRfQ1IxX1BTKSAvKiE8IE9kZCBwYXJpdHkgICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX0hhcmR3YXJlX0Zsb3dfQ29udHJvbCBVQVJUIEhhcmR3YXJlIEZsb3cgQ29udHJvbAorICogQHsKKyAqLworI2RlZmluZSBVQVJUX0hXQ09OVFJPTF9OT05FIDB4MDAwMDAwMDBVICAgLyohPCBObyBoYXJkd2FyZSBjb250cm9sICAgICAgICovCisjZGVmaW5lIFVBUlRfSFdDT05UUk9MX1JUUyBVU0FSVF9DUjNfUlRTRSAvKiE8IFJlcXVlc3QgVG8gU2VuZCAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9IV0NPTlRST0xfQ1RTIFVTQVJUX0NSM19DVFNFIC8qITwgQ2xlYXIgVG8gU2VuZCAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0hXQ09OVFJPTF9SVFNfQ1RTIFwKKyAgKFVTQVJUX0NSM19SVFNFIHwgVVNBUlRfQ1IzX0NUU0UpIC8qITwgUmVxdWVzdCBhbmQgQ2xlYXIgVG8gU2VuZCAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9Nb2RlIFVBUlQgVHJhbnNmZXIgTW9kZQorICogQHsKKyAqLworI2RlZmluZSBVQVJUX01PREVfUlggVVNBUlRfQ1IxX1JFICAgICAgICAgICAgICAgICAgICAgLyohPCBSWCBtb2RlICAgICAgICAqLworI2RlZmluZSBVQVJUX01PREVfVFggVVNBUlRfQ1IxX1RFICAgICAgICAgICAgICAgICAgICAgLyohPCBUWCBtb2RlICAgICAgICAqLworI2RlZmluZSBVQVJUX01PREVfVFhfUlggKFVTQVJUX0NSMV9URSB8IFVTQVJUX0NSMV9SRSkgLyohPCBSWCBhbmQgVFggbW9kZSAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9TdGF0ZSAgVUFSVCBTdGF0ZQorICogQHsKKyAqLworI2RlZmluZSBVQVJUX1NUQVRFX0RJU0FCTEUgMHgwMDAwMDAwMFUgLyohPCBVQVJUIGRpc2FibGVkICAqLworI2RlZmluZSBVQVJUX1NUQVRFX0VOQUJMRSBVU0FSVF9DUjFfVUUgLyohPCBVQVJUIGVuYWJsZWQgICAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9PdmVyX1NhbXBsaW5nIFVBUlQgT3ZlciBTYW1wbGluZworICogQHsKKyAqLworI2RlZmluZSBVQVJUX09WRVJTQU1QTElOR18xNiAweDAwMDAwMDAwVSAgICAvKiE8IE92ZXJzYW1wbGluZyBieSAxNiAqLworI2RlZmluZSBVQVJUX09WRVJTQU1QTElOR184IFVTQVJUX0NSMV9PVkVSOCAvKiE8IE92ZXJzYW1wbGluZyBieSA4ICAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9PbmVCaXRfU2FtcGxpbmcgVUFSVCBPbmUgQml0IFNhbXBsaW5nIE1ldGhvZAorICogQHsKKyAqLworI2RlZmluZSBVQVJUX09ORV9CSVRfU0FNUExFX0RJU0FCTEUgICAgICAgICBcCisgIDB4MDAwMDAwMDBVIC8qITwgT25lLWJpdCBzYW1wbGluZyBkaXNhYmxlIFwKKyAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfT05FX0JJVF9TQU1QTEVfRU5BQkxFIFwKKyAgVVNBUlRfQ1IzX09ORUJJVCAvKiE8IE9uZS1iaXQgc2FtcGxpbmcgZW5hYmxlICAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9DbG9ja1ByZXNjYWxlciAgVUFSVCBDbG9jayBQcmVzY2FsZXIKKyAqIEB7CisgKi8KKyNkZWZpbmUgVUFSVF9QUkVTQ0FMRVJfRElWMSAweDAwMDAwMDAwVSAgIC8qITwgZmNsa19wcmVzID0gZmNsayAgICAgKi8KKyNkZWZpbmUgVUFSVF9QUkVTQ0FMRVJfRElWMiAweDAwMDAwMDAxVSAgIC8qITwgZmNsa19wcmVzID0gZmNsay8yICAgKi8KKyNkZWZpbmUgVUFSVF9QUkVTQ0FMRVJfRElWNCAweDAwMDAwMDAyVSAgIC8qITwgZmNsa19wcmVzID0gZmNsay80ICAgKi8KKyNkZWZpbmUgVUFSVF9QUkVTQ0FMRVJfRElWNiAweDAwMDAwMDAzVSAgIC8qITwgZmNsa19wcmVzID0gZmNsay82ICAgKi8KKyNkZWZpbmUgVUFSVF9QUkVTQ0FMRVJfRElWOCAweDAwMDAwMDA0VSAgIC8qITwgZmNsa19wcmVzID0gZmNsay84ICAgKi8KKyNkZWZpbmUgVUFSVF9QUkVTQ0FMRVJfRElWMTAgMHgwMDAwMDAwNVUgIC8qITwgZmNsa19wcmVzID0gZmNsay8xMCAgKi8KKyNkZWZpbmUgVUFSVF9QUkVTQ0FMRVJfRElWMTIgMHgwMDAwMDAwNlUgIC8qITwgZmNsa19wcmVzID0gZmNsay8xMiAgKi8KKyNkZWZpbmUgVUFSVF9QUkVTQ0FMRVJfRElWMTYgMHgwMDAwMDAwN1UgIC8qITwgZmNsa19wcmVzID0gZmNsay8xNiAgKi8KKyNkZWZpbmUgVUFSVF9QUkVTQ0FMRVJfRElWMzIgMHgwMDAwMDAwOFUgIC8qITwgZmNsa19wcmVzID0gZmNsay8zMiAgKi8KKyNkZWZpbmUgVUFSVF9QUkVTQ0FMRVJfRElWNjQgMHgwMDAwMDAwOVUgIC8qITwgZmNsa19wcmVzID0gZmNsay82NCAgKi8KKyNkZWZpbmUgVUFSVF9QUkVTQ0FMRVJfRElWMTI4IDB4MDAwMDAwMEFVIC8qITwgZmNsa19wcmVzID0gZmNsay8xMjggKi8KKyNkZWZpbmUgVUFSVF9QUkVTQ0FMRVJfRElWMjU2IDB4MDAwMDAwMEJVIC8qITwgZmNsa19wcmVzID0gZmNsay8yNTYgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfQXV0b0JhdWRfUmF0ZV9Nb2RlICAgIFVBUlQgQWR2YW5jZWQgRmVhdHVyZSBBdXRvQmF1ZCBSYXRlCisgKiBNb2RlCisgKiBAeworICovCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9BVVRPQkFVRFJBVEVfT05TVEFSVEJJVCBcCisgIDB4MDAwMDAwMDBVIC8qITwgQXV0byBCYXVkIHJhdGUgZGV0ZWN0aW9uICAgICBcCisgICAgICAgICAgICAgICAgICAgb24gc3RhcnQgYml0ICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfQVVUT0JBVURSQVRFX09ORkFMTElOR0VER0UgIFwKKyAgVVNBUlRfQ1IyX0FCUk1PREVfMCAvKiE8IEF1dG8gQmF1ZCByYXRlIGRldGVjdGlvbiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiBmYWxsaW5nIGVkZ2UgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9BVVRPQkFVRFJBVEVfT04wWDdGRlJBTUUgICAgXAorICBVU0FSVF9DUjJfQUJSTU9ERV8xIC8qITwgQXV0byBCYXVkIHJhdGUgZGV0ZWN0aW9uIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIDB4N0YgZnJhbWUgZGV0ZWN0aW9uICAgKi8KKyNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX0FVVE9CQVVEUkFURV9PTjBYNTVGUkFNRSAgXAorICBVU0FSVF9DUjJfQUJSTU9ERSAvKiE8IEF1dG8gQmF1ZCByYXRlIGRldGVjdGlvbiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgb24gMHg1NSBmcmFtZSBkZXRlY3Rpb24gICAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9SZWNlaXZlcl9UaW1lb3V0IFVBUlQgUmVjZWl2ZXIgVGltZW91dAorICogQHsKKyAqLworI2RlZmluZSBVQVJUX1JFQ0VJVkVSX1RJTUVPVVRfRElTQUJMRSBcCisgIDB4MDAwMDAwMDBVIC8qITwgVUFSVCBSZWNlaXZlciBUaW1lb3V0IGRpc2FibGUgKi8KKyNkZWZpbmUgVUFSVF9SRUNFSVZFUl9USU1FT1VUX0VOQUJMRSBcCisgIFVTQVJUX0NSMl9SVE9FTiAvKiE8IFVBUlQgUmVjZWl2ZXIgVGltZW91dCBlbmFibGUgICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX0xJTiAgICBVQVJUIExvY2FsIEludGVyY29ubmVjdGlvbiBOZXR3b3JrIG1vZGUKKyAqIEB7CisgKi8KKyNkZWZpbmUgVUFSVF9MSU5fRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBMb2NhbCBJbnRlcmNvbm5lY3QgTmV0d29yayBkaXNhYmxlIFwKKyAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfTElOX0VOQUJMRSBcCisgIFVTQVJUX0NSMl9MSU5FTiAvKiE8IExvY2FsIEludGVyY29ubmVjdCBOZXR3b3JrIGVuYWJsZSAgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfTElOX0JyZWFrX0RldGVjdGlvbiAgVUFSVCBMSU4gQnJlYWsgRGV0ZWN0aW9uCisgKiBAeworICovCisjZGVmaW5lIFVBUlRfTElOQlJFQUtERVRFQ1RMRU5HVEhfMTBCIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBMSU4gMTAtYml0IGJyZWFrIGRldGVjdGlvbiBsZW5ndGggKi8KKyNkZWZpbmUgVUFSVF9MSU5CUkVBS0RFVEVDVExFTkdUSF8xMUIgXAorICBVU0FSVF9DUjJfTEJETCAvKiE8IExJTiAxMS1iaXQgYnJlYWsgZGV0ZWN0aW9uIGxlbmd0aCAgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfRE1BX1R4ICAgIFVBUlQgRE1BIFR4CisgKiBAeworICovCisjZGVmaW5lIFVBUlRfRE1BX1RYX0RJU0FCTEUgMHgwMDAwMDAwMFUgICAvKiE8IFVBUlQgRE1BIFRYIGRpc2FibGVkICovCisjZGVmaW5lIFVBUlRfRE1BX1RYX0VOQUJMRSBVU0FSVF9DUjNfRE1BVCAvKiE8IFVBUlQgRE1BIFRYIGVuYWJsZWQgICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX0RNQV9SeCAgIFVBUlQgRE1BIFJ4CisgKiBAeworICovCisjZGVmaW5lIFVBUlRfRE1BX1JYX0RJU0FCTEUgMHgwMDAwMDAwMFUgICAvKiE8IFVBUlQgRE1BIFJYIGRpc2FibGVkICovCisjZGVmaW5lIFVBUlRfRE1BX1JYX0VOQUJMRSBVU0FSVF9DUjNfRE1BUiAvKiE8IFVBUlQgRE1BIFJYIGVuYWJsZWQgICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX0hhbGZfRHVwbGV4X1NlbGVjdGlvbiAgVUFSVCBIYWxmIER1cGxleCBTZWxlY3Rpb24KKyAqIEB7CisgKi8KKyNkZWZpbmUgVUFSVF9IQUxGX0RVUExFWF9ESVNBQkxFIDB4MDAwMDAwMDBVIC8qITwgVUFSVCBoYWxmLWR1cGxleCBkaXNhYmxlZCAqLworI2RlZmluZSBVQVJUX0hBTEZfRFVQTEVYX0VOQUJMRSBcCisgIFVTQVJUX0NSM19IRFNFTCAvKiE8IFVBUlQgaGFsZi1kdXBsZXggZW5hYmxlZCAgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfV2FrZVVwX01ldGhvZHMgICBVQVJUIFdha2VVcCBNZXRob2RzCisgKiBAeworICovCisjZGVmaW5lIFVBUlRfV0FLRVVQTUVUSE9EX0lETEVMSU5FIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBVQVJUIHdha2UtdXAgb24gaWRsZSBsaW5lICAgICovCisjZGVmaW5lIFVBUlRfV0FLRVVQTUVUSE9EX0FERFJFU1NNQVJLIFwKKyAgVVNBUlRfQ1IxX1dBS0UgLyohPCBVQVJUIHdha2UtdXAgb24gYWRkcmVzcyBtYXJrICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX1JlcXVlc3RfUGFyYW1ldGVycyBVQVJUIFJlcXVlc3QgUGFyYW1ldGVycworICogQHsKKyAqLworI2RlZmluZSBVQVJUX0FVVE9CQVVEX1JFUVVFU1QgXAorICBVU0FSVF9SUVJfQUJSUlEgLyohPCBBdXRvLUJhdWQgUmF0ZSBSZXF1ZXN0ICAgICAgKi8KKyNkZWZpbmUgVUFSVF9TRU5EQlJFQUtfUkVRVUVTVCBcCisgIFVTQVJUX1JRUl9TQktSUSAvKiE8IFNlbmQgQnJlYWsgUmVxdWVzdCAgICAgICAgICAqLworI2RlZmluZSBVQVJUX01VVEVfTU9ERV9SRVFVRVNUIFwKKyAgVVNBUlRfUlFSX01NUlEgLyohPCBNdXRlIE1vZGUgUmVxdWVzdCAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9SWERBVEFfRkxVU0hfUkVRVUVTVCBcCisgIFVTQVJUX1JRUl9SWEZSUSAvKiE8IFJlY2VpdmUgRGF0YSBmbHVzaCBSZXF1ZXN0ICAqLworI2RlZmluZSBVQVJUX1RYREFUQV9GTFVTSF9SRVFVRVNUIFwKKyAgVVNBUlRfUlFSX1RYRlJRIC8qITwgVHJhbnNtaXQgZGF0YSBmbHVzaCBSZXF1ZXN0ICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX0FkdmFuY2VkX0ZlYXR1cmVzX0luaXRpYWxpemF0aW9uX1R5cGUgIFVBUlQgQWR2YW5jZWQgRmVhdHVyZQorICogSW5pdGlhbGl6YXRpb24gVHlwZQorICogQHsKKyAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfTk9fSU5JVCBcCisgIDB4MDAwMDAwMDBVIC8qITwgTm8gYWR2YW5jZWQgZmVhdHVyZSBpbml0aWFsaXphdGlvbiAgICAgICAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfVFhJTlZFUlRfSU5JVCBcCisgIDB4MDAwMDAwMDFVIC8qITwgVFggcGluIGFjdGl2ZSBsZXZlbCBpbnZlcnNpb24gICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfUlhJTlZFUlRfSU5JVCBcCisgIDB4MDAwMDAwMDJVIC8qITwgUlggcGluIGFjdGl2ZSBsZXZlbCBpbnZlcnNpb24gICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfREFUQUlOVkVSVF9JTklUIFwKKyAgMHgwMDAwMDAwNFUgLyohPCBCaW5hcnkgZGF0YSBpbnZlcnNpb24gICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9TV0FQX0lOSVQgXAorICAweDAwMDAwMDA4VSAvKiE8IFRYL1JYIHBpbnMgc3dhcCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX1JYT1ZFUlJVTkRJU0FCTEVfSU5JVCBcCisgIDB4MDAwMDAwMTBVIC8qITwgUlggb3ZlcnJ1biBkaXNhYmxlICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfRE1BRElTQUJMRU9ORVJST1JfSU5JVCBcCisgIDB4MDAwMDAwMjBVIC8qITwgRE1BIGRpc2FibGUgb24gUmVjZXB0aW9uIEVycm9yICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfQVVUT0JBVURSQVRFX0lOSVQgXAorICAweDAwMDAwMDQwVSAvKiE8IEF1dG8gQmF1ZCByYXRlIGRldGVjdGlvbiBpbml0aWFsaXphdGlvbiAgKi8KKyNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX01TQkZJUlNUX0lOSVQgXAorICAweDAwMDAwMDgwVSAvKiE8IE1vc3Qgc2lnbmlmaWNhbnQgYml0IHNlbnQvcmVjZWl2ZWQgZmlyc3QgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfVHhfSW52IFVBUlQgQWR2YW5jZWQgRmVhdHVyZSBUWCBQaW4gQWN0aXZlIExldmVsIEludmVyc2lvbgorICogQHsKKyAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfVFhJTlZfRElTQUJMRSBcCisgIDB4MDAwMDAwMDBVIC8qITwgVFggcGluIGFjdGl2ZSBsZXZlbCBpbnZlcnNpb24gZGlzYWJsZSAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfVFhJTlZfRU5BQkxFIFwKKyAgVVNBUlRfQ1IyX1RYSU5WIC8qITwgVFggcGluIGFjdGl2ZSBsZXZlbCBpbnZlcnNpb24gZW5hYmxlICAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9SeF9JbnYgVUFSVCBBZHZhbmNlZCBGZWF0dXJlIFJYIFBpbiBBY3RpdmUgTGV2ZWwgSW52ZXJzaW9uCisgKiBAeworICovCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9SWElOVl9ESVNBQkxFIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBSWCBwaW4gYWN0aXZlIGxldmVsIGludmVyc2lvbiBkaXNhYmxlICovCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9SWElOVl9FTkFCTEUgXAorICBVU0FSVF9DUjJfUlhJTlYgLyohPCBSWCBwaW4gYWN0aXZlIGxldmVsIGludmVyc2lvbiBlbmFibGUgICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX0RhdGFfSW52ICBVQVJUIEFkdmFuY2VkIEZlYXR1cmUgQmluYXJ5IERhdGEgSW52ZXJzaW9uCisgKiBAeworICovCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9EQVRBSU5WX0RJU0FCTEUgXAorICAweDAwMDAwMDAwVSAvKiE8IEJpbmFyeSBkYXRhIGludmVyc2lvbiBkaXNhYmxlICovCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9EQVRBSU5WX0VOQUJMRSBcCisgIFVTQVJUX0NSMl9EQVRBSU5WIC8qITwgQmluYXJ5IGRhdGEgaW52ZXJzaW9uIGVuYWJsZSAgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfUnhfVHhfU3dhcCBVQVJUIEFkdmFuY2VkIEZlYXR1cmUgUlggVFggUGlucyBTd2FwCisgKiBAeworICovCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9TV0FQX0RJU0FCTEUgICAgICAgXAorICAweDAwMDAwMDAwVSAvKiE8IFRYL1JYIHBpbnMgc3dhcCBkaXNhYmxlIFwKKyAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9TV0FQX0VOQUJMRSBcCisgIFVTQVJUX0NSMl9TV0FQIC8qITwgVFgvUlggcGlucyBzd2FwIGVuYWJsZSAgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfT3ZlcnJ1bl9EaXNhYmxlICBVQVJUIEFkdmFuY2VkIEZlYXR1cmUgT3ZlcnJ1biBEaXNhYmxlCisgKiBAeworICovCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9PVkVSUlVOX0VOQUJMRSAweDAwMDAwMDAwVSAvKiE8IFJYIG92ZXJydW4gZW5hYmxlICAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfT1ZFUlJVTl9ESVNBQkxFIFwKKyAgVVNBUlRfQ1IzX09WUkRJUyAvKiE8IFJYIG92ZXJydW4gZGlzYWJsZSAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9BdXRvQmF1ZFJhdGVfRW5hYmxlICBVQVJUIEFkdmFuY2VkIEZlYXR1cmUgQXV0byBCYXVkUmF0ZQorICogRW5hYmxlCisgKiBAeworICovCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9BVVRPQkFVRFJBVEVfRElTQUJMRSBcCisgIDB4MDAwMDAwMDBVIC8qITwgUlggQXV0byBCYXVkIHJhdGUgZGV0ZWN0aW9uIGVuYWJsZSAgKi8KKyNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX0FVVE9CQVVEUkFURV9FTkFCTEUgXAorICBVU0FSVF9DUjJfQUJSRU4gLyohPCBSWCBBdXRvIEJhdWQgcmF0ZSBkZXRlY3Rpb24gZGlzYWJsZSAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9ETUFfRGlzYWJsZV9vbl9SeF9FcnJvciAgIFVBUlQgQWR2YW5jZWQgRmVhdHVyZSBETUEgRGlzYWJsZQorICogT24gUnggRXJyb3IKKyAqIEB7CisgKi8KKyNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX0RNQV9FTkFCTEVPTlJYRVJST1IgXAorICAweDAwMDAwMDAwVSAvKiE8IERNQSBlbmFibGUgb24gUmVjZXB0aW9uIEVycm9yICAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfRE1BX0RJU0FCTEVPTlJYRVJST1IgXAorICBVU0FSVF9DUjNfRERSRSAvKiE8IERNQSBkaXNhYmxlIG9uIFJlY2VwdGlvbiBFcnJvciAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9NU0JfRmlyc3QgICBVQVJUIEFkdmFuY2VkIEZlYXR1cmUgTVNCIEZpcnN0CisgKiBAeworICovCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9NU0JGSVJTVF9ESVNBQkxFICAgICAgICAgICAgICBcCisgIDB4MDAwMDAwMDBVIC8qITwgTW9zdCBzaWduaWZpY2FudCBiaXQgc2VudC9yZWNlaXZlZCBcCisgICAgICAgICAgICAgICAgICAgZmlyc3QgZGlzYWJsZSAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfTVNCRklSU1RfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVVNBUlRfQ1IyX01TQkZJUlNUIC8qITwgTW9zdCBzaWduaWZpY2FudCBiaXQgc2VudC9yZWNlaXZlZCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0IGVuYWJsZSAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfU3RvcF9Nb2RlX0VuYWJsZSAgIFVBUlQgQWR2YW5jZWQgRmVhdHVyZSBTdG9wIE1vZGUgRW5hYmxlCisgKiBAeworICovCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9TVE9QTU9ERV9ESVNBQkxFIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBVQVJUIHN0b3AgbW9kZSBkaXNhYmxlICovCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9TVE9QTU9ERV9FTkFCTEUgXAorICBVU0FSVF9DUjFfVUVTTSAvKiE8IFVBUlQgc3RvcCBtb2RlIGVuYWJsZSAgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfTXV0ZV9Nb2RlICAgVUFSVCBBZHZhbmNlZCBGZWF0dXJlIE11dGUgTW9kZSBFbmFibGUKKyAqIEB7CisgKi8KKyNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX01VVEVNT0RFX0RJU0FCTEUgXAorICAweDAwMDAwMDAwVSAvKiE8IFVBUlQgbXV0ZSBtb2RlIGRpc2FibGUgKi8KKyNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX01VVEVNT0RFX0VOQUJMRSBcCisgIFVTQVJUX0NSMV9NTUUgLyohPCBVQVJUIG11dGUgbW9kZSBlbmFibGUgICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX0NSMl9BRERSRVNTX0xTQl9QT1MgICAgVUFSVCBBZGRyZXNzLW1hdGNoaW5nIExTQiBQb3NpdGlvbiBJbgorICogQ1IyIFJlZ2lzdGVyCisgKiBAeworICovCisjZGVmaW5lIFVBUlRfQ1IyX0FERFJFU1NfTFNCX1BPUyBcCisgIDI0VSAvKiE8IFVBUlQgYWRkcmVzcy1tYXRjaGluZyBMU0IgcG9zaXRpb24gaW4gQ1IyIHJlZ2lzdGVyICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX1dha2VVcF9mcm9tX1N0b3BfU2VsZWN0aW9uICAgVUFSVCBXYWtlVXAgRnJvbSBTdG9wIFNlbGVjdGlvbgorICogQHsKKyAqLworI2RlZmluZSBVQVJUX1dBS0VVUF9PTl9BRERSRVNTIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBVQVJUIHdha2UtdXAgb24gYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfV0FLRVVQX09OX1NUQVJUQklUIFwKKyAgVVNBUlRfQ1IzX1dVU18xIC8qITwgVUFSVCB3YWtlLXVwIG9uIHN0YXJ0IGJpdCAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX1dBS0VVUF9PTl9SRUFEREFUQV9OT05FTVBUWSAgICAgICAgICAgICAgICAgICBcCisgIFVTQVJUX0NSM19XVVMgLyohPCBVQVJUIHdha2UtdXAgb24gcmVjZWl2ZSBkYXRhIHJlZ2lzdGVyIFwKKyAgICAgICAgICAgICAgICAgICAgIG5vdCBlbXB0eSBvciBSWEZJRk8gaXMgbm90IGVtcHR5ICAgICAgICAgICAgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfRHJpdmVyRW5hYmxlX1BvbGFyaXR5ICAgICAgVUFSVCBEcml2ZXJFbmFibGUgUG9sYXJpdHkKKyAqIEB7CisgKi8KKyNkZWZpbmUgVUFSVF9ERV9QT0xBUklUWV9ISUdIIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBEcml2ZXIgZW5hYmxlIHNpZ25hbCBpcyBhY3RpdmUgaGlnaCAqLworI2RlZmluZSBVQVJUX0RFX1BPTEFSSVRZX0xPVyBcCisgIFVTQVJUX0NSM19ERVAgLyohPCBEcml2ZXIgZW5hYmxlIHNpZ25hbCBpcyBhY3RpdmUgbG93ICAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9DUjFfREVBVF9BRERSRVNTX0xTQl9QT1MgICAgVUFSVCBEcml2ZXIgRW5hYmxlIEFzc2VydGlvbiBUaW1lCisgKiBMU0IgUG9zaXRpb24gSW4gQ1IxIFJlZ2lzdGVyCisgKiBAeworICovCisjZGVmaW5lIFVBUlRfQ1IxX0RFQVRfQUREUkVTU19MU0JfUE9TICAgICAgICAgICAgXAorICAyMVUgLyohPCBVQVJUIERyaXZlciBFbmFibGUgYXNzZXJ0aW9uIHRpbWUgTFNCIFwKKyAgICAgICAgICAgcG9zaXRpb24gaW4gQ1IxIHJlZ2lzdGVyICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX0NSMV9ERURUX0FERFJFU1NfTFNCX1BPUyAgICBVQVJUIERyaXZlciBFbmFibGUgRGVBc3NlcnRpb24KKyAqIFRpbWUgTFNCIFBvc2l0aW9uIEluIENSMSBSZWdpc3RlcgorICogQHsKKyAqLworI2RlZmluZSBVQVJUX0NSMV9ERURUX0FERFJFU1NfTFNCX1BPUyAgICAgICAgICAgICAgIFwKKyAgMTZVIC8qITwgVUFSVCBEcml2ZXIgRW5hYmxlIGRlLWFzc2VydGlvbiB0aW1lIExTQiBcCisgICAgICAgICAgIHBvc2l0aW9uIGluIENSMSByZWdpc3RlciAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9JbnRlcnJ1cHRpb25fTWFzayAgICBVQVJUIEludGVycnVwdGlvbnMgRmxhZyBNYXNrCisgKiBAeworICovCisjZGVmaW5lIFVBUlRfSVRfTUFTSyAweDAwMUZVIC8qITwgVUFSVCBpbnRlcnJ1cHRpb25zIGZsYWdzIG1hc2sgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfVGltZU91dF9WYWx1ZSAgICBVQVJUIHBvbGxpbmctYmFzZWQgY29tbXVuaWNhdGlvbnMgdGltZS1vdXQKKyAqIHZhbHVlCisgKiBAeworICovCisjZGVmaW5lIEhBTF9VQVJUX1RJTUVPVVRfVkFMVUUgXAorICAweDFGRkZGRkZVIC8qITwgVUFSVCBwb2xsaW5nLWJhc2VkIGNvbW11bmljYXRpb25zIHRpbWUtb3V0IHZhbHVlICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX0ZsYWdzICAgICBVQVJUIFN0YXR1cyBGbGFncworICogICAgICAgIEVsZW1lbnRzIHZhbHVlcyBjb252ZW50aW9uOiAweFhYWFgKKyAqICAgICAgICAgICAtIDB4WFhYWCAgOiBGbGFnIG1hc2sgaW4gdGhlIElTUiByZWdpc3RlcgorICogQHsKKyAqLworI2RlZmluZSBVQVJUX0ZMQUdfVFhGVCBcCisgIFVTQVJUX0lTUl9UWEZUIC8qITwgVUFSVCBUWEZJRk8gdGhyZXNob2xkIGZsYWcgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9GTEFHX1JYRlQgXAorICBVU0FSVF9JU1JfUlhGVCAvKiE8IFVBUlQgUlhGSUZPIHRocmVzaG9sZCBmbGFnICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfRkxBR19SWEZGIFwKKyAgVVNBUlRfSVNSX1JYRkYgLyohPCBVQVJUIFJYRklGTyBGdWxsIGZsYWcgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0ZMQUdfVFhGRSBcCisgIFVTQVJUX0lTUl9UWEZFIC8qITwgVUFSVCBUWEZJRk8gRW1wdHkgZmxhZyAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9GTEFHX1JFQUNLIFwKKyAgVVNBUlRfSVNSX1JFQUNLIC8qITwgVUFSVCByZWNlaXZlIGVuYWJsZSBhY2tub3dsZWRnZSBmbGFnICAgICAgKi8KKyNkZWZpbmUgVUFSVF9GTEFHX1RFQUNLIFwKKyAgVVNBUlRfSVNSX1RFQUNLIC8qITwgVUFSVCB0cmFuc21pdCBlbmFibGUgYWNrbm93bGVkZ2UgZmxhZyAgICAgKi8KKyNkZWZpbmUgVUFSVF9GTEFHX1dVRiBcCisgIFVTQVJUX0lTUl9XVUYgLyohPCBVQVJUIHdha2UtdXAgZnJvbSBzdG9wIG1vZGUgZmxhZyAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0ZMQUdfUldVIFwKKyAgVVNBUlRfSVNSX1JXVSAvKiE8IFVBUlQgcmVjZWl2ZXIgd2FrZS11cCBmcm9tIG11dGUgbW9kZSBmbGFnICovCisjZGVmaW5lIFVBUlRfRkxBR19TQktGIFwKKyAgVVNBUlRfSVNSX1NCS0YgLyohPCBVQVJUIHNlbmQgYnJlYWsgZmxhZyAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0ZMQUdfQ01GIFwKKyAgVVNBUlRfSVNSX0NNRiAvKiE8IFVBUlQgY2hhcmFjdGVyIG1hdGNoIGZsYWcgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfRkxBR19CVVNZIFwKKyAgVVNBUlRfSVNSX0JVU1kgLyohPCBVQVJUIGJ1c3kgZmxhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0ZMQUdfQUJSRiBcCisgIFVTQVJUX0lTUl9BQlJGIC8qITwgVUFSVCBhdXRvIEJhdWQgcmF0ZSBmbGFnICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9GTEFHX0FCUkUgXAorICBVU0FSVF9JU1JfQUJSRSAvKiE8IFVBUlQgYXV0byBCYXVkIHJhdGUgZXJyb3IgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfRkxBR19SVE9GIFwKKyAgVVNBUlRfSVNSX1JUT0YgLyohPCBVQVJUIHJlY2VpdmVyIHRpbWVvdXQgZmxhZyAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0ZMQUdfQ1RTIFwKKyAgVVNBUlRfSVNSX0NUUyAvKiE8IFVBUlQgY2xlYXIgdG8gc2VuZCBmbGFnICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfRkxBR19DVFNJRiBcCisgIFVTQVJUX0lTUl9DVFNJRiAvKiE8IFVBUlQgY2xlYXIgdG8gc2VuZCBpbnRlcnJ1cHQgZmxhZyAgICAgICAgICovCisjZGVmaW5lIFVBUlRfRkxBR19MQkRGIFwKKyAgVVNBUlRfSVNSX0xCREYgLyohPCBVQVJUIExJTiBicmVhayBkZXRlY3Rpb24gZmxhZyAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0ZMQUdfVFhFIFwKKyAgVVNBUlRfSVNSX1RYRV9UWEZORiAvKiE8IFVBUlQgdHJhbnNtaXQgZGF0YSByZWdpc3RlciBlbXB0eSAgICAgICAgICovCisjZGVmaW5lIFVBUlRfRkxBR19UWEZORiBcCisgIFVTQVJUX0lTUl9UWEVfVFhGTkYgLyohPCBVQVJUIFRYRklGTyBub3QgZnVsbCAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0ZMQUdfVEMgXAorICBVU0FSVF9JU1JfVEMgLyohPCBVQVJUIHRyYW5zbWlzc2lvbiBjb21wbGV0ZSAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0ZMQUdfUlhORSBcCisgIFVTQVJUX0lTUl9SWE5FX1JYRk5FIC8qITwgVUFSVCByZWFkIGRhdGEgcmVnaXN0ZXIgbm90IGVtcHR5ICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9GTEFHX1JYRk5FIFwKKyAgVVNBUlRfSVNSX1JYTkVfUlhGTkUgLyohPCBVQVJUIFJYRklGTyBub3QgZW1wdHkgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0ZMQUdfSURMRSBcCisgIFVTQVJUX0lTUl9JRExFIC8qITwgVUFSVCBpZGxlIGZsYWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9GTEFHX09SRSBcCisgIFVTQVJUX0lTUl9PUkUgLyohPCBVQVJUIG92ZXJydW4gZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0ZMQUdfTkUgXAorICBVU0FSVF9JU1JfTkUgLyohPCBVQVJUIG5vaXNlIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0ZMQUdfRkUgXAorICBVU0FSVF9JU1JfRkUgLyohPCBVQVJUIGZyYW1lIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0ZMQUdfUEUgXAorICBVU0FSVF9JU1JfUEUgLyohPCBVQVJUIHBhcml0eSBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9JbnRlcnJ1cHRfZGVmaW5pdGlvbiAgIFVBUlQgSW50ZXJydXB0cyBEZWZpbml0aW9uCisgKiAgICAgICAgRWxlbWVudHMgdmFsdWVzIGNvbnZlbnRpb246IDAwMFpaWlpaMFhYWVlZWVliCisgKiAgICAgICAgICAgLSBZWVlZWSAgOiBJbnRlcnJ1cHQgc291cmNlIHBvc2l0aW9uIGluIHRoZSBYWCByZWdpc3RlciAoNWJpdHMpCisgKiAgICAgICAgICAgLSBYWCAgOiBJbnRlcnJ1cHQgc291cmNlIHJlZ2lzdGVyICgyYml0cykKKyAqICAgICAgICAgICAgICAgICAtIDAxOiBDUjEgcmVnaXN0ZXIKKyAqICAgICAgICAgICAgICAgICAtIDEwOiBDUjIgcmVnaXN0ZXIKKyAqICAgICAgICAgICAgICAgICAtIDExOiBDUjMgcmVnaXN0ZXIKKyAqICAgICAgICAgICAtIFpaWlpaICA6IEZsYWcgcG9zaXRpb24gaW4gdGhlIElTUiByZWdpc3Rlcig1Yml0cykKKyAqICAgICAgICBFbGVtZW50cyB2YWx1ZXMgY29udmVudGlvbjogMDAwMDAwMDAwWFhZWVlZWWIKKyAqICAgICAgICAgICAtIFlZWVlZICA6IEludGVycnVwdCBzb3VyY2UgcG9zaXRpb24gaW4gdGhlIFhYIHJlZ2lzdGVyICg1Yml0cykKKyAqICAgICAgICAgICAtIFhYICA6IEludGVycnVwdCBzb3VyY2UgcmVnaXN0ZXIgKDJiaXRzKQorICogICAgICAgICAgICAgICAgIC0gMDE6IENSMSByZWdpc3RlcgorICogICAgICAgICAgICAgICAgIC0gMTA6IENSMiByZWdpc3RlcgorICogICAgICAgICAgICAgICAgIC0gMTE6IENSMyByZWdpc3RlcgorICogICAgICAgIEVsZW1lbnRzIHZhbHVlcyBjb252ZW50aW9uOiAwMDAwWlpaWjAwMDAwMDAwYgorICogICAgICAgICAgIC0gWlpaWiAgOiBGbGFnIHBvc2l0aW9uIGluIHRoZSBJU1IgcmVnaXN0ZXIoNGJpdHMpCisgKiBAeworICovCisjZGVmaW5lIFVBUlRfSVRfUEUgXAorICAweDAwMjhVIC8qITwgVUFSVCBwYXJpdHkgZXJyb3IgaW50ZXJydXB0aW9uICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0lUX1RYRSBcCisgIDB4MDcyN1UgLyohPCBVQVJUIHRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgZW1wdHkgaW50ZXJydXB0aW9uICovCisjZGVmaW5lIFVBUlRfSVRfVFhGTkYgXAorICAweDA3MjdVIC8qITwgVUFSVCBUWCBGSUZPIG5vdCBmdWxsIGludGVycnVwdGlvbiAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0lUX1RDIFwKKyAgMHgwNjI2VSAvKiE8IFVBUlQgdHJhbnNtaXNzaW9uIGNvbXBsZXRlIGludGVycnVwdGlvbiAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9JVF9SWE5FIFwKKyAgMHgwNTI1VSAvKiE8IFVBUlQgcmVhZCBkYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBpbnRlcnJ1cHRpb24gKi8KKyNkZWZpbmUgVUFSVF9JVF9SWEZORSBcCisgIDB4MDUyNVUgLyohPCBVQVJUIFJYRklGTyBub3QgZW1wdHkgaW50ZXJydXB0aW9uICAgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfSVRfSURMRSBcCisgIDB4MDQyNFUgLyohPCBVQVJUIGlkbGUgaW50ZXJydXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfSVRfTEJEIFwKKyAgMHgwODQ2VSAvKiE8IFVBUlQgTElOIGJyZWFrIGRldGVjdGlvbiBpbnRlcnJ1cHRpb24gICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9JVF9DVFMgXAorICAweDA5NkFVIC8qITwgVUFSVCBDVFMgaW50ZXJydXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0lUX0NNIFwKKyAgMHgxMTJFVSAvKiE8IFVBUlQgY2hhcmFjdGVyIG1hdGNoIGludGVycnVwdGlvbiAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9JVF9XVUYgXAorICAweDE0NzZVIC8qITwgVUFSVCB3YWtlLXVwIGZyb20gc3RvcCBtb2RlIGludGVycnVwdGlvbiAgICAgICAqLworI2RlZmluZSBVQVJUX0lUX1JYRkYgXAorICAweDE4M0ZVIC8qITwgVUFSVCBSWEZJRk8gZnVsbCBpbnRlcnJ1cHRpb24gICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0lUX1RYRkUgXAorICAweDE3M0VVIC8qITwgVUFSVCBUWEZJRk8gZW1wdHkgaW50ZXJydXB0aW9uICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0lUX1JYRlQgXAorICAweDFBN0NVIC8qITwgVUFSVCBSWEZJRk8gdGhyZXNob2xkIHJlYWNoZWQgaW50ZXJydXB0aW9uICAgICAqLworI2RlZmluZSBVQVJUX0lUX1RYRlQgXAorICAweDFCNzdVIC8qITwgVUFSVCBUWEZJRk8gdGhyZXNob2xkIHJlYWNoZWQgaW50ZXJydXB0aW9uICAgICAqLworI2RlZmluZSBVQVJUX0lUX1JUTyBcCisgIDB4MEIzQVUgLyohPCBVQVJUIHJlY2VpdmVyIHRpbWVvdXQgaW50ZXJydXB0aW9uICAgICAgICAgICAgICovCisKKyNkZWZpbmUgVUFSVF9JVF9FUlIgXAorICAweDAwNjBVIC8qITwgVUFSVCBlcnJvciBpbnRlcnJ1cHRpb24gICAgICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIFVBUlRfSVRfT1JFIFwKKyAgMHgwMzAwVSAvKiE8IFVBUlQgb3ZlcnJ1biBlcnJvciBpbnRlcnJ1cHRpb24gICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9JVF9ORSBcCisgIDB4MDIwMFUgLyohPCBVQVJUIG5vaXNlIGVycm9yIGludGVycnVwdGlvbiAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfSVRfRkUgXAorICAweDAxMDBVIC8qITwgVUFSVCBmcmFtZSBlcnJvciBpbnRlcnJ1cHRpb24gICAgICAgICAgICAgICAgICAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9JVF9DTEVBUl9GbGFncyAgVUFSVCBJbnRlcnJ1cHRpb24gQ2xlYXIgRmxhZ3MKKyAqIEB7CisgKi8KKyNkZWZpbmUgVUFSVF9DTEVBUl9QRUYgVVNBUlRfSUNSX1BFQ0YgLyohPCBQYXJpdHkgRXJyb3IgQ2xlYXIgRmxhZyAqLworI2RlZmluZSBVQVJUX0NMRUFSX0ZFRiBVU0FSVF9JQ1JfRkVDRiAvKiE8IEZyYW1pbmcgRXJyb3IgQ2xlYXIgRmxhZyAqLworI2RlZmluZSBVQVJUX0NMRUFSX05FRiBVU0FSVF9JQ1JfTkVDRiAvKiE8IE5vaXNlIEVycm9yIGRldGVjdGVkIENsZWFyIEZsYWcgKi8KKyNkZWZpbmUgVUFSVF9DTEVBUl9PUkVGIFwKKyAgVVNBUlRfSUNSX09SRUNGIC8qITwgT3ZlcnJ1biBFcnJvciBDbGVhciBGbGFnICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfQ0xFQVJfSURMRUYgXAorICBVU0FSVF9JQ1JfSURMRUNGIC8qITwgSURMRSBsaW5lIGRldGVjdGVkIENsZWFyIEZsYWcgICAgICovCisjZGVmaW5lIFVBUlRfQ0xFQVJfVFhGRUNGIFwKKyAgVVNBUlRfSUNSX1RYRkVDRiAgICAgICAgICAgICAgICAgICAgLyohPCBUWEZJRk8gZW1wdHkgY2xlYXIgZmxhZyAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9DTEVBUl9UQ0YgVVNBUlRfSUNSX1RDQ0YgLyohPCBUcmFuc21pc3Npb24gQ29tcGxldGUgQ2xlYXIgRmxhZyAqLworI2RlZmluZSBVQVJUX0NMRUFSX0xCREYgXAorICBVU0FSVF9JQ1JfTEJEQ0YgLyohPCBMSU4gQnJlYWsgRGV0ZWN0aW9uIENsZWFyIEZsYWcgICAgKi8KKyNkZWZpbmUgVUFSVF9DTEVBUl9DVFNGIFwKKyAgVVNBUlRfSUNSX0NUU0NGICAgICAgICAgICAgICAgICAgICAgLyohPCBDVFMgSW50ZXJydXB0IENsZWFyIEZsYWcgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9DTEVBUl9DTUYgVVNBUlRfSUNSX0NNQ0YgLyohPCBDaGFyYWN0ZXIgTWF0Y2ggQ2xlYXIgRmxhZyAqLworI2RlZmluZSBVQVJUX0NMRUFSX1dVRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFVTQVJUX0lDUl9XVUNGIC8qITwgV2FrZSBVcCBmcm9tIHN0b3AgbW9kZSBDbGVhciBGbGFnIFwKKyAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfQ0xFQVJfUlRPRiBcCisgIFVTQVJUX0lDUl9SVE9DRiAvKiE8IFVBUlQgcmVjZWl2ZXIgdGltZW91dCBjbGVhciBmbGFnICAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9SZWNlcHRpb25fVHlwZV9WYWx1ZXMgIFVBUlQgUmVjZXB0aW9uIHR5cGUgdmFsdWVzCisgKiBAeworICovCisjZGVmaW5lIEhBTF9VQVJUX1JFQ0VQVElPTl9TVEFOREFSRCBcCisgICgweDAwMDAwMDAwVSkgLyohPCBTdGFuZGFyZCByZWNlcHRpb24gICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9VQVJUX1JFQ0VQVElPTl9UT0lETEUgXAorICAoMHgwMDAwMDAwMVUpIC8qITwgUmVjZXB0aW9uIHRpbGwgY29tcGxldGlvbiBvciBJRExFIGV2ZW50ICAqLworI2RlZmluZSBIQUxfVUFSVF9SRUNFUFRJT05fVE9SVE8gXAorICAoMHgwMDAwMDAwMlUpIC8qITwgUmVjZXB0aW9uIHRpbGwgY29tcGxldGlvbiBvciBSVE8gZXZlbnQgICAqLworI2RlZmluZSBIQUxfVUFSVF9SRUNFUFRJT05fVE9DSEFSTUFUQ0ggXAorICAoMHgwMDAwMDAwM1UpIC8qITwgUmVjZXB0aW9uIHRpbGwgY29tcGxldGlvbiBvciBDTSBldmVudCAgICAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9SeEV2ZW50X1R5cGVfVmFsdWVzICBVQVJUIFJ4RXZlbnQgdHlwZSB2YWx1ZXMKKyAqIEB7CisgKi8KKyNkZWZpbmUgSEFMX1VBUlRfUlhFVkVOVF9UQyBcCisgICgweDAwMDAwMDAwVSkgLyohPCBSeEV2ZW50IGxpbmtlZCB0byBUcmFuc2ZlciBDb21wbGV0ZSBldmVudCAqLworI2RlZmluZSBIQUxfVUFSVF9SWEVWRU5UX0hUIFwKKyAgKDB4MDAwMDAwMDFVKSAvKiE8IFJ4RXZlbnQgbGlua2VkIHRvIEhhbGYgVHJhbnNmZXIgZXZlbnQgICAgICovCisjZGVmaW5lIEhBTF9VQVJUX1JYRVZFTlRfSURMRSBcCisgICgweDAwMDAwMDAyVSkgLyohPCBSeEV2ZW50IGxpbmtlZCB0byBJRExFIGV2ZW50ICAgICAgICAgICAgICAqLworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisvKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBVQVJUX0V4cG9ydGVkX01hY3JvcyBVQVJUIEV4cG9ydGVkIE1hY3JvcworICogQHsKKyAqLworCisvKiogQGJyaWVmICBSZXNldCBVQVJUIGhhbmRsZSBzdGF0ZXMuCisgKiBAcGFyYW0gIF9fSEFORExFX18gVUFSVCBoYW5kbGUuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisjZGVmaW5lIF9fSEFMX1VBUlRfUkVTRVRfSEFORExFX1NUQVRFKF9fSEFORExFX18pIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChfX0hBTkRMRV9fKS0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVTRVQ7ICBcCisgICAgKF9fSEFORExFX18pLT5SeFN0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVTRVQ7IFwKKyAgICAoX19IQU5ETEVfXyktPk1zcEluaXRDYWxsYmFjayA9IE5VTEw7ICAgICAgICAgXAorICAgIChfX0hBTkRMRV9fKS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBOVUxMOyAgICAgICBcCisgIH0gd2hpbGUgKDBVKQorI2Vsc2UKKyNkZWZpbmUgX19IQUxfVUFSVF9SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKF9fSEFORExFX18pLT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRVNFVDsgIFwKKyAgICAoX19IQU5ETEVfXyktPlJ4U3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRVNFVDsgXAorICB9IHdoaWxlICgwVSkKKyNlbmRpZiAvKlVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqIEBicmllZiAgRmx1c2ggdGhlIFVBUlQgRGF0YSByZWdpc3RlcnMuCisgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4KKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX1VBUlRfRkxVU0hfRFJSRUdJU1RFUihfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgU0VUX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5SUVIsIFVBUlRfUlhEQVRBX0ZMVVNIX1JFUVVFU1QpOyBcCisgICAgU0VUX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5SUVIsIFVBUlRfVFhEQVRBX0ZMVVNIX1JFUVVFU1QpOyBcCisgIH0gd2hpbGUgKDBVKQorCisvKiogQGJyaWVmICBDbGVhciB0aGUgc3BlY2lmaWVkIFVBUlQgcGVuZGluZyBmbGFnLgorICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuCisgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4KKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0NMRUFSX1BFRiAgICAgIFBhcml0eSBFcnJvciBDbGVhciBGbGFnCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0NMRUFSX0ZFRiAgICAgIEZyYW1pbmcgRXJyb3IgQ2xlYXIgRmxhZworICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9ORUYgICAgICBOb2lzZSBkZXRlY3RlZCBDbGVhciBGbGFnCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0NMRUFSX09SRUYgICAgIE92ZXJydW4gRXJyb3IgQ2xlYXIgRmxhZworICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9JRExFRiAgICBJRExFIGxpbmUgZGV0ZWN0ZWQgQ2xlYXIgRmxhZworICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9UWEZFQ0YgICBUWEZJRk8gZW1wdHkgY2xlYXIgRmxhZworICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9UQ0YgICAgICBUcmFuc21pc3Npb24gQ29tcGxldGUgQ2xlYXIgRmxhZworICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9SVE9GICAgICBSZWNlaXZlciBUaW1lb3V0IGNsZWFyIGZsYWcKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQ0xFQVJfTEJERiAgICAgTElOIEJyZWFrIERldGVjdGlvbiBDbGVhciBGbGFnCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0NMRUFSX0NUU0YgICAgIENUUyBJbnRlcnJ1cHQgQ2xlYXIgRmxhZworICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9DTUYgICAgICBDaGFyYWN0ZXIgTWF0Y2ggQ2xlYXIgRmxhZworICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9XVUYgICAgICBXYWtlIFVwIGZyb20gc3RvcCBtb2RlIENsZWFyIEZsYWcKKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX1VBUlRfQ0xFQVJfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgXAorICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SUNSID0gKF9fRkxBR19fKSkKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIFVBUlQgUEUgcGVuZGluZyBmbGFnLgorICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9VQVJUX0NMRUFSX1BFRkxBRyhfX0hBTkRMRV9fKSBcCisgIF9fSEFMX1VBUlRfQ0xFQVJfRkxBRygoX19IQU5ETEVfXyksIFVBUlRfQ0xFQVJfUEVGKQorCisvKiogQGJyaWVmICBDbGVhciB0aGUgVUFSVCBGRSBwZW5kaW5nIGZsYWcuCisgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4KKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX1VBUlRfQ0xFQVJfRkVGTEFHKF9fSEFORExFX18pIFwKKyAgX19IQUxfVUFSVF9DTEVBUl9GTEFHKChfX0hBTkRMRV9fKSwgVUFSVF9DTEVBUl9GRUYpCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBVQVJUIE5FIHBlbmRpbmcgZmxhZy4KKyAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVBUlQgSGFuZGxlLgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfVUFSVF9DTEVBUl9ORUZMQUcoX19IQU5ETEVfXykgXAorICBfX0hBTF9VQVJUX0NMRUFSX0ZMQUcoKF9fSEFORExFX18pLCBVQVJUX0NMRUFSX05FRikKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIFVBUlQgT1JFIHBlbmRpbmcgZmxhZy4KKyAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVBUlQgSGFuZGxlLgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfVUFSVF9DTEVBUl9PUkVGTEFHKF9fSEFORExFX18pIFwKKyAgX19IQUxfVUFSVF9DTEVBUl9GTEFHKChfX0hBTkRMRV9fKSwgVUFSVF9DTEVBUl9PUkVGKQorCisvKiogQGJyaWVmICBDbGVhciB0aGUgVUFSVCBJRExFIHBlbmRpbmcgZmxhZy4KKyAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVBUlQgSGFuZGxlLgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfVUFSVF9DTEVBUl9JRExFRkxBRyhfX0hBTkRMRV9fKSBcCisgIF9fSEFMX1VBUlRfQ0xFQVJfRkxBRygoX19IQU5ETEVfXyksIFVBUlRfQ0xFQVJfSURMRUYpCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBVQVJUIFRYIEZJRk8gZW1wdHkgY2xlYXIgZmxhZy4KKyAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVBUlQgSGFuZGxlLgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfVUFSVF9DTEVBUl9UWEZFQ0YoX19IQU5ETEVfXykgXAorICBfX0hBTF9VQVJUX0NMRUFSX0ZMQUcoKF9fSEFORExFX18pLCBVQVJUX0NMRUFSX1RYRkVDRikKKworLyoqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIFVBUlQgZmxhZyBpcyBzZXQgb3Igbm90LgorICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuCisgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4KKyAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX1RYRlQgIFRYRklGTyB0aHJlc2hvbGQgZmxhZworICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX1JYRlQgIFJYRklGTyB0aHJlc2hvbGQgZmxhZworICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX1JYRkYgIFJYRklGTyBGdWxsIGZsYWcKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfRkxBR19UWEZFICBUWEZJRk8gRW1wdHkgZmxhZworICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX1JFQUNLIFJlY2VpdmUgZW5hYmxlIGFja25vd2xlZGdlIGZsYWcKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfRkxBR19URUFDSyBUcmFuc21pdCBlbmFibGUgYWNrbm93bGVkZ2UgZmxhZworICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX1dVRiAgIFdha2UgdXAgZnJvbSBzdG9wIG1vZGUgZmxhZworICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX1JXVSAgIFJlY2VpdmVyIHdha2UgdXAgZmxhZyAoaWYgdGhlIFVBUlQgaW4KKyAqIG11dGUgbW9kZSkKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfRkxBR19TQktGICBTZW5kIEJyZWFrIGZsYWcKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfRkxBR19DTUYgICBDaGFyYWN0ZXIgbWF0Y2ggZmxhZworICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX0JVU1kgIEJ1c3kgZmxhZworICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX0FCUkYgIEF1dG8gQmF1ZCByYXRlIGRldGVjdGlvbiBmbGFnCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0ZMQUdfQUJSRSAgQXV0byBCYXVkIHJhdGUgZGV0ZWN0aW9uIGVycm9yIGZsYWcKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfRkxBR19DVFMgICBDVFMgQ2hhbmdlIGZsYWcKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfRkxBR19MQkRGICBMSU4gQnJlYWsgZGV0ZWN0aW9uIGZsYWcKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfRkxBR19UWEUgICBUcmFuc21pdCBkYXRhIHJlZ2lzdGVyIGVtcHR5IGZsYWcKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfRkxBR19UWEZORiBVQVJUIFRYRklGTyBub3QgZnVsbCBmbGFnCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0ZMQUdfVEMgICAgVHJhbnNtaXNzaW9uIENvbXBsZXRlIGZsYWcKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfRkxBR19SWE5FICBSZWNlaXZlIGRhdGEgcmVnaXN0ZXIgbm90IGVtcHR5IGZsYWcKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfRkxBR19SWEZORSBVQVJUIFJYRklGTyBub3QgZW1wdHkgZmxhZworICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX1JUT0YgIFJlY2VpdmVyIFRpbWVvdXQgZmxhZworICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX0lETEUgIElkbGUgTGluZSBkZXRlY3Rpb24gZmxhZworICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX09SRSAgIE92ZXJydW4gRXJyb3IgZmxhZworICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX05FICAgIE5vaXNlIEVycm9yIGZsYWcKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfRkxBR19GRSAgICBGcmFtaW5nIEVycm9yIGZsYWcKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfRkxBR19QRSAgICBQYXJpdHkgRXJyb3IgZmxhZworICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fRkxBR19fIChUUlVFIG9yIEZBTFNFKS4KKyAqLworI2RlZmluZSBfX0hBTF9VQVJUX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSBcCisgICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVNSICYgKF9fRkxBR19fKSkgPT0gKF9fRkxBR19fKSkKKworLyoqIEBicmllZiAgRW5hYmxlIHRoZSBzcGVjaWZpZWQgVUFSVCBpbnRlcnJ1cHQuCisgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4KKyAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFVBUlQgaW50ZXJydXB0IHNvdXJjZSB0byBlbmFibGUuCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9SWEZGICBSWEZJRk8gRnVsbCBpbnRlcnJ1cHQKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfVFhGRSAgVFhGSUZPIEVtcHR5IGludGVycnVwdAorICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9SWEZUICBSWEZJRk8gdGhyZXNob2xkIGludGVycnVwdAorICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9UWEZUICBUWEZJRk8gdGhyZXNob2xkIGludGVycnVwdAorICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9XVUYgICBXYWtldXAgZnJvbSBzdG9wIG1vZGUgaW50ZXJydXB0CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX0NNICAgIENoYXJhY3RlciBtYXRjaCBpbnRlcnJ1cHQKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfQ1RTICAgQ1RTIGNoYW5nZSBpbnRlcnJ1cHQKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfTEJEICAgTElOIEJyZWFrIGRldGVjdGlvbiBpbnRlcnJ1cHQKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfVFhFICAgVHJhbnNtaXQgRGF0YSBSZWdpc3RlciBlbXB0eSBpbnRlcnJ1cHQKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfVFhGTkYgVFggRklGTyBub3QgZnVsbCBpbnRlcnJ1cHQKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfVEMgICAgVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGludGVycnVwdAorICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9SWE5FICBSZWNlaXZlIERhdGEgcmVnaXN0ZXIgbm90IGVtcHR5IGludGVycnVwdAorICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9SWEZORSBSWEZJRk8gbm90IGVtcHR5IGludGVycnVwdAorICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9SVE8gICBSZWNlaXZlIFRpbWVvdXQgaW50ZXJydXB0CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX0lETEUgIElkbGUgbGluZSBkZXRlY3Rpb24gaW50ZXJydXB0CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1BFICAgIFBhcml0eSBFcnJvciBpbnRlcnJ1cHQKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfRVJSICAgRXJyb3IgaW50ZXJydXB0IChmcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsCisgKiBvdmVycnVuIGVycm9yKQorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfVUFSVF9FTkFCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgXAorICAoKCgoKHVpbnQ4X3QpKF9fSU5URVJSVVBUX18pKSA+PiA1VSkgPT0gMVUpICAgICAgICAgICBcCisgICAgICAgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxIHw9ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoMVUgPDwgKChfX0lOVEVSUlVQVF9fKSAmIFVBUlRfSVRfTUFTSykpKSAgICAgXAorICAgOiAoKCgodWludDhfdCkoX19JTlRFUlJVUFRfXykpID4+IDVVKSA9PSAyVSkgICAgICAgICBcCisgICAgICAgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IyIHw9ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoMVUgPDwgKChfX0lOVEVSUlVQVF9fKSAmIFVBUlRfSVRfTUFTSykpKSAgICAgXAorICAgICAgIDogKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMyB8PSAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKDFVIDw8ICgoX19JTlRFUlJVUFRfXykgJiBVQVJUX0lUX01BU0spKSkpCisKKy8qKiBAYnJpZWYgIERpc2FibGUgdGhlIHNwZWNpZmllZCBVQVJUIGludGVycnVwdC4KKyAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVBUlQgSGFuZGxlLgorICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgVUFSVCBpbnRlcnJ1cHQgc291cmNlIHRvIGRpc2FibGUuCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9SWEZGICBSWEZJRk8gRnVsbCBpbnRlcnJ1cHQKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfVFhGRSAgVFhGSUZPIEVtcHR5IGludGVycnVwdAorICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9SWEZUICBSWEZJRk8gdGhyZXNob2xkIGludGVycnVwdAorICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9UWEZUICBUWEZJRk8gdGhyZXNob2xkIGludGVycnVwdAorICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9XVUYgICBXYWtldXAgZnJvbSBzdG9wIG1vZGUgaW50ZXJydXB0CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX0NNICAgIENoYXJhY3RlciBtYXRjaCBpbnRlcnJ1cHQKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfQ1RTICAgQ1RTIGNoYW5nZSBpbnRlcnJ1cHQKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfTEJEICAgTElOIEJyZWFrIGRldGVjdGlvbiBpbnRlcnJ1cHQKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfVFhFICAgVHJhbnNtaXQgRGF0YSBSZWdpc3RlciBlbXB0eSBpbnRlcnJ1cHQKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfVFhGTkYgVFggRklGTyBub3QgZnVsbCBpbnRlcnJ1cHQKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfVEMgICAgVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGludGVycnVwdAorICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9SWE5FICBSZWNlaXZlIERhdGEgcmVnaXN0ZXIgbm90IGVtcHR5IGludGVycnVwdAorICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9SWEZORSBSWEZJRk8gbm90IGVtcHR5IGludGVycnVwdAorICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9SVE8gICBSZWNlaXZlIFRpbWVvdXQgaW50ZXJydXB0CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX0lETEUgIElkbGUgbGluZSBkZXRlY3Rpb24gaW50ZXJydXB0CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1BFICAgIFBhcml0eSBFcnJvciBpbnRlcnJ1cHQKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfRVJSICAgRXJyb3IgaW50ZXJydXB0IChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsCisgKiBvdmVycnVuIGVycm9yKQorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfVUFSVF9ESVNBQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pIFwKKyAgKCgoKCh1aW50OF90KShfX0lOVEVSUlVQVF9fKSkgPj4gNVUpID09IDFVKSAgICAgICAgICAgIFwKKyAgICAgICA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgJj0gICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICB+KDFVIDw8ICgoX19JTlRFUlJVUFRfXykgJiBVQVJUX0lUX01BU0spKSkgICAgIFwKKyAgIDogKCgoKHVpbnQ4X3QpKF9fSU5URVJSVVBUX18pKSA+PiA1VSkgPT0gMlUpICAgICAgICAgIFwKKyAgICAgICA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjIgJj0gICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICB+KDFVIDw8ICgoX19JTlRFUlJVUFRfXykgJiBVQVJUX0lUX01BU0spKSkgICAgIFwKKyAgICAgICA6ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjMgJj0gICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICB+KDFVIDw8ICgoX19JTlRFUlJVUFRfXykgJiBVQVJUX0lUX01BU0spKSkpCisKKy8qKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBVQVJUIGludGVycnVwdCBoYXMgb2NjdXJyZWQgb3Igbm90LgorICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuCisgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBVQVJUIGludGVycnVwdCB0byBjaGVjay4KKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1JYRkYgIFJYRklGTyBGdWxsIGludGVycnVwdAorICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9UWEZFICBUWEZJRk8gRW1wdHkgaW50ZXJydXB0CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1JYRlQgIFJYRklGTyB0aHJlc2hvbGQgaW50ZXJydXB0CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1RYRlQgIFRYRklGTyB0aHJlc2hvbGQgaW50ZXJydXB0CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1dVRiAgIFdha2V1cCBmcm9tIHN0b3AgbW9kZSBpbnRlcnJ1cHQKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfQ00gICAgQ2hhcmFjdGVyIG1hdGNoIGludGVycnVwdAorICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9DVFMgICBDVFMgY2hhbmdlIGludGVycnVwdAorICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9MQkQgICBMSU4gQnJlYWsgZGV0ZWN0aW9uIGludGVycnVwdAorICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9UWEUgICBUcmFuc21pdCBEYXRhIFJlZ2lzdGVyIGVtcHR5IGludGVycnVwdAorICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9UWEZORiBUWCBGSUZPIG5vdCBmdWxsIGludGVycnVwdAorICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9UQyAgICBUcmFuc21pc3Npb24gY29tcGxldGUgaW50ZXJydXB0CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1JYTkUgIFJlY2VpdmUgRGF0YSByZWdpc3RlciBub3QgZW1wdHkgaW50ZXJydXB0CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1JYRk5FIFJYRklGTyBub3QgZW1wdHkgaW50ZXJydXB0CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1JUTyAgIFJlY2VpdmUgVGltZW91dCBpbnRlcnJ1cHQKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfSURMRSAgSWRsZSBsaW5lIGRldGVjdGlvbiBpbnRlcnJ1cHQKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfUEUgICAgUGFyaXR5IEVycm9yIGludGVycnVwdAorICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9FUlIgICBFcnJvciBpbnRlcnJ1cHQgKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwKKyAqIG92ZXJydW4gZXJyb3IpCisgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgX19JTlRFUlJVUFRfXyAoU0VUIG9yIFJFU0VUKS4KKyAqLworI2RlZmluZSBfX0hBTF9VQVJUX0dFVF9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IgJiAoMVUgPDwgKChfX0lOVEVSUlVQVF9fKSA+PiA4VSkpKSAhPSBSRVNFVCkgXAorICAgICAgID8gU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIDogUkVTRVQpCisKKy8qKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBVQVJUIGludGVycnVwdCBzb3VyY2UgaXMgZW5hYmxlZCBvciBub3QuCisgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4KKyAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFVBUlQgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjay4KKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1JYRkYgIFJYRklGTyBGdWxsIGludGVycnVwdAorICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9UWEZFICBUWEZJRk8gRW1wdHkgaW50ZXJydXB0CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1JYRlQgIFJYRklGTyB0aHJlc2hvbGQgaW50ZXJydXB0CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1RYRlQgIFRYRklGTyB0aHJlc2hvbGQgaW50ZXJydXB0CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1dVRiAgIFdha2V1cCBmcm9tIHN0b3AgbW9kZSBpbnRlcnJ1cHQKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfQ00gICAgQ2hhcmFjdGVyIG1hdGNoIGludGVycnVwdAorICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9DVFMgICBDVFMgY2hhbmdlIGludGVycnVwdAorICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9MQkQgICBMSU4gQnJlYWsgZGV0ZWN0aW9uIGludGVycnVwdAorICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9UWEUgICBUcmFuc21pdCBEYXRhIFJlZ2lzdGVyIGVtcHR5IGludGVycnVwdAorICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9UWEZORiBUWCBGSUZPIG5vdCBmdWxsIGludGVycnVwdAorICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9UQyAgICBUcmFuc21pc3Npb24gY29tcGxldGUgaW50ZXJydXB0CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1JYTkUgIFJlY2VpdmUgRGF0YSByZWdpc3RlciBub3QgZW1wdHkgaW50ZXJydXB0CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1JYRk5FIFJYRklGTyBub3QgZW1wdHkgaW50ZXJydXB0CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1JUTyAgIFJlY2VpdmUgVGltZW91dCBpbnRlcnJ1cHQKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfSURMRSAgSWRsZSBsaW5lIGRldGVjdGlvbiBpbnRlcnJ1cHQKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfUEUgICAgUGFyaXR5IEVycm9yIGludGVycnVwdAorICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9FUlIgICBFcnJvciBpbnRlcnJ1cHQgKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwKKyAqIG92ZXJydW4gZXJyb3IpCisgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgX19JTlRFUlJVUFRfXyAoU0VUIG9yIFJFU0VUKS4KKyAqLworI2RlZmluZSBfX0hBTF9VQVJUX0dFVF9JVF9TT1VSQ0UoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAgICAgICAgXAorICAoKCgoKCgoKHVpbnQ4X3QpKF9fSU5URVJSVVBUX18pKSA+PiA1VSkgPT0gMVUpICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgID8gKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIDogKCgoKCh1aW50OF90KShfX0lOVEVSUlVQVF9fKSkgPj4gNVUpID09IDJVKSAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICA/IChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMiAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICA6IChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMykpICYgICAgICAgICAgICAgICAgICAgXAorICAgICAoMVUgPDwgKCgodWludDE2X3QpKF9fSU5URVJSVVBUX18pKSAmIFVBUlRfSVRfTUFTSykpKSAhPSBSRVNFVCkgXAorICAgICAgID8gU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIDogUkVTRVQpCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBzcGVjaWZpZWQgVUFSVCBJU1IgZmxhZywgaW4gc2V0dGluZyB0aGUgcHJvcGVyIElDUgorICogcmVnaXN0ZXIgZmxhZy4KKyAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVBUlQgSGFuZGxlLgorICogQHBhcmFtICBfX0lUX0NMRUFSX18gc3BlY2lmaWVzIHRoZSBpbnRlcnJ1cHQgY2xlYXIgcmVnaXN0ZXIgZmxhZyB0aGF0IG5lZWRzCisgKiB0byBiZSBzZXQgdG8gY2xlYXIgdGhlIGNvcnJlc3BvbmRpbmcgaW50ZXJydXB0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YKKyAqIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9QRUYgICAgUGFyaXR5IEVycm9yIENsZWFyIEZsYWcKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQ0xFQVJfRkVGICAgIEZyYW1pbmcgRXJyb3IgQ2xlYXIgRmxhZworICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9ORUYgICAgTm9pc2UgZGV0ZWN0ZWQgQ2xlYXIgRmxhZworICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9PUkVGICAgT3ZlcnJ1biBFcnJvciBDbGVhciBGbGFnCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0NMRUFSX0lETEVGICBJRExFIGxpbmUgZGV0ZWN0ZWQgQ2xlYXIgRmxhZworICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9SVE9GICAgUmVjZWl2ZXIgdGltZW91dCBjbGVhciBmbGFnCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0NMRUFSX1RYRkVDRiBUWEZJRk8gZW1wdHkgQ2xlYXIgRmxhZworICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9UQ0YgICAgVHJhbnNtaXNzaW9uIENvbXBsZXRlIENsZWFyIEZsYWcKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQ0xFQVJfTEJERiAgIExJTiBCcmVhayBEZXRlY3Rpb24gQ2xlYXIgRmxhZworICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9DVFNGICAgQ1RTIEludGVycnVwdCBDbGVhciBGbGFnCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0NMRUFSX0NNRiAgICBDaGFyYWN0ZXIgTWF0Y2ggQ2xlYXIgRmxhZworICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9XVUYgICAgV2FrZSBVcCBmcm9tIHN0b3AgbW9kZSBDbGVhciBGbGFnCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9VQVJUX0NMRUFSX0lUKF9fSEFORExFX18sIF9fSVRfQ0xFQVJfXykgXAorICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SUNSID0gKHVpbnQzMl90KShfX0lUX0NMRUFSX18pKQorCisvKiogQGJyaWVmICBTZXQgYSBzcGVjaWZpYyBVQVJUIHJlcXVlc3QgZmxhZy4KKyAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVBUlQgSGFuZGxlLgorICogQHBhcmFtICBfX1JFUV9fIHNwZWNpZmllcyB0aGUgcmVxdWVzdCBmbGFnIHRvIHNldAorICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQVVUT0JBVURfUkVRVUVTVCBBdXRvLUJhdWQgUmF0ZSBSZXF1ZXN0CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX1NFTkRCUkVBS19SRVFVRVNUIFNlbmQgQnJlYWsgUmVxdWVzdAorICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9NVVRFX01PREVfUkVRVUVTVCBNdXRlIE1vZGUgUmVxdWVzdAorICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9SWERBVEFfRkxVU0hfUkVRVUVTVCBSZWNlaXZlIERhdGEgZmx1c2ggUmVxdWVzdAorICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9UWERBVEFfRkxVU0hfUkVRVUVTVCBUcmFuc21pdCBkYXRhIGZsdXNoIFJlcXVlc3QKKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX1VBUlRfU0VORF9SRVEoX19IQU5ETEVfXywgX19SRVFfXykgXAorICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+UlFSIHw9ICh1aW50MTZfdCkoX19SRVFfXykpCisKKy8qKiBAYnJpZWYgIEVuYWJsZSB0aGUgVUFSVCBvbmUgYml0IHNhbXBsZSBtZXRob2QuCisgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4KKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX1VBUlRfT05FX0JJVF9TQU1QTEVfRU5BQkxFKF9fSEFORExFX18pIFwKKyAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMyB8PSBVU0FSVF9DUjNfT05FQklUKQorCisvKiogQGJyaWVmICBEaXNhYmxlIHRoZSBVQVJUIG9uZSBiaXQgc2FtcGxlIG1ldGhvZC4KKyAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVBUlQgSGFuZGxlLgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfVUFSVF9PTkVfQklUX1NBTVBMRV9ESVNBQkxFKF9fSEFORExFX18pIFwKKyAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMyAmPSB+VVNBUlRfQ1IzX09ORUJJVCkKKworLyoqIEBicmllZiAgRW5hYmxlIFVBUlQuCisgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4KKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX1VBUlRfRU5BQkxFKF9fSEFORExFX18pIFwKKyAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSB8PSBVU0FSVF9DUjFfVUUpCisKKy8qKiBAYnJpZWYgIERpc2FibGUgVUFSVC4KKyAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVBUlQgSGFuZGxlLgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfVUFSVF9ESVNBQkxFKF9fSEFORExFX18pIFwKKyAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSAmPSB+VVNBUlRfQ1IxX1VFKQorCisvKiogQGJyaWVmICBFbmFibGUgQ1RTIGZsb3cgY29udHJvbC4KKyAqIEBub3RlICAgVGhpcyBtYWNybyBhbGxvd3MgdG8gZW5hYmxlIENUUyBoYXJkd2FyZSBmbG93IGNvbnRyb2wgZm9yIGEgZ2l2ZW4KKyAqIFVBUlQgaW5zdGFuY2UsIHdpdGhvdXQgbmVlZCB0byBjYWxsIEhBTF9VQVJUX0luaXQoKSBmdW5jdGlvbi4gQXMgaW52b2x2aW5nCisgKiBkaXJlY3QgYWNjZXNzIHRvIFVBUlQgcmVnaXN0ZXJzLCB1c2FnZSBvZiB0aGlzIG1hY3JvIHNob3VsZCBiZSBmdWxseSBlbmRvcnNlZAorICogYnkgdXNlci4KKyAqIEBub3RlICAgQXMgbWFjcm8gaXMgZXhwZWN0ZWQgdG8gYmUgdXNlZCBmb3IgbW9kaWZ5aW5nIENUUyBIdyBmbG93IGNvbnRyb2wKKyAqIGZlYXR1cmUgYWN0aXZhdGlvbiwgd2l0aG91dCBuZWVkIGZvciBVU0FSVCBpbnN0YW5jZSBEZWluaXQvSW5pdCwgZm9sbG93aW5nCisgKiBjb25kaXRpb25zIGZvciBtYWNybyBjYWxsIHNob3VsZCBiZSBmdWxmaWxsZWQgOgorICogICAgICAgICAgIC0gVUFSVCBpbnN0YW5jZSBzaG91bGQgaGF2ZSBhbHJlYWR5IGJlZW4gaW5pdGlhbGlzZWQgKHRocm91Z2ggY2FsbAorICogb2YgSEFMX1VBUlRfSW5pdCgpICkKKyAqICAgICAgICAgICAtIG1hY3JvIGNvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4gY29ycmVzcG9uZGluZyBVQVJUIGluc3RhbmNlIGlzCisgKiBkaXNhYmxlZCAoaS5lLiBfX0hBTF9VQVJUX0RJU0FCTEUoX19IQU5ETEVfXykpIGFuZCBzaG91bGQgYmUgZm9sbG93ZWQgYnkgYW4KKyAqIEVuYWJsZSBtYWNybyAoaS5lLiBfX0hBTF9VQVJUX0VOQUJMRShfX0hBTkRMRV9fKSkuCisgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4KKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX1VBUlRfSFdDT05UUk9MX0NUU19FTkFCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEFUT01JQ19TRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0NUU0UpOyBcCisgICAgKF9fSEFORExFX18pLT5Jbml0Lkh3Rmxvd0N0bCB8PSBVU0FSVF9DUjNfQ1RTRTsgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMFUpCisKKy8qKiBAYnJpZWYgIERpc2FibGUgQ1RTIGZsb3cgY29udHJvbC4KKyAqIEBub3RlICAgVGhpcyBtYWNybyBhbGxvd3MgdG8gZGlzYWJsZSBDVFMgaGFyZHdhcmUgZmxvdyBjb250cm9sIGZvciBhIGdpdmVuCisgKiBVQVJUIGluc3RhbmNlLCB3aXRob3V0IG5lZWQgdG8gY2FsbCBIQUxfVUFSVF9Jbml0KCkgZnVuY3Rpb24uIEFzIGludm9sdmluZworICogZGlyZWN0IGFjY2VzcyB0byBVQVJUIHJlZ2lzdGVycywgdXNhZ2Ugb2YgdGhpcyBtYWNybyBzaG91bGQgYmUgZnVsbHkgZW5kb3JzZWQKKyAqIGJ5IHVzZXIuCisgKiBAbm90ZSAgIEFzIG1hY3JvIGlzIGV4cGVjdGVkIHRvIGJlIHVzZWQgZm9yIG1vZGlmeWluZyBDVFMgSHcgZmxvdyBjb250cm9sCisgKiBmZWF0dXJlIGFjdGl2YXRpb24sIHdpdGhvdXQgbmVlZCBmb3IgVVNBUlQgaW5zdGFuY2UgRGVpbml0L0luaXQsIGZvbGxvd2luZworICogY29uZGl0aW9ucyBmb3IgbWFjcm8gY2FsbCBzaG91bGQgYmUgZnVsZmlsbGVkIDoKKyAqICAgICAgICAgICAtIFVBUlQgaW5zdGFuY2Ugc2hvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIGluaXRpYWxpc2VkICh0aHJvdWdoIGNhbGwKKyAqIG9mIEhBTF9VQVJUX0luaXQoKSApCisgKiAgICAgICAgICAgLSBtYWNybyBjb3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuIGNvcnJlc3BvbmRpbmcgVUFSVCBpbnN0YW5jZSBpcworICogZGlzYWJsZWQgKGkuZS4gX19IQUxfVUFSVF9ESVNBQkxFKF9fSEFORExFX18pKSBhbmQgc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IGFuCisgKiBFbmFibGUgbWFjcm8gKGkuZS4gX19IQUxfVUFSVF9FTkFCTEUoX19IQU5ETEVfXykpLgorICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBfX0hBTF9VQVJUX0hXQ09OVFJPTF9DVFNfRElTQUJMRShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQVRPTUlDX0NMRUFSX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19DVFNFKTsgXAorICAgIChfX0hBTkRMRV9fKS0+SW5pdC5Id0Zsb3dDdGwgJj0gfihVU0FSVF9DUjNfQ1RTRSk7ICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMFUpCisKKy8qKiBAYnJpZWYgIEVuYWJsZSBSVFMgZmxvdyBjb250cm9sLgorICogQG5vdGUgICBUaGlzIG1hY3JvIGFsbG93cyB0byBlbmFibGUgUlRTIGhhcmR3YXJlIGZsb3cgY29udHJvbCBmb3IgYSBnaXZlbgorICogVUFSVCBpbnN0YW5jZSwgd2l0aG91dCBuZWVkIHRvIGNhbGwgSEFMX1VBUlRfSW5pdCgpIGZ1bmN0aW9uLiBBcyBpbnZvbHZpbmcKKyAqIGRpcmVjdCBhY2Nlc3MgdG8gVUFSVCByZWdpc3RlcnMsIHVzYWdlIG9mIHRoaXMgbWFjcm8gc2hvdWxkIGJlIGZ1bGx5IGVuZG9yc2VkCisgKiBieSB1c2VyLgorICogQG5vdGUgICBBcyBtYWNybyBpcyBleHBlY3RlZCB0byBiZSB1c2VkIGZvciBtb2RpZnlpbmcgUlRTIEh3IGZsb3cgY29udHJvbAorICogZmVhdHVyZSBhY3RpdmF0aW9uLCB3aXRob3V0IG5lZWQgZm9yIFVTQVJUIGluc3RhbmNlIERlaW5pdC9Jbml0LCBmb2xsb3dpbmcKKyAqIGNvbmRpdGlvbnMgZm9yIG1hY3JvIGNhbGwgc2hvdWxkIGJlIGZ1bGZpbGxlZCA6CisgKiAgICAgICAgICAgLSBVQVJUIGluc3RhbmNlIHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiBpbml0aWFsaXNlZCAodGhyb3VnaCBjYWxsCisgKiBvZiBIQUxfVUFSVF9Jbml0KCkgKQorICogICAgICAgICAgIC0gbWFjcm8gY291bGQgb25seSBiZSBjYWxsZWQgd2hlbiBjb3JyZXNwb25kaW5nIFVBUlQgaW5zdGFuY2UgaXMKKyAqIGRpc2FibGVkIChpLmUuIF9fSEFMX1VBUlRfRElTQUJMRShfX0hBTkRMRV9fKSkgYW5kIHNob3VsZCBiZSBmb2xsb3dlZCBieSBhbgorICogRW5hYmxlIG1hY3JvIChpLmUuIF9fSEFMX1VBUlRfRU5BQkxFKF9fSEFORExFX18pKS4KKyAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVBUlQgSGFuZGxlLgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfVUFSVF9IV0NPTlRST0xfUlRTX0VOQUJMRShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQVRPTUlDX1NFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfUlRTRSk7IFwKKyAgICAoX19IQU5ETEVfXyktPkluaXQuSHdGbG93Q3RsIHw9IFVTQVJUX0NSM19SVFNFOyAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwVSkKKworLyoqIEBicmllZiAgRGlzYWJsZSBSVFMgZmxvdyBjb250cm9sLgorICogQG5vdGUgICBUaGlzIG1hY3JvIGFsbG93cyB0byBkaXNhYmxlIFJUUyBoYXJkd2FyZSBmbG93IGNvbnRyb2wgZm9yIGEgZ2l2ZW4KKyAqIFVBUlQgaW5zdGFuY2UsIHdpdGhvdXQgbmVlZCB0byBjYWxsIEhBTF9VQVJUX0luaXQoKSBmdW5jdGlvbi4gQXMgaW52b2x2aW5nCisgKiBkaXJlY3QgYWNjZXNzIHRvIFVBUlQgcmVnaXN0ZXJzLCB1c2FnZSBvZiB0aGlzIG1hY3JvIHNob3VsZCBiZSBmdWxseSBlbmRvcnNlZAorICogYnkgdXNlci4KKyAqIEBub3RlICAgQXMgbWFjcm8gaXMgZXhwZWN0ZWQgdG8gYmUgdXNlZCBmb3IgbW9kaWZ5aW5nIFJUUyBIdyBmbG93IGNvbnRyb2wKKyAqIGZlYXR1cmUgYWN0aXZhdGlvbiwgd2l0aG91dCBuZWVkIGZvciBVU0FSVCBpbnN0YW5jZSBEZWluaXQvSW5pdCwgZm9sbG93aW5nCisgKiBjb25kaXRpb25zIGZvciBtYWNybyBjYWxsIHNob3VsZCBiZSBmdWxmaWxsZWQgOgorICogICAgICAgICAgIC0gVUFSVCBpbnN0YW5jZSBzaG91bGQgaGF2ZSBhbHJlYWR5IGJlZW4gaW5pdGlhbGlzZWQgKHRocm91Z2ggY2FsbAorICogb2YgSEFMX1VBUlRfSW5pdCgpICkKKyAqICAgICAgICAgICAtIG1hY3JvIGNvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4gY29ycmVzcG9uZGluZyBVQVJUIGluc3RhbmNlIGlzCisgKiBkaXNhYmxlZCAoaS5lLiBfX0hBTF9VQVJUX0RJU0FCTEUoX19IQU5ETEVfXykpIGFuZCBzaG91bGQgYmUgZm9sbG93ZWQgYnkgYW4KKyAqIEVuYWJsZSBtYWNybyAoaS5lLiBfX0hBTF9VQVJUX0VOQUJMRShfX0hBTkRMRV9fKSkuCisgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4KKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIF9fSEFMX1VBUlRfSFdDT05UUk9MX1JUU19ESVNBQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBBVE9NSUNfQ0xFQVJfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX1JUU0UpOyBcCisgICAgKF9fSEFORExFX18pLT5Jbml0Lkh3Rmxvd0N0bCAmPSB+KFVTQVJUX0NSM19SVFNFKTsgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwVSkKKy8qKgorICogQH0KKyAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFVBUlRfUHJpdmF0ZV9NYWNyb3MgICBVQVJUIFByaXZhdGUgTWFjcm9zCisgKiBAeworICovCisvKiogQGJyaWVmICBHZXQgVUFSVCBjbG9jayBkaXZpc2lvbiBmYWN0b3IgZnJvbSBjbG9jayBwcmVzY2FsZXIgdmFsdWUuCisgKiBAcGFyYW0gIF9fQ0xPQ0tQUkVTQ0FMRVJfXyBVQVJUIHByZXNjYWxlciB2YWx1ZS4KKyAqIEByZXR2YWwgVUFSVCBjbG9jayBkaXZpc2lvbiBmYWN0b3IKKyAqLworI2RlZmluZSBVQVJUX0dFVF9ESVZfRkFDVE9SKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgICAgICAgICAgICAgXAorICAoKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFVBUlRfUFJFU0NBTEVSX0RJVjEpICAgICA/IDFVICAgXAorICAgOiAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gVUFSVF9QUkVTQ0FMRVJfRElWMikgICA/IDJVICAgXAorICAgOiAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gVUFSVF9QUkVTQ0FMRVJfRElWNCkgICA/IDRVICAgXAorICAgOiAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gVUFSVF9QUkVTQ0FMRVJfRElWNikgICA/IDZVICAgXAorICAgOiAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gVUFSVF9QUkVTQ0FMRVJfRElWOCkgICA/IDhVICAgXAorICAgOiAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gVUFSVF9QUkVTQ0FMRVJfRElWMTApICA/IDEwVSAgXAorICAgOiAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gVUFSVF9QUkVTQ0FMRVJfRElWMTIpICA/IDEyVSAgXAorICAgOiAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gVUFSVF9QUkVTQ0FMRVJfRElWMTYpICA/IDE2VSAgXAorICAgOiAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gVUFSVF9QUkVTQ0FMRVJfRElWMzIpICA/IDMyVSAgXAorICAgOiAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gVUFSVF9QUkVTQ0FMRVJfRElWNjQpICA/IDY0VSAgXAorICAgOiAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gVUFSVF9QUkVTQ0FMRVJfRElWMTI4KSA/IDEyOFUgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDI1NlUpCisKKy8qKiBAYnJpZWYgIEJSUiBkaXZpc2lvbiBvcGVyYXRpb24gdG8gc2V0IEJSUiByZWdpc3RlciB3aXRoIExQVUFSVC4KKyAqIEBwYXJhbSAgX19QQ0xLX18gTFBVQVJUIGNsb2NrLgorICogQHBhcmFtICBfX0JBVURfXyBCYXVkIHJhdGUgc2V0IGJ5IHRoZSB1c2VyLgorICogQHBhcmFtICBfX0NMT0NLUFJFU0NBTEVSX18gVUFSVCBwcmVzY2FsZXIgdmFsdWUuCisgKiBAcmV0dmFsIERpdmlzaW9uIHJlc3VsdAorICovCisjZGVmaW5lIFVBUlRfRElWX0xQVUFSVChfX1BDTEtfXywgX19CQVVEX18sIF9fQ0xPQ0tQUkVTQ0FMRVJfXykgXAorICAoKHVpbnQzMl90KSgoKCgoKHVpbnQ2NF90KShfX1BDTEtfXykpIC8gICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgKFVBUlRQcmVzY1RhYmxlWyhfX0NMT0NLUFJFU0NBTEVSX18pXSkpICogICAgICBcCisgICAgICAgICAgICAgICAgMjU2VSkgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgKHVpbnQzMl90KSgoX19CQVVEX18pIC8gMlUpKSAvICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKF9fQkFVRF9fKSkpCisKKy8qKiBAYnJpZWYgIEJSUiBkaXZpc2lvbiBvcGVyYXRpb24gdG8gc2V0IEJSUiByZWdpc3RlciBpbiA4LWJpdCBvdmVyc2FtcGxpbmcKKyAqIG1vZGUuCisgKiBAcGFyYW0gIF9fUENMS19fIFVBUlQgY2xvY2suCisgKiBAcGFyYW0gIF9fQkFVRF9fIEJhdWQgcmF0ZSBzZXQgYnkgdGhlIHVzZXIuCisgKiBAcGFyYW0gIF9fQ0xPQ0tQUkVTQ0FMRVJfXyBVQVJUIHByZXNjYWxlciB2YWx1ZS4KKyAqIEByZXR2YWwgRGl2aXNpb24gcmVzdWx0CisgKi8KKyNkZWZpbmUgVUFSVF9ESVZfU0FNUExJTkc4KF9fUENMS19fLCBfX0JBVURfXywgX19DTE9DS1BSRVNDQUxFUl9fKSBcCisgICgoKCgoX19QQ0xLX18pIC8gVUFSVFByZXNjVGFibGVbKF9fQ0xPQ0tQUkVTQ0FMRVJfXyldKSAqIDJVKSArICAgXAorICAgICgoX19CQVVEX18pIC8gMlUpKSAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIChfX0JBVURfXykpCisKKy8qKiBAYnJpZWYgIEJSUiBkaXZpc2lvbiBvcGVyYXRpb24gdG8gc2V0IEJSUiByZWdpc3RlciBpbiAxNi1iaXQgb3ZlcnNhbXBsaW5nCisgKiBtb2RlLgorICogQHBhcmFtICBfX1BDTEtfXyBVQVJUIGNsb2NrLgorICogQHBhcmFtICBfX0JBVURfXyBCYXVkIHJhdGUgc2V0IGJ5IHRoZSB1c2VyLgorICogQHBhcmFtICBfX0NMT0NLUFJFU0NBTEVSX18gVUFSVCBwcmVzY2FsZXIgdmFsdWUuCisgKiBAcmV0dmFsIERpdmlzaW9uIHJlc3VsdAorICovCisjZGVmaW5lIFVBUlRfRElWX1NBTVBMSU5HMTYoX19QQ0xLX18sIF9fQkFVRF9fLCBfX0NMT0NLUFJFU0NBTEVSX18pICAgICAgICAgICAgXAorICAoKCgoX19QQ0xLX18pIC8gVUFSVFByZXNjVGFibGVbKF9fQ0xPQ0tQUkVTQ0FMRVJfXyldKSArICgoX19CQVVEX18pIC8gMlUpKSAvIFwKKyAgIChfX0JBVURfXykpCisKKy8qKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgb3Igbm90IFVBUlQgaW5zdGFuY2UgaXMgTG93IFBvd2VyIFVBUlQuCisgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4KKyAqIEByZXR2YWwgU0VUIChpbnN0YW5jZSBpcyBMUFVBUlQpIG9yIFJFU0VUIChpbnN0YW5jZSBpc24ndCBMUFVBUlQpCisgKi8KKyNkZWZpbmUgVUFSVF9JTlNUQU5DRV9MT1dQT1dFUihfX0hBTkRMRV9fKSBcCisgIChJU19MUFVBUlRfSU5TVEFOQ0UoKF9fSEFORExFX18pLT5JbnN0YW5jZSkpCisKKy8qKiBAYnJpZWYgIENoZWNrIFVBUlQgQmF1ZCByYXRlLgorICogQHBhcmFtICBfX0JBVURSQVRFX18gQmF1ZHJhdGUgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLgorICogICAgICAgICBUaGUgbWF4aW11bSBCYXVkIFJhdGUgaXMgZGVyaXZlZCBmcm9tIHRoZSBtYXhpbXVtIGNsb2NrIG9uIEc0IChpLmUuCisgKiAxNTAgTUh6KSBkaXZpZGVkIGJ5IHRoZSBzbWFsbGVzdCBvdmVyc2FtcGxpbmcgdXNlZCBvbiB0aGUgVVNBUlQgKGkuZS4gOCkKKyAqIEByZXR2YWwgU0VUIChfX0JBVURSQVRFX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0JBVURSQVRFX18gaXMgaW52YWxpZCkKKyAqLworI2RlZmluZSBJU19VQVJUX0JBVURSQVRFKF9fQkFVRFJBVEVfXykgKChfX0JBVURSQVRFX18pIDwgMTg3NTAwMDFVKQorCisvKiogQGJyaWVmICBDaGVjayBVQVJUIGFzc2VydGlvbiB0aW1lLgorICogQHBhcmFtICBfX1RJTUVfXyA1LWJpdCB2YWx1ZSBhc3NlcnRpb24gdGltZS4KKyAqIEByZXR2YWwgVGVzdCByZXN1bHQgKFRSVUUgb3IgRkFMU0UpLgorICovCisjZGVmaW5lIElTX1VBUlRfQVNTRVJUSU9OVElNRShfX1RJTUVfXykgKChfX1RJTUVfXykgPD0gMHgxRlUpCisKKy8qKiBAYnJpZWYgIENoZWNrIFVBUlQgZGVhc3NlcnRpb24gdGltZS4KKyAqIEBwYXJhbSAgX19USU1FX18gNS1iaXQgdmFsdWUgZGVhc3NlcnRpb24gdGltZS4KKyAqIEByZXR2YWwgVGVzdCByZXN1bHQgKFRSVUUgb3IgRkFMU0UpLgorICovCisjZGVmaW5lIElTX1VBUlRfREVBU1NFUlRJT05USU1FKF9fVElNRV9fKSAoKF9fVElNRV9fKSA8PSAweDFGVSkKKworLyoqCisgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCBmcmFtZSBudW1iZXIgb2Ygc3RvcCBiaXRzIGlzIHZhbGlkLgorICogQHBhcmFtIF9fU1RPUEJJVFNfXyBVQVJUIGZyYW1lIG51bWJlciBvZiBzdG9wIGJpdHMuCisgKiBAcmV0dmFsIFNFVCAoX19TVE9QQklUU19fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19TVE9QQklUU19fIGlzIGludmFsaWQpCisgKi8KKyNkZWZpbmUgSVNfVUFSVF9TVE9QQklUUyhfX1NUT1BCSVRTX18pICAgICAgXAorICAoKChfX1NUT1BCSVRTX18pID09IFVBUlRfU1RPUEJJVFNfMF81KSB8fCBcCisgICAoKF9fU1RPUEJJVFNfXykgPT0gVUFSVF9TVE9QQklUU18xKSB8fCAgIFwKKyAgICgoX19TVE9QQklUU19fKSA9PSBVQVJUX1NUT1BCSVRTXzFfNSkgfHwgXAorICAgKChfX1NUT1BCSVRTX18pID09IFVBUlRfU1RPUEJJVFNfMikpCisKKy8qKgorICogQGJyaWVmIEVuc3VyZSB0aGF0IExQVUFSVCBmcmFtZSBudW1iZXIgb2Ygc3RvcCBiaXRzIGlzIHZhbGlkLgorICogQHBhcmFtIF9fU1RPUEJJVFNfXyBMUFVBUlQgZnJhbWUgbnVtYmVyIG9mIHN0b3AgYml0cy4KKyAqIEByZXR2YWwgU0VUIChfX1NUT1BCSVRTX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1NUT1BCSVRTX18gaXMgaW52YWxpZCkKKyAqLworI2RlZmluZSBJU19MUFVBUlRfU1RPUEJJVFMoX19TVE9QQklUU19fKSBcCisgICgoKF9fU1RPUEJJVFNfXykgPT0gVUFSVF9TVE9QQklUU18xKSB8fCAoKF9fU1RPUEJJVFNfXykgPT0gVUFSVF9TVE9QQklUU18yKSkKKworLyoqCisgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCBmcmFtZSBwYXJpdHkgaXMgdmFsaWQuCisgKiBAcGFyYW0gX19QQVJJVFlfXyBVQVJUIGZyYW1lIHBhcml0eS4KKyAqIEByZXR2YWwgU0VUIChfX1BBUklUWV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19QQVJJVFlfXyBpcyBpbnZhbGlkKQorICovCisjZGVmaW5lIElTX1VBUlRfUEFSSVRZKF9fUEFSSVRZX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKChfX1BBUklUWV9fKSA9PSBVQVJUX1BBUklUWV9OT05FKSB8fCAoKF9fUEFSSVRZX18pID09IFVBUlRfUEFSSVRZX0VWRU4pIHx8IFwKKyAgICgoX19QQVJJVFlfXykgPT0gVUFSVF9QQVJJVFlfT0REKSkKKworLyoqCisgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCBoYXJkd2FyZSBmbG93IGNvbnRyb2wgaXMgdmFsaWQuCisgKiBAcGFyYW0gX19DT05UUk9MX18gVUFSVCBoYXJkd2FyZSBmbG93IGNvbnRyb2wuCisgKiBAcmV0dmFsIFNFVCAoX19DT05UUk9MX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0NPTlRST0xfXyBpcyBpbnZhbGlkKQorICovCisjZGVmaW5lIElTX1VBUlRfSEFSRFdBUkVfRkxPV19DT05UUk9MKF9fQ09OVFJPTF9fKSBcCisgICgoKF9fQ09OVFJPTF9fKSA9PSBVQVJUX0hXQ09OVFJPTF9OT05FKSB8fCAgICAgICBcCisgICAoKF9fQ09OVFJPTF9fKSA9PSBVQVJUX0hXQ09OVFJPTF9SVFMpIHx8ICAgICAgICBcCisgICAoKF9fQ09OVFJPTF9fKSA9PSBVQVJUX0hXQ09OVFJPTF9DVFMpIHx8ICAgICAgICBcCisgICAoKF9fQ09OVFJPTF9fKSA9PSBVQVJUX0hXQ09OVFJPTF9SVFNfQ1RTKSkKKworLyoqCisgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCBjb21tdW5pY2F0aW9uIG1vZGUgaXMgdmFsaWQuCisgKiBAcGFyYW0gX19NT0RFX18gVUFSVCBjb21tdW5pY2F0aW9uIG1vZGUuCisgKiBAcmV0dmFsIFNFVCAoX19NT0RFX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX01PREVfXyBpcyBpbnZhbGlkKQorICovCisjZGVmaW5lIElTX1VBUlRfTU9ERShfX01PREVfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoKF9fTU9ERV9fKSAmICh+KCh1aW50MzJfdCkoVUFSVF9NT0RFX1RYX1JYKSkpKSA9PSAweDAwVSkgJiYgXAorICAgKChfX01PREVfXykgIT0gMHgwMFUpKQorCisvKioKKyAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIHN0YXRlIGlzIHZhbGlkLgorICogQHBhcmFtIF9fU1RBVEVfXyBVQVJUIHN0YXRlLgorICogQHJldHZhbCBTRVQgKF9fU1RBVEVfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fU1RBVEVfXyBpcyBpbnZhbGlkKQorICovCisjZGVmaW5lIElTX1VBUlRfU1RBVEUoX19TVEFURV9fKSBcCisgICgoKF9fU1RBVEVfXykgPT0gVUFSVF9TVEFURV9ESVNBQkxFKSB8fCAoKF9fU1RBVEVfXykgPT0gVUFSVF9TVEFURV9FTkFCTEUpKQorCisvKioKKyAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIG92ZXJzYW1wbGluZyBpcyB2YWxpZC4KKyAqIEBwYXJhbSBfX1NBTVBMSU5HX18gVUFSVCBvdmVyc2FtcGxpbmcuCisgKiBAcmV0dmFsIFNFVCAoX19TQU1QTElOR19fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19TQU1QTElOR19fIGlzIGludmFsaWQpCisgKi8KKyNkZWZpbmUgSVNfVUFSVF9PVkVSU0FNUExJTkcoX19TQU1QTElOR19fKSAgICAgXAorICAoKChfX1NBTVBMSU5HX18pID09IFVBUlRfT1ZFUlNBTVBMSU5HXzE2KSB8fCBcCisgICAoKF9fU0FNUExJTkdfXykgPT0gVUFSVF9PVkVSU0FNUExJTkdfOCkpCisKKy8qKgorICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgZnJhbWUgc2FtcGxpbmcgaXMgdmFsaWQuCisgKiBAcGFyYW0gX19PTkVCSVRfXyBVQVJUIGZyYW1lIHNhbXBsaW5nLgorICogQHJldHZhbCBTRVQgKF9fT05FQklUX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX09ORUJJVF9fIGlzIGludmFsaWQpCisgKi8KKyNkZWZpbmUgSVNfVUFSVF9PTkVfQklUX1NBTVBMRShfX09ORUJJVF9fKSAgICAgICAgICBcCisgICgoKF9fT05FQklUX18pID09IFVBUlRfT05FX0JJVF9TQU1QTEVfRElTQUJMRSkgfHwgXAorICAgKChfX09ORUJJVF9fKSA9PSBVQVJUX09ORV9CSVRfU0FNUExFX0VOQUJMRSkpCisKKy8qKgorICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgYXV0byBCYXVkIHJhdGUgZGV0ZWN0aW9uIG1vZGUgaXMgdmFsaWQuCisgKiBAcGFyYW0gX19NT0RFX18gVUFSVCBhdXRvIEJhdWQgcmF0ZSBkZXRlY3Rpb24gbW9kZS4KKyAqIEByZXR2YWwgU0VUIChfX01PREVfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fTU9ERV9fIGlzIGludmFsaWQpCisgKi8KKyNkZWZpbmUgSVNfVUFSVF9BRFZGRUFUVVJFX0FVVE9CQVVEUkFURU1PREUoX19NT0RFX18pICAgICAgICAgICAgXAorICAoKChfX01PREVfXykgPT0gVUFSVF9BRFZGRUFUVVJFX0FVVE9CQVVEUkFURV9PTlNUQVJUQklUKSB8fCAgICBcCisgICAoKF9fTU9ERV9fKSA9PSBVQVJUX0FEVkZFQVRVUkVfQVVUT0JBVURSQVRFX09ORkFMTElOR0VER0UpIHx8IFwKKyAgICgoX19NT0RFX18pID09IFVBUlRfQURWRkVBVFVSRV9BVVRPQkFVRFJBVEVfT04wWDdGRlJBTUUpIHx8ICAgXAorICAgKChfX01PREVfXykgPT0gVUFSVF9BRFZGRUFUVVJFX0FVVE9CQVVEUkFURV9PTjBYNTVGUkFNRSkpCisKKy8qKgorICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgcmVjZWl2ZXIgdGltZW91dCBzZXR0aW5nIGlzIHZhbGlkLgorICogQHBhcmFtIF9fVElNRU9VVF9fIFVBUlQgcmVjZWl2ZXIgdGltZW91dCBzZXR0aW5nLgorICogQHJldHZhbCBTRVQgKF9fVElNRU9VVF9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19USU1FT1VUX18gaXMgaW52YWxpZCkKKyAqLworI2RlZmluZSBJU19VQVJUX1JFQ0VJVkVSX1RJTUVPVVQoX19USU1FT1VUX18pICAgICAgICAgIFwKKyAgKCgoX19USU1FT1VUX18pID09IFVBUlRfUkVDRUlWRVJfVElNRU9VVF9ESVNBQkxFKSB8fCBcCisgICAoKF9fVElNRU9VVF9fKSA9PSBVQVJUX1JFQ0VJVkVSX1RJTUVPVVRfRU5BQkxFKSkKKworLyoqIEBicmllZiAgQ2hlY2sgdGhlIHJlY2VpdmVyIHRpbWVvdXQgdmFsdWUuCisgKiBAbm90ZSAgIFRoZSBtYXhpbXVtIFVBUlQgcmVjZWl2ZXIgdGltZW91dCB2YWx1ZSBpcyAweEZGRkZGRi4KKyAqIEBwYXJhbSAgX19USU1FT1VUVkFMVUVfXyByZWNlaXZlciB0aW1lb3V0IHZhbHVlLgorICogQHJldHZhbCBUZXN0IHJlc3VsdCAoVFJVRSBvciBGQUxTRSkKKyAqLworI2RlZmluZSBJU19VQVJUX1JFQ0VJVkVSX1RJTUVPVVRfVkFMVUUoX19USU1FT1VUVkFMVUVfXykgXAorICAoKF9fVElNRU9VVFZBTFVFX18pIDw9IDB4RkZGRkZGVSkKKworLyoqCisgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCBMSU4gc3RhdGUgaXMgdmFsaWQuCisgKiBAcGFyYW0gX19MSU5fXyBVQVJUIExJTiBzdGF0ZS4KKyAqIEByZXR2YWwgU0VUIChfX0xJTl9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19MSU5fXyBpcyBpbnZhbGlkKQorICovCisjZGVmaW5lIElTX1VBUlRfTElOKF9fTElOX18pIFwKKyAgKCgoX19MSU5fXykgPT0gVUFSVF9MSU5fRElTQUJMRSkgfHwgKChfX0xJTl9fKSA9PSBVQVJUX0xJTl9FTkFCTEUpKQorCisvKioKKyAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIExJTiBicmVhayBkZXRlY3Rpb24gbGVuZ3RoIGlzIHZhbGlkLgorICogQHBhcmFtIF9fTEVOR1RIX18gVUFSVCBMSU4gYnJlYWsgZGV0ZWN0aW9uIGxlbmd0aC4KKyAqIEByZXR2YWwgU0VUIChfX0xFTkdUSF9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19MRU5HVEhfXyBpcyBpbnZhbGlkKQorICovCisjZGVmaW5lIElTX1VBUlRfTElOX0JSRUFLX0RFVEVDVF9MRU5HVEgoX19MRU5HVEhfXykgICBcCisgICgoKF9fTEVOR1RIX18pID09IFVBUlRfTElOQlJFQUtERVRFQ1RMRU5HVEhfMTBCKSB8fCBcCisgICAoKF9fTEVOR1RIX18pID09IFVBUlRfTElOQlJFQUtERVRFQ1RMRU5HVEhfMTFCKSkKKworLyoqCisgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCBETUEgVFggc3RhdGUgaXMgdmFsaWQuCisgKiBAcGFyYW0gX19ETUFUWF9fIFVBUlQgRE1BIFRYIHN0YXRlLgorICogQHJldHZhbCBTRVQgKF9fRE1BVFhfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fRE1BVFhfXyBpcyBpbnZhbGlkKQorICovCisjZGVmaW5lIElTX1VBUlRfRE1BX1RYKF9fRE1BVFhfXykgXAorICAoKChfX0RNQVRYX18pID09IFVBUlRfRE1BX1RYX0RJU0FCTEUpIHx8ICgoX19ETUFUWF9fKSA9PSBVQVJUX0RNQV9UWF9FTkFCTEUpKQorCisvKioKKyAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIERNQSBSWCBzdGF0ZSBpcyB2YWxpZC4KKyAqIEBwYXJhbSBfX0RNQVJYX18gVUFSVCBETUEgUlggc3RhdGUuCisgKiBAcmV0dmFsIFNFVCAoX19ETUFSWF9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19ETUFSWF9fIGlzIGludmFsaWQpCisgKi8KKyNkZWZpbmUgSVNfVUFSVF9ETUFfUlgoX19ETUFSWF9fKSBcCisgICgoKF9fRE1BUlhfXykgPT0gVUFSVF9ETUFfUlhfRElTQUJMRSkgfHwgKChfX0RNQVJYX18pID09IFVBUlRfRE1BX1JYX0VOQUJMRSkpCisKKy8qKgorICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgaGFsZi1kdXBsZXggc3RhdGUgaXMgdmFsaWQuCisgKiBAcGFyYW0gX19IRFNFTF9fIFVBUlQgaGFsZi1kdXBsZXggc3RhdGUuCisgKiBAcmV0dmFsIFNFVCAoX19IRFNFTF9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19IRFNFTF9fIGlzIGludmFsaWQpCisgKi8KKyNkZWZpbmUgSVNfVUFSVF9IQUxGX0RVUExFWChfX0hEU0VMX18pICAgICAgICAgIFwKKyAgKCgoX19IRFNFTF9fKSA9PSBVQVJUX0hBTEZfRFVQTEVYX0RJU0FCTEUpIHx8IFwKKyAgICgoX19IRFNFTF9fKSA9PSBVQVJUX0hBTEZfRFVQTEVYX0VOQUJMRSkpCisKKy8qKgorICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgd2FrZS11cCBtZXRob2QgaXMgdmFsaWQuCisgKiBAcGFyYW0gX19XQUtFVVBfXyBVQVJUIHdha2UtdXAgbWV0aG9kIC4KKyAqIEByZXR2YWwgU0VUIChfX1dBS0VVUF9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19XQUtFVVBfXyBpcyBpbnZhbGlkKQorICovCisjZGVmaW5lIElTX1VBUlRfV0FLRVVQTUVUSE9EKF9fV0FLRVVQX18pICAgICAgICAgICBcCisgICgoKF9fV0FLRVVQX18pID09IFVBUlRfV0FLRVVQTUVUSE9EX0lETEVMSU5FKSB8fCBcCisgICAoKF9fV0FLRVVQX18pID09IFVBUlRfV0FLRVVQTUVUSE9EX0FERFJFU1NNQVJLKSkKKworLyoqCisgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCByZXF1ZXN0IHBhcmFtZXRlciBpcyB2YWxpZC4KKyAqIEBwYXJhbSBfX1BBUkFNX18gVUFSVCByZXF1ZXN0IHBhcmFtZXRlci4KKyAqIEByZXR2YWwgU0VUIChfX1BBUkFNX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1BBUkFNX18gaXMgaW52YWxpZCkKKyAqLworI2RlZmluZSBJU19VQVJUX1JFUVVFU1RfUEFSQU1FVEVSKF9fUEFSQU1fXykgICAgIFwKKyAgKCgoX19QQVJBTV9fKSA9PSBVQVJUX0FVVE9CQVVEX1JFUVVFU1QpIHx8ICAgICBcCisgICAoKF9fUEFSQU1fXykgPT0gVUFSVF9TRU5EQlJFQUtfUkVRVUVTVCkgfHwgICAgXAorICAgKChfX1BBUkFNX18pID09IFVBUlRfTVVURV9NT0RFX1JFUVVFU1QpIHx8ICAgIFwKKyAgICgoX19QQVJBTV9fKSA9PSBVQVJUX1JYREFUQV9GTFVTSF9SRVFVRVNUKSB8fCBcCisgICAoKF9fUEFSQU1fXykgPT0gVUFSVF9UWERBVEFfRkxVU0hfUkVRVUVTVCkpCisKKy8qKgorICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgYWR2YW5jZWQgZmVhdHVyZXMgaW5pdGlhbGl6YXRpb24gaXMgdmFsaWQuCisgKiBAcGFyYW0gX19JTklUX18gVUFSVCBhZHZhbmNlZCBmZWF0dXJlcyBpbml0aWFsaXphdGlvbi4KKyAqIEByZXR2YWwgU0VUIChfX0lOSVRfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fSU5JVF9fIGlzIGludmFsaWQpCisgKi8KKyNkZWZpbmUgSVNfVUFSVF9BRFZGRUFUVVJFX0lOSVQoX19JTklUX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChfX0lOSVRfXykgPD0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIChVQVJUX0FEVkZFQVRVUkVfTk9fSU5JVCB8IFVBUlRfQURWRkVBVFVSRV9UWElOVkVSVF9JTklUIHwgICAgICAgICAgIFwKKyAgICBVQVJUX0FEVkZFQVRVUkVfUlhJTlZFUlRfSU5JVCB8IFVBUlRfQURWRkVBVFVSRV9EQVRBSU5WRVJUX0lOSVQgfCAgIFwKKyAgICBVQVJUX0FEVkZFQVRVUkVfU1dBUF9JTklUIHwgVUFSVF9BRFZGRUFUVVJFX1JYT1ZFUlJVTkRJU0FCTEVfSU5JVCB8IFwKKyAgICBVQVJUX0FEVkZFQVRVUkVfRE1BRElTQUJMRU9ORVJST1JfSU5JVCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBVQVJUX0FEVkZFQVRVUkVfQVVUT0JBVURSQVRFX0lOSVQgfCBVQVJUX0FEVkZFQVRVUkVfTVNCRklSU1RfSU5JVCkpCisKKy8qKgorICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgZnJhbWUgVFggaW52ZXJzaW9uIHNldHRpbmcgaXMgdmFsaWQuCisgKiBAcGFyYW0gX19UWElOVl9fIFVBUlQgZnJhbWUgVFggaW52ZXJzaW9uIHNldHRpbmcuCisgKiBAcmV0dmFsIFNFVCAoX19UWElOVl9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19UWElOVl9fIGlzIGludmFsaWQpCisgKi8KKyNkZWZpbmUgSVNfVUFSVF9BRFZGRUFUVVJFX1RYSU5WKF9fVFhJTlZfXykgICAgICAgICAgXAorICAoKChfX1RYSU5WX18pID09IFVBUlRfQURWRkVBVFVSRV9UWElOVl9ESVNBQkxFKSB8fCBcCisgICAoKF9fVFhJTlZfXykgPT0gVUFSVF9BRFZGRUFUVVJFX1RYSU5WX0VOQUJMRSkpCisKKy8qKgorICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgZnJhbWUgUlggaW52ZXJzaW9uIHNldHRpbmcgaXMgdmFsaWQuCisgKiBAcGFyYW0gX19SWElOVl9fIFVBUlQgZnJhbWUgUlggaW52ZXJzaW9uIHNldHRpbmcuCisgKiBAcmV0dmFsIFNFVCAoX19SWElOVl9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19SWElOVl9fIGlzIGludmFsaWQpCisgKi8KKyNkZWZpbmUgSVNfVUFSVF9BRFZGRUFUVVJFX1JYSU5WKF9fUlhJTlZfXykgICAgICAgICAgXAorICAoKChfX1JYSU5WX18pID09IFVBUlRfQURWRkVBVFVSRV9SWElOVl9ESVNBQkxFKSB8fCBcCisgICAoKF9fUlhJTlZfXykgPT0gVUFSVF9BRFZGRUFUVVJFX1JYSU5WX0VOQUJMRSkpCisKKy8qKgorICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgZnJhbWUgZGF0YSBpbnZlcnNpb24gc2V0dGluZyBpcyB2YWxpZC4KKyAqIEBwYXJhbSBfX0RBVEFJTlZfXyBVQVJUIGZyYW1lIGRhdGEgaW52ZXJzaW9uIHNldHRpbmcuCisgKiBAcmV0dmFsIFNFVCAoX19EQVRBSU5WX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0RBVEFJTlZfXyBpcyBpbnZhbGlkKQorICovCisjZGVmaW5lIElTX1VBUlRfQURWRkVBVFVSRV9EQVRBSU5WKF9fREFUQUlOVl9fKSAgICAgICAgICBcCisgICgoKF9fREFUQUlOVl9fKSA9PSBVQVJUX0FEVkZFQVRVUkVfREFUQUlOVl9ESVNBQkxFKSB8fCBcCisgICAoKF9fREFUQUlOVl9fKSA9PSBVQVJUX0FEVkZFQVRVUkVfREFUQUlOVl9FTkFCTEUpKQorCisvKioKKyAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIGZyYW1lIFJYL1RYIHBpbnMgc3dhcCBzZXR0aW5nIGlzIHZhbGlkLgorICogQHBhcmFtIF9fU1dBUF9fIFVBUlQgZnJhbWUgUlgvVFggcGlucyBzd2FwIHNldHRpbmcuCisgKiBAcmV0dmFsIFNFVCAoX19TV0FQX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1NXQVBfXyBpcyBpbnZhbGlkKQorICovCisjZGVmaW5lIElTX1VBUlRfQURWRkVBVFVSRV9TV0FQKF9fU1dBUF9fKSAgICAgICAgICBcCisgICgoKF9fU1dBUF9fKSA9PSBVQVJUX0FEVkZFQVRVUkVfU1dBUF9ESVNBQkxFKSB8fCBcCisgICAoKF9fU1dBUF9fKSA9PSBVQVJUX0FEVkZFQVRVUkVfU1dBUF9FTkFCTEUpKQorCisvKioKKyAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIGZyYW1lIG92ZXJydW4gc2V0dGluZyBpcyB2YWxpZC4KKyAqIEBwYXJhbSBfX09WRVJSVU5fXyBVQVJUIGZyYW1lIG92ZXJydW4gc2V0dGluZy4KKyAqIEByZXR2YWwgU0VUIChfX09WRVJSVU5fXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fT1ZFUlJVTl9fIGlzIGludmFsaWQpCisgKi8KKyNkZWZpbmUgSVNfVUFSVF9PVkVSUlVOKF9fT1ZFUlJVTl9fKSAgICAgICAgICAgICAgICAgICAgXAorICAoKChfX09WRVJSVU5fXykgPT0gVUFSVF9BRFZGRUFUVVJFX09WRVJSVU5fRU5BQkxFKSB8fCBcCisgICAoKF9fT1ZFUlJVTl9fKSA9PSBVQVJUX0FEVkZFQVRVUkVfT1ZFUlJVTl9ESVNBQkxFKSkKKworLyoqCisgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCBhdXRvIEJhdWQgcmF0ZSBzdGF0ZSBpcyB2YWxpZC4KKyAqIEBwYXJhbSBfX0FVVE9CQVVEUkFURV9fIFVBUlQgYXV0byBCYXVkIHJhdGUgc3RhdGUuCisgKiBAcmV0dmFsIFNFVCAoX19BVVRPQkFVRFJBVEVfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fQVVUT0JBVURSQVRFX18gaXMKKyAqIGludmFsaWQpCisgKi8KKyNkZWZpbmUgSVNfVUFSVF9BRFZGRUFUVVJFX0FVVE9CQVVEUkFURShfX0FVVE9CQVVEUkFURV9fKSAgICAgICAgICBcCisgICgoKF9fQVVUT0JBVURSQVRFX18pID09IFVBUlRfQURWRkVBVFVSRV9BVVRPQkFVRFJBVEVfRElTQUJMRSkgfHwgXAorICAgKChfX0FVVE9CQVVEUkFURV9fKSA9PSBVQVJUX0FEVkZFQVRVUkVfQVVUT0JBVURSQVRFX0VOQUJMRSkpCisKKy8qKgorICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgRE1BIGVuYWJsaW5nIG9yIGRpc2FibGluZyBvbiBlcnJvciBzZXR0aW5nIGlzIHZhbGlkLgorICogQHBhcmFtIF9fRE1BX18gVUFSVCBETUEgZW5hYmxpbmcgb3IgZGlzYWJsaW5nIG9uIGVycm9yIHNldHRpbmcuCisgKiBAcmV0dmFsIFNFVCAoX19ETUFfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fRE1BX18gaXMgaW52YWxpZCkKKyAqLworI2RlZmluZSBJU19VQVJUX0FEVkZFQVRVUkVfRE1BT05SWEVSUk9SKF9fRE1BX18pICAgICAgICAgXAorICAoKChfX0RNQV9fKSA9PSBVQVJUX0FEVkZFQVRVUkVfRE1BX0VOQUJMRU9OUlhFUlJPUikgfHwgXAorICAgKChfX0RNQV9fKSA9PSBVQVJUX0FEVkZFQVRVUkVfRE1BX0RJU0FCTEVPTlJYRVJST1IpKQorCisvKioKKyAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIGZyYW1lIE1TQiBmaXJzdCBzZXR0aW5nIGlzIHZhbGlkLgorICogQHBhcmFtIF9fTVNCRklSU1RfXyBVQVJUIGZyYW1lIE1TQiBmaXJzdCBzZXR0aW5nLgorICogQHJldHZhbCBTRVQgKF9fTVNCRklSU1RfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fTVNCRklSU1RfXyBpcyBpbnZhbGlkKQorICovCisjZGVmaW5lIElTX1VBUlRfQURWRkVBVFVSRV9NU0JGSVJTVChfX01TQkZJUlNUX18pICAgICAgICAgIFwKKyAgKCgoX19NU0JGSVJTVF9fKSA9PSBVQVJUX0FEVkZFQVRVUkVfTVNCRklSU1RfRElTQUJMRSkgfHwgXAorICAgKChfX01TQkZJUlNUX18pID09IFVBUlRfQURWRkVBVFVSRV9NU0JGSVJTVF9FTkFCTEUpKQorCisvKioKKyAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIHN0b3AgbW9kZSBzdGF0ZSBpcyB2YWxpZC4KKyAqIEBwYXJhbSBfX1NUT1BNT0RFX18gVUFSVCBzdG9wIG1vZGUgc3RhdGUuCisgKiBAcmV0dmFsIFNFVCAoX19TVE9QTU9ERV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19TVE9QTU9ERV9fIGlzIGludmFsaWQpCisgKi8KKyNkZWZpbmUgSVNfVUFSVF9BRFZGRUFUVVJFX1NUT1BNT0RFKF9fU1RPUE1PREVfXykgICAgICAgICAgXAorICAoKChfX1NUT1BNT0RFX18pID09IFVBUlRfQURWRkVBVFVSRV9TVE9QTU9ERV9ESVNBQkxFKSB8fCBcCisgICAoKF9fU1RPUE1PREVfXykgPT0gVUFSVF9BRFZGRUFUVVJFX1NUT1BNT0RFX0VOQUJMRSkpCisKKy8qKgorICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgbXV0ZSBtb2RlIHN0YXRlIGlzIHZhbGlkLgorICogQHBhcmFtIF9fTVVURV9fIFVBUlQgbXV0ZSBtb2RlIHN0YXRlLgorICogQHJldHZhbCBTRVQgKF9fTVVURV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19NVVRFX18gaXMgaW52YWxpZCkKKyAqLworI2RlZmluZSBJU19VQVJUX01VVEVfTU9ERShfX01VVEVfXykgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoX19NVVRFX18pID09IFVBUlRfQURWRkVBVFVSRV9NVVRFTU9ERV9ESVNBQkxFKSB8fCBcCisgICAoKF9fTVVURV9fKSA9PSBVQVJUX0FEVkZFQVRVUkVfTVVURU1PREVfRU5BQkxFKSkKKworLyoqCisgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCB3YWtlLXVwIHNlbGVjdGlvbiBpcyB2YWxpZC4KKyAqIEBwYXJhbSBfX1dBS0VfXyBVQVJUIHdha2UtdXAgc2VsZWN0aW9uLgorICogQHJldHZhbCBTRVQgKF9fV0FLRV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19XQUtFX18gaXMgaW52YWxpZCkKKyAqLworI2RlZmluZSBJU19VQVJUX1dBS0VVUF9TRUxFQ1RJT04oX19XQUtFX18pICAgIFwKKyAgKCgoX19XQUtFX18pID09IFVBUlRfV0FLRVVQX09OX0FERFJFU1MpIHx8ICBcCisgICAoKF9fV0FLRV9fKSA9PSBVQVJUX1dBS0VVUF9PTl9TVEFSVEJJVCkgfHwgXAorICAgKChfX1dBS0VfXykgPT0gVUFSVF9XQUtFVVBfT05fUkVBRERBVEFfTk9ORU1QVFkpKQorCisvKioKKyAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIGRyaXZlciBlbmFibGUgcG9sYXJpdHkgaXMgdmFsaWQuCisgKiBAcGFyYW0gX19QT0xBUklUWV9fIFVBUlQgZHJpdmVyIGVuYWJsZSBwb2xhcml0eS4KKyAqIEByZXR2YWwgU0VUIChfX1BPTEFSSVRZX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1BPTEFSSVRZX18gaXMgaW52YWxpZCkKKyAqLworI2RlZmluZSBJU19VQVJUX0RFX1BPTEFSSVRZKF9fUE9MQVJJVFlfXykgICAgICAgXAorICAoKChfX1BPTEFSSVRZX18pID09IFVBUlRfREVfUE9MQVJJVFlfSElHSCkgfHwgXAorICAgKChfX1BPTEFSSVRZX18pID09IFVBUlRfREVfUE9MQVJJVFlfTE9XKSkKKworLyoqCisgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCBQcmVzY2FsZXIgaXMgdmFsaWQuCisgKiBAcGFyYW0gX19DTE9DS1BSRVNDQUxFUl9fIFVBUlQgUHJlc2NhbGVyIHZhbHVlLgorICogQHJldHZhbCBTRVQgKF9fQ0xPQ0tQUkVTQ0FMRVJfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fQ0xPQ0tQUkVTQ0FMRVJfXyBpcworICogaW52YWxpZCkKKyAqLworI2RlZmluZSBJU19VQVJUX1BSRVNDQUxFUihfX0NMT0NLUFJFU0NBTEVSX18pICAgICAgICAgXAorICAoKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFVBUlRfUFJFU0NBTEVSX0RJVjEpIHx8ICAgXAorICAgKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFVBUlRfUFJFU0NBTEVSX0RJVjIpIHx8ICAgXAorICAgKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFVBUlRfUFJFU0NBTEVSX0RJVjQpIHx8ICAgXAorICAgKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFVBUlRfUFJFU0NBTEVSX0RJVjYpIHx8ICAgXAorICAgKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFVBUlRfUFJFU0NBTEVSX0RJVjgpIHx8ICAgXAorICAgKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFVBUlRfUFJFU0NBTEVSX0RJVjEwKSB8fCAgXAorICAgKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFVBUlRfUFJFU0NBTEVSX0RJVjEyKSB8fCAgXAorICAgKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFVBUlRfUFJFU0NBTEVSX0RJVjE2KSB8fCAgXAorICAgKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFVBUlRfUFJFU0NBTEVSX0RJVjMyKSB8fCAgXAorICAgKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFVBUlRfUFJFU0NBTEVSX0RJVjY0KSB8fCAgXAorICAgKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFVBUlRfUFJFU0NBTEVSX0RJVjEyOCkgfHwgXAorICAgKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFVBUlRfUFJFU0NBTEVSX0RJVjI1NikpCisKKy8qKgorICogQH0KKyAqLworCisvKiBJbmNsdWRlIFVBUlQgSEFMIEV4dGVuZGVkIG1vZHVsZSAqLworI2luY2x1ZGUgInN0bTMyZzR4eF9oYWxfdWFydF9leC5oIgorCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFVBUlRfRXhwb3J0ZWRfRnVuY3Rpb25zIFVBUlQgRXhwb3J0ZWQgRnVuY3Rpb25zCisgKiBAeworICovCisKKy8qKiBAYWRkdG9ncm91cCBVQVJUX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kCisgKiBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAqIEB7CisgKi8KKworLyogSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0luaXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSGFsZkR1cGxleF9Jbml0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xJTl9Jbml0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQnJlYWtEZXRlY3RMZW5ndGgpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX011bHRpUHJvY2Vzc29yX0luaXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFdha2VVcE1ldGhvZCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9EZUluaXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7Cit2b2lkIEhBTF9VQVJUX01zcEluaXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7Cit2b2lkIEhBTF9VQVJUX01zcERlSW5pdChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKKworLyogQ2FsbGJhY2tzIFJlZ2lzdGVyL1VuUmVnaXN0ZXIgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfUmVnaXN0ZXJDYWxsYmFjaygKKyAgICBVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCBIQUxfVUFSVF9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELAorICAgIHBVQVJUX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfVW5SZWdpc3RlckNhbGxiYWNrKAorICAgIFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIEhBTF9VQVJUX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpOworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9SZWdpc3RlclJ4RXZlbnRDYWxsYmFjaygKKyAgICBVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCBwVUFSVF9SeEV2ZW50Q2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjayk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9VblJlZ2lzdGVyUnhFdmVudENhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qKiBAYWRkdG9ncm91cCBVQVJUX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICogQHsKKyAqLworCisvKiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfVHJhbnNtaXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZW91dCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9SZWNlaXZlKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIHVpbnQ4X3QgKnBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBUaW1lb3V0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX1RyYW5zbWl0X0lUKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9SZWNlaXZlX0lUKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIHVpbnQ4X3QgKnBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBTaXplKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX1RyYW5zbWl0X0RNQShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX1JlY2VpdmVfRE1BKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9ETUFQYXVzZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0RNQVJlc3VtZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0RNQVN0b3AoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7CisvKiBUcmFuc2ZlciBBYm9ydCBmdW5jdGlvbnMgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0Fib3J0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfQWJvcnRUcmFuc21pdChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0Fib3J0UmVjZWl2ZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0Fib3J0X0lUKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfQWJvcnRUcmFuc21pdF9JVChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0Fib3J0UmVjZWl2ZV9JVChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKKwordm9pZCBIQUxfVUFSVF9JUlFIYW5kbGVyKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOwordm9pZCBIQUxfVUFSVF9UeEhhbGZDcGx0Q2FsbGJhY2soVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7Cit2b2lkIEhBTF9VQVJUX1R4Q3BsdENhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOwordm9pZCBIQUxfVUFSVF9SeEhhbGZDcGx0Q2FsbGJhY2soVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7Cit2b2lkIEhBTF9VQVJUX1J4Q3BsdENhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOwordm9pZCBIQUxfVUFSVF9FcnJvckNhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOwordm9pZCBIQUxfVUFSVF9BYm9ydENwbHRDYWxsYmFjayhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK3ZvaWQgSEFMX1VBUlRfQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK3ZvaWQgSEFMX1VBUlRfQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworCit2b2lkIEhBTF9VQVJURXhfUnhFdmVudENhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIHVpbnQxNl90IFNpemUpOworCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBhZGR0b2dyb3VwIFVBUlRfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgKiBAeworICovCisKKy8qIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgSEFMX1VBUlRfUmVjZWl2ZXJUaW1lb3V0X0NvbmZpZyhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVvdXRWYWx1ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9FbmFibGVSZWNlaXZlclRpbWVvdXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9EaXNhYmxlUmVjZWl2ZXJUaW1lb3V0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTElOX1NlbmRCcmVhayhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9NdWx0aVByb2Nlc3Nvcl9FbmFibGVNdXRlTW9kZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9NdWx0aVByb2Nlc3Nvcl9EaXNhYmxlTXV0ZU1vZGUoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7Cit2b2lkIEhBTF9NdWx0aVByb2Nlc3Nvcl9FbnRlck11dGVNb2RlKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hhbGZEdXBsZXhfRW5hYmxlVHJhbnNtaXR0ZXIoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSGFsZkR1cGxleF9FbmFibGVSZWNlaXZlcihVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKKworLyoqCisgKiBAfQorICovCisKKy8qKiBAYWRkdG9ncm91cCBVQVJUX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3IKKyAqIGZ1bmN0aW9ucworICogQHsKKyAqLworCisvKiBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvcnMgZnVuY3Rpb25zCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9VQVJUX1N0YXRlVHlwZURlZiBIQUxfVUFSVF9HZXRTdGF0ZShjb25zdCBVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK3VpbnQzMl90IEhBTF9VQVJUX0dldEVycm9yKGNvbnN0IFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qIFByaXZhdGUgZnVuY3Rpb25zCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgVUFSVF9Qcml2YXRlX0Z1bmN0aW9ucyBVQVJUIFByaXZhdGUgRnVuY3Rpb25zCisgKiBAeworICovCisjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKK3ZvaWQgVUFSVF9Jbml0Q2FsbGJhY2tzVG9EZWZhdWx0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIFVBUlRfU2V0Q29uZmlnKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworSEFMX1N0YXR1c1R5cGVEZWYgVUFSVF9DaGVja0lkbGVTdGF0ZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIFVBUlRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEZsYWcsIEZsYWdTdGF0dXMgU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpY2tzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lb3V0KTsKK3ZvaWQgVUFSVF9BZHZGZWF0dXJlQ29uZmlnKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworSEFMX1N0YXR1c1R5cGVEZWYgVUFSVF9TdGFydF9SZWNlaXZlX0lUKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpOworSEFMX1N0YXR1c1R5cGVEZWYgVUFSVF9TdGFydF9SZWNlaXZlX0RNQShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CisKKy8qKgorICogQH0KKyAqLworCisvKiBQcml2YXRlIHZhcmlhYmxlcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBVQVJUX1ByaXZhdGVfdmFyaWFibGVzIFVBUlQgUHJpdmF0ZSB2YXJpYWJsZXMKKyAqIEB7CisgKi8KKy8qIFByZXNjYWxlciBUYWJsZSB1c2VkIGluIEJSUiBjb21wdXRhdGlvbiBtYWNyb3MuCisgICBEZWNsYXJlZCBhcyBleHRlcm4gaGVyZSB0byBhbGxvdyB1c2Ugb2YgcHJpdmF0ZSBVQVJUIG1hY3Jvcywgb3V0c2lkZSBvZiBIQUwKKyAgIFVBUlQgZnVuY3Rpb25zICovCitleHRlcm4gY29uc3QgdWludDE2X3QgVUFSVFByZXNjVGFibGVbMTJdOworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyRzR4eF9IQUxfVUFSVF9IICovCmRpZmYgLS1naXQgYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9oYWxfdWFydF9leC5oIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfaGFsX3VhcnRfZXguaAppbmRleCA1NDNhOWQ3Li5kNGQ0ZmRlIDEwMDY0NAotLS0gYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9oYWxfdWFydF9leC5oCisrKyBiL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9JbmMvc3RtMzJnNHh4X2hhbF91YXJ0X2V4LmgKQEAgLTEsNjE0ICsxLDg1NCBAQAotLyoqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEBmaWxlICAgIHN0bTMyZzR4eF9oYWxfdWFydF9leC5oDQotICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0NCi0gKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBVQVJUIEhBTCBFeHRlbmRlZCBtb2R1bGUuDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEBhdHRlbnRpb24NCi0gKg0KLSAqIENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4NCi0gKg0KLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGVybXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZQ0KLSAqIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4NCi0gKiBJZiBubyBMSUNFTlNFIGZpbGUgY29tZXMgd2l0aCB0aGlzIHNvZnR3YXJlLCBpdCBpcyBwcm92aWRlZCBBUy1JUy4NCi0gKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKi8NCi0NCi0vKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpZm5kZWYgU1RNMzJHNHh4X0hBTF9VQVJUX0VYX0gNCi0jZGVmaW5lIFNUTTMyRzR4eF9IQUxfVUFSVF9FWF9IDQotDQotI2lmZGVmIF9fY3BsdXNwbHVzDQotZXh0ZXJuICJDIiB7DQotI2VuZGlmDQotDQotLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaW5jbHVkZSAic3RtMzJnNHh4X2hhbF9kZWYuaCINCi0NCi0vKiogQGFkZHRvZ3JvdXAgU1RNMzJHNHh4X0hBTF9Ecml2ZXINCi0gKiBAew0KLSAqLw0KLQ0KLS8qKiBAYWRkdG9ncm91cCBVQVJURXgNCi0gKiBAew0KLSAqLw0KLQ0KLS8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBkZWZncm91cCBVQVJURXhfRXhwb3J0ZWRfVHlwZXMgVUFSVEV4IEV4cG9ydGVkIFR5cGVzDQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFVBUlQgd2FrZSB1cCBmcm9tIHN0b3AgbW9kZSBwYXJhbWV0ZXJzDQotICovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgdWludDMyX3QgV2FrZVVwRXZlbnQ7IC8qITwgU3BlY2lmaWVzIHdoaWNoIGV2ZW50IHdpbGwgYWN0aXZhdGUgdGhlIFdha2V1cCBmcm9tDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcCBtb2RlIGZsYWcgKFdVRikuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgQHJlZiBVQVJUX1dha2VVcF9mcm9tX1N0b3BfU2VsZWN0aW9uLiBJZiBzZXQgdG8NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBVQVJUX1dBS0VVUF9PTl9BRERSRVNTLCB0aGUgdHdvIG90aGVyIGZpZWxkcyBiZWxvdw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgZmlsbGVkIHVwLiAqLw0KLQ0KLSAgdWludDE2X3QgQWRkcmVzc0xlbmd0aDsgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgYWRkcmVzcyBpcyA0IG9yIDctYml0IGxvbmcuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVBUlRFeF9XYWtlVXBfQWRkcmVzc19MZW5ndGguICAqLw0KLQ0KLSAgdWludDhfdCBBZGRyZXNzOyAvKiE8IFVBUlQvVVNBUlQgbm9kZSBhZGRyZXNzICg3LWJpdCBsb25nIG1heCkuICovDQotfSBVQVJUX1dha2VVcFR5cGVEZWY7DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgVUFSVEV4X0V4cG9ydGVkX0NvbnN0YW50cyBVQVJURXggRXhwb3J0ZWQgQ29uc3RhbnRzDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFVBUlRFeF9Xb3JkX0xlbmd0aCBVQVJURXggV29yZCBMZW5ndGgNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgVUFSVF9XT1JETEVOR1RIXzdCIFVTQVJUX0NSMV9NMSAvKiE8IDctYml0IGxvbmcgVUFSVCBmcmFtZSAqLw0KLSNkZWZpbmUgVUFSVF9XT1JETEVOR1RIXzhCIDB4MDAwMDAwMDBVICAvKiE8IDgtYml0IGxvbmcgVUFSVCBmcmFtZSAqLw0KLSNkZWZpbmUgVUFSVF9XT1JETEVOR1RIXzlCIFVTQVJUX0NSMV9NMCAvKiE8IDktYml0IGxvbmcgVUFSVCBmcmFtZSAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBVQVJURXhfV2FrZVVwX0FkZHJlc3NfTGVuZ3RoIFVBUlRFeCBXYWtlVXAgQWRkcmVzcyBMZW5ndGgNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgVUFSVF9BRERSRVNTX0RFVEVDVF80QiAweDAwMDAwMDAwVSAvKiE8IDQtYml0IGxvbmcgd2FrZS11cCBhZGRyZXNzICovDQotI2RlZmluZSBVQVJUX0FERFJFU1NfREVURUNUXzdCIFwNCi0gIFVTQVJUX0NSMl9BRERNNyAvKiE8IDctYml0IGxvbmcgd2FrZS11cCBhZGRyZXNzICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFVBUlRFeF9GSUZPX21vZGUgVUFSVEV4IEZJRk8gbW9kZQ0KLSAqIEBicmllZiAgICBVQVJUIEZJRk8gbW9kZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBVQVJUX0ZJRk9NT0RFX0RJU0FCTEUgMHgwMDAwMDAwMFUgICAgIC8qITwgRklGTyBtb2RlIGRpc2FibGUgKi8NCi0jZGVmaW5lIFVBUlRfRklGT01PREVfRU5BQkxFIFVTQVJUX0NSMV9GSUZPRU4gLyohPCBGSUZPIG1vZGUgZW5hYmxlICAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBVQVJURXhfVFhGSUZPX3RocmVzaG9sZF9sZXZlbCBVQVJURXggVFhGSUZPIHRocmVzaG9sZCBsZXZlbA0KLSAqIEBicmllZiAgICBVQVJUIFRYRklGTyB0aHJlc2hvbGQgbGV2ZWwNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgVUFSVF9UWEZJRk9fVEhSRVNIT0xEXzFfOCBcDQotICAweDAwMDAwMDAwVSAvKiE8IFRYIEZJRk8gcmVhY2hlcyAxLzggb2YgaXRzIGRlcHRoICovDQotI2RlZmluZSBVQVJUX1RYRklGT19USFJFU0hPTERfMV80IFwNCi0gIFVTQVJUX0NSM19UWEZUQ0ZHXzAgLyohPCBUWCBGSUZPIHJlYWNoZXMgMS80IG9mIGl0cyBkZXB0aCAqLw0KLSNkZWZpbmUgVUFSVF9UWEZJRk9fVEhSRVNIT0xEXzFfMiBcDQotICBVU0FSVF9DUjNfVFhGVENGR18xIC8qITwgVFggRklGTyByZWFjaGVzIDEvMiBvZiBpdHMgZGVwdGggKi8NCi0jZGVmaW5lIFVBUlRfVFhGSUZPX1RIUkVTSE9MRF8zXzQgXA0KLSAgKFVTQVJUX0NSM19UWEZUQ0ZHXzAgfCAgICAgICAgICBcDQotICAgVVNBUlRfQ1IzX1RYRlRDRkdfMSkgLyohPCBUWCBGSUZPIHJlYWNoZXMgMy80IG9mIGl0cyBkZXB0aCAqLw0KLSNkZWZpbmUgVUFSVF9UWEZJRk9fVEhSRVNIT0xEXzdfOCBcDQotICBVU0FSVF9DUjNfVFhGVENGR18yIC8qITwgVFggRklGTyByZWFjaGVzIDcvOCBvZiBpdHMgZGVwdGggKi8NCi0jZGVmaW5lIFVBUlRfVFhGSUZPX1RIUkVTSE9MRF84XzggXA0KLSAgKFVTQVJUX0NSM19UWEZUQ0ZHXzIgfCBVU0FSVF9DUjNfVFhGVENGR18wKSAvKiE8IFRYIEZJRk8gYmVjb21lcyBlbXB0eSAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBVQVJURXhfUlhGSUZPX3RocmVzaG9sZF9sZXZlbCBVQVJURXggUlhGSUZPIHRocmVzaG9sZCBsZXZlbA0KLSAqIEBicmllZiAgICBVQVJUIFJYRklGTyB0aHJlc2hvbGQgbGV2ZWwNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgVUFSVF9SWEZJRk9fVEhSRVNIT0xEXzFfOCBcDQotICAweDAwMDAwMDAwVSAvKiE8IFJYIEZJRk8gcmVhY2hlcyAxLzggb2YgaXRzIGRlcHRoICovDQotI2RlZmluZSBVQVJUX1JYRklGT19USFJFU0hPTERfMV80IFwNCi0gIFVTQVJUX0NSM19SWEZUQ0ZHXzAgLyohPCBSWCBGSUZPIHJlYWNoZXMgMS80IG9mIGl0cyBkZXB0aCAqLw0KLSNkZWZpbmUgVUFSVF9SWEZJRk9fVEhSRVNIT0xEXzFfMiBcDQotICBVU0FSVF9DUjNfUlhGVENGR18xIC8qITwgUlggRklGTyByZWFjaGVzIDEvMiBvZiBpdHMgZGVwdGggKi8NCi0jZGVmaW5lIFVBUlRfUlhGSUZPX1RIUkVTSE9MRF8zXzQgXA0KLSAgKFVTQVJUX0NSM19SWEZUQ0ZHXzAgfCAgICAgICAgICBcDQotICAgVVNBUlRfQ1IzX1JYRlRDRkdfMSkgLyohPCBSWCBGSUZPIHJlYWNoZXMgMy80IG9mIGl0cyBkZXB0aCAqLw0KLSNkZWZpbmUgVUFSVF9SWEZJRk9fVEhSRVNIT0xEXzdfOCBcDQotICBVU0FSVF9DUjNfUlhGVENGR18yIC8qITwgUlggRklGTyByZWFjaGVzIDcvOCBvZiBpdHMgZGVwdGggKi8NCi0jZGVmaW5lIFVBUlRfUlhGSUZPX1RIUkVTSE9MRF84XzggXA0KLSAgKFVTQVJUX0NSM19SWEZUQ0ZHXzIgfCBVU0FSVF9DUjNfUlhGVENGR18wKSAvKiE8IFJYIEZJRk8gYmVjb21lcyBmdWxsICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGFkZHRvZ3JvdXAgVUFSVEV4X0V4cG9ydGVkX0Z1bmN0aW9ucw0KLSAqIEB7DQotICovDQotDQotLyoqIEBhZGR0b2dyb3VwIFVBUlRFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxDQotICogQHsNCi0gKi8NCi0NCi0vKiBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9SUzQ4NUV4X0luaXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwgdWludDMyX3QgUG9sYXJpdHksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBBc3NlcnRpb25UaW1lLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRGVhc3NlcnRpb25UaW1lKTsNCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAYWRkdG9ncm91cCBVQVJURXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMg0KLSAqIEB7DQotICovDQotDQotdm9pZCBIQUxfVUFSVEV4X1dha2V1cENhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOw0KLQ0KLXZvaWQgSEFMX1VBUlRFeF9SeEZpZm9GdWxsQ2FsbGJhY2soVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7DQotdm9pZCBIQUxfVUFSVEV4X1R4Rmlmb0VtcHR5Q2FsbGJhY2soVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGFkZHRvZ3JvdXAgVUFSVEV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRFeF9TdG9wTW9kZVdha2VVcFNvdXJjZUNvbmZpZygNCi0gICAgVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwgVUFSVF9XYWtlVXBUeXBlRGVmIFdha2VVcFNlbGVjdGlvbik7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRFeF9FbmFibGVTdG9wTW9kZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVEV4X0Rpc2FibGVTdG9wTW9kZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsNCi0NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfTXVsdGlQcm9jZXNzb3JFeF9BZGRyZXNzTGVuZ3RoX1NldCgNCi0gICAgVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwgdWludDMyX3QgQWRkcmVzc0xlbmd0aCk7DQotDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRFeF9FbmFibGVGaWZvTW9kZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVEV4X0Rpc2FibGVGaWZvTW9kZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVEV4X1NldFR4Rmlmb1RocmVzaG9sZChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRocmVzaG9sZCk7DQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRFeF9TZXRSeEZpZm9UaHJlc2hvbGQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaHJlc2hvbGQpOw0KLQ0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJURXhfUmVjZWl2ZVRvSWRsZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgKlJ4TGVuLCB1aW50MzJfdCBUaW1lb3V0KTsNCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVEV4X1JlY2VpdmVUb0lkbGVfSVQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJURXhfUmVjZWl2ZVRvSWRsZV9ETUEoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKTsNCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGRlZmdyb3VwIFVBUlRFeF9Qcml2YXRlX01hY3JvcyBVQVJURXggUHJpdmF0ZSBNYWNyb3MNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKiBAYnJpZWYgIFJlcG9ydCB0aGUgVUFSVCBjbG9jayBzb3VyY2UuDQotICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuDQotICogQHBhcmFtICBfX0NMT0NLU09VUkNFX18gb3V0cHV0IHZhcmlhYmxlLg0KLSAqIEByZXR2YWwgVUFSVCBjbG9ja2luZyBzb3VyY2UsIHdyaXR0ZW4gaW4gX19DTE9DS1NPVVJDRV9fLg0KLSAqLw0KLSNpZiBkZWZpbmVkKFVBUlQ1KQ0KLSNkZWZpbmUgVUFSVF9HRVRDTE9DS1NPVVJDRShfX0hBTkRMRV9fLCBfX0NMT0NLU09VUkNFX18pICBcDQotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgaWYgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gVVNBUlQxKSB7ICAgICAgICAgICAgICAgXA0KLSAgICAgIHN3aXRjaCAoX19IQUxfUkNDX0dFVF9VU0FSVDFfU09VUkNFKCkpIHsgICAgICAgICAgICBcDQotICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfUENMSzI6ICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1BDTEsyOyAgICAgXA0KLSAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfSFNJOiAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX0hTSTsgICAgICAgXA0KLSAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfU1lTQ0xLOiAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1NZU0NMSzsgICAgXA0KLSAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfTFNFOiAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX0xTRTsgICAgICAgXA0KLSAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1VOREVGSU5FRDsgXA0KLSAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgfSBlbHNlIGlmICgoX19IQU5ETEVfXyktPkluc3RhbmNlID09IFVTQVJUMikgeyAgICAgICAgXA0KLSAgICAgIHN3aXRjaCAoX19IQUxfUkNDX0dFVF9VU0FSVDJfU09VUkNFKCkpIHsgICAgICAgICAgICBcDQotICAgICAgICBjYXNlIFJDQ19VU0FSVDJDTEtTT1VSQ0VfUENMSzE6ICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1BDTEsxOyAgICAgXA0KLSAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICBjYXNlIFJDQ19VU0FSVDJDTEtTT1VSQ0VfSFNJOiAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX0hTSTsgICAgICAgXA0KLSAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICBjYXNlIFJDQ19VU0FSVDJDTEtTT1VSQ0VfU1lTQ0xLOiAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1NZU0NMSzsgICAgXA0KLSAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICBjYXNlIFJDQ19VU0FSVDJDTEtTT1VSQ0VfTFNFOiAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX0xTRTsgICAgICAgXA0KLSAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1VOREVGSU5FRDsgXA0KLSAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgfSBlbHNlIGlmICgoX19IQU5ETEVfXyktPkluc3RhbmNlID09IFVTQVJUMykgeyAgICAgICAgXA0KLSAgICAgIHN3aXRjaCAoX19IQUxfUkNDX0dFVF9VU0FSVDNfU09VUkNFKCkpIHsgICAgICAgICAgICBcDQotICAgICAgICBjYXNlIFJDQ19VU0FSVDNDTEtTT1VSQ0VfUENMSzE6ICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1BDTEsxOyAgICAgXA0KLSAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICBjYXNlIFJDQ19VU0FSVDNDTEtTT1VSQ0VfSFNJOiAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX0hTSTsgICAgICAgXA0KLSAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICBjYXNlIFJDQ19VU0FSVDNDTEtTT1VSQ0VfU1lTQ0xLOiAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1NZU0NMSzsgICAgXA0KLSAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICBjYXNlIFJDQ19VU0FSVDNDTEtTT1VSQ0VfTFNFOiAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX0xTRTsgICAgICAgXA0KLSAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1VOREVGSU5FRDsgXA0KLSAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgfSBlbHNlIGlmICgoX19IQU5ETEVfXyktPkluc3RhbmNlID09IFVBUlQ0KSB7ICAgICAgICAgXA0KLSAgICAgIHN3aXRjaCAoX19IQUxfUkNDX0dFVF9VQVJUNF9TT1VSQ0UoKSkgeyAgICAgICAgICAgICBcDQotICAgICAgICBjYXNlIFJDQ19VQVJUNENMS1NPVVJDRV9QQ0xLMTogICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1BDTEsxOyAgICAgXA0KLSAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICBjYXNlIFJDQ19VQVJUNENMS1NPVVJDRV9IU0k6ICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX0hTSTsgICAgICAgXA0KLSAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICBjYXNlIFJDQ19VQVJUNENMS1NPVVJDRV9TWVNDTEs6ICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1NZU0NMSzsgICAgXA0KLSAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICBjYXNlIFJDQ19VQVJUNENMS1NPVVJDRV9MU0U6ICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX0xTRTsgICAgICAgXA0KLSAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1VOREVGSU5FRDsgXA0KLSAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgfSBlbHNlIGlmICgoX19IQU5ETEVfXyktPkluc3RhbmNlID09IFVBUlQ1KSB7ICAgICAgICAgXA0KLSAgICAgIHN3aXRjaCAoX19IQUxfUkNDX0dFVF9VQVJUNV9TT1VSQ0UoKSkgeyAgICAgICAgICAgICBcDQotICAgICAgICBjYXNlIFJDQ19VQVJUNUNMS1NPVVJDRV9QQ0xLMTogICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1BDTEsxOyAgICAgXA0KLSAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICBjYXNlIFJDQ19VQVJUNUNMS1NPVVJDRV9IU0k6ICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX0hTSTsgICAgICAgXA0KLSAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICBjYXNlIFJDQ19VQVJUNUNMS1NPVVJDRV9TWVNDTEs6ICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1NZU0NMSzsgICAgXA0KLSAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICBjYXNlIFJDQ19VQVJUNUNMS1NPVVJDRV9MU0U6ICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX0xTRTsgICAgICAgXA0KLSAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1VOREVGSU5FRDsgXA0KLSAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgfSBlbHNlIGlmICgoX19IQU5ETEVfXyktPkluc3RhbmNlID09IExQVUFSVDEpIHsgICAgICAgXA0KLSAgICAgIHN3aXRjaCAoX19IQUxfUkNDX0dFVF9MUFVBUlQxX1NPVVJDRSgpKSB7ICAgICAgICAgICBcDQotICAgICAgICBjYXNlIFJDQ19MUFVBUlQxQ0xLU09VUkNFX1BDTEsxOiAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1BDTEsxOyAgICAgXA0KLSAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICBjYXNlIFJDQ19MUFVBUlQxQ0xLU09VUkNFX0hTSTogICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX0hTSTsgICAgICAgXA0KLSAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICBjYXNlIFJDQ19MUFVBUlQxQ0xLU09VUkNFX1NZU0NMSzogICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1NZU0NMSzsgICAgXA0KLSAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICBjYXNlIFJDQ19MUFVBUlQxQ0xLU09VUkNFX0xTRTogICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX0xTRTsgICAgICAgXA0KLSAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1VOREVGSU5FRDsgXA0KLSAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9VTkRFRklORUQ7ICAgICBcDQotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIH0gd2hpbGUgKDBVKQ0KLSNlbGlmIGRlZmluZWQoVUFSVDQpDQotI2RlZmluZSBVQVJUX0dFVENMT0NLU09VUkNFKF9fSEFORExFX18sIF9fQ0xPQ0tTT1VSQ0VfXykgIFwNCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBpZiAoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBVU0FSVDEpIHsgICAgICAgICAgICAgICBcDQotICAgICAgc3dpdGNoIChfX0hBTF9SQ0NfR0VUX1VTQVJUMV9TT1VSQ0UoKSkgeyAgICAgICAgICAgIFwNCi0gICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9QQ0xLMjogICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfUENMSzI7ICAgICBcDQotICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9IU0k6ICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfSFNJOyAgICAgICBcDQotICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9TWVNDTEs6ICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOyAgICBcDQotICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9MU0U6ICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfTFNFOyAgICAgICBcDQotICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyBcDQotICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICB9IGVsc2UgaWYgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gVVNBUlQyKSB7ICAgICAgICBcDQotICAgICAgc3dpdGNoIChfX0hBTF9SQ0NfR0VUX1VTQVJUMl9TT1VSQ0UoKSkgeyAgICAgICAgICAgIFwNCi0gICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9QQ0xLMTogICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfUENMSzE7ICAgICBcDQotICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9IU0k6ICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfSFNJOyAgICAgICBcDQotICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9TWVNDTEs6ICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOyAgICBcDQotICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9MU0U6ICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfTFNFOyAgICAgICBcDQotICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyBcDQotICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICB9IGVsc2UgaWYgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gVVNBUlQzKSB7ICAgICAgICBcDQotICAgICAgc3dpdGNoIChfX0hBTF9SQ0NfR0VUX1VTQVJUM19TT1VSQ0UoKSkgeyAgICAgICAgICAgIFwNCi0gICAgICAgIGNhc2UgUkNDX1VTQVJUM0NMS1NPVVJDRV9QQ0xLMTogICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfUENMSzE7ICAgICBcDQotICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgIGNhc2UgUkNDX1VTQVJUM0NMS1NPVVJDRV9IU0k6ICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfSFNJOyAgICAgICBcDQotICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgIGNhc2UgUkNDX1VTQVJUM0NMS1NPVVJDRV9TWVNDTEs6ICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOyAgICBcDQotICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgIGNhc2UgUkNDX1VTQVJUM0NMS1NPVVJDRV9MU0U6ICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfTFNFOyAgICAgICBcDQotICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyBcDQotICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICB9IGVsc2UgaWYgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gVUFSVDQpIHsgICAgICAgICBcDQotICAgICAgc3dpdGNoIChfX0hBTF9SQ0NfR0VUX1VBUlQ0X1NPVVJDRSgpKSB7ICAgICAgICAgICAgIFwNCi0gICAgICAgIGNhc2UgUkNDX1VBUlQ0Q0xLU09VUkNFX1BDTEsxOiAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfUENMSzE7ICAgICBcDQotICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgIGNhc2UgUkNDX1VBUlQ0Q0xLU09VUkNFX0hTSTogICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfSFNJOyAgICAgICBcDQotICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgIGNhc2UgUkNDX1VBUlQ0Q0xLU09VUkNFX1NZU0NMSzogICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOyAgICBcDQotICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgIGNhc2UgUkNDX1VBUlQ0Q0xLU09VUkNFX0xTRTogICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfTFNFOyAgICAgICBcDQotICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyBcDQotICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICB9IGVsc2UgaWYgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gTFBVQVJUMSkgeyAgICAgICBcDQotICAgICAgc3dpdGNoIChfX0hBTF9SQ0NfR0VUX0xQVUFSVDFfU09VUkNFKCkpIHsgICAgICAgICAgIFwNCi0gICAgICAgIGNhc2UgUkNDX0xQVUFSVDFDTEtTT1VSQ0VfUENMSzE6ICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfUENMSzE7ICAgICBcDQotICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgIGNhc2UgUkNDX0xQVUFSVDFDTEtTT1VSQ0VfSFNJOiAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfSFNJOyAgICAgICBcDQotICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgIGNhc2UgUkNDX0xQVUFSVDFDTEtTT1VSQ0VfU1lTQ0xLOiAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOyAgICBcDQotICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgIGNhc2UgUkNDX0xQVUFSVDFDTEtTT1VSQ0VfTFNFOiAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfTFNFOyAgICAgICBcDQotICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyBcDQotICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1VOREVGSU5FRDsgICAgIFwNCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgfSB3aGlsZSAoMFUpDQotI2Vsc2UNCi0jZGVmaW5lIFVBUlRfR0VUQ0xPQ0tTT1VSQ0UoX19IQU5ETEVfXywgX19DTE9DS1NPVVJDRV9fKSAgXA0KLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIGlmICgoX19IQU5ETEVfXyktPkluc3RhbmNlID09IFVTQVJUMSkgeyAgICAgICAgICAgICAgIFwNCi0gICAgICBzd2l0Y2ggKF9fSEFMX1JDQ19HRVRfVVNBUlQxX1NPVVJDRSgpKSB7ICAgICAgICAgICAgXA0KLSAgICAgICAgY2FzZSBSQ0NfVVNBUlQxQ0xLU09VUkNFX1BDTEsyOiAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9QQ0xLMjsgICAgIFwNCi0gICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgY2FzZSBSQ0NfVVNBUlQxQ0xLU09VUkNFX0hTSTogICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9IU0k7ICAgICAgIFwNCi0gICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgY2FzZSBSQ0NfVVNBUlQxQ0xLU09VUkNFX1NZU0NMSzogICAgICAgICAgICAgICAgICBcDQotICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9TWVNDTEs7ICAgIFwNCi0gICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgY2FzZSBSQ0NfVVNBUlQxQ0xLU09VUkNFX0xTRTogICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9MU0U7ICAgICAgIFwNCi0gICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9VTkRFRklORUQ7IFwNCi0gICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIH0gZWxzZSBpZiAoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBVU0FSVDIpIHsgICAgICAgIFwNCi0gICAgICBzd2l0Y2ggKF9fSEFMX1JDQ19HRVRfVVNBUlQyX1NPVVJDRSgpKSB7ICAgICAgICAgICAgXA0KLSAgICAgICAgY2FzZSBSQ0NfVVNBUlQyQ0xLU09VUkNFX1BDTEsxOiAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9QQ0xLMTsgICAgIFwNCi0gICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgY2FzZSBSQ0NfVVNBUlQyQ0xLU09VUkNFX0hTSTogICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9IU0k7ICAgICAgIFwNCi0gICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgY2FzZSBSQ0NfVVNBUlQyQ0xLU09VUkNFX1NZU0NMSzogICAgICAgICAgICAgICAgICBcDQotICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9TWVNDTEs7ICAgIFwNCi0gICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgY2FzZSBSQ0NfVVNBUlQyQ0xLU09VUkNFX0xTRTogICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9MU0U7ICAgICAgIFwNCi0gICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9VTkRFRklORUQ7IFwNCi0gICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIH0gZWxzZSBpZiAoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBVU0FSVDMpIHsgICAgICAgIFwNCi0gICAgICBzd2l0Y2ggKF9fSEFMX1JDQ19HRVRfVVNBUlQzX1NPVVJDRSgpKSB7ICAgICAgICAgICAgXA0KLSAgICAgICAgY2FzZSBSQ0NfVVNBUlQzQ0xLU09VUkNFX1BDTEsxOiAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9QQ0xLMTsgICAgIFwNCi0gICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgY2FzZSBSQ0NfVVNBUlQzQ0xLU09VUkNFX0hTSTogICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9IU0k7ICAgICAgIFwNCi0gICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgY2FzZSBSQ0NfVVNBUlQzQ0xLU09VUkNFX1NZU0NMSzogICAgICAgICAgICAgICAgICBcDQotICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9TWVNDTEs7ICAgIFwNCi0gICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgY2FzZSBSQ0NfVVNBUlQzQ0xLU09VUkNFX0xTRTogICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9MU0U7ICAgICAgIFwNCi0gICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9VTkRFRklORUQ7IFwNCi0gICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIH0gZWxzZSBpZiAoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBMUFVBUlQxKSB7ICAgICAgIFwNCi0gICAgICBzd2l0Y2ggKF9fSEFMX1JDQ19HRVRfTFBVQVJUMV9TT1VSQ0UoKSkgeyAgICAgICAgICAgXA0KLSAgICAgICAgY2FzZSBSQ0NfTFBVQVJUMUNMS1NPVVJDRV9QQ0xLMTogICAgICAgICAgICAgICAgICBcDQotICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9QQ0xLMTsgICAgIFwNCi0gICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgY2FzZSBSQ0NfTFBVQVJUMUNMS1NPVVJDRV9IU0k6ICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9IU0k7ICAgICAgIFwNCi0gICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgY2FzZSBSQ0NfTFBVQVJUMUNMS1NPVVJDRV9TWVNDTEs6ICAgICAgICAgICAgICAgICBcDQotICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9TWVNDTEs7ICAgIFwNCi0gICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgY2FzZSBSQ0NfTFBVQVJUMUNMS1NPVVJDRV9MU0U6ICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9MU0U7ICAgICAgIFwNCi0gICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9VTkRFRklORUQ7IFwNCi0gICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyAgICAgXA0KLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICB9IHdoaWxlICgwVSkNCi0jZW5kaWYgLyogVUFSVDUgKi8NCi0NCi0vKiogQGJyaWVmICBSZXBvcnQgdGhlIFVBUlQgbWFzayB0byBhcHBseSB0byByZXRyaWV2ZSB0aGUgcmVjZWl2ZWQgZGF0YQ0KLSAqICAgICAgICAgYWNjb3JkaW5nIHRvIHRoZSB3b3JkIGxlbmd0aCBhbmQgdG8gdGhlIHBhcml0eSBiaXRzIGFjdGl2YXRpb24uDQotICogQG5vdGUgICBJZiBQQ0UgPSAxLCB0aGUgcGFyaXR5IGJpdCBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIGRhdGEgZXh0cmFjdGVkDQotICogICAgICAgICBieSB0aGUgcmVjZXB0aW9uIEFQSSgpLg0KLSAqICAgICAgICAgVGhpcyBtYXNraW5nIG9wZXJhdGlvbiBpcyBub3QgY2FycmllZCBvdXQgaW4gdGhlIGNhc2Ugb2YNCi0gKiAgICAgICAgIERNQSB0cmFuc2ZlcnMuDQotICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuDQotICogQHJldHZhbCBOb25lLCB0aGUgbWFzayB0byBhcHBseSB0byBVQVJUIFJEUiByZWdpc3RlciBpcyBzdG9yZWQgaW4NCi0gKiAoX19IQU5ETEVfXyktPk1hc2sgZmllbGQuDQotICovDQotI2RlZmluZSBVQVJUX01BU0tfQ09NUFVUQVRJT04oX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBpZiAoKF9fSEFORExFX18pLT5Jbml0LldvcmRMZW5ndGggPT0gVUFSVF9XT1JETEVOR1RIXzlCKSB7ICAgICAgICBcDQotICAgICAgaWYgKChfX0hBTkRMRV9fKS0+SW5pdC5QYXJpdHkgPT0gVUFSVF9QQVJJVFlfTk9ORSkgeyAgICAgICAgICAgIFwNCi0gICAgICAgIChfX0hBTkRMRV9fKS0+TWFzayA9IDB4MDFGRlU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICAoX19IQU5ETEVfXyktPk1hc2sgPSAweDAwRkZVOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICB9IGVsc2UgaWYgKChfX0hBTkRMRV9fKS0+SW5pdC5Xb3JkTGVuZ3RoID09IFVBUlRfV09SRExFTkdUSF84QikgeyBcDQotICAgICAgaWYgKChfX0hBTkRMRV9fKS0+SW5pdC5QYXJpdHkgPT0gVUFSVF9QQVJJVFlfTk9ORSkgeyAgICAgICAgICAgIFwNCi0gICAgICAgIChfX0hBTkRMRV9fKS0+TWFzayA9IDB4MDBGRlU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICAoX19IQU5ETEVfXyktPk1hc2sgPSAweDAwN0ZVOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICB9IGVsc2UgaWYgKChfX0hBTkRMRV9fKS0+SW5pdC5Xb3JkTGVuZ3RoID09IFVBUlRfV09SRExFTkdUSF83QikgeyBcDQotICAgICAgaWYgKChfX0hBTkRMRV9fKS0+SW5pdC5QYXJpdHkgPT0gVUFSVF9QQVJJVFlfTk9ORSkgeyAgICAgICAgICAgIFwNCi0gICAgICAgIChfX0hBTkRMRV9fKS0+TWFzayA9IDB4MDA3RlU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICAoX19IQU5ETEVfXyktPk1hc2sgPSAweDAwM0ZVOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgKF9fSEFORExFX18pLT5NYXNrID0gMHgwMDAwVTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgfSB3aGlsZSAoMFUpDQotDQotLyoqDQotICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgZnJhbWUgbGVuZ3RoIGlzIHZhbGlkLg0KLSAqIEBwYXJhbSBfX0xFTkdUSF9fIFVBUlQgZnJhbWUgbGVuZ3RoLg0KLSAqIEByZXR2YWwgU0VUIChfX0xFTkdUSF9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19MRU5HVEhfXyBpcyBpbnZhbGlkKQ0KLSAqLw0KLSNkZWZpbmUgSVNfVUFSVF9XT1JEX0xFTkdUSChfX0xFTkdUSF9fKSAgICBcDQotICAoKChfX0xFTkdUSF9fKSA9PSBVQVJUX1dPUkRMRU5HVEhfN0IpIHx8IFwNCi0gICAoKF9fTEVOR1RIX18pID09IFVBUlRfV09SRExFTkdUSF84QikgfHwgXA0KLSAgICgoX19MRU5HVEhfXykgPT0gVUFSVF9XT1JETEVOR1RIXzlCKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCB3YWtlLXVwIGFkZHJlc3MgbGVuZ3RoIGlzIHZhbGlkLg0KLSAqIEBwYXJhbSBfX0FERFJFU1NfXyBVQVJUIHdha2UtdXAgYWRkcmVzcyBsZW5ndGguDQotICogQHJldHZhbCBTRVQgKF9fQUREUkVTU19fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19BRERSRVNTX18gaXMgaW52YWxpZCkNCi0gKi8NCi0jZGVmaW5lIElTX1VBUlRfQUREUkVTU0xFTkdUSF9ERVRFQ1QoX19BRERSRVNTX18pIFwNCi0gICgoKF9fQUREUkVTU19fKSA9PSBVQVJUX0FERFJFU1NfREVURUNUXzRCKSB8fCAgIFwNCi0gICAoKF9fQUREUkVTU19fKSA9PSBVQVJUX0FERFJFU1NfREVURUNUXzdCKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCBUWEZJRk8gdGhyZXNob2xkIGxldmVsIGlzIHZhbGlkLg0KLSAqIEBwYXJhbSBfX1RIUkVTSE9MRF9fIFVBUlQgVFhGSUZPIHRocmVzaG9sZCBsZXZlbC4NCi0gKiBAcmV0dmFsIFNFVCAoX19USFJFU0hPTERfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fVEhSRVNIT0xEX18gaXMgaW52YWxpZCkNCi0gKi8NCi0jZGVmaW5lIElTX1VBUlRfVFhGSUZPX1RIUkVTSE9MRChfX1RIUkVTSE9MRF9fKSAgICAgIFwNCi0gICgoKF9fVEhSRVNIT0xEX18pID09IFVBUlRfVFhGSUZPX1RIUkVTSE9MRF8xXzgpIHx8IFwNCi0gICAoKF9fVEhSRVNIT0xEX18pID09IFVBUlRfVFhGSUZPX1RIUkVTSE9MRF8xXzQpIHx8IFwNCi0gICAoKF9fVEhSRVNIT0xEX18pID09IFVBUlRfVFhGSUZPX1RIUkVTSE9MRF8xXzIpIHx8IFwNCi0gICAoKF9fVEhSRVNIT0xEX18pID09IFVBUlRfVFhGSUZPX1RIUkVTSE9MRF8zXzQpIHx8IFwNCi0gICAoKF9fVEhSRVNIT0xEX18pID09IFVBUlRfVFhGSUZPX1RIUkVTSE9MRF83XzgpIHx8IFwNCi0gICAoKF9fVEhSRVNIT0xEX18pID09IFVBUlRfVFhGSUZPX1RIUkVTSE9MRF84XzgpKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIFJYRklGTyB0aHJlc2hvbGQgbGV2ZWwgaXMgdmFsaWQuDQotICogQHBhcmFtIF9fVEhSRVNIT0xEX18gVUFSVCBSWEZJRk8gdGhyZXNob2xkIGxldmVsLg0KLSAqIEByZXR2YWwgU0VUIChfX1RIUkVTSE9MRF9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19USFJFU0hPTERfXyBpcyBpbnZhbGlkKQ0KLSAqLw0KLSNkZWZpbmUgSVNfVUFSVF9SWEZJRk9fVEhSRVNIT0xEKF9fVEhSRVNIT0xEX18pICAgICAgXA0KLSAgKCgoX19USFJFU0hPTERfXykgPT0gVUFSVF9SWEZJRk9fVEhSRVNIT0xEXzFfOCkgfHwgXA0KLSAgICgoX19USFJFU0hPTERfXykgPT0gVUFSVF9SWEZJRk9fVEhSRVNIT0xEXzFfNCkgfHwgXA0KLSAgICgoX19USFJFU0hPTERfXykgPT0gVUFSVF9SWEZJRk9fVEhSRVNIT0xEXzFfMikgfHwgXA0KLSAgICgoX19USFJFU0hPTERfXykgPT0gVUFSVF9SWEZJRk9fVEhSRVNIT0xEXzNfNCkgfHwgXA0KLSAgICgoX19USFJFU0hPTERfXykgPT0gVUFSVF9SWEZJRk9fVEhSRVNIT0xEXzdfOCkgfHwgXA0KLSAgICgoX19USFJFU0hPTERfXykgPT0gVUFSVF9SWEZJRk9fVEhSRVNIT0xEXzhfOCkpDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0jaWZkZWYgX19jcGx1c3BsdXMNCi19DQotI2VuZGlmDQotDQotI2VuZGlmIC8qIFNUTTMyRzR4eF9IQUxfVUFSVF9FWF9IICovDQorLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAZmlsZSAgICBzdG0zMmc0eHhfaGFsX3VhcnRfZXguaAorICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFVBUlQgSEFMIEV4dGVuZGVkIG1vZHVsZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBhdHRlbnRpb24KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRlcm1zIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUKKyAqIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4KKyAqIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcyB3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMkc0eHhfSEFMX1VBUlRfRVhfSAorI2RlZmluZSBTVE0zMkc0eHhfSEFMX1VBUlRfRVhfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnNHh4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzR4eF9IQUxfRHJpdmVyCisgKiBAeworICovCisKKy8qKiBAYWRkdG9ncm91cCBVQVJURXgKKyAqIEB7CisgKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVUFSVEV4X0V4cG9ydGVkX1R5cGVzIFVBUlRFeCBFeHBvcnRlZCBUeXBlcworICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiAgVUFSVCB3YWtlIHVwIGZyb20gc3RvcCBtb2RlIHBhcmFtZXRlcnMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50MzJfdCBXYWtlVXBFdmVudDsgLyohPCBTcGVjaWZpZXMgd2hpY2ggZXZlbnQgd2lsbCBhY3RpdmF0ZSB0aGUgV2FrZXVwIGZyb20KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3AgbW9kZSBmbGFnIChXVUYpLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgQHJlZiBVQVJUX1dha2VVcF9mcm9tX1N0b3BfU2VsZWN0aW9uLiBJZiBzZXQgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFVBUlRfV0FLRVVQX09OX0FERFJFU1MsIHRoZSB0d28gb3RoZXIgZmllbGRzIGJlbG93CisgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXN0IGJlIGZpbGxlZCB1cC4gKi8KKworICB1aW50MTZfdCBBZGRyZXNzTGVuZ3RoOyAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBhZGRyZXNzIGlzIDQgb3IgNy1iaXQgbG9uZy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVBUlRFeF9XYWtlVXBfQWRkcmVzc19MZW5ndGguICAqLworCisgIHVpbnQ4X3QgQWRkcmVzczsgLyohPCBVQVJUL1VTQVJUIG5vZGUgYWRkcmVzcyAoNy1iaXQgbG9uZyBtYXgpLiAqLworfSBVQVJUX1dha2VVcFR5cGVEZWY7CisKKy8qKgorICogQH0KKyAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBVQVJURXhfRXhwb3J0ZWRfQ29uc3RhbnRzIFVBUlRFeCBFeHBvcnRlZCBDb25zdGFudHMKKyAqIEB7CisgKi8KKworLyoqIEBkZWZncm91cCBVQVJURXhfV29yZF9MZW5ndGggVUFSVEV4IFdvcmQgTGVuZ3RoCisgKiBAeworICovCisjZGVmaW5lIFVBUlRfV09SRExFTkdUSF83QiBVU0FSVF9DUjFfTTEgLyohPCA3LWJpdCBsb25nIFVBUlQgZnJhbWUgKi8KKyNkZWZpbmUgVUFSVF9XT1JETEVOR1RIXzhCIDB4MDAwMDAwMDBVICAvKiE8IDgtYml0IGxvbmcgVUFSVCBmcmFtZSAqLworI2RlZmluZSBVQVJUX1dPUkRMRU5HVEhfOUIgVVNBUlRfQ1IxX00wIC8qITwgOS1iaXQgbG9uZyBVQVJUIGZyYW1lICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBVQVJURXhfV2FrZVVwX0FkZHJlc3NfTGVuZ3RoIFVBUlRFeCBXYWtlVXAgQWRkcmVzcyBMZW5ndGgKKyAqIEB7CisgKi8KKyNkZWZpbmUgVUFSVF9BRERSRVNTX0RFVEVDVF80QiAweDAwMDAwMDAwVSAvKiE8IDQtYml0IGxvbmcgd2FrZS11cCBhZGRyZXNzICovCisjZGVmaW5lIFVBUlRfQUREUkVTU19ERVRFQ1RfN0IgXAorICBVU0FSVF9DUjJfQURETTcgLyohPCA3LWJpdCBsb25nIHdha2UtdXAgYWRkcmVzcyAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVEV4X0ZJRk9fbW9kZSBVQVJURXggRklGTyBtb2RlCisgKiBAYnJpZWYgICAgVUFSVCBGSUZPIG1vZGUKKyAqIEB7CisgKi8KKyNkZWZpbmUgVUFSVF9GSUZPTU9ERV9ESVNBQkxFIDB4MDAwMDAwMDBVICAgICAvKiE8IEZJRk8gbW9kZSBkaXNhYmxlICovCisjZGVmaW5lIFVBUlRfRklGT01PREVfRU5BQkxFIFVTQVJUX0NSMV9GSUZPRU4gLyohPCBGSUZPIG1vZGUgZW5hYmxlICAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVEV4X1RYRklGT190aHJlc2hvbGRfbGV2ZWwgVUFSVEV4IFRYRklGTyB0aHJlc2hvbGQgbGV2ZWwKKyAqIEBicmllZiAgICBVQVJUIFRYRklGTyB0aHJlc2hvbGQgbGV2ZWwKKyAqIEB7CisgKi8KKyNkZWZpbmUgVUFSVF9UWEZJRk9fVEhSRVNIT0xEXzFfOCBcCisgIDB4MDAwMDAwMDBVIC8qITwgVFggRklGTyByZWFjaGVzIDEvOCBvZiBpdHMgZGVwdGggKi8KKyNkZWZpbmUgVUFSVF9UWEZJRk9fVEhSRVNIT0xEXzFfNCBcCisgIFVTQVJUX0NSM19UWEZUQ0ZHXzAgLyohPCBUWCBGSUZPIHJlYWNoZXMgMS80IG9mIGl0cyBkZXB0aCAqLworI2RlZmluZSBVQVJUX1RYRklGT19USFJFU0hPTERfMV8yIFwKKyAgVVNBUlRfQ1IzX1RYRlRDRkdfMSAvKiE8IFRYIEZJRk8gcmVhY2hlcyAxLzIgb2YgaXRzIGRlcHRoICovCisjZGVmaW5lIFVBUlRfVFhGSUZPX1RIUkVTSE9MRF8zXzQgXAorICAoVVNBUlRfQ1IzX1RYRlRDRkdfMCB8ICAgICAgICAgIFwKKyAgIFVTQVJUX0NSM19UWEZUQ0ZHXzEpIC8qITwgVFggRklGTyByZWFjaGVzIDMvNCBvZiBpdHMgZGVwdGggKi8KKyNkZWZpbmUgVUFSVF9UWEZJRk9fVEhSRVNIT0xEXzdfOCBcCisgIFVTQVJUX0NSM19UWEZUQ0ZHXzIgLyohPCBUWCBGSUZPIHJlYWNoZXMgNy84IG9mIGl0cyBkZXB0aCAqLworI2RlZmluZSBVQVJUX1RYRklGT19USFJFU0hPTERfOF84IFwKKyAgKFVTQVJUX0NSM19UWEZUQ0ZHXzIgfCBVU0FSVF9DUjNfVFhGVENGR18wKSAvKiE8IFRYIEZJRk8gYmVjb21lcyBlbXB0eSAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVEV4X1JYRklGT190aHJlc2hvbGRfbGV2ZWwgVUFSVEV4IFJYRklGTyB0aHJlc2hvbGQgbGV2ZWwKKyAqIEBicmllZiAgICBVQVJUIFJYRklGTyB0aHJlc2hvbGQgbGV2ZWwKKyAqIEB7CisgKi8KKyNkZWZpbmUgVUFSVF9SWEZJRk9fVEhSRVNIT0xEXzFfOCBcCisgIDB4MDAwMDAwMDBVIC8qITwgUlggRklGTyByZWFjaGVzIDEvOCBvZiBpdHMgZGVwdGggKi8KKyNkZWZpbmUgVUFSVF9SWEZJRk9fVEhSRVNIT0xEXzFfNCBcCisgIFVTQVJUX0NSM19SWEZUQ0ZHXzAgLyohPCBSWCBGSUZPIHJlYWNoZXMgMS80IG9mIGl0cyBkZXB0aCAqLworI2RlZmluZSBVQVJUX1JYRklGT19USFJFU0hPTERfMV8yIFwKKyAgVVNBUlRfQ1IzX1JYRlRDRkdfMSAvKiE8IFJYIEZJRk8gcmVhY2hlcyAxLzIgb2YgaXRzIGRlcHRoICovCisjZGVmaW5lIFVBUlRfUlhGSUZPX1RIUkVTSE9MRF8zXzQgXAorICAoVVNBUlRfQ1IzX1JYRlRDRkdfMCB8ICAgICAgICAgIFwKKyAgIFVTQVJUX0NSM19SWEZUQ0ZHXzEpIC8qITwgUlggRklGTyByZWFjaGVzIDMvNCBvZiBpdHMgZGVwdGggKi8KKyNkZWZpbmUgVUFSVF9SWEZJRk9fVEhSRVNIT0xEXzdfOCBcCisgIFVTQVJUX0NSM19SWEZUQ0ZHXzIgLyohPCBSWCBGSUZPIHJlYWNoZXMgNy84IG9mIGl0cyBkZXB0aCAqLworI2RlZmluZSBVQVJUX1JYRklGT19USFJFU0hPTERfOF84IFwKKyAgKFVTQVJUX0NSM19SWEZUQ0ZHXzIgfCBVU0FSVF9DUjNfUlhGVENGR18wKSAvKiE8IFJYIEZJRk8gYmVjb21lcyBmdWxsICovCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFVBUlRFeF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAqIEB7CisgKi8KKworLyoqIEBhZGR0b2dyb3VwIFVBUlRFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxCisgKiBAeworICovCisKKy8qIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlM0ODVFeF9Jbml0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIHVpbnQzMl90IFBvbGFyaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBBc3NlcnRpb25UaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBEZWFzc2VydGlvblRpbWUpOworCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBhZGR0b2dyb3VwIFVBUlRFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyCisgKiBAeworICovCisKK3ZvaWQgSEFMX1VBUlRFeF9XYWtldXBDYWxsYmFjayhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKKwordm9pZCBIQUxfVUFSVEV4X1J4Rmlmb0Z1bGxDYWxsYmFjayhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK3ZvaWQgSEFMX1VBUlRFeF9UeEZpZm9FbXB0eUNhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBhZGR0b2dyb3VwIFVBUlRFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzCisgKiBAeworICovCisKKy8qIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVEV4X1N0b3BNb2RlV2FrZVVwU291cmNlQ29uZmlnKAorICAgIFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIFVBUlRfV2FrZVVwVHlwZURlZiBXYWtlVXBTZWxlY3Rpb24pOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRFeF9FbmFibGVTdG9wTW9kZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJURXhfRGlzYWJsZVN0b3BNb2RlKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTXVsdGlQcm9jZXNzb3JFeF9BZGRyZXNzTGVuZ3RoX1NldCgKKyAgICBVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCB1aW50MzJfdCBBZGRyZXNzTGVuZ3RoKTsKKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRFeF9FbmFibGVGaWZvTW9kZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJURXhfRGlzYWJsZUZpZm9Nb2RlKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRFeF9TZXRUeEZpZm9UaHJlc2hvbGQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRocmVzaG9sZCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVEV4X1NldFJ4Rmlmb1RocmVzaG9sZChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGhyZXNob2xkKTsKKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRFeF9SZWNlaXZlVG9JZGxlKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgKlJ4TGVuLCB1aW50MzJfdCBUaW1lb3V0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJURXhfUmVjZWl2ZVRvSWRsZV9JVChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJURXhfUmVjZWl2ZVRvSWRsZV9ETUEoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpOworCitIQUxfVUFSVF9SeEV2ZW50VHlwZVR5cGVEZWYgSEFMX1VBUlRFeF9HZXRSeEV2ZW50VHlwZSgKKyAgICBjb25zdCBVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBVQVJURXhfUHJpdmF0ZV9NYWNyb3MgVUFSVEV4IFByaXZhdGUgTWFjcm9zCisgKiBAeworICovCisKKy8qKiBAYnJpZWYgIFJlcG9ydCB0aGUgVUFSVCBjbG9jayBzb3VyY2UuCisgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4KKyAqIEBwYXJhbSAgX19DTE9DS1NPVVJDRV9fIG91dHB1dCB2YXJpYWJsZS4KKyAqIEByZXR2YWwgVUFSVCBjbG9ja2luZyBzb3VyY2UsIHdyaXR0ZW4gaW4gX19DTE9DS1NPVVJDRV9fLgorICovCisjaWYgZGVmaW5lZChVQVJUNSkgJiYgZGVmaW5lZChVU0FSVDMpCisjZGVmaW5lIFVBUlRfR0VUQ0xPQ0tTT1VSQ0UoX19IQU5ETEVfXywgX19DTE9DS1NPVVJDRV9fKSAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBVU0FSVDEpIHsgICAgICAgICAgICAgICBcCisgICAgICBzd2l0Y2ggKF9fSEFMX1JDQ19HRVRfVVNBUlQxX1NPVVJDRSgpKSB7ICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfUENMSzI6ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfUENMSzI7ICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfSFNJOiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfSFNJOyAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfU1lTQ0xLOiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOyAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfTFNFOiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfTFNFOyAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgaWYgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gVVNBUlQyKSB7ICAgICAgICBcCisgICAgICBzd2l0Y2ggKF9fSEFMX1JDQ19HRVRfVVNBUlQyX1NPVVJDRSgpKSB7ICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDJDTEtTT1VSQ0VfUENMSzE6ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfUENMSzE7ICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDJDTEtTT1VSQ0VfSFNJOiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfSFNJOyAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDJDTEtTT1VSQ0VfU1lTQ0xLOiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOyAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDJDTEtTT1VSQ0VfTFNFOiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfTFNFOyAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgaWYgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gVVNBUlQzKSB7ICAgICAgICBcCisgICAgICBzd2l0Y2ggKF9fSEFMX1JDQ19HRVRfVVNBUlQzX1NPVVJDRSgpKSB7ICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDNDTEtTT1VSQ0VfUENMSzE6ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfUENMSzE7ICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDNDTEtTT1VSQ0VfSFNJOiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfSFNJOyAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDNDTEtTT1VSQ0VfU1lTQ0xLOiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOyAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDNDTEtTT1VSQ0VfTFNFOiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfTFNFOyAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgaWYgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gVUFSVDQpIHsgICAgICAgICBcCisgICAgICBzd2l0Y2ggKF9fSEFMX1JDQ19HRVRfVUFSVDRfU09VUkNFKCkpIHsgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VQVJUNENMS1NPVVJDRV9QQ0xLMTogICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfUENMSzE7ICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VQVJUNENMS1NPVVJDRV9IU0k6ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfSFNJOyAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VQVJUNENMS1NPVVJDRV9TWVNDTEs6ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOyAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VQVJUNENMS1NPVVJDRV9MU0U6ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfTFNFOyAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgaWYgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gVUFSVDUpIHsgICAgICAgICBcCisgICAgICBzd2l0Y2ggKF9fSEFMX1JDQ19HRVRfVUFSVDVfU09VUkNFKCkpIHsgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VQVJUNUNMS1NPVVJDRV9QQ0xLMTogICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfUENMSzE7ICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VQVJUNUNMS1NPVVJDRV9IU0k6ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfSFNJOyAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VQVJUNUNMS1NPVVJDRV9TWVNDTEs6ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOyAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VQVJUNUNMS1NPVVJDRV9MU0U6ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfTFNFOyAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgaWYgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gTFBVQVJUMSkgeyAgICAgICBcCisgICAgICBzd2l0Y2ggKF9fSEFMX1JDQ19HRVRfTFBVQVJUMV9TT1VSQ0UoKSkgeyAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19MUFVBUlQxQ0xLU09VUkNFX1BDTEsxOiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfUENMSzE7ICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19MUFVBUlQxQ0xLU09VUkNFX0hTSTogICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfSFNJOyAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19MUFVBUlQxQ0xLU09VUkNFX1NZU0NMSzogICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOyAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19MUFVBUlQxQ0xLU09VUkNFX0xTRTogICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfTFNFOyAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMFUpCisjZWxpZiBkZWZpbmVkKFVBUlQ1KSAmJiAhZGVmaW5lZChVU0FSVDMpCisjZGVmaW5lIFVBUlRfR0VUQ0xPQ0tTT1VSQ0UoX19IQU5ETEVfXywgX19DTE9DS1NPVVJDRV9fKSAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBVU0FSVDEpIHsgICAgICAgICAgICAgICBcCisgICAgICBzd2l0Y2ggKF9fSEFMX1JDQ19HRVRfVVNBUlQxX1NPVVJDRSgpKSB7ICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfUENMSzI6ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfUENMSzI7ICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfSFNJOiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfSFNJOyAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfU1lTQ0xLOiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOyAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfTFNFOiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfTFNFOyAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgaWYgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gVVNBUlQyKSB7ICAgICAgICBcCisgICAgICBzd2l0Y2ggKF9fSEFMX1JDQ19HRVRfVVNBUlQyX1NPVVJDRSgpKSB7ICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDJDTEtTT1VSQ0VfUENMSzE6ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfUENMSzE7ICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDJDTEtTT1VSQ0VfSFNJOiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfSFNJOyAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDJDTEtTT1VSQ0VfU1lTQ0xLOiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOyAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDJDTEtTT1VSQ0VfTFNFOiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfTFNFOyAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgaWYgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gVUFSVDQpIHsgICAgICAgICBcCisgICAgICBzd2l0Y2ggKF9fSEFMX1JDQ19HRVRfVUFSVDRfU09VUkNFKCkpIHsgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VQVJUNENMS1NPVVJDRV9QQ0xLMTogICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfUENMSzE7ICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VQVJUNENMS1NPVVJDRV9IU0k6ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfSFNJOyAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VQVJUNENMS1NPVVJDRV9TWVNDTEs6ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOyAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VQVJUNENMS1NPVVJDRV9MU0U6ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfTFNFOyAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgaWYgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gVUFSVDUpIHsgICAgICAgICBcCisgICAgICBzd2l0Y2ggKF9fSEFMX1JDQ19HRVRfVUFSVDVfU09VUkNFKCkpIHsgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VQVJUNUNMS1NPVVJDRV9QQ0xLMTogICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfUENMSzE7ICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VQVJUNUNMS1NPVVJDRV9IU0k6ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfSFNJOyAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VQVJUNUNMS1NPVVJDRV9TWVNDTEs6ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOyAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VQVJUNUNMS1NPVVJDRV9MU0U6ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfTFNFOyAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgaWYgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gTFBVQVJUMSkgeyAgICAgICBcCisgICAgICBzd2l0Y2ggKF9fSEFMX1JDQ19HRVRfTFBVQVJUMV9TT1VSQ0UoKSkgeyAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19MUFVBUlQxQ0xLU09VUkNFX1BDTEsxOiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfUENMSzE7ICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19MUFVBUlQxQ0xLU09VUkNFX0hTSTogICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfSFNJOyAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19MUFVBUlQxQ0xLU09VUkNFX1NZU0NMSzogICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOyAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19MUFVBUlQxQ0xLU09VUkNFX0xTRTogICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfTFNFOyAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMFUpCisjZWxpZiBkZWZpbmVkKFVBUlQ0KSAmJiBkZWZpbmVkKFVTQVJUMykKKyNkZWZpbmUgVUFSVF9HRVRDTE9DS1NPVVJDRShfX0hBTkRMRV9fLCBfX0NMT0NLU09VUkNFX18pICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoX19IQU5ETEVfXyktPkluc3RhbmNlID09IFVTQVJUMSkgeyAgICAgICAgICAgICAgIFwKKyAgICAgIHN3aXRjaCAoX19IQUxfUkNDX0dFVF9VU0FSVDFfU09VUkNFKCkpIHsgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9QQ0xLMjogICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9QQ0xLMjsgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9IU0k6ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9IU0k7ICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9TWVNDTEs6ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9TWVNDTEs7ICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9MU0U6ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9MU0U7ICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9VTkRFRklORUQ7IFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSBpZiAoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBVU0FSVDIpIHsgICAgICAgIFwKKyAgICAgIHN3aXRjaCAoX19IQUxfUkNDX0dFVF9VU0FSVDJfU09VUkNFKCkpIHsgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9QQ0xLMTogICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9QQ0xLMTsgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9IU0k6ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9IU0k7ICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9TWVNDTEs6ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9TWVNDTEs7ICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9MU0U6ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9MU0U7ICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9VTkRFRklORUQ7IFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSBpZiAoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBVU0FSVDMpIHsgICAgICAgIFwKKyAgICAgIHN3aXRjaCAoX19IQUxfUkNDX0dFVF9VU0FSVDNfU09VUkNFKCkpIHsgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUM0NMS1NPVVJDRV9QQ0xLMTogICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9QQ0xLMTsgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUM0NMS1NPVVJDRV9IU0k6ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9IU0k7ICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUM0NMS1NPVVJDRV9TWVNDTEs6ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9TWVNDTEs7ICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUM0NMS1NPVVJDRV9MU0U6ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9MU0U7ICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9VTkRFRklORUQ7IFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSBpZiAoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBVQVJUNCkgeyAgICAgICAgIFwKKyAgICAgIHN3aXRjaCAoX19IQUxfUkNDX0dFVF9VQVJUNF9TT1VSQ0UoKSkgeyAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VBUlQ0Q0xLU09VUkNFX1BDTEsxOiAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9QQ0xLMTsgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VBUlQ0Q0xLU09VUkNFX0hTSTogICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9IU0k7ICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VBUlQ0Q0xLU09VUkNFX1NZU0NMSzogICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9TWVNDTEs7ICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VBUlQ0Q0xLU09VUkNFX0xTRTogICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9MU0U7ICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9VTkRFRklORUQ7IFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSBpZiAoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBMUFVBUlQxKSB7ICAgICAgIFwKKyAgICAgIHN3aXRjaCAoX19IQUxfUkNDX0dFVF9MUFVBUlQxX1NPVVJDRSgpKSB7ICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX0xQVUFSVDFDTEtTT1VSQ0VfUENMSzE6ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9QQ0xLMTsgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX0xQVUFSVDFDTEtTT1VSQ0VfSFNJOiAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9IU0k7ICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX0xQVUFSVDFDTEtTT1VSQ0VfU1lTQ0xLOiAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9TWVNDTEs7ICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX0xQVUFSVDFDTEtTT1VSQ0VfTFNFOiAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9MU0U7ICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9VTkRFRklORUQ7IFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9VTkRFRklORUQ7ICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwVSkKKyNlbGlmIGRlZmluZWQoVUFSVDQpICYmICFkZWZpbmVkKFVTQVJUMykKKyNkZWZpbmUgVUFSVF9HRVRDTE9DS1NPVVJDRShfX0hBTkRMRV9fLCBfX0NMT0NLU09VUkNFX18pICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoX19IQU5ETEVfXyktPkluc3RhbmNlID09IFVTQVJUMSkgeyAgICAgICAgICAgICAgIFwKKyAgICAgIHN3aXRjaCAoX19IQUxfUkNDX0dFVF9VU0FSVDFfU09VUkNFKCkpIHsgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9QQ0xLMjogICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9QQ0xLMjsgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9IU0k6ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9IU0k7ICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9TWVNDTEs6ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9TWVNDTEs7ICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9MU0U6ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9MU0U7ICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9VTkRFRklORUQ7IFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSBpZiAoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBVU0FSVDIpIHsgICAgICAgIFwKKyAgICAgIHN3aXRjaCAoX19IQUxfUkNDX0dFVF9VU0FSVDJfU09VUkNFKCkpIHsgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9QQ0xLMTogICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9QQ0xLMTsgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9IU0k6ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9IU0k7ICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9TWVNDTEs6ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9TWVNDTEs7ICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9MU0U6ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9MU0U7ICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9VTkRFRklORUQ7IFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSBpZiAoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBVQVJUNCkgeyAgICAgICAgIFwKKyAgICAgIHN3aXRjaCAoX19IQUxfUkNDX0dFVF9VQVJUNF9TT1VSQ0UoKSkgeyAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VBUlQ0Q0xLU09VUkNFX1BDTEsxOiAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9QQ0xLMTsgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VBUlQ0Q0xLU09VUkNFX0hTSTogICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9IU0k7ICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VBUlQ0Q0xLU09VUkNFX1NZU0NMSzogICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9TWVNDTEs7ICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VBUlQ0Q0xLU09VUkNFX0xTRTogICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9MU0U7ICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9VTkRFRklORUQ7IFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSBpZiAoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBMUFVBUlQxKSB7ICAgICAgIFwKKyAgICAgIHN3aXRjaCAoX19IQUxfUkNDX0dFVF9MUFVBUlQxX1NPVVJDRSgpKSB7ICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX0xQVUFSVDFDTEtTT1VSQ0VfUENMSzE6ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9QQ0xLMTsgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX0xQVUFSVDFDTEtTT1VSQ0VfSFNJOiAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9IU0k7ICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX0xQVUFSVDFDTEtTT1VSQ0VfU1lTQ0xLOiAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9TWVNDTEs7ICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX0xQVUFSVDFDTEtTT1VSQ0VfTFNFOiAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9MU0U7ICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9VTkRFRklORUQ7IFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9VTkRFRklORUQ7ICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwVSkKKyNlbGlmIGRlZmluZWQoVVNBUlQzKQorI2RlZmluZSBVQVJUX0dFVENMT0NLU09VUkNFKF9fSEFORExFX18sIF9fQ0xPQ0tTT1VSQ0VfXykgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gVVNBUlQxKSB7ICAgICAgICAgICAgICAgXAorICAgICAgc3dpdGNoIChfX0hBTF9SQ0NfR0VUX1VTQVJUMV9TT1VSQ0UoKSkgeyAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBSQ0NfVVNBUlQxQ0xLU09VUkNFX1BDTEsyOiAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1BDTEsyOyAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBSQ0NfVVNBUlQxQ0xLU09VUkNFX0hTSTogICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX0hTSTsgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBSQ0NfVVNBUlQxQ0xLU09VUkNFX1NZU0NMSzogICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1NZU0NMSzsgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBSQ0NfVVNBUlQxQ0xLU09VUkNFX0xTRTogICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX0xTRTsgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1VOREVGSU5FRDsgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIGlmICgoX19IQU5ETEVfXyktPkluc3RhbmNlID09IFVTQVJUMikgeyAgICAgICAgXAorICAgICAgc3dpdGNoIChfX0hBTF9SQ0NfR0VUX1VTQVJUMl9TT1VSQ0UoKSkgeyAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBSQ0NfVVNBUlQyQ0xLU09VUkNFX1BDTEsxOiAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1BDTEsxOyAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBSQ0NfVVNBUlQyQ0xLU09VUkNFX0hTSTogICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX0hTSTsgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBSQ0NfVVNBUlQyQ0xLU09VUkNFX1NZU0NMSzogICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1NZU0NMSzsgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBSQ0NfVVNBUlQyQ0xLU09VUkNFX0xTRTogICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX0xTRTsgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1VOREVGSU5FRDsgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIGlmICgoX19IQU5ETEVfXyktPkluc3RhbmNlID09IFVTQVJUMykgeyAgICAgICAgXAorICAgICAgc3dpdGNoIChfX0hBTF9SQ0NfR0VUX1VTQVJUM19TT1VSQ0UoKSkgeyAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBSQ0NfVVNBUlQzQ0xLU09VUkNFX1BDTEsxOiAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1BDTEsxOyAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBSQ0NfVVNBUlQzQ0xLU09VUkNFX0hTSTogICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX0hTSTsgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBSQ0NfVVNBUlQzQ0xLU09VUkNFX1NZU0NMSzogICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1NZU0NMSzsgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBSQ0NfVVNBUlQzQ0xLU09VUkNFX0xTRTogICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX0xTRTsgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1VOREVGSU5FRDsgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIGlmICgoX19IQU5ETEVfXyktPkluc3RhbmNlID09IExQVUFSVDEpIHsgICAgICAgXAorICAgICAgc3dpdGNoIChfX0hBTF9SQ0NfR0VUX0xQVUFSVDFfU09VUkNFKCkpIHsgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBSQ0NfTFBVQVJUMUNMS1NPVVJDRV9QQ0xLMTogICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1BDTEsxOyAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBSQ0NfTFBVQVJUMUNMS1NPVVJDRV9IU0k6ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX0hTSTsgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBSQ0NfTFBVQVJUMUNMS1NPVVJDRV9TWVNDTEs6ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1NZU0NMSzsgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBSQ0NfTFBVQVJUMUNMS1NPVVJDRV9MU0U6ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX0xTRTsgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1VOREVGSU5FRDsgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1VOREVGSU5FRDsgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDBVKQorI2Vsc2UKKyNkZWZpbmUgVUFSVF9HRVRDTE9DS1NPVVJDRShfX0hBTkRMRV9fLCBfX0NMT0NLU09VUkNFX18pICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoX19IQU5ETEVfXyktPkluc3RhbmNlID09IFVTQVJUMSkgeyAgICAgICAgICAgICAgIFwKKyAgICAgIHN3aXRjaCAoX19IQUxfUkNDX0dFVF9VU0FSVDFfU09VUkNFKCkpIHsgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9QQ0xLMjogICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9QQ0xLMjsgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9IU0k6ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9IU0k7ICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9TWVNDTEs6ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9TWVNDTEs7ICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9MU0U6ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9MU0U7ICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9VTkRFRklORUQ7IFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSBpZiAoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBVU0FSVDIpIHsgICAgICAgIFwKKyAgICAgIHN3aXRjaCAoX19IQUxfUkNDX0dFVF9VU0FSVDJfU09VUkNFKCkpIHsgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9QQ0xLMTogICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9QQ0xLMTsgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9IU0k6ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9IU0k7ICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9TWVNDTEs6ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9TWVNDTEs7ICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9MU0U6ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9MU0U7ICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9VTkRFRklORUQ7IFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSBpZiAoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBMUFVBUlQxKSB7ICAgICAgIFwKKyAgICAgIHN3aXRjaCAoX19IQUxfUkNDX0dFVF9MUFVBUlQxX1NPVVJDRSgpKSB7ICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX0xQVUFSVDFDTEtTT1VSQ0VfUENMSzE6ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9QQ0xLMTsgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX0xQVUFSVDFDTEtTT1VSQ0VfSFNJOiAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9IU0k7ICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX0xQVUFSVDFDTEtTT1VSQ0VfU1lTQ0xLOiAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9TWVNDTEs7ICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX0xQVUFSVDFDTEtTT1VSQ0VfTFNFOiAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9MU0U7ICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9VTkRFRklORUQ7IFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9VTkRFRklORUQ7ICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwVSkKKyNlbmRpZiAvKiBVQVJUNSAmJiAhVVNBUlQzICovCisKKy8qKiBAYnJpZWYgIFJlcG9ydCB0aGUgVUFSVCBtYXNrIHRvIGFwcGx5IHRvIHJldHJpZXZlIHRoZSByZWNlaXZlZCBkYXRhCisgKiAgICAgICAgIGFjY29yZGluZyB0byB0aGUgd29yZCBsZW5ndGggYW5kIHRvIHRoZSBwYXJpdHkgYml0cyBhY3RpdmF0aW9uLgorICogQG5vdGUgICBJZiBQQ0UgPSAxLCB0aGUgcGFyaXR5IGJpdCBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIGRhdGEgZXh0cmFjdGVkCisgKiAgICAgICAgIGJ5IHRoZSByZWNlcHRpb24gQVBJKCkuCisgKiAgICAgICAgIFRoaXMgbWFza2luZyBvcGVyYXRpb24gaXMgbm90IGNhcnJpZWQgb3V0IGluIHRoZSBjYXNlIG9mCisgKiAgICAgICAgIERNQSB0cmFuc2ZlcnMuCisgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4KKyAqIEByZXR2YWwgTm9uZSwgdGhlIG1hc2sgdG8gYXBwbHkgdG8gVUFSVCBSRFIgcmVnaXN0ZXIgaXMgc3RvcmVkIGluCisgKiAoX19IQU5ETEVfXyktPk1hc2sgZmllbGQuCisgKi8KKyNkZWZpbmUgVUFSVF9NQVNLX0NPTVBVVEFUSU9OKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoX19IQU5ETEVfXyktPkluaXQuV29yZExlbmd0aCA9PSBVQVJUX1dPUkRMRU5HVEhfOUIpIHsgICAgICAgIFwKKyAgICAgIGlmICgoX19IQU5ETEVfXyktPkluaXQuUGFyaXR5ID09IFVBUlRfUEFSSVRZX05PTkUpIHsgICAgICAgICAgICBcCisgICAgICAgIChfX0hBTkRMRV9fKS0+TWFzayA9IDB4MDFGRlU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKF9fSEFORExFX18pLT5NYXNrID0gMHgwMEZGVTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSBpZiAoKF9fSEFORExFX18pLT5Jbml0LldvcmRMZW5ndGggPT0gVUFSVF9XT1JETEVOR1RIXzhCKSB7IFwKKyAgICAgIGlmICgoX19IQU5ETEVfXyktPkluaXQuUGFyaXR5ID09IFVBUlRfUEFSSVRZX05PTkUpIHsgICAgICAgICAgICBcCisgICAgICAgIChfX0hBTkRMRV9fKS0+TWFzayA9IDB4MDBGRlU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKF9fSEFORExFX18pLT5NYXNrID0gMHgwMDdGVTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSBpZiAoKF9fSEFORExFX18pLT5Jbml0LldvcmRMZW5ndGggPT0gVUFSVF9XT1JETEVOR1RIXzdCKSB7IFwKKyAgICAgIGlmICgoX19IQU5ETEVfXyktPkluaXQuUGFyaXR5ID09IFVBUlRfUEFSSVRZX05PTkUpIHsgICAgICAgICAgICBcCisgICAgICAgIChfX0hBTkRMRV9fKS0+TWFzayA9IDB4MDA3RlU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKF9fSEFORExFX18pLT5NYXNrID0gMHgwMDNGVTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIChfX0hBTkRMRV9fKS0+TWFzayA9IDB4MDAwMFU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwVSkKKworLyoqCisgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCBmcmFtZSBsZW5ndGggaXMgdmFsaWQuCisgKiBAcGFyYW0gX19MRU5HVEhfXyBVQVJUIGZyYW1lIGxlbmd0aC4KKyAqIEByZXR2YWwgU0VUIChfX0xFTkdUSF9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19MRU5HVEhfXyBpcyBpbnZhbGlkKQorICovCisjZGVmaW5lIElTX1VBUlRfV09SRF9MRU5HVEgoX19MRU5HVEhfXykgICAgXAorICAoKChfX0xFTkdUSF9fKSA9PSBVQVJUX1dPUkRMRU5HVEhfN0IpIHx8IFwKKyAgICgoX19MRU5HVEhfXykgPT0gVUFSVF9XT1JETEVOR1RIXzhCKSB8fCBcCisgICAoKF9fTEVOR1RIX18pID09IFVBUlRfV09SRExFTkdUSF85QikpCisKKy8qKgorICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgd2FrZS11cCBhZGRyZXNzIGxlbmd0aCBpcyB2YWxpZC4KKyAqIEBwYXJhbSBfX0FERFJFU1NfXyBVQVJUIHdha2UtdXAgYWRkcmVzcyBsZW5ndGguCisgKiBAcmV0dmFsIFNFVCAoX19BRERSRVNTX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0FERFJFU1NfXyBpcyBpbnZhbGlkKQorICovCisjZGVmaW5lIElTX1VBUlRfQUREUkVTU0xFTkdUSF9ERVRFQ1QoX19BRERSRVNTX18pIFwKKyAgKCgoX19BRERSRVNTX18pID09IFVBUlRfQUREUkVTU19ERVRFQ1RfNEIpIHx8ICAgXAorICAgKChfX0FERFJFU1NfXykgPT0gVUFSVF9BRERSRVNTX0RFVEVDVF83QikpCisKKy8qKgorICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgVFhGSUZPIHRocmVzaG9sZCBsZXZlbCBpcyB2YWxpZC4KKyAqIEBwYXJhbSBfX1RIUkVTSE9MRF9fIFVBUlQgVFhGSUZPIHRocmVzaG9sZCBsZXZlbC4KKyAqIEByZXR2YWwgU0VUIChfX1RIUkVTSE9MRF9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19USFJFU0hPTERfXyBpcyBpbnZhbGlkKQorICovCisjZGVmaW5lIElTX1VBUlRfVFhGSUZPX1RIUkVTSE9MRChfX1RIUkVTSE9MRF9fKSAgICAgIFwKKyAgKCgoX19USFJFU0hPTERfXykgPT0gVUFSVF9UWEZJRk9fVEhSRVNIT0xEXzFfOCkgfHwgXAorICAgKChfX1RIUkVTSE9MRF9fKSA9PSBVQVJUX1RYRklGT19USFJFU0hPTERfMV80KSB8fCBcCisgICAoKF9fVEhSRVNIT0xEX18pID09IFVBUlRfVFhGSUZPX1RIUkVTSE9MRF8xXzIpIHx8IFwKKyAgICgoX19USFJFU0hPTERfXykgPT0gVUFSVF9UWEZJRk9fVEhSRVNIT0xEXzNfNCkgfHwgXAorICAgKChfX1RIUkVTSE9MRF9fKSA9PSBVQVJUX1RYRklGT19USFJFU0hPTERfN184KSB8fCBcCisgICAoKF9fVEhSRVNIT0xEX18pID09IFVBUlRfVFhGSUZPX1RIUkVTSE9MRF84XzgpKQorCisvKioKKyAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIFJYRklGTyB0aHJlc2hvbGQgbGV2ZWwgaXMgdmFsaWQuCisgKiBAcGFyYW0gX19USFJFU0hPTERfXyBVQVJUIFJYRklGTyB0aHJlc2hvbGQgbGV2ZWwuCisgKiBAcmV0dmFsIFNFVCAoX19USFJFU0hPTERfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fVEhSRVNIT0xEX18gaXMgaW52YWxpZCkKKyAqLworI2RlZmluZSBJU19VQVJUX1JYRklGT19USFJFU0hPTEQoX19USFJFU0hPTERfXykgICAgICBcCisgICgoKF9fVEhSRVNIT0xEX18pID09IFVBUlRfUlhGSUZPX1RIUkVTSE9MRF8xXzgpIHx8IFwKKyAgICgoX19USFJFU0hPTERfXykgPT0gVUFSVF9SWEZJRk9fVEhSRVNIT0xEXzFfNCkgfHwgXAorICAgKChfX1RIUkVTSE9MRF9fKSA9PSBVQVJUX1JYRklGT19USFJFU0hPTERfMV8yKSB8fCBcCisgICAoKF9fVEhSRVNIT0xEX18pID09IFVBUlRfUlhGSUZPX1RIUkVTSE9MRF8zXzQpIHx8IFwKKyAgICgoX19USFJFU0hPTERfXykgPT0gVUFSVF9SWEZJRk9fVEhSRVNIT0xEXzdfOCkgfHwgXAorICAgKChfX1RIUkVTSE9MRF9fKSA9PSBVQVJUX1JYRklGT19USFJFU0hPTERfOF84KSkKKworLyoqCisgKiBAfQorICovCisKKy8qIFByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyRzR4eF9IQUxfVUFSVF9FWF9IICovCmRpZmYgLS1naXQgYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9sbF9hZGMuaCBiL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9JbmMvc3RtMzJnNHh4X2xsX2FkYy5oCmluZGV4IDk3OGI5NWMuLjUxYjgwYjAgMTAwNjQ0Ci0tLSBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9JbmMvc3RtMzJnNHh4X2xsX2FkYy5oCisrKyBiL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9JbmMvc3RtMzJnNHh4X2xsX2FkYy5oCkBAIC0xLDk5MDQgKzEsOTcwMCBAQAotLyoqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEBmaWxlICAgIHN0bTMyZzR4eF9sbF9hZGMuaA0KLSAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtDQotICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgQURDIExMIG1vZHVsZS4NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQGF0dGVudGlvbg0KLSAqDQotICogQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KLSAqDQotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0ZXJtcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlDQotICogaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc29mdHdhcmUgY29tcG9uZW50Lg0KLSAqIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcyB3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLg0KLSAqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqLw0KLQ0KLS8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotI2lmbmRlZiBTVE0zMkc0eHhfTExfQURDX0gNCi0jZGVmaW5lIFNUTTMyRzR4eF9MTF9BRENfSA0KLQ0KLSNpZmRlZiBfX2NwbHVzcGx1cw0KLWV4dGVybiAiQyIgew0KLSNlbmRpZg0KLQ0KLS8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotI2luY2x1ZGUgInN0bTMyZzR4eC5oIg0KLQ0KLS8qKiBAYWRkdG9ncm91cCBTVE0zMkc0eHhfTExfRHJpdmVyDQotICogQHsNCi0gKi8NCi0NCi0jaWYgZGVmaW5lZChBREMxKSB8fCBkZWZpbmVkKEFEQzIpIHx8IGRlZmluZWQoQURDMykgfHwgZGVmaW5lZChBREM0KSB8fCBcDQotICAgIGRlZmluZWQoQURDNSkNCi0NCi0vKiogQGRlZmdyb3VwIEFEQ19MTCBBREMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0NCi0vKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgQURDX0xMX1ByaXZhdGVfQ29uc3RhbnRzIEFEQyBQcml2YXRlIENvbnN0YW50cw0KLSAqIEB7DQotICovDQotDQotLyogSW50ZXJuYWwgbWFzayBmb3IgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0vKiBUbyBzZWxlY3QgaW50byBsaXRlcmFsIExMX0FEQ19SRUdfUkFOS194IHRoZSByZWxldmFudCBiaXRzIGZvcjogICAgICAgICAgICAqLw0KLS8qIC0gc2VxdWVuY2VyIHJlZ2lzdGVyIG9mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotLyogLSBzZXF1ZW5jZXIgcmFuayBiaXRzIHBvc2l0aW9uIGludG8gdGhlIHNlbGVjdGVkIHJlZ2lzdGVyICAgICAgICAgICAgICAgICAgKi8NCi0NCi0vKiBJbnRlcm5hbCByZWdpc3RlciBvZmZzZXQgZm9yIEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBjb25maWd1cmF0aW9uICovDQotLyogKG9mZnNldCBwbGFjZWQgaW50byBhIHNwYXJlIGFyZWEgb2YgbGl0ZXJhbCBkZWZpbml0aW9uKSAqLw0KLSNkZWZpbmUgQURDX1NRUjFfUkVHT0ZGU0VUICgweDAwMDAwMDAwVUwpDQotI2RlZmluZSBBRENfU1FSMl9SRUdPRkZTRVQgKDB4MDAwMDAxMDBVTCkNCi0jZGVmaW5lIEFEQ19TUVIzX1JFR09GRlNFVCAoMHgwMDAwMDIwMFVMKQ0KLSNkZWZpbmUgQURDX1NRUjRfUkVHT0ZGU0VUICgweDAwMDAwMzAwVUwpDQotDQotI2RlZmluZSBBRENfUkVHX1NRUlhfUkVHT0ZGU0VUX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19TUVIxX1JFR09GRlNFVCB8IEFEQ19TUVIyX1JFR09GRlNFVCB8IEFEQ19TUVIzX1JFR09GRlNFVCB8IFwNCi0gICBBRENfU1FSNF9SRUdPRkZTRVQpDQotI2RlZmluZSBBRENfU1FSWF9SRUdPRkZTRVRfUE9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKDhVTCkgLyogUG9zaXRpb24gb2YgYml0cyBBRENfU1FSeF9SRUdPRkZTRVQgaW4gQURDX1JFR19TUVJYX1JFR09GRlNFVF9NQVNLIFwNCi0gICAgICAgICAqLw0KLSNkZWZpbmUgQURDX1JFR19SQU5LX0lEX1NRUlhfTUFTSyAoQURDX0NIQU5ORUxfSURfTlVNQkVSX01BU0tfUE9TQklUMCkNCi0NCi0vKiBEZWZpbml0aW9uIG9mIEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBiaXRzIGluZm9ybWF0aW9uIHRvIGJlIGluc2VydGVkICAqLw0KLS8qIGludG8gQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmtzIGxpdGVyYWxzIGRlZmluaXRpb24uICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBBRENfUkVHX1JBTktfMV9TUVJYX0JJVE9GRlNFVF9QT1MgKEFEQ19TUVIxX1NRMV9Qb3MpDQotI2RlZmluZSBBRENfUkVHX1JBTktfMl9TUVJYX0JJVE9GRlNFVF9QT1MgKEFEQ19TUVIxX1NRMl9Qb3MpDQotI2RlZmluZSBBRENfUkVHX1JBTktfM19TUVJYX0JJVE9GRlNFVF9QT1MgKEFEQ19TUVIxX1NRM19Qb3MpDQotI2RlZmluZSBBRENfUkVHX1JBTktfNF9TUVJYX0JJVE9GRlNFVF9QT1MgKEFEQ19TUVIxX1NRNF9Qb3MpDQotI2RlZmluZSBBRENfUkVHX1JBTktfNV9TUVJYX0JJVE9GRlNFVF9QT1MgKEFEQ19TUVIyX1NRNV9Qb3MpDQotI2RlZmluZSBBRENfUkVHX1JBTktfNl9TUVJYX0JJVE9GRlNFVF9QT1MgKEFEQ19TUVIyX1NRNl9Qb3MpDQotI2RlZmluZSBBRENfUkVHX1JBTktfN19TUVJYX0JJVE9GRlNFVF9QT1MgKEFEQ19TUVIyX1NRN19Qb3MpDQotI2RlZmluZSBBRENfUkVHX1JBTktfOF9TUVJYX0JJVE9GRlNFVF9QT1MgKEFEQ19TUVIyX1NROF9Qb3MpDQotI2RlZmluZSBBRENfUkVHX1JBTktfOV9TUVJYX0JJVE9GRlNFVF9QT1MgKEFEQ19TUVIyX1NROV9Qb3MpDQotI2RlZmluZSBBRENfUkVHX1JBTktfMTBfU1FSWF9CSVRPRkZTRVRfUE9TIChBRENfU1FSM19TUTEwX1BvcykNCi0jZGVmaW5lIEFEQ19SRUdfUkFOS18xMV9TUVJYX0JJVE9GRlNFVF9QT1MgKEFEQ19TUVIzX1NRMTFfUG9zKQ0KLSNkZWZpbmUgQURDX1JFR19SQU5LXzEyX1NRUlhfQklUT0ZGU0VUX1BPUyAoQURDX1NRUjNfU1ExMl9Qb3MpDQotI2RlZmluZSBBRENfUkVHX1JBTktfMTNfU1FSWF9CSVRPRkZTRVRfUE9TIChBRENfU1FSM19TUTEzX1BvcykNCi0jZGVmaW5lIEFEQ19SRUdfUkFOS18xNF9TUVJYX0JJVE9GRlNFVF9QT1MgKEFEQ19TUVIzX1NRMTRfUG9zKQ0KLSNkZWZpbmUgQURDX1JFR19SQU5LXzE1X1NRUlhfQklUT0ZGU0VUX1BPUyAoQURDX1NRUjRfU1ExNV9Qb3MpDQotI2RlZmluZSBBRENfUkVHX1JBTktfMTZfU1FSWF9CSVRPRkZTRVRfUE9TIChBRENfU1FSNF9TUTE2X1BvcykNCi0NCi0vKiBJbnRlcm5hbCBtYXNrIGZvciBBREMgZ3JvdXAgaW5qZWN0ZWQgc2VxdWVuY2VyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLS8qIFRvIHNlbGVjdCBpbnRvIGxpdGVyYWwgTExfQURDX0lOSl9SQU5LX3ggdGhlIHJlbGV2YW50IGJpdHMgZm9yOiAgICAgICAgICAgICovDQotLyogLSBkYXRhIHJlZ2lzdGVyIG9mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0vKiAtIHNlcXVlbmNlciByYW5rIGJpdHMgcG9zaXRpb24gaW50byB0aGUgc2VsZWN0ZWQgcmVnaXN0ZXIgICAgICAgICAgICAgICAgICAqLw0KLQ0KLS8qIEludGVybmFsIHJlZ2lzdGVyIG9mZnNldCBmb3IgQURDIGdyb3VwIGluamVjdGVkIGRhdGEgcmVnaXN0ZXIgKi8NCi0vKiAob2Zmc2V0IHBsYWNlZCBpbnRvIGEgc3BhcmUgYXJlYSBvZiBsaXRlcmFsIGRlZmluaXRpb24pICovDQotI2RlZmluZSBBRENfSkRSMV9SRUdPRkZTRVQgKDB4MDAwMDAwMDBVTCkNCi0jZGVmaW5lIEFEQ19KRFIyX1JFR09GRlNFVCAoMHgwMDAwMDEwMFVMKQ0KLSNkZWZpbmUgQURDX0pEUjNfUkVHT0ZGU0VUICgweDAwMDAwMjAwVUwpDQotI2RlZmluZSBBRENfSkRSNF9SRUdPRkZTRVQgKDB4MDAwMDAzMDBVTCkNCi0NCi0jZGVmaW5lIEFEQ19JTkpfSkRSWF9SRUdPRkZTRVRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0pEUjFfUkVHT0ZGU0VUIHwgQURDX0pEUjJfUkVHT0ZGU0VUIHwgQURDX0pEUjNfUkVHT0ZGU0VUIHwgXA0KLSAgIEFEQ19KRFI0X1JFR09GRlNFVCkNCi0jZGVmaW5lIEFEQ19JTkpfUkFOS19JRF9KU1FSX01BU0sgKEFEQ19DSEFOTkVMX0lEX05VTUJFUl9NQVNLX1BPU0JJVDApDQotI2RlZmluZSBBRENfSkRSWF9SRUdPRkZTRVRfUE9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKDhVTCkgLyogUG9zaXRpb24gb2YgYml0cyBBRENfSkRSeF9SRUdPRkZTRVQgaW4gQURDX0lOSl9KRFJYX1JFR09GRlNFVF9NQVNLIFwNCi0gICAgICAgICAqLw0KLQ0KLS8qIERlZmluaXRpb24gb2YgQURDIGdyb3VwIGluamVjdGVkIHNlcXVlbmNlciBiaXRzIGluZm9ybWF0aW9uIHRvIGJlIGluc2VydGVkICovDQotLyogaW50byBBREMgZ3JvdXAgaW5qZWN0ZWQgc2VxdWVuY2VyIHJhbmtzIGxpdGVyYWxzIGRlZmluaXRpb24uICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIEFEQ19JTkpfUkFOS18xX0pTUVJfQklUT0ZGU0VUX1BPUyAoQURDX0pTUVJfSlNRMV9Qb3MpDQotI2RlZmluZSBBRENfSU5KX1JBTktfMl9KU1FSX0JJVE9GRlNFVF9QT1MgKEFEQ19KU1FSX0pTUTJfUG9zKQ0KLSNkZWZpbmUgQURDX0lOSl9SQU5LXzNfSlNRUl9CSVRPRkZTRVRfUE9TIChBRENfSlNRUl9KU1EzX1BvcykNCi0jZGVmaW5lIEFEQ19JTkpfUkFOS180X0pTUVJfQklUT0ZGU0VUX1BPUyAoQURDX0pTUVJfSlNRNF9Qb3MpDQotDQotLyogSW50ZXJuYWwgbWFzayBmb3IgQURDIGdyb3VwIHJlZ3VsYXIgdHJpZ2dlcjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0vKiBUbyBzZWxlY3QgaW50byBsaXRlcmFsIExMX0FEQ19SRUdfVFJJR194IHRoZSByZWxldmFudCBiaXRzIGZvcjogICAgICAgICAgICAqLw0KLS8qIC0gcmVndWxhciB0cmlnZ2VyIHNvdXJjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotLyogLSByZWd1bGFyIHRyaWdnZXIgZWRnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0ZHUl9FWFRFTl8wKSAvKiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcgZm9yIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wYXRpYmlsaXR5IHdpdGggc29tZSBBREMgb24gb3RoZXIgU1RNMzIgZmFtaWxpZXMgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBoYXZpbmcgdGhpcyBzZXR0aW5nIHNldCBieSBIVyBkZWZhdWx0IHZhbHVlKSAqLw0KLQ0KLS8qIE1hc2sgY29udGFpbmluZyB0cmlnZ2VyIHNvdXJjZSBtYXNrcyBmb3IgZWFjaCBvZiBwb3NzaWJsZSAgICAgICAgICAgICAgICAgICovDQotLyogdHJpZ2dlciBlZGdlIHNlbGVjdGlvbiBkdXBsaWNhdGVkIHdpdGggc2hpZnRzIFswOyA0OyA4OyAxMl0gICAgICAgICAgICAgICAgKi8NCi0vKiBjb3JyZXNwb25kaW5nIHRvIHtTVyBzdGFydDsgZXh0IHRyaWdnZXI7IGV4dCB0cmlnZ2VyOyBleHQgdHJpZ2dlcn0uICAgICAgICAqLw0KLSNkZWZpbmUgQURDX1JFR19UUklHX1NPVVJDRV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoKExMX0FEQ19SRUdfVFJJR19TT0ZUV0FSRSAmIEFEQ19DRkdSX0VYVFNFTCkgPDwgKDRVICogMFVMKSkgfCAgICAgICAgICBcDQotICAgKChBRENfQ0ZHUl9FWFRTRUwpIDw8ICg0VSAqIDFVTCkpIHwgKChBRENfQ0ZHUl9FWFRTRUwpIDw8ICg0VSAqIDJVTCkpIHwgXA0KLSAgICgoQURDX0NGR1JfRVhUU0VMKSA8PCAoNFUgKiAzVUwpKSkNCi0NCi0vKiBNYXNrIGNvbnRhaW5pbmcgdHJpZ2dlciBlZGdlIG1hc2tzIGZvciBlYWNoIG9mIHBvc3NpYmxlICAgICAgICAgICAgICAgICAgICAqLw0KLS8qIHRyaWdnZXIgZWRnZSBzZWxlY3Rpb24gZHVwbGljYXRlZCB3aXRoIHNoaWZ0cyBbMDsgNDsgODsgMTJdICAgICAgICAgICAgICAgICovDQotLyogY29ycmVzcG9uZGluZyB0byB7U1cgc3RhcnQ7IGV4dCB0cmlnZ2VyOyBleHQgdHJpZ2dlcjsgZXh0IHRyaWdnZXJ9LiAgICAgICAgKi8NCi0jZGVmaW5lIEFEQ19SRUdfVFJJR19FREdFX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoKExMX0FEQ19SRUdfVFJJR19TT0ZUV0FSRSAmIEFEQ19DRkdSX0VYVEVOKSA8PCAoNFUgKiAwVUwpKSB8IFwNCi0gICAoKEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSA8PCAoNFUgKiAxVUwpKSB8ICAgICAgICAgICAgIFwNCi0gICAoKEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSA8PCAoNFUgKiAyVUwpKSB8ICAgICAgICAgICAgIFwNCi0gICAoKEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSA8PCAoNFUgKiAzVUwpKSkNCi0NCi0vKiBEZWZpbml0aW9uIG9mIEFEQyBncm91cCByZWd1bGFyIHRyaWdnZXIgYml0cyBpbmZvcm1hdGlvbi4gICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgQURDX1JFR19UUklHX0VYVFNFTF9CSVRPRkZTRVRfUE9TIChBRENfQ0ZHUl9FWFRTRUxfUG9zKQ0KLSNkZWZpbmUgQURDX1JFR19UUklHX0VYVEVOX0JJVE9GRlNFVF9QT1MgKEFEQ19DRkdSX0VYVEVOX1BvcykNCi0NCi0vKiBJbnRlcm5hbCBtYXNrIGZvciBBREMgZ3JvdXAgaW5qZWN0ZWQgdHJpZ2dlcjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLS8qIFRvIHNlbGVjdCBpbnRvIGxpdGVyYWwgTExfQURDX0lOSl9UUklHX3ggdGhlIHJlbGV2YW50IGJpdHMgZm9yOiAgICAgICAgICAgICovDQotLyogLSBpbmplY3RlZCB0cmlnZ2VyIHNvdXJjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0vKiAtIGluamVjdGVkIHRyaWdnZXIgZWRnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgQURDX0lOSl9UUklHX0VYVF9FREdFX0RFRkFVTFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfSlNRUl9KRVhURU5fMCkgLyogVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nIGZvciBcDQotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhdGliaWxpdHkgd2l0aCBzb21lIEFEQyBvbiBvdGhlciBTVE0zMiBmYW1pbGllcyAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBoYXZpbmcgdGhpcyBzZXR0aW5nIHNldCBieSBIVyBkZWZhdWx0IHZhbHVlKSAqLw0KLQ0KLS8qIE1hc2sgY29udGFpbmluZyB0cmlnZ2VyIHNvdXJjZSBtYXNrcyBmb3IgZWFjaCBvZiBwb3NzaWJsZSAgICAgICAgICAgICAgICAgICovDQotLyogdHJpZ2dlciBlZGdlIHNlbGVjdGlvbiBkdXBsaWNhdGVkIHdpdGggc2hpZnRzIFswOyA0OyA4OyAxMl0gICAgICAgICAgICAgICAgKi8NCi0vKiBjb3JyZXNwb25kaW5nIHRvIHtTVyBzdGFydDsgZXh0IHRyaWdnZXI7IGV4dCB0cmlnZ2VyOyBleHQgdHJpZ2dlcn0uICAgICAgICAqLw0KLSNkZWZpbmUgQURDX0lOSl9UUklHX1NPVVJDRV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKCgoTExfQURDX0lOSl9UUklHX1NPRlRXQVJFICYgQURDX0pTUVJfSkVYVFNFTCkgPDwgKDRVICogMFVMKSkgfCAgICAgICAgICAgXA0KLSAgICgoQURDX0pTUVJfSkVYVFNFTCkgPDwgKDRVICogMVVMKSkgfCAoKEFEQ19KU1FSX0pFWFRTRUwpIDw8ICg0VSAqIDJVTCkpIHwgXA0KLSAgICgoQURDX0pTUVJfSkVYVFNFTCkgPDwgKDRVICogM1VMKSkpDQotDQotLyogTWFzayBjb250YWluaW5nIHRyaWdnZXIgZWRnZSBtYXNrcyBmb3IgZWFjaCBvZiBwb3NzaWJsZSAgICAgICAgICAgICAgICAgICAgKi8NCi0vKiB0cmlnZ2VyIGVkZ2Ugc2VsZWN0aW9uIGR1cGxpY2F0ZWQgd2l0aCBzaGlmdHMgWzA7IDQ7IDg7IDEyXSAgICAgICAgICAgICAgICAqLw0KLS8qIGNvcnJlc3BvbmRpbmcgdG8ge1NXIHN0YXJ0OyBleHQgdHJpZ2dlcjsgZXh0IHRyaWdnZXI7IGV4dCB0cmlnZ2VyfS4gICAgICAgICovDQotI2RlZmluZSBBRENfSU5KX1RSSUdfRURHRV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKCgoTExfQURDX0lOSl9UUklHX1NPRlRXQVJFICYgQURDX0pTUVJfSkVYVEVOKSA8PCAoNFUgKiAwVUwpKSB8IFwNCi0gICAoKEFEQ19JTkpfVFJJR19FWFRfRURHRV9ERUZBVUxUKSA8PCAoNFUgKiAxVUwpKSB8ICAgICAgICAgICAgICBcDQotICAgKChBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgPDwgKDRVICogMlVMKSkgfCAgICAgICAgICAgICAgXA0KLSAgICgoQURDX0lOSl9UUklHX0VYVF9FREdFX0RFRkFVTFQpIDw8ICg0VSAqIDNVTCkpKQ0KLQ0KLS8qIERlZmluaXRpb24gb2YgQURDIGdyb3VwIGluamVjdGVkIHRyaWdnZXIgYml0cyBpbmZvcm1hdGlvbi4gICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBBRENfSU5KX1RSSUdfRVhUU0VMX0JJVE9GRlNFVF9QT1MgKEFEQ19KU1FSX0pFWFRTRUxfUG9zKQ0KLSNkZWZpbmUgQURDX0lOSl9UUklHX0VYVEVOX0JJVE9GRlNFVF9QT1MgKEFEQ19KU1FSX0pFWFRFTl9Qb3MpDQotDQotLyogSW50ZXJuYWwgbWFzayBmb3IgQURDIGNoYW5uZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0vKiBUbyBzZWxlY3QgaW50byBsaXRlcmFsIExMX0FEQ19DSEFOTkVMX3ggdGhlIHJlbGV2YW50IGJpdHMgZm9yOiAgICAgICAgICAgICAqLw0KLS8qIC0gY2hhbm5lbCBpZGVudGlmaWVyIGRlZmluZWQgYnkgbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotLyogLSBjaGFubmVsIGlkZW50aWZpZXIgZGVmaW5lZCBieSBiaXRmaWVsZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0vKiAtIGNoYW5uZWwgZGlmZmVyZW50aWF0aW9uIGJldHdlZW4gZXh0ZXJuYWwgY2hhbm5lbHMgKGNvbm5lY3RlZCB0byAgICAgICAgICAqLw0KLS8qICAgR1BJTyBwaW5zKSBhbmQgaW50ZXJuYWwgY2hhbm5lbHMgKGNvbm5lY3RlZCB0byBpbnRlcm5hbCBwYXRocykgICAgICAgICAgICovDQotLyogLSBjaGFubmVsIHNhbXBsaW5nIHRpbWUgZGVmaW5lZCBieSBTTVBSeCByZWdpc3RlciBvZmZzZXQgICAgICAgICAgICAgICAgICAgKi8NCi0vKiAgIGFuZCBTTVB4IGJpdHMgcG9zaXRpb25zIGludG8gU01QUnggcmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgQURDX0NIQU5ORUxfSURfTlVNQkVSX01BU0sgKEFEQ19DRkdSX0FXRDFDSCkNCi0jZGVmaW5lIEFEQ19DSEFOTkVMX0lEX0JJVEZJRUxEX01BU0sgKEFEQ19BV0QyQ1JfQVdEMkNIKQ0KLSNkZWZpbmUgQURDX0NIQU5ORUxfSURfTlVNQkVSX0JJVE9GRlNFVF9QT1MgKEFEQ19DRkdSX0FXRDFDSF9Qb3MpDQotI2RlZmluZSBBRENfQ0hBTk5FTF9JRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19DSEFOTkVMX0lEX05VTUJFUl9NQVNLIHwgQURDX0NIQU5ORUxfSURfQklURklFTERfTUFTSyB8IFwNCi0gICBBRENfQ0hBTk5FTF9JRF9JTlRFUk5BTF9DSF9NQVNLKQ0KLS8qIEVxdWl2YWxlbnQgbWFzayBvZiBBRENfQ0hBTk5FTF9OVU1CRVJfTUFTSyBhbGlnbmVkIG9uIHJlZ2lzdGVyIExTQiAoYml0IDApICovDQotI2RlZmluZSBBRENfQ0hBTk5FTF9JRF9OVU1CRVJfTUFTS19QT1NCSVQwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfU1FSMl9TUTUpIC8qIEVxdWl2YWxlbnQgdG8gc2hpZnQ6IChBRENfQ0hBTk5FTF9OVU1CRVJfTUFTSyA+PiBbUG9zaXRpb24gXA0KLSAgICAgICAgICAgICAgICAgICAgb2YgYml0ZmllbGQgIkFEQ19DSEFOTkVMX05VTUJFUl9NQVNLIiBpbiByZWdpc3Rlcl0pICovDQotDQotLyogQ2hhbm5lbCBkaWZmZXJlbnRpYXRpb24gYmV0d2VlbiBleHRlcm5hbCBhbmQgaW50ZXJuYWwgY2hhbm5lbHMgKi8NCi0jZGVmaW5lIEFEQ19DSEFOTkVMX0lEX0lOVEVSTkFMX0NIIFwNCi0gICgweDgwMDAwMDAwVUwpIC8qIE1hcmtlciBvZiBpbnRlcm5hbCBjaGFubmVsICovDQotI2RlZmluZSBBRENfQ0hBTk5FTF9JRF9JTlRFUk5BTF9DSF8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKDB4MDAwODAwMDBVTCkgLyogTWFya2VyIG9mIGludGVybmFsIGNoYW5uZWwgZm9yIG90aGVyIEFEQyBpbnN0YW5jZXMsIGluIFwNCi0gICAgICAgICAgICAgICAgICAgIGNhc2Ugb2YgZGlmZmVyZW50IEFEQyBpbnRlcm5hbCBjaGFubmVscyBtYXBwZWQgb24gc2FtZSBcDQotICAgICAgICAgICAgICAgICAgICBjaGFubmVsIG51bWJlciBvbiBkaWZmZXJlbnQgQURDIGluc3RhbmNlcyAqLw0KLSNkZWZpbmUgQURDX0NIQU5ORUxfSURfSU5URVJOQUxfQ0hfTUFTSyBcDQotICAoQURDX0NIQU5ORUxfSURfSU5URVJOQUxfQ0ggfCBBRENfQ0hBTk5FTF9JRF9JTlRFUk5BTF9DSF8yKQ0KLQ0KLS8qIEludGVybmFsIHJlZ2lzdGVyIG9mZnNldCBmb3IgQURDIGNoYW5uZWwgc2FtcGxpbmcgdGltZSBjb25maWd1cmF0aW9uICovDQotLyogKG9mZnNldCBwbGFjZWQgaW50byBhIHNwYXJlIGFyZWEgb2YgbGl0ZXJhbCBkZWZpbml0aW9uKSAqLw0KLSNkZWZpbmUgQURDX1NNUFIxX1JFR09GRlNFVCAoMHgwMDAwMDAwMFVMKQ0KLSNkZWZpbmUgQURDX1NNUFIyX1JFR09GRlNFVCAoMHgwMjAwMDAwMFVMKQ0KLSNkZWZpbmUgQURDX0NIQU5ORUxfU01QUlhfUkVHT0ZGU0VUX01BU0sgXA0KLSAgKEFEQ19TTVBSMV9SRUdPRkZTRVQgfCBBRENfU01QUjJfUkVHT0ZGU0VUKQ0KLSNkZWZpbmUgQURDX1NNUFJYX1JFR09GRlNFVF9QT1MgICAgICAgICAgICAgICAgICAgICBcDQotICAoMjVVTCkgLyogUG9zaXRpb24gb2YgYml0cyBBRENfU01QUnhfUkVHT0ZGU0VUIGluIFwNCi0gICAgICAgICAgICBBRENfQ0hBTk5FTF9TTVBSWF9SRUdPRkZTRVRfTUFTSyAqLw0KLQ0KLSNkZWZpbmUgQURDX0NIQU5ORUxfU01QeF9CSVRPRkZTRVRfTUFTSyAoMHgwMUYwMDAwMFVMKQ0KLSNkZWZpbmUgQURDX0NIQU5ORUxfU01QeF9CSVRPRkZTRVRfUE9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgyMFVMKSAvKiBWYWx1ZSBlcXVpdmFsZW50IHRvIGJpdGZpZWxkICJBRENfQ0hBTk5FTF9TTVB4X0JJVE9GRlNFVF9NQVNLIiBcDQotICAgICAgICAgICAgcG9zaXRpb24gaW4gcmVnaXN0ZXIgKi8NCi0NCi0vKiBEZWZpbml0aW9uIG9mIGNoYW5uZWxzIElEIG51bWJlciBpbmZvcm1hdGlvbiB0byBiZSBpbnNlcnRlZCBpbnRvICAgICAgICAgICAqLw0KLS8qIGNoYW5uZWxzIGxpdGVyYWxzIGRlZmluaXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBBRENfQ0hBTk5FTF8wX05VTUJFUiAoMHgwMDAwMDAwMFVMKQ0KLSNkZWZpbmUgQURDX0NIQU5ORUxfMV9OVU1CRVIgKEFEQ19DRkdSX0FXRDFDSF8wKQ0KLSNkZWZpbmUgQURDX0NIQU5ORUxfMl9OVU1CRVIgKEFEQ19DRkdSX0FXRDFDSF8xKQ0KLSNkZWZpbmUgQURDX0NIQU5ORUxfM19OVU1CRVIgKEFEQ19DRkdSX0FXRDFDSF8xIHwgQURDX0NGR1JfQVdEMUNIXzApDQotI2RlZmluZSBBRENfQ0hBTk5FTF80X05VTUJFUiAoQURDX0NGR1JfQVdEMUNIXzIpDQotI2RlZmluZSBBRENfQ0hBTk5FTF81X05VTUJFUiAoQURDX0NGR1JfQVdEMUNIXzIgfCBBRENfQ0ZHUl9BV0QxQ0hfMCkNCi0jZGVmaW5lIEFEQ19DSEFOTkVMXzZfTlVNQkVSIChBRENfQ0ZHUl9BV0QxQ0hfMiB8IEFEQ19DRkdSX0FXRDFDSF8xKQ0KLSNkZWZpbmUgQURDX0NIQU5ORUxfN19OVU1CRVIgXA0KLSAgKEFEQ19DRkdSX0FXRDFDSF8yIHwgQURDX0NGR1JfQVdEMUNIXzEgfCBBRENfQ0ZHUl9BV0QxQ0hfMCkNCi0jZGVmaW5lIEFEQ19DSEFOTkVMXzhfTlVNQkVSIChBRENfQ0ZHUl9BV0QxQ0hfMykNCi0jZGVmaW5lIEFEQ19DSEFOTkVMXzlfTlVNQkVSIChBRENfQ0ZHUl9BV0QxQ0hfMyB8IEFEQ19DRkdSX0FXRDFDSF8wKQ0KLSNkZWZpbmUgQURDX0NIQU5ORUxfMTBfTlVNQkVSIChBRENfQ0ZHUl9BV0QxQ0hfMyB8IEFEQ19DRkdSX0FXRDFDSF8xKQ0KLSNkZWZpbmUgQURDX0NIQU5ORUxfMTFfTlVNQkVSIFwNCi0gIChBRENfQ0ZHUl9BV0QxQ0hfMyB8IEFEQ19DRkdSX0FXRDFDSF8xIHwgQURDX0NGR1JfQVdEMUNIXzApDQotI2RlZmluZSBBRENfQ0hBTk5FTF8xMl9OVU1CRVIgKEFEQ19DRkdSX0FXRDFDSF8zIHwgQURDX0NGR1JfQVdEMUNIXzIpDQotI2RlZmluZSBBRENfQ0hBTk5FTF8xM19OVU1CRVIgXA0KLSAgKEFEQ19DRkdSX0FXRDFDSF8zIHwgQURDX0NGR1JfQVdEMUNIXzIgfCBBRENfQ0ZHUl9BV0QxQ0hfMCkNCi0jZGVmaW5lIEFEQ19DSEFOTkVMXzE0X05VTUJFUiBcDQotICAoQURDX0NGR1JfQVdEMUNIXzMgfCBBRENfQ0ZHUl9BV0QxQ0hfMiB8IEFEQ19DRkdSX0FXRDFDSF8xKQ0KLSNkZWZpbmUgQURDX0NIQU5ORUxfMTVfTlVNQkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0ZHUl9BV0QxQ0hfMyB8IEFEQ19DRkdSX0FXRDFDSF8yIHwgQURDX0NGR1JfQVdEMUNIXzEgfCBcDQotICAgQURDX0NGR1JfQVdEMUNIXzApDQotI2RlZmluZSBBRENfQ0hBTk5FTF8xNl9OVU1CRVIgKEFEQ19DRkdSX0FXRDFDSF80KQ0KLSNkZWZpbmUgQURDX0NIQU5ORUxfMTdfTlVNQkVSIChBRENfQ0ZHUl9BV0QxQ0hfNCB8IEFEQ19DRkdSX0FXRDFDSF8wKQ0KLSNkZWZpbmUgQURDX0NIQU5ORUxfMThfTlVNQkVSIChBRENfQ0ZHUl9BV0QxQ0hfNCB8IEFEQ19DRkdSX0FXRDFDSF8xKQ0KLQ0KLS8qIERlZmluaXRpb24gb2YgY2hhbm5lbHMgSUQgYml0ZmllbGQgaW5mb3JtYXRpb24gdG8gYmUgaW5zZXJ0ZWQgaW50byAgICAgICAgICovDQotLyogY2hhbm5lbHMgbGl0ZXJhbHMgZGVmaW5pdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIEFEQ19DSEFOTkVMXzBfQklURklFTEQgKEFEQ19BV0QyQ1JfQVdEMkNIXzApDQotI2RlZmluZSBBRENfQ0hBTk5FTF8xX0JJVEZJRUxEIChBRENfQVdEMkNSX0FXRDJDSF8xKQ0KLSNkZWZpbmUgQURDX0NIQU5ORUxfMl9CSVRGSUVMRCAoQURDX0FXRDJDUl9BV0QyQ0hfMikNCi0jZGVmaW5lIEFEQ19DSEFOTkVMXzNfQklURklFTEQgKEFEQ19BV0QyQ1JfQVdEMkNIXzMpDQotI2RlZmluZSBBRENfQ0hBTk5FTF80X0JJVEZJRUxEIChBRENfQVdEMkNSX0FXRDJDSF80KQ0KLSNkZWZpbmUgQURDX0NIQU5ORUxfNV9CSVRGSUVMRCAoQURDX0FXRDJDUl9BV0QyQ0hfNSkNCi0jZGVmaW5lIEFEQ19DSEFOTkVMXzZfQklURklFTEQgKEFEQ19BV0QyQ1JfQVdEMkNIXzYpDQotI2RlZmluZSBBRENfQ0hBTk5FTF83X0JJVEZJRUxEIChBRENfQVdEMkNSX0FXRDJDSF83KQ0KLSNkZWZpbmUgQURDX0NIQU5ORUxfOF9CSVRGSUVMRCAoQURDX0FXRDJDUl9BV0QyQ0hfOCkNCi0jZGVmaW5lIEFEQ19DSEFOTkVMXzlfQklURklFTEQgKEFEQ19BV0QyQ1JfQVdEMkNIXzkpDQotI2RlZmluZSBBRENfQ0hBTk5FTF8xMF9CSVRGSUVMRCAoQURDX0FXRDJDUl9BV0QyQ0hfMTApDQotI2RlZmluZSBBRENfQ0hBTk5FTF8xMV9CSVRGSUVMRCAoQURDX0FXRDJDUl9BV0QyQ0hfMTEpDQotI2RlZmluZSBBRENfQ0hBTk5FTF8xMl9CSVRGSUVMRCAoQURDX0FXRDJDUl9BV0QyQ0hfMTIpDQotI2RlZmluZSBBRENfQ0hBTk5FTF8xM19CSVRGSUVMRCAoQURDX0FXRDJDUl9BV0QyQ0hfMTMpDQotI2RlZmluZSBBRENfQ0hBTk5FTF8xNF9CSVRGSUVMRCAoQURDX0FXRDJDUl9BV0QyQ0hfMTQpDQotI2RlZmluZSBBRENfQ0hBTk5FTF8xNV9CSVRGSUVMRCAoQURDX0FXRDJDUl9BV0QyQ0hfMTUpDQotI2RlZmluZSBBRENfQ0hBTk5FTF8xNl9CSVRGSUVMRCAoQURDX0FXRDJDUl9BV0QyQ0hfMTYpDQotI2RlZmluZSBBRENfQ0hBTk5FTF8xN19CSVRGSUVMRCAoQURDX0FXRDJDUl9BV0QyQ0hfMTcpDQotI2RlZmluZSBBRENfQ0hBTk5FTF8xOF9CSVRGSUVMRCAoQURDX0FXRDJDUl9BV0QyQ0hfMTgpDQotDQotLyogRGVmaW5pdGlvbiBvZiBjaGFubmVscyBzYW1wbGluZyB0aW1lIGluZm9ybWF0aW9uIHRvIGJlIGluc2VydGVkIGludG8gICAgICAgKi8NCi0vKiBjaGFubmVscyBsaXRlcmFscyBkZWZpbml0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgQURDX0NIQU5ORUxfMF9TTVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfU01QUjFfUkVHT0ZGU0VUIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKCgwVUwpIDw8IEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX1BPUykpIC8qIFZhbHVlIHNoaWZ0ZWQgaXMgZXF1aXZhbGVudCAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiaXRmaWVsZCAiQURDX1NNUFIxX1NNUDAiIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gaW4gcmVnaXN0ZXIgKi8NCi0jZGVmaW5lIEFEQ19DSEFOTkVMXzFfU01QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX1NNUFIxX1JFR09GRlNFVCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoM1VMKSA8PCBBRENfQ0hBTk5FTF9TTVB4X0JJVE9GRlNFVF9QT1MpKSAvKiBWYWx1ZSBzaGlmdGVkIGlzIGVxdWl2YWxlbnQgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYml0ZmllbGQgIkFEQ19TTVBSMV9TTVAxIiBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uIGluIHJlZ2lzdGVyICovDQotI2RlZmluZSBBRENfQ0hBTk5FTF8yX1NNUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19TTVBSMV9SRUdPRkZTRVQgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKDZVTCkgPDwgQURDX0NIQU5ORUxfU01QeF9CSVRPRkZTRVRfUE9TKSkgLyogVmFsdWUgc2hpZnRlZCBpcyBlcXVpdmFsZW50ICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJpdGZpZWxkICJBRENfU01QUjFfU01QMiIgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiBpbiByZWdpc3RlciAqLw0KLSNkZWZpbmUgQURDX0NIQU5ORUxfM19TTVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfU01QUjFfUkVHT0ZGU0VUIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKCg5VUwpIDw8IEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX1BPUykpIC8qIFZhbHVlIHNoaWZ0ZWQgaXMgZXF1aXZhbGVudCAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiaXRmaWVsZCAiQURDX1NNUFIxX1NNUDMiIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gaW4gcmVnaXN0ZXIgKi8NCi0jZGVmaW5lIEFEQ19DSEFOTkVMXzRfU01QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19TTVBSMV9SRUdPRkZTRVQgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKCgxMlVMKSA8PCBBRENfQ0hBTk5FTF9TTVB4X0JJVE9GRlNFVF9QT1MpKSAvKiBWYWx1ZSBzaGlmdGVkIGlzIGVxdWl2YWxlbnQgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJpdGZpZWxkICJBRENfU01QUjFfU01QNCIgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gaW4gcmVnaXN0ZXIgKi8NCi0jZGVmaW5lIEFEQ19DSEFOTkVMXzVfU01QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19TTVBSMV9SRUdPRkZTRVQgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKCgxNVVMKSA8PCBBRENfQ0hBTk5FTF9TTVB4X0JJVE9GRlNFVF9QT1MpKSAvKiBWYWx1ZSBzaGlmdGVkIGlzIGVxdWl2YWxlbnQgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJpdGZpZWxkICJBRENfU01QUjFfU01QNSIgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gaW4gcmVnaXN0ZXIgKi8NCi0jZGVmaW5lIEFEQ19DSEFOTkVMXzZfU01QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19TTVBSMV9SRUdPRkZTRVQgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKCgxOFVMKSA8PCBBRENfQ0hBTk5FTF9TTVB4X0JJVE9GRlNFVF9QT1MpKSAvKiBWYWx1ZSBzaGlmdGVkIGlzIGVxdWl2YWxlbnQgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJpdGZpZWxkICJBRENfU01QUjFfU01QNiIgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gaW4gcmVnaXN0ZXIgKi8NCi0jZGVmaW5lIEFEQ19DSEFOTkVMXzdfU01QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19TTVBSMV9SRUdPRkZTRVQgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKCgyMVVMKSA8PCBBRENfQ0hBTk5FTF9TTVB4X0JJVE9GRlNFVF9QT1MpKSAvKiBWYWx1ZSBzaGlmdGVkIGlzIGVxdWl2YWxlbnQgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJpdGZpZWxkICJBRENfU01QUjFfU01QNyIgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gaW4gcmVnaXN0ZXIgKi8NCi0jZGVmaW5lIEFEQ19DSEFOTkVMXzhfU01QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19TTVBSMV9SRUdPRkZTRVQgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKCgyNFVMKSA8PCBBRENfQ0hBTk5FTF9TTVB4X0JJVE9GRlNFVF9QT1MpKSAvKiBWYWx1ZSBzaGlmdGVkIGlzIGVxdWl2YWxlbnQgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJpdGZpZWxkICJBRENfU01QUjFfU01QOCIgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gaW4gcmVnaXN0ZXIgKi8NCi0jZGVmaW5lIEFEQ19DSEFOTkVMXzlfU01QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19TTVBSMV9SRUdPRkZTRVQgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKCgyN1VMKSA8PCBBRENfQ0hBTk5FTF9TTVB4X0JJVE9GRlNFVF9QT1MpKSAvKiBWYWx1ZSBzaGlmdGVkIGlzIGVxdWl2YWxlbnQgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJpdGZpZWxkICJBRENfU01QUjFfU01QOSIgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gaW4gcmVnaXN0ZXIgKi8NCi0jZGVmaW5lIEFEQ19DSEFOTkVMXzEwX1NNUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19TTVBSMl9SRUdPRkZTRVQgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKCgwVUwpIDw8IEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX1BPUykpIC8qIFZhbHVlIHNoaWZ0ZWQgaXMgZXF1aXZhbGVudCAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYml0ZmllbGQgIkFEQ19TTVBSMl9TTVAxMCIgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiBpbiByZWdpc3RlciAqLw0KLSNkZWZpbmUgQURDX0NIQU5ORUxfMTFfU01QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX1NNUFIyX1JFR09GRlNFVCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKDNVTCkgPDwgQURDX0NIQU5ORUxfU01QeF9CSVRPRkZTRVRfUE9TKSkgLyogVmFsdWUgc2hpZnRlZCBpcyBlcXVpdmFsZW50ICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiaXRmaWVsZCAiQURDX1NNUFIyX1NNUDExIiBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uIGluIHJlZ2lzdGVyICovDQotI2RlZmluZSBBRENfQ0hBTk5FTF8xMl9TTVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfU01QUjJfUkVHT0ZGU0VUIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoNlVMKSA8PCBBRENfQ0hBTk5FTF9TTVB4X0JJVE9GRlNFVF9QT1MpKSAvKiBWYWx1ZSBzaGlmdGVkIGlzIGVxdWl2YWxlbnQgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJpdGZpZWxkICJBRENfU01QUjJfU01QMTIiIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gaW4gcmVnaXN0ZXIgKi8NCi0jZGVmaW5lIEFEQ19DSEFOTkVMXzEzX1NNUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19TTVBSMl9SRUdPRkZTRVQgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKCg5VUwpIDw8IEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX1BPUykpIC8qIFZhbHVlIHNoaWZ0ZWQgaXMgZXF1aXZhbGVudCAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYml0ZmllbGQgIkFEQ19TTVBSMl9TTVAxMyIgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiBpbiByZWdpc3RlciAqLw0KLSNkZWZpbmUgQURDX0NIQU5ORUxfMTRfU01QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX1NNUFIyX1JFR09GRlNFVCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKDEyVUwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICA8PCBBRENfQ0hBTk5FTF9TTVB4X0JJVE9GRlNFVF9QT1MpKSAvKiBWYWx1ZSBzaGlmdGVkIGlzIGVxdWl2YWxlbnQgdG8gICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdGZpZWxkICJBRENfU01QUjJfU01QMTQiIHBvc2l0aW9uIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gcmVnaXN0ZXIgKi8NCi0jZGVmaW5lIEFEQ19DSEFOTkVMXzE1X1NNUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19TTVBSMl9SRUdPRkZTRVQgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKCgxNVVMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgPDwgQURDX0NIQU5ORUxfU01QeF9CSVRPRkZTRVRfUE9TKSkgLyogVmFsdWUgc2hpZnRlZCBpcyBlcXVpdmFsZW50IHRvICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRmaWVsZCAiQURDX1NNUFIyX1NNUDE1IiBwb3NpdGlvbiBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHJlZ2lzdGVyICovDQotI2RlZmluZSBBRENfQ0hBTk5FTF8xNl9TTVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfU01QUjJfUkVHT0ZGU0VUIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoMThVTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIDw8IEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX1BPUykpIC8qIFZhbHVlIHNoaWZ0ZWQgaXMgZXF1aXZhbGVudCB0byAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0ZmllbGQgIkFEQ19TTVBSMl9TTVAxNiIgcG9zaXRpb24gXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiByZWdpc3RlciAqLw0KLSNkZWZpbmUgQURDX0NIQU5ORUxfMTdfU01QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX1NNUFIyX1JFR09GRlNFVCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKDIxVUwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICA8PCBBRENfQ0hBTk5FTF9TTVB4X0JJVE9GRlNFVF9QT1MpKSAvKiBWYWx1ZSBzaGlmdGVkIGlzIGVxdWl2YWxlbnQgdG8gICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdGZpZWxkICJBRENfU01QUjJfU01QMTciIHBvc2l0aW9uIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gcmVnaXN0ZXIgKi8NCi0jZGVmaW5lIEFEQ19DSEFOTkVMXzE4X1NNUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19TTVBSMl9SRUdPRkZTRVQgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKCgyNFVMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgPDwgQURDX0NIQU5ORUxfU01QeF9CSVRPRkZTRVRfUE9TKSkgLyogVmFsdWUgc2hpZnRlZCBpcyBlcXVpdmFsZW50IHRvICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRmaWVsZCAiQURDX1NNUFIyX1NNUDE4IiBwb3NpdGlvbiBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHJlZ2lzdGVyICovDQotDQotLyogSW50ZXJuYWwgbWFzayBmb3IgQURDIG1vZGUgc2luZ2xlIG9yIGRpZmZlcmVudGlhbCBlbmRlZDogICAgICAgICAgICAgICAgICAgKi8NCi0vKiBUbyBzZWxlY3QgaW50byBsaXRlcmFscyBMTF9BRENfU0lOR0xFX0VOREVEIG9yIExMX0FEQ19TSU5HTEVfRElGRkVSRU5USUFMICAqLw0KLS8qIHRoZSByZWxldmFudCBiaXRzIGZvcjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotLyogKGNvbmNhdGVuYXRpb24gb2YgbXVsdGlwbGUgYml0cyB1c2VkIGluIGRpZmZlcmVudCByZWdpc3RlcnMpICAgICAgICAgICAgICAgKi8NCi0vKiAtIEFEQyBjYWxpYnJhdGlvbjogY2FsaWJyYXRpb24gc3RhcnQsIGNhbGlicmF0aW9uIGZhY3RvciBnZXQgb3Igc2V0ICAgICAgICAqLw0KLS8qIC0gQURDIGNoYW5uZWxzOiBzZXQgZWFjaCBBREMgY2hhbm5lbCBlbmRpbmcgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBBRENfU0lOR0xFRElGRl9DQUxJQl9TVEFSVF9NQVNLIChBRENfQ1JfQURDQUxESUYpDQotI2RlZmluZSBBRENfU0lOR0xFRElGRl9DQUxJQl9GQUNUT1JfTUFTSyBcDQotICAoQURDX0NBTEZBQ1RfQ0FMRkFDVF9EIHwgQURDX0NBTEZBQ1RfQ0FMRkFDVF9TKQ0KLSNkZWZpbmUgQURDX1NJTkdMRURJRkZfQ0hBTk5FTF9NQVNLIFwNCi0gIChBRENfQ0hBTk5FTF9JRF9CSVRGSUVMRF9NQVNLKSAvKiBFcXVpdmFsZW50IHRvIEFEQ19ESUZTRUxfRElGU0VMICovDQotI2RlZmluZSBBRENfU0lOR0xFRElGRl9DSEFOTkVMX1NISUZUX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0NBTEZBQ1RfQ0FMRkFDVF9TXzQgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgQURDX0NBTEZBQ1RfQ0FMRkFDVF9TXzMpIC8qIEJpdHMgY2hvc2VuIHRvIHBlcmZvcm0gb2Ygc2hpZnQgd2hlbiBzaW5nbGUgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgaXMgc2VsZWN0ZWQsIHNoaWZ0IHZhbHVlIG91dCBvZiBjaGFubmVscyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHMgcmFuZ2UuICovDQotI2RlZmluZSBBRENfU0lOR0xFRElGRl9DQUxJQl9GX0JJVF9EX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgweDAwMDEwMDAwVUwpIC8qIFNlbGVjdGlvbiBvZiAxIGJpdCB0byBkaXNjcmltaW5hdGUgZGlmZmVyZW50aWFsIG1vZGU6IG1hc2sgXA0KLSAgICAgICAgICAgICAgICAgICAgb2YgYml0ICovDQotI2RlZmluZSBBRENfU0lOR0xFRElGRl9DQUxJQl9GX0JJVF9EX1BPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKDE2VUwpIC8qIFNlbGVjdGlvbiBvZiAxIGJpdCB0byBkaXNjcmltaW5hdGUgZGlmZmVyZW50aWFsIG1vZGU6IHBvc2l0aW9uIG9mIFwNCi0gICAgICAgICAgICBiaXQgKi8NCi0jZGVmaW5lIEFEQ19TSU5HTEVESUZGX0NBTElCX0ZfQklUX0RfU0hJRlQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX1NJTkdMRURJRkZfQ0FMSUJfRl9CSVRfRF9QT1MgLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDRVTCkgLyogU2hpZnQgb2YgYml0IEFEQ19TSU5HTEVESUZGX0NBTElCX0ZfQklUX0QgdG8gcG9zaXRpb24gdG8gcGVyZm9ybSBhIFwNCi0gICAgICAgICAgIHNoaWZ0IG9mIDQgcmFua3MgKi8NCi0NCi0vKiBJbnRlcm5hbCBtYXNrIGZvciBBREMgYW5hbG9nIHdhdGNoZG9nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLS8qIFRvIHNlbGVjdCBpbnRvIGxpdGVyYWxzIExMX0FEQ19BV0RfQ0hBTk5FTHhfeHh4IHRoZSByZWxldmFudCBiaXRzIGZvcjogICAgICovDQotLyogKGNvbmNhdGVuYXRpb24gb2YgbXVsdGlwbGUgYml0cyB1c2VkIGluIGRpZmZlcmVudCBhbmFsb2cgd2F0Y2hkb2dzLCAgICAgICAgKi8NCi0vKiAoZmVhdHVyZSBvZiBzZXZlcmFsIHdhdGNoZG9ncyBub3QgYXZhaWxhYmxlIG9uIGFsbCBTVE0zMiBmYW1pbGllcykpLiAgICAgICAqLw0KLS8qIC0gYW5hbG9nIHdhdGNoZG9nIDE6IG1vbml0b3JlZCBjaGFubmVsIGRlZmluZWQgYnkgbnVtYmVyLCAgICAgICAgICAgICAgICAgICovDQotLyogICBzZWxlY3Rpb24gb2YgQURDIGdyb3VwIChBREMgZ3JvdXBzIHJlZ3VsYXIgYW5kLW9yIGluamVjdGVkKS4gICAgICAgICAgICAgKi8NCi0vKiAtIGFuYWxvZyB3YXRjaGRvZyAyIGFuZCAzOiBtb25pdG9yZWQgY2hhbm5lbCBkZWZpbmVkIGJ5IGJpdGZpZWxkLCBubyAgICAgICAqLw0KLS8qICAgc2VsZWN0aW9uIG9uIGdyb3Vwcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotDQotLyogSW50ZXJuYWwgcmVnaXN0ZXIgb2Zmc2V0IGZvciBBREMgYW5hbG9nIHdhdGNoZG9nIGNoYW5uZWwgY29uZmlndXJhdGlvbiAqLw0KLSNkZWZpbmUgQURDX0FXRF9DUjFfUkVHT0ZGU0VUICgweDAwMDAwMDAwVUwpDQotI2RlZmluZSBBRENfQVdEX0NSMl9SRUdPRkZTRVQgKDB4MDAxMDAwMDBVTCkNCi0jZGVmaW5lIEFEQ19BV0RfQ1IzX1JFR09GRlNFVCAoMHgwMDIwMDAwMFVMKQ0KLQ0KLS8qIFJlZ2lzdGVyIG9mZnNldCBnYXAgYmV0d2VlbiBBV0QxIGFuZCBBV0QyLUFXRDMgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgKi8NCi0vKiAoU2V0IHNlcGFyYXRlbHkgYXMgQURDX0FXRF9DUlhfUkVHT0ZGU0VUIHRvIHNwYXJlIDMyIGJpdHMgc3BhY2UgKi8NCi0jZGVmaW5lIEFEQ19BV0RfQ1IxMl9SRUdPRkZTRVRHQVBfTUFTSyAoQURDX0FXRDJDUl9BV0QyQ0hfMCkNCi0jZGVmaW5lIEFEQ19BV0RfQ1IxMl9SRUdPRkZTRVRHQVBfVkFMICgweDAwMDAwMDI0VUwpDQotDQotI2RlZmluZSBBRENfQVdEX0NSWF9SRUdPRkZTRVRfTUFTSyBcDQotICAoQURDX0FXRF9DUjFfUkVHT0ZGU0VUIHwgQURDX0FXRF9DUjJfUkVHT0ZGU0VUIHwgQURDX0FXRF9DUjNfUkVHT0ZGU0VUKQ0KLQ0KLSNkZWZpbmUgQURDX0FXRF9DUjFfQ0hBTk5FTF9NQVNLIFwNCi0gIChBRENfQ0ZHUl9BV0QxQ0ggfCBBRENfQ0ZHUl9KQVdEMUVOIHwgQURDX0NGR1JfQVdEMUVOIHwgQURDX0NGR1JfQVdEMVNHTCkNCi0jZGVmaW5lIEFEQ19BV0RfQ1IyM19DSEFOTkVMX01BU0sgKEFEQ19BV0QyQ1JfQVdEMkNIKQ0KLSNkZWZpbmUgQURDX0FXRF9DUl9BTExfQ0hBTk5FTF9NQVNLIFwNCi0gIChBRENfQVdEX0NSMV9DSEFOTkVMX01BU0sgfCBBRENfQVdEX0NSMjNfQ0hBTk5FTF9NQVNLKQ0KLQ0KLSNkZWZpbmUgQURDX0FXRF9DUlhfUkVHT0ZGU0VUX1BPUyAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgyMFVMKSAvKiBQb3NpdGlvbiBvZiBiaXRzIEFEQ19BV0RfQ1J4X1JFR09GRlNFVCBpbiBcDQotICAgICAgICAgICAgQURDX0FXRF9DUlhfUkVHT0ZGU0VUX01BU0sgKi8NCi0NCi0vKiBJbnRlcm5hbCByZWdpc3RlciBvZmZzZXQgZm9yIEFEQyBhbmFsb2cgd2F0Y2hkb2cgdGhyZXNob2xkIGNvbmZpZ3VyYXRpb24gKi8NCi0jZGVmaW5lIEFEQ19BV0RfVFIxX1JFR09GRlNFVCAoQURDX0FXRF9DUjFfUkVHT0ZGU0VUKQ0KLSNkZWZpbmUgQURDX0FXRF9UUjJfUkVHT0ZGU0VUIChBRENfQVdEX0NSMl9SRUdPRkZTRVQpDQotI2RlZmluZSBBRENfQVdEX1RSM19SRUdPRkZTRVQgKEFEQ19BV0RfQ1IzX1JFR09GRlNFVCkNCi0jZGVmaW5lIEFEQ19BV0RfVFJYX1JFR09GRlNFVF9NQVNLIFwNCi0gIChBRENfQVdEX1RSMV9SRUdPRkZTRVQgfCBBRENfQVdEX1RSMl9SRUdPRkZTRVQgfCBBRENfQVdEX1RSM19SRUdPRkZTRVQpDQotI2RlZmluZSBBRENfQVdEX1RSWF9SRUdPRkZTRVRfUE9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19BV0RfQ1JYX1JFR09GRlNFVF9QT1MpIC8qIFBvc2l0aW9uIG9mIGJpdHMgQURDX1NRUnhfUkVHT0ZGU0VUIGluIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQVdEX1RSWF9SRUdPRkZTRVRfTUFTSyAqLw0KLSNkZWZpbmUgQURDX0FXRF9UUlhfQklUX0hJR0hfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoMHgwMDAxMDAwMFVMKSAvKiBTZWxlY3Rpb24gb2YgMSBiaXQgdG8gZGlzY3JpbWluYXRlIHRocmVzaG9sZCBoaWdoOiBtYXNrIG9mIFwNCi0gICAgICAgICAgICAgICAgICAgIGJpdCAqLw0KLSNkZWZpbmUgQURDX0FXRF9UUlhfQklUX0hJR0hfUE9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoMTZVTCkgLyogU2VsZWN0aW9uIG9mIDEgYml0IHRvIGRpc2NyaW1pbmF0ZSB0aHJlc2hvbGQgaGlnaDogcG9zaXRpb24gb2YgYml0IFwNCi0gICAgICAgICAgKi8NCi0jZGVmaW5lIEFEQ19BV0RfVFJYX0JJVF9ISUdIX1NISUZUNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19BV0RfVFJYX0JJVF9ISUdIX1BPUyAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgNFVMKSAvKiBTaGlmdCBvZiBiaXQgQURDX0FXRF9UUlhfQklUX0hJR0ggdG8gcG9zaXRpb24gdG8gcGVyZm9ybSBhIHNoaWZ0IG9mIFwNCi0gICAgICAgICAgIDQgcmFua3MgKi8NCi0NCi0vKiBJbnRlcm5hbCBtYXNrIGZvciBBREMgb2Zmc2V0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLS8qIEludGVybmFsIHJlZ2lzdGVyIG9mZnNldCBmb3IgQURDIG9mZnNldCBudW1iZXIgY29uZmlndXJhdGlvbiAqLw0KLSNkZWZpbmUgQURDX09GUjFfUkVHT0ZGU0VUICgweDAwMDAwMDAwVUwpDQotI2RlZmluZSBBRENfT0ZSMl9SRUdPRkZTRVQgKDB4MDAwMDAwMDFVTCkNCi0jZGVmaW5lIEFEQ19PRlIzX1JFR09GRlNFVCAoMHgwMDAwMDAwMlVMKQ0KLSNkZWZpbmUgQURDX09GUjRfUkVHT0ZGU0VUICgweDAwMDAwMDAzVUwpDQotI2RlZmluZSBBRENfT0ZSeF9SRUdPRkZTRVRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19PRlIxX1JFR09GRlNFVCB8IEFEQ19PRlIyX1JFR09GRlNFVCB8IEFEQ19PRlIzX1JFR09GRlNFVCB8IFwNCi0gICBBRENfT0ZSNF9SRUdPRkZTRVQpDQotDQotLyogQURDIHJlZ2lzdGVycyBiaXRzIHBvc2l0aW9ucyAqLw0KLSNkZWZpbmUgQURDX0NGR1JfUkVTX0JJVE9GRlNFVF9QT1MgKEFEQ19DRkdSX1JFU19Qb3MpDQotI2RlZmluZSBBRENfQ0ZHUl9BV0QxU0dMX0JJVE9GRlNFVF9QT1MgKEFEQ19DRkdSX0FXRDFTR0xfUG9zKQ0KLSNkZWZpbmUgQURDX0NGR1JfQVdEMUVOX0JJVE9GRlNFVF9QT1MgKEFEQ19DRkdSX0FXRDFFTl9Qb3MpDQotI2RlZmluZSBBRENfQ0ZHUl9KQVdEMUVOX0JJVE9GRlNFVF9QT1MgKEFEQ19DRkdSX0pBV0QxRU5fUG9zKQ0KLSNkZWZpbmUgQURDX1RSMV9IVDFfQklUT0ZGU0VUX1BPUyAoQURDX1RSMV9IVDFfUG9zKQ0KLQ0KLS8qIEFEQyByZWdpc3RlcnMgYml0cyBncm91cHMgKi8NCi0jZGVmaW5lIEFEQ19DUl9CSVRTX1BST1BFUlRZX1JTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0NSX0FEQ0FMIHwgQURDX0NSX0pBRFNUUCB8IEFEQ19DUl9BRFNUUCB8IEFEQ19DUl9KQURTVEFSVCB8ICAgICAgICAgICAgXA0KLSAgIEFEQ19DUl9BRFNUQVJUIHwgQURDX0NSX0FERElTIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBBRENfQ1JfQURFTikgLyogQURDIHJlZ2lzdGVyIENSIGJpdHMgd2l0aCBIVyBwcm9wZXJ0eSAicnMiOiBTb2Z0d2FyZSBjYW4gICBcDQotICAgICAgICAgICAgICAgICAgIHJlYWQgYXMgd2VsbCBhcyBzZXQgdGhpcyBiaXQuIFdyaXRpbmcgJzAnIGhhcyBubyBlZmZlY3Qgb24gXA0KLSAgICAgICAgICAgICAgICAgICB0aGUgYml0IHZhbHVlLiAqLw0KLQ0KLS8qIEFEQyBpbnRlcm5hbCBjaGFubmVscyByZWxhdGVkIGRlZmluaXRpb25zICovDQotLyogSW50ZXJuYWwgdm9sdGFnZSByZWZlcmVuY2UgVnJlZkludCAqLw0KLSNkZWZpbmUgVlJFRklOVF9DQUxfQUREUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgodWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICAqKSgweDFGRkY3NUFBVUwpKSAvKiBJbnRlcm5hbCB2b2x0YWdlIHJlZmVyZW5jZSwgYWRkcmVzcyBvZiBwYXJhbWV0ZXIgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlJFRklOVF9DQUw6IFZyZWZJbnQgQURDIHJhdyBkYXRhIGFjcXVpcmVkIGF0ICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBlcmF0dXJlIDMwIERlZ0MgKHRvbGVyYW5jZTogKy01IERlZ0MpLCBWcmVmKyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMuMCBWICh0b2xlcmFuY2U6ICstMTAgbVYpLiAqLw0KLSNkZWZpbmUgVlJFRklOVF9DQUxfVlJFRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoMzAwMFVMKSAvKiBBbmFsb2cgdm9sdGFnZSByZWZlcmVuY2UgKFZyZWYrKSB2YWx1ZSB3aXRoIHdoaWNoIHRlbXBlcmF0dXJlIFwNCi0gICAgICAgICAgICAgIHNlbnNvciBoYXMgYmVlbiBjYWxpYnJhdGVkIGluIHByb2R1Y3Rpb24gKHRvbGVyYW5jZTogKy0xMCBtVikgXA0KLSAgICAgICAgICAgICAgKHVuaXQ6IG1WKS4gKi8NCi0vKiBUZW1wZXJhdHVyZSBzZW5zb3IgKi8NCi0jZGVmaW5lIFRFTVBTRU5TT1JfQ0FMMV9BRERSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKCh1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICAqKSgweDFGRkY3NUE4VUwpKSAvKiBJbnRlcm5hbCB0ZW1wZXJhdHVyZSBzZW5zb3IsIGFkZHJlc3Mgb2YgcGFyYW1ldGVyIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRTX0NBTDE6IE9uIFNUTTMyRzQsIHRlbXBlcmF0dXJlIHNlbnNvciBBREMgcmF3ICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSBhY3F1aXJlZCBhdCB0ZW1wZXJhdHVyZSAgMzAgRGVnQyAodG9sZXJhbmNlOiBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLTUgRGVnQyksIFZyZWYrID0gMy4wIFYgKHRvbGVyYW5jZTogKy0xMCBtVikuICovDQotI2RlZmluZSBURU1QU0VOU09SX0NBTDJfQUREUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgodWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgKikoMHgxRkZGNzVDQVVMKSkgLyogSW50ZXJuYWwgdGVtcGVyYXR1cmUgc2Vuc29yLCBhZGRyZXNzIG9mIHBhcmFtZXRlciBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUU19DQUwyOiBPbiBTVE0zMkc0LCB0ZW1wZXJhdHVyZSBzZW5zb3IgQURDIHJhdyAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgYWNxdWlyZWQgYXQgdGVtcGVyYXR1cmUgMTEwIERlZ0MgKHRvbGVyYW5jZTogXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy01IERlZ0MpLCBWcmVmKyA9IDMuMCBWICh0b2xlcmFuY2U6ICstMTAgbVYpLiAqLw0KLSNkZWZpbmUgVEVNUFNFTlNPUl9DQUwxX1RFTVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoMzBMKSAvKiBJbnRlcm5hbCB0ZW1wZXJhdHVyZSBzZW5zb3IsIHRlbXBlcmF0dXJlIGF0IHdoaWNoIHRlbXBlcmF0dXJlIFwNCi0gICAgICAgICAgIHNlbnNvciBoYXMgYmVlbiBjYWxpYnJhdGVkIGluIHByb2R1Y3Rpb24gZm9yIGRhdGEgaW50byAgICAgICAgXA0KLSAgICAgICAgICAgVEVNUFNFTlNPUl9DQUwxX0FERFIgKHRvbGVyYW5jZTogKy01IERlZ0MpICh1bml0OiBEZWdDKS4gKi8NCi0jZGVmaW5lIFRFTVBTRU5TT1JfQ0FMMl9URU1QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgxMzBMKSAvKiBJbnRlcm5hbCB0ZW1wZXJhdHVyZSBzZW5zb3IsIHRlbXBlcmF0dXJlIGF0IHdoaWNoIHRlbXBlcmF0dXJlIFwNCi0gICAgICAgICAgICBzZW5zb3IgaGFzIGJlZW4gY2FsaWJyYXRlZCBpbiBwcm9kdWN0aW9uIGZvciBkYXRhIGludG8gICAgICAgIFwNCi0gICAgICAgICAgICBURU1QU0VOU09SX0NBTDJfQUREUiAodG9sZXJhbmNlOiArLTUgRGVnQykgKHVuaXQ6IERlZ0MpLiAqLw0KLSNkZWZpbmUgVEVNUFNFTlNPUl9DQUxfVlJFRkFOQUxPRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgzMDAwVUwpIC8qIEFuYWxvZyB2b2x0YWdlIHJlZmVyZW5jZSAoVnJlZispIHZvbHRhZ2Ugd2l0aCB3aGljaCB0ZW1wZXJhdHVyZSBcDQotICAgICAgICAgICAgICBzZW5zb3IgaGFzIGJlZW4gY2FsaWJyYXRlZCBpbiBwcm9kdWN0aW9uICgrLTEwIG1WKSAodW5pdDogbVYpLiAgXA0KLSAgICAgICAgICAgICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgQURDX0xMX1ByaXZhdGVfTWFjcm9zIEFEQyBQcml2YXRlIE1hY3Jvcw0KLSAqIEB7DQotICovDQotDQotLyoqDQotICogQGJyaWVmICBEcml2ZXIgbWFjcm8gcmVzZXJ2ZWQgZm9yIGludGVybmFsIHVzZTogc2V0IGEgcG9pbnRlciB0bw0KLSAqICAgICAgICAgYSByZWdpc3RlciBmcm9tIGEgcmVnaXN0ZXIgYmFzaXMgZnJvbSB3aGljaCBhbiBvZmZzZXQNCi0gKiAgICAgICAgIGlzIGFwcGxpZWQuDQotICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIGJhc2lzIGZyb20gd2hpY2ggdGhlIG9mZnNldCBpcyBhcHBsaWVkLg0KLSAqIEBwYXJhbSAgX19SRUdfT0ZGRlNFVF9fIE9mZnNldCB0byBiZSBhcHBsaWVkICh1bml0OiBudW1iZXIgb2YgcmVnaXN0ZXJzKS4NCi0gKiBAcmV0dmFsIFBvaW50ZXIgdG8gcmVnaXN0ZXIgYWRkcmVzcw0KLSAqLw0KLSNkZWZpbmUgX19BRENfUFRSX1JFR19PRkZTRVQoX19SRUdfXywgX19SRUdfT0ZGRlNFVF9fKSAgIFwNCi0gICgoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJihfX1JFR19fKSkgKyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUkVHX09GRkZTRVRfXykgPDwgMlVMKSkpKQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpDQotLyoqIEBkZWZncm91cCBBRENfTExfRVNfSU5JVCBBREMgRXhwb3J0ZWQgSW5pdCBzdHJ1Y3R1cmUNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU3RydWN0dXJlIGRlZmluaXRpb24gb2Ygc29tZSBmZWF0dXJlcyBvZiBBREMgY29tbW9uIHBhcmFtZXRlcnMNCi0gKiAgICAgICAgIGFuZCBtdWx0aW1vZGUNCi0gKiAgICAgICAgIChhbGwgQURDIGluc3RhbmNlcyBiZWxvbmdpbmcgdG8gdGhlIHNhbWUgQURDIGNvbW1vbiBpbnN0YW5jZSkuDQotICogQG5vdGUgICBUaGUgc2V0dGluZyBvZiB0aGVzZSBwYXJhbWV0ZXJzIGJ5IGZ1bmN0aW9uIEByZWYgTExfQURDX0NvbW1vbkluaXQoKQ0KLSAqICAgICAgICAgaXMgY29uZGl0aW9uZWQgdG8gQURDIGluc3RhbmNlcyBzdGF0ZSAoYWxsIEFEQyBpbnN0YW5jZXMNCi0gKiAgICAgICAgIHNoYXJpbmcgdGhlIHNhbWUgQURDIGNvbW1vbiBpbnN0YW5jZSk6DQotICogICAgICAgICBBbGwgQURDIGluc3RhbmNlcyBzaGFyaW5nIHRoZSBzYW1lIEFEQyBjb21tb24gaW5zdGFuY2UgbXVzdCBiZQ0KLSAqICAgICAgICAgZGlzYWJsZWQuDQotICovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgdWludDMyX3QNCi0gICAgICBDb21tb25DbG9jazsgLyohPCBTZXQgcGFyYW1ldGVyIGNvbW1vbiB0byBzZXZlcmFsIEFEQzogQ2xvY2sgc291cmNlIGFuZA0KLSAgICAgICAgICAgICAgICAgICAgICBwcmVzY2FsZXIuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgQURDX0xMX0VDX0NPTU1PTl9DTE9DS19TT1VSQ0UNCi0gICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBPbiB0aGlzIFNUTTMyIHNlcmllcywgaWYgQURDIGdyb3VwIGluamVjdGVkIGlzDQotICAgICAgICAgICAgICAgICAgICAgIHVzZWQsIHNvbWUgY2xvY2sgcmF0aW8gY29uc3RyYWludHMgYmV0d2VlbiBBREMgY2xvY2sgYW5kDQotICAgICAgICAgICAgICAgICAgICAgIEFIQiBjbG9jayBtdXN0IGJlIHJlc3BlY3RlZC4gUmVmZXIgdG8gcmVmZXJlbmNlIG1hbnVhbC4NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeQ0KLSAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBAcmVmIExMX0FEQ19TZXRDb21tb25DbG9jaygpLiAqLw0KLQ0KLSNpZiBkZWZpbmVkKEFEQ19NVUxUSU1PREVfU1VQUE9SVCkNCi0gIHVpbnQzMl90DQotICAgICAgTXVsdGltb2RlOyAvKiE8IFNldCBBREMgbXVsdGltb2RlIGNvbmZpZ3VyYXRpb24gdG8gb3BlcmF0ZSBpbiBpbmRlcGVuZGVudA0KLSAgICAgICAgICAgICAgICAgICAgbW9kZSBvciBtdWx0aW1vZGUgKGZvciBkZXZpY2VzIHdpdGggc2V2ZXJhbCBBREMgaW5zdGFuY2VzKS4NCi0gICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBBRENfTExfRUNfTVVMVElfTU9ERQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeQ0KLSAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gQHJlZiBMTF9BRENfU2V0TXVsdGltb2RlKCkuICovDQotDQotICB1aW50MzJfdCBNdWx0aURNQVRyYW5zZmVyOyAvKiE8IFNldCBBREMgbXVsdGltb2RlIGNvbnZlcnNpb24gZGF0YSB0cmFuc2Zlcjogbm8NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyIG9yIHRyYW5zZmVyIGJ5IERNQS4gVGhpcyBwYXJhbWV0ZXIgY2FuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBhIHZhbHVlIG9mIEByZWYgQURDX0xMX0VDX01VTFRJX0RNQV9UUkFOU0ZFUg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRhcnkgZnVuY3Rpb24gQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfQURDX1NldE11bHRpRE1BVHJhbnNmZXIoKS4gKi8NCi0NCi0gIHVpbnQzMl90IE11bHRpVHdvU2FtcGxpbmdEZWxheTsgLyohPCBTZXQgQURDIG11bHRpbW9kZSBkZWxheSBiZXR3ZWVuIDINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmcgcGhhc2VzLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBvZiBAcmVmIEFEQ19MTF9FQ19NVUxUSV9UV09TTVBfREVMQVkNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX0FEQ19TZXRNdWx0aVR3b1NhbXBsaW5nRGVsYXkoKS4gKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQURDX01VTFRJTU9ERV9TVVBQT1JUICovDQotDQotfSBMTF9BRENfQ29tbW9uSW5pdFR5cGVEZWY7DQotDQotLyoqDQotICogQGJyaWVmICBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBvZiBzb21lIGZlYXR1cmVzIG9mIEFEQyBpbnN0YW5jZS4NCi0gKiBAbm90ZSAgIFRoZXNlIHBhcmFtZXRlcnMgaGF2ZSBhbiBpbXBhY3Qgb24gQURDIHNjb3BlOiBBREMgaW5zdGFuY2UuDQotICogICAgICAgICBBZmZlY3RzIGJvdGggZ3JvdXAgcmVndWxhciBhbmQgZ3JvdXAgaW5qZWN0ZWQgKGF2YWlsYWJpbGl0eQ0KLSAqICAgICAgICAgb2YgQURDIGdyb3VwIGluamVjdGVkIGRlcGVuZHMgb24gU1RNMzIgZmFtaWxpZXMpLg0KLSAqICAgICAgICAgUmVmZXIgdG8gY29ycmVzcG9uZGluZyB1bml0YXJ5IGZ1bmN0aW9ucyBpbnRvDQotICogICAgICAgICBAcmVmIEFEQ19MTF9FRl9Db25maWd1cmF0aW9uX0FEQ19JbnN0YW5jZSAuDQotICogQG5vdGUgICBUaGUgc2V0dGluZyBvZiB0aGVzZSBwYXJhbWV0ZXJzIGJ5IGZ1bmN0aW9uIEByZWYgTExfQURDX0luaXQoKQ0KLSAqICAgICAgICAgaXMgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlOg0KLSAqICAgICAgICAgQURDIGluc3RhbmNlIG11c3QgYmUgZGlzYWJsZWQuDQotICogICAgICAgICBUaGlzIGNvbmRpdGlvbiBpcyBhcHBsaWVkIHRvIGFsbCBBREMgZmVhdHVyZXMsIGZvciBlZmZpY2llbmN5DQotICogICAgICAgICBhbmQgY29tcGF0aWJpbGl0eSBvdmVyIGFsbCBTVE0zMiBmYW1pbGllcy4gSG93ZXZlciwgdGhlIGRpZmZlcmVudA0KLSAqICAgICAgICAgZmVhdHVyZXMgY2FuIGJlIHNldCB1bmRlciBkaWZmZXJlbnQgQURDIHN0YXRlIGNvbmRpdGlvbnMNCi0gKiAgICAgICAgIChzZXR0aW5nIHBvc3NpYmxlIHdpdGggQURDIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nLA0KLSAqICAgICAgICAgQURDIGVuYWJsZWQgd2l0aCBjb252ZXJzaW9uIG9uIGdvaW5nLCAuLi4pDQotICogICAgICAgICBFYWNoIGZlYXR1cmUgY2FuIGJlIHVwZGF0ZWQgYWZ0ZXJ3YXJkcyB3aXRoIGEgdW5pdGFyeSBmdW5jdGlvbg0KLSAqICAgICAgICAgYW5kIHBvdGVudGlhbGx5IHdpdGggQURDIGluIGEgZGlmZmVyZW50IHN0YXRlIHRoYW4gZGlzYWJsZWQsDQotICogICAgICAgICByZWZlciB0byBkZXNjcmlwdGlvbiBvZiBlYWNoIGZ1bmN0aW9uIGZvciBzZXR0aW5nDQotICogICAgICAgICBjb25kaXRpb25lZCB0byBBREMgc3RhdGUuDQotICovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgdWludDMyX3QgUmVzb2x1dGlvbjsgLyohPCBTZXQgQURDIHJlc29sdXRpb24uDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19MTF9FQ19SRVNPTFVUSU9ODQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0FEQ19TZXRSZXNvbHV0aW9uKCkuICovDQotDQotICB1aW50MzJfdCBEYXRhQWxpZ25tZW50OyAvKiE8IFNldCBBREMgY29udmVyc2lvbiBkYXRhIGFsaWdubWVudC4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0xMX0VDX0RBVEFfQUxJR04NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfQURDX1NldERhdGFBbGlnbm1lbnQoKS4gKi8NCi0NCi0gIHVpbnQzMl90DQotICAgICAgTG93UG93ZXJNb2RlOyAvKiE8IFNldCBBREMgbG93IHBvd2VyIG1vZGUuDQotICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX0xMX0VDX0xQX01PREUNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkNCi0gICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEByZWYgTExfQURDX1NldExvd1Bvd2VyTW9kZSgpLiAqLw0KLQ0KLX0gTExfQURDX0luaXRUeXBlRGVmOw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU3RydWN0dXJlIGRlZmluaXRpb24gb2Ygc29tZSBmZWF0dXJlcyBvZiBBREMgZ3JvdXAgcmVndWxhci4NCi0gKiBAbm90ZSAgIFRoZXNlIHBhcmFtZXRlcnMgaGF2ZSBhbiBpbXBhY3Qgb24gQURDIHNjb3BlOiBBREMgZ3JvdXAgcmVndWxhci4NCi0gKiAgICAgICAgIFJlZmVyIHRvIGNvcnJlc3BvbmRpbmcgdW5pdGFyeSBmdW5jdGlvbnMgaW50bw0KLSAqICAgICAgICAgQHJlZiBBRENfTExfRUZfQ29uZmlndXJhdGlvbl9BRENfR3JvdXBfUmVndWxhcg0KLSAqICAgICAgICAgKGZ1bmN0aW9ucyB3aXRoIHByZWZpeCAiUkVHIikuDQotICogQG5vdGUgICBUaGUgc2V0dGluZyBvZiB0aGVzZSBwYXJhbWV0ZXJzIGJ5IGZ1bmN0aW9uIEByZWYgTExfQURDX1JFR19Jbml0KCkNCi0gKiAgICAgICAgIGlzIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZToNCi0gKiAgICAgICAgIEFEQyBpbnN0YW5jZSBtdXN0IGJlIGRpc2FibGVkLg0KLSAqICAgICAgICAgVGhpcyBjb25kaXRpb24gaXMgYXBwbGllZCB0byBhbGwgQURDIGZlYXR1cmVzLCBmb3IgZWZmaWNpZW5jeQ0KLSAqICAgICAgICAgYW5kIGNvbXBhdGliaWxpdHkgb3ZlciBhbGwgU1RNMzIgZmFtaWxpZXMuIEhvd2V2ZXIsIHRoZSBkaWZmZXJlbnQNCi0gKiAgICAgICAgIGZlYXR1cmVzIGNhbiBiZSBzZXQgdW5kZXIgZGlmZmVyZW50IEFEQyBzdGF0ZSBjb25kaXRpb25zDQotICogICAgICAgICAoc2V0dGluZyBwb3NzaWJsZSB3aXRoIEFEQyBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZywNCi0gKiAgICAgICAgIEFEQyBlbmFibGVkIHdpdGggY29udmVyc2lvbiBvbiBnb2luZywgLi4uKQ0KLSAqICAgICAgICAgRWFjaCBmZWF0dXJlIGNhbiBiZSB1cGRhdGVkIGFmdGVyd2FyZHMgd2l0aCBhIHVuaXRhcnkgZnVuY3Rpb24NCi0gKiAgICAgICAgIGFuZCBwb3RlbnRpYWxseSB3aXRoIEFEQyBpbiBhIGRpZmZlcmVudCBzdGF0ZSB0aGFuIGRpc2FibGVkLA0KLSAqICAgICAgICAgcmVmZXIgdG8gZGVzY3JpcHRpb24gb2YgZWFjaCBmdW5jdGlvbiBmb3Igc2V0dGluZw0KLSAqICAgICAgICAgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlLg0KLSAqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gIHVpbnQzMl90DQotICAgICAgVHJpZ2dlclNvdXJjZTsgLyohPCBTZXQgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIHNvdXJjZToNCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbCAoU1cgc3RhcnQpIG9yIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbCAodGltZXINCi0gICAgICAgICAgICAgICAgICAgICAgICBldmVudCwgZXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUpLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIG9mIEByZWYgQURDX0xMX0VDX1JFR19UUklHR0VSX1NPVVJDRQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgT24gdGhpcyBTVE0zMiBzZXJpZXMsIHNldHRpbmcgdHJpZ2dlciBzb3VyY2UgdG8NCi0gICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbCB0cmlnZ2VyIGFsc28gc2V0IHRyaWdnZXIgcG9sYXJpdHkgdG8gcmlzaW5nDQotICAgICAgICAgICAgICAgICAgICAgICAgZWRnZSAoZGVmYXVsdCBzZXR0aW5nIGZvciBjb21wYXRpYmlsaXR5IHdpdGggc29tZSBBREMgb24NCi0gICAgICAgICAgICAgICAgICAgICAgICBvdGhlciBTVE0zMiBmYW1pbGllcyBoYXZpbmcgdGhpcyBzZXR0aW5nIHNldCBieSBIVw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgdmFsdWUpLiBJbiBjYXNlIG9mIG5lZWQgdG8gbW9kaWZ5IHRyaWdnZXIgZWRnZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2UgZnVuY3Rpb24gQHJlZiBMTF9BRENfUkVHX1NldFRyaWdnZXJFZGdlKCkuDQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEByZWYgTExfQURDX1JFR19TZXRUcmlnZ2VyU291cmNlKCkuICovDQotDQotICB1aW50MzJfdCBTZXF1ZW5jZXJMZW5ndGg7IC8qITwgU2V0IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBsZW5ndGguDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfTExfRUNfUkVHX1NFUV9TQ0FOX0xFTkdUSA0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0YXJ5IGZ1bmN0aW9uIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJMZW5ndGgoKS4gKi8NCi0NCi0gIHVpbnQzMl90DQotICAgICAgU2VxdWVuY2VyRGlzY29udDsgLyohPCBTZXQgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGRpc2NvbnRpbnVvdXMgbW9kZToNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZSBzdWJkaXZpZGVkIGFuZCBzY2FuIGNvbnZlcnNpb25zIGludGVycnVwdGVkDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlcnkgc2VsZWN0ZWQgbnVtYmVyIG9mIHJhbmtzLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhIHZhbHVlIG9mIEByZWYgQURDX0xMX0VDX1JFR19TRVFfRElTQ09OVF9NT0RFDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBUaGlzIHBhcmFtZXRlciBoYXMgYW4gZWZmZWN0IG9ubHkgaWYgZ3JvdXANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZWd1bGFyIHNlcXVlbmNlciBpcyBlbmFibGVkIChzY2FuIGxlbmd0aCBvZiAyIHJhbmtzDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgbW9yZSkuDQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0YXJ5IGZ1bmN0aW9uIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlckRpc2NvbnQoKS4gKi8NCi0NCi0gIHVpbnQzMl90DQotICAgICAgQ29udGludW91c01vZGU7IC8qITwgU2V0IEFEQyBjb250aW51b3VzIGNvbnZlcnNpb24gbW9kZSBvbiBBREMgZ3JvdXANCi0gICAgICAgICAgICAgICAgICAgICAgICAgcmVndWxhciwgd2hldGhlciBBREMgY29udmVyc2lvbnMgYXJlIHBlcmZvcm1lZCBpbg0KLSAgICAgICAgICAgICAgICAgICAgICAgICBzaW5nbGUgbW9kZSAob25lIGNvbnZlcnNpb24gcGVyIHRyaWdnZXIpIG9yIGluDQotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVvdXMgbW9kZSAoYWZ0ZXIgdGhlIGZpcnN0IHRyaWdnZXIsIGZvbGxvd2luZw0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9ucyBsYXVuY2hlZCBzdWNjZXNzaXZlbHkgYXV0b21hdGljYWxseSkuIFRoaXMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgQURDX0xMX0VDX1JFR19DT05USU5VT1VTX01PREUgTm90ZTogSXQgaXMgbm90IHBvc3NpYmxlDQotICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGVuYWJsZSBib3RoIEFEQyBncm91cCByZWd1bGFyIGNvbnRpbnVvdXMgbW9kZSBhbmQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgZGlzY29udGludW91cyBtb2RlLg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5DQotICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEByZWYgTExfQURDX1JFR19TZXRDb250aW51b3VzTW9kZSgpLiAqLw0KLQ0KLSAgdWludDMyX3QgRE1BVHJhbnNmZXI7IC8qITwgU2V0IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gZGF0YSB0cmFuc2Zlcjogbm8NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2ZlciBvciB0cmFuc2ZlciBieSBETUEsIGFuZCBETUEgcmVxdWVzdHMgbW9kZS4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfTExfRUNfUkVHX0RNQV9UUkFOU0ZFUg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0FEQ19SRUdfU2V0RE1BVHJhbnNmZXIoKS4gKi8NCi0NCi0gIHVpbnQzMl90IE92ZXJydW47IC8qITwgU2V0IEFEQyBncm91cCByZWd1bGFyIGJlaGF2aW9yIGluIGNhc2Ugb2Ygb3ZlcnJ1bjoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSBwcmVzZXJ2ZWQgb3Igb3ZlcndyaXR0ZW4uDQotICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgIEFEQ19MTF9FQ19SRUdfT1ZSX0RBVEFfQkVIQVZJT1INCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkNCi0gICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEByZWYgTExfQURDX1JFR19TZXRPdmVycnVuKCkuICovDQotDQotfSBMTF9BRENfUkVHX0luaXRUeXBlRGVmOw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU3RydWN0dXJlIGRlZmluaXRpb24gb2Ygc29tZSBmZWF0dXJlcyBvZiBBREMgZ3JvdXAgaW5qZWN0ZWQuDQotICogQG5vdGUgICBUaGVzZSBwYXJhbWV0ZXJzIGhhdmUgYW4gaW1wYWN0IG9uIEFEQyBzY29wZTogQURDIGdyb3VwIGluamVjdGVkLg0KLSAqICAgICAgICAgUmVmZXIgdG8gY29ycmVzcG9uZGluZyB1bml0YXJ5IGZ1bmN0aW9ucyBpbnRvDQotICogICAgICAgICBAcmVmIEFEQ19MTF9FRl9Db25maWd1cmF0aW9uX0FEQ19Hcm91cF9SZWd1bGFyDQotICogICAgICAgICAoZnVuY3Rpb25zIHdpdGggcHJlZml4ICJJTkoiKS4NCi0gKiBAbm90ZSAgIFRoZSBzZXR0aW5nIG9mIHRoZXNlIHBhcmFtZXRlcnMgYnkgZnVuY3Rpb24gQHJlZiBMTF9BRENfSU5KX0luaXQoKQ0KLSAqICAgICAgICAgaXMgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlOg0KLSAqICAgICAgICAgQURDIGluc3RhbmNlIG11c3QgYmUgZGlzYWJsZWQuDQotICogICAgICAgICBUaGlzIGNvbmRpdGlvbiBpcyBhcHBsaWVkIHRvIGFsbCBBREMgZmVhdHVyZXMsIGZvciBlZmZpY2llbmN5DQotICogICAgICAgICBhbmQgY29tcGF0aWJpbGl0eSBvdmVyIGFsbCBTVE0zMiBmYW1pbGllcy4gSG93ZXZlciwgdGhlIGRpZmZlcmVudA0KLSAqICAgICAgICAgZmVhdHVyZXMgY2FuIGJlIHNldCB1bmRlciBkaWZmZXJlbnQgQURDIHN0YXRlIGNvbmRpdGlvbnMNCi0gKiAgICAgICAgIChzZXR0aW5nIHBvc3NpYmxlIHdpdGggQURDIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nLA0KLSAqICAgICAgICAgQURDIGVuYWJsZWQgd2l0aCBjb252ZXJzaW9uIG9uIGdvaW5nLCAuLi4pDQotICogICAgICAgICBFYWNoIGZlYXR1cmUgY2FuIGJlIHVwZGF0ZWQgYWZ0ZXJ3YXJkcyB3aXRoIGEgdW5pdGFyeSBmdW5jdGlvbg0KLSAqICAgICAgICAgYW5kIHBvdGVudGlhbGx5IHdpdGggQURDIGluIGEgZGlmZmVyZW50IHN0YXRlIHRoYW4gZGlzYWJsZWQsDQotICogICAgICAgICByZWZlciB0byBkZXNjcmlwdGlvbiBvZiBlYWNoIGZ1bmN0aW9uIGZvciBzZXR0aW5nDQotICogICAgICAgICBjb25kaXRpb25lZCB0byBBREMgc3RhdGUuDQotICovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgdWludDMyX3QNCi0gICAgICBUcmlnZ2VyU291cmNlOyAvKiE8IFNldCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIHNvdXJjZToNCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbCAoU1cgc3RhcnQpIG9yIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbCAodGltZXINCi0gICAgICAgICAgICAgICAgICAgICAgICBldmVudCwgZXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUpLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIG9mIEByZWYgQURDX0xMX0VDX0lOSl9UUklHR0VSX1NPVVJDRQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgT24gdGhpcyBTVE0zMiBzZXJpZXMsIHNldHRpbmcgdHJpZ2dlciBzb3VyY2UgdG8NCi0gICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbCB0cmlnZ2VyIGFsc28gc2V0IHRyaWdnZXIgcG9sYXJpdHkgdG8gcmlzaW5nDQotICAgICAgICAgICAgICAgICAgICAgICAgZWRnZSAoZGVmYXVsdCBzZXR0aW5nIGZvciBjb21wYXRpYmlsaXR5IHdpdGggc29tZSBBREMgb24NCi0gICAgICAgICAgICAgICAgICAgICAgICBvdGhlciBTVE0zMiBmYW1pbGllcyBoYXZpbmcgdGhpcyBzZXR0aW5nIHNldCBieSBIVw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgdmFsdWUpLiBJbiBjYXNlIG9mIG5lZWQgdG8gbW9kaWZ5IHRyaWdnZXIgZWRnZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2UgZnVuY3Rpb24gQHJlZiBMTF9BRENfSU5KX1NldFRyaWdnZXJFZGdlKCkuDQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEByZWYgTExfQURDX0lOSl9TZXRUcmlnZ2VyU291cmNlKCkuICovDQotDQotICB1aW50MzJfdCBTZXF1ZW5jZXJMZW5ndGg7IC8qITwgU2V0IEFEQyBncm91cCBpbmplY3RlZCBzZXF1ZW5jZXIgbGVuZ3RoLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0xMX0VDX0lOSl9TRVFfU0NBTl9MRU5HVEgNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdGFyeSBmdW5jdGlvbiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX0FEQ19JTkpfU2V0U2VxdWVuY2VyTGVuZ3RoKCkuICovDQotDQotICB1aW50MzJfdCBTZXF1ZW5jZXJEaXNjb250OyAvKiE8IFNldCBBREMgZ3JvdXAgaW5qZWN0ZWQgc2VxdWVuY2VyIGRpc2NvbnRpbnVvdXMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGU6IHNlcXVlbmNlIHN1YmRpdmlkZWQgYW5kIHNjYW4gY29udmVyc2lvbnMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdGVkIGV2ZXJ5IHNlbGVjdGVkIG51bWJlciBvZiByYW5rcy4gVGhpcw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19MTF9FQ19JTkpfU0VRX0RJU0NPTlRfTU9ERQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBUaGlzIHBhcmFtZXRlciBoYXMgYW4gZWZmZWN0IG9ubHkgaWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwIGluamVjdGVkIHNlcXVlbmNlciBpcyBlbmFibGVkIChzY2FuIGxlbmd0aA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgMiByYW5rcyBvciBtb3JlKS4NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0YXJ5IGZ1bmN0aW9uIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX0FEQ19JTkpfU2V0U2VxdWVuY2VyRGlzY29udCgpLiAqLw0KLQ0KLSAgdWludDMyX3QgVHJpZ0F1dG87IC8qITwgU2V0IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXI6IGluZGVwZW5kZW50DQotICAgICAgICAgICAgICAgICAgICAgICAgb3IgZnJvbSBBREMgZ3JvdXAgcmVndWxhci4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUNCi0gICAgICAgICAgICAgICAgICAgICAgICBvZiBAcmVmIEFEQ19MTF9FQ19JTkpfVFJJR19BVVRPIE5vdGU6IFRoaXMgcGFyYW1ldGVyDQotICAgICAgICAgICAgICAgICAgICAgICAgbXVzdCBiZSBzZXQgdG8gc2V0IHRvIGluZGVwZW5kZW50IHRyaWdnZXIgaWYgaW5qZWN0ZWQNCi0gICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyIHNvdXJjZSBpcyBzZXQgdG8gYW4gZXh0ZXJuYWwgdHJpZ2dlci4NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5DQotICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gQHJlZiBMTF9BRENfSU5KX1NldFRyaWdBdXRvKCkuICovDQotDQotfSBMTF9BRENfSU5KX0luaXRUeXBlRGVmOw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLw0KLQ0KLS8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBkZWZncm91cCBBRENfTExfRXhwb3J0ZWRfQ29uc3RhbnRzIEFEQyBFeHBvcnRlZCBDb25zdGFudHMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX0ZMQUcgQURDIGZsYWdzDQotICogQGJyaWVmICAgIEZsYWdzIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9BRENfUmVhZFJlZyBmdW5jdGlvbg0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9BRENfRkxBR19BRFJEWSBBRENfSVNSX0FEUkRZIC8qITwgQURDIGZsYWcgQURDIGluc3RhbmNlIHJlYWR5ICovDQotI2RlZmluZSBMTF9BRENfRkxBR19FT0MgXA0KLSAgQURDX0lTUl9FT0MgLyohPCBBREMgZmxhZyBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2YgdW5pdGFyeSBjb252ZXJzaW9uICovDQotI2RlZmluZSBMTF9BRENfRkxBR19FT1MgXA0KLSAgQURDX0lTUl9FT1MgLyohPCBBREMgZmxhZyBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2Ygc2VxdWVuY2UgY29udmVyc2lvbnMgKi8NCi0jZGVmaW5lIExMX0FEQ19GTEFHX09WUiBBRENfSVNSX09WUiAvKiE8IEFEQyBmbGFnIEFEQyBncm91cCByZWd1bGFyIG92ZXJydW4gKi8NCi0jZGVmaW5lIExMX0FEQ19GTEFHX0VPU01QIFwNCi0gIEFEQ19JU1JfRU9TTVAgLyohPCBBREMgZmxhZyBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2Ygc2FtcGxpbmcgcGhhc2UgKi8NCi0jZGVmaW5lIExMX0FEQ19GTEFHX0pFT0MgXA0KLSAgQURDX0lTUl9KRU9DIC8qITwgQURDIGZsYWcgQURDIGdyb3VwIGluamVjdGVkIGVuZCBvZiB1bml0YXJ5IGNvbnZlcnNpb24gKi8NCi0jZGVmaW5lIExMX0FEQ19GTEFHX0pFT1MgXA0KLSAgQURDX0lTUl9KRU9TIC8qITwgQURDIGZsYWcgQURDIGdyb3VwIGluamVjdGVkIGVuZCBvZiBzZXF1ZW5jZSBjb252ZXJzaW9ucyAqLw0KLSNkZWZpbmUgTExfQURDX0ZMQUdfSlFPVkYgXA0KLSAgQURDX0lTUl9KUU9WRiAvKiE8IEFEQyBmbGFnIEFEQyBncm91cCBpbmplY3RlZCBjb250ZXh0cyBxdWV1ZSBvdmVyZmxvdyAqLw0KLSNkZWZpbmUgTExfQURDX0ZMQUdfQVdEMSBBRENfSVNSX0FXRDEgLyohPCBBREMgZmxhZyBBREMgYW5hbG9nIHdhdGNoZG9nIDEgKi8NCi0jZGVmaW5lIExMX0FEQ19GTEFHX0FXRDIgQURDX0lTUl9BV0QyIC8qITwgQURDIGZsYWcgQURDIGFuYWxvZyB3YXRjaGRvZyAyICovDQotI2RlZmluZSBMTF9BRENfRkxBR19BV0QzIEFEQ19JU1JfQVdEMyAvKiE8IEFEQyBmbGFnIEFEQyBhbmFsb2cgd2F0Y2hkb2cgMyAqLw0KLSNpZiBkZWZpbmVkKEFEQ19NVUxUSU1PREVfU1VQUE9SVCkNCi0jZGVmaW5lIExMX0FEQ19GTEFHX0FEUkRZX01TVCBcDQotICBBRENfQ1NSX0FEUkRZX01TVCAvKiE8IEFEQyBmbGFnIEFEQyBtdWx0aW1vZGUgbWFzdGVyIGluc3RhbmNlIHJlYWR5ICovDQotI2RlZmluZSBMTF9BRENfRkxBR19BRFJEWV9TTFYgXA0KLSAgQURDX0NTUl9BRFJEWV9TTFYgLyohPCBBREMgZmxhZyBBREMgbXVsdGltb2RlIHNsYXZlIGluc3RhbmNlIHJlYWR5ICovDQotI2RlZmluZSBMTF9BRENfRkxBR19FT0NfTVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBBRENfQ1NSX0VPQ19NU1QgLyohPCBBREMgZmxhZyBBREMgbXVsdGltb2RlIG1hc3RlciBncm91cCByZWd1bGFyIGVuZCBvZiBcDQotICAgICAgICAgICAgICAgICAgICAgdW5pdGFyeSBjb252ZXJzaW9uICovDQotI2RlZmluZSBMTF9BRENfRkxBR19FT0NfU0xWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIEFEQ19DU1JfRU9DX1NMViAvKiE8IEFEQyBmbGFnIEFEQyBtdWx0aW1vZGUgc2xhdmUgZ3JvdXAgcmVndWxhciBlbmQgb2YgXA0KLSAgICAgICAgICAgICAgICAgICAgIHVuaXRhcnkgY29udmVyc2lvbiAqLw0KLSNkZWZpbmUgTExfQURDX0ZMQUdfRU9TX01TVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgQURDX0NTUl9FT1NfTVNUIC8qITwgQURDIGZsYWcgQURDIG11bHRpbW9kZSBtYXN0ZXIgZ3JvdXAgcmVndWxhciBlbmQgb2YgXA0KLSAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlIGNvbnZlcnNpb25zICovDQotI2RlZmluZSBMTF9BRENfRkxBR19FT1NfU0xWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIEFEQ19DU1JfRU9TX1NMViAvKiE8IEFEQyBmbGFnIEFEQyBtdWx0aW1vZGUgc2xhdmUgZ3JvdXAgcmVndWxhciBlbmQgb2YgXA0KLSAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlIGNvbnZlcnNpb25zICovDQotI2RlZmluZSBMTF9BRENfRkxBR19PVlJfTVNUIFwNCi0gIEFEQ19DU1JfT1ZSX01TVCAvKiE8IEFEQyBmbGFnIEFEQyBtdWx0aW1vZGUgbWFzdGVyIGdyb3VwIHJlZ3VsYXIgb3ZlcnJ1biAqLw0KLSNkZWZpbmUgTExfQURDX0ZMQUdfT1ZSX1NMViBcDQotICBBRENfQ1NSX09WUl9TTFYgLyohPCBBREMgZmxhZyBBREMgbXVsdGltb2RlIHNsYXZlIGdyb3VwIHJlZ3VsYXIgb3ZlcnJ1biAqLw0KLSNkZWZpbmUgTExfQURDX0ZMQUdfRU9TTVBfTVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBBRENfQ1NSX0VPU01QX01TVCAvKiE8IEFEQyBmbGFnIEFEQyBtdWx0aW1vZGUgbWFzdGVyIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIFwNCi0gICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nIHBoYXNlICovDQotI2RlZmluZSBMTF9BRENfRkxBR19FT1NNUF9TTFYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgQURDX0NTUl9FT1NNUF9TTFYgLyohPCBBREMgZmxhZyBBREMgbXVsdGltb2RlIHNsYXZlIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIFwNCi0gICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nIHBoYXNlICovDQotI2RlZmluZSBMTF9BRENfRkxBR19KRU9DX01TVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIEFEQ19DU1JfSkVPQ19NU1QgLyohPCBBREMgZmxhZyBBREMgbXVsdGltb2RlIG1hc3RlciBncm91cCBpbmplY3RlZCBlbmQgb2YgXA0KLSAgICAgICAgICAgICAgICAgICAgICB1bml0YXJ5IGNvbnZlcnNpb24gKi8NCi0jZGVmaW5lIExMX0FEQ19GTEFHX0pFT0NfU0xWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBBRENfQ1NSX0pFT0NfU0xWIC8qITwgQURDIGZsYWcgQURDIG11bHRpbW9kZSBzbGF2ZSBncm91cCBpbmplY3RlZCBlbmQgb2YgXA0KLSAgICAgICAgICAgICAgICAgICAgICB1bml0YXJ5IGNvbnZlcnNpb24gKi8NCi0jZGVmaW5lIExMX0FEQ19GTEFHX0pFT1NfTVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgQURDX0NTUl9KRU9TX01TVCAvKiE8IEFEQyBmbGFnIEFEQyBtdWx0aW1vZGUgbWFzdGVyIGdyb3VwIGluamVjdGVkIGVuZCBvZiBcDQotICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlIGNvbnZlcnNpb25zICovDQotI2RlZmluZSBMTF9BRENfRkxBR19KRU9TX1NMViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgQURDX0NTUl9KRU9TX1NMViAvKiE8IEFEQyBmbGFnIEFEQyBtdWx0aW1vZGUgc2xhdmUgZ3JvdXAgaW5qZWN0ZWQgZW5kIG9mIFwNCi0gICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2UgY29udmVyc2lvbnMgKi8NCi0jZGVmaW5lIExMX0FEQ19GTEFHX0pRT1ZGX01TVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgQURDX0NTUl9KUU9WRl9NU1QgLyohPCBBREMgZmxhZyBBREMgbXVsdGltb2RlIG1hc3RlciBncm91cCBpbmplY3RlZCBjb250ZXh0cyBcDQotICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSBvdmVyZmxvdyAqLw0KLSNkZWZpbmUgTExfQURDX0ZMQUdfSlFPVkZfU0xWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIEFEQ19DU1JfSlFPVkZfU0xWIC8qITwgQURDIGZsYWcgQURDIG11bHRpbW9kZSBzbGF2ZSBncm91cCBpbmplY3RlZCBjb250ZXh0cyBcDQotICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSBvdmVyZmxvdyAqLw0KLSNkZWZpbmUgTExfQURDX0ZMQUdfQVdEMV9NU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBBRENfQ1NSX0FXRDFfTVNUIC8qITwgQURDIGZsYWcgQURDIG11bHRpbW9kZSBtYXN0ZXIgYW5hbG9nIHdhdGNoZG9nIDEgb2YgdGhlIFwNCi0gICAgICAgICAgICAgICAgICAgICAgQURDIG1hc3RlciAqLw0KLSNkZWZpbmUgTExfQURDX0ZMQUdfQVdEMV9TTFYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIEFEQ19DU1JfQVdEMV9TTFYgLyohPCBBREMgZmxhZyBBREMgbXVsdGltb2RlIHNsYXZlIGFuYWxvZyB3YXRjaGRvZyAxIG9mIHRoZSBcDQotICAgICAgICAgICAgICAgICAgICAgIEFEQyBzbGF2ZSAqLw0KLSNkZWZpbmUgTExfQURDX0ZMQUdfQVdEMl9NU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBBRENfQ1NSX0FXRDJfTVNUIC8qITwgQURDIGZsYWcgQURDIG11bHRpbW9kZSBtYXN0ZXIgYW5hbG9nIHdhdGNoZG9nIDIgb2YgdGhlIFwNCi0gICAgICAgICAgICAgICAgICAgICAgQURDIG1hc3RlciAqLw0KLSNkZWZpbmUgTExfQURDX0ZMQUdfQVdEMl9TTFYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIEFEQ19DU1JfQVdEMl9TTFYgLyohPCBBREMgZmxhZyBBREMgbXVsdGltb2RlIHNsYXZlIGFuYWxvZyB3YXRjaGRvZyAyIG9mIHRoZSBcDQotICAgICAgICAgICAgICAgICAgICAgIEFEQyBzbGF2ZSAqLw0KLSNkZWZpbmUgTExfQURDX0ZMQUdfQVdEM19NU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBBRENfQ1NSX0FXRDNfTVNUIC8qITwgQURDIGZsYWcgQURDIG11bHRpbW9kZSBtYXN0ZXIgYW5hbG9nIHdhdGNoZG9nIDMgb2YgdGhlIFwNCi0gICAgICAgICAgICAgICAgICAgICAgQURDIG1hc3RlciAqLw0KLSNkZWZpbmUgTExfQURDX0ZMQUdfQVdEM19TTFYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIEFEQ19DU1JfQVdEM19TTFYgLyohPCBBREMgZmxhZyBBREMgbXVsdGltb2RlIHNsYXZlIGFuYWxvZyB3YXRjaGRvZyAzIG9mIHRoZSBcDQotICAgICAgICAgICAgICAgICAgICAgIEFEQyBzbGF2ZSAqLw0KLSNlbmRpZiAgICAgICAgICAgICAvKiBBRENfTVVMVElNT0RFX1NVUFBPUlQgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX0lUIEFEQyBpbnRlcnJ1cHRpb25zIGZvciBjb25maWd1cmF0aW9uIChpbnRlcnJ1cHRpb24NCi0gKiBlbmFibGUgb3IgZGlzYWJsZSkNCi0gKiBAYnJpZWYgICAgSVQgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX0FEQ19SZWFkUmVnIGFuZA0KLSAqIExMX0FEQ19Xcml0ZVJlZyBmdW5jdGlvbnMNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfQURDX0lUX0FEUkRZIFwNCi0gIEFEQ19JRVJfQURSRFlJRSAvKiE8IEFEQyBpbnRlcnJ1cHRpb24gQURDIGluc3RhbmNlIHJlYWR5ICovDQotI2RlZmluZSBMTF9BRENfSVRfRU9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBBRENfSUVSX0VPQ0lFIC8qITwgQURDIGludGVycnVwdGlvbiBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2YgdW5pdGFyeSBcDQotICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb24gKi8NCi0jZGVmaW5lIExMX0FEQ19JVF9FT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBBRENfSUVSX0VPU0lFIC8qITwgQURDIGludGVycnVwdGlvbiBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2Ygc2VxdWVuY2UgXA0KLSAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9ucyAqLw0KLSNkZWZpbmUgTExfQURDX0lUX09WUiBcDQotICBBRENfSUVSX09WUklFIC8qITwgQURDIGludGVycnVwdGlvbiBBREMgZ3JvdXAgcmVndWxhciBvdmVycnVuICovDQotI2RlZmluZSBMTF9BRENfSVRfRU9TTVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBBRENfSUVSX0VPU01QSUUgLyohPCBBREMgaW50ZXJydXB0aW9uIEFEQyBncm91cCByZWd1bGFyIGVuZCBvZiBzYW1wbGluZyBcDQotICAgICAgICAgICAgICAgICAgICAgcGhhc2UgKi8NCi0jZGVmaW5lIExMX0FEQ19JVF9KRU9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgQURDX0lFUl9KRU9DSUUgLyohPCBBREMgaW50ZXJydXB0aW9uIEFEQyBncm91cCBpbmplY3RlZCBlbmQgb2YgdW5pdGFyeSBcDQotICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9uICovDQotI2RlZmluZSBMTF9BRENfSVRfSkVPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBBRENfSUVSX0pFT1NJRSAvKiE8IEFEQyBpbnRlcnJ1cHRpb24gQURDIGdyb3VwIGluamVjdGVkIGVuZCBvZiBzZXF1ZW5jZSBcDQotICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9ucyAqLw0KLSNkZWZpbmUgTExfQURDX0lUX0pRT1ZGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgQURDX0lFUl9KUU9WRklFIC8qITwgQURDIGludGVycnVwdGlvbiBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udGV4dHMgcXVldWUgXA0KLSAgICAgICAgICAgICAgICAgICAgIG92ZXJmbG93ICovDQotI2RlZmluZSBMTF9BRENfSVRfQVdEMSBcDQotICBBRENfSUVSX0FXRDFJRSAvKiE8IEFEQyBpbnRlcnJ1cHRpb24gQURDIGFuYWxvZyB3YXRjaGRvZyAxICovDQotI2RlZmluZSBMTF9BRENfSVRfQVdEMiBcDQotICBBRENfSUVSX0FXRDJJRSAvKiE8IEFEQyBpbnRlcnJ1cHRpb24gQURDIGFuYWxvZyB3YXRjaGRvZyAyICovDQotI2RlZmluZSBMTF9BRENfSVRfQVdEMyBcDQotICBBRENfSUVSX0FXRDNJRSAvKiE8IEFEQyBpbnRlcnJ1cHRpb24gQURDIGFuYWxvZyB3YXRjaGRvZyAzICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19SRUdJU1RFUlMgIEFEQyByZWdpc3RlcnMgY29tcGxpYW50IHdpdGggc3BlY2lmaWMgcHVycG9zZQ0KLSAqIEB7DQotICovDQotLyogTGlzdCBvZiBBREMgcmVnaXN0ZXJzIGludGVuZGVkIHRvIGJlIHVzZWQgKG1vc3QgY29tbW9ubHkpIHdpdGggICAgICAgICAgICAgKi8NCi0vKiBETUEgdHJhbnNmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLS8qIFJlZmVyIHRvIGZ1bmN0aW9uIEByZWYgTExfQURDX0RNQV9HZXRSZWdBZGRyKCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9BRENfRE1BX1JFR19SRUdVTEFSX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKDB4MDAwMDAwMDBVTCkgLyogQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBkYXRhIHJlZ2lzdGVyIChjb3JyZXNwb25kaW5nIFwNCi0gICAgICAgICAgICAgICAgICAgIHRvIHJlZ2lzdGVyIERSKSB0byBiZSB1c2VkIHdpdGggQURDIGNvbmZpZ3VyZWQgaW4gICAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICBpbmRlcGVuZGVudCBtb2RlLiBXaXRob3V0IERNQSB0cmFuc2ZlciwgcmVnaXN0ZXIgYWNjZXNzZWQgXA0KLSAgICAgICAgICAgICAgICAgICAgYnkgTEwgZnVuY3Rpb24gQHJlZiBMTF9BRENfUkVHX1JlYWRDb252ZXJzaW9uRGF0YTMyKCkgYW5kIFwNCi0gICAgICAgICAgICAgICAgICAgIG90aGVyIGZ1bmN0aW9ucyBAcmVmIExMX0FEQ19SRUdfUmVhZENvbnZlcnNpb25EYXRheCgpICovDQotI2lmIGRlZmluZWQoQURDX01VTFRJTU9ERV9TVVBQT1JUKQ0KLSNkZWZpbmUgTExfQURDX0RNQV9SRUdfUkVHVUxBUl9EQVRBX01VTFRJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgweDAwMDAwMDAxVUwpIC8qIEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gZGF0YSByZWdpc3RlciAoY29ycmVzcG9uZGluZyBcDQotICAgICAgICAgICAgICAgICAgICB0byByZWdpc3RlciBDRFIpIHRvIGJlIHVzZWQgd2l0aCBBREMgY29uZmlndXJlZCBpbiAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgbXVsdGltb2RlIChhdmFpbGFibGUgb24gU1RNMzIgZGV2aWNlcyB3aXRoIHNldmVyYWwgQURDICAgIFwNCi0gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlcykuIFdpdGhvdXQgRE1BIHRyYW5zZmVyLCByZWdpc3RlciBhY2Nlc3NlZCBieSBMTCBcDQotICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBAcmVmIExMX0FEQ19SRUdfUmVhZE11bHRpQ29udmVyc2lvbkRhdGEzMigpICovDQotI2VuZGlmICAgICAgICAgICAvKiBBRENfTVVMVElNT0RFX1NVUFBPUlQgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX0NPTU1PTl9DTE9DS19TT1VSQ0UgIEFEQyBjb21tb24gLSBDbG9jayBzb3VyY2UNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfQURDX0NMT0NLX1NZTkNfUENMS19ESVYxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0NDUl9DS01PREVfMCkgLyohPCBBREMgc3luY2hyb25vdXMgY2xvY2sgZGVyaXZlZCBmcm9tIEFIQiBjbG9jayB3aXRob3V0IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmVzY2FsZXIgKi8NCi0jZGVmaW5lIExMX0FEQ19DTE9DS19TWU5DX1BDTEtfRElWMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19DQ1JfQ0tNT0RFXzEpIC8qITwgQURDIHN5bmNocm9ub3VzIGNsb2NrIGRlcml2ZWQgZnJvbSBBSEIgY2xvY2sgd2l0aCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2NhbGVyIGRpdmlzaW9uIGJ5IDIgKi8NCi0jZGVmaW5lIExMX0FEQ19DTE9DS19TWU5DX1BDTEtfRElWNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19DQ1JfQ0tNT0RFXzEgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgQURDX0NDUl9DS01PREVfMCkgLyohPCBBREMgc3luY2hyb25vdXMgY2xvY2sgZGVyaXZlZCBmcm9tIEFIQiBjbG9jayB3aXRoIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmVzY2FsZXIgZGl2aXNpb24gYnkgNCAqLw0KLSNkZWZpbmUgTExfQURDX0NMT0NLX0FTWU5DX0RJVjEgXA0KLSAgKDB4MDAwMDAwMDBVTCkgLyohPCBBREMgYXN5bmNocm9ub3VzIGNsb2NrIHdpdGhvdXQgcHJlc2NhbGVyICovDQotI2RlZmluZSBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0NDUl9QUkVTQ18wKSAvKiE8IEFEQyBhc3luY2hyb25vdXMgY2xvY2sgd2l0aCBwcmVzY2FsZXIgZGl2aXNpb24gYnkgMiBcDQotICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX0FEQ19DTE9DS19BU1lOQ19ESVY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0NSX1BSRVNDXzEpIC8qITwgQURDIGFzeW5jaHJvbm91cyBjbG9jayB3aXRoIHByZXNjYWxlciBkaXZpc2lvbiBieSA0IFwNCi0gICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfQURDX0NMT0NLX0FTWU5DX0RJVjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19DQ1JfUFJFU0NfMSB8IEFEQ19DQ1JfUFJFU0NfMCkgLyohPCBBREMgYXN5bmNocm9ub3VzIGNsb2NrIHdpdGggXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2NhbGVyIGRpdmlzaW9uIGJ5IDYgICAqLw0KLSNkZWZpbmUgTExfQURDX0NMT0NLX0FTWU5DX0RJVjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19DQ1JfUFJFU0NfMikgLyohPCBBREMgYXN5bmNocm9ub3VzIGNsb2NrIHdpdGggcHJlc2NhbGVyIGRpdmlzaW9uIGJ5IDggXA0KLSAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0NDUl9QUkVTQ18yIHwgQURDX0NDUl9QUkVTQ18wKSAvKiE8IEFEQyBhc3luY2hyb25vdXMgY2xvY2sgd2l0aCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzY2FsZXIgZGl2aXNpb24gYnkgMTAgICovDQotI2RlZmluZSBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0NDUl9QUkVTQ18yIHwgQURDX0NDUl9QUkVTQ18xKSAvKiE8IEFEQyBhc3luY2hyb25vdXMgY2xvY2sgd2l0aCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzY2FsZXIgZGl2aXNpb24gYnkgMTIgICovDQotI2RlZmluZSBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19DQ1JfUFJFU0NfMiB8IEFEQ19DQ1JfUFJFU0NfMSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBBRENfQ0NSX1BSRVNDXzApIC8qITwgQURDIGFzeW5jaHJvbm91cyBjbG9jayB3aXRoIHByZXNjYWxlciBkaXZpc2lvbiBieSAxNiBcDQotICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX0FEQ19DTE9DS19BU1lOQ19ESVYzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0NDUl9QUkVTQ18zKSAvKiE8IEFEQyBhc3luY2hyb25vdXMgY2xvY2sgd2l0aCBwcmVzY2FsZXIgZGl2aXNpb24gYnkgMzIgXA0KLSAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0NDUl9QUkVTQ18zIHwgQURDX0NDUl9QUkVTQ18wKSAvKiE8IEFEQyBhc3luY2hyb25vdXMgY2xvY2sgd2l0aCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzY2FsZXIgZGl2aXNpb24gYnkgNjQgICovDQotI2RlZmluZSBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMTI4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0NDUl9QUkVTQ18zIHwgQURDX0NDUl9QUkVTQ18xKSAvKiE8IEFEQyBhc3luY2hyb25vdXMgY2xvY2sgd2l0aCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzY2FsZXIgZGl2aXNpb24gYnkgMTI4ICovDQotI2RlZmluZSBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMjU2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0NSX1BSRVNDXzMgfCBBRENfQ0NSX1BSRVNDXzEgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19DQ1JfUFJFU0NfMCkgLyohPCBBREMgYXN5bmNocm9ub3VzIGNsb2NrIHdpdGggcHJlc2NhbGVyIGRpdmlzaW9uIGJ5IDI1NiBcDQotICAgICAgICAgICAgICAgICAgICAgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX0NPTU1PTl9QQVRIX0lOVEVSTkFMICBBREMgY29tbW9uIC0gTWVhc3VyZW1lbnQgcGF0aCB0bw0KLSAqIGludGVybmFsIGNoYW5uZWxzDQotICogQHsNCi0gKi8NCi0vKiBOb3RlOiBPdGhlciBtZWFzdXJlbWVudCBwYXRocyB0byBpbnRlcm5hbCBjaGFubmVscyBtYXkgYmUgYXZhaWxhYmxlICAgICAgICAqLw0KLS8qICAgICAgIChjb25uZWN0aW9ucyB0byBvdGhlciBwZXJpcGhlcmFscykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotLyogICAgICAgSWYgdGhleSBhcmUgbm90IGxpc3RlZCBiZWxvdywgdGhleSBkbyBub3QgcmVxdWlyZSBhbnkgc3BlY2lmaWMgICAgICAgKi8NCi0vKiAgICAgICBwYXRoIGVuYWJsZS4gSW4gdGhpcyBjYXNlLCBBY2Nlc3MgdG8gbWVhc3VyZW1lbnQgcGF0aCBpcyBkb25lICAgICAgICAqLw0KLS8qICAgICAgIG9ubHkgYnkgc2VsZWN0aW5nIHRoZSBjb3JyZXNwb25kaW5nIEFEQyBpbnRlcm5hbCBjaGFubmVsLiAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9BRENfUEFUSF9JTlRFUk5BTF9OT05FIFwNCi0gICgweDAwMDAwMDAwVUwpIC8qITwgQURDIG1lYXN1cmVtZW50IHBhdGhzIGFsbCBkaXNhYmxlZCAqLw0KLSNkZWZpbmUgTExfQURDX1BBVEhfSU5URVJOQUxfVlJFRklOVCBcDQotICAoQURDX0NDUl9WUkVGRU4pIC8qITwgQURDIG1lYXN1cmVtZW50IHBhdGggdG8gaW50ZXJuYWwgY2hhbm5lbCBWcmVmSW50ICovDQotI2RlZmluZSBMTF9BRENfUEFUSF9JTlRFUk5BTF9URU1QU0VOU09SICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0NDUl9WU0VOU0VTRUwpIC8qITwgQURDIG1lYXN1cmVtZW50IHBhdGggdG8gaW50ZXJuYWwgY2hhbm5lbCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBlcmF0dXJlIHNlbnNvciAqLw0KLSNkZWZpbmUgTExfQURDX1BBVEhfSU5URVJOQUxfVkJBVCBcDQotICAoQURDX0NDUl9WQkFUU0VMKSAvKiE8IEFEQyBtZWFzdXJlbWVudCBwYXRoIHRvIGludGVybmFsIGNoYW5uZWwgVmJhdCAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBBRENfTExfRUNfUkVTT0xVVElPTiAgQURDIGluc3RhbmNlIC0gUmVzb2x1dGlvbg0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9BRENfUkVTT0xVVElPTl8xMkIgKDB4MDAwMDAwMDBVTCkgICAvKiE8IEFEQyByZXNvbHV0aW9uIDEyIGJpdHMgKi8NCi0jZGVmaW5lIExMX0FEQ19SRVNPTFVUSU9OXzEwQiAoQURDX0NGR1JfUkVTXzApIC8qITwgQURDIHJlc29sdXRpb24gMTAgYml0cyAqLw0KLSNkZWZpbmUgTExfQURDX1JFU09MVVRJT05fOEIgKEFEQ19DRkdSX1JFU18xKSAgLyohPCBBREMgcmVzb2x1dGlvbiAgOCBiaXRzICovDQotI2RlZmluZSBMTF9BRENfUkVTT0xVVElPTl82QiBcDQotICAoQURDX0NGR1JfUkVTXzEgfCBBRENfQ0ZHUl9SRVNfMCkgLyohPCBBREMgcmVzb2x1dGlvbiAgNiBiaXRzICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19EQVRBX0FMSUdOICBBREMgaW5zdGFuY2UgLSBEYXRhIGFsaWdubWVudA0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9BRENfREFUQV9BTElHTl9SSUdIVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKDB4MDAwMDAwMDBVTCkgLyohPCBBREMgY29udmVyc2lvbiBkYXRhIGFsaWdubWVudDogcmlnaHQgYWxpZ25lZCAoYWxpZ25tZW50IFwNCi0gICAgICAgICAgICAgICAgICAgIG9uIGRhdGEgcmVnaXN0ZXIgTFNCIGJpdCAwKSovDQotI2RlZmluZSBMTF9BRENfREFUQV9BTElHTl9MRUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0ZHUl9BTElHTikgLyohPCBBREMgY29udmVyc2lvbiBkYXRhIGFsaWdubWVudDogbGVmdCBhbGlnbmVkIChhbGlnbm1lbnQgXA0KLSAgICAgICAgICAgICAgICAgICAgICBvbiBkYXRhIHJlZ2lzdGVyIE1TQiBiaXQgMTUpKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX0xQX01PREUgIEFEQyBpbnN0YW5jZSAtIExvdyBwb3dlciBtb2RlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX0FEQ19MUF9NT0RFX05PTkUgXA0KLSAgKDB4MDAwMDAwMDBVTCkgLyohPCBObyBBREMgbG93IHBvd2VyIG1vZGUgYWN0aXZhdGVkICovDQotI2RlZmluZSBMTF9BRENfTFBfQVVUT1dBSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0ZHUl9BVVRETFkpIC8qITwgQURDIGxvdyBwb3dlciBtb2RlIGF1dG8gZGVsYXk6IER5bmFtaWMgbG93IHBvd2VyICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgbW9kZSwgQURDIGNvbnZlcnNpb25zIGFyZSBwZXJmb3JtZWQgb25seSB3aGVuIG5lY2Vzc2FyeSBcDQotICAgICAgICAgICAgICAgICAgICAgICAod2hlbiBwcmV2aW91cyBBREMgY29udmVyc2lvbiBkYXRhIGlzIHJlYWQpLiBTZWUgICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uIHdpdGggZnVuY3Rpb24gQHJlZiAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgTExfQURDX1NldExvd1Bvd2VyTW9kZSgpLiAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBBRENfTExfRUNfT0ZGU0VUX05CICBBREMgaW5zdGFuY2UgLSBPZmZzZXQgbnVtYmVyDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX0FEQ19PRkZTRVRfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgQURDX09GUjFfUkVHT0ZGU0VUIC8qITwgQURDIG9mZnNldCBudW1iZXIgMTogQURDIGNoYW5uZWwgYW5kIG9mZnNldCBsZXZlbCB0byBcDQotICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggdGhlIG9mZnNldCBwcm9ncmFtbWVkIHdpbGwgYmUgYXBwbGllZCAgICAgICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAoaW5kZXBlbmRlbnRseSBvZiBjaGFubmVsIG1hcHBlZCBvbiBBREMgZ3JvdXAgcmVndWxhciAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG9yIGdyb3VwIGluamVjdGVkKSAqLw0KLSNkZWZpbmUgTExfQURDX09GRlNFVF8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBBRENfT0ZSMl9SRUdPRkZTRVQgLyohPCBBREMgb2Zmc2V0IG51bWJlciAyOiBBREMgY2hhbm5lbCBhbmQgb2Zmc2V0IGxldmVsIHRvIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICB3aGljaCB0aGUgb2Zmc2V0IHByb2dyYW1tZWQgd2lsbCBiZSBhcHBsaWVkICAgICAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIChpbmRlcGVuZGVudGx5IG9mIGNoYW5uZWwgbWFwcGVkIG9uIEFEQyBncm91cCByZWd1bGFyICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgb3IgZ3JvdXAgaW5qZWN0ZWQpICovDQotI2RlZmluZSBMTF9BRENfT0ZGU0VUXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIEFEQ19PRlIzX1JFR09GRlNFVCAvKiE8IEFEQyBvZmZzZXQgbnVtYmVyIDM6IEFEQyBjaGFubmVsIGFuZCBvZmZzZXQgbGV2ZWwgdG8gXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIHRoZSBvZmZzZXQgcHJvZ3JhbW1lZCB3aWxsIGJlIGFwcGxpZWQgICAgICAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgKGluZGVwZW5kZW50bHkgb2YgY2hhbm5lbCBtYXBwZWQgb24gQURDIGdyb3VwIHJlZ3VsYXIgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBvciBncm91cCBpbmplY3RlZCkgKi8NCi0jZGVmaW5lIExMX0FEQ19PRkZTRVRfNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgQURDX09GUjRfUkVHT0ZGU0VUIC8qITwgQURDIG9mZnNldCBudW1iZXIgNDogQURDIGNoYW5uZWwgYW5kIG9mZnNldCBsZXZlbCB0byBcDQotICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggdGhlIG9mZnNldCBwcm9ncmFtbWVkIHdpbGwgYmUgYXBwbGllZCAgICAgICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAoaW5kZXBlbmRlbnRseSBvZiBjaGFubmVsIG1hcHBlZCBvbiBBREMgZ3JvdXAgcmVndWxhciAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG9yIGdyb3VwIGluamVjdGVkKSAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBBRENfTExfRUNfT0ZGU0VUX1NUQVRFIEFEQyBpbnN0YW5jZSAtIE9mZnNldCBzdGF0ZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9BRENfT0ZGU0VUX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgweDAwMDAwMDAwVUwpIC8qITwgQURDIG9mZnNldCBkaXNhYmxlZCAoYW1vbmcgQURDIHNlbGVjdGVkIG9mZnNldCBudW1iZXIgMSwgXA0KLSAgICAgICAgICAgICAgICAgICAgMiwgMyBvciA0KSAqLw0KLSNkZWZpbmUgTExfQURDX09GRlNFVF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfT0ZSMV9PRkZTRVQxX0VOKSAvKiE8IEFEQyBvZmZzZXQgZW5hYmxlZCAoYW1vbmcgQURDIHNlbGVjdGVkIG9mZnNldCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyIDEsIDIsIDMgb3IgNCkgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX09GRlNFVF9TSUdOIEFEQyBpbnN0YW5jZSAtIE9mZnNldCBzaWduDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX0FEQ19PRkZTRVRfU0lHTl9ORUdBVElWRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKDB4MDAwMDAwMDBVTCkgLyohPCBBREMgb2Zmc2V0IGlzIG5lZ2F0aXZlIChhbW9uZyBBREMgc2VsZWN0ZWQgb2Zmc2V0IG51bWJlciBcDQotICAgICAgICAgICAgICAgICAgICAxLCAyLCAzIG9yIDQpICovDQotI2RlZmluZSBMTF9BRENfT0ZGU0VUX1NJR05fUE9TSVRJVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19PRlIxX09GRlNFVFBPUykgLyohPCBBREMgb2Zmc2V0IGlzIHBvc2l0aXZlIChhbW9uZyBBREMgc2VsZWN0ZWQgb2Zmc2V0IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciAxLCAyLCAzIG9yIDQpICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19PRkZTRVRfU0FUVVJBVElPTiBBREMgaW5zdGFuY2UgLSBPZmZzZXQgc2F0dXJhdGlvbiBtb2RlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX0FEQ19PRkZTRVRfU0FUVVJBVElPTl9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKDB4MDAwMDAwMDBVTCkgLyohPCBBREMgb2Zmc2V0IHNhdHVyYXRpb24gaXMgZGlzYWJsZWQgKGFtb25nIEFEQyBzZWxlY3RlZCBcDQotICAgICAgICAgICAgICAgICAgICBvZmZzZXQgbnVtYmVyIDEsIDIsIDMgb3IgNCkgKi8NCi0jZGVmaW5lIExMX0FEQ19PRkZTRVRfU0FUVVJBVElPTl9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfT0ZSMV9TQVRFTikgLyohPCBBREMgb2Zmc2V0IHNhdHVyYXRpb24gaXMgZW5hYmxlZCAoYW1vbmcgQURDIHNlbGVjdGVkIFwNCi0gICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0IG51bWJlciAxLCAyLCAzIG9yIDQpICovDQotLyoqDQotICogQH0NCi0gKi8NCi0vKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19HUk9VUFMgIEFEQyBpbnN0YW5jZSAtIEdyb3Vwcw0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9BRENfR1JPVVBfUkVHVUxBUiBcDQotICAoMHgwMDAwMDAwMVVMKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIChhdmFpbGFibGUgb24gYWxsIFNUTTMyIGRldmljZXMpICovDQotI2RlZmluZSBMTF9BRENfR1JPVVBfSU5KRUNURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKDB4MDAwMDAwMDJVTCkgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgKG5vdCBhdmFpbGFibGUgb24gYWxsIFNUTTMyIFwNCi0gICAgICAgICAgICAgICAgICAgIGRldmljZXMpKi8NCi0jZGVmaW5lIExMX0FEQ19HUk9VUF9SRUdVTEFSX0lOSkVDVEVEIFwNCi0gICgweDAwMDAwMDAzVUwpIC8qITwgQURDIGJvdGggZ3JvdXBzIHJlZ3VsYXIgYW5kIGluamVjdGVkICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19DSEFOTkVMICBBREMgaW5zdGFuY2UgLSBDaGFubmVsIG51bWJlcg0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9BRENfQ0hBTk5FTF8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19DSEFOTkVMXzBfTlVNQkVSIHwgQURDX0NIQU5ORUxfMF9TTVAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBBRENfQ0hBTk5FTF8wX0JJVEZJRUxEKSAvKiE8IEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJTyBwaW4pIEFEQ3hfSU4wICAqLw0KLSNkZWZpbmUgTExfQURDX0NIQU5ORUxfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0hBTk5FTF8xX05VTUJFUiB8IEFEQ19DSEFOTkVMXzFfU01QIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgQURDX0NIQU5ORUxfMV9CSVRGSUVMRCkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU8gcGluKSBBREN4X0lOMSAgKi8NCi0jZGVmaW5lIExMX0FEQ19DSEFOTkVMXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0NIQU5ORUxfMl9OVU1CRVIgfCBBRENfQ0hBTk5FTF8yX1NNUCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19DSEFOTkVMXzJfQklURklFTEQpIC8qITwgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPIHBpbikgQURDeF9JTjIgICovDQotI2RlZmluZSBMTF9BRENfQ0hBTk5FTF8zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19DSEFOTkVMXzNfTlVNQkVSIHwgQURDX0NIQU5ORUxfM19TTVAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBBRENfQ0hBTk5FTF8zX0JJVEZJRUxEKSAvKiE8IEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJTyBwaW4pIEFEQ3hfSU4zICAqLw0KLSNkZWZpbmUgTExfQURDX0NIQU5ORUxfNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0hBTk5FTF80X05VTUJFUiB8IEFEQ19DSEFOTkVMXzRfU01QIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgQURDX0NIQU5ORUxfNF9CSVRGSUVMRCkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU8gcGluKSBBREN4X0lONCAgKi8NCi0jZGVmaW5lIExMX0FEQ19DSEFOTkVMXzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0NIQU5ORUxfNV9OVU1CRVIgfCBBRENfQ0hBTk5FTF81X1NNUCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19DSEFOTkVMXzVfQklURklFTEQpIC8qITwgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPIHBpbikgQURDeF9JTjUgICovDQotI2RlZmluZSBMTF9BRENfQ0hBTk5FTF82ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19DSEFOTkVMXzZfTlVNQkVSIHwgQURDX0NIQU5ORUxfNl9TTVAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBBRENfQ0hBTk5FTF82X0JJVEZJRUxEKSAvKiE8IEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJTyBwaW4pIEFEQ3hfSU42ICAqLw0KLSNkZWZpbmUgTExfQURDX0NIQU5ORUxfNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0hBTk5FTF83X05VTUJFUiB8IEFEQ19DSEFOTkVMXzdfU01QIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgQURDX0NIQU5ORUxfN19CSVRGSUVMRCkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU8gcGluKSBBREN4X0lONyAgKi8NCi0jZGVmaW5lIExMX0FEQ19DSEFOTkVMXzggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0NIQU5ORUxfOF9OVU1CRVIgfCBBRENfQ0hBTk5FTF84X1NNUCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19DSEFOTkVMXzhfQklURklFTEQpIC8qITwgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPIHBpbikgQURDeF9JTjggICovDQotI2RlZmluZSBMTF9BRENfQ0hBTk5FTF85ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19DSEFOTkVMXzlfTlVNQkVSIHwgQURDX0NIQU5ORUxfOV9TTVAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBBRENfQ0hBTk5FTF85X0JJVEZJRUxEKSAvKiE8IEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJTyBwaW4pIEFEQ3hfSU45ICAqLw0KLSNkZWZpbmUgTExfQURDX0NIQU5ORUxfMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0NIQU5ORUxfMTBfTlVNQkVSIHwgQURDX0NIQU5ORUxfMTBfU01QIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBBRENfQ0hBTk5FTF8xMF9CSVRGSUVMRCkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPIHBpbikgQURDeF9JTjEwICovDQotI2RlZmluZSBMTF9BRENfQ0hBTk5FTF8xMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0hBTk5FTF8xMV9OVU1CRVIgfCBBRENfQ0hBTk5FTF8xMV9TTVAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19DSEFOTkVMXzExX0JJVEZJRUxEKSAvKiE8IEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU8gcGluKSBBREN4X0lOMTEgKi8NCi0jZGVmaW5lIExMX0FEQ19DSEFOTkVMXzEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19DSEFOTkVMXzEyX05VTUJFUiB8IEFEQ19DSEFOTkVMXzEyX1NNUCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgQURDX0NIQU5ORUxfMTJfQklURklFTEQpIC8qITwgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJTyBwaW4pIEFEQ3hfSU4xMiAqLw0KLSNkZWZpbmUgTExfQURDX0NIQU5ORUxfMTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0NIQU5ORUxfMTNfTlVNQkVSIHwgQURDX0NIQU5ORUxfMTNfU01QIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBBRENfQ0hBTk5FTF8xM19CSVRGSUVMRCkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPIHBpbikgQURDeF9JTjEzICovDQotI2RlZmluZSBMTF9BRENfQ0hBTk5FTF8xNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0hBTk5FTF8xNF9OVU1CRVIgfCBBRENfQ0hBTk5FTF8xNF9TTVAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19DSEFOTkVMXzE0X0JJVEZJRUxEKSAvKiE8IEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU8gcGluKSBBREN4X0lOMTQgKi8NCi0jZGVmaW5lIExMX0FEQ19DSEFOTkVMXzE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19DSEFOTkVMXzE1X05VTUJFUiB8IEFEQ19DSEFOTkVMXzE1X1NNUCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgQURDX0NIQU5ORUxfMTVfQklURklFTEQpIC8qITwgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJTyBwaW4pIEFEQ3hfSU4xNSAqLw0KLSNkZWZpbmUgTExfQURDX0NIQU5ORUxfMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0NIQU5ORUxfMTZfTlVNQkVSIHwgQURDX0NIQU5ORUxfMTZfU01QIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBBRENfQ0hBTk5FTF8xNl9CSVRGSUVMRCkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPIHBpbikgQURDeF9JTjE2ICovDQotI2RlZmluZSBMTF9BRENfQ0hBTk5FTF8xNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0hBTk5FTF8xN19OVU1CRVIgfCBBRENfQ0hBTk5FTF8xN19TTVAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19DSEFOTkVMXzE3X0JJVEZJRUxEKSAvKiE8IEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU8gcGluKSBBREN4X0lOMTcgKi8NCi0jZGVmaW5lIExMX0FEQ19DSEFOTkVMXzE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19DSEFOTkVMXzE4X05VTUJFUiB8IEFEQ19DSEFOTkVMXzE4X1NNUCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgQURDX0NIQU5ORUxfMThfQklURklFTEQpIC8qITwgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJTyBwaW4pIEFEQ3hfSU4xOCAqLw0KLSNkZWZpbmUgTExfQURDX0NIQU5ORUxfVlJFRklOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX0NIQU5ORUxfMTggfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBBRENfQ0hBTk5FTF9JRF9JTlRFUk5BTF9DSCkgLyohPCBBREMgaW50ZXJuYWwgY2hhbm5lbCBjb25uZWN0ZWQgdG8gVnJlZkludDogXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcm5hbCB2b2x0YWdlIHJlZmVyZW5jZS4gT24gdGhpcyBTVE0zMiAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmllcywgQURDIGNoYW5uZWwgYXZhaWxhYmxlIG9uIGFsbCAgICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VzIGJ1dCBBREMyLiAqLw0KLSNkZWZpbmUgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUl9BREMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX0NIQU5ORUxfMTYgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBBRENfQ0hBTk5FTF9JRF9JTlRFUk5BTF9DSCkgLyohPCBBREMgaW50ZXJuYWwgY2hhbm5lbCBjb25uZWN0ZWQgdG8gICAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wZXJhdHVyZSBzZW5zb3IuIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQyBjaGFubmVsIGF2YWlsYWJsZSBvbmx5IG9uIEFEQzEgaW5zdGFuY2UuIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SX0FEQzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfQ0hBTk5FTF80IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19DSEFOTkVMX0lEX0lOVEVSTkFMX0NIKSAvKiE8IEFEQyBpbnRlcm5hbCBjaGFubmVsIGNvbm5lY3RlZCB0byAgICAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBlcmF0dXJlIHNlbnNvci4gT24gdGhpcyBTVE0zMiBzZXJpZXMsICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDIGNoYW5uZWwgYXZhaWxhYmxlIG9ubHkgb24gQURDNSBpbnN0YW5jZS4gXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBBREM1ICAgICAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWliaWxpdHkgKi8NCi0jZGVmaW5lIExMX0FEQ19DSEFOTkVMX1ZCQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX0NIQU5ORUxfMTcgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19DSEFOTkVMX0lEX0lOVEVSTkFMX0NIKSAvKiE8IEFEQyBpbnRlcm5hbCBjaGFubmVsIGNvbm5lY3RlZCB0byBWYmF0LzM6IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmJhdCB2b2x0YWdlIHRocm91Z2ggYSBkaXZpZGVyIGxhZGRlciBvZiAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvciAxLzMgdG8gaGF2ZSBWYmF0IGFsd2F5cyBiZWxvdyBWZGRhLiAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbiB0aGlzIFNUTTMyIHNlcmllcywgQURDIGNoYW5uZWwgYXZhaWxhYmxlIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gYWxsIEFEQyBpbnN0YW5jZXMgYnV0IEFEQzIgJiBBREM0LiBSZWZlciBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIEFEQzQgYXZhaWxhaWJpbGl0eSAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfQ0hBTk5FTF8xMyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBBRENfQ0hBTk5FTF9JRF9JTlRFUk5BTF9DSCkgLyohPCBBREMgaW50ZXJuYWwgY2hhbm5lbCBjb25uZWN0ZWQgdG8gT1BBTVAxIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LiBPbiB0aGlzIFNUTTMyIHNlcmllcywgQURDIGNoYW5uZWwgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlIG9ubHkgb24gQURDMSBpbnN0YW5jZS4gKi8NCi0jZGVmaW5lIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19DSEFOTkVMXzE2IHwgQURDX0NIQU5ORUxfSURfSU5URVJOQUxfQ0ggfCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgQURDX0NIQU5ORUxfSURfSU5URVJOQUxfQ0hfMikgLyohPCBBREMgaW50ZXJuYWwgY2hhbm5lbCBjb25uZWN0ZWQgdG8gT1BBTVAyIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBBREMgY2hhbm5lbCAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSBvbmx5IG9uIEFEQzIgaW5zdGFuY2UuICovDQotI2RlZmluZSBMTF9BRENfQ0hBTk5FTF9WT1BBTVAzX0FEQzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfQ0hBTk5FTF8xOCB8IEFEQ19DSEFOTkVMX0lEX0lOVEVSTkFMX0NIIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19DSEFOTkVMX0lEX0lOVEVSTkFMX0NIXzIpIC8qITwgQURDIGludGVybmFsIGNoYW5uZWwgY29ubmVjdGVkIHRvIE9QQU1QMyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LiBPbiB0aGlzIFNUTTMyIHNlcmllcywgQURDIGNoYW5uZWwgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUgb25seSBvbiBBREMyIGluc3RhbmNlLiAqLw0KLSNkZWZpbmUgTExfQURDX0NIQU5ORUxfVk9QQU1QM19BREMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX0NIQU5ORUxfMTMgfCBBRENfQ0hBTk5FTF9JRF9JTlRFUk5BTF9DSCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBBRENfQ0hBTk5FTF9JRF9JTlRFUk5BTF9DSF8yKSAvKiE8IEFEQyBpbnRlcm5hbCBjaGFubmVsIGNvbm5lY3RlZCB0byBPUEFNUDMgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC4gT24gdGhpcyBTVE0zMiBzZXJpZXMsIEFEQyBjaGFubmVsICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlIG9ubHkgb24gQURDMyBpbnN0YW5jZS4gUmVmZXIgdG8gIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UgZGF0YXNoZWV0IGZvciBBREMzIGF2YWlsYWJpbGl0eSAqLw0KLSNkZWZpbmUgTExfQURDX0NIQU5ORUxfVk9QQU1QNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKExMX0FEQ19DSEFOTkVMXzUgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19DSEFOTkVMX0lEX0lOVEVSTkFMX0NIKSAvKiE8IEFEQyBpbnRlcm5hbCBjaGFubmVsIGNvbm5lY3RlZCB0byBPUEFNUDQgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBBREMgY2hhbm5lbCAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUgb25seSBvbiBBREM1IGluc3RhbmNlLiBSZWZlciB0byAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UgZGF0YXNoZWV0IGZvciBBREM1ICYgT1BBTVA0ICAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFiaWxpdHkgKi8NCi0jZGVmaW5lIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfQ0hBTk5FTF8zIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBBRENfQ0hBTk5FTF9JRF9JTlRFUk5BTF9DSCkgLyohPCBBREMgaW50ZXJuYWwgY2hhbm5lbCBjb25uZWN0ZWQgdG8gT1BBTVA1IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LiBPbiB0aGlzIFNUTTMyIHNlcmllcywgQURDIGNoYW5uZWwgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlIG9ubHkgb24gQURDNSBpbnN0YW5jZS4gUmVmZXIgdG8gIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlIGRhdGFzaGVldCBmb3IgQURDNSAmIE9QQU1QNSAgICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmlsaXR5ICovDQotI2RlZmluZSBMTF9BRENfQ0hBTk5FTF9WT1BBTVA2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChMTF9BRENfQ0hBTk5FTF8xNyB8IEFEQ19DSEFOTkVMX0lEX0lOVEVSTkFMX0NIIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19DSEFOTkVMX0lEX0lOVEVSTkFMX0NIXzIpIC8qITwgQURDIGludGVybmFsIGNoYW5uZWwgY29ubmVjdGVkIHRvIE9QQU1QNiBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LiBPbiB0aGlzIFNUTTMyIHNlcmllcywgQURDIGNoYW5uZWwgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUgb25seSBvbiBBREM0IGluc3RhbmNlLiBSZWZlciB0byAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSBkYXRhc2hlZXQgZm9yIEFEQzQgJiBPUEFNUDYgICAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmlsaXR5ICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19SRUdfVFJJR0dFUl9TT1VSQ0UgIEFEQyBncm91cCByZWd1bGFyIC0gVHJpZ2dlciBzb3VyY2UNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfQURDX1JFR19UUklHX1NPRlRXQVJFIFwNCi0gICgweDAwMDAwMDAwVUwpIC8qITwgICAgICAgICAgICBcDQotQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIGludGVybmFsOiBTVyBzdGFydC4gKi8NCi0jZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9UUkdPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19DRkdSX0VYVFNFTF8zIHwgQURDX0NGR1JfRVhUU0VMXzAgfCBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCBcDQotQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMSBUUkdPLiAgICAgIFwNCi1UcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLw0KLSNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU0xX1RSR08yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0NGR1JfRVhUU0VMXzMgfCBBRENfQ0ZHUl9FWFRTRUxfMSB8IEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8IFwNCi1BREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU0xIFRSR08yLiAgICAgXA0KLVRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovDQotI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfQ0gxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi1BREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU0xIGNoYW5uZWwgMSBcDQotZXZlbnQgKGNhcHR1cmUgY29tcGFyZTogaW5wdXQgY2FwdHVyZSBvciBvdXRwdXQgY2FwdHVyZSkuIFRyaWdnZXIgZWRnZSBzZXQgdG8gXA0KLXJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiBOb3RlOiBPbiB0aGlzIFNUTTMyIHNlcmllcywgdGhpcyB0cmlnZ2VyIGlzICAgIFwNCi1hdmFpbGFibGUgb25seSBvbiBBREMxLzIgaW5zdGFuY2VzICovDQotI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfQ0gyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19DRkdSX0VYVFNFTF8wIHwgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgICAgICAgICAgICAgICAgICAgIFwNCi1BREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU0xIGNoYW5uZWwgMiBcDQotZXZlbnQgKGNhcHR1cmUgY29tcGFyZTogaW5wdXQgY2FwdHVyZSBvciBvdXRwdXQgY2FwdHVyZSkuIFRyaWdnZXIgZWRnZSBzZXQgdG8gXA0KLXJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiBOb3RlOiBPbiB0aGlzIFNUTTMyIHNlcmllcywgdGhpcyB0cmlnZ2VyIGlzICAgIFwNCi1hdmFpbGFibGUgb25seSBvbiBBREMxLzIgaW5zdGFuY2VzICovDQotI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfQ0gzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19DRkdSX0VYVFNFTF8xIHwgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgICAgICAgICAgICAgICAgICAgIFwNCi1BREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU0xIGNoYW5uZWwgMyBcDQotZXZlbnQgKGNhcHR1cmUgY29tcGFyZTogaW5wdXQgY2FwdHVyZSBvciBvdXRwdXQgY2FwdHVyZSkuIFRyaWdnZXIgZWRnZSBzZXQgdG8gXA0KLXJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLw0KLSNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU0yX1RSR08gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19DRkdSX0VYVFNFTF8zIHwgQURDX0NGR1JfRVhUU0VMXzEgfCBBRENfQ0ZHUl9FWFRTRUxfMCB8ICAgICAgICAgICAgXA0KLSAgIEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLUFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTIgVFJHTy4gXA0KLVRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovDQotI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTJfQ0gxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19DRkdSX0VYVFNFTF8zIHwgQURDX0NGR1JfRVhUU0VMXzIgfCBBRENfQ0ZHUl9FWFRTRUxfMSB8ICAgICAgICAgICAgICAgIFwNCi0gICBBRENfQ0ZHUl9FWFRTRUxfMCB8IEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8ICAgICAgICAgICAgICAgICAgICBcDQotQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMiBjaGFubmVsIDEgXA0KLWV2ZW50IChjYXB0dXJlIGNvbXBhcmU6IGlucHV0IGNhcHR1cmUgb3Igb3V0cHV0IGNhcHR1cmUpLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIFwNCi1yaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gTm90ZTogT24gdGhpcyBTVE0zMiBzZXJpZXMsIHRoaXMgdHJpZ2dlciBpcyAgICBcDQotYXZhaWxhYmxlIG9ubHkgb24gQURDMy80LzUgaW5zdGFuY2VzLiBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBBREN4ICAgICAgXA0KLWF2YWlsYWliaWxpdHkgKi8NCi0jZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMl9DSDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19DRkdSX0VYVFNFTF8xIHwgQURDX0NGR1JfRVhUU0VMXzAgfCBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCBcDQotQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMiBjaGFubmVsIDIgIFwNCi1ldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIG91dHB1dCBjYXB0dXJlKS4gVHJpZ2dlciBlZGdlIHNldCB0byAgXA0KLXJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiBOb3RlOiBPbiB0aGlzIFNUTTMyIHNlcmllcywgdGhpcyB0cmlnZ2VyIGlzICAgICBcDQotYXZhaWxhYmxlIG9ubHkgb24gQURDMS8yIGluc3RhbmNlcyAqLw0KLSNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU0yX0NIMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0ZHUl9FWFRTRUxfMCB8IEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8ICAgICAgICAgICAgICAgICAgICBcDQotQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMiBjaGFubmVsIDMgXA0KLWV2ZW50IChjYXB0dXJlIGNvbXBhcmU6IGlucHV0IGNhcHR1cmUgb3Igb3V0cHV0IGNhcHR1cmUpLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIFwNCi1yaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gTm90ZTogT24gdGhpcyBTVE0zMiBzZXJpZXMsIHRoaXMgdHJpZ2dlciBpcyAgICBcDQotYXZhaWxhYmxlIG9ubHkgb24gQURDMy80LzUgaW5zdGFuY2VzLiBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBBREN4ICAgICAgXA0KLWF2YWlsYWliaWxpdHkgKi8NCi0jZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfVElNM19UUkdPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0ZHUl9FWFRTRUxfMiB8IEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8ICAgICAgICAgICAgICAgIFwNCi1BREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU0zIFRSR08uIFwNCi1UcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLw0KLSNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU0zX0NIMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMyBjaGFubmVsIDEgXA0KLWV2ZW50IChjYXB0dXJlIGNvbXBhcmU6IGlucHV0IGNhcHR1cmUgb3Igb3V0cHV0IGNhcHR1cmUpLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIFwNCi1yaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gTm90ZTogT24gdGhpcyBTVE0zMiBzZXJpZXMsIHRoaXMgdHJpZ2dlciBpcyAgICBcDQotYXZhaWxhYmxlIG9ubHkgb24gQURDMy80LzUgaW5zdGFuY2VzLiBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBBREN4ICAgICAgXA0KLWF2YWlsYWliaWxpdHkgKi8NCi0jZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfVElNM19DSDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0NGR1JfRVhUU0VMXzMgfCBBRENfQ0ZHUl9FWFRTRUxfMiB8IEFEQ19DRkdSX0VYVFNFTF8xIHwgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0VYVFNFTF8wIHwgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgICAgICAgICAgICAgICAgICAgIFwNCi1BREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU0zIGNoYW5uZWwgNCBcDQotZXZlbnQgKGNhcHR1cmUgY29tcGFyZTogaW5wdXQgY2FwdHVyZSBvciBvdXRwdXQgY2FwdHVyZSkuIFRyaWdnZXIgZWRnZSBzZXQgdG8gXA0KLXJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiBOb3RlOiBPbiB0aGlzIFNUTTMyIHNlcmllcywgdGhpcyB0cmlnZ2VyIGlzICAgIFwNCi1hdmFpbGFibGUgb25seSBvbiBBREMxLzIgaW5zdGFuY2VzICovDQotI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTRfVFJHTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0ZHUl9FWFRTRUxfMyB8IEFEQ19DRkdSX0VYVFNFTF8yIHwgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgXA0KLUFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTQgVFJHTy4gICAgICBcDQotVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8NCi0jZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfVElNNF9DSDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19DRkdSX0VYVFNFTF8yIHwgQURDX0NGR1JfRVhUU0VMXzEgfCBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCBcDQotQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNNCBjaGFubmVsIDEgIFwNCi1ldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIG91dHB1dCBjYXB0dXJlKS4gVHJpZ2dlciBlZGdlIHNldCB0byAgXA0KLXJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiBOb3RlOiBPbiB0aGlzIFNUTTMyIHNlcmllcywgdGhpcyB0cmlnZ2VyIGlzICAgICBcDQotYXZhaWxhYmxlIG9ubHkgb24gQURDMy80LzUgaW5zdGFuY2VzLiBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBBREN4ICAgICAgIFwNCi1hdmFpbGFpYmlsaXR5ICovDQotI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTRfQ0g0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0ZHUl9FWFRTRUxfMiB8IEFEQ19DRkdSX0VYVFNFTF8wIHwgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgXA0KLUFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTQgY2hhbm5lbCA0ICBcDQotZXZlbnQgKGNhcHR1cmUgY29tcGFyZTogaW5wdXQgY2FwdHVyZSBvciBvdXRwdXQgY2FwdHVyZSkuIFRyaWdnZXIgZWRnZSBzZXQgdG8gIFwNCi1yaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gTm90ZTogT24gdGhpcyBTVE0zMiBzZXJpZXMsIHRoaXMgdHJpZ2dlciBpcyAgICAgXA0KLWF2YWlsYWJsZSBvbmx5IG9uIEFEQzEvMiBpbnN0YW5jZXMgKi8NCi0jZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfVElNNl9UUkdPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0ZHUl9FWFRTRUxfMyB8IEFEQ19DRkdSX0VYVFNFTF8yIHwgQURDX0NGR1JfRVhUU0VMXzAgfCAgICAgICAgICAgIFwNCi0gICBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi1BREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU02IFRSR08uIFwNCi1UcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLw0KLSNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU03X1RSR08gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19DRkdSX0VYVFNFTF80IHwgQURDX0NGR1JfRVhUU0VMXzMgfCBBRENfQ0ZHUl9FWFRTRUxfMiB8ICAgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0VYVFNFTF8xIHwgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgICAgICAgICAgICAgICAgXA0KLUFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTcgVFJHTy4gXA0KLVRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovDQotI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTThfVFJHTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0NGR1JfRVhUU0VMXzIgfCBBRENfQ0ZHUl9FWFRTRUxfMSB8IEFEQ19DRkdSX0VYVFNFTF8wIHwgICAgICAgICAgICBcDQotICAgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNOCBUUkdPLiBcDQotVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8NCi0jZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfVElNOF9UUkdPMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0NGR1JfRVhUU0VMXzMgfCBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCAgICAgICAgICAgICAgICAgXA0KLUFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTggVFJHTzIuIFwNCi1UcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLw0KLSNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU04X0NIMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0NGR1JfRVhUU0VMXzEgfCBBRENfQ0ZHUl9FWFRTRUxfMCB8IEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8IFwNCi1BREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU04IGNoYW5uZWwgMSAgXA0KLWV2ZW50IChjYXB0dXJlIGNvbXBhcmU6IGlucHV0IGNhcHR1cmUgb3Igb3V0cHV0IGNhcHR1cmUpLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvICBcDQotcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuIE5vdGU6IE9uIHRoaXMgU1RNMzIgc2VyaWVzLCB0aGlzIHRyaWdnZXIgaXMgICAgIFwNCi1hdmFpbGFibGUgb25seSBvbiBBREMzLzQvNSBpbnN0YW5jZXMuIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIEFEQ3ggICAgICAgXA0KLWF2YWlsYWliaWxpdHkgKi8NCi0jZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMTVfVFJHTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0NGR1JfRVhUU0VMXzMgfCBBRENfQ0ZHUl9FWFRTRUxfMiB8IEFEQ19DRkdSX0VYVFNFTF8xIHwgICAgICAgICAgICAgXA0KLSAgIEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi1BREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU0xNSBUUkdPLiBcDQotVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8NCi0jZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMjBfVFJHTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19DRkdSX0VYVFNFTF80IHwgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgICAgICAgICAgICAgICAgICAgICBcDQotQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMjAgVFJHTy4gICAgIFwNCi1UcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiBOb3RlOiBPbiB0aGlzIFNUTTMyIHNlcmllcywgXA0KLVRJTTIwIGlzIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIG1vcmUgICAgICBcDQotZGV0YWlscyAqLw0KLSNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU0yMF9UUkdPMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0NGR1JfRVhUU0VMXzQgfCBBRENfQ0ZHUl9FWFRTRUxfMCB8IEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8IFwNCi1BREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU0yMCBUUkdPMi4gICAgXA0KLVRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuIE5vdGU6IE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBcDQotVElNMjAgaXMgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlcy4gUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgbW9yZSAgICAgIFwNCi1kZXRhaWxzICovDQotI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTIwX0NIMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0ZHUl9FWFRTRUxfNCB8IEFEQ19DRkdSX0VYVFNFTF8xIHwgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgXA0KLUFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTIwIGNoYW5uZWwgMSBcDQotZXZlbnQgKGNhcHR1cmUgY29tcGFyZTogaW5wdXQgY2FwdHVyZSBvciBvdXRwdXQgY2FwdHVyZSkuIFRyaWdnZXIgZWRnZSBzZXQgdG8gIFwNCi1yaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gTm90ZTogT24gdGhpcyBTVE0zMiBzZXJpZXMsIFRJTTIwIGlzIG5vdCAgICAgICAgXA0KLWF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlcy4gUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgbW9yZSBkZXRhaWxzICovDQotI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTIwX0NIMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0ZHUl9FWFRTRUxfNCB8IEFEQ19DRkdSX0VYVFNFTF8xIHwgQURDX0NGR1JfRVhUU0VMXzAgfCAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMjAgY2hhbm5lbCAyIFwNCi1ldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIG91dHB1dCBjYXB0dXJlKS4gVHJpZ2dlciBlZGdlIHNldCB0byAgXA0KLXJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiBOb3RlOiBPbiB0aGlzIFNUTTMyIHNlcmllcywgdGhpcyB0cmlnZ2VyIGlzICAgICBcDQotYXZhaWxhYmxlIG9ubHkgb24gQURDMS8yIGluc3RhbmNlcywgYW5kIFRJTTIwIGlzIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuIFwNCi1SZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBtb3JlIGRldGFpbHMgKi8NCi0jZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMjBfQ0gzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19DRkdSX0VYVFNFTF80IHwgQURDX0NGR1JfRVhUU0VMXzIgfCBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCBcDQotQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMjAgY2hhbm5lbCAzIFwNCi1ldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIG91dHB1dCBjYXB0dXJlKS4gVHJpZ2dlciBlZGdlIHNldCB0byAgXA0KLXJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiBOb3RlOiBPbiB0aGlzIFNUTTMyIHNlcmllcywgdGhpcyB0cmlnZ2VyIGlzICAgICBcDQotYXZhaWxhYmxlIG9ubHkgb24gQURDMS8yIGluc3RhbmNlcywgYW5kIFRJTTIwIGlzIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuIFwNCi1SZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBtb3JlIGRldGFpbHMgKi8NCi0jZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfSFJUSU1fVFJHMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0ZHUl9FWFRTRUxfNCB8IEFEQ19DRkdSX0VYVFNFTF8yIHwgQURDX0NGR1JfRVhUU0VMXzAgfCAgICAgICAgICAgICAgIFwNCi0gICBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi1BREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBIUlRJTUVSIEFEQyAgIFwNCi10cmlnZ2VyIDEgZXZlbnQuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuIE5vdGU6IE9uIFwNCi10aGlzIFNUTTMyIHNlcmllcywgSFJUSU0gaXMgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlcy4gUmVmZXIgdG8gZGV2aWNlICAgIFwNCi1kYXRhc2hlZXQgZm9yIG1vcmUgZGV0YWlscyAqLw0KLSNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9IUlRJTV9UUkcyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19DRkdSX0VYVFNFTF80IHwgQURDX0NGR1JfRVhUU0VMXzEgfCBBRENfQ0ZHUl9FWFRTRUxfMCB8ICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLUFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IEhSVElNRVIgQURDICAgXA0KLXRyaWdnZXIgMiBldmVudC4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gTm90ZTogT24gXA0KLXRoaXMgU1RNMzIgc2VyaWVzLCB0aGlzIHRyaWdnZXIgaXMgYXZhaWxhYmxlIG9ubHkgb24gQURDMy80LzUgaW5zdGFuY2VzLCBhbmQgXA0KLUhSVElNIGlzIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIG1vcmUgICAgXA0KLWRldGFpbHMgKi8NCi0jZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfSFJUSU1fVFJHMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0ZHUl9FWFRTRUxfNCB8IEFEQ19DRkdSX0VYVFNFTF8yIHwgQURDX0NGR1JfRVhUU0VMXzEgfCAgICAgICAgICAgICAgIFwNCi0gICBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi1BREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBIUlRJTUVSIEFEQyAgIFwNCi10cmlnZ2VyIDMgZXZlbnQuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuIE5vdGU6IE9uIFwNCi10aGlzIFNUTTMyIHNlcmllcywgSFJUSU0gaXMgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlcy4gUmVmZXIgdG8gZGV2aWNlICAgIFwNCi1kYXRhc2hlZXQgZm9yIG1vcmUgZGV0YWlscyAqLw0KLSNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9IUlRJTV9UUkc0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0NGR1JfRVhUU0VMXzQgfCBBRENfQ0ZHUl9FWFRTRUxfMiB8IEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8IFwNCi1BREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBIUlRJTUVSIEFEQyAgICAgXA0KLXRyaWdnZXIgNCBldmVudC4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gTm90ZTogT24gICBcDQotdGhpcyBTVE0zMiBzZXJpZXMsIHRoaXMgdHJpZ2dlciBpcyBhdmFpbGFibGUgb25seSBvbiBBREMzLzQvNSBpbnN0YW5jZXMsIGFuZCAgIFwNCi1IUlRJTSBpcyBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzLiBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBtb3JlICAgICAgXA0KLWRldGFpbHMgKi8NCi0jZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfSFJUSU1fVFJHNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0ZHUl9FWFRTRUxfNCB8IEFEQ19DRkdSX0VYVFNFTF8yIHwgQURDX0NGR1JfRVhUU0VMXzEgfCAgICAgICAgICAgICAgIFwNCi0gICBBRENfQ0ZHUl9FWFRTRUxfMCB8IEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8ICAgICAgICAgICAgICAgICAgIFwNCi1BREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBIUlRJTUVSIEFEQyAgIFwNCi10cmlnZ2VyIDUgZXZlbnQuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuIE5vdGU6IE9uIFwNCi10aGlzIFNUTTMyIHNlcmllcywgSFJUSU0gaXMgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlcy4gUmVmZXIgdG8gZGV2aWNlICAgIFwNCi1kYXRhc2hlZXQgZm9yIG1vcmUgZGV0YWlscyAqLw0KLSNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9IUlRJTV9UUkc2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0NGR1JfRVhUU0VMXzQgfCBBRENfQ0ZHUl9FWFRTRUxfMyB8IEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8IFwNCi1BREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBIUlRJTUVSIEFEQyAgICAgXA0KLXRyaWdnZXIgNiBldmVudC4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gTm90ZTogT24gICBcDQotdGhpcyBTVE0zMiBzZXJpZXMsIEhSVElNIGlzIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuIFJlZmVyIHRvIGRldmljZSAgICAgIFwNCi1kYXRhc2hlZXQgZm9yIG1vcmUgZGV0YWlscyAqLw0KLSNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9IUlRJTV9UUkc3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19DRkdSX0VYVFNFTF80IHwgQURDX0NGR1JfRVhUU0VMXzMgfCBBRENfQ0ZHUl9FWFRTRUxfMCB8ICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLUFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IEhSVElNRVIgQURDICAgXA0KLXRyaWdnZXIgNyBldmVudC4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gTm90ZTogT24gXA0KLXRoaXMgU1RNMzIgc2VyaWVzLCBIUlRJTSBpcyBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzLiBSZWZlciB0byBkZXZpY2UgICAgXA0KLWRhdGFzaGVldCBmb3IgbW9yZSBkZXRhaWxzICovDQotI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX0hSVElNX1RSRzggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0NGR1JfRVhUU0VMXzQgfCBBRENfQ0ZHUl9FWFRTRUxfMyB8IEFEQ19DRkdSX0VYVFNFTF8xIHwgICAgICAgICAgICAgICBcDQotICAgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogSFJUSU1FUiBBREMgICBcDQotdHJpZ2dlciA4IGV2ZW50LiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiBOb3RlOiBPbiBcDQotdGhpcyBTVE0zMiBzZXJpZXMsIEhSVElNIGlzIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuIFJlZmVyIHRvIGRldmljZSAgICBcDQotZGF0YXNoZWV0IGZvciBtb3JlIGRldGFpbHMgKi8NCi0jZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfSFJUSU1fVFJHOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0ZHUl9FWFRTRUxfNCB8IEFEQ19DRkdSX0VYVFNFTF8zIHwgQURDX0NGR1JfRVhUU0VMXzEgfCAgICAgICAgICAgICAgIFwNCi0gICBBRENfQ0ZHUl9FWFRTRUxfMCB8IEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8ICAgICAgICAgICAgICAgICAgIFwNCi1BREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBIUlRJTUVSIEFEQyAgIFwNCi10cmlnZ2VyIDkgZXZlbnQuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuIE5vdGU6IE9uIFwNCi10aGlzIFNUTTMyIHNlcmllcywgSFJUSU0gaXMgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlcy4gUmVmZXIgdG8gZGV2aWNlICAgIFwNCi1kYXRhc2hlZXQgZm9yIG1vcmUgZGV0YWlscyAqLw0KLSNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9IUlRJTV9UUkcxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0ZHUl9FWFRTRUxfNCB8IEFEQ19DRkdSX0VYVFNFTF8zIHwgQURDX0NGR1JfRVhUU0VMXzIgfCAgICAgICAgICAgICAgICBcDQotICAgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLUFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IEhSVElNRVIgQURDICAgIFwNCi10cmlnZ2VyIDEwIGV2ZW50LiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiBOb3RlOiBPbiBcDQotdGhpcyBTVE0zMiBzZXJpZXMsIEhSVElNIGlzIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuIFJlZmVyIHRvIGRldmljZSAgICAgXA0KLWRhdGFzaGVldCBmb3IgbW9yZSBkZXRhaWxzICovDQotI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX0VYVElfTElORTExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0ZHUl9FWFRTRUxfMiB8IEFEQ19DRkdSX0VYVFNFTF8xIHwgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgXA0KLUFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IGV4dGVybmFsICAgICAgICBcDQotaW50ZXJydXB0IGxpbmUgMTEuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuIE5vdGU6IE9uIFwNCi10aGlzIFNUTTMyIHNlcmllcywgdGhpcyB0cmlnZ2VyIGlzIGF2YWlsYWJsZSBvbmx5IG9uIEFEQzEvMiBpbnN0YW5jZXMgKi8NCi0jZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfRVhUSV9MSU5FMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19DRkdSX0VYVFNFTF8yIHwgQURDX0NGR1JfRVhUU0VMXzAgfCBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCBcDQotQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogZXh0ZXJuYWwgICAgICAgIFwNCi1pbnRlcnJ1cHQgbGluZSAyLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiBOb3RlOiBPbiAgXA0KLXRoaXMgU1RNMzIgc2VyaWVzLCB0aGlzIHRyaWdnZXIgaXMgYXZhaWxhYmxlIG9ubHkgb24gQURDMy80LzUgaW5zdGFuY2VzLiBSZWZlciBcDQotdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgQURDeCBhdmFpbGFpYmlsaXR5ICovDQotI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX0xQVElNX09VVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19DRkdSX0VYVFNFTF80IHwgQURDX0NGR1JfRVhUU0VMXzMgfCBBRENfQ0ZHUl9FWFRTRUxfMiB8ICAgICAgICAgICAgIFwNCi0gICBBRENfQ0ZHUl9FWFRTRUxfMCB8IEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8ICAgICAgICAgICAgICAgICBcDQotQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogTFBUSU1FUiBPVVQgXA0KLWV2ZW50LiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBBRENfTExfRUNfUkVHX1RSSUdHRVJfRURHRSAgQURDIGdyb3VwIHJlZ3VsYXIgLSBUcmlnZ2VyIGVkZ2UNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9SSVNJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0NGR1JfRVhURU5fMCkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgcG9sYXJpdHkgc2V0IHRvIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICByaXNpbmcgZWRnZSAqLw0KLSNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9GQUxMSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0NGR1JfRVhURU5fMSkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgcG9sYXJpdHkgc2V0IHRvIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBmYWxsaW5nIGVkZ2UgKi8NCi0jZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfUklTSU5HRkFMTElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19DRkdSX0VYVEVOXzEgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgQURDX0NGR1JfRVhURU5fMCkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgcG9sYXJpdHkgc2V0IHRvIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBib3RoIHJpc2luZyBhbmQgZmFsbGluZyBlZGdlcyAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBBRENfTExfRUNfUkVHX1NBTVBMSU5HX01PREUgIEFEQyBncm91cCByZWd1bGFyIC0gU2FtcGxpbmcgbW9kZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9BRENfUkVHX1NBTVBMSU5HX01PREVfTk9STUFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgweDAwMDAwMDAwVUwpIC8qITwgQURDIGNvbnZlcnNpb25zIHNhbXBsaW5nIHBoYXNlIGR1cmF0aW9uIGlzIGRlZmluZWQgdXNpbmcgXA0KLSAgICAgICAgICAgICAgICAgICAgQHJlZiBBRENfTExfRUNfQ0hBTk5FTF9TQU1QTElOR1RJTUUgKi8NCi0jZGVmaW5lIExMX0FEQ19SRUdfU0FNUExJTkdfTU9ERV9CVUxCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0NGR1IyX0JVTEIpIC8qITwgQURDIGNvbnZlcnNpb25zIHNhbXBsaW5nIHBoYXNlIHN0YXJ0cyBpbW1lZGlhdGVseSAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICBhZnRlciBlbmQgb2YgY29udmVyc2lvbiwgYW5kIHN0b3BzIHVwb24gdHJpZ2dlciBldmVudC4gIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBGaXJzdCBjb252ZXJzaW9uIGlzIHVzaW5nIG1pbmltYWwgc2FtcGxpbmcgdGltZSBcDQotICAgICAgICAgICAgICAgICAgICAgIChzZWUgQHJlZiBBRENfTExfRUNfQ0hBTk5FTF9TQU1QTElOR1RJTUUpICovDQotI2RlZmluZSBMTF9BRENfUkVHX1NBTVBMSU5HX01PREVfVFJJR0dFUl9DT05UUk9MRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0ZHUjJfU01QVFJJRykgLyohPCBBREMgY29udmVyc2lvbnMgc2FtcGxpbmcgcGhhc2UgaXMgY29udHJvbGxlZCBieSAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyIGV2ZW50czogVHJpZ2dlciByaXNpbmcgZWRnZSAgPSBzdGFydCBzYW1wbGluZyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyaWdnZXIgZmFsbGluZyBlZGdlID0gc3RvcCBzYW1wbGluZyBhbmQgc3RhcnQgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbiAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBBRENfTExfRUNfUkVHX0NPTlRJTlVPVVNfTU9ERSAgQURDIGdyb3VwIHJlZ3VsYXIgLSBDb250aW51b3VzIG1vZGUNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfQURDX1JFR19DT05WX1NJTkdMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgweDAwMDAwMDAwVUwpIC8qITwgQURDIGNvbnZlcnNpb25zIGFyZSBwZXJmb3JtZWQgaW4gc2luZ2xlIG1vZGU6IG9uZSBcDQotICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9uIHBlciB0cmlnZ2VyICovDQotI2RlZmluZSBMTF9BRENfUkVHX0NPTlZfQ09OVElOVU9VUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0ZHUl9DT05UKSAvKiE8IEFEQyBjb252ZXJzaW9ucyBhcmUgcGVyZm9ybWVkIGluIGNvbnRpbnVvdXMgbW9kZTogYWZ0ZXIgXA0KLSAgICAgICAgICAgICAgICAgICAgIHRoZSBmaXJzdCB0cmlnZ2VyLCBmb2xsb3dpbmcgY29udmVyc2lvbnMgbGF1bmNoZWQgICAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc2l2ZWx5IGF1dG9tYXRpY2FsbHkgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX1JFR19ETUFfVFJBTlNGRVIgIEFEQyBncm91cCByZWd1bGFyIC0gRE1BIHRyYW5zZmVyIG9mDQotICogQURDIGNvbnZlcnNpb24gZGF0YQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9BRENfUkVHX0RNQV9UUkFOU0ZFUl9OT05FIFwNCi0gICgweDAwMDAwMDAwVUwpIC8qITwgQURDIGNvbnZlcnNpb25zIGFyZSBub3QgdHJhbnNmZXJyZWQgYnkgRE1BICovDQotI2RlZmluZSBMTF9BRENfUkVHX0RNQV9UUkFOU0ZFUl9MSU1JVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0ZHUl9ETUFFTikgLyohPCBBREMgY29udmVyc2lvbiBkYXRhIGFyZSB0cmFuc2ZlcnJlZCBieSBETUEsIGluIGxpbWl0ZWQgXA0KLSAgICAgICAgICAgICAgICAgICAgICBtb2RlIChvbmUgc2hvdCBtb2RlKTogRE1BIHRyYW5zZmVyIHJlcXVlc3RzIGFyZSBzdG9wcGVkICBcDQotICAgICAgICAgICAgICAgICAgICAgIHdoZW4gbnVtYmVyIG9mIERNQSBkYXRhIHRyYW5zZmVycyAobnVtYmVyIG9mIEFEQyAgICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbnMpIGlzIHJlYWNoZWQuIFRoaXMgQURDIG1vZGUgaXMgaW50ZW5kZWQgdG8gYmUgXA0KLSAgICAgICAgICAgICAgICAgICAgICB1c2VkIHdpdGggRE1BIG1vZGUgbm9uLWNpcmN1bGFyLiAqLw0KLSNkZWZpbmUgTExfQURDX1JFR19ETUFfVFJBTlNGRVJfVU5MSU1JVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0ZHUl9ETUFDRkcgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgQURDX0NGR1JfRE1BRU4pIC8qITwgQURDIGNvbnZlcnNpb24gZGF0YSBhcmUgdHJhbnNmZXJyZWQgYnkgRE1BLCBpbiAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICB1bmxpbWl0ZWQgbW9kZTogRE1BIHRyYW5zZmVyIHJlcXVlc3RzIGFyZSB1bmxpbWl0ZWQsICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgd2hhdGV2ZXIgbnVtYmVyIG9mIERNQSBkYXRhIHRyYW5zZmVycmVkIChudW1iZXIgb2YgQURDICBcDQotICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb25zKS4gVGhpcyBBREMgbW9kZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHdpdGggXA0KLSAgICAgICAgICAgICAgICAgICAgICBETUEgbW9kZSBjaXJjdWxhci4gKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLSNpZiBkZWZpbmVkKEFEQ19TTVBSMV9TTVBQTFVTKQ0KLS8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX1NBTVBMSU5HVElNRV9DT01NT05fQ09ORklHIEFEQyBpbnN0YW5jZSAtIEFEQyBzYW1wbGluZw0KLSAqIHRpbWUgY29tbW9uIGNvbmZpZ3VyYXRpb24NCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfQURDX1NBTVBMSU5HVElNRV9DT01NT05fREVGQVVMVCBcDQotICAoMHgwMDAwMDAwMFVMKSAvKiE8IEFEQyBzYW1wbGluZyB0aW1lIGxldCB0byBkZWZhdWx0IHNldHRpbmdzLiAqLw0KLSNkZWZpbmUgTExfQURDX1NBTVBMSU5HVElNRV9DT01NT05fM0M1X1JFUExfMkM1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfU01QUjFfU01QUExVUykgLyohPCBBREMgYWRkaXRpb25hbCBzYW1wbGluZyB0aW1lIDMuNSBBREMgY2xvY2sgY3ljbGVzICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2luZyAyLjUgQURDIGNsb2NrIGN5Y2xlcyAodGhpcyBhcHBsaWVzIHRvIGFsbCAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVscyBtYXBwZWQgd2l0aCBzZWxlY3Rpb24gc2FtcGxpbmcgdGltZSAyLjUgQURDIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xvY2sgY3ljbGVzLCB3aGF0ZXZlciBjaGFubmVscyBtYXBwZWQgb24gQURDIGdyb3VwcyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ3VsYXIgb3IgaW5qZWN0ZWQpLiAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotI2VuZGlmDQotDQotLyoqIEBkZWZncm91cCBBRENfTExfRUNfUkVHX09WUl9EQVRBX0JFSEFWSU9SICBBREMgZ3JvdXAgcmVndWxhciAtIE92ZXJydW4NCi0gKiBiZWhhdmlvciBvbiBjb252ZXJzaW9uIGRhdGENCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfQURDX1JFR19PVlJfREFUQV9QUkVTRVJWRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKDB4MDAwMDAwMDBVTCkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBiZWhhdmlvciBpbiBjYXNlIG9mIG92ZXJydW46IGRhdGEgXA0KLSAgICAgICAgICAgICAgICAgICAgcHJlc2VydmVkICovDQotI2RlZmluZSBMTF9BRENfUkVHX09WUl9EQVRBX09WRVJXUklUVEVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0NGR1JfT1ZSTU9EKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIGJlaGF2aW9yIGluIGNhc2Ugb2Ygb3ZlcnJ1bjogZGF0YSBcDQotICAgICAgICAgICAgICAgICAgICAgICBvdmVyd3JpdHRlbiAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBBRENfTExfRUNfUkVHX1NFUV9TQ0FOX0xFTkdUSCAgQURDIGdyb3VwIHJlZ3VsYXIgLSBTZXF1ZW5jZXIgc2Nhbg0KLSAqIGxlbmd0aA0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9BRENfUkVHX1NFUV9TQ0FOX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgweDAwMDAwMDAwVUwpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGRpc2FibGUgKGVxdWl2YWxlbnQgdG8gXA0KLSAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VyIG9mIDEgcmFuazogQURDIGNvbnZlcnNpb24gb24gb25seSAxIGNoYW5uZWwpICovDQotI2RlZmluZSBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV8yUkFOS1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX1NRUjFfTF8wKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBlbmFibGUgd2l0aCAyIHJhbmtzIGluIHRoZSBcDQotICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZSAqLw0KLSNkZWZpbmUgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfM1JBTktTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19TUVIxX0xfMSkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZW5hYmxlIHdpdGggMyByYW5rcyBpbiB0aGUgXA0KLSAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2UgKi8NCi0jZGVmaW5lIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzRSQU5LUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19TUVIxX0xfMSB8IEFEQ19TUVIxX0xfMCkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZW5hYmxlIHdpdGggNCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5rcyBpbiB0aGUgc2VxdWVuY2UgKi8NCi0jZGVmaW5lIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzVSQU5LUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfU1FSMV9MXzIpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGVuYWJsZSB3aXRoIDUgcmFua3MgaW4gdGhlIFwNCi0gICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlICovDQotI2RlZmluZSBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV82UkFOS1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfU1FSMV9MXzIgfCBBRENfU1FSMV9MXzApIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGVuYWJsZSB3aXRoIDYgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFua3MgaW4gdGhlIHNlcXVlbmNlICovDQotI2RlZmluZSBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV83UkFOS1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfU1FSMV9MXzIgfCBBRENfU1FSMV9MXzEpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGVuYWJsZSB3aXRoIDcgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFua3MgaW4gdGhlIHNlcXVlbmNlICovDQotI2RlZmluZSBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV84UkFOS1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX1NRUjFfTF8yIHwgQURDX1NRUjFfTF8xIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgQURDX1NRUjFfTF8wKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBlbmFibGUgd2l0aCA4IHJhbmtzIGluIHRoZSBcDQotICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZSAqLw0KLSNkZWZpbmUgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfOVJBTktTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19TUVIxX0xfMykgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZW5hYmxlIHdpdGggOSByYW5rcyBpbiB0aGUgXA0KLSAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2UgKi8NCi0jZGVmaW5lIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzEwUkFOS1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfU1FSMV9MXzMgfCBBRENfU1FSMV9MXzApIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGVuYWJsZSB3aXRoIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwIHJhbmtzIGluIHRoZSBzZXF1ZW5jZSAqLw0KLSNkZWZpbmUgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMTFSQU5LUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19TUVIxX0xfMyB8IEFEQ19TUVIxX0xfMSkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZW5hYmxlIHdpdGggXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEgcmFua3MgaW4gdGhlIHNlcXVlbmNlICovDQotI2RlZmluZSBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV8xMlJBTktTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19TUVIxX0xfMyB8IEFEQ19TUVIxX0xfMSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBBRENfU1FSMV9MXzApIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGVuYWJsZSB3aXRoIDEyIHJhbmtzIGluIHRoZSBcDQotICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZSAqLw0KLSNkZWZpbmUgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMTNSQU5LUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19TUVIxX0xfMyB8IEFEQ19TUVIxX0xfMikgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZW5hYmxlIHdpdGggXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMgcmFua3MgaW4gdGhlIHNlcXVlbmNlICovDQotI2RlZmluZSBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV8xNFJBTktTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19TUVIxX0xfMyB8IEFEQ19TUVIxX0xfMiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBBRENfU1FSMV9MXzApIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGVuYWJsZSB3aXRoIDE0IHJhbmtzIGluIHRoZSBcDQotICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZSAqLw0KLSNkZWZpbmUgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMTVSQU5LUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfU1FSMV9MXzMgfCBBRENfU1FSMV9MXzIgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgQURDX1NRUjFfTF8xKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBlbmFibGUgd2l0aCAxNSByYW5rcyBpbiB0aGUgXA0KLSAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2UgKi8NCi0jZGVmaW5lIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzE2UkFOS1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX1NRUjFfTF8zIHwgQURDX1NRUjFfTF8yIHwgQURDX1NRUjFfTF8xIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19TUVIxX0xfMCkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZW5hYmxlIHdpdGggMTYgcmFua3MgaW4gdGhlIFwNCi0gICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19SRUdfU0VRX0RJU0NPTlRfTU9ERSAgQURDIGdyb3VwIHJlZ3VsYXIgLSBTZXF1ZW5jZXINCi0gKiBkaXNjb250aW51b3VzIG1vZGUNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfQURDX1JFR19TRVFfRElTQ09OVF9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKDB4MDAwMDAwMDBVTCkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZGlzY29udGludW91cyBtb2RlIGRpc2FibGUgXA0KLSAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzFSQU5LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0ZHUl9ESVNDRU4pIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGRpc2NvbnRpbnVvdXMgbW9kZSBlbmFibGUgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBzZXF1ZW5jZSBpbnRlcnJ1cHRpb24gZXZlcnkgcmFuayAqLw0KLSNkZWZpbmUgTExfQURDX1JFR19TRVFfRElTQ09OVF8yUkFOS1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0ZHUl9ESVNDTlVNXzAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgQURDX0NGR1JfRElTQ0VOKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBkaXNjb250aW51b3VzIG1vZGUgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZCB3aXRoIHNlcXVlbmNlIGludGVycnVwdGlvbiBldmVyeSAyIHJhbmtzICovDQotI2RlZmluZSBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzNSQU5LUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0ZHUl9ESVNDTlVNXzEgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0RJU0NFTikgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZGlzY29udGludW91cyBtb2RlIGVuYWJsZSBcDQotICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHNlcXVlbmNlIGludGVycnVwdGlvbiBldmVyeSAzIHJhbmtzICovDQotI2RlZmluZSBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzRSQU5LUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0ZHUl9ESVNDTlVNXzEgfCBBRENfQ0ZHUl9ESVNDTlVNXzAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0RJU0NFTikgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZGlzY29udGludW91cyBtb2RlIGVuYWJsZSBcDQotICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHNlcXVlbmNlIGludGVycnVwdGlvbiBldmVyeSA0IHJhbmtzICovDQotI2RlZmluZSBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzVSQU5LUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0ZHUl9ESVNDTlVNXzIgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0RJU0NFTikgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZGlzY29udGludW91cyBtb2RlIGVuYWJsZSBcDQotICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHNlcXVlbmNlIGludGVycnVwdGlvbiBldmVyeSA1IHJhbmtzICovDQotI2RlZmluZSBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzZSQU5LUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0ZHUl9ESVNDTlVNXzIgfCBBRENfQ0ZHUl9ESVNDTlVNXzAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0RJU0NFTikgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZGlzY29udGludW91cyBtb2RlIGVuYWJsZSBcDQotICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHNlcXVlbmNlIGludGVycnVwdGlvbiBldmVyeSA2IHJhbmtzICovDQotI2RlZmluZSBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzdSQU5LUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0ZHUl9ESVNDTlVNXzIgfCBBRENfQ0ZHUl9ESVNDTlVNXzEgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0RJU0NFTikgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZGlzY29udGludW91cyBtb2RlIGVuYWJsZSBcDQotICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHNlcXVlbmNlIGludGVycnVwdGlvbiBldmVyeSA3IHJhbmtzICovDQotI2RlZmluZSBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzhSQU5LUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0ZHUl9ESVNDTlVNXzIgfCBBRENfQ0ZHUl9ESVNDTlVNXzEgfCBBRENfQ0ZHUl9ESVNDTlVNXzAgfCAgICAgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0RJU0NFTikgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZGlzY29udGludW91cyBtb2RlIGVuYWJsZSBcDQotICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHNlcXVlbmNlIGludGVycnVwdGlvbiBldmVyeSA4IHJhbmtzICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19SRUdfU0VRX1JBTktTICBBREMgZ3JvdXAgcmVndWxhciAtIFNlcXVlbmNlciByYW5rcw0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9BRENfUkVHX1JBTktfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19TUVIxX1JFR09GRlNFVCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBBRENfUkVHX1JBTktfMV9TUVJYX0JJVE9GRlNFVF9QT1MpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgMSBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX0FEQ19SRUdfUkFOS18yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX1NRUjFfUkVHT0ZGU0VUIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19SRUdfUkFOS18yX1NRUlhfQklUT0ZGU0VUX1BPUykgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgcmFuayAyIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfQURDX1JFR19SQU5LXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfU1FSMV9SRUdPRkZTRVQgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgQURDX1JFR19SQU5LXzNfU1FSWF9CSVRPRkZTRVRfUE9TKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciByYW5rIDMgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9BRENfUkVHX1JBTktfNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19TUVIxX1JFR09GRlNFVCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBBRENfUkVHX1JBTktfNF9TUVJYX0JJVE9GRlNFVF9QT1MpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgNCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX0FEQ19SRUdfUkFOS181ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX1NRUjJfUkVHT0ZGU0VUIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19SRUdfUkFOS181X1NRUlhfQklUT0ZGU0VUX1BPUykgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgcmFuayA1IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfQURDX1JFR19SQU5LXzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfU1FSMl9SRUdPRkZTRVQgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgQURDX1JFR19SQU5LXzZfU1FSWF9CSVRPRkZTRVRfUE9TKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciByYW5rIDYgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9BRENfUkVHX1JBTktfNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19TUVIyX1JFR09GRlNFVCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBBRENfUkVHX1JBTktfN19TUVJYX0JJVE9GRlNFVF9QT1MpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgNyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX0FEQ19SRUdfUkFOS184ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX1NRUjJfUkVHT0ZGU0VUIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19SRUdfUkFOS184X1NRUlhfQklUT0ZGU0VUX1BPUykgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgcmFuayA4IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfQURDX1JFR19SQU5LXzkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfU1FSMl9SRUdPRkZTRVQgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgQURDX1JFR19SQU5LXzlfU1FSWF9CSVRPRkZTRVRfUE9TKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciByYW5rIDkgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9BRENfUkVHX1JBTktfMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX1NRUjNfUkVHT0ZGU0VUIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgQURDX1JFR19SQU5LXzEwX1NRUlhfQklUT0ZGU0VUX1BPUykgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgcmFuayBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAgKi8NCi0jZGVmaW5lIExMX0FEQ19SRUdfUkFOS18xMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfU1FSM19SRUdPRkZTRVQgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBBRENfUkVHX1JBTktfMTFfU1FSWF9CSVRPRkZTRVRfUE9TKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciByYW5rIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMSAqLw0KLSNkZWZpbmUgTExfQURDX1JFR19SQU5LXzEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19TUVIzX1JFR09GRlNFVCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19SRUdfUkFOS18xMl9TUVJYX0JJVE9GRlNFVF9QT1MpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyICovDQotI2RlZmluZSBMTF9BRENfUkVHX1JBTktfMTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX1NRUjNfUkVHT0ZGU0VUIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgQURDX1JFR19SQU5LXzEzX1NRUlhfQklUT0ZGU0VUX1BPUykgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgcmFuayBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMgKi8NCi0jZGVmaW5lIExMX0FEQ19SRUdfUkFOS18xNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfU1FSM19SRUdPRkZTRVQgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBBRENfUkVHX1JBTktfMTRfU1FSWF9CSVRPRkZTRVRfUE9TKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciByYW5rIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNCAqLw0KLSNkZWZpbmUgTExfQURDX1JFR19SQU5LXzE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19TUVI0X1JFR09GRlNFVCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19SRUdfUkFOS18xNV9TUVJYX0JJVE9GRlNFVF9QT1MpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1ICovDQotI2RlZmluZSBMTF9BRENfUkVHX1JBTktfMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX1NRUjRfUkVHT0ZGU0VUIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgQURDX1JFR19SQU5LXzE2X1NRUlhfQklUT0ZGU0VUX1BPUykgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgcmFuayBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX0lOSl9UUklHR0VSX1NPVVJDRSAgQURDIGdyb3VwIGluamVjdGVkIC0gVHJpZ2dlciBzb3VyY2UNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfQURDX0lOSl9UUklHX1NPRlRXQVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoMHgwMDAwMDAwMFVMKSAvKiE8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi1BREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGludGVybmFsOiBTVyBzdGFydC4uIFRyaWdnZXIgZWRnZSBzZXQgdG8gXA0KLXJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLw0KLSNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9USU0xX1RSR08gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTEgVFJHTy4gXA0KLVRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovDQotI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTFfVFJHTzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfSlNRUl9KRVhUU0VMXzMgfCBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCAgICAgICAgICAgICAgICAgXA0KLUFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU0xIFRSR08yLiBcDQotVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8NCi0jZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMV9DSDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19KU1FSX0pFWFRTRUxfMyB8IEFEQ19KU1FSX0pFWFRTRUxfMSB8IEFEQ19KU1FSX0pFWFRTRUxfMCB8ICAgICAgICAgICAgICBcDQotICAgQURDX0lOSl9UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi1BREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMSBjaGFubmVsIDMgXA0KLWV2ZW50IChjYXB0dXJlIGNvbXBhcmU6IGlucHV0IGNhcHR1cmUgb3Igb3V0cHV0IGNhcHR1cmUpLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvICBcDQotcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuIE5vdGU6IE9uIHRoaXMgU1RNMzIgc2VyaWVzLCB0aGlzIHRyaWdnZXIgaXMgICAgIFwNCi1hdmFpbGFibGUgb25seSBvbiBBREMzLzQvNSBpbnN0YW5jZXMuIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIEFEQ3ggICAgICAgXA0KLWF2YWlsYWliaWxpdHkgKi8NCi0jZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMV9DSDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19KU1FSX0pFWFRTRUxfMCB8IEFEQ19JTkpfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8ICAgICAgICAgICAgICAgICAgICBcDQotQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTEgY2hhbm5lbCA0IFwNCi1ldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIG91dHB1dCBjYXB0dXJlKS4gVHJpZ2dlciBlZGdlIHNldCB0byAgXA0KLXJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLw0KLSNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9USU0yX1RSR08gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfSlNRUl9KRVhUU0VMXzEgfCBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCAgICAgICAgICAgICAgICBcDQotQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTIgVFJHTy4gXA0KLVRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovDQotI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTJfQ0gxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfSlNRUl9KRVhUU0VMXzEgfCBBRENfSlNRUl9KRVhUU0VMXzAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19JTkpfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTIgY2hhbm5lbCAxIFwNCi1ldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIG91dHB1dCBjYXB0dXJlKS4gVHJpZ2dlciBlZGdlIHNldCB0byAgXA0KLXJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiBOb3RlOiBPbiB0aGlzIFNUTTMyIHNlcmllcywgdGhpcyB0cmlnZ2VyIGlzICAgICBcDQotYXZhaWxhYmxlIG9ubHkgb24gQURDMS8yIGluc3RhbmNlcyAqLw0KLSNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9USU0zX1RSR08gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfSlNRUl9KRVhUU0VMXzMgfCBBRENfSlNRUl9KRVhUU0VMXzIgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgQURDX0lOSl9UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLUFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU0zIFRSR08uIFwNCi1UcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLw0KLSNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9USU0zX0NIMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0pTUVJfSkVYVFNFTF8zIHwgQURDX0pTUVJfSkVYVFNFTF8yIHwgQURDX0pTUVJfSkVYVFNFTF8wIHwgICAgICAgICAgICAgIFwNCi0gICBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLUFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU0zIGNoYW5uZWwgMSBcDQotZXZlbnQgKGNhcHR1cmUgY29tcGFyZTogaW5wdXQgY2FwdHVyZSBvciBvdXRwdXQgY2FwdHVyZSkuIFRyaWdnZXIgZWRnZSBzZXQgdG8gIFwNCi1yaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gTm90ZTogT24gdGhpcyBTVE0zMiBzZXJpZXMsIHRoaXMgdHJpZ2dlciBpcyAgICAgXA0KLWF2YWlsYWJsZSBvbmx5IG9uIEFEQzEvMiBpbnN0YW5jZXMgKi8NCi0jZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfVElNM19DSDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19KU1FSX0pFWFRTRUxfMyB8IEFEQ19KU1FSX0pFWFRTRUxfMSB8IEFEQ19KU1FSX0pFWFRTRUxfMCB8ICAgICAgICAgICAgICBcDQotICAgQURDX0lOSl9UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi1BREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMyBjaGFubmVsIDMgXA0KLWV2ZW50IChjYXB0dXJlIGNvbXBhcmU6IGlucHV0IGNhcHR1cmUgb3Igb3V0cHV0IGNhcHR1cmUpLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvICBcDQotcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuIE5vdGU6IE9uIHRoaXMgU1RNMzIgc2VyaWVzLCB0aGlzIHRyaWdnZXIgaXMgICAgIFwNCi1hdmFpbGFibGUgb25seSBvbiBBREMxLzIgaW5zdGFuY2VzICovDQotI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTNfQ0g0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfSlNRUl9KRVhUU0VMXzIgfCBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCAgICAgICAgICAgICAgICAgICAgXA0KLUFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU0zIGNoYW5uZWwgNCBcDQotZXZlbnQgKGNhcHR1cmUgY29tcGFyZTogaW5wdXQgY2FwdHVyZSBvciBvdXRwdXQgY2FwdHVyZSkuIFRyaWdnZXIgZWRnZSBzZXQgdG8gIFwNCi1yaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gTm90ZTogT24gdGhpcyBTVE0zMiBzZXJpZXMsIHRoaXMgdHJpZ2dlciBpcyAgICAgXA0KLWF2YWlsYWJsZSBvbmx5IG9uIEFEQzEvMiBpbnN0YW5jZXMgKi8NCi0jZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfVElNNF9UUkdPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0pTUVJfSkVYVFNFTF8yIHwgQURDX0pTUVJfSkVYVFNFTF8wIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19JTkpfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi1BREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNNCBUUkdPLiBcDQotVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8NCi0jZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfVElNNF9DSDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19KU1FSX0pFWFRTRUxfMiB8IEFEQ19JTkpfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8ICAgICAgICAgICAgICAgICAgICBcDQotQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTQgY2hhbm5lbCAzIFwNCi1ldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIG91dHB1dCBjYXB0dXJlKS4gVHJpZ2dlciBlZGdlIHNldCB0byAgXA0KLXJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiBOb3RlOiBPbiB0aGlzIFNUTTMyIHNlcmllcywgdGhpcyB0cmlnZ2VyIGlzICAgICBcDQotYXZhaWxhYmxlIG9ubHkgb24gQURDMy80LzUgaW5zdGFuY2VzLiBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBBREN4ICAgICAgIFwNCi1hdmFpbGFpYmlsaXR5ICovDQotI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTRfQ0g0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfSlNRUl9KRVhUU0VMXzIgfCBBRENfSlNRUl9KRVhUU0VMXzEgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19JTkpfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTQgY2hhbm5lbCA0IFwNCi1ldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIG91dHB1dCBjYXB0dXJlKS4gVHJpZ2dlciBlZGdlIHNldCB0byAgXA0KLXJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiBOb3RlOiBPbiB0aGlzIFNUTTMyIHNlcmllcywgdGhpcyB0cmlnZ2VyIGlzICAgICBcDQotYXZhaWxhYmxlIG9ubHkgb24gQURDMy80LzUgaW5zdGFuY2VzLiBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBBREN4ICAgICAgIFwNCi1hdmFpbGFpYmlsaXR5ICovDQotI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTZfVFJHTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19KU1FSX0pFWFRTRUxfMyB8IEFEQ19KU1FSX0pFWFRTRUxfMiB8IEFEQ19KU1FSX0pFWFRTRUxfMSB8ICAgICAgICAgIFwNCi0gICBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTYgVFJHTy4gXA0KLVRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovDQotI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTdfVFJHTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19KU1FSX0pFWFRTRUxfNCB8IEFEQ19KU1FSX0pFWFRTRUxfMyB8IEFEQ19KU1FSX0pFWFRTRUxfMiB8ICAgICAgICAgIFwNCi0gICBBRENfSlNRUl9KRVhUU0VMXzEgfCBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCAgICAgICAgICAgICAgICBcDQotQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTcgVFJHTy4gXA0KLVRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovDQotI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTThfVFJHTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19KU1FSX0pFWFRTRUxfMyB8IEFEQ19KU1FSX0pFWFRTRUxfMCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTggVFJHTy4gXA0KLVRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovDQotI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTThfVFJHTzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfSlNRUl9KRVhUU0VMXzMgfCBBRENfSlNRUl9KRVhUU0VMXzEgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19JTkpfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTggVFJHTzIuIFwNCi1UcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLw0KLSNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9USU04X0NIMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0pTUVJfSkVYVFNFTF8xIHwgQURDX0pTUVJfSkVYVFNFTF8wIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLUFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU04IGNoYW5uZWwgMiBcDQotZXZlbnQgKGNhcHR1cmUgY29tcGFyZTogaW5wdXQgY2FwdHVyZSBvciBvdXRwdXQgY2FwdHVyZSkuIFRyaWdnZXIgZWRnZSBzZXQgdG8gIFwNCi1yaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gTm90ZTogT24gdGhpcyBTVE0zMiBzZXJpZXMsIHRoaXMgdHJpZ2dlciBpcyAgICAgXA0KLWF2YWlsYWJsZSBvbmx5IG9uIEFEQzMvNC81IGluc3RhbmNlcy4gUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgQURDeCAgICAgICBcDQotYXZhaWxhaWJpbGl0eSAqLw0KLSNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9USU04X0NINCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0pTUVJfSkVYVFNFTF8yIHwgQURDX0pTUVJfSkVYVFNFTF8xIHwgQURDX0pTUVJfSkVYVFNFTF8wIHwgICAgICAgICAgICAgIFwNCi0gICBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLUFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU04IGNoYW5uZWwgNCBcDQotZXZlbnQgKGNhcHR1cmUgY29tcGFyZTogaW5wdXQgY2FwdHVyZSBvciBvdXRwdXQgY2FwdHVyZSkuIFRyaWdnZXIgZWRnZSBzZXQgdG8gIFwNCi1yaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8NCi0jZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMTVfVFJHTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19KU1FSX0pFWFRTRUxfMyB8IEFEQ19KU1FSX0pFWFRTRUxfMiB8IEFEQ19KU1FSX0pFWFRTRUxfMSB8ICAgICAgICAgICBcDQotICAgQURDX0pTUVJfSkVYVFNFTF8wIHwgQURDX0lOSl9UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgICAgICAgICAgICAgICAgIFwNCi1BREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMTUgVFJHTy4gXA0KLVRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovDQotI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTE2X0NIMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfSlNRUl9KRVhUU0VMXzQgfCBBRENfSlNRUl9KRVhUU0VMXzMgfCBBRENfSlNRUl9KRVhUU0VMXzEgfCAgICAgICAgICAgICAgXA0KLSAgIEFEQ19KU1FSX0pFWFRTRUxfMCB8IEFEQ19JTkpfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8ICAgICAgICAgICAgICAgICAgICBcDQotQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTggY2hhbm5lbCA0IFwNCi1ldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIG91dHB1dCBjYXB0dXJlKS4gVHJpZ2dlciBlZGdlIHNldCB0byAgXA0KLXJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiBOb3RlOiBPbiB0aGlzIFNUTTMyIHNlcmllcywgdGhpcyB0cmlnZ2VyIGlzICAgICBcDQotYXZhaWxhYmxlIG9ubHkgb24gQURDMS8yIGluc3RhbmNlcyAqLw0KLSNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9USU0yMF9UUkdPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0pTUVJfSkVYVFNFTF80IHwgQURDX0lOSl9UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgICAgICAgICAgICAgICAgICAgIFwNCi1BREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMjAgVFJHTy4gICAgXA0KLVRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuIE5vdGU6IE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBcDQotVElNMjAgaXMgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlcy4gUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgbW9yZSAgICAgIFwNCi1kZXRhaWxzICovDQotI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTIwX1RSR08yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfSlNRUl9KRVhUU0VMXzQgfCBBRENfSlNRUl9KRVhUU0VMXzAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19JTkpfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTIwIFRSR08yLiAgIFwNCi1UcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiBOb3RlOiBPbiB0aGlzIFNUTTMyIHNlcmllcywgXA0KLVRJTTIwIGlzIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIG1vcmUgICAgICBcDQotZGV0YWlscyAqLw0KLSNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9USU0yMF9DSDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfSlNRUl9KRVhUU0VMXzQgfCBBRENfSlNRUl9KRVhUU0VMXzEgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgQURDX0lOSl9UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLUFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU0yMCBjaGFubmVsIFwNCi0yIGV2ZW50IChjYXB0dXJlIGNvbXBhcmU6IGlucHV0IGNhcHR1cmUgb3Igb3V0cHV0IGNhcHR1cmUpLiBUcmlnZ2VyIGVkZ2Ugc2V0ICBcDQotdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuIFRyaWdnZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDMy80LzUgICAgICAgICAgXA0KLWluc3RhbmNlcy4gT24gdGhpcyBTVE0zMiBzZXJpZXMsIFRJTTIwIGlzIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuIFJlZmVyIFwNCi10byBkZXZpY2UgZGF0YXNoZWV0IGZvciBtb3JlIGRldGFpbHMgKi8NCi0jZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMjBfQ0g0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0pTUVJfSkVYVFNFTF80IHwgQURDX0pTUVJfSkVYVFNFTF8xIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19JTkpfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi1BREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMjAgY2hhbm5lbCBcDQotNCBldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIG91dHB1dCBjYXB0dXJlKS4gVHJpZ2dlciBlZGdlIHNldCAgXA0KLXRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiBUcmlnZ2VyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQzEvMiBpbnN0YW5jZXMuIFwNCi1PbiB0aGlzIFNUTTMyIHNlcmllcywgVElNMjAgaXMgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlcy4gUmVmZXIgdG8gZGV2aWNlICBcDQotZGF0YXNoZWV0IGZvciBtb3JlIGRldGFpbHMgKi8NCi0jZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfSFJUSU1fVFJHMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfSlNRUl9KRVhUU0VMXzQgfCBBRENfSlNRUl9KRVhUU0VMXzMgfCBBRENfSlNRUl9KRVhUU0VMXzEgfCAgICAgICAgICAgIFwNCi0gICBBRENfSlNRUl9KRVhUU0VMXzAgfCBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCAgICAgICAgICAgICAgICAgIFwNCi1BREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogSFJUSU1FUiBBREMgIFwNCi10cmlnZ2VyIDEgZXZlbnQuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuIE5vdGU6IE9uIFwNCi10aGlzIFNUTTMyIHNlcmllcywgdGhpcyB0cmlnZ2VyIGlzIGF2YWlsYWJsZSBvbmx5IG9uIEFEQzMvNC81IGluc3RhbmNlcywgYW5kIFwNCi1IUlRJTSBpcyBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzLiBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBtb3JlICAgIFwNCi1kZXRhaWxzICovDQotI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX0hSVElNX1RSRzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0pTUVJfSkVYVFNFTF80IHwgQURDX0pTUVJfSkVYVFNFTF8xIHwgQURDX0pTUVJfSkVYVFNFTF8wIHwgICAgICAgICAgICBcDQotICAgQURDX0lOSl9UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IEhSVElNRVIgQURDICBcDQotdHJpZ2dlciAyIGV2ZW50LiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiBOb3RlOiBPbiBcDQotdGhpcyBTVE0zMiBzZXJpZXMsIEhSVElNIGlzIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuIFJlZmVyIHRvIGRldmljZSAgICBcDQotZGF0YXNoZWV0IGZvciBtb3JlIGRldGFpbHMgKi8NCi0jZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfSFJUSU1fVFJHMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfSlNRUl9KRVhUU0VMXzQgfCBBRENfSlNRUl9KRVhUU0VMXzMgfCBBRENfSlNRUl9KRVhUU0VMXzIgfCAgICAgICAgICAgIFwNCi0gICBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi1BREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogSFJUSU1FUiBBREMgIFwNCi10cmlnZ2VyIDMgZXZlbnQuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuIE5vdGU6IE9uIFwNCi10aGlzIFNUTTMyIHNlcmllcywgdGhpcyB0cmlnZ2VyIGlzIGF2YWlsYWJsZSBvbmx5IG9uIEFEQzMvNC81IGluc3RhbmNlcywgYW5kIFwNCi1IUlRJTSBpcyBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzLiBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBtb3JlICAgIFwNCi1kZXRhaWxzICovDQotI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX0hSVElNX1RSRzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0pTUVJfSkVYVFNFTF80IHwgQURDX0pTUVJfSkVYVFNFTF8yIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgQURDX0lOSl9UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IEhSVElNRVIgQURDICBcDQotdHJpZ2dlciA0IGV2ZW50LiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiBOb3RlOiBPbiBcDQotdGhpcyBTVE0zMiBzZXJpZXMsIEhSVElNIGlzIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuIFJlZmVyIHRvIGRldmljZSAgICBcDQotZGF0YXNoZWV0IGZvciBtb3JlIGRldGFpbHMgKi8NCi0jZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfSFJUSU1fVFJHNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfSlNRUl9KRVhUU0VMXzQgfCBBRENfSlNRUl9KRVhUU0VMXzIgfCBBRENfSlNRUl9KRVhUU0VMXzAgfCAgICAgICAgICAgIFwNCi0gICBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi1BREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogSFJUSU1FUiBBREMgIFwNCi10cmlnZ2VyIDUgZXZlbnQuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuIE5vdGU6IE9uIFwNCi10aGlzIFNUTTMyIHNlcmllcywgSFJUSU0gaXMgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlcy4gUmVmZXIgdG8gZGV2aWNlICAgIFwNCi1kYXRhc2hlZXQgZm9yIG1vcmUgZGV0YWlscyAqLw0KLSNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9IUlRJTV9UUkc2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19KU1FSX0pFWFRTRUxfNCB8IEFEQ19KU1FSX0pFWFRTRUxfMiB8IEFEQ19KU1FSX0pFWFRTRUxfMSB8ICAgICAgICAgICAgXA0KLSAgIEFEQ19JTkpfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLUFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBIUlRJTUVSIEFEQyAgXA0KLXRyaWdnZXIgNiBldmVudC4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gTm90ZTogT24gXA0KLXRoaXMgU1RNMzIgc2VyaWVzLCBIUlRJTSBpcyBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzLiBSZWZlciB0byBkZXZpY2UgICAgXA0KLWRhdGFzaGVldCBmb3IgbW9yZSBkZXRhaWxzICovDQotI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX0hSVElNX1RSRzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0pTUVJfSkVYVFNFTF80IHwgQURDX0pTUVJfSkVYVFNFTF8yIHwgQURDX0pTUVJfSkVYVFNFTF8xIHwgICAgICAgICAgICBcDQotICAgQURDX0pTUVJfSkVYVFNFTF8wIHwgQURDX0lOSl9UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgICAgICAgICAgICAgICAgICBcDQotQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IEhSVElNRVIgQURDICBcDQotdHJpZ2dlciA3IGV2ZW50LiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiBOb3RlOiBPbiBcDQotdGhpcyBTVE0zMiBzZXJpZXMsIEhSVElNIGlzIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuIFJlZmVyIHRvIGRldmljZSAgICBcDQotZGF0YXNoZWV0IGZvciBtb3JlIGRldGFpbHMgKi8NCi0jZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfSFJUSU1fVFJHOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfSlNRUl9KRVhUU0VMXzQgfCBBRENfSlNRUl9KRVhUU0VMXzMgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi1BREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogSFJUSU1FUiBBREMgIFwNCi10cmlnZ2VyIDggZXZlbnQuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuIE5vdGU6IE9uIFwNCi10aGlzIFNUTTMyIHNlcmllcywgSFJUSU0gaXMgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlcy4gUmVmZXIgdG8gZGV2aWNlICAgIFwNCi1kYXRhc2hlZXQgZm9yIG1vcmUgZGV0YWlscyAqLw0KLSNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9IUlRJTV9UUkc5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19KU1FSX0pFWFRTRUxfNCB8IEFEQ19KU1FSX0pFWFRTRUxfMyB8IEFEQ19KU1FSX0pFWFRTRUxfMCB8ICAgICAgICAgICAgXA0KLSAgIEFEQ19JTkpfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLUFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBIUlRJTUVSIEFEQyAgXA0KLXRyaWdnZXIgOSBldmVudC4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gTm90ZTogT24gXA0KLXRoaXMgU1RNMzIgc2VyaWVzLCBIUlRJTSBpcyBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzLiBSZWZlciB0byBkZXZpY2UgICAgXA0KLWRhdGFzaGVldCBmb3IgbW9yZSBkZXRhaWxzICovDQotI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX0hSVElNX1RSRzEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19KU1FSX0pFWFRTRUxfNCB8IEFEQ19KU1FSX0pFWFRTRUxfMyB8IEFEQ19KU1FSX0pFWFRTRUxfMSB8ICAgICAgICAgICAgIFwNCi0gICBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IEhSVElNRVIgQURDICAgXA0KLXRyaWdnZXIgMTAgZXZlbnQuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuIE5vdGU6IE9uIFwNCi10aGlzIFNUTTMyIHNlcmllcywgSFJUSU0gaXMgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlcy4gUmVmZXIgdG8gZGV2aWNlICAgICBcDQotZGF0YXNoZWV0IGZvciBtb3JlIGRldGFpbHMgKi8NCi0jZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfRVhUSV9MSU5FMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19KU1FSX0pFWFRTRUxfMyB8IEFEQ19KU1FSX0pFWFRTRUxfMiB8IEFEQ19KU1FSX0pFWFRTRUxfMCB8ICAgICAgICAgICAgICBcDQotICAgQURDX0lOSl9UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi1BREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogZXh0ZXJuYWwgICAgICAgXA0KLWludGVycnVwdCBsaW5lIDMuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuIE5vdGU6IE9uICBcDQotdGhpcyBTVE0zMiBzZXJpZXMsIHRoaXMgdHJpZ2dlciBpcyBhdmFpbGFibGUgb25seSBvbiBBREMzLzQvNSBpbnN0YW5jZXMuIFJlZmVyIFwNCi10byBkZXZpY2UgZGF0YXNoZWV0IGZvciBBREN4IGF2YWlsYWliaWxpdHkgKi8NCi0jZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfRVhUSV9MSU5FMTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19KU1FSX0pFWFRTRUxfMiB8IEFEQ19KU1FSX0pFWFRTRUxfMSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgQURDX0lOSl9UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi1BREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogZXh0ZXJuYWwgICAgICAgXA0KLWludGVycnVwdCBsaW5lIDE1LiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiBOb3RlOiBPbiBcDQotdGhpcyBTVE0zMiBzZXJpZXMsIHRoaXMgdHJpZ2dlciBpcyBhdmFpbGFibGUgb25seSBvbiBBREMxLzIgaW5zdGFuY2VzLiAqLw0KLSNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9MUFRJTV9PVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0pTUVJfSkVYVFNFTF80IHwgQURDX0pTUVJfSkVYVFNFTF8zIHwgQURDX0pTUVJfSkVYVFNFTF8yIHwgICAgICAgICAgIFwNCi0gICBBRENfSlNRUl9KRVhUU0VMXzAgfCBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCAgICAgICAgICAgICAgICAgXA0KLUFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBMUFRJTUVSIE9VVCBcDQotZXZlbnQuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19JTkpfVFJJR0dFUl9FREdFICBBREMgZ3JvdXAgaW5qZWN0ZWQgLSBUcmlnZ2VyIGVkZ2UNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9SSVNJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfSlNRUl9KRVhURU5fMCkgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIHBvbGFyaXR5IHNldCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHJpc2luZyBlZGdlICovDQotI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX0ZBTExJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19KU1FSX0pFWFRFTl8xKSAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgcG9sYXJpdHkgc2V0IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgdG8gZmFsbGluZyBlZGdlICovDQotI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX1JJU0lOR0ZBTExJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19KU1FSX0pFWFRFTl8xIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBBRENfSlNRUl9KRVhURU5fMCkgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIHBvbGFyaXR5IHNldCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJvdGggcmlzaW5nIGFuZCBmYWxsaW5nIGVkZ2VzICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19JTkpfVFJJR19BVVRPICBBREMgZ3JvdXAgaW5qZWN0ZWQgLSBBdXRvbWF0aWMgdHJpZ2dlcg0KLSAqIG1vZGUNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfQURDX0lOSl9UUklHX0lOREVQRU5ERU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKDB4MDAwMDAwMDBVTCkgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGluZGVwZW5kZW50LiAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgU2V0dGluZyBtYW5kYXRvcnkgaWYgQURDIGdyb3VwIGluamVjdGVkIGluamVjdGVkIHRyaWdnZXIgXA0KLSAgICAgICAgICAgICAgICAgICAgc291cmNlIGlzIHNldCB0byBhbiBleHRlcm5hbCB0cmlnZ2VyLiAqLw0KLSNkZWZpbmUgTExfQURDX0lOSl9UUklHX0ZST01fR1JQX1JFR1VMQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0NGR1JfSkFVVE8pIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIEFEQyBncm91cCAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgcmVndWxhci4gU2V0dGluZyBjb21wbGlhbnQgb25seSB3aXRoIGdyb3VwIGluamVjdGVkICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyIHNvdXJjZSBzZXQgdG8gU1cgc3RhcnQsIHdpdGhvdXQgYW55IGZ1cnRoZXIgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbiBvbiAgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gc3RhcnQgb3Igc3RvcDogIFwNCi0gICAgICAgICAgICAgICAgICAgICAgaW4gdGhpcyBjYXNlLCBBREMgZ3JvdXAgaW5qZWN0ZWQgaXMgY29udHJvbGxlZCBvbmx5IGZyb20gXA0KLSAgICAgICAgICAgICAgICAgICAgICBBREMgZ3JvdXAgcmVndWxhci4gKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX0lOSl9DT05URVhUX1FVRVVFICBBREMgZ3JvdXAgaW5qZWN0ZWQgLSBDb250ZXh0IHF1ZXVlDQotICogbW9kZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9BRENfSU5KX1FVRVVFXzJDT05URVhUU19MQVNUX0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoMHgwMDAwMDAwMFVMKSAvKiBHcm91cCBpbmplY3RlZCBzZXF1ZW5jZSBjb250ZXh0IHF1ZXVlIGlzIGVuYWJsZWQgYW5kIGNhbiBcDQotICAgICAgICAgICAgICAgICAgICBjb250YWluIHVwIHRvIDIgY29udGV4dHMuIFdoZW4gYWxsIGNvbnRleHRzIGhhdmUgYmVlbiAgICBcDQotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWQsIHRoZSBxdWV1ZSBtYWludGFpbnMgdGhlIGxhc3QgY29udGV4dCBhY3RpdmUgICBcDQotICAgICAgICAgICAgICAgICAgICBwZXJwZXR1YWxseS4gKi8NCi0jZGVmaW5lIExMX0FEQ19JTkpfUVVFVUVfMkNPTlRFWFRTX0VORF9FTVBUWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0NGR1JfSlFNKSAvKiBHcm91cCBpbmplY3RlZCBzZXF1ZW5jZSBjb250ZXh0IHF1ZXVlIGlzIGVuYWJsZWQgYW5kIGNhbiAgXA0KLSAgICAgICAgICAgICAgICAgICAgY29udGFpbiB1cCB0byAyIGNvbnRleHRzLiBXaGVuIGFsbCBjb250ZXh0cyBoYXZlIGJlZW4gICAgIFwNCi0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZCwgdGhlIHF1ZXVlIGlzIGVtcHR5IGFuZCBpbmplY3RlZCBncm91cCB0cmlnZ2VycyBcDQotICAgICAgICAgICAgICAgICAgICBhcmUgZGlzYWJsZWQuICovDQotI2RlZmluZSBMTF9BRENfSU5KX1FVRVVFX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19DRkdSX0pRRElTKSAvKiBHcm91cCBpbmplY3RlZCBzZXF1ZW5jZSBjb250ZXh0IHF1ZXVlIGlzIGRpc2FibGVkOiBvbmx5IFwNCi0gICAgICAgICAgICAgICAgICAgICAgMSBzZXF1ZW5jZSBjYW4gYmUgY29uZmlndXJlZCBhbmQgaXMgYWN0aXZlIHBlcnBldHVhbGx5LiBcDQotICAgICAgICAgICAgICAgICAgICAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBBRENfTExfRUNfSU5KX1NFUV9TQ0FOX0xFTkdUSCAgQURDIGdyb3VwIGluamVjdGVkIC0gU2VxdWVuY2VyIHNjYW4NCi0gKiBsZW5ndGgNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfQURDX0lOSl9TRVFfU0NBTl9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKDB4MDAwMDAwMDBVTCkgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgc2VxdWVuY2VyIGRpc2FibGUgKGVxdWl2YWxlbnQgdG8gXA0KLSAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VyIG9mIDEgcmFuazogQURDIGNvbnZlcnNpb24gb24gb25seSAxIGNoYW5uZWwpICovDQotI2RlZmluZSBMTF9BRENfSU5KX1NFUV9TQ0FOX0VOQUJMRV8yUkFOS1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfSlNRUl9KTF8wKSAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBzZXF1ZW5jZXIgZW5hYmxlIHdpdGggMiByYW5rcyBpbiB0aGUgXA0KLSAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlICovDQotI2RlZmluZSBMTF9BRENfSU5KX1NFUV9TQ0FOX0VOQUJMRV8zUkFOS1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfSlNRUl9KTF8xKSAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBzZXF1ZW5jZXIgZW5hYmxlIHdpdGggMyByYW5rcyBpbiB0aGUgXA0KLSAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlICovDQotI2RlZmluZSBMTF9BRENfSU5KX1NFUV9TQ0FOX0VOQUJMRV80UkFOS1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19KU1FSX0pMXzEgfCBBRENfSlNRUl9KTF8wKSAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBzZXF1ZW5jZXIgZW5hYmxlIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCA0IHJhbmtzIGluIHRoZSBzZXF1ZW5jZSAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBBRENfTExfRUNfSU5KX1NFUV9ESVNDT05UX01PREUgIEFEQyBncm91cCBpbmplY3RlZCAtIFNlcXVlbmNlcg0KLSAqIGRpc2NvbnRpbnVvdXMgbW9kZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9BRENfSU5KX1NFUV9ESVNDT05UX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKDB4MDAwMDAwMDBVTCkgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgc2VxdWVuY2VyIGRpc2NvbnRpbnVvdXMgbW9kZSBkaXNhYmxlIFwNCi0gICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfQURDX0lOSl9TRVFfRElTQ09OVF8xUkFOSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19DRkdSX0pESVNDRU4pIC8qITwgQURDIGdyb3VwIGluamVjdGVkIHNlcXVlbmNlciBkaXNjb250aW51b3VzIG1vZGUgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZSB3aXRoIHNlcXVlbmNlIGludGVycnVwdGlvbiBldmVyeSByYW5rICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19JTkpfU0VRX1JBTktTICBBREMgZ3JvdXAgaW5qZWN0ZWQgLSBTZXF1ZW5jZXIgcmFua3MNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfQURDX0lOSl9SQU5LXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0pEUjFfUkVHT0ZGU0VUIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBBRENfSU5KX1JBTktfMV9KU1FSX0JJVE9GRlNFVF9QT1MpIC8qITwgQURDIGdyb3VwIGluamVjdGVkIHNlcXVlbmNlciByYW5rIDEgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9BRENfSU5KX1JBTktfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfSkRSMl9SRUdPRkZTRVQgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19JTkpfUkFOS18yX0pTUVJfQklUT0ZGU0VUX1BPUykgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgc2VxdWVuY2VyIHJhbmsgMiBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX0FEQ19JTkpfUkFOS18zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19KRFIzX1JFR09GRlNFVCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgQURDX0lOSl9SQU5LXzNfSlNRUl9CSVRPRkZTRVRfUE9TKSAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBzZXF1ZW5jZXIgcmFuayAzIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfQURDX0lOSl9SQU5LXzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0pEUjRfUkVHT0ZGU0VUIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBBRENfSU5KX1JBTktfNF9KU1FSX0JJVE9GRlNFVF9QT1MpIC8qITwgQURDIGdyb3VwIGluamVjdGVkIHNlcXVlbmNlciByYW5rIDQgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19DSEFOTkVMX1NBTVBMSU5HVElNRSAgQ2hhbm5lbCAtIFNhbXBsaW5nIHRpbWUNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfQURDX1NBTVBMSU5HVElNRV8yQ1lDTEVTXzUgXA0KLSAgKDB4MDAwMDAwMDBVTCkgLyohPCBTYW1wbGluZyB0aW1lIDIuNSBBREMgY2xvY2sgY3ljbGVzICovDQotI2RlZmluZSBMTF9BRENfU0FNUExJTkdUSU1FXzZDWUNMRVNfNSBcDQotICAoQURDX1NNUFIyX1NNUDEwXzApIC8qITwgU2FtcGxpbmcgdGltZSA2LjUgQURDIGNsb2NrIGN5Y2xlcyAqLw0KLSNkZWZpbmUgTExfQURDX1NBTVBMSU5HVElNRV8xMkNZQ0xFU181IFwNCi0gIChBRENfU01QUjJfU01QMTBfMSkgLyohPCBTYW1wbGluZyB0aW1lIDEyLjUgQURDIGNsb2NrIGN5Y2xlcyAqLw0KLSNkZWZpbmUgTExfQURDX1NBTVBMSU5HVElNRV8yNENZQ0xFU181IFwNCi0gIChBRENfU01QUjJfU01QMTBfMSB8ICAgICAgICAgICAgICAgICBcDQotICAgQURDX1NNUFIyX1NNUDEwXzApIC8qITwgU2FtcGxpbmcgdGltZSAyNC41IEFEQyBjbG9jayBjeWNsZXMgKi8NCi0jZGVmaW5lIExMX0FEQ19TQU1QTElOR1RJTUVfNDdDWUNMRVNfNSBcDQotICAoQURDX1NNUFIyX1NNUDEwXzIpIC8qITwgU2FtcGxpbmcgdGltZSA0Ny41IEFEQyBjbG9jayBjeWNsZXMgKi8NCi0jZGVmaW5lIExMX0FEQ19TQU1QTElOR1RJTUVfOTJDWUNMRVNfNSBcDQotICAoQURDX1NNUFIyX1NNUDEwXzIgfCAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19TTVBSMl9TTVAxMF8wKSAvKiE8IFNhbXBsaW5nIHRpbWUgOTIuNSBBREMgY2xvY2sgY3ljbGVzICovDQotI2RlZmluZSBMTF9BRENfU0FNUExJTkdUSU1FXzI0N0NZQ0xFU181IFwNCi0gIChBRENfU01QUjJfU01QMTBfMiB8ICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19TTVBSMl9TTVAxMF8xKSAvKiE8IFNhbXBsaW5nIHRpbWUgMjQ3LjUgQURDIGNsb2NrIGN5Y2xlcyAqLw0KLSNkZWZpbmUgTExfQURDX1NBTVBMSU5HVElNRV82NDBDWUNMRVNfNSAgICBcDQotICAoQURDX1NNUFIyX1NNUDEwXzIgfCBBRENfU01QUjJfU01QMTBfMSB8IFwNCi0gICBBRENfU01QUjJfU01QMTBfMCkgLyohPCBTYW1wbGluZyB0aW1lIDY0MC41IEFEQyBjbG9jayBjeWNsZXMgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX0NIQU5ORUxfU0lOR0xFX0RJRkZfRU5ESU5HICBDaGFubmVsIC0gU2luZ2xlIG9yDQotICogZGlmZmVyZW50aWFsIGVuZGluZw0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9BRENfU0lOR0xFX0VOREVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0FMRkFDVF9DQUxGQUNUX1MpIC8qITwgQURDIGNoYW5uZWwgZW5kaW5nIHNldCB0byBzaW5nbGUgZW5kZWQgKGxpdGVyYWwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxzbyB1c2VkIHRvIHNldCBjYWxpYnJhdGlvbiBtb2RlKSAqLw0KLSNkZWZpbmUgTExfQURDX0RJRkZFUkVOVElBTF9FTkRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0NSX0FEQ0FMRElGIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBBRENfQ0FMRkFDVF9DQUxGQUNUX0QpIC8qITwgQURDIGNoYW5uZWwgZW5kaW5nIHNldCB0byBkaWZmZXJlbnRpYWwgKGxpdGVyYWwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxzbyB1c2VkIHRvIHNldCBjYWxpYnJhdGlvbiBtb2RlKSAqLw0KLSNkZWZpbmUgTExfQURDX0JPVEhfU0lOR0xFX0RJRkZfRU5ERUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoTExfQURDX1NJTkdMRV9FTkRFRCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBMTF9BRENfRElGRkVSRU5USUFMX0VOREVEKSAvKiE8IEFEQyBjaGFubmVsIGVuZGluZyBzZXQgdG8gYm90aCBzaW5nbGUgZW5kZWQgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBkaWZmZXJlbnRpYWwgKGxpdGVyYWwgdXNlZCBvbmx5IHRvIHNldCAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsaWJyYXRpb24gZmFjdG9ycykgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX0FXRF9OVU1CRVIgQW5hbG9nIHdhdGNoZG9nIC0gQW5hbG9nIHdhdGNoZG9nIG51bWJlcg0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9BRENfQVdEMSAgICAgICAgICAgXA0KLSAgKEFEQ19BV0RfQ1IxX0NIQU5ORUxfTUFTSyB8IFwNCi0gICBBRENfQVdEX0NSMV9SRUdPRkZTRVQpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBudW1iZXIgMSAqLw0KLSNkZWZpbmUgTExfQURDX0FXRDIgICAgICAgICAgICBcDQotICAoQURDX0FXRF9DUjIzX0NIQU5ORUxfTUFTSyB8IFwNCi0gICBBRENfQVdEX0NSMl9SRUdPRkZTRVQpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBudW1iZXIgMiAqLw0KLSNkZWZpbmUgTExfQURDX0FXRDMgICAgICAgICAgICBcDQotICAoQURDX0FXRF9DUjIzX0NIQU5ORUxfTUFTSyB8IFwNCi0gICBBRENfQVdEX0NSM19SRUdPRkZTRVQpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBudW1iZXIgMyAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBBRENfTExfRUNfQVdEX0NIQU5ORUxTICBBbmFsb2cgd2F0Y2hkb2cgLSBNb25pdG9yZWQgY2hhbm5lbHMNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfQURDX0FXRF9ESVNBQkxFIFwNCi0gICgweDAwMDAwMDAwVUwpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIGRpc2FibGVkICovDQotI2RlZmluZSBMTF9BRENfQVdEX0FMTF9DSEFOTkVMU19SRUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQVdEX0NSMjNfQ0hBTk5FTF9NQVNLIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFFTikgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgYWxsIGNoYW5uZWxzLCBcDQotICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovDQotI2RlZmluZSBMTF9BRENfQVdEX0FMTF9DSEFOTkVMU19JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0FXRF9DUjIzX0NIQU5ORUxfTUFTSyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgQURDX0NGR1JfSkFXRDFFTikgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgYWxsIGNoYW5uZWxzLCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydGVkIGJ5IGdyb3VwIGluamVjdGVkIG9ubHkgKi8NCi0jZGVmaW5lIExMX0FEQ19BV0RfQUxMX0NIQU5ORUxTX1JFR19JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19BV0RfQ1IyM19DSEFOTkVMX01BU0sgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgQURDX0NGR1JfQVdEMUVOKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBhbGwgY2hhbm5lbHMsIFwNCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZCBieSBlaXRoZXIgZ3JvdXAgcmVndWxhciBvciBpbmplY3RlZCAqLw0KLSNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzBfUkVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKChMTF9BRENfQ0hBTk5FTF8wICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9BV0QxRU4gfCAgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMCwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8NCi0jZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8wX0lOSiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoTExfQURDX0NIQU5ORUxfMCAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8ICAgICAgICAgIFwNCi0gICBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjAsIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgYnkgZ3JvdXAgaW5qZWN0ZWQgb25seSAqLw0KLSNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzBfUkVHX0lOSiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKChMTF9BRENfQ0hBTk5FTF8wICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFFTiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMCwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZCBieSBlaXRoZXIgZ3JvdXAgcmVndWxhciBvciBpbmplY3RlZCAqLw0KLSNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzFfUkVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKChMTF9BRENfQ0hBTk5FTF8xICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9BV0QxRU4gfCAgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMSwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8NCi0jZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xX0lOSiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoTExfQURDX0NIQU5ORUxfMSAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8ICAgICAgICAgIFwNCi0gICBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjEsIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgYnkgZ3JvdXAgaW5qZWN0ZWQgb25seSAqLw0KLSNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzFfUkVHX0lOSiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKChMTF9BRENfQ0hBTk5FTF8xICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFFTiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMSwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZCBieSBlaXRoZXIgZ3JvdXAgcmVndWxhciBvciBpbmplY3RlZCAqLw0KLSNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzJfUkVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKChMTF9BRENfQ0hBTk5FTF8yICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9BV0QxRU4gfCAgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMiwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8NCi0jZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8yX0lOSiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoTExfQURDX0NIQU5ORUxfMiAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8ICAgICAgICAgIFwNCi0gICBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjIsIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgYnkgZ3JvdXAgaW5qZWN0ZWQgb25seSAqLw0KLSNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzJfUkVHX0lOSiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKChMTF9BRENfQ0hBTk5FTF8yICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFFTiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMiwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZCBieSBlaXRoZXIgZ3JvdXAgcmVndWxhciBvciBpbmplY3RlZCAqLw0KLSNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzNfUkVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKChMTF9BRENfQ0hBTk5FTF8zICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9BV0QxRU4gfCAgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMywgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8NCi0jZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8zX0lOSiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoTExfQURDX0NIQU5ORUxfMyAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8ICAgICAgICAgIFwNCi0gICBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjMsIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgYnkgZ3JvdXAgaW5qZWN0ZWQgb25seSAqLw0KLSNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzNfUkVHX0lOSiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKChMTF9BRENfQ0hBTk5FTF8zICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFFTiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMywgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZCBieSBlaXRoZXIgZ3JvdXAgcmVndWxhciBvciBpbmplY3RlZCAqLw0KLSNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzRfUkVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKChMTF9BRENfQ0hBTk5FTF80ICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9BV0QxRU4gfCAgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lONCwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8NCi0jZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF80X0lOSiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoTExfQURDX0NIQU5ORUxfNCAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8ICAgICAgICAgIFwNCi0gICBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjQsIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgYnkgZ3JvdXAgaW5qZWN0ZWQgb25seSAqLw0KLSNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzRfUkVHX0lOSiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKChMTF9BRENfQ0hBTk5FTF80ICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFFTiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lONCwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZCBieSBlaXRoZXIgZ3JvdXAgcmVndWxhciBvciBpbmplY3RlZCAqLw0KLSNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzVfUkVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKChMTF9BRENfQ0hBTk5FTF81ICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9BV0QxRU4gfCAgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lONSwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8NCi0jZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF81X0lOSiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoTExfQURDX0NIQU5ORUxfNSAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8ICAgICAgICAgIFwNCi0gICBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjUsIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgYnkgZ3JvdXAgaW5qZWN0ZWQgb25seSAqLw0KLSNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzVfUkVHX0lOSiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKChMTF9BRENfQ0hBTk5FTF81ICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFFTiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lONSwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZCBieSBlaXRoZXIgZ3JvdXAgcmVndWxhciBvciBpbmplY3RlZCAqLw0KLSNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzZfUkVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKChMTF9BRENfQ0hBTk5FTF82ICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9BV0QxRU4gfCAgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lONiwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8NCi0jZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF82X0lOSiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoTExfQURDX0NIQU5ORUxfNiAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8ICAgICAgICAgIFwNCi0gICBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjYsIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgYnkgZ3JvdXAgaW5qZWN0ZWQgb25seSAqLw0KLSNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzZfUkVHX0lOSiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKChMTF9BRENfQ0hBTk5FTF82ICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFFTiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lONiwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZCBieSBlaXRoZXIgZ3JvdXAgcmVndWxhciBvciBpbmplY3RlZCAqLw0KLSNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzdfUkVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKChMTF9BRENfQ0hBTk5FTF83ICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9BV0QxRU4gfCAgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lONywgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8NCi0jZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF83X0lOSiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoTExfQURDX0NIQU5ORUxfNyAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8ICAgICAgICAgIFwNCi0gICBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjcsIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgYnkgZ3JvdXAgaW5qZWN0ZWQgb25seSAqLw0KLSNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzdfUkVHX0lOSiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKChMTF9BRENfQ0hBTk5FTF83ICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFFTiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lONywgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZCBieSBlaXRoZXIgZ3JvdXAgcmVndWxhciBvciBpbmplY3RlZCAqLw0KLSNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzhfUkVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKChMTF9BRENfQ0hBTk5FTF84ICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9BV0QxRU4gfCAgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOOCwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8NCi0jZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF84X0lOSiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoTExfQURDX0NIQU5ORUxfOCAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8ICAgICAgICAgIFwNCi0gICBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjgsIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgYnkgZ3JvdXAgaW5qZWN0ZWQgb25seSAqLw0KLSNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzhfUkVHX0lOSiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKChMTF9BRENfQ0hBTk5FTF84ICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFFTiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOOCwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZCBieSBlaXRoZXIgZ3JvdXAgcmVndWxhciBvciBpbmplY3RlZCAqLw0KLSNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzlfUkVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKChMTF9BRENfQ0hBTk5FTF85ICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9BV0QxRU4gfCAgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOOSwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8NCi0jZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF85X0lOSiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoTExfQURDX0NIQU5ORUxfOSAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8ICAgICAgICAgIFwNCi0gICBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjksIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgYnkgZ3JvdXAgaW5qZWN0ZWQgb25seSAqLw0KLSNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzlfUkVHX0lOSiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKChMTF9BRENfQ0hBTk5FTF85ICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFFTiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOOSwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZCBieSBlaXRoZXIgZ3JvdXAgcmVndWxhciBvciBpbmplY3RlZCAqLw0KLSNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzEwX1JFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoTExfQURDX0NIQU5ORUxfMTAgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0FXRDFFTiB8ICAgICAgICAgICBcDQotICAgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMTAsIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovDQotI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfMTBfSU5KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKChMTF9BRENfQ0hBTk5FTF8xMCAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8ICAgICAgICAgIFwNCi0gICBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xMCwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZCBieSBncm91cCBpbmplY3RlZCBvbmx5ICovDQotI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfMTBfUkVHX0lOSiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKChMTF9BRENfQ0hBTk5FTF8xMCAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8ICAgICAgICAgIFwNCi0gICBBRENfQ0ZHUl9BV0QxRU4gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMTAsIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgYnkgZWl0aGVyIGdyb3VwIHJlZ3VsYXIgb3IgaW5qZWN0ZWQgKi8NCi0jZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xMV9SRUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKExMX0FEQ19DSEFOTkVMXzExICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9BV0QxRU4gfCAgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjExLCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydGVkIGJ5IGdyb3VwIHJlZ3VsYXIgb25seSAqLw0KLSNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzExX0lOSiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoTExfQURDX0NIQU5ORUxfMTEgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gfCAgICAgICAgICBcDQotICAgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMTEsIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgYnkgZ3JvdXAgaW5qZWN0ZWQgb25seSAqLw0KLSNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzExX1JFR19JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoTExfQURDX0NIQU5ORUxfMTEgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gfCAgICAgICAgICBcDQotICAgQURDX0NGR1JfQVdEMUVOIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjExLCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovDQotI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfMTJfUkVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKChMTF9BRENfQ0hBTk5FTF8xMiAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfQVdEMUVOIHwgICAgICAgICAgIFwNCi0gICBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xMiwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8NCi0jZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xMl9JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKExMX0FEQ19DSEFOTkVMXzEyICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjEyLCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydGVkIGJ5IGdyb3VwIGluamVjdGVkIG9ubHkgKi8NCi0jZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xMl9SRUdfSU5KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKExMX0FEQ19DSEFOTkVMXzEyICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFFTiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xMiwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZCBieSBlaXRoZXIgZ3JvdXAgcmVndWxhciBvciBpbmplY3RlZCAqLw0KLSNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzEzX1JFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoTExfQURDX0NIQU5ORUxfMTMgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0FXRDFFTiB8ICAgICAgICAgICBcDQotICAgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMTMsIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovDQotI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfMTNfSU5KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKChMTF9BRENfQ0hBTk5FTF8xMyAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8ICAgICAgICAgIFwNCi0gICBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xMywgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZCBieSBncm91cCBpbmplY3RlZCBvbmx5ICovDQotI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfMTNfUkVHX0lOSiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKChMTF9BRENfQ0hBTk5FTF8xMyAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8ICAgICAgICAgIFwNCi0gICBBRENfQ0ZHUl9BV0QxRU4gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMTMsIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgYnkgZWl0aGVyIGdyb3VwIHJlZ3VsYXIgb3IgaW5qZWN0ZWQgKi8NCi0jZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xNF9SRUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKExMX0FEQ19DSEFOTkVMXzE0ICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9BV0QxRU4gfCAgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjE0LCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydGVkIGJ5IGdyb3VwIHJlZ3VsYXIgb25seSAqLw0KLSNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzE0X0lOSiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoTExfQURDX0NIQU5ORUxfMTQgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gfCAgICAgICAgICBcDQotICAgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMTQsIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgYnkgZ3JvdXAgaW5qZWN0ZWQgb25seSAqLw0KLSNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzE0X1JFR19JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoTExfQURDX0NIQU5ORUxfMTQgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gfCAgICAgICAgICBcDQotICAgQURDX0NGR1JfQVdEMUVOIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjE0LCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovDQotI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfMTVfUkVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKChMTF9BRENfQ0hBTk5FTF8xNSAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfQVdEMUVOIHwgICAgICAgICAgIFwNCi0gICBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xNSwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8NCi0jZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xNV9JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKExMX0FEQ19DSEFOTkVMXzE1ICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjE1LCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydGVkIGJ5IGdyb3VwIGluamVjdGVkIG9ubHkgKi8NCi0jZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xNV9SRUdfSU5KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKExMX0FEQ19DSEFOTkVMXzE1ICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFFTiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xNSwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZCBieSBlaXRoZXIgZ3JvdXAgcmVndWxhciBvciBpbmplY3RlZCAqLw0KLSNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzE2X1JFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoTExfQURDX0NIQU5ORUxfMTYgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0FXRDFFTiB8ICAgICAgICAgICBcDQotICAgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMTYsIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovDQotI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfMTZfSU5KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKChMTF9BRENfQ0hBTk5FTF8xNiAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8ICAgICAgICAgIFwNCi0gICBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xNiwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZCBieSBncm91cCBpbmplY3RlZCBvbmx5ICovDQotI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfMTZfUkVHX0lOSiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKChMTF9BRENfQ0hBTk5FTF8xNiAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8ICAgICAgICAgIFwNCi0gICBBRENfQ0ZHUl9BV0QxRU4gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMTYsIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgYnkgZWl0aGVyIGdyb3VwIHJlZ3VsYXIgb3IgaW5qZWN0ZWQgKi8NCi0jZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xN19SRUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKExMX0FEQ19DSEFOTkVMXzE3ICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9BV0QxRU4gfCAgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjE3LCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydGVkIGJ5IGdyb3VwIHJlZ3VsYXIgb25seSAqLw0KLSNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzE3X0lOSiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoTExfQURDX0NIQU5ORUxfMTcgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gfCAgICAgICAgICBcDQotICAgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMTcsIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgYnkgZ3JvdXAgaW5qZWN0ZWQgb25seSAqLw0KLSNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzE3X1JFR19JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoTExfQURDX0NIQU5ORUxfMTcgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gfCAgICAgICAgICBcDQotICAgQURDX0NGR1JfQVdEMUVOIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjE3LCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovDQotI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfMThfUkVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKChMTF9BRENfQ0hBTk5FTF8xOCAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfQVdEMUVOIHwgICAgICAgICAgIFwNCi0gICBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xOCwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8NCi0jZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xOF9JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKExMX0FEQ19DSEFOTkVMXzE4ICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjE4LCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydGVkIGJ5IGdyb3VwIGluamVjdGVkIG9ubHkgKi8NCi0jZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xOF9SRUdfSU5KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKExMX0FEQ19DSEFOTkVMXzE4ICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFFTiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xOCwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZCBieSBlaXRoZXIgZ3JvdXAgcmVndWxhciBvciBpbmplY3RlZCAqLw0KLSNkZWZpbmUgTExfQURDX0FXRF9DSF9WUkVGSU5UX1JFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0FXRDFFTiB8ICAgIFwNCi0gICBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgaW50ZXJuYWwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgY29ubmVjdGVkIHRvIFZyZWZJbnQ6IEludGVybmFsIHZvbHRhZ2UgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlLCBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovDQotI2RlZmluZSBMTF9BRENfQVdEX0NIX1ZSRUZJTlRfSU5KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoTExfQURDX0NIQU5ORUxfVlJFRklOVCAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8ICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBpbnRlcm5hbCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCBjb25uZWN0ZWQgdG8gVnJlZkludDogSW50ZXJuYWwgdm9sdGFnZSAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2UsIGNvbnZlcnRlZCBieSBncm91cCBpbmplY3RlZCBvbmx5ICovDQotI2RlZmluZSBMTF9BRENfQVdEX0NIX1ZSRUZJTlRfUkVHX0lOSiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoTExfQURDX0NIQU5ORUxfVlJFRklOVCAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8ICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFFTiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGludGVybmFsIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsIGNvbm5lY3RlZCB0byBWcmVmSW50OiBJbnRlcm5hbCB2b2x0YWdlICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZSwgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgaW5qZWN0ZWQgKi8NCi0jZGVmaW5lIExMX0FEQ19BV0RfQ0hfVEVNUFNFTlNPUl9BREMxX1JFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1JfQURDMSAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfQVdEMUVOIHwgXA0KLSAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQzEgaW50ZXJuYWwgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsIGNvbm5lY3RlZCB0byBUZW1wZXJhdHVyZSBzZW5zb3IsIGNvbnZlcnRlZCBieSBcDQotICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgcmVndWxhciBvbmx5ICovDQotI2RlZmluZSBMTF9BRENfQVdEX0NIX1RFTVBTRU5TT1JfQURDMV9JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUl9BREMxICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgXA0KLSAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQzEgaW50ZXJuYWwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCBjb25uZWN0ZWQgdG8gVGVtcGVyYXR1cmUgc2Vuc29yLCBjb252ZXJ0ZWQgYnkgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBncm91cCBpbmplY3RlZCBvbmx5ICovDQotI2RlZmluZSBMTF9BRENfQVdEX0NIX1RFTVBTRU5TT1JfQURDMV9SRUdfSU5KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUl9BREMxICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgXA0KLSAgIEFEQ19DRkdSX0FXRDFFTiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDMSBpbnRlcm5hbCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsIGNvbm5lY3RlZCB0byBUZW1wZXJhdHVyZSBzZW5zb3IsIGNvbnZlcnRlZCBieSAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovDQotI2RlZmluZSBMTF9BRENfQVdEX0NIX1RFTVBTRU5TT1JfQURDNV9SRUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKChMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SX0FEQzUgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0FXRDFFTiB8IFwNCi0gICBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREM1IGludGVybmFsICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCBjb25uZWN0ZWQgdG8gVGVtcGVyYXR1cmUgc2Vuc29yLCBjb252ZXJ0ZWQgYnkgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwIHJlZ3VsYXIgb25seSAqLw0KLSNkZWZpbmUgTExfQURDX0FXRF9DSF9URU1QU0VOU09SX0FEQzVfSU5KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1JfQURDNSAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8IFwNCi0gICBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREM1IGludGVybmFsICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgY29ubmVjdGVkIHRvIFRlbXBlcmF0dXJlIHNlbnNvciwgY29udmVydGVkIGJ5ICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgaW5qZWN0ZWQgb25seSAqLw0KLSNkZWZpbmUgTExfQURDX0FXRF9DSF9URU1QU0VOU09SX0FEQzVfUkVHX0lOSiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1JfQURDNSAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8IFwNCi0gICBBRENfQ0ZHUl9BV0QxRU4gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQzUgaW50ZXJuYWwgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCBjb25uZWN0ZWQgdG8gVGVtcGVyYXR1cmUgc2Vuc29yLCBjb252ZXJ0ZWQgYnkgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBlaXRoZXIgZ3JvdXAgcmVndWxhciBvciBpbmplY3RlZCAqLw0KLSNkZWZpbmUgTExfQURDX0FXRF9DSF9WQkFUX1JFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKExMX0FEQ19DSEFOTkVMX1ZCQVQgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0FXRDFFTiB8ICAgICAgICAgICAgIFwNCi0gICBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgaW50ZXJuYWwgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgY29ubmVjdGVkIHRvIFZiYXQvMzogVmJhdCB2b2x0YWdlIHRocm91Z2ggYSAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgZGl2aWRlciBsYWRkZXIgb2YgZmFjdG9yIDEvMyB0byBoYXZlIFZiYXQgYWx3YXlzIGJlbG93IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBWZGRhLCBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovDQotI2RlZmluZSBMTF9BRENfQVdEX0NIX1ZCQVRfSU5KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoTExfQURDX0NIQU5ORUxfVkJBVCAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8ICAgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBpbnRlcm5hbCAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCBjb25uZWN0ZWQgdG8gVmJhdC8zOiBWYmF0IHZvbHRhZ2UgdGhyb3VnaCBhICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBkaXZpZGVyIGxhZGRlciBvZiBmYWN0b3IgMS8zIHRvIGhhdmUgVmJhdCBhbHdheXMgYmVsb3cgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIFZkZGEsIGNvbnZlcnRlZCBieSBncm91cCBpbmplY3RlZCBvbmx5ICovDQotI2RlZmluZSBMTF9BRENfQVdEX0NIX1ZCQVRfUkVHX0lOSiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoTExfQURDX0NIQU5ORUxfVkJBVCAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8ICAgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFFTiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGludGVybmFsICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsIGNvbm5lY3RlZCB0byBWYmF0LzM6IFZiYXQgdm9sdGFnZSB0aHJvdWdoIGEgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRpdmlkZXIgbGFkZGVyIG9mIGZhY3RvciAxLzMgdG8gaGF2ZSBWYmF0IGFsd2F5cyBiZWxvdyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgVmRkYSAqLw0KLSNkZWZpbmUgTExfQURDX0FXRF9DSF9WT1BBTVAxX1JFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKChMTF9BRENfQ0hBTk5FTF9WT1BBTVAxICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9BV0QxRU4gfCAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBpbnRlcm5hbCAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgY29ubmVjdGVkIHRvIE9QQU1QMSBvdXRwdXQsIGNoYW5uZWwgc3BlY2lmaWMgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRvIEFEQzEsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8NCi0jZGVmaW5lIExMX0FEQ19BV0RfQ0hfVk9QQU1QMV9JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoTExfQURDX0NIQU5ORUxfVk9QQU1QMSAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8ICAgICAgIFwNCi0gICBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgaW50ZXJuYWwgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsIGNvbm5lY3RlZCB0byBPUEFNUDEgb3V0cHV0LCBjaGFubmVsIHNwZWNpZmljIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICB0byBBREMxLCBjb252ZXJ0ZWQgYnkgZ3JvdXAgaW5qZWN0ZWQgb25seSAqLw0KLSNkZWZpbmUgTExfQURDX0FXRF9DSF9WT1BBTVAxX1JFR19JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKExMX0FEQ19DSEFOTkVMX1ZPUEFNUDEgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gfCAgICAgICAgIFwNCi0gICBBRENfQ0ZHUl9BV0QxRU4gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBpbnRlcm5hbCAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCBjb25uZWN0ZWQgdG8gT1BBTVAxIG91dHB1dCwgY2hhbm5lbCBzcGVjaWZpYyAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICB0byBBREMxLCBjb252ZXJ0ZWQgYnkgZWl0aGVyIGdyb3VwIHJlZ3VsYXIgb3IgaW5qZWN0ZWQgXA0KLSAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfQURDX0FXRF9DSF9WT1BBTVAyX1JFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKChMTF9BRENfQ0hBTk5FTF9WT1BBTVAyICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9BV0QxRU4gfCAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBpbnRlcm5hbCAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgY29ubmVjdGVkIHRvIE9QQU1QMiBvdXRwdXQsIGNoYW5uZWwgc3BlY2lmaWMgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRvIEFEQzIsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8NCi0jZGVmaW5lIExMX0FEQ19BV0RfQ0hfVk9QQU1QMl9JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoTExfQURDX0NIQU5ORUxfVk9QQU1QMiAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8ICAgICAgIFwNCi0gICBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgaW50ZXJuYWwgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsIGNvbm5lY3RlZCB0byBPUEFNUDIgb3V0cHV0LCBjaGFubmVsIHNwZWNpZmljIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICB0byBBREMyLCBjb252ZXJ0ZWQgYnkgZ3JvdXAgaW5qZWN0ZWQgb25seSAqLw0KLSNkZWZpbmUgTExfQURDX0FXRF9DSF9WT1BBTVAyX1JFR19JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKExMX0FEQ19DSEFOTkVMX1ZPUEFNUDIgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gfCAgICAgICAgIFwNCi0gICBBRENfQ0ZHUl9BV0QxRU4gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBpbnRlcm5hbCAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCBjb25uZWN0ZWQgdG8gT1BBTVAyIG91dHB1dCwgY2hhbm5lbCBzcGVjaWZpYyAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICB0byBBREMyLCBjb252ZXJ0ZWQgYnkgZWl0aGVyIGdyb3VwIHJlZ3VsYXIgb3IgaW5qZWN0ZWQgXA0KLSAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfQURDX0FXRF9DSF9WT1BBTVAzX0FEQzJfUkVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKChMTF9BRENfQ0hBTk5FTF9WT1BBTVAzX0FEQzIgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0FXRDFFTiB8ICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBpbnRlcm5hbCAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgY29ubmVjdGVkIHRvIE9QQU1QMyBvdXRwdXQsIGNoYW5uZWwgc3BlY2lmaWMgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRvIEFEQzIsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8NCi0jZGVmaW5lIExMX0FEQ19BV0RfQ0hfVk9QQU1QM19BREMyX0lOSiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoTExfQURDX0NIQU5ORUxfVk9QQU1QM19BREMyICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgIFwNCi0gICBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgaW50ZXJuYWwgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsIGNvbm5lY3RlZCB0byBPUEFNUDMgb3V0cHV0LCBjaGFubmVsIHNwZWNpZmljIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICB0byBBREMyLCBjb252ZXJ0ZWQgYnkgZ3JvdXAgaW5qZWN0ZWQgb25seSAqLw0KLSNkZWZpbmUgTExfQURDX0FXRF9DSF9WT1BBTVAzX0FEQzJfUkVHX0lOSiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKExMX0FEQ19DSEFOTkVMX1ZPUEFNUDNfQURDMiAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8ICAgIFwNCi0gICBBRENfQ0ZHUl9BV0QxRU4gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBpbnRlcm5hbCAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCBjb25uZWN0ZWQgdG8gT1BBTVAzIG91dHB1dCwgY2hhbm5lbCBzcGVjaWZpYyAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICB0byBBREMyLCBjb252ZXJ0ZWQgYnkgZWl0aGVyIGdyb3VwIHJlZ3VsYXIgb3IgaW5qZWN0ZWQgXA0KLSAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfQURDX0FXRF9DSF9WT1BBTVAzX0FEQzNfUkVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKChMTF9BRENfQ0hBTk5FTF9WT1BBTVAzX0FEQzMgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0FXRDFFTiB8ICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBpbnRlcm5hbCAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgY29ubmVjdGVkIHRvIE9QQU1QMyBvdXRwdXQsIGNoYW5uZWwgc3BlY2lmaWMgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRvIEFEQzMsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8NCi0jZGVmaW5lIExMX0FEQ19BV0RfQ0hfVk9QQU1QM19BREMzX0lOSiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoTExfQURDX0NIQU5ORUxfVk9QQU1QM19BREMzICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgIFwNCi0gICBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgaW50ZXJuYWwgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsIGNvbm5lY3RlZCB0byBPUEFNUDMgb3V0cHV0LCBjaGFubmVsIHNwZWNpZmljIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICB0byBBREMzLCBjb252ZXJ0ZWQgYnkgZ3JvdXAgaW5qZWN0ZWQgb25seSAqLw0KLSNkZWZpbmUgTExfQURDX0FXRF9DSF9WT1BBTVAzX0FEQzNfUkVHX0lOSiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKExMX0FEQ19DSEFOTkVMX1ZPUEFNUDNfQURDMyAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8ICAgIFwNCi0gICBBRENfQ0ZHUl9BV0QxRU4gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBpbnRlcm5hbCAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCBjb25uZWN0ZWQgdG8gT1BBTVAzIG91dHB1dCwgY2hhbm5lbCBzcGVjaWZpYyAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICB0byBBREMzLCBjb252ZXJ0ZWQgYnkgZWl0aGVyIGdyb3VwIHJlZ3VsYXIgb3IgaW5qZWN0ZWQgXA0KLSAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfQURDX0FXRF9DSF9WT1BBTVA0X1JFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKChMTF9BRENfQ0hBTk5FTF9WT1BBTVA0ICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9BV0QxRU4gfCAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBpbnRlcm5hbCAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgY29ubmVjdGVkIHRvIE9QQU1QNCBvdXRwdXQsIGNoYW5uZWwgc3BlY2lmaWMgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRvIEFEQzUsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8NCi0jZGVmaW5lIExMX0FEQ19BV0RfQ0hfVk9QQU1QNF9JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoTExfQURDX0NIQU5ORUxfVk9QQU1QNCAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8ICAgICAgIFwNCi0gICBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgaW50ZXJuYWwgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsIGNvbm5lY3RlZCB0byBPUEFNUDQgb3V0cHV0LCBjaGFubmVsIHNwZWNpZmljIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICB0byBBREM1LCBjb252ZXJ0ZWQgYnkgZ3JvdXAgaW5qZWN0ZWQgb25seSAqLw0KLSNkZWZpbmUgTExfQURDX0FXRF9DSF9WT1BBTVA0X1JFR19JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKExMX0FEQ19DSEFOTkVMX1ZPUEFNUDQgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gfCAgICAgICAgIFwNCi0gICBBRENfQ0ZHUl9BV0QxRU4gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBpbnRlcm5hbCAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCBjb25uZWN0ZWQgdG8gT1BBTVA0IG91dHB1dCwgY2hhbm5lbCBzcGVjaWZpYyAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICB0byBBREM1LCBjb252ZXJ0ZWQgYnkgZWl0aGVyIGdyb3VwIHJlZ3VsYXIgb3IgaW5qZWN0ZWQgXA0KLSAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfQURDX0FXRF9DSF9WT1BBTVA1X1JFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKChMTF9BRENfQ0hBTk5FTF9WT1BBTVA1ICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9BV0QxRU4gfCAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBpbnRlcm5hbCAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgY29ubmVjdGVkIHRvIE9QQU1QNSBvdXRwdXQsIGNoYW5uZWwgc3BlY2lmaWMgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRvIEFEQzUsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8NCi0jZGVmaW5lIExMX0FEQ19BV0RfQ0hfVk9QQU1QNV9JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoTExfQURDX0NIQU5ORUxfVk9QQU1QNSAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8ICAgICAgIFwNCi0gICBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgaW50ZXJuYWwgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsIGNvbm5lY3RlZCB0byBPUEFNUDUgb3V0cHV0LCBjaGFubmVsIHNwZWNpZmljIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICB0byBBREM1LCBjb252ZXJ0ZWQgYnkgZ3JvdXAgaW5qZWN0ZWQgb25seSAqLw0KLSNkZWZpbmUgTExfQURDX0FXRF9DSF9WT1BBTVA1X1JFR19JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKExMX0FEQ19DSEFOTkVMX1ZPUEFNUDUgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gfCAgICAgICAgIFwNCi0gICBBRENfQ0ZHUl9BV0QxRU4gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBpbnRlcm5hbCAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCBjb25uZWN0ZWQgdG8gT1BBTVA1IG91dHB1dCwgY2hhbm5lbCBzcGVjaWZpYyAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICB0byBBREM1LCBjb252ZXJ0ZWQgYnkgZWl0aGVyIGdyb3VwIHJlZ3VsYXIgb3IgaW5qZWN0ZWQgXA0KLSAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfQURDX0FXRF9DSF9WT1BBTVA2X1JFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKChMTF9BRENfQ0hBTk5FTF9WT1BBTVA2ICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9BV0QxRU4gfCAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBpbnRlcm5hbCAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgY29ubmVjdGVkIHRvIE9QQU1QNiBvdXRwdXQsIGNoYW5uZWwgc3BlY2lmaWMgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRvIEFEQzQsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8NCi0jZGVmaW5lIExMX0FEQ19BV0RfQ0hfVk9QQU1QNl9JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoTExfQURDX0NIQU5ORUxfVk9QQU1QNiAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8ICAgICAgIFwNCi0gICBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgaW50ZXJuYWwgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsIGNvbm5lY3RlZCB0byBPUEFNUDYgb3V0cHV0LCBjaGFubmVsIHNwZWNpZmljIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICB0byBBREM0LCBjb252ZXJ0ZWQgYnkgZ3JvdXAgaW5qZWN0ZWQgb25seSAqLw0KLSNkZWZpbmUgTExfQURDX0FXRF9DSF9WT1BBTVA2X1JFR19JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKExMX0FEQ19DSEFOTkVMX1ZPUEFNUDYgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gfCAgICAgICAgIFwNCi0gICBBRENfQ0ZHUl9BV0QxRU4gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBpbnRlcm5hbCAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCBjb25uZWN0ZWQgdG8gT1BBTVA2IG91dHB1dCwgY2hhbm5lbCBzcGVjaWZpYyAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICB0byBBREM0LCBjb252ZXJ0ZWQgYnkgZWl0aGVyIGdyb3VwIHJlZ3VsYXIgb3IgaW5qZWN0ZWQgXA0KLSAgICAgICAgICAgICAgICAgICAgICAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBBRENfTExfRUNfQVdEX1RIUkVTSE9MRFMgIEFuYWxvZyB3YXRjaGRvZyAtIFRocmVzaG9sZHMNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfQURDX0FXRF9USFJFU0hPTERfSElHSCBcDQotICAoQURDX1RSMV9IVDEpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyB0aHJlc2hvbGQgaGlnaCAqLw0KLSNkZWZpbmUgTExfQURDX0FXRF9USFJFU0hPTERfTE9XIFwNCi0gIChBRENfVFIxX0xUMSkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZCBsb3cgKi8NCi0jZGVmaW5lIExMX0FEQ19BV0RfVEhSRVNIT0xEU19ISUdIX0xPVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19UUjFfSFQxIHwgQURDX1RSMV9MVDEpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBib3RoIHRocmVzaG9sZHMgaGlnaCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGxvdyBjb25jYXRlbmF0ZWQgaW50byB0aGUgc2FtZSBkYXRhICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19BV0RfRklMVEVSSU5HX0NPTkZJRyAgQW5hbG9nIHdhdGNoZG9nIC0gZmlsdGVyaW5nIGNvbmZpZw0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9BRENfQVdEX0ZJTFRFUklOR19OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgweDAwMDAwMDAwVUwpIC8qITwgQURDIGFuYWxvZyB3YXRoZG9nIG5vIGZpbHRlcmluZywgb25lIG91dC1vZi13aW5kb3cgXA0KLSAgICAgICAgICAgICAgICAgICAgc2FtcGxlIGlzIG5lZWRlZCB0byByYWlzZSBmbGFnIG9yIGludGVycnVwdCAqLw0KLSNkZWZpbmUgTExfQURDX0FXRF9GSUxURVJJTkdfMlNBTVBMRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfVFIxX0FXREZJTFRfMCkgLyohPCBBREMgYW5hbG9nIHdhdGhkb2cgMiBjb25zZWN1dGl2ZXMgb3V0LW9mLXdpbmRvdyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMgYXJlIG5lZWRlZCB0byByYWlzZSBmbGFnIG9yIGludGVycnVwdCAqLw0KLSNkZWZpbmUgTExfQURDX0FXRF9GSUxURVJJTkdfM1NBTVBMRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfVFIxX0FXREZJTFRfMSkgLyohPCBBREMgYW5hbG9nIHdhdGhkb2cgMyBjb25zZWN1dGl2ZXMgb3V0LW9mLXdpbmRvdyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMgYXJlIG5lZWRlZCB0byByYWlzZSBmbGFnIG9yIGludGVycnVwdCAqLw0KLSNkZWZpbmUgTExfQURDX0FXRF9GSUxURVJJTkdfNFNBTVBMRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfVFIxX0FXREZJTFRfMSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgQURDX1RSMV9BV0RGSUxUXzApIC8qITwgQURDIGFuYWxvZyB3YXRoZG9nIDQgY29uc2VjdXRpdmVzIG91dC1vZi13aW5kb3cgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzIGFyZSBuZWVkZWQgdG8gcmFpc2UgZmxhZyBvciBpbnRlcnJ1cHQgKi8NCi0jZGVmaW5lIExMX0FEQ19BV0RfRklMVEVSSU5HXzVTQU1QTEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX1RSMV9BV0RGSUxUXzIpIC8qITwgQURDIGFuYWxvZyB3YXRoZG9nIDUgY29uc2VjdXRpdmVzIG91dC1vZi13aW5kb3cgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzIGFyZSBuZWVkZWQgdG8gcmFpc2UgZmxhZyBvciBpbnRlcnJ1cHQgKi8NCi0jZGVmaW5lIExMX0FEQ19BV0RfRklMVEVSSU5HXzZTQU1QTEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX1RSMV9BV0RGSUxUXzIgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19UUjFfQVdERklMVF8wKSAvKiE8IEFEQyBhbmFsb2cgd2F0aGRvZyA2IGNvbnNlY3V0aXZlcyBvdXQtb2Ytd2luZG93IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcyBhcmUgbmVlZGVkIHRvIHJhaXNlIGZsYWcgb3IgaW50ZXJydXB0ICovDQotI2RlZmluZSBMTF9BRENfQVdEX0ZJTFRFUklOR183U0FNUExFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19UUjFfQVdERklMVF8yIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBBRENfVFIxX0FXREZJTFRfMSkgLyohPCBBREMgYW5hbG9nIHdhdGhkb2cgNyBjb25zZWN1dGl2ZXMgb3V0LW9mLXdpbmRvdyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMgYXJlIG5lZWRlZCB0byByYWlzZSBmbGFnIG9yIGludGVycnVwdCAqLw0KLSNkZWZpbmUgTExfQURDX0FXRF9GSUxURVJJTkdfOFNBTVBMRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfVFIxX0FXREZJTFRfMiB8IEFEQ19UUjFfQVdERklMVF8xIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgQURDX1RSMV9BV0RGSUxUXzApIC8qITwgQURDIGFuYWxvZyB3YXRoZG9nIDggY29uc2VjdXRpdmVzIG91dC1vZi13aW5kb3cgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzIGFyZSBuZWVkZWQgdG8gcmFpc2UgZmxhZyBvciBpbnRlcnJ1cHQgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX09WU19TQ09QRSAgT3ZlcnNhbXBsaW5nIC0gT3ZlcnNhbXBsaW5nIHNjb3BlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX0FEQ19PVlNfRElTQUJMRSAoMHgwMDAwMDAwMFVMKSAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgZGlzYWJsZWQuICovDQotI2RlZmluZSBMTF9BRENfT1ZTX0dSUF9SRUdVTEFSX0NPTlRJTlVFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0ZHUjJfUk9WU0UpIC8qITwgQURDIG92ZXJzYW1wbGluZyBvbiBjb252ZXJzaW9ucyBvZiBBREMgZ3JvdXAgcmVndWxhci4gXA0KLSAgICAgICAgICAgICAgICAgICAgICAgSWYgZ3JvdXAgaW5qZWN0ZWQgaW50ZXJydXB0cyBncm91cCByZWd1bGFyOiB3aGVuIEFEQyAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICBncm91cCBpbmplY3RlZCBpcyB0cmlnZ2VyZWQsIHRoZSBvdmVyc2FtcGxpbmcgb24gQURDICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgIGdyb3VwIHJlZ3VsYXIgaXMgdGVtcG9yYXJ5IHN0b3BwZWQgYW5kIGNvbnRpbnVlZCAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJ3YXJkcy4gKi8NCi0jZGVmaW5lIExMX0FEQ19PVlNfR1JQX1JFR1VMQVJfUkVTVU1FRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19DRkdSMl9ST1ZTTSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgQURDX0NGR1IyX1JPVlNFKSAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgb24gY29udmVyc2lvbnMgb2YgQURDIGdyb3VwIHJlZ3VsYXIuIFwNCi0gICAgICAgICAgICAgICAgICAgICAgIElmIGdyb3VwIGluamVjdGVkIGludGVycnVwdHMgZ3JvdXAgcmVndWxhcjogd2hlbiBBREMgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgaW5qZWN0ZWQgaXMgdHJpZ2dlcmVkLCB0aGUgb3ZlcnNhbXBsaW5nIG9uIEFEQyAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICBncm91cCByZWd1bGFyIGlzIHJlc3VtZWQgZnJvbSBzdGFydCAob3ZlcnNhbXBsZXIgYnVmZmVyIFwNCi0gICAgICAgICAgICAgICAgICAgICAgIHJlc2V0KS4gKi8NCi0jZGVmaW5lIExMX0FEQ19PVlNfR1JQX0lOSkVDVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19DRkdSMl9KT1ZTRSkgLyohPCBBREMgb3ZlcnNhbXBsaW5nIG9uIGNvbnZlcnNpb25zIG9mIEFEQyBncm91cCBcDQotICAgICAgICAgICAgICAgICAgICAgICBpbmplY3RlZC4gKi8NCi0jZGVmaW5lIExMX0FEQ19PVlNfR1JQX0lOSl9SRUdfUkVTVU1FRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0ZHUjJfSk9WU0UgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBBRENfQ0ZHUjJfUk9WU0UpIC8qITwgQURDIG92ZXJzYW1wbGluZyBvbiBjb252ZXJzaW9ucyBvZiBib3RoIEFEQyBncm91cHMgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgIHJlZ3VsYXIgYW5kIGluamVjdGVkLiBJZiBncm91cCBpbmplY3RlZCBpbnRlcnJ1cHRpbmcgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgIGdyb3VwIHJlZ3VsYXI6IHdoZW4gQURDIGdyb3VwIGluamVjdGVkIGlzIHRyaWdnZXJlZCwgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZSBvdmVyc2FtcGxpbmcgb24gQURDIGdyb3VwIHJlZ3VsYXIgaXMgcmVzdW1lZCBmcm9tIFwNCi0gICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0IChvdmVyc2FtcGxlciBidWZmZXIgcmVzZXQpLiAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBBRENfTExfRUNfT1ZTX0RJU0NPTlRfTU9ERSAgT3ZlcnNhbXBsaW5nIC0gRGlzY29udGludW91cyBtb2RlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX0FEQ19PVlNfUkVHX0NPTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoMHgwMDAwMDAwMFVMKSAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgZGlzY29udGludW91cyBtb2RlOiBjb250aW51b3VzIG1vZGUgXA0KLSAgICAgICAgICAgICAgICAgICAgKGFsbCBjb252ZXJzaW9ucyBvZiBvdmVyc2FtcGxpbmcgcmF0aW8gYXJlIGRvbmUgZnJvbSAxIFwNCi0gICAgICAgICAgICAgICAgICAgIHRyaWdnZXIpICovDQotI2RlZmluZSBMTF9BRENfT1ZTX1JFR19ESVNDT05UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0ZHUjJfVFJPVlMpIC8qITwgQURDIG92ZXJzYW1wbGluZyBkaXNjb250aW51b3VzIG1vZGU6IGRpc2NvbnRpbnVvdXMgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgbW9kZSAoZWFjaCBjb252ZXJzaW9uIG9mIG92ZXJzYW1wbGluZyByYXRpbyBuZWVkcyBhICBcDQotICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyKSAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBBRENfTExfRUNfT1ZTX1JBVElPICBPdmVyc2FtcGxpbmcgLSBSYXRpbw0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9BRENfT1ZTX1JBVElPXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgweDAwMDAwMDAwVUwpIC8qITwgQURDIG92ZXJzYW1wbGluZyByYXRpbyBvZiAyICgyIEFEQyBjb252ZXJzaW9ucyBhcmUgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgcGVyZm9ybWVkLCBzdW0gb2YgdGhlc2UgY29udmVyc2lvbnMgZGF0YSBpcyBjb21wdXRlZCB0byBcDQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgYXMgdGhlIEFEQyBvdmVyc2FtcGxpbmcgY29udmVyc2lvbiBkYXRhIChiZWZvcmUgIFwNCi0gICAgICAgICAgICAgICAgICAgIHBvdGVudGlhbCBzaGlmdCkgKi8NCi0jZGVmaW5lIExMX0FEQ19PVlNfUkFUSU9fNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0ZHUjJfT1ZTUl8wKSAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgcmF0aW8gb2YgNCAoNCBBREMgY29udmVyc2lvbnMgYXJlIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtZWQsIHN1bSBvZiB0aGVzZSBjb252ZXJzaW9ucyBkYXRhIGlzIGNvbXB1dGVkIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICB0byByZXN1bHQgYXMgdGhlIEFEQyBvdmVyc2FtcGxpbmcgY29udmVyc2lvbiBkYXRhICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAoYmVmb3JlIHBvdGVudGlhbCBzaGlmdCkgKi8NCi0jZGVmaW5lIExMX0FEQ19PVlNfUkFUSU9fOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0ZHUjJfT1ZTUl8xKSAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgcmF0aW8gb2YgOCAoOCBBREMgY29udmVyc2lvbnMgYXJlIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtZWQsIHN1bSBvZiB0aGVzZSBjb252ZXJzaW9ucyBkYXRhIGlzIGNvbXB1dGVkIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICB0byByZXN1bHQgYXMgdGhlIEFEQyBvdmVyc2FtcGxpbmcgY29udmVyc2lvbiBkYXRhICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAoYmVmb3JlIHBvdGVudGlhbCBzaGlmdCkgKi8NCi0jZGVmaW5lIExMX0FEQ19PVlNfUkFUSU9fMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19DRkdSMl9PVlNSXzEgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgQURDX0NGR1IyX09WU1JfMCkgLyohPCBBREMgb3ZlcnNhbXBsaW5nIHJhdGlvIG9mIDE2ICgxNiBBREMgY29udmVyc2lvbnMgYXJlIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtZWQsIHN1bSBvZiB0aGVzZSBjb252ZXJzaW9ucyBkYXRhIGlzIGNvbXB1dGVkICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRvIHJlc3VsdCBhcyB0aGUgQURDIG92ZXJzYW1wbGluZyBjb252ZXJzaW9uIGRhdGEgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgKGJlZm9yZSBwb3RlbnRpYWwgc2hpZnQpICovDQotI2RlZmluZSBMTF9BRENfT1ZTX1JBVElPXzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0ZHUjJfT1ZTUl8yKSAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgcmF0aW8gb2YgMzIgKDMyIEFEQyBjb252ZXJzaW9ucyBhcmUgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1lZCwgc3VtIG9mIHRoZXNlIGNvbnZlcnNpb25zIGRhdGEgaXMgY29tcHV0ZWQgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgdG8gcmVzdWx0IGFzIHRoZSBBREMgb3ZlcnNhbXBsaW5nIGNvbnZlcnNpb24gZGF0YSAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAoYmVmb3JlIHBvdGVudGlhbCBzaGlmdCkgKi8NCi0jZGVmaW5lIExMX0FEQ19PVlNfUkFUSU9fNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19DRkdSMl9PVlNSXzIgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgQURDX0NGR1IyX09WU1JfMCkgLyohPCBBREMgb3ZlcnNhbXBsaW5nIHJhdGlvIG9mIDY0ICg2NCBBREMgY29udmVyc2lvbnMgYXJlIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtZWQsIHN1bSBvZiB0aGVzZSBjb252ZXJzaW9ucyBkYXRhIGlzIGNvbXB1dGVkICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRvIHJlc3VsdCBhcyB0aGUgQURDIG92ZXJzYW1wbGluZyBjb252ZXJzaW9uIGRhdGEgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgKGJlZm9yZSBwb3RlbnRpYWwgc2hpZnQpICovDQotI2RlZmluZSBMTF9BRENfT1ZTX1JBVElPXzEyOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19DRkdSMl9PVlNSXzIgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBBRENfQ0ZHUjJfT1ZTUl8xKSAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgcmF0aW8gb2YgMTI4ICgxMjggQURDIGNvbnZlcnNpb25zICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgYXJlIHBlcmZvcm1lZCwgc3VtIG9mIHRoZXNlIGNvbnZlcnNpb25zIGRhdGEgaXMgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGVkIHRvIHJlc3VsdCBhcyB0aGUgQURDIG92ZXJzYW1wbGluZyBjb252ZXJzaW9uIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhIChiZWZvcmUgcG90ZW50aWFsIHNoaWZ0KSAqLw0KLSNkZWZpbmUgTExfQURDX09WU19SQVRJT18yNTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0ZHUjJfT1ZTUl8yIHwgQURDX0NGR1IyX09WU1JfMSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgQURDX0NGR1IyX09WU1JfMCkgLyohPCBBREMgb3ZlcnNhbXBsaW5nIHJhdGlvIG9mIDI1NiAoMjU2IEFEQyBjb252ZXJzaW9ucyAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBwZXJmb3JtZWQsIHN1bSBvZiB0aGVzZSBjb252ZXJzaW9ucyBkYXRhIGlzICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRlZCB0byByZXN1bHQgYXMgdGhlIEFEQyBvdmVyc2FtcGxpbmcgY29udmVyc2lvbiBcDQotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSAoYmVmb3JlIHBvdGVudGlhbCBzaGlmdCkgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX09WU19TSElGVCAgT3ZlcnNhbXBsaW5nIC0gRGF0YSBzaGlmdA0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9BRENfT1ZTX1NISUZUX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgweDAwMDAwMDAwVUwpIC8qITwgQURDIG92ZXJzYW1wbGluZyBubyBzaGlmdCAoc3VtIG9mIHRoZSBBREMgY29udmVyc2lvbnMgXA0KLSAgICAgICAgICAgICAgICAgICAgZGF0YSBpcyBub3QgZGl2aWRlZCB0byByZXN1bHQgYXMgdGhlIEFEQyBvdmVyc2FtcGxpbmcgICBcDQotICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9uIGRhdGEpICovDQotI2RlZmluZSBMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19DRkdSMl9PVlNTXzApIC8qITwgQURDIG92ZXJzYW1wbGluZyBzaGlmdCBvZiAxIChzdW0gb2YgdGhlIEFEQyAgICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9ucyBkYXRhIGlzIGRpdmlkZWQgYnkgMiB0byByZXN1bHQgYXMgdGhlIEFEQyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcnNhbXBsaW5nIGNvbnZlcnNpb24gZGF0YSkgKi8NCi0jZGVmaW5lIExMX0FEQ19PVlNfU0hJRlRfUklHSFRfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0NGR1IyX09WU1NfMSkgLyohPCBBREMgb3ZlcnNhbXBsaW5nIHNoaWZ0IG9mIDIgKHN1bSBvZiB0aGUgQURDICAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb25zIGRhdGEgaXMgZGl2aWRlZCBieSA0IHRvIHJlc3VsdCBhcyB0aGUgQURDIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBvdmVyc2FtcGxpbmcgY29udmVyc2lvbiBkYXRhKSAqLw0KLSNkZWZpbmUgTExfQURDX09WU19TSElGVF9SSUdIVF8zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0ZHUjJfT1ZTU18xIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgQURDX0NGR1IyX09WU1NfMCkgLyohPCBBREMgb3ZlcnNhbXBsaW5nIHNoaWZ0IG9mIDMgKHN1bSBvZiB0aGUgQURDICAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb25zIGRhdGEgaXMgZGl2aWRlZCBieSA4IHRvIHJlc3VsdCBhcyB0aGUgQURDIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBvdmVyc2FtcGxpbmcgY29udmVyc2lvbiBkYXRhKSAqLw0KLSNkZWZpbmUgTExfQURDX09WU19TSElGVF9SSUdIVF80ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0NGR1IyX09WU1NfMikgLyohPCBBREMgb3ZlcnNhbXBsaW5nIHNoaWZ0IG9mIDQgKHN1bSBvZiB0aGUgQURDICAgICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9ucyBkYXRhIGlzIGRpdmlkZWQgYnkgMTYgdG8gcmVzdWx0IGFzIHRoZSBBREMgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJzYW1wbGluZyBjb252ZXJzaW9uIGRhdGEpICovDQotI2RlZmluZSBMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0ZHUjJfT1ZTU18yIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19DRkdSMl9PVlNTXzApIC8qITwgQURDIG92ZXJzYW1wbGluZyBzaGlmdCBvZiA1IChzdW0gb2YgdGhlIEFEQyAgICAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbnMgZGF0YSBpcyBkaXZpZGVkIGJ5IDMyIHRvIHJlc3VsdCBhcyB0aGUgQURDIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBvdmVyc2FtcGxpbmcgY29udmVyc2lvbiBkYXRhKSAqLw0KLSNkZWZpbmUgTExfQURDX09WU19TSElGVF9SSUdIVF82ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0NGR1IyX09WU1NfMiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBBRENfQ0ZHUjJfT1ZTU18xKSAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgc2hpZnQgb2YgNiAoc3VtIG9mIHRoZSBBREMgICAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb25zIGRhdGEgaXMgZGl2aWRlZCBieSA2NCB0byByZXN1bHQgYXMgdGhlIEFEQyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcnNhbXBsaW5nIGNvbnZlcnNpb24gZGF0YSkgKi8NCi0jZGVmaW5lIExMX0FEQ19PVlNfU0hJRlRfUklHSFRfNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19DRkdSMl9PVlNTXzIgfCBBRENfQ0ZHUjJfT1ZTU18xIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgQURDX0NGR1IyX09WU1NfMCkgLyohPCBBREMgb3ZlcnNhbXBsaW5nIHNoaWZ0IG9mIDcgKHN1bSBvZiB0aGUgQURDICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9ucyBkYXRhIGlzIGRpdmlkZWQgYnkgMTI4IHRvIHJlc3VsdCBhcyB0aGUgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEFEQyBvdmVyc2FtcGxpbmcgY29udmVyc2lvbiBkYXRhKSAqLw0KLSNkZWZpbmUgTExfQURDX09WU19TSElGVF9SSUdIVF84ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0NGR1IyX09WU1NfMykgLyohPCBBREMgb3ZlcnNhbXBsaW5nIHNoaWZ0IG9mIDggKHN1bSBvZiB0aGUgQURDICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9ucyBkYXRhIGlzIGRpdmlkZWQgYnkgMjU2IHRvIHJlc3VsdCBhcyB0aGUgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEFEQyBvdmVyc2FtcGxpbmcgY29udmVyc2lvbiBkYXRhKSAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotI2lmIGRlZmluZWQoQURDX01VTFRJTU9ERV9TVVBQT1JUKQ0KLS8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX01VTFRJX01PREUgIE11bHRpbW9kZSAtIE1vZGUNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfQURDX01VTFRJX0lOREVQRU5ERU5UIFwNCi0gICgweDAwMDAwMDAwVUwpIC8qITwgQURDIGR1YWwgbW9kZSBkaXNhYmxlZCAoQURDIGluZGVwZW5kZW50IG1vZGUpICovDQotI2RlZmluZSBMTF9BRENfTVVMVElfRFVBTF9SRUdfU0lNVUxUIFwNCi0gIChBRENfQ0NSX0RVQUxfMiB8ICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19DQ1JfRFVBTF8xKSAvKiE8IEFEQyBkdWFsIG1vZGUgZW5hYmxlZDogZ3JvdXAgcmVndWxhciBzaW11bHRhbmVvdXMgKi8NCi0jZGVmaW5lIExMX0FEQ19NVUxUSV9EVUFMX1JFR19JTlRFUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19DQ1JfRFVBTF8yIHwgQURDX0NDUl9EVUFMXzEgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgQURDX0NDUl9EVUFMXzApIC8qITwgQURDIGR1YWwgbW9kZSBlbmFibGVkOiBDb21iaW5lZCBncm91cCByZWd1bGFyIFwNCi0gICAgICAgICAgICAgICAgICAgICAgaW50ZXJsZWF2ZWQgKi8NCi0jZGVmaW5lIExMX0FEQ19NVUxUSV9EVUFMX0lOSl9TSU1VTFQgXA0KLSAgKEFEQ19DQ1JfRFVBTF8yIHwgICAgICAgICAgICAgICAgICBcDQotICAgQURDX0NDUl9EVUFMXzApIC8qITwgQURDIGR1YWwgbW9kZSBlbmFibGVkOiBncm91cCBpbmplY3RlZCBzaW11bHRhbmVvdXMgKi8NCi0jZGVmaW5lIExMX0FEQ19NVUxUSV9EVUFMX0lOSl9BTFRFUk4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19DQ1JfRFVBTF8zIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgQURDX0NDUl9EVUFMXzApIC8qITwgQURDIGR1YWwgbW9kZSBlbmFibGVkOiBncm91cCBpbmplY3RlZCBhbHRlcm5hdGUgICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlci4gV29ya3Mgb25seSB3aXRoIGV4dGVybmFsIHRyaWdnZXJzIChub3QgaW50ZXJuYWwgXA0KLSAgICAgICAgICAgICAgICAgICAgICBTVyBzdGFydCkgKi8NCi0jZGVmaW5lIExMX0FEQ19NVUxUSV9EVUFMX1JFR19TSU1fSU5KX1NJTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19DQ1JfRFVBTF8wKSAvKiE8IEFEQyBkdWFsIG1vZGUgZW5hYmxlZDogQ29tYmluZWQgZ3JvdXAgcmVndWxhciBcDQotICAgICAgICAgICAgICAgICAgICAgIHNpbXVsdGFuZW91cyArIGdyb3VwIGluamVjdGVkIHNpbXVsdGFuZW91cyAqLw0KLSNkZWZpbmUgTExfQURDX01VTFRJX0RVQUxfUkVHX1NJTV9JTkpfQUxUICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0NDUl9EVUFMXzEpIC8qITwgQURDIGR1YWwgbW9kZSBlbmFibGVkOiBDb21iaW5lZCBncm91cCByZWd1bGFyIFwNCi0gICAgICAgICAgICAgICAgICAgICAgc2ltdWx0YW5lb3VzICsgZ3JvdXAgaW5qZWN0ZWQgYWx0ZXJuYXRlIHRyaWdnZXIgKi8NCi0jZGVmaW5lIExMX0FEQ19NVUxUSV9EVUFMX1JFR19JTlRfSU5KX1NJTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19DQ1JfRFVBTF8xIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgQURDX0NDUl9EVUFMXzApIC8qITwgQURDIGR1YWwgbW9kZSBlbmFibGVkOiBDb21iaW5lZCBncm91cCByZWd1bGFyIFwNCi0gICAgICAgICAgICAgICAgICAgICAgaW50ZXJsZWF2ZWQgKyBncm91cCBpbmplY3RlZCBzaW11bHRhbmVvdXMgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX01VTFRJX0RNQV9UUkFOU0ZFUiAgTXVsdGltb2RlIC0gRE1BIHRyYW5zZmVyDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX0FEQ19NVUxUSV9SRUdfRE1BX0VBQ0hfQURDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoMHgwMDAwMDAwMFVMKSAvKiE8IEFEQyBtdWx0aW1vZGUgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9ucyBhcmUgdHJhbnNmZXJyZWQgXA0KLSAgICAgICAgICAgICAgICAgICAgYnkgRE1BOiBlYWNoIEFEQyB1c2VzIGl0cyBvd24gRE1BIGNoYW5uZWwsIHdpdGggaXRzICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgIGluZGl2aWR1YWwgRE1BIHRyYW5zZmVyIHNldHRpbmdzICovDQotI2RlZmluZSBMTF9BRENfTVVMVElfUkVHX0RNQV9MSU1JVF9SRVMxMl8xMEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0NSX01ETUFfMSkgLyohPCBBREMgbXVsdGltb2RlIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbnMgYXJlICAgICAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICB0cmFuc2ZlcnJlZCBieSBETUEsIG9uZSBETUEgY2hhbm5lbCBmb3IgYm90aCBBREMgKERNQSBvZiBcDQotICAgICAgICAgICAgICAgICAgICAgIEFEQyBtYXN0ZXIpLCBpbiBsaW1pdGVkIG1vZGUgKG9uZSBzaG90IG1vZGUpOiBETUEgICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXIgcmVxdWVzdHMgYXJlIHN0b3BwZWQgd2hlbiBudW1iZXIgb2YgRE1BIGRhdGEgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICB0cmFuc2ZlcnMgKG51bWJlciBvZiBBREMgY29udmVyc2lvbnMpIGlzIHJlYWNoZWQuIFRoaXMgICBcDQotICAgICAgICAgICAgICAgICAgICAgIEFEQyBtb2RlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgd2l0aCBETUEgbW9kZSAgICAgICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgbm9uLWNpcmN1bGFyLiBTZXR0aW5nIGZvciBBREMgcmVzb2x1dGlvbiBvZiAxMiBhbmQgMTAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICBiaXRzICovDQotI2RlZmluZSBMTF9BRENfTVVMVElfUkVHX0RNQV9MSU1JVF9SRVM4XzZCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0NSX01ETUFfMSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIEFEQ19DQ1JfTURNQV8wKSAvKiE8IEFEQyBtdWx0aW1vZGUgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9ucyBhcmUgICAgICAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVycmVkIGJ5IERNQSwgb25lIERNQSBjaGFubmVsIGZvciBib3RoIEFEQyAoRE1BIG9mIFwNCi0gICAgICAgICAgICAgICAgICAgICAgQURDIG1hc3RlciksIGluIGxpbWl0ZWQgbW9kZSAob25lIHNob3QgbW9kZSk6IERNQSAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICB0cmFuc2ZlciByZXF1ZXN0cyBhcmUgc3RvcHBlZCB3aGVuIG51bWJlciBvZiBETUEgZGF0YSAgICBcDQotICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVycyAobnVtYmVyIG9mIEFEQyBjb252ZXJzaW9ucykgaXMgcmVhY2hlZC4gVGhpcyAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgQURDIG1vZGUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoIERNQSBtb2RlICAgICAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICBub24tY2lyY3VsYXIuIFNldHRpbmcgZm9yIEFEQyByZXNvbHV0aW9uIG9mIDggYW5kIDYgYml0cyBcDQotICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfQURDX01VTFRJX1JFR19ETUFfVU5MTVRfUkVTMTJfMTBCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0NDUl9ETUFDRkcgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBBRENfQ0NSX01ETUFfMSkgLyohPCBBREMgbXVsdGltb2RlIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbnMgYXJlICAgICAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICB0cmFuc2ZlcnJlZCBieSBETUEsIG9uZSBETUEgY2hhbm5lbCBmb3IgYm90aCBBREMgKERNQSBvZiBcDQotICAgICAgICAgICAgICAgICAgICAgIEFEQyBtYXN0ZXIpLCBpbiB1bmxpbWl0ZWQgbW9kZTogRE1BIHRyYW5zZmVyIHJlcXVlc3RzICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgYXJlIHVubGltaXRlZCwgd2hhdGV2ZXIgbnVtYmVyIG9mIERNQSBkYXRhIHRyYW5zZmVycmVkICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAobnVtYmVyIG9mIEFEQyBjb252ZXJzaW9ucykuIFRoaXMgQURDIG1vZGUgaXMgaW50ZW5kZWQgICBcDQotICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHVzZWQgd2l0aCBETUEgbW9kZSBjaXJjdWxhci4gU2V0dGluZyBmb3IgQURDICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbiBvZiAxMiBhbmQgMTAgYml0cyAqLw0KLSNkZWZpbmUgTExfQURDX01VTFRJX1JFR19ETUFfVU5MTVRfUkVTOF82QiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0NDUl9ETUFDRkcgfCBBRENfQ0NSX01ETUFfMSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBBRENfQ0NSX01ETUFfMCkgLyohPCBBREMgbXVsdGltb2RlIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbnMgYXJlICAgICAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICB0cmFuc2ZlcnJlZCBieSBETUEsIG9uZSBETUEgY2hhbm5lbCBmb3IgYm90aCBBREMgKERNQSBvZiBcDQotICAgICAgICAgICAgICAgICAgICAgIEFEQyBtYXN0ZXIpLCBpbiB1bmxpbWl0ZWQgbW9kZTogRE1BIHRyYW5zZmVyIHJlcXVlc3RzICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgYXJlIHVubGltaXRlZCwgd2hhdGV2ZXIgbnVtYmVyIG9mIERNQSBkYXRhIHRyYW5zZmVycmVkICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAobnVtYmVyIG9mIEFEQyBjb252ZXJzaW9ucykuIFRoaXMgQURDIG1vZGUgaXMgaW50ZW5kZWQgICBcDQotICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHVzZWQgd2l0aCBETUEgbW9kZSBjaXJjdWxhci4gU2V0dGluZyBmb3IgQURDICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbiBvZiA4IGFuZCA2IGJpdHMgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX01VTFRJX1RXT1NNUF9ERUxBWSAgTXVsdGltb2RlIC0gRGVsYXkgYmV0d2VlbiB0d28NCi0gKiBzYW1wbGluZyBwaGFzZXMNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfQURDX01VTFRJX1RXT1NNUF9ERUxBWV8xQ1lDTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKDB4MDAwMDAwMDBVTCkgLyohPCBBREMgbXVsdGltb2RlIGRlbGF5IGJldHdlZW4gdHdvIHNhbXBsaW5nIHBoYXNlczogMSBBREMgXA0KLSAgICAgICAgICAgICAgICAgICAgY2xvY2sgY3ljbGUgKi8NCi0jZGVmaW5lIExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfMkNZQ0xFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19DQ1JfREVMQVlfMCkgLyohPCBBREMgbXVsdGltb2RlIGRlbGF5IGJldHdlZW4gdHdvIHNhbXBsaW5nIHBoYXNlczogMiBcDQotICAgICAgICAgICAgICAgICAgICAgICBBREMgY2xvY2sgY3ljbGVzICovDQotI2RlZmluZSBMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzNDWUNMRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0NSX0RFTEFZXzEpIC8qITwgQURDIG11bHRpbW9kZSBkZWxheSBiZXR3ZWVuIHR3byBzYW1wbGluZyBwaGFzZXM6IDMgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgQURDIGNsb2NrIGN5Y2xlcyAqLw0KLSNkZWZpbmUgTExfQURDX01VTFRJX1RXT1NNUF9ERUxBWV80Q1lDTEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0NDUl9ERUxBWV8xIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBBRENfQ0NSX0RFTEFZXzApIC8qITwgQURDIG11bHRpbW9kZSBkZWxheSBiZXR3ZWVuIHR3byBzYW1wbGluZyBwaGFzZXM6IDQgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgQURDIGNsb2NrIGN5Y2xlcyAqLw0KLSNkZWZpbmUgTExfQURDX01VTFRJX1RXT1NNUF9ERUxBWV81Q1lDTEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0NDUl9ERUxBWV8yKSAvKiE8IEFEQyBtdWx0aW1vZGUgZGVsYXkgYmV0d2VlbiB0d28gc2FtcGxpbmcgcGhhc2VzOiA1IFwNCi0gICAgICAgICAgICAgICAgICAgICAgIEFEQyBjbG9jayBjeWNsZXMgKi8NCi0jZGVmaW5lIExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfNkNZQ0xFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19DQ1JfREVMQVlfMiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgQURDX0NDUl9ERUxBWV8wKSAvKiE8IEFEQyBtdWx0aW1vZGUgZGVsYXkgYmV0d2VlbiB0d28gc2FtcGxpbmcgcGhhc2VzOiA2IFwNCi0gICAgICAgICAgICAgICAgICAgICAgIEFEQyBjbG9jayBjeWNsZXMgKi8NCi0jZGVmaW5lIExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfN0NZQ0xFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19DQ1JfREVMQVlfMiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgQURDX0NDUl9ERUxBWV8xKSAvKiE8IEFEQyBtdWx0aW1vZGUgZGVsYXkgYmV0d2VlbiB0d28gc2FtcGxpbmcgcGhhc2VzOiA3IFwNCi0gICAgICAgICAgICAgICAgICAgICAgIEFEQyBjbG9jayBjeWNsZXMgKi8NCi0jZGVmaW5lIExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfOENZQ0xFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19DQ1JfREVMQVlfMiB8IEFEQ19DQ1JfREVMQVlfMSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgQURDX0NDUl9ERUxBWV8wKSAvKiE8IEFEQyBtdWx0aW1vZGUgZGVsYXkgYmV0d2VlbiB0d28gc2FtcGxpbmcgcGhhc2VzOiA4IFwNCi0gICAgICAgICAgICAgICAgICAgICAgIEFEQyBjbG9jayBjeWNsZXMgKi8NCi0jZGVmaW5lIExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfOUNZQ0xFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19DQ1JfREVMQVlfMykgLyohPCBBREMgbXVsdGltb2RlIGRlbGF5IGJldHdlZW4gdHdvIHNhbXBsaW5nIHBoYXNlczogOSBcDQotICAgICAgICAgICAgICAgICAgICAgICBBREMgY2xvY2sgY3ljbGVzICovDQotI2RlZmluZSBMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzEwQ1lDTEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0NDUl9ERUxBWV8zIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgQURDX0NDUl9ERUxBWV8wKSAvKiE8IEFEQyBtdWx0aW1vZGUgZGVsYXkgYmV0d2VlbiB0d28gc2FtcGxpbmcgcGhhc2VzOiAxMCBcDQotICAgICAgICAgICAgICAgICAgICAgICBBREMgY2xvY2sgY3ljbGVzICovDQotI2RlZmluZSBMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzExQ1lDTEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0NDUl9ERUxBWV8zIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgQURDX0NDUl9ERUxBWV8xKSAvKiE8IEFEQyBtdWx0aW1vZGUgZGVsYXkgYmV0d2VlbiB0d28gc2FtcGxpbmcgcGhhc2VzOiAxMSBcDQotICAgICAgICAgICAgICAgICAgICAgICBBREMgY2xvY2sgY3ljbGVzICovDQotI2RlZmluZSBMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzEyQ1lDTEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQURDX0NDUl9ERUxBWV8zIHwgQURDX0NDUl9ERUxBWV8xIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgQURDX0NDUl9ERUxBWV8wKSAvKiE8IEFEQyBtdWx0aW1vZGUgZGVsYXkgYmV0d2VlbiB0d28gc2FtcGxpbmcgcGhhc2VzOiAxMiBcDQotICAgICAgICAgICAgICAgICAgICAgICBBREMgY2xvY2sgY3ljbGVzICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19NVUxUSV9NQVNURVJfU0xBVkUgIE11bHRpbW9kZSAtIEFEQyBtYXN0ZXIgb3Igc2xhdmUNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfQURDX01VTFRJX01BU1RFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0RSX1JEQVRBX01TVCkgLyohPCBJbiBtdWx0aW1vZGUsIHNlbGVjdGlvbiBhbW9uZyBzZXZlcmFsIEFEQyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlczogQURDIG1hc3RlciAqLw0KLSNkZWZpbmUgTExfQURDX01VTFRJX1NMQVZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChBRENfQ0RSX1JEQVRBX1NMVikgLyohPCBJbiBtdWx0aW1vZGUsIHNlbGVjdGlvbiBhbW9uZyBzZXZlcmFsIEFEQyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlczogQURDIHNsYXZlICovDQotI2RlZmluZSBMTF9BRENfTVVMVElfTUFTVEVSX1NMQVZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEFEQ19DRFJfUkRBVEFfU0xWIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBBRENfQ0RSX1JEQVRBX01TVCkgLyohPCBJbiBtdWx0aW1vZGUsIHNlbGVjdGlvbiBhbW9uZyBzZXZlcmFsIEFEQyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlczogYm90aCBBREMgbWFzdGVyIGFuZCBBREMgc2xhdmUgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLSNlbmRpZiAvKiBBRENfTVVMVElNT0RFX1NVUFBPUlQgKi8NCi0NCi0vKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19IV19ERUxBWVMgIERlZmluaXRpb25zIG9mIEFEQyBoYXJkd2FyZSBjb25zdHJhaW50cw0KLSAqIGRlbGF5cw0KLSAqIEBub3RlICAgT25seSBBREMgcGVyaXBoZXJhbCBIVyBkZWxheXMgYXJlIGRlZmluZWQgaW4gQURDIExMIGRyaXZlciBkcml2ZXIsDQotICogICAgICAgICBub3QgdGltZW91dCB2YWx1ZXMuDQotICogICAgICAgICBGb3IgZGV0YWlscyBvbiBkZWxheXMgdmFsdWVzLCByZWZlciB0byBkZXNjcmlwdGlvbnMgaW4gc291cmNlIGNvZGUNCi0gKiAgICAgICAgIGFib3ZlIGVhY2ggbGl0ZXJhbCBkZWZpbml0aW9uLg0KLSAqIEB7DQotICovDQotDQotLyogTm90ZTogT25seSBBREMgcGVyaXBoZXJhbCBIVyBkZWxheXMgYXJlIGRlZmluZWQgaW4gQURDIExMIGRyaXZlciBkcml2ZXIsICAgKi8NCi0vKiAgICAgICBub3QgdGltZW91dCB2YWx1ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLS8qICAgICAgIFRpbWVvdXQgdmFsdWVzIGZvciBBREMgb3BlcmF0aW9ucyBhcmUgZGVwZW5kZW50IHRvIGRldmljZSBjbG9jayAgICAgICovDQotLyogICAgICAgY29uZmlndXJhdGlvbiAoc3lzdGVtIGNsb2NrIHZlcnN1cyBBREMgY2xvY2spLCAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0vKiAgICAgICBhbmQgdGhlcmVmb3JlIG11c3QgYmUgZGVmaW5lZCBpbiB1c2VyIGFwcGxpY2F0aW9uLiAgICAgICAgICAgICAgICAgICAqLw0KLS8qICAgICAgIEluZGljYXRpb25zIGZvciBlc3RpbWF0aW9uIG9mIEFEQyB0aW1lb3V0IGRlbGF5cywgZm9yIHRoaXMgICAgICAgICAgICovDQotLyogICAgICAgU1RNMzIgc2VyaWVzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0vKiAgICAgICAtIEFEQyBjYWxpYnJhdGlvbiB0aW1lOiBtYXhpbXVtIGRlbGF5IGlzIDExMi9mQURDLiAgICAgICAgICAgICAgICAgICAqLw0KLS8qICAgICAgICAgKHJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQsIHBhcmFtZXRlciAidENBTCIpICAgICAgICAgICAgICAgICAgICAgICovDQotLyogICAgICAgLSBBREMgZW5hYmxlIHRpbWU6IG1heGltdW0gZGVsYXkgaXMgMSBjb252ZXJzaW9uIGN5Y2xlLiAgICAgICAgICAgICAgKi8NCi0vKiAgICAgICAgIChyZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0LCBwYXJhbWV0ZXIgInRTVEFCIikgICAgICAgICAgICAgICAgICAgICAqLw0KLS8qICAgICAgIC0gQURDIGRpc2FibGUgdGltZTogbWF4aW11bSBkZWxheSBzaG91bGQgYmUgYSBmZXcgQURDIGNsb2NrIGN5Y2xlcyAgICovDQotLyogICAgICAgLSBBREMgc3RvcCBjb252ZXJzaW9uIHRpbWU6IG1heGltdW0gZGVsYXkgc2hvdWxkIGJlIGEgZmV3IEFEQyBjbG9jayAgKi8NCi0vKiAgICAgICAgIGN5Y2xlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLS8qICAgICAgIC0gQURDIGNvbnZlcnNpb24gdGltZTogZHVyYXRpb24gZGVwZW5kaW5nIG9uIEFEQyBjbG9jayBhbmQgQURDICAgICAgICovDQotLyogICAgICAgICBjb25maWd1cmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0vKiAgICAgICAgIChyZWZlciB0byBkZXZpY2UgcmVmZXJlbmNlIG1hbnVhbCwgc2VjdGlvbiAiVGltaW5nIikgICAgICAgICAgICAgICAqLw0KLQ0KLS8qIERlbGF5IGZvciBBREMgc3RhYmlsaXphdGlvbiB0aW1lIChBREMgdm9sdGFnZSByZWd1bGF0b3Igc3RhcnQtdXAgdGltZSkgICAgICovDQotLyogRGVsYXkgc2V0IHRvIG1heGltdW0gdmFsdWUgKHJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQsICAgICAgICAgICAgICAgICAgICAgKi8NCi0vKiBwYXJhbWV0ZXIgInRBRENWUkVHX1NUVVAiKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLS8qIFVuaXQ6IHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9BRENfREVMQVlfSU5URVJOQUxfUkVHVUxfU1RBQl9VUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgyMFVMKSAvKiE8IERlbGF5IGZvciBBREMgc3RhYmlsaXphdGlvbiB0aW1lIChBREMgdm9sdGFnZSByZWd1bGF0b3Igc3RhcnQtdXAgXA0KLSAgICAgICAgICAgIHRpbWUpICovDQotDQotLyogRGVsYXkgZm9yIGludGVybmFsIHZvbHRhZ2UgcmVmZXJlbmNlIHN0YWJpbGl6YXRpb24gdGltZS4gICAgICAgICAgICAgICAgICAgKi8NCi0vKiBEZWxheSBzZXQgdG8gbWF4aW11bSB2YWx1ZSAocmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCwgICAgICAgICAgICAgICAgICAgICAqLw0KLS8qIHBhcmFtZXRlciAidHN0YXJ0X3ZyZWZpbnQiKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotLyogVW5pdDogdXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX0FEQ19ERUxBWV9WUkVGSU5UX1NUQUJfVVMgXA0KLSAgKDEyVUwpIC8qITwgRGVsYXkgZm9yIGludGVybmFsIHZvbHRhZ2UgcmVmZXJlbmNlIHN0YWJpbGl6YXRpb24gdGltZSAqLw0KLQ0KLS8qIERlbGF5IGZvciB0ZW1wZXJhdHVyZSBzZW5zb3Igc3RhYmlsaXphdGlvbiB0aW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotLyogTGl0ZXJhbCBzZXQgdG8gbWF4aW11bSB2YWx1ZSAocmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCwgICAgICAgICAgICAgICAgICAgKi8NCi0vKiBwYXJhbWV0ZXIgInRTVEFSVCIpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLS8qIFVuaXQ6IHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9BRENfREVMQVlfVEVNUFNFTlNPUl9TVEFCX1VTIFwNCi0gICgxMjBVTCkgLyohPCBEZWxheSBmb3IgdGVtcGVyYXR1cmUgc2Vuc29yIHN0YWJpbGl6YXRpb24gdGltZSAqLw0KLQ0KLS8qIERlbGF5IHJlcXVpcmVkIGJldHdlZW4gQURDIGVuZCBvZiBjYWxpYnJhdGlvbiBhbmQgQURDIGVuYWJsZS4gICAgICAgICAgICAgICovDQotLyogTm90ZTogT24gdGhpcyBTVE0zMiBzZXJpZXMsIGEgbWluaW11bSBudW1iZXIgb2YgQURDIGNsb2NrIGN5Y2xlcyAgICAgICAgICAgKi8NCi0vKiAgICAgICBhcmUgcmVxdWlyZWQgYmV0d2VlbiBBREMgZW5kIG9mIGNhbGlicmF0aW9uIGFuZCBBREMgZW5hYmxlLiAgICAgICAgICAqLw0KLS8qICAgICAgIFdhaXQgdGltZSBjYW4gYmUgY29tcHV0ZWQgaW4gdXNlciBhcHBsaWNhdGlvbiBieSB3YWl0aW5nIGZvciB0aGUgICAgICovDQotLyogICAgICAgZXF1aXZhbGVudCBudW1iZXIgb2YgQ1BVIGN5Y2xlcywgYnkgdGFraW5nIGludG8gYWNjb3VudCAgICAgICAgICAgICAgKi8NCi0vKiAgICAgICByYXRpbyBvZiBDUFUgY2xvY2sgdmVyc3VzIEFEQyBjbG9jayBwcmVzY2FsZXJzLiAgICAgICAgICAgICAgICAgICAgICAqLw0KLS8qIFVuaXQ6IEFEQyBjbG9jayBjeWNsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9BRENfREVMQVlfQ0FMSUJfRU5BQkxFX0FEQ19DWUNMRVMgXA0KLSAgKDRVTCkgLyohPCBEZWxheSByZXF1aXJlZCBiZXR3ZWVuIEFEQyBlbmQgb2YgY2FsaWJyYXRpb24gYW5kIEFEQyBlbmFibGUgKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGRlZmdyb3VwIEFEQ19MTF9FeHBvcnRlZF9NYWNyb3MgQURDIEV4cG9ydGVkIE1hY3Jvcw0KLSAqIEB7DQotICovDQotDQotLyoqIEBkZWZncm91cCBBRENfTExfRU1fV1JJVEVfUkVBRCBDb21tb24gd3JpdGUgYW5kIHJlYWQgcmVnaXN0ZXJzIE1hY3Jvcw0KLSAqIEB7DQotICovDQotDQotLyoqDQotICogQGJyaWVmICBXcml0ZSBhIHZhbHVlIGluIEFEQyByZWdpc3Rlcg0KLSAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIEFEQyBJbnN0YW5jZQ0KLSAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSB3cml0dGVuDQotICogQHBhcmFtICBfX1ZBTFVFX18gVmFsdWUgdG8gYmUgd3JpdHRlbiBpbiB0aGUgcmVnaXN0ZXINCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIExMX0FEQ19Xcml0ZVJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18sIF9fVkFMVUVfXykgXA0KLSAgV1JJVEVfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXywgKF9fVkFMVUVfXykpDQotDQotLyoqDQotICogQGJyaWVmICBSZWFkIGEgdmFsdWUgaW4gQURDIHJlZ2lzdGVyDQotICogQHBhcmFtICBfX0lOU1RBTkNFX18gQURDIEluc3RhbmNlDQotICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHJlYWQNCi0gKiBAcmV0dmFsIFJlZ2lzdGVyIHZhbHVlDQotICovDQotI2RlZmluZSBMTF9BRENfUmVhZFJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18pIFJFQURfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXykNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQURDX0xMX0VNX0hFTFBFUl9NQUNSTyBBREMgaGVscGVyIG1hY3JvDQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBnZXQgQURDIGNoYW5uZWwgbnVtYmVyIGluIGRlY2ltYWwgZm9ybWF0DQotICogICAgICAgICBmcm9tIGxpdGVyYWxzIExMX0FEQ19DSEFOTkVMX3guDQotICogQG5vdGUgICBFeGFtcGxlOg0KLSAqICAgICAgICAgICBfX0xMX0FEQ19DSEFOTkVMX1RPX0RFQ0lNQUxfTkIoTExfQURDX0NIQU5ORUxfNCkNCi0gKiAgICAgICAgICAgd2lsbCByZXR1cm4gZGVjaW1hbCBudW1iZXIgIjQiLg0KLSAqIEBub3RlICAgVGhlIGlucHV0IGNhbiBiZSBhIHZhbHVlIGZyb20gZnVuY3Rpb25zIHdoZXJlIGEgY2hhbm5lbA0KLSAqICAgICAgICAgbnVtYmVyIGlzIHJldHVybmVkLCBlaXRoZXIgZGVmaW5lZCB3aXRoIG51bWJlcg0KLSAqICAgICAgICAgb3Igd2l0aCBiaXRmaWVsZCAob25seSBvbmUgYml0IG11c3QgYmUgc2V0KS4NCi0gKiBAcGFyYW0gIF9fQ0hBTk5FTF9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEgICAgICAgICAgICAgICAgICg4KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzIgICAgICAgICAgICAgICAgICg4KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzMgICAgICAgICAgICAgICAgICg4KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzQgICAgICAgICAgICAgICAgICg4KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzUgICAgICAgICAgICAgICAgICg4KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF83DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzExDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE0DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE3DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WUkVGSU5UICAgICAgICAgICAoNykNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SX0FEQzEgICAoMSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SX0FEQzUgICAoNSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WQkFUICAgICAgICAgICAgICAoNikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAxICAgICAgICAgICAoMSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAyICAgICAgICAgICAoMikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAzX0FEQzIgICAgICAoMikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAzX0FEQzMgICAgICAoMykNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVA0ICAgICAgICAgICAoNSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVA1ICAgICAgICAgICAoNSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVA2ICAgICAgICAgICAoNCkNCi0gKg0KLSAqICAgICAgICAgKDEpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzEuXG4NCi0gKiAgICAgICAgICgyKSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMyLlxuDQotICogICAgICAgICAoMykgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMy5cbg0KLSAqICAgICAgICAgKDQpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzQuXG4NCi0gKiAgICAgICAgICg1KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREM1LlxuDQotICogICAgICAgICAoNikgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZXM6IEFEQzEsDQotICogQURDMywgQURDNS5cbiAoNykgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZXM6DQotICogQURDMSwgQURDMywgQURDNCwgQURDNS5cbg0KLSAqICAgICAgICAgIC0gIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBhbGwgQURDeCBhcmUgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlcy4NCi0gKiBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBtb3JlIGRldGFpbHMuICg4KSBPbiBTVE0zMkc0LCBmYXN0IGNoYW5uZWwNCi0gKiBhbGxvd3M6IDIuNSAoc2FtcGxpbmcpICsgMTIuNSAoY29udmVyc2lvbikgPSAxNSBBREMgY2xvY2sgY3ljbGVzIChmQURDKSB0bw0KLSAqIGNvbnZlcnQgaW4gMTItYml0IHJlc29sdXRpb24uIE90aGVyIGNoYW5uZWxzIGFyZSBzbG93IGNoYW5uZWxzICBhbGxvd3M6IDYuNQ0KLSAqIChzYW1wbGluZykgKyAxMi41IChjb252ZXJzaW9uKSA9IDE5IEFEQyBjbG9jayBjeWNsZXMgKGZBREMpIHRvIGNvbnZlcnQgaW4NCi0gKiAxMi1iaXQgcmVzb2x1dGlvbi5cbg0KLSAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0xOA0KLSAqLw0KLSNkZWZpbmUgX19MTF9BRENfQ0hBTk5FTF9UT19ERUNJTUFMX05CKF9fQ0hBTk5FTF9fKSAgICAgICAgXA0KLSAgKCgoKF9fQ0hBTk5FTF9fKSAmIEFEQ19DSEFOTkVMX0lEX0JJVEZJRUxEX01BU0spID09IDBVTCkgXA0KLSAgICAgICA/ICgoKF9fQ0hBTk5FTF9fKSAmIEFEQ19DSEFOTkVMX0lEX05VTUJFUl9NQVNLKSA+PiAgXA0KLSAgICAgICAgICBBRENfQ0hBTk5FTF9JRF9OVU1CRVJfQklUT0ZGU0VUX1BPUykgICAgICAgICAgICAgXA0KLSAgICAgICA6ICgodWludDMyX3QpUE9TSVRJT05fVkFMKChfX0NIQU5ORUxfXykpKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBnZXQgQURDIGNoYW5uZWwgaW4gbGl0ZXJhbCBmb3JtYXQgTExfQURDX0NIQU5ORUxfeA0KLSAqICAgICAgICAgZnJvbSBudW1iZXIgaW4gZGVjaW1hbCBmb3JtYXQuDQotICogQG5vdGUgICBFeGFtcGxlOg0KLSAqICAgICAgICAgICBfX0xMX0FEQ19ERUNJTUFMX05CX1RPX0NIQU5ORUwoNCkNCi0gKiAgICAgICAgICAgd2lsbCByZXR1cm4gYSBkYXRhIGVxdWl2YWxlbnQgdG8gIkxMX0FEQ19DSEFOTkVMXzQiLg0KLSAqIEBwYXJhbSAgX19ERUNJTUFMX05CX18gVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0xOA0KLSAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8wDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMSAgICAgICAgICAgICAgICAgKDgpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMiAgICAgICAgICAgICAgICAgKDgpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMyAgICAgICAgICAgICAgICAgKDgpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNCAgICAgICAgICAgICAgICAgKDgpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNSAgICAgICAgICAgICAgICAgKDgpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF84DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEwDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEzDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE2DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQgICAgICAgICAgICg3KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1JfQURDMSAgICgxKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1JfQURDNSAgICg1KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZCQVQgICAgICAgICAgICAgICg2KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDEgICAgICAgICAgICgxKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDIgICAgICAgICAgICgyKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDNfQURDMiAgICAgICgyKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDNfQURDMyAgICAgICgzKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDQgICAgICAgICAgICg1KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDUgICAgICAgICAgICg1KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDYgICAgICAgICAgICg0KQ0KLSAqDQotICogICAgICAgICAoMSkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMS5cbg0KLSAqICAgICAgICAgKDIpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzIuXG4NCi0gKiAgICAgICAgICgzKSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMzLlxuDQotICogICAgICAgICAoNCkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDNC5cbg0KLSAqICAgICAgICAgKDUpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzUuXG4NCi0gKiAgICAgICAgICg2KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlczogQURDMSwNCi0gKiBBREMzLCBBREM1LlxuICg3KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlczoNCi0gKiBBREMxLCBBREMzLCBBREM0LCBBREM1LlxuDQotICogICAgICAgICAgLSAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIGFsbCBBREN4IGFyZSBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzLg0KLSAqIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIG1vcmUgZGV0YWlscy4gKDgpIE9uIFNUTTMyRzQsIGZhc3QgY2hhbm5lbA0KLSAqIGFsbG93czogMi41IChzYW1wbGluZykgKyAxMi41IChjb252ZXJzaW9uKSA9IDE1IEFEQyBjbG9jayBjeWNsZXMgKGZBREMpIHRvDQotICogY29udmVydCBpbiAxMi1iaXQgcmVzb2x1dGlvbi4gT3RoZXIgY2hhbm5lbHMgYXJlIHNsb3cgY2hhbm5lbHMgIGFsbG93czogNi41DQotICogKHNhbXBsaW5nKSArIDEyLjUgKGNvbnZlcnNpb24pID0gMTkgQURDIGNsb2NrIGN5Y2xlcyAoZkFEQykgdG8gY29udmVydCBpbg0KLSAqIDEyLWJpdCByZXNvbHV0aW9uLlxuICgxLCAyLCAzLCA0LCA1LCA3KSBGb3IgQURDIGNoYW5uZWwgcmVhZCBiYWNrIGZyb20gQURDDQotICogcmVnaXN0ZXIsIGNvbXBhcmlzb24gd2l0aCBpbnRlcm5hbCBjaGFubmVsIHBhcmFtZXRlciB0byBiZSBkb25lIHVzaW5nIGhlbHBlcg0KLSAqIG1hY3JvIEByZWYgX19MTF9BRENfQ0hBTk5FTF9JTlRFUk5BTF9UT19FWFRFUk5BTCgpLg0KLSAqLw0KLSNkZWZpbmUgX19MTF9BRENfREVDSU1BTF9OQl9UT19DSEFOTkVMKF9fREVDSU1BTF9OQl9fKSAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKChfX0RFQ0lNQUxfTkJfXykgPD0gOVVMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgPyAoKChfX0RFQ0lNQUxfTkJfXykgPDwgQURDX0NIQU5ORUxfSURfTlVNQkVSX0JJVE9GRlNFVF9QT1MpIHwgICAgICAgXA0KLSAgICAgICAgICAoQURDX0FXRDJDUl9BV0QyQ0hfMCA8PCAoX19ERUNJTUFMX05CX18pKSB8ICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICAgIChBRENfU01QUjFfUkVHT0ZGU0VUIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgICgoKDNVTCAqIChfX0RFQ0lNQUxfTkJfXykpKSA8PCBBRENfQ0hBTk5FTF9TTVB4X0JJVE9GRlNFVF9QT1MpKSkgXA0KLSAgICAgICA6ICgoKF9fREVDSU1BTF9OQl9fKSA8PCBBRENfQ0hBTk5FTF9JRF9OVU1CRVJfQklUT0ZGU0VUX1BPUykgfCAgICAgICBcDQotICAgICAgICAgIChBRENfQVdEMkNSX0FXRDJDSF8wIDw8IChfX0RFQ0lNQUxfTkJfXykpIHwgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgKEFEQ19TTVBSMl9SRUdPRkZTRVQgfCAoKCgzVUwgKiAoKF9fREVDSU1BTF9OQl9fKS0xMFVMKSkpICAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBBRENfQ0hBTk5FTF9TTVB4X0JJVE9GRlNFVF9QT1MpKSkpDQotDQotLyoqDQotICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHNlbGVjdGVkIGNoYW5uZWwNCi0gKiAgICAgICAgIGNvcnJlc3BvbmRzIHRvIGxpdGVyYWwgZGVmaW5pdGlvbnMgb2YgZHJpdmVyLg0KLSAqIEBub3RlICAgVGhlIGRpZmZlcmVudCBsaXRlcmFsIGRlZmluaXRpb25zIG9mIEFEQyBjaGFubmVscyBhcmU6DQotICogICAgICAgICAtIEFEQyBpbnRlcm5hbCBjaGFubmVsOg0KLSAqICAgICAgICAgICBMTF9BRENfQ0hBTk5FTF9WUkVGSU5ULCBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SLCAuLi4NCi0gKiAgICAgICAgIC0gQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIGEgR1BJTyBwaW4pOg0KLSAqICAgICAgICAgICBMTF9BRENfQ0hBTk5FTF8xLCBMTF9BRENfQ0hBTk5FTF8yLCAuLi4NCi0gKiBAbm90ZSAgIFRoZSBjaGFubmVsIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgZGVmaW5lZCBmcm9tIGxpdGVyYWwNCi0gKiAgICAgICAgIGRlZmluaXRpb24gb2YgYSBBREMgaW50ZXJuYWwgY2hhbm5lbCAoTExfQURDX0NIQU5ORUxfVlJFRklOVCwNCi0gKiAgICAgICAgIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1IsIC4uLiksDQotICogICAgICAgICBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoTExfQURDX0NIQU5ORUxfMSwgTExfQURDX0NIQU5ORUxfMiwgLi4uKSwNCi0gKiAgICAgICAgIG11c3Qgbm90IGJlIGEgdmFsdWUgZnJvbSBmdW5jdGlvbnMgd2hlcmUgYSBjaGFubmVsIG51bWJlciBpcw0KLSAqICAgICAgICAgcmV0dXJuZWQgZnJvbSBBREMgcmVnaXN0ZXJzLA0KLSAqICAgICAgICAgYmVjYXVzZSBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgY2hhbm5lbHMgc2hhcmUgdGhlIHNhbWUgY2hhbm5lbA0KLSAqICAgICAgICAgbnVtYmVyIGluIEFEQyByZWdpc3RlcnMuIFRoZSBkaWZmZXJlbnRpYXRpb24gaXMgbWFkZSBvbmx5IHdpdGgNCi0gKiAgICAgICAgIHBhcmFtZXRlcnMgZGVmaW5pdGlvbnMgb2YgZHJpdmVyLg0KLSAqIEBwYXJhbSAgX19DSEFOTkVMX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8wDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMSAgICAgICAgICAgICAgICAgKDgpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMiAgICAgICAgICAgICAgICAgKDgpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMyAgICAgICAgICAgICAgICAgKDgpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNCAgICAgICAgICAgICAgICAgKDgpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNSAgICAgICAgICAgICAgICAgKDgpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF84DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEwDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEzDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE2DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQgICAgICAgICAgICg3KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1JfQURDMSAgICgxKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1JfQURDNSAgICg1KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZCQVQgICAgICAgICAgICAgICg2KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDEgICAgICAgICAgICgxKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDIgICAgICAgICAgICgyKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDNfQURDMiAgICAgICgyKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDNfQURDMyAgICAgICgzKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDQgICAgICAgICAgICg1KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDUgICAgICAgICAgICg1KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDYgICAgICAgICAgICg0KQ0KLSAqDQotICogICAgICAgICAoMSkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMS5cbg0KLSAqICAgICAgICAgKDIpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzIuXG4NCi0gKiAgICAgICAgICgzKSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMzLlxuDQotICogICAgICAgICAoNCkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDNC5cbg0KLSAqICAgICAgICAgKDUpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzUuXG4NCi0gKiAgICAgICAgICg2KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlczogQURDMSwNCi0gKiBBREMzLCBBREM1LlxuICg3KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlczoNCi0gKiBBREMxLCBBREMzLCBBREM0LCBBREM1LlxuDQotICogICAgICAgICAgLSAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIGFsbCBBREN4IGFyZSBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzLg0KLSAqIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIG1vcmUgZGV0YWlscy4gKDgpIE9uIFNUTTMyRzQsIGZhc3QgY2hhbm5lbA0KLSAqIGFsbG93czogMi41IChzYW1wbGluZykgKyAxMi41IChjb252ZXJzaW9uKSA9IDE1IEFEQyBjbG9jayBjeWNsZXMgKGZBREMpIHRvDQotICogY29udmVydCBpbiAxMi1iaXQgcmVzb2x1dGlvbi4gT3RoZXIgY2hhbm5lbHMgYXJlIHNsb3cgY2hhbm5lbHMgIGFsbG93czogNi41DQotICogKHNhbXBsaW5nKSArIDEyLjUgKGNvbnZlcnNpb24pID0gMTkgQURDIGNsb2NrIGN5Y2xlcyAoZkFEQykgdG8gY29udmVydCBpbg0KLSAqIDEyLWJpdCByZXNvbHV0aW9uLlxuDQotICogQHJldHZhbCBWYWx1ZSAiMCIgaWYgdGhlIGNoYW5uZWwgY29ycmVzcG9uZHMgdG8gYSBwYXJhbWV0ZXIgZGVmaW5pdGlvbiBvZiBhDQotICogQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIGEgR1BJTyBwaW4pLiBWYWx1ZSAiMSIgaWYgdGhlDQotICogY2hhbm5lbCBjb3JyZXNwb25kcyB0byBhIHBhcmFtZXRlciBkZWZpbml0aW9uIG9mIGEgQURDIGludGVybmFsIGNoYW5uZWwuDQotICovDQotI2RlZmluZSBfX0xMX0FEQ19JU19DSEFOTkVMX0lOVEVSTkFMKF9fQ0hBTk5FTF9fKSBcDQotICAoKChfX0NIQU5ORUxfXykgJiBBRENfQ0hBTk5FTF9JRF9JTlRFUk5BTF9DSF9NQVNLKSAhPSAwVUwpDQotDQotLyoqDQotICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gY29udmVydCBhIGNoYW5uZWwgZGVmaW5lZCBmcm9tIHBhcmFtZXRlcg0KLSAqICAgICAgICAgZGVmaW5pdGlvbiBvZiBhIEFEQyBpbnRlcm5hbCBjaGFubmVsIChMTF9BRENfQ0hBTk5FTF9WUkVGSU5ULA0KLSAqICAgICAgICAgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUiwgLi4uKSwNCi0gKiAgICAgICAgIHRvIGl0cyBlcXVpdmFsZW50IHBhcmFtZXRlciBkZWZpbml0aW9uIG9mIGEgQURDIGV4dGVybmFsIGNoYW5uZWwNCi0gKiAgICAgICAgIChMTF9BRENfQ0hBTk5FTF8xLCBMTF9BRENfQ0hBTk5FTF8yLCAuLi4pLg0KLSAqIEBub3RlICAgVGhlIGNoYW5uZWwgcGFyYW1ldGVyIGNhbiBiZSwgYWRkaXRpb25hbGx5IHRvIGEgdmFsdWUNCi0gKiAgICAgICAgIGRlZmluZWQgZnJvbSBwYXJhbWV0ZXIgZGVmaW5pdGlvbiBvZiBhIEFEQyBpbnRlcm5hbCBjaGFubmVsDQotICogICAgICAgICAoTExfQURDX0NIQU5ORUxfVlJFRklOVCwgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUiwgLi4uKSwNCi0gKiAgICAgICAgIGEgdmFsdWUgZGVmaW5lZCBmcm9tIHBhcmFtZXRlciBkZWZpbml0aW9uIG9mDQotICogICAgICAgICBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoTExfQURDX0NIQU5ORUxfMSwgTExfQURDX0NIQU5ORUxfMiwgLi4uKQ0KLSAqICAgICAgICAgb3IgYSB2YWx1ZSBmcm9tIGZ1bmN0aW9ucyB3aGVyZSBhIGNoYW5uZWwgbnVtYmVyIGlzIHJldHVybmVkDQotICogICAgICAgICBmcm9tIEFEQyByZWdpc3RlcnMuDQotICogQHBhcmFtICBfX0NIQU5ORUxfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xICAgICAgICAgICAgICAgICAoOCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8yICAgICAgICAgICAgICAgICAoOCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8zICAgICAgICAgICAgICAgICAoOCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF80ICAgICAgICAgICAgICAgICAoOCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF81ICAgICAgICAgICAgICAgICAoOCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF82DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF85DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEyDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE1DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE4DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVlJFRklOVCAgICAgICAgICAgKDcpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUl9BREMxICAgKDEpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUl9BREM1ICAgKDUpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVkJBVCAgICAgICAgICAgICAgKDYpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QMSAgICAgICAgICAgKDEpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QMiAgICAgICAgICAgKDIpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QM19BREMyICAgICAgKDIpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QM19BREMzICAgICAgKDMpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QNCAgICAgICAgICAgKDUpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QNSAgICAgICAgICAgKDUpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QNiAgICAgICAgICAgKDQpDQotICoNCi0gKiAgICAgICAgICgxKSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMxLlxuDQotICogICAgICAgICAoMikgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMi5cbg0KLSAqICAgICAgICAgKDMpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzMuXG4NCi0gKiAgICAgICAgICg0KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREM0LlxuDQotICogICAgICAgICAoNSkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDNS5cbg0KLSAqICAgICAgICAgKDYpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2VzOiBBREMxLA0KLSAqIEFEQzMsIEFEQzUuXG4gKDcpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2VzOg0KLSAqIEFEQzEsIEFEQzMsIEFEQzQsIEFEQzUuXG4NCi0gKiAgICAgICAgICAtICBPbiB0aGlzIFNUTTMyIHNlcmllcywgYWxsIEFEQ3ggYXJlIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuDQotICogUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgbW9yZSBkZXRhaWxzLiAoOCkgT24gU1RNMzJHNCwgZmFzdCBjaGFubmVsDQotICogYWxsb3dzOiAyLjUgKHNhbXBsaW5nKSArIDEyLjUgKGNvbnZlcnNpb24pID0gMTUgQURDIGNsb2NrIGN5Y2xlcyAoZkFEQykgdG8NCi0gKiBjb252ZXJ0IGluIDEyLWJpdCByZXNvbHV0aW9uLiBPdGhlciBjaGFubmVscyBhcmUgc2xvdyBjaGFubmVscyAgYWxsb3dzOiA2LjUNCi0gKiAoc2FtcGxpbmcpICsgMTIuNSAoY29udmVyc2lvbikgPSAxOSBBREMgY2xvY2sgY3ljbGVzIChmQURDKSB0byBjb252ZXJ0IGluDQotICogMTItYml0IHJlc29sdXRpb24uXG4NCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF81DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF84DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEwDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEzDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE2DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xOA0KLSAqLw0KLSNkZWZpbmUgX19MTF9BRENfQ0hBTk5FTF9JTlRFUk5BTF9UT19FWFRFUk5BTChfX0NIQU5ORUxfXykgXA0KLSAgKChfX0NIQU5ORUxfXykgJiB+QURDX0NIQU5ORUxfSURfSU5URVJOQUxfQ0hfTUFTSykNCi0NCi0vKioNCi0gKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgaW50ZXJuYWwgY2hhbm5lbA0KLSAqICAgICAgICAgc2VsZWN0ZWQgaXMgYXZhaWxhYmxlIG9uIHRoZSBBREMgaW5zdGFuY2Ugc2VsZWN0ZWQuDQotICogQG5vdGUgICBUaGUgY2hhbm5lbCBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGRlZmluZWQgZnJvbSBwYXJhbWV0ZXINCi0gKiAgICAgICAgIGRlZmluaXRpb24gb2YgYSBBREMgaW50ZXJuYWwgY2hhbm5lbCAoTExfQURDX0NIQU5ORUxfVlJFRklOVCwNCi0gKiAgICAgICAgIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1IsIC4uLiksDQotICogICAgICAgICBtdXN0IG5vdCBiZSBhIHZhbHVlIGRlZmluZWQgZnJvbSBwYXJhbWV0ZXIgZGVmaW5pdGlvbiBvZg0KLSAqICAgICAgICAgQURDIGV4dGVybmFsIGNoYW5uZWwgKExMX0FEQ19DSEFOTkVMXzEsIExMX0FEQ19DSEFOTkVMXzIsIC4uLikNCi0gKiAgICAgICAgIG9yIGEgdmFsdWUgZnJvbSBmdW5jdGlvbnMgd2hlcmUgYSBjaGFubmVsIG51bWJlciBpcw0KLSAqICAgICAgICAgcmV0dXJuZWQgZnJvbSBBREMgcmVnaXN0ZXJzLA0KLSAqICAgICAgICAgYmVjYXVzZSBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgY2hhbm5lbHMgc2hhcmUgdGhlIHNhbWUgY2hhbm5lbA0KLSAqICAgICAgICAgbnVtYmVyIGluIEFEQyByZWdpc3RlcnMuIFRoZSBkaWZmZXJlbnRpYXRpb24gaXMgbWFkZSBvbmx5IHdpdGgNCi0gKiAgICAgICAgIHBhcmFtZXRlcnMgZGVmaW5pdGlvbnMgb2YgZHJpdmVyLg0KLSAqIEBwYXJhbSAgX19BRENfSU5TVEFOQ0VfXyBBREMgaW5zdGFuY2UNCi0gKiBAcGFyYW0gIF9fQ0hBTk5FTF9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVlJFRklOVCAgICAgICAgICAgKDcpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUl9BREMxICAgKDEpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUl9BREM1ICAgKDUpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVkJBVCAgICAgICAgICAgICAgKDYpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QMSAgICAgICAgICAgKDEpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QMiAgICAgICAgICAgKDIpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QM19BREMyICAgICAgKDIpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QM19BREMzICAgICAgKDMpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QNCAgICAgICAgICAgKDUpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QNSAgICAgICAgICAgKDUpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QNiAgICAgICAgICAgKDQpDQotICoNCi0gKiAgICAgICAgICgxKSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMxLlxuDQotICogICAgICAgICAoMikgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMi5cbg0KLSAqICAgICAgICAgKDMpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzMuXG4NCi0gKiAgICAgICAgICg0KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREM0LlxuDQotICogICAgICAgICAoNSkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDNS5cbg0KLSAqICAgICAgICAgKDYpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2VzOiBBREMxLA0KLSAqIEFEQzMsIEFEQzUuXG4gKDcpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2VzOg0KLSAqIEFEQzEsIEFEQzMsIEFEQzQsIEFEQzUuXG4NCi0gKiAgICAgICAgICAtICBPbiB0aGlzIFNUTTMyIHNlcmllcywgYWxsIEFEQ3ggYXJlIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuDQotICogUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgbW9yZSBkZXRhaWxzLg0KLSAqIEByZXR2YWwgVmFsdWUgIjAiIGlmIHRoZSBpbnRlcm5hbCBjaGFubmVsIHNlbGVjdGVkIGlzIG5vdCBhdmFpbGFibGUgb24gdGhlDQotICogQURDIGluc3RhbmNlIHNlbGVjdGVkLiBWYWx1ZSAiMSIgaWYgdGhlIGludGVybmFsIGNoYW5uZWwgc2VsZWN0ZWQgaXMNCi0gKiBhdmFpbGFibGUgb24gdGhlIEFEQyBpbnN0YW5jZSBzZWxlY3RlZC4NCi0gKi8NCi0jaWYgZGVmaW5lZChTVE0zMkc0NzR4eCkgfHwgZGVmaW5lZChTVE0zMkc0ODR4eCkgfHwgZGVmaW5lZChTVE0zMkc0NzN4eCkgfHwgXA0KLSAgICBkZWZpbmVkKFNUTTMyRzQ4M3h4KQ0KLSNkZWZpbmUgX19MTF9BRENfSVNfQ0hBTk5FTF9JTlRFUk5BTF9BVkFJTEFCTEUoX19BRENfSU5TVEFOQ0VfXywgX19DSEFOTkVMX18pIFwNCi0gICgoKChfX0FEQ19JTlNUQU5DRV9fKSA9PSBBREMxKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICgoKF9fQ0hBTk5FTF9fKSA9PSBMTF9BRENfQ0hBTk5FTF9WT1BBTVAxKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX0NIQU5ORUxfXykgPT0gTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUl9BREMxKSB8fCAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19DSEFOTkVMX18pID09IExMX0FEQ19DSEFOTkVMX1ZCQVQpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBMTF9BRENfQ0hBTk5FTF9WUkVGSU5UKSkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoKF9fQURDX0lOU1RBTkNFX18pID09IEFEQzIpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgKCgoX19DSEFOTkVMX18pID09IExMX0FEQ19DSEFOTkVMX1ZPUEFNUDIpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBMTF9BRENfQ0hBTk5FTF9WT1BBTVAzX0FEQzIpKSkgfHwgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoKF9fQURDX0lOU1RBTkNFX18pID09IEFEQzMpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgKCgoX19DSEFOTkVMX18pID09IExMX0FEQ19DSEFOTkVMX1ZPUEFNUDNfQURDMykgfHwgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBMTF9BRENfQ0hBTk5FTF9WQkFUKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX0NIQU5ORUxfXykgPT0gTExfQURDX0NIQU5ORUxfVlJFRklOVCkpKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKChfX0FEQ19JTlNUQU5DRV9fKSA9PSBBREM0KSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICgoKF9fQ0hBTk5FTF9fKSA9PSBMTF9BRENfQ0hBTk5FTF9WT1BBTVA2KSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX0NIQU5ORUxfXykgPT0gTExfQURDX0NIQU5ORUxfVlJFRklOVCkpKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKChfX0FEQ19JTlNUQU5DRV9fKSA9PSBBREM1KSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICgoKF9fQ0hBTk5FTF9fKSA9PSBMTF9BRENfQ0hBTk5FTF9WT1BBTVA1KSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX0NIQU5ORUxfXykgPT0gTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUl9BREM1KSB8fCAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19DSEFOTkVMX18pID09IExMX0FEQ19DSEFOTkVMX1ZPUEFNUDQpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBMTF9BRENfQ0hBTk5FTF9WQkFUKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX0NIQU5ORUxfXykgPT0gTExfQURDX0NIQU5ORUxfVlJFRklOVCkpKSkNCi0jZWxpZiBkZWZpbmVkKFNUTTMyRzQ3MXh4KQ0KLSNkZWZpbmUgX19MTF9BRENfSVNfQ0hBTk5FTF9JTlRFUk5BTF9BVkFJTEFCTEUoX19BRENfSU5TVEFOQ0VfXywgX19DSEFOTkVMX18pIFwNCi0gICgoKChfX0FEQ19JTlNUQU5DRV9fKSA9PSBBREMxKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICgoKF9fQ0hBTk5FTF9fKSA9PSBMTF9BRENfQ0hBTk5FTF9WT1BBTVAxKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX0NIQU5ORUxfXykgPT0gTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUl9BREMxKSB8fCAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19DSEFOTkVMX18pID09IExMX0FEQ19DSEFOTkVMX1ZCQVQpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBMTF9BRENfQ0hBTk5FTF9WUkVGSU5UKSkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoKF9fQURDX0lOU1RBTkNFX18pID09IEFEQzIpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgKCgoX19DSEFOTkVMX18pID09IExMX0FEQ19DSEFOTkVMX1ZPUEFNUDIpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBMTF9BRENfQ0hBTk5FTF9WT1BBTVAzX0FEQzIpKSkgfHwgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoKF9fQURDX0lOU1RBTkNFX18pID09IEFEQzMpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgKCgoX19DSEFOTkVMX18pID09IExMX0FEQ19DSEFOTkVMX1ZPUEFNUDNfQURDMykgfHwgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBMTF9BRENfQ0hBTk5FTF9WQkFUKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX0NIQU5ORUxfXykgPT0gTExfQURDX0NIQU5ORUxfVlJFRklOVCkpKSkNCi0jZWxpZiBkZWZpbmVkKFNUTTMyR0JLMUNCKSB8fCBkZWZpbmVkKFNUTTMyRzQzMXh4KSB8fCBkZWZpbmVkKFNUTTMyRzQ0MXh4KQ0KLSNkZWZpbmUgX19MTF9BRENfSVNfQ0hBTk5FTF9JTlRFUk5BTF9BVkFJTEFCTEUoX19BRENfSU5TVEFOQ0VfXywgX19DSEFOTkVMX18pIFwNCi0gICgoKChfX0FEQ19JTlNUQU5DRV9fKSA9PSBBREMxKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICgoKF9fQ0hBTk5FTF9fKSA9PSBMTF9BRENfQ0hBTk5FTF9WT1BBTVAxKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX0NIQU5ORUxfXykgPT0gTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUl9BREMxKSB8fCAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19DSEFOTkVMX18pID09IExMX0FEQ19DSEFOTkVMX1ZCQVQpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBMTF9BRENfQ0hBTk5FTF9WUkVGSU5UKSkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoKF9fQURDX0lOU1RBTkNFX18pID09IEFEQzIpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgKCgoX19DSEFOTkVMX18pID09IExMX0FEQ19DSEFOTkVMX1ZPUEFNUDIpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBMTF9BRENfQ0hBTk5FTF9WT1BBTVAzX0FEQzIpKSkpDQotI2VsaWYgZGVmaW5lZChTVE0zMkc0OTF4eCkgfHwgZGVmaW5lZChTVE0zMkc0QTF4eCkNCi0jZGVmaW5lIF9fTExfQURDX0lTX0NIQU5ORUxfSU5URVJOQUxfQVZBSUxBQkxFKF9fQURDX0lOU1RBTkNFX18sIF9fQ0hBTk5FTF9fKSBcDQotICAoKCgoX19BRENfSU5TVEFOQ0VfXykgPT0gQURDMSkgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAoKChfX0NIQU5ORUxfXykgPT0gTExfQURDX0NIQU5ORUxfVk9QQU1QMSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19DSEFOTkVMX18pID09IExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1JfQURDMSkgfHwgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBMTF9BRENfQ0hBTk5FTF9WQkFUKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX0NIQU5ORUxfXykgPT0gTExfQURDX0NIQU5ORUxfVlJFRklOVCkpKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKChfX0FEQ19JTlNUQU5DRV9fKSA9PSBBREMyKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICgoKF9fQ0hBTk5FTF9fKSA9PSBMTF9BRENfQ0hBTk5FTF9WT1BBTVAyKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX0NIQU5ORUxfXykgPT0gTExfQURDX0NIQU5ORUxfVk9QQU1QM19BREMyKSkpIHx8ICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKChfX0FEQ19JTlNUQU5DRV9fKSA9PSBBREMzKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICgoKF9fQ0hBTk5FTF9fKSA9PSBMTF9BRENfQ0hBTk5FTF9WT1BBTVAzX0FEQzMpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKChfX0NIQU5ORUxfXykgPT0gTExfQURDX0NIQU5ORUxfVk9QQU1QNikgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICgoX19DSEFOTkVMX18pID09IExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQpKSkpDQotI2VuZGlmDQotDQotLyoqDQotICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gZGVmaW5lIEFEQyBhbmFsb2cgd2F0Y2hkb2cgcGFyYW1ldGVyOg0KLSAqICAgICAgICAgZGVmaW5lIGEgc2luZ2xlIGNoYW5uZWwgdG8gbW9uaXRvciB3aXRoIGFuYWxvZyB3YXRjaGRvZw0KLSAqICAgICAgICAgZnJvbSBzZXF1ZW5jZXIgY2hhbm5lbCBhbmQgZ3JvdXBzIGRlZmluaXRpb24uDQotICogQG5vdGUgICBUbyBiZSB1c2VkIHdpdGggZnVuY3Rpb24gQHJlZiBMTF9BRENfU2V0QW5hbG9nV0RNb25pdENoYW5uZWxzKCkuDQotICogICAgICAgICBFeGFtcGxlOg0KLSAqICAgICAgICAgICBMTF9BRENfU2V0QW5hbG9nV0RNb25pdENoYW5uZWxzKA0KLSAqICAgICAgICAgICAgIEFEQzEsIExMX0FEQ19BV0QxLA0KLSAqICAgICAgICAgICAgIF9fTExfQURDX0FOQUxPR1dEX0NIQU5ORUxfR1JPVVAoTExfQURDX0NIQU5ORUw0LA0KLSAqIExMX0FEQ19HUk9VUF9SRUdVTEFSKSkNCi0gKiBAcGFyYW0gIF9fQ0hBTk5FTF9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEgICAgICAgICAgICAgICAgICg4KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzIgICAgICAgICAgICAgICAgICg4KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzMgICAgICAgICAgICAgICAgICg4KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzQgICAgICAgICAgICAgICAgICg4KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzUgICAgICAgICAgICAgICAgICg4KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF83DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzExDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE0DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE3DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WUkVGSU5UICAgICAgICAgICAoNykNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SX0FEQzEgICAoMSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SX0FEQzUgICAoNSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WQkFUICAgICAgICAgICAgICAoNikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAxICAgICAgICAgICAoMSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAyICAgICAgICAgICAoMikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAzX0FEQzIgICAgICAoMikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAzX0FEQzMgICAgICAoMykNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVA0ICAgICAgICAgICAoNSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVA1ICAgICAgICAgICAoNSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVA2ICAgICAgICAgICAoNCkNCi0gKg0KLSAqICAgICAgICAgKDEpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzEuXG4NCi0gKiAgICAgICAgICgyKSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMyLlxuDQotICogICAgICAgICAoMykgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMy5cbg0KLSAqICAgICAgICAgKDQpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzQuXG4NCi0gKiAgICAgICAgICg1KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREM1LlxuDQotICogICAgICAgICAoNikgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZXM6IEFEQzEsDQotICogQURDMywgQURDNS5cbiAoNykgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZXM6DQotICogQURDMSwgQURDMywgQURDNCwgQURDNS5cbg0KLSAqICAgICAgICAgIC0gIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBhbGwgQURDeCBhcmUgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlcy4NCi0gKiBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBtb3JlIGRldGFpbHMuICg4KSBPbiBTVE0zMkc0LCBmYXN0IGNoYW5uZWwNCi0gKiBhbGxvd3M6IDIuNSAoc2FtcGxpbmcpICsgMTIuNSAoY29udmVyc2lvbikgPSAxNSBBREMgY2xvY2sgY3ljbGVzIChmQURDKSB0bw0KLSAqIGNvbnZlcnQgaW4gMTItYml0IHJlc29sdXRpb24uIE90aGVyIGNoYW5uZWxzIGFyZSBzbG93IGNoYW5uZWxzICBhbGxvd3M6IDYuNQ0KLSAqIChzYW1wbGluZykgKyAxMi41IChjb252ZXJzaW9uKSA9IDE5IEFEQyBjbG9jayBjeWNsZXMgKGZBREMpIHRvIGNvbnZlcnQgaW4NCi0gKiAxMi1iaXQgcmVzb2x1dGlvbi5cbiAoMSwgMiwgMywgNCwgNSwgNykgRm9yIEFEQyBjaGFubmVsIHJlYWQgYmFjayBmcm9tIEFEQw0KLSAqIHJlZ2lzdGVyLCBjb21wYXJpc29uIHdpdGggaW50ZXJuYWwgY2hhbm5lbCBwYXJhbWV0ZXIgdG8gYmUgZG9uZSB1c2luZyBoZWxwZXINCi0gKiBtYWNybyBAcmVmIF9fTExfQURDX0NIQU5ORUxfSU5URVJOQUxfVE9fRVhURVJOQUwoKS4NCi0gKiBAcGFyYW0gIF9fR1JPVVBfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19HUk9VUF9SRUdVTEFSDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0dST1VQX0lOSkVDVEVEDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0dST1VQX1JFR1VMQVJfSU5KRUNURUQNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9ESVNBQkxFDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9BTExfQ0hBTk5FTFNfUkVHICAgICAgICAoMCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0FMTF9DSEFOTkVMU19JTkogICAgICAgICgwKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQUxMX0NIQU5ORUxTX1JFR19JTkoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMF9SRUcgICAgICAgICAgICgwKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8wX0lOSiAgICAgICAgICAgKDApDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzBfUkVHX0lOSg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xX1JFRyAgICAgICAgICAgKDApDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzFfSU5KICAgICAgICAgICAoMCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMV9SRUdfSU5KDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzJfUkVHICAgICAgICAgICAoMCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMl9JTkogICAgICAgICAgICgwKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8yX1JFR19JTkoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfM19SRUcgICAgICAgICAgICgwKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8zX0lOSiAgICAgICAgICAgKDApDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzNfUkVHX0lOSg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF80X1JFRyAgICAgICAgICAgKDApDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzRfSU5KICAgICAgICAgICAoMCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfNF9SRUdfSU5KDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzVfUkVHICAgICAgICAgICAoMCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfNV9JTkogICAgICAgICAgICgwKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF81X1JFR19JTkoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfNl9SRUcgICAgICAgICAgICgwKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF82X0lOSiAgICAgICAgICAgKDApDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzZfUkVHX0lOSg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF83X1JFRyAgICAgICAgICAgKDApDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzdfSU5KICAgICAgICAgICAoMCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfN19SRUdfSU5KDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzhfUkVHICAgICAgICAgICAoMCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfOF9JTkogICAgICAgICAgICgwKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF84X1JFR19JTkoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfOV9SRUcgICAgICAgICAgICgwKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF85X0lOSiAgICAgICAgICAgKDApDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzlfUkVHX0lOSg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xMF9SRUcgICAgICAgICAgKDApDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzEwX0lOSiAgICAgICAgICAoMCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTBfUkVHX0lOSg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xMV9SRUcgICAgICAgICAgKDApDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzExX0lOSiAgICAgICAgICAoMCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTFfUkVHX0lOSg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xMl9SRUcgICAgICAgICAgKDApDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzEyX0lOSiAgICAgICAgICAoMCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTJfUkVHX0lOSg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xM19SRUcgICAgICAgICAgKDApDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzEzX0lOSiAgICAgICAgICAoMCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTNfUkVHX0lOSg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xNF9SRUcgICAgICAgICAgKDApDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE0X0lOSiAgICAgICAgICAoMCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTRfUkVHX0lOSg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xNV9SRUcgICAgICAgICAgKDApDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE1X0lOSiAgICAgICAgICAoMCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTVfUkVHX0lOSg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xNl9SRUcgICAgICAgICAgKDApDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE2X0lOSiAgICAgICAgICAoMCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTZfUkVHX0lOSg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xN19SRUcgICAgICAgICAgKDApDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE3X0lOSiAgICAgICAgICAoMCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTdfUkVHX0lOSg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xOF9SRUcgICAgICAgICAgKDApDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE4X0lOSiAgICAgICAgICAoMCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMThfUkVHX0lOSg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVlJFRklOVF9SRUcgICAgICAgICAgKDApDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9WUkVGSU5UX0lOSiAgICAgICAgICAoMCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZSRUZJTlRfUkVHX0lOSg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVEVNUFNFTlNPUl9BREMxX1JFRyAgKDApKDEpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9URU1QU0VOU09SX0FEQzFfSU5KICAoMCkoMSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1RFTVBTRU5TT1JfQURDMV9SRUdfSU5KICgxKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVEVNUFNFTlNPUl9BREM1X1JFRyAgKDApKDUpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9URU1QU0VOU09SX0FEQzVfSU5KICAoMCkoNSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1RFTVBTRU5TT1JfQURDNV9SRUdfSU5KICg1KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVkJBVF9SRUcgICAgICAgICAgICAgKDApKDYpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9WQkFUX0lOSiAgICAgICAgICAgICAoMCkoNikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZCQVRfUkVHX0lOSiAgICAgICAgICAgICg2KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVk9QQU1QMV9SRUcgICAgICAgICAgKDApKDEpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9WT1BBTVAxX0lOSiAgICAgICAgICAoMCkoMSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZPUEFNUDFfUkVHX0lOSiAgICAgICAgICgxKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVk9QQU1QMl9SRUcgICAgICAgICAgKDApKDIpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9WT1BBTVAyX0lOSiAgICAgICAgICAoMCkoMikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZPUEFNUDJfUkVHX0lOSiAgICAgICAgICgyKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVk9QQU1QM19BREMyX1JFRyAgICAgKDApKDIpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9WT1BBTVAzX0FEQzJfSU5KICAgICAoMCkoMikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZPUEFNUDNfQURDMl9SRUdfSU5KICAgICgyKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVk9QQU1QM19BREMzX1JFRyAgICAgKDApKDMpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9WT1BBTVAzX0FEQzNfSU5KICAgICAoMCkoMykNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZPUEFNUDNfQURDM19SRUdfSU5KICAgICgzKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVk9QQU1QNF9SRUcgICAgICAgICAgKDApKDUpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9WT1BBTVA0X0lOSiAgICAgICAgICAoMCkoNSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZPUEFNUDRfUkVHX0lOSiAgICAgICAgICg1KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVk9QQU1QNV9SRUcgICAgICAgICAgKDApKDUpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9WT1BBTVA1X0lOSiAgICAgICAgICAoMCkoNSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZPUEFNUDVfUkVHX0lOSiAgICAgICAgICg1KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVk9QQU1QNl9SRUcgICAgICAgICAgKDApKDQpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9WT1BBTVA2X0lOSiAgICAgICAgICAoMCkoNCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZPUEFNUDZfUkVHX0lOSiAgICAgICAgICg0KQ0KLSAqDQotICogICAgICAgICAoMCkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIGFuYWxvZyB3YXRjaGRvZyBudW1iZXI6DQotICogQVdEMS5cbiAoMSkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMS5cbiAoMikNCi0gKiBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMyLlxuICgzKSBPbiBTVE0zMkc0LA0KLSAqIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzMuXG4gKDQpIE9uIFNUTTMyRzQsIHBhcmFtZXRlcg0KLSAqIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDNC5cbiAoNSkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZQ0KLSAqIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREM1LlxuICg2KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDDQotICogaW5zdGFuY2VzOiBBREMxLCBBREMzLCBBREM1LlxuICg3KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24NCi0gKiBBREMgaW5zdGFuY2VzOiBBREMxLCBBREMzLCBBREM0LCBBREM1LlxuDQotICogICAgICAgICAgLSAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIGFsbCBBREN4IGFyZSBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzLg0KLSAqIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIG1vcmUgZGV0YWlscy4NCi0gKi8NCi0jZGVmaW5lIF9fTExfQURDX0FOQUxPR1dEX0NIQU5ORUxfR1JPVVAoX19DSEFOTkVMX18sIF9fR1JPVVBfXykgICAgICBcDQotICAoKChfX0dST1VQX18pID09IExMX0FEQ19HUk9VUF9SRUdVTEFSKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICA/ICgoKF9fQ0hBTk5FTF9fKSAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfQVdEMUVOIHwgIFwNCi0gICAgICAgICAgQURDX0NGR1JfQVdEMVNHTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgOiAoKF9fR1JPVVBfXykgPT0gTExfQURDX0dST1VQX0lOSkVDVEVEKSAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICA/ICgoKF9fQ0hBTk5FTF9fKSAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8IFwNCi0gICAgICAgICAgQURDX0NGR1JfQVdEMVNHTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgIDogKCgoX19DSEFOTkVMX18pICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgXA0KLSAgICAgICAgICBBRENfQ0ZHUl9BV0QxRU4gfCBBRENfQ0ZHUl9BV0QxU0dMKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBzZXQgdGhlIHZhbHVlIG9mIEFEQyBhbmFsb2cgd2F0Y2hkb2cgdGhyZXNob2xkIGhpZ2gNCi0gKiAgICAgICAgIG9yIGxvdyBpbiBmdW5jdGlvbiBvZiBBREMgcmVzb2x1dGlvbiwgd2hlbiBBREMgcmVzb2x1dGlvbiBpcw0KLSAqICAgICAgICAgZGlmZmVyZW50IG9mIDEyIGJpdHMuDQotICogQG5vdGUgICBUbyBiZSB1c2VkIHdpdGggZnVuY3Rpb24gQHJlZiBMTF9BRENfQ29uZmlnQW5hbG9nV0RUaHJlc2hvbGRzKCkNCi0gKiAgICAgICAgIG9yIEByZWYgTExfQURDX1NldEFuYWxvZ1dEVGhyZXNob2xkcygpLg0KLSAqICAgICAgICAgRXhhbXBsZSwgd2l0aCBhIEFEQyByZXNvbHV0aW9uIG9mIDggYml0cywgdG8gc2V0IHRoZSB2YWx1ZSBvZg0KLSAqICAgICAgICAgYW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZCBoaWdoIChvbiA4IGJpdHMpOg0KLSAqICAgICAgICAgICBMTF9BRENfU2V0QW5hbG9nV0RUaHJlc2hvbGRzDQotICogICAgICAgICAgICAoPCBBREN4IHBhcmFtID4sDQotICogICAgICAgICAgICAgX19MTF9BRENfQU5BTE9HV0RfU0VUX1RIUkVTSE9MRF9SRVNPTFVUSU9OKExMX0FEQ19SRVNPTFVUSU9OXzhCLA0KLSAqIDx0aHJlc2hvbGRfdmFsdWVfOF9iaXRzPikNCi0gKiAgICAgICAgICAgICk7DQotICogQHBhcmFtICBfX0FEQ19SRVNPTFVUSU9OX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl8xMkINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl8xMEINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl84Qg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzZCDQotICogQHBhcmFtICBfX0FXRF9USFJFU0hPTERfXyBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwIGFuZCBNYXhfRGF0YT0weEZGRg0KLSAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMCBhbmQgTWF4X0RhdGE9MHhGRkYNCi0gKi8NCi0jZGVmaW5lIF9fTExfQURDX0FOQUxPR1dEX1NFVF9USFJFU0hPTERfUkVTT0xVVElPTihfX0FEQ19SRVNPTFVUSU9OX18sIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0FXRF9USFJFU0hPTERfXykgIFwNCi0gICgoX19BV0RfVEhSRVNIT0xEX18pIDw8ICgoX19BRENfUkVTT0xVVElPTl9fKSA+PiAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoQURDX0NGR1JfUkVTX0JJVE9GRlNFVF9QT1MgLSAxVSkpKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGdldCB0aGUgdmFsdWUgb2YgQURDIGFuYWxvZyB3YXRjaGRvZyB0aHJlc2hvbGQgaGlnaA0KLSAqICAgICAgICAgb3IgbG93IGluIGZ1bmN0aW9uIG9mIEFEQyByZXNvbHV0aW9uLCB3aGVuIEFEQyByZXNvbHV0aW9uIGlzDQotICogICAgICAgICBkaWZmZXJlbnQgb2YgMTIgYml0cy4NCi0gKiBAbm90ZSAgIFRvIGJlIHVzZWQgd2l0aCBmdW5jdGlvbiBAcmVmIExMX0FEQ19HZXRBbmFsb2dXRFRocmVzaG9sZHMoKS4NCi0gKiAgICAgICAgIEV4YW1wbGUsIHdpdGggYSBBREMgcmVzb2x1dGlvbiBvZiA4IGJpdHMsIHRvIGdldCB0aGUgdmFsdWUgb2YNCi0gKiAgICAgICAgIGFuYWxvZyB3YXRjaGRvZyB0aHJlc2hvbGQgaGlnaCAob24gOCBiaXRzKToNCi0gKiAgICAgICAgICAgPCB0aHJlc2hvbGRfdmFsdWVfNl9iaXRzID4gPQ0KLSAqIF9fTExfQURDX0FOQUxPR1dEX0dFVF9USFJFU0hPTERfUkVTT0xVVElPTiAoTExfQURDX1JFU09MVVRJT05fOEIsDQotICogICAgICAgICAgICAgTExfQURDX0dldEFuYWxvZ1dEVGhyZXNob2xkcyg8QURDeCBwYXJhbT4sDQotICogTExfQURDX0FXRF9USFJFU0hPTERfSElHSCkNCi0gKiAgICAgICAgICAgICk7DQotICogQHBhcmFtICBfX0FEQ19SRVNPTFVUSU9OX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl8xMkINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl8xMEINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl84Qg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzZCDQotICogQHBhcmFtICBfX0FXRF9USFJFU0hPTERfMTJfQklUU19fIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMDAgYW5kDQotICogTWF4X0RhdGE9MHhGRkYNCi0gKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMDAgYW5kIE1heF9EYXRhPTB4RkZGDQotICovDQotI2RlZmluZSBfX0xMX0FEQ19BTkFMT0dXRF9HRVRfVEhSRVNIT0xEX1JFU09MVVRJT04oX19BRENfUkVTT0xVVElPTl9fLCAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fQVdEX1RIUkVTSE9MRF8xMl9CSVRTX18pIFwNCi0gICgoX19BV0RfVEhSRVNIT0xEXzEyX0JJVFNfXykgPj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKChfX0FEQ19SRVNPTFVUSU9OX18pID4+IChBRENfQ0ZHUl9SRVNfQklUT0ZGU0VUX1BPUyAtIDFVKSkpDQotDQotLyoqDQotICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gZ2V0IHRoZSBBREMgYW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZCBoaWdoDQotICogICAgICAgICBvciBsb3cgZnJvbSByYXcgdmFsdWUgY29udGFpbmluZyBib3RoIHRocmVzaG9sZHMgY29uY2F0ZW5hdGVkLg0KLSAqIEBub3RlICAgVG8gYmUgdXNlZCB3aXRoIGZ1bmN0aW9uIEByZWYgTExfQURDX0dldEFuYWxvZ1dEVGhyZXNob2xkcygpLg0KLSAqICAgICAgICAgRXhhbXBsZSwgdG8gZ2V0IGFuYWxvZyB3YXRjaGRvZyB0aHJlc2hvbGQgaGlnaCBmcm9tIHRoZSByZWdpc3RlciByYXcNCi0gKiB2YWx1ZToNCi0gKiAgICAgICAgICAgX19MTF9BRENfQU5BTE9HV0RfVEhSRVNIT0xEU19ISUdIX0xPVyhMTF9BRENfQVdEX1RIUkVTSE9MRF9ISUdILA0KLSAqIDxyYXdfdmFsdWVfd2l0aF9ib3RoX3RocmVzaG9sZHM+KTsNCi0gKiBAcGFyYW0gIF9fQVdEX1RIUkVTSE9MRF9UWVBFX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nDQotICogdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfVEhSRVNIT0xEX0hJR0gNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX1RIUkVTSE9MRF9MT1cNCi0gKiBAcGFyYW0gIF9fQVdEX1RIUkVTSE9MRFNfXyBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwMDAwMDAgYW5kDQotICogTWF4X0RhdGE9MHhGRkZGRkZGRg0KLSAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMCBhbmQgTWF4X0RhdGE9MHhGRkYNCi0gKi8NCi0jZGVmaW5lIF9fTExfQURDX0FOQUxPR1dEX1RIUkVTSE9MRFNfSElHSF9MT1coX19BV0RfVEhSRVNIT0xEX1RZUEVfXywgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0FXRF9USFJFU0hPTERTX18pICAgICBcDQotICAoKChfX0FXRF9USFJFU0hPTERTX18pID4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgKCgoX19BV0RfVEhSRVNIT0xEX1RZUEVfXykgJiBBRENfQVdEX1RSWF9CSVRfSElHSF9NQVNLKSA+PiAgICAgICAgXA0KLSAgICAgQURDX0FXRF9UUlhfQklUX0hJR0hfU0hJRlQ0KSkgJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgTExfQURDX0FXRF9USFJFU0hPTERfTE9XKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIHNldCB0aGUgQURDIGNhbGlicmF0aW9uIHZhbHVlIHdpdGggYm90aCBzaW5nbGUgZW5kZWQNCi0gKiAgICAgICAgIGFuZCBkaWZmZXJlbnRpYWwgbW9kZXMgY2FsaWJyYXRpb24gZmFjdG9ycyBjb25jYXRlbmF0ZWQuDQotICogQG5vdGUgICBUbyBiZSB1c2VkIHdpdGggZnVuY3Rpb24gQHJlZiBMTF9BRENfU2V0Q2FsaWJyYXRpb25GYWN0b3IoKS4NCi0gKiAgICAgICAgIEV4YW1wbGUsIHRvIHNldCBjYWxpYnJhdGlvbiBmYWN0b3JzIHNpbmdsZSBlbmRlZCB0byAweDU1DQotICogICAgICAgICBhbmQgZGlmZmVyZW50aWFsIGVuZGVkIHRvIDB4MkE6DQotICogICAgICAgICAgIExMX0FEQ19TZXRDYWxpYnJhdGlvbkZhY3RvcigNCi0gKiAgICAgICAgICAgICBBREMxLA0KLSAqICAgICAgICAgICAgIF9fTExfQURDX0NBTElCX0ZBQ1RPUl9TSU5HTEVfRElGRigweDU1LCAweDJBKSkNCi0gKiBAcGFyYW0gIF9fQ0FMSUJfRkFDVE9SX1NJTkdMRV9FTkRFRF9fIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQNCi0gKiBNYXhfRGF0YT0weDdGDQotICogQHBhcmFtICBfX0NBTElCX0ZBQ1RPUl9ESUZGRVJFTlRJQUxfXyBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kDQotICogTWF4X0RhdGE9MHg3Rg0KLSAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMDAwMDAwIGFuZCBNYXhfRGF0YT0weEZGRkZGRkZGDQotICovDQotI2RlZmluZSBfX0xMX0FEQ19DQUxJQl9GQUNUT1JfU0lOR0xFX0RJRkYoX19DQUxJQl9GQUNUT1JfU0lOR0xFX0VOREVEX18sIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0NBTElCX0ZBQ1RPUl9ESUZGRVJFTlRJQUxfXykgXA0KLSAgKCgoX19DQUxJQl9GQUNUT1JfRElGRkVSRU5USUFMX18pIDw8IEFEQ19DQUxGQUNUX0NBTEZBQ1RfRF9Qb3MpIHwgICAgICBcDQotICAgKF9fQ0FMSUJfRkFDVE9SX1NJTkdMRV9FTkRFRF9fKSkNCi0NCi0jaWYgZGVmaW5lZChBRENfTVVMVElNT0RFX1NVUFBPUlQpDQotLyoqDQotICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gZ2V0IHRoZSBBREMgbXVsdGltb2RlIGNvbnZlcnNpb24gZGF0YSBvZiBBREMgbWFzdGVyDQotICogICAgICAgICBvciBBREMgc2xhdmUgZnJvbSByYXcgdmFsdWUgd2l0aCBib3RoIEFEQyBjb252ZXJzaW9uIGRhdGENCi0gKiBjb25jYXRlbmF0ZWQuDQotICogQG5vdGUgICBUaGlzIG1hY3JvIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgd2hlbiBtdWx0aW1vZGUgdHJhbnNmZXIgYnkgRE1BDQotICogICAgICAgICBpcyBlbmFibGVkOiByZWZlciB0byBmdW5jdGlvbiBAcmVmIExMX0FEQ19TZXRNdWx0aURNQVRyYW5zZmVyKCkuDQotICogICAgICAgICBJbiB0aGlzIGNhc2UgdGhlIHRyYW5zZmVycmVkIGRhdGEgbmVlZCB0byBwcm9jZXNzZWQgd2l0aCB0aGlzIG1hY3JvDQotICogICAgICAgICB0byBzZXBhcmF0ZSB0aGUgY29udmVyc2lvbiBkYXRhIG9mIEFEQyBtYXN0ZXIgYW5kIEFEQyBzbGF2ZS4NCi0gKiBAcGFyYW0gIF9fQURDX01VTFRJX01BU1RFUl9TTEFWRV9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZw0KLSAqIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfTUFTVEVSDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX1NMQVZFDQotICogQHBhcmFtICBfX0FEQ19NVUxUSV9DT05WX0RBVEFfXyBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwIGFuZA0KLSAqIE1heF9EYXRhPTB4RkZGDQotICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwIGFuZCBNYXhfRGF0YT0weEZGRg0KLSAqLw0KLSNkZWZpbmUgX19MTF9BRENfTVVMVElfQ09OVl9EQVRBX01BU1RFUl9TTEFWRShfX0FEQ19NVUxUSV9NQVNURVJfU0xBVkVfXywgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0FEQ19NVUxUSV9DT05WX0RBVEFfXykgICAgXA0KLSAgKCgoX19BRENfTVVMVElfQ09OVl9EQVRBX18pID4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAoKEFEQ19DRFJfUkRBVEFfU0xWX1BvcykgJiB+KF9fQURDX01VTFRJX01BU1RFUl9TTEFWRV9fKSkpICYgICAgICAgICAgXA0KLSAgIEFEQ19DRFJfUkRBVEFfTVNUKQ0KLSNlbmRpZiAvKiBBRENfTVVMVElNT0RFX1NVUFBPUlQgKi8NCi0NCi0jaWYgZGVmaW5lZChBRENfTVVMVElNT0RFX1NVUFBPUlQpDQotLyoqDQotICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gc2VsZWN0LCBmcm9tIGEgQURDIGluc3RhbmNlLCB0byB3aGljaCBBREMgaW5zdGFuY2UNCi0gKiAgICAgICAgIGl0IGhhcyBhIGRlcGVuZGVuY2UgaW4gbXVsdGltb2RlIChBREMgbWFzdGVyIG9mIHRoZSBjb3JyZXNwb25kaW5nDQotICogICAgICAgICBBREMgY29tbW9uIGluc3RhbmNlKS4NCi0gKiBAbm90ZSAgIEluIGNhc2Ugb2YgZGV2aWNlIHdpdGggbXVsdGltb2RlIGF2YWlsYWJsZSBhbmQgYSBtaXggb2YNCi0gKiAgICAgICAgIEFEQyBpbnN0YW5jZXMgY29tcGxpYW50IGFuZCBub3QgY29tcGxpYW50IHdpdGggbXVsdGltb2RlIGZlYXR1cmUsDQotICogICAgICAgICBBREMgaW5zdGFuY2VzIG5vdCBjb21wbGlhbnQgd2l0aCBtdWx0aW1vZGUgZmVhdHVyZSBhcmUNCi0gKiAgICAgICAgIGNvbnNpZGVyZWQgYXMgbWFzdGVyIGluc3RhbmNlcyAoZG8gbm90IGRlcGVuZCB0bw0KLSAqICAgICAgICAgYW55IG90aGVyIEFEQyBpbnN0YW5jZSkuDQotICogQHBhcmFtICBfX0FEQ3hfXyBBREMgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIF9fQURDeF9fIEFEQyBpbnN0YW5jZSBtYXN0ZXIgb2YgdGhlIGNvcnJlc3BvbmRpbmcgQURDIGNvbW1vbiBpbnN0YW5jZQ0KLSAqLw0KLSNpZiBkZWZpbmVkKEFEQzUpDQotI2RlZmluZSBfX0xMX0FEQ19NVUxUSV9JTlNUQU5DRV9NQVNURVIoX19BREN4X18pIFwNCi0gICgoKChfX0FEQ3hfXykgPT0gQURDMikpID8gKEFEQzEpICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoKCgoX19BREN4X18pID09IEFEQzQpKSA/IChBREMzKSA6IChfX0FEQ3hfXykpKQ0KLSNlbHNlDQotI2RlZmluZSBfX0xMX0FEQ19NVUxUSV9JTlNUQU5DRV9NQVNURVIoX19BREN4X18pIFwNCi0gICgoKChfX0FEQ3hfXykgPT0gQURDMikpID8gKEFEQzEpIDogKF9fQURDeF9fKSkNCi0jZW5kaWYgLyogQURDNSAqLw0KLSNlbmRpZiAvKiBBRENfTVVMVElNT0RFX1NVUFBPUlQgKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBzZWxlY3QgdGhlIEFEQyBjb21tb24gaW5zdGFuY2UNCi0gKiAgICAgICAgIHRvIHdoaWNoIGlzIGJlbG9uZ2luZyB0aGUgc2VsZWN0ZWQgQURDIGluc3RhbmNlLg0KLSAqIEBub3RlICAgQURDIGNvbW1vbiByZWdpc3RlciBpbnN0YW5jZSBjYW4gYmUgdXNlZCBmb3I6DQotICogICAgICAgICAtIFNldCBwYXJhbWV0ZXJzIGNvbW1vbiB0byBzZXZlcmFsIEFEQyBpbnN0YW5jZXMNCi0gKiAgICAgICAgIC0gTXVsdGltb2RlIChmb3IgZGV2aWNlcyB3aXRoIHNldmVyYWwgQURDIGluc3RhbmNlcykNCi0gKiAgICAgICAgIFJlZmVyIHRvIGZ1bmN0aW9ucyBoYXZpbmcgYXJndW1lbnQgIkFEQ3h5X0NPTU1PTiIgYXMgcGFyYW1ldGVyLg0KLSAqIEBwYXJhbSAgX19BREN4X18gQURDIGluc3RhbmNlDQotICogQHJldHZhbCBBREMgY29tbW9uIHJlZ2lzdGVyIGluc3RhbmNlDQotICovDQotI2lmIGRlZmluZWQoQURDMzQ1X0NPTU1PTikNCi0jZGVmaW5lIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRShfX0FEQ3hfXykgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKCgoX19BREN4X18pID09IEFEQzEpIHx8ICgoX19BREN4X18pID09IEFEQzIpKSA/ICgoQURDMTJfQ09NTU9OKSkgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoKEFEQzM0NV9DT01NT04pKSkNCi0jZWxzZQ0KLSNkZWZpbmUgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKF9fQURDeF9fKSAoQURDMTJfQ09NTU9OKQ0KLSNlbmRpZiAvKiBBREMzNDVfQ09NTU9OICovDQotLyoqDQotICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gY2hlY2sgaWYgYWxsIEFEQyBpbnN0YW5jZXMgc2hhcmluZyB0aGUgc2FtZQ0KLSAqICAgICAgICAgQURDIGNvbW1vbiBpbnN0YW5jZSBhcmUgZGlzYWJsZWQuDQotICogQG5vdGUgICBUaGlzIGNoZWNrIGlzIHJlcXVpcmVkIGJ5IGZ1bmN0aW9ucyB3aXRoIHNldHRpbmcgY29uZGl0aW9uZWQgdG8NCi0gKiAgICAgICAgIEFEQyBzdGF0ZToNCi0gKiAgICAgICAgIEFsbCBBREMgaW5zdGFuY2VzIG9mIHRoZSBBREMgY29tbW9uIGdyb3VwIG11c3QgYmUgZGlzYWJsZWQuDQotICogICAgICAgICBSZWZlciB0byBmdW5jdGlvbnMgaGF2aW5nIGFyZ3VtZW50ICJBREN4eV9DT01NT04iIGFzIHBhcmFtZXRlci4NCi0gKiBAbm90ZSAgIE9uIGRldmljZXMgd2l0aCBvbmx5IDEgQURDIGNvbW1vbiBpbnN0YW5jZSwgcGFyYW1ldGVyIG9mIHRoaXMgbWFjcm8NCi0gKiAgICAgICAgIGlzIHVzZWxlc3MgYW5kIGNhbiBiZSBpZ25vcmVkIChwYXJhbWV0ZXIga2VwdCBmb3IgY29tcGF0aWJpbGl0eQ0KLSAqICAgICAgICAgd2l0aCBkZXZpY2VzIGZlYXR1cmluZyBzZXZlcmFsIEFEQyBjb21tb24gaW5zdGFuY2VzKS4NCi0gKiBAcGFyYW0gIF9fQURDWFlfQ09NTU9OX18gQURDIGNvbW1vbiBpbnN0YW5jZQ0KLSAqICAgICAgICAgKGNhbiBiZSBzZXQgZGlyZWN0bHkgZnJvbSBDTVNJUyBkZWZpbml0aW9uIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybw0KLSAqIEByZWYgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKCkgKQ0KLSAqIEByZXR2YWwgVmFsdWUgIjAiIGlmIGFsbCBBREMgaW5zdGFuY2VzIHNoYXJpbmcgdGhlIHNhbWUgQURDIGNvbW1vbiBpbnN0YW5jZQ0KLSAqICAgICAgICAgYXJlIGRpc2FibGVkLg0KLSAqICAgICAgICAgVmFsdWUgIjEiIGlmIGF0IGxlYXN0IG9uZSBBREMgaW5zdGFuY2Ugc2hhcmluZyB0aGUgc2FtZSBBREMgY29tbW9uDQotICogaW5zdGFuY2UgaXMgZW5hYmxlZC4NCi0gKi8NCi0jaWYgZGVmaW5lZChBREMzNDVfQ09NTU9OKQ0KLSNpZiBkZWZpbmVkKEFEQzQpICYmIGRlZmluZWQoQURDNSkNCi0jZGVmaW5lIF9fTExfQURDX0lTX0VOQUJMRURfQUxMX0NPTU1PTl9JTlNUQU5DRShfX0FEQ1hZX0NPTU1PTl9fKSBcDQotICAoKChfX0FEQ1hZX0NPTU1PTl9fKSA9PSBBREMxMl9DT01NT04pICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICA/ICgoTExfQURDX0lzRW5hYmxlZChBREMxKSB8IExMX0FEQ19Jc0VuYWJsZWQoQURDMikpKSAgICAgIFwNCi0gICAgICAgOiAoKExMX0FEQ19Jc0VuYWJsZWQoQURDMykgfCBMTF9BRENfSXNFbmFibGVkKEFEQzQpIHwgICAgICBcDQotICAgICAgICAgICBMTF9BRENfSXNFbmFibGVkKEFEQzUpKSkpDQotI2Vsc2UNCi0jZGVmaW5lIF9fTExfQURDX0lTX0VOQUJMRURfQUxMX0NPTU1PTl9JTlNUQU5DRShfX0FEQ1hZX0NPTU1PTl9fKSBcDQotICAoKChfX0FEQ1hZX0NPTU1PTl9fKSA9PSBBREMxMl9DT01NT04pICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICA/ICgoTExfQURDX0lzRW5hYmxlZChBREMxKSB8IExMX0FEQ19Jc0VuYWJsZWQoQURDMikpKSAgICAgIFwNCi0gICAgICAgOiAoTExfQURDX0lzRW5hYmxlZChBREMzKSkpDQotI2VuZGlmIC8qIEFEQzQgJiYgQURDNSAqLw0KLSNlbHNlDQotI2RlZmluZSBfX0xMX0FEQ19JU19FTkFCTEVEX0FMTF9DT01NT05fSU5TVEFOQ0UoX19BRENYWV9DT01NT05fXykgXA0KLSAgKExMX0FEQ19Jc0VuYWJsZWQoQURDMSkgfCBMTF9BRENfSXNFbmFibGVkKEFEQzIpKQ0KLSNlbmRpZg0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGRlZmluZSB0aGUgQURDIGNvbnZlcnNpb24gZGF0YSBmdWxsLXNjYWxlIGRpZ2l0YWwNCi0gKiAgICAgICAgIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNlbGVjdGVkIEFEQyByZXNvbHV0aW9uLg0KLSAqIEBub3RlICAgQURDIGNvbnZlcnNpb24gZGF0YSBmdWxsLXNjYWxlIGNvcnJlc3BvbmRzIHRvIHZvbHRhZ2UgcmFuZ2UNCi0gKiAgICAgICAgIGRldGVybWluZWQgYnkgYW5hbG9nIHZvbHRhZ2UgcmVmZXJlbmNlcyBWcmVmKyBhbmQgVnJlZi0NCi0gKiAgICAgICAgIChyZWZlciB0byByZWZlcmVuY2UgbWFudWFsKS4NCi0gKiBAcGFyYW0gIF9fQURDX1JFU09MVVRJT05fXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzEyQg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzEwQg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzhCDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fNkINCi0gKiBAcmV0dmFsIEFEQyBjb252ZXJzaW9uIGRhdGEgZnVsbC1zY2FsZSBkaWdpdGFsIHZhbHVlICh1bml0OiBkaWdpdGFsIHZhbHVlIG9mDQotICogQURDIGNvbnZlcnNpb24gZGF0YSkNCi0gKi8NCi0jZGVmaW5lIF9fTExfQURDX0RJR0lUQUxfU0NBTEUoX19BRENfUkVTT0xVVElPTl9fKSBcDQotICAoMHhGRkZVTCA+PiAoKF9fQURDX1JFU09MVVRJT05fXykgPj4gKEFEQ19DRkdSX1JFU19CSVRPRkZTRVRfUE9TIC0gMVVMKSkpDQotDQotLyoqDQotICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gY29udmVydCB0aGUgQURDIGNvbnZlcnNpb24gZGF0YSBmcm9tDQotICogICAgICAgICBhIHJlc29sdXRpb24gdG8gYW5vdGhlciByZXNvbHV0aW9uLg0KLSAqIEBwYXJhbSAgX19EQVRBX18gQURDIGNvbnZlcnNpb24gZGF0YSB0byBiZSBjb252ZXJ0ZWQNCi0gKiBAcGFyYW0gIF9fQURDX1JFU09MVVRJT05fQ1VSUkVOVF9fIFJlc29sdXRpb24gb2YgdGhlIGRhdGEgdG8gYmUgY29udmVydGVkDQotICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzEyQg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzEwQg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzhCDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fNkINCi0gKiBAcGFyYW0gIF9fQURDX1JFU09MVVRJT05fVEFSR0VUX18gUmVzb2x1dGlvbiBvZiB0aGUgZGF0YSBhZnRlciBjb252ZXJzaW9uDQotICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzEyQg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzEwQg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzhCDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fNkINCi0gKiBAcmV0dmFsIEFEQyBjb252ZXJzaW9uIGRhdGEgdG8gdGhlIHJlcXVlc3RlZCByZXNvbHV0aW9uDQotICovDQotI2RlZmluZSBfX0xMX0FEQ19DT05WRVJUX0RBVEFfUkVTT0xVVElPTihfX0RBVEFfXywgX19BRENfUkVTT0xVVElPTl9DVVJSRU5UX18sIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fQURDX1JFU09MVVRJT05fVEFSR0VUX18pICAgICAgICAgICAgXA0KLSAgKCgoX19EQVRBX18pIDw8ICgoX19BRENfUkVTT0xVVElPTl9DVVJSRU5UX18pID4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICAgICAgICAgICAgIChBRENfQ0ZHUl9SRVNfQklUT0ZGU0VUX1BPUyAtIDFVTCkpKSA+PiAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fQURDX1JFU09MVVRJT05fVEFSR0VUX18pID4+IChBRENfQ0ZHUl9SRVNfQklUT0ZGU0VUX1BPUyAtIDFVTCkpKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGNhbGN1bGF0ZSB0aGUgdm9sdGFnZSAodW5pdDogbVZvbHQpDQotICogICAgICAgICBjb3JyZXNwb25kaW5nIHRvIGEgQURDIGNvbnZlcnNpb24gZGF0YSAodW5pdDogZGlnaXRhbCB2YWx1ZSkuDQotICogQG5vdGUgICBBbmFsb2cgcmVmZXJlbmNlIHZvbHRhZ2UgKFZyZWYrKSBtdXN0IGJlIGVpdGhlciBrbm93biBmcm9tDQotICogICAgICAgICB1c2VyIGJvYXJkIGVudmlyb25tZW50IG9yIGNhbiBiZSBjYWxjdWxhdGVkIHVzaW5nIEFEQyBtZWFzdXJlbWVudA0KLSAqICAgICAgICAgYW5kIEFEQyBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19DQUxDX1ZSRUZBTkFMT0dfVk9MVEFHRSgpLg0KLSAqIEBwYXJhbSAgX19WUkVGQU5BTE9HX1ZPTFRBR0VfXyBBbmFsb2cgcmVmZXJlbmNlIHZvbHRhZ2UgKHVuaXQ6IG1WKQ0KLSAqIEBwYXJhbSAgX19BRENfREFUQV9fIEFEQyBjb252ZXJzaW9uIGRhdGEgKHJlc29sdXRpb24gMTIgYml0cykNCi0gKiAgICAgICAgICAgICAgICAgICAgICAgKHVuaXQ6IGRpZ2l0YWwgdmFsdWUpLg0KLSAqIEBwYXJhbSAgX19BRENfUkVTT0xVVElPTl9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fMTJCDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fMTBCDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fOEINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl82Qg0KLSAqIEByZXR2YWwgQURDIGNvbnZlcnNpb24gZGF0YSBlcXVpdmFsZW50IHZvbHRhZ2UgdmFsdWUgKHVuaXQ6IG1Wb2x0KQ0KLSAqLw0KLSNkZWZpbmUgX19MTF9BRENfQ0FMQ19EQVRBX1RPX1ZPTFRBR0UoX19WUkVGQU5BTE9HX1ZPTFRBR0VfXywgX19BRENfREFUQV9fLCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0FEQ19SRVNPTFVUSU9OX18pICAgICAgICAgICAgICAgICAgIFwNCi0gICgoX19BRENfREFUQV9fKSAqIChfX1ZSRUZBTkFMT0dfVk9MVEFHRV9fKSAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIF9fTExfQURDX0RJR0lUQUxfU0NBTEUoX19BRENfUkVTT0xVVElPTl9fKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBjYWxjdWxhdGUgYW5hbG9nIHJlZmVyZW5jZSB2b2x0YWdlIChWcmVmKykNCi0gKiAgICAgICAgICh1bml0OiBtVm9sdCkgZnJvbSBBREMgY29udmVyc2lvbiBkYXRhIG9mIGludGVybmFsIHZvbHRhZ2UNCi0gKiAgICAgICAgIHJlZmVyZW5jZSBWcmVmSW50Lg0KLSAqIEBub3RlICAgQ29tcHV0YXRpb24gaXMgdXNpbmcgVnJlZkludCBjYWxpYnJhdGlvbiB2YWx1ZQ0KLSAqICAgICAgICAgc3RvcmVkIGluIHN5c3RlbSBtZW1vcnkgZm9yIGVhY2ggZGV2aWNlIGR1cmluZyBwcm9kdWN0aW9uLg0KLSAqIEBub3RlICAgVGhpcyB2b2x0YWdlIGRlcGVuZHMgb24gdXNlciBib2FyZCBlbnZpcm9ubWVudDogdm9sdGFnZSBsZXZlbA0KLSAqICAgICAgICAgY29ubmVjdGVkIHRvIHBpbiBWcmVmKy4NCi0gKiAgICAgICAgIE9uIGRldmljZXMgd2l0aCBzbWFsbCBwYWNrYWdlLCB0aGUgcGluIFZyZWYrIGlzIG5vdCBwcmVzZW50DQotICogICAgICAgICBhbmQgaW50ZXJuYWxseSBib25kZWQgdG8gcGluIFZkZGEuDQotICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllcywgY2FsaWJyYXRpb24gZGF0YSBvZiBpbnRlcm5hbCB2b2x0YWdlIHJlZmVyZW5jZQ0KLSAqICAgICAgICAgVnJlZkludCBjb3JyZXNwb25kcyB0byBhIHJlc29sdXRpb24gb2YgMTIgYml0cywNCi0gKiAgICAgICAgIHRoaXMgaXMgdGhlIHJlY29tbWVuZGVkIEFEQyByZXNvbHV0aW9uIHRvIGNvbnZlcnQgdm9sdGFnZSBvZg0KLSAqICAgICAgICAgaW50ZXJuYWwgdm9sdGFnZSByZWZlcmVuY2UgVnJlZkludC4NCi0gKiAgICAgICAgIE90aGVyd2lzZSwgdGhpcyBtYWNybyBwZXJmb3JtcyB0aGUgcHJvY2Vzc2luZyB0byBzY2FsZQ0KLSAqICAgICAgICAgQURDIGNvbnZlcnNpb24gZGF0YSB0byAxMiBiaXRzLg0KLSAqIEBwYXJhbSAgX19WUkVGSU5UX0FEQ19EQVRBX18gQURDIGNvbnZlcnNpb24gZGF0YSAocmVzb2x1dGlvbiAxMiBiaXRzKQ0KLSAqICAgICAgICAgb2YgaW50ZXJuYWwgdm9sdGFnZSByZWZlcmVuY2UgVnJlZkludCAodW5pdDogZGlnaXRhbCB2YWx1ZSkuDQotICogQHBhcmFtICBfX0FEQ19SRVNPTFVUSU9OX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl8xMkINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl8xMEINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl84Qg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzZCDQotICogQHJldHZhbCBBbmFsb2cgcmVmZXJlbmNlIHZvbHRhZ2UgKHVuaXQ6IG1WKQ0KLSAqLw0KLSNkZWZpbmUgX19MTF9BRENfQ0FMQ19WUkVGQU5BTE9HX1ZPTFRBR0UoX19WUkVGSU5UX0FEQ19EQVRBX18sIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fQURDX1JFU09MVVRJT05fXykgICBcDQotICAoKCh1aW50MzJfdCkoKlZSRUZJTlRfQ0FMX0FERFIpICogVlJFRklOVF9DQUxfVlJFRikgLyAgICAgICAgXA0KLSAgIF9fTExfQURDX0NPTlZFUlRfREFUQV9SRVNPTFVUSU9OKCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgKF9fVlJFRklOVF9BRENfREFUQV9fKSwgKF9fQURDX1JFU09MVVRJT05fXyksIExMX0FEQ19SRVNPTFVUSU9OXzEyQikpDQotDQotLyoqDQotICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gY2FsY3VsYXRlIHRoZSB0ZW1wZXJhdHVyZSAodW5pdDogZGVncmVlIENlbHNpdXMpDQotICogICAgICAgICBmcm9tIEFEQyBjb252ZXJzaW9uIGRhdGEgb2YgaW50ZXJuYWwgdGVtcGVyYXR1cmUgc2Vuc29yLg0KLSAqIEBub3RlICAgQ29tcHV0YXRpb24gaXMgdXNpbmcgdGVtcGVyYXR1cmUgc2Vuc29yIGNhbGlicmF0aW9uIHZhbHVlcw0KLSAqICAgICAgICAgc3RvcmVkIGluIHN5c3RlbSBtZW1vcnkgZm9yIGVhY2ggZGV2aWNlIGR1cmluZyBwcm9kdWN0aW9uLg0KLSAqIEBub3RlICAgQ2FsY3VsYXRpb24gZm9ybXVsYToNCi0gKiAgICAgICAgICAgVGVtcGVyYXR1cmUgPSAoKFRTX0FEQ19EQVRBIC0gVFNfQ0FMMSkNCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICogKFRTX0NBTDJfVEVNUCAtIFRTX0NBTDFfVEVNUCkpDQotICogICAgICAgICAgICAgICAgICAgICAgICAgLyAoVFNfQ0FMMiAtIFRTX0NBTDEpICsgVFNfQ0FMMV9URU1QDQotICogICAgICAgICAgIHdpdGggVFNfQURDX0RBVEEgPSB0ZW1wZXJhdHVyZSBzZW5zb3IgcmF3IGRhdGEgbWVhc3VyZWQgYnkgQURDDQotICogICAgICAgICAgICAgICAgQXZnX1Nsb3BlID0gKFRTX0NBTDIgLSBUU19DQUwxKQ0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKFRTX0NBTDJfVEVNUCAtIFRTX0NBTDFfVEVNUCkNCi0gKiAgICAgICAgICAgICAgICBUU19DQUwxICAgPSBlcXVpdmFsZW50IFRTX0FEQ19EQVRBIGF0IHRlbXBlcmF0dXJlDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVNUF9ERUdDX0NBTDEgKGNhbGlicmF0ZWQgaW4gZmFjdG9yeSkNCi0gKiAgICAgICAgICAgICAgICBUU19DQUwyICAgPSBlcXVpdmFsZW50IFRTX0FEQ19EQVRBIGF0IHRlbXBlcmF0dXJlDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVNUF9ERUdDX0NBTDIgKGNhbGlicmF0ZWQgaW4gZmFjdG9yeSkNCi0gKiAgICAgICAgIENhdXRpb246IENhbGN1bGF0aW9uIHJlbGV2YW5jeSB1bmRlciByZXNlcnZlIHRoYXQgY2FsaWJyYXRpb24NCi0gKiAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgYXJlIGNvcnJlY3QgKGFkZHJlc3MgYW5kIGRhdGEpLg0KLSAqICAgICAgICAgICAgICAgICAgVG8gY2FsY3VsYXRlIHRlbXBlcmF0dXJlIHVzaW5nIHRlbXBlcmF0dXJlIHNlbnNvcg0KLSAqICAgICAgICAgICAgICAgICAgZGF0YXNoZWV0IHR5cGljYWwgdmFsdWVzIChnZW5lcmljIHZhbHVlcyBsZXNzLCB0aGVyZWZvcmUNCi0gKiAgICAgICAgICAgICAgICAgIGxlc3MgYWNjdXJhdGUgdGhhbiBjYWxpYnJhdGVkIHZhbHVlcyksDQotICogICAgICAgICAgICAgICAgICB1c2UgaGVscGVyIG1hY3JvIEByZWYNCi0gKiBfX0xMX0FEQ19DQUxDX1RFTVBFUkFUVVJFX1RZUF9QQVJBTVMoKS4NCi0gKiBAbm90ZSAgIEFzIGNhbGN1bGF0aW9uIGlucHV0LCB0aGUgYW5hbG9nIHJlZmVyZW5jZSB2b2x0YWdlIChWcmVmKykgbXVzdCBiZQ0KLSAqICAgICAgICAgZGVmaW5lZCBhcyBpdCBpbXBhY3RzIHRoZSBBREMgTFNCIGVxdWl2YWxlbnQgdm9sdGFnZS4NCi0gKiBAbm90ZSAgIEFuYWxvZyByZWZlcmVuY2Ugdm9sdGFnZSAoVnJlZispIG11c3QgYmUgZWl0aGVyIGtub3duIGZyb20NCi0gKiAgICAgICAgIHVzZXIgYm9hcmQgZW52aXJvbm1lbnQgb3IgY2FuIGJlIGNhbGN1bGF0ZWQgdXNpbmcgQURDIG1lYXN1cmVtZW50DQotICogICAgICAgICBhbmQgQURDIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0NBTENfVlJFRkFOQUxPR19WT0xUQUdFKCkuDQotICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllcywgY2FsaWJyYXRpb24gZGF0YSBvZiB0ZW1wZXJhdHVyZSBzZW5zb3INCi0gKiAgICAgICAgIGNvcnJlc3BvbmRzIHRvIGEgcmVzb2x1dGlvbiBvZiAxMiBiaXRzLA0KLSAqICAgICAgICAgdGhpcyBpcyB0aGUgcmVjb21tZW5kZWQgQURDIHJlc29sdXRpb24gdG8gY29udmVydCB2b2x0YWdlIG9mDQotICogICAgICAgICB0ZW1wZXJhdHVyZSBzZW5zb3IuDQotICogICAgICAgICBPdGhlcndpc2UsIHRoaXMgbWFjcm8gcGVyZm9ybXMgdGhlIHByb2Nlc3NpbmcgdG8gc2NhbGUNCi0gKiAgICAgICAgIEFEQyBjb252ZXJzaW9uIGRhdGEgdG8gMTIgYml0cy4NCi0gKiBAcGFyYW0gIF9fVlJFRkFOQUxPR19WT0xUQUdFX18gIEFuYWxvZyByZWZlcmVuY2Ugdm9sdGFnZSAodW5pdDogbVYpDQotICogQHBhcmFtICBfX1RFTVBTRU5TT1JfQURDX0RBVEFfXyBBREMgY29udmVyc2lvbiBkYXRhIG9mIGludGVybmFsDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wZXJhdHVyZSBzZW5zb3IgKHVuaXQ6IGRpZ2l0YWwgdmFsdWUpLg0KLSAqIEBwYXJhbSAgX19BRENfUkVTT0xVVElPTl9fICAgICAgQURDIHJlc29sdXRpb24gYXQgd2hpY2ggaW50ZXJuYWwgdGVtcGVyYXR1cmUNCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbnNvciB2b2x0YWdlIGhhcyBiZWVuIG1lYXN1cmVkLg0KLSAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl8xMkINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl8xMEINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl84Qg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzZCDQotICogQHJldHZhbCBUZW1wZXJhdHVyZSAodW5pdDogZGVncmVlIENlbHNpdXMpDQotICovDQotI2RlZmluZSBfX0xMX0FEQ19DQUxDX1RFTVBFUkFUVVJFKF9fVlJFRkFOQUxPR19WT0xUQUdFX18sICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19URU1QU0VOU09SX0FEQ19EQVRBX18sIF9fQURDX1JFU09MVVRJT05fXykgXA0KLSAgKCgoKCgoaW50MzJfdCkoKF9fTExfQURDX0NPTlZFUlRfREFUQV9SRVNPTFVUSU9OKChfX1RFTVBTRU5TT1JfQURDX0RBVEFfXyksICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fQURDX1JFU09MVVRJT05fXyksICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTF9BRENfUkVTT0xVVElPTl8xMkIpICogICAgXA0KLSAgICAgICAgICAgICAgICAgIChfX1ZSRUZBTkFMT0dfVk9MVEFHRV9fKSkgLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICAgICAgICAgICBURU1QU0VOU09SX0NBTF9WUkVGQU5BTE9HKSAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgKGludDMyX3QpICogVEVNUFNFTlNPUl9DQUwxX0FERFIpKSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgKGludDMyX3QpKFRFTVBTRU5TT1JfQ0FMMl9URU1QIC0gVEVNUFNFTlNPUl9DQUwxX1RFTVApKSAvICAgICAgICAgICAgICAgICBcDQotICAgIChpbnQzMl90KSgoaW50MzJfdCkgKiBURU1QU0VOU09SX0NBTDJfQUREUiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgICAgIChpbnQzMl90KSAqIFRFTVBTRU5TT1JfQ0FMMV9BRERSKSkgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIFRFTVBTRU5TT1JfQ0FMMV9URU1QKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGNhbGN1bGF0ZSB0aGUgdGVtcGVyYXR1cmUgKHVuaXQ6IGRlZ3JlZSBDZWxzaXVzKQ0KLSAqICAgICAgICAgZnJvbSBBREMgY29udmVyc2lvbiBkYXRhIG9mIGludGVybmFsIHRlbXBlcmF0dXJlIHNlbnNvci4NCi0gKiBAbm90ZSAgIENvbXB1dGF0aW9uIGlzIHVzaW5nIHRlbXBlcmF0dXJlIHNlbnNvciB0eXBpY2FsIHZhbHVlcw0KLSAqICAgICAgICAgKHJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQpLg0KLSAqIEBub3RlICAgQ2FsY3VsYXRpb24gZm9ybXVsYToNCi0gKiAgICAgICAgICAgVGVtcGVyYXR1cmUgPSAoVFNfVFlQX0NBTHhfVk9MVCh1VikgLSBUU19BRENfREFUQSAqIENvbnZlcnNpb25fdVYpDQotICogICAgICAgICAgICAgICAgICAgICAgICAgLyBBdmdfU2xvcGUgKyBDQUx4X1RFTVANCi0gKiAgICAgICAgICAgd2l0aCBUU19BRENfREFUQSAgICAgID0gdGVtcGVyYXR1cmUgc2Vuc29yIHJhdyBkYXRhIG1lYXN1cmVkIGJ5IEFEQw0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5pdDogZGlnaXRhbCB2YWx1ZSkNCi0gKiAgICAgICAgICAgICAgICBBdmdfU2xvcGUgICAgICAgID0gdGVtcGVyYXR1cmUgc2Vuc29yIHNsb3BlDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bml0OiB1Vi9EZWdyZWUgQ2Vsc2l1cykNCi0gKiAgICAgICAgICAgICAgICBUU19UWVBfQ0FMeF9WT0xUID0gdGVtcGVyYXR1cmUgc2Vuc29yIGRpZ2l0YWwgdmFsdWUgYXQNCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGVyYXR1cmUgQ0FMeF9URU1QICh1bml0OiBtVikNCi0gKiAgICAgICAgIENhdXRpb246IENhbGN1bGF0aW9uIHJlbGV2YW5jeSB1bmRlciByZXNlcnZlIHRoZSB0ZW1wZXJhdHVyZSBzZW5zb3INCi0gKiAgICAgICAgICAgICAgICAgIG9mIHRoZSBjdXJyZW50IGRldmljZSBoYXMgY2hhcmFjdGVyaXN0aWNzIGluIGxpbmUgd2l0aA0KLSAqICAgICAgICAgICAgICAgICAgZGF0YXNoZWV0IHR5cGljYWwgdmFsdWVzLg0KLSAqICAgICAgICAgICAgICAgICAgSWYgdGVtcGVyYXR1cmUgc2Vuc29yIGNhbGlicmF0aW9uIHZhbHVlcyBhcmUgYXZhaWxhYmxlIG9uDQotICogICAgICAgICAgICAgICAgICBvbiB0aGlzIGRldmljZSAocHJlc2VuY2Ugb2YgbWFjcm8NCi0gKiBfX0xMX0FEQ19DQUxDX1RFTVBFUkFUVVJFKCkpLCB0ZW1wZXJhdHVyZSBjYWxjdWxhdGlvbiB3aWxsIGJlIG1vcmUgYWNjdXJhdGUNCi0gKiB1c2luZyBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19DQUxDX1RFTVBFUkFUVVJFKCkuDQotICogQG5vdGUgICBBcyBjYWxjdWxhdGlvbiBpbnB1dCwgdGhlIGFuYWxvZyByZWZlcmVuY2Ugdm9sdGFnZSAoVnJlZispIG11c3QgYmUNCi0gKiAgICAgICAgIGRlZmluZWQgYXMgaXQgaW1wYWN0cyB0aGUgQURDIExTQiBlcXVpdmFsZW50IHZvbHRhZ2UuDQotICogQG5vdGUgICBBbmFsb2cgcmVmZXJlbmNlIHZvbHRhZ2UgKFZyZWYrKSBtdXN0IGJlIGVpdGhlciBrbm93biBmcm9tDQotICogICAgICAgICB1c2VyIGJvYXJkIGVudmlyb25tZW50IG9yIGNhbiBiZSBjYWxjdWxhdGVkIHVzaW5nIEFEQyBtZWFzdXJlbWVudA0KLSAqICAgICAgICAgYW5kIEFEQyBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19DQUxDX1ZSRUZBTkFMT0dfVk9MVEFHRSgpLg0KLSAqIEBub3RlICAgQURDIG1lYXN1cmVtZW50IGRhdGEgbXVzdCBjb3JyZXNwb25kIHRvIGEgcmVzb2x1dGlvbiBvZiAxMiBiaXRzDQotICogICAgICAgICAoZnVsbCBzY2FsZSBkaWdpdGFsIHZhbHVlIDQwOTUpLiBJZiBub3QgdGhlIGNhc2UsIHRoZSBkYXRhIG11c3QgYmUNCi0gKiAgICAgICAgIHByZWxpbWluYXJpbHkgcmVzY2FsZWQgdG8gYW4gZXF1aXZhbGVudCByZXNvbHV0aW9uIG9mIDEyIGJpdHMuDQotICogQHBhcmFtICBfX1RFTVBTRU5TT1JfVFlQX0FWR1NMT1BFX18gICBEZXZpY2UgZGF0YXNoZWV0IGRhdGE6IFRlbXBlcmF0dXJlDQotICogc2Vuc29yIHNsb3BlIHR5cGljYWwgdmFsdWUgKHVuaXQ6IHVWL0RlZ0NlbHNpdXMpLiBPbiBTVE0zMkc0LCByZWZlciB0byBkZXZpY2UNCi0gKiBkYXRhc2hlZXQgcGFyYW1ldGVyICJBdmdfU2xvcGUiLg0KLSAqIEBwYXJhbSAgX19URU1QU0VOU09SX1RZUF9DQUxYX1ZfXyAgICAgRGV2aWNlIGRhdGFzaGVldCBkYXRhOiBUZW1wZXJhdHVyZQ0KLSAqIHNlbnNvciB2b2x0YWdlIHR5cGljYWwgdmFsdWUgKGF0IHRlbXBlcmF0dXJlIGFuZCBWcmVmKyBkZWZpbmVkIGluIHBhcmFtZXRlcnMNCi0gKiBiZWxvdykgKHVuaXQ6IG1WKS4gT24gU1RNMzJHNCwgcmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBwYXJhbWV0ZXIgIlYzMCINCi0gKiAoY29ycmVzcG9uZGluZyB0byBUU19DQUwxKS4NCi0gKiBAcGFyYW0gIF9fVEVNUFNFTlNPUl9DQUxYX1RFTVBfXyAgICAgIERldmljZSBkYXRhc2hlZXQgZGF0YTogVGVtcGVyYXR1cmUgYXQNCi0gKiB3aGljaCB0ZW1wZXJhdHVyZSBzZW5zb3Igdm9sdGFnZSAoc2VlIHBhcmFtZXRlciBhYm92ZSkgaXMgY29ycmVzcG9uZGluZw0KLSAqICh1bml0OiBtVikNCi0gKiBAcGFyYW0gIF9fVlJFRkFOQUxPR19WT0xUQUdFX18gICAgICAgIEFuYWxvZyB2b2x0YWdlIHJlZmVyZW5jZSAoVnJlZispDQotICogdm9sdGFnZSAodW5pdDogbVYpDQotICogQHBhcmFtICBfX1RFTVBTRU5TT1JfQURDX0RBVEFfXyAgICAgICBBREMgY29udmVyc2lvbiBkYXRhIG9mIGludGVybmFsDQotICogdGVtcGVyYXR1cmUgc2Vuc29yICh1bml0OiBkaWdpdGFsIHZhbHVlKS4NCi0gKiBAcGFyYW0gIF9fQURDX1JFU09MVVRJT05fXyAgICAgICAgICAgIEFEQyByZXNvbHV0aW9uIGF0IHdoaWNoIGludGVybmFsDQotICogdGVtcGVyYXR1cmUgc2Vuc29yIHZvbHRhZ2UgaGFzIGJlZW4gbWVhc3VyZWQuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YNCi0gKiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl8xMkINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl8xMEINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl84Qg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzZCDQotICogQHJldHZhbCBUZW1wZXJhdHVyZSAodW5pdDogZGVncmVlIENlbHNpdXMpDQotICovDQotI2RlZmluZSBfX0xMX0FEQ19DQUxDX1RFTVBFUkFUVVJFX1RZUF9QQVJBTVMoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgX19URU1QU0VOU09SX1RZUF9BVkdTTE9QRV9fLCBfX1RFTVBTRU5TT1JfVFlQX0NBTFhfVl9fLCAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBfX1RFTVBTRU5TT1JfQ0FMWF9URU1QX18sIF9fVlJFRkFOQUxPR19WT0xUQUdFX18sIF9fVEVNUFNFTlNPUl9BRENfREFUQV9fLCBcDQotICAgIF9fQURDX1JFU09MVVRJT05fXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoKCgoaW50MzJfdCkoKCgoX19URU1QU0VOU09SX0FEQ19EQVRBX18pICogKF9fVlJFRkFOQUxPR19WT0xUQUdFX18pKSAvICAgICAgXA0KLSAgICAgICAgICAgICAgICAgX19MTF9BRENfRElHSVRBTF9TQ0FMRShfX0FEQ19SRVNPTFVUSU9OX18pKSAqICAgICAgICAgICAgICAgICBcDQotICAgICAgICAgICAgICAgIDEwMDBVTCkgLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAoaW50MzJfdCkoKChfX1RFTVBTRU5TT1JfVFlQX0NBTFhfVl9fKSkgKiAxMDAwVUwpKSkgLyAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAoaW50MzJfdCkoX19URU1QU0VOU09SX1RZUF9BVkdTTE9QRV9fKSkgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKGludDMyX3QpKF9fVEVNUFNFTlNPUl9DQUxYX1RFTVBfXykpDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBkZWZncm91cCBBRENfTExfRXhwb3J0ZWRfRnVuY3Rpb25zIEFEQyBFeHBvcnRlZCBGdW5jdGlvbnMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQURDX0xMX0VGX0RNQV9NYW5hZ2VtZW50IEFEQyBETUEgbWFuYWdlbWVudA0KLSAqIEB7DQotICovDQotLyogTm90ZTogTEwgQURDIGZ1bmN0aW9ucyB0byBzZXQgRE1BIHRyYW5zZmVyIGFyZSBsb2NhdGVkIGludG8gc2VjdGlvbnMgb2YgICAgKi8NCi0vKiAgICAgICBjb25maWd1cmF0aW9uIG9mIEFEQyBpbnN0YW5jZSwgZ3JvdXBzIGFuZCBtdWx0aW1vZGUgKGlmIGF2YWlsYWJsZSk6ICAqLw0KLS8qICAgICAgIEByZWYgTExfQURDX1JFR19TZXRETUFUcmFuc2ZlcigpLCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotDQotLyoqDQotICogQGJyaWVmICBGdW5jdGlvbiB0byBoZWxwIHRvIGNvbmZpZ3VyZSBETUEgdHJhbnNmZXIgZnJvbSBBREM6IHJldHJpZXZlIHRoZQ0KLSAqICAgICAgICAgQURDIHJlZ2lzdGVyIGFkZHJlc3MgZnJvbSBBREMgaW5zdGFuY2UgYW5kIGEgbGlzdCBvZiBBREMgcmVnaXN0ZXJzDQotICogICAgICAgICBpbnRlbmRlZCB0byBiZSB1c2VkIChtb3N0IGNvbW1vbmx5KSB3aXRoIERNQSB0cmFuc2Zlci4NCi0gKiBAbm90ZSAgIFRoZXNlIEFEQyByZWdpc3RlcnMgYXJlIGRhdGEgcmVnaXN0ZXJzOg0KLSAqICAgICAgICAgd2hlbiBBREMgY29udmVyc2lvbiBkYXRhIGlzIGF2YWlsYWJsZSBpbiBBREMgZGF0YSByZWdpc3RlcnMsDQotICogICAgICAgICBBREMgZ2VuZXJhdGVzIGEgRE1BIHRyYW5zZmVyIHJlcXVlc3QuDQotICogQG5vdGUgICBUaGlzIG1hY3JvIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgd2l0aCBMTCBETUEgZHJpdmVyLCByZWZlciB0bw0KLSAqICAgICAgICAgZnVuY3Rpb24gIkxMX0RNQV9Db25maWdBZGRyZXNzZXMoKSIuDQotICogICAgICAgICBFeGFtcGxlOg0KLSAqICAgICAgICAgICBMTF9ETUFfQ29uZmlnQWRkcmVzc2VzKERNQTEsDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfRE1BX0NIQU5ORUxfMSwNCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTF9BRENfRE1BX0dldFJlZ0FkZHIoQURDMSwNCi0gKiBMTF9BRENfRE1BX1JFR19SRUdVTEFSX0RBVEEpLCAodWludDMyX3QpJjwgYXJyYXkgb3IgdmFyaWFibGUgPiwNCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTF9ETUFfRElSRUNUSU9OX1BFUklQSF9UT19NRU1PUlkpOw0KLSAqIEBub3RlICAgRm9yIGRldmljZXMgd2l0aCBzZXZlcmFsIEFEQzogaW4gbXVsdGltb2RlLCBzb21lIGRldmljZXMNCi0gKiAgICAgICAgIHVzZSBhIGRpZmZlcmVudCBkYXRhIHJlZ2lzdGVyIG91dHNpZGUgb2YgQURDIGluc3RhbmNlIHNjb3BlDQotICogICAgICAgICAoY29tbW9uIGRhdGEgcmVnaXN0ZXIpLiBUaGlzIG1hY3JvIG1hbmFnZXMgdGhpcyByZWdpc3RlciBkaWZmZXJlbmNlLA0KLSAqICAgICAgICAgb25seSBBREMgaW5zdGFuY2UgaGFzIHRvIGJlIHNldCBhcyBwYXJhbWV0ZXIuDQotICogQHJtdG9sbCBEUiAgICAgICBSREFUQSAgICAgICAgICBMTF9BRENfRE1BX0dldFJlZ0FkZHJcbg0KLSAqICAgICAgICAgQ0RSICAgICAgUkRBVEFfTVNUICAgICAgTExfQURDX0RNQV9HZXRSZWdBZGRyXG4NCi0gKiAgICAgICAgIENEUiAgICAgIFJEQVRBX1NMViAgICAgIExMX0FEQ19ETUFfR2V0UmVnQWRkcg0KLSAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UNCi0gKiBAcGFyYW0gIFJlZ2lzdGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0RNQV9SRUdfUkVHVUxBUl9EQVRBDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0RNQV9SRUdfUkVHVUxBUl9EQVRBX01VTFRJICgxKQ0KLSAqDQotICogICAgICAgICAoMSkgQXZhaWxhYmxlIG9uIGRldmljZXMgd2l0aCBzZXZlcmFsIEFEQyBpbnN0YW5jZXMuDQotICogQHJldHZhbCBBREMgcmVnaXN0ZXIgYWRkcmVzcw0KLSAqLw0KLSNpZiBkZWZpbmVkKEFEQ19NVUxUSU1PREVfU1VQUE9SVCkNCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0RNQV9HZXRSZWdBZGRyKEFEQ19UeXBlRGVmICpBREN4LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUmVnaXN0ZXIpIHsNCi0gIHVpbnQzMl90IGRhdGFfcmVnX2FkZHI7DQotDQotICBpZiAoUmVnaXN0ZXIgPT0gTExfQURDX0RNQV9SRUdfUkVHVUxBUl9EQVRBKSB7DQotICAgIC8qIFJldHJpZXZlIGFkZHJlc3Mgb2YgcmVnaXN0ZXIgRFIgKi8NCi0gICAgZGF0YV9yZWdfYWRkciA9ICh1aW50MzJfdCkgJiAoQURDeC0+RFIpOw0KLSAgfSBlbHNlIC8qIChSZWdpc3RlciA9PSBMTF9BRENfRE1BX1JFR19SRUdVTEFSX0RBVEFfTVVMVEkpICovDQotICB7DQotICAgIC8qIFJldHJpZXZlIGFkZHJlc3Mgb2YgcmVnaXN0ZXIgQ0RSICovDQotICAgIGRhdGFfcmVnX2FkZHIgPSAodWludDMyX3QpICYgKChfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoQURDeCkpLT5DRFIpOw0KLSAgfQ0KLQ0KLSAgcmV0dXJuIGRhdGFfcmVnX2FkZHI7DQotfQ0KLSNlbHNlDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19ETUFfR2V0UmVnQWRkcihBRENfVHlwZURlZiAqQURDeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFJlZ2lzdGVyKSB7DQotICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovDQotICAodm9pZCkoUmVnaXN0ZXIpOw0KLQ0KLSAgLyogUmV0cmlldmUgYWRkcmVzcyBvZiByZWdpc3RlciBEUiAqLw0KLSAgcmV0dXJuICh1aW50MzJfdCkgJiAoQURDeC0+RFIpOw0KLX0NCi0jZW5kaWYgLyogQURDX01VTFRJTU9ERV9TVVBQT1JUICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEFEQ19MTF9FRl9Db25maWd1cmF0aW9uX0FEQ19Db21tb24gQ29uZmlndXJhdGlvbiBvZiBBREMNCi0gKiBoaWVyYXJjaGljYWwgc2NvcGU6IGNvbW1vbiB0byBzZXZlcmFsIEFEQyBpbnN0YW5jZXMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IHBhcmFtZXRlciBjb21tb24gdG8gc2V2ZXJhbCBBREM6IENsb2NrIHNvdXJjZSBhbmQgcHJlc2NhbGVyLg0KLSAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIGlmIEFEQyBncm91cCBpbmplY3RlZCBpcyB1c2VkLCBzb21lDQotICogICAgICAgICBjbG9jayByYXRpbyBjb25zdHJhaW50cyBiZXR3ZWVuIEFEQyBjbG9jayBhbmQgQUhCIGNsb2NrDQotICogICAgICAgICBtdXN0IGJlIHJlc3BlY3RlZC4NCi0gKiAgICAgICAgIFJlZmVyIHRvIHJlZmVyZW5jZSBtYW51YWwuDQotICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllcywgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8NCi0gKiAgICAgICAgIEFEQyBzdGF0ZToNCi0gKiAgICAgICAgIEFsbCBBREMgaW5zdGFuY2VzIG9mIHRoZSBBREMgY29tbW9uIGdyb3VwIG11c3QgYmUgZGlzYWJsZWQuDQotICogICAgICAgICBUaGlzIGNoZWNrIGNhbiBiZSBkb25lIHdpdGggZnVuY3Rpb24gQHJlZiBMTF9BRENfSXNFbmFibGVkKCkgZm9yIGVhY2gNCi0gKiAgICAgICAgIEFEQyBpbnN0YW5jZSBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8gaGVscGVyIG1hY3JvDQotICogICAgICAgICBAcmVmIF9fTExfQURDX0lTX0VOQUJMRURfQUxMX0NPTU1PTl9JTlNUQU5DRSgpLg0KLSAqIEBybXRvbGwgQ0NSICAgICAgQ0tNT0RFICAgICAgICAgTExfQURDX1NldENvbW1vbkNsb2NrXG4NCi0gKiAgICAgICAgIENDUiAgICAgIFBSRVNDICAgICAgICAgIExMX0FEQ19TZXRDb21tb25DbG9jaw0KLSAqIEBwYXJhbSAgQURDeHlfQ09NTU9OIEFEQyBjb21tb24gaW5zdGFuY2UNCi0gKiAgICAgICAgIChjYW4gYmUgc2V0IGRpcmVjdGx5IGZyb20gQ01TSVMgZGVmaW5pdGlvbiBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8NCi0gKiBAcmVmIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRSgpICkNCi0gKiBAcGFyYW0gIENvbW1vbkNsb2NrIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX1NZTkNfUENMS19ESVYxDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX1NZTkNfUENMS19ESVYyDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX1NZTkNfUENMS19ESVY0DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX0FTWU5DX0RJVjENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DTE9DS19BU1lOQ19ESVY0DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX0FTWU5DX0RJVjYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DTE9DS19BU1lOQ19ESVYxMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DTE9DS19BU1lOQ19ESVYxMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DTE9DS19BU1lOQ19ESVYxNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DTE9DS19BU1lOQ19ESVYzMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DTE9DS19BU1lOQ19ESVY2NA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DTE9DS19BU1lOQ19ESVYxMjgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMjU2DQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1NldENvbW1vbkNsb2NrKEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDb21tb25DbG9jaykgew0KLSAgTU9ESUZZX1JFRyhBREN4eV9DT01NT04tPkNDUiwgQURDX0NDUl9DS01PREUgfCBBRENfQ0NSX1BSRVNDLCBDb21tb25DbG9jayk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IHBhcmFtZXRlciBjb21tb24gdG8gc2V2ZXJhbCBBREM6IENsb2NrIHNvdXJjZSBhbmQgcHJlc2NhbGVyLg0KLSAqIEBybXRvbGwgQ0NSICAgICAgQ0tNT0RFICAgICAgICAgTExfQURDX0dldENvbW1vbkNsb2NrXG4NCi0gKiAgICAgICAgIENDUiAgICAgIFBSRVNDICAgICAgICAgIExMX0FEQ19HZXRDb21tb25DbG9jaw0KLSAqIEBwYXJhbSAgQURDeHlfQ09NTU9OIEFEQyBjb21tb24gaW5zdGFuY2UNCi0gKiAgICAgICAgIChjYW4gYmUgc2V0IGRpcmVjdGx5IGZyb20gQ01TSVMgZGVmaW5pdGlvbiBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8NCi0gKiBAcmVmIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRSgpICkNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX1NZTkNfUENMS19ESVYxDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX1NZTkNfUENMS19ESVYyDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX1NZTkNfUENMS19ESVY0DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX0FTWU5DX0RJVjENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DTE9DS19BU1lOQ19ESVY0DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX0FTWU5DX0RJVjYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DTE9DS19BU1lOQ19ESVYxMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DTE9DS19BU1lOQ19ESVYxMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DTE9DS19BU1lOQ19ESVYxNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DTE9DS19BU1lOQ19ESVYzMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DTE9DS19BU1lOQ19ESVY2NA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DTE9DS19BU1lOQ19ESVYxMjgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMjU2DQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90DQotTExfQURDX0dldENvbW1vbkNsb2NrKEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OKSB7DQotICByZXR1cm4gKA0KLSAgICAgIHVpbnQzMl90KShSRUFEX0JJVChBREN4eV9DT01NT04tPkNDUiwgQURDX0NDUl9DS01PREUgfCBBRENfQ0NSX1BSRVNDKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IHBhcmFtZXRlciBjb21tb24gdG8gc2V2ZXJhbCBBREM6IG1lYXN1cmVtZW50IHBhdGggdG8NCi0gKiAgICAgICAgIGludGVybmFsIGNoYW5uZWxzIChWcmVmSW50LCB0ZW1wZXJhdHVyZSBzZW5zb3IsIC4uLikuDQotICogICAgICAgICBDb25maWd1cmUgYWxsIHBhdGhzIChvdmVyd3JpdGUgY3VycmVudCBjb25maWd1cmF0aW9uKS4NCi0gKiBAbm90ZSAgIE9uZSBvciBzZXZlcmFsIHZhbHVlcyBjYW4gYmUgc2VsZWN0ZWQuDQotICogICAgICAgICBFeGFtcGxlOiAoTExfQURDX1BBVEhfSU5URVJOQUxfVlJFRklOVCB8DQotICogICAgICAgICAgICAgICAgICAgTExfQURDX1BBVEhfSU5URVJOQUxfVEVNUFNFTlNPUikNCi0gKiAgICAgICAgIFRoZSB2YWx1ZXMgbm90IHNlbGVjdGVkIGFyZSByZW1vdmVkIGZyb20gY29uZmlndXJhdGlvbi4NCi0gKiBAbm90ZSAgIFN0YWJpbGl6YXRpb24gdGltZSBvZiBtZWFzdXJlbWVudCBwYXRoIHRvIGludGVybmFsIGNoYW5uZWw6DQotICogICAgICAgICBBZnRlciBlbmFibGluZyBpbnRlcm5hbCBwYXRocywgYmVmb3JlIHN0YXJ0aW5nIEFEQyBjb252ZXJzaW9uLA0KLSAqICAgICAgICAgYSBkZWxheSBpcyByZXF1aXJlZCBmb3IgaW50ZXJuYWwgdm9sdGFnZSByZWZlcmVuY2UgYW5kDQotICogICAgICAgICB0ZW1wZXJhdHVyZSBzZW5zb3Igc3RhYmlsaXphdGlvbiB0aW1lLg0KLSAqICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldC4NCi0gKiAgICAgICAgIFJlZmVyIHRvIGxpdGVyYWwgQHJlZiBMTF9BRENfREVMQVlfVlJFRklOVF9TVEFCX1VTLg0KLSAqICAgICAgICAgUmVmZXIgdG8gbGl0ZXJhbCBAcmVmIExMX0FEQ19ERUxBWV9URU1QU0VOU09SX1NUQUJfVVMuDQotICogQG5vdGUgICBBREMgaW50ZXJuYWwgY2hhbm5lbCBzYW1wbGluZyB0aW1lIGNvbnN0cmFpbnQ6DQotICogICAgICAgICBGb3IgQURDIGNvbnZlcnNpb24gb2YgaW50ZXJuYWwgY2hhbm5lbHMsDQotICogICAgICAgICBhIHNhbXBsaW5nIHRpbWUgbWluaW11bSB2YWx1ZSBpcyByZXF1aXJlZC4NCi0gKiAgICAgICAgIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQuDQotICogQHJtdG9sbCBDQ1IgICAgICBWUkVGRU4gICAgICAgICBMTF9BRENfU2V0Q29tbW9uUGF0aEludGVybmFsQ2hcbg0KLSAqICAgICAgICAgQ0NSICAgICAgVlNFTlNFU0VMICAgICAgTExfQURDX1NldENvbW1vblBhdGhJbnRlcm5hbENoXG4NCi0gKiAgICAgICAgIENDUiAgICAgIFZCQVRTRUwgICAgICAgIExMX0FEQ19TZXRDb21tb25QYXRoSW50ZXJuYWxDaA0KLSAqIEBwYXJhbSAgQURDeHlfQ09NTU9OIEFEQyBjb21tb24gaW5zdGFuY2UNCi0gKiAgICAgICAgIChjYW4gYmUgc2V0IGRpcmVjdGx5IGZyb20gQ01TSVMgZGVmaW5pdGlvbiBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8NCi0gKiBAcmVmIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRSgpICkNCi0gKiBAcGFyYW0gIFBhdGhJbnRlcm5hbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nDQotICogdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19QQVRIX0lOVEVSTkFMX05PTkUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUEFUSF9JTlRFUk5BTF9WUkVGSU5UDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1BBVEhfSU5URVJOQUxfVEVNUFNFTlNPUg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19QQVRIX0lOVEVSTkFMX1ZCQVQNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfU2V0Q29tbW9uUGF0aEludGVybmFsQ2goDQotICAgIEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OLCB1aW50MzJfdCBQYXRoSW50ZXJuYWwpIHsNCi0gIE1PRElGWV9SRUcoQURDeHlfQ09NTU9OLT5DQ1IsDQotICAgICAgICAgICAgIEFEQ19DQ1JfVlJFRkVOIHwgQURDX0NDUl9WU0VOU0VTRUwgfCBBRENfQ0NSX1ZCQVRTRUwsDQotICAgICAgICAgICAgIFBhdGhJbnRlcm5hbCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IHBhcmFtZXRlciBjb21tb24gdG8gc2V2ZXJhbCBBREM6IG1lYXN1cmVtZW50IHBhdGggdG8NCi0gKiAgICAgICAgIGludGVybmFsIGNoYW5uZWxzIChWcmVmSW50LCB0ZW1wZXJhdHVyZSBzZW5zb3IsIC4uLikuDQotICogICAgICAgICBBZGQgcGF0aHMgdG8gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4NCi0gKiBAbm90ZSAgIE9uZSBvciBzZXZlcmFsIHZhbHVlcyBjYW4gYmUgc2VsZWN0ZWQuDQotICogICAgICAgICBFeGFtcGxlOiAoTExfQURDX1BBVEhfSU5URVJOQUxfVlJFRklOVCB8DQotICogICAgICAgICAgICAgICAgICAgTExfQURDX1BBVEhfSU5URVJOQUxfVEVNUFNFTlNPUikNCi0gKiBAbm90ZSAgIFN0YWJpbGl6YXRpb24gdGltZSBvZiBtZWFzdXJlbWVudCBwYXRoIHRvIGludGVybmFsIGNoYW5uZWw6DQotICogICAgICAgICBBZnRlciBlbmFibGluZyBpbnRlcm5hbCBwYXRocywgYmVmb3JlIHN0YXJ0aW5nIEFEQyBjb252ZXJzaW9uLA0KLSAqICAgICAgICAgYSBkZWxheSBpcyByZXF1aXJlZCBmb3IgaW50ZXJuYWwgdm9sdGFnZSByZWZlcmVuY2UgYW5kDQotICogICAgICAgICB0ZW1wZXJhdHVyZSBzZW5zb3Igc3RhYmlsaXphdGlvbiB0aW1lLg0KLSAqICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldC4NCi0gKiAgICAgICAgIFJlZmVyIHRvIGxpdGVyYWwgQHJlZiBMTF9BRENfREVMQVlfVlJFRklOVF9TVEFCX1VTLg0KLSAqICAgICAgICAgUmVmZXIgdG8gbGl0ZXJhbCBAcmVmIExMX0FEQ19ERUxBWV9URU1QU0VOU09SX1NUQUJfVVMuDQotICogQG5vdGUgICBBREMgaW50ZXJuYWwgY2hhbm5lbCBzYW1wbGluZyB0aW1lIGNvbnN0cmFpbnQ6DQotICogICAgICAgICBGb3IgQURDIGNvbnZlcnNpb24gb2YgaW50ZXJuYWwgY2hhbm5lbHMsDQotICogICAgICAgICBhIHNhbXBsaW5nIHRpbWUgbWluaW11bSB2YWx1ZSBpcyByZXF1aXJlZC4NCi0gKiAgICAgICAgIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQuDQotICogQHJtdG9sbCBDQ1IgICAgICBWUkVGRU4gICAgICAgICBMTF9BRENfU2V0Q29tbW9uUGF0aEludGVybmFsQ2hBZGRcbg0KLSAqICAgICAgICAgQ0NSICAgICAgVlNFTlNFU0VMICAgICAgTExfQURDX1NldENvbW1vblBhdGhJbnRlcm5hbENoQWRkXG4NCi0gKiAgICAgICAgIENDUiAgICAgIFZCQVRTRUwgICAgICAgIExMX0FEQ19TZXRDb21tb25QYXRoSW50ZXJuYWxDaEFkZA0KLSAqIEBwYXJhbSAgQURDeHlfQ09NTU9OIEFEQyBjb21tb24gaW5zdGFuY2UNCi0gKiAgICAgICAgIChjYW4gYmUgc2V0IGRpcmVjdGx5IGZyb20gQ01TSVMgZGVmaW5pdGlvbiBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8NCi0gKiBAcmVmIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRSgpICkNCi0gKiBAcGFyYW0gIFBhdGhJbnRlcm5hbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nDQotICogdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19QQVRIX0lOVEVSTkFMX05PTkUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUEFUSF9JTlRFUk5BTF9WUkVGSU5UDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1BBVEhfSU5URVJOQUxfVEVNUFNFTlNPUg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19QQVRIX0lOVEVSTkFMX1ZCQVQNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfU2V0Q29tbW9uUGF0aEludGVybmFsQ2hBZGQoDQotICAgIEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OLCB1aW50MzJfdCBQYXRoSW50ZXJuYWwpIHsNCi0gIFNFVF9CSVQoQURDeHlfQ09NTU9OLT5DQ1IsIFBhdGhJbnRlcm5hbCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IHBhcmFtZXRlciBjb21tb24gdG8gc2V2ZXJhbCBBREM6IG1lYXN1cmVtZW50IHBhdGggdG8NCi0gKiAgICAgICAgIGludGVybmFsIGNoYW5uZWxzIChWcmVmSW50LCB0ZW1wZXJhdHVyZSBzZW5zb3IsIC4uLikuDQotICogICAgICAgICBSZW1vdmUgcGF0aHMgdG8gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4NCi0gKiBAbm90ZSAgIE9uZSBvciBzZXZlcmFsIHZhbHVlcyBjYW4gYmUgc2VsZWN0ZWQuDQotICogICAgICAgICBFeGFtcGxlOiAoTExfQURDX1BBVEhfSU5URVJOQUxfVlJFRklOVCB8DQotICogICAgICAgICAgICAgICAgICAgTExfQURDX1BBVEhfSU5URVJOQUxfVEVNUFNFTlNPUikNCi0gKiBAcm10b2xsIENDUiAgICAgIFZSRUZFTiAgICAgICAgIExMX0FEQ19TZXRDb21tb25QYXRoSW50ZXJuYWxDaFJlbVxuDQotICogICAgICAgICBDQ1IgICAgICBWU0VOU0VTRUwgICAgICBMTF9BRENfU2V0Q29tbW9uUGF0aEludGVybmFsQ2hSZW1cbg0KLSAqICAgICAgICAgQ0NSICAgICAgVkJBVFNFTCAgICAgICAgTExfQURDX1NldENvbW1vblBhdGhJbnRlcm5hbENoUmVtDQotICogQHBhcmFtICBBREN4eV9DT01NT04gQURDIGNvbW1vbiBpbnN0YW5jZQ0KLSAqICAgICAgICAgKGNhbiBiZSBzZXQgZGlyZWN0bHkgZnJvbSBDTVNJUyBkZWZpbml0aW9uIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybw0KLSAqIEByZWYgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKCkgKQ0KLSAqIEBwYXJhbSAgUGF0aEludGVybmFsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcNCi0gKiB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1BBVEhfSU5URVJOQUxfTk9ORQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19QQVRIX0lOVEVSTkFMX1ZSRUZJTlQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUEFUSF9JTlRFUk5BTF9URU1QU0VOU09SDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1BBVEhfSU5URVJOQUxfVkJBVA0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19TZXRDb21tb25QYXRoSW50ZXJuYWxDaFJlbSgNCi0gICAgQURDX0NvbW1vbl9UeXBlRGVmICpBREN4eV9DT01NT04sIHVpbnQzMl90IFBhdGhJbnRlcm5hbCkgew0KLSAgQ0xFQVJfQklUKEFEQ3h5X0NPTU1PTi0+Q0NSLCBQYXRoSW50ZXJuYWwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBwYXJhbWV0ZXIgY29tbW9uIHRvIHNldmVyYWwgQURDOiBtZWFzdXJlbWVudCBwYXRoIHRvIGludGVybmFsDQotICogICAgICAgICBjaGFubmVscyAoVnJlZkludCwgdGVtcGVyYXR1cmUgc2Vuc29yLCAuLi4pLg0KLSAqIEBub3RlICAgT25lIG9yIHNldmVyYWwgdmFsdWVzIGNhbiBiZSBzZWxlY3RlZC4NCi0gKiAgICAgICAgIEV4YW1wbGU6IChMTF9BRENfUEFUSF9JTlRFUk5BTF9WUkVGSU5UIHwNCi0gKiAgICAgICAgICAgICAgICAgICBMTF9BRENfUEFUSF9JTlRFUk5BTF9URU1QU0VOU09SKQ0KLSAqIEBybXRvbGwgQ0NSICAgICAgVlJFRkVOICAgICAgICAgTExfQURDX0dldENvbW1vblBhdGhJbnRlcm5hbENoXG4NCi0gKiAgICAgICAgIENDUiAgICAgIFZTRU5TRVNFTCAgICAgIExMX0FEQ19HZXRDb21tb25QYXRoSW50ZXJuYWxDaFxuDQotICogICAgICAgICBDQ1IgICAgICBWQkFUU0VMICAgICAgICBMTF9BRENfR2V0Q29tbW9uUGF0aEludGVybmFsQ2gNCi0gKiBAcGFyYW0gIEFEQ3h5X0NPTU1PTiBBREMgY29tbW9uIGluc3RhbmNlDQotICogICAgICAgICAoY2FuIGJlIHNldCBkaXJlY3RseSBmcm9tIENNU0lTIGRlZmluaXRpb24gb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvDQotICogQHJlZiBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoKSApDQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUEFUSF9JTlRFUk5BTF9OT05FDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1BBVEhfSU5URVJOQUxfVlJFRklOVA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19QQVRIX0lOVEVSTkFMX1RFTVBTRU5TT1INCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUEFUSF9JTlRFUk5BTF9WQkFUDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90DQotTExfQURDX0dldENvbW1vblBhdGhJbnRlcm5hbENoKEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OKSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVCgNCi0gICAgICBBREN4eV9DT01NT04tPkNDUiwgQURDX0NDUl9WUkVGRU4gfCBBRENfQ0NSX1ZTRU5TRVNFTCB8IEFEQ19DQ1JfVkJBVFNFTCkpOw0KLX0NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQURDX0xMX0VGX0NvbmZpZ3VyYXRpb25fQURDX0luc3RhbmNlIENvbmZpZ3VyYXRpb24gb2YgQURDDQotICogaGllcmFyY2hpY2FsIHNjb3BlOiBBREMgaW5zdGFuY2UNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IEFEQyBjYWxpYnJhdGlvbiBmYWN0b3IgaW4gdGhlIG1vZGUgc2luZ2xlLWVuZGVkDQotICogICAgICAgICBvciBkaWZmZXJlbnRpYWwgKGZvciBkZXZpY2VzIHdpdGggZGlmZmVyZW50aWFsIG1vZGUgYXZhaWxhYmxlKS4NCi0gKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgdG8gc2V0IGNhbGlicmF0aW9uIHBhcmFtZXRlcnMNCi0gKiAgICAgICAgIHdpdGhvdXQgaGF2aW5nIHRvIHBlcmZvcm0gYSBuZXcgY2FsaWJyYXRpb24gdXNpbmcNCi0gKiAgICAgICAgIEByZWYgTExfQURDX1N0YXJ0Q2FsaWJyYXRpb24oKS4NCi0gKiBAbm90ZSAgIEZvciBkZXZpY2VzIHdpdGggZGlmZmVyZW50aWFsIG1vZGUgYXZhaWxhYmxlOg0KLSAqICAgICAgICAgQ2FsaWJyYXRpb24gb2Ygb2Zmc2V0IGlzIHNwZWNpZmljIHRvIGVhY2ggb2YNCi0gKiAgICAgICAgIHNpbmdsZS1lbmRlZCBhbmQgZGlmZmVyZW50aWFsIG1vZGVzDQotICogICAgICAgICAoY2FsaWJyYXRpb24gZmFjdG9yIG11c3QgYmUgc3BlY2lmaWVkIGZvciBlYWNoIG9mIHRoZXNlDQotICogICAgICAgICBkaWZmZXJlbnRpYWwgbW9kZXMsIGlmIHVzZWQgYWZ0ZXJ3YXJkcyBhbmQgaWYgdGhlIGFwcGxpY2F0aW9uDQotICogICAgICAgICByZXF1aXJlcyB0aGVpciBjYWxpYnJhdGlvbikuDQotICogQG5vdGUgICBJbiBjYXNlIG9mIHNldHRpbmcgY2FsaWJyYXRpb24gZmFjdG9ycyBvZiBib3RoIG1vZGVzIHNpbmdsZSBlbmRlZA0KLSAqICAgICAgICAgYW5kIGRpZmZlcmVudGlhbCAocGFyYW1ldGVyIExMX0FEQ19CT1RIX1NJTkdMRV9ESUZGX0VOREVEKToNCi0gKiAgICAgICAgIGJvdGggY2FsaWJyYXRpb24gZmFjdG9ycyBtdXN0IGJlIGNvbmNhdGVuYXRlZC4NCi0gKiAgICAgICAgIFRvIHBlcmZvcm0gdGhpcyBwcm9jZXNzaW5nLCB1c2UgaGVscGVyIG1hY3JvDQotICogICAgICAgICBAcmVmIF9fTExfQURDX0NBTElCX0ZBQ1RPUl9TSU5HTEVfRElGRigpLg0KLSAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvDQotICogICAgICAgICBBREMgc3RhdGU6DQotICogICAgICAgICBBREMgbXVzdCBiZSBlbmFibGVkLCB3aXRob3V0IGNhbGlicmF0aW9uIG9uIGdvaW5nLCB3aXRob3V0IGNvbnZlcnNpb24NCi0gKiAgICAgICAgIG9uIGdvaW5nIG9uIGdyb3VwIHJlZ3VsYXIuDQotICogQHJtdG9sbCBDQUxGQUNUICBDQUxGQUNUX1MgICAgICBMTF9BRENfU2V0Q2FsaWJyYXRpb25GYWN0b3Jcbg0KLSAqICAgICAgICAgQ0FMRkFDVCAgQ0FMRkFDVF9EICAgICAgTExfQURDX1NldENhbGlicmF0aW9uRmFjdG9yDQotICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQ0KLSAqIEBwYXJhbSAgU2luZ2xlRGlmZiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19TSU5HTEVfRU5ERUQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfRElGRkVSRU5USUFMX0VOREVEDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0JPVEhfU0lOR0xFX0RJRkZfRU5ERUQNCi0gKiBAcGFyYW0gIENhbGlicmF0aW9uRmFjdG9yIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHg3Rg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19TZXRDYWxpYnJhdGlvbkZhY3RvcihBRENfVHlwZURlZiAqQURDeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgU2luZ2xlRGlmZiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2FsaWJyYXRpb25GYWN0b3IpIHsNCi0gIE1PRElGWV9SRUcoDQotICAgICAgQURDeC0+Q0FMRkFDVCwgU2luZ2xlRGlmZiAmIEFEQ19TSU5HTEVESUZGX0NBTElCX0ZBQ1RPUl9NQVNLLA0KLSAgICAgIENhbGlicmF0aW9uRmFjdG9yIDw8ICgoKFNpbmdsZURpZmYgJiBBRENfU0lOR0xFRElGRl9DQUxJQl9GX0JJVF9EX01BU0spID4+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfU0lOR0xFRElGRl9DQUxJQl9GX0JJVF9EX1NISUZUNCkgJg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KFNpbmdsZURpZmYgJiBBRENfQ0FMRkFDVF9DQUxGQUNUX1MpKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IEFEQyBjYWxpYnJhdGlvbiBmYWN0b3IgaW4gdGhlIG1vZGUgc2luZ2xlLWVuZGVkDQotICogICAgICAgICBvciBkaWZmZXJlbnRpYWwgKGZvciBkZXZpY2VzIHdpdGggZGlmZmVyZW50aWFsIG1vZGUgYXZhaWxhYmxlKS4NCi0gKiBAbm90ZSAgIENhbGlicmF0aW9uIGZhY3RvcnMgYXJlIHNldCBieSBoYXJkd2FyZSBhZnRlciBwZXJmb3JtaW5nDQotICogICAgICAgICBhIGNhbGlicmF0aW9uIHJ1biB1c2luZyBmdW5jdGlvbiBAcmVmIExMX0FEQ19TdGFydENhbGlicmF0aW9uKCkuDQotICogQG5vdGUgICBGb3IgZGV2aWNlcyB3aXRoIGRpZmZlcmVudGlhbCBtb2RlIGF2YWlsYWJsZToNCi0gKiAgICAgICAgIENhbGlicmF0aW9uIG9mIG9mZnNldCBpcyBzcGVjaWZpYyB0byBlYWNoIG9mDQotICogICAgICAgICBzaW5nbGUtZW5kZWQgYW5kIGRpZmZlcmVudGlhbCBtb2Rlcw0KLSAqIEBybXRvbGwgQ0FMRkFDVCAgQ0FMRkFDVF9TICAgICAgTExfQURDX0dldENhbGlicmF0aW9uRmFjdG9yXG4NCi0gKiAgICAgICAgIENBTEZBQ1QgIENBTEZBQ1RfRCAgICAgIExMX0FEQ19HZXRDYWxpYnJhdGlvbkZhY3Rvcg0KLSAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UNCi0gKiBAcGFyYW0gIFNpbmdsZURpZmYgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfU0lOR0xFX0VOREVEDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0RJRkZFUkVOVElBTF9FTkRFRA0KLSAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDdGDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19HZXRDYWxpYnJhdGlvbkZhY3RvcihBRENfVHlwZURlZiAqQURDeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFNpbmdsZURpZmYpIHsNCi0gIC8qIFJldHJpZXZlIGJpdHMgd2l0aCBwb3NpdGlvbiBpbiByZWdpc3RlciBkZXBlbmRpbmcgb24gcGFyYW1ldGVyICAgICAgICAgICAqLw0KLSAgLyogIlNpbmdsZURpZmYiLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAvKiBQYXJhbWV0ZXIgdXNlZCB3aXRoIG1hc2sgIkFEQ19TSU5HTEVESUZGX0NBTElCX0ZBQ1RPUl9NQVNLIiBiZWNhdXNlICAgICAgKi8NCi0gIC8qIGNvbnRhaW5pbmcgb3RoZXIgYml0cyByZXNlcnZlZCBmb3Igb3RoZXIgcHVycG9zZS4gICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeC0+Q0FMRkFDVCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTaW5nbGVEaWZmICYgQURDX1NJTkdMRURJRkZfQ0FMSUJfRkFDVE9SX01BU0spKSA+Pg0KLSAgICAgICAgICAgICAgICAgICAgKChTaW5nbGVEaWZmICYgQURDX1NJTkdMRURJRkZfQ0FMSUJfRl9CSVRfRF9NQVNLKSA+Pg0KLSAgICAgICAgICAgICAgICAgICAgIEFEQ19TSU5HTEVESUZGX0NBTElCX0ZfQklUX0RfU0hJRlQ0KSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IEFEQyByZXNvbHV0aW9uLg0KLSAqICAgICAgICAgUmVmZXIgdG8gcmVmZXJlbmNlIG1hbnVhbCBmb3IgYWxpZ25tZW50cyBmb3JtYXRzDQotICogICAgICAgICBkZXBlbmRlbmNpZXMgdG8gQURDIHJlc29sdXRpb25zLg0KLSAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvDQotICogICAgICAgICBBREMgc3RhdGU6DQotICogICAgICAgICBBREMgbXVzdCBiZSBkaXNhYmxlZCBvciBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZw0KLSAqICAgICAgICAgb24gZWl0aGVyIGdyb3VwcyByZWd1bGFyIG9yIGluamVjdGVkLg0KLSAqIEBybXRvbGwgQ0ZHUiAgICAgUkVTICAgICAgICAgICAgTExfQURDX1NldFJlc29sdXRpb24NCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHBhcmFtICBSZXNvbHV0aW9uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fMTJCDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fMTBCDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fOEINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl82Qg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19TZXRSZXNvbHV0aW9uKEFEQ19UeXBlRGVmICpBREN4LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFJlc29sdXRpb24pIHsNCi0gIE1PRElGWV9SRUcoQURDeC0+Q0ZHUiwgQURDX0NGR1JfUkVTLCBSZXNvbHV0aW9uKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgQURDIHJlc29sdXRpb24uDQotICogICAgICAgICBSZWZlciB0byByZWZlcmVuY2UgbWFudWFsIGZvciBhbGlnbm1lbnRzIGZvcm1hdHMNCi0gKiAgICAgICAgIGRlcGVuZGVuY2llcyB0byBBREMgcmVzb2x1dGlvbnMuDQotICogQHJtdG9sbCBDRkdSICAgICBSRVMgICAgICAgICAgICBMTF9BRENfR2V0UmVzb2x1dGlvbg0KLSAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fMTJCDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fMTBCDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fOEINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl82Qg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfR2V0UmVzb2x1dGlvbihBRENfVHlwZURlZiAqQURDeCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeC0+Q0ZHUiwgQURDX0NGR1JfUkVTKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IEFEQyBjb252ZXJzaW9uIGRhdGEgYWxpZ25tZW50Lg0KLSAqIEBub3RlICAgUmVmZXIgdG8gcmVmZXJlbmNlIG1hbnVhbCBmb3IgYWxpZ25tZW50cyBmb3JtYXRzDQotICogICAgICAgICBkZXBlbmRlbmNpZXMgdG8gQURDIHJlc29sdXRpb25zLg0KLSAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvDQotICogICAgICAgICBBREMgc3RhdGU6DQotICogICAgICAgICBBREMgbXVzdCBiZSBkaXNhYmxlZCBvciBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZw0KLSAqICAgICAgICAgb24gZWl0aGVyIGdyb3VwcyByZWd1bGFyIG9yIGluamVjdGVkLg0KLSAqIEBybXRvbGwgQ0ZHUiAgICAgQUxJR04gICAgICAgICAgTExfQURDX1NldERhdGFBbGlnbm1lbnQNCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHBhcmFtICBEYXRhQWxpZ25tZW50IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0RBVEFfQUxJR05fUklHSFQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfREFUQV9BTElHTl9MRUZUDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1NldERhdGFBbGlnbm1lbnQoQURDX1R5cGVEZWYgKkFEQ3gsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRGF0YUFsaWdubWVudCkgew0KLSAgTU9ESUZZX1JFRyhBREN4LT5DRkdSLCBBRENfQ0ZHUl9BTElHTiwgRGF0YUFsaWdubWVudCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IEFEQyBjb252ZXJzaW9uIGRhdGEgYWxpZ25tZW50Lg0KLSAqIEBub3RlICAgUmVmZXIgdG8gcmVmZXJlbmNlIG1hbnVhbCBmb3IgYWxpZ25tZW50cyBmb3JtYXRzDQotICogICAgICAgICBkZXBlbmRlbmNpZXMgdG8gQURDIHJlc29sdXRpb25zLg0KLSAqIEBybXRvbGwgQ0ZHUiAgICAgQUxJR04gICAgICAgICAgTExfQURDX0dldERhdGFBbGlnbm1lbnQNCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19EQVRBX0FMSUdOX1JJR0hUDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0RBVEFfQUxJR05fTEVGVA0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfR2V0RGF0YUFsaWdubWVudChBRENfVHlwZURlZiAqQURDeCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeC0+Q0ZHUiwgQURDX0NGR1JfQUxJR04pKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZXQgQURDIGxvdyBwb3dlciBtb2RlLg0KLSAqIEBub3RlICAgRGVzY3JpcHRpb24gb2YgQURDIGxvdyBwb3dlciBtb2RlczoNCi0gKiAgICAgICAgIC0gQURDIGxvdyBwb3dlciBtb2RlICJhdXRvIHdhaXQiOiBEeW5hbWljIGxvdyBwb3dlciBtb2RlLA0KLSAqICAgICAgICAgICBBREMgY29udmVyc2lvbnMgb2NjdXJyZW5jZXMgYXJlIGxpbWl0ZWQgdG8gdGhlIG1pbmltdW0gbmVjZXNzYXJ5DQotICogICAgICAgICAgIGluIG9yZGVyIHRvIHJlZHVjZSBwb3dlciBjb25zdW1wdGlvbi4NCi0gKiAgICAgICAgICAgTmV3IEFEQyBjb252ZXJzaW9uIHN0YXJ0cyBvbmx5IHdoZW4gdGhlIHByZXZpb3VzDQotICogICAgICAgICAgIHVuaXRhcnkgY29udmVyc2lvbiBkYXRhIChmb3IgQURDIGdyb3VwIHJlZ3VsYXIpDQotICogICAgICAgICAgIG9yIHByZXZpb3VzIHNlcXVlbmNlIGNvbnZlcnNpb25zIGRhdGEgKGZvciBBREMgZ3JvdXAgaW5qZWN0ZWQpDQotICogICAgICAgICAgIGhhcyBiZWVuIHJldHJpZXZlZCBieSB1c2VyIHNvZnR3YXJlLg0KLSAqICAgICAgICAgICBJbiB0aGUgbWVhbnRpbWUsIEFEQyByZW1haW5zIGlkbGU6IGRvZXMgbm90IHBlcmZvcm1zIGFueQ0KLSAqICAgICAgICAgICBvdGhlciBjb252ZXJzaW9uLg0KLSAqICAgICAgICAgICBUaGlzIG1vZGUgYWxsb3dzIHRvIGF1dG9tYXRpY2FsbHkgYWRhcHQgdGhlIEFEQyBjb252ZXJzaW9ucw0KLSAqICAgICAgICAgICB0cmlnZ2VycyB0byB0aGUgc3BlZWQgb2YgdGhlIHNvZnR3YXJlIHRoYXQgcmVhZHMgdGhlIGRhdGEuDQotICogICAgICAgICAgIE1vcmVvdmVyLCB0aGlzIGF2b2lkcyByaXNrIG9mIG92ZXJydW4gZm9yIGxvdyBmcmVxdWVuY3kNCi0gKiAgICAgICAgICAgYXBwbGljYXRpb25zLg0KLSAqICAgICAgICAgICBIb3cgdG8gdXNlIHRoaXMgbG93IHBvd2VyIG1vZGU6DQotICogICAgICAgICAgIC0gSXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIHVzZSB3aXRoIGludGVycnVwdGlvbiBvciBETUENCi0gKiAgICAgICAgICAgICBzaW5jZSB0aGVzZSBtb2RlcyBoYXZlIHRvIGNsZWFyIGltbWVkaWF0ZWx5IHRoZSBFT0MgZmxhZw0KLSAqICAgICAgICAgICAgIChieSBDUFUgdG8gZnJlZSB0aGUgSVJRIHBlbmRpbmcgZXZlbnQgb3IgYnkgRE1BKS4NCi0gKiAgICAgICAgICAgICBBdXRvIHdhaXQgd2lsbCB3b3JrIGJ1dCBmb3J0IGEgdmVyeSBzaG9ydCB0aW1lLCBkaXNjYXJkaW5nDQotICogICAgICAgICAgICAgaXRzIGludGVuZGVkIGJlbmVmaXQgKGV4Y2VwdCBzcGVjaWZpYyBjYXNlIG9mIGhpZ2ggbG9hZCBvZiBDUFUNCi0gKiAgICAgICAgICAgICBvciBETUEgdHJhbnNmZXJzIHdoaWNoIGNhbiBqdXN0aWZ5IHVzYWdlIG9mIGF1dG8gd2FpdCkuDQotICogICAgICAgICAgIC0gRG8gdXNlIHdpdGggcG9sbGluZzogMS4gU3RhcnQgY29udmVyc2lvbiwNCi0gKiAgICAgICAgICAgICAyLiBMYXRlciBvbiwgd2hlbiBjb252ZXJzaW9uIGRhdGEgaXMgbmVlZGVkOiBwb2xsIGZvciBlbmQgb2YNCi0gKiAgICAgICAgICAgICBjb252ZXJzaW9uICB0byBlbnN1cmUgdGhhdCBjb252ZXJzaW9uIGlzIGNvbXBsZXRlZCBhbmQNCi0gKiAgICAgICAgICAgICByZXRyaWV2ZSBBREMgY29udmVyc2lvbiBkYXRhLiBUaGlzIHdpbGwgdHJpZyBhbm90aGVyDQotICogICAgICAgICAgICAgQURDIGNvbnZlcnNpb24gc3RhcnQuDQotICogICAgICAgICAtIEFEQyBsb3cgcG93ZXIgbW9kZSAiYXV0byBwb3dlci1vZmYiIChmZWF0dXJlIGF2YWlsYWJsZSBvbg0KLSAqICAgICAgICAgICB0aGlzIGRldmljZSBpZiBwYXJhbWV0ZXIgTExfQURDX0xQX0FVVE9QT1dFUk9GRiBpcyBhdmFpbGFibGUpOg0KLSAqICAgICAgICAgICB0aGUgQURDIGF1dG9tYXRpY2FsbHkgcG93ZXJzLW9mZiBhZnRlciBhIGNvbnZlcnNpb24gYW5kDQotICogICAgICAgICAgIGF1dG9tYXRpY2FsbHkgd2FrZXMgdXAgd2hlbiBhIG5ldyBjb252ZXJzaW9uIGlzIHRyaWdnZXJlZA0KLSAqICAgICAgICAgICAod2l0aCBzdGFydHVwIHRpbWUgYmV0d2VlbiB0cmlnZ2VyIGFuZCBzdGFydCBvZiBzYW1wbGluZykuDQotICogICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgY29tYmluZWQgd2l0aCBsb3cgcG93ZXIgbW9kZSAiYXV0byB3YWl0Ii4NCi0gKiBAbm90ZSAgIFdpdGggQURDIGxvdyBwb3dlciBtb2RlICJhdXRvIHdhaXQiLCB0aGUgQURDIGNvbnZlcnNpb24gZGF0YSByZWFkDQotICogICAgICAgICBpcyBjb3JyZXNwb25kaW5nIHRvIHByZXZpb3VzIEFEQyBjb252ZXJzaW9uIHN0YXJ0LCBpbmRlcGVuZGVudGx5DQotICogICAgICAgICBvZiBkZWxheSBkdXJpbmcgd2hpY2ggQURDIHdhcyBpZGxlLg0KLSAqICAgICAgICAgVGhlcmVmb3JlLCB0aGUgQURDIGNvbnZlcnNpb24gZGF0YSBtYXkgYmUgb3V0ZGF0ZWQ6IGRvZXMgbm90DQotICogICAgICAgICBjb3JyZXNwb25kIHRvIHRoZSBjdXJyZW50IHZvbHRhZ2UgbGV2ZWwgb24gdGhlIHNlbGVjdGVkDQotICogICAgICAgICBBREMgY2hhbm5lbC4NCi0gKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bw0KLSAqICAgICAgICAgQURDIHN0YXRlOg0KLSAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcNCi0gKiAgICAgICAgIG9uIGVpdGhlciBncm91cHMgcmVndWxhciBvciBpbmplY3RlZC4NCi0gKiBAcm10b2xsIENGR1IgICAgIEFVVERMWSAgICAgICAgIExMX0FEQ19TZXRMb3dQb3dlck1vZGUNCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHBhcmFtICBMb3dQb3dlck1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTFBfTU9ERV9OT05FDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0xQX0FVVE9XQUlUDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1NldExvd1Bvd2VyTW9kZShBRENfVHlwZURlZiAqQURDeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IExvd1Bvd2VyTW9kZSkgew0KLSAgTU9ESUZZX1JFRyhBREN4LT5DRkdSLCBBRENfQ0ZHUl9BVVRETFksIExvd1Bvd2VyTW9kZSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IEFEQyBsb3cgcG93ZXIgbW9kZToNCi0gKiBAbm90ZSAgIERlc2NyaXB0aW9uIG9mIEFEQyBsb3cgcG93ZXIgbW9kZXM6DQotICogICAgICAgICAtIEFEQyBsb3cgcG93ZXIgbW9kZSAiYXV0byB3YWl0IjogRHluYW1pYyBsb3cgcG93ZXIgbW9kZSwNCi0gKiAgICAgICAgICAgQURDIGNvbnZlcnNpb25zIG9jY3VycmVuY2VzIGFyZSBsaW1pdGVkIHRvIHRoZSBtaW5pbXVtIG5lY2Vzc2FyeQ0KLSAqICAgICAgICAgICBpbiBvcmRlciB0byByZWR1Y2UgcG93ZXIgY29uc3VtcHRpb24uDQotICogICAgICAgICAgIE5ldyBBREMgY29udmVyc2lvbiBzdGFydHMgb25seSB3aGVuIHRoZSBwcmV2aW91cw0KLSAqICAgICAgICAgICB1bml0YXJ5IGNvbnZlcnNpb24gZGF0YSAoZm9yIEFEQyBncm91cCByZWd1bGFyKQ0KLSAqICAgICAgICAgICBvciBwcmV2aW91cyBzZXF1ZW5jZSBjb252ZXJzaW9ucyBkYXRhIChmb3IgQURDIGdyb3VwIGluamVjdGVkKQ0KLSAqICAgICAgICAgICBoYXMgYmVlbiByZXRyaWV2ZWQgYnkgdXNlciBzb2Z0d2FyZS4NCi0gKiAgICAgICAgICAgSW4gdGhlIG1lYW50aW1lLCBBREMgcmVtYWlucyBpZGxlOiBkb2VzIG5vdCBwZXJmb3JtcyBhbnkNCi0gKiAgICAgICAgICAgb3RoZXIgY29udmVyc2lvbi4NCi0gKiAgICAgICAgICAgVGhpcyBtb2RlIGFsbG93cyB0byBhdXRvbWF0aWNhbGx5IGFkYXB0IHRoZSBBREMgY29udmVyc2lvbnMNCi0gKiAgICAgICAgICAgdHJpZ2dlcnMgdG8gdGhlIHNwZWVkIG9mIHRoZSBzb2Z0d2FyZSB0aGF0IHJlYWRzIHRoZSBkYXRhLg0KLSAqICAgICAgICAgICBNb3Jlb3ZlciwgdGhpcyBhdm9pZHMgcmlzayBvZiBvdmVycnVuIGZvciBsb3cgZnJlcXVlbmN5DQotICogICAgICAgICAgIGFwcGxpY2F0aW9ucy4NCi0gKiAgICAgICAgICAgSG93IHRvIHVzZSB0aGlzIGxvdyBwb3dlciBtb2RlOg0KLSAqICAgICAgICAgICAtIEl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byB1c2Ugd2l0aCBpbnRlcnJ1cHRpb24gb3IgRE1BDQotICogICAgICAgICAgICAgc2luY2UgdGhlc2UgbW9kZXMgaGF2ZSB0byBjbGVhciBpbW1lZGlhdGVseSB0aGUgRU9DIGZsYWcNCi0gKiAgICAgICAgICAgICAoYnkgQ1BVIHRvIGZyZWUgdGhlIElSUSBwZW5kaW5nIGV2ZW50IG9yIGJ5IERNQSkuDQotICogICAgICAgICAgICAgQXV0byB3YWl0IHdpbGwgd29yayBidXQgZm9ydCBhIHZlcnkgc2hvcnQgdGltZSwgZGlzY2FyZGluZw0KLSAqICAgICAgICAgICAgIGl0cyBpbnRlbmRlZCBiZW5lZml0IChleGNlcHQgc3BlY2lmaWMgY2FzZSBvZiBoaWdoIGxvYWQgb2YgQ1BVDQotICogICAgICAgICAgICAgb3IgRE1BIHRyYW5zZmVycyB3aGljaCBjYW4ganVzdGlmeSB1c2FnZSBvZiBhdXRvIHdhaXQpLg0KLSAqICAgICAgICAgICAtIERvIHVzZSB3aXRoIHBvbGxpbmc6IDEuIFN0YXJ0IGNvbnZlcnNpb24sDQotICogICAgICAgICAgICAgMi4gTGF0ZXIgb24sIHdoZW4gY29udmVyc2lvbiBkYXRhIGlzIG5lZWRlZDogcG9sbCBmb3IgZW5kIG9mDQotICogICAgICAgICAgICAgY29udmVyc2lvbiAgdG8gZW5zdXJlIHRoYXQgY29udmVyc2lvbiBpcyBjb21wbGV0ZWQgYW5kDQotICogICAgICAgICAgICAgcmV0cmlldmUgQURDIGNvbnZlcnNpb24gZGF0YS4gVGhpcyB3aWxsIHRyaWcgYW5vdGhlcg0KLSAqICAgICAgICAgICAgIEFEQyBjb252ZXJzaW9uIHN0YXJ0Lg0KLSAqICAgICAgICAgLSBBREMgbG93IHBvd2VyIG1vZGUgImF1dG8gcG93ZXItb2ZmIiAoZmVhdHVyZSBhdmFpbGFibGUgb24NCi0gKiAgICAgICAgICAgdGhpcyBkZXZpY2UgaWYgcGFyYW1ldGVyIExMX0FEQ19MUF9BVVRPUE9XRVJPRkYgaXMgYXZhaWxhYmxlKToNCi0gKiAgICAgICAgICAgdGhlIEFEQyBhdXRvbWF0aWNhbGx5IHBvd2Vycy1vZmYgYWZ0ZXIgYSBjb252ZXJzaW9uIGFuZA0KLSAqICAgICAgICAgICBhdXRvbWF0aWNhbGx5IHdha2VzIHVwIHdoZW4gYSBuZXcgY29udmVyc2lvbiBpcyB0cmlnZ2VyZWQNCi0gKiAgICAgICAgICAgKHdpdGggc3RhcnR1cCB0aW1lIGJldHdlZW4gdHJpZ2dlciBhbmQgc3RhcnQgb2Ygc2FtcGxpbmcpLg0KLSAqICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIGNvbWJpbmVkIHdpdGggbG93IHBvd2VyIG1vZGUgImF1dG8gd2FpdCIuDQotICogQG5vdGUgICBXaXRoIEFEQyBsb3cgcG93ZXIgbW9kZSAiYXV0byB3YWl0IiwgdGhlIEFEQyBjb252ZXJzaW9uIGRhdGEgcmVhZA0KLSAqICAgICAgICAgaXMgY29ycmVzcG9uZGluZyB0byBwcmV2aW91cyBBREMgY29udmVyc2lvbiBzdGFydCwgaW5kZXBlbmRlbnRseQ0KLSAqICAgICAgICAgb2YgZGVsYXkgZHVyaW5nIHdoaWNoIEFEQyB3YXMgaWRsZS4NCi0gKiAgICAgICAgIFRoZXJlZm9yZSwgdGhlIEFEQyBjb252ZXJzaW9uIGRhdGEgbWF5IGJlIG91dGRhdGVkOiBkb2VzIG5vdA0KLSAqICAgICAgICAgY29ycmVzcG9uZCB0byB0aGUgY3VycmVudCB2b2x0YWdlIGxldmVsIG9uIHRoZSBzZWxlY3RlZA0KLSAqICAgICAgICAgQURDIGNoYW5uZWwuDQotICogQHJtdG9sbCBDRkdSICAgICBBVVRETFkgICAgICAgICBMTF9BRENfR2V0TG93UG93ZXJNb2RlDQotICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTFBfTU9ERV9OT05FDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0xQX0FVVE9XQUlUDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19HZXRMb3dQb3dlck1vZGUoQURDX1R5cGVEZWYgKkFEQ3gpIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEFEQ3gtPkNGR1IsIEFEQ19DRkdSX0FVVERMWSkpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCBBREMgc2VsZWN0ZWQgb2Zmc2V0IG51bWJlciAxLCAyLCAzIG9yIDQuDQotICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIHNldCB0aGUgMiBpdGVtcyBvZiBvZmZzZXQgY29uZmlndXJhdGlvbjoNCi0gKiAgICAgICAgIC0gQURDIGNoYW5uZWwgdG8gd2hpY2ggdGhlIG9mZnNldCBwcm9ncmFtbWVkIHdpbGwgYmUgYXBwbGllZA0KLSAqICAgICAgICAgICAoaW5kZXBlbmRlbnRseSBvZiBjaGFubmVsIG1hcHBlZCBvbiBBREMgZ3JvdXAgcmVndWxhcg0KLSAqICAgICAgICAgICBvciBncm91cCBpbmplY3RlZCkNCi0gKiAgICAgICAgIC0gT2Zmc2V0IGxldmVsIChvZmZzZXQgdG8gYmUgc3VidHJhY3RlZCBmcm9tIHRoZSByYXcNCi0gKiAgICAgICAgICAgY29udmVydGVkIGRhdGEpLg0KLSAqIEBub3RlICAgQ2F1dGlvbjogT2Zmc2V0IGZvcm1hdCBpcyBkZXBlbmRlbnQgdG8gQURDIHJlc29sdXRpb246DQotICogICAgICAgICBvZmZzZXQgaGFzIHRvIGJlIGxlZnQtYWxpZ25lZCBvbiBiaXQgMTEsIHRoZSBMU0IgKHJpZ2h0IGJpdHMpDQotICogICAgICAgICBhcmUgc2V0IHRvIDAuDQotICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGVuYWJsZXMgdGhlIG9mZnNldCwgYnkgZGVmYXVsdC4gSXQgY2FuIGJlIGZvcmNlZA0KLSAqICAgICAgICAgdG8gZGlzYWJsZSBzdGF0ZSB1c2luZyBmdW5jdGlvbiBMTF9BRENfU2V0T2Zmc2V0U3RhdGUoKS4NCi0gKiBAbm90ZSAgIElmIGEgY2hhbm5lbCBpcyBtYXBwZWQgb24gc2V2ZXJhbCBvZmZzZXRzIG51bWJlcnMsIG9ubHkgdGhlIG9mZnNldA0KLSAqICAgICAgICAgd2l0aCB0aGUgbG93ZXN0IHZhbHVlIGlzIGNvbnNpZGVyZWQgZm9yIHRoZSBzdWJ0cmFjdGlvbi4NCi0gKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bw0KLSAqICAgICAgICAgQURDIHN0YXRlOg0KLSAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcNCi0gKiAgICAgICAgIG9uIGVpdGhlciBncm91cHMgcmVndWxhciBvciBpbmplY3RlZC4NCi0gKiBAbm90ZSAgIE9uIFNUTTMyRzQsIHNvbWUgZmFzdCBjaGFubmVscyBhcmUgYXZhaWxhYmxlOiBmYXN0IGFuYWxvZyBpbnB1dHMNCi0gKiAgICAgICAgIGNvbWluZyBmcm9tIEdQSU8gcGFkcyAoQURDX0lOMS4uNSkuDQotICogQHJtdG9sbCBPRlIxICAgICBPRkZTRVQxX0NIICAgICBMTF9BRENfU2V0T2Zmc2V0XG4NCi0gKiAgICAgICAgIE9GUjEgICAgIE9GRlNFVDEgICAgICAgIExMX0FEQ19TZXRPZmZzZXRcbg0KLSAqICAgICAgICAgT0ZSMSAgICAgT0ZGU0VUMV9FTiAgICAgTExfQURDX1NldE9mZnNldFxuDQotICogICAgICAgICBPRlIyICAgICBPRkZTRVQyX0NIICAgICBMTF9BRENfU2V0T2Zmc2V0XG4NCi0gKiAgICAgICAgIE9GUjIgICAgIE9GRlNFVDIgICAgICAgIExMX0FEQ19TZXRPZmZzZXRcbg0KLSAqICAgICAgICAgT0ZSMiAgICAgT0ZGU0VUMl9FTiAgICAgTExfQURDX1NldE9mZnNldFxuDQotICogICAgICAgICBPRlIzICAgICBPRkZTRVQzX0NIICAgICBMTF9BRENfU2V0T2Zmc2V0XG4NCi0gKiAgICAgICAgIE9GUjMgICAgIE9GRlNFVDMgICAgICAgIExMX0FEQ19TZXRPZmZzZXRcbg0KLSAqICAgICAgICAgT0ZSMyAgICAgT0ZGU0VUM19FTiAgICAgTExfQURDX1NldE9mZnNldFxuDQotICogICAgICAgICBPRlI0ICAgICBPRkZTRVQ0X0NIICAgICBMTF9BRENfU2V0T2Zmc2V0XG4NCi0gKiAgICAgICAgIE9GUjQgICAgIE9GRlNFVDQgICAgICAgIExMX0FEQ19TZXRPZmZzZXRcbg0KLSAqICAgICAgICAgT0ZSNCAgICAgT0ZGU0VUNF9FTiAgICAgTExfQURDX1NldE9mZnNldA0KLSAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UNCi0gKiBAcGFyYW0gIE9mZnNldHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT0ZGU0VUXzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT0ZGU0VUXzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT0ZGU0VUXzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT0ZGU0VUXzQNCi0gKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8wDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMSAgICAgICAgICAgICAgICAgKDgpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMiAgICAgICAgICAgICAgICAgKDgpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMyAgICAgICAgICAgICAgICAgKDgpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNCAgICAgICAgICAgICAgICAgKDgpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNSAgICAgICAgICAgICAgICAgKDgpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF84DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEwDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEzDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE2DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQgICAgICAgICAgICg3KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1JfQURDMSAgICgxKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1JfQURDNSAgICg1KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZCQVQgICAgICAgICAgICAgICg2KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDEgICAgICAgICAgICgxKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDIgICAgICAgICAgICgyKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDNfQURDMiAgICAgICgyKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDNfQURDMyAgICAgICgzKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDQgICAgICAgICAgICg1KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDUgICAgICAgICAgICg1KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDYgICAgICAgICAgICg0KQ0KLSAqDQotICogICAgICAgICAoMSkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMS5cbg0KLSAqICAgICAgICAgKDIpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzIuXG4NCi0gKiAgICAgICAgICgzKSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMzLlxuDQotICogICAgICAgICAoNCkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDNC5cbg0KLSAqICAgICAgICAgKDUpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzUuXG4NCi0gKiAgICAgICAgICg2KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlczogQURDMSwNCi0gKiBBREMzLCBBREM1LlxuICg3KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlczoNCi0gKiBBREMxLCBBREMzLCBBREM0LCBBREM1LlxuDQotICogICAgICAgICAgLSAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIGFsbCBBREN4IGFyZSBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzLg0KLSAqIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIG1vcmUgZGV0YWlscy4gKDgpIE9uIFNUTTMyRzQsIGZhc3QgY2hhbm5lbA0KLSAqIGFsbG93czogMi41IChzYW1wbGluZykgKyAxMi41IChjb252ZXJzaW9uKSA9IDE1IEFEQyBjbG9jayBjeWNsZXMgKGZBREMpIHRvDQotICogY29udmVydCBpbiAxMi1iaXQgcmVzb2x1dGlvbi4gT3RoZXIgY2hhbm5lbHMgYXJlIHNsb3cgY2hhbm5lbHMgIGFsbG93czogNi41DQotICogKHNhbXBsaW5nKSArIDEyLjUgKGNvbnZlcnNpb24pID0gMTkgQURDIGNsb2NrIGN5Y2xlcyAoZkFEQykgdG8gY29udmVydCBpbg0KLSAqIDEyLWJpdCByZXNvbHV0aW9uLlxuDQotICogQHBhcmFtICBPZmZzZXRMZXZlbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwIGFuZCBNYXhfRGF0YT0weEZGRg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19TZXRPZmZzZXQoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IE9mZnNldHksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCBPZmZzZXRMZXZlbCkgew0KLSAgX19JTyB1aW50MzJfdCAqcHJlZyA9IF9fQURDX1BUUl9SRUdfT0ZGU0VUKEFEQ3gtPk9GUjEsIE9mZnNldHkpOw0KLQ0KLSAgTU9ESUZZX1JFRygqcHJlZywNCi0gICAgICAgICAgICAgQURDX09GUjFfT0ZGU0VUMV9FTiB8IEFEQ19PRlIxX09GRlNFVDFfQ0ggfCBBRENfT0ZSMV9PRkZTRVQxLA0KLSAgICAgICAgICAgICBBRENfT0ZSMV9PRkZTRVQxX0VOIHwgKENoYW5uZWwgJiBBRENfQ0hBTk5FTF9JRF9OVU1CRVJfTUFTSykgfA0KLSAgICAgICAgICAgICAgICAgT2Zmc2V0TGV2ZWwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBmb3IgdGhlIEFEQyBzZWxlY3RlZCBvZmZzZXQgbnVtYmVyIDEsIDIsIDMgb3IgNDoNCi0gKiAgICAgICAgIENoYW5uZWwgdG8gd2hpY2ggdGhlIG9mZnNldCBwcm9ncmFtbWVkIHdpbGwgYmUgYXBwbGllZA0KLSAqICAgICAgICAgKGluZGVwZW5kZW50bHkgb2YgY2hhbm5lbCBtYXBwZWQgb24gQURDIGdyb3VwIHJlZ3VsYXINCi0gKiAgICAgICAgIG9yIGdyb3VwIGluamVjdGVkKQ0KLSAqIEBub3RlICAgVXNhZ2Ugb2YgdGhlIHJldHVybmVkIGNoYW5uZWwgbnVtYmVyOg0KLSAqICAgICAgICAgLSBUbyByZWluamVjdCB0aGlzIGNoYW5uZWwgaW50byBhbm90aGVyIGZ1bmN0aW9uIExMX0FEQ194eHg6DQotICogICAgICAgICAgIHRoZSByZXR1cm5lZCBjaGFubmVsIG51bWJlciBpcyBvbmx5IHBhcnRseSBmb3JtYXR0ZWQgb24gZGVmaW5pdGlvbg0KLSAqICAgICAgICAgICBvZiBsaXRlcmFscyBMTF9BRENfQ0hBTk5FTF94LiBUaGVyZWZvcmUsIGl0IGhhcyB0byBiZSBjb21wYXJlZA0KLSAqICAgICAgICAgICB3aXRoIHBhcnRzIG9mIGxpdGVyYWxzIExMX0FEQ19DSEFOTkVMX3ggb3IgdXNpbmcNCi0gKiAgICAgICAgICAgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ0hBTk5FTF9UT19ERUNJTUFMX05CKCkuDQotICogICAgICAgICAgIFRoZW4gdGhlIHNlbGVjdGVkIGxpdGVyYWwgTExfQURDX0NIQU5ORUxfeCBjYW4gYmUgdXNlZA0KLSAqICAgICAgICAgICBhcyBwYXJhbWV0ZXIgZm9yIGFub3RoZXIgZnVuY3Rpb24uDQotICogICAgICAgICAtIFRvIGdldCB0aGUgY2hhbm5lbCBudW1iZXIgaW4gZGVjaW1hbCBmb3JtYXQ6DQotICogICAgICAgICAgIHByb2Nlc3MgdGhlIHJldHVybmVkIHZhbHVlIHdpdGggdGhlIGhlbHBlciBtYWNybw0KLSAqICAgICAgICAgICBAcmVmIF9fTExfQURDX0NIQU5ORUxfVE9fREVDSU1BTF9OQigpLg0KLSAqIEBub3RlICAgT24gU1RNMzJHNCwgc29tZSBmYXN0IGNoYW5uZWxzIGFyZSBhdmFpbGFibGU6IGZhc3QgYW5hbG9nIGlucHV0cw0KLSAqICAgICAgICAgY29taW5nIGZyb20gR1BJTyBwYWRzIChBRENfSU4xLi41KS4NCi0gKiBAcm10b2xsIE9GUjEgICAgIE9GRlNFVDFfQ0ggICAgIExMX0FEQ19HZXRPZmZzZXRDaGFubmVsXG4NCi0gKiAgICAgICAgIE9GUjIgICAgIE9GRlNFVDJfQ0ggICAgIExMX0FEQ19HZXRPZmZzZXRDaGFubmVsXG4NCi0gKiAgICAgICAgIE9GUjMgICAgIE9GRlNFVDNfQ0ggICAgIExMX0FEQ19HZXRPZmZzZXRDaGFubmVsXG4NCi0gKiAgICAgICAgIE9GUjQgICAgIE9GRlNFVDRfQ0ggICAgIExMX0FEQ19HZXRPZmZzZXRDaGFubmVsDQotICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQ0KLSAqIEBwYXJhbSAgT2Zmc2V0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PRkZTRVRfMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PRkZTRVRfMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PRkZTRVRfMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PRkZTRVRfNA0KLSAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8wDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMSAgICAgICAgICAgICAgICAgKDgpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMiAgICAgICAgICAgICAgICAgKDgpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMyAgICAgICAgICAgICAgICAgKDgpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNCAgICAgICAgICAgICAgICAgKDgpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNSAgICAgICAgICAgICAgICAgKDgpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF84DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEwDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEzDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE2DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQgICAgICAgICAgICg3KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1JfQURDMSAgICgxKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1JfQURDNSAgICg1KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZCQVQgICAgICAgICAgICAgICg2KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDEgICAgICAgICAgICgxKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDIgICAgICAgICAgICgyKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDNfQURDMiAgICAgICgyKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDNfQURDMyAgICAgICgzKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDQgICAgICAgICAgICg1KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDUgICAgICAgICAgICg1KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDYgICAgICAgICAgICg0KQ0KLSAqDQotICogICAgICAgICAoMSkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMS5cbg0KLSAqICAgICAgICAgKDIpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzIuXG4NCi0gKiAgICAgICAgICgzKSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMzLlxuDQotICogICAgICAgICAoNCkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDNC5cbg0KLSAqICAgICAgICAgKDUpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzUuXG4NCi0gKiAgICAgICAgICg2KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlczogQURDMSwNCi0gKiBBREMzLCBBREM1LlxuICg3KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlczoNCi0gKiBBREMxLCBBREMzLCBBREM0LCBBREM1LlxuDQotICogICAgICAgICAgLSAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIGFsbCBBREN4IGFyZSBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzLg0KLSAqIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIG1vcmUgZGV0YWlscy4gKDgpIE9uIFNUTTMyRzQsIGZhc3QgY2hhbm5lbA0KLSAqIGFsbG93czogMi41IChzYW1wbGluZykgKyAxMi41IChjb252ZXJzaW9uKSA9IDE1IEFEQyBjbG9jayBjeWNsZXMgKGZBREMpIHRvDQotICogY29udmVydCBpbiAxMi1iaXQgcmVzb2x1dGlvbi4gT3RoZXIgY2hhbm5lbHMgYXJlIHNsb3cgY2hhbm5lbHMgIGFsbG93czogNi41DQotICogKHNhbXBsaW5nKSArIDEyLjUgKGNvbnZlcnNpb24pID0gMTkgQURDIGNsb2NrIGN5Y2xlcyAoZkFEQykgdG8gY29udmVydCBpbg0KLSAqIDEyLWJpdCByZXNvbHV0aW9uLlxuICgxLCAyLCAzLCA0LCA1LCA3KSBGb3IgQURDIGNoYW5uZWwgcmVhZCBiYWNrIGZyb20gQURDDQotICogcmVnaXN0ZXIsIGNvbXBhcmlzb24gd2l0aCBpbnRlcm5hbCBjaGFubmVsIHBhcmFtZXRlciB0byBiZSBkb25lIHVzaW5nIGhlbHBlcg0KLSAqIG1hY3JvIEByZWYgX19MTF9BRENfQ0hBTk5FTF9JTlRFUk5BTF9UT19FWFRFUk5BTCgpLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfR2V0T2Zmc2V0Q2hhbm5lbChBRENfVHlwZURlZiAqQURDeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgT2Zmc2V0eSkgew0KLSAgY29uc3QgX19JTyB1aW50MzJfdCAqcHJlZyA9IF9fQURDX1BUUl9SRUdfT0ZGU0VUKEFEQ3gtPk9GUjEsIE9mZnNldHkpOw0KLQ0KLSAgcmV0dXJuICh1aW50MzJfdClSRUFEX0JJVCgqcHJlZywgQURDX09GUjFfT0ZGU0VUMV9DSCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IGZvciB0aGUgQURDIHNlbGVjdGVkIG9mZnNldCBudW1iZXIgMSwgMiwgMyBvciA0Og0KLSAqICAgICAgICAgT2Zmc2V0IGxldmVsIChvZmZzZXQgdG8gYmUgc3VidHJhY3RlZCBmcm9tIHRoZSByYXcNCi0gKiAgICAgICAgIGNvbnZlcnRlZCBkYXRhKS4NCi0gKiBAbm90ZSAgIENhdXRpb246IE9mZnNldCBmb3JtYXQgaXMgZGVwZW5kZW50IHRvIEFEQyByZXNvbHV0aW9uOg0KLSAqICAgICAgICAgb2Zmc2V0IGhhcyB0byBiZSBsZWZ0LWFsaWduZWQgb24gYml0IDExLCB0aGUgTFNCIChyaWdodCBiaXRzKQ0KLSAqICAgICAgICAgYXJlIHNldCB0byAwLg0KLSAqIEBybXRvbGwgT0ZSMSAgICAgT0ZGU0VUMSAgICAgICAgTExfQURDX0dldE9mZnNldExldmVsXG4NCi0gKiAgICAgICAgIE9GUjIgICAgIE9GRlNFVDIgICAgICAgIExMX0FEQ19HZXRPZmZzZXRMZXZlbFxuDQotICogICAgICAgICBPRlIzICAgICBPRkZTRVQzICAgICAgICBMTF9BRENfR2V0T2Zmc2V0TGV2ZWxcbg0KLSAqICAgICAgICAgT0ZSNCAgICAgT0ZGU0VUNCAgICAgICAgTExfQURDX0dldE9mZnNldExldmVsDQotICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQ0KLSAqIEBwYXJhbSAgT2Zmc2V0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PRkZTRVRfMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PRkZTRVRfMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PRkZTRVRfMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PRkZTRVRfNA0KLSAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMCBhbmQgTWF4X0RhdGE9MHhGRkYNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0dldE9mZnNldExldmVsKEFEQ19UeXBlRGVmICpBREN4LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgT2Zmc2V0eSkgew0KLSAgY29uc3QgX19JTyB1aW50MzJfdCAqcHJlZyA9IF9fQURDX1BUUl9SRUdfT0ZGU0VUKEFEQ3gtPk9GUjEsIE9mZnNldHkpOw0KLQ0KLSAgcmV0dXJuICh1aW50MzJfdClSRUFEX0JJVCgqcHJlZywgQURDX09GUjFfT0ZGU0VUMSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IGZvciB0aGUgQURDIHNlbGVjdGVkIG9mZnNldCBudW1iZXIgMSwgMiwgMyBvciA0Og0KLSAqICAgICAgICAgZm9yY2Ugb2Zmc2V0IHN0YXRlIGRpc2FibGUgb3IgZW5hYmxlDQotICogICAgICAgICB3aXRob3V0IG1vZGlmeWluZyBvZmZzZXQgY2hhbm5lbCBvciBvZmZzZXQgdmFsdWUuDQotICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBuZWVkZWQgb25seSBpbiBjYXNlIG9mIG9mZnNldCB0byBiZQ0KLSAqICAgICAgICAgZW5hYmxlZC1kaXNhYmxlZCBkeW5hbWljYWxseSwgYW5kIHNob3VsZCBub3QgYmUgbmVlZGVkIGluIG90aGVyDQotICogY2FzZXM6IGZ1bmN0aW9uIExMX0FEQ19TZXRPZmZzZXQoKSBhdXRvbWF0aWNhbGx5IGVuYWJsZXMgdGhlIG9mZnNldC4NCi0gKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bw0KLSAqICAgICAgICAgQURDIHN0YXRlOg0KLSAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcNCi0gKiAgICAgICAgIG9uIGVpdGhlciBncm91cHMgcmVndWxhciBvciBpbmplY3RlZC4NCi0gKiBAcm10b2xsIE9GUjEgICAgIE9GRlNFVDFfRU4gICAgIExMX0FEQ19TZXRPZmZzZXRTdGF0ZVxuDQotICogICAgICAgICBPRlIyICAgICBPRkZTRVQyX0VOICAgICBMTF9BRENfU2V0T2Zmc2V0U3RhdGVcbg0KLSAqICAgICAgICAgT0ZSMyAgICAgT0ZGU0VUM19FTiAgICAgTExfQURDX1NldE9mZnNldFN0YXRlXG4NCi0gKiAgICAgICAgIE9GUjQgICAgIE9GRlNFVDRfRU4gICAgIExMX0FEQ19TZXRPZmZzZXRTdGF0ZQ0KLSAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UNCi0gKiBAcGFyYW0gIE9mZnNldHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT0ZGU0VUXzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT0ZGU0VUXzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT0ZGU0VUXzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT0ZGU0VUXzQNCi0gKiBAcGFyYW0gIE9mZnNldFN0YXRlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09GRlNFVF9ESVNBQkxFDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09GRlNFVF9FTkFCTEUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfU2V0T2Zmc2V0U3RhdGUoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IE9mZnNldHksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE9mZnNldFN0YXRlKSB7DQotICBfX0lPIHVpbnQzMl90ICpwcmVnID0gX19BRENfUFRSX1JFR19PRkZTRVQoQURDeC0+T0ZSMSwgT2Zmc2V0eSk7DQotDQotICBNT0RJRllfUkVHKCpwcmVnLCBBRENfT0ZSMV9PRkZTRVQxX0VOLCBPZmZzZXRTdGF0ZSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IGZvciB0aGUgQURDIHNlbGVjdGVkIG9mZnNldCBudW1iZXIgMSwgMiwgMyBvciA0Og0KLSAqICAgICAgICAgb2Zmc2V0IHN0YXRlIGRpc2FibGVkIG9yIGVuYWJsZWQuDQotICogQHJtdG9sbCBPRlIxICAgICBPRkZTRVQxX0VOICAgICBMTF9BRENfR2V0T2Zmc2V0U3RhdGVcbg0KLSAqICAgICAgICAgT0ZSMiAgICAgT0ZGU0VUMl9FTiAgICAgTExfQURDX0dldE9mZnNldFN0YXRlXG4NCi0gKiAgICAgICAgIE9GUjMgICAgIE9GRlNFVDNfRU4gICAgIExMX0FEQ19HZXRPZmZzZXRTdGF0ZVxuDQotICogICAgICAgICBPRlI0ICAgICBPRkZTRVQ0X0VOICAgICBMTF9BRENfR2V0T2Zmc2V0U3RhdGUNCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHBhcmFtICBPZmZzZXR5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09GRlNFVF8xDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09GRlNFVF8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09GRlNFVF8zDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09GRlNFVF80DQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PRkZTRVRfRElTQUJMRQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PRkZTRVRfRU5BQkxFDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19HZXRPZmZzZXRTdGF0ZShBRENfVHlwZURlZiAqQURDeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE9mZnNldHkpIHsNCi0gIGNvbnN0IF9fSU8gdWludDMyX3QgKnByZWcgPSBfX0FEQ19QVFJfUkVHX09GRlNFVChBREN4LT5PRlIxLCBPZmZzZXR5KTsNCi0NCi0gIHJldHVybiAodWludDMyX3QpUkVBRF9CSVQoKnByZWcsIEFEQ19PRlIxX09GRlNFVDFfRU4pOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCBmb3IgdGhlIEFEQyBzZWxlY3RlZCBvZmZzZXQgbnVtYmVyIDEsIDIsIDMgb3IgNDoNCi0gKiAgICAgICAgIGNob29zZSBvZmZzZXQgc2lnbi4NCi0gKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bw0KLSAqICAgICAgICAgQURDIHN0YXRlOg0KLSAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcNCi0gKiAgICAgICAgIG9uIGVpdGhlciBncm91cHMgcmVndWxhciBvciBpbmplY3RlZC4NCi0gKiBAcm10b2xsIE9GUjEgICAgIE9GRlNFVFBPUyAgICAgIExMX0FEQ19TZXRPZmZzZXRTaWduXG4NCi0gKiAgICAgICAgIE9GUjIgICAgIE9GRlNFVFBPUyAgICAgIExMX0FEQ19TZXRPZmZzZXRTaWduXG4NCi0gKiAgICAgICAgIE9GUjMgICAgIE9GRlNFVFBPUyAgICAgIExMX0FEQ19TZXRPZmZzZXRTaWduXG4NCi0gKiAgICAgICAgIE9GUjQgICAgIE9GRlNFVFBPUyAgICAgIExMX0FEQ19TZXRPZmZzZXRTaWduDQotICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQ0KLSAqIEBwYXJhbSAgT2Zmc2V0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PRkZTRVRfMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PRkZTRVRfMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PRkZTRVRfMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PRkZTRVRfNA0KLSAqIEBwYXJhbSAgT2Zmc2V0U2lnbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PRkZTRVRfU0lHTl9ORUdBVElWRQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PRkZTRVRfU0lHTl9QT1NJVElWRQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19TZXRPZmZzZXRTaWduKEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBPZmZzZXR5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE9mZnNldFNpZ24pIHsNCi0gIF9fSU8gdWludDMyX3QgKnByZWcgPSBfX0FEQ19QVFJfUkVHX09GRlNFVChBREN4LT5PRlIxLCBPZmZzZXR5KTsNCi0NCi0gIE1PRElGWV9SRUcoKnByZWcsIEFEQ19PRlIxX09GRlNFVFBPUywgT2Zmc2V0U2lnbik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IGZvciB0aGUgQURDIHNlbGVjdGVkIG9mZnNldCBudW1iZXIgMSwgMiwgMyBvciA0Og0KLSAqICAgICAgICAgb2Zmc2V0IHNpZ24gaWYgcG9zaXRpdmUgb3IgbmVnYXRpdmUuDQotICogQHJtdG9sbCBPRlIxICAgICBPRkZTRVRQT1MgICAgICBMTF9BRENfR2V0T2Zmc2V0U2lnblxuDQotICogICAgICAgICBPRlIyICAgICBPRkZTRVRQT1MgICAgICBMTF9BRENfR2V0T2Zmc2V0U2lnblxuDQotICogICAgICAgICBPRlIzICAgICBPRkZTRVRQT1MgICAgICBMTF9BRENfR2V0T2Zmc2V0U2lnblxuDQotICogICAgICAgICBPRlI0ICAgICBPRkZTRVRQT1MgICAgICBMTF9BRENfR2V0T2Zmc2V0U2lnbg0KLSAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UNCi0gKiBAcGFyYW0gIE9mZnNldHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT0ZGU0VUXzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT0ZGU0VUXzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT0ZGU0VUXzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT0ZGU0VUXzQNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09GRlNFVF9TSUdOX05FR0FUSVZFDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09GRlNFVF9TSUdOX1BPU0lUSVZFDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19HZXRPZmZzZXRTaWduKEFEQ19UeXBlRGVmICpBREN4LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBPZmZzZXR5KSB7DQotICBjb25zdCBfX0lPIHVpbnQzMl90ICpwcmVnID0gX19BRENfUFRSX1JFR19PRkZTRVQoQURDeC0+T0ZSMSwgT2Zmc2V0eSk7DQotDQotICByZXR1cm4gKHVpbnQzMl90KVJFQURfQklUKCpwcmVnLCBBRENfT0ZSMV9PRkZTRVRQT1MpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCBmb3IgdGhlIEFEQyBzZWxlY3RlZCBvZmZzZXQgbnVtYmVyIDEsIDIsIDMgb3IgNDoNCi0gKiAgICAgICAgIGNob29zZSBvZmZzZXQgc2F0dXJhdGlvbiBtb2RlLg0KLSAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvDQotICogICAgICAgICBBREMgc3RhdGU6DQotICogICAgICAgICBBREMgbXVzdCBiZSBkaXNhYmxlZCBvciBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZw0KLSAqICAgICAgICAgb24gZWl0aGVyIGdyb3VwcyByZWd1bGFyIG9yIGluamVjdGVkLg0KLSAqIEBybXRvbGwgT0ZSMSAgICAgU0FURU4gICAgICAgICAgTExfQURDX1NldE9mZnNldFNhdHVyYXRpb25cbg0KLSAqICAgICAgICAgT0ZSMiAgICAgU0FURU4gICAgICAgICAgTExfQURDX1NldE9mZnNldFNhdHVyYXRpb25cbg0KLSAqICAgICAgICAgT0ZSMyAgICAgU0FURU4gICAgICAgICAgTExfQURDX1NldE9mZnNldFNhdHVyYXRpb25cbg0KLSAqICAgICAgICAgT0ZSNCAgICAgU0FURU4gICAgICAgICAgTExfQURDX1NldE9mZnNldFNhdHVyYXRpb24NCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHBhcmFtICBPZmZzZXR5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09GRlNFVF8xDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09GRlNFVF8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09GRlNFVF8zDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09GRlNFVF80DQotICogQHBhcmFtICBPZmZzZXRTYXR1cmF0aW9uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09GRlNFVF9TQVRVUkFUSU9OX0VOQUJMRQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PRkZTRVRfU0FUVVJBVElPTl9ESVNBQkxFDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1NldE9mZnNldFNhdHVyYXRpb24oQURDX1R5cGVEZWYgKkFEQ3gsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgT2Zmc2V0eSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBPZmZzZXRTYXR1cmF0aW9uKSB7DQotICBfX0lPIHVpbnQzMl90ICpwcmVnID0gX19BRENfUFRSX1JFR19PRkZTRVQoQURDeC0+T0ZSMSwgT2Zmc2V0eSk7DQotDQotICBNT0RJRllfUkVHKCpwcmVnLCBBRENfT0ZSMV9TQVRFTiwgT2Zmc2V0U2F0dXJhdGlvbik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IGZvciB0aGUgQURDIHNlbGVjdGVkIG9mZnNldCBudW1iZXIgMSwgMiwgMyBvciA0Og0KLSAqICAgICAgICAgb2Zmc2V0IHNhdHVyYXRpb24gaWYgZW5hYmxlZCBvciBkaXNhYmxlZC4NCi0gKiBAcm10b2xsIE9GUjEgICAgIFNBVEVOICAgICAgICAgIExMX0FEQ19HZXRPZmZzZXRTYXR1cmF0aW9uXG4NCi0gKiAgICAgICAgIE9GUjIgICAgIFNBVEVOICAgICAgICAgIExMX0FEQ19HZXRPZmZzZXRTYXR1cmF0aW9uXG4NCi0gKiAgICAgICAgIE9GUjMgICAgIFNBVEVOICAgICAgICAgIExMX0FEQ19HZXRPZmZzZXRTYXR1cmF0aW9uXG4NCi0gKiAgICAgICAgIE9GUjQgICAgIFNBVEVOICAgICAgICAgIExMX0FEQ19HZXRPZmZzZXRTYXR1cmF0aW9uDQotICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQ0KLSAqIEBwYXJhbSAgT2Zmc2V0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PRkZTRVRfMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PRkZTRVRfMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PRkZTRVRfMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PRkZTRVRfNA0KLSAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT0ZGU0VUX1NBVFVSQVRJT05fRU5BQkxFDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09GRlNFVF9TQVRVUkFUSU9OX0RJU0FCTEUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0dldE9mZnNldFNhdHVyYXRpb24oQURDX1R5cGVEZWYgKkFEQ3gsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE9mZnNldHkpIHsNCi0gIGNvbnN0IF9fSU8gdWludDMyX3QgKnByZWcgPSBfX0FEQ19QVFJfUkVHX09GRlNFVChBREN4LT5PRlIxLCBPZmZzZXR5KTsNCi0NCi0gIHJldHVybiAodWludDMyX3QpUkVBRF9CSVQoKnByZWcsIEFEQ19PRlIxX1NBVEVOKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZXQgQURDIGdhaW4gY29tcGVuc2F0aW9uLg0KLSAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBzZXQgdGhlIGdhaW4gY29tcGVuc2F0aW9uIGNvZWZmaWNpZW50DQotICogICAgICAgICB0aGF0IGlzIGFwcGxpZWQgdG8gcmF3IGNvbnZlcnRlZCBkYXRhIHVzaW5nIHRoZSBmb3JtdWxhOg0KLSAqICAgICAgICAgICBEQVRBID0gREFUQShyYXcpICogKGdhaW4gY29tcGVuc2F0aW9uIGNvZWYpIC8gNDA5Ng0KLSAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBlbmFibGVzIHRoZSBnYWluIGNvbXBlbnNhdGlvbiBpZiBnaXZlbg0KLSAqICAgICAgICAgY29lZmZpY2llbnQgaXMgYWJvdmUgMCwgb3RoZXJ3aXNlIGl0IGRpc2FibGVzIGl0Lg0KLSAqIEBub3RlICAgR2FpbiBjb21wZW5zYXRpb24gd2hlbiBlbmFibGVkIGlzIGFwcGxpZWQgdG8gYWxsIGNoYW5uZWxzLg0KLSAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvDQotICogICAgICAgICBBREMgc3RhdGU6DQotICogICAgICAgICBBREMgbXVzdCBiZSBkaXNhYmxlZCBvciBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZw0KLSAqICAgICAgICAgb24gZWl0aGVyIGdyb3VwcyByZWd1bGFyIG9yIGluamVjdGVkLg0KLSAqIEBybXRvbGwgR0NPTVAgICAgR0NPTVBDT0VGRiAgICAgTExfQURDX1NldEdhaW5Db21wZW5zYXRpb25cbg0KLSAqICAgICAgICAgQ0ZHUjIgICAgR0NPTVAgICAgICAgICAgTExfQURDX1NldEdhaW5Db21wZW5zYXRpb24NCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHBhcmFtICBHYWluQ29tcGVuc2F0aW9uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToNCi0gKiAgICAgICAgIDAgICAgICAgICAgIEdhaW4gY29tcGVuc2F0aW9uIHdpbGwgYmUgZGlzYWJsZWQgYW5kIHZhbHVlIHNldCB0byAwDQotICogICAgICAgICAxIC0+IDE2MzkzICBHYWluIGNvbXBlbnNhdGlvbiB3aWxsIGJlIGVuYWJsZWQgd2l0aCBzcGVjaWZpZWQgdmFsdWUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfU2V0R2FpbkNvbXBlbnNhdGlvbihBRENfVHlwZURlZiAqQURDeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBHYWluQ29tcGVuc2F0aW9uKSB7DQotICBNT0RJRllfUkVHKEFEQ3gtPkdDT01QLCBBRENfR0NPTVBfR0NPTVBDT0VGRiwgR2FpbkNvbXBlbnNhdGlvbik7DQotICBNT0RJRllfUkVHKEFEQ3gtPkNGR1IyLCBBRENfQ0ZHUjJfR0NPTVAsDQotICAgICAgICAgICAgICgoR2FpbkNvbXBlbnNhdGlvbiA9PSAwVUwpID8gMFVMIDogMVVMKSA8PCBBRENfQ0ZHUjJfR0NPTVBfUG9zKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgdGhlIEFEQyBnYWluIGNvbXBlbnNhdGlvbiB2YWx1ZQ0KLSAqIEBybXRvbGwgR0NPTVAgICAgR0NPTVBDT0VGRiAgICAgTExfQURDX0dldEdhaW5Db21wZW5zYXRpb25cbg0KLSAqICAgICAgICAgQ0ZHUjIgICAgR0NPTVAgICAgICAgICAgTExfQURDX0dldEdhaW5Db21wZW5zYXRpb24NCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmU6DQotICogICAgICAgICAwICAgICAgICAgICBHYWluIGNvbXBlbnNhdGlvbiBpcyBkaXNhYmxlZA0KLSAqICAgICAgICAgMSAtPiAxNjM5MyAgR2FpbiBjb21wZW5zYXRpb24gaXMgZW5hYmxlZCB3aXRoIHJldHVybmVkIHZhbHVlDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19HZXRHYWluQ29tcGVuc2F0aW9uKEFEQ19UeXBlRGVmICpBREN4KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChBREN4LT5DRkdSMiwgQURDX0NGR1IyX0dDT01QKSA9PSBBRENfQ0ZHUjJfR0NPTVApDQotICAgICAgICAgICAgICA/IFJFQURfQklUKEFEQ3gtPkdDT01QLCBBRENfR0NPTVBfR0NPTVBDT0VGRikNCi0gICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotI2lmIGRlZmluZWQoQURDX1NNUFIxX1NNUFBMVVMpDQotLyoqDQotICogQGJyaWVmICBTZXQgQURDIHNhbXBsaW5nIHRpbWUgY29tbW9uIGNvbmZpZ3VyYXRpb24gaW1wYWN0aW5nDQotICogICAgICAgICBzZXR0aW5ncyBvZiBzYW1wbGluZyB0aW1lIGNoYW5uZWwgd2lzZS4NCi0gKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bw0KLSAqICAgICAgICAgQURDIHN0YXRlOg0KLSAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcNCi0gKiAgICAgICAgIG9uIGVpdGhlciBncm91cHMgcmVndWxhciBvciBpbmplY3RlZC4NCi0gKiBAcm10b2xsIFNNUFIxICAgIFNNUFBMVVMgICAgICAgIExMX0FEQ19TZXRTYW1wbGluZ1RpbWVDb21tb25Db25maWcNCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHBhcmFtICBTYW1wbGluZ1RpbWVDb21tb25Db25maWcgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nDQotICogdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19TQU1QTElOR1RJTUVfQ09NTU9OX0RFRkFVTFQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfU0FNUExJTkdUSU1FX0NPTU1PTl8zQzVfUkVQTF8yQzUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfU2V0U2FtcGxpbmdUaW1lQ29tbW9uQ29uZmlnKA0KLSAgICBBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgU2FtcGxpbmdUaW1lQ29tbW9uQ29uZmlnKSB7DQotICBNT0RJRllfUkVHKEFEQ3gtPlNNUFIxLCBBRENfU01QUjFfU01QUExVUywgU2FtcGxpbmdUaW1lQ29tbW9uQ29uZmlnKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgQURDIHNhbXBsaW5nIHRpbWUgY29tbW9uIGNvbmZpZ3VyYXRpb24gaW1wYWN0aW5nDQotICogICAgICAgICBzZXR0aW5ncyBvZiBzYW1wbGluZyB0aW1lIGNoYW5uZWwgd2lzZS4NCi0gKiBAcm10b2xsIFNNUFIxICAgIFNNUFBMVVMgICAgICAgIExMX0FEQ19HZXRTYW1wbGluZ1RpbWVDb21tb25Db25maWcNCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19TQU1QTElOR1RJTUVfQ09NTU9OX0RFRkFVTFQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfU0FNUExJTkdUSU1FX0NPTU1PTl8zQzVfUkVQTF8yQzUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0dldFNhbXBsaW5nVGltZUNvbW1vbkNvbmZpZyhBRENfVHlwZURlZiAqQURDeCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeC0+U01QUjEsIEFEQ19TTVBSMV9TTVBQTFVTKSk7DQotfQ0KLSNlbmRpZiAvKiBBRENfU01QUjFfU01QUExVUyAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBBRENfTExfRUZfQ29uZmlndXJhdGlvbl9BRENfR3JvdXBfUmVndWxhciBDb25maWd1cmF0aW9uIG9mIEFEQw0KLSAqIGhpZXJhcmNoaWNhbCBzY29wZTogZ3JvdXAgcmVndWxhcg0KLSAqIEB7DQotICovDQotDQotLyoqDQotICogQGJyaWVmICBTZXQgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIHNvdXJjZToNCi0gKiAgICAgICAgIGludGVybmFsIChTVyBzdGFydCkgb3IgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsICh0aW1lciBldmVudCwNCi0gKiAgICAgICAgIGV4dGVybmFsIGludGVycnVwdCBsaW5lKS4NCi0gKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBzZXR0aW5nIHRyaWdnZXIgc291cmNlIHRvIGV4dGVybmFsIHRyaWdnZXINCi0gKiAgICAgICAgIGFsc28gc2V0IHRyaWdnZXIgcG9sYXJpdHkgdG8gcmlzaW5nIGVkZ2UNCi0gKiAgICAgICAgIChkZWZhdWx0IHNldHRpbmcgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBzb21lIEFEQyBvbiBvdGhlcg0KLSAqICAgICAgICAgU1RNMzIgZmFtaWxpZXMgaGF2aW5nIHRoaXMgc2V0dGluZyBzZXQgYnkgSFcgZGVmYXVsdCB2YWx1ZSkuDQotICogICAgICAgICBJbiBjYXNlIG9mIG5lZWQgdG8gbW9kaWZ5IHRyaWdnZXIgZWRnZSwgdXNlDQotICogICAgICAgICBmdW5jdGlvbiBAcmVmIExMX0FEQ19SRUdfU2V0VHJpZ2dlckVkZ2UoKS4NCi0gKiBAbm90ZSAgIEF2YWlsYWJpbGl0eSBvZiBwYXJhbWV0ZXJzIG9mIHRyaWdnZXIgc291cmNlcyBmcm9tIHRpbWVyDQotICogICAgICAgICBkZXBlbmRzIG9uIHRpbWVycyBhdmFpbGFiaWxpdHkgb24gdGhlIHNlbGVjdGVkIGRldmljZS4NCi0gKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bw0KLSAqICAgICAgICAgQURDIHN0YXRlOg0KLSAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcNCi0gKiAgICAgICAgIG9uIGdyb3VwIHJlZ3VsYXIuDQotICogQHJtdG9sbCBDRkdSICAgICBFWFRTRUwgICAgICAgICBMTF9BRENfUkVHX1NldFRyaWdnZXJTb3VyY2Vcbg0KLSAqICAgICAgICAgQ0ZHUiAgICAgRVhURU4gICAgICAgICAgTExfQURDX1JFR19TZXRUcmlnZ2VyU291cmNlDQotICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQ0KLSAqIEBwYXJhbSAgVHJpZ2dlclNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19TT0ZUV0FSRQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9UUkdPDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU0xX1RSR08yDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU0xX0NIMSAgICAgICAgKDEpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU0xX0NIMiAgICAgICAgKDEpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU0xX0NIMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMl9UUkdPDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU0yX0NIMSAgICAgICAgKDIpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU0yX0NIMiAgICAgICAgKDEpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU0yX0NIMyAgICAgICAgKDIpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU0zX1RSR08NCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTNfQ0gxICAgICAgICAoMikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTNfQ0g0ICAgICAgICAoMSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTRfVFJHTw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNNF9DSDEgICAgICAgICgyKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNNF9DSDQgICAgICAgICgxKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNNl9UUkdPDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU03X1RSR08NCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTThfVFJHTw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNOF9UUkdPMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNOF9DSDEgICAgICAgICgyKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMTVfVFJHTw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMjBfVFJHTw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMjBfVFJHTzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTIwX0NIMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMjBfQ0gyICAgICAgICgxKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMjBfQ0gzICAgICAgICgxKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfSFJUSU1fVFJHMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfSFJUSU1fVFJHMiAgICAgICgyKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfSFJUSU1fVFJHMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfSFJUSU1fVFJHNCAgICAgICgyKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfSFJUSU1fVFJHNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfSFJUSU1fVFJHNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfSFJUSU1fVFJHNw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfSFJUSU1fVFJHOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfSFJUSU1fVFJHOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfSFJUSU1fVFJHMTANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX0VYVElfTElORTExICAgICAoMSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX0VYVElfTElORTIgICAgICAoMikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX0xQVElNX09VVA0KLSAqDQotICogICAgICAgICAoMSkgT24gU1RNMzJHNCBzZXJpZXMsIHBhcmFtZXRlciBub3QgYXZhaWxhYmxlIG9uIGFsbCBBREMgaW5zdGFuY2VzOg0KLSAqIEFEQzEsIEFEQzIuXG4gKDIpIE9uIFNUTTMyRzQgc2VyaWVzLCBwYXJhbWV0ZXIgbm90IGF2YWlsYWJsZSBvbiBhbGwgQURDDQotICogaW5zdGFuY2VzOiBBREMzLCBBREM0LCBBREM1LiBPbiB0aGlzIFNUTTMyIHNlcmllcywgYWxsIEFEQ3ggYXJlIG5vdCBhdmFpbGFibGUNCi0gKiBvbiBhbGwgZGV2aWNlcy4gUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgbW9yZSBkZXRhaWxzLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19SRUdfU2V0VHJpZ2dlclNvdXJjZShBRENfVHlwZURlZiAqQURDeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVHJpZ2dlclNvdXJjZSkgew0KLSAgTU9ESUZZX1JFRyhBREN4LT5DRkdSLCBBRENfQ0ZHUl9FWFRFTiB8IEFEQ19DRkdSX0VYVFNFTCwgVHJpZ2dlclNvdXJjZSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBzb3VyY2U6DQotICogICAgICAgICBpbnRlcm5hbCAoU1cgc3RhcnQpIG9yIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbCAodGltZXIgZXZlbnQsDQotICogICAgICAgICBleHRlcm5hbCBpbnRlcnJ1cHQgbGluZSkuDQotICogQG5vdGUgICBUbyBkZXRlcm1pbmUgd2hldGhlciBncm91cCByZWd1bGFyIHRyaWdnZXIgc291cmNlIGlzDQotICogICAgICAgICBpbnRlcm5hbCAoU1cgc3RhcnQpIG9yIGV4dGVybmFsLCB3aXRob3V0IGRldGFpbA0KLSAqICAgICAgICAgb2Ygd2hpY2ggcGVyaXBoZXJhbCBpcyBzZWxlY3RlZCBhcyBleHRlcm5hbCB0cmlnZ2VyLA0KLSAqICAgICAgICAgKGVxdWl2YWxlbnQgdG8NCi0gKiAgICAgICAgICJpZihMTF9BRENfUkVHX0dldFRyaWdnZXJTb3VyY2UoQURDMSkgPT0gTExfQURDX1JFR19UUklHX1NPRlRXQVJFKSIpDQotICogICAgICAgICB1c2UgZnVuY3Rpb24gQHJlZiBMTF9BRENfUkVHX0lzVHJpZ2dlclNvdXJjZVNXU3RhcnQuDQotICogQG5vdGUgICBBdmFpbGFiaWxpdHkgb2YgcGFyYW1ldGVycyBvZiB0cmlnZ2VyIHNvdXJjZXMgZnJvbSB0aW1lcg0KLSAqICAgICAgICAgZGVwZW5kcyBvbiB0aW1lcnMgYXZhaWxhYmlsaXR5IG9uIHRoZSBzZWxlY3RlZCBkZXZpY2UuDQotICogQHJtdG9sbCBDRkdSICAgICBFWFRTRUwgICAgICAgICBMTF9BRENfUkVHX0dldFRyaWdnZXJTb3VyY2Vcbg0KLSAqICAgICAgICAgQ0ZHUiAgICAgRVhURU4gICAgICAgICAgTExfQURDX1JFR19HZXRUcmlnZ2VyU291cmNlDQotICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfU09GVFdBUkUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfVFJHTw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9UUkdPMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9DSDEgICAgICAgICgxKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9DSDIgICAgICAgICgxKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9DSDMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTJfVFJHTw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMl9DSDEgICAgICAgICgyKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMl9DSDIgICAgICAgICgxKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMl9DSDMgICAgICAgICgyKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNM19UUkdPDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU0zX0NIMSAgICAgICAgKDIpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU0zX0NINCAgICAgICAgKDEpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU00X1RSR08NCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTRfQ0gxICAgICAgICAoMikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTRfQ0g0ICAgICAgICAoMSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTZfVFJHTw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNN19UUkdPDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU04X1RSR08NCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTThfVFJHTzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTThfQ0gxICAgICAgICAoMikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTE1X1RSR08NCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTIwX1RSR08NCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTIwX1RSR08yDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU0yMF9DSDENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTIwX0NIMiAgICAgICAoMSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTIwX0NIMyAgICAgICAoMSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX0hSVElNX1RSRzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX0hSVElNX1RSRzIgICAgICAoMikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX0hSVElNX1RSRzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX0hSVElNX1RSRzQgICAgICAoMikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX0hSVElNX1RSRzUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX0hSVElNX1RSRzYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX0hSVElNX1RSRzcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX0hSVElNX1RSRzgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX0hSVElNX1RSRzkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX0hSVElNX1RSRzEwDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9FWFRJX0xJTkUxMSAgICAgKDEpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9FWFRJX0xJTkUyICAgICAgKDIpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9MUFRJTV9PVVQNCi0gKg0KLSAqICAgICAgICAgKDEpIE9uIFNUTTMyRzQgc2VyaWVzLCBwYXJhbWV0ZXIgbm90IGF2YWlsYWJsZSBvbiBhbGwgQURDIGluc3RhbmNlczoNCi0gKiBBREMxLCBBREMyLlxuICgyKSBPbiBTVE0zMkc0IHNlcmllcywgcGFyYW1ldGVyIG5vdCBhdmFpbGFibGUgb24gYWxsIEFEQw0KLSAqIGluc3RhbmNlczogQURDMywgQURDNCwgQURDNS4gT24gdGhpcyBTVE0zMiBzZXJpZXMsIGFsbCBBREN4IGFyZSBub3QgYXZhaWxhYmxlDQotICogb24gYWxsIGRldmljZXMuIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIG1vcmUgZGV0YWlscy4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX1JFR19HZXRUcmlnZ2VyU291cmNlKEFEQ19UeXBlRGVmICpBREN4KSB7DQotICBfX0lPIHVpbnQzMl90IFRyaWdnZXJTb3VyY2UgPQ0KLSAgICAgIFJFQURfQklUKEFEQ3gtPkNGR1IsIEFEQ19DRkdSX0VYVFNFTCB8IEFEQ19DRkdSX0VYVEVOKTsNCi0NCi0gIC8qIFZhbHVlIGZvciBzaGlmdCBvZiB7MDsgNDsgODsgMTJ9IGRlcGVuZGluZyBvbiB2YWx1ZSBvZiBiaXRmaWVsZCAgICAgICAgICAqLw0KLSAgLyogY29ycmVzcG9uZGluZyB0byBBRENfQ0ZHUl9FWFRFTiB7MDsgMTsgMjsgM30uICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICB1aW50MzJfdCBTaGlmdEV4dGVuID0gKChUcmlnZ2VyU291cmNlICYgQURDX0NGR1JfRVhURU4pID4+DQotICAgICAgICAgICAgICAgICAgICAgICAgIChBRENfUkVHX1RSSUdfRVhURU5fQklUT0ZGU0VUX1BPUyAtIDJVTCkpOw0KLQ0KLSAgLyogU2V0IGJpdGZpZWxkIGNvcnJlc3BvbmRpbmcgdG8gQURDX0NGR1JfRVhURU4gYW5kIEFEQ19DRkdSX0VYVFNFTCAgICAgICAgICovDQotICAvKiB0byBtYXRjaCB3aXRoIHRyaWdnZXJzIGxpdGVyYWxzIGRlZmluaXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gIHJldHVybiAoKFRyaWdnZXJTb3VyY2UgJiAoQURDX1JFR19UUklHX1NPVVJDRV9NQVNLID4+IFNoaWZ0RXh0ZW4pICYNCi0gICAgICAgICAgIEFEQ19DRkdSX0VYVFNFTCkgfA0KLSAgICAgICAgICAoKEFEQ19SRUdfVFJJR19FREdFX01BU0sgPj4gU2hpZnRFeHRlbikgJiBBRENfQ0ZHUl9FWFRFTikpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgc291cmNlIGludGVybmFsIChTVyBzdGFydCkNCi0gKiAgICAgICAgIG9yIGV4dGVybmFsLg0KLSAqIEBub3RlICAgSW4gY2FzZSBvZiBncm91cCByZWd1bGFyIHRyaWdnZXIgc291cmNlIHNldCB0byBleHRlcm5hbCB0cmlnZ2VyLA0KLSAqICAgICAgICAgdG8gZGV0ZXJtaW5lIHdoaWNoIHBlcmlwaGVyYWwgaXMgc2VsZWN0ZWQgYXMgZXh0ZXJuYWwgdHJpZ2dlciwNCi0gKiAgICAgICAgIHVzZSBmdW5jdGlvbiBAcmVmIExMX0FEQ19SRUdfR2V0VHJpZ2dlclNvdXJjZSgpLg0KLSAqIEBybXRvbGwgQ0ZHUiAgICAgRVhURU4gICAgICAgICAgTExfQURDX1JFR19Jc1RyaWdnZXJTb3VyY2VTV1N0YXJ0DQotICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgVmFsdWUgIjAiIGlmIHRyaWdnZXIgc291cmNlIGV4dGVybmFsIHRyaWdnZXINCi0gKiAgICAgICAgIFZhbHVlICIxIiBpZiB0cmlnZ2VyIHNvdXJjZSBTVyBzdGFydC4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX1JFR19Jc1RyaWdnZXJTb3VyY2VTV1N0YXJ0KEFEQ19UeXBlRGVmICpBREN4KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChBREN4LT5DRkdSLCBBRENfQ0ZHUl9FWFRFTikgPT0NCi0gICAgICAgICAgIChMTF9BRENfUkVHX1RSSUdfU09GVFdBUkUgJiBBRENfQ0ZHUl9FWFRFTikpDQotICAgICAgICAgICAgICA/IDFVTA0KLSAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgcG9sYXJpdHkuDQotICogQG5vdGUgICBBcHBsaWNhYmxlIG9ubHkgZm9yIHRyaWdnZXIgc291cmNlIHNldCB0byBleHRlcm5hbCB0cmlnZ2VyLg0KLSAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvDQotICogICAgICAgICBBREMgc3RhdGU6DQotICogICAgICAgICBBREMgbXVzdCBiZSBkaXNhYmxlZCBvciBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZw0KLSAqICAgICAgICAgb24gZ3JvdXAgcmVndWxhci4NCi0gKiBAcm10b2xsIENGR1IgICAgIEVYVEVOICAgICAgICAgIExMX0FEQ19SRUdfU2V0VHJpZ2dlckVkZ2UNCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHBhcmFtICBFeHRlcm5hbFRyaWdnZXJFZGdlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZw0KLSAqIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1JJU0lORw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfRkFMTElORw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfUklTSU5HRkFMTElORw0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19SRUdfU2V0VHJpZ2dlckVkZ2UoQURDX1R5cGVEZWYgKkFEQ3gsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBFeHRlcm5hbFRyaWdnZXJFZGdlKSB7DQotICBNT0RJRllfUkVHKEFEQ3gtPkNGR1IsIEFEQ19DRkdSX0VYVEVOLCBFeHRlcm5hbFRyaWdnZXJFZGdlKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIHBvbGFyaXR5Lg0KLSAqIEBub3RlICAgQXBwbGljYWJsZSBvbmx5IGZvciB0cmlnZ2VyIHNvdXJjZSBzZXQgdG8gZXh0ZXJuYWwgdHJpZ2dlci4NCi0gKiBAcm10b2xsIENGR1IgICAgIEVYVEVOICAgICAgICAgIExMX0FEQ19SRUdfR2V0VHJpZ2dlckVkZ2UNCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfUklTSU5HDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9GQUxMSU5HDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9SSVNJTkdGQUxMSU5HDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19SRUdfR2V0VHJpZ2dlckVkZ2UoQURDX1R5cGVEZWYgKkFEQ3gpIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEFEQ3gtPkNGR1IsIEFEQ19DRkdSX0VYVEVOKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IEFEQyBzYW1wbGluZyBtb2RlLg0KLSAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBzZXQgdGhlIEFEQyBjb252ZXJzaW9uIHNhbXBsaW5nIG1vZGUNCi0gKiBAbm90ZSAgIFRoaXMgbW9kZSBhcHBsaWVzIHRvIHJlZ3VsYXIgZ3JvdXAgb25seS4NCi0gKiBAbm90ZSAgIFNldCBzYW1wbGluZyBtb2RlIGlzIGFwcGxpZWQgdG8gYWxsIGNvbnZlcnNpb24gb2YgcmVndWxhciBncm91cC4NCi0gKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bw0KLSAqICAgICAgICAgQURDIHN0YXRlOg0KLSAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcNCi0gKiAgICAgICAgIG9uIGdyb3VwIHJlZ3VsYXIuDQotICogQHJtdG9sbCBDRkdSMiAgICBCVUxCICAgICAgICAgICBMTF9BRENfUkVHX1NldFNhbXBsaW5nTW9kZVxuDQotICogICAgICAgICBDRkdSMiAgICBTTVBUUklHICAgICAgICBMTF9BRENfUkVHX1NldFNhbXBsaW5nTW9kZQ0KLSAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UNCi0gKiBAcGFyYW0gIFNhbXBsaW5nTW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0FNUExJTkdfTU9ERV9OT1JNQUwNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NBTVBMSU5HX01PREVfQlVMQg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0FNUExJTkdfTU9ERV9UUklHR0VSX0NPTlRST0xFRA0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19SRUdfU2V0U2FtcGxpbmdNb2RlKEFEQ19UeXBlRGVmICpBREN4LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFNhbXBsaW5nTW9kZSkgew0KLSAgTU9ESUZZX1JFRyhBREN4LT5DRkdSMiwgQURDX0NGR1IyX0JVTEIgfCBBRENfQ0ZHUjJfU01QVFJJRywgU2FtcGxpbmdNb2RlKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgdGhlIEFEQyBzYW1wbGluZyBtb2RlDQotICogQHJtdG9sbCBDRkdSMiAgICBCVUxCICAgICAgICAgICBMTF9BRENfUkVHX0dldFNhbXBsaW5nTW9kZVxuDQotICogICAgICAgICBDRkdSMiAgICBTTVBUUklHICAgICAgICBMTF9BRENfUkVHX0dldFNhbXBsaW5nTW9kZQ0KLSAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TQU1QTElOR19NT0RFX05PUk1BTA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0FNUExJTkdfTU9ERV9CVUxCDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TQU1QTElOR19NT0RFX1RSSUdHRVJfQ09OVFJPTEVEDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19SRUdfR2V0U2FtcGxpbmdNb2RlKEFEQ19UeXBlRGVmICpBREN4KSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChBREN4LT5DRkdSMiwgQURDX0NGR1IyX0JVTEIgfCBBRENfQ0ZHUjJfU01QVFJJRykpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgbGVuZ3RoIGFuZCBzY2FuIGRpcmVjdGlvbi4NCi0gKiBAbm90ZSAgIERlc2NyaXB0aW9uIG9mIEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBmZWF0dXJlczoNCi0gKiAgICAgICAgIC0gRm9yIGRldmljZXMgd2l0aCBzZXF1ZW5jZXIgZnVsbHkgY29uZmlndXJhYmxlDQotICogICAgICAgICAgIChmdW5jdGlvbiAiTExfQURDX1JFR19TZXRTZXF1ZW5jZXJSYW5rcygpIiBhdmFpbGFibGUpOg0KLSAqICAgICAgICAgICBzZXF1ZW5jZXIgbGVuZ3RoIGFuZCBlYWNoIHJhbmsgYWZmZWN0YXRpb24gdG8gYSBjaGFubmVsDQotICogICAgICAgICAgIGFyZSBjb25maWd1cmFibGUuDQotICogICAgICAgICAgIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgY29uZmlndXJhdGlvbiBvZjoNCi0gKiAgICAgICAgICAgLSBTZXF1ZW5jZSBsZW5ndGg6IE51bWJlciBvZiByYW5rcyBpbiB0aGUgc2NhbiBzZXF1ZW5jZS4NCi0gKiAgICAgICAgICAgLSBTZXF1ZW5jZSBkaXJlY3Rpb246IFVubGVzcyBzcGVjaWZpZWQgaW4gcGFyYW1ldGVycywgc2VxdWVuY2VyDQotICogICAgICAgICAgICAgc2NhbiBkaXJlY3Rpb24gaXMgZm9yd2FyZCAoZnJvbSByYW5rIDEgdG8gcmFuayBuKS4NCi0gKiAgICAgICAgICAgU2VxdWVuY2VyIHJhbmtzIGFyZSBzZWxlY3RlZCB1c2luZw0KLSAqICAgICAgICAgICBmdW5jdGlvbiAiTExfQURDX1JFR19TZXRTZXF1ZW5jZXJSYW5rcygpIi4NCi0gKiAgICAgICAgIC0gRm9yIGRldmljZXMgd2l0aCBzZXF1ZW5jZXIgbm90IGZ1bGx5IGNvbmZpZ3VyYWJsZQ0KLSAqICAgICAgICAgICAoZnVuY3Rpb24gIkxMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ2hhbm5lbHMoKSIgYXZhaWxhYmxlKToNCi0gKiAgICAgICAgICAgc2VxdWVuY2VyIGxlbmd0aCBhbmQgZWFjaCByYW5rIGFmZmVjdGF0aW9uIHRvIGEgY2hhbm5lbA0KLSAqICAgICAgICAgICBhcmUgZGVmaW5lZCBieSBjaGFubmVsIG51bWJlci4NCi0gKiAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBjb25maWd1cmF0aW9uIG9mOg0KLSAqICAgICAgICAgICAtIFNlcXVlbmNlIGxlbmd0aDogTnVtYmVyIG9mIHJhbmtzIGluIHRoZSBzY2FuIHNlcXVlbmNlIGlzDQotICogICAgICAgICAgICAgZGVmaW5lZCBieSBudW1iZXIgb2YgY2hhbm5lbHMgc2V0IGluIHRoZSBzZXF1ZW5jZSwNCi0gKiAgICAgICAgICAgICByYW5rIG9mIGVhY2ggY2hhbm5lbCBpcyBmaXhlZCBieSBjaGFubmVsIEhXIG51bWJlci4NCi0gKiAgICAgICAgICAgICAoY2hhbm5lbCAwIGZpeGVkIG9uIHJhbmsgMCwgY2hhbm5lbCAxIGZpeGVkIG9uIHJhbmsxLCAuLi4pLg0KLSAqICAgICAgICAgICAtIFNlcXVlbmNlIGRpcmVjdGlvbjogVW5sZXNzIHNwZWNpZmllZCBpbiBwYXJhbWV0ZXJzLCBzZXF1ZW5jZXINCi0gKiAgICAgICAgICAgICBzY2FuIGRpcmVjdGlvbiBpcyBmb3J3YXJkIChmcm9tIGxvd2VzdCBjaGFubmVsIG51bWJlciB0bw0KLSAqICAgICAgICAgICAgIGhpZ2hlc3QgY2hhbm5lbCBudW1iZXIpLg0KLSAqICAgICAgICAgICBTZXF1ZW5jZXIgcmFua3MgYXJlIHNlbGVjdGVkIHVzaW5nDQotICogICAgICAgICAgIGZ1bmN0aW9uICJMTF9BRENfUkVHX1NldFNlcXVlbmNlckNoYW5uZWxzKCkiLg0KLSAqIEBub3RlICAgU2VxdWVuY2VyIGRpc2FibGVkIGlzIGVxdWl2YWxlbnQgdG8gc2VxdWVuY2VyIG9mIDEgcmFuazoNCi0gKiAgICAgICAgIEFEQyBjb252ZXJzaW9uIG9uIG9ubHkgMSBjaGFubmVsLg0KLSAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvDQotICogICAgICAgICBBREMgc3RhdGU6DQotICogICAgICAgICBBREMgbXVzdCBiZSBkaXNhYmxlZCBvciBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZw0KLSAqICAgICAgICAgb24gZ3JvdXAgcmVndWxhci4NCi0gKiBAcm10b2xsIFNRUjEgICAgIEwgICAgICAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyTGVuZ3RoDQotICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQ0KLSAqIEBwYXJhbSAgU2VxdWVuY2VyTmJSYW5rcyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRElTQUJMRQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzJSQU5LUw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzNSQU5LUw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzRSQU5LUw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzVSQU5LUw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzZSQU5LUw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzdSQU5LUw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzhSQU5LUw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzlSQU5LUw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzEwUkFOS1MNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV8xMVJBTktTDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMTJSQU5LUw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzEzUkFOS1MNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV8xNFJBTktTDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMTVSQU5LUw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzE2UkFOS1MNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfUkVHX1NldFNlcXVlbmNlckxlbmd0aChBRENfVHlwZURlZiAqQURDeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBTZXF1ZW5jZXJOYlJhbmtzKSB7DQotICBNT0RJRllfUkVHKEFEQ3gtPlNRUjEsIEFEQ19TUVIxX0wsIFNlcXVlbmNlck5iUmFua3MpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgbGVuZ3RoIGFuZCBzY2FuIGRpcmVjdGlvbi4NCi0gKiBAbm90ZSAgIERlc2NyaXB0aW9uIG9mIEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBmZWF0dXJlczoNCi0gKiAgICAgICAgIC0gRm9yIGRldmljZXMgd2l0aCBzZXF1ZW5jZXIgZnVsbHkgY29uZmlndXJhYmxlDQotICogICAgICAgICAgIChmdW5jdGlvbiAiTExfQURDX1JFR19TZXRTZXF1ZW5jZXJSYW5rcygpIiBhdmFpbGFibGUpOg0KLSAqICAgICAgICAgICBzZXF1ZW5jZXIgbGVuZ3RoIGFuZCBlYWNoIHJhbmsgYWZmZWN0YXRpb24gdG8gYSBjaGFubmVsDQotICogICAgICAgICAgIGFyZSBjb25maWd1cmFibGUuDQotICogICAgICAgICAgIFRoaXMgZnVuY3Rpb24gcmV0cmlldmVzOg0KLSAqICAgICAgICAgICAtIFNlcXVlbmNlIGxlbmd0aDogTnVtYmVyIG9mIHJhbmtzIGluIHRoZSBzY2FuIHNlcXVlbmNlLg0KLSAqICAgICAgICAgICAtIFNlcXVlbmNlIGRpcmVjdGlvbjogVW5sZXNzIHNwZWNpZmllZCBpbiBwYXJhbWV0ZXJzLCBzZXF1ZW5jZXINCi0gKiAgICAgICAgICAgICBzY2FuIGRpcmVjdGlvbiBpcyBmb3J3YXJkIChmcm9tIHJhbmsgMSB0byByYW5rIG4pLg0KLSAqICAgICAgICAgICBTZXF1ZW5jZXIgcmFua3MgYXJlIHNlbGVjdGVkIHVzaW5nDQotICogICAgICAgICAgIGZ1bmN0aW9uICJMTF9BRENfUkVHX1NldFNlcXVlbmNlclJhbmtzKCkiLg0KLSAqICAgICAgICAgLSBGb3IgZGV2aWNlcyB3aXRoIHNlcXVlbmNlciBub3QgZnVsbHkgY29uZmlndXJhYmxlDQotICogICAgICAgICAgIChmdW5jdGlvbiAiTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDaGFubmVscygpIiBhdmFpbGFibGUpOg0KLSAqICAgICAgICAgICBzZXF1ZW5jZXIgbGVuZ3RoIGFuZCBlYWNoIHJhbmsgYWZmZWN0YXRpb24gdG8gYSBjaGFubmVsDQotICogICAgICAgICAgIGFyZSBkZWZpbmVkIGJ5IGNoYW5uZWwgbnVtYmVyLg0KLSAqICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIHJldHJpZXZlczoNCi0gKiAgICAgICAgICAgLSBTZXF1ZW5jZSBsZW5ndGg6IE51bWJlciBvZiByYW5rcyBpbiB0aGUgc2NhbiBzZXF1ZW5jZSBpcw0KLSAqICAgICAgICAgICAgIGRlZmluZWQgYnkgbnVtYmVyIG9mIGNoYW5uZWxzIHNldCBpbiB0aGUgc2VxdWVuY2UsDQotICogICAgICAgICAgICAgcmFuayBvZiBlYWNoIGNoYW5uZWwgaXMgZml4ZWQgYnkgY2hhbm5lbCBIVyBudW1iZXIuDQotICogICAgICAgICAgICAgKGNoYW5uZWwgMCBmaXhlZCBvbiByYW5rIDAsIGNoYW5uZWwgMSBmaXhlZCBvbiByYW5rMSwgLi4uKS4NCi0gKiAgICAgICAgICAgLSBTZXF1ZW5jZSBkaXJlY3Rpb246IFVubGVzcyBzcGVjaWZpZWQgaW4gcGFyYW1ldGVycywgc2VxdWVuY2VyDQotICogICAgICAgICAgICAgc2NhbiBkaXJlY3Rpb24gaXMgZm9yd2FyZCAoZnJvbSBsb3dlc3QgY2hhbm5lbCBudW1iZXIgdG8NCi0gKiAgICAgICAgICAgICBoaWdoZXN0IGNoYW5uZWwgbnVtYmVyKS4NCi0gKiAgICAgICAgICAgU2VxdWVuY2VyIHJhbmtzIGFyZSBzZWxlY3RlZCB1c2luZw0KLSAqICAgICAgICAgICBmdW5jdGlvbiAiTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDaGFubmVscygpIi4NCi0gKiBAbm90ZSAgIFNlcXVlbmNlciBkaXNhYmxlZCBpcyBlcXVpdmFsZW50IHRvIHNlcXVlbmNlciBvZiAxIHJhbms6DQotICogICAgICAgICBBREMgY29udmVyc2lvbiBvbiBvbmx5IDEgY2hhbm5lbC4NCi0gKiBAcm10b2xsIFNRUjEgICAgIEwgICAgICAgICAgICAgIExMX0FEQ19SRUdfR2V0U2VxdWVuY2VyTGVuZ3RoDQotICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9TQ0FOX0RJU0FCTEUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV8yUkFOS1MNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV8zUkFOS1MNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV80UkFOS1MNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV81UkFOS1MNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV82UkFOS1MNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV83UkFOS1MNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV84UkFOS1MNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV85UkFOS1MNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV8xMFJBTktTDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMTFSQU5LUw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzEyUkFOS1MNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV8xM1JBTktTDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMTRSQU5LUw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzE1UkFOS1MNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV8xNlJBTktTDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19SRUdfR2V0U2VxdWVuY2VyTGVuZ3RoKEFEQ19UeXBlRGVmICpBREN4KSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChBREN4LT5TUVIxLCBBRENfU1FSMV9MKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBkaXNjb250aW51b3VzIG1vZGU6DQotICogICAgICAgICBzZXF1ZW5jZSBzdWJkaXZpZGVkIGFuZCBzY2FuIGNvbnZlcnNpb25zIGludGVycnVwdGVkIGV2ZXJ5IHNlbGVjdGVkDQotICogICAgICAgICBudW1iZXIgb2YgcmFua3MuDQotICogQG5vdGUgICBJdCBpcyBub3QgcG9zc2libGUgdG8gZW5hYmxlIGJvdGggQURDIGdyb3VwIHJlZ3VsYXINCi0gKiAgICAgICAgIGNvbnRpbnVvdXMgbW9kZSBhbmQgc2VxdWVuY2VyIGRpc2NvbnRpbnVvdXMgbW9kZS4NCi0gKiBAbm90ZSAgIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBlbmFibGUgYm90aCBBREMgYXV0by1pbmplY3RlZCBtb2RlDQotICogICAgICAgICBhbmQgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGRpc2NvbnRpbnVvdXMgbW9kZS4NCi0gKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bw0KLSAqICAgICAgICAgQURDIHN0YXRlOg0KLSAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcNCi0gKiAgICAgICAgIG9uIGdyb3VwIHJlZ3VsYXIuDQotICogQHJtdG9sbCBDRkdSICAgICBESVNDRU4gICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlckRpc2NvbnRcbg0KLSAqICAgICAgICAgQ0ZHUiAgICAgRElTQ05VTSAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJEaXNjb250DQotICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQ0KLSAqIEBwYXJhbSAgU2VxRGlzY29udCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfRElTQUJMRQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfMVJBTksNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzJSQU5LUw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfM1JBTktTDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfRElTQ09OVF80UkFOS1MNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzVSQU5LUw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfNlJBTktTDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfRElTQ09OVF83UkFOS1MNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzhSQU5LUw0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyRGlzY29udChBRENfVHlwZURlZiAqQURDeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgU2VxRGlzY29udCkgew0KLSAgTU9ESUZZX1JFRyhBREN4LT5DRkdSLCBBRENfQ0ZHUl9ESVNDRU4gfCBBRENfQ0ZHUl9ESVNDTlVNLCBTZXFEaXNjb250KTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGRpc2NvbnRpbnVvdXMgbW9kZToNCi0gKiAgICAgICAgIHNlcXVlbmNlIHN1YmRpdmlkZWQgYW5kIHNjYW4gY29udmVyc2lvbnMgaW50ZXJydXB0ZWQgZXZlcnkgc2VsZWN0ZWQNCi0gKiAgICAgICAgIG51bWJlciBvZiByYW5rcy4NCi0gKiBAcm10b2xsIENGR1IgICAgIERJU0NFTiAgICAgICAgIExMX0FEQ19SRUdfR2V0U2VxdWVuY2VyRGlzY29udFxuDQotICogICAgICAgICBDRkdSICAgICBESVNDTlVNICAgICAgICBMTF9BRENfUkVHX0dldFNlcXVlbmNlckRpc2NvbnQNCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfRElTQUJMRQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfMVJBTksNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzJSQU5LUw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfM1JBTktTDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfRElTQ09OVF80UkFOS1MNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzVSQU5LUw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfNlJBTktTDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfRElTQ09OVF83UkFOS1MNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzhSQU5LUw0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfUkVHX0dldFNlcXVlbmNlckRpc2NvbnQoQURDX1R5cGVEZWYgKkFEQ3gpIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEFEQ3gtPkNGR1IsIEFEQ19DRkdSX0RJU0NFTiB8IEFEQ19DRkdSX0RJU0NOVU0pKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZXQgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2U6IGNoYW5uZWwgb24gdGhlIHNlbGVjdGVkDQotICogICAgICAgICBzY2FuIHNlcXVlbmNlIHJhbmsuDQotICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGNvbmZpZ3VyYXRpb24gb2Y6DQotICogICAgICAgICAtIENoYW5uZWxzIG9yZGVyaW5nIGludG8gZWFjaCByYW5rIG9mIHNjYW4gc2VxdWVuY2U6DQotICogICAgICAgICAgIHdoYXRldmVyIGNoYW5uZWwgY2FuIGJlIHBsYWNlZCBpbnRvIHdoYXRldmVyIHJhbmsuDQotICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllcywgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGlzDQotICogICAgICAgICBmdWxseSBjb25maWd1cmFibGU6IHNlcXVlbmNlciBsZW5ndGggYW5kIGVhY2ggcmFuaw0KLSAqICAgICAgICAgYWZmZWN0YXRpb24gdG8gYSBjaGFubmVsIGFyZSBjb25maWd1cmFibGUuDQotICogICAgICAgICBSZWZlciB0byBkZXNjcmlwdGlvbiBvZiBmdW5jdGlvbiBAcmVmDQotICogTExfQURDX1JFR19TZXRTZXF1ZW5jZXJMZW5ndGgoKS4NCi0gKiBAbm90ZSAgIERlcGVuZGluZyBvbiBkZXZpY2VzIGFuZCBwYWNrYWdlcywgc29tZSBjaGFubmVscyBtYXkgbm90IGJlDQotICogYXZhaWxhYmxlLiBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBjaGFubmVscyBhdmFpbGFiaWxpdHkuDQotICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllcywgdG8gbWVhc3VyZSBpbnRlcm5hbCBjaGFubmVscyAoVnJlZkludCwNCi0gKiAgICAgICAgIFRlbXBTZW5zb3IsIC4uLiksIG1lYXN1cmVtZW50IHBhdGhzIHRvIGludGVybmFsIGNoYW5uZWxzIG11c3QgYmUNCi0gKiAgICAgICAgIGVuYWJsZWQgc2VwYXJhdGVseS4NCi0gKiAgICAgICAgIFRoaXMgY2FuIGJlIGRvbmUgdXNpbmcgZnVuY3Rpb24gQHJlZg0KLSAqIExMX0FEQ19TZXRDb21tb25QYXRoSW50ZXJuYWxDaCgpLg0KLSAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvDQotICogICAgICAgICBBREMgc3RhdGU6DQotICogICAgICAgICBBREMgbXVzdCBiZSBkaXNhYmxlZCBvciBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZw0KLSAqICAgICAgICAgb24gZ3JvdXAgcmVndWxhci4NCi0gKiBAcm10b2xsIFNRUjEgICAgIFNRMSAgICAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyUmFua3Ncbg0KLSAqICAgICAgICAgU1FSMSAgICAgU1EyICAgICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJSYW5rc1xuDQotICogICAgICAgICBTUVIxICAgICBTUTMgICAgICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlclJhbmtzXG4NCi0gKiAgICAgICAgIFNRUjEgICAgIFNRNCAgICAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyUmFua3Ncbg0KLSAqICAgICAgICAgU1FSMiAgICAgU1E1ICAgICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJSYW5rc1xuDQotICogICAgICAgICBTUVIyICAgICBTUTYgICAgICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlclJhbmtzXG4NCi0gKiAgICAgICAgIFNRUjIgICAgIFNRNyAgICAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyUmFua3Ncbg0KLSAqICAgICAgICAgU1FSMiAgICAgU1E4ICAgICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJSYW5rc1xuDQotICogICAgICAgICBTUVIyICAgICBTUTkgICAgICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlclJhbmtzXG4NCi0gKiAgICAgICAgIFNRUjMgICAgIFNRMTAgICAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyUmFua3Ncbg0KLSAqICAgICAgICAgU1FSMyAgICAgU1ExMSAgICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJSYW5rc1xuDQotICogICAgICAgICBTUVIzICAgICBTUTEyICAgICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlclJhbmtzXG4NCi0gKiAgICAgICAgIFNRUjMgICAgIFNRMTMgICAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyUmFua3Ncbg0KLSAqICAgICAgICAgU1FSMyAgICAgU1ExNCAgICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJSYW5rc1xuDQotICogICAgICAgICBTUVI0ICAgICBTUTE1ICAgICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlclJhbmtzXG4NCi0gKiAgICAgICAgIFNRUjQgICAgIFNRMTYgICAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyUmFua3MNCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHBhcmFtICBSYW5rIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfUkFOS18zDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfUkFOS182DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfUkFOS185DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzEwDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzExDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzEyDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzEzDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzE0DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzE1DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzE2DQotICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEgICAgICAgICAgICAgICAgICg4KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzIgICAgICAgICAgICAgICAgICg4KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzMgICAgICAgICAgICAgICAgICg4KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzQgICAgICAgICAgICAgICAgICg4KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzUgICAgICAgICAgICAgICAgICg4KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF83DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzExDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE0DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE3DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WUkVGSU5UICAgICAgICAgICAoNykNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SX0FEQzEgICAoMSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SX0FEQzUgICAoNSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WQkFUICAgICAgICAgICAgICAoNikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAxICAgICAgICAgICAoMSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAyICAgICAgICAgICAoMikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAzX0FEQzIgICAgICAoMikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAzX0FEQzMgICAgICAoMykNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVA0ICAgICAgICAgICAoNSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVA1ICAgICAgICAgICAoNSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVA2ICAgICAgICAgICAoNCkNCi0gKg0KLSAqICAgICAgICAgKDEpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzEuXG4NCi0gKiAgICAgICAgICgyKSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMyLlxuDQotICogICAgICAgICAoMykgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMy5cbg0KLSAqICAgICAgICAgKDQpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzQuXG4NCi0gKiAgICAgICAgICg1KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREM1LlxuDQotICogICAgICAgICAoNikgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZXM6IEFEQzEsDQotICogQURDMywgQURDNS5cbiAoNykgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZXM6DQotICogQURDMSwgQURDMywgQURDNCwgQURDNS5cbg0KLSAqICAgICAgICAgIC0gIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBhbGwgQURDeCBhcmUgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlcy4NCi0gKiBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBtb3JlIGRldGFpbHMuICg4KSBPbiBTVE0zMkc0LCBmYXN0IGNoYW5uZWwNCi0gKiBhbGxvd3M6IDIuNSAoc2FtcGxpbmcpICsgMTIuNSAoY29udmVyc2lvbikgPSAxNSBBREMgY2xvY2sgY3ljbGVzIChmQURDKSB0bw0KLSAqIGNvbnZlcnQgaW4gMTItYml0IHJlc29sdXRpb24uIE90aGVyIGNoYW5uZWxzIGFyZSBzbG93IGNoYW5uZWxzICBhbGxvd3M6IDYuNQ0KLSAqIChzYW1wbGluZykgKyAxMi41IChjb252ZXJzaW9uKSA9IDE5IEFEQyBjbG9jayBjeWNsZXMgKGZBREMpIHRvIGNvbnZlcnQgaW4NCi0gKiAxMi1iaXQgcmVzb2x1dGlvbi5cbg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyUmFua3MoQURDX1R5cGVEZWYgKkFEQ3gsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBSYW5rLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCkgew0KLSAgLyogU2V0IGJpdHMgd2l0aCBjb250ZW50IG9mIHBhcmFtZXRlciAiQ2hhbm5lbCIgd2l0aCBiaXRzIHBvc2l0aW9uICAgICAgICAgICovDQotICAvKiBpbiByZWdpc3RlciBhbmQgcmVnaXN0ZXIgcG9zaXRpb24gZGVwZW5kaW5nIG9uIHBhcmFtZXRlciAiUmFuayIuICAgICAgICAgKi8NCi0gIC8qIFBhcmFtZXRlcnMgIlJhbmsiIGFuZCAiQ2hhbm5lbCIgYXJlIHVzZWQgd2l0aCBtYXNrcyBiZWNhdXNlIGNvbnRhaW5pbmcgICAqLw0KLSAgLyogb3RoZXIgYml0cyByZXNlcnZlZCBmb3Igb3RoZXIgcHVycG9zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICBfX0lPIHVpbnQzMl90ICpwcmVnID0gX19BRENfUFRSX1JFR19PRkZTRVQoDQotICAgICAgQURDeC0+U1FSMSwNCi0gICAgICAoKFJhbmsgJiBBRENfUkVHX1NRUlhfUkVHT0ZGU0VUX01BU0spID4+IEFEQ19TUVJYX1JFR09GRlNFVF9QT1MpKTsNCi0NCi0gIE1PRElGWV9SRUcoDQotICAgICAgKnByZWcsDQotICAgICAgQURDX0NIQU5ORUxfSURfTlVNQkVSX01BU0tfUE9TQklUMCA8PCAoUmFuayAmIEFEQ19SRUdfUkFOS19JRF9TUVJYX01BU0spLA0KLSAgICAgICgoQ2hhbm5lbCAmIEFEQ19DSEFOTkVMX0lEX05VTUJFUl9NQVNLKSA+Pg0KLSAgICAgICBBRENfQ0hBTk5FTF9JRF9OVU1CRVJfQklUT0ZGU0VUX1BPUykNCi0gICAgICAgICAgPDwgKFJhbmsgJiBBRENfUkVHX1JBTktfSURfU1FSWF9NQVNLKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlOiBjaGFubmVsIG9uIHRoZSBzZWxlY3RlZA0KLSAqICAgICAgICAgc2NhbiBzZXF1ZW5jZSByYW5rLg0KLSAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBpcw0KLSAqICAgICAgICAgZnVsbHkgY29uZmlndXJhYmxlOiBzZXF1ZW5jZXIgbGVuZ3RoIGFuZCBlYWNoIHJhbmsNCi0gKiAgICAgICAgIGFmZmVjdGF0aW9uIHRvIGEgY2hhbm5lbCBhcmUgY29uZmlndXJhYmxlLg0KLSAqICAgICAgICAgUmVmZXIgdG8gZGVzY3JpcHRpb24gb2YgZnVuY3Rpb24gQHJlZg0KLSAqIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyTGVuZ3RoKCkuDQotICogQG5vdGUgICBEZXBlbmRpbmcgb24gZGV2aWNlcyBhbmQgcGFja2FnZXMsIHNvbWUgY2hhbm5lbHMgbWF5IG5vdCBiZQ0KLSAqIGF2YWlsYWJsZS4gUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgY2hhbm5lbHMgYXZhaWxhYmlsaXR5Lg0KLSAqIEBub3RlICAgVXNhZ2Ugb2YgdGhlIHJldHVybmVkIGNoYW5uZWwgbnVtYmVyOg0KLSAqICAgICAgICAgLSBUbyByZWluamVjdCB0aGlzIGNoYW5uZWwgaW50byBhbm90aGVyIGZ1bmN0aW9uIExMX0FEQ194eHg6DQotICogICAgICAgICAgIHRoZSByZXR1cm5lZCBjaGFubmVsIG51bWJlciBpcyBvbmx5IHBhcnRseSBmb3JtYXR0ZWQgb24gZGVmaW5pdGlvbg0KLSAqICAgICAgICAgICBvZiBsaXRlcmFscyBMTF9BRENfQ0hBTk5FTF94LiBUaGVyZWZvcmUsIGl0IGhhcyB0byBiZSBjb21wYXJlZA0KLSAqICAgICAgICAgICB3aXRoIHBhcnRzIG9mIGxpdGVyYWxzIExMX0FEQ19DSEFOTkVMX3ggb3IgdXNpbmcNCi0gKiAgICAgICAgICAgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ0hBTk5FTF9UT19ERUNJTUFMX05CKCkuDQotICogICAgICAgICAgIFRoZW4gdGhlIHNlbGVjdGVkIGxpdGVyYWwgTExfQURDX0NIQU5ORUxfeCBjYW4gYmUgdXNlZA0KLSAqICAgICAgICAgICBhcyBwYXJhbWV0ZXIgZm9yIGFub3RoZXIgZnVuY3Rpb24uDQotICogICAgICAgICAtIFRvIGdldCB0aGUgY2hhbm5lbCBudW1iZXIgaW4gZGVjaW1hbCBmb3JtYXQ6DQotICogICAgICAgICAgIHByb2Nlc3MgdGhlIHJldHVybmVkIHZhbHVlIHdpdGggdGhlIGhlbHBlciBtYWNybw0KLSAqICAgICAgICAgICBAcmVmIF9fTExfQURDX0NIQU5ORUxfVE9fREVDSU1BTF9OQigpLg0KLSAqIEBybXRvbGwgU1FSMSAgICAgU1ExICAgICAgICAgICAgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJSYW5rc1xuDQotICogICAgICAgICBTUVIxICAgICBTUTIgICAgICAgICAgICBMTF9BRENfUkVHX0dldFNlcXVlbmNlclJhbmtzXG4NCi0gKiAgICAgICAgIFNRUjEgICAgIFNRMyAgICAgICAgICAgIExMX0FEQ19SRUdfR2V0U2VxdWVuY2VyUmFua3Ncbg0KLSAqICAgICAgICAgU1FSMSAgICAgU1E0ICAgICAgICAgICAgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJSYW5rc1xuDQotICogICAgICAgICBTUVIyICAgICBTUTUgICAgICAgICAgICBMTF9BRENfUkVHX0dldFNlcXVlbmNlclJhbmtzXG4NCi0gKiAgICAgICAgIFNRUjIgICAgIFNRNiAgICAgICAgICAgIExMX0FEQ19SRUdfR2V0U2VxdWVuY2VyUmFua3Ncbg0KLSAqICAgICAgICAgU1FSMiAgICAgU1E3ICAgICAgICAgICAgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJSYW5rc1xuDQotICogICAgICAgICBTUVIyICAgICBTUTggICAgICAgICAgICBMTF9BRENfUkVHX0dldFNlcXVlbmNlclJhbmtzXG4NCi0gKiAgICAgICAgIFNRUjIgICAgIFNROSAgICAgICAgICAgIExMX0FEQ19SRUdfR2V0U2VxdWVuY2VyUmFua3Ncbg0KLSAqICAgICAgICAgU1FSMyAgICAgU1ExMCAgICAgICAgICAgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJSYW5rc1xuDQotICogICAgICAgICBTUVIzICAgICBTUTExICAgICAgICAgICBMTF9BRENfUkVHX0dldFNlcXVlbmNlclJhbmtzXG4NCi0gKiAgICAgICAgIFNRUjMgICAgIFNRMTIgICAgICAgICAgIExMX0FEQ19SRUdfR2V0U2VxdWVuY2VyUmFua3Ncbg0KLSAqICAgICAgICAgU1FSMyAgICAgU1ExMyAgICAgICAgICAgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJSYW5rc1xuDQotICogICAgICAgICBTUVIzICAgICBTUTE0ICAgICAgICAgICBMTF9BRENfUkVHX0dldFNlcXVlbmNlclJhbmtzXG4NCi0gKiAgICAgICAgIFNRUjQgICAgIFNRMTUgICAgICAgICAgIExMX0FEQ19SRUdfR2V0U2VxdWVuY2VyUmFua3Ncbg0KLSAqICAgICAgICAgU1FSNCAgICAgU1ExNiAgICAgICAgICAgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJSYW5rcw0KLSAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UNCi0gKiBAcGFyYW0gIFJhbmsgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfUkFOS18yDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfUkFOS181DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfNw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfUkFOS184DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfMTANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfMTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfMTINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfMTMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfMTQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfMTUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfMTYNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEgICAgICAgICAgICAgICAgICg4KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzIgICAgICAgICAgICAgICAgICg4KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzMgICAgICAgICAgICAgICAgICg4KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzQgICAgICAgICAgICAgICAgICg4KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzUgICAgICAgICAgICAgICAgICg4KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF83DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzExDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE0DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE3DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WUkVGSU5UICAgICAgICAgICAoNykNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SX0FEQzEgICAoMSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SX0FEQzUgICAoNSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WQkFUICAgICAgICAgICAgICAoNikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAxICAgICAgICAgICAoMSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAyICAgICAgICAgICAoMikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAzX0FEQzIgICAgICAoMikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAzX0FEQzMgICAgICAoMykNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVA0ICAgICAgICAgICAoNSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVA1ICAgICAgICAgICAoNSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVA2ICAgICAgICAgICAoNCkNCi0gKg0KLSAqICAgICAgICAgKDEpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzEuXG4NCi0gKiAgICAgICAgICgyKSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMyLlxuDQotICogICAgICAgICAoMykgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMy5cbg0KLSAqICAgICAgICAgKDQpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzQuXG4NCi0gKiAgICAgICAgICg1KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREM1LlxuDQotICogICAgICAgICAoNikgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZXM6IEFEQzEsDQotICogQURDMywgQURDNS5cbiAoNykgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZXM6DQotICogQURDMSwgQURDMywgQURDNCwgQURDNS5cbg0KLSAqICAgICAgICAgIC0gIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBhbGwgQURDeCBhcmUgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlcy4NCi0gKiBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBtb3JlIGRldGFpbHMuICg4KSBPbiBTVE0zMkc0LCBmYXN0IGNoYW5uZWwNCi0gKiBhbGxvd3M6IDIuNSAoc2FtcGxpbmcpICsgMTIuNSAoY29udmVyc2lvbikgPSAxNSBBREMgY2xvY2sgY3ljbGVzIChmQURDKSB0bw0KLSAqIGNvbnZlcnQgaW4gMTItYml0IHJlc29sdXRpb24uIE90aGVyIGNoYW5uZWxzIGFyZSBzbG93IGNoYW5uZWxzICBhbGxvd3M6IDYuNQ0KLSAqIChzYW1wbGluZykgKyAxMi41IChjb252ZXJzaW9uKSA9IDE5IEFEQyBjbG9jayBjeWNsZXMgKGZBREMpIHRvIGNvbnZlcnQgaW4NCi0gKiAxMi1iaXQgcmVzb2x1dGlvbi5cbiAoMSwgMiwgMywgNCwgNSwgNykgRm9yIEFEQyBjaGFubmVsIHJlYWQgYmFjayBmcm9tIEFEQw0KLSAqIHJlZ2lzdGVyLCBjb21wYXJpc29uIHdpdGggaW50ZXJuYWwgY2hhbm5lbCBwYXJhbWV0ZXIgdG8gYmUgZG9uZSB1c2luZyBoZWxwZXINCi0gKiBtYWNybyBAcmVmIF9fTExfQURDX0NIQU5ORUxfSU5URVJOQUxfVE9fRVhURVJOQUwoKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJSYW5rcyhBRENfVHlwZURlZiAqQURDeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBSYW5rKSB7DQotICBjb25zdCBfX0lPIHVpbnQzMl90ICpwcmVnID0gX19BRENfUFRSX1JFR19PRkZTRVQoDQotICAgICAgQURDeC0+U1FSMSwNCi0gICAgICAoKFJhbmsgJiBBRENfUkVHX1NRUlhfUkVHT0ZGU0VUX01BU0spID4+IEFEQ19TUVJYX1JFR09GRlNFVF9QT1MpKTsNCi0NCi0gIHJldHVybiAoDQotICAgICAgdWludDMyX3QpKChSRUFEX0JJVCgqcHJlZywgQURDX0NIQU5ORUxfSURfTlVNQkVSX01BU0tfUE9TQklUMA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoUmFuayAmIEFEQ19SRUdfUkFOS19JRF9TUVJYX01BU0spKSA+Pg0KLSAgICAgICAgICAgICAgICAgKFJhbmsgJiBBRENfUkVHX1JBTktfSURfU1FSWF9NQVNLKSkNCi0gICAgICAgICAgICAgICAgPDwgQURDX0NIQU5ORUxfSURfTlVNQkVSX0JJVE9GRlNFVF9QT1MpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCBBREMgY29udGludW91cyBjb252ZXJzaW9uIG1vZGUgb24gQURDIGdyb3VwIHJlZ3VsYXIuDQotICogQG5vdGUgICBEZXNjcmlwdGlvbiBvZiBBREMgY29udGludW91cyBjb252ZXJzaW9uIG1vZGU6DQotICogICAgICAgICAtIHNpbmdsZSBtb2RlOiBvbmUgY29udmVyc2lvbiBwZXIgdHJpZ2dlcg0KLSAqICAgICAgICAgLSBjb250aW51b3VzIG1vZGU6IGFmdGVyIHRoZSBmaXJzdCB0cmlnZ2VyLCBmb2xsb3dpbmcNCi0gKiAgICAgICAgICAgY29udmVyc2lvbnMgbGF1bmNoZWQgc3VjY2Vzc2l2ZWx5IGF1dG9tYXRpY2FsbHkuDQotICogQG5vdGUgICBJdCBpcyBub3QgcG9zc2libGUgdG8gZW5hYmxlIGJvdGggQURDIGdyb3VwIHJlZ3VsYXINCi0gKiAgICAgICAgIGNvbnRpbnVvdXMgbW9kZSBhbmQgc2VxdWVuY2VyIGRpc2NvbnRpbnVvdXMgbW9kZS4NCi0gKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bw0KLSAqICAgICAgICAgQURDIHN0YXRlOg0KLSAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcNCi0gKiAgICAgICAgIG9uIGdyb3VwIHJlZ3VsYXIuDQotICogQHJtdG9sbCBDRkdSICAgICBDT05UICAgICAgICAgICBMTF9BRENfUkVHX1NldENvbnRpbnVvdXNNb2RlDQotICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQ0KLSAqIEBwYXJhbSAgQ29udGludW91cyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfQ09OVl9TSU5HTEUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX0NPTlZfQ09OVElOVU9VUw0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19SRUdfU2V0Q29udGludW91c01vZGUoQURDX1R5cGVEZWYgKkFEQ3gsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDb250aW51b3VzKSB7DQotICBNT0RJRllfUkVHKEFEQ3gtPkNGR1IsIEFEQ19DRkdSX0NPTlQsIENvbnRpbnVvdXMpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBBREMgY29udGludW91cyBjb252ZXJzaW9uIG1vZGUgb24gQURDIGdyb3VwIHJlZ3VsYXIuDQotICogQG5vdGUgICBEZXNjcmlwdGlvbiBvZiBBREMgY29udGludW91cyBjb252ZXJzaW9uIG1vZGU6DQotICogICAgICAgICAtIHNpbmdsZSBtb2RlOiBvbmUgY29udmVyc2lvbiBwZXIgdHJpZ2dlcg0KLSAqICAgICAgICAgLSBjb250aW51b3VzIG1vZGU6IGFmdGVyIHRoZSBmaXJzdCB0cmlnZ2VyLCBmb2xsb3dpbmcNCi0gKiAgICAgICAgICAgY29udmVyc2lvbnMgbGF1bmNoZWQgc3VjY2Vzc2l2ZWx5IGF1dG9tYXRpY2FsbHkuDQotICogQHJtdG9sbCBDRkdSICAgICBDT05UICAgICAgICAgICBMTF9BRENfUkVHX0dldENvbnRpbnVvdXNNb2RlDQotICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX0NPTlZfU0lOR0xFDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19DT05WX0NPTlRJTlVPVVMNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX1JFR19HZXRDb250aW51b3VzTW9kZShBRENfVHlwZURlZiAqQURDeCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeC0+Q0ZHUiwgQURDX0NGR1JfQ09OVCkpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIGRhdGEgdHJhbnNmZXI6IG5vIHRyYW5zZmVyIG9yDQotICogICAgICAgICB0cmFuc2ZlciBieSBETUEsIGFuZCBETUEgcmVxdWVzdHMgbW9kZS4NCi0gKiBAbm90ZSAgIElmIHRyYW5zZmVyIGJ5IERNQSBzZWxlY3RlZCwgc3BlY2lmaWVzIHRoZSBETUEgcmVxdWVzdHMNCi0gKiAgICAgICAgIG1vZGU6DQotICogICAgICAgICAtIExpbWl0ZWQgbW9kZSAoT25lIHNob3QgbW9kZSk6IERNQSB0cmFuc2ZlciByZXF1ZXN0cyBhcmUgc3RvcHBlZA0KLSAqICAgICAgICAgICB3aGVuIG51bWJlciBvZiBETUEgZGF0YSB0cmFuc2ZlcnMgKG51bWJlciBvZg0KLSAqICAgICAgICAgICBBREMgY29udmVyc2lvbnMpIGlzIHJlYWNoZWQuDQotICogICAgICAgICAgIFRoaXMgQURDIG1vZGUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoIERNQSBtb2RlIG5vbi1jaXJjdWxhci4NCi0gKiAgICAgICAgIC0gVW5saW1pdGVkIG1vZGU6IERNQSB0cmFuc2ZlciByZXF1ZXN0cyBhcmUgdW5saW1pdGVkLA0KLSAqICAgICAgICAgICB3aGF0ZXZlciBudW1iZXIgb2YgRE1BIGRhdGEgdHJhbnNmZXJzIChudW1iZXIgb2YNCi0gKiAgICAgICAgICAgQURDIGNvbnZlcnNpb25zKS4NCi0gKiAgICAgICAgICAgVGhpcyBBREMgbW9kZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHdpdGggRE1BIG1vZGUgY2lyY3VsYXIuDQotICogQG5vdGUgICBJZiBBREMgRE1BIHJlcXVlc3RzIG1vZGUgaXMgc2V0IHRvIHVubGltaXRlZCBhbmQgRE1BIGlzIHNldCB0bw0KLSAqICAgICAgICAgbW9kZSBub24tY2lyY3VsYXI6DQotICogICAgICAgICB3aGVuIERNQSB0cmFuc2ZlcnMgc2l6ZSB3aWxsIGJlIHJlYWNoZWQsIERNQSB3aWxsIHN0b3AgdHJhbnNmZXJzIG9mDQotICogICAgICAgICBBREMgY29udmVyc2lvbnMgZGF0YSBBREMgd2lsbCByYWlzZSBhbiBvdmVycnVuIGVycm9yDQotICogICAgICAgIChvdmVycnVuIGZsYWcgYW5kIGludGVycnVwdGlvbiBpZiBlbmFibGVkKS4NCi0gKiBAbm90ZSAgIEZvciBkZXZpY2VzIHdpdGggc2V2ZXJhbCBBREMgaW5zdGFuY2VzOiBBREMgbXVsdGltb2RlIERNQQ0KLSAqICAgICAgICAgc2V0dGluZ3MgYXJlIGF2YWlsYWJsZSB1c2luZyBmdW5jdGlvbiBAcmVmDQotICogTExfQURDX1NldE11bHRpRE1BVHJhbnNmZXIoKS4NCi0gKiBAbm90ZSAgIFRvIGNvbmZpZ3VyZSBETUEgc291cmNlIGFkZHJlc3MgKHBlcmlwaGVyYWwgYWRkcmVzcyksDQotICogICAgICAgICB1c2UgZnVuY3Rpb24gQHJlZiBMTF9BRENfRE1BX0dldFJlZ0FkZHIoKS4NCi0gKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bw0KLSAqICAgICAgICAgQURDIHN0YXRlOg0KLSAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcNCi0gKiAgICAgICAgIG9uIGVpdGhlciBncm91cHMgcmVndWxhciBvciBpbmplY3RlZC4NCi0gKiBAcm10b2xsIENGR1IgICAgIERNQUVOICAgICAgICAgIExMX0FEQ19SRUdfU2V0RE1BVHJhbnNmZXJcbg0KLSAqICAgICAgICAgQ0ZHUiAgICAgRE1BQ0ZHICAgICAgICAgTExfQURDX1JFR19TZXRETUFUcmFuc2Zlcg0KLSAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UNCi0gKiBAcGFyYW0gIERNQVRyYW5zZmVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19ETUFfVFJBTlNGRVJfTk9ORQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfRE1BX1RSQU5TRkVSX0xJTUlURUQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX0RNQV9UUkFOU0ZFUl9VTkxJTUlURUQNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfUkVHX1NldERNQVRyYW5zZmVyKEFEQ19UeXBlRGVmICpBREN4LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRE1BVHJhbnNmZXIpIHsNCi0gIE1PRElGWV9SRUcoQURDeC0+Q0ZHUiwgQURDX0NGR1JfRE1BRU4gfCBBRENfQ0ZHUl9ETUFDRkcsIERNQVRyYW5zZmVyKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBkYXRhIHRyYW5zZmVyOiBubyB0cmFuc2ZlciBvcg0KLSAqICAgICAgICAgdHJhbnNmZXIgYnkgRE1BLCBhbmQgRE1BIHJlcXVlc3RzIG1vZGUuDQotICogQG5vdGUgICBJZiB0cmFuc2ZlciBieSBETUEgc2VsZWN0ZWQsIHNwZWNpZmllcyB0aGUgRE1BIHJlcXVlc3RzDQotICogICAgICAgICBtb2RlOg0KLSAqICAgICAgICAgLSBMaW1pdGVkIG1vZGUgKE9uZSBzaG90IG1vZGUpOiBETUEgdHJhbnNmZXIgcmVxdWVzdHMgYXJlIHN0b3BwZWQNCi0gKiAgICAgICAgICAgd2hlbiBudW1iZXIgb2YgRE1BIGRhdGEgdHJhbnNmZXJzIChudW1iZXIgb2YNCi0gKiAgICAgICAgICAgQURDIGNvbnZlcnNpb25zKSBpcyByZWFjaGVkLg0KLSAqICAgICAgICAgICBUaGlzIEFEQyBtb2RlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgd2l0aCBETUEgbW9kZSBub24tY2lyY3VsYXIuDQotICogICAgICAgICAtIFVubGltaXRlZCBtb2RlOiBETUEgdHJhbnNmZXIgcmVxdWVzdHMgYXJlIHVubGltaXRlZCwNCi0gKiAgICAgICAgICAgd2hhdGV2ZXIgbnVtYmVyIG9mIERNQSBkYXRhIHRyYW5zZmVycyAobnVtYmVyIG9mDQotICogICAgICAgICAgIEFEQyBjb252ZXJzaW9ucykuDQotICogICAgICAgICAgIFRoaXMgQURDIG1vZGUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoIERNQSBtb2RlIGNpcmN1bGFyLg0KLSAqIEBub3RlICAgSWYgQURDIERNQSByZXF1ZXN0cyBtb2RlIGlzIHNldCB0byB1bmxpbWl0ZWQgYW5kIERNQSBpcyBzZXQgdG8NCi0gKiAgICAgICAgIG1vZGUgbm9uLWNpcmN1bGFyOg0KLSAqICAgICAgICAgd2hlbiBETUEgdHJhbnNmZXJzIHNpemUgd2lsbCBiZSByZWFjaGVkLCBETUEgd2lsbCBzdG9wIHRyYW5zZmVycyBvZg0KLSAqICAgICAgICAgQURDIGNvbnZlcnNpb25zIGRhdGEgQURDIHdpbGwgcmFpc2UgYW4gb3ZlcnJ1biBlcnJvcg0KLSAqICAgICAgICAgKG92ZXJydW4gZmxhZyBhbmQgaW50ZXJydXB0aW9uIGlmIGVuYWJsZWQpLg0KLSAqIEBub3RlICAgRm9yIGRldmljZXMgd2l0aCBzZXZlcmFsIEFEQyBpbnN0YW5jZXM6IEFEQyBtdWx0aW1vZGUgRE1BDQotICogICAgICAgICBzZXR0aW5ncyBhcmUgYXZhaWxhYmxlIHVzaW5nIGZ1bmN0aW9uIEByZWYNCi0gKiBMTF9BRENfR2V0TXVsdGlETUFUcmFuc2ZlcigpLg0KLSAqIEBub3RlICAgVG8gY29uZmlndXJlIERNQSBzb3VyY2UgYWRkcmVzcyAocGVyaXBoZXJhbCBhZGRyZXNzKSwNCi0gKiAgICAgICAgIHVzZSBmdW5jdGlvbiBAcmVmIExMX0FEQ19ETUFfR2V0UmVnQWRkcigpLg0KLSAqIEBybXRvbGwgQ0ZHUiAgICAgRE1BRU4gICAgICAgICAgTExfQURDX1JFR19HZXRETUFUcmFuc2ZlclxuDQotICogICAgICAgICBDRkdSICAgICBETUFDRkcgICAgICAgICBMTF9BRENfUkVHX0dldERNQVRyYW5zZmVyDQotICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX0RNQV9UUkFOU0ZFUl9OT05FDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19ETUFfVFJBTlNGRVJfTElNSVRFRA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfRE1BX1RSQU5TRkVSX1VOTElNSVRFRA0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfUkVHX0dldERNQVRyYW5zZmVyKEFEQ19UeXBlRGVmICpBREN4KSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChBREN4LT5DRkdSLCBBRENfQ0ZHUl9ETUFFTiB8IEFEQ19DRkdSX0RNQUNGRykpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCBBREMgZ3JvdXAgcmVndWxhciBiZWhhdmlvciBpbiBjYXNlIG9mIG92ZXJydW46DQotICogICAgICAgICBkYXRhIHByZXNlcnZlZCBvciBvdmVyd3JpdHRlbi4NCi0gKiBAbm90ZSAgIENvbXBhdGliaWxpdHkgd2l0aCBkZXZpY2VzIHdpdGhvdXQgZmVhdHVyZSBvdmVycnVuOg0KLSAqICAgICAgICAgb3RoZXIgZGV2aWNlcyB3aXRob3V0IHRoaXMgZmVhdHVyZSBoYXZlIGEgYmVoYXZpb3INCi0gKiAgICAgICAgIGVxdWl2YWxlbnQgdG8gZGF0YSBvdmVyd3JpdHRlbi4NCi0gKiAgICAgICAgIFRoZSBkZWZhdWx0IHNldHRpbmcgb2Ygb3ZlcnJ1biBpcyBkYXRhIHByZXNlcnZlZC4NCi0gKiAgICAgICAgIFRoZXJlZm9yZSwgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBhbGwgZGV2aWNlcywgcGFyYW1ldGVyDQotICogICAgICAgICBvdmVycnVuIHNob3VsZCBiZSBzZXQgdG8gZGF0YSBvdmVyd3JpdHRlbi4NCi0gKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bw0KLSAqICAgICAgICAgQURDIHN0YXRlOg0KLSAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcNCi0gKiAgICAgICAgIG9uIGdyb3VwIHJlZ3VsYXIuDQotICogQHJtdG9sbCBDRkdSICAgICBPVlJNT0QgICAgICAgICBMTF9BRENfUkVHX1NldE92ZXJydW4NCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHBhcmFtICBPdmVycnVuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19PVlJfREFUQV9QUkVTRVJWRUQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX09WUl9EQVRBX09WRVJXUklUVEVODQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1JFR19TZXRPdmVycnVuKEFEQ19UeXBlRGVmICpBREN4LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBPdmVycnVuKSB7DQotICBNT0RJRllfUkVHKEFEQ3gtPkNGR1IsIEFEQ19DRkdSX09WUk1PRCwgT3ZlcnJ1bik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IEFEQyBncm91cCByZWd1bGFyIGJlaGF2aW9yIGluIGNhc2Ugb2Ygb3ZlcnJ1bjoNCi0gKiAgICAgICAgIGRhdGEgcHJlc2VydmVkIG9yIG92ZXJ3cml0dGVuLg0KLSAqIEBybXRvbGwgQ0ZHUiAgICAgT1ZSTU9EICAgICAgICAgTExfQURDX1JFR19HZXRPdmVycnVuDQotICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX09WUl9EQVRBX1BSRVNFUlZFRA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfT1ZSX0RBVEFfT1ZFUldSSVRURU4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX1JFR19HZXRPdmVycnVuKEFEQ19UeXBlRGVmICpBREN4KSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChBREN4LT5DRkdSLCBBRENfQ0ZHUl9PVlJNT0QpKTsNCi19DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEFEQ19MTF9FRl9Db25maWd1cmF0aW9uX0FEQ19Hcm91cF9JbmplY3RlZCBDb25maWd1cmF0aW9uIG9mIEFEQw0KLSAqIGhpZXJhcmNoaWNhbCBzY29wZTogZ3JvdXAgaW5qZWN0ZWQNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgc291cmNlOg0KLSAqICAgICAgICAgaW50ZXJuYWwgKFNXIHN0YXJ0KSBvciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWwgKHRpbWVyIGV2ZW50LA0KLSAqICAgICAgICAgZXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUpLg0KLSAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIHNldHRpbmcgdHJpZ2dlciBzb3VyY2UgdG8gZXh0ZXJuYWwgdHJpZ2dlcg0KLSAqICAgICAgICAgYWxzbyBzZXQgdHJpZ2dlciBwb2xhcml0eSB0byByaXNpbmcgZWRnZQ0KLSAqICAgICAgICAgKGRlZmF1bHQgc2V0dGluZyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHNvbWUgQURDIG9uIG90aGVyDQotICogICAgICAgICBTVE0zMiBmYW1pbGllcyBoYXZpbmcgdGhpcyBzZXR0aW5nIHNldCBieSBIVyBkZWZhdWx0IHZhbHVlKS4NCi0gKiAgICAgICAgIEluIGNhc2Ugb2YgbmVlZCB0byBtb2RpZnkgdHJpZ2dlciBlZGdlLCB1c2UNCi0gKiAgICAgICAgIGZ1bmN0aW9uIEByZWYgTExfQURDX0lOSl9TZXRUcmlnZ2VyRWRnZSgpLg0KLSAqIEBub3RlICAgQXZhaWxhYmlsaXR5IG9mIHBhcmFtZXRlcnMgb2YgdHJpZ2dlciBzb3VyY2VzIGZyb20gdGltZXINCi0gKiAgICAgICAgIGRlcGVuZHMgb24gdGltZXJzIGF2YWlsYWJpbGl0eSBvbiB0aGUgc2VsZWN0ZWQgZGV2aWNlLg0KLSAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvDQotICogICAgICAgICBBREMgc3RhdGU6DQotICogICAgICAgICBBREMgbXVzdCBub3QgYmUgZGlzYWJsZWQuIENhbiBiZSBlbmFibGVkIHdpdGggb3Igd2l0aG91dCBjb252ZXJzaW9uDQotICogICAgICAgICBvbiBnb2luZyBvbiBlaXRoZXIgZ3JvdXBzIHJlZ3VsYXIgb3IgaW5qZWN0ZWQuDQotICogQHJtdG9sbCBKU1FSICAgICBKRVhUU0VMICAgICAgICBMTF9BRENfSU5KX1NldFRyaWdnZXJTb3VyY2Vcbg0KLSAqICAgICAgICAgSlNRUiAgICAgSkVYVEVOICAgICAgICAgTExfQURDX0lOSl9TZXRUcmlnZ2VyU291cmNlDQotICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQ0KLSAqIEBwYXJhbSAgVHJpZ2dlclNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19TT0ZUV0FSRQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMV9UUkdPDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0xX1RSR08yDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0xX0NIMyAgICAgICAgICgyKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMV9DSDQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTJfVFJHTw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMl9DSDEgICAgICAgICAoMSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTNfVFJHTw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNM19DSDEgICAgICAgICAoMSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTNfQ0gzICAgICAgICAgKDEpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0zX0NINCAgICAgICAgICgxKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNNF9UUkdPDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU00X0NIMyAgICAgICAgICgyKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNNF9DSDQgICAgICAgICAoMikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTZfVFJHTw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNN19UUkdPDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU04X1RSR08NCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTThfVFJHTzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTThfQ0gyICAgICAgICAgKDIpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU04X0NINA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMTVfVFJHTw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMTZfQ0gxICAgICAgICAoMSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTIwX1RSR08NCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTIwX1RSR08yDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0yMF9DSDIgICAgICAgICgyKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMjBfQ0g0ICAgICAgICAoMSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX0hSVElNX1RSRzEgICAgICAgKDIpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9IUlRJTV9UUkcyDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9IUlRJTV9UUkczICAgICAgICgyKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfSFJUSU1fVFJHNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfSFJUSU1fVFJHNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfSFJUSU1fVFJHNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfSFJUSU1fVFJHNw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfSFJUSU1fVFJHOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfSFJUSU1fVFJHOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfSFJUSU1fVFJHMTANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX0VYVElfTElORTMgICAgICAgKDIpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9FWFRJX0xJTkUxNSAgICAgICgxKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfTFBUSU1fT1VUDQotICoNCi0gKiAgICAgICAgICgxKSBPbiBTVE0zMkc0IHNlcmllcywgcGFyYW1ldGVyIG5vdCBhdmFpbGFibGUgb24gYWxsIEFEQyBpbnN0YW5jZXM6DQotICogQURDMSwgQURDMi5cbiAoMikgT24gU1RNMzJHNCBzZXJpZXMsIHBhcmFtZXRlciBub3QgYXZhaWxhYmxlIG9uIGFsbCBBREMNCi0gKiBpbnN0YW5jZXM6IEFEQzMsIEFEQzQsIEFEQzUuIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBhbGwgQURDeCBhcmUgbm90IGF2YWlsYWJsZQ0KLSAqIG9uIGFsbCBkZXZpY2VzLiBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBtb3JlIGRldGFpbHMuDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0lOSl9TZXRUcmlnZ2VyU291cmNlKEFEQ19UeXBlRGVmICpBREN4LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUcmlnZ2VyU291cmNlKSB7DQotICBNT0RJRllfUkVHKEFEQ3gtPkpTUVIsIEFEQ19KU1FSX0pFWFRTRUwgfCBBRENfSlNRUl9KRVhURU4sIFRyaWdnZXJTb3VyY2UpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIHNvdXJjZToNCi0gKiAgICAgICAgIGludGVybmFsIChTVyBzdGFydCkgb3IgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsICh0aW1lciBldmVudCwNCi0gKiAgICAgICAgIGV4dGVybmFsIGludGVycnVwdCBsaW5lKS4NCi0gKiBAbm90ZSAgIFRvIGRldGVybWluZSB3aGV0aGVyIGdyb3VwIGluamVjdGVkIHRyaWdnZXIgc291cmNlIGlzDQotICogICAgICAgICBpbnRlcm5hbCAoU1cgc3RhcnQpIG9yIGV4dGVybmFsLCB3aXRob3V0IGRldGFpbA0KLSAqICAgICAgICAgb2Ygd2hpY2ggcGVyaXBoZXJhbCBpcyBzZWxlY3RlZCBhcyBleHRlcm5hbCB0cmlnZ2VyLA0KLSAqICAgICAgICAgKGVxdWl2YWxlbnQgdG8NCi0gKiAgICAgICAgICJpZihMTF9BRENfSU5KX0dldFRyaWdnZXJTb3VyY2UoQURDMSkgPT0gTExfQURDX0lOSl9UUklHX1NPRlRXQVJFKSIpDQotICogICAgICAgICB1c2UgZnVuY3Rpb24gQHJlZiBMTF9BRENfSU5KX0lzVHJpZ2dlclNvdXJjZVNXU3RhcnQuDQotICogQG5vdGUgICBBdmFpbGFiaWxpdHkgb2YgcGFyYW1ldGVycyBvZiB0cmlnZ2VyIHNvdXJjZXMgZnJvbSB0aW1lcg0KLSAqICAgICAgICAgZGVwZW5kcyBvbiB0aW1lcnMgYXZhaWxhYmlsaXR5IG9uIHRoZSBzZWxlY3RlZCBkZXZpY2UuDQotICogQHJtdG9sbCBKU1FSICAgICBKRVhUU0VMICAgICAgICBMTF9BRENfSU5KX0dldFRyaWdnZXJTb3VyY2Vcbg0KLSAqICAgICAgICAgSlNRUiAgICAgSkVYVEVOICAgICAgICAgTExfQURDX0lOSl9HZXRUcmlnZ2VyU291cmNlDQotICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfU09GVFdBUkUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTFfVFJHTw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMV9UUkdPMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMV9DSDMgICAgICAgICAoMikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTFfQ0g0DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0yX1RSR08NCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTJfQ0gxICAgICAgICAgKDEpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0zX1RSR08NCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTNfQ0gxICAgICAgICAgKDEpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0zX0NIMyAgICAgICAgICgxKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNM19DSDQgICAgICAgICAoMSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTRfVFJHTw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNNF9DSDMgICAgICAgICAoMikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTRfQ0g0ICAgICAgICAgKDIpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU02X1RSR08NCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTdfVFJHTw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNOF9UUkdPDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU04X1RSR08yDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU04X0NIMiAgICAgICAgICgyKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNOF9DSDQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTE1X1RSR08NCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTE2X0NIMSAgICAgICAgKDEpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0yMF9UUkdPDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0yMF9UUkdPMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMjBfQ0gyICAgICAgICAoMikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTIwX0NINCAgICAgICAgKDEpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9IUlRJTV9UUkcxICAgICAgICgyKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfSFJUSU1fVFJHMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfSFJUSU1fVFJHMyAgICAgICAoMikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX0hSVElNX1RSRzQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX0hSVElNX1RSRzUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX0hSVElNX1RSRzYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX0hSVElNX1RSRzcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX0hSVElNX1RSRzgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX0hSVElNX1RSRzkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX0hSVElNX1RSRzEwDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9FWFRJX0xJTkUzICAgICAgICgyKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfRVhUSV9MSU5FMTUgICAgICAoMSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX0xQVElNX09VVA0KLSAqDQotICogICAgICAgICAoMSkgT24gU1RNMzJHNCBzZXJpZXMsIHBhcmFtZXRlciBub3QgYXZhaWxhYmxlIG9uIGFsbCBBREMgaW5zdGFuY2VzOg0KLSAqIEFEQzEsIEFEQzIuXG4gKDIpIE9uIFNUTTMyRzQgc2VyaWVzLCBwYXJhbWV0ZXIgbm90IGF2YWlsYWJsZSBvbiBhbGwgQURDDQotICogaW5zdGFuY2VzOiBBREMzLCBBREM0LCBBREM1LiBPbiB0aGlzIFNUTTMyIHNlcmllcywgYWxsIEFEQ3ggYXJlIG5vdCBhdmFpbGFibGUNCi0gKiBvbiBhbGwgZGV2aWNlcy4gUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgbW9yZSBkZXRhaWxzLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSU5KX0dldFRyaWdnZXJTb3VyY2UoQURDX1R5cGVEZWYgKkFEQ3gpIHsNCi0gIF9fSU8gdWludDMyX3QgVHJpZ2dlclNvdXJjZSA9DQotICAgICAgUkVBRF9CSVQoQURDeC0+SlNRUiwgQURDX0pTUVJfSkVYVFNFTCB8IEFEQ19KU1FSX0pFWFRFTik7DQotDQotICAvKiBWYWx1ZSBmb3Igc2hpZnQgb2YgezA7IDQ7IDg7IDEyfSBkZXBlbmRpbmcgb24gdmFsdWUgb2YgYml0ZmllbGQgICAgICAgICAgKi8NCi0gIC8qIGNvcnJlc3BvbmRpbmcgdG8gQURDX0pTUVJfSkVYVEVOIHswOyAxOyAyOyAzfS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgdWludDMyX3QgU2hpZnRKZXh0ZW4gPSAoKFRyaWdnZXJTb3VyY2UgJiBBRENfSlNRUl9KRVhURU4pID4+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAoQURDX0lOSl9UUklHX0VYVEVOX0JJVE9GRlNFVF9QT1MgLSAyVUwpKTsNCi0NCi0gIC8qIFNldCBiaXRmaWVsZCBjb3JyZXNwb25kaW5nIHRvIEFEQ19KU1FSX0pFWFRFTiBhbmQgQURDX0pTUVJfSkVYVFNFTCAgICAgICAqLw0KLSAgLyogdG8gbWF0Y2ggd2l0aCB0cmlnZ2VycyBsaXRlcmFscyBkZWZpbml0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICByZXR1cm4gKChUcmlnZ2VyU291cmNlICYgKEFEQ19JTkpfVFJJR19TT1VSQ0VfTUFTSyA+PiBTaGlmdEpleHRlbikgJg0KLSAgICAgICAgICAgQURDX0pTUVJfSkVYVFNFTCkgfA0KLSAgICAgICAgICAoKEFEQ19JTkpfVFJJR19FREdFX01BU0sgPj4gU2hpZnRKZXh0ZW4pICYgQURDX0pTUVJfSkVYVEVOKSk7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIEdldCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIHNvdXJjZSBpbnRlcm5hbCAoU1cgc3RhcnQpDQotICAgICAgICAgICAgb3IgZXh0ZXJuYWwNCi0gICogQG5vdGUgICBJbiBjYXNlIG9mIGdyb3VwIGluamVjdGVkIHRyaWdnZXIgc291cmNlIHNldCB0byBleHRlcm5hbCB0cmlnZ2VyLA0KLSAgKiAgICAgICAgIHRvIGRldGVybWluZSB3aGljaCBwZXJpcGhlcmFsIGlzIHNlbGVjdGVkIGFzIGV4dGVybmFsIHRyaWdnZXIsDQotICAqICAgICAgICAgdXNlIGZ1bmN0aW9uIEByZWYgTExfQURDX0lOSl9HZXRUcmlnZ2VyU291cmNlLg0KLSAgKiBAcm10b2xsIEpTUVIgICAgIEpFWFRFTiAgICAgICAgIExMX0FEQ19JTkpfSXNUcmlnZ2VyU291cmNlU1dTdGFydA0KLSAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICAqIEByZXR2YWwgVmFsdWUgIjAiIGlmIHRyaWdnZXIgc291cmNlIGV4dGVybmFsIHRyaWdnZXINCi0gICogICAgICAgICBWYWx1ZSAiMSIgaWYgdHJpZ2dlciBzb3VyY2UgU1cgc3RhcnQuDQotICAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSU5KX0lzVHJpZ2dlclNvdXJjZVNXU3RhcnQoQURDX1R5cGVEZWYgKkFEQ3gpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKEFEQ3gtPkpTUVIsIEFEQ19KU1FSX0pFWFRFTikgPT0NCi0gICAgICAgICAgIChMTF9BRENfSU5KX1RSSUdfU09GVFdBUkUgJiBBRENfSlNRUl9KRVhURU4pKQ0KLSAgICAgICAgICAgICAgPyAxVUwNCi0gICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZXQgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBwb2xhcml0eS4NCi0gKiAgICAgICAgIEFwcGxpY2FibGUgb25seSBmb3IgdHJpZ2dlciBzb3VyY2Ugc2V0IHRvIGV4dGVybmFsIHRyaWdnZXIuDQotICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllcywgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8NCi0gKiAgICAgICAgIEFEQyBzdGF0ZToNCi0gKiAgICAgICAgIEFEQyBtdXN0IG5vdCBiZSBkaXNhYmxlZC4gQ2FuIGJlIGVuYWJsZWQgd2l0aCBvciB3aXRob3V0IGNvbnZlcnNpb24NCi0gKiAgICAgICAgIG9uIGdvaW5nIG9uIGVpdGhlciBncm91cHMgcmVndWxhciBvciBpbmplY3RlZC4NCi0gKiBAcm10b2xsIEpTUVIgICAgIEpFWFRFTiAgICAgICAgIExMX0FEQ19JTkpfU2V0VHJpZ2dlckVkZ2UNCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHBhcmFtICBFeHRlcm5hbFRyaWdnZXJFZGdlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZw0KLSAqIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1JJU0lORw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfRkFMTElORw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfUklTSU5HRkFMTElORw0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19JTkpfU2V0VHJpZ2dlckVkZ2UoQURDX1R5cGVEZWYgKkFEQ3gsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBFeHRlcm5hbFRyaWdnZXJFZGdlKSB7DQotICBNT0RJRllfUkVHKEFEQ3gtPkpTUVIsIEFEQ19KU1FSX0pFWFRFTiwgRXh0ZXJuYWxUcmlnZ2VyRWRnZSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgcG9sYXJpdHkuDQotICogICAgICAgICBBcHBsaWNhYmxlIG9ubHkgZm9yIHRyaWdnZXIgc291cmNlIHNldCB0byBleHRlcm5hbCB0cmlnZ2VyLg0KLSAqIEBybXRvbGwgSlNRUiAgICAgSkVYVEVOICAgICAgICAgTExfQURDX0lOSl9HZXRUcmlnZ2VyRWRnZQ0KLSAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9SSVNJTkcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX0ZBTExJTkcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1JJU0lOR0ZBTExJTkcNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lOSl9HZXRUcmlnZ2VyRWRnZShBRENfVHlwZURlZiAqQURDeCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeC0+SlNRUiwgQURDX0pTUVJfSkVYVEVOKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IEFEQyBncm91cCBpbmplY3RlZCBzZXF1ZW5jZXIgbGVuZ3RoIGFuZCBzY2FuIGRpcmVjdGlvbi4NCi0gKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgY29uZmlndXJhdGlvbiBvZjoNCi0gKiAgICAgICAgIC0gU2VxdWVuY2UgbGVuZ3RoOiBOdW1iZXIgb2YgcmFua3MgaW4gdGhlIHNjYW4gc2VxdWVuY2UuDQotICogICAgICAgICAtIFNlcXVlbmNlIGRpcmVjdGlvbjogVW5sZXNzIHNwZWNpZmllZCBpbiBwYXJhbWV0ZXJzLCBzZXF1ZW5jZXINCi0gKiAgICAgICAgICAgc2NhbiBkaXJlY3Rpb24gaXMgZm9yd2FyZCAoZnJvbSByYW5rIDEgdG8gcmFuayBuKS4NCi0gKiBAbm90ZSAgIFNlcXVlbmNlciBkaXNhYmxlZCBpcyBlcXVpdmFsZW50IHRvIHNlcXVlbmNlciBvZiAxIHJhbms6DQotICogICAgICAgICBBREMgY29udmVyc2lvbiBvbiBvbmx5IDEgY2hhbm5lbC4NCi0gKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bw0KLSAqICAgICAgICAgQURDIHN0YXRlOg0KLSAqICAgICAgICAgQURDIG11c3Qgbm90IGJlIGRpc2FibGVkLiBDYW4gYmUgZW5hYmxlZCB3aXRoIG9yIHdpdGhvdXQgY29udmVyc2lvbg0KLSAqICAgICAgICAgb24gZ29pbmcgb24gZWl0aGVyIGdyb3VwcyByZWd1bGFyIG9yIGluamVjdGVkLg0KLSAqIEBybXRvbGwgSlNRUiAgICAgSkwgICAgICAgICAgICAgTExfQURDX0lOSl9TZXRTZXF1ZW5jZXJMZW5ndGgNCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHBhcmFtICBTZXF1ZW5jZXJOYlJhbmtzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9TRVFfU0NBTl9ESVNBQkxFDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9TRVFfU0NBTl9FTkFCTEVfMlJBTktTDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9TRVFfU0NBTl9FTkFCTEVfM1JBTktTDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9TRVFfU0NBTl9FTkFCTEVfNFJBTktTDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0lOSl9TZXRTZXF1ZW5jZXJMZW5ndGgoQURDX1R5cGVEZWYgKkFEQ3gsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgU2VxdWVuY2VyTmJSYW5rcykgew0KLSAgTU9ESUZZX1JFRyhBREN4LT5KU1FSLCBBRENfSlNRUl9KTCwgU2VxdWVuY2VyTmJSYW5rcyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IEFEQyBncm91cCBpbmplY3RlZCBzZXF1ZW5jZXIgbGVuZ3RoIGFuZCBzY2FuIGRpcmVjdGlvbi4NCi0gKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gcmV0cmlldmVzOg0KLSAqICAgICAgICAgLSBTZXF1ZW5jZSBsZW5ndGg6IE51bWJlciBvZiByYW5rcyBpbiB0aGUgc2NhbiBzZXF1ZW5jZS4NCi0gKiAgICAgICAgIC0gU2VxdWVuY2UgZGlyZWN0aW9uOiBVbmxlc3Mgc3BlY2lmaWVkIGluIHBhcmFtZXRlcnMsIHNlcXVlbmNlcg0KLSAqICAgICAgICAgICBzY2FuIGRpcmVjdGlvbiBpcyBmb3J3YXJkIChmcm9tIHJhbmsgMSB0byByYW5rIG4pLg0KLSAqIEBub3RlICAgU2VxdWVuY2VyIGRpc2FibGVkIGlzIGVxdWl2YWxlbnQgdG8gc2VxdWVuY2VyIG9mIDEgcmFuazoNCi0gKiAgICAgICAgIEFEQyBjb252ZXJzaW9uIG9uIG9ubHkgMSBjaGFubmVsLg0KLSAqIEBybXRvbGwgSlNRUiAgICAgSkwgICAgICAgICAgICAgTExfQURDX0lOSl9HZXRTZXF1ZW5jZXJMZW5ndGgNCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfU0VRX1NDQU5fRElTQUJMRQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfU0VRX1NDQU5fRU5BQkxFXzJSQU5LUw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfU0VRX1NDQU5fRU5BQkxFXzNSQU5LUw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfU0VRX1NDQU5fRU5BQkxFXzRSQU5LUw0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSU5KX0dldFNlcXVlbmNlckxlbmd0aChBRENfVHlwZURlZiAqQURDeCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeC0+SlNRUiwgQURDX0pTUVJfSkwpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZXQgQURDIGdyb3VwIGluamVjdGVkIHNlcXVlbmNlciBkaXNjb250aW51b3VzIG1vZGU6DQotICogICAgICAgICBzZXF1ZW5jZSBzdWJkaXZpZGVkIGFuZCBzY2FuIGNvbnZlcnNpb25zIGludGVycnVwdGVkIGV2ZXJ5IHNlbGVjdGVkDQotICogICAgICAgICBudW1iZXIgb2YgcmFua3MuDQotICogQG5vdGUgICBJdCBpcyBub3QgcG9zc2libGUgdG8gZW5hYmxlIGJvdGggQURDIGdyb3VwIGluamVjdGVkDQotICogICAgICAgICBhdXRvLWluamVjdGVkIG1vZGUgYW5kIHNlcXVlbmNlciBkaXNjb250aW51b3VzIG1vZGUuDQotICogQHJtdG9sbCBDRkdSICAgICBKRElTQ0VOICAgICAgICBMTF9BRENfSU5KX1NldFNlcXVlbmNlckRpc2NvbnQNCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHBhcmFtICBTZXFEaXNjb250IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9TRVFfRElTQ09OVF9ESVNBQkxFDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9TRVFfRElTQ09OVF8xUkFOSw0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19JTkpfU2V0U2VxdWVuY2VyRGlzY29udChBRENfVHlwZURlZiAqQURDeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgU2VxRGlzY29udCkgew0KLSAgTU9ESUZZX1JFRyhBREN4LT5DRkdSLCBBRENfQ0ZHUl9KRElTQ0VOLCBTZXFEaXNjb250KTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgQURDIGdyb3VwIGluamVjdGVkIHNlcXVlbmNlciBkaXNjb250aW51b3VzIG1vZGU6DQotICogICAgICAgICBzZXF1ZW5jZSBzdWJkaXZpZGVkIGFuZCBzY2FuIGNvbnZlcnNpb25zIGludGVycnVwdGVkIGV2ZXJ5IHNlbGVjdGVkDQotICogICAgICAgICBudW1iZXIgb2YgcmFua3MuDQotICogQHJtdG9sbCBDRkdSICAgICBKRElTQ0VOICAgICAgICBMTF9BRENfSU5KX0dldFNlcXVlbmNlckRpc2NvbnQNCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfU0VRX0RJU0NPTlRfRElTQUJMRQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfU0VRX0RJU0NPTlRfMVJBTksNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lOSl9HZXRTZXF1ZW5jZXJEaXNjb250KEFEQ19UeXBlRGVmICpBREN4KSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChBREN4LT5DRkdSLCBBRENfQ0ZHUl9KRElTQ0VOKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IEFEQyBncm91cCBpbmplY3RlZCBzZXF1ZW5jZTogY2hhbm5lbCBvbiB0aGUgc2VsZWN0ZWQNCi0gKiAgICAgICAgIHNlcXVlbmNlIHJhbmsuDQotICogQG5vdGUgICBEZXBlbmRpbmcgb24gZGV2aWNlcyBhbmQgcGFja2FnZXMsIHNvbWUgY2hhbm5lbHMgbWF5IG5vdCBiZQ0KLSAqIGF2YWlsYWJsZS4gUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgY2hhbm5lbHMgYXZhaWxhYmlsaXR5Lg0KLSAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIHRvIG1lYXN1cmUgaW50ZXJuYWwgY2hhbm5lbHMgKFZyZWZJbnQsDQotICogICAgICAgICBUZW1wU2Vuc29yLCAuLi4pLCBtZWFzdXJlbWVudCBwYXRocyB0byBpbnRlcm5hbCBjaGFubmVscyBtdXN0IGJlDQotICogICAgICAgICBlbmFibGVkIHNlcGFyYXRlbHkuDQotICogICAgICAgICBUaGlzIGNhbiBiZSBkb25lIHVzaW5nIGZ1bmN0aW9uIEByZWYNCi0gKiBMTF9BRENfU2V0Q29tbW9uUGF0aEludGVybmFsQ2goKS4NCi0gKiBAbm90ZSAgIE9uIFNUTTMyRzQsIHNvbWUgZmFzdCBjaGFubmVscyBhcmUgYXZhaWxhYmxlOiBmYXN0IGFuYWxvZyBpbnB1dHMNCi0gKiAgICAgICAgIGNvbWluZyBmcm9tIEdQSU8gcGFkcyAoQURDX0lOMS4uNSkuDQotICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllcywgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8NCi0gKiAgICAgICAgIEFEQyBzdGF0ZToNCi0gKiAgICAgICAgIEFEQyBtdXN0IG5vdCBiZSBkaXNhYmxlZC4gQ2FuIGJlIGVuYWJsZWQgd2l0aCBvciB3aXRob3V0IGNvbnZlcnNpb24NCi0gKiAgICAgICAgIG9uIGdvaW5nIG9uIGVpdGhlciBncm91cHMgcmVndWxhciBvciBpbmplY3RlZC4NCi0gKiBAcm10b2xsIEpTUVIgICAgIEpTUTEgICAgICAgICAgIExMX0FEQ19JTkpfU2V0U2VxdWVuY2VyUmFua3Ncbg0KLSAqICAgICAgICAgSlNRUiAgICAgSlNRMiAgICAgICAgICAgTExfQURDX0lOSl9TZXRTZXF1ZW5jZXJSYW5rc1xuDQotICogICAgICAgICBKU1FSICAgICBKU1EzICAgICAgICAgICBMTF9BRENfSU5KX1NldFNlcXVlbmNlclJhbmtzXG4NCi0gKiAgICAgICAgIEpTUVIgICAgIEpTUTQgICAgICAgICAgIExMX0FEQ19JTkpfU2V0U2VxdWVuY2VyUmFua3MNCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHBhcmFtICBSYW5rIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9SQU5LXzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1JBTktfMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfUkFOS18zDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9SQU5LXzQNCi0gKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8wDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMSAgICAgICAgICAgICAgICAgKDgpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMiAgICAgICAgICAgICAgICAgKDgpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMyAgICAgICAgICAgICAgICAgKDgpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNCAgICAgICAgICAgICAgICAgKDgpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNSAgICAgICAgICAgICAgICAgKDgpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF84DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEwDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEzDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE2DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQgICAgICAgICAgICg3KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1JfQURDMSAgICgxKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1JfQURDNSAgICg1KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZCQVQgICAgICAgICAgICAgICg2KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDEgICAgICAgICAgICgxKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDIgICAgICAgICAgICgyKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDNfQURDMiAgICAgICgyKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDNfQURDMyAgICAgICgzKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDQgICAgICAgICAgICg1KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDUgICAgICAgICAgICg1KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDYgICAgICAgICAgICg0KQ0KLSAqDQotICogICAgICAgICAoMSkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMS5cbg0KLSAqICAgICAgICAgKDIpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzIuXG4NCi0gKiAgICAgICAgICgzKSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMzLlxuDQotICogICAgICAgICAoNCkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDNC5cbg0KLSAqICAgICAgICAgKDUpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzUuXG4NCi0gKiAgICAgICAgICg2KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlczogQURDMSwNCi0gKiBBREMzLCBBREM1LlxuICg3KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlczoNCi0gKiBBREMxLCBBREMzLCBBREM0LCBBREM1LlxuDQotICogICAgICAgICAgLSAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIGFsbCBBREN4IGFyZSBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzLg0KLSAqIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIG1vcmUgZGV0YWlscy4gKDgpIE9uIFNUTTMyRzQsIGZhc3QgY2hhbm5lbA0KLSAqIGFsbG93czogMi41IChzYW1wbGluZykgKyAxMi41IChjb252ZXJzaW9uKSA9IDE1IEFEQyBjbG9jayBjeWNsZXMgKGZBREMpIHRvDQotICogY29udmVydCBpbiAxMi1iaXQgcmVzb2x1dGlvbi4gT3RoZXIgY2hhbm5lbHMgYXJlIHNsb3cgY2hhbm5lbHMgIGFsbG93czogNi41DQotICogKHNhbXBsaW5nKSArIDEyLjUgKGNvbnZlcnNpb24pID0gMTkgQURDIGNsb2NrIGN5Y2xlcyAoZkFEQykgdG8gY29udmVydCBpbg0KLSAqIDEyLWJpdCByZXNvbHV0aW9uLlxuDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0lOSl9TZXRTZXF1ZW5jZXJSYW5rcyhBRENfVHlwZURlZiAqQURDeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFJhbmssDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKSB7DQotICAvKiBTZXQgYml0cyB3aXRoIGNvbnRlbnQgb2YgcGFyYW1ldGVyICJDaGFubmVsIiB3aXRoIGJpdHMgcG9zaXRpb24gICAgICAgICAgKi8NCi0gIC8qIGluIHJlZ2lzdGVyIGRlcGVuZGluZyBvbiBwYXJhbWV0ZXIgIlJhbmsiLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgLyogUGFyYW1ldGVycyAiUmFuayIgYW5kICJDaGFubmVsIiBhcmUgdXNlZCB3aXRoIG1hc2tzIGJlY2F1c2UgY29udGFpbmluZyAgICovDQotICAvKiBvdGhlciBiaXRzIHJlc2VydmVkIGZvciBvdGhlciBwdXJwb3NlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gIE1PRElGWV9SRUcoQURDeC0+SlNRUiwNCi0gICAgICAgICAgICAgKEFEQ19DSEFOTkVMX0lEX05VTUJFUl9NQVNLID4+IEFEQ19DSEFOTkVMX0lEX05VTUJFUl9CSVRPRkZTRVRfUE9TKQ0KLSAgICAgICAgICAgICAgICAgPDwgKFJhbmsgJiBBRENfSU5KX1JBTktfSURfSlNRUl9NQVNLKSwNCi0gICAgICAgICAgICAgKChDaGFubmVsICYgQURDX0NIQU5ORUxfSURfTlVNQkVSX01BU0spID4+DQotICAgICAgICAgICAgICBBRENfQ0hBTk5FTF9JRF9OVU1CRVJfQklUT0ZGU0VUX1BPUykNCi0gICAgICAgICAgICAgICAgIDw8IChSYW5rICYgQURDX0lOSl9SQU5LX0lEX0pTUVJfTUFTSykpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBBREMgZ3JvdXAgaW5qZWN0ZWQgc2VxdWVuY2U6IGNoYW5uZWwgb24gdGhlIHNlbGVjdGVkDQotICogICAgICAgICBzZXF1ZW5jZSByYW5rLg0KLSAqIEBub3RlICAgRGVwZW5kaW5nIG9uIGRldmljZXMgYW5kIHBhY2thZ2VzLCBzb21lIGNoYW5uZWxzIG1heSBub3QgYmUNCi0gKiBhdmFpbGFibGUuIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIGNoYW5uZWxzIGF2YWlsYWJpbGl0eS4NCi0gKiBAbm90ZSAgIFVzYWdlIG9mIHRoZSByZXR1cm5lZCBjaGFubmVsIG51bWJlcjoNCi0gKiAgICAgICAgIC0gVG8gcmVpbmplY3QgdGhpcyBjaGFubmVsIGludG8gYW5vdGhlciBmdW5jdGlvbiBMTF9BRENfeHh4Og0KLSAqICAgICAgICAgICB0aGUgcmV0dXJuZWQgY2hhbm5lbCBudW1iZXIgaXMgb25seSBwYXJ0bHkgZm9ybWF0dGVkIG9uIGRlZmluaXRpb24NCi0gKiAgICAgICAgICAgb2YgbGl0ZXJhbHMgTExfQURDX0NIQU5ORUxfeC4gVGhlcmVmb3JlLCBpdCBoYXMgdG8gYmUgY29tcGFyZWQNCi0gKiAgICAgICAgICAgd2l0aCBwYXJ0cyBvZiBsaXRlcmFscyBMTF9BRENfQ0hBTk5FTF94IG9yIHVzaW5nDQotICogICAgICAgICAgIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0NIQU5ORUxfVE9fREVDSU1BTF9OQigpLg0KLSAqICAgICAgICAgICBUaGVuIHRoZSBzZWxlY3RlZCBsaXRlcmFsIExMX0FEQ19DSEFOTkVMX3ggY2FuIGJlIHVzZWQNCi0gKiAgICAgICAgICAgYXMgcGFyYW1ldGVyIGZvciBhbm90aGVyIGZ1bmN0aW9uLg0KLSAqICAgICAgICAgLSBUbyBnZXQgdGhlIGNoYW5uZWwgbnVtYmVyIGluIGRlY2ltYWwgZm9ybWF0Og0KLSAqICAgICAgICAgICBwcm9jZXNzIHRoZSByZXR1cm5lZCB2YWx1ZSB3aXRoIHRoZSBoZWxwZXIgbWFjcm8NCi0gKiAgICAgICAgICAgQHJlZiBfX0xMX0FEQ19DSEFOTkVMX1RPX0RFQ0lNQUxfTkIoKS4NCi0gKiBAcm10b2xsIEpTUVIgICAgIEpTUTEgICAgICAgICAgIExMX0FEQ19JTkpfR2V0U2VxdWVuY2VyUmFua3Ncbg0KLSAqICAgICAgICAgSlNRUiAgICAgSlNRMiAgICAgICAgICAgTExfQURDX0lOSl9HZXRTZXF1ZW5jZXJSYW5rc1xuDQotICogICAgICAgICBKU1FSICAgICBKU1EzICAgICAgICAgICBMTF9BRENfSU5KX0dldFNlcXVlbmNlclJhbmtzXG4NCi0gKiAgICAgICAgIEpTUVIgICAgIEpTUTQgICAgICAgICAgIExMX0FEQ19JTkpfR2V0U2VxdWVuY2VyUmFua3MNCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHBhcmFtICBSYW5rIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9SQU5LXzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1JBTktfMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfUkFOS18zDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9SQU5LXzQNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEgICAgICAgICAgICAgICAgICg4KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzIgICAgICAgICAgICAgICAgICg4KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzMgICAgICAgICAgICAgICAgICg4KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzQgICAgICAgICAgICAgICAgICg4KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzUgICAgICAgICAgICAgICAgICg4KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF83DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzExDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE0DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE3DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WUkVGSU5UICAgICAgICAgICAoNykNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SX0FEQzEgICAoMSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SX0FEQzUgICAoNSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WQkFUICAgICAgICAgICAgICAoNikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAxICAgICAgICAgICAoMSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAyICAgICAgICAgICAoMikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAzX0FEQzIgICAgICAoMikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAzX0FEQzMgICAgICAoMykNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVA0ICAgICAgICAgICAoNSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVA1ICAgICAgICAgICAoNSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVA2ICAgICAgICAgICAoNCkNCi0gKg0KLSAqICAgICAgICAgKDEpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzEuXG4NCi0gKiAgICAgICAgICgyKSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMyLlxuDQotICogICAgICAgICAoMykgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMy5cbg0KLSAqICAgICAgICAgKDQpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzQuXG4NCi0gKiAgICAgICAgICg1KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREM1LlxuDQotICogICAgICAgICAoNikgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZXM6IEFEQzEsDQotICogQURDMywgQURDNS5cbiAoNykgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZXM6DQotICogQURDMSwgQURDMywgQURDNCwgQURDNS5cbg0KLSAqICAgICAgICAgIC0gIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBhbGwgQURDeCBhcmUgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlcy4NCi0gKiBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBtb3JlIGRldGFpbHMuICg4KSBPbiBTVE0zMkc0LCBmYXN0IGNoYW5uZWwNCi0gKiBhbGxvd3M6IDIuNSAoc2FtcGxpbmcpICsgMTIuNSAoY29udmVyc2lvbikgPSAxNSBBREMgY2xvY2sgY3ljbGVzIChmQURDKSB0bw0KLSAqIGNvbnZlcnQgaW4gMTItYml0IHJlc29sdXRpb24uIE90aGVyIGNoYW5uZWxzIGFyZSBzbG93IGNoYW5uZWxzICBhbGxvd3M6IDYuNQ0KLSAqIChzYW1wbGluZykgKyAxMi41IChjb252ZXJzaW9uKSA9IDE5IEFEQyBjbG9jayBjeWNsZXMgKGZBREMpIHRvIGNvbnZlcnQgaW4NCi0gKiAxMi1iaXQgcmVzb2x1dGlvbi5cbiAoMSwgMiwgMywgNCwgNSwgNykgRm9yIEFEQyBjaGFubmVsIHJlYWQgYmFjayBmcm9tIEFEQw0KLSAqIHJlZ2lzdGVyLCBjb21wYXJpc29uIHdpdGggaW50ZXJuYWwgY2hhbm5lbCBwYXJhbWV0ZXIgdG8gYmUgZG9uZSB1c2luZyBoZWxwZXINCi0gKiBtYWNybyBAcmVmIF9fTExfQURDX0NIQU5ORUxfSU5URVJOQUxfVE9fRVhURVJOQUwoKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lOSl9HZXRTZXF1ZW5jZXJSYW5rcyhBRENfVHlwZURlZiAqQURDeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBSYW5rKSB7DQotICByZXR1cm4gKHVpbnQzMl90KSgoUkVBRF9CSVQoQURDeC0+SlNRUiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQURDX0NIQU5ORUxfSURfTlVNQkVSX01BU0sgPj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NIQU5ORUxfSURfTlVNQkVSX0JJVE9GRlNFVF9QT1MpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IChSYW5rICYgQURDX0lOSl9SQU5LX0lEX0pTUVJfTUFTSykpID4+DQotICAgICAgICAgICAgICAgICAgICAgKFJhbmsgJiBBRENfSU5KX1JBTktfSURfSlNRUl9NQVNLKSkNCi0gICAgICAgICAgICAgICAgICAgIDw8IEFEQ19DSEFOTkVMX0lEX05VTUJFUl9CSVRPRkZTRVRfUE9TKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZXQgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlcjoNCi0gKiAgICAgICAgIGluZGVwZW5kZW50IG9yIGZyb20gQURDIGdyb3VwIHJlZ3VsYXIuDQotICogQG5vdGUgICBUaGlzIG1vZGUgY2FuIGJlIHVzZWQgdG8gZXh0ZW5kIG51bWJlciBvZiBkYXRhIHJlZ2lzdGVycw0KLSAqICAgICAgICAgdXBkYXRlZCBhZnRlciBvbmUgQURDIGNvbnZlcnNpb24gdHJpZ2dlciBhbmQgd2l0aCBkYXRhDQotICogICAgICAgICBwZXJtYW5lbnRseSBrZXB0IChub3QgZXJhc2VkIGJ5IHN1Y2Nlc3NpdmUgY29udmVyc2lvbnMgb2Ygc2NhbiBvZg0KLSAqICAgICAgICAgQURDIHNlcXVlbmNlciByYW5rcyksIHVwIHRvIDUgZGF0YSByZWdpc3RlcnM6DQotICogICAgICAgICAxIGRhdGEgcmVnaXN0ZXIgb24gQURDIGdyb3VwIHJlZ3VsYXIsIDQgZGF0YSByZWdpc3RlcnMNCi0gKiAgICAgICAgIG9uIEFEQyBncm91cCBpbmplY3RlZC4NCi0gKiBAbm90ZSAgIElmIEFEQyBncm91cCBpbmplY3RlZCBpbmplY3RlZCB0cmlnZ2VyIHNvdXJjZSBpcyBzZXQgdG8gYW4NCi0gKiAgICAgICAgIGV4dGVybmFsIHRyaWdnZXIsIHRoaXMgZmVhdHVyZSBtdXN0IGJlIG11c3QgYmUgc2V0IHRvDQotICogICAgICAgICBpbmRlcGVuZGVudCB0cmlnZ2VyLg0KLSAqICAgICAgICAgQURDIGdyb3VwIGluamVjdGVkIGF1dG9tYXRpYyB0cmlnZ2VyIGlzIGNvbXBsaWFudCBvbmx5IHdpdGgNCi0gKiAgICAgICAgIGdyb3VwIGluamVjdGVkIHRyaWdnZXIgc291cmNlIHNldCB0byBTVyBzdGFydCwgd2l0aG91dCBhbnkNCi0gKiAgICAgICAgIGZ1cnRoZXIgYWN0aW9uIG9uICBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiBzdGFydCBvciBzdG9wOg0KLSAqICAgICAgICAgaW4gdGhpcyBjYXNlLCBBREMgZ3JvdXAgaW5qZWN0ZWQgaXMgY29udHJvbGxlZCBvbmx5DQotICogICAgICAgICBmcm9tIEFEQyBncm91cCByZWd1bGFyLg0KLSAqIEBub3RlICAgSXQgaXMgbm90IHBvc3NpYmxlIHRvIGVuYWJsZSBib3RoIEFEQyBncm91cCBpbmplY3RlZA0KLSAqICAgICAgICAgYXV0by1pbmplY3RlZCBtb2RlIGFuZCBzZXF1ZW5jZXIgZGlzY29udGludW91cyBtb2RlLg0KLSAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvDQotICogICAgICAgICBBREMgc3RhdGU6DQotICogICAgICAgICBBREMgbXVzdCBiZSBkaXNhYmxlZCBvciBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZw0KLSAqICAgICAgICAgb24gZWl0aGVyIGdyb3VwcyByZWd1bGFyIG9yIGluamVjdGVkLg0KLSAqIEBybXRvbGwgQ0ZHUiAgICAgSkFVVE8gICAgICAgICAgTExfQURDX0lOSl9TZXRUcmlnQXV0bw0KLSAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UNCi0gKiBAcGFyYW0gIFRyaWdBdXRvIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0lOREVQRU5ERU5UDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0ZST01fR1JQX1JFR1VMQVINCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfSU5KX1NldFRyaWdBdXRvKEFEQ19UeXBlRGVmICpBREN4LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVHJpZ0F1dG8pIHsNCi0gIE1PRElGWV9SRUcoQURDeC0+Q0ZHUiwgQURDX0NGR1JfSkFVVE8sIFRyaWdBdXRvKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlcjoNCi0gKiAgICAgICAgIGluZGVwZW5kZW50IG9yIGZyb20gQURDIGdyb3VwIHJlZ3VsYXIuDQotICogQHJtdG9sbCBDRkdSICAgICBKQVVUTyAgICAgICAgICBMTF9BRENfSU5KX0dldFRyaWdBdXRvDQotICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfSU5ERVBFTkRFTlQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRlJPTV9HUlBfUkVHVUxBUg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSU5KX0dldFRyaWdBdXRvKEFEQ19UeXBlRGVmICpBREN4KSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChBREN4LT5DRkdSLCBBRENfQ0ZHUl9KQVVUTykpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udGV4dHMgcXVldWUgbW9kZS4NCi0gKiBAbm90ZSAgIEEgY29udGV4dCBpcyBhIHNldHRpbmcgb2YgZ3JvdXAgaW5qZWN0ZWQgc2VxdWVuY2VyOg0KLSAqICAgICAgICAgLSBncm91cCBpbmplY3RlZCB0cmlnZ2VyDQotICogICAgICAgICAtIHNlcXVlbmNlciBsZW5ndGgNCi0gKiAgICAgICAgIC0gc2VxdWVuY2VyIHJhbmtzDQotICogICAgICAgICBJZiBjb250ZXh0cyBxdWV1ZSBpcyBkaXNhYmxlZDoNCi0gKiAgICAgICAgIC0gb25seSAxIHNlcXVlbmNlIGNhbiBiZSBjb25maWd1cmVkDQotICogICAgICAgICAgIGFuZCBpcyBhY3RpdmUgcGVycGV0dWFsbHkuDQotICogICAgICAgICBJZiBjb250ZXh0cyBxdWV1ZSBpcyBlbmFibGVkOg0KLSAqICAgICAgICAgLSB1cCB0byAyIGNvbnRleHRzIGNhbiBiZSBxdWV1ZWQNCi0gKiAgICAgICAgICAgYW5kIGFyZSBjaGVja2VkIGluIGFuZCBvdXQgYXMgYSBGSUZPIHN0YWNrIChmaXJzdC1pbiwgZmlyc3Qtb3V0KS4NCi0gKiAgICAgICAgIC0gSWYgYSBuZXcgY29udGV4dCBpcyBzZXQgd2hlbiBxdWV1ZXMgaXMgZnVsbCwgZXJyb3IgaXMgdHJpZ2dlcmVkDQotICogICAgICAgICAgIGJ5IGludGVycnVwdGlvbiAiSW5qZWN0ZWQgUXVldWUgT3ZlcmZsb3ciLg0KLSAqICAgICAgICAgLSBUd28gYmVoYXZpb3JzIGFyZSBwb3NzaWJsZSB3aGVuIGFsbCBjb250ZXh0cyBoYXZlIGJlZW4gcHJvY2Vzc2VkOg0KLSAqICAgICAgICAgICB0aGUgY29udGV4dHMgcXVldWUgY2FuIG1haW50YWluIHRoZSBsYXN0IGNvbnRleHQgYWN0aXZlIHBlcnBldHVhbGx5DQotICogICAgICAgICAgIG9yIGNhbiBiZSBlbXB0eSBhbmQgaW5qZWN0ZWQgZ3JvdXAgdHJpZ2dlcnMgYXJlIGRpc2FibGVkLg0KLSAqICAgICAgICAgLSBUcmlnZ2VycyBjYW4gYmUgb25seSBleHRlcm5hbCAobm90IGludGVybmFsIFNXIHN0YXJ0KQ0KLSAqICAgICAgICAgLSBDYXV0aW9uOiBUaGUgc2VxdWVuY2UgbXVzdCBiZSBmdWxseSBjb25maWd1cmVkIGluIG9uZSB0aW1lDQotICogICAgICAgICAgIChvbmUgd3JpdGUgb2YgcmVnaXN0ZXIgSlNRUiBtYWtlcyBhIGNoZWNrLWluIG9mIGEgbmV3IGNvbnRleHQNCi0gKiAgICAgICAgICAgaW50byB0aGUgcXVldWUpLg0KLSAqICAgICAgICAgICBUaGVyZWZvcmUgZnVuY3Rpb25zIHRvIHNldCBzZXBhcmF0ZWx5IGluamVjdGVkIHRyaWdnZXIgYW5kDQotICogICAgICAgICAgIHNlcXVlbmNlciBjaGFubmVscyBjYW5ub3QgYmUgdXNlZCwgcmVnaXN0ZXIgSlNRUiBtdXN0IGJlIHNldA0KLSAqICAgICAgICAgICB1c2luZyBmdW5jdGlvbiBAcmVmIExMX0FEQ19JTkpfQ29uZmlnUXVldWVDb250ZXh0KCkuDQotICogQG5vdGUgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgbW9kaWZpZWQgb25seSB3aGVuIG5vIGNvbnZlcnNpb24gaXMgb24gZ29pbmcNCi0gKiAgICAgICAgIG9uIGVpdGhlciBncm91cHMgcmVndWxhciBvciBpbmplY3RlZC4NCi0gKiBAbm90ZSAgIEEgbW9kaWZpY2F0aW9uIG9mIHRoZSBjb250ZXh0IG1vZGUgKGJpdCBKUURJUykgY2F1c2VzIHRoZSBjb250ZXh0cw0KLSAqICAgICAgICAgcXVldWUgdG8gYmUgZmx1c2hlZCBhbmQgdGhlIHJlZ2lzdGVyIEpTUVIgaXMgY2xlYXJlZC4NCi0gKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bw0KLSAqICAgICAgICAgQURDIHN0YXRlOg0KLSAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcNCi0gKiAgICAgICAgIG9uIGVpdGhlciBncm91cHMgcmVndWxhciBvciBpbmplY3RlZC4NCi0gKiBAcm10b2xsIENGR1IgICAgIEpRTSAgICAgICAgICAgIExMX0FEQ19JTkpfU2V0UXVldWVNb2RlXG4NCi0gKiAgICAgICAgIENGR1IgICAgIEpRRElTICAgICAgICAgIExMX0FEQ19JTkpfU2V0UXVldWVNb2RlDQotICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQ0KLSAqIEBwYXJhbSAgUXVldWVNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9RVUVVRV9ESVNBQkxFDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9RVUVVRV8yQ09OVEVYVFNfTEFTVF9BQ1RJVkUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1FVRVVFXzJDT05URVhUU19FTkRfRU1QVFkNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfSU5KX1NldFF1ZXVlTW9kZShBRENfVHlwZURlZiAqQURDeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBRdWV1ZU1vZGUpIHsNCi0gIE1PRElGWV9SRUcoQURDeC0+Q0ZHUiwgQURDX0NGR1JfSlFNIHwgQURDX0NGR1JfSlFESVMsIFF1ZXVlTW9kZSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IEFEQyBncm91cCBpbmplY3RlZCBjb250ZXh0IHF1ZXVlIG1vZGUuDQotICogQHJtdG9sbCBDRkdSICAgICBKUU0gICAgICAgICAgICBMTF9BRENfSU5KX0dldFF1ZXVlTW9kZVxuDQotICogICAgICAgICBDRkdSICAgICBKUURJUyAgICAgICAgICBMTF9BRENfSU5KX0dldFF1ZXVlTW9kZQ0KLSAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9RVUVVRV9ESVNBQkxFDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9RVUVVRV8yQ09OVEVYVFNfTEFTVF9BQ1RJVkUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1FVRVVFXzJDT05URVhUU19FTkRfRU1QVFkNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lOSl9HZXRRdWV1ZU1vZGUoQURDX1R5cGVEZWYgKkFEQ3gpIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEFEQ3gtPkNGR1IsIEFEQ19DRkdSX0pRTSB8IEFEQ19DRkdSX0pRRElTKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IG9uZSBjb250ZXh0IG9uIEFEQyBncm91cCBpbmplY3RlZCB0aGF0IHdpbGwgYmUgY2hlY2tlZCBpbg0KLSAqICAgICAgICAgY29udGV4dHMgcXVldWUuDQotICogQG5vdGUgICBBIGNvbnRleHQgaXMgYSBzZXR0aW5nIG9mIGdyb3VwIGluamVjdGVkIHNlcXVlbmNlcjoNCi0gKiAgICAgICAgIC0gZ3JvdXAgaW5qZWN0ZWQgdHJpZ2dlcg0KLSAqICAgICAgICAgLSBzZXF1ZW5jZXIgbGVuZ3RoDQotICogICAgICAgICAtIHNlcXVlbmNlciByYW5rcw0KLSAqICAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHdoZW4gY29udGV4dHMgcXVldWUgaXMgZW5hYmxlZCwNCi0gKiAgICAgICAgIGJlY2F1c2UgdGhlIHNlcXVlbmNlIG11c3QgYmUgZnVsbHkgY29uZmlndXJlZCBpbiBvbmUgdGltZQ0KLSAqICAgICAgICAgKGZ1bmN0aW9ucyB0byBzZXQgc2VwYXJhdGVseSBpbmplY3RlZCB0cmlnZ2VyIGFuZCBzZXF1ZW5jZXIgY2hhbm5lbHMNCi0gKiAgICAgICAgIGNhbm5vdCBiZSB1c2VkKToNCi0gKiAgICAgICAgIFJlZmVyIHRvIGZ1bmN0aW9uIEByZWYgTExfQURDX0lOSl9TZXRRdWV1ZU1vZGUoKS4NCi0gKiBAbm90ZSAgIEluIHRoZSBjb250ZXh0cyBxdWV1ZSwgb25seSB0aGUgYWN0aXZlIGNvbnRleHQgY2FuIGJlIHJlYWQuDQotICogICAgICAgICBUaGUgcGFyYW1ldGVycyBvZiB0aGlzIGZ1bmN0aW9uIGNhbiBiZSByZWFkIHVzaW5nIGZ1bmN0aW9uczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX0dldFRyaWdnZXJTb3VyY2UoKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfR2V0VHJpZ2dlckVkZ2UoKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfR2V0U2VxdWVuY2VyUmFua3MoKQ0KLSAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIHRvIG1lYXN1cmUgaW50ZXJuYWwgY2hhbm5lbHMgKFZyZWZJbnQsDQotICogICAgICAgICBUZW1wU2Vuc29yLCAuLi4pLCBtZWFzdXJlbWVudCBwYXRocyB0byBpbnRlcm5hbCBjaGFubmVscyBtdXN0IGJlDQotICogICAgICAgICBlbmFibGVkIHNlcGFyYXRlbHkuDQotICogICAgICAgICBUaGlzIGNhbiBiZSBkb25lIHVzaW5nIGZ1bmN0aW9uIEByZWYNCi0gKiBMTF9BRENfU2V0Q29tbW9uUGF0aEludGVybmFsQ2goKS4NCi0gKiBAbm90ZSAgIE9uIFNUTTMyRzQsIHNvbWUgZmFzdCBjaGFubmVscyBhcmUgYXZhaWxhYmxlOiBmYXN0IGFuYWxvZyBpbnB1dHMNCi0gKiAgICAgICAgIGNvbWluZyBmcm9tIEdQSU8gcGFkcyAoQURDX0lOMS4uNSkuDQotICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllcywgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8NCi0gKiAgICAgICAgIEFEQyBzdGF0ZToNCi0gKiAgICAgICAgIEFEQyBtdXN0IG5vdCBiZSBkaXNhYmxlZC4gQ2FuIGJlIGVuYWJsZWQgd2l0aCBvciB3aXRob3V0IGNvbnZlcnNpb24NCi0gKiAgICAgICAgIG9uIGdvaW5nIG9uIGVpdGhlciBncm91cHMgcmVndWxhciBvciBpbmplY3RlZC4NCi0gKiBAcm10b2xsIEpTUVIgICAgIEpFWFRTRUwgICAgICAgIExMX0FEQ19JTkpfQ29uZmlnUXVldWVDb250ZXh0XG4NCi0gKiAgICAgICAgIEpTUVIgICAgIEpFWFRFTiAgICAgICAgIExMX0FEQ19JTkpfQ29uZmlnUXVldWVDb250ZXh0XG4NCi0gKiAgICAgICAgIEpTUVIgICAgIEpMICAgICAgICAgICAgIExMX0FEQ19JTkpfQ29uZmlnUXVldWVDb250ZXh0XG4NCi0gKiAgICAgICAgIEpTUVIgICAgIEpTUTEgICAgICAgICAgIExMX0FEQ19JTkpfQ29uZmlnUXVldWVDb250ZXh0XG4NCi0gKiAgICAgICAgIEpTUVIgICAgIEpTUTIgICAgICAgICAgIExMX0FEQ19JTkpfQ29uZmlnUXVldWVDb250ZXh0XG4NCi0gKiAgICAgICAgIEpTUVIgICAgIEpTUTMgICAgICAgICAgIExMX0FEQ19JTkpfQ29uZmlnUXVldWVDb250ZXh0XG4NCi0gKiAgICAgICAgIEpTUVIgICAgIEpTUTQgICAgICAgICAgIExMX0FEQ19JTkpfQ29uZmlnUXVldWVDb250ZXh0DQotICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQ0KLSAqIEBwYXJhbSAgVHJpZ2dlclNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19TT0ZUV0FSRQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMV9UUkdPDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0xX1RSR08yDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0xX0NIMyAgICAgICAgICgyKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMV9DSDQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTJfVFJHTw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMl9DSDEgICAgICAgICAoMSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTNfVFJHTw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNM19DSDEgICAgICAgICAoMSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTNfQ0gzICAgICAgICAgKDEpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0zX0NINCAgICAgICAgICgxKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNNF9UUkdPDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU00X0NIMyAgICAgICAgICgyKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNNF9DSDQgICAgICAgICAoMikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTZfVFJHTw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNN19UUkdPDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU04X1RSR08NCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTThfVFJHTzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTThfQ0gyICAgICAgICAgKDIpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU04X0NINA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMTVfVFJHTw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMTZfQ0gxICAgICAgICAoMSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTIwX1RSR08NCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTIwX1RSR08yDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0yMF9DSDIgICAgICAgICgyKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMjBfQ0g0ICAgICAgICAoMSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX0hSVElNX1RSRzEgICAgICAgKDIpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9IUlRJTV9UUkcyDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9IUlRJTV9UUkczICAgICAgICgyKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfSFJUSU1fVFJHNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfSFJUSU1fVFJHNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfSFJUSU1fVFJHNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfSFJUSU1fVFJHNw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfSFJUSU1fVFJHOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfSFJUSU1fVFJHOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfSFJUSU1fVFJHMTANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX0VYVElfTElORTMgICAgICAgKDIpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9FWFRJX0xJTkUxNSAgICAgICgxKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfTFBUSU1fT1VUDQotICoNCi0gKiAgICAgICAgICgxKSBPbiBTVE0zMkc0IHNlcmllcywgcGFyYW1ldGVyIG5vdCBhdmFpbGFibGUgb24gYWxsIEFEQyBpbnN0YW5jZXM6DQotICogQURDMSwgQURDMi5cbiAoMikgT24gU1RNMzJHNCBzZXJpZXMsIHBhcmFtZXRlciBub3QgYXZhaWxhYmxlIG9uIGFsbCBBREMNCi0gKiBpbnN0YW5jZXM6IEFEQzMsIEFEQzQsIEFEQzUuIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBhbGwgQURDeCBhcmUgbm90IGF2YWlsYWJsZQ0KLSAqIG9uIGFsbCBkZXZpY2VzLiBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBtb3JlIGRldGFpbHMuDQotICogQHBhcmFtICBFeHRlcm5hbFRyaWdnZXJFZGdlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZw0KLSAqIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1JJU0lORw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfRkFMTElORw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfUklTSU5HRkFMTElORw0KLSAqDQotICogICAgICAgICBOb3RlOiBUaGlzIHBhcmFtZXRlciBpcyBkaXNjYXJkZWQgaW4gY2FzZSBvZiBTVyBzdGFydDoNCi0gKiAgICAgICAgICAgICAgIHBhcmFtZXRlciAiVHJpZ2dlclNvdXJjZSIgc2V0IHRvICJMTF9BRENfSU5KX1RSSUdfU09GVFdBUkUiLg0KLSAqIEBwYXJhbSAgU2VxdWVuY2VyTmJSYW5rcyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfU0VRX1NDQU5fRElTQUJMRQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfU0VRX1NDQU5fRU5BQkxFXzJSQU5LUw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfU0VRX1NDQU5fRU5BQkxFXzNSQU5LUw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfU0VRX1NDQU5fRU5BQkxFXzRSQU5LUw0KLSAqIEBwYXJhbSAgUmFuazFfQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xICAgICAgICAgICAgICAgICAoOCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8yICAgICAgICAgICAgICAgICAoOCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8zICAgICAgICAgICAgICAgICAoOCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF80ICAgICAgICAgICAgICAgICAoOCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF81ICAgICAgICAgICAgICAgICAoOCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF82DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF85DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEyDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE1DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE4DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVlJFRklOVCAgICAgICAgICAgKDcpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUl9BREMxICAgKDEpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUl9BREM1ICAgKDUpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVkJBVCAgICAgICAgICAgICAgKDYpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QMSAgICAgICAgICAgKDEpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QMiAgICAgICAgICAgKDIpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QM19BREMyICAgICAgKDIpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QM19BREMzICAgICAgKDMpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QNCAgICAgICAgICAgKDUpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QNSAgICAgICAgICAgKDUpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QNiAgICAgICAgICAgKDQpDQotICoNCi0gKiAgICAgICAgICgxKSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMxLlxuDQotICogICAgICAgICAoMikgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMi5cbg0KLSAqICAgICAgICAgKDMpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzMuXG4NCi0gKiAgICAgICAgICg0KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREM0LlxuDQotICogICAgICAgICAoNSkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDNS5cbg0KLSAqICAgICAgICAgKDYpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2VzOiBBREMxLA0KLSAqIEFEQzMsIEFEQzUuXG4gKDcpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2VzOg0KLSAqIEFEQzEsIEFEQzMsIEFEQzQsIEFEQzUuXG4NCi0gKiAgICAgICAgICAtICBPbiB0aGlzIFNUTTMyIHNlcmllcywgYWxsIEFEQ3ggYXJlIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuDQotICogUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgbW9yZSBkZXRhaWxzLiAoOCkgT24gU1RNMzJHNCwgZmFzdCBjaGFubmVsDQotICogYWxsb3dzOiAyLjUgKHNhbXBsaW5nKSArIDEyLjUgKGNvbnZlcnNpb24pID0gMTUgQURDIGNsb2NrIGN5Y2xlcyAoZkFEQykgdG8NCi0gKiBjb252ZXJ0IGluIDEyLWJpdCByZXNvbHV0aW9uLiBPdGhlciBjaGFubmVscyBhcmUgc2xvdyBjaGFubmVscyAgYWxsb3dzOiA2LjUNCi0gKiAoc2FtcGxpbmcpICsgMTIuNSAoY29udmVyc2lvbikgPSAxOSBBREMgY2xvY2sgY3ljbGVzIChmQURDKSB0byBjb252ZXJ0IGluDQotICogMTItYml0IHJlc29sdXRpb24uXG4NCi0gKiBAcGFyYW0gIFJhbmsyX0NoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8wDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMSAgICAgICAgICAgICAgICAgKDgpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMiAgICAgICAgICAgICAgICAgKDgpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMyAgICAgICAgICAgICAgICAgKDgpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNCAgICAgICAgICAgICAgICAgKDgpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNSAgICAgICAgICAgICAgICAgKDgpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF84DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEwDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEzDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE2DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQgICAgICAgICAgICg3KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1JfQURDMSAgICgxKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1JfQURDNSAgICg1KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZCQVQgICAgICAgICAgICAgICg2KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDEgICAgICAgICAgICgxKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDIgICAgICAgICAgICgyKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDNfQURDMiAgICAgICgyKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDNfQURDMyAgICAgICgzKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDQgICAgICAgICAgICg1KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDUgICAgICAgICAgICg1KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDYgICAgICAgICAgICg0KQ0KLSAqDQotICogICAgICAgICAoMSkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMS5cbg0KLSAqICAgICAgICAgKDIpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzIuXG4NCi0gKiAgICAgICAgICgzKSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMzLlxuDQotICogICAgICAgICAoNCkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDNC5cbg0KLSAqICAgICAgICAgKDUpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzUuXG4NCi0gKiAgICAgICAgICg2KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlczogQURDMSwNCi0gKiBBREMzLCBBREM1LlxuICg3KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlczoNCi0gKiBBREMxLCBBREMzLCBBREM0LCBBREM1LlxuDQotICogICAgICAgICAgLSAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIGFsbCBBREN4IGFyZSBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzLg0KLSAqIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIG1vcmUgZGV0YWlscy4gKDgpIE9uIFNUTTMyRzQsIGZhc3QgY2hhbm5lbA0KLSAqIGFsbG93czogMi41IChzYW1wbGluZykgKyAxMi41IChjb252ZXJzaW9uKSA9IDE1IEFEQyBjbG9jayBjeWNsZXMgKGZBREMpIHRvDQotICogY29udmVydCBpbiAxMi1iaXQgcmVzb2x1dGlvbi4gT3RoZXIgY2hhbm5lbHMgYXJlIHNsb3cgY2hhbm5lbHMgIGFsbG93czogNi41DQotICogKHNhbXBsaW5nKSArIDEyLjUgKGNvbnZlcnNpb24pID0gMTkgQURDIGNsb2NrIGN5Y2xlcyAoZkFEQykgdG8gY29udmVydCBpbg0KLSAqIDEyLWJpdCByZXNvbHV0aW9uLlxuDQotICogQHBhcmFtICBSYW5rM19DaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEgICAgICAgICAgICAgICAgICg4KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzIgICAgICAgICAgICAgICAgICg4KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzMgICAgICAgICAgICAgICAgICg4KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzQgICAgICAgICAgICAgICAgICg4KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzUgICAgICAgICAgICAgICAgICg4KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF83DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzExDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE0DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE3DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WUkVGSU5UICAgICAgICAgICAoNykNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SX0FEQzEgICAoMSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SX0FEQzUgICAoNSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WQkFUICAgICAgICAgICAgICAoNikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAxICAgICAgICAgICAoMSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAyICAgICAgICAgICAoMikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAzX0FEQzIgICAgICAoMikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAzX0FEQzMgICAgICAoMykNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVA0ICAgICAgICAgICAoNSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVA1ICAgICAgICAgICAoNSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVA2ICAgICAgICAgICAoNCkNCi0gKg0KLSAqICAgICAgICAgKDEpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzEuXG4NCi0gKiAgICAgICAgICgyKSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMyLlxuDQotICogICAgICAgICAoMykgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMy5cbg0KLSAqICAgICAgICAgKDQpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzQuXG4NCi0gKiAgICAgICAgICg1KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREM1LlxuDQotICogICAgICAgICAoNikgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZXM6IEFEQzEsDQotICogQURDMywgQURDNS5cbiAoNykgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZXM6DQotICogQURDMSwgQURDMywgQURDNCwgQURDNS5cbg0KLSAqICAgICAgICAgIC0gIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBhbGwgQURDeCBhcmUgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlcy4NCi0gKiBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBtb3JlIGRldGFpbHMuICg4KSBPbiBTVE0zMkc0LCBmYXN0IGNoYW5uZWwNCi0gKiBhbGxvd3M6IDIuNSAoc2FtcGxpbmcpICsgMTIuNSAoY29udmVyc2lvbikgPSAxNSBBREMgY2xvY2sgY3ljbGVzIChmQURDKSB0bw0KLSAqIGNvbnZlcnQgaW4gMTItYml0IHJlc29sdXRpb24uIE90aGVyIGNoYW5uZWxzIGFyZSBzbG93IGNoYW5uZWxzICBhbGxvd3M6IDYuNQ0KLSAqIChzYW1wbGluZykgKyAxMi41IChjb252ZXJzaW9uKSA9IDE5IEFEQyBjbG9jayBjeWNsZXMgKGZBREMpIHRvIGNvbnZlcnQgaW4NCi0gKiAxMi1iaXQgcmVzb2x1dGlvbi5cbg0KLSAqIEBwYXJhbSAgUmFuazRfQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xICAgICAgICAgICAgICAgICAoOCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8yICAgICAgICAgICAgICAgICAoOCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8zICAgICAgICAgICAgICAgICAoOCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF80ICAgICAgICAgICAgICAgICAoOCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF81ICAgICAgICAgICAgICAgICAoOCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF82DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF85DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEyDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE1DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE4DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVlJFRklOVCAgICAgICAgICAgKDcpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUl9BREMxICAgKDEpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUl9BREM1ICAgKDUpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVkJBVCAgICAgICAgICAgICAgKDYpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QMSAgICAgICAgICAgKDEpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QMiAgICAgICAgICAgKDIpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QM19BREMyICAgICAgKDIpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QM19BREMzICAgICAgKDMpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QNCAgICAgICAgICAgKDUpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QNSAgICAgICAgICAgKDUpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QNiAgICAgICAgICAgKDQpDQotICoNCi0gKiAgICAgICAgICgxKSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMxLlxuDQotICogICAgICAgICAoMikgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMi5cbg0KLSAqICAgICAgICAgKDMpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzMuXG4NCi0gKiAgICAgICAgICg0KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREM0LlxuDQotICogICAgICAgICAoNSkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDNS5cbg0KLSAqICAgICAgICAgKDYpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2VzOiBBREMxLA0KLSAqIEFEQzMsIEFEQzUuXG4gKDcpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2VzOg0KLSAqIEFEQzEsIEFEQzMsIEFEQzQsIEFEQzUuXG4NCi0gKiAgICAgICAgICAtICBPbiB0aGlzIFNUTTMyIHNlcmllcywgYWxsIEFEQ3ggYXJlIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuDQotICogUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgbW9yZSBkZXRhaWxzLiAoOCkgT24gU1RNMzJHNCwgZmFzdCBjaGFubmVsDQotICogYWxsb3dzOiAyLjUgKHNhbXBsaW5nKSArIDEyLjUgKGNvbnZlcnNpb24pID0gMTUgQURDIGNsb2NrIGN5Y2xlcyAoZkFEQykgdG8NCi0gKiBjb252ZXJ0IGluIDEyLWJpdCByZXNvbHV0aW9uLiBPdGhlciBjaGFubmVscyBhcmUgc2xvdyBjaGFubmVscyAgYWxsb3dzOiA2LjUNCi0gKiAoc2FtcGxpbmcpICsgMTIuNSAoY29udmVyc2lvbikgPSAxOSBBREMgY2xvY2sgY3ljbGVzIChmQURDKSB0byBjb252ZXJ0IGluDQotICogMTItYml0IHJlc29sdXRpb24uXG4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfSU5KX0NvbmZpZ1F1ZXVlQ29udGV4dCgNCi0gICAgQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IFRyaWdnZXJTb3VyY2UsIHVpbnQzMl90IEV4dGVybmFsVHJpZ2dlckVkZ2UsDQotICAgIHVpbnQzMl90IFNlcXVlbmNlck5iUmFua3MsIHVpbnQzMl90IFJhbmsxX0NoYW5uZWwsIHVpbnQzMl90IFJhbmsyX0NoYW5uZWwsDQotICAgIHVpbnQzMl90IFJhbmszX0NoYW5uZWwsIHVpbnQzMl90IFJhbms0X0NoYW5uZWwpIHsNCi0gIC8qIFNldCBiaXRzIHdpdGggY29udGVudCBvZiBwYXJhbWV0ZXIgIlJhbmt4X0NoYW5uZWwiIHdpdGggYml0cyBwb3NpdGlvbiAgICAqLw0KLSAgLyogaW4gcmVnaXN0ZXIgZGVwZW5kaW5nIG9uIGxpdGVyYWwgIkxMX0FEQ19JTkpfUkFOS194Ii4gICAgICAgICAgICAgICAgICAgICovDQotICAvKiBQYXJhbWV0ZXJzICJSYW5reF9DaGFubmVsIiBhbmQgIkxMX0FEQ19JTkpfUkFOS194IiBhcmUgdXNlZCB3aXRoIG1hc2tzICAgKi8NCi0gIC8qIGJlY2F1c2UgY29udGFpbmluZyBvdGhlciBiaXRzIHJlc2VydmVkIGZvciBvdGhlciBwdXJwb3NlLiAgICAgICAgICAgICAgICAqLw0KLSAgLyogSWYgcGFyYW1ldGVyICJUcmlnZ2VyU291cmNlIiBpcyBzZXQgdG8gU1cgc3RhcnQsIHRoZW4gcGFyYW1ldGVyICAgICAgICAgICovDQotICAvKiAiRXh0ZXJuYWxUcmlnZ2VyRWRnZSIgaXMgZGlzY2FyZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gIHVpbnQzMl90IGlzX3RyaWdnZXJfbm90X3N3ID0NCi0gICAgICAodWludDMyX3QpKChUcmlnZ2VyU291cmNlICE9IExMX0FEQ19JTkpfVFJJR19TT0ZUV0FSRSkgPyAxVUwgOiAwVUwpOw0KLSAgTU9ESUZZX1JFRyhBREN4LT5KU1FSLA0KLSAgICAgICAgICAgICBBRENfSlNRUl9KRVhUU0VMIHwgQURDX0pTUVJfSkVYVEVOIHwgQURDX0pTUVJfSlNRNCB8DQotICAgICAgICAgICAgICAgICBBRENfSlNRUl9KU1EzIHwgQURDX0pTUVJfSlNRMiB8IEFEQ19KU1FSX0pTUTEgfCBBRENfSlNRUl9KTCwNCi0gICAgICAgICAgICAgKFRyaWdnZXJTb3VyY2UgJiBBRENfSlNRUl9KRVhUU0VMKSB8DQotICAgICAgICAgICAgICAgICAoRXh0ZXJuYWxUcmlnZ2VyRWRnZSAqIChpc190cmlnZ2VyX25vdF9zdykpIHwNCi0gICAgICAgICAgICAgICAgICgoKFJhbms0X0NoYW5uZWwgJiBBRENfQ0hBTk5FTF9JRF9OVU1CRVJfTUFTSykgPj4NCi0gICAgICAgICAgICAgICAgICAgQURDX0NIQU5ORUxfSURfTlVNQkVSX0JJVE9GRlNFVF9QT1MpDQotICAgICAgICAgICAgICAgICAgPDwgKExMX0FEQ19JTkpfUkFOS180ICYgQURDX0lOSl9SQU5LX0lEX0pTUVJfTUFTSykpIHwNCi0gICAgICAgICAgICAgICAgICgoKFJhbmszX0NoYW5uZWwgJiBBRENfQ0hBTk5FTF9JRF9OVU1CRVJfTUFTSykgPj4NCi0gICAgICAgICAgICAgICAgICAgQURDX0NIQU5ORUxfSURfTlVNQkVSX0JJVE9GRlNFVF9QT1MpDQotICAgICAgICAgICAgICAgICAgPDwgKExMX0FEQ19JTkpfUkFOS18zICYgQURDX0lOSl9SQU5LX0lEX0pTUVJfTUFTSykpIHwNCi0gICAgICAgICAgICAgICAgICgoKFJhbmsyX0NoYW5uZWwgJiBBRENfQ0hBTk5FTF9JRF9OVU1CRVJfTUFTSykgPj4NCi0gICAgICAgICAgICAgICAgICAgQURDX0NIQU5ORUxfSURfTlVNQkVSX0JJVE9GRlNFVF9QT1MpDQotICAgICAgICAgICAgICAgICAgPDwgKExMX0FEQ19JTkpfUkFOS18yICYgQURDX0lOSl9SQU5LX0lEX0pTUVJfTUFTSykpIHwNCi0gICAgICAgICAgICAgICAgICgoKFJhbmsxX0NoYW5uZWwgJiBBRENfQ0hBTk5FTF9JRF9OVU1CRVJfTUFTSykgPj4NCi0gICAgICAgICAgICAgICAgICAgQURDX0NIQU5ORUxfSURfTlVNQkVSX0JJVE9GRlNFVF9QT1MpDQotICAgICAgICAgICAgICAgICAgPDwgKExMX0FEQ19JTkpfUkFOS18xICYgQURDX0lOSl9SQU5LX0lEX0pTUVJfTUFTSykpIHwNCi0gICAgICAgICAgICAgICAgIFNlcXVlbmNlck5iUmFua3MpOw0KLX0NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQURDX0xMX0VGX0NvbmZpZ3VyYXRpb25fQ2hhbm5lbHMgQ29uZmlndXJhdGlvbiBvZiBBREMgaGllcmFyY2hpY2FsDQotICogc2NvcGU6IGNoYW5uZWxzDQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCBzYW1wbGluZyB0aW1lIG9mIHRoZSBzZWxlY3RlZCBBREMgY2hhbm5lbA0KLSAqICAgICAgICAgVW5pdDogQURDIGNsb2NrIGN5Y2xlcy4NCi0gKiBAbm90ZSAgIE9uIHRoaXMgZGV2aWNlLCBzYW1wbGluZyB0aW1lIGlzIG9uIGNoYW5uZWwgc2NvcGU6IGluZGVwZW5kZW50bHkNCi0gKiAgICAgICAgIG9mIGNoYW5uZWwgbWFwcGVkIG9uIEFEQyBncm91cCByZWd1bGFyIG9yIGluamVjdGVkLg0KLSAqIEBub3RlICAgSW4gY2FzZSBvZiBpbnRlcm5hbCBjaGFubmVsIChWcmVmSW50LCBUZW1wU2Vuc29yLCAuLi4pIHRvIGJlDQotICogICAgICAgICBjb252ZXJ0ZWQ6DQotICogICAgICAgICBzYW1wbGluZyB0aW1lIGNvbnN0cmFpbnRzIG11c3QgYmUgcmVzcGVjdGVkIChzYW1wbGluZyB0aW1lIGNhbiBiZQ0KLSAqICAgICAgICAgYWRqdXN0ZWQgaW4gZnVuY3Rpb24gb2YgQURDIGNsb2NrIGZyZXF1ZW5jeSBhbmQgc2FtcGxpbmcgdGltZQ0KLSAqICAgICAgICAgc2V0dGluZykuDQotICogICAgICAgICBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciB0aW1pbmdzIHZhbHVlcyAocGFyYW1ldGVycyBUU192cmVmaW50LA0KLSAqICAgICAgICAgVFNfdGVtcCwgLi4uKS4NCi0gKiBAbm90ZSAgIENvbnZlcnNpb24gdGltZSBpcyB0aGUgYWRkaXRpb24gb2Ygc2FtcGxpbmcgdGltZSBhbmQgcHJvY2Vzc2luZyB0aW1lLg0KLSAqICAgICAgICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIEFEQyBwcm9jZXNzaW5nIHRpbWUgaXM6DQotICogICAgICAgICAtIDEyLjUgQURDIGNsb2NrIGN5Y2xlcyBhdCBBREMgcmVzb2x1dGlvbiAxMiBiaXRzDQotICogICAgICAgICAtIDEwLjUgQURDIGNsb2NrIGN5Y2xlcyBhdCBBREMgcmVzb2x1dGlvbiAxMCBiaXRzDQotICogICAgICAgICAtIDguNSBBREMgY2xvY2sgY3ljbGVzIGF0IEFEQyByZXNvbHV0aW9uIDggYml0cw0KLSAqICAgICAgICAgLSA2LjUgQURDIGNsb2NrIGN5Y2xlcyBhdCBBREMgcmVzb2x1dGlvbiA2IGJpdHMNCi0gKiBAbm90ZSAgIEluIGNhc2Ugb2YgQURDIGNvbnZlcnNpb24gb2YgaW50ZXJuYWwgY2hhbm5lbCAoVnJlZkludCwNCi0gKiAgICAgICAgIHRlbXBlcmF0dXJlIHNlbnNvciwgLi4uKSwgYSBzYW1wbGluZyB0aW1lIG1pbmltdW0gdmFsdWUNCi0gKiAgICAgICAgIGlzIHJlcXVpcmVkLg0KLSAqICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldC4NCi0gKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bw0KLSAqICAgICAgICAgQURDIHN0YXRlOg0KLSAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcNCi0gKiAgICAgICAgIG9uIGVpdGhlciBncm91cHMgcmVndWxhciBvciBpbmplY3RlZC4NCi0gKiBAcm10b2xsIFNNUFIxICAgIFNNUDAgICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4NCi0gKiAgICAgICAgIFNNUFIxICAgIFNNUDEgICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4NCi0gKiAgICAgICAgIFNNUFIxICAgIFNNUDIgICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4NCi0gKiAgICAgICAgIFNNUFIxICAgIFNNUDMgICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4NCi0gKiAgICAgICAgIFNNUFIxICAgIFNNUDQgICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4NCi0gKiAgICAgICAgIFNNUFIxICAgIFNNUDUgICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4NCi0gKiAgICAgICAgIFNNUFIxICAgIFNNUDYgICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4NCi0gKiAgICAgICAgIFNNUFIxICAgIFNNUDcgICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4NCi0gKiAgICAgICAgIFNNUFIxICAgIFNNUDggICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4NCi0gKiAgICAgICAgIFNNUFIxICAgIFNNUDkgICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4NCi0gKiAgICAgICAgIFNNUFIyICAgIFNNUDEwICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4NCi0gKiAgICAgICAgIFNNUFIyICAgIFNNUDExICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4NCi0gKiAgICAgICAgIFNNUFIyICAgIFNNUDEyICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4NCi0gKiAgICAgICAgIFNNUFIyICAgIFNNUDEzICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4NCi0gKiAgICAgICAgIFNNUFIyICAgIFNNUDE0ICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4NCi0gKiAgICAgICAgIFNNUFIyICAgIFNNUDE1ICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4NCi0gKiAgICAgICAgIFNNUFIyICAgIFNNUDE2ICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4NCi0gKiAgICAgICAgIFNNUFIyICAgIFNNUDE3ICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4NCi0gKiAgICAgICAgIFNNUFIyICAgIFNNUDE4ICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lDQotICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQ0KLSAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xICAgICAgICAgICAgICAgICAoOCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8yICAgICAgICAgICAgICAgICAoOCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8zICAgICAgICAgICAgICAgICAoOCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF80ICAgICAgICAgICAgICAgICAoOCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF81ICAgICAgICAgICAgICAgICAoOCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF82DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF85DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEyDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE1DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE4DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVlJFRklOVCAgICAgICAgICAgKDcpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUl9BREMxICAgKDEpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUl9BREM1ICAgKDUpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVkJBVCAgICAgICAgICAgICAgKDYpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QMSAgICAgICAgICAgKDEpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QMiAgICAgICAgICAgKDIpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QM19BREMyICAgICAgKDIpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QM19BREMzICAgICAgKDMpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QNCAgICAgICAgICAgKDUpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QNSAgICAgICAgICAgKDUpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QNiAgICAgICAgICAgKDQpDQotICoNCi0gKiAgICAgICAgICgxKSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMxLlxuDQotICogICAgICAgICAoMikgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMi5cbg0KLSAqICAgICAgICAgKDMpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzMuXG4NCi0gKiAgICAgICAgICg0KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREM0LlxuDQotICogICAgICAgICAoNSkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDNS5cbg0KLSAqICAgICAgICAgKDYpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2VzOiBBREMxLA0KLSAqIEFEQzMsIEFEQzUuXG4gKDcpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2VzOg0KLSAqIEFEQzEsIEFEQzMsIEFEQzQsIEFEQzUuXG4NCi0gKiAgICAgICAgICAtICBPbiB0aGlzIFNUTTMyIHNlcmllcywgYWxsIEFEQ3ggYXJlIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuDQotICogUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgbW9yZSBkZXRhaWxzLiAoOCkgT24gU1RNMzJHNCwgZmFzdCBjaGFubmVsDQotICogYWxsb3dzOiAyLjUgKHNhbXBsaW5nKSArIDEyLjUgKGNvbnZlcnNpb24pID0gMTUgQURDIGNsb2NrIGN5Y2xlcyAoZkFEQykgdG8NCi0gKiBjb252ZXJ0IGluIDEyLWJpdCByZXNvbHV0aW9uLiBPdGhlciBjaGFubmVscyBhcmUgc2xvdyBjaGFubmVscyAgYWxsb3dzOiA2LjUNCi0gKiAoc2FtcGxpbmcpICsgMTIuNSAoY29udmVyc2lvbikgPSAxOSBBREMgY2xvY2sgY3ljbGVzIChmQURDKSB0byBjb252ZXJ0IGluDQotICogMTItYml0IHJlc29sdXRpb24uXG4NCi0gKiBAcGFyYW0gIFNhbXBsaW5nVGltZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19TQU1QTElOR1RJTUVfMkNZQ0xFU181ICAgKDEpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1NBTVBMSU5HVElNRV82Q1lDTEVTXzUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfU0FNUExJTkdUSU1FXzEyQ1lDTEVTXzUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfU0FNUExJTkdUSU1FXzI0Q1lDTEVTXzUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfU0FNUExJTkdUSU1FXzQ3Q1lDTEVTXzUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfU0FNUExJTkdUSU1FXzkyQ1lDTEVTXzUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfU0FNUExJTkdUSU1FXzI0N0NZQ0xFU181DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1NBTVBMSU5HVElNRV82NDBDWUNMRVNfNQ0KLSAqDQotICogICAgICAgICAoMSkgT24gc29tZSBkZXZpY2VzLCBBREMgc2FtcGxpbmcgdGltZSAyLjUgQURDIGNsb2NrIGN5Y2xlcw0KLSAqICAgICAgICAgICAgIGNhbiBiZSByZXBsYWNlZCBieSAzLjUgQURDIGNsb2NrIGN5Y2xlcy4NCi0gKiAgICAgICAgICAgICBSZWZlciB0byBmdW5jdGlvbiBAcmVmIExMX0FEQ19TZXRTYW1wbGluZ1RpbWVDb21tb25Db25maWcoKS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfU2V0Q2hhbm5lbFNhbXBsaW5nVGltZShBRENfVHlwZURlZiAqQURDeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFNhbXBsaW5nVGltZSkgew0KLSAgLyogU2V0IGJpdHMgd2l0aCBjb250ZW50IG9mIHBhcmFtZXRlciAiU2FtcGxpbmdUaW1lIiB3aXRoIGJpdHMgcG9zaXRpb24gICAgICovDQotICAvKiBpbiByZWdpc3RlciBhbmQgcmVnaXN0ZXIgcG9zaXRpb24gZGVwZW5kaW5nIG9uIHBhcmFtZXRlciAiQ2hhbm5lbCIuICAgICAgKi8NCi0gIC8qIFBhcmFtZXRlciAiQ2hhbm5lbCIgaXMgdXNlZCB3aXRoIG1hc2tzIGJlY2F1c2UgY29udGFpbmluZyAgICAgICAgICAgICAgICAqLw0KLSAgLyogb3RoZXIgYml0cyByZXNlcnZlZCBmb3Igb3RoZXIgcHVycG9zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICBfX0lPIHVpbnQzMl90ICpwcmVnID0gX19BRENfUFRSX1JFR19PRkZTRVQoDQotICAgICAgQURDeC0+U01QUjEsICgoQ2hhbm5lbCAmIEFEQ19DSEFOTkVMX1NNUFJYX1JFR09GRlNFVF9NQVNLKSA+Pg0KLSAgICAgICAgICAgICAgICAgICAgQURDX1NNUFJYX1JFR09GRlNFVF9QT1MpKTsNCi0NCi0gIE1PRElGWV9SRUcoKnByZWcsDQotICAgICAgICAgICAgIEFEQ19TTVBSMV9TTVAwIDw8ICgoQ2hhbm5lbCAmIEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX01BU0spID4+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0hBTk5FTF9TTVB4X0JJVE9GRlNFVF9QT1MpLA0KLSAgICAgICAgICAgICBTYW1wbGluZ1RpbWUgPDwgKChDaGFubmVsICYgQURDX0NIQU5ORUxfU01QeF9CSVRPRkZTRVRfTUFTSykgPj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0hBTk5FTF9TTVB4X0JJVE9GRlNFVF9QT1MpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgc2FtcGxpbmcgdGltZSBvZiB0aGUgc2VsZWN0ZWQgQURDIGNoYW5uZWwNCi0gKiAgICAgICAgIFVuaXQ6IEFEQyBjbG9jayBjeWNsZXMuDQotICogQG5vdGUgICBPbiB0aGlzIGRldmljZSwgc2FtcGxpbmcgdGltZSBpcyBvbiBjaGFubmVsIHNjb3BlOiBpbmRlcGVuZGVudGx5DQotICogICAgICAgICBvZiBjaGFubmVsIG1hcHBlZCBvbiBBREMgZ3JvdXAgcmVndWxhciBvciBpbmplY3RlZC4NCi0gKiBAbm90ZSAgIENvbnZlcnNpb24gdGltZSBpcyB0aGUgYWRkaXRpb24gb2Ygc2FtcGxpbmcgdGltZSBhbmQgcHJvY2Vzc2luZyB0aW1lLg0KLSAqICAgICAgICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIEFEQyBwcm9jZXNzaW5nIHRpbWUgaXM6DQotICogICAgICAgICAtIDEyLjUgQURDIGNsb2NrIGN5Y2xlcyBhdCBBREMgcmVzb2x1dGlvbiAxMiBiaXRzDQotICogICAgICAgICAtIDEwLjUgQURDIGNsb2NrIGN5Y2xlcyBhdCBBREMgcmVzb2x1dGlvbiAxMCBiaXRzDQotICogICAgICAgICAtIDguNSBBREMgY2xvY2sgY3ljbGVzIGF0IEFEQyByZXNvbHV0aW9uIDggYml0cw0KLSAqICAgICAgICAgLSA2LjUgQURDIGNsb2NrIGN5Y2xlcyBhdCBBREMgcmVzb2x1dGlvbiA2IGJpdHMNCi0gKiBAcm10b2xsIFNNUFIxICAgIFNNUDAgICAgICAgICAgIExMX0FEQ19HZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4NCi0gKiAgICAgICAgIFNNUFIxICAgIFNNUDEgICAgICAgICAgIExMX0FEQ19HZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4NCi0gKiAgICAgICAgIFNNUFIxICAgIFNNUDIgICAgICAgICAgIExMX0FEQ19HZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4NCi0gKiAgICAgICAgIFNNUFIxICAgIFNNUDMgICAgICAgICAgIExMX0FEQ19HZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4NCi0gKiAgICAgICAgIFNNUFIxICAgIFNNUDQgICAgICAgICAgIExMX0FEQ19HZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4NCi0gKiAgICAgICAgIFNNUFIxICAgIFNNUDUgICAgICAgICAgIExMX0FEQ19HZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4NCi0gKiAgICAgICAgIFNNUFIxICAgIFNNUDYgICAgICAgICAgIExMX0FEQ19HZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4NCi0gKiAgICAgICAgIFNNUFIxICAgIFNNUDcgICAgICAgICAgIExMX0FEQ19HZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4NCi0gKiAgICAgICAgIFNNUFIxICAgIFNNUDggICAgICAgICAgIExMX0FEQ19HZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4NCi0gKiAgICAgICAgIFNNUFIxICAgIFNNUDkgICAgICAgICAgIExMX0FEQ19HZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4NCi0gKiAgICAgICAgIFNNUFIyICAgIFNNUDEwICAgICAgICAgIExMX0FEQ19HZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4NCi0gKiAgICAgICAgIFNNUFIyICAgIFNNUDExICAgICAgICAgIExMX0FEQ19HZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4NCi0gKiAgICAgICAgIFNNUFIyICAgIFNNUDEyICAgICAgICAgIExMX0FEQ19HZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4NCi0gKiAgICAgICAgIFNNUFIyICAgIFNNUDEzICAgICAgICAgIExMX0FEQ19HZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4NCi0gKiAgICAgICAgIFNNUFIyICAgIFNNUDE0ICAgICAgICAgIExMX0FEQ19HZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4NCi0gKiAgICAgICAgIFNNUFIyICAgIFNNUDE1ICAgICAgICAgIExMX0FEQ19HZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4NCi0gKiAgICAgICAgIFNNUFIyICAgIFNNUDE2ICAgICAgICAgIExMX0FEQ19HZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4NCi0gKiAgICAgICAgIFNNUFIyICAgIFNNUDE3ICAgICAgICAgIExMX0FEQ19HZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4NCi0gKiAgICAgICAgIFNNUFIyICAgIFNNUDE4ICAgICAgICAgIExMX0FEQ19HZXRDaGFubmVsU2FtcGxpbmdUaW1lDQotICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQ0KLSAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xICAgICAgICAgICAgICAgICAoOCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8yICAgICAgICAgICAgICAgICAoOCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8zICAgICAgICAgICAgICAgICAoOCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF80ICAgICAgICAgICAgICAgICAoOCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF81ICAgICAgICAgICAgICAgICAoOCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF82DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF85DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEyDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE1DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE4DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVlJFRklOVCAgICAgICAgICAgKDcpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUl9BREMxICAgKDEpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUl9BREM1ICAgKDUpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVkJBVCAgICAgICAgICAgICAgKDYpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QMSAgICAgICAgICAgKDEpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QMiAgICAgICAgICAgKDIpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QM19BREMyICAgICAgKDIpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QM19BREMzICAgICAgKDMpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QNCAgICAgICAgICAgKDUpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QNSAgICAgICAgICAgKDUpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QNiAgICAgICAgICAgKDQpDQotICoNCi0gKiAgICAgICAgICgxKSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMxLlxuDQotICogICAgICAgICAoMikgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMi5cbg0KLSAqICAgICAgICAgKDMpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzMuXG4NCi0gKiAgICAgICAgICg0KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREM0LlxuDQotICogICAgICAgICAoNSkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDNS5cbg0KLSAqICAgICAgICAgKDYpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2VzOiBBREMxLA0KLSAqIEFEQzMsIEFEQzUuXG4gKDcpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2VzOg0KLSAqIEFEQzEsIEFEQzMsIEFEQzQsIEFEQzUuXG4NCi0gKiAgICAgICAgICAtICBPbiB0aGlzIFNUTTMyIHNlcmllcywgYWxsIEFEQ3ggYXJlIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuDQotICogUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgbW9yZSBkZXRhaWxzLiAoOCkgT24gU1RNMzJHNCwgZmFzdCBjaGFubmVsDQotICogYWxsb3dzOiAyLjUgKHNhbXBsaW5nKSArIDEyLjUgKGNvbnZlcnNpb24pID0gMTUgQURDIGNsb2NrIGN5Y2xlcyAoZkFEQykgdG8NCi0gKiBjb252ZXJ0IGluIDEyLWJpdCByZXNvbHV0aW9uLiBPdGhlciBjaGFubmVscyBhcmUgc2xvdyBjaGFubmVscyAgYWxsb3dzOiA2LjUNCi0gKiAoc2FtcGxpbmcpICsgMTIuNSAoY29udmVyc2lvbikgPSAxOSBBREMgY2xvY2sgY3ljbGVzIChmQURDKSB0byBjb252ZXJ0IGluDQotICogMTItYml0IHJlc29sdXRpb24uXG4NCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1NBTVBMSU5HVElNRV8yQ1lDTEVTXzUgICAoMSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfU0FNUExJTkdUSU1FXzZDWUNMRVNfNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19TQU1QTElOR1RJTUVfMTJDWUNMRVNfNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19TQU1QTElOR1RJTUVfMjRDWUNMRVNfNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19TQU1QTElOR1RJTUVfNDdDWUNMRVNfNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19TQU1QTElOR1RJTUVfOTJDWUNMRVNfNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19TQU1QTElOR1RJTUVfMjQ3Q1lDTEVTXzUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfU0FNUExJTkdUSU1FXzY0MENZQ0xFU181DQotICoNCi0gKiAgICAgICAgICgxKSBPbiBzb21lIGRldmljZXMsIEFEQyBzYW1wbGluZyB0aW1lIDIuNSBBREMgY2xvY2sgY3ljbGVzDQotICogICAgICAgICAgICAgY2FuIGJlIHJlcGxhY2VkIGJ5IDMuNSBBREMgY2xvY2sgY3ljbGVzLg0KLSAqICAgICAgICAgICAgIFJlZmVyIHRvIGZ1bmN0aW9uIEByZWYgTExfQURDX1NldFNhbXBsaW5nVGltZUNvbW1vbkNvbmZpZygpLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfR2V0Q2hhbm5lbFNhbXBsaW5nVGltZShBRENfVHlwZURlZiAqQURDeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCkgew0KLSAgY29uc3QgX19JTyB1aW50MzJfdCAqcHJlZyA9IF9fQURDX1BUUl9SRUdfT0ZGU0VUKA0KLSAgICAgIEFEQ3gtPlNNUFIxLCAoKENoYW5uZWwgJiBBRENfQ0hBTk5FTF9TTVBSWF9SRUdPRkZTRVRfTUFTSykgPj4NCi0gICAgICAgICAgICAgICAgICAgIEFEQ19TTVBSWF9SRUdPRkZTRVRfUE9TKSk7DQotDQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVCgqcHJlZywgQURDX1NNUFIxX1NNUDANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKChDaGFubmVsICYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0hBTk5FTF9TTVB4X0JJVE9GRlNFVF9NQVNLKSA+Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NIQU5ORUxfU01QeF9CSVRPRkZTRVRfUE9TKSkgPj4NCi0gICAgICAgICAgICAgICAgICAgICgoQ2hhbm5lbCAmIEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX01BU0spID4+DQotICAgICAgICAgICAgICAgICAgICAgQURDX0NIQU5ORUxfU01QeF9CSVRPRkZTRVRfUE9TKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IG1vZGUgc2luZ2xlLWVuZGVkIG9yIGRpZmZlcmVudGlhbCBpbnB1dCBvZiB0aGUgc2VsZWN0ZWQNCi0gKiAgICAgICAgIEFEQyBjaGFubmVsLg0KLSAqIEBub3RlICAgQ2hhbm5lbCBlbmRpbmcgaXMgb24gY2hhbm5lbCBzY29wZTogaW5kZXBlbmRlbnRseSBvZiBjaGFubmVsIG1hcHBlZA0KLSAqICAgICAgICAgb24gQURDIGdyb3VwIHJlZ3VsYXIgb3IgaW5qZWN0ZWQuDQotICogICAgICAgICBJbiBkaWZmZXJlbnRpYWwgbW9kZTogRGlmZmVyZW50aWFsIG1lYXN1cmVtZW50IGlzIGNhcnJpZWQgb3V0DQotICogICAgICAgICBiZXR3ZWVuIHRoZSBzZWxlY3RlZCBjaGFubmVsICdpJyAocG9zaXRpdmUgaW5wdXQpIGFuZA0KLSAqICAgICAgICAgY2hhbm5lbCAnaSsxJyAobmVnYXRpdmUgaW5wdXQpLiBPbmx5IGNoYW5uZWwgJ2knIGhhcyB0byBiZQ0KLSAqICAgICAgICAgY29uZmlndXJlZCwgY2hhbm5lbCAnaSsxJyBpcyBjb25maWd1cmVkIGF1dG9tYXRpY2FsbHkuDQotICogQG5vdGUgICBSZWZlciB0byBSZWZlcmVuY2UgTWFudWFsIHRvIGVuc3VyZSB0aGUgc2VsZWN0ZWQgY2hhbm5lbCBpcw0KLSAqICAgICAgICAgYXZhaWxhYmxlIGluIGRpZmZlcmVudGlhbCBtb2RlLg0KLSAqICAgICAgICAgRm9yIGV4YW1wbGUsIGludGVybmFsIGNoYW5uZWxzIChWcmVmSW50LCBUZW1wU2Vuc29yLCAuLi4pIGFyZQ0KLSAqICAgICAgICAgbm90IGF2YWlsYWJsZSBpbiBkaWZmZXJlbnRpYWwgbW9kZS4NCi0gKiBAbm90ZSAgIFdoZW4gY29uZmlndXJpbmcgYSBjaGFubmVsICdpJyBpbiBkaWZmZXJlbnRpYWwgbW9kZSwNCi0gKiAgICAgICAgIHRoZSBjaGFubmVsICdpKzEnIGlzIG5vdCB1c2FibGUgc2VwYXJhdGVseS4NCi0gKiBAbm90ZSAgIE9uIFNUTTMyRzQsIHNvbWUgY2hhbm5lbHMgYXJlIGludGVybmFsbHkgZml4ZWQgdG8gc2luZ2xlLWVuZGVkIGlucHV0cw0KLSAqICAgICAgICAgY29uZmlndXJhdGlvbjoNCi0gKiAgICAgICAgIC0gQURDMTogQ2hhbm5lbHMgMTIsIDE1LCAxNiwgMTcgYW5kIDE4DQotICogICAgICAgICAtIEFEQzI6IENoYW5uZWxzIDE1LCAxNyBhbmQgMTgNCi0gKiAgICAgICAgIC0gQURDMzogQ2hhbm5lbHMgMTIsIDE2LCAxNyBhbmQgMTggICAgICAgICAgICAoMSkNCi0gKiAgICAgICAgIC0gQURDNDogQ2hhbm5lbHMgMTYsIDE3IGFuZCAxOCAgICAgICAgICAgICAgICAoMSkNCi0gKiAgICAgICAgIC0gQURDNTogQ2hhbm5lbHMgMiwgMywgNCwgMTYsIDE3IGFuZCAxOCAgICAgICAoMSkNCi0gKiAgICAgICAgICgxKSBBREMzLzQvNSBhcmUgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlcywgcmVmZXIgdG8gZGV2aWNlDQotICogZGF0YXNoZWV0IGZvciBtb3JlIGRldGFpbHMuDQotICogQG5vdGUgICBGb3IgQURDIGNoYW5uZWxzIGNvbmZpZ3VyZWQgaW4gZGlmZmVyZW50aWFsIG1vZGUsIGJvdGggaW5wdXRzDQotICogICAgICAgICBzaG91bGQgYmUgYmlhc2VkIGF0IChWcmVmKykvMiArLy0yMDBtVi4NCi0gKiAgICAgICAgIChWcmVmKyBpcyB0aGUgYW5hbG9nIHZvbHRhZ2UgcmVmZXJlbmNlKQ0KLSAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvDQotICogICAgICAgICBBREMgc3RhdGU6DQotICogICAgICAgICBBREMgbXVzdCBiZSBBREMgZGlzYWJsZWQuDQotICogQG5vdGUgICBPbmUgb3Igc2V2ZXJhbCB2YWx1ZXMgY2FuIGJlIHNlbGVjdGVkLg0KLSAqICAgICAgICAgRXhhbXBsZTogKExMX0FEQ19DSEFOTkVMXzQgfCBMTF9BRENfQ0hBTk5FTF8xMiB8IC4uLikNCi0gKiBAcm10b2xsIERJRlNFTCAgIERJRlNFTCAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2luZ2xlRGlmZg0KLSAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UNCi0gKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF80DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF83DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzExDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE0DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTUNCi0gKiBAcGFyYW0gIFNpbmdsZURpZmYgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZw0KLSAqIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfU0lOR0xFX0VOREVEDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0RJRkZFUkVOVElBTF9FTkRFRA0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19TZXRDaGFubmVsU2luZ2xlRGlmZihBRENfVHlwZURlZiAqQURDeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgU2luZ2xlRGlmZikgew0KLSAgLyogQml0cyBmb3Igc2luZ2xlIG9yIGRpZmZlcmVudGlhbCBtb2RlIHNlbGVjdGlvbiBmb3IgZWFjaCBjaGFubmVsIGFyZSBzZXQgICovDQotICAvKiB0byAxIG9ubHkgd2hlbiB0aGUgZGlmZmVyZW50aWFsIG1vZGUgaXMgc2VsZWN0ZWQsIGFuZCB0byAwIHdoZW4gdGhlICAgICAgKi8NCi0gIC8qIHNpbmdsZSBtb2RlIGlzIHNlbGVjdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLQ0KLSAgaWYgKFNpbmdsZURpZmYgPT0gTExfQURDX0RJRkZFUkVOVElBTF9FTkRFRCkgew0KLSAgICBTRVRfQklUKEFEQ3gtPkRJRlNFTCwgQ2hhbm5lbCAmIEFEQ19TSU5HTEVESUZGX0NIQU5ORUxfTUFTSyk7DQotICB9IGVsc2Ugew0KLSAgICBDTEVBUl9CSVQoQURDeC0+RElGU0VMLCBDaGFubmVsICYgQURDX1NJTkdMRURJRkZfQ0hBTk5FTF9NQVNLKTsNCi0gIH0NCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgbW9kZSBzaW5nbGUtZW5kZWQgb3IgZGlmZmVyZW50aWFsIGlucHV0IG9mIHRoZSBzZWxlY3RlZA0KLSAqICAgICAgICAgQURDIGNoYW5uZWwuDQotICogQG5vdGUgICBXaGVuIGNvbmZpZ3VyaW5nIGEgY2hhbm5lbCAnaScgaW4gZGlmZmVyZW50aWFsIG1vZGUsDQotICogICAgICAgICB0aGUgY2hhbm5lbCAnaSsxJyBpcyBub3QgdXNhYmxlIHNlcGFyYXRlbHkuDQotICogICAgICAgICBUaGVyZWZvcmUsIHRvIGVuc3VyZSBhIGNoYW5uZWwgaXMgY29uZmlndXJlZCBpbiBzaW5nbGUtZW5kZWQgbW9kZSwNCi0gKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIG9mIGNoYW5uZWwgaXRzZWxmIGFuZCB0aGUgY2hhbm5lbCAnaS0xJyBtdXN0IGJlDQotICogICAgICAgICByZWFkIGJhY2sgKHRvIGVuc3VyZSB0aGF0IHRoZSBzZWxlY3RlZCBjaGFubmVsIGNoYW5uZWwgaGFzIG5vdCBiZWVuDQotICogICAgICAgICBjb25maWd1cmVkIGluIGRpZmZlcmVudGlhbCBtb2RlIGJ5IHRoZSBwcmV2aW91cyBjaGFubmVsKS4NCi0gKiBAbm90ZSAgIFJlZmVyIHRvIFJlZmVyZW5jZSBNYW51YWwgdG8gZW5zdXJlIHRoZSBzZWxlY3RlZCBjaGFubmVsIGlzDQotICogICAgICAgICBhdmFpbGFibGUgaW4gZGlmZmVyZW50aWFsIG1vZGUuDQotICogICAgICAgICBGb3IgZXhhbXBsZSwgaW50ZXJuYWwgY2hhbm5lbHMgKFZyZWZJbnQsIFRlbXBTZW5zb3IsIC4uLikgYXJlDQotICogICAgICAgICBub3QgYXZhaWxhYmxlIGluIGRpZmZlcmVudGlhbCBtb2RlLg0KLSAqIEBub3RlICAgV2hlbiBjb25maWd1cmluZyBhIGNoYW5uZWwgJ2knIGluIGRpZmZlcmVudGlhbCBtb2RlLA0KLSAqICAgICAgICAgdGhlIGNoYW5uZWwgJ2krMScgaXMgbm90IHVzYWJsZSBzZXBhcmF0ZWx5Lg0KLSAqIEBub3RlICAgT24gU1RNMzJHNCwgc29tZSBjaGFubmVscyBhcmUgaW50ZXJuYWxseSBmaXhlZCB0byBzaW5nbGUtZW5kZWQgaW5wdXRzDQotICogICAgICAgICBjb25maWd1cmF0aW9uOg0KLSAqICAgICAgICAgLSBBREMxOiBDaGFubmVscyAxMiwgMTUsIDE2LCAxNyBhbmQgMTgNCi0gKiAgICAgICAgIC0gQURDMjogQ2hhbm5lbHMgMTUsIDE3IGFuZCAxOA0KLSAqICAgICAgICAgLSBBREMzOiBDaGFubmVscyAxMiwgMTYsIDE3IGFuZCAxOCAgICAgICAgICAgICgxKQ0KLSAqICAgICAgICAgLSBBREM0OiBDaGFubmVscyAxNiwgMTcgYW5kIDE4ICAgICAgICAgICAgICAgICgxKQ0KLSAqICAgICAgICAgLSBBREM1OiBDaGFubmVscyAyLCAzLCA0LCAxNiwgMTcgYW5kIDE4ICAgICAgICgxKQ0KLSAqICAgICAgICAgKDEpIEFEQzMvNC81IGFyZSBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzLCByZWZlciB0byBkZXZpY2UNCi0gKiBkYXRhc2hlZXQgZm9yIG1vcmUgZGV0YWlscy4NCi0gKiBAbm90ZSAgIE9uZSBvciBzZXZlcmFsIHZhbHVlcyBjYW4gYmUgc2VsZWN0ZWQuIEluIHRoaXMgY2FzZSwgdGhlIHZhbHVlDQotICogICAgICAgICByZXR1cm5lZCBpcyBudWxsIGlmIGFsbCBjaGFubmVscyBhcmUgaW4gc2luZ2xlIGVuZGVkLW1vZGUuDQotICogICAgICAgICBFeGFtcGxlOiAoTExfQURDX0NIQU5ORUxfNCB8IExMX0FEQ19DSEFOTkVMXzEyIHwgLi4uKQ0KLSAqIEBybXRvbGwgRElGU0VMICAgRElGU0VMICAgICAgICAgTExfQURDX0dldENoYW5uZWxTaW5nbGVEaWZmDQotICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQ0KLSAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF80DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF83DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzExDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE0DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTUNCi0gKiBAcmV0dmFsIDA6IGNoYW5uZWwgaW4gc2luZ2xlLWVuZGVkIG1vZGUsIGVsc2U6IGNoYW5uZWwgaW4gZGlmZmVyZW50aWFsIG1vZGUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0dldENoYW5uZWxTaW5nbGVEaWZmKEFEQ19UeXBlRGVmICpBREN4LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeC0+RElGU0VMLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENoYW5uZWwgJiBBRENfU0lOR0xFRElGRl9DSEFOTkVMX01BU0spKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBBRENfTExfRUZfQ29uZmlndXJhdGlvbl9BRENfQW5hbG9nV2F0Y2hkb2cgQ29uZmlndXJhdGlvbiBvZiBBREMNCi0gKiB0cmFuc3ZlcnNhbCBzY29wZTogYW5hbG9nIHdhdGNoZG9nDQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3JlZCBjaGFubmVsczoNCi0gKiAgICAgICAgIGEgc2luZ2xlIGNoYW5uZWwsIG11bHRpcGxlIGNoYW5uZWxzIG9yIGFsbCBjaGFubmVscywNCi0gKiAgICAgICAgIG9uIEFEQyBncm91cHMgcmVndWxhciBhbmQtb3IgaW5qZWN0ZWQuDQotICogQG5vdGUgICBPbmNlIG1vbml0b3JlZCBjaGFubmVscyBhcmUgc2VsZWN0ZWQsIGFuYWxvZyB3YXRjaGRvZw0KLSAqICAgICAgICAgaXMgZW5hYmxlZC4NCi0gKiBAbm90ZSAgIEluIGNhc2Ugb2YgbmVlZCB0byBkZWZpbmUgYSBzaW5nbGUgY2hhbm5lbCB0byBtb25pdG9yDQotICogICAgICAgICB3aXRoIGFuYWxvZyB3YXRjaGRvZyBmcm9tIHNlcXVlbmNlciBjaGFubmVsIGRlZmluaXRpb24sDQotICogICAgICAgICB1c2UgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQU5BTE9HV0RfQ0hBTk5FTF9HUk9VUCgpLg0KLSAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIHRoZXJlIGFyZSAyIGtpbmRzIG9mIGFuYWxvZyB3YXRjaGRvZw0KLSAqICAgICAgICAgaW5zdGFuY2U6DQotICogICAgICAgICAtIEFXRCBzdGFuZGFyZCAoaW5zdGFuY2UgQVdEMSk6DQotICogICAgICAgICAgIC0gY2hhbm5lbHMgbW9uaXRvcmVkOiBjYW4gbW9uaXRvciAxIGNoYW5uZWwgb3IgYWxsIGNoYW5uZWxzLg0KLSAqICAgICAgICAgICAtIGdyb3VwcyBtb25pdG9yZWQ6IEFEQyBncm91cHMgcmVndWxhciBhbmQtb3IgaW5qZWN0ZWQuDQotICogICAgICAgICAgIC0gcmVzb2x1dGlvbjogcmVzb2x1dGlvbiBpcyBub3QgbGltaXRlZCAoY29ycmVzcG9uZHMgdG8NCi0gKiAgICAgICAgICAgICBBREMgcmVzb2x1dGlvbiBjb25maWd1cmVkKS4NCi0gKiAgICAgICAgIC0gQVdEIGZsZXhpYmxlIChpbnN0YW5jZXMgQVdEMiwgQVdEMyk6DQotICogICAgICAgICAgIC0gY2hhbm5lbHMgbW9uaXRvcmVkOiBmbGV4aWJsZSBvbiBjaGFubmVscyBtb25pdG9yZWQsIHNlbGVjdGlvbiBpcw0KLSAqICAgICAgICAgICAgIGNoYW5uZWwgd2lzZSwgZnJvbSBmcm9tIDEgdG8gYWxsIGNoYW5uZWxzLg0KLSAqICAgICAgICAgICAgIFNwZWNpZmljaXR5IG9mIHRoaXMgYW5hbG9nIHdhdGNoZG9nOiBNdWx0aXBsZSBjaGFubmVscyBjYW4NCi0gKiAgICAgICAgICAgICBiZSBzZWxlY3RlZC4gRm9yIGV4YW1wbGU6DQotICogICAgICAgICAgICAgKExMX0FEQ19BV0RfQ0hBTk5FTDRfUkVHX0lOSiB8IExMX0FEQ19BV0RfQ0hBTk5FTDVfUkVHX0lOSiB8IC4uLikNCi0gKiAgICAgICAgICAgLSBncm91cHMgbW9uaXRvcmVkOiBub3Qgc2VsZWN0aW9uIHBvc3NpYmxlIChtb25pdG9yaW5nIG9uIGJvdGgNCi0gKiAgICAgICAgICAgICBncm91cHMgcmVndWxhciBhbmQgaW5qZWN0ZWQpLg0KLSAqICAgICAgICAgICAgIENoYW5uZWxzIHNlbGVjdGVkIGFyZSBtb25pdG9yZWQgb24gZ3JvdXBzIHJlZ3VsYXIgYW5kIGluamVjdGVkOg0KLSAqICAgICAgICAgICAgIExMX0FEQ19BV0RfQ0hBTk5FTHh4X1JFR19JTkogKGRvIG5vdCB1c2UgcGFyYW1ldGVycw0KLSAqICAgICAgICAgICAgIExMX0FEQ19BV0RfQ0hBTk5FTHh4X1JFRyBhbmQgTExfQURDX0FXRF9DSEFOTkVMeHhfSU5KKQ0KLSAqICAgICAgICAgICAtIHJlc29sdXRpb246IHJlc29sdXRpb24gaXMgbGltaXRlZCB0byA4IGJpdHM6IGlmIEFEQyByZXNvbHV0aW9uIGlzDQotICogICAgICAgICAgICAgMTIgYml0cyB0aGUgNCBMU0IgYXJlIGlnbm9yZWQsIGlmIEFEQyByZXNvbHV0aW9uIGlzIDEwIGJpdHMNCi0gKiAgICAgICAgICAgICB0aGUgMiBMU0IgYXJlIGlnbm9yZWQuDQotICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllcywgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8NCi0gKiAgICAgICAgIEFEQyBzdGF0ZToNCi0gKiAgICAgICAgIEFEQyBtdXN0IGJlIGRpc2FibGVkIG9yIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nDQotICogICAgICAgICBvbiBlaXRoZXIgZ3JvdXBzIHJlZ3VsYXIgb3IgaW5qZWN0ZWQuDQotICogQHJtdG9sbCBDRkdSICAgICBBV0QxQ0ggICAgICAgICBMTF9BRENfU2V0QW5hbG9nV0RNb25pdENoYW5uZWxzXG4NCi0gKiAgICAgICAgIENGR1IgICAgIEFXRDFTR0wgICAgICAgIExMX0FEQ19TZXRBbmFsb2dXRE1vbml0Q2hhbm5lbHNcbg0KLSAqICAgICAgICAgQ0ZHUiAgICAgQVdEMUVOICAgICAgICAgTExfQURDX1NldEFuYWxvZ1dETW9uaXRDaGFubmVsc1xuDQotICogICAgICAgICBDRkdSICAgICBKQVdEMUVOICAgICAgICBMTF9BRENfU2V0QW5hbG9nV0RNb25pdENoYW5uZWxzXG4NCi0gKiAgICAgICAgIEFXRDJDUiAgIEFXRDJDSCAgICAgICAgIExMX0FEQ19TZXRBbmFsb2dXRE1vbml0Q2hhbm5lbHNcbg0KLSAqICAgICAgICAgQVdEM0NSICAgQVdEM0NIICAgICAgICAgTExfQURDX1NldEFuYWxvZ1dETW9uaXRDaGFubmVscw0KLSAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UNCi0gKiBAcGFyYW0gIEFXRHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0QyDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRDMNCi0gKiBAcGFyYW0gIEFXRENoYW5uZWxHcm91cCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfRElTQUJMRQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQUxMX0NIQU5ORUxTX1JFRyAgICAgICAgKDApDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9BTExfQ0hBTk5FTFNfSU5KICAgICAgICAoMCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0FMTF9DSEFOTkVMU19SRUdfSU5KDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzBfUkVHICAgICAgICAgICAoMCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMF9JTkogICAgICAgICAgICgwKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8wX1JFR19JTkoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMV9SRUcgICAgICAgICAgICgwKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xX0lOSiAgICAgICAgICAgKDApDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzFfUkVHX0lOSg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8yX1JFRyAgICAgICAgICAgKDApDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzJfSU5KICAgICAgICAgICAoMCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMl9SRUdfSU5KDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzNfUkVHICAgICAgICAgICAoMCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfM19JTkogICAgICAgICAgICgwKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8zX1JFR19JTkoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfNF9SRUcgICAgICAgICAgICgwKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF80X0lOSiAgICAgICAgICAgKDApDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzRfUkVHX0lOSg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF81X1JFRyAgICAgICAgICAgKDApDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzVfSU5KICAgICAgICAgICAoMCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfNV9SRUdfSU5KDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzZfUkVHICAgICAgICAgICAoMCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfNl9JTkogICAgICAgICAgICgwKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF82X1JFR19JTkoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfN19SRUcgICAgICAgICAgICgwKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF83X0lOSiAgICAgICAgICAgKDApDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzdfUkVHX0lOSg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF84X1JFRyAgICAgICAgICAgKDApDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzhfSU5KICAgICAgICAgICAoMCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfOF9SRUdfSU5KDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzlfUkVHICAgICAgICAgICAoMCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfOV9JTkogICAgICAgICAgICgwKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF85X1JFR19JTkoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTBfUkVHICAgICAgICAgICgwKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xMF9JTkogICAgICAgICAgKDApDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzEwX1JFR19JTkoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTFfUkVHICAgICAgICAgICgwKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xMV9JTkogICAgICAgICAgKDApDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzExX1JFR19JTkoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTJfUkVHICAgICAgICAgICgwKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xMl9JTkogICAgICAgICAgKDApDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzEyX1JFR19JTkoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTNfUkVHICAgICAgICAgICgwKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xM19JTkogICAgICAgICAgKDApDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzEzX1JFR19JTkoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTRfUkVHICAgICAgICAgICgwKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xNF9JTkogICAgICAgICAgKDApDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE0X1JFR19JTkoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTVfUkVHICAgICAgICAgICgwKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xNV9JTkogICAgICAgICAgKDApDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE1X1JFR19JTkoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTZfUkVHICAgICAgICAgICgwKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xNl9JTkogICAgICAgICAgKDApDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE2X1JFR19JTkoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTdfUkVHICAgICAgICAgICgwKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xN19JTkogICAgICAgICAgKDApDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE3X1JFR19JTkoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMThfUkVHICAgICAgICAgICgwKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xOF9JTkogICAgICAgICAgKDApDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE4X1JFR19JTkoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZSRUZJTlRfUkVHICAgICAgICAgICgwKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVlJFRklOVF9JTkogICAgICAgICAgKDApDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9WUkVGSU5UX1JFR19JTkoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1RFTVBTRU5TT1JfQURDMV9SRUcgICgwKSgxKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVEVNUFNFTlNPUl9BREMxX0lOSiAgKDApKDEpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9URU1QU0VOU09SX0FEQzFfUkVHX0lOSiAoMSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1RFTVBTRU5TT1JfQURDNV9SRUcgICgwKSg1KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVEVNUFNFTlNPUl9BREM1X0lOSiAgKDApKDUpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9URU1QU0VOU09SX0FEQzVfUkVHX0lOSiAoNSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZCQVRfUkVHICAgICAgICAgICAgICgwKSg2KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVkJBVF9JTkogICAgICAgICAgICAgKDApKDYpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9WQkFUX1JFR19JTkogICAgICAgICAgICAoNikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZPUEFNUDFfUkVHICAgICAgICAgICgwKSgxKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVk9QQU1QMV9JTkogICAgICAgICAgKDApKDEpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9WT1BBTVAxX1JFR19JTkogICAgICAgICAoMSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZPUEFNUDJfUkVHICAgICAgICAgICgwKSgyKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVk9QQU1QMl9JTkogICAgICAgICAgKDApKDIpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9WT1BBTVAyX1JFR19JTkogICAgICAgICAoMikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZPUEFNUDNfQURDMl9SRUcgICAgICgwKSgyKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVk9QQU1QM19BREMyX0lOSiAgICAgKDApKDIpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9WT1BBTVAzX0FEQzJfUkVHX0lOSiAgICAoMikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZPUEFNUDNfQURDM19SRUcgICAgICgwKSgzKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVk9QQU1QM19BREMzX0lOSiAgICAgKDApKDMpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9WT1BBTVAzX0FEQzNfUkVHX0lOSiAgICAoMykNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZPUEFNUDRfUkVHICAgICAgICAgICgwKSg1KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVk9QQU1QNF9JTkogICAgICAgICAgKDApKDUpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9WT1BBTVA0X1JFR19JTkogICAgICAgICAoNSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZPUEFNUDVfUkVHICAgICAgICAgICgwKSg1KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVk9QQU1QNV9JTkogICAgICAgICAgKDApKDUpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9WT1BBTVA1X1JFR19JTkogICAgICAgICAoNSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZPUEFNUDZfUkVHICAgICAgICAgICgwKSg0KQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVk9QQU1QNl9JTkogICAgICAgICAgKDApKDQpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9WT1BBTVA2X1JFR19JTkogICAgICAgICAoNCkNCi0gKg0KLSAqICAgICAgICAgKDApIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBhbmFsb2cgd2F0Y2hkb2cgbnVtYmVyOg0KLSAqIEFXRDEuXG4gKDEpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzEuXG4gKDIpDQotICogT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMi5cbiAoMykgT24gU1RNMzJHNCwNCi0gKiBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMzLlxuICg0KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXINCi0gKiBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzQuXG4gKDUpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUNCi0gKiBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDNS5cbiAoNikgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQw0KLSAqIGluc3RhbmNlczogQURDMSwgQURDMywgQURDNS5cbiAoNykgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uDQotICogQURDIGluc3RhbmNlczogQURDMSwgQURDMywgQURDNCwgQURDNS5cbg0KLSAqICAgICAgICAgIC0gIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBhbGwgQURDeCBhcmUgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlcy4NCi0gKiBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBtb3JlIGRldGFpbHMuDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1NldEFuYWxvZ1dETW9uaXRDaGFubmVscyhBRENfVHlwZURlZiAqQURDeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEFXRHksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBBV0RDaGFubmVsR3JvdXApIHsNCi0gIC8qIFNldCBiaXRzIHdpdGggY29udGVudCBvZiBwYXJhbWV0ZXIgIkFXRENoYW5uZWxHcm91cCIgd2l0aCBiaXRzIHBvc2l0aW9uICAqLw0KLSAgLyogaW4gcmVnaXN0ZXIgYW5kIHJlZ2lzdGVyIHBvc2l0aW9uIGRlcGVuZGluZyBvbiBwYXJhbWV0ZXIgIkFXRHkiLiAgICAgICAgICovDQotICAvKiBQYXJhbWV0ZXJzICJBV0RDaGFubmVsR3JvdXAiIGFuZCAiQVdEeSIgYXJlIHVzZWQgd2l0aCBtYXNrcyBiZWNhdXNlICAgICAgKi8NCi0gIC8qIGNvbnRhaW5pbmcgb3RoZXIgYml0cyByZXNlcnZlZCBmb3Igb3RoZXIgcHVycG9zZS4gICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgX19JTyB1aW50MzJfdCAqcHJlZyA9IF9fQURDX1BUUl9SRUdfT0ZGU0VUKA0KLSAgICAgIEFEQ3gtPkNGR1IsDQotICAgICAgKChBV0R5ICYgQURDX0FXRF9DUlhfUkVHT0ZGU0VUX01BU0spID4+IEFEQ19BV0RfQ1JYX1JFR09GRlNFVF9QT1MpICsNCi0gICAgICAgICAgKChBV0R5ICYgQURDX0FXRF9DUjEyX1JFR09GRlNFVEdBUF9NQVNLKSAqDQotICAgICAgICAgICBBRENfQVdEX0NSMTJfUkVHT0ZGU0VUR0FQX1ZBTCkpOw0KLQ0KLSAgTU9ESUZZX1JFRygqcHJlZywgKEFXRHkgJiBBRENfQVdEX0NSX0FMTF9DSEFOTkVMX01BU0spLA0KLSAgICAgICAgICAgICBBV0RDaGFubmVsR3JvdXAgJiBBV0R5KTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yZWQgY2hhbm5lbC4NCi0gKiBAbm90ZSAgIFVzYWdlIG9mIHRoZSByZXR1cm5lZCBjaGFubmVsIG51bWJlcjoNCi0gKiAgICAgICAgIC0gVG8gcmVpbmplY3QgdGhpcyBjaGFubmVsIGludG8gYW5vdGhlciBmdW5jdGlvbiBMTF9BRENfeHh4Og0KLSAqICAgICAgICAgICB0aGUgcmV0dXJuZWQgY2hhbm5lbCBudW1iZXIgaXMgb25seSBwYXJ0bHkgZm9ybWF0dGVkIG9uIGRlZmluaXRpb24NCi0gKiAgICAgICAgICAgb2YgbGl0ZXJhbHMgTExfQURDX0NIQU5ORUxfeC4gVGhlcmVmb3JlLCBpdCBoYXMgdG8gYmUgY29tcGFyZWQNCi0gKiAgICAgICAgICAgd2l0aCBwYXJ0cyBvZiBsaXRlcmFscyBMTF9BRENfQ0hBTk5FTF94IG9yIHVzaW5nDQotICogICAgICAgICAgIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0NIQU5ORUxfVE9fREVDSU1BTF9OQigpLg0KLSAqICAgICAgICAgICBUaGVuIHRoZSBzZWxlY3RlZCBsaXRlcmFsIExMX0FEQ19DSEFOTkVMX3ggY2FuIGJlIHVzZWQNCi0gKiAgICAgICAgICAgYXMgcGFyYW1ldGVyIGZvciBhbm90aGVyIGZ1bmN0aW9uLg0KLSAqICAgICAgICAgLSBUbyBnZXQgdGhlIGNoYW5uZWwgbnVtYmVyIGluIGRlY2ltYWwgZm9ybWF0Og0KLSAqICAgICAgICAgICBwcm9jZXNzIHRoZSByZXR1cm5lZCB2YWx1ZSB3aXRoIHRoZSBoZWxwZXIgbWFjcm8NCi0gKiAgICAgICAgICAgQHJlZiBfX0xMX0FEQ19DSEFOTkVMX1RPX0RFQ0lNQUxfTkIoKS4NCi0gKiAgICAgICAgICAgQXBwbGljYWJsZSBvbmx5IHdoZW4gdGhlIGFuYWxvZyB3YXRjaGRvZyBpcyBzZXQgdG8gbW9uaXRvcg0KLSAqICAgICAgICAgICBvbmUgY2hhbm5lbC4NCi0gKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCB0aGVyZSBhcmUgMiBraW5kcyBvZiBhbmFsb2cgd2F0Y2hkb2cNCi0gKiAgICAgICAgIGluc3RhbmNlOg0KLSAqICAgICAgICAgLSBBV0Qgc3RhbmRhcmQgKGluc3RhbmNlIEFXRDEpOg0KLSAqICAgICAgICAgICAtIGNoYW5uZWxzIG1vbml0b3JlZDogY2FuIG1vbml0b3IgMSBjaGFubmVsIG9yIGFsbCBjaGFubmVscy4NCi0gKiAgICAgICAgICAgLSBncm91cHMgbW9uaXRvcmVkOiBBREMgZ3JvdXBzIHJlZ3VsYXIgYW5kLW9yIGluamVjdGVkLg0KLSAqICAgICAgICAgICAtIHJlc29sdXRpb246IHJlc29sdXRpb24gaXMgbm90IGxpbWl0ZWQgKGNvcnJlc3BvbmRzIHRvDQotICogICAgICAgICAgICAgQURDIHJlc29sdXRpb24gY29uZmlndXJlZCkuDQotICogICAgICAgICAtIEFXRCBmbGV4aWJsZSAoaW5zdGFuY2VzIEFXRDIsIEFXRDMpOg0KLSAqICAgICAgICAgICAtIGNoYW5uZWxzIG1vbml0b3JlZDogZmxleGlibGUgb24gY2hhbm5lbHMgbW9uaXRvcmVkLCBzZWxlY3Rpb24gaXMNCi0gKiAgICAgICAgICAgICBjaGFubmVsIHdpc2UsIGZyb20gZnJvbSAxIHRvIGFsbCBjaGFubmVscy4NCi0gKiAgICAgICAgICAgICBTcGVjaWZpY2l0eSBvZiB0aGlzIGFuYWxvZyB3YXRjaGRvZzogTXVsdGlwbGUgY2hhbm5lbHMgY2FuDQotICogICAgICAgICAgICAgYmUgc2VsZWN0ZWQuIEZvciBleGFtcGxlOg0KLSAqICAgICAgICAgICAgIChMTF9BRENfQVdEX0NIQU5ORUw0X1JFR19JTkogfCBMTF9BRENfQVdEX0NIQU5ORUw1X1JFR19JTkogfCAuLi4pDQotICogICAgICAgICAgIC0gZ3JvdXBzIG1vbml0b3JlZDogbm90IHNlbGVjdGlvbiBwb3NzaWJsZSAobW9uaXRvcmluZyBvbiBib3RoDQotICogICAgICAgICAgICAgZ3JvdXBzIHJlZ3VsYXIgYW5kIGluamVjdGVkKS4NCi0gKiAgICAgICAgICAgICBDaGFubmVscyBzZWxlY3RlZCBhcmUgbW9uaXRvcmVkIG9uIGdyb3VwcyByZWd1bGFyIGFuZCBpbmplY3RlZDoNCi0gKiAgICAgICAgICAgICBMTF9BRENfQVdEX0NIQU5ORUx4eF9SRUdfSU5KIChkbyBub3QgdXNlIHBhcmFtZXRlcnMNCi0gKiAgICAgICAgICAgICBMTF9BRENfQVdEX0NIQU5ORUx4eF9SRUcgYW5kIExMX0FEQ19BV0RfQ0hBTk5FTHh4X0lOSikNCi0gKiAgICAgICAgICAgLSByZXNvbHV0aW9uOiByZXNvbHV0aW9uIGlzIGxpbWl0ZWQgdG8gOCBiaXRzOiBpZiBBREMgcmVzb2x1dGlvbiBpcw0KLSAqICAgICAgICAgICAgIDEyIGJpdHMgdGhlIDQgTFNCIGFyZSBpZ25vcmVkLCBpZiBBREMgcmVzb2x1dGlvbiBpcyAxMCBiaXRzDQotICogICAgICAgICAgICAgdGhlIDIgTFNCIGFyZSBpZ25vcmVkLg0KLSAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvDQotICogICAgICAgICBBREMgc3RhdGU6DQotICogICAgICAgICBBREMgbXVzdCBiZSBkaXNhYmxlZCBvciBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZw0KLSAqICAgICAgICAgb24gZWl0aGVyIGdyb3VwcyByZWd1bGFyIG9yIGluamVjdGVkLg0KLSAqIEBybXRvbGwgQ0ZHUiAgICAgQVdEMUNIICAgICAgICAgTExfQURDX0dldEFuYWxvZ1dETW9uaXRDaGFubmVsc1xuDQotICogICAgICAgICBDRkdSICAgICBBV0QxU0dMICAgICAgICBMTF9BRENfR2V0QW5hbG9nV0RNb25pdENoYW5uZWxzXG4NCi0gKiAgICAgICAgIENGR1IgICAgIEFXRDFFTiAgICAgICAgIExMX0FEQ19HZXRBbmFsb2dXRE1vbml0Q2hhbm5lbHNcbg0KLSAqICAgICAgICAgQ0ZHUiAgICAgSkFXRDFFTiAgICAgICAgTExfQURDX0dldEFuYWxvZ1dETW9uaXRDaGFubmVsc1xuDQotICogICAgICAgICBBV0QyQ1IgICBBV0QyQ0ggICAgICAgICBMTF9BRENfR2V0QW5hbG9nV0RNb25pdENoYW5uZWxzXG4NCi0gKiAgICAgICAgIEFXRDNDUiAgIEFXRDNDSCAgICAgICAgIExMX0FEQ19HZXRBbmFsb2dXRE1vbml0Q2hhbm5lbHMNCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHBhcmFtICBBV0R5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRDENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEMiAoMSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEMyAoMSkNCi0gKg0KLSAqICAgICAgICAgKDEpIE9uIHRoaXMgQVdEIG51bWJlciwgbW9uaXRvcmVkIGNoYW5uZWwgY2FuIGJlIHJldHJpZXZlZA0KLSAqICAgICAgICAgICAgIGlmIG9ubHkgMSBjaGFubmVsIGlzIHByb2dyYW1tZWQgKG9yIG5vbmUgb3IgYWxsIGNoYW5uZWxzKS4NCi0gKiAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbm5vdCByZXRyaWV2ZSBtb25pdG9yZWQgY2hhbm5lbCBpZg0KLSAqICAgICAgICAgICAgIG11bHRpcGxlIGNoYW5uZWxzIGFyZSBwcm9ncmFtbWVkIHNpbXVsdGFuZW91c2x5DQotICogICAgICAgICAgICAgYnkgYml0ZmllbGQuDQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfRElTQUJMRQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQUxMX0NIQU5ORUxTX1JFRyAgICAgICAgKDApDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9BTExfQ0hBTk5FTFNfSU5KICAgICAgICAoMCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0FMTF9DSEFOTkVMU19SRUdfSU5KDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzBfUkVHICAgICAgICAgICAoMCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMF9JTkogICAgICAgICAgICgwKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8wX1JFR19JTkoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMV9SRUcgICAgICAgICAgICgwKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xX0lOSiAgICAgICAgICAgKDApDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzFfUkVHX0lOSg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8yX1JFRyAgICAgICAgICAgKDApDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzJfSU5KICAgICAgICAgICAoMCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMl9SRUdfSU5KDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzNfUkVHICAgICAgICAgICAoMCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfM19JTkogICAgICAgICAgICgwKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8zX1JFR19JTkoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfNF9SRUcgICAgICAgICAgICgwKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF80X0lOSiAgICAgICAgICAgKDApDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzRfUkVHX0lOSg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF81X1JFRyAgICAgICAgICAgKDApDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzVfSU5KICAgICAgICAgICAoMCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfNV9SRUdfSU5KDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzZfUkVHICAgICAgICAgICAoMCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfNl9JTkogICAgICAgICAgICgwKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF82X1JFR19JTkoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfN19SRUcgICAgICAgICAgICgwKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF83X0lOSiAgICAgICAgICAgKDApDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzdfUkVHX0lOSg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF84X1JFRyAgICAgICAgICAgKDApDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzhfSU5KICAgICAgICAgICAoMCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfOF9SRUdfSU5KDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzlfUkVHICAgICAgICAgICAoMCkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfOV9JTkogICAgICAgICAgICgwKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF85X1JFR19JTkoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTBfUkVHICAgICAgICAgICgwKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xMF9JTkogICAgICAgICAgKDApDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzEwX1JFR19JTkoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTFfUkVHICAgICAgICAgICgwKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xMV9JTkogICAgICAgICAgKDApDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzExX1JFR19JTkoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTJfUkVHICAgICAgICAgICgwKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xMl9JTkogICAgICAgICAgKDApDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzEyX1JFR19JTkoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTNfUkVHICAgICAgICAgICgwKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xM19JTkogICAgICAgICAgKDApDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzEzX1JFR19JTkoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTRfUkVHICAgICAgICAgICgwKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xNF9JTkogICAgICAgICAgKDApDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE0X1JFR19JTkoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTVfUkVHICAgICAgICAgICgwKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xNV9JTkogICAgICAgICAgKDApDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE1X1JFR19JTkoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTZfUkVHICAgICAgICAgICgwKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xNl9JTkogICAgICAgICAgKDApDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE2X1JFR19JTkoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTdfUkVHICAgICAgICAgICgwKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xN19JTkogICAgICAgICAgKDApDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE3X1JFR19JTkoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMThfUkVHICAgICAgICAgICgwKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xOF9JTkogICAgICAgICAgKDApDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE4X1JFR19JTkoNCi0gKg0KLSAqICAgICAgICAgKDApIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBhbmFsb2cgd2F0Y2hkb2cgbnVtYmVyOg0KLSAqIEFXRDEuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19HZXRBbmFsb2dXRE1vbml0Q2hhbm5lbHMoQURDX1R5cGVEZWYgKkFEQ3gsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQVdEeSkgew0KLSAgY29uc3QgX19JTyB1aW50MzJfdCAqcHJlZyA9IF9fQURDX1BUUl9SRUdfT0ZGU0VUKA0KLSAgICAgIEFEQ3gtPkNGR1IsDQotICAgICAgKChBV0R5ICYgQURDX0FXRF9DUlhfUkVHT0ZGU0VUX01BU0spID4+IEFEQ19BV0RfQ1JYX1JFR09GRlNFVF9QT1MpICsNCi0gICAgICAgICAgKChBV0R5ICYgQURDX0FXRF9DUjEyX1JFR09GRlNFVEdBUF9NQVNLKSAqDQotICAgICAgICAgICBBRENfQVdEX0NSMTJfUkVHT0ZGU0VUR0FQX1ZBTCkpOw0KLQ0KLSAgdWludDMyX3QgQW5hbG9nV0RNb25pdENoYW5uZWxzID0NCi0gICAgICAoUkVBRF9CSVQoKnByZWcsIEFXRHkpICYgQURDX0FXRF9DUl9BTExfQ0hBTk5FTF9NQVNLKTsNCi0NCi0gIC8qIElmICJBbmFsb2dXRE1vbml0Q2hhbm5lbHMiID09IDAsIHRoZW4gdGhlIHNlbGVjdGVkIEFXRCBpcyBkaXNhYmxlZCAgICAgICAqLw0KLSAgLyogKHBhcmFtZXRlciB2YWx1ZSBMTF9BRENfQVdEX0RJU0FCTEUpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAvKiBFbHNlLCB0aGUgc2VsZWN0ZWQgQVdEIGlzIGVuYWJsZWQgYW5kIGlzIG1vbml0b3JpbmcgYSBncm91cCBvZiBjaGFubmVscyAgKi8NCi0gIC8qIG9yIGEgc2luZ2xlIGNoYW5uZWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgaWYgKEFuYWxvZ1dETW9uaXRDaGFubmVscyAhPSAwVUwpIHsNCi0gICAgaWYgKEFXRHkgPT0gTExfQURDX0FXRDEpIHsNCi0gICAgICBpZiAoKEFuYWxvZ1dETW9uaXRDaGFubmVscyAmIEFEQ19DRkdSX0FXRDFTR0wpID09IDBVTCkgew0KLSAgICAgICAgLyogQVdEIG1vbml0b3JpbmcgYSBncm91cCBvZiBjaGFubmVscyAqLw0KLSAgICAgICAgQW5hbG9nV0RNb25pdENoYW5uZWxzID0NCi0gICAgICAgICAgICAoKEFuYWxvZ1dETW9uaXRDaGFubmVscyB8IChBRENfQVdEX0NSMjNfQ0hBTk5FTF9NQVNLKSkgJg0KLSAgICAgICAgICAgICAofihBRENfQ0ZHUl9BV0QxQ0gpKSk7DQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgIC8qIEFXRCBtb25pdG9yaW5nIGEgc2luZ2xlIGNoYW5uZWwgKi8NCi0gICAgICAgIEFuYWxvZ1dETW9uaXRDaGFubmVscyA9DQotICAgICAgICAgICAgKEFuYWxvZ1dETW9uaXRDaGFubmVscyB8DQotICAgICAgICAgICAgIChBRENfQVdEMkNSX0FXRDJDSF8wDQotICAgICAgICAgICAgICA8PCAoQW5hbG9nV0RNb25pdENoYW5uZWxzID4+IEFEQ19DRkdSX0FXRDFDSF9Qb3MpKSk7DQotICAgICAgfQ0KLSAgICB9IGVsc2Ugew0KLSAgICAgIGlmICgoQW5hbG9nV0RNb25pdENoYW5uZWxzICYgQURDX0FXRF9DUjIzX0NIQU5ORUxfTUFTSykgPT0NCi0gICAgICAgICAgQURDX0FXRF9DUjIzX0NIQU5ORUxfTUFTSykgew0KLSAgICAgICAgLyogQVdEIG1vbml0b3JpbmcgYSBncm91cCBvZiBjaGFubmVscyAqLw0KLSAgICAgICAgQW5hbG9nV0RNb25pdENoYW5uZWxzID0gKEFEQ19BV0RfQ1IyM19DSEFOTkVMX01BU0sgfA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQURDX0NGR1JfSkFXRDFFTiB8IEFEQ19DRkdSX0FXRDFFTikpKTsNCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgLyogQVdEIG1vbml0b3JpbmcgYSBzaW5nbGUgY2hhbm5lbCAqLw0KLSAgICAgICAgLyogQVdEIG1vbml0b3JpbmcgYSBncm91cCBvZiBjaGFubmVscyAqLw0KLSAgICAgICAgQW5hbG9nV0RNb25pdENoYW5uZWxzID0NCi0gICAgICAgICAgICAoQW5hbG9nV0RNb25pdENoYW5uZWxzIHwNCi0gICAgICAgICAgICAgKEFEQ19DRkdSX0pBV0QxRU4gfCBBRENfQ0ZHUl9BV0QxRU4gfCBBRENfQ0ZHUl9BV0QxU0dMKSB8DQotICAgICAgICAgICAgIChfX0xMX0FEQ19DSEFOTkVMX1RPX0RFQ0lNQUxfTkIoQW5hbG9nV0RNb25pdENoYW5uZWxzKQ0KLSAgICAgICAgICAgICAgPDwgQURDX0NGR1JfQVdEMUNIX1BvcykpOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgcmV0dXJuIEFuYWxvZ1dETW9uaXRDaGFubmVsczsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZXQgQURDIGFuYWxvZyB3YXRjaGRvZyB0aHJlc2hvbGRzIHZhbHVlIG9mIGJvdGggdGhyZXNob2xkcw0KLSAqICAgICAgICAgaGlnaCBhbmQgbG93Lg0KLSAqIEBub3RlICAgSWYgdmFsdWUgb2Ygb25seSBvbmUgdGhyZXNob2xkIGhpZ2ggb3IgbG93IG11c3QgYmUgc2V0LA0KLSAqICAgICAgICAgdXNlIGZ1bmN0aW9uIEByZWYgTExfQURDX1NldEFuYWxvZ1dEVGhyZXNob2xkcygpLg0KLSAqIEBub3RlICAgSW4gY2FzZSBvZiBBREMgcmVzb2x1dGlvbiBkaWZmZXJlbnQgb2YgMTIgYml0cywNCi0gKiAgICAgICAgIGFuYWxvZyB3YXRjaGRvZyB0aHJlc2hvbGRzIGRhdGEgcmVxdWlyZSBhIHNwZWNpZmljIHNoaWZ0Lg0KLSAqICAgICAgICAgVXNlIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0FOQUxPR1dEX1NFVF9USFJFU0hPTERfUkVTT0xVVElPTigpLg0KLSAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIHRoZXJlIGFyZSAyIGtpbmRzIG9mIGFuYWxvZyB3YXRjaGRvZw0KLSAqICAgICAgICAgaW5zdGFuY2U6DQotICogICAgICAgICAtIEFXRCBzdGFuZGFyZCAoaW5zdGFuY2UgQVdEMSk6DQotICogICAgICAgICAgIC0gY2hhbm5lbHMgbW9uaXRvcmVkOiBjYW4gbW9uaXRvciAxIGNoYW5uZWwgb3IgYWxsIGNoYW5uZWxzLg0KLSAqICAgICAgICAgICAtIGdyb3VwcyBtb25pdG9yZWQ6IEFEQyBncm91cHMgcmVndWxhciBhbmQtb3IgaW5qZWN0ZWQuDQotICogICAgICAgICAgIC0gcmVzb2x1dGlvbjogcmVzb2x1dGlvbiBpcyBub3QgbGltaXRlZCAoY29ycmVzcG9uZHMgdG8NCi0gKiAgICAgICAgICAgICBBREMgcmVzb2x1dGlvbiBjb25maWd1cmVkKS4NCi0gKiAgICAgICAgIC0gQVdEIGZsZXhpYmxlIChpbnN0YW5jZXMgQVdEMiwgQVdEMyk6DQotICogICAgICAgICAgIC0gY2hhbm5lbHMgbW9uaXRvcmVkOiBmbGV4aWJsZSBvbiBjaGFubmVscyBtb25pdG9yZWQsIHNlbGVjdGlvbiBpcw0KLSAqICAgICAgICAgICAgIGNoYW5uZWwgd2lzZSwgZnJvbSBmcm9tIDEgdG8gYWxsIGNoYW5uZWxzLg0KLSAqICAgICAgICAgICAgIFNwZWNpZmljaXR5IG9mIHRoaXMgYW5hbG9nIHdhdGNoZG9nOiBNdWx0aXBsZSBjaGFubmVscyBjYW4NCi0gKiAgICAgICAgICAgICBiZSBzZWxlY3RlZC4gRm9yIGV4YW1wbGU6DQotICogICAgICAgICAgICAgKExMX0FEQ19BV0RfQ0hBTk5FTDRfUkVHX0lOSiB8IExMX0FEQ19BV0RfQ0hBTk5FTDVfUkVHX0lOSiB8IC4uLikNCi0gKiAgICAgICAgICAgLSBncm91cHMgbW9uaXRvcmVkOiBub3Qgc2VsZWN0aW9uIHBvc3NpYmxlIChtb25pdG9yaW5nIG9uIGJvdGgNCi0gKiAgICAgICAgICAgICBncm91cHMgcmVndWxhciBhbmQgaW5qZWN0ZWQpLg0KLSAqICAgICAgICAgICAgIENoYW5uZWxzIHNlbGVjdGVkIGFyZSBtb25pdG9yZWQgb24gZ3JvdXBzIHJlZ3VsYXIgYW5kIGluamVjdGVkOg0KLSAqICAgICAgICAgICAgIExMX0FEQ19BV0RfQ0hBTk5FTHh4X1JFR19JTkogKGRvIG5vdCB1c2UgcGFyYW1ldGVycw0KLSAqICAgICAgICAgICAgIExMX0FEQ19BV0RfQ0hBTk5FTHh4X1JFRyBhbmQgTExfQURDX0FXRF9DSEFOTkVMeHhfSU5KKQ0KLSAqICAgICAgICAgICAtIHJlc29sdXRpb246IHJlc29sdXRpb24gaXMgbGltaXRlZCB0byA4IGJpdHM6IGlmIEFEQyByZXNvbHV0aW9uIGlzDQotICogICAgICAgICAgICAgMTIgYml0cyB0aGUgNCBMU0IgYXJlIGlnbm9yZWQsIGlmIEFEQyByZXNvbHV0aW9uIGlzIDEwIGJpdHMNCi0gKiAgICAgICAgICAgICB0aGUgMiBMU0IgYXJlIGlnbm9yZWQuDQotICogQG5vdGUgICBJZiBBREMgb3ZlcnNhbXBsaW5nIGlzIGVuYWJsZWQsIEFEQyBhbmFsb2cgd2F0Y2hkb2cgdGhyZXNob2xkcyBhcmUNCi0gKiAgICAgICAgIGltcGFjdGVkOiB0aGUgY29tcGFyaXNvbiBvZiBhbmFsb2cgd2F0Y2hkb2cgdGhyZXNob2xkcyBpcyBkb25lIG9uDQotICogICAgICAgICBvdmVyc2FtcGxpbmcgZmluYWwgY29tcHV0YXRpb24gKGFmdGVyIHJhdGlvIGFuZCBzaGlmdCBhcHBsaWNhdGlvbik6DQotICogICAgICAgICBBREMgZGF0YSByZWdpc3RlciBiaXRmaWVsZCBbMTU6NF0gKDEyIG1vc3Qgc2lnbmlmaWNhbnQgYml0cykuDQotICogQHJtdG9sbCBUUjEgICAgICBIVDEgICAgICAgICAgICBMTF9BRENfQ29uZmlnQW5hbG9nV0RUaHJlc2hvbGRzXG4NCi0gKiAgICAgICAgIFRSMiAgICAgIEhUMiAgICAgICAgICAgIExMX0FEQ19Db25maWdBbmFsb2dXRFRocmVzaG9sZHNcbg0KLSAqICAgICAgICAgVFIzICAgICAgSFQzICAgICAgICAgICAgTExfQURDX0NvbmZpZ0FuYWxvZ1dEVGhyZXNob2xkc1xuDQotICogICAgICAgICBUUjEgICAgICBMVDEgICAgICAgICAgICBMTF9BRENfQ29uZmlnQW5hbG9nV0RUaHJlc2hvbGRzXG4NCi0gKiAgICAgICAgIFRSMiAgICAgIExUMiAgICAgICAgICAgIExMX0FEQ19Db25maWdBbmFsb2dXRFRocmVzaG9sZHNcbg0KLSAqICAgICAgICAgVFIzICAgICAgTFQzICAgICAgICAgICAgTExfQURDX0NvbmZpZ0FuYWxvZ1dEVGhyZXNob2xkcw0KLSAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UNCi0gKiBAcGFyYW0gIEFXRHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0QyDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRDMNCi0gKiBAcGFyYW0gIEFXRFRocmVzaG9sZEhpZ2hWYWx1ZSBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwIGFuZCBNYXhfRGF0YT0weEZGRg0KLSAqIEBwYXJhbSAgQVdEVGhyZXNob2xkTG93VmFsdWUgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMCBhbmQgTWF4X0RhdGE9MHhGRkYNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfQ29uZmlnQW5hbG9nV0RUaHJlc2hvbGRzKA0KLSAgICBBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgQVdEeSwgdWludDMyX3QgQVdEVGhyZXNob2xkSGlnaFZhbHVlLA0KLSAgICB1aW50MzJfdCBBV0RUaHJlc2hvbGRMb3dWYWx1ZSkgew0KLSAgLyogU2V0IGJpdHMgd2l0aCBjb250ZW50IG9mIHBhcmFtZXRlciAiQVdEVGhyZXNob2xkeHh4VmFsdWUiIHdpdGggYml0cyAgICAgICovDQotICAvKiBwb3NpdGlvbiBpbiByZWdpc3RlciBhbmQgcmVnaXN0ZXIgcG9zaXRpb24gZGVwZW5kaW5nIG9uIHBhcmFtZXRlciAgICAgICAgKi8NCi0gIC8qICJBV0R5Ii4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgLyogUGFyYW1ldGVycyAiQVdEeSIgYW5kICJBV0RUaHJlc2hvbGR4eHhWYWx1ZSIgYXJlIHVzZWQgd2l0aCBtYXNrcyBiZWNhdXNlICovDQotICAvKiBjb250YWluaW5nIG90aGVyIGJpdHMgcmVzZXJ2ZWQgZm9yIG90aGVyIHB1cnBvc2UuICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gIF9fSU8gdWludDMyX3QgKnByZWcgPSBfX0FEQ19QVFJfUkVHX09GRlNFVCgNCi0gICAgICBBREN4LT5UUjEsDQotICAgICAgKChBV0R5ICYgQURDX0FXRF9UUlhfUkVHT0ZGU0VUX01BU0spID4+IEFEQ19BV0RfVFJYX1JFR09GRlNFVF9QT1MpKTsNCi0NCi0gIE1PRElGWV9SRUcoKnByZWcsIEFEQ19UUjFfSFQxIHwgQURDX1RSMV9MVDEsDQotICAgICAgICAgICAgIChBV0RUaHJlc2hvbGRIaWdoVmFsdWUgPDwgQURDX1RSMV9IVDFfQklUT0ZGU0VUX1BPUykgfA0KLSAgICAgICAgICAgICAgICAgQVdEVGhyZXNob2xkTG93VmFsdWUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCBBREMgYW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZCB2YWx1ZSBvZiB0aHJlc2hvbGQNCi0gKiAgICAgICAgIGhpZ2ggb3IgbG93Lg0KLSAqIEBub3RlICAgSWYgdmFsdWVzIG9mIGJvdGggdGhyZXNob2xkcyBoaWdoIG9yIGxvdyBtdXN0IGJlIHNldCwNCi0gKiAgICAgICAgIHVzZSBmdW5jdGlvbiBAcmVmIExMX0FEQ19Db25maWdBbmFsb2dXRFRocmVzaG9sZHMoKS4NCi0gKiBAbm90ZSAgIEluIGNhc2Ugb2YgQURDIHJlc29sdXRpb24gZGlmZmVyZW50IG9mIDEyIGJpdHMsDQotICogICAgICAgICBhbmFsb2cgd2F0Y2hkb2cgdGhyZXNob2xkcyBkYXRhIHJlcXVpcmUgYSBzcGVjaWZpYyBzaGlmdC4NCi0gKiAgICAgICAgIFVzZSBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19BTkFMT0dXRF9TRVRfVEhSRVNIT0xEX1JFU09MVVRJT04oKS4NCi0gKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCB0aGVyZSBhcmUgMiBraW5kcyBvZiBhbmFsb2cgd2F0Y2hkb2cNCi0gKiAgICAgICAgIGluc3RhbmNlOg0KLSAqICAgICAgICAgLSBBV0Qgc3RhbmRhcmQgKGluc3RhbmNlIEFXRDEpOg0KLSAqICAgICAgICAgICAtIGNoYW5uZWxzIG1vbml0b3JlZDogY2FuIG1vbml0b3IgMSBjaGFubmVsIG9yIGFsbCBjaGFubmVscy4NCi0gKiAgICAgICAgICAgLSBncm91cHMgbW9uaXRvcmVkOiBBREMgZ3JvdXBzIHJlZ3VsYXIgYW5kLW9yIGluamVjdGVkLg0KLSAqICAgICAgICAgICAtIHJlc29sdXRpb246IHJlc29sdXRpb24gaXMgbm90IGxpbWl0ZWQgKGNvcnJlc3BvbmRzIHRvDQotICogICAgICAgICAgICAgQURDIHJlc29sdXRpb24gY29uZmlndXJlZCkuDQotICogICAgICAgICAtIEFXRCBmbGV4aWJsZSAoaW5zdGFuY2VzIEFXRDIsIEFXRDMpOg0KLSAqICAgICAgICAgICAtIGNoYW5uZWxzIG1vbml0b3JlZDogZmxleGlibGUgb24gY2hhbm5lbHMgbW9uaXRvcmVkLCBzZWxlY3Rpb24gaXMNCi0gKiAgICAgICAgICAgICBjaGFubmVsIHdpc2UsIGZyb20gZnJvbSAxIHRvIGFsbCBjaGFubmVscy4NCi0gKiAgICAgICAgICAgICBTcGVjaWZpY2l0eSBvZiB0aGlzIGFuYWxvZyB3YXRjaGRvZzogTXVsdGlwbGUgY2hhbm5lbHMgY2FuDQotICogICAgICAgICAgICAgYmUgc2VsZWN0ZWQuIEZvciBleGFtcGxlOg0KLSAqICAgICAgICAgICAgIChMTF9BRENfQVdEX0NIQU5ORUw0X1JFR19JTkogfCBMTF9BRENfQVdEX0NIQU5ORUw1X1JFR19JTkogfCAuLi4pDQotICogICAgICAgICAgIC0gZ3JvdXBzIG1vbml0b3JlZDogbm90IHNlbGVjdGlvbiBwb3NzaWJsZSAobW9uaXRvcmluZyBvbiBib3RoDQotICogICAgICAgICAgICAgZ3JvdXBzIHJlZ3VsYXIgYW5kIGluamVjdGVkKS4NCi0gKiAgICAgICAgICAgICBDaGFubmVscyBzZWxlY3RlZCBhcmUgbW9uaXRvcmVkIG9uIGdyb3VwcyByZWd1bGFyIGFuZCBpbmplY3RlZDoNCi0gKiAgICAgICAgICAgICBMTF9BRENfQVdEX0NIQU5ORUx4eF9SRUdfSU5KIChkbyBub3QgdXNlIHBhcmFtZXRlcnMNCi0gKiAgICAgICAgICAgICBMTF9BRENfQVdEX0NIQU5ORUx4eF9SRUcgYW5kIExMX0FEQ19BV0RfQ0hBTk5FTHh4X0lOSikNCi0gKiAgICAgICAgICAgLSByZXNvbHV0aW9uOiByZXNvbHV0aW9uIGlzIGxpbWl0ZWQgdG8gOCBiaXRzOiBpZiBBREMgcmVzb2x1dGlvbiBpcw0KLSAqICAgICAgICAgICAgIDEyIGJpdHMgdGhlIDQgTFNCIGFyZSBpZ25vcmVkLCBpZiBBREMgcmVzb2x1dGlvbiBpcyAxMCBiaXRzDQotICogICAgICAgICAgICAgdGhlIDIgTFNCIGFyZSBpZ25vcmVkLg0KLSAqIEBub3RlICAgSWYgQURDIG92ZXJzYW1wbGluZyBpcyBlbmFibGVkLCBBREMgYW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZHMgYXJlDQotICogICAgICAgICBpbXBhY3RlZDogdGhlIGNvbXBhcmlzb24gb2YgYW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZHMgaXMgZG9uZSBvbg0KLSAqICAgICAgICAgb3ZlcnNhbXBsaW5nIGZpbmFsIGNvbXB1dGF0aW9uIChhZnRlciByYXRpbyBhbmQgc2hpZnQgYXBwbGljYXRpb24pOg0KLSAqICAgICAgICAgQURDIGRhdGEgcmVnaXN0ZXIgYml0ZmllbGQgWzE1OjRdICgxMiBtb3N0IHNpZ25pZmljYW50IGJpdHMpLg0KLSAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIG5vdCBjb25kaXRpb25lZCB0bw0KLSAqICAgICAgICAgQURDIHN0YXRlOg0KLSAqICAgICAgICAgQURDIGNhbiBiZSBkaXNhYmxlZCwgZW5hYmxlZCB3aXRoIG9yIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZw0KLSAqICAgICAgICAgb24gZWl0aGVyIEFEQyBncm91cHMgcmVndWxhciBvciBpbmplY3RlZC4NCi0gKiBAcm10b2xsIFRSMSAgICAgIEhUMSAgICAgICAgICAgIExMX0FEQ19TZXRBbmFsb2dXRFRocmVzaG9sZHNcbg0KLSAqICAgICAgICAgVFIyICAgICAgSFQyICAgICAgICAgICAgTExfQURDX1NldEFuYWxvZ1dEVGhyZXNob2xkc1xuDQotICogICAgICAgICBUUjMgICAgICBIVDMgICAgICAgICAgICBMTF9BRENfU2V0QW5hbG9nV0RUaHJlc2hvbGRzXG4NCi0gKiAgICAgICAgIFRSMSAgICAgIExUMSAgICAgICAgICAgIExMX0FEQ19TZXRBbmFsb2dXRFRocmVzaG9sZHNcbg0KLSAqICAgICAgICAgVFIyICAgICAgTFQyICAgICAgICAgICAgTExfQURDX1NldEFuYWxvZ1dEVGhyZXNob2xkc1xuDQotICogICAgICAgICBUUjMgICAgICBMVDMgICAgICAgICAgICBMTF9BRENfU2V0QW5hbG9nV0RUaHJlc2hvbGRzDQotICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQ0KLSAqIEBwYXJhbSAgQVdEeSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0QxDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRDINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEMw0KLSAqIEBwYXJhbSAgQVdEVGhyZXNob2xkc0hpZ2hMb3cgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nDQotICogdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfVEhSRVNIT0xEX0hJR0gNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX1RIUkVTSE9MRF9MT1cNCi0gKiBAcGFyYW0gIEFXRFRocmVzaG9sZFZhbHVlIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMDAgYW5kIE1heF9EYXRhPTB4RkZGDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1NldEFuYWxvZ1dEVGhyZXNob2xkcyhBRENfVHlwZURlZiAqQURDeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEFXRHksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBBV0RUaHJlc2hvbGRzSGlnaExvdywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEFXRFRocmVzaG9sZFZhbHVlKSB7DQotICAvKiBTZXQgYml0cyB3aXRoIGNvbnRlbnQgb2YgcGFyYW1ldGVyICJBV0RUaHJlc2hvbGRWYWx1ZSIgd2l0aCBiaXRzICAgICAgICAgKi8NCi0gIC8qIHBvc2l0aW9uIGluIHJlZ2lzdGVyIGFuZCByZWdpc3RlciBwb3NpdGlvbiBkZXBlbmRpbmcgb24gcGFyYW1ldGVycyAgICAgICAqLw0KLSAgLyogIkFXRFRocmVzaG9sZHNIaWdoTG93IiBhbmQgIkFXRHkiLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAvKiBQYXJhbWV0ZXJzICJBV0R5IiBhbmQgIkFXRFRocmVzaG9sZFZhbHVlIiBhcmUgdXNlZCB3aXRoIG1hc2tzIGJlY2F1c2UgICAgKi8NCi0gIC8qIGNvbnRhaW5pbmcgb3RoZXIgYml0cyByZXNlcnZlZCBmb3Igb3RoZXIgcHVycG9zZS4gICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgX19JTyB1aW50MzJfdCAqcHJlZyA9IF9fQURDX1BUUl9SRUdfT0ZGU0VUKA0KLSAgICAgIEFEQ3gtPlRSMSwNCi0gICAgICAoKEFXRHkgJiBBRENfQVdEX1RSWF9SRUdPRkZTRVRfTUFTSykgPj4gQURDX0FXRF9UUlhfUkVHT0ZGU0VUX1BPUykpOw0KLQ0KLSAgTU9ESUZZX1JFRygqcHJlZywgQVdEVGhyZXNob2xkc0hpZ2hMb3csDQotICAgICAgICAgICAgIEFXRFRocmVzaG9sZFZhbHVlDQotICAgICAgICAgICAgICAgICA8PCAoKEFXRFRocmVzaG9sZHNIaWdoTG93ICYgQURDX0FXRF9UUlhfQklUX0hJR0hfTUFTSykgPj4NCi0gICAgICAgICAgICAgICAgICAgICBBRENfQVdEX1RSWF9CSVRfSElHSF9TSElGVDQpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgQURDIGFuYWxvZyB3YXRjaGRvZyB0aHJlc2hvbGQgdmFsdWUgb2YgdGhyZXNob2xkIGhpZ2gsDQotICogICAgICAgICB0aHJlc2hvbGQgbG93IG9yIHJhdyBkYXRhIHdpdGggQURDIHRocmVzaG9sZHMgaGlnaCBhbmQgbG93DQotICogICAgICAgICBjb25jYXRlbmF0ZWQuDQotICogQG5vdGUgICBJZiByYXcgZGF0YSB3aXRoIEFEQyB0aHJlc2hvbGRzIGhpZ2ggYW5kIGxvdyBpcyByZXRyaWV2ZWQsDQotICogICAgICAgICB0aGUgZGF0YSBvZiBlYWNoIHRocmVzaG9sZCBoaWdoIG9yIGxvdyBjYW4gYmUgaXNvbGF0ZWQNCi0gKiAgICAgICAgIHVzaW5nIGhlbHBlciBtYWNybzoNCi0gKiAgICAgICAgIEByZWYgX19MTF9BRENfQU5BTE9HV0RfVEhSRVNIT0xEU19ISUdIX0xPVygpLg0KLSAqIEBub3RlICAgSW4gY2FzZSBvZiBBREMgcmVzb2x1dGlvbiBkaWZmZXJlbnQgb2YgMTIgYml0cywNCi0gKiAgICAgICAgIGFuYWxvZyB3YXRjaGRvZyB0aHJlc2hvbGRzIGRhdGEgcmVxdWlyZSBhIHNwZWNpZmljIHNoaWZ0Lg0KLSAqICAgICAgICAgVXNlIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0FOQUxPR1dEX0dFVF9USFJFU0hPTERfUkVTT0xVVElPTigpLg0KLSAqIEBybXRvbGwgVFIxICAgICAgSFQxICAgICAgICAgICAgTExfQURDX0dldEFuYWxvZ1dEVGhyZXNob2xkc1xuDQotICogICAgICAgICBUUjIgICAgICBIVDIgICAgICAgICAgICBMTF9BRENfR2V0QW5hbG9nV0RUaHJlc2hvbGRzXG4NCi0gKiAgICAgICAgIFRSMyAgICAgIEhUMyAgICAgICAgICAgIExMX0FEQ19HZXRBbmFsb2dXRFRocmVzaG9sZHNcbg0KLSAqICAgICAgICAgVFIxICAgICAgTFQxICAgICAgICAgICAgTExfQURDX0dldEFuYWxvZ1dEVGhyZXNob2xkc1xuDQotICogICAgICAgICBUUjIgICAgICBMVDIgICAgICAgICAgICBMTF9BRENfR2V0QW5hbG9nV0RUaHJlc2hvbGRzXG4NCi0gKiAgICAgICAgIFRSMyAgICAgIExUMyAgICAgICAgICAgIExMX0FEQ19HZXRBbmFsb2dXRFRocmVzaG9sZHMNCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHBhcmFtICBBV0R5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRDENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0QzDQotICogQHBhcmFtICBBV0RUaHJlc2hvbGRzSGlnaExvdyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcNCi0gKiB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9USFJFU0hPTERfSElHSA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfVEhSRVNIT0xEX0xPVw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfVEhSRVNIT0xEU19ISUdIX0xPVw0KLSAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMCBhbmQgTWF4X0RhdGE9MHhGRkYNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0dldEFuYWxvZ1dEVGhyZXNob2xkcygNCi0gICAgQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IEFXRHksIHVpbnQzMl90IEFXRFRocmVzaG9sZHNIaWdoTG93KSB7DQotICBjb25zdCBfX0lPIHVpbnQzMl90ICpwcmVnID0gX19BRENfUFRSX1JFR19PRkZTRVQoDQotICAgICAgQURDeC0+VFIxLA0KLSAgICAgICgoQVdEeSAmIEFEQ19BV0RfVFJYX1JFR09GRlNFVF9NQVNLKSA+PiBBRENfQVdEX1RSWF9SRUdPRkZTRVRfUE9TKSk7DQotDQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVCgqcHJlZywgKEFXRFRocmVzaG9sZHNIaWdoTG93IHwgQURDX1RSMV9MVDEpKSA+Pg0KLSAgICAgICAgICAgICAgICAgICAgKCgoQVdEVGhyZXNob2xkc0hpZ2hMb3cgJiBBRENfQVdEX1RSWF9CSVRfSElHSF9NQVNLKSA+Pg0KLSAgICAgICAgICAgICAgICAgICAgICBBRENfQVdEX1RSWF9CSVRfSElHSF9TSElGVDQpICYNCi0gICAgICAgICAgICAgICAgICAgICB+KEFXRFRocmVzaG9sZHNIaWdoTG93ICYgQURDX1RSMV9MVDEpKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IEFEQyBhbmFsb2cgd2F0Y2hkb2cgZmlsdGVyaW5nIGNvbmZpZ3VyYXRpb24NCi0gKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bw0KLSAqICAgICAgICAgQURDIHN0YXRlOg0KLSAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcNCi0gKiAgICAgICAgIG9uIGVpdGhlciBncm91cHMgcmVndWxhciBvciBpbmplY3RlZC4NCi0gKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCB0aGlzIGZlYXR1cmUgaXMgb25seSBhdmFpbGFibGUgb24gZmlyc3QNCi0gKiAgICAgICAgIGFuYWxvZyB3YXRjaGRvZyAoQVdEMSkNCi0gKiBAcm10b2xsIFRSMSAgICAgIEFXREZJTFQgICAgICAgIExMX0FEQ19TZXRBV0RGaWx0ZXJpbmdDb25maWd1cmF0aW9uDQotICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQ0KLSAqIEBwYXJhbSAgQVdEeSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0QxDQotICogQHBhcmFtICBGaWx0ZXJpbmdDb25maWcgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0ZJTFRFUklOR19OT05FDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9GSUxURVJJTkdfMlNBTVBMRVMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0ZJTFRFUklOR18zU0FNUExFUw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfRklMVEVSSU5HXzRTQU1QTEVTDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9GSUxURVJJTkdfNVNBTVBMRVMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0ZJTFRFUklOR182U0FNUExFUw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfRklMVEVSSU5HXzdTQU1QTEVTDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9GSUxURVJJTkdfOFNBTVBMRVMNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfU2V0QVdERmlsdGVyaW5nQ29uZmlndXJhdGlvbigNCi0gICAgQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IEFXRHksIHVpbnQzMl90IEZpbHRlcmluZ0NvbmZpZykgew0KLSAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLw0KLSAgKHZvaWQpKEFXRHkpOw0KLSAgTU9ESUZZX1JFRyhBREN4LT5UUjEsIEFEQ19UUjFfQVdERklMVCwgRmlsdGVyaW5nQ29uZmlnKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgQURDIGFuYWxvZyB3YXRjaGRvZyBmaWx0ZXJpbmcgY29uZmlndXJhdGlvbg0KLSAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIHRoaXMgZmVhdHVyZSBpcyBvbmx5IGF2YWlsYWJsZSBvbiBmaXJzdA0KLSAqICAgICAgICAgYW5hbG9nIHdhdGNoZG9nIChBV0QxKQ0KLSAqIEBybXRvbGwgVFIxICAgICAgQVdERklMVCAgICAgICAgTExfQURDX0dldEFXREZpbHRlcmluZ0NvbmZpZ3VyYXRpb24NCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHBhcmFtICBBV0R5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRDENCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZToNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0ZJTFRFUklOR19OT05FDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9GSUxURVJJTkdfMlNBTVBMRVMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0ZJTFRFUklOR18zU0FNUExFUw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfRklMVEVSSU5HXzRTQU1QTEVTDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9GSUxURVJJTkdfNVNBTVBMRVMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0ZJTFRFUklOR182U0FNUExFUw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfRklMVEVSSU5HXzdTQU1QTEVTDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9GSUxURVJJTkdfOFNBTVBMRVMNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0dldEFXREZpbHRlcmluZ0NvbmZpZ3VyYXRpb24oQURDX1R5cGVEZWYgKkFEQ3gsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEFXRHkpIHsNCi0gIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8NCi0gICh2b2lkKShBV0R5KTsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEFEQ3gtPlRSMSwgQURDX1RSMV9BV0RGSUxUKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBBRENfTExfRUZfQ29uZmlndXJhdGlvbl9BRENfb3ZlcnNhbXBsaW5nIENvbmZpZ3VyYXRpb24gb2YgQURDDQotICogdHJhbnN2ZXJzYWwgc2NvcGU6IG92ZXJzYW1wbGluZw0KLSAqIEB7DQotICovDQotDQotLyoqDQotICogQGJyaWVmICBTZXQgQURDIG92ZXJzYW1wbGluZyBzY29wZTogQURDIGdyb3VwcyByZWd1bGFyIGFuZC1vciBpbmplY3RlZA0KLSAqICAgICAgICAgKGF2YWlsYWJpbGl0eSBvZiBBREMgZ3JvdXAgaW5qZWN0ZWQgZGVwZW5kcyBvbiBTVE0zMiBmYW1pbGllcykuDQotICogQG5vdGUgICBJZiBib3RoIGdyb3VwcyByZWd1bGFyIGFuZCBpbmplY3RlZCBhcmUgc2VsZWN0ZWQsDQotICogICAgICAgICBzcGVjaWZ5IGJlaGF2aW9yIG9mIEFEQyBncm91cCBpbmplY3RlZCBpbnRlcnJ1cHRpbmcNCi0gKiAgICAgICAgIGdyb3VwIHJlZ3VsYXI6IHdoZW4gQURDIGdyb3VwIGluamVjdGVkIGlzIHRyaWdnZXJlZCwNCi0gKiAgICAgICAgIHRoZSBvdmVyc2FtcGxpbmcgb24gQURDIGdyb3VwIHJlZ3VsYXIgaXMgZWl0aGVyDQotICogICAgICAgICB0ZW1wb3Jhcnkgc3RvcHBlZCBhbmQgY29udGludWVkLCBvciByZXN1bWVkIGZyb20gc3RhcnQNCi0gKiAgICAgICAgIChvdmVyc2FtcGxlciBidWZmZXIgcmVzZXQpLg0KLSAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvDQotICogICAgICAgICBBREMgc3RhdGU6DQotICogICAgICAgICBBREMgbXVzdCBiZSBkaXNhYmxlZCBvciBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZw0KLSAqICAgICAgICAgb24gZWl0aGVyIGdyb3VwcyByZWd1bGFyIG9yIGluamVjdGVkLg0KLSAqIEBybXRvbGwgQ0ZHUjIgICAgUk9WU0UgICAgICAgICAgTExfQURDX1NldE92ZXJTYW1wbGluZ1Njb3BlXG4NCi0gKiAgICAgICAgIENGR1IyICAgIEpPVlNFICAgICAgICAgIExMX0FEQ19TZXRPdmVyU2FtcGxpbmdTY29wZVxuDQotICogICAgICAgICBDRkdSMiAgICBST1ZTTSAgICAgICAgICBMTF9BRENfU2V0T3ZlclNhbXBsaW5nU2NvcGUNCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHBhcmFtICBPdnNTY29wZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfRElTQUJMRQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfR1JQX1JFR1VMQVJfQ09OVElOVUVEDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19HUlBfUkVHVUxBUl9SRVNVTUVEDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19HUlBfSU5KRUNURUQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX0dSUF9JTkpfUkVHX1JFU1VNRUQNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfU2V0T3ZlclNhbXBsaW5nU2NvcGUoQURDX1R5cGVEZWYgKkFEQ3gsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE92c1Njb3BlKSB7DQotICBNT0RJRllfUkVHKEFEQ3gtPkNGR1IyLCBBRENfQ0ZHUjJfUk9WU0UgfCBBRENfQ0ZHUjJfSk9WU0UgfCBBRENfQ0ZHUjJfUk9WU00sDQotICAgICAgICAgICAgIE92c1Njb3BlKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgQURDIG92ZXJzYW1wbGluZyBzY29wZTogQURDIGdyb3VwcyByZWd1bGFyIGFuZC1vciBpbmplY3RlZA0KLSAqICAgICAgICAgKGF2YWlsYWJpbGl0eSBvZiBBREMgZ3JvdXAgaW5qZWN0ZWQgZGVwZW5kcyBvbiBTVE0zMiBmYW1pbGllcykuDQotICogQG5vdGUgICBJZiBib3RoIGdyb3VwcyByZWd1bGFyIGFuZCBpbmplY3RlZCBhcmUgc2VsZWN0ZWQsDQotICogICAgICAgICBzcGVjaWZ5IGJlaGF2aW9yIG9mIEFEQyBncm91cCBpbmplY3RlZCBpbnRlcnJ1cHRpbmcNCi0gKiAgICAgICAgIGdyb3VwIHJlZ3VsYXI6IHdoZW4gQURDIGdyb3VwIGluamVjdGVkIGlzIHRyaWdnZXJlZCwNCi0gKiAgICAgICAgIHRoZSBvdmVyc2FtcGxpbmcgb24gQURDIGdyb3VwIHJlZ3VsYXIgaXMgZWl0aGVyDQotICogICAgICAgICB0ZW1wb3Jhcnkgc3RvcHBlZCBhbmQgY29udGludWVkLCBvciByZXN1bWVkIGZyb20gc3RhcnQNCi0gKiAgICAgICAgIChvdmVyc2FtcGxlciBidWZmZXIgcmVzZXQpLg0KLSAqIEBybXRvbGwgQ0ZHUjIgICAgUk9WU0UgICAgICAgICAgTExfQURDX0dldE92ZXJTYW1wbGluZ1Njb3BlXG4NCi0gKiAgICAgICAgIENGR1IyICAgIEpPVlNFICAgICAgICAgIExMX0FEQ19HZXRPdmVyU2FtcGxpbmdTY29wZVxuDQotICogICAgICAgICBDRkdSMiAgICBST1ZTTSAgICAgICAgICBMTF9BRENfR2V0T3ZlclNhbXBsaW5nU2NvcGUNCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfRElTQUJMRQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfR1JQX1JFR1VMQVJfQ09OVElOVUVEDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19HUlBfUkVHVUxBUl9SRVNVTUVEDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19HUlBfSU5KRUNURUQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX0dSUF9JTkpfUkVHX1JFU1VNRUQNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0dldE92ZXJTYW1wbGluZ1Njb3BlKEFEQ19UeXBlRGVmICpBREN4KSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVCgNCi0gICAgICBBREN4LT5DRkdSMiwgQURDX0NGR1IyX1JPVlNFIHwgQURDX0NGR1IyX0pPVlNFIHwgQURDX0NGR1IyX1JPVlNNKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IEFEQyBvdmVyc2FtcGxpbmcgZGlzY29udGludW91cyBtb2RlICh0cmlnZ2VyZWQgbW9kZSkNCi0gKiAgICAgICAgIG9uIHRoZSBzZWxlY3RlZCBBREMgZ3JvdXAuDQotICogQG5vdGUgICBOdW1iZXIgb2Ygb3ZlcnNhbXBsZWQgY29udmVyc2lvbnMgYXJlIGRvbmUgZWl0aGVyIGluOg0KLSAqICAgICAgICAgLSBjb250aW51b3VzIG1vZGUgKGFsbCBjb252ZXJzaW9ucyBvZiBvdmVyc2FtcGxpbmcgcmF0aW8NCi0gKiAgICAgICAgICAgYXJlIGRvbmUgZnJvbSAxIHRyaWdnZXIpDQotICogICAgICAgICAtIGRpc2NvbnRpbnVvdXMgbW9kZSAoZWFjaCBjb252ZXJzaW9uIG9mIG92ZXJzYW1wbGluZyByYXRpbw0KLSAqICAgICAgICAgICBuZWVkcyBhIHRyaWdnZXIpDQotICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllcywgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8NCi0gKiAgICAgICAgIEFEQyBzdGF0ZToNCi0gKiAgICAgICAgIEFEQyBtdXN0IGJlIGRpc2FibGVkIG9yIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nDQotICogICAgICAgICBvbiBncm91cCByZWd1bGFyLg0KLSAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIG92ZXJzYW1wbGluZyBkaXNjb250aW51b3VzIG1vZGUNCi0gKiAgICAgICAgICh0cmlnZ2VyZWQgbW9kZSkgY2FuIGJlIHVzZWQgb25seSB3aGVuIG92ZXJzYW1wbGluZyBpcw0KLSAqICAgICAgICAgc2V0IG9uIGdyb3VwIHJlZ3VsYXIgb25seSBhbmQgaW4gcmVzdW1lZCBtb2RlLg0KLSAqIEBybXRvbGwgQ0ZHUjIgICAgVFJPVlMgICAgICAgICAgTExfQURDX1NldE92ZXJTYW1wbGluZ0Rpc2NvbnQNCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHBhcmFtICBPdmVyU2FtcGxpbmdEaXNjb250IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZw0KLSAqIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1JFR19DT05UDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19SRUdfRElTQ09OVA0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19TZXRPdmVyU2FtcGxpbmdEaXNjb250KA0KLSAgICBBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgT3ZlclNhbXBsaW5nRGlzY29udCkgew0KLSAgTU9ESUZZX1JFRyhBREN4LT5DRkdSMiwgQURDX0NGR1IyX1RST1ZTLCBPdmVyU2FtcGxpbmdEaXNjb250KTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgQURDIG92ZXJzYW1wbGluZyBkaXNjb250aW51b3VzIG1vZGUgKHRyaWdnZXJlZCBtb2RlKQ0KLSAqICAgICAgICAgb24gdGhlIHNlbGVjdGVkIEFEQyBncm91cC4NCi0gKiBAbm90ZSAgIE51bWJlciBvZiBvdmVyc2FtcGxlZCBjb252ZXJzaW9ucyBhcmUgZG9uZSBlaXRoZXIgaW46DQotICogICAgICAgICAtIGNvbnRpbnVvdXMgbW9kZSAoYWxsIGNvbnZlcnNpb25zIG9mIG92ZXJzYW1wbGluZyByYXRpbw0KLSAqICAgICAgICAgICBhcmUgZG9uZSBmcm9tIDEgdHJpZ2dlcikNCi0gKiAgICAgICAgIC0gZGlzY29udGludW91cyBtb2RlIChlYWNoIGNvbnZlcnNpb24gb2Ygb3ZlcnNhbXBsaW5nIHJhdGlvDQotICogICAgICAgICAgIG5lZWRzIGEgdHJpZ2dlcikNCi0gKiBAcm10b2xsIENGR1IyICAgIFRST1ZTICAgICAgICAgIExMX0FEQ19HZXRPdmVyU2FtcGxpbmdEaXNjb250DQotICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1JFR19DT05UDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19SRUdfRElTQ09OVA0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfR2V0T3ZlclNhbXBsaW5nRGlzY29udChBRENfVHlwZURlZiAqQURDeCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeC0+Q0ZHUjIsIEFEQ19DRkdSMl9UUk9WUykpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCBBREMgb3ZlcnNhbXBsaW5nDQotICogICAgICAgICAoaW1wYWN0aW5nIGJvdGggQURDIGdyb3VwcyByZWd1bGFyIGFuZCBpbmplY3RlZCkNCi0gKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gc2V0IHRoZSAyIGl0ZW1zIG9mIG92ZXJzYW1wbGluZyBjb25maWd1cmF0aW9uOg0KLSAqICAgICAgICAgLSByYXRpbw0KLSAqICAgICAgICAgLSBzaGlmdA0KLSAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvDQotICogICAgICAgICBBREMgc3RhdGU6DQotICogICAgICAgICBBREMgbXVzdCBiZSBkaXNhYmxlZCBvciBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZw0KLSAqICAgICAgICAgb24gZWl0aGVyIGdyb3VwcyByZWd1bGFyIG9yIGluamVjdGVkLg0KLSAqIEBybXRvbGwgQ0ZHUjIgICAgT1ZTUyAgICAgICAgICAgTExfQURDX0NvbmZpZ092ZXJTYW1wbGluZ1JhdGlvU2hpZnRcbg0KLSAqICAgICAgICAgQ0ZHUjIgICAgT1ZTUiAgICAgICAgICAgTExfQURDX0NvbmZpZ092ZXJTYW1wbGluZ1JhdGlvU2hpZnQNCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHBhcmFtICBSYXRpbyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfUkFUSU9fMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfUkFUSU9fNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfUkFUSU9fOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfUkFUSU9fMTYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1JBVElPXzMyDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19SQVRJT182NA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfUkFUSU9fMTI4DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19SQVRJT18yNTYNCi0gKiBAcGFyYW0gIFNoaWZ0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19TSElGVF9OT05FDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19TSElGVF9SSUdIVF8xDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19TSElGVF9SSUdIVF8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19TSElGVF9SSUdIVF8zDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19TSElGVF9SSUdIVF80DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19TSElGVF9SSUdIVF81DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19TSElGVF9SSUdIVF82DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19TSElGVF9SSUdIVF83DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19TSElGVF9SSUdIVF84DQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0NvbmZpZ092ZXJTYW1wbGluZ1JhdGlvU2hpZnQoQURDX1R5cGVEZWYgKkFEQ3gsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUmF0aW8sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgU2hpZnQpIHsNCi0gIE1PRElGWV9SRUcoQURDeC0+Q0ZHUjIsIChBRENfQ0ZHUjJfT1ZTUyB8IEFEQ19DRkdSMl9PVlNSKSwgKFNoaWZ0IHwgUmF0aW8pKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgQURDIG92ZXJzYW1wbGluZyByYXRpbw0KLSAqICAgICAgICAoaW1wYWN0aW5nIGJvdGggQURDIGdyb3VwcyByZWd1bGFyIGFuZCBpbmplY3RlZCkNCi0gKiBAcm10b2xsIENGR1IyICAgIE9WU1IgICAgICAgICAgIExMX0FEQ19HZXRPdmVyU2FtcGxpbmdSYXRpbw0KLSAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIFJhdGlvIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19SQVRJT18yDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19SQVRJT180DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19SQVRJT184DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19SQVRJT18xNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfUkFUSU9fMzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1JBVElPXzY0DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19SQVRJT18xMjgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1JBVElPXzI1Ng0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfR2V0T3ZlclNhbXBsaW5nUmF0aW8oQURDX1R5cGVEZWYgKkFEQ3gpIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEFEQ3gtPkNGR1IyLCBBRENfQ0ZHUjJfT1ZTUikpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBBREMgb3ZlcnNhbXBsaW5nIHNoaWZ0DQotICogICAgICAgIChpbXBhY3RpbmcgYm90aCBBREMgZ3JvdXBzIHJlZ3VsYXIgYW5kIGluamVjdGVkKQ0KLSAqIEBybXRvbGwgQ0ZHUjIgICAgT1ZTUyAgICAgICAgICAgTExfQURDX0dldE92ZXJTYW1wbGluZ1NoaWZ0DQotICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgU2hpZnQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1NISUZUX05PTkUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzgNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0dldE92ZXJTYW1wbGluZ1NoaWZ0KEFEQ19UeXBlRGVmICpBREN4KSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChBREN4LT5DRkdSMiwgQURDX0NGR1IyX09WU1MpKTsNCi19DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEFEQ19MTF9FRl9Db25maWd1cmF0aW9uX0FEQ19NdWx0aW1vZGUgQ29uZmlndXJhdGlvbiBvZiBBREMNCi0gKiBoaWVyYXJjaGljYWwgc2NvcGU6IG11bHRpbW9kZQ0KLSAqIEB7DQotICovDQotDQotI2lmIGRlZmluZWQoQURDX01VTFRJTU9ERV9TVVBQT1JUKQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IEFEQyBtdWx0aW1vZGUgY29uZmlndXJhdGlvbiB0byBvcGVyYXRlIGluIGluZGVwZW5kZW50IG1vZGUNCi0gKiAgICAgICAgIG9yIG11bHRpbW9kZSAoZm9yIGRldmljZXMgd2l0aCBzZXZlcmFsIEFEQyBpbnN0YW5jZXMpLg0KLSAqIEBub3RlICAgSWYgbXVsdGltb2RlIGNvbmZpZ3VyYXRpb246IHRoZSBzZWxlY3RlZCBBREMgaW5zdGFuY2UgaXMNCi0gKiAgICAgICAgIGVpdGhlciBtYXN0ZXIgb3Igc2xhdmUgZGVwZW5kaW5nIG9uIGhhcmR3YXJlLg0KLSAqICAgICAgICAgUmVmZXIgdG8gcmVmZXJlbmNlIG1hbnVhbC4NCi0gKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bw0KLSAqICAgICAgICAgQURDIHN0YXRlOg0KLSAqICAgICAgICAgQWxsIEFEQyBpbnN0YW5jZXMgb2YgdGhlIEFEQyBjb21tb24gZ3JvdXAgbXVzdCBiZSBkaXNhYmxlZC4NCi0gKiAgICAgICAgIFRoaXMgY2hlY2sgY2FuIGJlIGRvbmUgd2l0aCBmdW5jdGlvbiBAcmVmIExMX0FEQ19Jc0VuYWJsZWQoKSBmb3IgZWFjaA0KLSAqICAgICAgICAgQURDIGluc3RhbmNlIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybw0KLSAqICAgICAgICAgQHJlZiBfX0xMX0FEQ19JU19FTkFCTEVEX0FMTF9DT01NT05fSU5TVEFOQ0UoKS4NCi0gKiBAcm10b2xsIENDUiAgICAgIERVQUwgICAgICAgICAgIExMX0FEQ19TZXRNdWx0aW1vZGUNCi0gKiBAcGFyYW0gIEFEQ3h5X0NPTU1PTiBBREMgY29tbW9uIGluc3RhbmNlDQotICogICAgICAgICAoY2FuIGJlIHNldCBkaXJlY3RseSBmcm9tIENNU0lTIGRlZmluaXRpb24gb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvDQotICogQHJlZiBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoKSApDQotICogQHBhcmFtICBNdWx0aW1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfSU5ERVBFTkRFTlQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfRFVBTF9SRUdfU0lNVUxUDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX0RVQUxfUkVHX0lOVEVSTA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19NVUxUSV9EVUFMX0lOSl9TSU1VTFQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfRFVBTF9JTkpfQUxURVJODQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX0RVQUxfUkVHX1NJTV9JTkpfU0lNDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX0RVQUxfUkVHX1NJTV9JTkpfQUxUDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX0RVQUxfUkVHX0lOVF9JTkpfU0lNDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1NldE11bHRpbW9kZShBRENfQ29tbW9uX1R5cGVEZWYgKkFEQ3h5X0NPTU1PTiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE11bHRpbW9kZSkgew0KLSAgTU9ESUZZX1JFRyhBREN4eV9DT01NT04tPkNDUiwgQURDX0NDUl9EVUFMLCBNdWx0aW1vZGUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBBREMgbXVsdGltb2RlIGNvbmZpZ3VyYXRpb24gdG8gb3BlcmF0ZSBpbiBpbmRlcGVuZGVudCBtb2RlDQotICogICAgICAgICBvciBtdWx0aW1vZGUgKGZvciBkZXZpY2VzIHdpdGggc2V2ZXJhbCBBREMgaW5zdGFuY2VzKS4NCi0gKiBAbm90ZSAgIElmIG11bHRpbW9kZSBjb25maWd1cmF0aW9uOiB0aGUgc2VsZWN0ZWQgQURDIGluc3RhbmNlIGlzDQotICogICAgICAgICBlaXRoZXIgbWFzdGVyIG9yIHNsYXZlIGRlcGVuZGluZyBvbiBoYXJkd2FyZS4NCi0gKiAgICAgICAgIFJlZmVyIHRvIHJlZmVyZW5jZSBtYW51YWwuDQotICogQHJtdG9sbCBDQ1IgICAgICBEVUFMICAgICAgICAgICBMTF9BRENfR2V0TXVsdGltb2RlDQotICogQHBhcmFtICBBREN4eV9DT01NT04gQURDIGNvbW1vbiBpbnN0YW5jZQ0KLSAqICAgICAgICAgKGNhbiBiZSBzZXQgZGlyZWN0bHkgZnJvbSBDTVNJUyBkZWZpbml0aW9uIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybw0KLSAqIEByZWYgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKCkgKQ0KLSAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfSU5ERVBFTkRFTlQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfRFVBTF9SRUdfU0lNVUxUDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX0RVQUxfUkVHX0lOVEVSTA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19NVUxUSV9EVUFMX0lOSl9TSU1VTFQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfRFVBTF9JTkpfQUxURVJODQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX0RVQUxfUkVHX1NJTV9JTkpfU0lNDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX0RVQUxfUkVHX1NJTV9JTkpfQUxUDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX0RVQUxfUkVHX0lOVF9JTkpfU0lNDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19HZXRNdWx0aW1vZGUoQURDX0NvbW1vbl9UeXBlRGVmICpBREN4eV9DT01NT04pIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEFEQ3h5X0NPTU1PTi0+Q0NSLCBBRENfQ0NSX0RVQUwpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZXQgQURDIG11bHRpbW9kZSBjb252ZXJzaW9uIGRhdGEgdHJhbnNmZXI6IG5vIHRyYW5zZmVyDQotICogICAgICAgICBvciB0cmFuc2ZlciBieSBETUEuDQotICogQG5vdGUgICBJZiBBREMgbXVsdGltb2RlIHRyYW5zZmVyIGJ5IERNQSBpcyBub3Qgc2VsZWN0ZWQ6DQotICogICAgICAgICBlYWNoIEFEQyB1c2VzIGl0cyBvd24gRE1BIGNoYW5uZWwsIHdpdGggaXRzIGluZGl2aWR1YWwNCi0gKiAgICAgICAgIERNQSB0cmFuc2ZlciBzZXR0aW5ncy4NCi0gKiAgICAgICAgIElmIEFEQyBtdWx0aW1vZGUgdHJhbnNmZXIgYnkgRE1BIGlzIHNlbGVjdGVkOg0KLSAqICAgICAgICAgT25lIERNQSBjaGFubmVsIGlzIHVzZWQgZm9yIGJvdGggQURDIChETUEgb2YgQURDIG1hc3RlcikNCi0gKiAgICAgICAgIFNwZWNpZmllcyB0aGUgRE1BIHJlcXVlc3RzIG1vZGU6DQotICogICAgICAgICAtIExpbWl0ZWQgbW9kZSAoT25lIHNob3QgbW9kZSk6IERNQSB0cmFuc2ZlciByZXF1ZXN0cyBhcmUgc3RvcHBlZA0KLSAqICAgICAgICAgICB3aGVuIG51bWJlciBvZiBETUEgZGF0YSB0cmFuc2ZlcnMgKG51bWJlciBvZg0KLSAqICAgICAgICAgICBBREMgY29udmVyc2lvbnMpIGlzIHJlYWNoZWQuDQotICogICAgICAgICAgIFRoaXMgQURDIG1vZGUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoIERNQSBtb2RlIG5vbi1jaXJjdWxhci4NCi0gKiAgICAgICAgIC0gVW5saW1pdGVkIG1vZGU6IERNQSB0cmFuc2ZlciByZXF1ZXN0cyBhcmUgdW5saW1pdGVkLA0KLSAqICAgICAgICAgICB3aGF0ZXZlciBudW1iZXIgb2YgRE1BIGRhdGEgdHJhbnNmZXJzIChudW1iZXIgb2YNCi0gKiAgICAgICAgICAgQURDIGNvbnZlcnNpb25zKS4NCi0gKiAgICAgICAgICAgVGhpcyBBREMgbW9kZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHdpdGggRE1BIG1vZGUgY2lyY3VsYXIuDQotICogQG5vdGUgICBJZiBBREMgRE1BIHJlcXVlc3RzIG1vZGUgaXMgc2V0IHRvIHVubGltaXRlZCBhbmQgRE1BIGlzIHNldCB0bw0KLSAqICAgICAgICAgbW9kZSBub24tY2lyY3VsYXI6DQotICogICAgICAgICB3aGVuIERNQSB0cmFuc2ZlcnMgc2l6ZSB3aWxsIGJlIHJlYWNoZWQsIERNQSB3aWxsIHN0b3AgdHJhbnNmZXJzIG9mDQotICogICAgICAgICBBREMgY29udmVyc2lvbnMgZGF0YSBBREMgd2lsbCByYWlzZSBhbiBvdmVycnVuIGVycm9yDQotICogICAgICAgICAob3ZlcnJ1biBmbGFnIGFuZCBpbnRlcnJ1cHRpb24gaWYgZW5hYmxlZCkuDQotICogQG5vdGUgICBIb3cgdG8gcmV0cmlldmUgbXVsdGltb2RlIGNvbnZlcnNpb24gZGF0YToNCi0gKiAgICAgICAgIFdoYXRldmVyIG11bHRpbW9kZSB0cmFuc2ZlciBieSBETUEgc2V0dGluZzogdXNpbmcgZnVuY3Rpb24NCi0gKiAgICAgICAgIEByZWYgTExfQURDX1JFR19SZWFkTXVsdGlDb252ZXJzaW9uRGF0YTMyKCkuDQotICogICAgICAgICBJZiBBREMgbXVsdGltb2RlIHRyYW5zZmVyIGJ5IERNQSBpcyBzZWxlY3RlZDogY29udmVyc2lvbiBkYXRhDQotICogICAgICAgICBpcyBhIHJhdyBkYXRhIHdpdGggQURDIG1hc3RlciBhbmQgc2xhdmUgY29uY2F0ZW5hdGVkLg0KLSAqICAgICAgICAgQSBtYWNybyBpcyBhdmFpbGFibGUgdG8gZ2V0IHRoZSBjb252ZXJzaW9uIGRhdGEgb2YNCi0gKiAgICAgICAgIEFEQyBtYXN0ZXIgb3IgQURDIHNsYXZlOiBzZWUgaGVscGVyIG1hY3JvDQotICogICAgICAgICBAcmVmIF9fTExfQURDX01VTFRJX0NPTlZfREFUQV9NQVNURVJfU0xBVkUoKS4NCi0gKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bw0KLSAqICAgICAgICAgQURDIHN0YXRlOg0KLSAqICAgICAgICAgQWxsIEFEQyBpbnN0YW5jZXMgb2YgdGhlIEFEQyBjb21tb24gZ3JvdXAgbXVzdCBiZSBkaXNhYmxlZA0KLSAqICAgICAgICAgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcgb24gZ3JvdXAgcmVndWxhci4NCi0gKiBAcm10b2xsIENDUiAgICAgIE1ETUEgICAgICAgICAgIExMX0FEQ19TZXRNdWx0aURNQVRyYW5zZmVyXG4NCi0gKiAgICAgICAgIENDUiAgICAgIERNQUNGRyAgICAgICAgIExMX0FEQ19TZXRNdWx0aURNQVRyYW5zZmVyDQotICogQHBhcmFtICBBREN4eV9DT01NT04gQURDIGNvbW1vbiBpbnN0YW5jZQ0KLSAqICAgICAgICAgKGNhbiBiZSBzZXQgZGlyZWN0bHkgZnJvbSBDTVNJUyBkZWZpbml0aW9uIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybw0KLSAqIEByZWYgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKCkgKQ0KLSAqIEBwYXJhbSAgTXVsdGlETUFUcmFuc2ZlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19NVUxUSV9SRUdfRE1BX0VBQ0hfQURDDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX1JFR19ETUFfTElNSVRfUkVTMTJfMTBCDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX1JFR19ETUFfTElNSVRfUkVTOF82Qg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19NVUxUSV9SRUdfRE1BX1VOTE1UX1JFUzEyXzEwQg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19NVUxUSV9SRUdfRE1BX1VOTE1UX1JFUzhfNkINCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfU2V0TXVsdGlETUFUcmFuc2ZlcigNCi0gICAgQURDX0NvbW1vbl9UeXBlRGVmICpBREN4eV9DT01NT04sIHVpbnQzMl90IE11bHRpRE1BVHJhbnNmZXIpIHsNCi0gIE1PRElGWV9SRUcoQURDeHlfQ09NTU9OLT5DQ1IsIEFEQ19DQ1JfTURNQSB8IEFEQ19DQ1JfRE1BQ0ZHLA0KLSAgICAgICAgICAgICBNdWx0aURNQVRyYW5zZmVyKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgQURDIG11bHRpbW9kZSBjb252ZXJzaW9uIGRhdGEgdHJhbnNmZXI6IG5vIHRyYW5zZmVyDQotICogICAgICAgICBvciB0cmFuc2ZlciBieSBETUEuDQotICogQG5vdGUgICBJZiBBREMgbXVsdGltb2RlIHRyYW5zZmVyIGJ5IERNQSBpcyBub3Qgc2VsZWN0ZWQ6DQotICogICAgICAgICBlYWNoIEFEQyB1c2VzIGl0cyBvd24gRE1BIGNoYW5uZWwsIHdpdGggaXRzIGluZGl2aWR1YWwNCi0gKiAgICAgICAgIERNQSB0cmFuc2ZlciBzZXR0aW5ncy4NCi0gKiAgICAgICAgIElmIEFEQyBtdWx0aW1vZGUgdHJhbnNmZXIgYnkgRE1BIGlzIHNlbGVjdGVkOg0KLSAqICAgICAgICAgT25lIERNQSBjaGFubmVsIGlzIHVzZWQgZm9yIGJvdGggQURDIChETUEgb2YgQURDIG1hc3RlcikNCi0gKiAgICAgICAgIFNwZWNpZmllcyB0aGUgRE1BIHJlcXVlc3RzIG1vZGU6DQotICogICAgICAgICAtIExpbWl0ZWQgbW9kZSAoT25lIHNob3QgbW9kZSk6IERNQSB0cmFuc2ZlciByZXF1ZXN0cyBhcmUgc3RvcHBlZA0KLSAqICAgICAgICAgICB3aGVuIG51bWJlciBvZiBETUEgZGF0YSB0cmFuc2ZlcnMgKG51bWJlciBvZg0KLSAqICAgICAgICAgICBBREMgY29udmVyc2lvbnMpIGlzIHJlYWNoZWQuDQotICogICAgICAgICAgIFRoaXMgQURDIG1vZGUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoIERNQSBtb2RlIG5vbi1jaXJjdWxhci4NCi0gKiAgICAgICAgIC0gVW5saW1pdGVkIG1vZGU6IERNQSB0cmFuc2ZlciByZXF1ZXN0cyBhcmUgdW5saW1pdGVkLA0KLSAqICAgICAgICAgICB3aGF0ZXZlciBudW1iZXIgb2YgRE1BIGRhdGEgdHJhbnNmZXJzIChudW1iZXIgb2YNCi0gKiAgICAgICAgICAgQURDIGNvbnZlcnNpb25zKS4NCi0gKiAgICAgICAgICAgVGhpcyBBREMgbW9kZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHdpdGggRE1BIG1vZGUgY2lyY3VsYXIuDQotICogQG5vdGUgICBJZiBBREMgRE1BIHJlcXVlc3RzIG1vZGUgaXMgc2V0IHRvIHVubGltaXRlZCBhbmQgRE1BIGlzIHNldCB0bw0KLSAqICAgICAgICAgbW9kZSBub24tY2lyY3VsYXI6DQotICogICAgICAgICB3aGVuIERNQSB0cmFuc2ZlcnMgc2l6ZSB3aWxsIGJlIHJlYWNoZWQsIERNQSB3aWxsIHN0b3AgdHJhbnNmZXJzIG9mDQotICogICAgICAgICBBREMgY29udmVyc2lvbnMgZGF0YSBBREMgd2lsbCByYWlzZSBhbiBvdmVycnVuIGVycm9yDQotICogICAgICAgICAob3ZlcnJ1biBmbGFnIGFuZCBpbnRlcnJ1cHRpb24gaWYgZW5hYmxlZCkuDQotICogQG5vdGUgICBIb3cgdG8gcmV0cmlldmUgbXVsdGltb2RlIGNvbnZlcnNpb24gZGF0YToNCi0gKiAgICAgICAgIFdoYXRldmVyIG11bHRpbW9kZSB0cmFuc2ZlciBieSBETUEgc2V0dGluZzogdXNpbmcgZnVuY3Rpb24NCi0gKiAgICAgICAgIEByZWYgTExfQURDX1JFR19SZWFkTXVsdGlDb252ZXJzaW9uRGF0YTMyKCkuDQotICogICAgICAgICBJZiBBREMgbXVsdGltb2RlIHRyYW5zZmVyIGJ5IERNQSBpcyBzZWxlY3RlZDogY29udmVyc2lvbiBkYXRhDQotICogICAgICAgICBpcyBhIHJhdyBkYXRhIHdpdGggQURDIG1hc3RlciBhbmQgc2xhdmUgY29uY2F0ZW5hdGVkLg0KLSAqICAgICAgICAgQSBtYWNybyBpcyBhdmFpbGFibGUgdG8gZ2V0IHRoZSBjb252ZXJzaW9uIGRhdGEgb2YNCi0gKiAgICAgICAgIEFEQyBtYXN0ZXIgb3IgQURDIHNsYXZlOiBzZWUgaGVscGVyIG1hY3JvDQotICogICAgICAgICBAcmVmIF9fTExfQURDX01VTFRJX0NPTlZfREFUQV9NQVNURVJfU0xBVkUoKS4NCi0gKiBAcm10b2xsIENDUiAgICAgIE1ETUEgICAgICAgICAgIExMX0FEQ19HZXRNdWx0aURNQVRyYW5zZmVyXG4NCi0gKiAgICAgICAgIENDUiAgICAgIERNQUNGRyAgICAgICAgIExMX0FEQ19HZXRNdWx0aURNQVRyYW5zZmVyDQotICogQHBhcmFtICBBREN4eV9DT01NT04gQURDIGNvbW1vbiBpbnN0YW5jZQ0KLSAqICAgICAgICAgKGNhbiBiZSBzZXQgZGlyZWN0bHkgZnJvbSBDTVNJUyBkZWZpbml0aW9uIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybw0KLSAqIEByZWYgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKCkgKQ0KLSAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfUkVHX0RNQV9FQUNIX0FEQw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19NVUxUSV9SRUdfRE1BX0xJTUlUX1JFUzEyXzEwQg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19NVUxUSV9SRUdfRE1BX0xJTUlUX1JFUzhfNkINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfUkVHX0RNQV9VTkxNVF9SRVMxMl8xMEINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfUkVHX0RNQV9VTkxNVF9SRVM4XzZCDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90DQotTExfQURDX0dldE11bHRpRE1BVHJhbnNmZXIoQURDX0NvbW1vbl9UeXBlRGVmICpBREN4eV9DT01NT04pIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEFEQ3h5X0NPTU1PTi0+Q0NSLCBBRENfQ0NSX01ETUEgfCBBRENfQ0NSX0RNQUNGRykpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCBBREMgbXVsdGltb2RlIGRlbGF5IGJldHdlZW4gMiBzYW1wbGluZyBwaGFzZXMuDQotICogQG5vdGUgICBUaGUgc2FtcGxpbmcgZGVsYXkgcmFuZ2UgZGVwZW5kcyBvbiBBREMgcmVzb2x1dGlvbjoNCi0gKiAgICAgICAgIC0gQURDIHJlc29sdXRpb24gMTIgYml0cyBjYW4gaGF2ZSBtYXhpbXVtIGRlbGF5IG9mIDEyIGN5Y2xlcy4NCi0gKiAgICAgICAgIC0gQURDIHJlc29sdXRpb24gMTAgYml0cyBjYW4gaGF2ZSBtYXhpbXVtIGRlbGF5IG9mIDEwIGN5Y2xlcy4NCi0gKiAgICAgICAgIC0gQURDIHJlc29sdXRpb24gIDggYml0cyBjYW4gaGF2ZSBtYXhpbXVtIGRlbGF5IG9mICA4IGN5Y2xlcy4NCi0gKiAgICAgICAgIC0gQURDIHJlc29sdXRpb24gIDYgYml0cyBjYW4gaGF2ZSBtYXhpbXVtIGRlbGF5IG9mICA2IGN5Y2xlcy4NCi0gKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bw0KLSAqICAgICAgICAgQURDIHN0YXRlOg0KLSAqICAgICAgICAgQWxsIEFEQyBpbnN0YW5jZXMgb2YgdGhlIEFEQyBjb21tb24gZ3JvdXAgbXVzdCBiZSBkaXNhYmxlZC4NCi0gKiAgICAgICAgIFRoaXMgY2hlY2sgY2FuIGJlIGRvbmUgd2l0aCBmdW5jdGlvbiBAcmVmIExMX0FEQ19Jc0VuYWJsZWQoKSBmb3IgZWFjaA0KLSAqICAgICAgICAgQURDIGluc3RhbmNlIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybyBoZWxwZXIgbWFjcm8NCi0gKiAgICAgICAgIEByZWYgX19MTF9BRENfSVNfRU5BQkxFRF9BTExfQ09NTU9OX0lOU1RBTkNFKCkuDQotICogQHJtdG9sbCBDQ1IgICAgICBERUxBWSAgICAgICAgICBMTF9BRENfU2V0TXVsdGlUd29TYW1wbGluZ0RlbGF5DQotICogQHBhcmFtICBBREN4eV9DT01NT04gQURDIGNvbW1vbiBpbnN0YW5jZQ0KLSAqICAgICAgICAgKGNhbiBiZSBzZXQgZGlyZWN0bHkgZnJvbSBDTVNJUyBkZWZpbml0aW9uIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybw0KLSAqIEByZWYgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKCkgKQ0KLSAqIEBwYXJhbSAgTXVsdGlUd29TYW1wbGluZ0RlbGF5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZw0KLSAqIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzFDWUNMRQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfMkNZQ0xFUw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfM0NZQ0xFUw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfNENZQ0xFUw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfNUNZQ0xFUw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfNkNZQ0xFUyAgKDEpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX1RXT1NNUF9ERUxBWV83Q1lDTEVTICAoMSkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzhDWUNMRVMgICgyKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfOUNZQ0xFUyAgKDIpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX1RXT1NNUF9ERUxBWV8xMENZQ0xFUyAoMikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzExQ1lDTEVTICgzKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfMTJDWUNMRVMgKDMpDQotICoNCi0gKiAgICAgICAgICgxKSBQYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgaWYgQURDIHJlc29sdXRpb24gaXMgMTIsIDEwIG9yIDggYml0cy5cbg0KLSAqICAgICAgICAgKDIpIFBhcmFtZXRlciBhdmFpbGFibGUgb25seSBpZiBBREMgcmVzb2x1dGlvbiBpcyAxMiBvciAxMCBiaXRzLlxuDQotICogICAgICAgICAoMykgUGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IGlmIEFEQyByZXNvbHV0aW9uIGlzIDEyIGJpdHMuDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1NldE11bHRpVHdvU2FtcGxpbmdEZWxheSgNCi0gICAgQURDX0NvbW1vbl9UeXBlRGVmICpBREN4eV9DT01NT04sIHVpbnQzMl90IE11bHRpVHdvU2FtcGxpbmdEZWxheSkgew0KLSAgTU9ESUZZX1JFRyhBREN4eV9DT01NT04tPkNDUiwgQURDX0NDUl9ERUxBWSwgTXVsdGlUd29TYW1wbGluZ0RlbGF5KTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgQURDIG11bHRpbW9kZSBkZWxheSBiZXR3ZWVuIDIgc2FtcGxpbmcgcGhhc2VzLg0KLSAqIEBybXRvbGwgQ0NSICAgICAgREVMQVkgICAgICAgICAgTExfQURDX0dldE11bHRpVHdvU2FtcGxpbmdEZWxheQ0KLSAqIEBwYXJhbSAgQURDeHlfQ09NTU9OIEFEQyBjb21tb24gaW5zdGFuY2UNCi0gKiAgICAgICAgIChjYW4gYmUgc2V0IGRpcmVjdGx5IGZyb20gQ01TSVMgZGVmaW5pdGlvbiBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8NCi0gKiBAcmVmIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRSgpICkNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX1RXT1NNUF9ERUxBWV8xQ1lDTEUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzJDWUNMRVMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzNDWUNMRVMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzRDWUNMRVMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzVDWUNMRVMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzZDWUNMRVMgICgxKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfN0NZQ0xFUyAgKDEpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX1RXT1NNUF9ERUxBWV84Q1lDTEVTICAoMikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzlDWUNMRVMgICgyKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfMTBDWUNMRVMgKDIpDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX1RXT1NNUF9ERUxBWV8xMUNZQ0xFUyAoMykNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzEyQ1lDTEVTICgzKQ0KLSAqDQotICogICAgICAgICAoMSkgUGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IGlmIEFEQyByZXNvbHV0aW9uIGlzIDEyLCAxMCBvciA4IGJpdHMuXG4NCi0gKiAgICAgICAgICgyKSBQYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgaWYgQURDIHJlc29sdXRpb24gaXMgMTIgb3IgMTAgYml0cy5cbg0KLSAqICAgICAgICAgKDMpIFBhcmFtZXRlciBhdmFpbGFibGUgb25seSBpZiBBREMgcmVzb2x1dGlvbiBpcyAxMiBiaXRzLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdA0KLUxMX0FEQ19HZXRNdWx0aVR3b1NhbXBsaW5nRGVsYXkoQURDX0NvbW1vbl9UeXBlRGVmICpBREN4eV9DT01NT04pIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEFEQ3h5X0NPTU1PTi0+Q0NSLCBBRENfQ0NSX0RFTEFZKSk7DQotfQ0KLSNlbmRpZiAvKiBBRENfTVVMVElNT0RFX1NVUFBPUlQgKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLS8qKiBAZGVmZ3JvdXAgQURDX0xMX0VGX09wZXJhdGlvbl9BRENfSW5zdGFuY2UgT3BlcmF0aW9uIG9uIEFEQyBoaWVyYXJjaGljYWwNCi0gKiBzY29wZTogQURDIGluc3RhbmNlDQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFB1dCBBREMgaW5zdGFuY2UgaW4gZGVlcCBwb3dlciBkb3duIHN0YXRlLg0KLSAqIEBub3RlICAgSW4gY2FzZSBvZiBBREMgY2FsaWJyYXRpb24gbmVjZXNzYXJ5OiBXaGVuIEFEQyBpcyBpbiBkZWVwLXBvd2VyLWRvd24NCi0gKiAgICAgICAgIHN0YXRlLCB0aGUgaW50ZXJuYWwgYW5hbG9nIGNhbGlicmF0aW9uIGlzIGxvc3QuIEFmdGVyIGV4aXRpbmcgZnJvbQ0KLSAqICAgICAgICAgZGVlcCBwb3dlciBkb3duLCBjYWxpYnJhdGlvbiBtdXN0IGJlIHJlbGF1bmNoZWQgb3IgY2FsaWJyYXRpb24gZmFjdG9yDQotICogICAgICAgICAocHJlbGltaW5hcmlseSBzYXZlZCkgbXVzdCBiZSBzZXQgYmFjayBpbnRvIGNhbGlicmF0aW9uIHJlZ2lzdGVyLg0KLSAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvDQotICogICAgICAgICBBREMgc3RhdGU6DQotICogICAgICAgICBBREMgbXVzdCBiZSBBREMgZGlzYWJsZWQuDQotICogQHJtdG9sbCBDUiAgICAgICBERUVQUFdEICAgICAgICBMTF9BRENfRW5hYmxlRGVlcFBvd2VyRG93bg0KLSAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfRW5hYmxlRGVlcFBvd2VyRG93bihBRENfVHlwZURlZiAqQURDeCkgew0KLSAgLyogTm90ZTogV3JpdGUgcmVnaXN0ZXIgd2l0aCBzb21lIGFkZGl0aW9uYWwgYml0cyBmb3JjZWQgdG8gc3RhdGUgcmVzZXQgICAgICovDQotICAvKiAgICAgICBpbnN0ZWFkIG9mIG1vZGlmeWluZyBvbmx5IHRoZSBzZWxlY3RlZCBiaXQgZm9yIHRoaXMgZnVuY3Rpb24sICAgICAgKi8NCi0gIC8qICAgICAgIHRvIG5vdCBpbnRlcmZlcmUgd2l0aCBiaXRzIHdpdGggSFcgcHJvcGVydHkgInJzIi4gICAgICAgICAgICAgICAgICAqLw0KLSAgTU9ESUZZX1JFRyhBREN4LT5DUiwgQURDX0NSX0JJVFNfUFJPUEVSVFlfUlMsIEFEQ19DUl9ERUVQUFdEKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIEFEQyBkZWVwIHBvd2VyIGRvd24gbW9kZS4NCi0gKiBAbm90ZSAgIEluIGNhc2Ugb2YgQURDIGNhbGlicmF0aW9uIG5lY2Vzc2FyeTogV2hlbiBBREMgaXMgaW4gZGVlcC1wb3dlci1kb3duDQotICogICAgICAgICBzdGF0ZSwgdGhlIGludGVybmFsIGFuYWxvZyBjYWxpYnJhdGlvbiBpcyBsb3N0LiBBZnRlciBleGl0aW5nIGZyb20NCi0gKiAgICAgICAgIGRlZXAgcG93ZXIgZG93biwgY2FsaWJyYXRpb24gbXVzdCBiZSByZWxhdW5jaGVkIG9yIGNhbGlicmF0aW9uIGZhY3Rvcg0KLSAqICAgICAgICAgKHByZWxpbWluYXJpbHkgc2F2ZWQpIG11c3QgYmUgc2V0IGJhY2sgaW50byBjYWxpYnJhdGlvbiByZWdpc3Rlci4NCi0gKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bw0KLSAqICAgICAgICAgQURDIHN0YXRlOg0KLSAqICAgICAgICAgQURDIG11c3QgYmUgQURDIGRpc2FibGVkLg0KLSAqIEBybXRvbGwgQ1IgICAgICAgREVFUFBXRCAgICAgICAgTExfQURDX0Rpc2FibGVEZWVwUG93ZXJEb3duDQotICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19EaXNhYmxlRGVlcFBvd2VyRG93bihBRENfVHlwZURlZiAqQURDeCkgew0KLSAgLyogTm90ZTogV3JpdGUgcmVnaXN0ZXIgd2l0aCBzb21lIGFkZGl0aW9uYWwgYml0cyBmb3JjZWQgdG8gc3RhdGUgcmVzZXQgICAgICovDQotICAvKiAgICAgICBpbnN0ZWFkIG9mIG1vZGlmeWluZyBvbmx5IHRoZSBzZWxlY3RlZCBiaXQgZm9yIHRoaXMgZnVuY3Rpb24sICAgICAgKi8NCi0gIC8qICAgICAgIHRvIG5vdCBpbnRlcmZlcmUgd2l0aCBiaXRzIHdpdGggSFcgcHJvcGVydHkgInJzIi4gICAgICAgICAgICAgICAgICAqLw0KLSAgQ0xFQVJfQklUKEFEQ3gtPkNSLCAoQURDX0NSX0RFRVBQV0QgfCBBRENfQ1JfQklUU19QUk9QRVJUWV9SUykpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCB0aGUgc2VsZWN0ZWQgQURDIGluc3RhbmNlIGRlZXAgcG93ZXIgZG93biBzdGF0ZS4NCi0gKiBAcm10b2xsIENSICAgICAgIERFRVBQV0QgICAgICAgIExMX0FEQ19Jc0RlZXBQb3dlckRvd25FbmFibGVkDQotICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgMDogZGVlcCBwb3dlciBkb3duIGlzIGRpc2FibGVkLCAxOiBkZWVwIHBvd2VyIGRvd24gaXMgZW5hYmxlZC4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzRGVlcFBvd2VyRG93bkVuYWJsZWQoQURDX1R5cGVEZWYgKkFEQ3gpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKEFEQ3gtPkNSLCBBRENfQ1JfREVFUFBXRCkgPT0gKEFEQ19DUl9ERUVQUFdEKSkgPyAxVUwgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSBBREMgaW5zdGFuY2UgaW50ZXJuYWwgdm9sdGFnZSByZWd1bGF0b3IuDQotICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllcywgYWZ0ZXIgQURDIGludGVybmFsIHZvbHRhZ2UgcmVndWxhdG9yIGVuYWJsZSwNCi0gKiAgICAgICAgIGEgZGVsYXkgZm9yIEFEQyBpbnRlcm5hbCB2b2x0YWdlIHJlZ3VsYXRvciBzdGFiaWxpemF0aW9uDQotICogICAgICAgICBpcyByZXF1aXJlZCBiZWZvcmUgcGVyZm9ybWluZyBhIEFEQyBjYWxpYnJhdGlvbiBvciBBREMgZW5hYmxlLg0KLSAqICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCwgcGFyYW1ldGVyIHRBRENWUkVHX1NUVVAuDQotICogICAgICAgICBSZWZlciB0byBsaXRlcmFsIEByZWYgTExfQURDX0RFTEFZX0lOVEVSTkFMX1JFR1VMX1NUQUJfVVMuDQotICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllcywgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8NCi0gKiAgICAgICAgIEFEQyBzdGF0ZToNCi0gKiAgICAgICAgIEFEQyBtdXN0IGJlIEFEQyBkaXNhYmxlZC4NCi0gKiBAcm10b2xsIENSICAgICAgIEFEVlJFR0VOICAgICAgIExMX0FEQ19FbmFibGVJbnRlcm5hbFJlZ3VsYXRvcg0KLSAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfRW5hYmxlSW50ZXJuYWxSZWd1bGF0b3IoQURDX1R5cGVEZWYgKkFEQ3gpIHsNCi0gIC8qIE5vdGU6IFdyaXRlIHJlZ2lzdGVyIHdpdGggc29tZSBhZGRpdGlvbmFsIGJpdHMgZm9yY2VkIHRvIHN0YXRlIHJlc2V0ICAgICAqLw0KLSAgLyogICAgICAgaW5zdGVhZCBvZiBtb2RpZnlpbmcgb25seSB0aGUgc2VsZWN0ZWQgYml0IGZvciB0aGlzIGZ1bmN0aW9uLCAgICAgICovDQotICAvKiAgICAgICB0byBub3QgaW50ZXJmZXJlIHdpdGggYml0cyB3aXRoIEhXIHByb3BlcnR5ICJycyIuICAgICAgICAgICAgICAgICAgKi8NCi0gIE1PRElGWV9SRUcoQURDeC0+Q1IsIEFEQ19DUl9CSVRTX1BST1BFUlRZX1JTLCBBRENfQ1JfQURWUkVHRU4pOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgQURDIGludGVybmFsIHZvbHRhZ2UgcmVndWxhdG9yLg0KLSAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvDQotICogICAgICAgICBBREMgc3RhdGU6DQotICogICAgICAgICBBREMgbXVzdCBiZSBBREMgZGlzYWJsZWQuDQotICogQHJtdG9sbCBDUiAgICAgICBBRFZSRUdFTiAgICAgICBMTF9BRENfRGlzYWJsZUludGVybmFsUmVndWxhdG9yDQotICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19EaXNhYmxlSW50ZXJuYWxSZWd1bGF0b3IoQURDX1R5cGVEZWYgKkFEQ3gpIHsNCi0gIENMRUFSX0JJVChBREN4LT5DUiwgKEFEQ19DUl9BRFZSRUdFTiB8IEFEQ19DUl9CSVRTX1BST1BFUlRZX1JTKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IHRoZSBzZWxlY3RlZCBBREMgaW5zdGFuY2UgaW50ZXJuYWwgdm9sdGFnZSByZWd1bGF0b3Igc3RhdGUuDQotICogQHJtdG9sbCBDUiAgICAgICBBRFZSRUdFTiAgICAgICBMTF9BRENfSXNJbnRlcm5hbFJlZ3VsYXRvckVuYWJsZWQNCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHJldHZhbCAwOiBpbnRlcm5hbCByZWd1bGF0b3IgaXMgZGlzYWJsZWQsIDE6IGludGVybmFsIHJlZ3VsYXRvciBpcyBlbmFibGVkLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSXNJbnRlcm5hbFJlZ3VsYXRvckVuYWJsZWQoQURDX1R5cGVEZWYgKkFEQ3gpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKEFEQ3gtPkNSLCBBRENfQ1JfQURWUkVHRU4pID09IChBRENfQ1JfQURWUkVHRU4pKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgdGhlIHNlbGVjdGVkIEFEQyBpbnN0YW5jZS4NCi0gKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBhZnRlciBBREMgZW5hYmxlLCBhIGRlbGF5IGZvcg0KLSAqICAgICAgICAgQURDIGludGVybmFsIGFuYWxvZyBzdGFiaWxpemF0aW9uIGlzIHJlcXVpcmVkIGJlZm9yZSBwZXJmb3JtaW5nIGENCi0gKiAgICAgICAgIEFEQyBjb252ZXJzaW9uIHN0YXJ0Lg0KLSAqICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCwgcGFyYW1ldGVyIHRTVEFCLg0KLSAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIGZsYWcgTExfQURDX0ZMQUdfQURSRFkgaXMgcmFpc2VkIHdoZW4gdGhlIEFEQw0KLSAqICAgICAgICAgaXMgZW5hYmxlZCBhbmQgd2hlbiBjb252ZXJzaW9uIGNsb2NrIGlzIGFjdGl2ZS4NCi0gKiAgICAgICAgIChub3Qgb25seSBjb3JlIGNsb2NrOiB0aGlzIEFEQyBoYXMgYSBkdWFsIGNsb2NrIGRvbWFpbikNCi0gKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bw0KLSAqICAgICAgICAgQURDIHN0YXRlOg0KLSAqICAgICAgICAgQURDIG11c3QgYmUgQURDIGRpc2FibGVkIGFuZCBBREMgaW50ZXJuYWwgdm9sdGFnZSByZWd1bGF0b3IgZW5hYmxlZC4NCi0gKiBAcm10b2xsIENSICAgICAgIEFERU4gICAgICAgICAgIExMX0FEQ19FbmFibGUNCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0VuYWJsZShBRENfVHlwZURlZiAqQURDeCkgew0KLSAgLyogTm90ZTogV3JpdGUgcmVnaXN0ZXIgd2l0aCBzb21lIGFkZGl0aW9uYWwgYml0cyBmb3JjZWQgdG8gc3RhdGUgcmVzZXQgICAgICovDQotICAvKiAgICAgICBpbnN0ZWFkIG9mIG1vZGlmeWluZyBvbmx5IHRoZSBzZWxlY3RlZCBiaXQgZm9yIHRoaXMgZnVuY3Rpb24sICAgICAgKi8NCi0gIC8qICAgICAgIHRvIG5vdCBpbnRlcmZlcmUgd2l0aCBiaXRzIHdpdGggSFcgcHJvcGVydHkgInJzIi4gICAgICAgICAgICAgICAgICAqLw0KLSAgTU9ESUZZX1JFRyhBREN4LT5DUiwgQURDX0NSX0JJVFNfUFJPUEVSVFlfUlMsIEFEQ19DUl9BREVOKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIHRoZSBzZWxlY3RlZCBBREMgaW5zdGFuY2UuDQotICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllcywgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8NCi0gKiAgICAgICAgIEFEQyBzdGF0ZToNCi0gKiAgICAgICAgIEFEQyBtdXN0IGJlIG5vdCBkaXNhYmxlZC4gTXVzdCBiZSBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZw0KLSAqICAgICAgICAgb24gZWl0aGVyIGdyb3VwcyByZWd1bGFyIG9yIGluamVjdGVkLg0KLSAqIEBybXRvbGwgQ1IgICAgICAgQURESVMgICAgICAgICAgTExfQURDX0Rpc2FibGUNCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0Rpc2FibGUoQURDX1R5cGVEZWYgKkFEQ3gpIHsNCi0gIC8qIE5vdGU6IFdyaXRlIHJlZ2lzdGVyIHdpdGggc29tZSBhZGRpdGlvbmFsIGJpdHMgZm9yY2VkIHRvIHN0YXRlIHJlc2V0ICAgICAqLw0KLSAgLyogICAgICAgaW5zdGVhZCBvZiBtb2RpZnlpbmcgb25seSB0aGUgc2VsZWN0ZWQgYml0IGZvciB0aGlzIGZ1bmN0aW9uLCAgICAgICovDQotICAvKiAgICAgICB0byBub3QgaW50ZXJmZXJlIHdpdGggYml0cyB3aXRoIEhXIHByb3BlcnR5ICJycyIuICAgICAgICAgICAgICAgICAgKi8NCi0gIE1PRElGWV9SRUcoQURDeC0+Q1IsIEFEQ19DUl9CSVRTX1BST1BFUlRZX1JTLCBBRENfQ1JfQURESVMpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCB0aGUgc2VsZWN0ZWQgQURDIGluc3RhbmNlIGVuYWJsZSBzdGF0ZS4NCi0gKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBmbGFnIExMX0FEQ19GTEFHX0FEUkRZIGlzIHJhaXNlZCB3aGVuIHRoZSBBREMNCi0gKiAgICAgICAgIGlzIGVuYWJsZWQgYW5kIHdoZW4gY29udmVyc2lvbiBjbG9jayBpcyBhY3RpdmUuDQotICogICAgICAgICAobm90IG9ubHkgY29yZSBjbG9jazogdGhpcyBBREMgaGFzIGEgZHVhbCBjbG9jayBkb21haW4pDQotICogQHJtdG9sbCBDUiAgICAgICBBREVOICAgICAgICAgICBMTF9BRENfSXNFbmFibGVkDQotICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgMDogQURDIGlzIGRpc2FibGVkLCAxOiBBREMgaXMgZW5hYmxlZC4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzRW5hYmxlZChBRENfVHlwZURlZiAqQURDeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoQURDeC0+Q1IsIEFEQ19DUl9BREVOKSA9PSAoQURDX0NSX0FERU4pKSA/IDFVTCA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IHRoZSBzZWxlY3RlZCBBREMgaW5zdGFuY2UgZGlzYWJsZSBzdGF0ZS4NCi0gKiBAcm10b2xsIENSICAgICAgIEFERElTICAgICAgICAgIExMX0FEQ19Jc0Rpc2FibGVPbmdvaW5nDQotICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgMDogbm8gQURDIGRpc2FibGUgY29tbWFuZCBvbiBnb2luZy4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzRGlzYWJsZU9uZ29pbmcoQURDX1R5cGVEZWYgKkFEQ3gpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKEFEQ3gtPkNSLCBBRENfQ1JfQURESVMpID09IChBRENfQ1JfQURESVMpKSA/IDFVTCA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU3RhcnQgQURDIGNhbGlicmF0aW9uIGluIHRoZSBtb2RlIHNpbmdsZS1lbmRlZA0KLSAqICAgICAgICAgb3IgZGlmZmVyZW50aWFsIChmb3IgZGV2aWNlcyB3aXRoIGRpZmZlcmVudGlhbCBtb2RlIGF2YWlsYWJsZSkuDQotICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllcywgYSBtaW5pbXVtIG51bWJlciBvZiBBREMgY2xvY2sgY3ljbGVzDQotICogICAgICAgICBhcmUgcmVxdWlyZWQgYmV0d2VlbiBBREMgZW5kIG9mIGNhbGlicmF0aW9uIGFuZCBBREMgZW5hYmxlLg0KLSAqICAgICAgICAgUmVmZXIgdG8gbGl0ZXJhbCBAcmVmIExMX0FEQ19ERUxBWV9DQUxJQl9FTkFCTEVfQURDX0NZQ0xFUy4NCi0gKiBAbm90ZSAgIEZvciBkZXZpY2VzIHdpdGggZGlmZmVyZW50aWFsIG1vZGUgYXZhaWxhYmxlOg0KLSAqICAgICAgICAgQ2FsaWJyYXRpb24gb2Ygb2Zmc2V0IGlzIHNwZWNpZmljIHRvIGVhY2ggb2YNCi0gKiAgICAgICAgIHNpbmdsZS1lbmRlZCBhbmQgZGlmZmVyZW50aWFsIG1vZGVzDQotICogICAgICAgICAoY2FsaWJyYXRpb24gcnVuIG11c3QgYmUgcGVyZm9ybWVkIGZvciBlYWNoIG9mIHRoZXNlDQotICogICAgICAgICBkaWZmZXJlbnRpYWwgbW9kZXMsIGlmIHVzZWQgYWZ0ZXJ3YXJkcyBhbmQgaWYgdGhlIGFwcGxpY2F0aW9uDQotICogICAgICAgICByZXF1aXJlcyB0aGVpciBjYWxpYnJhdGlvbikuDQotICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllcywgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8NCi0gKiAgICAgICAgIEFEQyBzdGF0ZToNCi0gKiAgICAgICAgIEFEQyBtdXN0IGJlIEFEQyBkaXNhYmxlZC4NCi0gKiBAcm10b2xsIENSICAgICAgIEFEQ0FMICAgICAgICAgIExMX0FEQ19TdGFydENhbGlicmF0aW9uXG4NCi0gKiAgICAgICAgIENSICAgICAgIEFEQ0FMRElGICAgICAgIExMX0FEQ19TdGFydENhbGlicmF0aW9uDQotICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQ0KLSAqIEBwYXJhbSAgU2luZ2xlRGlmZiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19TSU5HTEVfRU5ERUQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfRElGRkVSRU5USUFMX0VOREVEDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1N0YXJ0Q2FsaWJyYXRpb24oQURDX1R5cGVEZWYgKkFEQ3gsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgU2luZ2xlRGlmZikgew0KLSAgLyogTm90ZTogV3JpdGUgcmVnaXN0ZXIgd2l0aCBzb21lIGFkZGl0aW9uYWwgYml0cyBmb3JjZWQgdG8gc3RhdGUgcmVzZXQgICAgICovDQotICAvKiAgICAgICBpbnN0ZWFkIG9mIG1vZGlmeWluZyBvbmx5IHRoZSBzZWxlY3RlZCBiaXQgZm9yIHRoaXMgZnVuY3Rpb24sICAgICAgKi8NCi0gIC8qICAgICAgIHRvIG5vdCBpbnRlcmZlcmUgd2l0aCBiaXRzIHdpdGggSFcgcHJvcGVydHkgInJzIi4gICAgICAgICAgICAgICAgICAqLw0KLSAgTU9ESUZZX1JFRyhBREN4LT5DUiwgQURDX0NSX0FEQ0FMRElGIHwgQURDX0NSX0JJVFNfUFJPUEVSVFlfUlMsDQotICAgICAgICAgICAgIEFEQ19DUl9BRENBTCB8IChTaW5nbGVEaWZmICYgQURDX1NJTkdMRURJRkZfQ0FMSUJfU1RBUlRfTUFTSykpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBBREMgY2FsaWJyYXRpb24gc3RhdGUuDQotICogQHJtdG9sbCBDUiAgICAgICBBRENBTCAgICAgICAgICBMTF9BRENfSXNDYWxpYnJhdGlvbk9uR29pbmcNCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHJldHZhbCAwOiBjYWxpYnJhdGlvbiBjb21wbGV0ZSwgMTogY2FsaWJyYXRpb24gaW4gcHJvZ3Jlc3MuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0NhbGlicmF0aW9uT25Hb2luZyhBRENfVHlwZURlZiAqQURDeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoQURDeC0+Q1IsIEFEQ19DUl9BRENBTCkgPT0gKEFEQ19DUl9BRENBTCkpID8gMVVMIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEFEQ19MTF9FRl9PcGVyYXRpb25fQURDX0dyb3VwX1JlZ3VsYXIgT3BlcmF0aW9uIG9uIEFEQw0KLSAqIGhpZXJhcmNoaWNhbCBzY29wZTogZ3JvdXAgcmVndWxhcg0KLSAqIEB7DQotICovDQotDQotLyoqDQotICogQGJyaWVmICBTdGFydCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uLg0KLSAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIHRoaXMgZnVuY3Rpb24gaXMgcmVsZXZhbnQgZm9yIGJvdGgNCi0gKiAgICAgICAgIGludGVybmFsIHRyaWdnZXIgKFNXIHN0YXJ0KSBhbmQgZXh0ZXJuYWwgdHJpZ2dlcjoNCi0gKiAgICAgICAgIC0gSWYgQURDIHRyaWdnZXIgaGFzIGJlZW4gc2V0IHRvIHNvZnR3YXJlIHN0YXJ0LCBBREMgY29udmVyc2lvbg0KLSAqICAgICAgICAgICBzdGFydHMgaW1tZWRpYXRlbHkuDQotICogICAgICAgICAtIElmIEFEQyB0cmlnZ2VyIGhhcyBiZWVuIHNldCB0byBleHRlcm5hbCB0cmlnZ2VyLCBBREMgY29udmVyc2lvbg0KLSAqICAgICAgICAgICB3aWxsIHN0YXJ0IGF0IG5leHQgdHJpZ2dlciBldmVudCAob24gdGhlIHNlbGVjdGVkIHRyaWdnZXIgZWRnZSkNCi0gKiAgICAgICAgICAgZm9sbG93aW5nIHRoZSBBREMgc3RhcnQgY29udmVyc2lvbiBjb21tYW5kLg0KLSAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvDQotICogICAgICAgICBBREMgc3RhdGU6DQotICogICAgICAgICBBREMgbXVzdCBiZSBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZyBvbiBncm91cCByZWd1bGFyLA0KLSAqICAgICAgICAgd2l0aG91dCBjb252ZXJzaW9uIHN0b3AgY29tbWFuZCBvbiBnb2luZyBvbiBncm91cCByZWd1bGFyLA0KLSAqICAgICAgICAgd2l0aG91dCBBREMgZGlzYWJsZSBjb21tYW5kIG9uIGdvaW5nLg0KLSAqIEBybXRvbGwgQ1IgICAgICAgQURTVEFSVCAgICAgICAgTExfQURDX1JFR19TdGFydENvbnZlcnNpb24NCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1JFR19TdGFydENvbnZlcnNpb24oQURDX1R5cGVEZWYgKkFEQ3gpIHsNCi0gIC8qIE5vdGU6IFdyaXRlIHJlZ2lzdGVyIHdpdGggc29tZSBhZGRpdGlvbmFsIGJpdHMgZm9yY2VkIHRvIHN0YXRlIHJlc2V0ICAgICAqLw0KLSAgLyogICAgICAgaW5zdGVhZCBvZiBtb2RpZnlpbmcgb25seSB0aGUgc2VsZWN0ZWQgYml0IGZvciB0aGlzIGZ1bmN0aW9uLCAgICAgICovDQotICAvKiAgICAgICB0byBub3QgaW50ZXJmZXJlIHdpdGggYml0cyB3aXRoIEhXIHByb3BlcnR5ICJycyIuICAgICAgICAgICAgICAgICAgKi8NCi0gIE1PRElGWV9SRUcoQURDeC0+Q1IsIEFEQ19DUl9CSVRTX1BST1BFUlRZX1JTLCBBRENfQ1JfQURTVEFSVCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU3RvcCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uLg0KLSAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvDQotICogICAgICAgICBBREMgc3RhdGU6DQotICogICAgICAgICBBREMgbXVzdCBiZSBlbmFibGVkIHdpdGggY29udmVyc2lvbiBvbiBnb2luZyBvbiBncm91cCByZWd1bGFyLA0KLSAqICAgICAgICAgd2l0aG91dCBBREMgZGlzYWJsZSBjb21tYW5kIG9uIGdvaW5nLg0KLSAqIEBybXRvbGwgQ1IgICAgICAgQURTVFAgICAgICAgICAgTExfQURDX1JFR19TdG9wQ29udmVyc2lvbg0KLSAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfUkVHX1N0b3BDb252ZXJzaW9uKEFEQ19UeXBlRGVmICpBREN4KSB7DQotICAvKiBOb3RlOiBXcml0ZSByZWdpc3RlciB3aXRoIHNvbWUgYWRkaXRpb25hbCBiaXRzIGZvcmNlZCB0byBzdGF0ZSByZXNldCAgICAgKi8NCi0gIC8qICAgICAgIGluc3RlYWQgb2YgbW9kaWZ5aW5nIG9ubHkgdGhlIHNlbGVjdGVkIGJpdCBmb3IgdGhpcyBmdW5jdGlvbiwgICAgICAqLw0KLSAgLyogICAgICAgdG8gbm90IGludGVyZmVyZSB3aXRoIGJpdHMgd2l0aCBIVyBwcm9wZXJ0eSAicnMiLiAgICAgICAgICAgICAgICAgICovDQotICBNT0RJRllfUkVHKEFEQ3gtPkNSLCBBRENfQ1JfQklUU19QUk9QRVJUWV9SUywgQURDX0NSX0FEU1RQKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBzdGF0ZS4NCi0gKiBAcm10b2xsIENSICAgICAgIEFEU1RBUlQgICAgICAgIExMX0FEQ19SRUdfSXNDb252ZXJzaW9uT25nb2luZw0KLSAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIDA6IG5vIGNvbnZlcnNpb24gaXMgb24gZ29pbmcgb24gQURDIGdyb3VwIHJlZ3VsYXIuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19SRUdfSXNDb252ZXJzaW9uT25nb2luZyhBRENfVHlwZURlZiAqQURDeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoQURDeC0+Q1IsIEFEQ19DUl9BRFNUQVJUKSA9PSAoQURDX0NSX0FEU1RBUlQpKSA/IDFVTCA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IEFEQyBncm91cCByZWd1bGFyIGNvbW1hbmQgb2YgY29udmVyc2lvbiBzdG9wIHN0YXRlDQotICogQHJtdG9sbCBDUiAgICAgICBBRFNUUCAgICAgICAgICBMTF9BRENfUkVHX0lzU3RvcENvbnZlcnNpb25PbmdvaW5nDQotICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgMDogbm8gY29tbWFuZCBvZiBjb252ZXJzaW9uIHN0b3AgaXMgb24gZ29pbmcgb24gQURDIGdyb3VwIHJlZ3VsYXIuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19SRUdfSXNTdG9wQ29udmVyc2lvbk9uZ29pbmcoQURDX1R5cGVEZWYgKkFEQ3gpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKEFEQ3gtPkNSLCBBRENfQ1JfQURTVFApID09IChBRENfQ1JfQURTVFApKSA/IDFVTCA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU3RhcnQgQURDIHNhbXBsaW5nIHBoYXNlIGZvciBzYW1wbGluZyB0aW1lIHRyaWdnZXIgbW9kZQ0KLSAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBpcyByZWxldmFudCBvbmx5IHdoZW4NCi0gKiAgICAgICAgIC0gQHJlZiBMTF9BRENfUkVHX1NBTVBMSU5HX01PREVfVFJJR0dFUl9DT05UUk9MRUQgaGFzIGJlZW4gc2V0DQotICogICAgICAgICAgIHVzaW5nIEByZWYgTExfQURDX1JFR19TZXRTYW1wbGluZ01vZGUNCi0gKiAgICAgICAgIC0gQHJlZiBMTF9BRENfUkVHX1RSSUdfU09GVFdBUkUgaXMgdXNlZCBhcyB0cmlnZ2VyIHNvdXJjZQ0KLSAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvDQotICogICAgICAgICBBREMgc3RhdGU6DQotICogICAgICAgICBBREMgbXVzdCBiZSBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZyBvbiBncm91cCByZWd1bGFyLA0KLSAqICAgICAgICAgd2l0aG91dCBjb252ZXJzaW9uIHN0b3AgY29tbWFuZCBvbiBnb2luZyBvbiBncm91cCByZWd1bGFyLA0KLSAqICAgICAgICAgd2l0aG91dCBBREMgZGlzYWJsZSBjb21tYW5kIG9uIGdvaW5nLg0KLSAqIEBybXRvbGwgQ0ZHUjIgICAgU1dUUklHICAgICAgICAgTExfQURDX1JFR19TdGFydFNhbXBsaW5nUGhhc2UNCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1JFR19TdGFydFNhbXBsaW5nUGhhc2UoQURDX1R5cGVEZWYgKkFEQ3gpIHsNCi0gIFNFVF9CSVQoQURDeC0+Q0ZHUjIsIEFEQ19DRkdSMl9TV1RSSUcpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFN0b3AgQURDIHNhbXBsaW5nIHBoYXNlIGZvciBzYW1wbGluZyB0aW1lIHRyaWdnZXIgbW9kZSBhbmQgc3RhcnQNCi0gKiBjb252ZXJzaW9uDQotICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGlzIHJlbGV2YW50IG9ubHkgd2hlbg0KLSAqICAgICAgICAgLSBAcmVmIExMX0FEQ19SRUdfU0FNUExJTkdfTU9ERV9UUklHR0VSX0NPTlRST0xFRCBoYXMgYmVlbiBzZXQNCi0gKiAgICAgICAgICAgdXNpbmcgQHJlZiBMTF9BRENfUkVHX1NldFNhbXBsaW5nTW9kZQ0KLSAqICAgICAgICAgLSBAcmVmIExMX0FEQ19SRUdfVFJJR19TT0ZUV0FSRSBpcyB1c2VkIGFzIHRyaWdnZXIgc291cmNlDQotICogICAgICAgICAtIEByZWYgTExfQURDX1JFR19TdGFydFNhbXBsaW5nUGhhc2UgaGFzIGJlZW4gY2FsbGVkIHRvIHN0YXJ0DQotICogICAgICAgICAgIHRoZSBzYW1wbGluZyBwaGFzZQ0KLSAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvDQotICogICAgICAgICBBREMgc3RhdGU6DQotICogICAgICAgICBBREMgbXVzdCBiZSBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZyBvbiBncm91cCByZWd1bGFyLA0KLSAqICAgICAgICAgd2l0aG91dCBjb252ZXJzaW9uIHN0b3AgY29tbWFuZCBvbiBnb2luZyBvbiBncm91cCByZWd1bGFyLA0KLSAqICAgICAgICAgd2l0aG91dCBBREMgZGlzYWJsZSBjb21tYW5kIG9uIGdvaW5nLg0KLSAqIEBybXRvbGwgQ0ZHUjIgICAgU1dUUklHICAgICAgICAgTExfQURDX1JFR19TdG9wU2FtcGxpbmdQaGFzZQ0KLSAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfUkVHX1N0b3BTYW1wbGluZ1BoYXNlKEFEQ19UeXBlRGVmICpBREN4KSB7DQotICBDTEVBUl9CSVQoQURDeC0+Q0ZHUjIsIEFEQ19DRkdSMl9TV1RSSUcpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIGRhdGEsIHJhbmdlIGZpdCBmb3INCi0gKiAgICAgICAgIGFsbCBBREMgY29uZmlndXJhdGlvbnM6IGFsbCBBREMgcmVzb2x1dGlvbnMgYW5kDQotICogICAgICAgICBhbGwgb3ZlcnNhbXBsaW5nIGluY3JlYXNlZCBkYXRhIHdpZHRoIChmb3IgZGV2aWNlcw0KLSAqICAgICAgICAgd2l0aCBmZWF0dXJlIG92ZXJzYW1wbGluZykuDQotICogQHJtdG9sbCBEUiAgICAgICBSREFUQSAgICAgICAgICBMTF9BRENfUkVHX1JlYWRDb252ZXJzaW9uRGF0YTMyDQotICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMDAwMDAwIGFuZCBNYXhfRGF0YT0weEZGRkZGRkZGDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19SRUdfUmVhZENvbnZlcnNpb25EYXRhMzIoQURDX1R5cGVEZWYgKkFEQ3gpIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEFEQ3gtPkRSLCBBRENfRFJfUkRBVEEpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBkYXRhLCByYW5nZSBmaXQgZm9yDQotICogICAgICAgICBBREMgcmVzb2x1dGlvbiAxMiBiaXRzLg0KLSAqIEBub3RlICAgRm9yIGRldmljZXMgd2l0aCBmZWF0dXJlIG92ZXJzYW1wbGluZzogT3ZlcnNhbXBsaW5nDQotICogICAgICAgICBjYW4gaW5jcmVhc2UgZGF0YSB3aWR0aCwgZnVuY3Rpb24gZm9yIGV4dGVuZGVkIHJhbmdlDQotICogICAgICAgICBtYXkgYmUgbmVlZGVkOiBAcmVmIExMX0FEQ19SRUdfUmVhZENvbnZlcnNpb25EYXRhMzIuDQotICogQHJtdG9sbCBEUiAgICAgICBSREFUQSAgICAgICAgICBMTF9BRENfUkVHX1JlYWRDb252ZXJzaW9uRGF0YTEyDQotICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMCBhbmQgTWF4X0RhdGE9MHhGRkYNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDE2X3QgTExfQURDX1JFR19SZWFkQ29udmVyc2lvbkRhdGExMihBRENfVHlwZURlZiAqQURDeCkgew0KLSAgcmV0dXJuICh1aW50MTZfdCkoUkVBRF9CSVQoQURDeC0+RFIsIEFEQ19EUl9SREFUQSkpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIGRhdGEsIHJhbmdlIGZpdCBmb3INCi0gKiAgICAgICAgIEFEQyByZXNvbHV0aW9uIDEwIGJpdHMuDQotICogQG5vdGUgICBGb3IgZGV2aWNlcyB3aXRoIGZlYXR1cmUgb3ZlcnNhbXBsaW5nOiBPdmVyc2FtcGxpbmcNCi0gKiAgICAgICAgIGNhbiBpbmNyZWFzZSBkYXRhIHdpZHRoLCBmdW5jdGlvbiBmb3IgZXh0ZW5kZWQgcmFuZ2UNCi0gKiAgICAgICAgIG1heSBiZSBuZWVkZWQ6IEByZWYgTExfQURDX1JFR19SZWFkQ29udmVyc2lvbkRhdGEzMi4NCi0gKiBAcm10b2xsIERSICAgICAgIFJEQVRBICAgICAgICAgIExMX0FEQ19SRUdfUmVhZENvbnZlcnNpb25EYXRhMTANCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwIGFuZCBNYXhfRGF0YT0weDNGRg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MTZfdCBMTF9BRENfUkVHX1JlYWRDb252ZXJzaW9uRGF0YTEwKEFEQ19UeXBlRGVmICpBREN4KSB7DQotICByZXR1cm4gKHVpbnQxNl90KShSRUFEX0JJVChBREN4LT5EUiwgQURDX0RSX1JEQVRBKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gZGF0YSwgcmFuZ2UgZml0IGZvcg0KLSAqICAgICAgICAgQURDIHJlc29sdXRpb24gOCBiaXRzLg0KLSAqIEBub3RlICAgRm9yIGRldmljZXMgd2l0aCBmZWF0dXJlIG92ZXJzYW1wbGluZzogT3ZlcnNhbXBsaW5nDQotICogICAgICAgICBjYW4gaW5jcmVhc2UgZGF0YSB3aWR0aCwgZnVuY3Rpb24gZm9yIGV4dGVuZGVkIHJhbmdlDQotICogICAgICAgICBtYXkgYmUgbmVlZGVkOiBAcmVmIExMX0FEQ19SRUdfUmVhZENvbnZlcnNpb25EYXRhMzIuDQotICogQHJtdG9sbCBEUiAgICAgICBSREFUQSAgICAgICAgICBMTF9BRENfUkVHX1JlYWRDb252ZXJzaW9uRGF0YTgNCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkYNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDhfdCBMTF9BRENfUkVHX1JlYWRDb252ZXJzaW9uRGF0YTgoQURDX1R5cGVEZWYgKkFEQ3gpIHsNCi0gIHJldHVybiAodWludDhfdCkoUkVBRF9CSVQoQURDeC0+RFIsIEFEQ19EUl9SREFUQSkpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIGRhdGEsIHJhbmdlIGZpdCBmb3INCi0gKiAgICAgICAgIEFEQyByZXNvbHV0aW9uIDYgYml0cy4NCi0gKiBAbm90ZSAgIEZvciBkZXZpY2VzIHdpdGggZmVhdHVyZSBvdmVyc2FtcGxpbmc6IE92ZXJzYW1wbGluZw0KLSAqICAgICAgICAgY2FuIGluY3JlYXNlIGRhdGEgd2lkdGgsIGZ1bmN0aW9uIGZvciBleHRlbmRlZCByYW5nZQ0KLSAqICAgICAgICAgbWF5IGJlIG5lZWRlZDogQHJlZiBMTF9BRENfUkVHX1JlYWRDb252ZXJzaW9uRGF0YTMyLg0KLSAqIEBybXRvbGwgRFIgICAgICAgUkRBVEEgICAgICAgICAgTExfQURDX1JFR19SZWFkQ29udmVyc2lvbkRhdGE2DQotICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDNGDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQ4X3QgTExfQURDX1JFR19SZWFkQ29udmVyc2lvbkRhdGE2KEFEQ19UeXBlRGVmICpBREN4KSB7DQotICByZXR1cm4gKHVpbnQ4X3QpKFJFQURfQklUKEFEQ3gtPkRSLCBBRENfRFJfUkRBVEEpKTsNCi19DQotDQotI2lmIGRlZmluZWQoQURDX01VTFRJTU9ERV9TVVBQT1JUKQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IEFEQyBtdWx0aW1vZGUgY29udmVyc2lvbiBkYXRhIG9mIEFEQyBtYXN0ZXIsIEFEQyBzbGF2ZQ0KLSAqICAgICAgICAgb3IgcmF3IGRhdGEgd2l0aCBBREMgbWFzdGVyIGFuZCBzbGF2ZSBjb25jYXRlbmF0ZWQuDQotICogQG5vdGUgICBJZiByYXcgZGF0YSB3aXRoIEFEQyBtYXN0ZXIgYW5kIHNsYXZlIGNvbmNhdGVuYXRlZCBpcyByZXRyaWV2ZWQsDQotICogICAgICAgICBhIG1hY3JvIGlzIGF2YWlsYWJsZSB0byBnZXQgdGhlIGNvbnZlcnNpb24gZGF0YSBvZg0KLSAqICAgICAgICAgQURDIG1hc3RlciBvciBBREMgc2xhdmU6IHNlZSBoZWxwZXIgbWFjcm8NCi0gKiAgICAgICAgIEByZWYgX19MTF9BRENfTVVMVElfQ09OVl9EQVRBX01BU1RFUl9TTEFWRSgpLg0KLSAqICAgICAgICAgKGhvd2V2ZXIgdGhpcyBtYWNybyBpcyBtYWlubHkgaW50ZW5kZWQgZm9yIG11bHRpbW9kZQ0KLSAqICAgICAgICAgdHJhbnNmZXIgYnkgRE1BLCBiZWNhdXNlIHRoaXMgZnVuY3Rpb24gY2FuIGRvIHRoZSBzYW1lDQotICogICAgICAgICBieSBnZXR0aW5nIG11bHRpbW9kZSBjb252ZXJzaW9uIGRhdGEgb2YgQURDIG1hc3RlciBvciBBREMgc2xhdmUNCi0gKiAgICAgICAgIHNlcGFyYXRlbHkpLg0KLSAqIEBybXRvbGwgQ0RSICAgICAgUkRBVEFfTVNUICAgICAgTExfQURDX1JFR19SZWFkTXVsdGlDb252ZXJzaW9uRGF0YTMyXG4NCi0gKiAgICAgICAgIENEUiAgICAgIFJEQVRBX1NMViAgICAgIExMX0FEQ19SRUdfUmVhZE11bHRpQ29udmVyc2lvbkRhdGEzMg0KLSAqIEBwYXJhbSAgQURDeHlfQ09NTU9OIEFEQyBjb21tb24gaW5zdGFuY2UNCi0gKiAgICAgICAgIChjYW4gYmUgc2V0IGRpcmVjdGx5IGZyb20gQ01TSVMgZGVmaW5pdGlvbiBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8NCi0gKiBAcmVmIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRSgpICkNCi0gKiBAcGFyYW0gIENvbnZlcnNpb25EYXRhIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX01BU1RFUg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19NVUxUSV9TTEFWRQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19NVUxUSV9NQVNURVJfU0xBVkUNCi0gKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMDAwMDAwMCBhbmQgTWF4X0RhdGE9MHhGRkZGRkZGRg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfUkVHX1JlYWRNdWx0aUNvbnZlcnNpb25EYXRhMzIoDQotICAgIEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OLCB1aW50MzJfdCBDb252ZXJzaW9uRGF0YSkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeHlfQ09NTU9OLT5DRFIsIENvbnZlcnNpb25EYXRhKSA+Pg0KLSAgICAgICAgICAgICAgICAgICAgKFBPU0lUSU9OX1ZBTChDb252ZXJzaW9uRGF0YSkgJiAweDFGVUwpKTsNCi19DQotI2VuZGlmIC8qIEFEQ19NVUxUSU1PREVfU1VQUE9SVCAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBBRENfTExfRUZfT3BlcmF0aW9uX0FEQ19Hcm91cF9JbmplY3RlZCBPcGVyYXRpb24gb24gQURDDQotICogaGllcmFyY2hpY2FsIHNjb3BlOiBncm91cCBpbmplY3RlZA0KLSAqIEB7DQotICovDQotDQotLyoqDQotICogQGJyaWVmICBTdGFydCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbi4NCi0gKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCB0aGlzIGZ1bmN0aW9uIGlzIHJlbGV2YW50IGZvciBib3RoDQotICogICAgICAgICBpbnRlcm5hbCB0cmlnZ2VyIChTVyBzdGFydCkgYW5kIGV4dGVybmFsIHRyaWdnZXI6DQotICogICAgICAgICAtIElmIEFEQyB0cmlnZ2VyIGhhcyBiZWVuIHNldCB0byBzb2Z0d2FyZSBzdGFydCwgQURDIGNvbnZlcnNpb24NCi0gKiAgICAgICAgICAgc3RhcnRzIGltbWVkaWF0ZWx5Lg0KLSAqICAgICAgICAgLSBJZiBBREMgdHJpZ2dlciBoYXMgYmVlbiBzZXQgdG8gZXh0ZXJuYWwgdHJpZ2dlciwgQURDIGNvbnZlcnNpb24NCi0gKiAgICAgICAgICAgd2lsbCBzdGFydCBhdCBuZXh0IHRyaWdnZXIgZXZlbnQgKG9uIHRoZSBzZWxlY3RlZCB0cmlnZ2VyIGVkZ2UpDQotICogICAgICAgICAgIGZvbGxvd2luZyB0aGUgQURDIHN0YXJ0IGNvbnZlcnNpb24gY29tbWFuZC4NCi0gKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bw0KLSAqICAgICAgICAgQURDIHN0YXRlOg0KLSAqICAgICAgICAgQURDIG11c3QgYmUgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcgb24gZ3JvdXAgaW5qZWN0ZWQsDQotICogICAgICAgICB3aXRob3V0IGNvbnZlcnNpb24gc3RvcCBjb21tYW5kIG9uIGdvaW5nIG9uIGdyb3VwIGluamVjdGVkLA0KLSAqICAgICAgICAgd2l0aG91dCBBREMgZGlzYWJsZSBjb21tYW5kIG9uIGdvaW5nLg0KLSAqIEBybXRvbGwgQ1IgICAgICAgSkFEU1RBUlQgICAgICAgTExfQURDX0lOSl9TdGFydENvbnZlcnNpb24NCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0lOSl9TdGFydENvbnZlcnNpb24oQURDX1R5cGVEZWYgKkFEQ3gpIHsNCi0gIC8qIE5vdGU6IFdyaXRlIHJlZ2lzdGVyIHdpdGggc29tZSBhZGRpdGlvbmFsIGJpdHMgZm9yY2VkIHRvIHN0YXRlIHJlc2V0ICAgICAqLw0KLSAgLyogICAgICAgaW5zdGVhZCBvZiBtb2RpZnlpbmcgb25seSB0aGUgc2VsZWN0ZWQgYml0IGZvciB0aGlzIGZ1bmN0aW9uLCAgICAgICovDQotICAvKiAgICAgICB0byBub3QgaW50ZXJmZXJlIHdpdGggYml0cyB3aXRoIEhXIHByb3BlcnR5ICJycyIuICAgICAgICAgICAgICAgICAgKi8NCi0gIE1PRElGWV9SRUcoQURDeC0+Q1IsIEFEQ19DUl9CSVRTX1BST1BFUlRZX1JTLCBBRENfQ1JfSkFEU1RBUlQpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFN0b3AgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24uDQotICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllcywgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8NCi0gKiAgICAgICAgIEFEQyBzdGF0ZToNCi0gKiAgICAgICAgIEFEQyBtdXN0IGJlIGVuYWJsZWQgd2l0aCBjb252ZXJzaW9uIG9uIGdvaW5nIG9uIGdyb3VwIGluamVjdGVkLA0KLSAqICAgICAgICAgd2l0aG91dCBBREMgZGlzYWJsZSBjb21tYW5kIG9uIGdvaW5nLg0KLSAqIEBybXRvbGwgQ1IgICAgICAgSkFEU1RQICAgICAgICAgTExfQURDX0lOSl9TdG9wQ29udmVyc2lvbg0KLSAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfSU5KX1N0b3BDb252ZXJzaW9uKEFEQ19UeXBlRGVmICpBREN4KSB7DQotICAvKiBOb3RlOiBXcml0ZSByZWdpc3RlciB3aXRoIHNvbWUgYWRkaXRpb25hbCBiaXRzIGZvcmNlZCB0byBzdGF0ZSByZXNldCAgICAgKi8NCi0gIC8qICAgICAgIGluc3RlYWQgb2YgbW9kaWZ5aW5nIG9ubHkgdGhlIHNlbGVjdGVkIGJpdCBmb3IgdGhpcyBmdW5jdGlvbiwgICAgICAqLw0KLSAgLyogICAgICAgdG8gbm90IGludGVyZmVyZSB3aXRoIGJpdHMgd2l0aCBIVyBwcm9wZXJ0eSAicnMiLiAgICAgICAgICAgICAgICAgICovDQotICBNT0RJRllfUkVHKEFEQ3gtPkNSLCBBRENfQ1JfQklUU19QUk9QRVJUWV9SUywgQURDX0NSX0pBRFNUUCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHN0YXRlLg0KLSAqIEBybXRvbGwgQ1IgICAgICAgSkFEU1RBUlQgICAgICAgTExfQURDX0lOSl9Jc0NvbnZlcnNpb25PbmdvaW5nDQotICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgMDogbm8gY29udmVyc2lvbiBpcyBvbiBnb2luZyBvbiBBREMgZ3JvdXAgaW5qZWN0ZWQuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19JTkpfSXNDb252ZXJzaW9uT25nb2luZyhBRENfVHlwZURlZiAqQURDeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoQURDeC0+Q1IsIEFEQ19DUl9KQURTVEFSVCkgPT0gKEFEQ19DUl9KQURTVEFSVCkpID8gMVVMDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29tbWFuZCBvZiBjb252ZXJzaW9uIHN0b3Agc3RhdGUNCi0gKiBAcm10b2xsIENSICAgICAgIEpBRFNUUCAgICAgICAgIExMX0FEQ19JTkpfSXNTdG9wQ29udmVyc2lvbk9uZ29pbmcNCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHJldHZhbCAwOiBubyBjb21tYW5kIG9mIGNvbnZlcnNpb24gc3RvcCBpcyBvbiBnb2luZyBvbiBBREMgZ3JvdXAgaW5qZWN0ZWQuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19JTkpfSXNTdG9wQ29udmVyc2lvbk9uZ29pbmcoQURDX1R5cGVEZWYgKkFEQ3gpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKEFEQ3gtPkNSLCBBRENfQ1JfSkFEU1RQKSA9PSAoQURDX0NSX0pBRFNUUCkpID8gMVVMIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gZGF0YSwgcmFuZ2UgZml0IGZvcg0KLSAqICAgICAgICAgYWxsIEFEQyBjb25maWd1cmF0aW9uczogYWxsIEFEQyByZXNvbHV0aW9ucyBhbmQNCi0gKiAgICAgICAgIGFsbCBvdmVyc2FtcGxpbmcgaW5jcmVhc2VkIGRhdGEgd2lkdGggKGZvciBkZXZpY2VzDQotICogICAgICAgICB3aXRoIGZlYXR1cmUgb3ZlcnNhbXBsaW5nKS4NCi0gKiBAcm10b2xsIEpEUjEgICAgIEpEQVRBICAgICAgICAgIExMX0FEQ19JTkpfUmVhZENvbnZlcnNpb25EYXRhMzJcbg0KLSAqICAgICAgICAgSkRSMiAgICAgSkRBVEEgICAgICAgICAgTExfQURDX0lOSl9SZWFkQ29udmVyc2lvbkRhdGEzMlxuDQotICogICAgICAgICBKRFIzICAgICBKREFUQSAgICAgICAgICBMTF9BRENfSU5KX1JlYWRDb252ZXJzaW9uRGF0YTMyXG4NCi0gKiAgICAgICAgIEpEUjQgICAgIEpEQVRBICAgICAgICAgIExMX0FEQ19JTkpfUmVhZENvbnZlcnNpb25EYXRhMzINCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHBhcmFtICBSYW5rIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9SQU5LXzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1JBTktfMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfUkFOS18zDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9SQU5LXzQNCi0gKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMDAwMDAwMCBhbmQgTWF4X0RhdGE9MHhGRkZGRkZGRg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSU5KX1JlYWRDb252ZXJzaW9uRGF0YTMyKEFEQ19UeXBlRGVmICpBREN4LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFJhbmspIHsNCi0gIGNvbnN0IF9fSU8gdWludDMyX3QgKnByZWcgPSBfX0FEQ19QVFJfUkVHX09GRlNFVCgNCi0gICAgICBBREN4LT5KRFIxLA0KLSAgICAgICgoUmFuayAmIEFEQ19JTkpfSkRSWF9SRUdPRkZTRVRfTUFTSykgPj4gQURDX0pEUlhfUkVHT0ZGU0VUX1BPUykpOw0KLQ0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoKnByZWcsIEFEQ19KRFIxX0pEQVRBKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIGRhdGEsIHJhbmdlIGZpdCBmb3INCi0gKiAgICAgICAgIEFEQyByZXNvbHV0aW9uIDEyIGJpdHMuDQotICogQG5vdGUgICBGb3IgZGV2aWNlcyB3aXRoIGZlYXR1cmUgb3ZlcnNhbXBsaW5nOiBPdmVyc2FtcGxpbmcNCi0gKiAgICAgICAgIGNhbiBpbmNyZWFzZSBkYXRhIHdpZHRoLCBmdW5jdGlvbiBmb3IgZXh0ZW5kZWQgcmFuZ2UNCi0gKiAgICAgICAgIG1heSBiZSBuZWVkZWQ6IEByZWYgTExfQURDX0lOSl9SZWFkQ29udmVyc2lvbkRhdGEzMi4NCi0gKiBAcm10b2xsIEpEUjEgICAgIEpEQVRBICAgICAgICAgIExMX0FEQ19JTkpfUmVhZENvbnZlcnNpb25EYXRhMTJcbg0KLSAqICAgICAgICAgSkRSMiAgICAgSkRBVEEgICAgICAgICAgTExfQURDX0lOSl9SZWFkQ29udmVyc2lvbkRhdGExMlxuDQotICogICAgICAgICBKRFIzICAgICBKREFUQSAgICAgICAgICBMTF9BRENfSU5KX1JlYWRDb252ZXJzaW9uRGF0YTEyXG4NCi0gKiAgICAgICAgIEpEUjQgICAgIEpEQVRBICAgICAgICAgIExMX0FEQ19JTkpfUmVhZENvbnZlcnNpb25EYXRhMTINCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHBhcmFtICBSYW5rIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9SQU5LXzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1JBTktfMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfUkFOS18zDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9SQU5LXzQNCi0gKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMDAgYW5kIE1heF9EYXRhPTB4RkZGDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQxNl90IExMX0FEQ19JTkpfUmVhZENvbnZlcnNpb25EYXRhMTIoQURDX1R5cGVEZWYgKkFEQ3gsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUmFuaykgew0KLSAgY29uc3QgX19JTyB1aW50MzJfdCAqcHJlZyA9IF9fQURDX1BUUl9SRUdfT0ZGU0VUKA0KLSAgICAgIEFEQ3gtPkpEUjEsDQotICAgICAgKChSYW5rICYgQURDX0lOSl9KRFJYX1JFR09GRlNFVF9NQVNLKSA+PiBBRENfSkRSWF9SRUdPRkZTRVRfUE9TKSk7DQotDQotICByZXR1cm4gKHVpbnQxNl90KShSRUFEX0JJVCgqcHJlZywgQURDX0pEUjFfSkRBVEEpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gZGF0YSwgcmFuZ2UgZml0IGZvcg0KLSAqICAgICAgICAgQURDIHJlc29sdXRpb24gMTAgYml0cy4NCi0gKiBAbm90ZSAgIEZvciBkZXZpY2VzIHdpdGggZmVhdHVyZSBvdmVyc2FtcGxpbmc6IE92ZXJzYW1wbGluZw0KLSAqICAgICAgICAgY2FuIGluY3JlYXNlIGRhdGEgd2lkdGgsIGZ1bmN0aW9uIGZvciBleHRlbmRlZCByYW5nZQ0KLSAqICAgICAgICAgbWF5IGJlIG5lZWRlZDogQHJlZiBMTF9BRENfSU5KX1JlYWRDb252ZXJzaW9uRGF0YTMyLg0KLSAqIEBybXRvbGwgSkRSMSAgICAgSkRBVEEgICAgICAgICAgTExfQURDX0lOSl9SZWFkQ29udmVyc2lvbkRhdGExMFxuDQotICogICAgICAgICBKRFIyICAgICBKREFUQSAgICAgICAgICBMTF9BRENfSU5KX1JlYWRDb252ZXJzaW9uRGF0YTEwXG4NCi0gKiAgICAgICAgIEpEUjMgICAgIEpEQVRBICAgICAgICAgIExMX0FEQ19JTkpfUmVhZENvbnZlcnNpb25EYXRhMTBcbg0KLSAqICAgICAgICAgSkRSNCAgICAgSkRBVEEgICAgICAgICAgTExfQURDX0lOSl9SZWFkQ29udmVyc2lvbkRhdGExMA0KLSAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UNCi0gKiBAcGFyYW0gIFJhbmsgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1JBTktfMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfUkFOS18yDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9SQU5LXzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1JBTktfNA0KLSAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMCBhbmQgTWF4X0RhdGE9MHgzRkYNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDE2X3QgTExfQURDX0lOSl9SZWFkQ29udmVyc2lvbkRhdGExMChBRENfVHlwZURlZiAqQURDeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBSYW5rKSB7DQotICBjb25zdCBfX0lPIHVpbnQzMl90ICpwcmVnID0gX19BRENfUFRSX1JFR19PRkZTRVQoDQotICAgICAgQURDeC0+SkRSMSwNCi0gICAgICAoKFJhbmsgJiBBRENfSU5KX0pEUlhfUkVHT0ZGU0VUX01BU0spID4+IEFEQ19KRFJYX1JFR09GRlNFVF9QT1MpKTsNCi0NCi0gIHJldHVybiAodWludDE2X3QpKFJFQURfQklUKCpwcmVnLCBBRENfSkRSMV9KREFUQSkpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiBkYXRhLCByYW5nZSBmaXQgZm9yDQotICogICAgICAgICBBREMgcmVzb2x1dGlvbiA4IGJpdHMuDQotICogQG5vdGUgICBGb3IgZGV2aWNlcyB3aXRoIGZlYXR1cmUgb3ZlcnNhbXBsaW5nOiBPdmVyc2FtcGxpbmcNCi0gKiAgICAgICAgIGNhbiBpbmNyZWFzZSBkYXRhIHdpZHRoLCBmdW5jdGlvbiBmb3IgZXh0ZW5kZWQgcmFuZ2UNCi0gKiAgICAgICAgIG1heSBiZSBuZWVkZWQ6IEByZWYgTExfQURDX0lOSl9SZWFkQ29udmVyc2lvbkRhdGEzMi4NCi0gKiBAcm10b2xsIEpEUjEgICAgIEpEQVRBICAgICAgICAgIExMX0FEQ19JTkpfUmVhZENvbnZlcnNpb25EYXRhOFxuDQotICogICAgICAgICBKRFIyICAgICBKREFUQSAgICAgICAgICBMTF9BRENfSU5KX1JlYWRDb252ZXJzaW9uRGF0YThcbg0KLSAqICAgICAgICAgSkRSMyAgICAgSkRBVEEgICAgICAgICAgTExfQURDX0lOSl9SZWFkQ29udmVyc2lvbkRhdGE4XG4NCi0gKiAgICAgICAgIEpEUjQgICAgIEpEQVRBICAgICAgICAgIExMX0FEQ19JTkpfUmVhZENvbnZlcnNpb25EYXRhOA0KLSAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UNCi0gKiBAcGFyYW0gIFJhbmsgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1JBTktfMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfUkFOS18yDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9SQU5LXzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1JBTktfNA0KLSAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEZGDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQ4X3QgTExfQURDX0lOSl9SZWFkQ29udmVyc2lvbkRhdGE4KEFEQ19UeXBlRGVmICpBREN4LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBSYW5rKSB7DQotICBjb25zdCBfX0lPIHVpbnQzMl90ICpwcmVnID0gX19BRENfUFRSX1JFR19PRkZTRVQoDQotICAgICAgQURDeC0+SkRSMSwNCi0gICAgICAoKFJhbmsgJiBBRENfSU5KX0pEUlhfUkVHT0ZGU0VUX01BU0spID4+IEFEQ19KRFJYX1JFR09GRlNFVF9QT1MpKTsNCi0NCi0gIHJldHVybiAodWludDhfdCkoUkVBRF9CSVQoKnByZWcsIEFEQ19KRFIxX0pEQVRBKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIGRhdGEsIHJhbmdlIGZpdCBmb3INCi0gKiAgICAgICAgIEFEQyByZXNvbHV0aW9uIDYgYml0cy4NCi0gKiBAbm90ZSAgIEZvciBkZXZpY2VzIHdpdGggZmVhdHVyZSBvdmVyc2FtcGxpbmc6IE92ZXJzYW1wbGluZw0KLSAqICAgICAgICAgY2FuIGluY3JlYXNlIGRhdGEgd2lkdGgsIGZ1bmN0aW9uIGZvciBleHRlbmRlZCByYW5nZQ0KLSAqICAgICAgICAgbWF5IGJlIG5lZWRlZDogQHJlZiBMTF9BRENfSU5KX1JlYWRDb252ZXJzaW9uRGF0YTMyLg0KLSAqIEBybXRvbGwgSkRSMSAgICAgSkRBVEEgICAgICAgICAgTExfQURDX0lOSl9SZWFkQ29udmVyc2lvbkRhdGE2XG4NCi0gKiAgICAgICAgIEpEUjIgICAgIEpEQVRBICAgICAgICAgIExMX0FEQ19JTkpfUmVhZENvbnZlcnNpb25EYXRhNlxuDQotICogICAgICAgICBKRFIzICAgICBKREFUQSAgICAgICAgICBMTF9BRENfSU5KX1JlYWRDb252ZXJzaW9uRGF0YTZcbg0KLSAqICAgICAgICAgSkRSNCAgICAgSkRBVEEgICAgICAgICAgTExfQURDX0lOSl9SZWFkQ29udmVyc2lvbkRhdGE2DQotICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQ0KLSAqIEBwYXJhbSAgUmFuayBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfUkFOS18xDQotICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9SQU5LXzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1JBTktfMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfUkFOS180DQotICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4M0YNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDhfdCBMTF9BRENfSU5KX1JlYWRDb252ZXJzaW9uRGF0YTYoQURDX1R5cGVEZWYgKkFEQ3gsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFJhbmspIHsNCi0gIGNvbnN0IF9fSU8gdWludDMyX3QgKnByZWcgPSBfX0FEQ19QVFJfUkVHX09GRlNFVCgNCi0gICAgICBBREN4LT5KRFIxLA0KLSAgICAgICgoUmFuayAmIEFEQ19JTkpfSkRSWF9SRUdPRkZTRVRfTUFTSykgPj4gQURDX0pEUlhfUkVHT0ZGU0VUX1BPUykpOw0KLQ0KLSAgcmV0dXJuICh1aW50OF90KShSRUFEX0JJVCgqcHJlZywgQURDX0pEUjFfSkRBVEEpKTsNCi19DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEFEQ19MTF9FRl9GTEFHX01hbmFnZW1lbnQgQURDIGZsYWcgbWFuYWdlbWVudA0KLSAqIEB7DQotICovDQotDQotLyoqDQotICogQGJyaWVmICBHZXQgZmxhZyBBREMgcmVhZHkuDQotICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllcywgZmxhZyBMTF9BRENfRkxBR19BRFJEWSBpcyByYWlzZWQgd2hlbiB0aGUgQURDDQotICogICAgICAgICBpcyBlbmFibGVkIGFuZCB3aGVuIGNvbnZlcnNpb24gY2xvY2sgaXMgYWN0aXZlLg0KLSAqICAgICAgICAgKG5vdCBvbmx5IGNvcmUgY2xvY2s6IHRoaXMgQURDIGhhcyBhIGR1YWwgY2xvY2sgZG9tYWluKQ0KLSAqIEBybXRvbGwgSVNSICAgICAgQURSRFkgICAgICAgICAgTExfQURDX0lzQWN0aXZlRmxhZ19BRFJEWQ0KLSAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzQWN0aXZlRmxhZ19BRFJEWShBRENfVHlwZURlZiAqQURDeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoQURDeC0+SVNSLCBMTF9BRENfRkxBR19BRFJEWSkgPT0gKExMX0FEQ19GTEFHX0FEUkRZKSkNCi0gICAgICAgICAgICAgID8gMVVMDQotICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IGZsYWcgQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHVuaXRhcnkgY29udmVyc2lvbi4NCi0gKiBAcm10b2xsIElTUiAgICAgIEVPQyAgICAgICAgICAgIExMX0FEQ19Jc0FjdGl2ZUZsYWdfRU9DDQotICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSXNBY3RpdmVGbGFnX0VPQyhBRENfVHlwZURlZiAqQURDeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoQURDeC0+SVNSLCBBRENfSVNSX0VPQykgPT0gKEFEQ19JU1JfRU9DKSkgPyAxVUwgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBmbGFnIEFEQyBncm91cCByZWd1bGFyIGVuZCBvZiBzZXF1ZW5jZSBjb252ZXJzaW9ucy4NCi0gKiBAcm10b2xsIElTUiAgICAgIEVPUyAgICAgICAgICAgIExMX0FEQ19Jc0FjdGl2ZUZsYWdfRU9TDQotICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSXNBY3RpdmVGbGFnX0VPUyhBRENfVHlwZURlZiAqQURDeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoQURDeC0+SVNSLCBMTF9BRENfRkxBR19FT1MpID09IChMTF9BRENfRkxBR19FT1MpKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IGZsYWcgQURDIGdyb3VwIHJlZ3VsYXIgb3ZlcnJ1bi4NCi0gKiBAcm10b2xsIElTUiAgICAgIE9WUiAgICAgICAgICAgIExMX0FEQ19Jc0FjdGl2ZUZsYWdfT1ZSDQotICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSXNBY3RpdmVGbGFnX09WUihBRENfVHlwZURlZiAqQURDeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoQURDeC0+SVNSLCBMTF9BRENfRkxBR19PVlIpID09IChMTF9BRENfRkxBR19PVlIpKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IGZsYWcgQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHNhbXBsaW5nIHBoYXNlLg0KLSAqIEBybXRvbGwgSVNSICAgICAgRU9TTVAgICAgICAgICAgTExfQURDX0lzQWN0aXZlRmxhZ19FT1NNUA0KLSAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzQWN0aXZlRmxhZ19FT1NNUChBRENfVHlwZURlZiAqQURDeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoQURDeC0+SVNSLCBMTF9BRENfRkxBR19FT1NNUCkgPT0gKExMX0FEQ19GTEFHX0VPU01QKSkNCi0gICAgICAgICAgICAgID8gMVVMDQotICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IGZsYWcgQURDIGdyb3VwIGluamVjdGVkIGVuZCBvZiB1bml0YXJ5IGNvbnZlcnNpb24uDQotICogQHJtdG9sbCBJU1IgICAgICBKRU9DICAgICAgICAgICBMTF9BRENfSXNBY3RpdmVGbGFnX0pFT0MNCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0FjdGl2ZUZsYWdfSkVPQyhBRENfVHlwZURlZiAqQURDeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoQURDeC0+SVNSLCBMTF9BRENfRkxBR19KRU9DKSA9PSAoTExfQURDX0ZMQUdfSkVPQykpID8gMVVMDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBmbGFnIEFEQyBncm91cCBpbmplY3RlZCBlbmQgb2Ygc2VxdWVuY2UgY29udmVyc2lvbnMuDQotICogQHJtdG9sbCBJU1IgICAgICBKRU9TICAgICAgICAgICBMTF9BRENfSXNBY3RpdmVGbGFnX0pFT1MNCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0FjdGl2ZUZsYWdfSkVPUyhBRENfVHlwZURlZiAqQURDeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoQURDeC0+SVNSLCBMTF9BRENfRkxBR19KRU9TKSA9PSAoTExfQURDX0ZMQUdfSkVPUykpID8gMVVMDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBmbGFnIEFEQyBncm91cCBpbmplY3RlZCBjb250ZXh0cyBxdWV1ZSBvdmVyZmxvdy4NCi0gKiBAcm10b2xsIElTUiAgICAgIEpRT1ZGICAgICAgICAgIExMX0FEQ19Jc0FjdGl2ZUZsYWdfSlFPVkYNCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0FjdGl2ZUZsYWdfSlFPVkYoQURDX1R5cGVEZWYgKkFEQ3gpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKEFEQ3gtPklTUiwgTExfQURDX0ZMQUdfSlFPVkYpID09IChMTF9BRENfRkxBR19KUU9WRikpDQotICAgICAgICAgICAgICA/IDFVTA0KLSAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBmbGFnIEFEQyBhbmFsb2cgd2F0Y2hkb2cgMSBmbGFnDQotICogQHJtdG9sbCBJU1IgICAgICBBV0QxICAgICAgICAgICBMTF9BRENfSXNBY3RpdmVGbGFnX0FXRDENCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0FjdGl2ZUZsYWdfQVdEMShBRENfVHlwZURlZiAqQURDeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoQURDeC0+SVNSLCBMTF9BRENfRkxBR19BV0QxKSA9PSAoTExfQURDX0ZMQUdfQVdEMSkpID8gMVVMDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBmbGFnIEFEQyBhbmFsb2cgd2F0Y2hkb2cgMi4NCi0gKiBAcm10b2xsIElTUiAgICAgIEFXRDIgICAgICAgICAgIExMX0FEQ19Jc0FjdGl2ZUZsYWdfQVdEMg0KLSAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzQWN0aXZlRmxhZ19BV0QyKEFEQ19UeXBlRGVmICpBREN4KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChBREN4LT5JU1IsIExMX0FEQ19GTEFHX0FXRDIpID09IChMTF9BRENfRkxBR19BV0QyKSkgPyAxVUwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IGZsYWcgQURDIGFuYWxvZyB3YXRjaGRvZyAzLg0KLSAqIEBybXRvbGwgSVNSICAgICAgQVdEMyAgICAgICAgICAgTExfQURDX0lzQWN0aXZlRmxhZ19BV0QzDQotICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSXNBY3RpdmVGbGFnX0FXRDMoQURDX1R5cGVEZWYgKkFEQ3gpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKEFEQ3gtPklTUiwgTExfQURDX0ZMQUdfQVdEMykgPT0gKExMX0FEQ19GTEFHX0FXRDMpKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDbGVhciBmbGFnIEFEQyByZWFkeS4NCi0gKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBmbGFnIExMX0FEQ19GTEFHX0FEUkRZIGlzIHJhaXNlZCB3aGVuIHRoZSBBREMNCi0gKiAgICAgICAgIGlzIGVuYWJsZWQgYW5kIHdoZW4gY29udmVyc2lvbiBjbG9jayBpcyBhY3RpdmUuDQotICogICAgICAgICAobm90IG9ubHkgY29yZSBjbG9jazogdGhpcyBBREMgaGFzIGEgZHVhbCBjbG9jayBkb21haW4pDQotICogQHJtdG9sbCBJU1IgICAgICBBRFJEWSAgICAgICAgICBMTF9BRENfQ2xlYXJGbGFnX0FEUkRZDQotICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19DbGVhckZsYWdfQURSRFkoQURDX1R5cGVEZWYgKkFEQ3gpIHsNCi0gIFdSSVRFX1JFRyhBREN4LT5JU1IsIExMX0FEQ19GTEFHX0FEUkRZKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDbGVhciBmbGFnIEFEQyBncm91cCByZWd1bGFyIGVuZCBvZiB1bml0YXJ5IGNvbnZlcnNpb24uDQotICogQHJtdG9sbCBJU1IgICAgICBFT0MgICAgICAgICAgICBMTF9BRENfQ2xlYXJGbGFnX0VPQw0KLSAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfQ2xlYXJGbGFnX0VPQyhBRENfVHlwZURlZiAqQURDeCkgew0KLSAgV1JJVEVfUkVHKEFEQ3gtPklTUiwgTExfQURDX0ZMQUdfRU9DKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDbGVhciBmbGFnIEFEQyBncm91cCByZWd1bGFyIGVuZCBvZiBzZXF1ZW5jZSBjb252ZXJzaW9ucy4NCi0gKiBAcm10b2xsIElTUiAgICAgIEVPUyAgICAgICAgICAgIExMX0FEQ19DbGVhckZsYWdfRU9TDQotICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19DbGVhckZsYWdfRU9TKEFEQ19UeXBlRGVmICpBREN4KSB7DQotICBXUklURV9SRUcoQURDeC0+SVNSLCBMTF9BRENfRkxBR19FT1MpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENsZWFyIGZsYWcgQURDIGdyb3VwIHJlZ3VsYXIgb3ZlcnJ1bi4NCi0gKiBAcm10b2xsIElTUiAgICAgIE9WUiAgICAgICAgICAgIExMX0FEQ19DbGVhckZsYWdfT1ZSDQotICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19DbGVhckZsYWdfT1ZSKEFEQ19UeXBlRGVmICpBREN4KSB7DQotICBXUklURV9SRUcoQURDeC0+SVNSLCBMTF9BRENfRkxBR19PVlIpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENsZWFyIGZsYWcgQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHNhbXBsaW5nIHBoYXNlLg0KLSAqIEBybXRvbGwgSVNSICAgICAgRU9TTVAgICAgICAgICAgTExfQURDX0NsZWFyRmxhZ19FT1NNUA0KLSAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfQ2xlYXJGbGFnX0VPU01QKEFEQ19UeXBlRGVmICpBREN4KSB7DQotICBXUklURV9SRUcoQURDeC0+SVNSLCBMTF9BRENfRkxBR19FT1NNUCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2xlYXIgZmxhZyBBREMgZ3JvdXAgaW5qZWN0ZWQgZW5kIG9mIHVuaXRhcnkgY29udmVyc2lvbi4NCi0gKiBAcm10b2xsIElTUiAgICAgIEpFT0MgICAgICAgICAgIExMX0FEQ19DbGVhckZsYWdfSkVPQw0KLSAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfQ2xlYXJGbGFnX0pFT0MoQURDX1R5cGVEZWYgKkFEQ3gpIHsNCi0gIFdSSVRFX1JFRyhBREN4LT5JU1IsIExMX0FEQ19GTEFHX0pFT0MpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENsZWFyIGZsYWcgQURDIGdyb3VwIGluamVjdGVkIGVuZCBvZiBzZXF1ZW5jZSBjb252ZXJzaW9ucy4NCi0gKiBAcm10b2xsIElTUiAgICAgIEpFT1MgICAgICAgICAgIExMX0FEQ19DbGVhckZsYWdfSkVPUw0KLSAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfQ2xlYXJGbGFnX0pFT1MoQURDX1R5cGVEZWYgKkFEQ3gpIHsNCi0gIFdSSVRFX1JFRyhBREN4LT5JU1IsIExMX0FEQ19GTEFHX0pFT1MpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENsZWFyIGZsYWcgQURDIGdyb3VwIGluamVjdGVkIGNvbnRleHRzIHF1ZXVlIG92ZXJmbG93Lg0KLSAqIEBybXRvbGwgSVNSICAgICAgSlFPVkYgICAgICAgICAgTExfQURDX0NsZWFyRmxhZ19KUU9WRg0KLSAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfQ2xlYXJGbGFnX0pRT1ZGKEFEQ19UeXBlRGVmICpBREN4KSB7DQotICBXUklURV9SRUcoQURDeC0+SVNSLCBMTF9BRENfRkxBR19KUU9WRik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2xlYXIgZmxhZyBBREMgYW5hbG9nIHdhdGNoZG9nIDEuDQotICogQHJtdG9sbCBJU1IgICAgICBBV0QxICAgICAgICAgICBMTF9BRENfQ2xlYXJGbGFnX0FXRDENCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0NsZWFyRmxhZ19BV0QxKEFEQ19UeXBlRGVmICpBREN4KSB7DQotICBXUklURV9SRUcoQURDeC0+SVNSLCBMTF9BRENfRkxBR19BV0QxKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDbGVhciBmbGFnIEFEQyBhbmFsb2cgd2F0Y2hkb2cgMi4NCi0gKiBAcm10b2xsIElTUiAgICAgIEFXRDIgICAgICAgICAgIExMX0FEQ19DbGVhckZsYWdfQVdEMg0KLSAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfQ2xlYXJGbGFnX0FXRDIoQURDX1R5cGVEZWYgKkFEQ3gpIHsNCi0gIFdSSVRFX1JFRyhBREN4LT5JU1IsIExMX0FEQ19GTEFHX0FXRDIpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENsZWFyIGZsYWcgQURDIGFuYWxvZyB3YXRjaGRvZyAzLg0KLSAqIEBybXRvbGwgSVNSICAgICAgQVdEMyAgICAgICAgICAgTExfQURDX0NsZWFyRmxhZ19BV0QzDQotICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19DbGVhckZsYWdfQVdEMyhBRENfVHlwZURlZiAqQURDeCkgew0KLSAgV1JJVEVfUkVHKEFEQ3gtPklTUiwgTExfQURDX0ZMQUdfQVdEMyk7DQotfQ0KLQ0KLSNpZiBkZWZpbmVkKEFEQ19NVUxUSU1PREVfU1VQUE9SVCkNCi0vKioNCi0gKiBAYnJpZWYgIEdldCBmbGFnIG11bHRpbW9kZSBBREMgcmVhZHkgb2YgdGhlIEFEQyBtYXN0ZXIuDQotICogQHJtdG9sbCBDU1IgICAgICBBRFJEWV9NU1QgICAgICBMTF9BRENfSXNBY3RpdmVGbGFnX01TVF9BRFJEWQ0KLSAqIEBwYXJhbSAgQURDeHlfQ09NTU9OIEFEQyBjb21tb24gaW5zdGFuY2UNCi0gKiAgICAgICAgIChjYW4gYmUgc2V0IGRpcmVjdGx5IGZyb20gQ01TSVMgZGVmaW5pdGlvbiBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8NCi0gKiBAcmVmIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRSgpICkNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QNCi1MTF9BRENfSXNBY3RpdmVGbGFnX01TVF9BRFJEWShBRENfQ29tbW9uX1R5cGVEZWYgKkFEQ3h5X0NPTU1PTikgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoQURDeHlfQ09NTU9OLT5DU1IsIExMX0FEQ19GTEFHX0FEUkRZX01TVCkgPT0NCi0gICAgICAgICAgIChMTF9BRENfRkxBR19BRFJEWV9NU1QpKQ0KLSAgICAgICAgICAgICAgPyAxVUwNCi0gICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgZmxhZyBtdWx0aW1vZGUgQURDIHJlYWR5IG9mIHRoZSBBREMgc2xhdmUuDQotICogQHJtdG9sbCBDU1IgICAgICBBRFJEWV9TTFYgICAgICBMTF9BRENfSXNBY3RpdmVGbGFnX1NMVl9BRFJEWQ0KLSAqIEBwYXJhbSAgQURDeHlfQ09NTU9OIEFEQyBjb21tb24gaW5zdGFuY2UNCi0gKiAgICAgICAgIChjYW4gYmUgc2V0IGRpcmVjdGx5IGZyb20gQ01TSVMgZGVmaW5pdGlvbiBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8NCi0gKiBAcmVmIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRSgpICkNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QNCi1MTF9BRENfSXNBY3RpdmVGbGFnX1NMVl9BRFJEWShBRENfQ29tbW9uX1R5cGVEZWYgKkFEQ3h5X0NPTU1PTikgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoQURDeHlfQ09NTU9OLT5DU1IsIExMX0FEQ19GTEFHX0FEUkRZX1NMVikgPT0NCi0gICAgICAgICAgIChMTF9BRENfRkxBR19BRFJEWV9TTFYpKQ0KLSAgICAgICAgICAgICAgPyAxVUwNCi0gICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgZmxhZyBtdWx0aW1vZGUgQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHVuaXRhcnkgY29udmVyc2lvbiBvZiB0aGUNCi0gKiBBREMgbWFzdGVyLg0KLSAqIEBybXRvbGwgQ1NSICAgICAgRU9DX01TVCAgICAgICAgTExfQURDX0lzQWN0aXZlRmxhZ19NU1RfRU9DDQotICogQHBhcmFtICBBREN4eV9DT01NT04gQURDIGNvbW1vbiBpbnN0YW5jZQ0KLSAqICAgICAgICAgKGNhbiBiZSBzZXQgZGlyZWN0bHkgZnJvbSBDTVNJUyBkZWZpbml0aW9uIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybw0KLSAqIEByZWYgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKCkgKQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdA0KLUxMX0FEQ19Jc0FjdGl2ZUZsYWdfTVNUX0VPQyhBRENfQ29tbW9uX1R5cGVEZWYgKkFEQ3h5X0NPTU1PTikgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoQURDeHlfQ09NTU9OLT5DU1IsIExMX0FEQ19GTEFHX0VPQ19TTFYpID09DQotICAgICAgICAgICAoTExfQURDX0ZMQUdfRU9DX1NMVikpDQotICAgICAgICAgICAgICA/IDFVTA0KLSAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBmbGFnIG11bHRpbW9kZSBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2YgdW5pdGFyeSBjb252ZXJzaW9uIG9mIHRoZQ0KLSAqIEFEQyBzbGF2ZS4NCi0gKiBAcm10b2xsIENTUiAgICAgIEVPQ19TTFYgICAgICAgIExMX0FEQ19Jc0FjdGl2ZUZsYWdfU0xWX0VPQw0KLSAqIEBwYXJhbSAgQURDeHlfQ09NTU9OIEFEQyBjb21tb24gaW5zdGFuY2UNCi0gKiAgICAgICAgIChjYW4gYmUgc2V0IGRpcmVjdGx5IGZyb20gQ01TSVMgZGVmaW5pdGlvbiBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8NCi0gKiBAcmVmIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRSgpICkNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QNCi1MTF9BRENfSXNBY3RpdmVGbGFnX1NMVl9FT0MoQURDX0NvbW1vbl9UeXBlRGVmICpBREN4eV9DT01NT04pIHsNCi0gIHJldHVybiAoKFJFQURfQklUKEFEQ3h5X0NPTU1PTi0+Q1NSLCBMTF9BRENfRkxBR19FT0NfU0xWKSA9PQ0KLSAgICAgICAgICAgKExMX0FEQ19GTEFHX0VPQ19TTFYpKQ0KLSAgICAgICAgICAgICAgPyAxVUwNCi0gICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgZmxhZyBtdWx0aW1vZGUgQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHNlcXVlbmNlIGNvbnZlcnNpb25zIG9mDQotICogdGhlIEFEQyBtYXN0ZXIuDQotICogQHJtdG9sbCBDU1IgICAgICBFT1NfTVNUICAgICAgICBMTF9BRENfSXNBY3RpdmVGbGFnX01TVF9FT1MNCi0gKiBAcGFyYW0gIEFEQ3h5X0NPTU1PTiBBREMgY29tbW9uIGluc3RhbmNlDQotICogICAgICAgICAoY2FuIGJlIHNldCBkaXJlY3RseSBmcm9tIENNU0lTIGRlZmluaXRpb24gb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvDQotICogQHJlZiBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoKSApDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90DQotTExfQURDX0lzQWN0aXZlRmxhZ19NU1RfRU9TKEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OKSB7DQotICByZXR1cm4gKChSRUFEX0JJVChBREN4eV9DT01NT04tPkNTUiwgTExfQURDX0ZMQUdfRU9TX01TVCkgPT0NCi0gICAgICAgICAgIChMTF9BRENfRkxBR19FT1NfTVNUKSkNCi0gICAgICAgICAgICAgID8gMVVMDQotICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IGZsYWcgbXVsdGltb2RlIEFEQyBncm91cCByZWd1bGFyIGVuZCBvZiBzZXF1ZW5jZSBjb252ZXJzaW9ucyBvZg0KLSAqIHRoZSBBREMgc2xhdmUuDQotICogQHJtdG9sbCBDU1IgICAgICBFT1NfU0xWICAgICAgICBMTF9BRENfSXNBY3RpdmVGbGFnX1NMVl9FT1MNCi0gKiBAcGFyYW0gIEFEQ3h5X0NPTU1PTiBBREMgY29tbW9uIGluc3RhbmNlDQotICogICAgICAgICAoY2FuIGJlIHNldCBkaXJlY3RseSBmcm9tIENNU0lTIGRlZmluaXRpb24gb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvDQotICogQHJlZiBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoKSApDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90DQotTExfQURDX0lzQWN0aXZlRmxhZ19TTFZfRU9TKEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OKSB7DQotICByZXR1cm4gKChSRUFEX0JJVChBREN4eV9DT01NT04tPkNTUiwgTExfQURDX0ZMQUdfRU9TX1NMVikgPT0NCi0gICAgICAgICAgIChMTF9BRENfRkxBR19FT1NfU0xWKSkNCi0gICAgICAgICAgICAgID8gMVVMDQotICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IGZsYWcgbXVsdGltb2RlIEFEQyBncm91cCByZWd1bGFyIG92ZXJydW4gb2YgdGhlIEFEQyBtYXN0ZXIuDQotICogQHJtdG9sbCBDU1IgICAgICBPVlJfTVNUICAgICAgICBMTF9BRENfSXNBY3RpdmVGbGFnX01TVF9PVlINCi0gKiBAcGFyYW0gIEFEQ3h5X0NPTU1PTiBBREMgY29tbW9uIGluc3RhbmNlDQotICogICAgICAgICAoY2FuIGJlIHNldCBkaXJlY3RseSBmcm9tIENNU0lTIGRlZmluaXRpb24gb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvDQotICogQHJlZiBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoKSApDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90DQotTExfQURDX0lzQWN0aXZlRmxhZ19NU1RfT1ZSKEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OKSB7DQotICByZXR1cm4gKChSRUFEX0JJVChBREN4eV9DT01NT04tPkNTUiwgTExfQURDX0ZMQUdfT1ZSX01TVCkgPT0NCi0gICAgICAgICAgIChMTF9BRENfRkxBR19PVlJfTVNUKSkNCi0gICAgICAgICAgICAgID8gMVVMDQotICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IGZsYWcgbXVsdGltb2RlIEFEQyBncm91cCByZWd1bGFyIG92ZXJydW4gb2YgdGhlIEFEQyBzbGF2ZS4NCi0gKiBAcm10b2xsIENTUiAgICAgIE9WUl9TTFYgICAgICAgIExMX0FEQ19Jc0FjdGl2ZUZsYWdfU0xWX09WUg0KLSAqIEBwYXJhbSAgQURDeHlfQ09NTU9OIEFEQyBjb21tb24gaW5zdGFuY2UNCi0gKiAgICAgICAgIChjYW4gYmUgc2V0IGRpcmVjdGx5IGZyb20gQ01TSVMgZGVmaW5pdGlvbiBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8NCi0gKiBAcmVmIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRSgpICkNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QNCi1MTF9BRENfSXNBY3RpdmVGbGFnX1NMVl9PVlIoQURDX0NvbW1vbl9UeXBlRGVmICpBREN4eV9DT01NT04pIHsNCi0gIHJldHVybiAoKFJFQURfQklUKEFEQ3h5X0NPTU1PTi0+Q1NSLCBMTF9BRENfRkxBR19PVlJfU0xWKSA9PQ0KLSAgICAgICAgICAgKExMX0FEQ19GTEFHX09WUl9TTFYpKQ0KLSAgICAgICAgICAgICAgPyAxVUwNCi0gICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgZmxhZyBtdWx0aW1vZGUgQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHNhbXBsaW5nIG9mIHRoZSBBREMNCi0gKiBtYXN0ZXIuDQotICogQHJtdG9sbCBDU1IgICAgICBFT1NNUF9NU1QgICAgICBMTF9BRENfSXNBY3RpdmVGbGFnX01TVF9FT1NNUA0KLSAqIEBwYXJhbSAgQURDeHlfQ09NTU9OIEFEQyBjb21tb24gaW5zdGFuY2UNCi0gKiAgICAgICAgIChjYW4gYmUgc2V0IGRpcmVjdGx5IGZyb20gQ01TSVMgZGVmaW5pdGlvbiBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8NCi0gKiBAcmVmIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRSgpICkNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QNCi1MTF9BRENfSXNBY3RpdmVGbGFnX01TVF9FT1NNUChBRENfQ29tbW9uX1R5cGVEZWYgKkFEQ3h5X0NPTU1PTikgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoQURDeHlfQ09NTU9OLT5DU1IsIExMX0FEQ19GTEFHX0VPU01QX01TVCkgPT0NCi0gICAgICAgICAgIChMTF9BRENfRkxBR19FT1NNUF9NU1QpKQ0KLSAgICAgICAgICAgICAgPyAxVUwNCi0gICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgZmxhZyBtdWx0aW1vZGUgQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHNhbXBsaW5nIG9mIHRoZSBBREMNCi0gKiBzbGF2ZS4NCi0gKiBAcm10b2xsIENTUiAgICAgIEVPU01QX1NMViAgICAgIExMX0FEQ19Jc0FjdGl2ZUZsYWdfU0xWX0VPU01QDQotICogQHBhcmFtICBBREN4eV9DT01NT04gQURDIGNvbW1vbiBpbnN0YW5jZQ0KLSAqICAgICAgICAgKGNhbiBiZSBzZXQgZGlyZWN0bHkgZnJvbSBDTVNJUyBkZWZpbml0aW9uIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybw0KLSAqIEByZWYgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKCkgKQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdA0KLUxMX0FEQ19Jc0FjdGl2ZUZsYWdfU0xWX0VPU01QKEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OKSB7DQotICByZXR1cm4gKChSRUFEX0JJVChBREN4eV9DT01NT04tPkNTUiwgTExfQURDX0ZMQUdfRU9TTVBfU0xWKSA9PQ0KLSAgICAgICAgICAgKExMX0FEQ19GTEFHX0VPU01QX1NMVikpDQotICAgICAgICAgICAgICA/IDFVTA0KLSAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBmbGFnIG11bHRpbW9kZSBBREMgZ3JvdXAgaW5qZWN0ZWQgZW5kIG9mIHVuaXRhcnkgY29udmVyc2lvbiBvZg0KLSAqIHRoZSBBREMgbWFzdGVyLg0KLSAqIEBybXRvbGwgQ1NSICAgICAgSkVPQ19NU1QgICAgICAgTExfQURDX0lzQWN0aXZlRmxhZ19NU1RfSkVPQw0KLSAqIEBwYXJhbSAgQURDeHlfQ09NTU9OIEFEQyBjb21tb24gaW5zdGFuY2UNCi0gKiAgICAgICAgIChjYW4gYmUgc2V0IGRpcmVjdGx5IGZyb20gQ01TSVMgZGVmaW5pdGlvbiBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8NCi0gKiBAcmVmIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRSgpICkNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QNCi1MTF9BRENfSXNBY3RpdmVGbGFnX01TVF9KRU9DKEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OKSB7DQotICByZXR1cm4gKChSRUFEX0JJVChBREN4eV9DT01NT04tPkNTUiwgTExfQURDX0ZMQUdfSkVPQ19NU1QpID09DQotICAgICAgICAgICAoTExfQURDX0ZMQUdfSkVPQ19NU1QpKQ0KLSAgICAgICAgICAgICAgPyAxVUwNCi0gICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgZmxhZyBtdWx0aW1vZGUgQURDIGdyb3VwIGluamVjdGVkIGVuZCBvZiB1bml0YXJ5IGNvbnZlcnNpb24gb2YNCi0gKiB0aGUgQURDIHNsYXZlLg0KLSAqIEBybXRvbGwgQ1NSICAgICAgSkVPQ19TTFYgICAgICAgTExfQURDX0lzQWN0aXZlRmxhZ19TTFZfSkVPQw0KLSAqIEBwYXJhbSAgQURDeHlfQ09NTU9OIEFEQyBjb21tb24gaW5zdGFuY2UNCi0gKiAgICAgICAgIChjYW4gYmUgc2V0IGRpcmVjdGx5IGZyb20gQ01TSVMgZGVmaW5pdGlvbiBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8NCi0gKiBAcmVmIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRSgpICkNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QNCi1MTF9BRENfSXNBY3RpdmVGbGFnX1NMVl9KRU9DKEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OKSB7DQotICByZXR1cm4gKChSRUFEX0JJVChBREN4eV9DT01NT04tPkNTUiwgTExfQURDX0ZMQUdfSkVPQ19TTFYpID09DQotICAgICAgICAgICAoTExfQURDX0ZMQUdfSkVPQ19TTFYpKQ0KLSAgICAgICAgICAgICAgPyAxVUwNCi0gICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgZmxhZyBtdWx0aW1vZGUgQURDIGdyb3VwIGluamVjdGVkIGVuZCBvZiBzZXF1ZW5jZSBjb252ZXJzaW9ucyBvZg0KLSAqIHRoZSBBREMgbWFzdGVyLg0KLSAqIEBybXRvbGwgQ1NSICAgICAgSkVPU19NU1QgICAgICAgTExfQURDX0lzQWN0aXZlRmxhZ19NU1RfSkVPUw0KLSAqIEBwYXJhbSAgQURDeHlfQ09NTU9OIEFEQyBjb21tb24gaW5zdGFuY2UNCi0gKiAgICAgICAgIChjYW4gYmUgc2V0IGRpcmVjdGx5IGZyb20gQ01TSVMgZGVmaW5pdGlvbiBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8NCi0gKiBAcmVmIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRSgpICkNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QNCi1MTF9BRENfSXNBY3RpdmVGbGFnX01TVF9KRU9TKEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OKSB7DQotICByZXR1cm4gKChSRUFEX0JJVChBREN4eV9DT01NT04tPkNTUiwgTExfQURDX0ZMQUdfSkVPU19NU1QpID09DQotICAgICAgICAgICAoTExfQURDX0ZMQUdfSkVPU19NU1QpKQ0KLSAgICAgICAgICAgICAgPyAxVUwNCi0gICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgZmxhZyBtdWx0aW1vZGUgQURDIGdyb3VwIGluamVjdGVkIGVuZCBvZiBzZXF1ZW5jZSBjb252ZXJzaW9ucyBvZg0KLSAqIHRoZSBBREMgc2xhdmUuDQotICogQHJtdG9sbCBDU1IgICAgICBKRU9TX1NMViAgICAgICBMTF9BRENfSXNBY3RpdmVGbGFnX1NMVl9KRU9TDQotICogQHBhcmFtICBBREN4eV9DT01NT04gQURDIGNvbW1vbiBpbnN0YW5jZQ0KLSAqICAgICAgICAgKGNhbiBiZSBzZXQgZGlyZWN0bHkgZnJvbSBDTVNJUyBkZWZpbml0aW9uIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybw0KLSAqIEByZWYgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKCkgKQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdA0KLUxMX0FEQ19Jc0FjdGl2ZUZsYWdfU0xWX0pFT1MoQURDX0NvbW1vbl9UeXBlRGVmICpBREN4eV9DT01NT04pIHsNCi0gIHJldHVybiAoKFJFQURfQklUKEFEQ3h5X0NPTU1PTi0+Q1NSLCBMTF9BRENfRkxBR19KRU9TX1NMVikgPT0NCi0gICAgICAgICAgIChMTF9BRENfRkxBR19KRU9TX1NMVikpDQotICAgICAgICAgICAgICA/IDFVTA0KLSAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBmbGFnIG11bHRpbW9kZSBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udGV4dCBxdWV1ZSBvdmVyZmxvdyBvZiB0aGUNCi0gKiBBREMgbWFzdGVyLg0KLSAqIEBybXRvbGwgQ1NSICAgICAgSlFPVkZfTVNUICAgICAgTExfQURDX0lzQWN0aXZlRmxhZ19NU1RfSlFPVkYNCi0gKiBAcGFyYW0gIEFEQ3h5X0NPTU1PTiBBREMgY29tbW9uIGluc3RhbmNlDQotICogICAgICAgICAoY2FuIGJlIHNldCBkaXJlY3RseSBmcm9tIENNU0lTIGRlZmluaXRpb24gb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvDQotICogQHJlZiBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoKSApDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90DQotTExfQURDX0lzQWN0aXZlRmxhZ19NU1RfSlFPVkYoQURDX0NvbW1vbl9UeXBlRGVmICpBREN4eV9DT01NT04pIHsNCi0gIHJldHVybiAoKFJFQURfQklUKEFEQ3h5X0NPTU1PTi0+Q1NSLCBMTF9BRENfRkxBR19KUU9WRl9NU1QpID09DQotICAgICAgICAgICAoTExfQURDX0ZMQUdfSlFPVkZfTVNUKSkNCi0gICAgICAgICAgICAgID8gMVVMDQotICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IGZsYWcgbXVsdGltb2RlIEFEQyBncm91cCBpbmplY3RlZCBjb250ZXh0IHF1ZXVlIG92ZXJmbG93IG9mIHRoZQ0KLSAqIEFEQyBzbGF2ZS4NCi0gKiBAcm10b2xsIENTUiAgICAgIEpRT1ZGX1NMViAgICAgIExMX0FEQ19Jc0FjdGl2ZUZsYWdfU0xWX0pRT1ZGDQotICogQHBhcmFtICBBREN4eV9DT01NT04gQURDIGNvbW1vbiBpbnN0YW5jZQ0KLSAqICAgICAgICAgKGNhbiBiZSBzZXQgZGlyZWN0bHkgZnJvbSBDTVNJUyBkZWZpbml0aW9uIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybw0KLSAqIEByZWYgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKCkgKQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdA0KLUxMX0FEQ19Jc0FjdGl2ZUZsYWdfU0xWX0pRT1ZGKEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OKSB7DQotICByZXR1cm4gKChSRUFEX0JJVChBREN4eV9DT01NT04tPkNTUiwgTExfQURDX0ZMQUdfSlFPVkZfU0xWKSA9PQ0KLSAgICAgICAgICAgKExMX0FEQ19GTEFHX0pRT1ZGX1NMVikpDQotICAgICAgICAgICAgICA/IDFVTA0KLSAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBmbGFnIG11bHRpbW9kZSBBREMgYW5hbG9nIHdhdGNoZG9nIDEgb2YgdGhlIEFEQyBtYXN0ZXIuDQotICogQHJtdG9sbCBDU1IgICAgICBBV0QxX01TVCAgICAgICBMTF9BRENfSXNBY3RpdmVGbGFnX01TVF9BV0QxDQotICogQHBhcmFtICBBREN4eV9DT01NT04gQURDIGNvbW1vbiBpbnN0YW5jZQ0KLSAqICAgICAgICAgKGNhbiBiZSBzZXQgZGlyZWN0bHkgZnJvbSBDTVNJUyBkZWZpbml0aW9uIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybw0KLSAqIEByZWYgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKCkgKQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdA0KLUxMX0FEQ19Jc0FjdGl2ZUZsYWdfTVNUX0FXRDEoQURDX0NvbW1vbl9UeXBlRGVmICpBREN4eV9DT01NT04pIHsNCi0gIHJldHVybiAoKFJFQURfQklUKEFEQ3h5X0NPTU1PTi0+Q1NSLCBMTF9BRENfRkxBR19BV0QxX01TVCkgPT0NCi0gICAgICAgICAgIChMTF9BRENfRkxBR19BV0QxX01TVCkpDQotICAgICAgICAgICAgICA/IDFVTA0KLSAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBmbGFnIG11bHRpbW9kZSBhbmFsb2cgd2F0Y2hkb2cgMSBvZiB0aGUgQURDIHNsYXZlLg0KLSAqIEBybXRvbGwgQ1NSICAgICAgQVdEMV9TTFYgICAgICAgTExfQURDX0lzQWN0aXZlRmxhZ19TTFZfQVdEMQ0KLSAqIEBwYXJhbSAgQURDeHlfQ09NTU9OIEFEQyBjb21tb24gaW5zdGFuY2UNCi0gKiAgICAgICAgIChjYW4gYmUgc2V0IGRpcmVjdGx5IGZyb20gQ01TSVMgZGVmaW5pdGlvbiBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8NCi0gKiBAcmVmIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRSgpICkNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QNCi1MTF9BRENfSXNBY3RpdmVGbGFnX1NMVl9BV0QxKEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OKSB7DQotICByZXR1cm4gKChSRUFEX0JJVChBREN4eV9DT01NT04tPkNTUiwgTExfQURDX0ZMQUdfQVdEMV9TTFYpID09DQotICAgICAgICAgICAoTExfQURDX0ZMQUdfQVdEMV9TTFYpKQ0KLSAgICAgICAgICAgICAgPyAxVUwNCi0gICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgZmxhZyBtdWx0aW1vZGUgQURDIGFuYWxvZyB3YXRjaGRvZyAyIG9mIHRoZSBBREMgbWFzdGVyLg0KLSAqIEBybXRvbGwgQ1NSICAgICAgQVdEMl9NU1QgICAgICAgTExfQURDX0lzQWN0aXZlRmxhZ19NU1RfQVdEMg0KLSAqIEBwYXJhbSAgQURDeHlfQ09NTU9OIEFEQyBjb21tb24gaW5zdGFuY2UNCi0gKiAgICAgICAgIChjYW4gYmUgc2V0IGRpcmVjdGx5IGZyb20gQ01TSVMgZGVmaW5pdGlvbiBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8NCi0gKiBAcmVmIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRSgpICkNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QNCi1MTF9BRENfSXNBY3RpdmVGbGFnX01TVF9BV0QyKEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OKSB7DQotICByZXR1cm4gKChSRUFEX0JJVChBREN4eV9DT01NT04tPkNTUiwgTExfQURDX0ZMQUdfQVdEMl9NU1QpID09DQotICAgICAgICAgICAoTExfQURDX0ZMQUdfQVdEMl9NU1QpKQ0KLSAgICAgICAgICAgICAgPyAxVUwNCi0gICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgZmxhZyBtdWx0aW1vZGUgQURDIGFuYWxvZyB3YXRjaGRvZyAyIG9mIHRoZSBBREMgc2xhdmUuDQotICogQHJtdG9sbCBDU1IgICAgICBBV0QyX1NMViAgICAgICBMTF9BRENfSXNBY3RpdmVGbGFnX1NMVl9BV0QyDQotICogQHBhcmFtICBBREN4eV9DT01NT04gQURDIGNvbW1vbiBpbnN0YW5jZQ0KLSAqICAgICAgICAgKGNhbiBiZSBzZXQgZGlyZWN0bHkgZnJvbSBDTVNJUyBkZWZpbml0aW9uIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybw0KLSAqIEByZWYgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKCkgKQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdA0KLUxMX0FEQ19Jc0FjdGl2ZUZsYWdfU0xWX0FXRDIoQURDX0NvbW1vbl9UeXBlRGVmICpBREN4eV9DT01NT04pIHsNCi0gIHJldHVybiAoKFJFQURfQklUKEFEQ3h5X0NPTU1PTi0+Q1NSLCBMTF9BRENfRkxBR19BV0QyX1NMVikgPT0NCi0gICAgICAgICAgIChMTF9BRENfRkxBR19BV0QyX1NMVikpDQotICAgICAgICAgICAgICA/IDFVTA0KLSAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBmbGFnIG11bHRpbW9kZSBBREMgYW5hbG9nIHdhdGNoZG9nIDMgb2YgdGhlIEFEQyBtYXN0ZXIuDQotICogQHJtdG9sbCBDU1IgICAgICBBV0QzX01TVCAgICAgICBMTF9BRENfSXNBY3RpdmVGbGFnX01TVF9BV0QzDQotICogQHBhcmFtICBBREN4eV9DT01NT04gQURDIGNvbW1vbiBpbnN0YW5jZQ0KLSAqICAgICAgICAgKGNhbiBiZSBzZXQgZGlyZWN0bHkgZnJvbSBDTVNJUyBkZWZpbml0aW9uIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybw0KLSAqIEByZWYgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKCkgKQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdA0KLUxMX0FEQ19Jc0FjdGl2ZUZsYWdfTVNUX0FXRDMoQURDX0NvbW1vbl9UeXBlRGVmICpBREN4eV9DT01NT04pIHsNCi0gIHJldHVybiAoKFJFQURfQklUKEFEQ3h5X0NPTU1PTi0+Q1NSLCBMTF9BRENfRkxBR19BV0QzX01TVCkgPT0NCi0gICAgICAgICAgIChMTF9BRENfRkxBR19BV0QzX01TVCkpDQotICAgICAgICAgICAgICA/IDFVTA0KLSAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBmbGFnIG11bHRpbW9kZSBBREMgYW5hbG9nIHdhdGNoZG9nIDMgb2YgdGhlIEFEQyBzbGF2ZS4NCi0gKiBAcm10b2xsIENTUiAgICAgIEFXRDNfU0xWICAgICAgIExMX0FEQ19Jc0FjdGl2ZUZsYWdfU0xWX0FXRDMNCi0gKiBAcGFyYW0gIEFEQ3h5X0NPTU1PTiBBREMgY29tbW9uIGluc3RhbmNlDQotICogICAgICAgICAoY2FuIGJlIHNldCBkaXJlY3RseSBmcm9tIENNU0lTIGRlZmluaXRpb24gb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvDQotICogQHJlZiBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoKSApDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90DQotTExfQURDX0lzQWN0aXZlRmxhZ19TTFZfQVdEMyhBRENfQ29tbW9uX1R5cGVEZWYgKkFEQ3h5X0NPTU1PTikgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoQURDeHlfQ09NTU9OLT5DU1IsIExMX0FEQ19GTEFHX0FXRDNfU0xWKSA9PQ0KLSAgICAgICAgICAgKExMX0FEQ19GTEFHX0FXRDNfU0xWKSkNCi0gICAgICAgICAgICAgID8gMVVMDQotICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLSNlbmRpZiAvKiBBRENfTVVMVElNT0RFX1NVUFBPUlQgKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQURDX0xMX0VGX0lUX01hbmFnZW1lbnQgQURDIElUIG1hbmFnZW1lbnQNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIEFEQyByZWFkeS4NCi0gKiBAcm10b2xsIElFUiAgICAgIEFEUkRZSUUgICAgICAgIExMX0FEQ19FbmFibGVJVF9BRFJEWQ0KLSAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfRW5hYmxlSVRfQURSRFkoQURDX1R5cGVEZWYgKkFEQ3gpIHsNCi0gIFNFVF9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfQURSRFkpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSBpbnRlcnJ1cHRpb24gQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHVuaXRhcnkgY29udmVyc2lvbi4NCi0gKiBAcm10b2xsIElFUiAgICAgIEVPQ0lFICAgICAgICAgIExMX0FEQ19FbmFibGVJVF9FT0MNCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0VuYWJsZUlUX0VPQyhBRENfVHlwZURlZiAqQURDeCkgew0KLSAgU0VUX0JJVChBREN4LT5JRVIsIExMX0FEQ19JVF9FT0MpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSBpbnRlcnJ1cHRpb24gQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHNlcXVlbmNlIGNvbnZlcnNpb25zLg0KLSAqIEBybXRvbGwgSUVSICAgICAgRU9TSUUgICAgICAgICAgTExfQURDX0VuYWJsZUlUX0VPUw0KLSAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfRW5hYmxlSVRfRU9TKEFEQ19UeXBlRGVmICpBREN4KSB7DQotICBTRVRfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX0VPUyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIEFEQyBncm91cCByZWd1bGFyIGludGVycnVwdGlvbiBvdmVycnVuLg0KLSAqIEBybXRvbGwgSUVSICAgICAgT1ZSSUUgICAgICAgICAgTExfQURDX0VuYWJsZUlUX09WUg0KLSAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfRW5hYmxlSVRfT1ZSKEFEQ19UeXBlRGVmICpBREN4KSB7DQotICBTRVRfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX09WUik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIGludGVycnVwdGlvbiBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2Ygc2FtcGxpbmcuDQotICogQHJtdG9sbCBJRVIgICAgICBFT1NNUElFICAgICAgICBMTF9BRENfRW5hYmxlSVRfRU9TTVANCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0VuYWJsZUlUX0VPU01QKEFEQ19UeXBlRGVmICpBREN4KSB7DQotICBTRVRfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX0VPU01QKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgaW50ZXJydXB0aW9uIEFEQyBncm91cCBpbmplY3RlZCBlbmQgb2YgdW5pdGFyeSBjb252ZXJzaW9uLg0KLSAqIEBybXRvbGwgSUVSICAgICAgSkVPQ0lFICAgICAgICAgTExfQURDX0VuYWJsZUlUX0pFT0MNCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0VuYWJsZUlUX0pFT0MoQURDX1R5cGVEZWYgKkFEQ3gpIHsNCi0gIFNFVF9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfSkVPQyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIGludGVycnVwdGlvbiBBREMgZ3JvdXAgaW5qZWN0ZWQgZW5kIG9mIHNlcXVlbmNlIGNvbnZlcnNpb25zLg0KLSAqIEBybXRvbGwgSUVSICAgICAgSkVPU0lFICAgICAgICAgTExfQURDX0VuYWJsZUlUX0pFT1MNCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0VuYWJsZUlUX0pFT1MoQURDX1R5cGVEZWYgKkFEQ3gpIHsNCi0gIFNFVF9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfSkVPUyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIGludGVycnVwdGlvbiBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udGV4dCBxdWV1ZSBvdmVyZmxvdy4NCi0gKiBAcm10b2xsIElFUiAgICAgIEpRT1ZGSUUgICAgICAgIExMX0FEQ19FbmFibGVJVF9KUU9WRg0KLSAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfRW5hYmxlSVRfSlFPVkYoQURDX1R5cGVEZWYgKkFEQ3gpIHsNCi0gIFNFVF9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfSlFPVkYpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSBpbnRlcnJ1cHRpb24gQURDIGFuYWxvZyB3YXRjaGRvZyAxLg0KLSAqIEBybXRvbGwgSUVSICAgICAgQVdEMUlFICAgICAgICAgTExfQURDX0VuYWJsZUlUX0FXRDENCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0VuYWJsZUlUX0FXRDEoQURDX1R5cGVEZWYgKkFEQ3gpIHsNCi0gIFNFVF9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfQVdEMSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIGludGVycnVwdGlvbiBBREMgYW5hbG9nIHdhdGNoZG9nIDIuDQotICogQHJtdG9sbCBJRVIgICAgICBBV0QySUUgICAgICAgICBMTF9BRENfRW5hYmxlSVRfQVdEMg0KLSAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfRW5hYmxlSVRfQVdEMihBRENfVHlwZURlZiAqQURDeCkgew0KLSAgU0VUX0JJVChBREN4LT5JRVIsIExMX0FEQ19JVF9BV0QyKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgaW50ZXJydXB0aW9uIEFEQyBhbmFsb2cgd2F0Y2hkb2cgMy4NCi0gKiBAcm10b2xsIElFUiAgICAgIEFXRDNJRSAgICAgICAgIExMX0FEQ19FbmFibGVJVF9BV0QzDQotICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19FbmFibGVJVF9BV0QzKEFEQ19UeXBlRGVmICpBREN4KSB7DQotICBTRVRfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX0FXRDMpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgaW50ZXJydXB0aW9uIEFEQyByZWFkeS4NCi0gKiBAcm10b2xsIElFUiAgICAgIEFEUkRZSUUgICAgICAgIExMX0FEQ19EaXNhYmxlSVRfQURSRFkNCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0Rpc2FibGVJVF9BRFJEWShBRENfVHlwZURlZiAqQURDeCkgew0KLSAgQ0xFQVJfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX0FEUkRZKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIGludGVycnVwdGlvbiBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2YgdW5pdGFyeSBjb252ZXJzaW9uLg0KLSAqIEBybXRvbGwgSUVSICAgICAgRU9DSUUgICAgICAgICAgTExfQURDX0Rpc2FibGVJVF9FT0MNCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0Rpc2FibGVJVF9FT0MoQURDX1R5cGVEZWYgKkFEQ3gpIHsNCi0gIENMRUFSX0JJVChBREN4LT5JRVIsIExMX0FEQ19JVF9FT0MpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgaW50ZXJydXB0aW9uIEFEQyBncm91cCByZWd1bGFyIGVuZCBvZiBzZXF1ZW5jZSBjb252ZXJzaW9ucy4NCi0gKiBAcm10b2xsIElFUiAgICAgIEVPU0lFICAgICAgICAgIExMX0FEQ19EaXNhYmxlSVRfRU9TDQotICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19EaXNhYmxlSVRfRU9TKEFEQ19UeXBlRGVmICpBREN4KSB7DQotICBDTEVBUl9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfRU9TKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIGludGVycnVwdGlvbiBBREMgZ3JvdXAgcmVndWxhciBvdmVycnVuLg0KLSAqIEBybXRvbGwgSUVSICAgICAgT1ZSSUUgICAgICAgICAgTExfQURDX0Rpc2FibGVJVF9PVlINCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0Rpc2FibGVJVF9PVlIoQURDX1R5cGVEZWYgKkFEQ3gpIHsNCi0gIENMRUFSX0JJVChBREN4LT5JRVIsIExMX0FEQ19JVF9PVlIpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgaW50ZXJydXB0aW9uIEFEQyBncm91cCByZWd1bGFyIGVuZCBvZiBzYW1wbGluZy4NCi0gKiBAcm10b2xsIElFUiAgICAgIEVPU01QSUUgICAgICAgIExMX0FEQ19EaXNhYmxlSVRfRU9TTVANCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0Rpc2FibGVJVF9FT1NNUChBRENfVHlwZURlZiAqQURDeCkgew0KLSAgQ0xFQVJfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX0VPU01QKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIGludGVycnVwdGlvbiBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2YgdW5pdGFyeSBjb252ZXJzaW9uLg0KLSAqIEBybXRvbGwgSUVSICAgICAgSkVPQ0lFICAgICAgICAgTExfQURDX0Rpc2FibGVJVF9KRU9DDQotICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19EaXNhYmxlSVRfSkVPQyhBRENfVHlwZURlZiAqQURDeCkgew0KLSAgQ0xFQVJfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX0pFT0MpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgaW50ZXJydXB0aW9uIEFEQyBncm91cCBpbmplY3RlZCBlbmQgb2Ygc2VxdWVuY2UgY29udmVyc2lvbnMuDQotICogQHJtdG9sbCBJRVIgICAgICBKRU9TSUUgICAgICAgICBMTF9BRENfRGlzYWJsZUlUX0pFT1MNCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0Rpc2FibGVJVF9KRU9TKEFEQ19UeXBlRGVmICpBREN4KSB7DQotICBDTEVBUl9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfSkVPUyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBpbnRlcnJ1cHRpb24gQURDIGdyb3VwIGluamVjdGVkIGNvbnRleHQgcXVldWUgb3ZlcmZsb3cuDQotICogQHJtdG9sbCBJRVIgICAgICBKUU9WRklFICAgICAgICBMTF9BRENfRGlzYWJsZUlUX0pRT1ZGDQotICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19EaXNhYmxlSVRfSlFPVkYoQURDX1R5cGVEZWYgKkFEQ3gpIHsNCi0gIENMRUFSX0JJVChBREN4LT5JRVIsIExMX0FEQ19JVF9KUU9WRik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBpbnRlcnJ1cHRpb24gQURDIGFuYWxvZyB3YXRjaGRvZyAxLg0KLSAqIEBybXRvbGwgSUVSICAgICAgQVdEMUlFICAgICAgICAgTExfQURDX0Rpc2FibGVJVF9BV0QxDQotICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19EaXNhYmxlSVRfQVdEMShBRENfVHlwZURlZiAqQURDeCkgew0KLSAgQ0xFQVJfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX0FXRDEpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgaW50ZXJydXB0aW9uIEFEQyBhbmFsb2cgd2F0Y2hkb2cgMi4NCi0gKiBAcm10b2xsIElFUiAgICAgIEFXRDJJRSAgICAgICAgIExMX0FEQ19EaXNhYmxlSVRfQVdEMg0KLSAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfRGlzYWJsZUlUX0FXRDIoQURDX1R5cGVEZWYgKkFEQ3gpIHsNCi0gIENMRUFSX0JJVChBREN4LT5JRVIsIExMX0FEQ19JVF9BV0QyKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIGludGVycnVwdGlvbiBBREMgYW5hbG9nIHdhdGNoZG9nIDMuDQotICogQHJtdG9sbCBJRVIgICAgICBBV0QzSUUgICAgICAgICBMTF9BRENfRGlzYWJsZUlUX0FXRDMNCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0Rpc2FibGVJVF9BV0QzKEFEQ19UeXBlRGVmICpBREN4KSB7DQotICBDTEVBUl9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfQVdEMyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IHN0YXRlIG9mIGludGVycnVwdGlvbiBBREMgcmVhZHkNCi0gKiAgICAgICAgICgwOiBpbnRlcnJ1cHQgZGlzYWJsZWQsIDE6IGludGVycnVwdCBlbmFibGVkKS4NCi0gKiBAcm10b2xsIElFUiAgICAgIEFEUkRZSUUgICAgICAgIExMX0FEQ19Jc0VuYWJsZWRJVF9BRFJEWQ0KLSAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzRW5hYmxlZElUX0FEUkRZKEFEQ19UeXBlRGVmICpBREN4KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChBREN4LT5JRVIsIExMX0FEQ19JVF9BRFJEWSkgPT0gKExMX0FEQ19JVF9BRFJEWSkpID8gMVVMDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgc3RhdGUgb2YgaW50ZXJydXB0aW9uIEFEQyBncm91cCByZWd1bGFyIGVuZCBvZiB1bml0YXJ5IGNvbnZlcnNpb24NCi0gKiAgICAgICAgICgwOiBpbnRlcnJ1cHQgZGlzYWJsZWQsIDE6IGludGVycnVwdCBlbmFibGVkKS4NCi0gKiBAcm10b2xsIElFUiAgICAgIEVPQ0lFICAgICAgICAgIExMX0FEQ19Jc0VuYWJsZWRJVF9FT0MNCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0VuYWJsZWRJVF9FT0MoQURDX1R5cGVEZWYgKkFEQ3gpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX0VPQykgPT0gKExMX0FEQ19JVF9FT0MpKSA/IDFVTCA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IHN0YXRlIG9mIGludGVycnVwdGlvbiBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2Ygc2VxdWVuY2UNCi0gKiBjb252ZXJzaW9ucyAoMDogaW50ZXJydXB0IGRpc2FibGVkLCAxOiBpbnRlcnJ1cHQgZW5hYmxlZCkuDQotICogQHJtdG9sbCBJRVIgICAgICBFT1NJRSAgICAgICAgICBMTF9BRENfSXNFbmFibGVkSVRfRU9TDQotICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSXNFbmFibGVkSVRfRU9TKEFEQ19UeXBlRGVmICpBREN4KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChBREN4LT5JRVIsIExMX0FEQ19JVF9FT1MpID09IChMTF9BRENfSVRfRU9TKSkgPyAxVUwgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBzdGF0ZSBvZiBpbnRlcnJ1cHRpb24gQURDIGdyb3VwIHJlZ3VsYXIgb3ZlcnJ1bg0KLSAqICAgICAgICAgKDA6IGludGVycnVwdCBkaXNhYmxlZCwgMTogaW50ZXJydXB0IGVuYWJsZWQpLg0KLSAqIEBybXRvbGwgSUVSICAgICAgT1ZSSUUgICAgICAgICAgTExfQURDX0lzRW5hYmxlZElUX09WUg0KLSAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzRW5hYmxlZElUX09WUihBRENfVHlwZURlZiAqQURDeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfT1ZSKSA9PSAoTExfQURDX0lUX09WUikpID8gMVVMIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgc3RhdGUgb2YgaW50ZXJydXB0aW9uIEFEQyBncm91cCByZWd1bGFyIGVuZCBvZiBzYW1wbGluZw0KLSAqICAgICAgICAgKDA6IGludGVycnVwdCBkaXNhYmxlZCwgMTogaW50ZXJydXB0IGVuYWJsZWQpLg0KLSAqIEBybXRvbGwgSUVSICAgICAgRU9TTVBJRSAgICAgICAgTExfQURDX0lzRW5hYmxlZElUX0VPU01QDQotICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSXNFbmFibGVkSVRfRU9TTVAoQURDX1R5cGVEZWYgKkFEQ3gpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX0VPU01QKSA9PSAoTExfQURDX0lUX0VPU01QKSkgPyAxVUwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBzdGF0ZSBvZiBpbnRlcnJ1cHRpb24gQURDIGdyb3VwIGluamVjdGVkIGVuZCBvZiB1bml0YXJ5DQotICogY29udmVyc2lvbiAoMDogaW50ZXJydXB0IGRpc2FibGVkLCAxOiBpbnRlcnJ1cHQgZW5hYmxlZCkuDQotICogQHJtdG9sbCBJRVIgICAgICBKRU9DSUUgICAgICAgICBMTF9BRENfSXNFbmFibGVkSVRfSkVPQw0KLSAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzRW5hYmxlZElUX0pFT0MoQURDX1R5cGVEZWYgKkFEQ3gpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX0pFT0MpID09IChMTF9BRENfSVRfSkVPQykpID8gMVVMDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IHN0YXRlIG9mIGludGVycnVwdGlvbiBBREMgZ3JvdXAgaW5qZWN0ZWQgZW5kIG9mIHNlcXVlbmNlDQotICogY29udmVyc2lvbnMgKDA6IGludGVycnVwdCBkaXNhYmxlZCwgMTogaW50ZXJydXB0IGVuYWJsZWQpLg0KLSAqIEBybXRvbGwgSUVSICAgICAgSkVPU0lFICAgICAgICAgTExfQURDX0lzRW5hYmxlZElUX0pFT1MNCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0VuYWJsZWRJVF9KRU9TKEFEQ19UeXBlRGVmICpBREN4KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChBREN4LT5JRVIsIExMX0FEQ19JVF9KRU9TKSA9PSAoTExfQURDX0lUX0pFT1MpKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBzdGF0ZSBvZiBpbnRlcnJ1cHRpb24gQURDIGdyb3VwIGluamVjdGVkIGNvbnRleHQgcXVldWUgb3ZlcmZsb3cNCi0gKiBpbnRlcnJ1cHQgc3RhdGUgKDA6IGludGVycnVwdCBkaXNhYmxlZCwgMTogaW50ZXJydXB0IGVuYWJsZWQpLg0KLSAqIEBybXRvbGwgSUVSICAgICAgSlFPVkZJRSAgICAgICAgTExfQURDX0lzRW5hYmxlZElUX0pRT1ZGDQotICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSXNFbmFibGVkSVRfSlFPVkYoQURDX1R5cGVEZWYgKkFEQ3gpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX0pRT1ZGKSA9PSAoTExfQURDX0lUX0pRT1ZGKSkgPyAxVUwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBzdGF0ZSBvZiBpbnRlcnJ1cHRpb24gQURDIGFuYWxvZyB3YXRjaGRvZyAxDQotICogICAgICAgICAoMDogaW50ZXJydXB0IGRpc2FibGVkLCAxOiBpbnRlcnJ1cHQgZW5hYmxlZCkuDQotICogQHJtdG9sbCBJRVIgICAgICBBV0QxSUUgICAgICAgICBMTF9BRENfSXNFbmFibGVkSVRfQVdEMQ0KLSAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzRW5hYmxlZElUX0FXRDEoQURDX1R5cGVEZWYgKkFEQ3gpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX0FXRDEpID09IChMTF9BRENfSVRfQVdEMSkpID8gMVVMDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IHN0YXRlIG9mIGludGVycnVwdGlvbiBHZXQgQURDIGFuYWxvZyB3YXRjaGRvZyAyDQotICogICAgICAgICAoMDogaW50ZXJydXB0IGRpc2FibGVkLCAxOiBpbnRlcnJ1cHQgZW5hYmxlZCkuDQotICogQHJtdG9sbCBJRVIgICAgICBBV0QySUUgICAgICAgICBMTF9BRENfSXNFbmFibGVkSVRfQVdEMg0KLSAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzRW5hYmxlZElUX0FXRDIoQURDX1R5cGVEZWYgKkFEQ3gpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX0FXRDIpID09IChMTF9BRENfSVRfQVdEMikpID8gMVVMDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IHN0YXRlIG9mIGludGVycnVwdGlvbiBHZXQgQURDIGFuYWxvZyB3YXRjaGRvZyAzDQotICogICAgICAgICAoMDogaW50ZXJydXB0IGRpc2FibGVkLCAxOiBpbnRlcnJ1cHQgZW5hYmxlZCkuDQotICogQHJtdG9sbCBJRVIgICAgICBBV0QzSUUgICAgICAgICBMTF9BRENfSXNFbmFibGVkSVRfQVdEMw0KLSAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzRW5hYmxlZElUX0FXRDMoQURDX1R5cGVEZWYgKkFEQ3gpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX0FXRDMpID09IChMTF9BRENfSVRfQVdEMykpID8gMVVMDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQ0KLS8qKiBAZGVmZ3JvdXAgQURDX0xMX0VGX0luaXQgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucw0KLSAqIEB7DQotICovDQotDQotLyogSW5pdGlhbGl6YXRpb24gb2Ygc29tZSBmZWF0dXJlcyBvZiBBREMgY29tbW9uIHBhcmFtZXRlcnMgYW5kIG11bHRpbW9kZSAqLw0KLUVycm9yU3RhdHVzIExMX0FEQ19Db21tb25EZUluaXQoQURDX0NvbW1vbl9UeXBlRGVmICpBREN4eV9DT01NT04pOw0KLUVycm9yU3RhdHVzIExMX0FEQ19Db21tb25Jbml0KEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX0FEQ19Db21tb25Jbml0VHlwZURlZiAqQURDX0NvbW1vbkluaXRTdHJ1Y3QpOw0KLXZvaWQgTExfQURDX0NvbW1vblN0cnVjdEluaXQoTExfQURDX0NvbW1vbkluaXRUeXBlRGVmICpBRENfQ29tbW9uSW5pdFN0cnVjdCk7DQotDQotLyogRGUtaW5pdGlhbGl6YXRpb24gb2YgQURDIGluc3RhbmNlLCBBREMgZ3JvdXAgcmVndWxhciBhbmQgQURDIGdyb3VwIGluamVjdGVkDQotICovDQotLyogKGF2YWlsYWJpbGl0eSBvZiBBREMgZ3JvdXAgaW5qZWN0ZWQgZGVwZW5kcyBvbiBTVE0zMiBmYW1pbGllcykgKi8NCi1FcnJvclN0YXR1cyBMTF9BRENfRGVJbml0KEFEQ19UeXBlRGVmICpBREN4KTsNCi0NCi0vKiBJbml0aWFsaXphdGlvbiBvZiBzb21lIGZlYXR1cmVzIG9mIEFEQyBpbnN0YW5jZSAqLw0KLUVycm9yU3RhdHVzIExMX0FEQ19Jbml0KEFEQ19UeXBlRGVmICpBREN4LCBMTF9BRENfSW5pdFR5cGVEZWYgKkFEQ19Jbml0U3RydWN0KTsNCi12b2lkIExMX0FEQ19TdHJ1Y3RJbml0KExMX0FEQ19Jbml0VHlwZURlZiAqQURDX0luaXRTdHJ1Y3QpOw0KLQ0KLS8qIEluaXRpYWxpemF0aW9uIG9mIHNvbWUgZmVhdHVyZXMgb2YgQURDIGluc3RhbmNlIGFuZCBBREMgZ3JvdXAgcmVndWxhciAqLw0KLUVycm9yU3RhdHVzIExMX0FEQ19SRUdfSW5pdChBRENfVHlwZURlZiAqQURDeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfQURDX1JFR19Jbml0VHlwZURlZiAqQURDX1JFR19Jbml0U3RydWN0KTsNCi12b2lkIExMX0FEQ19SRUdfU3RydWN0SW5pdChMTF9BRENfUkVHX0luaXRUeXBlRGVmICpBRENfUkVHX0luaXRTdHJ1Y3QpOw0KLQ0KLS8qIEluaXRpYWxpemF0aW9uIG9mIHNvbWUgZmVhdHVyZXMgb2YgQURDIGluc3RhbmNlIGFuZCBBREMgZ3JvdXAgaW5qZWN0ZWQgKi8NCi1FcnJvclN0YXR1cyBMTF9BRENfSU5KX0luaXQoQURDX1R5cGVEZWYgKkFEQ3gsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX0FEQ19JTkpfSW5pdFR5cGVEZWYgKkFEQ19JTkpfSW5pdFN0cnVjdCk7DQotdm9pZCBMTF9BRENfSU5KX1N0cnVjdEluaXQoTExfQURDX0lOSl9Jbml0VHlwZURlZiAqQURDX0lOSl9Jbml0U3RydWN0KTsNCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLSNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotI2VuZGlmIC8qIEFEQzEgfHwgQURDMiB8fCBBREMzIHx8IEFEQzQgfHwgQURDNSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotI2lmZGVmIF9fY3BsdXNwbHVzDQotfQ0KLSNlbmRpZg0KLQ0KLSNlbmRpZiAvKiBTVE0zMkc0eHhfTExfQURDX0ggKi8NCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBmaWxlICAgIHN0bTMyZzR4eF9sbF9hZGMuaAorICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIEFEQyBMTCBtb2R1bGUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYXR0ZW50aW9uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0ZXJtcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlCisgKiBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb2Z0d2FyZSBjb21wb25lbnQuCisgKiBJZiBubyBMSUNFTlNFIGZpbGUgY29tZXMgd2l0aCB0aGlzIHNvZnR3YXJlLCBpdCBpcyBwcm92aWRlZCBBUy1JUy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJHNHh4X0xMX0FEQ19ICisjZGVmaW5lIFNUTTMyRzR4eF9MTF9BRENfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnNHh4LmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkc0eHhfTExfRHJpdmVyCisgKiBAeworICovCisKKyNpZiBkZWZpbmVkKEFEQzEpIHx8IGRlZmluZWQoQURDMikgfHwgZGVmaW5lZChBREMzKSB8fCBkZWZpbmVkKEFEQzQpIHx8IFwKKyAgICBkZWZpbmVkKEFEQzUpCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMIEFEQworICogQHsKKyAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQURDX0xMX1ByaXZhdGVfQ29uc3RhbnRzIEFEQyBQcml2YXRlIENvbnN0YW50cworICogQHsKKyAqLworCisvKiBJbnRlcm5hbCBtYXNrIGZvciBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVG8gc2VsZWN0IGludG8gbGl0ZXJhbCBMTF9BRENfUkVHX1JBTktfeCB0aGUgcmVsZXZhbnQgYml0cyBmb3I6ICAgICAgICAgICAgKi8KKy8qIC0gc2VxdWVuY2VyIHJlZ2lzdGVyIG9mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtIHNlcXVlbmNlciByYW5rIGJpdHMgcG9zaXRpb24gaW50byB0aGUgc2VsZWN0ZWQgcmVnaXN0ZXIgICAgICAgICAgICAgICAgICAqLworCisvKiBJbnRlcm5hbCByZWdpc3RlciBvZmZzZXQgZm9yIEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBjb25maWd1cmF0aW9uICovCisvKiAob2Zmc2V0IHBsYWNlZCBpbnRvIGEgc3BhcmUgYXJlYSBvZiBsaXRlcmFsIGRlZmluaXRpb24pICovCisjZGVmaW5lIEFEQ19TUVIxX1JFR09GRlNFVCAoMHgwMDAwMDAwMFVMKQorI2RlZmluZSBBRENfU1FSMl9SRUdPRkZTRVQgKDB4MDAwMDAxMDBVTCkKKyNkZWZpbmUgQURDX1NRUjNfUkVHT0ZGU0VUICgweDAwMDAwMjAwVUwpCisjZGVmaW5lIEFEQ19TUVI0X1JFR09GRlNFVCAoMHgwMDAwMDMwMFVMKQorCisjZGVmaW5lIEFEQ19SRUdfU1FSWF9SRUdPRkZTRVRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfU1FSMV9SRUdPRkZTRVQgfCBBRENfU1FSMl9SRUdPRkZTRVQgfCBBRENfU1FSM19SRUdPRkZTRVQgfCBcCisgICBBRENfU1FSNF9SRUdPRkZTRVQpCisjZGVmaW5lIEFEQ19TUVJYX1JFR09GRlNFVF9QT1MgICAgICAgICAgICAgICAgICAgIFwKKyAgKDhVTCkgLyogUG9zaXRpb24gb2YgYml0cyBBRENfU1FSeF9SRUdPRkZTRVQgaW4gXAorICAgICAgICAgICBBRENfUkVHX1NRUlhfUkVHT0ZGU0VUX01BU0sqLworI2RlZmluZSBBRENfUkVHX1JBTktfSURfU1FSWF9NQVNLIChBRENfQ0hBTk5FTF9JRF9OVU1CRVJfTUFTS19QT1NCSVQwKQorCisvKiBEZWZpbml0aW9uIG9mIEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBiaXRzIGluZm9ybWF0aW9uIHRvIGJlIGluc2VydGVkICAqLworLyogaW50byBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgcmFua3MgbGl0ZXJhbHMgZGVmaW5pdGlvbi4gICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQURDX1JFR19SQU5LXzFfU1FSWF9CSVRPRkZTRVRfUE9TIChBRENfU1FSMV9TUTFfUG9zKQorI2RlZmluZSBBRENfUkVHX1JBTktfMl9TUVJYX0JJVE9GRlNFVF9QT1MgKEFEQ19TUVIxX1NRMl9Qb3MpCisjZGVmaW5lIEFEQ19SRUdfUkFOS18zX1NRUlhfQklUT0ZGU0VUX1BPUyAoQURDX1NRUjFfU1EzX1BvcykKKyNkZWZpbmUgQURDX1JFR19SQU5LXzRfU1FSWF9CSVRPRkZTRVRfUE9TIChBRENfU1FSMV9TUTRfUG9zKQorI2RlZmluZSBBRENfUkVHX1JBTktfNV9TUVJYX0JJVE9GRlNFVF9QT1MgKEFEQ19TUVIyX1NRNV9Qb3MpCisjZGVmaW5lIEFEQ19SRUdfUkFOS182X1NRUlhfQklUT0ZGU0VUX1BPUyAoQURDX1NRUjJfU1E2X1BvcykKKyNkZWZpbmUgQURDX1JFR19SQU5LXzdfU1FSWF9CSVRPRkZTRVRfUE9TIChBRENfU1FSMl9TUTdfUG9zKQorI2RlZmluZSBBRENfUkVHX1JBTktfOF9TUVJYX0JJVE9GRlNFVF9QT1MgKEFEQ19TUVIyX1NROF9Qb3MpCisjZGVmaW5lIEFEQ19SRUdfUkFOS185X1NRUlhfQklUT0ZGU0VUX1BPUyAoQURDX1NRUjJfU1E5X1BvcykKKyNkZWZpbmUgQURDX1JFR19SQU5LXzEwX1NRUlhfQklUT0ZGU0VUX1BPUyAoQURDX1NRUjNfU1ExMF9Qb3MpCisjZGVmaW5lIEFEQ19SRUdfUkFOS18xMV9TUVJYX0JJVE9GRlNFVF9QT1MgKEFEQ19TUVIzX1NRMTFfUG9zKQorI2RlZmluZSBBRENfUkVHX1JBTktfMTJfU1FSWF9CSVRPRkZTRVRfUE9TIChBRENfU1FSM19TUTEyX1BvcykKKyNkZWZpbmUgQURDX1JFR19SQU5LXzEzX1NRUlhfQklUT0ZGU0VUX1BPUyAoQURDX1NRUjNfU1ExM19Qb3MpCisjZGVmaW5lIEFEQ19SRUdfUkFOS18xNF9TUVJYX0JJVE9GRlNFVF9QT1MgKEFEQ19TUVIzX1NRMTRfUG9zKQorI2RlZmluZSBBRENfUkVHX1JBTktfMTVfU1FSWF9CSVRPRkZTRVRfUE9TIChBRENfU1FSNF9TUTE1X1BvcykKKyNkZWZpbmUgQURDX1JFR19SQU5LXzE2X1NRUlhfQklUT0ZGU0VUX1BPUyAoQURDX1NRUjRfU1ExNl9Qb3MpCisKKy8qIEludGVybmFsIG1hc2sgZm9yIEFEQyBncm91cCBpbmplY3RlZCBzZXF1ZW5jZXI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUbyBzZWxlY3QgaW50byBsaXRlcmFsIExMX0FEQ19JTkpfUkFOS194IHRoZSByZWxldmFudCBiaXRzIGZvcjogICAgICAgICAgICAqLworLyogLSBkYXRhIHJlZ2lzdGVyIG9mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0gc2VxdWVuY2VyIHJhbmsgYml0cyBwb3NpdGlvbiBpbnRvIHRoZSBzZWxlY3RlZCByZWdpc3RlciAgICAgICAgICAgICAgICAgICovCisKKy8qIEludGVybmFsIHJlZ2lzdGVyIG9mZnNldCBmb3IgQURDIGdyb3VwIGluamVjdGVkIGRhdGEgcmVnaXN0ZXIgKi8KKy8qIChvZmZzZXQgcGxhY2VkIGludG8gYSBzcGFyZSBhcmVhIG9mIGxpdGVyYWwgZGVmaW5pdGlvbikgKi8KKyNkZWZpbmUgQURDX0pEUjFfUkVHT0ZGU0VUICgweDAwMDAwMDAwVUwpCisjZGVmaW5lIEFEQ19KRFIyX1JFR09GRlNFVCAoMHgwMDAwMDEwMFVMKQorI2RlZmluZSBBRENfSkRSM19SRUdPRkZTRVQgKDB4MDAwMDAyMDBVTCkKKyNkZWZpbmUgQURDX0pEUjRfUkVHT0ZGU0VUICgweDAwMDAwMzAwVUwpCisKKyNkZWZpbmUgQURDX0lOSl9KRFJYX1JFR09GRlNFVF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19KRFIxX1JFR09GRlNFVCB8IEFEQ19KRFIyX1JFR09GRlNFVCB8IEFEQ19KRFIzX1JFR09GRlNFVCB8IFwKKyAgIEFEQ19KRFI0X1JFR09GRlNFVCkKKyNkZWZpbmUgQURDX0lOSl9SQU5LX0lEX0pTUVJfTUFTSyAoQURDX0NIQU5ORUxfSURfTlVNQkVSX01BU0tfUE9TQklUMCkKKyNkZWZpbmUgQURDX0pEUlhfUkVHT0ZGU0VUX1BPUyAgICAgICAgICAgICAgICAgICAgXAorICAoOFVMKSAvKiBQb3NpdGlvbiBvZiBiaXRzIEFEQ19KRFJ4X1JFR09GRlNFVCBpbiBcCisgICAgICAgICAgIEFEQ19JTkpfSkRSWF9SRUdPRkZTRVRfTUFTSyovCisKKy8qIERlZmluaXRpb24gb2YgQURDIGdyb3VwIGluamVjdGVkIHNlcXVlbmNlciBiaXRzIGluZm9ybWF0aW9uIHRvIGJlIGluc2VydGVkICovCisvKiBpbnRvIEFEQyBncm91cCBpbmplY3RlZCBzZXF1ZW5jZXIgcmFua3MgbGl0ZXJhbHMgZGVmaW5pdGlvbi4gICAgICAgICAgICAgICAqLworI2RlZmluZSBBRENfSU5KX1JBTktfMV9KU1FSX0JJVE9GRlNFVF9QT1MgKEFEQ19KU1FSX0pTUTFfUG9zKQorI2RlZmluZSBBRENfSU5KX1JBTktfMl9KU1FSX0JJVE9GRlNFVF9QT1MgKEFEQ19KU1FSX0pTUTJfUG9zKQorI2RlZmluZSBBRENfSU5KX1JBTktfM19KU1FSX0JJVE9GRlNFVF9QT1MgKEFEQ19KU1FSX0pTUTNfUG9zKQorI2RlZmluZSBBRENfSU5KX1JBTktfNF9KU1FSX0JJVE9GRlNFVF9QT1MgKEFEQ19KU1FSX0pTUTRfUG9zKQorCisvKiBJbnRlcm5hbCBtYXNrIGZvciBBREMgZ3JvdXAgcmVndWxhciB0cmlnZ2VyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVG8gc2VsZWN0IGludG8gbGl0ZXJhbCBMTF9BRENfUkVHX1RSSUdfeCB0aGUgcmVsZXZhbnQgYml0cyBmb3I6ICAgICAgICAgICAgKi8KKy8qIC0gcmVndWxhciB0cmlnZ2VyIHNvdXJjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtIHJlZ3VsYXIgdHJpZ2dlciBlZGdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfQ0ZHUl9FWFRFTl8wKSAvKiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcgZm9yIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhdGliaWxpdHkgd2l0aCBzb21lIEFEQyBvbiBvdGhlciBTVE0zMiBzZXJpZXMgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgaGF2aW5nIHRoaXMgc2V0dGluZyBzZXQgYnkgSFcgZGVmYXVsdCB2YWx1ZSkgKi8KKworLyogTWFzayBjb250YWluaW5nIHRyaWdnZXIgc291cmNlIG1hc2tzIGZvciBlYWNoIG9mIHBvc3NpYmxlICAgICAgICAgICAgICAgICAgKi8KKy8qIHRyaWdnZXIgZWRnZSBzZWxlY3Rpb24gZHVwbGljYXRlZCB3aXRoIHNoaWZ0cyBbMDsgNDsgODsgMTJdICAgICAgICAgICAgICAgICovCisvKiBjb3JyZXNwb25kaW5nIHRvIHtTVyBzdGFydDsgZXh0IHRyaWdnZXI7IGV4dCB0cmlnZ2VyOyBleHQgdHJpZ2dlcn0uICAgICAgICAqLworI2RlZmluZSBBRENfUkVHX1RSSUdfU09VUkNFX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKChMTF9BRENfUkVHX1RSSUdfU09GVFdBUkUgJiBBRENfQ0ZHUl9FWFRTRUwpIDw8ICg0VSAqIDBVTCkpIHwgICAgICAgICAgXAorICAgKChBRENfQ0ZHUl9FWFRTRUwpIDw8ICg0VSAqIDFVTCkpIHwgKChBRENfQ0ZHUl9FWFRTRUwpIDw8ICg0VSAqIDJVTCkpIHwgXAorICAgKChBRENfQ0ZHUl9FWFRTRUwpIDw8ICg0VSAqIDNVTCkpKQorCisvKiBNYXNrIGNvbnRhaW5pbmcgdHJpZ2dlciBlZGdlIG1hc2tzIGZvciBlYWNoIG9mIHBvc3NpYmxlICAgICAgICAgICAgICAgICAgICAqLworLyogdHJpZ2dlciBlZGdlIHNlbGVjdGlvbiBkdXBsaWNhdGVkIHdpdGggc2hpZnRzIFswOyA0OyA4OyAxMl0gICAgICAgICAgICAgICAgKi8KKy8qIGNvcnJlc3BvbmRpbmcgdG8ge1NXIHN0YXJ0OyBleHQgdHJpZ2dlcjsgZXh0IHRyaWdnZXI7IGV4dCB0cmlnZ2VyfS4gICAgICAgICovCisjZGVmaW5lIEFEQ19SRUdfVFJJR19FREdFX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoTExfQURDX1JFR19UUklHX1NPRlRXQVJFICYgQURDX0NGR1JfRVhURU4pIDw8ICg0VSAqIDBVTCkpIHwgXAorICAgKChBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgPDwgKDRVICogMVVMKSkgfCAgICAgICAgICAgICBcCisgICAoKEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSA8PCAoNFUgKiAyVUwpKSB8ICAgICAgICAgICAgIFwKKyAgICgoQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpIDw8ICg0VSAqIDNVTCkpKQorCisvKiBEZWZpbml0aW9uIG9mIEFEQyBncm91cCByZWd1bGFyIHRyaWdnZXIgYml0cyBpbmZvcm1hdGlvbi4gICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBBRENfUkVHX1RSSUdfRVhUU0VMX0JJVE9GRlNFVF9QT1MgKEFEQ19DRkdSX0VYVFNFTF9Qb3MpCisjZGVmaW5lIEFEQ19SRUdfVFJJR19FWFRFTl9CSVRPRkZTRVRfUE9TIChBRENfQ0ZHUl9FWFRFTl9Qb3MpCisKKy8qIEludGVybmFsIG1hc2sgZm9yIEFEQyBncm91cCBpbmplY3RlZCB0cmlnZ2VyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUbyBzZWxlY3QgaW50byBsaXRlcmFsIExMX0FEQ19JTkpfVFJJR194IHRoZSByZWxldmFudCBiaXRzIGZvcjogICAgICAgICAgICAqLworLyogLSBpbmplY3RlZCB0cmlnZ2VyIHNvdXJjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0gaW5qZWN0ZWQgdHJpZ2dlciBlZGdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFEQ19JTkpfVFJJR19FWFRfRURHRV9ERUZBVUxUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfSlNRUl9KRVhURU5fMCkgLyogVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nIGZvciBcCisgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGF0aWJpbGl0eSB3aXRoIHNvbWUgQURDIG9uIG90aGVyIFNUTTMyIHNlcmllcyAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgaGF2aW5nIHRoaXMgc2V0dGluZyBzZXQgYnkgSFcgZGVmYXVsdCB2YWx1ZSkgKi8KKworLyogTWFzayBjb250YWluaW5nIHRyaWdnZXIgc291cmNlIG1hc2tzIGZvciBlYWNoIG9mIHBvc3NpYmxlICAgICAgICAgICAgICAgICAgKi8KKy8qIHRyaWdnZXIgZWRnZSBzZWxlY3Rpb24gZHVwbGljYXRlZCB3aXRoIHNoaWZ0cyBbMDsgNDsgODsgMTJdICAgICAgICAgICAgICAgICovCisvKiBjb3JyZXNwb25kaW5nIHRvIHtTVyBzdGFydDsgZXh0IHRyaWdnZXI7IGV4dCB0cmlnZ2VyOyBleHQgdHJpZ2dlcn0uICAgICAgICAqLworI2RlZmluZSBBRENfSU5KX1RSSUdfU09VUkNFX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKExMX0FEQ19JTkpfVFJJR19TT0ZUV0FSRSAmIEFEQ19KU1FSX0pFWFRTRUwpIDw8ICg0VSAqIDBVTCkpIHwgICAgICAgICAgIFwKKyAgICgoQURDX0pTUVJfSkVYVFNFTCkgPDwgKDRVICogMVVMKSkgfCAoKEFEQ19KU1FSX0pFWFRTRUwpIDw8ICg0VSAqIDJVTCkpIHwgXAorICAgKChBRENfSlNRUl9KRVhUU0VMKSA8PCAoNFUgKiAzVUwpKSkKKworLyogTWFzayBjb250YWluaW5nIHRyaWdnZXIgZWRnZSBtYXNrcyBmb3IgZWFjaCBvZiBwb3NzaWJsZSAgICAgICAgICAgICAgICAgICAgKi8KKy8qIHRyaWdnZXIgZWRnZSBzZWxlY3Rpb24gZHVwbGljYXRlZCB3aXRoIHNoaWZ0cyBbMDsgNDsgODsgMTJdICAgICAgICAgICAgICAgICovCisvKiBjb3JyZXNwb25kaW5nIHRvIHtTVyBzdGFydDsgZXh0IHRyaWdnZXI7IGV4dCB0cmlnZ2VyOyBleHQgdHJpZ2dlcn0uICAgICAgICAqLworI2RlZmluZSBBRENfSU5KX1RSSUdfRURHRV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKChMTF9BRENfSU5KX1RSSUdfU09GVFdBUkUgJiBBRENfSlNRUl9KRVhURU4pIDw8ICg0VSAqIDBVTCkpIHwgXAorICAgKChBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgPDwgKDRVICogMVVMKSkgfCAgICAgICAgICAgICAgXAorICAgKChBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgPDwgKDRVICogMlVMKSkgfCAgICAgICAgICAgICAgXAorICAgKChBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgPDwgKDRVICogM1VMKSkpCisKKy8qIERlZmluaXRpb24gb2YgQURDIGdyb3VwIGluamVjdGVkIHRyaWdnZXIgYml0cyBpbmZvcm1hdGlvbi4gICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFEQ19JTkpfVFJJR19FWFRTRUxfQklUT0ZGU0VUX1BPUyAoQURDX0pTUVJfSkVYVFNFTF9Qb3MpCisjZGVmaW5lIEFEQ19JTkpfVFJJR19FWFRFTl9CSVRPRkZTRVRfUE9TIChBRENfSlNRUl9KRVhURU5fUG9zKQorCisvKiBJbnRlcm5hbCBtYXNrIGZvciBBREMgY2hhbm5lbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVG8gc2VsZWN0IGludG8gbGl0ZXJhbCBMTF9BRENfQ0hBTk5FTF94IHRoZSByZWxldmFudCBiaXRzIGZvcjogICAgICAgICAgICAgKi8KKy8qIC0gY2hhbm5lbCBpZGVudGlmaWVyIGRlZmluZWQgYnkgbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtIGNoYW5uZWwgaWRlbnRpZmllciBkZWZpbmVkIGJ5IGJpdGZpZWxkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLSBjaGFubmVsIGRpZmZlcmVudGlhdGlvbiBiZXR3ZWVuIGV4dGVybmFsIGNoYW5uZWxzIChjb25uZWN0ZWQgdG8gICAgICAgICAgKi8KKy8qICAgR1BJTyBwaW5zKSBhbmQgaW50ZXJuYWwgY2hhbm5lbHMgKGNvbm5lY3RlZCB0byBpbnRlcm5hbCBwYXRocykgICAgICAgICAgICovCisvKiAtIGNoYW5uZWwgc2FtcGxpbmcgdGltZSBkZWZpbmVkIGJ5IFNNUFJ4IHJlZ2lzdGVyIG9mZnNldCAgICAgICAgICAgICAgICAgICAqLworLyogICBhbmQgU01QeCBiaXRzIHBvc2l0aW9ucyBpbnRvIFNNUFJ4IHJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfSURfTlVNQkVSX01BU0sgKEFEQ19DRkdSX0FXRDFDSCkKKyNkZWZpbmUgQURDX0NIQU5ORUxfSURfQklURklFTERfTUFTSyAoQURDX0FXRDJDUl9BV0QyQ0gpCisjZGVmaW5lIEFEQ19DSEFOTkVMX0lEX05VTUJFUl9CSVRPRkZTRVRfUE9TIChBRENfQ0ZHUl9BV0QxQ0hfUG9zKQorI2RlZmluZSBBRENfQ0hBTk5FTF9JRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0NIQU5ORUxfSURfTlVNQkVSX01BU0sgfCBBRENfQ0hBTk5FTF9JRF9CSVRGSUVMRF9NQVNLIHwgXAorICAgQURDX0NIQU5ORUxfSURfSU5URVJOQUxfQ0hfTUFTSykKKy8qIEVxdWl2YWxlbnQgbWFzayBvZiBBRENfQ0hBTk5FTF9OVU1CRVJfTUFTSyBhbGlnbmVkIG9uIHJlZ2lzdGVyIExTQiAoYml0IDApICovCisjZGVmaW5lIEFEQ19DSEFOTkVMX0lEX05VTUJFUl9NQVNLX1BPU0JJVDAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfU1FSMl9TUTUpIC8qIEVxdWl2YWxlbnQgdG8gc2hpZnQ6IChBRENfQ0hBTk5FTF9OVU1CRVJfTUFTSyBcCis+PiBbUG9zaXRpb24gb2YgYml0ZmllbGQgIkFEQ19DSEFOTkVMX05VTUJFUl9NQVNLIiBpbiByZWdpc3Rlcl0pICovCisKKy8qIENoYW5uZWwgZGlmZmVyZW50aWF0aW9uIGJldHdlZW4gZXh0ZXJuYWwgYW5kIGludGVybmFsIGNoYW5uZWxzICovCisjZGVmaW5lIEFEQ19DSEFOTkVMX0lEX0lOVEVSTkFMX0NIIFwKKyAgKDB4ODAwMDAwMDBVTCkgLyogTWFya2VyIG9mIGludGVybmFsIGNoYW5uZWwgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfSURfSU5URVJOQUxfQ0hfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKDB4MDAwODAwMDBVTCkgLyogTWFya2VyIG9mIGludGVybmFsIGNoYW5uZWwgZm9yIG90aGVyIEFEQyBpbnN0YW5jZXMsIGluIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBvZiBkaWZmZXJlbnQgQURDIGludGVybmFsIGNoYW5uZWxzIG1hcHBlZCBvbiBzYW1lIFwKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCBudW1iZXIgb24gZGlmZmVyZW50IEFEQyBpbnN0YW5jZXMgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfSURfSU5URVJOQUxfQ0hfTUFTSyBcCisgIChBRENfQ0hBTk5FTF9JRF9JTlRFUk5BTF9DSCB8IEFEQ19DSEFOTkVMX0lEX0lOVEVSTkFMX0NIXzIpCisKKy8qIEludGVybmFsIHJlZ2lzdGVyIG9mZnNldCBmb3IgQURDIGNoYW5uZWwgc2FtcGxpbmcgdGltZSBjb25maWd1cmF0aW9uICovCisvKiAob2Zmc2V0IHBsYWNlZCBpbnRvIGEgc3BhcmUgYXJlYSBvZiBsaXRlcmFsIGRlZmluaXRpb24pICovCisjZGVmaW5lIEFEQ19TTVBSMV9SRUdPRkZTRVQgKDB4MDAwMDAwMDBVTCkKKyNkZWZpbmUgQURDX1NNUFIyX1JFR09GRlNFVCAoMHgwMjAwMDAwMFVMKQorI2RlZmluZSBBRENfQ0hBTk5FTF9TTVBSWF9SRUdPRkZTRVRfTUFTSyBcCisgIChBRENfU01QUjFfUkVHT0ZGU0VUIHwgQURDX1NNUFIyX1JFR09GRlNFVCkKKyNkZWZpbmUgQURDX1NNUFJYX1JFR09GRlNFVF9QT1MgICAgICAgICAgICAgICAgICBcCisgICgyNVVMKSAvKiBQb3NpdGlvbiBvZiBiaXRzIEFEQ19TTVBSeF9SRUdPRkZTRVQgXAorICAgICAgICAgICAgaW4gQURDX0NIQU5ORUxfU01QUlhfUkVHT0ZGU0VUX01BU0sgKi8KKworI2RlZmluZSBBRENfQ0hBTk5FTF9TTVB4X0JJVE9GRlNFVF9NQVNLICgweDAxRjAwMDAwVUwpCisjZGVmaW5lIEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX1BPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgyMFVMKSAvKiBFcXVpdmFsZW50IHRvIGJpdGZpZWxkICJBRENfQ0hBTk5FTF9TTVB4X0JJVE9GRlNFVF9NQVNLIiBcCisgICAgICAgICAgICBwb3NpdGlvbiBpbiByZWdpc3RlciAqLworCisvKiBEZWZpbml0aW9uIG9mIGNoYW5uZWxzIElEIG51bWJlciBpbmZvcm1hdGlvbiB0byBiZSBpbnNlcnRlZCBpbnRvICAgICAgICAgICAqLworLyogY2hhbm5lbHMgbGl0ZXJhbHMgZGVmaW5pdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfMF9OVU1CRVIgKDB4MDAwMDAwMDBVTCkKKyNkZWZpbmUgQURDX0NIQU5ORUxfMV9OVU1CRVIgKEFEQ19DRkdSX0FXRDFDSF8wKQorI2RlZmluZSBBRENfQ0hBTk5FTF8yX05VTUJFUiAoQURDX0NGR1JfQVdEMUNIXzEpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzNfTlVNQkVSIChBRENfQ0ZHUl9BV0QxQ0hfMSB8IEFEQ19DRkdSX0FXRDFDSF8wKQorI2RlZmluZSBBRENfQ0hBTk5FTF80X05VTUJFUiAoQURDX0NGR1JfQVdEMUNIXzIpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzVfTlVNQkVSIChBRENfQ0ZHUl9BV0QxQ0hfMiB8IEFEQ19DRkdSX0FXRDFDSF8wKQorI2RlZmluZSBBRENfQ0hBTk5FTF82X05VTUJFUiAoQURDX0NGR1JfQVdEMUNIXzIgfCBBRENfQ0ZHUl9BV0QxQ0hfMSkKKyNkZWZpbmUgQURDX0NIQU5ORUxfN19OVU1CRVIgXAorICAoQURDX0NGR1JfQVdEMUNIXzIgfCBBRENfQ0ZHUl9BV0QxQ0hfMSB8IEFEQ19DRkdSX0FXRDFDSF8wKQorI2RlZmluZSBBRENfQ0hBTk5FTF84X05VTUJFUiAoQURDX0NGR1JfQVdEMUNIXzMpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzlfTlVNQkVSIChBRENfQ0ZHUl9BV0QxQ0hfMyB8IEFEQ19DRkdSX0FXRDFDSF8wKQorI2RlZmluZSBBRENfQ0hBTk5FTF8xMF9OVU1CRVIgKEFEQ19DRkdSX0FXRDFDSF8zIHwgQURDX0NGR1JfQVdEMUNIXzEpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzExX05VTUJFUiBcCisgIChBRENfQ0ZHUl9BV0QxQ0hfMyB8IEFEQ19DRkdSX0FXRDFDSF8xIHwgQURDX0NGR1JfQVdEMUNIXzApCisjZGVmaW5lIEFEQ19DSEFOTkVMXzEyX05VTUJFUiAoQURDX0NGR1JfQVdEMUNIXzMgfCBBRENfQ0ZHUl9BV0QxQ0hfMikKKyNkZWZpbmUgQURDX0NIQU5ORUxfMTNfTlVNQkVSIFwKKyAgKEFEQ19DRkdSX0FXRDFDSF8zIHwgQURDX0NGR1JfQVdEMUNIXzIgfCBBRENfQ0ZHUl9BV0QxQ0hfMCkKKyNkZWZpbmUgQURDX0NIQU5ORUxfMTRfTlVNQkVSIFwKKyAgKEFEQ19DRkdSX0FXRDFDSF8zIHwgQURDX0NGR1JfQVdEMUNIXzIgfCBBRENfQ0ZHUl9BV0QxQ0hfMSkKKyNkZWZpbmUgQURDX0NIQU5ORUxfMTVfTlVNQkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19DRkdSX0FXRDFDSF8zIHwgQURDX0NGR1JfQVdEMUNIXzIgfCBBRENfQ0ZHUl9BV0QxQ0hfMSB8IFwKKyAgIEFEQ19DRkdSX0FXRDFDSF8wKQorI2RlZmluZSBBRENfQ0hBTk5FTF8xNl9OVU1CRVIgKEFEQ19DRkdSX0FXRDFDSF80KQorI2RlZmluZSBBRENfQ0hBTk5FTF8xN19OVU1CRVIgKEFEQ19DRkdSX0FXRDFDSF80IHwgQURDX0NGR1JfQVdEMUNIXzApCisjZGVmaW5lIEFEQ19DSEFOTkVMXzE4X05VTUJFUiAoQURDX0NGR1JfQVdEMUNIXzQgfCBBRENfQ0ZHUl9BV0QxQ0hfMSkKKworLyogRGVmaW5pdGlvbiBvZiBjaGFubmVscyBJRCBiaXRmaWVsZCBpbmZvcm1hdGlvbiB0byBiZSBpbnNlcnRlZCBpbnRvICAgICAgICAgKi8KKy8qIGNoYW5uZWxzIGxpdGVyYWxzIGRlZmluaXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFEQ19DSEFOTkVMXzBfQklURklFTEQgKEFEQ19BV0QyQ1JfQVdEMkNIXzApCisjZGVmaW5lIEFEQ19DSEFOTkVMXzFfQklURklFTEQgKEFEQ19BV0QyQ1JfQVdEMkNIXzEpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzJfQklURklFTEQgKEFEQ19BV0QyQ1JfQVdEMkNIXzIpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzNfQklURklFTEQgKEFEQ19BV0QyQ1JfQVdEMkNIXzMpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzRfQklURklFTEQgKEFEQ19BV0QyQ1JfQVdEMkNIXzQpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzVfQklURklFTEQgKEFEQ19BV0QyQ1JfQVdEMkNIXzUpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzZfQklURklFTEQgKEFEQ19BV0QyQ1JfQVdEMkNIXzYpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzdfQklURklFTEQgKEFEQ19BV0QyQ1JfQVdEMkNIXzcpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzhfQklURklFTEQgKEFEQ19BV0QyQ1JfQVdEMkNIXzgpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzlfQklURklFTEQgKEFEQ19BV0QyQ1JfQVdEMkNIXzkpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzEwX0JJVEZJRUxEIChBRENfQVdEMkNSX0FXRDJDSF8xMCkKKyNkZWZpbmUgQURDX0NIQU5ORUxfMTFfQklURklFTEQgKEFEQ19BV0QyQ1JfQVdEMkNIXzExKQorI2RlZmluZSBBRENfQ0hBTk5FTF8xMl9CSVRGSUVMRCAoQURDX0FXRDJDUl9BV0QyQ0hfMTIpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzEzX0JJVEZJRUxEIChBRENfQVdEMkNSX0FXRDJDSF8xMykKKyNkZWZpbmUgQURDX0NIQU5ORUxfMTRfQklURklFTEQgKEFEQ19BV0QyQ1JfQVdEMkNIXzE0KQorI2RlZmluZSBBRENfQ0hBTk5FTF8xNV9CSVRGSUVMRCAoQURDX0FXRDJDUl9BV0QyQ0hfMTUpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzE2X0JJVEZJRUxEIChBRENfQVdEMkNSX0FXRDJDSF8xNikKKyNkZWZpbmUgQURDX0NIQU5ORUxfMTdfQklURklFTEQgKEFEQ19BV0QyQ1JfQVdEMkNIXzE3KQorI2RlZmluZSBBRENfQ0hBTk5FTF8xOF9CSVRGSUVMRCAoQURDX0FXRDJDUl9BV0QyQ0hfMTgpCisKKy8qIERlZmluaXRpb24gb2YgY2hhbm5lbHMgc2FtcGxpbmcgdGltZSBpbmZvcm1hdGlvbiB0byBiZSBpbnNlcnRlZCBpbnRvICAgICAgICovCisvKiBjaGFubmVscyBsaXRlcmFscyBkZWZpbml0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVmFsdWUgc2hpZnRlZCBhcmUgZXF1aXZhbGVudCB0byBiaXRmaWVsZCAiQURDX1NNUFJ4X1NNUHkiIHBvc2l0aW9uICAgICAgICAgKi8KKy8qIGluIHJlZ2lzdGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFEQ19DSEFOTkVMXzBfU01QIFwKKyAgKEFEQ19TTVBSMV9SRUdPRkZTRVQgfCAoKDBVTCkgPDwgQURDX0NIQU5ORUxfU01QeF9CSVRPRkZTRVRfUE9TKSkKKyNkZWZpbmUgQURDX0NIQU5ORUxfMV9TTVAgXAorICAoQURDX1NNUFIxX1JFR09GRlNFVCB8ICgoM1VMKSA8PCBBRENfQ0hBTk5FTF9TTVB4X0JJVE9GRlNFVF9QT1MpKQorI2RlZmluZSBBRENfQ0hBTk5FTF8yX1NNUCBcCisgIChBRENfU01QUjFfUkVHT0ZGU0VUIHwgKCg2VUwpIDw8IEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX1BPUykpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzNfU01QIFwKKyAgKEFEQ19TTVBSMV9SRUdPRkZTRVQgfCAoKDlVTCkgPDwgQURDX0NIQU5ORUxfU01QeF9CSVRPRkZTRVRfUE9TKSkKKyNkZWZpbmUgQURDX0NIQU5ORUxfNF9TTVAgXAorICAoQURDX1NNUFIxX1JFR09GRlNFVCB8ICgoMTJVTCkgPDwgQURDX0NIQU5ORUxfU01QeF9CSVRPRkZTRVRfUE9TKSkKKyNkZWZpbmUgQURDX0NIQU5ORUxfNV9TTVAgXAorICAoQURDX1NNUFIxX1JFR09GRlNFVCB8ICgoMTVVTCkgPDwgQURDX0NIQU5ORUxfU01QeF9CSVRPRkZTRVRfUE9TKSkKKyNkZWZpbmUgQURDX0NIQU5ORUxfNl9TTVAgXAorICAoQURDX1NNUFIxX1JFR09GRlNFVCB8ICgoMThVTCkgPDwgQURDX0NIQU5ORUxfU01QeF9CSVRPRkZTRVRfUE9TKSkKKyNkZWZpbmUgQURDX0NIQU5ORUxfN19TTVAgXAorICAoQURDX1NNUFIxX1JFR09GRlNFVCB8ICgoMjFVTCkgPDwgQURDX0NIQU5ORUxfU01QeF9CSVRPRkZTRVRfUE9TKSkKKyNkZWZpbmUgQURDX0NIQU5ORUxfOF9TTVAgXAorICAoQURDX1NNUFIxX1JFR09GRlNFVCB8ICgoMjRVTCkgPDwgQURDX0NIQU5ORUxfU01QeF9CSVRPRkZTRVRfUE9TKSkKKyNkZWZpbmUgQURDX0NIQU5ORUxfOV9TTVAgXAorICAoQURDX1NNUFIxX1JFR09GRlNFVCB8ICgoMjdVTCkgPDwgQURDX0NIQU5ORUxfU01QeF9CSVRPRkZTRVRfUE9TKSkKKyNkZWZpbmUgQURDX0NIQU5ORUxfMTBfU01QIFwKKyAgKEFEQ19TTVBSMl9SRUdPRkZTRVQgfCAoKDBVTCkgPDwgQURDX0NIQU5ORUxfU01QeF9CSVRPRkZTRVRfUE9TKSkKKyNkZWZpbmUgQURDX0NIQU5ORUxfMTFfU01QIFwKKyAgKEFEQ19TTVBSMl9SRUdPRkZTRVQgfCAoKDNVTCkgPDwgQURDX0NIQU5ORUxfU01QeF9CSVRPRkZTRVRfUE9TKSkKKyNkZWZpbmUgQURDX0NIQU5ORUxfMTJfU01QIFwKKyAgKEFEQ19TTVBSMl9SRUdPRkZTRVQgfCAoKDZVTCkgPDwgQURDX0NIQU5ORUxfU01QeF9CSVRPRkZTRVRfUE9TKSkKKyNkZWZpbmUgQURDX0NIQU5ORUxfMTNfU01QIFwKKyAgKEFEQ19TTVBSMl9SRUdPRkZTRVQgfCAoKDlVTCkgPDwgQURDX0NIQU5ORUxfU01QeF9CSVRPRkZTRVRfUE9TKSkKKyNkZWZpbmUgQURDX0NIQU5ORUxfMTRfU01QIFwKKyAgKEFEQ19TTVBSMl9SRUdPRkZTRVQgfCAoKDEyVUwpIDw8IEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX1BPUykpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzE1X1NNUCBcCisgIChBRENfU01QUjJfUkVHT0ZGU0VUIHwgKCgxNVVMKSA8PCBBRENfQ0hBTk5FTF9TTVB4X0JJVE9GRlNFVF9QT1MpKQorI2RlZmluZSBBRENfQ0hBTk5FTF8xNl9TTVAgXAorICAoQURDX1NNUFIyX1JFR09GRlNFVCB8ICgoMThVTCkgPDwgQURDX0NIQU5ORUxfU01QeF9CSVRPRkZTRVRfUE9TKSkKKyNkZWZpbmUgQURDX0NIQU5ORUxfMTdfU01QIFwKKyAgKEFEQ19TTVBSMl9SRUdPRkZTRVQgfCAoKDIxVUwpIDw8IEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX1BPUykpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzE4X1NNUCBcCisgIChBRENfU01QUjJfUkVHT0ZGU0VUIHwgKCgyNFVMKSA8PCBBRENfQ0hBTk5FTF9TTVB4X0JJVE9GRlNFVF9QT1MpKQorCisvKiBJbnRlcm5hbCBtYXNrIGZvciBBREMgbW9kZSBzaW5nbGUgb3IgZGlmZmVyZW50aWFsIGVuZGVkOiAgICAgICAgICAgICAgICAgICAqLworLyogVG8gc2VsZWN0IGludG8gbGl0ZXJhbHMgTExfQURDX1NJTkdMRV9FTkRFRCBvciBMTF9BRENfU0lOR0xFX0RJRkZFUkVOVElBTCAgKi8KKy8qIHRoZSByZWxldmFudCBiaXRzIGZvcjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAoY29uY2F0ZW5hdGlvbiBvZiBtdWx0aXBsZSBiaXRzIHVzZWQgaW4gZGlmZmVyZW50IHJlZ2lzdGVycykgICAgICAgICAgICAgICAqLworLyogLSBBREMgY2FsaWJyYXRpb246IGNhbGlicmF0aW9uIHN0YXJ0LCBjYWxpYnJhdGlvbiBmYWN0b3IgZ2V0IG9yIHNldCAgICAgICAgKi8KKy8qIC0gQURDIGNoYW5uZWxzOiBzZXQgZWFjaCBBREMgY2hhbm5lbCBlbmRpbmcgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFEQ19TSU5HTEVESUZGX0NBTElCX1NUQVJUX01BU0sgKEFEQ19DUl9BRENBTERJRikKKyNkZWZpbmUgQURDX1NJTkdMRURJRkZfQ0FMSUJfRkFDVE9SX01BU0sgXAorICAoQURDX0NBTEZBQ1RfQ0FMRkFDVF9EIHwgQURDX0NBTEZBQ1RfQ0FMRkFDVF9TKQorI2RlZmluZSBBRENfU0lOR0xFRElGRl9DSEFOTkVMX01BU0sgXAorICAoQURDX0NIQU5ORUxfSURfQklURklFTERfTUFTSykgLyogRXF1aXZhbGVudCB0byBBRENfRElGU0VMX0RJRlNFTCAqLworI2RlZmluZSBBRENfU0lOR0xFRElGRl9DSEFOTkVMX1NISUZUX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfQ0FMRkFDVF9DQUxGQUNUX1NfNCB8IEFEQ19DQUxGQUNUX0NBTEZBQ1RfU18zKSAvKiBCaXRzIGNob3NlbiAgIFwKKyAgdG8gcGVyZm9ybSBvZiBzaGlmdCB3aGVuIHNpbmdsZSBtb2RlIGlzIHNlbGVjdGVkLCBzaGlmdCB2YWx1ZSBvdXQgb2YgXAorICBjaGFubmVscyBiaXRzIHJhbmdlLiAqLworI2RlZmluZSBBRENfU0lOR0xFRElGRl9DQUxJQl9GX0JJVF9EX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgweDAwMDEwMDAwVUwpIC8qIFNlbGVjdGlvbiBvZiAxIGJpdCB0byBkaXNjcmltaW5hdGUgZGlmZmVyZW50aWFsIG1vZGU6IFwKKyBtYXNrIG9mIGJpdCAqLworI2RlZmluZSBBRENfU0lOR0xFRElGRl9DQUxJQl9GX0JJVF9EX1BPUyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoMTZVTCkgLyogU2VsZWN0aW9uIG9mIDEgYml0IHRvIGRpc2NyaW1pbmF0ZSBkaWZmZXJlbnRpYWwgbW9kZTogXAorcG9zaXRpb24gb2YgYml0ICovCisjZGVmaW5lIEFEQ19TSU5HTEVESUZGX0NBTElCX0ZfQklUX0RfU0hJRlQ0ICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19TSU5HTEVESUZGX0NBTElCX0ZfQklUX0RfUE9TIC0gNFVMKSAvKiBTaGlmdCBvZiBiaXQgXAorIEFEQ19TSU5HTEVESUZGX0NBTElCX0ZfQklUX0QgdG8gcGVyZm9ybSBhIHNoaWZ0IG9mIDQgcmFua3MgKi8KKworLyogSW50ZXJuYWwgbWFzayBmb3IgQURDIGFuYWxvZyB3YXRjaGRvZzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRvIHNlbGVjdCBpbnRvIGxpdGVyYWxzIExMX0FEQ19BV0RfQ0hBTk5FTHhfeHh4IHRoZSByZWxldmFudCBiaXRzIGZvcjogICAgICovCisvKiAoY29uY2F0ZW5hdGlvbiBvZiBtdWx0aXBsZSBiaXRzIHVzZWQgaW4gZGlmZmVyZW50IGFuYWxvZyB3YXRjaGRvZ3MsICAgICAgICAqLworLyogKGZlYXR1cmUgb2Ygc2V2ZXJhbCB3YXRjaGRvZ3Mgbm90IGF2YWlsYWJsZSBvbiBhbGwgU1RNMzIgc2VyaWVzKSkuICAgICAgICAgKi8KKy8qIC0gYW5hbG9nIHdhdGNoZG9nIDE6IG1vbml0b3JlZCBjaGFubmVsIGRlZmluZWQgYnkgbnVtYmVyLCAgICAgICAgICAgICAgICAgICovCisvKiAgIHNlbGVjdGlvbiBvZiBBREMgZ3JvdXAgKEFEQyBncm91cHMgcmVndWxhciBhbmQtb3IgaW5qZWN0ZWQpLiAgICAgICAgICAgICAqLworLyogLSBhbmFsb2cgd2F0Y2hkb2cgMiBhbmQgMzogbW9uaXRvcmVkIGNoYW5uZWwgZGVmaW5lZCBieSBiaXRmaWVsZCwgbm8gICAgICAgKi8KKy8qICAgc2VsZWN0aW9uIG9uIGdyb3Vwcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIEludGVybmFsIHJlZ2lzdGVyIG9mZnNldCBmb3IgQURDIGFuYWxvZyB3YXRjaGRvZyBjaGFubmVsIGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgQURDX0FXRF9DUjFfUkVHT0ZGU0VUICgweDAwMDAwMDAwVUwpCisjZGVmaW5lIEFEQ19BV0RfQ1IyX1JFR09GRlNFVCAoMHgwMDEwMDAwMFVMKQorI2RlZmluZSBBRENfQVdEX0NSM19SRUdPRkZTRVQgKDB4MDAyMDAwMDBVTCkKKworLyogUmVnaXN0ZXIgb2Zmc2V0IGdhcCBiZXR3ZWVuIEFXRDEgYW5kIEFXRDItQVdEMyBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAqLworLyogKFNldCBzZXBhcmF0ZWx5IGFzIEFEQ19BV0RfQ1JYX1JFR09GRlNFVCB0byBzcGFyZSAzMiBiaXRzIHNwYWNlICovCisjZGVmaW5lIEFEQ19BV0RfQ1IxMl9SRUdPRkZTRVRHQVBfTUFTSyAoQURDX0FXRDJDUl9BV0QyQ0hfMCkKKyNkZWZpbmUgQURDX0FXRF9DUjEyX1JFR09GRlNFVEdBUF9WQUwgKDB4MDAwMDAwMjRVTCkKKworI2RlZmluZSBBRENfQVdEX0NSWF9SRUdPRkZTRVRfTUFTSyBcCisgIChBRENfQVdEX0NSMV9SRUdPRkZTRVQgfCBBRENfQVdEX0NSMl9SRUdPRkZTRVQgfCBBRENfQVdEX0NSM19SRUdPRkZTRVQpCisKKyNkZWZpbmUgQURDX0FXRF9DUjFfQ0hBTk5FTF9NQVNLIFwKKyAgKEFEQ19DRkdSX0FXRDFDSCB8IEFEQ19DRkdSX0pBV0QxRU4gfCBBRENfQ0ZHUl9BV0QxRU4gfCBBRENfQ0ZHUl9BV0QxU0dMKQorI2RlZmluZSBBRENfQVdEX0NSMjNfQ0hBTk5FTF9NQVNLIChBRENfQVdEMkNSX0FXRDJDSCkKKyNkZWZpbmUgQURDX0FXRF9DUl9BTExfQ0hBTk5FTF9NQVNLIFwKKyAgKEFEQ19BV0RfQ1IxX0NIQU5ORUxfTUFTSyB8IEFEQ19BV0RfQ1IyM19DSEFOTkVMX01BU0spCisKKyNkZWZpbmUgQURDX0FXRF9DUlhfUkVHT0ZGU0VUX1BPUyAgICAgICAgICAgICAgICAgIFwKKyAgKDIwVUwpIC8qIFBvc2l0aW9uIG9mIGJpdHMgQURDX0FXRF9DUnhfUkVHT0ZGU0VUIFwKKyAgICAgICAgICAgIGluIEFEQ19BV0RfQ1JYX1JFR09GRlNFVF9NQVNLICovCisKKy8qIEludGVybmFsIHJlZ2lzdGVyIG9mZnNldCBmb3IgQURDIGFuYWxvZyB3YXRjaGRvZyB0aHJlc2hvbGQgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBBRENfQVdEX1RSMV9SRUdPRkZTRVQgKEFEQ19BV0RfQ1IxX1JFR09GRlNFVCkKKyNkZWZpbmUgQURDX0FXRF9UUjJfUkVHT0ZGU0VUIChBRENfQVdEX0NSMl9SRUdPRkZTRVQpCisjZGVmaW5lIEFEQ19BV0RfVFIzX1JFR09GRlNFVCAoQURDX0FXRF9DUjNfUkVHT0ZGU0VUKQorI2RlZmluZSBBRENfQVdEX1RSWF9SRUdPRkZTRVRfTUFTSyBcCisgIChBRENfQVdEX1RSMV9SRUdPRkZTRVQgfCBBRENfQVdEX1RSMl9SRUdPRkZTRVQgfCBBRENfQVdEX1RSM19SRUdPRkZTRVQpCisjZGVmaW5lIEFEQ19BV0RfVFJYX1JFR09GRlNFVF9QT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfQVdEX0NSWF9SRUdPRkZTRVRfUE9TKSAvKiBQb3NpdGlvbiBvZiBiaXRzIEFEQ19TUVJ4X1JFR09GRlNFVCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBBRENfQVdEX1RSWF9SRUdPRkZTRVRfTUFTSyAqLworI2RlZmluZSBBRENfQVdEX1RSWF9CSVRfSElHSF9NQVNLICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKDB4MDAwMTAwMDBVTCkgLyogU2VsZWN0aW9uIG9mIDEgYml0IHRvIGRpc2NyaW1pbmF0ZSBcCisgICAgICAgICAgICAgICAgICAgIHRocmVzaG9sZCBoaWdoOiBtYXNrIG9mIGJpdCAqLworI2RlZmluZSBBRENfQVdEX1RSWF9CSVRfSElHSF9QT1MgICAgICAgICAgICAgICBcCisgICgxNlVMKSAvKiBTZWxlY3Rpb24gb2YgMSBiaXQgdG8gZGlzY3JpbWluYXRlIFwKKyAgICAgICAgICAgIHRocmVzaG9sZCBoaWdoOiBwb3NpdGlvbiBvZiBiaXQgKi8KKyNkZWZpbmUgQURDX0FXRF9UUlhfQklUX0hJR0hfU0hJRlQ0ICAgICAgICAgICAgIFwKKyAgKEFEQ19BV0RfVFJYX0JJVF9ISUdIX1BPUyAtICAgICAgICAgICAgICAgICAgIFwKKyAgIDRVTCkgLyogU2hpZnQgb2YgYml0IEFEQ19BV0RfVFJYX0JJVF9ISUdIIHRvIFwKKyAgICAgICAgICAgcG9zaXRpb24gdG8gcGVyZm9ybSBhIHNoaWZ0IG9mIDQgcmFua3MgKi8KKworLyogSW50ZXJuYWwgbWFzayBmb3IgQURDIG9mZnNldDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEludGVybmFsIHJlZ2lzdGVyIG9mZnNldCBmb3IgQURDIG9mZnNldCBpbnN0YW5jZSBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIEFEQ19PRlIxX1JFR09GRlNFVCAoMHgwMDAwMDAwMFVMKQorI2RlZmluZSBBRENfT0ZSMl9SRUdPRkZTRVQgKDB4MDAwMDAwMDFVTCkKKyNkZWZpbmUgQURDX09GUjNfUkVHT0ZGU0VUICgweDAwMDAwMDAyVUwpCisjZGVmaW5lIEFEQ19PRlI0X1JFR09GRlNFVCAoMHgwMDAwMDAwM1VMKQorI2RlZmluZSBBRENfT0ZSeF9SRUdPRkZTRVRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX09GUjFfUkVHT0ZGU0VUIHwgQURDX09GUjJfUkVHT0ZGU0VUIHwgQURDX09GUjNfUkVHT0ZGU0VUIHwgXAorICAgQURDX09GUjRfUkVHT0ZGU0VUKQorCisvKiBBREMgcmVnaXN0ZXJzIGJpdHMgcG9zaXRpb25zICovCisjZGVmaW5lIEFEQ19DRkdSX1JFU19CSVRPRkZTRVRfUE9TIChBRENfQ0ZHUl9SRVNfUG9zKQorI2RlZmluZSBBRENfQ0ZHUl9BV0QxU0dMX0JJVE9GRlNFVF9QT1MgKEFEQ19DRkdSX0FXRDFTR0xfUG9zKQorI2RlZmluZSBBRENfQ0ZHUl9BV0QxRU5fQklUT0ZGU0VUX1BPUyAoQURDX0NGR1JfQVdEMUVOX1BvcykKKyNkZWZpbmUgQURDX0NGR1JfSkFXRDFFTl9CSVRPRkZTRVRfUE9TIChBRENfQ0ZHUl9KQVdEMUVOX1BvcykKKyNkZWZpbmUgQURDX1RSMV9IVDFfQklUT0ZGU0VUX1BPUyAoQURDX1RSMV9IVDFfUG9zKQorCisvKiBBREMgcmVnaXN0ZXJzIGJpdHMgZ3JvdXBzICovCisjZGVmaW5lIEFEQ19DUl9CSVRTX1BST1BFUlRZX1JTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0NSX0FEQ0FMIHwgQURDX0NSX0FERU4gfCBBRENfQ1JfQURESVMgfCBBRENfQ1JfSkFEU1RBUlQgfCAgICAgICAgICAgICAgIFwKKyAgIEFEQ19DUl9KQURTVFAgfCBBRENfQ1JfQURTVEFSVCB8IEFEQ19DUl9BRFNUUCkgLyogQURDIHJlZ2lzdGVyIENSIGJpdHMgd2l0aCBcCisgICAgIEhXIHByb3BlcnR5ICJycyI6IFNvZnR3YXJlIGNhbiByZWFkIGFzIHdlbGwgYXMgc2V0IHRoaXMgYml0LiAgICAgICAgICAgICAgXAorICAgICBXcml0aW5nICcwJyBoYXMgbm8gZWZmZWN0IG9uIHRoZSBiaXQgdmFsdWUuICovCisKKy8qIEFEQyBpbnRlcm5hbCBjaGFubmVscyByZWxhdGVkIGRlZmluaXRpb25zICovCisvKiBJbnRlcm5hbCB2b2x0YWdlIHJlZmVyZW5jZSBWcmVmSW50ICovCisjZGVmaW5lIFZSRUZJTlRfQ0FMX0FERFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgodWludDE2X3QgKikoMHgxRkZGNzVBQVVMKSkgLyogSW50ZXJuYWwgdm9sdGFnZSByZWZlcmVuY2UsIGFkZHJlc3Mgb2YgICAgICBcCisgIHBhcmFtZXRlciBWUkVGSU5UX0NBTDogVnJlZkludCBBREMgcmF3IGRhdGEgYWNxdWlyZWQgYXQgdGVtcGVyYXR1cmUgMzAgRGVnQyBcCisgICh0b2xlcmFuY2U6ICstNSBEZWdDKSwgVnJlZisgPSAzLjAgViAodG9sZXJhbmNlOiArLTEwIG1WKS4gKi8KKyNkZWZpbmUgVlJFRklOVF9DQUxfVlJFRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoMzAwMFVMKSAvKiBBbmFsb2cgdm9sdGFnZSByZWZlcmVuY2UgKFZyZWYrKSB2YWx1ZSBcCit3aXRoIHdoaWNoIFZyZWZJbnQgaGFzIGJlZW4gY2FsaWJyYXRlZCBpbiBwcm9kdWN0aW9uIFwKKyh0b2xlcmFuY2U6ICstMTAgbVYpICh1bml0OiBtVikuICovCisvKiBUZW1wZXJhdHVyZSBzZW5zb3IgKi8KKyNkZWZpbmUgVEVNUFNFTlNPUl9DQUwxX0FERFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgodWludDE2X3QgKikoMHgxRkZGNzVBOFVMKSkgLyogQWRkcmVzcyBvZiBwYXJhbWV0ZXIgVFNfQ0FMMTogT24gU1RNMzJHNCwgXAorICB0ZW1wZXJhdHVyZSBzZW5zb3IgQURDIHJhdyBkYXRhIGFjcXVpcmVkIGF0IHRlbXBlcmF0dXJlICAzMCBEZWdDICAgICAgICAgIFwKKyAgKHRvbGVyYW5jZTogKy01IERlZ0MpLCBWcmVmKyA9IDMuMCBWICh0b2xlcmFuY2U6ICstMTAgbVYpLiAqLworI2RlZmluZSBURU1QU0VOU09SX0NBTDJfQUREUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCh1aW50MTZfdCAqKSgweDFGRkY3NUNBVUwpKSAvKiBBZGRyZXNzIG9mIHBhcmFtZXRlciBUU19DQUwyOiBPbiBTVE0zMkc0LCBcCisgIHRlbXBlcmF0dXJlIHNlbnNvciBBREMgcmF3IGRhdGEgYWNxdWlyZWQgYXQgdGVtcGVyYXR1cmUgMTEwIERlZ0MgICAgICAgICAgXAorICAodG9sZXJhbmNlOiArLTUgRGVnQyksIFZyZWYrID0gMy4wIFYgKHRvbGVyYW5jZTogKy0xMCBtVikuICovCisjZGVmaW5lIFRFTVBTRU5TT1JfQ0FMMV9URU1QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgzMEwpIC8qIFRlbXBlcmF0dXJlIGF0IHdoaWNoIHRlbXBlcmF0dXJlIHNlbnNvciAgICAgICAgICAgICAgICAgICBcCitoYXMgYmVlbiBjYWxpYnJhdGVkIGluIHByb2R1Y3Rpb24gZm9yIGRhdGEgaW50byBURU1QU0VOU09SX0NBTDFfQUREUiBcCisodG9sZXJhbmNlOiArLTUgRGVnQykgKHVuaXQ6IERlZ0MpLiAqLworI2RlZmluZSBURU1QU0VOU09SX0NBTDJfVEVNUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoMTEwTCkgLyogVGVtcGVyYXR1cmUgYXQgd2hpY2ggdGVtcGVyYXR1cmUgc2Vuc29yICAgICAgICAgICAgICAgICAgXAoraGFzIGJlZW4gY2FsaWJyYXRlZCBpbiBwcm9kdWN0aW9uIGZvciBkYXRhIGludG8gVEVNUFNFTlNPUl9DQUwyX0FERFIgXAorKHRvbGVyYW5jZTogKy01IERlZ0MpICh1bml0OiBEZWdDKS4gKi8KKyNkZWZpbmUgVEVNUFNFTlNPUl9DQUxfVlJFRkFOQUxPRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgzMDAwVUwpIC8qIEFuYWxvZyB2b2x0YWdlIHJlZmVyZW5jZSAoVnJlZispIHZhbHVlICAgICAgICAgICAgXAord2l0aCB3aGljaCB0ZW1wZXJhdHVyZSBzZW5zb3IgaGFzIGJlZW4gY2FsaWJyYXRlZCBpbiBwcm9kdWN0aW9uIFwKKyh0b2xlcmFuY2UgKy0xMCBtVikgKHVuaXQ6IG1WKS4gKi8KKworLyoqCisgKiBAfQorICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEFEQ19MTF9Qcml2YXRlX01hY3JvcyBBREMgUHJpdmF0ZSBNYWNyb3MKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgIERyaXZlciBtYWNybyByZXNlcnZlZCBmb3IgaW50ZXJuYWwgdXNlOiBzZXQgYSBwb2ludGVyIHRvCisgKiAgICAgICAgIGEgcmVnaXN0ZXIgZnJvbSBhIHJlZ2lzdGVyIGJhc2lzIGZyb20gd2hpY2ggYW4gb2Zmc2V0CisgKiAgICAgICAgIGlzIGFwcGxpZWQuCisgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgYmFzaXMgZnJvbSB3aGljaCB0aGUgb2Zmc2V0IGlzIGFwcGxpZWQuCisgKiBAcGFyYW0gIF9fUkVHX09GRkZTRVRfXyBPZmZzZXQgdG8gYmUgYXBwbGllZCAodW5pdDogbnVtYmVyIG9mIHJlZ2lzdGVycykuCisgKiBAcmV0dmFsIFBvaW50ZXIgdG8gcmVnaXN0ZXIgYWRkcmVzcworICovCisjZGVmaW5lIF9fQURDX1BUUl9SRUdfT0ZGU0VUKF9fUkVHX18sIF9fUkVHX09GRkZTRVRfXykgICBcCisgICgoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJihfX1JFR19fKSkgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19SRUdfT0ZGRlNFVF9fKSA8PCAyVUwpKSkpCisKKy8qKgorICogQH0KKyAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBBRENfTExfRVNfSU5JVCBBREMgRXhwb3J0ZWQgSW5pdCBzdHJ1Y3R1cmUKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgIFN0cnVjdHVyZSBkZWZpbml0aW9uIG9mIHNvbWUgZmVhdHVyZXMgb2YgQURDIGNvbW1vbiBwYXJhbWV0ZXJzCisgKiAgICAgICAgIGFuZCBtdWx0aW1vZGUKKyAqICAgICAgICAgKGFsbCBBREMgaW5zdGFuY2VzIGJlbG9uZ2luZyB0byB0aGUgc2FtZSBBREMgY29tbW9uIGluc3RhbmNlKS4KKyAqIEBub3RlICAgVGhlIHNldHRpbmcgb2YgdGhlc2UgcGFyYW1ldGVycyBieSBmdW5jdGlvbiBAcmVmIExMX0FEQ19Db21tb25Jbml0KCkKKyAqICAgICAgICAgaXMgY29uZGl0aW9uZWQgdG8gQURDIGluc3RhbmNlcyBzdGF0ZSAoYWxsIEFEQyBpbnN0YW5jZXMKKyAqICAgICAgICAgc2hhcmluZyB0aGUgc2FtZSBBREMgY29tbW9uIGluc3RhbmNlKToKKyAqICAgICAgICAgQWxsIEFEQyBpbnN0YW5jZXMgc2hhcmluZyB0aGUgc2FtZSBBREMgY29tbW9uIGluc3RhbmNlIG11c3QgYmUKKyAqICAgICAgICAgZGlzYWJsZWQuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDMyX3QgQ29tbW9uQ2xvY2s7IC8qITwgU2V0IHBhcmFtZXRlciBjb21tb24gdG8gc2V2ZXJhbCBBREM6IENsb2NrIHNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHByZXNjYWxlci4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0xMX0VDX0NPTU1PTl9DTE9DS19TT1VSQ0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgT24gdGhpcyBTVE0zMiBzZXJpZXMsIGlmIEFEQyBncm91cCBpbmplY3RlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgdXNlZCwgc29tZSBjbG9jayByYXRpbyBjb25zdHJhaW50cyBiZXR3ZWVuIEFEQworICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvY2sgYW5kIEFIQiBjbG9jayBtdXN0IGJlIHJlc3BlY3RlZC4gUmVmZXIgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZSBtYW51YWwuIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExMX0FEQ19TZXRDb21tb25DbG9jaygpLiAqLworCisjaWYgZGVmaW5lZChBRENfTVVMVElNT0RFX1NVUFBPUlQpCisgIHVpbnQzMl90IE11bHRpbW9kZTsgLyohPCBTZXQgQURDIG11bHRpbW9kZSBjb25maWd1cmF0aW9uIHRvIG9wZXJhdGUgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlcGVuZGVudCBtb2RlIG9yIG11bHRpbW9kZSAoZm9yIGRldmljZXMgd2l0aCBzZXZlcmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgQURDIGluc3RhbmNlcykuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICBBRENfTExfRUNfTVVMVElfTU9ERSBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkCisgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExMX0FEQ19TZXRNdWx0aW1vZGUoKS4gKi8KKworICB1aW50MzJfdCBNdWx0aURNQVRyYW5zZmVyOyAvKiE8IFNldCBBREMgbXVsdGltb2RlIGNvbnZlcnNpb24gZGF0YSB0cmFuc2Zlcjogbm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXIgb3IgdHJhbnNmZXIgYnkgRE1BLiBUaGlzIHBhcmFtZXRlciBjYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ19MTF9FQ19NVUxUSV9ETUFfVFJBTlNGRVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdGFyeSBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgTExfQURDX1NldE11bHRpRE1BVHJhbnNmZXIoKS4gKi8KKworICB1aW50MzJfdAorICAgICAgTXVsdGlUd29TYW1wbGluZ0RlbGF5OyAvKiE8IFNldCBBREMgbXVsdGltb2RlIGRlbGF5IGJldHdlZW4gMiBzYW1wbGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaGFzZXMuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0xMX0VDX01VTFRJX1RXT1NNUF9ERUxBWSBUaGlzIGZlYXR1cmUgY2FuIGJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgTExfQURDX1NldE11bHRpVHdvU2FtcGxpbmdEZWxheSgpLiAqLworI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAvKiBBRENfTVVMVElNT0RFX1NVUFBPUlQgKi8KKworfSBMTF9BRENfQ29tbW9uSW5pdFR5cGVEZWY7CisKKy8qKgorICogQGJyaWVmICBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBvZiBzb21lIGZlYXR1cmVzIG9mIEFEQyBpbnN0YW5jZS4KKyAqIEBub3RlICAgVGhlc2UgcGFyYW1ldGVycyBoYXZlIGFuIGltcGFjdCBvbiBBREMgc2NvcGU6IEFEQyBpbnN0YW5jZS4KKyAqICAgICAgICAgQWZmZWN0cyBib3RoIGdyb3VwIHJlZ3VsYXIgYW5kIGdyb3VwIGluamVjdGVkIChhdmFpbGFiaWxpdHkKKyAqICAgICAgICAgb2YgQURDIGdyb3VwIGluamVjdGVkIGRlcGVuZHMgb24gU1RNMzIgc2VyaWVzKS4KKyAqICAgICAgICAgUmVmZXIgdG8gY29ycmVzcG9uZGluZyB1bml0YXJ5IGZ1bmN0aW9ucyBpbnRvCisgKiAgICAgICAgIEByZWYgQURDX0xMX0VGX0NvbmZpZ3VyYXRpb25fQURDX0luc3RhbmNlIC4KKyAqIEBub3RlICAgVGhlIHNldHRpbmcgb2YgdGhlc2UgcGFyYW1ldGVycyBieSBmdW5jdGlvbiBAcmVmIExMX0FEQ19Jbml0KCkKKyAqICAgICAgICAgaXMgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlOgorICogICAgICAgICBBREMgaW5zdGFuY2UgbXVzdCBiZSBkaXNhYmxlZC4KKyAqICAgICAgICAgVGhpcyBjb25kaXRpb24gaXMgYXBwbGllZCB0byBhbGwgQURDIGZlYXR1cmVzLCBmb3IgZWZmaWNpZW5jeQorICogICAgICAgICBhbmQgY29tcGF0aWJpbGl0eSBvdmVyIGFsbCBTVE0zMiBzZXJpZXMuIEhvd2V2ZXIsIHRoZSBkaWZmZXJlbnQKKyAqICAgICAgICAgZmVhdHVyZXMgY2FuIGJlIHNldCB1bmRlciBkaWZmZXJlbnQgQURDIHN0YXRlIGNvbmRpdGlvbnMKKyAqICAgICAgICAgKHNldHRpbmcgcG9zc2libGUgd2l0aCBBREMgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcsCisgKiAgICAgICAgIEFEQyBlbmFibGVkIHdpdGggY29udmVyc2lvbiBvbiBnb2luZywgLi4uKQorICogICAgICAgICBFYWNoIGZlYXR1cmUgY2FuIGJlIHVwZGF0ZWQgYWZ0ZXJ3YXJkcyB3aXRoIGEgdW5pdGFyeSBmdW5jdGlvbgorICogICAgICAgICBhbmQgcG90ZW50aWFsbHkgd2l0aCBBREMgaW4gYSBkaWZmZXJlbnQgc3RhdGUgdGhhbiBkaXNhYmxlZCwKKyAqICAgICAgICAgcmVmZXIgdG8gZGVzY3JpcHRpb24gb2YgZWFjaCBmdW5jdGlvbiBmb3Igc2V0dGluZworICogICAgICAgICBjb25kaXRpb25lZCB0byBBREMgc3RhdGUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDMyX3QgUmVzb2x1dGlvbjsgLyohPCBTZXQgQURDIHJlc29sdXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfTExfRUNfUkVTT0xVVElPTiBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgTExfQURDX1NldFJlc29sdXRpb24oKS4gKi8KKworICB1aW50MzJfdCBEYXRhQWxpZ25tZW50OyAvKiE8IFNldCBBREMgY29udmVyc2lvbiBkYXRhIGFsaWdubWVudC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19MTF9FQ19EQVRBX0FMSUdOIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBMTF9BRENfU2V0RGF0YUFsaWdubWVudCgpLiAqLworCisgIHVpbnQzMl90IExvd1Bvd2VyTW9kZTsgLyohPCBTZXQgQURDIGxvdyBwb3dlciBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19MTF9FQ19MUF9NT0RFIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgTExfQURDX1NldExvd1Bvd2VyTW9kZSgpLiAqLworCit9IExMX0FEQ19Jbml0VHlwZURlZjsKKworLyoqCisgKiBAYnJpZWYgIFN0cnVjdHVyZSBkZWZpbml0aW9uIG9mIHNvbWUgZmVhdHVyZXMgb2YgQURDIGdyb3VwIHJlZ3VsYXIuCisgKiBAbm90ZSAgIFRoZXNlIHBhcmFtZXRlcnMgaGF2ZSBhbiBpbXBhY3Qgb24gQURDIHNjb3BlOiBBREMgZ3JvdXAgcmVndWxhci4KKyAqICAgICAgICAgUmVmZXIgdG8gY29ycmVzcG9uZGluZyB1bml0YXJ5IGZ1bmN0aW9ucyBpbnRvCisgKiAgICAgICAgIEByZWYgQURDX0xMX0VGX0NvbmZpZ3VyYXRpb25fQURDX0dyb3VwX1JlZ3VsYXIKKyAqICAgICAgICAgKGZ1bmN0aW9ucyB3aXRoIHByZWZpeCAiUkVHIikuCisgKiBAbm90ZSAgIFRoZSBzZXR0aW5nIG9mIHRoZXNlIHBhcmFtZXRlcnMgYnkgZnVuY3Rpb24gQHJlZiBMTF9BRENfUkVHX0luaXQoKQorICogICAgICAgICBpcyBjb25kaXRpb25lZCB0byBBREMgc3RhdGU6CisgKiAgICAgICAgIEFEQyBpbnN0YW5jZSBtdXN0IGJlIGRpc2FibGVkLgorICogICAgICAgICBUaGlzIGNvbmRpdGlvbiBpcyBhcHBsaWVkIHRvIGFsbCBBREMgZmVhdHVyZXMsIGZvciBlZmZpY2llbmN5CisgKiAgICAgICAgIGFuZCBjb21wYXRpYmlsaXR5IG92ZXIgYWxsIFNUTTMyIHNlcmllcy4gSG93ZXZlciwgdGhlIGRpZmZlcmVudAorICogICAgICAgICBmZWF0dXJlcyBjYW4gYmUgc2V0IHVuZGVyIGRpZmZlcmVudCBBREMgc3RhdGUgY29uZGl0aW9ucworICogICAgICAgICAoc2V0dGluZyBwb3NzaWJsZSB3aXRoIEFEQyBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZywKKyAqICAgICAgICAgQURDIGVuYWJsZWQgd2l0aCBjb252ZXJzaW9uIG9uIGdvaW5nLCAuLi4pCisgKiAgICAgICAgIEVhY2ggZmVhdHVyZSBjYW4gYmUgdXBkYXRlZCBhZnRlcndhcmRzIHdpdGggYSB1bml0YXJ5IGZ1bmN0aW9uCisgKiAgICAgICAgIGFuZCBwb3RlbnRpYWxseSB3aXRoIEFEQyBpbiBhIGRpZmZlcmVudCBzdGF0ZSB0aGFuIGRpc2FibGVkLAorICogICAgICAgICByZWZlciB0byBkZXNjcmlwdGlvbiBvZiBlYWNoIGZ1bmN0aW9uIGZvciBzZXR0aW5nCisgKiAgICAgICAgIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50MzJfdAorICAgICAgVHJpZ2dlclNvdXJjZTsgLyohPCBTZXQgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIHNvdXJjZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsIChTVyBzdGFydCkgb3IgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsICh0aW1lcgorICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQsIGV4dGVybmFsIGludGVycnVwdCBsaW5lKS4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIG9mIEByZWYgQURDX0xMX0VDX1JFR19UUklHR0VSX1NPVVJDRQorICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBPbiB0aGlzIFNUTTMyIHNlcmllcywgc2V0dGluZyB0cmlnZ2VyIHNvdXJjZSB0bworICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWwgdHJpZ2dlciBhbHNvIHNldCB0cmlnZ2VyIHBvbGFyaXR5IHRvIHJpc2luZworICAgICAgICAgICAgICAgICAgICAgICAgZWRnZShkZWZhdWx0IHNldHRpbmcgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBzb21lIEFEQyBvbgorICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIgU1RNMzIgc2VyaWVzIGhhdmluZyB0aGlzIHNldHRpbmcgc2V0IGJ5IEhXIGRlZmF1bHQKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKS4gSW4gY2FzZSBvZiBuZWVkIHRvIG1vZGlmeSB0cmlnZ2VyIGVkZ2UsIHVzZQorICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBMTF9BRENfUkVHX1NldFRyaWdnZXJFZGdlKCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5CisgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExMX0FEQ19SRUdfU2V0VHJpZ2dlclNvdXJjZSgpLiAqLworCisgIHVpbnQzMl90IFNlcXVlbmNlckxlbmd0aDsgLyohPCBTZXQgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGxlbmd0aC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfTExfRUNfUkVHX1NFUV9TQ0FOX0xFTkdUSCBUaGlzIGZlYXR1cmUgY2FuIGJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyTGVuZ3RoKCkuICovCisKKyAgdWludDMyX3QKKyAgICAgIFNlcXVlbmNlckRpc2NvbnQ7IC8qITwgU2V0IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBkaXNjb250aW51b3VzIG1vZGU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZSBzdWJkaXZpZGVkIGFuZCBzY2FuIGNvbnZlcnNpb25zIGludGVycnVwdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVyeSBzZWxlY3RlZCBudW1iZXIgb2YgcmFua3MuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgYSB2YWx1ZSBvZiBAcmVmIEFEQ19MTF9FQ19SRUdfU0VRX0RJU0NPTlRfTU9ERQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBUaGlzIHBhcmFtZXRlciBoYXMgYW4gZWZmZWN0IG9ubHkgaWYgZ3JvdXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ3VsYXIgc2VxdWVuY2VyIGlzIGVuYWJsZWQgKHNjYW4gbGVuZ3RoIG9mIDIgcmFua3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIG1vcmUpLiBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBMTF9BRENfUkVHX1NldFNlcXVlbmNlckRpc2NvbnQoKS4gKi8KKworICB1aW50MzJfdAorICAgICAgQ29udGludW91c01vZGU7IC8qITwgU2V0IEFEQyBjb250aW51b3VzIGNvbnZlcnNpb24gbW9kZSBvbiBBREMgZ3JvdXAKKyAgICAgICAgICAgICAgICAgICAgICAgICByZWd1bGFyLCB3aGV0aGVyIEFEQyBjb252ZXJzaW9ucyBhcmUgcGVyZm9ybWVkIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xlIG1vZGUgKG9uZSBjb252ZXJzaW9uIHBlciB0cmlnZ2VyKSBvciBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludW91cyBtb2RlIChhZnRlciB0aGUgZmlyc3QgdHJpZ2dlciwgZm9sbG93aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbnMgbGF1bmNoZWQgc3VjY2Vzc2l2ZWx5IGF1dG9tYXRpY2FsbHkpLiBUaGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICBBRENfTExfRUNfUkVHX0NPTlRJTlVPVVNfTU9ERSBOb3RlOiBJdCBpcyBub3QgcG9zc2libGUKKyAgICAgICAgICAgICAgICAgICAgICAgICB0byBlbmFibGUgYm90aCBBREMgZ3JvdXAgcmVndWxhciBjb250aW51b3VzIG1vZGUgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgZGlzY29udGludW91cyBtb2RlLiBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkCisgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExMX0FEQ19SRUdfU2V0Q29udGludW91c01vZGUoKS4gKi8KKworICB1aW50MzJfdCBETUFUcmFuc2ZlcjsgLyohPCBTZXQgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBkYXRhIHRyYW5zZmVyOiBubworICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXIgb3IgdHJhbnNmZXIgYnkgRE1BLCBhbmQgRE1BIHJlcXVlc3RzIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19MTF9FQ19SRUdfRE1BX1RSQU5TRkVSIFRoaXMgZmVhdHVyZSBjYW4gYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExMX0FEQ19SRUdfU2V0RE1BVHJhbnNmZXIoKS4gKi8KKworICB1aW50MzJfdCBPdmVycnVuOyAvKiE8IFNldCBBREMgZ3JvdXAgcmVndWxhciBiZWhhdmlvciBpbiBjYXNlIG9mIG92ZXJydW46CisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSBwcmVzZXJ2ZWQgb3Igb3ZlcndyaXR0ZW4uCisgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICBBRENfTExfRUNfUkVHX09WUl9EQVRBX0JFSEFWSU9SIFRoaXMgZmVhdHVyZSBjYW4gYmUKKyAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBMTF9BRENfUkVHX1NldE92ZXJydW4oKS4gKi8KKworfSBMTF9BRENfUkVHX0luaXRUeXBlRGVmOworCisvKioKKyAqIEBicmllZiAgU3RydWN0dXJlIGRlZmluaXRpb24gb2Ygc29tZSBmZWF0dXJlcyBvZiBBREMgZ3JvdXAgaW5qZWN0ZWQuCisgKiBAbm90ZSAgIFRoZXNlIHBhcmFtZXRlcnMgaGF2ZSBhbiBpbXBhY3Qgb24gQURDIHNjb3BlOiBBREMgZ3JvdXAgaW5qZWN0ZWQuCisgKiAgICAgICAgIFJlZmVyIHRvIGNvcnJlc3BvbmRpbmcgdW5pdGFyeSBmdW5jdGlvbnMgaW50bworICogICAgICAgICBAcmVmIEFEQ19MTF9FRl9Db25maWd1cmF0aW9uX0FEQ19Hcm91cF9SZWd1bGFyCisgKiAgICAgICAgIChmdW5jdGlvbnMgd2l0aCBwcmVmaXggIklOSiIpLgorICogQG5vdGUgICBUaGUgc2V0dGluZyBvZiB0aGVzZSBwYXJhbWV0ZXJzIGJ5IGZ1bmN0aW9uIEByZWYgTExfQURDX0lOSl9Jbml0KCkKKyAqICAgICAgICAgaXMgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlOgorICogICAgICAgICBBREMgaW5zdGFuY2UgbXVzdCBiZSBkaXNhYmxlZC4KKyAqICAgICAgICAgVGhpcyBjb25kaXRpb24gaXMgYXBwbGllZCB0byBhbGwgQURDIGZlYXR1cmVzLCBmb3IgZWZmaWNpZW5jeQorICogICAgICAgICBhbmQgY29tcGF0aWJpbGl0eSBvdmVyIGFsbCBTVE0zMiBzZXJpZXMuIEhvd2V2ZXIsIHRoZSBkaWZmZXJlbnQKKyAqICAgICAgICAgZmVhdHVyZXMgY2FuIGJlIHNldCB1bmRlciBkaWZmZXJlbnQgQURDIHN0YXRlIGNvbmRpdGlvbnMKKyAqICAgICAgICAgKHNldHRpbmcgcG9zc2libGUgd2l0aCBBREMgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcsCisgKiAgICAgICAgIEFEQyBlbmFibGVkIHdpdGggY29udmVyc2lvbiBvbiBnb2luZywgLi4uKQorICogICAgICAgICBFYWNoIGZlYXR1cmUgY2FuIGJlIHVwZGF0ZWQgYWZ0ZXJ3YXJkcyB3aXRoIGEgdW5pdGFyeSBmdW5jdGlvbgorICogICAgICAgICBhbmQgcG90ZW50aWFsbHkgd2l0aCBBREMgaW4gYSBkaWZmZXJlbnQgc3RhdGUgdGhhbiBkaXNhYmxlZCwKKyAqICAgICAgICAgcmVmZXIgdG8gZGVzY3JpcHRpb24gb2YgZWFjaCBmdW5jdGlvbiBmb3Igc2V0dGluZworICogICAgICAgICBjb25kaXRpb25lZCB0byBBREMgc3RhdGUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDMyX3QKKyAgICAgIFRyaWdnZXJTb3VyY2U7IC8qITwgU2V0IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgc291cmNlOgorICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWwgKFNXIHN0YXJ0KSBvciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWwgKHRpbWVyCisgICAgICAgICAgICAgICAgICAgICAgICBldmVudCwgZXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUpLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYQorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgb2YgQHJlZiBBRENfTExfRUNfSU5KX1RSSUdHRVJfU09VUkNFCisgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBzZXR0aW5nIHRyaWdnZXIgc291cmNlIHRvCisgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbCB0cmlnZ2VyIGFsc28gc2V0IHRyaWdnZXIgcG9sYXJpdHkgdG8gcmlzaW5nCisgICAgICAgICAgICAgICAgICAgICAgICBlZGdlIChkZWZhdWx0IHNldHRpbmcgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBzb21lIEFEQyBvbgorICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIgU1RNMzIgc2VyaWVzIGhhdmluZyB0aGlzIHNldHRpbmcgc2V0IGJ5IEhXIGRlZmF1bHQKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKS4gSW4gY2FzZSBvZiBuZWVkIHRvIG1vZGlmeSB0cmlnZ2VyIGVkZ2UsIHVzZQorICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBMTF9BRENfSU5KX1NldFRyaWdnZXJFZGdlKCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5CisgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExMX0FEQ19JTkpfU2V0VHJpZ2dlclNvdXJjZSgpLiAqLworCisgIHVpbnQzMl90IFNlcXVlbmNlckxlbmd0aDsgLyohPCBTZXQgQURDIGdyb3VwIGluamVjdGVkIHNlcXVlbmNlciBsZW5ndGguCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0xMX0VDX0lOSl9TRVFfU0NBTl9MRU5HVEggVGhpcyBmZWF0dXJlIGNhbiBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBMTF9BRENfSU5KX1NldFNlcXVlbmNlckxlbmd0aCgpLiAqLworCisgIHVpbnQzMl90IFNlcXVlbmNlckRpc2NvbnQ7IC8qITwgU2V0IEFEQyBncm91cCBpbmplY3RlZCBzZXF1ZW5jZXIgZGlzY29udGludW91cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlOiBzZXF1ZW5jZSBzdWJkaXZpZGVkIGFuZCBzY2FuIGNvbnZlcnNpb25zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdGVkIGV2ZXJ5IHNlbGVjdGVkIG51bWJlciBvZiByYW5rcy4gVGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfTExfRUNfSU5KX1NFUV9ESVNDT05UX01PREUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBUaGlzIHBhcmFtZXRlciBoYXMgYW4gZWZmZWN0IG9ubHkgaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgaW5qZWN0ZWQgc2VxdWVuY2VyIGlzIGVuYWJsZWQgKHNjYW4gbGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIDIgcmFua3Mgb3IgbW9yZSkuIFRoaXMgZmVhdHVyZSBjYW4gYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBMTF9BRENfSU5KX1NldFNlcXVlbmNlckRpc2NvbnQoKS4gKi8KKworICB1aW50MzJfdAorICAgICAgVHJpZ0F1dG87IC8qITwgU2V0IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXI6IGluZGVwZW5kZW50IG9yCisgICAgICAgICAgICAgICAgICAgZnJvbSBBREMgZ3JvdXAgcmVndWxhci4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgIEFEQ19MTF9FQ19JTkpfVFJJR19BVVRPIE5vdGU6IFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgc2V0IHRvCisgICAgICAgICAgICAgICAgICAgc2V0IHRvIGluZGVwZW5kZW50IHRyaWdnZXIgaWYgaW5qZWN0ZWQgdHJpZ2dlciBzb3VyY2UgaXMgc2V0CisgICAgICAgICAgICAgICAgICAgdG8gYW4gZXh0ZXJuYWwgdHJpZ2dlci4gVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZAorICAgICAgICAgICAgICAgICAgIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgQHJlZiBMTF9BRENfSU5KX1NldFRyaWdBdXRvKCkuICovCisKK30gTExfQURDX0lOSl9Jbml0VHlwZURlZjsKKworLyoqCisgKiBAfQorICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FeHBvcnRlZF9Db25zdGFudHMgQURDIEV4cG9ydGVkIENvbnN0YW50cworICogQHsKKyAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19GTEFHIEFEQyBmbGFncworICogQGJyaWVmICAgIEZsYWdzIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9BRENfUmVhZFJlZyBmdW5jdGlvbgorICogQHsKKyAqLworI2RlZmluZSBMTF9BRENfRkxBR19BRFJEWSBBRENfSVNSX0FEUkRZIC8qITwgQURDIGZsYWcgQURDIGluc3RhbmNlIHJlYWR5ICovCisjZGVmaW5lIExMX0FEQ19GTEFHX0VPQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBRENfSVNSX0VPQyAvKiE8IEFEQyBmbGFnIEFEQyBncm91cCByZWd1bGFyIGVuZCBvZiB1bml0YXJ5IFwKK2NvbnZlcnNpb24gKi8KKyNkZWZpbmUgTExfQURDX0ZMQUdfRU9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBRENfSVNSX0VPUyAvKiE8IEFEQyBmbGFnIEFEQyBncm91cCByZWd1bGFyIGVuZCBvZiBzZXF1ZW5jZSBcCitjb252ZXJzaW9ucyAqLworI2RlZmluZSBMTF9BRENfRkxBR19PVlIgQURDX0lTUl9PVlIgLyohPCBBREMgZmxhZyBBREMgZ3JvdXAgcmVndWxhciBvdmVycnVuICovCisjZGVmaW5lIExMX0FEQ19GTEFHX0VPU01QIFwKKyAgQURDX0lTUl9FT1NNUCAvKiE8IEFEQyBmbGFnIEFEQyBncm91cCByZWd1bGFyIGVuZCBvZiBzYW1wbGluZyBwaGFzZSAqLworI2RlZmluZSBMTF9BRENfRkxBR19KRU9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBRENfSVNSX0pFT0MgLyohPCBBREMgZmxhZyBBREMgZ3JvdXAgaW5qZWN0ZWQgZW5kIG9mIHVuaXRhcnkgXAorICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9uICovCisjZGVmaW5lIExMX0FEQ19GTEFHX0pFT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBRENfSVNSX0pFT1MgLyohPCBBREMgZmxhZyBBREMgZ3JvdXAgaW5qZWN0ZWQgZW5kIG9mIHNlcXVlbmNlIFwKKyAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbnMgKi8KKyNkZWZpbmUgTExfQURDX0ZMQUdfSlFPVkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEFEQ19JU1JfSlFPVkYgLyohPCBBREMgZmxhZyBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udGV4dHMgcXVldWUgXAorICAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3cgKi8KKyNkZWZpbmUgTExfQURDX0ZMQUdfQVdEMSBBRENfSVNSX0FXRDEgLyohPCBBREMgZmxhZyBBREMgYW5hbG9nIHdhdGNoZG9nIDEgKi8KKyNkZWZpbmUgTExfQURDX0ZMQUdfQVdEMiBBRENfSVNSX0FXRDIgLyohPCBBREMgZmxhZyBBREMgYW5hbG9nIHdhdGNoZG9nIDIgKi8KKyNkZWZpbmUgTExfQURDX0ZMQUdfQVdEMyBBRENfSVNSX0FXRDMgLyohPCBBREMgZmxhZyBBREMgYW5hbG9nIHdhdGNoZG9nIDMgKi8KKyNpZiBkZWZpbmVkKEFEQ19NVUxUSU1PREVfU1VQUE9SVCkKKyNkZWZpbmUgTExfQURDX0ZMQUdfQURSRFlfTVNUIFwKKyAgQURDX0NTUl9BRFJEWV9NU1QgLyohPCBBREMgZmxhZyBBREMgbXVsdGltb2RlIG1hc3RlciBpbnN0YW5jZSByZWFkeSAqLworI2RlZmluZSBMTF9BRENfRkxBR19BRFJEWV9TTFYgXAorICBBRENfQ1NSX0FEUkRZX1NMViAvKiE8IEFEQyBmbGFnIEFEQyBtdWx0aW1vZGUgc2xhdmUgaW5zdGFuY2UgcmVhZHkgKi8KKyNkZWZpbmUgTExfQURDX0ZMQUdfRU9DX01TVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBRENfQ1NSX0VPQ19NU1QgLyohPCBBREMgZmxhZyBBREMgbXVsdGltb2RlIG1hc3RlciBncm91cCByZWd1bGFyIGVuZCBvZiBcCisgICAgICAgICAgICAgICAgICAgICAgIHVuaXRhcnkgY29udmVyc2lvbiAqLworI2RlZmluZSBMTF9BRENfRkxBR19FT0NfU0xWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQURDX0NTUl9FT0NfU0xWIC8qITwgQURDIGZsYWcgQURDIG11bHRpbW9kZSBzbGF2ZSBncm91cCByZWd1bGFyIGVuZCBvZiBcCisgICAgICAgICAgICAgICAgICAgICAgIHVuaXRhcnkgY29udmVyc2lvbiAqLworI2RlZmluZSBMTF9BRENfRkxBR19FT1NfTVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEFEQ19DU1JfRU9TX01TVCAvKiE8IEFEQyBmbGFnIEFEQyBtdWx0aW1vZGUgbWFzdGVyIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2UgY29udmVyc2lvbnMgKi8KKyNkZWZpbmUgTExfQURDX0ZMQUdfRU9TX1NMViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEFEQ19DU1JfRU9TX1NMViAvKiE8IEFEQyBmbGFnIEFEQyBtdWx0aW1vZGUgc2xhdmUgZ3JvdXAgcmVndWxhciBlbmQgb2YgXAorICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZSBjb252ZXJzaW9ucyAqLworI2RlZmluZSBMTF9BRENfRkxBR19PVlJfTVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQURDX0NTUl9PVlJfTVNUIC8qITwgQURDIGZsYWcgQURDIG11bHRpbW9kZSBtYXN0ZXIgZ3JvdXAgcmVndWxhciBcCisgICAgICAgICAgICAgICAgICAgICAgIG92ZXJydW4gKi8KKyNkZWZpbmUgTExfQURDX0ZMQUdfT1ZSX1NMViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQURDX0NTUl9PVlJfU0xWIC8qITwgQURDIGZsYWcgQURDIG11bHRpbW9kZSBzbGF2ZSBncm91cCByZWd1bGFyIFwKKyAgICAgICAgICAgICAgICAgICAgICAgb3ZlcnJ1biAqLworI2RlZmluZSBMTF9BRENfRkxBR19FT1NNUF9NU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQURDX0NTUl9FT1NNUF9NU1QgLyohPCBBREMgZmxhZyBBREMgbXVsdGltb2RlIG1hc3RlciBncm91cCByZWd1bGFyIGVuZCBvZiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmcgcGhhc2UgKi8KKyNkZWZpbmUgTExfQURDX0ZMQUdfRU9TTVBfU0xWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQURDX0NTUl9FT1NNUF9TTFYgLyohPCBBREMgZmxhZyBBREMgbXVsdGltb2RlIHNsYXZlIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZyBwaGFzZSAqLworI2RlZmluZSBMTF9BRENfRkxBR19KRU9DX01TVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQURDX0NTUl9KRU9DX01TVCAvKiE8IEFEQyBmbGFnIEFEQyBtdWx0aW1vZGUgbWFzdGVyIGdyb3VwIGluamVjdGVkIGVuZCBvZiBcCisgICAgICAgICAgICAgICAgICAgICAgICB1bml0YXJ5IGNvbnZlcnNpb24gKi8KKyNkZWZpbmUgTExfQURDX0ZMQUdfSkVPQ19TTFYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQURDX0NTUl9KRU9DX1NMViAvKiE8IEFEQyBmbGFnIEFEQyBtdWx0aW1vZGUgc2xhdmUgZ3JvdXAgaW5qZWN0ZWQgZW5kIG9mIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRhcnkgY29udmVyc2lvbiAqLworI2RlZmluZSBMTF9BRENfRkxBR19KRU9TX01TVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQURDX0NTUl9KRU9TX01TVCAvKiE8IEFEQyBmbGFnIEFEQyBtdWx0aW1vZGUgbWFzdGVyIGdyb3VwIGluamVjdGVkIGVuZCBvZiBcCisgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZSBjb252ZXJzaW9ucyAqLworI2RlZmluZSBMTF9BRENfRkxBR19KRU9TX1NMViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBRENfQ1NSX0pFT1NfU0xWIC8qITwgQURDIGZsYWcgQURDIG11bHRpbW9kZSBzbGF2ZSBncm91cCBpbmplY3RlZCBlbmQgb2YgXAorICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2UgY29udmVyc2lvbnMgKi8KKyNkZWZpbmUgTExfQURDX0ZMQUdfSlFPVkZfTVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEFEQ19DU1JfSlFPVkZfTVNUIC8qITwgQURDIGZsYWcgQURDIG11bHRpbW9kZSBtYXN0ZXIgZ3JvdXAgaW5qZWN0ZWQgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRzIHF1ZXVlIG92ZXJmbG93ICovCisjZGVmaW5lIExMX0FEQ19GTEFHX0pRT1ZGX1NMViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEFEQ19DU1JfSlFPVkZfU0xWIC8qITwgQURDIGZsYWcgQURDIG11bHRpbW9kZSBzbGF2ZSBncm91cCBpbmplY3RlZCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dHMgcXVldWUgb3ZlcmZsb3cgKi8KKyNkZWZpbmUgTExfQURDX0ZMQUdfQVdEMV9NU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQURDX0NTUl9BV0QxX01TVCAvKiE8IEFEQyBmbGFnIEFEQyBtdWx0aW1vZGUgbWFzdGVyIGFuYWxvZyB3YXRjaGRvZyAxIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBBREMgbWFzdGVyICovCisjZGVmaW5lIExMX0FEQ19GTEFHX0FXRDFfU0xWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQURDX0NTUl9BV0QxX1NMViAvKiE8IEFEQyBmbGFnIEFEQyBtdWx0aW1vZGUgc2xhdmUgYW5hbG9nIHdhdGNoZG9nIDEgXAorICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIEFEQyBzbGF2ZSAqLworI2RlZmluZSBMTF9BRENfRkxBR19BV0QyX01TVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBRENfQ1NSX0FXRDJfTVNUIC8qITwgQURDIGZsYWcgQURDIG11bHRpbW9kZSBtYXN0ZXIgYW5hbG9nIHdhdGNoZG9nIDIgXAorICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIEFEQyBtYXN0ZXIgKi8KKyNkZWZpbmUgTExfQURDX0ZMQUdfQVdEMl9TTFYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBRENfQ1NSX0FXRDJfU0xWIC8qITwgQURDIGZsYWcgQURDIG11bHRpbW9kZSBzbGF2ZSBhbmFsb2cgd2F0Y2hkb2cgMiBcCisgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgQURDIHNsYXZlICovCisjZGVmaW5lIExMX0FEQ19GTEFHX0FXRDNfTVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEFEQ19DU1JfQVdEM19NU1QgLyohPCBBREMgZmxhZyBBREMgbXVsdGltb2RlIG1hc3RlciBhbmFsb2cgd2F0Y2hkb2cgMyBcCisgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgQURDIG1hc3RlciAqLworI2RlZmluZSBMTF9BRENfRkxBR19BV0QzX1NMViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEFEQ19DU1JfQVdEM19TTFYgLyohPCBBREMgZmxhZyBBREMgbXVsdGltb2RlIHNsYXZlIGFuYWxvZyB3YXRjaGRvZyAzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBBREMgc2xhdmUgKi8KKyNlbmRpZiAgICAgICAgICAgICAvKiBBRENfTVVMVElNT0RFX1NVUFBPUlQgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19JVCBBREMgaW50ZXJydXB0aW9ucyBmb3IgY29uZmlndXJhdGlvbiAoaW50ZXJydXB0aW9uCisgKiBlbmFibGUgb3IgZGlzYWJsZSkKKyAqIEBicmllZiAgICBJVCBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfQURDX1JlYWRSZWcgYW5kCisgKiBMTF9BRENfV3JpdGVSZWcgZnVuY3Rpb25zCisgKiBAeworICovCisjZGVmaW5lIExMX0FEQ19JVF9BRFJEWSBcCisgIEFEQ19JRVJfQURSRFlJRSAvKiE8IEFEQyBpbnRlcnJ1cHRpb24gQURDIGluc3RhbmNlIHJlYWR5ICovCisjZGVmaW5lIExMX0FEQ19JVF9FT0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQURDX0lFUl9FT0NJRSAvKiE8IEFEQyBpbnRlcnJ1cHRpb24gQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHVuaXRhcnkgXAorICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbiAqLworI2RlZmluZSBMTF9BRENfSVRfRU9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBRENfSUVSX0VPU0lFIC8qITwgQURDIGludGVycnVwdGlvbiBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2Ygc2VxdWVuY2UgXAorICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbnMgKi8KKyNkZWZpbmUgTExfQURDX0lUX09WUiBcCisgIEFEQ19JRVJfT1ZSSUUgLyohPCBBREMgaW50ZXJydXB0aW9uIEFEQyBncm91cCByZWd1bGFyIG92ZXJydW4gKi8KKyNkZWZpbmUgTExfQURDX0lUX0VPU01QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBRENfSUVSX0VPU01QSUUgLyohPCBBREMgaW50ZXJydXB0aW9uIEFEQyBncm91cCByZWd1bGFyIGVuZCBvZiBzYW1wbGluZyBcCisgICAgICAgICAgICAgICAgICAgICAgIHBoYXNlICovCisjZGVmaW5lIExMX0FEQ19JVF9KRU9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBRENfSUVSX0pFT0NJRSAvKiE8IEFEQyBpbnRlcnJ1cHRpb24gQURDIGdyb3VwIGluamVjdGVkIGVuZCBvZiB1bml0YXJ5IFwKKyAgICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9uICovCisjZGVmaW5lIExMX0FEQ19JVF9KRU9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQURDX0lFUl9KRU9TSUUgLyohPCBBREMgaW50ZXJydXB0aW9uIEFEQyBncm91cCBpbmplY3RlZCBlbmQgb2Ygc2VxdWVuY2UgXAorICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb25zICovCisjZGVmaW5lIExMX0FEQ19JVF9KUU9WRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQURDX0lFUl9KUU9WRklFIC8qITwgQURDIGludGVycnVwdGlvbiBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udGV4dHMgcXVldWUgXAorICAgICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdyAqLworI2RlZmluZSBMTF9BRENfSVRfQVdEMSBcCisgIEFEQ19JRVJfQVdEMUlFIC8qITwgQURDIGludGVycnVwdGlvbiBBREMgYW5hbG9nIHdhdGNoZG9nIDEgKi8KKyNkZWZpbmUgTExfQURDX0lUX0FXRDIgXAorICBBRENfSUVSX0FXRDJJRSAvKiE8IEFEQyBpbnRlcnJ1cHRpb24gQURDIGFuYWxvZyB3YXRjaGRvZyAyICovCisjZGVmaW5lIExMX0FEQ19JVF9BV0QzIFwKKyAgQURDX0lFUl9BV0QzSUUgLyohPCBBREMgaW50ZXJydXB0aW9uIEFEQyBhbmFsb2cgd2F0Y2hkb2cgMyAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX1JFR0lTVEVSUyAgQURDIHJlZ2lzdGVycyBjb21wbGlhbnQgd2l0aCBzcGVjaWZpYyBwdXJwb3NlCisgKiBAeworICovCisvKiBMaXN0IG9mIEFEQyByZWdpc3RlcnMgaW50ZW5kZWQgdG8gYmUgdXNlZCAobW9zdCBjb21tb25seSkgd2l0aCAgICAgICAgICAgICAqLworLyogRE1BIHRyYW5zZmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJlZmVyIHRvIGZ1bmN0aW9uIEByZWYgTExfQURDX0RNQV9HZXRSZWdBZGRyKCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0FEQ19ETUFfUkVHX1JFR1VMQVJfREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKDB4MDAwMDAwMDBVTCkgLyogQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBkYXRhIHJlZ2lzdGVyICAgICAgICAgICAgICAgXAorKGNvcnJlc3BvbmRpbmcgdG8gcmVnaXN0ZXIgRFIpIHRvIGJlIHVzZWQgd2l0aCBBREMgY29uZmlndXJlZCBpbiBpbmRlcGVuZGVudCBcCittb2RlLiBXaXRob3V0IERNQSB0cmFuc2ZlciwgcmVnaXN0ZXIgYWNjZXNzZWQgYnkgTEwgZnVuY3Rpb24gICAgICAgICAgICAgICAgIFwKK0ByZWYgTExfQURDX1JFR19SZWFkQ29udmVyc2lvbkRhdGEzMigpIGFuZCBvdGhlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZnVuY3Rpb25zIEByZWYgTExfQURDX1JFR19SZWFkQ29udmVyc2lvbkRhdGF4KCkgKi8KKyNpZiBkZWZpbmVkKEFEQ19NVUxUSU1PREVfU1VQUE9SVCkKKyNkZWZpbmUgTExfQURDX0RNQV9SRUdfUkVHVUxBUl9EQVRBX01VTFRJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgweDAwMDAwMDAxVUwpIC8qIEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gZGF0YSByZWdpc3RlciAgICAgICAgICAgICAgXAorKGNvcnJlc3BvbmRpbmcgdG8gcmVnaXN0ZXIgQ0RSKSB0byBiZSB1c2VkIHdpdGggQURDIGNvbmZpZ3VyZWQgaW4gbXVsdGltb2RlIFwKKyhhdmFpbGFibGUgb24gU1RNMzIgZGV2aWNlcyB3aXRoIHNldmVyYWwgQURDIGluc3RhbmNlcykuICAgICAgICAgICAgICAgICAgICBcCitXaXRob3V0IERNQSB0cmFuc2ZlciwgcmVnaXN0ZXIgYWNjZXNzZWQgYnkgTEwgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAgXAorQHJlZiBMTF9BRENfUkVHX1JlYWRNdWx0aUNvbnZlcnNpb25EYXRhMzIoKSAqLworI2VuZGlmICAgICAgICAgICAvKiBBRENfTVVMVElNT0RFX1NVUFBPUlQgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19DT01NT05fQ0xPQ0tfU09VUkNFICBBREMgY29tbW9uIC0gQ2xvY2sgc291cmNlCisgKiBAeworICovCisjZGVmaW5lIExMX0FEQ19DTE9DS19TWU5DX1BDTEtfRElWMSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0NDUl9DS01PREVfMCkgLyohPCBBREMgc3luY2hyb25vdXMgY2xvY2sgZGVyaXZlZCBmcm9tIFwKK0FIQiBjbG9jayB3aXRob3V0IHByZXNjYWxlciAqLworI2RlZmluZSBMTF9BRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19DQ1JfQ0tNT0RFXzEpIC8qITwgQURDIHN5bmNocm9ub3VzIGNsb2NrIGRlcml2ZWQgZnJvbSBcCitBSEIgY2xvY2sgd2l0aCBwcmVzY2FsZXIgZGl2aXNpb24gYnkgMiAqLworI2RlZmluZSBMTF9BRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0NDUl9DS01PREVfMSB8IEFEQ19DQ1JfQ0tNT0RFXzApIC8qITwgQURDIHN5bmNocm9ub3VzIGNsb2NrIGRlcml2ZWQgXAorICBmcm9tIEFIQiBjbG9jayB3aXRoIHByZXNjYWxlciBkaXZpc2lvbiBieSA0ICovCisjZGVmaW5lIExMX0FEQ19DTE9DS19BU1lOQ19ESVYxICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKDB4MDAwMDAwMDBVTCkgLyohPCBBREMgYXN5bmNocm9ub3VzIGNsb2NrIHdpdGhvdXQgXAorcHJlc2NhbGVyICovCisjZGVmaW5lIExMX0FEQ19DTE9DS19BU1lOQ19ESVYyICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19DQ1JfUFJFU0NfMCkgLyohPCBBREMgYXN5bmNocm9ub3VzIGNsb2NrIHdpdGggXAorcHJlc2NhbGVyIGRpdmlzaW9uIGJ5IDIgKi8KKyNkZWZpbmUgTExfQURDX0NMT0NLX0FTWU5DX0RJVjQgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0NDUl9QUkVTQ18xKSAvKiE8IEFEQyBhc3luY2hyb25vdXMgY2xvY2sgd2l0aCBcCitwcmVzY2FsZXIgZGl2aXNpb24gYnkgNCAqLworI2RlZmluZSBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfQ0NSX1BSRVNDXzEgfCBBRENfQ0NSX1BSRVNDXzApIC8qITwgQURDIGFzeW5jaHJvbm91cyBjbG9jayB3aXRoIFwKKyAgcHJlc2NhbGVyIGRpdmlzaW9uIGJ5IDYgKi8KKyNkZWZpbmUgTExfQURDX0NMT0NLX0FTWU5DX0RJVjggICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0NDUl9QUkVTQ18yKSAvKiE8IEFEQyBhc3luY2hyb25vdXMgY2xvY2sgd2l0aCBcCitwcmVzY2FsZXIgZGl2aXNpb24gYnkgOCAqLworI2RlZmluZSBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfQ0NSX1BSRVNDXzIgfCBBRENfQ0NSX1BSRVNDXzApIC8qITwgQURDIGFzeW5jaHJvbm91cyBjbG9jayB3aXRoIFwKKyAgcHJlc2NhbGVyIGRpdmlzaW9uIGJ5IDEwICovCisjZGVmaW5lIExMX0FEQ19DTE9DS19BU1lOQ19ESVYxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19DQ1JfUFJFU0NfMiB8IEFEQ19DQ1JfUFJFU0NfMSkgLyohPCBBREMgYXN5bmNocm9ub3VzIGNsb2NrIHdpdGggXAorICBwcmVzY2FsZXIgZGl2aXNpb24gYnkgMTIgKi8KKyNkZWZpbmUgTExfQURDX0NMT0NLX0FTWU5DX0RJVjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19DQ1JfUFJFU0NfMiB8IEFEQ19DQ1JfUFJFU0NfMSB8IEFEQ19DQ1JfUFJFU0NfMCkgLyohPCBBREMgYXN5bmNocm9ub3VzIFwKKyAgICAgICAgICAgICAgICAgICBjbG9jayB3aXRoIHByZXNjYWxlciBkaXZpc2lvbiBieSAxNiAgKi8KKyNkZWZpbmUgTExfQURDX0NMT0NLX0FTWU5DX0RJVjMyICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0NDUl9QUkVTQ18zKSAvKiE8IEFEQyBhc3luY2hyb25vdXMgY2xvY2sgd2l0aCBcCitwcmVzY2FsZXIgZGl2aXNpb24gYnkgMzIgKi8KKyNkZWZpbmUgTExfQURDX0NMT0NLX0FTWU5DX0RJVjY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0NDUl9QUkVTQ18zIHwgQURDX0NDUl9QUkVTQ18wKSAvKiE8IEFEQyBhc3luY2hyb25vdXMgY2xvY2sgd2l0aCBcCisgIHByZXNjYWxlciBkaXZpc2lvbiBieSA2NCAqLworI2RlZmluZSBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMTI4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfQ0NSX1BSRVNDXzMgfCBBRENfQ0NSX1BSRVNDXzEpIC8qITwgQURDIGFzeW5jaHJvbm91cyBjbG9jayB3aXRoIFwKKyAgcHJlc2NhbGVyIGRpdmlzaW9uIGJ5IDEyOCAqLworI2RlZmluZSBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMjU2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0NDUl9QUkVTQ18zIHwgQURDX0NDUl9QUkVTQ18xIHwgQURDX0NDUl9QUkVTQ18wKSAvKiE8IEFEQyBhc3luY2hyb25vdXMgXAorICAgICAgICAgICAgICAgICAgIGNsb2NrIHdpdGggcHJlc2NhbGVyIGRpdmlzaW9uIGJ5IDI1NiAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX0NPTU1PTl9QQVRIX0lOVEVSTkFMICBBREMgY29tbW9uIC0gTWVhc3VyZW1lbnQgcGF0aCB0bworICogaW50ZXJuYWwgY2hhbm5lbHMKKyAqIEB7CisgKi8KKy8qIE5vdGU6IE90aGVyIG1lYXN1cmVtZW50IHBhdGhzIHRvIGludGVybmFsIGNoYW5uZWxzIG1heSBiZSBhdmFpbGFibGUgICAgICAgICovCisvKiAgICAgICAoY29ubmVjdGlvbnMgdG8gb3RoZXIgcGVyaXBoZXJhbHMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgSWYgdGhleSBhcmUgbm90IGxpc3RlZCBiZWxvdywgdGhleSBkbyBub3QgcmVxdWlyZSBhbnkgc3BlY2lmaWMgICAgICAgKi8KKy8qICAgICAgIHBhdGggZW5hYmxlLiBJbiB0aGlzIGNhc2UsIEFjY2VzcyB0byBtZWFzdXJlbWVudCBwYXRoIGlzIGRvbmUgICAgICAgICovCisvKiAgICAgICBvbmx5IGJ5IHNlbGVjdGluZyB0aGUgY29ycmVzcG9uZGluZyBBREMgaW50ZXJuYWwgY2hhbm5lbC4gICAgICAgICAgICAqLworI2RlZmluZSBMTF9BRENfUEFUSF9JTlRFUk5BTF9OT05FIFwKKyAgKDB4MDAwMDAwMDBVTCkgLyohPCBBREMgbWVhc3VyZW1lbnQgcGF0aHMgYWxsIGRpc2FibGVkICovCisjZGVmaW5lIExMX0FEQ19QQVRIX0lOVEVSTkFMX1ZSRUZJTlQgXAorICAoQURDX0NDUl9WUkVGRU4pIC8qITwgQURDIG1lYXN1cmVtZW50IHBhdGggdG8gaW50ZXJuYWwgY2hhbm5lbCBWcmVmSW50ICovCisjZGVmaW5lIExMX0FEQ19QQVRIX0lOVEVSTkFMX1RFTVBTRU5TT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19DQ1JfVlNFTlNFU0VMKSAvKiE8IEFEQyBtZWFzdXJlbWVudCBwYXRoIHRvIGludGVybmFsIGNoYW5uZWwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGVyYXR1cmUgc2Vuc29yICovCisjZGVmaW5lIExMX0FEQ19QQVRIX0lOVEVSTkFMX1ZCQVQgXAorICAoQURDX0NDUl9WQkFUU0VMKSAvKiE8IEFEQyBtZWFzdXJlbWVudCBwYXRoIHRvIGludGVybmFsIGNoYW5uZWwgVmJhdCAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX1JFU09MVVRJT04gIEFEQyBpbnN0YW5jZSAtIFJlc29sdXRpb24KKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfQURDX1JFU09MVVRJT05fMTJCICgweDAwMDAwMDAwVUwpICAgLyohPCBBREMgcmVzb2x1dGlvbiAxMiBiaXRzICovCisjZGVmaW5lIExMX0FEQ19SRVNPTFVUSU9OXzEwQiAoQURDX0NGR1JfUkVTXzApIC8qITwgQURDIHJlc29sdXRpb24gMTAgYml0cyAqLworI2RlZmluZSBMTF9BRENfUkVTT0xVVElPTl84QiAoQURDX0NGR1JfUkVTXzEpICAvKiE8IEFEQyByZXNvbHV0aW9uICA4IGJpdHMgKi8KKyNkZWZpbmUgTExfQURDX1JFU09MVVRJT05fNkIgXAorICAoQURDX0NGR1JfUkVTXzEgfCBBRENfQ0ZHUl9SRVNfMCkgLyohPCBBREMgcmVzb2x1dGlvbiAgNiBiaXRzICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfREFUQV9BTElHTiAgQURDIGluc3RhbmNlIC0gRGF0YSBhbGlnbm1lbnQKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfQURDX0RBVEFfQUxJR05fUklHSFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgweDAwMDAwMDAwVUwpIC8qITwgQURDIGNvbnZlcnNpb24gZGF0YSBhbGlnbm1lbnQ6IHJpZ2h0IGFsaWduZWQgXAorKGFsaWdubWVudCBvbiBkYXRhIHJlZ2lzdGVyIExTQiBiaXQgMCkqLworI2RlZmluZSBMTF9BRENfREFUQV9BTElHTl9MRUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfQ0ZHUl9BTElHTikgLyohPCBBREMgY29udmVyc2lvbiBkYXRhIGFsaWdubWVudDogbGVmdCBhbGlnbmVkIFwKKyhhbGlnbm1lbnQgb24gZGF0YSByZWdpc3RlciBNU0IgYml0IDE1KSovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfTFBfTU9ERSAgQURDIGluc3RhbmNlIC0gTG93IHBvd2VyIG1vZGUKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfQURDX0xQX01PREVfTk9ORSBcCisgICgweDAwMDAwMDAwVUwpIC8qITwgTm8gQURDIGxvdyBwb3dlciBtb2RlIGFjdGl2YXRlZCAqLworI2RlZmluZSBMTF9BRENfTFBfQVVUT1dBSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfQ0ZHUl9BVVRETFkpIC8qITwgQURDIGxvdyBwb3dlciBtb2RlIGF1dG8gZGVsYXk6IER5bmFtaWMgbG93IHBvd2VyIFwKKyBtb2RlLCBBREMgY29udmVyc2lvbnMgYXJlIHBlcmZvcm1lZCBvbmx5IHdoZW4gbmVjZXNzYXJ5ICAgICAgICAgICAgICAgICAgXAorICh3aGVuIHByZXZpb3VzIEFEQyBjb252ZXJzaW9uIGRhdGEgaXMgcmVhZCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgU2VlIGRlc2NyaXB0aW9uIHdpdGggZnVuY3Rpb24gQHJlZiBMTF9BRENfU2V0TG93UG93ZXJNb2RlKCkuICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfT0ZGU0VUX05CICBBREMgaW5zdGFuY2UgLSBPZmZzZXQgaW5zdGFuY2UKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfQURDX09GRlNFVF8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQURDX09GUjFfUkVHT0ZGU0VUIC8qITwgQURDIG9mZnNldCBpbnN0YW5jZSAxOiBBREMgY2hhbm5lbCBhbmQgb2Zmc2V0IGxldmVsIFwKKyAgdG8gd2hpY2ggdGhlIG9mZnNldCBwcm9ncmFtbWVkIHdpbGwgYmUgYXBwbGllZCAoaW5kZXBlbmRlbnRseSBvZiBjaGFubmVsICAgIFwKKyAgbWFwcGVkIG9uIEFEQyBncm91cCByZWd1bGFyIG9yIGluamVjdGVkKSAqLworI2RlZmluZSBMTF9BRENfT0ZGU0VUXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBRENfT0ZSMl9SRUdPRkZTRVQgLyohPCBBREMgb2Zmc2V0IGluc3RhbmNlIDI6IEFEQyBjaGFubmVsIGFuZCBvZmZzZXQgbGV2ZWwgXAorICB0byB3aGljaCB0aGUgb2Zmc2V0IHByb2dyYW1tZWQgd2lsbCBiZSBhcHBsaWVkIChpbmRlcGVuZGVudGx5IG9mIGNoYW5uZWwgICAgXAorICBtYXBwZWQgb24gQURDIGdyb3VwIHJlZ3VsYXIgb3IgaW5qZWN0ZWQpICovCisjZGVmaW5lIExMX0FEQ19PRkZTRVRfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEFEQ19PRlIzX1JFR09GRlNFVCAvKiE8IEFEQyBvZmZzZXQgaW5zdGFuY2UgMzogQURDIGNoYW5uZWwgYW5kIG9mZnNldCBsZXZlbCBcCisgIHRvIHdoaWNoIHRoZSBvZmZzZXQgcHJvZ3JhbW1lZCB3aWxsIGJlIGFwcGxpZWQgKGluZGVwZW5kZW50bHkgb2YgY2hhbm5lbCAgICBcCisgIG1hcHBlZCBvbiBBREMgZ3JvdXAgcmVndWxhciBvciBpbmplY3RlZCkgKi8KKyNkZWZpbmUgTExfQURDX09GRlNFVF80ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQURDX09GUjRfUkVHT0ZGU0VUIC8qITwgQURDIG9mZnNldCBpbnN0YW5jZSA0OiBBREMgY2hhbm5lbCBhbmQgb2Zmc2V0IGxldmVsIFwKKyAgdG8gd2hpY2ggdGhlIG9mZnNldCBwcm9ncmFtbWVkIHdpbGwgYmUgYXBwbGllZCAoaW5kZXBlbmRlbnRseSBvZiBjaGFubmVsICAgIFwKKyAgbWFwcGVkIG9uIEFEQyBncm91cCByZWd1bGFyIG9yIGluamVjdGVkKSAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX09GRlNFVF9TVEFURSBBREMgaW5zdGFuY2UgLSBPZmZzZXQgc3RhdGUKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfQURDX09GRlNFVF9ESVNBQkxFICAgICAgICAgICAgIFwKKyAgKDB4MDAwMDAwMDBVTCkgLyohPCBBREMgb2Zmc2V0IGRpc2FibGVkIFwKKyhzZXR0aW5nIG9mZnNldCBpbnN0YW5jZSB3aXNlKSAqLworI2RlZmluZSBMTF9BRENfT0ZGU0VUX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX09GUjFfT0ZGU0VUMV9FTikgLyohPCBBREMgb2Zmc2V0IGVuYWJsZWQgXAorIChzZXR0aW5nIG9mZnNldCBpbnN0YW5jZSB3aXNlKSAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX09GRlNFVF9TSUdOIEFEQyBpbnN0YW5jZSAtIE9mZnNldCBzaWduCisgKiBAeworICovCisjZGVmaW5lIExMX0FEQ19PRkZTRVRfU0lHTl9ORUdBVElWRSBcCisgICgweDAwMDAwMDAwVUwpIC8qITwgQURDIG9mZnNldCBpcyBuZWdhdGl2ZSAqLworI2RlZmluZSBMTF9BRENfT0ZGU0VUX1NJR05fUE9TSVRJVkUgXAorICAoQURDX09GUjFfT0ZGU0VUUE9TKSAvKiE8IEFEQyBvZmZzZXQgaXMgcG9zaXRpdmUgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19PRkZTRVRfU0FUVVJBVElPTiBBREMgaW5zdGFuY2UgLSBPZmZzZXQgc2F0dXJhdGlvbiBtb2RlCisgKiBAeworICovCisjZGVmaW5lIExMX0FEQ19PRkZTRVRfU0FUVVJBVElPTl9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoMHgwMDAwMDAwMFVMKSAvKiE8IEFEQyBvZmZzZXQgc2F0dXJhdGlvbiBpcyBkaXNhYmxlZCAoYW1vbmcgQURDIFwKK3NlbGVjdGVkIG9mZnNldCBpbnN0YW5jZSAxLCAyLCAzIG9yIDQpICovCisjZGVmaW5lIExMX0FEQ19PRkZTRVRfU0FUVVJBVElPTl9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19PRlIxX1NBVEVOKSAvKiE8IEFEQyBvZmZzZXQgc2F0dXJhdGlvbiBpcyBlbmFibGVkIChhbW9uZyBBREMgXAorc2VsZWN0ZWQgb2Zmc2V0IGluc3RhbmNlIDEsIDIsIDMgb3IgNCkgKi8KKy8qKgorICogQH0KKyAqLworLyoqIEBkZWZncm91cCBBRENfTExfRUNfR1JPVVBTICBBREMgaW5zdGFuY2UgLSBHcm91cHMKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfQURDX0dST1VQX1JFR1VMQVIgXAorICAoMHgwMDAwMDAwMVVMKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIChhdmFpbGFibGUgb24gYWxsIFNUTTMyIGRldmljZXMpICovCisjZGVmaW5lIExMX0FEQ19HUk9VUF9JTkpFQ1RFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgweDAwMDAwMDAyVUwpIC8qITwgQURDIGdyb3VwIGluamVjdGVkIChub3QgYXZhaWxhYmxlIG9uIGFsbCBTVE0zMiBcCitkZXZpY2VzKSovCisjZGVmaW5lIExMX0FEQ19HUk9VUF9SRUdVTEFSX0lOSkVDVEVEIFwKKyAgKDB4MDAwMDAwMDNVTCkgLyohPCBBREMgYm90aCBncm91cHMgcmVndWxhciBhbmQgaW5qZWN0ZWQgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19DSEFOTkVMICBBREMgaW5zdGFuY2UgLSBDaGFubmVsIG51bWJlcgorICogQHsKKyAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF8wICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19DSEFOTkVMXzBfTlVNQkVSIHwgQURDX0NIQU5ORUxfMF9TTVAgfCBcCisgICBBRENfQ0hBTk5FTF8wX0JJVEZJRUxEKSAvKiE8IEFEQyBjaGFubmVsIEFEQ3hfSU4wICovCisjZGVmaW5lIExMX0FEQ19DSEFOTkVMXzEgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0NIQU5ORUxfMV9OVU1CRVIgfCBBRENfQ0hBTk5FTF8xX1NNUCB8IFwKKyAgIEFEQ19DSEFOTkVMXzFfQklURklFTEQpIC8qITwgQURDIGNoYW5uZWwgQURDeF9JTjEgKi8KKyNkZWZpbmUgTExfQURDX0NIQU5ORUxfMiAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfQ0hBTk5FTF8yX05VTUJFUiB8IEFEQ19DSEFOTkVMXzJfU01QIHwgXAorICAgQURDX0NIQU5ORUxfMl9CSVRGSUVMRCkgLyohPCBBREMgY2hhbm5lbCBBREN4X0lOMiAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF8zICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19DSEFOTkVMXzNfTlVNQkVSIHwgQURDX0NIQU5ORUxfM19TTVAgfCBcCisgICBBRENfQ0hBTk5FTF8zX0JJVEZJRUxEKSAvKiE8IEFEQyBjaGFubmVsIEFEQ3hfSU4zICovCisjZGVmaW5lIExMX0FEQ19DSEFOTkVMXzQgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0NIQU5ORUxfNF9OVU1CRVIgfCBBRENfQ0hBTk5FTF80X1NNUCB8IFwKKyAgIEFEQ19DSEFOTkVMXzRfQklURklFTEQpIC8qITwgQURDIGNoYW5uZWwgQURDeF9JTjQgKi8KKyNkZWZpbmUgTExfQURDX0NIQU5ORUxfNSAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfQ0hBTk5FTF81X05VTUJFUiB8IEFEQ19DSEFOTkVMXzVfU01QIHwgXAorICAgQURDX0NIQU5ORUxfNV9CSVRGSUVMRCkgLyohPCBBREMgY2hhbm5lbCBBREN4X0lONSAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF82ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19DSEFOTkVMXzZfTlVNQkVSIHwgQURDX0NIQU5ORUxfNl9TTVAgfCBcCisgICBBRENfQ0hBTk5FTF82X0JJVEZJRUxEKSAvKiE8IEFEQyBjaGFubmVsIEFEQ3hfSU42ICovCisjZGVmaW5lIExMX0FEQ19DSEFOTkVMXzcgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0NIQU5ORUxfN19OVU1CRVIgfCBBRENfQ0hBTk5FTF83X1NNUCB8IFwKKyAgIEFEQ19DSEFOTkVMXzdfQklURklFTEQpIC8qITwgQURDIGNoYW5uZWwgQURDeF9JTjcgKi8KKyNkZWZpbmUgTExfQURDX0NIQU5ORUxfOCAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfQ0hBTk5FTF84X05VTUJFUiB8IEFEQ19DSEFOTkVMXzhfU01QIHwgXAorICAgQURDX0NIQU5ORUxfOF9CSVRGSUVMRCkgLyohPCBBREMgY2hhbm5lbCBBREN4X0lOOCAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF85ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19DSEFOTkVMXzlfTlVNQkVSIHwgQURDX0NIQU5ORUxfOV9TTVAgfCBcCisgICBBRENfQ0hBTk5FTF85X0JJVEZJRUxEKSAvKiE8IEFEQyBjaGFubmVsIEFEQ3hfSU45ICovCisjZGVmaW5lIExMX0FEQ19DSEFOTkVMXzEwICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfQ0hBTk5FTF8xMF9OVU1CRVIgfCBBRENfQ0hBTk5FTF8xMF9TTVAgfCBcCisgICBBRENfQ0hBTk5FTF8xMF9CSVRGSUVMRCkgLyohPCBBREMgY2hhbm5lbCBBREN4X0lOMTAgKi8KKyNkZWZpbmUgTExfQURDX0NIQU5ORUxfMTEgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19DSEFOTkVMXzExX05VTUJFUiB8IEFEQ19DSEFOTkVMXzExX1NNUCB8IFwKKyAgIEFEQ19DSEFOTkVMXzExX0JJVEZJRUxEKSAvKiE8IEFEQyBjaGFubmVsIEFEQ3hfSU4xMSAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF8xMiAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0NIQU5ORUxfMTJfTlVNQkVSIHwgQURDX0NIQU5ORUxfMTJfU01QIHwgXAorICAgQURDX0NIQU5ORUxfMTJfQklURklFTEQpIC8qITwgQURDIGNoYW5uZWwgQURDeF9JTjEyICovCisjZGVmaW5lIExMX0FEQ19DSEFOTkVMXzEzICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfQ0hBTk5FTF8xM19OVU1CRVIgfCBBRENfQ0hBTk5FTF8xM19TTVAgfCBcCisgICBBRENfQ0hBTk5FTF8xM19CSVRGSUVMRCkgLyohPCBBREMgY2hhbm5lbCBBREN4X0lOMTMgKi8KKyNkZWZpbmUgTExfQURDX0NIQU5ORUxfMTQgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19DSEFOTkVMXzE0X05VTUJFUiB8IEFEQ19DSEFOTkVMXzE0X1NNUCB8IFwKKyAgIEFEQ19DSEFOTkVMXzE0X0JJVEZJRUxEKSAvKiE8IEFEQyBjaGFubmVsIEFEQ3hfSU4xNCAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF8xNSAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0NIQU5ORUxfMTVfTlVNQkVSIHwgQURDX0NIQU5ORUxfMTVfU01QIHwgXAorICAgQURDX0NIQU5ORUxfMTVfQklURklFTEQpIC8qITwgQURDIGNoYW5uZWwgQURDeF9JTjE1ICovCisjZGVmaW5lIExMX0FEQ19DSEFOTkVMXzE2ICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfQ0hBTk5FTF8xNl9OVU1CRVIgfCBBRENfQ0hBTk5FTF8xNl9TTVAgfCBcCisgICBBRENfQ0hBTk5FTF8xNl9CSVRGSUVMRCkgLyohPCBBREMgY2hhbm5lbCBBREN4X0lOMTYgKi8KKyNkZWZpbmUgTExfQURDX0NIQU5ORUxfMTcgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19DSEFOTkVMXzE3X05VTUJFUiB8IEFEQ19DSEFOTkVMXzE3X1NNUCB8IFwKKyAgIEFEQ19DSEFOTkVMXzE3X0JJVEZJRUxEKSAvKiE8IEFEQyBjaGFubmVsIEFEQ3hfSU4xNyAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF8xOCAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0NIQU5ORUxfMThfTlVNQkVSIHwgQURDX0NIQU5ORUxfMThfU01QIHwgXAorICAgQURDX0NIQU5ORUxfMThfQklURklFTEQpIC8qITwgQURDIGNoYW5uZWwgQURDeF9JTjE4ICovCisjZGVmaW5lIExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKExMX0FEQ19DSEFOTkVMXzE4IHwgQURDX0NIQU5ORUxfSURfSU5URVJOQUxfQ0gpIC8qITwgQURDIGludGVybmFsIGNoYW5uZWwgXAorICBjb25uZWN0ZWQgdG8gVnJlZkludDogSW50ZXJuYWwgdm9sdGFnZSByZWZlcmVuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBBREMgY2hhbm5lbCBhdmFpbGFibGUgb24gYWxsIGluc3RhbmNlcyBidXQgQURDMi4gKi8KKyNkZWZpbmUgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUl9BREMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX0NIQU5ORUxfMTYgfCBBRENfQ0hBTk5FTF9JRF9JTlRFUk5BTF9DSCkgLyohPCBBREMgaW50ZXJuYWwgY2hhbm5lbCBcCisgIGNvbm5lY3RlZCB0byBpbnRlcm5hbCB0ZW1wZXJhdHVyZSBzZW5zb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIEFEQyBjaGFubmVsIGF2YWlsYWJsZSBvbmx5IG9uIEFEQzEgaW5zdGFuY2UuICovCisjZGVmaW5lIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1JfQURDNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX0NIQU5ORUxfNCB8IEFEQ19DSEFOTkVMX0lEX0lOVEVSTkFMX0NIKSAvKiE8IEFEQyBpbnRlcm5hbCBjaGFubmVsIFwKKyBjb25uZWN0ZWQgdG8gaW50ZXJuYWwgdGVtcGVyYXR1cmUgc2Vuc29yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgT24gdGhpcyBTVE0zMiBzZXJpZXMsIEFEQyBjaGFubmVsIGF2YWlsYWJsZSBvbmx5IG9uIEFEQzUgaW5zdGFuY2UuICAgICAgICAgXAorIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIEFEQzUgYXZhaWxhYmlsaXR5ICovCisjZGVmaW5lIExMX0FEQ19DSEFOTkVMX1ZCQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX0NIQU5ORUxfMTcgfCBBRENfQ0hBTk5FTF9JRF9JTlRFUk5BTF9DSCkgLyohPCBBREMgaW50ZXJuYWwgY2hhbm5lbCAgIFwKKyAgY29ubmVjdGVkIHRvIFZiYXQvMzogVmJhdCB2b2x0YWdlIHRocm91Z2ggYSBkaXZpZGVyIGxhZGRlciBvZiBmYWN0b3IgMS8zICAgICBcCisgIHRvIGhhdmUgY2hhbm5lbCB2b2x0YWdlIGFsd2F5cyBiZWxvdyBWZGRhLiBPbiB0aGlzIFNUTTMyIHNlcmllcywgQURDIGNoYW5uZWwgXAorICBhdmFpbGFibGUgb24gYWxsIEFEQyBpbnN0YW5jZXMgYnV0IEFEQzIgJiBBREM0LiBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0ICAgIFwKKyAgZm9yIEFEQzQgYXZhaWxhYmlsaXR5ICovCisjZGVmaW5lIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKExMX0FEQ19DSEFOTkVMXzEzIHwgQURDX0NIQU5ORUxfSURfSU5URVJOQUxfQ0gpIC8qITwgQURDIGludGVybmFsIGNoYW5uZWwgXAorICBjb25uZWN0ZWQgdG8gT1BBTVAxIG91dHB1dC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBBREMgY2hhbm5lbCBhdmFpbGFibGUgb25seSBvbiBBREMxIGluc3RhbmNlLiAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF9WT1BBTVAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKExMX0FEQ19DSEFOTkVMXzE2IHwgQURDX0NIQU5ORUxfSURfSU5URVJOQUxfQ0ggfCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBBRENfQ0hBTk5FTF9JRF9JTlRFUk5BTF9DSF8yKSAvKiE8IEFEQyBpbnRlcm5hbCBjaGFubmVsIGNvbm5lY3RlZCB0byBPUEFNUDIgXAorICAgb3V0cHV0LiBPbiB0aGlzIFNUTTMyIHNlcmllcywgQURDIGNoYW5uZWwgYXZhaWxhYmxlIG9ubHkgb24gQURDMiBpbnN0YW5jZS4gIFwKKyAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF9WT1BBTVAzX0FEQzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKExMX0FEQ19DSEFOTkVMXzE4IHwgQURDX0NIQU5ORUxfSURfSU5URVJOQUxfQ0ggfCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBBRENfQ0hBTk5FTF9JRF9JTlRFUk5BTF9DSF8yKSAvKiE8IEFEQyBpbnRlcm5hbCBjaGFubmVsIGNvbm5lY3RlZCB0byBPUEFNUDMgXAorICAgb3V0cHV0LiBPbiB0aGlzIFNUTTMyIHNlcmllcywgQURDIGNoYW5uZWwgYXZhaWxhYmxlIG9ubHkgb24gQURDMiBpbnN0YW5jZS4gIFwKKyAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF9WT1BBTVAzX0FEQzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKExMX0FEQ19DSEFOTkVMXzEzIHwgQURDX0NIQU5ORUxfSURfSU5URVJOQUxfQ0ggfCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBBRENfQ0hBTk5FTF9JRF9JTlRFUk5BTF9DSF8yKSAvKiE8IEFEQyBpbnRlcm5hbCBjaGFubmVsIGNvbm5lY3RlZCB0byBPUEFNUDMgXAorICAgb3V0cHV0LiBPbiB0aGlzIFNUTTMyIHNlcmllcywgQURDIGNoYW5uZWwgYXZhaWxhYmxlIG9ubHkgb24gQURDMyBpbnN0YW5jZS4gIFwKKyAgIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIEFEQzMgYXZhaWxhYmlsaXR5ICovCisjZGVmaW5lIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKExMX0FEQ19DSEFOTkVMXzUgfCBBRENfQ0hBTk5FTF9JRF9JTlRFUk5BTF9DSCkgLyohPCBBREMgaW50ZXJuYWwgY2hhbm5lbCAgXAorY29ubmVjdGVkIHRvIE9QQU1QNCBvdXRwdXQuIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBBREMgY2hhbm5lbCBhdmFpbGFibGUgb25seSBcCitvbiBBREM1IGluc3RhbmNlLiBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBBREM1ICYgT1BBTVA0IGF2YWlsYWJpbGl0eSAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF9WT1BBTVA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChMTF9BRENfQ0hBTk5FTF8zIHwgQURDX0NIQU5ORUxfSURfSU5URVJOQUxfQ0gpIC8qITwgQURDIGludGVybmFsIGNoYW5uZWwgIFwKK2Nvbm5lY3RlZCB0byBPUEFNUDUgb3V0cHV0LiBPbiB0aGlzIFNUTTMyIHNlcmllcywgQURDIGNoYW5uZWwgYXZhaWxhYmxlIG9ubHkgXAorb24gQURDNSBpbnN0YW5jZS4gUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgQURDNSAmIE9QQU1QNSBhdmFpbGFiaWxpdHkgKi8KKyNkZWZpbmUgTExfQURDX0NIQU5ORUxfVk9QQU1QNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChMTF9BRENfQ0hBTk5FTF8xNyB8IEFEQ19DSEFOTkVMX0lEX0lOVEVSTkFMX0NIIHwgICAgICAgICAgICAgICAgXAorICAgQURDX0NIQU5ORUxfSURfSU5URVJOQUxfQ0hfMikgLyohPCBBREMgaW50ZXJuYWwgY2hhbm5lbCAgICAgICAgIFwKK2Nvbm5lY3RlZCB0byBPUEFNUDYgb3V0cHV0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitPbiB0aGlzIFNUTTMyIHNlcmllcywgQURDIGNoYW5uZWwgYXZhaWxhYmxlIG9ubHkgb24gQURDNCBpbnN0YW5jZS4gXAorUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgQURDNCAmIE9QQU1QNiBhdmFpbGFiaWxpdHkgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19SRUdfVFJJR0dFUl9TT1VSQ0UgIEFEQyBncm91cCByZWd1bGFyIC0gVHJpZ2dlciBzb3VyY2UKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX1NPRlRXQVJFICAgICAgICBcCisgICgweDAwMDAwMDAwVUwpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgXAorY29udmVyc2lvbiB0cmlnZ2VyIGludGVybmFsOiBTVyBzdGFydC4gKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU0xX1RSR08gICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19DRkdSX0VYVFNFTF8zIHwgQURDX0NGR1JfRVhUU0VMXzAgfCAgICAgICAgICAgICAgIFwKKyAgIEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIFwKK2NvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTEgVFJHTy4gIFwKK1RyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9UUkdPMiAgICAgICAgICAgICAgICAgICBcCisgIChBRENfQ0ZHUl9FWFRTRUxfMyB8IEFEQ19DRkdSX0VYVFNFTF8xIHwgICAgICAgICAgICAgICBcCisgICBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBcCitjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU0xIFRSR08yLiBcCitUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfQ0gxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgICAgICAgICAgICAgICAgICAgXAorY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMSBjaGFubmVsIDEgZXZlbnQgKGNhcHR1cmUgXAorY29tcGFyZTogaW5wdXQgY2FwdHVyZSBvciBvdXRwdXQgY2FwdHVyZSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gICAgICAgICAgICAgICAgICAgICAgICAgXAorTm90ZTogT24gdGhpcyBTVE0zMiBzZXJpZXMsIHRoaXMgdHJpZ2dlciBpcyBhdmFpbGFibGUgb25seSBvbiAgICAgICAgICAgICAgXAorQURDMS8yIGluc3RhbmNlcyAqLworI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfQ0gyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfQ0ZHUl9FWFRTRUxfMCB8IEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIFwKK2NvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTEgY2hhbm5lbCAyIGV2ZW50IChjYXB0dXJlICAgXAorY29tcGFyZTogaW5wdXQgY2FwdHVyZSBvciBvdXRwdXQgY2FwdHVyZSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK05vdGU6IE9uIHRoaXMgU1RNMzIgc2VyaWVzLCB0aGlzIHRyaWdnZXIgaXMgYXZhaWxhYmxlIG9ubHkgb24gICAgICAgICAgICAgICAgXAorQURDMS8yIGluc3RhbmNlcyAqLworI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfQ0gzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfQ0ZHUl9FWFRTRUxfMSB8IEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIFwKK2NvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTEgY2hhbm5lbCAzIGV2ZW50IChjYXB0dXJlICAgXAorY29tcGFyZTogaW5wdXQgY2FwdHVyZSBvciBvdXRwdXQgY2FwdHVyZSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTJfVFJHTyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0NGR1JfRVhUU0VMXzMgfCBBRENfQ0ZHUl9FWFRTRUxfMSB8IEFEQ19DRkdSX0VYVFNFTF8wIHwgXAorICAgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgICAgICAgXAorY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMiBUUkdPLiAgICAgICAgXAorVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU0yX0NIMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19DRkdSX0VYVFNFTF8zIHwgQURDX0NGR1JfRVhUU0VMXzIgfCBBRENfQ0ZHUl9FWFRTRUxfMSB8ICAgICAgICAgICAgICAgIFwKKyAgIEFEQ19DRkdSX0VYVFNFTF8wIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTIgY2hhbm5lbCAxIGV2ZW50IChjYXB0dXJlIFwKKyAgIGNvbXBhcmU6IGlucHV0IGNhcHR1cmUgb3Igb3V0cHV0IGNhcHR1cmUpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIE5vdGU6IE9uIHRoaXMgU1RNMzIgc2VyaWVzLCB0aGlzIHRyaWdnZXIgaXMgYXZhaWxhYmxlIG9ubHkgb24gICAgICAgICAgICAgIFwKKyAgIEFEQzMvNC81IGluc3RhbmNlcy4gUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgQURDeCBhdmFpbGFiaWxpdHkgKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU0yX0NIMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfQ0ZHUl9FWFRTRUxfMSB8IEFEQ19DRkdSX0VYVFNFTF8wIHwgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgXAorICAgICAgICAgICAgICAgICAgICBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgcGVyaXBoZXJhbDogVElNMiBjaGFubmVsIDIgZXZlbnQgKGNhcHR1cmUgY29tcGFyZTogaW5wdXQgICBcCisgICAgICAgICAgICAgICAgICAgIGNhcHR1cmUgb3Igb3V0cHV0IGNhcHR1cmUpLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyAgICAgXAorICAgICAgICAgICAgICAgICAgICBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiBOb3RlOiBPbiB0aGlzIFNUTTMyIHNlcmllcywgdGhpcyAgIFwKKyAgICAgICAgICAgICAgICAgICAgdHJpZ2dlciBpcyBhdmFpbGFibGUgb25seSBvbiBBREMxLzIgaW5zdGFuY2VzICovCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMl9DSDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19DRkdSX0VYVFNFTF8wIHwgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgXAorY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMiBjaGFubmVsIDMgZXZlbnQgKGNhcHR1cmUgICBcCitjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIG91dHB1dCBjYXB0dXJlKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK1RyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorTm90ZTogT24gdGhpcyBTVE0zMiBzZXJpZXMsIHRoaXMgdHJpZ2dlciBpcyBhdmFpbGFibGUgb25seSBvbiAgICAgICAgICAgICAgICBcCitBREMzLzQvNSBpbnN0YW5jZXMuIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIEFEQ3ggYXZhaWxhYmlsaXR5ICovCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfVElNM19UUkdPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19DRkdSX0VYVFNFTF8yIHwgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgXAorY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMyBUUkdPLiAgICAgICAgICAgICAgICAgICAgICBcCitUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTNfQ0gxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgICAgICAgICAgICAgICAgICAgXAorY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMyBjaGFubmVsIDEgZXZlbnQgKGNhcHR1cmUgXAorY29tcGFyZTogaW5wdXQgY2FwdHVyZSBvciBvdXRwdXQgY2FwdHVyZSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gICAgICAgICAgICAgICAgICAgICAgICAgXAorTm90ZTogT24gdGhpcyBTVE0zMiBzZXJpZXMsIHRoaXMgdHJpZ2dlciBpcyBhdmFpbGFibGUgb25seSBvbiAgICAgICAgICAgICAgXAorQURDMy80LzUgaW5zdGFuY2VzLiBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBBREN4IGF2YWlsYWJpbGl0eSAqLworI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTNfQ0g0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfQ0ZHUl9FWFRTRUxfMyB8IEFEQ19DRkdSX0VYVFNFTF8yIHwgQURDX0NGR1JfRVhUU0VMXzEgfCAgICAgICAgICAgICAgIFwKKyAgIEFEQ19DRkdSX0VYVFNFTF8wIHwgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgXAorY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMyBjaGFubmVsIDQgZXZlbnQgKGNhcHR1cmUgICBcCitjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIG91dHB1dCBjYXB0dXJlKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK1RyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorTm90ZTogT24gdGhpcyBTVE0zMiBzZXJpZXMsIHRoaXMgdHJpZ2dlciBpcyBhdmFpbGFibGUgb25seSBvbiAgICAgICAgICAgICAgICBcCitBREMxLzIgaW5zdGFuY2VzICovCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfVElNNF9UUkdPICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfQ0ZHUl9FWFRTRUxfMyB8IEFEQ19DRkdSX0VYVFNFTF8yIHwgICAgICAgICAgICAgICBcCisgICBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBcCitjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU00IFRSR08uICBcCitUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTRfQ0gxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0NGR1JfRVhUU0VMXzIgfCBBRENfQ0ZHUl9FWFRTRUxfMSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgICAgICAgICAgICAgICAgICAgXAorY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNNCBjaGFubmVsIDEgZXZlbnQgKGNhcHR1cmUgXAorY29tcGFyZTogaW5wdXQgY2FwdHVyZSBvciBvdXRwdXQgY2FwdHVyZSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gICAgICAgICAgICAgICAgICAgICAgICAgXAorTm90ZTogT24gdGhpcyBTVE0zMiBzZXJpZXMsIHRoaXMgdHJpZ2dlciBpcyBhdmFpbGFibGUgb25seSBvbiAgICAgICAgICAgICAgXAorQURDMy80LzUgaW5zdGFuY2VzLiBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBBREN4IGF2YWlsYWJpbGl0eSAqLworI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTRfQ0g0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19DRkdSX0VYVFNFTF8yIHwgQURDX0NGR1JfRVhUU0VMXzAgfCBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCBcCisgICAgICAgICAgICAgICAgICAgIEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBwZXJpcGhlcmFsOiBUSU00IGNoYW5uZWwgNCBldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FwdHVyZSBvciBvdXRwdXQgY2FwdHVyZSkuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nICAgICBcCisgICAgICAgICAgICAgICAgICAgIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuIE5vdGU6IE9uIHRoaXMgU1RNMzIgc2VyaWVzLCB0aGlzICAgXAorICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyIGlzIGF2YWlsYWJsZSBvbmx5IG9uIEFEQzEvMiBpbnN0YW5jZXMgKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU02X1RSR08gICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19DRkdSX0VYVFNFTF8zIHwgQURDX0NGR1JfRVhUU0VMXzIgfCBBRENfQ0ZHUl9FWFRTRUxfMCB8IFwKKyAgIEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8IEFEQyBncm91cCByZWd1bGFyICAgICAgIFwKK2NvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTYgVFJHTy4gICAgICAgIFwKK1RyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfVElNN19UUkdPICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfQ0ZHUl9FWFRTRUxfNCB8IEFEQ19DRkdSX0VYVFNFTF8zIHwgQURDX0NGR1JfRVhUU0VMXzIgfCBcCisgICBBRENfQ0ZHUl9FWFRTRUxfMSB8IEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8ICAgICBcCitjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU03IFRSR08uICAgICAgICBcCitUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTThfVFJHTyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0NGR1JfRVhUU0VMXzIgfCBBRENfQ0ZHUl9FWFRTRUxfMSB8IEFEQ19DRkdSX0VYVFNFTF8wIHwgXAorICAgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgICAgICAgXAorY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNOCBUUkdPLiAgICAgICAgXAorVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU04X1RSR08yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0NGR1JfRVhUU0VMXzMgfCBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBcCitjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU04IFRSR08yLiAgICAgICAgICAgICAgICAgICAgIFwKK1RyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfVElNOF9DSDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfQ0ZHUl9FWFRTRUxfMSB8IEFEQ19DRkdSX0VYVFNFTF8wIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCBBREMgZ3JvdXAgcmVndWxhciAgICAgICAgICAgICAgICAgICBcCitjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU04IGNoYW5uZWwgMSBldmVudCAoY2FwdHVyZSBcCitjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIG91dHB1dCBjYXB0dXJlKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAgICAgICAgICAgICAgICAgICAgICAgICBcCitOb3RlOiBPbiB0aGlzIFNUTTMyIHNlcmllcywgdGhpcyB0cmlnZ2VyIGlzIGF2YWlsYWJsZSBvbmx5IG9uICAgICAgICAgICAgICBcCitBREMzLzQvNSBpbnN0YW5jZXMuIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIEFEQ3ggYXZhaWxhYmlsaXR5ICovCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMTVfVFJHTyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfQ0ZHUl9FWFRTRUxfMyB8IEFEQ19DRkdSX0VYVFNFTF8yIHwgQURDX0NGR1JfRVhUU0VMXzEgfCBcCisgICBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCBBREMgZ3JvdXAgcmVndWxhciAgICAgICBcCitjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU0xNSBUUkdPLiAgICAgICBcCitUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTIwX1RSR08gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfQ0ZHUl9FWFRTRUxfNCB8IEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIFwKKyBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU0yMCBUUkdPLiAgICAgICAgICAgICAgICAgICAgXAorIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgTm90ZTogT24gdGhpcyBTVE0zMiBzZXJpZXMsIFRJTTIwIGlzIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuICAgICAgICAgIFwKKyBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBtb3JlIGRldGFpbHMgKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU0yMF9UUkdPMiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfQ0ZHUl9FWFRTRUxfNCB8IEFEQ19DRkdSX0VYVFNFTF8wIHwgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgICAgICAgICAgIFwKK2NvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTIwIFRSR08yLiAgICAgICAgICBcCitUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAgICAgICAgICAgICAgICAgXAorTm90ZTogT24gdGhpcyBTVE0zMiBzZXJpZXMsIFRJTTIwIGlzIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuIFwKK1JlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIG1vcmUgZGV0YWlscyAqLworI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTIwX0NIMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19DRkdSX0VYVFNFTF80IHwgQURDX0NGR1JfRVhUU0VMXzEgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCBBREMgZ3JvdXAgcmVndWxhciAgICAgICAgICAgICAgICAgICAgXAorY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMjAgY2hhbm5lbCAxIGV2ZW50IChjYXB0dXJlIFwKK2NvbXBhcmU6IGlucHV0IGNhcHR1cmUgb3Igb3V0cHV0IGNhcHR1cmUpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorTm90ZTogT24gdGhpcyBTVE0zMiBzZXJpZXMsIFRJTTIwIGlzIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuICAgICAgICAgIFwKK1JlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIG1vcmUgZGV0YWlscyAqLworI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTIwX0NIMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19DRkdSX0VYVFNFTF80IHwgQURDX0NGR1JfRVhUU0VMXzEgfCBBRENfQ0ZHUl9FWFRTRUxfMCB8ICAgICAgICAgICAgICBcCisgICBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCBBREMgZ3JvdXAgcmVndWxhciAgICAgICAgICAgICAgICAgICAgXAorY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMjAgY2hhbm5lbCAyIGV2ZW50IChjYXB0dXJlIFwKK2NvbXBhcmU6IGlucHV0IGNhcHR1cmUgb3Igb3V0cHV0IGNhcHR1cmUpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorTm90ZTogT24gdGhpcyBTVE0zMiBzZXJpZXMsIHRoaXMgdHJpZ2dlciBpcyBhdmFpbGFibGUgb25seSBvbiAgICAgICAgICAgICAgIFwKK0FEQzEvMiBpbnN0YW5jZXMsIGFuZCBUSU0yMCBpcyBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzLiAgICAgICAgICAgICAgICBcCitSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBtb3JlIGRldGFpbHMgKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU0yMF9DSDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfQ0ZHUl9FWFRTRUxfNCB8IEFEQ19DRkdSX0VYVFNFTF8yIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgICAgICAgICAgICAgICAgICAgIFwKK2NvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTIwIGNoYW5uZWwgMyBldmVudCAoY2FwdHVyZSBcCitjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIG91dHB1dCBjYXB0dXJlKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gICAgICAgICAgICAgICAgICAgICAgICAgIFwKK05vdGU6IE9uIHRoaXMgU1RNMzIgc2VyaWVzLCB0aGlzIHRyaWdnZXIgaXMgYXZhaWxhYmxlIG9ubHkgb24gICAgICAgICAgICAgICBcCitBREMxLzIgaW5zdGFuY2VzLCBhbmQgVElNMjAgaXMgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlcy4gICAgICAgICAgICAgICAgXAorUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgbW9yZSBkZXRhaWxzICovCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfSFJUSU1fVFJHMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19DRkdSX0VYVFNFTF80IHwgQURDX0NGR1JfRVhUU0VMXzIgfCBBRENfQ0ZHUl9FWFRTRUxfMCB8ICAgICAgICAgICAgXAorICAgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgICAgICAgICAgICAgICAgICBcCitjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBIUlRJTUVSIEFEQyB0cmlnZ2VyIDEgZXZlbnQuIFwKK1RyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICAgICAgICAgICAgICAgICAgICAgICAgXAorTm90ZTogT24gdGhpcyBTVE0zMiBzZXJpZXMsIEhSVElNIGlzIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuICAgICAgICBcCitSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBtb3JlIGRldGFpbHMgKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9IUlRJTV9UUkcyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0NGR1JfRVhUU0VMXzQgfCBBRENfQ0ZHUl9FWFRTRUxfMSB8IEFEQ19DRkdSX0VYVFNFTF8wIHwgICAgICAgICAgICBcCisgICBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCBBREMgZ3JvdXAgcmVndWxhciAgICAgICAgICAgICAgICAgIFwKK2NvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IEhSVElNRVIgQURDIHRyaWdnZXIgMiBldmVudC4gXAorVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gICAgICAgICAgICAgICAgICAgICAgICBcCitOb3RlOiBPbiB0aGlzIFNUTTMyIHNlcmllcywgdGhpcyB0cmlnZ2VyIGlzIGF2YWlsYWJsZSBvbmx5IG9uICAgICAgICAgICAgIFwKK0FEQzMvNC81IGluc3RhbmNlcywgYW5kIEhSVElNIGlzIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuICAgICAgICAgICAgXAorUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgbW9yZSBkZXRhaWxzICovCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfSFJUSU1fVFJHMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19DRkdSX0VYVFNFTF80IHwgQURDX0NGR1JfRVhUU0VMXzIgfCBBRENfQ0ZHUl9FWFRTRUxfMSB8ICAgICAgICAgICAgXAorICAgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgICAgICAgICAgICAgICAgICBcCitjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBIUlRJTUVSIEFEQyB0cmlnZ2VyIDMgZXZlbnQuIFwKK1RyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICAgICAgICAgICAgICAgICAgICAgICAgXAorTm90ZTogT24gdGhpcyBTVE0zMiBzZXJpZXMsIEhSVElNIGlzIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuICAgICAgICBcCitSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBtb3JlIGRldGFpbHMgKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9IUlRJTV9UUkc0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0NGR1JfRVhUU0VMXzQgfCBBRENfQ0ZHUl9FWFRTRUxfMiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCBBREMgZ3JvdXAgcmVndWxhciAgICAgICAgICAgICAgICAgIFwKK2NvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IEhSVElNRVIgQURDIHRyaWdnZXIgNCBldmVudC4gXAorVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gICAgICAgICAgICAgICAgICAgICAgICBcCitOb3RlOiBPbiB0aGlzIFNUTTMyIHNlcmllcywgdGhpcyB0cmlnZ2VyIGlzIGF2YWlsYWJsZSBvbmx5IG9uICAgICAgICAgICAgIFwKK0FEQzMvNC81IGluc3RhbmNlcywgYW5kIEhSVElNIGlzIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuICAgICAgICAgICAgXAorUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgbW9yZSBkZXRhaWxzICovCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfSFJUSU1fVFJHNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19DRkdSX0VYVFNFTF80IHwgQURDX0NGR1JfRVhUU0VMXzIgfCBBRENfQ0ZHUl9FWFRTRUxfMSB8ICAgICAgICAgICAgICAgXAorICAgQURDX0NGR1JfRVhUU0VMXzAgfCBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBcCitjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBIUlRJTUVSIEFEQyB0cmlnZ2VyIDUgZXZlbnQuICAgIFwKK1RyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorTm90ZTogT24gdGhpcyBTVE0zMiBzZXJpZXMsIEhSVElNIGlzIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuICAgICAgICAgICBcCitSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBtb3JlIGRldGFpbHMgKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9IUlRJTV9UUkc2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0NGR1JfRVhUU0VMXzQgfCBBRENfQ0ZHUl9FWFRTRUxfMyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCBBREMgZ3JvdXAgcmVndWxhciAgICAgICAgICAgICAgICAgIFwKK2NvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IEhSVElNRVIgQURDIHRyaWdnZXIgNiBldmVudC4gXAorVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gICAgICAgICAgICAgICAgICAgICAgICBcCitOb3RlOiBPbiB0aGlzIFNUTTMyIHNlcmllcywgSFJUSU0gaXMgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlcy4gICAgICAgIFwKK1JlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIG1vcmUgZGV0YWlscyAqLworI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX0hSVElNX1RSRzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfQ0ZHUl9FWFRTRUxfNCB8IEFEQ19DRkdSX0VYVFNFTF8zIHwgQURDX0NGR1JfRVhUU0VMXzAgfCAgICAgICAgICAgIFwKKyAgIEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8IEFEQyBncm91cCByZWd1bGFyICAgICAgICAgICAgICAgICAgXAorY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogSFJUSU1FUiBBREMgdHJpZ2dlciA3IGV2ZW50LiBcCitUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAgICAgICAgICAgICAgICAgICAgICAgIFwKK05vdGU6IE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBIUlRJTSBpcyBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzLiAgICAgICAgXAorUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgbW9yZSBkZXRhaWxzICovCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfSFJUSU1fVFJHOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19DRkdSX0VYVFNFTF80IHwgQURDX0NGR1JfRVhUU0VMXzMgfCBBRENfQ0ZHUl9FWFRTRUxfMSB8ICAgICAgICAgICAgXAorICAgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgICAgICAgICAgICAgICAgICBcCitjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBIUlRJTUVSIEFEQyB0cmlnZ2VyIDggZXZlbnQuIFwKK1RyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICAgICAgICAgICAgICAgICAgICAgICAgXAorTm90ZTogT24gdGhpcyBTVE0zMiBzZXJpZXMsIEhSVElNIGlzIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuICAgICAgICBcCitSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBtb3JlIGRldGFpbHMgKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9IUlRJTV9UUkc5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0NGR1JfRVhUU0VMXzQgfCBBRENfQ0ZHUl9FWFRTRUxfMyB8IEFEQ19DRkdSX0VYVFNFTF8xIHwgICAgICAgICAgICAgICBcCisgICBBRENfQ0ZHUl9FWFRTRUxfMCB8IEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIFwKK2NvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IEhSVElNRVIgQURDIHRyaWdnZXIgOSBldmVudC4gICAgXAorVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gICAgICAgICAgICAgICAgICAgICAgICAgICBcCitOb3RlOiBPbiB0aGlzIFNUTTMyIHNlcmllcywgSFJUSU0gaXMgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlcy4gICAgICAgICAgIFwKK1JlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIG1vcmUgZGV0YWlscyAqLworI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX0hSVElNX1RSRzEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0NGR1JfRVhUU0VMXzQgfCBBRENfQ0ZHUl9FWFRTRUxfMyB8IEFEQ19DRkdSX0VYVFNFTF8yIHwgICAgICAgICAgICAgXAorICAgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgICAgICAgICAgICAgICAgICAgXAorY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogSFJUSU1FUiBBREMgdHJpZ2dlciAxMCBldmVudC4gXAorVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gICAgICAgICAgICAgICAgICAgICAgICAgXAorTm90ZTogT24gdGhpcyBTVE0zMiBzZXJpZXMsIEhSVElNIGlzIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuICAgICAgICAgXAorUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgbW9yZSBkZXRhaWxzICovCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfRVhUSV9MSU5FMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0NGR1JfRVhUU0VMXzIgfCBBRENfQ0ZHUl9FWFRTRUxfMSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8IEFEQyBncm91cCByZWd1bGFyICAgICAgICAgICAgICAgICBcCitjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBleHRlcm5hbCBpbnRlcnJ1cHQgbGluZSAxMS4gXAorVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gICAgICAgICAgICAgICAgICAgICAgIFwKK05vdGU6IE9uIHRoaXMgU1RNMzIgc2VyaWVzLCB0aGlzIHRyaWdnZXIgaXMgYXZhaWxhYmxlIG9ubHkgb24gICAgICAgICAgICBcCitBREMxLzIgaW5zdGFuY2VzICovCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfRVhUSV9MSU5FMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfQ0ZHUl9FWFRTRUxfMiB8IEFEQ19DRkdSX0VYVFNFTF8wIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCBBREMgZ3JvdXAgcmVndWxhciAgICAgICAgICAgICAgICBcCitjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBleHRlcm5hbCBpbnRlcnJ1cHQgbGluZSAyLiBcCitUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAgICAgICAgICAgICAgICAgICAgICBcCitOb3RlOiBPbiB0aGlzIFNUTTMyIHNlcmllcywgdGhpcyB0cmlnZ2VyIGlzIGF2YWlsYWJsZSBvbmx5IG9uICAgICAgICAgICBcCitBREMzLzQvNSBpbnN0YW5jZXMuIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIEFEQ3ggYXZhaWxhYmlsaXR5ICovCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfTFBUSU1fT1VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19DRkdSX0VYVFNFTF80IHwgQURDX0NGR1JfRVhUU0VMXzMgfCBBRENfQ0ZHUl9FWFRTRUxfMiB8ICAgICAgICAgICAgICAgXAorICAgQURDX0NGR1JfRVhUU0VMXzAgfCBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBcCitjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBMUFRJTUVSIE9VVCBldmVudC4gICAgICAgICAgICAgIFwKK1RyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfUkVHX1RSSUdHRVJfRURHRSAgQURDIGdyb3VwIHJlZ3VsYXIgLSBUcmlnZ2VyIGVkZ2UKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9SSVNJTkcgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfQ0ZHUl9FWFRFTl8wKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gXAordHJpZ2dlciBwb2xhcml0eSBzZXQgdG8gcmlzaW5nIGVkZ2UgKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9GQUxMSU5HICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfQ0ZHUl9FWFRFTl8xKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gXAordHJpZ2dlciBwb2xhcml0eSBzZXQgdG8gZmFsbGluZyBlZGdlICovCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfUklTSU5HRkFMTElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19DRkdSX0VYVEVOXzEgfCBBRENfQ0ZHUl9FWFRFTl8wKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gXAordHJpZ2dlciBwb2xhcml0eSBzZXQgdG8gYm90aCByaXNpbmcgYW5kIGZhbGxpbmcgZWRnZXMgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19SRUdfU0FNUExJTkdfTU9ERSAgQURDIGdyb3VwIHJlZ3VsYXIgLSBTYW1wbGluZyBtb2RlCisgKiBAeworICovCisjZGVmaW5lIExMX0FEQ19SRUdfU0FNUExJTkdfTU9ERV9OT1JNQUwgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKDB4MDAwMDAwMDBVTCkgLyohPCBBREMgY29udmVyc2lvbnMgc2FtcGxpbmcgcGhhc2UgZHVyYXRpb24gXAoraXMgZGVmaW5lZCB1c2luZyAgQHJlZiBBRENfTExfRUNfQ0hBTk5FTF9TQU1QTElOR1RJTUUgKi8KKyNkZWZpbmUgTExfQURDX1JFR19TQU1QTElOR19NT0RFX0JVTEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfQ0ZHUjJfQlVMQikgLyohPCBBREMgY29udmVyc2lvbnMgc2FtcGxpbmcgcGhhc2Ugc3RhcnRzICAgICAgXAoraW1tZWRpYXRlbHkgYWZ0ZXIgZW5kIG9mIGNvbnZlcnNpb24sIGFuZCBzdG9wcyB1cG9uIHRyaWdnZXIgZXZlbnQuIFwKK05vdGU6IEZpcnN0IGNvbnZlcnNpb24gaXMgdXNpbmcgbWluaW1hbCBzYW1wbGluZyB0aW1lICAgICAgICAgICAgICBcCisoc2VlIEByZWYgQURDX0xMX0VDX0NIQU5ORUxfU0FNUExJTkdUSU1FKSAqLworI2RlZmluZSBMTF9BRENfUkVHX1NBTVBMSU5HX01PREVfVFJJR0dFUl9DT05UUk9MRUQgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19DRkdSMl9TTVBUUklHKSAvKiE8IEFEQyBjb252ZXJzaW9ucyBzYW1wbGluZyBwaGFzZSBpcyAgICAgICAgICBcCitjb250cm9sbGVkIGJ5IHRyaWdnZXIgZXZlbnRzOiB0cmlnZ2VyIHJpc2luZyBlZGdlIGZvciBzdGFydCBzYW1wbGluZywgXAordHJpZ2dlciBmYWxsaW5nIGVkZ2UgZm9yIHN0b3Agc2FtcGxpbmcgYW5kIHN0YXJ0IGNvbnZlcnNpb24gKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19SRUdfQ09OVElOVU9VU19NT0RFICBBREMgZ3JvdXAgcmVndWxhciAtIENvbnRpbnVvdXMgbW9kZQorICogQHsKKyAqLworI2RlZmluZSBMTF9BRENfUkVHX0NPTlZfU0lOR0xFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKDB4MDAwMDAwMDBVTCkgLyohPCBBREMgY29udmVyc2lvbnMgcGVyZm9ybWVkIGluIHNpbmdsZSBtb2RlOiBcCitvbmUgY29udmVyc2lvbiBwZXIgdHJpZ2dlciAqLworI2RlZmluZSBMTF9BRENfUkVHX0NPTlZfQ09OVElOVU9VUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0NGR1JfQ09OVCkgLyohPCBBREMgY29udmVyc2lvbnMgcGVyZm9ybWVkIGluIGNvbnRpbnVvdXMgbW9kZTogXAorYWZ0ZXIgdGhlIGZpcnN0IHRyaWdnZXIsIGZvbGxvd2luZyBjb252ZXJzaW9ucyBsYXVuY2hlZCBzdWNjZXNzaXZlbHkgXAorYXV0b21hdGljYWxseSAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX1JFR19ETUFfVFJBTlNGRVIgIEFEQyBncm91cCByZWd1bGFyIC0gRE1BIHRyYW5zZmVyIG9mCisgKiBBREMgY29udmVyc2lvbiBkYXRhCisgKiBAeworICovCisjZGVmaW5lIExMX0FEQ19SRUdfRE1BX1RSQU5TRkVSX05PTkUgXAorICAoMHgwMDAwMDAwMFVMKSAvKiE8IEFEQyBjb252ZXJzaW9ucyBhcmUgbm90IHRyYW5zZmVycmVkIGJ5IERNQSAqLworI2RlZmluZSBMTF9BRENfUkVHX0RNQV9UUkFOU0ZFUl9MSU1JVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0NGR1JfRE1BRU4pIC8qITwgQURDIGNvbnZlcnNpb24gZGF0YSBhcmUgdHJhbnNmZXJyZWQgYnkgRE1BICAgICAgXAoraW4gbGltaXRlZCBtb2RlIChvbmUgc2hvdCBtb2RlKTogRE1BIHRyYW5zZmVyIHJlcXVlc3RzIGFyZSBzdG9wcGVkIHdoZW4gXAorbnVtYmVyIG9mIERNQSBkYXRhIHRyYW5zZmVycyAobnVtYmVyIG9mIEFEQyBjb252ZXJzaW9ucykgaXMgcmVhY2hlZC4gICAgXAorVGhpcyBBREMgbW9kZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHdpdGggRE1BIG1vZGUgbm9uLWNpcmN1bGFyLiAqLworI2RlZmluZSBMTF9BRENfUkVHX0RNQV9UUkFOU0ZFUl9VTkxJTUlURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19DRkdSX0RNQUNGRyB8IEFEQ19DRkdSX0RNQUVOKSAvKiE8IEFEQyBjb252ZXJzaW9uIGRhdGEgYXJlICAgICAgICAgICBcCit0cmFuc2ZlcnJlZCBieSBETUEsIGluIHVubGltaXRlZCBtb2RlOiBETUEgdHJhbnNmZXIgcmVxdWVzdHMgYXJlIHVubGltaXRlZCwgXAord2hhdGV2ZXIgbnVtYmVyIG9mIERNQSBkYXRhIHRyYW5zZmVycmVkIChudW1iZXIgb2YgQURDIGNvbnZlcnNpb25zKS4gICAgICAgIFwKK1RoaXMgQURDIG1vZGUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoIERNQSBtb2RlIGNpcmN1bGFyLiAqLworLyoqCisgKiBAfQorICovCisKKyNpZiBkZWZpbmVkKEFEQ19TTVBSMV9TTVBQTFVTKQorLyoqIEBkZWZncm91cCBBRENfTExfRUNfU0FNUExJTkdUSU1FX0NPTU1PTl9DT05GSUcgQURDIGluc3RhbmNlIC0gQURDIHNhbXBsaW5nCisgKiB0aW1lIGNvbW1vbiBjb25maWd1cmF0aW9uCisgKiBAeworICovCisjZGVmaW5lIExMX0FEQ19TQU1QTElOR1RJTUVfQ09NTU9OX0RFRkFVTFQgXAorICAoMHgwMDAwMDAwMFVMKSAvKiE8IEFEQyBzYW1wbGluZyB0aW1lIGxldCB0byBkZWZhdWx0IHNldHRpbmdzLiAqLworI2RlZmluZSBMTF9BRENfU0FNUExJTkdUSU1FX0NPTU1PTl8zQzVfUkVQTF8yQzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19TTVBSMV9TTVBQTFVTKSAvKiE8IEFEQyBhZGRpdGlvbmFsIHNhbXBsaW5nIHRpbWUgMy41IEFEQyBjbG9jayAgICAgICBcCitjeWNsZXMgcmVwbGFjaW5nIDIuNSBBREMgY2xvY2sgY3ljbGVzICh0aGlzIGFwcGxpZXMgdG8gYWxsIGNoYW5uZWxzIG1hcHBlZCAgXAord2l0aCBzZWxlY3Rpb24gc2FtcGxpbmcgdGltZSAyLjUgQURDIGNsb2NrIGN5Y2xlcywgd2hhdGV2ZXIgY2hhbm5lbHMgbWFwcGVkIFwKK29uIEFEQyBncm91cHMgcmVndWxhciBvciBpbmplY3RlZCkuICovCisvKioKKyAqIEB9CisgKi8KKyNlbmRpZiAvKiBBRENfU01QUjFfU01QUExVUyAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19SRUdfT1ZSX0RBVEFfQkVIQVZJT1IgIEFEQyBncm91cCByZWd1bGFyIC0gT3ZlcnJ1bgorICogYmVoYXZpb3Igb24gY29udmVyc2lvbiBkYXRhCisgKiBAeworICovCisjZGVmaW5lIExMX0FEQ19SRUdfT1ZSX0RBVEFfUFJFU0VSVkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgweDAwMDAwMDAwVUwpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgYmVoYXZpb3IgaW4gY2FzZSBvZiBvdmVycnVuOiBcCisgICAgICAgICAgICAgICAgICAgICAgZGF0YSBwcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgTExfQURDX1JFR19PVlJfREFUQV9PVkVSV1JJVFRFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19DRkdSX09WUk1PRCkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBiZWhhdmlvciBpbiBjYXNlIG9mIG92ZXJydW46IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhIG92ZXJ3cml0dGVuICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfUkVHX1NFUV9TQ0FOX0xFTkdUSCAgQURDIGdyb3VwIHJlZ3VsYXIgLSBTZXF1ZW5jZXIgc2NhbgorICogbGVuZ3RoCisgKiBAeworICovCisjZGVmaW5lIExMX0FEQ19SRUdfU0VRX1NDQU5fRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAgXAorICAoMHgwMDAwMDAwMFVMKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBkaXNhYmxlIFwKKyhlcXVpdmFsZW50IHRvIHNlcXVlbmNlciBvZiAxIHJhbms6IEFEQyBjb252ZXJzaW9uIG9uIG9ubHkgMSBjaGFubmVsKSAqLworI2RlZmluZSBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV8yUkFOS1MgICAgICAgICAgICAgICAgXAorICAoQURDX1NRUjFfTF8wKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBlbmFibGUgXAord2l0aCAyIHJhbmtzIGluIHRoZSBzZXF1ZW5jZSAqLworI2RlZmluZSBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV8zUkFOS1MgICAgICAgICAgICAgICAgXAorICAoQURDX1NRUjFfTF8xKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBlbmFibGUgXAord2l0aCAzIHJhbmtzIGluIHRoZSBzZXF1ZW5jZSAqLworI2RlZmluZSBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV80UkFOS1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX1NRUjFfTF8xIHwgQURDX1NRUjFfTF8wKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBlbmFibGUgXAorIHdpdGggNCByYW5rcyBpbiB0aGUgc2VxdWVuY2UgKi8KKyNkZWZpbmUgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfNVJBTktTICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19TUVIxX0xfMikgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZW5hYmxlIFwKK3dpdGggNSByYW5rcyBpbiB0aGUgc2VxdWVuY2UgKi8KKyNkZWZpbmUgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfNlJBTktTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19TUVIxX0xfMiB8IEFEQ19TUVIxX0xfMCkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZW5hYmxlIFwKKyB3aXRoIDYgcmFua3MgaW4gdGhlIHNlcXVlbmNlICovCisjZGVmaW5lIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzdSQU5LUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfU1FSMV9MXzIgfCBBRENfU1FSMV9MXzEpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGVuYWJsZSBcCisgIHdpdGggNyByYW5rcyBpbiB0aGUgc2VxdWVuY2UgKi8KKyNkZWZpbmUgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfOFJBTktTICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfU1FSMV9MXzIgfCBBRENfU1FSMV9MXzEgfCBBRENfU1FSMV9MXzApIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgXAorICAgICAgICAgICAgICAgc2VxdWVuY2VyIGVuYWJsZSB3aXRoIDggcmFua3MgaW4gdGhlIHNlcXVlbmNlICovCisjZGVmaW5lIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzlSQU5LUyAgICAgICAgICAgICAgICBcCisgIChBRENfU1FSMV9MXzMpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGVuYWJsZSBcCit3aXRoIDkgcmFua3MgaW4gdGhlIHNlcXVlbmNlICovCisjZGVmaW5lIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzEwUkFOS1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfU1FSMV9MXzMgfCBBRENfU1FSMV9MXzApIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGVuYWJsZSBcCisgd2l0aCAxMCByYW5rcyBpbiB0aGUgc2VxdWVuY2UgKi8KKyNkZWZpbmUgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMTFSQU5LUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19TUVIxX0xfMyB8IEFEQ19TUVIxX0xfMSkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZW5hYmxlIFwKKyB3aXRoIDExIHJhbmtzIGluIHRoZSBzZXF1ZW5jZSAqLworI2RlZmluZSBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV8xMlJBTktTICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19TUVIxX0xfMyB8IEFEQ19TUVIxX0xfMSB8IEFEQ19TUVIxX0xfMCkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBcCisgICAgICAgICAgICAgICBzZXF1ZW5jZXIgZW5hYmxlIHdpdGggMTIgcmFua3MgaW4gdGhlIHNlcXVlbmNlICovCisjZGVmaW5lIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzEzUkFOS1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfU1FSMV9MXzMgfCBBRENfU1FSMV9MXzIpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGVuYWJsZSBcCisgd2l0aCAxMyByYW5rcyBpbiB0aGUgc2VxdWVuY2UgKi8KKyNkZWZpbmUgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMTRSQU5LUyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfU1FSMV9MXzMgfCBBRENfU1FSMV9MXzIgfCBBRENfU1FSMV9MXzApIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgXAorICAgICAgICAgICAgICAgc2VxdWVuY2VyIGVuYWJsZSB3aXRoIDE0IHJhbmtzIGluIHRoZSBzZXF1ZW5jZSAqLworI2RlZmluZSBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV8xNVJBTktTICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19TUVIxX0xfMyB8IEFEQ19TUVIxX0xfMiB8IEFEQ19TUVIxX0xfMSkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBcCisgICAgICAgICAgICAgICBzZXF1ZW5jZXJlbmFibGUgd2l0aCAxNSByYW5rcyBpbiB0aGUgc2VxdWVuY2UgKi8KKyNkZWZpbmUgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMTZSQU5LUyAgICAgICAgICAgICAgIFwKKyAgKEFEQ19TUVIxX0xfMyB8IEFEQ19TUVIxX0xfMiB8IEFEQ19TUVIxX0xfMSB8ICAgICAgICAgIFwKKyAgIEFEQ19TUVIxX0xfMCkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZW5hYmxlIFwKKyAgICAgICAgICAgICAgICAgICAgd2l0aCAxNiByYW5rcyBpbiB0aGUgc2VxdWVuY2UgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19SRUdfU0VRX0RJU0NPTlRfTU9ERSAgQURDIGdyb3VwIHJlZ3VsYXIgLSBTZXF1ZW5jZXIKKyAqIGRpc2NvbnRpbnVvdXMgbW9kZQorICogQHsKKyAqLworI2RlZmluZSBMTF9BRENfUkVHX1NFUV9ESVNDT05UX0RJU0FCTEUgICAgICAgICAgICBcCisgICgweDAwMDAwMDAwVUwpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIFwKK2Rpc2NvbnRpbnVvdXMgbW9kZSBkaXNhYmxlICovCisjZGVmaW5lIExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfMVJBTksgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19DRkdSX0RJU0NFTikgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgXAorZGlzY29udGludW91cyBtb2RlIGVuYWJsZSB3aXRoIHNlcXVlbmNlIGludGVycnVwdGlvbiBldmVyeSByYW5rICovCisjZGVmaW5lIExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfMlJBTktTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19DRkdSX0RJU0NOVU1fMCB8IEFEQ19DRkdSX0RJU0NFTikgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgXAorIGRpc2NvbnRpbnVvdXMgbW9kZSBlbmFibGVkIHdpdGggc2VxdWVuY2UgaW50ZXJydXB0aW9uIGV2ZXJ5IDIgcmFua3MgKi8KKyNkZWZpbmUgTExfQURDX1JFR19TRVFfRElTQ09OVF8zUkFOS1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0NGR1JfRElTQ05VTV8xIHwgQURDX0NGR1JfRElTQ0VOKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBcCisgZGlzY29udGludW91cyBtb2RlIGVuYWJsZSB3aXRoIHNlcXVlbmNlIGludGVycnVwdGlvbiBldmVyeSAzIHJhbmtzICovCisjZGVmaW5lIExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfNFJBTktTICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19DRkdSX0RJU0NOVU1fMSB8IEFEQ19DRkdSX0RJU0NOVU1fMCB8ICAgICAgICAgXAorICAgQURDX0NGR1JfRElTQ0VOKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBcCitkaXNjb250aW51b3VzIG1vZGUgZW5hYmxlIHdpdGggc2VxdWVuY2UgaW50ZXJydXB0aW9uIGV2ZXJ5IDQgcmFua3MgKi8KKyNkZWZpbmUgTExfQURDX1JFR19TRVFfRElTQ09OVF81UkFOS1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0NGR1JfRElTQ05VTV8yIHwgQURDX0NGR1JfRElTQ0VOKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBcCitkaXNjb250aW51b3VzIG1vZGUgZW5hYmxlIHdpdGggc2VxdWVuY2UgaW50ZXJydXB0aW9uIGV2ZXJ5IDUgcmFua3MgKi8KKyNkZWZpbmUgTExfQURDX1JFR19TRVFfRElTQ09OVF82UkFOS1MgICAgICAgICAgICAgICAgXAorICAoQURDX0NGR1JfRElTQ05VTV8yIHwgQURDX0NGR1JfRElTQ05VTV8wIHwgICAgICAgICBcCisgICBBRENfQ0ZHUl9ESVNDRU4pIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIFwKK2Rpc2NvbnRpbnVvdXMgbW9kZSBlbmFibGUgd2l0aCBzZXF1ZW5jZSBpbnRlcnJ1cHRpb24gZXZlcnkgNiByYW5rcyAqLworI2RlZmluZSBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzdSQU5LUyAgICAgICAgICAgICAgICBcCisgIChBRENfQ0ZHUl9ESVNDTlVNXzIgfCBBRENfQ0ZHUl9ESVNDTlVNXzEgfCAgICAgICAgIFwKKyAgIEFEQ19DRkdSX0RJU0NFTikgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgXAorZGlzY29udGludW91cyBtb2RlIGVuYWJsZSB3aXRoIHNlcXVlbmNlIGludGVycnVwdGlvbiBldmVyeSA3IHJhbmtzICovCisjZGVmaW5lIExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfOFJBTktTICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfQ0ZHUl9ESVNDTlVNXzIgfCBBRENfQ0ZHUl9ESVNDTlVNXzEgfCBBRENfQ0ZHUl9ESVNDTlVNXzAgfCBcCisgICBBRENfQ0ZHUl9ESVNDRU4pIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyICAgICAgICAgICAgICBcCitkaXNjb250aW51b3VzIG1vZGUgZW5hYmxlIHdpdGggc2VxdWVuY2UgaW50ZXJydXB0aW9uIGV2ZXJ5IDggcmFua3MgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19SRUdfU0VRX1JBTktTICBBREMgZ3JvdXAgcmVndWxhciAtIFNlcXVlbmNlciByYW5rcworICogQHsKKyAqLworI2RlZmluZSBMTF9BRENfUkVHX1JBTktfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfU1FSMV9SRUdPRkZTRVQgfCBBRENfUkVHX1JBTktfMV9TUVJYX0JJVE9GRlNFVF9QT1MpIC8qITwgQURDIGdyb3VwIFwKKyByZWd1bGFyIHNlcXVlbmNlciByYW5rIDEgKi8KKyNkZWZpbmUgTExfQURDX1JFR19SQU5LXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX1NRUjFfUkVHT0ZGU0VUIHwgQURDX1JFR19SQU5LXzJfU1FSWF9CSVRPRkZTRVRfUE9TKSAvKiE8IEFEQyBncm91cCBcCisgcmVndWxhciBzZXF1ZW5jZXIgcmFuayAyICovCisjZGVmaW5lIExMX0FEQ19SRUdfUkFOS18zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19TUVIxX1JFR09GRlNFVCB8IEFEQ19SRUdfUkFOS18zX1NRUlhfQklUT0ZGU0VUX1BPUykgLyohPCBBREMgZ3JvdXAgXAorIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgMyAqLworI2RlZmluZSBMTF9BRENfUkVHX1JBTktfNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfU1FSMV9SRUdPRkZTRVQgfCBBRENfUkVHX1JBTktfNF9TUVJYX0JJVE9GRlNFVF9QT1MpIC8qITwgQURDIGdyb3VwIFwKKyByZWd1bGFyIHNlcXVlbmNlciByYW5rIDQgKi8KKyNkZWZpbmUgTExfQURDX1JFR19SQU5LXzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX1NRUjJfUkVHT0ZGU0VUIHwgQURDX1JFR19SQU5LXzVfU1FSWF9CSVRPRkZTRVRfUE9TKSAvKiE8IEFEQyBncm91cCBcCisgcmVndWxhciBzZXF1ZW5jZXIgcmFuayA1ICovCisjZGVmaW5lIExMX0FEQ19SRUdfUkFOS182ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19TUVIyX1JFR09GRlNFVCB8IEFEQ19SRUdfUkFOS182X1NRUlhfQklUT0ZGU0VUX1BPUykgLyohPCBBREMgZ3JvdXAgXAorIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgNiAqLworI2RlZmluZSBMTF9BRENfUkVHX1JBTktfNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfU1FSMl9SRUdPRkZTRVQgfCBBRENfUkVHX1JBTktfN19TUVJYX0JJVE9GRlNFVF9QT1MpIC8qITwgQURDIGdyb3VwIFwKKyByZWd1bGFyIHNlcXVlbmNlciByYW5rIDcgKi8KKyNkZWZpbmUgTExfQURDX1JFR19SQU5LXzggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX1NRUjJfUkVHT0ZGU0VUIHwgQURDX1JFR19SQU5LXzhfU1FSWF9CSVRPRkZTRVRfUE9TKSAvKiE8IEFEQyBncm91cCBcCisgcmVndWxhciBzZXF1ZW5jZXIgcmFuayA4ICovCisjZGVmaW5lIExMX0FEQ19SRUdfUkFOS185ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19TUVIyX1JFR09GRlNFVCB8IEFEQ19SRUdfUkFOS185X1NRUlhfQklUT0ZGU0VUX1BPUykgLyohPCBBREMgZ3JvdXAgXAorIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgOSAqLworI2RlZmluZSBMTF9BRENfUkVHX1JBTktfMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX1NRUjNfUkVHT0ZGU0VUIHwgQURDX1JFR19SQU5LXzEwX1NRUlhfQklUT0ZGU0VUX1BPUykgLyohPCBBREMgZ3JvdXAgXAorICByZWd1bGFyIHNlcXVlbmNlciByYW5rIDEwICovCisjZGVmaW5lIExMX0FEQ19SRUdfUkFOS18xMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfU1FSM19SRUdPRkZTRVQgfCBBRENfUkVHX1JBTktfMTFfU1FSWF9CSVRPRkZTRVRfUE9TKSAvKiE8IEFEQyBncm91cCBcCisgIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgMTEgKi8KKyNkZWZpbmUgTExfQURDX1JFR19SQU5LXzEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19TUVIzX1JFR09GRlNFVCB8IEFEQ19SRUdfUkFOS18xMl9TUVJYX0JJVE9GRlNFVF9QT1MpIC8qITwgQURDIGdyb3VwIFwKKyAgcmVndWxhciBzZXF1ZW5jZXIgcmFuayAxMiAqLworI2RlZmluZSBMTF9BRENfUkVHX1JBTktfMTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX1NRUjNfUkVHT0ZGU0VUIHwgQURDX1JFR19SQU5LXzEzX1NRUlhfQklUT0ZGU0VUX1BPUykgLyohPCBBREMgZ3JvdXAgXAorICByZWd1bGFyIHNlcXVlbmNlciByYW5rIDEzICovCisjZGVmaW5lIExMX0FEQ19SRUdfUkFOS18xNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfU1FSM19SRUdPRkZTRVQgfCBBRENfUkVHX1JBTktfMTRfU1FSWF9CSVRPRkZTRVRfUE9TKSAvKiE8IEFEQyBncm91cCBcCisgIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgMTQgKi8KKyNkZWZpbmUgTExfQURDX1JFR19SQU5LXzE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19TUVI0X1JFR09GRlNFVCB8IEFEQ19SRUdfUkFOS18xNV9TUVJYX0JJVE9GRlNFVF9QT1MpIC8qITwgQURDIGdyb3VwIFwKKyAgcmVndWxhciBzZXF1ZW5jZXIgcmFuayAxNSAqLworI2RlZmluZSBMTF9BRENfUkVHX1JBTktfMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX1NRUjRfUkVHT0ZGU0VUIHwgQURDX1JFR19SQU5LXzE2X1NRUlhfQklUT0ZGU0VUX1BPUykgLyohPCBBREMgZ3JvdXAgXAorICByZWd1bGFyIHNlcXVlbmNlciByYW5rIDE2ICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfSU5KX1RSSUdHRVJfU09VUkNFICBBREMgZ3JvdXAgaW5qZWN0ZWQgLSBUcmlnZ2VyIHNvdXJjZQorICogQHsKKyAqLworI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfU09GVFdBUkUgICAgICAgICBcCisgICgweDAwMDAwMDAwVUwpIC8qITwgQURDIGdyb3VwIGluamVjdGVkIFwKK2NvbnZlcnNpb24gdHJpZ2dlciBpbnRlcm5hbDogU1cgc3RhcnQuICovCisjZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMV9UUkdPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMSBUUkdPLiBcCitUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTFfVFJHTzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19KU1FSX0pFWFRTRUxfMyB8IEFEQ19JTkpfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8ICAgICAgICAgICAgICAgICBcCitBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMSBUUkdPMi4gXAorVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9USU0xX0NIMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0pTUVJfSkVYVFNFTF8zIHwgQURDX0pTUVJfSkVYVFNFTF8xIHwgQURDX0pTUVJfSkVYVFNFTF8wIHwgICAgICBcCisgICBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0FEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU0xICAgXAorY2hhbm5lbCAzIGV2ZW50IChjYXB0dXJlIGNvbXBhcmU6IGlucHV0IGNhcHR1cmUgb3Igb3V0cHV0IGNhcHR1cmUpLiAgICBcCitUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAgICAgICAgICAgICAgICAgICAgIFwKK05vdGU6IE9uIHRoaXMgU1RNMzIgc2VyaWVzLCB0aGlzIHRyaWdnZXIgaXMgYXZhaWxhYmxlIG9ubHkgb24gQURDMy80LzUgXAoraW5zdGFuY2VzLiBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBBREN4IGF2YWlsYWJpbGl0eSAqLworI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTFfQ0g0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0pTUVJfSkVYVFNFTF8wIHwgQURDX0lOSl9UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgICAgICAgICAgXAorQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTEgXAorY2hhbm5lbCA0IGV2ZW50IChjYXB0dXJlIGNvbXBhcmU6IGlucHV0IGNhcHR1cmUgb3Igb3V0cHV0IGNhcHR1cmUpLiAgXAorVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9USU0yX1RSR08gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19KU1FSX0pFWFRTRUxfMSB8IEFEQ19JTkpfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8ICAgICAgICAgICAgICAgIFwKK0FEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU0yIFRSR08uIFwKK1RyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMl9DSDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfSlNRUl9KRVhUU0VMXzEgfCBBRENfSlNRUl9KRVhUU0VMXzAgfCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMiBcCitjaGFubmVsIDEgZXZlbnQgKGNhcHR1cmUgY29tcGFyZTogaW5wdXQgY2FwdHVyZSBvciBvdXRwdXQgY2FwdHVyZSkuICBcCitUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAgICAgICAgICAgICAgICAgICBcCitOb3RlOiBPbiB0aGlzIFNUTTMyIHNlcmllcywgdGhpcyB0cmlnZ2VyIGlzIGF2YWlsYWJsZSBvbmx5IG9uIEFEQzEvMiBcCitpbnN0YW5jZXMgKi8KKyNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9USU0zX1RSR08gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19KU1FSX0pFWFRTRUxfMyB8IEFEQ19KU1FSX0pFWFRTRUxfMiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIEFEQ19JTkpfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0FEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU0zIFRSR08uIFwKK1RyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfVElNM19DSDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfSlNRUl9KRVhUU0VMXzMgfCBBRENfSlNRUl9KRVhUU0VMXzIgfCBBRENfSlNRUl9KRVhUU0VMXzAgfCAgICBcCisgICBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMyBcCitjaGFubmVsIDEgZXZlbnQgKGNhcHR1cmUgY29tcGFyZTogaW5wdXQgY2FwdHVyZSBvciBvdXRwdXQgY2FwdHVyZSkuICBcCitUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAgICAgICAgICAgICAgICAgICBcCitOb3RlOiBPbiB0aGlzIFNUTTMyIHNlcmllcywgdGhpcyB0cmlnZ2VyIGlzIGF2YWlsYWJsZSBvbmx5IG9uIEFEQzEvMiBcCitpbnN0YW5jZXMgKi8KKyNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9USU0zX0NIMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19KU1FSX0pFWFRTRUxfMyB8IEFEQ19KU1FSX0pFWFRTRUxfMSB8IEFEQ19KU1FSX0pFWFRTRUxfMCB8ICAgIFwKKyAgIEFEQ19JTkpfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0FEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU0zIFwKK2NoYW5uZWwgMyBldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIG91dHB1dCBjYXB0dXJlKS4gIFwKK1RyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICAgICAgICAgICAgICAgICAgIFwKK05vdGU6IE9uIHRoaXMgU1RNMzIgc2VyaWVzLCB0aGlzIHRyaWdnZXIgaXMgYXZhaWxhYmxlIG9ubHkgb24gQURDMS8yIFwKK2luc3RhbmNlcyAqLworI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTNfQ0g0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0pTUVJfSkVYVFNFTF8yIHwgQURDX0lOSl9UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgICAgICAgICAgXAorQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTMgXAorY2hhbm5lbCA0IGV2ZW50IChjYXB0dXJlIGNvbXBhcmU6IGlucHV0IGNhcHR1cmUgb3Igb3V0cHV0IGNhcHR1cmUpLiAgXAorVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gICAgICAgICAgICAgICAgICAgXAorTm90ZTogT24gdGhpcyBTVE0zMiBzZXJpZXMsIHRoaXMgdHJpZ2dlciBpcyBhdmFpbGFibGUgb25seSBvbiBBREMxLzIgXAoraW5zdGFuY2VzICovCisjZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfVElNNF9UUkdPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfSlNRUl9KRVhUU0VMXzIgfCBBRENfSlNRUl9KRVhUU0VMXzAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNNCBUUkdPLiBcCitUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTRfQ0gzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfSlNRUl9KRVhUU0VMXzIgfCBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCAgICAgICAgICAgIFwKK0FEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU00ICAgXAorY2hhbm5lbCAzIGV2ZW50IChjYXB0dXJlIGNvbXBhcmU6IGlucHV0IGNhcHR1cmUgb3Igb3V0cHV0IGNhcHR1cmUpLiAgICBcCitUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAgICAgICAgICAgICAgICAgICAgIFwKK05vdGU6IE9uIHRoaXMgU1RNMzIgc2VyaWVzLCB0aGlzIHRyaWdnZXIgaXMgYXZhaWxhYmxlIG9ubHkgb24gQURDMy80LzUgXAoraW5zdGFuY2VzLiBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBBREN4IGF2YWlsYWJpbGl0eSAqLworI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTRfQ0g0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfSlNRUl9KRVhUU0VMXzIgfCBBRENfSlNRUl9KRVhUU0VMXzEgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIEFEQ19JTkpfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTQgICBcCitjaGFubmVsIDQgZXZlbnQgKGNhcHR1cmUgY29tcGFyZTogaW5wdXQgY2FwdHVyZSBvciBvdXRwdXQgY2FwdHVyZSkuICAgIFwKK1RyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICAgICAgICAgICAgICAgICAgICAgXAorTm90ZTogT24gdGhpcyBTVE0zMiBzZXJpZXMsIHRoaXMgdHJpZ2dlciBpcyBhdmFpbGFibGUgb25seSBvbiBBREMzLzQvNSBcCitpbnN0YW5jZXMuIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIEFEQ3ggYXZhaWxhYmlsaXR5ICovCisjZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfVElNNl9UUkdPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfSlNRUl9KRVhUU0VMXzMgfCBBRENfSlNRUl9KRVhUU0VMXzIgfCBBRENfSlNRUl9KRVhUU0VMXzEgfCAgICAgICAgICBcCisgICBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNNiBUUkdPLiBcCitUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTdfVFJHTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0pTUVJfSkVYVFNFTF80IHwgQURDX0pTUVJfSkVYVFNFTF8zIHwgQURDX0pTUVJfSkVYVFNFTF8yIHwgICAgICAgICAgXAorICAgQURDX0pTUVJfSkVYVFNFTF8xIHwgQURDX0lOSl9UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgICAgICAgICAgICAgICAgXAorQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTcgVFJHTy4gXAorVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9USU04X1RSR08gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19KU1FSX0pFWFRTRUxfMyB8IEFEQ19KU1FSX0pFWFRTRUxfMCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIEFEQ19JTkpfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0FEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU04IFRSR08uIFwKK1RyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfVElNOF9UUkdPMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0pTUVJfSkVYVFNFTF8zIHwgQURDX0pTUVJfSkVYVFNFTF8xIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIEFEQ19JTkpfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNOCBUUkdPMi4gXAorVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9USU04X0NIMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0pTUVJfSkVYVFNFTF8xIHwgQURDX0pTUVJfSkVYVFNFTF8wIHwgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0FEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU04ICAgXAorY2hhbm5lbCAyIGV2ZW50IChjYXB0dXJlIGNvbXBhcmU6IGlucHV0IGNhcHR1cmUgb3Igb3V0cHV0IGNhcHR1cmUpLiAgICBcCitUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAgICAgICAgICAgICAgICAgICAgIFwKK05vdGU6IE9uIHRoaXMgU1RNMzIgc2VyaWVzLCB0aGlzIHRyaWdnZXIgaXMgYXZhaWxhYmxlIG9ubHkgb24gQURDMy80LzUgXAoraW5zdGFuY2VzLiBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBBREN4IGF2YWlsYWJpbGl0eSAqLworI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTThfQ0g0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0pTUVJfSkVYVFNFTF8yIHwgQURDX0pTUVJfSkVYVFNFTF8xIHwgQURDX0pTUVJfSkVYVFNFTF8wIHwgICAgXAorICAgQURDX0lOSl9UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTggXAorY2hhbm5lbCA0IGV2ZW50IChjYXB0dXJlIGNvbXBhcmU6IGlucHV0IGNhcHR1cmUgb3Igb3V0cHV0IGNhcHR1cmUpLiAgXAorVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9USU0xNV9UUkdPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfSlNRUl9KRVhUU0VMXzMgfCBBRENfSlNRUl9KRVhUU0VMXzIgfCBBRENfSlNRUl9KRVhUU0VMXzEgfCAgICAgICAgICAgXAorICAgQURDX0pTUVJfSkVYVFNFTF8wIHwgQURDX0lOSl9UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgICAgICAgICAgICAgICAgIFwKK0FEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU0xNSBUUkdPLiBcCitUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTE2X0NIMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0pTUVJfSkVYVFNFTF80IHwgQURDX0pTUVJfSkVYVFNFTF8zIHwgQURDX0pTUVJfSkVYVFNFTF8xIHwgICAgXAorICAgQURDX0pTUVJfSkVYVFNFTF8wIHwgQURDX0lOSl9UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgICAgICAgICAgXAorQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTggXAorY2hhbm5lbCA0IGV2ZW50IChjYXB0dXJlIGNvbXBhcmU6IGlucHV0IGNhcHR1cmUgb3Igb3V0cHV0IGNhcHR1cmUpLiAgXAorVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gICAgICAgICAgICAgICAgICAgXAorTm90ZTogT24gdGhpcyBTVE0zMiBzZXJpZXMsIHRoaXMgdHJpZ2dlciBpcyBhdmFpbGFibGUgb25seSBvbiBBREMxLzIgXAoraW5zdGFuY2VzICovCisjZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMjBfVFJHTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0pTUVJfSkVYVFNFTF80IHwgQURDX0lOSl9UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgICAgICAgICAgICAgICAgIFwKK0FEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU0yMCBUUkdPLiBcCitUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorTm90ZTogT24gdGhpcyBTVE0zMiBzZXJpZXMsIFRJTTIwIGlzIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuIFJlZmVyIHRvIFwKK2RldmljZSBkYXRhc2hlZXQgZm9yIG1vcmUgZGV0YWlscyAqLworI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTIwX1RSR08yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfSlNRUl9KRVhUU0VMXzQgfCBBRENfSlNRUl9KRVhUU0VMXzAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIEFEQ19JTkpfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTIwIFRSR08yLiBcCitUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK05vdGU6IE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBUSU0yMCBpcyBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzLiBSZWZlciB0byAgXAorZGV2aWNlIGRhdGFzaGVldCBmb3IgbW9yZSBkZXRhaWxzICovCisjZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMjBfQ0gyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19KU1FSX0pFWFRTRUxfNCB8IEFEQ19KU1FSX0pFWFRTRUxfMSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgQURDX0lOSl9UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMjAgICAgICAgIFwKK2NoYW5uZWwgMiBldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIG91dHB1dCBjYXB0dXJlKS4gICAgICAgICAgXAorVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gICAgICAgICAgICAgICAgICAgICAgICAgICBcCitUcmlnZ2VyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQzMvNC81IGluc3RhbmNlcy4gT24gdGhpcyBTVE0zMiBzZXJpZXMsIFRJTTIwIGlzIFwKK25vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIG1vcmUgZGV0YWlscyAqLworI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTIwX0NINCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0pTUVJfSkVYVFNFTF80IHwgQURDX0pTUVJfSkVYVFNFTF8xIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgQURDX0lOSl9UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTIwICAgICAgXAorY2hhbm5lbCA0IGV2ZW50IChjYXB0dXJlIGNvbXBhcmU6IGlucHV0IGNhcHR1cmUgb3Igb3V0cHV0IGNhcHR1cmUpLiAgICAgICAgXAorVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gICAgICAgICAgICAgICAgICAgICAgICAgXAorVHJpZ2dlciBhdmFpbGFibGUgb25seSBvbiBBREMxLzIgaW5zdGFuY2VzLiBPbiB0aGlzIFNUTTMyIHNlcmllcywgVElNMjAgaXMgXAorbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlcy4gUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgbW9yZSBkZXRhaWxzICovCisjZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfSFJUSU1fVFJHMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfSlNRUl9KRVhUU0VMXzQgfCBBRENfSlNRUl9KRVhUU0VMXzMgfCBBRENfSlNRUl9KRVhUU0VMXzEgfCAgICAgICBcCisgICBBRENfSlNRUl9KRVhUU0VMXzAgfCBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCAgICAgICAgICAgICBcCitBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogSFJUSU1FUiBcCitBREMgdHJpZ2dlciAxIGV2ZW50LiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiBcCitOb3RlOiBPbiB0aGlzIFNUTTMyIHNlcmllcywgdGhpcyB0cmlnZ2VyIGlzIGF2YWlsYWJsZSBvbmx5IG9uIEFEQzMvNC81ICBcCitpbnN0YW5jZXMsIGFuZCBIUlRJTSBpcyBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzLiBSZWZlciB0byBkZXZpY2UgICBcCitkYXRhc2hlZXQgZm9yIG1vcmUgZGV0YWlscyAqLworI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX0hSVElNX1RSRzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19KU1FSX0pFWFRTRUxfNCB8IEFEQ19KU1FSX0pFWFRTRUxfMSB8IEFEQ19KU1FSX0pFWFRTRUxfMCB8ICAgICAgICAgICBcCisgICBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IEhSVElNRVIgQURDIFwKK3RyaWdnZXIgMiBldmVudC4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gICAgICAgICBcCitOb3RlOiBPbiB0aGlzIFNUTTMyIHNlcmllcywgSFJUSU0gaXMgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlcy4gUmVmZXIgdG8gXAorZGV2aWNlIGRhdGFzaGVldCBmb3IgbW9yZSBkZXRhaWxzICovCisjZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfSFJUSU1fVFJHMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfSlNRUl9KRVhUU0VMXzQgfCBBRENfSlNRUl9KRVhUU0VMXzMgfCBBRENfSlNRUl9KRVhUU0VMXzIgfCAgICAgICBcCisgICBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogSFJUSU1FUiBcCitBREMgdHJpZ2dlciAzIGV2ZW50LiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiBcCitOb3RlOiBPbiB0aGlzIFNUTTMyIHNlcmllcywgdGhpcyB0cmlnZ2VyIGlzIGF2YWlsYWJsZSBvbmx5IG9uIEFEQzMvNC81ICBcCitpbnN0YW5jZXMsIGFuZCBIUlRJTSBpcyBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzLiBSZWZlciB0byBkZXZpY2UgICBcCitkYXRhc2hlZXQgZm9yIG1vcmUgZGV0YWlscyAqLworI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX0hSVElNX1RSRzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19KU1FSX0pFWFRTRUxfNCB8IEFEQ19KU1FSX0pFWFRTRUxfMiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IEhSVElNRVIgQURDIFwKK3RyaWdnZXIgNCBldmVudC4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gICAgICAgICBcCitOb3RlOiBPbiB0aGlzIFNUTTMyIHNlcmllcywgSFJUSU0gaXMgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlcy4gUmVmZXIgdG8gXAorZGV2aWNlIGRhdGFzaGVldCBmb3IgbW9yZSBkZXRhaWxzICovCisjZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfSFJUSU1fVFJHNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0pTUVJfSkVYVFNFTF80IHwgQURDX0pTUVJfSkVYVFNFTF8yIHwgQURDX0pTUVJfSkVYVFNFTF8wIHwgICAgICAgICAgIFwKKyAgIEFEQ19JTkpfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogSFJUSU1FUiBBREMgXAordHJpZ2dlciA1IGV2ZW50LiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAgICAgICAgIFwKK05vdGU6IE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBIUlRJTSBpcyBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzLiBSZWZlciB0byBcCitkZXZpY2UgZGF0YXNoZWV0IGZvciBtb3JlIGRldGFpbHMgKi8KKyNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9IUlRJTV9UUkc2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfSlNRUl9KRVhUU0VMXzQgfCBBRENfSlNRUl9KRVhUU0VMXzIgfCBBRENfSlNRUl9KRVhUU0VMXzEgfCAgICAgICAgICAgXAorICAgQURDX0lOSl9UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0FEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBIUlRJTUVSIEFEQyBcCit0cmlnZ2VyIDYgZXZlbnQuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICAgICAgICAgXAorTm90ZTogT24gdGhpcyBTVE0zMiBzZXJpZXMsIEhSVElNIGlzIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuIFJlZmVyIHRvIFwKK2RldmljZSBkYXRhc2hlZXQgZm9yIG1vcmUgZGV0YWlscyAqLworI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX0hSVElNX1RSRzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19KU1FSX0pFWFRTRUxfNCB8IEFEQ19KU1FSX0pFWFRTRUxfMiB8IEFEQ19KU1FSX0pFWFRTRUxfMSB8ICAgICAgICAgICBcCisgICBBRENfSlNRUl9KRVhUU0VMXzAgfCBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCAgICAgICAgICAgICAgICAgXAorQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IEhSVElNRVIgQURDIFwKK3RyaWdnZXIgNyBldmVudC4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gICAgICAgICBcCitOb3RlOiBPbiB0aGlzIFNUTTMyIHNlcmllcywgSFJUSU0gaXMgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlcy4gUmVmZXIgdG8gXAorZGV2aWNlIGRhdGFzaGVldCBmb3IgbW9yZSBkZXRhaWxzICovCisjZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfSFJUSU1fVFJHOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0pTUVJfSkVYVFNFTF80IHwgQURDX0pTUVJfSkVYVFNFTF8zIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIEFEQ19JTkpfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogSFJUSU1FUiBBREMgXAordHJpZ2dlciA4IGV2ZW50LiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAgICAgICAgIFwKK05vdGU6IE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBIUlRJTSBpcyBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzLiBSZWZlciB0byBcCitkZXZpY2UgZGF0YXNoZWV0IGZvciBtb3JlIGRldGFpbHMgKi8KKyNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9IUlRJTV9UUkc5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfSlNRUl9KRVhUU0VMXzQgfCBBRENfSlNRUl9KRVhUU0VMXzMgfCBBRENfSlNRUl9KRVhUU0VMXzAgfCAgICAgICAgICAgXAorICAgQURDX0lOSl9UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0FEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBIUlRJTUVSIEFEQyBcCit0cmlnZ2VyIDkgZXZlbnQuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICAgICAgICAgXAorTm90ZTogT24gdGhpcyBTVE0zMiBzZXJpZXMsIEhSVElNIGlzIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuIFJlZmVyIHRvIFwKK2RldmljZSBkYXRhc2hlZXQgZm9yIG1vcmUgZGV0YWlscyAqLworI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX0hSVElNX1RSRzEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19KU1FSX0pFWFRTRUxfNCB8IEFEQ19KU1FSX0pFWFRTRUxfMyB8IEFEQ19KU1FSX0pFWFRTRUxfMSB8ICAgICAgICAgICBcCisgICBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IEhSVElNRVIgQURDIFwKK3RyaWdnZXIgMTAgZXZlbnQuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICAgICAgICBcCitOb3RlOiBPbiB0aGlzIFNUTTMyIHNlcmllcywgSFJUSU0gaXMgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlcy5SZWZlciB0byAgXAorZGV2aWNlIGRhdGFzaGVldCBmb3IgbW9yZSBkZXRhaWxzICovCisjZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfRVhUSV9MSU5FMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0pTUVJfSkVYVFNFTF8zIHwgQURDX0pTUVJfSkVYVFNFTF8yIHwgQURDX0pTUVJfSkVYVFNFTF8wIHwgICAgICAgIFwKKyAgIEFEQ19JTkpfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogZXh0ZXJuYWwgXAoraW50ZXJydXB0IGxpbmUgMy4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gICAgIFwKK05vdGU6IE9uIHRoaXMgU1RNMzIgc2VyaWVzLCB0aGlzIHRyaWdnZXIgaXMgYXZhaWxhYmxlIG9ubHkgb24gQURDMy80LzUgICBcCitpbnN0YW5jZXMuIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIEFEQ3ggYXZhaWxhYmlsaXR5ICovCisjZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfRVhUSV9MSU5FMTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0pTUVJfSkVYVFNFTF8yIHwgQURDX0pTUVJfSkVYVFNFTF8xIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIEFEQ19JTkpfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogZXh0ZXJuYWwgXAoraW50ZXJydXB0IGxpbmUgMTUuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICAgIFwKK05vdGU6IE9uIHRoaXMgU1RNMzIgc2VyaWVzLCB0aGlzIHRyaWdnZXIgaXMgYXZhaWxhYmxlIG9ubHkgb24gQURDMS8yICAgICBcCitpbnN0YW5jZXMuICovCisjZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfTFBUSU1fT1VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0pTUVJfSkVYVFNFTF80IHwgQURDX0pTUVJfSkVYVFNFTF8zIHwgQURDX0pTUVJfSkVYVFNFTF8yIHwgICAgICAgICAgIFwKKyAgIEFEQ19KU1FSX0pFWFRTRUxfMCB8IEFEQ19JTkpfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8ICAgICAgICAgICAgICAgICBcCitBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogTFBUSU1FUiBPVVQgXAorZXZlbnQuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfSU5KX1RSSUdHRVJfRURHRSAgQURDIGdyb3VwIGluamVjdGVkIC0gVHJpZ2dlciBlZGdlCisgKiBAeworICovCisjZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfUklTSU5HICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfSlNRUl9KRVhURU5fMCkgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiBcCit0cmlnZ2VyIHBvbGFyaXR5IHNldCB0byByaXNpbmcgZWRnZSAqLworI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX0ZBTExJTkcgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0pTUVJfSkVYVEVOXzEpIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gXAordHJpZ2dlciBwb2xhcml0eSBzZXQgdG8gZmFsbGluZyBlZGdlICovCisjZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfUklTSU5HRkFMTElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19KU1FSX0pFWFRFTl8xIHwgQURDX0pTUVJfSkVYVEVOXzApIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gXAorICB0cmlnZ2VyIHBvbGFyaXR5IHNldCB0byBib3RoIHJpc2luZyBhbmQgZmFsbGluZyBlZGdlcyAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX0lOSl9UUklHX0FVVE8gIEFEQyBncm91cCBpbmplY3RlZCAtIEF1dG9tYXRpYyB0cmlnZ2VyCisgKiBtb2RlCisgKiBAeworICovCisjZGVmaW5lIExMX0FEQ19JTkpfVFJJR19JTkRFUEVOREVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKDB4MDAwMDAwMDBVTCkgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGluZGVwZW5kZW50LiAgXAorU2V0dGluZyBtYW5kYXRvcnkgaWYgQURDIGdyb3VwIGluamVjdGVkIGluamVjdGVkIHRyaWdnZXIgc291cmNlIGlzIHNldCB0byBcCithbiBleHRlcm5hbCB0cmlnZ2VyLiAqLworI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRlJPTV9HUlBfUkVHVUxBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfQ0ZHUl9KQVVUTykgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gQURDIGdyb3VwIFwKK3JlZ3VsYXIuIFNldHRpbmcgY29tcGxpYW50IG9ubHkgd2l0aCBncm91cCBpbmplY3RlZCB0cmlnZ2VyIHNvdXJjZSBzZXQgdG8gICAgXAorU1cgc3RhcnQsIHdpdGhvdXQgYW55IGZ1cnRoZXIgYWN0aW9uIG9uICBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiBzdGFydCBcCitvciBzdG9wOiBpbiB0aGlzIGNhc2UsIEFEQyBncm91cCBpbmplY3RlZCBpcyBjb250cm9sbGVkIG9ubHkgZnJvbSBBREMgZ3JvdXAgIFwKK3JlZ3VsYXIuICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfSU5KX0NPTlRFWFRfUVVFVUUgIEFEQyBncm91cCBpbmplY3RlZCAtIENvbnRleHQgcXVldWUKKyAqIG1vZGUKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfQURDX0lOSl9RVUVVRV8yQ09OVEVYVFNfTEFTVF9BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgweDAwMDAwMDAwVUwpIC8qIEdyb3VwIGluamVjdGVkIHNlcXVlbmNlIGNvbnRleHQgcXVldWUgaXMgZW5hYmxlZCAgICAgXAorYW5kIGNhbiBjb250YWluIHVwIHRvIDIgY29udGV4dHMuIFdoZW4gYWxsIGNvbnRleHRzIGhhdmUgYmVlbiBwcm9jZXNzZWQsIFwKK3RoZSBxdWV1ZSBtYWludGFpbnMgdGhlIGxhc3QgY29udGV4dCBhY3RpdmUgcGVycGV0dWFsbHkuICovCisjZGVmaW5lIExMX0FEQ19JTkpfUVVFVUVfMkNPTlRFWFRTX0VORF9FTVBUWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0NGR1JfSlFNKSAvKiBHcm91cCBpbmplY3RlZCBzZXF1ZW5jZSBjb250ZXh0IHF1ZXVlIGlzIGVuYWJsZWQgICAgIFwKK2FuZCBjYW4gY29udGFpbiB1cCB0byAyIGNvbnRleHRzLiBXaGVuIGFsbCBjb250ZXh0cyBoYXZlIGJlZW4gcHJvY2Vzc2VkLCBcCit0aGUgcXVldWUgaXMgZW1wdHkgYW5kIGluamVjdGVkIGdyb3VwIHRyaWdnZXJzIGFyZSBkaXNhYmxlZC4gKi8KKyNkZWZpbmUgTExfQURDX0lOSl9RVUVVRV9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfQ0ZHUl9KUURJUykgLyogR3JvdXAgaW5qZWN0ZWQgc2VxdWVuY2UgY29udGV4dCBxdWV1ZSBpcyBkaXNhYmxlZDogXAorb25seSAxIHNlcXVlbmNlIGNhbiBiZSBjb25maWd1cmVkIGFuZCBpcyBhY3RpdmUgcGVycGV0dWFsbHkuICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfSU5KX1NFUV9TQ0FOX0xFTkdUSCAgQURDIGdyb3VwIGluamVjdGVkIC0gU2VxdWVuY2VyIHNjYW4KKyAqIGxlbmd0aAorICogQHsKKyAqLworI2RlZmluZSBMTF9BRENfSU5KX1NFUV9TQ0FOX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgweDAwMDAwMDAwVUwpIC8qITwgQURDIGdyb3VwIGluamVjdGVkIHNlcXVlbmNlciBkaXNhYmxlIFwKKyhlcXVpdmFsZW50IHRvIHNlcXVlbmNlciBvZiAxIHJhbms6IEFEQyBjb252ZXJzaW9uIG9uIG9ubHkgMSBjaGFubmVsKSAqLworI2RlZmluZSBMTF9BRENfSU5KX1NFUV9TQ0FOX0VOQUJMRV8yUkFOS1MgICAgICAgICAgICAgICAgICBcCisgIChBRENfSlNRUl9KTF8wKSAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBzZXF1ZW5jZXIgZW5hYmxlIFwKK3dpdGggMiByYW5rcyBpbiB0aGUgc2VxdWVuY2UgKi8KKyNkZWZpbmUgTExfQURDX0lOSl9TRVFfU0NBTl9FTkFCTEVfM1JBTktTICAgICAgICAgICAgICAgICAgXAorICAoQURDX0pTUVJfSkxfMSkgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgc2VxdWVuY2VyIGVuYWJsZSBcCit3aXRoIDMgcmFua3MgaW4gdGhlIHNlcXVlbmNlICovCisjZGVmaW5lIExMX0FEQ19JTkpfU0VRX1NDQU5fRU5BQkxFXzRSQU5LUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfSlNRUl9KTF8xIHwgQURDX0pTUVJfSkxfMCkgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgc2VxdWVuY2VyIGVuYWJsZSBcCisgIHdpdGggNCByYW5rcyBpbiB0aGUgc2VxdWVuY2UgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19JTkpfU0VRX0RJU0NPTlRfTU9ERSAgQURDIGdyb3VwIGluamVjdGVkIC0gU2VxdWVuY2VyCisgKiBkaXNjb250aW51b3VzIG1vZGUKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfQURDX0lOSl9TRVFfRElTQ09OVF9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgweDAwMDAwMDAwVUwpIC8qITwgQURDIGdyb3VwIGluamVjdGVkIHNlcXVlbmNlciBkaXNjb250aW51b3VzIG1vZGUgXAorZGlzYWJsZSAqLworI2RlZmluZSBMTF9BRENfSU5KX1NFUV9ESVNDT05UXzFSQU5LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfQ0ZHUl9KRElTQ0VOKSAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBzZXF1ZW5jZXIgZGlzY29udGludW91cyBtb2RlIFwKKyAgZW5hYmxlIHdpdGggc2VxdWVuY2UgaW50ZXJydXB0aW9uIGV2ZXJ5IHJhbmsgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19JTkpfU0VRX1JBTktTICBBREMgZ3JvdXAgaW5qZWN0ZWQgLSBTZXF1ZW5jZXIgcmFua3MKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfQURDX0lOSl9SQU5LXzEgXAorICAoQURDX0pEUjFfUkVHT0ZGU0VUIHwgICBcCisgICBBRENfSU5KX1JBTktfMV9KU1FSX0JJVE9GRlNFVF9QT1MpIC8qITwgQURDIGdyb3VwIGluai4gc2VxdWVuY2VyIHJhbmsgMSAqLworI2RlZmluZSBMTF9BRENfSU5KX1JBTktfMiBcCisgIChBRENfSkRSMl9SRUdPRkZTRVQgfCAgIFwKKyAgIEFEQ19JTkpfUkFOS18yX0pTUVJfQklUT0ZGU0VUX1BPUykgLyohPCBBREMgZ3JvdXAgaW5qLiBzZXF1ZW5jZXIgcmFuayAyICovCisjZGVmaW5lIExMX0FEQ19JTkpfUkFOS18zIFwKKyAgKEFEQ19KRFIzX1JFR09GRlNFVCB8ICAgXAorICAgQURDX0lOSl9SQU5LXzNfSlNRUl9CSVRPRkZTRVRfUE9TKSAvKiE8IEFEQyBncm91cCBpbmouIHNlcXVlbmNlciByYW5rIDMgKi8KKyNkZWZpbmUgTExfQURDX0lOSl9SQU5LXzQgXAorICAoQURDX0pEUjRfUkVHT0ZGU0VUIHwgICBcCisgICBBRENfSU5KX1JBTktfNF9KU1FSX0JJVE9GRlNFVF9QT1MpIC8qITwgQURDIGdyb3VwIGluai4gc2VxdWVuY2VyIHJhbmsgNCAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX0NIQU5ORUxfU0FNUExJTkdUSU1FICBDaGFubmVsIC0gU2FtcGxpbmcgdGltZQorICogQHsKKyAqLworI2RlZmluZSBMTF9BRENfU0FNUExJTkdUSU1FXzJDWUNMRVNfNSBcCisgICgweDAwMDAwMDAwVUwpIC8qITwgU2FtcGxpbmcgdGltZSAyLjUgQURDIGNsb2NrIGN5Y2xlcyAqLworI2RlZmluZSBMTF9BRENfU0FNUExJTkdUSU1FXzZDWUNMRVNfNSBcCisgIChBRENfU01QUjJfU01QMTBfMCkgLyohPCBTYW1wbGluZyB0aW1lIDYuNSBBREMgY2xvY2sgY3ljbGVzICovCisjZGVmaW5lIExMX0FEQ19TQU1QTElOR1RJTUVfMTJDWUNMRVNfNSBcCisgIChBRENfU01QUjJfU01QMTBfMSkgLyohPCBTYW1wbGluZyB0aW1lIDEyLjUgQURDIGNsb2NrIGN5Y2xlcyAqLworI2RlZmluZSBMTF9BRENfU0FNUExJTkdUSU1FXzI0Q1lDTEVTXzUgXAorICAoQURDX1NNUFIyX1NNUDEwXzEgfCAgICAgICAgICAgICAgICAgXAorICAgQURDX1NNUFIyX1NNUDEwXzApIC8qITwgU2FtcGxpbmcgdGltZSAyNC41IEFEQyBjbG9jayBjeWNsZXMgKi8KKyNkZWZpbmUgTExfQURDX1NBTVBMSU5HVElNRV80N0NZQ0xFU181IFwKKyAgKEFEQ19TTVBSMl9TTVAxMF8yKSAvKiE8IFNhbXBsaW5nIHRpbWUgNDcuNSBBREMgY2xvY2sgY3ljbGVzICovCisjZGVmaW5lIExMX0FEQ19TQU1QTElOR1RJTUVfOTJDWUNMRVNfNSBcCisgIChBRENfU01QUjJfU01QMTBfMiB8ICAgICAgICAgICAgICAgICBcCisgICBBRENfU01QUjJfU01QMTBfMCkgLyohPCBTYW1wbGluZyB0aW1lIDkyLjUgQURDIGNsb2NrIGN5Y2xlcyAqLworI2RlZmluZSBMTF9BRENfU0FNUExJTkdUSU1FXzI0N0NZQ0xFU181IFwKKyAgKEFEQ19TTVBSMl9TTVAxMF8yIHwgICAgICAgICAgICAgICAgICBcCisgICBBRENfU01QUjJfU01QMTBfMSkgLyohPCBTYW1wbGluZyB0aW1lIDI0Ny41IEFEQyBjbG9jayBjeWNsZXMgKi8KKyNkZWZpbmUgTExfQURDX1NBTVBMSU5HVElNRV82NDBDWUNMRVNfNSAgICBcCisgIChBRENfU01QUjJfU01QMTBfMiB8IEFEQ19TTVBSMl9TTVAxMF8xIHwgXAorICAgQURDX1NNUFIyX1NNUDEwXzApIC8qITwgU2FtcGxpbmcgdGltZSA2NDAuNSBBREMgY2xvY2sgY3ljbGVzICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfQ0hBTk5FTF9TSU5HTEVfRElGRl9FTkRJTkcgIENoYW5uZWwgLSBTaW5nbGUgb3IKKyAqIGRpZmZlcmVudGlhbCBlbmRpbmcKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfQURDX1NJTkdMRV9FTkRFRCAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0NBTEZBQ1RfQ0FMRkFDVF9TKSAvKiE8IEFEQyBjaGFubmVsIGVuZGluZyBcCitzZXQgdG8gc2luZ2xlIGVuZGVkIChsaXRlcmFsIGFsc28gdXNlZCB0byBzZXQgY2FsaWJyYXRpb24gbW9kZSkgKi8KKyNkZWZpbmUgTExfQURDX0RJRkZFUkVOVElBTF9FTkRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0NSX0FEQ0FMRElGIHwgQURDX0NBTEZBQ1RfQ0FMRkFDVF9EKSAvKiE8IEFEQyBjaGFubmVsIGVuZGluZyBcCitzZXQgdG8gZGlmZmVyZW50aWFsIChsaXRlcmFsIGFsc28gdXNlZCB0byBzZXQgY2FsaWJyYXRpb24gbW9kZSkgKi8KKyNkZWZpbmUgTExfQURDX0JPVEhfU0lOR0xFX0RJRkZfRU5ERUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChMTF9BRENfU0lOR0xFX0VOREVEIHwgTExfQURDX0RJRkZFUkVOVElBTF9FTkRFRCkgLyohPCBBREMgY2hhbm5lbCBlbmRpbmcgXAorICBzZXQgdG8gYm90aCBzaW5nbGUgZW5kZWQgYW5kIGRpZmZlcmVudGlhbCAobGl0ZXJhbCB1c2VkIG9ubHkgdG8gc2V0ICAgICAgIFwKKyAgY2FsaWJyYXRpb24gZmFjdG9ycykgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19BV0RfTlVNQkVSIEFuYWxvZyB3YXRjaGRvZyAtIEFuYWxvZyB3YXRjaGRvZyBudW1iZXIKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfQURDX0FXRDEgICAgICAgICAgIFwKKyAgKEFEQ19BV0RfQ1IxX0NIQU5ORUxfTUFTSyB8IFwKKyAgIEFEQ19BV0RfQ1IxX1JFR09GRlNFVCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG51bWJlciAxICovCisjZGVmaW5lIExMX0FEQ19BV0QyICAgICAgICAgICAgXAorICAoQURDX0FXRF9DUjIzX0NIQU5ORUxfTUFTSyB8IFwKKyAgIEFEQ19BV0RfQ1IyX1JFR09GRlNFVCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG51bWJlciAyICovCisjZGVmaW5lIExMX0FEQ19BV0QzICAgICAgICAgICAgXAorICAoQURDX0FXRF9DUjIzX0NIQU5ORUxfTUFTSyB8IFwKKyAgIEFEQ19BV0RfQ1IzX1JFR09GRlNFVCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG51bWJlciAzICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfQVdEX0NIQU5ORUxTICBBbmFsb2cgd2F0Y2hkb2cgLSBNb25pdG9yZWQgY2hhbm5lbHMKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoMHgwMDAwMDAwMFVMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBcCitkaXNhYmxlZCAqLworI2RlZmluZSBMTF9BRENfQVdEX0FMTF9DSEFOTkVMU19SRUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19BV0RfQ1IyM19DSEFOTkVMX01BU0sgfCBBRENfQ0ZHUl9BV0QxRU4pIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBcCisgICAgICBtb25pdG9yaW5nIG9mIGFsbCBjaGFubmVscywgY29udmVydGVkIGJ5IGdyb3VwIHJlZ3VsYXIgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0FMTF9DSEFOTkVMU19JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfQVdEX0NSMjNfQ0hBTk5FTF9NQVNLIHwgQURDX0NGR1JfSkFXRDFFTikgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIFwKKyAgICAgICBtb25pdG9yaW5nIG9mIGFsbCBjaGFubmVscywgY29udmVydGVkIGJ5IGdyb3VwIGluamVjdGVkIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9BTExfQ0hBTk5FTFNfUkVHX0lOSiAgICAgICAgICAgICAgICAgXAorICAoQURDX0FXRF9DUjIzX0NIQU5ORUxfTUFTSyB8IEFEQ19DRkdSX0pBV0QxRU4gfCAgICAgICBcCisgICBBRENfQ0ZHUl9BV0QxRU4pIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIFwKK29mIGFsbCBjaGFubmVscywgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8wX1JFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKExMX0FEQ19DSEFOTkVMXzAgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0FXRDFFTiB8IFwKKyAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nICAgICAgICBcCitvZiBBREMgY2hhbm5lbCBBREN4X0lOMCwgY29udmVydGVkIGJ5IGdyb3VwIHJlZ3VsYXIgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfMF9JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoTExfQURDX0NIQU5ORUxfMCAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8IFwKKyAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nICAgICAgICAgXAorb2YgQURDIGNoYW5uZWwgQURDeF9JTjAsIGNvbnZlcnRlZCBieSBncm91cCBpbmplY3RlZCBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8wX1JFR19JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoTExfQURDX0NIQU5ORUxfMCAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8ICAgICAgICAgICBcCisgICBBRENfQ0ZHUl9BV0QxRU4gfCBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBcCitvZiBBREMgY2hhbm5lbCBBREN4X0lOMCwgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xX1JFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKExMX0FEQ19DSEFOTkVMXzEgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0FXRDFFTiB8IFwKKyAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nICAgICAgICBcCitvZiBBREMgY2hhbm5lbCBBREN4X0lOMSwgY29udmVydGVkIGJ5IGdyb3VwIHJlZ3VsYXIgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfMV9JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoTExfQURDX0NIQU5ORUxfMSAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8IFwKKyAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nICAgICAgICAgXAorb2YgQURDIGNoYW5uZWwgQURDeF9JTjEsIGNvbnZlcnRlZCBieSBncm91cCBpbmplY3RlZCBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xX1JFR19JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoTExfQURDX0NIQU5ORUxfMSAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8ICAgICAgICAgICBcCisgICBBRENfQ0ZHUl9BV0QxRU4gfCBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBcCitvZiBBREMgY2hhbm5lbCBBREN4X0lOMSwgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8yX1JFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKExMX0FEQ19DSEFOTkVMXzIgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0FXRDFFTiB8IFwKKyAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nICAgICAgICBcCitvZiBBREMgY2hhbm5lbCBBREN4X0lOMiwgY29udmVydGVkIGJ5IGdyb3VwIHJlZ3VsYXIgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfMl9JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoTExfQURDX0NIQU5ORUxfMiAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8IFwKKyAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nICAgICAgICAgXAorb2YgQURDIGNoYW5uZWwgQURDeF9JTjIsIGNvbnZlcnRlZCBieSBncm91cCBpbmplY3RlZCBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8yX1JFR19JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoTExfQURDX0NIQU5ORUxfMiAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8ICAgICAgICAgICBcCisgICBBRENfQ0ZHUl9BV0QxRU4gfCBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBcCitvZiBBREMgY2hhbm5lbCBBREN4X0lOMiwgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8zX1JFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKExMX0FEQ19DSEFOTkVMXzMgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0FXRDFFTiB8IFwKKyAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nICAgICAgICBcCitvZiBBREMgY2hhbm5lbCBBREN4X0lOMywgY29udmVydGVkIGJ5IGdyb3VwIHJlZ3VsYXIgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfM19JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoTExfQURDX0NIQU5ORUxfMyAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8IFwKKyAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nICAgICAgICAgXAorb2YgQURDIGNoYW5uZWwgQURDeF9JTjMsIGNvbnZlcnRlZCBieSBncm91cCBpbmplY3RlZCBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8zX1JFR19JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoTExfQURDX0NIQU5ORUxfMyAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8ICAgICAgICAgICBcCisgICBBRENfQ0ZHUl9BV0QxRU4gfCBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBcCitvZiBBREMgY2hhbm5lbCBBREN4X0lOMywgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF80X1JFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKExMX0FEQ19DSEFOTkVMXzQgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0FXRDFFTiB8IFwKKyAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nICAgICAgICBcCitvZiBBREMgY2hhbm5lbCBBREN4X0lONCwgY29udmVydGVkIGJ5IGdyb3VwIHJlZ3VsYXIgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfNF9JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoTExfQURDX0NIQU5ORUxfNCAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8IFwKKyAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nICAgICAgICAgXAorb2YgQURDIGNoYW5uZWwgQURDeF9JTjQsIGNvbnZlcnRlZCBieSBncm91cCBpbmplY3RlZCBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF80X1JFR19JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoTExfQURDX0NIQU5ORUxfNCAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8ICAgICAgICAgICBcCisgICBBRENfQ0ZHUl9BV0QxRU4gfCBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBcCitvZiBBREMgY2hhbm5lbCBBREN4X0lONCwgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF81X1JFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKExMX0FEQ19DSEFOTkVMXzUgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0FXRDFFTiB8IFwKKyAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nICAgICAgICBcCitvZiBBREMgY2hhbm5lbCBBREN4X0lONSwgY29udmVydGVkIGJ5IGdyb3VwIHJlZ3VsYXIgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfNV9JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoTExfQURDX0NIQU5ORUxfNSAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8IFwKKyAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nICAgICAgICAgXAorb2YgQURDIGNoYW5uZWwgQURDeF9JTjUsIGNvbnZlcnRlZCBieSBncm91cCBpbmplY3RlZCBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF81X1JFR19JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoTExfQURDX0NIQU5ORUxfNSAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8ICAgICAgICAgICBcCisgICBBRENfQ0ZHUl9BV0QxRU4gfCBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBcCitvZiBBREMgY2hhbm5lbCBBREN4X0lONSwgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF82X1JFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKExMX0FEQ19DSEFOTkVMXzYgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0FXRDFFTiB8IFwKKyAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nICAgICAgICBcCitvZiBBREMgY2hhbm5lbCBBREN4X0lONiwgY29udmVydGVkIGJ5IGdyb3VwIHJlZ3VsYXIgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfNl9JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoTExfQURDX0NIQU5ORUxfNiAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8IFwKKyAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nICAgICAgICAgXAorb2YgQURDIGNoYW5uZWwgQURDeF9JTjYsIGNvbnZlcnRlZCBieSBncm91cCBpbmplY3RlZCBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF82X1JFR19JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoTExfQURDX0NIQU5ORUxfNiAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8ICAgICAgICAgICBcCisgICBBRENfQ0ZHUl9BV0QxRU4gfCBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBcCitvZiBBREMgY2hhbm5lbCBBREN4X0lONiwgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF83X1JFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKExMX0FEQ19DSEFOTkVMXzcgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0FXRDFFTiB8IFwKKyAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nICAgICAgICBcCitvZiBBREMgY2hhbm5lbCBBREN4X0lONywgY29udmVydGVkIGJ5IGdyb3VwIHJlZ3VsYXIgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfN19JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoTExfQURDX0NIQU5ORUxfNyAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8IFwKKyAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nICAgICAgICAgXAorb2YgQURDIGNoYW5uZWwgQURDeF9JTjcsIGNvbnZlcnRlZCBieSBncm91cCBpbmplY3RlZCBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF83X1JFR19JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoTExfQURDX0NIQU5ORUxfNyAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8ICAgICAgICAgICBcCisgICBBRENfQ0ZHUl9BV0QxRU4gfCBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBcCitvZiBBREMgY2hhbm5lbCBBREN4X0lONywgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF84X1JFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKExMX0FEQ19DSEFOTkVMXzggJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0FXRDFFTiB8IFwKKyAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nICAgICAgICBcCitvZiBBREMgY2hhbm5lbCBBREN4X0lOOCwgY29udmVydGVkIGJ5IGdyb3VwIHJlZ3VsYXIgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfOF9JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoTExfQURDX0NIQU5ORUxfOCAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8IFwKKyAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nICAgICAgICAgXAorb2YgQURDIGNoYW5uZWwgQURDeF9JTjgsIGNvbnZlcnRlZCBieSBncm91cCBpbmplY3RlZCBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF84X1JFR19JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoTExfQURDX0NIQU5ORUxfOCAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8ICAgICAgICAgICBcCisgICBBRENfQ0ZHUl9BV0QxRU4gfCBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBcCitvZiBBREMgY2hhbm5lbCBBREN4X0lOOCwgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF85X1JFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKExMX0FEQ19DSEFOTkVMXzkgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0FXRDFFTiB8IFwKKyAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nICAgICAgICBcCitvZiBBREMgY2hhbm5lbCBBREN4X0lOOSwgY29udmVydGVkIGJ5IGdyb3VwIHJlZ3VsYXIgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfOV9JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoTExfQURDX0NIQU5ORUxfOSAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8IFwKKyAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nICAgICAgICAgXAorb2YgQURDIGNoYW5uZWwgQURDeF9JTjksIGNvbnZlcnRlZCBieSBncm91cCBpbmplY3RlZCBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF85X1JFR19JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoTExfQURDX0NIQU5ORUxfOSAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8ICAgICAgICAgICBcCisgICBBRENfQ0ZHUl9BV0QxRU4gfCBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBcCitvZiBBREMgY2hhbm5lbCBBREN4X0lOOSwgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xMF9SRUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChMTF9BRENfQ0hBTk5FTF8xMCAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfQVdEMUVOIHwgXAorICAgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3JpbmcgICAgICAgICBcCitvZiBBREMgY2hhbm5lbCBBREN4X0lOMTAsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzEwX0lOSiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChMTF9BRENfQ0hBTk5FTF8xMCAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8IFwKKyAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nICAgICAgICAgIFwKK29mIEFEQyBjaGFubmVsIEFEQ3hfSU4xMCwgY29udmVydGVkIGJ5IGdyb3VwIGluamVjdGVkIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzEwX1JFR19JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChMTF9BRENfQ0hBTk5FTF8xMCAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8ICAgICAgICAgIFwKKyAgIEFEQ19DRkdSX0FXRDFFTiB8IEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIFwKK29mIEFEQyBjaGFubmVsIEFEQ3hfSU4xMCwgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xMV9SRUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChMTF9BRENfQ0hBTk5FTF8xMSAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfQVdEMUVOIHwgXAorICAgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3JpbmcgICAgICAgICBcCitvZiBBREMgY2hhbm5lbCBBREN4X0lOMTEsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzExX0lOSiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChMTF9BRENfQ0hBTk5FTF8xMSAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8IFwKKyAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nICAgICAgICAgIFwKK29mIEFEQyBjaGFubmVsIEFEQ3hfSU4xMSwgY29udmVydGVkIGJ5IGdyb3VwIGluamVjdGVkIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzExX1JFR19JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChMTF9BRENfQ0hBTk5FTF8xMSAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8ICAgICAgICAgIFwKKyAgIEFEQ19DRkdSX0FXRDFFTiB8IEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIFwKK29mIEFEQyBjaGFubmVsIEFEQ3hfSU4xMSwgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xMl9SRUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChMTF9BRENfQ0hBTk5FTF8xMiAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfQVdEMUVOIHwgXAorICAgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3JpbmcgICAgICAgICBcCitvZiBBREMgY2hhbm5lbCBBREN4X0lOMTIsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzEyX0lOSiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChMTF9BRENfQ0hBTk5FTF8xMiAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8IFwKKyAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nICAgICAgICAgIFwKK29mIEFEQyBjaGFubmVsIEFEQ3hfSU4xMiwgY29udmVydGVkIGJ5IGdyb3VwIGluamVjdGVkIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzEyX1JFR19JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChMTF9BRENfQ0hBTk5FTF8xMiAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8ICAgICAgICAgIFwKKyAgIEFEQ19DRkdSX0FXRDFFTiB8IEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIFwKK29mIEFEQyBjaGFubmVsIEFEQ3hfSU4xMiwgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xM19SRUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChMTF9BRENfQ0hBTk5FTF8xMyAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfQVdEMUVOIHwgXAorICAgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3JpbmcgICAgICAgICBcCitvZiBBREMgY2hhbm5lbCBBREN4X0lOMTMsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzEzX0lOSiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChMTF9BRENfQ0hBTk5FTF8xMyAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8IFwKKyAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nICAgICAgICAgIFwKK29mIEFEQyBjaGFubmVsIEFEQ3hfSU4xMywgY29udmVydGVkIGJ5IGdyb3VwIGluamVjdGVkIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzEzX1JFR19JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChMTF9BRENfQ0hBTk5FTF8xMyAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8ICAgICAgICAgIFwKKyAgIEFEQ19DRkdSX0FXRDFFTiB8IEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIFwKK29mIEFEQyBjaGFubmVsIEFEQ3hfSU4xMywgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xNF9SRUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChMTF9BRENfQ0hBTk5FTF8xNCAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfQVdEMUVOIHwgXAorICAgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3JpbmcgICAgICAgICBcCitvZiBBREMgY2hhbm5lbCBBREN4X0lOMTQsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzE0X0lOSiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChMTF9BRENfQ0hBTk5FTF8xNCAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8IFwKKyAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nICAgICAgICAgIFwKK29mIEFEQyBjaGFubmVsIEFEQ3hfSU4xNCwgY29udmVydGVkIGJ5IGdyb3VwIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzE0X1JFR19JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChMTF9BRENfQ0hBTk5FTF8xNCAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8ICAgICAgICAgIFwKKyAgIEFEQ19DRkdSX0FXRDFFTiB8IEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIFwKK29mIEFEQyBjaGFubmVsIEFEQ3hfSU4xNCwgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xNV9SRUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChMTF9BRENfQ0hBTk5FTF8xNSAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfQVdEMUVOIHwgXAorICAgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3JpbmcgICAgICAgICBcCittb25pdG9yaW5nIG9mIEFEQyBjaGFubmVsIEFEQ3hfSU4xNSwgY29udmVydGVkIGJ5IGdyb3VwIHJlZ3VsYXIgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfMTVfSU5KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKExMX0FEQ19DSEFOTkVMXzE1ICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgXAorICAgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3JpbmcgICAgICAgICAgXAorb2YgQURDIGNoYW5uZWwgQURDeF9JTjE1LCBjb252ZXJ0ZWQgYnkgZ3JvdXAgaW5qZWN0ZWQgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfMTVfUkVHX0lOSiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKExMX0FEQ19DSEFOTkVMXzE1ICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgICAgICAgICAgXAorICAgQURDX0NGR1JfQVdEMUVOIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3JpbmcgXAorb2YgQURDIGNoYW5uZWwgQURDeF9JTjE1LCBjb252ZXJ0ZWQgYnkgZWl0aGVyIGdyb3VwICAgICAgICAgICAgICAgICAgICAgICAgXAorcmVndWxhciBvciBpbmplY3RlZCAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfMTZfUkVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoTExfQURDX0NIQU5ORUxfMTYgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0FXRDFFTiB8IFwKKyAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nICAgICAgICAgXAorb2YgQURDIGNoYW5uZWwgQURDeF9JTjE2LCBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xNl9JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoTExfQURDX0NIQU5ORUxfMTYgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gfCBcCisgICBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyAgICAgICAgICBcCitvZiBBREMgY2hhbm5lbCBBREN4X0lOMTYsIGNvbnZlcnRlZCBieSBncm91cCBpbmplY3RlZCBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xNl9SRUdfSU5KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoTExfQURDX0NIQU5ORUxfMTYgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gfCAgICAgICAgICBcCisgICBBRENfQ0ZHUl9BV0QxRU4gfCBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBcCitvZiBBREMgY2hhbm5lbCBBREN4X0lOMTYsIGNvbnZlcnRlZCBieSBlaXRoZXIgZ3JvdXAgcmVndWxhciBvciBpbmplY3RlZCAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfMTdfUkVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoTExfQURDX0NIQU5ORUxfMTcgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0FXRDFFTiB8IFwKKyAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nICAgICAgICAgXAorb2YgQURDIGNoYW5uZWwgQURDeF9JTjE3LCBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xN19JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoTExfQURDX0NIQU5ORUxfMTcgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gfCBcCisgICBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyAgICAgICAgICBcCitvZiBBREMgY2hhbm5lbCBBREN4X0lOMTcsIGNvbnZlcnRlZCBieSBncm91cCBpbmplY3RlZCBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xN19SRUdfSU5KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoTExfQURDX0NIQU5ORUxfMTcgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gfCAgICAgICAgICBcCisgICBBRENfQ0ZHUl9BV0QxRU4gfCBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBcCitvZiBBREMgY2hhbm5lbCBBREN4X0lOMTcsIGNvbnZlcnRlZCBieSBlaXRoZXIgZ3JvdXAgcmVndWxhciBvciBpbmplY3RlZCAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfMThfUkVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoTExfQURDX0NIQU5ORUxfMTggJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0FXRDFFTiB8IFwKKyAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nICAgICAgICAgXAorb2YgQURDIGNoYW5uZWwgQURDeF9JTjE4LCBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xOF9JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoTExfQURDX0NIQU5ORUxfMTggJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gfCBcCisgICBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyAgICAgICAgICBcCitvZiBBREMgY2hhbm5lbCBBREN4X0lOMTgsIGNvbnZlcnRlZCBieSBncm91cCBpbmplY3RlZCBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xOF9SRUdfSU5KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoTExfQURDX0NIQU5ORUxfMTggJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gfCAgICAgICAgICBcCisgICBBRENfQ0ZHUl9BV0QxRU4gfCBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBcCitvZiBBREMgY2hhbm5lbCBBREN4X0lOMTgsIGNvbnZlcnRlZCBieSBlaXRoZXIgZ3JvdXAgcmVndWxhciBvciBpbmplY3RlZCAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIX1ZSRUZJTlRfUkVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChMTF9BRENfQ0hBTk5FTF9WUkVGSU5UICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9BV0QxRU4gfCBcCisgICBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyAgICAgICAgICAgICAgXAorb2YgQURDIGludGVybmFsIGNoYW5uZWwgY29ubmVjdGVkIHRvIFZyZWZJbnQ6IEludGVybmFsICAgICAgICAgICAgICAgIFwKK3ZvbHRhZ2UgcmVmZXJlbmNlLCBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hfVlJFRklOVF9JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChMTF9BRENfQ0hBTk5FTF9WUkVGSU5UICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgXAorICAgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3JpbmcgICAgICAgICAgICAgICBcCitvZiBBREMgaW50ZXJuYWwgY2hhbm5lbCBjb25uZWN0ZWQgdG8gVnJlZkludDogSW50ZXJuYWwgICAgICAgICAgICAgICAgIFwKK3ZvbHRhZ2UgcmVmZXJlbmNlLCBjb252ZXJ0ZWQgYnkgZ3JvdXAgaW5qZWN0ZWQgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIX1ZSRUZJTlRfUkVHX0lOSiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gfCAgICAgXAorICAgQURDX0NGR1JfQVdEMUVOIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3JpbmcgXAorb2YgQURDIGludGVybmFsIGNoYW5uZWwgY29ubmVjdGVkIHRvIFZyZWZJbnQ6IEludGVybmFsICAgICAgICAgICAgICAgICAgICAgXAordm9sdGFnZSByZWZlcmVuY2UsIGNvbnZlcnRlZCBieSBlaXRoZXIgZ3JvdXAgcmVndWxhciBvciBpbmplY3RlZCAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIX1RFTVBTRU5TT1JfQURDMV9SRUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1JfQURDMSAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfQVdEMUVOIHwgXAorICAgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3JpbmcgICAgICAgICAgICAgICAgICAgICAgXAorb2YgQURDMSBpbnRlcm5hbCBjaGFubmVsIGNvbm5lY3RlZCB0byBpbnRlcm5hbCB0ZW1wZXJhdHVyZSBzZW5zb3IsICAgICAgICAgICAgXAorY29udmVydGVkIGJ5IGdyb3VwIHJlZ3VsYXIgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIX1RFTVBTRU5TT1JfQURDMV9JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SX0FEQzEgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gfCBcCisgICBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorb2YgQURDMSBpbnRlcm5hbCBjaGFubmVsIGNvbm5lY3RlZCB0byBpbnRlcm5hbCB0ZW1wZXJhdHVyZSBzZW5zb3IsICAgICAgICAgICAgIFwKK2NvbnZlcnRlZCBieSBncm91cCBpbmplY3RlZCBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hfVEVNUFNFTlNPUl9BREMxX1JFR19JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1JfQURDMSAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8IFwKKyAgIEFEQ19DRkdSX0FXRDFFTiB8IEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nICAgICBcCitvZiBBREMxIGludGVybmFsIGNoYW5uZWwgY29ubmVjdGVkIHRvIGludGVybmFsIHRlbXBlcmF0dXJlIHNlbnNvciwgICAgICAgICAgICAgXAorY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hfVEVNUFNFTlNPUl9BREM1X1JFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUl9BREM1ICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9BV0QxRU4gfCBcCisgICBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyAgICAgICAgICAgICAgICAgICAgICBcCitvZiBBREM1IGludGVybmFsIGNoYW5uZWwgY29ubmVjdGVkIHRvIGludGVybmFsIHRlbXBlcmF0dXJlIHNlbnNvciwgICAgICAgICAgICBcCitjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hfVEVNUFNFTlNPUl9BREM1X0lOSiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1JfQURDNSAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8IFwKKyAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitvZiBBREM1IGludGVybmFsIGNoYW5uZWwgY29ubmVjdGVkIHRvIGludGVybmFsIHRlbXBlcmF0dXJlIHNlbnNvciwgICAgICAgICAgICAgXAorY29udmVydGVkIGJ5IGdyb3VwIGluamVjdGVkIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSF9URU1QU0VOU09SX0FEQzVfUkVHX0lOSiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUl9BREM1ICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgXAorICAgQURDX0NGR1JfQVdEMUVOIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3JpbmcgICAgIFwKK29mIEFEQzUgaW50ZXJuYWwgY2hhbm5lbCBjb25uZWN0ZWQgdG8gaW50ZXJuYWwgdGVtcGVyYXR1cmUgc2Vuc29yLCAgICAgICAgICAgICBcCitjb252ZXJ0ZWQgYnkgZWl0aGVyIGdyb3VwIHJlZ3VsYXIgb3IgaW5qZWN0ZWQgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSF9WQkFUX1JFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChMTF9BRENfQ0hBTk5FTF9WQkFUICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9BV0QxRU4gfCAgICAgICAgICAgIFwKKyAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nICAgICAgICAgICAgICAgICAgICAgIFwKK29mIEFEQyBpbnRlcm5hbCBjaGFubmVsIGNvbm5lY3RlZCB0byBWYmF0LzM6IFZiYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3ZvbHRhZ2UgdGhyb3VnaCBhIGRpdmlkZXIgbGFkZGVyIG9mIGZhY3RvciAxLzMgdG8gaGF2ZSBjaGFubmVsIHZvbHRhZ2UgYWx3YXlzIFwKK2JlbG93IFZkZGEsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSF9WQkFUX0lOSiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChMTF9BRENfQ0hBTk5FTF9WQkFUICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgICAgICAgICAgIFwKKyAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nICAgICAgICAgICAgICAgICAgICAgIFwKK29mIEFEQyBpbnRlcm5hbCBjaGFubmVsIGNvbm5lY3RlZCB0byBWYmF0LzM6IFZiYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3ZvbHRhZ2UgdGhyb3VnaCBhIGRpdmlkZXIgbGFkZGVyIG9mIGZhY3RvciAxLzMgdG8gaGF2ZSBjaGFubmVsIHZvbHRhZ2UgYWx3YXlzIFwKK2JlbG93IFZkZGEsIGNvbnZlcnRlZCBieSBncm91cCBpbmplY3RlZCBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hfVkJBVF9SRUdfSU5KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoTExfQURDX0NIQU5ORUxfVkJBVCAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8ICAgICAgICAgICBcCisgICBBRENfQ0ZHUl9BV0QxRU4gfCBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyAgICBcCitvZiBBREMgaW50ZXJuYWwgY2hhbm5lbCBjb25uZWN0ZWQgdG8gVmJhdC8zOiBWYmF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit2b2x0YWdlIHRocm91Z2ggYSBkaXZpZGVyIGxhZGRlciBvZiBmYWN0b3IgMS8zIHRvIGhhdmUgY2hhbm5lbCB2b2x0YWdlIGFsd2F5cyBcCitiZWxvdyBWZGRhICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hfVk9QQU1QMV9SRUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKExMX0FEQ19DSEFOTkVMX1ZPUEFNUDEgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0FXRDFFTiB8IFwKKyAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nICAgICAgICAgICAgICBcCitvZiBBREMgaW50ZXJuYWwgY2hhbm5lbCBjb25uZWN0ZWQgdG8gT1BBTVAxIG91dHB1dCwgICAgICAgICAgICAgICAgICAgXAorY2hhbm5lbCBzcGVjaWZpYyB0byBBREMxLCBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hfVk9QQU1QMV9JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChMTF9BRENfQ0hBTk5FTF9WT1BBTVAxICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgXAorICAgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3JpbmcgICAgICAgICAgICAgICBcCitvZiBBREMgaW50ZXJuYWwgY2hhbm5lbCBjb25uZWN0ZWQgdG8gT1BBTVAxIG91dHB1dCwgICAgICAgICAgICAgICAgICAgIFwKK2NoYW5uZWwgc3BlY2lmaWMgdG8gQURDMSwgY29udmVydGVkIGJ5IGdyb3VwIGluamVjdGVkIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSF9WT1BBTVAxX1JFR19JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChMTF9BRENfQ0hBTk5FTF9WT1BBTVAxICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgICAgIFwKKyAgIEFEQ19DRkdSX0FXRDFFTiB8IEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIFwKK29mIEFEQyBpbnRlcm5hbCBjaGFubmVsIGNvbm5lY3RlZCB0byBPUEFNUDEgb3V0cHV0LCAgICAgICAgICAgICAgICAgICAgICAgIFwKK2NoYW5uZWwgc3BlY2lmaWMgdG8gQURDMSwgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hfVk9QQU1QMl9SRUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKExMX0FEQ19DSEFOTkVMX1ZPUEFNUDIgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0FXRDFFTiB8IFwKKyAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nICAgICAgICAgICAgICBcCitjaGFubmVsIHNwZWNpZmljIHRvIEFEQzIsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSF9WT1BBTVAyX0lOSiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKExMX0FEQ19DSEFOTkVMX1ZPUEFNUDIgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gfCBcCisgICBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyAgICAgICAgICAgICAgIFwKK29mIEFEQyBpbnRlcm5hbCBjaGFubmVsIGNvbm5lY3RlZCB0byBPUEFNUDIgb3V0cHV0LCAgICAgICAgICAgICAgICAgICAgXAorY2hhbm5lbCBzcGVjaWZpYyB0byBBREMyLCBjb252ZXJ0ZWQgYnkgZ3JvdXAgaW5qZWN0ZWQgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIX1ZPUEFNUDJfUkVHX0lOSiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKExMX0FEQ19DSEFOTkVMX1ZPUEFNUDIgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gfCAgICAgXAorICAgQURDX0NGR1JfQVdEMUVOIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3JpbmcgXAorb2YgQURDIGludGVybmFsIGNoYW5uZWwgY29ubmVjdGVkIHRvIE9QQU1QMiBvdXRwdXQsICAgICAgICAgICAgICAgICAgICAgICAgXAorY2hhbm5lbCBzcGVjaWZpYyB0byBBREMyLCBjb252ZXJ0ZWQgYnkgZWl0aGVyIGdyb3VwIHJlZ3VsYXIgb3IgaW5qZWN0ZWQgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSF9WT1BBTVAzX0FEQzJfUkVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChMTF9BRENfQ0hBTk5FTF9WT1BBTVAzX0FEQzIgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0FXRDFFTiB8IFwKKyAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nICAgICAgICAgICAgICAgICAgIFwKK29mIEFEQyBpbnRlcm5hbCBjaGFubmVsIGNvbm5lY3RlZCB0byBPUEFNUDMgb3V0cHV0LCAgICAgICAgICAgICAgICAgICAgICAgIFwKK2NoYW5uZWwgc3BlY2lmaWMgdG8gQURDMiwgY29udmVydGVkIGJ5IGdyb3VwIHJlZ3VsYXIgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIX1ZPUEFNUDNfQURDMl9JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChMTF9BRENfQ0hBTk5FTF9WT1BBTVAzX0FEQzIgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gfCBcCisgICBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyAgICAgICAgICAgICAgICAgICAgXAorb2YgQURDIGludGVybmFsIGNoYW5uZWwgY29ubmVjdGVkIHRvIE9QQU1QMyBvdXRwdXQsICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2NoYW5uZWwgc3BlY2lmaWMgdG8gQURDMiwgY29udmVydGVkIGJ5IGdyb3VwIGluamVjdGVkIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSF9WT1BBTVAzX0FEQzJfUkVHX0lOSiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoTExfQURDX0NIQU5ORUxfVk9QQU1QM19BREMyICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgXAorICAgQURDX0NGR1JfQVdEMUVOIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3JpbmcgIFwKK29mIEFEQyBpbnRlcm5hbCBjaGFubmVsIGNvbm5lY3RlZCB0byBPUEFNUDMgb3V0cHV0LCAgICAgICAgICAgICAgICAgICAgICAgICBcCitjaGFubmVsIHNwZWNpZmljIHRvIEFEQzIsIGNvbnZlcnRlZCBieSBlaXRoZXIgZ3JvdXAgcmVndWxhciBvciBpbmplY3RlZCAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIX1ZPUEFNUDNfQURDM19SRUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKExMX0FEQ19DSEFOTkVMX1ZPUEFNUDNfQURDMyAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfQVdEMUVOIHwgXAorICAgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3JpbmcgICAgICAgICAgICAgICAgICAgXAorb2YgQURDIGludGVybmFsIGNoYW5uZWwgY29ubmVjdGVkIHRvIE9QQU1QMyBvdXRwdXQsICAgICAgICAgICAgICAgICAgICAgICAgXAorY2hhbm5lbCBzcGVjaWZpYyB0byBBREMzLCBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hfVk9QQU1QM19BREMzX0lOSiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKExMX0FEQ19DSEFOTkVMX1ZPUEFNUDNfQURDMyAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8IFwKKyAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nICAgICAgICAgICAgICAgICAgICBcCitvZiBBREMgaW50ZXJuYWwgY2hhbm5lbCBjb25uZWN0ZWQgdG8gT1BBTVAzIG91dHB1dCwgICAgICAgICAgICAgICAgICAgICAgICAgXAorY2hhbm5lbCBzcGVjaWZpYyB0byBBREMzLCBjb252ZXJ0ZWQgYnkgZ3JvdXAgaW5qZWN0ZWQgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIX1ZPUEFNUDNfQURDM19SRUdfSU5KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChMTF9BRENfQ0hBTk5FTF9WT1BBTVAzX0FEQzMgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gfCBcCisgICBBRENfQ0ZHUl9BV0QxRU4gfCBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyAgXAorb2YgQURDIGludGVybmFsIGNoYW5uZWwgY29ubmVjdGVkIHRvIE9QQU1QMyBvdXRwdXQsICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2NoYW5uZWwgc3BlY2lmaWMgdG8gQURDMywgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hfVk9QQU1QNF9SRUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKExMX0FEQ19DSEFOTkVMX1ZPUEFNUDQgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0FXRDFFTiB8IFwKKyAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nICAgICAgICAgICAgICBcCitvZiBBREMgaW50ZXJuYWwgY2hhbm5lbCBjb25uZWN0ZWQgdG8gT1BBTVA0IG91dHB1dCwgICAgICAgICAgICAgICAgICAgXAorY2hhbm5lbCBzcGVjaWZpYyB0byBBREM1LCBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hfVk9QQU1QNF9JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChMTF9BRENfQ0hBTk5FTF9WT1BBTVA0ICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgXAorICAgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3JpbmcgICAgICAgICAgICAgICBcCitvZiBBREMgaW50ZXJuYWwgY2hhbm5lbCBjb25uZWN0ZWQgdG8gT1BBTVA0IG91dHB1dCwgICAgICAgICAgICAgICAgICAgIFwKK2NoYW5uZWwgc3BlY2lmaWMgdG8gQURDNSwgY29udmVydGVkIGJ5IGdyb3VwIGluamVjdGVkIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSF9WT1BBTVA0X1JFR19JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChMTF9BRENfQ0hBTk5FTF9WT1BBTVA0ICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgICAgIFwKKyAgIEFEQ19DRkdSX0FXRDFFTiB8IEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIFwKK29mIEFEQyBpbnRlcm5hbCBjaGFubmVsIGNvbm5lY3RlZCB0byBPUEFNUDQgb3V0cHV0LCAgICAgICAgICAgICAgICAgICAgICAgIFwKK2NoYW5uZWwgc3BlY2lmaWMgdG8gQURDNSwgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hfVk9QQU1QNV9SRUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKExMX0FEQ19DSEFOTkVMX1ZPUEFNUDUgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0FXRDFFTiB8IFwKKyAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nICAgICAgICAgICAgICBcCitvZiBBREMgaW50ZXJuYWwgY2hhbm5lbCBjb25uZWN0ZWQgdG8gT1BBTVA1IG91dHB1dCwgICAgICAgICAgICAgICAgICAgXAorY2hhbm5lbCBzcGVjaWZpYyB0byBBREM1LCBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hfVk9QQU1QNV9JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChMTF9BRENfQ0hBTk5FTF9WT1BBTVA1ICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgXAorICAgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3JpbmcgICAgICAgICAgICAgICBcCitvZiBBREMgaW50ZXJuYWwgY2hhbm5lbCBjb25uZWN0ZWQgdG8gT1BBTVA1IG91dHB1dCwgICAgICAgICAgICAgICAgICAgIFwKK2NoYW5uZWwgc3BlY2lmaWMgdG8gQURDNSwgY29udmVydGVkIGJ5IGdyb3VwIGluamVjdGVkIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSF9WT1BBTVA1X1JFR19JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChMTF9BRENfQ0hBTk5FTF9WT1BBTVA1ICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgICAgIFwKKyAgIEFEQ19DRkdSX0FXRDFFTiB8IEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIFwKK29mIEFEQyBpbnRlcm5hbCBjaGFubmVsIGNvbm5lY3RlZCB0byBPUEFNUDUgb3V0cHV0LCAgICAgICAgICAgICAgICAgICAgICAgIFwKK2NoYW5uZWwgc3BlY2lmaWMgdG8gQURDNSwgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hfVk9QQU1QNl9SRUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKExMX0FEQ19DSEFOTkVMX1ZPUEFNUDYgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0FXRDFFTiB8IFwKKyAgIEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nICAgICAgICAgICAgICBcCitvZiBBREMgaW50ZXJuYWwgY2hhbm5lbCBjb25uZWN0ZWQgdG8gT1BBTVA2IG91dHB1dCwgICAgICAgICAgICAgICAgICAgXAorY2hhbm5lbCBzcGVjaWZpYyB0byBBREM0LCBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hfVk9QQU1QNl9JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChMTF9BRENfQ0hBTk5FTF9WT1BBTVA2ICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgXAorICAgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3JpbmcgICAgICAgICAgICAgICBcCitvZiBBREMgaW50ZXJuYWwgY2hhbm5lbCBjb25uZWN0ZWQgdG8gT1BBTVA2IG91dHB1dCwgICAgICAgICAgICAgICAgICAgIFwKK2NoYW5uZWwgc3BlY2lmaWMgdG8gQURDNCwgY29udmVydGVkIGJ5IGdyb3VwIGluamVjdGVkIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSF9WT1BBTVA2X1JFR19JTkogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChMTF9BRENfQ0hBTk5FTF9WT1BBTVA2ICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgICAgIFwKKyAgIEFEQ19DRkdSX0FXRDFFTiB8IEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIFwKK29mIEFEQyBpbnRlcm5hbCBjaGFubmVsIGNvbm5lY3RlZCB0byBPUEFNUDYgb3V0cHV0LCAgICAgICAgICAgICAgICAgICAgICAgIFwKK2NoYW5uZWwgc3BlY2lmaWMgdG8gQURDNCwgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfQVdEX1RIUkVTSE9MRFMgIEFuYWxvZyB3YXRjaGRvZyAtIFRocmVzaG9sZHMKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9USFJFU0hPTERfSElHSCBcCisgIChBRENfVFIxX0hUMSkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZCBoaWdoICovCisjZGVmaW5lIExMX0FEQ19BV0RfVEhSRVNIT0xEX0xPVyBcCisgIChBRENfVFIxX0xUMSkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZCBsb3cgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9USFJFU0hPTERTX0hJR0hfTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfVFIxX0hUMSB8IEFEQ19UUjFfTFQxKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgYm90aCB0aHJlc2hvbGRzIGhpZ2ggXAorICAgICAgICAgIGFuZCBsb3cgY29uY2F0ZW5hdGVkIGludG8gdGhlIHNhbWUgZGF0YSAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX0FXRF9GSUxURVJJTkdfQ09ORklHICBBbmFsb2cgd2F0Y2hkb2cgLSBmaWx0ZXJpbmcgY29uZmlnCisgKiBAeworICovCisjZGVmaW5lIExMX0FEQ19BV0RfRklMVEVSSU5HX05PTkUgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKDB4MDAwMDAwMDBVTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG5vIGZpbHRlcmluZywgXAorb25lIG91dC1vZi13aW5kb3cgc2FtcGxlIGlzIG5lZWRlZCB0byByYWlzZSBmbGFnIG9yIGludGVycnVwdCAqLworI2RlZmluZSBMTF9BRENfQVdEX0ZJTFRFUklOR18yU0FNUExFUyAgICAgICAgICAgIFwKKyAgKEFEQ19UUjFfQVdERklMVF8wKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgMiBcCitvdXQtb2Ytd2luZG93IHNhbXBsZXMgYXJlIG5lZWRlZCB0byByYWlzZSBmbGFnIG9yIGludGVycnVwdCAqLworI2RlZmluZSBMTF9BRENfQVdEX0ZJTFRFUklOR18zU0FNUExFUyAgICAgICAgICAgIFwKKyAgKEFEQ19UUjFfQVdERklMVF8xKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgMyBcCitjb25zZWN1dGl2ZXMgb3V0LW9mLXdpbmRvdyBzYW1wbGVzIGFyZSBuZWVkZWQgdG8gcmFpc2UgZmxhZyBvciBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9GSUxURVJJTkdfNFNBTVBMRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19UUjFfQVdERklMVF8xIHwgQURDX1RSMV9BV0RGSUxUXzApIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyA0IFwKKyAgY29uc2VjdXRpdmVzIG91dC1vZi13aW5kb3cgc2FtcGxlcyBhcmUgbmVlZGVkIHRvIHJhaXNlIGZsYWcgb3IgaW50ZXJydXB0ICovCisjZGVmaW5lIExMX0FEQ19BV0RfRklMVEVSSU5HXzVTQU1QTEVTICAgICAgICAgICAgXAorICAoQURDX1RSMV9BV0RGSUxUXzIpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyA1IFwKK2NvbnNlY3V0aXZlcyBvdXQtb2Ytd2luZG93IHNhbXBsZXMgYXJlIG5lZWRlZCB0byByYWlzZSBmbGFnIG9yIGludGVycnVwdCAqLworI2RlZmluZSBMTF9BRENfQVdEX0ZJTFRFUklOR182U0FNUExFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX1RSMV9BV0RGSUxUXzIgfCBBRENfVFIxX0FXREZJTFRfMCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIDYgXAorICBjb25zZWN1dGl2ZXMgb3V0LW9mLXdpbmRvdyBzYW1wbGVzIGFyZSBuZWVkZWQgdG8gcmFpc2UgZmxhZyBvciBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9GSUxURVJJTkdfN1NBTVBMRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19UUjFfQVdERklMVF8yIHwgQURDX1RSMV9BV0RGSUxUXzEpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyA3IFwKKyAgY29uc2VjdXRpdmVzIG91dC1vZi13aW5kb3cgc2FtcGxlcyBhcmUgbmVlZGVkIHRvIHJhaXNlIGZsYWcgb3IgaW50ZXJydXB0ICovCisjZGVmaW5lIExMX0FEQ19BV0RfRklMVEVSSU5HXzhTQU1QTEVTICAgICAgICAgICAgXAorICAoQURDX1RSMV9BV0RGSUxUXzIgfCBBRENfVFIxX0FXREZJTFRfMSB8ICAgICAgIFwKKyAgIEFEQ19UUjFfQVdERklMVF8wKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgOCBcCitjb25zZWN1dGl2ZXMgb3V0LW9mLXdpbmRvdyBzYW1wbGVzIGFyZSBuZWVkZWQgdG8gcmFpc2UgZmxhZyBvciBpbnRlcnJ1cHQgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19PVlNfU0NPUEUgIE92ZXJzYW1wbGluZyAtIE92ZXJzYW1wbGluZyBzY29wZQorICogQHsKKyAqLworI2RlZmluZSBMTF9BRENfT1ZTX0RJU0FCTEUgKDB4MDAwMDAwMDBVTCkgLyohPCBBREMgb3ZlcnNhbXBsaW5nIGRpc2FibGVkLiAqLworI2RlZmluZSBMTF9BRENfT1ZTX0dSUF9SRUdVTEFSX0NPTlRJTlVFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19DRkdSMl9ST1ZTRSkgLyohPCBBREMgb3ZlcnNhbXBsaW5nIG9uIGNvbnZlcnNpb25zIG9mICAgICAgICAgICAgICAgICBcCitBREMgZ3JvdXAgcmVndWxhci4gSWYgZ3JvdXAgaW5qZWN0ZWQgaW50ZXJydXB0cyBncm91cCByZWd1bGFyOiAgICAgICAgICAgICAgXAord2hlbiBBREMgZ3JvdXAgaW5qZWN0ZWQgaXMgdHJpZ2dlcmVkLCB0aGUgb3ZlcnNhbXBsaW5nIG9uIEFEQyBncm91cCByZWd1bGFyIFwKK2lzIHRlbXBvcmFyeSBzdG9wcGVkIGFuZCBjb250aW51ZWQgYWZ0ZXJ3YXJkcy4gKi8KKyNkZWZpbmUgTExfQURDX09WU19HUlBfUkVHVUxBUl9SRVNVTUVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19DRkdSMl9ST1ZTTSB8IEFEQ19DRkdSMl9ST1ZTRSkgLyohPCBBREMgb3ZlcnNhbXBsaW5nIG9uIGNvbnZlcnNpb25zIG9mIFwKKyAgQURDIGdyb3VwIHJlZ3VsYXIuIElmIGdyb3VwIGluamVjdGVkIGludGVycnVwdHMgZ3JvdXAgcmVndWxhcjogICAgICAgICAgICAgIFwKKyAgd2hlbiBBREMgZ3JvdXAgaW5qZWN0ZWQgaXMgdHJpZ2dlcmVkLCB0aGUgb3ZlcnNhbXBsaW5nIG9uIEFEQyBncm91cCByZWd1bGFyIFwKKyAgaXMgcmVzdW1lZCBmcm9tIHN0YXJ0IChvdmVyc2FtcGxlciBidWZmZXIgcmVzZXQpLiAqLworI2RlZmluZSBMTF9BRENfT1ZTX0dSUF9JTkpFQ1RFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0NGR1IyX0pPVlNFKSAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgb24gY29udmVyc2lvbnMgb2YgXAorQURDIGdyb3VwIGluamVjdGVkLiAqLworI2RlZmluZSBMTF9BRENfT1ZTX0dSUF9JTkpfUkVHX1JFU1VNRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19DRkdSMl9KT1ZTRSB8IEFEQ19DRkdSMl9ST1ZTRSkgLyohPCBBREMgb3ZlcnNhbXBsaW5nIG9uIGNvbnZlcnNpb25zIG9mICBcCisgIGJvdGggQURDIGdyb3VwcyByZWd1bGFyIGFuZCBpbmplY3RlZC4gSWYgZ3JvdXAgaW5qZWN0ZWQgaW50ZXJydXB0aW5nIGdyb3VwICAgXAorICByZWd1bGFyOiB3aGVuIEFEQyBncm91cCBpbmplY3RlZCBpcyB0cmlnZ2VyZWQsIHRoZSBvdmVyc2FtcGxpbmcgb24gQURDIGdyb3VwIFwKKyAgcmVndWxhciBpcyByZXN1bWVkIGZyb20gc3RhcnQgKG92ZXJzYW1wbGVyIGJ1ZmZlciByZXNldCkuICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfT1ZTX0RJU0NPTlRfTU9ERSAgT3ZlcnNhbXBsaW5nIC0gRGlzY29udGludW91cyBtb2RlCisgKiBAeworICovCisjZGVmaW5lIExMX0FEQ19PVlNfUkVHX0NPTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgweDAwMDAwMDAwVUwpIC8qITwgQURDIG92ZXJzYW1wbGluZyBkaXNjb250aW51b3VzIG1vZGU6IGNvbnRpbnVvdXMgbW9kZSBcCisoYWxsIGNvbnZlcnNpb25zIG9mIG92ZXJzYW1wbGluZyByYXRpbyBhcmUgZG9uZSBmcm9tIDEgdHJpZ2dlcikgKi8KKyNkZWZpbmUgTExfQURDX09WU19SRUdfRElTQ09OVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfQ0ZHUjJfVFJPVlMpIC8qITwgQURDIG92ZXJzYW1wbGluZyBkaXNjb250aW51b3VzIG1vZGU6IGRpc2NvbnRpbnVvdXMgXAorIG1vZGUgKGVhY2ggY29udmVyc2lvbiBvZiBvdmVyc2FtcGxpbmcgcmF0aW8gbmVlZHMgYSB0cmlnZ2VyKSAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX09WU19SQVRJTyAgT3ZlcnNhbXBsaW5nIC0gUmF0aW8KKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfQURDX09WU19SQVRJT18yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgweDAwMDAwMDAwVUwpIC8qITwgQURDIG92ZXJzYW1wbGluZyByYXRpbyBvZiAyICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorKHN1bSBvZiBjb252ZXJzaW9ucyBkYXRhIGNvbXB1dGVkIHRvIHJlc3VsdCBhcyBvdmVyc2FtcGxpbmcgY29udmVyc2lvbiBkYXRhIFwKKyhiZWZvcmUgcG90ZW50aWFsIHNoaWZ0KSAqLworI2RlZmluZSBMTF9BRENfT1ZTX1JBVElPXzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19DRkdSMl9PVlNSXzApIC8qITwgQURDIG92ZXJzYW1wbGluZyByYXRpbyBvZiA0ICAgICAgICAgICAgICAgICAgICAgICBcCisoc3VtIG9mIGNvbnZlcnNpb25zIGRhdGEgY29tcHV0ZWQgdG8gcmVzdWx0IGFzIG92ZXJzYW1wbGluZyBjb252ZXJzaW9uIGRhdGEgXAorKGJlZm9yZSBwb3RlbnRpYWwgc2hpZnQpICovCisjZGVmaW5lIExMX0FEQ19PVlNfUkFUSU9fOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0NGR1IyX09WU1JfMSkgLyohPCBBREMgb3ZlcnNhbXBsaW5nIHJhdGlvIG9mIDggICAgICAgICAgICAgICAgICAgICAgIFwKKyhzdW0gb2YgY29udmVyc2lvbnMgZGF0YSBjb21wdXRlZCB0byByZXN1bHQgYXMgb3ZlcnNhbXBsaW5nIGNvbnZlcnNpb24gZGF0YSBcCisoYmVmb3JlIHBvdGVudGlhbCBzaGlmdCkgKi8KKyNkZWZpbmUgTExfQURDX09WU19SQVRJT18xNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19DRkdSMl9PVlNSXzEgfCBBRENfQ0ZHUjJfT1ZTUl8wKSAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgcmF0aW8gb2YgMTYgICAgIFwKKyAgKHN1bSBvZiBjb252ZXJzaW9ucyBkYXRhIGNvbXB1dGVkIHRvIHJlc3VsdCBhcyBvdmVyc2FtcGxpbmcgY29udmVyc2lvbiBkYXRhIFwKKyAgKGJlZm9yZSBwb3RlbnRpYWwgc2hpZnQpICovCisjZGVmaW5lIExMX0FEQ19PVlNfUkFUSU9fMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0NGR1IyX09WU1JfMikgLyohPCBBREMgb3ZlcnNhbXBsaW5nIHJhdGlvIG9mIDMyICAgICAgICAgICAgICAgICAgICAgIFwKKyhzdW0gb2YgY29udmVyc2lvbnMgZGF0YSBjb21wdXRlZCB0byByZXN1bHQgYXMgb3ZlcnNhbXBsaW5nIGNvbnZlcnNpb24gZGF0YSBcCisoYmVmb3JlIHBvdGVudGlhbCBzaGlmdCkgKi8KKyNkZWZpbmUgTExfQURDX09WU19SQVRJT182NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19DRkdSMl9PVlNSXzIgfCBBRENfQ0ZHUjJfT1ZTUl8wKSAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgcmF0aW8gb2YgNjQgICAgIFwKKyAgKHN1bSBvZiBjb252ZXJzaW9ucyBkYXRhIGNvbXB1dGVkIHRvIHJlc3VsdCBhcyBvdmVyc2FtcGxpbmcgY29udmVyc2lvbiBkYXRhIFwKKyAgKGJlZm9yZSBwb3RlbnRpYWwgc2hpZnQpICovCisjZGVmaW5lIExMX0FEQ19PVlNfUkFUSU9fMTI4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfQ0ZHUjJfT1ZTUl8yIHwgQURDX0NGR1IyX09WU1JfMSkgLyohPCBBREMgb3ZlcnNhbXBsaW5nIHJhdGlvIG9mIDEyOCAgICBcCisgIChzdW0gb2YgY29udmVyc2lvbnMgZGF0YSBjb21wdXRlZCB0byByZXN1bHQgYXMgb3ZlcnNhbXBsaW5nIGNvbnZlcnNpb24gZGF0YSBcCisgIChiZWZvcmUgcG90ZW50aWFsIHNoaWZ0KSAqLworI2RlZmluZSBMTF9BRENfT1ZTX1JBVElPXzI1NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19DRkdSMl9PVlNSXzIgfCBBRENfQ0ZHUjJfT1ZTUl8xIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBBRENfQ0ZHUjJfT1ZTUl8wKSAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgcmF0aW8gb2YgMjU2ICAgICAgICAgICAgICAgICAgICAgXAorKHN1bSBvZiBjb252ZXJzaW9ucyBkYXRhIGNvbXB1dGVkIHRvIHJlc3VsdCBhcyBvdmVyc2FtcGxpbmcgY29udmVyc2lvbiBkYXRhIFwKKyhiZWZvcmUgcG90ZW50aWFsIHNoaWZ0KSAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX09WU19TSElGVCAgT3ZlcnNhbXBsaW5nIC0gRGF0YSByaWdodCBzaGlmdAorICogQHsKKyAqLworI2RlZmluZSBMTF9BRENfT1ZTX1NISUZUX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgweDAwMDAwMDAwVUwpIC8qITwgQURDIG92ZXJzYW1wbGluZyBubyBzaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyhzdW0gb2YgdGhlIEFEQyBjb252ZXJzaW9ucyBkYXRhIGlzIG5vdCBkaXZpZGVkIHRvIHJlc3VsdCBhcyBvdmVyc2FtcGxpbmcgXAorY29udmVyc2lvbiBkYXRhKSAqLworI2RlZmluZSBMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19DRkdSMl9PVlNTXzApIC8qITwgQURDIG92ZXJzYW1wbGluZyByaWdodCBzaGlmdCBvZiAxICAgICAgICBcCisoc3VtIG9mIHRoZSBBREMgY29udmVyc2lvbnMgZGF0YSAoYWZ0ZXIgT1ZTIHJhdGlvKSBpcyBkaXZpZGVkIGJ5IDIgXAordG8gcmVzdWx0IGFzIG92ZXJzYW1wbGluZyBjb252ZXJzaW9uIGRhdGEpICovCisjZGVmaW5lIExMX0FEQ19PVlNfU0hJRlRfUklHSFRfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0NGR1IyX09WU1NfMSkgLyohPCBBREMgb3ZlcnNhbXBsaW5nIHJpZ2h0IHNoaWZ0IG9mIDIgICAgICAgIFwKKyhzdW0gb2YgdGhlIEFEQyBjb252ZXJzaW9ucyBkYXRhIChhZnRlciBPVlMgcmF0aW8pIGlzIGRpdmlkZWQgYnkgNCBcCit0byByZXN1bHQgYXMgb3ZlcnNhbXBsaW5nIGNvbnZlcnNpb24gZGF0YSkgKi8KKyNkZWZpbmUgTExfQURDX09WU19TSElGVF9SSUdIVF8zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfQ0ZHUjJfT1ZTU18xIHwgQURDX0NGR1IyX09WU1NfMCkgLyohPCBBREMgb3ZlcnNhbXBsaW5nIHJpZ2h0IHNoaWZ0IG9mIDMgXAorICAoc3VtIG9mIHRoZSBBREMgY29udmVyc2lvbnMgZGF0YSAoYWZ0ZXIgT1ZTIHJhdGlvKSBpcyBkaXZpZGVkIGJ5IDggICAgICAgICAgIFwKKyAgdG8gcmVzdWx0IGFzIG92ZXJzYW1wbGluZyBjb252ZXJzaW9uIGRhdGEpICovCisjZGVmaW5lIExMX0FEQ19PVlNfU0hJRlRfUklHSFRfNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19DRkdSMl9PVlNTXzIpIC8qITwgQURDIG92ZXJzYW1wbGluZyByaWdodCBzaGlmdCBvZiA0ICAgICAgICAgXAorKHN1bSBvZiB0aGUgQURDIGNvbnZlcnNpb25zIGRhdGEgKGFmdGVyIE9WUyByYXRpbykgaXMgZGl2aWRlZCBieSAxNiBcCit0byByZXN1bHQgYXMgb3ZlcnNhbXBsaW5nIGNvbnZlcnNpb24gZGF0YSkgKi8KKyNkZWZpbmUgTExfQURDX09WU19TSElGVF9SSUdIVF81ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfQ0ZHUjJfT1ZTU18yIHwgQURDX0NGR1IyX09WU1NfMCkgLyohPCBBREMgb3ZlcnNhbXBsaW5nIHJpZ2h0IHNoaWZ0IG9mIDUgXAorICAoc3VtIG9mIHRoZSBBREMgY29udmVyc2lvbnMgZGF0YSAoYWZ0ZXIgT1ZTIHJhdGlvKSBpcyBkaXZpZGVkIGJ5IDMyICAgICAgICAgIFwKKyAgdG8gcmVzdWx0IGFzIG92ZXJzYW1wbGluZyBjb252ZXJzaW9uIGRhdGEpICovCisjZGVmaW5lIExMX0FEQ19PVlNfU0hJRlRfUklHSFRfNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0NGR1IyX09WU1NfMiB8IEFEQ19DRkdSMl9PVlNTXzEpIC8qITwgQURDIG92ZXJzYW1wbGluZyByaWdodCBzaGlmdCBvZiA2IFwKKyAgKHN1bSBvZiB0aGUgQURDIGNvbnZlcnNpb25zIGRhdGEgKGFmdGVyIE9WUyByYXRpbykgaXMgZGl2aWRlZCBieSA2NCAgICAgICAgICBcCisgIHRvIHJlc3VsdCBhcyBvdmVyc2FtcGxpbmcgY29udmVyc2lvbiBkYXRhKSAqLworI2RlZmluZSBMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0NGR1IyX09WU1NfMiB8IEFEQ19DRkdSMl9PVlNTXzEgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgQURDX0NGR1IyX09WU1NfMCkgLyohPCBBREMgb3ZlcnNhbXBsaW5nIHJpZ2h0IHNoaWZ0IG9mIDcgICAgICAgICAgXAorKHN1bSBvZiB0aGUgQURDIGNvbnZlcnNpb25zIGRhdGEgKGFmdGVyIE9WUyByYXRpbykgaXMgZGl2aWRlZCBieSAxMjggXAordG8gcmVzdWx0IGFzIG92ZXJzYW1wbGluZyBjb252ZXJzaW9uIGRhdGEpICovCisjZGVmaW5lIExMX0FEQ19PVlNfU0hJRlRfUklHSFRfOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfQ0ZHUjJfT1ZTU18zKSAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgcmlnaHQgc2hpZnQgb2YgOCAgICAgICAgICBcCisoc3VtIG9mIHRoZSBBREMgY29udmVyc2lvbnMgZGF0YSAoYWZ0ZXIgT1ZTIHJhdGlvKSBpcyBkaXZpZGVkIGJ5IDI1NiBcCit0byByZXN1bHQgYXMgb3ZlcnNhbXBsaW5nIGNvbnZlcnNpb24gZGF0YSkgKi8KKy8qKgorICogQH0KKyAqLworCisjaWYgZGVmaW5lZChBRENfTVVMVElNT0RFX1NVUFBPUlQpCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19NVUxUSV9NT0RFICBNdWx0aW1vZGUgLSBNb2RlCisgKiBAeworICovCisjZGVmaW5lIExMX0FEQ19NVUxUSV9JTkRFUEVOREVOVCAgICAgICAgICAgICAgICAgIFwKKyAgKDB4MDAwMDAwMDBVTCkgLyohPCBBREMgZHVhbCBtb2RlIGRpc2FibGVkIChBREMgXAoraW5kZXBlbmRlbnQgbW9kZSkgKi8KKyNkZWZpbmUgTExfQURDX01VTFRJX0RVQUxfUkVHX1NJTVVMVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19DQ1JfRFVBTF8yIHwgQURDX0NDUl9EVUFMXzEpIC8qITwgQURDIGR1YWwgbW9kZSBlbmFibGVkOiBncm91cCByZWd1bGFyIFwKKyAgc2ltdWx0YW5lb3VzICovCisjZGVmaW5lIExMX0FEQ19NVUxUSV9EVUFMX1JFR19JTlRFUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfQ0NSX0RVQUxfMiB8IEFEQ19DQ1JfRFVBTF8xIHwgQURDX0NDUl9EVUFMXzApIC8qITwgQURDIGR1YWwgbW9kZSBcCisgICAgICAgICAgICAgICAgIGVuYWJsZWQ6IENvbWJpbmVkIGdyb3VwIHJlZ3VsYXIgaW50ZXJsZWF2ZWQgKi8KKyNkZWZpbmUgTExfQURDX01VTFRJX0RVQUxfSU5KX1NJTVVMVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfQ0NSX0RVQUxfMiB8IEFEQ19DQ1JfRFVBTF8wKSAvKiE8IEFEQyBkdWFsIG1vZGUgZW5hYmxlZDogZ3JvdXAgaW5qZWN0ZWQgXAorICBzaW11bHRhbmVvdXMgKi8KKyNkZWZpbmUgTExfQURDX01VTFRJX0RVQUxfSU5KX0FMVEVSTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfQ0NSX0RVQUxfMyB8IEFEQ19DQ1JfRFVBTF8wKSAvKiE8IEFEQyBkdWFsIG1vZGUgZW5hYmxlZDogZ3JvdXAgaW5qZWN0ZWQgXAorICBhbHRlcm5hdGUgdHJpZ2dlci4gV29ya3Mgb25seSB3aXRoIGV4dGVybmFsIHRyaWdnZXJzIChub3QgU1cgc3RhcnQpICovCisjZGVmaW5lIExMX0FEQ19NVUxUSV9EVUFMX1JFR19TSU1fSU5KX1NJTSAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19DQ1JfRFVBTF8wKSAvKiE8IEFEQyBkdWFsIG1vZGUgZW5hYmxlZDogQ29tYmluZWQgZ3JvdXAgXAorcmVndWxhciBzaW11bHRhbmVvdXMgKyBncm91cCBpbmplY3RlZCBzaW11bHRhbmVvdXMgKi8KKyNkZWZpbmUgTExfQURDX01VTFRJX0RVQUxfUkVHX1NJTV9JTkpfQUxUICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0NDUl9EVUFMXzEpIC8qITwgQURDIGR1YWwgbW9kZSBlbmFibGVkOiBDb21iaW5lZCBncm91cCBcCityZWd1bGFyIHNpbXVsdGFuZW91cyArIGdyb3VwIGluamVjdGVkIGFsdGVybmF0ZSB0cmlnZ2VyICovCisjZGVmaW5lIExMX0FEQ19NVUxUSV9EVUFMX1JFR19JTlRfSU5KX1NJTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0NDUl9EVUFMXzEgfCBBRENfQ0NSX0RVQUxfMCkgLyohPCBBREMgZHVhbCBtb2RlIGVuYWJsZWQ6IENvbWJpbmVkIGdyb3VwIFwKKyAgcmVndWxhciBpbnRlcmxlYXZlZCArIGdyb3VwIGluamVjdGVkIHNpbXVsdGFuZW91cyAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX01VTFRJX0RNQV9UUkFOU0ZFUiAgTXVsdGltb2RlIC0gRE1BIHRyYW5zZmVyCisgKiBAeworICovCisjZGVmaW5lIExMX0FEQ19NVUxUSV9SRUdfRE1BX0VBQ0hfQURDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKDB4MDAwMDAwMDBVTCkgLyohPCBBREMgbXVsdGltb2RlIGdyb3VwIHJlZ3VsYXIgICAgICAgICAgICAgICAgICAgICAgXAorY29udmVyc2lvbnMgYXJlIHRyYW5zZmVycmVkIGJ5IERNQTogZWFjaCBBREMgdXNlcyBpdHMgb3duIERNQSBjaGFubmVsLCBcCit3aXRoIGl0cyBpbmRpdmlkdWFsIERNQSB0cmFuc2ZlciBzZXR0aW5ncyAqLworI2RlZmluZSBMTF9BRENfTVVMVElfUkVHX0RNQV9MSU1JVF9SRVMxMl8xMEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfQ0NSX01ETUFfMSkgLyohPCBBREMgbXVsdGltb2RlIGdyb3VwIHJlZ3VsYXIgICAgICAgICAgICAgICAgICAgICAgIFwKK2NvbnZlcnNpb25zIGFyZSB0cmFuc2ZlcnJlZCBieSBETUEsIG9uZSBETUEgY2hhbm5lbCBmb3IgYm90aCBBREMoRE1BIG9mICAgXAorQURDIG1hc3RlciksIGluIGxpbWl0ZWQgbW9kZSAob25lIHNob3QgbW9kZSk6IERNQSB0cmFuc2ZlciByZXF1ZXN0cyAgICAgICBcCithcmUgc3RvcHBlZCB3aGVuIG51bWJlciBvZiBETUEgZGF0YSB0cmFuc2ZlcnMgKG51bWJlciBvZiBBREMgY29udmVyc2lvbnMpIFwKK2lzIHJlYWNoZWQuIFRoaXMgQURDIG1vZGUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoIERNQSBtb2RlICAgICAgICAgICAgXAorbm9uLWNpcmN1bGFyLiBTZXR0aW5nIGZvciBBREMgcmVzb2x1dGlvbiBvZiAxMiBhbmQgMTAgYml0cyAqLworI2RlZmluZSBMTF9BRENfTVVMVElfUkVHX0RNQV9MSU1JVF9SRVM4XzZCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19DQ1JfTURNQV8xIHwgQURDX0NDUl9NRE1BXzApIC8qITwgQURDIG11bHRpbW9kZSBncm91cCByZWd1bGFyICAgICAgICBcCisgIGNvbnZlcnNpb25zIGFyZSB0cmFuc2ZlcnJlZCBieSBETUEsIG9uZSBETUEgY2hhbm5lbCBmb3IgYm90aCBBREMoRE1BIG9mICAgXAorICBBREMgbWFzdGVyKSwgaW4gbGltaXRlZCBtb2RlIChvbmUgc2hvdCBtb2RlKTogRE1BIHRyYW5zZmVyIHJlcXVlc3RzICAgICAgIFwKKyAgYXJlIHN0b3BwZWQgd2hlbiBudW1iZXIgb2YgRE1BIGRhdGEgdHJhbnNmZXJzIChudW1iZXIgb2YgQURDIGNvbnZlcnNpb25zKSBcCisgIGlzIHJlYWNoZWQuIFRoaXMgQURDIG1vZGUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoIERNQSBtb2RlICAgICAgICAgICAgXAorICBub24tY2lyY3VsYXIuIFNldHRpbmcgZm9yIEFEQyByZXNvbHV0aW9uIG9mIDggYW5kIDYgYml0cyAqLworI2RlZmluZSBMTF9BRENfTVVMVElfUkVHX0RNQV9VTkxNVF9SRVMxMl8xMEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfQ0NSX0RNQUNGRyB8IEFEQ19DQ1JfTURNQV8xKSAvKiE8IEFEQyBtdWx0aW1vZGUgZ3JvdXAgcmVndWxhciAgICAgIFwKKyAgY29udmVyc2lvbnMgYXJlIHRyYW5zZmVycmVkIGJ5IERNQSwgb25lIERNQSBjaGFubmVsIGZvciBib3RoIEFEQyhETUEgb2YgXAorICBBREMgbWFzdGVyKSwgaW4gdW5saW1pdGVkIG1vZGU6IERNQSB0cmFuc2ZlciByZXF1ZXN0cyBhcmUgdW5saW1pdGVkLCAgICBcCisgIHdoYXRldmVyIG51bWJlciBvZiBETUEgZGF0YSB0cmFuc2ZlcnJlZCAobnVtYmVyIG9mIEFEQyBjb252ZXJzaW9ucykuICAgIFwKKyAgVGhpcyBBREMgbW9kZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHdpdGggRE1BIG1vZGUgY2lyY3VsYXIuICAgICAgICAgICAgXAorICBTZXR0aW5nIGZvciBBREMgcmVzb2x1dGlvbiBvZiAxMiBhbmQgMTAgYml0cyAqLworI2RlZmluZSBMTF9BRENfTVVMVElfUkVHX0RNQV9VTkxNVF9SRVM4XzZCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19DQ1JfRE1BQ0ZHIHwgQURDX0NDUl9NRE1BXzEgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBBRENfQ0NSX01ETUFfMCkgLyohPCBBREMgbXVsdGltb2RlIGdyb3VwIHJlZ3VsYXIgICAgICAgICAgICAgICAgICAgICAgXAorY29udmVyc2lvbnMgYXJlIHRyYW5zZmVycmVkIGJ5IERNQSwgb25lIERNQSBjaGFubmVsIGZvciBib3RoIEFEQyAoRE1BIG9mIFwKK0FEQyBtYXN0ZXIpLCBpbiB1bmxpbWl0ZWQgbW9kZTogRE1BIHRyYW5zZmVyIHJlcXVlc3RzIGFyZSB1bmxpbWl0ZWQsICAgICBcCit3aGF0ZXZlciBudW1iZXIgb2YgRE1BIGRhdGEgdHJhbnNmZXJyZWQgKG51bWJlciBvZiBBREMgY29udmVyc2lvbnMpLiAgICAgXAorVGhpcyBBREMgbW9kZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHdpdGggRE1BIG1vZGUgY2lyY3VsYXIuICAgICAgICAgICAgIFwKK1NldHRpbmcgZm9yIEFEQyByZXNvbHV0aW9uIG9mIDggYW5kIDYgYml0cyAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX01VTFRJX1RXT1NNUF9ERUxBWSAgTXVsdGltb2RlIC0gRGVsYXkgYmV0d2VlbiB0d28KKyAqIHNhbXBsaW5nIHBoYXNlcworICogQHsKKyAqLworI2RlZmluZSBMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzFDWUNMRSAgICAgICAgICAgICAgXAorICAoMHgwMDAwMDAwMFVMKSAvKiE8IEFEQyBtdWx0aW1vZGUgZGVsYXkgYmV0d2VlbiB0d28gXAorc2FtcGxpbmcgcGhhc2VzOiAxIEFEQyBjbG9jayBjeWNsZSAqLworI2RlZmluZSBMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzJDWUNMRVMgICAgICAgICAgICAgICAgXAorICAoQURDX0NDUl9ERUxBWV8wKSAvKiE8IEFEQyBtdWx0aW1vZGUgZGVsYXkgYmV0d2VlbiB0d28gXAorc2FtcGxpbmcgcGhhc2VzOiAyIEFEQyBjbG9jayBjeWNsZXMgKi8KKyNkZWZpbmUgTExfQURDX01VTFRJX1RXT1NNUF9ERUxBWV8zQ1lDTEVTICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19DQ1JfREVMQVlfMSkgLyohPCBBREMgbXVsdGltb2RlIGRlbGF5IGJldHdlZW4gdHdvIFwKK3NhbXBsaW5nIHBoYXNlczogMyBBREMgY2xvY2sgY3ljbGVzICovCisjZGVmaW5lIExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfNENZQ0xFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfQ0NSX0RFTEFZXzEgfCBBRENfQ0NSX0RFTEFZXzApIC8qITwgQURDIG11bHRpbW9kZSBkZWxheSBiZXR3ZWVuIHR3byBcCisgIHNhbXBsaW5nIHBoYXNlczogNCBBREMgY2xvY2sgY3ljbGVzICovCisjZGVmaW5lIExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfNUNZQ0xFUyAgICAgICAgICAgICAgICBcCisgIChBRENfQ0NSX0RFTEFZXzIpIC8qITwgQURDIG11bHRpbW9kZSBkZWxheSBiZXR3ZWVuIHR3byBcCitzYW1wbGluZyBwaGFzZXM6IDUgQURDIGNsb2NrIGN5Y2xlcyAqLworI2RlZmluZSBMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzZDWUNMRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0NDUl9ERUxBWV8yIHwgQURDX0NDUl9ERUxBWV8wKSAvKiE8IEFEQyBtdWx0aW1vZGUgZGVsYXkgYmV0d2VlbiB0d28gXAorICBzYW1wbGluZyBwaGFzZXM6IDYgQURDIGNsb2NrIGN5Y2xlcyAqLworI2RlZmluZSBMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzdDWUNMRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0NDUl9ERUxBWV8yIHwgQURDX0NDUl9ERUxBWV8xKSAvKiE8IEFEQyBtdWx0aW1vZGUgZGVsYXkgYmV0d2VlbiB0d28gXAorICBzYW1wbGluZyBwaGFzZXM6IDcgQURDIGNsb2NrIGN5Y2xlcyAqLworI2RlZmluZSBMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzhDWUNMRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0NDUl9ERUxBWV8yIHwgQURDX0NDUl9ERUxBWV8xIHwgQURDX0NDUl9ERUxBWV8wKSAvKiE8IEFEQyBtdWx0aW1vZGUgXAorICAgICAgICAgICAgICAgICAgIGRlbGF5IGJldHdlZW4gdHdvIHNhbXBsaW5nIHBoYXNlczogOCBBREMgY2xvY2sgY3ljbGVzICovCisjZGVmaW5lIExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfOUNZQ0xFUyAgICAgICAgICAgICAgICBcCisgIChBRENfQ0NSX0RFTEFZXzMpIC8qITwgQURDIG11bHRpbW9kZSBkZWxheSBiZXR3ZWVuIHR3byBcCitzYW1wbGluZyBwaGFzZXM6IDkgQURDIGNsb2NrIGN5Y2xlcyAqLworI2RlZmluZSBMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzEwQ1lDTEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0NDUl9ERUxBWV8zIHwgQURDX0NDUl9ERUxBWV8wKSAvKiE8IEFEQyBtdWx0aW1vZGUgZGVsYXkgYmV0d2VlbiB0d28gXAorICBzYW1wbGluZyBwaGFzZXM6IDEwIEFEQyBjbG9jayBjeWNsZXMgKi8KKyNkZWZpbmUgTExfQURDX01VTFRJX1RXT1NNUF9ERUxBWV8xMUNZQ0xFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19DQ1JfREVMQVlfMyB8IEFEQ19DQ1JfREVMQVlfMSkgLyohPCBBREMgbXVsdGltb2RlIGRlbGF5IGJldHdlZW4gdHdvIFwKKyAgc2FtcGxpbmcgcGhhc2VzOiAxMSBBREMgY2xvY2sgY3ljbGVzICovCisjZGVmaW5lIExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfMTJDWUNMRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfQ0NSX0RFTEFZXzMgfCBBRENfQ0NSX0RFTEFZXzEgfCBBRENfQ0NSX0RFTEFZXzApIC8qITwgQURDIG11bHRpbW9kZSBcCisgICAgICAgICAgICAgICAgICAgZGVsYXkgYmV0d2VlbiB0d28gc2FtcGxpbmcgcGhhc2VzOiAxMiBBREMgY2xvY2sgY3ljbGVzICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfTVVMVElfTUFTVEVSX1NMQVZFICBNdWx0aW1vZGUgLSBBREMgbWFzdGVyIG9yIHNsYXZlCisgKiBAeworICovCisjZGVmaW5lIExMX0FEQ19NVUxUSV9NQVNURVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfQ0RSX1JEQVRBX01TVCkgLyohPCBJbiBtdWx0aW1vZGUsIHNlbGVjdGlvbiBhbW9uZyBzZXZlcmFsIEFEQyBcCisgIGluc3RhbmNlczogQURDIG1hc3RlciAqLworI2RlZmluZSBMTF9BRENfTVVMVElfU0xBVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDX0NEUl9SREFUQV9TTFYpIC8qITwgSW4gbXVsdGltb2RlLCBzZWxlY3Rpb24gYW1vbmcgc2V2ZXJhbCBBREMgXAorICBpbnN0YW5jZXM6IEFEQyBzbGF2ZSAqLworI2RlZmluZSBMTF9BRENfTVVMVElfTUFTVEVSX1NMQVZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBRENfQ0RSX1JEQVRBX1NMViB8IEFEQ19DRFJfUkRBVEFfTVNUKSAvKiE8IEluIG11bHRpbW9kZSwgc2VsZWN0aW9uIGFtb25nIFwKKyAgICAgICAgICAgICAgICAgICAgc2V2ZXJhbCBBREMgaW5zdGFuY2VzOiBib3RoIEFEQyBtYXN0ZXIgYW5kIEFEQyBzbGF2ZSAqLworLyoqCisgKiBAfQorICovCisKKyNlbmRpZiAvKiBBRENfTVVMVElNT0RFX1NVUFBPUlQgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfSEVMUEVSX01BQ1JPICBEZWZpbml0aW9ucyBvZiBjb25zdGFudHMgdXNlZCBieSBoZWxwZXIKKyAqIG1hY3JvCisgKiBAeworICovCisjZGVmaW5lIExMX0FEQ19URU1QRVJBVFVSRV9DQUxDX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoaW50MTZfdCkweDdGRkYpIC8qIFRlbXBlcmF0dXJlIGNhbGN1bGF0aW9uIGVycm9yIHVzaW5nIGhlbHBlciBtYWNybyAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgIEByZWYgX19MTF9BRENfQ0FMQ19URU1QRVJBVFVSRSgpLCBkdWUgdG8gaXNzdWUgb24gICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgIGNhbGlicmF0aW9uIHBhcmFtZXRlcnMuIFRoaXMgdmFsdWUgaXMgY29kZWQgb24gMTYgYml0cyBcCisgICAgICAgICAgICAgICAgICAgICAgICh0byBmaXQgb24gc2lnbmVkIHdvcmQgb3IgZG91YmxlIHdvcmQpIGFuZCBjb3JyZXNwb25kcyBcCisgICAgICAgICAgICAgICAgICAgICAgIHRvIGFuIGluY29uc2lzdGVudCB0ZW1wZXJhdHVyZSB2YWx1ZS4gKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19IV19ERUxBWVMgIERlZmluaXRpb25zIG9mIEFEQyBoYXJkd2FyZSBjb25zdHJhaW50cworICogZGVsYXlzCisgKiBAbm90ZSAgIE9ubHkgQURDIHBlcmlwaGVyYWwgSFcgZGVsYXlzIGFyZSBkZWZpbmVkIGluIEFEQyBMTCBkcml2ZXIgZHJpdmVyLAorICogICAgICAgICBub3QgdGltZW91dCB2YWx1ZXMuCisgKiAgICAgICAgIEZvciBkZXRhaWxzIG9uIGRlbGF5cyB2YWx1ZXMsIHJlZmVyIHRvIGRlc2NyaXB0aW9ucyBpbiBzb3VyY2UgY29kZQorICogICAgICAgICBhYm92ZSBlYWNoIGxpdGVyYWwgZGVmaW5pdGlvbi4KKyAqIEB7CisgKi8KKworLyogTm90ZTogT25seSBBREMgcGVyaXBoZXJhbCBIVyBkZWxheXMgYXJlIGRlZmluZWQgaW4gQURDIExMIGRyaXZlciBkcml2ZXIsICAgKi8KKy8qICAgICAgIG5vdCB0aW1lb3V0IHZhbHVlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICBUaW1lb3V0IHZhbHVlcyBmb3IgQURDIG9wZXJhdGlvbnMgYXJlIGRlcGVuZGVudCB0byBkZXZpY2UgY2xvY2sgICAgICAqLworLyogICAgICAgY29uZmlndXJhdGlvbiAoc3lzdGVtIGNsb2NrIHZlcnN1cyBBREMgY2xvY2spLCAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIGFuZCB0aGVyZWZvcmUgbXVzdCBiZSBkZWZpbmVkIGluIHVzZXIgYXBwbGljYXRpb24uICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICBJbmRpY2F0aW9ucyBmb3IgZXN0aW1hdGlvbiBvZiBBREMgdGltZW91dCBkZWxheXMsIGZvciB0aGlzICAgICAgICAgICAqLworLyogICAgICAgU1RNMzIgc2VyaWVzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIC0gQURDIGNhbGlicmF0aW9uIHRpbWU6IG1heGltdW0gZGVsYXkgaXMgMTEyL2ZBREMuICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgIChyZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0LCBwYXJhbWV0ZXIgInRDQUwiKSAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgLSBBREMgZW5hYmxlIHRpbWU6IG1heGltdW0gZGVsYXkgaXMgMSBjb252ZXJzaW9uIGN5Y2xlLiAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgKHJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQsIHBhcmFtZXRlciAidFNUQUIiKSAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAtIEFEQyBkaXNhYmxlIHRpbWU6IG1heGltdW0gZGVsYXkgc2hvdWxkIGJlIGEgZmV3IEFEQyBjbG9jayBjeWNsZXMgICAqLworLyogICAgICAgLSBBREMgc3RvcCBjb252ZXJzaW9uIHRpbWU6IG1heGltdW0gZGVsYXkgc2hvdWxkIGJlIGEgZmV3IEFEQyBjbG9jayAgKi8KKy8qICAgICAgICAgY3ljbGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAtIEFEQyBjb252ZXJzaW9uIHRpbWU6IGR1cmF0aW9uIGRlcGVuZGluZyBvbiBBREMgY2xvY2sgYW5kIEFEQyAgICAgICAqLworLyogICAgICAgICBjb25maWd1cmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgKHJlZmVyIHRvIGRldmljZSByZWZlcmVuY2UgbWFudWFsLCBzZWN0aW9uICJUaW1pbmciKSAgICAgICAgICAgICAgICovCisKKy8qIERlbGF5IGZvciBBREMgc3RhYmlsaXphdGlvbiB0aW1lIChBREMgdm9sdGFnZSByZWd1bGF0b3Igc3RhcnQtdXAgdGltZSkgICAgICovCisvKiBEZWxheSBzZXQgdG8gbWF4aW11bSB2YWx1ZSAocmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCwgICAgICAgICAgICAgICAgICAgICAqLworLyogcGFyYW1ldGVyICJ0QURDVlJFR19TVFVQIikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFVuaXQ6IHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0FEQ19ERUxBWV9JTlRFUk5BTF9SRUdVTF9TVEFCX1VTICAgICAgICAgICAgICAgICBcCisgICgyMFVMKSAvKiE8IERlbGF5IGZvciBBREMgc3RhYmlsaXphdGlvbiB0aW1lIChBREMgdm9sdGFnZSBcCisgICAgICAgICByZWd1bGF0b3Igc3RhcnQtdXAgdGltZSkgKi8KKworLyogRGVsYXkgZm9yIGludGVybmFsIHZvbHRhZ2UgcmVmZXJlbmNlIHN0YWJpbGl6YXRpb24gdGltZS4gICAgICAgICAgICAgICAgICAgKi8KKy8qIERlbGF5IHNldCB0byBtYXhpbXVtIHZhbHVlIChyZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0LCAgICAgICAgICAgICAgICAgICAgICovCisvKiBwYXJhbWV0ZXIgInRzdGFydF92cmVmaW50IikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVW5pdDogdXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfQURDX0RFTEFZX1ZSRUZJTlRfU1RBQl9VUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoMTJVTCkgLyohPCBEZWxheSBmb3IgaW50ZXJuYWwgdm9sdGFnZSByZWZlcmVuY2Ugc3RhYmlsaXphdGlvbiBcCisgICAgICAgICAgICAgIHRpbWUgKi8KKworLyogRGVsYXkgZm9yIHRlbXBlcmF0dXJlIHNlbnNvciBzdGFiaWxpemF0aW9uIHRpbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIExpdGVyYWwgc2V0IHRvIG1heGltdW0gdmFsdWUgKHJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQsICAgICAgICAgICAgICAgICAgICovCisvKiBwYXJhbWV0ZXIgInRTVEFSVCIpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVW5pdDogdXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfQURDX0RFTEFZX1RFTVBTRU5TT1JfU1RBQl9VUyBcCisgICgxMjBVTCkgLyohPCBEZWxheSBmb3IgdGVtcGVyYXR1cmUgc2Vuc29yIHN0YWJpbGl6YXRpb24gdGltZSAqLworI2RlZmluZSBMTF9BRENfREVMQVlfVEVNUFNFTlNPUl9CVUZGRVJfU1RBQl9VUyAgICAgICAgICAgICAgICAgIFwKKyAgKDE1VUwpIC8qITwgRGVsYXkgZm9yIHRlbXBlcmF0dXJlIHNlbnNvciBidWZmZXIgc3RhYmlsaXphdGlvbiBcCisgICAgICAgICAgICAgIHRpbWUgKHN0YXJ0aW5nIGZyb20gQURDIGVuYWJsZSwgcmVmZXIgdG8gICAgICAgICAgXAorICAgICAgICAgICAgICBAcmVmIExMX0FEQ19FbmFibGUoKSkgKi8KKworLyogRGVsYXkgcmVxdWlyZWQgYmV0d2VlbiBBREMgZW5kIG9mIGNhbGlicmF0aW9uIGFuZCBBREMgZW5hYmxlLiAgICAgICAgICAgICAgKi8KKy8qIE5vdGU6IE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBhIG1pbmltdW0gbnVtYmVyIG9mIEFEQyBjbG9jayBjeWNsZXMgICAgICAgICAgICovCisvKiAgICAgICBhcmUgcmVxdWlyZWQgYmV0d2VlbiBBREMgZW5kIG9mIGNhbGlicmF0aW9uIGFuZCBBREMgZW5hYmxlLiAgICAgICAgICAqLworLyogICAgICAgV2FpdCB0aW1lIGNhbiBiZSBjb21wdXRlZCBpbiB1c2VyIGFwcGxpY2F0aW9uIGJ5IHdhaXRpbmcgZm9yIHRoZSAgICAgKi8KKy8qICAgICAgIGVxdWl2YWxlbnQgbnVtYmVyIG9mIENQVSBjeWNsZXMsIGJ5IHRha2luZyBpbnRvIGFjY291bnQgICAgICAgICAgICAgICovCisvKiAgICAgICByYXRpbyBvZiBDUFUgY2xvY2sgdmVyc3VzIEFEQyBjbG9jayBwcmVzY2FsZXJzLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogVW5pdDogQURDIGNsb2NrIGN5Y2xlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfQURDX0RFTEFZX0NBTElCX0VOQUJMRV9BRENfQ1lDTEVTICAgICAgICAgICAgICAgXAorICAoNFVMKSAvKiE8IERlbGF5IHJlcXVpcmVkIGJldHdlZW4gQURDIGVuZCBvZiBjYWxpYnJhdGlvbiBcCisgICAgICAgICAgICAgYW5kIEFEQyBlbmFibGUgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBBRENfTExfRXhwb3J0ZWRfTWFjcm9zIEFEQyBFeHBvcnRlZCBNYWNyb3MKKyAqIEB7CisgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRU1fV1JJVEVfUkVBRCBDb21tb24gd3JpdGUgYW5kIHJlYWQgcmVnaXN0ZXJzIE1hY3JvcworICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiAgV3JpdGUgYSB2YWx1ZSBpbiBBREMgcmVnaXN0ZXIKKyAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIEFEQyBJbnN0YW5jZQorICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHdyaXR0ZW4KKyAqIEBwYXJhbSAgX19WQUxVRV9fIFZhbHVlIHRvIGJlIHdyaXR0ZW4gaW4gdGhlIHJlZ2lzdGVyCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBMTF9BRENfV3JpdGVSZWcoX19JTlNUQU5DRV9fLCBfX1JFR19fLCBfX1ZBTFVFX18pIFwKKyAgV1JJVEVfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXywgKF9fVkFMVUVfXykpCisKKy8qKgorICogQGJyaWVmICBSZWFkIGEgdmFsdWUgaW4gQURDIHJlZ2lzdGVyCisgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBBREMgSW5zdGFuY2UKKyAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSByZWFkCisgKiBAcmV0dmFsIFJlZ2lzdGVyIHZhbHVlCisgKi8KKyNkZWZpbmUgTExfQURDX1JlYWRSZWcoX19JTlNUQU5DRV9fLCBfX1JFR19fKSBSRUFEX1JFRyhfX0lOU1RBTkNFX18tPl9fUkVHX18pCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRU1fSEVMUEVSX01BQ1JPIEFEQyBoZWxwZXIgbWFjcm8KKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBnZXQgQURDIGNoYW5uZWwgbnVtYmVyIGluIGRlY2ltYWwgZm9ybWF0CisgKiAgICAgICAgIGZyb20gbGl0ZXJhbHMgTExfQURDX0NIQU5ORUxfeC4KKyAqIEBub3RlICAgRXhhbXBsZToKKyAqICAgICAgICAgICBfX0xMX0FEQ19DSEFOTkVMX1RPX0RFQ0lNQUxfTkIoTExfQURDX0NIQU5ORUxfNCkKKyAqICAgICAgICAgICB3aWxsIHJldHVybiBkZWNpbWFsIG51bWJlciAiNCIuCisgKiBAbm90ZSAgIFRoZSBpbnB1dCBjYW4gYmUgYSB2YWx1ZSBmcm9tIGZ1bmN0aW9ucyB3aGVyZSBhIGNoYW5uZWwKKyAqICAgICAgICAgbnVtYmVyIGlzIHJldHVybmVkLCBlaXRoZXIgZGVmaW5lZCB3aXRoIG51bWJlcgorICogICAgICAgICBvciB3aXRoIGJpdGZpZWxkIChvbmx5IG9uZSBiaXQgbXVzdCBiZSBzZXQpLgorICogQHBhcmFtICBfX0NIQU5ORUxfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMSAgICAgICAgICAgICAgICAgKDgpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8yICAgICAgICAgICAgICAgICAoOCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzMgICAgICAgICAgICAgICAgICg4KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNCAgICAgICAgICAgICAgICAgKDgpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF81ICAgICAgICAgICAgICAgICAoOCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE2CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQgICAgICAgICAgICg3KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUl9BREMxICAgKDEpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SX0FEQzUgICAoNSkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZCQVQgICAgICAgICAgICAgICg2KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QMSAgICAgICAgICAgKDEpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAyICAgICAgICAgICAoMikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDNfQURDMiAgICAgICgyKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QM19BREMzICAgICAgKDMpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVA0ICAgICAgICAgICAoNSkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDUgICAgICAgICAgICg1KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QNiAgICAgICAgICAgKDQpCisgKgorICogICAgICAgICAoMSkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMS5cbgorICogICAgICAgICAoMikgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMi5cbgorICogICAgICAgICAoMykgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMy5cbgorICogICAgICAgICAoNCkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDNC5cbgorICogICAgICAgICAoNSkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDNS5cbgorICogICAgICAgICAoNikgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZXM6IEFEQzEsCisgKiBBREMzLCBBREM1LlxuICg3KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlczoKKyAqIEFEQzEsIEFEQzMsIEFEQzQsIEFEQzUuXG4gT24gdGhpcyBTVE0zMiBzZXJpZXMsIGFsbCBBREN4IGFyZSBub3QgYXZhaWxhYmxlIG9uCisgKiBhbGwgZGV2aWNlcy4gUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgbW9yZSBkZXRhaWxzLiAoOCkgT24gU1RNMzJHNCwgZmFzdAorICogY2hhbm5lbCBhbGxvd3M6IDIuNSAoc2FtcGxpbmcpICsgMTIuNSAoY29udmVyc2lvbikgPSAxNSBBREMgY2xvY2sgY3ljbGVzCisgKiAoZkFEQykgdG8gY29udmVydCBpbiAxMi1iaXQgcmVzb2x1dGlvbi4gT3RoZXIgY2hhbm5lbHMgYXJlIHNsb3cgY2hhbm5lbHMKKyAqIGFsbG93czogNi41IChzYW1wbGluZykgKyAxMi41IChjb252ZXJzaW9uKSA9IDE5IEFEQyBjbG9jayBjeWNsZXMgKGZBREMpIHRvCisgKiBjb252ZXJ0IGluIDEyLWJpdCByZXNvbHV0aW9uLlxuCisgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MTgKKyAqLworI2RlZmluZSBfX0xMX0FEQ19DSEFOTkVMX1RPX0RFQ0lNQUxfTkIoX19DSEFOTkVMX18pICAgICAgICBcCisgICgoKChfX0NIQU5ORUxfXykgJiBBRENfQ0hBTk5FTF9JRF9CSVRGSUVMRF9NQVNLKSA9PSAwVUwpIFwKKyAgICAgICA/ICgoKF9fQ0hBTk5FTF9fKSAmIEFEQ19DSEFOTkVMX0lEX05VTUJFUl9NQVNLKSA+PiAgXAorICAgICAgICAgIEFEQ19DSEFOTkVMX0lEX05VTUJFUl9CSVRPRkZTRVRfUE9TKSAgICAgICAgICAgICBcCisgICAgICAgOiAoKHVpbnQzMl90KVBPU0lUSU9OX1ZBTCgoX19DSEFOTkVMX18pKSkpCisKKy8qKgorICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gZ2V0IEFEQyBjaGFubmVsIGluIGxpdGVyYWwgZm9ybWF0IExMX0FEQ19DSEFOTkVMX3gKKyAqICAgICAgICAgZnJvbSBudW1iZXIgaW4gZGVjaW1hbCBmb3JtYXQuCisgKiBAbm90ZSAgIEV4YW1wbGU6CisgKiAgICAgICAgICAgX19MTF9BRENfREVDSU1BTF9OQl9UT19DSEFOTkVMKDQpCisgKiAgICAgICAgICAgd2lsbCByZXR1cm4gYSBkYXRhIGVxdWl2YWxlbnQgdG8gIkxMX0FEQ19DSEFOTkVMXzQiLgorICogQHBhcmFtICBfX0RFQ0lNQUxfTkJfXyBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTE4CisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8wCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xICAgICAgICAgICAgICAgICAoOCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzIgICAgICAgICAgICAgICAgICg4KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMyAgICAgICAgICAgICAgICAgKDgpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF80ICAgICAgICAgICAgICAgICAoOCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzUgICAgICAgICAgICAgICAgICg4KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzExCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE3CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xOAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVlJFRklOVCAgICAgICAgICAgKDcpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SX0FEQzEgICAoMSkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1JfQURDNSAgICg1KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVkJBVCAgICAgICAgICAgICAgKDYpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAxICAgICAgICAgICAoMSkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDIgICAgICAgICAgICgyKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QM19BREMyICAgICAgKDIpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAzX0FEQzMgICAgICAoMykKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDQgICAgICAgICAgICg1KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QNSAgICAgICAgICAgKDUpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVA2ICAgICAgICAgICAoNCkKKyAqCisgKiAgICAgICAgICgxKSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMxLlxuCisgKiAgICAgICAgICgyKSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMyLlxuCisgKiAgICAgICAgICgzKSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMzLlxuCisgKiAgICAgICAgICg0KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREM0LlxuCisgKiAgICAgICAgICg1KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREM1LlxuCisgKiAgICAgICAgICg2KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlczogQURDMSwKKyAqIEFEQzMsIEFEQzUuXG4gKDcpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2VzOgorICogQURDMSwgQURDMywgQURDNCwgQURDNS5cbiBPbiB0aGlzIFNUTTMyIHNlcmllcywgYWxsIEFEQ3ggYXJlIG5vdCBhdmFpbGFibGUgb24KKyAqIGFsbCBkZXZpY2VzLiBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBtb3JlIGRldGFpbHMuICg4KSBPbiBTVE0zMkc0LCBmYXN0CisgKiBjaGFubmVsIGFsbG93czogMi41IChzYW1wbGluZykgKyAxMi41IChjb252ZXJzaW9uKSA9IDE1IEFEQyBjbG9jayBjeWNsZXMKKyAqIChmQURDKSB0byBjb252ZXJ0IGluIDEyLWJpdCByZXNvbHV0aW9uLiBPdGhlciBjaGFubmVscyBhcmUgc2xvdyBjaGFubmVscworICogYWxsb3dzOiA2LjUgKHNhbXBsaW5nKSArIDEyLjUgKGNvbnZlcnNpb24pID0gMTkgQURDIGNsb2NrIGN5Y2xlcyAoZkFEQykgdG8KKyAqIGNvbnZlcnQgaW4gMTItYml0IHJlc29sdXRpb24uXG4gKDEsIDIsIDMsIDQsIDUsIDcpIEZvciBBREMgY2hhbm5lbCByZWFkIGJhY2sKKyAqIGZyb20gQURDIHJlZ2lzdGVyLCBjb21wYXJpc29uIHdpdGggaW50ZXJuYWwgY2hhbm5lbCBwYXJhbWV0ZXIgdG8gYmUgZG9uZQorICogICAgICAgICAgICAgICAgICAgICAgdXNpbmcgaGVscGVyIG1hY3JvIEByZWYKKyAqIF9fTExfQURDX0NIQU5ORUxfSU5URVJOQUxfVE9fRVhURVJOQUwoKS4KKyAqLworI2RlZmluZSBfX0xMX0FEQ19ERUNJTUFMX05CX1RPX0NIQU5ORUwoX19ERUNJTUFMX05CX18pICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoX19ERUNJTUFMX05CX18pIDw9IDlVTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgPyAoKChfX0RFQ0lNQUxfTkJfXykgPDwgQURDX0NIQU5ORUxfSURfTlVNQkVSX0JJVE9GRlNFVF9QT1MpIHwgICAgICAgXAorICAgICAgICAgIChBRENfQVdEMkNSX0FXRDJDSF8wIDw8IChfX0RFQ0lNQUxfTkJfXykpIHwgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoQURDX1NNUFIxX1JFR09GRlNFVCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICgoKDNVTCAqIChfX0RFQ0lNQUxfTkJfXykpKSA8PCBBRENfQ0hBTk5FTF9TTVB4X0JJVE9GRlNFVF9QT1MpKSkgXAorICAgICAgIDogKCgoX19ERUNJTUFMX05CX18pIDw8IEFEQ19DSEFOTkVMX0lEX05VTUJFUl9CSVRPRkZTRVRfUE9TKSB8ICAgICAgIFwKKyAgICAgICAgICAoQURDX0FXRDJDUl9BV0QyQ0hfMCA8PCAoX19ERUNJTUFMX05CX18pKSB8ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKEFEQ19TTVBSMl9SRUdPRkZTRVQgfCAoKCgzVUwgKiAoKF9fREVDSU1BTF9OQl9fKS0xMFVMKSkpICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX1BPUykpKSkKKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHNlbGVjdGVkIGNoYW5uZWwKKyAgKiAgICAgICAgIGNvcnJlc3BvbmRzIHRvIGxpdGVyYWwgZGVmaW5pdGlvbnMgb2YgZHJpdmVyLgorICAqIEBub3RlICAgVGhlIGRpZmZlcmVudCBsaXRlcmFsIGRlZmluaXRpb25zIG9mIEFEQyBjaGFubmVscyBhcmU6CisgICogICAgICAgICAtIEFEQyBpbnRlcm5hbCBjaGFubmVsOgorICAqICAgICAgICAgICBMTF9BRENfQ0hBTk5FTF9WUkVGSU5ULCBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SLCAuLi4KKyAgKiAgICAgICAgIC0gQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIGEgR1BJTyBwaW4pOgorICAqICAgICAgICAgICBMTF9BRENfQ0hBTk5FTF8xLCBMTF9BRENfQ0hBTk5FTF8yLCAuLi4KKyAgKiBAbm90ZSAgIFRoZSBjaGFubmVsIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgZGVmaW5lZCBmcm9tIGxpdGVyYWwKKyAgKiAgICAgICAgIGRlZmluaXRpb24gb2YgYSBBREMgaW50ZXJuYWwgY2hhbm5lbCAoTExfQURDX0NIQU5ORUxfVlJFRklOVCwKKyAgKiAgICAgICAgIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1IsIC4uLiksCisgICogICAgICAgICBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoTExfQURDX0NIQU5ORUxfMSwgTExfQURDX0NIQU5ORUxfMiwgLi4uKSwKKyAgKiAgICAgICAgIG11c3Qgbm90IGJlIGEgdmFsdWUgZnJvbSBmdW5jdGlvbnMgd2hlcmUgYSBjaGFubmVsIG51bWJlciBpcworICAqICAgICAgICAgcmV0dXJuZWQgZnJvbSBBREMgcmVnaXN0ZXJzLAorICAqICAgICAgICAgYmVjYXVzZSBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgY2hhbm5lbHMgc2hhcmUgdGhlIHNhbWUgY2hhbm5lbAorICAqICAgICAgICAgbnVtYmVyIGluIEFEQyByZWdpc3RlcnMuIFRoZSBkaWZmZXJlbnRpYXRpb24gaXMgbWFkZSBvbmx5IHdpdGgKKyAgKiAgICAgICAgIHBhcmFtZXRlcnMgZGVmaW5pdGlvbnMgb2YgZHJpdmVyLgorICAqIEBwYXJhbSAgX19DSEFOTkVMX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMSAgICAgICAgICAgICAgICAgKDgpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMiAgICAgICAgICAgICAgICAgKDgpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMyAgICAgICAgICAgICAgICAgKDgpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNCAgICAgICAgICAgICAgICAgKDgpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNSAgICAgICAgICAgICAgICAgKDgpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF84CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQgICAgICAgICAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1JfQURDMSAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1JfQURDNSAgICg1KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZCQVQgICAgICAgICAgICAgICg2KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDEgICAgICAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDIgICAgICAgICAgICgyKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDNfQURDMiAgICAgICgyKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDNfQURDMyAgICAgICgzKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDQgICAgICAgICAgICg1KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDUgICAgICAgICAgICg1KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDYgICAgICAgICAgICg0KQorICAqCisgICogICAgICAgICAoMSkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMS5cbgorICAqICAgICAgICAgKDIpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzIuXG4KKyAgKiAgICAgICAgICgzKSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMzLlxuCisgICogICAgICAgICAoNCkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDNC5cbgorICAqICAgICAgICAgKDUpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzUuXG4KKyAgKiAgICAgICAgICg2KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlczogQURDMSwKKyAgQURDMywgQURDNS5cbgorICAqICAgICAgICAgKDcpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2VzOiBBREMxLAorICBBREMzLCBBREM0LCBBREM1LlxuCisgICogICAgICAgICAgICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIGFsbCBBREN4IGFyZSBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzLgorICBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0CisgICogICAgICAgICAgICAgZm9yIG1vcmUgZGV0YWlscy4KKyAgKiAgICAgICAgICg4KSBPbiBTVE0zMkc0LCBmYXN0IGNoYW5uZWwgYWxsb3dzOiAyLjUgKHNhbXBsaW5nKSArIDEyLjUKKyAgKGNvbnZlcnNpb24pID0gMTUgQURDIGNsb2NrIGN5Y2xlcyAoZkFEQykgdG8KKyAgKiAgICAgICAgICAgICBjb252ZXJ0IGluIDEyLWJpdCByZXNvbHV0aW9uLgorICAqICAgICAgICAgICAgIE90aGVyIGNoYW5uZWxzIGFyZSBzbG93IGNoYW5uZWxzICBhbGxvd3M6IDYuNSAoc2FtcGxpbmcpICsgMTIuNQorICAoY29udmVyc2lvbikgPSAxOSBBREMgY2xvY2sgY3ljbGVzCisgICogICAgICAgICAgICAgKGZBREMpIHRvIGNvbnZlcnQgaW4gMTItYml0IHJlc29sdXRpb24uXG4KKyAgKiBAcmV0dmFsIFZhbHVlICIwIiBpZiB0aGUgY2hhbm5lbCBjb3JyZXNwb25kcyB0byBhIHBhcmFtZXRlciBkZWZpbml0aW9uIG9mIGEKKyAgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIGEgR1BJTyBwaW4pLgorICAqICAgICAgICAgVmFsdWUgIjEiIGlmIHRoZSBjaGFubmVsIGNvcnJlc3BvbmRzIHRvIGEgcGFyYW1ldGVyIGRlZmluaXRpb24gb2YgYQorICBBREMgaW50ZXJuYWwgY2hhbm5lbC4KKyAgKi8KKyNkZWZpbmUgX19MTF9BRENfSVNfQ0hBTk5FTF9JTlRFUk5BTChfX0NIQU5ORUxfXykgXAorICAoKChfX0NIQU5ORUxfXykgJiBBRENfQ0hBTk5FTF9JRF9JTlRFUk5BTF9DSF9NQVNLKSAhPSAwVUwpCisKKy8qKgorICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gY29udmVydCBhIGNoYW5uZWwgZGVmaW5lZCBmcm9tIHBhcmFtZXRlcgorICogICAgICAgICBkZWZpbml0aW9uIG9mIGEgQURDIGludGVybmFsIGNoYW5uZWwgKExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQsCisgKiAgICAgICAgIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1IsIC4uLiksCisgKiAgICAgICAgIHRvIGl0cyBlcXVpdmFsZW50IHBhcmFtZXRlciBkZWZpbml0aW9uIG9mIGEgQURDIGV4dGVybmFsIGNoYW5uZWwKKyAqICAgICAgICAgKExMX0FEQ19DSEFOTkVMXzEsIExMX0FEQ19DSEFOTkVMXzIsIC4uLikuCisgKiBAbm90ZSAgIFRoZSBjaGFubmVsIHBhcmFtZXRlciBjYW4gYmUsIGFkZGl0aW9uYWxseSB0byBhIHZhbHVlCisgKiAgICAgICAgIGRlZmluZWQgZnJvbSBwYXJhbWV0ZXIgZGVmaW5pdGlvbiBvZiBhIEFEQyBpbnRlcm5hbCBjaGFubmVsCisgKiAgICAgICAgIChMTF9BRENfQ0hBTk5FTF9WUkVGSU5ULCBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SLCAuLi4pLAorICogICAgICAgICBhIHZhbHVlIGRlZmluZWQgZnJvbSBwYXJhbWV0ZXIgZGVmaW5pdGlvbiBvZgorICogICAgICAgICBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoTExfQURDX0NIQU5ORUxfMSwgTExfQURDX0NIQU5ORUxfMiwgLi4uKQorICogICAgICAgICBvciBhIHZhbHVlIGZyb20gZnVuY3Rpb25zIHdoZXJlIGEgY2hhbm5lbCBudW1iZXIgaXMgcmV0dXJuZWQKKyAqICAgICAgICAgZnJvbSBBREMgcmVnaXN0ZXJzLgorICogQHBhcmFtICBfX0NIQU5ORUxfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMSAgICAgICAgICAgICAgICAgKDgpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8yICAgICAgICAgICAgICAgICAoOCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzMgICAgICAgICAgICAgICAgICg4KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNCAgICAgICAgICAgICAgICAgKDgpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF81ICAgICAgICAgICAgICAgICAoOCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE2CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQgICAgICAgICAgICg3KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUl9BREMxICAgKDEpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SX0FEQzUgICAoNSkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZCQVQgICAgICAgICAgICAgICg2KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QMSAgICAgICAgICAgKDEpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAyICAgICAgICAgICAoMikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDNfQURDMiAgICAgICgyKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QM19BREMzICAgICAgKDMpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVA0ICAgICAgICAgICAoNSkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDUgICAgICAgICAgICg1KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QNiAgICAgICAgICAgKDQpCisgKgorICogICAgICAgICAoMSkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMS5cbgorICogICAgICAgICAoMikgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMi5cbgorICogICAgICAgICAoMykgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMy5cbgorICogICAgICAgICAoNCkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDNC5cbgorICogICAgICAgICAoNSkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDNS5cbgorICogICAgICAgICAoNikgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZXM6IEFEQzEsCisgKiBBREMzLCBBREM1LlxuICg3KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlczoKKyAqIEFEQzEsIEFEQzMsIEFEQzQsIEFEQzUuXG4gT24gdGhpcyBTVE0zMiBzZXJpZXMsIGFsbCBBREN4IGFyZSBub3QgYXZhaWxhYmxlIG9uCisgKiBhbGwgZGV2aWNlcy4gUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgbW9yZSBkZXRhaWxzLiAoOCkgT24gU1RNMzJHNCwgZmFzdAorICogY2hhbm5lbCBhbGxvd3M6IDIuNSAoc2FtcGxpbmcpICsgMTIuNSAoY29udmVyc2lvbikgPSAxNSBBREMgY2xvY2sgY3ljbGVzCisgKiAoZkFEQykgdG8gY29udmVydCBpbiAxMi1iaXQgcmVzb2x1dGlvbi4gT3RoZXIgY2hhbm5lbHMgYXJlIHNsb3cgY2hhbm5lbHMKKyAqIGFsbG93czogNi41IChzYW1wbGluZykgKyAxMi41IChjb252ZXJzaW9uKSA9IDE5IEFEQyBjbG9jayBjeWNsZXMgKGZBREMpIHRvCisgKiBjb252ZXJ0IGluIDEyLWJpdCByZXNvbHV0aW9uLlxuCisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8wCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8zCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF80CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF81CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF82CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF83CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF84CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF85CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE1CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE4CisgKi8KKyNkZWZpbmUgX19MTF9BRENfQ0hBTk5FTF9JTlRFUk5BTF9UT19FWFRFUk5BTChfX0NIQU5ORUxfXykgXAorICAoKF9fQ0hBTk5FTF9fKSAmIH5BRENfQ0hBTk5FTF9JRF9JTlRFUk5BTF9DSF9NQVNLKQorCisvKioKKyAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBpbnRlcm5hbCBjaGFubmVsCisgKiAgICAgICAgIHNlbGVjdGVkIGlzIGF2YWlsYWJsZSBvbiB0aGUgQURDIGluc3RhbmNlIHNlbGVjdGVkLgorICogQG5vdGUgICBUaGUgY2hhbm5lbCBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGRlZmluZWQgZnJvbSBwYXJhbWV0ZXIKKyAqICAgICAgICAgZGVmaW5pdGlvbiBvZiBhIEFEQyBpbnRlcm5hbCBjaGFubmVsIChMTF9BRENfQ0hBTk5FTF9WUkVGSU5ULAorICogICAgICAgICBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SLCAuLi4pLAorICogICAgICAgICBtdXN0IG5vdCBiZSBhIHZhbHVlIGRlZmluZWQgZnJvbSBwYXJhbWV0ZXIgZGVmaW5pdGlvbiBvZgorICogICAgICAgICBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoTExfQURDX0NIQU5ORUxfMSwgTExfQURDX0NIQU5ORUxfMiwgLi4uKQorICogICAgICAgICBvciBhIHZhbHVlIGZyb20gZnVuY3Rpb25zIHdoZXJlIGEgY2hhbm5lbCBudW1iZXIgaXMKKyAqICAgICAgICAgcmV0dXJuZWQgZnJvbSBBREMgcmVnaXN0ZXJzLAorICogICAgICAgICBiZWNhdXNlIGludGVybmFsIGFuZCBleHRlcm5hbCBjaGFubmVscyBzaGFyZSB0aGUgc2FtZSBjaGFubmVsCisgKiAgICAgICAgIG51bWJlciBpbiBBREMgcmVnaXN0ZXJzLiBUaGUgZGlmZmVyZW50aWF0aW9uIGlzIG1hZGUgb25seSB3aXRoCisgKiAgICAgICAgIHBhcmFtZXRlcnMgZGVmaW5pdGlvbnMgb2YgZHJpdmVyLgorICogQHBhcmFtICBfX0FEQ19JTlNUQU5DRV9fIEFEQyBpbnN0YW5jZQorICogQHBhcmFtICBfX0NIQU5ORUxfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVlJFRklOVCAgICAgICAgICAgKDcpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SX0FEQzEgICAoMSkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1JfQURDNSAgICg1KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVkJBVCAgICAgICAgICAgICAgKDYpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAxICAgICAgICAgICAoMSkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDIgICAgICAgICAgICgyKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QM19BREMyICAgICAgKDIpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAzX0FEQzMgICAgICAoMykKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDQgICAgICAgICAgICg1KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QNSAgICAgICAgICAgKDUpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVA2ICAgICAgICAgICAoNCkKKyAqCisgKiAgICAgICAgICgxKSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMxLlxuCisgKiAgICAgICAgICgyKSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMyLlxuCisgKiAgICAgICAgICgzKSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMzLlxuCisgKiAgICAgICAgICg0KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREM0LlxuCisgKiAgICAgICAgICg1KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREM1LlxuCisgKiAgICAgICAgICg2KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlczogQURDMSwKKyAqIEFEQzMsIEFEQzUuXG4gKDcpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2VzOgorICogQURDMSwgQURDMywgQURDNCwgQURDNS5cbiBPbiB0aGlzIFNUTTMyIHNlcmllcywgYWxsIEFEQ3ggYXJlIG5vdCBhdmFpbGFibGUgb24KKyAqIGFsbCBkZXZpY2VzLiBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBtb3JlIGRldGFpbHMuCisgKiBAcmV0dmFsIFZhbHVlICIwIiBpZiB0aGUgaW50ZXJuYWwgY2hhbm5lbCBzZWxlY3RlZCBpcyBub3QgYXZhaWxhYmxlIG9uIHRoZQorICogQURDIGluc3RhbmNlIHNlbGVjdGVkLiBWYWx1ZSAiMSIgaWYgdGhlIGludGVybmFsIGNoYW5uZWwgc2VsZWN0ZWQgaXMKKyAqIGF2YWlsYWJsZSBvbiB0aGUgQURDIGluc3RhbmNlIHNlbGVjdGVkLgorICovCisjaWYgZGVmaW5lZChTVE0zMkc0NzR4eCkgfHwgZGVmaW5lZChTVE0zMkc0ODR4eCkgfHwgZGVmaW5lZChTVE0zMkc0NzN4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJHNDgzeHgpCisjZGVmaW5lIF9fTExfQURDX0lTX0NIQU5ORUxfSU5URVJOQUxfQVZBSUxBQkxFKF9fQURDX0lOU1RBTkNFX18sIF9fQ0hBTk5FTF9fKSBcCisgICgoKChfX0FEQ19JTlNUQU5DRV9fKSA9PSBBREMxKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoX19DSEFOTkVMX18pID09IExMX0FEQ19DSEFOTkVMX1ZPUEFNUDEpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19DSEFOTkVMX18pID09IExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1JfQURDMSkgfHwgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19DSEFOTkVMX18pID09IExMX0FEQ19DSEFOTkVMX1ZCQVQpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19DSEFOTkVMX18pID09IExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQpKSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKChfX0FEQ19JTlNUQU5DRV9fKSA9PSBBREMyKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoX19DSEFOTkVMX18pID09IExMX0FEQ19DSEFOTkVMX1ZPUEFNUDIpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19DSEFOTkVMX18pID09IExMX0FEQ19DSEFOTkVMX1ZPUEFNUDNfQURDMikpKSB8fCAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKChfX0FEQ19JTlNUQU5DRV9fKSA9PSBBREMzKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoX19DSEFOTkVMX18pID09IExMX0FEQ19DSEFOTkVMX1ZPUEFNUDNfQURDMykgfHwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19DSEFOTkVMX18pID09IExMX0FEQ19DSEFOTkVMX1ZCQVQpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19DSEFOTkVMX18pID09IExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQpKSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKChfX0FEQ19JTlNUQU5DRV9fKSA9PSBBREM0KSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoX19DSEFOTkVMX18pID09IExMX0FEQ19DSEFOTkVMX1ZPUEFNUDYpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19DSEFOTkVMX18pID09IExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQpKSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKChfX0FEQ19JTlNUQU5DRV9fKSA9PSBBREM1KSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoX19DSEFOTkVMX18pID09IExMX0FEQ19DSEFOTkVMX1ZPUEFNUDUpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19DSEFOTkVMX18pID09IExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1JfQURDNSkgfHwgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19DSEFOTkVMX18pID09IExMX0FEQ19DSEFOTkVMX1ZPUEFNUDQpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19DSEFOTkVMX18pID09IExMX0FEQ19DSEFOTkVMX1ZCQVQpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19DSEFOTkVMX18pID09IExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQpKSkpCisjZWxpZiBkZWZpbmVkKFNUTTMyRzQ3MXh4KQorI2RlZmluZSBfX0xMX0FEQ19JU19DSEFOTkVMX0lOVEVSTkFMX0FWQUlMQUJMRShfX0FEQ19JTlNUQU5DRV9fLCBfX0NIQU5ORUxfXykgXAorICAoKCgoX19BRENfSU5TVEFOQ0VfXykgPT0gQURDMSkgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKF9fQ0hBTk5FTF9fKSA9PSBMTF9BRENfQ0hBTk5FTF9WT1BBTVAxKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SX0FEQzEpIHx8ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBMTF9BRENfQ0hBTk5FTF9WQkFUKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBMTF9BRENfQ0hBTk5FTF9WUkVGSU5UKSkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKCgoX19BRENfSU5TVEFOQ0VfXykgPT0gQURDMikgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKF9fQ0hBTk5FTF9fKSA9PSBMTF9BRENfQ0hBTk5FTF9WT1BBTVAyKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBMTF9BRENfQ0hBTk5FTF9WT1BBTVAzX0FEQzIpKSkgfHwgICAgICAgICAgICAgICAgICAgICAgXAorICAgKCgoX19BRENfSU5TVEFOQ0VfXykgPT0gQURDMykgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKF9fQ0hBTk5FTF9fKSA9PSBMTF9BRENfQ0hBTk5FTF9WT1BBTVAzX0FEQzMpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBMTF9BRENfQ0hBTk5FTF9WQkFUKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBMTF9BRENfQ0hBTk5FTF9WUkVGSU5UKSkpKQorI2VsaWYgZGVmaW5lZChTVE0zMkc0MTF4QikgfHwgZGVmaW5lZChTVE0zMkc0MTR4eCkgfHwgZGVmaW5lZChTVE0zMkdCSzFDQikgfHwgXAorICAgIGRlZmluZWQoU1RNMzJHNDMxeHgpIHx8IGRlZmluZWQoU1RNMzJHNDQxeHgpCisjZGVmaW5lIF9fTExfQURDX0lTX0NIQU5ORUxfSU5URVJOQUxfQVZBSUxBQkxFKF9fQURDX0lOU1RBTkNFX18sIF9fQ0hBTk5FTF9fKSBcCisgICgoKChfX0FEQ19JTlNUQU5DRV9fKSA9PSBBREMxKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoX19DSEFOTkVMX18pID09IExMX0FEQ19DSEFOTkVMX1ZPUEFNUDEpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19DSEFOTkVMX18pID09IExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1JfQURDMSkgfHwgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19DSEFOTkVMX18pID09IExMX0FEQ19DSEFOTkVMX1ZCQVQpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19DSEFOTkVMX18pID09IExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQpKSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKChfX0FEQ19JTlNUQU5DRV9fKSA9PSBBREMyKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoX19DSEFOTkVMX18pID09IExMX0FEQ19DSEFOTkVMX1ZPUEFNUDIpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19DSEFOTkVMX18pID09IExMX0FEQ19DSEFOTkVMX1ZPUEFNUDNfQURDMikpKSkKKyNlbGlmIGRlZmluZWQoU1RNMzJHNDkxeHgpIHx8IGRlZmluZWQoU1RNMzJHNEExeHgpIHx8IGRlZmluZWQoU1RNMzJHNDExeEMpCisjZGVmaW5lIF9fTExfQURDX0lTX0NIQU5ORUxfSU5URVJOQUxfQVZBSUxBQkxFKF9fQURDX0lOU1RBTkNFX18sIF9fQ0hBTk5FTF9fKSBcCisgICgoKChfX0FEQ19JTlNUQU5DRV9fKSA9PSBBREMxKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoX19DSEFOTkVMX18pID09IExMX0FEQ19DSEFOTkVMX1ZPUEFNUDEpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19DSEFOTkVMX18pID09IExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1JfQURDMSkgfHwgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19DSEFOTkVMX18pID09IExMX0FEQ19DSEFOTkVMX1ZCQVQpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19DSEFOTkVMX18pID09IExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQpKSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKChfX0FEQ19JTlNUQU5DRV9fKSA9PSBBREMyKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoX19DSEFOTkVMX18pID09IExMX0FEQ19DSEFOTkVMX1ZPUEFNUDIpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19DSEFOTkVMX18pID09IExMX0FEQ19DSEFOTkVMX1ZPUEFNUDNfQURDMikpKSB8fCAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKChfX0FEQ19JTlNUQU5DRV9fKSA9PSBBREMzKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoX19DSEFOTkVMX18pID09IExMX0FEQ19DSEFOTkVMX1ZPUEFNUDNfQURDMykgfHwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19DSEFOTkVMX18pID09IExMX0FEQ19DSEFOTkVMX1ZPUEFNUDYpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoX19DSEFOTkVMX18pID09IExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQpKSkpCisjZW5kaWYgLyogU1RNMzJHNHh4ICovCisKKy8qKgorICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gZGVmaW5lIEFEQyBhbmFsb2cgd2F0Y2hkb2cgcGFyYW1ldGVyOgorICogICAgICAgICBkZWZpbmUgYSBzaW5nbGUgY2hhbm5lbCB0byBtb25pdG9yIHdpdGggYW5hbG9nIHdhdGNoZG9nCisgKiAgICAgICAgIGZyb20gc2VxdWVuY2VyIGNoYW5uZWwgYW5kIGdyb3VwcyBkZWZpbml0aW9uLgorICogQG5vdGUgICBUbyBiZSB1c2VkIHdpdGggZnVuY3Rpb24gQHJlZiBMTF9BRENfU2V0QW5hbG9nV0RNb25pdENoYW5uZWxzKCkuCisgKiAgICAgICAgIEV4YW1wbGU6CisgKiAgICAgICAgICAgTExfQURDX1NldEFuYWxvZ1dETW9uaXRDaGFubmVscygKKyAqICAgICAgICAgICAgIEFEQzEsIExMX0FEQ19BV0QxLAorICogICAgICAgICAgICAgX19MTF9BRENfQU5BTE9HV0RfQ0hBTk5FTF9HUk9VUChMTF9BRENfQ0hBTk5FTDQsCisgKiBMTF9BRENfR1JPVVBfUkVHVUxBUikpCisgKiBAcGFyYW0gIF9fQ0hBTk5FTF9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8wCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xICAgICAgICAgICAgICAgICAoOCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzIgICAgICAgICAgICAgICAgICg4KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMyAgICAgICAgICAgICAgICAgKDgpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF80ICAgICAgICAgICAgICAgICAoOCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzUgICAgICAgICAgICAgICAgICg4KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzExCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE3CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xOAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVlJFRklOVCAgICAgICAgICAgKDcpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SX0FEQzEgICAoMSkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1JfQURDNSAgICg1KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVkJBVCAgICAgICAgICAgICAgKDYpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAxICAgICAgICAgICAoMSkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDIgICAgICAgICAgICgyKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QM19BREMyICAgICAgKDIpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAzX0FEQzMgICAgICAoMykKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDQgICAgICAgICAgICg1KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QNSAgICAgICAgICAgKDUpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVA2ICAgICAgICAgICAoNCkKKyAqCisgKiAgICAgICAgICgxKSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMxLlxuCisgKiAgICAgICAgICgyKSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMyLlxuCisgKiAgICAgICAgICgzKSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMzLlxuCisgKiAgICAgICAgICg0KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREM0LlxuCisgKiAgICAgICAgICg1KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREM1LlxuCisgKiAgICAgICAgICg2KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlczogQURDMSwKKyAqIEFEQzMsIEFEQzUuXG4gKDcpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2VzOgorICogQURDMSwgQURDMywgQURDNCwgQURDNS5cbiBPbiB0aGlzIFNUTTMyIHNlcmllcywgYWxsIEFEQ3ggYXJlIG5vdCBhdmFpbGFibGUgb24KKyAqIGFsbCBkZXZpY2VzLiBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBtb3JlIGRldGFpbHMuICg4KSBPbiBTVE0zMkc0LCBmYXN0CisgKiBjaGFubmVsIGFsbG93czogMi41IChzYW1wbGluZykgKyAxMi41IChjb252ZXJzaW9uKSA9IDE1IEFEQyBjbG9jayBjeWNsZXMKKyAqIChmQURDKSB0byBjb252ZXJ0IGluIDEyLWJpdCByZXNvbHV0aW9uLiBPdGhlciBjaGFubmVscyBhcmUgc2xvdyBjaGFubmVscworICogYWxsb3dzOiA2LjUgKHNhbXBsaW5nKSArIDEyLjUgKGNvbnZlcnNpb24pID0gMTkgQURDIGNsb2NrIGN5Y2xlcyAoZkFEQykgdG8KKyAqIGNvbnZlcnQgaW4gMTItYml0IHJlc29sdXRpb24uXG4gKDEsIDIsIDMsIDQsIDUsIDcpIEZvciBBREMgY2hhbm5lbCByZWFkIGJhY2sKKyAqIGZyb20gQURDIHJlZ2lzdGVyLCBjb21wYXJpc29uIHdpdGggaW50ZXJuYWwgY2hhbm5lbCBwYXJhbWV0ZXIgdG8gYmUgZG9uZQorICogICAgICAgICAgICAgICAgICAgICAgdXNpbmcgaGVscGVyIG1hY3JvIEByZWYKKyAqIF9fTExfQURDX0NIQU5ORUxfSU5URVJOQUxfVE9fRVhURVJOQUwoKS4KKyAqIEBwYXJhbSAgX19HUk9VUF9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfR1JPVVBfUkVHVUxBUgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0dST1VQX0lOSkVDVEVECisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfR1JPVVBfUkVHVUxBUl9JTkpFQ1RFRAorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9ESVNBQkxFCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0FMTF9DSEFOTkVMU19SRUcgICAgICAgICgwKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9BTExfQ0hBTk5FTFNfSU5KICAgICAgICAoMCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQUxMX0NIQU5ORUxTX1JFR19JTkoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8wX1JFRyAgICAgICAgICAgKDApCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMF9JTkogICAgICAgICAgICgwKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzBfUkVHX0lOSgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzFfUkVHICAgICAgICAgICAoMCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xX0lOSiAgICAgICAgICAgKDApCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMV9SRUdfSU5KCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMl9SRUcgICAgICAgICAgICgwKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzJfSU5KICAgICAgICAgICAoMCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8yX1JFR19JTkoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8zX1JFRyAgICAgICAgICAgKDApCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfM19JTkogICAgICAgICAgICgwKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzNfUkVHX0lOSgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzRfUkVHICAgICAgICAgICAoMCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF80X0lOSiAgICAgICAgICAgKDApCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfNF9SRUdfSU5KCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfNV9SRUcgICAgICAgICAgICgwKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzVfSU5KICAgICAgICAgICAoMCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF81X1JFR19JTkoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF82X1JFRyAgICAgICAgICAgKDApCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfNl9JTkogICAgICAgICAgICgwKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzZfUkVHX0lOSgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzdfUkVHICAgICAgICAgICAoMCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF83X0lOSiAgICAgICAgICAgKDApCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfN19SRUdfSU5KCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfOF9SRUcgICAgICAgICAgICgwKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzhfSU5KICAgICAgICAgICAoMCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF84X1JFR19JTkoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF85X1JFRyAgICAgICAgICAgKDApCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfOV9JTkogICAgICAgICAgICgwKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzlfUkVHX0lOSgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzEwX1JFRyAgICAgICAgICAoMCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xMF9JTkogICAgICAgICAgKDApCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTBfUkVHX0lOSgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzExX1JFRyAgICAgICAgICAoMCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xMV9JTkogICAgICAgICAgKDApCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTFfUkVHX0lOSgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzEyX1JFRyAgICAgICAgICAoMCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xMl9JTkogICAgICAgICAgKDApCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTJfUkVHX0lOSgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzEzX1JFRyAgICAgICAgICAoMCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xM19JTkogICAgICAgICAgKDApCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTNfUkVHX0lOSgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE0X1JFRyAgICAgICAgICAoMCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xNF9JTkogICAgICAgICAgKDApCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTRfUkVHX0lOSgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE1X1JFRyAgICAgICAgICAoMCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xNV9JTkogICAgICAgICAgKDApCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTVfUkVHX0lOSgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE2X1JFRyAgICAgICAgICAoMCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xNl9JTkogICAgICAgICAgKDApCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTZfUkVHX0lOSgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE3X1JFRyAgICAgICAgICAoMCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xN19JTkogICAgICAgICAgKDApCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTdfUkVHX0lOSgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE4X1JFRyAgICAgICAgICAoMCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xOF9JTkogICAgICAgICAgKDApCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMThfUkVHX0lOSgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9WUkVGSU5UX1JFRyAgICAgICAgICAoMCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVlJFRklOVF9JTkogICAgICAgICAgKDApCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZSRUZJTlRfUkVHX0lOSgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9URU1QU0VOU09SX0FEQzFfUkVHICAoMCkoMSkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVEVNUFNFTlNPUl9BREMxX0lOSiAgKDApKDEpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1RFTVBTRU5TT1JfQURDMV9SRUdfSU5KICgxKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9URU1QU0VOU09SX0FEQzVfUkVHICAoMCkoNSkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVEVNUFNFTlNPUl9BREM1X0lOSiAgKDApKDUpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1RFTVBTRU5TT1JfQURDNV9SRUdfSU5KICg1KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9WQkFUX1JFRyAgICAgICAgICAgICAoMCkoNikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVkJBVF9JTkogICAgICAgICAgICAgKDApKDYpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZCQVRfUkVHX0lOSiAgICAgICAgICAgICg2KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9WT1BBTVAxX1JFRyAgICAgICAgICAoMCkoMSkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVk9QQU1QMV9JTkogICAgICAgICAgKDApKDEpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZPUEFNUDFfUkVHX0lOSiAgICAgICAgICgxKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9WT1BBTVAyX1JFRyAgICAgICAgICAoMCkoMikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVk9QQU1QMl9JTkogICAgICAgICAgKDApKDIpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZPUEFNUDJfUkVHX0lOSiAgICAgICAgICgyKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9WT1BBTVAzX0FEQzJfUkVHICAgICAoMCkoMikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVk9QQU1QM19BREMyX0lOSiAgICAgKDApKDIpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZPUEFNUDNfQURDMl9SRUdfSU5KICAgICgyKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9WT1BBTVAzX0FEQzNfUkVHICAgICAoMCkoMykKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVk9QQU1QM19BREMzX0lOSiAgICAgKDApKDMpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZPUEFNUDNfQURDM19SRUdfSU5KICAgICgzKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9WT1BBTVA0X1JFRyAgICAgICAgICAoMCkoNSkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVk9QQU1QNF9JTkogICAgICAgICAgKDApKDUpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZPUEFNUDRfUkVHX0lOSiAgICAgICAgICg1KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9WT1BBTVA1X1JFRyAgICAgICAgICAoMCkoNSkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVk9QQU1QNV9JTkogICAgICAgICAgKDApKDUpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZPUEFNUDVfUkVHX0lOSiAgICAgICAgICg1KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9WT1BBTVA2X1JFRyAgICAgICAgICAoMCkoNCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVk9QQU1QNl9JTkogICAgICAgICAgKDApKDQpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZPUEFNUDZfUkVHX0lOSiAgICAgICAgICg0KQorICoKKyAqICAgICAgICAgKDApIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBhbmFsb2cgd2F0Y2hkb2cgbnVtYmVyOgorICogQVdEMS5cbiAoMSkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMS5cbiAoMikKKyAqIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzIuXG4gKDMpIE9uIFNUTTMyRzQsCisgKiBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMzLlxuICg0KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIKKyAqIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDNC5cbiAoNSkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZQorICogb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzUuXG4gKDYpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMKKyAqIGluc3RhbmNlczogQURDMSwgQURDMywgQURDNS5cbiAoNykgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uCisgKiBBREMgaW5zdGFuY2VzOiBBREMxLCBBREMzLCBBREM0LCBBREM1LlxuIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBhbGwgQURDeCBhcmUKKyAqIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2RlZmluZSBfX0xMX0FEQ19BTkFMT0dXRF9DSEFOTkVMX0dST1VQKF9fQ0hBTk5FTF9fLCBfX0dST1VQX18pICAgICAgXAorICAoKChfX0dST1VQX18pID09IExMX0FEQ19HUk9VUF9SRUdVTEFSKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgID8gKCgoX19DSEFOTkVMX18pICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9BV0QxRU4gfCAgXAorICAgICAgICAgIEFEQ19DRkdSX0FXRDFTR0wpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAoKF9fR1JPVVBfXykgPT0gTExfQURDX0dST1VQX0lOSkVDVEVEKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgID8gKCgoX19DSEFOTkVMX18pICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgXAorICAgICAgICAgIEFEQ19DRkdSX0FXRDFTR0wpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIDogKCgoX19DSEFOTkVMX18pICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgXAorICAgICAgICAgIEFEQ19DRkdSX0FXRDFFTiB8IEFEQ19DRkdSX0FXRDFTR0wpKQorCisvKioKKyAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIHNldCB0aGUgdmFsdWUgb2YgQURDIGFuYWxvZyB3YXRjaGRvZyB0aHJlc2hvbGQgaGlnaAorICogICAgICAgICBvciBsb3cgaW4gZnVuY3Rpb24gb2YgQURDIHJlc29sdXRpb24sIHdoZW4gQURDIHJlc29sdXRpb24gaXMKKyAqICAgICAgICAgZGlmZmVyZW50IG9mIDEyIGJpdHMuCisgKiBAbm90ZSAgIFRvIGJlIHVzZWQgd2l0aCBmdW5jdGlvbiBAcmVmIExMX0FEQ19Db25maWdBbmFsb2dXRFRocmVzaG9sZHMoKQorICogICAgICAgICBvciBAcmVmIExMX0FEQ19TZXRBbmFsb2dXRFRocmVzaG9sZHMoKS4KKyAqICAgICAgICAgRXhhbXBsZSwgd2l0aCBhIEFEQyByZXNvbHV0aW9uIG9mIDggYml0cywgdG8gc2V0IHRoZSB2YWx1ZSBvZgorICogICAgICAgICBhbmFsb2cgd2F0Y2hkb2cgdGhyZXNob2xkIGhpZ2ggKG9uIDggYml0cyk6CisgKiAgICAgICAgICAgTExfQURDX1NldEFuYWxvZ1dEVGhyZXNob2xkcworICogICAgICAgICAgICAoPCBBREN4IHBhcmFtID4sCisgKiAgICAgICAgICAgICBfX0xMX0FEQ19BTkFMT0dXRF9TRVRfVEhSRVNIT0xEX1JFU09MVVRJT04oTExfQURDX1JFU09MVVRJT05fOEIsCisgKiA8dGhyZXNob2xkX3ZhbHVlXzhfYml0cz4pCisgKiAgICAgICAgICAgICk7CisgKiBAcGFyYW0gIF9fQURDX1JFU09MVVRJT05fXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fMTJCCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl8xMEIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzhCCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl82QgorICogQHBhcmFtICBfX0FXRF9USFJFU0hPTERfXyBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwIGFuZCBNYXhfRGF0YT0weEZGRgorICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwIGFuZCBNYXhfRGF0YT0weEZGRgorICovCisjZGVmaW5lIF9fTExfQURDX0FOQUxPR1dEX1NFVF9USFJFU0hPTERfUkVTT0xVVElPTihfX0FEQ19SRVNPTFVUSU9OX18sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fQVdEX1RIUkVTSE9MRF9fKSAgXAorICAoKF9fQVdEX1RIUkVTSE9MRF9fKSA8PCAoKF9fQURDX1JFU09MVVRJT05fXykgPj4gICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoQURDX0NGR1JfUkVTX0JJVE9GRlNFVF9QT1MgLSAxVSkpKQorCisvKioKKyAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGdldCB0aGUgdmFsdWUgb2YgQURDIGFuYWxvZyB3YXRjaGRvZyB0aHJlc2hvbGQgaGlnaAorICogICAgICAgICBvciBsb3cgaW4gZnVuY3Rpb24gb2YgQURDIHJlc29sdXRpb24sIHdoZW4gQURDIHJlc29sdXRpb24gaXMKKyAqICAgICAgICAgZGlmZmVyZW50IG9mIDEyIGJpdHMuCisgKiBAbm90ZSAgIFRvIGJlIHVzZWQgd2l0aCBmdW5jdGlvbiBAcmVmIExMX0FEQ19HZXRBbmFsb2dXRFRocmVzaG9sZHMoKS4KKyAqICAgICAgICAgRXhhbXBsZSwgd2l0aCBhIEFEQyByZXNvbHV0aW9uIG9mIDggYml0cywgdG8gZ2V0IHRoZSB2YWx1ZSBvZgorICogICAgICAgICBhbmFsb2cgd2F0Y2hkb2cgdGhyZXNob2xkIGhpZ2ggKG9uIDggYml0cyk6CisgKiAgICAgICAgICAgPCB0aHJlc2hvbGRfdmFsdWVfNl9iaXRzID4gPQorICogX19MTF9BRENfQU5BTE9HV0RfR0VUX1RIUkVTSE9MRF9SRVNPTFVUSU9OIChMTF9BRENfUkVTT0xVVElPTl84QiwKKyAqICAgICAgICAgICAgIExMX0FEQ19HZXRBbmFsb2dXRFRocmVzaG9sZHMoPEFEQ3ggcGFyYW0+LAorICogTExfQURDX0FXRF9USFJFU0hPTERfSElHSCkKKyAqICAgICAgICAgICAgKTsKKyAqIEBwYXJhbSAgX19BRENfUkVTT0xVVElPTl9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl8xMkIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzEwQgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fOEIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzZCCisgKiBAcGFyYW0gIF9fQVdEX1RIUkVTSE9MRF8xMl9CSVRTX18gVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMCBhbmQKKyAqIE1heF9EYXRhPTB4RkZGCisgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMDAgYW5kIE1heF9EYXRhPTB4RkZGCisgKi8KKyNkZWZpbmUgX19MTF9BRENfQU5BTE9HV0RfR0VUX1RIUkVTSE9MRF9SRVNPTFVUSU9OKF9fQURDX1JFU09MVVRJT05fXywgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fQVdEX1RIUkVTSE9MRF8xMl9CSVRTX18pIFwKKyAgKChfX0FXRF9USFJFU0hPTERfMTJfQklUU19fKSA+PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoX19BRENfUkVTT0xVVElPTl9fKSA+PiAoQURDX0NGR1JfUkVTX0JJVE9GRlNFVF9QT1MgLSAxVSkpKQorCisvKioKKyAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGdldCB0aGUgQURDIGFuYWxvZyB3YXRjaGRvZyB0aHJlc2hvbGQgaGlnaAorICogICAgICAgICBvciBsb3cgZnJvbSByYXcgdmFsdWUgY29udGFpbmluZyBib3RoIHRocmVzaG9sZHMgY29uY2F0ZW5hdGVkLgorICogQG5vdGUgICBUbyBiZSB1c2VkIHdpdGggZnVuY3Rpb24gQHJlZiBMTF9BRENfR2V0QW5hbG9nV0RUaHJlc2hvbGRzKCkuCisgKiAgICAgICAgIEV4YW1wbGUsIHRvIGdldCBhbmFsb2cgd2F0Y2hkb2cgdGhyZXNob2xkIGhpZ2ggZnJvbSB0aGUgcmVnaXN0ZXIgcmF3CisgKiB2YWx1ZToKKyAqICAgICAgICAgICBfX0xMX0FEQ19BTkFMT0dXRF9USFJFU0hPTERTX0hJR0hfTE9XKExMX0FEQ19BV0RfVEhSRVNIT0xEX0hJR0gsCisgKiA8cmF3X3ZhbHVlX3dpdGhfYm90aF90aHJlc2hvbGRzPik7CisgKiBAcGFyYW0gIF9fQVdEX1RIUkVTSE9MRF9UWVBFX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nCisgKiB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX1RIUkVTSE9MRF9ISUdICisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX1RIUkVTSE9MRF9MT1cKKyAqIEBwYXJhbSAgX19BV0RfVEhSRVNIT0xEU19fIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMDAwMDAwMCBhbmQKKyAqIE1heF9EYXRhPTB4RkZGRkZGRkYKKyAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMCBhbmQgTWF4X0RhdGE9MHhGRkYKKyAqLworI2RlZmluZSBfX0xMX0FEQ19BTkFMT0dXRF9USFJFU0hPTERTX0hJR0hfTE9XKF9fQVdEX1RIUkVTSE9MRF9UWVBFX18sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0FXRF9USFJFU0hPTERTX18pICAgICBcCisgICgoKF9fQVdEX1RIUkVTSE9MRFNfXykgPj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKF9fQVdEX1RIUkVTSE9MRF9UWVBFX18pICYgQURDX0FXRF9UUlhfQklUX0hJR0hfTUFTSykgPj4gICAgICAgIFwKKyAgICAgQURDX0FXRF9UUlhfQklUX0hJR0hfU0hJRlQ0KSkgJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBMTF9BRENfQVdEX1RIUkVTSE9MRF9MT1cpCisKKy8qKgorICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gc2V0IHRoZSBBREMgY2FsaWJyYXRpb24gdmFsdWUgd2l0aCBib3RoIHNpbmdsZSBlbmRlZAorICogICAgICAgICBhbmQgZGlmZmVyZW50aWFsIG1vZGVzIGNhbGlicmF0aW9uIGZhY3RvcnMgY29uY2F0ZW5hdGVkLgorICogQG5vdGUgICBUbyBiZSB1c2VkIHdpdGggZnVuY3Rpb24gQHJlZiBMTF9BRENfU2V0Q2FsaWJyYXRpb25GYWN0b3IoKS4KKyAqICAgICAgICAgRXhhbXBsZSwgdG8gc2V0IGNhbGlicmF0aW9uIGZhY3RvcnMgc2luZ2xlIGVuZGVkIHRvIDB4NTUKKyAqICAgICAgICAgYW5kIGRpZmZlcmVudGlhbCBlbmRlZCB0byAweDJBOgorICogICAgICAgICAgIExMX0FEQ19TZXRDYWxpYnJhdGlvbkZhY3RvcigKKyAqICAgICAgICAgICAgIEFEQzEsCisgKiAgICAgICAgICAgICBfX0xMX0FEQ19DQUxJQl9GQUNUT1JfU0lOR0xFX0RJRkYoMHg1NSwgMHgyQSkpCisgKiBAcGFyYW0gIF9fQ0FMSUJfRkFDVE9SX1NJTkdMRV9FTkRFRF9fIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQKKyAqIE1heF9EYXRhPTB4N0YKKyAqIEBwYXJhbSAgX19DQUxJQl9GQUNUT1JfRElGRkVSRU5USUFMX18gVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZAorICogTWF4X0RhdGE9MHg3RgorICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwMDAwMDAgYW5kIE1heF9EYXRhPTB4RkZGRkZGRkYKKyAqLworI2RlZmluZSBfX0xMX0FEQ19DQUxJQl9GQUNUT1JfU0lOR0xFX0RJRkYoX19DQUxJQl9GQUNUT1JfU0lOR0xFX0VOREVEX18sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fQ0FMSUJfRkFDVE9SX0RJRkZFUkVOVElBTF9fKSBcCisgICgoKF9fQ0FMSUJfRkFDVE9SX0RJRkZFUkVOVElBTF9fKSA8PCBBRENfQ0FMRkFDVF9DQUxGQUNUX0RfUG9zKSB8ICAgICAgXAorICAgKF9fQ0FMSUJfRkFDVE9SX1NJTkdMRV9FTkRFRF9fKSkKKworI2lmIGRlZmluZWQoQURDX01VTFRJTU9ERV9TVVBQT1JUKQorLyoqCisgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBnZXQgdGhlIEFEQyBtdWx0aW1vZGUgY29udmVyc2lvbiBkYXRhIG9mIEFEQyBtYXN0ZXIKKyAqICAgICAgICAgb3IgQURDIHNsYXZlIGZyb20gcmF3IHZhbHVlIHdpdGggYm90aCBBREMgY29udmVyc2lvbiBkYXRhCisgKiBjb25jYXRlbmF0ZWQuCisgKiBAbm90ZSAgIFRoaXMgbWFjcm8gaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aGVuIG11bHRpbW9kZSB0cmFuc2ZlciBieSBETUEKKyAqICAgICAgICAgaXMgZW5hYmxlZDogcmVmZXIgdG8gZnVuY3Rpb24gQHJlZiBMTF9BRENfU2V0TXVsdGlETUFUcmFuc2ZlcigpLgorICogICAgICAgICBJbiB0aGlzIGNhc2UgdGhlIHRyYW5zZmVycmVkIGRhdGEgbmVlZCB0byBwcm9jZXNzZWQgd2l0aCB0aGlzIG1hY3JvCisgKiAgICAgICAgIHRvIHNlcGFyYXRlIHRoZSBjb252ZXJzaW9uIGRhdGEgb2YgQURDIG1hc3RlciBhbmQgQURDIHNsYXZlLgorICogQHBhcmFtICBfX0FEQ19NVUxUSV9NQVNURVJfU0xBVkVfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcKKyAqIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19NVUxUSV9NQVNURVIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19NVUxUSV9TTEFWRQorICogQHBhcmFtICBfX0FEQ19NVUxUSV9DT05WX0RBVEFfXyBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwIGFuZAorICogTWF4X0RhdGE9MHhGRkYKKyAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMCBhbmQgTWF4X0RhdGE9MHhGRkYKKyAqLworI2RlZmluZSBfX0xMX0FEQ19NVUxUSV9DT05WX0RBVEFfTUFTVEVSX1NMQVZFKF9fQURDX01VTFRJX01BU1RFUl9TTEFWRV9fLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19BRENfTVVMVElfQ09OVl9EQVRBX18pICAgIFwKKyAgKCgoX19BRENfTVVMVElfQ09OVl9EQVRBX18pID4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoQURDX0NEUl9SREFUQV9TTFZfUG9zKSAmIH4oX19BRENfTVVMVElfTUFTVEVSX1NMQVZFX18pKSkgJiAgICAgICAgICBcCisgICBBRENfQ0RSX1JEQVRBX01TVCkKKyNlbmRpZiAvKiBBRENfTVVMVElNT0RFX1NVUFBPUlQgKi8KKworI2lmIGRlZmluZWQoQURDX01VTFRJTU9ERV9TVVBQT1JUKQorLyoqCisgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBzZWxlY3QsIGZyb20gYSBBREMgaW5zdGFuY2UsIHRvIHdoaWNoIEFEQyBpbnN0YW5jZQorICogICAgICAgICBpdCBoYXMgYSBkZXBlbmRlbmNlIGluIG11bHRpbW9kZSAoQURDIG1hc3RlciBvZiB0aGUgY29ycmVzcG9uZGluZworICogICAgICAgICBBREMgY29tbW9uIGluc3RhbmNlKS4KKyAqIEBub3RlICAgSW4gY2FzZSBvZiBkZXZpY2Ugd2l0aCBtdWx0aW1vZGUgYXZhaWxhYmxlIGFuZCBhIG1peCBvZgorICogICAgICAgICBBREMgaW5zdGFuY2VzIGNvbXBsaWFudCBhbmQgbm90IGNvbXBsaWFudCB3aXRoIG11bHRpbW9kZSBmZWF0dXJlLAorICogICAgICAgICBBREMgaW5zdGFuY2VzIG5vdCBjb21wbGlhbnQgd2l0aCBtdWx0aW1vZGUgZmVhdHVyZSBhcmUKKyAqICAgICAgICAgY29uc2lkZXJlZCBhcyBtYXN0ZXIgaW5zdGFuY2VzIChkbyBub3QgZGVwZW5kIHRvCisgKiAgICAgICAgIGFueSBvdGhlciBBREMgaW5zdGFuY2UpLgorICogQHBhcmFtICBfX0FEQ3hfXyBBREMgaW5zdGFuY2UKKyAqIEByZXR2YWwgX19BREN4X18gQURDIGluc3RhbmNlIG1hc3RlciBvZiB0aGUgY29ycmVzcG9uZGluZyBBREMgY29tbW9uIGluc3RhbmNlCisgKi8KKyNpZiBkZWZpbmVkKEFEQzUpCisjZGVmaW5lIF9fTExfQURDX01VTFRJX0lOU1RBTkNFX01BU1RFUihfX0FEQ3hfXykgXAorICAoKCgoX19BREN4X18pID09IEFEQzIpKSA/IChBREMxKSAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoKCgoX19BREN4X18pID09IEFEQzQpKSA/IChBREMzKSA6IChfX0FEQ3hfXykpKQorI2Vsc2UKKyNkZWZpbmUgX19MTF9BRENfTVVMVElfSU5TVEFOQ0VfTUFTVEVSKF9fQURDeF9fKSBcCisgICgoKChfX0FEQ3hfXykgPT0gQURDMikpID8gKEFEQzEpIDogKF9fQURDeF9fKSkKKyNlbmRpZiAvKiBBREM1ICovCisjZW5kaWYgLyogQURDX01VTFRJTU9ERV9TVVBQT1JUICovCisKKy8qKgorICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gc2VsZWN0IHRoZSBBREMgY29tbW9uIGluc3RhbmNlCisgKiAgICAgICAgIHRvIHdoaWNoIGlzIGJlbG9uZ2luZyB0aGUgc2VsZWN0ZWQgQURDIGluc3RhbmNlLgorICogQG5vdGUgICBBREMgY29tbW9uIHJlZ2lzdGVyIGluc3RhbmNlIGNhbiBiZSB1c2VkIGZvcjoKKyAqICAgICAgICAgLSBTZXQgcGFyYW1ldGVycyBjb21tb24gdG8gc2V2ZXJhbCBBREMgaW5zdGFuY2VzCisgKiAgICAgICAgIC0gTXVsdGltb2RlIChmb3IgZGV2aWNlcyB3aXRoIHNldmVyYWwgQURDIGluc3RhbmNlcykKKyAqICAgICAgICAgUmVmZXIgdG8gZnVuY3Rpb25zIGhhdmluZyBhcmd1bWVudCAiQURDeHlfQ09NTU9OIiBhcyBwYXJhbWV0ZXIuCisgKiBAcGFyYW0gIF9fQURDeF9fIEFEQyBpbnN0YW5jZQorICogQHJldHZhbCBBREMgY29tbW9uIHJlZ2lzdGVyIGluc3RhbmNlCisgKi8KKyNpZiBkZWZpbmVkKEFEQzM0NV9DT01NT04pCisjZGVmaW5lIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRShfX0FEQ3hfXykgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKChfX0FEQ3hfXykgPT0gQURDMSkgfHwgKChfX0FEQ3hfXykgPT0gQURDMikpID8gKChBREMxMl9DT01NT04pKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKChBREMzNDVfQ09NTU9OKSkpCisjZWxzZQorI2RlZmluZSBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoX19BREN4X18pIChBREMxMl9DT01NT04pCisjZW5kaWYgLyogQURDMzQ1X0NPTU1PTiAqLworLyoqCisgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBjaGVjayBpZiBhbGwgQURDIGluc3RhbmNlcyBzaGFyaW5nIHRoZSBzYW1lCisgKiAgICAgICAgIEFEQyBjb21tb24gaW5zdGFuY2UgYXJlIGRpc2FibGVkLgorICogQG5vdGUgICBUaGlzIGNoZWNrIGlzIHJlcXVpcmVkIGJ5IGZ1bmN0aW9ucyB3aXRoIHNldHRpbmcgY29uZGl0aW9uZWQgdG8KKyAqICAgICAgICAgQURDIHN0YXRlOgorICogICAgICAgICBBbGwgQURDIGluc3RhbmNlcyBvZiB0aGUgQURDIGNvbW1vbiBncm91cCBtdXN0IGJlIGRpc2FibGVkLgorICogICAgICAgICBSZWZlciB0byBmdW5jdGlvbnMgaGF2aW5nIGFyZ3VtZW50ICJBREN4eV9DT01NT04iIGFzIHBhcmFtZXRlci4KKyAqIEBub3RlICAgT24gZGV2aWNlcyB3aXRoIG9ubHkgMSBBREMgY29tbW9uIGluc3RhbmNlLCBwYXJhbWV0ZXIgb2YgdGhpcyBtYWNybworICogICAgICAgICBpcyB1c2VsZXNzIGFuZCBjYW4gYmUgaWdub3JlZCAocGFyYW1ldGVyIGtlcHQgZm9yIGNvbXBhdGliaWxpdHkKKyAqICAgICAgICAgd2l0aCBkZXZpY2VzIGZlYXR1cmluZyBzZXZlcmFsIEFEQyBjb21tb24gaW5zdGFuY2VzKS4KKyAqIEBwYXJhbSAgX19BRENYWV9DT01NT05fXyBBREMgY29tbW9uIGluc3RhbmNlCisgKiAgICAgICAgIChjYW4gYmUgc2V0IGRpcmVjdGx5IGZyb20gQ01TSVMgZGVmaW5pdGlvbiBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8KKyAqIEByZWYgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKCkgKQorICogQHJldHZhbCBWYWx1ZSAiMCIgaWYgYWxsIEFEQyBpbnN0YW5jZXMgc2hhcmluZyB0aGUgc2FtZSBBREMgY29tbW9uIGluc3RhbmNlCisgKiAgICAgICAgIGFyZSBkaXNhYmxlZC4KKyAqICAgICAgICAgVmFsdWUgIjEiIGlmIGF0IGxlYXN0IG9uZSBBREMgaW5zdGFuY2Ugc2hhcmluZyB0aGUgc2FtZSBBREMgY29tbW9uCisgKiBpbnN0YW5jZSBpcyBlbmFibGVkLgorICovCisjaWYgZGVmaW5lZChBREMzNDVfQ09NTU9OKQorI2lmIGRlZmluZWQoQURDNCkgJiYgZGVmaW5lZChBREM1KQorI2RlZmluZSBfX0xMX0FEQ19JU19FTkFCTEVEX0FMTF9DT01NT05fSU5TVEFOQ0UoX19BRENYWV9DT01NT05fXykgXAorICAoKChfX0FEQ1hZX0NPTU1PTl9fKSA9PSBBREMxMl9DT01NT04pICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgID8gKChMTF9BRENfSXNFbmFibGVkKEFEQzEpIHwgTExfQURDX0lzRW5hYmxlZChBREMyKSkpICAgICAgXAorICAgICAgIDogKChMTF9BRENfSXNFbmFibGVkKEFEQzMpIHwgTExfQURDX0lzRW5hYmxlZChBREM0KSB8ICAgICAgXAorICAgICAgICAgICBMTF9BRENfSXNFbmFibGVkKEFEQzUpKSkpCisjZWxzZQorI2RlZmluZSBfX0xMX0FEQ19JU19FTkFCTEVEX0FMTF9DT01NT05fSU5TVEFOQ0UoX19BRENYWV9DT01NT05fXykgXAorICAoKChfX0FEQ1hZX0NPTU1PTl9fKSA9PSBBREMxMl9DT01NT04pICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgID8gKChMTF9BRENfSXNFbmFibGVkKEFEQzEpIHwgTExfQURDX0lzRW5hYmxlZChBREMyKSkpICAgICAgXAorICAgICAgIDogKExMX0FEQ19Jc0VuYWJsZWQoQURDMykpKQorI2VuZGlmIC8qIEFEQzQgJiYgQURDNSAqLworI2Vsc2UKKyNkZWZpbmUgX19MTF9BRENfSVNfRU5BQkxFRF9BTExfQ09NTU9OX0lOU1RBTkNFKF9fQURDWFlfQ09NTU9OX18pIFwKKyAgKExMX0FEQ19Jc0VuYWJsZWQoQURDMSkgfCBMTF9BRENfSXNFbmFibGVkKEFEQzIpKQorI2VuZGlmIC8qIEFEQzM0NV9DT01NT04gKi8KKworLyoqCisgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBkZWZpbmUgdGhlIEFEQyBjb252ZXJzaW9uIGRhdGEgZnVsbC1zY2FsZSBkaWdpdGFsCisgKiAgICAgICAgIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNlbGVjdGVkIEFEQyByZXNvbHV0aW9uLgorICogQG5vdGUgICBBREMgY29udmVyc2lvbiBkYXRhIGZ1bGwtc2NhbGUgY29ycmVzcG9uZHMgdG8gdm9sdGFnZSByYW5nZQorICogICAgICAgICBkZXRlcm1pbmVkIGJ5IGFuYWxvZyB2b2x0YWdlIHJlZmVyZW5jZXMgVnJlZisgYW5kIFZyZWYtCisgKiAgICAgICAgIChyZWZlciB0byByZWZlcmVuY2UgbWFudWFsKS4KKyAqIEBwYXJhbSAgX19BRENfUkVTT0xVVElPTl9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl8xMkIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzEwQgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fOEIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzZCCisgKiBAcmV0dmFsIEFEQyBjb252ZXJzaW9uIGRhdGEgZnVsbC1zY2FsZSBkaWdpdGFsIHZhbHVlICh1bml0OiBkaWdpdGFsIHZhbHVlIG9mCisgKiBBREMgY29udmVyc2lvbiBkYXRhKQorICovCisjZGVmaW5lIF9fTExfQURDX0RJR0lUQUxfU0NBTEUoX19BRENfUkVTT0xVVElPTl9fKSBcCisgICgweEZGRlVMID4+ICgoX19BRENfUkVTT0xVVElPTl9fKSA+PiAoQURDX0NGR1JfUkVTX0JJVE9GRlNFVF9QT1MgLSAxVUwpKSkKKworLyoqCisgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBjb252ZXJ0IHRoZSBBREMgY29udmVyc2lvbiBkYXRhIGZyb20KKyAqICAgICAgICAgYSByZXNvbHV0aW9uIHRvIGFub3RoZXIgcmVzb2x1dGlvbi4KKyAqIEBwYXJhbSAgX19EQVRBX18gQURDIGNvbnZlcnNpb24gZGF0YSB0byBiZSBjb252ZXJ0ZWQKKyAqIEBwYXJhbSAgX19BRENfUkVTT0xVVElPTl9DVVJSRU5UX18gUmVzb2x1dGlvbiBvZiB0aGUgZGF0YSB0byBiZSBjb252ZXJ0ZWQKKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzEyQgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fMTBCCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl84QgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fNkIKKyAqIEBwYXJhbSAgX19BRENfUkVTT0xVVElPTl9UQVJHRVRfXyBSZXNvbHV0aW9uIG9mIHRoZSBkYXRhIGFmdGVyIGNvbnZlcnNpb24KKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzEyQgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fMTBCCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl84QgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fNkIKKyAqIEByZXR2YWwgQURDIGNvbnZlcnNpb24gZGF0YSB0byB0aGUgcmVxdWVzdGVkIHJlc29sdXRpb24KKyAqLworI2RlZmluZSBfX0xMX0FEQ19DT05WRVJUX0RBVEFfUkVTT0xVVElPTihfX0RBVEFfXywgX19BRENfUkVTT0xVVElPTl9DVVJSRU5UX18sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19BRENfUkVTT0xVVElPTl9UQVJHRVRfXykgICAgICAgICAgICBcCisgICgoKF9fREFUQV9fKSA8PCAoKF9fQURDX1JFU09MVVRJT05fQ1VSUkVOVF9fKSA+PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgIChBRENfQ0ZHUl9SRVNfQklUT0ZGU0VUX1BPUyAtIDFVTCkpKSA+PiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoX19BRENfUkVTT0xVVElPTl9UQVJHRVRfXykgPj4gKEFEQ19DRkdSX1JFU19CSVRPRkZTRVRfUE9TIC0gMVVMKSkpCisKKy8qKgorICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gY2FsY3VsYXRlIHRoZSB2b2x0YWdlICh1bml0OiBtVm9sdCkKKyAqICAgICAgICAgY29ycmVzcG9uZGluZyB0byBhIEFEQyBjb252ZXJzaW9uIGRhdGEgKHVuaXQ6IGRpZ2l0YWwgdmFsdWUpLgorICogQG5vdGUgICBBbmFsb2cgcmVmZXJlbmNlIHZvbHRhZ2UgKFZyZWYrKSBtdXN0IGJlIGVpdGhlciBrbm93biBmcm9tCisgKiAgICAgICAgIHVzZXIgYm9hcmQgZW52aXJvbm1lbnQgb3IgY2FuIGJlIGNhbGN1bGF0ZWQgdXNpbmcgQURDIG1lYXN1cmVtZW50CisgKiAgICAgICAgIGFuZCBBREMgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ0FMQ19WUkVGQU5BTE9HX1ZPTFRBR0UoKS4KKyAqIEBwYXJhbSAgX19WUkVGQU5BTE9HX1ZPTFRBR0VfXyBBbmFsb2cgcmVmZXJlbmNlIHZvbHRhZ2UgKHVuaXQ6IG1WKQorICogQHBhcmFtICBfX0FEQ19EQVRBX18gQURDIGNvbnZlcnNpb24gZGF0YSAocmVzb2x1dGlvbiAxMiBiaXRzKQorICogICAgICAgICAgICAgICAgICAgICAgICh1bml0OiBkaWdpdGFsIHZhbHVlKS4KKyAqIEBwYXJhbSAgX19BRENfUkVTT0xVVElPTl9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl8xMkIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzEwQgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fOEIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzZCCisgKiBAcmV0dmFsIEFEQyBjb252ZXJzaW9uIGRhdGEgZXF1aXZhbGVudCB2b2x0YWdlIHZhbHVlICh1bml0OiBtVm9sdCkKKyAqLworI2RlZmluZSBfX0xMX0FEQ19DQUxDX0RBVEFfVE9fVk9MVEFHRShfX1ZSRUZBTkFMT0dfVk9MVEFHRV9fLCBfX0FEQ19EQVRBX18sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19BRENfUkVTT0xVVElPTl9fKSAgICAgICAgICAgICAgICAgICBcCisgICgoX19BRENfREFUQV9fKSAqIChfX1ZSRUZBTkFMT0dfVk9MVEFHRV9fKSAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgX19MTF9BRENfRElHSVRBTF9TQ0FMRShfX0FEQ19SRVNPTFVUSU9OX18pKQorCisvKioKKyAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGNhbGN1bGF0ZSB0aGUgdm9sdGFnZSAodW5pdDogbVZvbHQpCisgKiAgICAgICAgIGNvcnJlc3BvbmRpbmcgdG8gYSBBREMgY29udmVyc2lvbiBkYXRhICh1bml0OiBkaWdpdGFsIHZhbHVlKSBpbgorICogICAgICAgICBkaWZmZXJlbnRpYWwgZW5kZWQgbW9kZS4KKyAqIEBub3RlICAgQURDIGRhdGEgZnJvbSBBREMgZGF0YSByZWdpc3RlciBpcyB1bnNpZ25lZCBhbmQgY2VudGVyZWQgYXJvdW5kCisgKiAgICAgICAgIG1pZGRsZSBjb2RlIGluLiBDb252ZXJ0ZWQgdm9sdGFnZSBjYW4gYmUgcG9zaXRpdmUgb3IgbmVnYXRpdmUKKyAqICAgICAgICAgZGVwZW5kaW5nIG9uIGRpZmZlcmVudGlhbCBpbnB1dCB2b2x0YWdlcy4KKyAqIEBub3RlICAgQW5hbG9nIHJlZmVyZW5jZSB2b2x0YWdlIChWcmVmKykgbXVzdCBiZSBlaXRoZXIga25vd24gZnJvbQorICogICAgICAgICB1c2VyIGJvYXJkIGVudmlyb25tZW50IG9yIGNhbiBiZSBjYWxjdWxhdGVkIHVzaW5nIEFEQyBtZWFzdXJlbWVudAorICogICAgICAgICBhbmQgQURDIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0NBTENfVlJFRkFOQUxPR19WT0xUQUdFKCkuCisgKiBAcGFyYW0gIF9fVlJFRkFOQUxPR19WT0xUQUdFX18gQW5hbG9nIHJlZmVyZW5jZSB2b2x0YWdlICh1bml0OiBtVikKKyAqIEBwYXJhbSAgX19BRENfREFUQV9fIEFEQyBjb252ZXJzaW9uIGRhdGEgKHVuaXQ6IGRpZ2l0YWwgdmFsdWUpLgorICogQHBhcmFtICBfX0FEQ19SRVNPTFVUSU9OX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzEyQgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fMTBCCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl84QgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fNkIKKyAqIEByZXR2YWwgQURDIGNvbnZlcnNpb24gZGF0YSBlcXVpdmFsZW50IHZvbHRhZ2UgdmFsdWUgKHVuaXQ6IG1Wb2x0KQorICovCisjZGVmaW5lIF9fTExfQURDX0NBTENfRElGRl9EQVRBX1RPX1ZPTFRBR0UoX19WUkVGQU5BTE9HX1ZPTFRBR0VfXywgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0FEQ19EQVRBX18sIF9fQURDX1JFU09MVVRJT05fXykgXAorICAoKGludDMyX3QpKChfX0FEQ19EQVRBX18pIDw8IDFVKSAqIChpbnQzMl90KShfX1ZSRUZBTkFMT0dfVk9MVEFHRV9fKSAvICAgICBcCisgICAgICAgKGludDMyX3QpKF9fTExfQURDX0RJR0lUQUxfU0NBTEUoX19BRENfUkVTT0xVVElPTl9fKSkgLSAgICAgICAgICAgICAgIFwKKyAgIChpbnQzMl90KShfX1ZSRUZBTkFMT0dfVk9MVEFHRV9fKSkKKworLyoqCisgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBjYWxjdWxhdGUgYW5hbG9nIHJlZmVyZW5jZSB2b2x0YWdlIChWcmVmKykKKyAqICAgICAgICAgKHVuaXQ6IG1Wb2x0KSBmcm9tIEFEQyBjb252ZXJzaW9uIGRhdGEgb2YgaW50ZXJuYWwgdm9sdGFnZQorICogICAgICAgICByZWZlcmVuY2UgVnJlZkludC4KKyAqIEBub3RlICAgQ29tcHV0YXRpb24gaXMgdXNpbmcgVnJlZkludCBjYWxpYnJhdGlvbiB2YWx1ZQorICogICAgICAgICBzdG9yZWQgaW4gc3lzdGVtIG1lbW9yeSBmb3IgZWFjaCBkZXZpY2UgZHVyaW5nIHByb2R1Y3Rpb24uCisgKiBAbm90ZSAgIFRoaXMgdm9sdGFnZSBkZXBlbmRzIG9uIHVzZXIgYm9hcmQgZW52aXJvbm1lbnQ6IHZvbHRhZ2UgbGV2ZWwKKyAqICAgICAgICAgY29ubmVjdGVkIHRvIHBpbiBWcmVmKy4KKyAqICAgICAgICAgT24gZGV2aWNlcyB3aXRoIHNtYWxsIHBhY2thZ2UsIHRoZSBwaW4gVnJlZisgaXMgbm90IHByZXNlbnQKKyAqICAgICAgICAgYW5kIGludGVybmFsbHkgYm9uZGVkIHRvIHBpbiBWZGRhLgorICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllcywgY2FsaWJyYXRpb24gZGF0YSBvZiBpbnRlcm5hbCB2b2x0YWdlIHJlZmVyZW5jZQorICogICAgICAgICBWcmVmSW50IGNvcnJlc3BvbmRzIHRvIGEgcmVzb2x1dGlvbiBvZiAxMiBiaXRzLAorICogICAgICAgICB0aGlzIGlzIHRoZSByZWNvbW1lbmRlZCBBREMgcmVzb2x1dGlvbiB0byBjb252ZXJ0IHZvbHRhZ2Ugb2YKKyAqICAgICAgICAgaW50ZXJuYWwgdm9sdGFnZSByZWZlcmVuY2UgVnJlZkludC4KKyAqICAgICAgICAgT3RoZXJ3aXNlLCB0aGlzIG1hY3JvIHBlcmZvcm1zIHRoZSBwcm9jZXNzaW5nIHRvIHNjYWxlCisgKiAgICAgICAgIEFEQyBjb252ZXJzaW9uIGRhdGEgdG8gMTIgYml0cy4KKyAqIEBwYXJhbSAgX19WUkVGSU5UX0FEQ19EQVRBX18gQURDIGNvbnZlcnNpb24gZGF0YSAocmVzb2x1dGlvbiAxMiBiaXRzKQorICogICAgICAgICBvZiBpbnRlcm5hbCB2b2x0YWdlIHJlZmVyZW5jZSBWcmVmSW50ICh1bml0OiBkaWdpdGFsIHZhbHVlKS4KKyAqIEBwYXJhbSAgX19BRENfUkVTT0xVVElPTl9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl8xMkIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzEwQgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fOEIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzZCCisgKiBAcmV0dmFsIEFuYWxvZyByZWZlcmVuY2Ugdm9sdGFnZSAodW5pdDogbVYpCisgKi8KKyNkZWZpbmUgX19MTF9BRENfQ0FMQ19WUkVGQU5BTE9HX1ZPTFRBR0UoX19WUkVGSU5UX0FEQ19EQVRBX18sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19BRENfUkVTT0xVVElPTl9fKSAgIFwKKyAgKCgodWludDMyX3QpKCpWUkVGSU5UX0NBTF9BRERSKSAqIFZSRUZJTlRfQ0FMX1ZSRUYpIC8gICAgICAgIFwKKyAgIF9fTExfQURDX0NPTlZFUlRfREFUQV9SRVNPTFVUSU9OKCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAoX19WUkVGSU5UX0FEQ19EQVRBX18pLCAoX19BRENfUkVTT0xVVElPTl9fKSwgTExfQURDX1JFU09MVVRJT05fMTJCKSkKKworLyoqCisgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBjYWxjdWxhdGUgdGhlIHRlbXBlcmF0dXJlICh1bml0OiBkZWdyZWUgQ2Vsc2l1cykKKyAqICAgICAgICAgZnJvbSBBREMgY29udmVyc2lvbiBkYXRhIG9mIGludGVybmFsIHRlbXBlcmF0dXJlIHNlbnNvci4KKyAqIEBub3RlICAgQ29tcHV0YXRpb24gaXMgdXNpbmcgdGVtcGVyYXR1cmUgc2Vuc29yIGNhbGlicmF0aW9uIHZhbHVlcworICogICAgICAgICBzdG9yZWQgaW4gc3lzdGVtIG1lbW9yeSBmb3IgZWFjaCBkZXZpY2UgZHVyaW5nIHByb2R1Y3Rpb24uCisgKiBAbm90ZSAgIENhbGN1bGF0aW9uIGZvcm11bGE6CisgKiAgICAgICAgICAgVGVtcGVyYXR1cmUgPSAoKFRTX0FEQ19EQVRBIC0gVFNfQ0FMMSkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAoVFNfQ0FMMl9URU1QIC0gVFNfQ0FMMV9URU1QKSkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIC8gKFRTX0NBTDIgLSBUU19DQUwxKSArIFRTX0NBTDFfVEVNUAorICogICAgICAgICAgIHdpdGggVFNfQURDX0RBVEEgPSB0ZW1wZXJhdHVyZSBzZW5zb3IgcmF3IGRhdGEgbWVhc3VyZWQgYnkgQURDCisgKiAgICAgICAgICAgICAgICBBdmdfU2xvcGUgPSAoVFNfQ0FMMiAtIFRTX0NBTDEpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChUU19DQUwyX1RFTVAgLSBUU19DQUwxX1RFTVApCisgKiAgICAgICAgICAgICAgICBUU19DQUwxICAgPSBlcXVpdmFsZW50IFRTX0FEQ19EQVRBIGF0IHRlbXBlcmF0dXJlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBURU1QX0RFR0NfQ0FMMSAoY2FsaWJyYXRlZCBpbiBmYWN0b3J5KQorICogICAgICAgICAgICAgICAgVFNfQ0FMMiAgID0gZXF1aXZhbGVudCBUU19BRENfREFUQSBhdCB0ZW1wZXJhdHVyZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVNUF9ERUdDX0NBTDIgKGNhbGlicmF0ZWQgaW4gZmFjdG9yeSkKKyAqICAgICAgICAgQ2F1dGlvbjogQ2FsY3VsYXRpb24gcmVsZXZhbmN5IHVuZGVyIHJlc2VydmUgdGhhdCBjYWxpYnJhdGlvbgorICogICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIGFyZSBjb3JyZWN0IChhZGRyZXNzIGFuZCBkYXRhKS4KKyAqICAgICAgICAgICAgICAgICAgVG8gY2FsY3VsYXRlIHRlbXBlcmF0dXJlIHVzaW5nIHRlbXBlcmF0dXJlIHNlbnNvcgorICogICAgICAgICAgICAgICAgICBkYXRhc2hlZXQgdHlwaWNhbCB2YWx1ZXMgKGdlbmVyaWMgdmFsdWVzIGxlc3MsIHRoZXJlZm9yZQorICogICAgICAgICAgICAgICAgICBsZXNzIGFjY3VyYXRlIHRoYW4gY2FsaWJyYXRlZCB2YWx1ZXMpLAorICogICAgICAgICAgICAgICAgICB1c2UgaGVscGVyIG1hY3JvIEByZWYKKyAqIF9fTExfQURDX0NBTENfVEVNUEVSQVRVUkVfVFlQX1BBUkFNUygpLgorICogQG5vdGUgICBBcyBjYWxjdWxhdGlvbiBpbnB1dCwgdGhlIGFuYWxvZyByZWZlcmVuY2Ugdm9sdGFnZSAoVnJlZispIG11c3QgYmUKKyAqICAgICAgICAgZGVmaW5lZCBhcyBpdCBpbXBhY3RzIHRoZSBBREMgTFNCIGVxdWl2YWxlbnQgdm9sdGFnZS4KKyAqIEBub3RlICAgQW5hbG9nIHJlZmVyZW5jZSB2b2x0YWdlIChWcmVmKykgbXVzdCBiZSBlaXRoZXIga25vd24gZnJvbQorICogICAgICAgICB1c2VyIGJvYXJkIGVudmlyb25tZW50IG9yIGNhbiBiZSBjYWxjdWxhdGVkIHVzaW5nIEFEQyBtZWFzdXJlbWVudAorICogICAgICAgICBhbmQgQURDIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0NBTENfVlJFRkFOQUxPR19WT0xUQUdFKCkuCisgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBjYWxpYnJhdGlvbiBkYXRhIG9mIHRlbXBlcmF0dXJlIHNlbnNvcgorICogICAgICAgICBjb3JyZXNwb25kcyB0byBhIHJlc29sdXRpb24gb2YgMTIgYml0cywKKyAqICAgICAgICAgdGhpcyBpcyB0aGUgcmVjb21tZW5kZWQgQURDIHJlc29sdXRpb24gdG8gY29udmVydCB2b2x0YWdlIG9mCisgKiAgICAgICAgIHRlbXBlcmF0dXJlIHNlbnNvci4KKyAqICAgICAgICAgT3RoZXJ3aXNlLCB0aGlzIG1hY3JvIHBlcmZvcm1zIHRoZSBwcm9jZXNzaW5nIHRvIHNjYWxlCisgKiAgICAgICAgIEFEQyBjb252ZXJzaW9uIGRhdGEgdG8gMTIgYml0cy4KKyAqIEBwYXJhbSAgX19WUkVGQU5BTE9HX1ZPTFRBR0VfXyAgQW5hbG9nIHJlZmVyZW5jZSB2b2x0YWdlICh1bml0OiBtVikKKyAqIEBwYXJhbSAgX19URU1QU0VOU09SX0FEQ19EQVRBX18gQURDIGNvbnZlcnNpb24gZGF0YSBvZiBpbnRlcm5hbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wZXJhdHVyZSBzZW5zb3IgKHVuaXQ6IGRpZ2l0YWwgdmFsdWUpLgorICogQHBhcmFtICBfX0FEQ19SRVNPTFVUSU9OX18gICAgICBBREMgcmVzb2x1dGlvbiBhdCB3aGljaCBpbnRlcm5hbCB0ZW1wZXJhdHVyZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5zb3Igdm9sdGFnZSBoYXMgYmVlbiBtZWFzdXJlZC4KKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzEyQgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fMTBCCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl84QgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fNkIKKyAqIEByZXR2YWwgVGVtcGVyYXR1cmUgKHVuaXQ6IGRlZ3JlZSBDZWxzaXVzKQorICogICAgICAgICBJbiBjYXNlIG9yIGVycm9yLCB2YWx1ZSBMTF9BRENfVEVNUEVSQVRVUkVfQ0FMQ19FUlJPUiBpcyByZXR1cm5lZAorICogKGluY29uc2lzdGVudCB0ZW1wZXJhdHVyZSB2YWx1ZSkKKyAqLworI2RlZmluZSBfX0xMX0FEQ19DQUxDX1RFTVBFUkFUVVJFKF9fVlJFRkFOQUxPR19WT0xUQUdFX18sICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX1RFTVBTRU5TT1JfQURDX0RBVEFfXywgX19BRENfUkVTT0xVVElPTl9fKSBcCisgICgoKChpbnQzMl90KSAqIFRFTVBTRU5TT1JfQ0FMMl9BRERSIC0gKGludDMyX3QpICogVEVNUFNFTlNPUl9DQUwxX0FERFIpICE9ICAgXAorICAgIDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICA/ICgoKCgoKGludDMyX3QpKChfX0xMX0FEQ19DT05WRVJUX0RBVEFfUkVTT0xVVElPTiggICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX1RFTVBTRU5TT1JfQURDX0RBVEFfXyksIChfX0FEQ19SRVNPTFVUSU9OX18pLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTF9BRENfUkVTT0xVVElPTl8xMkIpICogICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoX19WUkVGQU5BTE9HX1ZPTFRBR0VfXykpIC8gICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBURU1QU0VOU09SX0NBTF9WUkVGQU5BTE9HKSAtICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAoaW50MzJfdCkgKiBURU1QU0VOU09SX0NBTDFfQUREUikpICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIChpbnQzMl90KShURU1QU0VOU09SX0NBTDJfVEVNUCAtIFRFTVBTRU5TT1JfQ0FMMV9URU1QKSkgLyAgICAgICAgICBcCisgICAgICAgICAgIChpbnQzMl90KSgoaW50MzJfdCkgKiBURU1QU0VOU09SX0NBTDJfQUREUiAtICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgKGludDMyX3QpICogVEVNUFNFTlNPUl9DQUwxX0FERFIpKSArICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBURU1QU0VOU09SX0NBTDFfVEVNUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgOiAoKGludDMyX3QpTExfQURDX1RFTVBFUkFUVVJFX0NBTENfRVJST1IpKQorCisvKioKKyAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGNhbGN1bGF0ZSB0aGUgdGVtcGVyYXR1cmUgKHVuaXQ6IGRlZ3JlZSBDZWxzaXVzKQorICogICAgICAgICBmcm9tIEFEQyBjb252ZXJzaW9uIGRhdGEgb2YgaW50ZXJuYWwgdGVtcGVyYXR1cmUgc2Vuc29yLgorICogQG5vdGUgICBDb21wdXRhdGlvbiBpcyB1c2luZyB0ZW1wZXJhdHVyZSBzZW5zb3IgdHlwaWNhbCB2YWx1ZXMKKyAqICAgICAgICAgKHJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQpLgorICogQG5vdGUgICBDYWxjdWxhdGlvbiBmb3JtdWxhOgorICogICAgICAgICAgIFRlbXBlcmF0dXJlID0gKFRTX1RZUF9DQUx4X1ZPTFQodVYpIC0gVFNfQURDX0RBVEEgKiBDb252ZXJzaW9uX3VWKQorICogICAgICAgICAgICAgICAgICAgICAgICAgLyBBdmdfU2xvcGUgKyBDQUx4X1RFTVAKKyAqICAgICAgICAgICB3aXRoIFRTX0FEQ19EQVRBICAgICAgPSB0ZW1wZXJhdHVyZSBzZW5zb3IgcmF3IGRhdGEgbWVhc3VyZWQgYnkgQURDCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuaXQ6IGRpZ2l0YWwgdmFsdWUpCisgKiAgICAgICAgICAgICAgICBBdmdfU2xvcGUgICAgICAgID0gdGVtcGVyYXR1cmUgc2Vuc29yIHNsb3BlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuaXQ6IHVWL0RlZ3JlZSBDZWxzaXVzKQorICogICAgICAgICAgICAgICAgVFNfVFlQX0NBTHhfVk9MVCA9IHRlbXBlcmF0dXJlIHNlbnNvciBkaWdpdGFsIHZhbHVlIGF0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGVyYXR1cmUgQ0FMeF9URU1QICh1bml0OiBtVikKKyAqICAgICAgICAgQ2F1dGlvbjogQ2FsY3VsYXRpb24gcmVsZXZhbmN5IHVuZGVyIHJlc2VydmUgdGhlIHRlbXBlcmF0dXJlIHNlbnNvcgorICogICAgICAgICAgICAgICAgICBvZiB0aGUgY3VycmVudCBkZXZpY2UgaGFzIGNoYXJhY3RlcmlzdGljcyBpbiBsaW5lIHdpdGgKKyAqICAgICAgICAgICAgICAgICAgZGF0YXNoZWV0IHR5cGljYWwgdmFsdWVzLgorICogICAgICAgICAgICAgICAgICBJZiB0ZW1wZXJhdHVyZSBzZW5zb3IgY2FsaWJyYXRpb24gdmFsdWVzIGFyZSBhdmFpbGFibGUgb24KKyAqICAgICAgICAgICAgICAgICAgb24gdGhpcyBkZXZpY2UgKHByZXNlbmNlIG9mIG1hY3JvCisgKiBfX0xMX0FEQ19DQUxDX1RFTVBFUkFUVVJFKCkpLCB0ZW1wZXJhdHVyZSBjYWxjdWxhdGlvbiB3aWxsIGJlIG1vcmUgYWNjdXJhdGUKKyAqIHVzaW5nIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0NBTENfVEVNUEVSQVRVUkUoKS4KKyAqIEBub3RlICAgQXMgY2FsY3VsYXRpb24gaW5wdXQsIHRoZSBhbmFsb2cgcmVmZXJlbmNlIHZvbHRhZ2UgKFZyZWYrKSBtdXN0IGJlCisgKiAgICAgICAgIGRlZmluZWQgYXMgaXQgaW1wYWN0cyB0aGUgQURDIExTQiBlcXVpdmFsZW50IHZvbHRhZ2UuCisgKiBAbm90ZSAgIEFuYWxvZyByZWZlcmVuY2Ugdm9sdGFnZSAoVnJlZispIG11c3QgYmUgZWl0aGVyIGtub3duIGZyb20KKyAqICAgICAgICAgdXNlciBib2FyZCBlbnZpcm9ubWVudCBvciBjYW4gYmUgY2FsY3VsYXRlZCB1c2luZyBBREMgbWVhc3VyZW1lbnQKKyAqICAgICAgICAgYW5kIEFEQyBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19DQUxDX1ZSRUZBTkFMT0dfVk9MVEFHRSgpLgorICogQG5vdGUgICBBREMgbWVhc3VyZW1lbnQgZGF0YSBtdXN0IGNvcnJlc3BvbmQgdG8gYSByZXNvbHV0aW9uIG9mIDEyIGJpdHMKKyAqICAgICAgICAgKGZ1bGwgc2NhbGUgZGlnaXRhbCB2YWx1ZSA0MDk1KS4gSWYgbm90IHRoZSBjYXNlLCB0aGUgZGF0YSBtdXN0IGJlCisgKiAgICAgICAgIHByZWxpbWluYXJpbHkgcmVzY2FsZWQgdG8gYW4gZXF1aXZhbGVudCByZXNvbHV0aW9uIG9mIDEyIGJpdHMuCisgKiBAcGFyYW0gIF9fVEVNUFNFTlNPUl9UWVBfQVZHU0xPUEVfXyAgIERldmljZSBkYXRhc2hlZXQgZGF0YTogVGVtcGVyYXR1cmUKKyAqIHNlbnNvciBzbG9wZSB0eXBpY2FsIHZhbHVlICh1bml0OiB1Vi9EZWdDZWxzaXVzKS4gT24gU1RNMzJHNCwgcmVmZXIgdG8gZGV2aWNlCisgKiBkYXRhc2hlZXQgcGFyYW1ldGVyICJBdmdfU2xvcGUiLgorICogQHBhcmFtICBfX1RFTVBTRU5TT1JfVFlQX0NBTFhfVl9fICAgICBEZXZpY2UgZGF0YXNoZWV0IGRhdGE6IFRlbXBlcmF0dXJlCisgKiBzZW5zb3Igdm9sdGFnZSB0eXBpY2FsIHZhbHVlIChhdCB0ZW1wZXJhdHVyZSBhbmQgVnJlZisgZGVmaW5lZCBpbiBwYXJhbWV0ZXJzCisgKiBiZWxvdykgKHVuaXQ6IG1WKS4gT24gU1RNMzJHNCwgcmVmZXIgdG8gZGF0YXNoZWV0IHBhcmFtZXRlciAiVjMwIgorICogKGNvcnJlc3BvbmRpbmcgdG8gVFNfQ0FMMSkuCisgKiBAcGFyYW0gIF9fVEVNUFNFTlNPUl9DQUxYX1RFTVBfXyAgICAgIERldmljZSBkYXRhc2hlZXQgZGF0YTogVGVtcGVyYXR1cmUgYXQKKyAqIHdoaWNoIHRlbXBlcmF0dXJlIHNlbnNvciB2b2x0YWdlIChzZWUgcGFyYW1ldGVyIGFib3ZlKSBpcyBjb3JyZXNwb25kaW5nCisgKiAodW5pdDogbVYpCisgKiBAcGFyYW0gIF9fVlJFRkFOQUxPR19WT0xUQUdFX18gICAgICAgIEFuYWxvZyB2b2x0YWdlIHJlZmVyZW5jZSAoVnJlZispIHZhbHVlCisgKiAodW5pdDogbVYpCisgKiBAcGFyYW0gIF9fVEVNUFNFTlNPUl9BRENfREFUQV9fICAgICAgIEFEQyBjb252ZXJzaW9uIGRhdGEgb2YgaW50ZXJuYWwKKyAqIHRlbXBlcmF0dXJlIHNlbnNvciAodW5pdDogZGlnaXRhbCB2YWx1ZSkuCisgKiBAcGFyYW0gIF9fQURDX1JFU09MVVRJT05fXyAgICAgICAgICAgIEFEQyByZXNvbHV0aW9uIGF0IHdoaWNoIGludGVybmFsCisgKiB0ZW1wZXJhdHVyZSBzZW5zb3Igdm9sdGFnZSBoYXMgYmVlbiBtZWFzdXJlZC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZgorICogdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl8xMkIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzEwQgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fOEIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzZCCisgKiBAcmV0dmFsIFRlbXBlcmF0dXJlICh1bml0OiBkZWdyZWUgQ2Vsc2l1cykKKyAqLworI2RlZmluZSBfX0xMX0FEQ19DQUxDX1RFTVBFUkFUVVJFX1RZUF9QQVJBTVMoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX1RFTVBTRU5TT1JfVFlQX0FWR1NMT1BFX18sIF9fVEVNUFNFTlNPUl9UWVBfQ0FMWF9WX18sICAgICAgICAgICAgICAgICAgICBcCisgICAgX19URU1QU0VOU09SX0NBTFhfVEVNUF9fLCBfX1ZSRUZBTkFMT0dfVk9MVEFHRV9fLCBfX1RFTVBTRU5TT1JfQURDX0RBVEFfXywgXAorICAgIF9fQURDX1JFU09MVVRJT05fXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoKChpbnQzMl90KSgoKChfX1RFTVBTRU5TT1JfQURDX0RBVEFfXykgKiAoX19WUkVGQU5BTE9HX1ZPTFRBR0VfXykpIC8gICAgICBcCisgICAgICAgICAgICAgICAgIF9fTExfQURDX0RJR0lUQUxfU0NBTEUoX19BRENfUkVTT0xVVElPTl9fKSkgKiAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIDEwMDBVTCkgLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIChpbnQzMl90KSgoKF9fVEVNUFNFTlNPUl9UWVBfQ0FMWF9WX18pKSAqIDEwMDBVTCkpKSAvICAgICAgICAgICAgICAgICAgICBcCisgICAgKGludDMyX3QpKF9fVEVNUFNFTlNPUl9UWVBfQVZHU0xPUEVfXykpICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKGludDMyX3QpKF9fVEVNUFNFTlNPUl9DQUxYX1RFTVBfXykpCisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucyBBREMgRXhwb3J0ZWQgRnVuY3Rpb25zCisgKiBAeworICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VGX0RNQV9NYW5hZ2VtZW50IEFEQyBETUEgbWFuYWdlbWVudAorICogQHsKKyAqLworLyogTm90ZTogTEwgQURDIGZ1bmN0aW9ucyB0byBzZXQgRE1BIHRyYW5zZmVyIGFyZSBsb2NhdGVkIGludG8gc2VjdGlvbnMgb2YgICAgKi8KKy8qICAgICAgIGNvbmZpZ3VyYXRpb24gb2YgQURDIGluc3RhbmNlLCBncm91cHMgYW5kIG11bHRpbW9kZSAoaWYgYXZhaWxhYmxlKTogICovCisvKiAgICAgICBAcmVmIExMX0FEQ19SRUdfU2V0RE1BVHJhbnNmZXIoKSwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKioKKyAqIEBicmllZiAgRnVuY3Rpb24gdG8gaGVscCB0byBjb25maWd1cmUgRE1BIHRyYW5zZmVyIGZyb20gQURDOiByZXRyaWV2ZSB0aGUKKyAqICAgICAgICAgQURDIHJlZ2lzdGVyIGFkZHJlc3MgZnJvbSBBREMgaW5zdGFuY2UgYW5kIGEgbGlzdCBvZiBBREMgcmVnaXN0ZXJzCisgKiAgICAgICAgIGludGVuZGVkIHRvIGJlIHVzZWQgKG1vc3QgY29tbW9ubHkpIHdpdGggRE1BIHRyYW5zZmVyLgorICogQG5vdGUgICBUaGVzZSBBREMgcmVnaXN0ZXJzIGFyZSBkYXRhIHJlZ2lzdGVyczoKKyAqICAgICAgICAgd2hlbiBBREMgY29udmVyc2lvbiBkYXRhIGlzIGF2YWlsYWJsZSBpbiBBREMgZGF0YSByZWdpc3RlcnMsCisgKiAgICAgICAgIEFEQyBnZW5lcmF0ZXMgYSBETUEgdHJhbnNmZXIgcmVxdWVzdC4KKyAqIEBub3RlICAgVGhpcyBtYWNybyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHdpdGggTEwgRE1BIGRyaXZlciwgcmVmZXIgdG8KKyAqICAgICAgICAgZnVuY3Rpb24gIkxMX0RNQV9Db25maWdBZGRyZXNzZXMoKSIuCisgKiAgICAgICAgIEV4YW1wbGU6CisgKiAgICAgICAgICAgTExfRE1BX0NvbmZpZ0FkZHJlc3NlcyhETUExLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfRE1BX0NIQU5ORUxfMSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX0FEQ19ETUFfR2V0UmVnQWRkcihBREMxLAorICogTExfQURDX0RNQV9SRUdfUkVHVUxBUl9EQVRBKSwgKHVpbnQzMl90KSY8IGFycmF5IG9yIHZhcmlhYmxlID4sCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTF9ETUFfRElSRUNUSU9OX1BFUklQSF9UT19NRU1PUlkpOworICogQG5vdGUgICBGb3IgZGV2aWNlcyB3aXRoIHNldmVyYWwgQURDOiBpbiBtdWx0aW1vZGUsIHNvbWUgZGV2aWNlcworICogICAgICAgICB1c2UgYSBkaWZmZXJlbnQgZGF0YSByZWdpc3RlciBvdXRzaWRlIG9mIEFEQyBpbnN0YW5jZSBzY29wZQorICogICAgICAgICAoY29tbW9uIGRhdGEgcmVnaXN0ZXIpLiBUaGlzIG1hY3JvIG1hbmFnZXMgdGhpcyByZWdpc3RlciBkaWZmZXJlbmNlLAorICogICAgICAgICBvbmx5IEFEQyBpbnN0YW5jZSBoYXMgdG8gYmUgc2V0IGFzIHBhcmFtZXRlci4KKyAqIEBybXRvbGwgRFIgICAgICAgUkRBVEEgICAgICAgICAgTExfQURDX0RNQV9HZXRSZWdBZGRyXG4KKyAqICAgICAgICAgQ0RSICAgICAgUkRBVEFfTVNUICAgICAgTExfQURDX0RNQV9HZXRSZWdBZGRyXG4KKyAqICAgICAgICAgQ0RSICAgICAgUkRBVEFfU0xWICAgICAgTExfQURDX0RNQV9HZXRSZWdBZGRyCisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcGFyYW0gIFJlZ2lzdGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfRE1BX1JFR19SRUdVTEFSX0RBVEEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19ETUFfUkVHX1JFR1VMQVJfREFUQV9NVUxUSSAoMSkKKyAqCisgKiAgICAgICAgICgxKSBBdmFpbGFibGUgb24gZGV2aWNlcyB3aXRoIHNldmVyYWwgQURDIGluc3RhbmNlcy4KKyAqIEByZXR2YWwgQURDIHJlZ2lzdGVyIGFkZHJlc3MKKyAqLworI2lmIGRlZmluZWQoQURDX01VTFRJTU9ERV9TVVBQT1JUKQorX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19ETUFfR2V0UmVnQWRkcihjb25zdCBBRENfVHlwZURlZiAqQURDeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUmVnaXN0ZXIpIHsKKyAgdWludDMyX3QgZGF0YV9yZWdfYWRkcjsKKworICBpZiAoUmVnaXN0ZXIgPT0gTExfQURDX0RNQV9SRUdfUkVHVUxBUl9EQVRBKSB7CisgICAgLyogUmV0cmlldmUgYWRkcmVzcyBvZiByZWdpc3RlciBEUiAqLworICAgIGRhdGFfcmVnX2FkZHIgPSAodWludDMyX3QpICYgKEFEQ3gtPkRSKTsKKyAgfSBlbHNlIC8qIChSZWdpc3RlciA9PSBMTF9BRENfRE1BX1JFR19SRUdVTEFSX0RBVEFfTVVMVEkpICovCisgIHsKKyAgICAvKiBSZXRyaWV2ZSBhZGRyZXNzIG9mIHJlZ2lzdGVyIENEUiAqLworICAgIGRhdGFfcmVnX2FkZHIgPSAodWludDMyX3QpICYgKChfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoQURDeCkpLT5DRFIpOworICB9CisKKyAgcmV0dXJuIGRhdGFfcmVnX2FkZHI7Cit9CisjZWxzZQorX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19ETUFfR2V0UmVnQWRkcihjb25zdCBBRENfVHlwZURlZiAqQURDeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUmVnaXN0ZXIpIHsKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICAodm9pZCkoUmVnaXN0ZXIpOworCisgIC8qIFJldHJpZXZlIGFkZHJlc3Mgb2YgcmVnaXN0ZXIgRFIgKi8KKyAgcmV0dXJuICh1aW50MzJfdCkgJiAoQURDeC0+RFIpOworfQorI2VuZGlmIC8qIEFEQ19NVUxUSU1PREVfU1VQUE9SVCAqLworCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUZfQ29uZmlndXJhdGlvbl9BRENfQ29tbW9uIENvbmZpZ3VyYXRpb24gb2YgQURDCisgKiBoaWVyYXJjaGljYWwgc2NvcGU6IGNvbW1vbiB0byBzZXZlcmFsIEFEQyBpbnN0YW5jZXMKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgIFNldCBwYXJhbWV0ZXIgY29tbW9uIHRvIHNldmVyYWwgQURDOiBDbG9jayBzb3VyY2UgYW5kIHByZXNjYWxlci4KKyAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIGlmIEFEQyBncm91cCBpbmplY3RlZCBpcyB1c2VkLCBzb21lCisgKiAgICAgICAgIGNsb2NrIHJhdGlvIGNvbnN0cmFpbnRzIGJldHdlZW4gQURDIGNsb2NrIGFuZCBBSEIgY2xvY2sKKyAqICAgICAgICAgbXVzdCBiZSByZXNwZWN0ZWQuCisgKiAgICAgICAgIFJlZmVyIHRvIHJlZmVyZW5jZSBtYW51YWwuCisgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICogICAgICAgICBBREMgc3RhdGU6CisgKiAgICAgICAgIEFsbCBBREMgaW5zdGFuY2VzIG9mIHRoZSBBREMgY29tbW9uIGdyb3VwIG11c3QgYmUgZGlzYWJsZWQuCisgKiAgICAgICAgIFRoaXMgY2hlY2sgY2FuIGJlIGRvbmUgd2l0aCBmdW5jdGlvbiBAcmVmIExMX0FEQ19Jc0VuYWJsZWQoKSBmb3IgZWFjaAorICogICAgICAgICBBREMgaW5zdGFuY2Ugb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvIGhlbHBlciBtYWNybworICogICAgICAgICBAcmVmIF9fTExfQURDX0lTX0VOQUJMRURfQUxMX0NPTU1PTl9JTlNUQU5DRSgpLgorICogQHJtdG9sbCBDQ1IgICAgICBDS01PREUgICAgICAgICBMTF9BRENfU2V0Q29tbW9uQ2xvY2tcbgorICogICAgICAgICBDQ1IgICAgICBQUkVTQyAgICAgICAgICBMTF9BRENfU2V0Q29tbW9uQ2xvY2sKKyAqIEBwYXJhbSAgQURDeHlfQ09NTU9OIEFEQyBjb21tb24gaW5zdGFuY2UKKyAqICAgICAgICAgKGNhbiBiZSBzZXQgZGlyZWN0bHkgZnJvbSBDTVNJUyBkZWZpbml0aW9uIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybworICogQHJlZiBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoKSApCisgKiBAcGFyYW0gIENvbW1vbkNsb2NrIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DTE9DS19TWU5DX1BDTEtfRElWMgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX1NZTkNfUENMS19ESVY0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX0FTWU5DX0RJVjIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DTE9DS19BU1lOQ19ESVY0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWNgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX0FTWU5DX0RJVjgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DTE9DS19BU1lOQ19ESVYxMAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX0FTWU5DX0RJVjEyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMTYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DTE9DS19BU1lOQ19ESVYzMgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX0FTWU5DX0RJVjY0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMTI4CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMjU2CisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1NldENvbW1vbkNsb2NrKEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENvbW1vbkNsb2NrKSB7CisgIE1PRElGWV9SRUcoQURDeHlfQ09NTU9OLT5DQ1IsIEFEQ19DQ1JfQ0tNT0RFIHwgQURDX0NDUl9QUkVTQywgQ29tbW9uQ2xvY2spOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IHBhcmFtZXRlciBjb21tb24gdG8gc2V2ZXJhbCBBREM6IENsb2NrIHNvdXJjZSBhbmQgcHJlc2NhbGVyLgorICogQHJtdG9sbCBDQ1IgICAgICBDS01PREUgICAgICAgICBMTF9BRENfR2V0Q29tbW9uQ2xvY2tcbgorICogICAgICAgICBDQ1IgICAgICBQUkVTQyAgICAgICAgICBMTF9BRENfR2V0Q29tbW9uQ2xvY2sKKyAqIEBwYXJhbSAgQURDeHlfQ09NTU9OIEFEQyBjb21tb24gaW5zdGFuY2UKKyAqICAgICAgICAgKGNhbiBiZSBzZXQgZGlyZWN0bHkgZnJvbSBDTVNJUyBkZWZpbml0aW9uIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybworICogQHJlZiBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoKSApCisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DTE9DS19TWU5DX1BDTEtfRElWMgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX1NZTkNfUENMS19ESVY0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX0FTWU5DX0RJVjIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DTE9DS19BU1lOQ19ESVY0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWNgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX0FTWU5DX0RJVjgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DTE9DS19BU1lOQ19ESVYxMAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX0FTWU5DX0RJVjEyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMTYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DTE9DS19BU1lOQ19ESVYzMgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX0FTWU5DX0RJVjY0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMTI4CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMjU2CisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfQURDX0dldENvbW1vbkNsb2NrKGNvbnN0IEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OKSB7CisgIHJldHVybiAoCisgICAgICB1aW50MzJfdCkoUkVBRF9CSVQoQURDeHlfQ09NTU9OLT5DQ1IsIEFEQ19DQ1JfQ0tNT0RFIHwgQURDX0NDUl9QUkVTQykpOworfQorCisvKioKKyAqIEBicmllZiAgU2V0IHBhcmFtZXRlciBjb21tb24gdG8gc2V2ZXJhbCBBREM6IG1lYXN1cmVtZW50IHBhdGggdG8KKyAqICAgICAgICAgaW50ZXJuYWwgY2hhbm5lbHMgKFZyZWZJbnQsIHRlbXBlcmF0dXJlIHNlbnNvciwgLi4uKS4KKyAqICAgICAgICAgQ29uZmlndXJlIGFsbCBwYXRocyAob3ZlcndyaXRlIGN1cnJlbnQgY29uZmlndXJhdGlvbikuCisgKiBAbm90ZSAgIE9uZSBvciBzZXZlcmFsIHZhbHVlcyBjYW4gYmUgc2VsZWN0ZWQuCisgKiAgICAgICAgIEV4YW1wbGU6IChMTF9BRENfUEFUSF9JTlRFUk5BTF9WUkVGSU5UIHwKKyAqICAgICAgICAgICAgICAgICAgIExMX0FEQ19QQVRIX0lOVEVSTkFMX1RFTVBTRU5TT1IpCisgKiAgICAgICAgIFRoZSB2YWx1ZXMgbm90IHNlbGVjdGVkIGFyZSByZW1vdmVkIGZyb20gY29uZmlndXJhdGlvbi4KKyAqIEBub3RlICAgU3RhYmlsaXphdGlvbiB0aW1lIG9mIG1lYXN1cmVtZW50IHBhdGggdG8gaW50ZXJuYWwgY2hhbm5lbDoKKyAqICAgICAgICAgQWZ0ZXIgZW5hYmxpbmcgaW50ZXJuYWwgcGF0aHMsIGJlZm9yZSBzdGFydGluZyBBREMgY29udmVyc2lvbiwKKyAqICAgICAgICAgYSBkZWxheSBpcyByZXF1aXJlZCBmb3IgaW50ZXJuYWwgdm9sdGFnZSByZWZlcmVuY2UgYW5kCisgKiAgICAgICAgIHRlbXBlcmF0dXJlIHNlbnNvciBzdGFiaWxpemF0aW9uIHRpbWUuCisgKiAgICAgICAgIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQuCisgKiAgICAgICAgIFJlZmVyIHRvIGxpdGVyYWwgQHJlZiBMTF9BRENfREVMQVlfVlJFRklOVF9TVEFCX1VTLgorICogICAgICAgICBSZWZlciB0byBsaXRlcmFscyBAcmVmIExMX0FEQ19ERUxBWV9URU1QU0VOU09SX1NUQUJfVVMsCisgKiAgICAgICAgIEByZWYgTExfQURDX0RFTEFZX1RFTVBTRU5TT1JfQlVGRkVSX1NUQUJfVVMuCisgKiBAbm90ZSAgIEFEQyBpbnRlcm5hbCBjaGFubmVsIHNhbXBsaW5nIHRpbWUgY29uc3RyYWludDoKKyAqICAgICAgICAgRm9yIEFEQyBjb252ZXJzaW9uIG9mIGludGVybmFsIGNoYW5uZWxzLAorICogICAgICAgICBhIHNhbXBsaW5nIHRpbWUgbWluaW11bSB2YWx1ZSBpcyByZXF1aXJlZC4KKyAqICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldC4KKyAqIEBybXRvbGwgQ0NSICAgICAgVlJFRkVOICAgICAgICAgTExfQURDX1NldENvbW1vblBhdGhJbnRlcm5hbENoXG4KKyAqICAgICAgICAgQ0NSICAgICAgVlNFTlNFU0VMICAgICAgTExfQURDX1NldENvbW1vblBhdGhJbnRlcm5hbENoXG4KKyAqICAgICAgICAgQ0NSICAgICAgVkJBVFNFTCAgICAgICAgTExfQURDX1NldENvbW1vblBhdGhJbnRlcm5hbENoCisgKiBAcGFyYW0gIEFEQ3h5X0NPTU1PTiBBREMgY29tbW9uIGluc3RhbmNlCisgKiAgICAgICAgIChjYW4gYmUgc2V0IGRpcmVjdGx5IGZyb20gQ01TSVMgZGVmaW5pdGlvbiBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8KKyAqIEByZWYgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKCkgKQorICogQHBhcmFtICBQYXRoSW50ZXJuYWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZworICogdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1BBVEhfSU5URVJOQUxfTk9ORQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1BBVEhfSU5URVJOQUxfVlJFRklOVAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1BBVEhfSU5URVJOQUxfVEVNUFNFTlNPUgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1BBVEhfSU5URVJOQUxfVkJBVAorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19TZXRDb21tb25QYXRoSW50ZXJuYWxDaCgKKyAgICBBRENfQ29tbW9uX1R5cGVEZWYgKkFEQ3h5X0NPTU1PTiwgdWludDMyX3QgUGF0aEludGVybmFsKSB7CisgIE1PRElGWV9SRUcoQURDeHlfQ09NTU9OLT5DQ1IsCisgICAgICAgICAgICAgQURDX0NDUl9WUkVGRU4gfCBBRENfQ0NSX1ZTRU5TRVNFTCB8IEFEQ19DQ1JfVkJBVFNFTCwKKyAgICAgICAgICAgICBQYXRoSW50ZXJuYWwpOworfQorCisvKioKKyAqIEBicmllZiAgU2V0IHBhcmFtZXRlciBjb21tb24gdG8gc2V2ZXJhbCBBREM6IG1lYXN1cmVtZW50IHBhdGggdG8KKyAqICAgICAgICAgaW50ZXJuYWwgY2hhbm5lbHMgKFZyZWZJbnQsIHRlbXBlcmF0dXJlIHNlbnNvciwgLi4uKS4KKyAqICAgICAgICAgQWRkIHBhdGhzIHRvIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCisgKiBAbm90ZSAgIE9uZSBvciBzZXZlcmFsIHZhbHVlcyBjYW4gYmUgc2VsZWN0ZWQuCisgKiAgICAgICAgIEV4YW1wbGU6IChMTF9BRENfUEFUSF9JTlRFUk5BTF9WUkVGSU5UIHwKKyAqICAgICAgICAgICAgICAgICAgIExMX0FEQ19QQVRIX0lOVEVSTkFMX1RFTVBTRU5TT1IpCisgKiBAbm90ZSAgIFN0YWJpbGl6YXRpb24gdGltZSBvZiBtZWFzdXJlbWVudCBwYXRoIHRvIGludGVybmFsIGNoYW5uZWw6CisgKiAgICAgICAgIEFmdGVyIGVuYWJsaW5nIGludGVybmFsIHBhdGhzLCBiZWZvcmUgc3RhcnRpbmcgQURDIGNvbnZlcnNpb24sCisgKiAgICAgICAgIGEgZGVsYXkgaXMgcmVxdWlyZWQgZm9yIGludGVybmFsIHZvbHRhZ2UgcmVmZXJlbmNlIGFuZAorICogICAgICAgICB0ZW1wZXJhdHVyZSBzZW5zb3Igc3RhYmlsaXphdGlvbiB0aW1lLgorICogICAgICAgICBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0LgorICogICAgICAgICBSZWZlciB0byBsaXRlcmFsIEByZWYgTExfQURDX0RFTEFZX1ZSRUZJTlRfU1RBQl9VUy4KKyAqICAgICAgICAgUmVmZXIgdG8gbGl0ZXJhbHMgQHJlZiBMTF9BRENfREVMQVlfVEVNUFNFTlNPUl9TVEFCX1VTLAorICogICAgICAgICBAcmVmIExMX0FEQ19ERUxBWV9URU1QU0VOU09SX0JVRkZFUl9TVEFCX1VTLgorICogQG5vdGUgICBBREMgaW50ZXJuYWwgY2hhbm5lbCBzYW1wbGluZyB0aW1lIGNvbnN0cmFpbnQ6CisgKiAgICAgICAgIEZvciBBREMgY29udmVyc2lvbiBvZiBpbnRlcm5hbCBjaGFubmVscywKKyAqICAgICAgICAgYSBzYW1wbGluZyB0aW1lIG1pbmltdW0gdmFsdWUgaXMgcmVxdWlyZWQuCisgKiAgICAgICAgIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQuCisgKiBAcm10b2xsIENDUiAgICAgIFZSRUZFTiAgICAgICAgIExMX0FEQ19TZXRDb21tb25QYXRoSW50ZXJuYWxDaEFkZFxuCisgKiAgICAgICAgIENDUiAgICAgIFZTRU5TRVNFTCAgICAgIExMX0FEQ19TZXRDb21tb25QYXRoSW50ZXJuYWxDaEFkZFxuCisgKiAgICAgICAgIENDUiAgICAgIFZCQVRTRUwgICAgICAgIExMX0FEQ19TZXRDb21tb25QYXRoSW50ZXJuYWxDaEFkZAorICogQHBhcmFtICBBREN4eV9DT01NT04gQURDIGNvbW1vbiBpbnN0YW5jZQorICogICAgICAgICAoY2FuIGJlIHNldCBkaXJlY3RseSBmcm9tIENNU0lTIGRlZmluaXRpb24gb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvCisgKiBAcmVmIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRSgpICkKKyAqIEBwYXJhbSAgUGF0aEludGVybmFsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcKKyAqIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19QQVRIX0lOVEVSTkFMX05PTkUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19QQVRIX0lOVEVSTkFMX1ZSRUZJTlQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19QQVRIX0lOVEVSTkFMX1RFTVBTRU5TT1IKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19QQVRIX0lOVEVSTkFMX1ZCQVQKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfU2V0Q29tbW9uUGF0aEludGVybmFsQ2hBZGQoCisgICAgQURDX0NvbW1vbl9UeXBlRGVmICpBREN4eV9DT01NT04sIHVpbnQzMl90IFBhdGhJbnRlcm5hbCkgeworICBTRVRfQklUKEFEQ3h5X0NPTU1PTi0+Q0NSLCBQYXRoSW50ZXJuYWwpOworfQorCisvKioKKyAqIEBicmllZiAgU2V0IHBhcmFtZXRlciBjb21tb24gdG8gc2V2ZXJhbCBBREM6IG1lYXN1cmVtZW50IHBhdGggdG8KKyAqICAgICAgICAgaW50ZXJuYWwgY2hhbm5lbHMgKFZyZWZJbnQsIHRlbXBlcmF0dXJlIHNlbnNvciwgLi4uKS4KKyAqICAgICAgICAgUmVtb3ZlIHBhdGhzIHRvIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCisgKiBAbm90ZSAgIE9uZSBvciBzZXZlcmFsIHZhbHVlcyBjYW4gYmUgc2VsZWN0ZWQuCisgKiAgICAgICAgIEV4YW1wbGU6IChMTF9BRENfUEFUSF9JTlRFUk5BTF9WUkVGSU5UIHwKKyAqICAgICAgICAgICAgICAgICAgIExMX0FEQ19QQVRIX0lOVEVSTkFMX1RFTVBTRU5TT1IpCisgKiBAcm10b2xsIENDUiAgICAgIFZSRUZFTiAgICAgICAgIExMX0FEQ19TZXRDb21tb25QYXRoSW50ZXJuYWxDaFJlbVxuCisgKiAgICAgICAgIENDUiAgICAgIFZTRU5TRVNFTCAgICAgIExMX0FEQ19TZXRDb21tb25QYXRoSW50ZXJuYWxDaFJlbVxuCisgKiAgICAgICAgIENDUiAgICAgIFZCQVRTRUwgICAgICAgIExMX0FEQ19TZXRDb21tb25QYXRoSW50ZXJuYWxDaFJlbQorICogQHBhcmFtICBBREN4eV9DT01NT04gQURDIGNvbW1vbiBpbnN0YW5jZQorICogICAgICAgICAoY2FuIGJlIHNldCBkaXJlY3RseSBmcm9tIENNU0lTIGRlZmluaXRpb24gb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvCisgKiBAcmVmIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRSgpICkKKyAqIEBwYXJhbSAgUGF0aEludGVybmFsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcKKyAqIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19QQVRIX0lOVEVSTkFMX05PTkUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19QQVRIX0lOVEVSTkFMX1ZSRUZJTlQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19QQVRIX0lOVEVSTkFMX1RFTVBTRU5TT1IKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19QQVRIX0lOVEVSTkFMX1ZCQVQKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfU2V0Q29tbW9uUGF0aEludGVybmFsQ2hSZW0oCisgICAgQURDX0NvbW1vbl9UeXBlRGVmICpBREN4eV9DT01NT04sIHVpbnQzMl90IFBhdGhJbnRlcm5hbCkgeworICBDTEVBUl9CSVQoQURDeHlfQ09NTU9OLT5DQ1IsIFBhdGhJbnRlcm5hbCk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgcGFyYW1ldGVyIGNvbW1vbiB0byBzZXZlcmFsIEFEQzogbWVhc3VyZW1lbnQgcGF0aCB0byBpbnRlcm5hbAorICogICAgICAgICBjaGFubmVscyAoVnJlZkludCwgdGVtcGVyYXR1cmUgc2Vuc29yLCAuLi4pLgorICogQG5vdGUgICBPbmUgb3Igc2V2ZXJhbCB2YWx1ZXMgY2FuIGJlIHNlbGVjdGVkLgorICogICAgICAgICBFeGFtcGxlOiAoTExfQURDX1BBVEhfSU5URVJOQUxfVlJFRklOVCB8CisgKiAgICAgICAgICAgICAgICAgICBMTF9BRENfUEFUSF9JTlRFUk5BTF9URU1QU0VOU09SKQorICogQHJtdG9sbCBDQ1IgICAgICBWUkVGRU4gICAgICAgICBMTF9BRENfR2V0Q29tbW9uUGF0aEludGVybmFsQ2hcbgorICogICAgICAgICBDQ1IgICAgICBWU0VOU0VTRUwgICAgICBMTF9BRENfR2V0Q29tbW9uUGF0aEludGVybmFsQ2hcbgorICogICAgICAgICBDQ1IgICAgICBWQkFUU0VMICAgICAgICBMTF9BRENfR2V0Q29tbW9uUGF0aEludGVybmFsQ2gKKyAqIEBwYXJhbSAgQURDeHlfQ09NTU9OIEFEQyBjb21tb24gaW5zdGFuY2UKKyAqICAgICAgICAgKGNhbiBiZSBzZXQgZGlyZWN0bHkgZnJvbSBDTVNJUyBkZWZpbml0aW9uIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybworICogQHJlZiBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoKSApCisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1BBVEhfSU5URVJOQUxfTk9ORQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1BBVEhfSU5URVJOQUxfVlJFRklOVAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1BBVEhfSU5URVJOQUxfVEVNUFNFTlNPUgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1BBVEhfSU5URVJOQUxfVkJBVAorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX0FEQ19HZXRDb21tb25QYXRoSW50ZXJuYWxDaChjb25zdCBBRENfQ29tbW9uX1R5cGVEZWYgKkFEQ3h5X0NPTU1PTikgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVCgKKyAgICAgIEFEQ3h5X0NPTU1PTi0+Q0NSLCBBRENfQ0NSX1ZSRUZFTiB8IEFEQ19DQ1JfVlNFTlNFU0VMIHwgQURDX0NDUl9WQkFUU0VMKSk7Cit9CisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FRl9Db25maWd1cmF0aW9uX0FEQ19JbnN0YW5jZSBDb25maWd1cmF0aW9uIG9mIEFEQworICogaGllcmFyY2hpY2FsIHNjb3BlOiBBREMgaW5zdGFuY2UKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgIFNldCBBREMgY2FsaWJyYXRpb24gZmFjdG9yIGluIHRoZSBtb2RlIHNpbmdsZS1lbmRlZAorICogICAgICAgICBvciBkaWZmZXJlbnRpYWwgKGZvciBkZXZpY2VzIHdpdGggZGlmZmVyZW50aWFsIG1vZGUgYXZhaWxhYmxlKS4KKyAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBpcyBpbnRlbmRlZCB0byBzZXQgY2FsaWJyYXRpb24gcGFyYW1ldGVycworICogICAgICAgICB3aXRob3V0IGhhdmluZyB0byBwZXJmb3JtIGEgbmV3IGNhbGlicmF0aW9uIHVzaW5nCisgKiAgICAgICAgIEByZWYgTExfQURDX1N0YXJ0Q2FsaWJyYXRpb24oKS4KKyAqIEBub3RlICAgRm9yIGRldmljZXMgd2l0aCBkaWZmZXJlbnRpYWwgbW9kZSBhdmFpbGFibGU6CisgKiAgICAgICAgIENhbGlicmF0aW9uIG9mIG9mZnNldCBpcyBzcGVjaWZpYyB0byBlYWNoIG9mCisgKiAgICAgICAgIHNpbmdsZS1lbmRlZCBhbmQgZGlmZmVyZW50aWFsIG1vZGVzCisgKiAgICAgICAgIChjYWxpYnJhdGlvbiBmYWN0b3IgbXVzdCBiZSBzcGVjaWZpZWQgZm9yIGVhY2ggb2YgdGhlc2UKKyAqICAgICAgICAgZGlmZmVyZW50aWFsIG1vZGVzLCBpZiB1c2VkIGFmdGVyd2FyZHMgYW5kIGlmIHRoZSBhcHBsaWNhdGlvbgorICogICAgICAgICByZXF1aXJlcyB0aGVpciBjYWxpYnJhdGlvbikuCisgKiBAbm90ZSAgIEluIGNhc2Ugb2Ygc2V0dGluZyBjYWxpYnJhdGlvbiBmYWN0b3JzIG9mIGJvdGggbW9kZXMgc2luZ2xlIGVuZGVkCisgKiAgICAgICAgIGFuZCBkaWZmZXJlbnRpYWwgKHBhcmFtZXRlciBMTF9BRENfQk9USF9TSU5HTEVfRElGRl9FTkRFRCk6CisgKiAgICAgICAgIGJvdGggY2FsaWJyYXRpb24gZmFjdG9ycyBtdXN0IGJlIGNvbmNhdGVuYXRlZC4KKyAqICAgICAgICAgVG8gcGVyZm9ybSB0aGlzIHByb2Nlc3NpbmcsIHVzZSBoZWxwZXIgbWFjcm8KKyAqICAgICAgICAgQHJlZiBfX0xMX0FEQ19DQUxJQl9GQUNUT1JfU0lOR0xFX0RJRkYoKS4KKyAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAqICAgICAgICAgQURDIG11c3QgYmUgZW5hYmxlZCwgd2l0aG91dCBjYWxpYnJhdGlvbiBvbiBnb2luZywgd2l0aG91dCBjb252ZXJzaW9uCisgKiAgICAgICAgIG9uIGdvaW5nIG9uIGdyb3VwIHJlZ3VsYXIuCisgKiBAcm10b2xsIENBTEZBQ1QgIENBTEZBQ1RfUyAgICAgIExMX0FEQ19TZXRDYWxpYnJhdGlvbkZhY3RvclxuCisgKiAgICAgICAgIENBTEZBQ1QgIENBTEZBQ1RfRCAgICAgIExMX0FEQ19TZXRDYWxpYnJhdGlvbkZhY3RvcgorICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICogQHBhcmFtICBTaW5nbGVEaWZmIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfU0lOR0xFX0VOREVECisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfRElGRkVSRU5USUFMX0VOREVECisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQk9USF9TSU5HTEVfRElGRl9FTkRFRAorICogQHBhcmFtICBDYWxpYnJhdGlvbkZhY3RvciBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4N0YKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfU2V0Q2FsaWJyYXRpb25GYWN0b3IoQURDX1R5cGVEZWYgKkFEQ3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgU2luZ2xlRGlmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDYWxpYnJhdGlvbkZhY3RvcikgeworICBNT0RJRllfUkVHKAorICAgICAgQURDeC0+Q0FMRkFDVCwgU2luZ2xlRGlmZiAmIEFEQ19TSU5HTEVESUZGX0NBTElCX0ZBQ1RPUl9NQVNLLAorICAgICAgQ2FsaWJyYXRpb25GYWN0b3IgPDwgKCgoU2luZ2xlRGlmZiAmIEFEQ19TSU5HTEVESUZGX0NBTElCX0ZfQklUX0RfTUFTSykgPj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX1NJTkdMRURJRkZfQ0FMSUJfRl9CSVRfRF9TSElGVDQpICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KFNpbmdsZURpZmYgJiBBRENfQ0FMRkFDVF9DQUxGQUNUX1MpKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgQURDIGNhbGlicmF0aW9uIGZhY3RvciBpbiB0aGUgbW9kZSBzaW5nbGUtZW5kZWQKKyAqICAgICAgICAgb3IgZGlmZmVyZW50aWFsIChmb3IgZGV2aWNlcyB3aXRoIGRpZmZlcmVudGlhbCBtb2RlIGF2YWlsYWJsZSkuCisgKiBAbm90ZSAgIENhbGlicmF0aW9uIGZhY3RvcnMgYXJlIHNldCBieSBoYXJkd2FyZSBhZnRlciBwZXJmb3JtaW5nCisgKiAgICAgICAgIGEgY2FsaWJyYXRpb24gcnVuIHVzaW5nIGZ1bmN0aW9uIEByZWYgTExfQURDX1N0YXJ0Q2FsaWJyYXRpb24oKS4KKyAqIEBub3RlICAgRm9yIGRldmljZXMgd2l0aCBkaWZmZXJlbnRpYWwgbW9kZSBhdmFpbGFibGU6CisgKiAgICAgICAgIENhbGlicmF0aW9uIG9mIG9mZnNldCBpcyBzcGVjaWZpYyB0byBlYWNoIG9mCisgKiAgICAgICAgIHNpbmdsZS1lbmRlZCBhbmQgZGlmZmVyZW50aWFsIG1vZGVzCisgKiBAcm10b2xsIENBTEZBQ1QgIENBTEZBQ1RfUyAgICAgIExMX0FEQ19HZXRDYWxpYnJhdGlvbkZhY3RvclxuCisgKiAgICAgICAgIENBTEZBQ1QgIENBTEZBQ1RfRCAgICAgIExMX0FEQ19HZXRDYWxpYnJhdGlvbkZhY3RvcgorICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICogQHBhcmFtICBTaW5nbGVEaWZmIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfU0lOR0xFX0VOREVECisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfRElGRkVSRU5USUFMX0VOREVECisgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHg3RgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0dldENhbGlicmF0aW9uRmFjdG9yKGNvbnN0IEFEQ19UeXBlRGVmICpBREN4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBTaW5nbGVEaWZmKSB7CisgIC8qIFJldHJpZXZlIGJpdHMgd2l0aCBwb3NpdGlvbiBpbiByZWdpc3RlciBkZXBlbmRpbmcgb24gcGFyYW1ldGVyICAgICAgICAgICAqLworICAvKiAiU2luZ2xlRGlmZiIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogUGFyYW1ldGVyIHVzZWQgd2l0aCBtYXNrICJBRENfU0lOR0xFRElGRl9DQUxJQl9GQUNUT1JfTUFTSyIgYmVjYXVzZSAgICAgICovCisgIC8qIGNvbnRhaW5pbmcgb3RoZXIgYml0cyByZXNlcnZlZCBmb3Igb3RoZXIgcHVycG9zZS4gICAgICAgICAgICAgICAgICAgICAgICAqLworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChBREN4LT5DQUxGQUNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU2luZ2xlRGlmZiAmIEFEQ19TSU5HTEVESUZGX0NBTElCX0ZBQ1RPUl9NQVNLKSkgPj4KKyAgICAgICAgICAgICAgICAgICAgKChTaW5nbGVEaWZmICYgQURDX1NJTkdMRURJRkZfQ0FMSUJfRl9CSVRfRF9NQVNLKSA+PgorICAgICAgICAgICAgICAgICAgICAgQURDX1NJTkdMRURJRkZfQ0FMSUJfRl9CSVRfRF9TSElGVDQpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFNldCBBREMgcmVzb2x1dGlvbi4KKyAqICAgICAgICAgUmVmZXIgdG8gcmVmZXJlbmNlIG1hbnVhbCBmb3IgYWxpZ25tZW50cyBmb3JtYXRzCisgKiAgICAgICAgIGRlcGVuZGVuY2llcyB0byBBREMgcmVzb2x1dGlvbnMuCisgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICogICAgICAgICBBREMgc3RhdGU6CisgKiAgICAgICAgIEFEQyBtdXN0IGJlIGRpc2FibGVkIG9yIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nCisgKiAgICAgICAgIG9uIGVpdGhlciBncm91cHMgcmVndWxhciBvciBpbmplY3RlZC4KKyAqIEBybXRvbGwgQ0ZHUiAgICAgUkVTICAgICAgICAgICAgTExfQURDX1NldFJlc29sdXRpb24KKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEBwYXJhbSAgUmVzb2x1dGlvbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fMTJCCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl8xMEIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzhCCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl82QgorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19TZXRSZXNvbHV0aW9uKEFEQ19UeXBlRGVmICpBREN4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUmVzb2x1dGlvbikgeworICBNT0RJRllfUkVHKEFEQ3gtPkNGR1IsIEFEQ19DRkdSX1JFUywgUmVzb2x1dGlvbik7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgQURDIHJlc29sdXRpb24uCisgKiAgICAgICAgIFJlZmVyIHRvIHJlZmVyZW5jZSBtYW51YWwgZm9yIGFsaWdubWVudHMgZm9ybWF0cworICogICAgICAgICBkZXBlbmRlbmNpZXMgdG8gQURDIHJlc29sdXRpb25zLgorICogQHJtdG9sbCBDRkdSICAgICBSRVMgICAgICAgICAgICBMTF9BRENfR2V0UmVzb2x1dGlvbgorICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fMTJCCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl8xMEIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzhCCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl82QgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0dldFJlc29sdXRpb24oY29uc3QgQURDX1R5cGVEZWYgKkFEQ3gpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeC0+Q0ZHUiwgQURDX0NGR1JfUkVTKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBTZXQgQURDIGNvbnZlcnNpb24gZGF0YSBhbGlnbm1lbnQuCisgKiBAbm90ZSAgIFJlZmVyIHRvIHJlZmVyZW5jZSBtYW51YWwgZm9yIGFsaWdubWVudHMgZm9ybWF0cworICogICAgICAgICBkZXBlbmRlbmNpZXMgdG8gQURDIHJlc29sdXRpb25zLgorICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllcywgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAqICAgICAgICAgQURDIHN0YXRlOgorICogICAgICAgICBBREMgbXVzdCBiZSBkaXNhYmxlZCBvciBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZworICogICAgICAgICBvbiBlaXRoZXIgZ3JvdXBzIHJlZ3VsYXIgb3IgaW5qZWN0ZWQuCisgKiBAcm10b2xsIENGR1IgICAgIEFMSUdOICAgICAgICAgIExMX0FEQ19TZXREYXRhQWxpZ25tZW50CisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcGFyYW0gIERhdGFBbGlnbm1lbnQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19EQVRBX0FMSUdOX1JJR0hUCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfREFUQV9BTElHTl9MRUZUCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1NldERhdGFBbGlnbm1lbnQoQURDX1R5cGVEZWYgKkFEQ3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBEYXRhQWxpZ25tZW50KSB7CisgIE1PRElGWV9SRUcoQURDeC0+Q0ZHUiwgQURDX0NGR1JfQUxJR04sIERhdGFBbGlnbm1lbnQpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IEFEQyBjb252ZXJzaW9uIGRhdGEgYWxpZ25tZW50LgorICogQG5vdGUgICBSZWZlciB0byByZWZlcmVuY2UgbWFudWFsIGZvciBhbGlnbm1lbnRzIGZvcm1hdHMKKyAqICAgICAgICAgZGVwZW5kZW5jaWVzIHRvIEFEQyByZXNvbHV0aW9ucy4KKyAqIEBybXRvbGwgQ0ZHUiAgICAgQUxJR04gICAgICAgICAgTExfQURDX0dldERhdGFBbGlnbm1lbnQKKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19EQVRBX0FMSUdOX1JJR0hUCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfREFUQV9BTElHTl9MRUZUCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfR2V0RGF0YUFsaWdubWVudChjb25zdCBBRENfVHlwZURlZiAqQURDeCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChBREN4LT5DRkdSLCBBRENfQ0ZHUl9BTElHTikpOworfQorCisvKioKKyAqIEBicmllZiAgU2V0IEFEQyBsb3cgcG93ZXIgbW9kZS4KKyAqIEBub3RlICAgRGVzY3JpcHRpb24gb2YgQURDIGxvdyBwb3dlciBtb2RlczoKKyAqICAgICAgICAgLSBBREMgbG93IHBvd2VyIG1vZGUgImF1dG8gd2FpdCI6IER5bmFtaWMgbG93IHBvd2VyIG1vZGUsCisgKiAgICAgICAgICAgQURDIGNvbnZlcnNpb25zIG9jY3VycmVuY2VzIGFyZSBsaW1pdGVkIHRvIHRoZSBtaW5pbXVtIG5lY2Vzc2FyeQorICogICAgICAgICAgIGluIG9yZGVyIHRvIHJlZHVjZSBwb3dlciBjb25zdW1wdGlvbi4KKyAqICAgICAgICAgICBOZXcgQURDIGNvbnZlcnNpb24gc3RhcnRzIG9ubHkgd2hlbiB0aGUgcHJldmlvdXMKKyAqICAgICAgICAgICB1bml0YXJ5IGNvbnZlcnNpb24gZGF0YSAoZm9yIEFEQyBncm91cCByZWd1bGFyKQorICogICAgICAgICAgIG9yIHByZXZpb3VzIHNlcXVlbmNlIGNvbnZlcnNpb25zIGRhdGEgKGZvciBBREMgZ3JvdXAgaW5qZWN0ZWQpCisgKiAgICAgICAgICAgaGFzIGJlZW4gcmV0cmlldmVkIGJ5IHVzZXIgc29mdHdhcmUuCisgKiAgICAgICAgICAgSW4gdGhlIG1lYW50aW1lLCBBREMgcmVtYWlucyBpZGxlOiBkb2VzIG5vdCBwZXJmb3JtcyBhbnkKKyAqICAgICAgICAgICBvdGhlciBjb252ZXJzaW9uLgorICogICAgICAgICAgIFRoaXMgbW9kZSBhbGxvd3MgdG8gYXV0b21hdGljYWxseSBhZGFwdCB0aGUgQURDIGNvbnZlcnNpb25zCisgKiAgICAgICAgICAgdHJpZ2dlcnMgdG8gdGhlIHNwZWVkIG9mIHRoZSBzb2Z0d2FyZSB0aGF0IHJlYWRzIHRoZSBkYXRhLgorICogICAgICAgICAgIE1vcmVvdmVyLCB0aGlzIGF2b2lkcyByaXNrIG9mIG92ZXJydW4gZm9yIGxvdyBmcmVxdWVuY3kKKyAqICAgICAgICAgICBhcHBsaWNhdGlvbnMuCisgKiAgICAgICAgICAgSG93IHRvIHVzZSB0aGlzIGxvdyBwb3dlciBtb2RlOgorICogICAgICAgICAgIC0gSXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIHVzZSB3aXRoIGludGVycnVwdGlvbiBvciBETUEKKyAqICAgICAgICAgICAgIHNpbmNlIHRoZXNlIG1vZGVzIGhhdmUgdG8gY2xlYXIgaW1tZWRpYXRlbHkgdGhlIEVPQyBmbGFnCisgKiAgICAgICAgICAgICAoYnkgQ1BVIHRvIGZyZWUgdGhlIElSUSBwZW5kaW5nIGV2ZW50IG9yIGJ5IERNQSkuCisgKiAgICAgICAgICAgICBBdXRvIHdhaXQgd2lsbCB3b3JrIGJ1dCBmb3J0IGEgdmVyeSBzaG9ydCB0aW1lLCBkaXNjYXJkaW5nCisgKiAgICAgICAgICAgICBpdHMgaW50ZW5kZWQgYmVuZWZpdCAoZXhjZXB0IHNwZWNpZmljIGNhc2Ugb2YgaGlnaCBsb2FkIG9mIENQVQorICogICAgICAgICAgICAgb3IgRE1BIHRyYW5zZmVycyB3aGljaCBjYW4ganVzdGlmeSB1c2FnZSBvZiBhdXRvIHdhaXQpLgorICogICAgICAgICAgIC0gRG8gdXNlIHdpdGggcG9sbGluZzogMS4gU3RhcnQgY29udmVyc2lvbiwKKyAqICAgICAgICAgICAgIDIuIExhdGVyIG9uLCB3aGVuIGNvbnZlcnNpb24gZGF0YSBpcyBuZWVkZWQ6IHBvbGwgZm9yIGVuZCBvZgorICogICAgICAgICAgICAgY29udmVyc2lvbiAgdG8gZW5zdXJlIHRoYXQgY29udmVyc2lvbiBpcyBjb21wbGV0ZWQgYW5kCisgKiAgICAgICAgICAgICByZXRyaWV2ZSBBREMgY29udmVyc2lvbiBkYXRhLiBUaGlzIHdpbGwgdHJpZyBhbm90aGVyCisgKiAgICAgICAgICAgICBBREMgY29udmVyc2lvbiBzdGFydC4KKyAqIEBub3RlICAgV2l0aCBBREMgbG93IHBvd2VyIG1vZGUgImF1dG8gd2FpdCIsIHRoZSBBREMgY29udmVyc2lvbiBkYXRhIHJlYWQKKyAqICAgICAgICAgaXMgY29ycmVzcG9uZGluZyB0byBwcmV2aW91cyBBREMgY29udmVyc2lvbiBzdGFydCwgaW5kZXBlbmRlbnRseQorICogICAgICAgICBvZiBkZWxheSBkdXJpbmcgd2hpY2ggQURDIHdhcyBpZGxlLgorICogICAgICAgICBUaGVyZWZvcmUsIHRoZSBBREMgY29udmVyc2lvbiBkYXRhIG1heSBiZSBvdXRkYXRlZDogZG9lcyBub3QKKyAqICAgICAgICAgY29ycmVzcG9uZCB0byB0aGUgY3VycmVudCB2b2x0YWdlIGxldmVsIG9uIHRoZSBzZWxlY3RlZAorICogICAgICAgICBBREMgY2hhbm5lbC4KKyAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcKKyAqICAgICAgICAgb24gZWl0aGVyIGdyb3VwcyByZWd1bGFyIG9yIGluamVjdGVkLgorICogQHJtdG9sbCBDRkdSICAgICBBVVRETFkgICAgICAgICBMTF9BRENfU2V0TG93UG93ZXJNb2RlCisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcGFyYW0gIExvd1Bvd2VyTW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0xQX01PREVfTk9ORQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0xQX0FVVE9XQUlUCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1NldExvd1Bvd2VyTW9kZShBRENfVHlwZURlZiAqQURDeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgTG93UG93ZXJNb2RlKSB7CisgIE1PRElGWV9SRUcoQURDeC0+Q0ZHUiwgQURDX0NGR1JfQVVURExZLCBMb3dQb3dlck1vZGUpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IEFEQyBsb3cgcG93ZXIgbW9kZToKKyAqIEBub3RlICAgRGVzY3JpcHRpb24gb2YgQURDIGxvdyBwb3dlciBtb2RlczoKKyAqICAgICAgICAgLSBBREMgbG93IHBvd2VyIG1vZGUgImF1dG8gd2FpdCI6IER5bmFtaWMgbG93IHBvd2VyIG1vZGUsCisgKiAgICAgICAgICAgQURDIGNvbnZlcnNpb25zIG9jY3VycmVuY2VzIGFyZSBsaW1pdGVkIHRvIHRoZSBtaW5pbXVtIG5lY2Vzc2FyeQorICogICAgICAgICAgIGluIG9yZGVyIHRvIHJlZHVjZSBwb3dlciBjb25zdW1wdGlvbi4KKyAqICAgICAgICAgICBOZXcgQURDIGNvbnZlcnNpb24gc3RhcnRzIG9ubHkgd2hlbiB0aGUgcHJldmlvdXMKKyAqICAgICAgICAgICB1bml0YXJ5IGNvbnZlcnNpb24gZGF0YSAoZm9yIEFEQyBncm91cCByZWd1bGFyKQorICogICAgICAgICAgIG9yIHByZXZpb3VzIHNlcXVlbmNlIGNvbnZlcnNpb25zIGRhdGEgKGZvciBBREMgZ3JvdXAgaW5qZWN0ZWQpCisgKiAgICAgICAgICAgaGFzIGJlZW4gcmV0cmlldmVkIGJ5IHVzZXIgc29mdHdhcmUuCisgKiAgICAgICAgICAgSW4gdGhlIG1lYW50aW1lLCBBREMgcmVtYWlucyBpZGxlOiBkb2VzIG5vdCBwZXJmb3JtcyBhbnkKKyAqICAgICAgICAgICBvdGhlciBjb252ZXJzaW9uLgorICogICAgICAgICAgIFRoaXMgbW9kZSBhbGxvd3MgdG8gYXV0b21hdGljYWxseSBhZGFwdCB0aGUgQURDIGNvbnZlcnNpb25zCisgKiAgICAgICAgICAgdHJpZ2dlcnMgdG8gdGhlIHNwZWVkIG9mIHRoZSBzb2Z0d2FyZSB0aGF0IHJlYWRzIHRoZSBkYXRhLgorICogICAgICAgICAgIE1vcmVvdmVyLCB0aGlzIGF2b2lkcyByaXNrIG9mIG92ZXJydW4gZm9yIGxvdyBmcmVxdWVuY3kKKyAqICAgICAgICAgICBhcHBsaWNhdGlvbnMuCisgKiAgICAgICAgICAgSG93IHRvIHVzZSB0aGlzIGxvdyBwb3dlciBtb2RlOgorICogICAgICAgICAgIC0gSXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIHVzZSB3aXRoIGludGVycnVwdGlvbiBvciBETUEKKyAqICAgICAgICAgICAgIHNpbmNlIHRoZXNlIG1vZGVzIGhhdmUgdG8gY2xlYXIgaW1tZWRpYXRlbHkgdGhlIEVPQyBmbGFnCisgKiAgICAgICAgICAgICAoYnkgQ1BVIHRvIGZyZWUgdGhlIElSUSBwZW5kaW5nIGV2ZW50IG9yIGJ5IERNQSkuCisgKiAgICAgICAgICAgICBBdXRvIHdhaXQgd2lsbCB3b3JrIGJ1dCBmb3J0IGEgdmVyeSBzaG9ydCB0aW1lLCBkaXNjYXJkaW5nCisgKiAgICAgICAgICAgICBpdHMgaW50ZW5kZWQgYmVuZWZpdCAoZXhjZXB0IHNwZWNpZmljIGNhc2Ugb2YgaGlnaCBsb2FkIG9mIENQVQorICogICAgICAgICAgICAgb3IgRE1BIHRyYW5zZmVycyB3aGljaCBjYW4ganVzdGlmeSB1c2FnZSBvZiBhdXRvIHdhaXQpLgorICogICAgICAgICAgIC0gRG8gdXNlIHdpdGggcG9sbGluZzogMS4gU3RhcnQgY29udmVyc2lvbiwKKyAqICAgICAgICAgICAgIDIuIExhdGVyIG9uLCB3aGVuIGNvbnZlcnNpb24gZGF0YSBpcyBuZWVkZWQ6IHBvbGwgZm9yIGVuZCBvZgorICogICAgICAgICAgICAgY29udmVyc2lvbiAgdG8gZW5zdXJlIHRoYXQgY29udmVyc2lvbiBpcyBjb21wbGV0ZWQgYW5kCisgKiAgICAgICAgICAgICByZXRyaWV2ZSBBREMgY29udmVyc2lvbiBkYXRhLiBUaGlzIHdpbGwgdHJpZyBhbm90aGVyCisgKiAgICAgICAgICAgICBBREMgY29udmVyc2lvbiBzdGFydC4KKyAqIEBub3RlICAgV2l0aCBBREMgbG93IHBvd2VyIG1vZGUgImF1dG8gd2FpdCIsIHRoZSBBREMgY29udmVyc2lvbiBkYXRhIHJlYWQKKyAqICAgICAgICAgaXMgY29ycmVzcG9uZGluZyB0byBwcmV2aW91cyBBREMgY29udmVyc2lvbiBzdGFydCwgaW5kZXBlbmRlbnRseQorICogICAgICAgICBvZiBkZWxheSBkdXJpbmcgd2hpY2ggQURDIHdhcyBpZGxlLgorICogICAgICAgICBUaGVyZWZvcmUsIHRoZSBBREMgY29udmVyc2lvbiBkYXRhIG1heSBiZSBvdXRkYXRlZDogZG9lcyBub3QKKyAqICAgICAgICAgY29ycmVzcG9uZCB0byB0aGUgY3VycmVudCB2b2x0YWdlIGxldmVsIG9uIHRoZSBzZWxlY3RlZAorICogICAgICAgICBBREMgY2hhbm5lbC4KKyAqIEBybXRvbGwgQ0ZHUiAgICAgQVVURExZICAgICAgICAgTExfQURDX0dldExvd1Bvd2VyTW9kZQorICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0xQX01PREVfTk9ORQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0xQX0FVVE9XQUlUCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfR2V0TG93UG93ZXJNb2RlKGNvbnN0IEFEQ19UeXBlRGVmICpBREN4KSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEFEQ3gtPkNGR1IsIEFEQ19DRkdSX0FVVERMWSkpOworfQorCisvKioKKyAqIEBicmllZiAgU2V0IEFEQyBzZWxlY3RlZCBvZmZzZXQgaW5zdGFuY2UgMSwgMiwgMyBvciA0LgorICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIHNldCB0aGUgMiBpdGVtcyBvZiBvZmZzZXQgY29uZmlndXJhdGlvbjoKKyAqICAgICAgICAgLSBBREMgY2hhbm5lbCB0byB3aGljaCB0aGUgb2Zmc2V0IHByb2dyYW1tZWQgd2lsbCBiZSBhcHBsaWVkCisgKiAgICAgICAgICAgKGluZGVwZW5kZW50bHkgb2YgY2hhbm5lbCBtYXBwZWQgb24gQURDIGdyb3VwIHJlZ3VsYXIKKyAqICAgICAgICAgICBvciBncm91cCBpbmplY3RlZCkKKyAqICAgICAgICAgLSBPZmZzZXQgbGV2ZWwgKG9mZnNldCB0byBiZSBzdWJ0cmFjdGVkIGZyb20gdGhlIHJhdworICogICAgICAgICAgIGNvbnZlcnRlZCBkYXRhKS4KKyAqIEBub3RlICAgQ2F1dGlvbjogT2Zmc2V0IGZvcm1hdCBpcyBkZXBlbmRlbnQgdG8gQURDIHJlc29sdXRpb246CisgKiAgICAgICAgIG9mZnNldCBoYXMgdG8gYmUgbGVmdC1hbGlnbmVkIG9uIGJpdCAxMSwgdGhlIExTQiAocmlnaHQgYml0cykKKyAqICAgICAgICAgYXJlIHNldCB0byAwLgorICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGVuYWJsZXMgdGhlIG9mZnNldCwgYnkgZGVmYXVsdC4gSXQgY2FuIGJlIGZvcmNlZAorICogICAgICAgICB0byBkaXNhYmxlIHN0YXRlIHVzaW5nIGZ1bmN0aW9uIExMX0FEQ19TZXRPZmZzZXRTdGF0ZSgpLgorICogQG5vdGUgICBJZiBhIGNoYW5uZWwgaXMgbWFwcGVkIG9uIHNldmVyYWwgb2Zmc2V0cyBudW1iZXJzLCBvbmx5IHRoZSBvZmZzZXQKKyAqICAgICAgICAgd2l0aCB0aGUgbG93ZXN0IHZhbHVlIGlzIGNvbnNpZGVyZWQgZm9yIHRoZSBzdWJ0cmFjdGlvbi4KKyAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcKKyAqICAgICAgICAgb24gZWl0aGVyIGdyb3VwcyByZWd1bGFyIG9yIGluamVjdGVkLgorICogQG5vdGUgICBPbiBTVE0zMkc0LCBzb21lIGZhc3QgY2hhbm5lbHMgYXJlIGF2YWlsYWJsZTogZmFzdCBhbmFsb2cgaW5wdXRzCisgKiAgICAgICAgIGNvbWluZyBmcm9tIEdQSU8gcGFkcyAoQURDX0lOMS4uNSkuCisgKiBAcm10b2xsIE9GUjEgICAgIE9GRlNFVDFfQ0ggICAgIExMX0FEQ19TZXRPZmZzZXRcbgorICogICAgICAgICBPRlIxICAgICBPRkZTRVQxICAgICAgICBMTF9BRENfU2V0T2Zmc2V0XG4KKyAqICAgICAgICAgT0ZSMSAgICAgT0ZGU0VUMV9FTiAgICAgTExfQURDX1NldE9mZnNldFxuCisgKiAgICAgICAgIE9GUjIgICAgIE9GRlNFVDJfQ0ggICAgIExMX0FEQ19TZXRPZmZzZXRcbgorICogICAgICAgICBPRlIyICAgICBPRkZTRVQyICAgICAgICBMTF9BRENfU2V0T2Zmc2V0XG4KKyAqICAgICAgICAgT0ZSMiAgICAgT0ZGU0VUMl9FTiAgICAgTExfQURDX1NldE9mZnNldFxuCisgKiAgICAgICAgIE9GUjMgICAgIE9GRlNFVDNfQ0ggICAgIExMX0FEQ19TZXRPZmZzZXRcbgorICogICAgICAgICBPRlIzICAgICBPRkZTRVQzICAgICAgICBMTF9BRENfU2V0T2Zmc2V0XG4KKyAqICAgICAgICAgT0ZSMyAgICAgT0ZGU0VUM19FTiAgICAgTExfQURDX1NldE9mZnNldFxuCisgKiAgICAgICAgIE9GUjQgICAgIE9GRlNFVDRfQ0ggICAgIExMX0FEQ19TZXRPZmZzZXRcbgorICogICAgICAgICBPRlI0ICAgICBPRkZTRVQ0ICAgICAgICBMTF9BRENfU2V0T2Zmc2V0XG4KKyAqICAgICAgICAgT0ZSNCAgICAgT0ZGU0VUNF9FTiAgICAgTExfQURDX1NldE9mZnNldAorICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICogQHBhcmFtICBPZmZzZXR5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT0ZGU0VUXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PRkZTRVRfMgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09GRlNFVF8zCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT0ZGU0VUXzQKKyAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMSAgICAgICAgICAgICAgICAgKDgpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8yICAgICAgICAgICAgICAgICAoOCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzMgICAgICAgICAgICAgICAgICg4KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNCAgICAgICAgICAgICAgICAgKDgpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF81ICAgICAgICAgICAgICAgICAoOCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE2CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQgICAgICAgICAgICg3KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUl9BREMxICAgKDEpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SX0FEQzUgICAoNSkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZCQVQgICAgICAgICAgICAgICg2KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QMSAgICAgICAgICAgKDEpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAyICAgICAgICAgICAoMikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDNfQURDMiAgICAgICgyKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QM19BREMzICAgICAgKDMpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVA0ICAgICAgICAgICAoNSkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDUgICAgICAgICAgICg1KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QNiAgICAgICAgICAgKDQpCisgKgorICogICAgICAgICAoMSkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMS5cbgorICogICAgICAgICAoMikgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMi5cbgorICogICAgICAgICAoMykgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMy5cbgorICogICAgICAgICAoNCkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDNC5cbgorICogICAgICAgICAoNSkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDNS5cbgorICogICAgICAgICAoNikgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZXM6IEFEQzEsCisgKiBBREMzLCBBREM1LlxuICg3KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlczoKKyAqIEFEQzEsIEFEQzMsIEFEQzQsIEFEQzUuXG4gT24gdGhpcyBTVE0zMiBzZXJpZXMsIGFsbCBBREN4IGFyZSBub3QgYXZhaWxhYmxlIG9uCisgKiBhbGwgZGV2aWNlcy4gUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgbW9yZSBkZXRhaWxzLiAoOCkgT24gU1RNMzJHNCwgZmFzdAorICogY2hhbm5lbCBhbGxvd3M6IDIuNSAoc2FtcGxpbmcpICsgMTIuNSAoY29udmVyc2lvbikgPSAxNSBBREMgY2xvY2sgY3ljbGVzCisgKiAoZkFEQykgdG8gY29udmVydCBpbiAxMi1iaXQgcmVzb2x1dGlvbi4gT3RoZXIgY2hhbm5lbHMgYXJlIHNsb3cgY2hhbm5lbHMKKyAqIGFsbG93czogNi41IChzYW1wbGluZykgKyAxMi41IChjb252ZXJzaW9uKSA9IDE5IEFEQyBjbG9jayBjeWNsZXMgKGZBREMpIHRvCisgKiBjb252ZXJ0IGluIDEyLWJpdCByZXNvbHV0aW9uLlxuCisgKiBAcGFyYW0gIE9mZnNldExldmVsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMDAgYW5kIE1heF9EYXRhPTB4RkZGCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1NldE9mZnNldChBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgT2Zmc2V0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgT2Zmc2V0TGV2ZWwpIHsKKyAgX19JTyB1aW50MzJfdCAqcHJlZyA9IF9fQURDX1BUUl9SRUdfT0ZGU0VUKEFEQ3gtPk9GUjEsIE9mZnNldHkpOworCisgIE1PRElGWV9SRUcoKnByZWcsCisgICAgICAgICAgICAgQURDX09GUjFfT0ZGU0VUMV9FTiB8IEFEQ19PRlIxX09GRlNFVDFfQ0ggfCBBRENfT0ZSMV9PRkZTRVQxLAorICAgICAgICAgICAgIEFEQ19PRlIxX09GRlNFVDFfRU4gfCAoQ2hhbm5lbCAmIEFEQ19DSEFOTkVMX0lEX05VTUJFUl9NQVNLKSB8CisgICAgICAgICAgICAgICAgIE9mZnNldExldmVsKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBmb3IgdGhlIEFEQyBzZWxlY3RlZCBvZmZzZXQgaW5zdGFuY2UgMSwgMiwgMyBvciA0OgorICogICAgICAgICBDaGFubmVsIHRvIHdoaWNoIHRoZSBvZmZzZXQgcHJvZ3JhbW1lZCB3aWxsIGJlIGFwcGxpZWQKKyAqICAgICAgICAgKGluZGVwZW5kZW50bHkgb2YgY2hhbm5lbCBtYXBwZWQgb24gQURDIGdyb3VwIHJlZ3VsYXIKKyAqICAgICAgICAgb3IgZ3JvdXAgaW5qZWN0ZWQpCisgKiBAbm90ZSAgIFVzYWdlIG9mIHRoZSByZXR1cm5lZCBjaGFubmVsIG51bWJlcjoKKyAqICAgICAgICAgLSBUbyByZWluamVjdCB0aGlzIGNoYW5uZWwgaW50byBhbm90aGVyIGZ1bmN0aW9uIExMX0FEQ194eHg6CisgKiAgICAgICAgICAgdGhlIHJldHVybmVkIGNoYW5uZWwgbnVtYmVyIGlzIG9ubHkgcGFydGx5IGZvcm1hdHRlZCBvbiBkZWZpbml0aW9uCisgKiAgICAgICAgICAgb2YgbGl0ZXJhbHMgTExfQURDX0NIQU5ORUxfeC4gVGhlcmVmb3JlLCBpdCBoYXMgdG8gYmUgY29tcGFyZWQKKyAqICAgICAgICAgICB3aXRoIHBhcnRzIG9mIGxpdGVyYWxzIExMX0FEQ19DSEFOTkVMX3ggb3IgdXNpbmcKKyAqICAgICAgICAgICBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19DSEFOTkVMX1RPX0RFQ0lNQUxfTkIoKS4KKyAqICAgICAgICAgICBUaGVuIHRoZSBzZWxlY3RlZCBsaXRlcmFsIExMX0FEQ19DSEFOTkVMX3ggY2FuIGJlIHVzZWQKKyAqICAgICAgICAgICBhcyBwYXJhbWV0ZXIgZm9yIGFub3RoZXIgZnVuY3Rpb24uCisgKiAgICAgICAgIC0gVG8gZ2V0IHRoZSBjaGFubmVsIG51bWJlciBpbiBkZWNpbWFsIGZvcm1hdDoKKyAqICAgICAgICAgICBwcm9jZXNzIHRoZSByZXR1cm5lZCB2YWx1ZSB3aXRoIHRoZSBoZWxwZXIgbWFjcm8KKyAqICAgICAgICAgICBAcmVmIF9fTExfQURDX0NIQU5ORUxfVE9fREVDSU1BTF9OQigpLgorICogQG5vdGUgICBPbiBTVE0zMkc0LCBzb21lIGZhc3QgY2hhbm5lbHMgYXJlIGF2YWlsYWJsZTogZmFzdCBhbmFsb2cgaW5wdXRzCisgKiAgICAgICAgIGNvbWluZyBmcm9tIEdQSU8gcGFkcyAoQURDX0lOMS4uNSkuCisgKiBAcm10b2xsIE9GUjEgICAgIE9GRlNFVDFfQ0ggICAgIExMX0FEQ19HZXRPZmZzZXRDaGFubmVsXG4KKyAqICAgICAgICAgT0ZSMiAgICAgT0ZGU0VUMl9DSCAgICAgTExfQURDX0dldE9mZnNldENoYW5uZWxcbgorICogICAgICAgICBPRlIzICAgICBPRkZTRVQzX0NIICAgICBMTF9BRENfR2V0T2Zmc2V0Q2hhbm5lbFxuCisgKiAgICAgICAgIE9GUjQgICAgIE9GRlNFVDRfQ0ggICAgIExMX0FEQ19HZXRPZmZzZXRDaGFubmVsCisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcGFyYW0gIE9mZnNldHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PRkZTRVRfMQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09GRlNFVF8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT0ZGU0VUXzMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PRkZTRVRfNAorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMSAgICAgICAgICAgICAgICAgKDgpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8yICAgICAgICAgICAgICAgICAoOCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzMgICAgICAgICAgICAgICAgICg4KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNCAgICAgICAgICAgICAgICAgKDgpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF81ICAgICAgICAgICAgICAgICAoOCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE2CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQgICAgICAgICAgICg3KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUl9BREMxICAgKDEpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SX0FEQzUgICAoNSkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZCQVQgICAgICAgICAgICAgICg2KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QMSAgICAgICAgICAgKDEpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAyICAgICAgICAgICAoMikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDNfQURDMiAgICAgICgyKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QM19BREMzICAgICAgKDMpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVA0ICAgICAgICAgICAoNSkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDUgICAgICAgICAgICg1KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QNiAgICAgICAgICAgKDQpCisgKgorICogICAgICAgICAoMSkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMS5cbgorICogICAgICAgICAoMikgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMi5cbgorICogICAgICAgICAoMykgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMy5cbgorICogICAgICAgICAoNCkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDNC5cbgorICogICAgICAgICAoNSkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDNS5cbgorICogICAgICAgICAoNikgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZXM6IEFEQzEsCisgKiBBREMzLCBBREM1LlxuICg3KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlczoKKyAqIEFEQzEsIEFEQzMsIEFEQzQsIEFEQzUuXG4gT24gdGhpcyBTVE0zMiBzZXJpZXMsIGFsbCBBREN4IGFyZSBub3QgYXZhaWxhYmxlIG9uCisgKiBhbGwgZGV2aWNlcy4gUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgbW9yZSBkZXRhaWxzLiAoOCkgT24gU1RNMzJHNCwgZmFzdAorICogY2hhbm5lbCBhbGxvd3M6IDIuNSAoc2FtcGxpbmcpICsgMTIuNSAoY29udmVyc2lvbikgPSAxNSBBREMgY2xvY2sgY3ljbGVzCisgKiAoZkFEQykgdG8gY29udmVydCBpbiAxMi1iaXQgcmVzb2x1dGlvbi4gT3RoZXIgY2hhbm5lbHMgYXJlIHNsb3cgY2hhbm5lbHMKKyAqIGFsbG93czogNi41IChzYW1wbGluZykgKyAxMi41IChjb252ZXJzaW9uKSA9IDE5IEFEQyBjbG9jayBjeWNsZXMgKGZBREMpIHRvCisgKiBjb252ZXJ0IGluIDEyLWJpdCByZXNvbHV0aW9uLlxuICgxLCAyLCAzLCA0LCA1LCA3KSBGb3IgQURDIGNoYW5uZWwgcmVhZCBiYWNrCisgKiBmcm9tIEFEQyByZWdpc3RlciwgY29tcGFyaXNvbiB3aXRoIGludGVybmFsIGNoYW5uZWwgcGFyYW1ldGVyIHRvIGJlIGRvbmUKKyAqICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIGhlbHBlciBtYWNybyBAcmVmCisgKiBfX0xMX0FEQ19DSEFOTkVMX0lOVEVSTkFMX1RPX0VYVEVSTkFMKCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfR2V0T2Zmc2V0Q2hhbm5lbChjb25zdCBBRENfVHlwZURlZiAqQURDeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBPZmZzZXR5KSB7CisgIGNvbnN0IF9fSU8gdWludDMyX3QgKnByZWcgPSBfX0FEQ19QVFJfUkVHX09GRlNFVChBREN4LT5PRlIxLCBPZmZzZXR5KTsKKworICByZXR1cm4gKHVpbnQzMl90KVJFQURfQklUKCpwcmVnLCBBRENfT0ZSMV9PRkZTRVQxX0NIKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBmb3IgdGhlIEFEQyBzZWxlY3RlZCBvZmZzZXQgaW5zdGFuY2UgMSwgMiwgMyBvciA0OgorICogICAgICAgICBPZmZzZXQgbGV2ZWwgKG9mZnNldCB0byBiZSBzdWJ0cmFjdGVkIGZyb20gdGhlIHJhdworICogICAgICAgICBjb252ZXJ0ZWQgZGF0YSkuCisgKiBAbm90ZSAgIENhdXRpb246IE9mZnNldCBmb3JtYXQgaXMgZGVwZW5kZW50IHRvIEFEQyByZXNvbHV0aW9uOgorICogICAgICAgICBvZmZzZXQgaGFzIHRvIGJlIGxlZnQtYWxpZ25lZCBvbiBiaXQgMTEsIHRoZSBMU0IgKHJpZ2h0IGJpdHMpCisgKiAgICAgICAgIGFyZSBzZXQgdG8gMC4KKyAqIEBybXRvbGwgT0ZSMSAgICAgT0ZGU0VUMSAgICAgICAgTExfQURDX0dldE9mZnNldExldmVsXG4KKyAqICAgICAgICAgT0ZSMiAgICAgT0ZGU0VUMiAgICAgICAgTExfQURDX0dldE9mZnNldExldmVsXG4KKyAqICAgICAgICAgT0ZSMyAgICAgT0ZGU0VUMyAgICAgICAgTExfQURDX0dldE9mZnNldExldmVsXG4KKyAqICAgICAgICAgT0ZSNCAgICAgT0ZGU0VUNCAgICAgICAgTExfQURDX0dldE9mZnNldExldmVsCisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcGFyYW0gIE9mZnNldHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PRkZTRVRfMQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09GRlNFVF8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT0ZGU0VUXzMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PRkZTRVRfNAorICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwIGFuZCBNYXhfRGF0YT0weEZGRgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0dldE9mZnNldExldmVsKGNvbnN0IEFEQ19UeXBlRGVmICpBREN4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBPZmZzZXR5KSB7CisgIGNvbnN0IF9fSU8gdWludDMyX3QgKnByZWcgPSBfX0FEQ19QVFJfUkVHX09GRlNFVChBREN4LT5PRlIxLCBPZmZzZXR5KTsKKworICByZXR1cm4gKHVpbnQzMl90KVJFQURfQklUKCpwcmVnLCBBRENfT0ZSMV9PRkZTRVQxKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFNldCBmb3IgdGhlIEFEQyBzZWxlY3RlZCBvZmZzZXQgaW5zdGFuY2UgMSwgMiwgMyBvciA0OgorICogICAgICAgICBmb3JjZSBvZmZzZXQgc3RhdGUgZGlzYWJsZSBvciBlbmFibGUKKyAqICAgICAgICAgd2l0aG91dCBtb2RpZnlpbmcgb2Zmc2V0IGNoYW5uZWwgb3Igb2Zmc2V0IHZhbHVlLgorICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBuZWVkZWQgb25seSBpbiBjYXNlIG9mIG9mZnNldCB0byBiZQorICogICAgICAgICBlbmFibGVkLWRpc2FibGVkIGR5bmFtaWNhbGx5LCBhbmQgc2hvdWxkIG5vdCBiZSBuZWVkZWQgaW4gb3RoZXIKKyAqIGNhc2VzOiBmdW5jdGlvbiBMTF9BRENfU2V0T2Zmc2V0KCkgYXV0b21hdGljYWxseSBlbmFibGVzIHRoZSBvZmZzZXQuCisgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICogICAgICAgICBBREMgc3RhdGU6CisgKiAgICAgICAgIEFEQyBtdXN0IGJlIGRpc2FibGVkIG9yIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nCisgKiAgICAgICAgIG9uIGVpdGhlciBncm91cHMgcmVndWxhciBvciBpbmplY3RlZC4KKyAqIEBybXRvbGwgT0ZSMSAgICAgT0ZGU0VUMV9FTiAgICAgTExfQURDX1NldE9mZnNldFN0YXRlXG4KKyAqICAgICAgICAgT0ZSMiAgICAgT0ZGU0VUMl9FTiAgICAgTExfQURDX1NldE9mZnNldFN0YXRlXG4KKyAqICAgICAgICAgT0ZSMyAgICAgT0ZGU0VUM19FTiAgICAgTExfQURDX1NldE9mZnNldFN0YXRlXG4KKyAqICAgICAgICAgT0ZSNCAgICAgT0ZGU0VUNF9FTiAgICAgTExfQURDX1NldE9mZnNldFN0YXRlCisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcGFyYW0gIE9mZnNldHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PRkZTRVRfMQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09GRlNFVF8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT0ZGU0VUXzMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PRkZTRVRfNAorICogQHBhcmFtICBPZmZzZXRTdGF0ZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09GRlNFVF9ESVNBQkxFCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT0ZGU0VUX0VOQUJMRQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19TZXRPZmZzZXRTdGF0ZShBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgT2Zmc2V0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBPZmZzZXRTdGF0ZSkgeworICBfX0lPIHVpbnQzMl90ICpwcmVnID0gX19BRENfUFRSX1JFR19PRkZTRVQoQURDeC0+T0ZSMSwgT2Zmc2V0eSk7CisKKyAgTU9ESUZZX1JFRygqcHJlZywgQURDX09GUjFfT0ZGU0VUMV9FTiwgT2Zmc2V0U3RhdGUpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IGZvciB0aGUgQURDIHNlbGVjdGVkIG9mZnNldCBpbnN0YW5jZSAxLCAyLCAzIG9yIDQ6CisgKiAgICAgICAgIG9mZnNldCBzdGF0ZSBkaXNhYmxlZCBvciBlbmFibGVkLgorICogQHJtdG9sbCBPRlIxICAgICBPRkZTRVQxX0VOICAgICBMTF9BRENfR2V0T2Zmc2V0U3RhdGVcbgorICogICAgICAgICBPRlIyICAgICBPRkZTRVQyX0VOICAgICBMTF9BRENfR2V0T2Zmc2V0U3RhdGVcbgorICogICAgICAgICBPRlIzICAgICBPRkZTRVQzX0VOICAgICBMTF9BRENfR2V0T2Zmc2V0U3RhdGVcbgorICogICAgICAgICBPRlI0ICAgICBPRkZTRVQ0X0VOICAgICBMTF9BRENfR2V0T2Zmc2V0U3RhdGUKKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEBwYXJhbSAgT2Zmc2V0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09GRlNFVF8xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT0ZGU0VUXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PRkZTRVRfMworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09GRlNFVF80CisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT0ZGU0VUX0RJU0FCTEUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PRkZTRVRfRU5BQkxFCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfR2V0T2Zmc2V0U3RhdGUoY29uc3QgQURDX1R5cGVEZWYgKkFEQ3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE9mZnNldHkpIHsKKyAgY29uc3QgX19JTyB1aW50MzJfdCAqcHJlZyA9IF9fQURDX1BUUl9SRUdfT0ZGU0VUKEFEQ3gtPk9GUjEsIE9mZnNldHkpOworCisgIHJldHVybiAodWludDMyX3QpUkVBRF9CSVQoKnByZWcsIEFEQ19PRlIxX09GRlNFVDFfRU4pOworfQorCisvKioKKyAqIEBicmllZiAgU2V0IGZvciB0aGUgQURDIHNlbGVjdGVkIG9mZnNldCBpbnN0YW5jZSAxLCAyLCAzIG9yIDQ6CisgKiAgICAgICAgIGNob29zZSBvZmZzZXQgc2lnbi4KKyAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcKKyAqICAgICAgICAgb24gZWl0aGVyIGdyb3VwcyByZWd1bGFyIG9yIGluamVjdGVkLgorICogQHJtdG9sbCBPRlIxICAgICBPRkZTRVRQT1MgICAgICBMTF9BRENfU2V0T2Zmc2V0U2lnblxuCisgKiAgICAgICAgIE9GUjIgICAgIE9GRlNFVFBPUyAgICAgIExMX0FEQ19TZXRPZmZzZXRTaWduXG4KKyAqICAgICAgICAgT0ZSMyAgICAgT0ZGU0VUUE9TICAgICAgTExfQURDX1NldE9mZnNldFNpZ25cbgorICogICAgICAgICBPRlI0ICAgICBPRkZTRVRQT1MgICAgICBMTF9BRENfU2V0T2Zmc2V0U2lnbgorICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICogQHBhcmFtICBPZmZzZXR5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT0ZGU0VUXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PRkZTRVRfMgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09GRlNFVF8zCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT0ZGU0VUXzQKKyAqIEBwYXJhbSAgT2Zmc2V0U2lnbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09GRlNFVF9TSUdOX05FR0FUSVZFCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT0ZGU0VUX1NJR05fUE9TSVRJVkUKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfU2V0T2Zmc2V0U2lnbihBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgT2Zmc2V0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE9mZnNldFNpZ24pIHsKKyAgX19JTyB1aW50MzJfdCAqcHJlZyA9IF9fQURDX1BUUl9SRUdfT0ZGU0VUKEFEQ3gtPk9GUjEsIE9mZnNldHkpOworCisgIE1PRElGWV9SRUcoKnByZWcsIEFEQ19PRlIxX09GRlNFVFBPUywgT2Zmc2V0U2lnbik7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgZm9yIHRoZSBBREMgc2VsZWN0ZWQgb2Zmc2V0IGluc3RhbmNlIDEsIDIsIDMgb3IgNDoKKyAqICAgICAgICAgb2Zmc2V0IHNpZ24gaWYgcG9zaXRpdmUgb3IgbmVnYXRpdmUuCisgKiBAcm10b2xsIE9GUjEgICAgIE9GRlNFVFBPUyAgICAgIExMX0FEQ19HZXRPZmZzZXRTaWduXG4KKyAqICAgICAgICAgT0ZSMiAgICAgT0ZGU0VUUE9TICAgICAgTExfQURDX0dldE9mZnNldFNpZ25cbgorICogICAgICAgICBPRlIzICAgICBPRkZTRVRQT1MgICAgICBMTF9BRENfR2V0T2Zmc2V0U2lnblxuCisgKiAgICAgICAgIE9GUjQgICAgIE9GRlNFVFBPUyAgICAgIExMX0FEQ19HZXRPZmZzZXRTaWduCisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcGFyYW0gIE9mZnNldHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PRkZTRVRfMQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09GRlNFVF8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT0ZGU0VUXzMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PRkZTRVRfNAorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09GRlNFVF9TSUdOX05FR0FUSVZFCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT0ZGU0VUX1NJR05fUE9TSVRJVkUKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19HZXRPZmZzZXRTaWduKGNvbnN0IEFEQ19UeXBlRGVmICpBREN4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE9mZnNldHkpIHsKKyAgY29uc3QgX19JTyB1aW50MzJfdCAqcHJlZyA9IF9fQURDX1BUUl9SRUdfT0ZGU0VUKEFEQ3gtPk9GUjEsIE9mZnNldHkpOworCisgIHJldHVybiAodWludDMyX3QpUkVBRF9CSVQoKnByZWcsIEFEQ19PRlIxX09GRlNFVFBPUyk7Cit9CisKKy8qKgorICogQGJyaWVmICBTZXQgZm9yIHRoZSBBREMgc2VsZWN0ZWQgb2Zmc2V0IGluc3RhbmNlIDEsIDIsIDMgb3IgNDoKKyAqICAgICAgICAgY2hvb3NlIG9mZnNldCBzYXR1cmF0aW9uIG1vZGUuCisgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICogICAgICAgICBBREMgc3RhdGU6CisgKiAgICAgICAgIEFEQyBtdXN0IGJlIGRpc2FibGVkIG9yIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nCisgKiAgICAgICAgIG9uIGVpdGhlciBncm91cHMgcmVndWxhciBvciBpbmplY3RlZC4KKyAqIEBybXRvbGwgT0ZSMSAgICAgU0FURU4gICAgICAgICAgTExfQURDX1NldE9mZnNldFNhdHVyYXRpb25cbgorICogICAgICAgICBPRlIyICAgICBTQVRFTiAgICAgICAgICBMTF9BRENfU2V0T2Zmc2V0U2F0dXJhdGlvblxuCisgKiAgICAgICAgIE9GUjMgICAgIFNBVEVOICAgICAgICAgIExMX0FEQ19TZXRPZmZzZXRTYXR1cmF0aW9uXG4KKyAqICAgICAgICAgT0ZSNCAgICAgU0FURU4gICAgICAgICAgTExfQURDX1NldE9mZnNldFNhdHVyYXRpb24KKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEBwYXJhbSAgT2Zmc2V0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09GRlNFVF8xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT0ZGU0VUXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PRkZTRVRfMworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09GRlNFVF80CisgKiBAcGFyYW0gIE9mZnNldFNhdHVyYXRpb24gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PRkZTRVRfU0FUVVJBVElPTl9FTkFCTEUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PRkZTRVRfU0FUVVJBVElPTl9ESVNBQkxFCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1NldE9mZnNldFNhdHVyYXRpb24oQURDX1R5cGVEZWYgKkFEQ3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBPZmZzZXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgT2Zmc2V0U2F0dXJhdGlvbikgeworICBfX0lPIHVpbnQzMl90ICpwcmVnID0gX19BRENfUFRSX1JFR19PRkZTRVQoQURDeC0+T0ZSMSwgT2Zmc2V0eSk7CisKKyAgTU9ESUZZX1JFRygqcHJlZywgQURDX09GUjFfU0FURU4sIE9mZnNldFNhdHVyYXRpb24pOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IGZvciB0aGUgQURDIHNlbGVjdGVkIG9mZnNldCBpbnN0YW5jZSAxLCAyLCAzIG9yIDQ6CisgKiAgICAgICAgIG9mZnNldCBzYXR1cmF0aW9uIGlmIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgKiBAcm10b2xsIE9GUjEgICAgIFNBVEVOICAgICAgICAgIExMX0FEQ19HZXRPZmZzZXRTYXR1cmF0aW9uXG4KKyAqICAgICAgICAgT0ZSMiAgICAgU0FURU4gICAgICAgICAgTExfQURDX0dldE9mZnNldFNhdHVyYXRpb25cbgorICogICAgICAgICBPRlIzICAgICBTQVRFTiAgICAgICAgICBMTF9BRENfR2V0T2Zmc2V0U2F0dXJhdGlvblxuCisgKiAgICAgICAgIE9GUjQgICAgIFNBVEVOICAgICAgICAgIExMX0FEQ19HZXRPZmZzZXRTYXR1cmF0aW9uCisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcGFyYW0gIE9mZnNldHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PRkZTRVRfMQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09GRlNFVF8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT0ZGU0VUXzMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PRkZTRVRfNAorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09GRlNFVF9TQVRVUkFUSU9OX0VOQUJMRQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09GRlNFVF9TQVRVUkFUSU9OX0RJU0FCTEUKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19HZXRPZmZzZXRTYXR1cmF0aW9uKGNvbnN0IEFEQ19UeXBlRGVmICpBREN4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE9mZnNldHkpIHsKKyAgY29uc3QgX19JTyB1aW50MzJfdCAqcHJlZyA9IF9fQURDX1BUUl9SRUdfT0ZGU0VUKEFEQ3gtPk9GUjEsIE9mZnNldHkpOworCisgIHJldHVybiAodWludDMyX3QpUkVBRF9CSVQoKnByZWcsIEFEQ19PRlIxX1NBVEVOKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFNldCBBREMgZ2FpbiBjb21wZW5zYXRpb24uCisgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gc2V0IHRoZSBnYWluIGNvbXBlbnNhdGlvbiBjb2VmZmljaWVudAorICogICAgICAgICB0aGF0IGlzIGFwcGxpZWQgdG8gcmF3IGNvbnZlcnRlZCBkYXRhIHVzaW5nIHRoZSBmb3JtdWxhOgorICogICAgICAgICAgIERBVEEgPSBEQVRBKHJhdykgKiAoZ2FpbiBjb21wZW5zYXRpb24gY29lZikgLyA0MDk2CisgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gZW5hYmxlcyB0aGUgZ2FpbiBjb21wZW5zYXRpb24gaWYgZ2l2ZW4KKyAqICAgICAgICAgY29lZmZpY2llbnQgaXMgYWJvdmUgMCwgb3RoZXJ3aXNlIGl0IGRpc2FibGVzIGl0LgorICogQG5vdGUgICBHYWluIGNvbXBlbnNhdGlvbiB3aGVuIGVuYWJsZWQgaXMgYXBwbGllZCB0byBhbGwgY2hhbm5lbHMuCisgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICogICAgICAgICBBREMgc3RhdGU6CisgKiAgICAgICAgIEFEQyBtdXN0IGJlIGRpc2FibGVkIG9yIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nCisgKiAgICAgICAgIG9uIGVpdGhlciBncm91cHMgcmVndWxhciBvciBpbmplY3RlZC4KKyAqIEBybXRvbGwgR0NPTVAgICAgR0NPTVBDT0VGRiAgICAgTExfQURDX1NldEdhaW5Db21wZW5zYXRpb25cbgorICogICAgICAgICBDRkdSMiAgICBHQ09NUCAgICAgICAgICBMTF9BRENfU2V0R2FpbkNvbXBlbnNhdGlvbgorICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICogQHBhcmFtICBHYWluQ29tcGVuc2F0aW9uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToKKyAqICAgICAgICAgMCAgICAgICAgICAgR2FpbiBjb21wZW5zYXRpb24gd2lsbCBiZSBkaXNhYmxlZCBhbmQgdmFsdWUgc2V0IHRvIDAKKyAqICAgICAgICAgMSAtPiAxNjM5MyAgR2FpbiBjb21wZW5zYXRpb24gd2lsbCBiZSBlbmFibGVkIHdpdGggc3BlY2lmaWVkIHZhbHVlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1NldEdhaW5Db21wZW5zYXRpb24oQURDX1R5cGVEZWYgKkFEQ3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBHYWluQ29tcGVuc2F0aW9uKSB7CisgIE1PRElGWV9SRUcoQURDeC0+R0NPTVAsIEFEQ19HQ09NUF9HQ09NUENPRUZGLCBHYWluQ29tcGVuc2F0aW9uKTsKKyAgTU9ESUZZX1JFRyhBREN4LT5DRkdSMiwgQURDX0NGR1IyX0dDT01QLAorICAgICAgICAgICAgICgoR2FpbkNvbXBlbnNhdGlvbiA9PSAwVUwpID8gMFVMIDogMVVMKSA8PCBBRENfQ0ZHUjJfR0NPTVBfUG9zKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCB0aGUgQURDIGdhaW4gY29tcGVuc2F0aW9uIHZhbHVlCisgKiBAcm10b2xsIEdDT01QICAgIEdDT01QQ09FRkYgICAgIExMX0FEQ19HZXRHYWluQ29tcGVuc2F0aW9uXG4KKyAqICAgICAgICAgQ0ZHUjIgICAgR0NPTVAgICAgICAgICAgTExfQURDX0dldEdhaW5Db21wZW5zYXRpb24KKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlOgorICogICAgICAgICAwICAgICAgICAgICBHYWluIGNvbXBlbnNhdGlvbiBpcyBkaXNhYmxlZAorICogICAgICAgICAxIC0+IDE2MzkzICBHYWluIGNvbXBlbnNhdGlvbiBpcyBlbmFibGVkIHdpdGggcmV0dXJuZWQgdmFsdWUKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19HZXRHYWluQ29tcGVuc2F0aW9uKGNvbnN0IEFEQ19UeXBlRGVmICpBREN4KSB7CisgIHJldHVybiAoKFJFQURfQklUKEFEQ3gtPkNGR1IyLCBBRENfQ0ZHUjJfR0NPTVApID09IEFEQ19DRkdSMl9HQ09NUCkKKyAgICAgICAgICAgICAgPyBSRUFEX0JJVChBREN4LT5HQ09NUCwgQURDX0dDT01QX0dDT01QQ09FRkYpCisgICAgICAgICAgICAgIDogMFVMKTsKK30KKworI2lmIGRlZmluZWQoQURDX1NNUFIxX1NNUFBMVVMpCisvKioKKyAqIEBicmllZiAgU2V0IEFEQyBzYW1wbGluZyB0aW1lIGNvbW1vbiBjb25maWd1cmF0aW9uIGltcGFjdGluZworICogICAgICAgICBzZXR0aW5ncyBvZiBzYW1wbGluZyB0aW1lIGNoYW5uZWwgd2lzZS4KKyAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcKKyAqICAgICAgICAgb24gZWl0aGVyIGdyb3VwcyByZWd1bGFyIG9yIGluamVjdGVkLgorICogQHJtdG9sbCBTTVBSMSAgICBTTVBQTFVTICAgICAgICBMTF9BRENfU2V0U2FtcGxpbmdUaW1lQ29tbW9uQ29uZmlnCisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcGFyYW0gIFNhbXBsaW5nVGltZUNvbW1vbkNvbmZpZyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcKKyAqIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19TQU1QTElOR1RJTUVfQ09NTU9OX0RFRkFVTFQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19TQU1QTElOR1RJTUVfQ09NTU9OXzNDNV9SRVBMXzJDNQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19TZXRTYW1wbGluZ1RpbWVDb21tb25Db25maWcoCisgICAgQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IFNhbXBsaW5nVGltZUNvbW1vbkNvbmZpZykgeworICBNT0RJRllfUkVHKEFEQ3gtPlNNUFIxLCBBRENfU01QUjFfU01QUExVUywgU2FtcGxpbmdUaW1lQ29tbW9uQ29uZmlnKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBBREMgc2FtcGxpbmcgdGltZSBjb21tb24gY29uZmlndXJhdGlvbiBpbXBhY3RpbmcKKyAqICAgICAgICAgc2V0dGluZ3Mgb2Ygc2FtcGxpbmcgdGltZSBjaGFubmVsIHdpc2UuCisgKiBAcm10b2xsIFNNUFIxICAgIFNNUFBMVVMgICAgICAgIExMX0FEQ19HZXRTYW1wbGluZ1RpbWVDb21tb25Db25maWcKKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19TQU1QTElOR1RJTUVfQ09NTU9OX0RFRkFVTFQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19TQU1QTElOR1RJTUVfQ09NTU9OXzNDNV9SRVBMXzJDNQorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX0FEQ19HZXRTYW1wbGluZ1RpbWVDb21tb25Db25maWcoY29uc3QgQURDX1R5cGVEZWYgKkFEQ3gpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeC0+U01QUjEsIEFEQ19TTVBSMV9TTVBQTFVTKSk7Cit9CisjZW5kaWYgLyogQURDX1NNUFIxX1NNUFBMVVMgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VGX0NvbmZpZ3VyYXRpb25fQURDX0dyb3VwX1JlZ3VsYXIgQ29uZmlndXJhdGlvbiBvZiBBREMKKyAqIGhpZXJhcmNoaWNhbCBzY29wZTogZ3JvdXAgcmVndWxhcgorICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiAgU2V0IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBzb3VyY2U6CisgKiAgICAgICAgIGludGVybmFsIChTVyBzdGFydCkgb3IgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsICh0aW1lciBldmVudCwKKyAqICAgICAgICAgZXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUpLgorICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllcywgc2V0dGluZyB0cmlnZ2VyIHNvdXJjZSB0byBleHRlcm5hbCB0cmlnZ2VyCisgKiAgICAgICAgIGFsc28gc2V0IHRyaWdnZXIgcG9sYXJpdHkgdG8gcmlzaW5nIGVkZ2UKKyAqICAgICAgICAgKGRlZmF1bHQgc2V0dGluZyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHNvbWUgQURDIG9uIG90aGVyCisgKiAgICAgICAgIFNUTTMyIHNlcmllcyBoYXZpbmcgdGhpcyBzZXR0aW5nIHNldCBieSBIVyBkZWZhdWx0IHZhbHVlKS4KKyAqICAgICAgICAgSW4gY2FzZSBvZiBuZWVkIHRvIG1vZGlmeSB0cmlnZ2VyIGVkZ2UsIHVzZQorICogICAgICAgICBmdW5jdGlvbiBAcmVmIExMX0FEQ19SRUdfU2V0VHJpZ2dlckVkZ2UoKS4KKyAqIEBub3RlICAgQXZhaWxhYmlsaXR5IG9mIHBhcmFtZXRlcnMgb2YgdHJpZ2dlciBzb3VyY2VzIGZyb20gdGltZXIKKyAqICAgICAgICAgZGVwZW5kcyBvbiB0aW1lcnMgYXZhaWxhYmlsaXR5IG9uIHRoZSBzZWxlY3RlZCBkZXZpY2UuCisgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICogICAgICAgICBBREMgc3RhdGU6CisgKiAgICAgICAgIEFEQyBtdXN0IGJlIGRpc2FibGVkIG9yIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nCisgKiAgICAgICAgIG9uIGdyb3VwIHJlZ3VsYXIuCisgKiBAcm10b2xsIENGR1IgICAgIEVYVFNFTCAgICAgICAgIExMX0FEQ19SRUdfU2V0VHJpZ2dlclNvdXJjZVxuCisgKiAgICAgICAgIENGR1IgICAgIEVYVEVOICAgICAgICAgIExMX0FEQ19SRUdfU2V0VHJpZ2dlclNvdXJjZQorICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICogQHBhcmFtICBUcmlnZ2VyU291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfU09GVFdBUkUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9UUkdPCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfVFJHTzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9DSDEgICAgICAgICgxKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU0xX0NIMiAgICAgICAgKDEpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfQ0gzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTJfVFJHTworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU0yX0NIMSAgICAgICAgKDIpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTJfQ0gyICAgICAgICAoMSkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMl9DSDMgICAgICAgICgyKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU0zX1RSR08KKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNM19DSDEgICAgICAgICgyKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU0zX0NINCAgICAgICAgKDEpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTRfVFJHTworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU00X0NIMSAgICAgICAgKDIpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTRfQ0g0ICAgICAgICAoMSkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNNl9UUkdPCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTdfVFJHTworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU04X1RSR08KKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNOF9UUkdPMgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU04X0NIMSAgICAgICAgKDIpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTE1X1RSR08KKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMjBfVFJHTworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU0yMF9UUkdPMgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU0yMF9DSDEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMjBfQ0gyICAgICAgICgxKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU0yMF9DSDMgICAgICAgKDEpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX0hSVElNX1RSRzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfSFJUSU1fVFJHMiAgICAgICgyKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9IUlRJTV9UUkczCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX0hSVElNX1RSRzQgICAgICAoMikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfSFJUSU1fVFJHNQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9IUlRJTV9UUkc2CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX0hSVElNX1RSRzcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfSFJUSU1fVFJHOAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9IUlRJTV9UUkc5CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX0hSVElNX1RSRzEwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX0VYVElfTElORTExICAgICAoMSkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfRVhUSV9MSU5FMiAgICAgICgyKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9MUFRJTV9PVVQKKyAqCisgKiAgICAgICAgICgxKSBPbiBTVE0zMkc0IHNlcmllcywgcGFyYW1ldGVyIG5vdCBhdmFpbGFibGUgb24gYWxsIEFEQyBpbnN0YW5jZXM6CisgKiBBREMxLCBBREMyLlxuICgyKSBPbiBTVE0zMkc0IHNlcmllcywgcGFyYW1ldGVyIG5vdCBhdmFpbGFibGUgb24gYWxsIEFEQworICogaW5zdGFuY2VzOiBBREMzLCBBREM0LCBBREM1LiBPbiB0aGlzIFNUTTMyIHNlcmllcywgYWxsIEFEQ3ggYXJlIG5vdCBhdmFpbGFibGUKKyAqIG9uIGFsbCBkZXZpY2VzLiBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBtb3JlIGRldGFpbHMuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1JFR19TZXRUcmlnZ2VyU291cmNlKEFEQ19UeXBlRGVmICpBREN4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRyaWdnZXJTb3VyY2UpIHsKKyAgTU9ESUZZX1JFRyhBREN4LT5DRkdSLCBBRENfQ0ZHUl9FWFRFTiB8IEFEQ19DRkdSX0VYVFNFTCwgVHJpZ2dlclNvdXJjZSk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIHNvdXJjZToKKyAqICAgICAgICAgaW50ZXJuYWwgKFNXIHN0YXJ0KSBvciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWwgKHRpbWVyIGV2ZW50LAorICogICAgICAgICBleHRlcm5hbCBpbnRlcnJ1cHQgbGluZSkuCisgKiBAbm90ZSAgIFRvIGRldGVybWluZSB3aGV0aGVyIGdyb3VwIHJlZ3VsYXIgdHJpZ2dlciBzb3VyY2UgaXMKKyAqICAgICAgICAgaW50ZXJuYWwgKFNXIHN0YXJ0KSBvciBleHRlcm5hbCwgd2l0aG91dCBkZXRhaWwKKyAqICAgICAgICAgb2Ygd2hpY2ggcGVyaXBoZXJhbCBpcyBzZWxlY3RlZCBhcyBleHRlcm5hbCB0cmlnZ2VyLAorICogICAgICAgICAoZXF1aXZhbGVudCB0bworICogICAgICAgICAiaWYoTExfQURDX1JFR19HZXRUcmlnZ2VyU291cmNlKEFEQzEpID09IExMX0FEQ19SRUdfVFJJR19TT0ZUV0FSRSkiKQorICogICAgICAgICB1c2UgZnVuY3Rpb24gQHJlZiBMTF9BRENfUkVHX0lzVHJpZ2dlclNvdXJjZVNXU3RhcnQuCisgKiBAbm90ZSAgIEF2YWlsYWJpbGl0eSBvZiBwYXJhbWV0ZXJzIG9mIHRyaWdnZXIgc291cmNlcyBmcm9tIHRpbWVyCisgKiAgICAgICAgIGRlcGVuZHMgb24gdGltZXJzIGF2YWlsYWJpbGl0eSBvbiB0aGUgc2VsZWN0ZWQgZGV2aWNlLgorICogQHJtdG9sbCBDRkdSICAgICBFWFRTRUwgICAgICAgICBMTF9BRENfUkVHX0dldFRyaWdnZXJTb3VyY2VcbgorICogICAgICAgICBDRkdSICAgICBFWFRFTiAgICAgICAgICBMTF9BRENfUkVHX0dldFRyaWdnZXJTb3VyY2UKKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19TT0ZUV0FSRQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU0xX1RSR08KKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9UUkdPMgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU0xX0NIMSAgICAgICAgKDEpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfQ0gyICAgICAgICAoMSkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9DSDMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMl9UUkdPCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTJfQ0gxICAgICAgICAoMikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMl9DSDIgICAgICAgICgxKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU0yX0NIMyAgICAgICAgKDIpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTNfVFJHTworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU0zX0NIMSAgICAgICAgKDIpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTNfQ0g0ICAgICAgICAoMSkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNNF9UUkdPCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTRfQ0gxICAgICAgICAoMikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNNF9DSDQgICAgICAgICgxKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU02X1RSR08KKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNN19UUkdPCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTThfVFJHTworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU04X1RSR08yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTThfQ0gxICAgICAgICAoMikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMTVfVFJHTworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU0yMF9UUkdPCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTIwX1RSR08yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTIwX0NIMQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU0yMF9DSDIgICAgICAgKDEpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTIwX0NIMyAgICAgICAoMSkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfSFJUSU1fVFJHMQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9IUlRJTV9UUkcyICAgICAgKDIpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX0hSVElNX1RSRzMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfSFJUSU1fVFJHNCAgICAgICgyKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9IUlRJTV9UUkc1CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX0hSVElNX1RSRzYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfSFJUSU1fVFJHNworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9IUlRJTV9UUkc4CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX0hSVElNX1RSRzkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfSFJUSU1fVFJHMTAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfRVhUSV9MSU5FMTEgICAgICgxKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9FWFRJX0xJTkUyICAgICAgKDIpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX0xQVElNX09VVAorICoKKyAqICAgICAgICAgKDEpIE9uIFNUTTMyRzQgc2VyaWVzLCBwYXJhbWV0ZXIgbm90IGF2YWlsYWJsZSBvbiBhbGwgQURDIGluc3RhbmNlczoKKyAqIEFEQzEsIEFEQzIuXG4gKDIpIE9uIFNUTTMyRzQgc2VyaWVzLCBwYXJhbWV0ZXIgbm90IGF2YWlsYWJsZSBvbiBhbGwgQURDCisgKiBpbnN0YW5jZXM6IEFEQzMsIEFEQzQsIEFEQzUuIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBhbGwgQURDeCBhcmUgbm90IGF2YWlsYWJsZQorICogb24gYWxsIGRldmljZXMuIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19SRUdfR2V0VHJpZ2dlclNvdXJjZShjb25zdCBBRENfVHlwZURlZiAqQURDeCkgeworICBfX0lPIHVpbnQzMl90IHRyaWdnZXJfc291cmNlID0KKyAgICAgIFJFQURfQklUKEFEQ3gtPkNGR1IsIEFEQ19DRkdSX0VYVFNFTCB8IEFEQ19DRkdSX0VYVEVOKTsKKworICAvKiBWYWx1ZSBmb3Igc2hpZnQgb2YgezA7IDQ7IDg7IDEyfSBkZXBlbmRpbmcgb24gdmFsdWUgb2YgYml0ZmllbGQgICAgICAgICAgKi8KKyAgLyogY29ycmVzcG9uZGluZyB0byBBRENfQ0ZHUl9FWFRFTiB7MDsgMTsgMjsgM30uICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHVpbnQzMl90IHNoaWZ0X2V4dGVuID0gKCh0cmlnZ2VyX3NvdXJjZSAmIEFEQ19DRkdSX0VYVEVOKSA+PgorICAgICAgICAgICAgICAgICAgICAgICAgICAoQURDX1JFR19UUklHX0VYVEVOX0JJVE9GRlNFVF9QT1MgLSAyVUwpKTsKKworICAvKiBTZXQgYml0ZmllbGQgY29ycmVzcG9uZGluZyB0byBBRENfQ0ZHUl9FWFRFTiBhbmQgQURDX0NGR1JfRVhUU0VMICAgICAgICAgKi8KKyAgLyogdG8gbWF0Y2ggd2l0aCB0cmlnZ2VycyBsaXRlcmFscyBkZWZpbml0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHJldHVybiAoKHRyaWdnZXJfc291cmNlICYgKEFEQ19SRUdfVFJJR19TT1VSQ0VfTUFTSyA+PiBzaGlmdF9leHRlbikgJgorICAgICAgICAgICBBRENfQ0ZHUl9FWFRTRUwpIHwKKyAgICAgICAgICAoKEFEQ19SRUdfVFJJR19FREdFX01BU0sgPj4gc2hpZnRfZXh0ZW4pICYgQURDX0NGR1JfRVhURU4pKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgc291cmNlIGludGVybmFsIChTVyBzdGFydCkKKyAqICAgICAgICAgb3IgZXh0ZXJuYWwuCisgKiBAbm90ZSAgIEluIGNhc2Ugb2YgZ3JvdXAgcmVndWxhciB0cmlnZ2VyIHNvdXJjZSBzZXQgdG8gZXh0ZXJuYWwgdHJpZ2dlciwKKyAqICAgICAgICAgdG8gZGV0ZXJtaW5lIHdoaWNoIHBlcmlwaGVyYWwgaXMgc2VsZWN0ZWQgYXMgZXh0ZXJuYWwgdHJpZ2dlciwKKyAqICAgICAgICAgdXNlIGZ1bmN0aW9uIEByZWYgTExfQURDX1JFR19HZXRUcmlnZ2VyU291cmNlKCkuCisgKiBAcm10b2xsIENGR1IgICAgIEVYVEVOICAgICAgICAgIExMX0FEQ19SRUdfSXNUcmlnZ2VyU291cmNlU1dTdGFydAorICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICogQHJldHZhbCBWYWx1ZSAiMCIgaWYgdHJpZ2dlciBzb3VyY2UgZXh0ZXJuYWwgdHJpZ2dlcgorICogICAgICAgICBWYWx1ZSAiMSIgaWYgdHJpZ2dlciBzb3VyY2UgU1cgc3RhcnQuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfQURDX1JFR19Jc1RyaWdnZXJTb3VyY2VTV1N0YXJ0KGNvbnN0IEFEQ19UeXBlRGVmICpBREN4KSB7CisgIHJldHVybiAoKFJFQURfQklUKEFEQ3gtPkNGR1IsIEFEQ19DRkdSX0VYVEVOKSA9PQorICAgICAgICAgICAoTExfQURDX1JFR19UUklHX1NPRlRXQVJFICYgQURDX0NGR1JfRVhURU4pKQorICAgICAgICAgICAgICA/IDFVTAorICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBTZXQgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIHBvbGFyaXR5LgorICogQG5vdGUgICBBcHBsaWNhYmxlIG9ubHkgZm9yIHRyaWdnZXIgc291cmNlIHNldCB0byBleHRlcm5hbCB0cmlnZ2VyLgorICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllcywgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAqICAgICAgICAgQURDIHN0YXRlOgorICogICAgICAgICBBREMgbXVzdCBiZSBkaXNhYmxlZCBvciBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZworICogICAgICAgICBvbiBncm91cCByZWd1bGFyLgorICogQHJtdG9sbCBDRkdSICAgICBFWFRFTiAgICAgICAgICBMTF9BRENfUkVHX1NldFRyaWdnZXJFZGdlCisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcGFyYW0gIEV4dGVybmFsVHJpZ2dlckVkZ2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nCisgKiB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1JJU0lORworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9GQUxMSU5HCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1JJU0lOR0ZBTExJTkcKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfUkVHX1NldFRyaWdnZXJFZGdlKEFEQ19UeXBlRGVmICpBREN4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBFeHRlcm5hbFRyaWdnZXJFZGdlKSB7CisgIE1PRElGWV9SRUcoQURDeC0+Q0ZHUiwgQURDX0NGR1JfRVhURU4sIEV4dGVybmFsVHJpZ2dlckVkZ2UpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBwb2xhcml0eS4KKyAqIEBub3RlICAgQXBwbGljYWJsZSBvbmx5IGZvciB0cmlnZ2VyIHNvdXJjZSBzZXQgdG8gZXh0ZXJuYWwgdHJpZ2dlci4KKyAqIEBybXRvbGwgQ0ZHUiAgICAgRVhURU4gICAgICAgICAgTExfQURDX1JFR19HZXRUcmlnZ2VyRWRnZQorICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9SSVNJTkcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfRkFMTElORworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9SSVNJTkdGQUxMSU5HCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfUkVHX0dldFRyaWdnZXJFZGdlKGNvbnN0IEFEQ19UeXBlRGVmICpBREN4KSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEFEQ3gtPkNGR1IsIEFEQ19DRkdSX0VYVEVOKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBTZXQgQURDIHNhbXBsaW5nIG1vZGUuCisgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gc2V0IHRoZSBBREMgY29udmVyc2lvbiBzYW1wbGluZyBtb2RlCisgKiBAbm90ZSAgIFRoaXMgbW9kZSBhcHBsaWVzIHRvIHJlZ3VsYXIgZ3JvdXAgb25seS4KKyAqIEBub3RlICAgU2V0IHNhbXBsaW5nIG1vZGUgaXMgYXBwbGllZCB0byBhbGwgY29udmVyc2lvbiBvZiByZWd1bGFyIGdyb3VwLgorICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllcywgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAqICAgICAgICAgQURDIHN0YXRlOgorICogICAgICAgICBBREMgbXVzdCBiZSBkaXNhYmxlZCBvciBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZworICogICAgICAgICBvbiBncm91cCByZWd1bGFyLgorICogQHJtdG9sbCBDRkdSMiAgICBCVUxCICAgICAgICAgICBMTF9BRENfUkVHX1NldFNhbXBsaW5nTW9kZVxuCisgKiAgICAgICAgIENGR1IyICAgIFNNUFRSSUcgICAgICAgIExMX0FEQ19SRUdfU2V0U2FtcGxpbmdNb2RlCisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcGFyYW0gIFNhbXBsaW5nTW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TQU1QTElOR19NT0RFX05PUk1BTAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TQU1QTElOR19NT0RFX0JVTEIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0FNUExJTkdfTU9ERV9UUklHR0VSX0NPTlRST0xFRAorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19SRUdfU2V0U2FtcGxpbmdNb2RlKEFEQ19UeXBlRGVmICpBREN4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgU2FtcGxpbmdNb2RlKSB7CisgIE1PRElGWV9SRUcoQURDeC0+Q0ZHUjIsIEFEQ19DRkdSMl9CVUxCIHwgQURDX0NGR1IyX1NNUFRSSUcsIFNhbXBsaW5nTW9kZSk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgdGhlIEFEQyBzYW1wbGluZyBtb2RlCisgKiBAcm10b2xsIENGR1IyICAgIEJVTEIgICAgICAgICAgIExMX0FEQ19SRUdfR2V0U2FtcGxpbmdNb2RlXG4KKyAqICAgICAgICAgQ0ZHUjIgICAgU01QVFJJRyAgICAgICAgTExfQURDX1JFR19HZXRTYW1wbGluZ01vZGUKKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0FNUExJTkdfTU9ERV9OT1JNQUwKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0FNUExJTkdfTU9ERV9CVUxCCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NBTVBMSU5HX01PREVfVFJJR0dFUl9DT05UUk9MRUQKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19SRUdfR2V0U2FtcGxpbmdNb2RlKGNvbnN0IEFEQ19UeXBlRGVmICpBREN4KSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEFEQ3gtPkNGR1IyLCBBRENfQ0ZHUjJfQlVMQiB8IEFEQ19DRkdSMl9TTVBUUklHKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBTZXQgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGxlbmd0aCBhbmQgc2NhbiBkaXJlY3Rpb24uCisgKiBAbm90ZSAgIERlc2NyaXB0aW9uIG9mIEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBmZWF0dXJlczoKKyAqICAgICAgICAgLSBGb3IgZGV2aWNlcyB3aXRoIHNlcXVlbmNlciBmdWxseSBjb25maWd1cmFibGUKKyAqICAgICAgICAgICAoZnVuY3Rpb24gIkxMX0FEQ19SRUdfU2V0U2VxdWVuY2VyUmFua3MoKSIgYXZhaWxhYmxlKToKKyAqICAgICAgICAgICBzZXF1ZW5jZXIgbGVuZ3RoIGFuZCBlYWNoIHJhbmsgYWZmZWN0YXRpb24gdG8gYSBjaGFubmVsCisgKiAgICAgICAgICAgYXJlIGNvbmZpZ3VyYWJsZS4KKyAqICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGNvbmZpZ3VyYXRpb24gb2Y6CisgKiAgICAgICAgICAgLSBTZXF1ZW5jZSBsZW5ndGg6IE51bWJlciBvZiByYW5rcyBpbiB0aGUgc2NhbiBzZXF1ZW5jZS4KKyAqICAgICAgICAgICAtIFNlcXVlbmNlIGRpcmVjdGlvbjogVW5sZXNzIHNwZWNpZmllZCBpbiBwYXJhbWV0ZXJzLCBzZXF1ZW5jZXIKKyAqICAgICAgICAgICAgIHNjYW4gZGlyZWN0aW9uIGlzIGZvcndhcmQgKGZyb20gcmFuayAxIHRvIHJhbmsgbikuCisgKiAgICAgICAgICAgU2VxdWVuY2VyIHJhbmtzIGFyZSBzZWxlY3RlZCB1c2luZworICogICAgICAgICAgIGZ1bmN0aW9uICJMTF9BRENfUkVHX1NldFNlcXVlbmNlclJhbmtzKCkiLgorICogICAgICAgICAtIEZvciBkZXZpY2VzIHdpdGggc2VxdWVuY2VyIG5vdCBmdWxseSBjb25maWd1cmFibGUKKyAqICAgICAgICAgICAoZnVuY3Rpb24gIkxMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ2hhbm5lbHMoKSIgYXZhaWxhYmxlKToKKyAqICAgICAgICAgICBzZXF1ZW5jZXIgbGVuZ3RoIGFuZCBlYWNoIHJhbmsgYWZmZWN0YXRpb24gdG8gYSBjaGFubmVsCisgKiAgICAgICAgICAgYXJlIGRlZmluZWQgYnkgY2hhbm5lbCBudW1iZXIuCisgKiAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBjb25maWd1cmF0aW9uIG9mOgorICogICAgICAgICAgIC0gU2VxdWVuY2UgbGVuZ3RoOiBOdW1iZXIgb2YgcmFua3MgaW4gdGhlIHNjYW4gc2VxdWVuY2UgaXMKKyAqICAgICAgICAgICAgIGRlZmluZWQgYnkgbnVtYmVyIG9mIGNoYW5uZWxzIHNldCBpbiB0aGUgc2VxdWVuY2UsCisgKiAgICAgICAgICAgICByYW5rIG9mIGVhY2ggY2hhbm5lbCBpcyBmaXhlZCBieSBjaGFubmVsIEhXIG51bWJlci4KKyAqICAgICAgICAgICAgIChjaGFubmVsIDAgZml4ZWQgb24gcmFuayAwLCBjaGFubmVsIDEgZml4ZWQgb24gcmFuazEsIC4uLikuCisgKiAgICAgICAgICAgLSBTZXF1ZW5jZSBkaXJlY3Rpb246IFVubGVzcyBzcGVjaWZpZWQgaW4gcGFyYW1ldGVycywgc2VxdWVuY2VyCisgKiAgICAgICAgICAgICBzY2FuIGRpcmVjdGlvbiBpcyBmb3J3YXJkIChmcm9tIGxvd2VzdCBjaGFubmVsIG51bWJlciB0bworICogICAgICAgICAgICAgaGlnaGVzdCBjaGFubmVsIG51bWJlcikuCisgKiAgICAgICAgICAgU2VxdWVuY2VyIHJhbmtzIGFyZSBzZWxlY3RlZCB1c2luZworICogICAgICAgICAgIGZ1bmN0aW9uICJMTF9BRENfUkVHX1NldFNlcXVlbmNlckNoYW5uZWxzKCkiLgorICogQG5vdGUgICBTZXF1ZW5jZXIgZGlzYWJsZWQgaXMgZXF1aXZhbGVudCB0byBzZXF1ZW5jZXIgb2YgMSByYW5rOgorICogICAgICAgICBBREMgY29udmVyc2lvbiBvbiBvbmx5IDEgY2hhbm5lbC4KKyAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcKKyAqICAgICAgICAgb24gZ3JvdXAgcmVndWxhci4KKyAqIEBybXRvbGwgU1FSMSAgICAgTCAgICAgICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJMZW5ndGgKKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEBwYXJhbSAgU2VxdWVuY2VyTmJSYW5rcyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9ESVNBQkxFCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV8yUkFOS1MKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzNSQU5LUworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfNFJBTktTCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV81UkFOS1MKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzZSQU5LUworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfN1JBTktTCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV84UkFOS1MKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzlSQU5LUworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMTBSQU5LUworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMTFSQU5LUworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMTJSQU5LUworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMTNSQU5LUworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMTRSQU5LUworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMTVSQU5LUworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMTZSQU5LUworICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyTGVuZ3RoKEFEQ19UeXBlRGVmICpBREN4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgU2VxdWVuY2VyTmJSYW5rcykgeworICBNT0RJRllfUkVHKEFEQ3gtPlNRUjEsIEFEQ19TUVIxX0wsIFNlcXVlbmNlck5iUmFua3MpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBsZW5ndGggYW5kIHNjYW4gZGlyZWN0aW9uLgorICogQG5vdGUgICBEZXNjcmlwdGlvbiBvZiBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZmVhdHVyZXM6CisgKiAgICAgICAgIC0gRm9yIGRldmljZXMgd2l0aCBzZXF1ZW5jZXIgZnVsbHkgY29uZmlndXJhYmxlCisgKiAgICAgICAgICAgKGZ1bmN0aW9uICJMTF9BRENfUkVHX1NldFNlcXVlbmNlclJhbmtzKCkiIGF2YWlsYWJsZSk6CisgKiAgICAgICAgICAgc2VxdWVuY2VyIGxlbmd0aCBhbmQgZWFjaCByYW5rIGFmZmVjdGF0aW9uIHRvIGEgY2hhbm5lbAorICogICAgICAgICAgIGFyZSBjb25maWd1cmFibGUuCisgKiAgICAgICAgICAgVGhpcyBmdW5jdGlvbiByZXRyaWV2ZXM6CisgKiAgICAgICAgICAgLSBTZXF1ZW5jZSBsZW5ndGg6IE51bWJlciBvZiByYW5rcyBpbiB0aGUgc2NhbiBzZXF1ZW5jZS4KKyAqICAgICAgICAgICAtIFNlcXVlbmNlIGRpcmVjdGlvbjogVW5sZXNzIHNwZWNpZmllZCBpbiBwYXJhbWV0ZXJzLCBzZXF1ZW5jZXIKKyAqICAgICAgICAgICAgIHNjYW4gZGlyZWN0aW9uIGlzIGZvcndhcmQgKGZyb20gcmFuayAxIHRvIHJhbmsgbikuCisgKiAgICAgICAgICAgU2VxdWVuY2VyIHJhbmtzIGFyZSBzZWxlY3RlZCB1c2luZworICogICAgICAgICAgIGZ1bmN0aW9uICJMTF9BRENfUkVHX1NldFNlcXVlbmNlclJhbmtzKCkiLgorICogICAgICAgICAtIEZvciBkZXZpY2VzIHdpdGggc2VxdWVuY2VyIG5vdCBmdWxseSBjb25maWd1cmFibGUKKyAqICAgICAgICAgICAoZnVuY3Rpb24gIkxMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ2hhbm5lbHMoKSIgYXZhaWxhYmxlKToKKyAqICAgICAgICAgICBzZXF1ZW5jZXIgbGVuZ3RoIGFuZCBlYWNoIHJhbmsgYWZmZWN0YXRpb24gdG8gYSBjaGFubmVsCisgKiAgICAgICAgICAgYXJlIGRlZmluZWQgYnkgY2hhbm5lbCBudW1iZXIuCisgKiAgICAgICAgICAgVGhpcyBmdW5jdGlvbiByZXRyaWV2ZXM6CisgKiAgICAgICAgICAgLSBTZXF1ZW5jZSBsZW5ndGg6IE51bWJlciBvZiByYW5rcyBpbiB0aGUgc2NhbiBzZXF1ZW5jZSBpcworICogICAgICAgICAgICAgZGVmaW5lZCBieSBudW1iZXIgb2YgY2hhbm5lbHMgc2V0IGluIHRoZSBzZXF1ZW5jZSwKKyAqICAgICAgICAgICAgIHJhbmsgb2YgZWFjaCBjaGFubmVsIGlzIGZpeGVkIGJ5IGNoYW5uZWwgSFcgbnVtYmVyLgorICogICAgICAgICAgICAgKGNoYW5uZWwgMCBmaXhlZCBvbiByYW5rIDAsIGNoYW5uZWwgMSBmaXhlZCBvbiByYW5rMSwgLi4uKS4KKyAqICAgICAgICAgICAtIFNlcXVlbmNlIGRpcmVjdGlvbjogVW5sZXNzIHNwZWNpZmllZCBpbiBwYXJhbWV0ZXJzLCBzZXF1ZW5jZXIKKyAqICAgICAgICAgICAgIHNjYW4gZGlyZWN0aW9uIGlzIGZvcndhcmQgKGZyb20gbG93ZXN0IGNoYW5uZWwgbnVtYmVyIHRvCisgKiAgICAgICAgICAgICBoaWdoZXN0IGNoYW5uZWwgbnVtYmVyKS4KKyAqICAgICAgICAgICBTZXF1ZW5jZXIgcmFua3MgYXJlIHNlbGVjdGVkIHVzaW5nCisgKiAgICAgICAgICAgZnVuY3Rpb24gIkxMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ2hhbm5lbHMoKSIuCisgKiBAbm90ZSAgIFNlcXVlbmNlciBkaXNhYmxlZCBpcyBlcXVpdmFsZW50IHRvIHNlcXVlbmNlciBvZiAxIHJhbms6CisgKiAgICAgICAgIEFEQyBjb252ZXJzaW9uIG9uIG9ubHkgMSBjaGFubmVsLgorICogQHJtdG9sbCBTUVIxICAgICBMICAgICAgICAgICAgICBMTF9BRENfUkVHX0dldFNlcXVlbmNlckxlbmd0aAorICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9ESVNBQkxFCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV8yUkFOS1MKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzNSQU5LUworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfNFJBTktTCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV81UkFOS1MKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzZSQU5LUworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfN1JBTktTCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV84UkFOS1MKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzlSQU5LUworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMTBSQU5LUworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMTFSQU5LUworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMTJSQU5LUworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMTNSQU5LUworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMTRSQU5LUworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMTVSQU5LUworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMTZSQU5LUworICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX0FEQ19SRUdfR2V0U2VxdWVuY2VyTGVuZ3RoKGNvbnN0IEFEQ19UeXBlRGVmICpBREN4KSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEFEQ3gtPlNRUjEsIEFEQ19TUVIxX0wpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFNldCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZGlzY29udGludW91cyBtb2RlOgorICogICAgICAgICBzZXF1ZW5jZSBzdWJkaXZpZGVkIGFuZCBzY2FuIGNvbnZlcnNpb25zIGludGVycnVwdGVkIGV2ZXJ5IHNlbGVjdGVkCisgKiAgICAgICAgIG51bWJlciBvZiByYW5rcy4KKyAqIEBub3RlICAgSXQgaXMgbm90IHBvc3NpYmxlIHRvIGVuYWJsZSBib3RoIEFEQyBncm91cCByZWd1bGFyCisgKiAgICAgICAgIGNvbnRpbnVvdXMgbW9kZSBhbmQgc2VxdWVuY2VyIGRpc2NvbnRpbnVvdXMgbW9kZS4KKyAqIEBub3RlICAgSXQgaXMgbm90IHBvc3NpYmxlIHRvIGVuYWJsZSBib3RoIEFEQyBhdXRvLWluamVjdGVkIG1vZGUKKyAqICAgICAgICAgYW5kIEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBkaXNjb250aW51b3VzIG1vZGUuCisgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICogICAgICAgICBBREMgc3RhdGU6CisgKiAgICAgICAgIEFEQyBtdXN0IGJlIGRpc2FibGVkIG9yIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nCisgKiAgICAgICAgIG9uIGdyb3VwIHJlZ3VsYXIuCisgKiBAcm10b2xsIENGR1IgICAgIERJU0NFTiAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyRGlzY29udFxuCisgKiAgICAgICAgIENGR1IgICAgIERJU0NOVU0gICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyRGlzY29udAorICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICogQHBhcmFtICBTZXFEaXNjb250IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9ESVNDT05UX0RJU0FCTEUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfMVJBTksKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfMlJBTktTCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzNSQU5LUworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfRElTQ09OVF80UkFOS1MKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfNVJBTktTCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzZSQU5LUworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfRElTQ09OVF83UkFOS1MKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfOFJBTktTCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJEaXNjb250KEFEQ19UeXBlRGVmICpBREN4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFNlcURpc2NvbnQpIHsKKyAgTU9ESUZZX1JFRyhBREN4LT5DRkdSLCBBRENfQ0ZHUl9ESVNDRU4gfCBBRENfQ0ZHUl9ESVNDTlVNLCBTZXFEaXNjb250KTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZGlzY29udGludW91cyBtb2RlOgorICogICAgICAgICBzZXF1ZW5jZSBzdWJkaXZpZGVkIGFuZCBzY2FuIGNvbnZlcnNpb25zIGludGVycnVwdGVkIGV2ZXJ5IHNlbGVjdGVkCisgKiAgICAgICAgIG51bWJlciBvZiByYW5rcy4KKyAqIEBybXRvbGwgQ0ZHUiAgICAgRElTQ0VOICAgICAgICAgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJEaXNjb250XG4KKyAqICAgICAgICAgQ0ZHUiAgICAgRElTQ05VTSAgICAgICAgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJEaXNjb250CisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9ESVNDT05UX0RJU0FCTEUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfMVJBTksKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfMlJBTktTCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzNSQU5LUworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfRElTQ09OVF80UkFOS1MKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfNVJBTktTCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzZSQU5LUworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfRElTQ09OVF83UkFOS1MKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfOFJBTktTCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfQURDX1JFR19HZXRTZXF1ZW5jZXJEaXNjb250KGNvbnN0IEFEQ19UeXBlRGVmICpBREN4KSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEFEQ3gtPkNGR1IsIEFEQ19DRkdSX0RJU0NFTiB8IEFEQ19DRkdSX0RJU0NOVU0pKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFNldCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZTogY2hhbm5lbCBvbiB0aGUgc2VsZWN0ZWQKKyAqICAgICAgICAgc2NhbiBzZXF1ZW5jZSByYW5rLgorICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGNvbmZpZ3VyYXRpb24gb2Y6CisgKiAgICAgICAgIC0gQ2hhbm5lbHMgb3JkZXJpbmcgaW50byBlYWNoIHJhbmsgb2Ygc2NhbiBzZXF1ZW5jZToKKyAqICAgICAgICAgICB3aGF0ZXZlciBjaGFubmVsIGNhbiBiZSBwbGFjZWQgaW50byB3aGF0ZXZlciByYW5rLgorICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllcywgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGlzCisgKiAgICAgICAgIGZ1bGx5IGNvbmZpZ3VyYWJsZTogc2VxdWVuY2VyIGxlbmd0aCBhbmQgZWFjaCByYW5rCisgKiAgICAgICAgIGFmZmVjdGF0aW9uIHRvIGEgY2hhbm5lbCBhcmUgY29uZmlndXJhYmxlLgorICogICAgICAgICBSZWZlciB0byBkZXNjcmlwdGlvbiBvZiBmdW5jdGlvbiBAcmVmCisgKiBMTF9BRENfUkVHX1NldFNlcXVlbmNlckxlbmd0aCgpLgorICogQG5vdGUgICBEZXBlbmRpbmcgb24gZGV2aWNlcyBhbmQgcGFja2FnZXMsIHNvbWUgY2hhbm5lbHMgbWF5IG5vdCBiZQorICogYXZhaWxhYmxlLiBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBjaGFubmVscyBhdmFpbGFiaWxpdHkuCisgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCB0byBtZWFzdXJlIGludGVybmFsIGNoYW5uZWxzIChWcmVmSW50LAorICogICAgICAgICBUZW1wU2Vuc29yLCAuLi4pLCBtZWFzdXJlbWVudCBwYXRocyB0byBpbnRlcm5hbCBjaGFubmVscyBtdXN0IGJlCisgKiAgICAgICAgIGVuYWJsZWQgc2VwYXJhdGVseS4KKyAqICAgICAgICAgVGhpcyBjYW4gYmUgZG9uZSB1c2luZyBmdW5jdGlvbiBAcmVmCisgKiBMTF9BRENfU2V0Q29tbW9uUGF0aEludGVybmFsQ2goKS4KKyAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcKKyAqICAgICAgICAgb24gZ3JvdXAgcmVndWxhci4KKyAqIEBybXRvbGwgU1FSMSAgICAgU1ExICAgICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJSYW5rc1xuCisgKiAgICAgICAgIFNRUjEgICAgIFNRMiAgICAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyUmFua3NcbgorICogICAgICAgICBTUVIxICAgICBTUTMgICAgICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlclJhbmtzXG4KKyAqICAgICAgICAgU1FSMSAgICAgU1E0ICAgICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJSYW5rc1xuCisgKiAgICAgICAgIFNRUjIgICAgIFNRNSAgICAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyUmFua3NcbgorICogICAgICAgICBTUVIyICAgICBTUTYgICAgICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlclJhbmtzXG4KKyAqICAgICAgICAgU1FSMiAgICAgU1E3ICAgICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJSYW5rc1xuCisgKiAgICAgICAgIFNRUjIgICAgIFNROCAgICAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyUmFua3NcbgorICogICAgICAgICBTUVIyICAgICBTUTkgICAgICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlclJhbmtzXG4KKyAqICAgICAgICAgU1FSMyAgICAgU1ExMCAgICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJSYW5rc1xuCisgKiAgICAgICAgIFNRUjMgICAgIFNRMTEgICAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyUmFua3NcbgorICogICAgICAgICBTUVIzICAgICBTUTEyICAgICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlclJhbmtzXG4KKyAqICAgICAgICAgU1FSMyAgICAgU1ExMyAgICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJSYW5rc1xuCisgKiAgICAgICAgIFNRUjMgICAgIFNRMTQgICAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyUmFua3NcbgorICogICAgICAgICBTUVI0ICAgICBTUTE1ICAgICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlclJhbmtzXG4KKyAqICAgICAgICAgU1FSNCAgICAgU1ExNiAgICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJSYW5rcworICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICogQHBhcmFtICBSYW5rIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfMQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfUkFOS18zCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfNAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfUkFOS182CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfNworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfUkFOS185CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfMTAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfUkFOS18xMQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzEyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfMTMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfUkFOS18xNAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzE1CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfMTYKKyAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMSAgICAgICAgICAgICAgICAgKDgpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8yICAgICAgICAgICAgICAgICAoOCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzMgICAgICAgICAgICAgICAgICg4KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNCAgICAgICAgICAgICAgICAgKDgpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF81ICAgICAgICAgICAgICAgICAoOCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE2CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQgICAgICAgICAgICg3KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUl9BREMxICAgKDEpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SX0FEQzUgICAoNSkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZCQVQgICAgICAgICAgICAgICg2KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QMSAgICAgICAgICAgKDEpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAyICAgICAgICAgICAoMikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDNfQURDMiAgICAgICgyKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QM19BREMzICAgICAgKDMpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVA0ICAgICAgICAgICAoNSkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDUgICAgICAgICAgICg1KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QNiAgICAgICAgICAgKDQpCisgKgorICogICAgICAgICAoMSkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMS5cbgorICogICAgICAgICAoMikgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMi5cbgorICogICAgICAgICAoMykgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMy5cbgorICogICAgICAgICAoNCkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDNC5cbgorICogICAgICAgICAoNSkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDNS5cbgorICogICAgICAgICAoNikgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZXM6IEFEQzEsCisgKiBBREMzLCBBREM1LlxuICg3KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlczoKKyAqIEFEQzEsIEFEQzMsIEFEQzQsIEFEQzUuXG4gT24gdGhpcyBTVE0zMiBzZXJpZXMsIGFsbCBBREN4IGFyZSBub3QgYXZhaWxhYmxlIG9uCisgKiBhbGwgZGV2aWNlcy4gUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgbW9yZSBkZXRhaWxzLiAoOCkgT24gU1RNMzJHNCwgZmFzdAorICogY2hhbm5lbCBhbGxvd3M6IDIuNSAoc2FtcGxpbmcpICsgMTIuNSAoY29udmVyc2lvbikgPSAxNSBBREMgY2xvY2sgY3ljbGVzCisgKiAoZkFEQykgdG8gY29udmVydCBpbiAxMi1iaXQgcmVzb2x1dGlvbi4gT3RoZXIgY2hhbm5lbHMgYXJlIHNsb3cgY2hhbm5lbHMKKyAqIGFsbG93czogNi41IChzYW1wbGluZykgKyAxMi41IChjb252ZXJzaW9uKSA9IDE5IEFEQyBjbG9jayBjeWNsZXMgKGZBREMpIHRvCisgKiBjb252ZXJ0IGluIDEyLWJpdCByZXNvbHV0aW9uLlxuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJSYW5rcyhBRENfVHlwZURlZiAqQURDeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUmFuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCkgeworICAvKiBTZXQgYml0cyB3aXRoIGNvbnRlbnQgb2YgcGFyYW1ldGVyICJDaGFubmVsIiB3aXRoIGJpdHMgcG9zaXRpb24gICAgICAgICAgKi8KKyAgLyogaW4gcmVnaXN0ZXIgYW5kIHJlZ2lzdGVyIHBvc2l0aW9uIGRlcGVuZGluZyBvbiBwYXJhbWV0ZXIgIlJhbmsiLiAgICAgICAgICovCisgIC8qIFBhcmFtZXRlcnMgIlJhbmsiIGFuZCAiQ2hhbm5lbCIgYXJlIHVzZWQgd2l0aCBtYXNrcyBiZWNhdXNlIGNvbnRhaW5pbmcgICAqLworICAvKiBvdGhlciBiaXRzIHJlc2VydmVkIGZvciBvdGhlciBwdXJwb3NlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgX19JTyB1aW50MzJfdCAqcHJlZyA9IF9fQURDX1BUUl9SRUdfT0ZGU0VUKAorICAgICAgQURDeC0+U1FSMSwKKyAgICAgICgoUmFuayAmIEFEQ19SRUdfU1FSWF9SRUdPRkZTRVRfTUFTSykgPj4gQURDX1NRUlhfUkVHT0ZGU0VUX1BPUykpOworCisgIE1PRElGWV9SRUcoCisgICAgICAqcHJlZywKKyAgICAgIEFEQ19DSEFOTkVMX0lEX05VTUJFUl9NQVNLX1BPU0JJVDAgPDwgKFJhbmsgJiBBRENfUkVHX1JBTktfSURfU1FSWF9NQVNLKSwKKyAgICAgICgoQ2hhbm5lbCAmIEFEQ19DSEFOTkVMX0lEX05VTUJFUl9NQVNLKSA+PgorICAgICAgIEFEQ19DSEFOTkVMX0lEX05VTUJFUl9CSVRPRkZTRVRfUE9TKQorICAgICAgICAgIDw8IChSYW5rICYgQURDX1JFR19SQU5LX0lEX1NRUlhfTUFTSykpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlOiBjaGFubmVsIG9uIHRoZSBzZWxlY3RlZAorICogICAgICAgICBzY2FuIHNlcXVlbmNlIHJhbmsuCisgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgaXMKKyAqICAgICAgICAgZnVsbHkgY29uZmlndXJhYmxlOiBzZXF1ZW5jZXIgbGVuZ3RoIGFuZCBlYWNoIHJhbmsKKyAqICAgICAgICAgYWZmZWN0YXRpb24gdG8gYSBjaGFubmVsIGFyZSBjb25maWd1cmFibGUuCisgKiAgICAgICAgIFJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIGZ1bmN0aW9uIEByZWYKKyAqIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyTGVuZ3RoKCkuCisgKiBAbm90ZSAgIERlcGVuZGluZyBvbiBkZXZpY2VzIGFuZCBwYWNrYWdlcywgc29tZSBjaGFubmVscyBtYXkgbm90IGJlCisgKiBhdmFpbGFibGUuIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIGNoYW5uZWxzIGF2YWlsYWJpbGl0eS4KKyAqIEBub3RlICAgVXNhZ2Ugb2YgdGhlIHJldHVybmVkIGNoYW5uZWwgbnVtYmVyOgorICogICAgICAgICAtIFRvIHJlaW5qZWN0IHRoaXMgY2hhbm5lbCBpbnRvIGFub3RoZXIgZnVuY3Rpb24gTExfQURDX3h4eDoKKyAqICAgICAgICAgICB0aGUgcmV0dXJuZWQgY2hhbm5lbCBudW1iZXIgaXMgb25seSBwYXJ0bHkgZm9ybWF0dGVkIG9uIGRlZmluaXRpb24KKyAqICAgICAgICAgICBvZiBsaXRlcmFscyBMTF9BRENfQ0hBTk5FTF94LiBUaGVyZWZvcmUsIGl0IGhhcyB0byBiZSBjb21wYXJlZAorICogICAgICAgICAgIHdpdGggcGFydHMgb2YgbGl0ZXJhbHMgTExfQURDX0NIQU5ORUxfeCBvciB1c2luZworICogICAgICAgICAgIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0NIQU5ORUxfVE9fREVDSU1BTF9OQigpLgorICogICAgICAgICAgIFRoZW4gdGhlIHNlbGVjdGVkIGxpdGVyYWwgTExfQURDX0NIQU5ORUxfeCBjYW4gYmUgdXNlZAorICogICAgICAgICAgIGFzIHBhcmFtZXRlciBmb3IgYW5vdGhlciBmdW5jdGlvbi4KKyAqICAgICAgICAgLSBUbyBnZXQgdGhlIGNoYW5uZWwgbnVtYmVyIGluIGRlY2ltYWwgZm9ybWF0OgorICogICAgICAgICAgIHByb2Nlc3MgdGhlIHJldHVybmVkIHZhbHVlIHdpdGggdGhlIGhlbHBlciBtYWNybworICogICAgICAgICAgIEByZWYgX19MTF9BRENfQ0hBTk5FTF9UT19ERUNJTUFMX05CKCkuCisgKiBAcm10b2xsIFNRUjEgICAgIFNRMSAgICAgICAgICAgIExMX0FEQ19SRUdfR2V0U2VxdWVuY2VyUmFua3NcbgorICogICAgICAgICBTUVIxICAgICBTUTIgICAgICAgICAgICBMTF9BRENfUkVHX0dldFNlcXVlbmNlclJhbmtzXG4KKyAqICAgICAgICAgU1FSMSAgICAgU1EzICAgICAgICAgICAgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJSYW5rc1xuCisgKiAgICAgICAgIFNRUjEgICAgIFNRNCAgICAgICAgICAgIExMX0FEQ19SRUdfR2V0U2VxdWVuY2VyUmFua3NcbgorICogICAgICAgICBTUVIyICAgICBTUTUgICAgICAgICAgICBMTF9BRENfUkVHX0dldFNlcXVlbmNlclJhbmtzXG4KKyAqICAgICAgICAgU1FSMiAgICAgU1E2ICAgICAgICAgICAgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJSYW5rc1xuCisgKiAgICAgICAgIFNRUjIgICAgIFNRNyAgICAgICAgICAgIExMX0FEQ19SRUdfR2V0U2VxdWVuY2VyUmFua3NcbgorICogICAgICAgICBTUVIyICAgICBTUTggICAgICAgICAgICBMTF9BRENfUkVHX0dldFNlcXVlbmNlclJhbmtzXG4KKyAqICAgICAgICAgU1FSMiAgICAgU1E5ICAgICAgICAgICAgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJSYW5rc1xuCisgKiAgICAgICAgIFNRUjMgICAgIFNRMTAgICAgICAgICAgIExMX0FEQ19SRUdfR2V0U2VxdWVuY2VyUmFua3NcbgorICogICAgICAgICBTUVIzICAgICBTUTExICAgICAgICAgICBMTF9BRENfUkVHX0dldFNlcXVlbmNlclJhbmtzXG4KKyAqICAgICAgICAgU1FSMyAgICAgU1ExMiAgICAgICAgICAgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJSYW5rc1xuCisgKiAgICAgICAgIFNRUjMgICAgIFNRMTMgICAgICAgICAgIExMX0FEQ19SRUdfR2V0U2VxdWVuY2VyUmFua3NcbgorICogICAgICAgICBTUVIzICAgICBTUTE0ICAgICAgICAgICBMTF9BRENfUkVHX0dldFNlcXVlbmNlclJhbmtzXG4KKyAqICAgICAgICAgU1FSNCAgICAgU1ExNSAgICAgICAgICAgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJSYW5rc1xuCisgKiAgICAgICAgIFNRUjQgICAgIFNRMTYgICAgICAgICAgIExMX0FEQ19SRUdfR2V0U2VxdWVuY2VyUmFua3MKKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEBwYXJhbSAgUmFuayBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfUkFOS18yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfMworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfUkFOS181CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfNgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfUkFOS184CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfOQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzEwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfMTEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfUkFOS18xMgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzEzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfMTQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfUkFOS18xNQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzE2CisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8wCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xICAgICAgICAgICAgICAgICAoOCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzIgICAgICAgICAgICAgICAgICg4KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMyAgICAgICAgICAgICAgICAgKDgpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF80ICAgICAgICAgICAgICAgICAoOCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzUgICAgICAgICAgICAgICAgICg4KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzExCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE3CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xOAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVlJFRklOVCAgICAgICAgICAgKDcpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SX0FEQzEgICAoMSkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1JfQURDNSAgICg1KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVkJBVCAgICAgICAgICAgICAgKDYpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAxICAgICAgICAgICAoMSkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDIgICAgICAgICAgICgyKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QM19BREMyICAgICAgKDIpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAzX0FEQzMgICAgICAoMykKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDQgICAgICAgICAgICg1KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QNSAgICAgICAgICAgKDUpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVA2ICAgICAgICAgICAoNCkKKyAqCisgKiAgICAgICAgICgxKSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMxLlxuCisgKiAgICAgICAgICgyKSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMyLlxuCisgKiAgICAgICAgICgzKSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMzLlxuCisgKiAgICAgICAgICg0KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREM0LlxuCisgKiAgICAgICAgICg1KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREM1LlxuCisgKiAgICAgICAgICg2KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlczogQURDMSwKKyAqIEFEQzMsIEFEQzUuXG4gKDcpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2VzOgorICogQURDMSwgQURDMywgQURDNCwgQURDNS5cbiBPbiB0aGlzIFNUTTMyIHNlcmllcywgYWxsIEFEQ3ggYXJlIG5vdCBhdmFpbGFibGUgb24KKyAqIGFsbCBkZXZpY2VzLiBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBtb3JlIGRldGFpbHMuICg4KSBPbiBTVE0zMkc0LCBmYXN0CisgKiBjaGFubmVsIGFsbG93czogMi41IChzYW1wbGluZykgKyAxMi41IChjb252ZXJzaW9uKSA9IDE1IEFEQyBjbG9jayBjeWNsZXMKKyAqIChmQURDKSB0byBjb252ZXJ0IGluIDEyLWJpdCByZXNvbHV0aW9uLiBPdGhlciBjaGFubmVscyBhcmUgc2xvdyBjaGFubmVscworICogYWxsb3dzOiA2LjUgKHNhbXBsaW5nKSArIDEyLjUgKGNvbnZlcnNpb24pID0gMTkgQURDIGNsb2NrIGN5Y2xlcyAoZkFEQykgdG8KKyAqIGNvbnZlcnQgaW4gMTItYml0IHJlc29sdXRpb24uXG4gKDEsIDIsIDMsIDQsIDUsIDcpIEZvciBBREMgY2hhbm5lbCByZWFkIGJhY2sKKyAqIGZyb20gQURDIHJlZ2lzdGVyLCBjb21wYXJpc29uIHdpdGggaW50ZXJuYWwgY2hhbm5lbCBwYXJhbWV0ZXIgdG8gYmUgZG9uZQorICogICAgICAgICAgICAgICAgICAgICAgdXNpbmcgaGVscGVyIG1hY3JvIEByZWYKKyAqIF9fTExfQURDX0NIQU5ORUxfSU5URVJOQUxfVE9fRVhURVJOQUwoKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19SRUdfR2V0U2VxdWVuY2VyUmFua3MoY29uc3QgQURDX1R5cGVEZWYgKkFEQ3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBSYW5rKSB7CisgIGNvbnN0IF9fSU8gdWludDMyX3QgKnByZWcgPSBfX0FEQ19QVFJfUkVHX09GRlNFVCgKKyAgICAgIEFEQ3gtPlNRUjEsCisgICAgICAoKFJhbmsgJiBBRENfUkVHX1NRUlhfUkVHT0ZGU0VUX01BU0spID4+IEFEQ19TUVJYX1JFR09GRlNFVF9QT1MpKTsKKworICByZXR1cm4gKAorICAgICAgdWludDMyX3QpKChSRUFEX0JJVCgqcHJlZywgQURDX0NIQU5ORUxfSURfTlVNQkVSX01BU0tfUE9TQklUMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IChSYW5rICYgQURDX1JFR19SQU5LX0lEX1NRUlhfTUFTSykpID4+CisgICAgICAgICAgICAgICAgIChSYW5rICYgQURDX1JFR19SQU5LX0lEX1NRUlhfTUFTSykpCisgICAgICAgICAgICAgICAgPDwgQURDX0NIQU5ORUxfSURfTlVNQkVSX0JJVE9GRlNFVF9QT1MpOworfQorCisvKioKKyAqIEBicmllZiAgU2V0IEFEQyBjb250aW51b3VzIGNvbnZlcnNpb24gbW9kZSBvbiBBREMgZ3JvdXAgcmVndWxhci4KKyAqIEBub3RlICAgRGVzY3JpcHRpb24gb2YgQURDIGNvbnRpbnVvdXMgY29udmVyc2lvbiBtb2RlOgorICogICAgICAgICAtIHNpbmdsZSBtb2RlOiBvbmUgY29udmVyc2lvbiBwZXIgdHJpZ2dlcgorICogICAgICAgICAtIGNvbnRpbnVvdXMgbW9kZTogYWZ0ZXIgdGhlIGZpcnN0IHRyaWdnZXIsIGZvbGxvd2luZworICogICAgICAgICAgIGNvbnZlcnNpb25zIGxhdW5jaGVkIHN1Y2Nlc3NpdmVseSBhdXRvbWF0aWNhbGx5LgorICogQG5vdGUgICBJdCBpcyBub3QgcG9zc2libGUgdG8gZW5hYmxlIGJvdGggQURDIGdyb3VwIHJlZ3VsYXIKKyAqICAgICAgICAgY29udGludW91cyBtb2RlIGFuZCBzZXF1ZW5jZXIgZGlzY29udGludW91cyBtb2RlLgorICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllcywgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAqICAgICAgICAgQURDIHN0YXRlOgorICogICAgICAgICBBREMgbXVzdCBiZSBkaXNhYmxlZCBvciBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZworICogICAgICAgICBvbiBncm91cCByZWd1bGFyLgorICogQHJtdG9sbCBDRkdSICAgICBDT05UICAgICAgICAgICBMTF9BRENfUkVHX1NldENvbnRpbnVvdXNNb2RlCisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcGFyYW0gIENvbnRpbnVvdXMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfQ09OVl9TSU5HTEUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfQ09OVl9DT05USU5VT1VTCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1JFR19TZXRDb250aW51b3VzTW9kZShBRENfVHlwZURlZiAqQURDeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ29udGludW91cykgeworICBNT0RJRllfUkVHKEFEQ3gtPkNGR1IsIEFEQ19DRkdSX0NPTlQsIENvbnRpbnVvdXMpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IEFEQyBjb250aW51b3VzIGNvbnZlcnNpb24gbW9kZSBvbiBBREMgZ3JvdXAgcmVndWxhci4KKyAqIEBub3RlICAgRGVzY3JpcHRpb24gb2YgQURDIGNvbnRpbnVvdXMgY29udmVyc2lvbiBtb2RlOgorICogICAgICAgICAtIHNpbmdsZSBtb2RlOiBvbmUgY29udmVyc2lvbiBwZXIgdHJpZ2dlcgorICogICAgICAgICAtIGNvbnRpbnVvdXMgbW9kZTogYWZ0ZXIgdGhlIGZpcnN0IHRyaWdnZXIsIGZvbGxvd2luZworICogICAgICAgICAgIGNvbnZlcnNpb25zIGxhdW5jaGVkIHN1Y2Nlc3NpdmVseSBhdXRvbWF0aWNhbGx5LgorICogQHJtdG9sbCBDRkdSICAgICBDT05UICAgICAgICAgICBMTF9BRENfUkVHX0dldENvbnRpbnVvdXNNb2RlCisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX0NPTlZfU0lOR0xFCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX0NPTlZfQ09OVElOVU9VUworICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX1JFR19HZXRDb250aW51b3VzTW9kZShjb25zdCBBRENfVHlwZURlZiAqQURDeCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChBREN4LT5DRkdSLCBBRENfQ0ZHUl9DT05UKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBTZXQgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBkYXRhIHRyYW5zZmVyOiBubyB0cmFuc2ZlciBvcgorICogICAgICAgICB0cmFuc2ZlciBieSBETUEsIGFuZCBETUEgcmVxdWVzdHMgbW9kZS4KKyAqIEBub3RlICAgSWYgdHJhbnNmZXIgYnkgRE1BIHNlbGVjdGVkLCBzcGVjaWZpZXMgdGhlIERNQSByZXF1ZXN0cworICogICAgICAgICBtb2RlOgorICogICAgICAgICAtIExpbWl0ZWQgbW9kZSAoT25lIHNob3QgbW9kZSk6IERNQSB0cmFuc2ZlciByZXF1ZXN0cyBhcmUgc3RvcHBlZAorICogICAgICAgICAgIHdoZW4gbnVtYmVyIG9mIERNQSBkYXRhIHRyYW5zZmVycyAobnVtYmVyIG9mCisgKiAgICAgICAgICAgQURDIGNvbnZlcnNpb25zKSBpcyByZWFjaGVkLgorICogICAgICAgICAgIFRoaXMgQURDIG1vZGUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoIERNQSBtb2RlIG5vbi1jaXJjdWxhci4KKyAqICAgICAgICAgLSBVbmxpbWl0ZWQgbW9kZTogRE1BIHRyYW5zZmVyIHJlcXVlc3RzIGFyZSB1bmxpbWl0ZWQsCisgKiAgICAgICAgICAgd2hhdGV2ZXIgbnVtYmVyIG9mIERNQSBkYXRhIHRyYW5zZmVycyAobnVtYmVyIG9mCisgKiAgICAgICAgICAgQURDIGNvbnZlcnNpb25zKS4KKyAqICAgICAgICAgICBUaGlzIEFEQyBtb2RlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgd2l0aCBETUEgbW9kZSBjaXJjdWxhci4KKyAqIEBub3RlICAgSWYgQURDIERNQSByZXF1ZXN0cyBtb2RlIGlzIHNldCB0byB1bmxpbWl0ZWQgYW5kIERNQSBpcyBzZXQgdG8KKyAqICAgICAgICAgbW9kZSBub24tY2lyY3VsYXI6CisgKiAgICAgICAgIHdoZW4gRE1BIHRyYW5zZmVycyBzaXplIHdpbGwgYmUgcmVhY2hlZCwgRE1BIHdpbGwgc3RvcCB0cmFuc2ZlcnMgb2YKKyAqICAgICAgICAgQURDIGNvbnZlcnNpb25zIGRhdGEgQURDIHdpbGwgcmFpc2UgYW4gb3ZlcnJ1biBlcnJvcgorICogICAgICAgIChvdmVycnVuIGZsYWcgYW5kIGludGVycnVwdGlvbiBpZiBlbmFibGVkKS4KKyAqIEBub3RlICAgRm9yIGRldmljZXMgd2l0aCBzZXZlcmFsIEFEQyBpbnN0YW5jZXM6IEFEQyBtdWx0aW1vZGUgRE1BCisgKiAgICAgICAgIHNldHRpbmdzIGFyZSBhdmFpbGFibGUgdXNpbmcgZnVuY3Rpb24gQHJlZgorICogTExfQURDX1NldE11bHRpRE1BVHJhbnNmZXIoKS4KKyAqIEBub3RlICAgVG8gY29uZmlndXJlIERNQSBzb3VyY2UgYWRkcmVzcyAocGVyaXBoZXJhbCBhZGRyZXNzKSwKKyAqICAgICAgICAgdXNlIGZ1bmN0aW9uIEByZWYgTExfQURDX0RNQV9HZXRSZWdBZGRyKCkuCisgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICogICAgICAgICBBREMgc3RhdGU6CisgKiAgICAgICAgIEFEQyBtdXN0IGJlIGRpc2FibGVkIG9yIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nCisgKiAgICAgICAgIG9uIGVpdGhlciBncm91cHMgcmVndWxhciBvciBpbmplY3RlZC4KKyAqIEBybXRvbGwgQ0ZHUiAgICAgRE1BRU4gICAgICAgICAgTExfQURDX1JFR19TZXRETUFUcmFuc2ZlclxuCisgKiAgICAgICAgIENGR1IgICAgIERNQUNGRyAgICAgICAgIExMX0FEQ19SRUdfU2V0RE1BVHJhbnNmZXIKKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEBwYXJhbSAgRE1BVHJhbnNmZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfRE1BX1RSQU5TRkVSX05PTkUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfRE1BX1RSQU5TRkVSX0xJTUlURUQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfRE1BX1RSQU5TRkVSX1VOTElNSVRFRAorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19SRUdfU2V0RE1BVHJhbnNmZXIoQURDX1R5cGVEZWYgKkFEQ3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IERNQVRyYW5zZmVyKSB7CisgIE1PRElGWV9SRUcoQURDeC0+Q0ZHUiwgQURDX0NGR1JfRE1BRU4gfCBBRENfQ0ZHUl9ETUFDRkcsIERNQVRyYW5zZmVyKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIGRhdGEgdHJhbnNmZXI6IG5vIHRyYW5zZmVyIG9yCisgKiAgICAgICAgIHRyYW5zZmVyIGJ5IERNQSwgYW5kIERNQSByZXF1ZXN0cyBtb2RlLgorICogQG5vdGUgICBJZiB0cmFuc2ZlciBieSBETUEgc2VsZWN0ZWQsIHNwZWNpZmllcyB0aGUgRE1BIHJlcXVlc3RzCisgKiAgICAgICAgIG1vZGU6CisgKiAgICAgICAgIC0gTGltaXRlZCBtb2RlIChPbmUgc2hvdCBtb2RlKTogRE1BIHRyYW5zZmVyIHJlcXVlc3RzIGFyZSBzdG9wcGVkCisgKiAgICAgICAgICAgd2hlbiBudW1iZXIgb2YgRE1BIGRhdGEgdHJhbnNmZXJzIChudW1iZXIgb2YKKyAqICAgICAgICAgICBBREMgY29udmVyc2lvbnMpIGlzIHJlYWNoZWQuCisgKiAgICAgICAgICAgVGhpcyBBREMgbW9kZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHdpdGggRE1BIG1vZGUgbm9uLWNpcmN1bGFyLgorICogICAgICAgICAtIFVubGltaXRlZCBtb2RlOiBETUEgdHJhbnNmZXIgcmVxdWVzdHMgYXJlIHVubGltaXRlZCwKKyAqICAgICAgICAgICB3aGF0ZXZlciBudW1iZXIgb2YgRE1BIGRhdGEgdHJhbnNmZXJzIChudW1iZXIgb2YKKyAqICAgICAgICAgICBBREMgY29udmVyc2lvbnMpLgorICogICAgICAgICAgIFRoaXMgQURDIG1vZGUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoIERNQSBtb2RlIGNpcmN1bGFyLgorICogQG5vdGUgICBJZiBBREMgRE1BIHJlcXVlc3RzIG1vZGUgaXMgc2V0IHRvIHVubGltaXRlZCBhbmQgRE1BIGlzIHNldCB0bworICogICAgICAgICBtb2RlIG5vbi1jaXJjdWxhcjoKKyAqICAgICAgICAgd2hlbiBETUEgdHJhbnNmZXJzIHNpemUgd2lsbCBiZSByZWFjaGVkLCBETUEgd2lsbCBzdG9wIHRyYW5zZmVycyBvZgorICogICAgICAgICBBREMgY29udmVyc2lvbnMgZGF0YSBBREMgd2lsbCByYWlzZSBhbiBvdmVycnVuIGVycm9yCisgKiAgICAgICAgIChvdmVycnVuIGZsYWcgYW5kIGludGVycnVwdGlvbiBpZiBlbmFibGVkKS4KKyAqIEBub3RlICAgRm9yIGRldmljZXMgd2l0aCBzZXZlcmFsIEFEQyBpbnN0YW5jZXM6IEFEQyBtdWx0aW1vZGUgRE1BCisgKiAgICAgICAgIHNldHRpbmdzIGFyZSBhdmFpbGFibGUgdXNpbmcgZnVuY3Rpb24gQHJlZgorICogTExfQURDX0dldE11bHRpRE1BVHJhbnNmZXIoKS4KKyAqIEBub3RlICAgVG8gY29uZmlndXJlIERNQSBzb3VyY2UgYWRkcmVzcyAocGVyaXBoZXJhbCBhZGRyZXNzKSwKKyAqICAgICAgICAgdXNlIGZ1bmN0aW9uIEByZWYgTExfQURDX0RNQV9HZXRSZWdBZGRyKCkuCisgKiBAcm10b2xsIENGR1IgICAgIERNQUVOICAgICAgICAgIExMX0FEQ19SRUdfR2V0RE1BVHJhbnNmZXJcbgorICogICAgICAgICBDRkdSICAgICBETUFDRkcgICAgICAgICBMTF9BRENfUkVHX0dldERNQVRyYW5zZmVyCisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX0RNQV9UUkFOU0ZFUl9OT05FCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX0RNQV9UUkFOU0ZFUl9MSU1JVEVECisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX0RNQV9UUkFOU0ZFUl9VTkxJTUlURUQKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19SRUdfR2V0RE1BVHJhbnNmZXIoY29uc3QgQURDX1R5cGVEZWYgKkFEQ3gpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeC0+Q0ZHUiwgQURDX0NGR1JfRE1BRU4gfCBBRENfQ0ZHUl9ETUFDRkcpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFNldCBBREMgZ3JvdXAgcmVndWxhciBiZWhhdmlvciBpbiBjYXNlIG9mIG92ZXJydW46CisgKiAgICAgICAgIGRhdGEgcHJlc2VydmVkIG9yIG92ZXJ3cml0dGVuLgorICogQG5vdGUgICBDb21wYXRpYmlsaXR5IHdpdGggZGV2aWNlcyB3aXRob3V0IGZlYXR1cmUgb3ZlcnJ1bjoKKyAqICAgICAgICAgb3RoZXIgZGV2aWNlcyB3aXRob3V0IHRoaXMgZmVhdHVyZSBoYXZlIGEgYmVoYXZpb3IKKyAqICAgICAgICAgZXF1aXZhbGVudCB0byBkYXRhIG92ZXJ3cml0dGVuLgorICogICAgICAgICBUaGUgZGVmYXVsdCBzZXR0aW5nIG9mIG92ZXJydW4gaXMgZGF0YSBwcmVzZXJ2ZWQuCisgKiAgICAgICAgIFRoZXJlZm9yZSwgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBhbGwgZGV2aWNlcywgcGFyYW1ldGVyCisgKiAgICAgICAgIG92ZXJydW4gc2hvdWxkIGJlIHNldCB0byBkYXRhIG92ZXJ3cml0dGVuLgorICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllcywgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAqICAgICAgICAgQURDIHN0YXRlOgorICogICAgICAgICBBREMgbXVzdCBiZSBkaXNhYmxlZCBvciBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZworICogICAgICAgICBvbiBncm91cCByZWd1bGFyLgorICogQHJtdG9sbCBDRkdSICAgICBPVlJNT0QgICAgICAgICBMTF9BRENfUkVHX1NldE92ZXJydW4KKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEBwYXJhbSAgT3ZlcnJ1biBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19PVlJfREFUQV9QUkVTRVJWRUQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfT1ZSX0RBVEFfT1ZFUldSSVRURU4KKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfUkVHX1NldE92ZXJydW4oQURDX1R5cGVEZWYgKkFEQ3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgT3ZlcnJ1bikgeworICBNT0RJRllfUkVHKEFEQ3gtPkNGR1IsIEFEQ19DRkdSX09WUk1PRCwgT3ZlcnJ1bik7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgQURDIGdyb3VwIHJlZ3VsYXIgYmVoYXZpb3IgaW4gY2FzZSBvZiBvdmVycnVuOgorICogICAgICAgICBkYXRhIHByZXNlcnZlZCBvciBvdmVyd3JpdHRlbi4KKyAqIEBybXRvbGwgQ0ZHUiAgICAgT1ZSTU9EICAgICAgICAgTExfQURDX1JFR19HZXRPdmVycnVuCisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX09WUl9EQVRBX1BSRVNFUlZFRAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19PVlJfREFUQV9PVkVSV1JJVFRFTgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX1JFR19HZXRPdmVycnVuKGNvbnN0IEFEQ19UeXBlRGVmICpBREN4KSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEFEQ3gtPkNGR1IsIEFEQ19DRkdSX09WUk1PRCkpOworfQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUZfQ29uZmlndXJhdGlvbl9BRENfR3JvdXBfSW5qZWN0ZWQgQ29uZmlndXJhdGlvbiBvZiBBREMKKyAqIGhpZXJhcmNoaWNhbCBzY29wZTogZ3JvdXAgaW5qZWN0ZWQKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgIFNldCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIHNvdXJjZToKKyAqICAgICAgICAgaW50ZXJuYWwgKFNXIHN0YXJ0KSBvciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWwgKHRpbWVyIGV2ZW50LAorICogICAgICAgICBleHRlcm5hbCBpbnRlcnJ1cHQgbGluZSkuCisgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBzZXR0aW5nIHRyaWdnZXIgc291cmNlIHRvIGV4dGVybmFsIHRyaWdnZXIKKyAqICAgICAgICAgYWxzbyBzZXQgdHJpZ2dlciBwb2xhcml0eSB0byByaXNpbmcgZWRnZQorICogICAgICAgICAoZGVmYXVsdCBzZXR0aW5nIGZvciBjb21wYXRpYmlsaXR5IHdpdGggc29tZSBBREMgb24gb3RoZXIKKyAqICAgICAgICAgU1RNMzIgc2VyaWVzIGhhdmluZyB0aGlzIHNldHRpbmcgc2V0IGJ5IEhXIGRlZmF1bHQgdmFsdWUpLgorICogICAgICAgICBJbiBjYXNlIG9mIG5lZWQgdG8gbW9kaWZ5IHRyaWdnZXIgZWRnZSwgdXNlCisgKiAgICAgICAgIGZ1bmN0aW9uIEByZWYgTExfQURDX0lOSl9TZXRUcmlnZ2VyRWRnZSgpLgorICogQG5vdGUgICBBdmFpbGFiaWxpdHkgb2YgcGFyYW1ldGVycyBvZiB0cmlnZ2VyIHNvdXJjZXMgZnJvbSB0aW1lcgorICogICAgICAgICBkZXBlbmRzIG9uIHRpbWVycyBhdmFpbGFiaWxpdHkgb24gdGhlIHNlbGVjdGVkIGRldmljZS4KKyAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAqICAgICAgICAgQURDIG11c3Qgbm90IGJlIGRpc2FibGVkLiBDYW4gYmUgZW5hYmxlZCB3aXRoIG9yIHdpdGhvdXQgY29udmVyc2lvbgorICogICAgICAgICBvbiBnb2luZyBvbiBlaXRoZXIgZ3JvdXBzIHJlZ3VsYXIgb3IgaW5qZWN0ZWQuCisgKiBAcm10b2xsIEpTUVIgICAgIEpFWFRTRUwgICAgICAgIExMX0FEQ19JTkpfU2V0VHJpZ2dlclNvdXJjZVxuCisgKiAgICAgICAgIEpTUVIgICAgIEpFWFRFTiAgICAgICAgIExMX0FEQ19JTkpfU2V0VHJpZ2dlclNvdXJjZQorICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICogQHBhcmFtICBUcmlnZ2VyU291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfU09GVFdBUkUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMV9UUkdPCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTFfVFJHTzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMV9DSDMgICAgICAgICAoMikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMV9DSDQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMl9UUkdPCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTJfQ0gxICAgICAgICAgKDEpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTNfVFJHTworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0zX0NIMSAgICAgICAgICgxKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0zX0NIMyAgICAgICAgICgxKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0zX0NINCAgICAgICAgICgxKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU00X1RSR08KKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNNF9DSDMgICAgICAgICAoMikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNNF9DSDQgICAgICAgICAoMikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNNl9UUkdPCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTdfVFJHTworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU04X1RSR08KKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNOF9UUkdPMgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU04X0NIMiAgICAgICAgICgyKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU04X0NINAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0xNV9UUkdPCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTE2X0NIMSAgICAgICAgKDEpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTIwX1RSR08KKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMjBfVFJHTzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMjBfQ0gyICAgICAgICAoMikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMjBfQ0g0ICAgICAgICAoMSkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfSFJUSU1fVFJHMSAgICAgICAoMikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfSFJUSU1fVFJHMgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9IUlRJTV9UUkczICAgICAgICgyKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9IUlRJTV9UUkc0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX0hSVElNX1RSRzUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfSFJUSU1fVFJHNgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9IUlRJTV9UUkc3CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX0hSVElNX1RSRzgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfSFJUSU1fVFJHOQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9IUlRJTV9UUkcxMAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9FWFRJX0xJTkUzICAgICAgICgyKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9FWFRJX0xJTkUxNSAgICAgICgxKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9MUFRJTV9PVVQKKyAqCisgKiAgICAgICAgICgxKSBPbiBTVE0zMkc0IHNlcmllcywgcGFyYW1ldGVyIG5vdCBhdmFpbGFibGUgb24gYWxsIEFEQyBpbnN0YW5jZXM6CisgKiBBREMxLCBBREMyLlxuICgyKSBPbiBTVE0zMkc0IHNlcmllcywgcGFyYW1ldGVyIG5vdCBhdmFpbGFibGUgb24gYWxsIEFEQworICogaW5zdGFuY2VzOiBBREMzLCBBREM0LCBBREM1LiBPbiB0aGlzIFNUTTMyIHNlcmllcywgYWxsIEFEQ3ggYXJlIG5vdCBhdmFpbGFibGUKKyAqIG9uIGFsbCBkZXZpY2VzLiBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBtb3JlIGRldGFpbHMuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0lOSl9TZXRUcmlnZ2VyU291cmNlKEFEQ19UeXBlRGVmICpBREN4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRyaWdnZXJTb3VyY2UpIHsKKyAgTU9ESUZZX1JFRyhBREN4LT5KU1FSLCBBRENfSlNRUl9KRVhUU0VMIHwgQURDX0pTUVJfSkVYVEVOLCBUcmlnZ2VyU291cmNlKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIHNvdXJjZToKKyAqICAgICAgICAgaW50ZXJuYWwgKFNXIHN0YXJ0KSBvciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWwgKHRpbWVyIGV2ZW50LAorICogICAgICAgICBleHRlcm5hbCBpbnRlcnJ1cHQgbGluZSkuCisgKiBAbm90ZSAgIFRvIGRldGVybWluZSB3aGV0aGVyIGdyb3VwIGluamVjdGVkIHRyaWdnZXIgc291cmNlIGlzCisgKiAgICAgICAgIGludGVybmFsIChTVyBzdGFydCkgb3IgZXh0ZXJuYWwsIHdpdGhvdXQgZGV0YWlsCisgKiAgICAgICAgIG9mIHdoaWNoIHBlcmlwaGVyYWwgaXMgc2VsZWN0ZWQgYXMgZXh0ZXJuYWwgdHJpZ2dlciwKKyAqICAgICAgICAgKGVxdWl2YWxlbnQgdG8KKyAqICAgICAgICAgImlmKExMX0FEQ19JTkpfR2V0VHJpZ2dlclNvdXJjZShBREMxKSA9PSBMTF9BRENfSU5KX1RSSUdfU09GVFdBUkUpIikKKyAqICAgICAgICAgdXNlIGZ1bmN0aW9uIEByZWYgTExfQURDX0lOSl9Jc1RyaWdnZXJTb3VyY2VTV1N0YXJ0LgorICogQG5vdGUgICBBdmFpbGFiaWxpdHkgb2YgcGFyYW1ldGVycyBvZiB0cmlnZ2VyIHNvdXJjZXMgZnJvbSB0aW1lcgorICogICAgICAgICBkZXBlbmRzIG9uIHRpbWVycyBhdmFpbGFiaWxpdHkgb24gdGhlIHNlbGVjdGVkIGRldmljZS4KKyAqIEBybXRvbGwgSlNRUiAgICAgSkVYVFNFTCAgICAgICAgTExfQURDX0lOSl9HZXRUcmlnZ2VyU291cmNlXG4KKyAqICAgICAgICAgSlNRUiAgICAgSkVYVEVOICAgICAgICAgTExfQURDX0lOSl9HZXRUcmlnZ2VyU291cmNlCisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfU09GVFdBUkUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMV9UUkdPCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTFfVFJHTzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMV9DSDMgICAgICAgICAoMikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMV9DSDQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMl9UUkdPCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTJfQ0gxICAgICAgICAgKDEpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTNfVFJHTworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0zX0NIMSAgICAgICAgICgxKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0zX0NIMyAgICAgICAgICgxKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0zX0NINCAgICAgICAgICgxKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU00X1RSR08KKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNNF9DSDMgICAgICAgICAoMikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNNF9DSDQgICAgICAgICAoMikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNNl9UUkdPCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTdfVFJHTworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU04X1RSR08KKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNOF9UUkdPMgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU04X0NIMiAgICAgICAgICgyKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU04X0NINAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0xNV9UUkdPCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTE2X0NIMSAgICAgICAgKDEpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTIwX1RSR08KKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMjBfVFJHTzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMjBfQ0gyICAgICAgICAoMikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMjBfQ0g0ICAgICAgICAoMSkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfSFJUSU1fVFJHMSAgICAgICAoMikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfSFJUSU1fVFJHMgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9IUlRJTV9UUkczICAgICAgICgyKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9IUlRJTV9UUkc0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX0hSVElNX1RSRzUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfSFJUSU1fVFJHNgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9IUlRJTV9UUkc3CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX0hSVElNX1RSRzgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfSFJUSU1fVFJHOQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9IUlRJTV9UUkcxMAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9FWFRJX0xJTkUzICAgICAgICgyKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9FWFRJX0xJTkUxNSAgICAgICgxKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9MUFRJTV9PVVQKKyAqCisgKiAgICAgICAgICgxKSBPbiBTVE0zMkc0IHNlcmllcywgcGFyYW1ldGVyIG5vdCBhdmFpbGFibGUgb24gYWxsIEFEQyBpbnN0YW5jZXM6CisgKiBBREMxLCBBREMyLlxuICgyKSBPbiBTVE0zMkc0IHNlcmllcywgcGFyYW1ldGVyIG5vdCBhdmFpbGFibGUgb24gYWxsIEFEQworICogaW5zdGFuY2VzOiBBREMzLCBBREM0LCBBREM1LiBPbiB0aGlzIFNUTTMyIHNlcmllcywgYWxsIEFEQ3ggYXJlIG5vdCBhdmFpbGFibGUKKyAqIG9uIGFsbCBkZXZpY2VzLiBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBtb3JlIGRldGFpbHMuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSU5KX0dldFRyaWdnZXJTb3VyY2UoY29uc3QgQURDX1R5cGVEZWYgKkFEQ3gpIHsKKyAgX19JTyB1aW50MzJfdCB0cmlnZ2VyX3NvdXJjZSA9CisgICAgICBSRUFEX0JJVChBREN4LT5KU1FSLCBBRENfSlNRUl9KRVhUU0VMIHwgQURDX0pTUVJfSkVYVEVOKTsKKworICAvKiBWYWx1ZSBmb3Igc2hpZnQgb2YgezA7IDQ7IDg7IDEyfSBkZXBlbmRpbmcgb24gdmFsdWUgb2YgYml0ZmllbGQgICAgICAgICAgKi8KKyAgLyogY29ycmVzcG9uZGluZyB0byBBRENfSlNRUl9KRVhURU4gezA7IDE7IDI7IDN9LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHVpbnQzMl90IHNoaWZ0X2pleHRlbiA9ICgodHJpZ2dlcl9zb3VyY2UgJiBBRENfSlNRUl9KRVhURU4pID4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAoQURDX0lOSl9UUklHX0VYVEVOX0JJVE9GRlNFVF9QT1MgLSAyVUwpKTsKKworICAvKiBTZXQgYml0ZmllbGQgY29ycmVzcG9uZGluZyB0byBBRENfSlNRUl9KRVhURU4gYW5kIEFEQ19KU1FSX0pFWFRTRUwgICAgICAgKi8KKyAgLyogdG8gbWF0Y2ggd2l0aCB0cmlnZ2VycyBsaXRlcmFscyBkZWZpbml0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHJldHVybiAoKHRyaWdnZXJfc291cmNlICYgKEFEQ19JTkpfVFJJR19TT1VSQ0VfTUFTSyA+PiBzaGlmdF9qZXh0ZW4pICYKKyAgICAgICAgICAgQURDX0pTUVJfSkVYVFNFTCkgfAorICAgICAgICAgICgoQURDX0lOSl9UUklHX0VER0VfTUFTSyA+PiBzaGlmdF9qZXh0ZW4pICYgQURDX0pTUVJfSkVYVEVOKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgc291cmNlIGludGVybmFsIChTVyBzdGFydCkKKyAgICAgICAgICAgIG9yIGV4dGVybmFsCisgICogQG5vdGUgICBJbiBjYXNlIG9mIGdyb3VwIGluamVjdGVkIHRyaWdnZXIgc291cmNlIHNldCB0byBleHRlcm5hbCB0cmlnZ2VyLAorICAqICAgICAgICAgdG8gZGV0ZXJtaW5lIHdoaWNoIHBlcmlwaGVyYWwgaXMgc2VsZWN0ZWQgYXMgZXh0ZXJuYWwgdHJpZ2dlciwKKyAgKiAgICAgICAgIHVzZSBmdW5jdGlvbiBAcmVmIExMX0FEQ19JTkpfR2V0VHJpZ2dlclNvdXJjZS4KKyAgKiBAcm10b2xsIEpTUVIgICAgIEpFWFRFTiAgICAgICAgIExMX0FEQ19JTkpfSXNUcmlnZ2VyU291cmNlU1dTdGFydAorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFZhbHVlICIwIiBpZiB0cmlnZ2VyIHNvdXJjZSBleHRlcm5hbCB0cmlnZ2VyCisgICogICAgICAgICBWYWx1ZSAiMSIgaWYgdHJpZ2dlciBzb3VyY2UgU1cgc3RhcnQuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX0FEQ19JTkpfSXNUcmlnZ2VyU291cmNlU1dTdGFydChjb25zdCBBRENfVHlwZURlZiAqQURDeCkgeworICByZXR1cm4gKChSRUFEX0JJVChBREN4LT5KU1FSLCBBRENfSlNRUl9KRVhURU4pID09CisgICAgICAgICAgIChMTF9BRENfSU5KX1RSSUdfU09GVFdBUkUgJiBBRENfSlNRUl9KRVhURU4pKQorICAgICAgICAgICAgICA/IDFVTAorICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBTZXQgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBwb2xhcml0eS4KKyAqICAgICAgICAgQXBwbGljYWJsZSBvbmx5IGZvciB0cmlnZ2VyIHNvdXJjZSBzZXQgdG8gZXh0ZXJuYWwgdHJpZ2dlci4KKyAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAqICAgICAgICAgQURDIG11c3Qgbm90IGJlIGRpc2FibGVkLiBDYW4gYmUgZW5hYmxlZCB3aXRoIG9yIHdpdGhvdXQgY29udmVyc2lvbgorICogICAgICAgICBvbiBnb2luZyBvbiBlaXRoZXIgZ3JvdXBzIHJlZ3VsYXIgb3IgaW5qZWN0ZWQuCisgKiBAcm10b2xsIEpTUVIgICAgIEpFWFRFTiAgICAgICAgIExMX0FEQ19JTkpfU2V0VHJpZ2dlckVkZ2UKKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEBwYXJhbSAgRXh0ZXJuYWxUcmlnZ2VyRWRnZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcKKyAqIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfUklTSU5HCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX0ZBTExJTkcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfUklTSU5HRkFMTElORworICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19JTkpfU2V0VHJpZ2dlckVkZ2UoQURDX1R5cGVEZWYgKkFEQ3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEV4dGVybmFsVHJpZ2dlckVkZ2UpIHsKKyAgTU9ESUZZX1JFRyhBREN4LT5KU1FSLCBBRENfSlNRUl9KRVhURU4sIEV4dGVybmFsVHJpZ2dlckVkZ2UpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgcG9sYXJpdHkuCisgKiAgICAgICAgIEFwcGxpY2FibGUgb25seSBmb3IgdHJpZ2dlciBzb3VyY2Ugc2V0IHRvIGV4dGVybmFsIHRyaWdnZXIuCisgKiBAcm10b2xsIEpTUVIgICAgIEpFWFRFTiAgICAgICAgIExMX0FEQ19JTkpfR2V0VHJpZ2dlckVkZ2UKKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfUklTSU5HCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX0ZBTExJTkcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfUklTSU5HRkFMTElORworICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lOSl9HZXRUcmlnZ2VyRWRnZShjb25zdCBBRENfVHlwZURlZiAqQURDeCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChBREN4LT5KU1FSLCBBRENfSlNRUl9KRVhURU4pKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFNldCBBREMgZ3JvdXAgaW5qZWN0ZWQgc2VxdWVuY2VyIGxlbmd0aCBhbmQgc2NhbiBkaXJlY3Rpb24uCisgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgY29uZmlndXJhdGlvbiBvZjoKKyAqICAgICAgICAgLSBTZXF1ZW5jZSBsZW5ndGg6IE51bWJlciBvZiByYW5rcyBpbiB0aGUgc2NhbiBzZXF1ZW5jZS4KKyAqICAgICAgICAgLSBTZXF1ZW5jZSBkaXJlY3Rpb246IFVubGVzcyBzcGVjaWZpZWQgaW4gcGFyYW1ldGVycywgc2VxdWVuY2VyCisgKiAgICAgICAgICAgc2NhbiBkaXJlY3Rpb24gaXMgZm9yd2FyZCAoZnJvbSByYW5rIDEgdG8gcmFuayBuKS4KKyAqIEBub3RlICAgU2VxdWVuY2VyIGRpc2FibGVkIGlzIGVxdWl2YWxlbnQgdG8gc2VxdWVuY2VyIG9mIDEgcmFuazoKKyAqICAgICAgICAgQURDIGNvbnZlcnNpb24gb24gb25seSAxIGNoYW5uZWwuCisgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICogICAgICAgICBBREMgc3RhdGU6CisgKiAgICAgICAgIEFEQyBtdXN0IG5vdCBiZSBkaXNhYmxlZC4gQ2FuIGJlIGVuYWJsZWQgd2l0aCBvciB3aXRob3V0IGNvbnZlcnNpb24KKyAqICAgICAgICAgb24gZ29pbmcgb24gZWl0aGVyIGdyb3VwcyByZWd1bGFyIG9yIGluamVjdGVkLgorICogQHJtdG9sbCBKU1FSICAgICBKTCAgICAgICAgICAgICBMTF9BRENfSU5KX1NldFNlcXVlbmNlckxlbmd0aAorICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICogQHBhcmFtICBTZXF1ZW5jZXJOYlJhbmtzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1NFUV9TQ0FOX0RJU0FCTEUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfU0VRX1NDQU5fRU5BQkxFXzJSQU5LUworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9TRVFfU0NBTl9FTkFCTEVfM1JBTktTCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1NFUV9TQ0FOX0VOQUJMRV80UkFOS1MKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfSU5KX1NldFNlcXVlbmNlckxlbmd0aChBRENfVHlwZURlZiAqQURDeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFNlcXVlbmNlck5iUmFua3MpIHsKKyAgTU9ESUZZX1JFRyhBREN4LT5KU1FSLCBBRENfSlNRUl9KTCwgU2VxdWVuY2VyTmJSYW5rcyk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgQURDIGdyb3VwIGluamVjdGVkIHNlcXVlbmNlciBsZW5ndGggYW5kIHNjYW4gZGlyZWN0aW9uLgorICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIHJldHJpZXZlczoKKyAqICAgICAgICAgLSBTZXF1ZW5jZSBsZW5ndGg6IE51bWJlciBvZiByYW5rcyBpbiB0aGUgc2NhbiBzZXF1ZW5jZS4KKyAqICAgICAgICAgLSBTZXF1ZW5jZSBkaXJlY3Rpb246IFVubGVzcyBzcGVjaWZpZWQgaW4gcGFyYW1ldGVycywgc2VxdWVuY2VyCisgKiAgICAgICAgICAgc2NhbiBkaXJlY3Rpb24gaXMgZm9yd2FyZCAoZnJvbSByYW5rIDEgdG8gcmFuayBuKS4KKyAqIEBub3RlICAgU2VxdWVuY2VyIGRpc2FibGVkIGlzIGVxdWl2YWxlbnQgdG8gc2VxdWVuY2VyIG9mIDEgcmFuazoKKyAqICAgICAgICAgQURDIGNvbnZlcnNpb24gb24gb25seSAxIGNoYW5uZWwuCisgKiBAcm10b2xsIEpTUVIgICAgIEpMICAgICAgICAgICAgIExMX0FEQ19JTkpfR2V0U2VxdWVuY2VyTGVuZ3RoCisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1NFUV9TQ0FOX0RJU0FCTEUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfU0VRX1NDQU5fRU5BQkxFXzJSQU5LUworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9TRVFfU0NBTl9FTkFCTEVfM1JBTktTCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1NFUV9TQ0FOX0VOQUJMRV80UkFOS1MKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9BRENfSU5KX0dldFNlcXVlbmNlckxlbmd0aChjb25zdCBBRENfVHlwZURlZiAqQURDeCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChBREN4LT5KU1FSLCBBRENfSlNRUl9KTCkpOworfQorCisvKioKKyAqIEBicmllZiAgU2V0IEFEQyBncm91cCBpbmplY3RlZCBzZXF1ZW5jZXIgZGlzY29udGludW91cyBtb2RlOgorICogICAgICAgICBzZXF1ZW5jZSBzdWJkaXZpZGVkIGFuZCBzY2FuIGNvbnZlcnNpb25zIGludGVycnVwdGVkIGV2ZXJ5IHNlbGVjdGVkCisgKiAgICAgICAgIG51bWJlciBvZiByYW5rcy4KKyAqIEBub3RlICAgSXQgaXMgbm90IHBvc3NpYmxlIHRvIGVuYWJsZSBib3RoIEFEQyBncm91cCBpbmplY3RlZAorICogICAgICAgICBhdXRvLWluamVjdGVkIG1vZGUgYW5kIHNlcXVlbmNlciBkaXNjb250aW51b3VzIG1vZGUuCisgKiBAcm10b2xsIENGR1IgICAgIEpESVNDRU4gICAgICAgIExMX0FEQ19JTkpfU2V0U2VxdWVuY2VyRGlzY29udAorICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICogQHBhcmFtICBTZXFEaXNjb250IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1NFUV9ESVNDT05UX0RJU0FCTEUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfU0VRX0RJU0NPTlRfMVJBTksKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfSU5KX1NldFNlcXVlbmNlckRpc2NvbnQoQURDX1R5cGVEZWYgKkFEQ3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgU2VxRGlzY29udCkgeworICBNT0RJRllfUkVHKEFEQ3gtPkNGR1IsIEFEQ19DRkdSX0pESVNDRU4sIFNlcURpc2NvbnQpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IEFEQyBncm91cCBpbmplY3RlZCBzZXF1ZW5jZXIgZGlzY29udGludW91cyBtb2RlOgorICogICAgICAgICBzZXF1ZW5jZSBzdWJkaXZpZGVkIGFuZCBzY2FuIGNvbnZlcnNpb25zIGludGVycnVwdGVkIGV2ZXJ5IHNlbGVjdGVkCisgKiAgICAgICAgIG51bWJlciBvZiByYW5rcy4KKyAqIEBybXRvbGwgQ0ZHUiAgICAgSkRJU0NFTiAgICAgICAgTExfQURDX0lOSl9HZXRTZXF1ZW5jZXJEaXNjb250CisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1NFUV9ESVNDT05UX0RJU0FCTEUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfU0VRX0RJU0NPTlRfMVJBTksKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9BRENfSU5KX0dldFNlcXVlbmNlckRpc2NvbnQoY29uc3QgQURDX1R5cGVEZWYgKkFEQ3gpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeC0+Q0ZHUiwgQURDX0NGR1JfSkRJU0NFTikpOworfQorCisvKioKKyAqIEBicmllZiAgU2V0IEFEQyBncm91cCBpbmplY3RlZCBzZXF1ZW5jZTogY2hhbm5lbCBvbiB0aGUgc2VsZWN0ZWQKKyAqICAgICAgICAgc2VxdWVuY2UgcmFuay4KKyAqIEBub3RlICAgRGVwZW5kaW5nIG9uIGRldmljZXMgYW5kIHBhY2thZ2VzLCBzb21lIGNoYW5uZWxzIG1heSBub3QgYmUKKyAqIGF2YWlsYWJsZS4gUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgY2hhbm5lbHMgYXZhaWxhYmlsaXR5LgorICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllcywgdG8gbWVhc3VyZSBpbnRlcm5hbCBjaGFubmVscyAoVnJlZkludCwKKyAqICAgICAgICAgVGVtcFNlbnNvciwgLi4uKSwgbWVhc3VyZW1lbnQgcGF0aHMgdG8gaW50ZXJuYWwgY2hhbm5lbHMgbXVzdCBiZQorICogICAgICAgICBlbmFibGVkIHNlcGFyYXRlbHkuCisgKiAgICAgICAgIFRoaXMgY2FuIGJlIGRvbmUgdXNpbmcgZnVuY3Rpb24gQHJlZgorICogTExfQURDX1NldENvbW1vblBhdGhJbnRlcm5hbENoKCkuCisgKiBAbm90ZSAgIE9uIFNUTTMyRzQsIHNvbWUgZmFzdCBjaGFubmVscyBhcmUgYXZhaWxhYmxlOiBmYXN0IGFuYWxvZyBpbnB1dHMKKyAqICAgICAgICAgY29taW5nIGZyb20gR1BJTyBwYWRzIChBRENfSU4xLi41KS4KKyAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAqICAgICAgICAgQURDIG11c3Qgbm90IGJlIGRpc2FibGVkLiBDYW4gYmUgZW5hYmxlZCB3aXRoIG9yIHdpdGhvdXQgY29udmVyc2lvbgorICogICAgICAgICBvbiBnb2luZyBvbiBlaXRoZXIgZ3JvdXBzIHJlZ3VsYXIgb3IgaW5qZWN0ZWQuCisgKiBAcm10b2xsIEpTUVIgICAgIEpTUTEgICAgICAgICAgIExMX0FEQ19JTkpfU2V0U2VxdWVuY2VyUmFua3NcbgorICogICAgICAgICBKU1FSICAgICBKU1EyICAgICAgICAgICBMTF9BRENfSU5KX1NldFNlcXVlbmNlclJhbmtzXG4KKyAqICAgICAgICAgSlNRUiAgICAgSlNRMyAgICAgICAgICAgTExfQURDX0lOSl9TZXRTZXF1ZW5jZXJSYW5rc1xuCisgKiAgICAgICAgIEpTUVIgICAgIEpTUTQgICAgICAgICAgIExMX0FEQ19JTkpfU2V0U2VxdWVuY2VyUmFua3MKKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEBwYXJhbSAgUmFuayBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9SQU5LXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfUkFOS18yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1JBTktfMworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9SQU5LXzQKKyAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMSAgICAgICAgICAgICAgICAgKDgpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8yICAgICAgICAgICAgICAgICAoOCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzMgICAgICAgICAgICAgICAgICg4KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNCAgICAgICAgICAgICAgICAgKDgpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF81ICAgICAgICAgICAgICAgICAoOCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE2CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQgICAgICAgICAgICg3KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUl9BREMxICAgKDEpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SX0FEQzUgICAoNSkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZCQVQgICAgICAgICAgICAgICg2KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QMSAgICAgICAgICAgKDEpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAyICAgICAgICAgICAoMikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDNfQURDMiAgICAgICgyKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QM19BREMzICAgICAgKDMpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVA0ICAgICAgICAgICAoNSkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDUgICAgICAgICAgICg1KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QNiAgICAgICAgICAgKDQpCisgKgorICogICAgICAgICAoMSkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMS5cbgorICogICAgICAgICAoMikgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMi5cbgorICogICAgICAgICAoMykgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMy5cbgorICogICAgICAgICAoNCkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDNC5cbgorICogICAgICAgICAoNSkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDNS5cbgorICogICAgICAgICAoNikgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZXM6IEFEQzEsCisgKiBBREMzLCBBREM1LlxuICg3KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlczoKKyAqIEFEQzEsIEFEQzMsIEFEQzQsIEFEQzUuXG4gT24gdGhpcyBTVE0zMiBzZXJpZXMsIGFsbCBBREN4IGFyZSBub3QgYXZhaWxhYmxlIG9uCisgKiBhbGwgZGV2aWNlcy4gUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgbW9yZSBkZXRhaWxzLiAoOCkgT24gU1RNMzJHNCwgZmFzdAorICogY2hhbm5lbCBhbGxvd3M6IDIuNSAoc2FtcGxpbmcpICsgMTIuNSAoY29udmVyc2lvbikgPSAxNSBBREMgY2xvY2sgY3ljbGVzCisgKiAoZkFEQykgdG8gY29udmVydCBpbiAxMi1iaXQgcmVzb2x1dGlvbi4gT3RoZXIgY2hhbm5lbHMgYXJlIHNsb3cgY2hhbm5lbHMKKyAqIGFsbG93czogNi41IChzYW1wbGluZykgKyAxMi41IChjb252ZXJzaW9uKSA9IDE5IEFEQyBjbG9jayBjeWNsZXMgKGZBREMpIHRvCisgKiBjb252ZXJ0IGluIDEyLWJpdCByZXNvbHV0aW9uLlxuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0lOSl9TZXRTZXF1ZW5jZXJSYW5rcyhBRENfVHlwZURlZiAqQURDeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUmFuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCkgeworICAvKiBTZXQgYml0cyB3aXRoIGNvbnRlbnQgb2YgcGFyYW1ldGVyICJDaGFubmVsIiB3aXRoIGJpdHMgcG9zaXRpb24gICAgICAgICAgKi8KKyAgLyogaW4gcmVnaXN0ZXIgZGVwZW5kaW5nIG9uIHBhcmFtZXRlciAiUmFuayIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFBhcmFtZXRlcnMgIlJhbmsiIGFuZCAiQ2hhbm5lbCIgYXJlIHVzZWQgd2l0aCBtYXNrcyBiZWNhdXNlIGNvbnRhaW5pbmcgICAqLworICAvKiBvdGhlciBiaXRzIHJlc2VydmVkIGZvciBvdGhlciBwdXJwb3NlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTU9ESUZZX1JFRyhBREN4LT5KU1FSLAorICAgICAgICAgICAgIChBRENfQ0hBTk5FTF9JRF9OVU1CRVJfTUFTSyA+PiBBRENfQ0hBTk5FTF9JRF9OVU1CRVJfQklUT0ZGU0VUX1BPUykKKyAgICAgICAgICAgICAgICAgPDwgKFJhbmsgJiBBRENfSU5KX1JBTktfSURfSlNRUl9NQVNLKSwKKyAgICAgICAgICAgICAoKENoYW5uZWwgJiBBRENfQ0hBTk5FTF9JRF9OVU1CRVJfTUFTSykgPj4KKyAgICAgICAgICAgICAgQURDX0NIQU5ORUxfSURfTlVNQkVSX0JJVE9GRlNFVF9QT1MpCisgICAgICAgICAgICAgICAgIDw8IChSYW5rICYgQURDX0lOSl9SQU5LX0lEX0pTUVJfTUFTSykpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IEFEQyBncm91cCBpbmplY3RlZCBzZXF1ZW5jZTogY2hhbm5lbCBvbiB0aGUgc2VsZWN0ZWQKKyAqICAgICAgICAgc2VxdWVuY2UgcmFuay4KKyAqIEBub3RlICAgRGVwZW5kaW5nIG9uIGRldmljZXMgYW5kIHBhY2thZ2VzLCBzb21lIGNoYW5uZWxzIG1heSBub3QgYmUKKyAqIGF2YWlsYWJsZS4gUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgY2hhbm5lbHMgYXZhaWxhYmlsaXR5LgorICogQG5vdGUgICBVc2FnZSBvZiB0aGUgcmV0dXJuZWQgY2hhbm5lbCBudW1iZXI6CisgKiAgICAgICAgIC0gVG8gcmVpbmplY3QgdGhpcyBjaGFubmVsIGludG8gYW5vdGhlciBmdW5jdGlvbiBMTF9BRENfeHh4OgorICogICAgICAgICAgIHRoZSByZXR1cm5lZCBjaGFubmVsIG51bWJlciBpcyBvbmx5IHBhcnRseSBmb3JtYXR0ZWQgb24gZGVmaW5pdGlvbgorICogICAgICAgICAgIG9mIGxpdGVyYWxzIExMX0FEQ19DSEFOTkVMX3guIFRoZXJlZm9yZSwgaXQgaGFzIHRvIGJlIGNvbXBhcmVkCisgKiAgICAgICAgICAgd2l0aCBwYXJ0cyBvZiBsaXRlcmFscyBMTF9BRENfQ0hBTk5FTF94IG9yIHVzaW5nCisgKiAgICAgICAgICAgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ0hBTk5FTF9UT19ERUNJTUFMX05CKCkuCisgKiAgICAgICAgICAgVGhlbiB0aGUgc2VsZWN0ZWQgbGl0ZXJhbCBMTF9BRENfQ0hBTk5FTF94IGNhbiBiZSB1c2VkCisgKiAgICAgICAgICAgYXMgcGFyYW1ldGVyIGZvciBhbm90aGVyIGZ1bmN0aW9uLgorICogICAgICAgICAtIFRvIGdldCB0aGUgY2hhbm5lbCBudW1iZXIgaW4gZGVjaW1hbCBmb3JtYXQ6CisgKiAgICAgICAgICAgcHJvY2VzcyB0aGUgcmV0dXJuZWQgdmFsdWUgd2l0aCB0aGUgaGVscGVyIG1hY3JvCisgKiAgICAgICAgICAgQHJlZiBfX0xMX0FEQ19DSEFOTkVMX1RPX0RFQ0lNQUxfTkIoKS4KKyAqIEBybXRvbGwgSlNRUiAgICAgSlNRMSAgICAgICAgICAgTExfQURDX0lOSl9HZXRTZXF1ZW5jZXJSYW5rc1xuCisgKiAgICAgICAgIEpTUVIgICAgIEpTUTIgICAgICAgICAgIExMX0FEQ19JTkpfR2V0U2VxdWVuY2VyUmFua3NcbgorICogICAgICAgICBKU1FSICAgICBKU1EzICAgICAgICAgICBMTF9BRENfSU5KX0dldFNlcXVlbmNlclJhbmtzXG4KKyAqICAgICAgICAgSlNRUiAgICAgSlNRNCAgICAgICAgICAgTExfQURDX0lOSl9HZXRTZXF1ZW5jZXJSYW5rcworICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICogQHBhcmFtICBSYW5rIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1JBTktfMQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9SQU5LXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfUkFOS18zCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1JBTktfNAorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMSAgICAgICAgICAgICAgICAgKDgpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8yICAgICAgICAgICAgICAgICAoOCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzMgICAgICAgICAgICAgICAgICg4KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNCAgICAgICAgICAgICAgICAgKDgpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF81ICAgICAgICAgICAgICAgICAoOCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE2CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQgICAgICAgICAgICg3KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUl9BREMxICAgKDEpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SX0FEQzUgICAoNSkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZCQVQgICAgICAgICAgICAgICg2KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QMSAgICAgICAgICAgKDEpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAyICAgICAgICAgICAoMikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDNfQURDMiAgICAgICgyKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QM19BREMzICAgICAgKDMpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVA0ICAgICAgICAgICAoNSkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDUgICAgICAgICAgICg1KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QNiAgICAgICAgICAgKDQpCisgKgorICogICAgICAgICAoMSkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMS5cbgorICogICAgICAgICAoMikgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMi5cbgorICogICAgICAgICAoMykgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMy5cbgorICogICAgICAgICAoNCkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDNC5cbgorICogICAgICAgICAoNSkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDNS5cbgorICogICAgICAgICAoNikgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZXM6IEFEQzEsCisgKiBBREMzLCBBREM1LlxuICg3KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlczoKKyAqIEFEQzEsIEFEQzMsIEFEQzQsIEFEQzUuXG4gT24gdGhpcyBTVE0zMiBzZXJpZXMsIGFsbCBBREN4IGFyZSBub3QgYXZhaWxhYmxlIG9uCisgKiBhbGwgZGV2aWNlcy4gUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgbW9yZSBkZXRhaWxzLiAoOCkgT24gU1RNMzJHNCwgZmFzdAorICogY2hhbm5lbCBhbGxvd3M6IDIuNSAoc2FtcGxpbmcpICsgMTIuNSAoY29udmVyc2lvbikgPSAxNSBBREMgY2xvY2sgY3ljbGVzCisgKiAoZkFEQykgdG8gY29udmVydCBpbiAxMi1iaXQgcmVzb2x1dGlvbi4gT3RoZXIgY2hhbm5lbHMgYXJlIHNsb3cgY2hhbm5lbHMKKyAqIGFsbG93czogNi41IChzYW1wbGluZykgKyAxMi41IChjb252ZXJzaW9uKSA9IDE5IEFEQyBjbG9jayBjeWNsZXMgKGZBREMpIHRvCisgKiBjb252ZXJ0IGluIDEyLWJpdCByZXNvbHV0aW9uLlxuICgxLCAyLCAzLCA0LCA1LCA3KSBGb3IgQURDIGNoYW5uZWwgcmVhZCBiYWNrCisgKiBmcm9tIEFEQyByZWdpc3RlciwgY29tcGFyaXNvbiB3aXRoIGludGVybmFsIGNoYW5uZWwgcGFyYW1ldGVyIHRvIGJlIGRvbmUKKyAqICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIGhlbHBlciBtYWNybyBAcmVmCisgKiBfX0xMX0FEQ19DSEFOTkVMX0lOVEVSTkFMX1RPX0VYVEVSTkFMKCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSU5KX0dldFNlcXVlbmNlclJhbmtzKGNvbnN0IEFEQ19UeXBlRGVmICpBREN4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUmFuaykgeworICByZXR1cm4gKHVpbnQzMl90KSgoUkVBRF9CSVQoQURDeC0+SlNRUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF9JRF9OVU1CRVJfTUFTSyA+PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DSEFOTkVMX0lEX05VTUJFUl9CSVRPRkZTRVRfUE9TKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IChSYW5rICYgQURDX0lOSl9SQU5LX0lEX0pTUVJfTUFTSykpID4+CisgICAgICAgICAgICAgICAgICAgICAoUmFuayAmIEFEQ19JTkpfUkFOS19JRF9KU1FSX01BU0spKQorICAgICAgICAgICAgICAgICAgICA8PCBBRENfQ0hBTk5FTF9JRF9OVU1CRVJfQklUT0ZGU0VUX1BPUyk7Cit9CisKKy8qKgorICogQGJyaWVmICBTZXQgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlcjoKKyAqICAgICAgICAgaW5kZXBlbmRlbnQgb3IgZnJvbSBBREMgZ3JvdXAgcmVndWxhci4KKyAqIEBub3RlICAgVGhpcyBtb2RlIGNhbiBiZSB1c2VkIHRvIGV4dGVuZCBudW1iZXIgb2YgZGF0YSByZWdpc3RlcnMKKyAqICAgICAgICAgdXBkYXRlZCBhZnRlciBvbmUgQURDIGNvbnZlcnNpb24gdHJpZ2dlciBhbmQgd2l0aCBkYXRhCisgKiAgICAgICAgIHBlcm1hbmVudGx5IGtlcHQgKG5vdCBlcmFzZWQgYnkgc3VjY2Vzc2l2ZSBjb252ZXJzaW9ucyBvZiBzY2FuIG9mCisgKiAgICAgICAgIEFEQyBzZXF1ZW5jZXIgcmFua3MpLCB1cCB0byA1IGRhdGEgcmVnaXN0ZXJzOgorICogICAgICAgICAxIGRhdGEgcmVnaXN0ZXIgb24gQURDIGdyb3VwIHJlZ3VsYXIsIDQgZGF0YSByZWdpc3RlcnMKKyAqICAgICAgICAgb24gQURDIGdyb3VwIGluamVjdGVkLgorICogQG5vdGUgICBJZiBBREMgZ3JvdXAgaW5qZWN0ZWQgaW5qZWN0ZWQgdHJpZ2dlciBzb3VyY2UgaXMgc2V0IHRvIGFuCisgKiAgICAgICAgIGV4dGVybmFsIHRyaWdnZXIsIHRoaXMgZmVhdHVyZSBtdXN0IGJlIG11c3QgYmUgc2V0IHRvCisgKiAgICAgICAgIGluZGVwZW5kZW50IHRyaWdnZXIuCisgKiAgICAgICAgIEFEQyBncm91cCBpbmplY3RlZCBhdXRvbWF0aWMgdHJpZ2dlciBpcyBjb21wbGlhbnQgb25seSB3aXRoCisgKiAgICAgICAgIGdyb3VwIGluamVjdGVkIHRyaWdnZXIgc291cmNlIHNldCB0byBTVyBzdGFydCwgd2l0aG91dCBhbnkKKyAqICAgICAgICAgZnVydGhlciBhY3Rpb24gb24gIEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHN0YXJ0IG9yIHN0b3A6CisgKiAgICAgICAgIGluIHRoaXMgY2FzZSwgQURDIGdyb3VwIGluamVjdGVkIGlzIGNvbnRyb2xsZWQgb25seQorICogICAgICAgICBmcm9tIEFEQyBncm91cCByZWd1bGFyLgorICogQG5vdGUgICBJdCBpcyBub3QgcG9zc2libGUgdG8gZW5hYmxlIGJvdGggQURDIGdyb3VwIGluamVjdGVkCisgKiAgICAgICAgIGF1dG8taW5qZWN0ZWQgbW9kZSBhbmQgc2VxdWVuY2VyIGRpc2NvbnRpbnVvdXMgbW9kZS4KKyAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcKKyAqICAgICAgICAgb24gZWl0aGVyIGdyb3VwcyByZWd1bGFyIG9yIGluamVjdGVkLgorICogQHJtdG9sbCBDRkdSICAgICBKQVVUTyAgICAgICAgICBMTF9BRENfSU5KX1NldFRyaWdBdXRvCisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcGFyYW0gIFRyaWdBdXRvIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfSU5ERVBFTkRFTlQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19GUk9NX0dSUF9SRUdVTEFSCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0lOSl9TZXRUcmlnQXV0byhBRENfVHlwZURlZiAqQURDeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVHJpZ0F1dG8pIHsKKyAgTU9ESUZZX1JFRyhBREN4LT5DRkdSLCBBRENfQ0ZHUl9KQVVUTywgVHJpZ0F1dG8pOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXI6CisgKiAgICAgICAgIGluZGVwZW5kZW50IG9yIGZyb20gQURDIGdyb3VwIHJlZ3VsYXIuCisgKiBAcm10b2xsIENGR1IgICAgIEpBVVRPICAgICAgICAgIExMX0FEQ19JTkpfR2V0VHJpZ0F1dG8KKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19JTkRFUEVOREVOVAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0ZST01fR1JQX1JFR1VMQVIKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19JTkpfR2V0VHJpZ0F1dG8oY29uc3QgQURDX1R5cGVEZWYgKkFEQ3gpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeC0+Q0ZHUiwgQURDX0NGR1JfSkFVVE8pKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFNldCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udGV4dHMgcXVldWUgbW9kZS4KKyAqIEBub3RlICAgQSBjb250ZXh0IGlzIGEgc2V0dGluZyBvZiBncm91cCBpbmplY3RlZCBzZXF1ZW5jZXI6CisgKiAgICAgICAgIC0gZ3JvdXAgaW5qZWN0ZWQgdHJpZ2dlcgorICogICAgICAgICAtIHNlcXVlbmNlciBsZW5ndGgKKyAqICAgICAgICAgLSBzZXF1ZW5jZXIgcmFua3MKKyAqICAgICAgICAgSWYgY29udGV4dHMgcXVldWUgaXMgZGlzYWJsZWQ6CisgKiAgICAgICAgIC0gb25seSAxIHNlcXVlbmNlIGNhbiBiZSBjb25maWd1cmVkCisgKiAgICAgICAgICAgYW5kIGlzIGFjdGl2ZSBwZXJwZXR1YWxseS4KKyAqICAgICAgICAgSWYgY29udGV4dHMgcXVldWUgaXMgZW5hYmxlZDoKKyAqICAgICAgICAgLSB1cCB0byAyIGNvbnRleHRzIGNhbiBiZSBxdWV1ZWQKKyAqICAgICAgICAgICBhbmQgYXJlIGNoZWNrZWQgaW4gYW5kIG91dCBhcyBhIEZJRk8gc3RhY2sgKGZpcnN0LWluLCBmaXJzdC1vdXQpLgorICogICAgICAgICAtIElmIGEgbmV3IGNvbnRleHQgaXMgc2V0IHdoZW4gcXVldWVzIGlzIGZ1bGwsIGVycm9yIGlzIHRyaWdnZXJlZAorICogICAgICAgICAgIGJ5IGludGVycnVwdGlvbiAiSW5qZWN0ZWQgUXVldWUgT3ZlcmZsb3ciLgorICogICAgICAgICAtIFR3byBiZWhhdmlvcnMgYXJlIHBvc3NpYmxlIHdoZW4gYWxsIGNvbnRleHRzIGhhdmUgYmVlbiBwcm9jZXNzZWQ6CisgKiAgICAgICAgICAgdGhlIGNvbnRleHRzIHF1ZXVlIGNhbiBtYWludGFpbiB0aGUgbGFzdCBjb250ZXh0IGFjdGl2ZSBwZXJwZXR1YWxseQorICogICAgICAgICAgIG9yIGNhbiBiZSBlbXB0eSBhbmQgaW5qZWN0ZWQgZ3JvdXAgdHJpZ2dlcnMgYXJlIGRpc2FibGVkLgorICogICAgICAgICAtIFRyaWdnZXJzIGNhbiBiZSBvbmx5IGV4dGVybmFsIChub3QgaW50ZXJuYWwgU1cgc3RhcnQpCisgKiAgICAgICAgIC0gQ2F1dGlvbjogVGhlIHNlcXVlbmNlIG11c3QgYmUgZnVsbHkgY29uZmlndXJlZCBpbiBvbmUgdGltZQorICogICAgICAgICAgIChvbmUgd3JpdGUgb2YgcmVnaXN0ZXIgSlNRUiBtYWtlcyBhIGNoZWNrLWluIG9mIGEgbmV3IGNvbnRleHQKKyAqICAgICAgICAgICBpbnRvIHRoZSBxdWV1ZSkuCisgKiAgICAgICAgICAgVGhlcmVmb3JlIGZ1bmN0aW9ucyB0byBzZXQgc2VwYXJhdGVseSBpbmplY3RlZCB0cmlnZ2VyIGFuZAorICogICAgICAgICAgIHNlcXVlbmNlciBjaGFubmVscyBjYW5ub3QgYmUgdXNlZCwgcmVnaXN0ZXIgSlNRUiBtdXN0IGJlIHNldAorICogICAgICAgICAgIHVzaW5nIGZ1bmN0aW9uIEByZWYgTExfQURDX0lOSl9Db25maWdRdWV1ZUNvbnRleHQoKS4KKyAqIEBub3RlICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG1vZGlmaWVkIG9ubHkgd2hlbiBubyBjb252ZXJzaW9uIGlzIG9uIGdvaW5nCisgKiAgICAgICAgIG9uIGVpdGhlciBncm91cHMgcmVndWxhciBvciBpbmplY3RlZC4KKyAqIEBub3RlICAgQSBtb2RpZmljYXRpb24gb2YgdGhlIGNvbnRleHQgbW9kZSAoYml0IEpRRElTKSBjYXVzZXMgdGhlIGNvbnRleHRzCisgKiAgICAgICAgIHF1ZXVlIHRvIGJlIGZsdXNoZWQgYW5kIHRoZSByZWdpc3RlciBKU1FSIGlzIGNsZWFyZWQuCisgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICogICAgICAgICBBREMgc3RhdGU6CisgKiAgICAgICAgIEFEQyBtdXN0IGJlIGRpc2FibGVkIG9yIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nCisgKiAgICAgICAgIG9uIGVpdGhlciBncm91cHMgcmVndWxhciBvciBpbmplY3RlZC4KKyAqIEBybXRvbGwgQ0ZHUiAgICAgSlFNICAgICAgICAgICAgTExfQURDX0lOSl9TZXRRdWV1ZU1vZGVcbgorICogICAgICAgICBDRkdSICAgICBKUURJUyAgICAgICAgICBMTF9BRENfSU5KX1NldFF1ZXVlTW9kZQorICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICogQHBhcmFtICBRdWV1ZU1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfUVVFVUVfRElTQUJMRQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9RVUVVRV8yQ09OVEVYVFNfTEFTVF9BQ1RJVkUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfUVVFVUVfMkNPTlRFWFRTX0VORF9FTVBUWQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19JTkpfU2V0UXVldWVNb2RlKEFEQ19UeXBlRGVmICpBREN4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUXVldWVNb2RlKSB7CisgIE1PRElGWV9SRUcoQURDeC0+Q0ZHUiwgQURDX0NGR1JfSlFNIHwgQURDX0NGR1JfSlFESVMsIFF1ZXVlTW9kZSk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgQURDIGdyb3VwIGluamVjdGVkIGNvbnRleHQgcXVldWUgbW9kZS4KKyAqIEBybXRvbGwgQ0ZHUiAgICAgSlFNICAgICAgICAgICAgTExfQURDX0lOSl9HZXRRdWV1ZU1vZGVcbgorICogICAgICAgICBDRkdSICAgICBKUURJUyAgICAgICAgICBMTF9BRENfSU5KX0dldFF1ZXVlTW9kZQorICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9RVUVVRV9ESVNBQkxFCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1FVRVVFXzJDT05URVhUU19MQVNUX0FDVElWRQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9RVUVVRV8yQ09OVEVYVFNfRU5EX0VNUFRZCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSU5KX0dldFF1ZXVlTW9kZShjb25zdCBBRENfVHlwZURlZiAqQURDeCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChBREN4LT5DRkdSLCBBRENfQ0ZHUl9KUU0gfCBBRENfQ0ZHUl9KUURJUykpOworfQorCisvKioKKyAqIEBicmllZiAgU2V0IG9uZSBjb250ZXh0IG9uIEFEQyBncm91cCBpbmplY3RlZCB0aGF0IHdpbGwgYmUgY2hlY2tlZCBpbgorICogICAgICAgICBjb250ZXh0cyBxdWV1ZS4KKyAqIEBub3RlICAgQSBjb250ZXh0IGlzIGEgc2V0dGluZyBvZiBncm91cCBpbmplY3RlZCBzZXF1ZW5jZXI6CisgKiAgICAgICAgIC0gZ3JvdXAgaW5qZWN0ZWQgdHJpZ2dlcgorICogICAgICAgICAtIHNlcXVlbmNlciBsZW5ndGgKKyAqICAgICAgICAgLSBzZXF1ZW5jZXIgcmFua3MKKyAqICAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHdoZW4gY29udGV4dHMgcXVldWUgaXMgZW5hYmxlZCwKKyAqICAgICAgICAgYmVjYXVzZSB0aGUgc2VxdWVuY2UgbXVzdCBiZSBmdWxseSBjb25maWd1cmVkIGluIG9uZSB0aW1lCisgKiAgICAgICAgIChmdW5jdGlvbnMgdG8gc2V0IHNlcGFyYXRlbHkgaW5qZWN0ZWQgdHJpZ2dlciBhbmQgc2VxdWVuY2VyIGNoYW5uZWxzCisgKiAgICAgICAgIGNhbm5vdCBiZSB1c2VkKToKKyAqICAgICAgICAgUmVmZXIgdG8gZnVuY3Rpb24gQHJlZiBMTF9BRENfSU5KX1NldFF1ZXVlTW9kZSgpLgorICogQG5vdGUgICBJbiB0aGUgY29udGV4dHMgcXVldWUsIG9ubHkgdGhlIGFjdGl2ZSBjb250ZXh0IGNhbiBiZSByZWFkLgorICogICAgICAgICBUaGUgcGFyYW1ldGVycyBvZiB0aGlzIGZ1bmN0aW9uIGNhbiBiZSByZWFkIHVzaW5nIGZ1bmN0aW9uczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfR2V0VHJpZ2dlclNvdXJjZSgpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX0dldFRyaWdnZXJFZGdlKCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfR2V0U2VxdWVuY2VyUmFua3MoKQorICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllcywgdG8gbWVhc3VyZSBpbnRlcm5hbCBjaGFubmVscyAoVnJlZkludCwKKyAqICAgICAgICAgVGVtcFNlbnNvciwgLi4uKSwgbWVhc3VyZW1lbnQgcGF0aHMgdG8gaW50ZXJuYWwgY2hhbm5lbHMgbXVzdCBiZQorICogICAgICAgICBlbmFibGVkIHNlcGFyYXRlbHkuCisgKiAgICAgICAgIFRoaXMgY2FuIGJlIGRvbmUgdXNpbmcgZnVuY3Rpb24gQHJlZgorICogTExfQURDX1NldENvbW1vblBhdGhJbnRlcm5hbENoKCkuCisgKiBAbm90ZSAgIE9uIFNUTTMyRzQsIHNvbWUgZmFzdCBjaGFubmVscyBhcmUgYXZhaWxhYmxlOiBmYXN0IGFuYWxvZyBpbnB1dHMKKyAqICAgICAgICAgY29taW5nIGZyb20gR1BJTyBwYWRzIChBRENfSU4xLi41KS4KKyAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAqICAgICAgICAgQURDIG11c3Qgbm90IGJlIGRpc2FibGVkLiBDYW4gYmUgZW5hYmxlZCB3aXRoIG9yIHdpdGhvdXQgY29udmVyc2lvbgorICogICAgICAgICBvbiBnb2luZyBvbiBlaXRoZXIgZ3JvdXBzIHJlZ3VsYXIgb3IgaW5qZWN0ZWQuCisgKiBAcm10b2xsIEpTUVIgICAgIEpFWFRTRUwgICAgICAgIExMX0FEQ19JTkpfQ29uZmlnUXVldWVDb250ZXh0XG4KKyAqICAgICAgICAgSlNRUiAgICAgSkVYVEVOICAgICAgICAgTExfQURDX0lOSl9Db25maWdRdWV1ZUNvbnRleHRcbgorICogICAgICAgICBKU1FSICAgICBKTCAgICAgICAgICAgICBMTF9BRENfSU5KX0NvbmZpZ1F1ZXVlQ29udGV4dFxuCisgKiAgICAgICAgIEpTUVIgICAgIEpTUTEgICAgICAgICAgIExMX0FEQ19JTkpfQ29uZmlnUXVldWVDb250ZXh0XG4KKyAqICAgICAgICAgSlNRUiAgICAgSlNRMiAgICAgICAgICAgTExfQURDX0lOSl9Db25maWdRdWV1ZUNvbnRleHRcbgorICogICAgICAgICBKU1FSICAgICBKU1EzICAgICAgICAgICBMTF9BRENfSU5KX0NvbmZpZ1F1ZXVlQ29udGV4dFxuCisgKiAgICAgICAgIEpTUVIgICAgIEpTUTQgICAgICAgICAgIExMX0FEQ19JTkpfQ29uZmlnUXVldWVDb250ZXh0CisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcGFyYW0gIFRyaWdnZXJTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19TT0ZUV0FSRQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0xX1RSR08KKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMV9UUkdPMgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0xX0NIMyAgICAgICAgICgyKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0xX0NINAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0yX1RSR08KKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMl9DSDEgICAgICAgICAoMSkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNM19UUkdPCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTNfQ0gxICAgICAgICAgKDEpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTNfQ0gzICAgICAgICAgKDEpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTNfQ0g0ICAgICAgICAgKDEpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTRfVFJHTworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU00X0NIMyAgICAgICAgICgyKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU00X0NINCAgICAgICAgICgyKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU02X1RSR08KKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNN19UUkdPCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTThfVFJHTworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU04X1RSR08yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTThfQ0gyICAgICAgICAgKDIpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTThfQ0g0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTE1X1RSR08KKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMTZfQ0gxICAgICAgICAoMSkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMjBfVFJHTworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0yMF9UUkdPMgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0yMF9DSDIgICAgICAgICgyKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0yMF9DSDQgICAgICAgICgxKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9IUlRJTV9UUkcxICAgICAgICgyKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9IUlRJTV9UUkcyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX0hSVElNX1RSRzMgICAgICAgKDIpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX0hSVElNX1RSRzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfSFJUSU1fVFJHNQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9IUlRJTV9UUkc2CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX0hSVElNX1RSRzcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfSFJUSU1fVFJHOAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9IUlRJTV9UUkc5CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX0hSVElNX1RSRzEwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX0VYVElfTElORTMgICAgICAgKDIpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX0VYVElfTElORTE1ICAgICAgKDEpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX0xQVElNX09VVAorICoKKyAqICAgICAgICAgKDEpIE9uIFNUTTMyRzQgc2VyaWVzLCBwYXJhbWV0ZXIgbm90IGF2YWlsYWJsZSBvbiBhbGwgQURDIGluc3RhbmNlczoKKyAqIEFEQzEsIEFEQzIuXG4gKDIpIE9uIFNUTTMyRzQgc2VyaWVzLCBwYXJhbWV0ZXIgbm90IGF2YWlsYWJsZSBvbiBhbGwgQURDCisgKiBpbnN0YW5jZXM6IEFEQzMsIEFEQzQsIEFEQzUuIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBhbGwgQURDeCBhcmUgbm90IGF2YWlsYWJsZQorICogb24gYWxsIGRldmljZXMuIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIG1vcmUgZGV0YWlscy4KKyAqIEBwYXJhbSAgRXh0ZXJuYWxUcmlnZ2VyRWRnZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcKKyAqIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfUklTSU5HCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX0ZBTExJTkcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfUklTSU5HRkFMTElORworICoKKyAqICAgICAgICAgTm90ZTogVGhpcyBwYXJhbWV0ZXIgaXMgZGlzY2FyZGVkIGluIGNhc2Ugb2YgU1cgc3RhcnQ6CisgKiAgICAgICAgICAgICAgIHBhcmFtZXRlciAiVHJpZ2dlclNvdXJjZSIgc2V0IHRvICJMTF9BRENfSU5KX1RSSUdfU09GVFdBUkUiLgorICogQHBhcmFtICBTZXF1ZW5jZXJOYlJhbmtzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1NFUV9TQ0FOX0RJU0FCTEUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfU0VRX1NDQU5fRU5BQkxFXzJSQU5LUworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9TRVFfU0NBTl9FTkFCTEVfM1JBTktTCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1NFUV9TQ0FOX0VOQUJMRV80UkFOS1MKKyAqIEBwYXJhbSAgUmFuazFfQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMSAgICAgICAgICAgICAgICAgKDgpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8yICAgICAgICAgICAgICAgICAoOCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzMgICAgICAgICAgICAgICAgICg4KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNCAgICAgICAgICAgICAgICAgKDgpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF81ICAgICAgICAgICAgICAgICAoOCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE2CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQgICAgICAgICAgICg3KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUl9BREMxICAgKDEpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SX0FEQzUgICAoNSkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZCQVQgICAgICAgICAgICAgICg2KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QMSAgICAgICAgICAgKDEpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAyICAgICAgICAgICAoMikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDNfQURDMiAgICAgICgyKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QM19BREMzICAgICAgKDMpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVA0ICAgICAgICAgICAoNSkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDUgICAgICAgICAgICg1KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QNiAgICAgICAgICAgKDQpCisgKgorICogICAgICAgICAoMSkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMS5cbgorICogICAgICAgICAoMikgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMi5cbgorICogICAgICAgICAoMykgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMy5cbgorICogICAgICAgICAoNCkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDNC5cbgorICogICAgICAgICAoNSkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDNS5cbgorICogICAgICAgICAoNikgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZXM6IEFEQzEsCisgKiBBREMzLCBBREM1LlxuICg3KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlczoKKyAqIEFEQzEsIEFEQzMsIEFEQzQsIEFEQzUuXG4gT24gdGhpcyBTVE0zMiBzZXJpZXMsIGFsbCBBREN4IGFyZSBub3QgYXZhaWxhYmxlIG9uCisgKiBhbGwgZGV2aWNlcy4gUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgbW9yZSBkZXRhaWxzLiAoOCkgT24gU1RNMzJHNCwgZmFzdAorICogY2hhbm5lbCBhbGxvd3M6IDIuNSAoc2FtcGxpbmcpICsgMTIuNSAoY29udmVyc2lvbikgPSAxNSBBREMgY2xvY2sgY3ljbGVzCisgKiAoZkFEQykgdG8gY29udmVydCBpbiAxMi1iaXQgcmVzb2x1dGlvbi4gT3RoZXIgY2hhbm5lbHMgYXJlIHNsb3cgY2hhbm5lbHMKKyAqIGFsbG93czogNi41IChzYW1wbGluZykgKyAxMi41IChjb252ZXJzaW9uKSA9IDE5IEFEQyBjbG9jayBjeWNsZXMgKGZBREMpIHRvCisgKiBjb252ZXJ0IGluIDEyLWJpdCByZXNvbHV0aW9uLlxuCisgKiBAcGFyYW0gIFJhbmsyX0NoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEgICAgICAgICAgICAgICAgICg4KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMiAgICAgICAgICAgICAgICAgKDgpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8zICAgICAgICAgICAgICAgICAoOCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzQgICAgICAgICAgICAgICAgICg4KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNSAgICAgICAgICAgICAgICAgKDgpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF82CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF83CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF84CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF85CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE1CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE4CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WUkVGSU5UICAgICAgICAgICAoNykKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1JfQURDMSAgICgxKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUl9BREM1ICAgKDUpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WQkFUICAgICAgICAgICAgICAoNikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDEgICAgICAgICAgICgxKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QMiAgICAgICAgICAgKDIpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAzX0FEQzIgICAgICAoMikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDNfQURDMyAgICAgICgzKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QNCAgICAgICAgICAgKDUpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVA1ICAgICAgICAgICAoNSkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDYgICAgICAgICAgICg0KQorICoKKyAqICAgICAgICAgKDEpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzEuXG4KKyAqICAgICAgICAgKDIpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzIuXG4KKyAqICAgICAgICAgKDMpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzMuXG4KKyAqICAgICAgICAgKDQpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzQuXG4KKyAqICAgICAgICAgKDUpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzUuXG4KKyAqICAgICAgICAgKDYpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2VzOiBBREMxLAorICogQURDMywgQURDNS5cbiAoNykgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZXM6CisgKiBBREMxLCBBREMzLCBBREM0LCBBREM1LlxuIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBhbGwgQURDeCBhcmUgbm90IGF2YWlsYWJsZSBvbgorICogYWxsIGRldmljZXMuIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIG1vcmUgZGV0YWlscy4gKDgpIE9uIFNUTTMyRzQsIGZhc3QKKyAqIGNoYW5uZWwgYWxsb3dzOiAyLjUgKHNhbXBsaW5nKSArIDEyLjUgKGNvbnZlcnNpb24pID0gMTUgQURDIGNsb2NrIGN5Y2xlcworICogKGZBREMpIHRvIGNvbnZlcnQgaW4gMTItYml0IHJlc29sdXRpb24uIE90aGVyIGNoYW5uZWxzIGFyZSBzbG93IGNoYW5uZWxzCisgKiBhbGxvd3M6IDYuNSAoc2FtcGxpbmcpICsgMTIuNSAoY29udmVyc2lvbikgPSAxOSBBREMgY2xvY2sgY3ljbGVzIChmQURDKSB0bworICogY29udmVydCBpbiAxMi1iaXQgcmVzb2x1dGlvbi5cbgorICogQHBhcmFtICBSYW5rM19DaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8wCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xICAgICAgICAgICAgICAgICAoOCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzIgICAgICAgICAgICAgICAgICg4KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMyAgICAgICAgICAgICAgICAgKDgpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF80ICAgICAgICAgICAgICAgICAoOCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzUgICAgICAgICAgICAgICAgICg4KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzExCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE3CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xOAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVlJFRklOVCAgICAgICAgICAgKDcpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SX0FEQzEgICAoMSkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1JfQURDNSAgICg1KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVkJBVCAgICAgICAgICAgICAgKDYpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAxICAgICAgICAgICAoMSkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDIgICAgICAgICAgICgyKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QM19BREMyICAgICAgKDIpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAzX0FEQzMgICAgICAoMykKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDQgICAgICAgICAgICg1KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QNSAgICAgICAgICAgKDUpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVA2ICAgICAgICAgICAoNCkKKyAqCisgKiAgICAgICAgICgxKSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMxLlxuCisgKiAgICAgICAgICgyKSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMyLlxuCisgKiAgICAgICAgICgzKSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMzLlxuCisgKiAgICAgICAgICg0KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREM0LlxuCisgKiAgICAgICAgICg1KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREM1LlxuCisgKiAgICAgICAgICg2KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlczogQURDMSwKKyAqIEFEQzMsIEFEQzUuXG4gKDcpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2VzOgorICogQURDMSwgQURDMywgQURDNCwgQURDNS5cbiBPbiB0aGlzIFNUTTMyIHNlcmllcywgYWxsIEFEQ3ggYXJlIG5vdCBhdmFpbGFibGUgb24KKyAqIGFsbCBkZXZpY2VzLiBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBtb3JlIGRldGFpbHMuICg4KSBPbiBTVE0zMkc0LCBmYXN0CisgKiBjaGFubmVsIGFsbG93czogMi41IChzYW1wbGluZykgKyAxMi41IChjb252ZXJzaW9uKSA9IDE1IEFEQyBjbG9jayBjeWNsZXMKKyAqIChmQURDKSB0byBjb252ZXJ0IGluIDEyLWJpdCByZXNvbHV0aW9uLiBPdGhlciBjaGFubmVscyBhcmUgc2xvdyBjaGFubmVscworICogYWxsb3dzOiA2LjUgKHNhbXBsaW5nKSArIDEyLjUgKGNvbnZlcnNpb24pID0gMTkgQURDIGNsb2NrIGN5Y2xlcyAoZkFEQykgdG8KKyAqIGNvbnZlcnQgaW4gMTItYml0IHJlc29sdXRpb24uXG4KKyAqIEBwYXJhbSAgUmFuazRfQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMSAgICAgICAgICAgICAgICAgKDgpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8yICAgICAgICAgICAgICAgICAoOCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzMgICAgICAgICAgICAgICAgICg4KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNCAgICAgICAgICAgICAgICAgKDgpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF81ICAgICAgICAgICAgICAgICAoOCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE2CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQgICAgICAgICAgICg3KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUl9BREMxICAgKDEpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SX0FEQzUgICAoNSkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZCQVQgICAgICAgICAgICAgICg2KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QMSAgICAgICAgICAgKDEpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAyICAgICAgICAgICAoMikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDNfQURDMiAgICAgICgyKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QM19BREMzICAgICAgKDMpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVA0ICAgICAgICAgICAoNSkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDUgICAgICAgICAgICg1KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QNiAgICAgICAgICAgKDQpCisgKgorICogICAgICAgICAoMSkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMS5cbgorICogICAgICAgICAoMikgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMi5cbgorICogICAgICAgICAoMykgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMy5cbgorICogICAgICAgICAoNCkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDNC5cbgorICogICAgICAgICAoNSkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDNS5cbgorICogICAgICAgICAoNikgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZXM6IEFEQzEsCisgKiBBREMzLCBBREM1LlxuICg3KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlczoKKyAqIEFEQzEsIEFEQzMsIEFEQzQsIEFEQzUuXG4gT24gdGhpcyBTVE0zMiBzZXJpZXMsIGFsbCBBREN4IGFyZSBub3QgYXZhaWxhYmxlIG9uCisgKiBhbGwgZGV2aWNlcy4gUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgbW9yZSBkZXRhaWxzLiAoOCkgT24gU1RNMzJHNCwgZmFzdAorICogY2hhbm5lbCBhbGxvd3M6IDIuNSAoc2FtcGxpbmcpICsgMTIuNSAoY29udmVyc2lvbikgPSAxNSBBREMgY2xvY2sgY3ljbGVzCisgKiAoZkFEQykgdG8gY29udmVydCBpbiAxMi1iaXQgcmVzb2x1dGlvbi4gT3RoZXIgY2hhbm5lbHMgYXJlIHNsb3cgY2hhbm5lbHMKKyAqIGFsbG93czogNi41IChzYW1wbGluZykgKyAxMi41IChjb252ZXJzaW9uKSA9IDE5IEFEQyBjbG9jayBjeWNsZXMgKGZBREMpIHRvCisgKiBjb252ZXJ0IGluIDEyLWJpdCByZXNvbHV0aW9uLlxuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0lOSl9Db25maWdRdWV1ZUNvbnRleHQoCisgICAgQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IFRyaWdnZXJTb3VyY2UsIHVpbnQzMl90IEV4dGVybmFsVHJpZ2dlckVkZ2UsCisgICAgdWludDMyX3QgU2VxdWVuY2VyTmJSYW5rcywgdWludDMyX3QgUmFuazFfQ2hhbm5lbCwgdWludDMyX3QgUmFuazJfQ2hhbm5lbCwKKyAgICB1aW50MzJfdCBSYW5rM19DaGFubmVsLCB1aW50MzJfdCBSYW5rNF9DaGFubmVsKSB7CisgIC8qIFNldCBiaXRzIHdpdGggY29udGVudCBvZiBwYXJhbWV0ZXIgIlJhbmt4X0NoYW5uZWwiIHdpdGggYml0cyBwb3NpdGlvbiAgICAqLworICAvKiBpbiByZWdpc3RlciBkZXBlbmRpbmcgb24gbGl0ZXJhbCAiTExfQURDX0lOSl9SQU5LX3giLiAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogUGFyYW1ldGVycyAiUmFua3hfQ2hhbm5lbCIgYW5kICJMTF9BRENfSU5KX1JBTktfeCIgYXJlIHVzZWQgd2l0aCBtYXNrcyAgICovCisgIC8qIGJlY2F1c2UgY29udGFpbmluZyBvdGhlciBiaXRzIHJlc2VydmVkIGZvciBvdGhlciBwdXJwb3NlLiAgICAgICAgICAgICAgICAqLworICAvKiBJZiBwYXJhbWV0ZXIgIlRyaWdnZXJTb3VyY2UiIGlzIHNldCB0byBTVyBzdGFydCwgdGhlbiBwYXJhbWV0ZXIgICAgICAgICAgKi8KKyAgLyogIkV4dGVybmFsVHJpZ2dlckVkZ2UiIGlzIGRpc2NhcmRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHVpbnQzMl90IGlzX3RyaWdnZXJfbm90X3N3ID0KKyAgICAgICh1aW50MzJfdCkoKFRyaWdnZXJTb3VyY2UgIT0gTExfQURDX0lOSl9UUklHX1NPRlRXQVJFKSA/IDFVTCA6IDBVTCk7CisgIE1PRElGWV9SRUcoQURDeC0+SlNRUiwKKyAgICAgICAgICAgICBBRENfSlNRUl9KRVhUU0VMIHwgQURDX0pTUVJfSkVYVEVOIHwgQURDX0pTUVJfSlNRNCB8CisgICAgICAgICAgICAgICAgIEFEQ19KU1FSX0pTUTMgfCBBRENfSlNRUl9KU1EyIHwgQURDX0pTUVJfSlNRMSB8IEFEQ19KU1FSX0pMLAorICAgICAgICAgICAgIChUcmlnZ2VyU291cmNlICYgQURDX0pTUVJfSkVYVFNFTCkgfAorICAgICAgICAgICAgICAgICAoRXh0ZXJuYWxUcmlnZ2VyRWRnZSAqIChpc190cmlnZ2VyX25vdF9zdykpIHwKKyAgICAgICAgICAgICAgICAgKCgoUmFuazRfQ2hhbm5lbCAmIEFEQ19DSEFOTkVMX0lEX05VTUJFUl9NQVNLKSA+PgorICAgICAgICAgICAgICAgICAgIEFEQ19DSEFOTkVMX0lEX05VTUJFUl9CSVRPRkZTRVRfUE9TKQorICAgICAgICAgICAgICAgICAgPDwgKExMX0FEQ19JTkpfUkFOS180ICYgQURDX0lOSl9SQU5LX0lEX0pTUVJfTUFTSykpIHwKKyAgICAgICAgICAgICAgICAgKCgoUmFuazNfQ2hhbm5lbCAmIEFEQ19DSEFOTkVMX0lEX05VTUJFUl9NQVNLKSA+PgorICAgICAgICAgICAgICAgICAgIEFEQ19DSEFOTkVMX0lEX05VTUJFUl9CSVRPRkZTRVRfUE9TKQorICAgICAgICAgICAgICAgICAgPDwgKExMX0FEQ19JTkpfUkFOS18zICYgQURDX0lOSl9SQU5LX0lEX0pTUVJfTUFTSykpIHwKKyAgICAgICAgICAgICAgICAgKCgoUmFuazJfQ2hhbm5lbCAmIEFEQ19DSEFOTkVMX0lEX05VTUJFUl9NQVNLKSA+PgorICAgICAgICAgICAgICAgICAgIEFEQ19DSEFOTkVMX0lEX05VTUJFUl9CSVRPRkZTRVRfUE9TKQorICAgICAgICAgICAgICAgICAgPDwgKExMX0FEQ19JTkpfUkFOS18yICYgQURDX0lOSl9SQU5LX0lEX0pTUVJfTUFTSykpIHwKKyAgICAgICAgICAgICAgICAgKCgoUmFuazFfQ2hhbm5lbCAmIEFEQ19DSEFOTkVMX0lEX05VTUJFUl9NQVNLKSA+PgorICAgICAgICAgICAgICAgICAgIEFEQ19DSEFOTkVMX0lEX05VTUJFUl9CSVRPRkZTRVRfUE9TKQorICAgICAgICAgICAgICAgICAgPDwgKExMX0FEQ19JTkpfUkFOS18xICYgQURDX0lOSl9SQU5LX0lEX0pTUVJfTUFTSykpIHwKKyAgICAgICAgICAgICAgICAgU2VxdWVuY2VyTmJSYW5rcyk7Cit9CisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FRl9Db25maWd1cmF0aW9uX0NoYW5uZWxzIENvbmZpZ3VyYXRpb24gb2YgQURDIGhpZXJhcmNoaWNhbAorICogc2NvcGU6IGNoYW5uZWxzCisgKiBAeworICovCisKKy8qKgorICogQGJyaWVmICBTZXQgc2FtcGxpbmcgdGltZSBvZiB0aGUgc2VsZWN0ZWQgQURDIGNoYW5uZWwKKyAqICAgICAgICAgVW5pdDogQURDIGNsb2NrIGN5Y2xlcy4KKyAqIEBub3RlICAgT24gdGhpcyBkZXZpY2UsIHNhbXBsaW5nIHRpbWUgaXMgb24gY2hhbm5lbCBzY29wZTogaW5kZXBlbmRlbnRseQorICogICAgICAgICBvZiBjaGFubmVsIG1hcHBlZCBvbiBBREMgZ3JvdXAgcmVndWxhciBvciBpbmplY3RlZC4KKyAqIEBub3RlICAgSW4gY2FzZSBvZiBpbnRlcm5hbCBjaGFubmVsIChWcmVmSW50LCBUZW1wU2Vuc29yLCAuLi4pIHRvIGJlCisgKiAgICAgICAgIGNvbnZlcnRlZDoKKyAqICAgICAgICAgc2FtcGxpbmcgdGltZSBjb25zdHJhaW50cyBtdXN0IGJlIHJlc3BlY3RlZCAoc2FtcGxpbmcgdGltZSBjYW4gYmUKKyAqICAgICAgICAgYWRqdXN0ZWQgaW4gZnVuY3Rpb24gb2YgQURDIGNsb2NrIGZyZXF1ZW5jeSBhbmQgc2FtcGxpbmcgdGltZQorICogICAgICAgICBzZXR0aW5nKS4KKyAqICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgdGltaW5ncyB2YWx1ZXMgKHBhcmFtZXRlcnMgVFNfdnJlZmludCwKKyAqICAgICAgICAgVFNfdGVtcCwgLi4uKS4KKyAqIEBub3RlICAgQ29udmVyc2lvbiB0aW1lIGlzIHRoZSBhZGRpdGlvbiBvZiBzYW1wbGluZyB0aW1lIGFuZCBwcm9jZXNzaW5nIHRpbWUuCisgKiAgICAgICAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBBREMgcHJvY2Vzc2luZyB0aW1lIGlzOgorICogICAgICAgICAtIDEyLjUgQURDIGNsb2NrIGN5Y2xlcyBhdCBBREMgcmVzb2x1dGlvbiAxMiBiaXRzCisgKiAgICAgICAgIC0gMTAuNSBBREMgY2xvY2sgY3ljbGVzIGF0IEFEQyByZXNvbHV0aW9uIDEwIGJpdHMKKyAqICAgICAgICAgLSA4LjUgQURDIGNsb2NrIGN5Y2xlcyBhdCBBREMgcmVzb2x1dGlvbiA4IGJpdHMKKyAqICAgICAgICAgLSA2LjUgQURDIGNsb2NrIGN5Y2xlcyBhdCBBREMgcmVzb2x1dGlvbiA2IGJpdHMKKyAqIEBub3RlICAgSW4gY2FzZSBvZiBBREMgY29udmVyc2lvbiBvZiBpbnRlcm5hbCBjaGFubmVsIChWcmVmSW50LAorICogICAgICAgICB0ZW1wZXJhdHVyZSBzZW5zb3IsIC4uLiksIGEgc2FtcGxpbmcgdGltZSBtaW5pbXVtIHZhbHVlCisgKiAgICAgICAgIGlzIHJlcXVpcmVkLgorICogICAgICAgICBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0LgorICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllcywgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAqICAgICAgICAgQURDIHN0YXRlOgorICogICAgICAgICBBREMgbXVzdCBiZSBkaXNhYmxlZCBvciBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZworICogICAgICAgICBvbiBlaXRoZXIgZ3JvdXBzIHJlZ3VsYXIgb3IgaW5qZWN0ZWQuCisgKiBAcm10b2xsIFNNUFIxICAgIFNNUDAgICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAqICAgICAgICAgU01QUjEgICAgU01QMSAgICAgICAgICAgTExfQURDX1NldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICogICAgICAgICBTTVBSMSAgICBTTVAyICAgICAgICAgICBMTF9BRENfU2V0Q2hhbm5lbFNhbXBsaW5nVGltZVxuCisgKiAgICAgICAgIFNNUFIxICAgIFNNUDMgICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAqICAgICAgICAgU01QUjEgICAgU01QNCAgICAgICAgICAgTExfQURDX1NldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICogICAgICAgICBTTVBSMSAgICBTTVA1ICAgICAgICAgICBMTF9BRENfU2V0Q2hhbm5lbFNhbXBsaW5nVGltZVxuCisgKiAgICAgICAgIFNNUFIxICAgIFNNUDYgICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAqICAgICAgICAgU01QUjEgICAgU01QNyAgICAgICAgICAgTExfQURDX1NldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICogICAgICAgICBTTVBSMSAgICBTTVA4ICAgICAgICAgICBMTF9BRENfU2V0Q2hhbm5lbFNhbXBsaW5nVGltZVxuCisgKiAgICAgICAgIFNNUFIxICAgIFNNUDkgICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAqICAgICAgICAgU01QUjIgICAgU01QMTAgICAgICAgICAgTExfQURDX1NldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICogICAgICAgICBTTVBSMiAgICBTTVAxMSAgICAgICAgICBMTF9BRENfU2V0Q2hhbm5lbFNhbXBsaW5nVGltZVxuCisgKiAgICAgICAgIFNNUFIyICAgIFNNUDEyICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAqICAgICAgICAgU01QUjIgICAgU01QMTMgICAgICAgICAgTExfQURDX1NldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICogICAgICAgICBTTVBSMiAgICBTTVAxNCAgICAgICAgICBMTF9BRENfU2V0Q2hhbm5lbFNhbXBsaW5nVGltZVxuCisgKiAgICAgICAgIFNNUFIyICAgIFNNUDE1ICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAqICAgICAgICAgU01QUjIgICAgU01QMTYgICAgICAgICAgTExfQURDX1NldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICogICAgICAgICBTTVBSMiAgICBTTVAxNyAgICAgICAgICBMTF9BRENfU2V0Q2hhbm5lbFNhbXBsaW5nVGltZVxuCisgKiAgICAgICAgIFNNUFIyICAgIFNNUDE4ICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lCisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEgICAgICAgICAgICAgICAgICg4KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMiAgICAgICAgICAgICAgICAgKDgpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8zICAgICAgICAgICAgICAgICAoOCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzQgICAgICAgICAgICAgICAgICg4KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNSAgICAgICAgICAgICAgICAgKDgpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF82CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF83CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF84CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF85CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE1CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE4CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WUkVGSU5UICAgICAgICAgICAoNykKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1JfQURDMSAgICgxKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUl9BREM1ICAgKDUpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WQkFUICAgICAgICAgICAgICAoNikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDEgICAgICAgICAgICgxKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QMiAgICAgICAgICAgKDIpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAzX0FEQzIgICAgICAoMikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDNfQURDMyAgICAgICgzKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QNCAgICAgICAgICAgKDUpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVA1ICAgICAgICAgICAoNSkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDYgICAgICAgICAgICg0KQorICoKKyAqICAgICAgICAgKDEpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzEuXG4KKyAqICAgICAgICAgKDIpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzIuXG4KKyAqICAgICAgICAgKDMpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzMuXG4KKyAqICAgICAgICAgKDQpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzQuXG4KKyAqICAgICAgICAgKDUpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzUuXG4KKyAqICAgICAgICAgKDYpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2VzOiBBREMxLAorICogQURDMywgQURDNS5cbiAoNykgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZXM6CisgKiBBREMxLCBBREMzLCBBREM0LCBBREM1LlxuIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBhbGwgQURDeCBhcmUgbm90IGF2YWlsYWJsZSBvbgorICogYWxsIGRldmljZXMuIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIG1vcmUgZGV0YWlscy4gKDgpIE9uIFNUTTMyRzQsIGZhc3QKKyAqIGNoYW5uZWwgYWxsb3dzOiAyLjUgKHNhbXBsaW5nKSArIDEyLjUgKGNvbnZlcnNpb24pID0gMTUgQURDIGNsb2NrIGN5Y2xlcworICogKGZBREMpIHRvIGNvbnZlcnQgaW4gMTItYml0IHJlc29sdXRpb24uIE90aGVyIGNoYW5uZWxzIGFyZSBzbG93IGNoYW5uZWxzCisgKiBhbGxvd3M6IDYuNSAoc2FtcGxpbmcpICsgMTIuNSAoY29udmVyc2lvbikgPSAxOSBBREMgY2xvY2sgY3ljbGVzIChmQURDKSB0bworICogY29udmVydCBpbiAxMi1iaXQgcmVzb2x1dGlvbi5cbgorICogQHBhcmFtICBTYW1wbGluZ1RpbWUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19TQU1QTElOR1RJTUVfMkNZQ0xFU181ICAgKDEpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfU0FNUExJTkdUSU1FXzZDWUNMRVNfNQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1NBTVBMSU5HVElNRV8xMkNZQ0xFU181CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfU0FNUExJTkdUSU1FXzI0Q1lDTEVTXzUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19TQU1QTElOR1RJTUVfNDdDWUNMRVNfNQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1NBTVBMSU5HVElNRV85MkNZQ0xFU181CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfU0FNUExJTkdUSU1FXzI0N0NZQ0xFU181CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfU0FNUExJTkdUSU1FXzY0MENZQ0xFU181CisgKgorICogICAgICAgICAoMSkgT24gc29tZSBkZXZpY2VzLCBBREMgc2FtcGxpbmcgdGltZSAyLjUgQURDIGNsb2NrIGN5Y2xlcworICogICAgICAgICAgICAgY2FuIGJlIHJlcGxhY2VkIGJ5IDMuNSBBREMgY2xvY2sgY3ljbGVzLgorICogICAgICAgICAgICAgUmVmZXIgdG8gZnVuY3Rpb24gQHJlZiBMTF9BRENfU2V0U2FtcGxpbmdUaW1lQ29tbW9uQ29uZmlnKCkuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1NldENoYW5uZWxTYW1wbGluZ1RpbWUoQURDX1R5cGVEZWYgKkFEQ3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgU2FtcGxpbmdUaW1lKSB7CisgIC8qIFNldCBiaXRzIHdpdGggY29udGVudCBvZiBwYXJhbWV0ZXIgIlNhbXBsaW5nVGltZSIgd2l0aCBiaXRzIHBvc2l0aW9uICAgICAqLworICAvKiBpbiByZWdpc3RlciBhbmQgcmVnaXN0ZXIgcG9zaXRpb24gZGVwZW5kaW5nIG9uIHBhcmFtZXRlciAiQ2hhbm5lbCIuICAgICAgKi8KKyAgLyogUGFyYW1ldGVyICJDaGFubmVsIiBpcyB1c2VkIHdpdGggbWFza3MgYmVjYXVzZSBjb250YWluaW5nICAgICAgICAgICAgICAgICovCisgIC8qIG90aGVyIGJpdHMgcmVzZXJ2ZWQgZm9yIG90aGVyIHB1cnBvc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBfX0lPIHVpbnQzMl90ICpwcmVnID0gX19BRENfUFRSX1JFR19PRkZTRVQoCisgICAgICBBREN4LT5TTVBSMSwgKChDaGFubmVsICYgQURDX0NIQU5ORUxfU01QUlhfUkVHT0ZGU0VUX01BU0spID4+CisgICAgICAgICAgICAgICAgICAgIEFEQ19TTVBSWF9SRUdPRkZTRVRfUE9TKSk7CisKKyAgTU9ESUZZX1JFRygqcHJlZywKKyAgICAgICAgICAgICBBRENfU01QUjFfU01QMCA8PCAoKENoYW5uZWwgJiBBRENfQ0hBTk5FTF9TTVB4X0JJVE9GRlNFVF9NQVNLKSA+PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0hBTk5FTF9TTVB4X0JJVE9GRlNFVF9QT1MpLAorICAgICAgICAgICAgIFNhbXBsaW5nVGltZSA8PCAoKENoYW5uZWwgJiBBRENfQ0hBTk5FTF9TTVB4X0JJVE9GRlNFVF9NQVNLKSA+PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NIQU5ORUxfU01QeF9CSVRPRkZTRVRfUE9TKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgc2FtcGxpbmcgdGltZSBvZiB0aGUgc2VsZWN0ZWQgQURDIGNoYW5uZWwKKyAqICAgICAgICAgVW5pdDogQURDIGNsb2NrIGN5Y2xlcy4KKyAqIEBub3RlICAgT24gdGhpcyBkZXZpY2UsIHNhbXBsaW5nIHRpbWUgaXMgb24gY2hhbm5lbCBzY29wZTogaW5kZXBlbmRlbnRseQorICogICAgICAgICBvZiBjaGFubmVsIG1hcHBlZCBvbiBBREMgZ3JvdXAgcmVndWxhciBvciBpbmplY3RlZC4KKyAqIEBub3RlICAgQ29udmVyc2lvbiB0aW1lIGlzIHRoZSBhZGRpdGlvbiBvZiBzYW1wbGluZyB0aW1lIGFuZCBwcm9jZXNzaW5nIHRpbWUuCisgKiAgICAgICAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBBREMgcHJvY2Vzc2luZyB0aW1lIGlzOgorICogICAgICAgICAtIDEyLjUgQURDIGNsb2NrIGN5Y2xlcyBhdCBBREMgcmVzb2x1dGlvbiAxMiBiaXRzCisgKiAgICAgICAgIC0gMTAuNSBBREMgY2xvY2sgY3ljbGVzIGF0IEFEQyByZXNvbHV0aW9uIDEwIGJpdHMKKyAqICAgICAgICAgLSA4LjUgQURDIGNsb2NrIGN5Y2xlcyBhdCBBREMgcmVzb2x1dGlvbiA4IGJpdHMKKyAqICAgICAgICAgLSA2LjUgQURDIGNsb2NrIGN5Y2xlcyBhdCBBREMgcmVzb2x1dGlvbiA2IGJpdHMKKyAqIEBybXRvbGwgU01QUjEgICAgU01QMCAgICAgICAgICAgTExfQURDX0dldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICogICAgICAgICBTTVBSMSAgICBTTVAxICAgICAgICAgICBMTF9BRENfR2V0Q2hhbm5lbFNhbXBsaW5nVGltZVxuCisgKiAgICAgICAgIFNNUFIxICAgIFNNUDIgICAgICAgICAgIExMX0FEQ19HZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAqICAgICAgICAgU01QUjEgICAgU01QMyAgICAgICAgICAgTExfQURDX0dldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICogICAgICAgICBTTVBSMSAgICBTTVA0ICAgICAgICAgICBMTF9BRENfR2V0Q2hhbm5lbFNhbXBsaW5nVGltZVxuCisgKiAgICAgICAgIFNNUFIxICAgIFNNUDUgICAgICAgICAgIExMX0FEQ19HZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAqICAgICAgICAgU01QUjEgICAgU01QNiAgICAgICAgICAgTExfQURDX0dldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICogICAgICAgICBTTVBSMSAgICBTTVA3ICAgICAgICAgICBMTF9BRENfR2V0Q2hhbm5lbFNhbXBsaW5nVGltZVxuCisgKiAgICAgICAgIFNNUFIxICAgIFNNUDggICAgICAgICAgIExMX0FEQ19HZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAqICAgICAgICAgU01QUjEgICAgU01QOSAgICAgICAgICAgTExfQURDX0dldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICogICAgICAgICBTTVBSMiAgICBTTVAxMCAgICAgICAgICBMTF9BRENfR2V0Q2hhbm5lbFNhbXBsaW5nVGltZVxuCisgKiAgICAgICAgIFNNUFIyICAgIFNNUDExICAgICAgICAgIExMX0FEQ19HZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAqICAgICAgICAgU01QUjIgICAgU01QMTIgICAgICAgICAgTExfQURDX0dldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICogICAgICAgICBTTVBSMiAgICBTTVAxMyAgICAgICAgICBMTF9BRENfR2V0Q2hhbm5lbFNhbXBsaW5nVGltZVxuCisgKiAgICAgICAgIFNNUFIyICAgIFNNUDE0ICAgICAgICAgIExMX0FEQ19HZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAqICAgICAgICAgU01QUjIgICAgU01QMTUgICAgICAgICAgTExfQURDX0dldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICogICAgICAgICBTTVBSMiAgICBTTVAxNiAgICAgICAgICBMTF9BRENfR2V0Q2hhbm5lbFNhbXBsaW5nVGltZVxuCisgKiAgICAgICAgIFNNUFIyICAgIFNNUDE3ICAgICAgICAgIExMX0FEQ19HZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAqICAgICAgICAgU01QUjIgICAgU01QMTggICAgICAgICAgTExfQURDX0dldENoYW5uZWxTYW1wbGluZ1RpbWUKKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMSAgICAgICAgICAgICAgICAgKDgpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8yICAgICAgICAgICAgICAgICAoOCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzMgICAgICAgICAgICAgICAgICg4KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNCAgICAgICAgICAgICAgICAgKDgpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF81ICAgICAgICAgICAgICAgICAoOCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE2CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQgICAgICAgICAgICg3KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUl9BREMxICAgKDEpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SX0FEQzUgICAoNSkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZCQVQgICAgICAgICAgICAgICg2KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QMSAgICAgICAgICAgKDEpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVAyICAgICAgICAgICAoMikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDNfQURDMiAgICAgICgyKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QM19BREMzICAgICAgKDMpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WT1BBTVA0ICAgICAgICAgICAoNSkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZPUEFNUDUgICAgICAgICAgICg1KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVk9QQU1QNiAgICAgICAgICAgKDQpCisgKgorICogICAgICAgICAoMSkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMS5cbgorICogICAgICAgICAoMikgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMi5cbgorICogICAgICAgICAoMykgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMy5cbgorICogICAgICAgICAoNCkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDNC5cbgorICogICAgICAgICAoNSkgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDNS5cbgorICogICAgICAgICAoNikgT24gU1RNMzJHNCwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZXM6IEFEQzEsCisgKiBBREMzLCBBREM1LlxuICg3KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlczoKKyAqIEFEQzEsIEFEQzMsIEFEQzQsIEFEQzUuXG4gT24gdGhpcyBTVE0zMiBzZXJpZXMsIGFsbCBBREN4IGFyZSBub3QgYXZhaWxhYmxlIG9uCisgKiBhbGwgZGV2aWNlcy4gUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgbW9yZSBkZXRhaWxzLiAoOCkgT24gU1RNMzJHNCwgZmFzdAorICogY2hhbm5lbCBhbGxvd3M6IDIuNSAoc2FtcGxpbmcpICsgMTIuNSAoY29udmVyc2lvbikgPSAxNSBBREMgY2xvY2sgY3ljbGVzCisgKiAoZkFEQykgdG8gY29udmVydCBpbiAxMi1iaXQgcmVzb2x1dGlvbi4gT3RoZXIgY2hhbm5lbHMgYXJlIHNsb3cgY2hhbm5lbHMKKyAqIGFsbG93czogNi41IChzYW1wbGluZykgKyAxMi41IChjb252ZXJzaW9uKSA9IDE5IEFEQyBjbG9jayBjeWNsZXMgKGZBREMpIHRvCisgKiBjb252ZXJ0IGluIDEyLWJpdCByZXNvbHV0aW9uLlxuCisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfU0FNUExJTkdUSU1FXzJDWUNMRVNfNSAgICgxKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1NBTVBMSU5HVElNRV82Q1lDTEVTXzUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19TQU1QTElOR1RJTUVfMTJDWUNMRVNfNQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1NBTVBMSU5HVElNRV8yNENZQ0xFU181CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfU0FNUExJTkdUSU1FXzQ3Q1lDTEVTXzUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19TQU1QTElOR1RJTUVfOTJDWUNMRVNfNQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1NBTVBMSU5HVElNRV8yNDdDWUNMRVNfNQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1NBTVBMSU5HVElNRV82NDBDWUNMRVNfNQorICoKKyAqICAgICAgICAgKDEpIE9uIHNvbWUgZGV2aWNlcywgQURDIHNhbXBsaW5nIHRpbWUgMi41IEFEQyBjbG9jayBjeWNsZXMKKyAqICAgICAgICAgICAgIGNhbiBiZSByZXBsYWNlZCBieSAzLjUgQURDIGNsb2NrIGN5Y2xlcy4KKyAqICAgICAgICAgICAgIFJlZmVyIHRvIGZ1bmN0aW9uIEByZWYgTExfQURDX1NldFNhbXBsaW5nVGltZUNvbW1vbkNvbmZpZygpLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0dldENoYW5uZWxTYW1wbGluZ1RpbWUoY29uc3QgQURDX1R5cGVEZWYgKkFEQ3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCkgeworICBjb25zdCBfX0lPIHVpbnQzMl90ICpwcmVnID0gX19BRENfUFRSX1JFR19PRkZTRVQoCisgICAgICBBREN4LT5TTVBSMSwgKChDaGFubmVsICYgQURDX0NIQU5ORUxfU01QUlhfUkVHT0ZGU0VUX01BU0spID4+CisgICAgICAgICAgICAgICAgICAgIEFEQ19TTVBSWF9SRUdPRkZTRVRfUE9TKSk7CisKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoKnByZWcsIEFEQ19TTVBSMV9TTVAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKChDaGFubmVsICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX01BU0spID4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX1BPUykpID4+CisgICAgICAgICAgICAgICAgICAgICgoQ2hhbm5lbCAmIEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX01BU0spID4+CisgICAgICAgICAgICAgICAgICAgICBBRENfQ0hBTk5FTF9TTVB4X0JJVE9GRlNFVF9QT1MpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFNldCBtb2RlIHNpbmdsZS1lbmRlZCBvciBkaWZmZXJlbnRpYWwgaW5wdXQgb2YgdGhlIHNlbGVjdGVkCisgKiAgICAgICAgIEFEQyBjaGFubmVsLgorICogQG5vdGUgICBDaGFubmVsIGVuZGluZyBpcyBvbiBjaGFubmVsIHNjb3BlOiBpbmRlcGVuZGVudGx5IG9mIGNoYW5uZWwgbWFwcGVkCisgKiAgICAgICAgIG9uIEFEQyBncm91cCByZWd1bGFyIG9yIGluamVjdGVkLgorICogICAgICAgICBJbiBkaWZmZXJlbnRpYWwgbW9kZTogRGlmZmVyZW50aWFsIG1lYXN1cmVtZW50IGlzIGNhcnJpZWQgb3V0CisgKiAgICAgICAgIGJldHdlZW4gdGhlIHNlbGVjdGVkIGNoYW5uZWwgJ2knIChwb3NpdGl2ZSBpbnB1dCkgYW5kCisgKiAgICAgICAgIGNoYW5uZWwgJ2krMScgKG5lZ2F0aXZlIGlucHV0KS4gT25seSBjaGFubmVsICdpJyBoYXMgdG8gYmUKKyAqICAgICAgICAgY29uZmlndXJlZCwgY2hhbm5lbCAnaSsxJyBpcyBjb25maWd1cmVkIGF1dG9tYXRpY2FsbHkuCisgKiBAbm90ZSAgIFJlZmVyIHRvIFJlZmVyZW5jZSBNYW51YWwgdG8gZW5zdXJlIHRoZSBzZWxlY3RlZCBjaGFubmVsIGlzCisgKiAgICAgICAgIGF2YWlsYWJsZSBpbiBkaWZmZXJlbnRpYWwgbW9kZS4KKyAqICAgICAgICAgRm9yIGV4YW1wbGUsIGludGVybmFsIGNoYW5uZWxzIChWcmVmSW50LCBUZW1wU2Vuc29yLCAuLi4pIGFyZQorICogICAgICAgICBub3QgYXZhaWxhYmxlIGluIGRpZmZlcmVudGlhbCBtb2RlLgorICogQG5vdGUgICBXaGVuIGNvbmZpZ3VyaW5nIGEgY2hhbm5lbCAnaScgaW4gZGlmZmVyZW50aWFsIG1vZGUsCisgKiAgICAgICAgIHRoZSBjaGFubmVsICdpKzEnIGlzIG5vdCB1c2FibGUgc2VwYXJhdGVseS4KKyAqIEBub3RlICAgT24gU1RNMzJHNCwgc29tZSBjaGFubmVscyBhcmUgaW50ZXJuYWxseSBmaXhlZCB0byBzaW5nbGUtZW5kZWQgaW5wdXRzCisgKiAgICAgICAgIGNvbmZpZ3VyYXRpb246CisgKiAgICAgICAgIC0gQURDMTogQ2hhbm5lbHMgMTIsIDE1LCAxNiwgMTcgYW5kIDE4CisgKiAgICAgICAgIC0gQURDMjogQ2hhbm5lbHMgMTUsIDE3IGFuZCAxOAorICogICAgICAgICAtIEFEQzM6IENoYW5uZWxzIDEyLCAxNiwgMTcgYW5kIDE4ICAgICAgICAgICAgKDEpCisgKiAgICAgICAgIC0gQURDNDogQ2hhbm5lbHMgMTYsIDE3IGFuZCAxOCAgICAgICAgICAgICAgICAoMSkKKyAqICAgICAgICAgLSBBREM1OiBDaGFubmVscyAyLCAzLCA0LCAxNiwgMTcgYW5kIDE4ICAgICAgICgxKQorICogICAgICAgICAoMSkgQURDMy80LzUgYXJlIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMsIHJlZmVyIHRvIGRldmljZQorICogZGF0YXNoZWV0IGZvciBtb3JlIGRldGFpbHMuCisgKiBAbm90ZSAgIEZvciBBREMgY2hhbm5lbHMgY29uZmlndXJlZCBpbiBkaWZmZXJlbnRpYWwgbW9kZSwgYm90aCBpbnB1dHMKKyAqICAgICAgICAgc2hvdWxkIGJlIGJpYXNlZCBhdCAoVnJlZispLzIgKy8tMjAwbVYuCisgKiAgICAgICAgIChWcmVmKyBpcyB0aGUgYW5hbG9nIHZvbHRhZ2UgcmVmZXJlbmNlKQorICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllcywgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAqICAgICAgICAgQURDIHN0YXRlOgorICogICAgICAgICBBREMgbXVzdCBiZSBBREMgZGlzYWJsZWQuCisgKiBAbm90ZSAgIE9uZSBvciBzZXZlcmFsIHZhbHVlcyBjYW4gYmUgc2VsZWN0ZWQuCisgKiAgICAgICAgIEV4YW1wbGU6IChMTF9BRENfQ0hBTk5FTF80IHwgTExfQURDX0NIQU5ORUxfMTIgfCAuLi4pCisgKiBAcm10b2xsIERJRlNFTCAgIERJRlNFTCAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2luZ2xlRGlmZgorICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8zCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF80CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF81CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF82CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF83CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF84CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF85CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE1CisgKiBAcGFyYW0gIFNpbmdsZURpZmYgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZworICogdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1NJTkdMRV9FTkRFRAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0RJRkZFUkVOVElBTF9FTkRFRAorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19TZXRDaGFubmVsU2luZ2xlRGlmZihBRENfVHlwZURlZiAqQURDeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFNpbmdsZURpZmYpIHsKKyAgLyogQml0cyBvZiBjaGFubmVscyBpbiBzaW5nbGUgb3IgZGlmZmVyZW50aWFsIG1vZGUgYXJlIHNldCBvbmx5IGZvciAgICAgICAgICovCisgIC8qIGRpZmZlcmVudGlhbCBtb2RlIChmb3Igc2luZ2xlIG1vZGUsIG1hc2sgb2YgYml0cyBhbGxvd2VkIHRvIGJlIHNldCBpcyAgICAqLworICAvKiBzaGlmdGVkIG91dCBvZiByYW5nZSBvZiBiaXRzIG9mIGNoYW5uZWxzIGluIHNpbmdsZSBvciBkaWZmZXJlbnRpYWwgbW9kZS4gKi8KKyAgTU9ESUZZX1JFRyhBREN4LT5ESUZTRUwsIENoYW5uZWwgJiBBRENfU0lOR0xFRElGRl9DSEFOTkVMX01BU0ssCisgICAgICAgICAgICAgKENoYW5uZWwgJiBBRENfU0lOR0xFRElGRl9DSEFOTkVMX01BU0spICYKKyAgICAgICAgICAgICAgICAgKEFEQ19ESUZTRUxfRElGU0VMID4+CisgICAgICAgICAgICAgICAgICAoU2luZ2xlRGlmZiAmIEFEQ19TSU5HTEVESUZGX0NIQU5ORUxfU0hJRlRfTUFTSykpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBtb2RlIHNpbmdsZS1lbmRlZCBvciBkaWZmZXJlbnRpYWwgaW5wdXQgb2YgdGhlIHNlbGVjdGVkCisgKiAgICAgICAgIEFEQyBjaGFubmVsLgorICogQG5vdGUgICBXaGVuIGNvbmZpZ3VyaW5nIGEgY2hhbm5lbCAnaScgaW4gZGlmZmVyZW50aWFsIG1vZGUsCisgKiAgICAgICAgIHRoZSBjaGFubmVsICdpKzEnIGlzIG5vdCB1c2FibGUgc2VwYXJhdGVseS4KKyAqICAgICAgICAgVGhlcmVmb3JlLCB0byBlbnN1cmUgYSBjaGFubmVsIGlzIGNvbmZpZ3VyZWQgaW4gc2luZ2xlLWVuZGVkIG1vZGUsCisgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIG9mIGNoYW5uZWwgaXRzZWxmIGFuZCB0aGUgY2hhbm5lbCAnaS0xJyBtdXN0IGJlCisgKiAgICAgICAgIHJlYWQgYmFjayAodG8gZW5zdXJlIHRoYXQgdGhlIHNlbGVjdGVkIGNoYW5uZWwgY2hhbm5lbCBoYXMgbm90IGJlZW4KKyAqICAgICAgICAgY29uZmlndXJlZCBpbiBkaWZmZXJlbnRpYWwgbW9kZSBieSB0aGUgcHJldmlvdXMgY2hhbm5lbCkuCisgKiBAbm90ZSAgIFJlZmVyIHRvIFJlZmVyZW5jZSBNYW51YWwgdG8gZW5zdXJlIHRoZSBzZWxlY3RlZCBjaGFubmVsIGlzCisgKiAgICAgICAgIGF2YWlsYWJsZSBpbiBkaWZmZXJlbnRpYWwgbW9kZS4KKyAqICAgICAgICAgRm9yIGV4YW1wbGUsIGludGVybmFsIGNoYW5uZWxzIChWcmVmSW50LCBUZW1wU2Vuc29yLCAuLi4pIGFyZQorICogICAgICAgICBub3QgYXZhaWxhYmxlIGluIGRpZmZlcmVudGlhbCBtb2RlLgorICogQG5vdGUgICBXaGVuIGNvbmZpZ3VyaW5nIGEgY2hhbm5lbCAnaScgaW4gZGlmZmVyZW50aWFsIG1vZGUsCisgKiAgICAgICAgIHRoZSBjaGFubmVsICdpKzEnIGlzIG5vdCB1c2FibGUgc2VwYXJhdGVseS4KKyAqIEBub3RlICAgT24gU1RNMzJHNCwgc29tZSBjaGFubmVscyBhcmUgaW50ZXJuYWxseSBmaXhlZCB0byBzaW5nbGUtZW5kZWQgaW5wdXRzCisgKiAgICAgICAgIGNvbmZpZ3VyYXRpb246CisgKiAgICAgICAgIC0gQURDMTogQ2hhbm5lbHMgMTIsIDE1LCAxNiwgMTcgYW5kIDE4CisgKiAgICAgICAgIC0gQURDMjogQ2hhbm5lbHMgMTUsIDE3IGFuZCAxOAorICogICAgICAgICAtIEFEQzM6IENoYW5uZWxzIDEyLCAxNiwgMTcgYW5kIDE4ICAgICAgICAgICAgKDEpCisgKiAgICAgICAgIC0gQURDNDogQ2hhbm5lbHMgMTYsIDE3IGFuZCAxOCAgICAgICAgICAgICAgICAoMSkKKyAqICAgICAgICAgLSBBREM1OiBDaGFubmVscyAyLCAzLCA0LCAxNiwgMTcgYW5kIDE4ICAgICAgICgxKQorICogICAgICAgICAoMSkgQURDMy80LzUgYXJlIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMsIHJlZmVyIHRvIGRldmljZQorICogZGF0YXNoZWV0IGZvciBtb3JlIGRldGFpbHMuCisgKiBAbm90ZSAgIE9uZSBvciBzZXZlcmFsIHZhbHVlcyBjYW4gYmUgc2VsZWN0ZWQuIEluIHRoaXMgY2FzZSwgdGhlIHZhbHVlCisgKiAgICAgICAgIHJldHVybmVkIGlzIG51bGwgaWYgYWxsIGNoYW5uZWxzIGFyZSBpbiBzaW5nbGUgZW5kZWQtbW9kZS4KKyAqICAgICAgICAgRXhhbXBsZTogKExMX0FEQ19DSEFOTkVMXzQgfCBMTF9BRENfQ0hBTk5FTF8xMiB8IC4uLikKKyAqIEBybXRvbGwgRElGU0VMICAgRElGU0VMICAgICAgICAgTExfQURDX0dldENoYW5uZWxTaW5nbGVEaWZmCisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8zCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF80CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF81CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF82CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF83CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF84CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF85CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE1CisgKiBAcmV0dmFsIDA6IGNoYW5uZWwgaW4gc2luZ2xlLWVuZGVkIG1vZGUsIGVsc2U6IGNoYW5uZWwgaW4gZGlmZmVyZW50aWFsIG1vZGUKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19HZXRDaGFubmVsU2luZ2xlRGlmZihjb25zdCBBRENfVHlwZURlZiAqQURDeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChBREN4LT5ESUZTRUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDaGFubmVsICYgQURDX1NJTkdMRURJRkZfQ0hBTk5FTF9NQVNLKSkpOworfQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUZfQ29uZmlndXJhdGlvbl9BRENfQW5hbG9nV2F0Y2hkb2cgQ29uZmlndXJhdGlvbiBvZiBBREMKKyAqIHRyYW5zdmVyc2FsIHNjb3BlOiBhbmFsb2cgd2F0Y2hkb2cKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgIFNldCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3JlZCBjaGFubmVsczoKKyAqICAgICAgICAgYSBzaW5nbGUgY2hhbm5lbCwgbXVsdGlwbGUgY2hhbm5lbHMgb3IgYWxsIGNoYW5uZWxzLAorICogICAgICAgICBvbiBBREMgZ3JvdXBzIHJlZ3VsYXIgYW5kLW9yIGluamVjdGVkLgorICogQG5vdGUgICBPbmNlIG1vbml0b3JlZCBjaGFubmVscyBhcmUgc2VsZWN0ZWQsIGFuYWxvZyB3YXRjaGRvZworICogICAgICAgICBpcyBlbmFibGVkLgorICogQG5vdGUgICBJbiBjYXNlIG9mIG5lZWQgdG8gZGVmaW5lIGEgc2luZ2xlIGNoYW5uZWwgdG8gbW9uaXRvcgorICogICAgICAgICB3aXRoIGFuYWxvZyB3YXRjaGRvZyBmcm9tIHNlcXVlbmNlciBjaGFubmVsIGRlZmluaXRpb24sCisgKiAgICAgICAgIHVzZSBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19BTkFMT0dXRF9DSEFOTkVMX0dST1VQKCkuCisgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCB0aGVyZSBhcmUgMiBraW5kcyBvZiBhbmFsb2cgd2F0Y2hkb2cKKyAqICAgICAgICAgaW5zdGFuY2U6CisgKiAgICAgICAgIC0gQVdEIHN0YW5kYXJkIChpbnN0YW5jZSBBV0QxKToKKyAqICAgICAgICAgICAtIGNoYW5uZWxzIG1vbml0b3JlZDogY2FuIG1vbml0b3IgMSBjaGFubmVsIG9yIGFsbCBjaGFubmVscy4KKyAqICAgICAgICAgICAtIGdyb3VwcyBtb25pdG9yZWQ6IEFEQyBncm91cHMgcmVndWxhciBhbmQtb3IgaW5qZWN0ZWQuCisgKiAgICAgICAgICAgLSByZXNvbHV0aW9uOiByZXNvbHV0aW9uIGlzIG5vdCBsaW1pdGVkIChjb3JyZXNwb25kcyB0bworICogICAgICAgICAgICAgQURDIHJlc29sdXRpb24gY29uZmlndXJlZCkuCisgKiAgICAgICAgIC0gQVdEIGZsZXhpYmxlIChpbnN0YW5jZXMgQVdEMiwgQVdEMyk6CisgKiAgICAgICAgICAgLSBjaGFubmVscyBtb25pdG9yZWQ6IGZsZXhpYmxlIG9uIGNoYW5uZWxzIG1vbml0b3JlZCwgc2VsZWN0aW9uIGlzCisgKiAgICAgICAgICAgICBjaGFubmVsIHdpc2UsIGZyb20gZnJvbSAxIHRvIGFsbCBjaGFubmVscy4KKyAqICAgICAgICAgICAgIFNwZWNpZmljaXR5IG9mIHRoaXMgYW5hbG9nIHdhdGNoZG9nOiBNdWx0aXBsZSBjaGFubmVscyBjYW4KKyAqICAgICAgICAgICAgIGJlIHNlbGVjdGVkLiBGb3IgZXhhbXBsZToKKyAqICAgICAgICAgICAgIChMTF9BRENfQVdEX0NIQU5ORUw0X1JFR19JTkogfCBMTF9BRENfQVdEX0NIQU5ORUw1X1JFR19JTkogfCAuLi4pCisgKiAgICAgICAgICAgLSBncm91cHMgbW9uaXRvcmVkOiBub3Qgc2VsZWN0aW9uIHBvc3NpYmxlIChtb25pdG9yaW5nIG9uIGJvdGgKKyAqICAgICAgICAgICAgIGdyb3VwcyByZWd1bGFyIGFuZCBpbmplY3RlZCkuCisgKiAgICAgICAgICAgICBDaGFubmVscyBzZWxlY3RlZCBhcmUgbW9uaXRvcmVkIG9uIGdyb3VwcyByZWd1bGFyIGFuZCBpbmplY3RlZDoKKyAqICAgICAgICAgICAgIExMX0FEQ19BV0RfQ0hBTk5FTHh4X1JFR19JTkogKGRvIG5vdCB1c2UgcGFyYW1ldGVycworICogICAgICAgICAgICAgTExfQURDX0FXRF9DSEFOTkVMeHhfUkVHIGFuZCBMTF9BRENfQVdEX0NIQU5ORUx4eF9JTkopCisgKiAgICAgICAgICAgLSByZXNvbHV0aW9uOiByZXNvbHV0aW9uIGlzIGxpbWl0ZWQgdG8gOCBiaXRzOiBpZiBBREMgcmVzb2x1dGlvbiBpcworICogICAgICAgICAgICAgMTIgYml0cyB0aGUgNCBMU0IgYXJlIGlnbm9yZWQsIGlmIEFEQyByZXNvbHV0aW9uIGlzIDEwIGJpdHMKKyAqICAgICAgICAgICAgIHRoZSAyIExTQiBhcmUgaWdub3JlZC4KKyAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcKKyAqICAgICAgICAgb24gZWl0aGVyIGdyb3VwcyByZWd1bGFyIG9yIGluamVjdGVkLgorICogQHJtdG9sbCBDRkdSICAgICBBV0QxQ0ggICAgICAgICBMTF9BRENfU2V0QW5hbG9nV0RNb25pdENoYW5uZWxzXG4KKyAqICAgICAgICAgQ0ZHUiAgICAgQVdEMVNHTCAgICAgICAgTExfQURDX1NldEFuYWxvZ1dETW9uaXRDaGFubmVsc1xuCisgKiAgICAgICAgIENGR1IgICAgIEFXRDFFTiAgICAgICAgIExMX0FEQ19TZXRBbmFsb2dXRE1vbml0Q2hhbm5lbHNcbgorICogICAgICAgICBDRkdSICAgICBKQVdEMUVOICAgICAgICBMTF9BRENfU2V0QW5hbG9nV0RNb25pdENoYW5uZWxzXG4KKyAqICAgICAgICAgQVdEMkNSICAgQVdEMkNIICAgICAgICAgTExfQURDX1NldEFuYWxvZ1dETW9uaXRDaGFubmVsc1xuCisgKiAgICAgICAgIEFXRDNDUiAgIEFXRDNDSCAgICAgICAgIExMX0FEQ19TZXRBbmFsb2dXRE1vbml0Q2hhbm5lbHMKKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEBwYXJhbSAgQVdEeSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRDEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0QyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEMworICogQHBhcmFtICBBV0RDaGFubmVsR3JvdXAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfRElTQUJMRQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9BTExfQ0hBTk5FTFNfUkVHICAgICAgICAoMCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQUxMX0NIQU5ORUxTX0lOSiAgICAgICAgKDApCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0FMTF9DSEFOTkVMU19SRUdfSU5KCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMF9SRUcgICAgICAgICAgICgwKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzBfSU5KICAgICAgICAgICAoMCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8wX1JFR19JTkoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xX1JFRyAgICAgICAgICAgKDApCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMV9JTkogICAgICAgICAgICgwKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzFfUkVHX0lOSgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzJfUkVHICAgICAgICAgICAoMCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8yX0lOSiAgICAgICAgICAgKDApCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMl9SRUdfSU5KCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfM19SRUcgICAgICAgICAgICgwKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzNfSU5KICAgICAgICAgICAoMCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8zX1JFR19JTkoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF80X1JFRyAgICAgICAgICAgKDApCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfNF9JTkogICAgICAgICAgICgwKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzRfUkVHX0lOSgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzVfUkVHICAgICAgICAgICAoMCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF81X0lOSiAgICAgICAgICAgKDApCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfNV9SRUdfSU5KCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfNl9SRUcgICAgICAgICAgICgwKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzZfSU5KICAgICAgICAgICAoMCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF82X1JFR19JTkoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF83X1JFRyAgICAgICAgICAgKDApCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfN19JTkogICAgICAgICAgICgwKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzdfUkVHX0lOSgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzhfUkVHICAgICAgICAgICAoMCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF84X0lOSiAgICAgICAgICAgKDApCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfOF9SRUdfSU5KCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfOV9SRUcgICAgICAgICAgICgwKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzlfSU5KICAgICAgICAgICAoMCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF85X1JFR19JTkoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xMF9SRUcgICAgICAgICAgKDApCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTBfSU5KICAgICAgICAgICgwKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzEwX1JFR19JTkoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xMV9SRUcgICAgICAgICAgKDApCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTFfSU5KICAgICAgICAgICgwKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzExX1JFR19JTkoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xMl9SRUcgICAgICAgICAgKDApCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTJfSU5KICAgICAgICAgICgwKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzEyX1JFR19JTkoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xM19SRUcgICAgICAgICAgKDApCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTNfSU5KICAgICAgICAgICgwKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzEzX1JFR19JTkoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xNF9SRUcgICAgICAgICAgKDApCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTRfSU5KICAgICAgICAgICgwKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE0X1JFR19JTkoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xNV9SRUcgICAgICAgICAgKDApCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTVfSU5KICAgICAgICAgICgwKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE1X1JFR19JTkoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xNl9SRUcgICAgICAgICAgKDApCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTZfSU5KICAgICAgICAgICgwKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE2X1JFR19JTkoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xN19SRUcgICAgICAgICAgKDApCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTdfSU5KICAgICAgICAgICgwKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE3X1JFR19JTkoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xOF9SRUcgICAgICAgICAgKDApCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMThfSU5KICAgICAgICAgICgwKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE4X1JFR19JTkoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVlJFRklOVF9SRUcgICAgICAgICAgKDApCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZSRUZJTlRfSU5KICAgICAgICAgICgwKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9WUkVGSU5UX1JFR19JTkoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVEVNUFNFTlNPUl9BREMxX1JFRyAgKDApKDEpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1RFTVBTRU5TT1JfQURDMV9JTkogICgwKSgxKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9URU1QU0VOU09SX0FEQzFfUkVHX0lOSiAoMSkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVEVNUFNFTlNPUl9BREM1X1JFRyAgKDApKDUpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1RFTVBTRU5TT1JfQURDNV9JTkogICgwKSg1KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9URU1QU0VOU09SX0FEQzVfUkVHX0lOSiAoNSkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVkJBVF9SRUcgICAgICAgICAgICAgKDApKDYpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZCQVRfSU5KICAgICAgICAgICAgICgwKSg2KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9WQkFUX1JFR19JTkogICAgICAgICAgICAoNikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVk9QQU1QMV9SRUcgICAgICAgICAgKDApKDEpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZPUEFNUDFfSU5KICAgICAgICAgICgwKSgxKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9WT1BBTVAxX1JFR19JTkogICAgICAgICAoMSkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVk9QQU1QMl9SRUcgICAgICAgICAgKDApKDIpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZPUEFNUDJfSU5KICAgICAgICAgICgwKSgyKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9WT1BBTVAyX1JFR19JTkogICAgICAgICAoMikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVk9QQU1QM19BREMyX1JFRyAgICAgKDApKDIpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZPUEFNUDNfQURDMl9JTkogICAgICgwKSgyKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9WT1BBTVAzX0FEQzJfUkVHX0lOSiAgICAoMikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVk9QQU1QM19BREMzX1JFRyAgICAgKDApKDMpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZPUEFNUDNfQURDM19JTkogICAgICgwKSgzKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9WT1BBTVAzX0FEQzNfUkVHX0lOSiAgICAoMykKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVk9QQU1QNF9SRUcgICAgICAgICAgKDApKDUpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZPUEFNUDRfSU5KICAgICAgICAgICgwKSg1KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9WT1BBTVA0X1JFR19JTkogICAgICAgICAoNSkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVk9QQU1QNV9SRUcgICAgICAgICAgKDApKDUpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZPUEFNUDVfSU5KICAgICAgICAgICgwKSg1KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9WT1BBTVA1X1JFR19JTkogICAgICAgICAoNSkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVk9QQU1QNl9SRUcgICAgICAgICAgKDApKDQpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZPUEFNUDZfSU5KICAgICAgICAgICgwKSg0KQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9WT1BBTVA2X1JFR19JTkogICAgICAgICAoNCkKKyAqCisgKiAgICAgICAgICgwKSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gYW5hbG9nIHdhdGNoZG9nIG51bWJlcjoKKyAqIEFXRDEuXG4gKDEpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzEuXG4gKDIpCisgKiBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREMyLlxuICgzKSBPbiBTVE0zMkc0LAorICogcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIEFEQyBpbnN0YW5jZTogQURDMy5cbiAoNCkgT24gU1RNMzJHNCwgcGFyYW1ldGVyCisgKiBhdmFpbGFibGUgb25seSBvbiBBREMgaW5zdGFuY2U6IEFEQzQuXG4gKDUpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUKKyAqIG9ubHkgb24gQURDIGluc3RhbmNlOiBBREM1LlxuICg2KSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gQURDCisgKiBpbnN0YW5jZXM6IEFEQzEsIEFEQzMsIEFEQzUuXG4gKDcpIE9uIFNUTTMyRzQsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbgorICogQURDIGluc3RhbmNlczogQURDMSwgQURDMywgQURDNCwgQURDNS5cbiBPbiB0aGlzIFNUTTMyIHNlcmllcywgYWxsIEFEQ3ggYXJlCisgKiBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzLiBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBtb3JlIGRldGFpbHMuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1NldEFuYWxvZ1dETW9uaXRDaGFubmVscyhBRENfVHlwZURlZiAqQURDeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQVdEeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQVdEQ2hhbm5lbEdyb3VwKSB7CisgIC8qIFNldCBiaXRzIHdpdGggY29udGVudCBvZiBwYXJhbWV0ZXIgIkFXRENoYW5uZWxHcm91cCIgd2l0aCBiaXRzIHBvc2l0aW9uICAqLworICAvKiBpbiByZWdpc3RlciBhbmQgcmVnaXN0ZXIgcG9zaXRpb24gZGVwZW5kaW5nIG9uIHBhcmFtZXRlciAiQVdEeSIuICAgICAgICAgKi8KKyAgLyogUGFyYW1ldGVycyAiQVdEQ2hhbm5lbEdyb3VwIiBhbmQgIkFXRHkiIGFyZSB1c2VkIHdpdGggbWFza3MgYmVjYXVzZSAgICAgICovCisgIC8qIGNvbnRhaW5pbmcgb3RoZXIgYml0cyByZXNlcnZlZCBmb3Igb3RoZXIgcHVycG9zZS4gICAgICAgICAgICAgICAgICAgICAgICAqLworICBfX0lPIHVpbnQzMl90ICpwcmVnID0gX19BRENfUFRSX1JFR19PRkZTRVQoCisgICAgICBBREN4LT5DRkdSLAorICAgICAgKChBV0R5ICYgQURDX0FXRF9DUlhfUkVHT0ZGU0VUX01BU0spID4+IEFEQ19BV0RfQ1JYX1JFR09GRlNFVF9QT1MpICsKKyAgICAgICAgICAoKEFXRHkgJiBBRENfQVdEX0NSMTJfUkVHT0ZGU0VUR0FQX01BU0spICoKKyAgICAgICAgICAgQURDX0FXRF9DUjEyX1JFR09GRlNFVEdBUF9WQUwpKTsKKworICBNT0RJRllfUkVHKCpwcmVnLCAoQVdEeSAmIEFEQ19BV0RfQ1JfQUxMX0NIQU5ORUxfTUFTSyksCisgICAgICAgICAgICAgQVdEQ2hhbm5lbEdyb3VwICYgQVdEeSk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yZWQgY2hhbm5lbC4KKyAqIEBub3RlICAgVXNhZ2Ugb2YgdGhlIHJldHVybmVkIGNoYW5uZWwgbnVtYmVyOgorICogICAgICAgICAtIFRvIHJlaW5qZWN0IHRoaXMgY2hhbm5lbCBpbnRvIGFub3RoZXIgZnVuY3Rpb24gTExfQURDX3h4eDoKKyAqICAgICAgICAgICB0aGUgcmV0dXJuZWQgY2hhbm5lbCBudW1iZXIgaXMgb25seSBwYXJ0bHkgZm9ybWF0dGVkIG9uIGRlZmluaXRpb24KKyAqICAgICAgICAgICBvZiBsaXRlcmFscyBMTF9BRENfQ0hBTk5FTF94LiBUaGVyZWZvcmUsIGl0IGhhcyB0byBiZSBjb21wYXJlZAorICogICAgICAgICAgIHdpdGggcGFydHMgb2YgbGl0ZXJhbHMgTExfQURDX0NIQU5ORUxfeCBvciB1c2luZworICogICAgICAgICAgIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0NIQU5ORUxfVE9fREVDSU1BTF9OQigpLgorICogICAgICAgICAgIFRoZW4gdGhlIHNlbGVjdGVkIGxpdGVyYWwgTExfQURDX0NIQU5ORUxfeCBjYW4gYmUgdXNlZAorICogICAgICAgICAgIGFzIHBhcmFtZXRlciBmb3IgYW5vdGhlciBmdW5jdGlvbi4KKyAqICAgICAgICAgLSBUbyBnZXQgdGhlIGNoYW5uZWwgbnVtYmVyIGluIGRlY2ltYWwgZm9ybWF0OgorICogICAgICAgICAgIHByb2Nlc3MgdGhlIHJldHVybmVkIHZhbHVlIHdpdGggdGhlIGhlbHBlciBtYWNybworICogICAgICAgICAgIEByZWYgX19MTF9BRENfQ0hBTk5FTF9UT19ERUNJTUFMX05CKCkuCisgKiAgICAgICAgICAgQXBwbGljYWJsZSBvbmx5IHdoZW4gdGhlIGFuYWxvZyB3YXRjaGRvZyBpcyBzZXQgdG8gbW9uaXRvcgorICogICAgICAgICAgIG9uZSBjaGFubmVsLgorICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllcywgdGhlcmUgYXJlIDIga2luZHMgb2YgYW5hbG9nIHdhdGNoZG9nCisgKiAgICAgICAgIGluc3RhbmNlOgorICogICAgICAgICAtIEFXRCBzdGFuZGFyZCAoaW5zdGFuY2UgQVdEMSk6CisgKiAgICAgICAgICAgLSBjaGFubmVscyBtb25pdG9yZWQ6IGNhbiBtb25pdG9yIDEgY2hhbm5lbCBvciBhbGwgY2hhbm5lbHMuCisgKiAgICAgICAgICAgLSBncm91cHMgbW9uaXRvcmVkOiBBREMgZ3JvdXBzIHJlZ3VsYXIgYW5kLW9yIGluamVjdGVkLgorICogICAgICAgICAgIC0gcmVzb2x1dGlvbjogcmVzb2x1dGlvbiBpcyBub3QgbGltaXRlZCAoY29ycmVzcG9uZHMgdG8KKyAqICAgICAgICAgICAgIEFEQyByZXNvbHV0aW9uIGNvbmZpZ3VyZWQpLgorICogICAgICAgICAtIEFXRCBmbGV4aWJsZSAoaW5zdGFuY2VzIEFXRDIsIEFXRDMpOgorICogICAgICAgICAgIC0gY2hhbm5lbHMgbW9uaXRvcmVkOiBmbGV4aWJsZSBvbiBjaGFubmVscyBtb25pdG9yZWQsIHNlbGVjdGlvbiBpcworICogICAgICAgICAgICAgY2hhbm5lbCB3aXNlLCBmcm9tIGZyb20gMSB0byBhbGwgY2hhbm5lbHMuCisgKiAgICAgICAgICAgICBTcGVjaWZpY2l0eSBvZiB0aGlzIGFuYWxvZyB3YXRjaGRvZzogTXVsdGlwbGUgY2hhbm5lbHMgY2FuCisgKiAgICAgICAgICAgICBiZSBzZWxlY3RlZC4gRm9yIGV4YW1wbGU6CisgKiAgICAgICAgICAgICAoTExfQURDX0FXRF9DSEFOTkVMNF9SRUdfSU5KIHwgTExfQURDX0FXRF9DSEFOTkVMNV9SRUdfSU5KIHwgLi4uKQorICogICAgICAgICAgIC0gZ3JvdXBzIG1vbml0b3JlZDogbm90IHNlbGVjdGlvbiBwb3NzaWJsZSAobW9uaXRvcmluZyBvbiBib3RoCisgKiAgICAgICAgICAgICBncm91cHMgcmVndWxhciBhbmQgaW5qZWN0ZWQpLgorICogICAgICAgICAgICAgQ2hhbm5lbHMgc2VsZWN0ZWQgYXJlIG1vbml0b3JlZCBvbiBncm91cHMgcmVndWxhciBhbmQgaW5qZWN0ZWQ6CisgKiAgICAgICAgICAgICBMTF9BRENfQVdEX0NIQU5ORUx4eF9SRUdfSU5KIChkbyBub3QgdXNlIHBhcmFtZXRlcnMKKyAqICAgICAgICAgICAgIExMX0FEQ19BV0RfQ0hBTk5FTHh4X1JFRyBhbmQgTExfQURDX0FXRF9DSEFOTkVMeHhfSU5KKQorICogICAgICAgICAgIC0gcmVzb2x1dGlvbjogcmVzb2x1dGlvbiBpcyBsaW1pdGVkIHRvIDggYml0czogaWYgQURDIHJlc29sdXRpb24gaXMKKyAqICAgICAgICAgICAgIDEyIGJpdHMgdGhlIDQgTFNCIGFyZSBpZ25vcmVkLCBpZiBBREMgcmVzb2x1dGlvbiBpcyAxMCBiaXRzCisgKiAgICAgICAgICAgICB0aGUgMiBMU0IgYXJlIGlnbm9yZWQuCisgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICogICAgICAgICBBREMgc3RhdGU6CisgKiAgICAgICAgIEFEQyBtdXN0IGJlIGRpc2FibGVkIG9yIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nCisgKiAgICAgICAgIG9uIGVpdGhlciBncm91cHMgcmVndWxhciBvciBpbmplY3RlZC4KKyAqIEBybXRvbGwgQ0ZHUiAgICAgQVdEMUNIICAgICAgICAgTExfQURDX0dldEFuYWxvZ1dETW9uaXRDaGFubmVsc1xuCisgKiAgICAgICAgIENGR1IgICAgIEFXRDFTR0wgICAgICAgIExMX0FEQ19HZXRBbmFsb2dXRE1vbml0Q2hhbm5lbHNcbgorICogICAgICAgICBDRkdSICAgICBBV0QxRU4gICAgICAgICBMTF9BRENfR2V0QW5hbG9nV0RNb25pdENoYW5uZWxzXG4KKyAqICAgICAgICAgQ0ZHUiAgICAgSkFXRDFFTiAgICAgICAgTExfQURDX0dldEFuYWxvZ1dETW9uaXRDaGFubmVsc1xuCisgKiAgICAgICAgIEFXRDJDUiAgIEFXRDJDSCAgICAgICAgIExMX0FEQ19HZXRBbmFsb2dXRE1vbml0Q2hhbm5lbHNcbgorICogICAgICAgICBBV0QzQ1IgICBBV0QzQ0ggICAgICAgICBMTF9BRENfR2V0QW5hbG9nV0RNb25pdENoYW5uZWxzCisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcGFyYW0gIEFXRHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0QxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEMiAoMSkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0QzICgxKQorICoKKyAqICAgICAgICAgKDEpIE9uIHRoaXMgQVdEIG51bWJlciwgbW9uaXRvcmVkIGNoYW5uZWwgY2FuIGJlIHJldHJpZXZlZAorICogICAgICAgICAgICAgaWYgb25seSAxIGNoYW5uZWwgaXMgcHJvZ3JhbW1lZCAob3Igbm9uZSBvciBhbGwgY2hhbm5lbHMpLgorICogICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW5ub3QgcmV0cmlldmUgbW9uaXRvcmVkIGNoYW5uZWwgaWYKKyAqICAgICAgICAgICAgIG11bHRpcGxlIGNoYW5uZWxzIGFyZSBwcm9ncmFtbWVkIHNpbXVsdGFuZW91c2x5CisgKiAgICAgICAgICAgICBieSBiaXRmaWVsZC4KKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfRElTQUJMRQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9BTExfQ0hBTk5FTFNfUkVHICAgICAgICAoMCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQUxMX0NIQU5ORUxTX0lOSiAgICAgICAgKDApCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0FMTF9DSEFOTkVMU19SRUdfSU5KCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMF9SRUcgICAgICAgICAgICgwKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzBfSU5KICAgICAgICAgICAoMCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8wX1JFR19JTkoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xX1JFRyAgICAgICAgICAgKDApCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMV9JTkogICAgICAgICAgICgwKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzFfUkVHX0lOSgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzJfUkVHICAgICAgICAgICAoMCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8yX0lOSiAgICAgICAgICAgKDApCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMl9SRUdfSU5KCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfM19SRUcgICAgICAgICAgICgwKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzNfSU5KICAgICAgICAgICAoMCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8zX1JFR19JTkoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF80X1JFRyAgICAgICAgICAgKDApCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfNF9JTkogICAgICAgICAgICgwKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzRfUkVHX0lOSgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzVfUkVHICAgICAgICAgICAoMCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF81X0lOSiAgICAgICAgICAgKDApCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfNV9SRUdfSU5KCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfNl9SRUcgICAgICAgICAgICgwKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzZfSU5KICAgICAgICAgICAoMCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF82X1JFR19JTkoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF83X1JFRyAgICAgICAgICAgKDApCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfN19JTkogICAgICAgICAgICgwKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzdfUkVHX0lOSgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzhfUkVHICAgICAgICAgICAoMCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF84X0lOSiAgICAgICAgICAgKDApCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfOF9SRUdfSU5KCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfOV9SRUcgICAgICAgICAgICgwKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzlfSU5KICAgICAgICAgICAoMCkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF85X1JFR19JTkoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xMF9SRUcgICAgICAgICAgKDApCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTBfSU5KICAgICAgICAgICgwKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzEwX1JFR19JTkoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xMV9SRUcgICAgICAgICAgKDApCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTFfSU5KICAgICAgICAgICgwKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzExX1JFR19JTkoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xMl9SRUcgICAgICAgICAgKDApCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTJfSU5KICAgICAgICAgICgwKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzEyX1JFR19JTkoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xM19SRUcgICAgICAgICAgKDApCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTNfSU5KICAgICAgICAgICgwKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzEzX1JFR19JTkoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xNF9SRUcgICAgICAgICAgKDApCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTRfSU5KICAgICAgICAgICgwKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE0X1JFR19JTkoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xNV9SRUcgICAgICAgICAgKDApCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTVfSU5KICAgICAgICAgICgwKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE1X1JFR19JTkoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xNl9SRUcgICAgICAgICAgKDApCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTZfSU5KICAgICAgICAgICgwKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE2X1JFR19JTkoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xN19SRUcgICAgICAgICAgKDApCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTdfSU5KICAgICAgICAgICgwKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE3X1JFR19JTkoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xOF9SRUcgICAgICAgICAgKDApCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMThfSU5KICAgICAgICAgICgwKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE4X1JFR19JTkoKKyAqCisgKiAgICAgICAgICgwKSBPbiBTVE0zMkc0LCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gYW5hbG9nIHdhdGNoZG9nIG51bWJlcjoKKyAqIEFXRDEuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfQURDX0dldEFuYWxvZ1dETW9uaXRDaGFubmVscyhjb25zdCBBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgQVdEeSkgeworICBjb25zdCBfX0lPIHVpbnQzMl90ICpwcmVnID0gX19BRENfUFRSX1JFR19PRkZTRVQoCisgICAgICBBREN4LT5DRkdSLAorICAgICAgKChBV0R5ICYgQURDX0FXRF9DUlhfUkVHT0ZGU0VUX01BU0spID4+IEFEQ19BV0RfQ1JYX1JFR09GRlNFVF9QT1MpICsKKyAgICAgICAgICAoKEFXRHkgJiBBRENfQVdEX0NSMTJfUkVHT0ZGU0VUR0FQX01BU0spICoKKyAgICAgICAgICAgQURDX0FXRF9DUjEyX1JFR09GRlNFVEdBUF9WQUwpKTsKKworICB1aW50MzJfdCBhbmFsb2dfd2RfbW9uaXRfY2hhbm5lbHMgPQorICAgICAgKFJFQURfQklUKCpwcmVnLCBBV0R5KSAmIEFXRHkgJiBBRENfQVdEX0NSX0FMTF9DSEFOTkVMX01BU0spOworCisgIC8qIElmICJhbmFsb2dfd2RfbW9uaXRfY2hhbm5lbHMiID09IDAsIHRoZW4gdGhlIHNlbGVjdGVkIEFXRCBpcyBkaXNhYmxlZCAqLworICAvKiAocGFyYW1ldGVyIHZhbHVlIExMX0FEQ19BV0RfRElTQUJMRSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogRWxzZSwgdGhlIHNlbGVjdGVkIEFXRCBpcyBlbmFibGVkIGFuZCBpcyBtb25pdG9yaW5nIGEgZ3JvdXAgb2YgY2hhbm5lbHMgICovCisgIC8qIG9yIGEgc2luZ2xlIGNoYW5uZWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpZiAoYW5hbG9nX3dkX21vbml0X2NoYW5uZWxzICE9IDBVTCkgeworICAgIGlmIChBV0R5ID09IExMX0FEQ19BV0QxKSB7CisgICAgICBpZiAoKGFuYWxvZ193ZF9tb25pdF9jaGFubmVscyAmIEFEQ19DRkdSX0FXRDFTR0wpID09IDBVTCkgeworICAgICAgICAvKiBBV0QgbW9uaXRvcmluZyBhIGdyb3VwIG9mIGNoYW5uZWxzICovCisgICAgICAgIGFuYWxvZ193ZF9tb25pdF9jaGFubmVscyA9CisgICAgICAgICAgICAoKGFuYWxvZ193ZF9tb25pdF9jaGFubmVscyB8IChBRENfQVdEX0NSMjNfQ0hBTk5FTF9NQVNLKSkgJgorICAgICAgICAgICAgICh+KEFEQ19DRkdSX0FXRDFDSCkpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIEFXRCBtb25pdG9yaW5nIGEgc2luZ2xlIGNoYW5uZWwgKi8KKyAgICAgICAgYW5hbG9nX3dkX21vbml0X2NoYW5uZWxzID0KKyAgICAgICAgICAgIChhbmFsb2dfd2RfbW9uaXRfY2hhbm5lbHMgfAorICAgICAgICAgICAgIChBRENfQVdEMkNSX0FXRDJDSF8wCisgICAgICAgICAgICAgIDw8IChhbmFsb2dfd2RfbW9uaXRfY2hhbm5lbHMgPj4gQURDX0NGR1JfQVdEMUNIX1BvcykpKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKChhbmFsb2dfd2RfbW9uaXRfY2hhbm5lbHMgJiBBRENfQVdEX0NSMjNfQ0hBTk5FTF9NQVNLKSA9PQorICAgICAgICAgIEFEQ19BV0RfQ1IyM19DSEFOTkVMX01BU0spIHsKKyAgICAgICAgLyogQVdEIG1vbml0b3JpbmcgYSBncm91cCBvZiBjaGFubmVscyAqLworICAgICAgICBhbmFsb2dfd2RfbW9uaXRfY2hhbm5lbHMgPSAoQURDX0FXRF9DUjIzX0NIQU5ORUxfTUFTSyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFEQ19DRkdSX0pBV0QxRU4gfCBBRENfQ0ZHUl9BV0QxRU4pKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBBV0QgbW9uaXRvcmluZyBhIHNpbmdsZSBjaGFubmVsICovCisgICAgICAgIC8qIEFXRCBtb25pdG9yaW5nIGEgZ3JvdXAgb2YgY2hhbm5lbHMgKi8KKyAgICAgICAgYW5hbG9nX3dkX21vbml0X2NoYW5uZWxzID0KKyAgICAgICAgICAgIChhbmFsb2dfd2RfbW9uaXRfY2hhbm5lbHMgfAorICAgICAgICAgICAgIChBRENfQ0ZHUl9KQVdEMUVOIHwgQURDX0NGR1JfQVdEMUVOIHwgQURDX0NGR1JfQVdEMVNHTCkgfAorICAgICAgICAgICAgIChfX0xMX0FEQ19DSEFOTkVMX1RPX0RFQ0lNQUxfTkIoYW5hbG9nX3dkX21vbml0X2NoYW5uZWxzKQorICAgICAgICAgICAgICA8PCBBRENfQ0ZHUl9BV0QxQ0hfUG9zKSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIGFuYWxvZ193ZF9tb25pdF9jaGFubmVsczsKK30KKworLyoqCisgKiBAYnJpZWYgIFNldCBBREMgYW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZHMgdmFsdWUgb2YgYm90aCB0aHJlc2hvbGRzCisgKiAgICAgICAgIGhpZ2ggYW5kIGxvdy4KKyAqIEBub3RlICAgSWYgdmFsdWUgb2Ygb25seSBvbmUgdGhyZXNob2xkIGhpZ2ggb3IgbG93IG11c3QgYmUgc2V0LAorICogICAgICAgICB1c2UgZnVuY3Rpb24gQHJlZiBMTF9BRENfU2V0QW5hbG9nV0RUaHJlc2hvbGRzKCkuCisgKiBAbm90ZSAgIEluIGNhc2Ugb2YgQURDIHJlc29sdXRpb24gZGlmZmVyZW50IG9mIDEyIGJpdHMsCisgKiAgICAgICAgIGFuYWxvZyB3YXRjaGRvZyB0aHJlc2hvbGRzIGRhdGEgcmVxdWlyZSBhIHNwZWNpZmljIHNoaWZ0LgorICogICAgICAgICBVc2UgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQU5BTE9HV0RfU0VUX1RIUkVTSE9MRF9SRVNPTFVUSU9OKCkuCisgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCB0aGVyZSBhcmUgMiBraW5kcyBvZiBhbmFsb2cgd2F0Y2hkb2cKKyAqICAgICAgICAgaW5zdGFuY2U6CisgKiAgICAgICAgIC0gQVdEIHN0YW5kYXJkIChpbnN0YW5jZSBBV0QxKToKKyAqICAgICAgICAgICAtIGNoYW5uZWxzIG1vbml0b3JlZDogY2FuIG1vbml0b3IgMSBjaGFubmVsIG9yIGFsbCBjaGFubmVscy4KKyAqICAgICAgICAgICAtIGdyb3VwcyBtb25pdG9yZWQ6IEFEQyBncm91cHMgcmVndWxhciBhbmQtb3IgaW5qZWN0ZWQuCisgKiAgICAgICAgICAgLSByZXNvbHV0aW9uOiByZXNvbHV0aW9uIGlzIG5vdCBsaW1pdGVkIChjb3JyZXNwb25kcyB0bworICogICAgICAgICAgICAgQURDIHJlc29sdXRpb24gY29uZmlndXJlZCkuCisgKiAgICAgICAgIC0gQVdEIGZsZXhpYmxlIChpbnN0YW5jZXMgQVdEMiwgQVdEMyk6CisgKiAgICAgICAgICAgLSBjaGFubmVscyBtb25pdG9yZWQ6IGZsZXhpYmxlIG9uIGNoYW5uZWxzIG1vbml0b3JlZCwgc2VsZWN0aW9uIGlzCisgKiAgICAgICAgICAgICBjaGFubmVsIHdpc2UsIGZyb20gZnJvbSAxIHRvIGFsbCBjaGFubmVscy4KKyAqICAgICAgICAgICAgIFNwZWNpZmljaXR5IG9mIHRoaXMgYW5hbG9nIHdhdGNoZG9nOiBNdWx0aXBsZSBjaGFubmVscyBjYW4KKyAqICAgICAgICAgICAgIGJlIHNlbGVjdGVkLiBGb3IgZXhhbXBsZToKKyAqICAgICAgICAgICAgIChMTF9BRENfQVdEX0NIQU5ORUw0X1JFR19JTkogfCBMTF9BRENfQVdEX0NIQU5ORUw1X1JFR19JTkogfCAuLi4pCisgKiAgICAgICAgICAgLSBncm91cHMgbW9uaXRvcmVkOiBub3Qgc2VsZWN0aW9uIHBvc3NpYmxlIChtb25pdG9yaW5nIG9uIGJvdGgKKyAqICAgICAgICAgICAgIGdyb3VwcyByZWd1bGFyIGFuZCBpbmplY3RlZCkuCisgKiAgICAgICAgICAgICBDaGFubmVscyBzZWxlY3RlZCBhcmUgbW9uaXRvcmVkIG9uIGdyb3VwcyByZWd1bGFyIGFuZCBpbmplY3RlZDoKKyAqICAgICAgICAgICAgIExMX0FEQ19BV0RfQ0hBTk5FTHh4X1JFR19JTkogKGRvIG5vdCB1c2UgcGFyYW1ldGVycworICogICAgICAgICAgICAgTExfQURDX0FXRF9DSEFOTkVMeHhfUkVHIGFuZCBMTF9BRENfQVdEX0NIQU5ORUx4eF9JTkopCisgKiAgICAgICAgICAgLSByZXNvbHV0aW9uOiByZXNvbHV0aW9uIGlzIGxpbWl0ZWQgdG8gOCBiaXRzOiBpZiBBREMgcmVzb2x1dGlvbiBpcworICogICAgICAgICAgICAgMTIgYml0cyB0aGUgNCBMU0IgYXJlIGlnbm9yZWQsIGlmIEFEQyByZXNvbHV0aW9uIGlzIDEwIGJpdHMKKyAqICAgICAgICAgICAgIHRoZSAyIExTQiBhcmUgaWdub3JlZC4KKyAqIEBub3RlICAgSWYgQURDIG92ZXJzYW1wbGluZyBpcyBlbmFibGVkLCBBREMgYW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZHMgYXJlCisgKiAgICAgICAgIGltcGFjdGVkOiB0aGUgY29tcGFyaXNvbiBvZiBhbmFsb2cgd2F0Y2hkb2cgdGhyZXNob2xkcyBpcyBkb25lIG9uCisgKiAgICAgICAgIG92ZXJzYW1wbGluZyBmaW5hbCBjb21wdXRhdGlvbiAoYWZ0ZXIgcmF0aW8gYW5kIHNoaWZ0IGFwcGxpY2F0aW9uKToKKyAqICAgICAgICAgQURDIGRhdGEgcmVnaXN0ZXIgYml0ZmllbGQgWzE1OjRdICgxMiBtb3N0IHNpZ25pZmljYW50IGJpdHMpLgorICogICAgICAgICBFeGFtcGxlczoKKyAqICAgICAgICAgLSBPdmVyc2FtcGxpbmcgcmF0aW8gYW5kIHNoaWZ0IHNlbGVjdGVkIHRvIGhhdmUgQURDIGNvbnZlcnNpb24gZGF0YQorICogICAgICAgICAgIG9uIDEyIGJpdHMgKHJhdGlvIDE2IGFuZCBzaGlmdCA0LCBvciByYXRpbyAzMiBhbmQgc2hpZnQgNSwgLi4uKToKKyAqICAgICAgICAgICBBREMgYW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZHMgbXVzdCBiZSBkaXZpZGVkIGJ5IDE2LgorICogICAgICAgICAtIE92ZXJzYW1wbGluZyByYXRpbyBhbmQgc2hpZnQgc2VsZWN0ZWQgdG8gaGF2ZSBBREMgY29udmVyc2lvbiBkYXRhCisgKiAgICAgICAgICAgb24gMTQgYml0cyAocmF0aW8gMTYgYW5kIHNoaWZ0IDIsIG9yIHJhdGlvIDMyIGFuZCBzaGlmdCAzLCAuLi4pOgorICogICAgICAgICAgIEFEQyBhbmFsb2cgd2F0Y2hkb2cgdGhyZXNob2xkcyBtdXN0IGJlIGRpdmlkZWQgYnkgNC4KKyAqICAgICAgICAgLSBPdmVyc2FtcGxpbmcgcmF0aW8gYW5kIHNoaWZ0IHNlbGVjdGVkIHRvIGhhdmUgQURDIGNvbnZlcnNpb24gZGF0YQorICogICAgICAgICAgIG9uIDE2IGJpdHMgKHJhdGlvIDE2IGFuZCBzaGlmdCBub25lLCBvciByYXRpbyAzMiBhbmQgc2hpZnQgMSwgLi4uKToKKyAqICAgICAgICAgICBBREMgYW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZHMgbWF0Y2ggZGlyZWN0bHkgdG8gQURDIGRhdGEgcmVnaXN0ZXIuCisgKiBAcm10b2xsIFRSMSAgICAgIEhUMSAgICAgICAgICAgIExMX0FEQ19Db25maWdBbmFsb2dXRFRocmVzaG9sZHNcbgorICogICAgICAgICBUUjIgICAgICBIVDIgICAgICAgICAgICBMTF9BRENfQ29uZmlnQW5hbG9nV0RUaHJlc2hvbGRzXG4KKyAqICAgICAgICAgVFIzICAgICAgSFQzICAgICAgICAgICAgTExfQURDX0NvbmZpZ0FuYWxvZ1dEVGhyZXNob2xkc1xuCisgKiAgICAgICAgIFRSMSAgICAgIExUMSAgICAgICAgICAgIExMX0FEQ19Db25maWdBbmFsb2dXRFRocmVzaG9sZHNcbgorICogICAgICAgICBUUjIgICAgICBMVDIgICAgICAgICAgICBMTF9BRENfQ29uZmlnQW5hbG9nV0RUaHJlc2hvbGRzXG4KKyAqICAgICAgICAgVFIzICAgICAgTFQzICAgICAgICAgICAgTExfQURDX0NvbmZpZ0FuYWxvZ1dEVGhyZXNob2xkcworICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICogQHBhcmFtICBBV0R5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEMQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRDIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0QzCisgKiBAcGFyYW0gIEFXRFRocmVzaG9sZEhpZ2hWYWx1ZSBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwIGFuZCBNYXhfRGF0YT0weEZGRgorICogQHBhcmFtICBBV0RUaHJlc2hvbGRMb3dWYWx1ZSBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwIGFuZCBNYXhfRGF0YT0weEZGRgorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19Db25maWdBbmFsb2dXRFRocmVzaG9sZHMoCisgICAgQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IEFXRHksIHVpbnQzMl90IEFXRFRocmVzaG9sZEhpZ2hWYWx1ZSwKKyAgICB1aW50MzJfdCBBV0RUaHJlc2hvbGRMb3dWYWx1ZSkgeworICAvKiBTZXQgYml0cyB3aXRoIGNvbnRlbnQgb2YgcGFyYW1ldGVyICJBV0RUaHJlc2hvbGR4eHhWYWx1ZSIgd2l0aCBiaXRzICAgICAgKi8KKyAgLyogcG9zaXRpb24gaW4gcmVnaXN0ZXIgYW5kIHJlZ2lzdGVyIHBvc2l0aW9uIGRlcGVuZGluZyBvbiBwYXJhbWV0ZXIgICAgICAgICovCisgIC8qICJBV0R5Ii4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBQYXJhbWV0ZXJzICJBV0R5IiBhbmQgIkFXRFRocmVzaG9sZHh4eFZhbHVlIiBhcmUgdXNlZCB3aXRoIG1hc2tzIGJlY2F1c2UgKi8KKyAgLyogY29udGFpbmluZyBvdGhlciBiaXRzIHJlc2VydmVkIGZvciBvdGhlciBwdXJwb3NlLiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIF9fSU8gdWludDMyX3QgKnByZWcgPSBfX0FEQ19QVFJfUkVHX09GRlNFVCgKKyAgICAgIEFEQ3gtPlRSMSwKKyAgICAgICgoQVdEeSAmIEFEQ19BV0RfVFJYX1JFR09GRlNFVF9NQVNLKSA+PiBBRENfQVdEX1RSWF9SRUdPRkZTRVRfUE9TKSk7CisKKyAgTU9ESUZZX1JFRygqcHJlZywgQURDX1RSMV9IVDEgfCBBRENfVFIxX0xUMSwKKyAgICAgICAgICAgICAoQVdEVGhyZXNob2xkSGlnaFZhbHVlIDw8IEFEQ19UUjFfSFQxX0JJVE9GRlNFVF9QT1MpIHwKKyAgICAgICAgICAgICAgICAgQVdEVGhyZXNob2xkTG93VmFsdWUpOworfQorCisvKioKKyAqIEBicmllZiAgU2V0IEFEQyBhbmFsb2cgd2F0Y2hkb2cgdGhyZXNob2xkIHZhbHVlIG9mIHRocmVzaG9sZAorICogICAgICAgICBoaWdoIG9yIGxvdy4KKyAqIEBub3RlICAgSWYgdmFsdWVzIG9mIGJvdGggdGhyZXNob2xkcyBoaWdoIG9yIGxvdyBtdXN0IGJlIHNldCwKKyAqICAgICAgICAgdXNlIGZ1bmN0aW9uIEByZWYgTExfQURDX0NvbmZpZ0FuYWxvZ1dEVGhyZXNob2xkcygpLgorICogQG5vdGUgICBJbiBjYXNlIG9mIEFEQyByZXNvbHV0aW9uIGRpZmZlcmVudCBvZiAxMiBiaXRzLAorICogICAgICAgICBhbmFsb2cgd2F0Y2hkb2cgdGhyZXNob2xkcyBkYXRhIHJlcXVpcmUgYSBzcGVjaWZpYyBzaGlmdC4KKyAqICAgICAgICAgVXNlIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0FOQUxPR1dEX1NFVF9USFJFU0hPTERfUkVTT0xVVElPTigpLgorICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllcywgdGhlcmUgYXJlIDIga2luZHMgb2YgYW5hbG9nIHdhdGNoZG9nCisgKiAgICAgICAgIGluc3RhbmNlOgorICogICAgICAgICAtIEFXRCBzdGFuZGFyZCAoaW5zdGFuY2UgQVdEMSk6CisgKiAgICAgICAgICAgLSBjaGFubmVscyBtb25pdG9yZWQ6IGNhbiBtb25pdG9yIDEgY2hhbm5lbCBvciBhbGwgY2hhbm5lbHMuCisgKiAgICAgICAgICAgLSBncm91cHMgbW9uaXRvcmVkOiBBREMgZ3JvdXBzIHJlZ3VsYXIgYW5kLW9yIGluamVjdGVkLgorICogICAgICAgICAgIC0gcmVzb2x1dGlvbjogcmVzb2x1dGlvbiBpcyBub3QgbGltaXRlZCAoY29ycmVzcG9uZHMgdG8KKyAqICAgICAgICAgICAgIEFEQyByZXNvbHV0aW9uIGNvbmZpZ3VyZWQpLgorICogICAgICAgICAtIEFXRCBmbGV4aWJsZSAoaW5zdGFuY2VzIEFXRDIsIEFXRDMpOgorICogICAgICAgICAgIC0gY2hhbm5lbHMgbW9uaXRvcmVkOiBmbGV4aWJsZSBvbiBjaGFubmVscyBtb25pdG9yZWQsIHNlbGVjdGlvbiBpcworICogICAgICAgICAgICAgY2hhbm5lbCB3aXNlLCBmcm9tIGZyb20gMSB0byBhbGwgY2hhbm5lbHMuCisgKiAgICAgICAgICAgICBTcGVjaWZpY2l0eSBvZiB0aGlzIGFuYWxvZyB3YXRjaGRvZzogTXVsdGlwbGUgY2hhbm5lbHMgY2FuCisgKiAgICAgICAgICAgICBiZSBzZWxlY3RlZC4gRm9yIGV4YW1wbGU6CisgKiAgICAgICAgICAgICAoTExfQURDX0FXRF9DSEFOTkVMNF9SRUdfSU5KIHwgTExfQURDX0FXRF9DSEFOTkVMNV9SRUdfSU5KIHwgLi4uKQorICogICAgICAgICAgIC0gZ3JvdXBzIG1vbml0b3JlZDogbm90IHNlbGVjdGlvbiBwb3NzaWJsZSAobW9uaXRvcmluZyBvbiBib3RoCisgKiAgICAgICAgICAgICBncm91cHMgcmVndWxhciBhbmQgaW5qZWN0ZWQpLgorICogICAgICAgICAgICAgQ2hhbm5lbHMgc2VsZWN0ZWQgYXJlIG1vbml0b3JlZCBvbiBncm91cHMgcmVndWxhciBhbmQgaW5qZWN0ZWQ6CisgKiAgICAgICAgICAgICBMTF9BRENfQVdEX0NIQU5ORUx4eF9SRUdfSU5KIChkbyBub3QgdXNlIHBhcmFtZXRlcnMKKyAqICAgICAgICAgICAgIExMX0FEQ19BV0RfQ0hBTk5FTHh4X1JFRyBhbmQgTExfQURDX0FXRF9DSEFOTkVMeHhfSU5KKQorICogICAgICAgICAgIC0gcmVzb2x1dGlvbjogcmVzb2x1dGlvbiBpcyBsaW1pdGVkIHRvIDggYml0czogaWYgQURDIHJlc29sdXRpb24gaXMKKyAqICAgICAgICAgICAgIDEyIGJpdHMgdGhlIDQgTFNCIGFyZSBpZ25vcmVkLCBpZiBBREMgcmVzb2x1dGlvbiBpcyAxMCBiaXRzCisgKiAgICAgICAgICAgICB0aGUgMiBMU0IgYXJlIGlnbm9yZWQuCisgKiBAbm90ZSAgIElmIEFEQyBvdmVyc2FtcGxpbmcgaXMgZW5hYmxlZCwgQURDIGFuYWxvZyB3YXRjaGRvZyB0aHJlc2hvbGRzIGFyZQorICogICAgICAgICBpbXBhY3RlZDogdGhlIGNvbXBhcmlzb24gb2YgYW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZHMgaXMgZG9uZSBvbgorICogICAgICAgICBvdmVyc2FtcGxpbmcgZmluYWwgY29tcHV0YXRpb24gKGFmdGVyIHJhdGlvIGFuZCBzaGlmdCBhcHBsaWNhdGlvbik6CisgKiAgICAgICAgIEFEQyBkYXRhIHJlZ2lzdGVyIGJpdGZpZWxkIFsxNTo0XSAoMTIgbW9zdCBzaWduaWZpY2FudCBiaXRzKS4KKyAqICAgICAgICAgRXhhbXBsZXM6CisgKiAgICAgICAgIC0gT3ZlcnNhbXBsaW5nIHJhdGlvIGFuZCBzaGlmdCBzZWxlY3RlZCB0byBoYXZlIEFEQyBjb252ZXJzaW9uIGRhdGEKKyAqICAgICAgICAgICBvbiAxMiBiaXRzIChyYXRpbyAxNiBhbmQgc2hpZnQgNCwgb3IgcmF0aW8gMzIgYW5kIHNoaWZ0IDUsIC4uLik6CisgKiAgICAgICAgICAgQURDIGFuYWxvZyB3YXRjaGRvZyB0aHJlc2hvbGRzIG11c3QgYmUgZGl2aWRlZCBieSAxNi4KKyAqICAgICAgICAgLSBPdmVyc2FtcGxpbmcgcmF0aW8gYW5kIHNoaWZ0IHNlbGVjdGVkIHRvIGhhdmUgQURDIGNvbnZlcnNpb24gZGF0YQorICogICAgICAgICAgIG9uIDE0IGJpdHMgKHJhdGlvIDE2IGFuZCBzaGlmdCAyLCBvciByYXRpbyAzMiBhbmQgc2hpZnQgMywgLi4uKToKKyAqICAgICAgICAgICBBREMgYW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZHMgbXVzdCBiZSBkaXZpZGVkIGJ5IDQuCisgKiAgICAgICAgIC0gT3ZlcnNhbXBsaW5nIHJhdGlvIGFuZCBzaGlmdCBzZWxlY3RlZCB0byBoYXZlIEFEQyBjb252ZXJzaW9uIGRhdGEKKyAqICAgICAgICAgICBvbiAxNiBiaXRzIChyYXRpbyAxNiBhbmQgc2hpZnQgbm9uZSwgb3IgcmF0aW8gMzIgYW5kIHNoaWZ0IDEsIC4uLik6CisgKiAgICAgICAgICAgQURDIGFuYWxvZyB3YXRjaGRvZyB0aHJlc2hvbGRzIG1hdGNoIGRpcmVjdGx5IHRvIEFEQyBkYXRhIHJlZ2lzdGVyLgorICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllcywgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgbm90IGNvbmRpdGlvbmVkIHRvCisgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAqICAgICAgICAgQURDIGNhbiBiZSBkaXNhYmxlZCwgZW5hYmxlZCB3aXRoIG9yIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZworICogICAgICAgICBvbiBlaXRoZXIgQURDIGdyb3VwcyByZWd1bGFyIG9yIGluamVjdGVkLgorICogQHJtdG9sbCBUUjEgICAgICBIVDEgICAgICAgICAgICBMTF9BRENfU2V0QW5hbG9nV0RUaHJlc2hvbGRzXG4KKyAqICAgICAgICAgVFIyICAgICAgSFQyICAgICAgICAgICAgTExfQURDX1NldEFuYWxvZ1dEVGhyZXNob2xkc1xuCisgKiAgICAgICAgIFRSMyAgICAgIEhUMyAgICAgICAgICAgIExMX0FEQ19TZXRBbmFsb2dXRFRocmVzaG9sZHNcbgorICogICAgICAgICBUUjEgICAgICBMVDEgICAgICAgICAgICBMTF9BRENfU2V0QW5hbG9nV0RUaHJlc2hvbGRzXG4KKyAqICAgICAgICAgVFIyICAgICAgTFQyICAgICAgICAgICAgTExfQURDX1NldEFuYWxvZ1dEVGhyZXNob2xkc1xuCisgKiAgICAgICAgIFRSMyAgICAgIExUMyAgICAgICAgICAgIExMX0FEQ19TZXRBbmFsb2dXRFRocmVzaG9sZHMKKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEBwYXJhbSAgQVdEeSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRDEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0QyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEMworICogQHBhcmFtICBBV0RUaHJlc2hvbGRzSGlnaExvdyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcKKyAqIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfVEhSRVNIT0xEX0hJR0gKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfVEhSRVNIT0xEX0xPVworICogQHBhcmFtICBBV0RUaHJlc2hvbGRWYWx1ZSBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwIGFuZCBNYXhfRGF0YT0weEZGRgorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19TZXRBbmFsb2dXRFRocmVzaG9sZHMoQURDX1R5cGVEZWYgKkFEQ3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEFXRHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEFXRFRocmVzaG9sZHNIaWdoTG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBBV0RUaHJlc2hvbGRWYWx1ZSkgeworICAvKiBTZXQgYml0cyB3aXRoIGNvbnRlbnQgb2YgcGFyYW1ldGVyICJBV0RUaHJlc2hvbGRWYWx1ZSIgd2l0aCBiaXRzICAgICAgICAgKi8KKyAgLyogcG9zaXRpb24gaW4gcmVnaXN0ZXIgYW5kIHJlZ2lzdGVyIHBvc2l0aW9uIGRlcGVuZGluZyBvbiBwYXJhbWV0ZXJzICAgICAgICovCisgIC8qICJBV0RUaHJlc2hvbGRzSGlnaExvdyIgYW5kICJBV0R5Ii4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBQYXJhbWV0ZXJzICJBV0R5IiBhbmQgIkFXRFRocmVzaG9sZFZhbHVlIiBhcmUgdXNlZCB3aXRoIG1hc2tzIGJlY2F1c2UgICAgKi8KKyAgLyogY29udGFpbmluZyBvdGhlciBiaXRzIHJlc2VydmVkIGZvciBvdGhlciBwdXJwb3NlLiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIF9fSU8gdWludDMyX3QgKnByZWcgPSBfX0FEQ19QVFJfUkVHX09GRlNFVCgKKyAgICAgIEFEQ3gtPlRSMSwKKyAgICAgICgoQVdEeSAmIEFEQ19BV0RfVFJYX1JFR09GRlNFVF9NQVNLKSA+PiBBRENfQVdEX1RSWF9SRUdPRkZTRVRfUE9TKSk7CisKKyAgTU9ESUZZX1JFRygqcHJlZywgQVdEVGhyZXNob2xkc0hpZ2hMb3csCisgICAgICAgICAgICAgQVdEVGhyZXNob2xkVmFsdWUKKyAgICAgICAgICAgICAgICAgPDwgKChBV0RUaHJlc2hvbGRzSGlnaExvdyAmIEFEQ19BV0RfVFJYX0JJVF9ISUdIX01BU0spID4+CisgICAgICAgICAgICAgICAgICAgICBBRENfQVdEX1RSWF9CSVRfSElHSF9TSElGVDQpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBBREMgYW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZCB2YWx1ZSBvZiB0aHJlc2hvbGQgaGlnaCwKKyAqICAgICAgICAgdGhyZXNob2xkIGxvdyBvciByYXcgZGF0YSB3aXRoIEFEQyB0aHJlc2hvbGRzIGhpZ2ggYW5kIGxvdworICogICAgICAgICBjb25jYXRlbmF0ZWQuCisgKiBAbm90ZSAgIElmIHJhdyBkYXRhIHdpdGggQURDIHRocmVzaG9sZHMgaGlnaCBhbmQgbG93IGlzIHJldHJpZXZlZCwKKyAqICAgICAgICAgdGhlIGRhdGEgb2YgZWFjaCB0aHJlc2hvbGQgaGlnaCBvciBsb3cgY2FuIGJlIGlzb2xhdGVkCisgKiAgICAgICAgIHVzaW5nIGhlbHBlciBtYWNybzoKKyAqICAgICAgICAgQHJlZiBfX0xMX0FEQ19BTkFMT0dXRF9USFJFU0hPTERTX0hJR0hfTE9XKCkuCisgKiBAbm90ZSAgIEluIGNhc2Ugb2YgQURDIHJlc29sdXRpb24gZGlmZmVyZW50IG9mIDEyIGJpdHMsCisgKiAgICAgICAgIGFuYWxvZyB3YXRjaGRvZyB0aHJlc2hvbGRzIGRhdGEgcmVxdWlyZSBhIHNwZWNpZmljIHNoaWZ0LgorICogICAgICAgICBVc2UgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQU5BTE9HV0RfR0VUX1RIUkVTSE9MRF9SRVNPTFVUSU9OKCkuCisgKiBAcm10b2xsIFRSMSAgICAgIEhUMSAgICAgICAgICAgIExMX0FEQ19HZXRBbmFsb2dXRFRocmVzaG9sZHNcbgorICogICAgICAgICBUUjIgICAgICBIVDIgICAgICAgICAgICBMTF9BRENfR2V0QW5hbG9nV0RUaHJlc2hvbGRzXG4KKyAqICAgICAgICAgVFIzICAgICAgSFQzICAgICAgICAgICAgTExfQURDX0dldEFuYWxvZ1dEVGhyZXNob2xkc1xuCisgKiAgICAgICAgIFRSMSAgICAgIExUMSAgICAgICAgICAgIExMX0FEQ19HZXRBbmFsb2dXRFRocmVzaG9sZHNcbgorICogICAgICAgICBUUjIgICAgICBMVDIgICAgICAgICAgICBMTF9BRENfR2V0QW5hbG9nV0RUaHJlc2hvbGRzXG4KKyAqICAgICAgICAgVFIzICAgICAgTFQzICAgICAgICAgICAgTExfQURDX0dldEFuYWxvZ1dEVGhyZXNob2xkcworICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICogQHBhcmFtICBBV0R5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEMQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRDIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0QzCisgKiBAcGFyYW0gIEFXRFRocmVzaG9sZHNIaWdoTG93IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZworICogdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9USFJFU0hPTERfSElHSAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9USFJFU0hPTERfTE9XCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX1RIUkVTSE9MRFNfSElHSF9MT1cKKyAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMCBhbmQgTWF4X0RhdGE9MHhGRkYKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19HZXRBbmFsb2dXRFRocmVzaG9sZHMoCisgICAgY29uc3QgQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IEFXRHksIHVpbnQzMl90IEFXRFRocmVzaG9sZHNIaWdoTG93KSB7CisgIGNvbnN0IF9fSU8gdWludDMyX3QgKnByZWcgPSBfX0FEQ19QVFJfUkVHX09GRlNFVCgKKyAgICAgIEFEQ3gtPlRSMSwKKyAgICAgICgoQVdEeSAmIEFEQ19BV0RfVFJYX1JFR09GRlNFVF9NQVNLKSA+PiBBRENfQVdEX1RSWF9SRUdPRkZTRVRfUE9TKSk7CisKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoKnByZWcsIChBV0RUaHJlc2hvbGRzSGlnaExvdyB8IEFEQ19UUjFfTFQxKSkgPj4KKyAgICAgICAgICAgICAgICAgICAgKCgoQVdEVGhyZXNob2xkc0hpZ2hMb3cgJiBBRENfQVdEX1RSWF9CSVRfSElHSF9NQVNLKSA+PgorICAgICAgICAgICAgICAgICAgICAgIEFEQ19BV0RfVFJYX0JJVF9ISUdIX1NISUZUNCkgJgorICAgICAgICAgICAgICAgICAgICAgfihBV0RUaHJlc2hvbGRzSGlnaExvdyAmIEFEQ19UUjFfTFQxKSkpOworfQorCisvKioKKyAqIEBicmllZiAgU2V0IEFEQyBhbmFsb2cgd2F0Y2hkb2cgZmlsdGVyaW5nIGNvbmZpZ3VyYXRpb24KKyAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcKKyAqICAgICAgICAgb24gZWl0aGVyIGdyb3VwcyByZWd1bGFyIG9yIGluamVjdGVkLgorICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllcywgdGhpcyBmZWF0dXJlIGlzIG9ubHkgYXZhaWxhYmxlIG9uIGZpcnN0CisgKiAgICAgICAgIGFuYWxvZyB3YXRjaGRvZyAoQVdEMSkKKyAqIEBybXRvbGwgVFIxICAgICAgQVdERklMVCAgICAgICAgTExfQURDX1NldEFXREZpbHRlcmluZ0NvbmZpZ3VyYXRpb24KKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEBwYXJhbSAgQVdEeSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRDEKKyAqIEBwYXJhbSAgRmlsdGVyaW5nQ29uZmlnIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0ZJTFRFUklOR19OT05FCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0ZJTFRFUklOR18yU0FNUExFUworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9GSUxURVJJTkdfM1NBTVBMRVMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfRklMVEVSSU5HXzRTQU1QTEVTCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0ZJTFRFUklOR181U0FNUExFUworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9GSUxURVJJTkdfNlNBTVBMRVMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfRklMVEVSSU5HXzdTQU1QTEVTCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0ZJTFRFUklOR184U0FNUExFUworICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19TZXRBV0RGaWx0ZXJpbmdDb25maWd1cmF0aW9uKAorICAgIEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBBV0R5LCB1aW50MzJfdCBGaWx0ZXJpbmdDb25maWcpIHsKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICAodm9pZCkoQVdEeSk7CisgIE1PRElGWV9SRUcoQURDeC0+VFIxLCBBRENfVFIxX0FXREZJTFQsIEZpbHRlcmluZ0NvbmZpZyk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgQURDIGFuYWxvZyB3YXRjaGRvZyBmaWx0ZXJpbmcgY29uZmlndXJhdGlvbgorICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllcywgdGhpcyBmZWF0dXJlIGlzIG9ubHkgYXZhaWxhYmxlIG9uIGZpcnN0CisgKiAgICAgICAgIGFuYWxvZyB3YXRjaGRvZyAoQVdEMSkKKyAqIEBybXRvbGwgVFIxICAgICAgQVdERklMVCAgICAgICAgTExfQURDX0dldEFXREZpbHRlcmluZ0NvbmZpZ3VyYXRpb24KKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEBwYXJhbSAgQVdEeSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRDEKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlOgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9GSUxURVJJTkdfTk9ORQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9GSUxURVJJTkdfMlNBTVBMRVMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfRklMVEVSSU5HXzNTQU1QTEVTCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0ZJTFRFUklOR180U0FNUExFUworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9GSUxURVJJTkdfNVNBTVBMRVMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfRklMVEVSSU5HXzZTQU1QTEVTCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0ZJTFRFUklOR183U0FNUExFUworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9GSUxURVJJTkdfOFNBTVBMRVMKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9BRENfR2V0QVdERmlsdGVyaW5nQ29uZmlndXJhdGlvbihjb25zdCBBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgQVdEeSkgeworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgICh2b2lkKShBV0R5KTsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeC0+VFIxLCBBRENfVFIxX0FXREZJTFQpKTsKK30KKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VGX0NvbmZpZ3VyYXRpb25fQURDX292ZXJzYW1wbGluZyBDb25maWd1cmF0aW9uIG9mIEFEQworICogdHJhbnN2ZXJzYWwgc2NvcGU6IG92ZXJzYW1wbGluZworICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiAgU2V0IEFEQyBvdmVyc2FtcGxpbmcgc2NvcGU6IEFEQyBncm91cHMgcmVndWxhciBhbmQtb3IgaW5qZWN0ZWQKKyAqICAgICAgICAgKGF2YWlsYWJpbGl0eSBvZiBBREMgZ3JvdXAgaW5qZWN0ZWQgZGVwZW5kcyBvbiBTVE0zMiBzZXJpZXMpLgorICogQG5vdGUgICBJZiBib3RoIGdyb3VwcyByZWd1bGFyIGFuZCBpbmplY3RlZCBhcmUgc2VsZWN0ZWQsCisgKiAgICAgICAgIHNwZWNpZnkgYmVoYXZpb3Igb2YgQURDIGdyb3VwIGluamVjdGVkIGludGVycnVwdGluZworICogICAgICAgICBncm91cCByZWd1bGFyOiB3aGVuIEFEQyBncm91cCBpbmplY3RlZCBpcyB0cmlnZ2VyZWQsCisgKiAgICAgICAgIHRoZSBvdmVyc2FtcGxpbmcgb24gQURDIGdyb3VwIHJlZ3VsYXIgaXMgZWl0aGVyCisgKiAgICAgICAgIHRlbXBvcmFyeSBzdG9wcGVkIGFuZCBjb250aW51ZWQsIG9yIHJlc3VtZWQgZnJvbSBzdGFydAorICogICAgICAgICAob3ZlcnNhbXBsZXIgYnVmZmVyIHJlc2V0KS4KKyAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcKKyAqICAgICAgICAgb24gZWl0aGVyIGdyb3VwcyByZWd1bGFyIG9yIGluamVjdGVkLgorICogQHJtdG9sbCBDRkdSMiAgICBST1ZTRSAgICAgICAgICBMTF9BRENfU2V0T3ZlclNhbXBsaW5nU2NvcGVcbgorICogICAgICAgICBDRkdSMiAgICBKT1ZTRSAgICAgICAgICBMTF9BRENfU2V0T3ZlclNhbXBsaW5nU2NvcGVcbgorICogICAgICAgICBDRkdSMiAgICBST1ZTTSAgICAgICAgICBMTF9BRENfU2V0T3ZlclNhbXBsaW5nU2NvcGUKKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEBwYXJhbSAgT3ZzU2NvcGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfRElTQUJMRQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19HUlBfUkVHVUxBUl9DT05USU5VRUQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfR1JQX1JFR1VMQVJfUkVTVU1FRAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19HUlBfSU5KRUNURUQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfR1JQX0lOSl9SRUdfUkVTVU1FRAorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19TZXRPdmVyU2FtcGxpbmdTY29wZShBRENfVHlwZURlZiAqQURDeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBPdnNTY29wZSkgeworICBNT0RJRllfUkVHKEFEQ3gtPkNGR1IyLCBBRENfQ0ZHUjJfUk9WU0UgfCBBRENfQ0ZHUjJfSk9WU0UgfCBBRENfQ0ZHUjJfUk9WU00sCisgICAgICAgICAgICAgT3ZzU2NvcGUpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IEFEQyBvdmVyc2FtcGxpbmcgc2NvcGU6IEFEQyBncm91cHMgcmVndWxhciBhbmQtb3IgaW5qZWN0ZWQKKyAqICAgICAgICAgKGF2YWlsYWJpbGl0eSBvZiBBREMgZ3JvdXAgaW5qZWN0ZWQgZGVwZW5kcyBvbiBTVE0zMiBzZXJpZXMpLgorICogQG5vdGUgICBJZiBib3RoIGdyb3VwcyByZWd1bGFyIGFuZCBpbmplY3RlZCBhcmUgc2VsZWN0ZWQsCisgKiAgICAgICAgIHNwZWNpZnkgYmVoYXZpb3Igb2YgQURDIGdyb3VwIGluamVjdGVkIGludGVycnVwdGluZworICogICAgICAgICBncm91cCByZWd1bGFyOiB3aGVuIEFEQyBncm91cCBpbmplY3RlZCBpcyB0cmlnZ2VyZWQsCisgKiAgICAgICAgIHRoZSBvdmVyc2FtcGxpbmcgb24gQURDIGdyb3VwIHJlZ3VsYXIgaXMgZWl0aGVyCisgKiAgICAgICAgIHRlbXBvcmFyeSBzdG9wcGVkIGFuZCBjb250aW51ZWQsIG9yIHJlc3VtZWQgZnJvbSBzdGFydAorICogICAgICAgICAob3ZlcnNhbXBsZXIgYnVmZmVyIHJlc2V0KS4KKyAqIEBybXRvbGwgQ0ZHUjIgICAgUk9WU0UgICAgICAgICAgTExfQURDX0dldE92ZXJTYW1wbGluZ1Njb3BlXG4KKyAqICAgICAgICAgQ0ZHUjIgICAgSk9WU0UgICAgICAgICAgTExfQURDX0dldE92ZXJTYW1wbGluZ1Njb3BlXG4KKyAqICAgICAgICAgQ0ZHUjIgICAgUk9WU00gICAgICAgICAgTExfQURDX0dldE92ZXJTYW1wbGluZ1Njb3BlCisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX0RJU0FCTEUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfR1JQX1JFR1VMQVJfQ09OVElOVUVECisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX0dSUF9SRUdVTEFSX1JFU1VNRUQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfR1JQX0lOSkVDVEVECisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX0dSUF9JTkpfUkVHX1JFU1VNRUQKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19HZXRPdmVyU2FtcGxpbmdTY29wZShjb25zdCBBRENfVHlwZURlZiAqQURDeCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVCgKKyAgICAgIEFEQ3gtPkNGR1IyLCBBRENfQ0ZHUjJfUk9WU0UgfCBBRENfQ0ZHUjJfSk9WU0UgfCBBRENfQ0ZHUjJfUk9WU00pKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFNldCBBREMgb3ZlcnNhbXBsaW5nIGRpc2NvbnRpbnVvdXMgbW9kZSAodHJpZ2dlcmVkIG1vZGUpCisgKiAgICAgICAgIG9uIHRoZSBzZWxlY3RlZCBBREMgZ3JvdXAuCisgKiBAbm90ZSAgIE51bWJlciBvZiBvdmVyc2FtcGxlZCBjb252ZXJzaW9ucyBhcmUgZG9uZSBlaXRoZXIgaW46CisgKiAgICAgICAgIC0gY29udGludW91cyBtb2RlIChhbGwgY29udmVyc2lvbnMgb2Ygb3ZlcnNhbXBsaW5nIHJhdGlvCisgKiAgICAgICAgICAgYXJlIGRvbmUgZnJvbSAxIHRyaWdnZXIpCisgKiAgICAgICAgIC0gZGlzY29udGludW91cyBtb2RlIChlYWNoIGNvbnZlcnNpb24gb2Ygb3ZlcnNhbXBsaW5nIHJhdGlvCisgKiAgICAgICAgICAgbmVlZHMgYSB0cmlnZ2VyKQorICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllcywgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAqICAgICAgICAgQURDIHN0YXRlOgorICogICAgICAgICBBREMgbXVzdCBiZSBkaXNhYmxlZCBvciBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZworICogICAgICAgICBvbiBncm91cCByZWd1bGFyLgorICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllcywgb3ZlcnNhbXBsaW5nIGRpc2NvbnRpbnVvdXMgbW9kZQorICogICAgICAgICAodHJpZ2dlcmVkIG1vZGUpIGNhbiBiZSB1c2VkIG9ubHkgd2hlbiBvdmVyc2FtcGxpbmcgaXMKKyAqICAgICAgICAgc2V0IG9uIGdyb3VwIHJlZ3VsYXIgb25seSBhbmQgaW4gcmVzdW1lZCBtb2RlLgorICogQHJtdG9sbCBDRkdSMiAgICBUUk9WUyAgICAgICAgICBMTF9BRENfU2V0T3ZlclNhbXBsaW5nRGlzY29udAorICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICogQHBhcmFtICBPdmVyU2FtcGxpbmdEaXNjb250IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZworICogdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19SRUdfQ09OVAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19SRUdfRElTQ09OVAorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19TZXRPdmVyU2FtcGxpbmdEaXNjb250KAorICAgIEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBPdmVyU2FtcGxpbmdEaXNjb250KSB7CisgIE1PRElGWV9SRUcoQURDeC0+Q0ZHUjIsIEFEQ19DRkdSMl9UUk9WUywgT3ZlclNhbXBsaW5nRGlzY29udCk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgQURDIG92ZXJzYW1wbGluZyBkaXNjb250aW51b3VzIG1vZGUgKHRyaWdnZXJlZCBtb2RlKQorICogICAgICAgICBvbiB0aGUgc2VsZWN0ZWQgQURDIGdyb3VwLgorICogQG5vdGUgICBOdW1iZXIgb2Ygb3ZlcnNhbXBsZWQgY29udmVyc2lvbnMgYXJlIGRvbmUgZWl0aGVyIGluOgorICogICAgICAgICAtIGNvbnRpbnVvdXMgbW9kZSAoYWxsIGNvbnZlcnNpb25zIG9mIG92ZXJzYW1wbGluZyByYXRpbworICogICAgICAgICAgIGFyZSBkb25lIGZyb20gMSB0cmlnZ2VyKQorICogICAgICAgICAtIGRpc2NvbnRpbnVvdXMgbW9kZSAoZWFjaCBjb252ZXJzaW9uIG9mIG92ZXJzYW1wbGluZyByYXRpbworICogICAgICAgICAgIG5lZWRzIGEgdHJpZ2dlcikKKyAqIEBybXRvbGwgQ0ZHUjIgICAgVFJPVlMgICAgICAgICAgTExfQURDX0dldE92ZXJTYW1wbGluZ0Rpc2NvbnQKKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfUkVHX0NPTlQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfUkVHX0RJU0NPTlQKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9BRENfR2V0T3ZlclNhbXBsaW5nRGlzY29udChjb25zdCBBRENfVHlwZURlZiAqQURDeCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChBREN4LT5DRkdSMiwgQURDX0NGR1IyX1RST1ZTKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBTZXQgQURDIG92ZXJzYW1wbGluZworICogICAgICAgICAoaW1wYWN0aW5nIGJvdGggQURDIGdyb3VwcyByZWd1bGFyIGFuZCBpbmplY3RlZCkKKyAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBzZXQgdGhlIDIgaXRlbXMgb2Ygb3ZlcnNhbXBsaW5nIGNvbmZpZ3VyYXRpb246CisgKiAgICAgICAgIC0gcmF0aW8KKyAqICAgICAgICAgLSBzaGlmdAorICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllcywgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAqICAgICAgICAgQURDIHN0YXRlOgorICogICAgICAgICBBREMgbXVzdCBiZSBkaXNhYmxlZCBvciBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZworICogICAgICAgICBvbiBlaXRoZXIgZ3JvdXBzIHJlZ3VsYXIgb3IgaW5qZWN0ZWQuCisgKiBAcm10b2xsIENGR1IyICAgIE9WU1MgICAgICAgICAgIExMX0FEQ19Db25maWdPdmVyU2FtcGxpbmdSYXRpb1NoaWZ0XG4KKyAqICAgICAgICAgQ0ZHUjIgICAgT1ZTUiAgICAgICAgICAgTExfQURDX0NvbmZpZ092ZXJTYW1wbGluZ1JhdGlvU2hpZnQKKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEBwYXJhbSAgUmF0aW8gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfUkFUSU9fMgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19SQVRJT180CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1JBVElPXzgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfUkFUSU9fMTYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfUkFUSU9fMzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfUkFUSU9fNjQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfUkFUSU9fMTI4CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1JBVElPXzI1NgorICogQHBhcmFtICBTaGlmdCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19TSElGVF9OT05FCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfU0hJRlRfUklHSFRfMgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19TSElGVF9SSUdIVF8zCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfU0hJRlRfUklHSFRfNQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19TSElGVF9SSUdIVF82CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfU0hJRlRfUklHSFRfOAorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19Db25maWdPdmVyU2FtcGxpbmdSYXRpb1NoaWZ0KEFEQ19UeXBlRGVmICpBREN4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUmF0aW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBTaGlmdCkgeworICBNT0RJRllfUkVHKEFEQ3gtPkNGR1IyLCAoQURDX0NGR1IyX09WU1MgfCBBRENfQ0ZHUjJfT1ZTUiksIChTaGlmdCB8IFJhdGlvKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgQURDIG92ZXJzYW1wbGluZyByYXRpbworICogICAgICAgIChpbXBhY3RpbmcgYm90aCBBREMgZ3JvdXBzIHJlZ3VsYXIgYW5kIGluamVjdGVkKQorICogQHJtdG9sbCBDRkdSMiAgICBPVlNSICAgICAgICAgICBMTF9BRENfR2V0T3ZlclNhbXBsaW5nUmF0aW8KKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEByZXR2YWwgUmF0aW8gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfUkFUSU9fMgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19SQVRJT180CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1JBVElPXzgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfUkFUSU9fMTYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfUkFUSU9fMzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfUkFUSU9fNjQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfUkFUSU9fMTI4CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1JBVElPXzI1NgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0dldE92ZXJTYW1wbGluZ1JhdGlvKGNvbnN0IEFEQ19UeXBlRGVmICpBREN4KSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEFEQ3gtPkNGR1IyLCBBRENfQ0ZHUjJfT1ZTUikpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IEFEQyBvdmVyc2FtcGxpbmcgc2hpZnQKKyAqICAgICAgICAoaW1wYWN0aW5nIGJvdGggQURDIGdyb3VwcyByZWd1bGFyIGFuZCBpbmplY3RlZCkKKyAqIEBybXRvbGwgQ0ZHUjIgICAgT1ZTUyAgICAgICAgICAgTExfQURDX0dldE92ZXJTYW1wbGluZ1NoaWZ0CisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcmV0dmFsIFNoaWZ0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1NISUZUX05PTkUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfU0hJRlRfUklHSFRfMQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19TSElGVF9SSUdIVF8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfU0hJRlRfUklHSFRfNAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19TSElGVF9SSUdIVF81CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfU0hJRlRfUklHSFRfNworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19TSElGVF9SSUdIVF84CisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfR2V0T3ZlclNhbXBsaW5nU2hpZnQoY29uc3QgQURDX1R5cGVEZWYgKkFEQ3gpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeC0+Q0ZHUjIsIEFEQ19DRkdSMl9PVlNTKSk7Cit9CisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FRl9Db25maWd1cmF0aW9uX0FEQ19NdWx0aW1vZGUgQ29uZmlndXJhdGlvbiBvZiBBREMKKyAqIGhpZXJhcmNoaWNhbCBzY29wZTogbXVsdGltb2RlCisgKiBAeworICovCisKKyNpZiBkZWZpbmVkKEFEQ19NVUxUSU1PREVfU1VQUE9SVCkKKy8qKgorICogQGJyaWVmICBTZXQgQURDIG11bHRpbW9kZSBjb25maWd1cmF0aW9uIHRvIG9wZXJhdGUgaW4gaW5kZXBlbmRlbnQgbW9kZQorICogICAgICAgICBvciBtdWx0aW1vZGUgKGZvciBkZXZpY2VzIHdpdGggc2V2ZXJhbCBBREMgaW5zdGFuY2VzKS4KKyAqIEBub3RlICAgSWYgbXVsdGltb2RlIGNvbmZpZ3VyYXRpb246IHRoZSBzZWxlY3RlZCBBREMgaW5zdGFuY2UgaXMKKyAqICAgICAgICAgZWl0aGVyIG1hc3RlciBvciBzbGF2ZSBkZXBlbmRpbmcgb24gaGFyZHdhcmUuCisgKiAgICAgICAgIFJlZmVyIHRvIHJlZmVyZW5jZSBtYW51YWwuCisgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICogICAgICAgICBBREMgc3RhdGU6CisgKiAgICAgICAgIEFsbCBBREMgaW5zdGFuY2VzIG9mIHRoZSBBREMgY29tbW9uIGdyb3VwIG11c3QgYmUgZGlzYWJsZWQuCisgKiAgICAgICAgIFRoaXMgY2hlY2sgY2FuIGJlIGRvbmUgd2l0aCBmdW5jdGlvbiBAcmVmIExMX0FEQ19Jc0VuYWJsZWQoKSBmb3IgZWFjaAorICogICAgICAgICBBREMgaW5zdGFuY2Ugb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvCisgKiAgICAgICAgIEByZWYgX19MTF9BRENfSVNfRU5BQkxFRF9BTExfQ09NTU9OX0lOU1RBTkNFKCkuCisgKiBAcm10b2xsIENDUiAgICAgIERVQUwgICAgICAgICAgIExMX0FEQ19TZXRNdWx0aW1vZGUKKyAqIEBwYXJhbSAgQURDeHlfQ09NTU9OIEFEQyBjb21tb24gaW5zdGFuY2UKKyAqICAgICAgICAgKGNhbiBiZSBzZXQgZGlyZWN0bHkgZnJvbSBDTVNJUyBkZWZpbml0aW9uIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybworICogQHJlZiBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoKSApCisgKiBAcGFyYW0gIE11bHRpbW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX0lOREVQRU5ERU5UCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfRFVBTF9SRUdfU0lNVUxUCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfRFVBTF9SRUdfSU5URVJMCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfRFVBTF9JTkpfU0lNVUxUCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfRFVBTF9JTkpfQUxURVJOCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfRFVBTF9SRUdfU0lNX0lOSl9TSU0KKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19NVUxUSV9EVUFMX1JFR19TSU1fSU5KX0FMVAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX0RVQUxfUkVHX0lOVF9JTkpfU0lNCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1NldE11bHRpbW9kZShBRENfQ29tbW9uX1R5cGVEZWYgKkFEQ3h5X0NPTU1PTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgTXVsdGltb2RlKSB7CisgIE1PRElGWV9SRUcoQURDeHlfQ09NTU9OLT5DQ1IsIEFEQ19DQ1JfRFVBTCwgTXVsdGltb2RlKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBBREMgbXVsdGltb2RlIGNvbmZpZ3VyYXRpb24gdG8gb3BlcmF0ZSBpbiBpbmRlcGVuZGVudCBtb2RlCisgKiAgICAgICAgIG9yIG11bHRpbW9kZSAoZm9yIGRldmljZXMgd2l0aCBzZXZlcmFsIEFEQyBpbnN0YW5jZXMpLgorICogQG5vdGUgICBJZiBtdWx0aW1vZGUgY29uZmlndXJhdGlvbjogdGhlIHNlbGVjdGVkIEFEQyBpbnN0YW5jZSBpcworICogICAgICAgICBlaXRoZXIgbWFzdGVyIG9yIHNsYXZlIGRlcGVuZGluZyBvbiBoYXJkd2FyZS4KKyAqICAgICAgICAgUmVmZXIgdG8gcmVmZXJlbmNlIG1hbnVhbC4KKyAqIEBybXRvbGwgQ0NSICAgICAgRFVBTCAgICAgICAgICAgTExfQURDX0dldE11bHRpbW9kZQorICogQHBhcmFtICBBREN4eV9DT01NT04gQURDIGNvbW1vbiBpbnN0YW5jZQorICogICAgICAgICAoY2FuIGJlIHNldCBkaXJlY3RseSBmcm9tIENNU0lTIGRlZmluaXRpb24gb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvCisgKiBAcmVmIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRSgpICkKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19NVUxUSV9JTkRFUEVOREVOVAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX0RVQUxfUkVHX1NJTVVMVAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX0RVQUxfUkVHX0lOVEVSTAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX0RVQUxfSU5KX1NJTVVMVAorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX0RVQUxfSU5KX0FMVEVSTgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX0RVQUxfUkVHX1NJTV9JTkpfU0lNCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfRFVBTF9SRUdfU0lNX0lOSl9BTFQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19NVUxUSV9EVUFMX1JFR19JTlRfSU5KX1NJTQorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX0FEQ19HZXRNdWx0aW1vZGUoY29uc3QgQURDX0NvbW1vbl9UeXBlRGVmICpBREN4eV9DT01NT04pIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeHlfQ09NTU9OLT5DQ1IsIEFEQ19DQ1JfRFVBTCkpOworfQorCisvKioKKyAqIEBicmllZiAgU2V0IEFEQyBtdWx0aW1vZGUgY29udmVyc2lvbiBkYXRhIHRyYW5zZmVyOiBubyB0cmFuc2ZlcgorICogICAgICAgICBvciB0cmFuc2ZlciBieSBETUEuCisgKiBAbm90ZSAgIElmIEFEQyBtdWx0aW1vZGUgdHJhbnNmZXIgYnkgRE1BIGlzIG5vdCBzZWxlY3RlZDoKKyAqICAgICAgICAgZWFjaCBBREMgdXNlcyBpdHMgb3duIERNQSBjaGFubmVsLCB3aXRoIGl0cyBpbmRpdmlkdWFsCisgKiAgICAgICAgIERNQSB0cmFuc2ZlciBzZXR0aW5ncy4KKyAqICAgICAgICAgSWYgQURDIG11bHRpbW9kZSB0cmFuc2ZlciBieSBETUEgaXMgc2VsZWN0ZWQ6CisgKiAgICAgICAgIE9uZSBETUEgY2hhbm5lbCBpcyB1c2VkIGZvciBib3RoIEFEQyAoRE1BIG9mIEFEQyBtYXN0ZXIpCisgKiAgICAgICAgIFNwZWNpZmllcyB0aGUgRE1BIHJlcXVlc3RzIG1vZGU6CisgKiAgICAgICAgIC0gTGltaXRlZCBtb2RlIChPbmUgc2hvdCBtb2RlKTogRE1BIHRyYW5zZmVyIHJlcXVlc3RzIGFyZSBzdG9wcGVkCisgKiAgICAgICAgICAgd2hlbiBudW1iZXIgb2YgRE1BIGRhdGEgdHJhbnNmZXJzIChudW1iZXIgb2YKKyAqICAgICAgICAgICBBREMgY29udmVyc2lvbnMpIGlzIHJlYWNoZWQuCisgKiAgICAgICAgICAgVGhpcyBBREMgbW9kZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHdpdGggRE1BIG1vZGUgbm9uLWNpcmN1bGFyLgorICogICAgICAgICAtIFVubGltaXRlZCBtb2RlOiBETUEgdHJhbnNmZXIgcmVxdWVzdHMgYXJlIHVubGltaXRlZCwKKyAqICAgICAgICAgICB3aGF0ZXZlciBudW1iZXIgb2YgRE1BIGRhdGEgdHJhbnNmZXJzIChudW1iZXIgb2YKKyAqICAgICAgICAgICBBREMgY29udmVyc2lvbnMpLgorICogICAgICAgICAgIFRoaXMgQURDIG1vZGUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoIERNQSBtb2RlIGNpcmN1bGFyLgorICogQG5vdGUgICBJZiBBREMgRE1BIHJlcXVlc3RzIG1vZGUgaXMgc2V0IHRvIHVubGltaXRlZCBhbmQgRE1BIGlzIHNldCB0bworICogICAgICAgICBtb2RlIG5vbi1jaXJjdWxhcjoKKyAqICAgICAgICAgd2hlbiBETUEgdHJhbnNmZXJzIHNpemUgd2lsbCBiZSByZWFjaGVkLCBETUEgd2lsbCBzdG9wIHRyYW5zZmVycyBvZgorICogICAgICAgICBBREMgY29udmVyc2lvbnMgZGF0YSBBREMgd2lsbCByYWlzZSBhbiBvdmVycnVuIGVycm9yCisgKiAgICAgICAgIChvdmVycnVuIGZsYWcgYW5kIGludGVycnVwdGlvbiBpZiBlbmFibGVkKS4KKyAqIEBub3RlICAgSG93IHRvIHJldHJpZXZlIG11bHRpbW9kZSBjb252ZXJzaW9uIGRhdGE6CisgKiAgICAgICAgIFdoYXRldmVyIG11bHRpbW9kZSB0cmFuc2ZlciBieSBETUEgc2V0dGluZzogdXNpbmcgZnVuY3Rpb24KKyAqICAgICAgICAgQHJlZiBMTF9BRENfUkVHX1JlYWRNdWx0aUNvbnZlcnNpb25EYXRhMzIoKS4KKyAqICAgICAgICAgSWYgQURDIG11bHRpbW9kZSB0cmFuc2ZlciBieSBETUEgaXMgc2VsZWN0ZWQ6IGNvbnZlcnNpb24gZGF0YQorICogICAgICAgICBpcyBhIHJhdyBkYXRhIHdpdGggQURDIG1hc3RlciBhbmQgc2xhdmUgY29uY2F0ZW5hdGVkLgorICogICAgICAgICBBIG1hY3JvIGlzIGF2YWlsYWJsZSB0byBnZXQgdGhlIGNvbnZlcnNpb24gZGF0YSBvZgorICogICAgICAgICBBREMgbWFzdGVyIG9yIEFEQyBzbGF2ZTogc2VlIGhlbHBlciBtYWNybworICogICAgICAgICBAcmVmIF9fTExfQURDX01VTFRJX0NPTlZfREFUQV9NQVNURVJfU0xBVkUoKS4KKyAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAqICAgICAgICAgQWxsIEFEQyBpbnN0YW5jZXMgb2YgdGhlIEFEQyBjb21tb24gZ3JvdXAgbXVzdCBiZSBkaXNhYmxlZAorICogICAgICAgICBvciBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZyBvbiBncm91cCByZWd1bGFyLgorICogQHJtdG9sbCBDQ1IgICAgICBNRE1BICAgICAgICAgICBMTF9BRENfU2V0TXVsdGlETUFUcmFuc2ZlclxuCisgKiAgICAgICAgIENDUiAgICAgIERNQUNGRyAgICAgICAgIExMX0FEQ19TZXRNdWx0aURNQVRyYW5zZmVyCisgKiBAcGFyYW0gIEFEQ3h5X0NPTU1PTiBBREMgY29tbW9uIGluc3RhbmNlCisgKiAgICAgICAgIChjYW4gYmUgc2V0IGRpcmVjdGx5IGZyb20gQ01TSVMgZGVmaW5pdGlvbiBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8KKyAqIEByZWYgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKCkgKQorICogQHBhcmFtICBNdWx0aURNQVRyYW5zZmVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfUkVHX0RNQV9FQUNIX0FEQworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX1JFR19ETUFfTElNSVRfUkVTMTJfMTBCCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfUkVHX0RNQV9MSU1JVF9SRVM4XzZCCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfUkVHX0RNQV9VTkxNVF9SRVMxMl8xMEIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19NVUxUSV9SRUdfRE1BX1VOTE1UX1JFUzhfNkIKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfU2V0TXVsdGlETUFUcmFuc2ZlcigKKyAgICBBRENfQ29tbW9uX1R5cGVEZWYgKkFEQ3h5X0NPTU1PTiwgdWludDMyX3QgTXVsdGlETUFUcmFuc2ZlcikgeworICBNT0RJRllfUkVHKEFEQ3h5X0NPTU1PTi0+Q0NSLCBBRENfQ0NSX01ETUEgfCBBRENfQ0NSX0RNQUNGRywKKyAgICAgICAgICAgICBNdWx0aURNQVRyYW5zZmVyKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBBREMgbXVsdGltb2RlIGNvbnZlcnNpb24gZGF0YSB0cmFuc2Zlcjogbm8gdHJhbnNmZXIKKyAqICAgICAgICAgb3IgdHJhbnNmZXIgYnkgRE1BLgorICogQG5vdGUgICBJZiBBREMgbXVsdGltb2RlIHRyYW5zZmVyIGJ5IERNQSBpcyBub3Qgc2VsZWN0ZWQ6CisgKiAgICAgICAgIGVhY2ggQURDIHVzZXMgaXRzIG93biBETUEgY2hhbm5lbCwgd2l0aCBpdHMgaW5kaXZpZHVhbAorICogICAgICAgICBETUEgdHJhbnNmZXIgc2V0dGluZ3MuCisgKiAgICAgICAgIElmIEFEQyBtdWx0aW1vZGUgdHJhbnNmZXIgYnkgRE1BIGlzIHNlbGVjdGVkOgorICogICAgICAgICBPbmUgRE1BIGNoYW5uZWwgaXMgdXNlZCBmb3IgYm90aCBBREMgKERNQSBvZiBBREMgbWFzdGVyKQorICogICAgICAgICBTcGVjaWZpZXMgdGhlIERNQSByZXF1ZXN0cyBtb2RlOgorICogICAgICAgICAtIExpbWl0ZWQgbW9kZSAoT25lIHNob3QgbW9kZSk6IERNQSB0cmFuc2ZlciByZXF1ZXN0cyBhcmUgc3RvcHBlZAorICogICAgICAgICAgIHdoZW4gbnVtYmVyIG9mIERNQSBkYXRhIHRyYW5zZmVycyAobnVtYmVyIG9mCisgKiAgICAgICAgICAgQURDIGNvbnZlcnNpb25zKSBpcyByZWFjaGVkLgorICogICAgICAgICAgIFRoaXMgQURDIG1vZGUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoIERNQSBtb2RlIG5vbi1jaXJjdWxhci4KKyAqICAgICAgICAgLSBVbmxpbWl0ZWQgbW9kZTogRE1BIHRyYW5zZmVyIHJlcXVlc3RzIGFyZSB1bmxpbWl0ZWQsCisgKiAgICAgICAgICAgd2hhdGV2ZXIgbnVtYmVyIG9mIERNQSBkYXRhIHRyYW5zZmVycyAobnVtYmVyIG9mCisgKiAgICAgICAgICAgQURDIGNvbnZlcnNpb25zKS4KKyAqICAgICAgICAgICBUaGlzIEFEQyBtb2RlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgd2l0aCBETUEgbW9kZSBjaXJjdWxhci4KKyAqIEBub3RlICAgSWYgQURDIERNQSByZXF1ZXN0cyBtb2RlIGlzIHNldCB0byB1bmxpbWl0ZWQgYW5kIERNQSBpcyBzZXQgdG8KKyAqICAgICAgICAgbW9kZSBub24tY2lyY3VsYXI6CisgKiAgICAgICAgIHdoZW4gRE1BIHRyYW5zZmVycyBzaXplIHdpbGwgYmUgcmVhY2hlZCwgRE1BIHdpbGwgc3RvcCB0cmFuc2ZlcnMgb2YKKyAqICAgICAgICAgQURDIGNvbnZlcnNpb25zIGRhdGEgQURDIHdpbGwgcmFpc2UgYW4gb3ZlcnJ1biBlcnJvcgorICogICAgICAgICAob3ZlcnJ1biBmbGFnIGFuZCBpbnRlcnJ1cHRpb24gaWYgZW5hYmxlZCkuCisgKiBAbm90ZSAgIEhvdyB0byByZXRyaWV2ZSBtdWx0aW1vZGUgY29udmVyc2lvbiBkYXRhOgorICogICAgICAgICBXaGF0ZXZlciBtdWx0aW1vZGUgdHJhbnNmZXIgYnkgRE1BIHNldHRpbmc6IHVzaW5nIGZ1bmN0aW9uCisgKiAgICAgICAgIEByZWYgTExfQURDX1JFR19SZWFkTXVsdGlDb252ZXJzaW9uRGF0YTMyKCkuCisgKiAgICAgICAgIElmIEFEQyBtdWx0aW1vZGUgdHJhbnNmZXIgYnkgRE1BIGlzIHNlbGVjdGVkOiBjb252ZXJzaW9uIGRhdGEKKyAqICAgICAgICAgaXMgYSByYXcgZGF0YSB3aXRoIEFEQyBtYXN0ZXIgYW5kIHNsYXZlIGNvbmNhdGVuYXRlZC4KKyAqICAgICAgICAgQSBtYWNybyBpcyBhdmFpbGFibGUgdG8gZ2V0IHRoZSBjb252ZXJzaW9uIGRhdGEgb2YKKyAqICAgICAgICAgQURDIG1hc3RlciBvciBBREMgc2xhdmU6IHNlZSBoZWxwZXIgbWFjcm8KKyAqICAgICAgICAgQHJlZiBfX0xMX0FEQ19NVUxUSV9DT05WX0RBVEFfTUFTVEVSX1NMQVZFKCkuCisgKiBAcm10b2xsIENDUiAgICAgIE1ETUEgICAgICAgICAgIExMX0FEQ19HZXRNdWx0aURNQVRyYW5zZmVyXG4KKyAqICAgICAgICAgQ0NSICAgICAgRE1BQ0ZHICAgICAgICAgTExfQURDX0dldE11bHRpRE1BVHJhbnNmZXIKKyAqIEBwYXJhbSAgQURDeHlfQ09NTU9OIEFEQyBjb21tb24gaW5zdGFuY2UKKyAqICAgICAgICAgKGNhbiBiZSBzZXQgZGlyZWN0bHkgZnJvbSBDTVNJUyBkZWZpbml0aW9uIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybworICogQHJlZiBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoKSApCisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfUkVHX0RNQV9FQUNIX0FEQworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX1JFR19ETUFfTElNSVRfUkVTMTJfMTBCCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfUkVHX0RNQV9MSU1JVF9SRVM4XzZCCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfUkVHX0RNQV9VTkxNVF9SRVMxMl8xMEIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19NVUxUSV9SRUdfRE1BX1VOTE1UX1JFUzhfNkIKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9BRENfR2V0TXVsdGlETUFUcmFuc2Zlcihjb25zdCBBRENfQ29tbW9uX1R5cGVEZWYgKkFEQ3h5X0NPTU1PTikgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChBREN4eV9DT01NT04tPkNDUiwgQURDX0NDUl9NRE1BIHwgQURDX0NDUl9ETUFDRkcpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFNldCBBREMgbXVsdGltb2RlIGRlbGF5IGJldHdlZW4gMiBzYW1wbGluZyBwaGFzZXMuCisgKiBAbm90ZSAgIFRoZSBzYW1wbGluZyBkZWxheSByYW5nZSBkZXBlbmRzIG9uIEFEQyByZXNvbHV0aW9uOgorICogICAgICAgICAtIEFEQyByZXNvbHV0aW9uIDEyIGJpdHMgY2FuIGhhdmUgbWF4aW11bSBkZWxheSBvZiAxMiBjeWNsZXMuCisgKiAgICAgICAgIC0gQURDIHJlc29sdXRpb24gMTAgYml0cyBjYW4gaGF2ZSBtYXhpbXVtIGRlbGF5IG9mIDEwIGN5Y2xlcy4KKyAqICAgICAgICAgLSBBREMgcmVzb2x1dGlvbiAgOCBiaXRzIGNhbiBoYXZlIG1heGltdW0gZGVsYXkgb2YgIDggY3ljbGVzLgorICogICAgICAgICAtIEFEQyByZXNvbHV0aW9uICA2IGJpdHMgY2FuIGhhdmUgbWF4aW11bSBkZWxheSBvZiAgNiBjeWNsZXMuCisgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICogICAgICAgICBBREMgc3RhdGU6CisgKiAgICAgICAgIEFsbCBBREMgaW5zdGFuY2VzIG9mIHRoZSBBREMgY29tbW9uIGdyb3VwIG11c3QgYmUgZGlzYWJsZWQuCisgKiAgICAgICAgIFRoaXMgY2hlY2sgY2FuIGJlIGRvbmUgd2l0aCBmdW5jdGlvbiBAcmVmIExMX0FEQ19Jc0VuYWJsZWQoKSBmb3IgZWFjaAorICogICAgICAgICBBREMgaW5zdGFuY2Ugb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvIGhlbHBlciBtYWNybworICogICAgICAgICBAcmVmIF9fTExfQURDX0lTX0VOQUJMRURfQUxMX0NPTU1PTl9JTlNUQU5DRSgpLgorICogQHJtdG9sbCBDQ1IgICAgICBERUxBWSAgICAgICAgICBMTF9BRENfU2V0TXVsdGlUd29TYW1wbGluZ0RlbGF5CisgKiBAcGFyYW0gIEFEQ3h5X0NPTU1PTiBBREMgY29tbW9uIGluc3RhbmNlCisgKiAgICAgICAgIChjYW4gYmUgc2V0IGRpcmVjdGx5IGZyb20gQ01TSVMgZGVmaW5pdGlvbiBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8KKyAqIEByZWYgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKCkgKQorICogQHBhcmFtICBNdWx0aVR3b1NhbXBsaW5nRGVsYXkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nCisgKiB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzFDWUNMRQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX1RXT1NNUF9ERUxBWV8yQ1lDTEVTCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzNDWUNMRVMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfNENZQ0xFUworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX1RXT1NNUF9ERUxBWV81Q1lDTEVTCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzZDWUNMRVMgICgxKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX1RXT1NNUF9ERUxBWV83Q1lDTEVTICAoMSkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfOENZQ0xFUyAgKDIpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzlDWUNMRVMgICgyKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX1RXT1NNUF9ERUxBWV8xMENZQ0xFUyAoMikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfMTFDWUNMRVMgKDMpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzEyQ1lDTEVTICgzKQorICoKKyAqICAgICAgICAgKDEpIFBhcmFtZXRlciBhdmFpbGFibGUgb25seSBpZiBBREMgcmVzb2x1dGlvbiBpcyAxMiwgMTAgb3IgOCBiaXRzLlxuCisgKiAgICAgICAgICgyKSBQYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgaWYgQURDIHJlc29sdXRpb24gaXMgMTIgb3IgMTAgYml0cy5cbgorICogICAgICAgICAoMykgUGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IGlmIEFEQyByZXNvbHV0aW9uIGlzIDEyIGJpdHMuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1NldE11bHRpVHdvU2FtcGxpbmdEZWxheSgKKyAgICBBRENfQ29tbW9uX1R5cGVEZWYgKkFEQ3h5X0NPTU1PTiwgdWludDMyX3QgTXVsdGlUd29TYW1wbGluZ0RlbGF5KSB7CisgIE1PRElGWV9SRUcoQURDeHlfQ09NTU9OLT5DQ1IsIEFEQ19DQ1JfREVMQVksIE11bHRpVHdvU2FtcGxpbmdEZWxheSk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgQURDIG11bHRpbW9kZSBkZWxheSBiZXR3ZWVuIDIgc2FtcGxpbmcgcGhhc2VzLgorICogQHJtdG9sbCBDQ1IgICAgICBERUxBWSAgICAgICAgICBMTF9BRENfR2V0TXVsdGlUd29TYW1wbGluZ0RlbGF5CisgKiBAcGFyYW0gIEFEQ3h5X0NPTU1PTiBBREMgY29tbW9uIGluc3RhbmNlCisgKiAgICAgICAgIChjYW4gYmUgc2V0IGRpcmVjdGx5IGZyb20gQ01TSVMgZGVmaW5pdGlvbiBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8KKyAqIEByZWYgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKCkgKQorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX1RXT1NNUF9ERUxBWV8xQ1lDTEUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfMkNZQ0xFUworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX1RXT1NNUF9ERUxBWV8zQ1lDTEVTCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzRDWUNMRVMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfNUNZQ0xFUworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX1RXT1NNUF9ERUxBWV82Q1lDTEVTICAoMSkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfN0NZQ0xFUyAgKDEpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzhDWUNMRVMgICgyKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX1RXT1NNUF9ERUxBWV85Q1lDTEVTICAoMikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfMTBDWUNMRVMgKDIpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzExQ1lDTEVTICgzKQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX01VTFRJX1RXT1NNUF9ERUxBWV8xMkNZQ0xFUyAoMykKKyAqCisgKiAgICAgICAgICgxKSBQYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgaWYgQURDIHJlc29sdXRpb24gaXMgMTIsIDEwIG9yIDggYml0cy5cbgorICogICAgICAgICAoMikgUGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IGlmIEFEQyByZXNvbHV0aW9uIGlzIDEyIG9yIDEwIGJpdHMuXG4KKyAqICAgICAgICAgKDMpIFBhcmFtZXRlciBhdmFpbGFibGUgb25seSBpZiBBREMgcmVzb2x1dGlvbiBpcyAxMiBiaXRzLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX0FEQ19HZXRNdWx0aVR3b1NhbXBsaW5nRGVsYXkoY29uc3QgQURDX0NvbW1vbl9UeXBlRGVmICpBREN4eV9DT01NT04pIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeHlfQ09NTU9OLT5DQ1IsIEFEQ19DQ1JfREVMQVkpKTsKK30KKyNlbmRpZiAvKiBBRENfTVVMVElNT0RFX1NVUFBPUlQgKi8KKworLyoqCisgKiBAfQorICovCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FRl9PcGVyYXRpb25fQURDX0luc3RhbmNlIE9wZXJhdGlvbiBvbiBBREMgaGllcmFyY2hpY2FsCisgKiBzY29wZTogQURDIGluc3RhbmNlCisgKiBAeworICovCisKKy8qKgorICogQGJyaWVmICBQdXQgQURDIGluc3RhbmNlIGluIGRlZXAgcG93ZXIgZG93biBzdGF0ZS4KKyAqIEBub3RlICAgSW4gY2FzZSBvZiBBREMgY2FsaWJyYXRpb24gbmVjZXNzYXJ5OiBXaGVuIEFEQyBpcyBpbiBkZWVwLXBvd2VyLWRvd24KKyAqICAgICAgICAgc3RhdGUsIHRoZSBpbnRlcm5hbCBhbmFsb2cgY2FsaWJyYXRpb24gaXMgbG9zdC4gQWZ0ZXIgZXhpdGluZyBmcm9tCisgKiAgICAgICAgIGRlZXAgcG93ZXIgZG93biwgY2FsaWJyYXRpb24gbXVzdCBiZSByZWxhdW5jaGVkIG9yIGNhbGlicmF0aW9uIGZhY3RvcgorICogICAgICAgICAocHJlbGltaW5hcmlseSBzYXZlZCkgbXVzdCBiZSBzZXQgYmFjayBpbnRvIGNhbGlicmF0aW9uIHJlZ2lzdGVyLgorICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllcywgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAqICAgICAgICAgQURDIHN0YXRlOgorICogICAgICAgICBBREMgbXVzdCBiZSBBREMgZGlzYWJsZWQuCisgKiBAcm10b2xsIENSICAgICAgIERFRVBQV0QgICAgICAgIExMX0FEQ19FbmFibGVEZWVwUG93ZXJEb3duCisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0VuYWJsZURlZXBQb3dlckRvd24oQURDX1R5cGVEZWYgKkFEQ3gpIHsKKyAgLyogTm90ZTogV3JpdGUgcmVnaXN0ZXIgd2l0aCBzb21lIGFkZGl0aW9uYWwgYml0cyBmb3JjZWQgdG8gc3RhdGUgcmVzZXQgICAgICovCisgIC8qICAgICAgIGluc3RlYWQgb2YgbW9kaWZ5aW5nIG9ubHkgdGhlIHNlbGVjdGVkIGJpdCBmb3IgdGhpcyBmdW5jdGlvbiwgICAgICAqLworICAvKiAgICAgICB0byBub3QgaW50ZXJmZXJlIHdpdGggYml0cyB3aXRoIEhXIHByb3BlcnR5ICJycyIuICAgICAgICAgICAgICAgICAgKi8KKyAgTU9ESUZZX1JFRyhBREN4LT5DUiwgQURDX0NSX0JJVFNfUFJPUEVSVFlfUlMsIEFEQ19DUl9ERUVQUFdEKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgQURDIGRlZXAgcG93ZXIgZG93biBtb2RlLgorICogQG5vdGUgICBJbiBjYXNlIG9mIEFEQyBjYWxpYnJhdGlvbiBuZWNlc3Nhcnk6IFdoZW4gQURDIGlzIGluIGRlZXAtcG93ZXItZG93bgorICogICAgICAgICBzdGF0ZSwgdGhlIGludGVybmFsIGFuYWxvZyBjYWxpYnJhdGlvbiBpcyBsb3N0LiBBZnRlciBleGl0aW5nIGZyb20KKyAqICAgICAgICAgZGVlcCBwb3dlciBkb3duLCBjYWxpYnJhdGlvbiBtdXN0IGJlIHJlbGF1bmNoZWQgb3IgY2FsaWJyYXRpb24gZmFjdG9yCisgKiAgICAgICAgIChwcmVsaW1pbmFyaWx5IHNhdmVkKSBtdXN0IGJlIHNldCBiYWNrIGludG8gY2FsaWJyYXRpb24gcmVnaXN0ZXIuCisgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICogICAgICAgICBBREMgc3RhdGU6CisgKiAgICAgICAgIEFEQyBtdXN0IGJlIEFEQyBkaXNhYmxlZC4KKyAqIEBybXRvbGwgQ1IgICAgICAgREVFUFBXRCAgICAgICAgTExfQURDX0Rpc2FibGVEZWVwUG93ZXJEb3duCisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0Rpc2FibGVEZWVwUG93ZXJEb3duKEFEQ19UeXBlRGVmICpBREN4KSB7CisgIC8qIE5vdGU6IFdyaXRlIHJlZ2lzdGVyIHdpdGggc29tZSBhZGRpdGlvbmFsIGJpdHMgZm9yY2VkIHRvIHN0YXRlIHJlc2V0ICAgICAqLworICAvKiAgICAgICBpbnN0ZWFkIG9mIG1vZGlmeWluZyBvbmx5IHRoZSBzZWxlY3RlZCBiaXQgZm9yIHRoaXMgZnVuY3Rpb24sICAgICAgKi8KKyAgLyogICAgICAgdG8gbm90IGludGVyZmVyZSB3aXRoIGJpdHMgd2l0aCBIVyBwcm9wZXJ0eSAicnMiLiAgICAgICAgICAgICAgICAgICovCisgIENMRUFSX0JJVChBREN4LT5DUiwgKEFEQ19DUl9ERUVQUFdEIHwgQURDX0NSX0JJVFNfUFJPUEVSVFlfUlMpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCB0aGUgc2VsZWN0ZWQgQURDIGluc3RhbmNlIGRlZXAgcG93ZXIgZG93biBzdGF0ZS4KKyAqIEBybXRvbGwgQ1IgICAgICAgREVFUFBXRCAgICAgICAgTExfQURDX0lzRGVlcFBvd2VyRG93bkVuYWJsZWQKKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEByZXR2YWwgMDogZGVlcCBwb3dlciBkb3duIGlzIGRpc2FibGVkLCAxOiBkZWVwIHBvd2VyIGRvd24gaXMgZW5hYmxlZC4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9BRENfSXNEZWVwUG93ZXJEb3duRW5hYmxlZChjb25zdCBBRENfVHlwZURlZiAqQURDeCkgeworICByZXR1cm4gKChSRUFEX0JJVChBREN4LT5DUiwgQURDX0NSX0RFRVBQV0QpID09IChBRENfQ1JfREVFUFBXRCkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBBREMgaW5zdGFuY2UgaW50ZXJuYWwgdm9sdGFnZSByZWd1bGF0b3IuCisgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBhZnRlciBBREMgaW50ZXJuYWwgdm9sdGFnZSByZWd1bGF0b3IgZW5hYmxlLAorICogICAgICAgICBhIGRlbGF5IGZvciBBREMgaW50ZXJuYWwgdm9sdGFnZSByZWd1bGF0b3Igc3RhYmlsaXphdGlvbgorICogICAgICAgICBpcyByZXF1aXJlZCBiZWZvcmUgcGVyZm9ybWluZyBhIEFEQyBjYWxpYnJhdGlvbiBvciBBREMgZW5hYmxlLgorICogICAgICAgICBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0LCBwYXJhbWV0ZXIgdEFEQ1ZSRUdfU1RVUC4KKyAqICAgICAgICAgUmVmZXIgdG8gbGl0ZXJhbCBAcmVmIExMX0FEQ19ERUxBWV9JTlRFUk5BTF9SRUdVTF9TVEFCX1VTLgorICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllcywgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAqICAgICAgICAgQURDIHN0YXRlOgorICogICAgICAgICBBREMgbXVzdCBiZSBBREMgZGlzYWJsZWQuCisgKiBAcm10b2xsIENSICAgICAgIEFEVlJFR0VOICAgICAgIExMX0FEQ19FbmFibGVJbnRlcm5hbFJlZ3VsYXRvcgorICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19FbmFibGVJbnRlcm5hbFJlZ3VsYXRvcihBRENfVHlwZURlZiAqQURDeCkgeworICAvKiBOb3RlOiBXcml0ZSByZWdpc3RlciB3aXRoIHNvbWUgYWRkaXRpb25hbCBiaXRzIGZvcmNlZCB0byBzdGF0ZSByZXNldCAgICAgKi8KKyAgLyogICAgICAgaW5zdGVhZCBvZiBtb2RpZnlpbmcgb25seSB0aGUgc2VsZWN0ZWQgYml0IGZvciB0aGlzIGZ1bmN0aW9uLCAgICAgICovCisgIC8qICAgICAgIHRvIG5vdCBpbnRlcmZlcmUgd2l0aCBiaXRzIHdpdGggSFcgcHJvcGVydHkgInJzIi4gICAgICAgICAgICAgICAgICAqLworICBNT0RJRllfUkVHKEFEQ3gtPkNSLCBBRENfQ1JfQklUU19QUk9QRVJUWV9SUywgQURDX0NSX0FEVlJFR0VOKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgQURDIGludGVybmFsIHZvbHRhZ2UgcmVndWxhdG9yLgorICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllcywgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAqICAgICAgICAgQURDIHN0YXRlOgorICogICAgICAgICBBREMgbXVzdCBiZSBBREMgZGlzYWJsZWQuCisgKiBAcm10b2xsIENSICAgICAgIEFEVlJFR0VOICAgICAgIExMX0FEQ19EaXNhYmxlSW50ZXJuYWxSZWd1bGF0b3IKKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfRGlzYWJsZUludGVybmFsUmVndWxhdG9yKEFEQ19UeXBlRGVmICpBREN4KSB7CisgIENMRUFSX0JJVChBREN4LT5DUiwgKEFEQ19DUl9BRFZSRUdFTiB8IEFEQ19DUl9CSVRTX1BST1BFUlRZX1JTKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgdGhlIHNlbGVjdGVkIEFEQyBpbnN0YW5jZSBpbnRlcm5hbCB2b2x0YWdlIHJlZ3VsYXRvciBzdGF0ZS4KKyAqIEBybXRvbGwgQ1IgICAgICAgQURWUkVHRU4gICAgICAgTExfQURDX0lzSW50ZXJuYWxSZWd1bGF0b3JFbmFibGVkCisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcmV0dmFsIDA6IGludGVybmFsIHJlZ3VsYXRvciBpcyBkaXNhYmxlZCwgMTogaW50ZXJuYWwgcmVndWxhdG9yIGlzIGVuYWJsZWQuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfQURDX0lzSW50ZXJuYWxSZWd1bGF0b3JFbmFibGVkKGNvbnN0IEFEQ19UeXBlRGVmICpBREN4KSB7CisgIHJldHVybiAoKFJFQURfQklUKEFEQ3gtPkNSLCBBRENfQ1JfQURWUkVHRU4pID09IChBRENfQ1JfQURWUkVHRU4pKSA/IDFVTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIHRoZSBzZWxlY3RlZCBBREMgaW5zdGFuY2UuCisgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBhZnRlciBBREMgZW5hYmxlLCBhIGRlbGF5IGZvcgorICogICAgICAgICBBREMgaW50ZXJuYWwgYW5hbG9nIHN0YWJpbGl6YXRpb24gaXMgcmVxdWlyZWQgYmVmb3JlIHBlcmZvcm1pbmcgYQorICogICAgICAgICBBREMgY29udmVyc2lvbiBzdGFydC4KKyAqICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCwgcGFyYW1ldGVyIHRTVEFCLgorICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllcywgZmxhZyBMTF9BRENfRkxBR19BRFJEWSBpcyByYWlzZWQgd2hlbiB0aGUgQURDCisgKiAgICAgICAgIGlzIGVuYWJsZWQgYW5kIHdoZW4gY29udmVyc2lvbiBjbG9jayBpcyBhY3RpdmUuCisgKiAgICAgICAgIChub3Qgb25seSBjb3JlIGNsb2NrOiB0aGlzIEFEQyBoYXMgYSBkdWFsIGNsb2NrIGRvbWFpbikKKyAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAqICAgICAgICAgQURDIG11c3QgYmUgQURDIGRpc2FibGVkIGFuZCBBREMgaW50ZXJuYWwgdm9sdGFnZSByZWd1bGF0b3IgZW5hYmxlZC4KKyAqIEBybXRvbGwgQ1IgICAgICAgQURFTiAgICAgICAgICAgTExfQURDX0VuYWJsZQorICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19FbmFibGUoQURDX1R5cGVEZWYgKkFEQ3gpIHsKKyAgLyogTm90ZTogV3JpdGUgcmVnaXN0ZXIgd2l0aCBzb21lIGFkZGl0aW9uYWwgYml0cyBmb3JjZWQgdG8gc3RhdGUgcmVzZXQgICAgICovCisgIC8qICAgICAgIGluc3RlYWQgb2YgbW9kaWZ5aW5nIG9ubHkgdGhlIHNlbGVjdGVkIGJpdCBmb3IgdGhpcyBmdW5jdGlvbiwgICAgICAqLworICAvKiAgICAgICB0byBub3QgaW50ZXJmZXJlIHdpdGggYml0cyB3aXRoIEhXIHByb3BlcnR5ICJycyIuICAgICAgICAgICAgICAgICAgKi8KKyAgTU9ESUZZX1JFRyhBREN4LT5DUiwgQURDX0NSX0JJVFNfUFJPUEVSVFlfUlMsIEFEQ19DUl9BREVOKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgdGhlIHNlbGVjdGVkIEFEQyBpbnN0YW5jZS4KKyAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAqICAgICAgICAgQURDIG11c3QgYmUgbm90IGRpc2FibGVkLiBNdXN0IGJlIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nCisgKiAgICAgICAgIG9uIGVpdGhlciBncm91cHMgcmVndWxhciBvciBpbmplY3RlZC4KKyAqIEBybXRvbGwgQ1IgICAgICAgQURESVMgICAgICAgICAgTExfQURDX0Rpc2FibGUKKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfRGlzYWJsZShBRENfVHlwZURlZiAqQURDeCkgeworICAvKiBOb3RlOiBXcml0ZSByZWdpc3RlciB3aXRoIHNvbWUgYWRkaXRpb25hbCBiaXRzIGZvcmNlZCB0byBzdGF0ZSByZXNldCAgICAgKi8KKyAgLyogICAgICAgaW5zdGVhZCBvZiBtb2RpZnlpbmcgb25seSB0aGUgc2VsZWN0ZWQgYml0IGZvciB0aGlzIGZ1bmN0aW9uLCAgICAgICovCisgIC8qICAgICAgIHRvIG5vdCBpbnRlcmZlcmUgd2l0aCBiaXRzIHdpdGggSFcgcHJvcGVydHkgInJzIi4gICAgICAgICAgICAgICAgICAqLworICBNT0RJRllfUkVHKEFEQ3gtPkNSLCBBRENfQ1JfQklUU19QUk9QRVJUWV9SUywgQURDX0NSX0FERElTKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCB0aGUgc2VsZWN0ZWQgQURDIGluc3RhbmNlIGVuYWJsZSBzdGF0ZS4KKyAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIGZsYWcgTExfQURDX0ZMQUdfQURSRFkgaXMgcmFpc2VkIHdoZW4gdGhlIEFEQworICogICAgICAgICBpcyBlbmFibGVkIGFuZCB3aGVuIGNvbnZlcnNpb24gY2xvY2sgaXMgYWN0aXZlLgorICogICAgICAgICAobm90IG9ubHkgY29yZSBjbG9jazogdGhpcyBBREMgaGFzIGEgZHVhbCBjbG9jayBkb21haW4pCisgKiBAcm10b2xsIENSICAgICAgIEFERU4gICAgICAgICAgIExMX0FEQ19Jc0VuYWJsZWQKKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEByZXR2YWwgMDogQURDIGlzIGRpc2FibGVkLCAxOiBBREMgaXMgZW5hYmxlZC4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0VuYWJsZWQoY29uc3QgQURDX1R5cGVEZWYgKkFEQ3gpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoQURDeC0+Q1IsIEFEQ19DUl9BREVOKSA9PSAoQURDX0NSX0FERU4pKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgdGhlIHNlbGVjdGVkIEFEQyBpbnN0YW5jZSBkaXNhYmxlIHN0YXRlLgorICogQHJtdG9sbCBDUiAgICAgICBBRERJUyAgICAgICAgICBMTF9BRENfSXNEaXNhYmxlT25nb2luZworICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICogQHJldHZhbCAwOiBubyBBREMgZGlzYWJsZSBjb21tYW5kIG9uIGdvaW5nLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzRGlzYWJsZU9uZ29pbmcoY29uc3QgQURDX1R5cGVEZWYgKkFEQ3gpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoQURDeC0+Q1IsIEFEQ19DUl9BRERJUykgPT0gKEFEQ19DUl9BRERJUykpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFN0YXJ0IEFEQyBjYWxpYnJhdGlvbiBpbiB0aGUgbW9kZSBzaW5nbGUtZW5kZWQKKyAqICAgICAgICAgb3IgZGlmZmVyZW50aWFsIChmb3IgZGV2aWNlcyB3aXRoIGRpZmZlcmVudGlhbCBtb2RlIGF2YWlsYWJsZSkuCisgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBhIG1pbmltdW0gbnVtYmVyIG9mIEFEQyBjbG9jayBjeWNsZXMKKyAqICAgICAgICAgYXJlIHJlcXVpcmVkIGJldHdlZW4gQURDIGVuZCBvZiBjYWxpYnJhdGlvbiBhbmQgQURDIGVuYWJsZS4KKyAqICAgICAgICAgUmVmZXIgdG8gbGl0ZXJhbCBAcmVmIExMX0FEQ19ERUxBWV9DQUxJQl9FTkFCTEVfQURDX0NZQ0xFUy4KKyAqIEBub3RlICAgRm9yIGRldmljZXMgd2l0aCBkaWZmZXJlbnRpYWwgbW9kZSBhdmFpbGFibGU6CisgKiAgICAgICAgIENhbGlicmF0aW9uIG9mIG9mZnNldCBpcyBzcGVjaWZpYyB0byBlYWNoIG9mCisgKiAgICAgICAgIHNpbmdsZS1lbmRlZCBhbmQgZGlmZmVyZW50aWFsIG1vZGVzCisgKiAgICAgICAgIChjYWxpYnJhdGlvbiBydW4gbXVzdCBiZSBwZXJmb3JtZWQgZm9yIGVhY2ggb2YgdGhlc2UKKyAqICAgICAgICAgZGlmZmVyZW50aWFsIG1vZGVzLCBpZiB1c2VkIGFmdGVyd2FyZHMgYW5kIGlmIHRoZSBhcHBsaWNhdGlvbgorICogICAgICAgICByZXF1aXJlcyB0aGVpciBjYWxpYnJhdGlvbikuCisgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICogICAgICAgICBBREMgc3RhdGU6CisgKiAgICAgICAgIEFEQyBtdXN0IGJlIEFEQyBkaXNhYmxlZC4KKyAqIEBybXRvbGwgQ1IgICAgICAgQURDQUwgICAgICAgICAgTExfQURDX1N0YXJ0Q2FsaWJyYXRpb25cbgorICogICAgICAgICBDUiAgICAgICBBRENBTERJRiAgICAgICBMTF9BRENfU3RhcnRDYWxpYnJhdGlvbgorICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICogQHBhcmFtICBTaW5nbGVEaWZmIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfU0lOR0xFX0VOREVECisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfRElGRkVSRU5USUFMX0VOREVECisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1N0YXJ0Q2FsaWJyYXRpb24oQURDX1R5cGVEZWYgKkFEQ3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBTaW5nbGVEaWZmKSB7CisgIC8qIE5vdGU6IFdyaXRlIHJlZ2lzdGVyIHdpdGggc29tZSBhZGRpdGlvbmFsIGJpdHMgZm9yY2VkIHRvIHN0YXRlIHJlc2V0ICAgICAqLworICAvKiAgICAgICBpbnN0ZWFkIG9mIG1vZGlmeWluZyBvbmx5IHRoZSBzZWxlY3RlZCBiaXQgZm9yIHRoaXMgZnVuY3Rpb24sICAgICAgKi8KKyAgLyogICAgICAgdG8gbm90IGludGVyZmVyZSB3aXRoIGJpdHMgd2l0aCBIVyBwcm9wZXJ0eSAicnMiLiAgICAgICAgICAgICAgICAgICovCisgIE1PRElGWV9SRUcoQURDeC0+Q1IsIEFEQ19DUl9BRENBTERJRiB8IEFEQ19DUl9CSVRTX1BST1BFUlRZX1JTLAorICAgICAgICAgICAgIEFEQ19DUl9BRENBTCB8IChTaW5nbGVEaWZmICYgQURDX1NJTkdMRURJRkZfQ0FMSUJfU1RBUlRfTUFTSykpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IEFEQyBjYWxpYnJhdGlvbiBzdGF0ZS4KKyAqIEBybXRvbGwgQ1IgICAgICAgQURDQUwgICAgICAgICAgTExfQURDX0lzQ2FsaWJyYXRpb25PbkdvaW5nCisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcmV0dmFsIDA6IGNhbGlicmF0aW9uIGNvbXBsZXRlLCAxOiBjYWxpYnJhdGlvbiBpbiBwcm9ncmVzcy4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0NhbGlicmF0aW9uT25Hb2luZyhjb25zdCBBRENfVHlwZURlZiAqQURDeCkgeworICByZXR1cm4gKChSRUFEX0JJVChBREN4LT5DUiwgQURDX0NSX0FEQ0FMKSA9PSAoQURDX0NSX0FEQ0FMKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUZfT3BlcmF0aW9uX0FEQ19Hcm91cF9SZWd1bGFyIE9wZXJhdGlvbiBvbiBBREMKKyAqIGhpZXJhcmNoaWNhbCBzY29wZTogZ3JvdXAgcmVndWxhcgorICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiAgU3RhcnQgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbi4KKyAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIHRoaXMgZnVuY3Rpb24gaXMgcmVsZXZhbnQgZm9yIGJvdGgKKyAqICAgICAgICAgaW50ZXJuYWwgdHJpZ2dlciAoU1cgc3RhcnQpIGFuZCBleHRlcm5hbCB0cmlnZ2VyOgorICogICAgICAgICAtIElmIEFEQyB0cmlnZ2VyIGhhcyBiZWVuIHNldCB0byBzb2Z0d2FyZSBzdGFydCwgQURDIGNvbnZlcnNpb24KKyAqICAgICAgICAgICBzdGFydHMgaW1tZWRpYXRlbHkuCisgKiAgICAgICAgIC0gSWYgQURDIHRyaWdnZXIgaGFzIGJlZW4gc2V0IHRvIGV4dGVybmFsIHRyaWdnZXIsIEFEQyBjb252ZXJzaW9uCisgKiAgICAgICAgICAgd2lsbCBzdGFydCBhdCBuZXh0IHRyaWdnZXIgZXZlbnQgKG9uIHRoZSBzZWxlY3RlZCB0cmlnZ2VyIGVkZ2UpCisgKiAgICAgICAgICAgZm9sbG93aW5nIHRoZSBBREMgc3RhcnQgY29udmVyc2lvbiBjb21tYW5kLgorICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllcywgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAqICAgICAgICAgQURDIHN0YXRlOgorICogICAgICAgICBBREMgbXVzdCBiZSBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZyBvbiBncm91cCByZWd1bGFyLAorICogICAgICAgICB3aXRob3V0IGNvbnZlcnNpb24gc3RvcCBjb21tYW5kIG9uIGdvaW5nIG9uIGdyb3VwIHJlZ3VsYXIsCisgKiAgICAgICAgIHdpdGhvdXQgQURDIGRpc2FibGUgY29tbWFuZCBvbiBnb2luZy4KKyAqIEBybXRvbGwgQ1IgICAgICAgQURTVEFSVCAgICAgICAgTExfQURDX1JFR19TdGFydENvbnZlcnNpb24KKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfUkVHX1N0YXJ0Q29udmVyc2lvbihBRENfVHlwZURlZiAqQURDeCkgeworICAvKiBOb3RlOiBXcml0ZSByZWdpc3RlciB3aXRoIHNvbWUgYWRkaXRpb25hbCBiaXRzIGZvcmNlZCB0byBzdGF0ZSByZXNldCAgICAgKi8KKyAgLyogICAgICAgaW5zdGVhZCBvZiBtb2RpZnlpbmcgb25seSB0aGUgc2VsZWN0ZWQgYml0IGZvciB0aGlzIGZ1bmN0aW9uLCAgICAgICovCisgIC8qICAgICAgIHRvIG5vdCBpbnRlcmZlcmUgd2l0aCBiaXRzIHdpdGggSFcgcHJvcGVydHkgInJzIi4gICAgICAgICAgICAgICAgICAqLworICBNT0RJRllfUkVHKEFEQ3gtPkNSLCBBRENfQ1JfQklUU19QUk9QRVJUWV9SUywgQURDX0NSX0FEU1RBUlQpOworfQorCisvKioKKyAqIEBicmllZiAgU3RvcCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uLgorICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllcywgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAqICAgICAgICAgQURDIHN0YXRlOgorICogICAgICAgICBBREMgbXVzdCBiZSBlbmFibGVkIHdpdGggY29udmVyc2lvbiBvbiBnb2luZyBvbiBncm91cCByZWd1bGFyLAorICogICAgICAgICB3aXRob3V0IEFEQyBkaXNhYmxlIGNvbW1hbmQgb24gZ29pbmcuCisgKiBAcm10b2xsIENSICAgICAgIEFEU1RQICAgICAgICAgIExMX0FEQ19SRUdfU3RvcENvbnZlcnNpb24KKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfUkVHX1N0b3BDb252ZXJzaW9uKEFEQ19UeXBlRGVmICpBREN4KSB7CisgIC8qIE5vdGU6IFdyaXRlIHJlZ2lzdGVyIHdpdGggc29tZSBhZGRpdGlvbmFsIGJpdHMgZm9yY2VkIHRvIHN0YXRlIHJlc2V0ICAgICAqLworICAvKiAgICAgICBpbnN0ZWFkIG9mIG1vZGlmeWluZyBvbmx5IHRoZSBzZWxlY3RlZCBiaXQgZm9yIHRoaXMgZnVuY3Rpb24sICAgICAgKi8KKyAgLyogICAgICAgdG8gbm90IGludGVyZmVyZSB3aXRoIGJpdHMgd2l0aCBIVyBwcm9wZXJ0eSAicnMiLiAgICAgICAgICAgICAgICAgICovCisgIE1PRElGWV9SRUcoQURDeC0+Q1IsIEFEQ19DUl9CSVRTX1BST1BFUlRZX1JTLCBBRENfQ1JfQURTVFApOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gc3RhdGUuCisgKiBAcm10b2xsIENSICAgICAgIEFEU1RBUlQgICAgICAgIExMX0FEQ19SRUdfSXNDb252ZXJzaW9uT25nb2luZworICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICogQHJldHZhbCAwOiBubyBjb252ZXJzaW9uIGlzIG9uIGdvaW5nIG9uIEFEQyBncm91cCByZWd1bGFyLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX0FEQ19SRUdfSXNDb252ZXJzaW9uT25nb2luZyhjb25zdCBBRENfVHlwZURlZiAqQURDeCkgeworICByZXR1cm4gKChSRUFEX0JJVChBREN4LT5DUiwgQURDX0NSX0FEU1RBUlQpID09IChBRENfQ1JfQURTVEFSVCkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBBREMgZ3JvdXAgcmVndWxhciBjb21tYW5kIG9mIGNvbnZlcnNpb24gc3RvcCBzdGF0ZQorICogQHJtdG9sbCBDUiAgICAgICBBRFNUUCAgICAgICAgICBMTF9BRENfUkVHX0lzU3RvcENvbnZlcnNpb25PbmdvaW5nCisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcmV0dmFsIDA6IG5vIGNvbW1hbmQgb2YgY29udmVyc2lvbiBzdG9wIGlzIG9uIGdvaW5nIG9uIEFEQyBncm91cCByZWd1bGFyLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX0FEQ19SRUdfSXNTdG9wQ29udmVyc2lvbk9uZ29pbmcoY29uc3QgQURDX1R5cGVEZWYgKkFEQ3gpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoQURDeC0+Q1IsIEFEQ19DUl9BRFNUUCkgPT0gKEFEQ19DUl9BRFNUUCkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFN0YXJ0IEFEQyBzYW1wbGluZyBwaGFzZSBmb3Igc2FtcGxpbmcgdGltZSB0cmlnZ2VyIG1vZGUKKyAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBpcyByZWxldmFudCBvbmx5IHdoZW4KKyAqICAgICAgICAgLSBAcmVmIExMX0FEQ19SRUdfU0FNUExJTkdfTU9ERV9UUklHR0VSX0NPTlRST0xFRCBoYXMgYmVlbiBzZXQKKyAqICAgICAgICAgICB1c2luZyBAcmVmIExMX0FEQ19SRUdfU2V0U2FtcGxpbmdNb2RlCisgKiAgICAgICAgIC0gQHJlZiBMTF9BRENfUkVHX1RSSUdfU09GVFdBUkUgaXMgdXNlZCBhcyB0cmlnZ2VyIHNvdXJjZQorICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllcywgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAqICAgICAgICAgQURDIHN0YXRlOgorICogICAgICAgICBBREMgbXVzdCBiZSBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZyBvbiBncm91cCByZWd1bGFyLAorICogICAgICAgICB3aXRob3V0IGNvbnZlcnNpb24gc3RvcCBjb21tYW5kIG9uIGdvaW5nIG9uIGdyb3VwIHJlZ3VsYXIsCisgKiAgICAgICAgIHdpdGhvdXQgQURDIGRpc2FibGUgY29tbWFuZCBvbiBnb2luZy4KKyAqIEBybXRvbGwgQ0ZHUjIgICAgU1dUUklHICAgICAgICAgTExfQURDX1JFR19TdGFydFNhbXBsaW5nUGhhc2UKKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfUkVHX1N0YXJ0U2FtcGxpbmdQaGFzZShBRENfVHlwZURlZiAqQURDeCkgeworICBTRVRfQklUKEFEQ3gtPkNGR1IyLCBBRENfQ0ZHUjJfU1dUUklHKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFN0b3AgQURDIHNhbXBsaW5nIHBoYXNlIGZvciBzYW1wbGluZyB0aW1lIHRyaWdnZXIgbW9kZSBhbmQgc3RhcnQKKyAqIGNvbnZlcnNpb24KKyAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBpcyByZWxldmFudCBvbmx5IHdoZW4KKyAqICAgICAgICAgLSBAcmVmIExMX0FEQ19SRUdfU0FNUExJTkdfTU9ERV9UUklHR0VSX0NPTlRST0xFRCBoYXMgYmVlbiBzZXQKKyAqICAgICAgICAgICB1c2luZyBAcmVmIExMX0FEQ19SRUdfU2V0U2FtcGxpbmdNb2RlCisgKiAgICAgICAgIC0gQHJlZiBMTF9BRENfUkVHX1RSSUdfU09GVFdBUkUgaXMgdXNlZCBhcyB0cmlnZ2VyIHNvdXJjZQorICogICAgICAgICAtIEByZWYgTExfQURDX1JFR19TdGFydFNhbXBsaW5nUGhhc2UgaGFzIGJlZW4gY2FsbGVkIHRvIHN0YXJ0CisgKiAgICAgICAgICAgdGhlIHNhbXBsaW5nIHBoYXNlCisgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICogICAgICAgICBBREMgc3RhdGU6CisgKiAgICAgICAgIEFEQyBtdXN0IGJlIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nIG9uIGdyb3VwIHJlZ3VsYXIsCisgKiAgICAgICAgIHdpdGhvdXQgY29udmVyc2lvbiBzdG9wIGNvbW1hbmQgb24gZ29pbmcgb24gZ3JvdXAgcmVndWxhciwKKyAqICAgICAgICAgd2l0aG91dCBBREMgZGlzYWJsZSBjb21tYW5kIG9uIGdvaW5nLgorICogQHJtdG9sbCBDRkdSMiAgICBTV1RSSUcgICAgICAgICBMTF9BRENfUkVHX1N0b3BTYW1wbGluZ1BoYXNlCisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1JFR19TdG9wU2FtcGxpbmdQaGFzZShBRENfVHlwZURlZiAqQURDeCkgeworICBDTEVBUl9CSVQoQURDeC0+Q0ZHUjIsIEFEQ19DRkdSMl9TV1RSSUcpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gZGF0YSwgcmFuZ2UgZml0IGZvcgorICogICAgICAgICBhbGwgQURDIGNvbmZpZ3VyYXRpb25zOiBhbGwgQURDIHJlc29sdXRpb25zIGFuZAorICogICAgICAgICBhbGwgb3ZlcnNhbXBsaW5nIGluY3JlYXNlZCBkYXRhIHdpZHRoIChmb3IgZGV2aWNlcworICogICAgICAgICB3aXRoIGZlYXR1cmUgb3ZlcnNhbXBsaW5nKS4KKyAqIEBybXRvbGwgRFIgICAgICAgUkRBVEEgICAgICAgICAgTExfQURDX1JFR19SZWFkQ29udmVyc2lvbkRhdGEzMgorICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwMDAwMDAgYW5kIE1heF9EYXRhPTB4RkZGRkZGRkYKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9BRENfUkVHX1JlYWRDb252ZXJzaW9uRGF0YTMyKGNvbnN0IEFEQ19UeXBlRGVmICpBREN4KSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEFEQ3gtPkRSLCBBRENfRFJfUkRBVEEpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIGRhdGEsIHJhbmdlIGZpdCBmb3IKKyAqICAgICAgICAgQURDIHJlc29sdXRpb24gMTIgYml0cy4KKyAqIEBub3RlICAgRm9yIGRldmljZXMgd2l0aCBmZWF0dXJlIG92ZXJzYW1wbGluZzogT3ZlcnNhbXBsaW5nCisgKiAgICAgICAgIGNhbiBpbmNyZWFzZSBkYXRhIHdpZHRoLCBmdW5jdGlvbiBmb3IgZXh0ZW5kZWQgcmFuZ2UKKyAqICAgICAgICAgbWF5IGJlIG5lZWRlZDogQHJlZiBMTF9BRENfUkVHX1JlYWRDb252ZXJzaW9uRGF0YTMyLgorICogQHJtdG9sbCBEUiAgICAgICBSREFUQSAgICAgICAgICBMTF9BRENfUkVHX1JlYWRDb252ZXJzaW9uRGF0YTEyCisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMDAgYW5kIE1heF9EYXRhPTB4RkZGCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MTZfdAorTExfQURDX1JFR19SZWFkQ29udmVyc2lvbkRhdGExMihjb25zdCBBRENfVHlwZURlZiAqQURDeCkgeworICByZXR1cm4gKHVpbnQxNl90KShSRUFEX0JJVChBREN4LT5EUiwgQURDX0RSX1JEQVRBKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBkYXRhLCByYW5nZSBmaXQgZm9yCisgKiAgICAgICAgIEFEQyByZXNvbHV0aW9uIDEwIGJpdHMuCisgKiBAbm90ZSAgIEZvciBkZXZpY2VzIHdpdGggZmVhdHVyZSBvdmVyc2FtcGxpbmc6IE92ZXJzYW1wbGluZworICogICAgICAgICBjYW4gaW5jcmVhc2UgZGF0YSB3aWR0aCwgZnVuY3Rpb24gZm9yIGV4dGVuZGVkIHJhbmdlCisgKiAgICAgICAgIG1heSBiZSBuZWVkZWQ6IEByZWYgTExfQURDX1JFR19SZWFkQ29udmVyc2lvbkRhdGEzMi4KKyAqIEBybXRvbGwgRFIgICAgICAgUkRBVEEgICAgICAgICAgTExfQURDX1JFR19SZWFkQ29udmVyc2lvbkRhdGExMAorICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwIGFuZCBNYXhfRGF0YT0weDNGRgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDE2X3QKK0xMX0FEQ19SRUdfUmVhZENvbnZlcnNpb25EYXRhMTAoY29uc3QgQURDX1R5cGVEZWYgKkFEQ3gpIHsKKyAgcmV0dXJuICh1aW50MTZfdCkoUkVBRF9CSVQoQURDeC0+RFIsIEFEQ19EUl9SREFUQSkpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gZGF0YSwgcmFuZ2UgZml0IGZvcgorICogICAgICAgICBBREMgcmVzb2x1dGlvbiA4IGJpdHMuCisgKiBAbm90ZSAgIEZvciBkZXZpY2VzIHdpdGggZmVhdHVyZSBvdmVyc2FtcGxpbmc6IE92ZXJzYW1wbGluZworICogICAgICAgICBjYW4gaW5jcmVhc2UgZGF0YSB3aWR0aCwgZnVuY3Rpb24gZm9yIGV4dGVuZGVkIHJhbmdlCisgKiAgICAgICAgIG1heSBiZSBuZWVkZWQ6IEByZWYgTExfQURDX1JFR19SZWFkQ29udmVyc2lvbkRhdGEzMi4KKyAqIEBybXRvbGwgRFIgICAgICAgUkRBVEEgICAgICAgICAgTExfQURDX1JFR19SZWFkQ29udmVyc2lvbkRhdGE4CisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDhfdAorTExfQURDX1JFR19SZWFkQ29udmVyc2lvbkRhdGE4KGNvbnN0IEFEQ19UeXBlRGVmICpBREN4KSB7CisgIHJldHVybiAodWludDhfdCkoUkVBRF9CSVQoQURDeC0+RFIsIEFEQ19EUl9SREFUQSkpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gZGF0YSwgcmFuZ2UgZml0IGZvcgorICogICAgICAgICBBREMgcmVzb2x1dGlvbiA2IGJpdHMuCisgKiBAbm90ZSAgIEZvciBkZXZpY2VzIHdpdGggZmVhdHVyZSBvdmVyc2FtcGxpbmc6IE92ZXJzYW1wbGluZworICogICAgICAgICBjYW4gaW5jcmVhc2UgZGF0YSB3aWR0aCwgZnVuY3Rpb24gZm9yIGV4dGVuZGVkIHJhbmdlCisgKiAgICAgICAgIG1heSBiZSBuZWVkZWQ6IEByZWYgTExfQURDX1JFR19SZWFkQ29udmVyc2lvbkRhdGEzMi4KKyAqIEBybXRvbGwgRFIgICAgICAgUkRBVEEgICAgICAgICAgTExfQURDX1JFR19SZWFkQ29udmVyc2lvbkRhdGE2CisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHgzRgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDhfdAorTExfQURDX1JFR19SZWFkQ29udmVyc2lvbkRhdGE2KGNvbnN0IEFEQ19UeXBlRGVmICpBREN4KSB7CisgIHJldHVybiAodWludDhfdCkoUkVBRF9CSVQoQURDeC0+RFIsIEFEQ19EUl9SREFUQSkpOworfQorCisjaWYgZGVmaW5lZChBRENfTVVMVElNT0RFX1NVUFBPUlQpCisvKioKKyAqIEBicmllZiAgR2V0IEFEQyBtdWx0aW1vZGUgY29udmVyc2lvbiBkYXRhIG9mIEFEQyBtYXN0ZXIsIEFEQyBzbGF2ZQorICogICAgICAgICBvciByYXcgZGF0YSB3aXRoIEFEQyBtYXN0ZXIgYW5kIHNsYXZlIGNvbmNhdGVuYXRlZC4KKyAqIEBub3RlICAgSWYgcmF3IGRhdGEgd2l0aCBBREMgbWFzdGVyIGFuZCBzbGF2ZSBjb25jYXRlbmF0ZWQgaXMgcmV0cmlldmVkLAorICogICAgICAgICBhIG1hY3JvIGlzIGF2YWlsYWJsZSB0byBnZXQgdGhlIGNvbnZlcnNpb24gZGF0YSBvZgorICogICAgICAgICBBREMgbWFzdGVyIG9yIEFEQyBzbGF2ZTogc2VlIGhlbHBlciBtYWNybworICogICAgICAgICBAcmVmIF9fTExfQURDX01VTFRJX0NPTlZfREFUQV9NQVNURVJfU0xBVkUoKS4KKyAqICAgICAgICAgKGhvd2V2ZXIgdGhpcyBtYWNybyBpcyBtYWlubHkgaW50ZW5kZWQgZm9yIG11bHRpbW9kZQorICogICAgICAgICB0cmFuc2ZlciBieSBETUEsIGJlY2F1c2UgdGhpcyBmdW5jdGlvbiBjYW4gZG8gdGhlIHNhbWUKKyAqICAgICAgICAgYnkgZ2V0dGluZyBtdWx0aW1vZGUgY29udmVyc2lvbiBkYXRhIG9mIEFEQyBtYXN0ZXIgb3IgQURDIHNsYXZlCisgKiAgICAgICAgIHNlcGFyYXRlbHkpLgorICogQHJtdG9sbCBDRFIgICAgICBSREFUQV9NU1QgICAgICBMTF9BRENfUkVHX1JlYWRNdWx0aUNvbnZlcnNpb25EYXRhMzJcbgorICogICAgICAgICBDRFIgICAgICBSREFUQV9TTFYgICAgICBMTF9BRENfUkVHX1JlYWRNdWx0aUNvbnZlcnNpb25EYXRhMzIKKyAqIEBwYXJhbSAgQURDeHlfQ09NTU9OIEFEQyBjb21tb24gaW5zdGFuY2UKKyAqICAgICAgICAgKGNhbiBiZSBzZXQgZGlyZWN0bHkgZnJvbSBDTVNJUyBkZWZpbml0aW9uIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybworICogQHJlZiBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoKSApCisgKiBAcGFyYW0gIENvbnZlcnNpb25EYXRhIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfTUFTVEVSCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTVVMVElfU0xBVkUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19NVUxUSV9NQVNURVJfU0xBVkUKKyAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMDAwMDAwIGFuZCBNYXhfRGF0YT0weEZGRkZGRkZGCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfUkVHX1JlYWRNdWx0aUNvbnZlcnNpb25EYXRhMzIoCisgICAgY29uc3QgQURDX0NvbW1vbl9UeXBlRGVmICpBREN4eV9DT01NT04sIHVpbnQzMl90IENvbnZlcnNpb25EYXRhKSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEFEQ3h5X0NPTU1PTi0+Q0RSLCBDb252ZXJzaW9uRGF0YSkgPj4KKyAgICAgICAgICAgICAgICAgICAgKFBPU0lUSU9OX1ZBTChDb252ZXJzaW9uRGF0YSkgJiAweDFGVUwpKTsKK30KKyNlbmRpZiAvKiBBRENfTVVMVElNT0RFX1NVUFBPUlQgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VGX09wZXJhdGlvbl9BRENfR3JvdXBfSW5qZWN0ZWQgT3BlcmF0aW9uIG9uIEFEQworICogaGllcmFyY2hpY2FsIHNjb3BlOiBncm91cCBpbmplY3RlZAorICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiAgU3RhcnQgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24uCisgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCB0aGlzIGZ1bmN0aW9uIGlzIHJlbGV2YW50IGZvciBib3RoCisgKiAgICAgICAgIGludGVybmFsIHRyaWdnZXIgKFNXIHN0YXJ0KSBhbmQgZXh0ZXJuYWwgdHJpZ2dlcjoKKyAqICAgICAgICAgLSBJZiBBREMgdHJpZ2dlciBoYXMgYmVlbiBzZXQgdG8gc29mdHdhcmUgc3RhcnQsIEFEQyBjb252ZXJzaW9uCisgKiAgICAgICAgICAgc3RhcnRzIGltbWVkaWF0ZWx5LgorICogICAgICAgICAtIElmIEFEQyB0cmlnZ2VyIGhhcyBiZWVuIHNldCB0byBleHRlcm5hbCB0cmlnZ2VyLCBBREMgY29udmVyc2lvbgorICogICAgICAgICAgIHdpbGwgc3RhcnQgYXQgbmV4dCB0cmlnZ2VyIGV2ZW50IChvbiB0aGUgc2VsZWN0ZWQgdHJpZ2dlciBlZGdlKQorICogICAgICAgICAgIGZvbGxvd2luZyB0aGUgQURDIHN0YXJ0IGNvbnZlcnNpb24gY29tbWFuZC4KKyAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAqICAgICAgICAgQURDIG11c3QgYmUgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcgb24gZ3JvdXAgaW5qZWN0ZWQsCisgKiAgICAgICAgIHdpdGhvdXQgY29udmVyc2lvbiBzdG9wIGNvbW1hbmQgb24gZ29pbmcgb24gZ3JvdXAgaW5qZWN0ZWQsCisgKiAgICAgICAgIHdpdGhvdXQgQURDIGRpc2FibGUgY29tbWFuZCBvbiBnb2luZy4KKyAqIEBybXRvbGwgQ1IgICAgICAgSkFEU1RBUlQgICAgICAgTExfQURDX0lOSl9TdGFydENvbnZlcnNpb24KKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfSU5KX1N0YXJ0Q29udmVyc2lvbihBRENfVHlwZURlZiAqQURDeCkgeworICAvKiBOb3RlOiBXcml0ZSByZWdpc3RlciB3aXRoIHNvbWUgYWRkaXRpb25hbCBiaXRzIGZvcmNlZCB0byBzdGF0ZSByZXNldCAgICAgKi8KKyAgLyogICAgICAgaW5zdGVhZCBvZiBtb2RpZnlpbmcgb25seSB0aGUgc2VsZWN0ZWQgYml0IGZvciB0aGlzIGZ1bmN0aW9uLCAgICAgICovCisgIC8qICAgICAgIHRvIG5vdCBpbnRlcmZlcmUgd2l0aCBiaXRzIHdpdGggSFcgcHJvcGVydHkgInJzIi4gICAgICAgICAgICAgICAgICAqLworICBNT0RJRllfUkVHKEFEQ3gtPkNSLCBBRENfQ1JfQklUU19QUk9QRVJUWV9SUywgQURDX0NSX0pBRFNUQVJUKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFN0b3AgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24uCisgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICogICAgICAgICBBREMgc3RhdGU6CisgKiAgICAgICAgIEFEQyBtdXN0IGJlIGVuYWJsZWQgd2l0aCBjb252ZXJzaW9uIG9uIGdvaW5nIG9uIGdyb3VwIGluamVjdGVkLAorICogICAgICAgICB3aXRob3V0IEFEQyBkaXNhYmxlIGNvbW1hbmQgb24gZ29pbmcuCisgKiBAcm10b2xsIENSICAgICAgIEpBRFNUUCAgICAgICAgIExMX0FEQ19JTkpfU3RvcENvbnZlcnNpb24KKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfSU5KX1N0b3BDb252ZXJzaW9uKEFEQ19UeXBlRGVmICpBREN4KSB7CisgIC8qIE5vdGU6IFdyaXRlIHJlZ2lzdGVyIHdpdGggc29tZSBhZGRpdGlvbmFsIGJpdHMgZm9yY2VkIHRvIHN0YXRlIHJlc2V0ICAgICAqLworICAvKiAgICAgICBpbnN0ZWFkIG9mIG1vZGlmeWluZyBvbmx5IHRoZSBzZWxlY3RlZCBiaXQgZm9yIHRoaXMgZnVuY3Rpb24sICAgICAgKi8KKyAgLyogICAgICAgdG8gbm90IGludGVyZmVyZSB3aXRoIGJpdHMgd2l0aCBIVyBwcm9wZXJ0eSAicnMiLiAgICAgICAgICAgICAgICAgICovCisgIE1PRElGWV9SRUcoQURDeC0+Q1IsIEFEQ19DUl9CSVRTX1BST1BFUlRZX1JTLCBBRENfQ1JfSkFEU1RQKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiBzdGF0ZS4KKyAqIEBybXRvbGwgQ1IgICAgICAgSkFEU1RBUlQgICAgICAgTExfQURDX0lOSl9Jc0NvbnZlcnNpb25PbmdvaW5nCisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcmV0dmFsIDA6IG5vIGNvbnZlcnNpb24gaXMgb24gZ29pbmcgb24gQURDIGdyb3VwIGluamVjdGVkLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX0FEQ19JTkpfSXNDb252ZXJzaW9uT25nb2luZyhjb25zdCBBRENfVHlwZURlZiAqQURDeCkgeworICByZXR1cm4gKChSRUFEX0JJVChBREN4LT5DUiwgQURDX0NSX0pBRFNUQVJUKSA9PSAoQURDX0NSX0pBRFNUQVJUKSkgPyAxVUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29tbWFuZCBvZiBjb252ZXJzaW9uIHN0b3Agc3RhdGUKKyAqIEBybXRvbGwgQ1IgICAgICAgSkFEU1RQICAgICAgICAgTExfQURDX0lOSl9Jc1N0b3BDb252ZXJzaW9uT25nb2luZworICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICogQHJldHZhbCAwOiBubyBjb21tYW5kIG9mIGNvbnZlcnNpb24gc3RvcCBpcyBvbiBnb2luZyBvbiBBREMgZ3JvdXAgaW5qZWN0ZWQuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfQURDX0lOSl9Jc1N0b3BDb252ZXJzaW9uT25nb2luZyhjb25zdCBBRENfVHlwZURlZiAqQURDeCkgeworICByZXR1cm4gKChSRUFEX0JJVChBREN4LT5DUiwgQURDX0NSX0pBRFNUUCkgPT0gKEFEQ19DUl9KQURTVFApKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gZGF0YSwgcmFuZ2UgZml0IGZvcgorICogICAgICAgICBhbGwgQURDIGNvbmZpZ3VyYXRpb25zOiBhbGwgQURDIHJlc29sdXRpb25zIGFuZAorICogICAgICAgICBhbGwgb3ZlcnNhbXBsaW5nIGluY3JlYXNlZCBkYXRhIHdpZHRoIChmb3IgZGV2aWNlcworICogICAgICAgICB3aXRoIGZlYXR1cmUgb3ZlcnNhbXBsaW5nKS4KKyAqIEBybXRvbGwgSkRSMSAgICAgSkRBVEEgICAgICAgICAgTExfQURDX0lOSl9SZWFkQ29udmVyc2lvbkRhdGEzMlxuCisgKiAgICAgICAgIEpEUjIgICAgIEpEQVRBICAgICAgICAgIExMX0FEQ19JTkpfUmVhZENvbnZlcnNpb25EYXRhMzJcbgorICogICAgICAgICBKRFIzICAgICBKREFUQSAgICAgICAgICBMTF9BRENfSU5KX1JlYWRDb252ZXJzaW9uRGF0YTMyXG4KKyAqICAgICAgICAgSkRSNCAgICAgSkRBVEEgICAgICAgICAgTExfQURDX0lOSl9SZWFkQ29udmVyc2lvbkRhdGEzMgorICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICogQHBhcmFtICBSYW5rIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1JBTktfMQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9SQU5LXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfUkFOS18zCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1JBTktfNAorICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwMDAwMDAgYW5kIE1heF9EYXRhPTB4RkZGRkZGRkYKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9BRENfSU5KX1JlYWRDb252ZXJzaW9uRGF0YTMyKGNvbnN0IEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBSYW5rKSB7CisgIGNvbnN0IF9fSU8gdWludDMyX3QgKnByZWcgPSBfX0FEQ19QVFJfUkVHX09GRlNFVCgKKyAgICAgIEFEQ3gtPkpEUjEsCisgICAgICAoKFJhbmsgJiBBRENfSU5KX0pEUlhfUkVHT0ZGU0VUX01BU0spID4+IEFEQ19KRFJYX1JFR09GRlNFVF9QT1MpKTsKKworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVCgqcHJlZywgQURDX0pEUjFfSkRBVEEpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiBkYXRhLCByYW5nZSBmaXQgZm9yCisgKiAgICAgICAgIEFEQyByZXNvbHV0aW9uIDEyIGJpdHMuCisgKiBAbm90ZSAgIEZvciBkZXZpY2VzIHdpdGggZmVhdHVyZSBvdmVyc2FtcGxpbmc6IE92ZXJzYW1wbGluZworICogICAgICAgICBjYW4gaW5jcmVhc2UgZGF0YSB3aWR0aCwgZnVuY3Rpb24gZm9yIGV4dGVuZGVkIHJhbmdlCisgKiAgICAgICAgIG1heSBiZSBuZWVkZWQ6IEByZWYgTExfQURDX0lOSl9SZWFkQ29udmVyc2lvbkRhdGEzMi4KKyAqIEBybXRvbGwgSkRSMSAgICAgSkRBVEEgICAgICAgICAgTExfQURDX0lOSl9SZWFkQ29udmVyc2lvbkRhdGExMlxuCisgKiAgICAgICAgIEpEUjIgICAgIEpEQVRBICAgICAgICAgIExMX0FEQ19JTkpfUmVhZENvbnZlcnNpb25EYXRhMTJcbgorICogICAgICAgICBKRFIzICAgICBKREFUQSAgICAgICAgICBMTF9BRENfSU5KX1JlYWRDb252ZXJzaW9uRGF0YTEyXG4KKyAqICAgICAgICAgSkRSNCAgICAgSkRBVEEgICAgICAgICAgTExfQURDX0lOSl9SZWFkQ29udmVyc2lvbkRhdGExMgorICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICogQHBhcmFtICBSYW5rIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1JBTktfMQorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9SQU5LXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfUkFOS18zCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1JBTktfNAorICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwIGFuZCBNYXhfRGF0YT0weEZGRgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDE2X3QKK0xMX0FEQ19JTkpfUmVhZENvbnZlcnNpb25EYXRhMTIoY29uc3QgQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IFJhbmspIHsKKyAgY29uc3QgX19JTyB1aW50MzJfdCAqcHJlZyA9IF9fQURDX1BUUl9SRUdfT0ZGU0VUKAorICAgICAgQURDeC0+SkRSMSwKKyAgICAgICgoUmFuayAmIEFEQ19JTkpfSkRSWF9SRUdPRkZTRVRfTUFTSykgPj4gQURDX0pEUlhfUkVHT0ZGU0VUX1BPUykpOworCisgIHJldHVybiAodWludDE2X3QpKFJFQURfQklUKCpwcmVnLCBBRENfSkRSMV9KREFUQSkpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIGRhdGEsIHJhbmdlIGZpdCBmb3IKKyAqICAgICAgICAgQURDIHJlc29sdXRpb24gMTAgYml0cy4KKyAqIEBub3RlICAgRm9yIGRldmljZXMgd2l0aCBmZWF0dXJlIG92ZXJzYW1wbGluZzogT3ZlcnNhbXBsaW5nCisgKiAgICAgICAgIGNhbiBpbmNyZWFzZSBkYXRhIHdpZHRoLCBmdW5jdGlvbiBmb3IgZXh0ZW5kZWQgcmFuZ2UKKyAqICAgICAgICAgbWF5IGJlIG5lZWRlZDogQHJlZiBMTF9BRENfSU5KX1JlYWRDb252ZXJzaW9uRGF0YTMyLgorICogQHJtdG9sbCBKRFIxICAgICBKREFUQSAgICAgICAgICBMTF9BRENfSU5KX1JlYWRDb252ZXJzaW9uRGF0YTEwXG4KKyAqICAgICAgICAgSkRSMiAgICAgSkRBVEEgICAgICAgICAgTExfQURDX0lOSl9SZWFkQ29udmVyc2lvbkRhdGExMFxuCisgKiAgICAgICAgIEpEUjMgICAgIEpEQVRBICAgICAgICAgIExMX0FEQ19JTkpfUmVhZENvbnZlcnNpb25EYXRhMTBcbgorICogICAgICAgICBKRFI0ICAgICBKREFUQSAgICAgICAgICBMTF9BRENfSU5KX1JlYWRDb252ZXJzaW9uRGF0YTEwCisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcGFyYW0gIFJhbmsgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfUkFOS18xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1JBTktfMgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9SQU5LXzMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfUkFOS180CisgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMDAgYW5kIE1heF9EYXRhPTB4M0ZGCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MTZfdAorTExfQURDX0lOSl9SZWFkQ29udmVyc2lvbkRhdGExMChjb25zdCBBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgUmFuaykgeworICBjb25zdCBfX0lPIHVpbnQzMl90ICpwcmVnID0gX19BRENfUFRSX1JFR19PRkZTRVQoCisgICAgICBBREN4LT5KRFIxLAorICAgICAgKChSYW5rICYgQURDX0lOSl9KRFJYX1JFR09GRlNFVF9NQVNLKSA+PiBBRENfSkRSWF9SRUdPRkZTRVRfUE9TKSk7CisKKyAgcmV0dXJuICh1aW50MTZfdCkoUkVBRF9CSVQoKnByZWcsIEFEQ19KRFIxX0pEQVRBKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gZGF0YSwgcmFuZ2UgZml0IGZvcgorICogICAgICAgICBBREMgcmVzb2x1dGlvbiA4IGJpdHMuCisgKiBAbm90ZSAgIEZvciBkZXZpY2VzIHdpdGggZmVhdHVyZSBvdmVyc2FtcGxpbmc6IE92ZXJzYW1wbGluZworICogICAgICAgICBjYW4gaW5jcmVhc2UgZGF0YSB3aWR0aCwgZnVuY3Rpb24gZm9yIGV4dGVuZGVkIHJhbmdlCisgKiAgICAgICAgIG1heSBiZSBuZWVkZWQ6IEByZWYgTExfQURDX0lOSl9SZWFkQ29udmVyc2lvbkRhdGEzMi4KKyAqIEBybXRvbGwgSkRSMSAgICAgSkRBVEEgICAgICAgICAgTExfQURDX0lOSl9SZWFkQ29udmVyc2lvbkRhdGE4XG4KKyAqICAgICAgICAgSkRSMiAgICAgSkRBVEEgICAgICAgICAgTExfQURDX0lOSl9SZWFkQ29udmVyc2lvbkRhdGE4XG4KKyAqICAgICAgICAgSkRSMyAgICAgSkRBVEEgICAgICAgICAgTExfQURDX0lOSl9SZWFkQ29udmVyc2lvbkRhdGE4XG4KKyAqICAgICAgICAgSkRSNCAgICAgSkRBVEEgICAgICAgICAgTExfQURDX0lOSl9SZWFkQ29udmVyc2lvbkRhdGE4CisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcGFyYW0gIFJhbmsgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfUkFOS18xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1JBTktfMgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9SQU5LXzMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfUkFOS180CisgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDhfdCBMTF9BRENfSU5KX1JlYWRDb252ZXJzaW9uRGF0YTgoY29uc3QgQURDX1R5cGVEZWYgKkFEQ3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUmFuaykgeworICBjb25zdCBfX0lPIHVpbnQzMl90ICpwcmVnID0gX19BRENfUFRSX1JFR19PRkZTRVQoCisgICAgICBBREN4LT5KRFIxLAorICAgICAgKChSYW5rICYgQURDX0lOSl9KRFJYX1JFR09GRlNFVF9NQVNLKSA+PiBBRENfSkRSWF9SRUdPRkZTRVRfUE9TKSk7CisKKyAgcmV0dXJuICh1aW50OF90KShSRUFEX0JJVCgqcHJlZywgQURDX0pEUjFfSkRBVEEpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiBkYXRhLCByYW5nZSBmaXQgZm9yCisgKiAgICAgICAgIEFEQyByZXNvbHV0aW9uIDYgYml0cy4KKyAqIEBub3RlICAgRm9yIGRldmljZXMgd2l0aCBmZWF0dXJlIG92ZXJzYW1wbGluZzogT3ZlcnNhbXBsaW5nCisgKiAgICAgICAgIGNhbiBpbmNyZWFzZSBkYXRhIHdpZHRoLCBmdW5jdGlvbiBmb3IgZXh0ZW5kZWQgcmFuZ2UKKyAqICAgICAgICAgbWF5IGJlIG5lZWRlZDogQHJlZiBMTF9BRENfSU5KX1JlYWRDb252ZXJzaW9uRGF0YTMyLgorICogQHJtdG9sbCBKRFIxICAgICBKREFUQSAgICAgICAgICBMTF9BRENfSU5KX1JlYWRDb252ZXJzaW9uRGF0YTZcbgorICogICAgICAgICBKRFIyICAgICBKREFUQSAgICAgICAgICBMTF9BRENfSU5KX1JlYWRDb252ZXJzaW9uRGF0YTZcbgorICogICAgICAgICBKRFIzICAgICBKREFUQSAgICAgICAgICBMTF9BRENfSU5KX1JlYWRDb252ZXJzaW9uRGF0YTZcbgorICogICAgICAgICBKRFI0ICAgICBKREFUQSAgICAgICAgICBMTF9BRENfSU5KX1JlYWRDb252ZXJzaW9uRGF0YTYKKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEBwYXJhbSAgUmFuayBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9SQU5LXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfUkFOS18yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1JBTktfMworICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9SQU5LXzQKKyAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDNGCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50OF90IExMX0FEQ19JTkpfUmVhZENvbnZlcnNpb25EYXRhNihjb25zdCBBRENfVHlwZURlZiAqQURDeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBSYW5rKSB7CisgIGNvbnN0IF9fSU8gdWludDMyX3QgKnByZWcgPSBfX0FEQ19QVFJfUkVHX09GRlNFVCgKKyAgICAgIEFEQ3gtPkpEUjEsCisgICAgICAoKFJhbmsgJiBBRENfSU5KX0pEUlhfUkVHT0ZGU0VUX01BU0spID4+IEFEQ19KRFJYX1JFR09GRlNFVF9QT1MpKTsKKworICByZXR1cm4gKHVpbnQ4X3QpKFJFQURfQklUKCpwcmVnLCBBRENfSkRSMV9KREFUQSkpOworfQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUZfRkxBR19NYW5hZ2VtZW50IEFEQyBmbGFnIG1hbmFnZW1lbnQKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgIEdldCBmbGFnIEFEQyByZWFkeS4KKyAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIGZsYWcgTExfQURDX0ZMQUdfQURSRFkgaXMgcmFpc2VkIHdoZW4gdGhlIEFEQworICogICAgICAgICBpcyBlbmFibGVkIGFuZCB3aGVuIGNvbnZlcnNpb24gY2xvY2sgaXMgYWN0aXZlLgorICogICAgICAgICAobm90IG9ubHkgY29yZSBjbG9jazogdGhpcyBBREMgaGFzIGEgZHVhbCBjbG9jayBkb21haW4pCisgKiBAcm10b2xsIElTUiAgICAgIEFEUkRZICAgICAgICAgIExMX0FEQ19Jc0FjdGl2ZUZsYWdfQURSRFkKKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzQWN0aXZlRmxhZ19BRFJEWShjb25zdCBBRENfVHlwZURlZiAqQURDeCkgeworICByZXR1cm4gKChSRUFEX0JJVChBREN4LT5JU1IsIExMX0FEQ19GTEFHX0FEUkRZKSA9PSAoTExfQURDX0ZMQUdfQURSRFkpKQorICAgICAgICAgICAgICA/IDFVTAorICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgZmxhZyBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2YgdW5pdGFyeSBjb252ZXJzaW9uLgorICogQHJtdG9sbCBJU1IgICAgICBFT0MgICAgICAgICAgICBMTF9BRENfSXNBY3RpdmVGbGFnX0VPQworICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSXNBY3RpdmVGbGFnX0VPQyhjb25zdCBBRENfVHlwZURlZiAqQURDeCkgeworICByZXR1cm4gKChSRUFEX0JJVChBREN4LT5JU1IsIEFEQ19JU1JfRU9DKSA9PSAoQURDX0lTUl9FT0MpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgZmxhZyBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2Ygc2VxdWVuY2UgY29udmVyc2lvbnMuCisgKiBAcm10b2xsIElTUiAgICAgIEVPUyAgICAgICAgICAgIExMX0FEQ19Jc0FjdGl2ZUZsYWdfRU9TCisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0FjdGl2ZUZsYWdfRU9TKGNvbnN0IEFEQ19UeXBlRGVmICpBREN4KSB7CisgIHJldHVybiAoKFJFQURfQklUKEFEQ3gtPklTUiwgTExfQURDX0ZMQUdfRU9TKSA9PSAoTExfQURDX0ZMQUdfRU9TKSkgPyAxVUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgZmxhZyBBREMgZ3JvdXAgcmVndWxhciBvdmVycnVuLgorICogQHJtdG9sbCBJU1IgICAgICBPVlIgICAgICAgICAgICBMTF9BRENfSXNBY3RpdmVGbGFnX09WUgorICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSXNBY3RpdmVGbGFnX09WUihjb25zdCBBRENfVHlwZURlZiAqQURDeCkgeworICByZXR1cm4gKChSRUFEX0JJVChBREN4LT5JU1IsIExMX0FEQ19GTEFHX09WUikgPT0gKExMX0FEQ19GTEFHX09WUikpID8gMVVMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IGZsYWcgQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHNhbXBsaW5nIHBoYXNlLgorICogQHJtdG9sbCBJU1IgICAgICBFT1NNUCAgICAgICAgICBMTF9BRENfSXNBY3RpdmVGbGFnX0VPU01QCisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0FjdGl2ZUZsYWdfRU9TTVAoY29uc3QgQURDX1R5cGVEZWYgKkFEQ3gpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoQURDeC0+SVNSLCBMTF9BRENfRkxBR19FT1NNUCkgPT0gKExMX0FEQ19GTEFHX0VPU01QKSkKKyAgICAgICAgICAgICAgPyAxVUwKKyAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IGZsYWcgQURDIGdyb3VwIGluamVjdGVkIGVuZCBvZiB1bml0YXJ5IGNvbnZlcnNpb24uCisgKiBAcm10b2xsIElTUiAgICAgIEpFT0MgICAgICAgICAgIExMX0FEQ19Jc0FjdGl2ZUZsYWdfSkVPQworICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSXNBY3RpdmVGbGFnX0pFT0MoY29uc3QgQURDX1R5cGVEZWYgKkFEQ3gpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoQURDeC0+SVNSLCBMTF9BRENfRkxBR19KRU9DKSA9PSAoTExfQURDX0ZMQUdfSkVPQykpID8gMVVMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgZmxhZyBBREMgZ3JvdXAgaW5qZWN0ZWQgZW5kIG9mIHNlcXVlbmNlIGNvbnZlcnNpb25zLgorICogQHJtdG9sbCBJU1IgICAgICBKRU9TICAgICAgICAgICBMTF9BRENfSXNBY3RpdmVGbGFnX0pFT1MKKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzQWN0aXZlRmxhZ19KRU9TKGNvbnN0IEFEQ19UeXBlRGVmICpBREN4KSB7CisgIHJldHVybiAoKFJFQURfQklUKEFEQ3gtPklTUiwgTExfQURDX0ZMQUdfSkVPUykgPT0gKExMX0FEQ19GTEFHX0pFT1MpKSA/IDFVTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IGZsYWcgQURDIGdyb3VwIGluamVjdGVkIGNvbnRleHRzIHF1ZXVlIG92ZXJmbG93LgorICogQHJtdG9sbCBJU1IgICAgICBKUU9WRiAgICAgICAgICBMTF9BRENfSXNBY3RpdmVGbGFnX0pRT1ZGCisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0FjdGl2ZUZsYWdfSlFPVkYoY29uc3QgQURDX1R5cGVEZWYgKkFEQ3gpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoQURDeC0+SVNSLCBMTF9BRENfRkxBR19KUU9WRikgPT0gKExMX0FEQ19GTEFHX0pRT1ZGKSkKKyAgICAgICAgICAgICAgPyAxVUwKKyAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IGZsYWcgQURDIGFuYWxvZyB3YXRjaGRvZyAxIGZsYWcKKyAqIEBybXRvbGwgSVNSICAgICAgQVdEMSAgICAgICAgICAgTExfQURDX0lzQWN0aXZlRmxhZ19BV0QxCisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0FjdGl2ZUZsYWdfQVdEMShjb25zdCBBRENfVHlwZURlZiAqQURDeCkgeworICByZXR1cm4gKChSRUFEX0JJVChBREN4LT5JU1IsIExMX0FEQ19GTEFHX0FXRDEpID09IChMTF9BRENfRkxBR19BV0QxKSkgPyAxVUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBmbGFnIEFEQyBhbmFsb2cgd2F0Y2hkb2cgMi4KKyAqIEBybXRvbGwgSVNSICAgICAgQVdEMiAgICAgICAgICAgTExfQURDX0lzQWN0aXZlRmxhZ19BV0QyCisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0FjdGl2ZUZsYWdfQVdEMihjb25zdCBBRENfVHlwZURlZiAqQURDeCkgeworICByZXR1cm4gKChSRUFEX0JJVChBREN4LT5JU1IsIExMX0FEQ19GTEFHX0FXRDIpID09IChMTF9BRENfRkxBR19BV0QyKSkgPyAxVUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBmbGFnIEFEQyBhbmFsb2cgd2F0Y2hkb2cgMy4KKyAqIEBybXRvbGwgSVNSICAgICAgQVdEMyAgICAgICAgICAgTExfQURDX0lzQWN0aXZlRmxhZ19BV0QzCisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0FjdGl2ZUZsYWdfQVdEMyhjb25zdCBBRENfVHlwZURlZiAqQURDeCkgeworICByZXR1cm4gKChSRUFEX0JJVChBREN4LT5JU1IsIExMX0FEQ19GTEFHX0FXRDMpID09IChMTF9BRENfRkxBR19BV0QzKSkgPyAxVUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENsZWFyIGZsYWcgQURDIHJlYWR5LgorICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllcywgZmxhZyBMTF9BRENfRkxBR19BRFJEWSBpcyByYWlzZWQgd2hlbiB0aGUgQURDCisgKiAgICAgICAgIGlzIGVuYWJsZWQgYW5kIHdoZW4gY29udmVyc2lvbiBjbG9jayBpcyBhY3RpdmUuCisgKiAgICAgICAgIChub3Qgb25seSBjb3JlIGNsb2NrOiB0aGlzIEFEQyBoYXMgYSBkdWFsIGNsb2NrIGRvbWFpbikKKyAqIEBybXRvbGwgSVNSICAgICAgQURSRFkgICAgICAgICAgTExfQURDX0NsZWFyRmxhZ19BRFJEWQorICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19DbGVhckZsYWdfQURSRFkoQURDX1R5cGVEZWYgKkFEQ3gpIHsKKyAgV1JJVEVfUkVHKEFEQ3gtPklTUiwgTExfQURDX0ZMQUdfQURSRFkpOworfQorCisvKioKKyAqIEBicmllZiAgQ2xlYXIgZmxhZyBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2YgdW5pdGFyeSBjb252ZXJzaW9uLgorICogQHJtdG9sbCBJU1IgICAgICBFT0MgICAgICAgICAgICBMTF9BRENfQ2xlYXJGbGFnX0VPQworICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19DbGVhckZsYWdfRU9DKEFEQ19UeXBlRGVmICpBREN4KSB7CisgIFdSSVRFX1JFRyhBREN4LT5JU1IsIExMX0FEQ19GTEFHX0VPQyk7Cit9CisKKy8qKgorICogQGJyaWVmICBDbGVhciBmbGFnIEFEQyBncm91cCByZWd1bGFyIGVuZCBvZiBzZXF1ZW5jZSBjb252ZXJzaW9ucy4KKyAqIEBybXRvbGwgSVNSICAgICAgRU9TICAgICAgICAgICAgTExfQURDX0NsZWFyRmxhZ19FT1MKKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfQ2xlYXJGbGFnX0VPUyhBRENfVHlwZURlZiAqQURDeCkgeworICBXUklURV9SRUcoQURDeC0+SVNSLCBMTF9BRENfRkxBR19FT1MpOworfQorCisvKioKKyAqIEBicmllZiAgQ2xlYXIgZmxhZyBBREMgZ3JvdXAgcmVndWxhciBvdmVycnVuLgorICogQHJtdG9sbCBJU1IgICAgICBPVlIgICAgICAgICAgICBMTF9BRENfQ2xlYXJGbGFnX09WUgorICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19DbGVhckZsYWdfT1ZSKEFEQ19UeXBlRGVmICpBREN4KSB7CisgIFdSSVRFX1JFRyhBREN4LT5JU1IsIExMX0FEQ19GTEFHX09WUik7Cit9CisKKy8qKgorICogQGJyaWVmICBDbGVhciBmbGFnIEFEQyBncm91cCByZWd1bGFyIGVuZCBvZiBzYW1wbGluZyBwaGFzZS4KKyAqIEBybXRvbGwgSVNSICAgICAgRU9TTVAgICAgICAgICAgTExfQURDX0NsZWFyRmxhZ19FT1NNUAorICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19DbGVhckZsYWdfRU9TTVAoQURDX1R5cGVEZWYgKkFEQ3gpIHsKKyAgV1JJVEVfUkVHKEFEQ3gtPklTUiwgTExfQURDX0ZMQUdfRU9TTVApOworfQorCisvKioKKyAqIEBicmllZiAgQ2xlYXIgZmxhZyBBREMgZ3JvdXAgaW5qZWN0ZWQgZW5kIG9mIHVuaXRhcnkgY29udmVyc2lvbi4KKyAqIEBybXRvbGwgSVNSICAgICAgSkVPQyAgICAgICAgICAgTExfQURDX0NsZWFyRmxhZ19KRU9DCisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0NsZWFyRmxhZ19KRU9DKEFEQ19UeXBlRGVmICpBREN4KSB7CisgIFdSSVRFX1JFRyhBREN4LT5JU1IsIExMX0FEQ19GTEFHX0pFT0MpOworfQorCisvKioKKyAqIEBicmllZiAgQ2xlYXIgZmxhZyBBREMgZ3JvdXAgaW5qZWN0ZWQgZW5kIG9mIHNlcXVlbmNlIGNvbnZlcnNpb25zLgorICogQHJtdG9sbCBJU1IgICAgICBKRU9TICAgICAgICAgICBMTF9BRENfQ2xlYXJGbGFnX0pFT1MKKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfQ2xlYXJGbGFnX0pFT1MoQURDX1R5cGVEZWYgKkFEQ3gpIHsKKyAgV1JJVEVfUkVHKEFEQ3gtPklTUiwgTExfQURDX0ZMQUdfSkVPUyk7Cit9CisKKy8qKgorICogQGJyaWVmICBDbGVhciBmbGFnIEFEQyBncm91cCBpbmplY3RlZCBjb250ZXh0cyBxdWV1ZSBvdmVyZmxvdy4KKyAqIEBybXRvbGwgSVNSICAgICAgSlFPVkYgICAgICAgICAgTExfQURDX0NsZWFyRmxhZ19KUU9WRgorICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19DbGVhckZsYWdfSlFPVkYoQURDX1R5cGVEZWYgKkFEQ3gpIHsKKyAgV1JJVEVfUkVHKEFEQ3gtPklTUiwgTExfQURDX0ZMQUdfSlFPVkYpOworfQorCisvKioKKyAqIEBicmllZiAgQ2xlYXIgZmxhZyBBREMgYW5hbG9nIHdhdGNoZG9nIDEuCisgKiBAcm10b2xsIElTUiAgICAgIEFXRDEgICAgICAgICAgIExMX0FEQ19DbGVhckZsYWdfQVdEMQorICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19DbGVhckZsYWdfQVdEMShBRENfVHlwZURlZiAqQURDeCkgeworICBXUklURV9SRUcoQURDeC0+SVNSLCBMTF9BRENfRkxBR19BV0QxKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENsZWFyIGZsYWcgQURDIGFuYWxvZyB3YXRjaGRvZyAyLgorICogQHJtdG9sbCBJU1IgICAgICBBV0QyICAgICAgICAgICBMTF9BRENfQ2xlYXJGbGFnX0FXRDIKKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfQ2xlYXJGbGFnX0FXRDIoQURDX1R5cGVEZWYgKkFEQ3gpIHsKKyAgV1JJVEVfUkVHKEFEQ3gtPklTUiwgTExfQURDX0ZMQUdfQVdEMik7Cit9CisKKy8qKgorICogQGJyaWVmICBDbGVhciBmbGFnIEFEQyBhbmFsb2cgd2F0Y2hkb2cgMy4KKyAqIEBybXRvbGwgSVNSICAgICAgQVdEMyAgICAgICAgICAgTExfQURDX0NsZWFyRmxhZ19BV0QzCisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0NsZWFyRmxhZ19BV0QzKEFEQ19UeXBlRGVmICpBREN4KSB7CisgIFdSSVRFX1JFRyhBREN4LT5JU1IsIExMX0FEQ19GTEFHX0FXRDMpOworfQorCisjaWYgZGVmaW5lZChBRENfTVVMVElNT0RFX1NVUFBPUlQpCisvKioKKyAqIEBicmllZiAgR2V0IGZsYWcgbXVsdGltb2RlIEFEQyByZWFkeSBvZiB0aGUgQURDIG1hc3Rlci4KKyAqIEBybXRvbGwgQ1NSICAgICAgQURSRFlfTVNUICAgICAgTExfQURDX0lzQWN0aXZlRmxhZ19NU1RfQURSRFkKKyAqIEBwYXJhbSAgQURDeHlfQ09NTU9OIEFEQyBjb21tb24gaW5zdGFuY2UKKyAqICAgICAgICAgKGNhbiBiZSBzZXQgZGlyZWN0bHkgZnJvbSBDTVNJUyBkZWZpbml0aW9uIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybworICogQHJlZiBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoKSApCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9BRENfSXNBY3RpdmVGbGFnX01TVF9BRFJEWShjb25zdCBBRENfQ29tbW9uX1R5cGVEZWYgKkFEQ3h5X0NPTU1PTikgeworICByZXR1cm4gKChSRUFEX0JJVChBREN4eV9DT01NT04tPkNTUiwgTExfQURDX0ZMQUdfQURSRFlfTVNUKSA9PQorICAgICAgICAgICAoTExfQURDX0ZMQUdfQURSRFlfTVNUKSkKKyAgICAgICAgICAgICAgPyAxVUwKKyAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IGZsYWcgbXVsdGltb2RlIEFEQyByZWFkeSBvZiB0aGUgQURDIHNsYXZlLgorICogQHJtdG9sbCBDU1IgICAgICBBRFJEWV9TTFYgICAgICBMTF9BRENfSXNBY3RpdmVGbGFnX1NMVl9BRFJEWQorICogQHBhcmFtICBBREN4eV9DT01NT04gQURDIGNvbW1vbiBpbnN0YW5jZQorICogICAgICAgICAoY2FuIGJlIHNldCBkaXJlY3RseSBmcm9tIENNU0lTIGRlZmluaXRpb24gb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvCisgKiBAcmVmIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRSgpICkKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX0FEQ19Jc0FjdGl2ZUZsYWdfU0xWX0FEUkRZKGNvbnN0IEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OKSB7CisgIHJldHVybiAoKFJFQURfQklUKEFEQ3h5X0NPTU1PTi0+Q1NSLCBMTF9BRENfRkxBR19BRFJEWV9TTFYpID09CisgICAgICAgICAgIChMTF9BRENfRkxBR19BRFJEWV9TTFYpKQorICAgICAgICAgICAgICA/IDFVTAorICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgZmxhZyBtdWx0aW1vZGUgQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHVuaXRhcnkgY29udmVyc2lvbiBvZiB0aGUKKyAqIEFEQyBtYXN0ZXIuCisgKiBAcm10b2xsIENTUiAgICAgIEVPQ19NU1QgICAgICAgIExMX0FEQ19Jc0FjdGl2ZUZsYWdfTVNUX0VPQworICogQHBhcmFtICBBREN4eV9DT01NT04gQURDIGNvbW1vbiBpbnN0YW5jZQorICogICAgICAgICAoY2FuIGJlIHNldCBkaXJlY3RseSBmcm9tIENNU0lTIGRlZmluaXRpb24gb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvCisgKiBAcmVmIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRSgpICkKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX0FEQ19Jc0FjdGl2ZUZsYWdfTVNUX0VPQyhjb25zdCBBRENfQ29tbW9uX1R5cGVEZWYgKkFEQ3h5X0NPTU1PTikgeworICByZXR1cm4gKChSRUFEX0JJVChBREN4eV9DT01NT04tPkNTUiwgTExfQURDX0ZMQUdfRU9DX1NMVikgPT0KKyAgICAgICAgICAgKExMX0FEQ19GTEFHX0VPQ19TTFYpKQorICAgICAgICAgICAgICA/IDFVTAorICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgZmxhZyBtdWx0aW1vZGUgQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHVuaXRhcnkgY29udmVyc2lvbiBvZiB0aGUKKyAqIEFEQyBzbGF2ZS4KKyAqIEBybXRvbGwgQ1NSICAgICAgRU9DX1NMViAgICAgICAgTExfQURDX0lzQWN0aXZlRmxhZ19TTFZfRU9DCisgKiBAcGFyYW0gIEFEQ3h5X0NPTU1PTiBBREMgY29tbW9uIGluc3RhbmNlCisgKiAgICAgICAgIChjYW4gYmUgc2V0IGRpcmVjdGx5IGZyb20gQ01TSVMgZGVmaW5pdGlvbiBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8KKyAqIEByZWYgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKCkgKQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfQURDX0lzQWN0aXZlRmxhZ19TTFZfRU9DKGNvbnN0IEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OKSB7CisgIHJldHVybiAoKFJFQURfQklUKEFEQ3h5X0NPTU1PTi0+Q1NSLCBMTF9BRENfRkxBR19FT0NfU0xWKSA9PQorICAgICAgICAgICAoTExfQURDX0ZMQUdfRU9DX1NMVikpCisgICAgICAgICAgICAgID8gMVVMCisgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBmbGFnIG11bHRpbW9kZSBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2Ygc2VxdWVuY2UgY29udmVyc2lvbnMgb2YKKyAqIHRoZSBBREMgbWFzdGVyLgorICogQHJtdG9sbCBDU1IgICAgICBFT1NfTVNUICAgICAgICBMTF9BRENfSXNBY3RpdmVGbGFnX01TVF9FT1MKKyAqIEBwYXJhbSAgQURDeHlfQ09NTU9OIEFEQyBjb21tb24gaW5zdGFuY2UKKyAqICAgICAgICAgKGNhbiBiZSBzZXQgZGlyZWN0bHkgZnJvbSBDTVNJUyBkZWZpbml0aW9uIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybworICogQHJlZiBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoKSApCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9BRENfSXNBY3RpdmVGbGFnX01TVF9FT1MoY29uc3QgQURDX0NvbW1vbl9UeXBlRGVmICpBREN4eV9DT01NT04pIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoQURDeHlfQ09NTU9OLT5DU1IsIExMX0FEQ19GTEFHX0VPU19NU1QpID09CisgICAgICAgICAgIChMTF9BRENfRkxBR19FT1NfTVNUKSkKKyAgICAgICAgICAgICAgPyAxVUwKKyAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IGZsYWcgbXVsdGltb2RlIEFEQyBncm91cCByZWd1bGFyIGVuZCBvZiBzZXF1ZW5jZSBjb252ZXJzaW9ucyBvZgorICogdGhlIEFEQyBzbGF2ZS4KKyAqIEBybXRvbGwgQ1NSICAgICAgRU9TX1NMViAgICAgICAgTExfQURDX0lzQWN0aXZlRmxhZ19TTFZfRU9TCisgKiBAcGFyYW0gIEFEQ3h5X0NPTU1PTiBBREMgY29tbW9uIGluc3RhbmNlCisgKiAgICAgICAgIChjYW4gYmUgc2V0IGRpcmVjdGx5IGZyb20gQ01TSVMgZGVmaW5pdGlvbiBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8KKyAqIEByZWYgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKCkgKQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfQURDX0lzQWN0aXZlRmxhZ19TTFZfRU9TKGNvbnN0IEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OKSB7CisgIHJldHVybiAoKFJFQURfQklUKEFEQ3h5X0NPTU1PTi0+Q1NSLCBMTF9BRENfRkxBR19FT1NfU0xWKSA9PQorICAgICAgICAgICAoTExfQURDX0ZMQUdfRU9TX1NMVikpCisgICAgICAgICAgICAgID8gMVVMCisgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBmbGFnIG11bHRpbW9kZSBBREMgZ3JvdXAgcmVndWxhciBvdmVycnVuIG9mIHRoZSBBREMgbWFzdGVyLgorICogQHJtdG9sbCBDU1IgICAgICBPVlJfTVNUICAgICAgICBMTF9BRENfSXNBY3RpdmVGbGFnX01TVF9PVlIKKyAqIEBwYXJhbSAgQURDeHlfQ09NTU9OIEFEQyBjb21tb24gaW5zdGFuY2UKKyAqICAgICAgICAgKGNhbiBiZSBzZXQgZGlyZWN0bHkgZnJvbSBDTVNJUyBkZWZpbml0aW9uIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybworICogQHJlZiBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoKSApCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9BRENfSXNBY3RpdmVGbGFnX01TVF9PVlIoY29uc3QgQURDX0NvbW1vbl9UeXBlRGVmICpBREN4eV9DT01NT04pIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoQURDeHlfQ09NTU9OLT5DU1IsIExMX0FEQ19GTEFHX09WUl9NU1QpID09CisgICAgICAgICAgIChMTF9BRENfRkxBR19PVlJfTVNUKSkKKyAgICAgICAgICAgICAgPyAxVUwKKyAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IGZsYWcgbXVsdGltb2RlIEFEQyBncm91cCByZWd1bGFyIG92ZXJydW4gb2YgdGhlIEFEQyBzbGF2ZS4KKyAqIEBybXRvbGwgQ1NSICAgICAgT1ZSX1NMViAgICAgICAgTExfQURDX0lzQWN0aXZlRmxhZ19TTFZfT1ZSCisgKiBAcGFyYW0gIEFEQ3h5X0NPTU1PTiBBREMgY29tbW9uIGluc3RhbmNlCisgKiAgICAgICAgIChjYW4gYmUgc2V0IGRpcmVjdGx5IGZyb20gQ01TSVMgZGVmaW5pdGlvbiBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8KKyAqIEByZWYgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKCkgKQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfQURDX0lzQWN0aXZlRmxhZ19TTFZfT1ZSKGNvbnN0IEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OKSB7CisgIHJldHVybiAoKFJFQURfQklUKEFEQ3h5X0NPTU1PTi0+Q1NSLCBMTF9BRENfRkxBR19PVlJfU0xWKSA9PQorICAgICAgICAgICAoTExfQURDX0ZMQUdfT1ZSX1NMVikpCisgICAgICAgICAgICAgID8gMVVMCisgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBmbGFnIG11bHRpbW9kZSBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2Ygc2FtcGxpbmcgb2YgdGhlIEFEQworICogbWFzdGVyLgorICogQHJtdG9sbCBDU1IgICAgICBFT1NNUF9NU1QgICAgICBMTF9BRENfSXNBY3RpdmVGbGFnX01TVF9FT1NNUAorICogQHBhcmFtICBBREN4eV9DT01NT04gQURDIGNvbW1vbiBpbnN0YW5jZQorICogICAgICAgICAoY2FuIGJlIHNldCBkaXJlY3RseSBmcm9tIENNU0lTIGRlZmluaXRpb24gb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvCisgKiBAcmVmIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRSgpICkKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX0FEQ19Jc0FjdGl2ZUZsYWdfTVNUX0VPU01QKGNvbnN0IEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OKSB7CisgIHJldHVybiAoKFJFQURfQklUKEFEQ3h5X0NPTU1PTi0+Q1NSLCBMTF9BRENfRkxBR19FT1NNUF9NU1QpID09CisgICAgICAgICAgIChMTF9BRENfRkxBR19FT1NNUF9NU1QpKQorICAgICAgICAgICAgICA/IDFVTAorICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgZmxhZyBtdWx0aW1vZGUgQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHNhbXBsaW5nIG9mIHRoZSBBREMKKyAqIHNsYXZlLgorICogQHJtdG9sbCBDU1IgICAgICBFT1NNUF9TTFYgICAgICBMTF9BRENfSXNBY3RpdmVGbGFnX1NMVl9FT1NNUAorICogQHBhcmFtICBBREN4eV9DT01NT04gQURDIGNvbW1vbiBpbnN0YW5jZQorICogICAgICAgICAoY2FuIGJlIHNldCBkaXJlY3RseSBmcm9tIENNU0lTIGRlZmluaXRpb24gb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvCisgKiBAcmVmIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRSgpICkKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX0FEQ19Jc0FjdGl2ZUZsYWdfU0xWX0VPU01QKGNvbnN0IEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OKSB7CisgIHJldHVybiAoKFJFQURfQklUKEFEQ3h5X0NPTU1PTi0+Q1NSLCBMTF9BRENfRkxBR19FT1NNUF9TTFYpID09CisgICAgICAgICAgIChMTF9BRENfRkxBR19FT1NNUF9TTFYpKQorICAgICAgICAgICAgICA/IDFVTAorICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgZmxhZyBtdWx0aW1vZGUgQURDIGdyb3VwIGluamVjdGVkIGVuZCBvZiB1bml0YXJ5IGNvbnZlcnNpb24gb2YKKyAqIHRoZSBBREMgbWFzdGVyLgorICogQHJtdG9sbCBDU1IgICAgICBKRU9DX01TVCAgICAgICBMTF9BRENfSXNBY3RpdmVGbGFnX01TVF9KRU9DCisgKiBAcGFyYW0gIEFEQ3h5X0NPTU1PTiBBREMgY29tbW9uIGluc3RhbmNlCisgKiAgICAgICAgIChjYW4gYmUgc2V0IGRpcmVjdGx5IGZyb20gQ01TSVMgZGVmaW5pdGlvbiBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8KKyAqIEByZWYgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKCkgKQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfQURDX0lzQWN0aXZlRmxhZ19NU1RfSkVPQyhjb25zdCBBRENfQ29tbW9uX1R5cGVEZWYgKkFEQ3h5X0NPTU1PTikgeworICByZXR1cm4gKChSRUFEX0JJVChBREN4eV9DT01NT04tPkNTUiwgTExfQURDX0ZMQUdfSkVPQ19NU1QpID09CisgICAgICAgICAgIChMTF9BRENfRkxBR19KRU9DX01TVCkpCisgICAgICAgICAgICAgID8gMVVMCisgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBmbGFnIG11bHRpbW9kZSBBREMgZ3JvdXAgaW5qZWN0ZWQgZW5kIG9mIHVuaXRhcnkgY29udmVyc2lvbiBvZgorICogdGhlIEFEQyBzbGF2ZS4KKyAqIEBybXRvbGwgQ1NSICAgICAgSkVPQ19TTFYgICAgICAgTExfQURDX0lzQWN0aXZlRmxhZ19TTFZfSkVPQworICogQHBhcmFtICBBREN4eV9DT01NT04gQURDIGNvbW1vbiBpbnN0YW5jZQorICogICAgICAgICAoY2FuIGJlIHNldCBkaXJlY3RseSBmcm9tIENNU0lTIGRlZmluaXRpb24gb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvCisgKiBAcmVmIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRSgpICkKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX0FEQ19Jc0FjdGl2ZUZsYWdfU0xWX0pFT0MoY29uc3QgQURDX0NvbW1vbl9UeXBlRGVmICpBREN4eV9DT01NT04pIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoQURDeHlfQ09NTU9OLT5DU1IsIExMX0FEQ19GTEFHX0pFT0NfU0xWKSA9PQorICAgICAgICAgICAoTExfQURDX0ZMQUdfSkVPQ19TTFYpKQorICAgICAgICAgICAgICA/IDFVTAorICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgZmxhZyBtdWx0aW1vZGUgQURDIGdyb3VwIGluamVjdGVkIGVuZCBvZiBzZXF1ZW5jZSBjb252ZXJzaW9ucyBvZgorICogdGhlIEFEQyBtYXN0ZXIuCisgKiBAcm10b2xsIENTUiAgICAgIEpFT1NfTVNUICAgICAgIExMX0FEQ19Jc0FjdGl2ZUZsYWdfTVNUX0pFT1MKKyAqIEBwYXJhbSAgQURDeHlfQ09NTU9OIEFEQyBjb21tb24gaW5zdGFuY2UKKyAqICAgICAgICAgKGNhbiBiZSBzZXQgZGlyZWN0bHkgZnJvbSBDTVNJUyBkZWZpbml0aW9uIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybworICogQHJlZiBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoKSApCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9BRENfSXNBY3RpdmVGbGFnX01TVF9KRU9TKGNvbnN0IEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OKSB7CisgIHJldHVybiAoKFJFQURfQklUKEFEQ3h5X0NPTU1PTi0+Q1NSLCBMTF9BRENfRkxBR19KRU9TX01TVCkgPT0KKyAgICAgICAgICAgKExMX0FEQ19GTEFHX0pFT1NfTVNUKSkKKyAgICAgICAgICAgICAgPyAxVUwKKyAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IGZsYWcgbXVsdGltb2RlIEFEQyBncm91cCBpbmplY3RlZCBlbmQgb2Ygc2VxdWVuY2UgY29udmVyc2lvbnMgb2YKKyAqIHRoZSBBREMgc2xhdmUuCisgKiBAcm10b2xsIENTUiAgICAgIEpFT1NfU0xWICAgICAgIExMX0FEQ19Jc0FjdGl2ZUZsYWdfU0xWX0pFT1MKKyAqIEBwYXJhbSAgQURDeHlfQ09NTU9OIEFEQyBjb21tb24gaW5zdGFuY2UKKyAqICAgICAgICAgKGNhbiBiZSBzZXQgZGlyZWN0bHkgZnJvbSBDTVNJUyBkZWZpbml0aW9uIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybworICogQHJlZiBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoKSApCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9BRENfSXNBY3RpdmVGbGFnX1NMVl9KRU9TKGNvbnN0IEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OKSB7CisgIHJldHVybiAoKFJFQURfQklUKEFEQ3h5X0NPTU1PTi0+Q1NSLCBMTF9BRENfRkxBR19KRU9TX1NMVikgPT0KKyAgICAgICAgICAgKExMX0FEQ19GTEFHX0pFT1NfU0xWKSkKKyAgICAgICAgICAgICAgPyAxVUwKKyAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IGZsYWcgbXVsdGltb2RlIEFEQyBncm91cCBpbmplY3RlZCBjb250ZXh0IHF1ZXVlIG92ZXJmbG93IG9mIHRoZQorICogQURDIG1hc3Rlci4KKyAqIEBybXRvbGwgQ1NSICAgICAgSlFPVkZfTVNUICAgICAgTExfQURDX0lzQWN0aXZlRmxhZ19NU1RfSlFPVkYKKyAqIEBwYXJhbSAgQURDeHlfQ09NTU9OIEFEQyBjb21tb24gaW5zdGFuY2UKKyAqICAgICAgICAgKGNhbiBiZSBzZXQgZGlyZWN0bHkgZnJvbSBDTVNJUyBkZWZpbml0aW9uIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybworICogQHJlZiBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoKSApCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9BRENfSXNBY3RpdmVGbGFnX01TVF9KUU9WRihjb25zdCBBRENfQ29tbW9uX1R5cGVEZWYgKkFEQ3h5X0NPTU1PTikgeworICByZXR1cm4gKChSRUFEX0JJVChBREN4eV9DT01NT04tPkNTUiwgTExfQURDX0ZMQUdfSlFPVkZfTVNUKSA9PQorICAgICAgICAgICAoTExfQURDX0ZMQUdfSlFPVkZfTVNUKSkKKyAgICAgICAgICAgICAgPyAxVUwKKyAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IGZsYWcgbXVsdGltb2RlIEFEQyBncm91cCBpbmplY3RlZCBjb250ZXh0IHF1ZXVlIG92ZXJmbG93IG9mIHRoZQorICogQURDIHNsYXZlLgorICogQHJtdG9sbCBDU1IgICAgICBKUU9WRl9TTFYgICAgICBMTF9BRENfSXNBY3RpdmVGbGFnX1NMVl9KUU9WRgorICogQHBhcmFtICBBREN4eV9DT01NT04gQURDIGNvbW1vbiBpbnN0YW5jZQorICogICAgICAgICAoY2FuIGJlIHNldCBkaXJlY3RseSBmcm9tIENNU0lTIGRlZmluaXRpb24gb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvCisgKiBAcmVmIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRSgpICkKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX0FEQ19Jc0FjdGl2ZUZsYWdfU0xWX0pRT1ZGKGNvbnN0IEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OKSB7CisgIHJldHVybiAoKFJFQURfQklUKEFEQ3h5X0NPTU1PTi0+Q1NSLCBMTF9BRENfRkxBR19KUU9WRl9TTFYpID09CisgICAgICAgICAgIChMTF9BRENfRkxBR19KUU9WRl9TTFYpKQorICAgICAgICAgICAgICA/IDFVTAorICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgZmxhZyBtdWx0aW1vZGUgQURDIGFuYWxvZyB3YXRjaGRvZyAxIG9mIHRoZSBBREMgbWFzdGVyLgorICogQHJtdG9sbCBDU1IgICAgICBBV0QxX01TVCAgICAgICBMTF9BRENfSXNBY3RpdmVGbGFnX01TVF9BV0QxCisgKiBAcGFyYW0gIEFEQ3h5X0NPTU1PTiBBREMgY29tbW9uIGluc3RhbmNlCisgKiAgICAgICAgIChjYW4gYmUgc2V0IGRpcmVjdGx5IGZyb20gQ01TSVMgZGVmaW5pdGlvbiBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8KKyAqIEByZWYgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKCkgKQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfQURDX0lzQWN0aXZlRmxhZ19NU1RfQVdEMShjb25zdCBBRENfQ29tbW9uX1R5cGVEZWYgKkFEQ3h5X0NPTU1PTikgeworICByZXR1cm4gKChSRUFEX0JJVChBREN4eV9DT01NT04tPkNTUiwgTExfQURDX0ZMQUdfQVdEMV9NU1QpID09CisgICAgICAgICAgIChMTF9BRENfRkxBR19BV0QxX01TVCkpCisgICAgICAgICAgICAgID8gMVVMCisgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBmbGFnIG11bHRpbW9kZSBhbmFsb2cgd2F0Y2hkb2cgMSBvZiB0aGUgQURDIHNsYXZlLgorICogQHJtdG9sbCBDU1IgICAgICBBV0QxX1NMViAgICAgICBMTF9BRENfSXNBY3RpdmVGbGFnX1NMVl9BV0QxCisgKiBAcGFyYW0gIEFEQ3h5X0NPTU1PTiBBREMgY29tbW9uIGluc3RhbmNlCisgKiAgICAgICAgIChjYW4gYmUgc2V0IGRpcmVjdGx5IGZyb20gQ01TSVMgZGVmaW5pdGlvbiBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8KKyAqIEByZWYgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKCkgKQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfQURDX0lzQWN0aXZlRmxhZ19TTFZfQVdEMShjb25zdCBBRENfQ29tbW9uX1R5cGVEZWYgKkFEQ3h5X0NPTU1PTikgeworICByZXR1cm4gKChSRUFEX0JJVChBREN4eV9DT01NT04tPkNTUiwgTExfQURDX0ZMQUdfQVdEMV9TTFYpID09CisgICAgICAgICAgIChMTF9BRENfRkxBR19BV0QxX1NMVikpCisgICAgICAgICAgICAgID8gMVVMCisgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBmbGFnIG11bHRpbW9kZSBBREMgYW5hbG9nIHdhdGNoZG9nIDIgb2YgdGhlIEFEQyBtYXN0ZXIuCisgKiBAcm10b2xsIENTUiAgICAgIEFXRDJfTVNUICAgICAgIExMX0FEQ19Jc0FjdGl2ZUZsYWdfTVNUX0FXRDIKKyAqIEBwYXJhbSAgQURDeHlfQ09NTU9OIEFEQyBjb21tb24gaW5zdGFuY2UKKyAqICAgICAgICAgKGNhbiBiZSBzZXQgZGlyZWN0bHkgZnJvbSBDTVNJUyBkZWZpbml0aW9uIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybworICogQHJlZiBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoKSApCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9BRENfSXNBY3RpdmVGbGFnX01TVF9BV0QyKGNvbnN0IEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OKSB7CisgIHJldHVybiAoKFJFQURfQklUKEFEQ3h5X0NPTU1PTi0+Q1NSLCBMTF9BRENfRkxBR19BV0QyX01TVCkgPT0KKyAgICAgICAgICAgKExMX0FEQ19GTEFHX0FXRDJfTVNUKSkKKyAgICAgICAgICAgICAgPyAxVUwKKyAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IGZsYWcgbXVsdGltb2RlIEFEQyBhbmFsb2cgd2F0Y2hkb2cgMiBvZiB0aGUgQURDIHNsYXZlLgorICogQHJtdG9sbCBDU1IgICAgICBBV0QyX1NMViAgICAgICBMTF9BRENfSXNBY3RpdmVGbGFnX1NMVl9BV0QyCisgKiBAcGFyYW0gIEFEQ3h5X0NPTU1PTiBBREMgY29tbW9uIGluc3RhbmNlCisgKiAgICAgICAgIChjYW4gYmUgc2V0IGRpcmVjdGx5IGZyb20gQ01TSVMgZGVmaW5pdGlvbiBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8KKyAqIEByZWYgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKCkgKQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfQURDX0lzQWN0aXZlRmxhZ19TTFZfQVdEMihjb25zdCBBRENfQ29tbW9uX1R5cGVEZWYgKkFEQ3h5X0NPTU1PTikgeworICByZXR1cm4gKChSRUFEX0JJVChBREN4eV9DT01NT04tPkNTUiwgTExfQURDX0ZMQUdfQVdEMl9TTFYpID09CisgICAgICAgICAgIChMTF9BRENfRkxBR19BV0QyX1NMVikpCisgICAgICAgICAgICAgID8gMVVMCisgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBmbGFnIG11bHRpbW9kZSBBREMgYW5hbG9nIHdhdGNoZG9nIDMgb2YgdGhlIEFEQyBtYXN0ZXIuCisgKiBAcm10b2xsIENTUiAgICAgIEFXRDNfTVNUICAgICAgIExMX0FEQ19Jc0FjdGl2ZUZsYWdfTVNUX0FXRDMKKyAqIEBwYXJhbSAgQURDeHlfQ09NTU9OIEFEQyBjb21tb24gaW5zdGFuY2UKKyAqICAgICAgICAgKGNhbiBiZSBzZXQgZGlyZWN0bHkgZnJvbSBDTVNJUyBkZWZpbml0aW9uIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybworICogQHJlZiBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoKSApCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9BRENfSXNBY3RpdmVGbGFnX01TVF9BV0QzKGNvbnN0IEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OKSB7CisgIHJldHVybiAoKFJFQURfQklUKEFEQ3h5X0NPTU1PTi0+Q1NSLCBMTF9BRENfRkxBR19BV0QzX01TVCkgPT0KKyAgICAgICAgICAgKExMX0FEQ19GTEFHX0FXRDNfTVNUKSkKKyAgICAgICAgICAgICAgPyAxVUwKKyAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IGZsYWcgbXVsdGltb2RlIEFEQyBhbmFsb2cgd2F0Y2hkb2cgMyBvZiB0aGUgQURDIHNsYXZlLgorICogQHJtdG9sbCBDU1IgICAgICBBV0QzX1NMViAgICAgICBMTF9BRENfSXNBY3RpdmVGbGFnX1NMVl9BV0QzCisgKiBAcGFyYW0gIEFEQ3h5X0NPTU1PTiBBREMgY29tbW9uIGluc3RhbmNlCisgKiAgICAgICAgIChjYW4gYmUgc2V0IGRpcmVjdGx5IGZyb20gQ01TSVMgZGVmaW5pdGlvbiBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8KKyAqIEByZWYgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKCkgKQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfQURDX0lzQWN0aXZlRmxhZ19TTFZfQVdEMyhjb25zdCBBRENfQ29tbW9uX1R5cGVEZWYgKkFEQ3h5X0NPTU1PTikgeworICByZXR1cm4gKChSRUFEX0JJVChBREN4eV9DT01NT04tPkNTUiwgTExfQURDX0ZMQUdfQVdEM19TTFYpID09CisgICAgICAgICAgIChMTF9BRENfRkxBR19BV0QzX1NMVikpCisgICAgICAgICAgICAgID8gMVVMCisgICAgICAgICAgICAgIDogMFVMKTsKK30KKyNlbmRpZiAvKiBBRENfTVVMVElNT0RFX1NVUFBPUlQgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VGX0lUX01hbmFnZW1lbnQgQURDIElUIG1hbmFnZW1lbnQKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBBREMgcmVhZHkuCisgKiBAcm10b2xsIElFUiAgICAgIEFEUkRZSUUgICAgICAgIExMX0FEQ19FbmFibGVJVF9BRFJEWQorICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19FbmFibGVJVF9BRFJEWShBRENfVHlwZURlZiAqQURDeCkgeworICBTRVRfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX0FEUkRZKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBpbnRlcnJ1cHRpb24gQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHVuaXRhcnkgY29udmVyc2lvbi4KKyAqIEBybXRvbGwgSUVSICAgICAgRU9DSUUgICAgICAgICAgTExfQURDX0VuYWJsZUlUX0VPQworICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19FbmFibGVJVF9FT0MoQURDX1R5cGVEZWYgKkFEQ3gpIHsKKyAgU0VUX0JJVChBREN4LT5JRVIsIExMX0FEQ19JVF9FT0MpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIGludGVycnVwdGlvbiBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2Ygc2VxdWVuY2UgY29udmVyc2lvbnMuCisgKiBAcm10b2xsIElFUiAgICAgIEVPU0lFICAgICAgICAgIExMX0FEQ19FbmFibGVJVF9FT1MKKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfRW5hYmxlSVRfRU9TKEFEQ19UeXBlRGVmICpBREN4KSB7CisgIFNFVF9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfRU9TKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBBREMgZ3JvdXAgcmVndWxhciBpbnRlcnJ1cHRpb24gb3ZlcnJ1bi4KKyAqIEBybXRvbGwgSUVSICAgICAgT1ZSSUUgICAgICAgICAgTExfQURDX0VuYWJsZUlUX09WUgorICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19FbmFibGVJVF9PVlIoQURDX1R5cGVEZWYgKkFEQ3gpIHsKKyAgU0VUX0JJVChBREN4LT5JRVIsIExMX0FEQ19JVF9PVlIpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIGludGVycnVwdGlvbiBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2Ygc2FtcGxpbmcuCisgKiBAcm10b2xsIElFUiAgICAgIEVPU01QSUUgICAgICAgIExMX0FEQ19FbmFibGVJVF9FT1NNUAorICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19FbmFibGVJVF9FT1NNUChBRENfVHlwZURlZiAqQURDeCkgeworICBTRVRfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX0VPU01QKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBpbnRlcnJ1cHRpb24gQURDIGdyb3VwIGluamVjdGVkIGVuZCBvZiB1bml0YXJ5IGNvbnZlcnNpb24uCisgKiBAcm10b2xsIElFUiAgICAgIEpFT0NJRSAgICAgICAgIExMX0FEQ19FbmFibGVJVF9KRU9DCisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0VuYWJsZUlUX0pFT0MoQURDX1R5cGVEZWYgKkFEQ3gpIHsKKyAgU0VUX0JJVChBREN4LT5JRVIsIExMX0FEQ19JVF9KRU9DKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBpbnRlcnJ1cHRpb24gQURDIGdyb3VwIGluamVjdGVkIGVuZCBvZiBzZXF1ZW5jZSBjb252ZXJzaW9ucy4KKyAqIEBybXRvbGwgSUVSICAgICAgSkVPU0lFICAgICAgICAgTExfQURDX0VuYWJsZUlUX0pFT1MKKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfRW5hYmxlSVRfSkVPUyhBRENfVHlwZURlZiAqQURDeCkgeworICBTRVRfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX0pFT1MpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIGludGVycnVwdGlvbiBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udGV4dCBxdWV1ZSBvdmVyZmxvdy4KKyAqIEBybXRvbGwgSUVSICAgICAgSlFPVkZJRSAgICAgICAgTExfQURDX0VuYWJsZUlUX0pRT1ZGCisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0VuYWJsZUlUX0pRT1ZGKEFEQ19UeXBlRGVmICpBREN4KSB7CisgIFNFVF9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfSlFPVkYpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIGludGVycnVwdGlvbiBBREMgYW5hbG9nIHdhdGNoZG9nIDEuCisgKiBAcm10b2xsIElFUiAgICAgIEFXRDFJRSAgICAgICAgIExMX0FEQ19FbmFibGVJVF9BV0QxCisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0VuYWJsZUlUX0FXRDEoQURDX1R5cGVEZWYgKkFEQ3gpIHsKKyAgU0VUX0JJVChBREN4LT5JRVIsIExMX0FEQ19JVF9BV0QxKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBpbnRlcnJ1cHRpb24gQURDIGFuYWxvZyB3YXRjaGRvZyAyLgorICogQHJtdG9sbCBJRVIgICAgICBBV0QySUUgICAgICAgICBMTF9BRENfRW5hYmxlSVRfQVdEMgorICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19FbmFibGVJVF9BV0QyKEFEQ19UeXBlRGVmICpBREN4KSB7CisgIFNFVF9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfQVdEMik7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgaW50ZXJydXB0aW9uIEFEQyBhbmFsb2cgd2F0Y2hkb2cgMy4KKyAqIEBybXRvbGwgSUVSICAgICAgQVdEM0lFICAgICAgICAgTExfQURDX0VuYWJsZUlUX0FXRDMKKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfRW5hYmxlSVRfQVdEMyhBRENfVHlwZURlZiAqQURDeCkgeworICBTRVRfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX0FXRDMpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBpbnRlcnJ1cHRpb24gQURDIHJlYWR5LgorICogQHJtdG9sbCBJRVIgICAgICBBRFJEWUlFICAgICAgICBMTF9BRENfRGlzYWJsZUlUX0FEUkRZCisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0Rpc2FibGVJVF9BRFJEWShBRENfVHlwZURlZiAqQURDeCkgeworICBDTEVBUl9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfQURSRFkpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBpbnRlcnJ1cHRpb24gQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHVuaXRhcnkgY29udmVyc2lvbi4KKyAqIEBybXRvbGwgSUVSICAgICAgRU9DSUUgICAgICAgICAgTExfQURDX0Rpc2FibGVJVF9FT0MKKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfRGlzYWJsZUlUX0VPQyhBRENfVHlwZURlZiAqQURDeCkgeworICBDTEVBUl9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfRU9DKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgaW50ZXJydXB0aW9uIEFEQyBncm91cCByZWd1bGFyIGVuZCBvZiBzZXF1ZW5jZSBjb252ZXJzaW9ucy4KKyAqIEBybXRvbGwgSUVSICAgICAgRU9TSUUgICAgICAgICAgTExfQURDX0Rpc2FibGVJVF9FT1MKKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfRGlzYWJsZUlUX0VPUyhBRENfVHlwZURlZiAqQURDeCkgeworICBDTEVBUl9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfRU9TKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgaW50ZXJydXB0aW9uIEFEQyBncm91cCByZWd1bGFyIG92ZXJydW4uCisgKiBAcm10b2xsIElFUiAgICAgIE9WUklFICAgICAgICAgIExMX0FEQ19EaXNhYmxlSVRfT1ZSCisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0Rpc2FibGVJVF9PVlIoQURDX1R5cGVEZWYgKkFEQ3gpIHsKKyAgQ0xFQVJfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX09WUik7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIGludGVycnVwdGlvbiBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2Ygc2FtcGxpbmcuCisgKiBAcm10b2xsIElFUiAgICAgIEVPU01QSUUgICAgICAgIExMX0FEQ19EaXNhYmxlSVRfRU9TTVAKKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfRGlzYWJsZUlUX0VPU01QKEFEQ19UeXBlRGVmICpBREN4KSB7CisgIENMRUFSX0JJVChBREN4LT5JRVIsIExMX0FEQ19JVF9FT1NNUCk7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIGludGVycnVwdGlvbiBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2YgdW5pdGFyeSBjb252ZXJzaW9uLgorICogQHJtdG9sbCBJRVIgICAgICBKRU9DSUUgICAgICAgICBMTF9BRENfRGlzYWJsZUlUX0pFT0MKKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfRGlzYWJsZUlUX0pFT0MoQURDX1R5cGVEZWYgKkFEQ3gpIHsKKyAgQ0xFQVJfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX0pFT0MpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBpbnRlcnJ1cHRpb24gQURDIGdyb3VwIGluamVjdGVkIGVuZCBvZiBzZXF1ZW5jZSBjb252ZXJzaW9ucy4KKyAqIEBybXRvbGwgSUVSICAgICAgSkVPU0lFICAgICAgICAgTExfQURDX0Rpc2FibGVJVF9KRU9TCisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0Rpc2FibGVJVF9KRU9TKEFEQ19UeXBlRGVmICpBREN4KSB7CisgIENMRUFSX0JJVChBREN4LT5JRVIsIExMX0FEQ19JVF9KRU9TKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgaW50ZXJydXB0aW9uIEFEQyBncm91cCBpbmplY3RlZCBjb250ZXh0IHF1ZXVlIG92ZXJmbG93LgorICogQHJtdG9sbCBJRVIgICAgICBKUU9WRklFICAgICAgICBMTF9BRENfRGlzYWJsZUlUX0pRT1ZGCisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0Rpc2FibGVJVF9KUU9WRihBRENfVHlwZURlZiAqQURDeCkgeworICBDTEVBUl9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfSlFPVkYpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBpbnRlcnJ1cHRpb24gQURDIGFuYWxvZyB3YXRjaGRvZyAxLgorICogQHJtdG9sbCBJRVIgICAgICBBV0QxSUUgICAgICAgICBMTF9BRENfRGlzYWJsZUlUX0FXRDEKKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfRGlzYWJsZUlUX0FXRDEoQURDX1R5cGVEZWYgKkFEQ3gpIHsKKyAgQ0xFQVJfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX0FXRDEpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBpbnRlcnJ1cHRpb24gQURDIGFuYWxvZyB3YXRjaGRvZyAyLgorICogQHJtdG9sbCBJRVIgICAgICBBV0QySUUgICAgICAgICBMTF9BRENfRGlzYWJsZUlUX0FXRDIKKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfRGlzYWJsZUlUX0FXRDIoQURDX1R5cGVEZWYgKkFEQ3gpIHsKKyAgQ0xFQVJfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX0FXRDIpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBpbnRlcnJ1cHRpb24gQURDIGFuYWxvZyB3YXRjaGRvZyAzLgorICogQHJtdG9sbCBJRVIgICAgICBBV0QzSUUgICAgICAgICBMTF9BRENfRGlzYWJsZUlUX0FXRDMKKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfRGlzYWJsZUlUX0FXRDMoQURDX1R5cGVEZWYgKkFEQ3gpIHsKKyAgQ0xFQVJfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX0FXRDMpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IHN0YXRlIG9mIGludGVycnVwdGlvbiBBREMgcmVhZHkKKyAqICAgICAgICAgKDA6IGludGVycnVwdCBkaXNhYmxlZCwgMTogaW50ZXJydXB0IGVuYWJsZWQpLgorICogQHJtdG9sbCBJRVIgICAgICBBRFJEWUlFICAgICAgICBMTF9BRENfSXNFbmFibGVkSVRfQURSRFkKKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzRW5hYmxlZElUX0FEUkRZKGNvbnN0IEFEQ19UeXBlRGVmICpBREN4KSB7CisgIHJldHVybiAoKFJFQURfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX0FEUkRZKSA9PSAoTExfQURDX0lUX0FEUkRZKSkgPyAxVUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgc3RhdGUgb2YgaW50ZXJydXB0aW9uIEFEQyBncm91cCByZWd1bGFyIGVuZCBvZiB1bml0YXJ5IGNvbnZlcnNpb24KKyAqICAgICAgICAgKDA6IGludGVycnVwdCBkaXNhYmxlZCwgMTogaW50ZXJydXB0IGVuYWJsZWQpLgorICogQHJtdG9sbCBJRVIgICAgICBFT0NJRSAgICAgICAgICBMTF9BRENfSXNFbmFibGVkSVRfRU9DCisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0VuYWJsZWRJVF9FT0MoY29uc3QgQURDX1R5cGVEZWYgKkFEQ3gpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfRU9DKSA9PSAoTExfQURDX0lUX0VPQykpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBzdGF0ZSBvZiBpbnRlcnJ1cHRpb24gQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHNlcXVlbmNlCisgKiBjb252ZXJzaW9ucyAoMDogaW50ZXJydXB0IGRpc2FibGVkLCAxOiBpbnRlcnJ1cHQgZW5hYmxlZCkuCisgKiBAcm10b2xsIElFUiAgICAgIEVPU0lFICAgICAgICAgIExMX0FEQ19Jc0VuYWJsZWRJVF9FT1MKKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzRW5hYmxlZElUX0VPUyhjb25zdCBBRENfVHlwZURlZiAqQURDeCkgeworICByZXR1cm4gKChSRUFEX0JJVChBREN4LT5JRVIsIExMX0FEQ19JVF9FT1MpID09IChMTF9BRENfSVRfRU9TKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IHN0YXRlIG9mIGludGVycnVwdGlvbiBBREMgZ3JvdXAgcmVndWxhciBvdmVycnVuCisgKiAgICAgICAgICgwOiBpbnRlcnJ1cHQgZGlzYWJsZWQsIDE6IGludGVycnVwdCBlbmFibGVkKS4KKyAqIEBybXRvbGwgSUVSICAgICAgT1ZSSUUgICAgICAgICAgTExfQURDX0lzRW5hYmxlZElUX09WUgorICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSXNFbmFibGVkSVRfT1ZSKGNvbnN0IEFEQ19UeXBlRGVmICpBREN4KSB7CisgIHJldHVybiAoKFJFQURfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX09WUikgPT0gKExMX0FEQ19JVF9PVlIpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgc3RhdGUgb2YgaW50ZXJydXB0aW9uIEFEQyBncm91cCByZWd1bGFyIGVuZCBvZiBzYW1wbGluZworICogICAgICAgICAoMDogaW50ZXJydXB0IGRpc2FibGVkLCAxOiBpbnRlcnJ1cHQgZW5hYmxlZCkuCisgKiBAcm10b2xsIElFUiAgICAgIEVPU01QSUUgICAgICAgIExMX0FEQ19Jc0VuYWJsZWRJVF9FT1NNUAorICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSXNFbmFibGVkSVRfRU9TTVAoY29uc3QgQURDX1R5cGVEZWYgKkFEQ3gpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfRU9TTVApID09IChMTF9BRENfSVRfRU9TTVApKSA/IDFVTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBzdGF0ZSBvZiBpbnRlcnJ1cHRpb24gQURDIGdyb3VwIGluamVjdGVkIGVuZCBvZiB1bml0YXJ5CisgKiBjb252ZXJzaW9uICgwOiBpbnRlcnJ1cHQgZGlzYWJsZWQsIDE6IGludGVycnVwdCBlbmFibGVkKS4KKyAqIEBybXRvbGwgSUVSICAgICAgSkVPQ0lFICAgICAgICAgTExfQURDX0lzRW5hYmxlZElUX0pFT0MKKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzRW5hYmxlZElUX0pFT0MoY29uc3QgQURDX1R5cGVEZWYgKkFEQ3gpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfSkVPQykgPT0gKExMX0FEQ19JVF9KRU9DKSkgPyAxVUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IHN0YXRlIG9mIGludGVycnVwdGlvbiBBREMgZ3JvdXAgaW5qZWN0ZWQgZW5kIG9mIHNlcXVlbmNlCisgKiBjb252ZXJzaW9ucyAoMDogaW50ZXJydXB0IGRpc2FibGVkLCAxOiBpbnRlcnJ1cHQgZW5hYmxlZCkuCisgKiBAcm10b2xsIElFUiAgICAgIEpFT1NJRSAgICAgICAgIExMX0FEQ19Jc0VuYWJsZWRJVF9KRU9TCisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0VuYWJsZWRJVF9KRU9TKGNvbnN0IEFEQ19UeXBlRGVmICpBREN4KSB7CisgIHJldHVybiAoKFJFQURfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX0pFT1MpID09IChMTF9BRENfSVRfSkVPUykpID8gMVVMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBzdGF0ZSBvZiBpbnRlcnJ1cHRpb24gQURDIGdyb3VwIGluamVjdGVkIGNvbnRleHQgcXVldWUgb3ZlcmZsb3cKKyAqIGludGVycnVwdCBzdGF0ZSAoMDogaW50ZXJydXB0IGRpc2FibGVkLCAxOiBpbnRlcnJ1cHQgZW5hYmxlZCkuCisgKiBAcm10b2xsIElFUiAgICAgIEpRT1ZGSUUgICAgICAgIExMX0FEQ19Jc0VuYWJsZWRJVF9KUU9WRgorICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSXNFbmFibGVkSVRfSlFPVkYoY29uc3QgQURDX1R5cGVEZWYgKkFEQ3gpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfSlFPVkYpID09IChMTF9BRENfSVRfSlFPVkYpKSA/IDFVTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBzdGF0ZSBvZiBpbnRlcnJ1cHRpb24gQURDIGFuYWxvZyB3YXRjaGRvZyAxCisgKiAgICAgICAgICgwOiBpbnRlcnJ1cHQgZGlzYWJsZWQsIDE6IGludGVycnVwdCBlbmFibGVkKS4KKyAqIEBybXRvbGwgSUVSICAgICAgQVdEMUlFICAgICAgICAgTExfQURDX0lzRW5hYmxlZElUX0FXRDEKKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzRW5hYmxlZElUX0FXRDEoY29uc3QgQURDX1R5cGVEZWYgKkFEQ3gpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfQVdEMSkgPT0gKExMX0FEQ19JVF9BV0QxKSkgPyAxVUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IHN0YXRlIG9mIGludGVycnVwdGlvbiBHZXQgQURDIGFuYWxvZyB3YXRjaGRvZyAyCisgKiAgICAgICAgICgwOiBpbnRlcnJ1cHQgZGlzYWJsZWQsIDE6IGludGVycnVwdCBlbmFibGVkKS4KKyAqIEBybXRvbGwgSUVSICAgICAgQVdEMklFICAgICAgICAgTExfQURDX0lzRW5hYmxlZElUX0FXRDIKKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzRW5hYmxlZElUX0FXRDIoY29uc3QgQURDX1R5cGVEZWYgKkFEQ3gpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfQVdEMikgPT0gKExMX0FEQ19JVF9BV0QyKSkgPyAxVUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IHN0YXRlIG9mIGludGVycnVwdGlvbiBHZXQgQURDIGFuYWxvZyB3YXRjaGRvZyAzCisgKiAgICAgICAgICgwOiBpbnRlcnJ1cHQgZGlzYWJsZWQsIDE6IGludGVycnVwdCBlbmFibGVkKS4KKyAqIEBybXRvbGwgSUVSICAgICAgQVdEM0lFICAgICAgICAgTExfQURDX0lzRW5hYmxlZElUX0FXRDMKKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzRW5hYmxlZElUX0FXRDMoY29uc3QgQURDX1R5cGVEZWYgKkFEQ3gpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfQVdEMykgPT0gKExMX0FEQ19JVF9BV0QzKSkgPyAxVUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEB9CisgKi8KKworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBBRENfTExfRUZfSW5pdCBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgKiBAeworICovCisKKy8qIEluaXRpYWxpemF0aW9uIG9mIHNvbWUgZmVhdHVyZXMgb2YgQURDIGNvbW1vbiBwYXJhbWV0ZXJzIGFuZCBtdWx0aW1vZGUgKi8KK0Vycm9yU3RhdHVzIExMX0FEQ19Db21tb25EZUluaXQoY29uc3QgQURDX0NvbW1vbl9UeXBlRGVmICpBREN4eV9DT01NT04pOworRXJyb3JTdGF0dXMgTExfQURDX0NvbW1vbkluaXQoCisgICAgQURDX0NvbW1vbl9UeXBlRGVmICpBREN4eV9DT01NT04sCisgICAgY29uc3QgTExfQURDX0NvbW1vbkluaXRUeXBlRGVmICpwQURDX0NvbW1vbkluaXRTdHJ1Y3QpOwordm9pZCBMTF9BRENfQ29tbW9uU3RydWN0SW5pdChMTF9BRENfQ29tbW9uSW5pdFR5cGVEZWYgKnBBRENfQ29tbW9uSW5pdFN0cnVjdCk7CisKKy8qIERlLWluaXRpYWxpemF0aW9uIG9mIEFEQyBpbnN0YW5jZSwgQURDIGdyb3VwIHJlZ3VsYXIgYW5kIEFEQyBncm91cCBpbmplY3RlZAorICovCisvKiAoYXZhaWxhYmlsaXR5IG9mIEFEQyBncm91cCBpbmplY3RlZCBkZXBlbmRzIG9uIFNUTTMyIHNlcmllcykgKi8KK0Vycm9yU3RhdHVzIExMX0FEQ19EZUluaXQoQURDX1R5cGVEZWYgKkFEQ3gpOworCisvKiBJbml0aWFsaXphdGlvbiBvZiBzb21lIGZlYXR1cmVzIG9mIEFEQyBpbnN0YW5jZSAqLworRXJyb3JTdGF0dXMgTExfQURDX0luaXQoQURDX1R5cGVEZWYgKkFEQ3gsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMTF9BRENfSW5pdFR5cGVEZWYgKnBBRENfSW5pdFN0cnVjdCk7Cit2b2lkIExMX0FEQ19TdHJ1Y3RJbml0KExMX0FEQ19Jbml0VHlwZURlZiAqcEFEQ19Jbml0U3RydWN0KTsKKworLyogSW5pdGlhbGl6YXRpb24gb2Ygc29tZSBmZWF0dXJlcyBvZiBBREMgaW5zdGFuY2UgYW5kIEFEQyBncm91cCByZWd1bGFyICovCitFcnJvclN0YXR1cyBMTF9BRENfUkVHX0luaXQoQURDX1R5cGVEZWYgKkFEQ3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTExfQURDX1JFR19Jbml0VHlwZURlZiAqcEFEQ19SZWdJbml0U3RydWN0KTsKK3ZvaWQgTExfQURDX1JFR19TdHJ1Y3RJbml0KExMX0FEQ19SRUdfSW5pdFR5cGVEZWYgKnBBRENfUmVnSW5pdFN0cnVjdCk7CisKKy8qIEluaXRpYWxpemF0aW9uIG9mIHNvbWUgZmVhdHVyZXMgb2YgQURDIGluc3RhbmNlIGFuZCBBREMgZ3JvdXAgaW5qZWN0ZWQgKi8KK0Vycm9yU3RhdHVzIExMX0FEQ19JTkpfSW5pdChBRENfVHlwZURlZiAqQURDeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMTF9BRENfSU5KX0luaXRUeXBlRGVmICpwQURDX0luakluaXRTdHJ1Y3QpOwordm9pZCBMTF9BRENfSU5KX1N0cnVjdEluaXQoTExfQURDX0lOSl9Jbml0VHlwZURlZiAqcEFEQ19JbmpJbml0U3RydWN0KTsKKworLyoqCisgKiBAfQorICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworI2VuZGlmIC8qIEFEQzEgfHwgQURDMiB8fCBBREMzIHx8IEFEQzQgfHwgQURDNSAqLworCisvKioKKyAqIEB9CisgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyRzR4eF9MTF9BRENfSCAqLwpkaWZmIC0tZ2l0IGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfbGxfYnVzLmggYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9sbF9idXMuaAppbmRleCAwZDcxY2FjLi4wMDk3MjViIDEwMDY0NAotLS0gYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9sbF9idXMuaAorKysgYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9sbF9idXMuaApAQCAtMSwxNjM2ICsxLDE2MzYgQEAKLS8qKg0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICAqIEBmaWxlICAgIHN0bTMyZzR4eF9sbF9idXMuaA0KLSAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQ0KLSAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBCVVMgTEwgbW9kdWxlLg0KLQ0KLSAgQHZlcmJhdGltDQotICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFJDQyBMaW1pdGF0aW9ucyAjIyMjIw0KLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgIFsuLl0NCi0gICAgICBBIGRlbGF5IGJldHdlZW4gYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxlIGFuZCB0aGUgZWZmZWN0aXZlDQotICBwZXJpcGhlcmFsIGVuYWJsaW5nIHNob3VsZCBiZSB0YWtlbiBpbnRvIGFjY291bnQgaW4gb3JkZXIgdG8gbWFuYWdlIHRoZQ0KLSAgcGVyaXBoZXJhbCByZWFkL3dyaXRlIGZyb20vdG8gcmVnaXN0ZXJzLg0KLSAgICAgICgrKSBUaGlzIGRlbGF5IGRlcGVuZHMgb24gdGhlIHBlcmlwaGVyYWwgbWFwcGluZy4NCi0gICAgICAgICgrKykgQUhCICYgQVBCIHBlcmlwaGVyYWxzLCAxIGR1bW15IHJlYWQgaXMgbmVjZXNzYXJ5DQotDQotICAgIFsuLl0NCi0gICAgICBXb3JrYXJvdW5kczoNCi0gICAgICAoIykgRm9yIEFIQiAmIEFQQiBwZXJpcGhlcmFscywgYSBkdW1teSByZWFkIHRvIHRoZSBwZXJpcGhlcmFsIHJlZ2lzdGVyIGhhcw0KLSAgYmVlbiBpbnNlcnRlZCBpbiBlYWNoIExMX3tCVVN9X0dSUHt4fV9FbmFibGVDbG9jaygpIGZ1bmN0aW9uLg0KLQ0KLSAgQGVuZHZlcmJhdGltDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICogQGF0dGVudGlvbg0KLSAgKg0KLSAgKiBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLg0KLSAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KLSAgKg0KLSAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRlcm1zIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUNCi0gIGluDQotICAqIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4NCi0gICogSWYgbm8gTElDRU5TRSBmaWxlIGNvbWVzIHdpdGggdGhpcyBzb2Z0d2FyZSwgaXQgaXMgcHJvdmlkZWQgQVMtSVMuDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICovDQotDQotLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaWZuZGVmIFNUTTMyRzR4eF9MTF9CVVNfSA0KLSNkZWZpbmUgU1RNMzJHNHh4X0xMX0JVU19IDQotDQotI2lmZGVmIF9fY3BsdXNwbHVzDQotZXh0ZXJuICJDIiB7DQotI2VuZGlmDQotDQotLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaW5jbHVkZSAic3RtMzJnNHh4LmgiDQotDQotLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzR4eF9MTF9Ecml2ZXINCi0gKiBAew0KLSAqLw0KLQ0KLSNpZiBkZWZpbmVkKFJDQykNCi0NCi0vKiogQGRlZmdyb3VwIEJVU19MTCBCVVMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0NCi0vKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLQ0KLS8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotDQotLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgQlVTX0xMX0V4cG9ydGVkX0NvbnN0YW50cyBCVVMgRXhwb3J0ZWQgQ29uc3RhbnRzDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEJVU19MTF9FQ19BSEIxX0dSUDFfUEVSSVBIICBBSEIxIEdSUDEgUEVSSVBIDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX0FIQjFfR1JQMV9QRVJJUEhfQUxMIDB4RkZGRkZGRkZVDQotI2RlZmluZSBMTF9BSEIxX0dSUDFfUEVSSVBIX0RNQTEgUkNDX0FIQjFFTlJfRE1BMUVODQotI2RlZmluZSBMTF9BSEIxX0dSUDFfUEVSSVBIX0RNQTIgUkNDX0FIQjFFTlJfRE1BMkVODQotI2RlZmluZSBMTF9BSEIxX0dSUDFfUEVSSVBIX0RNQU1VWDEgUkNDX0FIQjFFTlJfRE1BTVVYMUVODQotI2RlZmluZSBMTF9BSEIxX0dSUDFfUEVSSVBIX0NPUkRJQyBSQ0NfQUhCMUVOUl9DT1JESUNFTg0KLSNkZWZpbmUgTExfQUhCMV9HUlAxX1BFUklQSF9GTUFDIFJDQ19BSEIxRU5SX0ZNQUNFTg0KLSNkZWZpbmUgTExfQUhCMV9HUlAxX1BFUklQSF9GTEFTSCBSQ0NfQUhCMUVOUl9GTEFTSEVODQotI2RlZmluZSBMTF9BSEIxX0dSUDFfUEVSSVBIX1NSQU0xIFJDQ19BSEIxU01FTlJfU1JBTTFTTUVODQotI2RlZmluZSBMTF9BSEIxX0dSUDFfUEVSSVBIX0NSQyBSQ0NfQUhCMUVOUl9DUkNFTg0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBCVVNfTExfRUNfQUhCMl9HUlAxX1BFUklQSCAgQUhCMiBHUlAxIFBFUklQSA0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9BSEIyX0dSUDFfUEVSSVBIX0FMTCAweEZGRkZGRkZGVQ0KLSNkZWZpbmUgTExfQUhCMl9HUlAxX1BFUklQSF9HUElPQSBSQ0NfQUhCMkVOUl9HUElPQUVODQotI2RlZmluZSBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9CIFJDQ19BSEIyRU5SX0dQSU9CRU4NCi0jZGVmaW5lIExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0MgUkNDX0FIQjJFTlJfR1BJT0NFTg0KLSNkZWZpbmUgTExfQUhCMl9HUlAxX1BFUklQSF9HUElPRCBSQ0NfQUhCMkVOUl9HUElPREVODQotI2RlZmluZSBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9FIFJDQ19BSEIyRU5SX0dQSU9FRU4NCi0jZGVmaW5lIExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0YgUkNDX0FIQjJFTlJfR1BJT0ZFTg0KLSNkZWZpbmUgTExfQUhCMl9HUlAxX1BFUklQSF9HUElPRyBSQ0NfQUhCMkVOUl9HUElPR0VODQotI2RlZmluZSBMTF9BSEIyX0dSUDFfUEVSSVBIX0NDTSBSQ0NfQUhCMlNNRU5SX0NDTVNNRU4NCi0jZGVmaW5lIExMX0FIQjJfR1JQMV9QRVJJUEhfU1JBTTIgUkNDX0FIQjJTTUVOUl9TUkFNMlNNRU4NCi0jZGVmaW5lIExMX0FIQjJfR1JQMV9QRVJJUEhfQURDMTIgUkNDX0FIQjJFTlJfQURDMTJFTg0KLSNpZiBkZWZpbmVkKEFEQzM0NV9DT01NT04pDQotI2RlZmluZSBMTF9BSEIyX0dSUDFfUEVSSVBIX0FEQzM0NSBSQ0NfQUhCMkVOUl9BREMzNDVFTg0KLSNlbmRpZiAvKiBBREMzNDVfQ09NTU9OICovDQotI2RlZmluZSBMTF9BSEIyX0dSUDFfUEVSSVBIX0RBQzEgUkNDX0FIQjJFTlJfREFDMUVODQotI2lmIGRlZmluZWQoREFDMikNCi0jZGVmaW5lIExMX0FIQjJfR1JQMV9QRVJJUEhfREFDMiBSQ0NfQUhCMkVOUl9EQUMyRU4NCi0jZW5kaWYgLyogREFDMiAqLw0KLSNkZWZpbmUgTExfQUhCMl9HUlAxX1BFUklQSF9EQUMzIFJDQ19BSEIyRU5SX0RBQzNFTg0KLSNpZiBkZWZpbmVkKERBQzQpDQotI2RlZmluZSBMTF9BSEIyX0dSUDFfUEVSSVBIX0RBQzQgUkNDX0FIQjJFTlJfREFDNEVODQotI2VuZGlmIC8qIERBQzQgKi8NCi0jaWYgZGVmaW5lZChBRVMpDQotI2RlZmluZSBMTF9BSEIyX0dSUDFfUEVSSVBIX0FFUyBSQ0NfQUhCMkVOUl9BRVNFTg0KLSNlbmRpZiAvKiBBRVMgKi8NCi0jZGVmaW5lIExMX0FIQjJfR1JQMV9QRVJJUEhfUk5HIFJDQ19BSEIyRU5SX1JOR0VODQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEJVU19MTF9FQ19BSEIzX0dSUDFfUEVSSVBIICBBSEIzIEdSUDEgUEVSSVBIDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX0FIQjNfR1JQMV9QRVJJUEhfQUxMIDB4RkZGRkZGRkZVDQotI2lmIGRlZmluZWQoRk1DX0JhbmsxX1IpDQotI2RlZmluZSBMTF9BSEIzX0dSUDFfUEVSSVBIX0ZNQyBSQ0NfQUhCM0VOUl9GTUNFTg0KLSNlbmRpZiAvKiBGTUNfQmFuazFfUiAqLw0KLSNpZiBkZWZpbmVkKFFVQURTUEkpDQotI2RlZmluZSBMTF9BSEIzX0dSUDFfUEVSSVBIX1FTUEkgUkNDX0FIQjNFTlJfUVNQSUVODQotI2VuZGlmIC8qIFFVQURTUEkgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQlVTX0xMX0VDX0FQQjFfR1JQMV9QRVJJUEggIEFQQjEgR1JQMSBQRVJJUEgNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfQVBCMV9HUlAxX1BFUklQSF9BTEwgMHhGRkZGRkZGRlUNCi0jZGVmaW5lIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNMiBSQ0NfQVBCMUVOUjFfVElNMkVODQotI2RlZmluZSBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTMgUkNDX0FQQjFFTlIxX1RJTTNFTg0KLSNkZWZpbmUgTExfQVBCMV9HUlAxX1BFUklQSF9USU00IFJDQ19BUEIxRU5SMV9USU00RU4NCi0jaWYgZGVmaW5lZChUSU01KQ0KLSNkZWZpbmUgTExfQVBCMV9HUlAxX1BFUklQSF9USU01IFJDQ19BUEIxRU5SMV9USU01RU4NCi0jZW5kaWYgLyogVElNNSAqLw0KLSNkZWZpbmUgTExfQVBCMV9HUlAxX1BFUklQSF9USU02IFJDQ19BUEIxRU5SMV9USU02RU4NCi0jZGVmaW5lIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNNyBSQ0NfQVBCMUVOUjFfVElNN0VODQotI2RlZmluZSBMTF9BUEIxX0dSUDFfUEVSSVBIX0NSUyBSQ0NfQVBCMUVOUjFfQ1JTRU4NCi0jZGVmaW5lIExMX0FQQjFfR1JQMV9QRVJJUEhfUlRDQVBCIFJDQ19BUEIxRU5SMV9SVENBUEJFTg0KLSNkZWZpbmUgTExfQVBCMV9HUlAxX1BFUklQSF9XV0RHIFJDQ19BUEIxRU5SMV9XV0RHRU4NCi0jZGVmaW5lIExMX0FQQjFfR1JQMV9QRVJJUEhfU1BJMiBSQ0NfQVBCMUVOUjFfU1BJMkVODQotI2RlZmluZSBMTF9BUEIxX0dSUDFfUEVSSVBIX1NQSTMgUkNDX0FQQjFFTlIxX1NQSTNFTg0KLSNkZWZpbmUgTExfQVBCMV9HUlAxX1BFUklQSF9VU0FSVDIgUkNDX0FQQjFFTlIxX1VTQVJUMkVODQotI2RlZmluZSBMTF9BUEIxX0dSUDFfUEVSSVBIX1VTQVJUMyBSQ0NfQVBCMUVOUjFfVVNBUlQzRU4NCi0jaWYgZGVmaW5lZChVQVJUNCkNCi0jZGVmaW5lIExMX0FQQjFfR1JQMV9QRVJJUEhfVUFSVDQgUkNDX0FQQjFFTlIxX1VBUlQ0RU4NCi0jZW5kaWYgLyogVUFSVDQgKi8NCi0jaWYgZGVmaW5lZChVQVJUNSkNCi0jZGVmaW5lIExMX0FQQjFfR1JQMV9QRVJJUEhfVUFSVDUgUkNDX0FQQjFFTlIxX1VBUlQ1RU4NCi0jZW5kaWYgLyogVUFSVDUgKi8NCi0jZGVmaW5lIExMX0FQQjFfR1JQMV9QRVJJUEhfSTJDMSBSQ0NfQVBCMUVOUjFfSTJDMUVODQotI2RlZmluZSBMTF9BUEIxX0dSUDFfUEVSSVBIX0kyQzIgUkNDX0FQQjFFTlIxX0kyQzJFTg0KLSNkZWZpbmUgTExfQVBCMV9HUlAxX1BFUklQSF9VU0IgUkNDX0FQQjFFTlIxX1VTQkVODQotI2lmIGRlZmluZWQoRkRDQU4xKQ0KLSNkZWZpbmUgTExfQVBCMV9HUlAxX1BFUklQSF9GRENBTiBSQ0NfQVBCMUVOUjFfRkRDQU5FTg0KLSNlbmRpZiAvKiBGRENBTjEgKi8NCi0jZGVmaW5lIExMX0FQQjFfR1JQMV9QRVJJUEhfUFdSIFJDQ19BUEIxRU5SMV9QV1JFTg0KLSNkZWZpbmUgTExfQVBCMV9HUlAxX1BFUklQSF9JMkMzIFJDQ19BUEIxRU5SMV9JMkMzRU4NCi0jZGVmaW5lIExMX0FQQjFfR1JQMV9QRVJJUEhfTFBUSU0xIFJDQ19BUEIxRU5SMV9MUFRJTTFFTg0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBCVVNfTExfRUNfQVBCMV9HUlAyX1BFUklQSCAgQVBCMSBHUlAyIFBFUklQSA0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9BUEIxX0dSUDJfUEVSSVBIX0FMTCAweEZGRkZGRkZGVQ0KLSNkZWZpbmUgTExfQVBCMV9HUlAyX1BFUklQSF9MUFVBUlQxIFJDQ19BUEIxRU5SMl9MUFVBUlQxRU4NCi0jaWYgZGVmaW5lZChJMkM0KQ0KLSNkZWZpbmUgTExfQVBCMV9HUlAyX1BFUklQSF9JMkM0IFJDQ19BUEIxRU5SMl9JMkM0RU4NCi0jZW5kaWYgLyogSTJDNCAqLw0KLSNkZWZpbmUgTExfQVBCMV9HUlAyX1BFUklQSF9VQ1BEMSBSQ0NfQVBCMUVOUjJfVUNQRDFFTg0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBCVVNfTExfRUNfQVBCMl9HUlAxX1BFUklQSCAgQVBCMiBHUlAxIFBFUklQSA0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9BUEIyX0dSUDFfUEVSSVBIX0FMTCAweEZGRkZGRkZGVQ0KLSNkZWZpbmUgTExfQVBCMl9HUlAxX1BFUklQSF9TWVNDRkcgUkNDX0FQQjJFTlJfU1lTQ0ZHRU4NCi0jZGVmaW5lIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMSBSQ0NfQVBCMkVOUl9USU0xRU4NCi0jZGVmaW5lIExMX0FQQjJfR1JQMV9QRVJJUEhfU1BJMSBSQ0NfQVBCMkVOUl9TUEkxRU4NCi0jZGVmaW5lIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNOCBSQ0NfQVBCMkVOUl9USU04RU4NCi0jZGVmaW5lIExMX0FQQjJfR1JQMV9QRVJJUEhfVVNBUlQxIFJDQ19BUEIyRU5SX1VTQVJUMUVODQotI2lmIGRlZmluZWQoU1BJNCkNCi0jZGVmaW5lIExMX0FQQjJfR1JQMV9QRVJJUEhfU1BJNCBSQ0NfQVBCMkVOUl9TUEk0RU4NCi0jZW5kaWYgLyogU1BJNCAqLw0KLSNkZWZpbmUgTExfQVBCMl9HUlAxX1BFUklQSF9USU0xNSBSQ0NfQVBCMkVOUl9USU0xNUVODQotI2RlZmluZSBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE2IFJDQ19BUEIyRU5SX1RJTTE2RU4NCi0jZGVmaW5lIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMTcgUkNDX0FQQjJFTlJfVElNMTdFTg0KLSNpZiBkZWZpbmVkKFRJTTIwKQ0KLSNkZWZpbmUgTExfQVBCMl9HUlAxX1BFUklQSF9USU0yMCBSQ0NfQVBCMkVOUl9USU0yMEVODQotI2VuZGlmIC8qIFRJTTIwICovDQotI2RlZmluZSBMTF9BUEIyX0dSUDFfUEVSSVBIX1NBSTEgUkNDX0FQQjJFTlJfU0FJMUVODQotI2lmIGRlZmluZWQoSFJUSU0xKQ0KLSNkZWZpbmUgTExfQVBCMl9HUlAxX1BFUklQSF9IUlRJTTEgUkNDX0FQQjJFTlJfSFJUSU0xRU4NCi0jZW5kaWYgLyogSFJUSU0xICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGRlZmdyb3VwIEJVU19MTF9FeHBvcnRlZF9GdW5jdGlvbnMgQlVTIEV4cG9ydGVkIEZ1bmN0aW9ucw0KLSAqIEB7DQotICovDQotDQotLyoqIEBkZWZncm91cCBCVVNfTExfRUZfQUhCMSBBSEIxDQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSBBSEIxIHBlcmlwaGVyYWxzIGNsb2NrLg0KLSAqIEBybXRvbGwgQUhCMUVOUiAgICAgIERNQTFFTiAgICAgICAgTExfQUhCMV9HUlAxX0VuYWJsZUNsb2NrXG4NCi0gKiAgICAgICAgIEFIQjFFTlIgICAgICBETUEyRU4gICAgICAgIExMX0FIQjFfR1JQMV9FbmFibGVDbG9ja1xuDQotICogICAgICAgICBBSEIxRU5SICAgICAgRE1BTU1VWEVOICAgICBMTF9BSEIxX0dSUDFfRW5hYmxlQ2xvY2tcbg0KLSAqICAgICAgICAgQUhCMUVOUiAgICAgIENPUkRJQ0VOICAgICAgTExfQUhCMV9HUlAxX0VuYWJsZUNsb2NrXG4NCi0gKiAgICAgICAgIEFIQjFFTlIgICAgICBGTUFDRU4gICAgICAgIExMX0FIQjFfR1JQMV9FbmFibGVDbG9ja1xuDQotICogICAgICAgICBBSEIxRU5SICAgICAgRkxBU0hFTiAgICAgICBMTF9BSEIxX0dSUDFfRW5hYmxlQ2xvY2tcbg0KLSAqICAgICAgICAgQUhCMUVOUiAgICAgIENSQ0VOICAgICAgICAgTExfQUhCMV9HUlAxX0VuYWJsZUNsb2NrDQotICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfRE1BMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfRE1BMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfRE1BTVVYMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfQ09SRElDDQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9GTUFDDQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9GTEFTSA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfQ1JDDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQUhCMV9HUlAxX0VuYWJsZUNsb2NrKHVpbnQzMl90IFBlcmlwaHMpIHsNCi0gIF9fSU8gdWludDMyX3QgdG1wcmVnOw0KLSAgU0VUX0JJVChSQ0MtPkFIQjFFTlIsIFBlcmlwaHMpOw0KLSAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8NCi0gIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QUhCMUVOUiwgUGVyaXBocyk7DQotICAodm9pZCl0bXByZWc7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgQUhCMSBwZXJpcGhlcmFsIGNsb2NrIGlzIGVuYWJsZWQgb3Igbm90DQotICogQHJtdG9sbCBBSEIxRU5SICAgICAgRE1BMUVOICAgICAgICBMTF9BSEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbg0KLSAqICAgICAgICAgQUhCMUVOUiAgICAgIERNQTJFTiAgICAgICAgTExfQUhCMV9HUlAxX0lzRW5hYmxlZENsb2NrXG4NCi0gKiAgICAgICAgIEFIQjFFTlIgICAgICBETUFNVVhFTiAgICAgIExMX0FIQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuDQotICogICAgICAgICBBSEIxRU5SICAgICAgQ09SRElDRU4gICAgICBMTF9BSEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbg0KLSAqICAgICAgICAgQUhCMUVOUiAgICAgIEZNQUNFTiAgICAgICAgTExfQUhCMV9HUlAxX0lzRW5hYmxlZENsb2NrXG4NCi0gKiAgICAgICAgIEFIQjFFTlIgICAgICBGTEFTSEVOICAgICAgIExMX0FIQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuDQotICogICAgICAgICBBSEIxRU5SICAgICAgQ1JDRU4gICAgICAgICBMTF9BSEIxX0dSUDFfSXNFbmFibGVkQ2xvY2sNCi0gKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9ETUExDQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9ETUEyDQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9ETUFNVVgxDQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9DT1JESUMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0ZNQUMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0ZMQVNIDQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9DUkMNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIFBlcmlwaHMgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FIQjFfR1JQMV9Jc0VuYWJsZWRDbG9jayh1aW50MzJfdCBQZXJpcGhzKSB7DQotICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkFIQjFFTlIsIFBlcmlwaHMpID09IFBlcmlwaHMpID8gMVVMIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIEFIQjEgcGVyaXBoZXJhbHMgY2xvY2suDQotICogQHJtdG9sbCBBSEIxRU5SICAgICAgRE1BMUVOICAgICAgICBMTF9BSEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4NCi0gKiAgICAgICAgIEFIQjFFTlIgICAgICBETUEyRU4gICAgICAgIExMX0FIQjFfR1JQMV9EaXNhYmxlQ2xvY2tcbg0KLSAqICAgICAgICAgQUhCMUVOUiAgICAgIERNQU1VWEVOICAgICAgTExfQUhCMV9HUlAxX0Rpc2FibGVDbG9ja1xuDQotICogICAgICAgICBBSEIxRU5SICAgICAgQ09SRElDRU4gICAgICBMTF9BSEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4NCi0gKiAgICAgICAgIEFIQjFFTlIgICAgICBGTUFDRU4gICAgICAgIExMX0FIQjFfR1JQMV9EaXNhYmxlQ2xvY2tcbg0KLSAqICAgICAgICAgQUhCMUVOUiAgICAgIEZMQVNIRU4gICAgICAgTExfQUhCMV9HUlAxX0Rpc2FibGVDbG9ja1xuDQotICogICAgICAgICBBSEIxRU5SICAgICAgQ1JDRU4gICAgICAgICBMTF9BSEIxX0dSUDFfRGlzYWJsZUNsb2NrDQotICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfRE1BMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfRE1BMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfRE1BTVVYMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfQ09SRElDDQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9GTUFDDQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9GTEFTSA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfQ1JDDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQUhCMV9HUlAxX0Rpc2FibGVDbG9jayh1aW50MzJfdCBQZXJpcGhzKSB7DQotICBDTEVBUl9CSVQoUkNDLT5BSEIxRU5SLCBQZXJpcGhzKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBGb3JjZSBBSEIxIHBlcmlwaGVyYWxzIHJlc2V0Lg0KLSAqIEBybXRvbGwgQUhCMVJTVFIgICAgIERNQTFSU1QgICAgICAgTExfQUhCMV9HUlAxX0ZvcmNlUmVzZXRcbg0KLSAqICAgICAgICAgQUhCMVJTVFIgICAgIERNQTJSU1QgICAgICAgTExfQUhCMV9HUlAxX0ZvcmNlUmVzZXRcbg0KLSAqICAgICAgICAgQUhCMVJTVFIgICAgIERNQU1VWFJTVCAgICAgTExfQUhCMV9HUlAxX0ZvcmNlUmVzZXRcbg0KLSAqICAgICAgICAgQUhCMVJTVFIgICAgIENPUkRJQ1JTVCAgICAgTExfQUhCMV9HUlAxX0ZvcmNlUmVzZXRcbg0KLSAqICAgICAgICAgQUhCMVJTVFIgICAgIEZNQUNSU1QgICAgICAgTExfQUhCMV9HUlAxX0ZvcmNlUmVzZXRcbg0KLSAqICAgICAgICAgQUhCMVJTVFIgICAgIEZMQVNIUlNUICAgICAgTExfQUhCMV9HUlAxX0ZvcmNlUmVzZXRcbg0KLSAqICAgICAgICAgQUhCMVJTVFIgICAgIENSQ1JTVCAgICAgICAgTExfQUhCMV9HUlAxX0ZvcmNlUmVzZXQNCi0gKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9BTEwNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0RNQTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0RNQTINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0RNQU1VWDENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0NPUkRJQw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfRk1BQw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfRkxBU0gNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0NSQw0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0FIQjFfR1JQMV9Gb3JjZVJlc2V0KHVpbnQzMl90IFBlcmlwaHMpIHsNCi0gIFNFVF9CSVQoUkNDLT5BSEIxUlNUUiwgUGVyaXBocyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmVsZWFzZSBBSEIxIHBlcmlwaGVyYWxzIHJlc2V0Lg0KLSAqIEBybXRvbGwgQUhCMVJTVFIgICAgIERNQTFSU1QgICAgICAgTExfQUhCMV9HUlAxX1JlbGVhc2VSZXNldFxuDQotICogICAgICAgICBBSEIxUlNUUiAgICAgRE1BMlJTVCAgICAgICBMTF9BSEIxX0dSUDFfUmVsZWFzZVJlc2V0XG4NCi0gKiAgICAgICAgIEFIQjFSU1RSICAgICBETUFNVVhSU1QgICAgIExMX0FIQjFfR1JQMV9SZWxlYXNlUmVzZXRcbg0KLSAqICAgICAgICAgQUhCMVJTVFIgICAgIENPUkRJQ1JTVCAgICAgTExfQUhCMV9HUlAxX1JlbGVhc2VSZXNldFxuDQotICogICAgICAgICBBSEIxUlNUUiAgICAgRk1BQ1JTVCAgICAgICBMTF9BSEIxX0dSUDFfUmVsZWFzZVJlc2V0XG4NCi0gKiAgICAgICAgIEFIQjFSU1RSICAgICBGTEFTSFJTVCAgICAgIExMX0FIQjFfR1JQMV9SZWxlYXNlUmVzZXRcbg0KLSAqICAgICAgICAgQUhCMVJTVFIgICAgIENSQ1JTVCAgICAgICAgTExfQUhCMV9HUlAxX1JlbGVhc2VSZXNldA0KLSAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0FMTA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfRE1BMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfRE1BMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfRE1BTVVYMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfQ09SRElDDQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9GTUFDDQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9GTEFTSA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfQ1JDDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQUhCMV9HUlAxX1JlbGVhc2VSZXNldCh1aW50MzJfdCBQZXJpcGhzKSB7DQotICBDTEVBUl9CSVQoUkNDLT5BSEIxUlNUUiwgUGVyaXBocyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIEFIQjEgcGVyaXBoZXJhbCBjbG9ja3MgaW4gU2xlZXAgYW5kIFN0b3AgbW9kZXMNCi0gKiBAcm10b2xsIEFIQjFTTUVOUiAgICBETUExU01FTiAgICAgIExMX0FIQjFfR1JQMV9FbmFibGVDbG9ja1N0b3BTbGVlcFxuDQotICogICAgICAgICBBSEIxU01FTlIgICAgRE1BMlNNRU4gICAgICBMTF9BSEIxX0dSUDFfRW5hYmxlQ2xvY2tTdG9wU2xlZXBcbg0KLSAqICAgICAgICAgQUhCMVNNRU5SICAgIERNQU1VWFNNRU4gICAgTExfQUhCMV9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4NCi0gKiAgICAgICAgIEFIQjFTTUVOUiAgICBDT1JESUNTTUVOICAgIExMX0FIQjFfR1JQMV9FbmFibGVDbG9ja1N0b3BTbGVlcFxuDQotICogICAgICAgICBBSEIxU01FTlIgICAgRk1BQ1NNRU4gICAgICBMTF9BSEIxX0dSUDFfRW5hYmxlQ2xvY2tTdG9wU2xlZXBcbg0KLSAqICAgICAgICAgQUhCMVNNRU5SICAgIEZMQVNIU01FTiAgICAgTExfQUhCMV9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4NCi0gKiAgICAgICAgIEFIQjFTTUVOUiAgICBTUkFNMVNNRU4gICAgIExMX0FIQjFfR1JQMV9EaXNhYmxlQ2xvY2tTdG9wU2xlZXBcbg0KLSAqICAgICAgICAgQUhCMVNNRU5SICAgIENSQ1NNRU4gICAgICAgTExfQUhCMV9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwDQotICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfRE1BMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfRE1BMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfRE1BTVVYMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfQ09SRElDDQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9GTUFDDQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9GTEFTSA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfU1JBTTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0NSQw0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0FIQjFfR1JQMV9FbmFibGVDbG9ja1N0b3BTbGVlcCh1aW50MzJfdCBQZXJpcGhzKSB7DQotICBfX0lPIHVpbnQzMl90IHRtcHJlZzsNCi0gIFNFVF9CSVQoUkNDLT5BSEIxU01FTlIsIFBlcmlwaHMpOw0KLSAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8NCi0gIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QUhCMVNNRU5SLCBQZXJpcGhzKTsNCi0gICh2b2lkKXRtcHJlZzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIEFIQjEgcGVyaXBoZXJhbCBjbG9ja3MgaW4gU2xlZXAgYW5kIFN0b3AgbW9kZXMNCi0gKiBAcm10b2xsIEFIQjFTTUVOUiAgICBETUExU01FTiAgICAgIExMX0FIQjFfR1JQMV9EaXNhYmxlQ2xvY2tTdG9wU2xlZXBcbg0KLSAqICAgICAgICAgQUhCMVNNRU5SICAgIERNQTJTTUVOICAgICAgTExfQUhCMV9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuDQotICogICAgICAgICBBSEIxU01FTlIgICAgRE1BTVVYU01FTiAgICBMTF9BSEIxX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwXG4NCi0gKiAgICAgICAgIEFIQjFTTUVOUiAgICBDT1JESUNTTUVOICAgIExMX0FIQjFfR1JQMV9EaXNhYmxlQ2xvY2tTdG9wU2xlZXBcbg0KLSAqICAgICAgICAgQUhCMVNNRU5SICAgIEZNQUNTTUVOICAgICAgTExfQUhCMV9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuDQotICogICAgICAgICBBSEIxU01FTlIgICAgRkxBU0hTTUVOICAgICBMTF9BSEIxX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwXG4NCi0gKiAgICAgICAgIEFIQjFTTUVOUiAgICBTUkFNMVNNRU4gICAgIExMX0FIQjFfR1JQMV9EaXNhYmxlQ2xvY2tTdG9wU2xlZXBcbg0KLSAqICAgICAgICAgQUhCMVNNRU5SICAgIENSQ1NNRU4gICAgICAgTExfQUhCMV9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcA0KLSAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0RNQTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0RNQTINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0RNQU1VWDENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0NPUkRJQw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfRk1BQw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfRkxBU0gNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX1NSQU0xDQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9DUkMNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BSEIxX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwKHVpbnQzMl90IFBlcmlwaHMpIHsNCi0gIENMRUFSX0JJVChSQ0MtPkFIQjFTTUVOUiwgUGVyaXBocyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBCVVNfTExfRUZfQUhCMiBBSEIyDQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSBBSEIyIHBlcmlwaGVyYWxzIGNsb2NrLg0KLSAqIEBybXRvbGwgQUhCMkVOUiAgICAgIEdQSU9BRU4gICAgICAgTExfQUhCMl9HUlAxX0VuYWJsZUNsb2NrXG4NCi0gKiAgICAgICAgIEFIQjJFTlIgICAgICBHUElPQkVOICAgICAgIExMX0FIQjJfR1JQMV9FbmFibGVDbG9ja1xuDQotICogICAgICAgICBBSEIyRU5SICAgICAgR1BJT0NFTiAgICAgICBMTF9BSEIyX0dSUDFfRW5hYmxlQ2xvY2tcbg0KLSAqICAgICAgICAgQUhCMkVOUiAgICAgIEdQSU9ERU4gICAgICAgTExfQUhCMl9HUlAxX0VuYWJsZUNsb2NrXG4NCi0gKiAgICAgICAgIEFIQjJFTlIgICAgICBHUElPRUVOICAgICAgIExMX0FIQjJfR1JQMV9FbmFibGVDbG9ja1xuDQotICogICAgICAgICBBSEIyRU5SICAgICAgR1BJT0ZFTiAgICAgICBMTF9BSEIyX0dSUDFfRW5hYmxlQ2xvY2tcbg0KLSAqICAgICAgICAgQUhCMkVOUiAgICAgIEdQSU9HRU4gICAgICAgTExfQUhCMl9HUlAxX0VuYWJsZUNsb2NrXG4NCi0gKiAgICAgICAgIEFIQjJFTlIgICAgICBBREMxMkVOICAgICAgIExMX0FIQjJfR1JQMV9FbmFibGVDbG9ja1xuDQotICogICAgICAgICBBSEIyRU5SICAgICAgQURDMzQ1RU4gICAgICBMTF9BSEIyX0dSUDFfRW5hYmxlQ2xvY2tcbg0KLSAqICAgICAgICAgQUhCMkVOUiAgICAgIERBQzFFTiAgICAgICAgTExfQUhCMl9HUlAxX0VuYWJsZUNsb2NrXG4NCi0gKiAgICAgICAgIEFIQjJFTlIgICAgICBEQUMyRU4gICAgICAgIExMX0FIQjJfR1JQMV9FbmFibGVDbG9ja1xuDQotICogICAgICAgICBBSEIyRU5SICAgICAgREFDM0VOICAgICAgICBMTF9BSEIyX0dSUDFfRW5hYmxlQ2xvY2tcbg0KLSAqICAgICAgICAgQUhCMkVOUiAgICAgIERBQzRFTiAgICAgICAgTExfQUhCMl9HUlAxX0VuYWJsZUNsb2NrXG4NCi0gKiAgICAgICAgIEFIQjJFTlIgICAgICBBRVNFTiAgICAgICAgIExMX0FIQjJfR1JQMV9FbmFibGVDbG9ja1xuDQotICogICAgICAgICBBSEIyRU5SICAgICAgUk5HRU4gICAgICAgICBMTF9BSEIyX0dSUDFfRW5hYmxlQ2xvY2sNCi0gKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9HUElPQQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0INCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9DDQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9HUElPRA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0UNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9GDQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9HUElPRw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfQURDMTINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0FEQzM0NSAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0RBQzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0RBQzIgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9EQUMzDQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9EQUM0ICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfQUVTICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfUk5HDQotICoNCi0gKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BSEIyX0dSUDFfRW5hYmxlQ2xvY2sodWludDMyX3QgUGVyaXBocykgew0KLSAgX19JTyB1aW50MzJfdCB0bXByZWc7DQotICBTRVRfQklUKFJDQy0+QUhCMkVOUiwgUGVyaXBocyk7DQotICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLw0KLSAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BSEIyRU5SLCBQZXJpcGhzKTsNCi0gICh2b2lkKXRtcHJlZzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiBBSEIyIHBlcmlwaGVyYWwgY2xvY2sgaXMgZW5hYmxlZCBvciBub3QNCi0gKiBAcm10b2xsIEFIQjJFTlIgICAgICBHUElPQUVOICAgICAgIExMX0FIQjJfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuDQotICogICAgICAgICBBSEIyRU5SICAgICAgR1BJT0JFTiAgICAgICBMTF9BSEIyX0dSUDFfSXNFbmFibGVkQ2xvY2tcbg0KLSAqICAgICAgICAgQUhCMkVOUiAgICAgIEdQSU9DRU4gICAgICAgTExfQUhCMl9HUlAxX0lzRW5hYmxlZENsb2NrXG4NCi0gKiAgICAgICAgIEFIQjJFTlIgICAgICBHUElPREVOICAgICAgIExMX0FIQjJfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuDQotICogICAgICAgICBBSEIyRU5SICAgICAgR1BJT0VFTiAgICAgICBMTF9BSEIyX0dSUDFfSXNFbmFibGVkQ2xvY2tcbg0KLSAqICAgICAgICAgQUhCMkVOUiAgICAgIEdQSU9GRU4gICAgICAgTExfQUhCMl9HUlAxX0lzRW5hYmxlZENsb2NrXG4NCi0gKiAgICAgICAgIEFIQjJFTlIgICAgICBHUElPR0VOICAgICAgIExMX0FIQjJfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuDQotICogICAgICAgICBBSEIyRU5SICAgICAgQURDMTJFTiAgICAgICBMTF9BSEIyX0dSUDFfSXNFbmFibGVkQ2xvY2tcbg0KLSAqICAgICAgICAgQUhCMkVOUiAgICAgIEFEQzM0NUVOICAgICAgTExfQUhCMl9HUlAxX0lzRW5hYmxlZENsb2NrXG4NCi0gKiAgICAgICAgIEFIQjJFTlIgICAgICBEQUMxRU4gICAgICAgIExMX0FIQjJfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuDQotICogICAgICAgICBBSEIyRU5SICAgICAgREFDMkVOICAgICAgICBMTF9BSEIyX0dSUDFfSXNFbmFibGVkQ2xvY2tcbg0KLSAqICAgICAgICAgQUhCMkVOUiAgICAgIERBQzNFTiAgICAgICAgTExfQUhCMl9HUlAxX0lzRW5hYmxlZENsb2NrXG4NCi0gKiAgICAgICAgIEFIQjJFTlIgICAgICBEQUM0RU4gICAgICAgIExMX0FIQjJfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuDQotICogICAgICAgICBBSEIyRU5SICAgICAgQUVTRU4gICAgICAgICBMTF9BSEIyX0dSUDFfSXNFbmFibGVkQ2xvY2tcbg0KLSAqICAgICAgICAgQUhCMkVOUiAgICAgIFJOR0VOICAgICAgICAgTExfQUhCMl9HUlAxX0lzRW5hYmxlZENsb2NrDQotICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0ENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9CDQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9HUElPQw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0QNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9FDQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9HUElPRg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0cNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0FEQzEyDQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9BREMzNDUgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9EQUMxDQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9EQUMyICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfREFDMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfREFDNCAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0FFUyAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX1JORw0KLSAqDQotICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuDQotICogQHJldHZhbCBTdGF0ZSBvZiBQZXJpcGhzICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BSEIyX0dSUDFfSXNFbmFibGVkQ2xvY2sodWludDMyX3QgUGVyaXBocykgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5BSEIyRU5SLCBQZXJpcGhzKSA9PSBQZXJpcGhzKSA/IDFVTCA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBBSEIyIHBlcmlwaGVyYWxzIGNsb2NrLg0KLSAqIEBybXRvbGwgQUhCMkVOUiAgICAgIEdQSU9BRU4gICAgICAgTExfQUhCMl9HUlAxX0Rpc2FibGVDbG9ja1xuDQotICogICAgICAgICBBSEIyRU5SICAgICAgR1BJT0JFTiAgICAgICBMTF9BSEIyX0dSUDFfRGlzYWJsZUNsb2NrXG4NCi0gKiAgICAgICAgIEFIQjJFTlIgICAgICBHUElPQ0VOICAgICAgIExMX0FIQjJfR1JQMV9EaXNhYmxlQ2xvY2tcbg0KLSAqICAgICAgICAgQUhCMkVOUiAgICAgIEdQSU9ERU4gICAgICAgTExfQUhCMl9HUlAxX0Rpc2FibGVDbG9ja1xuDQotICogICAgICAgICBBSEIyRU5SICAgICAgR1BJT0VFTiAgICAgICBMTF9BSEIyX0dSUDFfRGlzYWJsZUNsb2NrXG4NCi0gKiAgICAgICAgIEFIQjJFTlIgICAgICBHUElPRkVOICAgICAgIExMX0FIQjJfR1JQMV9EaXNhYmxlQ2xvY2tcbg0KLSAqICAgICAgICAgQUhCMkVOUiAgICAgIEdQSU9HRU4gICAgICAgTExfQUhCMl9HUlAxX0Rpc2FibGVDbG9ja1xuDQotICogICAgICAgICBBSEIyRU5SICAgICAgQURDMTJFTiAgICAgICBMTF9BSEIyX0dSUDFfRGlzYWJsZUNsb2NrXG4NCi0gKiAgICAgICAgIEFIQjJFTlIgICAgICBBREMzNDVFTiAgICAgIExMX0FIQjJfR1JQMV9EaXNhYmxlQ2xvY2tcbg0KLSAqICAgICAgICAgQUhCMkVOUiAgICAgIERBQzFFTiAgICAgICAgTExfQUhCMl9HUlAxX0Rpc2FibGVDbG9ja1xuDQotICogICAgICAgICBBSEIyRU5SICAgICAgREFDMkVOICAgICAgICBMTF9BSEIyX0dSUDFfRGlzYWJsZUNsb2NrXG4NCi0gKiAgICAgICAgIEFIQjJFTlIgICAgICBEQUMzRU4gICAgICAgIExMX0FIQjJfR1JQMV9EaXNhYmxlQ2xvY2tcbg0KLSAqICAgICAgICAgQUhCMkVOUiAgICAgIERBQzRFTiAgICAgICAgTExfQUhCMl9HUlAxX0Rpc2FibGVDbG9ja1xuDQotICogICAgICAgICBBSEIyRU5SICAgICAgQUVTRU4gICAgICAgICBMTF9BSEIyX0dSUDFfRGlzYWJsZUNsb2NrXG4NCi0gKiAgICAgICAgIEFIQjJFTlIgICAgICBSTkdFTiAgICAgICAgIExMX0FIQjJfR1JQMV9EaXNhYmxlQ2xvY2sNCi0gKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9HUElPQQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0INCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9DDQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9HUElPRA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0UNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9GDQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9HUElPRw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfQURDMTINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0FEQzM0NSAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0RBQzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0RBQzIgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9EQUMzDQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9EQUM0ICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfQUVTICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfUk5HDQotICoNCi0gKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BSEIyX0dSUDFfRGlzYWJsZUNsb2NrKHVpbnQzMl90IFBlcmlwaHMpIHsNCi0gIENMRUFSX0JJVChSQ0MtPkFIQjJFTlIsIFBlcmlwaHMpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEZvcmNlIEFIQjIgcGVyaXBoZXJhbHMgcmVzZXQuDQotICogQHJtdG9sbCBBSEIyUlNUUiAgICAgIEdQSU9BUlNUICAgICAgIExMX0FIQjJfR1JQMV9Gb3JjZVJlc2V0XG4NCi0gKiAgICAgICAgIEFIQjJSU1RSICAgICAgR1BJT0JSU1QgICAgICAgTExfQUhCMl9HUlAxX0ZvcmNlUmVzZXRcbg0KLSAqICAgICAgICAgQUhCMlJTVFIgICAgICBHUElPQ1JTVCAgICAgICBMTF9BSEIyX0dSUDFfRm9yY2VSZXNldFxuDQotICogICAgICAgICBBSEIyUlNUUiAgICAgIEdQSU9EUlNUICAgICAgIExMX0FIQjJfR1JQMV9Gb3JjZVJlc2V0XG4NCi0gKiAgICAgICAgIEFIQjJSU1RSICAgICAgR1BJT0VSU1QgICAgICAgTExfQUhCMl9HUlAxX0ZvcmNlUmVzZXRcbg0KLSAqICAgICAgICAgQUhCMlJTVFIgICAgICBHUElPRlJTVCAgICAgICBMTF9BSEIyX0dSUDFfRm9yY2VSZXNldFxuDQotICogICAgICAgICBBSEIyUlNUUiAgICAgIEdQSU9HUlNUICAgICAgIExMX0FIQjJfR1JQMV9Gb3JjZVJlc2V0XG4NCi0gKiAgICAgICAgIEFIQjJSU1RSICAgICAgQURDMTJSU1QgICAgICAgTExfQUhCMl9HUlAxX0ZvcmNlUmVzZXRcbg0KLSAqICAgICAgICAgQUhCMlJTVFIgICAgICBBREMzNDVSU1QgICAgICBMTF9BSEIyX0dSUDFfRm9yY2VSZXNldFxuDQotICogICAgICAgICBBSEIyUlNUUiAgICAgIERBQzFSU1QgICAgICAgIExMX0FIQjJfR1JQMV9Gb3JjZVJlc2V0XG4NCi0gKiAgICAgICAgIEFIQjJSU1RSICAgICAgREFDMlJTVCAgICAgICAgTExfQUhCMl9HUlAxX0ZvcmNlUmVzZXRcbg0KLSAqICAgICAgICAgQUhCMlJTVFIgICAgICBEQUMzUlNUICAgICAgICBMTF9BSEIyX0dSUDFfRm9yY2VSZXNldFxuDQotICogICAgICAgICBBSEIyUlNUUiAgICAgIERBQzRSU1QgICAgICAgIExMX0FIQjJfR1JQMV9Gb3JjZVJlc2V0XG4NCi0gKiAgICAgICAgIEFIQjJSU1RSICAgICAgQUVTUlNUICAgICAgICAgTExfQUhCMl9HUlAxX0ZvcmNlUmVzZXRcbg0KLSAqICAgICAgICAgQUhCMlJTVFIgICAgICBSTkdSU1QgICAgICAgICBMTF9BSEIyX0dSUDFfRm9yY2VSZXNldA0KLSAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9BDQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9HUElPQg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0MNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9EDQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9HUElPRQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0YNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9HDQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9BREMxMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfQURDMzQ1ICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfREFDMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfREFDMiAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0RBQzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0RBQzQgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9BRVMgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9STkcNCi0gKg0KLSAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0FIQjJfR1JQMV9Gb3JjZVJlc2V0KHVpbnQzMl90IFBlcmlwaHMpIHsNCi0gIFNFVF9CSVQoUkNDLT5BSEIyUlNUUiwgUGVyaXBocyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmVsZWFzZSBBSEIyIHBlcmlwaGVyYWxzIHJlc2V0Lg0KLSAqIEBybXRvbGwgQUhCMlJTVFIgICAgICBHUElPQVJTVCAgICAgICBMTF9BSEIyX0dSUDFfUmVsZWFzZVJlc2V0XG4NCi0gKiAgICAgICAgIEFIQjJSU1RSICAgICAgR1BJT0JSU1QgICAgICAgTExfQUhCMl9HUlAxX1JlbGVhc2VSZXNldFxuDQotICogICAgICAgICBBSEIyUlNUUiAgICAgIEdQSU9DUlNUICAgICAgIExMX0FIQjJfR1JQMV9SZWxlYXNlUmVzZXRcbg0KLSAqICAgICAgICAgQUhCMlJTVFIgICAgICBHUElPRFJTVCAgICAgICBMTF9BSEIyX0dSUDFfUmVsZWFzZVJlc2V0XG4NCi0gKiAgICAgICAgIEFIQjJSU1RSICAgICAgR1BJT0VSU1QgICAgICAgTExfQUhCMl9HUlAxX1JlbGVhc2VSZXNldFxuDQotICogICAgICAgICBBSEIyUlNUUiAgICAgIEdQSU9GUlNUICAgICAgIExMX0FIQjJfR1JQMV9SZWxlYXNlUmVzZXRcbg0KLSAqICAgICAgICAgQUhCMlJTVFIgICAgICBHUElPR1JTVCAgICAgICBMTF9BSEIyX0dSUDFfUmVsZWFzZVJlc2V0XG4NCi0gKiAgICAgICAgIEFIQjJSU1RSICAgICAgQURDMTJSU1QgICAgICAgTExfQUhCMl9HUlAxX1JlbGVhc2VSZXNldFxuDQotICogICAgICAgICBBSEIyUlNUUiAgICAgIEFEQzM0NVJTVCAgICAgIExMX0FIQjJfR1JQMV9SZWxlYXNlUmVzZXRcbg0KLSAqICAgICAgICAgQUhCMlJTVFIgICAgICBEQUMxUlNUICAgICAgICBMTF9BSEIyX0dSUDFfUmVsZWFzZVJlc2V0XG4NCi0gKiAgICAgICAgIEFIQjJSU1RSICAgICAgREFDMlJTVCAgICAgICAgTExfQUhCMl9HUlAxX1JlbGVhc2VSZXNldFxuDQotICogICAgICAgICBBSEIyUlNUUiAgICAgIERBQzNSU1QgICAgICAgIExMX0FIQjJfR1JQMV9SZWxlYXNlUmVzZXRcbg0KLSAqICAgICAgICAgQUhCMlJTVFIgICAgICBEQUM0UlNUICAgICAgICBMTF9BSEIyX0dSUDFfUmVsZWFzZVJlc2V0XG4NCi0gKiAgICAgICAgIEFIQjJSU1RSICAgICAgQUVTUlNUICAgICAgICAgTExfQUhCMl9HUlAxX1JlbGVhc2VSZXNldFxuDQotICogICAgICAgICBBSEIyUlNUUiAgICAgIFJOR1JTVCAgICAgICAgIExMX0FIQjJfR1JQMV9SZWxlYXNlUmVzZXQNCi0gKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9HUElPQQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0INCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9DDQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9HUElPRA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0UNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9GDQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9HUElPRw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfQURDMTINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0FEQzM0NSAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0RBQzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0RBQzIgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9EQUMzDQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9EQUM0ICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfQUVTICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfUk5HDQotICoNCi0gKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BSEIyX0dSUDFfUmVsZWFzZVJlc2V0KHVpbnQzMl90IFBlcmlwaHMpIHsNCi0gIENMRUFSX0JJVChSQ0MtPkFIQjJSU1RSLCBQZXJpcGhzKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgQUhCMiBwZXJpcGhlcmFsIGNsb2NrcyBpbiBTbGVlcCBhbmQgU3RvcCBtb2Rlcw0KLSAqIEBybXRvbGwgQUhCMlNNRU5SICAgIEdQSU9BU01FTiAgICAgTExfQUhCMl9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4NCi0gKiAgICAgICAgIEFIQjJTTUVOUiAgICBHUElPQlNNRU4gICAgIExMX0FIQjJfR1JQMV9FbmFibGVDbG9ja1N0b3BTbGVlcFxuDQotICogICAgICAgICBBSEIyU01FTlIgICAgR1BJT0NTTUVOICAgICBMTF9BSEIyX0dSUDFfRW5hYmxlQ2xvY2tTdG9wU2xlZXBcbg0KLSAqICAgICAgICAgQUhCMlNNRU5SICAgIEdQSU9EU01FTiAgICAgTExfQUhCMl9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4NCi0gKiAgICAgICAgIEFIQjJTTUVOUiAgICBHUElPRVNNRU4gICAgIExMX0FIQjJfR1JQMV9FbmFibGVDbG9ja1N0b3BTbGVlcFxuDQotICogICAgICAgICBBSEIyU01FTlIgICAgR1BJT0ZTTUVOICAgICBMTF9BSEIyX0dSUDFfRW5hYmxlQ2xvY2tTdG9wU2xlZXBcbg0KLSAqICAgICAgICAgQUhCMlNNRU5SICAgIEdQSU9HU01FTiAgICAgTExfQUhCMl9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4NCi0gKiAgICAgICAgIEFIQjJTTUVOUiAgICBTUkFNMlNNRU4gICAgIExMX0FIQjJfR1JQMV9FbmFibGVDbG9ja1N0b3BTbGVlcFxuDQotICogICAgICAgICBBSEIyU01FTlIgICAgQ0NNU01FTiAgICAgICBMTF9BSEIyX0dSUDFfRW5hYmxlQ2xvY2tTdG9wU2xlZXBcbg0KLSAqICAgICAgICAgQUhCMlNNRU5SICAgIEFEQzEyU01FTiAgICAgTExfQUhCMl9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4NCi0gKiAgICAgICAgIEFIQjJTTUVOUiAgICBBREMzNDVTTUVOICAgIExMX0FIQjJfR1JQMV9FbmFibGVDbG9ja1N0b3BTbGVlcFxuDQotICogICAgICAgICBBSEIyU01FTlIgICAgREFDMVNNRU4gICAgICBMTF9BSEIyX0dSUDFfRW5hYmxlQ2xvY2tTdG9wU2xlZXBcbg0KLSAqICAgICAgICAgQUhCMlNNRU5SICAgIERBQzJTTUVOICAgICAgTExfQUhCMl9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4NCi0gKiAgICAgICAgIEFIQjJTTUVOUiAgICBEQUMzU01FTiAgICAgIExMX0FIQjJfR1JQMV9FbmFibGVDbG9ja1N0b3BTbGVlcFxuDQotICogICAgICAgICBBSEIyU01FTlIgICAgREFDNFNNRU4gICAgICBMTF9BSEIyX0dSUDFfRW5hYmxlQ2xvY2tTdG9wU2xlZXBcbg0KLSAqICAgICAgICAgQUhCMlNNRU5SICAgIEFFU1NNRU4gICAgICAgTExfQUhCMl9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4NCi0gKiAgICAgICAgIEFIQjJTTUVOUiAgICBSTkdTTUVOICAgICAgIExMX0FIQjJfR1JQMV9FbmFibGVDbG9ja1N0b3BTbGVlcA0KLSAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9BDQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9HUElPQg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0MNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9EDQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9HUElPRQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0YNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9HDQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9TUkFNMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfQ0NNDQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9BREMxMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfQURDMzQ1ICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfREFDMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfREFDMiAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0RBQzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0RBQzQgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9BRVMgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9STkcNCi0gKg0KLSAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0FIQjJfR1JQMV9FbmFibGVDbG9ja1N0b3BTbGVlcCh1aW50MzJfdCBQZXJpcGhzKSB7DQotICBfX0lPIHVpbnQzMl90IHRtcHJlZzsNCi0gIFNFVF9CSVQoUkNDLT5BSEIyU01FTlIsIFBlcmlwaHMpOw0KLSAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8NCi0gIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QUhCMlNNRU5SLCBQZXJpcGhzKTsNCi0gICh2b2lkKXRtcHJlZzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIEFIQjIgcGVyaXBoZXJhbCBjbG9ja3MgaW4gU2xlZXAgYW5kIFN0b3AgbW9kZXMNCi0gKiBAcm10b2xsIEFIQjJTTUVOUiAgICBHUElPQVNNRU4gICAgIExMX0FIQjJfR1JQMV9EaXNhYmxlQ2xvY2tTdG9wU2xlZXBcbg0KLSAqICAgICAgICAgQUhCMlNNRU5SICAgIEdQSU9CU01FTiAgICAgTExfQUhCMl9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuDQotICogICAgICAgICBBSEIyU01FTlIgICAgR1BJT0NTTUVOICAgICBMTF9BSEIyX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwXG4NCi0gKiAgICAgICAgIEFIQjJTTUVOUiAgICBHUElPRFNNRU4gICAgIExMX0FIQjJfR1JQMV9EaXNhYmxlQ2xvY2tTdG9wU2xlZXBcbg0KLSAqICAgICAgICAgQUhCMlNNRU5SICAgIEdQSU9FU01FTiAgICAgTExfQUhCMl9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuDQotICogICAgICAgICBBSEIyU01FTlIgICAgR1BJT0ZTTUVOICAgICBMTF9BSEIyX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwXG4NCi0gKiAgICAgICAgIEFIQjJTTUVOUiAgICBHUElPR1NNRU4gICAgIExMX0FIQjJfR1JQMV9EaXNhYmxlQ2xvY2tTdG9wU2xlZXBcbg0KLSAqICAgICAgICAgQUhCMlNNRU5SICAgIFNSQU0yU01FTiAgICAgTExfQUhCMl9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuDQotICogICAgICAgICBBSEIyU01FTlIgICAgQ0NNU01FTiAgICAgICBMTF9BSEIyX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwXG4NCi0gKiAgICAgICAgIEFIQjJTTUVOUiAgICBBREMxMlNNRU4gICAgIExMX0FIQjJfR1JQMV9EaXNhYmxlQ2xvY2tTdG9wU2xlZXBcbg0KLSAqICAgICAgICAgQUhCMlNNRU5SICAgIEFEQzM0NVNNRU4gICAgTExfQUhCMl9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuDQotICogICAgICAgICBBSEIyU01FTlIgICAgREFDMVNNRU4gICAgICBMTF9BSEIyX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwXG4NCi0gKiAgICAgICAgIEFIQjJTTUVOUiAgICBEQUMyU01FTiAgICAgIExMX0FIQjJfR1JQMV9EaXNhYmxlQ2xvY2tTdG9wU2xlZXBcbg0KLSAqICAgICAgICAgQUhCMlNNRU5SICAgIERBQzNTTUVOICAgICAgTExfQUhCMl9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuDQotICogICAgICAgICBBSEIyU01FTlIgICAgREFDNFNNRU4gICAgICBMTF9BSEIyX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwXG4NCi0gKiAgICAgICAgIEFIQjJTTUVOUiAgICBBRVNTTUVOICAgICAgIExMX0FIQjJfR1JQMV9EaXNhYmxlQ2xvY2tTdG9wU2xlZXBcbg0KLSAqICAgICAgICAgQUhCMlNNRU5SICAgIFJOR1NNRU4gICAgICAgTExfQUhCMl9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcA0KLSAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9BDQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9HUElPQg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0MNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9EDQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9HUElPRQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0YNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9HDQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9TUkFNMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfQ0NNDQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9BREMxMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfQURDMzQ1ICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfREFDMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfREFDMiAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0RBQzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0RBQzQgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9BRVMgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9STkcNCi0gKg0KLSAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0FIQjJfR1JQMV9EaXNhYmxlQ2xvY2tTdG9wU2xlZXAodWludDMyX3QgUGVyaXBocykgew0KLSAgQ0xFQVJfQklUKFJDQy0+QUhCMlNNRU5SLCBQZXJpcGhzKTsNCi19DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEJVU19MTF9FRl9BSEIzIEFIQjMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIEFIQjMgcGVyaXBoZXJhbHMgY2xvY2suDQotICogQHJtdG9sbCBBSEIzRU5SICAgICAgRk1DRU4gICAgICAgICBMTF9BSEIzX0dSUDFfRW5hYmxlQ2xvY2tcbg0KLSAqICAgICAgICAgQUhCM0VOUiAgICAgIFFTUElFTiAgICAgICAgTExfQUhCM19HUlAxX0VuYWJsZUNsb2NrDQotICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjNfR1JQMV9QRVJJUEhfRk1DICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjNfR1JQMV9QRVJJUEhfUVNQSSAoKikNCi0gKg0KLSAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0FIQjNfR1JQMV9FbmFibGVDbG9jayh1aW50MzJfdCBQZXJpcGhzKSB7DQotICBfX0lPIHVpbnQzMl90IHRtcHJlZzsNCi0gIFNFVF9CSVQoUkNDLT5BSEIzRU5SLCBQZXJpcGhzKTsNCi0gIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovDQotICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFIQjNFTlIsIFBlcmlwaHMpOw0KLSAgKHZvaWQpdG1wcmVnOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIGlmIEFIQjMgcGVyaXBoZXJhbCBjbG9jayBpcyBlbmFibGVkIG9yIG5vdA0KLSAqIEBybXRvbGwgQUhCM0VOUiAgICAgIEZNQ0VOICAgICAgICAgTExfQUhCM19HUlAxX0lzRW5hYmxlZENsb2NrXG4NCi0gKiAgICAgICAgIEFIQjNFTlIgICAgICBRU1BJRU4gICAgICAgIExMX0FIQjNfR1JQMV9Jc0VuYWJsZWRDbG9jaw0KLSAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIzX0dSUDFfUEVSSVBIX0ZNQyAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIzX0dSUDFfUEVSSVBIX1FTUEkgKCopDQotICoNCi0gKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4NCi0gKiBAcmV0dmFsIFN0YXRlIG9mIFBlcmlwaHMgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FIQjNfR1JQMV9Jc0VuYWJsZWRDbG9jayh1aW50MzJfdCBQZXJpcGhzKSB7DQotICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkFIQjNFTlIsIFBlcmlwaHMpID09IFBlcmlwaHMpID8gMVVMIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIEFIQjMgcGVyaXBoZXJhbHMgY2xvY2suDQotICogQHJtdG9sbCBBSEIzRU5SICAgICAgRk1DRU4gICAgICAgICBMTF9BSEIzX0dSUDFfRGlzYWJsZUNsb2NrXG4NCi0gKiAgICAgICAgIEFIQjNFTlIgICAgICBRU1BJRU4gICAgICAgIExMX0FIQjNfR1JQMV9EaXNhYmxlQ2xvY2sNCi0gKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCM19HUlAxX1BFUklQSF9GTUMgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCM19HUlAxX1BFUklQSF9RU1BJICgqKQ0KLSAqDQotICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQUhCM19HUlAxX0Rpc2FibGVDbG9jayh1aW50MzJfdCBQZXJpcGhzKSB7DQotICBDTEVBUl9CSVQoUkNDLT5BSEIzRU5SLCBQZXJpcGhzKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBGb3JjZSBBSEIzIHBlcmlwaGVyYWxzIHJlc2V0Lg0KLSAqIEBybXRvbGwgQUhCM1JTVFIgICAgIEZNQ1JTVCAgICAgICAgTExfQUhCM19HUlAxX0ZvcmNlUmVzZXRcbg0KLSAqICAgICAgICAgQUhCM1JTVFIgICAgIFFTUElSU1QgICAgICAgTExfQUhCM19HUlAxX0ZvcmNlUmVzZXQNCi0gKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCM19HUlAxX1BFUklQSF9BTEwNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIzX0dSUDFfUEVSSVBIX0ZNQyAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIzX0dSUDFfUEVSSVBIX1FTUEkgKCopDQotICoNCi0gKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BSEIzX0dSUDFfRm9yY2VSZXNldCh1aW50MzJfdCBQZXJpcGhzKSB7DQotICBTRVRfQklUKFJDQy0+QUhCM1JTVFIsIFBlcmlwaHMpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJlbGVhc2UgQUhCMyBwZXJpcGhlcmFscyByZXNldC4NCi0gKiBAcm10b2xsIEFIQjNSU1RSICAgICBGTUNSU1QgICAgICAgIExMX0FIQjNfR1JQMV9SZWxlYXNlUmVzZXRcbg0KLSAqICAgICAgICAgQUhCM1JTVFIgICAgIFFTUElSU1QgICAgICAgTExfQUhCM19HUlAxX1JlbGVhc2VSZXNldA0KLSAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIzX0dSUDFfUEVSSVBIX0FMTA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjNfR1JQMV9QRVJJUEhfRk1DICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjNfR1JQMV9QRVJJUEhfUVNQSSAoKikNCi0gKg0KLSAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0FIQjNfR1JQMV9SZWxlYXNlUmVzZXQodWludDMyX3QgUGVyaXBocykgew0KLSAgQ0xFQVJfQklUKFJDQy0+QUhCM1JTVFIsIFBlcmlwaHMpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSBBSEIzIHBlcmlwaGVyYWwgY2xvY2tzIGluIFNsZWVwIGFuZCBTdG9wIG1vZGVzDQotICogQHJtdG9sbCBBSEIzU01FTlIgICAgRk1DU01FTiAgICAgICBMTF9BSEIzX0dSUDFfRW5hYmxlQ2xvY2tTdG9wU2xlZXBcbg0KLSAqICAgICAgICAgQUhCM1NNRU5SICAgIFFTUElTTUVOICAgICAgTExfQUhCM19HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwDQotICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjNfR1JQMV9QRVJJUEhfRk1DICAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIzX0dSUDFfUEVSSVBIX1FTUEkgKCopDQotICoNCi0gKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BSEIzX0dSUDFfRW5hYmxlQ2xvY2tTdG9wU2xlZXAodWludDMyX3QgUGVyaXBocykgew0KLSAgX19JTyB1aW50MzJfdCB0bXByZWc7DQotICBTRVRfQklUKFJDQy0+QUhCM1NNRU5SLCBQZXJpcGhzKTsNCi0gIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovDQotICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFIQjNTTUVOUiwgUGVyaXBocyk7DQotICAodm9pZCl0bXByZWc7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBBSEIzIHBlcmlwaGVyYWwgY2xvY2tzIGluIFNsZWVwIGFuZCBTdG9wIG1vZGVzDQotICogQHJtdG9sbCBBSEIzU01FTlIgICAgRk1DU01FTiAgICAgICBMTF9BSEIzX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwXG4NCi0gKiAgICAgICAgIEFIQjNTTUVOUiAgICBRU1BJU01FTiAgICAgIExMX0FIQjNfR1JQMV9EaXNhYmxlQ2xvY2tTdG9wU2xlZXANCi0gKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCM19HUlAxX1BFUklQSF9GTUMgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfQUhCM19HUlAxX1BFUklQSF9RU1BJICgqKQ0KLSAqDQotICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQUhCM19HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcCh1aW50MzJfdCBQZXJpcGhzKSB7DQotICBDTEVBUl9CSVQoUkNDLT5BSEIzU01FTlIsIFBlcmlwaHMpOw0KLX0NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQlVTX0xMX0VGX0FQQjEgQVBCMQ0KLSAqIEB7DQotICovDQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgQVBCMSBwZXJpcGhlcmFscyBjbG9jay4NCi0gKiBAcm10b2xsIEFQQjFFTlIxICAgICBUSU0yRU4gICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1xuDQotICogICAgICAgICBBUEIxRU5SMSAgICAgVElNM0VOICAgICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tcbg0KLSAqICAgICAgICAgQVBCMUVOUjEgICAgIFRJTTRFTiAgICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrXG4NCi0gKiAgICAgICAgIEFQQjFFTlIxICAgICBUSU01RU4gICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1xuDQotICogICAgICAgICBBUEIxRU5SMSAgICAgVElNNkVOICAgICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tcbg0KLSAqICAgICAgICAgQVBCMUVOUjEgICAgIFRJTTdFTiAgICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrXG4NCi0gKiAgICAgICAgIEFQQjFFTlIxICAgICBDUlNFTiAgICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1xuDQotICogICAgICAgICBBUEIxRU5SMSAgICAgUlRDQVBCRU4gICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tcbg0KLSAqICAgICAgICAgQVBCMUVOUjEgICAgIFdXREdFTiAgICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrXG4NCi0gKiAgICAgICAgIEFQQjFFTlIxICAgICBTUEkyRU4gICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1xuDQotICogICAgICAgICBBUEIxRU5SMSAgICAgU1BJM0VOICAgICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tcbg0KLSAqICAgICAgICAgQVBCMUVOUjEgICAgIFVTQVJUMkVOICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrXG4NCi0gKiAgICAgICAgIEFQQjFFTlIxICAgICBVU0FSVDNFTiAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1xuDQotICogICAgICAgICBBUEIxRU5SMSAgICAgVUFSVDRFTiAgICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tcbg0KLSAqICAgICAgICAgQVBCMUVOUjEgICAgIFVBUlQ1RU4gICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrXG4NCi0gKiAgICAgICAgIEFQQjFFTlIxICAgICBJMkMxRU4gICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1xuDQotICogICAgICAgICBBUEIxRU5SMSAgICAgSTJDMkVOICAgICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tcbg0KLSAqICAgICAgICAgQVBCMUVOUjEgICAgIFVTQkVOICAgICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrXG4NCi0gKiAgICAgICAgIEFQQjFFTlIxICAgICBGRENBTkVOICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1xuDQotICogICAgICAgICBBUEIxRU5SMSAgICAgUFdSRU4gICAgICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tcbg0KLSAqICAgICAgICAgQVBCMUVOUjEgICAgIEkyQzNFTiAgICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrXG4NCi0gKiAgICAgICAgIEFQQjFFTlIxICAgICBMUFRJTTFFTiAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9jaw0KLSAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTUgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU02DQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU03DQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9DUlMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1JUQ0FQQg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfV1dERw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfU1BJMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfU1BJMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVVNBUlQyDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VU0FSVDMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1VBUlQ0ICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVUFSVDUgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9JMkMxDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9JMkMyDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VU0INCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0ZEQ0FOICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfUFdSDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9JMkMzDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9MUFRJTTENCi0gKg0KLSAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0FQQjFfR1JQMV9FbmFibGVDbG9jayh1aW50MzJfdCBQZXJpcGhzKSB7DQotICBfX0lPIHVpbnQzMl90IHRtcHJlZzsNCi0gIFNFVF9CSVQoUkNDLT5BUEIxRU5SMSwgUGVyaXBocyk7DQotICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLw0KLSAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEIxRU5SMSwgUGVyaXBocyk7DQotICAodm9pZCl0bXByZWc7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIEFQQjEgcGVyaXBoZXJhbHMgY2xvY2suDQotICogQHJtdG9sbCBBUEIxRU5SMiAgICAgTFBVQVJUMUVOICAgICBMTF9BUEIxX0dSUDJfRW5hYmxlQ2xvY2tcbg0KLSAqICAgICAgICAgQVBCMUVOUjIgICAgIEkyQzRFTiAgICAgICAgTExfQVBCMV9HUlAyX0VuYWJsZUNsb2NrXG4NCi0gKiAgICAgICAgIEFQQjFFTlIyICAgICBVQ1BEMUVOICAgICAgIExMX0FQQjFfR1JQMl9FbmFibGVDbG9jaw0KLSAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDJfUEVSSVBIX0xQVUFSVDENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDJfUEVSSVBIX0kyQzQgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAyX1BFUklQSF9VQ1BEMQ0KLSAqDQotICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQVBCMV9HUlAyX0VuYWJsZUNsb2NrKHVpbnQzMl90IFBlcmlwaHMpIHsNCi0gIF9fSU8gdWludDMyX3QgdG1wcmVnOw0KLSAgU0VUX0JJVChSQ0MtPkFQQjFFTlIyLCBQZXJpcGhzKTsNCi0gIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovDQotICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQjFFTlIyLCBQZXJpcGhzKTsNCi0gICh2b2lkKXRtcHJlZzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiBBUEIxIHBlcmlwaGVyYWwgY2xvY2sgaXMgZW5hYmxlZCBvciBub3QNCi0gKiBAcm10b2xsIEFQQjFFTlIxICAgICBUSU0yRU4gICAgICAgIExMX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuDQotICogICAgICAgICBBUEIxRU5SMSAgICAgVElNM0VOICAgICAgICBMTF9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbg0KLSAqICAgICAgICAgQVBCMUVOUjEgICAgIFRJTTRFTiAgICAgICAgTExfQVBCMV9HUlAxX0lzRW5hYmxlZENsb2NrXG4NCi0gKiAgICAgICAgIEFQQjFFTlIxICAgICBUSU01RU4gICAgICAgIExMX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuDQotICogICAgICAgICBBUEIxRU5SMSAgICAgVElNNkVOICAgICAgICBMTF9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbg0KLSAqICAgICAgICAgQVBCMUVOUjEgICAgIFRJTTdFTiAgICAgICAgTExfQVBCMV9HUlAxX0lzRW5hYmxlZENsb2NrXG4NCi0gKiAgICAgICAgIEFQQjFFTlIxICAgICBDUlNFTiAgICAgICAgIExMX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuDQotICogICAgICAgICBBUEIxRU5SMSAgICAgUlRDQVBCRU4gICAgICBMTF9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbg0KLSAqICAgICAgICAgQVBCMUVOUjEgICAgIFdXREdFTiAgICAgICAgTExfQVBCMV9HUlAxX0lzRW5hYmxlZENsb2NrXG4NCi0gKiAgICAgICAgIEFQQjFFTlIxICAgICBTUEkyRU4gICAgICAgIExMX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuDQotICogICAgICAgICBBUEIxRU5SMSAgICAgU1BJM0VOICAgICAgICBMTF9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbg0KLSAqICAgICAgICAgQVBCMUVOUjEgICAgIFVTQVJUMkVOICAgICAgTExfQVBCMV9HUlAxX0lzRW5hYmxlZENsb2NrXG4NCi0gKiAgICAgICAgIEFQQjFFTlIxICAgICBVU0FSVDNFTiAgICAgIExMX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuDQotICogICAgICAgICBBUEIxRU5SMSAgICAgVUFSVDRFTiAgICAgICBMTF9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbg0KLSAqICAgICAgICAgQVBCMUVOUjEgICAgIFVBUlQ1RU4gICAgICAgTExfQVBCMV9HUlAxX0lzRW5hYmxlZENsb2NrXG4NCi0gKiAgICAgICAgIEFQQjFFTlIxICAgICBJMkMxRU4gICAgICAgIExMX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuDQotICogICAgICAgICBBUEIxRU5SMSAgICAgSTJDMkVOICAgICAgICBMTF9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbg0KLSAqICAgICAgICAgQVBCMUVOUjEgICAgIFVTQkVOICAgICAgICAgTExfQVBCMV9HUlAxX0lzRW5hYmxlZENsb2NrXG4NCi0gKiAgICAgICAgIEFQQjFFTlIxICAgICBGRENBTkVOICAgICAgIExMX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuDQotICogICAgICAgICBBUEIxRU5SMSAgICAgUFdSRU4gICAgICAgICBMTF9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbg0KLSAqICAgICAgICAgQVBCMUVOUjEgICAgIEkyQzNFTiAgICAgICAgTExfQVBCMV9HUlAxX0lzRW5hYmxlZENsb2NrXG4NCi0gKiAgICAgICAgIEFQQjFFTlIxICAgICBMUFRJTTFFTiAgICAgIExMX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9jaw0KLSAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTUgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU02DQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU03DQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9DUlMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1JUQ0FQQg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfV1dERw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfU1BJMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfU1BJMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVVNBUlQyDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VU0FSVDMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1VBUlQ0ICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVUFSVDUgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9JMkMxDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9JMkMyDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VU0INCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0ZEQ0FOICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfUFdSDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9JMkMzDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9MUFRJTTENCi0gKg0KLSAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLg0KLSAqIEByZXR2YWwgU3RhdGUgb2YgUGVyaXBocyAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQVBCMV9HUlAxX0lzRW5hYmxlZENsb2NrKHVpbnQzMl90IFBlcmlwaHMpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFJDQy0+QVBCMUVOUjEsIFBlcmlwaHMpID09IFBlcmlwaHMpID8gMVVMIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiBBUEIxIHBlcmlwaGVyYWwgY2xvY2sgaXMgZW5hYmxlZCBvciBub3QNCi0gKiBAcm10b2xsIEFQQjFFTlIyICAgICBMUFVBUlQxRU4gICAgIExMX0FQQjFfR1JQMl9Jc0VuYWJsZWRDbG9ja1xuDQotICogICAgICAgICBBUEIxRU5SMiAgICAgSTJDNEVOICAgICAgICBMTF9BUEIxX0dSUDJfSXNFbmFibGVkQ2xvY2tcbg0KLSAqICAgICAgICAgQVBCMUVOUjIgICAgIFVDUEQxRU4gICAgICAgTExfQVBCMV9HUlAyX0lzRW5hYmxlZENsb2NrDQotICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMl9QRVJJUEhfTFBVQVJUMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMl9QRVJJUEhfSTJDNCAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDJfUEVSSVBIX1VDUEQxDQotICoNCi0gKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4NCi0gKiBAcmV0dmFsIFN0YXRlIG9mIFBlcmlwaHMgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FQQjFfR1JQMl9Jc0VuYWJsZWRDbG9jayh1aW50MzJfdCBQZXJpcGhzKSB7DQotICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkFQQjFFTlIyLCBQZXJpcGhzKSA9PSBQZXJpcGhzKSA/IDFVTCA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBBUEIxIHBlcmlwaGVyYWxzIGNsb2NrLg0KLSAqIEBybXRvbGwgQVBCMUVOUjEgICAgIFRJTTJFTiAgICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1xuDQotICogICAgICAgICBBUEIxRU5SMSAgICAgVElNM0VOICAgICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4NCi0gKiAgICAgICAgIEFQQjFFTlIxICAgICBUSU00RU4gICAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tcbg0KLSAqICAgICAgICAgQVBCMUVOUjEgICAgIFRJTTVFTiAgICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1xuDQotICogICAgICAgICBBUEIxRU5SMSAgICAgVElNNkVOICAgICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4NCi0gKiAgICAgICAgIEFQQjFFTlIxICAgICBUSU03RU4gICAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tcbg0KLSAqICAgICAgICAgQVBCMUVOUjEgICAgIENSU0VOICAgICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1xuDQotICogICAgICAgICBBUEIxRU5SMSAgICAgUlRDQVBCRU4gICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4NCi0gKiAgICAgICAgIEFQQjFFTlIxICAgICBXV0RHRU4gICAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tcbg0KLSAqICAgICAgICAgQVBCMUVOUjEgICAgIFNQSTJFTiAgICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1xuDQotICogICAgICAgICBBUEIxRU5SMSAgICAgU1BJM0VOICAgICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4NCi0gKiAgICAgICAgIEFQQjFFTlIxICAgICBVU0FSVDJFTiAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tcbg0KLSAqICAgICAgICAgQVBCMUVOUjEgICAgIFVTQVJUM0VOICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1xuDQotICogICAgICAgICBBUEIxRU5SMSAgICAgVUFSVDRFTiAgICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4NCi0gKiAgICAgICAgIEFQQjFFTlIxICAgICBVQVJUNUVOICAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tcbg0KLSAqICAgICAgICAgQVBCMUVOUjEgICAgIEkyQzFFTiAgICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1xuDQotICogICAgICAgICBBUEIxRU5SMSAgICAgSTJDMkVOICAgICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4NCi0gKiAgICAgICAgIEFQQjFFTlIxICAgICBVU0JFTiAgICAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tcbg0KLSAqICAgICAgICAgQVBCMUVOUjEgICAgIEZEQ0FORU4gICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1xuDQotICogICAgICAgICBBUEIxRU5SMSAgICAgUFdSRU4gICAgICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4NCi0gKiAgICAgICAgIEFQQjFFTlIxICAgICBJMkMzRU4gICAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tcbg0KLSAqICAgICAgICAgQVBCMUVOUjEgICAgIExQVElNMUVOICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9jaw0KLSAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTUgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU02DQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU03DQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9DUlMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1JUQ0FQQg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfV1dERw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfU1BJMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfU1BJMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVVNBUlQyDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VU0FSVDMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1VBUlQ0ICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVUFSVDUgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9JMkMxDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9JMkMyDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VU0INCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0ZEQ0FOICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfUFdSDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9JMkMzDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9MUFRJTTENCi0gKg0KLSAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2sodWludDMyX3QgUGVyaXBocykgew0KLSAgQ0xFQVJfQklUKFJDQy0+QVBCMUVOUjEsIFBlcmlwaHMpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgQVBCMSBwZXJpcGhlcmFscyBjbG9jay4NCi0gKiBAcm10b2xsIEFQQjFFTlIyICAgICBMUFVBUlQxRU4gICAgIExMX0FQQjFfR1JQMl9EaXNhYmxlQ2xvY2tcbg0KLSAqICAgICAgICAgQVBCMUVOUjIgICAgIEkyQzRFTiAgICAgICAgTExfQVBCMV9HUlAyX0Rpc2FibGVDbG9ja1xuDQotICogICAgICAgICBBUEIxRU5SMiAgICAgVUNQRDFFTiAgICAgIExMX0FQQjFfR1JQMl9EaXNhYmxlQ2xvY2sNCi0gKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAyX1BFUklQSF9MUFVBUlQxDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAyX1BFUklQSF9JMkM0ICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMl9QRVJJUEhfVUNQRDENCi0gKg0KLSAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0FQQjFfR1JQMl9EaXNhYmxlQ2xvY2sodWludDMyX3QgUGVyaXBocykgew0KLSAgQ0xFQVJfQklUKFJDQy0+QVBCMUVOUjIsIFBlcmlwaHMpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEZvcmNlIEFQQjEgcGVyaXBoZXJhbHMgcmVzZXQuDQotICogQHJtdG9sbCBBUEIxUlNUUjEgICAgIFRJTTJSU1QgICAgICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0XG4NCi0gKiAgICAgICAgIEFQQjFSU1RSMSAgICAgVElNM1JTVCAgICAgICAgTExfQVBCMV9HUlAxX0ZvcmNlUmVzZXRcbg0KLSAqICAgICAgICAgQVBCMVJTVFIxICAgICBUSU00UlNUICAgICAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldFxuDQotICogICAgICAgICBBUEIxUlNUUjEgICAgIFRJTTVSU1QgICAgICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0XG4NCi0gKiAgICAgICAgIEFQQjFSU1RSMSAgICAgVElNNlJTVCAgICAgICAgTExfQVBCMV9HUlAxX0ZvcmNlUmVzZXRcbg0KLSAqICAgICAgICAgQVBCMVJTVFIxICAgICBUSU03UlNUICAgICAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldFxuDQotICogICAgICAgICBBUEIxUlNUUjEgICAgIENSU1JTVCAgICAgICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0XG4NCi0gKiAgICAgICAgIEFQQjFSU1RSMSAgICAgU1BJMlJTVCAgICAgICAgTExfQVBCMV9HUlAxX0ZvcmNlUmVzZXRcbg0KLSAqICAgICAgICAgQVBCMVJTVFIxICAgICBTUEkzUlNUICAgICAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldFxuDQotICogICAgICAgICBBUEIxUlNUUjEgICAgIFVTQVJUMlJTVCAgICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0XG4NCi0gKiAgICAgICAgIEFQQjFSU1RSMSAgICAgVVNBUlQzUlNUICAgICAgTExfQVBCMV9HUlAxX0ZvcmNlUmVzZXRcbg0KLSAqICAgICAgICAgQVBCMVJTVFIxICAgICBVQVJUNFJTVCAgICAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldFxuDQotICogICAgICAgICBBUEIxUlNUUjEgICAgIFVBUlQ1UlNUICAgICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0XG4NCi0gKiAgICAgICAgIEFQQjFSU1RSMSAgICAgSTJDMVJTVCAgICAgICAgTExfQVBCMV9HUlAxX0ZvcmNlUmVzZXRcbg0KLSAqICAgICAgICAgQVBCMVJTVFIxICAgICBJMkMyUlNUICAgICAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldFxuDQotICogICAgICAgICBBUEIxUlNUUjEgICAgIFVTQlJTVCAgICAgICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0XG4NCi0gKiAgICAgICAgIEFQQjFSU1RSMSAgICAgRkRDQU5SU1QgICAgICAgTExfQVBCMV9HUlAxX0ZvcmNlUmVzZXRcbg0KLSAqICAgICAgICAgQVBCMVJTVFIxICAgICBQV1JSU1QgICAgICAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldFxuDQotICogICAgICAgICBBUEIxUlNUUjEgICAgIEkyQzNSU1QgICAgICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0XG4NCi0gKiAgICAgICAgIEFQQjFSU1RSMSAgICAgTFBUSU0xUlNUICAgICAgTExfQVBCMV9HUlAxX0ZvcmNlUmVzZXQNCi0gKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU0yDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU0zDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU00DQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU01ICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNNw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfQ1JTDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9TUEkyDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9TUEkzDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VU0FSVDINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1VTQVJUMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVUFSVDQgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VQVJUNSAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0kyQzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0kyQzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1VTQg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfRkRDQU4gKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9QV1INCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0kyQzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0xQVElNMQ0KLSAqDQotICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQVBCMV9HUlAxX0ZvcmNlUmVzZXQodWludDMyX3QgUGVyaXBocykgew0KLSAgU0VUX0JJVChSQ0MtPkFQQjFSU1RSMSwgUGVyaXBocyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRm9yY2UgQVBCMSBwZXJpcGhlcmFscyByZXNldC4NCi0gKiBAcm10b2xsIEFQQjFSU1RSMiAgICAgTFBVQVJUMVJTVCAgICAgTExfQVBCMV9HUlAyX0ZvcmNlUmVzZXRcbg0KLSAqICAgICAgICAgQVBCMVJTVFIyICAgICBJMkM0UlNUICAgICAgICBMTF9BUEIxX0dSUDJfRm9yY2VSZXNldFxuDQotICogICAgICAgICBBUEIxUlNUUjIgICAgIFVDUEQxUlNUICAgICAgIExMX0FQQjFfR1JQMl9Gb3JjZVJlc2V0DQotICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMl9QRVJJUEhfTFBVQVJUMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMl9QRVJJUEhfSTJDNCAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDJfUEVSSVBIX1VDUEQxDQotICoNCi0gKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BUEIxX0dSUDJfRm9yY2VSZXNldCh1aW50MzJfdCBQZXJpcGhzKSB7DQotICBTRVRfQklUKFJDQy0+QVBCMVJTVFIyLCBQZXJpcGhzKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBSZWxlYXNlIEFQQjEgcGVyaXBoZXJhbHMgcmVzZXQuDQotICogQHJtdG9sbCBBUEIxUlNUUjEgICAgIFRJTTJSU1QgICAgICAgIExMX0FQQjFfR1JQMV9SZWxlYXNlUmVzZXRcbg0KLSAqICAgICAgICAgQVBCMVJTVFIxICAgICBUSU0zUlNUICAgICAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0XG4NCi0gKiAgICAgICAgIEFQQjFSU1RSMSAgICAgVElNNFJTVCAgICAgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldFxuDQotICogICAgICAgICBBUEIxUlNUUjEgICAgIFRJTTVSU1QgICAgICAgIExMX0FQQjFfR1JQMV9SZWxlYXNlUmVzZXRcbg0KLSAqICAgICAgICAgQVBCMVJTVFIxICAgICBUSU02UlNUICAgICAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0XG4NCi0gKiAgICAgICAgIEFQQjFSU1RSMSAgICAgVElNN1JTVCAgICAgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldFxuDQotICogICAgICAgICBBUEIxUlNUUjEgICAgIENSU1JTVCAgICAgICAgIExMX0FQQjFfR1JQMV9SZWxlYXNlUmVzZXRcbg0KLSAqICAgICAgICAgQVBCMVJTVFIxICAgICBTUEkyUlNUICAgICAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0XG4NCi0gKiAgICAgICAgIEFQQjFSU1RSMSAgICAgU1BJM1JTVCAgICAgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldFxuDQotICogICAgICAgICBBUEIxUlNUUjEgICAgIFVTQVJUMlJTVCAgICAgIExMX0FQQjFfR1JQMV9SZWxlYXNlUmVzZXRcbg0KLSAqICAgICAgICAgQVBCMVJTVFIxICAgICBVU0FSVDNSU1QgICAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0XG4NCi0gKiAgICAgICAgIEFQQjFSU1RSMSAgICAgVUFSVDRSU1QgICAgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldFxuDQotICogICAgICAgICBBUEIxUlNUUjEgICAgIFVBUlQ1UlNUICAgICAgIExMX0FQQjFfR1JQMV9SZWxlYXNlUmVzZXRcbg0KLSAqICAgICAgICAgQVBCMVJTVFIxICAgICBJMkMxUlNUICAgICAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0XG4NCi0gKiAgICAgICAgIEFQQjFSU1RSMSAgICAgSTJDMlJTVCAgICAgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldFxuDQotICogICAgICAgICBBUEIxUlNUUjEgICAgIFVTQlJTVCAgICAgICAgIExMX0FQQjFfR1JQMV9SZWxlYXNlUmVzZXRcbg0KLSAqICAgICAgICAgQVBCMVJTVFIxICAgICBGRENBTlJTVCAgICAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0XG4NCi0gKiAgICAgICAgIEFQQjFSU1RSMSAgICAgUFdSUlNUICAgICAgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldFxuDQotICogICAgICAgICBBUEIxUlNUUjEgICAgIEkyQzNSU1QgICAgICAgIExMX0FQQjFfR1JQMV9SZWxlYXNlUmVzZXRcbg0KLSAqICAgICAgICAgQVBCMVJTVFIxICAgICBMUFRJTTFSU1QgICAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0DQotICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNNSAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0NSUw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfU1BJMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfU1BJMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVVNBUlQyDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VU0FSVDMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1VBUlQ0ICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVUFSVDUgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9JMkMxDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9JMkMyDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VU0INCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0ZEQ0FOICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfUFdSDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9JMkMzDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9MUFRJTTENCi0gKg0KLSAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0FQQjFfR1JQMV9SZWxlYXNlUmVzZXQodWludDMyX3QgUGVyaXBocykgew0KLSAgQ0xFQVJfQklUKFJDQy0+QVBCMVJTVFIxLCBQZXJpcGhzKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBSZWxlYXNlIEFQQjEgcGVyaXBoZXJhbHMgcmVzZXQuDQotICogQHJtdG9sbCBBUEIxUlNUUjIgICAgIExQVUFSVDFSU1QgICAgIExMX0FQQjFfR1JQMl9SZWxlYXNlUmVzZXRcbg0KLSAqICAgICAgICAgQVBCMVJTVFIyICAgICBJMkM0UlNUICAgICAgICBMTF9BUEIxX0dSUDJfUmVsZWFzZVJlc2V0XG4NCi0gKiAgICAgICAgIEFQQjFSU1RSMiAgICAgVUNQRDFSU1QgICAgICAgTExfQVBCMV9HUlAyX1JlbGVhc2VSZXNldA0KLSAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDJfUEVSSVBIX0xQVUFSVDENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDJfUEVSSVBIX0kyQzQgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAyX1BFUklQSF9VQ1BEMQ0KLSAqDQotICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQVBCMV9HUlAyX1JlbGVhc2VSZXNldCh1aW50MzJfdCBQZXJpcGhzKSB7DQotICBDTEVBUl9CSVQoUkNDLT5BUEIxUlNUUjIsIFBlcmlwaHMpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSBBUEIxIHBlcmlwaGVyYWwgY2xvY2tzIGluIFNsZWVwIGFuZCBTdG9wIG1vZGVzDQotICogQHJtdG9sbCBBUEIxU01FTlIxICAgICBUSU0yU01FTiAgICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4NCi0gKiAgICAgICAgIEFQQjFTTUVOUjEgICAgIFRJTTNTTUVOICAgICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTdG9wU2xlZXBcbg0KLSAqICAgICAgICAgQVBCMVNNRU5SMSAgICAgVElNNFNNRU4gICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1N0b3BTbGVlcFxuDQotICogICAgICAgICBBUEIxU01FTlIxICAgICBUSU01U01FTiAgICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4NCi0gKiAgICAgICAgIEFQQjFTTUVOUjEgICAgIFRJTTZTTUVOICAgICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTdG9wU2xlZXBcbg0KLSAqICAgICAgICAgQVBCMVNNRU5SMSAgICAgVElNN1NNRU4gICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1N0b3BTbGVlcFxuDQotICogICAgICAgICBBUEIxU01FTlIxICAgICBDUlNTTUVOICAgICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4NCi0gKiAgICAgICAgIEFQQjFTTUVOUjEgICAgIFJUQ0FQQlNNRU4gICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTdG9wU2xlZXBcbg0KLSAqICAgICAgICAgQVBCMVNNRU5SMSAgICAgV1dER1NNRU4gICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1N0b3BTbGVlcFxuDQotICogICAgICAgICBBUEIxU01FTlIxICAgICBTUEkyU01FTiAgICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4NCi0gKiAgICAgICAgIEFQQjFTTUVOUjEgICAgIFNQSTNTTUVOICAgICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTdG9wU2xlZXBcbg0KLSAqICAgICAgICAgQVBCMVNNRU5SMSAgICAgVVNBUlQyU01FTiAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1N0b3BTbGVlcFxuDQotICogICAgICAgICBBUEIxU01FTlIxICAgICBVU0FSVDNTTUVOICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4NCi0gKiAgICAgICAgIEFQQjFTTUVOUjEgICAgIFVBUlQ0U01FTiAgICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTdG9wU2xlZXBcbg0KLSAqICAgICAgICAgQVBCMVNNRU5SMSAgICAgVUFSVDVTTUVOICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1N0b3BTbGVlcFxuDQotICogICAgICAgICBBUEIxU01FTlIxICAgICBJMkMxU01FTiAgICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4NCi0gKiAgICAgICAgIEFQQjFTTUVOUjEgICAgIEkyQzJTTUVOICAgICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTdG9wU2xlZXBcbg0KLSAqICAgICAgICAgQVBCMVNNRU5SMSAgICAgVVNCU01FTiAgICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1N0b3BTbGVlcFxuDQotICogICAgICAgICBBUEIxU01FTlIxICAgICBGRENBTlNNRU4gICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4NCi0gKiAgICAgICAgIEFQQjFTTUVOUjEgICAgIFBXUlNNRU4gICAgICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTdG9wU2xlZXBcbg0KLSAqICAgICAgICAgQVBCMVNNRU5SMSAgICAgSTJDM1NNRU4gICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1N0b3BTbGVlcFxuDQotICogICAgICAgICBBUEIxU01FTlIxICAgICBMUFRJTTFTTUVOICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwDQotICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNNSAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0NSUw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfUlRDQVBCDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9XV0RHDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9TUEkyDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9TUEkzDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VU0FSVDINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1VTQVJUMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVUFSVDQgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VQVJUNSAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0kyQzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0kyQzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1VTQg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfRkRDQU4gKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9QV1INCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0kyQzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0xQVElNMQ0KLSAqDQotICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwKHVpbnQzMl90IFBlcmlwaHMpIHsNCi0gIF9fSU8gdWludDMyX3QgdG1wcmVnOw0KLSAgU0VUX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFBlcmlwaHMpOw0KLSAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8NCi0gIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCMVNNRU5SMSwgUGVyaXBocyk7DQotICAodm9pZCl0bXByZWc7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIEFQQjEgcGVyaXBoZXJhbCBjbG9ja3MgaW4gU2xlZXAgYW5kIFN0b3AgbW9kZXMNCi0gKiBAcm10b2xsIEFQQjFTTUVOUjIgICAgIExQVUFSVDFTTUVOICAgICBMTF9BUEIxX0dSUDJfRW5hYmxlQ2xvY2tTdG9wU2xlZXBcbg0KLSAqICAgICAgICAgQVBCMVNNRU5SMiAgICAgSTJDNFNNRU4gICAgICAgIExMX0FQQjFfR1JQMl9FbmFibGVDbG9ja1N0b3BTbGVlcFxuDQotICogICAgICAgICBBUEIxU01FTlIyICAgICBVQ1BEMVNNRU4gICAgICAgTExfQVBCMV9HUlAyX0VuYWJsZUNsb2NrU3RvcFNsZWVwDQotICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMl9QRVJJUEhfTFBVQVJUMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMl9QRVJJUEhfSTJDNCAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDJfUEVSSVBIX1VDUEQxICgqKQ0KLSAqDQotICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQVBCMV9HUlAyX0VuYWJsZUNsb2NrU3RvcFNsZWVwKHVpbnQzMl90IFBlcmlwaHMpIHsNCi0gIF9fSU8gdWludDMyX3QgdG1wcmVnOw0KLSAgU0VUX0JJVChSQ0MtPkFQQjFTTUVOUjIsIFBlcmlwaHMpOw0KLSAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8NCi0gIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCMVNNRU5SMiwgUGVyaXBocyk7DQotICAodm9pZCl0bXByZWc7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBBUEIxIHBlcmlwaGVyYWwgY2xvY2tzIGluIFNsZWVwIGFuZCBTdG9wIG1vZGVzDQotICogQHJtdG9sbCBBUEIxU01FTlIxICAgICBUSU0yU01FTiAgICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuDQotICogICAgICAgICBBUEIxU01FTlIxICAgICBUSU0zU01FTiAgICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuDQotICogICAgICAgICBBUEIxU01FTlIxICAgICBUSU00U01FTiAgICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuDQotICogICAgICAgICBBUEIxU01FTlIxICAgICBUSU01U01FTiAgICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuDQotICogICAgICAgICBBUEIxU01FTlIxICAgICBUSU02U01FTiAgICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuDQotICogICAgICAgICBBUEIxU01FTlIxICAgICBUSU03U01FTiAgICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuDQotICogICAgICAgICBBUEIxU01FTlIxICAgICBDUlNTTUVOICAgICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuDQotICogICAgICAgICBBUEIxU01FTlIxICAgICBSVENBUEJTTUVOICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuDQotICogICAgICAgICBBUEIxU01FTlIxICAgICBXV0RHU01FTiAgICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuDQotICogICAgICAgICBBUEIxU01FTlIxICAgICBTUEkyU01FTiAgICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuDQotICogICAgICAgICBBUEIxU01FTlIxICAgICBTUEkzU01FTiAgICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuDQotICogICAgICAgICBBUEIxU01FTlIxICAgICBVU0FSVDJTTUVOICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuDQotICogICAgICAgICBBUEIxU01FTlIxICAgICBVU0FSVDNTTUVOICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuDQotICogICAgICAgICBBUEIxU01FTlIxICAgICBVQVJUNFNNRU4gICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuDQotICogICAgICAgICBBUEIxU01FTlIxICAgICBVQVJUNVNNRU4gICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuDQotICogICAgICAgICBBUEIxU01FTlIxICAgICBJMkMxU01FTiAgICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuDQotICogICAgICAgICBBUEIxU01FTlIxICAgICBJMkMyU01FTiAgICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuDQotICogICAgICAgICBBUEIxU01FTlIxICAgICBVU0JTTUVOICAgICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuDQotICogICAgICAgICBBUEIxU01FTlIxICAgICBGRENBTlNNRU4gICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuDQotICogICAgICAgICBBUEIxU01FTlIxICAgICBQV1JTTUVOICAgICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuDQotICogICAgICAgICBBUEIxU01FTlIxICAgICBJMkMzU01FTiAgICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuDQotICogICAgICAgICBBUEIxU01FTlIxICAgICBMUFRJTTFTTUVOICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcA0KLSAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTUgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU02DQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU03DQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9DUlMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1JUQ0FQQg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfV1dERw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfU1BJMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfU1BJMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVVNBUlQyDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VU0FSVDMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1VBUlQ0ICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVUFSVDUgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9JMkMxDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9JMkMyDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VU0INCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0ZEQ0FOICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfUFdSDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9JMkMzDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9MUFRJTTENCi0gKg0KLSAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tTdG9wU2xlZXAodWludDMyX3QgUGVyaXBocykgew0KLSAgQ0xFQVJfQklUKFJDQy0+QVBCMVNNRU5SMSwgUGVyaXBocyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBBUEIxIHBlcmlwaGVyYWwgY2xvY2tzIGluIFNsZWVwIGFuZCBTdG9wIG1vZGVzDQotICogQHJtdG9sbCBBUEIxU01FTlIyICAgICBMUFVBUlQxU01FTiAgICAgTExfQVBCMV9HUlAyX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuDQotICogICAgICAgICBBUEIxU01FTlIyICAgICBJMkM0U01FTiAgICAgICAgTExfQVBCMV9HUlAyX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuDQotICogICAgICAgICBBUEIxU01FTlIyICAgICBVQ1BEMVNNRU4gICAgICBMTF9BUEIxX0dSUDJfRGlzYWJsZUNsb2NrU3RvcFNsZWVwDQotICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMl9QRVJJUEhfTFBVQVJUMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMl9QRVJJUEhfSTJDNCAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDJfUEVSSVBIX1VDUEQxICgqKQ0KLSAqDQotICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQVBCMV9HUlAyX0Rpc2FibGVDbG9ja1N0b3BTbGVlcCh1aW50MzJfdCBQZXJpcGhzKSB7DQotICBDTEVBUl9CSVQoUkNDLT5BUEIxU01FTlIyLCBQZXJpcGhzKTsNCi19DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEJVU19MTF9FRl9BUEIyIEFQQjINCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIEFQQjIgcGVyaXBoZXJhbHMgY2xvY2suDQotICogQHJtdG9sbCBBUEIyRU5SICAgICAgU1lTQ0ZHRU4gICAgICBMTF9BUEIyX0dSUDFfRW5hYmxlQ2xvY2tcbg0KLSAqICAgICAgICAgQVBCMkVOUiAgICAgIFRJTTFFTiAgICAgICAgTExfQVBCMl9HUlAxX0VuYWJsZUNsb2NrXG4NCi0gKiAgICAgICAgIEFQQjJFTlIgICAgICBTUEkxRU4gICAgICAgIExMX0FQQjJfR1JQMV9FbmFibGVDbG9ja1xuDQotICogICAgICAgICBBUEIyRU5SICAgICAgVElNOEVOICAgICAgICBMTF9BUEIyX0dSUDFfRW5hYmxlQ2xvY2tcbg0KLSAqICAgICAgICAgQVBCMkVOUiAgICAgIFVTQVJUMUVOICAgICAgTExfQVBCMl9HUlAxX0VuYWJsZUNsb2NrXG4NCi0gKiAgICAgICAgIEFQQjJFTlIgICAgICBTUEk0RU4gICAgICAgIExMX0FQQjJfR1JQMV9FbmFibGVDbG9ja1xuDQotICogICAgICAgICBBUEIyRU5SICAgICAgVElNMTVFTiAgICAgICBMTF9BUEIyX0dSUDFfRW5hYmxlQ2xvY2tcbg0KLSAqICAgICAgICAgQVBCMkVOUiAgICAgIFRJTTE2RU4gICAgICAgTExfQVBCMl9HUlAxX0VuYWJsZUNsb2NrXG4NCi0gKiAgICAgICAgIEFQQjJFTlIgICAgICBUSU0xN0VOICAgICAgIExMX0FQQjJfR1JQMV9FbmFibGVDbG9ja1xuDQotICogICAgICAgICBBUEIyRU5SICAgICAgVElNMjBFTiAgICAgICBMTF9BUEIyX0dSUDFfRW5hYmxlQ2xvY2tcbg0KLSAqICAgICAgICAgQVBCMkVOUiAgICAgIFNBSTFFTiAgICAgICAgTExfQVBCMl9HUlAxX0VuYWJsZUNsb2NrXG4NCi0gKiAgICAgICAgIEFQQjJFTlIgICAgICBIUlRJTTFFTiAgICAgIExMX0FQQjJfR1JQMV9FbmFibGVDbG9jaw0KLSAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1NZU0NGRw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfU1BJMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVVNBUlQxDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9TUEk0ICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMTUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE2DQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU0xNw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMjAgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9TQUkxDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9IUlRJTTEgKCopDQotICoNCi0gKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BUEIyX0dSUDFfRW5hYmxlQ2xvY2sodWludDMyX3QgUGVyaXBocykgew0KLSAgX19JTyB1aW50MzJfdCB0bXByZWc7DQotICBTRVRfQklUKFJDQy0+QVBCMkVOUiwgUGVyaXBocyk7DQotICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLw0KLSAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEIyRU5SLCBQZXJpcGhzKTsNCi0gICh2b2lkKXRtcHJlZzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiBBUEIyIHBlcmlwaGVyYWwgY2xvY2sgaXMgZW5hYmxlZCBvciBub3QNCi0gKiBAcm10b2xsIEFQQjJFTlIgICAgICBTWVNDRkdFTiAgICAgIExMX0FQQjJfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuDQotICogICAgICAgICBBUEIyRU5SICAgICAgVElNMUVOICAgICAgICBMTF9BUEIyX0dSUDFfSXNFbmFibGVkQ2xvY2tcbg0KLSAqICAgICAgICAgQVBCMkVOUiAgICAgIFNQSTFFTiAgICAgICAgTExfQVBCMl9HUlAxX0lzRW5hYmxlZENsb2NrXG4NCi0gKiAgICAgICAgIEFQQjJFTlIgICAgICBUSU04RU4gICAgICAgIExMX0FQQjJfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuDQotICogICAgICAgICBBUEIyRU5SICAgICAgVVNBUlQxRU4gICAgICBMTF9BUEIyX0dSUDFfSXNFbmFibGVkQ2xvY2tcbg0KLSAqICAgICAgICAgQVBCMkVOUiAgICAgIFNQSTRFTiAgICAgICAgTExfQVBCMl9HUlAxX0lzRW5hYmxlZENsb2NrXG4NCi0gKiAgICAgICAgIEFQQjJFTlIgICAgICBUSU0xNUVOICAgICAgIExMX0FQQjJfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuDQotICogICAgICAgICBBUEIyRU5SICAgICAgVElNMTZFTiAgICAgICBMTF9BUEIyX0dSUDFfSXNFbmFibGVkQ2xvY2tcbg0KLSAqICAgICAgICAgQVBCMkVOUiAgICAgIFRJTTE3RU4gICAgICAgTExfQVBCMl9HUlAxX0lzRW5hYmxlZENsb2NrXG4NCi0gKiAgICAgICAgIEFQQjJFTlIgICAgICBUSU0yMEVOICAgICAgIExMX0FQQjJfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuDQotICogICAgICAgICBBUEIyRU5SICAgICAgU0FJMUVOICAgICAgICBMTF9BUEIyX0dSUDFfSXNFbmFibGVkQ2xvY2tcbg0KLSAqICAgICAgICAgQVBCMkVOUiAgICAgIEhSVElNMUVOICAgICAgTExfQVBCMl9HUlAxX0lzRW5hYmxlZENsb2NrDQotICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfU1lTQ0ZHDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU0xDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9TUEkxDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU04DQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9VU0FSVDENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1NQSTQgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU0xNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMTYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE3DQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU0yMCAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1NBSTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX0hSVElNMSAoKikNCi0gKg0KLSAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLg0KLSAqIEByZXR2YWwgU3RhdGUgb2YgUGVyaXBocyAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQVBCMl9HUlAxX0lzRW5hYmxlZENsb2NrKHVpbnQzMl90IFBlcmlwaHMpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFJDQy0+QVBCMkVOUiwgUGVyaXBocykgPT0gUGVyaXBocykgPyAxVUwgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgQVBCMiBwZXJpcGhlcmFscyBjbG9jay4NCi0gKiBAcm10b2xsIEFQQjJFTlIgICAgICBTWVNDRkdFTiAgICAgIExMX0FQQjJfR1JQMV9EaXNhYmxlQ2xvY2tcbg0KLSAqICAgICAgICAgQVBCMkVOUiAgICAgIFRJTTFFTiAgICAgICAgTExfQVBCMl9HUlAxX0Rpc2FibGVDbG9ja1xuDQotICogICAgICAgICBBUEIyRU5SICAgICAgU1BJMUVOICAgICAgICBMTF9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrXG4NCi0gKiAgICAgICAgIEFQQjJFTlIgICAgICBUSU04RU4gICAgICAgIExMX0FQQjJfR1JQMV9EaXNhYmxlQ2xvY2tcbg0KLSAqICAgICAgICAgQVBCMkVOUiAgICAgIFVTQVJUMUVOICAgICAgTExfQVBCMl9HUlAxX0Rpc2FibGVDbG9ja1xuDQotICogICAgICAgICBBUEIyRU5SICAgICAgU1BJNEVOICAgICAgICBMTF9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrXG4NCi0gKiAgICAgICAgIEFQQjJFTlIgICAgICBUSU0xNUVOICAgICAgIExMX0FQQjJfR1JQMV9EaXNhYmxlQ2xvY2tcbg0KLSAqICAgICAgICAgQVBCMkVOUiAgICAgIFRJTTE2RU4gICAgICAgTExfQVBCMl9HUlAxX0Rpc2FibGVDbG9ja1xuDQotICogICAgICAgICBBUEIyRU5SICAgICAgVElNMTdFTiAgICAgICBMTF9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrXG4NCi0gKiAgICAgICAgIEFQQjJFTlIgICAgICBUSU0yMEVOICAgICAgIExMX0FQQjJfR1JQMV9EaXNhYmxlQ2xvY2tcbg0KLSAqICAgICAgICAgQVBCMkVOUiAgICAgIFNBSTFFTiAgICAgICAgTExfQVBCMl9HUlAxX0Rpc2FibGVDbG9ja1xuDQotICogICAgICAgICBBUEIyRU5SICAgICAgSFJUSU0xRU4gICAgICBMTF9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrDQotICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfU1lTQ0ZHDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU0xDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9TUEkxDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU04DQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9VU0FSVDENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1NQSTQgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU0xNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMTYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE3DQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU0yMCAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1NBSTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX0hSVElNMSAoKikNCi0gKg0KLSAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0FQQjJfR1JQMV9EaXNhYmxlQ2xvY2sodWludDMyX3QgUGVyaXBocykgew0KLSAgQ0xFQVJfQklUKFJDQy0+QVBCMkVOUiwgUGVyaXBocyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRm9yY2UgQVBCMiBwZXJpcGhlcmFscyByZXNldC4NCi0gKiBAcm10b2xsIEFQQjJSU1RSICAgICAgU1lTQ0ZHUlNUICAgICAgTExfQVBCMl9HUlAxX0ZvcmNlUmVzZXRcbg0KLSAqICAgICAgICAgQVBCMlJTVFIgICAgICBUSU0xUlNUICAgICAgICBMTF9BUEIyX0dSUDFfRm9yY2VSZXNldFxuDQotICogICAgICAgICBBUEIyUlNUUiAgICAgIFNQSTFSU1QgICAgICAgIExMX0FQQjJfR1JQMV9Gb3JjZVJlc2V0XG4NCi0gKiAgICAgICAgIEFQQjJSU1RSICAgICAgVElNOFJTVCAgICAgICAgTExfQVBCMl9HUlAxX0ZvcmNlUmVzZXRcbg0KLSAqICAgICAgICAgQVBCMlJTVFIgICAgICBVU0FSVDFSU1QgICAgICBMTF9BUEIyX0dSUDFfRm9yY2VSZXNldFxuDQotICogICAgICAgICBBUEIyUlNUUiAgICAgIFNQSTRSU1QgICAgICAgIExMX0FQQjJfR1JQMV9Gb3JjZVJlc2V0XG4NCi0gKiAgICAgICAgIEFQQjJSU1RSICAgICAgVElNMTVSU1QgICAgICAgTExfQVBCMl9HUlAxX0ZvcmNlUmVzZXRcbg0KLSAqICAgICAgICAgQVBCMlJTVFIgICAgICBUSU0xNlJTVCAgICAgICBMTF9BUEIyX0dSUDFfRm9yY2VSZXNldFxuDQotICogICAgICAgICBBUEIyUlNUUiAgICAgIFRJTTE3UlNUICAgICAgIExMX0FQQjJfR1JQMV9Gb3JjZVJlc2V0XG4NCi0gKiAgICAgICAgIEFQQjJSU1RSICAgICAgVElNMjBSU1QgICAgICAgTExfQVBCMl9HUlAxX0ZvcmNlUmVzZXRcbg0KLSAqICAgICAgICAgQVBCMlJTVFIgICAgICBTQUkxUlNUICAgICAgICBMTF9BUEIyX0dSUDFfRm9yY2VSZXNldFxuDQotICogICAgICAgICBBUEIyUlNUUiAgICAgIEhSVElNMVJTVCAgICAgIExMX0FQQjJfR1JQMV9Gb3JjZVJlc2V0DQotICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfU1lTQ0ZHDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU0xDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9TUEkxDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU04DQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9VU0FSVDENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1NQSTQgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU0xNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMTYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE3DQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU0yMCAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1NBSTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX0hSVElNMSAoKikNCi0gKg0KLSAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0FQQjJfR1JQMV9Gb3JjZVJlc2V0KHVpbnQzMl90IFBlcmlwaHMpIHsNCi0gIFNFVF9CSVQoUkNDLT5BUEIyUlNUUiwgUGVyaXBocyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmVsZWFzZSBBUEIyIHBlcmlwaGVyYWxzIHJlc2V0Lg0KLSAqIEBybXRvbGwgQVBCMlJTVFIgICAgICBTWVNDRkdSU1QgICAgICBMTF9BUEIyX0dSUDFfRm9yY2VSZXNldFxuDQotICogICAgICAgICBBUEIyUlNUUiAgICAgIFRJTTFSU1QgICAgICAgIExMX0FQQjJfR1JQMV9Gb3JjZVJlc2V0XG4NCi0gKiAgICAgICAgIEFQQjJSU1RSICAgICAgU1BJMVJTVCAgICAgICAgTExfQVBCMl9HUlAxX0ZvcmNlUmVzZXRcbg0KLSAqICAgICAgICAgQVBCMlJTVFIgICAgICBUSU04UlNUICAgICAgICBMTF9BUEIyX0dSUDFfRm9yY2VSZXNldFxuDQotICogICAgICAgICBBUEIyUlNUUiAgICAgIFVTQVJUMVJTVCAgICAgIExMX0FQQjJfR1JQMV9Gb3JjZVJlc2V0XG4NCi0gKiAgICAgICAgIEFQQjJSU1RSICAgICAgU1BJNFJTVCAgICAgICAgTExfQVBCMl9HUlAxX0ZvcmNlUmVzZXRcbg0KLSAqICAgICAgICAgQVBCMlJTVFIgICAgICBUSU0xNVJTVCAgICAgICBMTF9BUEIyX0dSUDFfRm9yY2VSZXNldFxuDQotICogICAgICAgICBBUEIyUlNUUiAgICAgIFRJTTE2UlNUICAgICAgIExMX0FQQjJfR1JQMV9Gb3JjZVJlc2V0XG4NCi0gKiAgICAgICAgIEFQQjJSU1RSICAgICAgVElNMTdSU1QgICAgICAgTExfQVBCMl9HUlAxX0ZvcmNlUmVzZXRcbg0KLSAqICAgICAgICAgQVBCMlJTVFIgICAgICBUSU0yMFJTVCAgICAgICBMTF9BUEIyX0dSUDFfRm9yY2VSZXNldFxuDQotICogICAgICAgICBBUEIyUlNUUiAgICAgIFNBSTFSU1QgICAgICAgIExMX0FQQjJfR1JQMV9Gb3JjZVJlc2V0XG4NCi0gKiAgICAgICAgIEFQQjJSU1RSICAgICAgSFJUSU0xUlNUICAgICAgTExfQVBCMl9HUlAxX0ZvcmNlUmVzZXQNCi0gKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9TWVNDRkcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1NQSTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1VTQVJUMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfU1BJNCAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE1DQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU0xNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMTcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTIwICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfU0FJMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfSFJUSU0xICgqKQ0KLSAqDQotICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQVBCMl9HUlAxX1JlbGVhc2VSZXNldCh1aW50MzJfdCBQZXJpcGhzKSB7DQotICBDTEVBUl9CSVQoUkNDLT5BUEIyUlNUUiwgUGVyaXBocyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIEFQQjIgcGVyaXBoZXJhbCBjbG9ja3MgaW4gU2xlZXAgYW5kIFN0b3AgbW9kZXMNCi0gKiBAcm10b2xsIEFQQjJTTUVOUiAgICAgIFNZU0NGR1NNRU4gICAgICBMTF9BUEIyX0dSUDFfRW5hYmxlQ2xvY2tTdG9wU2xlZXBcbg0KLSAqICAgICAgICAgQVBCMlNNRU5SICAgICAgVElNMVNNRU4gICAgICAgIExMX0FQQjJfR1JQMV9FbmFibGVDbG9ja1N0b3BTbGVlcFxuDQotICogICAgICAgICBBUEIyU01FTlIgICAgICBTUEkxU01FTiAgICAgICAgTExfQVBCMl9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4NCi0gKiAgICAgICAgIEFQQjJTTUVOUiAgICAgIFRJTThTTUVOICAgICAgICBMTF9BUEIyX0dSUDFfRW5hYmxlQ2xvY2tTdG9wU2xlZXBcbg0KLSAqICAgICAgICAgQVBCMlNNRU5SICAgICAgVVNBUlQxU01FTiAgICAgIExMX0FQQjJfR1JQMV9FbmFibGVDbG9ja1N0b3BTbGVlcFxuDQotICogICAgICAgICBBUEIyU01FTlIgICAgICBTUEk0U01FTiAgICAgICAgTExfQVBCMl9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4NCi0gKiAgICAgICAgIEFQQjJTTUVOUiAgICAgIFRJTTE1U01FTiAgICAgICBMTF9BUEIyX0dSUDFfRW5hYmxlQ2xvY2tTdG9wU2xlZXBcbg0KLSAqICAgICAgICAgQVBCMlNNRU5SICAgICAgVElNMTZTTUVOICAgICAgIExMX0FQQjJfR1JQMV9FbmFibGVDbG9ja1N0b3BTbGVlcFxuDQotICogICAgICAgICBBUEIyU01FTlIgICAgICBUSU0xN1NNRU4gICAgICAgTExfQVBCMl9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4NCi0gKiAgICAgICAgIEFQQjJTTUVOUiAgICAgIFRJTTIwU01FTiAgICAgICBMTF9BUEIyX0dSUDFfRW5hYmxlQ2xvY2tTdG9wU2xlZXBcbg0KLSAqICAgICAgICAgQVBCMlNNRU5SICAgICAgU0FJMVNNRU4gICAgICAgIExMX0FQQjJfR1JQMV9FbmFibGVDbG9ja1N0b3BTbGVlcFxuDQotICogICAgICAgICBBUEIyU01FTlIgICAgICBIUlRJTTFTTUVOICAgICAgTExfQVBCMl9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwDQotICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfU1lTQ0ZHDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU0xDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9TUEkxDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU04DQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9VU0FSVDENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1NQSTQgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU0xNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMTYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE3DQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU0yMCAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1NBSTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX0hSVElNMSAoKikNCi0gKg0KLSAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0FQQjJfR1JQMV9FbmFibGVDbG9ja1N0b3BTbGVlcCh1aW50MzJfdCBQZXJpcGhzKSB7DQotICBfX0lPIHVpbnQzMl90IHRtcHJlZzsNCi0gIFNFVF9CSVQoUkNDLT5BUEIyU01FTlIsIFBlcmlwaHMpOw0KLSAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8NCi0gIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCMlNNRU5SLCBQZXJpcGhzKTsNCi0gICh2b2lkKXRtcHJlZzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIEFQQjIgcGVyaXBoZXJhbCBjbG9ja3MgaW4gU2xlZXAgYW5kIFN0b3AgbW9kZXMNCi0gKiBAcm10b2xsIEFQQjJTTUVOUiAgICAgIFNZU0NGR1NNRU4gICAgICBMTF9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwXG4NCi0gKiAgICAgICAgIEFQQjJTTUVOUiAgICAgIFRJTTFTTUVOICAgICAgICBMTF9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwXG4NCi0gKiAgICAgICAgIEFQQjJTTUVOUiAgICAgIFNQSTFTTUVOICAgICAgICBMTF9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwXG4NCi0gKiAgICAgICAgIEFQQjJTTUVOUiAgICAgIFRJTThTTUVOICAgICAgICBMTF9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwXG4NCi0gKiAgICAgICAgIEFQQjJTTUVOUiAgICAgIFVTQVJUMVNNRU4gICAgICBMTF9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwXG4NCi0gKiAgICAgICAgIEFQQjJTTUVOUiAgICAgIFNQSTRTTUVOICAgICAgICBMTF9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwXG4NCi0gKiAgICAgICAgIEFQQjJTTUVOUiAgICAgIFRJTTE1U01FTiAgICAgICBMTF9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwXG4NCi0gKiAgICAgICAgIEFQQjJTTUVOUiAgICAgIFRJTTE2U01FTiAgICAgICBMTF9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwXG4NCi0gKiAgICAgICAgIEFQQjJTTUVOUiAgICAgIFRJTTE3U01FTiAgICAgICBMTF9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwXG4NCi0gKiAgICAgICAgIEFQQjJTTUVOUiAgICAgIFRJTTIwU01FTiAgICAgICBMTF9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwXG4NCi0gKiAgICAgICAgIEFQQjJTTUVOUiAgICAgIFNBSTFTTUVOICAgICAgICBMTF9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwXG4NCi0gKiAgICAgICAgIEFQQjJTTUVOUiAgICAgIEhSVElNMVNNRU4gICAgICBMTF9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwDQotICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfU1lTQ0ZHDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU0xDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9TUEkxDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU04DQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9VU0FSVDENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1NQSTQgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU0xNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMTYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE3DQotICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU0yMCAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1NBSTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX0hSVElNMSAoKikNCi0gKg0KLSAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0FQQjJfR1JQMV9EaXNhYmxlQ2xvY2tTdG9wU2xlZXAodWludDMyX3QgUGVyaXBocykgew0KLSAgQ0xFQVJfQklUKFJDQy0+QVBCMlNNRU5SLCBQZXJpcGhzKTsNCi19DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotI2VuZGlmIC8qIGRlZmluZWQoUkNDKSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotI2lmZGVmIF9fY3BsdXNwbHVzDQotfQ0KLSNlbmRpZg0KLQ0KLSNlbmRpZiAvKiBTVE0zMkc0eHhfTExfQlVTX0ggKi8NCisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnNHh4X2xsX2J1cy5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBCVVMgTEwgbW9kdWxlLgorCisgIEB2ZXJiYXRpbQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFJDQyBMaW1pdGF0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICBBIGRlbGF5IGJldHdlZW4gYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxlIGFuZCB0aGUgZWZmZWN0aXZlCisgIHBlcmlwaGVyYWwgZW5hYmxpbmcgc2hvdWxkIGJlIHRha2VuIGludG8gYWNjb3VudCBpbiBvcmRlciB0byBtYW5hZ2UgdGhlCisgIHBlcmlwaGVyYWwgcmVhZC93cml0ZSBmcm9tL3RvIHJlZ2lzdGVycy4KKyAgICAgICgrKSBUaGlzIGRlbGF5IGRlcGVuZHMgb24gdGhlIHBlcmlwaGVyYWwgbWFwcGluZy4KKyAgICAgICAgKCsrKSBBSEIgJiBBUEIgcGVyaXBoZXJhbHMsIDEgZHVtbXkgcmVhZCBpcyBuZWNlc3NhcnkKKworICAgIFsuLl0KKyAgICAgIFdvcmthcm91bmRzOgorICAgICAgKCMpIEZvciBBSEIgJiBBUEIgcGVyaXBoZXJhbHMsIGEgZHVtbXkgcmVhZCB0byB0aGUgcGVyaXBoZXJhbCByZWdpc3RlciBoYXMKKyAgYmVlbiBpbnNlcnRlZCBpbiBlYWNoIExMX3tCVVN9X0dSUHt4fV9FbmFibGVDbG9jaygpIGZ1bmN0aW9uLgorCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRlcm1zIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUKKyAgaW4KKyAgKiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb2Z0d2FyZSBjb21wb25lbnQuCisgICogSWYgbm8gTElDRU5TRSBmaWxlIGNvbWVzIHdpdGggdGhpcyBzb2Z0d2FyZSwgaXQgaXMgcHJvdmlkZWQgQVMtSVMuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMkc0eHhfTExfQlVTX0gKKyNkZWZpbmUgU1RNMzJHNHh4X0xMX0JVU19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmc0eHguaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzR4eF9MTF9Ecml2ZXIKKyAqIEB7CisgKi8KKworI2lmIGRlZmluZWQoUkNDKQorCisvKiogQGRlZmdyb3VwIEJVU19MTCBCVVMKKyAqIEB7CisgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBCVVNfTExfRXhwb3J0ZWRfQ29uc3RhbnRzIEJVUyBFeHBvcnRlZCBDb25zdGFudHMKKyAqIEB7CisgKi8KKworLyoqIEBkZWZncm91cCBCVVNfTExfRUNfQUhCMV9HUlAxX1BFUklQSCAgQUhCMSBHUlAxIFBFUklQSAorICogQHsKKyAqLworI2RlZmluZSBMTF9BSEIxX0dSUDFfUEVSSVBIX0FMTCAweEZGRkZGRkZGVQorI2RlZmluZSBMTF9BSEIxX0dSUDFfUEVSSVBIX0RNQTEgUkNDX0FIQjFFTlJfRE1BMUVOCisjZGVmaW5lIExMX0FIQjFfR1JQMV9QRVJJUEhfRE1BMiBSQ0NfQUhCMUVOUl9ETUEyRU4KKyNkZWZpbmUgTExfQUhCMV9HUlAxX1BFUklQSF9ETUFNVVgxIFJDQ19BSEIxRU5SX0RNQU1VWDFFTgorI2RlZmluZSBMTF9BSEIxX0dSUDFfUEVSSVBIX0NPUkRJQyBSQ0NfQUhCMUVOUl9DT1JESUNFTgorI2RlZmluZSBMTF9BSEIxX0dSUDFfUEVSSVBIX0ZNQUMgUkNDX0FIQjFFTlJfRk1BQ0VOCisjZGVmaW5lIExMX0FIQjFfR1JQMV9QRVJJUEhfRkxBU0ggUkNDX0FIQjFFTlJfRkxBU0hFTgorI2RlZmluZSBMTF9BSEIxX0dSUDFfUEVSSVBIX1NSQU0xIFJDQ19BSEIxU01FTlJfU1JBTTFTTUVOCisjZGVmaW5lIExMX0FIQjFfR1JQMV9QRVJJUEhfQ1JDIFJDQ19BSEIxRU5SX0NSQ0VOCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBCVVNfTExfRUNfQUhCMl9HUlAxX1BFUklQSCAgQUhCMiBHUlAxIFBFUklQSAorICogQHsKKyAqLworI2RlZmluZSBMTF9BSEIyX0dSUDFfUEVSSVBIX0FMTCAweEZGRkZGRkZGVQorI2RlZmluZSBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9BIFJDQ19BSEIyRU5SX0dQSU9BRU4KKyNkZWZpbmUgTExfQUhCMl9HUlAxX1BFUklQSF9HUElPQiBSQ0NfQUhCMkVOUl9HUElPQkVOCisjZGVmaW5lIExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0MgUkNDX0FIQjJFTlJfR1BJT0NFTgorI2RlZmluZSBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9EIFJDQ19BSEIyRU5SX0dQSU9ERU4KKyNkZWZpbmUgTExfQUhCMl9HUlAxX1BFUklQSF9HUElPRSBSQ0NfQUhCMkVOUl9HUElPRUVOCisjZGVmaW5lIExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0YgUkNDX0FIQjJFTlJfR1BJT0ZFTgorI2RlZmluZSBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9HIFJDQ19BSEIyRU5SX0dQSU9HRU4KKyNkZWZpbmUgTExfQUhCMl9HUlAxX1BFUklQSF9DQ00gUkNDX0FIQjJTTUVOUl9DQ01TUkFNU01FTgorI2RlZmluZSBMTF9BSEIyX0dSUDFfUEVSSVBIX1NSQU0yIFJDQ19BSEIyU01FTlJfU1JBTTJTTUVOCisjZGVmaW5lIExMX0FIQjJfR1JQMV9QRVJJUEhfQURDMTIgUkNDX0FIQjJFTlJfQURDMTJFTgorI2lmIGRlZmluZWQoQURDMzQ1X0NPTU1PTikKKyNkZWZpbmUgTExfQUhCMl9HUlAxX1BFUklQSF9BREMzNDUgUkNDX0FIQjJFTlJfQURDMzQ1RU4KKyNlbmRpZiAvKiBBREMzNDVfQ09NTU9OICovCisjZGVmaW5lIExMX0FIQjJfR1JQMV9QRVJJUEhfREFDMSBSQ0NfQUhCMkVOUl9EQUMxRU4KKyNpZiBkZWZpbmVkKERBQzIpCisjZGVmaW5lIExMX0FIQjJfR1JQMV9QRVJJUEhfREFDMiBSQ0NfQUhCMkVOUl9EQUMyRU4KKyNlbmRpZiAvKiBEQUMyICovCisjZGVmaW5lIExMX0FIQjJfR1JQMV9QRVJJUEhfREFDMyBSQ0NfQUhCMkVOUl9EQUMzRU4KKyNpZiBkZWZpbmVkKERBQzQpCisjZGVmaW5lIExMX0FIQjJfR1JQMV9QRVJJUEhfREFDNCBSQ0NfQUhCMkVOUl9EQUM0RU4KKyNlbmRpZiAvKiBEQUM0ICovCisjaWYgZGVmaW5lZChBRVMpCisjZGVmaW5lIExMX0FIQjJfR1JQMV9QRVJJUEhfQUVTIFJDQ19BSEIyRU5SX0FFU0VOCisjZW5kaWYgLyogQUVTICovCisjZGVmaW5lIExMX0FIQjJfR1JQMV9QRVJJUEhfUk5HIFJDQ19BSEIyRU5SX1JOR0VOCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBCVVNfTExfRUNfQUhCM19HUlAxX1BFUklQSCAgQUhCMyBHUlAxIFBFUklQSAorICogQHsKKyAqLworI2RlZmluZSBMTF9BSEIzX0dSUDFfUEVSSVBIX0FMTCAweEZGRkZGRkZGVQorI2lmIGRlZmluZWQoRk1DX0JhbmsxX1IpCisjZGVmaW5lIExMX0FIQjNfR1JQMV9QRVJJUEhfRk1DIFJDQ19BSEIzRU5SX0ZNQ0VOCisjZW5kaWYgLyogRk1DX0JhbmsxX1IgKi8KKyNpZiBkZWZpbmVkKFFVQURTUEkpCisjZGVmaW5lIExMX0FIQjNfR1JQMV9QRVJJUEhfUVNQSSBSQ0NfQUhCM0VOUl9RU1BJRU4KKyNlbmRpZiAvKiBRVUFEU1BJICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBCVVNfTExfRUNfQVBCMV9HUlAxX1BFUklQSCAgQVBCMSBHUlAxIFBFUklQSAorICogQHsKKyAqLworI2RlZmluZSBMTF9BUEIxX0dSUDFfUEVSSVBIX0FMTCAweEZGRkZGRkZGVQorI2RlZmluZSBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTIgUkNDX0FQQjFFTlIxX1RJTTJFTgorI2RlZmluZSBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTMgUkNDX0FQQjFFTlIxX1RJTTNFTgorI2RlZmluZSBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTQgUkNDX0FQQjFFTlIxX1RJTTRFTgorI2lmIGRlZmluZWQoVElNNSkKKyNkZWZpbmUgTExfQVBCMV9HUlAxX1BFUklQSF9USU01IFJDQ19BUEIxRU5SMV9USU01RU4KKyNlbmRpZiAvKiBUSU01ICovCisjZGVmaW5lIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNNiBSQ0NfQVBCMUVOUjFfVElNNkVOCisjZGVmaW5lIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNNyBSQ0NfQVBCMUVOUjFfVElNN0VOCisjZGVmaW5lIExMX0FQQjFfR1JQMV9QRVJJUEhfQ1JTIFJDQ19BUEIxRU5SMV9DUlNFTgorI2RlZmluZSBMTF9BUEIxX0dSUDFfUEVSSVBIX1JUQ0FQQiBSQ0NfQVBCMUVOUjFfUlRDQVBCRU4KKyNkZWZpbmUgTExfQVBCMV9HUlAxX1BFUklQSF9XV0RHIFJDQ19BUEIxRU5SMV9XV0RHRU4KKyNkZWZpbmUgTExfQVBCMV9HUlAxX1BFUklQSF9TUEkyIFJDQ19BUEIxRU5SMV9TUEkyRU4KKyNkZWZpbmUgTExfQVBCMV9HUlAxX1BFUklQSF9TUEkzIFJDQ19BUEIxRU5SMV9TUEkzRU4KKyNkZWZpbmUgTExfQVBCMV9HUlAxX1BFUklQSF9VU0FSVDIgUkNDX0FQQjFFTlIxX1VTQVJUMkVOCisjZGVmaW5lIExMX0FQQjFfR1JQMV9QRVJJUEhfVVNBUlQzIFJDQ19BUEIxRU5SMV9VU0FSVDNFTgorI2lmIGRlZmluZWQoVUFSVDQpCisjZGVmaW5lIExMX0FQQjFfR1JQMV9QRVJJUEhfVUFSVDQgUkNDX0FQQjFFTlIxX1VBUlQ0RU4KKyNlbmRpZiAvKiBVQVJUNCAqLworI2lmIGRlZmluZWQoVUFSVDUpCisjZGVmaW5lIExMX0FQQjFfR1JQMV9QRVJJUEhfVUFSVDUgUkNDX0FQQjFFTlIxX1VBUlQ1RU4KKyNlbmRpZiAvKiBVQVJUNSAqLworI2RlZmluZSBMTF9BUEIxX0dSUDFfUEVSSVBIX0kyQzEgUkNDX0FQQjFFTlIxX0kyQzFFTgorI2RlZmluZSBMTF9BUEIxX0dSUDFfUEVSSVBIX0kyQzIgUkNDX0FQQjFFTlIxX0kyQzJFTgorI2RlZmluZSBMTF9BUEIxX0dSUDFfUEVSSVBIX1VTQiBSQ0NfQVBCMUVOUjFfVVNCRU4KKyNpZiBkZWZpbmVkKEZEQ0FOMSkKKyNkZWZpbmUgTExfQVBCMV9HUlAxX1BFUklQSF9GRENBTiBSQ0NfQVBCMUVOUjFfRkRDQU5FTgorI2VuZGlmIC8qIEZEQ0FOMSAqLworI2RlZmluZSBMTF9BUEIxX0dSUDFfUEVSSVBIX1BXUiBSQ0NfQVBCMUVOUjFfUFdSRU4KKyNkZWZpbmUgTExfQVBCMV9HUlAxX1BFUklQSF9JMkMzIFJDQ19BUEIxRU5SMV9JMkMzRU4KKyNkZWZpbmUgTExfQVBCMV9HUlAxX1BFUklQSF9MUFRJTTEgUkNDX0FQQjFFTlIxX0xQVElNMUVOCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBCVVNfTExfRUNfQVBCMV9HUlAyX1BFUklQSCAgQVBCMSBHUlAyIFBFUklQSAorICogQHsKKyAqLworI2RlZmluZSBMTF9BUEIxX0dSUDJfUEVSSVBIX0FMTCAweEZGRkZGRkZGVQorI2RlZmluZSBMTF9BUEIxX0dSUDJfUEVSSVBIX0xQVUFSVDEgUkNDX0FQQjFFTlIyX0xQVUFSVDFFTgorI2lmIGRlZmluZWQoSTJDNCkKKyNkZWZpbmUgTExfQVBCMV9HUlAyX1BFUklQSF9JMkM0IFJDQ19BUEIxRU5SMl9JMkM0RU4KKyNlbmRpZiAvKiBJMkM0ICovCisjZGVmaW5lIExMX0FQQjFfR1JQMl9QRVJJUEhfVUNQRDEgUkNDX0FQQjFFTlIyX1VDUEQxRU4KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEJVU19MTF9FQ19BUEIyX0dSUDFfUEVSSVBIICBBUEIyIEdSUDEgUEVSSVBICisgKiBAeworICovCisjZGVmaW5lIExMX0FQQjJfR1JQMV9QRVJJUEhfQUxMIDB4RkZGRkZGRkZVCisjZGVmaW5lIExMX0FQQjJfR1JQMV9QRVJJUEhfU1lTQ0ZHIFJDQ19BUEIyRU5SX1NZU0NGR0VOCisjZGVmaW5lIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMSBSQ0NfQVBCMkVOUl9USU0xRU4KKyNkZWZpbmUgTExfQVBCMl9HUlAxX1BFUklQSF9TUEkxIFJDQ19BUEIyRU5SX1NQSTFFTgorI2RlZmluZSBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTggUkNDX0FQQjJFTlJfVElNOEVOCisjZGVmaW5lIExMX0FQQjJfR1JQMV9QRVJJUEhfVVNBUlQxIFJDQ19BUEIyRU5SX1VTQVJUMUVOCisjaWYgZGVmaW5lZChTUEk0KQorI2RlZmluZSBMTF9BUEIyX0dSUDFfUEVSSVBIX1NQSTQgUkNDX0FQQjJFTlJfU1BJNEVOCisjZW5kaWYgLyogU1BJNCAqLworI2RlZmluZSBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE1IFJDQ19BUEIyRU5SX1RJTTE1RU4KKyNkZWZpbmUgTExfQVBCMl9HUlAxX1BFUklQSF9USU0xNiBSQ0NfQVBCMkVOUl9USU0xNkVOCisjZGVmaW5lIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMTcgUkNDX0FQQjJFTlJfVElNMTdFTgorI2lmIGRlZmluZWQoVElNMjApCisjZGVmaW5lIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMjAgUkNDX0FQQjJFTlJfVElNMjBFTgorI2VuZGlmIC8qIFRJTTIwICovCisjZGVmaW5lIExMX0FQQjJfR1JQMV9QRVJJUEhfU0FJMSBSQ0NfQVBCMkVOUl9TQUkxRU4KKyNpZiBkZWZpbmVkKEhSVElNMSkKKyNkZWZpbmUgTExfQVBCMl9HUlAxX1BFUklQSF9IUlRJTTEgUkNDX0FQQjJFTlJfSFJUSU0xRU4KKyNlbmRpZiAvKiBIUlRJTTEgKi8KKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEJVU19MTF9FeHBvcnRlZF9GdW5jdGlvbnMgQlVTIEV4cG9ydGVkIEZ1bmN0aW9ucworICogQHsKKyAqLworCisvKiogQGRlZmdyb3VwIEJVU19MTF9FRl9BSEIxIEFIQjEKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBBSEIxIHBlcmlwaGVyYWxzIGNsb2NrLgorICogQHJtdG9sbCBBSEIxRU5SICAgICAgRE1BMUVOICAgICAgICBMTF9BSEIxX0dSUDFfRW5hYmxlQ2xvY2tcbgorICogICAgICAgICBBSEIxRU5SICAgICAgRE1BMkVOICAgICAgICBMTF9BSEIxX0dSUDFfRW5hYmxlQ2xvY2tcbgorICogICAgICAgICBBSEIxRU5SICAgICAgRE1BTU1VWEVOICAgICBMTF9BSEIxX0dSUDFfRW5hYmxlQ2xvY2tcbgorICogICAgICAgICBBSEIxRU5SICAgICAgQ09SRElDRU4gICAgICBMTF9BSEIxX0dSUDFfRW5hYmxlQ2xvY2tcbgorICogICAgICAgICBBSEIxRU5SICAgICAgRk1BQ0VOICAgICAgICBMTF9BSEIxX0dSUDFfRW5hYmxlQ2xvY2tcbgorICogICAgICAgICBBSEIxRU5SICAgICAgRkxBU0hFTiAgICAgICBMTF9BSEIxX0dSUDFfRW5hYmxlQ2xvY2tcbgorICogICAgICAgICBBSEIxRU5SICAgICAgQ1JDRU4gICAgICAgICBMTF9BSEIxX0dSUDFfRW5hYmxlQ2xvY2sKKyAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfRE1BMQorICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9ETUEyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0RNQU1VWDEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfQ09SRElDCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0ZNQUMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfRkxBU0gKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfQ1JDCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQUhCMV9HUlAxX0VuYWJsZUNsb2NrKHVpbnQzMl90IFBlcmlwaHMpIHsKKyAgX19JTyB1aW50MzJfdCB0bXByZWc7CisgIFNFVF9CSVQoUkNDLT5BSEIxRU5SLCBQZXJpcGhzKTsKKyAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8KKyAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BSEIxRU5SLCBQZXJpcGhzKTsKKyAgKHZvaWQpdG1wcmVnOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgQUhCMSBwZXJpcGhlcmFsIGNsb2NrIGlzIGVuYWJsZWQgb3Igbm90CisgKiBAcm10b2xsIEFIQjFFTlIgICAgICBETUExRU4gICAgICAgIExMX0FIQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgKiAgICAgICAgIEFIQjFFTlIgICAgICBETUEyRU4gICAgICAgIExMX0FIQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgKiAgICAgICAgIEFIQjFFTlIgICAgICBETUFNVVhFTiAgICAgIExMX0FIQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgKiAgICAgICAgIEFIQjFFTlIgICAgICBDT1JESUNFTiAgICAgIExMX0FIQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgKiAgICAgICAgIEFIQjFFTlIgICAgICBGTUFDRU4gICAgICAgIExMX0FIQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgKiAgICAgICAgIEFIQjFFTlIgICAgICBGTEFTSEVOICAgICAgIExMX0FIQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgKiAgICAgICAgIEFIQjFFTlIgICAgICBDUkNFTiAgICAgICAgIExMX0FIQjFfR1JQMV9Jc0VuYWJsZWRDbG9jaworICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9ETUExCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0RNQTIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfRE1BTVVYMQorICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9DT1JESUMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfRk1BQworICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9GTEFTSAorICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9DUkMKKyAqIEByZXR2YWwgU3RhdGUgb2YgUGVyaXBocyAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FIQjFfR1JQMV9Jc0VuYWJsZWRDbG9jayh1aW50MzJfdCBQZXJpcGhzKSB7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+QUhCMUVOUiwgUGVyaXBocykgPT0gUGVyaXBocykgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBBSEIxIHBlcmlwaGVyYWxzIGNsb2NrLgorICogQHJtdG9sbCBBSEIxRU5SICAgICAgRE1BMUVOICAgICAgICBMTF9BSEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAqICAgICAgICAgQUhCMUVOUiAgICAgIERNQTJFTiAgICAgICAgTExfQUhCMV9HUlAxX0Rpc2FibGVDbG9ja1xuCisgKiAgICAgICAgIEFIQjFFTlIgICAgICBETUFNVVhFTiAgICAgIExMX0FIQjFfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICogICAgICAgICBBSEIxRU5SICAgICAgQ09SRElDRU4gICAgICBMTF9BSEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAqICAgICAgICAgQUhCMUVOUiAgICAgIEZNQUNFTiAgICAgICAgTExfQUhCMV9HUlAxX0Rpc2FibGVDbG9ja1xuCisgKiAgICAgICAgIEFIQjFFTlIgICAgICBGTEFTSEVOICAgICAgIExMX0FIQjFfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICogICAgICAgICBBSEIxRU5SICAgICAgQ1JDRU4gICAgICAgICBMTF9BSEIxX0dSUDFfRGlzYWJsZUNsb2NrCisgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0RNQTEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfRE1BMgorICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9ETUFNVVgxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0NPUkRJQworICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9GTUFDCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0ZMQVNICisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0NSQworICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FIQjFfR1JQMV9EaXNhYmxlQ2xvY2sodWludDMyX3QgUGVyaXBocykgeworICBDTEVBUl9CSVQoUkNDLT5BSEIxRU5SLCBQZXJpcGhzKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEZvcmNlIEFIQjEgcGVyaXBoZXJhbHMgcmVzZXQuCisgKiBAcm10b2xsIEFIQjFSU1RSICAgICBETUExUlNUICAgICAgIExMX0FIQjFfR1JQMV9Gb3JjZVJlc2V0XG4KKyAqICAgICAgICAgQUhCMVJTVFIgICAgIERNQTJSU1QgICAgICAgTExfQUhCMV9HUlAxX0ZvcmNlUmVzZXRcbgorICogICAgICAgICBBSEIxUlNUUiAgICAgRE1BTVVYUlNUICAgICBMTF9BSEIxX0dSUDFfRm9yY2VSZXNldFxuCisgKiAgICAgICAgIEFIQjFSU1RSICAgICBDT1JESUNSU1QgICAgIExMX0FIQjFfR1JQMV9Gb3JjZVJlc2V0XG4KKyAqICAgICAgICAgQUhCMVJTVFIgICAgIEZNQUNSU1QgICAgICAgTExfQUhCMV9HUlAxX0ZvcmNlUmVzZXRcbgorICogICAgICAgICBBSEIxUlNUUiAgICAgRkxBU0hSU1QgICAgICBMTF9BSEIxX0dSUDFfRm9yY2VSZXNldFxuCisgKiAgICAgICAgIEFIQjFSU1RSICAgICBDUkNSU1QgICAgICAgIExMX0FIQjFfR1JQMV9Gb3JjZVJlc2V0CisgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0FMTAorICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9ETUExCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0RNQTIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfRE1BTVVYMQorICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9DT1JESUMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfRk1BQworICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9GTEFTSAorICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9DUkMKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BSEIxX0dSUDFfRm9yY2VSZXNldCh1aW50MzJfdCBQZXJpcGhzKSB7CisgIFNFVF9CSVQoUkNDLT5BSEIxUlNUUiwgUGVyaXBocyk7Cit9CisKKy8qKgorICogQGJyaWVmICBSZWxlYXNlIEFIQjEgcGVyaXBoZXJhbHMgcmVzZXQuCisgKiBAcm10b2xsIEFIQjFSU1RSICAgICBETUExUlNUICAgICAgIExMX0FIQjFfR1JQMV9SZWxlYXNlUmVzZXRcbgorICogICAgICAgICBBSEIxUlNUUiAgICAgRE1BMlJTVCAgICAgICBMTF9BSEIxX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAqICAgICAgICAgQUhCMVJTVFIgICAgIERNQU1VWFJTVCAgICAgTExfQUhCMV9HUlAxX1JlbGVhc2VSZXNldFxuCisgKiAgICAgICAgIEFIQjFSU1RSICAgICBDT1JESUNSU1QgICAgIExMX0FIQjFfR1JQMV9SZWxlYXNlUmVzZXRcbgorICogICAgICAgICBBSEIxUlNUUiAgICAgRk1BQ1JTVCAgICAgICBMTF9BSEIxX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAqICAgICAgICAgQUhCMVJTVFIgICAgIEZMQVNIUlNUICAgICAgTExfQUhCMV9HUlAxX1JlbGVhc2VSZXNldFxuCisgKiAgICAgICAgIEFIQjFSU1RSICAgICBDUkNSU1QgICAgICAgIExMX0FIQjFfR1JQMV9SZWxlYXNlUmVzZXQKKyAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfQUxMCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0RNQTEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfRE1BMgorICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9ETUFNVVgxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0NPUkRJQworICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9GTUFDCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0ZMQVNICisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0NSQworICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FIQjFfR1JQMV9SZWxlYXNlUmVzZXQodWludDMyX3QgUGVyaXBocykgeworICBDTEVBUl9CSVQoUkNDLT5BSEIxUlNUUiwgUGVyaXBocyk7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgQUhCMSBwZXJpcGhlcmFsIGNsb2NrcyBpbiBTbGVlcCBhbmQgU3RvcCBtb2RlcworICogQHJtdG9sbCBBSEIxU01FTlIgICAgRE1BMVNNRU4gICAgICBMTF9BSEIxX0dSUDFfRW5hYmxlQ2xvY2tTdG9wU2xlZXBcbgorICogICAgICAgICBBSEIxU01FTlIgICAgRE1BMlNNRU4gICAgICBMTF9BSEIxX0dSUDFfRW5hYmxlQ2xvY2tTdG9wU2xlZXBcbgorICogICAgICAgICBBSEIxU01FTlIgICAgRE1BTVVYU01FTiAgICBMTF9BSEIxX0dSUDFfRW5hYmxlQ2xvY2tTdG9wU2xlZXBcbgorICogICAgICAgICBBSEIxU01FTlIgICAgQ09SRElDU01FTiAgICBMTF9BSEIxX0dSUDFfRW5hYmxlQ2xvY2tTdG9wU2xlZXBcbgorICogICAgICAgICBBSEIxU01FTlIgICAgRk1BQ1NNRU4gICAgICBMTF9BSEIxX0dSUDFfRW5hYmxlQ2xvY2tTdG9wU2xlZXBcbgorICogICAgICAgICBBSEIxU01FTlIgICAgRkxBU0hTTUVOICAgICBMTF9BSEIxX0dSUDFfRW5hYmxlQ2xvY2tTdG9wU2xlZXBcbgorICogICAgICAgICBBSEIxU01FTlIgICAgU1JBTTFTTUVOICAgICBMTF9BSEIxX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAqICAgICAgICAgQUhCMVNNRU5SICAgIENSQ1NNRU4gICAgICAgTExfQUhCMV9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwCisgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0RNQTEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfRE1BMgorICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9ETUFNVVgxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0NPUkRJQworICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9GTUFDCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0ZMQVNICisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX1NSQU0xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0NSQworICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FIQjFfR1JQMV9FbmFibGVDbG9ja1N0b3BTbGVlcCh1aW50MzJfdCBQZXJpcGhzKSB7CisgIF9fSU8gdWludDMyX3QgdG1wcmVnOworICBTRVRfQklUKFJDQy0+QUhCMVNNRU5SLCBQZXJpcGhzKTsKKyAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8KKyAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BSEIxU01FTlIsIFBlcmlwaHMpOworICAodm9pZCl0bXByZWc7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIEFIQjEgcGVyaXBoZXJhbCBjbG9ja3MgaW4gU2xlZXAgYW5kIFN0b3AgbW9kZXMKKyAqIEBybXRvbGwgQUhCMVNNRU5SICAgIERNQTFTTUVOICAgICAgTExfQUhCMV9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuCisgKiAgICAgICAgIEFIQjFTTUVOUiAgICBETUEyU01FTiAgICAgIExMX0FIQjFfR1JQMV9EaXNhYmxlQ2xvY2tTdG9wU2xlZXBcbgorICogICAgICAgICBBSEIxU01FTlIgICAgRE1BTVVYU01FTiAgICBMTF9BSEIxX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAqICAgICAgICAgQUhCMVNNRU5SICAgIENPUkRJQ1NNRU4gICAgTExfQUhCMV9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuCisgKiAgICAgICAgIEFIQjFTTUVOUiAgICBGTUFDU01FTiAgICAgIExMX0FIQjFfR1JQMV9EaXNhYmxlQ2xvY2tTdG9wU2xlZXBcbgorICogICAgICAgICBBSEIxU01FTlIgICAgRkxBU0hTTUVOICAgICBMTF9BSEIxX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAqICAgICAgICAgQUhCMVNNRU5SICAgIFNSQU0xU01FTiAgICAgTExfQUhCMV9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuCisgKiAgICAgICAgIEFIQjFTTUVOUiAgICBDUkNTTUVOICAgICAgIExMX0FIQjFfR1JQMV9EaXNhYmxlQ2xvY2tTdG9wU2xlZXAKKyAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfRE1BMQorICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9ETUEyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0RNQU1VWDEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfQ09SRElDCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0ZNQUMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfRkxBU0gKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfU1JBTTEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfQ1JDCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQUhCMV9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcCh1aW50MzJfdCBQZXJpcGhzKSB7CisgIENMRUFSX0JJVChSQ0MtPkFIQjFTTUVOUiwgUGVyaXBocyk7Cit9CisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEJVU19MTF9FRl9BSEIyIEFIQjIKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBBSEIyIHBlcmlwaGVyYWxzIGNsb2NrLgorICogQHJtdG9sbCBBSEIyRU5SICAgICAgR1BJT0FFTiAgICAgICBMTF9BSEIyX0dSUDFfRW5hYmxlQ2xvY2tcbgorICogICAgICAgICBBSEIyRU5SICAgICAgR1BJT0JFTiAgICAgICBMTF9BSEIyX0dSUDFfRW5hYmxlQ2xvY2tcbgorICogICAgICAgICBBSEIyRU5SICAgICAgR1BJT0NFTiAgICAgICBMTF9BSEIyX0dSUDFfRW5hYmxlQ2xvY2tcbgorICogICAgICAgICBBSEIyRU5SICAgICAgR1BJT0RFTiAgICAgICBMTF9BSEIyX0dSUDFfRW5hYmxlQ2xvY2tcbgorICogICAgICAgICBBSEIyRU5SICAgICAgR1BJT0VFTiAgICAgICBMTF9BSEIyX0dSUDFfRW5hYmxlQ2xvY2tcbgorICogICAgICAgICBBSEIyRU5SICAgICAgR1BJT0ZFTiAgICAgICBMTF9BSEIyX0dSUDFfRW5hYmxlQ2xvY2tcbgorICogICAgICAgICBBSEIyRU5SICAgICAgR1BJT0dFTiAgICAgICBMTF9BSEIyX0dSUDFfRW5hYmxlQ2xvY2tcbgorICogICAgICAgICBBSEIyRU5SICAgICAgQURDMTJFTiAgICAgICBMTF9BSEIyX0dSUDFfRW5hYmxlQ2xvY2tcbgorICogICAgICAgICBBSEIyRU5SICAgICAgQURDMzQ1RU4gICAgICBMTF9BSEIyX0dSUDFfRW5hYmxlQ2xvY2tcbgorICogICAgICAgICBBSEIyRU5SICAgICAgREFDMUVOICAgICAgICBMTF9BSEIyX0dSUDFfRW5hYmxlQ2xvY2tcbgorICogICAgICAgICBBSEIyRU5SICAgICAgREFDMkVOICAgICAgICBMTF9BSEIyX0dSUDFfRW5hYmxlQ2xvY2tcbgorICogICAgICAgICBBSEIyRU5SICAgICAgREFDM0VOICAgICAgICBMTF9BSEIyX0dSUDFfRW5hYmxlQ2xvY2tcbgorICogICAgICAgICBBSEIyRU5SICAgICAgREFDNEVOICAgICAgICBMTF9BSEIyX0dSUDFfRW5hYmxlQ2xvY2tcbgorICogICAgICAgICBBSEIyRU5SICAgICAgQUVTRU4gICAgICAgICBMTF9BSEIyX0dSUDFfRW5hYmxlQ2xvY2tcbgorICogICAgICAgICBBSEIyRU5SICAgICAgUk5HRU4gICAgICAgICBMTF9BSEIyX0dSUDFfRW5hYmxlQ2xvY2sKKyAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0EKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0IKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0MKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0QKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0UKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0YKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0cKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfQURDMTIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfQURDMzQ1ICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9EQUMxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0RBQzIgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0RBQzMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfREFDNCAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfQUVTICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9STkcKKyAqCisgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4KKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BSEIyX0dSUDFfRW5hYmxlQ2xvY2sodWludDMyX3QgUGVyaXBocykgeworICBfX0lPIHVpbnQzMl90IHRtcHJlZzsKKyAgU0VUX0JJVChSQ0MtPkFIQjJFTlIsIFBlcmlwaHMpOworICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLworICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFIQjJFTlIsIFBlcmlwaHMpOworICAodm9pZCl0bXByZWc7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiBBSEIyIHBlcmlwaGVyYWwgY2xvY2sgaXMgZW5hYmxlZCBvciBub3QKKyAqIEBybXRvbGwgQUhCMkVOUiAgICAgIEdQSU9BRU4gICAgICAgTExfQUhCMl9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAqICAgICAgICAgQUhCMkVOUiAgICAgIEdQSU9CRU4gICAgICAgTExfQUhCMl9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAqICAgICAgICAgQUhCMkVOUiAgICAgIEdQSU9DRU4gICAgICAgTExfQUhCMl9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAqICAgICAgICAgQUhCMkVOUiAgICAgIEdQSU9ERU4gICAgICAgTExfQUhCMl9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAqICAgICAgICAgQUhCMkVOUiAgICAgIEdQSU9FRU4gICAgICAgTExfQUhCMl9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAqICAgICAgICAgQUhCMkVOUiAgICAgIEdQSU9GRU4gICAgICAgTExfQUhCMl9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAqICAgICAgICAgQUhCMkVOUiAgICAgIEdQSU9HRU4gICAgICAgTExfQUhCMl9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAqICAgICAgICAgQUhCMkVOUiAgICAgIEFEQzEyRU4gICAgICAgTExfQUhCMl9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAqICAgICAgICAgQUhCMkVOUiAgICAgIEFEQzM0NUVOICAgICAgTExfQUhCMl9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAqICAgICAgICAgQUhCMkVOUiAgICAgIERBQzFFTiAgICAgICAgTExfQUhCMl9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAqICAgICAgICAgQUhCMkVOUiAgICAgIERBQzJFTiAgICAgICAgTExfQUhCMl9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAqICAgICAgICAgQUhCMkVOUiAgICAgIERBQzNFTiAgICAgICAgTExfQUhCMl9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAqICAgICAgICAgQUhCMkVOUiAgICAgIERBQzRFTiAgICAgICAgTExfQUhCMl9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAqICAgICAgICAgQUhCMkVOUiAgICAgIEFFU0VOICAgICAgICAgTExfQUhCMl9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAqICAgICAgICAgQUhCMkVOUiAgICAgIFJOR0VOICAgICAgICAgTExfQUhCMl9HUlAxX0lzRW5hYmxlZENsb2NrCisgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9BCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9CCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9DCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9ECisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9FCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9GCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9HCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0FEQzEyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0FEQzM0NSAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfREFDMQorICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9EQUMyICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9EQUMzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0RBQzQgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0FFUyAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfUk5HCisgKgorICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuCisgKiBAcmV0dmFsIFN0YXRlIG9mIFBlcmlwaHMgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BSEIyX0dSUDFfSXNFbmFibGVkQ2xvY2sodWludDMyX3QgUGVyaXBocykgeworICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkFIQjJFTlIsIFBlcmlwaHMpID09IFBlcmlwaHMpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgQUhCMiBwZXJpcGhlcmFscyBjbG9jay4KKyAqIEBybXRvbGwgQUhCMkVOUiAgICAgIEdQSU9BRU4gICAgICAgTExfQUhCMl9HUlAxX0Rpc2FibGVDbG9ja1xuCisgKiAgICAgICAgIEFIQjJFTlIgICAgICBHUElPQkVOICAgICAgIExMX0FIQjJfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICogICAgICAgICBBSEIyRU5SICAgICAgR1BJT0NFTiAgICAgICBMTF9BSEIyX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAqICAgICAgICAgQUhCMkVOUiAgICAgIEdQSU9ERU4gICAgICAgTExfQUhCMl9HUlAxX0Rpc2FibGVDbG9ja1xuCisgKiAgICAgICAgIEFIQjJFTlIgICAgICBHUElPRUVOICAgICAgIExMX0FIQjJfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICogICAgICAgICBBSEIyRU5SICAgICAgR1BJT0ZFTiAgICAgICBMTF9BSEIyX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAqICAgICAgICAgQUhCMkVOUiAgICAgIEdQSU9HRU4gICAgICAgTExfQUhCMl9HUlAxX0Rpc2FibGVDbG9ja1xuCisgKiAgICAgICAgIEFIQjJFTlIgICAgICBBREMxMkVOICAgICAgIExMX0FIQjJfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICogICAgICAgICBBSEIyRU5SICAgICAgQURDMzQ1RU4gICAgICBMTF9BSEIyX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAqICAgICAgICAgQUhCMkVOUiAgICAgIERBQzFFTiAgICAgICAgTExfQUhCMl9HUlAxX0Rpc2FibGVDbG9ja1xuCisgKiAgICAgICAgIEFIQjJFTlIgICAgICBEQUMyRU4gICAgICAgIExMX0FIQjJfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICogICAgICAgICBBSEIyRU5SICAgICAgREFDM0VOICAgICAgICBMTF9BSEIyX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAqICAgICAgICAgQUhCMkVOUiAgICAgIERBQzRFTiAgICAgICAgTExfQUhCMl9HUlAxX0Rpc2FibGVDbG9ja1xuCisgKiAgICAgICAgIEFIQjJFTlIgICAgICBBRVNFTiAgICAgICAgIExMX0FIQjJfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICogICAgICAgICBBSEIyRU5SICAgICAgUk5HRU4gICAgICAgICBMTF9BSEIyX0dSUDFfRGlzYWJsZUNsb2NrCisgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9BCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9CCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9DCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9ECisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9FCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9GCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9HCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0FEQzEyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0FEQzM0NSAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfREFDMQorICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9EQUMyICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9EQUMzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0RBQzQgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0FFUyAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfUk5HCisgKgorICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQUhCMl9HUlAxX0Rpc2FibGVDbG9jayh1aW50MzJfdCBQZXJpcGhzKSB7CisgIENMRUFSX0JJVChSQ0MtPkFIQjJFTlIsIFBlcmlwaHMpOworfQorCisvKioKKyAqIEBicmllZiAgRm9yY2UgQUhCMiBwZXJpcGhlcmFscyByZXNldC4KKyAqIEBybXRvbGwgQUhCMlJTVFIgICAgICBHUElPQVJTVCAgICAgICBMTF9BSEIyX0dSUDFfRm9yY2VSZXNldFxuCisgKiAgICAgICAgIEFIQjJSU1RSICAgICAgR1BJT0JSU1QgICAgICAgTExfQUhCMl9HUlAxX0ZvcmNlUmVzZXRcbgorICogICAgICAgICBBSEIyUlNUUiAgICAgIEdQSU9DUlNUICAgICAgIExMX0FIQjJfR1JQMV9Gb3JjZVJlc2V0XG4KKyAqICAgICAgICAgQUhCMlJTVFIgICAgICBHUElPRFJTVCAgICAgICBMTF9BSEIyX0dSUDFfRm9yY2VSZXNldFxuCisgKiAgICAgICAgIEFIQjJSU1RSICAgICAgR1BJT0VSU1QgICAgICAgTExfQUhCMl9HUlAxX0ZvcmNlUmVzZXRcbgorICogICAgICAgICBBSEIyUlNUUiAgICAgIEdQSU9GUlNUICAgICAgIExMX0FIQjJfR1JQMV9Gb3JjZVJlc2V0XG4KKyAqICAgICAgICAgQUhCMlJTVFIgICAgICBHUElPR1JTVCAgICAgICBMTF9BSEIyX0dSUDFfRm9yY2VSZXNldFxuCisgKiAgICAgICAgIEFIQjJSU1RSICAgICAgQURDMTJSU1QgICAgICAgTExfQUhCMl9HUlAxX0ZvcmNlUmVzZXRcbgorICogICAgICAgICBBSEIyUlNUUiAgICAgIEFEQzM0NVJTVCAgICAgIExMX0FIQjJfR1JQMV9Gb3JjZVJlc2V0XG4KKyAqICAgICAgICAgQUhCMlJTVFIgICAgICBEQUMxUlNUICAgICAgICBMTF9BSEIyX0dSUDFfRm9yY2VSZXNldFxuCisgKiAgICAgICAgIEFIQjJSU1RSICAgICAgREFDMlJTVCAgICAgICAgTExfQUhCMl9HUlAxX0ZvcmNlUmVzZXRcbgorICogICAgICAgICBBSEIyUlNUUiAgICAgIERBQzNSU1QgICAgICAgIExMX0FIQjJfR1JQMV9Gb3JjZVJlc2V0XG4KKyAqICAgICAgICAgQUhCMlJTVFIgICAgICBEQUM0UlNUICAgICAgICBMTF9BSEIyX0dSUDFfRm9yY2VSZXNldFxuCisgKiAgICAgICAgIEFIQjJSU1RSICAgICAgQUVTUlNUICAgICAgICAgTExfQUhCMl9HUlAxX0ZvcmNlUmVzZXRcbgorICogICAgICAgICBBSEIyUlNUUiAgICAgIFJOR1JTVCAgICAgICAgIExMX0FIQjJfR1JQMV9Gb3JjZVJlc2V0CisgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9BCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9CCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9DCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9ECisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9FCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9GCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9HCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0FEQzEyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0FEQzM0NSAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfREFDMQorICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9EQUMyICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9EQUMzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0RBQzQgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0FFUyAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfUk5HCisgKgorICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQUhCMl9HUlAxX0ZvcmNlUmVzZXQodWludDMyX3QgUGVyaXBocykgeworICBTRVRfQklUKFJDQy0+QUhCMlJTVFIsIFBlcmlwaHMpOworfQorCisvKioKKyAqIEBicmllZiAgUmVsZWFzZSBBSEIyIHBlcmlwaGVyYWxzIHJlc2V0LgorICogQHJtdG9sbCBBSEIyUlNUUiAgICAgIEdQSU9BUlNUICAgICAgIExMX0FIQjJfR1JQMV9SZWxlYXNlUmVzZXRcbgorICogICAgICAgICBBSEIyUlNUUiAgICAgIEdQSU9CUlNUICAgICAgIExMX0FIQjJfR1JQMV9SZWxlYXNlUmVzZXRcbgorICogICAgICAgICBBSEIyUlNUUiAgICAgIEdQSU9DUlNUICAgICAgIExMX0FIQjJfR1JQMV9SZWxlYXNlUmVzZXRcbgorICogICAgICAgICBBSEIyUlNUUiAgICAgIEdQSU9EUlNUICAgICAgIExMX0FIQjJfR1JQMV9SZWxlYXNlUmVzZXRcbgorICogICAgICAgICBBSEIyUlNUUiAgICAgIEdQSU9FUlNUICAgICAgIExMX0FIQjJfR1JQMV9SZWxlYXNlUmVzZXRcbgorICogICAgICAgICBBSEIyUlNUUiAgICAgIEdQSU9GUlNUICAgICAgIExMX0FIQjJfR1JQMV9SZWxlYXNlUmVzZXRcbgorICogICAgICAgICBBSEIyUlNUUiAgICAgIEdQSU9HUlNUICAgICAgIExMX0FIQjJfR1JQMV9SZWxlYXNlUmVzZXRcbgorICogICAgICAgICBBSEIyUlNUUiAgICAgIEFEQzEyUlNUICAgICAgIExMX0FIQjJfR1JQMV9SZWxlYXNlUmVzZXRcbgorICogICAgICAgICBBSEIyUlNUUiAgICAgIEFEQzM0NVJTVCAgICAgIExMX0FIQjJfR1JQMV9SZWxlYXNlUmVzZXRcbgorICogICAgICAgICBBSEIyUlNUUiAgICAgIERBQzFSU1QgICAgICAgIExMX0FIQjJfR1JQMV9SZWxlYXNlUmVzZXRcbgorICogICAgICAgICBBSEIyUlNUUiAgICAgIERBQzJSU1QgICAgICAgIExMX0FIQjJfR1JQMV9SZWxlYXNlUmVzZXRcbgorICogICAgICAgICBBSEIyUlNUUiAgICAgIERBQzNSU1QgICAgICAgIExMX0FIQjJfR1JQMV9SZWxlYXNlUmVzZXRcbgorICogICAgICAgICBBSEIyUlNUUiAgICAgIERBQzRSU1QgICAgICAgIExMX0FIQjJfR1JQMV9SZWxlYXNlUmVzZXRcbgorICogICAgICAgICBBSEIyUlNUUiAgICAgIEFFU1JTVCAgICAgICAgIExMX0FIQjJfR1JQMV9SZWxlYXNlUmVzZXRcbgorICogICAgICAgICBBSEIyUlNUUiAgICAgIFJOR1JTVCAgICAgICAgIExMX0FIQjJfR1JQMV9SZWxlYXNlUmVzZXQKKyAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0EKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0IKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0MKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0QKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0UKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0YKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0cKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfQURDMTIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfQURDMzQ1ICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9EQUMxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0RBQzIgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0RBQzMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfREFDNCAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfQUVTICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9STkcKKyAqCisgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4KKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BSEIyX0dSUDFfUmVsZWFzZVJlc2V0KHVpbnQzMl90IFBlcmlwaHMpIHsKKyAgQ0xFQVJfQklUKFJDQy0+QUhCMlJTVFIsIFBlcmlwaHMpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIEFIQjIgcGVyaXBoZXJhbCBjbG9ja3MgaW4gU2xlZXAgYW5kIFN0b3AgbW9kZXMKKyAqIEBybXRvbGwgQUhCMlNNRU5SICAgIEdQSU9BU01FTiAgICAgTExfQUhCMl9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAqICAgICAgICAgQUhCMlNNRU5SICAgIEdQSU9CU01FTiAgICAgTExfQUhCMl9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAqICAgICAgICAgQUhCMlNNRU5SICAgIEdQSU9DU01FTiAgICAgTExfQUhCMl9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAqICAgICAgICAgQUhCMlNNRU5SICAgIEdQSU9EU01FTiAgICAgTExfQUhCMl9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAqICAgICAgICAgQUhCMlNNRU5SICAgIEdQSU9FU01FTiAgICAgTExfQUhCMl9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAqICAgICAgICAgQUhCMlNNRU5SICAgIEdQSU9GU01FTiAgICAgTExfQUhCMl9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAqICAgICAgICAgQUhCMlNNRU5SICAgIEdQSU9HU01FTiAgICAgTExfQUhCMl9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAqICAgICAgICAgQUhCMlNNRU5SICAgIFNSQU0yU01FTiAgICAgTExfQUhCMl9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAqICAgICAgICAgQUhCMlNNRU5SICAgIENDTVNNRU4gICAgICAgTExfQUhCMl9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAqICAgICAgICAgQUhCMlNNRU5SICAgIEFEQzEyU01FTiAgICAgTExfQUhCMl9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAqICAgICAgICAgQUhCMlNNRU5SICAgIEFEQzM0NVNNRU4gICAgTExfQUhCMl9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAqICAgICAgICAgQUhCMlNNRU5SICAgIERBQzFTTUVOICAgICAgTExfQUhCMl9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAqICAgICAgICAgQUhCMlNNRU5SICAgIERBQzJTTUVOICAgICAgTExfQUhCMl9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAqICAgICAgICAgQUhCMlNNRU5SICAgIERBQzNTTUVOICAgICAgTExfQUhCMl9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAqICAgICAgICAgQUhCMlNNRU5SICAgIERBQzRTTUVOICAgICAgTExfQUhCMl9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAqICAgICAgICAgQUhCMlNNRU5SICAgIEFFU1NNRU4gICAgICAgTExfQUhCMl9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAqICAgICAgICAgQUhCMlNNRU5SICAgIFJOR1NNRU4gICAgICAgTExfQUhCMl9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwCisgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9BCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9CCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9DCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9ECisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9FCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9GCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9HCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX1NSQU0yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0NDTQorICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9BREMxMgorICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9BREMzNDUgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0RBQzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfREFDMiAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfREFDMworICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9EQUM0ICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9BRVMgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX1JORworICoKKyAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FIQjJfR1JQMV9FbmFibGVDbG9ja1N0b3BTbGVlcCh1aW50MzJfdCBQZXJpcGhzKSB7CisgIF9fSU8gdWludDMyX3QgdG1wcmVnOworICBTRVRfQklUKFJDQy0+QUhCMlNNRU5SLCBQZXJpcGhzKTsKKyAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8KKyAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BSEIyU01FTlIsIFBlcmlwaHMpOworICAodm9pZCl0bXByZWc7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIEFIQjIgcGVyaXBoZXJhbCBjbG9ja3MgaW4gU2xlZXAgYW5kIFN0b3AgbW9kZXMKKyAqIEBybXRvbGwgQUhCMlNNRU5SICAgIEdQSU9BU01FTiAgICAgTExfQUhCMl9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuCisgKiAgICAgICAgIEFIQjJTTUVOUiAgICBHUElPQlNNRU4gICAgIExMX0FIQjJfR1JQMV9EaXNhYmxlQ2xvY2tTdG9wU2xlZXBcbgorICogICAgICAgICBBSEIyU01FTlIgICAgR1BJT0NTTUVOICAgICBMTF9BSEIyX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAqICAgICAgICAgQUhCMlNNRU5SICAgIEdQSU9EU01FTiAgICAgTExfQUhCMl9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuCisgKiAgICAgICAgIEFIQjJTTUVOUiAgICBHUElPRVNNRU4gICAgIExMX0FIQjJfR1JQMV9EaXNhYmxlQ2xvY2tTdG9wU2xlZXBcbgorICogICAgICAgICBBSEIyU01FTlIgICAgR1BJT0ZTTUVOICAgICBMTF9BSEIyX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAqICAgICAgICAgQUhCMlNNRU5SICAgIEdQSU9HU01FTiAgICAgTExfQUhCMl9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuCisgKiAgICAgICAgIEFIQjJTTUVOUiAgICBTUkFNMlNNRU4gICAgIExMX0FIQjJfR1JQMV9EaXNhYmxlQ2xvY2tTdG9wU2xlZXBcbgorICogICAgICAgICBBSEIyU01FTlIgICAgQ0NNU01FTiAgICAgICBMTF9BSEIyX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAqICAgICAgICAgQUhCMlNNRU5SICAgIEFEQzEyU01FTiAgICAgTExfQUhCMl9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuCisgKiAgICAgICAgIEFIQjJTTUVOUiAgICBBREMzNDVTTUVOICAgIExMX0FIQjJfR1JQMV9EaXNhYmxlQ2xvY2tTdG9wU2xlZXBcbgorICogICAgICAgICBBSEIyU01FTlIgICAgREFDMVNNRU4gICAgICBMTF9BSEIyX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAqICAgICAgICAgQUhCMlNNRU5SICAgIERBQzJTTUVOICAgICAgTExfQUhCMl9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuCisgKiAgICAgICAgIEFIQjJTTUVOUiAgICBEQUMzU01FTiAgICAgIExMX0FIQjJfR1JQMV9EaXNhYmxlQ2xvY2tTdG9wU2xlZXBcbgorICogICAgICAgICBBSEIyU01FTlIgICAgREFDNFNNRU4gICAgICBMTF9BSEIyX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAqICAgICAgICAgQUhCMlNNRU5SICAgIEFFU1NNRU4gICAgICAgTExfQUhCMl9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuCisgKiAgICAgICAgIEFIQjJTTUVOUiAgICBSTkdTTUVOICAgICAgIExMX0FIQjJfR1JQMV9EaXNhYmxlQ2xvY2tTdG9wU2xlZXAKKyAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0EKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0IKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0MKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0QKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0UKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0YKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0cKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfU1JBTTIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfQ0NNCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0FEQzEyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0FEQzM0NSAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfREFDMQorICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9EQUMyICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9EQUMzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0RBQzQgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0FFUyAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfUk5HCisgKgorICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQUhCMl9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcCh1aW50MzJfdCBQZXJpcGhzKSB7CisgIENMRUFSX0JJVChSQ0MtPkFIQjJTTUVOUiwgUGVyaXBocyk7Cit9CisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEJVU19MTF9FRl9BSEIzIEFIQjMKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBBSEIzIHBlcmlwaGVyYWxzIGNsb2NrLgorICogQHJtdG9sbCBBSEIzRU5SICAgICAgRk1DRU4gICAgICAgICBMTF9BSEIzX0dSUDFfRW5hYmxlQ2xvY2tcbgorICogICAgICAgICBBSEIzRU5SICAgICAgUVNQSUVOICAgICAgICBMTF9BSEIzX0dSUDFfRW5hYmxlQ2xvY2sKKyAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjNfR1JQMV9QRVJJUEhfRk1DICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfQUhCM19HUlAxX1BFUklQSF9RU1BJICgqKQorICoKKyAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FIQjNfR1JQMV9FbmFibGVDbG9jayh1aW50MzJfdCBQZXJpcGhzKSB7CisgIF9fSU8gdWludDMyX3QgdG1wcmVnOworICBTRVRfQklUKFJDQy0+QUhCM0VOUiwgUGVyaXBocyk7CisgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovCisgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QUhCM0VOUiwgUGVyaXBocyk7CisgICh2b2lkKXRtcHJlZzsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIEFIQjMgcGVyaXBoZXJhbCBjbG9jayBpcyBlbmFibGVkIG9yIG5vdAorICogQHJtdG9sbCBBSEIzRU5SICAgICAgRk1DRU4gICAgICAgICBMTF9BSEIzX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICogICAgICAgICBBSEIzRU5SICAgICAgUVNQSUVOICAgICAgICBMTF9BSEIzX0dSUDFfSXNFbmFibGVkQ2xvY2sKKyAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjNfR1JQMV9QRVJJUEhfRk1DICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfQUhCM19HUlAxX1BFUklQSF9RU1BJICgqKQorICoKKyAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICogQHJldHZhbCBTdGF0ZSBvZiBQZXJpcGhzICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQUhCM19HUlAxX0lzRW5hYmxlZENsb2NrKHVpbnQzMl90IFBlcmlwaHMpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5BSEIzRU5SLCBQZXJpcGhzKSA9PSBQZXJpcGhzKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIEFIQjMgcGVyaXBoZXJhbHMgY2xvY2suCisgKiBAcm10b2xsIEFIQjNFTlIgICAgICBGTUNFTiAgICAgICAgIExMX0FIQjNfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICogICAgICAgICBBSEIzRU5SICAgICAgUVNQSUVOICAgICAgICBMTF9BSEIzX0dSUDFfRGlzYWJsZUNsb2NrCisgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIzX0dSUDFfUEVSSVBIX0ZNQyAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjNfR1JQMV9QRVJJUEhfUVNQSSAoKikKKyAqCisgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4KKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BSEIzX0dSUDFfRGlzYWJsZUNsb2NrKHVpbnQzMl90IFBlcmlwaHMpIHsKKyAgQ0xFQVJfQklUKFJDQy0+QUhCM0VOUiwgUGVyaXBocyk7Cit9CisKKy8qKgorICogQGJyaWVmICBGb3JjZSBBSEIzIHBlcmlwaGVyYWxzIHJlc2V0LgorICogQHJtdG9sbCBBSEIzUlNUUiAgICAgRk1DUlNUICAgICAgICBMTF9BSEIzX0dSUDFfRm9yY2VSZXNldFxuCisgKiAgICAgICAgIEFIQjNSU1RSICAgICBRU1BJUlNUICAgICAgIExMX0FIQjNfR1JQMV9Gb3JjZVJlc2V0CisgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIzX0dSUDFfUEVSSVBIX0FMTAorICogICAgICAgICBAYXJnIEByZWYgTExfQUhCM19HUlAxX1BFUklQSF9GTUMgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIzX0dSUDFfUEVSSVBIX1FTUEkgKCopCisgKgorICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQUhCM19HUlAxX0ZvcmNlUmVzZXQodWludDMyX3QgUGVyaXBocykgeworICBTRVRfQklUKFJDQy0+QUhCM1JTVFIsIFBlcmlwaHMpOworfQorCisvKioKKyAqIEBicmllZiAgUmVsZWFzZSBBSEIzIHBlcmlwaGVyYWxzIHJlc2V0LgorICogQHJtdG9sbCBBSEIzUlNUUiAgICAgRk1DUlNUICAgICAgICBMTF9BSEIzX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAqICAgICAgICAgQUhCM1JTVFIgICAgIFFTUElSU1QgICAgICAgTExfQUhCM19HUlAxX1JlbGVhc2VSZXNldAorICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQUhCM19HUlAxX1BFUklQSF9BTEwKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjNfR1JQMV9QRVJJUEhfRk1DICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfQUhCM19HUlAxX1BFUklQSF9RU1BJICgqKQorICoKKyAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FIQjNfR1JQMV9SZWxlYXNlUmVzZXQodWludDMyX3QgUGVyaXBocykgeworICBDTEVBUl9CSVQoUkNDLT5BSEIzUlNUUiwgUGVyaXBocyk7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgQUhCMyBwZXJpcGhlcmFsIGNsb2NrcyBpbiBTbGVlcCBhbmQgU3RvcCBtb2RlcworICogQHJtdG9sbCBBSEIzU01FTlIgICAgRk1DU01FTiAgICAgICBMTF9BSEIzX0dSUDFfRW5hYmxlQ2xvY2tTdG9wU2xlZXBcbgorICogICAgICAgICBBSEIzU01FTlIgICAgUVNQSVNNRU4gICAgICBMTF9BSEIzX0dSUDFfRW5hYmxlQ2xvY2tTdG9wU2xlZXAKKyAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjNfR1JQMV9QRVJJUEhfRk1DICAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjNfR1JQMV9QRVJJUEhfUVNQSSAoKikKKyAqCisgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4KKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BSEIzX0dSUDFfRW5hYmxlQ2xvY2tTdG9wU2xlZXAodWludDMyX3QgUGVyaXBocykgeworICBfX0lPIHVpbnQzMl90IHRtcHJlZzsKKyAgU0VUX0JJVChSQ0MtPkFIQjNTTUVOUiwgUGVyaXBocyk7CisgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovCisgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QUhCM1NNRU5SLCBQZXJpcGhzKTsKKyAgKHZvaWQpdG1wcmVnOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBBSEIzIHBlcmlwaGVyYWwgY2xvY2tzIGluIFNsZWVwIGFuZCBTdG9wIG1vZGVzCisgKiBAcm10b2xsIEFIQjNTTUVOUiAgICBGTUNTTUVOICAgICAgIExMX0FIQjNfR1JQMV9EaXNhYmxlQ2xvY2tTdG9wU2xlZXBcbgorICogICAgICAgICBBSEIzU01FTlIgICAgUVNQSVNNRU4gICAgICBMTF9BSEIzX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwCisgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIzX0dSUDFfUEVSSVBIX0ZNQyAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjNfR1JQMV9QRVJJUEhfUVNQSSAoKikKKyAqCisgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4KKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BSEIzX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwKHVpbnQzMl90IFBlcmlwaHMpIHsKKyAgQ0xFQVJfQklUKFJDQy0+QUhCM1NNRU5SLCBQZXJpcGhzKTsKK30KKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgQlVTX0xMX0VGX0FQQjEgQVBCMQorICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiAgRW5hYmxlIEFQQjEgcGVyaXBoZXJhbHMgY2xvY2suCisgKiBAcm10b2xsIEFQQjFFTlIxICAgICBUSU0yRU4gICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1xuCisgKiAgICAgICAgIEFQQjFFTlIxICAgICBUSU0zRU4gICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1xuCisgKiAgICAgICAgIEFQQjFFTlIxICAgICBUSU00RU4gICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1xuCisgKiAgICAgICAgIEFQQjFFTlIxICAgICBUSU01RU4gICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1xuCisgKiAgICAgICAgIEFQQjFFTlIxICAgICBUSU02RU4gICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1xuCisgKiAgICAgICAgIEFQQjFFTlIxICAgICBUSU03RU4gICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1xuCisgKiAgICAgICAgIEFQQjFFTlIxICAgICBDUlNFTiAgICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1xuCisgKiAgICAgICAgIEFQQjFFTlIxICAgICBSVENBUEJFTiAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1xuCisgKiAgICAgICAgIEFQQjFFTlIxICAgICBXV0RHRU4gICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1xuCisgKiAgICAgICAgIEFQQjFFTlIxICAgICBTUEkyRU4gICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1xuCisgKiAgICAgICAgIEFQQjFFTlIxICAgICBTUEkzRU4gICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1xuCisgKiAgICAgICAgIEFQQjFFTlIxICAgICBVU0FSVDJFTiAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1xuCisgKiAgICAgICAgIEFQQjFFTlIxICAgICBVU0FSVDNFTiAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1xuCisgKiAgICAgICAgIEFQQjFFTlIxICAgICBVQVJUNEVOICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1xuCisgKiAgICAgICAgIEFQQjFFTlIxICAgICBVQVJUNUVOICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1xuCisgKiAgICAgICAgIEFQQjFFTlIxICAgICBJMkMxRU4gICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1xuCisgKiAgICAgICAgIEFQQjFFTlIxICAgICBJMkMyRU4gICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1xuCisgKiAgICAgICAgIEFQQjFFTlIxICAgICBVU0JFTiAgICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1xuCisgKiAgICAgICAgIEFQQjFFTlIxICAgICBGRENBTkVOICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1xuCisgKiAgICAgICAgIEFQQjFFTlIxICAgICBQV1JFTiAgICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1xuCisgKiAgICAgICAgIEFQQjFFTlIxICAgICBJMkMzRU4gICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1xuCisgKiAgICAgICAgIEFQQjFFTlIxICAgICBMUFRJTTFFTiAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9jaworICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU0yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNNAorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU01ICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU02CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfQ1JTCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1JUQ0FQQgorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9XV0RHCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1NQSTIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfU1BJMworICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VU0FSVDIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVVNBUlQzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1VBUlQ0ICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VQVJUNSAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfSTJDMQorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9JMkMyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1VTQgorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9GRENBTiAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfUFdSCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0kyQzMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfTFBUSU0xCisgKgorICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrKHVpbnQzMl90IFBlcmlwaHMpIHsKKyAgX19JTyB1aW50MzJfdCB0bXByZWc7CisgIFNFVF9CSVQoUkNDLT5BUEIxRU5SMSwgUGVyaXBocyk7CisgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovCisgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCMUVOUjEsIFBlcmlwaHMpOworICAodm9pZCl0bXByZWc7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgQVBCMSBwZXJpcGhlcmFscyBjbG9jay4KKyAqIEBybXRvbGwgQVBCMUVOUjIgICAgIExQVUFSVDFFTiAgICAgTExfQVBCMV9HUlAyX0VuYWJsZUNsb2NrXG4KKyAqICAgICAgICAgQVBCMUVOUjIgICAgIEkyQzRFTiAgICAgICAgTExfQVBCMV9HUlAyX0VuYWJsZUNsb2NrXG4KKyAqICAgICAgICAgQVBCMUVOUjIgICAgIFVDUEQxRU4gICAgICAgTExfQVBCMV9HUlAyX0VuYWJsZUNsb2NrCisgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDJfUEVSSVBIX0xQVUFSVDEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMl9QRVJJUEhfSTJDNCAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMl9QRVJJUEhfVUNQRDEKKyAqCisgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4KKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BUEIxX0dSUDJfRW5hYmxlQ2xvY2sodWludDMyX3QgUGVyaXBocykgeworICBfX0lPIHVpbnQzMl90IHRtcHJlZzsKKyAgU0VUX0JJVChSQ0MtPkFQQjFFTlIyLCBQZXJpcGhzKTsKKyAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8KKyAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEIxRU5SMiwgUGVyaXBocyk7CisgICh2b2lkKXRtcHJlZzsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIEFQQjEgcGVyaXBoZXJhbCBjbG9jayBpcyBlbmFibGVkIG9yIG5vdAorICogQHJtdG9sbCBBUEIxRU5SMSAgICAgVElNMkVOICAgICAgICBMTF9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICogICAgICAgICBBUEIxRU5SMSAgICAgVElNM0VOICAgICAgICBMTF9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICogICAgICAgICBBUEIxRU5SMSAgICAgVElNNEVOICAgICAgICBMTF9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICogICAgICAgICBBUEIxRU5SMSAgICAgVElNNUVOICAgICAgICBMTF9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICogICAgICAgICBBUEIxRU5SMSAgICAgVElNNkVOICAgICAgICBMTF9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICogICAgICAgICBBUEIxRU5SMSAgICAgVElNN0VOICAgICAgICBMTF9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICogICAgICAgICBBUEIxRU5SMSAgICAgQ1JTRU4gICAgICAgICBMTF9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICogICAgICAgICBBUEIxRU5SMSAgICAgUlRDQVBCRU4gICAgICBMTF9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICogICAgICAgICBBUEIxRU5SMSAgICAgV1dER0VOICAgICAgICBMTF9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICogICAgICAgICBBUEIxRU5SMSAgICAgU1BJMkVOICAgICAgICBMTF9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICogICAgICAgICBBUEIxRU5SMSAgICAgU1BJM0VOICAgICAgICBMTF9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICogICAgICAgICBBUEIxRU5SMSAgICAgVVNBUlQyRU4gICAgICBMTF9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICogICAgICAgICBBUEIxRU5SMSAgICAgVVNBUlQzRU4gICAgICBMTF9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICogICAgICAgICBBUEIxRU5SMSAgICAgVUFSVDRFTiAgICAgICBMTF9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICogICAgICAgICBBUEIxRU5SMSAgICAgVUFSVDVFTiAgICAgICBMTF9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICogICAgICAgICBBUEIxRU5SMSAgICAgSTJDMUVOICAgICAgICBMTF9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICogICAgICAgICBBUEIxRU5SMSAgICAgSTJDMkVOICAgICAgICBMTF9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICogICAgICAgICBBUEIxRU5SMSAgICAgVVNCRU4gICAgICAgICBMTF9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICogICAgICAgICBBUEIxRU5SMSAgICAgRkRDQU5FTiAgICAgICBMTF9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICogICAgICAgICBBUEIxRU5SMSAgICAgUFdSRU4gICAgICAgICBMTF9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICogICAgICAgICBBUEIxRU5SMSAgICAgSTJDM0VOICAgICAgICBMTF9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICogICAgICAgICBBUEIxRU5SMSAgICAgTFBUSU0xRU4gICAgICBMTF9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2sKKyAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNMgorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU0zCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNNSAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNNgorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU03CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0NSUworICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9SVENBUEIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfV1dERworICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9TUEkyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1NQSTMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVVNBUlQyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1VTQVJUMworICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VQVJUNCAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVUFSVDUgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0kyQzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfSTJDMgorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VU0IKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfRkRDQU4gKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1BXUgorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9JMkMzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0xQVElNMQorICoKKyAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICogQHJldHZhbCBTdGF0ZSBvZiBQZXJpcGhzICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQVBCMV9HUlAxX0lzRW5hYmxlZENsb2NrKHVpbnQzMl90IFBlcmlwaHMpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5BUEIxRU5SMSwgUGVyaXBocykgPT0gUGVyaXBocykgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgQVBCMSBwZXJpcGhlcmFsIGNsb2NrIGlzIGVuYWJsZWQgb3Igbm90CisgKiBAcm10b2xsIEFQQjFFTlIyICAgICBMUFVBUlQxRU4gICAgIExMX0FQQjFfR1JQMl9Jc0VuYWJsZWRDbG9ja1xuCisgKiAgICAgICAgIEFQQjFFTlIyICAgICBJMkM0RU4gICAgICAgIExMX0FQQjFfR1JQMl9Jc0VuYWJsZWRDbG9ja1xuCisgKiAgICAgICAgIEFQQjFFTlIyICAgICBVQ1BEMUVOICAgICAgIExMX0FQQjFfR1JQMl9Jc0VuYWJsZWRDbG9jaworICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAyX1BFUklQSF9MUFVBUlQxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDJfUEVSSVBIX0kyQzQgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDJfUEVSSVBIX1VDUEQxCisgKgorICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuCisgKiBAcmV0dmFsIFN0YXRlIG9mIFBlcmlwaHMgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BUEIxX0dSUDJfSXNFbmFibGVkQ2xvY2sodWludDMyX3QgUGVyaXBocykgeworICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkFQQjFFTlIyLCBQZXJpcGhzKSA9PSBQZXJpcGhzKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIEFQQjEgcGVyaXBoZXJhbHMgY2xvY2suCisgKiBAcm10b2xsIEFQQjFFTlIxICAgICBUSU0yRU4gICAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICogICAgICAgICBBUEIxRU5SMSAgICAgVElNM0VOICAgICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAqICAgICAgICAgQVBCMUVOUjEgICAgIFRJTTRFTiAgICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1xuCisgKiAgICAgICAgIEFQQjFFTlIxICAgICBUSU01RU4gICAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICogICAgICAgICBBUEIxRU5SMSAgICAgVElNNkVOICAgICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAqICAgICAgICAgQVBCMUVOUjEgICAgIFRJTTdFTiAgICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1xuCisgKiAgICAgICAgIEFQQjFFTlIxICAgICBDUlNFTiAgICAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICogICAgICAgICBBUEIxRU5SMSAgICAgUlRDQVBCRU4gICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAqICAgICAgICAgQVBCMUVOUjEgICAgIFdXREdFTiAgICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1xuCisgKiAgICAgICAgIEFQQjFFTlIxICAgICBTUEkyRU4gICAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICogICAgICAgICBBUEIxRU5SMSAgICAgU1BJM0VOICAgICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAqICAgICAgICAgQVBCMUVOUjEgICAgIFVTQVJUMkVOICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1xuCisgKiAgICAgICAgIEFQQjFFTlIxICAgICBVU0FSVDNFTiAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICogICAgICAgICBBUEIxRU5SMSAgICAgVUFSVDRFTiAgICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAqICAgICAgICAgQVBCMUVOUjEgICAgIFVBUlQ1RU4gICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1xuCisgKiAgICAgICAgIEFQQjFFTlIxICAgICBJMkMxRU4gICAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICogICAgICAgICBBUEIxRU5SMSAgICAgSTJDMkVOICAgICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAqICAgICAgICAgQVBCMUVOUjEgICAgIFVTQkVOICAgICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1xuCisgKiAgICAgICAgIEFQQjFFTlIxICAgICBGRENBTkVOICAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICogICAgICAgICBBUEIxRU5SMSAgICAgUFdSRU4gICAgICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAqICAgICAgICAgQVBCMUVOUjEgICAgIEkyQzNFTiAgICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1xuCisgKiAgICAgICAgIEFQQjFFTlIxICAgICBMUFRJTTFFTiAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2sKKyAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNMgorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU0zCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNNSAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNNgorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU03CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0NSUworICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9SVENBUEIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfV1dERworICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9TUEkyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1NQSTMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVVNBUlQyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1VTQVJUMworICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VQVJUNCAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVUFSVDUgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0kyQzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfSTJDMgorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VU0IKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfRkRDQU4gKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1BXUgorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9JMkMzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0xQVElNMQorICoKKyAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2sodWludDMyX3QgUGVyaXBocykgeworICBDTEVBUl9CSVQoUkNDLT5BUEIxRU5SMSwgUGVyaXBocyk7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIEFQQjEgcGVyaXBoZXJhbHMgY2xvY2suCisgKiBAcm10b2xsIEFQQjFFTlIyICAgICBMUFVBUlQxRU4gICAgIExMX0FQQjFfR1JQMl9EaXNhYmxlQ2xvY2tcbgorICogICAgICAgICBBUEIxRU5SMiAgICAgSTJDNEVOICAgICAgICBMTF9BUEIxX0dSUDJfRGlzYWJsZUNsb2NrXG4KKyAqICAgICAgICAgQVBCMUVOUjIgICAgIFVDUEQxRU4gICAgICBMTF9BUEIxX0dSUDJfRGlzYWJsZUNsb2NrCisgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDJfUEVSSVBIX0xQVUFSVDEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMl9QRVJJUEhfSTJDNCAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMl9QRVJJUEhfVUNQRDEKKyAqCisgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4KKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BUEIxX0dSUDJfRGlzYWJsZUNsb2NrKHVpbnQzMl90IFBlcmlwaHMpIHsKKyAgQ0xFQVJfQklUKFJDQy0+QVBCMUVOUjIsIFBlcmlwaHMpOworfQorCisvKioKKyAqIEBicmllZiAgRm9yY2UgQVBCMSBwZXJpcGhlcmFscyByZXNldC4KKyAqIEBybXRvbGwgQVBCMVJTVFIxICAgICBUSU0yUlNUICAgICAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldFxuCisgKiAgICAgICAgIEFQQjFSU1RSMSAgICAgVElNM1JTVCAgICAgICAgTExfQVBCMV9HUlAxX0ZvcmNlUmVzZXRcbgorICogICAgICAgICBBUEIxUlNUUjEgICAgIFRJTTRSU1QgICAgICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0XG4KKyAqICAgICAgICAgQVBCMVJTVFIxICAgICBUSU01UlNUICAgICAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldFxuCisgKiAgICAgICAgIEFQQjFSU1RSMSAgICAgVElNNlJTVCAgICAgICAgTExfQVBCMV9HUlAxX0ZvcmNlUmVzZXRcbgorICogICAgICAgICBBUEIxUlNUUjEgICAgIFRJTTdSU1QgICAgICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0XG4KKyAqICAgICAgICAgQVBCMVJTVFIxICAgICBDUlNSU1QgICAgICAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldFxuCisgKiAgICAgICAgIEFQQjFSU1RSMSAgICAgU1BJMlJTVCAgICAgICAgTExfQVBCMV9HUlAxX0ZvcmNlUmVzZXRcbgorICogICAgICAgICBBUEIxUlNUUjEgICAgIFNQSTNSU1QgICAgICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0XG4KKyAqICAgICAgICAgQVBCMVJTVFIxICAgICBVU0FSVDJSU1QgICAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldFxuCisgKiAgICAgICAgIEFQQjFSU1RSMSAgICAgVVNBUlQzUlNUICAgICAgTExfQVBCMV9HUlAxX0ZvcmNlUmVzZXRcbgorICogICAgICAgICBBUEIxUlNUUjEgICAgIFVBUlQ0UlNUICAgICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0XG4KKyAqICAgICAgICAgQVBCMVJTVFIxICAgICBVQVJUNVJTVCAgICAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldFxuCisgKiAgICAgICAgIEFQQjFSU1RSMSAgICAgSTJDMVJTVCAgICAgICAgTExfQVBCMV9HUlAxX0ZvcmNlUmVzZXRcbgorICogICAgICAgICBBUEIxUlNUUjEgICAgIEkyQzJSU1QgICAgICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0XG4KKyAqICAgICAgICAgQVBCMVJTVFIxICAgICBVU0JSU1QgICAgICAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldFxuCisgKiAgICAgICAgIEFQQjFSU1RSMSAgICAgRkRDQU5SU1QgICAgICAgTExfQVBCMV9HUlAxX0ZvcmNlUmVzZXRcbgorICogICAgICAgICBBUEIxUlNUUjEgICAgIFBXUlJTVCAgICAgICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0XG4KKyAqICAgICAgICAgQVBCMVJTVFIxICAgICBJMkMzUlNUICAgICAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldFxuCisgKiAgICAgICAgIEFQQjFSU1RSMSAgICAgTFBUSU0xUlNUICAgICAgTExfQVBCMV9HUlAxX0ZvcmNlUmVzZXQKKyAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNMgorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU0zCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNNSAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNNgorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU03CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0NSUworICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9TUEkyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1NQSTMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVVNBUlQyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1VTQVJUMworICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VQVJUNCAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVUFSVDUgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0kyQzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfSTJDMgorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VU0IKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfRkRDQU4gKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1BXUgorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9JMkMzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0xQVElNMQorICoKKyAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0KHVpbnQzMl90IFBlcmlwaHMpIHsKKyAgU0VUX0JJVChSQ0MtPkFQQjFSU1RSMSwgUGVyaXBocyk7Cit9CisKKy8qKgorICogQGJyaWVmICBGb3JjZSBBUEIxIHBlcmlwaGVyYWxzIHJlc2V0LgorICogQHJtdG9sbCBBUEIxUlNUUjIgICAgIExQVUFSVDFSU1QgICAgIExMX0FQQjFfR1JQMl9Gb3JjZVJlc2V0XG4KKyAqICAgICAgICAgQVBCMVJTVFIyICAgICBJMkM0UlNUICAgICAgICBMTF9BUEIxX0dSUDJfRm9yY2VSZXNldFxuCisgKiAgICAgICAgIEFQQjFSU1RSMiAgICAgVUNQRDFSU1QgICAgICAgTExfQVBCMV9HUlAyX0ZvcmNlUmVzZXQKKyAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMl9QRVJJUEhfTFBVQVJUMQorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAyX1BFUklQSF9JMkM0ICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAyX1BFUklQSF9VQ1BEMQorICoKKyAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FQQjFfR1JQMl9Gb3JjZVJlc2V0KHVpbnQzMl90IFBlcmlwaHMpIHsKKyAgU0VUX0JJVChSQ0MtPkFQQjFSU1RSMiwgUGVyaXBocyk7Cit9CisKKy8qKgorICogQGJyaWVmICBSZWxlYXNlIEFQQjEgcGVyaXBoZXJhbHMgcmVzZXQuCisgKiBAcm10b2xsIEFQQjFSU1RSMSAgICAgVElNMlJTVCAgICAgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldFxuCisgKiAgICAgICAgIEFQQjFSU1RSMSAgICAgVElNM1JTVCAgICAgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldFxuCisgKiAgICAgICAgIEFQQjFSU1RSMSAgICAgVElNNFJTVCAgICAgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldFxuCisgKiAgICAgICAgIEFQQjFSU1RSMSAgICAgVElNNVJTVCAgICAgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldFxuCisgKiAgICAgICAgIEFQQjFSU1RSMSAgICAgVElNNlJTVCAgICAgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldFxuCisgKiAgICAgICAgIEFQQjFSU1RSMSAgICAgVElNN1JTVCAgICAgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldFxuCisgKiAgICAgICAgIEFQQjFSU1RSMSAgICAgQ1JTUlNUICAgICAgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldFxuCisgKiAgICAgICAgIEFQQjFSU1RSMSAgICAgU1BJMlJTVCAgICAgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldFxuCisgKiAgICAgICAgIEFQQjFSU1RSMSAgICAgU1BJM1JTVCAgICAgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldFxuCisgKiAgICAgICAgIEFQQjFSU1RSMSAgICAgVVNBUlQyUlNUICAgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldFxuCisgKiAgICAgICAgIEFQQjFSU1RSMSAgICAgVVNBUlQzUlNUICAgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldFxuCisgKiAgICAgICAgIEFQQjFSU1RSMSAgICAgVUFSVDRSU1QgICAgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldFxuCisgKiAgICAgICAgIEFQQjFSU1RSMSAgICAgVUFSVDVSU1QgICAgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldFxuCisgKiAgICAgICAgIEFQQjFSU1RSMSAgICAgSTJDMVJTVCAgICAgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldFxuCisgKiAgICAgICAgIEFQQjFSU1RSMSAgICAgSTJDMlJTVCAgICAgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldFxuCisgKiAgICAgICAgIEFQQjFSU1RSMSAgICAgVVNCUlNUICAgICAgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldFxuCisgKiAgICAgICAgIEFQQjFSU1RSMSAgICAgRkRDQU5SU1QgICAgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldFxuCisgKiAgICAgICAgIEFQQjFSU1RSMSAgICAgUFdSUlNUICAgICAgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldFxuCisgKiAgICAgICAgIEFQQjFSU1RSMSAgICAgSTJDM1JTVCAgICAgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldFxuCisgKiAgICAgICAgIEFQQjFSU1RSMSAgICAgTFBUSU0xUlNUICAgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldAorICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU0yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNNAorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU01ICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU02CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfQ1JTCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1NQSTIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfU1BJMworICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VU0FSVDIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVVNBUlQzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1VBUlQ0ICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VQVJUNSAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfSTJDMQorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9JMkMyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1VTQgorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9GRENBTiAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfUFdSCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0kyQzMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfTFBUSU0xCisgKgorICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldCh1aW50MzJfdCBQZXJpcGhzKSB7CisgIENMRUFSX0JJVChSQ0MtPkFQQjFSU1RSMSwgUGVyaXBocyk7Cit9CisKKy8qKgorICogQGJyaWVmICBSZWxlYXNlIEFQQjEgcGVyaXBoZXJhbHMgcmVzZXQuCisgKiBAcm10b2xsIEFQQjFSU1RSMiAgICAgTFBVQVJUMVJTVCAgICAgTExfQVBCMV9HUlAyX1JlbGVhc2VSZXNldFxuCisgKiAgICAgICAgIEFQQjFSU1RSMiAgICAgSTJDNFJTVCAgICAgICAgTExfQVBCMV9HUlAyX1JlbGVhc2VSZXNldFxuCisgKiAgICAgICAgIEFQQjFSU1RSMiAgICAgVUNQRDFSU1QgICAgICAgTExfQVBCMV9HUlAyX1JlbGVhc2VSZXNldAorICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAyX1BFUklQSF9MUFVBUlQxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDJfUEVSSVBIX0kyQzQgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDJfUEVSSVBIX1VDUEQxCisgKgorICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQVBCMV9HUlAyX1JlbGVhc2VSZXNldCh1aW50MzJfdCBQZXJpcGhzKSB7CisgIENMRUFSX0JJVChSQ0MtPkFQQjFSU1RSMiwgUGVyaXBocyk7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgQVBCMSBwZXJpcGhlcmFsIGNsb2NrcyBpbiBTbGVlcCBhbmQgU3RvcCBtb2RlcworICogQHJtdG9sbCBBUEIxU01FTlIxICAgICBUSU0yU01FTiAgICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAqICAgICAgICAgQVBCMVNNRU5SMSAgICAgVElNM1NNRU4gICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1N0b3BTbGVlcFxuCisgKiAgICAgICAgIEFQQjFTTUVOUjEgICAgIFRJTTRTTUVOICAgICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTdG9wU2xlZXBcbgorICogICAgICAgICBBUEIxU01FTlIxICAgICBUSU01U01FTiAgICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAqICAgICAgICAgQVBCMVNNRU5SMSAgICAgVElNNlNNRU4gICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1N0b3BTbGVlcFxuCisgKiAgICAgICAgIEFQQjFTTUVOUjEgICAgIFRJTTdTTUVOICAgICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTdG9wU2xlZXBcbgorICogICAgICAgICBBUEIxU01FTlIxICAgICBDUlNTTUVOICAgICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAqICAgICAgICAgQVBCMVNNRU5SMSAgICAgUlRDQVBCU01FTiAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1N0b3BTbGVlcFxuCisgKiAgICAgICAgIEFQQjFTTUVOUjEgICAgIFdXREdTTUVOICAgICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTdG9wU2xlZXBcbgorICogICAgICAgICBBUEIxU01FTlIxICAgICBTUEkyU01FTiAgICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAqICAgICAgICAgQVBCMVNNRU5SMSAgICAgU1BJM1NNRU4gICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1N0b3BTbGVlcFxuCisgKiAgICAgICAgIEFQQjFTTUVOUjEgICAgIFVTQVJUMlNNRU4gICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTdG9wU2xlZXBcbgorICogICAgICAgICBBUEIxU01FTlIxICAgICBVU0FSVDNTTUVOICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAqICAgICAgICAgQVBCMVNNRU5SMSAgICAgVUFSVDRTTUVOICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1N0b3BTbGVlcFxuCisgKiAgICAgICAgIEFQQjFTTUVOUjEgICAgIFVBUlQ1U01FTiAgICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTdG9wU2xlZXBcbgorICogICAgICAgICBBUEIxU01FTlIxICAgICBJMkMxU01FTiAgICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAqICAgICAgICAgQVBCMVNNRU5SMSAgICAgSTJDMlNNRU4gICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1N0b3BTbGVlcFxuCisgKiAgICAgICAgIEFQQjFTTUVOUjEgICAgIFVTQlNNRU4gICAgICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTdG9wU2xlZXBcbgorICogICAgICAgICBBUEIxU01FTlIxICAgICBGRENBTlNNRU4gICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAqICAgICAgICAgQVBCMVNNRU5SMSAgICAgUFdSU01FTiAgICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1N0b3BTbGVlcFxuCisgKiAgICAgICAgIEFQQjFTTUVOUjEgICAgIEkyQzNTTUVOICAgICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTdG9wU2xlZXBcbgorICogICAgICAgICBBUEIxU01FTlIxICAgICBMUFRJTTFTTUVOICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwCisgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNMworICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU00CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTUgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNNworICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9DUlMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfUlRDQVBCCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1dXREcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfU1BJMgorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9TUEkzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1VTQVJUMgorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VU0FSVDMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVUFSVDQgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1VBUlQ1ICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9JMkMxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0kyQzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVVNCCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0ZEQ0FOICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9QV1IKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfSTJDMworICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9MUFRJTTEKKyAqCisgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4KKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTdG9wU2xlZXAodWludDMyX3QgUGVyaXBocykgeworICBfX0lPIHVpbnQzMl90IHRtcHJlZzsKKyAgU0VUX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFBlcmlwaHMpOworICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLworICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFBlcmlwaHMpOworICAodm9pZCl0bXByZWc7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgQVBCMSBwZXJpcGhlcmFsIGNsb2NrcyBpbiBTbGVlcCBhbmQgU3RvcCBtb2RlcworICogQHJtdG9sbCBBUEIxU01FTlIyICAgICBMUFVBUlQxU01FTiAgICAgTExfQVBCMV9HUlAyX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAqICAgICAgICAgQVBCMVNNRU5SMiAgICAgSTJDNFNNRU4gICAgICAgIExMX0FQQjFfR1JQMl9FbmFibGVDbG9ja1N0b3BTbGVlcFxuCisgKiAgICAgICAgIEFQQjFTTUVOUjIgICAgIFVDUEQxU01FTiAgICAgICBMTF9BUEIxX0dSUDJfRW5hYmxlQ2xvY2tTdG9wU2xlZXAKKyAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMl9QRVJJUEhfTFBVQVJUMQorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAyX1BFUklQSF9JMkM0ICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAyX1BFUklQSF9VQ1BEMSAoKikKKyAqCisgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4KKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BUEIxX0dSUDJfRW5hYmxlQ2xvY2tTdG9wU2xlZXAodWludDMyX3QgUGVyaXBocykgeworICBfX0lPIHVpbnQzMl90IHRtcHJlZzsKKyAgU0VUX0JJVChSQ0MtPkFQQjFTTUVOUjIsIFBlcmlwaHMpOworICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLworICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUjIsIFBlcmlwaHMpOworICAodm9pZCl0bXByZWc7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIEFQQjEgcGVyaXBoZXJhbCBjbG9ja3MgaW4gU2xlZXAgYW5kIFN0b3AgbW9kZXMKKyAqIEBybXRvbGwgQVBCMVNNRU5SMSAgICAgVElNMlNNRU4gICAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tTdG9wU2xlZXBcbgorICogICAgICAgICBBUEIxU01FTlIxICAgICBUSU0zU01FTiAgICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuCisgKiAgICAgICAgIEFQQjFTTUVOUjEgICAgIFRJTTRTTUVOICAgICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAqICAgICAgICAgQVBCMVNNRU5SMSAgICAgVElNNVNNRU4gICAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tTdG9wU2xlZXBcbgorICogICAgICAgICBBUEIxU01FTlIxICAgICBUSU02U01FTiAgICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuCisgKiAgICAgICAgIEFQQjFTTUVOUjEgICAgIFRJTTdTTUVOICAgICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAqICAgICAgICAgQVBCMVNNRU5SMSAgICAgQ1JTU01FTiAgICAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tTdG9wU2xlZXBcbgorICogICAgICAgICBBUEIxU01FTlIxICAgICBSVENBUEJTTUVOICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuCisgKiAgICAgICAgIEFQQjFTTUVOUjEgICAgIFdXREdTTUVOICAgICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAqICAgICAgICAgQVBCMVNNRU5SMSAgICAgU1BJMlNNRU4gICAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tTdG9wU2xlZXBcbgorICogICAgICAgICBBUEIxU01FTlIxICAgICBTUEkzU01FTiAgICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuCisgKiAgICAgICAgIEFQQjFTTUVOUjEgICAgIFVTQVJUMlNNRU4gICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAqICAgICAgICAgQVBCMVNNRU5SMSAgICAgVVNBUlQzU01FTiAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tTdG9wU2xlZXBcbgorICogICAgICAgICBBUEIxU01FTlIxICAgICBVQVJUNFNNRU4gICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuCisgKiAgICAgICAgIEFQQjFTTUVOUjEgICAgIFVBUlQ1U01FTiAgICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAqICAgICAgICAgQVBCMVNNRU5SMSAgICAgSTJDMVNNRU4gICAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tTdG9wU2xlZXBcbgorICogICAgICAgICBBUEIxU01FTlIxICAgICBJMkMyU01FTiAgICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuCisgKiAgICAgICAgIEFQQjFTTUVOUjEgICAgIFVTQlNNRU4gICAgICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAqICAgICAgICAgQVBCMVNNRU5SMSAgICAgRkRDQU5TTUVOICAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tTdG9wU2xlZXBcbgorICogICAgICAgICBBUEIxU01FTlIxICAgICBQV1JTTUVOICAgICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuCisgKiAgICAgICAgIEFQQjFTTUVOUjEgICAgIEkyQzNTTUVOICAgICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAqICAgICAgICAgQVBCMVNNRU5SMSAgICAgTFBUSU0xU01FTiAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tTdG9wU2xlZXAKKyAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNMgorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU0zCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNNSAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNNgorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU03CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0NSUworICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9SVENBUEIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfV1dERworICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9TUEkyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1NQSTMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVVNBUlQyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1VTQVJUMworICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VQVJUNCAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVUFSVDUgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0kyQzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfSTJDMgorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VU0IKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfRkRDQU4gKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1BXUgorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9JMkMzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0xQVElNMQorICoKKyAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tTdG9wU2xlZXAodWludDMyX3QgUGVyaXBocykgeworICBDTEVBUl9CSVQoUkNDLT5BUEIxU01FTlIxLCBQZXJpcGhzKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgQVBCMSBwZXJpcGhlcmFsIGNsb2NrcyBpbiBTbGVlcCBhbmQgU3RvcCBtb2RlcworICogQHJtdG9sbCBBUEIxU01FTlIyICAgICBMUFVBUlQxU01FTiAgICAgTExfQVBCMV9HUlAyX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuCisgKiAgICAgICAgIEFQQjFTTUVOUjIgICAgIEkyQzRTTUVOICAgICAgICBMTF9BUEIxX0dSUDJfRGlzYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAqICAgICAgICAgQVBCMVNNRU5SMiAgICAgVUNQRDFTTUVOICAgICAgTExfQVBCMV9HUlAyX0Rpc2FibGVDbG9ja1N0b3BTbGVlcAorICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAyX1BFUklQSF9MUFVBUlQxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDJfUEVSSVBIX0kyQzQgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDJfUEVSSVBIX1VDUEQxICgqKQorICoKKyAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FQQjFfR1JQMl9EaXNhYmxlQ2xvY2tTdG9wU2xlZXAodWludDMyX3QgUGVyaXBocykgeworICBDTEVBUl9CSVQoUkNDLT5BUEIxU01FTlIyLCBQZXJpcGhzKTsKK30KKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgQlVTX0xMX0VGX0FQQjIgQVBCMgorICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiAgRW5hYmxlIEFQQjIgcGVyaXBoZXJhbHMgY2xvY2suCisgKiBAcm10b2xsIEFQQjJFTlIgICAgICBTWVNDRkdFTiAgICAgIExMX0FQQjJfR1JQMV9FbmFibGVDbG9ja1xuCisgKiAgICAgICAgIEFQQjJFTlIgICAgICBUSU0xRU4gICAgICAgIExMX0FQQjJfR1JQMV9FbmFibGVDbG9ja1xuCisgKiAgICAgICAgIEFQQjJFTlIgICAgICBTUEkxRU4gICAgICAgIExMX0FQQjJfR1JQMV9FbmFibGVDbG9ja1xuCisgKiAgICAgICAgIEFQQjJFTlIgICAgICBUSU04RU4gICAgICAgIExMX0FQQjJfR1JQMV9FbmFibGVDbG9ja1xuCisgKiAgICAgICAgIEFQQjJFTlIgICAgICBVU0FSVDFFTiAgICAgIExMX0FQQjJfR1JQMV9FbmFibGVDbG9ja1xuCisgKiAgICAgICAgIEFQQjJFTlIgICAgICBTUEk0RU4gICAgICAgIExMX0FQQjJfR1JQMV9FbmFibGVDbG9ja1xuCisgKiAgICAgICAgIEFQQjJFTlIgICAgICBUSU0xNUVOICAgICAgIExMX0FQQjJfR1JQMV9FbmFibGVDbG9ja1xuCisgKiAgICAgICAgIEFQQjJFTlIgICAgICBUSU0xNkVOICAgICAgIExMX0FQQjJfR1JQMV9FbmFibGVDbG9ja1xuCisgKiAgICAgICAgIEFQQjJFTlIgICAgICBUSU0xN0VOICAgICAgIExMX0FQQjJfR1JQMV9FbmFibGVDbG9ja1xuCisgKiAgICAgICAgIEFQQjJFTlIgICAgICBUSU0yMEVOICAgICAgIExMX0FQQjJfR1JQMV9FbmFibGVDbG9ja1xuCisgKiAgICAgICAgIEFQQjJFTlIgICAgICBTQUkxRU4gICAgICAgIExMX0FQQjJfR1JQMV9FbmFibGVDbG9ja1xuCisgKiAgICAgICAgIEFQQjJFTlIgICAgICBIUlRJTTFFTiAgICAgIExMX0FQQjJfR1JQMV9FbmFibGVDbG9jaworICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9TWVNDRkcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMQorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9TUEkxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVVNBUlQxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1NQSTQgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE1CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE2CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE3CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTIwICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9TQUkxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX0hSVElNMSAoKikKKyAqCisgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4KKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BUEIyX0dSUDFfRW5hYmxlQ2xvY2sodWludDMyX3QgUGVyaXBocykgeworICBfX0lPIHVpbnQzMl90IHRtcHJlZzsKKyAgU0VUX0JJVChSQ0MtPkFQQjJFTlIsIFBlcmlwaHMpOworICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLworICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQjJFTlIsIFBlcmlwaHMpOworICAodm9pZCl0bXByZWc7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiBBUEIyIHBlcmlwaGVyYWwgY2xvY2sgaXMgZW5hYmxlZCBvciBub3QKKyAqIEBybXRvbGwgQVBCMkVOUiAgICAgIFNZU0NGR0VOICAgICAgTExfQVBCMl9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAqICAgICAgICAgQVBCMkVOUiAgICAgIFRJTTFFTiAgICAgICAgTExfQVBCMl9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAqICAgICAgICAgQVBCMkVOUiAgICAgIFNQSTFFTiAgICAgICAgTExfQVBCMl9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAqICAgICAgICAgQVBCMkVOUiAgICAgIFRJTThFTiAgICAgICAgTExfQVBCMl9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAqICAgICAgICAgQVBCMkVOUiAgICAgIFVTQVJUMUVOICAgICAgTExfQVBCMl9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAqICAgICAgICAgQVBCMkVOUiAgICAgIFNQSTRFTiAgICAgICAgTExfQVBCMl9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAqICAgICAgICAgQVBCMkVOUiAgICAgIFRJTTE1RU4gICAgICAgTExfQVBCMl9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAqICAgICAgICAgQVBCMkVOUiAgICAgIFRJTTE2RU4gICAgICAgTExfQVBCMl9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAqICAgICAgICAgQVBCMkVOUiAgICAgIFRJTTE3RU4gICAgICAgTExfQVBCMl9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAqICAgICAgICAgQVBCMkVOUiAgICAgIFRJTTIwRU4gICAgICAgTExfQVBCMl9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAqICAgICAgICAgQVBCMkVOUiAgICAgIFNBSTFFTiAgICAgICAgTExfQVBCMl9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAqICAgICAgICAgQVBCMkVOUiAgICAgIEhSVElNMUVOICAgICAgTExfQVBCMl9HUlAxX0lzRW5hYmxlZENsb2NrCisgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1NZU0NGRworICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU0xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1NQSTEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNOAorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9VU0FSVDEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfU1BJNCAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMTUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMTYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMTcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMjAgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1NBSTEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfSFJUSU0xICgqKQorICoKKyAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICogQHJldHZhbCBTdGF0ZSBvZiBQZXJpcGhzICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQVBCMl9HUlAxX0lzRW5hYmxlZENsb2NrKHVpbnQzMl90IFBlcmlwaHMpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5BUEIyRU5SLCBQZXJpcGhzKSA9PSBQZXJpcGhzKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIEFQQjIgcGVyaXBoZXJhbHMgY2xvY2suCisgKiBAcm10b2xsIEFQQjJFTlIgICAgICBTWVNDRkdFTiAgICAgIExMX0FQQjJfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICogICAgICAgICBBUEIyRU5SICAgICAgVElNMUVOICAgICAgICBMTF9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAqICAgICAgICAgQVBCMkVOUiAgICAgIFNQSTFFTiAgICAgICAgTExfQVBCMl9HUlAxX0Rpc2FibGVDbG9ja1xuCisgKiAgICAgICAgIEFQQjJFTlIgICAgICBUSU04RU4gICAgICAgIExMX0FQQjJfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICogICAgICAgICBBUEIyRU5SICAgICAgVVNBUlQxRU4gICAgICBMTF9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAqICAgICAgICAgQVBCMkVOUiAgICAgIFNQSTRFTiAgICAgICAgTExfQVBCMl9HUlAxX0Rpc2FibGVDbG9ja1xuCisgKiAgICAgICAgIEFQQjJFTlIgICAgICBUSU0xNUVOICAgICAgIExMX0FQQjJfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICogICAgICAgICBBUEIyRU5SICAgICAgVElNMTZFTiAgICAgICBMTF9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAqICAgICAgICAgQVBCMkVOUiAgICAgIFRJTTE3RU4gICAgICAgTExfQVBCMl9HUlAxX0Rpc2FibGVDbG9ja1xuCisgKiAgICAgICAgIEFQQjJFTlIgICAgICBUSU0yMEVOICAgICAgIExMX0FQQjJfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICogICAgICAgICBBUEIyRU5SICAgICAgU0FJMUVOICAgICAgICBMTF9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAqICAgICAgICAgQVBCMkVOUiAgICAgIEhSVElNMUVOICAgICAgTExfQVBCMl9HUlAxX0Rpc2FibGVDbG9jaworICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9TWVNDRkcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMQorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9TUEkxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVVNBUlQxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1NQSTQgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE1CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE2CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE3CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTIwICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9TQUkxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX0hSVElNMSAoKikKKyAqCisgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4KKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrKHVpbnQzMl90IFBlcmlwaHMpIHsKKyAgQ0xFQVJfQklUKFJDQy0+QVBCMkVOUiwgUGVyaXBocyk7Cit9CisKKy8qKgorICogQGJyaWVmICBGb3JjZSBBUEIyIHBlcmlwaGVyYWxzIHJlc2V0LgorICogQHJtdG9sbCBBUEIyUlNUUiAgICAgIFNZU0NGR1JTVCAgICAgIExMX0FQQjJfR1JQMV9Gb3JjZVJlc2V0XG4KKyAqICAgICAgICAgQVBCMlJTVFIgICAgICBUSU0xUlNUICAgICAgICBMTF9BUEIyX0dSUDFfRm9yY2VSZXNldFxuCisgKiAgICAgICAgIEFQQjJSU1RSICAgICAgU1BJMVJTVCAgICAgICAgTExfQVBCMl9HUlAxX0ZvcmNlUmVzZXRcbgorICogICAgICAgICBBUEIyUlNUUiAgICAgIFRJTThSU1QgICAgICAgIExMX0FQQjJfR1JQMV9Gb3JjZVJlc2V0XG4KKyAqICAgICAgICAgQVBCMlJTVFIgICAgICBVU0FSVDFSU1QgICAgICBMTF9BUEIyX0dSUDFfRm9yY2VSZXNldFxuCisgKiAgICAgICAgIEFQQjJSU1RSICAgICAgU1BJNFJTVCAgICAgICAgTExfQVBCMl9HUlAxX0ZvcmNlUmVzZXRcbgorICogICAgICAgICBBUEIyUlNUUiAgICAgIFRJTTE1UlNUICAgICAgIExMX0FQQjJfR1JQMV9Gb3JjZVJlc2V0XG4KKyAqICAgICAgICAgQVBCMlJTVFIgICAgICBUSU0xNlJTVCAgICAgICBMTF9BUEIyX0dSUDFfRm9yY2VSZXNldFxuCisgKiAgICAgICAgIEFQQjJSU1RSICAgICAgVElNMTdSU1QgICAgICAgTExfQVBCMl9HUlAxX0ZvcmNlUmVzZXRcbgorICogICAgICAgICBBUEIyUlNUUiAgICAgIFRJTTIwUlNUICAgICAgIExMX0FQQjJfR1JQMV9Gb3JjZVJlc2V0XG4KKyAqICAgICAgICAgQVBCMlJTVFIgICAgICBTQUkxUlNUICAgICAgICBMTF9BUEIyX0dSUDFfRm9yY2VSZXNldFxuCisgKiAgICAgICAgIEFQQjJSU1RSICAgICAgSFJUSU0xUlNUICAgICAgTExfQVBCMl9HUlAxX0ZvcmNlUmVzZXQKKyAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfU1lTQ0ZHCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfU1BJMQorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU04CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1VTQVJUMQorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9TUEk0ICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU0xNQorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU0xNgorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU0xNworICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU0yMCAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfU0FJMQorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9IUlRJTTEgKCopCisgKgorICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQVBCMl9HUlAxX0ZvcmNlUmVzZXQodWludDMyX3QgUGVyaXBocykgeworICBTRVRfQklUKFJDQy0+QVBCMlJTVFIsIFBlcmlwaHMpOworfQorCisvKioKKyAqIEBicmllZiAgUmVsZWFzZSBBUEIyIHBlcmlwaGVyYWxzIHJlc2V0LgorICogQHJtdG9sbCBBUEIyUlNUUiAgICAgIFNZU0NGR1JTVCAgICAgIExMX0FQQjJfR1JQMV9Gb3JjZVJlc2V0XG4KKyAqICAgICAgICAgQVBCMlJTVFIgICAgICBUSU0xUlNUICAgICAgICBMTF9BUEIyX0dSUDFfRm9yY2VSZXNldFxuCisgKiAgICAgICAgIEFQQjJSU1RSICAgICAgU1BJMVJTVCAgICAgICAgTExfQVBCMl9HUlAxX0ZvcmNlUmVzZXRcbgorICogICAgICAgICBBUEIyUlNUUiAgICAgIFRJTThSU1QgICAgICAgIExMX0FQQjJfR1JQMV9Gb3JjZVJlc2V0XG4KKyAqICAgICAgICAgQVBCMlJTVFIgICAgICBVU0FSVDFSU1QgICAgICBMTF9BUEIyX0dSUDFfRm9yY2VSZXNldFxuCisgKiAgICAgICAgIEFQQjJSU1RSICAgICAgU1BJNFJTVCAgICAgICAgTExfQVBCMl9HUlAxX0ZvcmNlUmVzZXRcbgorICogICAgICAgICBBUEIyUlNUUiAgICAgIFRJTTE1UlNUICAgICAgIExMX0FQQjJfR1JQMV9Gb3JjZVJlc2V0XG4KKyAqICAgICAgICAgQVBCMlJTVFIgICAgICBUSU0xNlJTVCAgICAgICBMTF9BUEIyX0dSUDFfRm9yY2VSZXNldFxuCisgKiAgICAgICAgIEFQQjJSU1RSICAgICAgVElNMTdSU1QgICAgICAgTExfQVBCMl9HUlAxX0ZvcmNlUmVzZXRcbgorICogICAgICAgICBBUEIyUlNUUiAgICAgIFRJTTIwUlNUICAgICAgIExMX0FQQjJfR1JQMV9Gb3JjZVJlc2V0XG4KKyAqICAgICAgICAgQVBCMlJTVFIgICAgICBTQUkxUlNUICAgICAgICBMTF9BUEIyX0dSUDFfRm9yY2VSZXNldFxuCisgKiAgICAgICAgIEFQQjJSU1RSICAgICAgSFJUSU0xUlNUICAgICAgTExfQVBCMl9HUlAxX0ZvcmNlUmVzZXQKKyAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfU1lTQ0ZHCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfU1BJMQorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU04CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1VTQVJUMQorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9TUEk0ICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU0xNQorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU0xNgorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU0xNworICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU0yMCAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfU0FJMQorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9IUlRJTTEgKCopCisgKgorICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQVBCMl9HUlAxX1JlbGVhc2VSZXNldCh1aW50MzJfdCBQZXJpcGhzKSB7CisgIENMRUFSX0JJVChSQ0MtPkFQQjJSU1RSLCBQZXJpcGhzKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBBUEIyIHBlcmlwaGVyYWwgY2xvY2tzIGluIFNsZWVwIGFuZCBTdG9wIG1vZGVzCisgKiBAcm10b2xsIEFQQjJTTUVOUiAgICAgIFNZU0NGR1NNRU4gICAgICBMTF9BUEIyX0dSUDFfRW5hYmxlQ2xvY2tTdG9wU2xlZXBcbgorICogICAgICAgICBBUEIyU01FTlIgICAgICBUSU0xU01FTiAgICAgICAgTExfQVBCMl9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAqICAgICAgICAgQVBCMlNNRU5SICAgICAgU1BJMVNNRU4gICAgICAgIExMX0FQQjJfR1JQMV9FbmFibGVDbG9ja1N0b3BTbGVlcFxuCisgKiAgICAgICAgIEFQQjJTTUVOUiAgICAgIFRJTThTTUVOICAgICAgICBMTF9BUEIyX0dSUDFfRW5hYmxlQ2xvY2tTdG9wU2xlZXBcbgorICogICAgICAgICBBUEIyU01FTlIgICAgICBVU0FSVDFTTUVOICAgICAgTExfQVBCMl9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAqICAgICAgICAgQVBCMlNNRU5SICAgICAgU1BJNFNNRU4gICAgICAgIExMX0FQQjJfR1JQMV9FbmFibGVDbG9ja1N0b3BTbGVlcFxuCisgKiAgICAgICAgIEFQQjJTTUVOUiAgICAgIFRJTTE1U01FTiAgICAgICBMTF9BUEIyX0dSUDFfRW5hYmxlQ2xvY2tTdG9wU2xlZXBcbgorICogICAgICAgICBBUEIyU01FTlIgICAgICBUSU0xNlNNRU4gICAgICAgTExfQVBCMl9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAqICAgICAgICAgQVBCMlNNRU5SICAgICAgVElNMTdTTUVOICAgICAgIExMX0FQQjJfR1JQMV9FbmFibGVDbG9ja1N0b3BTbGVlcFxuCisgKiAgICAgICAgIEFQQjJTTUVOUiAgICAgIFRJTTIwU01FTiAgICAgICBMTF9BUEIyX0dSUDFfRW5hYmxlQ2xvY2tTdG9wU2xlZXBcbgorICogICAgICAgICBBUEIyU01FTlIgICAgICBTQUkxU01FTiAgICAgICAgTExfQVBCMl9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAqICAgICAgICAgQVBCMlNNRU5SICAgICAgSFJUSU0xU01FTiAgICAgIExMX0FQQjJfR1JQMV9FbmFibGVDbG9ja1N0b3BTbGVlcAorICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9TWVNDRkcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMQorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9TUEkxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVVNBUlQxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1NQSTQgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE1CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE2CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE3CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTIwICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9TQUkxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX0hSVElNMSAoKikKKyAqCisgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4KKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BUEIyX0dSUDFfRW5hYmxlQ2xvY2tTdG9wU2xlZXAodWludDMyX3QgUGVyaXBocykgeworICBfX0lPIHVpbnQzMl90IHRtcHJlZzsKKyAgU0VUX0JJVChSQ0MtPkFQQjJTTUVOUiwgUGVyaXBocyk7CisgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovCisgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCMlNNRU5SLCBQZXJpcGhzKTsKKyAgKHZvaWQpdG1wcmVnOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBBUEIyIHBlcmlwaGVyYWwgY2xvY2tzIGluIFNsZWVwIGFuZCBTdG9wIG1vZGVzCisgKiBAcm10b2xsIEFQQjJTTUVOUiAgICAgIFNZU0NGR1NNRU4gICAgICBMTF9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAqICAgICAgICAgQVBCMlNNRU5SICAgICAgVElNMVNNRU4gICAgICAgIExMX0FQQjJfR1JQMV9EaXNhYmxlQ2xvY2tTdG9wU2xlZXBcbgorICogICAgICAgICBBUEIyU01FTlIgICAgICBTUEkxU01FTiAgICAgICAgTExfQVBCMl9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuCisgKiAgICAgICAgIEFQQjJTTUVOUiAgICAgIFRJTThTTUVOICAgICAgICBMTF9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAqICAgICAgICAgQVBCMlNNRU5SICAgICAgVVNBUlQxU01FTiAgICAgIExMX0FQQjJfR1JQMV9EaXNhYmxlQ2xvY2tTdG9wU2xlZXBcbgorICogICAgICAgICBBUEIyU01FTlIgICAgICBTUEk0U01FTiAgICAgICAgTExfQVBCMl9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuCisgKiAgICAgICAgIEFQQjJTTUVOUiAgICAgIFRJTTE1U01FTiAgICAgICBMTF9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAqICAgICAgICAgQVBCMlNNRU5SICAgICAgVElNMTZTTUVOICAgICAgIExMX0FQQjJfR1JQMV9EaXNhYmxlQ2xvY2tTdG9wU2xlZXBcbgorICogICAgICAgICBBUEIyU01FTlIgICAgICBUSU0xN1NNRU4gICAgICAgTExfQVBCMl9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuCisgKiAgICAgICAgIEFQQjJTTUVOUiAgICAgIFRJTTIwU01FTiAgICAgICBMTF9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAqICAgICAgICAgQVBCMlNNRU5SICAgICAgU0FJMVNNRU4gICAgICAgIExMX0FQQjJfR1JQMV9EaXNhYmxlQ2xvY2tTdG9wU2xlZXBcbgorICogICAgICAgICBBUEIyU01FTlIgICAgICBIUlRJTTFTTUVOICAgICAgTExfQVBCMl9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcAorICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9TWVNDRkcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMQorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9TUEkxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVVNBUlQxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1NQSTQgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE1CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE2CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE3CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTIwICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9TQUkxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX0hSVElNMSAoKikKKyAqCisgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4KKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwKHVpbnQzMl90IFBlcmlwaHMpIHsKKyAgQ0xFQVJfQklUKFJDQy0+QVBCMlNNRU5SLCBQZXJpcGhzKTsKK30KKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworI2VuZGlmIC8qIGRlZmluZWQoUkNDKSAqLworCisvKioKKyAqIEB9CisgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyRzR4eF9MTF9CVVNfSCAqLwpkaWZmIC0tZ2l0IGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfbGxfY29ydGV4LmggYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9sbF9jb3J0ZXguaAppbmRleCAwY2ZhNWZhLi44ZjYyMzlkIDEwMDY0NAotLS0gYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9sbF9jb3J0ZXguaAorKysgYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9sbF9jb3J0ZXguaApAQCAtMSw3MDUgKzEsNzA1IEBACi0vKioNCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgKiBAZmlsZSAgICBzdG0zMmc0eHhfbGxfY29ydGV4LmgNCi0gICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0NCi0gICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgQ09SVEVYIExMIG1vZHVsZS4NCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgKiBAYXR0ZW50aW9uDQotICAqDQotICAqIENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuDQotICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQotICAqDQotICAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGVybXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZQ0KLSAgKiBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb2Z0d2FyZSBjb21wb25lbnQuDQotICAqIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcyB3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLg0KLSAgKg0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICBAdmVyYmF0aW0NCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMNCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICBbLi5dDQotICAgIFRoZSBMTCBDT1JURVggZHJpdmVyIGNvbnRhaW5zIGEgc2V0IG9mIGdlbmVyaWMgQVBJcyB0aGF0IGNhbiBiZQ0KLSAgICB1c2VkIGJ5IHVzZXI6DQotICAgICAgKCspIFNZU1RJQ0sgY29uZmlndXJhdGlvbiB1c2VkIGJ5IExMX21EZWxheSBhbmQgTExfSW5pdDFtc1RpY2sNCi0gICAgICAgICAgZnVuY3Rpb25zDQotICAgICAgKCspIExvdyBwb3dlciBtb2RlIGNvbmZpZ3VyYXRpb24gKFNDQiByZWdpc3RlciBvZiBDb3J0ZXgtTUNVKQ0KLSAgICAgICgrKSBNUFUgQVBJIHRvIGNvbmZpZ3VyZSBhbmQgZW5hYmxlIHJlZ2lvbnMNCi0gICAgICAoKykgQVBJIHRvIGFjY2VzcyB0byBNQ1UgaW5mbyAoQ1BVSUQgcmVnaXN0ZXIpDQotICAgICAgKCspIEFQSSB0byBlbmFibGUgZmF1bHQgaGFuZGxlciAoU0hDU1IgYWNjZXNzZXMpDQotDQotICBAZW5kdmVyYmF0aW0NCi0gICovDQotDQotLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaWZuZGVmIF9fU1RNMzJHNHh4X0xMX0NPUlRFWF9IDQotI2RlZmluZSBfX1NUTTMyRzR4eF9MTF9DT1JURVhfSA0KLQ0KLSNpZmRlZiBfX2NwbHVzcGx1cw0KLWV4dGVybiAiQyIgew0KLSNlbmRpZg0KLQ0KLS8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotI2luY2x1ZGUgInN0bTMyZzR4eC5oIg0KLQ0KLS8qKiBAYWRkdG9ncm91cCBTVE0zMkc0eHhfTExfRHJpdmVyDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIENPUlRFWF9MTCBDT1JURVgNCi0gKiBAew0KLSAqLw0KLQ0KLS8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0NCi0vKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLQ0KLS8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotDQotLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgQ09SVEVYX0xMX0V4cG9ydGVkX0NvbnN0YW50cyBDT1JURVggRXhwb3J0ZWQgQ29uc3RhbnRzDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIENPUlRFWF9MTF9FQ19DTEtTT1VSQ0VfSENMSyBTWVNUSUNLIENsb2NrIFNvdXJjZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9TWVNUSUNLX0NMS1NPVVJDRV9IQ0xLX0RJVjggXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBBSEIgY2xvY2sgZGl2aWRlZCBieSA4IHNlbGVjdGVkIGFzIFN5c1RpY2sgY2xvY2sgc291cmNlLiovDQotI2RlZmluZSBMTF9TWVNUSUNLX0NMS1NPVVJDRV9IQ0xLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgU3lzVGlja19DVFJMX0NMS1NPVVJDRV9Nc2sgLyohPCBBSEIgY2xvY2sgc2VsZWN0ZWQgYXMgU3lzVGljayBjbG9jayBzb3VyY2UuIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBDT1JURVhfTExfRUNfRkFVTFQgSGFuZGxlciBGYXVsdCB0eXBlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX0hBTkRMRVJfRkFVTFRfVVNHIFNDQl9TSENTUl9VU0dGQVVMVEVOQV9Nc2sgLyohPCBVc2FnZSBmYXVsdCAqLw0KLSNkZWZpbmUgTExfSEFORExFUl9GQVVMVF9CVVMgU0NCX1NIQ1NSX0JVU0ZBVUxURU5BX01zayAvKiE8IEJ1cyBmYXVsdCAqLw0KLSNkZWZpbmUgTExfSEFORExFUl9GQVVMVF9NRU0gXA0KLSAgU0NCX1NIQ1NSX01FTUZBVUxURU5BX01zayAvKiE8IE1lbW9yeSBtYW5hZ2VtZW50IGZhdWx0ICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0jaWYgX19NUFVfUFJFU0VOVA0KLQ0KLS8qKiBAZGVmZ3JvdXAgQ09SVEVYX0xMX0VDX0NUUkxfSEZOTUlfUFJJVkRFRiBNUFUgQ29udHJvbA0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9NUFVfQ1RSTF9IRk5NSV9QUklWREVGX05PTkUgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBEaXNhYmxlIE5NSSBhbmQgcHJpdmlsZWdlZCBTVyBhY2Nlc3MgKi8NCi0jZGVmaW5lIExMX01QVV9DVFJMX0hBUkRGQVVMVF9OTUkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIE1QVV9DVFJMX0hGTk1JRU5BX01zayAvKiE8IEVuYWJsZXMgdGhlIG9wZXJhdGlvbiBvZiBNUFUgZHVyaW5nIGhhcmQgZmF1bHQsIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBOTUksIGFuZCBGQVVMVE1BU0sgaGFuZGxlcnMgKi8NCi0jZGVmaW5lIExMX01QVV9DVFJMX1BSSVZJTEVHRURfREVGQVVMVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgTVBVX0NUUkxfUFJJVkRFRkVOQV9Nc2sgLyohPCBFbmFibGUgcHJpdmlsZWdlZCBzb2Z0d2FyZSBhY2Nlc3MgdG8gZGVmYXVsdCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnkgbWFwICovDQotI2RlZmluZSBMTF9NUFVfQ1RSTF9IRk5NSV9QUklWREVGIFwNCi0gIChNUFVfQ1RSTF9IRk5NSUVOQV9Nc2sgfCAgICAgICAgXA0KLSAgIE1QVV9DVFJMX1BSSVZERUZFTkFfTXNrKSAvKiE8IEVuYWJsZSBOTUkgYW5kIHByaXZpbGVnZWQgU1cgYWNjZXNzICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIENPUlRFWF9MTF9FQ19SRUdJT04gTVBVIFJlZ2lvbiBOdW1iZXINCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfTVBVX1JFR0lPTl9OVU1CRVIwIDB4MDBVIC8qITwgUkVHSU9OIE51bWJlciAwICovDQotI2RlZmluZSBMTF9NUFVfUkVHSU9OX05VTUJFUjEgMHgwMVUgLyohPCBSRUdJT04gTnVtYmVyIDEgKi8NCi0jZGVmaW5lIExMX01QVV9SRUdJT05fTlVNQkVSMiAweDAyVSAvKiE8IFJFR0lPTiBOdW1iZXIgMiAqLw0KLSNkZWZpbmUgTExfTVBVX1JFR0lPTl9OVU1CRVIzIDB4MDNVIC8qITwgUkVHSU9OIE51bWJlciAzICovDQotI2RlZmluZSBMTF9NUFVfUkVHSU9OX05VTUJFUjQgMHgwNFUgLyohPCBSRUdJT04gTnVtYmVyIDQgKi8NCi0jZGVmaW5lIExMX01QVV9SRUdJT05fTlVNQkVSNSAweDA1VSAvKiE8IFJFR0lPTiBOdW1iZXIgNSAqLw0KLSNkZWZpbmUgTExfTVBVX1JFR0lPTl9OVU1CRVI2IDB4MDZVIC8qITwgUkVHSU9OIE51bWJlciA2ICovDQotI2RlZmluZSBMTF9NUFVfUkVHSU9OX05VTUJFUjcgMHgwN1UgLyohPCBSRUdJT04gTnVtYmVyIDcgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQ09SVEVYX0xMX0VDX1JFR0lPTl9TSVpFIE1QVSBSZWdpb24gU2l6ZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfMzJCIFwNCi0gICgweDA0VSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgLyohPCAzMkIgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovDQotI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfNjRCIFwNCi0gICgweDA1VSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgLyohPCA2NEIgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovDQotI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfMTI4QiBcDQotICAoMHgwNlUgPDwgTVBVX1JBU1JfU0laRV9Qb3MpIC8qITwgMTI4QiBTaXplIG9mIHRoZSBNUFUgcHJvdGVjdGlvbiByZWdpb24gKi8NCi0jZGVmaW5lIExMX01QVV9SRUdJT05fU0laRV8yNTZCIFwNCi0gICgweDA3VSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgLyohPCAyNTZCIFNpemUgb2YgdGhlIE1QVSBwcm90ZWN0aW9uIHJlZ2lvbiAqLw0KLSNkZWZpbmUgTExfTVBVX1JFR0lPTl9TSVpFXzUxMkIgXA0KLSAgKDB4MDhVIDw8IE1QVV9SQVNSX1NJWkVfUG9zKSAvKiE8IDUxMkIgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovDQotI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfMUtCIFwNCi0gICgweDA5VSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgLyohPCAxS0IgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovDQotI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfMktCIFwNCi0gICgweDBBVSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgLyohPCAyS0IgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovDQotI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfNEtCIFwNCi0gICgweDBCVSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgLyohPCA0S0IgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovDQotI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfOEtCIFwNCi0gICgweDBDVSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgLyohPCA4S0IgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovDQotI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfMTZLQiBcDQotICAoMHgwRFUgPDwgTVBVX1JBU1JfU0laRV9Qb3MpIC8qITwgMTZLQiBTaXplIG9mIHRoZSBNUFUgcHJvdGVjdGlvbiByZWdpb24gKi8NCi0jZGVmaW5lIExMX01QVV9SRUdJT05fU0laRV8zMktCIFwNCi0gICgweDBFVSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgLyohPCAzMktCIFNpemUgb2YgdGhlIE1QVSBwcm90ZWN0aW9uIHJlZ2lvbiAqLw0KLSNkZWZpbmUgTExfTVBVX1JFR0lPTl9TSVpFXzY0S0IgXA0KLSAgKDB4MEZVIDw8IE1QVV9SQVNSX1NJWkVfUG9zKSAvKiE8IDY0S0IgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovDQotI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfMTI4S0IgXA0KLSAgKDB4MTBVIDw8IE1QVV9SQVNSX1NJWkVfUG9zKSAvKiE8IDEyOEtCIFNpemUgb2YgdGhlIE1QVSBwcm90ZWN0aW9uIHJlZ2lvbiAqLw0KLSNkZWZpbmUgTExfTVBVX1JFR0lPTl9TSVpFXzI1NktCIFwNCi0gICgweDExVSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgLyohPCAyNTZLQiBTaXplIG9mIHRoZSBNUFUgcHJvdGVjdGlvbiByZWdpb24gKi8NCi0jZGVmaW5lIExMX01QVV9SRUdJT05fU0laRV81MTJLQiBcDQotICAoMHgxMlUgPDwgTVBVX1JBU1JfU0laRV9Qb3MpIC8qITwgNTEyS0IgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovDQotI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfMU1CIFwNCi0gICgweDEzVSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgLyohPCAxTUIgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovDQotI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfMk1CIFwNCi0gICgweDE0VSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgLyohPCAyTUIgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovDQotI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfNE1CIFwNCi0gICgweDE1VSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgLyohPCA0TUIgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovDQotI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfOE1CIFwNCi0gICgweDE2VSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgLyohPCA4TUIgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovDQotI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfMTZNQiBcDQotICAoMHgxN1UgPDwgTVBVX1JBU1JfU0laRV9Qb3MpIC8qITwgMTZNQiBTaXplIG9mIHRoZSBNUFUgcHJvdGVjdGlvbiByZWdpb24gKi8NCi0jZGVmaW5lIExMX01QVV9SRUdJT05fU0laRV8zMk1CIFwNCi0gICgweDE4VSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgLyohPCAzMk1CIFNpemUgb2YgdGhlIE1QVSBwcm90ZWN0aW9uIHJlZ2lvbiAqLw0KLSNkZWZpbmUgTExfTVBVX1JFR0lPTl9TSVpFXzY0TUIgXA0KLSAgKDB4MTlVIDw8IE1QVV9SQVNSX1NJWkVfUG9zKSAvKiE8IDY0TUIgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovDQotI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfMTI4TUIgXA0KLSAgKDB4MUFVIDw8IE1QVV9SQVNSX1NJWkVfUG9zKSAvKiE8IDEyOE1CIFNpemUgb2YgdGhlIE1QVSBwcm90ZWN0aW9uIHJlZ2lvbiAqLw0KLSNkZWZpbmUgTExfTVBVX1JFR0lPTl9TSVpFXzI1Nk1CIFwNCi0gICgweDFCVSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgLyohPCAyNTZNQiBTaXplIG9mIHRoZSBNUFUgcHJvdGVjdGlvbiByZWdpb24gKi8NCi0jZGVmaW5lIExMX01QVV9SRUdJT05fU0laRV81MTJNQiBcDQotICAoMHgxQ1UgPDwgTVBVX1JBU1JfU0laRV9Qb3MpIC8qITwgNTEyTUIgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovDQotI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfMUdCIFwNCi0gICgweDFEVSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgLyohPCAxR0IgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovDQotI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfMkdCIFwNCi0gICgweDFFVSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgLyohPCAyR0IgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovDQotI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfNEdCIFwNCi0gICgweDFGVSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgLyohPCA0R0IgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIENPUlRFWF9MTF9FQ19SRUdJT05fUFJJVklMRURHRVMgTVBVIFJlZ2lvbiBQcml2aWxlZ2VzDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX01QVV9SRUdJT05fTk9fQUNDRVNTICgweDAwVSA8PCBNUFVfUkFTUl9BUF9Qb3MpIC8qITwgTm8gYWNjZXNzKi8NCi0jZGVmaW5lIExMX01QVV9SRUdJT05fUFJJVl9SVyBcDQotICAoMHgwMVUgPDwgTVBVX1JBU1JfQVBfUG9zKSAvKiE8IFJXIHByaXZpbGVnZWQgKHByaXZpbGVnZWQgYWNjZXNzIG9ubHkpKi8NCi0jZGVmaW5lIExMX01QVV9SRUdJT05fUFJJVl9SV19VUk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoMHgwMlUgPDwgTVBVX1JBU1JfQVBfUG9zKSAvKiE8IFJXIHByaXZpbGVnZWQgLSBSTyB1c2VyIChXcml0ZSBpbiBhIHVzZXIgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbSBnZW5lcmF0ZXMgYSBmYXVsdCkgKi8NCi0jZGVmaW5lIExMX01QVV9SRUdJT05fRlVMTF9BQ0NFU1MgXA0KLSAgKDB4MDNVIDw8IE1QVV9SQVNSX0FQX1BvcykgLyohPCBSVyBwcml2aWxlZ2VkICYgdXNlciAoRnVsbCBhY2Nlc3MpICovDQotI2RlZmluZSBMTF9NUFVfUkVHSU9OX1BSSVZfUk8gXA0KLSAgKDB4MDVVIDw8IE1QVV9SQVNSX0FQX1BvcykgLyohPCBSTyBwcml2aWxlZ2VkIChwcml2aWxlZ2VkIHJlYWQgb25seSkqLw0KLSNkZWZpbmUgTExfTVBVX1JFR0lPTl9QUklWX1JPX1VSTyBcDQotICAoMHgwNlUgPDwgTVBVX1JBU1JfQVBfUG9zKSAvKiE8IFJPIHByaXZpbGVnZWQgJiB1c2VyIChyZWFkIG9ubHkpICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIENPUlRFWF9MTF9FQ19URVggTVBVIFRFWCBMZXZlbA0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9NUFVfVEVYX0xFVkVMMCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoMHgwMFUgPDwgTVBVX1JBU1JfVEVYX1BvcykgLyohPCBiMDAwIGZvciBURVggYml0cyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9NUFVfVEVYX0xFVkVMMSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoMHgwMVUgPDwgTVBVX1JBU1JfVEVYX1BvcykgLyohPCBiMDAxIGZvciBURVggYml0cyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9NUFVfVEVYX0xFVkVMMiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoMHgwMlUgPDwgTVBVX1JBU1JfVEVYX1BvcykgLyohPCBiMDEwIGZvciBURVggYml0cyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9NUFVfVEVYX0xFVkVMNCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoMHgwNFUgPDwgTVBVX1JBU1JfVEVYX1BvcykgLyohPCBiMTAwIGZvciBURVggYml0cyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIENPUlRFWF9MTF9FQ19JTlNUUlVDVElPTl9BQ0NFU1MgTVBVIEluc3RydWN0aW9uIEFjY2Vzcw0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9NUFVfSU5TVFJVQ1RJT05fQUNDRVNTX0VOQUJMRSBcDQotICAweDAwVSAvKiE8IEluc3RydWN0aW9uIGZldGNoZXMgZW5hYmxlZCAqLw0KLSNkZWZpbmUgTExfTVBVX0lOU1RSVUNUSU9OX0FDQ0VTU19ESVNBQkxFIFwNCi0gIE1QVV9SQVNSX1hOX01zayAvKiE8IEluc3RydWN0aW9uIGZldGNoZXMgZGlzYWJsZWQqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBDT1JURVhfTExfRUNfU0hBUkVBQkxFX0FDQ0VTUyBNUFUgU2hhcmVhYmxlIEFjY2Vzcw0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9NUFVfQUNDRVNTX1NIQVJFQUJMRSBcDQotICBNUFVfUkFTUl9TX01zayAvKiE8IFNoYXJlYWJsZSBtZW1vcnkgYXR0cmlidXRlICovDQotI2RlZmluZSBMTF9NUFVfQUNDRVNTX05PVF9TSEFSRUFCTEUgICAgICAgICBcDQotICAweDAwVSAvKiE8IE5vdCBTaGFyZWFibGUgbWVtb3J5IGF0dHJpYnV0ZSBcDQotICAgICAgICAgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQ09SVEVYX0xMX0VDX0NBQ0hFQUJMRV9BQ0NFU1MgTVBVIENhY2hlYWJsZSBBY2Nlc3MNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfTVBVX0FDQ0VTU19DQUNIRUFCTEUgXA0KLSAgTVBVX1JBU1JfQ19Nc2sgLyohPCBDYWNoZWFibGUgbWVtb3J5IGF0dHJpYnV0ZSAqLw0KLSNkZWZpbmUgTExfTVBVX0FDQ0VTU19OT1RfQ0FDSEVBQkxFICAgICAgICAgXA0KLSAgMHgwMFUgLyohPCBOb3QgQ2FjaGVhYmxlIG1lbW9yeSBhdHRyaWJ1dGUgXA0KLSAgICAgICAgICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIENPUlRFWF9MTF9FQ19CVUZGRVJBQkxFX0FDQ0VTUyBNUFUgQnVmZmVyYWJsZSBBY2Nlc3MNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfTVBVX0FDQ0VTU19CVUZGRVJBQkxFIFwNCi0gIE1QVV9SQVNSX0JfTXNrIC8qITwgQnVmZmVyYWJsZSBtZW1vcnkgYXR0cmlidXRlICovDQotI2RlZmluZSBMTF9NUFVfQUNDRVNTX05PVF9CVUZGRVJBQkxFIFwNCi0gIDB4MDBVIC8qITwgTm90IEJ1ZmZlcmFibGUgbWVtb3J5IGF0dHJpYnV0ZSAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotI2VuZGlmIC8qIF9fTVBVX1BSRVNFTlQgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotDQotLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGRlZmdyb3VwIENPUlRFWF9MTF9FeHBvcnRlZF9GdW5jdGlvbnMgQ09SVEVYIEV4cG9ydGVkIEZ1bmN0aW9ucw0KLSAqIEB7DQotICovDQotDQotLyoqIEBkZWZncm91cCBDT1JURVhfTExfRUZfU1lTVElDSyBTWVNUSUNLDQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIHRoZSBTeXN0aWNrIGNvdW50ZXIgZmxhZyBpcyBhY3RpdmUgb3Igbm90Lg0KLSAqIEBub3RlICAgSXQgY2FuIGJlIHVzZWQgaW4gdGltZW91dCBmdW5jdGlvbiBvbiBhcHBsaWNhdGlvbiBzaWRlLg0KLSAqIEBybXRvbGwgU1RLX0NUUkwgICAgIENPVU5URkxBRyAgICAgTExfU1lTVElDS19Jc0FjdGl2ZUNvdW50ZXJGbGFnDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU1RJQ0tfSXNBY3RpdmVDb3VudGVyRmxhZyh2b2lkKSB7DQotICByZXR1cm4gKCgoU3lzVGljay0+Q1RSTCAmIFN5c1RpY2tfQ1RSTF9DT1VOVEZMQUdfTXNrKSA9PQ0KLSAgICAgICAgICAgKFN5c1RpY2tfQ1RSTF9DT1VOVEZMQUdfTXNrKSkNCi0gICAgICAgICAgICAgID8gMVVMDQotICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgU3lzVGljayBjbG9jayBzb3VyY2UNCi0gKiBAcm10b2xsIFNUS19DVFJMICAgICBDTEtTT1VSQ0UgICAgIExMX1NZU1RJQ0tfU2V0Q2xrU291cmNlDQotICogQHBhcmFtICBTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNUSUNLX0NMS1NPVVJDRV9IQ0xLX0RJVjgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNUSUNLX0NMS1NPVVJDRV9IQ0xLDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTVElDS19TZXRDbGtTb3VyY2UodWludDMyX3QgU291cmNlKSB7DQotICBpZiAoU291cmNlID09IExMX1NZU1RJQ0tfQ0xLU09VUkNFX0hDTEspIHsNCi0gICAgU0VUX0JJVChTeXNUaWNrLT5DVFJMLCBMTF9TWVNUSUNLX0NMS1NPVVJDRV9IQ0xLKTsNCi0gIH0gZWxzZSB7DQotICAgIENMRUFSX0JJVChTeXNUaWNrLT5DVFJMLCBMTF9TWVNUSUNLX0NMS1NPVVJDRV9IQ0xLKTsNCi0gIH0NCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgdGhlIFN5c1RpY2sgY2xvY2sgc291cmNlDQotICogQHJtdG9sbCBTVEtfQ1RSTCAgICAgQ0xLU09VUkNFICAgICBMTF9TWVNUSUNLX0dldENsa1NvdXJjZQ0KLSAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNUSUNLX0NMS1NPVVJDRV9IQ0xLX0RJVjgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNUSUNLX0NMS1NPVVJDRV9IQ0xLDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU1RJQ0tfR2V0Q2xrU291cmNlKHZvaWQpIHsNCi0gIHJldHVybiBSRUFEX0JJVChTeXNUaWNrLT5DVFJMLCBMTF9TWVNUSUNLX0NMS1NPVVJDRV9IQ0xLKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgU3lzVGljayBleGNlcHRpb24gcmVxdWVzdA0KLSAqIEBybXRvbGwgU1RLX0NUUkwgICAgIFRJQ0tJTlQgICAgICAgTExfU1lTVElDS19FbmFibGVJVA0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU1RJQ0tfRW5hYmxlSVQodm9pZCkgew0KLSAgU0VUX0JJVChTeXNUaWNrLT5DVFJMLCBTeXNUaWNrX0NUUkxfVElDS0lOVF9Nc2spOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgU3lzVGljayBleGNlcHRpb24gcmVxdWVzdA0KLSAqIEBybXRvbGwgU1RLX0NUUkwgICAgIFRJQ0tJTlQgICAgICAgTExfU1lTVElDS19EaXNhYmxlSVQNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TWVNUSUNLX0Rpc2FibGVJVCh2b2lkKSB7DQotICBDTEVBUl9CSVQoU3lzVGljay0+Q1RSTCwgU3lzVGlja19DVFJMX1RJQ0tJTlRfTXNrKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVja3MgaWYgdGhlIFNZU1RJQ0sgaW50ZXJydXB0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuDQotICogQHJtdG9sbCBTVEtfQ1RSTCAgICAgVElDS0lOVCAgICAgICBMTF9TWVNUSUNLX0lzRW5hYmxlZElUDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU1RJQ0tfSXNFbmFibGVkSVQodm9pZCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoU3lzVGljay0+Q1RSTCwgU3lzVGlja19DVFJMX1RJQ0tJTlRfTXNrKSA9PQ0KLSAgICAgICAgICAgKFN5c1RpY2tfQ1RSTF9USUNLSU5UX01zaykpDQotICAgICAgICAgICAgICA/IDFVTA0KLSAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQ09SVEVYX0xMX0VGX0xPV19QT1dFUl9NT0RFIExPVyBQT1dFUiBNT0RFDQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFByb2Nlc3NvciB1c2VzIHNsZWVwIGFzIGl0cyBsb3cgcG93ZXIgbW9kZQ0KLSAqIEBybXRvbGwgU0NCX1NDUiAgICAgIFNMRUVQREVFUCAgICAgTExfTFBNX0VuYWJsZVNsZWVwDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBNX0VuYWJsZVNsZWVwKHZvaWQpIHsNCi0gIC8qIENsZWFyIFNMRUVQREVFUCBiaXQgb2YgQ29ydGV4IFN5c3RlbSBDb250cm9sIFJlZ2lzdGVyICovDQotICBDTEVBUl9CSVQoU0NCLT5TQ1IsICgodWludDMyX3QpU0NCX1NDUl9TTEVFUERFRVBfTXNrKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUHJvY2Vzc29yIHVzZXMgZGVlcCBzbGVlcCBhcyBpdHMgbG93IHBvd2VyIG1vZGUNCi0gKiBAcm10b2xsIFNDQl9TQ1IgICAgICBTTEVFUERFRVAgICAgIExMX0xQTV9FbmFibGVEZWVwU2xlZXANCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUE1fRW5hYmxlRGVlcFNsZWVwKHZvaWQpIHsNCi0gIC8qIFNldCBTTEVFUERFRVAgYml0IG9mIENvcnRleCBTeXN0ZW0gQ29udHJvbCBSZWdpc3RlciAqLw0KLSAgU0VUX0JJVChTQ0ItPlNDUiwgKCh1aW50MzJfdClTQ0JfU0NSX1NMRUVQREVFUF9Nc2spKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDb25maWd1cmVzIHNsZWVwLW9uLWV4aXQgd2hlbiByZXR1cm5pbmcgZnJvbSBIYW5kbGVyIG1vZGUgdG8gVGhyZWFkDQotICogbW9kZS4NCi0gKiBAbm90ZSAgIFNldHRpbmcgdGhpcyBiaXQgdG8gMSBlbmFibGVzIGFuIGludGVycnVwdC1kcml2ZW4gYXBwbGljYXRpb24gdG8NCi0gKiBhdm9pZCByZXR1cm5pbmcgdG8gYW4gZW1wdHkgbWFpbiBhcHBsaWNhdGlvbi4NCi0gKiBAcm10b2xsIFNDQl9TQ1IgICAgICBTTEVFUE9ORVhJVCAgIExMX0xQTV9FbmFibGVTbGVlcE9uRXhpdA0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0xQTV9FbmFibGVTbGVlcE9uRXhpdCh2b2lkKSB7DQotICAvKiBTZXQgU0xFRVBPTkVYSVQgYml0IG9mIENvcnRleCBTeXN0ZW0gQ29udHJvbCBSZWdpc3RlciAqLw0KLSAgU0VUX0JJVChTQ0ItPlNDUiwgKCh1aW50MzJfdClTQ0JfU0NSX1NMRUVQT05FWElUX01zaykpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERvIG5vdCBzbGVlcCB3aGVuIHJldHVybmluZyB0byBUaHJlYWQgbW9kZS4NCi0gKiBAcm10b2xsIFNDQl9TQ1IgICAgICBTTEVFUE9ORVhJVCAgIExMX0xQTV9EaXNhYmxlU2xlZXBPbkV4aXQNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUE1fRGlzYWJsZVNsZWVwT25FeGl0KHZvaWQpIHsNCi0gIC8qIENsZWFyIFNMRUVQT05FWElUIGJpdCBvZiBDb3J0ZXggU3lzdGVtIENvbnRyb2wgUmVnaXN0ZXIgKi8NCi0gIENMRUFSX0JJVChTQ0ItPlNDUiwgKCh1aW50MzJfdClTQ0JfU0NSX1NMRUVQT05FWElUX01zaykpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZWQgZXZlbnRzIGFuZCBhbGwgaW50ZXJydXB0cywgaW5jbHVkaW5nIGRpc2FibGVkIGludGVycnVwdHMsIGNhbg0KLSAqIHdha2V1cCB0aGUgcHJvY2Vzc29yLg0KLSAqIEBybXRvbGwgU0NCX1NDUiAgICAgIFNFVkVPTlBFTkQgICAgTExfTFBNX0VuYWJsZUV2ZW50T25QZW5kDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBNX0VuYWJsZUV2ZW50T25QZW5kKHZvaWQpIHsNCi0gIC8qIFNldCBTRVZFT05QRU5EIGJpdCBvZiBDb3J0ZXggU3lzdGVtIENvbnRyb2wgUmVnaXN0ZXIgKi8NCi0gIFNFVF9CSVQoU0NCLT5TQ1IsICgodWludDMyX3QpU0NCX1NDUl9TRVZPTlBFTkRfTXNrKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgT25seSBlbmFibGVkIGludGVycnVwdHMgb3IgZXZlbnRzIGNhbiB3YWtldXAgdGhlIHByb2Nlc3NvciwgZGlzYWJsZWQNCi0gKiBpbnRlcnJ1cHRzIGFyZSBleGNsdWRlZA0KLSAqIEBybXRvbGwgU0NCX1NDUiAgICAgIFNFVkVPTlBFTkQgICAgTExfTFBNX0Rpc2FibGVFdmVudE9uUGVuZA0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0xQTV9EaXNhYmxlRXZlbnRPblBlbmQodm9pZCkgew0KLSAgLyogQ2xlYXIgU0VWRU9OUEVORCBiaXQgb2YgQ29ydGV4IFN5c3RlbSBDb250cm9sIFJlZ2lzdGVyICovDQotICBDTEVBUl9CSVQoU0NCLT5TQ1IsICgodWludDMyX3QpU0NCX1NDUl9TRVZPTlBFTkRfTXNrKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBDT1JURVhfTExfRUZfSEFORExFUiBIQU5ETEVSDQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSBhIGZhdWx0IGluIFN5c3RlbSBoYW5kbGVyIGNvbnRyb2wgcmVnaXN0ZXIgKFNIQ1NSKQ0KLSAqIEBybXRvbGwgU0NCX1NIQ1NSICAgIE1FTUZBVUxURU5BICAgTExfSEFORExFUl9FbmFibGVGYXVsdA0KLSAqIEBwYXJhbSAgRmF1bHQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfSEFORExFUl9GQVVMVF9VU0cNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IQU5ETEVSX0ZBVUxUX0JVUw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0hBTkRMRVJfRkFVTFRfTUVNDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSEFORExFUl9FbmFibGVGYXVsdCh1aW50MzJfdCBGYXVsdCkgew0KLSAgLyogRW5hYmxlIHRoZSBzeXN0ZW0gaGFuZGxlciBmYXVsdCAqLw0KLSAgU0VUX0JJVChTQ0ItPlNIQ1NSLCBGYXVsdCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBhIGZhdWx0IGluIFN5c3RlbSBoYW5kbGVyIGNvbnRyb2wgcmVnaXN0ZXIgKFNIQ1NSKQ0KLSAqIEBybXRvbGwgU0NCX1NIQ1NSICAgIE1FTUZBVUxURU5BICAgTExfSEFORExFUl9EaXNhYmxlRmF1bHQNCi0gKiBAcGFyYW0gIEZhdWx0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0hBTkRMRVJfRkFVTFRfVVNHDQotICogICAgICAgICBAYXJnIEByZWYgTExfSEFORExFUl9GQVVMVF9CVVMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IQU5ETEVSX0ZBVUxUX01FTQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0hBTkRMRVJfRGlzYWJsZUZhdWx0KHVpbnQzMl90IEZhdWx0KSB7DQotICAvKiBEaXNhYmxlIHRoZSBzeXN0ZW0gaGFuZGxlciBmYXVsdCAqLw0KLSAgQ0xFQVJfQklUKFNDQi0+U0hDU1IsIEZhdWx0KTsNCi19DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIENPUlRFWF9MTF9FRl9NQ1VfSU5GTyBNQ1UgSU5GTw0KLSAqIEB7DQotICovDQotDQotLyoqDQotICogQGJyaWVmICBHZXQgSW1wbGVtZW50ZXIgY29kZQ0KLSAqIEBybXRvbGwgU0NCX0NQVUlEICAgIElNUExFTUVOVEVSICAgTExfQ1BVSURfR2V0SW1wbGVtZW50ZXINCi0gKiBAcmV0dmFsIFZhbHVlIHNob3VsZCBiZSBlcXVhbCB0byAweDQxIGZvciBBUk0NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQ1BVSURfR2V0SW1wbGVtZW50ZXIodm9pZCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoU0NCLT5DUFVJRCwgU0NCX0NQVUlEX0lNUExFTUVOVEVSX01zaykgPj4NCi0gICAgICAgICAgICAgICAgICAgIFNDQl9DUFVJRF9JTVBMRU1FTlRFUl9Qb3MpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBWYXJpYW50IG51bWJlciAoVGhlIHIgdmFsdWUgaW4gdGhlIHJucG4gcHJvZHVjdCByZXZpc2lvbg0KLSAqIGlkZW50aWZpZXIpDQotICogQHJtdG9sbCBTQ0JfQ1BVSUQgICAgVkFSSUFOVCAgICAgICBMTF9DUFVJRF9HZXRWYXJpYW50DQotICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIDAgYW5kIDI1NSAoMHgwOiByZXZpc2lvbiAwKQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DUFVJRF9HZXRWYXJpYW50KHZvaWQpIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFNDQi0+Q1BVSUQsIFNDQl9DUFVJRF9WQVJJQU5UX01zaykgPj4NCi0gICAgICAgICAgICAgICAgICAgIFNDQl9DUFVJRF9WQVJJQU5UX1Bvcyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IEFyY2hpdGVjdHVyZSBudW1iZXINCi0gKiBAcm10b2xsIFNDQl9DUFVJRCAgICBBUkNISVRFQ1RVUkUgIExMX0NQVUlEX0dldEFyY2hpdGVjdHVyZQ0KLSAqIEByZXR2YWwgVmFsdWUgc2hvdWxkIGJlIGVxdWFsIHRvIDB4RiBmb3IgQ29ydGV4LU00IGRldmljZXMNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQ1BVSURfR2V0QXJjaGl0ZWN0dXJlKHZvaWQpIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFNDQi0+Q1BVSUQsIFNDQl9DUFVJRF9BUkNISVRFQ1RVUkVfTXNrKSA+Pg0KLSAgICAgICAgICAgICAgICAgICAgU0NCX0NQVUlEX0FSQ0hJVEVDVFVSRV9Qb3MpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBQYXJ0IG51bWJlcg0KLSAqIEBybXRvbGwgU0NCX0NQVUlEICAgIFBBUlROTyAgICAgICAgTExfQ1BVSURfR2V0UGFyTm8NCi0gKiBAcmV0dmFsIFZhbHVlIHNob3VsZCBiZSBlcXVhbCB0byAweEMyNCBmb3IgQ29ydGV4LU00DQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NQVUlEX0dldFBhck5vKHZvaWQpIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFNDQi0+Q1BVSUQsIFNDQl9DUFVJRF9QQVJUTk9fTXNrKSA+Pg0KLSAgICAgICAgICAgICAgICAgICAgU0NCX0NQVUlEX1BBUlROT19Qb3MpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBSZXZpc2lvbiBudW1iZXIgKFRoZSBwIHZhbHVlIGluIHRoZSBybnBuIHByb2R1Y3QgcmV2aXNpb24NCi0gKiBpZGVudGlmaWVyLCBpbmRpY2F0ZXMgcGF0Y2ggcmVsZWFzZSkNCi0gKiBAcm10b2xsIFNDQl9DUFVJRCAgICBSRVZJU0lPTiAgICAgIExMX0NQVUlEX0dldFJldmlzaW9uDQotICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIDAgYW5kIDI1NSAoMHgxOiBwYXRjaCAxKQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DUFVJRF9HZXRSZXZpc2lvbih2b2lkKSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTQ0ItPkNQVUlELCBTQ0JfQ1BVSURfUkVWSVNJT05fTXNrKSA+Pg0KLSAgICAgICAgICAgICAgICAgICAgU0NCX0NQVUlEX1JFVklTSU9OX1Bvcyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotI2lmIF9fTVBVX1BSRVNFTlQNCi0vKiogQGRlZmdyb3VwIENPUlRFWF9MTF9FRl9NUFUgTVBVDQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSBNUFUgd2l0aCBpbnB1dCBvcHRpb25zDQotICogQHJtdG9sbCBNUFVfQ1RSTCAgICAgRU5BQkxFICAgICAgICBMTF9NUFVfRW5hYmxlDQotICogQHBhcmFtICBPcHRpb25zIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX0NUUkxfSEZOTUlfUFJJVkRFRl9OT05FDQotICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX0NUUkxfSEFSREZBVUxUX05NSQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX01QVV9DVFJMX1BSSVZJTEVHRURfREVGQVVMVA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX01QVV9DVFJMX0hGTk1JX1BSSVZERUYNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9NUFVfRW5hYmxlKHVpbnQzMl90IE9wdGlvbnMpIHsNCi0gIC8qIEVuYWJsZSB0aGUgTVBVKi8NCi0gIFdSSVRFX1JFRyhNUFUtPkNUUkwsIChNUFVfQ1RSTF9FTkFCTEVfTXNrIHwgT3B0aW9ucykpOw0KLSAgLyogRW5zdXJlIE1QVSBzZXR0aW5ncyB0YWtlIGVmZmVjdHMgKi8NCi0gIF9fRFNCKCk7DQotICAvKiBTZXF1ZW5jZSBpbnN0cnVjdGlvbiBmZXRjaGVzIHVzaW5nIHVwZGF0ZSBzZXR0aW5ncyAqLw0KLSAgX19JU0IoKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIE1QVQ0KLSAqIEBybXRvbGwgTVBVX0NUUkwgICAgIEVOQUJMRSAgICAgICAgTExfTVBVX0Rpc2FibGUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9NUFVfRGlzYWJsZSh2b2lkKSB7DQotICAvKiBNYWtlIHN1cmUgb3V0c3RhbmRpbmcgdHJhbnNmZXJzIGFyZSBkb25lICovDQotICBfX0RNQigpOw0KLSAgLyogRGlzYWJsZSBNUFUqLw0KLSAgV1JJVEVfUkVHKE1QVS0+Q1RSTCwgMFUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIGlmIE1QVSBpcyBlbmFibGVkIG9yIG5vdA0KLSAqIEBybXRvbGwgTVBVX0NUUkwgICAgIEVOQUJMRSAgICAgICAgTExfTVBVX0lzRW5hYmxlZA0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9NUFVfSXNFbmFibGVkKHZvaWQpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKE1QVS0+Q1RSTCwgTVBVX0NUUkxfRU5BQkxFX01zaykgPT0gKE1QVV9DVFJMX0VOQUJMRV9Nc2spKQ0KLSAgICAgICAgICAgICAgPyAxVUwNCi0gICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgYSBNUFUgcmVnaW9uDQotICogQHJtdG9sbCBNUFVfUkFTUiAgICAgRU5BQkxFICAgICAgICBMTF9NUFVfRW5hYmxlUmVnaW9uDQotICogQHBhcmFtICBSZWdpb24gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfUkVHSU9OX05VTUJFUjANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfUkVHSU9OX05VTUJFUjENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfUkVHSU9OX05VTUJFUjINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfUkVHSU9OX05VTUJFUjMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfUkVHSU9OX05VTUJFUjQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfUkVHSU9OX05VTUJFUjUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfUkVHSU9OX05VTUJFUjYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfUkVHSU9OX05VTUJFUjcNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9NUFVfRW5hYmxlUmVnaW9uKHVpbnQzMl90IFJlZ2lvbikgew0KLSAgLyogU2V0IFJlZ2lvbiBudW1iZXIgKi8NCi0gIFdSSVRFX1JFRyhNUFUtPlJOUiwgUmVnaW9uKTsNCi0gIC8qIEVuYWJsZSB0aGUgTVBVIHJlZ2lvbiAqLw0KLSAgU0VUX0JJVChNUFUtPlJBU1IsIE1QVV9SQVNSX0VOQUJMRV9Nc2spOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENvbmZpZ3VyZSBhbmQgZW5hYmxlIGEgcmVnaW9uDQotICogQHJtdG9sbCBNUFVfUk5SICAgICAgUkVHSU9OICAgICAgICBMTF9NUFVfQ29uZmlnUmVnaW9uXG4NCi0gKiAgICAgICAgIE1QVV9SQkFSICAgICBSRUdJT04gICAgICAgIExMX01QVV9Db25maWdSZWdpb25cbg0KLSAqICAgICAgICAgTVBVX1JCQVIgICAgIEFERFIgICAgICAgICAgTExfTVBVX0NvbmZpZ1JlZ2lvblxuDQotICogICAgICAgICBNUFVfUkFTUiAgICAgWE4gICAgICAgICAgICBMTF9NUFVfQ29uZmlnUmVnaW9uXG4NCi0gKiAgICAgICAgIE1QVV9SQVNSICAgICBBUCAgICAgICAgICAgIExMX01QVV9Db25maWdSZWdpb25cbg0KLSAqICAgICAgICAgTVBVX1JBU1IgICAgIFMgICAgICAgICAgICAgTExfTVBVX0NvbmZpZ1JlZ2lvblxuDQotICogICAgICAgICBNUFVfUkFTUiAgICAgQyAgICAgICAgICAgICBMTF9NUFVfQ29uZmlnUmVnaW9uXG4NCi0gKiAgICAgICAgIE1QVV9SQVNSICAgICBCICAgICAgICAgICAgIExMX01QVV9Db25maWdSZWdpb25cbg0KLSAqICAgICAgICAgTVBVX1JBU1IgICAgIFNJWkUgICAgICAgICAgTExfTVBVX0NvbmZpZ1JlZ2lvbg0KLSAqIEBwYXJhbSAgUmVnaW9uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVIwDQotICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVIxDQotICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVIyDQotICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVIzDQotICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVI0DQotICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVI1DQotICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVI2DQotICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVI3DQotICogQHBhcmFtICBBZGRyZXNzIFZhbHVlIG9mIHJlZ2lvbiBiYXNlIGFkZHJlc3MNCi0gKiBAcGFyYW0gIFN1YlJlZ2lvbkRpc2FibGUgU3ViLXJlZ2lvbiBkaXNhYmxlIHZhbHVlIGJldHdlZW4gTWluX0RhdGEgPSAweDAwIGFuZA0KLSAqIE1heF9EYXRhID0gMHhGRg0KLSAqIEBwYXJhbSAgQXR0cmlidXRlcyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nDQotICogdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX01QVV9SRUdJT05fU0laRV8zMkIgb3IgQHJlZiBMTF9NUFVfUkVHSU9OX1NJWkVfNjRCIG9yDQotICogQHJlZiBMTF9NUFVfUkVHSU9OX1NJWkVfMTI4QiBvciBAcmVmIExMX01QVV9SRUdJT05fU0laRV8yNTZCIG9yIEByZWYNCi0gKiBMTF9NUFVfUkVHSU9OX1NJWkVfNTEyQiBvciBAcmVmIExMX01QVV9SRUdJT05fU0laRV8xS0Igb3IgQHJlZg0KLSAqIExMX01QVV9SRUdJT05fU0laRV8yS0Igb3IgQHJlZiBMTF9NUFVfUkVHSU9OX1NJWkVfNEtCIG9yIEByZWYNCi0gKiBMTF9NUFVfUkVHSU9OX1NJWkVfOEtCIG9yIEByZWYgTExfTVBVX1JFR0lPTl9TSVpFXzE2S0Igb3IgQHJlZg0KLSAqIExMX01QVV9SRUdJT05fU0laRV8zMktCIG9yIEByZWYgTExfTVBVX1JFR0lPTl9TSVpFXzY0S0Igb3IgQHJlZg0KLSAqIExMX01QVV9SRUdJT05fU0laRV8xMjhLQiBvciBAcmVmIExMX01QVV9SRUdJT05fU0laRV8yNTZLQiBvciBAcmVmDQotICogTExfTVBVX1JFR0lPTl9TSVpFXzUxMktCIG9yIEByZWYgTExfTVBVX1JFR0lPTl9TSVpFXzFNQiBvciBAcmVmDQotICogTExfTVBVX1JFR0lPTl9TSVpFXzJNQiBvciBAcmVmIExMX01QVV9SRUdJT05fU0laRV80TUIgb3IgQHJlZg0KLSAqIExMX01QVV9SRUdJT05fU0laRV84TUIgb3IgQHJlZiBMTF9NUFVfUkVHSU9OX1NJWkVfMTZNQiBvciBAcmVmDQotICogTExfTVBVX1JFR0lPTl9TSVpFXzMyTUIgb3IgQHJlZiBMTF9NUFVfUkVHSU9OX1NJWkVfNjRNQiBvciBAcmVmDQotICogTExfTVBVX1JFR0lPTl9TSVpFXzEyOE1CIG9yIEByZWYgTExfTVBVX1JFR0lPTl9TSVpFXzI1Nk1CIG9yIEByZWYNCi0gKiBMTF9NUFVfUkVHSU9OX1NJWkVfNTEyTUIgb3IgQHJlZiBMTF9NUFVfUkVHSU9OX1NJWkVfMUdCIG9yIEByZWYNCi0gKiBMTF9NUFVfUkVHSU9OX1NJWkVfMkdCIG9yIEByZWYgTExfTVBVX1JFR0lPTl9TSVpFXzRHQg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX01QVV9SRUdJT05fTk9fQUNDRVNTIG9yIEByZWYgTExfTVBVX1JFR0lPTl9QUklWX1JXIG9yDQotICogQHJlZiBMTF9NUFVfUkVHSU9OX1BSSVZfUldfVVJPIG9yIEByZWYgTExfTVBVX1JFR0lPTl9GVUxMX0FDQ0VTUyBvciBAcmVmDQotICogTExfTVBVX1JFR0lPTl9QUklWX1JPIG9yIEByZWYgTExfTVBVX1JFR0lPTl9QUklWX1JPX1VSTw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX01QVV9URVhfTEVWRUwwIG9yIEByZWYgTExfTVBVX1RFWF9MRVZFTDEgb3IgQHJlZg0KLSAqIExMX01QVV9URVhfTEVWRUwyIG9yIEByZWYgTExfTVBVX1RFWF9MRVZFTDQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfSU5TVFJVQ1RJT05fQUNDRVNTX0VOQUJMRSBvciAgQHJlZg0KLSAqIExMX01QVV9JTlNUUlVDVElPTl9BQ0NFU1NfRElTQUJMRQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX01QVV9BQ0NFU1NfU0hBUkVBQkxFIG9yIEByZWYgTExfTVBVX0FDQ0VTU19OT1RfU0hBUkVBQkxFDQotICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX0FDQ0VTU19DQUNIRUFCTEUgb3IgQHJlZiBMTF9NUFVfQUNDRVNTX05PVF9DQUNIRUFCTEUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfQUNDRVNTX0JVRkZFUkFCTEUgb3IgQHJlZg0KLSAqIExMX01QVV9BQ0NFU1NfTk9UX0JVRkZFUkFCTEUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9NUFVfQ29uZmlnUmVnaW9uKHVpbnQzMl90IFJlZ2lvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFN1YlJlZ2lvbkRpc2FibGUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBBZGRyZXNzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQXR0cmlidXRlcykgew0KLSAgLyogU2V0IFJlZ2lvbiBudW1iZXIgKi8NCi0gIFdSSVRFX1JFRyhNUFUtPlJOUiwgUmVnaW9uKTsNCi0gIC8qIFNldCBiYXNlIGFkZHJlc3MgKi8NCi0gIFdSSVRFX1JFRyhNUFUtPlJCQVIsIChBZGRyZXNzICYgMHhGRkZGRkZFMFUpKTsNCi0gIC8qIENvbmZpZ3VyZSBNUFUgKi8NCi0gIFdSSVRFX1JFRyhNUFUtPlJBU1IsIChNUFVfUkFTUl9FTkFCTEVfTXNrIHwgQXR0cmlidXRlcyB8DQotICAgICAgICAgICAgICAgICAgICAgICAgKFN1YlJlZ2lvbkRpc2FibGUgPDwgTVBVX1JBU1JfU1JEX1BvcykpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIGEgcmVnaW9uDQotICogQHJtdG9sbCBNUFVfUk5SICAgICAgUkVHSU9OICAgICAgICBMTF9NUFVfRGlzYWJsZVJlZ2lvblxuDQotICogICAgICAgICBNUFVfUkFTUiAgICAgRU5BQkxFICAgICAgICBMTF9NUFVfRGlzYWJsZVJlZ2lvbg0KLSAqIEBwYXJhbSAgUmVnaW9uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVIwDQotICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVIxDQotICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVIyDQotICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVIzDQotICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVI0DQotICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVI1DQotICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVI2DQotICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVI3DQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTVBVX0Rpc2FibGVSZWdpb24odWludDMyX3QgUmVnaW9uKSB7DQotICAvKiBTZXQgUmVnaW9uIG51bWJlciAqLw0KLSAgV1JJVEVfUkVHKE1QVS0+Uk5SLCBSZWdpb24pOw0KLSAgLyogRGlzYWJsZSB0aGUgTVBVIHJlZ2lvbiAqLw0KLSAgQ0xFQVJfQklUKE1QVS0+UkFTUiwgTVBVX1JBU1JfRU5BQkxFX01zayk7DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotI2VuZGlmIC8qIF9fTVBVX1BSRVNFTlQgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0jaWZkZWYgX19jcGx1c3BsdXMNCi19DQotI2VuZGlmDQotDQotI2VuZGlmIC8qIF9fU1RNMzJHNHh4X0xMX0NPUlRFWF9IICovDQorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZzR4eF9sbF9jb3J0ZXguaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgQ09SVEVYIExMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0ZXJtcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlCisgICogaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc29mdHdhcmUgY29tcG9uZW50LgorICAqIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcyB3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICBAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGUgTEwgQ09SVEVYIGRyaXZlciBjb250YWlucyBhIHNldCBvZiBnZW5lcmljIEFQSXMgdGhhdCBjYW4gYmUKKyAgICB1c2VkIGJ5IHVzZXI6CisgICAgICAoKykgU1lTVElDSyBjb25maWd1cmF0aW9uIHVzZWQgYnkgTExfbURlbGF5IGFuZCBMTF9Jbml0MW1zVGljaworICAgICAgICAgIGZ1bmN0aW9ucworICAgICAgKCspIExvdyBwb3dlciBtb2RlIGNvbmZpZ3VyYXRpb24gKFNDQiByZWdpc3RlciBvZiBDb3J0ZXgtTUNVKQorICAgICAgKCspIE1QVSBBUEkgdG8gY29uZmlndXJlIGFuZCBlbmFibGUgcmVnaW9ucworICAgICAgKCspIEFQSSB0byBhY2Nlc3MgdG8gTUNVIGluZm8gKENQVUlEIHJlZ2lzdGVyKQorICAgICAgKCspIEFQSSB0byBlbmFibGUgZmF1bHQgaGFuZGxlciAoU0hDU1IgYWNjZXNzZXMpCisKKyAgQGVuZHZlcmJhdGltCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9fU1RNMzJHNHh4X0xMX0NPUlRFWF9ICisjZGVmaW5lIF9fU1RNMzJHNHh4X0xMX0NPUlRFWF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmc0eHguaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzR4eF9MTF9Ecml2ZXIKKyAqIEB7CisgKi8KKworLyoqIEBkZWZncm91cCBDT1JURVhfTEwgQ09SVEVYCisgKiBAeworICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX0xMX0V4cG9ydGVkX0NvbnN0YW50cyBDT1JURVggRXhwb3J0ZWQgQ29uc3RhbnRzCisgKiBAeworICovCisKKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX0xMX0VDX0NMS1NPVVJDRV9IQ0xLIFNZU1RJQ0sgQ2xvY2sgU291cmNlCisgKiBAeworICovCisjZGVmaW5lIExMX1NZU1RJQ0tfQ0xLU09VUkNFX0hDTEtfRElWOCBcCisgIDB4MDAwMDAwMDBVIC8qITwgQUhCIGNsb2NrIGRpdmlkZWQgYnkgOCBzZWxlY3RlZCBhcyBTeXNUaWNrIGNsb2NrIHNvdXJjZS4qLworI2RlZmluZSBMTF9TWVNUSUNLX0NMS1NPVVJDRV9IQ0xLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBTeXNUaWNrX0NUUkxfQ0xLU09VUkNFX01zayAvKiE8IEFIQiBjbG9jayBzZWxlY3RlZCBhcyBTeXNUaWNrIGNsb2NrIHNvdXJjZS4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIENPUlRFWF9MTF9FQ19GQVVMVCBIYW5kbGVyIEZhdWx0IHR5cGUKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfSEFORExFUl9GQVVMVF9VU0cgU0NCX1NIQ1NSX1VTR0ZBVUxURU5BX01zayAvKiE8IFVzYWdlIGZhdWx0ICovCisjZGVmaW5lIExMX0hBTkRMRVJfRkFVTFRfQlVTIFNDQl9TSENTUl9CVVNGQVVMVEVOQV9Nc2sgLyohPCBCdXMgZmF1bHQgKi8KKyNkZWZpbmUgTExfSEFORExFUl9GQVVMVF9NRU0gXAorICBTQ0JfU0hDU1JfTUVNRkFVTFRFTkFfTXNrIC8qITwgTWVtb3J5IG1hbmFnZW1lbnQgZmF1bHQgKi8KKy8qKgorICogQH0KKyAqLworCisjaWYgX19NUFVfUFJFU0VOVAorCisvKiogQGRlZmdyb3VwIENPUlRFWF9MTF9FQ19DVFJMX0hGTk1JX1BSSVZERUYgTVBVIENvbnRyb2wKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfTVBVX0NUUkxfSEZOTUlfUFJJVkRFRl9OT05FIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBEaXNhYmxlIE5NSSBhbmQgcHJpdmlsZWdlZCBTVyBhY2Nlc3MgKi8KKyNkZWZpbmUgTExfTVBVX0NUUkxfSEFSREZBVUxUX05NSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBNUFVfQ1RSTF9IRk5NSUVOQV9Nc2sgLyohPCBFbmFibGVzIHRoZSBvcGVyYXRpb24gb2YgTVBVIGR1cmluZyBoYXJkIGZhdWx0LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOTUksIGFuZCBGQVVMVE1BU0sgaGFuZGxlcnMgKi8KKyNkZWZpbmUgTExfTVBVX0NUUkxfUFJJVklMRUdFRF9ERUZBVUxUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIE1QVV9DVFJMX1BSSVZERUZFTkFfTXNrIC8qITwgRW5hYmxlIHByaXZpbGVnZWQgc29mdHdhcmUgYWNjZXNzIHRvIGRlZmF1bHQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnkgbWFwICovCisjZGVmaW5lIExMX01QVV9DVFJMX0hGTk1JX1BSSVZERUYgXAorICAoTVBVX0NUUkxfSEZOTUlFTkFfTXNrIHwgICAgICAgIFwKKyAgIE1QVV9DVFJMX1BSSVZERUZFTkFfTXNrKSAvKiE8IEVuYWJsZSBOTUkgYW5kIHByaXZpbGVnZWQgU1cgYWNjZXNzICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBDT1JURVhfTExfRUNfUkVHSU9OIE1QVSBSZWdpb24gTnVtYmVyCisgKiBAeworICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fTlVNQkVSMCAweDAwVSAvKiE8IFJFR0lPTiBOdW1iZXIgMCAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX05VTUJFUjEgMHgwMVUgLyohPCBSRUdJT04gTnVtYmVyIDEgKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9OVU1CRVIyIDB4MDJVIC8qITwgUkVHSU9OIE51bWJlciAyICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fTlVNQkVSMyAweDAzVSAvKiE8IFJFR0lPTiBOdW1iZXIgMyAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX05VTUJFUjQgMHgwNFUgLyohPCBSRUdJT04gTnVtYmVyIDQgKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9OVU1CRVI1IDB4MDVVIC8qITwgUkVHSU9OIE51bWJlciA1ICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fTlVNQkVSNiAweDA2VSAvKiE8IFJFR0lPTiBOdW1iZXIgNiAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX05VTUJFUjcgMHgwN1UgLyohPCBSRUdJT04gTnVtYmVyIDcgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIENPUlRFWF9MTF9FQ19SRUdJT05fU0laRSBNUFUgUmVnaW9uIFNpemUKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9TSVpFXzMyQiBcCisgICgweDA0VSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgLyohPCAzMkIgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fU0laRV82NEIgXAorICAoMHgwNVUgPDwgTVBVX1JBU1JfU0laRV9Qb3MpIC8qITwgNjRCIFNpemUgb2YgdGhlIE1QVSBwcm90ZWN0aW9uIHJlZ2lvbiAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfMTI4QiBcCisgICgweDA2VSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgLyohPCAxMjhCIFNpemUgb2YgdGhlIE1QVSBwcm90ZWN0aW9uIHJlZ2lvbiAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfMjU2QiBcCisgICgweDA3VSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgLyohPCAyNTZCIFNpemUgb2YgdGhlIE1QVSBwcm90ZWN0aW9uIHJlZ2lvbiAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfNTEyQiBcCisgICgweDA4VSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgLyohPCA1MTJCIFNpemUgb2YgdGhlIE1QVSBwcm90ZWN0aW9uIHJlZ2lvbiAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfMUtCIFwKKyAgKDB4MDlVIDw8IE1QVV9SQVNSX1NJWkVfUG9zKSAvKiE8IDFLQiBTaXplIG9mIHRoZSBNUFUgcHJvdGVjdGlvbiByZWdpb24gKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9TSVpFXzJLQiBcCisgICgweDBBVSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgLyohPCAyS0IgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fU0laRV80S0IgXAorICAoMHgwQlUgPDwgTVBVX1JBU1JfU0laRV9Qb3MpIC8qITwgNEtCIFNpemUgb2YgdGhlIE1QVSBwcm90ZWN0aW9uIHJlZ2lvbiAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfOEtCIFwKKyAgKDB4MENVIDw8IE1QVV9SQVNSX1NJWkVfUG9zKSAvKiE8IDhLQiBTaXplIG9mIHRoZSBNUFUgcHJvdGVjdGlvbiByZWdpb24gKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9TSVpFXzE2S0IgXAorICAoMHgwRFUgPDwgTVBVX1JBU1JfU0laRV9Qb3MpIC8qITwgMTZLQiBTaXplIG9mIHRoZSBNUFUgcHJvdGVjdGlvbiByZWdpb24gKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9TSVpFXzMyS0IgXAorICAoMHgwRVUgPDwgTVBVX1JBU1JfU0laRV9Qb3MpIC8qITwgMzJLQiBTaXplIG9mIHRoZSBNUFUgcHJvdGVjdGlvbiByZWdpb24gKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9TSVpFXzY0S0IgXAorICAoMHgwRlUgPDwgTVBVX1JBU1JfU0laRV9Qb3MpIC8qITwgNjRLQiBTaXplIG9mIHRoZSBNUFUgcHJvdGVjdGlvbiByZWdpb24gKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9TSVpFXzEyOEtCIFwKKyAgKDB4MTBVIDw8IE1QVV9SQVNSX1NJWkVfUG9zKSAvKiE8IDEyOEtCIFNpemUgb2YgdGhlIE1QVSBwcm90ZWN0aW9uIHJlZ2lvbiAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfMjU2S0IgXAorICAoMHgxMVUgPDwgTVBVX1JBU1JfU0laRV9Qb3MpIC8qITwgMjU2S0IgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fU0laRV81MTJLQiBcCisgICgweDEyVSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgLyohPCA1MTJLQiBTaXplIG9mIHRoZSBNUFUgcHJvdGVjdGlvbiByZWdpb24gKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9TSVpFXzFNQiBcCisgICgweDEzVSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgLyohPCAxTUIgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fU0laRV8yTUIgXAorICAoMHgxNFUgPDwgTVBVX1JBU1JfU0laRV9Qb3MpIC8qITwgMk1CIFNpemUgb2YgdGhlIE1QVSBwcm90ZWN0aW9uIHJlZ2lvbiAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfNE1CIFwKKyAgKDB4MTVVIDw8IE1QVV9SQVNSX1NJWkVfUG9zKSAvKiE8IDRNQiBTaXplIG9mIHRoZSBNUFUgcHJvdGVjdGlvbiByZWdpb24gKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9TSVpFXzhNQiBcCisgICgweDE2VSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgLyohPCA4TUIgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fU0laRV8xNk1CIFwKKyAgKDB4MTdVIDw8IE1QVV9SQVNSX1NJWkVfUG9zKSAvKiE8IDE2TUIgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fU0laRV8zMk1CIFwKKyAgKDB4MThVIDw8IE1QVV9SQVNSX1NJWkVfUG9zKSAvKiE8IDMyTUIgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fU0laRV82NE1CIFwKKyAgKDB4MTlVIDw8IE1QVV9SQVNSX1NJWkVfUG9zKSAvKiE8IDY0TUIgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fU0laRV8xMjhNQiBcCisgICgweDFBVSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgLyohPCAxMjhNQiBTaXplIG9mIHRoZSBNUFUgcHJvdGVjdGlvbiByZWdpb24gKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9TSVpFXzI1Nk1CIFwKKyAgKDB4MUJVIDw8IE1QVV9SQVNSX1NJWkVfUG9zKSAvKiE8IDI1Nk1CIFNpemUgb2YgdGhlIE1QVSBwcm90ZWN0aW9uIHJlZ2lvbiAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfNTEyTUIgXAorICAoMHgxQ1UgPDwgTVBVX1JBU1JfU0laRV9Qb3MpIC8qITwgNTEyTUIgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fU0laRV8xR0IgXAorICAoMHgxRFUgPDwgTVBVX1JBU1JfU0laRV9Qb3MpIC8qITwgMUdCIFNpemUgb2YgdGhlIE1QVSBwcm90ZWN0aW9uIHJlZ2lvbiAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfMkdCIFwKKyAgKDB4MUVVIDw8IE1QVV9SQVNSX1NJWkVfUG9zKSAvKiE8IDJHQiBTaXplIG9mIHRoZSBNUFUgcHJvdGVjdGlvbiByZWdpb24gKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9TSVpFXzRHQiBcCisgICgweDFGVSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgLyohPCA0R0IgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBDT1JURVhfTExfRUNfUkVHSU9OX1BSSVZJTEVER0VTIE1QVSBSZWdpb24gUHJpdmlsZWdlcworICogQHsKKyAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX05PX0FDQ0VTUyAoMHgwMFUgPDwgTVBVX1JBU1JfQVBfUG9zKSAvKiE8IE5vIGFjY2VzcyovCisjZGVmaW5lIExMX01QVV9SRUdJT05fUFJJVl9SVyBcCisgICgweDAxVSA8PCBNUFVfUkFTUl9BUF9Qb3MpIC8qITwgUlcgcHJpdmlsZWdlZCAocHJpdmlsZWdlZCBhY2Nlc3Mgb25seSkqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX1BSSVZfUldfVVJPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoMHgwMlUgPDwgTVBVX1JBU1JfQVBfUG9zKSAvKiE8IFJXIHByaXZpbGVnZWQgLSBSTyB1c2VyIChXcml0ZSBpbiBhIHVzZXIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmFtIGdlbmVyYXRlcyBhIGZhdWx0KSAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX0ZVTExfQUNDRVNTIFwKKyAgKDB4MDNVIDw8IE1QVV9SQVNSX0FQX1BvcykgLyohPCBSVyBwcml2aWxlZ2VkICYgdXNlciAoRnVsbCBhY2Nlc3MpICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fUFJJVl9STyBcCisgICgweDA1VSA8PCBNUFVfUkFTUl9BUF9Qb3MpIC8qITwgUk8gcHJpdmlsZWdlZCAocHJpdmlsZWdlZCByZWFkIG9ubHkpKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9QUklWX1JPX1VSTyBcCisgICgweDA2VSA8PCBNUFVfUkFTUl9BUF9Qb3MpIC8qITwgUk8gcHJpdmlsZWdlZCAmIHVzZXIgKHJlYWQgb25seSkgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIENPUlRFWF9MTF9FQ19URVggTVBVIFRFWCBMZXZlbAorICogQHsKKyAqLworI2RlZmluZSBMTF9NUFVfVEVYX0xFVkVMMCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgweDAwVSA8PCBNUFVfUkFTUl9URVhfUG9zKSAvKiE8IGIwMDAgZm9yIFRFWCBiaXRzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9NUFVfVEVYX0xFVkVMMSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgweDAxVSA8PCBNUFVfUkFTUl9URVhfUG9zKSAvKiE8IGIwMDEgZm9yIFRFWCBiaXRzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9NUFVfVEVYX0xFVkVMMiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgweDAyVSA8PCBNUFVfUkFTUl9URVhfUG9zKSAvKiE8IGIwMTAgZm9yIFRFWCBiaXRzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9NUFVfVEVYX0xFVkVMNCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgweDA0VSA8PCBNUFVfUkFTUl9URVhfUG9zKSAvKiE8IGIxMDAgZm9yIFRFWCBiaXRzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX0xMX0VDX0lOU1RSVUNUSU9OX0FDQ0VTUyBNUFUgSW5zdHJ1Y3Rpb24gQWNjZXNzCisgKiBAeworICovCisjZGVmaW5lIExMX01QVV9JTlNUUlVDVElPTl9BQ0NFU1NfRU5BQkxFIFwKKyAgMHgwMFUgLyohPCBJbnN0cnVjdGlvbiBmZXRjaGVzIGVuYWJsZWQgKi8KKyNkZWZpbmUgTExfTVBVX0lOU1RSVUNUSU9OX0FDQ0VTU19ESVNBQkxFIFwKKyAgTVBVX1JBU1JfWE5fTXNrIC8qITwgSW5zdHJ1Y3Rpb24gZmV0Y2hlcyBkaXNhYmxlZCovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBDT1JURVhfTExfRUNfU0hBUkVBQkxFX0FDQ0VTUyBNUFUgU2hhcmVhYmxlIEFjY2VzcworICogQHsKKyAqLworI2RlZmluZSBMTF9NUFVfQUNDRVNTX1NIQVJFQUJMRSBcCisgIE1QVV9SQVNSX1NfTXNrIC8qITwgU2hhcmVhYmxlIG1lbW9yeSBhdHRyaWJ1dGUgKi8KKyNkZWZpbmUgTExfTVBVX0FDQ0VTU19OT1RfU0hBUkVBQkxFICAgICAgICAgXAorICAweDAwVSAvKiE8IE5vdCBTaGFyZWFibGUgbWVtb3J5IGF0dHJpYnV0ZSBcCisgICAgICAgICAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX0xMX0VDX0NBQ0hFQUJMRV9BQ0NFU1MgTVBVIENhY2hlYWJsZSBBY2Nlc3MKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfTVBVX0FDQ0VTU19DQUNIRUFCTEUgXAorICBNUFVfUkFTUl9DX01zayAvKiE8IENhY2hlYWJsZSBtZW1vcnkgYXR0cmlidXRlICovCisjZGVmaW5lIExMX01QVV9BQ0NFU1NfTk9UX0NBQ0hFQUJMRSAgICAgICAgIFwKKyAgMHgwMFUgLyohPCBOb3QgQ2FjaGVhYmxlIG1lbW9yeSBhdHRyaWJ1dGUgXAorICAgICAgICAgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIENPUlRFWF9MTF9FQ19CVUZGRVJBQkxFX0FDQ0VTUyBNUFUgQnVmZmVyYWJsZSBBY2Nlc3MKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfTVBVX0FDQ0VTU19CVUZGRVJBQkxFIFwKKyAgTVBVX1JBU1JfQl9Nc2sgLyohPCBCdWZmZXJhYmxlIG1lbW9yeSBhdHRyaWJ1dGUgKi8KKyNkZWZpbmUgTExfTVBVX0FDQ0VTU19OT1RfQlVGRkVSQUJMRSBcCisgIDB4MDBVIC8qITwgTm90IEJ1ZmZlcmFibGUgbWVtb3J5IGF0dHJpYnV0ZSAqLworLyoqCisgKiBAfQorICovCisjZW5kaWYgLyogX19NUFVfUFJFU0VOVCAqLworLyoqCisgKiBAfQorICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIENPUlRFWF9MTF9FeHBvcnRlZF9GdW5jdGlvbnMgQ09SVEVYIEV4cG9ydGVkIEZ1bmN0aW9ucworICogQHsKKyAqLworCisvKiogQGRlZmdyb3VwIENPUlRFWF9MTF9FRl9TWVNUSUNLIFNZU1RJQ0sKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIHRoZSBTeXN0aWNrIGNvdW50ZXIgZmxhZyBpcyBhY3RpdmUgb3Igbm90LgorICogQG5vdGUgICBJdCBjYW4gYmUgdXNlZCBpbiB0aW1lb3V0IGZ1bmN0aW9uIG9uIGFwcGxpY2F0aW9uIHNpZGUuCisgKiBAcm10b2xsIFNUS19DVFJMICAgICBDT1VOVEZMQUcgICAgIExMX1NZU1RJQ0tfSXNBY3RpdmVDb3VudGVyRmxhZworICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TWVNUSUNLX0lzQWN0aXZlQ291bnRlckZsYWcodm9pZCkgeworICByZXR1cm4gKCgoU3lzVGljay0+Q1RSTCAmIFN5c1RpY2tfQ1RSTF9DT1VOVEZMQUdfTXNrKSA9PQorICAgICAgICAgICAoU3lzVGlja19DVFJMX0NPVU5URkxBR19Nc2spKQorICAgICAgICAgICAgICA/IDFVTAorICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBTeXNUaWNrIGNsb2NrIHNvdXJjZQorICogQHJtdG9sbCBTVEtfQ1RSTCAgICAgQ0xLU09VUkNFICAgICBMTF9TWVNUSUNLX1NldENsa1NvdXJjZQorICogQHBhcmFtICBTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU1RJQ0tfQ0xLU09VUkNFX0hDTEtfRElWOAorICogICAgICAgICBAYXJnIEByZWYgTExfU1lTVElDS19DTEtTT1VSQ0VfSENMSworICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU1RJQ0tfU2V0Q2xrU291cmNlKHVpbnQzMl90IFNvdXJjZSkgeworICBpZiAoU291cmNlID09IExMX1NZU1RJQ0tfQ0xLU09VUkNFX0hDTEspIHsKKyAgICBTRVRfQklUKFN5c1RpY2stPkNUUkwsIExMX1NZU1RJQ0tfQ0xLU09VUkNFX0hDTEspOworICB9IGVsc2UgeworICAgIENMRUFSX0JJVChTeXNUaWNrLT5DVFJMLCBMTF9TWVNUSUNLX0NMS1NPVVJDRV9IQ0xLKTsKKyAgfQorfQorCisvKioKKyAqIEBicmllZiAgR2V0IHRoZSBTeXNUaWNrIGNsb2NrIHNvdXJjZQorICogQHJtdG9sbCBTVEtfQ1RSTCAgICAgQ0xLU09VUkNFICAgICBMTF9TWVNUSUNLX0dldENsa1NvdXJjZQorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfU1lTVElDS19DTEtTT1VSQ0VfSENMS19ESVY4CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNUSUNLX0NMS1NPVVJDRV9IQ0xLCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TWVNUSUNLX0dldENsa1NvdXJjZSh2b2lkKSB7CisgIHJldHVybiBSRUFEX0JJVChTeXNUaWNrLT5DVFJMLCBMTF9TWVNUSUNLX0NMS1NPVVJDRV9IQ0xLKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBTeXNUaWNrIGV4Y2VwdGlvbiByZXF1ZXN0CisgKiBAcm10b2xsIFNUS19DVFJMICAgICBUSUNLSU5UICAgICAgIExMX1NZU1RJQ0tfRW5hYmxlSVQKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TWVNUSUNLX0VuYWJsZUlUKHZvaWQpIHsKKyAgU0VUX0JJVChTeXNUaWNrLT5DVFJMLCBTeXNUaWNrX0NUUkxfVElDS0lOVF9Nc2spOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBTeXNUaWNrIGV4Y2VwdGlvbiByZXF1ZXN0CisgKiBAcm10b2xsIFNUS19DVFJMICAgICBUSUNLSU5UICAgICAgIExMX1NZU1RJQ0tfRGlzYWJsZUlUCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTVElDS19EaXNhYmxlSVQodm9pZCkgeworICBDTEVBUl9CSVQoU3lzVGljay0+Q1RSTCwgU3lzVGlja19DVFJMX1RJQ0tJTlRfTXNrKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrcyBpZiB0aGUgU1lTVElDSyBpbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAqIEBybXRvbGwgU1RLX0NUUkwgICAgIFRJQ0tJTlQgICAgICAgTExfU1lTVElDS19Jc0VuYWJsZWRJVAorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TWVNUSUNLX0lzRW5hYmxlZElUKHZvaWQpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoU3lzVGljay0+Q1RSTCwgU3lzVGlja19DVFJMX1RJQ0tJTlRfTXNrKSA9PQorICAgICAgICAgICAoU3lzVGlja19DVFJMX1RJQ0tJTlRfTXNrKSkKKyAgICAgICAgICAgICAgPyAxVUwKKyAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBDT1JURVhfTExfRUZfTE9XX1BPV0VSX01PREUgTE9XIFBPV0VSIE1PREUKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgIFByb2Nlc3NvciB1c2VzIHNsZWVwIGFzIGl0cyBsb3cgcG93ZXIgbW9kZQorICogQHJtdG9sbCBTQ0JfU0NSICAgICAgU0xFRVBERUVQICAgICBMTF9MUE1fRW5hYmxlU2xlZXAKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUE1fRW5hYmxlU2xlZXAodm9pZCkgeworICAvKiBDbGVhciBTTEVFUERFRVAgYml0IG9mIENvcnRleCBTeXN0ZW0gQ29udHJvbCBSZWdpc3RlciAqLworICBDTEVBUl9CSVQoU0NCLT5TQ1IsICgodWludDMyX3QpU0NCX1NDUl9TTEVFUERFRVBfTXNrKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBQcm9jZXNzb3IgdXNlcyBkZWVwIHNsZWVwIGFzIGl0cyBsb3cgcG93ZXIgbW9kZQorICogQHJtdG9sbCBTQ0JfU0NSICAgICAgU0xFRVBERUVQICAgICBMTF9MUE1fRW5hYmxlRGVlcFNsZWVwCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBNX0VuYWJsZURlZXBTbGVlcCh2b2lkKSB7CisgIC8qIFNldCBTTEVFUERFRVAgYml0IG9mIENvcnRleCBTeXN0ZW0gQ29udHJvbCBSZWdpc3RlciAqLworICBTRVRfQklUKFNDQi0+U0NSLCAoKHVpbnQzMl90KVNDQl9TQ1JfU0xFRVBERUVQX01zaykpOworfQorCisvKioKKyAqIEBicmllZiAgQ29uZmlndXJlcyBzbGVlcC1vbi1leGl0IHdoZW4gcmV0dXJuaW5nIGZyb20gSGFuZGxlciBtb2RlIHRvIFRocmVhZAorICogbW9kZS4KKyAqIEBub3RlICAgU2V0dGluZyB0aGlzIGJpdCB0byAxIGVuYWJsZXMgYW4gaW50ZXJydXB0LWRyaXZlbiBhcHBsaWNhdGlvbiB0bworICogYXZvaWQgcmV0dXJuaW5nIHRvIGFuIGVtcHR5IG1haW4gYXBwbGljYXRpb24uCisgKiBAcm10b2xsIFNDQl9TQ1IgICAgICBTTEVFUE9ORVhJVCAgIExMX0xQTV9FbmFibGVTbGVlcE9uRXhpdAorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQTV9FbmFibGVTbGVlcE9uRXhpdCh2b2lkKSB7CisgIC8qIFNldCBTTEVFUE9ORVhJVCBiaXQgb2YgQ29ydGV4IFN5c3RlbSBDb250cm9sIFJlZ2lzdGVyICovCisgIFNFVF9CSVQoU0NCLT5TQ1IsICgodWludDMyX3QpU0NCX1NDUl9TTEVFUE9ORVhJVF9Nc2spKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERvIG5vdCBzbGVlcCB3aGVuIHJldHVybmluZyB0byBUaHJlYWQgbW9kZS4KKyAqIEBybXRvbGwgU0NCX1NDUiAgICAgIFNMRUVQT05FWElUICAgTExfTFBNX0Rpc2FibGVTbGVlcE9uRXhpdAorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQTV9EaXNhYmxlU2xlZXBPbkV4aXQodm9pZCkgeworICAvKiBDbGVhciBTTEVFUE9ORVhJVCBiaXQgb2YgQ29ydGV4IFN5c3RlbSBDb250cm9sIFJlZ2lzdGVyICovCisgIENMRUFSX0JJVChTQ0ItPlNDUiwgKCh1aW50MzJfdClTQ0JfU0NSX1NMRUVQT05FWElUX01zaykpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlZCBldmVudHMgYW5kIGFsbCBpbnRlcnJ1cHRzLCBpbmNsdWRpbmcgZGlzYWJsZWQgaW50ZXJydXB0cywgY2FuCisgKiB3YWtldXAgdGhlIHByb2Nlc3Nvci4KKyAqIEBybXRvbGwgU0NCX1NDUiAgICAgIFNFVkVPTlBFTkQgICAgTExfTFBNX0VuYWJsZUV2ZW50T25QZW5kCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBNX0VuYWJsZUV2ZW50T25QZW5kKHZvaWQpIHsKKyAgLyogU2V0IFNFVkVPTlBFTkQgYml0IG9mIENvcnRleCBTeXN0ZW0gQ29udHJvbCBSZWdpc3RlciAqLworICBTRVRfQklUKFNDQi0+U0NSLCAoKHVpbnQzMl90KVNDQl9TQ1JfU0VWT05QRU5EX01zaykpOworfQorCisvKioKKyAqIEBicmllZiAgT25seSBlbmFibGVkIGludGVycnVwdHMgb3IgZXZlbnRzIGNhbiB3YWtldXAgdGhlIHByb2Nlc3NvciwgZGlzYWJsZWQKKyAqIGludGVycnVwdHMgYXJlIGV4Y2x1ZGVkCisgKiBAcm10b2xsIFNDQl9TQ1IgICAgICBTRVZFT05QRU5EICAgIExMX0xQTV9EaXNhYmxlRXZlbnRPblBlbmQKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUE1fRGlzYWJsZUV2ZW50T25QZW5kKHZvaWQpIHsKKyAgLyogQ2xlYXIgU0VWRU9OUEVORCBiaXQgb2YgQ29ydGV4IFN5c3RlbSBDb250cm9sIFJlZ2lzdGVyICovCisgIENMRUFSX0JJVChTQ0ItPlNDUiwgKCh1aW50MzJfdClTQ0JfU0NSX1NFVk9OUEVORF9Nc2spKTsKK30KKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX0xMX0VGX0hBTkRMRVIgSEFORExFUgorICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiAgRW5hYmxlIGEgZmF1bHQgaW4gU3lzdGVtIGhhbmRsZXIgY29udHJvbCByZWdpc3RlciAoU0hDU1IpCisgKiBAcm10b2xsIFNDQl9TSENTUiAgICBNRU1GQVVMVEVOQSAgIExMX0hBTkRMRVJfRW5hYmxlRmF1bHQKKyAqIEBwYXJhbSAgRmF1bHQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IQU5ETEVSX0ZBVUxUX1VTRworICogICAgICAgICBAYXJnIEByZWYgTExfSEFORExFUl9GQVVMVF9CVVMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0hBTkRMRVJfRkFVTFRfTUVNCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSEFORExFUl9FbmFibGVGYXVsdCh1aW50MzJfdCBGYXVsdCkgeworICAvKiBFbmFibGUgdGhlIHN5c3RlbSBoYW5kbGVyIGZhdWx0ICovCisgIFNFVF9CSVQoU0NCLT5TSENTUiwgRmF1bHQpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBhIGZhdWx0IGluIFN5c3RlbSBoYW5kbGVyIGNvbnRyb2wgcmVnaXN0ZXIgKFNIQ1NSKQorICogQHJtdG9sbCBTQ0JfU0hDU1IgICAgTUVNRkFVTFRFTkEgICBMTF9IQU5ETEVSX0Rpc2FibGVGYXVsdAorICogQHBhcmFtICBGYXVsdCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0hBTkRMRVJfRkFVTFRfVVNHCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IQU5ETEVSX0ZBVUxUX0JVUworICogICAgICAgICBAYXJnIEByZWYgTExfSEFORExFUl9GQVVMVF9NRU0KKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IQU5ETEVSX0Rpc2FibGVGYXVsdCh1aW50MzJfdCBGYXVsdCkgeworICAvKiBEaXNhYmxlIHRoZSBzeXN0ZW0gaGFuZGxlciBmYXVsdCAqLworICBDTEVBUl9CSVQoU0NCLT5TSENTUiwgRmF1bHQpOworfQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBDT1JURVhfTExfRUZfTUNVX0lORk8gTUNVIElORk8KKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgIEdldCBJbXBsZW1lbnRlciBjb2RlCisgKiBAcm10b2xsIFNDQl9DUFVJRCAgICBJTVBMRU1FTlRFUiAgIExMX0NQVUlEX0dldEltcGxlbWVudGVyCisgKiBAcmV0dmFsIFZhbHVlIHNob3VsZCBiZSBlcXVhbCB0byAweDQxIGZvciBBUk0KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NQVUlEX0dldEltcGxlbWVudGVyKHZvaWQpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoU0NCLT5DUFVJRCwgU0NCX0NQVUlEX0lNUExFTUVOVEVSX01zaykgPj4KKyAgICAgICAgICAgICAgICAgICAgU0NCX0NQVUlEX0lNUExFTUVOVEVSX1Bvcyk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgVmFyaWFudCBudW1iZXIgKFRoZSByIHZhbHVlIGluIHRoZSBybnBuIHByb2R1Y3QgcmV2aXNpb24KKyAqIGlkZW50aWZpZXIpCisgKiBAcm10b2xsIFNDQl9DUFVJRCAgICBWQVJJQU5UICAgICAgIExMX0NQVUlEX0dldFZhcmlhbnQKKyAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiAwIGFuZCAyNTUgKDB4MDogcmV2aXNpb24gMCkKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NQVUlEX0dldFZhcmlhbnQodm9pZCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTQ0ItPkNQVUlELCBTQ0JfQ1BVSURfVkFSSUFOVF9Nc2spID4+CisgICAgICAgICAgICAgICAgICAgIFNDQl9DUFVJRF9WQVJJQU5UX1Bvcyk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgQXJjaGl0ZWN0dXJlIG51bWJlcgorICogQHJtdG9sbCBTQ0JfQ1BVSUQgICAgQVJDSElURUNUVVJFICBMTF9DUFVJRF9HZXRBcmNoaXRlY3R1cmUKKyAqIEByZXR2YWwgVmFsdWUgc2hvdWxkIGJlIGVxdWFsIHRvIDB4RiBmb3IgQ29ydGV4LU00IGRldmljZXMKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NQVUlEX0dldEFyY2hpdGVjdHVyZSh2b2lkKSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFNDQi0+Q1BVSUQsIFNDQl9DUFVJRF9BUkNISVRFQ1RVUkVfTXNrKSA+PgorICAgICAgICAgICAgICAgICAgICBTQ0JfQ1BVSURfQVJDSElURUNUVVJFX1Bvcyk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgUGFydCBudW1iZXIKKyAqIEBybXRvbGwgU0NCX0NQVUlEICAgIFBBUlROTyAgICAgICAgTExfQ1BVSURfR2V0UGFyTm8KKyAqIEByZXR2YWwgVmFsdWUgc2hvdWxkIGJlIGVxdWFsIHRvIDB4QzI0IGZvciBDb3J0ZXgtTTQKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NQVUlEX0dldFBhck5vKHZvaWQpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoU0NCLT5DUFVJRCwgU0NCX0NQVUlEX1BBUlROT19Nc2spID4+CisgICAgICAgICAgICAgICAgICAgIFNDQl9DUFVJRF9QQVJUTk9fUG9zKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBSZXZpc2lvbiBudW1iZXIgKFRoZSBwIHZhbHVlIGluIHRoZSBybnBuIHByb2R1Y3QgcmV2aXNpb24KKyAqIGlkZW50aWZpZXIsIGluZGljYXRlcyBwYXRjaCByZWxlYXNlKQorICogQHJtdG9sbCBTQ0JfQ1BVSUQgICAgUkVWSVNJT04gICAgICBMTF9DUFVJRF9HZXRSZXZpc2lvbgorICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIDAgYW5kIDI1NSAoMHgxOiBwYXRjaCAxKQorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQ1BVSURfR2V0UmV2aXNpb24odm9pZCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTQ0ItPkNQVUlELCBTQ0JfQ1BVSURfUkVWSVNJT05fTXNrKSA+PgorICAgICAgICAgICAgICAgICAgICBTQ0JfQ1BVSURfUkVWSVNJT05fUG9zKTsKK30KKworLyoqCisgKiBAfQorICovCisKKyNpZiBfX01QVV9QUkVTRU5UCisvKiogQGRlZmdyb3VwIENPUlRFWF9MTF9FRl9NUFUgTVBVCisgKiBAeworICovCisKKy8qKgorICogQGJyaWVmICBFbmFibGUgTVBVIHdpdGggaW5wdXQgb3B0aW9ucworICogQHJtdG9sbCBNUFVfQ1RSTCAgICAgRU5BQkxFICAgICAgICBMTF9NUFVfRW5hYmxlCisgKiBAcGFyYW0gIE9wdGlvbnMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX01QVV9DVFJMX0hGTk1JX1BSSVZERUZfTk9ORQorICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX0NUUkxfSEFSREZBVUxUX05NSQorICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX0NUUkxfUFJJVklMRUdFRF9ERUZBVUxUCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfQ1RSTF9IRk5NSV9QUklWREVGCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTVBVX0VuYWJsZSh1aW50MzJfdCBPcHRpb25zKSB7CisgIC8qIEVuYWJsZSB0aGUgTVBVKi8KKyAgV1JJVEVfUkVHKE1QVS0+Q1RSTCwgKE1QVV9DVFJMX0VOQUJMRV9Nc2sgfCBPcHRpb25zKSk7CisgIC8qIEVuc3VyZSBNUFUgc2V0dGluZ3MgdGFrZSBlZmZlY3RzICovCisgIF9fRFNCKCk7CisgIC8qIFNlcXVlbmNlIGluc3RydWN0aW9uIGZldGNoZXMgdXNpbmcgdXBkYXRlIHNldHRpbmdzICovCisgIF9fSVNCKCk7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIE1QVQorICogQHJtdG9sbCBNUFVfQ1RSTCAgICAgRU5BQkxFICAgICAgICBMTF9NUFVfRGlzYWJsZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX01QVV9EaXNhYmxlKHZvaWQpIHsKKyAgLyogTWFrZSBzdXJlIG91dHN0YW5kaW5nIHRyYW5zZmVycyBhcmUgZG9uZSAqLworICBfX0RNQigpOworICAvKiBEaXNhYmxlIE1QVSovCisgIFdSSVRFX1JFRyhNUFUtPkNUUkwsIDBVKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIE1QVSBpcyBlbmFibGVkIG9yIG5vdAorICogQHJtdG9sbCBNUFVfQ1RSTCAgICAgRU5BQkxFICAgICAgICBMTF9NUFVfSXNFbmFibGVkCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX01QVV9Jc0VuYWJsZWQodm9pZCkgeworICByZXR1cm4gKChSRUFEX0JJVChNUFUtPkNUUkwsIE1QVV9DVFJMX0VOQUJMRV9Nc2spID09IChNUFVfQ1RSTF9FTkFCTEVfTXNrKSkKKyAgICAgICAgICAgICAgPyAxVUwKKyAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIGEgTVBVIHJlZ2lvbgorICogQHJtdG9sbCBNUFVfUkFTUiAgICAgRU5BQkxFICAgICAgICBMTF9NUFVfRW5hYmxlUmVnaW9uCisgKiBAcGFyYW0gIFJlZ2lvbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVIwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfUkVHSU9OX05VTUJFUjEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX01QVV9SRUdJT05fTlVNQkVSMgorICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVIzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfUkVHSU9OX05VTUJFUjQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX01QVV9SRUdJT05fTlVNQkVSNQorICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVI2CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfUkVHSU9OX05VTUJFUjcKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9NUFVfRW5hYmxlUmVnaW9uKHVpbnQzMl90IFJlZ2lvbikgeworICAvKiBTZXQgUmVnaW9uIG51bWJlciAqLworICBXUklURV9SRUcoTVBVLT5STlIsIFJlZ2lvbik7CisgIC8qIEVuYWJsZSB0aGUgTVBVIHJlZ2lvbiAqLworICBTRVRfQklUKE1QVS0+UkFTUiwgTVBVX1JBU1JfRU5BQkxFX01zayk7Cit9CisKKy8qKgorICogQGJyaWVmICBDb25maWd1cmUgYW5kIGVuYWJsZSBhIHJlZ2lvbgorICogQHJtdG9sbCBNUFVfUk5SICAgICAgUkVHSU9OICAgICAgICBMTF9NUFVfQ29uZmlnUmVnaW9uXG4KKyAqICAgICAgICAgTVBVX1JCQVIgICAgIFJFR0lPTiAgICAgICAgTExfTVBVX0NvbmZpZ1JlZ2lvblxuCisgKiAgICAgICAgIE1QVV9SQkFSICAgICBBRERSICAgICAgICAgIExMX01QVV9Db25maWdSZWdpb25cbgorICogICAgICAgICBNUFVfUkFTUiAgICAgWE4gICAgICAgICAgICBMTF9NUFVfQ29uZmlnUmVnaW9uXG4KKyAqICAgICAgICAgTVBVX1JBU1IgICAgIEFQICAgICAgICAgICAgTExfTVBVX0NvbmZpZ1JlZ2lvblxuCisgKiAgICAgICAgIE1QVV9SQVNSICAgICBTICAgICAgICAgICAgIExMX01QVV9Db25maWdSZWdpb25cbgorICogICAgICAgICBNUFVfUkFTUiAgICAgQyAgICAgICAgICAgICBMTF9NUFVfQ29uZmlnUmVnaW9uXG4KKyAqICAgICAgICAgTVBVX1JBU1IgICAgIEIgICAgICAgICAgICAgTExfTVBVX0NvbmZpZ1JlZ2lvblxuCisgKiAgICAgICAgIE1QVV9SQVNSICAgICBTSVpFICAgICAgICAgIExMX01QVV9Db25maWdSZWdpb24KKyAqIEBwYXJhbSAgUmVnaW9uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfUkVHSU9OX05VTUJFUjAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX01QVV9SRUdJT05fTlVNQkVSMQorICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVIyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfUkVHSU9OX05VTUJFUjMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX01QVV9SRUdJT05fTlVNQkVSNAorICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVI1CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfUkVHSU9OX05VTUJFUjYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX01QVV9SRUdJT05fTlVNQkVSNworICogQHBhcmFtICBBZGRyZXNzIFZhbHVlIG9mIHJlZ2lvbiBiYXNlIGFkZHJlc3MKKyAqIEBwYXJhbSAgU3ViUmVnaW9uRGlzYWJsZSBTdWItcmVnaW9uIGRpc2FibGUgdmFsdWUgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MDAgYW5kCisgKiBNYXhfRGF0YSA9IDB4RkYKKyAqIEBwYXJhbSAgQXR0cmlidXRlcyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nCisgKiB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfUkVHSU9OX1NJWkVfMzJCIG9yIEByZWYgTExfTVBVX1JFR0lPTl9TSVpFXzY0QiBvcgorICogQHJlZiBMTF9NUFVfUkVHSU9OX1NJWkVfMTI4QiBvciBAcmVmIExMX01QVV9SRUdJT05fU0laRV8yNTZCIG9yIEByZWYKKyAqIExMX01QVV9SRUdJT05fU0laRV81MTJCIG9yIEByZWYgTExfTVBVX1JFR0lPTl9TSVpFXzFLQiBvciBAcmVmCisgKiBMTF9NUFVfUkVHSU9OX1NJWkVfMktCIG9yIEByZWYgTExfTVBVX1JFR0lPTl9TSVpFXzRLQiBvciBAcmVmCisgKiBMTF9NUFVfUkVHSU9OX1NJWkVfOEtCIG9yIEByZWYgTExfTVBVX1JFR0lPTl9TSVpFXzE2S0Igb3IgQHJlZgorICogTExfTVBVX1JFR0lPTl9TSVpFXzMyS0Igb3IgQHJlZiBMTF9NUFVfUkVHSU9OX1NJWkVfNjRLQiBvciBAcmVmCisgKiBMTF9NUFVfUkVHSU9OX1NJWkVfMTI4S0Igb3IgQHJlZiBMTF9NUFVfUkVHSU9OX1NJWkVfMjU2S0Igb3IgQHJlZgorICogTExfTVBVX1JFR0lPTl9TSVpFXzUxMktCIG9yIEByZWYgTExfTVBVX1JFR0lPTl9TSVpFXzFNQiBvciBAcmVmCisgKiBMTF9NUFVfUkVHSU9OX1NJWkVfMk1CIG9yIEByZWYgTExfTVBVX1JFR0lPTl9TSVpFXzRNQiBvciBAcmVmCisgKiBMTF9NUFVfUkVHSU9OX1NJWkVfOE1CIG9yIEByZWYgTExfTVBVX1JFR0lPTl9TSVpFXzE2TUIgb3IgQHJlZgorICogTExfTVBVX1JFR0lPTl9TSVpFXzMyTUIgb3IgQHJlZiBMTF9NUFVfUkVHSU9OX1NJWkVfNjRNQiBvciBAcmVmCisgKiBMTF9NUFVfUkVHSU9OX1NJWkVfMTI4TUIgb3IgQHJlZiBMTF9NUFVfUkVHSU9OX1NJWkVfMjU2TUIgb3IgQHJlZgorICogTExfTVBVX1JFR0lPTl9TSVpFXzUxMk1CIG9yIEByZWYgTExfTVBVX1JFR0lPTl9TSVpFXzFHQiBvciBAcmVmCisgKiBMTF9NUFVfUkVHSU9OX1NJWkVfMkdCIG9yIEByZWYgTExfTVBVX1JFR0lPTl9TSVpFXzRHQgorICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OT19BQ0NFU1Mgb3IgQHJlZiBMTF9NUFVfUkVHSU9OX1BSSVZfUlcgb3IKKyAqIEByZWYgTExfTVBVX1JFR0lPTl9QUklWX1JXX1VSTyBvciBAcmVmIExMX01QVV9SRUdJT05fRlVMTF9BQ0NFU1Mgb3IgQHJlZgorICogTExfTVBVX1JFR0lPTl9QUklWX1JPIG9yIEByZWYgTExfTVBVX1JFR0lPTl9QUklWX1JPX1VSTworICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1RFWF9MRVZFTDAgb3IgQHJlZiBMTF9NUFVfVEVYX0xFVkVMMSBvciBAcmVmCisgKiBMTF9NUFVfVEVYX0xFVkVMMiBvciBAcmVmIExMX01QVV9URVhfTEVWRUw0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfSU5TVFJVQ1RJT05fQUNDRVNTX0VOQUJMRSBvciAgQHJlZgorICogTExfTVBVX0lOU1RSVUNUSU9OX0FDQ0VTU19ESVNBQkxFCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfQUNDRVNTX1NIQVJFQUJMRSBvciBAcmVmIExMX01QVV9BQ0NFU1NfTk9UX1NIQVJFQUJMRQorICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX0FDQ0VTU19DQUNIRUFCTEUgb3IgQHJlZiBMTF9NUFVfQUNDRVNTX05PVF9DQUNIRUFCTEUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX01QVV9BQ0NFU1NfQlVGRkVSQUJMRSBvciBAcmVmCisgKiBMTF9NUFVfQUNDRVNTX05PVF9CVUZGRVJBQkxFCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTVBVX0NvbmZpZ1JlZ2lvbih1aW50MzJfdCBSZWdpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFN1YlJlZ2lvbkRpc2FibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEF0dHJpYnV0ZXMpIHsKKyAgLyogU2V0IFJlZ2lvbiBudW1iZXIgKi8KKyAgV1JJVEVfUkVHKE1QVS0+Uk5SLCBSZWdpb24pOworICAvKiBTZXQgYmFzZSBhZGRyZXNzICovCisgIFdSSVRFX1JFRyhNUFUtPlJCQVIsIChBZGRyZXNzICYgMHhGRkZGRkZFMFUpKTsKKyAgLyogQ29uZmlndXJlIE1QVSAqLworICBXUklURV9SRUcoTVBVLT5SQVNSLCAoTVBVX1JBU1JfRU5BQkxFX01zayB8IEF0dHJpYnV0ZXMgfAorICAgICAgICAgICAgICAgICAgICAgICAgKFN1YlJlZ2lvbkRpc2FibGUgPDwgTVBVX1JBU1JfU1JEX1BvcykpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgYSByZWdpb24KKyAqIEBybXRvbGwgTVBVX1JOUiAgICAgIFJFR0lPTiAgICAgICAgTExfTVBVX0Rpc2FibGVSZWdpb25cbgorICogICAgICAgICBNUFVfUkFTUiAgICAgRU5BQkxFICAgICAgICBMTF9NUFVfRGlzYWJsZVJlZ2lvbgorICogQHBhcmFtICBSZWdpb24gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX01QVV9SRUdJT05fTlVNQkVSMAorICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVIxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfUkVHSU9OX05VTUJFUjIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX01QVV9SRUdJT05fTlVNQkVSMworICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVI0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfUkVHSU9OX05VTUJFUjUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX01QVV9SRUdJT05fTlVNQkVSNgorICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVI3CisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTVBVX0Rpc2FibGVSZWdpb24odWludDMyX3QgUmVnaW9uKSB7CisgIC8qIFNldCBSZWdpb24gbnVtYmVyICovCisgIFdSSVRFX1JFRyhNUFUtPlJOUiwgUmVnaW9uKTsKKyAgLyogRGlzYWJsZSB0aGUgTVBVIHJlZ2lvbiAqLworICBDTEVBUl9CSVQoTVBVLT5SQVNSLCBNUFVfUkFTUl9FTkFCTEVfTXNrKTsKK30KKworLyoqCisgKiBAfQorICovCisKKyNlbmRpZiAvKiBfX01QVV9QUkVTRU5UICovCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19TVE0zMkc0eHhfTExfQ09SVEVYX0ggKi8KZGlmZiAtLWdpdCBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9JbmMvc3RtMzJnNHh4X2xsX2Nycy5oIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfbGxfY3JzLmgKaW5kZXggNDFjNWYxNy4uODI1OTc0NyAxMDA2NDQKLS0tIGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfbGxfY3JzLmgKKysrIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfbGxfY3JzLmgKQEAgLTEsNzgzICsxLDc4MyBAQAotLyoqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEBmaWxlICAgIHN0bTMyZzR4eF9sbF9jcnMuaA0KLSAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtDQotICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgQ1JTIExMIG1vZHVsZS4NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQGF0dGVudGlvbg0KLSAqDQotICogQ29weXJpZ2h0IChjKSAyMDE4IFNUTWljcm9lbGVjdHJvbmljcy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KLSAqDQotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0ZXJtcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlDQotICogaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc29mdHdhcmUgY29tcG9uZW50Lg0KLSAqIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcyB3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLg0KLSAqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqLw0KLQ0KLS8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotI2lmbmRlZiBfX1NUTTMyRzR4eF9MTF9DUlNfSA0KLSNkZWZpbmUgX19TVE0zMkc0eHhfTExfQ1JTX0gNCi0NCi0jaWZkZWYgX19jcGx1c3BsdXMNCi1leHRlcm4gIkMiIHsNCi0jZW5kaWYNCi0NCi0vKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpbmNsdWRlICJzdG0zMmc0eHguaCINCi0NCi0vKiogQGFkZHRvZ3JvdXAgU1RNMzJHNHh4X0xMX0RyaXZlcg0KLSAqIEB7DQotICovDQotDQotI2lmIGRlZmluZWQoQ1JTKQ0KLQ0KLS8qKiBAZGVmZ3JvdXAgQ1JTX0xMIENSUw0KLSAqIEB7DQotICovDQotDQotLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0NCi0vKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBkZWZncm91cCBDUlNfTExfRXhwb3J0ZWRfQ29uc3RhbnRzIENSUyBFeHBvcnRlZCBDb25zdGFudHMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQ1JTX0xMX0VDX0dFVF9GTEFHIEdldCBGbGFncyBEZWZpbmVzDQotICogQGJyaWVmICAgIEZsYWdzIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9DUlNfUmVhZFJlZyBmdW5jdGlvbg0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9DUlNfSVNSX1NZTkNPS0YgQ1JTX0lTUl9TWU5DT0tGDQotI2RlZmluZSBMTF9DUlNfSVNSX1NZTkNXQVJORiBDUlNfSVNSX1NZTkNXQVJORg0KLSNkZWZpbmUgTExfQ1JTX0lTUl9FUlJGIENSU19JU1JfRVJSRg0KLSNkZWZpbmUgTExfQ1JTX0lTUl9FU1lOQ0YgQ1JTX0lTUl9FU1lOQ0YNCi0jZGVmaW5lIExMX0NSU19JU1JfU1lOQ0VSUiBDUlNfSVNSX1NZTkNFUlINCi0jZGVmaW5lIExMX0NSU19JU1JfU1lOQ01JU1MgQ1JTX0lTUl9TWU5DTUlTUw0KLSNkZWZpbmUgTExfQ1JTX0lTUl9UUklNT1ZGIENSU19JU1JfVFJJTU9WRg0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBDUlNfTExfRUNfSVQgSVQgRGVmaW5lcw0KLSAqIEBicmllZiAgICBJVCBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfQ1JTX1JlYWRSZWcgYW5kDQotICogTExfQ1JTX1dyaXRlUmVnIGZ1bmN0aW9ucw0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9DUlNfQ1JfU1lOQ09LSUUgQ1JTX0NSX1NZTkNPS0lFDQotI2RlZmluZSBMTF9DUlNfQ1JfU1lOQ1dBUk5JRSBDUlNfQ1JfU1lOQ1dBUk5JRQ0KLSNkZWZpbmUgTExfQ1JTX0NSX0VSUklFIENSU19DUl9FUlJJRQ0KLSNkZWZpbmUgTExfQ1JTX0NSX0VTWU5DSUUgQ1JTX0NSX0VTWU5DSUUNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQ1JTX0xMX0VDX1NZTkNfRElWIFN5bmNocm9uaXphdGlvbiBTaWduYWwgRGl2aWRlcg0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9DUlNfU1lOQ19ESVZfMSBcDQotICAoKHVpbnQzMl90KTB4MDBVKSAvKiE8IFN5bmNocm8gU2lnbmFsIG5vdCBkaXZpZGVkIChkZWZhdWx0KSAqLw0KLSNkZWZpbmUgTExfQ1JTX1NZTkNfRElWXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIENSU19DRkdSX1NZTkNESVZfMCAvKiE8IFN5bmNocm8gU2lnbmFsIGRpdmlkZWQgYnkgMiBcDQotICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9DUlNfU1lOQ19ESVZfNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgQ1JTX0NGR1JfU1lOQ0RJVl8xIC8qITwgU3luY2hybyBTaWduYWwgZGl2aWRlZCBieSA0IFwNCi0gICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX0NSU19TWU5DX0RJVl84ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChDUlNfQ0ZHUl9TWU5DRElWXzEgfCBDUlNfQ0ZHUl9TWU5DRElWXzApIC8qITwgU3luY2hybyBTaWduYWwgZGl2aWRlZCBieSA4IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfQ1JTX1NZTkNfRElWXzE2IFwNCi0gIENSU19DRkdSX1NZTkNESVZfMiAvKiE8IFN5bmNocm8gU2lnbmFsIGRpdmlkZWQgYnkgMTYgKi8NCi0jZGVmaW5lIExMX0NSU19TWU5DX0RJVl8zMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoQ1JTX0NGR1JfU1lOQ0RJVl8yIHwgQ1JTX0NGR1JfU1lOQ0RJVl8wKSAvKiE8IFN5bmNocm8gU2lnbmFsIGRpdmlkZWQgYnkgMzIgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9DUlNfU1lOQ19ESVZfNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKENSU19DRkdSX1NZTkNESVZfMiB8IENSU19DRkdSX1NZTkNESVZfMSkgLyohPCBTeW5jaHJvIFNpZ25hbCBkaXZpZGVkIGJ5IDY0IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfQ1JTX1NZTkNfRElWXzEyOCBcDQotICBDUlNfQ0ZHUl9TWU5DRElWIC8qITwgU3luY2hybyBTaWduYWwgZGl2aWRlZCBieSAxMjggKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQ1JTX0xMX0VDX1NZTkNfU09VUkNFIFN5bmNocm9uaXphdGlvbiBTaWduYWwgU291cmNlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX0NSU19TWU5DX1NPVVJDRV9HUElPIFwNCi0gICgodWludDMyX3QpMHgwMFUpIC8qITwgU3luY2hybyBTaWduYWwgc291cmNlIEdQSU8gKi8NCi0jZGVmaW5lIExMX0NSU19TWU5DX1NPVVJDRV9MU0UgXA0KLSAgQ1JTX0NGR1JfU1lOQ1NSQ18wIC8qITwgU3luY2hybyBTaWduYWwgc291cmNlIExTRSAqLw0KLSNkZWZpbmUgTExfQ1JTX1NZTkNfU09VUkNFX1VTQiBcDQotICBDUlNfQ0ZHUl9TWU5DU1JDXzEgLyohPCBTeW5jaHJvIFNpZ25hbCBzb3VyY2UgVVNCIFNPRiAoZGVmYXVsdCkqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBDUlNfTExfRUNfU1lOQ19QT0xBUklUWSBTeW5jaHJvbml6YXRpb24gU2lnbmFsIFBvbGFyaXR5DQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX0NSU19TWU5DX1BPTEFSSVRZX1JJU0lORyBcDQotICAoKHVpbnQzMl90KTB4MDBVKSAvKiE8IFN5bmNocm8gQWN0aXZlIG9uIHJpc2luZyBlZGdlIChkZWZhdWx0KSAqLw0KLSNkZWZpbmUgTExfQ1JTX1NZTkNfUE9MQVJJVFlfRkFMTElORyBcDQotICBDUlNfQ0ZHUl9TWU5DUE9MIC8qITwgU3luY2hybyBBY3RpdmUgb24gZmFsbGluZyBlZGdlICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIENSU19MTF9FQ19GUkVRRVJST1JESVIgRnJlcXVlbmN5IEVycm9yIERpcmVjdGlvbg0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9DUlNfRlJFUV9FUlJPUl9ESVJfVVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKHVpbnQzMl90KTB4MDBVKSAvKiE8IFVwY291bnRpbmcgZGlyZWN0aW9uLCB0aGUgYWN0dWFsIGZyZXF1ZW5jeSBpcyBhYm92ZSBcDQotICAgICAgICAgICAgICAgICAgICAgICB0aGUgdGFyZ2V0ICovDQotI2RlZmluZSBMTF9DUlNfRlJFUV9FUlJPUl9ESVJfRE9XTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKCh1aW50MzJfdClDUlNfSVNSX0ZFRElSKSAvKiE8IERvd25jb3VudGluZyBkaXJlY3Rpb24sIHRoZSBhY3R1YWwgZnJlcXVlbmN5IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgYmVsb3cgdGhlIHRhcmdldCAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBDUlNfTExfRUNfREVGQVVMVFZBTFVFUyBEZWZhdWx0IFZhbHVlcw0KLSAqIEB7DQotICovDQotLyoqDQotICogQGJyaWVmIFJlc2V0IHZhbHVlIG9mIHRoZSBSRUxPQUQgZmllbGQNCi0gKiBAbm90ZSBUaGUgcmVzZXQgdmFsdWUgb2YgdGhlIFJFTE9BRCBmaWVsZCBjb3JyZXNwb25kcyB0byBhIHRhcmdldCBmcmVxdWVuY3kNCi0gKiBvZiA0OCBNSHogYW5kIGEgc3luY2hyb25pemF0aW9uIHNpZ25hbCBmcmVxdWVuY3kgb2YgMSBrSHogKFNPRiBzaWduYWwgZnJvbQ0KLSAqIFVTQikNCi0gKi8NCi0jZGVmaW5lIExMX0NSU19SRUxPQURWQUxVRV9ERUZBVUxUICgodWludDMyX3QpMHhCQjdGVSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgUmVzZXQgdmFsdWUgb2YgRnJlcXVlbmN5IGVycm9yIGxpbWl0Lg0KLSAqLw0KLSNkZWZpbmUgTExfQ1JTX0VSUk9STElNSVRfREVGQVVMVCAoKHVpbnQzMl90KTB4MjJVKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBSZXNldCB2YWx1ZSBvZiB0aGUgSFNJNDggQ2FsaWJyYXRpb24gZmllbGQNCi0gKiBAbm90ZSBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA2NCwgd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIG1pZGRsZSBvZiB0aGUNCi0gKiB0cmltbWluZyBpbnRlcnZhbC4gVGhlIHRyaW1taW5nIHN0ZXAgaXMgc3BlY2lmaWVkIGluIHRoZSBwcm9kdWN0IGRhdGFzaGVldC4NCi0gKiAgICAgICBBIGhpZ2hlciBUUklNIHZhbHVlIGNvcnJlc3BvbmRzIHRvIGEgaGlnaGVyIG91dHB1dCBmcmVxdWVuY3kNCi0gKi8NCi0jZGVmaW5lIExMX0NSU19IU0k0OENBTElCUkFUSU9OX0RFRkFVTFQgKCh1aW50MzJfdCkweDQwVSkNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGRlZmdyb3VwIENSU19MTF9FeHBvcnRlZF9NYWNyb3MgQ1JTIEV4cG9ydGVkIE1hY3Jvcw0KLSAqIEB7DQotICovDQotDQotLyoqIEBkZWZncm91cCBDUlNfTExfRU1fV1JJVEVfUkVBRCBDb21tb24gV3JpdGUgYW5kIHJlYWQgcmVnaXN0ZXJzIE1hY3Jvcw0KLSAqIEB7DQotICovDQotDQotLyoqDQotICogQGJyaWVmICBXcml0ZSBhIHZhbHVlIGluIENSUyByZWdpc3Rlcg0KLSAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIENSUyBJbnN0YW5jZQ0KLSAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSB3cml0dGVuDQotICogQHBhcmFtICBfX1ZBTFVFX18gVmFsdWUgdG8gYmUgd3JpdHRlbiBpbiB0aGUgcmVnaXN0ZXINCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIExMX0NSU19Xcml0ZVJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18sIF9fVkFMVUVfXykgXA0KLSAgV1JJVEVfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXywgKF9fVkFMVUVfXykpDQotDQotLyoqDQotICogQGJyaWVmICBSZWFkIGEgdmFsdWUgaW4gQ1JTIHJlZ2lzdGVyDQotICogQHBhcmFtICBfX0lOU1RBTkNFX18gQ1JTIEluc3RhbmNlDQotICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHJlYWQNCi0gKiBAcmV0dmFsIFJlZ2lzdGVyIHZhbHVlDQotICovDQotI2RlZmluZSBMTF9DUlNfUmVhZFJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18pIFJFQURfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXykNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQ1JTX0xMX0VNX0V4cG9ydGVkX01hY3Jvc19DYWxjdWxhdGVfUmVsb2FkDQotICogRXhwb3J0ZWRfTWFjcm9zX0NhbGN1bGF0ZV9SZWxvYWQNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgTWFjcm8gdG8gY2FsY3VsYXRlIHJlbG9hZCB2YWx1ZSB0byBiZSBzZXQgaW4gQ1JTIHJlZ2lzdGVyIGFjY29yZGluZw0KLSAqIHRvIHRhcmdldCBhbmQgc3luYyBmcmVxdWVuY2llcw0KLSAqIEBub3RlICAgVGhlIFJFTE9BRCB2YWx1ZSBzaG91bGQgYmUgc2VsZWN0ZWQgYWNjb3JkaW5nIHRvIHRoZSByYXRpbyBiZXR3ZWVuDQotICogICAgICAgICB0aGUgdGFyZ2V0IGZyZXF1ZW5jeSBhbmQgdGhlIGZyZXF1ZW5jeSBvZiB0aGUgc3luY2hyb25pemF0aW9uIHNvdXJjZQ0KLSAqIGFmdGVyIHByZXNjYWxpbmcuIEl0IGlzIHRoZW4gZGVjcmVhc2VkIGJ5IG9uZSBpbiBvcmRlciB0byByZWFjaCB0aGUgZXhwZWN0ZWQNCi0gKiAgICAgICAgIHN5bmNocm9uaXphdGlvbiBvbiB0aGUgemVybyB2YWx1ZS4gVGhlIGZvcm11bGEgaXMgdGhlIGZvbGxvd2luZzoNCi0gKiAgICAgICAgICAgICAgUkVMT0FEID0gKGZUQVJHRVQgLyBmU1lOQykgLTENCi0gKiBAcGFyYW0gIF9fRlRBUkdFVF9fIFRhcmdldCBmcmVxdWVuY3kgKHZhbHVlIGluIEh6KQ0KLSAqIEBwYXJhbSAgX19GU1lOQ19fIFN5bmNocm9uaXphdGlvbiBzaWduYWwgZnJlcXVlbmN5ICh2YWx1ZSBpbiBIeikNCi0gKiBAcmV0dmFsIFJlbG9hZCB2YWx1ZSAoaW4gSHopDQotICovDQotI2RlZmluZSBfX0xMX0NSU19DQUxDX0NBTENVTEFURV9SRUxPQURWQUxVRShfX0ZUQVJHRVRfXywgX19GU1lOQ19fKSBcDQotICAoKChfX0ZUQVJHRVRfXykgLyAoX19GU1lOQ19fKSkgLSAxVSkNCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGRlZmdyb3VwIENSU19MTF9FeHBvcnRlZF9GdW5jdGlvbnMgQ1JTIEV4cG9ydGVkIEZ1bmN0aW9ucw0KLSAqIEB7DQotICovDQotDQotLyoqIEBkZWZncm91cCBDUlNfTExfRUZfQ29uZmlndXJhdGlvbiBDb25maWd1cmF0aW9uDQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSBGcmVxdWVuY3kgZXJyb3IgY291bnRlcg0KLSAqIEBub3RlIFdoZW4gdGhpcyBiaXQgaXMgc2V0LCB0aGUgQ1JTX0NGR1IgcmVnaXN0ZXIgaXMgd3JpdGUtcHJvdGVjdGVkIGFuZA0KLSAqIGNhbm5vdCBiZSBtb2RpZmllZA0KLSAqIEBybXRvbGwgQ1IgICAgICAgICAgIENFTiAgICAgICAgICAgTExfQ1JTX0VuYWJsZUZyZXFFcnJvckNvdW50ZXINCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DUlNfRW5hYmxlRnJlcUVycm9yQ291bnRlcih2b2lkKSB7DQotICBTRVRfQklUKENSUy0+Q1IsIENSU19DUl9DRU4pOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgRnJlcXVlbmN5IGVycm9yIGNvdW50ZXINCi0gKiBAcm10b2xsIENSICAgICAgICAgICBDRU4gICAgICAgICAgIExMX0NSU19EaXNhYmxlRnJlcUVycm9yQ291bnRlcg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0NSU19EaXNhYmxlRnJlcUVycm9yQ291bnRlcih2b2lkKSB7DQotICBDTEVBUl9CSVQoQ1JTLT5DUiwgQ1JTX0NSX0NFTik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgRnJlcXVlbmN5IGVycm9yIGNvdW50ZXIgaXMgZW5hYmxlZCBvciBub3QNCi0gKiBAcm10b2xsIENSICAgICAgICAgICBDRU4gICAgICAgICAgIExMX0NSU19Jc0VuYWJsZWRGcmVxRXJyb3JDb3VudGVyDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NSU19Jc0VuYWJsZWRGcmVxRXJyb3JDb3VudGVyKHZvaWQpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKENSUy0+Q1IsIENSU19DUl9DRU4pID09IChDUlNfQ1JfQ0VOKSkgPyAxVUwgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSBBdXRvbWF0aWMgdHJpbW1pbmcgY291bnRlcg0KLSAqIEBybXRvbGwgQ1IgICAgICAgICAgIEFVVE9UUklNRU4gICAgTExfQ1JTX0VuYWJsZUF1dG9UcmltbWluZw0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0NSU19FbmFibGVBdXRvVHJpbW1pbmcodm9pZCkgew0KLSAgU0VUX0JJVChDUlMtPkNSLCBDUlNfQ1JfQVVUT1RSSU1FTik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBBdXRvbWF0aWMgdHJpbW1pbmcgY291bnRlcg0KLSAqIEBybXRvbGwgQ1IgICAgICAgICAgIEFVVE9UUklNRU4gICAgTExfQ1JTX0Rpc2FibGVBdXRvVHJpbW1pbmcNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DUlNfRGlzYWJsZUF1dG9UcmltbWluZyh2b2lkKSB7DQotICBDTEVBUl9CSVQoQ1JTLT5DUiwgQ1JTX0NSX0FVVE9UUklNRU4pOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIGlmIEF1dG9tYXRpYyB0cmltbWluZyBpcyBlbmFibGVkIG9yIG5vdA0KLSAqIEBybXRvbGwgQ1IgICAgICAgICAgIEFVVE9UUklNRU4gICAgTExfQ1JTX0lzRW5hYmxlZEF1dG9UcmltbWluZw0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DUlNfSXNFbmFibGVkQXV0b1RyaW1taW5nKHZvaWQpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKENSUy0+Q1IsIENSU19DUl9BVVRPVFJJTUVOKSA9PSAoQ1JTX0NSX0FVVE9UUklNRU4pKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZXQgSFNJNDggb3NjaWxsYXRvciBzbW9vdGggdHJpbW1pbmcNCi0gKiBAbm90ZSAgIFdoZW4gdGhlIEFVVE9UUklNRU4gYml0IGlzIHNldCwgdGhpcyBmaWVsZCBpcyBjb250cm9sbGVkIGJ5IGhhcmR3YXJlDQotICogYW5kIGlzIHJlYWQtb25seQ0KLSAqIEBybXRvbGwgQ1IgICAgICAgICAgIFRSSU0gICAgICAgICAgTExfQ1JTX1NldEhTSTQ4U21vb3RoVHJpbW1pbmcNCi0gKiBAcGFyYW0gIFZhbHVlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDYzDQotICogQG5vdGUgICBEZWZhdWx0IHZhbHVlIGNhbiBiZSBzZXQgdGhhbmtzIHRvIEByZWYNCi0gKiBMTF9DUlNfSFNJNDhDQUxJQlJBVElPTl9ERUZBVUxUDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ1JTX1NldEhTSTQ4U21vb3RoVHJpbW1pbmcodWludDMyX3QgVmFsdWUpIHsNCi0gIE1PRElGWV9SRUcoQ1JTLT5DUiwgQ1JTX0NSX1RSSU0sIFZhbHVlIDw8IENSU19DUl9UUklNX1Bvcyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IEhTSTQ4IG9zY2lsbGF0b3Igc21vb3RoIHRyaW1taW5nDQotICogQHJtdG9sbCBDUiAgICAgICAgICAgVFJJTSAgICAgICAgICBMTF9DUlNfR2V0SFNJNDhTbW9vdGhUcmltbWluZw0KLSAqIEByZXR2YWwgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gNjMNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQ1JTX0dldEhTSTQ4U21vb3RoVHJpbW1pbmcodm9pZCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQ1JTLT5DUiwgQ1JTX0NSX1RSSU0pID4+IENSU19DUl9UUklNX1Bvcyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IGNvdW50ZXIgcmVsb2FkIHZhbHVlDQotICogQHJtdG9sbCBDRkdSICAgICAgICAgUkVMT0FEICAgICAgICBMTF9DUlNfU2V0UmVsb2FkQ291bnRlcg0KLSAqIEBwYXJhbSAgVmFsdWUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMHhGRkZGDQotICogQG5vdGUgICBEZWZhdWx0IHZhbHVlIGNhbiBiZSBzZXQgdGhhbmtzIHRvIEByZWYgTExfQ1JTX1JFTE9BRFZBTFVFX0RFRkFVTFQNCi0gKiAgICAgICAgIE90aGVyd2lzZSBpdCBjYW4gYmUgY2FsY3VsYXRlZCBpbiB1c2luZyBtYWNybyBAcmVmDQotICogX19MTF9DUlNfQ0FMQ19DQUxDVUxBVEVfUkVMT0FEVkFMVUUgKF9GVEFSR0VUXywgX0ZTWU5DXykNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DUlNfU2V0UmVsb2FkQ291bnRlcih1aW50MzJfdCBWYWx1ZSkgew0KLSAgTU9ESUZZX1JFRyhDUlMtPkNGR1IsIENSU19DRkdSX1JFTE9BRCwgVmFsdWUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBjb3VudGVyIHJlbG9hZCB2YWx1ZQ0KLSAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIFJFTE9BRCAgICAgICAgTExfQ1JTX0dldFJlbG9hZENvdW50ZXINCi0gKiBAcmV0dmFsIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDB4RkZGRg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DUlNfR2V0UmVsb2FkQ291bnRlcih2b2lkKSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChDUlMtPkNGR1IsIENSU19DRkdSX1JFTE9BRCkpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCBmcmVxdWVuY3kgZXJyb3IgbGltaXQNCi0gKiBAcm10b2xsIENGR1IgICAgICAgICBGRUxJTSAgICAgICAgIExMX0NSU19TZXRGcmVxRXJyb3JMaW1pdA0KLSAqIEBwYXJhbSAgVmFsdWUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMjU1DQotICogQG5vdGUgICBEZWZhdWx0IHZhbHVlIGNhbiBiZSBzZXQgdGhhbmtzIHRvIEByZWYgTExfQ1JTX0VSUk9STElNSVRfREVGQVVMVA0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0NSU19TZXRGcmVxRXJyb3JMaW1pdCh1aW50MzJfdCBWYWx1ZSkgew0KLSAgTU9ESUZZX1JFRyhDUlMtPkNGR1IsIENSU19DRkdSX0ZFTElNLCBWYWx1ZSA8PCBDUlNfQ0ZHUl9GRUxJTV9Qb3MpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBmcmVxdWVuY3kgZXJyb3IgbGltaXQNCi0gKiBAcm10b2xsIENGR1IgICAgICAgICBGRUxJTSAgICAgICAgIExMX0NSU19HZXRGcmVxRXJyb3JMaW1pdA0KLSAqIEByZXR2YWwgQSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMjU1DQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NSU19HZXRGcmVxRXJyb3JMaW1pdCh2b2lkKSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChDUlMtPkNGR1IsIENSU19DRkdSX0ZFTElNKSA+PiBDUlNfQ0ZHUl9GRUxJTV9Qb3MpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCBkaXZpc2lvbiBmYWN0b3IgZm9yIFNZTkMgc2lnbmFsDQotICogQHJtdG9sbCBDRkdSICAgICAgICAgU1lOQ0RJViAgICAgICBMTF9DUlNfU2V0U3luY0RpdmlkZXINCi0gKiBAcGFyYW0gIERpdmlkZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUlNfU1lOQ19ESVZfMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSU19TWU5DX0RJVl8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfQ1JTX1NZTkNfRElWXzQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUlNfU1lOQ19ESVZfOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSU19TWU5DX0RJVl8xNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSU19TWU5DX0RJVl8zMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSU19TWU5DX0RJVl82NA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSU19TWU5DX0RJVl8xMjgNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DUlNfU2V0U3luY0RpdmlkZXIodWludDMyX3QgRGl2aWRlcikgew0KLSAgTU9ESUZZX1JFRyhDUlMtPkNGR1IsIENSU19DRkdSX1NZTkNESVYsIERpdmlkZXIpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBkaXZpc2lvbiBmYWN0b3IgZm9yIFNZTkMgc2lnbmFsDQotICogQHJtdG9sbCBDRkdSICAgICAgICAgU1lOQ0RJViAgICAgICBMTF9DUlNfR2V0U3luY0RpdmlkZXINCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQ1JTX1NZTkNfRElWXzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUlNfU1lOQ19ESVZfMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSU19TWU5DX0RJVl80DQotICogICAgICAgICBAYXJnIEByZWYgTExfQ1JTX1NZTkNfRElWXzgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUlNfU1lOQ19ESVZfMTYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUlNfU1lOQ19ESVZfMzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUlNfU1lOQ19ESVZfNjQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUlNfU1lOQ19ESVZfMTI4DQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NSU19HZXRTeW5jRGl2aWRlcih2b2lkKSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChDUlMtPkNGR1IsIENSU19DRkdSX1NZTkNESVYpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZXQgU1lOQyBzaWduYWwgc291cmNlDQotICogQHJtdG9sbCBDRkdSICAgICAgICAgU1lOQ1NSQyAgICAgICBMTF9DUlNfU2V0U3luY1NpZ25hbFNvdXJjZQ0KLSAqIEBwYXJhbSAgU291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQ1JTX1NZTkNfU09VUkNFX0dQSU8NCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUlNfU1lOQ19TT1VSQ0VfTFNFDQotICogICAgICAgICBAYXJnIEByZWYgTExfQ1JTX1NZTkNfU09VUkNFX1VTQg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0NSU19TZXRTeW5jU2lnbmFsU291cmNlKHVpbnQzMl90IFNvdXJjZSkgew0KLSAgTU9ESUZZX1JFRyhDUlMtPkNGR1IsIENSU19DRkdSX1NZTkNTUkMsIFNvdXJjZSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IFNZTkMgc2lnbmFsIHNvdXJjZQ0KLSAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIFNZTkNTUkMgICAgICAgTExfQ1JTX0dldFN5bmNTaWduYWxTb3VyY2UNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQ1JTX1NZTkNfU09VUkNFX0dQSU8NCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUlNfU1lOQ19TT1VSQ0VfTFNFDQotICogICAgICAgICBAYXJnIEByZWYgTExfQ1JTX1NZTkNfU09VUkNFX1VTQg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DUlNfR2V0U3luY1NpZ25hbFNvdXJjZSh2b2lkKSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChDUlMtPkNGR1IsIENSU19DRkdSX1NZTkNTUkMpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZXQgaW5wdXQgcG9sYXJpdHkgZm9yIHRoZSBTWU5DIHNpZ25hbCBzb3VyY2UNCi0gKiBAcm10b2xsIENGR1IgICAgICAgICBTWU5DUE9MICAgICAgIExMX0NSU19TZXRTeW5jUG9sYXJpdHkNCi0gKiBAcGFyYW0gIFBvbGFyaXR5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQ1JTX1NZTkNfUE9MQVJJVFlfUklTSU5HDQotICogICAgICAgICBAYXJnIEByZWYgTExfQ1JTX1NZTkNfUE9MQVJJVFlfRkFMTElORw0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0NSU19TZXRTeW5jUG9sYXJpdHkodWludDMyX3QgUG9sYXJpdHkpIHsNCi0gIE1PRElGWV9SRUcoQ1JTLT5DRkdSLCBDUlNfQ0ZHUl9TWU5DUE9MLCBQb2xhcml0eSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IGlucHV0IHBvbGFyaXR5IGZvciB0aGUgU1lOQyBzaWduYWwgc291cmNlDQotICogQHJtdG9sbCBDRkdSICAgICAgICAgU1lOQ1BPTCAgICAgICBMTF9DUlNfR2V0U3luY1BvbGFyaXR5DQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSU19TWU5DX1BPTEFSSVRZX1JJU0lORw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSU19TWU5DX1BPTEFSSVRZX0ZBTExJTkcNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQ1JTX0dldFN5bmNQb2xhcml0eSh2b2lkKSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChDUlMtPkNGR1IsIENSU19DRkdSX1NZTkNQT0wpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDb25maWd1cmUgQ1JTIGZvciB0aGUgc3luY2hyb25pemF0aW9uDQotICogQHJtdG9sbCBDUiAgICAgICAgICAgVFJJTSAgICAgICAgICBMTF9DUlNfQ29uZmlnU3luY2hyb25pemF0aW9uXG4NCi0gKiAgICAgICAgIENGR1IgICAgICAgICBSRUxPQUQgICAgICAgIExMX0NSU19Db25maWdTeW5jaHJvbml6YXRpb25cbg0KLSAqICAgICAgICAgQ0ZHUiAgICAgICAgIEZFTElNICAgICAgICAgTExfQ1JTX0NvbmZpZ1N5bmNocm9uaXphdGlvblxuDQotICogICAgICAgICBDRkdSICAgICAgICAgU1lOQ0RJViAgICAgICBMTF9DUlNfQ29uZmlnU3luY2hyb25pemF0aW9uXG4NCi0gKiAgICAgICAgIENGR1IgICAgICAgICBTWU5DU1JDICAgICAgIExMX0NSU19Db25maWdTeW5jaHJvbml6YXRpb25cbg0KLSAqICAgICAgICAgQ0ZHUiAgICAgICAgIFNZTkNQT0wgICAgICAgTExfQ1JTX0NvbmZpZ1N5bmNocm9uaXphdGlvbg0KLSAqIEBwYXJhbSAgSFNJNDhDYWxpYnJhdGlvblZhbHVlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDYzDQotICogQHBhcmFtICBFcnJvckxpbWl0VmFsdWUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMHhGRkZGDQotICogQHBhcmFtICBSZWxvYWRWYWx1ZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAyNTUNCi0gKiBAcGFyYW0gIFNldHRpbmdzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSU19TWU5DX0RJVl8xIG9yIEByZWYgTExfQ1JTX1NZTkNfRElWXzIgb3IgQHJlZg0KLSAqIExMX0NSU19TWU5DX0RJVl80IG9yIEByZWYgTExfQ1JTX1NZTkNfRElWXzggb3IgQHJlZiBMTF9DUlNfU1lOQ19ESVZfMTYgb3INCi0gKiBAcmVmIExMX0NSU19TWU5DX0RJVl8zMiBvciBAcmVmIExMX0NSU19TWU5DX0RJVl82NCBvciBAcmVmDQotICogTExfQ1JTX1NZTkNfRElWXzEyOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSU19TWU5DX1NPVVJDRV9HUElPIG9yIEByZWYgTExfQ1JTX1NZTkNfU09VUkNFX0xTRSBvcg0KLSAqIEByZWYgTExfQ1JTX1NZTkNfU09VUkNFX1VTQg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSU19TWU5DX1BPTEFSSVRZX1JJU0lORyBvciBAcmVmDQotICogTExfQ1JTX1NZTkNfUE9MQVJJVFlfRkFMTElORw0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0NSU19Db25maWdTeW5jaHJvbml6YXRpb24oDQotICAgIHVpbnQzMl90IEhTSTQ4Q2FsaWJyYXRpb25WYWx1ZSwgdWludDMyX3QgRXJyb3JMaW1pdFZhbHVlLA0KLSAgICB1aW50MzJfdCBSZWxvYWRWYWx1ZSwgdWludDMyX3QgU2V0dGluZ3MpIHsNCi0gIE1PRElGWV9SRUcoQ1JTLT5DUiwgQ1JTX0NSX1RSSU0sIEhTSTQ4Q2FsaWJyYXRpb25WYWx1ZSk7DQotICBNT0RJRllfUkVHKENSUy0+Q0ZHUiwNCi0gICAgICAgICAgICAgQ1JTX0NGR1JfUkVMT0FEIHwgQ1JTX0NGR1JfRkVMSU0gfCBDUlNfQ0ZHUl9TWU5DRElWIHwNCi0gICAgICAgICAgICAgICAgIENSU19DRkdSX1NZTkNTUkMgfCBDUlNfQ0ZHUl9TWU5DUE9MLA0KLSAgICAgICAgICAgICBSZWxvYWRWYWx1ZSB8IChFcnJvckxpbWl0VmFsdWUgPDwgQ1JTX0NGR1JfRkVMSU1fUG9zKSB8IFNldHRpbmdzKTsNCi19DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIENSU19MTF9FRl9DUlNfTWFuYWdlbWVudCBDUlNfTWFuYWdlbWVudA0KLSAqIEB7DQotICovDQotDQotLyoqDQotICogQGJyaWVmICBHZW5lcmF0ZSBzb2Z0d2FyZSBTWU5DIGV2ZW50DQotICogQHJtdG9sbCBDUiAgICAgICAgICAgU1dTWU5DICAgICAgICBMTF9DUlNfR2VuZXJhdGVFdmVudF9TV1NZTkMNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DUlNfR2VuZXJhdGVFdmVudF9TV1NZTkModm9pZCkgew0KLSAgU0VUX0JJVChDUlMtPkNSLCBDUlNfQ1JfU1dTWU5DKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgdGhlIGZyZXF1ZW5jeSBlcnJvciBkaXJlY3Rpb24gbGF0Y2hlZCBpbiB0aGUgdGltZSBvZiB0aGUgbGFzdA0KLSAqIFNZTkMgZXZlbnQNCi0gKiBAcm10b2xsIElTUiAgICAgICAgICBGRURJUiAgICAgICAgIExMX0NSU19HZXRGcmVxRXJyb3JEaXJlY3Rpb24NCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfQ1JTX0ZSRVFfRVJST1JfRElSX1VQDQotICogICAgICAgICBAYXJnIEByZWYgTExfQ1JTX0ZSRVFfRVJST1JfRElSX0RPV04NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQ1JTX0dldEZyZXFFcnJvckRpcmVjdGlvbih2b2lkKSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChDUlMtPklTUiwgQ1JTX0lTUl9GRURJUikpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCB0aGUgZnJlcXVlbmN5IGVycm9yIGNvdW50ZXIgdmFsdWUgbGF0Y2hlZCBpbiB0aGUgdGltZSBvZiB0aGUgbGFzdA0KLSAqIFNZTkMgZXZlbnQNCi0gKiBAcm10b2xsIElTUiAgICAgICAgICBGRUNBUCAgICAgICAgIExMX0NSU19HZXRGcmVxRXJyb3JDYXB0dXJlDQotICogQHJldHZhbCBBIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMDAwIGFuZCBNYXhfRGF0YSA9IDB4RkZGRg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DUlNfR2V0RnJlcUVycm9yQ2FwdHVyZSh2b2lkKSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChDUlMtPklTUiwgQ1JTX0lTUl9GRUNBUCkgPj4gQ1JTX0lTUl9GRUNBUF9Qb3MpOw0KLX0NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQ1JTX0xMX0VGX0ZMQUdfTWFuYWdlbWVudCBGTEFHX01hbmFnZW1lbnQNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgU1lOQyBldmVudCBPSyBzaWduYWwgb2NjdXJyZWQgb3Igbm90DQotICogQHJtdG9sbCBJU1IgICAgICAgICAgU1lOQ09LRiAgICAgICBMTF9DUlNfSXNBY3RpdmVGbGFnX1NZTkNPSw0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DUlNfSXNBY3RpdmVGbGFnX1NZTkNPSyh2b2lkKSB7DQotICByZXR1cm4gKChSRUFEX0JJVChDUlMtPklTUiwgQ1JTX0lTUl9TWU5DT0tGKSA9PSAoQ1JTX0lTUl9TWU5DT0tGKSkgPyAxVUwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgU1lOQyB3YXJuaW5nIHNpZ25hbCBvY2N1cnJlZCBvciBub3QNCi0gKiBAcm10b2xsIElTUiAgICAgICAgICBTWU5DV0FSTkYgICAgIExMX0NSU19Jc0FjdGl2ZUZsYWdfU1lOQ1dBUk4NCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQ1JTX0lzQWN0aXZlRmxhZ19TWU5DV0FSTih2b2lkKSB7DQotICByZXR1cm4gKChSRUFEX0JJVChDUlMtPklTUiwgQ1JTX0lTUl9TWU5DV0FSTkYpID09IChDUlNfSVNSX1NZTkNXQVJORikpID8gMVVMDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiBTeW5jaHJvbml6YXRpb24gb3IgdHJpbW1pbmcgZXJyb3Igc2lnbmFsIG9jY3VycmVkIG9yIG5vdA0KLSAqIEBybXRvbGwgSVNSICAgICAgICAgIEVSUkYgICAgICAgICAgTExfQ1JTX0lzQWN0aXZlRmxhZ19FUlINCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQ1JTX0lzQWN0aXZlRmxhZ19FUlIodm9pZCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoQ1JTLT5JU1IsIENSU19JU1JfRVJSRikgPT0gKENSU19JU1JfRVJSRikpID8gMVVMIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiBFeHBlY3RlZCBTWU5DIHNpZ25hbCBvY2N1cnJlZCBvciBub3QNCi0gKiBAcm10b2xsIElTUiAgICAgICAgICBFU1lOQ0YgICAgICAgIExMX0NSU19Jc0FjdGl2ZUZsYWdfRVNZTkMNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQ1JTX0lzQWN0aXZlRmxhZ19FU1lOQyh2b2lkKSB7DQotICByZXR1cm4gKChSRUFEX0JJVChDUlMtPklTUiwgQ1JTX0lTUl9FU1lOQ0YpID09IChDUlNfSVNSX0VTWU5DRikpID8gMVVMIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiBTWU5DIGVycm9yIHNpZ25hbCBvY2N1cnJlZCBvciBub3QNCi0gKiBAcm10b2xsIElTUiAgICAgICAgICBTWU5DRVJSICAgICAgIExMX0NSU19Jc0FjdGl2ZUZsYWdfU1lOQ0VSUg0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DUlNfSXNBY3RpdmVGbGFnX1NZTkNFUlIodm9pZCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoQ1JTLT5JU1IsIENSU19JU1JfU1lOQ0VSUikgPT0gKENSU19JU1JfU1lOQ0VSUikpID8gMVVMDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIGlmIFNZTkMgbWlzc2VkIGVycm9yIHNpZ25hbCBvY2N1cnJlZCBvciBub3QNCi0gKiBAcm10b2xsIElTUiAgICAgICAgICBTWU5DTUlTUyAgICAgIExMX0NSU19Jc0FjdGl2ZUZsYWdfU1lOQ01JU1MNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQ1JTX0lzQWN0aXZlRmxhZ19TWU5DTUlTUyh2b2lkKSB7DQotICByZXR1cm4gKChSRUFEX0JJVChDUlMtPklTUiwgQ1JTX0lTUl9TWU5DTUlTUykgPT0gKENSU19JU1JfU1lOQ01JU1MpKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIGlmIFRyaW1taW5nIG92ZXJmbG93IG9yIHVuZGVyZmxvdyBvY2N1cnJlZCBvciBub3QNCi0gKiBAcm10b2xsIElTUiAgICAgICAgICBUUklNT1ZGICAgICAgIExMX0NSU19Jc0FjdGl2ZUZsYWdfVFJJTU9WRg0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DUlNfSXNBY3RpdmVGbGFnX1RSSU1PVkYodm9pZCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoQ1JTLT5JU1IsIENSU19JU1JfVFJJTU9WRikgPT0gKENSU19JU1JfVFJJTU9WRikpID8gMVVMDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENsZWFyIHRoZSBTWU5DIGV2ZW50IE9LIGZsYWcNCi0gKiBAcm10b2xsIElDUiAgICAgICAgICBTWU5DT0tDICAgICAgIExMX0NSU19DbGVhckZsYWdfU1lOQ09LDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ1JTX0NsZWFyRmxhZ19TWU5DT0sodm9pZCkgew0KLSAgV1JJVEVfUkVHKENSUy0+SUNSLCBDUlNfSUNSX1NZTkNPS0MpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENsZWFyIHRoZSAgU1lOQyB3YXJuaW5nIGZsYWcNCi0gKiBAcm10b2xsIElDUiAgICAgICAgICBTWU5DV0FSTkMgICAgIExMX0NSU19DbGVhckZsYWdfU1lOQ1dBUk4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DUlNfQ2xlYXJGbGFnX1NZTkNXQVJOKHZvaWQpIHsNCi0gIFdSSVRFX1JFRyhDUlMtPklDUiwgQ1JTX0lDUl9TWU5DV0FSTkMpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENsZWFyIFRSSU1PVkYsIFNZTkNNSVNTIGFuZCBTWU5DRVJSIGJpdHMgYW5kIGNvbnNlcXVlbnRseSBhbHNvDQotICogdGhlIEVSUiBmbGFnDQotICogQHJtdG9sbCBJQ1IgICAgICAgICAgRVJSQyAgICAgICAgICBMTF9DUlNfQ2xlYXJGbGFnX0VSUg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0NSU19DbGVhckZsYWdfRVJSKHZvaWQpIHsNCi0gIFdSSVRFX1JFRyhDUlMtPklDUiwgQ1JTX0lDUl9FUlJDKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDbGVhciBFeHBlY3RlZCBTWU5DIGZsYWcNCi0gKiBAcm10b2xsIElDUiAgICAgICAgICBFU1lOQ0MgICAgICAgIExMX0NSU19DbGVhckZsYWdfRVNZTkMNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DUlNfQ2xlYXJGbGFnX0VTWU5DKHZvaWQpIHsNCi0gIFdSSVRFX1JFRyhDUlMtPklDUiwgQ1JTX0lDUl9FU1lOQ0MpOw0KLX0NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQ1JTX0xMX0VGX0lUX01hbmFnZW1lbnQgSVRfTWFuYWdlbWVudA0KLSAqIEB7DQotICovDQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgU1lOQyBldmVudCBPSyBpbnRlcnJ1cHQNCi0gKiBAcm10b2xsIENSICAgICAgICAgICBTWU5DT0tJRSAgICAgIExMX0NSU19FbmFibGVJVF9TWU5DT0sNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DUlNfRW5hYmxlSVRfU1lOQ09LKHZvaWQpIHsNCi0gIFNFVF9CSVQoQ1JTLT5DUiwgQ1JTX0NSX1NZTkNPS0lFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIFNZTkMgZXZlbnQgT0sgaW50ZXJydXB0DQotICogQHJtdG9sbCBDUiAgICAgICAgICAgU1lOQ09LSUUgICAgICBMTF9DUlNfRGlzYWJsZUlUX1NZTkNPSw0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0NSU19EaXNhYmxlSVRfU1lOQ09LKHZvaWQpIHsNCi0gIENMRUFSX0JJVChDUlMtPkNSLCBDUlNfQ1JfU1lOQ09LSUUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIGlmIFNZTkMgZXZlbnQgT0sgaW50ZXJydXB0IGlzIGVuYWJsZWQgb3Igbm90DQotICogQHJtdG9sbCBDUiAgICAgICAgICAgU1lOQ09LSUUgICAgICBMTF9DUlNfSXNFbmFibGVkSVRfU1lOQ09LDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NSU19Jc0VuYWJsZWRJVF9TWU5DT0sodm9pZCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoQ1JTLT5DUiwgQ1JTX0NSX1NZTkNPS0lFKSA9PSAoQ1JTX0NSX1NZTkNPS0lFKSkgPyAxVUwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgU1lOQyB3YXJuaW5nIGludGVycnVwdA0KLSAqIEBybXRvbGwgQ1IgICAgICAgICAgIFNZTkNXQVJOSUUgICAgTExfQ1JTX0VuYWJsZUlUX1NZTkNXQVJODQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ1JTX0VuYWJsZUlUX1NZTkNXQVJOKHZvaWQpIHsNCi0gIFNFVF9CSVQoQ1JTLT5DUiwgQ1JTX0NSX1NZTkNXQVJOSUUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgU1lOQyB3YXJuaW5nIGludGVycnVwdA0KLSAqIEBybXRvbGwgQ1IgICAgICAgICAgIFNZTkNXQVJOSUUgICAgTExfQ1JTX0Rpc2FibGVJVF9TWU5DV0FSTg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0NSU19EaXNhYmxlSVRfU1lOQ1dBUk4odm9pZCkgew0KLSAgQ0xFQVJfQklUKENSUy0+Q1IsIENSU19DUl9TWU5DV0FSTklFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiBTWU5DIHdhcm5pbmcgaW50ZXJydXB0IGlzIGVuYWJsZWQgb3Igbm90DQotICogQHJtdG9sbCBDUiAgICAgICAgICAgU1lOQ1dBUk5JRSAgICBMTF9DUlNfSXNFbmFibGVkSVRfU1lOQ1dBUk4NCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQ1JTX0lzRW5hYmxlZElUX1NZTkNXQVJOKHZvaWQpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKENSUy0+Q1IsIENSU19DUl9TWU5DV0FSTklFKSA9PSAoQ1JTX0NSX1NZTkNXQVJOSUUpKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgU3luY2hyb25pemF0aW9uIG9yIHRyaW1taW5nIGVycm9yIGludGVycnVwdA0KLSAqIEBybXRvbGwgQ1IgICAgICAgICAgIEVSUklFICAgICAgICAgTExfQ1JTX0VuYWJsZUlUX0VSUg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0NSU19FbmFibGVJVF9FUlIodm9pZCkgew0KLSAgU0VUX0JJVChDUlMtPkNSLCBDUlNfQ1JfRVJSSUUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgU3luY2hyb25pemF0aW9uIG9yIHRyaW1taW5nIGVycm9yIGludGVycnVwdA0KLSAqIEBybXRvbGwgQ1IgICAgICAgICAgIEVSUklFICAgICAgICAgTExfQ1JTX0Rpc2FibGVJVF9FUlINCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DUlNfRGlzYWJsZUlUX0VSUih2b2lkKSB7DQotICBDTEVBUl9CSVQoQ1JTLT5DUiwgQ1JTX0NSX0VSUklFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiBTeW5jaHJvbml6YXRpb24gb3IgdHJpbW1pbmcgZXJyb3IgaW50ZXJydXB0IGlzIGVuYWJsZWQgb3INCi0gKiBub3QNCi0gKiBAcm10b2xsIENSICAgICAgICAgICBFUlJJRSAgICAgICAgIExMX0NSU19Jc0VuYWJsZWRJVF9FUlINCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQ1JTX0lzRW5hYmxlZElUX0VSUih2b2lkKSB7DQotICByZXR1cm4gKChSRUFEX0JJVChDUlMtPkNSLCBDUlNfQ1JfRVJSSUUpID09IChDUlNfQ1JfRVJSSUUpKSA/IDFVTCA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIEV4cGVjdGVkIFNZTkMgaW50ZXJydXB0DQotICogQHJtdG9sbCBDUiAgICAgICAgICAgRVNZTkNJRSAgICAgICBMTF9DUlNfRW5hYmxlSVRfRVNZTkMNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DUlNfRW5hYmxlSVRfRVNZTkModm9pZCkgew0KLSAgU0VUX0JJVChDUlMtPkNSLCBDUlNfQ1JfRVNZTkNJRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBFeHBlY3RlZCBTWU5DIGludGVycnVwdA0KLSAqIEBybXRvbGwgQ1IgICAgICAgICAgIEVTWU5DSUUgICAgICAgTExfQ1JTX0Rpc2FibGVJVF9FU1lOQw0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0NSU19EaXNhYmxlSVRfRVNZTkModm9pZCkgew0KLSAgQ0xFQVJfQklUKENSUy0+Q1IsIENSU19DUl9FU1lOQ0lFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiBFeHBlY3RlZCBTWU5DIGludGVycnVwdCBpcyBlbmFibGVkIG9yIG5vdA0KLSAqIEBybXRvbGwgQ1IgICAgICAgICAgIEVTWU5DSUUgICAgICAgTExfQ1JTX0lzRW5hYmxlZElUX0VTWU5DDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NSU19Jc0VuYWJsZWRJVF9FU1lOQyh2b2lkKSB7DQotICByZXR1cm4gKChSRUFEX0JJVChDUlMtPkNSLCBDUlNfQ1JfRVNZTkNJRSkgPT0gKENSU19DUl9FU1lOQ0lFKSkgPyAxVUwgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLSNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikNCi0vKiogQGRlZmdyb3VwIENSU19MTF9FRl9Jbml0IEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMNCi0gKiBAew0KLSAqLw0KLQ0KLUVycm9yU3RhdHVzIExMX0NSU19EZUluaXQodm9pZCk7DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0jZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLSNlbmRpZiAvKiBkZWZpbmVkKENSUykgKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLSNpZmRlZiBfX2NwbHVzcGx1cw0KLX0NCi0jZW5kaWYNCi0NCi0jZW5kaWYgLyogX19TVE0zMkc0eHhfTExfQ1JTX0ggKi8NCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBmaWxlICAgIHN0bTMyZzR4eF9sbF9jcnMuaAorICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIENSUyBMTCBtb2R1bGUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYXR0ZW50aW9uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE4IFNUTWljcm9lbGVjdHJvbmljcy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0ZXJtcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlCisgKiBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb2Z0d2FyZSBjb21wb25lbnQuCisgKiBJZiBubyBMSUNFTlNFIGZpbGUgY29tZXMgd2l0aCB0aGlzIHNvZnR3YXJlLCBpdCBpcyBwcm92aWRlZCBBUy1JUy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgX19TVE0zMkc0eHhfTExfQ1JTX0gKKyNkZWZpbmUgX19TVE0zMkc0eHhfTExfQ1JTX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzR4eC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHNHh4X0xMX0RyaXZlcgorICogQHsKKyAqLworCisjaWYgZGVmaW5lZChDUlMpCisKKy8qKiBAZGVmZ3JvdXAgQ1JTX0xMIENSUworICogQHsKKyAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ1JTX0xMX0V4cG9ydGVkX0NvbnN0YW50cyBDUlMgRXhwb3J0ZWQgQ29uc3RhbnRzCisgKiBAeworICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JTX0xMX0VDX0dFVF9GTEFHIEdldCBGbGFncyBEZWZpbmVzCisgKiBAYnJpZWYgICAgRmxhZ3MgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX0NSU19SZWFkUmVnIGZ1bmN0aW9uCisgKiBAeworICovCisjZGVmaW5lIExMX0NSU19JU1JfU1lOQ09LRiBDUlNfSVNSX1NZTkNPS0YKKyNkZWZpbmUgTExfQ1JTX0lTUl9TWU5DV0FSTkYgQ1JTX0lTUl9TWU5DV0FSTkYKKyNkZWZpbmUgTExfQ1JTX0lTUl9FUlJGIENSU19JU1JfRVJSRgorI2RlZmluZSBMTF9DUlNfSVNSX0VTWU5DRiBDUlNfSVNSX0VTWU5DRgorI2RlZmluZSBMTF9DUlNfSVNSX1NZTkNFUlIgQ1JTX0lTUl9TWU5DRVJSCisjZGVmaW5lIExMX0NSU19JU1JfU1lOQ01JU1MgQ1JTX0lTUl9TWU5DTUlTUworI2RlZmluZSBMTF9DUlNfSVNSX1RSSU1PVkYgQ1JTX0lTUl9UUklNT1ZGCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBDUlNfTExfRUNfSVQgSVQgRGVmaW5lcworICogQGJyaWVmICAgIElUIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9DUlNfUmVhZFJlZyBhbmQKKyAqIExMX0NSU19Xcml0ZVJlZyBmdW5jdGlvbnMKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfQ1JTX0NSX1NZTkNPS0lFIENSU19DUl9TWU5DT0tJRQorI2RlZmluZSBMTF9DUlNfQ1JfU1lOQ1dBUk5JRSBDUlNfQ1JfU1lOQ1dBUk5JRQorI2RlZmluZSBMTF9DUlNfQ1JfRVJSSUUgQ1JTX0NSX0VSUklFCisjZGVmaW5lIExMX0NSU19DUl9FU1lOQ0lFIENSU19DUl9FU1lOQ0lFCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBDUlNfTExfRUNfU1lOQ19ESVYgU3luY2hyb25pemF0aW9uIFNpZ25hbCBEaXZpZGVyCisgKiBAeworICovCisjZGVmaW5lIExMX0NSU19TWU5DX0RJVl8xIFwKKyAgKCh1aW50MzJfdCkweDAwVSkgLyohPCBTeW5jaHJvIFNpZ25hbCBub3QgZGl2aWRlZCAoZGVmYXVsdCkgKi8KKyNkZWZpbmUgTExfQ1JTX1NZTkNfRElWXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQ1JTX0NGR1JfU1lOQ0RJVl8wIC8qITwgU3luY2hybyBTaWduYWwgZGl2aWRlZCBieSAyIFwKKyAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9DUlNfU1lOQ19ESVZfNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBDUlNfQ0ZHUl9TWU5DRElWXzEgLyohPCBTeW5jaHJvIFNpZ25hbCBkaXZpZGVkIGJ5IDQgXAorICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0NSU19TWU5DX0RJVl84ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKENSU19DRkdSX1NZTkNESVZfMSB8IENSU19DRkdSX1NZTkNESVZfMCkgLyohPCBTeW5jaHJvIFNpZ25hbCBkaXZpZGVkIGJ5IDggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfQ1JTX1NZTkNfRElWXzE2IFwKKyAgQ1JTX0NGR1JfU1lOQ0RJVl8yIC8qITwgU3luY2hybyBTaWduYWwgZGl2aWRlZCBieSAxNiAqLworI2RlZmluZSBMTF9DUlNfU1lOQ19ESVZfMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQ1JTX0NGR1JfU1lOQ0RJVl8yIHwgQ1JTX0NGR1JfU1lOQ0RJVl8wKSAvKiE8IFN5bmNocm8gU2lnbmFsIGRpdmlkZWQgYnkgMzIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfQ1JTX1NZTkNfRElWXzY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKENSU19DRkdSX1NZTkNESVZfMiB8IENSU19DRkdSX1NZTkNESVZfMSkgLyohPCBTeW5jaHJvIFNpZ25hbCBkaXZpZGVkIGJ5IDY0IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0NSU19TWU5DX0RJVl8xMjggXAorICBDUlNfQ0ZHUl9TWU5DRElWIC8qITwgU3luY2hybyBTaWduYWwgZGl2aWRlZCBieSAxMjggKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIENSU19MTF9FQ19TWU5DX1NPVVJDRSBTeW5jaHJvbml6YXRpb24gU2lnbmFsIFNvdXJjZQorICogQHsKKyAqLworI2RlZmluZSBMTF9DUlNfU1lOQ19TT1VSQ0VfR1BJTyBcCisgICgodWludDMyX3QpMHgwMFUpIC8qITwgU3luY2hybyBTaWduYWwgc291cmNlIEdQSU8gKi8KKyNkZWZpbmUgTExfQ1JTX1NZTkNfU09VUkNFX0xTRSBcCisgIENSU19DRkdSX1NZTkNTUkNfMCAvKiE8IFN5bmNocm8gU2lnbmFsIHNvdXJjZSBMU0UgKi8KKyNkZWZpbmUgTExfQ1JTX1NZTkNfU09VUkNFX1VTQiBcCisgIENSU19DRkdSX1NZTkNTUkNfMSAvKiE8IFN5bmNocm8gU2lnbmFsIHNvdXJjZSBVU0IgU09GIChkZWZhdWx0KSovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBDUlNfTExfRUNfU1lOQ19QT0xBUklUWSBTeW5jaHJvbml6YXRpb24gU2lnbmFsIFBvbGFyaXR5CisgKiBAeworICovCisjZGVmaW5lIExMX0NSU19TWU5DX1BPTEFSSVRZX1JJU0lORyBcCisgICgodWludDMyX3QpMHgwMFUpIC8qITwgU3luY2hybyBBY3RpdmUgb24gcmlzaW5nIGVkZ2UgKGRlZmF1bHQpICovCisjZGVmaW5lIExMX0NSU19TWU5DX1BPTEFSSVRZX0ZBTExJTkcgXAorICBDUlNfQ0ZHUl9TWU5DUE9MIC8qITwgU3luY2hybyBBY3RpdmUgb24gZmFsbGluZyBlZGdlICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBDUlNfTExfRUNfRlJFUUVSUk9SRElSIEZyZXF1ZW5jeSBFcnJvciBEaXJlY3Rpb24KKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfQ1JTX0ZSRVFfRVJST1JfRElSX1VQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKHVpbnQzMl90KTB4MDBVKSAvKiE8IFVwY291bnRpbmcgZGlyZWN0aW9uLCB0aGUgYWN0dWFsIGZyZXF1ZW5jeSBpcyBhYm92ZSBcCisgICAgICAgICAgICAgICAgICAgICAgIHRoZSB0YXJnZXQgKi8KKyNkZWZpbmUgTExfQ1JTX0ZSRVFfRVJST1JfRElSX0RPV04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCh1aW50MzJfdClDUlNfSVNSX0ZFRElSKSAvKiE8IERvd25jb3VudGluZyBkaXJlY3Rpb24sIHRoZSBhY3R1YWwgZnJlcXVlbmN5IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBiZWxvdyB0aGUgdGFyZ2V0ICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBDUlNfTExfRUNfREVGQVVMVFZBTFVFUyBEZWZhdWx0IFZhbHVlcworICogQHsKKyAqLworLyoqCisgKiBAYnJpZWYgUmVzZXQgdmFsdWUgb2YgdGhlIFJFTE9BRCBmaWVsZAorICogQG5vdGUgVGhlIHJlc2V0IHZhbHVlIG9mIHRoZSBSRUxPQUQgZmllbGQgY29ycmVzcG9uZHMgdG8gYSB0YXJnZXQgZnJlcXVlbmN5CisgKiBvZiA0OCBNSHogYW5kIGEgc3luY2hyb25pemF0aW9uIHNpZ25hbCBmcmVxdWVuY3kgb2YgMSBrSHogKFNPRiBzaWduYWwgZnJvbQorICogVVNCKQorICovCisjZGVmaW5lIExMX0NSU19SRUxPQURWQUxVRV9ERUZBVUxUICgodWludDMyX3QpMHhCQjdGVSkKKworLyoqCisgKiBAYnJpZWYgUmVzZXQgdmFsdWUgb2YgRnJlcXVlbmN5IGVycm9yIGxpbWl0LgorICovCisjZGVmaW5lIExMX0NSU19FUlJPUkxJTUlUX0RFRkFVTFQgKCh1aW50MzJfdCkweDIyVSkKKworLyoqCisgKiBAYnJpZWYgUmVzZXQgdmFsdWUgb2YgdGhlIEhTSTQ4IENhbGlicmF0aW9uIGZpZWxkCisgKiBAbm90ZSBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA2NCwgd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIG1pZGRsZSBvZiB0aGUKKyAqIHRyaW1taW5nIGludGVydmFsLiBUaGUgdHJpbW1pbmcgc3RlcCBpcyBzcGVjaWZpZWQgaW4gdGhlIHByb2R1Y3QgZGF0YXNoZWV0LgorICogICAgICAgQSBoaWdoZXIgVFJJTSB2YWx1ZSBjb3JyZXNwb25kcyB0byBhIGhpZ2hlciBvdXRwdXQgZnJlcXVlbmN5CisgKi8KKyNkZWZpbmUgTExfQ1JTX0hTSTQ4Q0FMSUJSQVRJT05fREVGQVVMVCAoKHVpbnQzMl90KTB4NDBVKQorLyoqCisgKiBAfQorICovCisvKioKKyAqIEB9CisgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ1JTX0xMX0V4cG9ydGVkX01hY3JvcyBDUlMgRXhwb3J0ZWQgTWFjcm9zCisgKiBAeworICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JTX0xMX0VNX1dSSVRFX1JFQUQgQ29tbW9uIFdyaXRlIGFuZCByZWFkIHJlZ2lzdGVycyBNYWNyb3MKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgIFdyaXRlIGEgdmFsdWUgaW4gQ1JTIHJlZ2lzdGVyCisgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBDUlMgSW5zdGFuY2UKKyAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSB3cml0dGVuCisgKiBAcGFyYW0gIF9fVkFMVUVfXyBWYWx1ZSB0byBiZSB3cml0dGVuIGluIHRoZSByZWdpc3RlcgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgTExfQ1JTX1dyaXRlUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXywgX19WQUxVRV9fKSBcCisgIFdSSVRFX1JFRyhfX0lOU1RBTkNFX18tPl9fUkVHX18sIChfX1ZBTFVFX18pKQorCisvKioKKyAqIEBicmllZiAgUmVhZCBhIHZhbHVlIGluIENSUyByZWdpc3RlcgorICogQHBhcmFtICBfX0lOU1RBTkNFX18gQ1JTIEluc3RhbmNlCisgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgcmVhZAorICogQHJldHZhbCBSZWdpc3RlciB2YWx1ZQorICovCisjZGVmaW5lIExMX0NSU19SZWFkUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXykgUkVBRF9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fKQorLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JTX0xMX0VNX0V4cG9ydGVkX01hY3Jvc19DYWxjdWxhdGVfUmVsb2FkCisgKiBFeHBvcnRlZF9NYWNyb3NfQ2FsY3VsYXRlX1JlbG9hZAorICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiAgTWFjcm8gdG8gY2FsY3VsYXRlIHJlbG9hZCB2YWx1ZSB0byBiZSBzZXQgaW4gQ1JTIHJlZ2lzdGVyIGFjY29yZGluZworICogdG8gdGFyZ2V0IGFuZCBzeW5jIGZyZXF1ZW5jaWVzCisgKiBAbm90ZSAgIFRoZSBSRUxPQUQgdmFsdWUgc2hvdWxkIGJlIHNlbGVjdGVkIGFjY29yZGluZyB0byB0aGUgcmF0aW8gYmV0d2VlbgorICogICAgICAgICB0aGUgdGFyZ2V0IGZyZXF1ZW5jeSBhbmQgdGhlIGZyZXF1ZW5jeSBvZiB0aGUgc3luY2hyb25pemF0aW9uIHNvdXJjZQorICogYWZ0ZXIgcHJlc2NhbGluZy4gSXQgaXMgdGhlbiBkZWNyZWFzZWQgYnkgb25lIGluIG9yZGVyIHRvIHJlYWNoIHRoZSBleHBlY3RlZAorICogICAgICAgICBzeW5jaHJvbml6YXRpb24gb24gdGhlIHplcm8gdmFsdWUuIFRoZSBmb3JtdWxhIGlzIHRoZSBmb2xsb3dpbmc6CisgKiAgICAgICAgICAgICAgUkVMT0FEID0gKGZUQVJHRVQgLyBmU1lOQykgLTEKKyAqIEBwYXJhbSAgX19GVEFSR0VUX18gVGFyZ2V0IGZyZXF1ZW5jeSAodmFsdWUgaW4gSHopCisgKiBAcGFyYW0gIF9fRlNZTkNfXyBTeW5jaHJvbml6YXRpb24gc2lnbmFsIGZyZXF1ZW5jeSAodmFsdWUgaW4gSHopCisgKiBAcmV0dmFsIFJlbG9hZCB2YWx1ZSAoaW4gSHopCisgKi8KKyNkZWZpbmUgX19MTF9DUlNfQ0FMQ19DQUxDVUxBVEVfUkVMT0FEVkFMVUUoX19GVEFSR0VUX18sIF9fRlNZTkNfXykgXAorICAoKChfX0ZUQVJHRVRfXykgLyAoX19GU1lOQ19fKSkgLSAxVSkKKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBDUlNfTExfRXhwb3J0ZWRfRnVuY3Rpb25zIENSUyBFeHBvcnRlZCBGdW5jdGlvbnMKKyAqIEB7CisgKi8KKworLyoqIEBkZWZncm91cCBDUlNfTExfRUZfQ29uZmlndXJhdGlvbiBDb25maWd1cmF0aW9uCisgKiBAeworICovCisKKy8qKgorICogQGJyaWVmICBFbmFibGUgRnJlcXVlbmN5IGVycm9yIGNvdW50ZXIKKyAqIEBub3RlIFdoZW4gdGhpcyBiaXQgaXMgc2V0LCB0aGUgQ1JTX0NGR1IgcmVnaXN0ZXIgaXMgd3JpdGUtcHJvdGVjdGVkIGFuZAorICogY2Fubm90IGJlIG1vZGlmaWVkCisgKiBAcm10b2xsIENSICAgICAgICAgICBDRU4gICAgICAgICAgIExMX0NSU19FbmFibGVGcmVxRXJyb3JDb3VudGVyCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ1JTX0VuYWJsZUZyZXFFcnJvckNvdW50ZXIodm9pZCkgeworICBTRVRfQklUKENSUy0+Q1IsIENSU19DUl9DRU4pOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBGcmVxdWVuY3kgZXJyb3IgY291bnRlcgorICogQHJtdG9sbCBDUiAgICAgICAgICAgQ0VOICAgICAgICAgICBMTF9DUlNfRGlzYWJsZUZyZXFFcnJvckNvdW50ZXIKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DUlNfRGlzYWJsZUZyZXFFcnJvckNvdW50ZXIodm9pZCkgeworICBDTEVBUl9CSVQoQ1JTLT5DUiwgQ1JTX0NSX0NFTik7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiBGcmVxdWVuY3kgZXJyb3IgY291bnRlciBpcyBlbmFibGVkIG9yIG5vdAorICogQHJtdG9sbCBDUiAgICAgICAgICAgQ0VOICAgICAgICAgICBMTF9DUlNfSXNFbmFibGVkRnJlcUVycm9yQ291bnRlcgorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DUlNfSXNFbmFibGVkRnJlcUVycm9yQ291bnRlcih2b2lkKSB7CisgIHJldHVybiAoKFJFQURfQklUKENSUy0+Q1IsIENSU19DUl9DRU4pID09IChDUlNfQ1JfQ0VOKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIEF1dG9tYXRpYyB0cmltbWluZyBjb3VudGVyCisgKiBAcm10b2xsIENSICAgICAgICAgICBBVVRPVFJJTUVOICAgIExMX0NSU19FbmFibGVBdXRvVHJpbW1pbmcKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DUlNfRW5hYmxlQXV0b1RyaW1taW5nKHZvaWQpIHsKKyAgU0VUX0JJVChDUlMtPkNSLCBDUlNfQ1JfQVVUT1RSSU1FTik7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIEF1dG9tYXRpYyB0cmltbWluZyBjb3VudGVyCisgKiBAcm10b2xsIENSICAgICAgICAgICBBVVRPVFJJTUVOICAgIExMX0NSU19EaXNhYmxlQXV0b1RyaW1taW5nCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ1JTX0Rpc2FibGVBdXRvVHJpbW1pbmcodm9pZCkgeworICBDTEVBUl9CSVQoQ1JTLT5DUiwgQ1JTX0NSX0FVVE9UUklNRU4pOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgQXV0b21hdGljIHRyaW1taW5nIGlzIGVuYWJsZWQgb3Igbm90CisgKiBAcm10b2xsIENSICAgICAgICAgICBBVVRPVFJJTUVOICAgIExMX0NSU19Jc0VuYWJsZWRBdXRvVHJpbW1pbmcKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQ1JTX0lzRW5hYmxlZEF1dG9UcmltbWluZyh2b2lkKSB7CisgIHJldHVybiAoKFJFQURfQklUKENSUy0+Q1IsIENSU19DUl9BVVRPVFJJTUVOKSA9PSAoQ1JTX0NSX0FVVE9UUklNRU4pKSA/IDFVTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgU2V0IEhTSTQ4IG9zY2lsbGF0b3Igc21vb3RoIHRyaW1taW5nCisgKiBAbm90ZSAgIFdoZW4gdGhlIEFVVE9UUklNRU4gYml0IGlzIHNldCwgdGhpcyBmaWVsZCBpcyBjb250cm9sbGVkIGJ5IGhhcmR3YXJlCisgKiBhbmQgaXMgcmVhZC1vbmx5CisgKiBAcm10b2xsIENSICAgICAgICAgICBUUklNICAgICAgICAgIExMX0NSU19TZXRIU0k0OFNtb290aFRyaW1taW5nCisgKiBAcGFyYW0gIFZhbHVlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDYzCisgKiBAbm90ZSAgIERlZmF1bHQgdmFsdWUgY2FuIGJlIHNldCB0aGFua3MgdG8gQHJlZgorICogTExfQ1JTX0hTSTQ4Q0FMSUJSQVRJT05fREVGQVVMVAorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0NSU19TZXRIU0k0OFNtb290aFRyaW1taW5nKHVpbnQzMl90IFZhbHVlKSB7CisgIE1PRElGWV9SRUcoQ1JTLT5DUiwgQ1JTX0NSX1RSSU0sIFZhbHVlIDw8IENSU19DUl9UUklNX1Bvcyk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgSFNJNDggb3NjaWxsYXRvciBzbW9vdGggdHJpbW1pbmcKKyAqIEBybXRvbGwgQ1IgICAgICAgICAgIFRSSU0gICAgICAgICAgTExfQ1JTX0dldEhTSTQ4U21vb3RoVHJpbW1pbmcKKyAqIEByZXR2YWwgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gNjMKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NSU19HZXRIU0k0OFNtb290aFRyaW1taW5nKHZvaWQpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQ1JTLT5DUiwgQ1JTX0NSX1RSSU0pID4+IENSU19DUl9UUklNX1Bvcyk7Cit9CisKKy8qKgorICogQGJyaWVmICBTZXQgY291bnRlciByZWxvYWQgdmFsdWUKKyAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIFJFTE9BRCAgICAgICAgTExfQ1JTX1NldFJlbG9hZENvdW50ZXIKKyAqIEBwYXJhbSAgVmFsdWUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMHhGRkZGCisgKiBAbm90ZSAgIERlZmF1bHQgdmFsdWUgY2FuIGJlIHNldCB0aGFua3MgdG8gQHJlZiBMTF9DUlNfUkVMT0FEVkFMVUVfREVGQVVMVAorICogICAgICAgICBPdGhlcndpc2UgaXQgY2FuIGJlIGNhbGN1bGF0ZWQgaW4gdXNpbmcgbWFjcm8gQHJlZgorICogX19MTF9DUlNfQ0FMQ19DQUxDVUxBVEVfUkVMT0FEVkFMVUUgKF9GVEFSR0VUXywgX0ZTWU5DXykKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DUlNfU2V0UmVsb2FkQ291bnRlcih1aW50MzJfdCBWYWx1ZSkgeworICBNT0RJRllfUkVHKENSUy0+Q0ZHUiwgQ1JTX0NGR1JfUkVMT0FELCBWYWx1ZSk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgY291bnRlciByZWxvYWQgdmFsdWUKKyAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIFJFTE9BRCAgICAgICAgTExfQ1JTX0dldFJlbG9hZENvdW50ZXIKKyAqIEByZXR2YWwgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMHhGRkZGCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DUlNfR2V0UmVsb2FkQ291bnRlcih2b2lkKSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKENSUy0+Q0ZHUiwgQ1JTX0NGR1JfUkVMT0FEKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBTZXQgZnJlcXVlbmN5IGVycm9yIGxpbWl0CisgKiBAcm10b2xsIENGR1IgICAgICAgICBGRUxJTSAgICAgICAgIExMX0NSU19TZXRGcmVxRXJyb3JMaW1pdAorICogQHBhcmFtICBWYWx1ZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAyNTUKKyAqIEBub3RlICAgRGVmYXVsdCB2YWx1ZSBjYW4gYmUgc2V0IHRoYW5rcyB0byBAcmVmIExMX0NSU19FUlJPUkxJTUlUX0RFRkFVTFQKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DUlNfU2V0RnJlcUVycm9yTGltaXQodWludDMyX3QgVmFsdWUpIHsKKyAgTU9ESUZZX1JFRyhDUlMtPkNGR1IsIENSU19DRkdSX0ZFTElNLCBWYWx1ZSA8PCBDUlNfQ0ZHUl9GRUxJTV9Qb3MpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IGZyZXF1ZW5jeSBlcnJvciBsaW1pdAorICogQHJtdG9sbCBDRkdSICAgICAgICAgRkVMSU0gICAgICAgICBMTF9DUlNfR2V0RnJlcUVycm9yTGltaXQKKyAqIEByZXR2YWwgQSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMjU1CisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DUlNfR2V0RnJlcUVycm9yTGltaXQodm9pZCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChDUlMtPkNGR1IsIENSU19DRkdSX0ZFTElNKSA+PiBDUlNfQ0ZHUl9GRUxJTV9Qb3MpOworfQorCisvKioKKyAqIEBicmllZiAgU2V0IGRpdmlzaW9uIGZhY3RvciBmb3IgU1lOQyBzaWduYWwKKyAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIFNZTkNESVYgICAgICAgTExfQ1JTX1NldFN5bmNEaXZpZGVyCisgKiBAcGFyYW0gIERpdmlkZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSU19TWU5DX0RJVl8xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUlNfU1lOQ19ESVZfMgorICogICAgICAgICBAYXJnIEByZWYgTExfQ1JTX1NZTkNfRElWXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSU19TWU5DX0RJVl84CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUlNfU1lOQ19ESVZfMTYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSU19TWU5DX0RJVl8zMgorICogICAgICAgICBAYXJnIEByZWYgTExfQ1JTX1NZTkNfRElWXzY0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUlNfU1lOQ19ESVZfMTI4CisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ1JTX1NldFN5bmNEaXZpZGVyKHVpbnQzMl90IERpdmlkZXIpIHsKKyAgTU9ESUZZX1JFRyhDUlMtPkNGR1IsIENSU19DRkdSX1NZTkNESVYsIERpdmlkZXIpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IGRpdmlzaW9uIGZhY3RvciBmb3IgU1lOQyBzaWduYWwKKyAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIFNZTkNESVYgICAgICAgTExfQ1JTX0dldFN5bmNEaXZpZGVyCisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUlNfU1lOQ19ESVZfMQorICogICAgICAgICBAYXJnIEByZWYgTExfQ1JTX1NZTkNfRElWXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSU19TWU5DX0RJVl80CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUlNfU1lOQ19ESVZfOAorICogICAgICAgICBAYXJnIEByZWYgTExfQ1JTX1NZTkNfRElWXzE2CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUlNfU1lOQ19ESVZfMzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSU19TWU5DX0RJVl82NAorICogICAgICAgICBAYXJnIEByZWYgTExfQ1JTX1NZTkNfRElWXzEyOAorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQ1JTX0dldFN5bmNEaXZpZGVyKHZvaWQpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQ1JTLT5DRkdSLCBDUlNfQ0ZHUl9TWU5DRElWKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBTZXQgU1lOQyBzaWduYWwgc291cmNlCisgKiBAcm10b2xsIENGR1IgICAgICAgICBTWU5DU1JDICAgICAgIExMX0NSU19TZXRTeW5jU2lnbmFsU291cmNlCisgKiBAcGFyYW0gIFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQ1JTX1NZTkNfU09VUkNFX0dQSU8KKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSU19TWU5DX1NPVVJDRV9MU0UKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSU19TWU5DX1NPVVJDRV9VU0IKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DUlNfU2V0U3luY1NpZ25hbFNvdXJjZSh1aW50MzJfdCBTb3VyY2UpIHsKKyAgTU9ESUZZX1JFRyhDUlMtPkNGR1IsIENSU19DRkdSX1NZTkNTUkMsIFNvdXJjZSk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgU1lOQyBzaWduYWwgc291cmNlCisgKiBAcm10b2xsIENGR1IgICAgICAgICBTWU5DU1JDICAgICAgIExMX0NSU19HZXRTeW5jU2lnbmFsU291cmNlCisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUlNfU1lOQ19TT1VSQ0VfR1BJTworICogICAgICAgICBAYXJnIEByZWYgTExfQ1JTX1NZTkNfU09VUkNFX0xTRQorICogICAgICAgICBAYXJnIEByZWYgTExfQ1JTX1NZTkNfU09VUkNFX1VTQgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQ1JTX0dldFN5bmNTaWduYWxTb3VyY2Uodm9pZCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChDUlMtPkNGR1IsIENSU19DRkdSX1NZTkNTUkMpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFNldCBpbnB1dCBwb2xhcml0eSBmb3IgdGhlIFNZTkMgc2lnbmFsIHNvdXJjZQorICogQHJtdG9sbCBDRkdSICAgICAgICAgU1lOQ1BPTCAgICAgICBMTF9DUlNfU2V0U3luY1BvbGFyaXR5CisgKiBAcGFyYW0gIFBvbGFyaXR5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUlNfU1lOQ19QT0xBUklUWV9SSVNJTkcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSU19TWU5DX1BPTEFSSVRZX0ZBTExJTkcKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DUlNfU2V0U3luY1BvbGFyaXR5KHVpbnQzMl90IFBvbGFyaXR5KSB7CisgIE1PRElGWV9SRUcoQ1JTLT5DRkdSLCBDUlNfQ0ZHUl9TWU5DUE9MLCBQb2xhcml0eSk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgaW5wdXQgcG9sYXJpdHkgZm9yIHRoZSBTWU5DIHNpZ25hbCBzb3VyY2UKKyAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIFNZTkNQT0wgICAgICAgTExfQ1JTX0dldFN5bmNQb2xhcml0eQorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfQ1JTX1NZTkNfUE9MQVJJVFlfUklTSU5HCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUlNfU1lOQ19QT0xBUklUWV9GQUxMSU5HCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DUlNfR2V0U3luY1BvbGFyaXR5KHZvaWQpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQ1JTLT5DRkdSLCBDUlNfQ0ZHUl9TWU5DUE9MKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBDb25maWd1cmUgQ1JTIGZvciB0aGUgc3luY2hyb25pemF0aW9uCisgKiBAcm10b2xsIENSICAgICAgICAgICBUUklNICAgICAgICAgIExMX0NSU19Db25maWdTeW5jaHJvbml6YXRpb25cbgorICogICAgICAgICBDRkdSICAgICAgICAgUkVMT0FEICAgICAgICBMTF9DUlNfQ29uZmlnU3luY2hyb25pemF0aW9uXG4KKyAqICAgICAgICAgQ0ZHUiAgICAgICAgIEZFTElNICAgICAgICAgTExfQ1JTX0NvbmZpZ1N5bmNocm9uaXphdGlvblxuCisgKiAgICAgICAgIENGR1IgICAgICAgICBTWU5DRElWICAgICAgIExMX0NSU19Db25maWdTeW5jaHJvbml6YXRpb25cbgorICogICAgICAgICBDRkdSICAgICAgICAgU1lOQ1NSQyAgICAgICBMTF9DUlNfQ29uZmlnU3luY2hyb25pemF0aW9uXG4KKyAqICAgICAgICAgQ0ZHUiAgICAgICAgIFNZTkNQT0wgICAgICAgTExfQ1JTX0NvbmZpZ1N5bmNocm9uaXphdGlvbgorICogQHBhcmFtICBIU0k0OENhbGlicmF0aW9uVmFsdWUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gNjMKKyAqIEBwYXJhbSAgRXJyb3JMaW1pdFZhbHVlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDB4RkZGRgorICogQHBhcmFtICBSZWxvYWRWYWx1ZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAyNTUKKyAqIEBwYXJhbSAgU2V0dGluZ3MgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUlNfU1lOQ19ESVZfMSBvciBAcmVmIExMX0NSU19TWU5DX0RJVl8yIG9yIEByZWYKKyAqIExMX0NSU19TWU5DX0RJVl80IG9yIEByZWYgTExfQ1JTX1NZTkNfRElWXzggb3IgQHJlZiBMTF9DUlNfU1lOQ19ESVZfMTYgb3IKKyAqIEByZWYgTExfQ1JTX1NZTkNfRElWXzMyIG9yIEByZWYgTExfQ1JTX1NZTkNfRElWXzY0IG9yIEByZWYKKyAqIExMX0NSU19TWU5DX0RJVl8xMjgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSU19TWU5DX1NPVVJDRV9HUElPIG9yIEByZWYgTExfQ1JTX1NZTkNfU09VUkNFX0xTRSBvcgorICogQHJlZiBMTF9DUlNfU1lOQ19TT1VSQ0VfVVNCCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUlNfU1lOQ19QT0xBUklUWV9SSVNJTkcgb3IgQHJlZgorICogTExfQ1JTX1NZTkNfUE9MQVJJVFlfRkFMTElORworICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0NSU19Db25maWdTeW5jaHJvbml6YXRpb24oCisgICAgdWludDMyX3QgSFNJNDhDYWxpYnJhdGlvblZhbHVlLCB1aW50MzJfdCBFcnJvckxpbWl0VmFsdWUsCisgICAgdWludDMyX3QgUmVsb2FkVmFsdWUsIHVpbnQzMl90IFNldHRpbmdzKSB7CisgIE1PRElGWV9SRUcoQ1JTLT5DUiwgQ1JTX0NSX1RSSU0sIEhTSTQ4Q2FsaWJyYXRpb25WYWx1ZSk7CisgIE1PRElGWV9SRUcoQ1JTLT5DRkdSLAorICAgICAgICAgICAgIENSU19DRkdSX1JFTE9BRCB8IENSU19DRkdSX0ZFTElNIHwgQ1JTX0NGR1JfU1lOQ0RJViB8CisgICAgICAgICAgICAgICAgIENSU19DRkdSX1NZTkNTUkMgfCBDUlNfQ0ZHUl9TWU5DUE9MLAorICAgICAgICAgICAgIFJlbG9hZFZhbHVlIHwgKEVycm9yTGltaXRWYWx1ZSA8PCBDUlNfQ0ZHUl9GRUxJTV9Qb3MpIHwgU2V0dGluZ3MpOworfQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBDUlNfTExfRUZfQ1JTX01hbmFnZW1lbnQgQ1JTX01hbmFnZW1lbnQKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgIEdlbmVyYXRlIHNvZnR3YXJlIFNZTkMgZXZlbnQKKyAqIEBybXRvbGwgQ1IgICAgICAgICAgIFNXU1lOQyAgICAgICAgTExfQ1JTX0dlbmVyYXRlRXZlbnRfU1dTWU5DCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ1JTX0dlbmVyYXRlRXZlbnRfU1dTWU5DKHZvaWQpIHsKKyAgU0VUX0JJVChDUlMtPkNSLCBDUlNfQ1JfU1dTWU5DKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCB0aGUgZnJlcXVlbmN5IGVycm9yIGRpcmVjdGlvbiBsYXRjaGVkIGluIHRoZSB0aW1lIG9mIHRoZSBsYXN0CisgKiBTWU5DIGV2ZW50CisgKiBAcm10b2xsIElTUiAgICAgICAgICBGRURJUiAgICAgICAgIExMX0NSU19HZXRGcmVxRXJyb3JEaXJlY3Rpb24KKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSU19GUkVRX0VSUk9SX0RJUl9VUAorICogICAgICAgICBAYXJnIEByZWYgTExfQ1JTX0ZSRVFfRVJST1JfRElSX0RPV04KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NSU19HZXRGcmVxRXJyb3JEaXJlY3Rpb24odm9pZCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChDUlMtPklTUiwgQ1JTX0lTUl9GRURJUikpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IHRoZSBmcmVxdWVuY3kgZXJyb3IgY291bnRlciB2YWx1ZSBsYXRjaGVkIGluIHRoZSB0aW1lIG9mIHRoZSBsYXN0CisgKiBTWU5DIGV2ZW50CisgKiBAcm10b2xsIElTUiAgICAgICAgICBGRUNBUCAgICAgICAgIExMX0NSU19HZXRGcmVxRXJyb3JDYXB0dXJlCisgKiBAcmV0dmFsIEEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAwMDAgYW5kIE1heF9EYXRhID0gMHhGRkZGCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DUlNfR2V0RnJlcUVycm9yQ2FwdHVyZSh2b2lkKSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKENSUy0+SVNSLCBDUlNfSVNSX0ZFQ0FQKSA+PiBDUlNfSVNSX0ZFQ0FQX1Bvcyk7Cit9CisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIENSU19MTF9FRl9GTEFHX01hbmFnZW1lbnQgRkxBR19NYW5hZ2VtZW50CisgKiBAeworICovCisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiBTWU5DIGV2ZW50IE9LIHNpZ25hbCBvY2N1cnJlZCBvciBub3QKKyAqIEBybXRvbGwgSVNSICAgICAgICAgIFNZTkNPS0YgICAgICAgTExfQ1JTX0lzQWN0aXZlRmxhZ19TWU5DT0sKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQ1JTX0lzQWN0aXZlRmxhZ19TWU5DT0sodm9pZCkgeworICByZXR1cm4gKChSRUFEX0JJVChDUlMtPklTUiwgQ1JTX0lTUl9TWU5DT0tGKSA9PSAoQ1JTX0lTUl9TWU5DT0tGKSkgPyAxVUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIFNZTkMgd2FybmluZyBzaWduYWwgb2NjdXJyZWQgb3Igbm90CisgKiBAcm10b2xsIElTUiAgICAgICAgICBTWU5DV0FSTkYgICAgIExMX0NSU19Jc0FjdGl2ZUZsYWdfU1lOQ1dBUk4KKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQ1JTX0lzQWN0aXZlRmxhZ19TWU5DV0FSTih2b2lkKSB7CisgIHJldHVybiAoKFJFQURfQklUKENSUy0+SVNSLCBDUlNfSVNSX1NZTkNXQVJORikgPT0gKENSU19JU1JfU1lOQ1dBUk5GKSkgPyAxVUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiBTeW5jaHJvbml6YXRpb24gb3IgdHJpbW1pbmcgZXJyb3Igc2lnbmFsIG9jY3VycmVkIG9yIG5vdAorICogQHJtdG9sbCBJU1IgICAgICAgICAgRVJSRiAgICAgICAgICBMTF9DUlNfSXNBY3RpdmVGbGFnX0VSUgorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DUlNfSXNBY3RpdmVGbGFnX0VSUih2b2lkKSB7CisgIHJldHVybiAoKFJFQURfQklUKENSUy0+SVNSLCBDUlNfSVNSX0VSUkYpID09IChDUlNfSVNSX0VSUkYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiBFeHBlY3RlZCBTWU5DIHNpZ25hbCBvY2N1cnJlZCBvciBub3QKKyAqIEBybXRvbGwgSVNSICAgICAgICAgIEVTWU5DRiAgICAgICAgTExfQ1JTX0lzQWN0aXZlRmxhZ19FU1lOQworICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DUlNfSXNBY3RpdmVGbGFnX0VTWU5DKHZvaWQpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoQ1JTLT5JU1IsIENSU19JU1JfRVNZTkNGKSA9PSAoQ1JTX0lTUl9FU1lOQ0YpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiBTWU5DIGVycm9yIHNpZ25hbCBvY2N1cnJlZCBvciBub3QKKyAqIEBybXRvbGwgSVNSICAgICAgICAgIFNZTkNFUlIgICAgICAgTExfQ1JTX0lzQWN0aXZlRmxhZ19TWU5DRVJSCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NSU19Jc0FjdGl2ZUZsYWdfU1lOQ0VSUih2b2lkKSB7CisgIHJldHVybiAoKFJFQURfQklUKENSUy0+SVNSLCBDUlNfSVNSX1NZTkNFUlIpID09IChDUlNfSVNSX1NZTkNFUlIpKSA/IDFVTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgU1lOQyBtaXNzZWQgZXJyb3Igc2lnbmFsIG9jY3VycmVkIG9yIG5vdAorICogQHJtdG9sbCBJU1IgICAgICAgICAgU1lOQ01JU1MgICAgICBMTF9DUlNfSXNBY3RpdmVGbGFnX1NZTkNNSVNTCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NSU19Jc0FjdGl2ZUZsYWdfU1lOQ01JU1Modm9pZCkgeworICByZXR1cm4gKChSRUFEX0JJVChDUlMtPklTUiwgQ1JTX0lTUl9TWU5DTUlTUykgPT0gKENSU19JU1JfU1lOQ01JU1MpKSA/IDFVTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiBUcmltbWluZyBvdmVyZmxvdyBvciB1bmRlcmZsb3cgb2NjdXJyZWQgb3Igbm90CisgKiBAcm10b2xsIElTUiAgICAgICAgICBUUklNT1ZGICAgICAgIExMX0NSU19Jc0FjdGl2ZUZsYWdfVFJJTU9WRgorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DUlNfSXNBY3RpdmVGbGFnX1RSSU1PVkYodm9pZCkgeworICByZXR1cm4gKChSRUFEX0JJVChDUlMtPklTUiwgQ1JTX0lTUl9UUklNT1ZGKSA9PSAoQ1JTX0lTUl9UUklNT1ZGKSkgPyAxVUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENsZWFyIHRoZSBTWU5DIGV2ZW50IE9LIGZsYWcKKyAqIEBybXRvbGwgSUNSICAgICAgICAgIFNZTkNPS0MgICAgICAgTExfQ1JTX0NsZWFyRmxhZ19TWU5DT0sKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DUlNfQ2xlYXJGbGFnX1NZTkNPSyh2b2lkKSB7CisgIFdSSVRFX1JFRyhDUlMtPklDUiwgQ1JTX0lDUl9TWU5DT0tDKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENsZWFyIHRoZSAgU1lOQyB3YXJuaW5nIGZsYWcKKyAqIEBybXRvbGwgSUNSICAgICAgICAgIFNZTkNXQVJOQyAgICAgTExfQ1JTX0NsZWFyRmxhZ19TWU5DV0FSTgorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0NSU19DbGVhckZsYWdfU1lOQ1dBUk4odm9pZCkgeworICBXUklURV9SRUcoQ1JTLT5JQ1IsIENSU19JQ1JfU1lOQ1dBUk5DKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENsZWFyIFRSSU1PVkYsIFNZTkNNSVNTIGFuZCBTWU5DRVJSIGJpdHMgYW5kIGNvbnNlcXVlbnRseSBhbHNvCisgKiB0aGUgRVJSIGZsYWcKKyAqIEBybXRvbGwgSUNSICAgICAgICAgIEVSUkMgICAgICAgICAgTExfQ1JTX0NsZWFyRmxhZ19FUlIKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DUlNfQ2xlYXJGbGFnX0VSUih2b2lkKSB7CisgIFdSSVRFX1JFRyhDUlMtPklDUiwgQ1JTX0lDUl9FUlJDKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENsZWFyIEV4cGVjdGVkIFNZTkMgZmxhZworICogQHJtdG9sbCBJQ1IgICAgICAgICAgRVNZTkNDICAgICAgICBMTF9DUlNfQ2xlYXJGbGFnX0VTWU5DCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ1JTX0NsZWFyRmxhZ19FU1lOQyh2b2lkKSB7CisgIFdSSVRFX1JFRyhDUlMtPklDUiwgQ1JTX0lDUl9FU1lOQ0MpOworfQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBDUlNfTExfRUZfSVRfTWFuYWdlbWVudCBJVF9NYW5hZ2VtZW50CisgKiBAeworICovCisKKy8qKgorICogQGJyaWVmICBFbmFibGUgU1lOQyBldmVudCBPSyBpbnRlcnJ1cHQKKyAqIEBybXRvbGwgQ1IgICAgICAgICAgIFNZTkNPS0lFICAgICAgTExfQ1JTX0VuYWJsZUlUX1NZTkNPSworICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0NSU19FbmFibGVJVF9TWU5DT0sodm9pZCkgeworICBTRVRfQklUKENSUy0+Q1IsIENSU19DUl9TWU5DT0tJRSk7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIFNZTkMgZXZlbnQgT0sgaW50ZXJydXB0CisgKiBAcm10b2xsIENSICAgICAgICAgICBTWU5DT0tJRSAgICAgIExMX0NSU19EaXNhYmxlSVRfU1lOQ09LCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ1JTX0Rpc2FibGVJVF9TWU5DT0sodm9pZCkgeworICBDTEVBUl9CSVQoQ1JTLT5DUiwgQ1JTX0NSX1NZTkNPS0lFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIFNZTkMgZXZlbnQgT0sgaW50ZXJydXB0IGlzIGVuYWJsZWQgb3Igbm90CisgKiBAcm10b2xsIENSICAgICAgICAgICBTWU5DT0tJRSAgICAgIExMX0NSU19Jc0VuYWJsZWRJVF9TWU5DT0sKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQ1JTX0lzRW5hYmxlZElUX1NZTkNPSyh2b2lkKSB7CisgIHJldHVybiAoKFJFQURfQklUKENSUy0+Q1IsIENSU19DUl9TWU5DT0tJRSkgPT0gKENSU19DUl9TWU5DT0tJRSkpID8gMVVMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBTWU5DIHdhcm5pbmcgaW50ZXJydXB0CisgKiBAcm10b2xsIENSICAgICAgICAgICBTWU5DV0FSTklFICAgIExMX0NSU19FbmFibGVJVF9TWU5DV0FSTgorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0NSU19FbmFibGVJVF9TWU5DV0FSTih2b2lkKSB7CisgIFNFVF9CSVQoQ1JTLT5DUiwgQ1JTX0NSX1NZTkNXQVJOSUUpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBTWU5DIHdhcm5pbmcgaW50ZXJydXB0CisgKiBAcm10b2xsIENSICAgICAgICAgICBTWU5DV0FSTklFICAgIExMX0NSU19EaXNhYmxlSVRfU1lOQ1dBUk4KKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DUlNfRGlzYWJsZUlUX1NZTkNXQVJOKHZvaWQpIHsKKyAgQ0xFQVJfQklUKENSUy0+Q1IsIENSU19DUl9TWU5DV0FSTklFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIFNZTkMgd2FybmluZyBpbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBub3QKKyAqIEBybXRvbGwgQ1IgICAgICAgICAgIFNZTkNXQVJOSUUgICAgTExfQ1JTX0lzRW5hYmxlZElUX1NZTkNXQVJOCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NSU19Jc0VuYWJsZWRJVF9TWU5DV0FSTih2b2lkKSB7CisgIHJldHVybiAoKFJFQURfQklUKENSUy0+Q1IsIENSU19DUl9TWU5DV0FSTklFKSA9PSAoQ1JTX0NSX1NZTkNXQVJOSUUpKSA/IDFVTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIFN5bmNocm9uaXphdGlvbiBvciB0cmltbWluZyBlcnJvciBpbnRlcnJ1cHQKKyAqIEBybXRvbGwgQ1IgICAgICAgICAgIEVSUklFICAgICAgICAgTExfQ1JTX0VuYWJsZUlUX0VSUgorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0NSU19FbmFibGVJVF9FUlIodm9pZCkgeworICBTRVRfQklUKENSUy0+Q1IsIENSU19DUl9FUlJJRSk7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIFN5bmNocm9uaXphdGlvbiBvciB0cmltbWluZyBlcnJvciBpbnRlcnJ1cHQKKyAqIEBybXRvbGwgQ1IgICAgICAgICAgIEVSUklFICAgICAgICAgTExfQ1JTX0Rpc2FibGVJVF9FUlIKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DUlNfRGlzYWJsZUlUX0VSUih2b2lkKSB7CisgIENMRUFSX0JJVChDUlMtPkNSLCBDUlNfQ1JfRVJSSUUpOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgU3luY2hyb25pemF0aW9uIG9yIHRyaW1taW5nIGVycm9yIGludGVycnVwdCBpcyBlbmFibGVkIG9yCisgKiBub3QKKyAqIEBybXRvbGwgQ1IgICAgICAgICAgIEVSUklFICAgICAgICAgTExfQ1JTX0lzRW5hYmxlZElUX0VSUgorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DUlNfSXNFbmFibGVkSVRfRVJSKHZvaWQpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoQ1JTLT5DUiwgQ1JTX0NSX0VSUklFKSA9PSAoQ1JTX0NSX0VSUklFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIEV4cGVjdGVkIFNZTkMgaW50ZXJydXB0CisgKiBAcm10b2xsIENSICAgICAgICAgICBFU1lOQ0lFICAgICAgIExMX0NSU19FbmFibGVJVF9FU1lOQworICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0NSU19FbmFibGVJVF9FU1lOQyh2b2lkKSB7CisgIFNFVF9CSVQoQ1JTLT5DUiwgQ1JTX0NSX0VTWU5DSUUpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBFeHBlY3RlZCBTWU5DIGludGVycnVwdAorICogQHJtdG9sbCBDUiAgICAgICAgICAgRVNZTkNJRSAgICAgICBMTF9DUlNfRGlzYWJsZUlUX0VTWU5DCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ1JTX0Rpc2FibGVJVF9FU1lOQyh2b2lkKSB7CisgIENMRUFSX0JJVChDUlMtPkNSLCBDUlNfQ1JfRVNZTkNJRSk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiBFeHBlY3RlZCBTWU5DIGludGVycnVwdCBpcyBlbmFibGVkIG9yIG5vdAorICogQHJtdG9sbCBDUiAgICAgICAgICAgRVNZTkNJRSAgICAgICBMTF9DUlNfSXNFbmFibGVkSVRfRVNZTkMKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQ1JTX0lzRW5hYmxlZElUX0VTWU5DKHZvaWQpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoQ1JTLT5DUiwgQ1JTX0NSX0VTWU5DSUUpID09IChDUlNfQ1JfRVNZTkNJRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgKiBAfQorICovCisKKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgQ1JTX0xMX0VGX0luaXQgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICogQHsKKyAqLworCitFcnJvclN0YXR1cyBMTF9DUlNfRGVJbml0KHZvaWQpOworCisvKioKKyAqIEB9CisgKi8KKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisjZW5kaWYgLyogZGVmaW5lZChDUlMpICovCisKKy8qKgorICogQH0KKyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19TVE0zMkc0eHhfTExfQ1JTX0ggKi8KZGlmZiAtLWdpdCBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9JbmMvc3RtMzJnNHh4X2xsX2RtYS5oIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfbGxfZG1hLmgKaW5kZXggMDY1ZWIyOC4uYjE0ZTUwOCAxMDA2NDQKLS0tIGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfbGxfZG1hLmgKKysrIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfbGxfZG1hLmgKQEAgLTEsMjgyMCArMSwyODIwIEBACi0vKioNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQGZpbGUgICAgc3RtMzJnNHh4X2xsX2RtYS5oDQotICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0NCi0gKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBETUEgTEwgbW9kdWxlLg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBAYXR0ZW50aW9uDQotICoNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQotICoNCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRlcm1zIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUNCi0gKiBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb2Z0d2FyZSBjb21wb25lbnQuDQotICogSWYgbm8gTElDRU5TRSBmaWxlIGNvbWVzIHdpdGggdGhpcyBzb2Z0d2FyZSwgaXQgaXMgcHJvdmlkZWQgQVMtSVMuDQotICoNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICovDQotDQotLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaWZuZGVmIF9fU1RNMzJHNHh4X0xMX0RNQV9IDQotI2RlZmluZSBfX1NUTTMyRzR4eF9MTF9ETUFfSA0KLQ0KLSNpZmRlZiBfX2NwbHVzcGx1cw0KLWV4dGVybiAiQyIgew0KLSNlbmRpZg0KLQ0KLS8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotI2luY2x1ZGUgInN0bTMyZzR4eC5oIg0KLSNpbmNsdWRlICJzdG0zMmc0eHhfbGxfZG1hbXV4LmgiDQotDQotLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzR4eF9MTF9Ecml2ZXINCi0gKiBAew0KLSAqLw0KLQ0KLSNpZiBkZWZpbmVkKERNQTEpIHx8IGRlZmluZWQoRE1BMikNCi0NCi0vKiogQGRlZmdyb3VwIERNQV9MTCBETUENCi0gKiBAew0KLSAqLw0KLQ0KLS8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGRlZmdyb3VwIERNQV9MTF9Qcml2YXRlX1ZhcmlhYmxlcyBETUEgUHJpdmF0ZSBWYXJpYWJsZXMNCi0gKiBAew0KLSAqLw0KLS8qIEFycmF5IHVzZWQgdG8gZ2V0IHRoZSBETUEgY2hhbm5lbCByZWdpc3RlciBvZmZzZXQgdmVyc3VzIGNoYW5uZWwgaW5kZXgNCi0gKiBMTF9ETUFfQ0hBTk5FTF94ICovDQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgQ0hBTk5FTF9PRkZTRVRfVEFCW10gPSB7DQotICAgICh1aW50OF90KShETUExX0NoYW5uZWwxX0JBU0UgLSBETUExX0JBU0UpLA0KLSAgICAodWludDhfdCkoRE1BMV9DaGFubmVsMl9CQVNFIC0gRE1BMV9CQVNFKSwNCi0gICAgKHVpbnQ4X3QpKERNQTFfQ2hhbm5lbDNfQkFTRSAtIERNQTFfQkFTRSksDQotICAgICh1aW50OF90KShETUExX0NoYW5uZWw0X0JBU0UgLSBETUExX0JBU0UpLA0KLSAgICAodWludDhfdCkoRE1BMV9DaGFubmVsNV9CQVNFIC0gRE1BMV9CQVNFKSwNCi0gICAgKHVpbnQ4X3QpKERNQTFfQ2hhbm5lbDZfQkFTRSAtIERNQTFfQkFTRSkNCi0jaWYgZGVmaW5lZChETUExX0NoYW5uZWw3KQ0KLSAgICAgICAgLA0KLSAgICAodWludDhfdCkoRE1BMV9DaGFubmVsN19CQVNFIC0gRE1BMV9CQVNFKQ0KLSNlbmRpZiAvKiBETUExX0NoYW5uZWw3ICovDQotI2lmIGRlZmluZWQoRE1BMV9DaGFubmVsOCkNCi0gICAgICAgICwNCi0gICAgKHVpbnQ4X3QpKERNQTFfQ2hhbm5lbDhfQkFTRSAtIERNQTFfQkFTRSkNCi0jZW5kaWYgLyogRE1BMV9DaGFubmVsOCAqLw0KLX07DQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgRE1BX0xMX1ByaXZhdGVfQ29uc3RhbnRzIERNQSBQcml2YXRlIENvbnN0YW50cw0KLSAqIEB7DQotICovDQotLyogRGVmaW5lIHVzZWQgdG8gZ2V0IENTRUxSIHJlZ2lzdGVyIG9mZnNldCAqLw0KLSNkZWZpbmUgRE1BX0NTRUxSX09GRlNFVCAodWludDMyX3QpKERNQTFfQ1NFTFJfQkFTRSAtIERNQTFfQkFTRSkNCi0NCi0vKiBEZWZpbmVzIHVzZWQgZm9yIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIHJlZ2lzdGVyIGFuZCBwZXJmb3JtIG9mZnNldHMgKi8NCi0jZGVmaW5lIERNQV9QT1NJVElPTl9DU0VMUl9DWFMgXA0KLSAgUE9TSVRJT05fVkFMKERNQV9DU0VMUl9DMVMgPDwgKChDaGFubmVsIC0gMVUpICogNFUpKQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpDQotLyoqIEBkZWZncm91cCBETUFfTExfUHJpdmF0ZV9NYWNyb3MgRE1BIFByaXZhdGUgTWFjcm9zDQotICogQHsNCi0gKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLSNlbmRpZiAvKlVTRV9GVUxMX0xMX0RSSVZFUiovDQotDQotLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpDQotLyoqIEBkZWZncm91cCBETUFfTExfRVNfSU5JVCBETUEgRXhwb3J0ZWQgSW5pdCBzdHJ1Y3R1cmUNCi0gKiBAew0KLSAqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gIHVpbnQzMl90DQotICAgICAgUGVyaXBoT3JNMk1TcmNBZGRyZXNzOyAvKiE8IFNwZWNpZmllcyB0aGUgcGVyaXBoZXJhbCBiYXNlIGFkZHJlc3MgZm9yIERNQQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXIgb3IgYXMgU291cmNlIGJhc2UgYWRkcmVzcyBpbiBjYXNlIG9mDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnkgdG8gbWVtb3J5IHRyYW5zZmVyIGRpcmVjdGlvbi4NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAweEZGRkZGRkZGLiAqLw0KLQ0KLSAgdWludDMyX3QNCi0gICAgICBNZW1vcnlPck0yTURzdEFkZHJlc3M7IC8qITwgU3BlY2lmaWVzIHRoZSBtZW1vcnkgYmFzZSBhZGRyZXNzIGZvciBETUENCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyIG9yIGFzIERlc3RpbmF0aW9uIGJhc2UgYWRkcmVzcyBpbiBjYXNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBtZW1vcnkgdG8gbWVtb3J5IHRyYW5zZmVyIGRpcmVjdGlvbi4NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAweEZGRkZGRkZGLiAqLw0KLQ0KLSAgdWludDMyX3QgRGlyZWN0aW9uOyAvKiE8IFNwZWNpZmllcyBpZiB0aGUgZGF0YSB3aWxsIGJlIHRyYW5zZmVycmVkIGZyb20gbWVtb3J5DQotICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHBlcmlwaGVyYWwsIGZyb20gbWVtb3J5IHRvIG1lbW9yeSBvciBmcm9tIHBlcmlwaGVyYWwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgdG8gbWVtb3J5LiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgIERNQV9MTF9FQ19ESVJFQ1RJT04NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBAcmVmIExMX0RNQV9TZXREYXRhVHJhbnNmZXJEaXJlY3Rpb24oKS4gKi8NCi0NCi0gIHVpbnQzMl90IE1vZGU7IC8qITwgU3BlY2lmaWVzIHRoZSBub3JtYWwgb3IgY2lyY3VsYXIgb3BlcmF0aW9uIG1vZGUuDQotICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRE1BX0xMX0VDX01PREUNCi0gICAgICAgICAgICAgICAgICAgICAgQG5vdGU6IFRoZSBjaXJjdWxhciBidWZmZXIgbW9kZSBjYW5ub3QgYmUgdXNlZCBpZiB0aGUNCi0gICAgICAgICAgICAgICAgICAgIG1lbW9yeSB0byBtZW1vcnkgZGF0YSB0cmFuc2ZlciBkaXJlY3Rpb24gaXMgY29uZmlndXJlZCBvbg0KLSAgICAgICAgICAgICAgICAgICAgdGhlIHNlbGVjdGVkIENoYW5uZWwNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkNCi0gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEByZWYgTExfRE1BX1NldE1vZGUoKS4gKi8NCi0NCi0gIHVpbnQzMl90IFBlcmlwaE9yTTJNU3JjSW5jTW9kZTsgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgUGVyaXBoZXJhbCBhZGRyZXNzDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIFNvdXJjZSBhZGRyZXNzIGluIGNhc2Ugb2YgbWVtb3J5IHRvDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSB0cmFuc2ZlciBkaXJlY3Rpb24gaXMgaW5jcmVtZW50ZWQgb3INCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90LiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERNQV9MTF9FQ19QRVJJUEgNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX0RNQV9TZXRQZXJpcGhJbmNNb2RlKCkuICovDQotDQotICB1aW50MzJfdCBNZW1vcnlPck0yTURzdEluY01vZGU7IC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIE1lbW9yeSBhZGRyZXNzIG9yDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc3RpbmF0aW9uIGFkZHJlc3MgaW4gY2FzZSBvZiBtZW1vcnkgdG8NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5IHRyYW5zZmVyIGRpcmVjdGlvbiBpcyBpbmNyZW1lbnRlZCBvcg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE1BX0xMX0VDX01FTU9SWQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfRE1BX1NldE1lbW9yeUluY01vZGUoKS4gKi8NCi0NCi0gIHVpbnQzMl90DQotICAgICAgUGVyaXBoT3JNMk1TcmNEYXRhU2l6ZTsgLyohPCBTcGVjaWZpZXMgdGhlIFBlcmlwaGVyYWwgZGF0YSBzaXplIGFsaWdubWVudA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIFNvdXJjZSBkYXRhIHNpemUgYWxpZ25tZW50IChieXRlLCBoYWxmIHdvcmQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZCkgaW4gY2FzZSBvZiBtZW1vcnkgdG8gbWVtb3J5IHRyYW5zZmVyDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgRE1BX0xMX0VDX1BEQVRBQUxJR04NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9ETUFfU2V0UGVyaXBoU2l6ZSgpLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLQ0KLSAgdWludDMyX3QNCi0gICAgICBNZW1vcnlPck0yTURzdERhdGFTaXplOyAvKiE8IFNwZWNpZmllcyB0aGUgTWVtb3J5IGRhdGEgc2l6ZSBhbGlnbm1lbnQgb3INCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXN0aW5hdGlvbiBkYXRhIHNpemUgYWxpZ25tZW50IChieXRlLCBoYWxmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZCwgd29yZCkgaW4gY2FzZSBvZiBtZW1vcnkgdG8gbWVtb3J5DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXIgZGlyZWN0aW9uLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIG9mIEByZWYgRE1BX0xMX0VDX01EQVRBQUxJR04NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9ETUFfU2V0TWVtb3J5U2l6ZSgpLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLQ0KLSAgdWludDMyX3QNCi0gICAgICBOYkRhdGE7IC8qITwgU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgZGF0YSB0byB0cmFuc2ZlciwgaW4gZGF0YSB1bml0Lg0KLSAgICAgICAgICAgICAgICAgICBUaGUgZGF0YSB1bml0IGlzIGVxdWFsIHRvIHRoZSBzb3VyY2UgYnVmZmVyIGNvbmZpZ3VyYXRpb24gc2V0DQotICAgICAgICAgICAgICAgICBpbiBQZXJpcGhlcmFsU2l6ZSBvciBNZW1vcnlTaXplIHBhcmFtZXRlcnMgZGVwZW5kaW5nIGluIHRoZQ0KLSAgICAgICAgICAgICAgICAgdHJhbnNmZXIgZGlyZWN0aW9uLiBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2Vlbg0KLSAgICAgICAgICAgICAgICAgTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDB4MDAwMEZGRkYNCi0NCi0gICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkNCi0gICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEByZWYgTExfRE1BX1NldERhdGFMZW5ndGgoKS4gKi8NCi0NCi0gIHVpbnQzMl90IFBlcmlwaFJlcXVlc3Q7IC8qITwgU3BlY2lmaWVzIHRoZSBwZXJpcGhlcmFsIHJlcXVlc3QuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIERNQU1VWF9MTF9FQ19SRVFVRVNUDQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0RNQV9TZXRQZXJpcGhSZXF1ZXN0KCkuICovDQotDQotICB1aW50MzJfdA0KLSAgICAgIFByaW9yaXR5OyAvKiE8IFNwZWNpZmllcyB0aGUgY2hhbm5lbCBwcmlvcml0eSBsZXZlbC4NCi0gICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIERNQV9MTF9FQ19QUklPUklUWQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5DQotICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEByZWYgTExfRE1BX1NldENoYW5uZWxQcmlvcml0eUxldmVsKCkuICovDQotDQotfSBMTF9ETUFfSW5pdFR5cGVEZWY7DQotLyoqDQotICogQH0NCi0gKi8NCi0jZW5kaWYgLypVU0VfRlVMTF9MTF9EUklWRVIqLw0KLQ0KLS8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBkZWZncm91cCBETUFfTExfRXhwb3J0ZWRfQ29uc3RhbnRzIERNQSBFeHBvcnRlZCBDb25zdGFudHMNCi0gKiBAew0KLSAqLw0KLS8qKiBAZGVmZ3JvdXAgRE1BX0xMX0VDX0NMRUFSX0ZMQUcgQ2xlYXIgRmxhZ3MgRGVmaW5lcw0KLSAqIEBicmllZiAgICBGbGFncyBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfRE1BX1dyaXRlUmVnIGZ1bmN0aW9uDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX0RNQV9JRkNSX0NHSUYxIFwNCi0gIERNQV9JRkNSX0NHSUYxIC8qITwgQ2hhbm5lbCAxIGdsb2JhbCBmbGFnICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX0RNQV9JRkNSX0NUQ0lGMSBcDQotICBETUFfSUZDUl9DVENJRjEgLyohPCBDaGFubmVsIDEgdHJhbnNmZXIgY29tcGxldGUgZmxhZyAqLw0KLSNkZWZpbmUgTExfRE1BX0lGQ1JfQ0hUSUYxIFwNCi0gIERNQV9JRkNSX0NIVElGMSAvKiE8IENoYW5uZWwgMSBoYWxmIHRyYW5zZmVyIGZsYWcgICAgICovDQotI2RlZmluZSBMTF9ETUFfSUZDUl9DVEVJRjEgXA0KLSAgRE1BX0lGQ1JfQ1RFSUYxIC8qITwgQ2hhbm5lbCAxIHRyYW5zZmVyIGVycm9yIGZsYWcgICAgKi8NCi0jZGVmaW5lIExMX0RNQV9JRkNSX0NHSUYyIFwNCi0gIERNQV9JRkNSX0NHSUYyIC8qITwgQ2hhbm5lbCAyIGdsb2JhbCBmbGFnICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX0RNQV9JRkNSX0NUQ0lGMiBcDQotICBETUFfSUZDUl9DVENJRjIgLyohPCBDaGFubmVsIDIgdHJhbnNmZXIgY29tcGxldGUgZmxhZyAqLw0KLSNkZWZpbmUgTExfRE1BX0lGQ1JfQ0hUSUYyIFwNCi0gIERNQV9JRkNSX0NIVElGMiAvKiE8IENoYW5uZWwgMiBoYWxmIHRyYW5zZmVyIGZsYWcgICAgICovDQotI2RlZmluZSBMTF9ETUFfSUZDUl9DVEVJRjIgXA0KLSAgRE1BX0lGQ1JfQ1RFSUYyIC8qITwgQ2hhbm5lbCAyIHRyYW5zZmVyIGVycm9yIGZsYWcgICAgKi8NCi0jZGVmaW5lIExMX0RNQV9JRkNSX0NHSUYzIFwNCi0gIERNQV9JRkNSX0NHSUYzIC8qITwgQ2hhbm5lbCAzIGdsb2JhbCBmbGFnICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX0RNQV9JRkNSX0NUQ0lGMyBcDQotICBETUFfSUZDUl9DVENJRjMgLyohPCBDaGFubmVsIDMgdHJhbnNmZXIgY29tcGxldGUgZmxhZyAqLw0KLSNkZWZpbmUgTExfRE1BX0lGQ1JfQ0hUSUYzIFwNCi0gIERNQV9JRkNSX0NIVElGMyAvKiE8IENoYW5uZWwgMyBoYWxmIHRyYW5zZmVyIGZsYWcgICAgICovDQotI2RlZmluZSBMTF9ETUFfSUZDUl9DVEVJRjMgXA0KLSAgRE1BX0lGQ1JfQ1RFSUYzIC8qITwgQ2hhbm5lbCAzIHRyYW5zZmVyIGVycm9yIGZsYWcgICAgKi8NCi0jZGVmaW5lIExMX0RNQV9JRkNSX0NHSUY0IFwNCi0gIERNQV9JRkNSX0NHSUY0IC8qITwgQ2hhbm5lbCA0IGdsb2JhbCBmbGFnICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX0RNQV9JRkNSX0NUQ0lGNCBcDQotICBETUFfSUZDUl9DVENJRjQgLyohPCBDaGFubmVsIDQgdHJhbnNmZXIgY29tcGxldGUgZmxhZyAqLw0KLSNkZWZpbmUgTExfRE1BX0lGQ1JfQ0hUSUY0IFwNCi0gIERNQV9JRkNSX0NIVElGNCAvKiE8IENoYW5uZWwgNCBoYWxmIHRyYW5zZmVyIGZsYWcgICAgICovDQotI2RlZmluZSBMTF9ETUFfSUZDUl9DVEVJRjQgXA0KLSAgRE1BX0lGQ1JfQ1RFSUY0IC8qITwgQ2hhbm5lbCA0IHRyYW5zZmVyIGVycm9yIGZsYWcgICAgKi8NCi0jZGVmaW5lIExMX0RNQV9JRkNSX0NHSUY1IFwNCi0gIERNQV9JRkNSX0NHSUY1IC8qITwgQ2hhbm5lbCA1IGdsb2JhbCBmbGFnICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX0RNQV9JRkNSX0NUQ0lGNSBcDQotICBETUFfSUZDUl9DVENJRjUgLyohPCBDaGFubmVsIDUgdHJhbnNmZXIgY29tcGxldGUgZmxhZyAqLw0KLSNkZWZpbmUgTExfRE1BX0lGQ1JfQ0hUSUY1IFwNCi0gIERNQV9JRkNSX0NIVElGNSAvKiE8IENoYW5uZWwgNSBoYWxmIHRyYW5zZmVyIGZsYWcgICAgICovDQotI2RlZmluZSBMTF9ETUFfSUZDUl9DVEVJRjUgXA0KLSAgRE1BX0lGQ1JfQ1RFSUY1IC8qITwgQ2hhbm5lbCA1IHRyYW5zZmVyIGVycm9yIGZsYWcgICAgKi8NCi0jZGVmaW5lIExMX0RNQV9JRkNSX0NHSUY2IFwNCi0gIERNQV9JRkNSX0NHSUY2IC8qITwgQ2hhbm5lbCA2IGdsb2JhbCBmbGFnICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX0RNQV9JRkNSX0NUQ0lGNiBcDQotICBETUFfSUZDUl9DVENJRjYgLyohPCBDaGFubmVsIDYgdHJhbnNmZXIgY29tcGxldGUgZmxhZyAqLw0KLSNkZWZpbmUgTExfRE1BX0lGQ1JfQ0hUSUY2IFwNCi0gIERNQV9JRkNSX0NIVElGNiAvKiE8IENoYW5uZWwgNiBoYWxmIHRyYW5zZmVyIGZsYWcgICAgICovDQotI2RlZmluZSBMTF9ETUFfSUZDUl9DVEVJRjYgXA0KLSAgRE1BX0lGQ1JfQ1RFSUY2IC8qITwgQ2hhbm5lbCA2IHRyYW5zZmVyIGVycm9yIGZsYWcgICAgKi8NCi0jaWYgZGVmaW5lZChETUExX0NoYW5uZWw3KQ0KLSNkZWZpbmUgTExfRE1BX0lGQ1JfQ0dJRjcgXA0KLSAgRE1BX0lGQ1JfQ0dJRjcgLyohPCBDaGFubmVsIDcgZ2xvYmFsIGZsYWcgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfRE1BX0lGQ1JfQ1RDSUY3IFwNCi0gIERNQV9JRkNSX0NUQ0lGNyAvKiE8IENoYW5uZWwgNyB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnICovDQotI2RlZmluZSBMTF9ETUFfSUZDUl9DSFRJRjcgXA0KLSAgRE1BX0lGQ1JfQ0hUSUY3IC8qITwgQ2hhbm5lbCA3IGhhbGYgdHJhbnNmZXIgZmxhZyAgICAgKi8NCi0jZGVmaW5lIExMX0RNQV9JRkNSX0NURUlGNyBcDQotICBETUFfSUZDUl9DVEVJRjcgLyohPCBDaGFubmVsIDcgdHJhbnNmZXIgZXJyb3IgZmxhZyAgICAqLw0KLSNlbmRpZiAgICAgICAgICAgIC8qIERNQTFfQ2hhbm5lbDcgKi8NCi0jaWYgZGVmaW5lZChETUExX0NoYW5uZWw4KQ0KLSNkZWZpbmUgTExfRE1BX0lGQ1JfQ0dJRjggXA0KLSAgRE1BX0lGQ1JfQ0dJRjggLyohPCBDaGFubmVsIDggZ2xvYmFsIGZsYWcgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfRE1BX0lGQ1JfQ1RDSUY4IFwNCi0gIERNQV9JRkNSX0NUQ0lGOCAvKiE8IENoYW5uZWwgOCB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnICovDQotI2RlZmluZSBMTF9ETUFfSUZDUl9DSFRJRjggXA0KLSAgRE1BX0lGQ1JfQ0hUSUY4IC8qITwgQ2hhbm5lbCA4IGhhbGYgdHJhbnNmZXIgZmxhZyAgICAgKi8NCi0jZGVmaW5lIExMX0RNQV9JRkNSX0NURUlGOCBcDQotICBETUFfSUZDUl9DVEVJRjggLyohPCBDaGFubmVsIDggdHJhbnNmZXIgZXJyb3IgZmxhZyAgICAqLw0KLSNlbmRpZiAgICAgICAgICAgIC8qIERNQTFfQ2hhbm5lbDggKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRE1BX0xMX0VDX0dFVF9GTEFHIEdldCBGbGFncyBEZWZpbmVzDQotICogQGJyaWVmICAgIEZsYWdzIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9ETUFfUmVhZFJlZyBmdW5jdGlvbg0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9ETUFfSVNSX0dJRjEgRE1BX0lTUl9HSUYxIC8qITwgQ2hhbm5lbCAxIGdsb2JhbCBmbGFnICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX0RNQV9JU1JfVENJRjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIERNQV9JU1JfVENJRjEgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENoYW5uZWwgMSB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX0RNQV9JU1JfSFRJRjEgRE1BX0lTUl9IVElGMSAvKiE8IENoYW5uZWwgMSBoYWxmIHRyYW5zZmVyIGZsYWcgKi8NCi0jZGVmaW5lIExMX0RNQV9JU1JfVEVJRjEgRE1BX0lTUl9URUlGMSAvKiE8IENoYW5uZWwgMSB0cmFuc2ZlciBlcnJvciBmbGFnICovDQotI2RlZmluZSBMTF9ETUFfSVNSX0dJRjIgRE1BX0lTUl9HSUYyICAgLyohPCBDaGFubmVsIDIgZ2xvYmFsIGZsYWcgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfRE1BX0lTUl9UQ0lGMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgRE1BX0lTUl9UQ0lGMiAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2hhbm5lbCAyIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfRE1BX0lTUl9IVElGMiBETUFfSVNSX0hUSUYyIC8qITwgQ2hhbm5lbCAyIGhhbGYgdHJhbnNmZXIgZmxhZyAqLw0KLSNkZWZpbmUgTExfRE1BX0lTUl9URUlGMiBETUFfSVNSX1RFSUYyIC8qITwgQ2hhbm5lbCAyIHRyYW5zZmVyIGVycm9yIGZsYWcgKi8NCi0jZGVmaW5lIExMX0RNQV9JU1JfR0lGMyBETUFfSVNSX0dJRjMgICAvKiE8IENoYW5uZWwgMyBnbG9iYWwgZmxhZyAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9ETUFfSVNSX1RDSUYzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBETUFfSVNSX1RDSUYzICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDaGFubmVsIDMgdHJhbnNmZXIgY29tcGxldGUgZmxhZyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9ETUFfSVNSX0hUSUYzIERNQV9JU1JfSFRJRjMgLyohPCBDaGFubmVsIDMgaGFsZiB0cmFuc2ZlciBmbGFnICovDQotI2RlZmluZSBMTF9ETUFfSVNSX1RFSUYzIERNQV9JU1JfVEVJRjMgLyohPCBDaGFubmVsIDMgdHJhbnNmZXIgZXJyb3IgZmxhZyAqLw0KLSNkZWZpbmUgTExfRE1BX0lTUl9HSUY0IERNQV9JU1JfR0lGNCAgIC8qITwgQ2hhbm5lbCA0IGdsb2JhbCBmbGFnICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX0RNQV9JU1JfVENJRjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIERNQV9JU1JfVENJRjQgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENoYW5uZWwgNCB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX0RNQV9JU1JfSFRJRjQgRE1BX0lTUl9IVElGNCAvKiE8IENoYW5uZWwgNCBoYWxmIHRyYW5zZmVyIGZsYWcgKi8NCi0jZGVmaW5lIExMX0RNQV9JU1JfVEVJRjQgRE1BX0lTUl9URUlGNCAvKiE8IENoYW5uZWwgNCB0cmFuc2ZlciBlcnJvciBmbGFnICovDQotI2RlZmluZSBMTF9ETUFfSVNSX0dJRjUgRE1BX0lTUl9HSUY1ICAgLyohPCBDaGFubmVsIDUgZ2xvYmFsIGZsYWcgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfRE1BX0lTUl9UQ0lGNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgRE1BX0lTUl9UQ0lGNSAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2hhbm5lbCA1IHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfRE1BX0lTUl9IVElGNSBETUFfSVNSX0hUSUY1IC8qITwgQ2hhbm5lbCA1IGhhbGYgdHJhbnNmZXIgZmxhZyAqLw0KLSNkZWZpbmUgTExfRE1BX0lTUl9URUlGNSBETUFfSVNSX1RFSUY1IC8qITwgQ2hhbm5lbCA1IHRyYW5zZmVyIGVycm9yIGZsYWcgKi8NCi0jZGVmaW5lIExMX0RNQV9JU1JfR0lGNiBETUFfSVNSX0dJRjYgICAvKiE8IENoYW5uZWwgNiBnbG9iYWwgZmxhZyAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9ETUFfSVNSX1RDSUY2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBETUFfSVNSX1RDSUY2ICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDaGFubmVsIDYgdHJhbnNmZXIgY29tcGxldGUgZmxhZyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9ETUFfSVNSX0hUSUY2IERNQV9JU1JfSFRJRjYgLyohPCBDaGFubmVsIDYgaGFsZiB0cmFuc2ZlciBmbGFnICovDQotI2RlZmluZSBMTF9ETUFfSVNSX1RFSUY2IERNQV9JU1JfVEVJRjYgLyohPCBDaGFubmVsIDYgdHJhbnNmZXIgZXJyb3IgZmxhZyAqLw0KLSNpZiBkZWZpbmVkKERNQTFfQ2hhbm5lbDcpDQotI2RlZmluZSBMTF9ETUFfSVNSX0dJRjcgRE1BX0lTUl9HSUY3IC8qITwgQ2hhbm5lbCA3IGdsb2JhbCBmbGFnICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX0RNQV9JU1JfVENJRjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIERNQV9JU1JfVENJRjcgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENoYW5uZWwgNyB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX0RNQV9JU1JfSFRJRjcgRE1BX0lTUl9IVElGNyAvKiE8IENoYW5uZWwgNyBoYWxmIHRyYW5zZmVyIGZsYWcgKi8NCi0jZGVmaW5lIExMX0RNQV9JU1JfVEVJRjcgRE1BX0lTUl9URUlGNyAvKiE8IENoYW5uZWwgNyB0cmFuc2ZlciBlcnJvciBmbGFnICovDQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRE1BMV9DaGFubmVsNyAqLw0KLSNpZiBkZWZpbmVkKERNQTFfQ2hhbm5lbDgpDQotI2RlZmluZSBMTF9ETUFfSVNSX0dJRjggRE1BX0lTUl9HSUY4IC8qITwgQ2hhbm5lbCA4IGdsb2JhbCBmbGFnICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX0RNQV9JU1JfVENJRjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIERNQV9JU1JfVENJRjggICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENoYW5uZWwgOCB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX0RNQV9JU1JfSFRJRjggRE1BX0lTUl9IVElGOCAvKiE8IENoYW5uZWwgOCBoYWxmIHRyYW5zZmVyIGZsYWcgKi8NCi0jZGVmaW5lIExMX0RNQV9JU1JfVEVJRjggRE1BX0lTUl9URUlGOCAvKiE8IENoYW5uZWwgOCB0cmFuc2ZlciBlcnJvciBmbGFnICovDQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRE1BMV9DaGFubmVsOCAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBETUFfTExfRUNfSVQgSVQgRGVmaW5lcw0KLSAqIEBicmllZiAgICBJVCBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfRE1BX1JlYWRSZWcgYW5kDQotICogTExfRE1BX1dyaXRlUmVnIGZ1bmN0aW9ucw0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9ETUFfQ0NSX1RDSUUgRE1BX0NDUl9UQ0lFIC8qITwgVHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0ICovDQotI2RlZmluZSBMTF9ETUFfQ0NSX0hUSUUgRE1BX0NDUl9IVElFIC8qITwgSGFsZiBUcmFuc2ZlciBpbnRlcnJ1cHQgICAgICovDQotI2RlZmluZSBMTF9ETUFfQ0NSX1RFSUUgRE1BX0NDUl9URUlFIC8qITwgVHJhbnNmZXIgZXJyb3IgaW50ZXJydXB0ICAgICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIERNQV9MTF9FQ19DSEFOTkVMIENIQU5ORUwNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfRE1BX0NIQU5ORUxfMSAweDAwMDAwMDAwVSAvKiE8IERNQSBDaGFubmVsIDEgKi8NCi0jZGVmaW5lIExMX0RNQV9DSEFOTkVMXzIgMHgwMDAwMDAwMVUgLyohPCBETUEgQ2hhbm5lbCAyICovDQotI2RlZmluZSBMTF9ETUFfQ0hBTk5FTF8zIDB4MDAwMDAwMDJVIC8qITwgRE1BIENoYW5uZWwgMyAqLw0KLSNkZWZpbmUgTExfRE1BX0NIQU5ORUxfNCAweDAwMDAwMDAzVSAvKiE8IERNQSBDaGFubmVsIDQgKi8NCi0jZGVmaW5lIExMX0RNQV9DSEFOTkVMXzUgMHgwMDAwMDAwNFUgLyohPCBETUEgQ2hhbm5lbCA1ICovDQotI2RlZmluZSBMTF9ETUFfQ0hBTk5FTF82IDB4MDAwMDAwMDVVIC8qITwgRE1BIENoYW5uZWwgNiAqLw0KLSNpZiBkZWZpbmVkKERNQTFfQ2hhbm5lbDcpDQotI2RlZmluZSBMTF9ETUFfQ0hBTk5FTF83IDB4MDAwMDAwMDZVIC8qITwgRE1BIENoYW5uZWwgNyAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBETUExX0NoYW5uZWw3ICovDQotI2lmIGRlZmluZWQoRE1BMV9DaGFubmVsOCkNCi0jZGVmaW5lIExMX0RNQV9DSEFOTkVMXzggMHgwMDAwMDAwN1UgLyohPCBETUEgQ2hhbm5lbCA4ICovDQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERNQTFfQ2hhbm5lbDggKi8NCi0jaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpDQotI2RlZmluZSBMTF9ETUFfQ0hBTk5FTF9BTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIDB4RkZGRjAwMDBVIC8qITwgRE1BIENoYW5uZWwgYWxsICh1c2VkIG9ubHkgZm9yIGZ1bmN0aW9uIEByZWYgXA0KLSAgICAgICAgICAgICAgICAgTExfRE1BX0RlSW5pdCgpLiAqLw0KLSNlbmRpZiAgICAgICAgLypVU0VfRlVMTF9MTF9EUklWRVIqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBETUFfTExfRUNfRElSRUNUSU9OIFRyYW5zZmVyIERpcmVjdGlvbg0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9ETUFfRElSRUNUSU9OX1BFUklQSF9UT19NRU1PUlkgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBQZXJpcGhlcmFsIHRvIG1lbW9yeSBkaXJlY3Rpb24gKi8NCi0jZGVmaW5lIExMX0RNQV9ESVJFQ1RJT05fTUVNT1JZX1RPX1BFUklQSCBcDQotICBETUFfQ0NSX0RJUiAvKiE8IE1lbW9yeSB0byBwZXJpcGhlcmFsIGRpcmVjdGlvbiAqLw0KLSNkZWZpbmUgTExfRE1BX0RJUkVDVElPTl9NRU1PUllfVE9fTUVNT1JZIFwNCi0gIERNQV9DQ1JfTUVNMk1FTSAvKiE8IE1lbW9yeSB0byBtZW1vcnkgZGlyZWN0aW9uICAgICAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBETUFfTExfRUNfTU9ERSBUcmFuc2ZlciBtb2RlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX0RNQV9NT0RFX05PUk1BTCAweDAwMDAwMDAwVSAgICAvKiE8IE5vcm1hbCBNb2RlICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX0RNQV9NT0RFX0NJUkNVTEFSIERNQV9DQ1JfQ0lSQyAvKiE8IENpcmN1bGFyIE1vZGUgICAgICAgICAgICAgICAgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRE1BX0xMX0VDX1BFUklQSCBQZXJpcGhlcmFsIGluY3JlbWVudCBtb2RlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX0RNQV9QRVJJUEhfSU5DUkVNRU5UIFwNCi0gIERNQV9DQ1JfUElOQyAvKiE8IFBlcmlwaGVyYWwgaW5jcmVtZW50IG1vZGUgRW5hYmxlICovDQotI2RlZmluZSBMTF9ETUFfUEVSSVBIX05PSU5DUkVNRU5UIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgUGVyaXBoZXJhbCBpbmNyZW1lbnQgbW9kZSBEaXNhYmxlICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIERNQV9MTF9FQ19NRU1PUlkgTWVtb3J5IGluY3JlbWVudCBtb2RlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX0RNQV9NRU1PUllfSU5DUkVNRU5UIFwNCi0gIERNQV9DQ1JfTUlOQyAvKiE8IE1lbW9yeSBpbmNyZW1lbnQgbW9kZSBFbmFibGUgICovDQotI2RlZmluZSBMTF9ETUFfTUVNT1JZX05PSU5DUkVNRU5UIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgTWVtb3J5IGluY3JlbWVudCBtb2RlIERpc2FibGUgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRE1BX0xMX0VDX1BEQVRBQUxJR04gUGVyaXBoZXJhbCBkYXRhIGFsaWdubWVudA0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9ETUFfUERBVEFBTElHTl9CWVRFIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgUGVyaXBoZXJhbCBkYXRhIGFsaWdubWVudCA6IEJ5dGUgICAgICovDQotI2RlZmluZSBMTF9ETUFfUERBVEFBTElHTl9IQUxGV09SRCBcDQotICBETUFfQ0NSX1BTSVpFXzAgLyohPCBQZXJpcGhlcmFsIGRhdGEgYWxpZ25tZW50IDogSGFsZldvcmQgKi8NCi0jZGVmaW5lIExMX0RNQV9QREFUQUFMSUdOX1dPUkQgXA0KLSAgRE1BX0NDUl9QU0laRV8xIC8qITwgUGVyaXBoZXJhbCBkYXRhIGFsaWdubWVudCA6IFdvcmQgICAgICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIERNQV9MTF9FQ19NREFUQUFMSUdOIE1lbW9yeSBkYXRhIGFsaWdubWVudA0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9ETUFfTURBVEFBTElHTl9CWVRFIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgTWVtb3J5IGRhdGEgYWxpZ25tZW50IDogQnl0ZSAgICAgKi8NCi0jZGVmaW5lIExMX0RNQV9NREFUQUFMSUdOX0hBTEZXT1JEIFwNCi0gIERNQV9DQ1JfTVNJWkVfMCAvKiE8IE1lbW9yeSBkYXRhIGFsaWdubWVudCA6IEhhbGZXb3JkICovDQotI2RlZmluZSBMTF9ETUFfTURBVEFBTElHTl9XT1JEIFwNCi0gIERNQV9DQ1JfTVNJWkVfMSAvKiE8IE1lbW9yeSBkYXRhIGFsaWdubWVudCA6IFdvcmQgICAgICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIERNQV9MTF9FQ19QUklPUklUWSBUcmFuc2ZlciBQcmlvcml0eSBsZXZlbA0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9ETUFfUFJJT1JJVFlfTE9XIDB4MDAwMDAwMDBVICAgICAvKiE8IFByaW9yaXR5IGxldmVsIDogTG93ICAgICAgICovDQotI2RlZmluZSBMTF9ETUFfUFJJT1JJVFlfTUVESVVNIERNQV9DQ1JfUExfMCAvKiE8IFByaW9yaXR5IGxldmVsIDogTWVkaXVtICAgICovDQotI2RlZmluZSBMTF9ETUFfUFJJT1JJVFlfSElHSCBETUFfQ0NSX1BMXzEgICAvKiE8IFByaW9yaXR5IGxldmVsIDogSGlnaCAgICAgICovDQotI2RlZmluZSBMTF9ETUFfUFJJT1JJVFlfVkVSWUhJR0ggRE1BX0NDUl9QTCAvKiE8IFByaW9yaXR5IGxldmVsIDogVmVyeV9IaWdoICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBkZWZncm91cCBETUFfTExfRXhwb3J0ZWRfTWFjcm9zIERNQSBFeHBvcnRlZCBNYWNyb3MNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRE1BX0xMX0VNX1dSSVRFX1JFQUQgQ29tbW9uIFdyaXRlIGFuZCByZWFkIHJlZ2lzdGVycyBtYWNyb3MNCi0gKiBAew0KLSAqLw0KLS8qKg0KLSAqIEBicmllZiAgV3JpdGUgYSB2YWx1ZSBpbiBETUEgcmVnaXN0ZXINCi0gKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBETUEgSW5zdGFuY2UNCi0gKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgd3JpdHRlbg0KLSAqIEBwYXJhbSAgX19WQUxVRV9fIFZhbHVlIHRvIGJlIHdyaXR0ZW4gaW4gdGhlIHJlZ2lzdGVyDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBMTF9ETUFfV3JpdGVSZWcoX19JTlNUQU5DRV9fLCBfX1JFR19fLCBfX1ZBTFVFX18pIFwNCi0gIFdSSVRFX1JFRyhfX0lOU1RBTkNFX18tPl9fUkVHX18sIChfX1ZBTFVFX18pKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmVhZCBhIHZhbHVlIGluIERNQSByZWdpc3Rlcg0KLSAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIERNQSBJbnN0YW5jZQ0KLSAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSByZWFkDQotICogQHJldHZhbCBSZWdpc3RlciB2YWx1ZQ0KLSAqLw0KLSNkZWZpbmUgTExfRE1BX1JlYWRSZWcoX19JTlNUQU5DRV9fLCBfX1JFR19fKSBSRUFEX1JFRyhfX0lOU1RBTkNFX18tPl9fUkVHX18pDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIERNQV9MTF9FTV9DT05WRVJUX0RNQXhDSEFOTkVMeSBDb252ZXJ0IERNQXhDaGFubmVseQ0KLSAqIEB7DQotICovDQotLyoqDQotICogQGJyaWVmICBDb252ZXJ0IERNQXhfQ2hhbm5lbHkgaW50byBETUF4DQotICogQHBhcmFtICBfX0NIQU5ORUxfSU5TVEFOQ0VfXyBETUF4X0NoYW5uZWx5DQotICogQHJldHZhbCBETUF4DQotICovDQotI2lmIGRlZmluZWQoRE1BMV9DaGFubmVsOCkNCi0jZGVmaW5lIF9fTExfRE1BX0dFVF9JTlNUQU5DRShfX0NIQU5ORUxfSU5TVEFOQ0VfXykgXA0KLSAgKCgodWludDMyX3QpKF9fQ0hBTk5FTF9JTlNUQU5DRV9fKSA+ICgodWludDMyX3QpRE1BMV9DaGFubmVsOCkpID8gRE1BMiA6IERNQTEpDQotI2Vsc2UNCi0jZGVmaW5lIF9fTExfRE1BX0dFVF9JTlNUQU5DRShfX0NIQU5ORUxfSU5TVEFOQ0VfXykgXA0KLSAgKCgodWludDMyX3QpKF9fQ0hBTk5FTF9JTlNUQU5DRV9fKSA+ICgodWludDMyX3QpRE1BMV9DaGFubmVsNikpID8gRE1BMiA6IERNQTEpDQotI2VuZGlmIC8qIERNQTFfQ2hhbm5lbDggKi8NCi0vKioNCi0gKiBAYnJpZWYgIENvbnZlcnQgRE1BeF9DaGFubmVseSBpbnRvIExMX0RNQV9DSEFOTkVMX3kNCi0gKiBAcGFyYW0gIF9fQ0hBTk5FTF9JTlNUQU5DRV9fIERNQXhfQ2hhbm5lbHkNCi0gKiBAcmV0dmFsIExMX0RNQV9DSEFOTkVMX3kNCi0gKi8NCi0jaWYgZGVmaW5lZChETUExX0NoYW5uZWw4KQ0KLSNkZWZpbmUgX19MTF9ETUFfR0VUX0NIQU5ORUwoX19DSEFOTkVMX0lOU1RBTkNFX18pICAgICAgICAgICAgICAgICAgIFwNCi0gICgoKHVpbnQzMl90KShfX0NIQU5ORUxfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwxKSkgICBcDQotICAgICAgID8gTExfRE1BX0NIQU5ORUxfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCh1aW50MzJfdCkoX19DSEFOTkVMX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMl9DaGFubmVsMSkpIFwNCi0gICAgICAgPyBMTF9ETUFfQ0hBTk5FTF8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgOiAoKHVpbnQzMl90KShfX0NIQU5ORUxfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwyKSkgXA0KLSAgICAgICA/IExMX0RNQV9DSEFOTkVMXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICA6ICgodWludDMyX3QpKF9fQ0hBTk5FTF9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDIpKSBcDQotICAgICAgID8gTExfRE1BX0NIQU5ORUxfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCh1aW50MzJfdCkoX19DSEFOTkVMX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMykpIFwNCi0gICAgICAgPyBMTF9ETUFfQ0hBTk5FTF8zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgOiAoKHVpbnQzMl90KShfX0NIQU5ORUxfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWwzKSkgXA0KLSAgICAgICA/IExMX0RNQV9DSEFOTkVMXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICA6ICgodWludDMyX3QpKF9fQ0hBTk5FTF9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDQpKSBcDQotICAgICAgID8gTExfRE1BX0NIQU5ORUxfNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCh1aW50MzJfdCkoX19DSEFOTkVMX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMl9DaGFubmVsNCkpIFwNCi0gICAgICAgPyBMTF9ETUFfQ0hBTk5FTF80ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgOiAoKHVpbnQzMl90KShfX0NIQU5ORUxfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw1KSkgXA0KLSAgICAgICA/IExMX0RNQV9DSEFOTkVMXzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICA6ICgodWludDMyX3QpKF9fQ0hBTk5FTF9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDUpKSBcDQotICAgICAgID8gTExfRE1BX0NIQU5ORUxfNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCh1aW50MzJfdCkoX19DSEFOTkVMX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsNikpIFwNCi0gICAgICAgPyBMTF9ETUFfQ0hBTk5FTF82ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgOiAoKHVpbnQzMl90KShfX0NIQU5ORUxfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWw2KSkgXA0KLSAgICAgICA/IExMX0RNQV9DSEFOTkVMXzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICA6ICgodWludDMyX3QpKF9fQ0hBTk5FTF9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDcpKSBcDQotICAgICAgID8gTExfRE1BX0NIQU5ORUxfNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCh1aW50MzJfdCkoX19DSEFOTkVMX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMl9DaGFubmVsNykpIFwNCi0gICAgICAgPyBMTF9ETUFfQ0hBTk5FTF83ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgIDogTExfRE1BX0NIQU5ORUxfOCkNCi0jZWxzZQ0KLSNkZWZpbmUgX19MTF9ETUFfR0VUX0NIQU5ORUwoX19DSEFOTkVMX0lOU1RBTkNFX18pICAgICAgICAgICAgICAgICAgIFwNCi0gICgoKHVpbnQzMl90KShfX0NIQU5ORUxfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwxKSkgICBcDQotICAgICAgID8gTExfRE1BX0NIQU5ORUxfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCh1aW50MzJfdCkoX19DSEFOTkVMX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMl9DaGFubmVsMSkpIFwNCi0gICAgICAgPyBMTF9ETUFfQ0hBTk5FTF8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgOiAoKHVpbnQzMl90KShfX0NIQU5ORUxfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwyKSkgXA0KLSAgICAgICA/IExMX0RNQV9DSEFOTkVMXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICA6ICgodWludDMyX3QpKF9fQ0hBTk5FTF9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDIpKSBcDQotICAgICAgID8gTExfRE1BX0NIQU5ORUxfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCh1aW50MzJfdCkoX19DSEFOTkVMX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMykpIFwNCi0gICAgICAgPyBMTF9ETUFfQ0hBTk5FTF8zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgOiAoKHVpbnQzMl90KShfX0NIQU5ORUxfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWwzKSkgXA0KLSAgICAgICA/IExMX0RNQV9DSEFOTkVMXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICA6ICgodWludDMyX3QpKF9fQ0hBTk5FTF9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDQpKSBcDQotICAgICAgID8gTExfRE1BX0NIQU5ORUxfNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCh1aW50MzJfdCkoX19DSEFOTkVMX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMl9DaGFubmVsNCkpIFwNCi0gICAgICAgPyBMTF9ETUFfQ0hBTk5FTF80ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgOiAoKHVpbnQzMl90KShfX0NIQU5ORUxfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw1KSkgXA0KLSAgICAgICA/IExMX0RNQV9DSEFOTkVMXzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICA6ICgodWludDMyX3QpKF9fQ0hBTk5FTF9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDUpKSBcDQotICAgICAgID8gTExfRE1BX0NIQU5ORUxfNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICA6IExMX0RNQV9DSEFOTkVMXzYpDQotI2VuZGlmIC8qIERNQTFfQ2hhbm5lbDggKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENvbnZlcnQgRE1BIEluc3RhbmNlIERNQXggYW5kIExMX0RNQV9DSEFOTkVMX3kgaW50byBETUF4X0NoYW5uZWx5DQotICogQHBhcmFtICBfX0RNQV9JTlNUQU5DRV9fIERNQXgNCi0gKiBAcGFyYW0gIF9fQ0hBTk5FTF9fIExMX0RNQV9DSEFOTkVMX3kNCi0gKiBAcmV0dmFsIERNQXhfQ2hhbm5lbHkNCi0gKi8NCi0jaWYgZGVmaW5lZChETUExX0NoYW5uZWw4KQ0KLSNkZWZpbmUgX19MTF9ETUFfR0VUX0NIQU5ORUxfSU5TVEFOQ0UoX19ETUFfSU5TVEFOQ0VfXywgX19DSEFOTkVMX18pIFwNCi0gICgoKCh1aW50MzJfdCkoX19ETUFfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExKSkgJiYgICAgICAgICAgICBcDQotICAgICgodWludDMyX3QpKF9fQ0hBTk5FTF9fKSA9PSAoKHVpbnQzMl90KUxMX0RNQV9DSEFOTkVMXzEpKSkgICAgICAgXA0KLSAgICAgICA/IERNQTFfQ2hhbm5lbDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICA6ICgoKHVpbnQzMl90KShfX0RNQV9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTIpKSAmJiAgICAgICAgICBcDQotICAgICAgKCh1aW50MzJfdCkoX19DSEFOTkVMX18pID09ICgodWludDMyX3QpTExfRE1BX0NIQU5ORUxfMSkpKSAgICAgXA0KLSAgICAgICA/IERNQTJfQ2hhbm5lbDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICA6ICgoKHVpbnQzMl90KShfX0RNQV9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTEpKSAmJiAgICAgICAgICBcDQotICAgICAgKCh1aW50MzJfdCkoX19DSEFOTkVMX18pID09ICgodWludDMyX3QpTExfRE1BX0NIQU5ORUxfMikpKSAgICAgXA0KLSAgICAgICA/IERNQTFfQ2hhbm5lbDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICA6ICgoKHVpbnQzMl90KShfX0RNQV9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTIpKSAmJiAgICAgICAgICBcDQotICAgICAgKCh1aW50MzJfdCkoX19DSEFOTkVMX18pID09ICgodWludDMyX3QpTExfRE1BX0NIQU5ORUxfMikpKSAgICAgXA0KLSAgICAgICA/IERNQTJfQ2hhbm5lbDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICA6ICgoKHVpbnQzMl90KShfX0RNQV9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTEpKSAmJiAgICAgICAgICBcDQotICAgICAgKCh1aW50MzJfdCkoX19DSEFOTkVMX18pID09ICgodWludDMyX3QpTExfRE1BX0NIQU5ORUxfMykpKSAgICAgXA0KLSAgICAgICA/IERNQTFfQ2hhbm5lbDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICA6ICgoKHVpbnQzMl90KShfX0RNQV9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTIpKSAmJiAgICAgICAgICBcDQotICAgICAgKCh1aW50MzJfdCkoX19DSEFOTkVMX18pID09ICgodWludDMyX3QpTExfRE1BX0NIQU5ORUxfMykpKSAgICAgXA0KLSAgICAgICA/IERNQTJfQ2hhbm5lbDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICA6ICgoKHVpbnQzMl90KShfX0RNQV9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTEpKSAmJiAgICAgICAgICBcDQotICAgICAgKCh1aW50MzJfdCkoX19DSEFOTkVMX18pID09ICgodWludDMyX3QpTExfRE1BX0NIQU5ORUxfNCkpKSAgICAgXA0KLSAgICAgICA/IERNQTFfQ2hhbm5lbDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICA6ICgoKHVpbnQzMl90KShfX0RNQV9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTIpKSAmJiAgICAgICAgICBcDQotICAgICAgKCh1aW50MzJfdCkoX19DSEFOTkVMX18pID09ICgodWludDMyX3QpTExfRE1BX0NIQU5ORUxfNCkpKSAgICAgXA0KLSAgICAgICA/IERNQTJfQ2hhbm5lbDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICA6ICgoKHVpbnQzMl90KShfX0RNQV9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTEpKSAmJiAgICAgICAgICBcDQotICAgICAgKCh1aW50MzJfdCkoX19DSEFOTkVMX18pID09ICgodWludDMyX3QpTExfRE1BX0NIQU5ORUxfNSkpKSAgICAgXA0KLSAgICAgICA/IERNQTFfQ2hhbm5lbDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICA6ICgoKHVpbnQzMl90KShfX0RNQV9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTIpKSAmJiAgICAgICAgICBcDQotICAgICAgKCh1aW50MzJfdCkoX19DSEFOTkVMX18pID09ICgodWludDMyX3QpTExfRE1BX0NIQU5ORUxfNSkpKSAgICAgXA0KLSAgICAgICA/IERNQTJfQ2hhbm5lbDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICA6ICgoKHVpbnQzMl90KShfX0RNQV9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTEpKSAmJiAgICAgICAgICBcDQotICAgICAgKCh1aW50MzJfdCkoX19DSEFOTkVMX18pID09ICgodWludDMyX3QpTExfRE1BX0NIQU5ORUxfNikpKSAgICAgXA0KLSAgICAgICA/IERNQTFfQ2hhbm5lbDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICA6ICgoKHVpbnQzMl90KShfX0RNQV9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTIpKSAmJiAgICAgICAgICBcDQotICAgICAgKCh1aW50MzJfdCkoX19DSEFOTkVMX18pID09ICgodWludDMyX3QpTExfRE1BX0NIQU5ORUxfNikpKSAgICAgXA0KLSAgICAgICA/IERNQTJfQ2hhbm5lbDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICA6ICgoKHVpbnQzMl90KShfX0RNQV9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTEpKSAmJiAgICAgICAgICBcDQotICAgICAgKCh1aW50MzJfdCkoX19DSEFOTkVMX18pID09ICgodWludDMyX3QpTExfRE1BX0NIQU5ORUxfNykpKSAgICAgXA0KLSAgICAgICA/IERNQTFfQ2hhbm5lbDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICA6ICgoKHVpbnQzMl90KShfX0RNQV9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTIpKSAmJiAgICAgICAgICBcDQotICAgICAgKCh1aW50MzJfdCkoX19DSEFOTkVMX18pID09ICgodWludDMyX3QpTExfRE1BX0NIQU5ORUxfNykpKSAgICAgXA0KLSAgICAgICA/IERNQTJfQ2hhbm5lbDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICA6ICgoKHVpbnQzMl90KShfX0RNQV9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTEpKSAmJiAgICAgICAgICBcDQotICAgICAgKCh1aW50MzJfdCkoX19DSEFOTkVMX18pID09ICgodWludDMyX3QpTExfRE1BX0NIQU5ORUxfOCkpKSAgICAgXA0KLSAgICAgICA/IERNQTFfQ2hhbm5lbDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgOiBETUEyX0NoYW5uZWw4KQ0KLSNlbHNlDQotI2RlZmluZSBfX0xMX0RNQV9HRVRfQ0hBTk5FTF9JTlNUQU5DRShfX0RNQV9JTlNUQU5DRV9fLCBfX0NIQU5ORUxfXykgXA0KLSAgKCgoKHVpbnQzMl90KShfX0RNQV9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTEpKSAmJiAgICAgICAgICAgIFwNCi0gICAgKCh1aW50MzJfdCkoX19DSEFOTkVMX18pID09ICgodWludDMyX3QpTExfRE1BX0NIQU5ORUxfMSkpKSAgICAgICBcDQotICAgICAgID8gRE1BMV9DaGFubmVsMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCgodWludDMyX3QpKF9fRE1BX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMikpICYmICAgICAgICAgIFwNCi0gICAgICAoKHVpbnQzMl90KShfX0NIQU5ORUxfXykgPT0gKCh1aW50MzJfdClMTF9ETUFfQ0hBTk5FTF8xKSkpICAgICBcDQotICAgICAgID8gRE1BMl9DaGFubmVsMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCgodWludDMyX3QpKF9fRE1BX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMSkpICYmICAgICAgICAgIFwNCi0gICAgICAoKHVpbnQzMl90KShfX0NIQU5ORUxfXykgPT0gKCh1aW50MzJfdClMTF9ETUFfQ0hBTk5FTF8yKSkpICAgICBcDQotICAgICAgID8gRE1BMV9DaGFubmVsMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCgodWludDMyX3QpKF9fRE1BX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMikpICYmICAgICAgICAgIFwNCi0gICAgICAoKHVpbnQzMl90KShfX0NIQU5ORUxfXykgPT0gKCh1aW50MzJfdClMTF9ETUFfQ0hBTk5FTF8yKSkpICAgICBcDQotICAgICAgID8gRE1BMl9DaGFubmVsMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCgodWludDMyX3QpKF9fRE1BX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMSkpICYmICAgICAgICAgIFwNCi0gICAgICAoKHVpbnQzMl90KShfX0NIQU5ORUxfXykgPT0gKCh1aW50MzJfdClMTF9ETUFfQ0hBTk5FTF8zKSkpICAgICBcDQotICAgICAgID8gRE1BMV9DaGFubmVsMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCgodWludDMyX3QpKF9fRE1BX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMikpICYmICAgICAgICAgIFwNCi0gICAgICAoKHVpbnQzMl90KShfX0NIQU5ORUxfXykgPT0gKCh1aW50MzJfdClMTF9ETUFfQ0hBTk5FTF8zKSkpICAgICBcDQotICAgICAgID8gRE1BMl9DaGFubmVsMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCgodWludDMyX3QpKF9fRE1BX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMSkpICYmICAgICAgICAgIFwNCi0gICAgICAoKHVpbnQzMl90KShfX0NIQU5ORUxfXykgPT0gKCh1aW50MzJfdClMTF9ETUFfQ0hBTk5FTF80KSkpICAgICBcDQotICAgICAgID8gRE1BMV9DaGFubmVsNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCgodWludDMyX3QpKF9fRE1BX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMikpICYmICAgICAgICAgIFwNCi0gICAgICAoKHVpbnQzMl90KShfX0NIQU5ORUxfXykgPT0gKCh1aW50MzJfdClMTF9ETUFfQ0hBTk5FTF80KSkpICAgICBcDQotICAgICAgID8gRE1BMl9DaGFubmVsNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCgodWludDMyX3QpKF9fRE1BX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMSkpICYmICAgICAgICAgIFwNCi0gICAgICAoKHVpbnQzMl90KShfX0NIQU5ORUxfXykgPT0gKCh1aW50MzJfdClMTF9ETUFfQ0hBTk5FTF81KSkpICAgICBcDQotICAgICAgID8gRE1BMV9DaGFubmVsNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCgodWludDMyX3QpKF9fRE1BX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMikpICYmICAgICAgICAgIFwNCi0gICAgICAoKHVpbnQzMl90KShfX0NIQU5ORUxfXykgPT0gKCh1aW50MzJfdClMTF9ETUFfQ0hBTk5FTF81KSkpICAgICBcDQotICAgICAgID8gRE1BMl9DaGFubmVsNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCgodWludDMyX3QpKF9fRE1BX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMSkpICYmICAgICAgICAgIFwNCi0gICAgICAoKHVpbnQzMl90KShfX0NIQU5ORUxfXykgPT0gKCh1aW50MzJfdClMTF9ETUFfQ0hBTk5FTF82KSkpICAgICBcDQotICAgICAgID8gRE1BMV9DaGFubmVsNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICA6IERNQTJfQ2hhbm5lbDYpDQotI2VuZGlmIC8qIERNQTFfQ2hhbm5lbDggKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGRlZmdyb3VwIERNQV9MTF9FeHBvcnRlZF9GdW5jdGlvbnMgRE1BIEV4cG9ydGVkIEZ1bmN0aW9ucw0KLSAqIEB7DQotICovDQotDQotLyoqIEBkZWZncm91cCBETUFfTExfRUZfQ29uZmlndXJhdGlvbiBDb25maWd1cmF0aW9uDQotICogQHsNCi0gKi8NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSBETUEgY2hhbm5lbC4NCi0gKiBAcm10b2xsIENDUiAgICAgICAgICBFTiAgICAgICAgICAgIExMX0RNQV9FbmFibGVDaGFubmVsDQotICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UNCi0gKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83ICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzggKCopDQotICogICAgICAgICAoKikgTm90IG9uIGFsbCBHNCBkZXZpY2VzDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0VuYWJsZUNoYW5uZWwoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwpIHsNCi0gIHVpbnQzMl90IGRtYV9iYXNlX2FkZHIgPSAodWludDMyX3QpRE1BeDsNCi0gIFNFVF9CSVQoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCh1aW50MzJfdCkoZG1hX2Jhc2VfYWRkciArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsXSkpKQ0KLSAgICAgICAgICAgICAgLT5DQ1IsDQotICAgICAgICAgIERNQV9DQ1JfRU4pOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgRE1BIGNoYW5uZWwuDQotICogQHJtdG9sbCBDQ1IgICAgICAgICAgRU4gICAgICAgICAgICBMTF9ETUFfRGlzYWJsZUNoYW5uZWwNCi0gKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQ0KLSAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfOCAoKikNCi0gKiAgICAgICAgICgqKSBOb3Qgb24gYWxsIEc0IGRldmljZXMNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfRGlzYWJsZUNoYW5uZWwoRE1BX1R5cGVEZWYgKkRNQXgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpIHsNCi0gIHVpbnQzMl90IGRtYV9iYXNlX2FkZHIgPSAodWludDMyX3QpRE1BeDsNCi0gIENMRUFSX0JJVCgoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKHVpbnQzMl90KShkbWFfYmFzZV9hZGRyICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFOTkVMX09GRlNFVF9UQUJbQ2hhbm5lbF0pKSkNCi0gICAgICAgICAgICAgICAgLT5DQ1IsDQotICAgICAgICAgICAgRE1BX0NDUl9FTik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgRE1BIGNoYW5uZWwgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4NCi0gKiBAcm10b2xsIENDUiAgICAgICAgICBFTiAgICAgICAgICAgIExMX0RNQV9Jc0VuYWJsZWRDaGFubmVsDQotICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UNCi0gKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83ICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzggKCopDQotICogICAgICAgICAoKikgTm90IG9uIGFsbCBHNCBkZXZpY2VzDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0VuYWJsZWRDaGFubmVsKERNQV9UeXBlRGVmICpETUF4LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKSB7DQotICB1aW50MzJfdCBkbWFfYmFzZV9hZGRyID0gKHVpbnQzMl90KURNQXg7DQotICByZXR1cm4gKA0KLSAgICAgIChSRUFEX0JJVCgoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKA0KLSAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KShkbWFfYmFzZV9hZGRyICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWxdKSkpDQotICAgICAgICAgICAgICAgICAgICAtPkNDUiwNCi0gICAgICAgICAgICAgICAgRE1BX0NDUl9FTikgPT0gKERNQV9DQ1JfRU4pKQ0KLSAgICAgICAgICA/IDFVTA0KLSAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ29uZmlndXJlIGFsbCBwYXJhbWV0ZXJzIGxpbmsgdG8gRE1BIHRyYW5zZmVyLg0KLSAqIEBybXRvbGwgQ0NSICAgICAgICAgIERJUiAgICAgICAgICAgTExfRE1BX0NvbmZpZ1RyYW5zZmVyXG4NCi0gKiAgICAgICAgIENDUiAgICAgICAgICBNRU0yTUVNICAgICAgIExMX0RNQV9Db25maWdUcmFuc2ZlclxuDQotICogICAgICAgICBDQ1IgICAgICAgICAgQ0lSQyAgICAgICAgICBMTF9ETUFfQ29uZmlnVHJhbnNmZXJcbg0KLSAqICAgICAgICAgQ0NSICAgICAgICAgIFBJTkMgICAgICAgICAgTExfRE1BX0NvbmZpZ1RyYW5zZmVyXG4NCi0gKiAgICAgICAgIENDUiAgICAgICAgICBNSU5DICAgICAgICAgIExMX0RNQV9Db25maWdUcmFuc2ZlclxuDQotICogICAgICAgICBDQ1IgICAgICAgICAgUFNJWkUgICAgICAgICBMTF9ETUFfQ29uZmlnVHJhbnNmZXJcbg0KLSAqICAgICAgICAgQ0NSICAgICAgICAgIE1TSVpFICAgICAgICAgTExfRE1BX0NvbmZpZ1RyYW5zZmVyXG4NCi0gKiAgICAgICAgIENDUiAgICAgICAgICBQTCAgICAgICAgICAgIExMX0RNQV9Db25maWdUcmFuc2Zlcg0KLSAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlDQotICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNyAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF84ICgqKQ0KLSAqICAgICAgICAgKCopIE5vdCBvbiBhbGwgRzQgZGV2aWNlcw0KLSAqIEBwYXJhbSAgQ29uZmlndXJhdGlvbiBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgY29tYmluYXRpb24gb2YgYWxsIHRoZQ0KLSAqIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0RJUkVDVElPTl9QRVJJUEhfVE9fTUVNT1JZIG9yIEByZWYNCi0gKiBMTF9ETUFfRElSRUNUSU9OX01FTU9SWV9UT19QRVJJUEggb3IgQHJlZiBMTF9ETUFfRElSRUNUSU9OX01FTU9SWV9UT19NRU1PUlkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfTU9ERV9OT1JNQUwgb3IgQHJlZiBMTF9ETUFfTU9ERV9DSVJDVUxBUg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9QRVJJUEhfSU5DUkVNRU5UIG9yIEByZWYgTExfRE1BX1BFUklQSF9OT0lOQ1JFTUVOVA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9NRU1PUllfSU5DUkVNRU5UIG9yIEByZWYgTExfRE1BX01FTU9SWV9OT0lOQ1JFTUVOVA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9QREFUQUFMSUdOX0JZVEUgb3IgQHJlZiBMTF9ETUFfUERBVEFBTElHTl9IQUxGV09SRA0KLSAqIG9yIEByZWYgTExfRE1BX1BEQVRBQUxJR05fV09SRA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9NREFUQUFMSUdOX0JZVEUgb3IgQHJlZiBMTF9ETUFfTURBVEFBTElHTl9IQUxGV09SRA0KLSAqIG9yIEByZWYgTExfRE1BX01EQVRBQUxJR05fV09SRA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9QUklPUklUWV9MT1cgb3IgQHJlZiBMTF9ETUFfUFJJT1JJVFlfTUVESVVNIG9yIEByZWYNCi0gKiBMTF9ETUFfUFJJT1JJVFlfSElHSCBvciBAcmVmIExMX0RNQV9QUklPUklUWV9WRVJZSElHSA0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9Db25maWdUcmFuc2ZlcihETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ29uZmlndXJhdGlvbikgew0KLSAgdWludDMyX3QgZG1hX2Jhc2VfYWRkciA9ICh1aW50MzJfdClETUF4Ow0KLSAgTU9ESUZZX1JFRygoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKHVpbnQzMl90KShkbWFfYmFzZV9hZGRyICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWxdKSkpDQotICAgICAgICAgICAgICAgICAtPkNDUiwNCi0gICAgICAgICAgICAgRE1BX0NDUl9ESVIgfCBETUFfQ0NSX01FTTJNRU0gfCBETUFfQ0NSX0NJUkMgfCBETUFfQ0NSX1BJTkMgfA0KLSAgICAgICAgICAgICAgICAgRE1BX0NDUl9NSU5DIHwgRE1BX0NDUl9QU0laRSB8IERNQV9DQ1JfTVNJWkUgfCBETUFfQ0NSX1BMLA0KLSAgICAgICAgICAgICBDb25maWd1cmF0aW9uKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZXQgRGF0YSB0cmFuc2ZlciBkaXJlY3Rpb24gKHJlYWQgZnJvbSBwZXJpcGhlcmFsIG9yIGZyb20gbWVtb3J5KS4NCi0gKiBAcm10b2xsIENDUiAgICAgICAgICBESVIgICAgICAgICAgIExMX0RNQV9TZXREYXRhVHJhbnNmZXJEaXJlY3Rpb25cbg0KLSAqICAgICAgICAgQ0NSICAgICAgICAgIE1FTTJNRU0gICAgICAgTExfRE1BX1NldERhdGFUcmFuc2ZlckRpcmVjdGlvbg0KLSAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlDQotICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNyAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF84ICgqKQ0KLSAqICAgICAgICAgKCopIE5vdCBvbiBhbGwgRzQgZGV2aWNlcw0KLSAqIEBwYXJhbSAgRGlyZWN0aW9uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0RJUkVDVElPTl9QRVJJUEhfVE9fTUVNT1JZDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0RJUkVDVElPTl9NRU1PUllfVE9fUEVSSVBIDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0RJUkVDVElPTl9NRU1PUllfVE9fTUVNT1JZDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX1NldERhdGFUcmFuc2ZlckRpcmVjdGlvbihETUFfVHlwZURlZiAqRE1BeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBEaXJlY3Rpb24pIHsNCi0gIHVpbnQzMl90IGRtYV9iYXNlX2FkZHIgPSAodWludDMyX3QpRE1BeDsNCi0gIE1PRElGWV9SRUcoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCh1aW50MzJfdCkoZG1hX2Jhc2VfYWRkciArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsXSkpKQ0KLSAgICAgICAgICAgICAgICAgLT5DQ1IsDQotICAgICAgICAgICAgIERNQV9DQ1JfRElSIHwgRE1BX0NDUl9NRU0yTUVNLCBEaXJlY3Rpb24pOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBEYXRhIHRyYW5zZmVyIGRpcmVjdGlvbiAocmVhZCBmcm9tIHBlcmlwaGVyYWwgb3IgZnJvbSBtZW1vcnkpLg0KLSAqIEBybXRvbGwgQ0NSICAgICAgICAgIERJUiAgICAgICAgICAgTExfRE1BX0dldERhdGFUcmFuc2ZlckRpcmVjdGlvblxuDQotICogICAgICAgICBDQ1IgICAgICAgICAgTUVNMk1FTSAgICAgICBMTF9ETUFfR2V0RGF0YVRyYW5zZmVyRGlyZWN0aW9uDQotICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UNCi0gKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83ICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzggKCopDQotICogICAgICAgICAoKikgTm90IG9uIGFsbCBHNCBkZXZpY2VzDQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9ESVJFQ1RJT05fUEVSSVBIX1RPX01FTU9SWQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9ESVJFQ1RJT05fTUVNT1JZX1RPX1BFUklQSA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9ESVJFQ1RJT05fTUVNT1JZX1RPX01FTU9SWQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfR2V0RGF0YVRyYW5zZmVyRGlyZWN0aW9uKERNQV9UeXBlRGVmICpETUF4LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpIHsNCi0gIHVpbnQzMl90IGRtYV9iYXNlX2FkZHIgPSAodWludDMyX3QpRE1BeDsNCi0gIHJldHVybiAoUkVBRF9CSVQoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCgNCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCkoZG1hX2Jhc2VfYWRkciArIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsXSkpKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgLT5DQ1IsDQotICAgICAgICAgICAgICAgICAgIERNQV9DQ1JfRElSIHwgRE1BX0NDUl9NRU0yTUVNKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IERNQSBtb2RlIGNpcmN1bGFyIG9yIG5vcm1hbC4NCi0gKiBAbm90ZSBUaGUgY2lyY3VsYXIgYnVmZmVyIG1vZGUgY2Fubm90IGJlIHVzZWQgaWYgdGhlIG1lbW9yeS10by1tZW1vcnkNCi0gKiBkYXRhIHRyYW5zZmVyIGlzIGNvbmZpZ3VyZWQgb24gdGhlIHNlbGVjdGVkIENoYW5uZWwuDQotICogQHJtdG9sbCBDQ1IgICAgICAgICAgQ0lSQyAgICAgICAgICBMTF9ETUFfU2V0TW9kZQ0KLSAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlDQotICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNyAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF84ICgqKQ0KLSAqICAgICAgICAgKCopIE5vdCBvbiBhbGwgRzQgZGV2aWNlcw0KLSAqIEBwYXJhbSAgTW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9NT0RFX05PUk1BTA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9NT0RFX0NJUkNVTEFSDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX1NldE1vZGUoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgTW9kZSkgew0KLSAgdWludDMyX3QgZG1hX2Jhc2VfYWRkciA9ICh1aW50MzJfdClETUF4Ow0KLSAgTU9ESUZZX1JFRygoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKHVpbnQzMl90KShkbWFfYmFzZV9hZGRyICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWxdKSkpDQotICAgICAgICAgICAgICAgICAtPkNDUiwNCi0gICAgICAgICAgICAgRE1BX0NDUl9DSVJDLCBNb2RlKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgRE1BIG1vZGUgY2lyY3VsYXIgb3Igbm9ybWFsLg0KLSAqIEBybXRvbGwgQ0NSICAgICAgICAgIENJUkMgICAgICAgICAgTExfRE1BX0dldE1vZGUNCi0gKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQ0KLSAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfOCAoKikNCi0gKiAgICAgICAgICgqKSBOb3Qgb24gYWxsIEc0IGRldmljZXMNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX01PREVfTk9STUFMDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX01PREVfQ0lSQ1VMQVINCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0dldE1vZGUoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwpIHsNCi0gIHVpbnQzMl90IGRtYV9iYXNlX2FkZHIgPSAodWludDMyX3QpRE1BeDsNCi0gIHJldHVybiAoUkVBRF9CSVQoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCgNCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCkoZG1hX2Jhc2VfYWRkciArIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsXSkpKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgLT5DQ1IsDQotICAgICAgICAgICAgICAgICAgIERNQV9DQ1JfQ0lSQykpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCBQZXJpcGhlcmFsIGluY3JlbWVudCBtb2RlLg0KLSAqIEBybXRvbGwgQ0NSICAgICAgICAgIFBJTkMgICAgICAgICAgTExfRE1BX1NldFBlcmlwaEluY01vZGUNCi0gKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQ0KLSAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfOCAoKikNCi0gKiAgICAgICAgICgqKSBOb3Qgb24gYWxsIEc0IGRldmljZXMNCi0gKiBAcGFyYW0gIFBlcmlwaE9yTTJNU3JjSW5jTW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcNCi0gKiB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX1BFUklQSF9JTkNSRU1FTlQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUEVSSVBIX05PSU5DUkVNRU5UDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX1NldFBlcmlwaEluY01vZGUoRE1BX1R5cGVEZWYgKkRNQXgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQZXJpcGhPck0yTVNyY0luY01vZGUpIHsNCi0gIHVpbnQzMl90IGRtYV9iYXNlX2FkZHIgPSAodWludDMyX3QpRE1BeDsNCi0gIE1PRElGWV9SRUcoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCh1aW50MzJfdCkoZG1hX2Jhc2VfYWRkciArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsXSkpKQ0KLSAgICAgICAgICAgICAgICAgLT5DQ1IsDQotICAgICAgICAgICAgIERNQV9DQ1JfUElOQywgUGVyaXBoT3JNMk1TcmNJbmNNb2RlKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgUGVyaXBoZXJhbCBpbmNyZW1lbnQgbW9kZS4NCi0gKiBAcm10b2xsIENDUiAgICAgICAgICBQSU5DICAgICAgICAgIExMX0RNQV9HZXRQZXJpcGhJbmNNb2RlDQotICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UNCi0gKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83ICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzggKCopDQotICogICAgICAgICAoKikgTm90IG9uIGFsbCBHNCBkZXZpY2VzDQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9QRVJJUEhfSU5DUkVNRU5UDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX1BFUklQSF9OT0lOQ1JFTUVOVA0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfR2V0UGVyaXBoSW5jTW9kZShETUFfVHlwZURlZiAqRE1BeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCkgew0KLSAgdWludDMyX3QgZG1hX2Jhc2VfYWRkciA9ICh1aW50MzJfdClETUF4Ow0KLSAgcmV0dXJuIChSRUFEX0JJVCgoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KShkbWFfYmFzZV9hZGRyICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWxdKSkpDQotICAgICAgICAgICAgICAgICAgICAgICAtPkNDUiwNCi0gICAgICAgICAgICAgICAgICAgRE1BX0NDUl9QSU5DKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IE1lbW9yeSBpbmNyZW1lbnQgbW9kZS4NCi0gKiBAcm10b2xsIENDUiAgICAgICAgICBNSU5DICAgICAgICAgIExMX0RNQV9TZXRNZW1vcnlJbmNNb2RlDQotICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UNCi0gKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83ICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzggKCopDQotICogICAgICAgICAoKikgTm90IG9uIGFsbCBHNCBkZXZpY2VzDQotICogQHBhcmFtICBNZW1vcnlPck0yTURzdEluY01vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nDQotICogdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9NRU1PUllfSU5DUkVNRU5UDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX01FTU9SWV9OT0lOQ1JFTUVOVA0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9TZXRNZW1vcnlJbmNNb2RlKERNQV9UeXBlRGVmICpETUF4LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgTWVtb3J5T3JNMk1Ec3RJbmNNb2RlKSB7DQotICB1aW50MzJfdCBkbWFfYmFzZV9hZGRyID0gKHVpbnQzMl90KURNQXg7DQotICBNT0RJRllfUkVHKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKSgodWludDMyX3QpKGRtYV9iYXNlX2FkZHIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFOTkVMX09GRlNFVF9UQUJbQ2hhbm5lbF0pKSkNCi0gICAgICAgICAgICAgICAgIC0+Q0NSLA0KLSAgICAgICAgICAgICBETUFfQ0NSX01JTkMsIE1lbW9yeU9yTTJNRHN0SW5jTW9kZSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IE1lbW9yeSBpbmNyZW1lbnQgbW9kZS4NCi0gKiBAcm10b2xsIENDUiAgICAgICAgICBNSU5DICAgICAgICAgIExMX0RNQV9HZXRNZW1vcnlJbmNNb2RlDQotICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UNCi0gKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83ICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzggKCopDQotICogICAgICAgICAoKikgTm90IG9uIGFsbCBHNCBkZXZpY2VzDQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9NRU1PUllfSU5DUkVNRU5UDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX01FTU9SWV9OT0lOQ1JFTUVOVA0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfR2V0TWVtb3J5SW5jTW9kZShETUFfVHlwZURlZiAqRE1BeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCkgew0KLSAgdWludDMyX3QgZG1hX2Jhc2VfYWRkciA9ICh1aW50MzJfdClETUF4Ow0KLSAgcmV0dXJuIChSRUFEX0JJVCgoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KShkbWFfYmFzZV9hZGRyICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWxdKSkpDQotICAgICAgICAgICAgICAgICAgICAgICAtPkNDUiwNCi0gICAgICAgICAgICAgICAgICAgRE1BX0NDUl9NSU5DKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IFBlcmlwaGVyYWwgc2l6ZS4NCi0gKiBAcm10b2xsIENDUiAgICAgICAgICBQU0laRSAgICAgICAgIExMX0RNQV9TZXRQZXJpcGhTaXplDQotICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UNCi0gKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83ICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzggKCopDQotICogICAgICAgICAoKikgTm90IG9uIGFsbCBHNCBkZXZpY2VzDQotICogQHBhcmFtICBQZXJpcGhPck0yTVNyY0RhdGFTaXplIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZw0KLSAqIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUERBVEFBTElHTl9CWVRFDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX1BEQVRBQUxJR05fSEFMRldPUkQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUERBVEFBTElHTl9XT1JEDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX1NldFBlcmlwaFNpemUoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUGVyaXBoT3JNMk1TcmNEYXRhU2l6ZSkgew0KLSAgdWludDMyX3QgZG1hX2Jhc2VfYWRkciA9ICh1aW50MzJfdClETUF4Ow0KLSAgTU9ESUZZX1JFRygoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKHVpbnQzMl90KShkbWFfYmFzZV9hZGRyICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWxdKSkpDQotICAgICAgICAgICAgICAgICAtPkNDUiwNCi0gICAgICAgICAgICAgRE1BX0NDUl9QU0laRSwgUGVyaXBoT3JNMk1TcmNEYXRhU2l6ZSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IFBlcmlwaGVyYWwgc2l6ZS4NCi0gKiBAcm10b2xsIENDUiAgICAgICAgICBQU0laRSAgICAgICAgIExMX0RNQV9HZXRQZXJpcGhTaXplDQotICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UNCi0gKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83ICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzggKCopDQotICogICAgICAgICAoKikgTm90IG9uIGFsbCBHNCBkZXZpY2VzDQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9QREFUQUFMSUdOX0JZVEUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUERBVEFBTElHTl9IQUxGV09SRA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9QREFUQUFMSUdOX1dPUkQNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0dldFBlcmlwaFNpemUoRE1BX1R5cGVEZWYgKkRNQXgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpIHsNCi0gIHVpbnQzMl90IGRtYV9iYXNlX2FkZHIgPSAodWludDMyX3QpRE1BeDsNCi0gIHJldHVybiAoUkVBRF9CSVQoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCgNCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCkoZG1hX2Jhc2VfYWRkciArIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsXSkpKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgLT5DQ1IsDQotICAgICAgICAgICAgICAgICAgIERNQV9DQ1JfUFNJWkUpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZXQgTWVtb3J5IHNpemUuDQotICogQHJtdG9sbCBDQ1IgICAgICAgICAgTVNJWkUgICAgICAgICBMTF9ETUFfU2V0TWVtb3J5U2l6ZQ0KLSAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlDQotICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNyAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF84ICgqKQ0KLSAqICAgICAgICAgKCopIE5vdCBvbiBhbGwgRzQgZGV2aWNlcw0KLSAqIEBwYXJhbSAgTWVtb3J5T3JNMk1Ec3REYXRhU2l6ZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcNCi0gKiB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX01EQVRBQUxJR05fQllURQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9NREFUQUFMSUdOX0hBTEZXT1JEDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX01EQVRBQUxJR05fV09SRA0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9TZXRNZW1vcnlTaXplKERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE1lbW9yeU9yTTJNRHN0RGF0YVNpemUpIHsNCi0gIHVpbnQzMl90IGRtYV9iYXNlX2FkZHIgPSAodWludDMyX3QpRE1BeDsNCi0gIE1PRElGWV9SRUcoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCh1aW50MzJfdCkoZG1hX2Jhc2VfYWRkciArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsXSkpKQ0KLSAgICAgICAgICAgICAgICAgLT5DQ1IsDQotICAgICAgICAgICAgIERNQV9DQ1JfTVNJWkUsIE1lbW9yeU9yTTJNRHN0RGF0YVNpemUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBNZW1vcnkgc2l6ZS4NCi0gKiBAcm10b2xsIENDUiAgICAgICAgICBNU0laRSAgICAgICAgIExMX0RNQV9HZXRNZW1vcnlTaXplDQotICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UNCi0gKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83ICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzggKCopDQotICogICAgICAgICAoKikgTm90IG9uIGFsbCBHNCBkZXZpY2VzDQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9NREFUQUFMSUdOX0JZVEUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfTURBVEFBTElHTl9IQUxGV09SRA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9NREFUQUFMSUdOX1dPUkQNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0dldE1lbW9yeVNpemUoRE1BX1R5cGVEZWYgKkRNQXgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpIHsNCi0gIHVpbnQzMl90IGRtYV9iYXNlX2FkZHIgPSAodWludDMyX3QpRE1BeDsNCi0gIHJldHVybiAoUkVBRF9CSVQoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCgNCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCkoZG1hX2Jhc2VfYWRkciArIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsXSkpKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgLT5DQ1IsDQotICAgICAgICAgICAgICAgICAgIERNQV9DQ1JfTVNJWkUpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZXQgQ2hhbm5lbCBwcmlvcml0eSBsZXZlbC4NCi0gKiBAcm10b2xsIENDUiAgICAgICAgICBQTCAgICAgICAgICAgIExMX0RNQV9TZXRDaGFubmVsUHJpb3JpdHlMZXZlbA0KLSAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlDQotICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNyAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF84ICgqKQ0KLSAqICAgICAgICAgKCopIE5vdCBvbiBhbGwgRzQgZGV2aWNlcw0KLSAqIEBwYXJhbSAgUHJpb3JpdHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUFJJT1JJVFlfTE9XDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX1BSSU9SSVRZX01FRElVTQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9QUklPUklUWV9ISUdIDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX1BSSU9SSVRZX1ZFUllISUdIDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX1NldENoYW5uZWxQcmlvcml0eUxldmVsKERNQV9UeXBlRGVmICpETUF4LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQcmlvcml0eSkgew0KLSAgdWludDMyX3QgZG1hX2Jhc2VfYWRkciA9ICh1aW50MzJfdClETUF4Ow0KLSAgTU9ESUZZX1JFRygoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKHVpbnQzMl90KShkbWFfYmFzZV9hZGRyICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWxdKSkpDQotICAgICAgICAgICAgICAgICAtPkNDUiwNCi0gICAgICAgICAgICAgRE1BX0NDUl9QTCwgUHJpb3JpdHkpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBDaGFubmVsIHByaW9yaXR5IGxldmVsLg0KLSAqIEBybXRvbGwgQ0NSICAgICAgICAgIFBMICAgICAgICAgICAgTExfRE1BX0dldENoYW5uZWxQcmlvcml0eUxldmVsDQotICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UNCi0gKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83ICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzggKCopDQotICogICAgICAgICAoKikgTm90IG9uIGFsbCBHNCBkZXZpY2VzDQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9QUklPUklUWV9MT1cNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUFJJT1JJVFlfTUVESVVNDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX1BSSU9SSVRZX0hJR0gNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUFJJT1JJVFlfVkVSWUhJR0gNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0dldENoYW5uZWxQcmlvcml0eUxldmVsKERNQV9UeXBlRGVmICpETUF4LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCkgew0KLSAgdWludDMyX3QgZG1hX2Jhc2VfYWRkciA9ICh1aW50MzJfdClETUF4Ow0KLSAgcmV0dXJuIChSRUFEX0JJVCgoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KShkbWFfYmFzZV9hZGRyICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWxdKSkpDQotICAgICAgICAgICAgICAgICAgICAgICAtPkNDUiwNCi0gICAgICAgICAgICAgICAgICAgRE1BX0NDUl9QTCkpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCBOdW1iZXIgb2YgZGF0YSB0byB0cmFuc2Zlci4NCi0gKiBAbm90ZSAgIFRoaXMgYWN0aW9uIGhhcyBubyBlZmZlY3QgaWYNCi0gKiAgICAgICAgIGNoYW5uZWwgaXMgZW5hYmxlZC4NCi0gKiBAcm10b2xsIENORFRSICAgICAgICBORFQgICAgICAgICAgIExMX0RNQV9TZXREYXRhTGVuZ3RoDQotICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UNCi0gKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83ICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzggKCopDQotICogICAgICAgICAoKikgTm90IG9uIGFsbCBHNCBkZXZpY2VzDQotICogQHBhcmFtICBOYkRhdGEgQmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMHgwMDAwRkZGRg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9TZXREYXRhTGVuZ3RoKERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE5iRGF0YSkgew0KLSAgdWludDMyX3QgZG1hX2Jhc2VfYWRkciA9ICh1aW50MzJfdClETUF4Ow0KLSAgTU9ESUZZX1JFRygoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKHVpbnQzMl90KShkbWFfYmFzZV9hZGRyICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWxdKSkpDQotICAgICAgICAgICAgICAgICAtPkNORFRSLA0KLSAgICAgICAgICAgICBETUFfQ05EVFJfTkRULCBOYkRhdGEpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBOdW1iZXIgb2YgZGF0YSB0byB0cmFuc2Zlci4NCi0gKiBAbm90ZSAgIE9uY2UgdGhlIGNoYW5uZWwgaXMgZW5hYmxlZCwgdGhlIHJldHVybiB2YWx1ZSBpbmRpY2F0ZSB0aGUNCi0gKiAgICAgICAgIHJlbWFpbmluZyBieXRlcyB0byBiZSB0cmFuc21pdHRlZC4NCi0gKiBAcm10b2xsIENORFRSICAgICAgICBORFQgICAgICAgICAgIExMX0RNQV9HZXREYXRhTGVuZ3RoDQotICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UNCi0gKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83ICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzggKCopDQotICogICAgICAgICAoKikgTm90IG9uIGFsbCBHNCBkZXZpY2VzDQotICogQHJldHZhbCBCZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAweEZGRkZGRkZGDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9HZXREYXRhTGVuZ3RoKERNQV9UeXBlRGVmICpETUF4LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKSB7DQotICB1aW50MzJfdCBkbWFfYmFzZV9hZGRyID0gKHVpbnQzMl90KURNQXg7DQotICByZXR1cm4gKFJFQURfQklUKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKSgoDQotICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QpKGRtYV9iYXNlX2FkZHIgKyBDSEFOTkVMX09GRlNFVF9UQUJbQ2hhbm5lbF0pKSkNCi0gICAgICAgICAgICAgICAgICAgICAgIC0+Q05EVFIsDQotICAgICAgICAgICAgICAgICAgIERNQV9DTkRUUl9ORFQpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDb25maWd1cmUgdGhlIFNvdXJjZSBhbmQgRGVzdGluYXRpb24gYWRkcmVzc2VzLg0KLSAqIEBub3RlICAgVGhpcyBBUEkgbXVzdCBub3QgYmUgY2FsbGVkIHdoZW4gdGhlIERNQSBjaGFubmVsIGlzIGVuYWJsZWQuDQotICogQG5vdGUgICBFYWNoIElQIHVzaW5nIERNQSBwcm92aWRlcyBhbiBBUEkgdG8gZ2V0IGRpcmVjdGx5IHRoZSByZWdpc3Rlcg0KLSAqIGFkZHJlc3MgKExMX1BQUF9ETUFfR2V0UmVnQWRkcikuDQotICogQHJtdG9sbCBDUEFSICAgICAgICAgUEEgICAgICAgICAgICBMTF9ETUFfQ29uZmlnQWRkcmVzc2VzXG4NCi0gKiAgICAgICAgIENNQVIgICAgICAgICBNQSAgICAgICAgICAgIExMX0RNQV9Db25maWdBZGRyZXNzZXMNCi0gKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQ0KLSAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfOCAoKikNCi0gKiAgICAgICAgICgqKSBOb3Qgb24gYWxsIEc0IGRldmljZXMNCi0gKiBAcGFyYW0gIFNyY0FkZHJlc3MgQmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMHhGRkZGRkZGRg0KLSAqIEBwYXJhbSAgRHN0QWRkcmVzcyBCZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAweEZGRkZGRkZGDQotICogQHBhcmFtICBEaXJlY3Rpb24gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfRElSRUNUSU9OX1BFUklQSF9UT19NRU1PUlkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfRElSRUNUSU9OX01FTU9SWV9UT19QRVJJUEgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfRElSRUNUSU9OX01FTU9SWV9UT19NRU1PUlkNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ29uZmlnQWRkcmVzc2VzKERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgU3JjQWRkcmVzcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IERzdEFkZHJlc3MsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBEaXJlY3Rpb24pIHsNCi0gIHVpbnQzMl90IGRtYV9iYXNlX2FkZHIgPSAodWludDMyX3QpRE1BeDsNCi0NCi0gIC8qIERpcmVjdGlvbiBNZW1vcnkgdG8gUGVyaXBoICovDQotICBpZiAoRGlyZWN0aW9uID09IExMX0RNQV9ESVJFQ1RJT05fTUVNT1JZX1RPX1BFUklQSCkgew0KLSAgICBXUklURV9SRUcoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCh1aW50MzJfdCkoZG1hX2Jhc2VfYWRkciArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFOTkVMX09GRlNFVF9UQUJbQ2hhbm5lbF0pKSkNCi0gICAgICAgICAgICAgICAgICAtPkNNQVIsDQotICAgICAgICAgICAgICBTcmNBZGRyZXNzKTsNCi0gICAgV1JJVEVfUkVHKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKSgodWludDMyX3QpKGRtYV9iYXNlX2FkZHIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWxdKSkpDQotICAgICAgICAgICAgICAgICAgLT5DUEFSLA0KLSAgICAgICAgICAgICAgRHN0QWRkcmVzcyk7DQotICB9DQotICAvKiBEaXJlY3Rpb24gUGVyaXBoIHRvIE1lbW9yeSBhbmQgTWVtb3J5IHRvIE1lbW9yeSAqLw0KLSAgZWxzZSB7DQotICAgIFdSSVRFX1JFRygoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKHVpbnQzMl90KShkbWFfYmFzZV9hZGRyICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsXSkpKQ0KLSAgICAgICAgICAgICAgICAgIC0+Q1BBUiwNCi0gICAgICAgICAgICAgIFNyY0FkZHJlc3MpOw0KLSAgICBXUklURV9SRUcoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCh1aW50MzJfdCkoZG1hX2Jhc2VfYWRkciArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFOTkVMX09GRlNFVF9UQUJbQ2hhbm5lbF0pKSkNCi0gICAgICAgICAgICAgICAgICAtPkNNQVIsDQotICAgICAgICAgICAgICBEc3RBZGRyZXNzKTsNCi0gIH0NCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZXQgdGhlIE1lbW9yeSBhZGRyZXNzLg0KLSAqIEBub3RlICAgSW50ZXJmYWNlIHVzZWQgZm9yIGRpcmVjdGlvbiBMTF9ETUFfRElSRUNUSU9OX1BFUklQSF9UT19NRU1PUlkgb3INCi0gKiBMTF9ETUFfRElSRUNUSU9OX01FTU9SWV9UT19QRVJJUEggb25seS4NCi0gKiBAbm90ZSAgIFRoaXMgQVBJIG11c3Qgbm90IGJlIGNhbGxlZCB3aGVuIHRoZSBETUEgY2hhbm5lbCBpcyBlbmFibGVkLg0KLSAqIEBybXRvbGwgQ01BUiAgICAgICAgIE1BICAgICAgICAgICAgTExfRE1BX1NldE1lbW9yeUFkZHJlc3MNCi0gKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQ0KLSAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfOCAoKikNCi0gKiAgICAgICAgICgqKSBOb3Qgb24gYWxsIEc0IGRldmljZXMNCi0gKiBAcGFyYW0gIE1lbW9yeUFkZHJlc3MgQmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMHhGRkZGRkZGRg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9TZXRNZW1vcnlBZGRyZXNzKERNQV9UeXBlRGVmICpETUF4LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgTWVtb3J5QWRkcmVzcykgew0KLSAgdWludDMyX3QgZG1hX2Jhc2VfYWRkciA9ICh1aW50MzJfdClETUF4Ow0KLSAgV1JJVEVfUkVHKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKSgodWludDMyX3QpKGRtYV9iYXNlX2FkZHIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsXSkpKQ0KLSAgICAgICAgICAgICAgICAtPkNNQVIsDQotICAgICAgICAgICAgTWVtb3J5QWRkcmVzcyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IHRoZSBQZXJpcGhlcmFsIGFkZHJlc3MuDQotICogQG5vdGUgICBJbnRlcmZhY2UgdXNlZCBmb3IgZGlyZWN0aW9uIExMX0RNQV9ESVJFQ1RJT05fUEVSSVBIX1RPX01FTU9SWSBvcg0KLSAqIExMX0RNQV9ESVJFQ1RJT05fTUVNT1JZX1RPX1BFUklQSCBvbmx5Lg0KLSAqIEBub3RlICAgVGhpcyBBUEkgbXVzdCBub3QgYmUgY2FsbGVkIHdoZW4gdGhlIERNQSBjaGFubmVsIGlzIGVuYWJsZWQuDQotICogQHJtdG9sbCBDUEFSICAgICAgICAgUEEgICAgICAgICAgICBMTF9ETUFfU2V0UGVyaXBoQWRkcmVzcw0KLSAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlDQotICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNyAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF84ICgqKQ0KLSAqICAgICAgICAgKCopIE5vdCBvbiBhbGwgRzQgZGV2aWNlcw0KLSAqIEBwYXJhbSAgUGVyaXBoQWRkcmVzcyBCZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAweEZGRkZGRkZGDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX1NldFBlcmlwaEFkZHJlc3MoRE1BX1R5cGVEZWYgKkRNQXgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQZXJpcGhBZGRyZXNzKSB7DQotICB1aW50MzJfdCBkbWFfYmFzZV9hZGRyID0gKHVpbnQzMl90KURNQXg7DQotICBXUklURV9SRUcoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCh1aW50MzJfdCkoZG1hX2Jhc2VfYWRkciArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWxdKSkpDQotICAgICAgICAgICAgICAgIC0+Q1BBUiwNCi0gICAgICAgICAgICBQZXJpcGhBZGRyZXNzKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgTWVtb3J5IGFkZHJlc3MuDQotICogQG5vdGUgICBJbnRlcmZhY2UgdXNlZCBmb3IgZGlyZWN0aW9uIExMX0RNQV9ESVJFQ1RJT05fUEVSSVBIX1RPX01FTU9SWSBvcg0KLSAqIExMX0RNQV9ESVJFQ1RJT05fTUVNT1JZX1RPX1BFUklQSCBvbmx5Lg0KLSAqIEBybXRvbGwgQ01BUiAgICAgICAgIE1BICAgICAgICAgICAgTExfRE1BX0dldE1lbW9yeUFkZHJlc3MNCi0gKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQ0KLSAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfOCAoKikNCi0gKiAgICAgICAgICgqKSBOb3Qgb24gYWxsIEc0IGRldmljZXMNCi0gKiBAcmV0dmFsIEJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDB4RkZGRkZGRkYNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0dldE1lbW9yeUFkZHJlc3MoRE1BX1R5cGVEZWYgKkRNQXgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpIHsNCi0gIHVpbnQzMl90IGRtYV9iYXNlX2FkZHIgPSAodWludDMyX3QpRE1BeDsNCi0gIHJldHVybiAoUkVBRF9SRUcoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCgNCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCkoZG1hX2Jhc2VfYWRkciArIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsXSkpKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgLT5DTUFSKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IFBlcmlwaGVyYWwgYWRkcmVzcy4NCi0gKiBAbm90ZSAgIEludGVyZmFjZSB1c2VkIGZvciBkaXJlY3Rpb24gTExfRE1BX0RJUkVDVElPTl9QRVJJUEhfVE9fTUVNT1JZIG9yDQotICogTExfRE1BX0RJUkVDVElPTl9NRU1PUllfVE9fUEVSSVBIIG9ubHkuDQotICogQHJtdG9sbCBDUEFSICAgICAgICAgUEEgICAgICAgICAgICBMTF9ETUFfR2V0UGVyaXBoQWRkcmVzcw0KLSAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlDQotICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNyAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF84ICgqKQ0KLSAqICAgICAgICAgKCopIE5vdCBvbiBhbGwgRzQgZGV2aWNlcw0KLSAqIEByZXR2YWwgQmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMHhGRkZGRkZGRg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfR2V0UGVyaXBoQWRkcmVzcyhETUFfVHlwZURlZiAqRE1BeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCkgew0KLSAgdWludDMyX3QgZG1hX2Jhc2VfYWRkciA9ICh1aW50MzJfdClETUF4Ow0KLSAgcmV0dXJuIChSRUFEX1JFRygoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KShkbWFfYmFzZV9hZGRyICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWxdKSkpDQotICAgICAgICAgICAgICAgICAgICAgICAtPkNQQVIpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZXQgdGhlIE1lbW9yeSB0byBNZW1vcnkgU291cmNlIGFkZHJlc3MuDQotICogQG5vdGUgICBJbnRlcmZhY2UgdXNlZCBmb3IgZGlyZWN0aW9uIExMX0RNQV9ESVJFQ1RJT05fTUVNT1JZX1RPX01FTU9SWSBvbmx5Lg0KLSAqIEBub3RlICAgVGhpcyBBUEkgbXVzdCBub3QgYmUgY2FsbGVkIHdoZW4gdGhlIERNQSBjaGFubmVsIGlzIGVuYWJsZWQuDQotICogQHJtdG9sbCBDUEFSICAgICAgICAgUEEgICAgICAgICAgICBMTF9ETUFfU2V0TTJNU3JjQWRkcmVzcw0KLSAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlDQotICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNyAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF84ICgqKQ0KLSAqICAgICAgICAgKCopIE5vdCBvbiBhbGwgRzQgZGV2aWNlcw0KLSAqIEBwYXJhbSAgTWVtb3J5QWRkcmVzcyBCZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAweEZGRkZGRkZGDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX1NldE0yTVNyY0FkZHJlc3MoRE1BX1R5cGVEZWYgKkRNQXgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBNZW1vcnlBZGRyZXNzKSB7DQotICB1aW50MzJfdCBkbWFfYmFzZV9hZGRyID0gKHVpbnQzMl90KURNQXg7DQotICBXUklURV9SRUcoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCh1aW50MzJfdCkoZG1hX2Jhc2VfYWRkciArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWxdKSkpDQotICAgICAgICAgICAgICAgIC0+Q1BBUiwNCi0gICAgICAgICAgICBNZW1vcnlBZGRyZXNzKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZXQgdGhlIE1lbW9yeSB0byBNZW1vcnkgRGVzdGluYXRpb24gYWRkcmVzcy4NCi0gKiBAbm90ZSAgIEludGVyZmFjZSB1c2VkIGZvciBkaXJlY3Rpb24gTExfRE1BX0RJUkVDVElPTl9NRU1PUllfVE9fTUVNT1JZIG9ubHkuDQotICogQG5vdGUgICBUaGlzIEFQSSBtdXN0IG5vdCBiZSBjYWxsZWQgd2hlbiB0aGUgRE1BIGNoYW5uZWwgaXMgZW5hYmxlZC4NCi0gKiBAcm10b2xsIENNQVIgICAgICAgICBNQSAgICAgICAgICAgIExMX0RNQV9TZXRNMk1Ec3RBZGRyZXNzDQotICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UNCi0gKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83ICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzggKCopDQotICogICAgICAgICAoKikgTm90IG9uIGFsbCBHNCBkZXZpY2VzDQotICogQHBhcmFtICBNZW1vcnlBZGRyZXNzIEJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDB4RkZGRkZGRkYNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfU2V0TTJNRHN0QWRkcmVzcyhETUFfVHlwZURlZiAqRE1BeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE1lbW9yeUFkZHJlc3MpIHsNCi0gIHVpbnQzMl90IGRtYV9iYXNlX2FkZHIgPSAodWludDMyX3QpRE1BeDsNCi0gIFdSSVRFX1JFRygoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKHVpbnQzMl90KShkbWFfYmFzZV9hZGRyICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFOTkVMX09GRlNFVF9UQUJbQ2hhbm5lbF0pKSkNCi0gICAgICAgICAgICAgICAgLT5DTUFSLA0KLSAgICAgICAgICAgIE1lbW9yeUFkZHJlc3MpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCB0aGUgTWVtb3J5IHRvIE1lbW9yeSBTb3VyY2UgYWRkcmVzcy4NCi0gKiBAbm90ZSAgIEludGVyZmFjZSB1c2VkIGZvciBkaXJlY3Rpb24gTExfRE1BX0RJUkVDVElPTl9NRU1PUllfVE9fTUVNT1JZIG9ubHkuDQotICogQHJtdG9sbCBDUEFSICAgICAgICAgUEEgICAgICAgICAgICBMTF9ETUFfR2V0TTJNU3JjQWRkcmVzcw0KLSAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlDQotICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNyAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF84ICgqKQ0KLSAqICAgICAgICAgKCopIE5vdCBvbiBhbGwgRzQgZGV2aWNlcw0KLSAqIEByZXR2YWwgQmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMHhGRkZGRkZGRg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfR2V0TTJNU3JjQWRkcmVzcyhETUFfVHlwZURlZiAqRE1BeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCkgew0KLSAgdWludDMyX3QgZG1hX2Jhc2VfYWRkciA9ICh1aW50MzJfdClETUF4Ow0KLSAgcmV0dXJuIChSRUFEX1JFRygoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KShkbWFfYmFzZV9hZGRyICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWxdKSkpDQotICAgICAgICAgICAgICAgICAgICAgICAtPkNQQVIpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgdGhlIE1lbW9yeSB0byBNZW1vcnkgRGVzdGluYXRpb24gYWRkcmVzcy4NCi0gKiBAbm90ZSAgIEludGVyZmFjZSB1c2VkIGZvciBkaXJlY3Rpb24gTExfRE1BX0RJUkVDVElPTl9NRU1PUllfVE9fTUVNT1JZIG9ubHkuDQotICogQHJtdG9sbCBDTUFSICAgICAgICAgTUEgICAgICAgICAgICBMTF9ETUFfR2V0TTJNRHN0QWRkcmVzcw0KLSAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlDQotICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNyAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF84ICgqKQ0KLSAqICAgICAgICAgKCopIE5vdCBvbiBhbGwgRzQgZGV2aWNlcw0KLSAqIEByZXR2YWwgQmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMHhGRkZGRkZGRg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfR2V0TTJNRHN0QWRkcmVzcyhETUFfVHlwZURlZiAqRE1BeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCkgew0KLSAgdWludDMyX3QgZG1hX2Jhc2VfYWRkciA9ICh1aW50MzJfdClETUF4Ow0KLSAgcmV0dXJuIChSRUFEX1JFRygoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KShkbWFfYmFzZV9hZGRyICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWxdKSkpDQotICAgICAgICAgICAgICAgICAgICAgICAtPkNNQVIpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZXQgRE1BIHJlcXVlc3QgZm9yIERNQSBpbnN0YW5jZSBvbiBDaGFubmVsIHguDQotICogQG5vdGUgICBQbGVhc2UgcmVmZXIgdG8gUmVmZXJlbmNlIE1hbnVhbCB0byBnZXQgdGhlIGF2YWlsYWJsZSBtYXBwaW5nIG9mDQotICogUmVxdWVzdCB2YWx1ZSBsaW5rIHRvIENoYW5uZWwgU2VsZWN0aW9uLg0KLSAqIEBybXRvbGwgQ1NFTFIgICAgICAgIEMxUyAgICAgICAgICAgTExfRE1BX1NldFBlcmlwaFJlcXVlc3Rcbg0KLSAqICAgICAgICAgQ1NFTFIgICAgICAgIEMyUyAgICAgICAgICAgTExfRE1BX1NldFBlcmlwaFJlcXVlc3Rcbg0KLSAqICAgICAgICAgQ1NFTFIgICAgICAgIEMzUyAgICAgICAgICAgTExfRE1BX1NldFBlcmlwaFJlcXVlc3Rcbg0KLSAqICAgICAgICAgQ1NFTFIgICAgICAgIEM0UyAgICAgICAgICAgTExfRE1BX1NldFBlcmlwaFJlcXVlc3Rcbg0KLSAqICAgICAgICAgQ1NFTFIgICAgICAgIEM1UyAgICAgICAgICAgTExfRE1BX1NldFBlcmlwaFJlcXVlc3Rcbg0KLSAqICAgICAgICAgQ1NFTFIgICAgICAgIEM2UyAgICAgICAgICAgTExfRE1BX1NldFBlcmlwaFJlcXVlc3Rcbg0KLSAqICAgICAgICAgQ1NFTFIgICAgICAgIEM3UyAgICAgICAgICAgTExfRE1BX1NldFBlcmlwaFJlcXVlc3QNCi0gKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQ0KLSAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfOCAoKikNCi0gKiAgICAgICAgICgqKSBOb3Qgb24gYWxsIEc0IGRldmljZXMNCi0gKiBAcGFyYW0gIFBlcmlwaFJlcXVlc3QgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX01FTTJNRU0NCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTkVSQVRPUjANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTkVSQVRPUjENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTkVSQVRPUjINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTkVSQVRPUjMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0FEQzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0RBQzFfQ0gxDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9EQUMxX0NIMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNNl9VUA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNN19VUA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfU1BJMV9SWA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfU1BJMV9UWA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfU1BJMl9SWA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfU1BJMl9UWA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfU1BJM19SWA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfU1BJM19UWA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfSTJDMV9SWA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfSTJDMV9UWA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfSTJDMl9SWA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfSTJDMl9UWA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfSTJDM19SWA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfSTJDM19UWCAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0kyQzRfUlggKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9JMkM0X1RYDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9VU0FSVDFfUlgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1VTQVJUMV9UWA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVVNBUlQyX1JYDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9VU0FSVDJfVFgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1VTQVJUM19SWA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVVNBUlQzX1RYDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9VQVJUNF9SWA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVUFSVDRfVFgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1VBUlQ1X1JYICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVUFSVDVfVFggKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9MUFVBUlQxX1JYDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9MUFVBUlQxX1RYDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9BREMyDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9BREMzICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfQURDNCAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0FEQzUgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9RU1BJICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfREFDMl9DSDEgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xX0NIMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMV9DSDINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTFfQ0gzDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xX0NINA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMV9VUA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMV9UUklHDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xX0NPTQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNOF9DSDENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTThfQ0gyDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU04X0NIMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNOF9DSDQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTThfVVANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTThfVFJJRw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNOF9DT00NCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTJfQ0gxDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yX0NIMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMl9DSDMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTJfQ0g0DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yX1VQDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0zX0NIMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNM19DSDINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTNfQ0gzDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0zX0NINA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNM19VUA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNM19UUklHDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU00X0NIMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNNF9DSDINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTRfQ0gzDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU00X0NINA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNNF9VUA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNNV9DSDEgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU01X0NIMiAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTVfQ0gzICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNNV9DSDQgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU01X1VQICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNNV9UUklHICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMTVfQ0gxDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xNV9VUA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMTVfVFJJRw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMTVfQ09NDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xNl9DSDENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTE2X1VQDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xN19DSDENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTE3X1VQDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yMF9DSDEgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yMF9DSDIgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yMF9DSDMgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yMF9DSDQgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yMF9VUCAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0FFU19JTg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfQUVTX09VVA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMjBfVFJJRyAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTIwX0NPTSAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0hSVElNMV9NICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfSFJUSU0xX0EgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9IUlRJTTFfQiAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0hSVElNMV9DICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfSFJUSU0xX0QgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9IUlRJTTFfRSAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0hSVElNMV9GICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfREFDM19DSDENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0RBQzNfQ0gyDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9EQUM0X0NIMSAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0RBQzRfQ0gyICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfU1BJNF9SWCAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1NQSTRfVFggKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9TQUkxX0ENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1NBSTFfQg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfRk1BQ19XUklURQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfRk1BQ19SRUFEDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9DT1JESUNfV1JJVEUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0NPUkRJQ19SRUFEDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9VQ1BEMV9SWA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVUNQRDFfVFgNCi0gKiAgICAgICAgICgqKSBOb3Qgb24gYWxsIEc0IGRldmljZXMNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfU2V0UGVyaXBoUmVxdWVzdChETUFfVHlwZURlZiAqRE1BeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFBlcmlwaFJlcXVlc3QpIHsNCi0gIHVpbnQzMl90IGRtYW11eF9jY3Jfb2Zmc2V0ID0NCi0gICAgICAoKCgodWludDMyX3QpRE1BeCBeICh1aW50MzJfdClETUExKSA+PiAxMFUpICogOFUpOw0KLSAgTU9ESUZZX1JFRygoRE1BTVVYMV9DaGFubmVsMCArIENoYW5uZWwgKyBkbWFtdXhfY2NyX29mZnNldCktPkNDUiwNCi0gICAgICAgICAgICAgRE1BTVVYX0N4Q1JfRE1BUkVRX0lELCBQZXJpcGhSZXF1ZXN0KTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgRE1BIHJlcXVlc3QgZm9yIERNQSBpbnN0YW5jZSBvbiBDaGFubmVsIHguDQotICogQHJtdG9sbCBDU0VMUiAgICAgICAgQzFTICAgICAgICAgICBMTF9ETUFfR2V0UGVyaXBoUmVxdWVzdFxuDQotICogICAgICAgICBDU0VMUiAgICAgICAgQzJTICAgICAgICAgICBMTF9ETUFfR2V0UGVyaXBoUmVxdWVzdFxuDQotICogICAgICAgICBDU0VMUiAgICAgICAgQzNTICAgICAgICAgICBMTF9ETUFfR2V0UGVyaXBoUmVxdWVzdFxuDQotICogICAgICAgICBDU0VMUiAgICAgICAgQzRTICAgICAgICAgICBMTF9ETUFfR2V0UGVyaXBoUmVxdWVzdFxuDQotICogICAgICAgICBDU0VMUiAgICAgICAgQzVTICAgICAgICAgICBMTF9ETUFfR2V0UGVyaXBoUmVxdWVzdFxuDQotICogICAgICAgICBDU0VMUiAgICAgICAgQzZTICAgICAgICAgICBMTF9ETUFfR2V0UGVyaXBoUmVxdWVzdFxuDQotICogICAgICAgICBDU0VMUiAgICAgICAgQzdTICAgICAgICAgICBMTF9ETUFfR2V0UGVyaXBoUmVxdWVzdA0KLSAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlDQotICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNyAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF84ICgqKQ0KLSAqICAgICAgICAgKCopIE5vdCBvbiBhbGwgRzQgZGV2aWNlcw0KLSAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX01FTTJNRU0NCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTkVSQVRPUjANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTkVSQVRPUjENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTkVSQVRPUjINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTkVSQVRPUjMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0FEQzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0RBQzFfQ0gxDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9EQUMxX0NIMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNNl9VUA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNN19VUA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfU1BJMV9SWA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfU1BJMV9UWA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfU1BJMl9SWA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfU1BJMl9UWA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfU1BJM19SWA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfU1BJM19UWA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfSTJDMV9SWA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfSTJDMV9UWA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfSTJDMl9SWA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfSTJDMl9UWA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfSTJDM19SWA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfSTJDM19UWCAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0kyQzRfUlggKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9JMkM0X1RYDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9VU0FSVDFfUlgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1VTQVJUMV9UWA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVVNBUlQyX1JYDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9VU0FSVDJfVFgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1VTQVJUM19SWA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVVNBUlQzX1RYDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9VQVJUNF9SWA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVUFSVDRfVFgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1VBUlQ1X1JYICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVUFSVDVfVFggKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9MUFVBUlQxX1JYDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9MUFVBUlQxX1RYDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9BREMyDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9BREMzICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfQURDNCAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0FEQzUgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9RU1BJICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfREFDMl9DSDEgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xX0NIMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMV9DSDINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTFfQ0gzDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xX0NINA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMV9VUA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMV9UUklHDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xX0NPTQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNOF9DSDENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTThfQ0gyDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU04X0NIMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNOF9DSDQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTThfVVANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTThfVFJJRw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNOF9DT00NCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTJfQ0gxDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yX0NIMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMl9DSDMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTJfQ0g0DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yX1VQDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0zX0NIMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNM19DSDINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTNfQ0gzDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0zX0NINA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNM19VUA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNM19UUklHDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU00X0NIMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNNF9DSDINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTRfQ0gzDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU00X0NINA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNNF9VUA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNNV9DSDEgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU01X0NIMiAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTVfQ0gzICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNNV9DSDQgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU01X1VQICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNNV9UUklHICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMTVfQ0gxDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xNV9VUA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMTVfVFJJRw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMTVfQ09NDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xNl9DSDENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTE2X1VQDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xN19DSDENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTE3X1VQDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yMF9DSDEgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yMF9DSDIgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yMF9DSDMgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yMF9DSDQgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yMF9VUCAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0FFU19JTg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfQUVTX09VVA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMjBfVFJJRyAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTIwX0NPTSAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0hSVElNMV9NICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfSFJUSU0xX0EgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9IUlRJTTFfQiAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0hSVElNMV9DICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfSFJUSU0xX0QgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9IUlRJTTFfRSAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0hSVElNMV9GICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfREFDM19DSDENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0RBQzNfQ0gyDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9EQUM0X0NIMSAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0RBQzRfQ0gyICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfU1BJNF9SWCAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1NQSTRfVFggKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9TQUkxX0ENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1NBSTFfQg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfRk1BQ19XUklURQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfRk1BQ19SRUFEDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9DT1JESUNfV1JJVEUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0NPUkRJQ19SRUFEDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9VQ1BEMV9SWA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVUNQRDFfVFgNCi0gKiAgICAgICAgICgqKSBOb3Qgb24gYWxsIEc0IGRldmljZXMNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0dldFBlcmlwaFJlcXVlc3QoRE1BX1R5cGVEZWYgKkRNQXgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpIHsNCi0gIHVpbnQzMl90IGRtYW11eF9jY3Jfb2Zmc2V0ID0NCi0gICAgICAoKCgodWludDMyX3QpRE1BeCBeICh1aW50MzJfdClETUExKSA+PiAxMFUpICogOFUpOw0KLSAgcmV0dXJuIChSRUFEX0JJVCgoRE1BTVVYMV9DaGFubmVsMCArIENoYW5uZWwgKyBkbWFtdXhfY2NyX29mZnNldCktPkNDUiwNCi0gICAgICAgICAgICAgICAgICAgRE1BTVVYX0N4Q1JfRE1BUkVRX0lEKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBETUFfTExfRUZfRkxBR19NYW5hZ2VtZW50IEZMQUdfTWFuYWdlbWVudA0KLSAqIEB7DQotICovDQotDQotLyoqDQotICogQGJyaWVmICBHZXQgQ2hhbm5lbCAxIGdsb2JhbCBpbnRlcnJ1cHQgZmxhZy4NCi0gKiBAcm10b2xsIElTUiAgICAgICAgICBHSUYxICAgICAgICAgIExMX0RNQV9Jc0FjdGl2ZUZsYWdfR0kxDQotICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19HSTEoRE1BX1R5cGVEZWYgKkRNQXgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9HSUYxKSA9PSAoRE1BX0lTUl9HSUYxKSkgPyAxVUwgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBDaGFubmVsIDIgZ2xvYmFsIGludGVycnVwdCBmbGFnLg0KLSAqIEBybXRvbGwgSVNSICAgICAgICAgIEdJRjIgICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19HSTINCi0gKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNBY3RpdmVGbGFnX0dJMihETUFfVHlwZURlZiAqRE1BeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoRE1BeC0+SVNSLCBETUFfSVNSX0dJRjIpID09IChETUFfSVNSX0dJRjIpKSA/IDFVTCA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IENoYW5uZWwgMyBnbG9iYWwgaW50ZXJydXB0IGZsYWcuDQotICogQHJtdG9sbCBJU1IgICAgICAgICAgR0lGMyAgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX0dJMw0KLSAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfR0kzKERNQV9UeXBlRGVmICpETUF4KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfR0lGMykgPT0gKERNQV9JU1JfR0lGMykpID8gMVVMIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgQ2hhbm5lbCA0IGdsb2JhbCBpbnRlcnJ1cHQgZmxhZy4NCi0gKiBAcm10b2xsIElTUiAgICAgICAgICBHSUY0ICAgICAgICAgIExMX0RNQV9Jc0FjdGl2ZUZsYWdfR0k0DQotICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19HSTQoRE1BX1R5cGVEZWYgKkRNQXgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9HSUY0KSA9PSAoRE1BX0lTUl9HSUY0KSkgPyAxVUwgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBDaGFubmVsIDUgZ2xvYmFsIGludGVycnVwdCBmbGFnLg0KLSAqIEBybXRvbGwgSVNSICAgICAgICAgIEdJRjUgICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19HSTUNCi0gKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNBY3RpdmVGbGFnX0dJNShETUFfVHlwZURlZiAqRE1BeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoRE1BeC0+SVNSLCBETUFfSVNSX0dJRjUpID09IChETUFfSVNSX0dJRjUpKSA/IDFVTCA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IENoYW5uZWwgNiBnbG9iYWwgaW50ZXJydXB0IGZsYWcuDQotICogQHJtdG9sbCBJU1IgICAgICAgICAgR0lGNiAgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX0dJNg0KLSAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfR0k2KERNQV9UeXBlRGVmICpETUF4KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfR0lGNikgPT0gKERNQV9JU1JfR0lGNikpID8gMVVMIDogMFVMKTsNCi19DQotDQotI2lmIGRlZmluZWQoRE1BMV9DaGFubmVsNykNCi0vKioNCi0gKiBAYnJpZWYgIEdldCBDaGFubmVsIDcgZ2xvYmFsIGludGVycnVwdCBmbGFnLg0KLSAqIEBybXRvbGwgSVNSICAgICAgICAgIEdJRjcgICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19HSTcNCi0gKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNBY3RpdmVGbGFnX0dJNyhETUFfVHlwZURlZiAqRE1BeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoRE1BeC0+SVNSLCBETUFfSVNSX0dJRjcpID09IChETUFfSVNSX0dJRjcpKSA/IDFVTCA6IDBVTCk7DQotfQ0KLSNlbmRpZiAvKiBETUExX0NoYW5uZWw3ICovDQotDQotI2lmIGRlZmluZWQoRE1BMV9DaGFubmVsOCkNCi0vKioNCi0gKiBAYnJpZWYgIEdldCBDaGFubmVsIDggZ2xvYmFsIGludGVycnVwdCBmbGFnLg0KLSAqIEBybXRvbGwgSVNSICAgICAgICAgIEdJRjggICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19HSTgNCi0gKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNBY3RpdmVGbGFnX0dJOChETUFfVHlwZURlZiAqRE1BeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoRE1BeC0+SVNSLCBETUFfSVNSX0dJRjgpID09IChETUFfSVNSX0dJRjgpKSA/IDFVTCA6IDBVTCk7DQotfQ0KLSNlbmRpZiAvKiBETUExX0NoYW5uZWw4ICovDQotDQotLyoqDQotICogQGJyaWVmICBHZXQgQ2hhbm5lbCAxIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuDQotICogQHJtdG9sbCBJU1IgICAgICAgICAgVENJRjEgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX1RDMQ0KLSAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEMxKERNQV9UeXBlRGVmICpETUF4KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfVENJRjEpID09IChETUFfSVNSX1RDSUYxKSkgPyAxVUwgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBDaGFubmVsIDIgdHJhbnNmZXIgY29tcGxldGUgZmxhZy4NCi0gKiBAcm10b2xsIElTUiAgICAgICAgICBUQ0lGMiAgICAgICAgIExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEMyDQotICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19UQzIoRE1BX1R5cGVEZWYgKkRNQXgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9UQ0lGMikgPT0gKERNQV9JU1JfVENJRjIpKSA/IDFVTCA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IENoYW5uZWwgMyB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnLg0KLSAqIEBybXRvbGwgSVNSICAgICAgICAgIFRDSUYzICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19UQzMNCi0gKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNBY3RpdmVGbGFnX1RDMyhETUFfVHlwZURlZiAqRE1BeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoRE1BeC0+SVNSLCBETUFfSVNSX1RDSUYzKSA9PSAoRE1BX0lTUl9UQ0lGMykpID8gMVVMIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgQ2hhbm5lbCA0IHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuDQotICogQHJtdG9sbCBJU1IgICAgICAgICAgVENJRjQgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX1RDNA0KLSAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEM0KERNQV9UeXBlRGVmICpETUF4KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfVENJRjQpID09IChETUFfSVNSX1RDSUY0KSkgPyAxVUwgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBDaGFubmVsIDUgdHJhbnNmZXIgY29tcGxldGUgZmxhZy4NCi0gKiBAcm10b2xsIElTUiAgICAgICAgICBUQ0lGNSAgICAgICAgIExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEM1DQotICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19UQzUoRE1BX1R5cGVEZWYgKkRNQXgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9UQ0lGNSkgPT0gKERNQV9JU1JfVENJRjUpKSA/IDFVTCA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IENoYW5uZWwgNiB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnLg0KLSAqIEBybXRvbGwgSVNSICAgICAgICAgIFRDSUY2ICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19UQzYNCi0gKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNBY3RpdmVGbGFnX1RDNihETUFfVHlwZURlZiAqRE1BeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoRE1BeC0+SVNSLCBETUFfSVNSX1RDSUY2KSA9PSAoRE1BX0lTUl9UQ0lGNikpID8gMVVMIDogMFVMKTsNCi19DQotDQotI2lmIGRlZmluZWQoRE1BMV9DaGFubmVsNykNCi0vKioNCi0gKiBAYnJpZWYgIEdldCBDaGFubmVsIDcgdHJhbnNmZXIgY29tcGxldGUgZmxhZy4NCi0gKiBAcm10b2xsIElTUiAgICAgICAgICBUQ0lGNyAgICAgICAgIExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEM3DQotICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19UQzcoRE1BX1R5cGVEZWYgKkRNQXgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9UQ0lGNykgPT0gKERNQV9JU1JfVENJRjcpKSA/IDFVTCA6IDBVTCk7DQotfQ0KLSNlbmRpZiAvKiBETUExX0NoYW5uZWw3ICovDQotDQotI2lmIGRlZmluZWQoRE1BMV9DaGFubmVsOCkNCi0vKioNCi0gKiBAYnJpZWYgIEdldCBDaGFubmVsIDggdHJhbnNmZXIgY29tcGxldGUgZmxhZy4NCi0gKiBAcm10b2xsIElTUiAgICAgICAgICBUQ0lGOCAgICAgICAgIExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEM4DQotICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19UQzgoRE1BX1R5cGVEZWYgKkRNQXgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9UQ0lGOCkgPT0gKERNQV9JU1JfVENJRjgpKSA/IDFVTCA6IDBVTCk7DQotfQ0KLSNlbmRpZiAvKiBETUExX0NoYW5uZWw4ICovDQotDQotLyoqDQotICogQGJyaWVmICBHZXQgQ2hhbm5lbCAxIGhhbGYgdHJhbnNmZXIgZmxhZy4NCi0gKiBAcm10b2xsIElTUiAgICAgICAgICBIVElGMSAgICAgICAgIExMX0RNQV9Jc0FjdGl2ZUZsYWdfSFQxDQotICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19IVDEoRE1BX1R5cGVEZWYgKkRNQXgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9IVElGMSkgPT0gKERNQV9JU1JfSFRJRjEpKSA/IDFVTCA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IENoYW5uZWwgMiBoYWxmIHRyYW5zZmVyIGZsYWcuDQotICogQHJtdG9sbCBJU1IgICAgICAgICAgSFRJRjIgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX0hUMg0KLSAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfSFQyKERNQV9UeXBlRGVmICpETUF4KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfSFRJRjIpID09IChETUFfSVNSX0hUSUYyKSkgPyAxVUwgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBDaGFubmVsIDMgaGFsZiB0cmFuc2ZlciBmbGFnLg0KLSAqIEBybXRvbGwgSVNSICAgICAgICAgIEhUSUYzICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19IVDMNCi0gKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNBY3RpdmVGbGFnX0hUMyhETUFfVHlwZURlZiAqRE1BeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoRE1BeC0+SVNSLCBETUFfSVNSX0hUSUYzKSA9PSAoRE1BX0lTUl9IVElGMykpID8gMVVMIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgQ2hhbm5lbCA0IGhhbGYgdHJhbnNmZXIgZmxhZy4NCi0gKiBAcm10b2xsIElTUiAgICAgICAgICBIVElGNCAgICAgICAgIExMX0RNQV9Jc0FjdGl2ZUZsYWdfSFQ0DQotICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19IVDQoRE1BX1R5cGVEZWYgKkRNQXgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9IVElGNCkgPT0gKERNQV9JU1JfSFRJRjQpKSA/IDFVTCA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IENoYW5uZWwgNSBoYWxmIHRyYW5zZmVyIGZsYWcuDQotICogQHJtdG9sbCBJU1IgICAgICAgICAgSFRJRjUgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX0hUNQ0KLSAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfSFQ1KERNQV9UeXBlRGVmICpETUF4KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfSFRJRjUpID09IChETUFfSVNSX0hUSUY1KSkgPyAxVUwgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBDaGFubmVsIDYgaGFsZiB0cmFuc2ZlciBmbGFnLg0KLSAqIEBybXRvbGwgSVNSICAgICAgICAgIEhUSUY2ICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19IVDYNCi0gKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNBY3RpdmVGbGFnX0hUNihETUFfVHlwZURlZiAqRE1BeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoRE1BeC0+SVNSLCBETUFfSVNSX0hUSUY2KSA9PSAoRE1BX0lTUl9IVElGNikpID8gMVVMIDogMFVMKTsNCi19DQotDQotI2lmIGRlZmluZWQoRE1BMV9DaGFubmVsOCkNCi0vKioNCi0gKiBAYnJpZWYgIEdldCBDaGFubmVsIDcgaGFsZiB0cmFuc2ZlciBmbGFnLg0KLSAqIEBybXRvbGwgSVNSICAgICAgICAgIEhUSUY3ICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19IVDcNCi0gKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNBY3RpdmVGbGFnX0hUNyhETUFfVHlwZURlZiAqRE1BeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoRE1BeC0+SVNSLCBETUFfSVNSX0hUSUY3KSA9PSAoRE1BX0lTUl9IVElGNykpID8gMVVMIDogMFVMKTsNCi19DQotI2VuZGlmIC8qIERNQTFfQ2hhbm5lbDcgKi8NCi0NCi0jaWYgZGVmaW5lZChETUExX0NoYW5uZWw4KQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IENoYW5uZWwgOCBoYWxmIHRyYW5zZmVyIGZsYWcuDQotICogQHJtdG9sbCBJU1IgICAgICAgICAgSFRJRjggICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX0hUOA0KLSAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfSFQ4KERNQV9UeXBlRGVmICpETUF4KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfSFRJRjgpID09IChETUFfSVNSX0hUSUY4KSkgPyAxVUwgOiAwVUwpOw0KLX0NCi0jZW5kaWYgLyogRE1BMV9DaGFubmVsOCAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IENoYW5uZWwgMSB0cmFuc2ZlciBlcnJvciBmbGFnLg0KLSAqIEBybXRvbGwgSVNSICAgICAgICAgIFRFSUYxICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19URTENCi0gKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNBY3RpdmVGbGFnX1RFMShETUFfVHlwZURlZiAqRE1BeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoRE1BeC0+SVNSLCBETUFfSVNSX1RFSUYxKSA9PSAoRE1BX0lTUl9URUlGMSkpID8gMVVMIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgQ2hhbm5lbCAyIHRyYW5zZmVyIGVycm9yIGZsYWcuDQotICogQHJtdG9sbCBJU1IgICAgICAgICAgVEVJRjIgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX1RFMg0KLSAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEUyKERNQV9UeXBlRGVmICpETUF4KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfVEVJRjIpID09IChETUFfSVNSX1RFSUYyKSkgPyAxVUwgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBDaGFubmVsIDMgdHJhbnNmZXIgZXJyb3IgZmxhZy4NCi0gKiBAcm10b2xsIElTUiAgICAgICAgICBURUlGMyAgICAgICAgIExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEUzDQotICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19URTMoRE1BX1R5cGVEZWYgKkRNQXgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9URUlGMykgPT0gKERNQV9JU1JfVEVJRjMpKSA/IDFVTCA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IENoYW5uZWwgNCB0cmFuc2ZlciBlcnJvciBmbGFnLg0KLSAqIEBybXRvbGwgSVNSICAgICAgICAgIFRFSUY0ICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19URTQNCi0gKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNBY3RpdmVGbGFnX1RFNChETUFfVHlwZURlZiAqRE1BeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoRE1BeC0+SVNSLCBETUFfSVNSX1RFSUY0KSA9PSAoRE1BX0lTUl9URUlGNCkpID8gMVVMIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgQ2hhbm5lbCA1IHRyYW5zZmVyIGVycm9yIGZsYWcuDQotICogQHJtdG9sbCBJU1IgICAgICAgICAgVEVJRjUgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX1RFNQ0KLSAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEU1KERNQV9UeXBlRGVmICpETUF4KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfVEVJRjUpID09IChETUFfSVNSX1RFSUY1KSkgPyAxVUwgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBDaGFubmVsIDYgdHJhbnNmZXIgZXJyb3IgZmxhZy4NCi0gKiBAcm10b2xsIElTUiAgICAgICAgICBURUlGNiAgICAgICAgIExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEU2DQotICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19URTYoRE1BX1R5cGVEZWYgKkRNQXgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9URUlGNikgPT0gKERNQV9JU1JfVEVJRjYpKSA/IDFVTCA6IDBVTCk7DQotfQ0KLQ0KLSNpZiBkZWZpbmVkKERNQTFfQ2hhbm5lbDcpDQotLyoqDQotICogQGJyaWVmICBHZXQgQ2hhbm5lbCA3IHRyYW5zZmVyIGVycm9yIGZsYWcuDQotICogQHJtdG9sbCBJU1IgICAgICAgICAgVEVJRjcgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX1RFNw0KLSAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEU3KERNQV9UeXBlRGVmICpETUF4KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfVEVJRjcpID09IChETUFfSVNSX1RFSUY3KSkgPyAxVUwgOiAwVUwpOw0KLX0NCi0jZW5kaWYgLyogRE1BMV9DaGFubmVsNyAqLw0KLQ0KLSNpZiBkZWZpbmVkKERNQTFfQ2hhbm5lbDgpDQotLyoqDQotICogQGJyaWVmICBHZXQgQ2hhbm5lbCA4IHRyYW5zZmVyIGVycm9yIGZsYWcuDQotICogQHJtdG9sbCBJU1IgICAgICAgICAgVEVJRjggICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX1RFOA0KLSAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEU4KERNQV9UeXBlRGVmICpETUF4KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfVEVJRjgpID09IChETUFfSVNSX1RFSUY4KSkgPyAxVUwgOiAwVUwpOw0KLX0NCi0jZW5kaWYgLyogRE1BMV9DaGFubmVsOCAqLw0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgMSBnbG9iYWwgaW50ZXJydXB0IGZsYWcuDQotICAqIEBub3RlIERvIG5vdCBDbGVhciBDaGFubmVsIDEgZ2xvYmFsIGludGVycnVwdCBmbGFnIHdoZW4gdGhlIGNoYW5uZWwgaW4gT04uDQotICAgIEluc3RlYWQgY2xlYXIgc3BlY2lmaWMgZmxhZ3MgdHJhbnNmZXIgY29tcGxldGUsIGhhbGYgdHJhbnNmZXIgJiB0cmFuc2Zlcg0KLSAgICBlcnJvciBmbGFnIHdpdGggTExfRE1BX0NsZWFyRmxhZ19UQzEsIExMX0RNQV9DbGVhckZsYWdfSFQxLA0KLSAgICBMTF9ETUFfQ2xlYXJGbGFnX1RFMS4gYnVnIGlkIDIuMy4xIGluIFByb2R1Y3QgRXJyYXRhIFNoZWV0Lg0KLSAgKiBAcm10b2xsIElGQ1IgICAgICAgICBDR0lGMSAgICAgICAgIExMX0RNQV9DbGVhckZsYWdfR0kxDQotICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX0dJMShETUFfVHlwZURlZiAqRE1BeCkgew0KLSAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NHSUYxKTsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCAyIGdsb2JhbCBpbnRlcnJ1cHQgZmxhZy4NCi0gICogQG5vdGUgRG8gbm90IENsZWFyIENoYW5uZWwgMiBnbG9iYWwgaW50ZXJydXB0IGZsYWcgd2hlbiB0aGUgY2hhbm5lbCBpbiBPTi4NCi0gICAgSW5zdGVhZCBjbGVhciBzcGVjaWZpYyBmbGFncyB0cmFuc2ZlciBjb21wbGV0ZSwgaGFsZiB0cmFuc2ZlciAmIHRyYW5zZmVyDQotICAgIGVycm9yIGZsYWcgd2l0aCBMTF9ETUFfQ2xlYXJGbGFnX1RDMiwgTExfRE1BX0NsZWFyRmxhZ19IVDIsDQotICAgIExMX0RNQV9DbGVhckZsYWdfVEUyLiBidWcgaWQgMi4zLjEgaW4gUHJvZHVjdCBFcnJhdGEgU2hlZXQuDQotICAqIEBybXRvbGwgSUZDUiAgICAgICAgIENHSUYyICAgICAgICAgTExfRE1BX0NsZWFyRmxhZ19HSTINCi0gICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UNCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9DbGVhckZsYWdfR0kyKERNQV9UeXBlRGVmICpETUF4KSB7DQotICBXUklURV9SRUcoRE1BeC0+SUZDUiwgRE1BX0lGQ1JfQ0dJRjIpOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBDbGVhciBDaGFubmVsIDMgZ2xvYmFsIGludGVycnVwdCBmbGFnLg0KLSAgKiBAbm90ZSBEbyBub3QgQ2xlYXIgQ2hhbm5lbCAzIGdsb2JhbCBpbnRlcnJ1cHQgZmxhZyB3aGVuIHRoZSBjaGFubmVsIGluIE9OLg0KLSAgICBJbnN0ZWFkIGNsZWFyIHNwZWNpZmljIGZsYWdzIHRyYW5zZmVyIGNvbXBsZXRlLCBoYWxmIHRyYW5zZmVyICYgdHJhbnNmZXINCi0gICAgZXJyb3IgZmxhZyB3aXRoIExMX0RNQV9DbGVhckZsYWdfVEMzLCBMTF9ETUFfQ2xlYXJGbGFnX0hUMywNCi0gICAgTExfRE1BX0NsZWFyRmxhZ19URTMuIGJ1ZyBpZCAyLjMuMSBpbiBQcm9kdWN0IEVycmF0YSBTaGVldC4NCi0gICogQHJtdG9sbCBJRkNSICAgICAgICAgQ0dJRjMgICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX0dJMw0KLSAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQ0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0NsZWFyRmxhZ19HSTMoRE1BX1R5cGVEZWYgKkRNQXgpIHsNCi0gIFdSSVRFX1JFRyhETUF4LT5JRkNSLCBETUFfSUZDUl9DR0lGMyk7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgNCBnbG9iYWwgaW50ZXJydXB0IGZsYWcuDQotICAqIEBub3RlIERvIG5vdCBDbGVhciBDaGFubmVsIDQgZ2xvYmFsIGludGVycnVwdCBmbGFnIHdoZW4gdGhlIGNoYW5uZWwgaW4gT04uDQotICAgIEluc3RlYWQgY2xlYXIgc3BlY2lmaWMgZmxhZ3MgdHJhbnNmZXIgY29tcGxldGUsIGhhbGYgdHJhbnNmZXIgJiB0cmFuc2Zlcg0KLSAgICBlcnJvciBmbGFnIHdpdGggTExfRE1BX0NsZWFyRmxhZ19UQzQsIExMX0RNQV9DbGVhckZsYWdfSFQ0LA0KLSAgICBMTF9ETUFfQ2xlYXJGbGFnX1RFNC4gYnVnIGlkIDIuMy4xIGluIFByb2R1Y3QgRXJyYXRhIFNoZWV0Lg0KLSAgKiBAcm10b2xsIElGQ1IgICAgICAgICBDR0lGNCAgICAgICAgIExMX0RNQV9DbGVhckZsYWdfR0k0DQotICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX0dJNChETUFfVHlwZURlZiAqRE1BeCkgew0KLSAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NHSUY0KTsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCA1IGdsb2JhbCBpbnRlcnJ1cHQgZmxhZy4NCi0gICogQG5vdGUgRG8gbm90IENsZWFyIENoYW5uZWwgNSBnbG9iYWwgaW50ZXJydXB0IGZsYWcgd2hlbiB0aGUgY2hhbm5lbCBpbiBPTi4NCi0gICAgSW5zdGVhZCBjbGVhciBzcGVjaWZpYyBmbGFncyB0cmFuc2ZlciBjb21wbGV0ZSwgaGFsZiB0cmFuc2ZlciAmIHRyYW5zZmVyDQotICAgIGVycm9yIGZsYWcgd2l0aCBMTF9ETUFfQ2xlYXJGbGFnX1RDNSwgTExfRE1BX0NsZWFyRmxhZ19IVDUsDQotICAgIExMX0RNQV9DbGVhckZsYWdfVEU1LiBidWcgaWQgMi4zLjEgaW4gUHJvZHVjdCBFcnJhdGEgU2hlZXQuDQotICAqIEBybXRvbGwgSUZDUiAgICAgICAgIENHSUY1ICAgICAgICAgTExfRE1BX0NsZWFyRmxhZ19HSTUNCi0gICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UNCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9DbGVhckZsYWdfR0k1KERNQV9UeXBlRGVmICpETUF4KSB7DQotICBXUklURV9SRUcoRE1BeC0+SUZDUiwgRE1BX0lGQ1JfQ0dJRjUpOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBDbGVhciBDaGFubmVsIDYgZ2xvYmFsIGludGVycnVwdCBmbGFnLg0KLSAgKiBAbm90ZSBEbyBub3QgQ2xlYXIgQ2hhbm5lbCA2IGdsb2JhbCBpbnRlcnJ1cHQgZmxhZyB3aGVuIHRoZSBjaGFubmVsIGluIE9OLg0KLSAgICBJbnN0ZWFkIGNsZWFyIHNwZWNpZmljIGZsYWdzIHRyYW5zZmVyIGNvbXBsZXRlLCBoYWxmIHRyYW5zZmVyICYgdHJhbnNmZXINCi0gICAgZXJyb3IgZmxhZyB3aXRoIExMX0RNQV9DbGVhckZsYWdfVEM2LCBMTF9ETUFfQ2xlYXJGbGFnX0hUNiwNCi0gICAgTExfRE1BX0NsZWFyRmxhZ19URTYuIGJ1ZyBpZCAyLjMuMSBpbiBQcm9kdWN0IEVycmF0YSBTaGVldC4NCi0gICogQHJtdG9sbCBJRkNSICAgICAgICAgQ0dJRjYgICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX0dJNg0KLSAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQ0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0NsZWFyRmxhZ19HSTYoRE1BX1R5cGVEZWYgKkRNQXgpIHsNCi0gIFdSSVRFX1JFRyhETUF4LT5JRkNSLCBETUFfSUZDUl9DR0lGNik7DQotfQ0KLQ0KLSNpZiBkZWZpbmVkKERNQTFfQ2hhbm5lbDcpDQotLyoqDQotICAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCA3IGdsb2JhbCBpbnRlcnJ1cHQgZmxhZy4NCi0gICogQG5vdGUgRG8gbm90IENsZWFyIENoYW5uZWwgNyBnbG9iYWwgaW50ZXJydXB0IGZsYWcgd2hlbiB0aGUgY2hhbm5lbCBpbiBPTi4NCi0gICAgSW5zdGVhZCBjbGVhciBzcGVjaWZpYyBmbGFncyB0cmFuc2ZlciBjb21wbGV0ZSwgaGFsZiB0cmFuc2ZlciAmIHRyYW5zZmVyDQotICAgIGVycm9yIGZsYWcgd2l0aCBMTF9ETUFfQ2xlYXJGbGFnX1RDNywgTExfRE1BX0NsZWFyRmxhZ19IVDcsDQotICAgIExMX0RNQV9DbGVhckZsYWdfVEU3LiBidWcgaWQgMi4zLjEgaW4gUHJvZHVjdCBFcnJhdGEgU2hlZXQuDQotICAqIEBybXRvbGwgSUZDUiAgICAgICAgIENHSUY3ICAgICAgICAgTExfRE1BX0NsZWFyRmxhZ19HSTcNCi0gICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UNCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9DbGVhckZsYWdfR0k3KERNQV9UeXBlRGVmICpETUF4KSB7DQotICBXUklURV9SRUcoRE1BeC0+SUZDUiwgRE1BX0lGQ1JfQ0dJRjcpOw0KLX0NCi0jZW5kaWYgLyogRE1BMV9DaGFubmVsNyAqLw0KLQ0KLSNpZiBkZWZpbmVkKERNQTFfQ2hhbm5lbDgpDQotLyoqDQotICAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCA4IGdsb2JhbCBpbnRlcnJ1cHQgZmxhZy4NCi0gICogQG5vdGUgRG8gbm90IENsZWFyIENoYW5uZWwgOCBnbG9iYWwgaW50ZXJydXB0IGZsYWcgd2hlbiB0aGUgY2hhbm5lbCBpbiBPTi4NCi0gICAgSW5zdGVhZCBjbGVhciBzcGVjaWZpYyBmbGFncyB0cmFuc2ZlciBjb21wbGV0ZSwgaGFsZiB0cmFuc2ZlciAmIHRyYW5zZmVyDQotICAgIGVycm9yIGZsYWcgd2l0aCBMTF9ETUFfQ2xlYXJGbGFnX1RDOCwgTExfRE1BX0NsZWFyRmxhZ19IVDgsDQotICAgIExMX0RNQV9DbGVhckZsYWdfVEU4LiBidWcgaWQgMi4zLjEgaW4gUHJvZHVjdCBFcnJhdGEgU2hlZXQuDQotICAqIEBybXRvbGwgSUZDUiAgICAgICAgIENHSUY4ICAgICAgICAgTExfRE1BX0NsZWFyRmxhZ19HSTgNCi0gICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UNCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9DbGVhckZsYWdfR0k4KERNQV9UeXBlRGVmICpETUF4KSB7DQotICBXUklURV9SRUcoRE1BeC0+SUZDUiwgRE1BX0lGQ1JfQ0dJRjgpOw0KLX0NCi0jZW5kaWYgLyogRE1BMV9DaGFubmVsOCAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCAxICB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnLg0KLSAqIEBybXRvbGwgSUZDUiAgICAgICAgIENUQ0lGMSAgICAgICAgTExfRE1BX0NsZWFyRmxhZ19UQzENCi0gKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9DbGVhckZsYWdfVEMxKERNQV9UeXBlRGVmICpETUF4KSB7DQotICBXUklURV9SRUcoRE1BeC0+SUZDUiwgRE1BX0lGQ1JfQ1RDSUYxKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDbGVhciBDaGFubmVsIDIgIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuDQotICogQHJtdG9sbCBJRkNSICAgICAgICAgQ1RDSUYyICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX1RDMg0KLSAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0NsZWFyRmxhZ19UQzIoRE1BX1R5cGVEZWYgKkRNQXgpIHsNCi0gIFdSSVRFX1JFRyhETUF4LT5JRkNSLCBETUFfSUZDUl9DVENJRjIpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgMyAgdHJhbnNmZXIgY29tcGxldGUgZmxhZy4NCi0gKiBAcm10b2xsIElGQ1IgICAgICAgICBDVENJRjMgICAgICAgIExMX0RNQV9DbGVhckZsYWdfVEMzDQotICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX1RDMyhETUFfVHlwZURlZiAqRE1BeCkgew0KLSAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NUQ0lGMyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCA0ICB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnLg0KLSAqIEBybXRvbGwgSUZDUiAgICAgICAgIENUQ0lGNCAgICAgICAgTExfRE1BX0NsZWFyRmxhZ19UQzQNCi0gKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9DbGVhckZsYWdfVEM0KERNQV9UeXBlRGVmICpETUF4KSB7DQotICBXUklURV9SRUcoRE1BeC0+SUZDUiwgRE1BX0lGQ1JfQ1RDSUY0KTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDbGVhciBDaGFubmVsIDUgIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuDQotICogQHJtdG9sbCBJRkNSICAgICAgICAgQ1RDSUY1ICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX1RDNQ0KLSAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0NsZWFyRmxhZ19UQzUoRE1BX1R5cGVEZWYgKkRNQXgpIHsNCi0gIFdSSVRFX1JFRyhETUF4LT5JRkNSLCBETUFfSUZDUl9DVENJRjUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgNiAgdHJhbnNmZXIgY29tcGxldGUgZmxhZy4NCi0gKiBAcm10b2xsIElGQ1IgICAgICAgICBDVENJRjYgICAgICAgIExMX0RNQV9DbGVhckZsYWdfVEM2DQotICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX1RDNihETUFfVHlwZURlZiAqRE1BeCkgew0KLSAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NUQ0lGNik7DQotfQ0KLQ0KLSNpZiBkZWZpbmVkKERNQTFfQ2hhbm5lbDcpDQotLyoqDQotICogQGJyaWVmICBDbGVhciBDaGFubmVsIDcgIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuDQotICogQHJtdG9sbCBJRkNSICAgICAgICAgQ1RDSUY3ICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX1RDNw0KLSAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0NsZWFyRmxhZ19UQzcoRE1BX1R5cGVEZWYgKkRNQXgpIHsNCi0gIFdSSVRFX1JFRyhETUF4LT5JRkNSLCBETUFfSUZDUl9DVENJRjcpOw0KLX0NCi0jZW5kaWYgLyogRE1BMV9DaGFubmVsNyAqLw0KLQ0KLSNpZiBkZWZpbmVkKERNQTFfQ2hhbm5lbDgpDQotLyoqDQotICogQGJyaWVmICBDbGVhciBDaGFubmVsIDggIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuDQotICogQHJtdG9sbCBJRkNSICAgICAgICAgQ1RDSUY4ICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX1RDOA0KLSAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0NsZWFyRmxhZ19UQzgoRE1BX1R5cGVEZWYgKkRNQXgpIHsNCi0gIFdSSVRFX1JFRyhETUF4LT5JRkNSLCBETUFfSUZDUl9DVENJRjgpOw0KLX0NCi0jZW5kaWYgLyogRE1BMV9DaGFubmVsOCAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCAxICBoYWxmIHRyYW5zZmVyIGZsYWcuDQotICogQHJtdG9sbCBJRkNSICAgICAgICAgQ0hUSUYxICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX0hUMQ0KLSAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0NsZWFyRmxhZ19IVDEoRE1BX1R5cGVEZWYgKkRNQXgpIHsNCi0gIFdSSVRFX1JFRyhETUF4LT5JRkNSLCBETUFfSUZDUl9DSFRJRjEpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgMiAgaGFsZiB0cmFuc2ZlciBmbGFnLg0KLSAqIEBybXRvbGwgSUZDUiAgICAgICAgIENIVElGMiAgICAgICAgTExfRE1BX0NsZWFyRmxhZ19IVDINCi0gKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9DbGVhckZsYWdfSFQyKERNQV9UeXBlRGVmICpETUF4KSB7DQotICBXUklURV9SRUcoRE1BeC0+SUZDUiwgRE1BX0lGQ1JfQ0hUSUYyKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDbGVhciBDaGFubmVsIDMgIGhhbGYgdHJhbnNmZXIgZmxhZy4NCi0gKiBAcm10b2xsIElGQ1IgICAgICAgICBDSFRJRjMgICAgICAgIExMX0RNQV9DbGVhckZsYWdfSFQzDQotICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX0hUMyhETUFfVHlwZURlZiAqRE1BeCkgew0KLSAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NIVElGMyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCA0ICBoYWxmIHRyYW5zZmVyIGZsYWcuDQotICogQHJtdG9sbCBJRkNSICAgICAgICAgQ0hUSUY0ICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX0hUNA0KLSAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0NsZWFyRmxhZ19IVDQoRE1BX1R5cGVEZWYgKkRNQXgpIHsNCi0gIFdSSVRFX1JFRyhETUF4LT5JRkNSLCBETUFfSUZDUl9DSFRJRjQpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgNSAgaGFsZiB0cmFuc2ZlciBmbGFnLg0KLSAqIEBybXRvbGwgSUZDUiAgICAgICAgIENIVElGNSAgICAgICAgTExfRE1BX0NsZWFyRmxhZ19IVDUNCi0gKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9DbGVhckZsYWdfSFQ1KERNQV9UeXBlRGVmICpETUF4KSB7DQotICBXUklURV9SRUcoRE1BeC0+SUZDUiwgRE1BX0lGQ1JfQ0hUSUY1KTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDbGVhciBDaGFubmVsIDYgIGhhbGYgdHJhbnNmZXIgZmxhZy4NCi0gKiBAcm10b2xsIElGQ1IgICAgICAgICBDSFRJRjYgICAgICAgIExMX0RNQV9DbGVhckZsYWdfSFQ2DQotICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX0hUNihETUFfVHlwZURlZiAqRE1BeCkgew0KLSAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NIVElGNik7DQotfQ0KLQ0KLSNpZiBkZWZpbmVkKERNQTFfQ2hhbm5lbDcpDQotLyoqDQotICogQGJyaWVmICBDbGVhciBDaGFubmVsIDcgIGhhbGYgdHJhbnNmZXIgZmxhZy4NCi0gKiBAcm10b2xsIElGQ1IgICAgICAgICBDSFRJRjcgICAgICAgIExMX0RNQV9DbGVhckZsYWdfSFQ3DQotICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX0hUNyhETUFfVHlwZURlZiAqRE1BeCkgew0KLSAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NIVElGNyk7DQotfQ0KLSNlbmRpZiAvKiBETUExX0NoYW5uZWw3ICovDQotDQotI2lmIGRlZmluZWQoRE1BMV9DaGFubmVsOCkNCi0vKioNCi0gKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgOCAgaGFsZiB0cmFuc2ZlciBmbGFnLg0KLSAqIEBybXRvbGwgSUZDUiAgICAgICAgIENIVElGOCAgICAgICAgTExfRE1BX0NsZWFyRmxhZ19IVDgNCi0gKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9DbGVhckZsYWdfSFQ4KERNQV9UeXBlRGVmICpETUF4KSB7DQotICBXUklURV9SRUcoRE1BeC0+SUZDUiwgRE1BX0lGQ1JfQ0hUSUY4KTsNCi19DQotI2VuZGlmIC8qIERNQTFfQ2hhbm5lbDggKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgMSB0cmFuc2ZlciBlcnJvciBmbGFnLg0KLSAqIEBybXRvbGwgSUZDUiAgICAgICAgIENURUlGMSAgICAgICAgTExfRE1BX0NsZWFyRmxhZ19URTENCi0gKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9DbGVhckZsYWdfVEUxKERNQV9UeXBlRGVmICpETUF4KSB7DQotICBXUklURV9SRUcoRE1BeC0+SUZDUiwgRE1BX0lGQ1JfQ1RFSUYxKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDbGVhciBDaGFubmVsIDIgdHJhbnNmZXIgZXJyb3IgZmxhZy4NCi0gKiBAcm10b2xsIElGQ1IgICAgICAgICBDVEVJRjIgICAgICAgIExMX0RNQV9DbGVhckZsYWdfVEUyDQotICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX1RFMihETUFfVHlwZURlZiAqRE1BeCkgew0KLSAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NURUlGMik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCAzIHRyYW5zZmVyIGVycm9yIGZsYWcuDQotICogQHJtdG9sbCBJRkNSICAgICAgICAgQ1RFSUYzICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX1RFMw0KLSAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0NsZWFyRmxhZ19URTMoRE1BX1R5cGVEZWYgKkRNQXgpIHsNCi0gIFdSSVRFX1JFRyhETUF4LT5JRkNSLCBETUFfSUZDUl9DVEVJRjMpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgNCB0cmFuc2ZlciBlcnJvciBmbGFnLg0KLSAqIEBybXRvbGwgSUZDUiAgICAgICAgIENURUlGNCAgICAgICAgTExfRE1BX0NsZWFyRmxhZ19URTQNCi0gKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9DbGVhckZsYWdfVEU0KERNQV9UeXBlRGVmICpETUF4KSB7DQotICBXUklURV9SRUcoRE1BeC0+SUZDUiwgRE1BX0lGQ1JfQ1RFSUY0KTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDbGVhciBDaGFubmVsIDUgdHJhbnNmZXIgZXJyb3IgZmxhZy4NCi0gKiBAcm10b2xsIElGQ1IgICAgICAgICBDVEVJRjUgICAgICAgIExMX0RNQV9DbGVhckZsYWdfVEU1DQotICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX1RFNShETUFfVHlwZURlZiAqRE1BeCkgew0KLSAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NURUlGNSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCA2IHRyYW5zZmVyIGVycm9yIGZsYWcuDQotICogQHJtdG9sbCBJRkNSICAgICAgICAgQ1RFSUY2ICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX1RFNg0KLSAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0NsZWFyRmxhZ19URTYoRE1BX1R5cGVEZWYgKkRNQXgpIHsNCi0gIFdSSVRFX1JFRyhETUF4LT5JRkNSLCBETUFfSUZDUl9DVEVJRjYpOw0KLX0NCi0NCi0jaWYgZGVmaW5lZChETUExX0NoYW5uZWw3KQ0KLS8qKg0KLSAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCA3IHRyYW5zZmVyIGVycm9yIGZsYWcuDQotICogQHJtdG9sbCBJRkNSICAgICAgICAgQ1RFSUY3ICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX1RFNw0KLSAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0NsZWFyRmxhZ19URTcoRE1BX1R5cGVEZWYgKkRNQXgpIHsNCi0gIFdSSVRFX1JFRyhETUF4LT5JRkNSLCBETUFfSUZDUl9DVEVJRjcpOw0KLX0NCi0jZW5kaWYgLyogRE1BMV9DaGFubmVsNyAqLw0KLQ0KLSNpZiBkZWZpbmVkKERNQTFfQ2hhbm5lbDgpDQotLyoqDQotICogQGJyaWVmICBDbGVhciBDaGFubmVsIDggdHJhbnNmZXIgZXJyb3IgZmxhZy4NCi0gKiBAcm10b2xsIElGQ1IgICAgICAgICBDVEVJRjggICAgICAgIExMX0RNQV9DbGVhckZsYWdfVEU4DQotICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX1RFOChETUFfVHlwZURlZiAqRE1BeCkgew0KLSAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NURUlGOCk7DQotfQ0KLSNlbmRpZiAvKiBETUExX0NoYW5uZWw4ICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIERNQV9MTF9FRl9JVF9NYW5hZ2VtZW50IElUX01hbmFnZW1lbnQNCi0gKiBAew0KLSAqLw0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIFRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdC4NCi0gKiBAcm10b2xsIENDUiAgICAgICAgICBUQ0lFICAgICAgICAgIExMX0RNQV9FbmFibGVJVF9UQw0KLSAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlDQotICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNyAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF84ICgqKQ0KLSAqICAgICAgICAgKCopIE5vdCBvbiBhbGwgRzQgZGV2aWNlcw0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9FbmFibGVJVF9UQyhETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCkgew0KLSAgdWludDMyX3QgZG1hX2Jhc2VfYWRkciA9ICh1aW50MzJfdClETUF4Ow0KLSAgU0VUX0JJVCgoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKHVpbnQzMl90KShkbWFfYmFzZV9hZGRyICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWxdKSkpDQotICAgICAgICAgICAgICAtPkNDUiwNCi0gICAgICAgICAgRE1BX0NDUl9UQ0lFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgSGFsZiB0cmFuc2ZlciBpbnRlcnJ1cHQuDQotICogQHJtdG9sbCBDQ1IgICAgICAgICAgSFRJRSAgICAgICAgICBMTF9ETUFfRW5hYmxlSVRfSFQNCi0gKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQ0KLSAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfOCAoKikNCi0gKiAgICAgICAgICgqKSBOb3Qgb24gYWxsIEc0IGRldmljZXMNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfRW5hYmxlSVRfSFQoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwpIHsNCi0gIHVpbnQzMl90IGRtYV9iYXNlX2FkZHIgPSAodWludDMyX3QpRE1BeDsNCi0gIFNFVF9CSVQoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCh1aW50MzJfdCkoZG1hX2Jhc2VfYWRkciArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsXSkpKQ0KLSAgICAgICAgICAgICAgLT5DQ1IsDQotICAgICAgICAgIERNQV9DQ1JfSFRJRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIFRyYW5zZmVyIGVycm9yIGludGVycnVwdC4NCi0gKiBAcm10b2xsIENDUiAgICAgICAgICBURUlFICAgICAgICAgIExMX0RNQV9FbmFibGVJVF9URQ0KLSAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlDQotICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNyAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF84ICgqKQ0KLSAqICAgICAgICAgKCopIE5vdCBvbiBhbGwgRzQgZGV2aWNlcw0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9FbmFibGVJVF9URShETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCkgew0KLSAgdWludDMyX3QgZG1hX2Jhc2VfYWRkciA9ICh1aW50MzJfdClETUF4Ow0KLSAgU0VUX0JJVCgoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKHVpbnQzMl90KShkbWFfYmFzZV9hZGRyICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWxdKSkpDQotICAgICAgICAgICAgICAtPkNDUiwNCi0gICAgICAgICAgRE1BX0NDUl9URUlFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIFRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdC4NCi0gKiBAcm10b2xsIENDUiAgICAgICAgICBUQ0lFICAgICAgICAgIExMX0RNQV9EaXNhYmxlSVRfVEMNCi0gKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQ0KLSAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfOCAoKikNCi0gKiAgICAgICAgICgqKSBOb3Qgb24gYWxsIEc0IGRldmljZXMNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfRGlzYWJsZUlUX1RDKERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsKSB7DQotICB1aW50MzJfdCBkbWFfYmFzZV9hZGRyID0gKHVpbnQzMl90KURNQXg7DQotICBDTEVBUl9CSVQoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCh1aW50MzJfdCkoZG1hX2Jhc2VfYWRkciArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWxdKSkpDQotICAgICAgICAgICAgICAgIC0+Q0NSLA0KLSAgICAgICAgICAgIERNQV9DQ1JfVENJRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBIYWxmIHRyYW5zZmVyIGludGVycnVwdC4NCi0gKiBAcm10b2xsIENDUiAgICAgICAgICBIVElFICAgICAgICAgIExMX0RNQV9EaXNhYmxlSVRfSFQNCi0gKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQ0KLSAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfOCAoKikNCi0gKiAgICAgICAgICgqKSBOb3Qgb24gYWxsIEc0IGRldmljZXMNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfRGlzYWJsZUlUX0hUKERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsKSB7DQotICB1aW50MzJfdCBkbWFfYmFzZV9hZGRyID0gKHVpbnQzMl90KURNQXg7DQotICBDTEVBUl9CSVQoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCh1aW50MzJfdCkoZG1hX2Jhc2VfYWRkciArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWxdKSkpDQotICAgICAgICAgICAgICAgIC0+Q0NSLA0KLSAgICAgICAgICAgIERNQV9DQ1JfSFRJRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBUcmFuc2ZlciBlcnJvciBpbnRlcnJ1cHQuDQotICogQHJtdG9sbCBDQ1IgICAgICAgICAgVEVJRSAgICAgICAgICBMTF9ETUFfRGlzYWJsZUlUX1RFDQotICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UNCi0gKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83ICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzggKCopDQotICogICAgICAgICAoKikgTm90IG9uIGFsbCBHNCBkZXZpY2VzDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0Rpc2FibGVJVF9URShETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCkgew0KLSAgdWludDMyX3QgZG1hX2Jhc2VfYWRkciA9ICh1aW50MzJfdClETUF4Ow0KLSAgQ0xFQVJfQklUKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKSgodWludDMyX3QpKGRtYV9iYXNlX2FkZHIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsXSkpKQ0KLSAgICAgICAgICAgICAgICAtPkNDUiwNCi0gICAgICAgICAgICBETUFfQ0NSX1RFSUUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIGlmIFRyYW5zZmVyIGNvbXBsZXRlIEludGVycnVwdCBpcyBlbmFibGVkLg0KLSAqIEBybXRvbGwgQ0NSICAgICAgICAgIFRDSUUgICAgICAgICAgTExfRE1BX0lzRW5hYmxlZElUX1RDDQotICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UNCi0gKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83ICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzggKCopDQotICogICAgICAgICAoKikgTm90IG9uIGFsbCBHNCBkZXZpY2VzDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0VuYWJsZWRJVF9UQyhETUFfVHlwZURlZiAqRE1BeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpIHsNCi0gIHVpbnQzMl90IGRtYV9iYXNlX2FkZHIgPSAodWludDMyX3QpRE1BeDsNCi0gIHJldHVybiAoDQotICAgICAgKFJFQURfQklUKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKSgoDQotICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QpKGRtYV9iYXNlX2FkZHIgKyBDSEFOTkVMX09GRlNFVF9UQUJbQ2hhbm5lbF0pKSkNCi0gICAgICAgICAgICAgICAgICAgIC0+Q0NSLA0KLSAgICAgICAgICAgICAgICBETUFfQ0NSX1RDSUUpID09IChETUFfQ0NSX1RDSUUpKQ0KLSAgICAgICAgICA/IDFVTA0KLSAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgSGFsZiB0cmFuc2ZlciBJbnRlcnJ1cHQgaXMgZW5hYmxlZC4NCi0gKiBAcm10b2xsIENDUiAgICAgICAgICBIVElFICAgICAgICAgIExMX0RNQV9Jc0VuYWJsZWRJVF9IVA0KLSAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlDQotICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNyAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF84ICgqKQ0KLSAqICAgICAgICAgKCopIE5vdCBvbiBhbGwgRzQgZGV2aWNlcw0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNFbmFibGVkSVRfSFQoRE1BX1R5cGVEZWYgKkRNQXgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKSB7DQotICB1aW50MzJfdCBkbWFfYmFzZV9hZGRyID0gKHVpbnQzMl90KURNQXg7DQotICByZXR1cm4gKA0KLSAgICAgIChSRUFEX0JJVCgoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKA0KLSAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KShkbWFfYmFzZV9hZGRyICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWxdKSkpDQotICAgICAgICAgICAgICAgICAgICAtPkNDUiwNCi0gICAgICAgICAgICAgICAgRE1BX0NDUl9IVElFKSA9PSAoRE1BX0NDUl9IVElFKSkNCi0gICAgICAgICAgPyAxVUwNCi0gICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIGlmIFRyYW5zZmVyIGVycm9yIEludGVycnVwdCBpcyBlbmFibGVkLg0KLSAqIEBybXRvbGwgQ0NSICAgICAgICAgIFRFSUUgICAgICAgICAgTExfRE1BX0lzRW5hYmxlZElUX1RFDQotICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UNCi0gKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83ICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzggKCopDQotICogICAgICAgICAoKikgTm90IG9uIGFsbCBHNCBkZXZpY2VzDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0VuYWJsZWRJVF9URShETUFfVHlwZURlZiAqRE1BeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpIHsNCi0gIHVpbnQzMl90IGRtYV9iYXNlX2FkZHIgPSAodWludDMyX3QpRE1BeDsNCi0gIHJldHVybiAoDQotICAgICAgKFJFQURfQklUKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKSgoDQotICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QpKGRtYV9iYXNlX2FkZHIgKyBDSEFOTkVMX09GRlNFVF9UQUJbQ2hhbm5lbF0pKSkNCi0gICAgICAgICAgICAgICAgICAgIC0+Q0NSLA0KLSAgICAgICAgICAgICAgICBETUFfQ0NSX1RFSUUpID09IChETUFfQ0NSX1RFSUUpKQ0KLSAgICAgICAgICA/IDFVTA0KLSAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQ0KLS8qKiBAZGVmZ3JvdXAgRE1BX0xMX0VGX0luaXQgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucw0KLSAqIEB7DQotICovDQotDQotdWludDMyX3QgTExfRE1BX0luaXQoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwsDQotICAgICAgICAgICAgICAgICAgICAgTExfRE1BX0luaXRUeXBlRGVmICpETUFfSW5pdFN0cnVjdCk7DQotdWludDMyX3QgTExfRE1BX0RlSW5pdChETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCk7DQotdm9pZCBMTF9ETUFfU3RydWN0SW5pdChMTF9ETUFfSW5pdFR5cGVEZWYgKkRNQV9Jbml0U3RydWN0KTsNCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLSNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotI2VuZGlmIC8qIERNQTEgfHwgRE1BMiAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotI2lmZGVmIF9fY3BsdXNwbHVzDQotfQ0KLSNlbmRpZg0KLQ0KLSNlbmRpZiAvKiBfX1NUTTMyRzR4eF9MTF9ETUFfSCAqLw0KKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGZpbGUgICAgc3RtMzJnNHh4X2xsX2RtYS5oCisgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgRE1BIExMIG1vZHVsZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBhdHRlbnRpb24KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRlcm1zIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUKKyAqIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4KKyAqIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcyB3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBfX1NUTTMyRzR4eF9MTF9ETUFfSAorI2RlZmluZSBfX1NUTTMyRzR4eF9MTF9ETUFfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnNHh4LmgiCisjaW5jbHVkZSAic3RtMzJnNHh4X2xsX2RtYW11eC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHNHh4X0xMX0RyaXZlcgorICogQHsKKyAqLworCisjaWYgZGVmaW5lZChETUExKSB8fCBkZWZpbmVkKERNQTIpCisKKy8qKiBAZGVmZ3JvdXAgRE1BX0xMIERNQQorICogQHsKKyAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRE1BX0xMX1ByaXZhdGVfVmFyaWFibGVzIERNQSBQcml2YXRlIFZhcmlhYmxlcworICogQHsKKyAqLworLyogQXJyYXkgdXNlZCB0byBnZXQgdGhlIERNQSBjaGFubmVsIHJlZ2lzdGVyIG9mZnNldCB2ZXJzdXMgY2hhbm5lbCBpbmRleAorICogTExfRE1BX0NIQU5ORUxfeCAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgQ0hBTk5FTF9PRkZTRVRfVEFCW10gPSB7CisgICAgKHVpbnQ4X3QpKERNQTFfQ2hhbm5lbDFfQkFTRSAtIERNQTFfQkFTRSksCisgICAgKHVpbnQ4X3QpKERNQTFfQ2hhbm5lbDJfQkFTRSAtIERNQTFfQkFTRSksCisgICAgKHVpbnQ4X3QpKERNQTFfQ2hhbm5lbDNfQkFTRSAtIERNQTFfQkFTRSksCisgICAgKHVpbnQ4X3QpKERNQTFfQ2hhbm5lbDRfQkFTRSAtIERNQTFfQkFTRSksCisgICAgKHVpbnQ4X3QpKERNQTFfQ2hhbm5lbDVfQkFTRSAtIERNQTFfQkFTRSksCisgICAgKHVpbnQ4X3QpKERNQTFfQ2hhbm5lbDZfQkFTRSAtIERNQTFfQkFTRSkKKyNpZiBkZWZpbmVkKERNQTFfQ2hhbm5lbDcpCisgICAgICAgICwKKyAgICAodWludDhfdCkoRE1BMV9DaGFubmVsN19CQVNFIC0gRE1BMV9CQVNFKQorI2VuZGlmIC8qIERNQTFfQ2hhbm5lbDcgKi8KKyNpZiBkZWZpbmVkKERNQTFfQ2hhbm5lbDgpCisgICAgICAgICwKKyAgICAodWludDhfdCkoRE1BMV9DaGFubmVsOF9CQVNFIC0gRE1BMV9CQVNFKQorI2VuZGlmIC8qIERNQTFfQ2hhbm5lbDggKi8KK307CisvKioKKyAqIEB9CisgKi8KKworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRE1BX0xMX1ByaXZhdGVfQ29uc3RhbnRzIERNQSBQcml2YXRlIENvbnN0YW50cworICogQHsKKyAqLworLyogRGVmaW5lIHVzZWQgdG8gZ2V0IENTRUxSIHJlZ2lzdGVyIG9mZnNldCAqLworI2RlZmluZSBETUFfQ1NFTFJfT0ZGU0VUICh1aW50MzJfdCkoRE1BMV9DU0VMUl9CQVNFIC0gRE1BMV9CQVNFKQorCisvKiBEZWZpbmVzIHVzZWQgZm9yIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIHJlZ2lzdGVyIGFuZCBwZXJmb3JtIG9mZnNldHMgKi8KKyNkZWZpbmUgRE1BX1BPU0lUSU9OX0NTRUxSX0NYUyBcCisgIFBPU0lUSU9OX1ZBTChETUFfQ1NFTFJfQzFTIDw8ICgoQ2hhbm5lbCAtIDFVKSAqIDRVKSkKKy8qKgorICogQH0KKyAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBETUFfTExfUHJpdmF0ZV9NYWNyb3MgRE1BIFByaXZhdGUgTWFjcm9zCisgKiBAeworICovCisvKioKKyAqIEB9CisgKi8KKyNlbmRpZiAvKlVTRV9GVUxMX0xMX0RSSVZFUiovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIERNQV9MTF9FU19JTklUIERNQSBFeHBvcnRlZCBJbml0IHN0cnVjdHVyZQorICogQHsKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50MzJfdAorICAgICAgUGVyaXBoT3JNMk1TcmNBZGRyZXNzOyAvKiE8IFNwZWNpZmllcyB0aGUgcGVyaXBoZXJhbCBiYXNlIGFkZHJlc3MgZm9yIERNQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2ZlciBvciBhcyBTb3VyY2UgYmFzZSBhZGRyZXNzIGluIGNhc2Ugb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5IHRvIG1lbW9yeSB0cmFuc2ZlciBkaXJlY3Rpb24uCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMHhGRkZGRkZGRi4gKi8KKworICB1aW50MzJfdAorICAgICAgTWVtb3J5T3JNMk1Ec3RBZGRyZXNzOyAvKiE8IFNwZWNpZmllcyB0aGUgbWVtb3J5IGJhc2UgYWRkcmVzcyBmb3IgRE1BCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyIG9yIGFzIERlc3RpbmF0aW9uIGJhc2UgYWRkcmVzcyBpbiBjYXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIG1lbW9yeSB0byBtZW1vcnkgdHJhbnNmZXIgZGlyZWN0aW9uLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDB4RkZGRkZGRkYuICovCisKKyAgdWludDMyX3QgRGlyZWN0aW9uOyAvKiE8IFNwZWNpZmllcyBpZiB0aGUgZGF0YSB3aWxsIGJlIHRyYW5zZmVycmVkIGZyb20gbWVtb3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgdG8gcGVyaXBoZXJhbCwgZnJvbSBtZW1vcnkgdG8gbWVtb3J5IG9yIGZyb20gcGVyaXBoZXJhbAorICAgICAgICAgICAgICAgICAgICAgICAgIHRvIG1lbW9yeS4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgIERNQV9MTF9FQ19ESVJFQ1RJT04KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBAcmVmIExMX0RNQV9TZXREYXRhVHJhbnNmZXJEaXJlY3Rpb24oKS4gKi8KKworICB1aW50MzJfdCBNb2RlOyAvKiE8IFNwZWNpZmllcyB0aGUgbm9ybWFsIG9yIGNpcmN1bGFyIG9wZXJhdGlvbiBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRE1BX0xMX0VDX01PREUKKyAgICAgICAgICAgICAgICAgICAgICBAbm90ZTogVGhlIGNpcmN1bGFyIGJ1ZmZlciBtb2RlIGNhbm5vdCBiZSB1c2VkIGlmIHRoZQorICAgICAgICAgICAgICAgICAgICBtZW1vcnkgdG8gbWVtb3J5IGRhdGEgdHJhbnNmZXIgZGlyZWN0aW9uIGlzIGNvbmZpZ3VyZWQgb24KKyAgICAgICAgICAgICAgICAgICAgdGhlIHNlbGVjdGVkIENoYW5uZWwKKworICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5CisgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEByZWYgTExfRE1BX1NldE1vZGUoKS4gKi8KKworICB1aW50MzJfdCBQZXJpcGhPck0yTVNyY0luY01vZGU7IC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIFBlcmlwaGVyYWwgYWRkcmVzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIFNvdXJjZSBhZGRyZXNzIGluIGNhc2Ugb2YgbWVtb3J5IHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5IHRyYW5zZmVyIGRpcmVjdGlvbiBpcyBpbmNyZW1lbnRlZCBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERNQV9MTF9FQ19QRVJJUEgKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfRE1BX1NldFBlcmlwaEluY01vZGUoKS4gKi8KKworICB1aW50MzJfdCBNZW1vcnlPck0yTURzdEluY01vZGU7IC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIE1lbW9yeSBhZGRyZXNzIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzdGluYXRpb24gYWRkcmVzcyBpbiBjYXNlIG9mIG1lbW9yeSB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSB0cmFuc2ZlciBkaXJlY3Rpb24gaXMgaW5jcmVtZW50ZWQgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBETUFfTExfRUNfTUVNT1JZCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX0RNQV9TZXRNZW1vcnlJbmNNb2RlKCkuICovCisKKyAgdWludDMyX3QKKyAgICAgIFBlcmlwaE9yTTJNU3JjRGF0YVNpemU7IC8qITwgU3BlY2lmaWVzIHRoZSBQZXJpcGhlcmFsIGRhdGEgc2l6ZSBhbGlnbm1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIFNvdXJjZSBkYXRhIHNpemUgYWxpZ25tZW50IChieXRlLCBoYWxmIHdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JkKSBpbiBjYXNlIG9mIG1lbW9yeSB0byBtZW1vcnkgdHJhbnNmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbi4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgRE1BX0xMX0VDX1BEQVRBQUxJR04KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9ETUFfU2V0UGVyaXBoU2l6ZSgpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgdWludDMyX3QKKyAgICAgIE1lbW9yeU9yTTJNRHN0RGF0YVNpemU7IC8qITwgU3BlY2lmaWVzIHRoZSBNZW1vcnkgZGF0YSBzaXplIGFsaWdubWVudCBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzdGluYXRpb24gZGF0YSBzaXplIGFsaWdubWVudCAoYnl0ZSwgaGFsZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZCwgd29yZCkgaW4gY2FzZSBvZiBtZW1vcnkgdG8gbWVtb3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2ZlciBkaXJlY3Rpb24uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBvZiBAcmVmIERNQV9MTF9FQ19NREFUQUFMSUdOCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfRE1BX1NldE1lbW9yeVNpemUoKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIHVpbnQzMl90CisgICAgICBOYkRhdGE7IC8qITwgU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgZGF0YSB0byB0cmFuc2ZlciwgaW4gZGF0YSB1bml0LgorICAgICAgICAgICAgICAgICAgIFRoZSBkYXRhIHVuaXQgaXMgZXF1YWwgdG8gdGhlIHNvdXJjZSBidWZmZXIgY29uZmlndXJhdGlvbiBzZXQKKyAgICAgICAgICAgICAgICAgaW4gUGVyaXBoZXJhbFNpemUgb3IgTWVtb3J5U2l6ZSBwYXJhbWV0ZXJzIGRlcGVuZGluZyBpbiB0aGUKKyAgICAgICAgICAgICAgICAgdHJhbnNmZXIgZGlyZWN0aW9uLiBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbgorICAgICAgICAgICAgICAgICBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMHgwMDAwRkZGRgorCisgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkKKyAgICAgICAgICAgICAgICAgZnVuY3Rpb24gQHJlZiBMTF9ETUFfU2V0RGF0YUxlbmd0aCgpLiAqLworCisgIHVpbnQzMl90IFBlcmlwaFJlcXVlc3Q7IC8qITwgU3BlY2lmaWVzIHRoZSBwZXJpcGhlcmFsIHJlcXVlc3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBETUFNVVhfTExfRUNfUkVRVUVTVAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9ETUFfU2V0UGVyaXBoUmVxdWVzdCgpLiAqLworCisgIHVpbnQzMl90CisgICAgICBQcmlvcml0eTsgLyohPCBTcGVjaWZpZXMgdGhlIGNoYW5uZWwgcHJpb3JpdHkgbGV2ZWwuCisgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIERNQV9MTF9FQ19QUklPUklUWQorCisgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeQorICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEByZWYgTExfRE1BX1NldENoYW5uZWxQcmlvcml0eUxldmVsKCkuICovCisKK30gTExfRE1BX0luaXRUeXBlRGVmOworLyoqCisgKiBAfQorICovCisjZW5kaWYgLypVU0VfRlVMTF9MTF9EUklWRVIqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBETUFfTExfRXhwb3J0ZWRfQ29uc3RhbnRzIERNQSBFeHBvcnRlZCBDb25zdGFudHMKKyAqIEB7CisgKi8KKy8qKiBAZGVmZ3JvdXAgRE1BX0xMX0VDX0NMRUFSX0ZMQUcgQ2xlYXIgRmxhZ3MgRGVmaW5lcworICogQGJyaWVmICAgIEZsYWdzIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9ETUFfV3JpdGVSZWcgZnVuY3Rpb24KKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfRE1BX0lGQ1JfQ0dJRjEgXAorICBETUFfSUZDUl9DR0lGMSAvKiE8IENoYW5uZWwgMSBnbG9iYWwgZmxhZyAgICAgICAgICAgICovCisjZGVmaW5lIExMX0RNQV9JRkNSX0NUQ0lGMSBcCisgIERNQV9JRkNSX0NUQ0lGMSAvKiE8IENoYW5uZWwgMSB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnICovCisjZGVmaW5lIExMX0RNQV9JRkNSX0NIVElGMSBcCisgIERNQV9JRkNSX0NIVElGMSAvKiE8IENoYW5uZWwgMSBoYWxmIHRyYW5zZmVyIGZsYWcgICAgICovCisjZGVmaW5lIExMX0RNQV9JRkNSX0NURUlGMSBcCisgIERNQV9JRkNSX0NURUlGMSAvKiE8IENoYW5uZWwgMSB0cmFuc2ZlciBlcnJvciBmbGFnICAgICovCisjZGVmaW5lIExMX0RNQV9JRkNSX0NHSUYyIFwKKyAgRE1BX0lGQ1JfQ0dJRjIgLyohPCBDaGFubmVsIDIgZ2xvYmFsIGZsYWcgICAgICAgICAgICAqLworI2RlZmluZSBMTF9ETUFfSUZDUl9DVENJRjIgXAorICBETUFfSUZDUl9DVENJRjIgLyohPCBDaGFubmVsIDIgdHJhbnNmZXIgY29tcGxldGUgZmxhZyAqLworI2RlZmluZSBMTF9ETUFfSUZDUl9DSFRJRjIgXAorICBETUFfSUZDUl9DSFRJRjIgLyohPCBDaGFubmVsIDIgaGFsZiB0cmFuc2ZlciBmbGFnICAgICAqLworI2RlZmluZSBMTF9ETUFfSUZDUl9DVEVJRjIgXAorICBETUFfSUZDUl9DVEVJRjIgLyohPCBDaGFubmVsIDIgdHJhbnNmZXIgZXJyb3IgZmxhZyAgICAqLworI2RlZmluZSBMTF9ETUFfSUZDUl9DR0lGMyBcCisgIERNQV9JRkNSX0NHSUYzIC8qITwgQ2hhbm5lbCAzIGdsb2JhbCBmbGFnICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lGQ1JfQ1RDSUYzIFwKKyAgRE1BX0lGQ1JfQ1RDSUYzIC8qITwgQ2hhbm5lbCAzIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcgKi8KKyNkZWZpbmUgTExfRE1BX0lGQ1JfQ0hUSUYzIFwKKyAgRE1BX0lGQ1JfQ0hUSUYzIC8qITwgQ2hhbm5lbCAzIGhhbGYgdHJhbnNmZXIgZmxhZyAgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lGQ1JfQ1RFSUYzIFwKKyAgRE1BX0lGQ1JfQ1RFSUYzIC8qITwgQ2hhbm5lbCAzIHRyYW5zZmVyIGVycm9yIGZsYWcgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lGQ1JfQ0dJRjQgXAorICBETUFfSUZDUl9DR0lGNCAvKiE8IENoYW5uZWwgNCBnbG9iYWwgZmxhZyAgICAgICAgICAgICovCisjZGVmaW5lIExMX0RNQV9JRkNSX0NUQ0lGNCBcCisgIERNQV9JRkNSX0NUQ0lGNCAvKiE8IENoYW5uZWwgNCB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnICovCisjZGVmaW5lIExMX0RNQV9JRkNSX0NIVElGNCBcCisgIERNQV9JRkNSX0NIVElGNCAvKiE8IENoYW5uZWwgNCBoYWxmIHRyYW5zZmVyIGZsYWcgICAgICovCisjZGVmaW5lIExMX0RNQV9JRkNSX0NURUlGNCBcCisgIERNQV9JRkNSX0NURUlGNCAvKiE8IENoYW5uZWwgNCB0cmFuc2ZlciBlcnJvciBmbGFnICAgICovCisjZGVmaW5lIExMX0RNQV9JRkNSX0NHSUY1IFwKKyAgRE1BX0lGQ1JfQ0dJRjUgLyohPCBDaGFubmVsIDUgZ2xvYmFsIGZsYWcgICAgICAgICAgICAqLworI2RlZmluZSBMTF9ETUFfSUZDUl9DVENJRjUgXAorICBETUFfSUZDUl9DVENJRjUgLyohPCBDaGFubmVsIDUgdHJhbnNmZXIgY29tcGxldGUgZmxhZyAqLworI2RlZmluZSBMTF9ETUFfSUZDUl9DSFRJRjUgXAorICBETUFfSUZDUl9DSFRJRjUgLyohPCBDaGFubmVsIDUgaGFsZiB0cmFuc2ZlciBmbGFnICAgICAqLworI2RlZmluZSBMTF9ETUFfSUZDUl9DVEVJRjUgXAorICBETUFfSUZDUl9DVEVJRjUgLyohPCBDaGFubmVsIDUgdHJhbnNmZXIgZXJyb3IgZmxhZyAgICAqLworI2RlZmluZSBMTF9ETUFfSUZDUl9DR0lGNiBcCisgIERNQV9JRkNSX0NHSUY2IC8qITwgQ2hhbm5lbCA2IGdsb2JhbCBmbGFnICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lGQ1JfQ1RDSUY2IFwKKyAgRE1BX0lGQ1JfQ1RDSUY2IC8qITwgQ2hhbm5lbCA2IHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcgKi8KKyNkZWZpbmUgTExfRE1BX0lGQ1JfQ0hUSUY2IFwKKyAgRE1BX0lGQ1JfQ0hUSUY2IC8qITwgQ2hhbm5lbCA2IGhhbGYgdHJhbnNmZXIgZmxhZyAgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lGQ1JfQ1RFSUY2IFwKKyAgRE1BX0lGQ1JfQ1RFSUY2IC8qITwgQ2hhbm5lbCA2IHRyYW5zZmVyIGVycm9yIGZsYWcgICAgKi8KKyNpZiBkZWZpbmVkKERNQTFfQ2hhbm5lbDcpCisjZGVmaW5lIExMX0RNQV9JRkNSX0NHSUY3IFwKKyAgRE1BX0lGQ1JfQ0dJRjcgLyohPCBDaGFubmVsIDcgZ2xvYmFsIGZsYWcgICAgICAgICAgICAqLworI2RlZmluZSBMTF9ETUFfSUZDUl9DVENJRjcgXAorICBETUFfSUZDUl9DVENJRjcgLyohPCBDaGFubmVsIDcgdHJhbnNmZXIgY29tcGxldGUgZmxhZyAqLworI2RlZmluZSBMTF9ETUFfSUZDUl9DSFRJRjcgXAorICBETUFfSUZDUl9DSFRJRjcgLyohPCBDaGFubmVsIDcgaGFsZiB0cmFuc2ZlciBmbGFnICAgICAqLworI2RlZmluZSBMTF9ETUFfSUZDUl9DVEVJRjcgXAorICBETUFfSUZDUl9DVEVJRjcgLyohPCBDaGFubmVsIDcgdHJhbnNmZXIgZXJyb3IgZmxhZyAgICAqLworI2VuZGlmICAgICAgICAgICAgLyogRE1BMV9DaGFubmVsNyAqLworI2lmIGRlZmluZWQoRE1BMV9DaGFubmVsOCkKKyNkZWZpbmUgTExfRE1BX0lGQ1JfQ0dJRjggXAorICBETUFfSUZDUl9DR0lGOCAvKiE8IENoYW5uZWwgOCBnbG9iYWwgZmxhZyAgICAgICAgICAgICovCisjZGVmaW5lIExMX0RNQV9JRkNSX0NUQ0lGOCBcCisgIERNQV9JRkNSX0NUQ0lGOCAvKiE8IENoYW5uZWwgOCB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnICovCisjZGVmaW5lIExMX0RNQV9JRkNSX0NIVElGOCBcCisgIERNQV9JRkNSX0NIVElGOCAvKiE8IENoYW5uZWwgOCBoYWxmIHRyYW5zZmVyIGZsYWcgICAgICovCisjZGVmaW5lIExMX0RNQV9JRkNSX0NURUlGOCBcCisgIERNQV9JRkNSX0NURUlGOCAvKiE8IENoYW5uZWwgOCB0cmFuc2ZlciBlcnJvciBmbGFnICAgICovCisjZW5kaWYgICAgICAgICAgICAvKiBETUExX0NoYW5uZWw4ICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBETUFfTExfRUNfR0VUX0ZMQUcgR2V0IEZsYWdzIERlZmluZXMKKyAqIEBicmllZiAgICBGbGFncyBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfRE1BX1JlYWRSZWcgZnVuY3Rpb24KKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfRE1BX0lTUl9HSUYxIERNQV9JU1JfR0lGMSAvKiE8IENoYW5uZWwgMSBnbG9iYWwgZmxhZyAgICAgICAgICAgICovCisjZGVmaW5lIExMX0RNQV9JU1JfVENJRjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRE1BX0lTUl9UQ0lGMSAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2hhbm5lbCAxIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0RNQV9JU1JfSFRJRjEgRE1BX0lTUl9IVElGMSAvKiE8IENoYW5uZWwgMSBoYWxmIHRyYW5zZmVyIGZsYWcgKi8KKyNkZWZpbmUgTExfRE1BX0lTUl9URUlGMSBETUFfSVNSX1RFSUYxIC8qITwgQ2hhbm5lbCAxIHRyYW5zZmVyIGVycm9yIGZsYWcgKi8KKyNkZWZpbmUgTExfRE1BX0lTUl9HSUYyIERNQV9JU1JfR0lGMiAgIC8qITwgQ2hhbm5lbCAyIGdsb2JhbCBmbGFnICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lTUl9UQ0lGMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBETUFfSVNSX1RDSUYyICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDaGFubmVsIDIgdHJhbnNmZXIgY29tcGxldGUgZmxhZyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lTUl9IVElGMiBETUFfSVNSX0hUSUYyIC8qITwgQ2hhbm5lbCAyIGhhbGYgdHJhbnNmZXIgZmxhZyAqLworI2RlZmluZSBMTF9ETUFfSVNSX1RFSUYyIERNQV9JU1JfVEVJRjIgLyohPCBDaGFubmVsIDIgdHJhbnNmZXIgZXJyb3IgZmxhZyAqLworI2RlZmluZSBMTF9ETUFfSVNSX0dJRjMgRE1BX0lTUl9HSUYzICAgLyohPCBDaGFubmVsIDMgZ2xvYmFsIGZsYWcgICAgICAgICAgICAqLworI2RlZmluZSBMTF9ETUFfSVNSX1RDSUYzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIERNQV9JU1JfVENJRjMgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENoYW5uZWwgMyB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9ETUFfSVNSX0hUSUYzIERNQV9JU1JfSFRJRjMgLyohPCBDaGFubmVsIDMgaGFsZiB0cmFuc2ZlciBmbGFnICovCisjZGVmaW5lIExMX0RNQV9JU1JfVEVJRjMgRE1BX0lTUl9URUlGMyAvKiE8IENoYW5uZWwgMyB0cmFuc2ZlciBlcnJvciBmbGFnICovCisjZGVmaW5lIExMX0RNQV9JU1JfR0lGNCBETUFfSVNSX0dJRjQgICAvKiE8IENoYW5uZWwgNCBnbG9iYWwgZmxhZyAgICAgICAgICAgICovCisjZGVmaW5lIExMX0RNQV9JU1JfVENJRjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRE1BX0lTUl9UQ0lGNCAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2hhbm5lbCA0IHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0RNQV9JU1JfSFRJRjQgRE1BX0lTUl9IVElGNCAvKiE8IENoYW5uZWwgNCBoYWxmIHRyYW5zZmVyIGZsYWcgKi8KKyNkZWZpbmUgTExfRE1BX0lTUl9URUlGNCBETUFfSVNSX1RFSUY0IC8qITwgQ2hhbm5lbCA0IHRyYW5zZmVyIGVycm9yIGZsYWcgKi8KKyNkZWZpbmUgTExfRE1BX0lTUl9HSUY1IERNQV9JU1JfR0lGNSAgIC8qITwgQ2hhbm5lbCA1IGdsb2JhbCBmbGFnICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lTUl9UQ0lGNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBETUFfSVNSX1RDSUY1ICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDaGFubmVsIDUgdHJhbnNmZXIgY29tcGxldGUgZmxhZyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lTUl9IVElGNSBETUFfSVNSX0hUSUY1IC8qITwgQ2hhbm5lbCA1IGhhbGYgdHJhbnNmZXIgZmxhZyAqLworI2RlZmluZSBMTF9ETUFfSVNSX1RFSUY1IERNQV9JU1JfVEVJRjUgLyohPCBDaGFubmVsIDUgdHJhbnNmZXIgZXJyb3IgZmxhZyAqLworI2RlZmluZSBMTF9ETUFfSVNSX0dJRjYgRE1BX0lTUl9HSUY2ICAgLyohPCBDaGFubmVsIDYgZ2xvYmFsIGZsYWcgICAgICAgICAgICAqLworI2RlZmluZSBMTF9ETUFfSVNSX1RDSUY2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIERNQV9JU1JfVENJRjYgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENoYW5uZWwgNiB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9ETUFfSVNSX0hUSUY2IERNQV9JU1JfSFRJRjYgLyohPCBDaGFubmVsIDYgaGFsZiB0cmFuc2ZlciBmbGFnICovCisjZGVmaW5lIExMX0RNQV9JU1JfVEVJRjYgRE1BX0lTUl9URUlGNiAvKiE8IENoYW5uZWwgNiB0cmFuc2ZlciBlcnJvciBmbGFnICovCisjaWYgZGVmaW5lZChETUExX0NoYW5uZWw3KQorI2RlZmluZSBMTF9ETUFfSVNSX0dJRjcgRE1BX0lTUl9HSUY3IC8qITwgQ2hhbm5lbCA3IGdsb2JhbCBmbGFnICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lTUl9UQ0lGNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBETUFfSVNSX1RDSUY3ICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDaGFubmVsIDcgdHJhbnNmZXIgY29tcGxldGUgZmxhZyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lTUl9IVElGNyBETUFfSVNSX0hUSUY3IC8qITwgQ2hhbm5lbCA3IGhhbGYgdHJhbnNmZXIgZmxhZyAqLworI2RlZmluZSBMTF9ETUFfSVNSX1RFSUY3IERNQV9JU1JfVEVJRjcgLyohPCBDaGFubmVsIDcgdHJhbnNmZXIgZXJyb3IgZmxhZyAqLworI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRE1BMV9DaGFubmVsNyAqLworI2lmIGRlZmluZWQoRE1BMV9DaGFubmVsOCkKKyNkZWZpbmUgTExfRE1BX0lTUl9HSUY4IERNQV9JU1JfR0lGOCAvKiE8IENoYW5uZWwgOCBnbG9iYWwgZmxhZyAgICAgICAgICAgICovCisjZGVmaW5lIExMX0RNQV9JU1JfVENJRjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRE1BX0lTUl9UQ0lGOCAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2hhbm5lbCA4IHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0RNQV9JU1JfSFRJRjggRE1BX0lTUl9IVElGOCAvKiE8IENoYW5uZWwgOCBoYWxmIHRyYW5zZmVyIGZsYWcgKi8KKyNkZWZpbmUgTExfRE1BX0lTUl9URUlGOCBETUFfSVNSX1RFSUY4IC8qITwgQ2hhbm5lbCA4IHRyYW5zZmVyIGVycm9yIGZsYWcgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERNQTFfQ2hhbm5lbDggKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIERNQV9MTF9FQ19JVCBJVCBEZWZpbmVzCisgKiBAYnJpZWYgICAgSVQgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX0RNQV9SZWFkUmVnIGFuZAorICogTExfRE1BX1dyaXRlUmVnIGZ1bmN0aW9ucworICogQHsKKyAqLworI2RlZmluZSBMTF9ETUFfQ0NSX1RDSUUgRE1BX0NDUl9UQ0lFIC8qITwgVHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0ICovCisjZGVmaW5lIExMX0RNQV9DQ1JfSFRJRSBETUFfQ0NSX0hUSUUgLyohPCBIYWxmIFRyYW5zZmVyIGludGVycnVwdCAgICAgKi8KKyNkZWZpbmUgTExfRE1BX0NDUl9URUlFIERNQV9DQ1JfVEVJRSAvKiE8IFRyYW5zZmVyIGVycm9yIGludGVycnVwdCAgICAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BX0xMX0VDX0NIQU5ORUwgQ0hBTk5FTAorICogQHsKKyAqLworI2RlZmluZSBMTF9ETUFfQ0hBTk5FTF8xIDB4MDAwMDAwMDBVIC8qITwgRE1BIENoYW5uZWwgMSAqLworI2RlZmluZSBMTF9ETUFfQ0hBTk5FTF8yIDB4MDAwMDAwMDFVIC8qITwgRE1BIENoYW5uZWwgMiAqLworI2RlZmluZSBMTF9ETUFfQ0hBTk5FTF8zIDB4MDAwMDAwMDJVIC8qITwgRE1BIENoYW5uZWwgMyAqLworI2RlZmluZSBMTF9ETUFfQ0hBTk5FTF80IDB4MDAwMDAwMDNVIC8qITwgRE1BIENoYW5uZWwgNCAqLworI2RlZmluZSBMTF9ETUFfQ0hBTk5FTF81IDB4MDAwMDAwMDRVIC8qITwgRE1BIENoYW5uZWwgNSAqLworI2RlZmluZSBMTF9ETUFfQ0hBTk5FTF82IDB4MDAwMDAwMDVVIC8qITwgRE1BIENoYW5uZWwgNiAqLworI2lmIGRlZmluZWQoRE1BMV9DaGFubmVsNykKKyNkZWZpbmUgTExfRE1BX0NIQU5ORUxfNyAweDAwMDAwMDA2VSAvKiE8IERNQSBDaGFubmVsIDcgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBETUExX0NoYW5uZWw3ICovCisjaWYgZGVmaW5lZChETUExX0NoYW5uZWw4KQorI2RlZmluZSBMTF9ETUFfQ0hBTk5FTF84IDB4MDAwMDAwMDdVIC8qITwgRE1BIENoYW5uZWwgOCAqLworI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERNQTFfQ2hhbm5lbDggKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKyNkZWZpbmUgTExfRE1BX0NIQU5ORUxfQUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4RkZGRjAwMDBVIC8qITwgRE1BIENoYW5uZWwgYWxsICh1c2VkIG9ubHkgZm9yIGZ1bmN0aW9uIEByZWYgXAorICAgICAgICAgICAgICAgICBMTF9ETUFfRGVJbml0KCkuICovCisjZW5kaWYgICAgICAgIC8qVVNFX0ZVTExfTExfRFJJVkVSKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIERNQV9MTF9FQ19ESVJFQ1RJT04gVHJhbnNmZXIgRGlyZWN0aW9uCisgKiBAeworICovCisjZGVmaW5lIExMX0RNQV9ESVJFQ1RJT05fUEVSSVBIX1RPX01FTU9SWSBcCisgIDB4MDAwMDAwMDBVIC8qITwgUGVyaXBoZXJhbCB0byBtZW1vcnkgZGlyZWN0aW9uICovCisjZGVmaW5lIExMX0RNQV9ESVJFQ1RJT05fTUVNT1JZX1RPX1BFUklQSCBcCisgIERNQV9DQ1JfRElSIC8qITwgTWVtb3J5IHRvIHBlcmlwaGVyYWwgZGlyZWN0aW9uICovCisjZGVmaW5lIExMX0RNQV9ESVJFQ1RJT05fTUVNT1JZX1RPX01FTU9SWSBcCisgIERNQV9DQ1JfTUVNMk1FTSAvKiE8IE1lbW9yeSB0byBtZW1vcnkgZGlyZWN0aW9uICAgICAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BX0xMX0VDX01PREUgVHJhbnNmZXIgbW9kZQorICogQHsKKyAqLworI2RlZmluZSBMTF9ETUFfTU9ERV9OT1JNQUwgMHgwMDAwMDAwMFUgICAgLyohPCBOb3JtYWwgTW9kZSAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0RNQV9NT0RFX0NJUkNVTEFSIERNQV9DQ1JfQ0lSQyAvKiE8IENpcmN1bGFyIE1vZGUgICAgICAgICAgICAgICAgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIERNQV9MTF9FQ19QRVJJUEggUGVyaXBoZXJhbCBpbmNyZW1lbnQgbW9kZQorICogQHsKKyAqLworI2RlZmluZSBMTF9ETUFfUEVSSVBIX0lOQ1JFTUVOVCBcCisgIERNQV9DQ1JfUElOQyAvKiE8IFBlcmlwaGVyYWwgaW5jcmVtZW50IG1vZGUgRW5hYmxlICovCisjZGVmaW5lIExMX0RNQV9QRVJJUEhfTk9JTkNSRU1FTlQgXAorICAweDAwMDAwMDAwVSAvKiE8IFBlcmlwaGVyYWwgaW5jcmVtZW50IG1vZGUgRGlzYWJsZSAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BX0xMX0VDX01FTU9SWSBNZW1vcnkgaW5jcmVtZW50IG1vZGUKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfRE1BX01FTU9SWV9JTkNSRU1FTlQgXAorICBETUFfQ0NSX01JTkMgLyohPCBNZW1vcnkgaW5jcmVtZW50IG1vZGUgRW5hYmxlICAqLworI2RlZmluZSBMTF9ETUFfTUVNT1JZX05PSU5DUkVNRU5UIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBNZW1vcnkgaW5jcmVtZW50IG1vZGUgRGlzYWJsZSAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BX0xMX0VDX1BEQVRBQUxJR04gUGVyaXBoZXJhbCBkYXRhIGFsaWdubWVudAorICogQHsKKyAqLworI2RlZmluZSBMTF9ETUFfUERBVEFBTElHTl9CWVRFIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBQZXJpcGhlcmFsIGRhdGEgYWxpZ25tZW50IDogQnl0ZSAgICAgKi8KKyNkZWZpbmUgTExfRE1BX1BEQVRBQUxJR05fSEFMRldPUkQgXAorICBETUFfQ0NSX1BTSVpFXzAgLyohPCBQZXJpcGhlcmFsIGRhdGEgYWxpZ25tZW50IDogSGFsZldvcmQgKi8KKyNkZWZpbmUgTExfRE1BX1BEQVRBQUxJR05fV09SRCBcCisgIERNQV9DQ1JfUFNJWkVfMSAvKiE8IFBlcmlwaGVyYWwgZGF0YSBhbGlnbm1lbnQgOiBXb3JkICAgICAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BX0xMX0VDX01EQVRBQUxJR04gTWVtb3J5IGRhdGEgYWxpZ25tZW50CisgKiBAeworICovCisjZGVmaW5lIExMX0RNQV9NREFUQUFMSUdOX0JZVEUgXAorICAweDAwMDAwMDAwVSAvKiE8IE1lbW9yeSBkYXRhIGFsaWdubWVudCA6IEJ5dGUgICAgICovCisjZGVmaW5lIExMX0RNQV9NREFUQUFMSUdOX0hBTEZXT1JEIFwKKyAgRE1BX0NDUl9NU0laRV8wIC8qITwgTWVtb3J5IGRhdGEgYWxpZ25tZW50IDogSGFsZldvcmQgKi8KKyNkZWZpbmUgTExfRE1BX01EQVRBQUxJR05fV09SRCBcCisgIERNQV9DQ1JfTVNJWkVfMSAvKiE8IE1lbW9yeSBkYXRhIGFsaWdubWVudCA6IFdvcmQgICAgICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBETUFfTExfRUNfUFJJT1JJVFkgVHJhbnNmZXIgUHJpb3JpdHkgbGV2ZWwKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfRE1BX1BSSU9SSVRZX0xPVyAweDAwMDAwMDAwVSAgICAgLyohPCBQcmlvcml0eSBsZXZlbCA6IExvdyAgICAgICAqLworI2RlZmluZSBMTF9ETUFfUFJJT1JJVFlfTUVESVVNIERNQV9DQ1JfUExfMCAvKiE8IFByaW9yaXR5IGxldmVsIDogTWVkaXVtICAgICovCisjZGVmaW5lIExMX0RNQV9QUklPUklUWV9ISUdIIERNQV9DQ1JfUExfMSAgIC8qITwgUHJpb3JpdHkgbGV2ZWwgOiBIaWdoICAgICAgKi8KKyNkZWZpbmUgTExfRE1BX1BSSU9SSVRZX1ZFUllISUdIIERNQV9DQ1JfUEwgLyohPCBQcmlvcml0eSBsZXZlbCA6IFZlcnlfSGlnaCAqLworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBETUFfTExfRXhwb3J0ZWRfTWFjcm9zIERNQSBFeHBvcnRlZCBNYWNyb3MKKyAqIEB7CisgKi8KKworLyoqIEBkZWZncm91cCBETUFfTExfRU1fV1JJVEVfUkVBRCBDb21tb24gV3JpdGUgYW5kIHJlYWQgcmVnaXN0ZXJzIG1hY3JvcworICogQHsKKyAqLworLyoqCisgKiBAYnJpZWYgIFdyaXRlIGEgdmFsdWUgaW4gRE1BIHJlZ2lzdGVyCisgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBETUEgSW5zdGFuY2UKKyAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSB3cml0dGVuCisgKiBAcGFyYW0gIF9fVkFMVUVfXyBWYWx1ZSB0byBiZSB3cml0dGVuIGluIHRoZSByZWdpc3RlcgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgTExfRE1BX1dyaXRlUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXywgX19WQUxVRV9fKSBcCisgIFdSSVRFX1JFRyhfX0lOU1RBTkNFX18tPl9fUkVHX18sIChfX1ZBTFVFX18pKQorCisvKioKKyAqIEBicmllZiAgUmVhZCBhIHZhbHVlIGluIERNQSByZWdpc3RlcgorICogQHBhcmFtICBfX0lOU1RBTkNFX18gRE1BIEluc3RhbmNlCisgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgcmVhZAorICogQHJldHZhbCBSZWdpc3RlciB2YWx1ZQorICovCisjZGVmaW5lIExMX0RNQV9SZWFkUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXykgUkVBRF9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fKQorLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BX0xMX0VNX0NPTlZFUlRfRE1BeENIQU5ORUx5IENvbnZlcnQgRE1BeENoYW5uZWx5CisgKiBAeworICovCisvKioKKyAqIEBicmllZiAgQ29udmVydCBETUF4X0NoYW5uZWx5IGludG8gRE1BeAorICogQHBhcmFtICBfX0NIQU5ORUxfSU5TVEFOQ0VfXyBETUF4X0NoYW5uZWx5CisgKiBAcmV0dmFsIERNQXgKKyAqLworI2lmIGRlZmluZWQoRE1BMV9DaGFubmVsOCkKKyNkZWZpbmUgX19MTF9ETUFfR0VUX0lOU1RBTkNFKF9fQ0hBTk5FTF9JTlNUQU5DRV9fKSBcCisgICgoKHVpbnQzMl90KShfX0NIQU5ORUxfSU5TVEFOQ0VfXykgPiAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDgpKSA/IERNQTIgOiBETUExKQorI2Vsc2UKKyNkZWZpbmUgX19MTF9ETUFfR0VUX0lOU1RBTkNFKF9fQ0hBTk5FTF9JTlNUQU5DRV9fKSBcCisgICgoKHVpbnQzMl90KShfX0NIQU5ORUxfSU5TVEFOQ0VfXykgPiAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDYpKSA/IERNQTIgOiBETUExKQorI2VuZGlmIC8qIERNQTFfQ2hhbm5lbDggKi8KKy8qKgorICogQGJyaWVmICBDb252ZXJ0IERNQXhfQ2hhbm5lbHkgaW50byBMTF9ETUFfQ0hBTk5FTF95CisgKiBAcGFyYW0gIF9fQ0hBTk5FTF9JTlNUQU5DRV9fIERNQXhfQ2hhbm5lbHkKKyAqIEByZXR2YWwgTExfRE1BX0NIQU5ORUxfeQorICovCisjaWYgZGVmaW5lZChETUExX0NoYW5uZWw4KQorI2RlZmluZSBfX0xMX0RNQV9HRVRfQ0hBTk5FTChfX0NIQU5ORUxfSU5TVEFOQ0VfXykgICAgICAgICAgICAgICAgICAgXAorICAoKCh1aW50MzJfdCkoX19DSEFOTkVMX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMSkpICAgXAorICAgICAgID8gTExfRE1BX0NIQU5ORUxfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAoKHVpbnQzMl90KShfX0NIQU5ORUxfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWwxKSkgXAorICAgICAgID8gTExfRE1BX0NIQU5ORUxfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAoKHVpbnQzMl90KShfX0NIQU5ORUxfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwyKSkgXAorICAgICAgID8gTExfRE1BX0NIQU5ORUxfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAoKHVpbnQzMl90KShfX0NIQU5ORUxfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWwyKSkgXAorICAgICAgID8gTExfRE1BX0NIQU5ORUxfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAoKHVpbnQzMl90KShfX0NIQU5ORUxfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwzKSkgXAorICAgICAgID8gTExfRE1BX0NIQU5ORUxfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAoKHVpbnQzMl90KShfX0NIQU5ORUxfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWwzKSkgXAorICAgICAgID8gTExfRE1BX0NIQU5ORUxfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAoKHVpbnQzMl90KShfX0NIQU5ORUxfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw0KSkgXAorICAgICAgID8gTExfRE1BX0NIQU5ORUxfNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAoKHVpbnQzMl90KShfX0NIQU5ORUxfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWw0KSkgXAorICAgICAgID8gTExfRE1BX0NIQU5ORUxfNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAoKHVpbnQzMl90KShfX0NIQU5ORUxfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw1KSkgXAorICAgICAgID8gTExfRE1BX0NIQU5ORUxfNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAoKHVpbnQzMl90KShfX0NIQU5ORUxfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWw1KSkgXAorICAgICAgID8gTExfRE1BX0NIQU5ORUxfNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAoKHVpbnQzMl90KShfX0NIQU5ORUxfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw2KSkgXAorICAgICAgID8gTExfRE1BX0NIQU5ORUxfNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAoKHVpbnQzMl90KShfX0NIQU5ORUxfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWw2KSkgXAorICAgICAgID8gTExfRE1BX0NIQU5ORUxfNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAoKHVpbnQzMl90KShfX0NIQU5ORUxfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw3KSkgXAorICAgICAgID8gTExfRE1BX0NIQU5ORUxfNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAoKHVpbnQzMl90KShfX0NIQU5ORUxfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWw3KSkgXAorICAgICAgID8gTExfRE1BX0NIQU5ORUxfNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIDogTExfRE1BX0NIQU5ORUxfOCkKKyNlbHNlCisjZGVmaW5lIF9fTExfRE1BX0dFVF9DSEFOTkVMKF9fQ0hBTk5FTF9JTlNUQU5DRV9fKSAgICAgICAgICAgICAgICAgICBcCisgICgoKHVpbnQzMl90KShfX0NIQU5ORUxfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwxKSkgICBcCisgICAgICAgPyBMTF9ETUFfQ0hBTk5FTF8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICA6ICgodWludDMyX3QpKF9fQ0hBTk5FTF9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDEpKSBcCisgICAgICAgPyBMTF9ETUFfQ0hBTk5FTF8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICA6ICgodWludDMyX3QpKF9fQ0hBTk5FTF9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDIpKSBcCisgICAgICAgPyBMTF9ETUFfQ0hBTk5FTF8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICA6ICgodWludDMyX3QpKF9fQ0hBTk5FTF9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDIpKSBcCisgICAgICAgPyBMTF9ETUFfQ0hBTk5FTF8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICA6ICgodWludDMyX3QpKF9fQ0hBTk5FTF9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDMpKSBcCisgICAgICAgPyBMTF9ETUFfQ0hBTk5FTF8zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICA6ICgodWludDMyX3QpKF9fQ0hBTk5FTF9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDMpKSBcCisgICAgICAgPyBMTF9ETUFfQ0hBTk5FTF8zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICA6ICgodWludDMyX3QpKF9fQ0hBTk5FTF9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDQpKSBcCisgICAgICAgPyBMTF9ETUFfQ0hBTk5FTF80ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICA6ICgodWludDMyX3QpKF9fQ0hBTk5FTF9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDQpKSBcCisgICAgICAgPyBMTF9ETUFfQ0hBTk5FTF80ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICA6ICgodWludDMyX3QpKF9fQ0hBTk5FTF9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDUpKSBcCisgICAgICAgPyBMTF9ETUFfQ0hBTk5FTF81ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICA6ICgodWludDMyX3QpKF9fQ0hBTk5FTF9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDUpKSBcCisgICAgICAgPyBMTF9ETUFfQ0hBTk5FTF81ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgOiBMTF9ETUFfQ0hBTk5FTF82KQorI2VuZGlmIC8qIERNQTFfQ2hhbm5lbDggKi8KKworLyoqCisgKiBAYnJpZWYgIENvbnZlcnQgRE1BIEluc3RhbmNlIERNQXggYW5kIExMX0RNQV9DSEFOTkVMX3kgaW50byBETUF4X0NoYW5uZWx5CisgKiBAcGFyYW0gIF9fRE1BX0lOU1RBTkNFX18gRE1BeAorICogQHBhcmFtICBfX0NIQU5ORUxfXyBMTF9ETUFfQ0hBTk5FTF95CisgKiBAcmV0dmFsIERNQXhfQ2hhbm5lbHkKKyAqLworI2lmIGRlZmluZWQoRE1BMV9DaGFubmVsOCkKKyNkZWZpbmUgX19MTF9ETUFfR0VUX0NIQU5ORUxfSU5TVEFOQ0UoX19ETUFfSU5TVEFOQ0VfXywgX19DSEFOTkVMX18pIFwKKyAgKCgoKHVpbnQzMl90KShfX0RNQV9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTEpKSAmJiAgICAgICAgICAgIFwKKyAgICAoKHVpbnQzMl90KShfX0NIQU5ORUxfXykgPT0gKCh1aW50MzJfdClMTF9ETUFfQ0hBTk5FTF8xKSkpICAgICAgIFwKKyAgICAgICA/IERNQTFfQ2hhbm5lbDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIDogKCgodWludDMyX3QpKF9fRE1BX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMikpICYmICAgICAgICAgIFwKKyAgICAgICgodWludDMyX3QpKF9fQ0hBTk5FTF9fKSA9PSAoKHVpbnQzMl90KUxMX0RNQV9DSEFOTkVMXzEpKSkgICAgIFwKKyAgICAgICA/IERNQTJfQ2hhbm5lbDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIDogKCgodWludDMyX3QpKF9fRE1BX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMSkpICYmICAgICAgICAgIFwKKyAgICAgICgodWludDMyX3QpKF9fQ0hBTk5FTF9fKSA9PSAoKHVpbnQzMl90KUxMX0RNQV9DSEFOTkVMXzIpKSkgICAgIFwKKyAgICAgICA/IERNQTFfQ2hhbm5lbDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIDogKCgodWludDMyX3QpKF9fRE1BX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMikpICYmICAgICAgICAgIFwKKyAgICAgICgodWludDMyX3QpKF9fQ0hBTk5FTF9fKSA9PSAoKHVpbnQzMl90KUxMX0RNQV9DSEFOTkVMXzIpKSkgICAgIFwKKyAgICAgICA/IERNQTJfQ2hhbm5lbDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIDogKCgodWludDMyX3QpKF9fRE1BX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMSkpICYmICAgICAgICAgIFwKKyAgICAgICgodWludDMyX3QpKF9fQ0hBTk5FTF9fKSA9PSAoKHVpbnQzMl90KUxMX0RNQV9DSEFOTkVMXzMpKSkgICAgIFwKKyAgICAgICA/IERNQTFfQ2hhbm5lbDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIDogKCgodWludDMyX3QpKF9fRE1BX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMikpICYmICAgICAgICAgIFwKKyAgICAgICgodWludDMyX3QpKF9fQ0hBTk5FTF9fKSA9PSAoKHVpbnQzMl90KUxMX0RNQV9DSEFOTkVMXzMpKSkgICAgIFwKKyAgICAgICA/IERNQTJfQ2hhbm5lbDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIDogKCgodWludDMyX3QpKF9fRE1BX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMSkpICYmICAgICAgICAgIFwKKyAgICAgICgodWludDMyX3QpKF9fQ0hBTk5FTF9fKSA9PSAoKHVpbnQzMl90KUxMX0RNQV9DSEFOTkVMXzQpKSkgICAgIFwKKyAgICAgICA/IERNQTFfQ2hhbm5lbDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIDogKCgodWludDMyX3QpKF9fRE1BX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMikpICYmICAgICAgICAgIFwKKyAgICAgICgodWludDMyX3QpKF9fQ0hBTk5FTF9fKSA9PSAoKHVpbnQzMl90KUxMX0RNQV9DSEFOTkVMXzQpKSkgICAgIFwKKyAgICAgICA/IERNQTJfQ2hhbm5lbDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIDogKCgodWludDMyX3QpKF9fRE1BX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMSkpICYmICAgICAgICAgIFwKKyAgICAgICgodWludDMyX3QpKF9fQ0hBTk5FTF9fKSA9PSAoKHVpbnQzMl90KUxMX0RNQV9DSEFOTkVMXzUpKSkgICAgIFwKKyAgICAgICA/IERNQTFfQ2hhbm5lbDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIDogKCgodWludDMyX3QpKF9fRE1BX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMikpICYmICAgICAgICAgIFwKKyAgICAgICgodWludDMyX3QpKF9fQ0hBTk5FTF9fKSA9PSAoKHVpbnQzMl90KUxMX0RNQV9DSEFOTkVMXzUpKSkgICAgIFwKKyAgICAgICA/IERNQTJfQ2hhbm5lbDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIDogKCgodWludDMyX3QpKF9fRE1BX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMSkpICYmICAgICAgICAgIFwKKyAgICAgICgodWludDMyX3QpKF9fQ0hBTk5FTF9fKSA9PSAoKHVpbnQzMl90KUxMX0RNQV9DSEFOTkVMXzYpKSkgICAgIFwKKyAgICAgICA/IERNQTFfQ2hhbm5lbDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIDogKCgodWludDMyX3QpKF9fRE1BX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMikpICYmICAgICAgICAgIFwKKyAgICAgICgodWludDMyX3QpKF9fQ0hBTk5FTF9fKSA9PSAoKHVpbnQzMl90KUxMX0RNQV9DSEFOTkVMXzYpKSkgICAgIFwKKyAgICAgICA/IERNQTJfQ2hhbm5lbDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIDogKCgodWludDMyX3QpKF9fRE1BX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMSkpICYmICAgICAgICAgIFwKKyAgICAgICgodWludDMyX3QpKF9fQ0hBTk5FTF9fKSA9PSAoKHVpbnQzMl90KUxMX0RNQV9DSEFOTkVMXzcpKSkgICAgIFwKKyAgICAgICA/IERNQTFfQ2hhbm5lbDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIDogKCgodWludDMyX3QpKF9fRE1BX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMikpICYmICAgICAgICAgIFwKKyAgICAgICgodWludDMyX3QpKF9fQ0hBTk5FTF9fKSA9PSAoKHVpbnQzMl90KUxMX0RNQV9DSEFOTkVMXzcpKSkgICAgIFwKKyAgICAgICA/IERNQTJfQ2hhbm5lbDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIDogKCgodWludDMyX3QpKF9fRE1BX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMSkpICYmICAgICAgICAgIFwKKyAgICAgICgodWludDMyX3QpKF9fQ0hBTk5FTF9fKSA9PSAoKHVpbnQzMl90KUxMX0RNQV9DSEFOTkVMXzgpKSkgICAgIFwKKyAgICAgICA/IERNQTFfQ2hhbm5lbDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICA6IERNQTJfQ2hhbm5lbDgpCisjZWxzZQorI2RlZmluZSBfX0xMX0RNQV9HRVRfQ0hBTk5FTF9JTlNUQU5DRShfX0RNQV9JTlNUQU5DRV9fLCBfX0NIQU5ORUxfXykgXAorICAoKCgodWludDMyX3QpKF9fRE1BX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMSkpICYmICAgICAgICAgICAgXAorICAgICgodWludDMyX3QpKF9fQ0hBTk5FTF9fKSA9PSAoKHVpbnQzMl90KUxMX0RNQV9DSEFOTkVMXzEpKSkgICAgICAgXAorICAgICAgID8gRE1BMV9DaGFubmVsMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAoKCh1aW50MzJfdCkoX19ETUFfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUEyKSkgJiYgICAgICAgICAgXAorICAgICAgKCh1aW50MzJfdCkoX19DSEFOTkVMX18pID09ICgodWludDMyX3QpTExfRE1BX0NIQU5ORUxfMSkpKSAgICAgXAorICAgICAgID8gRE1BMl9DaGFubmVsMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAoKCh1aW50MzJfdCkoX19ETUFfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExKSkgJiYgICAgICAgICAgXAorICAgICAgKCh1aW50MzJfdCkoX19DSEFOTkVMX18pID09ICgodWludDMyX3QpTExfRE1BX0NIQU5ORUxfMikpKSAgICAgXAorICAgICAgID8gRE1BMV9DaGFubmVsMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAoKCh1aW50MzJfdCkoX19ETUFfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUEyKSkgJiYgICAgICAgICAgXAorICAgICAgKCh1aW50MzJfdCkoX19DSEFOTkVMX18pID09ICgodWludDMyX3QpTExfRE1BX0NIQU5ORUxfMikpKSAgICAgXAorICAgICAgID8gRE1BMl9DaGFubmVsMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAoKCh1aW50MzJfdCkoX19ETUFfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExKSkgJiYgICAgICAgICAgXAorICAgICAgKCh1aW50MzJfdCkoX19DSEFOTkVMX18pID09ICgodWludDMyX3QpTExfRE1BX0NIQU5ORUxfMykpKSAgICAgXAorICAgICAgID8gRE1BMV9DaGFubmVsMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAoKCh1aW50MzJfdCkoX19ETUFfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUEyKSkgJiYgICAgICAgICAgXAorICAgICAgKCh1aW50MzJfdCkoX19DSEFOTkVMX18pID09ICgodWludDMyX3QpTExfRE1BX0NIQU5ORUxfMykpKSAgICAgXAorICAgICAgID8gRE1BMl9DaGFubmVsMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAoKCh1aW50MzJfdCkoX19ETUFfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExKSkgJiYgICAgICAgICAgXAorICAgICAgKCh1aW50MzJfdCkoX19DSEFOTkVMX18pID09ICgodWludDMyX3QpTExfRE1BX0NIQU5ORUxfNCkpKSAgICAgXAorICAgICAgID8gRE1BMV9DaGFubmVsNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAoKCh1aW50MzJfdCkoX19ETUFfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUEyKSkgJiYgICAgICAgICAgXAorICAgICAgKCh1aW50MzJfdCkoX19DSEFOTkVMX18pID09ICgodWludDMyX3QpTExfRE1BX0NIQU5ORUxfNCkpKSAgICAgXAorICAgICAgID8gRE1BMl9DaGFubmVsNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAoKCh1aW50MzJfdCkoX19ETUFfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExKSkgJiYgICAgICAgICAgXAorICAgICAgKCh1aW50MzJfdCkoX19DSEFOTkVMX18pID09ICgodWludDMyX3QpTExfRE1BX0NIQU5ORUxfNSkpKSAgICAgXAorICAgICAgID8gRE1BMV9DaGFubmVsNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAoKCh1aW50MzJfdCkoX19ETUFfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUEyKSkgJiYgICAgICAgICAgXAorICAgICAgKCh1aW50MzJfdCkoX19DSEFOTkVMX18pID09ICgodWludDMyX3QpTExfRE1BX0NIQU5ORUxfNSkpKSAgICAgXAorICAgICAgID8gRE1BMl9DaGFubmVsNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAoKCh1aW50MzJfdCkoX19ETUFfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExKSkgJiYgICAgICAgICAgXAorICAgICAgKCh1aW50MzJfdCkoX19DSEFOTkVMX18pID09ICgodWludDMyX3QpTExfRE1BX0NIQU5ORUxfNikpKSAgICAgXAorICAgICAgID8gRE1BMV9DaGFubmVsNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIDogRE1BMl9DaGFubmVsNikKKyNlbmRpZiAvKiBETUExX0NoYW5uZWw4ICovCisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRE1BX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucyBETUEgRXhwb3J0ZWQgRnVuY3Rpb25zCisgKiBAeworICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BX0xMX0VGX0NvbmZpZ3VyYXRpb24gQ29uZmlndXJhdGlvbgorICogQHsKKyAqLworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBETUEgY2hhbm5lbC4KKyAqIEBybXRvbGwgQ0NSICAgICAgICAgIEVOICAgICAgICAgICAgTExfRE1BX0VuYWJsZUNoYW5uZWwKKyAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF84ICgqKQorICogICAgICAgICAoKikgTm90IG9uIGFsbCBHNCBkZXZpY2VzCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0VuYWJsZUNoYW5uZWwoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwpIHsKKyAgdWludDMyX3QgZG1hX2Jhc2VfYWRkciA9ICh1aW50MzJfdClETUF4OworICBTRVRfQklUKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKSgodWludDMyX3QpKGRtYV9iYXNlX2FkZHIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsXSkpKQorICAgICAgICAgICAgICAtPkNDUiwKKyAgICAgICAgICBETUFfQ0NSX0VOKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgRE1BIGNoYW5uZWwuCisgKiBAcm10b2xsIENDUiAgICAgICAgICBFTiAgICAgICAgICAgIExMX0RNQV9EaXNhYmxlQ2hhbm5lbAorICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNyAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzggKCopCisgKiAgICAgICAgICgqKSBOb3Qgb24gYWxsIEc0IGRldmljZXMKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfRGlzYWJsZUNoYW5uZWwoRE1BX1R5cGVEZWYgKkRNQXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCkgeworICB1aW50MzJfdCBkbWFfYmFzZV9hZGRyID0gKHVpbnQzMl90KURNQXg7CisgIENMRUFSX0JJVCgoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKHVpbnQzMl90KShkbWFfYmFzZV9hZGRyICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsXSkpKQorICAgICAgICAgICAgICAgIC0+Q0NSLAorICAgICAgICAgICAgRE1BX0NDUl9FTik7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiBETUEgY2hhbm5lbCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICogQHJtdG9sbCBDQ1IgICAgICAgICAgRU4gICAgICAgICAgICBMTF9ETUFfSXNFbmFibGVkQ2hhbm5lbAorICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNyAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzggKCopCisgKiAgICAgICAgICgqKSBOb3Qgb24gYWxsIEc0IGRldmljZXMKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzRW5hYmxlZENoYW5uZWwoRE1BX1R5cGVEZWYgKkRNQXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCkgeworICB1aW50MzJfdCBkbWFfYmFzZV9hZGRyID0gKHVpbnQzMl90KURNQXg7CisgIHJldHVybiAoCisgICAgICAoUkVBRF9CSVQoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCgKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KShkbWFfYmFzZV9hZGRyICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWxdKSkpCisgICAgICAgICAgICAgICAgICAgIC0+Q0NSLAorICAgICAgICAgICAgICAgIERNQV9DQ1JfRU4pID09IChETUFfQ0NSX0VOKSkKKyAgICAgICAgICA/IDFVTAorICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENvbmZpZ3VyZSBhbGwgcGFyYW1ldGVycyBsaW5rIHRvIERNQSB0cmFuc2Zlci4KKyAqIEBybXRvbGwgQ0NSICAgICAgICAgIERJUiAgICAgICAgICAgTExfRE1BX0NvbmZpZ1RyYW5zZmVyXG4KKyAqICAgICAgICAgQ0NSICAgICAgICAgIE1FTTJNRU0gICAgICAgTExfRE1BX0NvbmZpZ1RyYW5zZmVyXG4KKyAqICAgICAgICAgQ0NSICAgICAgICAgIENJUkMgICAgICAgICAgTExfRE1BX0NvbmZpZ1RyYW5zZmVyXG4KKyAqICAgICAgICAgQ0NSICAgICAgICAgIFBJTkMgICAgICAgICAgTExfRE1BX0NvbmZpZ1RyYW5zZmVyXG4KKyAqICAgICAgICAgQ0NSICAgICAgICAgIE1JTkMgICAgICAgICAgTExfRE1BX0NvbmZpZ1RyYW5zZmVyXG4KKyAqICAgICAgICAgQ0NSICAgICAgICAgIFBTSVpFICAgICAgICAgTExfRE1BX0NvbmZpZ1RyYW5zZmVyXG4KKyAqICAgICAgICAgQ0NSICAgICAgICAgIE1TSVpFICAgICAgICAgTExfRE1BX0NvbmZpZ1RyYW5zZmVyXG4KKyAqICAgICAgICAgQ0NSICAgICAgICAgIFBMICAgICAgICAgICAgTExfRE1BX0NvbmZpZ1RyYW5zZmVyCisgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83ICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfOCAoKikKKyAqICAgICAgICAgKCopIE5vdCBvbiBhbGwgRzQgZGV2aWNlcworICogQHBhcmFtICBDb25maWd1cmF0aW9uIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBjb21iaW5hdGlvbiBvZiBhbGwgdGhlCisgKiBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0RJUkVDVElPTl9QRVJJUEhfVE9fTUVNT1JZIG9yIEByZWYKKyAqIExMX0RNQV9ESVJFQ1RJT05fTUVNT1JZX1RPX1BFUklQSCBvciBAcmVmIExMX0RNQV9ESVJFQ1RJT05fTUVNT1JZX1RPX01FTU9SWQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX01PREVfTk9STUFMIG9yIEByZWYgTExfRE1BX01PREVfQ0lSQ1VMQVIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9QRVJJUEhfSU5DUkVNRU5UIG9yIEByZWYgTExfRE1BX1BFUklQSF9OT0lOQ1JFTUVOVAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX01FTU9SWV9JTkNSRU1FTlQgb3IgQHJlZiBMTF9ETUFfTUVNT1JZX05PSU5DUkVNRU5UCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUERBVEFBTElHTl9CWVRFIG9yIEByZWYgTExfRE1BX1BEQVRBQUxJR05fSEFMRldPUkQKKyAqIG9yIEByZWYgTExfRE1BX1BEQVRBQUxJR05fV09SRAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX01EQVRBQUxJR05fQllURSBvciBAcmVmIExMX0RNQV9NREFUQUFMSUdOX0hBTEZXT1JECisgKiBvciBAcmVmIExMX0RNQV9NREFUQUFMSUdOX1dPUkQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9QUklPUklUWV9MT1cgb3IgQHJlZiBMTF9ETUFfUFJJT1JJVFlfTUVESVVNIG9yIEByZWYKKyAqIExMX0RNQV9QUklPUklUWV9ISUdIIG9yIEByZWYgTExfRE1BX1BSSU9SSVRZX1ZFUllISUdICisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0NvbmZpZ1RyYW5zZmVyKERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENvbmZpZ3VyYXRpb24pIHsKKyAgdWludDMyX3QgZG1hX2Jhc2VfYWRkciA9ICh1aW50MzJfdClETUF4OworICBNT0RJRllfUkVHKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKSgodWludDMyX3QpKGRtYV9iYXNlX2FkZHIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsXSkpKQorICAgICAgICAgICAgICAgICAtPkNDUiwKKyAgICAgICAgICAgICBETUFfQ0NSX0RJUiB8IERNQV9DQ1JfTUVNMk1FTSB8IERNQV9DQ1JfQ0lSQyB8IERNQV9DQ1JfUElOQyB8CisgICAgICAgICAgICAgICAgIERNQV9DQ1JfTUlOQyB8IERNQV9DQ1JfUFNJWkUgfCBETUFfQ0NSX01TSVpFIHwgRE1BX0NDUl9QTCwKKyAgICAgICAgICAgICBDb25maWd1cmF0aW9uKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFNldCBEYXRhIHRyYW5zZmVyIGRpcmVjdGlvbiAocmVhZCBmcm9tIHBlcmlwaGVyYWwgb3IgZnJvbSBtZW1vcnkpLgorICogQHJtdG9sbCBDQ1IgICAgICAgICAgRElSICAgICAgICAgICBMTF9ETUFfU2V0RGF0YVRyYW5zZmVyRGlyZWN0aW9uXG4KKyAqICAgICAgICAgQ0NSICAgICAgICAgIE1FTTJNRU0gICAgICAgTExfRE1BX1NldERhdGFUcmFuc2ZlckRpcmVjdGlvbgorICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNyAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzggKCopCisgKiAgICAgICAgICgqKSBOb3Qgb24gYWxsIEc0IGRldmljZXMKKyAqIEBwYXJhbSAgRGlyZWN0aW9uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfRElSRUNUSU9OX1BFUklQSF9UT19NRU1PUlkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9ESVJFQ1RJT05fTUVNT1JZX1RPX1BFUklQSAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0RJUkVDVElPTl9NRU1PUllfVE9fTUVNT1JZCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX1NldERhdGFUcmFuc2ZlckRpcmVjdGlvbihETUFfVHlwZURlZiAqRE1BeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRGlyZWN0aW9uKSB7CisgIHVpbnQzMl90IGRtYV9iYXNlX2FkZHIgPSAodWludDMyX3QpRE1BeDsKKyAgTU9ESUZZX1JFRygoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKHVpbnQzMl90KShkbWFfYmFzZV9hZGRyICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFOTkVMX09GRlNFVF9UQUJbQ2hhbm5lbF0pKSkKKyAgICAgICAgICAgICAgICAgLT5DQ1IsCisgICAgICAgICAgICAgRE1BX0NDUl9ESVIgfCBETUFfQ0NSX01FTTJNRU0sIERpcmVjdGlvbik7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgRGF0YSB0cmFuc2ZlciBkaXJlY3Rpb24gKHJlYWQgZnJvbSBwZXJpcGhlcmFsIG9yIGZyb20gbWVtb3J5KS4KKyAqIEBybXRvbGwgQ0NSICAgICAgICAgIERJUiAgICAgICAgICAgTExfRE1BX0dldERhdGFUcmFuc2ZlckRpcmVjdGlvblxuCisgKiAgICAgICAgIENDUiAgICAgICAgICBNRU0yTUVNICAgICAgIExMX0RNQV9HZXREYXRhVHJhbnNmZXJEaXJlY3Rpb24KKyAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF84ICgqKQorICogICAgICAgICAoKikgTm90IG9uIGFsbCBHNCBkZXZpY2VzCisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfRElSRUNUSU9OX1BFUklQSF9UT19NRU1PUlkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9ESVJFQ1RJT05fTUVNT1JZX1RPX1BFUklQSAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0RJUkVDVElPTl9NRU1PUllfVE9fTUVNT1JZCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfR2V0RGF0YVRyYW5zZmVyRGlyZWN0aW9uKERNQV9UeXBlRGVmICpETUF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCkgeworICB1aW50MzJfdCBkbWFfYmFzZV9hZGRyID0gKHVpbnQzMl90KURNQXg7CisgIHJldHVybiAoUkVBRF9CSVQoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KShkbWFfYmFzZV9hZGRyICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWxdKSkpCisgICAgICAgICAgICAgICAgICAgICAgIC0+Q0NSLAorICAgICAgICAgICAgICAgICAgIERNQV9DQ1JfRElSIHwgRE1BX0NDUl9NRU0yTUVNKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBTZXQgRE1BIG1vZGUgY2lyY3VsYXIgb3Igbm9ybWFsLgorICogQG5vdGUgVGhlIGNpcmN1bGFyIGJ1ZmZlciBtb2RlIGNhbm5vdCBiZSB1c2VkIGlmIHRoZSBtZW1vcnktdG8tbWVtb3J5CisgKiBkYXRhIHRyYW5zZmVyIGlzIGNvbmZpZ3VyZWQgb24gdGhlIHNlbGVjdGVkIENoYW5uZWwuCisgKiBAcm10b2xsIENDUiAgICAgICAgICBDSVJDICAgICAgICAgIExMX0RNQV9TZXRNb2RlCisgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83ICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfOCAoKikKKyAqICAgICAgICAgKCopIE5vdCBvbiBhbGwgRzQgZGV2aWNlcworICogQHBhcmFtICBNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfTU9ERV9OT1JNQUwKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9NT0RFX0NJUkNVTEFSCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX1NldE1vZGUoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBNb2RlKSB7CisgIHVpbnQzMl90IGRtYV9iYXNlX2FkZHIgPSAodWludDMyX3QpRE1BeDsKKyAgTU9ESUZZX1JFRygoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKHVpbnQzMl90KShkbWFfYmFzZV9hZGRyICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFOTkVMX09GRlNFVF9UQUJbQ2hhbm5lbF0pKSkKKyAgICAgICAgICAgICAgICAgLT5DQ1IsCisgICAgICAgICAgICAgRE1BX0NDUl9DSVJDLCBNb2RlKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBETUEgbW9kZSBjaXJjdWxhciBvciBub3JtYWwuCisgKiBAcm10b2xsIENDUiAgICAgICAgICBDSVJDICAgICAgICAgIExMX0RNQV9HZXRNb2RlCisgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83ICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfOCAoKikKKyAqICAgICAgICAgKCopIE5vdCBvbiBhbGwgRzQgZGV2aWNlcworICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX01PREVfTk9STUFMCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfTU9ERV9DSVJDVUxBUgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0dldE1vZGUoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwpIHsKKyAgdWludDMyX3QgZG1hX2Jhc2VfYWRkciA9ICh1aW50MzJfdClETUF4OworICByZXR1cm4gKFJFQURfQklUKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKSgoCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCkoZG1hX2Jhc2VfYWRkciArIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsXSkpKQorICAgICAgICAgICAgICAgICAgICAgICAtPkNDUiwKKyAgICAgICAgICAgICAgICAgICBETUFfQ0NSX0NJUkMpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFNldCBQZXJpcGhlcmFsIGluY3JlbWVudCBtb2RlLgorICogQHJtdG9sbCBDQ1IgICAgICAgICAgUElOQyAgICAgICAgICBMTF9ETUFfU2V0UGVyaXBoSW5jTW9kZQorICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNyAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzggKCopCisgKiAgICAgICAgICgqKSBOb3Qgb24gYWxsIEc0IGRldmljZXMKKyAqIEBwYXJhbSAgUGVyaXBoT3JNMk1TcmNJbmNNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZworICogdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX1BFUklQSF9JTkNSRU1FTlQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9QRVJJUEhfTk9JTkNSRU1FTlQKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfU2V0UGVyaXBoSW5jTW9kZShETUFfVHlwZURlZiAqRE1BeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQZXJpcGhPck0yTVNyY0luY01vZGUpIHsKKyAgdWludDMyX3QgZG1hX2Jhc2VfYWRkciA9ICh1aW50MzJfdClETUF4OworICBNT0RJRllfUkVHKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKSgodWludDMyX3QpKGRtYV9iYXNlX2FkZHIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsXSkpKQorICAgICAgICAgICAgICAgICAtPkNDUiwKKyAgICAgICAgICAgICBETUFfQ0NSX1BJTkMsIFBlcmlwaE9yTTJNU3JjSW5jTW9kZSk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgUGVyaXBoZXJhbCBpbmNyZW1lbnQgbW9kZS4KKyAqIEBybXRvbGwgQ0NSICAgICAgICAgIFBJTkMgICAgICAgICAgTExfRE1BX0dldFBlcmlwaEluY01vZGUKKyAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF84ICgqKQorICogICAgICAgICAoKikgTm90IG9uIGFsbCBHNCBkZXZpY2VzCisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUEVSSVBIX0lOQ1JFTUVOVAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX1BFUklQSF9OT0lOQ1JFTUVOVAorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0dldFBlcmlwaEluY01vZGUoRE1BX1R5cGVEZWYgKkRNQXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCkgeworICB1aW50MzJfdCBkbWFfYmFzZV9hZGRyID0gKHVpbnQzMl90KURNQXg7CisgIHJldHVybiAoUkVBRF9CSVQoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KShkbWFfYmFzZV9hZGRyICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWxdKSkpCisgICAgICAgICAgICAgICAgICAgICAgIC0+Q0NSLAorICAgICAgICAgICAgICAgICAgIERNQV9DQ1JfUElOQykpOworfQorCisvKioKKyAqIEBicmllZiAgU2V0IE1lbW9yeSBpbmNyZW1lbnQgbW9kZS4KKyAqIEBybXRvbGwgQ0NSICAgICAgICAgIE1JTkMgICAgICAgICAgTExfRE1BX1NldE1lbW9yeUluY01vZGUKKyAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF84ICgqKQorICogICAgICAgICAoKikgTm90IG9uIGFsbCBHNCBkZXZpY2VzCisgKiBAcGFyYW0gIE1lbW9yeU9yTTJNRHN0SW5jTW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcKKyAqIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9NRU1PUllfSU5DUkVNRU5UCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfTUVNT1JZX05PSU5DUkVNRU5UCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX1NldE1lbW9yeUluY01vZGUoRE1BX1R5cGVEZWYgKkRNQXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgTWVtb3J5T3JNMk1Ec3RJbmNNb2RlKSB7CisgIHVpbnQzMl90IGRtYV9iYXNlX2FkZHIgPSAodWludDMyX3QpRE1BeDsKKyAgTU9ESUZZX1JFRygoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKHVpbnQzMl90KShkbWFfYmFzZV9hZGRyICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFOTkVMX09GRlNFVF9UQUJbQ2hhbm5lbF0pKSkKKyAgICAgICAgICAgICAgICAgLT5DQ1IsCisgICAgICAgICAgICAgRE1BX0NDUl9NSU5DLCBNZW1vcnlPck0yTURzdEluY01vZGUpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IE1lbW9yeSBpbmNyZW1lbnQgbW9kZS4KKyAqIEBybXRvbGwgQ0NSICAgICAgICAgIE1JTkMgICAgICAgICAgTExfRE1BX0dldE1lbW9yeUluY01vZGUKKyAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF84ICgqKQorICogICAgICAgICAoKikgTm90IG9uIGFsbCBHNCBkZXZpY2VzCisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfTUVNT1JZX0lOQ1JFTUVOVAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX01FTU9SWV9OT0lOQ1JFTUVOVAorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0dldE1lbW9yeUluY01vZGUoRE1BX1R5cGVEZWYgKkRNQXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCkgeworICB1aW50MzJfdCBkbWFfYmFzZV9hZGRyID0gKHVpbnQzMl90KURNQXg7CisgIHJldHVybiAoUkVBRF9CSVQoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KShkbWFfYmFzZV9hZGRyICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWxdKSkpCisgICAgICAgICAgICAgICAgICAgICAgIC0+Q0NSLAorICAgICAgICAgICAgICAgICAgIERNQV9DQ1JfTUlOQykpOworfQorCisvKioKKyAqIEBicmllZiAgU2V0IFBlcmlwaGVyYWwgc2l6ZS4KKyAqIEBybXRvbGwgQ0NSICAgICAgICAgIFBTSVpFICAgICAgICAgTExfRE1BX1NldFBlcmlwaFNpemUKKyAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF84ICgqKQorICogICAgICAgICAoKikgTm90IG9uIGFsbCBHNCBkZXZpY2VzCisgKiBAcGFyYW0gIFBlcmlwaE9yTTJNU3JjRGF0YVNpemUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nCisgKiB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUERBVEFBTElHTl9CWVRFCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUERBVEFBTElHTl9IQUxGV09SRAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX1BEQVRBQUxJR05fV09SRAorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9TZXRQZXJpcGhTaXplKERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUGVyaXBoT3JNMk1TcmNEYXRhU2l6ZSkgeworICB1aW50MzJfdCBkbWFfYmFzZV9hZGRyID0gKHVpbnQzMl90KURNQXg7CisgIE1PRElGWV9SRUcoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCh1aW50MzJfdCkoZG1hX2Jhc2VfYWRkciArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWxdKSkpCisgICAgICAgICAgICAgICAgIC0+Q0NSLAorICAgICAgICAgICAgIERNQV9DQ1JfUFNJWkUsIFBlcmlwaE9yTTJNU3JjRGF0YVNpemUpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IFBlcmlwaGVyYWwgc2l6ZS4KKyAqIEBybXRvbGwgQ0NSICAgICAgICAgIFBTSVpFICAgICAgICAgTExfRE1BX0dldFBlcmlwaFNpemUKKyAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF84ICgqKQorICogICAgICAgICAoKikgTm90IG9uIGFsbCBHNCBkZXZpY2VzCisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUERBVEFBTElHTl9CWVRFCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUERBVEFBTElHTl9IQUxGV09SRAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX1BEQVRBQUxJR05fV09SRAorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0dldFBlcmlwaFNpemUoRE1BX1R5cGVEZWYgKkRNQXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCkgeworICB1aW50MzJfdCBkbWFfYmFzZV9hZGRyID0gKHVpbnQzMl90KURNQXg7CisgIHJldHVybiAoUkVBRF9CSVQoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KShkbWFfYmFzZV9hZGRyICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWxdKSkpCisgICAgICAgICAgICAgICAgICAgICAgIC0+Q0NSLAorICAgICAgICAgICAgICAgICAgIERNQV9DQ1JfUFNJWkUpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFNldCBNZW1vcnkgc2l6ZS4KKyAqIEBybXRvbGwgQ0NSICAgICAgICAgIE1TSVpFICAgICAgICAgTExfRE1BX1NldE1lbW9yeVNpemUKKyAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF84ICgqKQorICogICAgICAgICAoKikgTm90IG9uIGFsbCBHNCBkZXZpY2VzCisgKiBAcGFyYW0gIE1lbW9yeU9yTTJNRHN0RGF0YVNpemUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nCisgKiB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfTURBVEFBTElHTl9CWVRFCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfTURBVEFBTElHTl9IQUxGV09SRAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX01EQVRBQUxJR05fV09SRAorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9TZXRNZW1vcnlTaXplKERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgTWVtb3J5T3JNMk1Ec3REYXRhU2l6ZSkgeworICB1aW50MzJfdCBkbWFfYmFzZV9hZGRyID0gKHVpbnQzMl90KURNQXg7CisgIE1PRElGWV9SRUcoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCh1aW50MzJfdCkoZG1hX2Jhc2VfYWRkciArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWxdKSkpCisgICAgICAgICAgICAgICAgIC0+Q0NSLAorICAgICAgICAgICAgIERNQV9DQ1JfTVNJWkUsIE1lbW9yeU9yTTJNRHN0RGF0YVNpemUpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IE1lbW9yeSBzaXplLgorICogQHJtdG9sbCBDQ1IgICAgICAgICAgTVNJWkUgICAgICAgICBMTF9ETUFfR2V0TWVtb3J5U2l6ZQorICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNyAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzggKCopCisgKiAgICAgICAgICgqKSBOb3Qgb24gYWxsIEc0IGRldmljZXMKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9NREFUQUFMSUdOX0JZVEUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9NREFUQUFMSUdOX0hBTEZXT1JECisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfTURBVEFBTElHTl9XT1JECisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfR2V0TWVtb3J5U2l6ZShETUFfVHlwZURlZiAqRE1BeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKSB7CisgIHVpbnQzMl90IGRtYV9iYXNlX2FkZHIgPSAodWludDMyX3QpRE1BeDsKKyAgcmV0dXJuIChSRUFEX0JJVCgoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QpKGRtYV9iYXNlX2FkZHIgKyBDSEFOTkVMX09GRlNFVF9UQUJbQ2hhbm5lbF0pKSkKKyAgICAgICAgICAgICAgICAgICAgICAgLT5DQ1IsCisgICAgICAgICAgICAgICAgICAgRE1BX0NDUl9NU0laRSkpOworfQorCisvKioKKyAqIEBicmllZiAgU2V0IENoYW5uZWwgcHJpb3JpdHkgbGV2ZWwuCisgKiBAcm10b2xsIENDUiAgICAgICAgICBQTCAgICAgICAgICAgIExMX0RNQV9TZXRDaGFubmVsUHJpb3JpdHlMZXZlbAorICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNyAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzggKCopCisgKiAgICAgICAgICgqKSBOb3Qgb24gYWxsIEc0IGRldmljZXMKKyAqIEBwYXJhbSAgUHJpb3JpdHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9QUklPUklUWV9MT1cKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9QUklPUklUWV9NRURJVU0KKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9QUklPUklUWV9ISUdICisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUFJJT1JJVFlfVkVSWUhJR0gKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfU2V0Q2hhbm5lbFByaW9yaXR5TGV2ZWwoRE1BX1R5cGVEZWYgKkRNQXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQcmlvcml0eSkgeworICB1aW50MzJfdCBkbWFfYmFzZV9hZGRyID0gKHVpbnQzMl90KURNQXg7CisgIE1PRElGWV9SRUcoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCh1aW50MzJfdCkoZG1hX2Jhc2VfYWRkciArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWxdKSkpCisgICAgICAgICAgICAgICAgIC0+Q0NSLAorICAgICAgICAgICAgIERNQV9DQ1JfUEwsIFByaW9yaXR5KTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBDaGFubmVsIHByaW9yaXR5IGxldmVsLgorICogQHJtdG9sbCBDQ1IgICAgICAgICAgUEwgICAgICAgICAgICBMTF9ETUFfR2V0Q2hhbm5lbFByaW9yaXR5TGV2ZWwKKyAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF84ICgqKQorICogICAgICAgICAoKikgTm90IG9uIGFsbCBHNCBkZXZpY2VzCisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUFJJT1JJVFlfTE9XCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUFJJT1JJVFlfTUVESVVNCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUFJJT1JJVFlfSElHSAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX1BSSU9SSVRZX1ZFUllISUdICisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfR2V0Q2hhbm5lbFByaW9yaXR5TGV2ZWwoRE1BX1R5cGVEZWYgKkRNQXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpIHsKKyAgdWludDMyX3QgZG1hX2Jhc2VfYWRkciA9ICh1aW50MzJfdClETUF4OworICByZXR1cm4gKFJFQURfQklUKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKSgoCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCkoZG1hX2Jhc2VfYWRkciArIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsXSkpKQorICAgICAgICAgICAgICAgICAgICAgICAtPkNDUiwKKyAgICAgICAgICAgICAgICAgICBETUFfQ0NSX1BMKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBTZXQgTnVtYmVyIG9mIGRhdGEgdG8gdHJhbnNmZXIuCisgKiBAbm90ZSAgIFRoaXMgYWN0aW9uIGhhcyBubyBlZmZlY3QgaWYKKyAqICAgICAgICAgY2hhbm5lbCBpcyBlbmFibGVkLgorICogQHJtdG9sbCBDTkRUUiAgICAgICAgTkRUICAgICAgICAgICBMTF9ETUFfU2V0RGF0YUxlbmd0aAorICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNyAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzggKCopCisgKiAgICAgICAgICgqKSBOb3Qgb24gYWxsIEc0IGRldmljZXMKKyAqIEBwYXJhbSAgTmJEYXRhIEJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDB4MDAwMEZGRkYKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfU2V0RGF0YUxlbmd0aChETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE5iRGF0YSkgeworICB1aW50MzJfdCBkbWFfYmFzZV9hZGRyID0gKHVpbnQzMl90KURNQXg7CisgIE1PRElGWV9SRUcoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCh1aW50MzJfdCkoZG1hX2Jhc2VfYWRkciArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWxdKSkpCisgICAgICAgICAgICAgICAgIC0+Q05EVFIsCisgICAgICAgICAgICAgRE1BX0NORFRSX05EVCwgTmJEYXRhKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBOdW1iZXIgb2YgZGF0YSB0byB0cmFuc2Zlci4KKyAqIEBub3RlICAgT25jZSB0aGUgY2hhbm5lbCBpcyBlbmFibGVkLCB0aGUgcmV0dXJuIHZhbHVlIGluZGljYXRlIHRoZQorICogICAgICAgICByZW1haW5pbmcgYnl0ZXMgdG8gYmUgdHJhbnNtaXR0ZWQuCisgKiBAcm10b2xsIENORFRSICAgICAgICBORFQgICAgICAgICAgIExMX0RNQV9HZXREYXRhTGVuZ3RoCisgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83ICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfOCAoKikKKyAqICAgICAgICAgKCopIE5vdCBvbiBhbGwgRzQgZGV2aWNlcworICogQHJldHZhbCBCZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAweEZGRkZGRkZGCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfR2V0RGF0YUxlbmd0aChETUFfVHlwZURlZiAqRE1BeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKSB7CisgIHVpbnQzMl90IGRtYV9iYXNlX2FkZHIgPSAodWludDMyX3QpRE1BeDsKKyAgcmV0dXJuIChSRUFEX0JJVCgoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QpKGRtYV9iYXNlX2FkZHIgKyBDSEFOTkVMX09GRlNFVF9UQUJbQ2hhbm5lbF0pKSkKKyAgICAgICAgICAgICAgICAgICAgICAgLT5DTkRUUiwKKyAgICAgICAgICAgICAgICAgICBETUFfQ05EVFJfTkRUKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBDb25maWd1cmUgdGhlIFNvdXJjZSBhbmQgRGVzdGluYXRpb24gYWRkcmVzc2VzLgorICogQG5vdGUgICBUaGlzIEFQSSBtdXN0IG5vdCBiZSBjYWxsZWQgd2hlbiB0aGUgRE1BIGNoYW5uZWwgaXMgZW5hYmxlZC4KKyAqIEBub3RlICAgRWFjaCBJUCB1c2luZyBETUEgcHJvdmlkZXMgYW4gQVBJIHRvIGdldCBkaXJlY3RseSB0aGUgcmVnaXN0ZXIKKyAqIGFkZHJlc3MgKExMX1BQUF9ETUFfR2V0UmVnQWRkcikuCisgKiBAcm10b2xsIENQQVIgICAgICAgICBQQSAgICAgICAgICAgIExMX0RNQV9Db25maWdBZGRyZXNzZXNcbgorICogICAgICAgICBDTUFSICAgICAgICAgTUEgICAgICAgICAgICBMTF9ETUFfQ29uZmlnQWRkcmVzc2VzCisgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83ICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfOCAoKikKKyAqICAgICAgICAgKCopIE5vdCBvbiBhbGwgRzQgZGV2aWNlcworICogQHBhcmFtICBTcmNBZGRyZXNzIEJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDB4RkZGRkZGRkYKKyAqIEBwYXJhbSAgRHN0QWRkcmVzcyBCZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAweEZGRkZGRkZGCisgKiBAcGFyYW0gIERpcmVjdGlvbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0RJUkVDVElPTl9QRVJJUEhfVE9fTUVNT1JZCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfRElSRUNUSU9OX01FTU9SWV9UT19QRVJJUEgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9ESVJFQ1RJT05fTUVNT1JZX1RPX01FTU9SWQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9Db25maWdBZGRyZXNzZXMoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFNyY0FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IERzdEFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IERpcmVjdGlvbikgeworICB1aW50MzJfdCBkbWFfYmFzZV9hZGRyID0gKHVpbnQzMl90KURNQXg7CisKKyAgLyogRGlyZWN0aW9uIE1lbW9yeSB0byBQZXJpcGggKi8KKyAgaWYgKERpcmVjdGlvbiA9PSBMTF9ETUFfRElSRUNUSU9OX01FTU9SWV9UT19QRVJJUEgpIHsKKyAgICBXUklURV9SRUcoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCh1aW50MzJfdCkoZG1hX2Jhc2VfYWRkciArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsXSkpKQorICAgICAgICAgICAgICAgICAgLT5DTUFSLAorICAgICAgICAgICAgICBTcmNBZGRyZXNzKTsKKyAgICBXUklURV9SRUcoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCh1aW50MzJfdCkoZG1hX2Jhc2VfYWRkciArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsXSkpKQorICAgICAgICAgICAgICAgICAgLT5DUEFSLAorICAgICAgICAgICAgICBEc3RBZGRyZXNzKTsKKyAgfQorICAvKiBEaXJlY3Rpb24gUGVyaXBoIHRvIE1lbW9yeSBhbmQgTWVtb3J5IHRvIE1lbW9yeSAqLworICBlbHNlIHsKKyAgICBXUklURV9SRUcoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCh1aW50MzJfdCkoZG1hX2Jhc2VfYWRkciArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsXSkpKQorICAgICAgICAgICAgICAgICAgLT5DUEFSLAorICAgICAgICAgICAgICBTcmNBZGRyZXNzKTsKKyAgICBXUklURV9SRUcoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCh1aW50MzJfdCkoZG1hX2Jhc2VfYWRkciArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsXSkpKQorICAgICAgICAgICAgICAgICAgLT5DTUFSLAorICAgICAgICAgICAgICBEc3RBZGRyZXNzKTsKKyAgfQorfQorCisvKioKKyAqIEBicmllZiAgU2V0IHRoZSBNZW1vcnkgYWRkcmVzcy4KKyAqIEBub3RlICAgSW50ZXJmYWNlIHVzZWQgZm9yIGRpcmVjdGlvbiBMTF9ETUFfRElSRUNUSU9OX1BFUklQSF9UT19NRU1PUlkgb3IKKyAqIExMX0RNQV9ESVJFQ1RJT05fTUVNT1JZX1RPX1BFUklQSCBvbmx5LgorICogQG5vdGUgICBUaGlzIEFQSSBtdXN0IG5vdCBiZSBjYWxsZWQgd2hlbiB0aGUgRE1BIGNoYW5uZWwgaXMgZW5hYmxlZC4KKyAqIEBybXRvbGwgQ01BUiAgICAgICAgIE1BICAgICAgICAgICAgTExfRE1BX1NldE1lbW9yeUFkZHJlc3MKKyAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF84ICgqKQorICogICAgICAgICAoKikgTm90IG9uIGFsbCBHNCBkZXZpY2VzCisgKiBAcGFyYW0gIE1lbW9yeUFkZHJlc3MgQmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMHhGRkZGRkZGRgorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9TZXRNZW1vcnlBZGRyZXNzKERNQV9UeXBlRGVmICpETUF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE1lbW9yeUFkZHJlc3MpIHsKKyAgdWludDMyX3QgZG1hX2Jhc2VfYWRkciA9ICh1aW50MzJfdClETUF4OworICBXUklURV9SRUcoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCh1aW50MzJfdCkoZG1hX2Jhc2VfYWRkciArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFOTkVMX09GRlNFVF9UQUJbQ2hhbm5lbF0pKSkKKyAgICAgICAgICAgICAgICAtPkNNQVIsCisgICAgICAgICAgICBNZW1vcnlBZGRyZXNzKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFNldCB0aGUgUGVyaXBoZXJhbCBhZGRyZXNzLgorICogQG5vdGUgICBJbnRlcmZhY2UgdXNlZCBmb3IgZGlyZWN0aW9uIExMX0RNQV9ESVJFQ1RJT05fUEVSSVBIX1RPX01FTU9SWSBvcgorICogTExfRE1BX0RJUkVDVElPTl9NRU1PUllfVE9fUEVSSVBIIG9ubHkuCisgKiBAbm90ZSAgIFRoaXMgQVBJIG11c3Qgbm90IGJlIGNhbGxlZCB3aGVuIHRoZSBETUEgY2hhbm5lbCBpcyBlbmFibGVkLgorICogQHJtdG9sbCBDUEFSICAgICAgICAgUEEgICAgICAgICAgICBMTF9ETUFfU2V0UGVyaXBoQWRkcmVzcworICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNyAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzggKCopCisgKiAgICAgICAgICgqKSBOb3Qgb24gYWxsIEc0IGRldmljZXMKKyAqIEBwYXJhbSAgUGVyaXBoQWRkcmVzcyBCZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAweEZGRkZGRkZGCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX1NldFBlcmlwaEFkZHJlc3MoRE1BX1R5cGVEZWYgKkRNQXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUGVyaXBoQWRkcmVzcykgeworICB1aW50MzJfdCBkbWFfYmFzZV9hZGRyID0gKHVpbnQzMl90KURNQXg7CisgIFdSSVRFX1JFRygoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKHVpbnQzMl90KShkbWFfYmFzZV9hZGRyICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsXSkpKQorICAgICAgICAgICAgICAgIC0+Q1BBUiwKKyAgICAgICAgICAgIFBlcmlwaEFkZHJlc3MpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IE1lbW9yeSBhZGRyZXNzLgorICogQG5vdGUgICBJbnRlcmZhY2UgdXNlZCBmb3IgZGlyZWN0aW9uIExMX0RNQV9ESVJFQ1RJT05fUEVSSVBIX1RPX01FTU9SWSBvcgorICogTExfRE1BX0RJUkVDVElPTl9NRU1PUllfVE9fUEVSSVBIIG9ubHkuCisgKiBAcm10b2xsIENNQVIgICAgICAgICBNQSAgICAgICAgICAgIExMX0RNQV9HZXRNZW1vcnlBZGRyZXNzCisgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83ICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfOCAoKikKKyAqICAgICAgICAgKCopIE5vdCBvbiBhbGwgRzQgZGV2aWNlcworICogQHJldHZhbCBCZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAweEZGRkZGRkZGCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfR2V0TWVtb3J5QWRkcmVzcyhETUFfVHlwZURlZiAqRE1BeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKSB7CisgIHVpbnQzMl90IGRtYV9iYXNlX2FkZHIgPSAodWludDMyX3QpRE1BeDsKKyAgcmV0dXJuIChSRUFEX1JFRygoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QpKGRtYV9iYXNlX2FkZHIgKyBDSEFOTkVMX09GRlNFVF9UQUJbQ2hhbm5lbF0pKSkKKyAgICAgICAgICAgICAgICAgICAgICAgLT5DTUFSKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgUGVyaXBoZXJhbCBhZGRyZXNzLgorICogQG5vdGUgICBJbnRlcmZhY2UgdXNlZCBmb3IgZGlyZWN0aW9uIExMX0RNQV9ESVJFQ1RJT05fUEVSSVBIX1RPX01FTU9SWSBvcgorICogTExfRE1BX0RJUkVDVElPTl9NRU1PUllfVE9fUEVSSVBIIG9ubHkuCisgKiBAcm10b2xsIENQQVIgICAgICAgICBQQSAgICAgICAgICAgIExMX0RNQV9HZXRQZXJpcGhBZGRyZXNzCisgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83ICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfOCAoKikKKyAqICAgICAgICAgKCopIE5vdCBvbiBhbGwgRzQgZGV2aWNlcworICogQHJldHZhbCBCZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAweEZGRkZGRkZGCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfR2V0UGVyaXBoQWRkcmVzcyhETUFfVHlwZURlZiAqRE1BeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKSB7CisgIHVpbnQzMl90IGRtYV9iYXNlX2FkZHIgPSAodWludDMyX3QpRE1BeDsKKyAgcmV0dXJuIChSRUFEX1JFRygoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QpKGRtYV9iYXNlX2FkZHIgKyBDSEFOTkVMX09GRlNFVF9UQUJbQ2hhbm5lbF0pKSkKKyAgICAgICAgICAgICAgICAgICAgICAgLT5DUEFSKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBTZXQgdGhlIE1lbW9yeSB0byBNZW1vcnkgU291cmNlIGFkZHJlc3MuCisgKiBAbm90ZSAgIEludGVyZmFjZSB1c2VkIGZvciBkaXJlY3Rpb24gTExfRE1BX0RJUkVDVElPTl9NRU1PUllfVE9fTUVNT1JZIG9ubHkuCisgKiBAbm90ZSAgIFRoaXMgQVBJIG11c3Qgbm90IGJlIGNhbGxlZCB3aGVuIHRoZSBETUEgY2hhbm5lbCBpcyBlbmFibGVkLgorICogQHJtdG9sbCBDUEFSICAgICAgICAgUEEgICAgICAgICAgICBMTF9ETUFfU2V0TTJNU3JjQWRkcmVzcworICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNyAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzggKCopCisgKiAgICAgICAgICgqKSBOb3Qgb24gYWxsIEc0IGRldmljZXMKKyAqIEBwYXJhbSAgTWVtb3J5QWRkcmVzcyBCZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAweEZGRkZGRkZGCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX1NldE0yTVNyY0FkZHJlc3MoRE1BX1R5cGVEZWYgKkRNQXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgTWVtb3J5QWRkcmVzcykgeworICB1aW50MzJfdCBkbWFfYmFzZV9hZGRyID0gKHVpbnQzMl90KURNQXg7CisgIFdSSVRFX1JFRygoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKHVpbnQzMl90KShkbWFfYmFzZV9hZGRyICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsXSkpKQorICAgICAgICAgICAgICAgIC0+Q1BBUiwKKyAgICAgICAgICAgIE1lbW9yeUFkZHJlc3MpOworfQorCisvKioKKyAqIEBicmllZiAgU2V0IHRoZSBNZW1vcnkgdG8gTWVtb3J5IERlc3RpbmF0aW9uIGFkZHJlc3MuCisgKiBAbm90ZSAgIEludGVyZmFjZSB1c2VkIGZvciBkaXJlY3Rpb24gTExfRE1BX0RJUkVDVElPTl9NRU1PUllfVE9fTUVNT1JZIG9ubHkuCisgKiBAbm90ZSAgIFRoaXMgQVBJIG11c3Qgbm90IGJlIGNhbGxlZCB3aGVuIHRoZSBETUEgY2hhbm5lbCBpcyBlbmFibGVkLgorICogQHJtdG9sbCBDTUFSICAgICAgICAgTUEgICAgICAgICAgICBMTF9ETUFfU2V0TTJNRHN0QWRkcmVzcworICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNyAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzggKCopCisgKiAgICAgICAgICgqKSBOb3Qgb24gYWxsIEc0IGRldmljZXMKKyAqIEBwYXJhbSAgTWVtb3J5QWRkcmVzcyBCZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAweEZGRkZGRkZGCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX1NldE0yTURzdEFkZHJlc3MoRE1BX1R5cGVEZWYgKkRNQXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgTWVtb3J5QWRkcmVzcykgeworICB1aW50MzJfdCBkbWFfYmFzZV9hZGRyID0gKHVpbnQzMl90KURNQXg7CisgIFdSSVRFX1JFRygoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKHVpbnQzMl90KShkbWFfYmFzZV9hZGRyICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsXSkpKQorICAgICAgICAgICAgICAgIC0+Q01BUiwKKyAgICAgICAgICAgIE1lbW9yeUFkZHJlc3MpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IHRoZSBNZW1vcnkgdG8gTWVtb3J5IFNvdXJjZSBhZGRyZXNzLgorICogQG5vdGUgICBJbnRlcmZhY2UgdXNlZCBmb3IgZGlyZWN0aW9uIExMX0RNQV9ESVJFQ1RJT05fTUVNT1JZX1RPX01FTU9SWSBvbmx5LgorICogQHJtdG9sbCBDUEFSICAgICAgICAgUEEgICAgICAgICAgICBMTF9ETUFfR2V0TTJNU3JjQWRkcmVzcworICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNyAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzggKCopCisgKiAgICAgICAgICgqKSBOb3Qgb24gYWxsIEc0IGRldmljZXMKKyAqIEByZXR2YWwgQmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMHhGRkZGRkZGRgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0dldE0yTVNyY0FkZHJlc3MoRE1BX1R5cGVEZWYgKkRNQXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCkgeworICB1aW50MzJfdCBkbWFfYmFzZV9hZGRyID0gKHVpbnQzMl90KURNQXg7CisgIHJldHVybiAoUkVBRF9SRUcoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KShkbWFfYmFzZV9hZGRyICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWxdKSkpCisgICAgICAgICAgICAgICAgICAgICAgIC0+Q1BBUikpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IHRoZSBNZW1vcnkgdG8gTWVtb3J5IERlc3RpbmF0aW9uIGFkZHJlc3MuCisgKiBAbm90ZSAgIEludGVyZmFjZSB1c2VkIGZvciBkaXJlY3Rpb24gTExfRE1BX0RJUkVDVElPTl9NRU1PUllfVE9fTUVNT1JZIG9ubHkuCisgKiBAcm10b2xsIENNQVIgICAgICAgICBNQSAgICAgICAgICAgIExMX0RNQV9HZXRNMk1Ec3RBZGRyZXNzCisgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83ICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfOCAoKikKKyAqICAgICAgICAgKCopIE5vdCBvbiBhbGwgRzQgZGV2aWNlcworICogQHJldHZhbCBCZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAweEZGRkZGRkZGCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfR2V0TTJNRHN0QWRkcmVzcyhETUFfVHlwZURlZiAqRE1BeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKSB7CisgIHVpbnQzMl90IGRtYV9iYXNlX2FkZHIgPSAodWludDMyX3QpRE1BeDsKKyAgcmV0dXJuIChSRUFEX1JFRygoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QpKGRtYV9iYXNlX2FkZHIgKyBDSEFOTkVMX09GRlNFVF9UQUJbQ2hhbm5lbF0pKSkKKyAgICAgICAgICAgICAgICAgICAgICAgLT5DTUFSKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBTZXQgRE1BIHJlcXVlc3QgZm9yIERNQSBpbnN0YW5jZSBvbiBDaGFubmVsIHguCisgKiBAbm90ZSAgIFBsZWFzZSByZWZlciB0byBSZWZlcmVuY2UgTWFudWFsIHRvIGdldCB0aGUgYXZhaWxhYmxlIG1hcHBpbmcgb2YKKyAqIFJlcXVlc3QgdmFsdWUgbGluayB0byBDaGFubmVsIFNlbGVjdGlvbi4KKyAqIEBybXRvbGwgQ1NFTFIgICAgICAgIEMxUyAgICAgICAgICAgTExfRE1BX1NldFBlcmlwaFJlcXVlc3RcbgorICogICAgICAgICBDU0VMUiAgICAgICAgQzJTICAgICAgICAgICBMTF9ETUFfU2V0UGVyaXBoUmVxdWVzdFxuCisgKiAgICAgICAgIENTRUxSICAgICAgICBDM1MgICAgICAgICAgIExMX0RNQV9TZXRQZXJpcGhSZXF1ZXN0XG4KKyAqICAgICAgICAgQ1NFTFIgICAgICAgIEM0UyAgICAgICAgICAgTExfRE1BX1NldFBlcmlwaFJlcXVlc3RcbgorICogICAgICAgICBDU0VMUiAgICAgICAgQzVTICAgICAgICAgICBMTF9ETUFfU2V0UGVyaXBoUmVxdWVzdFxuCisgKiAgICAgICAgIENTRUxSICAgICAgICBDNlMgICAgICAgICAgIExMX0RNQV9TZXRQZXJpcGhSZXF1ZXN0XG4KKyAqICAgICAgICAgQ1NFTFIgICAgICAgIEM3UyAgICAgICAgICAgTExfRE1BX1NldFBlcmlwaFJlcXVlc3QKKyAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF84ICgqKQorICogICAgICAgICAoKikgTm90IG9uIGFsbCBHNCBkZXZpY2VzCisgKiBAcGFyYW0gIFBlcmlwaFJlcXVlc3QgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfTUVNMk1FTQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5FUkFUT1IwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTkVSQVRPUjEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VORVJBVE9SMgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5FUkFUT1IzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0FEQzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfREFDMV9DSDEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfREFDMV9DSDIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNNl9VUAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU03X1VQCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1NQSTFfUlgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfU1BJMV9UWAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9TUEkyX1JYCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1NQSTJfVFgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfU1BJM19SWAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9TUEkzX1RYCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0kyQzFfUlgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfSTJDMV9UWAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9JMkMyX1JYCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0kyQzJfVFgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfSTJDM19SWAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9JMkMzX1RYICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9JMkM0X1JYICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9JMkM0X1RYCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1VTQVJUMV9SWAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9VU0FSVDFfVFgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVVNBUlQyX1JYCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1VTQVJUMl9UWAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9VU0FSVDNfUlgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVVNBUlQzX1RYCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1VBUlQ0X1JYCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1VBUlQ0X1RYCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1VBUlQ1X1JYICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9VQVJUNV9UWCAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfTFBVQVJUMV9SWAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9MUFVBUlQxX1RYCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0FEQzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfQURDMyAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfQURDNCAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfQURDNSAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfUVNQSSAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfREFDMl9DSDEgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTFfQ0gxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTFfQ0gyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTFfQ0gzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTFfQ0g0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTFfVVAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMV9UUklHCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTFfQ09NCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTThfQ0gxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTThfQ0gyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTThfQ0gzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTThfQ0g0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTThfVVAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNOF9UUklHCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTThfQ09NCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTJfQ0gxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTJfQ0gyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTJfQ0gzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTJfQ0g0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTJfVVAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNM19DSDEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNM19DSDIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNM19DSDMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNM19DSDQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNM19VUAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0zX1RSSUcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNNF9DSDEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNNF9DSDIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNNF9DSDMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNNF9DSDQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNNF9VUAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU01X0NIMSAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNNV9DSDIgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTVfQ0gzICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU01X0NINCAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNNV9VUCAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNNV9UUklHICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xNV9DSDEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMTVfVVAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMTVfVFJJRworICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xNV9DT00KKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMTZfQ0gxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTE2X1VQCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTE3X0NIMQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xN19VUAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yMF9DSDEgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTIwX0NIMiAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMjBfQ0gzICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yMF9DSDQgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTIwX1VQICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9BRVNfSU4KKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfQUVTX09VVAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yMF9UUklHICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yMF9DT00gKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0hSVElNMV9NICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9IUlRJTTFfQSAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfSFJUSU0xX0IgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0hSVElNMV9DICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9IUlRJTTFfRCAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfSFJUSU0xX0UgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0hSVElNMV9GICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9EQUMzX0NIMQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9EQUMzX0NIMgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9EQUM0X0NIMSAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfREFDNF9DSDIgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1NQSTRfUlggKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1NQSTRfVFggKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1NBSTFfQQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9TQUkxX0IKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfRk1BQ19XUklURQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9GTUFDX1JFQUQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfQ09SRElDX1dSSVRFCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0NPUkRJQ19SRUFECisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1VDUEQxX1JYCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1VDUEQxX1RYCisgKiAgICAgICAgICgqKSBOb3Qgb24gYWxsIEc0IGRldmljZXMKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfU2V0UGVyaXBoUmVxdWVzdChETUFfVHlwZURlZiAqRE1BeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQZXJpcGhSZXF1ZXN0KSB7CisgIHVpbnQzMl90IGRtYW11eF9jY3Jfb2Zmc2V0ID0KKyAgICAgICgoKCh1aW50MzJfdClETUF4IF4gKHVpbnQzMl90KURNQTEpID4+IDEwVSkgKiA4VSk7CisgIE1PRElGWV9SRUcoKERNQU1VWDFfQ2hhbm5lbDAgKyBDaGFubmVsICsgZG1hbXV4X2Njcl9vZmZzZXQpLT5DQ1IsCisgICAgICAgICAgICAgRE1BTVVYX0N4Q1JfRE1BUkVRX0lELCBQZXJpcGhSZXF1ZXN0KTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBETUEgcmVxdWVzdCBmb3IgRE1BIGluc3RhbmNlIG9uIENoYW5uZWwgeC4KKyAqIEBybXRvbGwgQ1NFTFIgICAgICAgIEMxUyAgICAgICAgICAgTExfRE1BX0dldFBlcmlwaFJlcXVlc3RcbgorICogICAgICAgICBDU0VMUiAgICAgICAgQzJTICAgICAgICAgICBMTF9ETUFfR2V0UGVyaXBoUmVxdWVzdFxuCisgKiAgICAgICAgIENTRUxSICAgICAgICBDM1MgICAgICAgICAgIExMX0RNQV9HZXRQZXJpcGhSZXF1ZXN0XG4KKyAqICAgICAgICAgQ1NFTFIgICAgICAgIEM0UyAgICAgICAgICAgTExfRE1BX0dldFBlcmlwaFJlcXVlc3RcbgorICogICAgICAgICBDU0VMUiAgICAgICAgQzVTICAgICAgICAgICBMTF9ETUFfR2V0UGVyaXBoUmVxdWVzdFxuCisgKiAgICAgICAgIENTRUxSICAgICAgICBDNlMgICAgICAgICAgIExMX0RNQV9HZXRQZXJpcGhSZXF1ZXN0XG4KKyAqICAgICAgICAgQ1NFTFIgICAgICAgIEM3UyAgICAgICAgICAgTExfRE1BX0dldFBlcmlwaFJlcXVlc3QKKyAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF84ICgqKQorICogICAgICAgICAoKikgTm90IG9uIGFsbCBHNCBkZXZpY2VzCisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX01FTTJNRU0KKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VORVJBVE9SMAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5FUkFUT1IxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTkVSQVRPUjIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VORVJBVE9SMworICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9BREMxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0RBQzFfQ0gxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0RBQzFfQ0gyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTZfVVAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNN19VUAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9TUEkxX1JYCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1NQSTFfVFgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfU1BJMl9SWAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9TUEkyX1RYCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1NQSTNfUlgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfU1BJM19UWAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9JMkMxX1JYCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0kyQzFfVFgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfSTJDMl9SWAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9JMkMyX1RYCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0kyQzNfUlgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfSTJDM19UWCAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfSTJDNF9SWCAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfSTJDNF9UWAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9VU0FSVDFfUlgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVVNBUlQxX1RYCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1VTQVJUMl9SWAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9VU0FSVDJfVFgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVVNBUlQzX1JYCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1VTQVJUM19UWAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9VQVJUNF9SWAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9VQVJUNF9UWAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9VQVJUNV9SWCAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVUFSVDVfVFggKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0xQVUFSVDFfUlgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfTFBVQVJUMV9UWAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9BREMyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0FEQzMgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0FEQzQgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0FEQzUgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1FTUEkgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0RBQzJfQ0gxICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xX0NIMQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xX0NIMgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xX0NIMworICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xX0NINAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xX1VQCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTFfVFJJRworICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xX0NPTQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU04X0NIMQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU04X0NIMgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU04X0NIMworICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU04X0NINAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU04X1VQCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTThfVFJJRworICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU04X0NPTQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yX0NIMQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yX0NIMgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yX0NIMworICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yX0NINAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yX1VQCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTNfQ0gxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTNfQ0gyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTNfQ0gzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTNfQ0g0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTNfVVAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNM19UUklHCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTRfQ0gxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTRfQ0gyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTRfQ0gzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTRfQ0g0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTRfVVAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNNV9DSDEgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTVfQ0gyICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU01X0NIMyAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNNV9DSDQgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTVfVVAgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTVfVFJJRyAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMTVfQ0gxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTE1X1VQCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTE1X1RSSUcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMTVfQ09NCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTE2X0NIMQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xNl9VUAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xN19DSDEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMTdfVVAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMjBfQ0gxICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yMF9DSDIgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTIwX0NIMyAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMjBfQ0g0ICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yMF9VUCAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfQUVTX0lOCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0FFU19PVVQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMjBfVFJJRyAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMjBfQ09NICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9IUlRJTTFfTSAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfSFJUSU0xX0EgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0hSVElNMV9CICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9IUlRJTTFfQyAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfSFJUSU0xX0QgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0hSVElNMV9FICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9IUlRJTTFfRiAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfREFDM19DSDEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfREFDM19DSDIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfREFDNF9DSDEgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0RBQzRfQ0gyICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9TUEk0X1JYICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9TUEk0X1RYICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9TQUkxX0EKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfU0FJMV9CCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0ZNQUNfV1JJVEUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfRk1BQ19SRUFECisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0NPUkRJQ19XUklURQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9DT1JESUNfUkVBRAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9VQ1BEMV9SWAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9VQ1BEMV9UWAorICogICAgICAgICAoKikgTm90IG9uIGFsbCBHNCBkZXZpY2VzCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfR2V0UGVyaXBoUmVxdWVzdChETUFfVHlwZURlZiAqRE1BeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKSB7CisgIHVpbnQzMl90IGRtYW11eF9jY3Jfb2Zmc2V0ID0KKyAgICAgICgoKCh1aW50MzJfdClETUF4IF4gKHVpbnQzMl90KURNQTEpID4+IDEwVSkgKiA4VSk7CisgIHJldHVybiAoUkVBRF9CSVQoKERNQU1VWDFfQ2hhbm5lbDAgKyBDaGFubmVsICsgZG1hbXV4X2Njcl9vZmZzZXQpLT5DQ1IsCisgICAgICAgICAgICAgICAgICAgRE1BTVVYX0N4Q1JfRE1BUkVRX0lEKSk7Cit9CisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIERNQV9MTF9FRl9GTEFHX01hbmFnZW1lbnQgRkxBR19NYW5hZ2VtZW50CisgKiBAeworICovCisKKy8qKgorICogQGJyaWVmICBHZXQgQ2hhbm5lbCAxIGdsb2JhbCBpbnRlcnJ1cHQgZmxhZy4KKyAqIEBybXRvbGwgSVNSICAgICAgICAgIEdJRjEgICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19HSTEKKyAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfR0kxKERNQV9UeXBlRGVmICpETUF4KSB7CisgIHJldHVybiAoKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9HSUYxKSA9PSAoRE1BX0lTUl9HSUYxKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IENoYW5uZWwgMiBnbG9iYWwgaW50ZXJydXB0IGZsYWcuCisgKiBAcm10b2xsIElTUiAgICAgICAgICBHSUYyICAgICAgICAgIExMX0RNQV9Jc0FjdGl2ZUZsYWdfR0kyCisgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNBY3RpdmVGbGFnX0dJMihETUFfVHlwZURlZiAqRE1BeCkgeworICByZXR1cm4gKChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfR0lGMikgPT0gKERNQV9JU1JfR0lGMikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBDaGFubmVsIDMgZ2xvYmFsIGludGVycnVwdCBmbGFnLgorICogQHJtdG9sbCBJU1IgICAgICAgICAgR0lGMyAgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX0dJMworICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19HSTMoRE1BX1R5cGVEZWYgKkRNQXgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoRE1BeC0+SVNSLCBETUFfSVNSX0dJRjMpID09IChETUFfSVNSX0dJRjMpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgQ2hhbm5lbCA0IGdsb2JhbCBpbnRlcnJ1cHQgZmxhZy4KKyAqIEBybXRvbGwgSVNSICAgICAgICAgIEdJRjQgICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19HSTQKKyAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfR0k0KERNQV9UeXBlRGVmICpETUF4KSB7CisgIHJldHVybiAoKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9HSUY0KSA9PSAoRE1BX0lTUl9HSUY0KSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IENoYW5uZWwgNSBnbG9iYWwgaW50ZXJydXB0IGZsYWcuCisgKiBAcm10b2xsIElTUiAgICAgICAgICBHSUY1ICAgICAgICAgIExMX0RNQV9Jc0FjdGl2ZUZsYWdfR0k1CisgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNBY3RpdmVGbGFnX0dJNShETUFfVHlwZURlZiAqRE1BeCkgeworICByZXR1cm4gKChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfR0lGNSkgPT0gKERNQV9JU1JfR0lGNSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBDaGFubmVsIDYgZ2xvYmFsIGludGVycnVwdCBmbGFnLgorICogQHJtdG9sbCBJU1IgICAgICAgICAgR0lGNiAgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX0dJNgorICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19HSTYoRE1BX1R5cGVEZWYgKkRNQXgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoRE1BeC0+SVNSLCBETUFfSVNSX0dJRjYpID09IChETUFfSVNSX0dJRjYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKyNpZiBkZWZpbmVkKERNQTFfQ2hhbm5lbDcpCisvKioKKyAqIEBicmllZiAgR2V0IENoYW5uZWwgNyBnbG9iYWwgaW50ZXJydXB0IGZsYWcuCisgKiBAcm10b2xsIElTUiAgICAgICAgICBHSUY3ICAgICAgICAgIExMX0RNQV9Jc0FjdGl2ZUZsYWdfR0k3CisgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNBY3RpdmVGbGFnX0dJNyhETUFfVHlwZURlZiAqRE1BeCkgeworICByZXR1cm4gKChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfR0lGNykgPT0gKERNQV9JU1JfR0lGNykpID8gMVVMIDogMFVMKTsKK30KKyNlbmRpZiAvKiBETUExX0NoYW5uZWw3ICovCisKKyNpZiBkZWZpbmVkKERNQTFfQ2hhbm5lbDgpCisvKioKKyAqIEBicmllZiAgR2V0IENoYW5uZWwgOCBnbG9iYWwgaW50ZXJydXB0IGZsYWcuCisgKiBAcm10b2xsIElTUiAgICAgICAgICBHSUY4ICAgICAgICAgIExMX0RNQV9Jc0FjdGl2ZUZsYWdfR0k4CisgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNBY3RpdmVGbGFnX0dJOChETUFfVHlwZURlZiAqRE1BeCkgeworICByZXR1cm4gKChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfR0lGOCkgPT0gKERNQV9JU1JfR0lGOCkpID8gMVVMIDogMFVMKTsKK30KKyNlbmRpZiAvKiBETUExX0NoYW5uZWw4ICovCisKKy8qKgorICogQGJyaWVmICBHZXQgQ2hhbm5lbCAxIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuCisgKiBAcm10b2xsIElTUiAgICAgICAgICBUQ0lGMSAgICAgICAgIExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEMxCisgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNBY3RpdmVGbGFnX1RDMShETUFfVHlwZURlZiAqRE1BeCkgeworICByZXR1cm4gKChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfVENJRjEpID09IChETUFfSVNSX1RDSUYxKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IENoYW5uZWwgMiB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnLgorICogQHJtdG9sbCBJU1IgICAgICAgICAgVENJRjIgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX1RDMgorICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19UQzIoRE1BX1R5cGVEZWYgKkRNQXgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoRE1BeC0+SVNSLCBETUFfSVNSX1RDSUYyKSA9PSAoRE1BX0lTUl9UQ0lGMikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBDaGFubmVsIDMgdHJhbnNmZXIgY29tcGxldGUgZmxhZy4KKyAqIEBybXRvbGwgSVNSICAgICAgICAgIFRDSUYzICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19UQzMKKyAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEMzKERNQV9UeXBlRGVmICpETUF4KSB7CisgIHJldHVybiAoKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9UQ0lGMykgPT0gKERNQV9JU1JfVENJRjMpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgQ2hhbm5lbCA0IHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuCisgKiBAcm10b2xsIElTUiAgICAgICAgICBUQ0lGNCAgICAgICAgIExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEM0CisgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNBY3RpdmVGbGFnX1RDNChETUFfVHlwZURlZiAqRE1BeCkgeworICByZXR1cm4gKChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfVENJRjQpID09IChETUFfSVNSX1RDSUY0KSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IENoYW5uZWwgNSB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnLgorICogQHJtdG9sbCBJU1IgICAgICAgICAgVENJRjUgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX1RDNQorICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19UQzUoRE1BX1R5cGVEZWYgKkRNQXgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoRE1BeC0+SVNSLCBETUFfSVNSX1RDSUY1KSA9PSAoRE1BX0lTUl9UQ0lGNSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBDaGFubmVsIDYgdHJhbnNmZXIgY29tcGxldGUgZmxhZy4KKyAqIEBybXRvbGwgSVNSICAgICAgICAgIFRDSUY2ICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19UQzYKKyAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEM2KERNQV9UeXBlRGVmICpETUF4KSB7CisgIHJldHVybiAoKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9UQ0lGNikgPT0gKERNQV9JU1JfVENJRjYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKyNpZiBkZWZpbmVkKERNQTFfQ2hhbm5lbDcpCisvKioKKyAqIEBicmllZiAgR2V0IENoYW5uZWwgNyB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnLgorICogQHJtdG9sbCBJU1IgICAgICAgICAgVENJRjcgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX1RDNworICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19UQzcoRE1BX1R5cGVEZWYgKkRNQXgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoRE1BeC0+SVNSLCBETUFfSVNSX1RDSUY3KSA9PSAoRE1BX0lTUl9UQ0lGNykpID8gMVVMIDogMFVMKTsKK30KKyNlbmRpZiAvKiBETUExX0NoYW5uZWw3ICovCisKKyNpZiBkZWZpbmVkKERNQTFfQ2hhbm5lbDgpCisvKioKKyAqIEBicmllZiAgR2V0IENoYW5uZWwgOCB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnLgorICogQHJtdG9sbCBJU1IgICAgICAgICAgVENJRjggICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX1RDOAorICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19UQzgoRE1BX1R5cGVEZWYgKkRNQXgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoRE1BeC0+SVNSLCBETUFfSVNSX1RDSUY4KSA9PSAoRE1BX0lTUl9UQ0lGOCkpID8gMVVMIDogMFVMKTsKK30KKyNlbmRpZiAvKiBETUExX0NoYW5uZWw4ICovCisKKy8qKgorICogQGJyaWVmICBHZXQgQ2hhbm5lbCAxIGhhbGYgdHJhbnNmZXIgZmxhZy4KKyAqIEBybXRvbGwgSVNSICAgICAgICAgIEhUSUYxICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19IVDEKKyAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfSFQxKERNQV9UeXBlRGVmICpETUF4KSB7CisgIHJldHVybiAoKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9IVElGMSkgPT0gKERNQV9JU1JfSFRJRjEpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgQ2hhbm5lbCAyIGhhbGYgdHJhbnNmZXIgZmxhZy4KKyAqIEBybXRvbGwgSVNSICAgICAgICAgIEhUSUYyICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19IVDIKKyAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfSFQyKERNQV9UeXBlRGVmICpETUF4KSB7CisgIHJldHVybiAoKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9IVElGMikgPT0gKERNQV9JU1JfSFRJRjIpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgQ2hhbm5lbCAzIGhhbGYgdHJhbnNmZXIgZmxhZy4KKyAqIEBybXRvbGwgSVNSICAgICAgICAgIEhUSUYzICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19IVDMKKyAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfSFQzKERNQV9UeXBlRGVmICpETUF4KSB7CisgIHJldHVybiAoKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9IVElGMykgPT0gKERNQV9JU1JfSFRJRjMpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgQ2hhbm5lbCA0IGhhbGYgdHJhbnNmZXIgZmxhZy4KKyAqIEBybXRvbGwgSVNSICAgICAgICAgIEhUSUY0ICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19IVDQKKyAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfSFQ0KERNQV9UeXBlRGVmICpETUF4KSB7CisgIHJldHVybiAoKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9IVElGNCkgPT0gKERNQV9JU1JfSFRJRjQpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgQ2hhbm5lbCA1IGhhbGYgdHJhbnNmZXIgZmxhZy4KKyAqIEBybXRvbGwgSVNSICAgICAgICAgIEhUSUY1ICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19IVDUKKyAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfSFQ1KERNQV9UeXBlRGVmICpETUF4KSB7CisgIHJldHVybiAoKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9IVElGNSkgPT0gKERNQV9JU1JfSFRJRjUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgQ2hhbm5lbCA2IGhhbGYgdHJhbnNmZXIgZmxhZy4KKyAqIEBybXRvbGwgSVNSICAgICAgICAgIEhUSUY2ICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19IVDYKKyAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfSFQ2KERNQV9UeXBlRGVmICpETUF4KSB7CisgIHJldHVybiAoKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9IVElGNikgPT0gKERNQV9JU1JfSFRJRjYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKyNpZiBkZWZpbmVkKERNQTFfQ2hhbm5lbDgpCisvKioKKyAqIEBicmllZiAgR2V0IENoYW5uZWwgNyBoYWxmIHRyYW5zZmVyIGZsYWcuCisgKiBAcm10b2xsIElTUiAgICAgICAgICBIVElGNyAgICAgICAgIExMX0RNQV9Jc0FjdGl2ZUZsYWdfSFQ3CisgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNBY3RpdmVGbGFnX0hUNyhETUFfVHlwZURlZiAqRE1BeCkgeworICByZXR1cm4gKChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfSFRJRjcpID09IChETUFfSVNSX0hUSUY3KSkgPyAxVUwgOiAwVUwpOworfQorI2VuZGlmIC8qIERNQTFfQ2hhbm5lbDcgKi8KKworI2lmIGRlZmluZWQoRE1BMV9DaGFubmVsOCkKKy8qKgorICogQGJyaWVmICBHZXQgQ2hhbm5lbCA4IGhhbGYgdHJhbnNmZXIgZmxhZy4KKyAqIEBybXRvbGwgSVNSICAgICAgICAgIEhUSUY4ICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19IVDgKKyAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfSFQ4KERNQV9UeXBlRGVmICpETUF4KSB7CisgIHJldHVybiAoKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9IVElGOCkgPT0gKERNQV9JU1JfSFRJRjgpKSA/IDFVTCA6IDBVTCk7Cit9CisjZW5kaWYgLyogRE1BMV9DaGFubmVsOCAqLworCisvKioKKyAqIEBicmllZiAgR2V0IENoYW5uZWwgMSB0cmFuc2ZlciBlcnJvciBmbGFnLgorICogQHJtdG9sbCBJU1IgICAgICAgICAgVEVJRjEgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX1RFMQorICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19URTEoRE1BX1R5cGVEZWYgKkRNQXgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoRE1BeC0+SVNSLCBETUFfSVNSX1RFSUYxKSA9PSAoRE1BX0lTUl9URUlGMSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBDaGFubmVsIDIgdHJhbnNmZXIgZXJyb3IgZmxhZy4KKyAqIEBybXRvbGwgSVNSICAgICAgICAgIFRFSUYyICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19URTIKKyAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEUyKERNQV9UeXBlRGVmICpETUF4KSB7CisgIHJldHVybiAoKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9URUlGMikgPT0gKERNQV9JU1JfVEVJRjIpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgQ2hhbm5lbCAzIHRyYW5zZmVyIGVycm9yIGZsYWcuCisgKiBAcm10b2xsIElTUiAgICAgICAgICBURUlGMyAgICAgICAgIExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEUzCisgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNBY3RpdmVGbGFnX1RFMyhETUFfVHlwZURlZiAqRE1BeCkgeworICByZXR1cm4gKChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfVEVJRjMpID09IChETUFfSVNSX1RFSUYzKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IENoYW5uZWwgNCB0cmFuc2ZlciBlcnJvciBmbGFnLgorICogQHJtdG9sbCBJU1IgICAgICAgICAgVEVJRjQgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX1RFNAorICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19URTQoRE1BX1R5cGVEZWYgKkRNQXgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoRE1BeC0+SVNSLCBETUFfSVNSX1RFSUY0KSA9PSAoRE1BX0lTUl9URUlGNCkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBDaGFubmVsIDUgdHJhbnNmZXIgZXJyb3IgZmxhZy4KKyAqIEBybXRvbGwgSVNSICAgICAgICAgIFRFSUY1ICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19URTUKKyAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEU1KERNQV9UeXBlRGVmICpETUF4KSB7CisgIHJldHVybiAoKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9URUlGNSkgPT0gKERNQV9JU1JfVEVJRjUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgQ2hhbm5lbCA2IHRyYW5zZmVyIGVycm9yIGZsYWcuCisgKiBAcm10b2xsIElTUiAgICAgICAgICBURUlGNiAgICAgICAgIExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEU2CisgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNBY3RpdmVGbGFnX1RFNihETUFfVHlwZURlZiAqRE1BeCkgeworICByZXR1cm4gKChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfVEVJRjYpID09IChETUFfSVNSX1RFSUY2KSkgPyAxVUwgOiAwVUwpOworfQorCisjaWYgZGVmaW5lZChETUExX0NoYW5uZWw3KQorLyoqCisgKiBAYnJpZWYgIEdldCBDaGFubmVsIDcgdHJhbnNmZXIgZXJyb3IgZmxhZy4KKyAqIEBybXRvbGwgSVNSICAgICAgICAgIFRFSUY3ICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19URTcKKyAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEU3KERNQV9UeXBlRGVmICpETUF4KSB7CisgIHJldHVybiAoKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9URUlGNykgPT0gKERNQV9JU1JfVEVJRjcpKSA/IDFVTCA6IDBVTCk7Cit9CisjZW5kaWYgLyogRE1BMV9DaGFubmVsNyAqLworCisjaWYgZGVmaW5lZChETUExX0NoYW5uZWw4KQorLyoqCisgKiBAYnJpZWYgIEdldCBDaGFubmVsIDggdHJhbnNmZXIgZXJyb3IgZmxhZy4KKyAqIEBybXRvbGwgSVNSICAgICAgICAgIFRFSUY4ICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19URTgKKyAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEU4KERNQV9UeXBlRGVmICpETUF4KSB7CisgIHJldHVybiAoKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9URUlGOCkgPT0gKERNQV9JU1JfVEVJRjgpKSA/IDFVTCA6IDBVTCk7Cit9CisjZW5kaWYgLyogRE1BMV9DaGFubmVsOCAqLworCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgMSBnbG9iYWwgaW50ZXJydXB0IGZsYWcuCisgICogQG5vdGUgRG8gbm90IENsZWFyIENoYW5uZWwgMSBnbG9iYWwgaW50ZXJydXB0IGZsYWcgd2hlbiB0aGUgY2hhbm5lbCBpbiBPTi4KKyAgICBJbnN0ZWFkIGNsZWFyIHNwZWNpZmljIGZsYWdzIHRyYW5zZmVyIGNvbXBsZXRlLCBoYWxmIHRyYW5zZmVyICYgdHJhbnNmZXIKKyAgICBlcnJvciBmbGFnIHdpdGggTExfRE1BX0NsZWFyRmxhZ19UQzEsIExMX0RNQV9DbGVhckZsYWdfSFQxLAorICAgIExMX0RNQV9DbGVhckZsYWdfVEUxLiBidWcgaWQgMi4zLjEgaW4gUHJvZHVjdCBFcnJhdGEgU2hlZXQuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ0dJRjEgICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX0dJMQorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX0dJMShETUFfVHlwZURlZiAqRE1BeCkgeworICBXUklURV9SRUcoRE1BeC0+SUZDUiwgRE1BX0lGQ1JfQ0dJRjEpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgMiBnbG9iYWwgaW50ZXJydXB0IGZsYWcuCisgICogQG5vdGUgRG8gbm90IENsZWFyIENoYW5uZWwgMiBnbG9iYWwgaW50ZXJydXB0IGZsYWcgd2hlbiB0aGUgY2hhbm5lbCBpbiBPTi4KKyAgICBJbnN0ZWFkIGNsZWFyIHNwZWNpZmljIGZsYWdzIHRyYW5zZmVyIGNvbXBsZXRlLCBoYWxmIHRyYW5zZmVyICYgdHJhbnNmZXIKKyAgICBlcnJvciBmbGFnIHdpdGggTExfRE1BX0NsZWFyRmxhZ19UQzIsIExMX0RNQV9DbGVhckZsYWdfSFQyLAorICAgIExMX0RNQV9DbGVhckZsYWdfVEUyLiBidWcgaWQgMi4zLjEgaW4gUHJvZHVjdCBFcnJhdGEgU2hlZXQuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ0dJRjIgICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX0dJMgorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX0dJMihETUFfVHlwZURlZiAqRE1BeCkgeworICBXUklURV9SRUcoRE1BeC0+SUZDUiwgRE1BX0lGQ1JfQ0dJRjIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgMyBnbG9iYWwgaW50ZXJydXB0IGZsYWcuCisgICogQG5vdGUgRG8gbm90IENsZWFyIENoYW5uZWwgMyBnbG9iYWwgaW50ZXJydXB0IGZsYWcgd2hlbiB0aGUgY2hhbm5lbCBpbiBPTi4KKyAgICBJbnN0ZWFkIGNsZWFyIHNwZWNpZmljIGZsYWdzIHRyYW5zZmVyIGNvbXBsZXRlLCBoYWxmIHRyYW5zZmVyICYgdHJhbnNmZXIKKyAgICBlcnJvciBmbGFnIHdpdGggTExfRE1BX0NsZWFyRmxhZ19UQzMsIExMX0RNQV9DbGVhckZsYWdfSFQzLAorICAgIExMX0RNQV9DbGVhckZsYWdfVEUzLiBidWcgaWQgMi4zLjEgaW4gUHJvZHVjdCBFcnJhdGEgU2hlZXQuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ0dJRjMgICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX0dJMworICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX0dJMyhETUFfVHlwZURlZiAqRE1BeCkgeworICBXUklURV9SRUcoRE1BeC0+SUZDUiwgRE1BX0lGQ1JfQ0dJRjMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgNCBnbG9iYWwgaW50ZXJydXB0IGZsYWcuCisgICogQG5vdGUgRG8gbm90IENsZWFyIENoYW5uZWwgNCBnbG9iYWwgaW50ZXJydXB0IGZsYWcgd2hlbiB0aGUgY2hhbm5lbCBpbiBPTi4KKyAgICBJbnN0ZWFkIGNsZWFyIHNwZWNpZmljIGZsYWdzIHRyYW5zZmVyIGNvbXBsZXRlLCBoYWxmIHRyYW5zZmVyICYgdHJhbnNmZXIKKyAgICBlcnJvciBmbGFnIHdpdGggTExfRE1BX0NsZWFyRmxhZ19UQzQsIExMX0RNQV9DbGVhckZsYWdfSFQ0LAorICAgIExMX0RNQV9DbGVhckZsYWdfVEU0LiBidWcgaWQgMi4zLjEgaW4gUHJvZHVjdCBFcnJhdGEgU2hlZXQuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ0dJRjQgICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX0dJNAorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX0dJNChETUFfVHlwZURlZiAqRE1BeCkgeworICBXUklURV9SRUcoRE1BeC0+SUZDUiwgRE1BX0lGQ1JfQ0dJRjQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgNSBnbG9iYWwgaW50ZXJydXB0IGZsYWcuCisgICogQG5vdGUgRG8gbm90IENsZWFyIENoYW5uZWwgNSBnbG9iYWwgaW50ZXJydXB0IGZsYWcgd2hlbiB0aGUgY2hhbm5lbCBpbiBPTi4KKyAgICBJbnN0ZWFkIGNsZWFyIHNwZWNpZmljIGZsYWdzIHRyYW5zZmVyIGNvbXBsZXRlLCBoYWxmIHRyYW5zZmVyICYgdHJhbnNmZXIKKyAgICBlcnJvciBmbGFnIHdpdGggTExfRE1BX0NsZWFyRmxhZ19UQzUsIExMX0RNQV9DbGVhckZsYWdfSFQ1LAorICAgIExMX0RNQV9DbGVhckZsYWdfVEU1LiBidWcgaWQgMi4zLjEgaW4gUHJvZHVjdCBFcnJhdGEgU2hlZXQuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ0dJRjUgICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX0dJNQorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX0dJNShETUFfVHlwZURlZiAqRE1BeCkgeworICBXUklURV9SRUcoRE1BeC0+SUZDUiwgRE1BX0lGQ1JfQ0dJRjUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgNiBnbG9iYWwgaW50ZXJydXB0IGZsYWcuCisgICogQG5vdGUgRG8gbm90IENsZWFyIENoYW5uZWwgNiBnbG9iYWwgaW50ZXJydXB0IGZsYWcgd2hlbiB0aGUgY2hhbm5lbCBpbiBPTi4KKyAgICBJbnN0ZWFkIGNsZWFyIHNwZWNpZmljIGZsYWdzIHRyYW5zZmVyIGNvbXBsZXRlLCBoYWxmIHRyYW5zZmVyICYgdHJhbnNmZXIKKyAgICBlcnJvciBmbGFnIHdpdGggTExfRE1BX0NsZWFyRmxhZ19UQzYsIExMX0RNQV9DbGVhckZsYWdfSFQ2LAorICAgIExMX0RNQV9DbGVhckZsYWdfVEU2LiBidWcgaWQgMi4zLjEgaW4gUHJvZHVjdCBFcnJhdGEgU2hlZXQuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ0dJRjYgICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX0dJNgorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX0dJNihETUFfVHlwZURlZiAqRE1BeCkgeworICBXUklURV9SRUcoRE1BeC0+SUZDUiwgRE1BX0lGQ1JfQ0dJRjYpOworfQorCisjaWYgZGVmaW5lZChETUExX0NoYW5uZWw3KQorLyoqCisgICogQGJyaWVmICBDbGVhciBDaGFubmVsIDcgZ2xvYmFsIGludGVycnVwdCBmbGFnLgorICAqIEBub3RlIERvIG5vdCBDbGVhciBDaGFubmVsIDcgZ2xvYmFsIGludGVycnVwdCBmbGFnIHdoZW4gdGhlIGNoYW5uZWwgaW4gT04uCisgICAgSW5zdGVhZCBjbGVhciBzcGVjaWZpYyBmbGFncyB0cmFuc2ZlciBjb21wbGV0ZSwgaGFsZiB0cmFuc2ZlciAmIHRyYW5zZmVyCisgICAgZXJyb3IgZmxhZyB3aXRoIExMX0RNQV9DbGVhckZsYWdfVEM3LCBMTF9ETUFfQ2xlYXJGbGFnX0hUNywKKyAgICBMTF9ETUFfQ2xlYXJGbGFnX1RFNy4gYnVnIGlkIDIuMy4xIGluIFByb2R1Y3QgRXJyYXRhIFNoZWV0LgorICAqIEBybXRvbGwgSUZDUiAgICAgICAgIENHSUY3ICAgICAgICAgTExfRE1BX0NsZWFyRmxhZ19HSTcKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0NsZWFyRmxhZ19HSTcoRE1BX1R5cGVEZWYgKkRNQXgpIHsKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NHSUY3KTsKK30KKyNlbmRpZiAvKiBETUExX0NoYW5uZWw3ICovCisKKyNpZiBkZWZpbmVkKERNQTFfQ2hhbm5lbDgpCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgOCBnbG9iYWwgaW50ZXJydXB0IGZsYWcuCisgICogQG5vdGUgRG8gbm90IENsZWFyIENoYW5uZWwgOCBnbG9iYWwgaW50ZXJydXB0IGZsYWcgd2hlbiB0aGUgY2hhbm5lbCBpbiBPTi4KKyAgICBJbnN0ZWFkIGNsZWFyIHNwZWNpZmljIGZsYWdzIHRyYW5zZmVyIGNvbXBsZXRlLCBoYWxmIHRyYW5zZmVyICYgdHJhbnNmZXIKKyAgICBlcnJvciBmbGFnIHdpdGggTExfRE1BX0NsZWFyRmxhZ19UQzgsIExMX0RNQV9DbGVhckZsYWdfSFQ4LAorICAgIExMX0RNQV9DbGVhckZsYWdfVEU4LiBidWcgaWQgMi4zLjEgaW4gUHJvZHVjdCBFcnJhdGEgU2hlZXQuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ0dJRjggICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX0dJOAorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX0dJOChETUFfVHlwZURlZiAqRE1BeCkgeworICBXUklURV9SRUcoRE1BeC0+SUZDUiwgRE1BX0lGQ1JfQ0dJRjgpOworfQorI2VuZGlmIC8qIERNQTFfQ2hhbm5lbDggKi8KKworLyoqCisgKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgMSAgdHJhbnNmZXIgY29tcGxldGUgZmxhZy4KKyAqIEBybXRvbGwgSUZDUiAgICAgICAgIENUQ0lGMSAgICAgICAgTExfRE1BX0NsZWFyRmxhZ19UQzEKKyAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0NsZWFyRmxhZ19UQzEoRE1BX1R5cGVEZWYgKkRNQXgpIHsKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NUQ0lGMSk7Cit9CisKKy8qKgorICogQGJyaWVmICBDbGVhciBDaGFubmVsIDIgIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuCisgKiBAcm10b2xsIElGQ1IgICAgICAgICBDVENJRjIgICAgICAgIExMX0RNQV9DbGVhckZsYWdfVEMyCisgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9DbGVhckZsYWdfVEMyKERNQV9UeXBlRGVmICpETUF4KSB7CisgIFdSSVRFX1JFRyhETUF4LT5JRkNSLCBETUFfSUZDUl9DVENJRjIpOworfQorCisvKioKKyAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCAzICB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnLgorICogQHJtdG9sbCBJRkNSICAgICAgICAgQ1RDSUYzICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX1RDMworICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX1RDMyhETUFfVHlwZURlZiAqRE1BeCkgeworICBXUklURV9SRUcoRE1BeC0+SUZDUiwgRE1BX0lGQ1JfQ1RDSUYzKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgNCAgdHJhbnNmZXIgY29tcGxldGUgZmxhZy4KKyAqIEBybXRvbGwgSUZDUiAgICAgICAgIENUQ0lGNCAgICAgICAgTExfRE1BX0NsZWFyRmxhZ19UQzQKKyAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0NsZWFyRmxhZ19UQzQoRE1BX1R5cGVEZWYgKkRNQXgpIHsKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NUQ0lGNCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDbGVhciBDaGFubmVsIDUgIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuCisgKiBAcm10b2xsIElGQ1IgICAgICAgICBDVENJRjUgICAgICAgIExMX0RNQV9DbGVhckZsYWdfVEM1CisgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9DbGVhckZsYWdfVEM1KERNQV9UeXBlRGVmICpETUF4KSB7CisgIFdSSVRFX1JFRyhETUF4LT5JRkNSLCBETUFfSUZDUl9DVENJRjUpOworfQorCisvKioKKyAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCA2ICB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnLgorICogQHJtdG9sbCBJRkNSICAgICAgICAgQ1RDSUY2ICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX1RDNgorICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX1RDNihETUFfVHlwZURlZiAqRE1BeCkgeworICBXUklURV9SRUcoRE1BeC0+SUZDUiwgRE1BX0lGQ1JfQ1RDSUY2KTsKK30KKworI2lmIGRlZmluZWQoRE1BMV9DaGFubmVsNykKKy8qKgorICogQGJyaWVmICBDbGVhciBDaGFubmVsIDcgIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuCisgKiBAcm10b2xsIElGQ1IgICAgICAgICBDVENJRjcgICAgICAgIExMX0RNQV9DbGVhckZsYWdfVEM3CisgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9DbGVhckZsYWdfVEM3KERNQV9UeXBlRGVmICpETUF4KSB7CisgIFdSSVRFX1JFRyhETUF4LT5JRkNSLCBETUFfSUZDUl9DVENJRjcpOworfQorI2VuZGlmIC8qIERNQTFfQ2hhbm5lbDcgKi8KKworI2lmIGRlZmluZWQoRE1BMV9DaGFubmVsOCkKKy8qKgorICogQGJyaWVmICBDbGVhciBDaGFubmVsIDggIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuCisgKiBAcm10b2xsIElGQ1IgICAgICAgICBDVENJRjggICAgICAgIExMX0RNQV9DbGVhckZsYWdfVEM4CisgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9DbGVhckZsYWdfVEM4KERNQV9UeXBlRGVmICpETUF4KSB7CisgIFdSSVRFX1JFRyhETUF4LT5JRkNSLCBETUFfSUZDUl9DVENJRjgpOworfQorI2VuZGlmIC8qIERNQTFfQ2hhbm5lbDggKi8KKworLyoqCisgKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgMSAgaGFsZiB0cmFuc2ZlciBmbGFnLgorICogQHJtdG9sbCBJRkNSICAgICAgICAgQ0hUSUYxICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX0hUMQorICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX0hUMShETUFfVHlwZURlZiAqRE1BeCkgeworICBXUklURV9SRUcoRE1BeC0+SUZDUiwgRE1BX0lGQ1JfQ0hUSUYxKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgMiAgaGFsZiB0cmFuc2ZlciBmbGFnLgorICogQHJtdG9sbCBJRkNSICAgICAgICAgQ0hUSUYyICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX0hUMgorICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX0hUMihETUFfVHlwZURlZiAqRE1BeCkgeworICBXUklURV9SRUcoRE1BeC0+SUZDUiwgRE1BX0lGQ1JfQ0hUSUYyKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgMyAgaGFsZiB0cmFuc2ZlciBmbGFnLgorICogQHJtdG9sbCBJRkNSICAgICAgICAgQ0hUSUYzICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX0hUMworICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX0hUMyhETUFfVHlwZURlZiAqRE1BeCkgeworICBXUklURV9SRUcoRE1BeC0+SUZDUiwgRE1BX0lGQ1JfQ0hUSUYzKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgNCAgaGFsZiB0cmFuc2ZlciBmbGFnLgorICogQHJtdG9sbCBJRkNSICAgICAgICAgQ0hUSUY0ICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX0hUNAorICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX0hUNChETUFfVHlwZURlZiAqRE1BeCkgeworICBXUklURV9SRUcoRE1BeC0+SUZDUiwgRE1BX0lGQ1JfQ0hUSUY0KTsKK30KKworLyoqCisgKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgNSAgaGFsZiB0cmFuc2ZlciBmbGFnLgorICogQHJtdG9sbCBJRkNSICAgICAgICAgQ0hUSUY1ICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX0hUNQorICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX0hUNShETUFfVHlwZURlZiAqRE1BeCkgeworICBXUklURV9SRUcoRE1BeC0+SUZDUiwgRE1BX0lGQ1JfQ0hUSUY1KTsKK30KKworLyoqCisgKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgNiAgaGFsZiB0cmFuc2ZlciBmbGFnLgorICogQHJtdG9sbCBJRkNSICAgICAgICAgQ0hUSUY2ICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX0hUNgorICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX0hUNihETUFfVHlwZURlZiAqRE1BeCkgeworICBXUklURV9SRUcoRE1BeC0+SUZDUiwgRE1BX0lGQ1JfQ0hUSUY2KTsKK30KKworI2lmIGRlZmluZWQoRE1BMV9DaGFubmVsNykKKy8qKgorICogQGJyaWVmICBDbGVhciBDaGFubmVsIDcgIGhhbGYgdHJhbnNmZXIgZmxhZy4KKyAqIEBybXRvbGwgSUZDUiAgICAgICAgIENIVElGNyAgICAgICAgTExfRE1BX0NsZWFyRmxhZ19IVDcKKyAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0NsZWFyRmxhZ19IVDcoRE1BX1R5cGVEZWYgKkRNQXgpIHsKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NIVElGNyk7Cit9CisjZW5kaWYgLyogRE1BMV9DaGFubmVsNyAqLworCisjaWYgZGVmaW5lZChETUExX0NoYW5uZWw4KQorLyoqCisgKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgOCAgaGFsZiB0cmFuc2ZlciBmbGFnLgorICogQHJtdG9sbCBJRkNSICAgICAgICAgQ0hUSUY4ICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX0hUOAorICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX0hUOChETUFfVHlwZURlZiAqRE1BeCkgeworICBXUklURV9SRUcoRE1BeC0+SUZDUiwgRE1BX0lGQ1JfQ0hUSUY4KTsKK30KKyNlbmRpZiAvKiBETUExX0NoYW5uZWw4ICovCisKKy8qKgorICogQGJyaWVmICBDbGVhciBDaGFubmVsIDEgdHJhbnNmZXIgZXJyb3IgZmxhZy4KKyAqIEBybXRvbGwgSUZDUiAgICAgICAgIENURUlGMSAgICAgICAgTExfRE1BX0NsZWFyRmxhZ19URTEKKyAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0NsZWFyRmxhZ19URTEoRE1BX1R5cGVEZWYgKkRNQXgpIHsKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NURUlGMSk7Cit9CisKKy8qKgorICogQGJyaWVmICBDbGVhciBDaGFubmVsIDIgdHJhbnNmZXIgZXJyb3IgZmxhZy4KKyAqIEBybXRvbGwgSUZDUiAgICAgICAgIENURUlGMiAgICAgICAgTExfRE1BX0NsZWFyRmxhZ19URTIKKyAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0NsZWFyRmxhZ19URTIoRE1BX1R5cGVEZWYgKkRNQXgpIHsKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NURUlGMik7Cit9CisKKy8qKgorICogQGJyaWVmICBDbGVhciBDaGFubmVsIDMgdHJhbnNmZXIgZXJyb3IgZmxhZy4KKyAqIEBybXRvbGwgSUZDUiAgICAgICAgIENURUlGMyAgICAgICAgTExfRE1BX0NsZWFyRmxhZ19URTMKKyAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0NsZWFyRmxhZ19URTMoRE1BX1R5cGVEZWYgKkRNQXgpIHsKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NURUlGMyk7Cit9CisKKy8qKgorICogQGJyaWVmICBDbGVhciBDaGFubmVsIDQgdHJhbnNmZXIgZXJyb3IgZmxhZy4KKyAqIEBybXRvbGwgSUZDUiAgICAgICAgIENURUlGNCAgICAgICAgTExfRE1BX0NsZWFyRmxhZ19URTQKKyAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0NsZWFyRmxhZ19URTQoRE1BX1R5cGVEZWYgKkRNQXgpIHsKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NURUlGNCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDbGVhciBDaGFubmVsIDUgdHJhbnNmZXIgZXJyb3IgZmxhZy4KKyAqIEBybXRvbGwgSUZDUiAgICAgICAgIENURUlGNSAgICAgICAgTExfRE1BX0NsZWFyRmxhZ19URTUKKyAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0NsZWFyRmxhZ19URTUoRE1BX1R5cGVEZWYgKkRNQXgpIHsKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NURUlGNSk7Cit9CisKKy8qKgorICogQGJyaWVmICBDbGVhciBDaGFubmVsIDYgdHJhbnNmZXIgZXJyb3IgZmxhZy4KKyAqIEBybXRvbGwgSUZDUiAgICAgICAgIENURUlGNiAgICAgICAgTExfRE1BX0NsZWFyRmxhZ19URTYKKyAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0NsZWFyRmxhZ19URTYoRE1BX1R5cGVEZWYgKkRNQXgpIHsKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NURUlGNik7Cit9CisKKyNpZiBkZWZpbmVkKERNQTFfQ2hhbm5lbDcpCisvKioKKyAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCA3IHRyYW5zZmVyIGVycm9yIGZsYWcuCisgKiBAcm10b2xsIElGQ1IgICAgICAgICBDVEVJRjcgICAgICAgIExMX0RNQV9DbGVhckZsYWdfVEU3CisgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9DbGVhckZsYWdfVEU3KERNQV9UeXBlRGVmICpETUF4KSB7CisgIFdSSVRFX1JFRyhETUF4LT5JRkNSLCBETUFfSUZDUl9DVEVJRjcpOworfQorI2VuZGlmIC8qIERNQTFfQ2hhbm5lbDcgKi8KKworI2lmIGRlZmluZWQoRE1BMV9DaGFubmVsOCkKKy8qKgorICogQGJyaWVmICBDbGVhciBDaGFubmVsIDggdHJhbnNmZXIgZXJyb3IgZmxhZy4KKyAqIEBybXRvbGwgSUZDUiAgICAgICAgIENURUlGOCAgICAgICAgTExfRE1BX0NsZWFyRmxhZ19URTgKKyAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0NsZWFyRmxhZ19URTgoRE1BX1R5cGVEZWYgKkRNQXgpIHsKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NURUlGOCk7Cit9CisjZW5kaWYgLyogRE1BMV9DaGFubmVsOCAqLworCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBETUFfTExfRUZfSVRfTWFuYWdlbWVudCBJVF9NYW5hZ2VtZW50CisgKiBAeworICovCisvKioKKyAqIEBicmllZiAgRW5hYmxlIFRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdC4KKyAqIEBybXRvbGwgQ0NSICAgICAgICAgIFRDSUUgICAgICAgICAgTExfRE1BX0VuYWJsZUlUX1RDCisgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83ICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfOCAoKikKKyAqICAgICAgICAgKCopIE5vdCBvbiBhbGwgRzQgZGV2aWNlcworICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9FbmFibGVJVF9UQyhETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCkgeworICB1aW50MzJfdCBkbWFfYmFzZV9hZGRyID0gKHVpbnQzMl90KURNQXg7CisgIFNFVF9CSVQoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCh1aW50MzJfdCkoZG1hX2Jhc2VfYWRkciArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWxdKSkpCisgICAgICAgICAgICAgIC0+Q0NSLAorICAgICAgICAgIERNQV9DQ1JfVENJRSk7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgSGFsZiB0cmFuc2ZlciBpbnRlcnJ1cHQuCisgKiBAcm10b2xsIENDUiAgICAgICAgICBIVElFICAgICAgICAgIExMX0RNQV9FbmFibGVJVF9IVAorICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNyAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzggKCopCisgKiAgICAgICAgICgqKSBOb3Qgb24gYWxsIEc0IGRldmljZXMKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfRW5hYmxlSVRfSFQoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwpIHsKKyAgdWludDMyX3QgZG1hX2Jhc2VfYWRkciA9ICh1aW50MzJfdClETUF4OworICBTRVRfQklUKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKSgodWludDMyX3QpKGRtYV9iYXNlX2FkZHIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsXSkpKQorICAgICAgICAgICAgICAtPkNDUiwKKyAgICAgICAgICBETUFfQ0NSX0hUSUUpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIFRyYW5zZmVyIGVycm9yIGludGVycnVwdC4KKyAqIEBybXRvbGwgQ0NSICAgICAgICAgIFRFSUUgICAgICAgICAgTExfRE1BX0VuYWJsZUlUX1RFCisgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83ICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfOCAoKikKKyAqICAgICAgICAgKCopIE5vdCBvbiBhbGwgRzQgZGV2aWNlcworICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9FbmFibGVJVF9URShETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCkgeworICB1aW50MzJfdCBkbWFfYmFzZV9hZGRyID0gKHVpbnQzMl90KURNQXg7CisgIFNFVF9CSVQoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCh1aW50MzJfdCkoZG1hX2Jhc2VfYWRkciArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWxdKSkpCisgICAgICAgICAgICAgIC0+Q0NSLAorICAgICAgICAgIERNQV9DQ1JfVEVJRSk7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIFRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdC4KKyAqIEBybXRvbGwgQ0NSICAgICAgICAgIFRDSUUgICAgICAgICAgTExfRE1BX0Rpc2FibGVJVF9UQworICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNyAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzggKCopCisgKiAgICAgICAgICgqKSBOb3Qgb24gYWxsIEc0IGRldmljZXMKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfRGlzYWJsZUlUX1RDKERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsKSB7CisgIHVpbnQzMl90IGRtYV9iYXNlX2FkZHIgPSAodWludDMyX3QpRE1BeDsKKyAgQ0xFQVJfQklUKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKSgodWludDMyX3QpKGRtYV9iYXNlX2FkZHIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWxdKSkpCisgICAgICAgICAgICAgICAgLT5DQ1IsCisgICAgICAgICAgICBETUFfQ0NSX1RDSUUpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBIYWxmIHRyYW5zZmVyIGludGVycnVwdC4KKyAqIEBybXRvbGwgQ0NSICAgICAgICAgIEhUSUUgICAgICAgICAgTExfRE1BX0Rpc2FibGVJVF9IVAorICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNyAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzggKCopCisgKiAgICAgICAgICgqKSBOb3Qgb24gYWxsIEc0IGRldmljZXMKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfRGlzYWJsZUlUX0hUKERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsKSB7CisgIHVpbnQzMl90IGRtYV9iYXNlX2FkZHIgPSAodWludDMyX3QpRE1BeDsKKyAgQ0xFQVJfQklUKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKSgodWludDMyX3QpKGRtYV9iYXNlX2FkZHIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWxdKSkpCisgICAgICAgICAgICAgICAgLT5DQ1IsCisgICAgICAgICAgICBETUFfQ0NSX0hUSUUpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBUcmFuc2ZlciBlcnJvciBpbnRlcnJ1cHQuCisgKiBAcm10b2xsIENDUiAgICAgICAgICBURUlFICAgICAgICAgIExMX0RNQV9EaXNhYmxlSVRfVEUKKyAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF84ICgqKQorICogICAgICAgICAoKikgTm90IG9uIGFsbCBHNCBkZXZpY2VzCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0Rpc2FibGVJVF9URShETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCkgeworICB1aW50MzJfdCBkbWFfYmFzZV9hZGRyID0gKHVpbnQzMl90KURNQXg7CisgIENMRUFSX0JJVCgoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKHVpbnQzMl90KShkbWFfYmFzZV9hZGRyICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsXSkpKQorICAgICAgICAgICAgICAgIC0+Q0NSLAorICAgICAgICAgICAgRE1BX0NDUl9URUlFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIFRyYW5zZmVyIGNvbXBsZXRlIEludGVycnVwdCBpcyBlbmFibGVkLgorICogQHJtdG9sbCBDQ1IgICAgICAgICAgVENJRSAgICAgICAgICBMTF9ETUFfSXNFbmFibGVkSVRfVEMKKyAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF84ICgqKQorICogICAgICAgICAoKikgTm90IG9uIGFsbCBHNCBkZXZpY2VzCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0VuYWJsZWRJVF9UQyhETUFfVHlwZURlZiAqRE1BeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCkgeworICB1aW50MzJfdCBkbWFfYmFzZV9hZGRyID0gKHVpbnQzMl90KURNQXg7CisgIHJldHVybiAoCisgICAgICAoUkVBRF9CSVQoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCgKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KShkbWFfYmFzZV9hZGRyICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWxdKSkpCisgICAgICAgICAgICAgICAgICAgIC0+Q0NSLAorICAgICAgICAgICAgICAgIERNQV9DQ1JfVENJRSkgPT0gKERNQV9DQ1JfVENJRSkpCisgICAgICAgICAgPyAxVUwKKyAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiBIYWxmIHRyYW5zZmVyIEludGVycnVwdCBpcyBlbmFibGVkLgorICogQHJtdG9sbCBDQ1IgICAgICAgICAgSFRJRSAgICAgICAgICBMTF9ETUFfSXNFbmFibGVkSVRfSFQKKyAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF84ICgqKQorICogICAgICAgICAoKikgTm90IG9uIGFsbCBHNCBkZXZpY2VzCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0VuYWJsZWRJVF9IVChETUFfVHlwZURlZiAqRE1BeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCkgeworICB1aW50MzJfdCBkbWFfYmFzZV9hZGRyID0gKHVpbnQzMl90KURNQXg7CisgIHJldHVybiAoCisgICAgICAoUkVBRF9CSVQoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCgKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KShkbWFfYmFzZV9hZGRyICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWxdKSkpCisgICAgICAgICAgICAgICAgICAgIC0+Q0NSLAorICAgICAgICAgICAgICAgIERNQV9DQ1JfSFRJRSkgPT0gKERNQV9DQ1JfSFRJRSkpCisgICAgICAgICAgPyAxVUwKKyAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiBUcmFuc2ZlciBlcnJvciBJbnRlcnJ1cHQgaXMgZW5hYmxlZC4KKyAqIEBybXRvbGwgQ0NSICAgICAgICAgIFRFSUUgICAgICAgICAgTExfRE1BX0lzRW5hYmxlZElUX1RFCisgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83ICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfOCAoKikKKyAqICAgICAgICAgKCopIE5vdCBvbiBhbGwgRzQgZGV2aWNlcworICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNFbmFibGVkSVRfVEUoRE1BX1R5cGVEZWYgKkRNQXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpIHsKKyAgdWludDMyX3QgZG1hX2Jhc2VfYWRkciA9ICh1aW50MzJfdClETUF4OworICByZXR1cm4gKAorICAgICAgKFJFQURfQklUKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKSgoCisgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCkoZG1hX2Jhc2VfYWRkciArIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsXSkpKQorICAgICAgICAgICAgICAgICAgICAtPkNDUiwKKyAgICAgICAgICAgICAgICBETUFfQ0NSX1RFSUUpID09IChETUFfQ0NSX1RFSUUpKQorICAgICAgICAgID8gMVVMCisgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEB9CisgKi8KKworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBETUFfTExfRUZfSW5pdCBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgKiBAeworICovCisKK3VpbnQzMl90IExMX0RNQV9Jbml0KERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgTExfRE1BX0luaXRUeXBlRGVmICpETUFfSW5pdFN0cnVjdCk7Cit1aW50MzJfdCBMTF9ETUFfRGVJbml0KERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsKTsKK3ZvaWQgTExfRE1BX1N0cnVjdEluaXQoTExfRE1BX0luaXRUeXBlRGVmICpETUFfSW5pdFN0cnVjdCk7CisKKy8qKgorICogQH0KKyAqLworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCisKKyNlbmRpZiAvKiBETUExIHx8IERNQTIgKi8KKworLyoqCisgKiBAfQorICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1NUTTMyRzR4eF9MTF9ETUFfSCAqLwpkaWZmIC0tZ2l0IGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfbGxfZG1hbXV4LmggYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9sbF9kbWFtdXguaAppbmRleCBkYWU3NzdmLi44Mjc1YzI3IDEwMDY0NAotLS0gYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9sbF9kbWFtdXguaAorKysgYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9sbF9kbWFtdXguaApAQCAtMSwyMjkxICsxLDIyOTEgQEAKLS8qKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBAZmlsZSAgICBzdG0zMmc0eHhfbGxfZG1hbXV4LmgNCi0gKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQ0KLSAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIERNQU1VWCBMTCBtb2R1bGUuDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEBhdHRlbnRpb24NCi0gKg0KLSAqIENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4NCi0gKg0KLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGVybXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZQ0KLSAqIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4NCi0gKiBJZiBubyBMSUNFTlNFIGZpbGUgY29tZXMgd2l0aCB0aGlzIHNvZnR3YXJlLCBpdCBpcyBwcm92aWRlZCBBUy1JUy4NCi0gKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKi8NCi0NCi0vKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpZm5kZWYgX19TVE0zMkc0eHhfTExfRE1BTVVYX0gNCi0jZGVmaW5lIF9fU1RNMzJHNHh4X0xMX0RNQU1VWF9IDQotDQotI2lmZGVmIF9fY3BsdXNwbHVzDQotZXh0ZXJuICJDIiB7DQotI2VuZGlmDQotDQotLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaW5jbHVkZSAic3RtMzJnNHh4LmgiDQotDQotLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzR4eF9MTF9Ecml2ZXINCi0gKiBAew0KLSAqLw0KLQ0KLSNpZiBkZWZpbmVkKERNQU1VWDEpDQotDQotLyoqIEBkZWZncm91cCBETUFNVVhfTEwgRE1BTVVYDQotICogQHsNCi0gKi8NCi0NCi0vKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGRlZmdyb3VwIERNQU1VWF9MTF9Qcml2YXRlX0NvbnN0YW50cyBETUFNVVggUHJpdmF0ZSBDb25zdGFudHMNCi0gKiBAew0KLSAqLw0KLS8qIERlZmluZSB1c2VkIHRvIGdldCBETUFNVVggQ0NSIHJlZ2lzdGVyIHNpemUgKi8NCi0jZGVmaW5lIERNQU1VWF9DQ1JfU0laRSAweDAwMDAwMDA0VQ0KLQ0KLS8qIERlZmluZSB1c2VkIHRvIGdldCBETUFNVVggUkdDUiByZWdpc3RlciBzaXplICovDQotI2RlZmluZSBETUFNVVhfUkdDUl9TSVpFIDB4MDAwMDAwMDRVDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgRE1BTVVYX0xMX1ByaXZhdGVfTWFjcm9zIERNQU1VWCBQcml2YXRlIE1hY3Jvcw0KLSAqIEB7DQotICovDQotI2RlZmluZSBVTlVTRUQoWCkgKHZvaWQpWA0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgRE1BTVVYX0xMX0V4cG9ydGVkX0NvbnN0YW50cyBETUFNVVggRXhwb3J0ZWQgQ29uc3RhbnRzDQotICogQHsNCi0gKi8NCi0vKiogQGRlZmdyb3VwIERNQU1VWF9MTF9FQ19DTEVBUl9GTEFHIENsZWFyIEZsYWdzIERlZmluZXMNCi0gKiBAYnJpZWYgICAgRmxhZ3MgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX0RNQU1VWF9Xcml0ZVJlZyBmdW5jdGlvbg0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9ETUFNVVhfQ0ZSX0NTT0YwIFwNCi0gIERNQU1VWF9DRlJfQ1NPRjAgLyohPCBTeW5jaHJvbml6YXRpb24gRXZlbnQgT3ZlcnJ1biBGbGFnIENoYW5uZWwgMCAgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9DRlJfQ1NPRjEgXA0KLSAgRE1BTVVYX0NGUl9DU09GMSAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCAxICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX0NGUl9DU09GMiBcDQotICBETUFNVVhfQ0ZSX0NTT0YyIC8qITwgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDIgICovDQotI2RlZmluZSBMTF9ETUFNVVhfQ0ZSX0NTT0YzIFwNCi0gIERNQU1VWF9DRlJfQ1NPRjMgLyohPCBTeW5jaHJvbml6YXRpb24gRXZlbnQgT3ZlcnJ1biBGbGFnIENoYW5uZWwgMyAgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9DRlJfQ1NPRjQgXA0KLSAgRE1BTVVYX0NGUl9DU09GNCAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCA0ICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX0NGUl9DU09GNSBcDQotICBETUFNVVhfQ0ZSX0NTT0Y1IC8qITwgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDUgICovDQotI2RlZmluZSBMTF9ETUFNVVhfQ0ZSX0NTT0Y2IFwNCi0gIERNQU1VWF9DRlJfQ1NPRjYgLyohPCBTeW5jaHJvbml6YXRpb24gRXZlbnQgT3ZlcnJ1biBGbGFnIENoYW5uZWwgNiAgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9DRlJfQ1NPRjcgXA0KLSAgRE1BTVVYX0NGUl9DU09GNyAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCA3ICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX0NGUl9DU09GOCBcDQotICBETUFNVVhfQ0ZSX0NTT0Y4IC8qITwgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDggICovDQotI2RlZmluZSBMTF9ETUFNVVhfQ0ZSX0NTT0Y5IFwNCi0gIERNQU1VWF9DRlJfQ1NPRjkgLyohPCBTeW5jaHJvbml6YXRpb24gRXZlbnQgT3ZlcnJ1biBGbGFnIENoYW5uZWwgOSAgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9DRlJfQ1NPRjEwIFwNCi0gIERNQU1VWF9DRlJfQ1NPRjEwIC8qITwgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDEwICovDQotI2RlZmluZSBMTF9ETUFNVVhfQ0ZSX0NTT0YxMSBcDQotICBETUFNVVhfQ0ZSX0NTT0YxMSAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCAxMSAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX0NGUl9DU09GMTIgXA0KLSAgRE1BTVVYX0NGUl9DU09GMTIgLyohPCBTeW5jaHJvbml6YXRpb24gRXZlbnQgT3ZlcnJ1biBGbGFnIENoYW5uZWwgMTIgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9DRlJfQ1NPRjEzIFwNCi0gIERNQU1VWF9DRlJfQ1NPRjEzIC8qITwgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDEzICovDQotI2RlZmluZSBMTF9ETUFNVVhfQ0ZSX0NTT0YxNCBcDQotICBETUFNVVhfQ0ZSX0NTT0YxNCAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCAxNCAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX0NGUl9DU09GMTUgXA0KLSAgRE1BTVVYX0NGUl9DU09GMTUgLyohPCBTeW5jaHJvbml6YXRpb24gRXZlbnQgT3ZlcnJ1biBGbGFnIENoYW5uZWwgMTUgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9SR0NGUl9SR0NPRjAgXA0KLSAgRE1BTVVYX1JHQ0ZSX0NPRjAgLyohPCBSZXF1ZXN0IEdlbmVyYXRvciAwIFRyaWdnZXIgRXZlbnQgT3ZlcnJ1biBGbGFnICovDQotI2RlZmluZSBMTF9ETUFNVVhfUkdDRlJfUkdDT0YxIFwNCi0gIERNQU1VWF9SR0NGUl9DT0YxIC8qITwgUmVxdWVzdCBHZW5lcmF0b3IgMSBUcmlnZ2VyIEV2ZW50IE92ZXJydW4gRmxhZyAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1JHQ0ZSX1JHQ09GMiBcDQotICBETUFNVVhfUkdDRlJfQ09GMiAvKiE8IFJlcXVlc3QgR2VuZXJhdG9yIDIgVHJpZ2dlciBFdmVudCBPdmVycnVuIEZsYWcgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9SR0NGUl9SR0NPRjMgXA0KLSAgRE1BTVVYX1JHQ0ZSX0NPRjMgLyohPCBSZXF1ZXN0IEdlbmVyYXRvciAzIFRyaWdnZXIgRXZlbnQgT3ZlcnJ1biBGbGFnICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIERNQU1VWF9MTF9FQ19HRVRfRkxBRyBHZXQgRmxhZ3MgRGVmaW5lcw0KLSAqIEBicmllZiAgICBGbGFncyBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfRE1BTVVYX1JlYWRSZWcgZnVuY3Rpb24NCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX0NTUl9TT0YwIFwNCi0gIERNQU1VWF9DU1JfU09GMCAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCAwICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX0NTUl9TT0YxIFwNCi0gIERNQU1VWF9DU1JfU09GMSAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCAxICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX0NTUl9TT0YyIFwNCi0gIERNQU1VWF9DU1JfU09GMiAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCAyICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX0NTUl9TT0YzIFwNCi0gIERNQU1VWF9DU1JfU09GMyAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCAzICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX0NTUl9TT0Y0IFwNCi0gIERNQU1VWF9DU1JfU09GNCAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCA0ICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX0NTUl9TT0Y1IFwNCi0gIERNQU1VWF9DU1JfU09GNSAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCA1ICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX0NTUl9TT0Y2IFwNCi0gIERNQU1VWF9DU1JfU09GNiAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCA2ICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX0NTUl9TT0Y3IFwNCi0gIERNQU1VWF9DU1JfU09GNyAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCA3ICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX0NTUl9TT0Y4IFwNCi0gIERNQU1VWF9DU1JfU09GOCAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCA4ICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX0NTUl9TT0Y5IFwNCi0gIERNQU1VWF9DU1JfU09GOSAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCA5ICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX0NTUl9TT0YxMCBcDQotICBETUFNVVhfQ1NSX1NPRjEwIC8qITwgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDEwICovDQotI2RlZmluZSBMTF9ETUFNVVhfQ1NSX1NPRjExIFwNCi0gIERNQU1VWF9DU1JfU09GMTEgLyohPCBTeW5jaHJvbml6YXRpb24gRXZlbnQgT3ZlcnJ1biBGbGFnIENoYW5uZWwgMTEgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9DU1JfU09GMTIgXA0KLSAgRE1BTVVYX0NTUl9TT0YxMiAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCAxMiAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX0NTUl9TT0YxMyBcDQotICBETUFNVVhfQ1NSX1NPRjEzIC8qITwgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDEzICovDQotI2RlZmluZSBMTF9ETUFNVVhfQ1NSX1NPRjE0IFwNCi0gIERNQU1VWF9DU1JfU09GMTQgLyohPCBTeW5jaHJvbml6YXRpb24gRXZlbnQgT3ZlcnJ1biBGbGFnIENoYW5uZWwgMTQgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9DU1JfU09GMTUgXA0KLSAgRE1BTVVYX0NTUl9TT0YxNSAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCAxNSAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1JHU1JfUkdPRjAgXA0KLSAgRE1BTVVYX1JHU1JfT0YwIC8qITwgUmVxdWVzdCBHZW5lcmF0b3IgMCBUcmlnZ2VyIEV2ZW50IE92ZXJydW4gRmxhZyAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1JHU1JfUkdPRjEgXA0KLSAgRE1BTVVYX1JHU1JfT0YxIC8qITwgUmVxdWVzdCBHZW5lcmF0b3IgMSBUcmlnZ2VyIEV2ZW50IE92ZXJydW4gRmxhZyAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1JHU1JfUkdPRjIgXA0KLSAgRE1BTVVYX1JHU1JfT0YyIC8qITwgUmVxdWVzdCBHZW5lcmF0b3IgMiBUcmlnZ2VyIEV2ZW50IE92ZXJydW4gRmxhZyAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1JHU1JfUkdPRjMgXA0KLSAgRE1BTVVYX1JHU1JfT0YzIC8qITwgUmVxdWVzdCBHZW5lcmF0b3IgMyBUcmlnZ2VyIEV2ZW50IE92ZXJydW4gRmxhZyAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBETUFNVVhfTExfRUNfSVQgSVQgRGVmaW5lcw0KLSAqIEBicmllZiAgICBJVCBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfRE1BX1JlYWRSZWcgYW5kDQotICogTExfRE1BTVVYX1dyaXRlUmVnIGZ1bmN0aW9ucw0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9ETUFNVVhfQ0NSX1NPSUUgXA0KLSAgRE1BTVVYX0N4Q1JfU09JRSAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEludGVycnVwdCAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1JHQ1JfUkdPSUUgXA0KLSAgRE1BTVVYX1JHeENSX09JRSAvKiE8IFJlcXVlc3QgR2VuZXJhdGlvbiBUcmlnZ2VyIEV2ZW50IE92ZXJydW4gSW50ZXJydXB0ICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIERNQU1VWF9MTF9FQ19SRVFVRVNUIFRyYW5zZmVyIHJlcXVlc3QNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1JFUV9NRU0yTUVNIDB4MDAwMDAwMDBVIC8qITwgTWVtb3J5IHRvIG1lbW9yeSB0cmFuc2ZlciAgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9SRVFfR0VORVJBVE9SMCAgICAgICAgICAgICAgXA0KLSAgMHgwMDAwMDAwMVUgLyohPCBETUFNVVggcmVxdWVzdCBnZW5lcmF0b3IgMCBcDQotICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9SRVFfR0VORVJBVE9SMSAgICAgICAgICAgICAgXA0KLSAgMHgwMDAwMDAwMlUgLyohPCBETUFNVVggcmVxdWVzdCBnZW5lcmF0b3IgMSBcDQotICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9SRVFfR0VORVJBVE9SMiAgICAgICAgICAgICAgXA0KLSAgMHgwMDAwMDAwM1UgLyohPCBETUFNVVggcmVxdWVzdCBnZW5lcmF0b3IgMiBcDQotICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9SRVFfR0VORVJBVE9SMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIDB4MDAwMDAwMDRVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvciAzIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9SRVFfQURDMSAweDAwMDAwMDA1VSAgICAgICAvKiE8IERNQU1VWCBBREMxIHJlcXVlc3QgICAgICAgICovDQotI2RlZmluZSBMTF9ETUFNVVhfUkVRX0RBQzFfQ0gxIDB4MDAwMDAwMDZVICAgLyohPCBETUFNVVggREFDMSBDSDEgcmVxdWVzdCAgICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1JFUV9EQUMxX0NIMiAweDAwMDAwMDA3VSAgIC8qITwgRE1BTVVYIERBQzEgQ0gyIHJlcXVlc3QgICAgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNNl9VUCAweDAwMDAwMDA4VSAgICAvKiE8IERNQU1VWCBUSU02IFVQIHJlcXVlc3QgICAgICovDQotI2RlZmluZSBMTF9ETUFNVVhfUkVRX1RJTTdfVVAgMHgwMDAwMDAwOVUgICAgLyohPCBETUFNVVggVElNNyBVUCByZXF1ZXN0ICAgICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1JFUV9TUEkxX1JYIDB4MDAwMDAwMEFVICAgIC8qITwgRE1BTVVYIFNQSTEgUlggcmVxdWVzdCAgICAgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9SRVFfU1BJMV9UWCAweDAwMDAwMDBCVSAgICAvKiE8IERNQU1VWCBTUEkxIFRYIHJlcXVlc3QgICAgICovDQotI2RlZmluZSBMTF9ETUFNVVhfUkVRX1NQSTJfUlggMHgwMDAwMDAwQ1UgICAgLyohPCBETUFNVVggU1BJMiBSWCByZXF1ZXN0ICAgICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1JFUV9TUEkyX1RYIDB4MDAwMDAwMERVICAgIC8qITwgRE1BTVVYIFNQSTIgVFggcmVxdWVzdCAgICAgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9SRVFfU1BJM19SWCAweDAwMDAwMDBFVSAgICAvKiE8IERNQU1VWCBTUEkzIFJYIHJlcXVlc3QgICAgICovDQotI2RlZmluZSBMTF9ETUFNVVhfUkVRX1NQSTNfVFggMHgwMDAwMDAwRlUgICAgLyohPCBETUFNVVggU1BJMyBUWCByZXF1ZXN0ICAgICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1JFUV9JMkMxX1JYIDB4MDAwMDAwMTBVICAgIC8qITwgRE1BTVVYIEkyQzEgUlggcmVxdWVzdCAgICAgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9SRVFfSTJDMV9UWCAweDAwMDAwMDExVSAgICAvKiE8IERNQU1VWCBJMkMxIFRYIHJlcXVlc3QgICAgICovDQotI2RlZmluZSBMTF9ETUFNVVhfUkVRX0kyQzJfUlggMHgwMDAwMDAxMlUgICAgLyohPCBETUFNVVggSTJDMiBSWCByZXF1ZXN0ICAgICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1JFUV9JMkMyX1RYIDB4MDAwMDAwMTNVICAgIC8qITwgRE1BTVVYIEkyQzIgVFggcmVxdWVzdCAgICAgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9SRVFfSTJDM19SWCAweDAwMDAwMDE0VSAgICAvKiE8IERNQU1VWCBJMkMzIFJYIHJlcXVlc3QgICAgICovDQotI2RlZmluZSBMTF9ETUFNVVhfUkVRX0kyQzNfVFggMHgwMDAwMDAxNVUgICAgLyohPCBETUFNVVggSTJDMyBUWCByZXF1ZXN0ICAgICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1JFUV9JMkM0X1JYIDB4MDAwMDAwMTZVICAgIC8qITwgRE1BTVVYIEkyQzQgUlggcmVxdWVzdCAgICAgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9SRVFfSTJDNF9UWCAweDAwMDAwMDE3VSAgICAvKiE8IERNQU1VWCBJMkM0IFRYIHJlcXVlc3QgICAgICovDQotI2RlZmluZSBMTF9ETUFNVVhfUkVRX1VTQVJUMV9SWCAweDAwMDAwMDE4VSAgLyohPCBETUFNVVggVVNBUlQxIFJYIHJlcXVlc3QgICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1JFUV9VU0FSVDFfVFggMHgwMDAwMDAxOVUgIC8qITwgRE1BTVVYIFVTQVJUMSBUWCByZXF1ZXN0ICAgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9SRVFfVVNBUlQyX1JYIDB4MDAwMDAwMUFVICAvKiE8IERNQU1VWCBVU0FSVDIgUlggcmVxdWVzdCAgICovDQotI2RlZmluZSBMTF9ETUFNVVhfUkVRX1VTQVJUMl9UWCAweDAwMDAwMDFCVSAgLyohPCBETUFNVVggVVNBUlQyIFRYIHJlcXVlc3QgICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1JFUV9VU0FSVDNfUlggMHgwMDAwMDAxQ1UgIC8qITwgRE1BTVVYIFVTQVJUMyBSWCByZXF1ZXN0ICAgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9SRVFfVVNBUlQzX1RYIDB4MDAwMDAwMURVICAvKiE8IERNQU1VWCBVU0FSVDMgVFggcmVxdWVzdCAgICovDQotI2RlZmluZSBMTF9ETUFNVVhfUkVRX1VBUlQ0X1JYIDB4MDAwMDAwMUVVICAgLyohPCBETUFNVVggVUFSVDQgUlggcmVxdWVzdCAgICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1JFUV9VQVJUNF9UWCAweDAwMDAwMDFGVSAgIC8qITwgRE1BTVVYIFVBUlQ0IFRYIHJlcXVlc3QgICAgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9SRVFfVUFSVDVfUlggMHgwMDAwMDAyMFUgICAvKiE8IERNQU1VWCBVQVJUNSBSWCByZXF1ZXN0ICAgICovDQotI2RlZmluZSBMTF9ETUFNVVhfUkVRX1VBUlQ1X1RYIDB4MDAwMDAwMjFVICAgLyohPCBETUFNVVggVUFSVDUgVFggcmVxdWVzdCAgICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1JFUV9MUFVBUlQxX1JYIDB4MDAwMDAwMjJVIC8qITwgRE1BTVVYIExQVUFSVDEgUlggcmVxdWVzdCAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1JFUV9MUFVBUlQxX1RYIDB4MDAwMDAwMjNVIC8qITwgRE1BTVVYIExQVUFSVDEgVFggcmVxdWVzdCAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1JFUV9BREMyIDB4MDAwMDAwMjRVICAgICAgIC8qITwgRE1BTVVYIEFEQzIgcmVxdWVzdCAgICAgICAgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9SRVFfQURDMyAweDAwMDAwMDI1VSAgICAgICAvKiE8IERNQU1VWCBBREMzIHJlcXVlc3QgICAgICAgICovDQotI2RlZmluZSBMTF9ETUFNVVhfUkVRX0FEQzQgMHgwMDAwMDAyNlUgICAgICAgLyohPCBETUFNVVggQURDNCByZXF1ZXN0ICAgICAgICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1JFUV9BREM1IDB4MDAwMDAwMjdVICAgICAgIC8qITwgRE1BTVVYIEFEQzUgcmVxdWVzdCAgICAgICAgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9SRVFfUVNQSSAweDAwMDAwMDI4VSAgICAgICAvKiE8IERNQU1VWCBRU1BJIHJlcXVlc3QgICAgICAgICovDQotI2RlZmluZSBMTF9ETUFNVVhfUkVRX0RBQzJfQ0gxIDB4MDAwMDAwMjlVICAgLyohPCBETUFNVVggREFDMiBDSDEgcmVxdWVzdCAgICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1JFUV9USU0xX0NIMSAweDAwMDAwMDJBVSAgIC8qITwgRE1BTVVYIFRJTTEgQ0gxIHJlcXVlc3QgICAgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNMV9DSDIgMHgwMDAwMDAyQlUgICAvKiE8IERNQU1VWCBUSU0xIENIMiByZXF1ZXN0ICAgICovDQotI2RlZmluZSBMTF9ETUFNVVhfUkVRX1RJTTFfQ0gzIDB4MDAwMDAwMkNVICAgLyohPCBETUFNVVggVElNMSBDSDMgcmVxdWVzdCAgICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1JFUV9USU0xX0NINCAweDAwMDAwMDJEVSAgIC8qITwgRE1BTVVYIFRJTTEgQ0g0IHJlcXVlc3QgICAgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNMV9VUCAweDAwMDAwMDJFVSAgICAvKiE8IERNQU1VWCBUSU0xIFVQIHJlcXVlc3QgICAgICovDQotI2RlZmluZSBMTF9ETUFNVVhfUkVRX1RJTTFfVFJJRyAweDAwMDAwMDJGVSAgLyohPCBETUFNVVggVElNMSBUUklHIHJlcXVlc3QgICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1JFUV9USU0xX0NPTSAweDAwMDAwMDMwVSAgIC8qITwgRE1BTVVYIFRJTTEgQ09NIHJlcXVlc3QgICAgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNOF9DSDEgMHgwMDAwMDAzMVUgICAvKiE8IERNQU1VWCBUSU04IENIMSByZXF1ZXN0ICAgICovDQotI2RlZmluZSBMTF9ETUFNVVhfUkVRX1RJTThfQ0gyIDB4MDAwMDAwMzJVICAgLyohPCBETUFNVVggVElNOCBDSDIgcmVxdWVzdCAgICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1JFUV9USU04X0NIMyAweDAwMDAwMDMzVSAgIC8qITwgRE1BTVVYIFRJTTggQ0gzIHJlcXVlc3QgICAgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNOF9DSDQgMHgwMDAwMDAzNFUgICAvKiE8IERNQU1VWCBUSU04IENINCByZXF1ZXN0ICAgICovDQotI2RlZmluZSBMTF9ETUFNVVhfUkVRX1RJTThfVVAgMHgwMDAwMDAzNVUgICAgLyohPCBETUFNVVggVElNOCBVUCByZXF1ZXN0ICAgICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1JFUV9USU04X1RSSUcgMHgwMDAwMDAzNlUgIC8qITwgRE1BTVVYIFRJTTggVFJJRyByZXF1ZXN0ICAgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNOF9DT00gMHgwMDAwMDAzN1UgICAvKiE8IERNQU1VWCBUSU04IENPTSByZXF1ZXN0ICAgICovDQotI2RlZmluZSBMTF9ETUFNVVhfUkVRX1RJTTJfQ0gxIDB4MDAwMDAwMzhVICAgLyohPCBETUFNVVggVElNMiBDSDEgcmVxdWVzdCAgICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1JFUV9USU0yX0NIMiAweDAwMDAwMDM5VSAgIC8qITwgRE1BTVVYIFRJTTIgQ0gyIHJlcXVlc3QgICAgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNMl9DSDMgMHgwMDAwMDAzQVUgICAvKiE8IERNQU1VWCBUSU0yIENIMyByZXF1ZXN0ICAgICovDQotI2RlZmluZSBMTF9ETUFNVVhfUkVRX1RJTTJfQ0g0IDB4MDAwMDAwM0JVICAgLyohPCBETUFNVVggVElNMiBDSDQgcmVxdWVzdCAgICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1JFUV9USU0yX1VQIDB4MDAwMDAwM0NVICAgIC8qITwgRE1BTVVYIFRJTTIgVVAgcmVxdWVzdCAgICAgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNM19DSDEgMHgwMDAwMDAzRFUgICAvKiE8IERNQU1VWCBUSU0zIENIMSByZXF1ZXN0ICAgICovDQotI2RlZmluZSBMTF9ETUFNVVhfUkVRX1RJTTNfQ0gyIDB4MDAwMDAwM0VVICAgLyohPCBETUFNVVggVElNMyBDSDIgcmVxdWVzdCAgICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1JFUV9USU0zX0NIMyAweDAwMDAwMDNGVSAgIC8qITwgRE1BTVVYIFRJTTMgQ0gzIHJlcXVlc3QgICAgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNM19DSDQgMHgwMDAwMDA0MFUgICAvKiE8IERNQU1VWCBUSU0zIENINCByZXF1ZXN0ICAgICovDQotI2RlZmluZSBMTF9ETUFNVVhfUkVRX1RJTTNfVVAgMHgwMDAwMDA0MVUgICAgLyohPCBETUFNVVggVElNMyBVUCByZXF1ZXN0ICAgICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1JFUV9USU0zX1RSSUcgMHgwMDAwMDA0MlUgIC8qITwgRE1BTVVYIFRJTTMgVFJJRyByZXF1ZXN0ICAgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNNF9DSDEgMHgwMDAwMDA0M1UgICAvKiE8IERNQU1VWCBUSU00IENIMSByZXF1ZXN0ICAgICovDQotI2RlZmluZSBMTF9ETUFNVVhfUkVRX1RJTTRfQ0gyIDB4MDAwMDAwNDRVICAgLyohPCBETUFNVVggVElNNCBDSDIgcmVxdWVzdCAgICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1JFUV9USU00X0NIMyAweDAwMDAwMDQ1VSAgIC8qITwgRE1BTVVYIFRJTTQgQ0gzIHJlcXVlc3QgICAgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNNF9DSDQgMHgwMDAwMDA0NlUgICAvKiE8IERNQU1VWCBUSU00IENINCByZXF1ZXN0ICAgICovDQotI2RlZmluZSBMTF9ETUFNVVhfUkVRX1RJTTRfVVAgMHgwMDAwMDA0N1UgICAgLyohPCBETUFNVVggVElNNCBVUCByZXF1ZXN0ICAgICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1JFUV9USU01X0NIMSAweDAwMDAwMDQ4VSAgIC8qITwgRE1BTVVYIFRJTTUgQ0gxIHJlcXVlc3QgICAgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNNV9DSDIgMHgwMDAwMDA0OVUgICAvKiE8IERNQU1VWCBUSU01IENIMiByZXF1ZXN0ICAgICovDQotI2RlZmluZSBMTF9ETUFNVVhfUkVRX1RJTTVfQ0gzIDB4MDAwMDAwNEFVICAgLyohPCBETUFNVVggVElNNSBDSDMgcmVxdWVzdCAgICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1JFUV9USU01X0NINCAweDAwMDAwMDRCVSAgIC8qITwgRE1BTVVYIFRJTTUgQ0g0IHJlcXVlc3QgICAgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNNV9VUCAweDAwMDAwMDRDVSAgICAvKiE8IERNQU1VWCBUSU01IFVQIHJlcXVlc3QgICAgICovDQotI2RlZmluZSBMTF9ETUFNVVhfUkVRX1RJTTVfVFJJRyAweDAwMDAwMDREVSAgLyohPCBETUFNVVggVElNNSBUUklHIHJlcXVlc3QgICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1JFUV9USU0xNV9DSDEgMHgwMDAwMDA0RVUgIC8qITwgRE1BTVVYIFRJTTE1IENIMSByZXF1ZXN0ICAgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNMTVfVVAgMHgwMDAwMDA0RlUgICAvKiE8IERNQU1VWCBUSU0xNSBVUCByZXF1ZXN0ICAgICovDQotI2RlZmluZSBMTF9ETUFNVVhfUkVRX1RJTTE1X1RSSUcgMHgwMDAwMDA1MFUgLyohPCBETUFNVVggVElNMTUgVFJJRyByZXF1ZXN0ICovDQotI2RlZmluZSBMTF9ETUFNVVhfUkVRX1RJTTE1X0NPTSAweDAwMDAwMDUxVSAgLyohPCBETUFNVVggVElNMTUgQ09NIHJlcXVlc3QgICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1JFUV9USU0xNl9DSDEgMHgwMDAwMDA1MlUgIC8qITwgRE1BTVVYIFRJTTE2IENIMSByZXF1ZXN0ICAgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNMTZfVVAgMHgwMDAwMDA1M1UgICAvKiE8IERNQU1VWCBUSU0xNiBVUCByZXF1ZXN0ICAgICovDQotI2RlZmluZSBMTF9ETUFNVVhfUkVRX1RJTTE3X0NIMSAweDAwMDAwMDU0VSAgLyohPCBETUFNVVggVElNMTcgQ0gxIHJlcXVlc3QgICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1JFUV9USU0xN19VUCAweDAwMDAwMDU1VSAgIC8qITwgRE1BTVVYIFRJTTE3IFVQIHJlcXVlc3QgICAgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNMjBfQ0gxIDB4MDAwMDAwNTZVICAvKiE8IERNQU1VWCBUSU0yMCBDSDEgcmVxdWVzdCAgICovDQotI2RlZmluZSBMTF9ETUFNVVhfUkVRX1RJTTIwX0NIMiAweDAwMDAwMDU3VSAgLyohPCBETUFNVVggVElNMjAgQ0gyIHJlcXVlc3QgICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1JFUV9USU0yMF9DSDMgMHgwMDAwMDA1OFUgIC8qITwgRE1BTVVYIFRJTTIwIENIMyByZXF1ZXN0ICAgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNMjBfQ0g0IDB4MDAwMDAwNTlVICAvKiE8IERNQU1VWCBUSU0yMCBDSDQgcmVxdWVzdCAgICovDQotI2RlZmluZSBMTF9ETUFNVVhfUkVRX1RJTTIwX1VQIDB4MDAwMDAwNUFVICAgLyohPCBETUFNVVggVElNMjAgVVAgcmVxdWVzdCAgICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1JFUV9BRVNfSU4gMHgwMDAwMDA1QlUgICAgIC8qITwgRE1BTVVYIEFFU19JTiByZXF1ZXN0ICAgICAgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9SRVFfQUVTX09VVCAweDAwMDAwMDVDVSAgICAvKiE8IERNQU1VWCBBRVNfT1VUIHJlcXVlc3QgICAgICovDQotI2RlZmluZSBMTF9ETUFNVVhfUkVRX1RJTTIwX1RSSUcgMHgwMDAwMDA1RFUgLyohPCBETUFNVVggVElNMjAgVFJJRyByZXF1ZXN0ICovDQotI2RlZmluZSBMTF9ETUFNVVhfUkVRX1RJTTIwX0NPTSAweDAwMDAwMDVFVSAgLyohPCBETUFNVVggVElNMjAgQ09NIHJlcXVlc3QgICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1JFUV9IUlRJTTFfTSAweDAwMDAwMDVGVSAgIC8qITwgRE1BTVVYIEhSVElNIE0gcmVxdWVzdCAgICAgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9SRVFfSFJUSU0xX0EgMHgwMDAwMDA2MFUgICAvKiE8IERNQU1VWCBIUlRJTSBBIHJlcXVlc3QgICAgICovDQotI2RlZmluZSBMTF9ETUFNVVhfUkVRX0hSVElNMV9CIDB4MDAwMDAwNjFVICAgLyohPCBETUFNVVggSFJUSU0gQiByZXF1ZXN0ICAgICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1JFUV9IUlRJTTFfQyAweDAwMDAwMDYyVSAgIC8qITwgRE1BTVVYIEhSVElNIEMgcmVxdWVzdCAgICAgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9SRVFfSFJUSU0xX0QgMHgwMDAwMDA2M1UgICAvKiE8IERNQU1VWCBIUlRJTSBEIHJlcXVlc3QgICAgICovDQotI2RlZmluZSBMTF9ETUFNVVhfUkVRX0hSVElNMV9FIDB4MDAwMDAwNjRVICAgLyohPCBETUFNVVggSFJUSU0gRSByZXF1ZXN0ICAgICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1JFUV9IUlRJTTFfRiAweDAwMDAwMDY1VSAgIC8qITwgRE1BTVVYIEhSVElNIEYgcmVxdWVzdCAgICAgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9SRVFfREFDM19DSDEgMHgwMDAwMDA2NlUgICAvKiE8IERNQU1VWCBEQUMzIENIMSByZXF1ZXN0ICAgICovDQotI2RlZmluZSBMTF9ETUFNVVhfUkVRX0RBQzNfQ0gyIDB4MDAwMDAwNjdVICAgLyohPCBETUFNVVggREFDMyBDSDIgcmVxdWVzdCAgICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1JFUV9EQUM0X0NIMSAweDAwMDAwMDY4VSAgIC8qITwgRE1BTVVYIERBQzQgQ0gxIHJlcXVlc3QgICAgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9SRVFfREFDNF9DSDIgMHgwMDAwMDA2OVUgICAvKiE8IERNQU1VWCBEQUM0IENIMiByZXF1ZXN0ICAgICovDQotI2RlZmluZSBMTF9ETUFNVVhfUkVRX1NQSTRfUlggMHgwMDAwMDA2QVUgICAgLyohPCBETUFNVVggU1BJNCBSWCByZXF1ZXN0ICAgICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1JFUV9TUEk0X1RYIDB4MDAwMDAwNkJVICAgIC8qITwgRE1BTVVYIFNQSTQgVFggcmVxdWVzdCAgICAgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9SRVFfU0FJMV9BIDB4MDAwMDAwNkNVICAgICAvKiE8IERNQU1VWCBTQUkxIEEgcmVxdWVzdCAgICAgICovDQotI2RlZmluZSBMTF9ETUFNVVhfUkVRX1NBSTFfQiAweDAwMDAwMDZEVSAgICAgLyohPCBETUFNVVggU0FJMSBCIHJlcXVlc3QgICAgICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1JFUV9GTUFDX1JFQUQgMHgwMDAwMDA2RVUgIC8qITwgRE1BTVVYIEZNQUMgUkVBRCByZXF1ZXN0ICAgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9SRVFfRk1BQ19XUklURSAweDAwMDAwMDZGVSAvKiE8IERNQU1VWCBGTUFDIFdSSVRFIHJlcXVlc3QgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9SRVFfQ09SRElDX1JFQUQgICAgICAgICAgICAgXA0KLSAgMHgwMDAwMDA3MFUgLyohPCBETUFNVVggQ09SRElDIFJFQUQgcmVxdWVzdCBcDQotICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9SRVFfQ09SRElDX1dSSVRFIFwNCi0gIDB4MDAwMDAwNzFVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBETUFNVVggQ09SRElDIFdSSVRFIHJlcXVlc3QqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1JFUV9VQ1BEMV9SWCAweDAwMDAwMDcyVSAvKiE8IERNQU1VWCBVU0JQRDFfUlggcmVxdWVzdCAgICovDQotI2RlZmluZSBMTF9ETUFNVVhfUkVRX1VDUEQxX1RYIDB4MDAwMDAwNzNVIC8qITwgRE1BTVVYIFVTQlBEMV9UWCByZXF1ZXN0ICAgKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRE1BTVVYX0xMX0VDX0NIQU5ORUwgRE1BTVVYIENoYW5uZWwNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX0NIQU5ORUxfMCBcDQotICAweDAwMDAwMDAwVSAvKiE8IERNQU1VWCBDaGFubmVsIDAgY29ubmVjdGVkIHRvIERNQTEgQ2hhbm5lbCAxICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX0NIQU5ORUxfMSBcDQotICAweDAwMDAwMDAxVSAvKiE8IERNQU1VWCBDaGFubmVsIDEgY29ubmVjdGVkIHRvIERNQTEgQ2hhbm5lbCAyICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX0NIQU5ORUxfMiBcDQotICAweDAwMDAwMDAyVSAvKiE8IERNQU1VWCBDaGFubmVsIDIgY29ubmVjdGVkIHRvIERNQTEgQ2hhbm5lbCAzICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX0NIQU5ORUxfMyBcDQotICAweDAwMDAwMDAzVSAvKiE8IERNQU1VWCBDaGFubmVsIDMgY29ubmVjdGVkIHRvIERNQTEgQ2hhbm5lbCA0ICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX0NIQU5ORUxfNCBcDQotICAweDAwMDAwMDA0VSAvKiE8IERNQU1VWCBDaGFubmVsIDQgY29ubmVjdGVkIHRvIERNQTEgQ2hhbm5lbCA1ICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX0NIQU5ORUxfNSBcDQotICAweDAwMDAwMDA1VSAvKiE8IERNQU1VWCBDaGFubmVsIDUgY29ubmVjdGVkIHRvIERNQTEgQ2hhbm5lbCA2ICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX0NIQU5ORUxfNiBcDQotICAweDAwMDAwMDA2VSAvKiE8IERNQU1VWCBDaGFubmVsIDYgY29ubmVjdGVkIHRvIERNQTEgQ2hhbm5lbCA3ICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX0NIQU5ORUxfNyBcDQotICAweDAwMDAwMDA3VSAvKiE8IERNQU1VWCBDaGFubmVsIDcgY29ubmVjdGVkIHRvIERNQTEgQ2hhbm5lbCA4ICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX0NIQU5ORUxfOCBcDQotICAweDAwMDAwMDA4VSAvKiE8IERNQU1VWCBDaGFubmVsIDggY29ubmVjdGVkIHRvIERNQTIgQ2hhbm5lbCAxICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX0NIQU5ORUxfOSBcDQotICAweDAwMDAwMDA5VSAvKiE8IERNQU1VWCBDaGFubmVsIDkgY29ubmVjdGVkIHRvIERNQTIgQ2hhbm5lbCAyICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX0NIQU5ORUxfMTAgXA0KLSAgMHgwMDAwMDAwQVUgLyohPCBETUFNVVggQ2hhbm5lbCAxMCBjb25uZWN0ZWQgdG8gRE1BMiBDaGFubmVsIDMgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9DSEFOTkVMXzExIFwNCi0gIDB4MDAwMDAwMEJVIC8qITwgRE1BTVVYIENoYW5uZWwgMTEgY29ubmVjdGVkIHRvIERNQTIgQ2hhbm5lbCA0ICovDQotI2RlZmluZSBMTF9ETUFNVVhfQ0hBTk5FTF8xMiBcDQotICAweDAwMDAwMDBDVSAvKiE8IERNQU1VWCBDaGFubmVsIDEyIGNvbm5lY3RlZCB0byBETUEyIENoYW5uZWwgNSAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX0NIQU5ORUxfMTMgXA0KLSAgMHgwMDAwMDAwRFUgLyohPCBETUFNVVggQ2hhbm5lbCAxMyBjb25uZWN0ZWQgdG8gRE1BMiBDaGFubmVsIDYgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9DSEFOTkVMXzE0IFwNCi0gIDB4MDAwMDAwMEVVIC8qITwgRE1BTVVYIENoYW5uZWwgMTQgY29ubmVjdGVkIHRvIERNQTIgQ2hhbm5lbCA3ICovDQotI2RlZmluZSBMTF9ETUFNVVhfQ0hBTk5FTF8xNSBcDQotICAweDAwMDAwMDBGVSAvKiE8IERNQU1VWCBDaGFubmVsIDE1IGNvbm5lY3RlZCB0byBETUEyIENoYW5uZWwgOCAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBETUFNVVhfTExfRUNfU1lOQ19OTyBTeW5jaHJvbml6YXRpb24gU2lnbmFsIFBvbGFyaXR5DQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9TWU5DX05PX0VWRU5UIDB4MDAwMDAwMDBVIC8qITwgQWxsIHJlcXVlc3RzIGFyZSBibG9ja2VkICAgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9TWU5DX1BPTF9SSVNJTkcgXA0KLSAgRE1BTVVYX0N4Q1JfU1BPTF8wIC8qITwgU3luY2hyb25pemF0aW9uIG9uIGV2ZW50IG9uIHJpc2luZyBlZGdlICovDQotI2RlZmluZSBMTF9ETUFNVVhfU1lOQ19QT0xfRkFMTElORyBcDQotICBETUFNVVhfQ3hDUl9TUE9MXzEgLyohPCBTeW5jaHJvbml6YXRpb24gb24gZXZlbnQgb24gZmFsbGluZyBlZGdlICovDQotI2RlZmluZSBMTF9ETUFNVVhfU1lOQ19QT0xfUklTSU5HX0ZBTExJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoRE1BTVVYX0N4Q1JfU1BPTF8wIHwgRE1BTVVYX0N4Q1JfU1BPTF8xKSAvKiE8IFN5bmNocm9uaXphdGlvbiBvbiBldmVudCBvbiBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaXNpbmcgYW5kIGZhbGxpbmcgZWRnZSAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBETUFNVVhfTExfRUNfU1lOQ19FVlQgU3luY2hyb25pemF0aW9uIFNpZ25hbCBFdmVudA0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkUwIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgU3luY2hyb25pemF0aW9uIHNpZ25hbCBmcm9tIEVYVEkgTGluZTAgICovDQotI2RlZmluZSBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkUxIFwNCi0gIERNQU1VWF9DeENSX1NZTkNfSURfMCAvKiE8IFN5bmNocm9uaXphdGlvbiBzaWduYWwgZnJvbSBFWFRJIExpbmUxICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FMiBcDQotICBETUFNVVhfQ3hDUl9TWU5DX0lEXzEgLyohPCBTeW5jaHJvbml6YXRpb24gc2lnbmFsIGZyb20gRVhUSSBMaW5lMiAgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTMgXA0KLSAgKERNQU1VWF9DeENSX1NZTkNfSURfMSB8ICAgICAgICBcDQotICAgRE1BTVVYX0N4Q1JfU1lOQ19JRF8wKSAvKiE8IFN5bmNocm9uaXphdGlvbiBzaWduYWwgZnJvbSBFWFRJIExpbmUzICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FNCBcDQotICBETUFNVVhfQ3hDUl9TWU5DX0lEXzIgLyohPCBTeW5jaHJvbml6YXRpb24gc2lnbmFsIGZyb20gRVhUSSBMaW5lNCAgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTUgXA0KLSAgKERNQU1VWF9DeENSX1NZTkNfSURfMiB8ICAgICAgICBcDQotICAgRE1BTVVYX0N4Q1JfU1lOQ19JRF8wKSAvKiE8IFN5bmNocm9uaXphdGlvbiBzaWduYWwgZnJvbSBFWFRJIExpbmU1ICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FNiBcDQotICAoRE1BTVVYX0N4Q1JfU1lOQ19JRF8yIHwgICAgICAgIFwNCi0gICBETUFNVVhfQ3hDUl9TWU5DX0lEXzEpIC8qITwgU3luY2hyb25pemF0aW9uIHNpZ25hbCBmcm9tIEVYVEkgTGluZTYgICovDQotI2RlZmluZSBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkU3ICAgICAgICAgICAgICAgICAgXA0KLSAgKERNQU1VWF9DeENSX1NZTkNfSURfMiB8IERNQU1VWF9DeENSX1NZTkNfSURfMSB8IFwNCi0gICBETUFNVVhfQ3hDUl9TWU5DX0lEXzApIC8qITwgU3luY2hyb25pemF0aW9uIHNpZ25hbCBmcm9tIEVYVEkgTGluZTcgICovDQotI2RlZmluZSBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkU4IFwNCi0gIERNQU1VWF9DeENSX1NZTkNfSURfMyAvKiE8IFN5bmNocm9uaXphdGlvbiBzaWduYWwgZnJvbSBFWFRJIExpbmU4ICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FOSBcDQotICAoRE1BTVVYX0N4Q1JfU1lOQ19JRF8zIHwgICAgICAgIFwNCi0gICBETUFNVVhfQ3hDUl9TWU5DX0lEXzApIC8qITwgU3luY2hyb25pemF0aW9uIHNpZ25hbCBmcm9tIEVYVEkgTGluZTkgICovDQotI2RlZmluZSBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkUxMCBcDQotICAoRE1BTVVYX0N4Q1JfU1lOQ19JRF8zIHwgICAgICAgICBcDQotICAgRE1BTVVYX0N4Q1JfU1lOQ19JRF8xKSAvKiE8IFN5bmNocm9uaXphdGlvbiBzaWduYWwgZnJvbSBFWFRJIExpbmUxMCAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FMTEgICAgICAgICAgICAgICAgIFwNCi0gIChETUFNVVhfQ3hDUl9TWU5DX0lEXzMgfCBETUFNVVhfQ3hDUl9TWU5DX0lEXzEgfCBcDQotICAgRE1BTVVYX0N4Q1JfU1lOQ19JRF8wKSAvKiE8IFN5bmNocm9uaXphdGlvbiBzaWduYWwgZnJvbSBFWFRJIExpbmUxMSAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FMTIgXA0KLSAgKERNQU1VWF9DeENSX1NZTkNfSURfMyB8ICAgICAgICAgXA0KLSAgIERNQU1VWF9DeENSX1NZTkNfSURfMikgLyohPCBTeW5jaHJvbml6YXRpb24gc2lnbmFsIGZyb20gRVhUSSBMaW5lMTIgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTEzICAgICAgICAgICAgICAgICBcDQotICAoRE1BTVVYX0N4Q1JfU1lOQ19JRF8zIHwgRE1BTVVYX0N4Q1JfU1lOQ19JRF8yIHwgXA0KLSAgIERNQU1VWF9DeENSX1NZTkNfSURfMCkgLyohPCBTeW5jaHJvbml6YXRpb24gc2lnbmFsIGZyb20gRVhUSSBMaW5lMTMgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTE0ICAgICAgICAgICAgICAgICBcDQotICAoRE1BTVVYX0N4Q1JfU1lOQ19JRF8zIHwgRE1BTVVYX0N4Q1JfU1lOQ19JRF8yIHwgXA0KLSAgIERNQU1VWF9DeENSX1NZTkNfSURfMSkgLyohPCBTeW5jaHJvbml6YXRpb24gc2lnbmFsIGZyb20gRVhUSSBMaW5lMTQgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoRE1BTVVYX0N4Q1JfU1lOQ19JRF8zIHwgRE1BTVVYX0N4Q1JfU1lOQ19JRF8yIHwgRE1BTVVYX0N4Q1JfU1lOQ19JRF8xIHwgXA0KLSAgIERNQU1VWF9DeENSX1NZTkNfSURfMCkgLyohPCBTeW5jaHJvbml6YXRpb24gc2lnbmFsIGZyb20gRVhUSSBMaW5lMTUgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9TWU5DX0RNQU1VWF9DSDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgRE1BTVVYX0N4Q1JfU1lOQ19JRF80IC8qITwgU3luY2hyb25pemF0aW9uIHNpZ25hbCBmcm9tIERNQU1VWCBjaGFubmVsMCBFdmVudCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9ETUFNVVhfU1lOQ19ETUFNVVhfQ0gxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKERNQU1VWF9DeENSX1NZTkNfSURfNCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBETUFNVVhfQ3hDUl9TWU5DX0lEXzApIC8qITwgU3luY2hyb25pemF0aW9uIHNpZ25hbCBmcm9tIERNQU1VWCBjaGFubmVsMSBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudCAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1NZTkNfRE1BTVVYX0NIMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChETUFNVVhfQ3hDUl9TWU5DX0lEXzQgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgRE1BTVVYX0N4Q1JfU1lOQ19JRF8xKSAvKiE8IFN5bmNocm9uaXphdGlvbiBzaWduYWwgZnJvbSBETUFNVVggY2hhbm5lbDIgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnQgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9TWU5DX0RNQU1VWF9DSDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoRE1BTVVYX0N4Q1JfU1lOQ19JRF80IHwgRE1BTVVYX0N4Q1JfU1lOQ19JRF8xIHwgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIERNQU1VWF9DeENSX1NZTkNfSURfMCkgLyohPCBTeW5jaHJvbml6YXRpb24gc2lnbmFsIGZyb20gRE1BTVVYIGNoYW5uZWwzIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50ICovDQotI2RlZmluZSBMTF9ETUFNVVhfU1lOQ19MUFRJTTFfT1VUIFwNCi0gIChETUFNVVhfQ3hDUl9TWU5DX0lEXzQgfCAgICAgICAgXA0KLSAgIERNQU1VWF9DeENSX1NZTkNfSURfMikgLyohPCBTeW5jaHJvbml6YXRpb24gc2lnbmFsIGZyb20gTFBUSU0xIE91dHB1dCAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBETUFNVVhfTExfRUNfUkVRVUVTVF9HRU5FUkFUT1IgUmVxdWVzdCBHZW5lcmF0b3IgQ2hhbm5lbA0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9ETUFNVVhfUkVRX0dFTl8wIDB4MDAwMDAwMDBVDQotI2RlZmluZSBMTF9ETUFNVVhfUkVRX0dFTl8xIDB4MDAwMDAwMDFVDQotI2RlZmluZSBMTF9ETUFNVVhfUkVRX0dFTl8yIDB4MDAwMDAwMDJVDQotI2RlZmluZSBMTF9ETUFNVVhfUkVRX0dFTl8zIDB4MDAwMDAwMDNVDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIERNQU1VWF9MTF9FQ19SRVFVRVNUX0dFTl9QT0xBUklUWSBFeHRlcm5hbCBSZXF1ZXN0IFNpZ25hbA0KLSAqIEdlbmVyYXRpb24gUG9sYXJpdHkNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1JFUV9HRU5fTk9fRVZFTlQgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBObyBleHRlcm5hbCBETUEgcmVxdWVzdCAgZ2VuZXJhdGlvbiAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1JFUV9HRU5fUE9MX1JJU0lORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIERNQU1VWF9SR3hDUl9HUE9MXzAgLyohPCBFeHRlcm5hbCBETUEgcmVxdWVzdCBnZW5lcmF0aW9uIG9uIGV2ZW50IG9uIHJpc2luZyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgIGVkZ2UgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9SRVFfR0VOX1BPTF9GQUxMSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgRE1BTVVYX1JHeENSX0dQT0xfMSAvKiE8IEV4dGVybmFsIERNQSByZXF1ZXN0IGdlbmVyYXRpb24gb24gZXZlbnQgb24gZmFsbGluZyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgIGVkZ2UgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9SRVFfR0VOX1BPTF9SSVNJTkdfRkFMTElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoRE1BTVVYX1JHeENSX0dQT0xfMCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIERNQU1VWF9SR3hDUl9HUE9MXzEpIC8qITwgRXh0ZXJuYWwgRE1BIHJlcXVlc3QgZ2VuZXJhdGlvbiBvbiByaXNpbmcgYW5kIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxsaW5nIGVkZ2UgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRE1BTVVYX0xMX0VDX1JFUVVFU1RfR0VOIEV4dGVybmFsIFJlcXVlc3QgU2lnbmFsIEdlbmVyYXRpb24NCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FMCBcDQotICAweDAwMDAwMDAwVSAvKiE8IFJlcXVlc3Qgc2lnbmFsIGdlbmVyYXRpb24gZnJvbSBFWFRJIExpbmUwICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FMSBcDQotICBETUFNVVhfUkd4Q1JfU0lHX0lEXzAgLyohPCBSZXF1ZXN0IHNpZ25hbCBnZW5lcmF0aW9uIGZyb20gRVhUSSBMaW5lMSAgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTIgXA0KLSAgRE1BTVVYX1JHeENSX1NJR19JRF8xIC8qITwgUmVxdWVzdCBzaWduYWwgZ2VuZXJhdGlvbiBmcm9tIEVYVEkgTGluZTIgICovDQotI2RlZmluZSBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkUzIFwNCi0gIChETUFNVVhfUkd4Q1JfU0lHX0lEXzEgfCAgICAgICAgICAgXA0KLSAgIERNQU1VWF9SR3hDUl9TSUdfSURfMCkgLyohPCBSZXF1ZXN0IHNpZ25hbCBnZW5lcmF0aW9uIGZyb20gRVhUSSBMaW5lMyAgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTQgXA0KLSAgRE1BTVVYX1JHeENSX1NJR19JRF8yIC8qITwgUmVxdWVzdCBzaWduYWwgZ2VuZXJhdGlvbiBmcm9tIEVYVEkgTGluZTQgICovDQotI2RlZmluZSBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkU1IFwNCi0gIChETUFNVVhfUkd4Q1JfU0lHX0lEXzIgfCAgICAgICAgICAgXA0KLSAgIERNQU1VWF9SR3hDUl9TSUdfSURfMCkgLyohPCBSZXF1ZXN0IHNpZ25hbCBnZW5lcmF0aW9uIGZyb20gRVhUSSBMaW5lNSAgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTYgXA0KLSAgKERNQU1VWF9SR3hDUl9TSUdfSURfMiB8ICAgICAgICAgICBcDQotICAgRE1BTVVYX1JHeENSX1NJR19JRF8xKSAvKiE8IFJlcXVlc3Qgc2lnbmFsIGdlbmVyYXRpb24gZnJvbSBFWFRJIExpbmU2ICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FNyAgICAgICAgICAgICAgIFwNCi0gIChETUFNVVhfUkd4Q1JfU0lHX0lEXzIgfCBETUFNVVhfUkd4Q1JfU0lHX0lEXzEgfCBcDQotICAgRE1BTVVYX1JHeENSX1NJR19JRF8wKSAvKiE8IFJlcXVlc3Qgc2lnbmFsIGdlbmVyYXRpb24gZnJvbSBFWFRJIExpbmU3ICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FOCBcDQotICBETUFNVVhfUkd4Q1JfU0lHX0lEXzMgLyohPCBSZXF1ZXN0IHNpZ25hbCBnZW5lcmF0aW9uIGZyb20gRVhUSSBMaW5lOCAgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTkgXA0KLSAgKERNQU1VWF9SR3hDUl9TSUdfSURfMyB8ICAgICAgICAgICBcDQotICAgRE1BTVVYX1JHeENSX1NJR19JRF8wKSAvKiE8IFJlcXVlc3Qgc2lnbmFsIGdlbmVyYXRpb24gZnJvbSBFWFRJIExpbmU5ICAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FMTAgXA0KLSAgKERNQU1VWF9SR3hDUl9TSUdfSURfMyB8ICAgICAgICAgICAgXA0KLSAgIERNQU1VWF9SR3hDUl9TSUdfSURfMSkgLyohPCBSZXF1ZXN0IHNpZ25hbCBnZW5lcmF0aW9uIGZyb20gRVhUSSBMaW5lMTAgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTExICAgICAgICAgICAgICBcDQotICAoRE1BTVVYX1JHeENSX1NJR19JRF8zIHwgRE1BTVVYX1JHeENSX1NJR19JRF8xIHwgXA0KLSAgIERNQU1VWF9SR3hDUl9TSUdfSURfMCkgLyohPCBSZXF1ZXN0IHNpZ25hbCBnZW5lcmF0aW9uIGZyb20gRVhUSSBMaW5lMTEgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTEyIFwNCi0gIChETUFNVVhfUkd4Q1JfU0lHX0lEXzMgfCAgICAgICAgICAgIFwNCi0gICBETUFNVVhfUkd4Q1JfU0lHX0lEXzIpIC8qITwgUmVxdWVzdCBzaWduYWwgZ2VuZXJhdGlvbiBmcm9tIEVYVEkgTGluZTEyICovDQotI2RlZmluZSBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkUxMyAgICAgICAgICAgICAgXA0KLSAgKERNQU1VWF9SR3hDUl9TSUdfSURfMyB8IERNQU1VWF9SR3hDUl9TSUdfSURfMiB8IFwNCi0gICBETUFNVVhfUkd4Q1JfU0lHX0lEXzApIC8qITwgUmVxdWVzdCBzaWduYWwgZ2VuZXJhdGlvbiBmcm9tIEVYVEkgTGluZTEzICovDQotI2RlZmluZSBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkUxNCAgICAgICAgICAgICAgXA0KLSAgKERNQU1VWF9SR3hDUl9TSUdfSURfMyB8IERNQU1VWF9SR3hDUl9TSUdfSURfMiB8IFwNCi0gICBETUFNVVhfUkd4Q1JfU0lHX0lEXzEpIC8qITwgUmVxdWVzdCBzaWduYWwgZ2VuZXJhdGlvbiBmcm9tIEVYVEkgTGluZTE0ICovDQotI2RlZmluZSBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkUxNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKERNQU1VWF9SR3hDUl9TSUdfSURfMyB8IERNQU1VWF9SR3hDUl9TSUdfSURfMiB8IERNQU1VWF9SR3hDUl9TSUdfSURfMSB8IFwNCi0gICBETUFNVVhfUkd4Q1JfU0lHX0lEXzApIC8qITwgUmVxdWVzdCBzaWduYWwgZ2VuZXJhdGlvbiBmcm9tIEVYVEkgTGluZTE1ICovDQotI2RlZmluZSBMTF9ETUFNVVhfUkVRX0dFTl9ETUFNVVhfQ0gwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIERNQU1VWF9SR3hDUl9TSUdfSURfNCAvKiE8IFJlcXVlc3Qgc2lnbmFsIGdlbmVyYXRpb24gZnJvbSBETUFNVVggY2hhbm5lbDAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50ICovDQotI2RlZmluZSBMTF9ETUFNVVhfUkVRX0dFTl9ETUFNVVhfQ0gxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKERNQU1VWF9SR3hDUl9TSUdfSURfNCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBETUFNVVhfUkd4Q1JfU0lHX0lEXzApIC8qITwgUmVxdWVzdCBzaWduYWwgZ2VuZXJhdGlvbiBmcm9tIERNQU1VWCBjaGFubmVsMSBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudCAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1JFUV9HRU5fRE1BTVVYX0NIMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChETUFNVVhfUkd4Q1JfU0lHX0lEXzQgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgRE1BTVVYX1JHeENSX1NJR19JRF8xKSAvKiE8IFJlcXVlc3Qgc2lnbmFsIGdlbmVyYXRpb24gZnJvbSBETUFNVVggY2hhbm5lbDIgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnQgKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9SRVFfR0VOX0RNQU1VWF9DSDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoRE1BTVVYX1JHeENSX1NJR19JRF80IHwgRE1BTVVYX1JHeENSX1NJR19JRF8xIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIERNQU1VWF9SR3hDUl9TSUdfSURfMCkgLyohPCBSZXF1ZXN0IHNpZ25hbCBnZW5lcmF0aW9uIGZyb20gRE1BTVVYIGNoYW5uZWwzIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50ICovDQotI2RlZmluZSBMTF9ETUFNVVhfUkVRX0dFTl9MUFRJTTFfT1VUIFwNCi0gIChETUFNVVhfUkd4Q1JfU0lHX0lEXzQgfCAgICAgICAgICAgXA0KLSAgIERNQU1VWF9SR3hDUl9TSUdfSURfMikgLyohPCBSZXF1ZXN0IHNpZ25hbCBnZW5lcmF0aW9uIGZyb20gTFBUSU0xIE91dHB1dCAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgRE1BTVVYX0xMX0V4cG9ydGVkX01hY3JvcyBETUFNVVggRXhwb3J0ZWQgTWFjcm9zDQotICogQHsNCi0gKi8NCi0vKiogQGRlZmdyb3VwIERNQU1VWF9MTF9FTV9XUklURV9SRUFEIENvbW1vbiBXcml0ZSBhbmQgcmVhZCByZWdpc3RlcnMgbWFjcm9zDQotICogQHsNCi0gKi8NCi0vKioNCi0gKiBAYnJpZWYgIFdyaXRlIGEgdmFsdWUgaW4gRE1BTVVYIHJlZ2lzdGVyDQotICogQHBhcmFtICBfX0lOU1RBTkNFX18gRE1BTVVYIEluc3RhbmNlDQotICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHdyaXR0ZW4NCi0gKiBAcGFyYW0gIF9fVkFMVUVfXyBWYWx1ZSB0byBiZSB3cml0dGVuIGluIHRoZSByZWdpc3Rlcg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgTExfRE1BTVVYX1dyaXRlUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXywgX19WQUxVRV9fKSBcDQotICBXUklURV9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fLCAoX19WQUxVRV9fKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJlYWQgYSB2YWx1ZSBpbiBETUFNVVggcmVnaXN0ZXINCi0gKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBETUFNVVggSW5zdGFuY2UNCi0gKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgcmVhZA0KLSAqIEByZXR2YWwgUmVnaXN0ZXIgdmFsdWUNCi0gKi8NCi0jZGVmaW5lIExMX0RNQU1VWF9SZWFkUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXykgUkVBRF9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fKQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgRE1BTVVYX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucyBETUFNVVggRXhwb3J0ZWQgRnVuY3Rpb25zDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIERNQU1VWF9MTF9FRl9Db25maWd1cmF0aW9uIENvbmZpZ3VyYXRpb24NCi0gKiBAew0KLSAqLw0KLS8qKg0KLSAqIEBicmllZiAgU2V0IERNQU1VWCByZXF1ZXN0IElEIGZvciBETUFNVVggQ2hhbm5lbCB4Lg0KLSAqIEBub3RlICAgRE1BTVVYIGNoYW5uZWwgMCB0byA3IGFyZSBtYXBwZWQgdG8gRE1BMSBjaGFubmVsIDEgdG8gOC4NCi0gKiAgICAgICAgIERNQU1VWCBjaGFubmVsIDggdG8gMTUgYXJlIG1hcHBlZCB0byBETUEyIGNoYW5uZWwgMSB0byA4Lg0KLSAqIEBybXRvbGwgQ3hDUiAgICAgICAgIERNQVJFUV9JRCAgICAgTExfRE1BTVVYX1NldFJlcXVlc3RJRA0KLSAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlDQotICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF81DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF84DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEwDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEzDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xNQ0KLSAqIEBwYXJhbSAgUmVxdWVzdCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfTUVNMk1FTQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VORVJBVE9SMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VORVJBVE9SMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VORVJBVE9SMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VORVJBVE9SMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfQURDMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfREFDMV9DSDENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0RBQzFfQ0gyDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU02X1VQDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU03X1VQDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9TUEkxX1JYDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9TUEkxX1RYDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9TUEkyX1JYDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9TUEkyX1RYDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9TUEkzX1JYDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9TUEkzX1RYDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9JMkMxX1JYDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9JMkMxX1RYDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9JMkMyX1JYDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9JMkMyX1RYDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9JMkMzX1JYDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9JMkMzX1RYICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfSTJDNF9SWCAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0kyQzRfVFgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1VTQVJUMV9SWA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVVNBUlQxX1RYDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9VU0FSVDJfUlgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1VTQVJUMl9UWA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVVNBUlQzX1JYDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9VU0FSVDNfVFgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1VBUlQ0X1JYDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9VQVJUNF9UWA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVUFSVDVfUlggKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9VQVJUNV9UWCAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0xQVUFSVDFfUlgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0xQVUFSVDFfVFgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0FEQzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0FEQzMgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9BREM0ICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfQURDNSAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1FTUEkgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9EQUMyX0NIMSAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTFfQ0gxDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xX0NIMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMV9DSDMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTFfQ0g0DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xX1VQDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xX1RSSUcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTFfQ09NDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU04X0NIMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNOF9DSDINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTThfQ0gzDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU04X0NINA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNOF9VUA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNOF9UUklHDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU04X0NPTQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMl9DSDENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTJfQ0gyDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yX0NIMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMl9DSDQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTJfVVANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTNfQ0gxDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0zX0NIMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNM19DSDMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTNfQ0g0DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0zX1VQDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0zX1RSSUcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTRfQ0gxDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU00X0NIMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNNF9DSDMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTRfQ0g0DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU00X1VQDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU01X0NIMSAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTVfQ0gyICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNNV9DSDMgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU01X0NINCAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTVfVVAgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU01X1RSSUcgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xNV9DSDENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTE1X1VQDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xNV9UUklHDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xNV9DT00NCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTE2X0NIMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMTZfVVANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTE3X0NIMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMTdfVVANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTIwX0NIMSAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTIwX0NIMiAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTIwX0NIMyAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTIwX0NINCAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTIwX1VQICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfQUVTX0lODQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9BRVNfT1VUDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yMF9UUklHICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMjBfQ09NICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfSFJUSU0xX00gKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9IUlRJTTFfQSAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0hSVElNMV9CICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfSFJUSU0xX0MgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9IUlRJTTFfRCAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0hSVElNMV9FICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfSFJUSU0xX0YgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9EQUMzX0NIMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfREFDM19DSDINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0RBQzRfQ0gxICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfREFDNF9DSDIgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9TUEk0X1JYICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfU1BJNF9UWCAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1NBSTFfQQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfU0FJMV9CDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9GTUFDX1dSSVRFDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9GTUFDX1dSSVRFDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9DT1JESUNfV1JJVEUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0NPUkRJQ19SRUFEDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9VQ1BEMV9SWA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVUNQRDFfVFgNCi0gKiAgICAgICAgICgqKSBOb3Qgb24gYWxsIEc0IGRldmljZXMNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFNVVhfU2V0UmVxdWVzdElEKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUmVxdWVzdCkgew0KLSAgKHZvaWQpKERNQU1VWHgpOw0KLSAgTU9ESUZZX1JFRygoRE1BTVVYMV9DaGFubmVsMCArIENoYW5uZWwpLT5DQ1IsIERNQU1VWF9DeENSX0RNQVJFUV9JRCwgUmVxdWVzdCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IERNQU1VWCByZXF1ZXN0IElEIGZvciBETUFNVVggQ2hhbm5lbCB4Lg0KLSAqIEBub3RlICAgRE1BTVVYIGNoYW5uZWwgMCB0byA3IGFyZSBtYXBwZWQgdG8gRE1BMSBjaGFubmVsIDEgdG8gOC4NCi0gKiAgICAgICAgIERNQU1VWCBjaGFubmVsIDggdG8gMTUgYXJlIG1hcHBlZCB0byBETUEyIGNoYW5uZWwgMSB0byA4Lg0KLSAqIEBybXRvbGwgQ3hDUiAgICAgICAgIERNQVJFUV9JRCAgICAgTExfRE1BTVVYX0dldFJlcXVlc3RJRA0KLSAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlDQotICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF81DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF84DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEwDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEzDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xNQ0KLSAqICAgICAgICAgKCopIE5vdCBvbiBhbGwgRzQgZGV2aWNlcw0KLSAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX01FTTJNRU0NCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTkVSQVRPUjANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTkVSQVRPUjANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTkVSQVRPUjENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTkVSQVRPUjINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTkVSQVRPUjMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0FEQzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0RBQzFfQ0gxDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9EQUMxX0NIMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNNl9VUA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNN19VUA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfU1BJMV9SWA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfU1BJMV9UWA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfU1BJMl9SWA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfU1BJMl9UWA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfU1BJM19SWA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfU1BJM19UWA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfSTJDMV9SWA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfSTJDMV9UWA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfSTJDMl9SWA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfSTJDMl9UWA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfSTJDM19SWA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfSTJDM19UWCAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0kyQzRfUlggKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9JMkM0X1RYDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9VU0FSVDFfUlgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1VTQVJUMV9UWA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVVNBUlQyX1JYDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9VU0FSVDJfVFgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1VTQVJUM19SWA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVVNBUlQzX1RYDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9VQVJUNF9SWA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVUFSVDRfVFgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1VBUlQ1X1JYICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVUFSVDVfVFggKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9MUFVBUlQxX1JYDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9MUFVBUlQxX1RYDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9BREMyDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9BREMzICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfQURDNCAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0FEQzUgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9RU1BJICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfREFDMl9DSDEgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xX0NIMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMV9DSDINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTFfQ0gzDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xX0NINA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMV9VUA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMV9UUklHDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xX0NPTQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNOF9DSDENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTThfQ0gyDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU04X0NIMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNOF9DSDQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTThfVVANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTThfVFJJRw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNOF9DT00NCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTJfQ0gxDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yX0NIMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMl9DSDMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTJfQ0g0DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yX1VQDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0zX0NIMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNM19DSDINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTNfQ0gzDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0zX0NINA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNM19VUA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNM19UUklHDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU00X0NIMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNNF9DSDINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTRfQ0gzDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU00X0NINA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNNF9VUA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNNV9DSDEgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU01X0NIMiAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTVfQ0gzICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNNV9DSDQgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU01X1VQICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNNV9UUklHICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMTVfQ0gxDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xNV9VUA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMTVfVFJJRw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMTVfQ09NDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xNl9DSDENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTE2X1VQDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xN19DSDENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTE3X1VQDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yMF9DSDEgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yMF9DSDIgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yMF9DSDMgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yMF9DSDQgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yMF9VUCAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0FFU19JTg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfQUVTX09VVA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMjBfVFJJRyAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTIwX0NPTSAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0hSVElNMV9NICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfSFJUSU0xX0EgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9IUlRJTTFfQiAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0hSVElNMV9DICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfSFJUSU0xX0QgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9IUlRJTTFfRSAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0hSVElNMV9GICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfREFDM19DSDENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0RBQzNfQ0gyDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9EQUM0X0NIMSAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0RBQzRfQ0gyICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfU1BJNF9SWCAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1NQSTRfVFggKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9TQUkxX0ENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1NBSTFfQg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfRk1BQ19XUklURQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfRk1BQ19XUklURQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfQ09SRElDX1dSSVRFDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9DT1JESUNfUkVBRA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVUNQRDFfUlgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1VDUEQxX1RYDQotICogICAgICAgICAoKikgTm90IG9uIGFsbCBHNCBkZXZpY2VzDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQU1VWF9HZXRSZXF1ZXN0SUQoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKSB7DQotICAodm9pZCkoRE1BTVVYeCk7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVCgoRE1BTVVYMV9DaGFubmVsMCArIENoYW5uZWwpLT5DQ1IsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBETUFNVVhfQ3hDUl9ETUFSRVFfSUQpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZXQgdGhlIG51bWJlciBvZiBETUEgcmVxdWVzdCB0aGF0IHdpbGwgYmUgYXV0b3JpemVkIGFmdGVyIGENCi0gKiBzeW5jaHJvbml6YXRpb24gZXZlbnQgYW5kL29yIHRoZSBudW1iZXIgb2YgRE1BIHJlcXVlc3QgbmVlZGVkIHRvIGdlbmVyYXRlIGFuDQotICogZXZlbnQuDQotICogQHJtdG9sbCBDeENSICAgICAgICAgTkJSRVEgICAgICAgICBMTF9ETUFNVVhfU2V0U3luY1JlcXVlc3ROYg0KLSAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlDQotICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF81DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF84DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEwDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEzDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xNQ0KLSAqIEBwYXJhbSAgUmVxdWVzdE5iIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIE1pbl9EYXRhID0gMSBhbmQNCi0gKiBNYXhfRGF0YSA9IDMyLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9TZXRTeW5jUmVxdWVzdE5iKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBSZXF1ZXN0TmIpIHsNCi0gICh2b2lkKShETUFNVVh4KTsNCi0gIE1PRElGWV9SRUcoKERNQU1VWDFfQ2hhbm5lbDAgKyBDaGFubmVsKS0+Q0NSLCBETUFNVVhfQ3hDUl9OQlJFUSwNCi0gICAgICAgICAgICAgKChSZXF1ZXN0TmIgLSAxVSkgPDwgRE1BTVVYX0N4Q1JfTkJSRVFfUG9zKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IHRoZSBudW1iZXIgb2YgRE1BIHJlcXVlc3QgdGhhdCB3aWxsIGJlIGF1dG9yaXplZCBhZnRlciBhDQotICogc3luY2hyb25pemF0aW9uIGV2ZW50IGFuZC9vciB0aGUgbnVtYmVyIG9mIERNQSByZXF1ZXN0IG5lZWRlZCB0byBnZW5lcmF0ZSBhbg0KLSAqIGV2ZW50Lg0KLSAqIEBybXRvbGwgQ3hDUiAgICAgICAgIE5CUkVRICAgICAgICAgTExfRE1BTVVYX0dldFN5bmNSZXF1ZXN0TmINCi0gKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQ0KLSAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF80DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF83DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzExDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzE0DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTUNCi0gKiBAcmV0dmFsIEJldHdlZW4gTWluX0RhdGEgPSAxIGFuZCBNYXhfRGF0YSA9IDMyDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90DQotTExfRE1BTVVYX0dldFN5bmNSZXF1ZXN0TmIoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCwgdWludDMyX3QgQ2hhbm5lbCkgew0KLSAgKHZvaWQpKERNQU1VWHgpOw0KLSAgcmV0dXJuICh1aW50MzJfdCkoKChSRUFEX0JJVCgoRE1BTVVYMV9DaGFubmVsMCArIENoYW5uZWwpLT5DQ1IsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERNQU1VWF9DeENSX05CUkVRKSkgPj4NCi0gICAgICAgICAgICAgICAgICAgICBETUFNVVhfQ3hDUl9OQlJFUV9Qb3MpICsNCi0gICAgICAgICAgICAgICAgICAgIDFVKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZXQgdGhlIHBvbGFyaXR5IG9mIHRoZSBzaWduYWwgb24gd2hpY2ggdGhlIERNQSByZXF1ZXN0IGlzDQotICogc3luY2hyb25pemVkLg0KLSAqIEBybXRvbGwgQ3hDUiAgICAgICAgIFNQT0wgICAgICAgICAgTExfRE1BTVVYX1NldFN5bmNQb2xhcml0eQ0KLSAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlDQotICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF81DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF84DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEwDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEzDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xNQ0KLSAqIEBwYXJhbSAgUG9sYXJpdHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19OT19FVkVOVA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX1BPTF9SSVNJTkcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19QT0xfRkFMTElORw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX1BPTF9SSVNJTkdfRkFMTElORw0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9TZXRTeW5jUG9sYXJpdHkoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQb2xhcml0eSkgew0KLSAgKHZvaWQpKERNQU1VWHgpOw0KLSAgTU9ESUZZX1JFRygoRE1BTVVYMV9DaGFubmVsMCArIENoYW5uZWwpLT5DQ1IsIERNQU1VWF9DeENSX1NQT0wsIFBvbGFyaXR5KTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgdGhlIHBvbGFyaXR5IG9mIHRoZSBzaWduYWwgb24gd2hpY2ggdGhlIERNQSByZXF1ZXN0IGlzDQotICogc3luY2hyb25pemVkLg0KLSAqIEBybXRvbGwgQ3hDUiAgICAgICAgIFNQT0wgICAgICAgICAgTExfRE1BTVVYX0dldFN5bmNQb2xhcml0eQ0KLSAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlDQotICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF81DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF84DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEwDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEzDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xNQ0KLSAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19OT19FVkVOVA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX1BPTF9SSVNJTkcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19QT0xfRkFMTElORw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX1BPTF9SSVNJTkdfRkFMTElORw0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdA0KLUxMX0RNQU1VWF9HZXRTeW5jUG9sYXJpdHkoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCwgdWludDMyX3QgQ2hhbm5lbCkgew0KLSAgKHZvaWQpKERNQU1VWHgpOw0KLSAgcmV0dXJuICgNCi0gICAgICB1aW50MzJfdCkoUkVBRF9CSVQoKERNQU1VWDFfQ2hhbm5lbDAgKyBDaGFubmVsKS0+Q0NSLCBETUFNVVhfQ3hDUl9TUE9MKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIHRoZSBFdmVudCBHZW5lcmF0aW9uIG9uIERNQU1VWCBjaGFubmVsIHguDQotICogQHJtdG9sbCBDeENSICAgICAgICAgRUdFICAgICAgICAgICBMTF9ETUFNVVhfRW5hYmxlRXZlbnRHZW5lcmF0aW9uDQotICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UNCi0gKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8wDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8zDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF82DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF85DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEyDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzE1DQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BTVVYX0VuYWJsZUV2ZW50R2VuZXJhdGlvbigNCi0gICAgRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCwgdWludDMyX3QgQ2hhbm5lbCkgew0KLSAgKHZvaWQpKERNQU1VWHgpOw0KLSAgU0VUX0JJVCgoRE1BTVVYMV9DaGFubmVsMCArIENoYW5uZWwpLT5DQ1IsIERNQU1VWF9DeENSX0VHRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSB0aGUgRXZlbnQgR2VuZXJhdGlvbiBvbiBETUFNVVggY2hhbm5lbCB4Lg0KLSAqIEBybXRvbGwgQ3hDUiAgICAgICAgIEVHRSAgICAgICAgICAgTExfRE1BTVVYX0Rpc2FibGVFdmVudEdlbmVyYXRpb24NCi0gKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQ0KLSAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF80DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF83DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzExDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzE0DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFNVVhfRGlzYWJsZUV2ZW50R2VuZXJhdGlvbigNCi0gICAgRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCwgdWludDMyX3QgQ2hhbm5lbCkgew0KLSAgKHZvaWQpKERNQU1VWHgpOw0KLSAgQ0xFQVJfQklUKChETUFNVVgxX0NoYW5uZWwwICsgQ2hhbm5lbCktPkNDUiwgRE1BTVVYX0N4Q1JfRUdFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiB0aGUgRXZlbnQgR2VuZXJhdGlvbiBvbiBETUFNVVggY2hhbm5lbCB4IGlzIGVuYWJsZWQgb3INCi0gKiBkaXNhYmxlZC4NCi0gKiBAcm10b2xsIEN4Q1IgICAgICAgICBFR0UgICAgICAgICAgIExMX0RNQU1VWF9Jc0VuYWJsZWRFdmVudEdlbmVyYXRpb24NCi0gKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQ0KLSAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF80DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF83DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzExDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzE0DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTUNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BTVVYX0lzRW5hYmxlZEV2ZW50R2VuZXJhdGlvbigNCi0gICAgRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCwgdWludDMyX3QgQ2hhbm5lbCkgew0KLSAgKHZvaWQpKERNQU1VWHgpOw0KLSAgcmV0dXJuICgoUkVBRF9CSVQoKERNQU1VWDFfQ2hhbm5lbDAgKyBDaGFubmVsKS0+Q0NSLCBETUFNVVhfQ3hDUl9FR0UpID09DQotICAgICAgICAgICAoRE1BTVVYX0N4Q1JfRUdFKSkNCi0gICAgICAgICAgICAgID8gMVVMDQotICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIHRoZSBzeW5jaHJvbml6YXRpb24gbW9kZS4NCi0gKiBAcm10b2xsIEN4Q1IgICAgICAgICBTRSAgICAgICAgICAgIExMX0RNQU1VWF9FbmFibGVTeW5jDQotICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UNCi0gKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8wDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8zDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF82DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF85DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEyDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzE1DQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BTVVYX0VuYWJsZVN5bmMoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKSB7DQotICAodm9pZCkoRE1BTVVYeCk7DQotICBTRVRfQklUKChETUFNVVgxX0NoYW5uZWwwICsgQ2hhbm5lbCktPkNDUiwgRE1BTVVYX0N4Q1JfU0UpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgdGhlIHN5bmNocm9uaXphdGlvbiBtb2RlLg0KLSAqIEBybXRvbGwgQ3hDUiAgICAgICAgIFNFICAgICAgICAgICAgTExfRE1BTVVYX0Rpc2FibGVTeW5jDQotICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UNCi0gKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8wDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8zDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF82DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF85DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEyDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzE1DQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BTVVYX0Rpc2FibGVTeW5jKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpIHsNCi0gICh2b2lkKShETUFNVVh4KTsNCi0gIENMRUFSX0JJVCgoRE1BTVVYMV9DaGFubmVsMCArIENoYW5uZWwpLT5DQ1IsIERNQU1VWF9DeENSX1NFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiB0aGUgc3luY2hyb25pemF0aW9uIG1vZGUgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4NCi0gKiBAcm10b2xsIEN4Q1IgICAgICAgICBTRSAgICAgICAgICAgIExMX0RNQU1VWF9Jc0VuYWJsZWRTeW5jDQotICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UNCi0gKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8wDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8zDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF82DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF85DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEyDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzE1DQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90DQotTExfRE1BTVVYX0lzRW5hYmxlZFN5bmMoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCwgdWludDMyX3QgQ2hhbm5lbCkgew0KLSAgKHZvaWQpKERNQU1VWHgpOw0KLSAgcmV0dXJuICgoUkVBRF9CSVQoKERNQU1VWDFfQ2hhbm5lbDAgKyBDaGFubmVsKS0+Q0NSLCBETUFNVVhfQ3hDUl9TRSkgPT0NCi0gICAgICAgICAgIChETUFNVVhfQ3hDUl9TRSkpDQotICAgICAgICAgICAgICA/IDFVTA0KLSAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCBETUFNVVggc3luY2hyb25pemF0aW9uIElEICBvbiBETUFNVVggQ2hhbm5lbCB4Lg0KLSAqIEBybXRvbGwgQ3hDUiAgICAgICAgIFNZTkNfSUQgICAgICAgTExfRE1BTVVYX1NldFN5bmNJRA0KLSAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlDQotICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF81DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF84DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEwDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEzDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xNQ0KLSAqIEBwYXJhbSAgU3luY0lEIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkUyDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkU1DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkU4DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTEwDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FMTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkUxMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTEzDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FMTQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkUxNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX0RNQU1VWF9DSDANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19ETUFNVVhfQ0gxDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRE1BTVVYX0NIMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX0RNQU1VWF9DSDMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19MUFRJTTFfT1VUDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BTVVYX1NldFN5bmNJRChETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgU3luY0lEKSB7DQotICAodm9pZCkoRE1BTVVYeCk7DQotICBNT0RJRllfUkVHKChETUFNVVgxX0NoYW5uZWwwICsgQ2hhbm5lbCktPkNDUiwgRE1BTVVYX0N4Q1JfU1lOQ19JRCwgU3luY0lEKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgRE1BTVVYIHN5bmNocm9uaXphdGlvbiBJRCAgb24gRE1BTVVYIENoYW5uZWwgeC4NCi0gKiBAcm10b2xsIEN4Q1IgICAgICAgICBTWU5DX0lEICAgICAgIExMX0RNQU1VWF9HZXRTeW5jSUQNCi0gKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQ0KLSAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF80DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF83DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzExDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzE0DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTUNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkUyDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkU1DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkU4DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTEwDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FMTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkUxMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTEzDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FMTQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkUxNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX0RNQU1VWF9DSDANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19ETUFNVVhfQ0gxDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRE1BTVVYX0NIMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX0RNQU1VWF9DSDMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19MUFRJTTFfT1VUDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQU1VWF9HZXRTeW5jSUQoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKSB7DQotICAodm9pZCkoRE1BTVVYeCk7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVCgoRE1BTVVYMV9DaGFubmVsMCArIENoYW5uZWwpLT5DQ1IsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBETUFNVVhfQ3hDUl9TWU5DX0lEKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIHRoZSBSZXF1ZXN0IEdlbmVyYXRvci4NCi0gKiBAcm10b2xsIFJHeENSICAgICAgICBHRSAgICAgICAgICAgIExMX0RNQU1VWF9FbmFibGVSZXF1ZXN0R2VuDQotICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UNCi0gKiBAcGFyYW0gIFJlcXVlc3RHZW5DaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMw0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9FbmFibGVSZXF1ZXN0R2VuKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUmVxdWVzdEdlbkNoYW5uZWwpIHsNCi0gICh2b2lkKShETUFNVVh4KTsNCi0gIFNFVF9CSVQoKChETUFNVVhfUmVxdWVzdEdlbl9UeXBlRGVmICopKCgNCi0gICAgICAgICAgICAgICB1aW50MzJfdCkoKHVpbnQzMl90KURNQU1VWDFfUmVxdWVzdEdlbmVyYXRvcjAgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAoRE1BTVVYX1JHQ1JfU0laRSAqIChSZXF1ZXN0R2VuQ2hhbm5lbCkpKSkpDQotICAgICAgICAgICAgICAtPlJHQ1IsDQotICAgICAgICAgIERNQU1VWF9SR3hDUl9HRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSB0aGUgUmVxdWVzdCBHZW5lcmF0b3IuDQotICogQHJtdG9sbCBSR3hDUiAgICAgICAgR0UgICAgICAgICAgICBMTF9ETUFNVVhfRGlzYWJsZVJlcXVlc3RHZW4NCi0gKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQ0KLSAqIEBwYXJhbSAgUmVxdWVzdEdlbkNoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8wDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8zDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BTVVYX0Rpc2FibGVSZXF1ZXN0R2VuKA0KLSAgICBETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4LCB1aW50MzJfdCBSZXF1ZXN0R2VuQ2hhbm5lbCkgew0KLSAgKHZvaWQpKERNQU1VWHgpOw0KLSAgQ0xFQVJfQklUKCgoRE1BTVVYX1JlcXVlc3RHZW5fVHlwZURlZiAqKSgoDQotICAgICAgICAgICAgICAgICB1aW50MzJfdCkoKHVpbnQzMl90KURNQU1VWDFfUmVxdWVzdEdlbmVyYXRvcjAgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChETUFNVVhfUkdDUl9TSVpFICogKFJlcXVlc3RHZW5DaGFubmVsKSkpKSkNCi0gICAgICAgICAgICAgICAgLT5SR0NSLA0KLSAgICAgICAgICAgIERNQU1VWF9SR3hDUl9HRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFJlcXVlc3QgR2VuZXJhdG9yIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuDQotICogQHJtdG9sbCBSR3hDUiAgICAgICAgR0UgICAgICAgICAgICBMTF9ETUFNVVhfSXNFbmFibGVkUmVxdWVzdEdlbg0KLSAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlDQotICogQHBhcmFtICBSZXF1ZXN0R2VuQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8xDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzMNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BTVVYX0lzRW5hYmxlZFJlcXVlc3RHZW4oDQotICAgIERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgsIHVpbnQzMl90IFJlcXVlc3RHZW5DaGFubmVsKSB7DQotICAodm9pZCkoRE1BTVVYeCk7DQotICByZXR1cm4gKChSRUFEX0JJVCgoKERNQU1VWF9SZXF1ZXN0R2VuX1R5cGVEZWYgKikoKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCkoKHVpbnQzMl90KURNQU1VWDFfUmVxdWVzdEdlbmVyYXRvcjAgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERNQU1VWF9SR0NSX1NJWkUgKiAoUmVxdWVzdEdlbkNoYW5uZWwpKSkpKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIC0+UkdDUiwNCi0gICAgICAgICAgICAgICAgICAgIERNQU1VWF9SR3hDUl9HRSkgPT0gKERNQU1VWF9SR3hDUl9HRSkpDQotICAgICAgICAgICAgICA/IDFVTA0KLSAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCB0aGUgcG9sYXJpdHkgb2YgdGhlIHNpZ25hbCBvbiB3aGljaCB0aGUgRE1BIHJlcXVlc3QgaXMgZ2VuZXJhdGVkLg0KLSAqIEBybXRvbGwgUkd4Q1IgICAgICAgIEdQT0wgICAgICAgICAgTExfRE1BTVVYX1NldFJlcXVlc3RHZW5Qb2xhcml0eQ0KLSAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlDQotICogQHBhcmFtICBSZXF1ZXN0R2VuQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8xDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzMNCi0gKiBAcGFyYW0gIFBvbGFyaXR5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fTk9fRVZFTlQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9QT0xfUklTSU5HDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fUE9MX0ZBTExJTkcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9QT0xfUklTSU5HX0ZBTExJTkcNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFNVVhfU2V0UmVxdWVzdEdlblBvbGFyaXR5KA0KLSAgICBETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4LCB1aW50MzJfdCBSZXF1ZXN0R2VuQ2hhbm5lbCwNCi0gICAgdWludDMyX3QgUG9sYXJpdHkpIHsNCi0gIFVOVVNFRChETUFNVVh4KTsNCi0gIE1PRElGWV9SRUcoKChETUFNVVhfUmVxdWVzdEdlbl9UeXBlRGVmICopKCgNCi0gICAgICAgICAgICAgICAgICB1aW50MzJfdCkoKHVpbnQzMl90KURNQU1VWDFfUmVxdWVzdEdlbmVyYXRvcjAgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRE1BTVVYX1JHQ1JfU0laRSAqIChSZXF1ZXN0R2VuQ2hhbm5lbCkpKSkpDQotICAgICAgICAgICAgICAgICAtPlJHQ1IsDQotICAgICAgICAgICAgIERNQU1VWF9SR3hDUl9HUE9MLCBQb2xhcml0eSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IHRoZSBwb2xhcml0eSBvZiB0aGUgc2lnbmFsIG9uIHdoaWNoIHRoZSBETUEgcmVxdWVzdCBpcyBnZW5lcmF0ZWQuDQotICogQHJtdG9sbCBSR3hDUiAgICAgICAgR1BPTCAgICAgICAgICBMTF9ETUFNVVhfR2V0UmVxdWVzdEdlblBvbGFyaXR5DQotICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UNCi0gKiBAcGFyYW0gIFJlcXVlc3RHZW5DaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMw0KLSAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9OT19FVkVOVA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX1BPTF9SSVNJTkcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9QT0xfRkFMTElORw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX1BPTF9SSVNJTkdfRkFMTElORw0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFNVVhfR2V0UmVxdWVzdEdlblBvbGFyaXR5KA0KLSAgICBETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4LCB1aW50MzJfdCBSZXF1ZXN0R2VuQ2hhbm5lbCkgew0KLSAgVU5VU0VEKERNQU1VWHgpOw0KLSAgcmV0dXJuIChSRUFEX0JJVCgoKERNQU1VWF9SZXF1ZXN0R2VuX1R5cGVEZWYgKikoKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KSgodWludDMyX3QpRE1BTVVYMV9SZXF1ZXN0R2VuZXJhdG9yMCArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChETUFNVVhfUkdDUl9TSVpFICogKFJlcXVlc3RHZW5DaGFubmVsKSkpKSkNCi0gICAgICAgICAgICAgICAgICAgICAgIC0+UkdDUiwNCi0gICAgICAgICAgICAgICAgICAgRE1BTVVYX1JHeENSX0dQT0wpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZXQgdGhlIG51bWJlciBvZiBETUEgcmVxdWVzdCB0aGF0IHdpbGwgYmUgYXV0b3JpemVkIGFmdGVyIGENCi0gKiBnZW5lcmF0aW9uIGV2ZW50Lg0KLSAqIEBub3RlICAgVGhpcyBmaWVsZCBjYW4gb25seSBiZSB3cml0dGVuIHdoZW4gR2VuZXJhdG9yIGlzIGRpc2FibGVkLg0KLSAqIEBybXRvbGwgUkd4Q1IgICAgICAgIEdOQlJFUSAgICAgICAgTExfRE1BTVVYX1NldEdlblJlcXVlc3ROYg0KLSAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlDQotICogQHBhcmFtICBSZXF1ZXN0R2VuQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8xDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzMNCi0gKiBAcGFyYW0gIFJlcXVlc3ROYiBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiBNaW5fRGF0YSA9IDEgYW5kDQotICogTWF4X0RhdGEgPSAzMi4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFNVVhfU2V0R2VuUmVxdWVzdE5iKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBSZXF1ZXN0R2VuQ2hhbm5lbCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFJlcXVlc3ROYikgew0KLSAgVU5VU0VEKERNQU1VWHgpOw0KLSAgTU9ESUZZX1JFRygoKERNQU1VWF9SZXF1ZXN0R2VuX1R5cGVEZWYgKikoKA0KLSAgICAgICAgICAgICAgICAgIHVpbnQzMl90KSgodWludDMyX3QpRE1BTVVYMV9SZXF1ZXN0R2VuZXJhdG9yMCArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChETUFNVVhfUkdDUl9TSVpFICogKFJlcXVlc3RHZW5DaGFubmVsKSkpKSkNCi0gICAgICAgICAgICAgICAgIC0+UkdDUiwNCi0gICAgICAgICAgICAgRE1BTVVYX1JHeENSX0dOQlJFUSwgKFJlcXVlc3ROYiAtIDFVKSA8PCBETUFNVVhfUkd4Q1JfR05CUkVRX1Bvcyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IHRoZSBudW1iZXIgb2YgRE1BIHJlcXVlc3QgdGhhdCB3aWxsIGJlIGF1dG9yaXplZCBhZnRlciBhDQotICogZ2VuZXJhdGlvbiBldmVudC4NCi0gKiBAcm10b2xsIFJHeENSICAgICAgICBHTkJSRVEgICAgICAgIExMX0RNQU1VWF9HZXRHZW5SZXF1ZXN0TmINCi0gKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQ0KLSAqIEBwYXJhbSAgUmVxdWVzdEdlbkNoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8wDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8zDQotICogQHJldHZhbCBCZXR3ZWVuIE1pbl9EYXRhID0gMSBhbmQgTWF4X0RhdGEgPSAzMg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFNVVhfR2V0R2VuUmVxdWVzdE5iKA0KLSAgICBETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4LCB1aW50MzJfdCBSZXF1ZXN0R2VuQ2hhbm5lbCkgew0KLSAgVU5VU0VEKERNQU1VWHgpOw0KLSAgcmV0dXJuICgoUkVBRF9CSVQoKChETUFNVVhfUmVxdWVzdEdlbl9UeXBlRGVmICopKCgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QpKCh1aW50MzJfdClETUFNVVgxX1JlcXVlc3RHZW5lcmF0b3IwICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChETUFNVVhfUkdDUl9TSVpFICogKFJlcXVlc3RHZW5DaGFubmVsKSkpKSkNCi0gICAgICAgICAgICAgICAgICAgICAgICAtPlJHQ1IsDQotICAgICAgICAgICAgICAgICAgICBETUFNVVhfUkd4Q1JfR05CUkVRKSA+Pg0KLSAgICAgICAgICAgRE1BTVVYX1JHeENSX0dOQlJFUV9Qb3MpICsNCi0gICAgICAgICAgMVUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCBETUFNVVggZXh0ZXJuYWwgUmVxdWVzdCBTaWduYWwgSUQgb24gRE1BTVVYIFJlcXVlc3QgR2VuZXJhdGlvbg0KLSAqIFRyaWdnZXIgRXZlbnQgQ2hhbm5lbCB4Lg0KLSAqIEBybXRvbGwgUkd4Q1IgICAgICAgIFNJR19JRCAgICAgICAgTExfRE1BTVVYX1NldFJlcXVlc3RTaWduYWxJRA0KLSAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlDQotICogQHBhcmFtICBSZXF1ZXN0R2VuQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8xDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzMNCi0gKiBAcGFyYW0gIFJlcXVlc3RTaWduYWxJRCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkUxDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkU0DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkU3DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkUxMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTExDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FMTINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkUxMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTE0DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FMTUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9ETUFNVVhfQ0gwDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fRE1BTVVYX0NIMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0RNQU1VWF9DSDINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9ETUFNVVhfQ0gzDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fTFBUSU0xX09VVA0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9TZXRSZXF1ZXN0U2lnbmFsSUQoDQotICAgIERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgsIHVpbnQzMl90IFJlcXVlc3RHZW5DaGFubmVsLA0KLSAgICB1aW50MzJfdCBSZXF1ZXN0U2lnbmFsSUQpIHsNCi0gIFVOVVNFRChETUFNVVh4KTsNCi0gIE1PRElGWV9SRUcoKChETUFNVVhfUmVxdWVzdEdlbl9UeXBlRGVmICopKCgNCi0gICAgICAgICAgICAgICAgICB1aW50MzJfdCkoKHVpbnQzMl90KURNQU1VWDFfUmVxdWVzdEdlbmVyYXRvcjAgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRE1BTVVYX1JHQ1JfU0laRSAqIChSZXF1ZXN0R2VuQ2hhbm5lbCkpKSkpDQotICAgICAgICAgICAgICAgICAtPlJHQ1IsDQotICAgICAgICAgICAgIERNQU1VWF9SR3hDUl9TSUdfSUQsIFJlcXVlc3RTaWduYWxJRCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IERNQU1VWCBleHRlcm5hbCBSZXF1ZXN0IFNpZ25hbCBJRCBzZXQgb24gRE1BTVVYIENoYW5uZWwgeC4NCi0gKiBAcm10b2xsIFJHeENSICAgICAgICBTSUdfSUQgICAgICAgIExMX0RNQU1VWF9HZXRSZXF1ZXN0U2lnbmFsSUQNCi0gKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQ0KLSAqIEBwYXJhbSAgUmVxdWVzdEdlbkNoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8wDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8zDQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkUxDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkU0DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkU3DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkUxMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTExDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FMTINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkUxMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTE0DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FMTUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9ETUFNVVhfQ0gwDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fRE1BTVVYX0NIMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0RNQU1VWF9DSDINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9ETUFNVVhfQ0gzDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fTFBUSU0xX09VVA0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFNVVhfR2V0UmVxdWVzdFNpZ25hbElEKA0KLSAgICBETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4LCB1aW50MzJfdCBSZXF1ZXN0R2VuQ2hhbm5lbCkgew0KLSAgVU5VU0VEKERNQU1VWHgpOw0KLSAgcmV0dXJuIChSRUFEX0JJVCgoKERNQU1VWF9SZXF1ZXN0R2VuX1R5cGVEZWYgKikoKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KSgodWludDMyX3QpRE1BTVVYMV9SZXF1ZXN0R2VuZXJhdG9yMCArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChETUFNVVhfUkdDUl9TSVpFICogKFJlcXVlc3RHZW5DaGFubmVsKSkpKSkNCi0gICAgICAgICAgICAgICAgICAgICAgIC0+UkdDUiwNCi0gICAgICAgICAgICAgICAgICAgRE1BTVVYX1JHeENSX1NJR19JRCkpOw0KLX0NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRE1BTVVYX0xMX0VGX0ZMQUdfTWFuYWdlbWVudCBGTEFHX01hbmFnZW1lbnQNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCAwLg0KLSAqIEBybXRvbGwgQ1NSICAgICAgICAgIFNPRjAgICAgICAgICAgTExfRE1BTVVYX0lzQWN0aXZlRmxhZ19TTzANCi0gKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90DQotTExfRE1BTVVYX0lzQWN0aXZlRmxhZ19TTzAoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCkgew0KLSAgVU5VU0VEKERNQU1VWHgpOw0KLSAgcmV0dXJuICgoUkVBRF9CSVQoRE1BTVVYMV9DaGFubmVsU3RhdHVzLT5DU1IsIERNQU1VWF9DU1JfU09GMCkgPT0NCi0gICAgICAgICAgIChETUFNVVhfQ1NSX1NPRjApKQ0KLSAgICAgICAgICAgICAgPyAxVUwNCi0gICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDEuDQotICogQHJtdG9sbCBDU1IgICAgICAgICAgU09GMSAgICAgICAgICBMTF9ETUFNVVhfSXNBY3RpdmVGbGFnX1NPMQ0KLSAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QNCi1MTF9ETUFNVVhfSXNBY3RpdmVGbGFnX1NPMShETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4KSB7DQotICBVTlVTRUQoRE1BTVVYeCk7DQotICByZXR1cm4gKChSRUFEX0JJVChETUFNVVgxX0NoYW5uZWxTdGF0dXMtPkNTUiwgRE1BTVVYX0NTUl9TT0YxKSA9PQ0KLSAgICAgICAgICAgKERNQU1VWF9DU1JfU09GMSkpDQotICAgICAgICAgICAgICA/IDFVTA0KLSAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBTeW5jaHJvbml6YXRpb24gRXZlbnQgT3ZlcnJ1biBGbGFnIENoYW5uZWwgMi4NCi0gKiBAcm10b2xsIENTUiAgICAgICAgICBTT0YyICAgICAgICAgIExMX0RNQU1VWF9Jc0FjdGl2ZUZsYWdfU08yDQotICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdA0KLUxMX0RNQU1VWF9Jc0FjdGl2ZUZsYWdfU08yKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpIHsNCi0gIFVOVVNFRChETUFNVVh4KTsNCi0gIHJldHVybiAoKFJFQURfQklUKERNQU1VWDFfQ2hhbm5lbFN0YXR1cy0+Q1NSLCBETUFNVVhfQ1NSX1NPRjIpID09DQotICAgICAgICAgICAoRE1BTVVYX0NTUl9TT0YyKSkNCi0gICAgICAgICAgICAgID8gMVVMDQotICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCAzLg0KLSAqIEBybXRvbGwgQ1NSICAgICAgICAgIFNPRjMgICAgICAgICAgTExfRE1BTVVYX0lzQWN0aXZlRmxhZ19TTzMNCi0gKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90DQotTExfRE1BTVVYX0lzQWN0aXZlRmxhZ19TTzMoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCkgew0KLSAgVU5VU0VEKERNQU1VWHgpOw0KLSAgcmV0dXJuICgoUkVBRF9CSVQoRE1BTVVYMV9DaGFubmVsU3RhdHVzLT5DU1IsIERNQU1VWF9DU1JfU09GMykgPT0NCi0gICAgICAgICAgIChETUFNVVhfQ1NSX1NPRjMpKQ0KLSAgICAgICAgICAgICAgPyAxVUwNCi0gICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDQuDQotICogQHJtdG9sbCBDU1IgICAgICAgICAgU09GNCAgICAgICAgICBMTF9ETUFNVVhfSXNBY3RpdmVGbGFnX1NPNA0KLSAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QNCi1MTF9ETUFNVVhfSXNBY3RpdmVGbGFnX1NPNChETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4KSB7DQotICBVTlVTRUQoRE1BTVVYeCk7DQotICByZXR1cm4gKChSRUFEX0JJVChETUFNVVgxX0NoYW5uZWxTdGF0dXMtPkNTUiwgRE1BTVVYX0NTUl9TT0Y0KSA9PQ0KLSAgICAgICAgICAgKERNQU1VWF9DU1JfU09GNCkpDQotICAgICAgICAgICAgICA/IDFVTA0KLSAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBTeW5jaHJvbml6YXRpb24gRXZlbnQgT3ZlcnJ1biBGbGFnIENoYW5uZWwgNS4NCi0gKiBAcm10b2xsIENTUiAgICAgICAgICBTT0Y1ICAgICAgICAgIExMX0RNQU1VWF9Jc0FjdGl2ZUZsYWdfU081DQotICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdA0KLUxMX0RNQU1VWF9Jc0FjdGl2ZUZsYWdfU081KERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpIHsNCi0gIFVOVVNFRChETUFNVVh4KTsNCi0gIHJldHVybiAoKFJFQURfQklUKERNQU1VWDFfQ2hhbm5lbFN0YXR1cy0+Q1NSLCBETUFNVVhfQ1NSX1NPRjUpID09DQotICAgICAgICAgICAoRE1BTVVYX0NTUl9TT0Y1KSkNCi0gICAgICAgICAgICAgID8gMVVMDQotICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCA2Lg0KLSAqIEBybXRvbGwgQ1NSICAgICAgICAgIFNPRjYgICAgICAgICAgTExfRE1BTVVYX0lzQWN0aXZlRmxhZ19TTzYNCi0gKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90DQotTExfRE1BTVVYX0lzQWN0aXZlRmxhZ19TTzYoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCkgew0KLSAgVU5VU0VEKERNQU1VWHgpOw0KLSAgcmV0dXJuICgoUkVBRF9CSVQoRE1BTVVYMV9DaGFubmVsU3RhdHVzLT5DU1IsIERNQU1VWF9DU1JfU09GNikgPT0NCi0gICAgICAgICAgIChETUFNVVhfQ1NSX1NPRjYpKQ0KLSAgICAgICAgICAgICAgPyAxVUwNCi0gICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDcuDQotICogQHJtdG9sbCBDU1IgICAgICAgICAgU09GNyAgICAgICAgICBMTF9ETUFNVVhfSXNBY3RpdmVGbGFnX1NPNw0KLSAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QNCi1MTF9ETUFNVVhfSXNBY3RpdmVGbGFnX1NPNyhETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4KSB7DQotICBVTlVTRUQoRE1BTVVYeCk7DQotICByZXR1cm4gKChSRUFEX0JJVChETUFNVVgxX0NoYW5uZWxTdGF0dXMtPkNTUiwgRE1BTVVYX0NTUl9TT0Y3KSA9PQ0KLSAgICAgICAgICAgKERNQU1VWF9DU1JfU09GNykpDQotICAgICAgICAgICAgICA/IDFVTA0KLSAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBTeW5jaHJvbml6YXRpb24gRXZlbnQgT3ZlcnJ1biBGbGFnIENoYW5uZWwgOC4NCi0gKiBAcm10b2xsIENTUiAgICAgICAgICBTT0Y4ICAgICAgICAgIExMX0RNQU1VWF9Jc0FjdGl2ZUZsYWdfU084DQotICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdA0KLUxMX0RNQU1VWF9Jc0FjdGl2ZUZsYWdfU084KERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpIHsNCi0gIFVOVVNFRChETUFNVVh4KTsNCi0gIHJldHVybiAoKFJFQURfQklUKERNQU1VWDFfQ2hhbm5lbFN0YXR1cy0+Q1NSLCBETUFNVVhfQ1NSX1NPRjgpID09DQotICAgICAgICAgICAoRE1BTVVYX0NTUl9TT0Y4KSkNCi0gICAgICAgICAgICAgID8gMVVMDQotICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCA5Lg0KLSAqIEBybXRvbGwgQ1NSICAgICAgICAgIFNPRjkgICAgICAgICAgTExfRE1BTVVYX0lzQWN0aXZlRmxhZ19TTzkNCi0gKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90DQotTExfRE1BTVVYX0lzQWN0aXZlRmxhZ19TTzkoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCkgew0KLSAgVU5VU0VEKERNQU1VWHgpOw0KLSAgcmV0dXJuICgoUkVBRF9CSVQoRE1BTVVYMV9DaGFubmVsU3RhdHVzLT5DU1IsIERNQU1VWF9DU1JfU09GOSkgPT0NCi0gICAgICAgICAgIChETUFNVVhfQ1NSX1NPRjkpKQ0KLSAgICAgICAgICAgICAgPyAxVUwNCi0gICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDEwLg0KLSAqIEBybXRvbGwgQ1NSICAgICAgICAgIFNPRjEwICAgICAgICAgTExfRE1BTVVYX0lzQWN0aXZlRmxhZ19TTzEwDQotICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdA0KLUxMX0RNQU1VWF9Jc0FjdGl2ZUZsYWdfU08xMChETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4KSB7DQotICBVTlVTRUQoRE1BTVVYeCk7DQotICByZXR1cm4gKChSRUFEX0JJVChETUFNVVgxX0NoYW5uZWxTdGF0dXMtPkNTUiwgRE1BTVVYX0NTUl9TT0YxMCkgPT0NCi0gICAgICAgICAgIChETUFNVVhfQ1NSX1NPRjEwKSkNCi0gICAgICAgICAgICAgID8gMVVMDQotICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCAxMS4NCi0gKiBAcm10b2xsIENTUiAgICAgICAgICBTT0YxMSAgICAgICAgIExMX0RNQU1VWF9Jc0FjdGl2ZUZsYWdfU08xMQ0KLSAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QNCi1MTF9ETUFNVVhfSXNBY3RpdmVGbGFnX1NPMTEoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCkgew0KLSAgVU5VU0VEKERNQU1VWHgpOw0KLSAgcmV0dXJuICgoUkVBRF9CSVQoRE1BTVVYMV9DaGFubmVsU3RhdHVzLT5DU1IsIERNQU1VWF9DU1JfU09GMTEpID09DQotICAgICAgICAgICAoRE1BTVVYX0NTUl9TT0YxMSkpDQotICAgICAgICAgICAgICA/IDFVTA0KLSAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0jaWYgZGVmaW5lZChETUFNVVhfQ1NSX1NPRjEyKQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCAxMi4NCi0gKiBAcm10b2xsIENTUiAgICAgICAgICBTT0YxMiAgICAgICAgIExMX0RNQU1VWF9Jc0FjdGl2ZUZsYWdfU08xMg0KLSAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QNCi1MTF9ETUFNVVhfSXNBY3RpdmVGbGFnX1NPMTIoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCkgew0KLSAgVU5VU0VEKERNQU1VWHgpOw0KLSAgcmV0dXJuICgoUkVBRF9CSVQoRE1BTVVYMV9DaGFubmVsU3RhdHVzLT5DU1IsIERNQU1VWF9DU1JfU09GMTIpID09DQotICAgICAgICAgICAoRE1BTVVYX0NTUl9TT0YxMikpDQotICAgICAgICAgICAgICA/IDFVTA0KLSAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0jZW5kaWYgLyogRE1BTVVYX0NTUl9TT0YxMiAqLw0KLQ0KLSNpZiBkZWZpbmVkKERNQU1VWF9DU1JfU09GMTMpDQotLyoqDQotICogQGJyaWVmICBHZXQgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDEzLg0KLSAqIEBybXRvbGwgQ1NSICAgICAgICAgIFNPRjEzICAgICAgICAgTExfRE1BTVVYX0lzQWN0aXZlRmxhZ19TTzEzDQotICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdA0KLUxMX0RNQU1VWF9Jc0FjdGl2ZUZsYWdfU08xMyhETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4KSB7DQotICBVTlVTRUQoRE1BTVVYeCk7DQotICByZXR1cm4gKChSRUFEX0JJVChETUFNVVgxX0NoYW5uZWxTdGF0dXMtPkNTUiwgRE1BTVVYX0NTUl9TT0YxMykgPT0NCi0gICAgICAgICAgIChETUFNVVhfQ1NSX1NPRjEzKSkNCi0gICAgICAgICAgICAgID8gMVVMDQotICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLSNlbmRpZiAvKiBETUFNVVhfQ1NSX1NPRjEzICovDQotDQotI2lmIGRlZmluZWQoRE1BTVVYX0NTUl9TT0YxNCkNCi0vKioNCi0gKiBAYnJpZWYgIEdldCBTeW5jaHJvbml6YXRpb24gRXZlbnQgT3ZlcnJ1biBGbGFnIENoYW5uZWwgMTQuDQotICogQHJtdG9sbCBDU1IgICAgICAgICAgU09GMTMgICAgICAgICBMTF9ETUFNVVhfSXNBY3RpdmVGbGFnX1NPMTQNCi0gKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90DQotTExfRE1BTVVYX0lzQWN0aXZlRmxhZ19TTzE0KERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpIHsNCi0gIFVOVVNFRChETUFNVVh4KTsNCi0gIHJldHVybiAoKFJFQURfQklUKERNQU1VWDFfQ2hhbm5lbFN0YXR1cy0+Q1NSLCBETUFNVVhfQ1NSX1NPRjE0KSA9PQ0KLSAgICAgICAgICAgKERNQU1VWF9DU1JfU09GMTQpKQ0KLSAgICAgICAgICAgICAgPyAxVUwNCi0gICAgICAgICAgICAgIDogMFVMKTsNCi19DQotI2VuZGlmIC8qIERNQU1VWF9DU1JfU09GMTQgKi8NCi0NCi0jaWYgZGVmaW5lZChETUFNVVhfQ1NSX1NPRjE1KQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCAxNS4NCi0gKiBAcm10b2xsIENTUiAgICAgICAgICBTT0YxMyAgICAgICAgIExMX0RNQU1VWF9Jc0FjdGl2ZUZsYWdfU08xNQ0KLSAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QNCi1MTF9ETUFNVVhfSXNBY3RpdmVGbGFnX1NPMTUoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCkgew0KLSAgVU5VU0VEKERNQU1VWHgpOw0KLSAgcmV0dXJuICgoUkVBRF9CSVQoRE1BTVVYMV9DaGFubmVsU3RhdHVzLT5DU1IsIERNQU1VWF9DU1JfU09GMTUpID09DQotICAgICAgICAgICAoRE1BTVVYX0NTUl9TT0YxNSkpDQotICAgICAgICAgICAgICA/IDFVTA0KLSAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0jZW5kaWYgLyogRE1BTVVYX0NTUl9TT0YxNSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IFJlcXVlc3QgR2VuZXJhdG9yIDAgVHJpZ2dlciBFdmVudCBPdmVycnVuIEZsYWcuDQotICogQHJtdG9sbCBSR1NSICAgICAgICAgT0YwICAgICAgICAgICBMTF9ETUFNVVhfSXNBY3RpdmVGbGFnX1JHTzANCi0gKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90DQotTExfRE1BTVVYX0lzQWN0aXZlRmxhZ19SR08wKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpIHsNCi0gIFVOVVNFRChETUFNVVh4KTsNCi0gIHJldHVybiAoKFJFQURfQklUKERNQU1VWDFfUmVxdWVzdEdlblN0YXR1cy0+UkdTUiwgRE1BTVVYX1JHU1JfT0YwKSA9PQ0KLSAgICAgICAgICAgKERNQU1VWF9SR1NSX09GMCkpDQotICAgICAgICAgICAgICA/IDFVTA0KLSAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBSZXF1ZXN0IEdlbmVyYXRvciAxIFRyaWdnZXIgRXZlbnQgT3ZlcnJ1biBGbGFnLg0KLSAqIEBybXRvbGwgUkdTUiAgICAgICAgIE9GMSAgICAgICAgICAgTExfRE1BTVVYX0lzQWN0aXZlRmxhZ19SR08xDQotICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdA0KLUxMX0RNQU1VWF9Jc0FjdGl2ZUZsYWdfUkdPMShETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4KSB7DQotICBVTlVTRUQoRE1BTVVYeCk7DQotICByZXR1cm4gKChSRUFEX0JJVChETUFNVVgxX1JlcXVlc3RHZW5TdGF0dXMtPlJHU1IsIERNQU1VWF9SR1NSX09GMSkgPT0NCi0gICAgICAgICAgIChETUFNVVhfUkdTUl9PRjEpKQ0KLSAgICAgICAgICAgICAgPyAxVUwNCi0gICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgUmVxdWVzdCBHZW5lcmF0b3IgMiBUcmlnZ2VyIEV2ZW50IE92ZXJydW4gRmxhZy4NCi0gKiBAcm10b2xsIFJHU1IgICAgICAgICBPRjIgICAgICAgICAgIExMX0RNQU1VWF9Jc0FjdGl2ZUZsYWdfUkdPMg0KLSAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QNCi1MTF9ETUFNVVhfSXNBY3RpdmVGbGFnX1JHTzIoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCkgew0KLSAgVU5VU0VEKERNQU1VWHgpOw0KLSAgcmV0dXJuICgoUkVBRF9CSVQoRE1BTVVYMV9SZXF1ZXN0R2VuU3RhdHVzLT5SR1NSLCBETUFNVVhfUkdTUl9PRjIpID09DQotICAgICAgICAgICAoRE1BTVVYX1JHU1JfT0YyKSkNCi0gICAgICAgICAgICAgID8gMVVMDQotICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IFJlcXVlc3QgR2VuZXJhdG9yIDMgVHJpZ2dlciBFdmVudCBPdmVycnVuIEZsYWcuDQotICogQHJtdG9sbCBSR1NSICAgICAgICAgT0YzICAgICAgICAgICBMTF9ETUFNVVhfSXNBY3RpdmVGbGFnX1JHTzMNCi0gKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90DQotTExfRE1BTVVYX0lzQWN0aXZlRmxhZ19SR08zKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpIHsNCi0gIFVOVVNFRChETUFNVVh4KTsNCi0gIHJldHVybiAoKFJFQURfQklUKERNQU1VWDFfUmVxdWVzdEdlblN0YXR1cy0+UkdTUiwgRE1BTVVYX1JHU1JfT0YzKSA9PQ0KLSAgICAgICAgICAgKERNQU1VWF9SR1NSX09GMykpDQotICAgICAgICAgICAgICA/IDFVTA0KLSAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENsZWFyIFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCAwLg0KLSAqIEBybXRvbGwgQ0ZSICAgICAgICAgIENTT0YwICAgICAgICAgTExfRE1BTVVYX0NsZWFyRmxhZ19TTzANCi0gKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BTVVYX0NsZWFyRmxhZ19TTzAoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCkgew0KLSAgVU5VU0VEKERNQU1VWHgpOw0KLSAgU0VUX0JJVChETUFNVVgxX0NoYW5uZWxTdGF0dXMtPkNGUiwgRE1BTVVYX0NGUl9DU09GMCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2xlYXIgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDEuDQotICogQHJtdG9sbCBDRlIgICAgICAgICAgQ1NPRjEgICAgICAgICBMTF9ETUFNVVhfQ2xlYXJGbGFnX1NPMQ0KLSAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFNVVhfQ2xlYXJGbGFnX1NPMShETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4KSB7DQotICBVTlVTRUQoRE1BTVVYeCk7DQotICBTRVRfQklUKERNQU1VWDFfQ2hhbm5lbFN0YXR1cy0+Q0ZSLCBETUFNVVhfQ0ZSX0NTT0YxKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDbGVhciBTeW5jaHJvbml6YXRpb24gRXZlbnQgT3ZlcnJ1biBGbGFnIENoYW5uZWwgMi4NCi0gKiBAcm10b2xsIENGUiAgICAgICAgICBDU09GMiAgICAgICAgIExMX0RNQU1VWF9DbGVhckZsYWdfU08yDQotICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9DbGVhckZsYWdfU08yKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpIHsNCi0gIFVOVVNFRChETUFNVVh4KTsNCi0gIFNFVF9CSVQoRE1BTVVYMV9DaGFubmVsU3RhdHVzLT5DRlIsIERNQU1VWF9DRlJfQ1NPRjIpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENsZWFyIFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCAzLg0KLSAqIEBybXRvbGwgQ0ZSICAgICAgICAgIENTT0YzICAgICAgICAgTExfRE1BTVVYX0NsZWFyRmxhZ19TTzMNCi0gKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BTVVYX0NsZWFyRmxhZ19TTzMoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCkgew0KLSAgVU5VU0VEKERNQU1VWHgpOw0KLSAgU0VUX0JJVChETUFNVVgxX0NoYW5uZWxTdGF0dXMtPkNGUiwgRE1BTVVYX0NGUl9DU09GMyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2xlYXIgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDQuDQotICogQHJtdG9sbCBDRlIgICAgICAgICAgQ1NPRjQgICAgICAgICBMTF9ETUFNVVhfQ2xlYXJGbGFnX1NPNA0KLSAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFNVVhfQ2xlYXJGbGFnX1NPNChETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4KSB7DQotICBVTlVTRUQoRE1BTVVYeCk7DQotICBTRVRfQklUKERNQU1VWDFfQ2hhbm5lbFN0YXR1cy0+Q0ZSLCBETUFNVVhfQ0ZSX0NTT0Y0KTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDbGVhciBTeW5jaHJvbml6YXRpb24gRXZlbnQgT3ZlcnJ1biBGbGFnIENoYW5uZWwgNS4NCi0gKiBAcm10b2xsIENGUiAgICAgICAgICBDU09GNSAgICAgICAgIExMX0RNQU1VWF9DbGVhckZsYWdfU081DQotICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9DbGVhckZsYWdfU081KERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpIHsNCi0gIFVOVVNFRChETUFNVVh4KTsNCi0gIFNFVF9CSVQoRE1BTVVYMV9DaGFubmVsU3RhdHVzLT5DRlIsIERNQU1VWF9DRlJfQ1NPRjUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENsZWFyIFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCA2Lg0KLSAqIEBybXRvbGwgQ0ZSICAgICAgICAgIENTT0Y2ICAgICAgICAgTExfRE1BTVVYX0NsZWFyRmxhZ19TTzYNCi0gKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BTVVYX0NsZWFyRmxhZ19TTzYoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCkgew0KLSAgVU5VU0VEKERNQU1VWHgpOw0KLSAgU0VUX0JJVChETUFNVVgxX0NoYW5uZWxTdGF0dXMtPkNGUiwgRE1BTVVYX0NGUl9DU09GNik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2xlYXIgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDcuDQotICogQHJtdG9sbCBDRlIgICAgICAgICAgQ1NPRjcgICAgICAgICBMTF9ETUFNVVhfQ2xlYXJGbGFnX1NPNw0KLSAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFNVVhfQ2xlYXJGbGFnX1NPNyhETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4KSB7DQotICBVTlVTRUQoRE1BTVVYeCk7DQotICBTRVRfQklUKERNQU1VWDFfQ2hhbm5lbFN0YXR1cy0+Q0ZSLCBETUFNVVhfQ0ZSX0NTT0Y3KTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDbGVhciBTeW5jaHJvbml6YXRpb24gRXZlbnQgT3ZlcnJ1biBGbGFnIENoYW5uZWwgOC4NCi0gKiBAcm10b2xsIENGUiAgICAgICAgICBDU09GOCAgICAgICAgIExMX0RNQU1VWF9DbGVhckZsYWdfU084DQotICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9DbGVhckZsYWdfU084KERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpIHsNCi0gIFVOVVNFRChETUFNVVh4KTsNCi0gIFNFVF9CSVQoRE1BTVVYMV9DaGFubmVsU3RhdHVzLT5DRlIsIERNQU1VWF9DRlJfQ1NPRjgpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENsZWFyIFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCA5Lg0KLSAqIEBybXRvbGwgQ0ZSICAgICAgICAgIENTT0Y5ICAgICAgICAgTExfRE1BTVVYX0NsZWFyRmxhZ19TTzkNCi0gKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BTVVYX0NsZWFyRmxhZ19TTzkoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCkgew0KLSAgVU5VU0VEKERNQU1VWHgpOw0KLSAgU0VUX0JJVChETUFNVVgxX0NoYW5uZWxTdGF0dXMtPkNGUiwgRE1BTVVYX0NGUl9DU09GOSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2xlYXIgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDEwLg0KLSAqIEBybXRvbGwgQ0ZSICAgICAgICAgIENTT0YxMCAgICAgICAgTExfRE1BTVVYX0NsZWFyRmxhZ19TTzEwDQotICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9DbGVhckZsYWdfU08xMChETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4KSB7DQotICBVTlVTRUQoRE1BTVVYeCk7DQotICBTRVRfQklUKERNQU1VWDFfQ2hhbm5lbFN0YXR1cy0+Q0ZSLCBETUFNVVhfQ0ZSX0NTT0YxMCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2xlYXIgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDExLg0KLSAqIEBybXRvbGwgQ0ZSICAgICAgICAgIENTT0YxMSAgICAgICAgTExfRE1BTVVYX0NsZWFyRmxhZ19TTzExDQotICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9DbGVhckZsYWdfU08xMShETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4KSB7DQotICBVTlVTRUQoRE1BTVVYeCk7DQotICBTRVRfQklUKERNQU1VWDFfQ2hhbm5lbFN0YXR1cy0+Q0ZSLCBETUFNVVhfQ0ZSX0NTT0YxMSk7DQotfQ0KLQ0KLSNpZiBkZWZpbmVkKERNQU1VWF9DRlJfQ1NPRjEyKQ0KLS8qKg0KLSAqIEBicmllZiAgQ2xlYXIgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDEyLg0KLSAqIEBybXRvbGwgQ0ZSICAgICAgICAgIENTT0YxMiAgICAgICAgTExfRE1BTVVYX0NsZWFyRmxhZ19TTzEyDQotICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9DbGVhckZsYWdfU08xMihETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4KSB7DQotICBVTlVTRUQoRE1BTVVYeCk7DQotICBTRVRfQklUKERNQU1VWDFfQ2hhbm5lbFN0YXR1cy0+Q0ZSLCBETUFNVVhfQ0ZSX0NTT0YxMik7DQotfQ0KLSNlbmRpZiAvKiBETUFNVVhfQ0ZSX0NTT0YxMiAqLw0KLQ0KLSNpZiBkZWZpbmVkKERNQU1VWF9DRlJfQ1NPRjEzKQ0KLS8qKg0KLSAqIEBicmllZiAgQ2xlYXIgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDEzLg0KLSAqIEBybXRvbGwgQ0ZSICAgICAgICAgIENTT0YxMyAgICAgICAgTExfRE1BTVVYX0NsZWFyRmxhZ19TTzEzDQotICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9DbGVhckZsYWdfU08xMyhETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4KSB7DQotICBVTlVTRUQoRE1BTVVYeCk7DQotICBTRVRfQklUKERNQU1VWDFfQ2hhbm5lbFN0YXR1cy0+Q0ZSLCBETUFNVVhfQ0ZSX0NTT0YxMyk7DQotfQ0KLSNlbmRpZiAvKiBETUFNVVhfQ0ZSX0NTT0YxMyAqLw0KLQ0KLSNpZiBkZWZpbmVkKERNQU1VWF9DRlJfQ1NPRjE0KQ0KLS8qKg0KLSAqIEBicmllZiAgQ2xlYXIgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDE0Lg0KLSAqIEBybXRvbGwgQ0ZSICAgICAgICAgIENTT0YxNCAgICAgICAgTExfRE1BTVVYX0NsZWFyRmxhZ19TTzE0DQotICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9DbGVhckZsYWdfU08xNChETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4KSB7DQotICBVTlVTRUQoRE1BTVVYeCk7DQotICBTRVRfQklUKERNQU1VWDFfQ2hhbm5lbFN0YXR1cy0+Q0ZSLCBETUFNVVhfQ0ZSX0NTT0YxNCk7DQotfQ0KLSNlbmRpZiAvKiBETUFNVVhfQ0ZSX0NTT0YxNCAqLw0KLQ0KLSNpZiBkZWZpbmVkKERNQU1VWF9DRlJfQ1NPRjE1KQ0KLS8qKg0KLSAqIEBicmllZiAgQ2xlYXIgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDE1Lg0KLSAqIEBybXRvbGwgQ0ZSICAgICAgICAgIENTT0YxNSAgICAgICAgTExfRE1BTVVYX0NsZWFyRmxhZ19TTzE1DQotICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9DbGVhckZsYWdfU08xNShETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4KSB7DQotICBVTlVTRUQoRE1BTVVYeCk7DQotICBTRVRfQklUKERNQU1VWDFfQ2hhbm5lbFN0YXR1cy0+Q0ZSLCBETUFNVVhfQ0ZSX0NTT0YxNSk7DQotfQ0KLSNlbmRpZiAvKiBETUFNVVhfQ0ZSX0NTT0YxNSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2xlYXIgUmVxdWVzdCBHZW5lcmF0b3IgMCBUcmlnZ2VyIEV2ZW50IE92ZXJydW4gRmxhZy4NCi0gKiBAcm10b2xsIFJHQ0ZSICAgICAgICBDT0YwICAgICAgICAgIExMX0RNQU1VWF9DbGVhckZsYWdfUkdPMA0KLSAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFNVVhfQ2xlYXJGbGFnX1JHTzAoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCkgew0KLSAgVU5VU0VEKERNQU1VWHgpOw0KLSAgU0VUX0JJVChETUFNVVgxX1JlcXVlc3RHZW5TdGF0dXMtPlJHQ0ZSLCBETUFNVVhfUkdDRlJfQ09GMCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2xlYXIgUmVxdWVzdCBHZW5lcmF0b3IgMSBUcmlnZ2VyIEV2ZW50IE92ZXJydW4gRmxhZy4NCi0gKiBAcm10b2xsIFJHQ0ZSICAgICAgICBDT0YxICAgICAgICAgIExMX0RNQU1VWF9DbGVhckZsYWdfUkdPMQ0KLSAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFNVVhfQ2xlYXJGbGFnX1JHTzEoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCkgew0KLSAgVU5VU0VEKERNQU1VWHgpOw0KLSAgU0VUX0JJVChETUFNVVgxX1JlcXVlc3RHZW5TdGF0dXMtPlJHQ0ZSLCBETUFNVVhfUkdDRlJfQ09GMSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2xlYXIgUmVxdWVzdCBHZW5lcmF0b3IgMiBUcmlnZ2VyIEV2ZW50IE92ZXJydW4gRmxhZy4NCi0gKiBAcm10b2xsIFJHQ0ZSICAgICAgICBDT0YyICAgICAgICAgIExMX0RNQU1VWF9DbGVhckZsYWdfUkdPMg0KLSAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFNVVhfQ2xlYXJGbGFnX1JHTzIoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCkgew0KLSAgVU5VU0VEKERNQU1VWHgpOw0KLSAgU0VUX0JJVChETUFNVVgxX1JlcXVlc3RHZW5TdGF0dXMtPlJHQ0ZSLCBETUFNVVhfUkdDRlJfQ09GMik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2xlYXIgUmVxdWVzdCBHZW5lcmF0b3IgMyBUcmlnZ2VyIEV2ZW50IE92ZXJydW4gRmxhZy4NCi0gKiBAcm10b2xsIFJHQ0ZSICAgICAgICBDT0YzICAgICAgICAgIExMX0RNQU1VWF9DbGVhckZsYWdfUkdPMw0KLSAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFNVVhfQ2xlYXJGbGFnX1JHTzMoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCkgew0KLSAgVU5VU0VEKERNQU1VWHgpOw0KLSAgU0VUX0JJVChETUFNVVgxX1JlcXVlc3RHZW5TdGF0dXMtPlJHQ0ZSLCBETUFNVVhfUkdDRlJfQ09GMyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBETUFNVVhfTExfRUZfSVRfTWFuYWdlbWVudCBJVF9NYW5hZ2VtZW50DQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSB0aGUgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gSW50ZXJydXB0IG9uIERNQU1VWCBjaGFubmVsDQotICogeC4NCi0gKiBAcm10b2xsIEN4Q1IgICAgICAgICBTT0lFICAgICAgICAgIExMX0RNQU1VWF9FbmFibGVJVF9TTw0KLSAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlDQotICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF81DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF84DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEwDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEzDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xNQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9FbmFibGVJVF9TTyhETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKSB7DQotICAodm9pZCkoRE1BTVVYeCk7DQotICBTRVRfQklUKChETUFNVVgxX0NoYW5uZWwwICsgQ2hhbm5lbCktPkNDUiwgRE1BTVVYX0N4Q1JfU09JRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSB0aGUgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gSW50ZXJydXB0IG9uIERNQU1VWCBjaGFubmVsDQotICogeC4NCi0gKiBAcm10b2xsIEN4Q1IgICAgICAgICBTT0lFICAgICAgICAgIExMX0RNQU1VWF9EaXNhYmxlSVRfU08NCi0gKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQ0KLSAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF80DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF83DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzExDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzE0DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFNVVhfRGlzYWJsZUlUX1NPKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKSB7DQotICAodm9pZCkoRE1BTVVYeCk7DQotICBDTEVBUl9CSVQoKERNQU1VWDFfQ2hhbm5lbDAgKyBDaGFubmVsKS0+Q0NSLCBETUFNVVhfQ3hDUl9TT0lFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiB0aGUgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gSW50ZXJydXB0IG9uIERNQU1VWA0KLSAqIGNoYW5uZWwgeCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLg0KLSAqIEBybXRvbGwgQ3hDUiAgICAgICAgIFNPSUUgICAgICAgICAgTExfRE1BTVVYX0lzRW5hYmxlZElUX1NPDQotICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UNCi0gKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8wDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8zDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF82DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF85DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEyDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzE1DQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90DQotTExfRE1BTVVYX0lzRW5hYmxlZElUX1NPKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgsIHVpbnQzMl90IENoYW5uZWwpIHsNCi0gICh2b2lkKShETUFNVVh4KTsNCi0gIHJldHVybiAoKChSRUFEX0JJVCgoRE1BTVVYMV9DaGFubmVsMCArIENoYW5uZWwpLT5DQ1IsIERNQU1VWF9DeENSX1NPSUUpKSA9PQ0KLSAgICAgICAgICAgKERNQU1VWF9DeENSX1NPSUUpKQ0KLSAgICAgICAgICAgICAgPyAxVUwNCi0gICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgdGhlIFJlcXVlc3QgR2VuZXJhdGlvbiBUcmlnZ2VyIEV2ZW50IE92ZXJydW4gSW50ZXJydXB0IG9uDQotICogRE1BTVVYIGNoYW5uZWwgeC4NCi0gKiBAcm10b2xsIFJHeENSICAgICAgICBPSUUgICAgICAgICAgIExMX0RNQU1VWF9FbmFibGVJVF9SR08NCi0gKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQ0KLSAqIEBwYXJhbSAgUmVxdWVzdEdlbkNoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8wDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8zDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BTVVYX0VuYWJsZUlUX1JHTyhETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUmVxdWVzdEdlbkNoYW5uZWwpIHsNCi0gIFVOVVNFRChETUFNVVh4KTsNCi0gIFNFVF9CSVQoKChETUFNVVhfUmVxdWVzdEdlbl9UeXBlRGVmICopKCgNCi0gICAgICAgICAgICAgICB1aW50MzJfdCkoKHVpbnQzMl90KURNQU1VWDFfUmVxdWVzdEdlbmVyYXRvcjAgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAoRE1BTVVYX1JHQ1JfU0laRSAqIChSZXF1ZXN0R2VuQ2hhbm5lbCkpKSkpDQotICAgICAgICAgICAgICAtPlJHQ1IsDQotICAgICAgICAgIERNQU1VWF9SR3hDUl9PSUUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgdGhlIFJlcXVlc3QgR2VuZXJhdGlvbiBUcmlnZ2VyIEV2ZW50IE92ZXJydW4gSW50ZXJydXB0IG9uDQotICogRE1BTVVYIGNoYW5uZWwgeC4NCi0gKiBAcm10b2xsIFJHeENSICAgICAgICBPSUUgICAgICAgICAgIExMX0RNQU1VWF9EaXNhYmxlSVRfUkdPDQotICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UNCi0gKiBAcGFyYW0gIFJlcXVlc3RHZW5DaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMw0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9EaXNhYmxlSVRfUkdPKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUmVxdWVzdEdlbkNoYW5uZWwpIHsNCi0gIFVOVVNFRChETUFNVVh4KTsNCi0gIENMRUFSX0JJVCgoKERNQU1VWF9SZXF1ZXN0R2VuX1R5cGVEZWYgKikoKA0KLSAgICAgICAgICAgICAgICAgdWludDMyX3QpKCh1aW50MzJfdClETUFNVVgxX1JlcXVlc3RHZW5lcmF0b3IwICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoRE1BTVVYX1JHQ1JfU0laRSAqIChSZXF1ZXN0R2VuQ2hhbm5lbCkpKSkpDQotICAgICAgICAgICAgICAgIC0+UkdDUiwNCi0gICAgICAgICAgICBETUFNVVhfUkd4Q1JfT0lFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiB0aGUgUmVxdWVzdCBHZW5lcmF0aW9uIFRyaWdnZXIgRXZlbnQgT3ZlcnJ1biBJbnRlcnJ1cHQgb24NCi0gKiBETUFNVVggY2hhbm5lbCB4IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuDQotICogQHJtdG9sbCBSR3hDUiAgICAgICAgT0lFICAgICAgICAgICBMTF9ETUFNVVhfSXNFbmFibGVkSVRfUkdPDQotICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UNCi0gKiBAcGFyYW0gIFJlcXVlc3RHZW5DaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMw0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFNVVhfSXNFbmFibGVkSVRfUkdPKA0KLSAgICBETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4LCB1aW50MzJfdCBSZXF1ZXN0R2VuQ2hhbm5lbCkgew0KLSAgVU5VU0VEKERNQU1VWHgpOw0KLSAgcmV0dXJuICgoUkVBRF9CSVQoKChETUFNVVhfUmVxdWVzdEdlbl9UeXBlRGVmICopKCgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QpKCh1aW50MzJfdClETUFNVVgxX1JlcXVlc3RHZW5lcmF0b3IwICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChETUFNVVhfUkdDUl9TSVpFICogKFJlcXVlc3RHZW5DaGFubmVsKSkpKSkNCi0gICAgICAgICAgICAgICAgICAgICAgICAtPlJHQ1IsDQotICAgICAgICAgICAgICAgICAgICBETUFNVVhfUkd4Q1JfT0lFKSA9PSAoRE1BTVVYX1JHeENSX09JRSkpDQotICAgICAgICAgICAgICA/IDFVTA0KLSAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0jZW5kaWYgLyogRE1BTVVYMSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotI2lmZGVmIF9fY3BsdXNwbHVzDQotfQ0KLSNlbmRpZg0KLQ0KLSNlbmRpZiAvKiBfX1NUTTMyRzR4eF9MTF9ETUFNVVhfSCAqLw0KKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGZpbGUgICAgc3RtMzJnNHh4X2xsX2RtYW11eC5oCisgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgRE1BTVVYIExMIG1vZHVsZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBhdHRlbnRpb24KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRlcm1zIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUKKyAqIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4KKyAqIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcyB3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBfX1NUTTMyRzR4eF9MTF9ETUFNVVhfSAorI2RlZmluZSBfX1NUTTMyRzR4eF9MTF9ETUFNVVhfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnNHh4LmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkc0eHhfTExfRHJpdmVyCisgKiBAeworICovCisKKyNpZiBkZWZpbmVkKERNQU1VWDEpCisKKy8qKiBAZGVmZ3JvdXAgRE1BTVVYX0xMIERNQU1VWAorICogQHsKKyAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIERNQU1VWF9MTF9Qcml2YXRlX0NvbnN0YW50cyBETUFNVVggUHJpdmF0ZSBDb25zdGFudHMKKyAqIEB7CisgKi8KKy8qIERlZmluZSB1c2VkIHRvIGdldCBETUFNVVggQ0NSIHJlZ2lzdGVyIHNpemUgKi8KKyNkZWZpbmUgRE1BTVVYX0NDUl9TSVpFIDB4MDAwMDAwMDRVCisKKy8qIERlZmluZSB1c2VkIHRvIGdldCBETUFNVVggUkdDUiByZWdpc3RlciBzaXplICovCisjZGVmaW5lIERNQU1VWF9SR0NSX1NJWkUgMHgwMDAwMDAwNFUKKy8qKgorICogQH0KKyAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBETUFNVVhfTExfUHJpdmF0ZV9NYWNyb3MgRE1BTVVYIFByaXZhdGUgTWFjcm9zCisgKiBAeworICovCisjZGVmaW5lIFVOVVNFRChYKSAodm9pZClYCisvKioKKyAqIEB9CisgKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIERNQU1VWF9MTF9FeHBvcnRlZF9Db25zdGFudHMgRE1BTVVYIEV4cG9ydGVkIENvbnN0YW50cworICogQHsKKyAqLworLyoqIEBkZWZncm91cCBETUFNVVhfTExfRUNfQ0xFQVJfRkxBRyBDbGVhciBGbGFncyBEZWZpbmVzCisgKiBAYnJpZWYgICAgRmxhZ3MgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX0RNQU1VWF9Xcml0ZVJlZyBmdW5jdGlvbgorICogQHsKKyAqLworI2RlZmluZSBMTF9ETUFNVVhfQ0ZSX0NTT0YwIFwKKyAgRE1BTVVYX0NGUl9DU09GMCAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCAwICAqLworI2RlZmluZSBMTF9ETUFNVVhfQ0ZSX0NTT0YxIFwKKyAgRE1BTVVYX0NGUl9DU09GMSAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCAxICAqLworI2RlZmluZSBMTF9ETUFNVVhfQ0ZSX0NTT0YyIFwKKyAgRE1BTVVYX0NGUl9DU09GMiAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCAyICAqLworI2RlZmluZSBMTF9ETUFNVVhfQ0ZSX0NTT0YzIFwKKyAgRE1BTVVYX0NGUl9DU09GMyAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCAzICAqLworI2RlZmluZSBMTF9ETUFNVVhfQ0ZSX0NTT0Y0IFwKKyAgRE1BTVVYX0NGUl9DU09GNCAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCA0ICAqLworI2RlZmluZSBMTF9ETUFNVVhfQ0ZSX0NTT0Y1IFwKKyAgRE1BTVVYX0NGUl9DU09GNSAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCA1ICAqLworI2RlZmluZSBMTF9ETUFNVVhfQ0ZSX0NTT0Y2IFwKKyAgRE1BTVVYX0NGUl9DU09GNiAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCA2ICAqLworI2RlZmluZSBMTF9ETUFNVVhfQ0ZSX0NTT0Y3IFwKKyAgRE1BTVVYX0NGUl9DU09GNyAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCA3ICAqLworI2RlZmluZSBMTF9ETUFNVVhfQ0ZSX0NTT0Y4IFwKKyAgRE1BTVVYX0NGUl9DU09GOCAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCA4ICAqLworI2RlZmluZSBMTF9ETUFNVVhfQ0ZSX0NTT0Y5IFwKKyAgRE1BTVVYX0NGUl9DU09GOSAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCA5ICAqLworI2RlZmluZSBMTF9ETUFNVVhfQ0ZSX0NTT0YxMCBcCisgIERNQU1VWF9DRlJfQ1NPRjEwIC8qITwgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDEwICovCisjZGVmaW5lIExMX0RNQU1VWF9DRlJfQ1NPRjExIFwKKyAgRE1BTVVYX0NGUl9DU09GMTEgLyohPCBTeW5jaHJvbml6YXRpb24gRXZlbnQgT3ZlcnJ1biBGbGFnIENoYW5uZWwgMTEgKi8KKyNkZWZpbmUgTExfRE1BTVVYX0NGUl9DU09GMTIgXAorICBETUFNVVhfQ0ZSX0NTT0YxMiAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCAxMiAqLworI2RlZmluZSBMTF9ETUFNVVhfQ0ZSX0NTT0YxMyBcCisgIERNQU1VWF9DRlJfQ1NPRjEzIC8qITwgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDEzICovCisjZGVmaW5lIExMX0RNQU1VWF9DRlJfQ1NPRjE0IFwKKyAgRE1BTVVYX0NGUl9DU09GMTQgLyohPCBTeW5jaHJvbml6YXRpb24gRXZlbnQgT3ZlcnJ1biBGbGFnIENoYW5uZWwgMTQgKi8KKyNkZWZpbmUgTExfRE1BTVVYX0NGUl9DU09GMTUgXAorICBETUFNVVhfQ0ZSX0NTT0YxNSAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCAxNSAqLworI2RlZmluZSBMTF9ETUFNVVhfUkdDRlJfUkdDT0YwIFwKKyAgRE1BTVVYX1JHQ0ZSX0NPRjAgLyohPCBSZXF1ZXN0IEdlbmVyYXRvciAwIFRyaWdnZXIgRXZlbnQgT3ZlcnJ1biBGbGFnICovCisjZGVmaW5lIExMX0RNQU1VWF9SR0NGUl9SR0NPRjEgXAorICBETUFNVVhfUkdDRlJfQ09GMSAvKiE8IFJlcXVlc3QgR2VuZXJhdG9yIDEgVHJpZ2dlciBFdmVudCBPdmVycnVuIEZsYWcgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JHQ0ZSX1JHQ09GMiBcCisgIERNQU1VWF9SR0NGUl9DT0YyIC8qITwgUmVxdWVzdCBHZW5lcmF0b3IgMiBUcmlnZ2VyIEV2ZW50IE92ZXJydW4gRmxhZyAqLworI2RlZmluZSBMTF9ETUFNVVhfUkdDRlJfUkdDT0YzIFwKKyAgRE1BTVVYX1JHQ0ZSX0NPRjMgLyohPCBSZXF1ZXN0IEdlbmVyYXRvciAzIFRyaWdnZXIgRXZlbnQgT3ZlcnJ1biBGbGFnICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBETUFNVVhfTExfRUNfR0VUX0ZMQUcgR2V0IEZsYWdzIERlZmluZXMKKyAqIEBicmllZiAgICBGbGFncyBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfRE1BTVVYX1JlYWRSZWcgZnVuY3Rpb24KKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfRE1BTVVYX0NTUl9TT0YwIFwKKyAgRE1BTVVYX0NTUl9TT0YwIC8qITwgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDAgICovCisjZGVmaW5lIExMX0RNQU1VWF9DU1JfU09GMSBcCisgIERNQU1VWF9DU1JfU09GMSAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCAxICAqLworI2RlZmluZSBMTF9ETUFNVVhfQ1NSX1NPRjIgXAorICBETUFNVVhfQ1NSX1NPRjIgLyohPCBTeW5jaHJvbml6YXRpb24gRXZlbnQgT3ZlcnJ1biBGbGFnIENoYW5uZWwgMiAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX0NTUl9TT0YzIFwKKyAgRE1BTVVYX0NTUl9TT0YzIC8qITwgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDMgICovCisjZGVmaW5lIExMX0RNQU1VWF9DU1JfU09GNCBcCisgIERNQU1VWF9DU1JfU09GNCAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCA0ICAqLworI2RlZmluZSBMTF9ETUFNVVhfQ1NSX1NPRjUgXAorICBETUFNVVhfQ1NSX1NPRjUgLyohPCBTeW5jaHJvbml6YXRpb24gRXZlbnQgT3ZlcnJ1biBGbGFnIENoYW5uZWwgNSAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX0NTUl9TT0Y2IFwKKyAgRE1BTVVYX0NTUl9TT0Y2IC8qITwgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDYgICovCisjZGVmaW5lIExMX0RNQU1VWF9DU1JfU09GNyBcCisgIERNQU1VWF9DU1JfU09GNyAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCA3ICAqLworI2RlZmluZSBMTF9ETUFNVVhfQ1NSX1NPRjggXAorICBETUFNVVhfQ1NSX1NPRjggLyohPCBTeW5jaHJvbml6YXRpb24gRXZlbnQgT3ZlcnJ1biBGbGFnIENoYW5uZWwgOCAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX0NTUl9TT0Y5IFwKKyAgRE1BTVVYX0NTUl9TT0Y5IC8qITwgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDkgICovCisjZGVmaW5lIExMX0RNQU1VWF9DU1JfU09GMTAgXAorICBETUFNVVhfQ1NSX1NPRjEwIC8qITwgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDEwICovCisjZGVmaW5lIExMX0RNQU1VWF9DU1JfU09GMTEgXAorICBETUFNVVhfQ1NSX1NPRjExIC8qITwgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDExICovCisjZGVmaW5lIExMX0RNQU1VWF9DU1JfU09GMTIgXAorICBETUFNVVhfQ1NSX1NPRjEyIC8qITwgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDEyICovCisjZGVmaW5lIExMX0RNQU1VWF9DU1JfU09GMTMgXAorICBETUFNVVhfQ1NSX1NPRjEzIC8qITwgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDEzICovCisjZGVmaW5lIExMX0RNQU1VWF9DU1JfU09GMTQgXAorICBETUFNVVhfQ1NSX1NPRjE0IC8qITwgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDE0ICovCisjZGVmaW5lIExMX0RNQU1VWF9DU1JfU09GMTUgXAorICBETUFNVVhfQ1NSX1NPRjE1IC8qITwgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDE1ICovCisjZGVmaW5lIExMX0RNQU1VWF9SR1NSX1JHT0YwIFwKKyAgRE1BTVVYX1JHU1JfT0YwIC8qITwgUmVxdWVzdCBHZW5lcmF0b3IgMCBUcmlnZ2VyIEV2ZW50IE92ZXJydW4gRmxhZyAqLworI2RlZmluZSBMTF9ETUFNVVhfUkdTUl9SR09GMSBcCisgIERNQU1VWF9SR1NSX09GMSAvKiE8IFJlcXVlc3QgR2VuZXJhdG9yIDEgVHJpZ2dlciBFdmVudCBPdmVycnVuIEZsYWcgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JHU1JfUkdPRjIgXAorICBETUFNVVhfUkdTUl9PRjIgLyohPCBSZXF1ZXN0IEdlbmVyYXRvciAyIFRyaWdnZXIgRXZlbnQgT3ZlcnJ1biBGbGFnICovCisjZGVmaW5lIExMX0RNQU1VWF9SR1NSX1JHT0YzIFwKKyAgRE1BTVVYX1JHU1JfT0YzIC8qITwgUmVxdWVzdCBHZW5lcmF0b3IgMyBUcmlnZ2VyIEV2ZW50IE92ZXJydW4gRmxhZyAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BTVVYX0xMX0VDX0lUIElUIERlZmluZXMKKyAqIEBicmllZiAgICBJVCBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfRE1BX1JlYWRSZWcgYW5kCisgKiBMTF9ETUFNVVhfV3JpdGVSZWcgZnVuY3Rpb25zCisgKiBAeworICovCisjZGVmaW5lIExMX0RNQU1VWF9DQ1JfU09JRSBcCisgIERNQU1VWF9DeENSX1NPSUUgLyohPCBTeW5jaHJvbml6YXRpb24gRXZlbnQgT3ZlcnJ1biBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JHQ1JfUkdPSUUgXAorICBETUFNVVhfUkd4Q1JfT0lFIC8qITwgUmVxdWVzdCBHZW5lcmF0aW9uIFRyaWdnZXIgRXZlbnQgT3ZlcnJ1biBJbnRlcnJ1cHQgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIERNQU1VWF9MTF9FQ19SRVFVRVNUIFRyYW5zZmVyIHJlcXVlc3QKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9NRU0yTUVNIDB4MDAwMDAwMDBVIC8qITwgTWVtb3J5IHRvIG1lbW9yeSB0cmFuc2ZlciAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9HRU5FUkFUT1IwICAgICAgICAgICAgICBcCisgIDB4MDAwMDAwMDFVIC8qITwgRE1BTVVYIHJlcXVlc3QgZ2VuZXJhdG9yIDAgXAorICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9HRU5FUkFUT1IxICAgICAgICAgICAgICBcCisgIDB4MDAwMDAwMDJVIC8qITwgRE1BTVVYIHJlcXVlc3QgZ2VuZXJhdG9yIDEgXAorICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9HRU5FUkFUT1IyICAgICAgICAgICAgICBcCisgIDB4MDAwMDAwMDNVIC8qITwgRE1BTVVYIHJlcXVlc3QgZ2VuZXJhdG9yIDIgXAorICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9HRU5FUkFUT1IzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAweDAwMDAwMDA0VSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBETUFNVVggcmVxdWVzdCBnZW5lcmF0b3IgMyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9BREMxIDB4MDAwMDAwMDVVICAgICAgIC8qITwgRE1BTVVYIEFEQzEgcmVxdWVzdCAgICAgICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9EQUMxX0NIMSAweDAwMDAwMDA2VSAgIC8qITwgRE1BTVVYIERBQzEgQ0gxIHJlcXVlc3QgICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9EQUMxX0NIMiAweDAwMDAwMDA3VSAgIC8qITwgRE1BTVVYIERBQzEgQ0gyIHJlcXVlc3QgICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9USU02X1VQIDB4MDAwMDAwMDhVICAgIC8qITwgRE1BTVVYIFRJTTYgVVAgcmVxdWVzdCAgICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9USU03X1VQIDB4MDAwMDAwMDlVICAgIC8qITwgRE1BTVVYIFRJTTcgVVAgcmVxdWVzdCAgICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9TUEkxX1JYIDB4MDAwMDAwMEFVICAgIC8qITwgRE1BTVVYIFNQSTEgUlggcmVxdWVzdCAgICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9TUEkxX1RYIDB4MDAwMDAwMEJVICAgIC8qITwgRE1BTVVYIFNQSTEgVFggcmVxdWVzdCAgICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9TUEkyX1JYIDB4MDAwMDAwMENVICAgIC8qITwgRE1BTVVYIFNQSTIgUlggcmVxdWVzdCAgICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9TUEkyX1RYIDB4MDAwMDAwMERVICAgIC8qITwgRE1BTVVYIFNQSTIgVFggcmVxdWVzdCAgICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9TUEkzX1JYIDB4MDAwMDAwMEVVICAgIC8qITwgRE1BTVVYIFNQSTMgUlggcmVxdWVzdCAgICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9TUEkzX1RYIDB4MDAwMDAwMEZVICAgIC8qITwgRE1BTVVYIFNQSTMgVFggcmVxdWVzdCAgICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9JMkMxX1JYIDB4MDAwMDAwMTBVICAgIC8qITwgRE1BTVVYIEkyQzEgUlggcmVxdWVzdCAgICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9JMkMxX1RYIDB4MDAwMDAwMTFVICAgIC8qITwgRE1BTVVYIEkyQzEgVFggcmVxdWVzdCAgICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9JMkMyX1JYIDB4MDAwMDAwMTJVICAgIC8qITwgRE1BTVVYIEkyQzIgUlggcmVxdWVzdCAgICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9JMkMyX1RYIDB4MDAwMDAwMTNVICAgIC8qITwgRE1BTVVYIEkyQzIgVFggcmVxdWVzdCAgICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9JMkMzX1JYIDB4MDAwMDAwMTRVICAgIC8qITwgRE1BTVVYIEkyQzMgUlggcmVxdWVzdCAgICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9JMkMzX1RYIDB4MDAwMDAwMTVVICAgIC8qITwgRE1BTVVYIEkyQzMgVFggcmVxdWVzdCAgICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9JMkM0X1JYIDB4MDAwMDAwMTZVICAgIC8qITwgRE1BTVVYIEkyQzQgUlggcmVxdWVzdCAgICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9JMkM0X1RYIDB4MDAwMDAwMTdVICAgIC8qITwgRE1BTVVYIEkyQzQgVFggcmVxdWVzdCAgICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9VU0FSVDFfUlggMHgwMDAwMDAxOFUgIC8qITwgRE1BTVVYIFVTQVJUMSBSWCByZXF1ZXN0ICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9VU0FSVDFfVFggMHgwMDAwMDAxOVUgIC8qITwgRE1BTVVYIFVTQVJUMSBUWCByZXF1ZXN0ICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9VU0FSVDJfUlggMHgwMDAwMDAxQVUgIC8qITwgRE1BTVVYIFVTQVJUMiBSWCByZXF1ZXN0ICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9VU0FSVDJfVFggMHgwMDAwMDAxQlUgIC8qITwgRE1BTVVYIFVTQVJUMiBUWCByZXF1ZXN0ICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9VU0FSVDNfUlggMHgwMDAwMDAxQ1UgIC8qITwgRE1BTVVYIFVTQVJUMyBSWCByZXF1ZXN0ICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9VU0FSVDNfVFggMHgwMDAwMDAxRFUgIC8qITwgRE1BTVVYIFVTQVJUMyBUWCByZXF1ZXN0ICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9VQVJUNF9SWCAweDAwMDAwMDFFVSAgIC8qITwgRE1BTVVYIFVBUlQ0IFJYIHJlcXVlc3QgICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9VQVJUNF9UWCAweDAwMDAwMDFGVSAgIC8qITwgRE1BTVVYIFVBUlQ0IFRYIHJlcXVlc3QgICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9VQVJUNV9SWCAweDAwMDAwMDIwVSAgIC8qITwgRE1BTVVYIFVBUlQ1IFJYIHJlcXVlc3QgICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9VQVJUNV9UWCAweDAwMDAwMDIxVSAgIC8qITwgRE1BTVVYIFVBUlQ1IFRYIHJlcXVlc3QgICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9MUFVBUlQxX1JYIDB4MDAwMDAwMjJVIC8qITwgRE1BTVVYIExQVUFSVDEgUlggcmVxdWVzdCAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX0xQVUFSVDFfVFggMHgwMDAwMDAyM1UgLyohPCBETUFNVVggTFBVQVJUMSBUWCByZXF1ZXN0ICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfQURDMiAweDAwMDAwMDI0VSAgICAgICAvKiE8IERNQU1VWCBBREMyIHJlcXVlc3QgICAgICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfQURDMyAweDAwMDAwMDI1VSAgICAgICAvKiE8IERNQU1VWCBBREMzIHJlcXVlc3QgICAgICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfQURDNCAweDAwMDAwMDI2VSAgICAgICAvKiE8IERNQU1VWCBBREM0IHJlcXVlc3QgICAgICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfQURDNSAweDAwMDAwMDI3VSAgICAgICAvKiE8IERNQU1VWCBBREM1IHJlcXVlc3QgICAgICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfUVNQSSAweDAwMDAwMDI4VSAgICAgICAvKiE8IERNQU1VWCBRU1BJIHJlcXVlc3QgICAgICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfREFDMl9DSDEgMHgwMDAwMDAyOVUgICAvKiE8IERNQU1VWCBEQUMyIENIMSByZXF1ZXN0ICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNMV9DSDEgMHgwMDAwMDAyQVUgICAvKiE8IERNQU1VWCBUSU0xIENIMSByZXF1ZXN0ICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNMV9DSDIgMHgwMDAwMDAyQlUgICAvKiE8IERNQU1VWCBUSU0xIENIMiByZXF1ZXN0ICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNMV9DSDMgMHgwMDAwMDAyQ1UgICAvKiE8IERNQU1VWCBUSU0xIENIMyByZXF1ZXN0ICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNMV9DSDQgMHgwMDAwMDAyRFUgICAvKiE8IERNQU1VWCBUSU0xIENINCByZXF1ZXN0ICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNMV9VUCAweDAwMDAwMDJFVSAgICAvKiE8IERNQU1VWCBUSU0xIFVQIHJlcXVlc3QgICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNMV9UUklHIDB4MDAwMDAwMkZVICAvKiE8IERNQU1VWCBUSU0xIFRSSUcgcmVxdWVzdCAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNMV9DT00gMHgwMDAwMDAzMFUgICAvKiE8IERNQU1VWCBUSU0xIENPTSByZXF1ZXN0ICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNOF9DSDEgMHgwMDAwMDAzMVUgICAvKiE8IERNQU1VWCBUSU04IENIMSByZXF1ZXN0ICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNOF9DSDIgMHgwMDAwMDAzMlUgICAvKiE8IERNQU1VWCBUSU04IENIMiByZXF1ZXN0ICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNOF9DSDMgMHgwMDAwMDAzM1UgICAvKiE8IERNQU1VWCBUSU04IENIMyByZXF1ZXN0ICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNOF9DSDQgMHgwMDAwMDAzNFUgICAvKiE8IERNQU1VWCBUSU04IENINCByZXF1ZXN0ICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNOF9VUCAweDAwMDAwMDM1VSAgICAvKiE8IERNQU1VWCBUSU04IFVQIHJlcXVlc3QgICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNOF9UUklHIDB4MDAwMDAwMzZVICAvKiE8IERNQU1VWCBUSU04IFRSSUcgcmVxdWVzdCAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNOF9DT00gMHgwMDAwMDAzN1UgICAvKiE8IERNQU1VWCBUSU04IENPTSByZXF1ZXN0ICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNMl9DSDEgMHgwMDAwMDAzOFUgICAvKiE8IERNQU1VWCBUSU0yIENIMSByZXF1ZXN0ICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNMl9DSDIgMHgwMDAwMDAzOVUgICAvKiE8IERNQU1VWCBUSU0yIENIMiByZXF1ZXN0ICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNMl9DSDMgMHgwMDAwMDAzQVUgICAvKiE8IERNQU1VWCBUSU0yIENIMyByZXF1ZXN0ICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNMl9DSDQgMHgwMDAwMDAzQlUgICAvKiE8IERNQU1VWCBUSU0yIENINCByZXF1ZXN0ICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNMl9VUCAweDAwMDAwMDNDVSAgICAvKiE8IERNQU1VWCBUSU0yIFVQIHJlcXVlc3QgICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNM19DSDEgMHgwMDAwMDAzRFUgICAvKiE8IERNQU1VWCBUSU0zIENIMSByZXF1ZXN0ICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNM19DSDIgMHgwMDAwMDAzRVUgICAvKiE8IERNQU1VWCBUSU0zIENIMiByZXF1ZXN0ICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNM19DSDMgMHgwMDAwMDAzRlUgICAvKiE8IERNQU1VWCBUSU0zIENIMyByZXF1ZXN0ICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNM19DSDQgMHgwMDAwMDA0MFUgICAvKiE8IERNQU1VWCBUSU0zIENINCByZXF1ZXN0ICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNM19VUCAweDAwMDAwMDQxVSAgICAvKiE8IERNQU1VWCBUSU0zIFVQIHJlcXVlc3QgICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNM19UUklHIDB4MDAwMDAwNDJVICAvKiE8IERNQU1VWCBUSU0zIFRSSUcgcmVxdWVzdCAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNNF9DSDEgMHgwMDAwMDA0M1UgICAvKiE8IERNQU1VWCBUSU00IENIMSByZXF1ZXN0ICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNNF9DSDIgMHgwMDAwMDA0NFUgICAvKiE8IERNQU1VWCBUSU00IENIMiByZXF1ZXN0ICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNNF9DSDMgMHgwMDAwMDA0NVUgICAvKiE8IERNQU1VWCBUSU00IENIMyByZXF1ZXN0ICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNNF9DSDQgMHgwMDAwMDA0NlUgICAvKiE8IERNQU1VWCBUSU00IENINCByZXF1ZXN0ICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNNF9VUCAweDAwMDAwMDQ3VSAgICAvKiE8IERNQU1VWCBUSU00IFVQIHJlcXVlc3QgICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNNV9DSDEgMHgwMDAwMDA0OFUgICAvKiE8IERNQU1VWCBUSU01IENIMSByZXF1ZXN0ICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNNV9DSDIgMHgwMDAwMDA0OVUgICAvKiE8IERNQU1VWCBUSU01IENIMiByZXF1ZXN0ICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNNV9DSDMgMHgwMDAwMDA0QVUgICAvKiE8IERNQU1VWCBUSU01IENIMyByZXF1ZXN0ICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNNV9DSDQgMHgwMDAwMDA0QlUgICAvKiE8IERNQU1VWCBUSU01IENINCByZXF1ZXN0ICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNNV9VUCAweDAwMDAwMDRDVSAgICAvKiE8IERNQU1VWCBUSU01IFVQIHJlcXVlc3QgICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNNV9UUklHIDB4MDAwMDAwNERVICAvKiE8IERNQU1VWCBUSU01IFRSSUcgcmVxdWVzdCAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNMTVfQ0gxIDB4MDAwMDAwNEVVICAvKiE8IERNQU1VWCBUSU0xNSBDSDEgcmVxdWVzdCAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNMTVfVVAgMHgwMDAwMDA0RlUgICAvKiE8IERNQU1VWCBUSU0xNSBVUCByZXF1ZXN0ICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNMTVfVFJJRyAweDAwMDAwMDUwVSAvKiE8IERNQU1VWCBUSU0xNSBUUklHIHJlcXVlc3QgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9USU0xNV9DT00gMHgwMDAwMDA1MVUgIC8qITwgRE1BTVVYIFRJTTE1IENPTSByZXF1ZXN0ICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9USU0xNl9DSDEgMHgwMDAwMDA1MlUgIC8qITwgRE1BTVVYIFRJTTE2IENIMSByZXF1ZXN0ICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9USU0xNl9VUCAweDAwMDAwMDUzVSAgIC8qITwgRE1BTVVYIFRJTTE2IFVQIHJlcXVlc3QgICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9USU0xN19DSDEgMHgwMDAwMDA1NFUgIC8qITwgRE1BTVVYIFRJTTE3IENIMSByZXF1ZXN0ICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9USU0xN19VUCAweDAwMDAwMDU1VSAgIC8qITwgRE1BTVVYIFRJTTE3IFVQIHJlcXVlc3QgICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9USU0yMF9DSDEgMHgwMDAwMDA1NlUgIC8qITwgRE1BTVVYIFRJTTIwIENIMSByZXF1ZXN0ICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9USU0yMF9DSDIgMHgwMDAwMDA1N1UgIC8qITwgRE1BTVVYIFRJTTIwIENIMiByZXF1ZXN0ICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9USU0yMF9DSDMgMHgwMDAwMDA1OFUgIC8qITwgRE1BTVVYIFRJTTIwIENIMyByZXF1ZXN0ICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9USU0yMF9DSDQgMHgwMDAwMDA1OVUgIC8qITwgRE1BTVVYIFRJTTIwIENINCByZXF1ZXN0ICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9USU0yMF9VUCAweDAwMDAwMDVBVSAgIC8qITwgRE1BTVVYIFRJTTIwIFVQIHJlcXVlc3QgICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9BRVNfSU4gMHgwMDAwMDA1QlUgICAgIC8qITwgRE1BTVVYIEFFU19JTiByZXF1ZXN0ICAgICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9BRVNfT1VUIDB4MDAwMDAwNUNVICAgIC8qITwgRE1BTVVYIEFFU19PVVQgcmVxdWVzdCAgICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9USU0yMF9UUklHIDB4MDAwMDAwNURVIC8qITwgRE1BTVVYIFRJTTIwIFRSSUcgcmVxdWVzdCAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX1RJTTIwX0NPTSAweDAwMDAwMDVFVSAgLyohPCBETUFNVVggVElNMjAgQ09NIHJlcXVlc3QgICAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX0hSVElNMV9NIDB4MDAwMDAwNUZVICAgLyohPCBETUFNVVggSFJUSU0gTSByZXF1ZXN0ICAgICAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX0hSVElNMV9BIDB4MDAwMDAwNjBVICAgLyohPCBETUFNVVggSFJUSU0gQSByZXF1ZXN0ICAgICAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX0hSVElNMV9CIDB4MDAwMDAwNjFVICAgLyohPCBETUFNVVggSFJUSU0gQiByZXF1ZXN0ICAgICAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX0hSVElNMV9DIDB4MDAwMDAwNjJVICAgLyohPCBETUFNVVggSFJUSU0gQyByZXF1ZXN0ICAgICAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX0hSVElNMV9EIDB4MDAwMDAwNjNVICAgLyohPCBETUFNVVggSFJUSU0gRCByZXF1ZXN0ICAgICAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX0hSVElNMV9FIDB4MDAwMDAwNjRVICAgLyohPCBETUFNVVggSFJUSU0gRSByZXF1ZXN0ICAgICAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX0hSVElNMV9GIDB4MDAwMDAwNjVVICAgLyohPCBETUFNVVggSFJUSU0gRiByZXF1ZXN0ICAgICAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX0RBQzNfQ0gxIDB4MDAwMDAwNjZVICAgLyohPCBETUFNVVggREFDMyBDSDEgcmVxdWVzdCAgICAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX0RBQzNfQ0gyIDB4MDAwMDAwNjdVICAgLyohPCBETUFNVVggREFDMyBDSDIgcmVxdWVzdCAgICAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX0RBQzRfQ0gxIDB4MDAwMDAwNjhVICAgLyohPCBETUFNVVggREFDNCBDSDEgcmVxdWVzdCAgICAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX0RBQzRfQ0gyIDB4MDAwMDAwNjlVICAgLyohPCBETUFNVVggREFDNCBDSDIgcmVxdWVzdCAgICAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX1NQSTRfUlggMHgwMDAwMDA2QVUgICAgLyohPCBETUFNVVggU1BJNCBSWCByZXF1ZXN0ICAgICAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX1NQSTRfVFggMHgwMDAwMDA2QlUgICAgLyohPCBETUFNVVggU1BJNCBUWCByZXF1ZXN0ICAgICAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX1NBSTFfQSAweDAwMDAwMDZDVSAgICAgLyohPCBETUFNVVggU0FJMSBBIHJlcXVlc3QgICAgICAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX1NBSTFfQiAweDAwMDAwMDZEVSAgICAgLyohPCBETUFNVVggU0FJMSBCIHJlcXVlc3QgICAgICAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX0ZNQUNfUkVBRCAweDAwMDAwMDZFVSAgLyohPCBETUFNVVggRk1BQyBSRUFEIHJlcXVlc3QgICAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX0ZNQUNfV1JJVEUgMHgwMDAwMDA2RlUgLyohPCBETUFNVVggRk1BQyBXUklURSByZXF1ZXN0ICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfQ09SRElDX1JFQUQgICAgICAgICAgICAgXAorICAweDAwMDAwMDcwVSAvKiE8IERNQU1VWCBDT1JESUMgUkVBRCByZXF1ZXN0IFwKKyAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfQ09SRElDX1dSSVRFIFwKKyAgMHgwMDAwMDA3MVUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IERNQU1VWCBDT1JESUMgV1JJVEUgcmVxdWVzdCovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfVUNQRDFfUlggMHgwMDAwMDA3MlUgLyohPCBETUFNVVggVVNCUEQxX1JYIHJlcXVlc3QgICAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX1VDUEQxX1RYIDB4MDAwMDAwNzNVIC8qITwgRE1BTVVYIFVTQlBEMV9UWCByZXF1ZXN0ICAgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BTVVYX0xMX0VDX0NIQU5ORUwgRE1BTVVYIENoYW5uZWwKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfRE1BTVVYX0NIQU5ORUxfMCBcCisgIDB4MDAwMDAwMDBVIC8qITwgRE1BTVVYIENoYW5uZWwgMCBjb25uZWN0ZWQgdG8gRE1BMSBDaGFubmVsIDEgICovCisjZGVmaW5lIExMX0RNQU1VWF9DSEFOTkVMXzEgXAorICAweDAwMDAwMDAxVSAvKiE8IERNQU1VWCBDaGFubmVsIDEgY29ubmVjdGVkIHRvIERNQTEgQ2hhbm5lbCAyICAqLworI2RlZmluZSBMTF9ETUFNVVhfQ0hBTk5FTF8yIFwKKyAgMHgwMDAwMDAwMlUgLyohPCBETUFNVVggQ2hhbm5lbCAyIGNvbm5lY3RlZCB0byBETUExIENoYW5uZWwgMyAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX0NIQU5ORUxfMyBcCisgIDB4MDAwMDAwMDNVIC8qITwgRE1BTVVYIENoYW5uZWwgMyBjb25uZWN0ZWQgdG8gRE1BMSBDaGFubmVsIDQgICovCisjZGVmaW5lIExMX0RNQU1VWF9DSEFOTkVMXzQgXAorICAweDAwMDAwMDA0VSAvKiE8IERNQU1VWCBDaGFubmVsIDQgY29ubmVjdGVkIHRvIERNQTEgQ2hhbm5lbCA1ICAqLworI2RlZmluZSBMTF9ETUFNVVhfQ0hBTk5FTF81IFwKKyAgMHgwMDAwMDAwNVUgLyohPCBETUFNVVggQ2hhbm5lbCA1IGNvbm5lY3RlZCB0byBETUExIENoYW5uZWwgNiAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX0NIQU5ORUxfNiBcCisgIDB4MDAwMDAwMDZVIC8qITwgRE1BTVVYIENoYW5uZWwgNiBjb25uZWN0ZWQgdG8gRE1BMSBDaGFubmVsIDcgICovCisjZGVmaW5lIExMX0RNQU1VWF9DSEFOTkVMXzcgXAorICAweDAwMDAwMDA3VSAvKiE8IERNQU1VWCBDaGFubmVsIDcgY29ubmVjdGVkIHRvIERNQTEgQ2hhbm5lbCA4ICAqLworI2RlZmluZSBMTF9ETUFNVVhfQ0hBTk5FTF84IFwKKyAgMHgwMDAwMDAwOFUgLyohPCBETUFNVVggQ2hhbm5lbCA4IGNvbm5lY3RlZCB0byBETUEyIENoYW5uZWwgMSAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX0NIQU5ORUxfOSBcCisgIDB4MDAwMDAwMDlVIC8qITwgRE1BTVVYIENoYW5uZWwgOSBjb25uZWN0ZWQgdG8gRE1BMiBDaGFubmVsIDIgICovCisjZGVmaW5lIExMX0RNQU1VWF9DSEFOTkVMXzEwIFwKKyAgMHgwMDAwMDAwQVUgLyohPCBETUFNVVggQ2hhbm5lbCAxMCBjb25uZWN0ZWQgdG8gRE1BMiBDaGFubmVsIDMgKi8KKyNkZWZpbmUgTExfRE1BTVVYX0NIQU5ORUxfMTEgXAorICAweDAwMDAwMDBCVSAvKiE8IERNQU1VWCBDaGFubmVsIDExIGNvbm5lY3RlZCB0byBETUEyIENoYW5uZWwgNCAqLworI2RlZmluZSBMTF9ETUFNVVhfQ0hBTk5FTF8xMiBcCisgIDB4MDAwMDAwMENVIC8qITwgRE1BTVVYIENoYW5uZWwgMTIgY29ubmVjdGVkIHRvIERNQTIgQ2hhbm5lbCA1ICovCisjZGVmaW5lIExMX0RNQU1VWF9DSEFOTkVMXzEzIFwKKyAgMHgwMDAwMDAwRFUgLyohPCBETUFNVVggQ2hhbm5lbCAxMyBjb25uZWN0ZWQgdG8gRE1BMiBDaGFubmVsIDYgKi8KKyNkZWZpbmUgTExfRE1BTVVYX0NIQU5ORUxfMTQgXAorICAweDAwMDAwMDBFVSAvKiE8IERNQU1VWCBDaGFubmVsIDE0IGNvbm5lY3RlZCB0byBETUEyIENoYW5uZWwgNyAqLworI2RlZmluZSBMTF9ETUFNVVhfQ0hBTk5FTF8xNSBcCisgIDB4MDAwMDAwMEZVIC8qITwgRE1BTVVYIENoYW5uZWwgMTUgY29ubmVjdGVkIHRvIERNQTIgQ2hhbm5lbCA4ICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBETUFNVVhfTExfRUNfU1lOQ19OTyBTeW5jaHJvbml6YXRpb24gU2lnbmFsIFBvbGFyaXR5CisgKiBAeworICovCisjZGVmaW5lIExMX0RNQU1VWF9TWU5DX05PX0VWRU5UIDB4MDAwMDAwMDBVIC8qITwgQWxsIHJlcXVlc3RzIGFyZSBibG9ja2VkICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1NZTkNfUE9MX1JJU0lORyBcCisgIERNQU1VWF9DeENSX1NQT0xfMCAvKiE8IFN5bmNocm9uaXphdGlvbiBvbiBldmVudCBvbiByaXNpbmcgZWRnZSAqLworI2RlZmluZSBMTF9ETUFNVVhfU1lOQ19QT0xfRkFMTElORyBcCisgIERNQU1VWF9DeENSX1NQT0xfMSAvKiE8IFN5bmNocm9uaXphdGlvbiBvbiBldmVudCBvbiBmYWxsaW5nIGVkZ2UgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1NZTkNfUE9MX1JJU0lOR19GQUxMSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoRE1BTVVYX0N4Q1JfU1BPTF8wIHwgRE1BTVVYX0N4Q1JfU1BPTF8xKSAvKiE8IFN5bmNocm9uaXphdGlvbiBvbiBldmVudCBvbiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpc2luZyBhbmQgZmFsbGluZyBlZGdlICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBETUFNVVhfTExfRUNfU1lOQ19FVlQgU3luY2hyb25pemF0aW9uIFNpZ25hbCBFdmVudAorICogQHsKKyAqLworI2RlZmluZSBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkUwIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBTeW5jaHJvbml6YXRpb24gc2lnbmFsIGZyb20gRVhUSSBMaW5lMCAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FMSBcCisgIERNQU1VWF9DeENSX1NZTkNfSURfMCAvKiE8IFN5bmNocm9uaXphdGlvbiBzaWduYWwgZnJvbSBFWFRJIExpbmUxICAqLworI2RlZmluZSBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkUyIFwKKyAgRE1BTVVYX0N4Q1JfU1lOQ19JRF8xIC8qITwgU3luY2hyb25pemF0aW9uIHNpZ25hbCBmcm9tIEVYVEkgTGluZTIgICovCisjZGVmaW5lIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTMgXAorICAoRE1BTVVYX0N4Q1JfU1lOQ19JRF8xIHwgICAgICAgIFwKKyAgIERNQU1VWF9DeENSX1NZTkNfSURfMCkgLyohPCBTeW5jaHJvbml6YXRpb24gc2lnbmFsIGZyb20gRVhUSSBMaW5lMyAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FNCBcCisgIERNQU1VWF9DeENSX1NZTkNfSURfMiAvKiE8IFN5bmNocm9uaXphdGlvbiBzaWduYWwgZnJvbSBFWFRJIExpbmU0ICAqLworI2RlZmluZSBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkU1IFwKKyAgKERNQU1VWF9DeENSX1NZTkNfSURfMiB8ICAgICAgICBcCisgICBETUFNVVhfQ3hDUl9TWU5DX0lEXzApIC8qITwgU3luY2hyb25pemF0aW9uIHNpZ25hbCBmcm9tIEVYVEkgTGluZTUgICovCisjZGVmaW5lIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTYgXAorICAoRE1BTVVYX0N4Q1JfU1lOQ19JRF8yIHwgICAgICAgIFwKKyAgIERNQU1VWF9DeENSX1NZTkNfSURfMSkgLyohPCBTeW5jaHJvbml6YXRpb24gc2lnbmFsIGZyb20gRVhUSSBMaW5lNiAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FNyAgICAgICAgICAgICAgICAgIFwKKyAgKERNQU1VWF9DeENSX1NZTkNfSURfMiB8IERNQU1VWF9DeENSX1NZTkNfSURfMSB8IFwKKyAgIERNQU1VWF9DeENSX1NZTkNfSURfMCkgLyohPCBTeW5jaHJvbml6YXRpb24gc2lnbmFsIGZyb20gRVhUSSBMaW5lNyAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FOCBcCisgIERNQU1VWF9DeENSX1NZTkNfSURfMyAvKiE8IFN5bmNocm9uaXphdGlvbiBzaWduYWwgZnJvbSBFWFRJIExpbmU4ICAqLworI2RlZmluZSBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkU5IFwKKyAgKERNQU1VWF9DeENSX1NZTkNfSURfMyB8ICAgICAgICBcCisgICBETUFNVVhfQ3hDUl9TWU5DX0lEXzApIC8qITwgU3luY2hyb25pemF0aW9uIHNpZ25hbCBmcm9tIEVYVEkgTGluZTkgICovCisjZGVmaW5lIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTEwIFwKKyAgKERNQU1VWF9DeENSX1NZTkNfSURfMyB8ICAgICAgICAgXAorICAgRE1BTVVYX0N4Q1JfU1lOQ19JRF8xKSAvKiE8IFN5bmNocm9uaXphdGlvbiBzaWduYWwgZnJvbSBFWFRJIExpbmUxMCAqLworI2RlZmluZSBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkUxMSAgICAgICAgICAgICAgICAgXAorICAoRE1BTVVYX0N4Q1JfU1lOQ19JRF8zIHwgRE1BTVVYX0N4Q1JfU1lOQ19JRF8xIHwgXAorICAgRE1BTVVYX0N4Q1JfU1lOQ19JRF8wKSAvKiE8IFN5bmNocm9uaXphdGlvbiBzaWduYWwgZnJvbSBFWFRJIExpbmUxMSAqLworI2RlZmluZSBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkUxMiBcCisgIChETUFNVVhfQ3hDUl9TWU5DX0lEXzMgfCAgICAgICAgIFwKKyAgIERNQU1VWF9DeENSX1NZTkNfSURfMikgLyohPCBTeW5jaHJvbml6YXRpb24gc2lnbmFsIGZyb20gRVhUSSBMaW5lMTIgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FMTMgICAgICAgICAgICAgICAgIFwKKyAgKERNQU1VWF9DeENSX1NZTkNfSURfMyB8IERNQU1VWF9DeENSX1NZTkNfSURfMiB8IFwKKyAgIERNQU1VWF9DeENSX1NZTkNfSURfMCkgLyohPCBTeW5jaHJvbml6YXRpb24gc2lnbmFsIGZyb20gRVhUSSBMaW5lMTMgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FMTQgICAgICAgICAgICAgICAgIFwKKyAgKERNQU1VWF9DeENSX1NZTkNfSURfMyB8IERNQU1VWF9DeENSX1NZTkNfSURfMiB8IFwKKyAgIERNQU1VWF9DeENSX1NZTkNfSURfMSkgLyohPCBTeW5jaHJvbml6YXRpb24gc2lnbmFsIGZyb20gRVhUSSBMaW5lMTQgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FMTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKERNQU1VWF9DeENSX1NZTkNfSURfMyB8IERNQU1VWF9DeENSX1NZTkNfSURfMiB8IERNQU1VWF9DeENSX1NZTkNfSURfMSB8IFwKKyAgIERNQU1VWF9DeENSX1NZTkNfSURfMCkgLyohPCBTeW5jaHJvbml6YXRpb24gc2lnbmFsIGZyb20gRVhUSSBMaW5lMTUgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1NZTkNfRE1BTVVYX0NIMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIERNQU1VWF9DeENSX1NZTkNfSURfNCAvKiE8IFN5bmNocm9uaXphdGlvbiBzaWduYWwgZnJvbSBETUFNVVggY2hhbm5lbDAgRXZlbnQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9TWU5DX0RNQU1VWF9DSDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChETUFNVVhfQ3hDUl9TWU5DX0lEXzQgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBETUFNVVhfQ3hDUl9TWU5DX0lEXzApIC8qITwgU3luY2hyb25pemF0aW9uIHNpZ25hbCBmcm9tIERNQU1VWCBjaGFubmVsMSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50ICovCisjZGVmaW5lIExMX0RNQU1VWF9TWU5DX0RNQU1VWF9DSDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChETUFNVVhfQ3hDUl9TWU5DX0lEXzQgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBETUFNVVhfQ3hDUl9TWU5DX0lEXzEpIC8qITwgU3luY2hyb25pemF0aW9uIHNpZ25hbCBmcm9tIERNQU1VWCBjaGFubmVsMiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50ICovCisjZGVmaW5lIExMX0RNQU1VWF9TWU5DX0RNQU1VWF9DSDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChETUFNVVhfQ3hDUl9TWU5DX0lEXzQgfCBETUFNVVhfQ3hDUl9TWU5DX0lEXzEgfCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBETUFNVVhfQ3hDUl9TWU5DX0lEXzApIC8qITwgU3luY2hyb25pemF0aW9uIHNpZ25hbCBmcm9tIERNQU1VWCBjaGFubmVsMyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50ICovCisjZGVmaW5lIExMX0RNQU1VWF9TWU5DX0xQVElNMV9PVVQgXAorICAoRE1BTVVYX0N4Q1JfU1lOQ19JRF80IHwgICAgICAgIFwKKyAgIERNQU1VWF9DeENSX1NZTkNfSURfMikgLyohPCBTeW5jaHJvbml6YXRpb24gc2lnbmFsIGZyb20gTFBUSU0xIE91dHB1dCAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BTVVYX0xMX0VDX1JFUVVFU1RfR0VORVJBVE9SIFJlcXVlc3QgR2VuZXJhdG9yIENoYW5uZWwKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9HRU5fMCAweDAwMDAwMDAwVQorI2RlZmluZSBMTF9ETUFNVVhfUkVRX0dFTl8xIDB4MDAwMDAwMDFVCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfR0VOXzIgMHgwMDAwMDAwMlUKKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9HRU5fMyAweDAwMDAwMDAzVQorLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BTVVYX0xMX0VDX1JFUVVFU1RfR0VOX1BPTEFSSVRZIEV4dGVybmFsIFJlcXVlc3QgU2lnbmFsCisgKiBHZW5lcmF0aW9uIFBvbGFyaXR5CisgKiBAeworICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfR0VOX05PX0VWRU5UIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBObyBleHRlcm5hbCBETUEgcmVxdWVzdCAgZ2VuZXJhdGlvbiAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX0dFTl9QT0xfUklTSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBETUFNVVhfUkd4Q1JfR1BPTF8wIC8qITwgRXh0ZXJuYWwgRE1BIHJlcXVlc3QgZ2VuZXJhdGlvbiBvbiBldmVudCBvbiByaXNpbmcgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGVkZ2UgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9HRU5fUE9MX0ZBTExJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIERNQU1VWF9SR3hDUl9HUE9MXzEgLyohPCBFeHRlcm5hbCBETUEgcmVxdWVzdCBnZW5lcmF0aW9uIG9uIGV2ZW50IG9uIGZhbGxpbmcgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGVkZ2UgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9HRU5fUE9MX1JJU0lOR19GQUxMSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKERNQU1VWF9SR3hDUl9HUE9MXzAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIERNQU1VWF9SR3hDUl9HUE9MXzEpIC8qITwgRXh0ZXJuYWwgRE1BIHJlcXVlc3QgZ2VuZXJhdGlvbiBvbiByaXNpbmcgYW5kIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbGxpbmcgZWRnZSAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BTVVYX0xMX0VDX1JFUVVFU1RfR0VOIEV4dGVybmFsIFJlcXVlc3QgU2lnbmFsIEdlbmVyYXRpb24KKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FMCBcCisgIDB4MDAwMDAwMDBVIC8qITwgUmVxdWVzdCBzaWduYWwgZ2VuZXJhdGlvbiBmcm9tIEVYVEkgTGluZTAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTEgXAorICBETUFNVVhfUkd4Q1JfU0lHX0lEXzAgLyohPCBSZXF1ZXN0IHNpZ25hbCBnZW5lcmF0aW9uIGZyb20gRVhUSSBMaW5lMSAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FMiBcCisgIERNQU1VWF9SR3hDUl9TSUdfSURfMSAvKiE8IFJlcXVlc3Qgc2lnbmFsIGdlbmVyYXRpb24gZnJvbSBFWFRJIExpbmUyICAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkUzIFwKKyAgKERNQU1VWF9SR3hDUl9TSUdfSURfMSB8ICAgICAgICAgICBcCisgICBETUFNVVhfUkd4Q1JfU0lHX0lEXzApIC8qITwgUmVxdWVzdCBzaWduYWwgZ2VuZXJhdGlvbiBmcm9tIEVYVEkgTGluZTMgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTQgXAorICBETUFNVVhfUkd4Q1JfU0lHX0lEXzIgLyohPCBSZXF1ZXN0IHNpZ25hbCBnZW5lcmF0aW9uIGZyb20gRVhUSSBMaW5lNCAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FNSBcCisgIChETUFNVVhfUkd4Q1JfU0lHX0lEXzIgfCAgICAgICAgICAgXAorICAgRE1BTVVYX1JHeENSX1NJR19JRF8wKSAvKiE8IFJlcXVlc3Qgc2lnbmFsIGdlbmVyYXRpb24gZnJvbSBFWFRJIExpbmU1ICAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkU2IFwKKyAgKERNQU1VWF9SR3hDUl9TSUdfSURfMiB8ICAgICAgICAgICBcCisgICBETUFNVVhfUkd4Q1JfU0lHX0lEXzEpIC8qITwgUmVxdWVzdCBzaWduYWwgZ2VuZXJhdGlvbiBmcm9tIEVYVEkgTGluZTYgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTcgICAgICAgICAgICAgICBcCisgIChETUFNVVhfUkd4Q1JfU0lHX0lEXzIgfCBETUFNVVhfUkd4Q1JfU0lHX0lEXzEgfCBcCisgICBETUFNVVhfUkd4Q1JfU0lHX0lEXzApIC8qITwgUmVxdWVzdCBzaWduYWwgZ2VuZXJhdGlvbiBmcm9tIEVYVEkgTGluZTcgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTggXAorICBETUFNVVhfUkd4Q1JfU0lHX0lEXzMgLyohPCBSZXF1ZXN0IHNpZ25hbCBnZW5lcmF0aW9uIGZyb20gRVhUSSBMaW5lOCAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FOSBcCisgIChETUFNVVhfUkd4Q1JfU0lHX0lEXzMgfCAgICAgICAgICAgXAorICAgRE1BTVVYX1JHeENSX1NJR19JRF8wKSAvKiE8IFJlcXVlc3Qgc2lnbmFsIGdlbmVyYXRpb24gZnJvbSBFWFRJIExpbmU5ICAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkUxMCBcCisgIChETUFNVVhfUkd4Q1JfU0lHX0lEXzMgfCAgICAgICAgICAgIFwKKyAgIERNQU1VWF9SR3hDUl9TSUdfSURfMSkgLyohPCBSZXF1ZXN0IHNpZ25hbCBnZW5lcmF0aW9uIGZyb20gRVhUSSBMaW5lMTAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FMTEgICAgICAgICAgICAgIFwKKyAgKERNQU1VWF9SR3hDUl9TSUdfSURfMyB8IERNQU1VWF9SR3hDUl9TSUdfSURfMSB8IFwKKyAgIERNQU1VWF9SR3hDUl9TSUdfSURfMCkgLyohPCBSZXF1ZXN0IHNpZ25hbCBnZW5lcmF0aW9uIGZyb20gRVhUSSBMaW5lMTEgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FMTIgXAorICAoRE1BTVVYX1JHeENSX1NJR19JRF8zIHwgICAgICAgICAgICBcCisgICBETUFNVVhfUkd4Q1JfU0lHX0lEXzIpIC8qITwgUmVxdWVzdCBzaWduYWwgZ2VuZXJhdGlvbiBmcm9tIEVYVEkgTGluZTEyICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTEzICAgICAgICAgICAgICBcCisgIChETUFNVVhfUkd4Q1JfU0lHX0lEXzMgfCBETUFNVVhfUkd4Q1JfU0lHX0lEXzIgfCBcCisgICBETUFNVVhfUkd4Q1JfU0lHX0lEXzApIC8qITwgUmVxdWVzdCBzaWduYWwgZ2VuZXJhdGlvbiBmcm9tIEVYVEkgTGluZTEzICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTE0ICAgICAgICAgICAgICBcCisgIChETUFNVVhfUkd4Q1JfU0lHX0lEXzMgfCBETUFNVVhfUkd4Q1JfU0lHX0lEXzIgfCBcCisgICBETUFNVVhfUkd4Q1JfU0lHX0lEXzEpIC8qITwgUmVxdWVzdCBzaWduYWwgZ2VuZXJhdGlvbiBmcm9tIEVYVEkgTGluZTE0ICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChETUFNVVhfUkd4Q1JfU0lHX0lEXzMgfCBETUFNVVhfUkd4Q1JfU0lHX0lEXzIgfCBETUFNVVhfUkd4Q1JfU0lHX0lEXzEgfCBcCisgICBETUFNVVhfUkd4Q1JfU0lHX0lEXzApIC8qITwgUmVxdWVzdCBzaWduYWwgZ2VuZXJhdGlvbiBmcm9tIEVYVEkgTGluZTE1ICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfR0VOX0RNQU1VWF9DSDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBETUFNVVhfUkd4Q1JfU0lHX0lEXzQgLyohPCBSZXF1ZXN0IHNpZ25hbCBnZW5lcmF0aW9uIGZyb20gRE1BTVVYIGNoYW5uZWwwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50ICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfR0VOX0RNQU1VWF9DSDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChETUFNVVhfUkd4Q1JfU0lHX0lEXzQgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBETUFNVVhfUkd4Q1JfU0lHX0lEXzApIC8qITwgUmVxdWVzdCBzaWduYWwgZ2VuZXJhdGlvbiBmcm9tIERNQU1VWCBjaGFubmVsMSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50ICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfR0VOX0RNQU1VWF9DSDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChETUFNVVhfUkd4Q1JfU0lHX0lEXzQgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBETUFNVVhfUkd4Q1JfU0lHX0lEXzEpIC8qITwgUmVxdWVzdCBzaWduYWwgZ2VuZXJhdGlvbiBmcm9tIERNQU1VWCBjaGFubmVsMiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50ICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfR0VOX0RNQU1VWF9DSDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChETUFNVVhfUkd4Q1JfU0lHX0lEXzQgfCBETUFNVVhfUkd4Q1JfU0lHX0lEXzEgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBETUFNVVhfUkd4Q1JfU0lHX0lEXzApIC8qITwgUmVxdWVzdCBzaWduYWwgZ2VuZXJhdGlvbiBmcm9tIERNQU1VWCBjaGFubmVsMyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50ICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfR0VOX0xQVElNMV9PVVQgXAorICAoRE1BTVVYX1JHeENSX1NJR19JRF80IHwgICAgICAgICAgIFwKKyAgIERNQU1VWF9SR3hDUl9TSUdfSURfMikgLyohPCBSZXF1ZXN0IHNpZ25hbCBnZW5lcmF0aW9uIGZyb20gTFBUSU0xIE91dHB1dCAqLworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBETUFNVVhfTExfRXhwb3J0ZWRfTWFjcm9zIERNQU1VWCBFeHBvcnRlZCBNYWNyb3MKKyAqIEB7CisgKi8KKy8qKiBAZGVmZ3JvdXAgRE1BTVVYX0xMX0VNX1dSSVRFX1JFQUQgQ29tbW9uIFdyaXRlIGFuZCByZWFkIHJlZ2lzdGVycyBtYWNyb3MKKyAqIEB7CisgKi8KKy8qKgorICogQGJyaWVmICBXcml0ZSBhIHZhbHVlIGluIERNQU1VWCByZWdpc3RlcgorICogQHBhcmFtICBfX0lOU1RBTkNFX18gRE1BTVVYIEluc3RhbmNlCisgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgd3JpdHRlbgorICogQHBhcmFtICBfX1ZBTFVFX18gVmFsdWUgdG8gYmUgd3JpdHRlbiBpbiB0aGUgcmVnaXN0ZXIKKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIExMX0RNQU1VWF9Xcml0ZVJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18sIF9fVkFMVUVfXykgXAorICBXUklURV9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fLCAoX19WQUxVRV9fKSkKKworLyoqCisgKiBAYnJpZWYgIFJlYWQgYSB2YWx1ZSBpbiBETUFNVVggcmVnaXN0ZXIKKyAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIERNQU1VWCBJbnN0YW5jZQorICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHJlYWQKKyAqIEByZXR2YWwgUmVnaXN0ZXIgdmFsdWUKKyAqLworI2RlZmluZSBMTF9ETUFNVVhfUmVhZFJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18pIFJFQURfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXykKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRE1BTVVYX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucyBETUFNVVggRXhwb3J0ZWQgRnVuY3Rpb25zCisgKiBAeworICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BTVVYX0xMX0VGX0NvbmZpZ3VyYXRpb24gQ29uZmlndXJhdGlvbgorICogQHsKKyAqLworLyoqCisgKiBAYnJpZWYgIFNldCBETUFNVVggcmVxdWVzdCBJRCBmb3IgRE1BTVVYIENoYW5uZWwgeC4KKyAqIEBub3RlICAgRE1BTVVYIGNoYW5uZWwgMCB0byA3IGFyZSBtYXBwZWQgdG8gRE1BMSBjaGFubmVsIDEgdG8gOC4KKyAqICAgICAgICAgRE1BTVVYIGNoYW5uZWwgOCB0byAxNSBhcmUgbWFwcGVkIHRvIERNQTIgY2hhbm5lbCAxIHRvIDguCisgKiBAcm10b2xsIEN4Q1IgICAgICAgICBETUFSRVFfSUQgICAgIExMX0RNQU1VWF9TZXRSZXF1ZXN0SUQKKyAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlCisgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xNAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTUKKyAqIEBwYXJhbSAgUmVxdWVzdCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9NRU0yTUVNCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTkVSQVRPUjAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VORVJBVE9SMQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5FUkFUT1IyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTkVSQVRPUjMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfQURDMQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9EQUMxX0NIMQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9EQUMxX0NIMgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU02X1VQCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTdfVVAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfU1BJMV9SWAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9TUEkxX1RYCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1NQSTJfUlgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfU1BJMl9UWAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9TUEkzX1JYCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1NQSTNfVFgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfSTJDMV9SWAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9JMkMxX1RYCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0kyQzJfUlgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfSTJDMl9UWAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9JMkMzX1JYCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0kyQzNfVFggKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0kyQzRfUlggKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0kyQzRfVFgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVVNBUlQxX1JYCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1VTQVJUMV9UWAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9VU0FSVDJfUlgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVVNBUlQyX1RYCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1VTQVJUM19SWAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9VU0FSVDNfVFgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVUFSVDRfUlgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVUFSVDRfVFgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVUFSVDVfUlggKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1VBUlQ1X1RYICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9MUFVBUlQxX1JYCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0xQVUFSVDFfVFgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfQURDMgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9BREMzICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9BREM0ICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9BREM1ICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9RU1BJICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9EQUMyX0NIMSAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMV9DSDEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMV9DSDIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMV9DSDMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMV9DSDQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMV9VUAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xX1RSSUcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMV9DT00KKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNOF9DSDEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNOF9DSDIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNOF9DSDMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNOF9DSDQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNOF9VUAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU04X1RSSUcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNOF9DT00KKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMl9DSDEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMl9DSDIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMl9DSDMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMl9DSDQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMl9VUAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0zX0NIMQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0zX0NIMgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0zX0NIMworICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0zX0NINAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0zX1VQCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTNfVFJJRworICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU00X0NIMQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU00X0NIMgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU00X0NIMworICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU00X0NINAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU00X1VQCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTVfQ0gxICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU01X0NIMiAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNNV9DSDMgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTVfQ0g0ICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU01X1VQICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU01X1RSSUcgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTE1X0NIMQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xNV9VUAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xNV9UUklHCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTE1X0NPTQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xNl9DSDEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMTZfVVAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMTdfQ0gxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTE3X1VQCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTIwX0NIMSAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMjBfQ0gyICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yMF9DSDMgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTIwX0NINCAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMjBfVVAgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0FFU19JTgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9BRVNfT1VUCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTIwX1RSSUcgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTIwX0NPTSAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfSFJUSU0xX00gKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0hSVElNMV9BICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9IUlRJTTFfQiAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfSFJUSU0xX0MgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0hSVElNMV9EICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9IUlRJTTFfRSAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfSFJUSU0xX0YgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0RBQzNfQ0gxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0RBQzNfQ0gyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0RBQzRfQ0gxICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9EQUM0X0NIMiAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfU1BJNF9SWCAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfU1BJNF9UWCAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfU0FJMV9BCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1NBSTFfQgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9GTUFDX1dSSVRFCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0ZNQUNfV1JJVEUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfQ09SRElDX1dSSVRFCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0NPUkRJQ19SRUFECisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1VDUEQxX1JYCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1VDUEQxX1RYCisgKiAgICAgICAgICgqKSBOb3Qgb24gYWxsIEc0IGRldmljZXMKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFNVVhfU2V0UmVxdWVzdElEKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFJlcXVlc3QpIHsKKyAgKHZvaWQpKERNQU1VWHgpOworICBNT0RJRllfUkVHKChETUFNVVgxX0NoYW5uZWwwICsgQ2hhbm5lbCktPkNDUiwgRE1BTVVYX0N4Q1JfRE1BUkVRX0lELCBSZXF1ZXN0KTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBETUFNVVggcmVxdWVzdCBJRCBmb3IgRE1BTVVYIENoYW5uZWwgeC4KKyAqIEBub3RlICAgRE1BTVVYIGNoYW5uZWwgMCB0byA3IGFyZSBtYXBwZWQgdG8gRE1BMSBjaGFubmVsIDEgdG8gOC4KKyAqICAgICAgICAgRE1BTVVYIGNoYW5uZWwgOCB0byAxNSBhcmUgbWFwcGVkIHRvIERNQTIgY2hhbm5lbCAxIHRvIDguCisgKiBAcm10b2xsIEN4Q1IgICAgICAgICBETUFSRVFfSUQgICAgIExMX0RNQU1VWF9HZXRSZXF1ZXN0SUQKKyAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlCisgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xNAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTUKKyAqICAgICAgICAgKCopIE5vdCBvbiBhbGwgRzQgZGV2aWNlcworICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9NRU0yTUVNCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTkVSQVRPUjAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VORVJBVE9SMAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5FUkFUT1IxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTkVSQVRPUjIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VORVJBVE9SMworICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9BREMxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0RBQzFfQ0gxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0RBQzFfQ0gyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTZfVVAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNN19VUAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9TUEkxX1JYCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1NQSTFfVFgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfU1BJMl9SWAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9TUEkyX1RYCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1NQSTNfUlgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfU1BJM19UWAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9JMkMxX1JYCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0kyQzFfVFgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfSTJDMl9SWAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9JMkMyX1RYCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0kyQzNfUlgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfSTJDM19UWCAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfSTJDNF9SWCAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfSTJDNF9UWAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9VU0FSVDFfUlgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVVNBUlQxX1RYCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1VTQVJUMl9SWAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9VU0FSVDJfVFgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVVNBUlQzX1JYCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1VTQVJUM19UWAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9VQVJUNF9SWAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9VQVJUNF9UWAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9VQVJUNV9SWCAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVUFSVDVfVFggKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0xQVUFSVDFfUlgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfTFBVQVJUMV9UWAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9BREMyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0FEQzMgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0FEQzQgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0FEQzUgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1FTUEkgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0RBQzJfQ0gxICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xX0NIMQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xX0NIMgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xX0NIMworICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xX0NINAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xX1VQCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTFfVFJJRworICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xX0NPTQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU04X0NIMQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU04X0NIMgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU04X0NIMworICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU04X0NINAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU04X1VQCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTThfVFJJRworICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU04X0NPTQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yX0NIMQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yX0NIMgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yX0NIMworICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yX0NINAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yX1VQCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTNfQ0gxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTNfQ0gyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTNfQ0gzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTNfQ0g0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTNfVVAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNM19UUklHCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTRfQ0gxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTRfQ0gyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTRfQ0gzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTRfQ0g0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTRfVVAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNNV9DSDEgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTVfQ0gyICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU01X0NIMyAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNNV9DSDQgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTVfVVAgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTVfVFJJRyAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMTVfQ0gxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTE1X1VQCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTE1X1RSSUcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMTVfQ09NCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTE2X0NIMQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xNl9VUAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xN19DSDEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMTdfVVAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMjBfQ0gxICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yMF9DSDIgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTIwX0NIMyAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMjBfQ0g0ICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yMF9VUCAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfQUVTX0lOCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0FFU19PVVQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMjBfVFJJRyAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMjBfQ09NICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9IUlRJTTFfTSAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfSFJUSU0xX0EgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0hSVElNMV9CICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9IUlRJTTFfQyAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfSFJUSU0xX0QgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0hSVElNMV9FICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9IUlRJTTFfRiAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfREFDM19DSDEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfREFDM19DSDIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfREFDNF9DSDEgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0RBQzRfQ0gyICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9TUEk0X1JYICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9TUEk0X1RYICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9TQUkxX0EKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfU0FJMV9CCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0ZNQUNfV1JJVEUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfRk1BQ19XUklURQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9DT1JESUNfV1JJVEUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfQ09SRElDX1JFQUQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVUNQRDFfUlgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVUNQRDFfVFgKKyAqICAgICAgICAgKCopIE5vdCBvbiBhbGwgRzQgZGV2aWNlcworICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BTVVYX0dldFJlcXVlc3RJRChETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCkgeworICAodm9pZCkoRE1BTVVYeCk7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKChETUFNVVgxX0NoYW5uZWwwICsgQ2hhbm5lbCktPkNDUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE1BTVVYX0N4Q1JfRE1BUkVRX0lEKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBTZXQgdGhlIG51bWJlciBvZiBETUEgcmVxdWVzdCB0aGF0IHdpbGwgYmUgYXV0b3JpemVkIGFmdGVyIGEKKyAqIHN5bmNocm9uaXphdGlvbiBldmVudCBhbmQvb3IgdGhlIG51bWJlciBvZiBETUEgcmVxdWVzdCBuZWVkZWQgdG8gZ2VuZXJhdGUgYW4KKyAqIGV2ZW50LgorICogQHJtdG9sbCBDeENSICAgICAgICAgTkJSRVEgICAgICAgICBMTF9ETUFNVVhfU2V0U3luY1JlcXVlc3ROYgorICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMworICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNworICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfOAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfOQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzExCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzE0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xNQorICogQHBhcmFtICBSZXF1ZXN0TmIgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gTWluX0RhdGEgPSAxIGFuZAorICogTWF4X0RhdGEgPSAzMi4KKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFNVVhfU2V0U3luY1JlcXVlc3ROYihETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFJlcXVlc3ROYikgeworICAodm9pZCkoRE1BTVVYeCk7CisgIE1PRElGWV9SRUcoKERNQU1VWDFfQ2hhbm5lbDAgKyBDaGFubmVsKS0+Q0NSLCBETUFNVVhfQ3hDUl9OQlJFUSwKKyAgICAgICAgICAgICAoKFJlcXVlc3ROYiAtIDFVKSA8PCBETUFNVVhfQ3hDUl9OQlJFUV9Qb3MpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCB0aGUgbnVtYmVyIG9mIERNQSByZXF1ZXN0IHRoYXQgd2lsbCBiZSBhdXRvcml6ZWQgYWZ0ZXIgYQorICogc3luY2hyb25pemF0aW9uIGV2ZW50IGFuZC9vciB0aGUgbnVtYmVyIG9mIERNQSByZXF1ZXN0IG5lZWRlZCB0byBnZW5lcmF0ZSBhbgorICogZXZlbnQuCisgKiBAcm10b2xsIEN4Q1IgICAgICAgICBOQlJFUSAgICAgICAgIExMX0RNQU1VWF9HZXRTeW5jUmVxdWVzdE5iCisgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8wCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8zCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF80CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF81CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF82CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF83CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF84CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF85CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMworICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzE1CisgKiBAcmV0dmFsIEJldHdlZW4gTWluX0RhdGEgPSAxIGFuZCBNYXhfRGF0YSA9IDMyCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfRE1BTVVYX0dldFN5bmNSZXF1ZXN0TmIoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCwgdWludDMyX3QgQ2hhbm5lbCkgeworICAodm9pZCkoRE1BTVVYeCk7CisgIHJldHVybiAodWludDMyX3QpKCgoUkVBRF9CSVQoKERNQU1VWDFfQ2hhbm5lbDAgKyBDaGFubmVsKS0+Q0NSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERNQU1VWF9DeENSX05CUkVRKSkgPj4KKyAgICAgICAgICAgICAgICAgICAgIERNQU1VWF9DeENSX05CUkVRX1BvcykgKworICAgICAgICAgICAgICAgICAgICAxVSk7Cit9CisKKy8qKgorICogQGJyaWVmICBTZXQgdGhlIHBvbGFyaXR5IG9mIHRoZSBzaWduYWwgb24gd2hpY2ggdGhlIERNQSByZXF1ZXN0IGlzCisgKiBzeW5jaHJvbml6ZWQuCisgKiBAcm10b2xsIEN4Q1IgICAgICAgICBTUE9MICAgICAgICAgIExMX0RNQU1VWF9TZXRTeW5jUG9sYXJpdHkKKyAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlCisgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xNAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTUKKyAqIEBwYXJhbSAgUG9sYXJpdHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX05PX0VWRU5UCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19QT0xfUklTSU5HCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19QT0xfRkFMTElORworICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfUE9MX1JJU0lOR19GQUxMSU5HCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BTVVYX1NldFN5bmNQb2xhcml0eShETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQb2xhcml0eSkgeworICAodm9pZCkoRE1BTVVYeCk7CisgIE1PRElGWV9SRUcoKERNQU1VWDFfQ2hhbm5lbDAgKyBDaGFubmVsKS0+Q0NSLCBETUFNVVhfQ3hDUl9TUE9MLCBQb2xhcml0eSk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgdGhlIHBvbGFyaXR5IG9mIHRoZSBzaWduYWwgb24gd2hpY2ggdGhlIERNQSByZXF1ZXN0IGlzCisgKiBzeW5jaHJvbml6ZWQuCisgKiBAcm10b2xsIEN4Q1IgICAgICAgICBTUE9MICAgICAgICAgIExMX0RNQU1VWF9HZXRTeW5jUG9sYXJpdHkKKyAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlCisgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xNAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTUKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX05PX0VWRU5UCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19QT0xfUklTSU5HCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19QT0xfRkFMTElORworICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfUE9MX1JJU0lOR19GQUxMSU5HCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfRE1BTVVYX0dldFN5bmNQb2xhcml0eShETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4LCB1aW50MzJfdCBDaGFubmVsKSB7CisgICh2b2lkKShETUFNVVh4KTsKKyAgcmV0dXJuICgKKyAgICAgIHVpbnQzMl90KShSRUFEX0JJVCgoRE1BTVVYMV9DaGFubmVsMCArIENoYW5uZWwpLT5DQ1IsIERNQU1VWF9DeENSX1NQT0wpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSB0aGUgRXZlbnQgR2VuZXJhdGlvbiBvbiBETUFNVVggY2hhbm5lbCB4LgorICogQHJtdG9sbCBDeENSICAgICAgICAgRUdFICAgICAgICAgICBMTF9ETUFNVVhfRW5hYmxlRXZlbnRHZW5lcmF0aW9uCisgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8wCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8zCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF80CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF81CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF82CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF83CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF84CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF85CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMworICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzE1CisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BTVVYX0VuYWJsZUV2ZW50R2VuZXJhdGlvbigKKyAgICBETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4LCB1aW50MzJfdCBDaGFubmVsKSB7CisgICh2b2lkKShETUFNVVh4KTsKKyAgU0VUX0JJVCgoRE1BTVVYMV9DaGFubmVsMCArIENoYW5uZWwpLT5DQ1IsIERNQU1VWF9DeENSX0VHRSk7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIHRoZSBFdmVudCBHZW5lcmF0aW9uIG9uIERNQU1VWCBjaGFubmVsIHguCisgKiBAcm10b2xsIEN4Q1IgICAgICAgICBFR0UgICAgICAgICAgIExMX0RNQU1VWF9EaXNhYmxlRXZlbnRHZW5lcmF0aW9uCisgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8wCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8zCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF80CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF81CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF82CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF83CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF84CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF85CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMworICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzE1CisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BTVVYX0Rpc2FibGVFdmVudEdlbmVyYXRpb24oCisgICAgRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCwgdWludDMyX3QgQ2hhbm5lbCkgeworICAodm9pZCkoRE1BTVVYeCk7CisgIENMRUFSX0JJVCgoRE1BTVVYMV9DaGFubmVsMCArIENoYW5uZWwpLT5DQ1IsIERNQU1VWF9DeENSX0VHRSk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiB0aGUgRXZlbnQgR2VuZXJhdGlvbiBvbiBETUFNVVggY2hhbm5lbCB4IGlzIGVuYWJsZWQgb3IKKyAqIGRpc2FibGVkLgorICogQHJtdG9sbCBDeENSICAgICAgICAgRUdFICAgICAgICAgICBMTF9ETUFNVVhfSXNFbmFibGVkRXZlbnRHZW5lcmF0aW9uCisgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8wCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8zCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF80CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF81CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF82CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF83CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF84CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF85CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMworICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzE1CisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQU1VWF9Jc0VuYWJsZWRFdmVudEdlbmVyYXRpb24oCisgICAgRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCwgdWludDMyX3QgQ2hhbm5lbCkgeworICAodm9pZCkoRE1BTVVYeCk7CisgIHJldHVybiAoKFJFQURfQklUKChETUFNVVgxX0NoYW5uZWwwICsgQ2hhbm5lbCktPkNDUiwgRE1BTVVYX0N4Q1JfRUdFKSA9PQorICAgICAgICAgICAoRE1BTVVYX0N4Q1JfRUdFKSkKKyAgICAgICAgICAgICAgPyAxVUwKKyAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIHRoZSBzeW5jaHJvbml6YXRpb24gbW9kZS4KKyAqIEBybXRvbGwgQ3hDUiAgICAgICAgIFNFICAgICAgICAgICAgTExfRE1BTVVYX0VuYWJsZVN5bmMKKyAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlCisgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xNAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTUKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFNVVhfRW5hYmxlU3luYyhETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCkgeworICAodm9pZCkoRE1BTVVYeCk7CisgIFNFVF9CSVQoKERNQU1VWDFfQ2hhbm5lbDAgKyBDaGFubmVsKS0+Q0NSLCBETUFNVVhfQ3hDUl9TRSk7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIHRoZSBzeW5jaHJvbml6YXRpb24gbW9kZS4KKyAqIEBybXRvbGwgQ3hDUiAgICAgICAgIFNFICAgICAgICAgICAgTExfRE1BTVVYX0Rpc2FibGVTeW5jCisgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8wCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8zCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF80CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF81CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF82CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF83CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF84CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF85CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMworICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzE1CisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BTVVYX0Rpc2FibGVTeW5jKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCkgeworICAodm9pZCkoRE1BTVVYeCk7CisgIENMRUFSX0JJVCgoRE1BTVVYMV9DaGFubmVsMCArIENoYW5uZWwpLT5DQ1IsIERNQU1VWF9DeENSX1NFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBzeW5jaHJvbml6YXRpb24gbW9kZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICogQHJtdG9sbCBDeENSICAgICAgICAgU0UgICAgICAgICAgICBMTF9ETUFNVVhfSXNFbmFibGVkU3luYworICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMworICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNworICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfOAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfOQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzExCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzE0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xNQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfRE1BTVVYX0lzRW5hYmxlZFN5bmMoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCwgdWludDMyX3QgQ2hhbm5lbCkgeworICAodm9pZCkoRE1BTVVYeCk7CisgIHJldHVybiAoKFJFQURfQklUKChETUFNVVgxX0NoYW5uZWwwICsgQ2hhbm5lbCktPkNDUiwgRE1BTVVYX0N4Q1JfU0UpID09CisgICAgICAgICAgIChETUFNVVhfQ3hDUl9TRSkpCisgICAgICAgICAgICAgID8gMVVMCisgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFNldCBETUFNVVggc3luY2hyb25pemF0aW9uIElEICBvbiBETUFNVVggQ2hhbm5lbCB4LgorICogQHJtdG9sbCBDeENSICAgICAgICAgU1lOQ19JRCAgICAgICBMTF9ETUFNVVhfU2V0U3luY0lECisgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8wCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8zCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF80CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF81CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF82CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF83CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF84CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF85CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMworICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzE1CisgKiBAcGFyYW0gIFN5bmNJRCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FMAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FMQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FMgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FMworICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FNAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FNQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FNgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FNworICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FOAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FOQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FMTAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTExCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkUxMgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FMTMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTE0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkUxNQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRE1BTVVYX0NIMAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRE1BTVVYX0NIMQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRE1BTVVYX0NIMgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRE1BTVVYX0NIMworICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfTFBUSU0xX09VVAorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9TZXRTeW5jSUQoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgU3luY0lEKSB7CisgICh2b2lkKShETUFNVVh4KTsKKyAgTU9ESUZZX1JFRygoRE1BTVVYMV9DaGFubmVsMCArIENoYW5uZWwpLT5DQ1IsIERNQU1VWF9DeENSX1NZTkNfSUQsIFN5bmNJRCk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgRE1BTVVYIHN5bmNocm9uaXphdGlvbiBJRCAgb24gRE1BTVVYIENoYW5uZWwgeC4KKyAqIEBybXRvbGwgQ3hDUiAgICAgICAgIFNZTkNfSUQgICAgICAgTExfRE1BTVVYX0dldFN5bmNJRAorICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMworICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNworICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfOAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfOQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzExCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzE0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xNQorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FMAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FMQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FMgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FMworICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FNAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FNQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FNgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FNworICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FOAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FOQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FMTAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTExCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkUxMgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FMTMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTE0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkUxNQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRE1BTVVYX0NIMAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRE1BTVVYX0NIMQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRE1BTVVYX0NIMgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRE1BTVVYX0NIMworICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfTFBUSU0xX09VVAorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BTVVYX0dldFN5bmNJRChETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCkgeworICAodm9pZCkoRE1BTVVYeCk7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKChETUFNVVgxX0NoYW5uZWwwICsgQ2hhbm5lbCktPkNDUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE1BTVVYX0N4Q1JfU1lOQ19JRCkpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIHRoZSBSZXF1ZXN0IEdlbmVyYXRvci4KKyAqIEBybXRvbGwgUkd4Q1IgICAgICAgIEdFICAgICAgICAgICAgTExfRE1BTVVYX0VuYWJsZVJlcXVlc3RHZW4KKyAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlCisgKiBAcGFyYW0gIFJlcXVlc3RHZW5DaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8wCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8zCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BTVVYX0VuYWJsZVJlcXVlc3RHZW4oRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFJlcXVlc3RHZW5DaGFubmVsKSB7CisgICh2b2lkKShETUFNVVh4KTsKKyAgU0VUX0JJVCgoKERNQU1VWF9SZXF1ZXN0R2VuX1R5cGVEZWYgKikoKAorICAgICAgICAgICAgICAgdWludDMyX3QpKCh1aW50MzJfdClETUFNVVgxX1JlcXVlc3RHZW5lcmF0b3IwICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAoRE1BTVVYX1JHQ1JfU0laRSAqIChSZXF1ZXN0R2VuQ2hhbm5lbCkpKSkpCisgICAgICAgICAgICAgIC0+UkdDUiwKKyAgICAgICAgICBETUFNVVhfUkd4Q1JfR0UpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSB0aGUgUmVxdWVzdCBHZW5lcmF0b3IuCisgKiBAcm10b2xsIFJHeENSICAgICAgICBHRSAgICAgICAgICAgIExMX0RNQU1VWF9EaXNhYmxlUmVxdWVzdEdlbgorICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAqIEBwYXJhbSAgUmVxdWVzdEdlbkNoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzMKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFNVVhfRGlzYWJsZVJlcXVlc3RHZW4oCisgICAgRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCwgdWludDMyX3QgUmVxdWVzdEdlbkNoYW5uZWwpIHsKKyAgKHZvaWQpKERNQU1VWHgpOworICBDTEVBUl9CSVQoKChETUFNVVhfUmVxdWVzdEdlbl9UeXBlRGVmICopKCgKKyAgICAgICAgICAgICAgICAgdWludDMyX3QpKCh1aW50MzJfdClETUFNVVgxX1JlcXVlc3RHZW5lcmF0b3IwICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChETUFNVVhfUkdDUl9TSVpFICogKFJlcXVlc3RHZW5DaGFubmVsKSkpKSkKKyAgICAgICAgICAgICAgICAtPlJHQ1IsCisgICAgICAgICAgICBETUFNVVhfUkd4Q1JfR0UpOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFJlcXVlc3QgR2VuZXJhdG9yIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgKiBAcm10b2xsIFJHeENSICAgICAgICBHRSAgICAgICAgICAgIExMX0RNQU1VWF9Jc0VuYWJsZWRSZXF1ZXN0R2VuCisgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICogQHBhcmFtICBSZXF1ZXN0R2VuQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMworICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFNVVhfSXNFbmFibGVkUmVxdWVzdEdlbigKKyAgICBETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4LCB1aW50MzJfdCBSZXF1ZXN0R2VuQ2hhbm5lbCkgeworICAodm9pZCkoRE1BTVVYeCk7CisgIHJldHVybiAoKFJFQURfQklUKCgoRE1BTVVYX1JlcXVlc3RHZW5fVHlwZURlZiAqKSgoCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QpKCh1aW50MzJfdClETUFNVVgxX1JlcXVlc3RHZW5lcmF0b3IwICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERNQU1VWF9SR0NSX1NJWkUgKiAoUmVxdWVzdEdlbkNoYW5uZWwpKSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgLT5SR0NSLAorICAgICAgICAgICAgICAgICAgICBETUFNVVhfUkd4Q1JfR0UpID09IChETUFNVVhfUkd4Q1JfR0UpKQorICAgICAgICAgICAgICA/IDFVTAorICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBTZXQgdGhlIHBvbGFyaXR5IG9mIHRoZSBzaWduYWwgb24gd2hpY2ggdGhlIERNQSByZXF1ZXN0IGlzIGdlbmVyYXRlZC4KKyAqIEBybXRvbGwgUkd4Q1IgICAgICAgIEdQT0wgICAgICAgICAgTExfRE1BTVVYX1NldFJlcXVlc3RHZW5Qb2xhcml0eQorICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAqIEBwYXJhbSAgUmVxdWVzdEdlbkNoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzMKKyAqIEBwYXJhbSAgUG9sYXJpdHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX05PX0VWRU5UCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9QT0xfUklTSU5HCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9QT0xfRkFMTElORworICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fUE9MX1JJU0lOR19GQUxMSU5HCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BTVVYX1NldFJlcXVlc3RHZW5Qb2xhcml0eSgKKyAgICBETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4LCB1aW50MzJfdCBSZXF1ZXN0R2VuQ2hhbm5lbCwKKyAgICB1aW50MzJfdCBQb2xhcml0eSkgeworICBVTlVTRUQoRE1BTVVYeCk7CisgIE1PRElGWV9SRUcoKChETUFNVVhfUmVxdWVzdEdlbl9UeXBlRGVmICopKCgKKyAgICAgICAgICAgICAgICAgIHVpbnQzMl90KSgodWludDMyX3QpRE1BTVVYMV9SZXF1ZXN0R2VuZXJhdG9yMCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERNQU1VWF9SR0NSX1NJWkUgKiAoUmVxdWVzdEdlbkNoYW5uZWwpKSkpKQorICAgICAgICAgICAgICAgICAtPlJHQ1IsCisgICAgICAgICAgICAgRE1BTVVYX1JHeENSX0dQT0wsIFBvbGFyaXR5KTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCB0aGUgcG9sYXJpdHkgb2YgdGhlIHNpZ25hbCBvbiB3aGljaCB0aGUgRE1BIHJlcXVlc3QgaXMgZ2VuZXJhdGVkLgorICogQHJtdG9sbCBSR3hDUiAgICAgICAgR1BPTCAgICAgICAgICBMTF9ETUFNVVhfR2V0UmVxdWVzdEdlblBvbGFyaXR5CisgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICogQHBhcmFtICBSZXF1ZXN0R2VuQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMworICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fTk9fRVZFTlQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX1BPTF9SSVNJTkcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX1BPTF9GQUxMSU5HCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9QT0xfUklTSU5HX0ZBTExJTkcKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQU1VWF9HZXRSZXF1ZXN0R2VuUG9sYXJpdHkoCisgICAgRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCwgdWludDMyX3QgUmVxdWVzdEdlbkNoYW5uZWwpIHsKKyAgVU5VU0VEKERNQU1VWHgpOworICByZXR1cm4gKFJFQURfQklUKCgoRE1BTVVYX1JlcXVlc3RHZW5fVHlwZURlZiAqKSgoCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCkoKHVpbnQzMl90KURNQU1VWDFfUmVxdWVzdEdlbmVyYXRvcjAgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChETUFNVVhfUkdDUl9TSVpFICogKFJlcXVlc3RHZW5DaGFubmVsKSkpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgLT5SR0NSLAorICAgICAgICAgICAgICAgICAgIERNQU1VWF9SR3hDUl9HUE9MKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBTZXQgdGhlIG51bWJlciBvZiBETUEgcmVxdWVzdCB0aGF0IHdpbGwgYmUgYXV0b3JpemVkIGFmdGVyIGEKKyAqIGdlbmVyYXRpb24gZXZlbnQuCisgKiBAbm90ZSAgIFRoaXMgZmllbGQgY2FuIG9ubHkgYmUgd3JpdHRlbiB3aGVuIEdlbmVyYXRvciBpcyBkaXNhYmxlZC4KKyAqIEBybXRvbGwgUkd4Q1IgICAgICAgIEdOQlJFUSAgICAgICAgTExfRE1BTVVYX1NldEdlblJlcXVlc3ROYgorICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAqIEBwYXJhbSAgUmVxdWVzdEdlbkNoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzMKKyAqIEBwYXJhbSAgUmVxdWVzdE5iIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIE1pbl9EYXRhID0gMSBhbmQKKyAqIE1heF9EYXRhID0gMzIuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BTVVYX1NldEdlblJlcXVlc3ROYihETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBSZXF1ZXN0R2VuQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUmVxdWVzdE5iKSB7CisgIFVOVVNFRChETUFNVVh4KTsKKyAgTU9ESUZZX1JFRygoKERNQU1VWF9SZXF1ZXN0R2VuX1R5cGVEZWYgKikoKAorICAgICAgICAgICAgICAgICAgdWludDMyX3QpKCh1aW50MzJfdClETUFNVVgxX1JlcXVlc3RHZW5lcmF0b3IwICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRE1BTVVYX1JHQ1JfU0laRSAqIChSZXF1ZXN0R2VuQ2hhbm5lbCkpKSkpCisgICAgICAgICAgICAgICAgIC0+UkdDUiwKKyAgICAgICAgICAgICBETUFNVVhfUkd4Q1JfR05CUkVRLCAoUmVxdWVzdE5iIC0gMVUpIDw8IERNQU1VWF9SR3hDUl9HTkJSRVFfUG9zKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCB0aGUgbnVtYmVyIG9mIERNQSByZXF1ZXN0IHRoYXQgd2lsbCBiZSBhdXRvcml6ZWQgYWZ0ZXIgYQorICogZ2VuZXJhdGlvbiBldmVudC4KKyAqIEBybXRvbGwgUkd4Q1IgICAgICAgIEdOQlJFUSAgICAgICAgTExfRE1BTVVYX0dldEdlblJlcXVlc3ROYgorICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAqIEBwYXJhbSAgUmVxdWVzdEdlbkNoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzMKKyAqIEByZXR2YWwgQmV0d2VlbiBNaW5fRGF0YSA9IDEgYW5kIE1heF9EYXRhID0gMzIKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQU1VWF9HZXRHZW5SZXF1ZXN0TmIoCisgICAgRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCwgdWludDMyX3QgUmVxdWVzdEdlbkNoYW5uZWwpIHsKKyAgVU5VU0VEKERNQU1VWHgpOworICByZXR1cm4gKChSRUFEX0JJVCgoKERNQU1VWF9SZXF1ZXN0R2VuX1R5cGVEZWYgKikoKAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KSgodWludDMyX3QpRE1BTVVYMV9SZXF1ZXN0R2VuZXJhdG9yMCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChETUFNVVhfUkdDUl9TSVpFICogKFJlcXVlc3RHZW5DaGFubmVsKSkpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC0+UkdDUiwKKyAgICAgICAgICAgICAgICAgICAgRE1BTVVYX1JHeENSX0dOQlJFUSkgPj4KKyAgICAgICAgICAgRE1BTVVYX1JHeENSX0dOQlJFUV9Qb3MpICsKKyAgICAgICAgICAxVSk7Cit9CisKKy8qKgorICogQGJyaWVmICBTZXQgRE1BTVVYIGV4dGVybmFsIFJlcXVlc3QgU2lnbmFsIElEIG9uIERNQU1VWCBSZXF1ZXN0IEdlbmVyYXRpb24KKyAqIFRyaWdnZXIgRXZlbnQgQ2hhbm5lbCB4LgorICogQHJtdG9sbCBSR3hDUiAgICAgICAgU0lHX0lEICAgICAgICBMTF9ETUFNVVhfU2V0UmVxdWVzdFNpZ25hbElECisgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICogQHBhcmFtICBSZXF1ZXN0R2VuQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMworICogQHBhcmFtICBSZXF1ZXN0U2lnbmFsSUQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTEwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkUxMQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FMTIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTEzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkUxNAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FMTUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0RNQU1VWF9DSDAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0RNQU1VWF9DSDEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0RNQU1VWF9DSDIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0RNQU1VWF9DSDMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0xQVElNMV9PVVQKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFNVVhfU2V0UmVxdWVzdFNpZ25hbElEKAorICAgIERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgsIHVpbnQzMl90IFJlcXVlc3RHZW5DaGFubmVsLAorICAgIHVpbnQzMl90IFJlcXVlc3RTaWduYWxJRCkgeworICBVTlVTRUQoRE1BTVVYeCk7CisgIE1PRElGWV9SRUcoKChETUFNVVhfUmVxdWVzdEdlbl9UeXBlRGVmICopKCgKKyAgICAgICAgICAgICAgICAgIHVpbnQzMl90KSgodWludDMyX3QpRE1BTVVYMV9SZXF1ZXN0R2VuZXJhdG9yMCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERNQU1VWF9SR0NSX1NJWkUgKiAoUmVxdWVzdEdlbkNoYW5uZWwpKSkpKQorICAgICAgICAgICAgICAgICAtPlJHQ1IsCisgICAgICAgICAgICAgRE1BTVVYX1JHeENSX1NJR19JRCwgUmVxdWVzdFNpZ25hbElEKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBETUFNVVggZXh0ZXJuYWwgUmVxdWVzdCBTaWduYWwgSUQgc2V0IG9uIERNQU1VWCBDaGFubmVsIHguCisgKiBAcm10b2xsIFJHeENSICAgICAgICBTSUdfSUQgICAgICAgIExMX0RNQU1VWF9HZXRSZXF1ZXN0U2lnbmFsSUQKKyAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlCisgKiBAcGFyYW0gIFJlcXVlc3RHZW5DaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8wCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8zCisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkUwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkUxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkUyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkUzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkU0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkU1CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkU2CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkU3CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkU4CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkU5CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkUxMAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FMTEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTEyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkUxMworICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FMTQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTE1CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9ETUFNVVhfQ0gwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9ETUFNVVhfQ0gxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9ETUFNVVhfQ0gyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9ETUFNVVhfQ0gzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9MUFRJTTFfT1VUCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFNVVhfR2V0UmVxdWVzdFNpZ25hbElEKAorICAgIERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgsIHVpbnQzMl90IFJlcXVlc3RHZW5DaGFubmVsKSB7CisgIFVOVVNFRChETUFNVVh4KTsKKyAgcmV0dXJuIChSRUFEX0JJVCgoKERNQU1VWF9SZXF1ZXN0R2VuX1R5cGVEZWYgKikoKAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QpKCh1aW50MzJfdClETUFNVVgxX1JlcXVlc3RHZW5lcmF0b3IwICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRE1BTVVYX1JHQ1JfU0laRSAqIChSZXF1ZXN0R2VuQ2hhbm5lbCkpKSkpCisgICAgICAgICAgICAgICAgICAgICAgIC0+UkdDUiwKKyAgICAgICAgICAgICAgICAgICBETUFNVVhfUkd4Q1JfU0lHX0lEKSk7Cit9CisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIERNQU1VWF9MTF9FRl9GTEFHX01hbmFnZW1lbnQgRkxBR19NYW5hZ2VtZW50CisgKiBAeworICovCisKKy8qKgorICogQGJyaWVmICBHZXQgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDAuCisgKiBAcm10b2xsIENTUiAgICAgICAgICBTT0YwICAgICAgICAgIExMX0RNQU1VWF9Jc0FjdGl2ZUZsYWdfU08wCisgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9ETUFNVVhfSXNBY3RpdmVGbGFnX1NPMChETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4KSB7CisgIFVOVVNFRChETUFNVVh4KTsKKyAgcmV0dXJuICgoUkVBRF9CSVQoRE1BTVVYMV9DaGFubmVsU3RhdHVzLT5DU1IsIERNQU1VWF9DU1JfU09GMCkgPT0KKyAgICAgICAgICAgKERNQU1VWF9DU1JfU09GMCkpCisgICAgICAgICAgICAgID8gMVVMCisgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBTeW5jaHJvbml6YXRpb24gRXZlbnQgT3ZlcnJ1biBGbGFnIENoYW5uZWwgMS4KKyAqIEBybXRvbGwgQ1NSICAgICAgICAgIFNPRjEgICAgICAgICAgTExfRE1BTVVYX0lzQWN0aXZlRmxhZ19TTzEKKyAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX0RNQU1VWF9Jc0FjdGl2ZUZsYWdfU08xKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpIHsKKyAgVU5VU0VEKERNQU1VWHgpOworICByZXR1cm4gKChSRUFEX0JJVChETUFNVVgxX0NoYW5uZWxTdGF0dXMtPkNTUiwgRE1BTVVYX0NTUl9TT0YxKSA9PQorICAgICAgICAgICAoRE1BTVVYX0NTUl9TT0YxKSkKKyAgICAgICAgICAgICAgPyAxVUwKKyAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCAyLgorICogQHJtdG9sbCBDU1IgICAgICAgICAgU09GMiAgICAgICAgICBMTF9ETUFNVVhfSXNBY3RpdmVGbGFnX1NPMgorICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfRE1BTVVYX0lzQWN0aXZlRmxhZ19TTzIoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCkgeworICBVTlVTRUQoRE1BTVVYeCk7CisgIHJldHVybiAoKFJFQURfQklUKERNQU1VWDFfQ2hhbm5lbFN0YXR1cy0+Q1NSLCBETUFNVVhfQ1NSX1NPRjIpID09CisgICAgICAgICAgIChETUFNVVhfQ1NSX1NPRjIpKQorICAgICAgICAgICAgICA/IDFVTAorICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDMuCisgKiBAcm10b2xsIENTUiAgICAgICAgICBTT0YzICAgICAgICAgIExMX0RNQU1VWF9Jc0FjdGl2ZUZsYWdfU08zCisgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9ETUFNVVhfSXNBY3RpdmVGbGFnX1NPMyhETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4KSB7CisgIFVOVVNFRChETUFNVVh4KTsKKyAgcmV0dXJuICgoUkVBRF9CSVQoRE1BTVVYMV9DaGFubmVsU3RhdHVzLT5DU1IsIERNQU1VWF9DU1JfU09GMykgPT0KKyAgICAgICAgICAgKERNQU1VWF9DU1JfU09GMykpCisgICAgICAgICAgICAgID8gMVVMCisgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBTeW5jaHJvbml6YXRpb24gRXZlbnQgT3ZlcnJ1biBGbGFnIENoYW5uZWwgNC4KKyAqIEBybXRvbGwgQ1NSICAgICAgICAgIFNPRjQgICAgICAgICAgTExfRE1BTVVYX0lzQWN0aXZlRmxhZ19TTzQKKyAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX0RNQU1VWF9Jc0FjdGl2ZUZsYWdfU080KERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpIHsKKyAgVU5VU0VEKERNQU1VWHgpOworICByZXR1cm4gKChSRUFEX0JJVChETUFNVVgxX0NoYW5uZWxTdGF0dXMtPkNTUiwgRE1BTVVYX0NTUl9TT0Y0KSA9PQorICAgICAgICAgICAoRE1BTVVYX0NTUl9TT0Y0KSkKKyAgICAgICAgICAgICAgPyAxVUwKKyAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCA1LgorICogQHJtdG9sbCBDU1IgICAgICAgICAgU09GNSAgICAgICAgICBMTF9ETUFNVVhfSXNBY3RpdmVGbGFnX1NPNQorICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfRE1BTVVYX0lzQWN0aXZlRmxhZ19TTzUoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCkgeworICBVTlVTRUQoRE1BTVVYeCk7CisgIHJldHVybiAoKFJFQURfQklUKERNQU1VWDFfQ2hhbm5lbFN0YXR1cy0+Q1NSLCBETUFNVVhfQ1NSX1NPRjUpID09CisgICAgICAgICAgIChETUFNVVhfQ1NSX1NPRjUpKQorICAgICAgICAgICAgICA/IDFVTAorICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDYuCisgKiBAcm10b2xsIENTUiAgICAgICAgICBTT0Y2ICAgICAgICAgIExMX0RNQU1VWF9Jc0FjdGl2ZUZsYWdfU082CisgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9ETUFNVVhfSXNBY3RpdmVGbGFnX1NPNihETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4KSB7CisgIFVOVVNFRChETUFNVVh4KTsKKyAgcmV0dXJuICgoUkVBRF9CSVQoRE1BTVVYMV9DaGFubmVsU3RhdHVzLT5DU1IsIERNQU1VWF9DU1JfU09GNikgPT0KKyAgICAgICAgICAgKERNQU1VWF9DU1JfU09GNikpCisgICAgICAgICAgICAgID8gMVVMCisgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBTeW5jaHJvbml6YXRpb24gRXZlbnQgT3ZlcnJ1biBGbGFnIENoYW5uZWwgNy4KKyAqIEBybXRvbGwgQ1NSICAgICAgICAgIFNPRjcgICAgICAgICAgTExfRE1BTVVYX0lzQWN0aXZlRmxhZ19TTzcKKyAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX0RNQU1VWF9Jc0FjdGl2ZUZsYWdfU083KERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpIHsKKyAgVU5VU0VEKERNQU1VWHgpOworICByZXR1cm4gKChSRUFEX0JJVChETUFNVVgxX0NoYW5uZWxTdGF0dXMtPkNTUiwgRE1BTVVYX0NTUl9TT0Y3KSA9PQorICAgICAgICAgICAoRE1BTVVYX0NTUl9TT0Y3KSkKKyAgICAgICAgICAgICAgPyAxVUwKKyAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCA4LgorICogQHJtdG9sbCBDU1IgICAgICAgICAgU09GOCAgICAgICAgICBMTF9ETUFNVVhfSXNBY3RpdmVGbGFnX1NPOAorICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfRE1BTVVYX0lzQWN0aXZlRmxhZ19TTzgoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCkgeworICBVTlVTRUQoRE1BTVVYeCk7CisgIHJldHVybiAoKFJFQURfQklUKERNQU1VWDFfQ2hhbm5lbFN0YXR1cy0+Q1NSLCBETUFNVVhfQ1NSX1NPRjgpID09CisgICAgICAgICAgIChETUFNVVhfQ1NSX1NPRjgpKQorICAgICAgICAgICAgICA/IDFVTAorICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDkuCisgKiBAcm10b2xsIENTUiAgICAgICAgICBTT0Y5ICAgICAgICAgIExMX0RNQU1VWF9Jc0FjdGl2ZUZsYWdfU085CisgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9ETUFNVVhfSXNBY3RpdmVGbGFnX1NPOShETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4KSB7CisgIFVOVVNFRChETUFNVVh4KTsKKyAgcmV0dXJuICgoUkVBRF9CSVQoRE1BTVVYMV9DaGFubmVsU3RhdHVzLT5DU1IsIERNQU1VWF9DU1JfU09GOSkgPT0KKyAgICAgICAgICAgKERNQU1VWF9DU1JfU09GOSkpCisgICAgICAgICAgICAgID8gMVVMCisgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBTeW5jaHJvbml6YXRpb24gRXZlbnQgT3ZlcnJ1biBGbGFnIENoYW5uZWwgMTAuCisgKiBAcm10b2xsIENTUiAgICAgICAgICBTT0YxMCAgICAgICAgIExMX0RNQU1VWF9Jc0FjdGl2ZUZsYWdfU08xMAorICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfRE1BTVVYX0lzQWN0aXZlRmxhZ19TTzEwKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpIHsKKyAgVU5VU0VEKERNQU1VWHgpOworICByZXR1cm4gKChSRUFEX0JJVChETUFNVVgxX0NoYW5uZWxTdGF0dXMtPkNTUiwgRE1BTVVYX0NTUl9TT0YxMCkgPT0KKyAgICAgICAgICAgKERNQU1VWF9DU1JfU09GMTApKQorICAgICAgICAgICAgICA/IDFVTAorICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDExLgorICogQHJtdG9sbCBDU1IgICAgICAgICAgU09GMTEgICAgICAgICBMTF9ETUFNVVhfSXNBY3RpdmVGbGFnX1NPMTEKKyAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX0RNQU1VWF9Jc0FjdGl2ZUZsYWdfU08xMShETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4KSB7CisgIFVOVVNFRChETUFNVVh4KTsKKyAgcmV0dXJuICgoUkVBRF9CSVQoRE1BTVVYMV9DaGFubmVsU3RhdHVzLT5DU1IsIERNQU1VWF9DU1JfU09GMTEpID09CisgICAgICAgICAgIChETUFNVVhfQ1NSX1NPRjExKSkKKyAgICAgICAgICAgICAgPyAxVUwKKyAgICAgICAgICAgICAgOiAwVUwpOworfQorCisjaWYgZGVmaW5lZChETUFNVVhfQ1NSX1NPRjEyKQorLyoqCisgKiBAYnJpZWYgIEdldCBTeW5jaHJvbml6YXRpb24gRXZlbnQgT3ZlcnJ1biBGbGFnIENoYW5uZWwgMTIuCisgKiBAcm10b2xsIENTUiAgICAgICAgICBTT0YxMiAgICAgICAgIExMX0RNQU1VWF9Jc0FjdGl2ZUZsYWdfU08xMgorICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfRE1BTVVYX0lzQWN0aXZlRmxhZ19TTzEyKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpIHsKKyAgVU5VU0VEKERNQU1VWHgpOworICByZXR1cm4gKChSRUFEX0JJVChETUFNVVgxX0NoYW5uZWxTdGF0dXMtPkNTUiwgRE1BTVVYX0NTUl9TT0YxMikgPT0KKyAgICAgICAgICAgKERNQU1VWF9DU1JfU09GMTIpKQorICAgICAgICAgICAgICA/IDFVTAorICAgICAgICAgICAgICA6IDBVTCk7Cit9CisjZW5kaWYgLyogRE1BTVVYX0NTUl9TT0YxMiAqLworCisjaWYgZGVmaW5lZChETUFNVVhfQ1NSX1NPRjEzKQorLyoqCisgKiBAYnJpZWYgIEdldCBTeW5jaHJvbml6YXRpb24gRXZlbnQgT3ZlcnJ1biBGbGFnIENoYW5uZWwgMTMuCisgKiBAcm10b2xsIENTUiAgICAgICAgICBTT0YxMyAgICAgICAgIExMX0RNQU1VWF9Jc0FjdGl2ZUZsYWdfU08xMworICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfRE1BTVVYX0lzQWN0aXZlRmxhZ19TTzEzKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpIHsKKyAgVU5VU0VEKERNQU1VWHgpOworICByZXR1cm4gKChSRUFEX0JJVChETUFNVVgxX0NoYW5uZWxTdGF0dXMtPkNTUiwgRE1BTVVYX0NTUl9TT0YxMykgPT0KKyAgICAgICAgICAgKERNQU1VWF9DU1JfU09GMTMpKQorICAgICAgICAgICAgICA/IDFVTAorICAgICAgICAgICAgICA6IDBVTCk7Cit9CisjZW5kaWYgLyogRE1BTVVYX0NTUl9TT0YxMyAqLworCisjaWYgZGVmaW5lZChETUFNVVhfQ1NSX1NPRjE0KQorLyoqCisgKiBAYnJpZWYgIEdldCBTeW5jaHJvbml6YXRpb24gRXZlbnQgT3ZlcnJ1biBGbGFnIENoYW5uZWwgMTQuCisgKiBAcm10b2xsIENTUiAgICAgICAgICBTT0YxMyAgICAgICAgIExMX0RNQU1VWF9Jc0FjdGl2ZUZsYWdfU08xNAorICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfRE1BTVVYX0lzQWN0aXZlRmxhZ19TTzE0KERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpIHsKKyAgVU5VU0VEKERNQU1VWHgpOworICByZXR1cm4gKChSRUFEX0JJVChETUFNVVgxX0NoYW5uZWxTdGF0dXMtPkNTUiwgRE1BTVVYX0NTUl9TT0YxNCkgPT0KKyAgICAgICAgICAgKERNQU1VWF9DU1JfU09GMTQpKQorICAgICAgICAgICAgICA/IDFVTAorICAgICAgICAgICAgICA6IDBVTCk7Cit9CisjZW5kaWYgLyogRE1BTVVYX0NTUl9TT0YxNCAqLworCisjaWYgZGVmaW5lZChETUFNVVhfQ1NSX1NPRjE1KQorLyoqCisgKiBAYnJpZWYgIEdldCBTeW5jaHJvbml6YXRpb24gRXZlbnQgT3ZlcnJ1biBGbGFnIENoYW5uZWwgMTUuCisgKiBAcm10b2xsIENTUiAgICAgICAgICBTT0YxMyAgICAgICAgIExMX0RNQU1VWF9Jc0FjdGl2ZUZsYWdfU08xNQorICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfRE1BTVVYX0lzQWN0aXZlRmxhZ19TTzE1KERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpIHsKKyAgVU5VU0VEKERNQU1VWHgpOworICByZXR1cm4gKChSRUFEX0JJVChETUFNVVgxX0NoYW5uZWxTdGF0dXMtPkNTUiwgRE1BTVVYX0NTUl9TT0YxNSkgPT0KKyAgICAgICAgICAgKERNQU1VWF9DU1JfU09GMTUpKQorICAgICAgICAgICAgICA/IDFVTAorICAgICAgICAgICAgICA6IDBVTCk7Cit9CisjZW5kaWYgLyogRE1BTVVYX0NTUl9TT0YxNSAqLworCisvKioKKyAqIEBicmllZiAgR2V0IFJlcXVlc3QgR2VuZXJhdG9yIDAgVHJpZ2dlciBFdmVudCBPdmVycnVuIEZsYWcuCisgKiBAcm10b2xsIFJHU1IgICAgICAgICBPRjAgICAgICAgICAgIExMX0RNQU1VWF9Jc0FjdGl2ZUZsYWdfUkdPMAorICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfRE1BTVVYX0lzQWN0aXZlRmxhZ19SR08wKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpIHsKKyAgVU5VU0VEKERNQU1VWHgpOworICByZXR1cm4gKChSRUFEX0JJVChETUFNVVgxX1JlcXVlc3RHZW5TdGF0dXMtPlJHU1IsIERNQU1VWF9SR1NSX09GMCkgPT0KKyAgICAgICAgICAgKERNQU1VWF9SR1NSX09GMCkpCisgICAgICAgICAgICAgID8gMVVMCisgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBSZXF1ZXN0IEdlbmVyYXRvciAxIFRyaWdnZXIgRXZlbnQgT3ZlcnJ1biBGbGFnLgorICogQHJtdG9sbCBSR1NSICAgICAgICAgT0YxICAgICAgICAgICBMTF9ETUFNVVhfSXNBY3RpdmVGbGFnX1JHTzEKKyAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX0RNQU1VWF9Jc0FjdGl2ZUZsYWdfUkdPMShETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4KSB7CisgIFVOVVNFRChETUFNVVh4KTsKKyAgcmV0dXJuICgoUkVBRF9CSVQoRE1BTVVYMV9SZXF1ZXN0R2VuU3RhdHVzLT5SR1NSLCBETUFNVVhfUkdTUl9PRjEpID09CisgICAgICAgICAgIChETUFNVVhfUkdTUl9PRjEpKQorICAgICAgICAgICAgICA/IDFVTAorICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgUmVxdWVzdCBHZW5lcmF0b3IgMiBUcmlnZ2VyIEV2ZW50IE92ZXJydW4gRmxhZy4KKyAqIEBybXRvbGwgUkdTUiAgICAgICAgIE9GMiAgICAgICAgICAgTExfRE1BTVVYX0lzQWN0aXZlRmxhZ19SR08yCisgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9ETUFNVVhfSXNBY3RpdmVGbGFnX1JHTzIoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCkgeworICBVTlVTRUQoRE1BTVVYeCk7CisgIHJldHVybiAoKFJFQURfQklUKERNQU1VWDFfUmVxdWVzdEdlblN0YXR1cy0+UkdTUiwgRE1BTVVYX1JHU1JfT0YyKSA9PQorICAgICAgICAgICAoRE1BTVVYX1JHU1JfT0YyKSkKKyAgICAgICAgICAgICAgPyAxVUwKKyAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IFJlcXVlc3QgR2VuZXJhdG9yIDMgVHJpZ2dlciBFdmVudCBPdmVycnVuIEZsYWcuCisgKiBAcm10b2xsIFJHU1IgICAgICAgICBPRjMgICAgICAgICAgIExMX0RNQU1VWF9Jc0FjdGl2ZUZsYWdfUkdPMworICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfRE1BTVVYX0lzQWN0aXZlRmxhZ19SR08zKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpIHsKKyAgVU5VU0VEKERNQU1VWHgpOworICByZXR1cm4gKChSRUFEX0JJVChETUFNVVgxX1JlcXVlc3RHZW5TdGF0dXMtPlJHU1IsIERNQU1VWF9SR1NSX09GMykgPT0KKyAgICAgICAgICAgKERNQU1VWF9SR1NSX09GMykpCisgICAgICAgICAgICAgID8gMVVMCisgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENsZWFyIFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCAwLgorICogQHJtdG9sbCBDRlIgICAgICAgICAgQ1NPRjAgICAgICAgICBMTF9ETUFNVVhfQ2xlYXJGbGFnX1NPMAorICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9DbGVhckZsYWdfU08wKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpIHsKKyAgVU5VU0VEKERNQU1VWHgpOworICBTRVRfQklUKERNQU1VWDFfQ2hhbm5lbFN0YXR1cy0+Q0ZSLCBETUFNVVhfQ0ZSX0NTT0YwKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENsZWFyIFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCAxLgorICogQHJtdG9sbCBDRlIgICAgICAgICAgQ1NPRjEgICAgICAgICBMTF9ETUFNVVhfQ2xlYXJGbGFnX1NPMQorICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9DbGVhckZsYWdfU08xKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpIHsKKyAgVU5VU0VEKERNQU1VWHgpOworICBTRVRfQklUKERNQU1VWDFfQ2hhbm5lbFN0YXR1cy0+Q0ZSLCBETUFNVVhfQ0ZSX0NTT0YxKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENsZWFyIFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCAyLgorICogQHJtdG9sbCBDRlIgICAgICAgICAgQ1NPRjIgICAgICAgICBMTF9ETUFNVVhfQ2xlYXJGbGFnX1NPMgorICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9DbGVhckZsYWdfU08yKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpIHsKKyAgVU5VU0VEKERNQU1VWHgpOworICBTRVRfQklUKERNQU1VWDFfQ2hhbm5lbFN0YXR1cy0+Q0ZSLCBETUFNVVhfQ0ZSX0NTT0YyKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENsZWFyIFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCAzLgorICogQHJtdG9sbCBDRlIgICAgICAgICAgQ1NPRjMgICAgICAgICBMTF9ETUFNVVhfQ2xlYXJGbGFnX1NPMworICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9DbGVhckZsYWdfU08zKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpIHsKKyAgVU5VU0VEKERNQU1VWHgpOworICBTRVRfQklUKERNQU1VWDFfQ2hhbm5lbFN0YXR1cy0+Q0ZSLCBETUFNVVhfQ0ZSX0NTT0YzKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENsZWFyIFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCA0LgorICogQHJtdG9sbCBDRlIgICAgICAgICAgQ1NPRjQgICAgICAgICBMTF9ETUFNVVhfQ2xlYXJGbGFnX1NPNAorICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9DbGVhckZsYWdfU080KERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpIHsKKyAgVU5VU0VEKERNQU1VWHgpOworICBTRVRfQklUKERNQU1VWDFfQ2hhbm5lbFN0YXR1cy0+Q0ZSLCBETUFNVVhfQ0ZSX0NTT0Y0KTsKK30KKworLyoqCisgKiBAYnJpZWYgIENsZWFyIFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCA1LgorICogQHJtdG9sbCBDRlIgICAgICAgICAgQ1NPRjUgICAgICAgICBMTF9ETUFNVVhfQ2xlYXJGbGFnX1NPNQorICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9DbGVhckZsYWdfU081KERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpIHsKKyAgVU5VU0VEKERNQU1VWHgpOworICBTRVRfQklUKERNQU1VWDFfQ2hhbm5lbFN0YXR1cy0+Q0ZSLCBETUFNVVhfQ0ZSX0NTT0Y1KTsKK30KKworLyoqCisgKiBAYnJpZWYgIENsZWFyIFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCA2LgorICogQHJtdG9sbCBDRlIgICAgICAgICAgQ1NPRjYgICAgICAgICBMTF9ETUFNVVhfQ2xlYXJGbGFnX1NPNgorICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9DbGVhckZsYWdfU082KERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpIHsKKyAgVU5VU0VEKERNQU1VWHgpOworICBTRVRfQklUKERNQU1VWDFfQ2hhbm5lbFN0YXR1cy0+Q0ZSLCBETUFNVVhfQ0ZSX0NTT0Y2KTsKK30KKworLyoqCisgKiBAYnJpZWYgIENsZWFyIFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCA3LgorICogQHJtdG9sbCBDRlIgICAgICAgICAgQ1NPRjcgICAgICAgICBMTF9ETUFNVVhfQ2xlYXJGbGFnX1NPNworICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9DbGVhckZsYWdfU083KERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpIHsKKyAgVU5VU0VEKERNQU1VWHgpOworICBTRVRfQklUKERNQU1VWDFfQ2hhbm5lbFN0YXR1cy0+Q0ZSLCBETUFNVVhfQ0ZSX0NTT0Y3KTsKK30KKworLyoqCisgKiBAYnJpZWYgIENsZWFyIFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCA4LgorICogQHJtdG9sbCBDRlIgICAgICAgICAgQ1NPRjggICAgICAgICBMTF9ETUFNVVhfQ2xlYXJGbGFnX1NPOAorICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9DbGVhckZsYWdfU084KERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpIHsKKyAgVU5VU0VEKERNQU1VWHgpOworICBTRVRfQklUKERNQU1VWDFfQ2hhbm5lbFN0YXR1cy0+Q0ZSLCBETUFNVVhfQ0ZSX0NTT0Y4KTsKK30KKworLyoqCisgKiBAYnJpZWYgIENsZWFyIFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCA5LgorICogQHJtdG9sbCBDRlIgICAgICAgICAgQ1NPRjkgICAgICAgICBMTF9ETUFNVVhfQ2xlYXJGbGFnX1NPOQorICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9DbGVhckZsYWdfU085KERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpIHsKKyAgVU5VU0VEKERNQU1VWHgpOworICBTRVRfQklUKERNQU1VWDFfQ2hhbm5lbFN0YXR1cy0+Q0ZSLCBETUFNVVhfQ0ZSX0NTT0Y5KTsKK30KKworLyoqCisgKiBAYnJpZWYgIENsZWFyIFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCAxMC4KKyAqIEBybXRvbGwgQ0ZSICAgICAgICAgIENTT0YxMCAgICAgICAgTExfRE1BTVVYX0NsZWFyRmxhZ19TTzEwCisgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BTVVYX0NsZWFyRmxhZ19TTzEwKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpIHsKKyAgVU5VU0VEKERNQU1VWHgpOworICBTRVRfQklUKERNQU1VWDFfQ2hhbm5lbFN0YXR1cy0+Q0ZSLCBETUFNVVhfQ0ZSX0NTT0YxMCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDbGVhciBTeW5jaHJvbml6YXRpb24gRXZlbnQgT3ZlcnJ1biBGbGFnIENoYW5uZWwgMTEuCisgKiBAcm10b2xsIENGUiAgICAgICAgICBDU09GMTEgICAgICAgIExMX0RNQU1VWF9DbGVhckZsYWdfU08xMQorICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9DbGVhckZsYWdfU08xMShETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4KSB7CisgIFVOVVNFRChETUFNVVh4KTsKKyAgU0VUX0JJVChETUFNVVgxX0NoYW5uZWxTdGF0dXMtPkNGUiwgRE1BTVVYX0NGUl9DU09GMTEpOworfQorCisjaWYgZGVmaW5lZChETUFNVVhfQ0ZSX0NTT0YxMikKKy8qKgorICogQGJyaWVmICBDbGVhciBTeW5jaHJvbml6YXRpb24gRXZlbnQgT3ZlcnJ1biBGbGFnIENoYW5uZWwgMTIuCisgKiBAcm10b2xsIENGUiAgICAgICAgICBDU09GMTIgICAgICAgIExMX0RNQU1VWF9DbGVhckZsYWdfU08xMgorICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9DbGVhckZsYWdfU08xMihETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4KSB7CisgIFVOVVNFRChETUFNVVh4KTsKKyAgU0VUX0JJVChETUFNVVgxX0NoYW5uZWxTdGF0dXMtPkNGUiwgRE1BTVVYX0NGUl9DU09GMTIpOworfQorI2VuZGlmIC8qIERNQU1VWF9DRlJfQ1NPRjEyICovCisKKyNpZiBkZWZpbmVkKERNQU1VWF9DRlJfQ1NPRjEzKQorLyoqCisgKiBAYnJpZWYgIENsZWFyIFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCAxMy4KKyAqIEBybXRvbGwgQ0ZSICAgICAgICAgIENTT0YxMyAgICAgICAgTExfRE1BTVVYX0NsZWFyRmxhZ19TTzEzCisgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BTVVYX0NsZWFyRmxhZ19TTzEzKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpIHsKKyAgVU5VU0VEKERNQU1VWHgpOworICBTRVRfQklUKERNQU1VWDFfQ2hhbm5lbFN0YXR1cy0+Q0ZSLCBETUFNVVhfQ0ZSX0NTT0YxMyk7Cit9CisjZW5kaWYgLyogRE1BTVVYX0NGUl9DU09GMTMgKi8KKworI2lmIGRlZmluZWQoRE1BTVVYX0NGUl9DU09GMTQpCisvKioKKyAqIEBicmllZiAgQ2xlYXIgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDE0LgorICogQHJtdG9sbCBDRlIgICAgICAgICAgQ1NPRjE0ICAgICAgICBMTF9ETUFNVVhfQ2xlYXJGbGFnX1NPMTQKKyAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFNVVhfQ2xlYXJGbGFnX1NPMTQoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCkgeworICBVTlVTRUQoRE1BTVVYeCk7CisgIFNFVF9CSVQoRE1BTVVYMV9DaGFubmVsU3RhdHVzLT5DRlIsIERNQU1VWF9DRlJfQ1NPRjE0KTsKK30KKyNlbmRpZiAvKiBETUFNVVhfQ0ZSX0NTT0YxNCAqLworCisjaWYgZGVmaW5lZChETUFNVVhfQ0ZSX0NTT0YxNSkKKy8qKgorICogQGJyaWVmICBDbGVhciBTeW5jaHJvbml6YXRpb24gRXZlbnQgT3ZlcnJ1biBGbGFnIENoYW5uZWwgMTUuCisgKiBAcm10b2xsIENGUiAgICAgICAgICBDU09GMTUgICAgICAgIExMX0RNQU1VWF9DbGVhckZsYWdfU08xNQorICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9DbGVhckZsYWdfU08xNShETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4KSB7CisgIFVOVVNFRChETUFNVVh4KTsKKyAgU0VUX0JJVChETUFNVVgxX0NoYW5uZWxTdGF0dXMtPkNGUiwgRE1BTVVYX0NGUl9DU09GMTUpOworfQorI2VuZGlmIC8qIERNQU1VWF9DRlJfQ1NPRjE1ICovCisKKy8qKgorICogQGJyaWVmICBDbGVhciBSZXF1ZXN0IEdlbmVyYXRvciAwIFRyaWdnZXIgRXZlbnQgT3ZlcnJ1biBGbGFnLgorICogQHJtdG9sbCBSR0NGUiAgICAgICAgQ09GMCAgICAgICAgICBMTF9ETUFNVVhfQ2xlYXJGbGFnX1JHTzAKKyAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFNVVhfQ2xlYXJGbGFnX1JHTzAoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCkgeworICBVTlVTRUQoRE1BTVVYeCk7CisgIFNFVF9CSVQoRE1BTVVYMV9SZXF1ZXN0R2VuU3RhdHVzLT5SR0NGUiwgRE1BTVVYX1JHQ0ZSX0NPRjApOworfQorCisvKioKKyAqIEBicmllZiAgQ2xlYXIgUmVxdWVzdCBHZW5lcmF0b3IgMSBUcmlnZ2VyIEV2ZW50IE92ZXJydW4gRmxhZy4KKyAqIEBybXRvbGwgUkdDRlIgICAgICAgIENPRjEgICAgICAgICAgTExfRE1BTVVYX0NsZWFyRmxhZ19SR08xCisgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BTVVYX0NsZWFyRmxhZ19SR08xKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpIHsKKyAgVU5VU0VEKERNQU1VWHgpOworICBTRVRfQklUKERNQU1VWDFfUmVxdWVzdEdlblN0YXR1cy0+UkdDRlIsIERNQU1VWF9SR0NGUl9DT0YxKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENsZWFyIFJlcXVlc3QgR2VuZXJhdG9yIDIgVHJpZ2dlciBFdmVudCBPdmVycnVuIEZsYWcuCisgKiBAcm10b2xsIFJHQ0ZSICAgICAgICBDT0YyICAgICAgICAgIExMX0RNQU1VWF9DbGVhckZsYWdfUkdPMgorICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9DbGVhckZsYWdfUkdPMihETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4KSB7CisgIFVOVVNFRChETUFNVVh4KTsKKyAgU0VUX0JJVChETUFNVVgxX1JlcXVlc3RHZW5TdGF0dXMtPlJHQ0ZSLCBETUFNVVhfUkdDRlJfQ09GMik7Cit9CisKKy8qKgorICogQGJyaWVmICBDbGVhciBSZXF1ZXN0IEdlbmVyYXRvciAzIFRyaWdnZXIgRXZlbnQgT3ZlcnJ1biBGbGFnLgorICogQHJtdG9sbCBSR0NGUiAgICAgICAgQ09GMyAgICAgICAgICBMTF9ETUFNVVhfQ2xlYXJGbGFnX1JHTzMKKyAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFNVVhfQ2xlYXJGbGFnX1JHTzMoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCkgeworICBVTlVTRUQoRE1BTVVYeCk7CisgIFNFVF9CSVQoRE1BTVVYMV9SZXF1ZXN0R2VuU3RhdHVzLT5SR0NGUiwgRE1BTVVYX1JHQ0ZSX0NPRjMpOworfQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBETUFNVVhfTExfRUZfSVRfTWFuYWdlbWVudCBJVF9NYW5hZ2VtZW50CisgKiBAeworICovCisKKy8qKgorICogQGJyaWVmICBFbmFibGUgdGhlIFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEludGVycnVwdCBvbiBETUFNVVggY2hhbm5lbAorICogeC4KKyAqIEBybXRvbGwgQ3hDUiAgICAgICAgIFNPSUUgICAgICAgICAgTExfRE1BTVVYX0VuYWJsZUlUX1NPCisgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8wCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8zCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF80CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF81CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF82CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF83CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF84CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF85CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMworICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzE1CisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BTVVYX0VuYWJsZUlUX1NPKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCkgeworICAodm9pZCkoRE1BTVVYeCk7CisgIFNFVF9CSVQoKERNQU1VWDFfQ2hhbm5lbDAgKyBDaGFubmVsKS0+Q0NSLCBETUFNVVhfQ3hDUl9TT0lFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgdGhlIFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEludGVycnVwdCBvbiBETUFNVVggY2hhbm5lbAorICogeC4KKyAqIEBybXRvbGwgQ3hDUiAgICAgICAgIFNPSUUgICAgICAgICAgTExfRE1BTVVYX0Rpc2FibGVJVF9TTworICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMworICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNworICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfOAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfOQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzExCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzE0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xNQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9EaXNhYmxlSVRfU08oRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCkgeworICAodm9pZCkoRE1BTVVYeCk7CisgIENMRUFSX0JJVCgoRE1BTVVYMV9DaGFubmVsMCArIENoYW5uZWwpLT5DQ1IsIERNQU1VWF9DeENSX1NPSUUpOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEludGVycnVwdCBvbiBETUFNVVgKKyAqIGNoYW5uZWwgeCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICogQHJtdG9sbCBDeENSICAgICAgICAgU09JRSAgICAgICAgICBMTF9ETUFNVVhfSXNFbmFibGVkSVRfU08KKyAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlCisgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xNAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTUKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX0RNQU1VWF9Jc0VuYWJsZWRJVF9TTyhETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4LCB1aW50MzJfdCBDaGFubmVsKSB7CisgICh2b2lkKShETUFNVVh4KTsKKyAgcmV0dXJuICgoKFJFQURfQklUKChETUFNVVgxX0NoYW5uZWwwICsgQ2hhbm5lbCktPkNDUiwgRE1BTVVYX0N4Q1JfU09JRSkpID09CisgICAgICAgICAgIChETUFNVVhfQ3hDUl9TT0lFKSkKKyAgICAgICAgICAgICAgPyAxVUwKKyAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIHRoZSBSZXF1ZXN0IEdlbmVyYXRpb24gVHJpZ2dlciBFdmVudCBPdmVycnVuIEludGVycnVwdCBvbgorICogRE1BTVVYIGNoYW5uZWwgeC4KKyAqIEBybXRvbGwgUkd4Q1IgICAgICAgIE9JRSAgICAgICAgICAgTExfRE1BTVVYX0VuYWJsZUlUX1JHTworICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAqIEBwYXJhbSAgUmVxdWVzdEdlbkNoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzMKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFNVVhfRW5hYmxlSVRfUkdPKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFJlcXVlc3RHZW5DaGFubmVsKSB7CisgIFVOVVNFRChETUFNVVh4KTsKKyAgU0VUX0JJVCgoKERNQU1VWF9SZXF1ZXN0R2VuX1R5cGVEZWYgKikoKAorICAgICAgICAgICAgICAgdWludDMyX3QpKCh1aW50MzJfdClETUFNVVgxX1JlcXVlc3RHZW5lcmF0b3IwICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAoRE1BTVVYX1JHQ1JfU0laRSAqIChSZXF1ZXN0R2VuQ2hhbm5lbCkpKSkpCisgICAgICAgICAgICAgIC0+UkdDUiwKKyAgICAgICAgICBETUFNVVhfUkd4Q1JfT0lFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgdGhlIFJlcXVlc3QgR2VuZXJhdGlvbiBUcmlnZ2VyIEV2ZW50IE92ZXJydW4gSW50ZXJydXB0IG9uCisgKiBETUFNVVggY2hhbm5lbCB4LgorICogQHJtdG9sbCBSR3hDUiAgICAgICAgT0lFICAgICAgICAgICBMTF9ETUFNVVhfRGlzYWJsZUlUX1JHTworICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAqIEBwYXJhbSAgUmVxdWVzdEdlbkNoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzMKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFNVVhfRGlzYWJsZUlUX1JHTyhETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUmVxdWVzdEdlbkNoYW5uZWwpIHsKKyAgVU5VU0VEKERNQU1VWHgpOworICBDTEVBUl9CSVQoKChETUFNVVhfUmVxdWVzdEdlbl9UeXBlRGVmICopKCgKKyAgICAgICAgICAgICAgICAgdWludDMyX3QpKCh1aW50MzJfdClETUFNVVgxX1JlcXVlc3RHZW5lcmF0b3IwICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChETUFNVVhfUkdDUl9TSVpFICogKFJlcXVlc3RHZW5DaGFubmVsKSkpKSkKKyAgICAgICAgICAgICAgICAtPlJHQ1IsCisgICAgICAgICAgICBETUFNVVhfUkd4Q1JfT0lFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBSZXF1ZXN0IEdlbmVyYXRpb24gVHJpZ2dlciBFdmVudCBPdmVycnVuIEludGVycnVwdCBvbgorICogRE1BTVVYIGNoYW5uZWwgeCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICogQHJtdG9sbCBSR3hDUiAgICAgICAgT0lFICAgICAgICAgICBMTF9ETUFNVVhfSXNFbmFibGVkSVRfUkdPCisgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICogQHBhcmFtICBSZXF1ZXN0R2VuQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMAorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMQorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMgorICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMworICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFNVVhfSXNFbmFibGVkSVRfUkdPKAorICAgIERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgsIHVpbnQzMl90IFJlcXVlc3RHZW5DaGFubmVsKSB7CisgIFVOVVNFRChETUFNVVh4KTsKKyAgcmV0dXJuICgoUkVBRF9CSVQoKChETUFNVVhfUmVxdWVzdEdlbl9UeXBlRGVmICopKCgKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCkoKHVpbnQzMl90KURNQU1VWDFfUmVxdWVzdEdlbmVyYXRvcjAgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRE1BTVVYX1JHQ1JfU0laRSAqIChSZXF1ZXN0R2VuQ2hhbm5lbCkpKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAtPlJHQ1IsCisgICAgICAgICAgICAgICAgICAgIERNQU1VWF9SR3hDUl9PSUUpID09IChETUFNVVhfUkd4Q1JfT0lFKSkKKyAgICAgICAgICAgICAgPyAxVUwKKyAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisjZW5kaWYgLyogRE1BTVVYMSAqLworCisvKioKKyAqIEB9CisgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fU1RNMzJHNHh4X0xMX0RNQU1VWF9IICovCmRpZmYgLS1naXQgYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9sbF9leHRpLmggYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9sbF9leHRpLmgKaW5kZXggYTQwYzZlMi4uMGQ4ZmRmYiAxMDA2NDQKLS0tIGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfbGxfZXh0aS5oCisrKyBiL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9JbmMvc3RtMzJnNHh4X2xsX2V4dGkuaApAQCAtMSwxMzkyICsxLDEzOTIgQEAKLS8qKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBAZmlsZSAgICBzdG0zMmc0eHhfbGxfZXh0aS5oDQotICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0NCi0gKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBFWFRJIExMIG1vZHVsZS4NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQGF0dGVudGlvbg0KLSAqDQotICogQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KLSAqDQotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0ZXJtcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlDQotICogaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc29mdHdhcmUgY29tcG9uZW50Lg0KLSAqIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcyB3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLg0KLSAqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqLw0KLQ0KLS8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotI2lmbmRlZiBfX1NUTTMyRzR4eF9MTF9FWFRJX0gNCi0jZGVmaW5lIF9fU1RNMzJHNHh4X0xMX0VYVElfSA0KLQ0KLSNpZmRlZiBfX2NwbHVzcGx1cw0KLWV4dGVybiAiQyIgew0KLSNlbmRpZg0KLQ0KLS8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotI2luY2x1ZGUgInN0bTMyZzR4eC5oIg0KLQ0KLS8qKiBAYWRkdG9ncm91cCBTVE0zMkc0eHhfTExfRHJpdmVyDQotICogQHsNCi0gKi8NCi0NCi0jaWYgZGVmaW5lZChFWFRJKQ0KLQ0KLS8qKiBAZGVmZ3JvdXAgRVhUSV9MTCBFWFRJDQotICogQHsNCi0gKi8NCi0NCi0vKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiBQcml2YXRlIE1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikNCi0vKiogQGRlZmdyb3VwIEVYVElfTExfUHJpdmF0ZV9NYWNyb3MgRVhUSSBQcml2YXRlIE1hY3Jvcw0KLSAqIEB7DQotICovDQotLyoqDQotICogQH0NCi0gKi8NCi0jZW5kaWYgLypVU0VfRlVMTF9MTF9EUklWRVIqLw0KLS8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQ0KLS8qKiBAZGVmZ3JvdXAgRVhUSV9MTF9FU19JTklUIEVYVEkgRXhwb3J0ZWQgSW5pdCBzdHJ1Y3R1cmUNCi0gKiBAew0KLSAqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gIHVpbnQzMl90IExpbmVfMF8zMTsgLyohPCBTcGVjaWZpZXMgdGhlIEVYVEkgbGluZXMgdG8gYmUgZW5hYmxlZCBvciBkaXNhYmxlZA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgTGluZXMgaW4gcmFuZ2UgMCB0byAzMSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55DQotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbWJpbmF0aW9uIG9mIEByZWYgRVhUSV9MTF9FQ19MSU5FICovDQotDQotICB1aW50MzJfdCBMaW5lXzMyXzYzOyAvKiE8IFNwZWNpZmllcyB0aGUgRVhUSSBsaW5lcyB0byBiZSBlbmFibGVkIG9yIGRpc2FibGVkDQotICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgTGluZXMgaW4gcmFuZ2UgMzIgdG8gNjMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29tYmluYXRpb24gb2YgQHJlZiBFWFRJX0xMX0VDX0xJTkUgKi8NCi0NCi0gIEZ1bmN0aW9uYWxTdGF0ZQ0KLSAgICAgIExpbmVDb21tYW5kOyAvKiE8IFNwZWNpZmllcyB0aGUgbmV3IHN0YXRlIG9mIHRoZSBzZWxlY3RlZCBFWFRJIGxpbmVzLg0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBzZXQgZWl0aGVyIHRvIEVOQUJMRSBvciBESVNBQkxFICovDQotDQotICB1aW50OF90IE1vZGU7IC8qITwgU3BlY2lmaWVzIHRoZSBtb2RlIGZvciB0aGUgRVhUSSBsaW5lcy4NCi0gICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEVYVElfTExfRUNfTU9ERS4gKi8NCi0NCi0gIHVpbnQ4X3QNCi0gICAgICBUcmlnZ2VyOyAvKiE8IFNwZWNpZmllcyB0aGUgdHJpZ2dlciBzaWduYWwgYWN0aXZlIGVkZ2UgZm9yIHRoZSBFWFRJIGxpbmVzLg0KLSAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBFWFRJX0xMX0VDX1RSSUdHRVIuICovDQotfSBMTF9FWFRJX0luaXRUeXBlRGVmOw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotI2VuZGlmIC8qVVNFX0ZVTExfTExfRFJJVkVSKi8NCi0NCi0vKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgRVhUSV9MTF9FeHBvcnRlZF9Db25zdGFudHMgRVhUSSBFeHBvcnRlZCBDb25zdGFudHMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRVhUSV9MTF9FQ19MSU5FIExJTkUNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfRVhUSV9MSU5FXzAgRVhUSV9JTVIxX0lNMCAgIC8qITwgRXh0ZW5kZWQgbGluZSAwICovDQotI2RlZmluZSBMTF9FWFRJX0xJTkVfMSBFWFRJX0lNUjFfSU0xICAgLyohPCBFeHRlbmRlZCBsaW5lIDEgKi8NCi0jZGVmaW5lIExMX0VYVElfTElORV8yIEVYVElfSU1SMV9JTTIgICAvKiE8IEV4dGVuZGVkIGxpbmUgMiAqLw0KLSNkZWZpbmUgTExfRVhUSV9MSU5FXzMgRVhUSV9JTVIxX0lNMyAgIC8qITwgRXh0ZW5kZWQgbGluZSAzICovDQotI2RlZmluZSBMTF9FWFRJX0xJTkVfNCBFWFRJX0lNUjFfSU00ICAgLyohPCBFeHRlbmRlZCBsaW5lIDQgKi8NCi0jZGVmaW5lIExMX0VYVElfTElORV81IEVYVElfSU1SMV9JTTUgICAvKiE8IEV4dGVuZGVkIGxpbmUgNSAqLw0KLSNkZWZpbmUgTExfRVhUSV9MSU5FXzYgRVhUSV9JTVIxX0lNNiAgIC8qITwgRXh0ZW5kZWQgbGluZSA2ICovDQotI2RlZmluZSBMTF9FWFRJX0xJTkVfNyBFWFRJX0lNUjFfSU03ICAgLyohPCBFeHRlbmRlZCBsaW5lIDcgKi8NCi0jZGVmaW5lIExMX0VYVElfTElORV84IEVYVElfSU1SMV9JTTggICAvKiE8IEV4dGVuZGVkIGxpbmUgOCAqLw0KLSNkZWZpbmUgTExfRVhUSV9MSU5FXzkgRVhUSV9JTVIxX0lNOSAgIC8qITwgRXh0ZW5kZWQgbGluZSA5ICovDQotI2RlZmluZSBMTF9FWFRJX0xJTkVfMTAgRVhUSV9JTVIxX0lNMTAgLyohPCBFeHRlbmRlZCBsaW5lIDEwICovDQotI2RlZmluZSBMTF9FWFRJX0xJTkVfMTEgRVhUSV9JTVIxX0lNMTEgLyohPCBFeHRlbmRlZCBsaW5lIDExICovDQotI2RlZmluZSBMTF9FWFRJX0xJTkVfMTIgRVhUSV9JTVIxX0lNMTIgLyohPCBFeHRlbmRlZCBsaW5lIDEyICovDQotI2RlZmluZSBMTF9FWFRJX0xJTkVfMTMgRVhUSV9JTVIxX0lNMTMgLyohPCBFeHRlbmRlZCBsaW5lIDEzICovDQotI2RlZmluZSBMTF9FWFRJX0xJTkVfMTQgRVhUSV9JTVIxX0lNMTQgLyohPCBFeHRlbmRlZCBsaW5lIDE0ICovDQotI2RlZmluZSBMTF9FWFRJX0xJTkVfMTUgRVhUSV9JTVIxX0lNMTUgLyohPCBFeHRlbmRlZCBsaW5lIDE1ICovDQotI2lmIGRlZmluZWQoRVhUSV9JTVIxX0lNMTYpDQotI2RlZmluZSBMTF9FWFRJX0xJTkVfMTYgRVhUSV9JTVIxX0lNMTYgLyohPCBFeHRlbmRlZCBsaW5lIDE2ICovDQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRVhUSV9JTVIxX0lNMTYgKi8NCi0jZGVmaW5lIExMX0VYVElfTElORV8xNyBFWFRJX0lNUjFfSU0xNyAvKiE8IEV4dGVuZGVkIGxpbmUgMTcgKi8NCi0jaWYgZGVmaW5lZChFWFRJX0lNUjFfSU0xOCkNCi0jZGVmaW5lIExMX0VYVElfTElORV8xOCBFWFRJX0lNUjFfSU0xOCAvKiE8IEV4dGVuZGVkIGxpbmUgMTggKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFWFRJX0lNUjFfSU0xOCAqLw0KLSNkZWZpbmUgTExfRVhUSV9MSU5FXzE5IEVYVElfSU1SMV9JTTE5IC8qITwgRXh0ZW5kZWQgbGluZSAxOSAqLw0KLSNpZiBkZWZpbmVkKEVYVElfSU1SMV9JTTIwKQ0KLSNkZWZpbmUgTExfRVhUSV9MSU5FXzIwIEVYVElfSU1SMV9JTTIwIC8qITwgRXh0ZW5kZWQgbGluZSAyMCAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVYVElfSU1SMV9JTTIwICovDQotI2lmIGRlZmluZWQoRVhUSV9JTVIxX0lNMjEpDQotI2RlZmluZSBMTF9FWFRJX0xJTkVfMjEgRVhUSV9JTVIxX0lNMjEgLyohPCBFeHRlbmRlZCBsaW5lIDIxICovDQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRVhUSV9JTVIxX0lNMjEgKi8NCi0jaWYgZGVmaW5lZChFWFRJX0lNUjFfSU0yMikNCi0jZGVmaW5lIExMX0VYVElfTElORV8yMiBFWFRJX0lNUjFfSU0yMiAvKiE8IEV4dGVuZGVkIGxpbmUgMjIgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFWFRJX0lNUjFfSU0yMiAqLw0KLSNkZWZpbmUgTExfRVhUSV9MSU5FXzIzIEVYVElfSU1SMV9JTTIzIC8qITwgRXh0ZW5kZWQgbGluZSAyMyAqLw0KLSNpZiBkZWZpbmVkKEVYVElfSU1SMV9JTTI0KQ0KLSNkZWZpbmUgTExfRVhUSV9MSU5FXzI0IEVYVElfSU1SMV9JTTI0IC8qITwgRXh0ZW5kZWQgbGluZSAyNCAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVYVElfSU1SMV9JTTI0ICovDQotI2lmIGRlZmluZWQoRVhUSV9JTVIxX0lNMjUpDQotI2RlZmluZSBMTF9FWFRJX0xJTkVfMjUgRVhUSV9JTVIxX0lNMjUgLyohPCBFeHRlbmRlZCBsaW5lIDI1ICovDQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRVhUSV9JTVIxX0lNMjUgKi8NCi0jaWYgZGVmaW5lZChFWFRJX0lNUjFfSU0yNikNCi0jZGVmaW5lIExMX0VYVElfTElORV8yNiBFWFRJX0lNUjFfSU0yNiAvKiE8IEV4dGVuZGVkIGxpbmUgMjYgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFWFRJX0lNUjFfSU0yNiAqLw0KLSNpZiBkZWZpbmVkKEVYVElfSU1SMV9JTTI3KQ0KLSNkZWZpbmUgTExfRVhUSV9MSU5FXzI3IEVYVElfSU1SMV9JTTI3IC8qITwgRXh0ZW5kZWQgbGluZSAyNyAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVYVElfSU1SMV9JTTI3ICovDQotI2lmIGRlZmluZWQoRVhUSV9JTVIxX0lNMjgpDQotI2RlZmluZSBMTF9FWFRJX0xJTkVfMjggRVhUSV9JTVIxX0lNMjggLyohPCBFeHRlbmRlZCBsaW5lIDI4ICovDQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRVhUSV9JTVIxX0lNMjggKi8NCi0jaWYgZGVmaW5lZChFWFRJX0lNUjFfSU0yOSkNCi0jZGVmaW5lIExMX0VYVElfTElORV8yOSBFWFRJX0lNUjFfSU0yOSAvKiE8IEV4dGVuZGVkIGxpbmUgMjkgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFWFRJX0lNUjFfSU0yOSAqLw0KLSNpZiBkZWZpbmVkKEVYVElfSU1SMV9JTTMwKQ0KLSNkZWZpbmUgTExfRVhUSV9MSU5FXzMwIEVYVElfSU1SMV9JTTMwIC8qITwgRXh0ZW5kZWQgbGluZSAzMCAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVYVElfSU1SMV9JTTMwICovDQotI2lmIGRlZmluZWQoRVhUSV9JTVIxX0lNMzEpDQotI2RlZmluZSBMTF9FWFRJX0xJTkVfMzEgRVhUSV9JTVIxX0lNMzEgLyohPCBFeHRlbmRlZCBsaW5lIDMxICovDQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRVhUSV9JTVIxX0lNMzEgKi8NCi0jZGVmaW5lIExMX0VYVElfTElORV9BTExfMF8zMSAgICAgICAgICAgICBcDQotICBFWFRJX0lNUjFfSU0gLyohPCBBbGwgRXh0ZW5kZWQgbGluZSBub3QgXA0KLSAgICAgICAgICAgICAgICAgIHJlc2VydmVkKi8NCi0NCi0jaWYgZGVmaW5lZChFWFRJX0lNUjJfSU0zMikNCi0jZGVmaW5lIExMX0VYVElfTElORV8zMiBFWFRJX0lNUjJfSU0zMiAvKiE8IEV4dGVuZGVkIGxpbmUgMzIgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFWFRJX0lNUjJfSU0zMiAqLw0KLSNpZiBkZWZpbmVkKEVYVElfSU1SMl9JTTMzKQ0KLSNkZWZpbmUgTExfRVhUSV9MSU5FXzMzIEVYVElfSU1SMl9JTTMzIC8qITwgRXh0ZW5kZWQgbGluZSAzMyAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVYVElfSU1SMl9JTTMzICovDQotI2lmIGRlZmluZWQoRVhUSV9JTVIyX0lNMzQpDQotI2RlZmluZSBMTF9FWFRJX0xJTkVfMzQgRVhUSV9JTVIyX0lNMzQgLyohPCBFeHRlbmRlZCBsaW5lIDM0ICovDQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRVhUSV9JTVIyX0lNMzQgKi8NCi0jaWYgZGVmaW5lZChFWFRJX0lNUjJfSU0zNSkNCi0jZGVmaW5lIExMX0VYVElfTElORV8zNSBFWFRJX0lNUjJfSU0zNSAvKiE8IEV4dGVuZGVkIGxpbmUgMzUgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFWFRJX0lNUjJfSU0zNSAqLw0KLSNpZiBkZWZpbmVkKEVYVElfSU1SMl9JTTM2KQ0KLSNkZWZpbmUgTExfRVhUSV9MSU5FXzM2IEVYVElfSU1SMl9JTTM2IC8qITwgRXh0ZW5kZWQgbGluZSAzNiAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVYVElfSU1SMl9JTTM2ICovDQotI2lmIGRlZmluZWQoRVhUSV9JTVIyX0lNMzcpDQotI2RlZmluZSBMTF9FWFRJX0xJTkVfMzcgRVhUSV9JTVIyX0lNMzcgLyohPCBFeHRlbmRlZCBsaW5lIDM3ICovDQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRVhUSV9JTVIyX0lNMzcgKi8NCi0jaWYgZGVmaW5lZChFWFRJX0lNUjJfSU0zOCkNCi0jZGVmaW5lIExMX0VYVElfTElORV8zOCBFWFRJX0lNUjJfSU0zOCAvKiE8IEV4dGVuZGVkIGxpbmUgMzggKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFWFRJX0lNUjJfSU0zOCAqLw0KLSNpZiBkZWZpbmVkKEVYVElfSU1SMl9JTTM5KQ0KLSNkZWZpbmUgTExfRVhUSV9MSU5FXzM5IEVYVElfSU1SMl9JTTM5IC8qITwgRXh0ZW5kZWQgbGluZSAzOSAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVYVElfSU1SMl9JTTM5ICovDQotI2lmIGRlZmluZWQoRVhUSV9JTVIyX0lNNDApDQotI2RlZmluZSBMTF9FWFRJX0xJTkVfNDAgRVhUSV9JTVIyX0lNNDAgLyohPCBFeHRlbmRlZCBsaW5lIDQwICovDQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRVhUSV9JTVIyX0lNNDAgKi8NCi0jaWYgZGVmaW5lZChFWFRJX0lNUjJfSU00MSkNCi0jZGVmaW5lIExMX0VYVElfTElORV80MSBFWFRJX0lNUjJfSU00MSAvKiE8IEV4dGVuZGVkIGxpbmUgNDEgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFWFRJX0lNUjJfSU00MSAqLw0KLSNpZiBkZWZpbmVkKEVYVElfSU1SMl9JTTQyKQ0KLSNkZWZpbmUgTExfRVhUSV9MSU5FXzQyIEVYVElfSU1SMl9JTTQyIC8qITwgRXh0ZW5kZWQgbGluZSA0MiAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVYVElfSU1SMl9JTTQyICovDQotI2RlZmluZSBMTF9FWFRJX0xJTkVfQUxMXzMyXzYzIFwNCi0gIEVYVElfSU1SMl9JTSAvKiE8IEFsbCBFeHRlbmRlZCBsaW5lIG5vdCByZXNlcnZlZCovDQotDQotI2RlZmluZSBMTF9FWFRJX0xJTkVfQUxMICgweEZGRkZGRkZGVSkgLyohPCBBbGwgRXh0ZW5kZWQgbGluZSAqLw0KLQ0KLSNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikNCi0jZGVmaW5lIExMX0VYVElfTElORV9OT05FIDB4MDAwMDAwMDBVIC8qITwgTm9uZSBFeHRlbmRlZCBsaW5lICovDQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlVTRV9GVUxMX0xMX0RSSVZFUiovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0jaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpDQotDQotLyoqIEBkZWZncm91cCBFWFRJX0xMX0VDX01PREUgTW9kZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9FWFRJX01PREVfSVQgKCh1aW50OF90KTB4MDBVKSAgICAgICAvKiE8IEludGVycnVwdCBNb2RlICovDQotI2RlZmluZSBMTF9FWFRJX01PREVfRVZFTlQgKCh1aW50OF90KTB4MDFVKSAgICAvKiE8IEV2ZW50IE1vZGUgKi8NCi0jZGVmaW5lIExMX0VYVElfTU9ERV9JVF9FVkVOVCAoKHVpbnQ4X3QpMHgwMlUpIC8qITwgSW50ZXJydXB0ICYgRXZlbnQgTW9kZSAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBFWFRJX0xMX0VDX1RSSUdHRVIgRWRnZSBUcmlnZ2VyDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX0VYVElfVFJJR0dFUl9OT05FICgodWludDhfdCkweDAwVSkgICAgLyohPCBObyBUcmlnZ2VyIE1vZGUgKi8NCi0jZGVmaW5lIExMX0VYVElfVFJJR0dFUl9SSVNJTkcgKCh1aW50OF90KTB4MDFVKSAgLyohPCBUcmlnZ2VyIFJpc2luZyBNb2RlICovDQotI2RlZmluZSBMTF9FWFRJX1RSSUdHRVJfRkFMTElORyAoKHVpbnQ4X3QpMHgwMlUpIC8qITwgVHJpZ2dlciBGYWxsaW5nIE1vZGUgKi8NCi0jZGVmaW5lIExMX0VYVElfVFJJR0dFUl9SSVNJTkdfRkFMTElORyBcDQotICAoKHVpbnQ4X3QpMHgwM1UpIC8qITwgVHJpZ2dlciBSaXNpbmcgJiBGYWxsaW5nIE1vZGUgKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLSNlbmRpZiAvKlVTRV9GVUxMX0xMX0RSSVZFUiovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgRVhUSV9MTF9FeHBvcnRlZF9NYWNyb3MgRVhUSSBFeHBvcnRlZCBNYWNyb3MNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRVhUSV9MTF9FTV9XUklURV9SRUFEIENvbW1vbiBXcml0ZSBhbmQgcmVhZCByZWdpc3RlcnMgTWFjcm9zDQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFdyaXRlIGEgdmFsdWUgaW4gRVhUSSByZWdpc3Rlcg0KLSAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSB3cml0dGVuDQotICogQHBhcmFtICBfX1ZBTFVFX18gVmFsdWUgdG8gYmUgd3JpdHRlbiBpbiB0aGUgcmVnaXN0ZXINCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIExMX0VYVElfV3JpdGVSZWcoX19SRUdfXywgX19WQUxVRV9fKSBcDQotICBXUklURV9SRUcoRVhUSS0+X19SRUdfXywgKF9fVkFMVUVfXykpDQotDQotLyoqDQotICogQGJyaWVmICBSZWFkIGEgdmFsdWUgaW4gRVhUSSByZWdpc3Rlcg0KLSAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSByZWFkDQotICogQHJldHZhbCBSZWdpc3RlciB2YWx1ZQ0KLSAqLw0KLSNkZWZpbmUgTExfRVhUSV9SZWFkUmVnKF9fUkVHX18pIFJFQURfUkVHKEVYVEktPl9fUkVHX18pDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBkZWZncm91cCBFWFRJX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucyBFWFRJIEV4cG9ydGVkIEZ1bmN0aW9ucw0KLSAqIEB7DQotICovDQotLyoqIEBkZWZncm91cCBFWFRJX0xMX0VGX0lUX01hbmFnZW1lbnQgSVRfTWFuYWdlbWVudA0KLSAqIEB7DQotICovDQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgRXh0aUxpbmUgSW50ZXJydXB0IHJlcXVlc3QgZm9yIExpbmVzIGluIHJhbmdlIDAgdG8gMzENCi0gKiBAbm90ZSBUaGUgcmVzZXQgdmFsdWUgZm9yIHRoZSBkaXJlY3Qgb3IgaW50ZXJuYWwgbGluZXMgKHNlZSBSTSkNCi0gKiAgICAgICBpcyBzZXQgdG8gMSBpbiBvcmRlciB0byBlbmFibGUgdGhlIGludGVycnVwdCBieSBkZWZhdWx0Lg0KLSAqICAgICAgIEJpdHMgYXJlIHNldCBhdXRvbWF0aWNhbGx5IGF0IFBvd2VyIG9uLg0KLSAqIEBybXRvbGwgSU1SMSAgICAgICAgIElNeCAgICAgICAgICAgTExfRVhUSV9FbmFibGVJVF8wXzMxDQotICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8wDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV82DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV85DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEwDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzExDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEyDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEzDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE0DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE1DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE2DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE3DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE4DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE5DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIwDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIxDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIyDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIzDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI0DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI1DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI2DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI3DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI4DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI5DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMwDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMxICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV9BTExfMF8zMQ0KLSAqIEBub3RlICAgKCopOiBBdmFpbGFibGUgaW4gc29tZSBkZXZpY2VzDQotICogQG5vdGUgICBQbGVhc2UgY2hlY2sgZWFjaCBkZXZpY2UgbGluZSBtYXBwaW5nIGZvciBFWFRJIExpbmUgYXZhaWxhYmlsaXR5DQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRVhUSV9FbmFibGVJVF8wXzMxKHVpbnQzMl90IEV4dGlMaW5lKSB7DQotICBTRVRfQklUKEVYVEktPklNUjEsIEV4dGlMaW5lKTsNCi19DQotLyoqDQotICogQGJyaWVmICBFbmFibGUgRXh0aUxpbmUgSW50ZXJydXB0IHJlcXVlc3QgZm9yIExpbmVzIGluIHJhbmdlIDMyIHRvIDYzDQotICogQG5vdGUgVGhlIHJlc2V0IHZhbHVlIGZvciB0aGUgZGlyZWN0IGxpbmVzIChsaW5lcyBmcm9tIDMyIHRvIDM0LCBsaW5lDQotICogICAgICAgMzkpIGlzIHNldCB0byAxIGluIG9yZGVyIHRvIGVuYWJsZSB0aGUgaW50ZXJydXB0IGJ5IGRlZmF1bHQuDQotICogICAgICAgQml0cyBhcmUgc2V0IGF1dG9tYXRpY2FsbHkgYXQgUG93ZXIgb24uDQotICogQHJtdG9sbCBJTVIyICAgICAgICAgSU14ICAgICAgICAgICBMTF9FWFRJX0VuYWJsZUlUXzMyXzYzDQotICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMiAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzMgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM0DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM1ICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zNw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MigqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV9BTExfMzJfNjMNCi0gKiBAbm90ZSAgICgqKTogQXZhaWxhYmxlIGluIHNvbWUgZGV2aWNlcw0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0VYVElfRW5hYmxlSVRfMzJfNjModWludDMyX3QgRXh0aUxpbmUpIHsNCi0gIFNFVF9CSVQoRVhUSS0+SU1SMiwgRXh0aUxpbmUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgRXh0aUxpbmUgSW50ZXJydXB0IHJlcXVlc3QgZm9yIExpbmVzIGluIHJhbmdlIDAgdG8gMzENCi0gKiBAbm90ZSBUaGUgcmVzZXQgdmFsdWUgZm9yIHRoZSBkaXJlY3Qgb3IgaW50ZXJuYWwgbGluZXMgKHNlZSBSTSkNCi0gKiAgICAgICBpcyBzZXQgdG8gMSBpbiBvcmRlciB0byBlbmFibGUgdGhlIGludGVycnVwdCBieSBkZWZhdWx0Lg0KLSAqICAgICAgIEJpdHMgYXJlIHNldCBhdXRvbWF0aWNhbGx5IGF0IFBvd2VyIG9uLg0KLSAqIEBybXRvbGwgSU1SMSAgICAgICAgIElNeCAgICAgICAgICAgTExfRVhUSV9EaXNhYmxlSVRfMF8zMQ0KLSAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV83DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yNw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV9BTExfMF8zMSAoKikNCi0gKiBAbm90ZSAgICgqKTogQXZhaWxhYmxlIGluIHNvbWUgZGV2aWNlcw0KLSAqIEBub3RlICAgUGxlYXNlIGNoZWNrIGVhY2ggZGV2aWNlIGxpbmUgbWFwcGluZyBmb3IgRVhUSSBMaW5lIGF2YWlsYWJpbGl0eQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0VYVElfRGlzYWJsZUlUXzBfMzEodWludDMyX3QgRXh0aUxpbmUpIHsNCi0gIENMRUFSX0JJVChFWFRJLT5JTVIxLCBFeHRpTGluZSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBFeHRpTGluZSBJbnRlcnJ1cHQgcmVxdWVzdCBmb3IgTGluZXMgaW4gcmFuZ2UgMzIgdG8gNjMNCi0gKiBAbm90ZSBUaGUgcmVzZXQgdmFsdWUgZm9yIHRoZSBkaXJlY3QgbGluZXMgKGxpbmVzIGZyb20gMzIgdG8gMzQsIGxpbmUNCi0gKiAgICAgICAzOSkgaXMgc2V0IHRvIDEgaW4gb3JkZXIgdG8gZW5hYmxlIHRoZSBpbnRlcnJ1cHQgYnkgZGVmYXVsdC4NCi0gKiAgICAgICBCaXRzIGFyZSBzZXQgYXV0b21hdGljYWxseSBhdCBQb3dlciBvbi4NCi0gKiBAcm10b2xsIElNUjIgICAgICAgICBJTXggICAgICAgICAgIExMX0VYVElfRGlzYWJsZUlUXzMyXzYzDQotICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMiAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzMgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM0DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM1ICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zNw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MigqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV9BTExfMzJfNjMNCi0gKiBAbm90ZSAgICgqKTogQXZhaWxhYmxlIGluIHNvbWUgZGV2aWNlcw0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0VYVElfRGlzYWJsZUlUXzMyXzYzKHVpbnQzMl90IEV4dGlMaW5lKSB7DQotICBDTEVBUl9CSVQoRVhUSS0+SU1SMiwgRXh0aUxpbmUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEluZGljYXRlIGlmIEV4dGlMaW5lIEludGVycnVwdCByZXF1ZXN0IGlzIGVuYWJsZWQgZm9yIExpbmVzIGluIHJhbmdlDQotICogMCB0byAzMQ0KLSAqIEBub3RlIFRoZSByZXNldCB2YWx1ZSBmb3IgdGhlIGRpcmVjdCBvciBpbnRlcm5hbCBsaW5lcyAoc2VlIFJNKQ0KLSAqICAgICAgIGlzIHNldCB0byAxIGluIG9yZGVyIHRvIGVuYWJsZSB0aGUgaW50ZXJydXB0IGJ5IGRlZmF1bHQuDQotICogICAgICAgQml0cyBhcmUgc2V0IGF1dG9tYXRpY2FsbHkgYXQgUG93ZXIgb24uDQotICogQHJtdG9sbCBJTVIxICAgICAgICAgSU14ICAgICAgICAgICBMTF9FWFRJX0lzRW5hYmxlZElUXzBfMzENCi0gKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV81DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV84DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzEgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FX0FMTF8wXzMxDQotICogQG5vdGUgICAoKik6IEF2YWlsYWJsZSBpbiBzb21lIGRldmljZXMNCi0gKiBAbm90ZSAgIFBsZWFzZSBjaGVjayBlYWNoIGRldmljZSBsaW5lIG1hcHBpbmcgZm9yIEVYVEkgTGluZSBhdmFpbGFiaWxpdHkNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRVhUSV9Jc0VuYWJsZWRJVF8wXzMxKHVpbnQzMl90IEV4dGlMaW5lKSB7DQotICByZXR1cm4gKChSRUFEX0JJVChFWFRJLT5JTVIxLCBFeHRpTGluZSkgPT0gKEV4dGlMaW5lKSkgPyAxVUwgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEluZGljYXRlIGlmIEV4dGlMaW5lIEludGVycnVwdCByZXF1ZXN0IGlzIGVuYWJsZWQgZm9yIExpbmVzIGluIHJhbmdlDQotICogMzIgdG8gNjMNCi0gKiBAbm90ZSBUaGUgcmVzZXQgdmFsdWUgZm9yIHRoZSBkaXJlY3QgbGluZXMgKGxpbmVzIGZyb20gMzIgdG8gMzQsIGxpbmUNCi0gKiAgICAgICAzOSkgaXMgc2V0IHRvIDEgaW4gb3JkZXIgdG8gZW5hYmxlIHRoZSBpbnRlcnJ1cHQgYnkgZGVmYXVsdC4NCi0gKiAgICAgICBCaXRzIGFyZSBzZXQgYXV0b21hdGljYWxseSBhdCBQb3dlciBvbi4NCi0gKiBAcm10b2xsIElNUjIgICAgICAgICBJTXggICAgICAgICAgIExMX0VYVElfSXNFbmFibGVkSVRfMzJfNjMNCi0gKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMyICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMyAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzUgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM2DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM3DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM4DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM5DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQwDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQxDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQyKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FX0FMTF8zMl82Mw0KLSAqIEBub3RlICAgKCopOiBBdmFpbGFibGUgaW4gc29tZSBkZXZpY2VzDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0VYVElfSXNFbmFibGVkSVRfMzJfNjModWludDMyX3QgRXh0aUxpbmUpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKEVYVEktPklNUjIsIEV4dGlMaW5lKSA9PSAoRXh0aUxpbmUpKSA/IDFVTCA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBFWFRJX0xMX0VGX0V2ZW50X01hbmFnZW1lbnQgRXZlbnRfTWFuYWdlbWVudA0KLSAqIEB7DQotICovDQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgRXh0aUxpbmUgRXZlbnQgcmVxdWVzdCBmb3IgTGluZXMgaW4gcmFuZ2UgMCB0byAzMQ0KLSAqIEBybXRvbGwgRU1SMSAgICAgICAgIEVNeCAgICAgICAgICAgTExfRVhUSV9FbmFibGVFdmVudF8wXzMxDQotICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8wDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV82DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV85DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEwDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzExDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEyDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEzDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE0DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE1DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE2DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE3DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE4DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE5DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIwDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIxDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIyDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIzDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI0DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI1DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI2DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI3DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI4DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI5DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMwDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMxDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FX0FMTF8wXzMxICgqKQ0KLSAqIEBub3RlICAgKCopOiBBdmFpbGFibGUgaW4gc29tZSBkZXZpY2VzDQotICogQG5vdGUgICBQbGVhc2UgY2hlY2sgZWFjaCBkZXZpY2UgbGluZSBtYXBwaW5nIGZvciBFWFRJIExpbmUgYXZhaWxhYmlsaXR5DQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRVhUSV9FbmFibGVFdmVudF8wXzMxKHVpbnQzMl90IEV4dGlMaW5lKSB7DQotICBTRVRfQklUKEVYVEktPkVNUjEsIEV4dGlMaW5lKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgRXh0aUxpbmUgRXZlbnQgcmVxdWVzdCBmb3IgTGluZXMgaW4gcmFuZ2UgMzIgdG8gNjMNCi0gKiBAcm10b2xsIEVNUjIgICAgICAgICBFTXggICAgICAgICAgIExMX0VYVElfRW5hYmxlRXZlbnRfMzJfNjMNCi0gKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMiAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzMgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM0DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM1ICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zNw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MigqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV9BTExfMzJfNjMNCi0gKiBAbm90ZSAgICgqKTogQXZhaWxhYmxlIGluIHNvbWUgZGV2aWNlcw0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0VYVElfRW5hYmxlRXZlbnRfMzJfNjModWludDMyX3QgRXh0aUxpbmUpIHsNCi0gIFNFVF9CSVQoRVhUSS0+RU1SMiwgRXh0aUxpbmUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgRXh0aUxpbmUgRXZlbnQgcmVxdWVzdCBmb3IgTGluZXMgaW4gcmFuZ2UgMCB0byAzMQ0KLSAqIEBybXRvbGwgRU1SMSAgICAgICAgIEVNeCAgICAgICAgICAgTExfRVhUSV9EaXNhYmxlRXZlbnRfMF8zMQ0KLSAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV83DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yNw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMSAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfQUxMXzBfMzENCi0gKiBAbm90ZSAgICgqKTogQXZhaWxhYmxlIGluIHNvbWUgZGV2aWNlcw0KLSAqIEBub3RlICAgUGxlYXNlIGNoZWNrIGVhY2ggZGV2aWNlIGxpbmUgbWFwcGluZyBmb3IgRVhUSSBMaW5lIGF2YWlsYWJpbGl0eQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0VYVElfRGlzYWJsZUV2ZW50XzBfMzEodWludDMyX3QgRXh0aUxpbmUpIHsNCi0gIENMRUFSX0JJVChFWFRJLT5FTVIxLCBFeHRpTGluZSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBFeHRpTGluZSBFdmVudCByZXF1ZXN0IGZvciBMaW5lcyBpbiByYW5nZSAzMiB0byA2Mw0KLSAqIEBybXRvbGwgRU1SMiAgICAgICAgIEVNeCAgICAgICAgICAgTExfRVhUSV9EaXNhYmxlRXZlbnRfMzJfNjMNCi0gKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMiAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzMgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM0DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM1ICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zNw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MigqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV9BTExfMzJfNjMNCi0gKiBAbm90ZSAgICgqKTogQXZhaWxhYmxlIGluIHNvbWUgZGV2aWNlcw0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0VYVElfRGlzYWJsZUV2ZW50XzMyXzYzKHVpbnQzMl90IEV4dGlMaW5lKSB7DQotICBDTEVBUl9CSVQoRVhUSS0+RU1SMiwgRXh0aUxpbmUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEluZGljYXRlIGlmIEV4dGlMaW5lIEV2ZW50IHJlcXVlc3QgaXMgZW5hYmxlZCBmb3IgTGluZXMgaW4gcmFuZ2UgMCB0bw0KLSAqIDMxDQotICogQHJtdG9sbCBFTVIxICAgICAgICAgRU14ICAgICAgICAgICBMTF9FWFRJX0lzRW5hYmxlZEV2ZW50XzBfMzENCi0gKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV81DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV84DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfQUxMXzBfMzEgKCopDQotICogQG5vdGUgICAoKik6IEF2YWlsYWJsZSBpbiBzb21lIGRldmljZXMNCi0gKiBAbm90ZSAgIFBsZWFzZSBjaGVjayBlYWNoIGRldmljZSBsaW5lIG1hcHBpbmcgZm9yIEVYVEkgTGluZSBhdmFpbGFiaWxpdHkNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRVhUSV9Jc0VuYWJsZWRFdmVudF8wXzMxKHVpbnQzMl90IEV4dGlMaW5lKSB7DQotICByZXR1cm4gKChSRUFEX0JJVChFWFRJLT5FTVIxLCBFeHRpTGluZSkgPT0gKEV4dGlMaW5lKSkgPyAxVUwgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEluZGljYXRlIGlmIEV4dGlMaW5lIEV2ZW50IHJlcXVlc3QgaXMgZW5hYmxlZCBmb3IgTGluZXMgaW4gcmFuZ2UgMzINCi0gKiB0byA2Mw0KLSAqIEBybXRvbGwgRU1SMiAgICAgICAgIEVNeCAgICAgICAgICAgTExfRVhUSV9Jc0VuYWJsZWRFdmVudF8zMl82Mw0KLSAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMyICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMyAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzUgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM2DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM3DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM4DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM5DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQwDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQxDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQyKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FX0FMTF8zMl82Mw0KLSAqIEBub3RlICAgKCopOiBBdmFpbGFibGUgaW4gc29tZSBkZXZpY2VzDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0VYVElfSXNFbmFibGVkRXZlbnRfMzJfNjModWludDMyX3QgRXh0aUxpbmUpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKEVYVEktPkVNUjIsIEV4dGlMaW5lKSA9PSAoRXh0aUxpbmUpKSA/IDFVTCA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBFWFRJX0xMX0VGX1Jpc2luZ19UcmlnZ2VyX01hbmFnZW1lbnQgUmlzaW5nX1RyaWdnZXJfTWFuYWdlbWVudA0KLSAqIEB7DQotICovDQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgRXh0aUxpbmUgUmlzaW5nIEVkZ2UgVHJpZ2dlciBmb3IgTGluZXMgaW4gcmFuZ2UgMCB0byAzMQ0KLSAqIEBub3RlIFRoZSBjb25maWd1cmFibGUgd2FrZXVwIGxpbmVzIGFyZSBlZGdlLXRyaWdnZXJlZC4gTm8gZ2xpdGNoIG11c3QgYmUNCi0gKiAgICAgICBnZW5lcmF0ZWQgb24gdGhlc2UgbGluZXMuIElmIGEgcmlzaW5nIGVkZ2Ugb24gYSBjb25maWd1cmFibGUgaW50ZXJydXB0DQotICogICAgICAgbGluZSBvY2N1cnMgZHVyaW5nIGEgd3JpdGUgb3BlcmF0aW9uIGluIHRoZSBFWFRJX1JUU1IgcmVnaXN0ZXIsIHRoZQ0KLSAqICAgICAgIHBlbmRpbmcgYml0IGlzIG5vdCBzZXQuDQotICogICAgICAgUmlzaW5nIGFuZCBmYWxsaW5nIGVkZ2UgdHJpZ2dlcnMgY2FuIGJlIHNldCBmb3INCi0gKiAgICAgICB0aGUgc2FtZSBpbnRlcnJ1cHQgbGluZS4gSW4gdGhpcyBjYXNlLCBib3RoIGdlbmVyYXRlIGEgdHJpZ2dlcg0KLSAqICAgICAgIGNvbmRpdGlvbi4NCi0gKiBAcm10b2xsIFJUU1IxICAgICAgICBSVHggICAgICAgICAgIExMX0VYVElfRW5hYmxlUmlzaW5nVHJpZ18wXzMxDQotICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV83DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMSAoKikNCi0gKiBAbm90ZSAgICgqKTogQXZhaWxhYmxlIGluIHNvbWUgZGV2aWNlcw0KLSAqIEBub3RlICAgUGxlYXNlIGNoZWNrIGVhY2ggZGV2aWNlIGxpbmUgbWFwcGluZyBmb3IgRVhUSSBMaW5lIGF2YWlsYWJpbGl0eQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0VYVElfRW5hYmxlUmlzaW5nVHJpZ18wXzMxKHVpbnQzMl90IEV4dGlMaW5lKSB7DQotICBTRVRfQklUKEVYVEktPlJUU1IxLCBFeHRpTGluZSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIEV4dGlMaW5lIFJpc2luZyBFZGdlIFRyaWdnZXIgZm9yIExpbmVzIGluIHJhbmdlIDMyIHRvIDYzDQotICogQG5vdGUgVGhlIGNvbmZpZ3VyYWJsZSB3YWtldXAgbGluZXMgYXJlIGVkZ2UtdHJpZ2dlcmVkLiBObyBnbGl0Y2ggbXVzdCBiZQ0KLSAqICAgICAgIGdlbmVyYXRlZCBvbiB0aGVzZSBsaW5lcy4gSWYgYSByaXNpbmcgZWRnZSBvbiBhIGNvbmZpZ3VyYWJsZSBpbnRlcnJ1cHQNCi0gKiAgICAgICBsaW5lIG9jY3VycyBkdXJpbmcgYSB3cml0ZSBvcGVyYXRpb24gaW4gdGhlIEVYVElfUlRTUiByZWdpc3RlciwgdGhlDQotICogICAgICAgcGVuZGluZyBiaXQgaXMgbm90IHNldC5SaXNpbmcgYW5kIGZhbGxpbmcgZWRnZSB0cmlnZ2VycyBjYW4gYmUgc2V0IGZvcg0KLSAqICAgICAgIHRoZSBzYW1lIGludGVycnVwdCBsaW5lLiBJbiB0aGlzIGNhc2UsIGJvdGggZ2VuZXJhdGUgYSB0cmlnZ2VyDQotICogICAgICAgY29uZGl0aW9uLg0KLSAqIEBybXRvbGwgUlRTUjIgICAgICAgIFJUeCAgICAgICAgICAgTExfRVhUSV9FbmFibGVSaXNpbmdUcmlnXzMyXzYzDQotICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzIgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMzICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MQ0KLSAqIEBub3RlICAgKCopOiBBdmFpbGFibGUgaW4gc29tZSBkZXZpY2VzDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRVhUSV9FbmFibGVSaXNpbmdUcmlnXzMyXzYzKHVpbnQzMl90IEV4dGlMaW5lKSB7DQotICBTRVRfQklUKEVYVEktPlJUU1IyLCBFeHRpTGluZSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBFeHRpTGluZSBSaXNpbmcgRWRnZSBUcmlnZ2VyIGZvciBMaW5lcyBpbiByYW5nZSAwIHRvIDMxDQotICogQG5vdGUgVGhlIGNvbmZpZ3VyYWJsZSB3YWtldXAgbGluZXMgYXJlIGVkZ2UtdHJpZ2dlcmVkLiBObyBnbGl0Y2ggbXVzdCBiZQ0KLSAqICAgICAgIGdlbmVyYXRlZCBvbiB0aGVzZSBsaW5lcy4gSWYgYSByaXNpbmcgZWRnZSBvbiBhIGNvbmZpZ3VyYWJsZSBpbnRlcnJ1cHQNCi0gKiAgICAgICBsaW5lIG9jY3VycyBkdXJpbmcgYSB3cml0ZSBvcGVyYXRpb24gaW4gdGhlIEVYVElfUlRTUiByZWdpc3RlciwgdGhlDQotICogICAgICAgcGVuZGluZyBiaXQgaXMgbm90IHNldC4NCi0gKiAgICAgICBSaXNpbmcgYW5kIGZhbGxpbmcgZWRnZSB0cmlnZ2VycyBjYW4gYmUgc2V0IGZvcg0KLSAqICAgICAgIHRoZSBzYW1lIGludGVycnVwdCBsaW5lLiBJbiB0aGlzIGNhc2UsIGJvdGggZ2VuZXJhdGUgYSB0cmlnZ2VyDQotICogICAgICAgY29uZGl0aW9uLg0KLSAqIEBybXRvbGwgUlRTUjEgICAgICAgIFJUeCAgICAgICAgICAgTExfRVhUSV9EaXNhYmxlUmlzaW5nVHJpZ18wXzMxDQotICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV83DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMSAoKikNCi0gKiBAbm90ZSAgICgqKTogQXZhaWxhYmxlIGluIHNvbWUgZGV2aWNlcw0KLSAqIEBub3RlICAgUGxlYXNlIGNoZWNrIGVhY2ggZGV2aWNlIGxpbmUgbWFwcGluZyBmb3IgRVhUSSBMaW5lIGF2YWlsYWJpbGl0eQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0VYVElfRGlzYWJsZVJpc2luZ1RyaWdfMF8zMSh1aW50MzJfdCBFeHRpTGluZSkgew0KLSAgQ0xFQVJfQklUKEVYVEktPlJUU1IxLCBFeHRpTGluZSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBFeHRpTGluZSBSaXNpbmcgRWRnZSBUcmlnZ2VyIGZvciBMaW5lcyBpbiByYW5nZSAzMiB0byA2Mw0KLSAqIEBub3RlIFRoZSBjb25maWd1cmFibGUgd2FrZXVwIGxpbmVzIGFyZSBlZGdlLXRyaWdnZXJlZC4gTm8gZ2xpdGNoIG11c3QgYmUNCi0gKiAgICAgICBnZW5lcmF0ZWQgb24gdGhlc2UgbGluZXMuIElmIGEgcmlzaW5nIGVkZ2Ugb24gYSBjb25maWd1cmFibGUgaW50ZXJydXB0DQotICogICAgICAgbGluZSBvY2N1cnMgZHVyaW5nIGEgd3JpdGUgb3BlcmF0aW9uIGluIHRoZSBFWFRJX1JUU1IgcmVnaXN0ZXIsIHRoZQ0KLSAqICAgICAgIHBlbmRpbmcgYml0IGlzIG5vdCBzZXQuDQotICogICAgICAgUmlzaW5nIGFuZCBmYWxsaW5nIGVkZ2UgdHJpZ2dlcnMgY2FuIGJlIHNldCBmb3INCi0gKiAgICAgICB0aGUgc2FtZSBpbnRlcnJ1cHQgbGluZS4gSW4gdGhpcyBjYXNlLCBib3RoIGdlbmVyYXRlIGEgdHJpZ2dlcg0KLSAqICAgICAgIGNvbmRpdGlvbi4NCi0gKiBAcm10b2xsIFJUU1IyICAgICAgICBSVHggICAgICAgICAgIExMX0VYVElfRGlzYWJsZVJpc2luZ1RyaWdfMzJfNjMNCi0gKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMiAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzMgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM4DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM5DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQwDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQxDQotICogQG5vdGUgICAoKik6IEF2YWlsYWJsZSBpbiBzb21lIGRldmljZXMNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9FWFRJX0Rpc2FibGVSaXNpbmdUcmlnXzMyXzYzKHVpbnQzMl90IEV4dGlMaW5lKSB7DQotICBDTEVBUl9CSVQoRVhUSS0+UlRTUjIsIEV4dGlMaW5lKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiByaXNpbmcgZWRnZSB0cmlnZ2VyIGlzIGVuYWJsZWQgZm9yIExpbmVzIGluIHJhbmdlIDAgdG8gMzENCi0gKiBAcm10b2xsIFJUU1IxICAgICAgICBSVHggICAgICAgICAgIExMX0VYVElfSXNFbmFibGVkUmlzaW5nVHJpZ18wXzMxDQotICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV83DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMSAoKikNCi0gKiBAbm90ZSAgICgqKTogQXZhaWxhYmxlIGluIHNvbWUgZGV2aWNlcw0KLSAqIEBub3RlICAgUGxlYXNlIGNoZWNrIGVhY2ggZGV2aWNlIGxpbmUgbWFwcGluZyBmb3IgRVhUSSBMaW5lIGF2YWlsYWJpbGl0eQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9FWFRJX0lzRW5hYmxlZFJpc2luZ1RyaWdfMF8zMSh1aW50MzJfdCBFeHRpTGluZSkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoRVhUSS0+UlRTUjEsIEV4dGlMaW5lKSA9PSAoRXh0aUxpbmUpKSA/IDFVTCA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgcmlzaW5nIGVkZ2UgdHJpZ2dlciBpcyBlbmFibGVkIGZvciBMaW5lcyBpbiByYW5nZSAzMiB0byA2Mw0KLSAqIEBybXRvbGwgUlRTUjIgICAgICAgIFJUeCAgICAgICAgICAgTExfRVhUSV9Jc0VuYWJsZWRSaXNpbmdUcmlnXzMyXzYzDQotICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzIgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMzICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MQ0KLSAqIEBub3RlICAgKCopOiBBdmFpbGFibGUgaW4gc29tZSBkZXZpY2VzDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0VYVElfSXNFbmFibGVkUmlzaW5nVHJpZ18zMl82Myh1aW50MzJfdCBFeHRpTGluZSkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoRVhUSS0+UlRTUjIsIEV4dGlMaW5lKSA9PSAoRXh0aUxpbmUpKSA/IDFVTCA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBFWFRJX0xMX0VGX0ZhbGxpbmdfVHJpZ2dlcl9NYW5hZ2VtZW50IEZhbGxpbmdfVHJpZ2dlcl9NYW5hZ2VtZW50DQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSBFeHRpTGluZSBGYWxsaW5nIEVkZ2UgVHJpZ2dlciBmb3IgTGluZXMgaW4gcmFuZ2UgMCB0byAzMQ0KLSAqIEBub3RlIFRoZSBjb25maWd1cmFibGUgd2FrZXVwIGxpbmVzIGFyZSBlZGdlLXRyaWdnZXJlZC4gTm8gZ2xpdGNoIG11c3QgYmUNCi0gKiAgICAgICBnZW5lcmF0ZWQgb24gdGhlc2UgbGluZXMuIElmIGEgZmFsbGluZyBlZGdlIG9uIGEgY29uZmlndXJhYmxlIGludGVycnVwdA0KLSAqICAgICAgIGxpbmUgb2NjdXJzIGR1cmluZyBhIHdyaXRlIG9wZXJhdGlvbiBpbiB0aGUgRVhUSV9GVFNSIHJlZ2lzdGVyLCB0aGUNCi0gKiAgICAgICBwZW5kaW5nIGJpdCBpcyBub3Qgc2V0Lg0KLSAqICAgICAgIFJpc2luZyBhbmQgZmFsbGluZyBlZGdlIHRyaWdnZXJzIGNhbiBiZSBzZXQgZm9yDQotICogICAgICAgdGhlIHNhbWUgaW50ZXJydXB0IGxpbmUuIEluIHRoaXMgY2FzZSwgYm90aCBnZW5lcmF0ZSBhIHRyaWdnZXINCi0gKiAgICAgICBjb25kaXRpb24uDQotICogQHJtdG9sbCBGVFNSMSAgICAgICAgRlR4ICAgICAgICAgICBMTF9FWFRJX0VuYWJsZUZhbGxpbmdUcmlnXzBfMzENCi0gKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8wDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV82DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV85DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEwDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzExDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEyDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEzDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE0DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE1DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE2DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE4DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE5DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIwDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIxDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIyDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI5DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMwDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMxICgqKQ0KLSAqIEBub3RlICAgKCopOiBBdmFpbGFibGUgaW4gc29tZSBkZXZpY2VzDQotICogQG5vdGUgICBQbGVhc2UgY2hlY2sgZWFjaCBkZXZpY2UgbGluZSBtYXBwaW5nIGZvciBFWFRJIExpbmUgYXZhaWxhYmlsaXR5DQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRVhUSV9FbmFibGVGYWxsaW5nVHJpZ18wXzMxKHVpbnQzMl90IEV4dGlMaW5lKSB7DQotICBTRVRfQklUKEVYVEktPkZUU1IxLCBFeHRpTGluZSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIEV4dGlMaW5lIEZhbGxpbmcgRWRnZSBUcmlnZ2VyIGZvciBMaW5lcyBpbiByYW5nZSAzMiB0byA2Mw0KLSAqIEBub3RlIFRoZSBjb25maWd1cmFibGUgd2FrZXVwIGxpbmVzIGFyZSBlZGdlLXRyaWdnZXJlZC4gTm8gZ2xpdGNoIG11c3QgYmUNCi0gKiAgICAgICBnZW5lcmF0ZWQgb24gdGhlc2UgbGluZXMuIElmIGEgRmFsbGluZyBlZGdlIG9uIGEgY29uZmlndXJhYmxlIGludGVycnVwdA0KLSAqICAgICAgIGxpbmUgb2NjdXJzIGR1cmluZyBhIHdyaXRlIG9wZXJhdGlvbiBpbiB0aGUgRVhUSV9GVFNSIHJlZ2lzdGVyLCB0aGUNCi0gKiAgICAgICBwZW5kaW5nIGJpdCBpcyBub3Qgc2V0Lg0KLSAqICAgICAgIFJpc2luZyBhbmQgZmFsbGluZyBlZGdlIHRyaWdnZXJzIGNhbiBiZSBzZXQgZm9yDQotICogICAgICAgdGhlIHNhbWUgaW50ZXJydXB0IGxpbmUuIEluIHRoaXMgY2FzZSwgYm90aCBnZW5lcmF0ZSBhIHRyaWdnZXINCi0gKiAgICAgICBjb25kaXRpb24uDQotICogQHJtdG9sbCBGVFNSMiAgICAgICAgRlR4ICAgICAgICAgICBMTF9FWFRJX0VuYWJsZUZhbGxpbmdUcmlnXzMyXzYzDQotICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzIgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMzICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MQ0KLSAqIEBub3RlICAgKCopOiBBdmFpbGFibGUgaW4gc29tZSBkZXZpY2VzDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRVhUSV9FbmFibGVGYWxsaW5nVHJpZ18zMl82Myh1aW50MzJfdCBFeHRpTGluZSkgew0KLSAgU0VUX0JJVChFWFRJLT5GVFNSMiwgRXh0aUxpbmUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgRXh0aUxpbmUgRmFsbGluZyBFZGdlIFRyaWdnZXIgZm9yIExpbmVzIGluIHJhbmdlIDAgdG8gMzENCi0gKiBAbm90ZSBUaGUgY29uZmlndXJhYmxlIHdha2V1cCBsaW5lcyBhcmUgZWRnZS10cmlnZ2VyZWQuIE5vIGdsaXRjaCBtdXN0IGJlDQotICogICAgICAgZ2VuZXJhdGVkIG9uIHRoZXNlIGxpbmVzLiBJZiBhIEZhbGxpbmcgZWRnZSBvbiBhIGNvbmZpZ3VyYWJsZSBpbnRlcnJ1cHQNCi0gKiAgICAgICBsaW5lIG9jY3VycyBkdXJpbmcgYSB3cml0ZSBvcGVyYXRpb24gaW4gdGhlIEVYVElfRlRTUiByZWdpc3RlciwgdGhlDQotICogICAgICAgcGVuZGluZyBiaXQgaXMgbm90IHNldC4NCi0gKiAgICAgICBSaXNpbmcgYW5kIGZhbGxpbmcgZWRnZSB0cmlnZ2VycyBjYW4gYmUgc2V0IGZvciB0aGUgc2FtZSBpbnRlcnJ1cHQNCi0gKiBsaW5lLiBJbiB0aGlzIGNhc2UsIGJvdGggZ2VuZXJhdGUgYSB0cmlnZ2VyIGNvbmRpdGlvbi4NCi0gKiBAcm10b2xsIEZUU1IxICAgICAgICBGVHggICAgICAgICAgIExMX0VYVElfRGlzYWJsZUZhbGxpbmdUcmlnXzBfMzENCi0gKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8wDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV82DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV85DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEwDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzExDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEyDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEzDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE0DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE1DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE2DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE4DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE5DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIwDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIxDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIyDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI5DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMwDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMxICgqKQ0KLSAqIEBub3RlICAgKCopOiBBdmFpbGFibGUgaW4gc29tZSBkZXZpY2VzDQotICogQG5vdGUgICBQbGVhc2UgY2hlY2sgZWFjaCBkZXZpY2UgbGluZSBtYXBwaW5nIGZvciBFWFRJIExpbmUgYXZhaWxhYmlsaXR5DQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRVhUSV9EaXNhYmxlRmFsbGluZ1RyaWdfMF8zMSh1aW50MzJfdCBFeHRpTGluZSkgew0KLSAgQ0xFQVJfQklUKEVYVEktPkZUU1IxLCBFeHRpTGluZSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBFeHRpTGluZSBGYWxsaW5nIEVkZ2UgVHJpZ2dlciBmb3IgTGluZXMgaW4gcmFuZ2UgMzIgdG8gNjMNCi0gKiBAbm90ZSBUaGUgY29uZmlndXJhYmxlIHdha2V1cCBsaW5lcyBhcmUgZWRnZS10cmlnZ2VyZWQuIE5vIGdsaXRjaCBtdXN0IGJlDQotICogICAgICAgZ2VuZXJhdGVkIG9uIHRoZXNlIGxpbmVzLiBJZiBhIEZhbGxpbmcgZWRnZSBvbiBhIGNvbmZpZ3VyYWJsZSBpbnRlcnJ1cHQNCi0gKiAgICAgICBsaW5lIG9jY3VycyBkdXJpbmcgYSB3cml0ZSBvcGVyYXRpb24gaW4gdGhlIEVYVElfRlRTUiByZWdpc3RlciwgdGhlDQotICogICAgICAgcGVuZGluZyBiaXQgaXMgbm90IHNldC4NCi0gKiAgICAgICBSaXNpbmcgYW5kIGZhbGxpbmcgZWRnZSB0cmlnZ2VycyBjYW4gYmUgc2V0IGZvciB0aGUgc2FtZSBpbnRlcnJ1cHQNCi0gKiBsaW5lLiBJbiB0aGlzIGNhc2UsIGJvdGggZ2VuZXJhdGUgYSB0cmlnZ2VyIGNvbmRpdGlvbi4NCi0gKiBAcm10b2xsIEZUU1IyICAgICAgICBGVHggICAgICAgICAgIExMX0VYVElfRGlzYWJsZUZhbGxpbmdUcmlnXzMyXzYzDQotICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzIgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMzICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MQ0KLSAqIEBub3RlICAgKCopOiBBdmFpbGFibGUgaW4gc29tZSBkZXZpY2VzDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRVhUSV9EaXNhYmxlRmFsbGluZ1RyaWdfMzJfNjModWludDMyX3QgRXh0aUxpbmUpIHsNCi0gIENMRUFSX0JJVChFWFRJLT5GVFNSMiwgRXh0aUxpbmUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIGlmIGZhbGxpbmcgZWRnZSB0cmlnZ2VyIGlzIGVuYWJsZWQgZm9yIExpbmVzIGluIHJhbmdlIDAgdG8gMzENCi0gKiBAcm10b2xsIEZUU1IxICAgICAgICBGVHggICAgICAgICAgIExMX0VYVElfSXNFbmFibGVkRmFsbGluZ1RyaWdfMF8zMQ0KLSAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV81DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV84DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzEgKCopDQotICogQG5vdGUgICAoKik6IEF2YWlsYWJsZSBpbiBzb21lIGRldmljZXMNCi0gKiBAbm90ZSAgIFBsZWFzZSBjaGVjayBlYWNoIGRldmljZSBsaW5lIG1hcHBpbmcgZm9yIEVYVEkgTGluZSBhdmFpbGFiaWxpdHkNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRVhUSV9Jc0VuYWJsZWRGYWxsaW5nVHJpZ18wXzMxKHVpbnQzMl90IEV4dGlMaW5lKSB7DQotICByZXR1cm4gKChSRUFEX0JJVChFWFRJLT5GVFNSMSwgRXh0aUxpbmUpID09IChFeHRpTGluZSkpID8gMVVMIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiBmYWxsaW5nIGVkZ2UgdHJpZ2dlciBpcyBlbmFibGVkIGZvciBMaW5lcyBpbiByYW5nZSAzMiB0byA2Mw0KLSAqIEBybXRvbGwgRlRTUjIgICAgICAgIEZUeCAgICAgICAgICAgTExfRVhUSV9Jc0VuYWJsZWRGYWxsaW5nVHJpZ18zMl82Mw0KLSAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMyICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMyAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNDANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNDENCi0gKiBAbm90ZSAgICgqKTogQXZhaWxhYmxlIGluIHNvbWUgZGV2aWNlcw0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9FWFRJX0lzRW5hYmxlZEZhbGxpbmdUcmlnXzMyXzYzKHVpbnQzMl90IEV4dGlMaW5lKSB7DQotICByZXR1cm4gKChSRUFEX0JJVChFWFRJLT5GVFNSMiwgRXh0aUxpbmUpID09IChFeHRpTGluZSkpID8gMVVMIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEVYVElfTExfRUZfU29mdHdhcmVfSW50ZXJydXB0X01hbmFnZW1lbnQNCi0gKiBTb2Z0d2FyZV9JbnRlcnJ1cHRfTWFuYWdlbWVudA0KLSAqIEB7DQotICovDQotDQotLyoqDQotICogQGJyaWVmICBHZW5lcmF0ZSBhIHNvZnR3YXJlIEludGVycnVwdCBFdmVudCBmb3IgTGluZXMgaW4gcmFuZ2UgMCB0byAzMQ0KLSAqIEBub3RlIElmIHRoZSBpbnRlcnJ1cHQgaXMgZW5hYmxlZCBvbiB0aGlzIGxpbmUgaW4gdGhlIEVYVElfSU1SMSwgd3JpdGluZyBhIDENCi0gKiB0byB0aGlzIGJpdCB3aGVuIGl0IGlzIGF0ICcwJyBzZXRzIHRoZSBjb3JyZXNwb25kaW5nIHBlbmRpbmcgYml0IGluIEVYVElfUFIxDQotICogICAgICAgcmVzdWx0aW5nIGluIGFuIGludGVycnVwdCByZXF1ZXN0IGdlbmVyYXRpb24uDQotICogICAgICAgVGhpcyBiaXQgaXMgY2xlYXJlZCBieSBjbGVhcmluZyB0aGUgY29ycmVzcG9uZGluZyBiaXQgaW4gdGhlIEVYVElfUFIxDQotICogICAgICAgcmVnaXN0ZXIgKGJ5IHdyaXRpbmcgYSAxIGludG8gdGhlIGJpdCkNCi0gKiBAcm10b2xsIFNXSUVSMSAgICAgICBTV0l4ICAgICAgICAgIExMX0VYVElfR2VuZXJhdGVTV0lfMF8zMQ0KLSAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV81DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV84DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzEgKCopDQotICogQG5vdGUgICAoKik6IEF2YWlsYWJsZSBpbiBzb21lIGRldmljZXMNCi0gKiBAbm90ZSAgIFBsZWFzZSBjaGVjayBlYWNoIGRldmljZSBsaW5lIG1hcHBpbmcgZm9yIEVYVEkgTGluZSBhdmFpbGFiaWxpdHkNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9FWFRJX0dlbmVyYXRlU1dJXzBfMzEodWludDMyX3QgRXh0aUxpbmUpIHsNCi0gIFNFVF9CSVQoRVhUSS0+U1dJRVIxLCBFeHRpTGluZSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2VuZXJhdGUgYSBzb2Z0d2FyZSBJbnRlcnJ1cHQgRXZlbnQgZm9yIExpbmVzIGluIHJhbmdlIDMyIHRvIDYzDQotICogQG5vdGUgSWYgdGhlIGludGVycnVwdCBpcyBlbmFibGVkIG9uIHRoaXMgbGluZSBpbiB0aGUgRVhUSV9JTVIyLCB3cml0aW5nIGEgMQ0KLSAqIHRvIHRoaXMgYml0IHdoZW4gaXQgaXMgYXQgJzAnIHNldHMgdGhlIGNvcnJlc3BvbmRpbmcgcGVuZGluZyBiaXQgaW4gRVhUSV9QUjINCi0gKiAgICAgICByZXN1bHRpbmcgaW4gYW4gaW50ZXJydXB0IHJlcXVlc3QgZ2VuZXJhdGlvbi4NCi0gKiAgICAgICBUaGlzIGJpdCBpcyBjbGVhcmVkIGJ5IGNsZWFyaW5nIHRoZSBjb3JyZXNwb25kaW5nIGJpdCBpbiB0aGUgRVhUSV9QUjINCi0gKiAgICAgICByZWdpc3RlciAoYnkgd3JpdGluZyBhIDEgaW50byB0aGUgYml0KQ0KLSAqIEBybXRvbGwgU1dJRVIyICAgICAgIFNXSXggICAgICAgICAgTExfRVhUSV9HZW5lcmF0ZVNXSV8zMl82Mw0KLSAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMyICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMyAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNDANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNDENCi0gKiBAbm90ZSAgICgqKTogQXZhaWxhYmxlIGluIHNvbWUgZGV2aWNlcw0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0VYVElfR2VuZXJhdGVTV0lfMzJfNjModWludDMyX3QgRXh0aUxpbmUpIHsNCi0gIFNFVF9CSVQoRVhUSS0+U1dJRVIyLCBFeHRpTGluZSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBFWFRJX0xMX0VGX0ZsYWdfTWFuYWdlbWVudCBGbGFnX01hbmFnZW1lbnQNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIEV4dExpbmUgRmxhZyBpcyBzZXQgb3Igbm90IGZvciBMaW5lcyBpbiByYW5nZSAwIHRvIDMxDQotICogQG5vdGUgVGhpcyBiaXQgaXMgc2V0IHdoZW4gdGhlIHNlbGVjdGVkIGVkZ2UgZXZlbnQgYXJyaXZlcyBvbiB0aGUgaW50ZXJydXB0DQotICogICAgICAgbGluZS4gVGhpcyBiaXQgaXMgY2xlYXJlZCBieSB3cml0aW5nIGEgMSB0byB0aGUgYml0Lg0KLSAqIEBybXRvbGwgUFIxICAgICAgICAgIFBJRnggICAgICAgICAgIExMX0VYVElfSXNBY3RpdmVGbGFnXzBfMzENCi0gKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8wDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV82DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV85DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEwDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzExDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEyDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEzDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE0DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE1DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE2DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE4DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE5DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIwDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIxDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIyDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI5DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMwDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMxICgqKQ0KLSAqIEBub3RlICAgKCopOiBBdmFpbGFibGUgaW4gc29tZSBkZXZpY2VzDQotICogQG5vdGUgICBQbGVhc2UgY2hlY2sgZWFjaCBkZXZpY2UgbGluZSBtYXBwaW5nIGZvciBFWFRJIExpbmUgYXZhaWxhYmlsaXR5DQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0VYVElfSXNBY3RpdmVGbGFnXzBfMzEodWludDMyX3QgRXh0aUxpbmUpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKEVYVEktPlBSMSwgRXh0aUxpbmUpID09IChFeHRpTGluZSkpID8gMVVMIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiB0aGUgRXh0TGluZSBGbGFnIGlzIHNldCBvciBub3QgZm9yICBMaW5lcyBpbiByYW5nZSAzMiB0byA2Mw0KLSAqIEBub3RlIFRoaXMgYml0IGlzIHNldCB3aGVuIHRoZSBzZWxlY3RlZCBlZGdlIGV2ZW50IGFycml2ZXMgb24gdGhlIGludGVycnVwdA0KLSAqICAgICAgIGxpbmUuIFRoaXMgYml0IGlzIGNsZWFyZWQgYnkgd3JpdGluZyBhIDEgdG8gdGhlIGJpdC4NCi0gKiBAcm10b2xsIFBSMiAgICAgICAgICBQSUZ4ICAgICAgICAgICBMTF9FWFRJX0lzQWN0aXZlRmxhZ18zMl82Mw0KLSAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMyICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMyAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNDANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNDENCi0gKiBAbm90ZSAgICgqKTogQXZhaWxhYmxlIGluIHNvbWUgZGV2aWNlcw0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9FWFRJX0lzQWN0aXZlRmxhZ18zMl82Myh1aW50MzJfdCBFeHRpTGluZSkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoRVhUSS0+UFIyLCBFeHRpTGluZSkgPT0gKEV4dGlMaW5lKSkgPyAxVUwgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJlYWQgRXh0TGluZSBDb21iaW5hdGlvbiBGbGFnIGZvciBMaW5lcyBpbiByYW5nZSAwIHRvIDMxDQotICogQG5vdGUgVGhpcyBiaXQgaXMgc2V0IHdoZW4gdGhlIHNlbGVjdGVkIGVkZ2UgZXZlbnQgYXJyaXZlcyBvbiB0aGUgaW50ZXJydXB0DQotICogICAgICAgbGluZS4gVGhpcyBiaXQgaXMgY2xlYXJlZCBieSB3cml0aW5nIGEgMSB0byB0aGUgYml0Lg0KLSAqIEBybXRvbGwgUFIxICAgICAgICAgIFBJRnggICAgICAgICAgIExMX0VYVElfUmVhZEZsYWdfMF8zMQ0KLSAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV81DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV84DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzEgKCopDQotICogQG5vdGUgICAoKik6IEF2YWlsYWJsZSBpbiBzb21lIGRldmljZXMNCi0gKiBAbm90ZSAgIFBsZWFzZSBjaGVjayBlYWNoIGRldmljZSBsaW5lIG1hcHBpbmcgZm9yIEVYVEkgTGluZSBhdmFpbGFiaWxpdHkNCi0gKiBAcmV0dmFsIEBub3RlIFRoaXMgYml0IGlzIHNldCB3aGVuIHRoZSBzZWxlY3RlZCBlZGdlIGV2ZW50IGFycml2ZXMgb24gdGhlDQotICogaW50ZXJydXB0DQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0VYVElfUmVhZEZsYWdfMF8zMSh1aW50MzJfdCBFeHRpTGluZSkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoRVhUSS0+UFIxLCBFeHRpTGluZSkpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJlYWQgRXh0TGluZSBDb21iaW5hdGlvbiBGbGFnIGZvciAgTGluZXMgaW4gcmFuZ2UgMzIgdG8gNjMNCi0gKiBAbm90ZSBUaGlzIGJpdCBpcyBzZXQgd2hlbiB0aGUgc2VsZWN0ZWQgZWRnZSBldmVudCBhcnJpdmVzIG9uIHRoZSBpbnRlcnJ1cHQNCi0gKiAgICAgICBsaW5lLiBUaGlzIGJpdCBpcyBjbGVhcmVkIGJ5IHdyaXRpbmcgYSAxIHRvIHRoZSBiaXQuDQotICogQHJtdG9sbCBQUjIgICAgICAgICAgUElGeCAgICAgICAgICAgTExfRVhUSV9SZWFkRmxhZ18zMl82Mw0KLSAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMyICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMyAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNDANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNDENCi0gKiBAbm90ZSAgICgqKTogQXZhaWxhYmxlIGluIHNvbWUgZGV2aWNlcw0KLSAqIEByZXR2YWwgQG5vdGUgVGhpcyBiaXQgaXMgc2V0IHdoZW4gdGhlIHNlbGVjdGVkIGVkZ2UgZXZlbnQgYXJyaXZlcyBvbiB0aGUNCi0gKiBpbnRlcnJ1cHQNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRVhUSV9SZWFkRmxhZ18zMl82Myh1aW50MzJfdCBFeHRpTGluZSkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoRVhUSS0+UFIyLCBFeHRpTGluZSkpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENsZWFyIEV4dExpbmUgRmxhZ3MgIGZvciBMaW5lcyBpbiByYW5nZSAwIHRvIDMxDQotICogQG5vdGUgVGhpcyBiaXQgaXMgc2V0IHdoZW4gdGhlIHNlbGVjdGVkIGVkZ2UgZXZlbnQgYXJyaXZlcyBvbiB0aGUgaW50ZXJydXB0DQotICogICAgICAgbGluZS4gVGhpcyBiaXQgaXMgY2xlYXJlZCBieSB3cml0aW5nIGEgMSB0byB0aGUgYml0Lg0KLSAqIEBybXRvbGwgUFIxICAgICAgICAgIFBJRnggICAgICAgICAgIExMX0VYVElfQ2xlYXJGbGFnXzBfMzENCi0gKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8wDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV82DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV85DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEwDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzExDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEyDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEzDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE0DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE1DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE2DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE4DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE5DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIwDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIxDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIyDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI5DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMwDQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMxICgqKQ0KLSAqIEBub3RlICAgKCopOiBBdmFpbGFibGUgaW4gc29tZSBkZXZpY2VzDQotICogQG5vdGUgICBQbGVhc2UgY2hlY2sgZWFjaCBkZXZpY2UgbGluZSBtYXBwaW5nIGZvciBFWFRJIExpbmUgYXZhaWxhYmlsaXR5DQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRVhUSV9DbGVhckZsYWdfMF8zMSh1aW50MzJfdCBFeHRpTGluZSkgew0KLSAgV1JJVEVfUkVHKEVYVEktPlBSMSwgRXh0aUxpbmUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENsZWFyIEV4dExpbmUgRmxhZ3MgZm9yICBMaW5lcyBpbiByYW5nZSAzMiB0byA2Mw0KLSAqIEBub3RlIFRoaXMgYml0IGlzIHNldCB3aGVuIHRoZSBzZWxlY3RlZCBlZGdlIGV2ZW50IGFycml2ZXMgb24gdGhlIGludGVycnVwdA0KLSAqICAgICAgIGxpbmUuIFRoaXMgYml0IGlzIGNsZWFyZWQgYnkgd3JpdGluZyBhIDEgdG8gdGhlIGJpdC4NCi0gKiBAcm10b2xsIFBSMiAgICAgICAgICBQSUZ4ICAgICAgICAgICBMTF9FWFRJX0NsZWFyRmxhZ18zMl82Mw0KLSAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMyICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMyAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNDANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNDENCi0gKiBAbm90ZSAgICgqKTogQXZhaWxhYmxlIGluIHNvbWUgZGV2aWNlcw0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0VYVElfQ2xlYXJGbGFnXzMyXzYzKHVpbnQzMl90IEV4dGlMaW5lKSB7DQotICBXUklURV9SRUcoRVhUSS0+UFIyLCBFeHRpTGluZSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQ0KLS8qKiBAZGVmZ3JvdXAgRVhUSV9MTF9FRl9Jbml0IEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMNCi0gKiBAew0KLSAqLw0KLQ0KLXVpbnQzMl90IExMX0VYVElfSW5pdChMTF9FWFRJX0luaXRUeXBlRGVmICpFWFRJX0luaXRTdHJ1Y3QpOw0KLXVpbnQzMl90IExMX0VYVElfRGVJbml0KHZvaWQpOw0KLXZvaWQgTExfRVhUSV9TdHJ1Y3RJbml0KExMX0VYVElfSW5pdFR5cGVEZWYgKkVYVElfSW5pdFN0cnVjdCk7DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0jZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLSNlbmRpZiAvKiBFWFRJICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0jaWZkZWYgX19jcGx1c3BsdXMNCi19DQotI2VuZGlmDQotDQotI2VuZGlmIC8qIF9fU1RNMzJHNHh4X0xMX0VYVElfSCAqLw0KKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGZpbGUgICAgc3RtMzJnNHh4X2xsX2V4dGkuaAorICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIEVYVEkgTEwgbW9kdWxlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGF0dGVudGlvbgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGVybXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZQorICogaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc29mdHdhcmUgY29tcG9uZW50LgorICogSWYgbm8gTElDRU5TRSBmaWxlIGNvbWVzIHdpdGggdGhpcyBzb2Z0d2FyZSwgaXQgaXMgcHJvdmlkZWQgQVMtSVMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9fU1RNMzJHNHh4X0xMX0VYVElfSAorI2RlZmluZSBfX1NUTTMyRzR4eF9MTF9FWFRJX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzR4eC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHNHh4X0xMX0RyaXZlcgorICogQHsKKyAqLworCisjaWYgZGVmaW5lZChFWFRJKQorCisvKiogQGRlZmdyb3VwIEVYVElfTEwgRVhUSQorICogQHsKKyAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIE1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBFWFRJX0xMX1ByaXZhdGVfTWFjcm9zIEVYVEkgUHJpdmF0ZSBNYWNyb3MKKyAqIEB7CisgKi8KKy8qKgorICogQH0KKyAqLworI2VuZGlmIC8qVVNFX0ZVTExfTExfRFJJVkVSKi8KKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIEVYVElfTExfRVNfSU5JVCBFWFRJIEV4cG9ydGVkIEluaXQgc3RydWN0dXJlCisgKiBAeworICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQzMl90IExpbmVfMF8zMTsgLyohPCBTcGVjaWZpZXMgdGhlIEVYVEkgbGluZXMgdG8gYmUgZW5hYmxlZCBvciBkaXNhYmxlZAorICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBMaW5lcyBpbiByYW5nZSAwIHRvIDMxIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb21iaW5hdGlvbiBvZiBAcmVmIEVYVElfTExfRUNfTElORSAqLworCisgIHVpbnQzMl90IExpbmVfMzJfNjM7IC8qITwgU3BlY2lmaWVzIHRoZSBFWFRJIGxpbmVzIHRvIGJlIGVuYWJsZWQgb3IgZGlzYWJsZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIExpbmVzIGluIHJhbmdlIDMyIHRvIDYzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29tYmluYXRpb24gb2YgQHJlZiBFWFRJX0xMX0VDX0xJTkUgKi8KKworICBGdW5jdGlvbmFsU3RhdGUKKyAgICAgIExpbmVDb21tYW5kOyAvKiE8IFNwZWNpZmllcyB0aGUgbmV3IHN0YXRlIG9mIHRoZSBzZWxlY3RlZCBFWFRJIGxpbmVzLgorICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHNldCBlaXRoZXIgdG8gRU5BQkxFIG9yIERJU0FCTEUgKi8KKworICB1aW50OF90IE1vZGU7IC8qITwgU3BlY2lmaWVzIHRoZSBtb2RlIGZvciB0aGUgRVhUSSBsaW5lcy4KKyAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRVhUSV9MTF9FQ19NT0RFLiAqLworCisgIHVpbnQ4X3QKKyAgICAgIFRyaWdnZXI7IC8qITwgU3BlY2lmaWVzIHRoZSB0cmlnZ2VyIHNpZ25hbCBhY3RpdmUgZWRnZSBmb3IgdGhlIEVYVEkgbGluZXMuCisgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRVhUSV9MTF9FQ19UUklHR0VSLiAqLworfSBMTF9FWFRJX0luaXRUeXBlRGVmOworCisvKioKKyAqIEB9CisgKi8KKyNlbmRpZiAvKlVTRV9GVUxMX0xMX0RSSVZFUiovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEVYVElfTExfRXhwb3J0ZWRfQ29uc3RhbnRzIEVYVEkgRXhwb3J0ZWQgQ29uc3RhbnRzCisgKiBAeworICovCisKKy8qKiBAZGVmZ3JvdXAgRVhUSV9MTF9FQ19MSU5FIExJTkUKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfRVhUSV9MSU5FXzAgRVhUSV9JTVIxX0lNMCAgIC8qITwgRXh0ZW5kZWQgbGluZSAwICovCisjZGVmaW5lIExMX0VYVElfTElORV8xIEVYVElfSU1SMV9JTTEgICAvKiE8IEV4dGVuZGVkIGxpbmUgMSAqLworI2RlZmluZSBMTF9FWFRJX0xJTkVfMiBFWFRJX0lNUjFfSU0yICAgLyohPCBFeHRlbmRlZCBsaW5lIDIgKi8KKyNkZWZpbmUgTExfRVhUSV9MSU5FXzMgRVhUSV9JTVIxX0lNMyAgIC8qITwgRXh0ZW5kZWQgbGluZSAzICovCisjZGVmaW5lIExMX0VYVElfTElORV80IEVYVElfSU1SMV9JTTQgICAvKiE8IEV4dGVuZGVkIGxpbmUgNCAqLworI2RlZmluZSBMTF9FWFRJX0xJTkVfNSBFWFRJX0lNUjFfSU01ICAgLyohPCBFeHRlbmRlZCBsaW5lIDUgKi8KKyNkZWZpbmUgTExfRVhUSV9MSU5FXzYgRVhUSV9JTVIxX0lNNiAgIC8qITwgRXh0ZW5kZWQgbGluZSA2ICovCisjZGVmaW5lIExMX0VYVElfTElORV83IEVYVElfSU1SMV9JTTcgICAvKiE8IEV4dGVuZGVkIGxpbmUgNyAqLworI2RlZmluZSBMTF9FWFRJX0xJTkVfOCBFWFRJX0lNUjFfSU04ICAgLyohPCBFeHRlbmRlZCBsaW5lIDggKi8KKyNkZWZpbmUgTExfRVhUSV9MSU5FXzkgRVhUSV9JTVIxX0lNOSAgIC8qITwgRXh0ZW5kZWQgbGluZSA5ICovCisjZGVmaW5lIExMX0VYVElfTElORV8xMCBFWFRJX0lNUjFfSU0xMCAvKiE8IEV4dGVuZGVkIGxpbmUgMTAgKi8KKyNkZWZpbmUgTExfRVhUSV9MSU5FXzExIEVYVElfSU1SMV9JTTExIC8qITwgRXh0ZW5kZWQgbGluZSAxMSAqLworI2RlZmluZSBMTF9FWFRJX0xJTkVfMTIgRVhUSV9JTVIxX0lNMTIgLyohPCBFeHRlbmRlZCBsaW5lIDEyICovCisjZGVmaW5lIExMX0VYVElfTElORV8xMyBFWFRJX0lNUjFfSU0xMyAvKiE8IEV4dGVuZGVkIGxpbmUgMTMgKi8KKyNkZWZpbmUgTExfRVhUSV9MSU5FXzE0IEVYVElfSU1SMV9JTTE0IC8qITwgRXh0ZW5kZWQgbGluZSAxNCAqLworI2RlZmluZSBMTF9FWFRJX0xJTkVfMTUgRVhUSV9JTVIxX0lNMTUgLyohPCBFeHRlbmRlZCBsaW5lIDE1ICovCisjaWYgZGVmaW5lZChFWFRJX0lNUjFfSU0xNikKKyNkZWZpbmUgTExfRVhUSV9MSU5FXzE2IEVYVElfSU1SMV9JTTE2IC8qITwgRXh0ZW5kZWQgbGluZSAxNiAqLworI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRVhUSV9JTVIxX0lNMTYgKi8KKyNkZWZpbmUgTExfRVhUSV9MSU5FXzE3IEVYVElfSU1SMV9JTTE3IC8qITwgRXh0ZW5kZWQgbGluZSAxNyAqLworI2lmIGRlZmluZWQoRVhUSV9JTVIxX0lNMTgpCisjZGVmaW5lIExMX0VYVElfTElORV8xOCBFWFRJX0lNUjFfSU0xOCAvKiE8IEV4dGVuZGVkIGxpbmUgMTggKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVYVElfSU1SMV9JTTE4ICovCisjZGVmaW5lIExMX0VYVElfTElORV8xOSBFWFRJX0lNUjFfSU0xOSAvKiE8IEV4dGVuZGVkIGxpbmUgMTkgKi8KKyNpZiBkZWZpbmVkKEVYVElfSU1SMV9JTTIwKQorI2RlZmluZSBMTF9FWFRJX0xJTkVfMjAgRVhUSV9JTVIxX0lNMjAgLyohPCBFeHRlbmRlZCBsaW5lIDIwICovCisjZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFWFRJX0lNUjFfSU0yMCAqLworI2lmIGRlZmluZWQoRVhUSV9JTVIxX0lNMjEpCisjZGVmaW5lIExMX0VYVElfTElORV8yMSBFWFRJX0lNUjFfSU0yMSAvKiE8IEV4dGVuZGVkIGxpbmUgMjEgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVYVElfSU1SMV9JTTIxICovCisjaWYgZGVmaW5lZChFWFRJX0lNUjFfSU0yMikKKyNkZWZpbmUgTExfRVhUSV9MSU5FXzIyIEVYVElfSU1SMV9JTTIyIC8qITwgRXh0ZW5kZWQgbGluZSAyMiAqLworI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRVhUSV9JTVIxX0lNMjIgKi8KKyNkZWZpbmUgTExfRVhUSV9MSU5FXzIzIEVYVElfSU1SMV9JTTIzIC8qITwgRXh0ZW5kZWQgbGluZSAyMyAqLworI2lmIGRlZmluZWQoRVhUSV9JTVIxX0lNMjQpCisjZGVmaW5lIExMX0VYVElfTElORV8yNCBFWFRJX0lNUjFfSU0yNCAvKiE8IEV4dGVuZGVkIGxpbmUgMjQgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVYVElfSU1SMV9JTTI0ICovCisjaWYgZGVmaW5lZChFWFRJX0lNUjFfSU0yNSkKKyNkZWZpbmUgTExfRVhUSV9MSU5FXzI1IEVYVElfSU1SMV9JTTI1IC8qITwgRXh0ZW5kZWQgbGluZSAyNSAqLworI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRVhUSV9JTVIxX0lNMjUgKi8KKyNpZiBkZWZpbmVkKEVYVElfSU1SMV9JTTI2KQorI2RlZmluZSBMTF9FWFRJX0xJTkVfMjYgRVhUSV9JTVIxX0lNMjYgLyohPCBFeHRlbmRlZCBsaW5lIDI2ICovCisjZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFWFRJX0lNUjFfSU0yNiAqLworI2lmIGRlZmluZWQoRVhUSV9JTVIxX0lNMjcpCisjZGVmaW5lIExMX0VYVElfTElORV8yNyBFWFRJX0lNUjFfSU0yNyAvKiE8IEV4dGVuZGVkIGxpbmUgMjcgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVYVElfSU1SMV9JTTI3ICovCisjaWYgZGVmaW5lZChFWFRJX0lNUjFfSU0yOCkKKyNkZWZpbmUgTExfRVhUSV9MSU5FXzI4IEVYVElfSU1SMV9JTTI4IC8qITwgRXh0ZW5kZWQgbGluZSAyOCAqLworI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRVhUSV9JTVIxX0lNMjggKi8KKyNpZiBkZWZpbmVkKEVYVElfSU1SMV9JTTI5KQorI2RlZmluZSBMTF9FWFRJX0xJTkVfMjkgRVhUSV9JTVIxX0lNMjkgLyohPCBFeHRlbmRlZCBsaW5lIDI5ICovCisjZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFWFRJX0lNUjFfSU0yOSAqLworI2lmIGRlZmluZWQoRVhUSV9JTVIxX0lNMzApCisjZGVmaW5lIExMX0VYVElfTElORV8zMCBFWFRJX0lNUjFfSU0zMCAvKiE8IEV4dGVuZGVkIGxpbmUgMzAgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVYVElfSU1SMV9JTTMwICovCisjaWYgZGVmaW5lZChFWFRJX0lNUjFfSU0zMSkKKyNkZWZpbmUgTExfRVhUSV9MSU5FXzMxIEVYVElfSU1SMV9JTTMxIC8qITwgRXh0ZW5kZWQgbGluZSAzMSAqLworI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRVhUSV9JTVIxX0lNMzEgKi8KKyNkZWZpbmUgTExfRVhUSV9MSU5FX0FMTF8wXzMxICAgICAgICAgICAgIFwKKyAgRVhUSV9JTVIxX0lNIC8qITwgQWxsIEV4dGVuZGVkIGxpbmUgbm90IFwKKyAgICAgICAgICAgICAgICAgIHJlc2VydmVkKi8KKworI2lmIGRlZmluZWQoRVhUSV9JTVIyX0lNMzIpCisjZGVmaW5lIExMX0VYVElfTElORV8zMiBFWFRJX0lNUjJfSU0zMiAvKiE8IEV4dGVuZGVkIGxpbmUgMzIgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVYVElfSU1SMl9JTTMyICovCisjaWYgZGVmaW5lZChFWFRJX0lNUjJfSU0zMykKKyNkZWZpbmUgTExfRVhUSV9MSU5FXzMzIEVYVElfSU1SMl9JTTMzIC8qITwgRXh0ZW5kZWQgbGluZSAzMyAqLworI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRVhUSV9JTVIyX0lNMzMgKi8KKyNpZiBkZWZpbmVkKEVYVElfSU1SMl9JTTM0KQorI2RlZmluZSBMTF9FWFRJX0xJTkVfMzQgRVhUSV9JTVIyX0lNMzQgLyohPCBFeHRlbmRlZCBsaW5lIDM0ICovCisjZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFWFRJX0lNUjJfSU0zNCAqLworI2lmIGRlZmluZWQoRVhUSV9JTVIyX0lNMzUpCisjZGVmaW5lIExMX0VYVElfTElORV8zNSBFWFRJX0lNUjJfSU0zNSAvKiE8IEV4dGVuZGVkIGxpbmUgMzUgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVYVElfSU1SMl9JTTM1ICovCisjaWYgZGVmaW5lZChFWFRJX0lNUjJfSU0zNikKKyNkZWZpbmUgTExfRVhUSV9MSU5FXzM2IEVYVElfSU1SMl9JTTM2IC8qITwgRXh0ZW5kZWQgbGluZSAzNiAqLworI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRVhUSV9JTVIyX0lNMzYgKi8KKyNpZiBkZWZpbmVkKEVYVElfSU1SMl9JTTM3KQorI2RlZmluZSBMTF9FWFRJX0xJTkVfMzcgRVhUSV9JTVIyX0lNMzcgLyohPCBFeHRlbmRlZCBsaW5lIDM3ICovCisjZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFWFRJX0lNUjJfSU0zNyAqLworI2lmIGRlZmluZWQoRVhUSV9JTVIyX0lNMzgpCisjZGVmaW5lIExMX0VYVElfTElORV8zOCBFWFRJX0lNUjJfSU0zOCAvKiE8IEV4dGVuZGVkIGxpbmUgMzggKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVYVElfSU1SMl9JTTM4ICovCisjaWYgZGVmaW5lZChFWFRJX0lNUjJfSU0zOSkKKyNkZWZpbmUgTExfRVhUSV9MSU5FXzM5IEVYVElfSU1SMl9JTTM5IC8qITwgRXh0ZW5kZWQgbGluZSAzOSAqLworI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRVhUSV9JTVIyX0lNMzkgKi8KKyNpZiBkZWZpbmVkKEVYVElfSU1SMl9JTTQwKQorI2RlZmluZSBMTF9FWFRJX0xJTkVfNDAgRVhUSV9JTVIyX0lNNDAgLyohPCBFeHRlbmRlZCBsaW5lIDQwICovCisjZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFWFRJX0lNUjJfSU00MCAqLworI2lmIGRlZmluZWQoRVhUSV9JTVIyX0lNNDEpCisjZGVmaW5lIExMX0VYVElfTElORV80MSBFWFRJX0lNUjJfSU00MSAvKiE8IEV4dGVuZGVkIGxpbmUgNDEgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVYVElfSU1SMl9JTTQxICovCisjaWYgZGVmaW5lZChFWFRJX0lNUjJfSU00MikKKyNkZWZpbmUgTExfRVhUSV9MSU5FXzQyIEVYVElfSU1SMl9JTTQyIC8qITwgRXh0ZW5kZWQgbGluZSA0MiAqLworI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRVhUSV9JTVIyX0lNNDIgKi8KKyNkZWZpbmUgTExfRVhUSV9MSU5FX0FMTF8zMl82MyBcCisgIEVYVElfSU1SMl9JTSAvKiE8IEFsbCBFeHRlbmRlZCBsaW5lIG5vdCByZXNlcnZlZCovCisKKyNkZWZpbmUgTExfRVhUSV9MSU5FX0FMTCAoMHhGRkZGRkZGRlUpIC8qITwgQWxsIEV4dGVuZGVkIGxpbmUgKi8KKworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorI2RlZmluZSBMTF9FWFRJX0xJTkVfTk9ORSAweDAwMDAwMDAwVSAvKiE8IE5vbmUgRXh0ZW5kZWQgbGluZSAqLworI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlVTRV9GVUxMX0xMX0RSSVZFUiovCisKKy8qKgorICogQH0KKyAqLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorCisvKiogQGRlZmdyb3VwIEVYVElfTExfRUNfTU9ERSBNb2RlCisgKiBAeworICovCisjZGVmaW5lIExMX0VYVElfTU9ERV9JVCAoKHVpbnQ4X3QpMHgwMFUpICAgICAgIC8qITwgSW50ZXJydXB0IE1vZGUgKi8KKyNkZWZpbmUgTExfRVhUSV9NT0RFX0VWRU5UICgodWludDhfdCkweDAxVSkgICAgLyohPCBFdmVudCBNb2RlICovCisjZGVmaW5lIExMX0VYVElfTU9ERV9JVF9FVkVOVCAoKHVpbnQ4X3QpMHgwMlUpIC8qITwgSW50ZXJydXB0ICYgRXZlbnQgTW9kZSAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgRVhUSV9MTF9FQ19UUklHR0VSIEVkZ2UgVHJpZ2dlcgorICogQHsKKyAqLworI2RlZmluZSBMTF9FWFRJX1RSSUdHRVJfTk9ORSAoKHVpbnQ4X3QpMHgwMFUpICAgIC8qITwgTm8gVHJpZ2dlciBNb2RlICovCisjZGVmaW5lIExMX0VYVElfVFJJR0dFUl9SSVNJTkcgKCh1aW50OF90KTB4MDFVKSAgLyohPCBUcmlnZ2VyIFJpc2luZyBNb2RlICovCisjZGVmaW5lIExMX0VYVElfVFJJR0dFUl9GQUxMSU5HICgodWludDhfdCkweDAyVSkgLyohPCBUcmlnZ2VyIEZhbGxpbmcgTW9kZSAqLworI2RlZmluZSBMTF9FWFRJX1RSSUdHRVJfUklTSU5HX0ZBTExJTkcgXAorICAoKHVpbnQ4X3QpMHgwM1UpIC8qITwgVHJpZ2dlciBSaXNpbmcgJiBGYWxsaW5nIE1vZGUgKi8KKworLyoqCisgKiBAfQorICovCisKKyNlbmRpZiAvKlVTRV9GVUxMX0xMX0RSSVZFUiovCisKKy8qKgorICogQH0KKyAqLworCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBFWFRJX0xMX0V4cG9ydGVkX01hY3JvcyBFWFRJIEV4cG9ydGVkIE1hY3JvcworICogQHsKKyAqLworCisvKiogQGRlZmdyb3VwIEVYVElfTExfRU1fV1JJVEVfUkVBRCBDb21tb24gV3JpdGUgYW5kIHJlYWQgcmVnaXN0ZXJzIE1hY3JvcworICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiAgV3JpdGUgYSB2YWx1ZSBpbiBFWFRJIHJlZ2lzdGVyCisgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgd3JpdHRlbgorICogQHBhcmFtICBfX1ZBTFVFX18gVmFsdWUgdG8gYmUgd3JpdHRlbiBpbiB0aGUgcmVnaXN0ZXIKKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIExMX0VYVElfV3JpdGVSZWcoX19SRUdfXywgX19WQUxVRV9fKSBcCisgIFdSSVRFX1JFRyhFWFRJLT5fX1JFR19fLCAoX19WQUxVRV9fKSkKKworLyoqCisgKiBAYnJpZWYgIFJlYWQgYSB2YWx1ZSBpbiBFWFRJIHJlZ2lzdGVyCisgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgcmVhZAorICogQHJldHZhbCBSZWdpc3RlciB2YWx1ZQorICovCisjZGVmaW5lIExMX0VYVElfUmVhZFJlZyhfX1JFR19fKSBSRUFEX1JFRyhFWFRJLT5fX1JFR19fKQorLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBFWFRJX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucyBFWFRJIEV4cG9ydGVkIEZ1bmN0aW9ucworICogQHsKKyAqLworLyoqIEBkZWZncm91cCBFWFRJX0xMX0VGX0lUX01hbmFnZW1lbnQgSVRfTWFuYWdlbWVudAorICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiAgRW5hYmxlIEV4dGlMaW5lIEludGVycnVwdCByZXF1ZXN0IGZvciBMaW5lcyBpbiByYW5nZSAwIHRvIDMxCisgKiBAbm90ZSBUaGUgcmVzZXQgdmFsdWUgZm9yIHRoZSBkaXJlY3Qgb3IgaW50ZXJuYWwgbGluZXMgKHNlZSBSTSkKKyAqICAgICAgIGlzIHNldCB0byAxIGluIG9yZGVyIHRvIGVuYWJsZSB0aGUgaW50ZXJydXB0IGJ5IGRlZmF1bHQuCisgKiAgICAgICBCaXRzIGFyZSBzZXQgYXV0b21hdGljYWxseSBhdCBQb3dlciBvbi4KKyAqIEBybXRvbGwgSU1SMSAgICAgICAgIElNeCAgICAgICAgICAgTExfRVhUSV9FbmFibGVJVF8wXzMxCisgKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMworICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV81CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNgorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV84CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMgorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE2CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE5CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yNAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI1CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yNworICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI4CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMxICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FX0FMTF8wXzMxCisgKiBAbm90ZSAgICgqKTogQXZhaWxhYmxlIGluIHNvbWUgZGV2aWNlcworICogQG5vdGUgICBQbGVhc2UgY2hlY2sgZWFjaCBkZXZpY2UgbGluZSBtYXBwaW5nIGZvciBFWFRJIExpbmUgYXZhaWxhYmlsaXR5CisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRVhUSV9FbmFibGVJVF8wXzMxKHVpbnQzMl90IEV4dGlMaW5lKSB7CisgIFNFVF9CSVQoRVhUSS0+SU1SMSwgRXh0aUxpbmUpOworfQorLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBFeHRpTGluZSBJbnRlcnJ1cHQgcmVxdWVzdCBmb3IgTGluZXMgaW4gcmFuZ2UgMzIgdG8gNjMKKyAqIEBub3RlIFRoZSByZXNldCB2YWx1ZSBmb3IgdGhlIGRpcmVjdCBsaW5lcyAobGluZXMgZnJvbSAzMiB0byAzNCwgbGluZQorICogICAgICAgMzkpIGlzIHNldCB0byAxIGluIG9yZGVyIHRvIGVuYWJsZSB0aGUgaW50ZXJydXB0IGJ5IGRlZmF1bHQuCisgKiAgICAgICBCaXRzIGFyZSBzZXQgYXV0b21hdGljYWxseSBhdCBQb3dlciBvbi4KKyAqIEBybXRvbGwgSU1SMiAgICAgICAgIElNeCAgICAgICAgICAgTExfRVhUSV9FbmFibGVJVF8zMl82MworICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMyICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMzICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzUgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zNworICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM4CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNDIoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV9BTExfMzJfNjMKKyAqIEBub3RlICAgKCopOiBBdmFpbGFibGUgaW4gc29tZSBkZXZpY2VzCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRVhUSV9FbmFibGVJVF8zMl82Myh1aW50MzJfdCBFeHRpTGluZSkgeworICBTRVRfQklUKEVYVEktPklNUjIsIEV4dGlMaW5lKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgRXh0aUxpbmUgSW50ZXJydXB0IHJlcXVlc3QgZm9yIExpbmVzIGluIHJhbmdlIDAgdG8gMzEKKyAqIEBub3RlIFRoZSByZXNldCB2YWx1ZSBmb3IgdGhlIGRpcmVjdCBvciBpbnRlcm5hbCBsaW5lcyAoc2VlIFJNKQorICogICAgICAgaXMgc2V0IHRvIDEgaW4gb3JkZXIgdG8gZW5hYmxlIHRoZSBpbnRlcnJ1cHQgYnkgZGVmYXVsdC4KKyAqICAgICAgIEJpdHMgYXJlIHNldCBhdXRvbWF0aWNhbGx5IGF0IFBvd2VyIG9uLgorICogQHJtdG9sbCBJTVIxICAgICAgICAgSU14ICAgICAgICAgICBMTF9FWFRJX0Rpc2FibGVJVF8wXzMxCisgKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMworICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV81CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNgorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV84CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMgorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE2CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE5CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yNAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI1CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yNworICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI4CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfQUxMXzBfMzEgKCopCisgKiBAbm90ZSAgICgqKTogQXZhaWxhYmxlIGluIHNvbWUgZGV2aWNlcworICogQG5vdGUgICBQbGVhc2UgY2hlY2sgZWFjaCBkZXZpY2UgbGluZSBtYXBwaW5nIGZvciBFWFRJIExpbmUgYXZhaWxhYmlsaXR5CisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRVhUSV9EaXNhYmxlSVRfMF8zMSh1aW50MzJfdCBFeHRpTGluZSkgeworICBDTEVBUl9CSVQoRVhUSS0+SU1SMSwgRXh0aUxpbmUpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBFeHRpTGluZSBJbnRlcnJ1cHQgcmVxdWVzdCBmb3IgTGluZXMgaW4gcmFuZ2UgMzIgdG8gNjMKKyAqIEBub3RlIFRoZSByZXNldCB2YWx1ZSBmb3IgdGhlIGRpcmVjdCBsaW5lcyAobGluZXMgZnJvbSAzMiB0byAzNCwgbGluZQorICogICAgICAgMzkpIGlzIHNldCB0byAxIGluIG9yZGVyIHRvIGVuYWJsZSB0aGUgaW50ZXJydXB0IGJ5IGRlZmF1bHQuCisgKiAgICAgICBCaXRzIGFyZSBzZXQgYXV0b21hdGljYWxseSBhdCBQb3dlciBvbi4KKyAqIEBybXRvbGwgSU1SMiAgICAgICAgIElNeCAgICAgICAgICAgTExfRVhUSV9EaXNhYmxlSVRfMzJfNjMKKyAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMiAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMyAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zNAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM1ICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM2CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zOAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM5CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNDAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQyKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfQUxMXzMyXzYzCisgKiBAbm90ZSAgICgqKTogQXZhaWxhYmxlIGluIHNvbWUgZGV2aWNlcworICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0VYVElfRGlzYWJsZUlUXzMyXzYzKHVpbnQzMl90IEV4dGlMaW5lKSB7CisgIENMRUFSX0JJVChFWFRJLT5JTVIyLCBFeHRpTGluZSk7Cit9CisKKy8qKgorICogQGJyaWVmICBJbmRpY2F0ZSBpZiBFeHRpTGluZSBJbnRlcnJ1cHQgcmVxdWVzdCBpcyBlbmFibGVkIGZvciBMaW5lcyBpbiByYW5nZQorICogMCB0byAzMQorICogQG5vdGUgVGhlIHJlc2V0IHZhbHVlIGZvciB0aGUgZGlyZWN0IG9yIGludGVybmFsIGxpbmVzIChzZWUgUk0pCisgKiAgICAgICBpcyBzZXQgdG8gMSBpbiBvcmRlciB0byBlbmFibGUgdGhlIGludGVycnVwdCBieSBkZWZhdWx0LgorICogICAgICAgQml0cyBhcmUgc2V0IGF1dG9tYXRpY2FsbHkgYXQgUG93ZXIgb24uCisgKiBAcm10b2xsIElNUjEgICAgICAgICBJTXggICAgICAgICAgIExMX0VYVElfSXNFbmFibGVkSVRfMF8zMQorICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMgorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV83CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzExCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMworICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNgorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE3CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMgorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yNQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI2CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yOAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI5CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMSAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV9BTExfMF8zMQorICogQG5vdGUgICAoKik6IEF2YWlsYWJsZSBpbiBzb21lIGRldmljZXMKKyAqIEBub3RlICAgUGxlYXNlIGNoZWNrIGVhY2ggZGV2aWNlIGxpbmUgbWFwcGluZyBmb3IgRVhUSSBMaW5lIGF2YWlsYWJpbGl0eQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9FWFRJX0lzRW5hYmxlZElUXzBfMzEodWludDMyX3QgRXh0aUxpbmUpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoRVhUSS0+SU1SMSwgRXh0aUxpbmUpID09IChFeHRpTGluZSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEluZGljYXRlIGlmIEV4dGlMaW5lIEludGVycnVwdCByZXF1ZXN0IGlzIGVuYWJsZWQgZm9yIExpbmVzIGluIHJhbmdlCisgKiAzMiB0byA2MworICogQG5vdGUgVGhlIHJlc2V0IHZhbHVlIGZvciB0aGUgZGlyZWN0IGxpbmVzIChsaW5lcyBmcm9tIDMyIHRvIDM0LCBsaW5lCisgKiAgICAgICAzOSkgaXMgc2V0IHRvIDEgaW4gb3JkZXIgdG8gZW5hYmxlIHRoZSBpbnRlcnJ1cHQgYnkgZGVmYXVsdC4KKyAqICAgICAgIEJpdHMgYXJlIHNldCBhdXRvbWF0aWNhbGx5IGF0IFBvd2VyIG9uLgorICogQHJtdG9sbCBJTVIyICAgICAgICAgSU14ICAgICAgICAgICBMTF9FWFRJX0lzRW5hYmxlZElUXzMyXzYzCisgKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzIgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzMgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zNSAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zNgorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM3CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zOQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNDEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MigqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FX0FMTF8zMl82MworICogQG5vdGUgICAoKik6IEF2YWlsYWJsZSBpbiBzb21lIGRldmljZXMKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRVhUSV9Jc0VuYWJsZWRJVF8zMl82Myh1aW50MzJfdCBFeHRpTGluZSkgeworICByZXR1cm4gKChSRUFEX0JJVChFWFRJLT5JTVIyLCBFeHRpTGluZSkgPT0gKEV4dGlMaW5lKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBFWFRJX0xMX0VGX0V2ZW50X01hbmFnZW1lbnQgRXZlbnRfTWFuYWdlbWVudAorICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiAgRW5hYmxlIEV4dGlMaW5lIEV2ZW50IHJlcXVlc3QgZm9yIExpbmVzIGluIHJhbmdlIDAgdG8gMzEKKyAqIEBybXRvbGwgRU1SMSAgICAgICAgIEVNeCAgICAgICAgICAgTExfRVhUSV9FbmFibGVFdmVudF8wXzMxCisgKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMworICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV81CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNgorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV84CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMgorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE2CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE5CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yNAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI1CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yNworICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI4CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfQUxMXzBfMzEgKCopCisgKiBAbm90ZSAgICgqKTogQXZhaWxhYmxlIGluIHNvbWUgZGV2aWNlcworICogQG5vdGUgICBQbGVhc2UgY2hlY2sgZWFjaCBkZXZpY2UgbGluZSBtYXBwaW5nIGZvciBFWFRJIExpbmUgYXZhaWxhYmlsaXR5CisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRVhUSV9FbmFibGVFdmVudF8wXzMxKHVpbnQzMl90IEV4dGlMaW5lKSB7CisgIFNFVF9CSVQoRVhUSS0+RU1SMSwgRXh0aUxpbmUpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIEV4dGlMaW5lIEV2ZW50IHJlcXVlc3QgZm9yIExpbmVzIGluIHJhbmdlIDMyIHRvIDYzCisgKiBAcm10b2xsIEVNUjIgICAgICAgICBFTXggICAgICAgICAgIExMX0VYVElfRW5hYmxlRXZlbnRfMzJfNjMKKyAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzIgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzMgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zNSAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zNgorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM3CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zOQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNDEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MigqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FX0FMTF8zMl82MworICogQG5vdGUgICAoKik6IEF2YWlsYWJsZSBpbiBzb21lIGRldmljZXMKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9FWFRJX0VuYWJsZUV2ZW50XzMyXzYzKHVpbnQzMl90IEV4dGlMaW5lKSB7CisgIFNFVF9CSVQoRVhUSS0+RU1SMiwgRXh0aUxpbmUpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBFeHRpTGluZSBFdmVudCByZXF1ZXN0IGZvciBMaW5lcyBpbiByYW5nZSAwIHRvIDMxCisgKiBAcm10b2xsIEVNUjEgICAgICAgICBFTXggICAgICAgICAgIExMX0VYVElfRGlzYWJsZUV2ZW50XzBfMzEKKyAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8wCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV82CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNworICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV85CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE1CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNworICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE4CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMworICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yNgorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI3CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yOQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzEgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfQUxMXzBfMzEKKyAqIEBub3RlICAgKCopOiBBdmFpbGFibGUgaW4gc29tZSBkZXZpY2VzCisgKiBAbm90ZSAgIFBsZWFzZSBjaGVjayBlYWNoIGRldmljZSBsaW5lIG1hcHBpbmcgZm9yIEVYVEkgTGluZSBhdmFpbGFiaWxpdHkKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9FWFRJX0Rpc2FibGVFdmVudF8wXzMxKHVpbnQzMl90IEV4dGlMaW5lKSB7CisgIENMRUFSX0JJVChFWFRJLT5FTVIxLCBFeHRpTGluZSk7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIEV4dGlMaW5lIEV2ZW50IHJlcXVlc3QgZm9yIExpbmVzIGluIHJhbmdlIDMyIHRvIDYzCisgKiBAcm10b2xsIEVNUjIgICAgICAgICBFTXggICAgICAgICAgIExMX0VYVElfRGlzYWJsZUV2ZW50XzMyXzYzCisgKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMyICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMzICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzUgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zNworICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM4CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNDIoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV9BTExfMzJfNjMKKyAqIEBub3RlICAgKCopOiBBdmFpbGFibGUgaW4gc29tZSBkZXZpY2VzCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRVhUSV9EaXNhYmxlRXZlbnRfMzJfNjModWludDMyX3QgRXh0aUxpbmUpIHsKKyAgQ0xFQVJfQklUKEVYVEktPkVNUjIsIEV4dGlMaW5lKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEluZGljYXRlIGlmIEV4dGlMaW5lIEV2ZW50IHJlcXVlc3QgaXMgZW5hYmxlZCBmb3IgTGluZXMgaW4gcmFuZ2UgMCB0bworICogMzEKKyAqIEBybXRvbGwgRU1SMSAgICAgICAgIEVNeCAgICAgICAgICAgTExfRVhUSV9Jc0VuYWJsZWRFdmVudF8wXzMxCisgKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMworICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV81CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNgorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV84CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMgorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE2CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE5CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yNAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI1CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yNworICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI4CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfQUxMXzBfMzEgKCopCisgKiBAbm90ZSAgICgqKTogQXZhaWxhYmxlIGluIHNvbWUgZGV2aWNlcworICogQG5vdGUgICBQbGVhc2UgY2hlY2sgZWFjaCBkZXZpY2UgbGluZSBtYXBwaW5nIGZvciBFWFRJIExpbmUgYXZhaWxhYmlsaXR5CisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0VYVElfSXNFbmFibGVkRXZlbnRfMF8zMSh1aW50MzJfdCBFeHRpTGluZSkgeworICByZXR1cm4gKChSRUFEX0JJVChFWFRJLT5FTVIxLCBFeHRpTGluZSkgPT0gKEV4dGlMaW5lKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgSW5kaWNhdGUgaWYgRXh0aUxpbmUgRXZlbnQgcmVxdWVzdCBpcyBlbmFibGVkIGZvciBMaW5lcyBpbiByYW5nZSAzMgorICogdG8gNjMKKyAqIEBybXRvbGwgRU1SMiAgICAgICAgIEVNeCAgICAgICAgICAgTExfRVhUSV9Jc0VuYWJsZWRFdmVudF8zMl82MworICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMiAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMyAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zNAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM1ICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM2CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zOAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM5CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNDAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQyKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfQUxMXzMyXzYzCisgKiBAbm90ZSAgICgqKTogQXZhaWxhYmxlIGluIHNvbWUgZGV2aWNlcworICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9FWFRJX0lzRW5hYmxlZEV2ZW50XzMyXzYzKHVpbnQzMl90IEV4dGlMaW5lKSB7CisgIHJldHVybiAoKFJFQURfQklUKEVYVEktPkVNUjIsIEV4dGlMaW5lKSA9PSAoRXh0aUxpbmUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEVYVElfTExfRUZfUmlzaW5nX1RyaWdnZXJfTWFuYWdlbWVudCBSaXNpbmdfVHJpZ2dlcl9NYW5hZ2VtZW50CisgKiBAeworICovCisKKy8qKgorICogQGJyaWVmICBFbmFibGUgRXh0aUxpbmUgUmlzaW5nIEVkZ2UgVHJpZ2dlciBmb3IgTGluZXMgaW4gcmFuZ2UgMCB0byAzMQorICogQG5vdGUgVGhlIGNvbmZpZ3VyYWJsZSB3YWtldXAgbGluZXMgYXJlIGVkZ2UtdHJpZ2dlcmVkLiBObyBnbGl0Y2ggbXVzdCBiZQorICogICAgICAgZ2VuZXJhdGVkIG9uIHRoZXNlIGxpbmVzLiBJZiBhIHJpc2luZyBlZGdlIG9uIGEgY29uZmlndXJhYmxlIGludGVycnVwdAorICogICAgICAgbGluZSBvY2N1cnMgZHVyaW5nIGEgd3JpdGUgb3BlcmF0aW9uIGluIHRoZSBFWFRJX1JUU1IgcmVnaXN0ZXIsIHRoZQorICogICAgICAgcGVuZGluZyBiaXQgaXMgbm90IHNldC4KKyAqICAgICAgIFJpc2luZyBhbmQgZmFsbGluZyBlZGdlIHRyaWdnZXJzIGNhbiBiZSBzZXQgZm9yCisgKiAgICAgICB0aGUgc2FtZSBpbnRlcnJ1cHQgbGluZS4gSW4gdGhpcyBjYXNlLCBib3RoIGdlbmVyYXRlIGEgdHJpZ2dlcgorICogICAgICAgY29uZGl0aW9uLgorICogQHJtdG9sbCBSVFNSMSAgICAgICAgUlR4ICAgICAgICAgICBMTF9FWFRJX0VuYWJsZVJpc2luZ1RyaWdfMF8zMQorICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8wCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV82CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNworICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV85CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE1CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE5CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMxICgqKQorICogQG5vdGUgICAoKik6IEF2YWlsYWJsZSBpbiBzb21lIGRldmljZXMKKyAqIEBub3RlICAgUGxlYXNlIGNoZWNrIGVhY2ggZGV2aWNlIGxpbmUgbWFwcGluZyBmb3IgRVhUSSBMaW5lIGF2YWlsYWJpbGl0eQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0VYVElfRW5hYmxlUmlzaW5nVHJpZ18wXzMxKHVpbnQzMl90IEV4dGlMaW5lKSB7CisgIFNFVF9CSVQoRVhUSS0+UlRTUjEsIEV4dGlMaW5lKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBFeHRpTGluZSBSaXNpbmcgRWRnZSBUcmlnZ2VyIGZvciBMaW5lcyBpbiByYW5nZSAzMiB0byA2MworICogQG5vdGUgVGhlIGNvbmZpZ3VyYWJsZSB3YWtldXAgbGluZXMgYXJlIGVkZ2UtdHJpZ2dlcmVkLiBObyBnbGl0Y2ggbXVzdCBiZQorICogICAgICAgZ2VuZXJhdGVkIG9uIHRoZXNlIGxpbmVzLiBJZiBhIHJpc2luZyBlZGdlIG9uIGEgY29uZmlndXJhYmxlIGludGVycnVwdAorICogICAgICAgbGluZSBvY2N1cnMgZHVyaW5nIGEgd3JpdGUgb3BlcmF0aW9uIGluIHRoZSBFWFRJX1JUU1IgcmVnaXN0ZXIsIHRoZQorICogICAgICAgcGVuZGluZyBiaXQgaXMgbm90IHNldC5SaXNpbmcgYW5kIGZhbGxpbmcgZWRnZSB0cmlnZ2VycyBjYW4gYmUgc2V0IGZvcgorICogICAgICAgdGhlIHNhbWUgaW50ZXJydXB0IGxpbmUuIEluIHRoaXMgY2FzZSwgYm90aCBnZW5lcmF0ZSBhIHRyaWdnZXIKKyAqICAgICAgIGNvbmRpdGlvbi4KKyAqIEBybXRvbGwgUlRTUjIgICAgICAgIFJUeCAgICAgICAgICAgTExfRVhUSV9FbmFibGVSaXNpbmdUcmlnXzMyXzYzCisgKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMyICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMzICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM4CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQxCisgKiBAbm90ZSAgICgqKTogQXZhaWxhYmxlIGluIHNvbWUgZGV2aWNlcworICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0VYVElfRW5hYmxlUmlzaW5nVHJpZ18zMl82Myh1aW50MzJfdCBFeHRpTGluZSkgeworICBTRVRfQklUKEVYVEktPlJUU1IyLCBFeHRpTGluZSk7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIEV4dGlMaW5lIFJpc2luZyBFZGdlIFRyaWdnZXIgZm9yIExpbmVzIGluIHJhbmdlIDAgdG8gMzEKKyAqIEBub3RlIFRoZSBjb25maWd1cmFibGUgd2FrZXVwIGxpbmVzIGFyZSBlZGdlLXRyaWdnZXJlZC4gTm8gZ2xpdGNoIG11c3QgYmUKKyAqICAgICAgIGdlbmVyYXRlZCBvbiB0aGVzZSBsaW5lcy4gSWYgYSByaXNpbmcgZWRnZSBvbiBhIGNvbmZpZ3VyYWJsZSBpbnRlcnJ1cHQKKyAqICAgICAgIGxpbmUgb2NjdXJzIGR1cmluZyBhIHdyaXRlIG9wZXJhdGlvbiBpbiB0aGUgRVhUSV9SVFNSIHJlZ2lzdGVyLCB0aGUKKyAqICAgICAgIHBlbmRpbmcgYml0IGlzIG5vdCBzZXQuCisgKiAgICAgICBSaXNpbmcgYW5kIGZhbGxpbmcgZWRnZSB0cmlnZ2VycyBjYW4gYmUgc2V0IGZvcgorICogICAgICAgdGhlIHNhbWUgaW50ZXJydXB0IGxpbmUuIEluIHRoaXMgY2FzZSwgYm90aCBnZW5lcmF0ZSBhIHRyaWdnZXIKKyAqICAgICAgIGNvbmRpdGlvbi4KKyAqIEBybXRvbGwgUlRTUjEgICAgICAgIFJUeCAgICAgICAgICAgTExfRVhUSV9EaXNhYmxlUmlzaW5nVHJpZ18wXzMxCisgKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMgorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV83CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzExCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMworICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNgorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE4CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yOQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzEgKCopCisgKiBAbm90ZSAgICgqKTogQXZhaWxhYmxlIGluIHNvbWUgZGV2aWNlcworICogQG5vdGUgICBQbGVhc2UgY2hlY2sgZWFjaCBkZXZpY2UgbGluZSBtYXBwaW5nIGZvciBFWFRJIExpbmUgYXZhaWxhYmlsaXR5CisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRVhUSV9EaXNhYmxlUmlzaW5nVHJpZ18wXzMxKHVpbnQzMl90IEV4dGlMaW5lKSB7CisgIENMRUFSX0JJVChFWFRJLT5SVFNSMSwgRXh0aUxpbmUpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBFeHRpTGluZSBSaXNpbmcgRWRnZSBUcmlnZ2VyIGZvciBMaW5lcyBpbiByYW5nZSAzMiB0byA2MworICogQG5vdGUgVGhlIGNvbmZpZ3VyYWJsZSB3YWtldXAgbGluZXMgYXJlIGVkZ2UtdHJpZ2dlcmVkLiBObyBnbGl0Y2ggbXVzdCBiZQorICogICAgICAgZ2VuZXJhdGVkIG9uIHRoZXNlIGxpbmVzLiBJZiBhIHJpc2luZyBlZGdlIG9uIGEgY29uZmlndXJhYmxlIGludGVycnVwdAorICogICAgICAgbGluZSBvY2N1cnMgZHVyaW5nIGEgd3JpdGUgb3BlcmF0aW9uIGluIHRoZSBFWFRJX1JUU1IgcmVnaXN0ZXIsIHRoZQorICogICAgICAgcGVuZGluZyBiaXQgaXMgbm90IHNldC4KKyAqICAgICAgIFJpc2luZyBhbmQgZmFsbGluZyBlZGdlIHRyaWdnZXJzIGNhbiBiZSBzZXQgZm9yCisgKiAgICAgICB0aGUgc2FtZSBpbnRlcnJ1cHQgbGluZS4gSW4gdGhpcyBjYXNlLCBib3RoIGdlbmVyYXRlIGEgdHJpZ2dlcgorICogICAgICAgY29uZGl0aW9uLgorICogQHJtdG9sbCBSVFNSMiAgICAgICAgUlR4ICAgICAgICAgICBMTF9FWFRJX0Rpc2FibGVSaXNpbmdUcmlnXzMyXzYzCisgKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMyICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMzICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM4CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQxCisgKiBAbm90ZSAgICgqKTogQXZhaWxhYmxlIGluIHNvbWUgZGV2aWNlcworICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0VYVElfRGlzYWJsZVJpc2luZ1RyaWdfMzJfNjModWludDMyX3QgRXh0aUxpbmUpIHsKKyAgQ0xFQVJfQklUKEVYVEktPlJUU1IyLCBFeHRpTGluZSk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiByaXNpbmcgZWRnZSB0cmlnZ2VyIGlzIGVuYWJsZWQgZm9yIExpbmVzIGluIHJhbmdlIDAgdG8gMzEKKyAqIEBybXRvbGwgUlRTUjEgICAgICAgIFJUeCAgICAgICAgICAgTExfRVhUSV9Jc0VuYWJsZWRSaXNpbmdUcmlnXzBfMzEKKyAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMworICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV81CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNgorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV84CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMgorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE2CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMgorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI5CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMSAoKikKKyAqIEBub3RlICAgKCopOiBBdmFpbGFibGUgaW4gc29tZSBkZXZpY2VzCisgKiBAbm90ZSAgIFBsZWFzZSBjaGVjayBlYWNoIGRldmljZSBsaW5lIG1hcHBpbmcgZm9yIEVYVEkgTGluZSBhdmFpbGFiaWxpdHkKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRVhUSV9Jc0VuYWJsZWRSaXNpbmdUcmlnXzBfMzEodWludDMyX3QgRXh0aUxpbmUpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoRVhUSS0+UlRTUjEsIEV4dGlMaW5lKSA9PSAoRXh0aUxpbmUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiByaXNpbmcgZWRnZSB0cmlnZ2VyIGlzIGVuYWJsZWQgZm9yIExpbmVzIGluIHJhbmdlIDMyIHRvIDYzCisgKiBAcm10b2xsIFJUU1IyICAgICAgICBSVHggICAgICAgICAgIExMX0VYVElfSXNFbmFibGVkUmlzaW5nVHJpZ18zMl82MworICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMiAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMyAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zOAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM5CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNDAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MQorICogQG5vdGUgICAoKik6IEF2YWlsYWJsZSBpbiBzb21lIGRldmljZXMKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRVhUSV9Jc0VuYWJsZWRSaXNpbmdUcmlnXzMyXzYzKHVpbnQzMl90IEV4dGlMaW5lKSB7CisgIHJldHVybiAoKFJFQURfQklUKEVYVEktPlJUU1IyLCBFeHRpTGluZSkgPT0gKEV4dGlMaW5lKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBFWFRJX0xMX0VGX0ZhbGxpbmdfVHJpZ2dlcl9NYW5hZ2VtZW50IEZhbGxpbmdfVHJpZ2dlcl9NYW5hZ2VtZW50CisgKiBAeworICovCisKKy8qKgorICogQGJyaWVmICBFbmFibGUgRXh0aUxpbmUgRmFsbGluZyBFZGdlIFRyaWdnZXIgZm9yIExpbmVzIGluIHJhbmdlIDAgdG8gMzEKKyAqIEBub3RlIFRoZSBjb25maWd1cmFibGUgd2FrZXVwIGxpbmVzIGFyZSBlZGdlLXRyaWdnZXJlZC4gTm8gZ2xpdGNoIG11c3QgYmUKKyAqICAgICAgIGdlbmVyYXRlZCBvbiB0aGVzZSBsaW5lcy4gSWYgYSBmYWxsaW5nIGVkZ2Ugb24gYSBjb25maWd1cmFibGUgaW50ZXJydXB0CisgKiAgICAgICBsaW5lIG9jY3VycyBkdXJpbmcgYSB3cml0ZSBvcGVyYXRpb24gaW4gdGhlIEVYVElfRlRTUiByZWdpc3RlciwgdGhlCisgKiAgICAgICBwZW5kaW5nIGJpdCBpcyBub3Qgc2V0LgorICogICAgICAgUmlzaW5nIGFuZCBmYWxsaW5nIGVkZ2UgdHJpZ2dlcnMgY2FuIGJlIHNldCBmb3IKKyAqICAgICAgIHRoZSBzYW1lIGludGVycnVwdCBsaW5lLiBJbiB0aGlzIGNhc2UsIGJvdGggZ2VuZXJhdGUgYSB0cmlnZ2VyCisgKiAgICAgICBjb25kaXRpb24uCisgKiBAcm10b2xsIEZUU1IxICAgICAgICBGVHggICAgICAgICAgIExMX0VYVElfRW5hYmxlRmFsbGluZ1RyaWdfMF8zMQorICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8wCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV82CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNworICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV85CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE1CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE5CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMxICgqKQorICogQG5vdGUgICAoKik6IEF2YWlsYWJsZSBpbiBzb21lIGRldmljZXMKKyAqIEBub3RlICAgUGxlYXNlIGNoZWNrIGVhY2ggZGV2aWNlIGxpbmUgbWFwcGluZyBmb3IgRVhUSSBMaW5lIGF2YWlsYWJpbGl0eQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0VYVElfRW5hYmxlRmFsbGluZ1RyaWdfMF8zMSh1aW50MzJfdCBFeHRpTGluZSkgeworICBTRVRfQklUKEVYVEktPkZUU1IxLCBFeHRpTGluZSk7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgRXh0aUxpbmUgRmFsbGluZyBFZGdlIFRyaWdnZXIgZm9yIExpbmVzIGluIHJhbmdlIDMyIHRvIDYzCisgKiBAbm90ZSBUaGUgY29uZmlndXJhYmxlIHdha2V1cCBsaW5lcyBhcmUgZWRnZS10cmlnZ2VyZWQuIE5vIGdsaXRjaCBtdXN0IGJlCisgKiAgICAgICBnZW5lcmF0ZWQgb24gdGhlc2UgbGluZXMuIElmIGEgRmFsbGluZyBlZGdlIG9uIGEgY29uZmlndXJhYmxlIGludGVycnVwdAorICogICAgICAgbGluZSBvY2N1cnMgZHVyaW5nIGEgd3JpdGUgb3BlcmF0aW9uIGluIHRoZSBFWFRJX0ZUU1IgcmVnaXN0ZXIsIHRoZQorICogICAgICAgcGVuZGluZyBiaXQgaXMgbm90IHNldC4KKyAqICAgICAgIFJpc2luZyBhbmQgZmFsbGluZyBlZGdlIHRyaWdnZXJzIGNhbiBiZSBzZXQgZm9yCisgKiAgICAgICB0aGUgc2FtZSBpbnRlcnJ1cHQgbGluZS4gSW4gdGhpcyBjYXNlLCBib3RoIGdlbmVyYXRlIGEgdHJpZ2dlcgorICogICAgICAgY29uZGl0aW9uLgorICogQHJtdG9sbCBGVFNSMiAgICAgICAgRlR4ICAgICAgICAgICBMTF9FWFRJX0VuYWJsZUZhbGxpbmdUcmlnXzMyXzYzCisgKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMyICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMzICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM4CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQxCisgKiBAbm90ZSAgICgqKTogQXZhaWxhYmxlIGluIHNvbWUgZGV2aWNlcworICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0VYVElfRW5hYmxlRmFsbGluZ1RyaWdfMzJfNjModWludDMyX3QgRXh0aUxpbmUpIHsKKyAgU0VUX0JJVChFWFRJLT5GVFNSMiwgRXh0aUxpbmUpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBFeHRpTGluZSBGYWxsaW5nIEVkZ2UgVHJpZ2dlciBmb3IgTGluZXMgaW4gcmFuZ2UgMCB0byAzMQorICogQG5vdGUgVGhlIGNvbmZpZ3VyYWJsZSB3YWtldXAgbGluZXMgYXJlIGVkZ2UtdHJpZ2dlcmVkLiBObyBnbGl0Y2ggbXVzdCBiZQorICogICAgICAgZ2VuZXJhdGVkIG9uIHRoZXNlIGxpbmVzLiBJZiBhIEZhbGxpbmcgZWRnZSBvbiBhIGNvbmZpZ3VyYWJsZSBpbnRlcnJ1cHQKKyAqICAgICAgIGxpbmUgb2NjdXJzIGR1cmluZyBhIHdyaXRlIG9wZXJhdGlvbiBpbiB0aGUgRVhUSV9GVFNSIHJlZ2lzdGVyLCB0aGUKKyAqICAgICAgIHBlbmRpbmcgYml0IGlzIG5vdCBzZXQuCisgKiAgICAgICBSaXNpbmcgYW5kIGZhbGxpbmcgZWRnZSB0cmlnZ2VycyBjYW4gYmUgc2V0IGZvciB0aGUgc2FtZSBpbnRlcnJ1cHQKKyAqIGxpbmUuIEluIHRoaXMgY2FzZSwgYm90aCBnZW5lcmF0ZSBhIHRyaWdnZXIgY29uZGl0aW9uLgorICogQHJtdG9sbCBGVFNSMSAgICAgICAgRlR4ICAgICAgICAgICBMTF9FWFRJX0Rpc2FibGVGYWxsaW5nVHJpZ18wXzMxCisgKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMgorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV83CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzExCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMworICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNgorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE4CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yOQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzEgKCopCisgKiBAbm90ZSAgICgqKTogQXZhaWxhYmxlIGluIHNvbWUgZGV2aWNlcworICogQG5vdGUgICBQbGVhc2UgY2hlY2sgZWFjaCBkZXZpY2UgbGluZSBtYXBwaW5nIGZvciBFWFRJIExpbmUgYXZhaWxhYmlsaXR5CisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRVhUSV9EaXNhYmxlRmFsbGluZ1RyaWdfMF8zMSh1aW50MzJfdCBFeHRpTGluZSkgeworICBDTEVBUl9CSVQoRVhUSS0+RlRTUjEsIEV4dGlMaW5lKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgRXh0aUxpbmUgRmFsbGluZyBFZGdlIFRyaWdnZXIgZm9yIExpbmVzIGluIHJhbmdlIDMyIHRvIDYzCisgKiBAbm90ZSBUaGUgY29uZmlndXJhYmxlIHdha2V1cCBsaW5lcyBhcmUgZWRnZS10cmlnZ2VyZWQuIE5vIGdsaXRjaCBtdXN0IGJlCisgKiAgICAgICBnZW5lcmF0ZWQgb24gdGhlc2UgbGluZXMuIElmIGEgRmFsbGluZyBlZGdlIG9uIGEgY29uZmlndXJhYmxlIGludGVycnVwdAorICogICAgICAgbGluZSBvY2N1cnMgZHVyaW5nIGEgd3JpdGUgb3BlcmF0aW9uIGluIHRoZSBFWFRJX0ZUU1IgcmVnaXN0ZXIsIHRoZQorICogICAgICAgcGVuZGluZyBiaXQgaXMgbm90IHNldC4KKyAqICAgICAgIFJpc2luZyBhbmQgZmFsbGluZyBlZGdlIHRyaWdnZXJzIGNhbiBiZSBzZXQgZm9yIHRoZSBzYW1lIGludGVycnVwdAorICogbGluZS4gSW4gdGhpcyBjYXNlLCBib3RoIGdlbmVyYXRlIGEgdHJpZ2dlciBjb25kaXRpb24uCisgKiBAcm10b2xsIEZUU1IyICAgICAgICBGVHggICAgICAgICAgIExMX0VYVElfRGlzYWJsZUZhbGxpbmdUcmlnXzMyXzYzCisgKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMyICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMzICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM4CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQxCisgKiBAbm90ZSAgICgqKTogQXZhaWxhYmxlIGluIHNvbWUgZGV2aWNlcworICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0VYVElfRGlzYWJsZUZhbGxpbmdUcmlnXzMyXzYzKHVpbnQzMl90IEV4dGlMaW5lKSB7CisgIENMRUFSX0JJVChFWFRJLT5GVFNSMiwgRXh0aUxpbmUpOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgZmFsbGluZyBlZGdlIHRyaWdnZXIgaXMgZW5hYmxlZCBmb3IgTGluZXMgaW4gcmFuZ2UgMCB0byAzMQorICogQHJtdG9sbCBGVFNSMSAgICAgICAgRlR4ICAgICAgICAgICBMTF9FWFRJX0lzRW5hYmxlZEZhbGxpbmdUcmlnXzBfMzEKKyAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMworICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV81CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNgorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV84CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMgorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE2CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMgorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI5CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMSAoKikKKyAqIEBub3RlICAgKCopOiBBdmFpbGFibGUgaW4gc29tZSBkZXZpY2VzCisgKiBAbm90ZSAgIFBsZWFzZSBjaGVjayBlYWNoIGRldmljZSBsaW5lIG1hcHBpbmcgZm9yIEVYVEkgTGluZSBhdmFpbGFiaWxpdHkKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRVhUSV9Jc0VuYWJsZWRGYWxsaW5nVHJpZ18wXzMxKHVpbnQzMl90IEV4dGlMaW5lKSB7CisgIHJldHVybiAoKFJFQURfQklUKEVYVEktPkZUU1IxLCBFeHRpTGluZSkgPT0gKEV4dGlMaW5lKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgZmFsbGluZyBlZGdlIHRyaWdnZXIgaXMgZW5hYmxlZCBmb3IgTGluZXMgaW4gcmFuZ2UgMzIgdG8gNjMKKyAqIEBybXRvbGwgRlRTUjIgICAgICAgIEZUeCAgICAgICAgICAgTExfRVhUSV9Jc0VuYWJsZWRGYWxsaW5nVHJpZ18zMl82MworICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMiAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMyAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zOAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM5CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNDAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MQorICogQG5vdGUgICAoKik6IEF2YWlsYWJsZSBpbiBzb21lIGRldmljZXMKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRVhUSV9Jc0VuYWJsZWRGYWxsaW5nVHJpZ18zMl82Myh1aW50MzJfdCBFeHRpTGluZSkgeworICByZXR1cm4gKChSRUFEX0JJVChFWFRJLT5GVFNSMiwgRXh0aUxpbmUpID09IChFeHRpTGluZSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgRVhUSV9MTF9FRl9Tb2Z0d2FyZV9JbnRlcnJ1cHRfTWFuYWdlbWVudAorICogU29mdHdhcmVfSW50ZXJydXB0X01hbmFnZW1lbnQKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgIEdlbmVyYXRlIGEgc29mdHdhcmUgSW50ZXJydXB0IEV2ZW50IGZvciBMaW5lcyBpbiByYW5nZSAwIHRvIDMxCisgKiBAbm90ZSBJZiB0aGUgaW50ZXJydXB0IGlzIGVuYWJsZWQgb24gdGhpcyBsaW5lIGluIHRoZSBFWFRJX0lNUjEsIHdyaXRpbmcgYSAxCisgKiB0byB0aGlzIGJpdCB3aGVuIGl0IGlzIGF0ICcwJyBzZXRzIHRoZSBjb3JyZXNwb25kaW5nIHBlbmRpbmcgYml0IGluIEVYVElfUFIxCisgKiAgICAgICByZXN1bHRpbmcgaW4gYW4gaW50ZXJydXB0IHJlcXVlc3QgZ2VuZXJhdGlvbi4KKyAqICAgICAgIFRoaXMgYml0IGlzIGNsZWFyZWQgYnkgY2xlYXJpbmcgdGhlIGNvcnJlc3BvbmRpbmcgYml0IGluIHRoZSBFWFRJX1BSMQorICogICAgICAgcmVnaXN0ZXIgKGJ5IHdyaXRpbmcgYSAxIGludG8gdGhlIGJpdCkKKyAqIEBybXRvbGwgU1dJRVIxICAgICAgIFNXSXggICAgICAgICAgTExfRVhUSV9HZW5lcmF0ZVNXSV8wXzMxCisgKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMgorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV83CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzExCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMworICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNgorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE4CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yOQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzEgKCopCisgKiBAbm90ZSAgICgqKTogQXZhaWxhYmxlIGluIHNvbWUgZGV2aWNlcworICogQG5vdGUgICBQbGVhc2UgY2hlY2sgZWFjaCBkZXZpY2UgbGluZSBtYXBwaW5nIGZvciBFWFRJIExpbmUgYXZhaWxhYmlsaXR5CisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRVhUSV9HZW5lcmF0ZVNXSV8wXzMxKHVpbnQzMl90IEV4dGlMaW5lKSB7CisgIFNFVF9CSVQoRVhUSS0+U1dJRVIxLCBFeHRpTGluZSk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZW5lcmF0ZSBhIHNvZnR3YXJlIEludGVycnVwdCBFdmVudCBmb3IgTGluZXMgaW4gcmFuZ2UgMzIgdG8gNjMKKyAqIEBub3RlIElmIHRoZSBpbnRlcnJ1cHQgaXMgZW5hYmxlZCBvbiB0aGlzIGxpbmUgaW4gdGhlIEVYVElfSU1SMiwgd3JpdGluZyBhIDEKKyAqIHRvIHRoaXMgYml0IHdoZW4gaXQgaXMgYXQgJzAnIHNldHMgdGhlIGNvcnJlc3BvbmRpbmcgcGVuZGluZyBiaXQgaW4gRVhUSV9QUjIKKyAqICAgICAgIHJlc3VsdGluZyBpbiBhbiBpbnRlcnJ1cHQgcmVxdWVzdCBnZW5lcmF0aW9uLgorICogICAgICAgVGhpcyBiaXQgaXMgY2xlYXJlZCBieSBjbGVhcmluZyB0aGUgY29ycmVzcG9uZGluZyBiaXQgaW4gdGhlIEVYVElfUFIyCisgKiAgICAgICByZWdpc3RlciAoYnkgd3JpdGluZyBhIDEgaW50byB0aGUgYml0KQorICogQHJtdG9sbCBTV0lFUjIgICAgICAgU1dJeCAgICAgICAgICBMTF9FWFRJX0dlbmVyYXRlU1dJXzMyXzYzCisgKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMyICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMzICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM4CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQxCisgKiBAbm90ZSAgICgqKTogQXZhaWxhYmxlIGluIHNvbWUgZGV2aWNlcworICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0VYVElfR2VuZXJhdGVTV0lfMzJfNjModWludDMyX3QgRXh0aUxpbmUpIHsKKyAgU0VUX0JJVChFWFRJLT5TV0lFUjIsIEV4dGlMaW5lKTsKK30KKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgRVhUSV9MTF9FRl9GbGFnX01hbmFnZW1lbnQgRmxhZ19NYW5hZ2VtZW50CisgKiBAeworICovCisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiB0aGUgRXh0TGluZSBGbGFnIGlzIHNldCBvciBub3QgZm9yIExpbmVzIGluIHJhbmdlIDAgdG8gMzEKKyAqIEBub3RlIFRoaXMgYml0IGlzIHNldCB3aGVuIHRoZSBzZWxlY3RlZCBlZGdlIGV2ZW50IGFycml2ZXMgb24gdGhlIGludGVycnVwdAorICogICAgICAgbGluZS4gVGhpcyBiaXQgaXMgY2xlYXJlZCBieSB3cml0aW5nIGEgMSB0byB0aGUgYml0LgorICogQHJtdG9sbCBQUjEgICAgICAgICAgUElGeCAgICAgICAgICAgTExfRVhUSV9Jc0FjdGl2ZUZsYWdfMF8zMQorICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8wCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV82CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNworICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV85CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE1CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE5CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMxICgqKQorICogQG5vdGUgICAoKik6IEF2YWlsYWJsZSBpbiBzb21lIGRldmljZXMKKyAqIEBub3RlICAgUGxlYXNlIGNoZWNrIGVhY2ggZGV2aWNlIGxpbmUgbWFwcGluZyBmb3IgRVhUSSBMaW5lIGF2YWlsYWJpbGl0eQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9FWFRJX0lzQWN0aXZlRmxhZ18wXzMxKHVpbnQzMl90IEV4dGlMaW5lKSB7CisgIHJldHVybiAoKFJFQURfQklUKEVYVEktPlBSMSwgRXh0aUxpbmUpID09IChFeHRpTGluZSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBFeHRMaW5lIEZsYWcgaXMgc2V0IG9yIG5vdCBmb3IgIExpbmVzIGluIHJhbmdlIDMyIHRvIDYzCisgKiBAbm90ZSBUaGlzIGJpdCBpcyBzZXQgd2hlbiB0aGUgc2VsZWN0ZWQgZWRnZSBldmVudCBhcnJpdmVzIG9uIHRoZSBpbnRlcnJ1cHQKKyAqICAgICAgIGxpbmUuIFRoaXMgYml0IGlzIGNsZWFyZWQgYnkgd3JpdGluZyBhIDEgdG8gdGhlIGJpdC4KKyAqIEBybXRvbGwgUFIyICAgICAgICAgIFBJRnggICAgICAgICAgIExMX0VYVElfSXNBY3RpdmVGbGFnXzMyXzYzCisgKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMyICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMzICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM4CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQxCisgKiBAbm90ZSAgICgqKTogQXZhaWxhYmxlIGluIHNvbWUgZGV2aWNlcworICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9FWFRJX0lzQWN0aXZlRmxhZ18zMl82Myh1aW50MzJfdCBFeHRpTGluZSkgeworICByZXR1cm4gKChSRUFEX0JJVChFWFRJLT5QUjIsIEV4dGlMaW5lKSA9PSAoRXh0aUxpbmUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBSZWFkIEV4dExpbmUgQ29tYmluYXRpb24gRmxhZyBmb3IgTGluZXMgaW4gcmFuZ2UgMCB0byAzMQorICogQG5vdGUgVGhpcyBiaXQgaXMgc2V0IHdoZW4gdGhlIHNlbGVjdGVkIGVkZ2UgZXZlbnQgYXJyaXZlcyBvbiB0aGUgaW50ZXJydXB0CisgKiAgICAgICBsaW5lLiBUaGlzIGJpdCBpcyBjbGVhcmVkIGJ5IHdyaXRpbmcgYSAxIHRvIHRoZSBiaXQuCisgKiBAcm10b2xsIFBSMSAgICAgICAgICBQSUZ4ICAgICAgICAgICBMTF9FWFRJX1JlYWRGbGFnXzBfMzEKKyAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMworICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV81CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNgorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV84CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMgorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE2CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMgorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI5CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMSAoKikKKyAqIEBub3RlICAgKCopOiBBdmFpbGFibGUgaW4gc29tZSBkZXZpY2VzCisgKiBAbm90ZSAgIFBsZWFzZSBjaGVjayBlYWNoIGRldmljZSBsaW5lIG1hcHBpbmcgZm9yIEVYVEkgTGluZSBhdmFpbGFiaWxpdHkKKyAqIEByZXR2YWwgQG5vdGUgVGhpcyBiaXQgaXMgc2V0IHdoZW4gdGhlIHNlbGVjdGVkIGVkZ2UgZXZlbnQgYXJyaXZlcyBvbiB0aGUKKyAqIGludGVycnVwdAorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRVhUSV9SZWFkRmxhZ18wXzMxKHVpbnQzMl90IEV4dGlMaW5lKSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEVYVEktPlBSMSwgRXh0aUxpbmUpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFJlYWQgRXh0TGluZSBDb21iaW5hdGlvbiBGbGFnIGZvciAgTGluZXMgaW4gcmFuZ2UgMzIgdG8gNjMKKyAqIEBub3RlIFRoaXMgYml0IGlzIHNldCB3aGVuIHRoZSBzZWxlY3RlZCBlZGdlIGV2ZW50IGFycml2ZXMgb24gdGhlIGludGVycnVwdAorICogICAgICAgbGluZS4gVGhpcyBiaXQgaXMgY2xlYXJlZCBieSB3cml0aW5nIGEgMSB0byB0aGUgYml0LgorICogQHJtdG9sbCBQUjIgICAgICAgICAgUElGeCAgICAgICAgICAgTExfRVhUSV9SZWFkRmxhZ18zMl82MworICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMiAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMyAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zOAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM5CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNDAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MQorICogQG5vdGUgICAoKik6IEF2YWlsYWJsZSBpbiBzb21lIGRldmljZXMKKyAqIEByZXR2YWwgQG5vdGUgVGhpcyBiaXQgaXMgc2V0IHdoZW4gdGhlIHNlbGVjdGVkIGVkZ2UgZXZlbnQgYXJyaXZlcyBvbiB0aGUKKyAqIGludGVycnVwdAorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRVhUSV9SZWFkRmxhZ18zMl82Myh1aW50MzJfdCBFeHRpTGluZSkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChFWFRJLT5QUjIsIEV4dGlMaW5lKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBDbGVhciBFeHRMaW5lIEZsYWdzICBmb3IgTGluZXMgaW4gcmFuZ2UgMCB0byAzMQorICogQG5vdGUgVGhpcyBiaXQgaXMgc2V0IHdoZW4gdGhlIHNlbGVjdGVkIGVkZ2UgZXZlbnQgYXJyaXZlcyBvbiB0aGUgaW50ZXJydXB0CisgKiAgICAgICBsaW5lLiBUaGlzIGJpdCBpcyBjbGVhcmVkIGJ5IHdyaXRpbmcgYSAxIHRvIHRoZSBiaXQuCisgKiBAcm10b2xsIFBSMSAgICAgICAgICBQSUZ4ICAgICAgICAgICBMTF9FWFRJX0NsZWFyRmxhZ18wXzMxCisgKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMgorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV83CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzExCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMworICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNgorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE4CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMAorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yOQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzEgKCopCisgKiBAbm90ZSAgICgqKTogQXZhaWxhYmxlIGluIHNvbWUgZGV2aWNlcworICogQG5vdGUgICBQbGVhc2UgY2hlY2sgZWFjaCBkZXZpY2UgbGluZSBtYXBwaW5nIGZvciBFWFRJIExpbmUgYXZhaWxhYmlsaXR5CisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRVhUSV9DbGVhckZsYWdfMF8zMSh1aW50MzJfdCBFeHRpTGluZSkgeworICBXUklURV9SRUcoRVhUSS0+UFIxLCBFeHRpTGluZSk7Cit9CisKKy8qKgorICogQGJyaWVmICBDbGVhciBFeHRMaW5lIEZsYWdzIGZvciAgTGluZXMgaW4gcmFuZ2UgMzIgdG8gNjMKKyAqIEBub3RlIFRoaXMgYml0IGlzIHNldCB3aGVuIHRoZSBzZWxlY3RlZCBlZGdlIGV2ZW50IGFycml2ZXMgb24gdGhlIGludGVycnVwdAorICogICAgICAgbGluZS4gVGhpcyBiaXQgaXMgY2xlYXJlZCBieSB3cml0aW5nIGEgMSB0byB0aGUgYml0LgorICogQHJtdG9sbCBQUjIgICAgICAgICAgUElGeCAgICAgICAgICAgTExfRVhUSV9DbGVhckZsYWdfMzJfNjMKKyAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzIgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzMgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zOQorICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNDEKKyAqIEBub3RlICAgKCopOiBBdmFpbGFibGUgaW4gc29tZSBkZXZpY2VzCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRVhUSV9DbGVhckZsYWdfMzJfNjModWludDMyX3QgRXh0aUxpbmUpIHsKKyAgV1JJVEVfUkVHKEVYVEktPlBSMiwgRXh0aUxpbmUpOworfQorCisvKioKKyAqIEB9CisgKi8KKworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBFWFRJX0xMX0VGX0luaXQgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICogQHsKKyAqLworCit1aW50MzJfdCBMTF9FWFRJX0luaXQoTExfRVhUSV9Jbml0VHlwZURlZiAqRVhUSV9Jbml0U3RydWN0KTsKK3VpbnQzMl90IExMX0VYVElfRGVJbml0KHZvaWQpOwordm9pZCBMTF9FWFRJX1N0cnVjdEluaXQoTExfRVhUSV9Jbml0VHlwZURlZiAqRVhUSV9Jbml0U3RydWN0KTsKKworLyoqCisgKiBAfQorICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworI2VuZGlmIC8qIEVYVEkgKi8KKworLyoqCisgKiBAfQorICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1NUTTMyRzR4eF9MTF9FWFRJX0ggKi8KZGlmZiAtLWdpdCBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9JbmMvc3RtMzJnNHh4X2xsX2dwaW8uaCBiL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9JbmMvc3RtMzJnNHh4X2xsX2dwaW8uaAppbmRleCA4ZmVlZTg5Li45MDJhNGQ5IDEwMDY0NAotLS0gYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9sbF9ncGlvLmgKKysrIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfbGxfZ3Bpby5oCkBAIC0xLDEwMjcgKzEsMTAyNyBAQAotLyoqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEBmaWxlICAgIHN0bTMyZzR4eF9sbF9ncGlvLmgNCi0gKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQ0KLSAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIEdQSU8gTEwgbW9kdWxlLg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBAYXR0ZW50aW9uDQotICoNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQotICoNCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRlcm1zIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUNCi0gKiBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb2Z0d2FyZSBjb21wb25lbnQuDQotICogSWYgbm8gTElDRU5TRSBmaWxlIGNvbWVzIHdpdGggdGhpcyBzb2Z0d2FyZSwgaXQgaXMgcHJvdmlkZWQgQVMtSVMuDQotICoNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICovDQotDQotLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaWZuZGVmIFNUTTMyRzR4eF9MTF9HUElPX0gNCi0jZGVmaW5lIFNUTTMyRzR4eF9MTF9HUElPX0gNCi0NCi0jaWZkZWYgX19jcGx1c3BsdXMNCi1leHRlcm4gIkMiIHsNCi0jZW5kaWYNCi0NCi0vKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpbmNsdWRlICJzdG0zMmc0eHguaCINCi0NCi0vKiogQGFkZHRvZ3JvdXAgU1RNMzJHNHh4X0xMX0RyaXZlcg0KLSAqIEB7DQotICovDQotDQotI2lmIGRlZmluZWQoR1BJT0EpIHx8IGRlZmluZWQoR1BJT0IpIHx8IGRlZmluZWQoR1BJT0MpIHx8IGRlZmluZWQoR1BJT0QpIHx8IFwNCi0gICAgZGVmaW5lZChHUElPRSkgfHwgZGVmaW5lZChHUElPRikgfHwgZGVmaW5lZChHUElPRykNCi0NCi0vKiogQGRlZmdyb3VwIEdQSU9fTEwgR1BJTw0KLSAqIEB7DQotICovDQotLyoqIE1JU1JBIEM6MjAxMiBkZXZpYXRpb24gcnVsZSBoYXMgYmVlbiBncmFudGVkIGZvciBmb2xsb3dpbmcgcnVsZXM6DQotICogUnVsZS0xOC4xX2QgLSBNZWRpdW06IEFycmF5IHBvaW50ZXIgYEdQSU94JyBpcyBhY2Nlc3NlZCB3aXRoIGluZGV4IFsuLiwuLl0NCi0gKiB3aGljaCBtYXkgYmUgb3V0IG9mIGFycmF5IGJvdW5kcyBbLi4sVU5LTk9XTl0gaW4gZm9sbG93aW5nIEFQSXM6DQotICogTExfR1BJT19HZXRBRlBpbl8wXzcNCi0gKiBMTF9HUElPX1NldEFGUGluXzBfNw0KLSAqIExMX0dQSU9fU2V0QUZQaW5fOF8xNQ0KLSAqIExMX0dQSU9fR2V0QUZQaW5fOF8xNQ0KLSAqLw0KLQ0KLS8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQ0KLS8qKiBAZGVmZ3JvdXAgR1BJT19MTF9Qcml2YXRlX01hY3JvcyBHUElPIFByaXZhdGUgTWFjcm9zDQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLSNlbmRpZiAvKlVTRV9GVUxMX0xMX0RSSVZFUiovDQotDQotLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpDQotLyoqIEBkZWZncm91cCBHUElPX0xMX0VTX0lOSVQgR1BJTyBFeHBvcnRlZCBJbml0IHN0cnVjdHVyZXMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiBMTCBHUElPIEluaXQgU3RydWN0dXJlIGRlZmluaXRpb24NCi0gKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICB1aW50MzJfdCBQaW47IC8qITwgU3BlY2lmaWVzIHRoZSBHUElPIHBpbnMgdG8gYmUgY29uZmlndXJlZC4NCi0gICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IHZhbHVlIG9mIEByZWYgR1BJT19MTF9FQ19QSU4gKi8NCi0NCi0gIHVpbnQzMl90IE1vZGU7IC8qITwgU3BlY2lmaWVzIHRoZSBvcGVyYXRpbmcgbW9kZSBmb3IgdGhlIHNlbGVjdGVkIHBpbnMuDQotICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgR1BJT19MTF9FQ19NT0RFLg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICBHUElPIEhXIGNvbmZpZ3VyYXRpb24gY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcNCi0gICAgICAgICAgICAgICAgICAgIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9HUElPX1NldFBpbk1vZGUoKS4qLw0KLQ0KLSAgdWludDMyX3QgU3BlZWQ7IC8qITwgU3BlY2lmaWVzIHRoZSBzcGVlZCBmb3IgdGhlIHNlbGVjdGVkIHBpbnMuDQotICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEdQSU9fTExfRUNfU1BFRUQuDQotDQotICAgICAgICAgICAgICAgICAgICAgICBHUElPIEhXIGNvbmZpZ3VyYXRpb24gY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcNCi0gICAgICAgICAgICAgICAgICAgICB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfR1BJT19TZXRQaW5TcGVlZCgpLiovDQotDQotICB1aW50MzJfdA0KLSAgICAgIE91dHB1dFR5cGU7IC8qITwgU3BlY2lmaWVzIHRoZSBvcGVyYXRpbmcgb3V0cHV0IHR5cGUgZm9yIHRoZSBzZWxlY3RlZA0KLSAgICAgICAgICAgICAgICAgICAgIHBpbnMuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICBHUElPX0xMX0VDX09VVFBVVC4NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgIEdQSU8gSFcgY29uZmlndXJhdGlvbiBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZw0KLSAgICAgICAgICAgICAgICAgICAgIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9HUElPX1NldFBpbk91dHB1dFR5cGUoKS4qLw0KLQ0KLSAgdWludDMyX3QgUHVsbDsgLyohPCBTcGVjaWZpZXMgdGhlIG9wZXJhdGluZyBQdWxsLXVwL1B1bGwgZG93biBmb3IgdGhlIHNlbGVjdGVkDQotICAgICAgICAgICAgICAgICAgICBwaW5zLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEdQSU9fTExfRUNfUFVMTC4NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgR1BJTyBIVyBjb25maWd1cmF0aW9uIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nDQotICAgICAgICAgICAgICAgICAgICB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfR1BJT19TZXRQaW5QdWxsKCkuKi8NCi0NCi0gIHVpbnQzMl90DQotICAgICAgQWx0ZXJuYXRlOyAvKiE8IFNwZWNpZmllcyB0aGUgUGVyaXBoZXJhbCB0byBiZSBjb25uZWN0ZWQgdG8gdGhlIHNlbGVjdGVkDQotICAgICAgICAgICAgICAgICAgICBwaW5zLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEdQSU9fTExfRUNfQUYuDQotDQotICAgICAgICAgICAgICAgICAgICAgIEdQSU8gSFcgY29uZmlndXJhdGlvbiBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZw0KLSAgICAgICAgICAgICAgICAgICAgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0dQSU9fU2V0QUZQaW5fMF83KCkgYW5kDQotICAgICAgICAgICAgICAgICAgICBMTF9HUElPX1NldEFGUGluXzhfMTUoKS4qLw0KLX0gTExfR1BJT19Jbml0VHlwZURlZjsNCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLSNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8NCi0NCi0vKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgR1BJT19MTF9FeHBvcnRlZF9Db25zdGFudHMgR1BJTyBFeHBvcnRlZCBDb25zdGFudHMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgR1BJT19MTF9FQ19QSU4gUElODQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX0dQSU9fUElOXzAgR1BJT19CU1JSX0JTMCAgIC8qITwgU2VsZWN0IHBpbiAwICovDQotI2RlZmluZSBMTF9HUElPX1BJTl8xIEdQSU9fQlNSUl9CUzEgICAvKiE8IFNlbGVjdCBwaW4gMSAqLw0KLSNkZWZpbmUgTExfR1BJT19QSU5fMiBHUElPX0JTUlJfQlMyICAgLyohPCBTZWxlY3QgcGluIDIgKi8NCi0jZGVmaW5lIExMX0dQSU9fUElOXzMgR1BJT19CU1JSX0JTMyAgIC8qITwgU2VsZWN0IHBpbiAzICovDQotI2RlZmluZSBMTF9HUElPX1BJTl80IEdQSU9fQlNSUl9CUzQgICAvKiE8IFNlbGVjdCBwaW4gNCAqLw0KLSNkZWZpbmUgTExfR1BJT19QSU5fNSBHUElPX0JTUlJfQlM1ICAgLyohPCBTZWxlY3QgcGluIDUgKi8NCi0jZGVmaW5lIExMX0dQSU9fUElOXzYgR1BJT19CU1JSX0JTNiAgIC8qITwgU2VsZWN0IHBpbiA2ICovDQotI2RlZmluZSBMTF9HUElPX1BJTl83IEdQSU9fQlNSUl9CUzcgICAvKiE8IFNlbGVjdCBwaW4gNyAqLw0KLSNkZWZpbmUgTExfR1BJT19QSU5fOCBHUElPX0JTUlJfQlM4ICAgLyohPCBTZWxlY3QgcGluIDggKi8NCi0jZGVmaW5lIExMX0dQSU9fUElOXzkgR1BJT19CU1JSX0JTOSAgIC8qITwgU2VsZWN0IHBpbiA5ICovDQotI2RlZmluZSBMTF9HUElPX1BJTl8xMCBHUElPX0JTUlJfQlMxMCAvKiE8IFNlbGVjdCBwaW4gMTAgKi8NCi0jZGVmaW5lIExMX0dQSU9fUElOXzExIEdQSU9fQlNSUl9CUzExIC8qITwgU2VsZWN0IHBpbiAxMSAqLw0KLSNkZWZpbmUgTExfR1BJT19QSU5fMTIgR1BJT19CU1JSX0JTMTIgLyohPCBTZWxlY3QgcGluIDEyICovDQotI2RlZmluZSBMTF9HUElPX1BJTl8xMyBHUElPX0JTUlJfQlMxMyAvKiE8IFNlbGVjdCBwaW4gMTMgKi8NCi0jZGVmaW5lIExMX0dQSU9fUElOXzE0IEdQSU9fQlNSUl9CUzE0IC8qITwgU2VsZWN0IHBpbiAxNCAqLw0KLSNkZWZpbmUgTExfR1BJT19QSU5fMTUgR1BJT19CU1JSX0JTMTUgLyohPCBTZWxlY3QgcGluIDE1ICovDQotI2RlZmluZSBMTF9HUElPX1BJTl9BTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKEdQSU9fQlNSUl9CUzAgfCBHUElPX0JTUlJfQlMxIHwgR1BJT19CU1JSX0JTMiB8IEdQSU9fQlNSUl9CUzMgfCAgIFwNCi0gICBHUElPX0JTUlJfQlM0IHwgR1BJT19CU1JSX0JTNSB8IEdQSU9fQlNSUl9CUzYgfCBHUElPX0JTUlJfQlM3IHwgICBcDQotICAgR1BJT19CU1JSX0JTOCB8IEdQSU9fQlNSUl9CUzkgfCBHUElPX0JTUlJfQlMxMCB8IEdQSU9fQlNSUl9CUzExIHwgXA0KLSAgIEdQSU9fQlNSUl9CUzEyIHwgR1BJT19CU1JSX0JTMTMgfCBHUElPX0JTUlJfQlMxNCB8ICAgICAgICAgICAgICAgIFwNCi0gICBHUElPX0JTUlJfQlMxNSkgLyohPCBTZWxlY3QgYWxsIHBpbnMgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgR1BJT19MTF9FQ19NT0RFIE1vZGUNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfR1BJT19NT0RFX0lOUFVUICgweDAwMDAwMDAwVSkgICAgICAgLyohPCBTZWxlY3QgaW5wdXQgbW9kZSAqLw0KLSNkZWZpbmUgTExfR1BJT19NT0RFX09VVFBVVCBHUElPX01PREVSX01PREUwXzAgLyohPCBTZWxlY3Qgb3V0cHV0IG1vZGUgKi8NCi0jZGVmaW5lIExMX0dQSU9fTU9ERV9BTFRFUk5BVEUgXA0KLSAgR1BJT19NT0RFUl9NT0RFMF8xIC8qITwgU2VsZWN0IGFsdGVybmF0ZSBmdW5jdGlvbiBtb2RlICovDQotI2RlZmluZSBMTF9HUElPX01PREVfQU5BTE9HIEdQSU9fTU9ERVJfTU9ERTAgLyohPCBTZWxlY3QgYW5hbG9nIG1vZGUgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgR1BJT19MTF9FQ19PVVRQVVQgT3V0cHV0IFR5cGUNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfR1BJT19PVVRQVVRfUFVTSFBVTEwgXA0KLSAgKDB4MDAwMDAwMDBVKSAvKiE8IFNlbGVjdCBwdXNoLXB1bGwgYXMgb3V0cHV0IHR5cGUgKi8NCi0jZGVmaW5lIExMX0dQSU9fT1VUUFVUX09QRU5EUkFJTiBcDQotICBHUElPX09UWVBFUl9PVDAgLyohPCBTZWxlY3Qgb3Blbi1kcmFpbiBhcyBvdXRwdXQgdHlwZSAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBHUElPX0xMX0VDX1NQRUVEIE91dHB1dCBTcGVlZA0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9HUElPX1NQRUVEX0ZSRVFfTE9XIFwNCi0gICgweDAwMDAwMDAwVSkgLyohPCBTZWxlY3QgSS9PIGxvdyBvdXRwdXQgc3BlZWQgICAgKi8NCi0jZGVmaW5lIExMX0dQSU9fU1BFRURfRlJFUV9NRURJVU0gXA0KLSAgR1BJT19PU1BFRURSX09TUEVFRDBfMCAvKiE8IFNlbGVjdCBJL08gbWVkaXVtIG91dHB1dCBzcGVlZCAqLw0KLSNkZWZpbmUgTExfR1BJT19TUEVFRF9GUkVRX0hJR0ggXA0KLSAgR1BJT19PU1BFRURSX09TUEVFRDBfMSAvKiE8IFNlbGVjdCBJL08gZmFzdCBvdXRwdXQgc3BlZWQgICAqLw0KLSNkZWZpbmUgTExfR1BJT19TUEVFRF9GUkVRX1ZFUllfSElHSCBcDQotICBHUElPX09TUEVFRFJfT1NQRUVEMCAvKiE8IFNlbGVjdCBJL08gaGlnaCBvdXRwdXQgc3BlZWQgICAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotI2RlZmluZSBMTF9HUElPX1NQRUVEX0xPVyBMTF9HUElPX1NQRUVEX0ZSRVFfTE9XDQotI2RlZmluZSBMTF9HUElPX1NQRUVEX01FRElVTSBMTF9HUElPX1NQRUVEX0ZSRVFfTUVESVVNDQotI2RlZmluZSBMTF9HUElPX1NQRUVEX0ZBU1QgTExfR1BJT19TUEVFRF9GUkVRX0hJR0gNCi0jZGVmaW5lIExMX0dQSU9fU1BFRURfSElHSCBMTF9HUElPX1NQRUVEX0ZSRVFfVkVSWV9ISUdIDQotDQotLyoqIEBkZWZncm91cCBHUElPX0xMX0VDX1BVTEwgUHVsbCBVcCBQdWxsIERvd24NCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfR1BJT19QVUxMX05PICgweDAwMDAwMDAwVSkgICAgICAgIC8qITwgU2VsZWN0IEkvTyBubyBwdWxsICovDQotI2RlZmluZSBMTF9HUElPX1BVTExfVVAgR1BJT19QVVBEUl9QVVBEMF8wICAgLyohPCBTZWxlY3QgSS9PIHB1bGwgdXAgKi8NCi0jZGVmaW5lIExMX0dQSU9fUFVMTF9ET1dOIEdQSU9fUFVQRFJfUFVQRDBfMSAvKiE8IFNlbGVjdCBJL08gcHVsbCBkb3duICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEdQSU9fTExfRUNfQUYgQWx0ZXJuYXRlIEZ1bmN0aW9uDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX0dQSU9fQUZfMCAoMHgwMDAwMDAwVSkgIC8qITwgU2VsZWN0IGFsdGVybmF0ZSBmdW5jdGlvbiAwICovDQotI2RlZmluZSBMTF9HUElPX0FGXzEgKDB4MDAwMDAwMVUpICAvKiE8IFNlbGVjdCBhbHRlcm5hdGUgZnVuY3Rpb24gMSAqLw0KLSNkZWZpbmUgTExfR1BJT19BRl8yICgweDAwMDAwMDJVKSAgLyohPCBTZWxlY3QgYWx0ZXJuYXRlIGZ1bmN0aW9uIDIgKi8NCi0jZGVmaW5lIExMX0dQSU9fQUZfMyAoMHgwMDAwMDAzVSkgIC8qITwgU2VsZWN0IGFsdGVybmF0ZSBmdW5jdGlvbiAzICovDQotI2RlZmluZSBMTF9HUElPX0FGXzQgKDB4MDAwMDAwNFUpICAvKiE8IFNlbGVjdCBhbHRlcm5hdGUgZnVuY3Rpb24gNCAqLw0KLSNkZWZpbmUgTExfR1BJT19BRl81ICgweDAwMDAwMDVVKSAgLyohPCBTZWxlY3QgYWx0ZXJuYXRlIGZ1bmN0aW9uIDUgKi8NCi0jZGVmaW5lIExMX0dQSU9fQUZfNiAoMHgwMDAwMDA2VSkgIC8qITwgU2VsZWN0IGFsdGVybmF0ZSBmdW5jdGlvbiA2ICovDQotI2RlZmluZSBMTF9HUElPX0FGXzcgKDB4MDAwMDAwN1UpICAvKiE8IFNlbGVjdCBhbHRlcm5hdGUgZnVuY3Rpb24gNyAqLw0KLSNkZWZpbmUgTExfR1BJT19BRl84ICgweDAwMDAwMDhVKSAgLyohPCBTZWxlY3QgYWx0ZXJuYXRlIGZ1bmN0aW9uIDggKi8NCi0jZGVmaW5lIExMX0dQSU9fQUZfOSAoMHgwMDAwMDA5VSkgIC8qITwgU2VsZWN0IGFsdGVybmF0ZSBmdW5jdGlvbiA5ICovDQotI2RlZmluZSBMTF9HUElPX0FGXzEwICgweDAwMDAwMEFVKSAvKiE8IFNlbGVjdCBhbHRlcm5hdGUgZnVuY3Rpb24gMTAgKi8NCi0jZGVmaW5lIExMX0dQSU9fQUZfMTEgKDB4MDAwMDAwQlUpIC8qITwgU2VsZWN0IGFsdGVybmF0ZSBmdW5jdGlvbiAxMSAqLw0KLSNkZWZpbmUgTExfR1BJT19BRl8xMiAoMHgwMDAwMDBDVSkgLyohPCBTZWxlY3QgYWx0ZXJuYXRlIGZ1bmN0aW9uIDEyICovDQotI2RlZmluZSBMTF9HUElPX0FGXzEzICgweDAwMDAwMERVKSAvKiE8IFNlbGVjdCBhbHRlcm5hdGUgZnVuY3Rpb24gMTMgKi8NCi0jZGVmaW5lIExMX0dQSU9fQUZfMTQgKDB4MDAwMDAwRVUpIC8qITwgU2VsZWN0IGFsdGVybmF0ZSBmdW5jdGlvbiAxNCAqLw0KLSNkZWZpbmUgTExfR1BJT19BRl8xNSAoMHgwMDAwMDBGVSkgLyohPCBTZWxlY3QgYWx0ZXJuYXRlIGZ1bmN0aW9uIDE1ICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBkZWZncm91cCBHUElPX0xMX0V4cG9ydGVkX01hY3JvcyBHUElPIEV4cG9ydGVkIE1hY3Jvcw0KLSAqIEB7DQotICovDQotDQotLyoqIEBkZWZncm91cCBHUElPX0xMX0VNX1dSSVRFX1JFQUQgQ29tbW9uIFdyaXRlIGFuZCByZWFkIHJlZ2lzdGVycyBNYWNyb3MNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgV3JpdGUgYSB2YWx1ZSBpbiBHUElPIHJlZ2lzdGVyDQotICogQHBhcmFtICBfX0lOU1RBTkNFX18gR1BJTyBJbnN0YW5jZQ0KLSAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSB3cml0dGVuDQotICogQHBhcmFtICBfX1ZBTFVFX18gVmFsdWUgdG8gYmUgd3JpdHRlbiBpbiB0aGUgcmVnaXN0ZXINCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIExMX0dQSU9fV3JpdGVSZWcoX19JTlNUQU5DRV9fLCBfX1JFR19fLCBfX1ZBTFVFX18pIFwNCi0gIFdSSVRFX1JFRyhfX0lOU1RBTkNFX18tPl9fUkVHX18sIChfX1ZBTFVFX18pKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmVhZCBhIHZhbHVlIGluIEdQSU8gcmVnaXN0ZXINCi0gKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBHUElPIEluc3RhbmNlDQotICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHJlYWQNCi0gKiBAcmV0dmFsIFJlZ2lzdGVyIHZhbHVlDQotICovDQotI2RlZmluZSBMTF9HUElPX1JlYWRSZWcoX19JTlNUQU5DRV9fLCBfX1JFR19fKSBSRUFEX1JFRyhfX0lOU1RBTkNFX18tPl9fUkVHX18pDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBkZWZncm91cCBHUElPX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucyBHUElPIEV4cG9ydGVkIEZ1bmN0aW9ucw0KLSAqIEB7DQotICovDQotDQotLyoqIEBkZWZncm91cCBHUElPX0xMX0VGX1BvcnRfQ29uZmlndXJhdGlvbiBQb3J0IENvbmZpZ3VyYXRpb24NCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ29uZmlndXJlIGdwaW8gbW9kZSBmb3IgYSBkZWRpY2F0ZWQgcGluIG9uIGRlZGljYXRlZCBwb3J0Lg0KLSAqIEBub3RlICAgSS9PIG1vZGUgY2FuIGJlIElucHV0IG1vZGUsIEdlbmVyYWwgcHVycG9zZSBvdXRwdXQsIEFsdGVybmF0ZQ0KLSAqIGZ1bmN0aW9uIG1vZGUgb3IgQW5hbG9nLg0KLSAqIEBub3RlICAgV2FybmluZzogb25seSBvbmUgcGluIGNhbiBiZSBwYXNzZWQgYXMgcGFyYW1ldGVyLg0KLSAqIEBybXRvbGwgTU9ERVIgICAgICAgIE1PREV5ICAgICAgICAgTExfR1BJT19TZXRQaW5Nb2RlDQotICogQHBhcmFtICBHUElPeCBHUElPIFBvcnQNCi0gKiBAcGFyYW0gIFBpbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl80DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl83DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzExDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE0DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTUNCi0gKiBAcGFyYW0gIE1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX01PREVfSU5QVVQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX01PREVfT1VUUFVUDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19NT0RFX0FMVEVSTkFURQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fTU9ERV9BTkFMT0cNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9HUElPX1NldFBpbk1vZGUoR1BJT19UeXBlRGVmICpHUElPeCwgdWludDMyX3QgUGluLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBNb2RlKSB7DQotICBNT0RJRllfUkVHKEdQSU94LT5NT0RFUiwgKEdQSU9fTU9ERVJfTU9ERTAgPDwgKFBPU0lUSU9OX1ZBTChQaW4pICogMlUpKSwNCi0gICAgICAgICAgICAgKE1vZGUgPDwgKFBPU0lUSU9OX1ZBTChQaW4pICogMlUpKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmV0dXJuIGdwaW8gbW9kZSBmb3IgYSBkZWRpY2F0ZWQgcGluIG9uIGRlZGljYXRlZCBwb3J0Lg0KLSAqIEBub3RlICAgSS9PIG1vZGUgY2FuIGJlIElucHV0IG1vZGUsIEdlbmVyYWwgcHVycG9zZSBvdXRwdXQsIEFsdGVybmF0ZQ0KLSAqIGZ1bmN0aW9uIG1vZGUgb3IgQW5hbG9nLg0KLSAqIEBub3RlICAgV2FybmluZzogb25seSBvbmUgcGluIGNhbiBiZSBwYXNzZWQgYXMgcGFyYW1ldGVyLg0KLSAqIEBybXRvbGwgTU9ERVIgICAgICAgIE1PREV5ICAgICAgICAgTExfR1BJT19HZXRQaW5Nb2RlDQotICogQHBhcmFtICBHUElPeCBHUElPIFBvcnQNCi0gKiBAcGFyYW0gIFBpbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl80DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl83DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzExDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE0DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTUNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19NT0RFX0lOUFVUDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19NT0RFX09VVFBVVA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fTU9ERV9BTFRFUk5BVEUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX01PREVfQU5BTE9HDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0dQSU9fR2V0UGluTW9kZShHUElPX1R5cGVEZWYgKkdQSU94LCB1aW50MzJfdCBQaW4pIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEdQSU94LT5NT0RFUiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChHUElPX01PREVSX01PREUwIDw8IChQT1NJVElPTl9WQUwoUGluKSAqIDJVKSkpID4+DQotICAgICAgICAgICAgICAgICAgICAoUE9TSVRJT05fVkFMKFBpbikgKiAyVSkpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENvbmZpZ3VyZSBncGlvIG91dHB1dCB0eXBlIGZvciBzZXZlcmFsIHBpbnMgb24gZGVkaWNhdGVkIHBvcnQuDQotICogQG5vdGUgICBPdXRwdXQgdHlwZSBhcyB0byBiZSBzZXQgd2hlbiBncGlvIHBpbiBpcyBpbiBvdXRwdXQgb3INCi0gKiAgICAgICAgIGFsdGVybmF0ZSBtb2Rlcy4gUG9zc2libGUgdHlwZSBhcmUgUHVzaC1wdWxsIG9yIE9wZW4tZHJhaW4uDQotICogQHJtdG9sbCBPVFlQRVIgICAgICAgT1R5ICAgICAgICAgICBMTF9HUElPX1NldFBpbk91dHB1dFR5cGUNCi0gKiBAcGFyYW0gIEdQSU94IEdQSU8gUG9ydA0KLSAqIEBwYXJhbSAgUGluTWFzayBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8wDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8zDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl82DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl85DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEyDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE1DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fQUxMDQotICogQHBhcmFtICBPdXRwdXRUeXBlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19PVVRQVVRfUFVTSFBVTEwNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX09VVFBVVF9PUEVORFJBSU4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9HUElPX1NldFBpbk91dHB1dFR5cGUoR1BJT19UeXBlRGVmICpHUElPeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUGluTWFzaywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgT3V0cHV0VHlwZSkgew0KLSAgTU9ESUZZX1JFRyhHUElPeC0+T1RZUEVSLCBQaW5NYXNrLCAoUGluTWFzayAqIE91dHB1dFR5cGUpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBSZXR1cm4gZ3BpbyBvdXRwdXQgdHlwZSBmb3Igc2V2ZXJhbCBwaW5zIG9uIGRlZGljYXRlZCBwb3J0Lg0KLSAqIEBub3RlICAgT3V0cHV0IHR5cGUgYXMgdG8gYmUgc2V0IHdoZW4gZ3BpbyBwaW4gaXMgaW4gb3V0cHV0IG9yDQotICogICAgICAgICBhbHRlcm5hdGUgbW9kZXMuIFBvc3NpYmxlIHR5cGUgYXJlIFB1c2gtcHVsbCBvciBPcGVuLWRyYWluLg0KLSAqIEBub3RlICAgV2FybmluZzogb25seSBvbmUgcGluIGNhbiBiZSBwYXNzZWQgYXMgcGFyYW1ldGVyLg0KLSAqIEBybXRvbGwgT1RZUEVSICAgICAgIE9UeSAgICAgICAgICAgTExfR1BJT19HZXRQaW5PdXRwdXRUeXBlDQotICogQHBhcmFtICBHUElPeCBHUElPIFBvcnQNCi0gKiBAcGFyYW0gIFBpbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl80DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl83DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzExDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE0DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl9BTEwNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19PVVRQVVRfUFVTSFBVTEwNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX09VVFBVVF9PUEVORFJBSU4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfR1BJT19HZXRQaW5PdXRwdXRUeXBlKEdQSU9fVHlwZURlZiAqR1BJT3gsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQaW4pIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEdQSU94LT5PVFlQRVIsIFBpbikgPj4gUE9TSVRJT05fVkFMKFBpbikpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENvbmZpZ3VyZSBncGlvIHNwZWVkIGZvciBhIGRlZGljYXRlZCBwaW4gb24gZGVkaWNhdGVkIHBvcnQuDQotICogQG5vdGUgICBJL08gc3BlZWQgY2FuIGJlIExvdywgTWVkaXVtLCBGYXN0IG9yIEhpZ2ggc3BlZWQuDQotICogQG5vdGUgICBXYXJuaW5nOiBvbmx5IG9uZSBwaW4gY2FuIGJlIHBhc3NlZCBhcyBwYXJhbWV0ZXIuDQotICogQG5vdGUgICBSZWZlciB0byBkYXRhc2hlZXQgZm9yIGZyZXF1ZW5jeSBzcGVjaWZpY2F0aW9ucyBhbmQgdGhlIHBvd2VyDQotICogICAgICAgICBzdXBwbHkgYW5kIGxvYWQgY29uZGl0aW9ucyBmb3IgZWFjaCBzcGVlZC4NCi0gKiBAcm10b2xsIE9TUEVFRFIgICAgICBPU1BFRUR5ICAgICAgIExMX0dQSU9fU2V0UGluU3BlZWQNCi0gKiBAcGFyYW0gIEdQSU94IEdQSU8gUG9ydA0KLSAqIEBwYXJhbSAgUGluIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl81DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl84DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEwDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEzDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNQ0KLSAqIEBwYXJhbSAgU3BlZWQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1NQRUVEX0ZSRVFfTE9XDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19TUEVFRF9GUkVRX01FRElVTQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fU1BFRURfRlJFUV9ISUdIDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19TUEVFRF9GUkVRX1ZFUllfSElHSA0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0dQSU9fU2V0UGluU3BlZWQoR1BJT19UeXBlRGVmICpHUElPeCwgdWludDMyX3QgUGluLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgU3BlZWQpIHsNCi0gIE1PRElGWV9SRUcoR1BJT3gtPk9TUEVFRFIsIChHUElPX09TUEVFRFJfT1NQRUVEMCA8PCAoUE9TSVRJT05fVkFMKFBpbikgKiAyVSkpLA0KLSAgICAgICAgICAgICAoU3BlZWQgPDwgKFBPU0lUSU9OX1ZBTChQaW4pICogMlUpKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmV0dXJuIGdwaW8gc3BlZWQgZm9yIGEgZGVkaWNhdGVkIHBpbiBvbiBkZWRpY2F0ZWQgcG9ydC4NCi0gKiBAbm90ZSAgIEkvTyBzcGVlZCBjYW4gYmUgTG93LCBNZWRpdW0sIEZhc3Qgb3IgSGlnaCBzcGVlZC4NCi0gKiBAbm90ZSAgIFdhcm5pbmc6IG9ubHkgb25lIHBpbiBjYW4gYmUgcGFzc2VkIGFzIHBhcmFtZXRlci4NCi0gKiBAbm90ZSAgIFJlZmVyIHRvIGRhdGFzaGVldCBmb3IgZnJlcXVlbmN5IHNwZWNpZmljYXRpb25zIGFuZCB0aGUgcG93ZXINCi0gKiAgICAgICAgIHN1cHBseSBhbmQgbG9hZCBjb25kaXRpb25zIGZvciBlYWNoIHNwZWVkLg0KLSAqIEBybXRvbGwgT1NQRUVEUiAgICAgIE9TUEVFRHkgICAgICAgTExfR1BJT19HZXRQaW5TcGVlZA0KLSAqIEBwYXJhbSAgR1BJT3ggR1BJTyBQb3J0DQotICogQHBhcmFtICBQaW4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8wDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8zDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl82DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl85DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEyDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE1DQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fU1BFRURfRlJFUV9MT1cNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1NQRUVEX0ZSRVFfTUVESVVNDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19TUEVFRF9GUkVRX0hJR0gNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1NQRUVEX0ZSRVFfVkVSWV9ISUdIDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0dQSU9fR2V0UGluU3BlZWQoR1BJT19UeXBlRGVmICpHUElPeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQaW4pIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEdQSU94LT5PU1BFRURSLCAoR1BJT19PU1BFRURSX09TUEVFRDANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKFBPU0lUSU9OX1ZBTChQaW4pICogMlUpKSkgPj4NCi0gICAgICAgICAgICAgICAgICAgIChQT1NJVElPTl9WQUwoUGluKSAqIDJVKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ29uZmlndXJlIGdwaW8gcHVsbC11cCBvciBwdWxsLWRvd24gZm9yIGEgZGVkaWNhdGVkIHBpbiBvbiBhDQotICogZGVkaWNhdGVkIHBvcnQuDQotICogQG5vdGUgICBXYXJuaW5nOiBvbmx5IG9uZSBwaW4gY2FuIGJlIHBhc3NlZCBhcyBwYXJhbWV0ZXIuDQotICogQHJtdG9sbCBQVVBEUiAgICAgICAgUFVQRHkgICAgICAgICBMTF9HUElPX1NldFBpblB1bGwNCi0gKiBAcGFyYW0gIEdQSU94IEdQSU8gUG9ydA0KLSAqIEBwYXJhbSAgUGluIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl81DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl84DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEwDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEzDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNQ0KLSAqIEBwYXJhbSAgUHVsbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUFVMTF9OTw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUFVMTF9VUA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUFVMTF9ET1dODQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfR1BJT19TZXRQaW5QdWxsKEdQSU9fVHlwZURlZiAqR1BJT3gsIHVpbnQzMl90IFBpbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUHVsbCkgew0KLSAgTU9ESUZZX1JFRyhHUElPeC0+UFVQRFIsIChHUElPX1BVUERSX1BVUEQwIDw8IChQT1NJVElPTl9WQUwoUGluKSAqIDJVKSksDQotICAgICAgICAgICAgIChQdWxsIDw8IChQT1NJVElPTl9WQUwoUGluKSAqIDJVKSkpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJldHVybiBncGlvIHB1bGwtdXAgb3IgcHVsbC1kb3duIGZvciBhIGRlZGljYXRlZCBwaW4gb24gYSBkZWRpY2F0ZWQNCi0gKiBwb3J0DQotICogQG5vdGUgICBXYXJuaW5nOiBvbmx5IG9uZSBwaW4gY2FuIGJlIHBhc3NlZCBhcyBwYXJhbWV0ZXIuDQotICogQHJtdG9sbCBQVVBEUiAgICAgICAgUFVQRHkgICAgICAgICBMTF9HUElPX0dldFBpblB1bGwNCi0gKiBAcGFyYW0gIEdQSU94IEdQSU8gUG9ydA0KLSAqIEBwYXJhbSAgUGluIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl81DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl84DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEwDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEzDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNQ0KLSAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BVTExfTk8NCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BVTExfVVANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BVTExfRE9XTg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9HUElPX0dldFBpblB1bGwoR1BJT19UeXBlRGVmICpHUElPeCwgdWludDMyX3QgUGluKSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChHUElPeC0+UFVQRFIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoR1BJT19QVVBEUl9QVVBEMCA8PCAoUE9TSVRJT05fVkFMKFBpbikgKiAyVSkpKSA+Pg0KLSAgICAgICAgICAgICAgICAgICAgKFBPU0lUSU9OX1ZBTChQaW4pICogMlUpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDb25maWd1cmUgZ3BpbyBhbHRlcm5hdGUgZnVuY3Rpb24gb2YgYSBkZWRpY2F0ZWQgcGluIGZyb20gMCB0byA3IGZvcg0KLSAqIGEgZGVkaWNhdGVkIHBvcnQuDQotICogQG5vdGUgICBQb3NzaWJsZSB2YWx1ZXMgYXJlIGZyb20gQUYwIHRvIEFGMTUgZGVwZW5kaW5nIG9uIHRhcmdldC4NCi0gKiBAbm90ZSAgIFdhcm5pbmc6IG9ubHkgb25lIHBpbiBjYW4gYmUgcGFzc2VkIGFzIHBhcmFtZXRlci4NCi0gKiBAcm10b2xsIEFGUkwgICAgICAgICBBRlNFTHkgICAgICAgIExMX0dQSU9fU2V0QUZQaW5fMF83DQotICogQHBhcmFtICBHUElPeCBHUElPIFBvcnQNCi0gKiBAcGFyYW0gIFBpbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl80DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl83DQotICogQHBhcmFtICBBbHRlcm5hdGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzEwDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8xMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMTINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzEzDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8xNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMTUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9HUElPX1NldEFGUGluXzBfNyhHUElPX1R5cGVEZWYgKkdQSU94LCB1aW50MzJfdCBQaW4sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQWx0ZXJuYXRlKSB7DQotICBNT0RJRllfUkVHKEdQSU94LT5BRlJbMF0sIChHUElPX0FGUkxfQUZTRUwwIDw8IChQT1NJVElPTl9WQUwoUGluKSAqIDRVKSksDQotICAgICAgICAgICAgIChBbHRlcm5hdGUgPDwgKFBPU0lUSU9OX1ZBTChQaW4pICogNFUpKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmV0dXJuIGdwaW8gYWx0ZXJuYXRlIGZ1bmN0aW9uIG9mIGEgZGVkaWNhdGVkIHBpbiBmcm9tIDAgdG8gNyBmb3IgYQ0KLSAqIGRlZGljYXRlZCBwb3J0Lg0KLSAqIEBybXRvbGwgQUZSTCAgICAgICAgIEFGU0VMeSAgICAgICAgTExfR1BJT19HZXRBRlBpbl8wXzcNCi0gKiBAcGFyYW0gIEdQSU94IEdQSU8gUG9ydA0KLSAqIEBwYXJhbSAgUGluIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl81DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzcNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8wDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8xDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8zDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl80DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl81DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl82DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl83DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl84DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl85DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8xMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzEyDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8xMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMTQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzE1DQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0dQSU9fR2V0QUZQaW5fMF83KEdQSU9fVHlwZURlZiAqR1BJT3gsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFBpbikgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoR1BJT3gtPkFGUlswXSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChHUElPX0FGUkxfQUZTRUwwIDw8IChQT1NJVElPTl9WQUwoUGluKSAqIDRVKSkpID4+DQotICAgICAgICAgICAgICAgICAgICAoUE9TSVRJT05fVkFMKFBpbikgKiA0VSkpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENvbmZpZ3VyZSBncGlvIGFsdGVybmF0ZSBmdW5jdGlvbiBvZiBhIGRlZGljYXRlZCBwaW4gZnJvbSA4IHRvIDE1IGZvcg0KLSAqIGEgZGVkaWNhdGVkIHBvcnQuDQotICogQG5vdGUgICBQb3NzaWJsZSB2YWx1ZXMgYXJlIGZyb20gQUYwIHRvIEFGMTUgZGVwZW5kaW5nIG9uIHRhcmdldC4NCi0gKiBAbm90ZSAgIFdhcm5pbmc6IG9ubHkgb25lIHBpbiBjYW4gYmUgcGFzc2VkIGFzIHBhcmFtZXRlci4NCi0gKiBAcm10b2xsIEFGUkggICAgICAgICBBRlNFTHkgICAgICAgIExMX0dQSU9fU2V0QUZQaW5fOF8xNQ0KLSAqIEBwYXJhbSAgR1BJT3ggR1BJTyBQb3J0DQotICogQHBhcmFtICBQaW4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl84DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEwDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEzDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNQ0KLSAqIEBwYXJhbSAgQWx0ZXJuYXRlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8wDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8xDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8zDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl80DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl81DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl82DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl83DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl84DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl85DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8xMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzEyDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8xMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMTQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzE1DQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfR1BJT19TZXRBRlBpbl84XzE1KEdQSU9fVHlwZURlZiAqR1BJT3gsIHVpbnQzMl90IFBpbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQWx0ZXJuYXRlKSB7DQotICBNT0RJRllfUkVHKEdQSU94LT5BRlJbMV0sDQotICAgICAgICAgICAgIChHUElPX0FGUkhfQUZTRUw4IDw8IChQT1NJVElPTl9WQUwoUGluID4+IDhVKSAqIDRVKSksDQotICAgICAgICAgICAgIChBbHRlcm5hdGUgPDwgKFBPU0lUSU9OX1ZBTChQaW4gPj4gOFUpICogNFUpKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmV0dXJuIGdwaW8gYWx0ZXJuYXRlIGZ1bmN0aW9uIG9mIGEgZGVkaWNhdGVkIHBpbiBmcm9tIDggdG8gMTUgZm9yIGENCi0gKiBkZWRpY2F0ZWQgcG9ydC4NCi0gKiBAbm90ZSAgIFBvc3NpYmxlIHZhbHVlcyBhcmUgZnJvbSBBRjAgdG8gQUYxNSBkZXBlbmRpbmcgb24gdGFyZ2V0Lg0KLSAqIEBybXRvbGwgQUZSSCAgICAgICAgIEFGU0VMeSAgICAgICAgTExfR1BJT19HZXRBRlBpbl84XzE1DQotICogQHBhcmFtICBHUElPeCBHUElPIFBvcnQNCi0gKiBAcGFyYW0gIFBpbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl85DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEyDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE1DQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfNw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMTANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzExDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8xMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMTMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzE0DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8xNQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9HUElPX0dldEFGUGluXzhfMTUoR1BJT19UeXBlRGVmICpHUElPeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFBpbikgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoDQotICAgICAgICAgICAgICAgICAgICAgICAgR1BJT3gtPkFGUlsxXSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAoR1BJT19BRlJIX0FGU0VMOCA8PCAoUE9TSVRJT05fVkFMKFBpbiA+PiA4VSkgKiA0VSkpKSA+Pg0KLSAgICAgICAgICAgICAgICAgICAgKFBPU0lUSU9OX1ZBTChQaW4gPj4gOFUpICogNFUpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBMb2NrIGNvbmZpZ3VyYXRpb24gb2Ygc2V2ZXJhbCBwaW5zIGZvciBhIGRlZGljYXRlZCBwb3J0Lg0KLSAqIEBub3RlICAgV2hlbiB0aGUgbG9jayBzZXF1ZW5jZSBoYXMgYmVlbiBhcHBsaWVkIG9uIGEgcG9ydCBiaXQsIHRoZQ0KLSAqICAgICAgICAgdmFsdWUgb2YgdGhpcyBwb3J0IGJpdCBjYW4gbm8gbG9uZ2VyIGJlIG1vZGlmaWVkIHVudGlsIHRoZQ0KLSAqICAgICAgICAgbmV4dCByZXNldC4NCi0gKiBAbm90ZSAgIEVhY2ggbG9jayBiaXQgZnJlZXplcyBhIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXINCi0gKiAgICAgICAgIChjb250cm9sIGFuZCBhbHRlcm5hdGUgZnVuY3Rpb24gcmVnaXN0ZXJzKS4NCi0gKiBAcm10b2xsIExDS1IgICAgICAgICBMQ0tLICAgICAgICAgIExMX0dQSU9fTG9ja1Bpbg0KLSAqIEBwYXJhbSAgR1BJT3ggR1BJTyBQb3J0DQotICogQHBhcmFtICBQaW5NYXNrIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl80DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl83DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzExDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE0DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl9BTEwNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9HUElPX0xvY2tQaW4oR1BJT19UeXBlRGVmICpHUElPeCwgdWludDMyX3QgUGluTWFzaykgew0KLSAgX19JTyB1aW50MzJfdCB0ZW1wOw0KLSAgV1JJVEVfUkVHKEdQSU94LT5MQ0tSLCBHUElPX0xDS1JfTENLSyB8IFBpbk1hc2spOw0KLSAgV1JJVEVfUkVHKEdQSU94LT5MQ0tSLCBQaW5NYXNrKTsNCi0gIFdSSVRFX1JFRyhHUElPeC0+TENLUiwgR1BJT19MQ0tSX0xDS0sgfCBQaW5NYXNrKTsNCi0gIC8qIFJlYWQgTENLUiByZWdpc3Rlci4gVGhpcyByZWFkIGlzIG1hbmRhdG9yeSB0byBjb21wbGV0ZSBrZXkgbG9jayBzZXF1ZW5jZSAqLw0KLSAgdGVtcCA9IFJFQURfUkVHKEdQSU94LT5MQ0tSKTsNCi0gICh2b2lkKXRlbXA7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmV0dXJuIDEgaWYgYWxsIHBpbnMgcGFzc2VkIGFzIHBhcmFtZXRlciwgb2YgYSBkZWRpY2F0ZWQgcG9ydCwgYXJlDQotICogbG9ja2VkLiBlbHNlIFJldHVybiAwLg0KLSAqIEBybXRvbGwgTENLUiAgICAgICAgIExDS3kgICAgICAgICAgTExfR1BJT19Jc1BpbkxvY2tlZA0KLSAqIEBwYXJhbSAgR1BJT3ggR1BJTyBQb3J0DQotICogQHBhcmFtICBQaW5NYXNrIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl80DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl83DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzExDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE0DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl9BTEwNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfR1BJT19Jc1BpbkxvY2tlZChHUElPX1R5cGVEZWYgKkdQSU94LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFBpbk1hc2spIHsNCi0gIHJldHVybiAoKFJFQURfQklUKEdQSU94LT5MQ0tSLCBQaW5NYXNrKSA9PSAoUGluTWFzaykpID8gMVVMIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBSZXR1cm4gMSBpZiBvbmUgb2YgdGhlIHBpbiBvZiBhIGRlZGljYXRlZCBwb3J0IGlzIGxvY2tlZC4gZWxzZSByZXR1cm4NCi0gKiAwLg0KLSAqIEBybXRvbGwgTENLUiAgICAgICAgIExDS0sgICAgICAgICAgTExfR1BJT19Jc0FueVBpbkxvY2tlZA0KLSAqIEBwYXJhbSAgR1BJT3ggR1BJTyBQb3J0DQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0dQSU9fSXNBbnlQaW5Mb2NrZWQoR1BJT19UeXBlRGVmICpHUElPeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoR1BJT3gtPkxDS1IsIEdQSU9fTENLUl9MQ0tLKSA9PSAoR1BJT19MQ0tSX0xDS0spKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBHUElPX0xMX0VGX0RhdGFfQWNjZXNzIERhdGEgQWNjZXNzDQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJldHVybiBmdWxsIGlucHV0IGRhdGEgcmVnaXN0ZXIgdmFsdWUgZm9yIGEgZGVkaWNhdGVkIHBvcnQuDQotICogQHJtdG9sbCBJRFIgICAgICAgICAgSUR5ICAgICAgICAgICBMTF9HUElPX1JlYWRJbnB1dFBvcnQNCi0gKiBAcGFyYW0gIEdQSU94IEdQSU8gUG9ydA0KLSAqIEByZXR2YWwgSW5wdXQgZGF0YSByZWdpc3RlciB2YWx1ZSBvZiBwb3J0DQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0dQSU9fUmVhZElucHV0UG9ydChHUElPX1R5cGVEZWYgKkdQSU94KSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX1JFRyhHUElPeC0+SURSKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmV0dXJuIGlmIGlucHV0IGRhdGEgbGV2ZWwgZm9yIHNldmVyYWwgcGlucyBvZiBkZWRpY2F0ZWQgcG9ydCBpcyBoaWdoDQotICogb3IgbG93Lg0KLSAqIEBybXRvbGwgSURSICAgICAgICAgIElEeSAgICAgICAgICAgTExfR1BJT19Jc0lucHV0UGluU2V0DQotICogQHBhcmFtICBHUElPeCBHUElPIFBvcnQNCi0gKiBAcGFyYW0gIFBpbk1hc2sgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl81DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl84DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEwDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEzDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOX0FMTA0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9HUElPX0lzSW5wdXRQaW5TZXQoR1BJT19UeXBlRGVmICpHUElPeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFBpbk1hc2spIHsNCi0gIHJldHVybiAoKFJFQURfQklUKEdQSU94LT5JRFIsIFBpbk1hc2spID09IChQaW5NYXNrKSkgPyAxVUwgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFdyaXRlIG91dHB1dCBkYXRhIHJlZ2lzdGVyIGZvciB0aGUgcG9ydC4NCi0gKiBAcm10b2xsIE9EUiAgICAgICAgICBPRHkgICAgICAgICAgIExMX0dQSU9fV3JpdGVPdXRwdXRQb3J0DQotICogQHBhcmFtICBHUElPeCBHUElPIFBvcnQNCi0gKiBAcGFyYW0gIFBvcnRWYWx1ZSBMZXZlbCB2YWx1ZSBmb3IgZWFjaCBwaW4gb2YgdGhlIHBvcnQNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9HUElPX1dyaXRlT3V0cHV0UG9ydChHUElPX1R5cGVEZWYgKkdQSU94LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFBvcnRWYWx1ZSkgew0KLSAgV1JJVEVfUkVHKEdQSU94LT5PRFIsIFBvcnRWYWx1ZSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmV0dXJuIGZ1bGwgb3V0cHV0IGRhdGEgcmVnaXN0ZXIgdmFsdWUgZm9yIGEgZGVkaWNhdGVkIHBvcnQuDQotICogQHJtdG9sbCBPRFIgICAgICAgICAgT0R5ICAgICAgICAgICBMTF9HUElPX1JlYWRPdXRwdXRQb3J0DQotICogQHBhcmFtICBHUElPeCBHUElPIFBvcnQNCi0gKiBAcmV0dmFsIE91dHB1dCBkYXRhIHJlZ2lzdGVyIHZhbHVlIG9mIHBvcnQNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfR1BJT19SZWFkT3V0cHV0UG9ydChHUElPX1R5cGVEZWYgKkdQSU94KSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX1JFRyhHUElPeC0+T0RSKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmV0dXJuIGlmIGlucHV0IGRhdGEgbGV2ZWwgZm9yIHNldmVyYWwgcGlucyBvZiBkZWRpY2F0ZWQgcG9ydCBpcyBoaWdoDQotICogb3IgbG93Lg0KLSAqIEBybXRvbGwgT0RSICAgICAgICAgIE9EeSAgICAgICAgICAgTExfR1BJT19Jc091dHB1dFBpblNldA0KLSAqIEBwYXJhbSAgR1BJT3ggR1BJTyBQb3J0DQotICogQHBhcmFtICBQaW5NYXNrIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl80DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl83DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzExDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE0DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl9BTEwNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfR1BJT19Jc091dHB1dFBpblNldChHUElPX1R5cGVEZWYgKkdQSU94LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFBpbk1hc2spIHsNCi0gIHJldHVybiAoKFJFQURfQklUKEdQSU94LT5PRFIsIFBpbk1hc2spID09IChQaW5NYXNrKSkgPyAxVUwgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCBzZXZlcmFsIHBpbnMgdG8gaGlnaCBsZXZlbCBvbiBkZWRpY2F0ZWQgZ3BpbyBwb3J0Lg0KLSAqIEBybXRvbGwgQlNSUiAgICAgICAgIEJTeSAgICAgICAgICAgTExfR1BJT19TZXRPdXRwdXRQaW4NCi0gKiBAcGFyYW0gIEdQSU94IEdQSU8gUG9ydA0KLSAqIEBwYXJhbSAgUGluTWFzayBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8wDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8zDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl82DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl85DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEyDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE1DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fQUxMDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfR1BJT19TZXRPdXRwdXRQaW4oR1BJT19UeXBlRGVmICpHUElPeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQaW5NYXNrKSB7DQotICBXUklURV9SRUcoR1BJT3gtPkJTUlIsIFBpbk1hc2spOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCBzZXZlcmFsIHBpbnMgdG8gbG93IGxldmVsIG9uIGRlZGljYXRlZCBncGlvIHBvcnQuDQotICogQHJtdG9sbCBCUlIgICAgICAgICAgQlJ5ICAgICAgICAgICBMTF9HUElPX1Jlc2V0T3V0cHV0UGluDQotICogQHBhcmFtICBHUElPeCBHUElPIFBvcnQNCi0gKiBAcGFyYW0gIFBpbk1hc2sgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl81DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl84DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEwDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEzDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOX0FMTA0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0dQSU9fUmVzZXRPdXRwdXRQaW4oR1BJT19UeXBlRGVmICpHUElPeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFBpbk1hc2spIHsNCi0gIFdSSVRFX1JFRyhHUElPeC0+QlJSLCBQaW5NYXNrKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBUb2dnbGUgZGF0YSB2YWx1ZSBmb3Igc2V2ZXJhbCBwaW4gb2YgZGVkaWNhdGVkIHBvcnQuDQotICogQHJtdG9sbCBPRFIgICAgICAgICAgT0R5ICAgICAgICAgICBMTF9HUElPX1RvZ2dsZVBpbg0KLSAqIEBwYXJhbSAgR1BJT3ggR1BJTyBQb3J0DQotICogQHBhcmFtICBQaW5NYXNrIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl80DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl83DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzExDQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE0DQotICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl9BTEwNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9HUElPX1RvZ2dsZVBpbihHUElPX1R5cGVEZWYgKkdQSU94LCB1aW50MzJfdCBQaW5NYXNrKSB7DQotICB1aW50MzJfdCBvZHIgPSBSRUFEX1JFRyhHUElPeC0+T0RSKTsNCi0gIFdSSVRFX1JFRyhHUElPeC0+QlNSUiwgKChvZHIgJiBQaW5NYXNrKSA8PCAxNnUpIHwgKH5vZHIgJiBQaW5NYXNrKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQ0KLS8qKiBAZGVmZ3JvdXAgR1BJT19MTF9FRl9Jbml0IEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMNCi0gKiBAew0KLSAqLw0KLQ0KLUVycm9yU3RhdHVzIExMX0dQSU9fRGVJbml0KEdQSU9fVHlwZURlZiAqR1BJT3gpOw0KLUVycm9yU3RhdHVzIExMX0dQSU9fSW5pdChHUElPX1R5cGVEZWYgKkdQSU94LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBMTF9HUElPX0luaXRUeXBlRGVmICpHUElPX0luaXRTdHJ1Y3QpOw0KLXZvaWQgTExfR1BJT19TdHJ1Y3RJbml0KExMX0dQSU9fSW5pdFR5cGVEZWYgKkdQSU9fSW5pdFN0cnVjdCk7DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0jZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLSNlbmRpZiAvKiBkZWZpbmVkIChHUElPQSkgfHwgZGVmaW5lZCAoR1BJT0IpIHx8IGRlZmluZWQgKEdQSU9DKSB8fCBkZWZpbmVkIFwNCi0gICAgICAgICAgKEdQSU9EKSB8fCBkZWZpbmVkIChHUElPRSkgfHwgZGVmaW5lZCAoR1BJT0YpIHx8IGRlZmluZWQgKEdQSU9HKSAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotI2lmZGVmIF9fY3BsdXNwbHVzDQotfQ0KLSNlbmRpZg0KLQ0KLSNlbmRpZiAvKiBTVE0zMkc0eHhfTExfR1BJT19IICovDQorLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAZmlsZSAgICBzdG0zMmc0eHhfbGxfZ3Bpby5oCisgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgR1BJTyBMTCBtb2R1bGUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYXR0ZW50aW9uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0ZXJtcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlCisgKiBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb2Z0d2FyZSBjb21wb25lbnQuCisgKiBJZiBubyBMSUNFTlNFIGZpbGUgY29tZXMgd2l0aCB0aGlzIHNvZnR3YXJlLCBpdCBpcyBwcm92aWRlZCBBUy1JUy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJHNHh4X0xMX0dQSU9fSAorI2RlZmluZSBTVE0zMkc0eHhfTExfR1BJT19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmc0eHguaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzR4eF9MTF9Ecml2ZXIKKyAqIEB7CisgKi8KKworI2lmIGRlZmluZWQoR1BJT0EpIHx8IGRlZmluZWQoR1BJT0IpIHx8IGRlZmluZWQoR1BJT0MpIHx8IGRlZmluZWQoR1BJT0QpIHx8IFwKKyAgICBkZWZpbmVkKEdQSU9FKSB8fCBkZWZpbmVkKEdQSU9GKSB8fCBkZWZpbmVkKEdQSU9HKQorCisvKiogQGRlZmdyb3VwIEdQSU9fTEwgR1BJTworICogQHsKKyAqLworLyoqIE1JU1JBIEM6MjAxMiBkZXZpYXRpb24gcnVsZSBoYXMgYmVlbiBncmFudGVkIGZvciBmb2xsb3dpbmcgcnVsZXM6CisgKiBSdWxlLTE4LjFfZCAtIE1lZGl1bTogQXJyYXkgcG9pbnRlciBgR1BJT3gnIGlzIGFjY2Vzc2VkIHdpdGggaW5kZXggWy4uLC4uXQorICogd2hpY2ggbWF5IGJlIG91dCBvZiBhcnJheSBib3VuZHMgWy4uLFVOS05PV05dIGluIGZvbGxvd2luZyBBUElzOgorICogTExfR1BJT19HZXRBRlBpbl8wXzcKKyAqIExMX0dQSU9fU2V0QUZQaW5fMF83CisgKiBMTF9HUElPX1NldEFGUGluXzhfMTUKKyAqIExMX0dQSU9fR2V0QUZQaW5fOF8xNQorICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIEdQSU9fTExfUHJpdmF0ZV9NYWNyb3MgR1BJTyBQcml2YXRlIE1hY3JvcworICogQHsKKyAqLworCisvKioKKyAqIEB9CisgKi8KKyNlbmRpZiAvKlVTRV9GVUxMX0xMX0RSSVZFUiovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIEdQSU9fTExfRVNfSU5JVCBHUElPIEV4cG9ydGVkIEluaXQgc3RydWN0dXJlcworICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiBMTCBHUElPIEluaXQgU3RydWN0dXJlIGRlZmluaXRpb24KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50MzJfdCBQaW47IC8qITwgU3BlY2lmaWVzIHRoZSBHUElPIHBpbnMgdG8gYmUgY29uZmlndXJlZC4KKyAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgdmFsdWUgb2YgQHJlZiBHUElPX0xMX0VDX1BJTiAqLworCisgIHVpbnQzMl90IE1vZGU7IC8qITwgU3BlY2lmaWVzIHRoZSBvcGVyYXRpbmcgbW9kZSBmb3IgdGhlIHNlbGVjdGVkIHBpbnMuCisgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBHUElPX0xMX0VDX01PREUuCisKKyAgICAgICAgICAgICAgICAgICAgICBHUElPIEhXIGNvbmZpZ3VyYXRpb24gY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcKKyAgICAgICAgICAgICAgICAgICAgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0dQSU9fU2V0UGluTW9kZSgpLiovCisKKyAgdWludDMyX3QgU3BlZWQ7IC8qITwgU3BlY2lmaWVzIHRoZSBzcGVlZCBmb3IgdGhlIHNlbGVjdGVkIHBpbnMuCisgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgR1BJT19MTF9FQ19TUEVFRC4KKworICAgICAgICAgICAgICAgICAgICAgICBHUElPIEhXIGNvbmZpZ3VyYXRpb24gY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcKKyAgICAgICAgICAgICAgICAgICAgIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9HUElPX1NldFBpblNwZWVkKCkuKi8KKworICB1aW50MzJfdAorICAgICAgT3V0cHV0VHlwZTsgLyohPCBTcGVjaWZpZXMgdGhlIG9wZXJhdGluZyBvdXRwdXQgdHlwZSBmb3IgdGhlIHNlbGVjdGVkCisgICAgICAgICAgICAgICAgICAgICBwaW5zLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgICBHUElPX0xMX0VDX09VVFBVVC4KKworICAgICAgICAgICAgICAgICAgICAgICBHUElPIEhXIGNvbmZpZ3VyYXRpb24gY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcKKyAgICAgICAgICAgICAgICAgICAgIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9HUElPX1NldFBpbk91dHB1dFR5cGUoKS4qLworCisgIHVpbnQzMl90IFB1bGw7IC8qITwgU3BlY2lmaWVzIHRoZSBvcGVyYXRpbmcgUHVsbC11cC9QdWxsIGRvd24gZm9yIHRoZSBzZWxlY3RlZAorICAgICAgICAgICAgICAgICAgICBwaW5zLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEdQSU9fTExfRUNfUFVMTC4KKworICAgICAgICAgICAgICAgICAgICAgIEdQSU8gSFcgY29uZmlndXJhdGlvbiBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZworICAgICAgICAgICAgICAgICAgICB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfR1BJT19TZXRQaW5QdWxsKCkuKi8KKworICB1aW50MzJfdAorICAgICAgQWx0ZXJuYXRlOyAvKiE8IFNwZWNpZmllcyB0aGUgUGVyaXBoZXJhbCB0byBiZSBjb25uZWN0ZWQgdG8gdGhlIHNlbGVjdGVkCisgICAgICAgICAgICAgICAgICAgIHBpbnMuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgR1BJT19MTF9FQ19BRi4KKworICAgICAgICAgICAgICAgICAgICAgIEdQSU8gSFcgY29uZmlndXJhdGlvbiBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZworICAgICAgICAgICAgICAgICAgICB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfR1BJT19TZXRBRlBpbl8wXzcoKSBhbmQKKyAgICAgICAgICAgICAgICAgICAgTExfR1BJT19TZXRBRlBpbl84XzE1KCkuKi8KK30gTExfR1BJT19Jbml0VHlwZURlZjsKKworLyoqCisgKiBAfQorICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEdQSU9fTExfRXhwb3J0ZWRfQ29uc3RhbnRzIEdQSU8gRXhwb3J0ZWQgQ29uc3RhbnRzCisgKiBAeworICovCisKKy8qKiBAZGVmZ3JvdXAgR1BJT19MTF9FQ19QSU4gUElOCisgKiBAeworICovCisjZGVmaW5lIExMX0dQSU9fUElOXzAgR1BJT19CU1JSX0JTMCAgIC8qITwgU2VsZWN0IHBpbiAwICovCisjZGVmaW5lIExMX0dQSU9fUElOXzEgR1BJT19CU1JSX0JTMSAgIC8qITwgU2VsZWN0IHBpbiAxICovCisjZGVmaW5lIExMX0dQSU9fUElOXzIgR1BJT19CU1JSX0JTMiAgIC8qITwgU2VsZWN0IHBpbiAyICovCisjZGVmaW5lIExMX0dQSU9fUElOXzMgR1BJT19CU1JSX0JTMyAgIC8qITwgU2VsZWN0IHBpbiAzICovCisjZGVmaW5lIExMX0dQSU9fUElOXzQgR1BJT19CU1JSX0JTNCAgIC8qITwgU2VsZWN0IHBpbiA0ICovCisjZGVmaW5lIExMX0dQSU9fUElOXzUgR1BJT19CU1JSX0JTNSAgIC8qITwgU2VsZWN0IHBpbiA1ICovCisjZGVmaW5lIExMX0dQSU9fUElOXzYgR1BJT19CU1JSX0JTNiAgIC8qITwgU2VsZWN0IHBpbiA2ICovCisjZGVmaW5lIExMX0dQSU9fUElOXzcgR1BJT19CU1JSX0JTNyAgIC8qITwgU2VsZWN0IHBpbiA3ICovCisjZGVmaW5lIExMX0dQSU9fUElOXzggR1BJT19CU1JSX0JTOCAgIC8qITwgU2VsZWN0IHBpbiA4ICovCisjZGVmaW5lIExMX0dQSU9fUElOXzkgR1BJT19CU1JSX0JTOSAgIC8qITwgU2VsZWN0IHBpbiA5ICovCisjZGVmaW5lIExMX0dQSU9fUElOXzEwIEdQSU9fQlNSUl9CUzEwIC8qITwgU2VsZWN0IHBpbiAxMCAqLworI2RlZmluZSBMTF9HUElPX1BJTl8xMSBHUElPX0JTUlJfQlMxMSAvKiE8IFNlbGVjdCBwaW4gMTEgKi8KKyNkZWZpbmUgTExfR1BJT19QSU5fMTIgR1BJT19CU1JSX0JTMTIgLyohPCBTZWxlY3QgcGluIDEyICovCisjZGVmaW5lIExMX0dQSU9fUElOXzEzIEdQSU9fQlNSUl9CUzEzIC8qITwgU2VsZWN0IHBpbiAxMyAqLworI2RlZmluZSBMTF9HUElPX1BJTl8xNCBHUElPX0JTUlJfQlMxNCAvKiE8IFNlbGVjdCBwaW4gMTQgKi8KKyNkZWZpbmUgTExfR1BJT19QSU5fMTUgR1BJT19CU1JSX0JTMTUgLyohPCBTZWxlY3QgcGluIDE1ICovCisjZGVmaW5lIExMX0dQSU9fUElOX0FMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChHUElPX0JTUlJfQlMwIHwgR1BJT19CU1JSX0JTMSB8IEdQSU9fQlNSUl9CUzIgfCBHUElPX0JTUlJfQlMzIHwgICBcCisgICBHUElPX0JTUlJfQlM0IHwgR1BJT19CU1JSX0JTNSB8IEdQSU9fQlNSUl9CUzYgfCBHUElPX0JTUlJfQlM3IHwgICBcCisgICBHUElPX0JTUlJfQlM4IHwgR1BJT19CU1JSX0JTOSB8IEdQSU9fQlNSUl9CUzEwIHwgR1BJT19CU1JSX0JTMTEgfCBcCisgICBHUElPX0JTUlJfQlMxMiB8IEdQSU9fQlNSUl9CUzEzIHwgR1BJT19CU1JSX0JTMTQgfCAgICAgICAgICAgICAgICBcCisgICBHUElPX0JTUlJfQlMxNSkgLyohPCBTZWxlY3QgYWxsIHBpbnMgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEdQSU9fTExfRUNfTU9ERSBNb2RlCisgKiBAeworICovCisjZGVmaW5lIExMX0dQSU9fTU9ERV9JTlBVVCAoMHgwMDAwMDAwMFUpICAgICAgIC8qITwgU2VsZWN0IGlucHV0IG1vZGUgKi8KKyNkZWZpbmUgTExfR1BJT19NT0RFX09VVFBVVCBHUElPX01PREVSX01PREUwXzAgLyohPCBTZWxlY3Qgb3V0cHV0IG1vZGUgKi8KKyNkZWZpbmUgTExfR1BJT19NT0RFX0FMVEVSTkFURSBcCisgIEdQSU9fTU9ERVJfTU9ERTBfMSAvKiE8IFNlbGVjdCBhbHRlcm5hdGUgZnVuY3Rpb24gbW9kZSAqLworI2RlZmluZSBMTF9HUElPX01PREVfQU5BTE9HIEdQSU9fTU9ERVJfTU9ERTAgLyohPCBTZWxlY3QgYW5hbG9nIG1vZGUgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEdQSU9fTExfRUNfT1VUUFVUIE91dHB1dCBUeXBlCisgKiBAeworICovCisjZGVmaW5lIExMX0dQSU9fT1VUUFVUX1BVU0hQVUxMIFwKKyAgKDB4MDAwMDAwMDBVKSAvKiE8IFNlbGVjdCBwdXNoLXB1bGwgYXMgb3V0cHV0IHR5cGUgKi8KKyNkZWZpbmUgTExfR1BJT19PVVRQVVRfT1BFTkRSQUlOIFwKKyAgR1BJT19PVFlQRVJfT1QwIC8qITwgU2VsZWN0IG9wZW4tZHJhaW4gYXMgb3V0cHV0IHR5cGUgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEdQSU9fTExfRUNfU1BFRUQgT3V0cHV0IFNwZWVkCisgKiBAeworICovCisjZGVmaW5lIExMX0dQSU9fU1BFRURfRlJFUV9MT1cgXAorICAoMHgwMDAwMDAwMFUpIC8qITwgU2VsZWN0IEkvTyBsb3cgb3V0cHV0IHNwZWVkICAgICovCisjZGVmaW5lIExMX0dQSU9fU1BFRURfRlJFUV9NRURJVU0gXAorICBHUElPX09TUEVFRFJfT1NQRUVEMF8wIC8qITwgU2VsZWN0IEkvTyBtZWRpdW0gb3V0cHV0IHNwZWVkICovCisjZGVmaW5lIExMX0dQSU9fU1BFRURfRlJFUV9ISUdIIFwKKyAgR1BJT19PU1BFRURSX09TUEVFRDBfMSAvKiE8IFNlbGVjdCBJL08gZmFzdCBvdXRwdXQgc3BlZWQgICAqLworI2RlZmluZSBMTF9HUElPX1NQRUVEX0ZSRVFfVkVSWV9ISUdIIFwKKyAgR1BJT19PU1BFRURSX09TUEVFRDAgLyohPCBTZWxlY3QgSS9PIGhpZ2ggb3V0cHV0IHNwZWVkICAgKi8KKy8qKgorICogQH0KKyAqLworI2RlZmluZSBMTF9HUElPX1NQRUVEX0xPVyBMTF9HUElPX1NQRUVEX0ZSRVFfTE9XCisjZGVmaW5lIExMX0dQSU9fU1BFRURfTUVESVVNIExMX0dQSU9fU1BFRURfRlJFUV9NRURJVU0KKyNkZWZpbmUgTExfR1BJT19TUEVFRF9GQVNUIExMX0dQSU9fU1BFRURfRlJFUV9ISUdICisjZGVmaW5lIExMX0dQSU9fU1BFRURfSElHSCBMTF9HUElPX1NQRUVEX0ZSRVFfVkVSWV9ISUdICisKKy8qKiBAZGVmZ3JvdXAgR1BJT19MTF9FQ19QVUxMIFB1bGwgVXAgUHVsbCBEb3duCisgKiBAeworICovCisjZGVmaW5lIExMX0dQSU9fUFVMTF9OTyAoMHgwMDAwMDAwMFUpICAgICAgICAvKiE8IFNlbGVjdCBJL08gbm8gcHVsbCAqLworI2RlZmluZSBMTF9HUElPX1BVTExfVVAgR1BJT19QVVBEUl9QVVBEMF8wICAgLyohPCBTZWxlY3QgSS9PIHB1bGwgdXAgKi8KKyNkZWZpbmUgTExfR1BJT19QVUxMX0RPV04gR1BJT19QVVBEUl9QVVBEMF8xIC8qITwgU2VsZWN0IEkvTyBwdWxsIGRvd24gKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEdQSU9fTExfRUNfQUYgQWx0ZXJuYXRlIEZ1bmN0aW9uCisgKiBAeworICovCisjZGVmaW5lIExMX0dQSU9fQUZfMCAoMHgwMDAwMDAwVSkgIC8qITwgU2VsZWN0IGFsdGVybmF0ZSBmdW5jdGlvbiAwICovCisjZGVmaW5lIExMX0dQSU9fQUZfMSAoMHgwMDAwMDAxVSkgIC8qITwgU2VsZWN0IGFsdGVybmF0ZSBmdW5jdGlvbiAxICovCisjZGVmaW5lIExMX0dQSU9fQUZfMiAoMHgwMDAwMDAyVSkgIC8qITwgU2VsZWN0IGFsdGVybmF0ZSBmdW5jdGlvbiAyICovCisjZGVmaW5lIExMX0dQSU9fQUZfMyAoMHgwMDAwMDAzVSkgIC8qITwgU2VsZWN0IGFsdGVybmF0ZSBmdW5jdGlvbiAzICovCisjZGVmaW5lIExMX0dQSU9fQUZfNCAoMHgwMDAwMDA0VSkgIC8qITwgU2VsZWN0IGFsdGVybmF0ZSBmdW5jdGlvbiA0ICovCisjZGVmaW5lIExMX0dQSU9fQUZfNSAoMHgwMDAwMDA1VSkgIC8qITwgU2VsZWN0IGFsdGVybmF0ZSBmdW5jdGlvbiA1ICovCisjZGVmaW5lIExMX0dQSU9fQUZfNiAoMHgwMDAwMDA2VSkgIC8qITwgU2VsZWN0IGFsdGVybmF0ZSBmdW5jdGlvbiA2ICovCisjZGVmaW5lIExMX0dQSU9fQUZfNyAoMHgwMDAwMDA3VSkgIC8qITwgU2VsZWN0IGFsdGVybmF0ZSBmdW5jdGlvbiA3ICovCisjZGVmaW5lIExMX0dQSU9fQUZfOCAoMHgwMDAwMDA4VSkgIC8qITwgU2VsZWN0IGFsdGVybmF0ZSBmdW5jdGlvbiA4ICovCisjZGVmaW5lIExMX0dQSU9fQUZfOSAoMHgwMDAwMDA5VSkgIC8qITwgU2VsZWN0IGFsdGVybmF0ZSBmdW5jdGlvbiA5ICovCisjZGVmaW5lIExMX0dQSU9fQUZfMTAgKDB4MDAwMDAwQVUpIC8qITwgU2VsZWN0IGFsdGVybmF0ZSBmdW5jdGlvbiAxMCAqLworI2RlZmluZSBMTF9HUElPX0FGXzExICgweDAwMDAwMEJVKSAvKiE8IFNlbGVjdCBhbHRlcm5hdGUgZnVuY3Rpb24gMTEgKi8KKyNkZWZpbmUgTExfR1BJT19BRl8xMiAoMHgwMDAwMDBDVSkgLyohPCBTZWxlY3QgYWx0ZXJuYXRlIGZ1bmN0aW9uIDEyICovCisjZGVmaW5lIExMX0dQSU9fQUZfMTMgKDB4MDAwMDAwRFUpIC8qITwgU2VsZWN0IGFsdGVybmF0ZSBmdW5jdGlvbiAxMyAqLworI2RlZmluZSBMTF9HUElPX0FGXzE0ICgweDAwMDAwMEVVKSAvKiE8IFNlbGVjdCBhbHRlcm5hdGUgZnVuY3Rpb24gMTQgKi8KKyNkZWZpbmUgTExfR1BJT19BRl8xNSAoMHgwMDAwMDBGVSkgLyohPCBTZWxlY3QgYWx0ZXJuYXRlIGZ1bmN0aW9uIDE1ICovCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEdQSU9fTExfRXhwb3J0ZWRfTWFjcm9zIEdQSU8gRXhwb3J0ZWQgTWFjcm9zCisgKiBAeworICovCisKKy8qKiBAZGVmZ3JvdXAgR1BJT19MTF9FTV9XUklURV9SRUFEIENvbW1vbiBXcml0ZSBhbmQgcmVhZCByZWdpc3RlcnMgTWFjcm9zCisgKiBAeworICovCisKKy8qKgorICogQGJyaWVmICBXcml0ZSBhIHZhbHVlIGluIEdQSU8gcmVnaXN0ZXIKKyAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIEdQSU8gSW5zdGFuY2UKKyAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSB3cml0dGVuCisgKiBAcGFyYW0gIF9fVkFMVUVfXyBWYWx1ZSB0byBiZSB3cml0dGVuIGluIHRoZSByZWdpc3RlcgorICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgTExfR1BJT19Xcml0ZVJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18sIF9fVkFMVUVfXykgXAorICBXUklURV9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fLCAoX19WQUxVRV9fKSkKKworLyoqCisgKiBAYnJpZWYgIFJlYWQgYSB2YWx1ZSBpbiBHUElPIHJlZ2lzdGVyCisgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBHUElPIEluc3RhbmNlCisgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgcmVhZAorICogQHJldHZhbCBSZWdpc3RlciB2YWx1ZQorICovCisjZGVmaW5lIExMX0dQSU9fUmVhZFJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18pIFJFQURfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXykKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgR1BJT19MTF9FeHBvcnRlZF9GdW5jdGlvbnMgR1BJTyBFeHBvcnRlZCBGdW5jdGlvbnMKKyAqIEB7CisgKi8KKworLyoqIEBkZWZncm91cCBHUElPX0xMX0VGX1BvcnRfQ29uZmlndXJhdGlvbiBQb3J0IENvbmZpZ3VyYXRpb24KKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgIENvbmZpZ3VyZSBncGlvIG1vZGUgZm9yIGEgZGVkaWNhdGVkIHBpbiBvbiBkZWRpY2F0ZWQgcG9ydC4KKyAqIEBub3RlICAgSS9PIG1vZGUgY2FuIGJlIElucHV0IG1vZGUsIEdlbmVyYWwgcHVycG9zZSBvdXRwdXQsIEFsdGVybmF0ZQorICogZnVuY3Rpb24gbW9kZSBvciBBbmFsb2cuCisgKiBAbm90ZSAgIFdhcm5pbmc6IG9ubHkgb25lIHBpbiBjYW4gYmUgcGFzc2VkIGFzIHBhcmFtZXRlci4KKyAqIEBybXRvbGwgTU9ERVIgICAgICAgIE1PREV5ICAgICAgICAgTExfR1BJT19TZXRQaW5Nb2RlCisgKiBAcGFyYW0gIEdQSU94IEdQSU8gUG9ydAorICogQHBhcmFtICBQaW4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMQorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNAorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTUKKyAqIEBwYXJhbSAgTW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19NT0RFX0lOUFVUCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX01PREVfT1VUUFVUCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX01PREVfQUxURVJOQVRFCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX01PREVfQU5BTE9HCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfR1BJT19TZXRQaW5Nb2RlKEdQSU9fVHlwZURlZiAqR1BJT3gsIHVpbnQzMl90IFBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBNb2RlKSB7CisgIE1PRElGWV9SRUcoR1BJT3gtPk1PREVSLCAoR1BJT19NT0RFUl9NT0RFMCA8PCAoUE9TSVRJT05fVkFMKFBpbikgKiAyVSkpLAorICAgICAgICAgICAgIChNb2RlIDw8IChQT1NJVElPTl9WQUwoUGluKSAqIDJVKSkpOworfQorCisvKioKKyAqIEBicmllZiAgUmV0dXJuIGdwaW8gbW9kZSBmb3IgYSBkZWRpY2F0ZWQgcGluIG9uIGRlZGljYXRlZCBwb3J0LgorICogQG5vdGUgICBJL08gbW9kZSBjYW4gYmUgSW5wdXQgbW9kZSwgR2VuZXJhbCBwdXJwb3NlIG91dHB1dCwgQWx0ZXJuYXRlCisgKiBmdW5jdGlvbiBtb2RlIG9yIEFuYWxvZy4KKyAqIEBub3RlICAgV2FybmluZzogb25seSBvbmUgcGluIGNhbiBiZSBwYXNzZWQgYXMgcGFyYW1ldGVyLgorICogQHJtdG9sbCBNT0RFUiAgICAgICAgTU9ERXkgICAgICAgICBMTF9HUElPX0dldFBpbk1vZGUKKyAqIEBwYXJhbSAgR1BJT3ggR1BJTyBQb3J0CisgKiBAcGFyYW0gIFBpbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMAorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMQorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMgorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMworICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNAorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNQorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNgorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNworICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOAorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOQorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzExCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMgorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNQorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19NT0RFX0lOUFVUCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX01PREVfT1VUUFVUCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX01PREVfQUxURVJOQVRFCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX01PREVfQU5BTE9HCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9HUElPX0dldFBpbk1vZGUoR1BJT19UeXBlRGVmICpHUElPeCwgdWludDMyX3QgUGluKSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEdQSU94LT5NT0RFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEdQSU9fTU9ERVJfTU9ERTAgPDwgKFBPU0lUSU9OX1ZBTChQaW4pICogMlUpKSkgPj4KKyAgICAgICAgICAgICAgICAgICAgKFBPU0lUSU9OX1ZBTChQaW4pICogMlUpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENvbmZpZ3VyZSBncGlvIG91dHB1dCB0eXBlIGZvciBzZXZlcmFsIHBpbnMgb24gZGVkaWNhdGVkIHBvcnQuCisgKiBAbm90ZSAgIE91dHB1dCB0eXBlIGFzIHRvIGJlIHNldCB3aGVuIGdwaW8gcGluIGlzIGluIG91dHB1dCBvcgorICogICAgICAgICBhbHRlcm5hdGUgbW9kZXMuIFBvc3NpYmxlIHR5cGUgYXJlIFB1c2gtcHVsbCBvciBPcGVuLWRyYWluLgorICogQHJtdG9sbCBPVFlQRVIgICAgICAgT1R5ICAgICAgICAgICBMTF9HUElPX1NldFBpbk91dHB1dFR5cGUKKyAqIEBwYXJhbSAgR1BJT3ggR1BJTyBQb3J0CisgKiBAcGFyYW0gIFBpbk1hc2sgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8wCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8zCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl80CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl81CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl82CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl83CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl84CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl85CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMAorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMworICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE1CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl9BTEwKKyAqIEBwYXJhbSAgT3V0cHV0VHlwZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19PVVRQVVRfUFVTSFBVTEwKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fT1VUUFVUX09QRU5EUkFJTgorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0dQSU9fU2V0UGluT3V0cHV0VHlwZShHUElPX1R5cGVEZWYgKkdQSU94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFBpbk1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgT3V0cHV0VHlwZSkgeworICBNT0RJRllfUkVHKEdQSU94LT5PVFlQRVIsIFBpbk1hc2ssIChQaW5NYXNrICogT3V0cHV0VHlwZSkpOworfQorCisvKioKKyAqIEBicmllZiAgUmV0dXJuIGdwaW8gb3V0cHV0IHR5cGUgZm9yIHNldmVyYWwgcGlucyBvbiBkZWRpY2F0ZWQgcG9ydC4KKyAqIEBub3RlICAgT3V0cHV0IHR5cGUgYXMgdG8gYmUgc2V0IHdoZW4gZ3BpbyBwaW4gaXMgaW4gb3V0cHV0IG9yCisgKiAgICAgICAgIGFsdGVybmF0ZSBtb2Rlcy4gUG9zc2libGUgdHlwZSBhcmUgUHVzaC1wdWxsIG9yIE9wZW4tZHJhaW4uCisgKiBAbm90ZSAgIFdhcm5pbmc6IG9ubHkgb25lIHBpbiBjYW4gYmUgcGFzc2VkIGFzIHBhcmFtZXRlci4KKyAqIEBybXRvbGwgT1RZUEVSICAgICAgIE9UeSAgICAgICAgICAgTExfR1BJT19HZXRQaW5PdXRwdXRUeXBlCisgKiBAcGFyYW0gIEdQSU94IEdQSU8gUG9ydAorICogQHBhcmFtICBQaW4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMQorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNAorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOX0FMTAorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19PVVRQVVRfUFVTSFBVTEwKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fT1VUUFVUX09QRU5EUkFJTgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfR1BJT19HZXRQaW5PdXRwdXRUeXBlKEdQSU9fVHlwZURlZiAqR1BJT3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFBpbikgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChHUElPeC0+T1RZUEVSLCBQaW4pID4+IFBPU0lUSU9OX1ZBTChQaW4pKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENvbmZpZ3VyZSBncGlvIHNwZWVkIGZvciBhIGRlZGljYXRlZCBwaW4gb24gZGVkaWNhdGVkIHBvcnQuCisgKiBAbm90ZSAgIEkvTyBzcGVlZCBjYW4gYmUgTG93LCBNZWRpdW0sIEZhc3Qgb3IgSGlnaCBzcGVlZC4KKyAqIEBub3RlICAgV2FybmluZzogb25seSBvbmUgcGluIGNhbiBiZSBwYXNzZWQgYXMgcGFyYW1ldGVyLgorICogQG5vdGUgICBSZWZlciB0byBkYXRhc2hlZXQgZm9yIGZyZXF1ZW5jeSBzcGVjaWZpY2F0aW9ucyBhbmQgdGhlIHBvd2VyCisgKiAgICAgICAgIHN1cHBseSBhbmQgbG9hZCBjb25kaXRpb25zIGZvciBlYWNoIHNwZWVkLgorICogQHJtdG9sbCBPU1BFRURSICAgICAgT1NQRUVEeSAgICAgICBMTF9HUElPX1NldFBpblNwZWVkCisgKiBAcGFyYW0gIEdQSU94IEdQSU8gUG9ydAorICogQHBhcmFtICBQaW4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMQorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNAorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTUKKyAqIEBwYXJhbSAgU3BlZWQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fU1BFRURfRlJFUV9MT1cKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fU1BFRURfRlJFUV9NRURJVU0KKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fU1BFRURfRlJFUV9ISUdICisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1NQRUVEX0ZSRVFfVkVSWV9ISUdICisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfR1BJT19TZXRQaW5TcGVlZChHUElPX1R5cGVEZWYgKkdQSU94LCB1aW50MzJfdCBQaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFNwZWVkKSB7CisgIE1PRElGWV9SRUcoR1BJT3gtPk9TUEVFRFIsIChHUElPX09TUEVFRFJfT1NQRUVEMCA8PCAoUE9TSVRJT05fVkFMKFBpbikgKiAyVSkpLAorICAgICAgICAgICAgIChTcGVlZCA8PCAoUE9TSVRJT05fVkFMKFBpbikgKiAyVSkpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFJldHVybiBncGlvIHNwZWVkIGZvciBhIGRlZGljYXRlZCBwaW4gb24gZGVkaWNhdGVkIHBvcnQuCisgKiBAbm90ZSAgIEkvTyBzcGVlZCBjYW4gYmUgTG93LCBNZWRpdW0sIEZhc3Qgb3IgSGlnaCBzcGVlZC4KKyAqIEBub3RlICAgV2FybmluZzogb25seSBvbmUgcGluIGNhbiBiZSBwYXNzZWQgYXMgcGFyYW1ldGVyLgorICogQG5vdGUgICBSZWZlciB0byBkYXRhc2hlZXQgZm9yIGZyZXF1ZW5jeSBzcGVjaWZpY2F0aW9ucyBhbmQgdGhlIHBvd2VyCisgKiAgICAgICAgIHN1cHBseSBhbmQgbG9hZCBjb25kaXRpb25zIGZvciBlYWNoIHNwZWVkLgorICogQHJtdG9sbCBPU1BFRURSICAgICAgT1NQRUVEeSAgICAgICBMTF9HUElPX0dldFBpblNwZWVkCisgKiBAcGFyYW0gIEdQSU94IEdQSU8gUG9ydAorICogQHBhcmFtICBQaW4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMQorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNAorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTUKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fU1BFRURfRlJFUV9MT1cKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fU1BFRURfRlJFUV9NRURJVU0KKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fU1BFRURfRlJFUV9ISUdICisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1NQRUVEX0ZSRVFfVkVSWV9ISUdICisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9HUElPX0dldFBpblNwZWVkKEdQSU9fVHlwZURlZiAqR1BJT3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQaW4pIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoR1BJT3gtPk9TUEVFRFIsIChHUElPX09TUEVFRFJfT1NQRUVEMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IChQT1NJVElPTl9WQUwoUGluKSAqIDJVKSkpID4+CisgICAgICAgICAgICAgICAgICAgIChQT1NJVElPTl9WQUwoUGluKSAqIDJVKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBDb25maWd1cmUgZ3BpbyBwdWxsLXVwIG9yIHB1bGwtZG93biBmb3IgYSBkZWRpY2F0ZWQgcGluIG9uIGEKKyAqIGRlZGljYXRlZCBwb3J0LgorICogQG5vdGUgICBXYXJuaW5nOiBvbmx5IG9uZSBwaW4gY2FuIGJlIHBhc3NlZCBhcyBwYXJhbWV0ZXIuCisgKiBAcm10b2xsIFBVUERSICAgICAgICBQVVBEeSAgICAgICAgIExMX0dQSU9fU2V0UGluUHVsbAorICogQHBhcmFtICBHUElPeCBHUElPIFBvcnQKKyAqIEBwYXJhbSAgUGluIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8wCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8zCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl80CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl81CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl82CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl83CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl84CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl85CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMAorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMworICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE1CisgKiBAcGFyYW0gIFB1bGwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUFVMTF9OTworICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QVUxMX1VQCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BVTExfRE9XTgorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0dQSU9fU2V0UGluUHVsbChHUElPX1R5cGVEZWYgKkdQSU94LCB1aW50MzJfdCBQaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUHVsbCkgeworICBNT0RJRllfUkVHKEdQSU94LT5QVVBEUiwgKEdQSU9fUFVQRFJfUFVQRDAgPDwgKFBPU0lUSU9OX1ZBTChQaW4pICogMlUpKSwKKyAgICAgICAgICAgICAoUHVsbCA8PCAoUE9TSVRJT05fVkFMKFBpbikgKiAyVSkpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFJldHVybiBncGlvIHB1bGwtdXAgb3IgcHVsbC1kb3duIGZvciBhIGRlZGljYXRlZCBwaW4gb24gYSBkZWRpY2F0ZWQKKyAqIHBvcnQKKyAqIEBub3RlICAgV2FybmluZzogb25seSBvbmUgcGluIGNhbiBiZSBwYXNzZWQgYXMgcGFyYW1ldGVyLgorICogQHJtdG9sbCBQVVBEUiAgICAgICAgUFVQRHkgICAgICAgICBMTF9HUElPX0dldFBpblB1bGwKKyAqIEBwYXJhbSAgR1BJT3ggR1BJTyBQb3J0CisgKiBAcGFyYW0gIFBpbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMAorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMQorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMgorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMworICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNAorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNQorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNgorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNworICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOAorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOQorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzExCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMgorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNQorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QVUxMX05PCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BVTExfVVAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUFVMTF9ET1dOCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9HUElPX0dldFBpblB1bGwoR1BJT19UeXBlRGVmICpHUElPeCwgdWludDMyX3QgUGluKSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEdQSU94LT5QVVBEUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEdQSU9fUFVQRFJfUFVQRDAgPDwgKFBPU0lUSU9OX1ZBTChQaW4pICogMlUpKSkgPj4KKyAgICAgICAgICAgICAgICAgICAgKFBPU0lUSU9OX1ZBTChQaW4pICogMlUpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENvbmZpZ3VyZSBncGlvIGFsdGVybmF0ZSBmdW5jdGlvbiBvZiBhIGRlZGljYXRlZCBwaW4gZnJvbSAwIHRvIDcgZm9yCisgKiBhIGRlZGljYXRlZCBwb3J0LgorICogQG5vdGUgICBQb3NzaWJsZSB2YWx1ZXMgYXJlIGZyb20gQUYwIHRvIEFGMTUgZGVwZW5kaW5nIG9uIHRhcmdldC4KKyAqIEBub3RlICAgV2FybmluZzogb25seSBvbmUgcGluIGNhbiBiZSBwYXNzZWQgYXMgcGFyYW1ldGVyLgorICogQHJtdG9sbCBBRlJMICAgICAgICAgQUZTRUx5ICAgICAgICBMTF9HUElPX1NldEFGUGluXzBfNworICogQHBhcmFtICBHUElPeCBHUElPIFBvcnQKKyAqIEBwYXJhbSAgUGluIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8wCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8zCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl80CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl81CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl82CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl83CisgKiBAcGFyYW0gIEFsdGVybmF0ZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8wCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMgorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8zCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfNQorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl82CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfOAorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl85CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzEwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzExCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzEyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzEzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzE0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzE1CisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfR1BJT19TZXRBRlBpbl8wXzcoR1BJT19UeXBlRGVmICpHUElPeCwgdWludDMyX3QgUGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQWx0ZXJuYXRlKSB7CisgIE1PRElGWV9SRUcoR1BJT3gtPkFGUlswXSwgKEdQSU9fQUZSTF9BRlNFTDAgPDwgKFBPU0lUSU9OX1ZBTChQaW4pICogNFUpKSwKKyAgICAgICAgICAgICAoQWx0ZXJuYXRlIDw8IChQT1NJVElPTl9WQUwoUGluKSAqIDRVKSkpOworfQorCisvKioKKyAqIEBicmllZiAgUmV0dXJuIGdwaW8gYWx0ZXJuYXRlIGZ1bmN0aW9uIG9mIGEgZGVkaWNhdGVkIHBpbiBmcm9tIDAgdG8gNyBmb3IgYQorICogZGVkaWNhdGVkIHBvcnQuCisgKiBAcm10b2xsIEFGUkwgICAgICAgICBBRlNFTHkgICAgICAgIExMX0dQSU9fR2V0QUZQaW5fMF83CisgKiBAcGFyYW0gIEdQSU94IEdQSU8gUG9ydAorICogQHBhcmFtICBQaW4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzcKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMAorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMworICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl80CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfNgorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl83CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfOQorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8xMAorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8xMQorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8xMgorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8xMworICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8xNAorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8xNQorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfR1BJT19HZXRBRlBpbl8wXzcoR1BJT19UeXBlRGVmICpHUElPeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQaW4pIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoR1BJT3gtPkFGUlswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEdQSU9fQUZSTF9BRlNFTDAgPDwgKFBPU0lUSU9OX1ZBTChQaW4pICogNFUpKSkgPj4KKyAgICAgICAgICAgICAgICAgICAgKFBPU0lUSU9OX1ZBTChQaW4pICogNFUpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENvbmZpZ3VyZSBncGlvIGFsdGVybmF0ZSBmdW5jdGlvbiBvZiBhIGRlZGljYXRlZCBwaW4gZnJvbSA4IHRvIDE1IGZvcgorICogYSBkZWRpY2F0ZWQgcG9ydC4KKyAqIEBub3RlICAgUG9zc2libGUgdmFsdWVzIGFyZSBmcm9tIEFGMCB0byBBRjE1IGRlcGVuZGluZyBvbiB0YXJnZXQuCisgKiBAbm90ZSAgIFdhcm5pbmc6IG9ubHkgb25lIHBpbiBjYW4gYmUgcGFzc2VkIGFzIHBhcmFtZXRlci4KKyAqIEBybXRvbGwgQUZSSCAgICAgICAgIEFGU0VMeSAgICAgICAgTExfR1BJT19TZXRBRlBpbl84XzE1CisgKiBAcGFyYW0gIEdQSU94IEdQSU8gUG9ydAorICogQHBhcmFtICBQaW4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMQorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNAorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTUKKyAqIEBwYXJhbSAgQWx0ZXJuYXRlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMQorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfNAorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl81CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfNworICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl84CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMTAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMTEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMTIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMTMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMTQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMTUKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9HUElPX1NldEFGUGluXzhfMTUoR1BJT19UeXBlRGVmICpHUElPeCwgdWludDMyX3QgUGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEFsdGVybmF0ZSkgeworICBNT0RJRllfUkVHKEdQSU94LT5BRlJbMV0sCisgICAgICAgICAgICAgKEdQSU9fQUZSSF9BRlNFTDggPDwgKFBPU0lUSU9OX1ZBTChQaW4gPj4gOFUpICogNFUpKSwKKyAgICAgICAgICAgICAoQWx0ZXJuYXRlIDw8IChQT1NJVElPTl9WQUwoUGluID4+IDhVKSAqIDRVKSkpOworfQorCisvKioKKyAqIEBicmllZiAgUmV0dXJuIGdwaW8gYWx0ZXJuYXRlIGZ1bmN0aW9uIG9mIGEgZGVkaWNhdGVkIHBpbiBmcm9tIDggdG8gMTUgZm9yIGEKKyAqIGRlZGljYXRlZCBwb3J0LgorICogQG5vdGUgICBQb3NzaWJsZSB2YWx1ZXMgYXJlIGZyb20gQUYwIHRvIEFGMTUgZGVwZW5kaW5nIG9uIHRhcmdldC4KKyAqIEBybXRvbGwgQUZSSCAgICAgICAgIEFGU0VMeSAgICAgICAgTExfR1BJT19HZXRBRlBpbl84XzE1CisgKiBAcGFyYW0gIEdQSU94IEdQSU8gUG9ydAorICogQHBhcmFtICBQaW4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMQorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNAorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTUKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMAorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMworICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl80CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfNgorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl83CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfOQorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8xMAorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8xMQorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8xMgorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8xMworICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8xNAorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8xNQorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfR1BJT19HZXRBRlBpbl84XzE1KEdQSU9fVHlwZURlZiAqR1BJT3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFBpbikgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVCgKKyAgICAgICAgICAgICAgICAgICAgICAgIEdQSU94LT5BRlJbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAoR1BJT19BRlJIX0FGU0VMOCA8PCAoUE9TSVRJT05fVkFMKFBpbiA+PiA4VSkgKiA0VSkpKSA+PgorICAgICAgICAgICAgICAgICAgICAoUE9TSVRJT05fVkFMKFBpbiA+PiA4VSkgKiA0VSkpOworfQorCisvKioKKyAqIEBicmllZiAgTG9jayBjb25maWd1cmF0aW9uIG9mIHNldmVyYWwgcGlucyBmb3IgYSBkZWRpY2F0ZWQgcG9ydC4KKyAqIEBub3RlICAgV2hlbiB0aGUgbG9jayBzZXF1ZW5jZSBoYXMgYmVlbiBhcHBsaWVkIG9uIGEgcG9ydCBiaXQsIHRoZQorICogICAgICAgICB2YWx1ZSBvZiB0aGlzIHBvcnQgYml0IGNhbiBubyBsb25nZXIgYmUgbW9kaWZpZWQgdW50aWwgdGhlCisgKiAgICAgICAgIG5leHQgcmVzZXQuCisgKiBAbm90ZSAgIEVhY2ggbG9jayBiaXQgZnJlZXplcyBhIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIKKyAqICAgICAgICAgKGNvbnRyb2wgYW5kIGFsdGVybmF0ZSBmdW5jdGlvbiByZWdpc3RlcnMpLgorICogQHJtdG9sbCBMQ0tSICAgICAgICAgTENLSyAgICAgICAgICBMTF9HUElPX0xvY2tQaW4KKyAqIEBwYXJhbSAgR1BJT3ggR1BJTyBQb3J0CisgKiBAcGFyYW0gIFBpbk1hc2sgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8wCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8zCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl80CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl81CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl82CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl83CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl84CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl85CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMAorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMworICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE1CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl9BTEwKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9HUElPX0xvY2tQaW4oR1BJT19UeXBlRGVmICpHUElPeCwgdWludDMyX3QgUGluTWFzaykgeworICBfX0lPIHVpbnQzMl90IHRlbXA7CisgIFdSSVRFX1JFRyhHUElPeC0+TENLUiwgR1BJT19MQ0tSX0xDS0sgfCBQaW5NYXNrKTsKKyAgV1JJVEVfUkVHKEdQSU94LT5MQ0tSLCBQaW5NYXNrKTsKKyAgV1JJVEVfUkVHKEdQSU94LT5MQ0tSLCBHUElPX0xDS1JfTENLSyB8IFBpbk1hc2spOworICAvKiBSZWFkIExDS1IgcmVnaXN0ZXIuIFRoaXMgcmVhZCBpcyBtYW5kYXRvcnkgdG8gY29tcGxldGUga2V5IGxvY2sgc2VxdWVuY2UgKi8KKyAgdGVtcCA9IFJFQURfUkVHKEdQSU94LT5MQ0tSKTsKKyAgKHZvaWQpdGVtcDsKK30KKworLyoqCisgKiBAYnJpZWYgIFJldHVybiAxIGlmIGFsbCBwaW5zIHBhc3NlZCBhcyBwYXJhbWV0ZXIsIG9mIGEgZGVkaWNhdGVkIHBvcnQsIGFyZQorICogbG9ja2VkLiBlbHNlIFJldHVybiAwLgorICogQHJtdG9sbCBMQ0tSICAgICAgICAgTENLeSAgICAgICAgICBMTF9HUElPX0lzUGluTG9ja2VkCisgKiBAcGFyYW0gIEdQSU94IEdQSU8gUG9ydAorICogQHBhcmFtICBQaW5NYXNrIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMAorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMQorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMgorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMworICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNAorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNQorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNgorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNworICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOAorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOQorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzExCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMgorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNQorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fQUxMCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0dQSU9fSXNQaW5Mb2NrZWQoR1BJT19UeXBlRGVmICpHUElPeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFBpbk1hc2spIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoR1BJT3gtPkxDS1IsIFBpbk1hc2spID09IChQaW5NYXNrKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgUmV0dXJuIDEgaWYgb25lIG9mIHRoZSBwaW4gb2YgYSBkZWRpY2F0ZWQgcG9ydCBpcyBsb2NrZWQuIGVsc2UgcmV0dXJuCisgKiAwLgorICogQHJtdG9sbCBMQ0tSICAgICAgICAgTENLSyAgICAgICAgICBMTF9HUElPX0lzQW55UGluTG9ja2VkCisgKiBAcGFyYW0gIEdQSU94IEdQSU8gUG9ydAorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9HUElPX0lzQW55UGluTG9ja2VkKEdQSU9fVHlwZURlZiAqR1BJT3gpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoR1BJT3gtPkxDS1IsIEdQSU9fTENLUl9MQ0tLKSA9PSAoR1BJT19MQ0tSX0xDS0spKSA/IDFVTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgR1BJT19MTF9FRl9EYXRhX0FjY2VzcyBEYXRhIEFjY2VzcworICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiAgUmV0dXJuIGZ1bGwgaW5wdXQgZGF0YSByZWdpc3RlciB2YWx1ZSBmb3IgYSBkZWRpY2F0ZWQgcG9ydC4KKyAqIEBybXRvbGwgSURSICAgICAgICAgIElEeSAgICAgICAgICAgTExfR1BJT19SZWFkSW5wdXRQb3J0CisgKiBAcGFyYW0gIEdQSU94IEdQSU8gUG9ydAorICogQHJldHZhbCBJbnB1dCBkYXRhIHJlZ2lzdGVyIHZhbHVlIG9mIHBvcnQKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0dQSU9fUmVhZElucHV0UG9ydChHUElPX1R5cGVEZWYgKkdQSU94KSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfUkVHKEdQSU94LT5JRFIpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFJldHVybiBpZiBpbnB1dCBkYXRhIGxldmVsIGZvciBzZXZlcmFsIHBpbnMgb2YgZGVkaWNhdGVkIHBvcnQgaXMgaGlnaAorICogb3IgbG93LgorICogQHJtdG9sbCBJRFIgICAgICAgICAgSUR5ICAgICAgICAgICBMTF9HUElPX0lzSW5wdXRQaW5TZXQKKyAqIEBwYXJhbSAgR1BJT3ggR1BJTyBQb3J0CisgKiBAcGFyYW0gIFBpbk1hc2sgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8wCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8zCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl80CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl81CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl82CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl83CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl84CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl85CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMAorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMworICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE1CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl9BTEwKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfR1BJT19Jc0lucHV0UGluU2V0KEdQSU9fVHlwZURlZiAqR1BJT3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFBpbk1hc2spIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoR1BJT3gtPklEUiwgUGluTWFzaykgPT0gKFBpbk1hc2spKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBXcml0ZSBvdXRwdXQgZGF0YSByZWdpc3RlciBmb3IgdGhlIHBvcnQuCisgKiBAcm10b2xsIE9EUiAgICAgICAgICBPRHkgICAgICAgICAgIExMX0dQSU9fV3JpdGVPdXRwdXRQb3J0CisgKiBAcGFyYW0gIEdQSU94IEdQSU8gUG9ydAorICogQHBhcmFtICBQb3J0VmFsdWUgTGV2ZWwgdmFsdWUgZm9yIGVhY2ggcGluIG9mIHRoZSBwb3J0CisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfR1BJT19Xcml0ZU91dHB1dFBvcnQoR1BJT19UeXBlRGVmICpHUElPeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFBvcnRWYWx1ZSkgeworICBXUklURV9SRUcoR1BJT3gtPk9EUiwgUG9ydFZhbHVlKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFJldHVybiBmdWxsIG91dHB1dCBkYXRhIHJlZ2lzdGVyIHZhbHVlIGZvciBhIGRlZGljYXRlZCBwb3J0LgorICogQHJtdG9sbCBPRFIgICAgICAgICAgT0R5ICAgICAgICAgICBMTF9HUElPX1JlYWRPdXRwdXRQb3J0CisgKiBAcGFyYW0gIEdQSU94IEdQSU8gUG9ydAorICogQHJldHZhbCBPdXRwdXQgZGF0YSByZWdpc3RlciB2YWx1ZSBvZiBwb3J0CisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9HUElPX1JlYWRPdXRwdXRQb3J0KEdQSU9fVHlwZURlZiAqR1BJT3gpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9SRUcoR1BJT3gtPk9EUikpOworfQorCisvKioKKyAqIEBicmllZiAgUmV0dXJuIGlmIGlucHV0IGRhdGEgbGV2ZWwgZm9yIHNldmVyYWwgcGlucyBvZiBkZWRpY2F0ZWQgcG9ydCBpcyBoaWdoCisgKiBvciBsb3cuCisgKiBAcm10b2xsIE9EUiAgICAgICAgICBPRHkgICAgICAgICAgIExMX0dQSU9fSXNPdXRwdXRQaW5TZXQKKyAqIEBwYXJhbSAgR1BJT3ggR1BJTyBQb3J0CisgKiBAcGFyYW0gIFBpbk1hc2sgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8wCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8zCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl80CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl81CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl82CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl83CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl84CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl85CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMAorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMworICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE1CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl9BTEwKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfR1BJT19Jc091dHB1dFBpblNldChHUElPX1R5cGVEZWYgKkdQSU94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUGluTWFzaykgeworICByZXR1cm4gKChSRUFEX0JJVChHUElPeC0+T0RSLCBQaW5NYXNrKSA9PSAoUGluTWFzaykpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFNldCBzZXZlcmFsIHBpbnMgdG8gaGlnaCBsZXZlbCBvbiBkZWRpY2F0ZWQgZ3BpbyBwb3J0LgorICogQHJtdG9sbCBCU1JSICAgICAgICAgQlN5ICAgICAgICAgICBMTF9HUElPX1NldE91dHB1dFBpbgorICogQHBhcmFtICBHUElPeCBHUElPIFBvcnQKKyAqIEBwYXJhbSAgUGluTWFzayBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMQorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNAorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOX0FMTAorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0dQSU9fU2V0T3V0cHV0UGluKEdQSU9fVHlwZURlZiAqR1BJT3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQaW5NYXNrKSB7CisgIFdSSVRFX1JFRyhHUElPeC0+QlNSUiwgUGluTWFzayk7Cit9CisKKy8qKgorICogQGJyaWVmICBTZXQgc2V2ZXJhbCBwaW5zIHRvIGxvdyBsZXZlbCBvbiBkZWRpY2F0ZWQgZ3BpbyBwb3J0LgorICogQHJtdG9sbCBCUlIgICAgICAgICAgQlJ5ICAgICAgICAgICBMTF9HUElPX1Jlc2V0T3V0cHV0UGluCisgKiBAcGFyYW0gIEdQSU94IEdQSU8gUG9ydAorICogQHBhcmFtICBQaW5NYXNrIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMAorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMQorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMgorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMworICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNAorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNQorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNgorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNworICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOAorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOQorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzExCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMgorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNQorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fQUxMCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfR1BJT19SZXNldE91dHB1dFBpbihHUElPX1R5cGVEZWYgKkdQSU94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQaW5NYXNrKSB7CisgIFdSSVRFX1JFRyhHUElPeC0+QlJSLCBQaW5NYXNrKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFRvZ2dsZSBkYXRhIHZhbHVlIGZvciBzZXZlcmFsIHBpbiBvZiBkZWRpY2F0ZWQgcG9ydC4KKyAqIEBybXRvbGwgT0RSICAgICAgICAgIE9EeSAgICAgICAgICAgTExfR1BJT19Ub2dnbGVQaW4KKyAqIEBwYXJhbSAgR1BJT3ggR1BJTyBQb3J0CisgKiBAcGFyYW0gIFBpbk1hc2sgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8wCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8zCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl80CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl81CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl82CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl83CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl84CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl85CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMAorICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMworICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE1CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl9BTEwKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9HUElPX1RvZ2dsZVBpbihHUElPX1R5cGVEZWYgKkdQSU94LCB1aW50MzJfdCBQaW5NYXNrKSB7CisgIHVpbnQzMl90IG9kciA9IFJFQURfUkVHKEdQSU94LT5PRFIpOworICBXUklURV9SRUcoR1BJT3gtPkJTUlIsICgob2RyICYgUGluTWFzaykgPDwgMTZ1KSB8ICh+b2RyICYgUGluTWFzaykpOworfQorCisvKioKKyAqIEB9CisgKi8KKworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBHUElPX0xMX0VGX0luaXQgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICogQHsKKyAqLworCitFcnJvclN0YXR1cyBMTF9HUElPX0RlSW5pdChHUElPX1R5cGVEZWYgKkdQSU94KTsKK0Vycm9yU3RhdHVzIExMX0dQSU9fSW5pdChHUElPX1R5cGVEZWYgKkdQSU94LAorICAgICAgICAgICAgICAgICAgICAgICAgIExMX0dQSU9fSW5pdFR5cGVEZWYgKkdQSU9fSW5pdFN0cnVjdCk7Cit2b2lkIExMX0dQSU9fU3RydWN0SW5pdChMTF9HUElPX0luaXRUeXBlRGVmICpHUElPX0luaXRTdHJ1Y3QpOworCisvKioKKyAqIEB9CisgKi8KKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisjZW5kaWYgLyogZGVmaW5lZCAoR1BJT0EpIHx8IGRlZmluZWQgKEdQSU9CKSB8fCBkZWZpbmVkIChHUElPQykgfHwgZGVmaW5lZCBcCisgICAgICAgICAgKEdQSU9EKSB8fCBkZWZpbmVkIChHUElPRSkgfHwgZGVmaW5lZCAoR1BJT0YpIHx8IGRlZmluZWQgKEdQSU9HKSAqLworLyoqCisgKiBAfQorICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMkc0eHhfTExfR1BJT19IICovCmRpZmYgLS1naXQgYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9sbF9pd2RnLmggYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9sbF9pd2RnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFkYjlkMgotLS0gL2Rldi9udWxsCisrKyBiL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9JbmMvc3RtMzJnNHh4X2xsX2l3ZGcuaApAQCAtMCwwICsxLDMzOSBAQAorLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAZmlsZSAgICBzdG0zMmc0eHhfbGxfaXdkZy5oCisgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgSVdERyBMTCBtb2R1bGUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYXR0ZW50aW9uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0ZXJtcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlCisgKiBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb2Z0d2FyZSBjb21wb25lbnQuCisgKiBJZiBubyBMSUNFTlNFIGZpbGUgY29tZXMgd2l0aCB0aGlzIHNvZnR3YXJlLCBpdCBpcyBwcm92aWRlZCBBUy1JUy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJHNHh4X0xMX0lXREdfSAorI2RlZmluZSBTVE0zMkc0eHhfTExfSVdER19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmc0eHguaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzR4eF9MTF9Ecml2ZXIKKyAqIEB7CisgKi8KKworI2lmIGRlZmluZWQoSVdERykKKworLyoqIEBkZWZncm91cCBJV0RHX0xMIElXREcKKyAqIEB7CisgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIElXREdfTExfUHJpdmF0ZV9Db25zdGFudHMgSVdERyBQcml2YXRlIENvbnN0YW50cworICogQHsKKyAqLworI2RlZmluZSBMTF9JV0RHX0tFWV9SRUxPQUQgMHgwMDAwQUFBQVUgLyohPCBJV0RHIFJlbG9hZCBDb3VudGVyIEVuYWJsZSAgICovCisjZGVmaW5lIExMX0lXREdfS0VZX0VOQUJMRSAweDAwMDBDQ0NDVSAvKiE8IElXREcgUGVyaXBoZXJhbCBFbmFibGUgICAgICAgKi8KKyNkZWZpbmUgTExfSVdER19LRVlfV1JfQUNDRVNTX0VOQUJMRSBcCisgIDB4MDAwMDU1NTVVIC8qITwgSVdERyBLUiBXcml0ZSBBY2Nlc3MgRW5hYmxlICAqLworI2RlZmluZSBMTF9JV0RHX0tFWV9XUl9BQ0NFU1NfRElTQUJMRSBcCisgIDB4MDAwMDAwMDBVIC8qITwgSVdERyBLUiBXcml0ZSBBY2Nlc3MgRGlzYWJsZSAqLworLyoqCisgKiBAfQorICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBJV0RHX0xMX0V4cG9ydGVkX0NvbnN0YW50cyBJV0RHIEV4cG9ydGVkIENvbnN0YW50cworICogQHsKKyAqLworCisvKiogQGRlZmdyb3VwIElXREdfTExfRUNfR0VUX0ZMQUcgR2V0IEZsYWdzIERlZmluZXMKKyAqIEBicmllZiAgICBGbGFncyBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfSVdER19SZWFkUmVnIGZ1bmN0aW9uCisgKiBAeworICovCisjZGVmaW5lIExMX0lXREdfU1JfUFZVIElXREdfU1JfUFZVIC8qITwgV2F0Y2hkb2cgcHJlc2NhbGVyIHZhbHVlIHVwZGF0ZSAqLworI2RlZmluZSBMTF9JV0RHX1NSX1JWVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElXREdfU1JfUlZVIC8qITwgV2F0Y2hkb2cgY291bnRlciByZWxvYWQgdmFsdWUgdXBkYXRlIFwKKyAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0lXREdfU1JfV1ZVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSVdER19TUl9XVlUgLyohPCBXYXRjaGRvZyBjb3VudGVyIHdpbmRvdyB2YWx1ZSB1cGRhdGUgXAorICAgICAgICAgICAgICAgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIElXREdfTExfRUNfUFJFU0NBTEVSICBQcmVzY2FsZXIgRGl2aWRlcgorICogQHsKKyAqLworI2RlZmluZSBMTF9JV0RHX1BSRVNDQUxFUl80IDB4MDAwMDAwMDBVICAgICAvKiE8IERpdmlkZXIgYnkgNCAgICovCisjZGVmaW5lIExMX0lXREdfUFJFU0NBTEVSXzggKElXREdfUFJfUFJfMCkgIC8qITwgRGl2aWRlciBieSA4ICAgKi8KKyNkZWZpbmUgTExfSVdER19QUkVTQ0FMRVJfMTYgKElXREdfUFJfUFJfMSkgLyohPCBEaXZpZGVyIGJ5IDE2ICAqLworI2RlZmluZSBMTF9JV0RHX1BSRVNDQUxFUl8zMiBcCisgIChJV0RHX1BSX1BSXzEgfCBJV0RHX1BSX1BSXzApICAgICAgICAgICAgIC8qITwgRGl2aWRlciBieSAzMiAgKi8KKyNkZWZpbmUgTExfSVdER19QUkVTQ0FMRVJfNjQgKElXREdfUFJfUFJfMikgLyohPCBEaXZpZGVyIGJ5IDY0ICAqLworI2RlZmluZSBMTF9JV0RHX1BSRVNDQUxFUl8xMjggXAorICAoSVdER19QUl9QUl8yIHwgSVdER19QUl9QUl8wKSAvKiE8IERpdmlkZXIgYnkgMTI4ICovCisjZGVmaW5lIExMX0lXREdfUFJFU0NBTEVSXzI1NiBcCisgIChJV0RHX1BSX1BSXzIgfCBJV0RHX1BSX1BSXzEpIC8qITwgRGl2aWRlciBieSAyNTYgKi8KKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSVdER19MTF9FeHBvcnRlZF9NYWNyb3MgSVdERyBFeHBvcnRlZCBNYWNyb3MKKyAqIEB7CisgKi8KKworLyoqIEBkZWZncm91cCBJV0RHX0xMX0VNX1dSSVRFX1JFQUQgQ29tbW9uIFdyaXRlIGFuZCByZWFkIHJlZ2lzdGVycyBNYWNyb3MKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgIFdyaXRlIGEgdmFsdWUgaW4gSVdERyByZWdpc3RlcgorICogQHBhcmFtICBfX0lOU1RBTkNFX18gSVdERyBJbnN0YW5jZQorICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHdyaXR0ZW4KKyAqIEBwYXJhbSAgX19WQUxVRV9fIFZhbHVlIHRvIGJlIHdyaXR0ZW4gaW4gdGhlIHJlZ2lzdGVyCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBMTF9JV0RHX1dyaXRlUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXywgX19WQUxVRV9fKSBcCisgIFdSSVRFX1JFRyhfX0lOU1RBTkNFX18tPl9fUkVHX18sIChfX1ZBTFVFX18pKQorCisvKioKKyAqIEBicmllZiAgUmVhZCBhIHZhbHVlIGluIElXREcgcmVnaXN0ZXIKKyAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIElXREcgSW5zdGFuY2UKKyAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSByZWFkCisgKiBAcmV0dmFsIFJlZ2lzdGVyIHZhbHVlCisgKi8KKyNkZWZpbmUgTExfSVdER19SZWFkUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXykgUkVBRF9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fKQorLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBJV0RHX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucyBJV0RHIEV4cG9ydGVkIEZ1bmN0aW9ucworICogQHsKKyAqLworLyoqIEBkZWZncm91cCBJV0RHX0xMX0VGX0NvbmZpZ3VyYXRpb24gQ29uZmlndXJhdGlvbgorICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiAgU3RhcnQgdGhlIEluZGVwZW5kZW50IFdhdGNoZG9nCisgKiBAbm90ZSAgIEV4Y2VwdCBpZiB0aGUgaGFyZHdhcmUgd2F0Y2hkb2cgb3B0aW9uIGlzIHNlbGVjdGVkCisgKiBAcm10b2xsIEtSICAgICAgICAgICBLRVkgICAgICAgICAgIExMX0lXREdfRW5hYmxlCisgKiBAcGFyYW0gIElXREd4IElXREcgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JV0RHX0VuYWJsZShJV0RHX1R5cGVEZWYgKklXREd4KSB7CisgIFdSSVRFX1JFRyhJV0RHeC0+S1IsIExMX0lXREdfS0VZX0VOQUJMRSk7Cit9CisKKy8qKgorICogQGJyaWVmICBSZWxvYWRzIElXREcgY291bnRlciB3aXRoIHZhbHVlIGRlZmluZWQgaW4gdGhlIHJlbG9hZCByZWdpc3RlcgorICogQHJtdG9sbCBLUiAgICAgICAgICAgS0VZICAgICAgICAgICBMTF9JV0RHX1JlbG9hZENvdW50ZXIKKyAqIEBwYXJhbSAgSVdER3ggSVdERyBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0lXREdfUmVsb2FkQ291bnRlcihJV0RHX1R5cGVEZWYgKklXREd4KSB7CisgIFdSSVRFX1JFRyhJV0RHeC0+S1IsIExMX0lXREdfS0VZX1JFTE9BRCk7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgd3JpdGUgYWNjZXNzIHRvIElXREdfUFIsIElXREdfUkxSIGFuZCBJV0RHX1dJTlIgcmVnaXN0ZXJzCisgKiBAcm10b2xsIEtSICAgICAgICAgICBLRVkgICAgICAgICAgIExMX0lXREdfRW5hYmxlV3JpdGVBY2Nlc3MKKyAqIEBwYXJhbSAgSVdER3ggSVdERyBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0lXREdfRW5hYmxlV3JpdGVBY2Nlc3MoSVdER19UeXBlRGVmICpJV0RHeCkgeworICBXUklURV9SRUcoSVdER3gtPktSLCBMTF9JV0RHX0tFWV9XUl9BQ0NFU1NfRU5BQkxFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgd3JpdGUgYWNjZXNzIHRvIElXREdfUFIsIElXREdfUkxSIGFuZCBJV0RHX1dJTlIgcmVnaXN0ZXJzCisgKiBAcm10b2xsIEtSICAgICAgICAgICBLRVkgICAgICAgICAgIExMX0lXREdfRGlzYWJsZVdyaXRlQWNjZXNzCisgKiBAcGFyYW0gIElXREd4IElXREcgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JV0RHX0Rpc2FibGVXcml0ZUFjY2VzcyhJV0RHX1R5cGVEZWYgKklXREd4KSB7CisgIFdSSVRFX1JFRyhJV0RHeC0+S1IsIExMX0lXREdfS0VZX1dSX0FDQ0VTU19ESVNBQkxFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFNlbGVjdCB0aGUgcHJlc2NhbGVyIG9mIHRoZSBJV0RHCisgKiBAcm10b2xsIFBSICAgICAgICAgICBQUiAgICAgICAgICAgIExMX0lXREdfU2V0UHJlc2NhbGVyCisgKiBAcGFyYW0gIElXREd4IElXREcgSW5zdGFuY2UKKyAqIEBwYXJhbSAgUHJlc2NhbGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JV0RHX1BSRVNDQUxFUl80CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JV0RHX1BSRVNDQUxFUl84CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JV0RHX1BSRVNDQUxFUl8xNgorICogICAgICAgICBAYXJnIEByZWYgTExfSVdER19QUkVTQ0FMRVJfMzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0lXREdfUFJFU0NBTEVSXzY0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JV0RHX1BSRVNDQUxFUl8xMjgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0lXREdfUFJFU0NBTEVSXzI1NgorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0lXREdfU2V0UHJlc2NhbGVyKElXREdfVHlwZURlZiAqSVdER3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQcmVzY2FsZXIpIHsKKyAgV1JJVEVfUkVHKElXREd4LT5QUiwgSVdER19QUl9QUiAmIFByZXNjYWxlcik7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgdGhlIHNlbGVjdGVkIHByZXNjYWxlciBvZiB0aGUgSVdERworICogQHJtdG9sbCBQUiAgICAgICAgICAgUFIgICAgICAgICAgICBMTF9JV0RHX0dldFByZXNjYWxlcgorICogQHBhcmFtICBJV0RHeCBJV0RHIEluc3RhbmNlCisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JV0RHX1BSRVNDQUxFUl80CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JV0RHX1BSRVNDQUxFUl84CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JV0RHX1BSRVNDQUxFUl8xNgorICogICAgICAgICBAYXJnIEByZWYgTExfSVdER19QUkVTQ0FMRVJfMzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0lXREdfUFJFU0NBTEVSXzY0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JV0RHX1BSRVNDQUxFUl8xMjgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0lXREdfUFJFU0NBTEVSXzI1NgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSVdER19HZXRQcmVzY2FsZXIoY29uc3QgSVdER19UeXBlRGVmICpJV0RHeCkgeworICByZXR1cm4gKFJFQURfUkVHKElXREd4LT5QUikpOworfQorCisvKioKKyAqIEBicmllZiAgU3BlY2lmeSB0aGUgSVdERyBkb3duLWNvdW50ZXIgcmVsb2FkIHZhbHVlCisgKiBAcm10b2xsIFJMUiAgICAgICAgICBSTCAgICAgICAgICAgIExMX0lXREdfU2V0UmVsb2FkQ291bnRlcgorICogQHBhcmFtICBJV0RHeCBJV0RHIEluc3RhbmNlCisgKiBAcGFyYW0gIENvdW50ZXIgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0weDBGRkYKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JV0RHX1NldFJlbG9hZENvdW50ZXIoSVdER19UeXBlRGVmICpJV0RHeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDb3VudGVyKSB7CisgIFdSSVRFX1JFRyhJV0RHeC0+UkxSLCBJV0RHX1JMUl9STCAmIENvdW50ZXIpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IHRoZSBzcGVjaWZpZWQgSVdERyBkb3duLWNvdW50ZXIgcmVsb2FkIHZhbHVlCisgKiBAcm10b2xsIFJMUiAgICAgICAgICBSTCAgICAgICAgICAgIExMX0lXREdfR2V0UmVsb2FkQ291bnRlcgorICogQHBhcmFtICBJV0RHeCBJV0RHIEluc3RhbmNlCisgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MHgwRkZGCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JV0RHX0dldFJlbG9hZENvdW50ZXIoY29uc3QgSVdER19UeXBlRGVmICpJV0RHeCkgeworICByZXR1cm4gKFJFQURfUkVHKElXREd4LT5STFIpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFNwZWNpZnkgaGlnaCBsaW1pdCBvZiB0aGUgd2luZG93IHZhbHVlIHRvIGJlIGNvbXBhcmVkIHRvIHRoZQorICogZG93bi1jb3VudGVyLgorICogQHJtdG9sbCBXSU5SICAgICAgICAgV0lOICAgICAgICAgICBMTF9JV0RHX1NldFdpbmRvdworICogQHBhcmFtICBJV0RHeCBJV0RHIEluc3RhbmNlCisgKiBAcGFyYW0gIFdpbmRvdyBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTB4MEZGRgorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0lXREdfU2V0V2luZG93KElXREdfVHlwZURlZiAqSVdER3gsIHVpbnQzMl90IFdpbmRvdykgeworICBXUklURV9SRUcoSVdER3gtPldJTlIsIElXREdfV0lOUl9XSU4gJiBXaW5kb3cpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IHRoZSBoaWdoIGxpbWl0IG9mIHRoZSB3aW5kb3cgdmFsdWUgc3BlY2lmaWVkLgorICogQHJtdG9sbCBXSU5SICAgICAgICAgV0lOICAgICAgICAgICBMTF9JV0RHX0dldFdpbmRvdworICogQHBhcmFtICBJV0RHeCBJV0RHIEluc3RhbmNlCisgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MHgwRkZGCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JV0RHX0dldFdpbmRvdyhjb25zdCBJV0RHX1R5cGVEZWYgKklXREd4KSB7CisgIHJldHVybiAoUkVBRF9SRUcoSVdER3gtPldJTlIpKTsKK30KKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgSVdER19MTF9FRl9GTEFHX01hbmFnZW1lbnQgRkxBR19NYW5hZ2VtZW50CisgKiBAeworICovCisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiBmbGFnIFByZXNjYWxlciBWYWx1ZSBVcGRhdGUgaXMgc2V0IG9yIG5vdAorICogQHJtdG9sbCBTUiAgICAgICAgICAgUFZVICAgICAgICAgICBMTF9JV0RHX0lzQWN0aXZlRmxhZ19QVlUKKyAqIEBwYXJhbSAgSVdER3ggSVdERyBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JV0RHX0lzQWN0aXZlRmxhZ19QVlUoY29uc3QgSVdER19UeXBlRGVmICpJV0RHeCkgeworICByZXR1cm4gKChSRUFEX0JJVChJV0RHeC0+U1IsIElXREdfU1JfUFZVKSA9PSAoSVdER19TUl9QVlUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiBmbGFnIFJlbG9hZCBWYWx1ZSBVcGRhdGUgaXMgc2V0IG9yIG5vdAorICogQHJtdG9sbCBTUiAgICAgICAgICAgUlZVICAgICAgICAgICBMTF9JV0RHX0lzQWN0aXZlRmxhZ19SVlUKKyAqIEBwYXJhbSAgSVdER3ggSVdERyBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JV0RHX0lzQWN0aXZlRmxhZ19SVlUoY29uc3QgSVdER19UeXBlRGVmICpJV0RHeCkgeworICByZXR1cm4gKChSRUFEX0JJVChJV0RHeC0+U1IsIElXREdfU1JfUlZVKSA9PSAoSVdER19TUl9SVlUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiBmbGFnIFdpbmRvdyBWYWx1ZSBVcGRhdGUgaXMgc2V0IG9yIG5vdAorICogQHJtdG9sbCBTUiAgICAgICAgICAgV1ZVICAgICAgICAgICBMTF9JV0RHX0lzQWN0aXZlRmxhZ19XVlUKKyAqIEBwYXJhbSAgSVdER3ggSVdERyBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JV0RHX0lzQWN0aXZlRmxhZ19XVlUoY29uc3QgSVdER19UeXBlRGVmICpJV0RHeCkgeworICByZXR1cm4gKChSRUFEX0JJVChJV0RHeC0+U1IsIElXREdfU1JfV1ZVKSA9PSAoSVdER19TUl9XVlUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiBhbGwgZmxhZ3MgUHJlc2NhbGVyLCBSZWxvYWQgJiBXaW5kb3cgVmFsdWUgVXBkYXRlIGFyZSByZXNldAorICogb3Igbm90CisgKiBAcm10b2xsIFNSICAgICAgICAgICBQVlUgICAgICAgICAgIExMX0lXREdfSXNSZWFkeVxuCisgKiAgICAgICAgIFNSICAgICAgICAgICBSVlUgICAgICAgICAgIExMX0lXREdfSXNSZWFkeVxuCisgKiAgICAgICAgIFNSICAgICAgICAgICBXVlUgICAgICAgICAgIExMX0lXREdfSXNSZWFkeQorICogQHBhcmFtICBJV0RHeCBJV0RHIEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdHMgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JV0RHX0lzUmVhZHkoSVdER19UeXBlRGVmICpJV0RHeCkgeworICByZXR1cm4gKChSRUFEX0JJVChJV0RHeC0+U1IsIElXREdfU1JfUFZVIHwgSVdER19TUl9SVlUgfCBJV0RHX1NSX1dWVSkgPT0gMFUpCisgICAgICAgICAgICAgID8gMVVMCisgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworI2VuZGlmIC8qIElXREcgKi8KKworLyoqCisgKiBAfQorICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMkc0eHhfTExfSVdER19IICovCmRpZmYgLS1naXQgYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9sbF9scHVhcnQuaCBiL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9JbmMvc3RtMzJnNHh4X2xsX2xwdWFydC5oCmluZGV4IDljZGNjNDguLjljNzI5MTUgMTAwNjQ0Ci0tLSBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9JbmMvc3RtMzJnNHh4X2xsX2xwdWFydC5oCisrKyBiL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9JbmMvc3RtMzJnNHh4X2xsX2xwdWFydC5oCkBAIC0xLDI3MDcgKzEsMjc2NyBAQAotLyoqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEBmaWxlICAgIHN0bTMyZzR4eF9sbF9scHVhcnQuaA0KLSAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtDQotICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgTFBVQVJUIExMIG1vZHVsZS4NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQGF0dGVudGlvbg0KLSAqDQotICogQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KLSAqDQotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0ZXJtcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlDQotICogaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc29mdHdhcmUgY29tcG9uZW50Lg0KLSAqIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcyB3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLg0KLSAqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqLw0KLQ0KLS8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotI2lmbmRlZiBTVE0zMkc0eHhfTExfTFBVQVJUX0gNCi0jZGVmaW5lIFNUTTMyRzR4eF9MTF9MUFVBUlRfSA0KLQ0KLSNpZmRlZiBfX2NwbHVzcGx1cw0KLWV4dGVybiAiQyIgew0KLSNlbmRpZg0KLQ0KLS8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotI2luY2x1ZGUgInN0bTMyZzR4eC5oIg0KLQ0KLS8qKiBAYWRkdG9ncm91cCBTVE0zMkc0eHhfTExfRHJpdmVyDQotICogQHsNCi0gKi8NCi0NCi0jaWYgZGVmaW5lZChMUFVBUlQxKQ0KLQ0KLS8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMIExQVUFSVA0KLSAqIEB7DQotICovDQotDQotLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX1ByaXZhdGVfVmFyaWFibGVzIExQVUFSVCBQcml2YXRlIFZhcmlhYmxlcw0KLSAqIEB7DQotICovDQotLyogQXJyYXkgdXNlZCB0byBnZXQgdGhlIExQVUFSVCBwcmVzY2FsZXIgZGl2aXNpb24gZGVjaW1hbCB2YWx1ZXMgdmVyc3VzIEByZWYNCi0gKiBMUFVBUlRfTExfRUNfUFJFU0NBTEVSIHZhbHVlcyAqLw0KLXN0YXRpYyBjb25zdCB1aW50MTZfdCBMUFVBUlRfUFJFU0NBTEVSX1RBQltdID0gew0KLSAgICAodWludDE2X3QpMSwgICh1aW50MTZfdCkyLCAgKHVpbnQxNl90KTQsICAgKHVpbnQxNl90KTYsDQotICAgICh1aW50MTZfdCk4LCAgKHVpbnQxNl90KTEwLCAodWludDE2X3QpMTIsICAodWludDE2X3QpMTYsDQotICAgICh1aW50MTZfdCkzMiwgKHVpbnQxNl90KTY0LCAodWludDE2X3QpMTI4LCAodWludDE2X3QpMjU2fTsNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBkZWZncm91cCBMUFVBUlRfTExfUHJpdmF0ZV9Db25zdGFudHMgTFBVQVJUIFByaXZhdGUgQ29uc3RhbnRzDQotICogQHsNCi0gKi8NCi0vKiBEZWZpbmVzIHVzZWQgaW4gQmF1ZCBSYXRlIHJlbGF0ZWQgbWFjcm9zIGFuZCBjb3JyZXNwb25kaW5nIHJlZ2lzdGVyIHNldHRpbmcNCi0gKiBjb21wdXRhdGlvbiAqLw0KLSNkZWZpbmUgTFBVQVJUX0xQVUFSVERJVl9GUkVRX01VTCAyNTZVDQotI2RlZmluZSBMUFVBUlRfQlJSX01BU0sgMHgwMDBGRkZGRlUNCi0jZGVmaW5lIExQVUFSVF9CUlJfTUlOX1ZBTFVFIDB4MDAwMDAzMDBVDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikNCi0vKiogQGRlZmdyb3VwIExQVUFSVF9MTF9Qcml2YXRlX01hY3JvcyBMUFVBUlQgUHJpdmF0ZSBNYWNyb3MNCi0gKiBAew0KLSAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotI2VuZGlmIC8qVVNFX0ZVTExfTExfRFJJVkVSKi8NCi0NCi0vKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikNCi0vKiogQGRlZmdyb3VwIExQVUFSVF9MTF9FU19JTklUIExQVUFSVCBFeHBvcnRlZCBJbml0IHN0cnVjdHVyZXMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiBMTCBMUFVBUlQgSW5pdCBTdHJ1Y3R1cmUgZGVmaW5pdGlvbg0KLSAqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gIHVpbnQzMl90IFByZXNjYWxlclZhbHVlOyAvKiE8IFNwZWNpZmllcyB0aGUgUHJlc2NhbGVyIHRvIGNvbXB1dGUgdGhlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbXVuaWNhdGlvbiBiYXVkIHJhdGUuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgb2YgQHJlZiBMUFVBUlRfTExfRUNfUFJFU0NBTEVSLg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0xQVUFSVF9TZXRQcmVzY2FsZXIoKS4qLw0KLQ0KLSAgdWludDMyX3QNCi0gICAgICBCYXVkUmF0ZTsgLyohPCBUaGlzIGZpZWxkIGRlZmluZXMgZXhwZWN0ZWQgTFBVQVJUIGNvbW11bmljYXRpb24gYmF1ZCByYXRlLg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5DQotICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gQHJlZiBMTF9MUFVBUlRfU2V0QmF1ZFJhdGUoKS4qLw0KLQ0KLSAgdWludDMyX3QgRGF0YVdpZHRoOyAvKiE8IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGRhdGEgYml0cyB0cmFuc21pdHRlZCBvcg0KLSAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlZCBpbiBhIGZyYW1lLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExQVUFSVF9MTF9FQ19EQVRBV0lEVEguDQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBAcmVmIExMX0xQVUFSVF9TZXREYXRhV2lkdGgoKS4qLw0KLQ0KLSAgdWludDMyX3QgU3RvcEJpdHM7IC8qITwgU3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygc3RvcCBiaXRzIHRyYW5zbWl0dGVkLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgIExQVUFSVF9MTF9FQ19TVE9QQklUUy4NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5DQotICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBAcmVmIExMX0xQVUFSVF9TZXRTdG9wQml0c0xlbmd0aCgpLiovDQotDQotICB1aW50MzJfdA0KLSAgICAgIFBhcml0eTsgLyohPCBTcGVjaWZpZXMgdGhlIHBhcml0eSBtb2RlLg0KLSAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIExQVUFSVF9MTF9FQ19QQVJJVFkuDQotDQotICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5DQotICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEByZWYgTExfTFBVQVJUX1NldFBhcml0eSgpLiovDQotDQotICB1aW50MzJfdCBUcmFuc2ZlckRpcmVjdGlvbjsgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgUmVjZWl2ZSBhbmQvb3IgVHJhbnNtaXQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuIFRoaXMgcGFyYW1ldGVyIGNhbg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGEgdmFsdWUgb2YgQHJlZiBMUFVBUlRfTExfRUNfRElSRUNUSU9OLg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdGFyeSBmdW5jdGlvbiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfTFBVQVJUX1NldFRyYW5zZmVyRGlyZWN0aW9uKCkuKi8NCi0NCi0gIHVpbnQzMl90DQotICAgICAgSGFyZHdhcmVGbG93Q29udHJvbDsgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgaGFyZHdhcmUgZmxvdyBjb250cm9sIG1vZGUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBlbmFibGVkIG9yIGRpc2FibGVkLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIG9mIEByZWYgTFBVQVJUX0xMX0VDX0hXQ09OVFJPTC4NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9MUFVBUlRfU2V0SFdGbG93Q3RybCgpLiovDQotDQotfSBMTF9MUFVBUlRfSW5pdFR5cGVEZWY7DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0jZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovDQotDQotLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGRlZmdyb3VwIExQVUFSVF9MTF9FeHBvcnRlZF9Db25zdGFudHMgTFBVQVJUIEV4cG9ydGVkIENvbnN0YW50cw0KLSAqIEB7DQotICovDQotDQotLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUNfQ0xFQVJfRkxBRyBDbGVhciBGbGFncyBEZWZpbmVzDQotICogQGJyaWVmICAgIEZsYWdzIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9MUFVBUlRfV3JpdGVSZWcgZnVuY3Rpb24NCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfTFBVQVJUX0lDUl9QRUNGIFVTQVJUX0lDUl9QRUNGIC8qITwgUGFyaXR5IGVycm9yIGNsZWFyIGZsYWcgKi8NCi0jZGVmaW5lIExMX0xQVUFSVF9JQ1JfRkVDRiBVU0FSVF9JQ1JfRkVDRiAvKiE8IEZyYW1pbmcgZXJyb3IgY2xlYXIgZmxhZyAqLw0KLSNkZWZpbmUgTExfTFBVQVJUX0lDUl9OQ0YgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIFVTQVJUX0lDUl9ORUNGIC8qITwgTm9pc2UgZXJyb3IgZGV0ZWN0ZWQgY2xlYXIgZmxhZyBcDQotICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX0xQVUFSVF9JQ1JfT1JFQ0YgVVNBUlRfSUNSX09SRUNGIC8qITwgT3ZlcnJ1biBlcnJvciBjbGVhciBmbGFnICovDQotI2RlZmluZSBMTF9MUFVBUlRfSUNSX0lETEVDRiBcDQotICBVU0FSVF9JQ1JfSURMRUNGIC8qITwgSWRsZSBsaW5lIGRldGVjdGVkIGNsZWFyIGZsYWcgKi8NCi0jZGVmaW5lIExMX0xQVUFSVF9JQ1JfVENDRiBcDQotICBVU0FSVF9JQ1JfVENDRiAvKiE8IFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBjbGVhciBmbGFnICovDQotI2RlZmluZSBMTF9MUFVBUlRfSUNSX0NUU0NGIFVTQVJUX0lDUl9DVFNDRiAvKiE8IENUUyBjbGVhciBmbGFnICovDQotI2RlZmluZSBMTF9MUFVBUlRfSUNSX0NNQ0YgVVNBUlRfSUNSX0NNQ0YgICAvKiE8IENoYXJhY3RlciBtYXRjaCBjbGVhciBmbGFnICovDQotI2RlZmluZSBMTF9MUFVBUlRfSUNSX1dVQ0YgXA0KLSAgVVNBUlRfSUNSX1dVQ0YgLyohPCBXYWtldXAgZnJvbSBTdG9wIG1vZGUgY2xlYXIgZmxhZyAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUNfR0VUX0ZMQUcgR2V0IEZsYWdzIERlZmluZXMNCi0gKiBAYnJpZWYgICAgRmxhZ3MgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX0xQVUFSVF9SZWFkUmVnIGZ1bmN0aW9uDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX0xQVUFSVF9JU1JfUEUgVVNBUlRfSVNSX1BFICAgICAvKiE8IFBhcml0eSBlcnJvciBmbGFnICovDQotI2RlZmluZSBMTF9MUFVBUlRfSVNSX0ZFIFVTQVJUX0lTUl9GRSAgICAgLyohPCBGcmFtaW5nIGVycm9yIGZsYWcgKi8NCi0jZGVmaW5lIExMX0xQVUFSVF9JU1JfTkUgVVNBUlRfSVNSX05FICAgICAvKiE8IE5vaXNlIGRldGVjdGVkIGZsYWcgKi8NCi0jZGVmaW5lIExMX0xQVUFSVF9JU1JfT1JFIFVTQVJUX0lTUl9PUkUgICAvKiE8IE92ZXJydW4gZXJyb3IgZmxhZyAqLw0KLSNkZWZpbmUgTExfTFBVQVJUX0lTUl9JRExFIFVTQVJUX0lTUl9JRExFIC8qITwgSWRsZSBsaW5lIGRldGVjdGVkIGZsYWcgKi8NCi0jZGVmaW5lIExMX0xQVUFSVF9JU1JfUlhORV9SWEZORSBcDQotICBVU0FSVF9JU1JfUlhORV9SWEZORSAvKiE8IFJlYWQgZGF0YSByZWdpc3RlciBvciBSWCBGSUZPIG5vdCBlbXB0eSBmbGFnICovDQotI2RlZmluZSBMTF9MUFVBUlRfSVNSX1RDIFVTQVJUX0lTUl9UQyAvKiE8IFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBmbGFnICovDQotI2RlZmluZSBMTF9MUFVBUlRfSVNSX1RYRV9UWEZORiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIFVTQVJUX0lTUl9UWEVfVFhGTkYgLyohPCBUcmFuc21pdCBkYXRhIHJlZ2lzdGVyIGVtcHR5IG9yIFRYIEZJRk8gTm90IEZ1bGwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnKi8NCi0jZGVmaW5lIExMX0xQVUFSVF9JU1JfQ1RTSUYgVVNBUlRfSVNSX0NUU0lGIC8qITwgQ1RTIGludGVycnVwdCBmbGFnICovDQotI2RlZmluZSBMTF9MUFVBUlRfSVNSX0NUUyBVU0FSVF9JU1JfQ1RTICAgICAvKiE8IENUUyBmbGFnICovDQotI2RlZmluZSBMTF9MUFVBUlRfSVNSX0JVU1kgVVNBUlRfSVNSX0JVU1kgICAvKiE8IEJ1c3kgZmxhZyAqLw0KLSNkZWZpbmUgTExfTFBVQVJUX0lTUl9DTUYgVVNBUlRfSVNSX0NNRiAgICAgLyohPCBDaGFyYWN0ZXIgbWF0Y2ggZmxhZyAqLw0KLSNkZWZpbmUgTExfTFBVQVJUX0lTUl9TQktGIFVTQVJUX0lTUl9TQktGICAgLyohPCBTZW5kIGJyZWFrIGZsYWcgKi8NCi0jZGVmaW5lIExMX0xQVUFSVF9JU1JfUldVIFwNCi0gIFVTQVJUX0lTUl9SV1UgLyohPCBSZWNlaXZlciB3YWtldXAgZnJvbSBNdXRlIG1vZGUgZmxhZyAqLw0KLSNkZWZpbmUgTExfTFBVQVJUX0lTUl9XVUYgVVNBUlRfSVNSX1dVRiAvKiE8IFdha2V1cCBmcm9tIFN0b3AgbW9kZSBmbGFnICovDQotI2RlZmluZSBMTF9MUFVBUlRfSVNSX1RFQUNLIFwNCi0gIFVTQVJUX0lTUl9URUFDSyAvKiE8IFRyYW5zbWl0IGVuYWJsZSBhY2tub3dsZWRnZSBmbGFnICovDQotI2RlZmluZSBMTF9MUFVBUlRfSVNSX1JFQUNLIFwNCi0gIFVTQVJUX0lTUl9SRUFDSyAvKiE8IFJlY2VpdmUgZW5hYmxlIGFja25vd2xlZGdlIGZsYWcgKi8NCi0jZGVmaW5lIExMX0xQVUFSVF9JU1JfVFhGRSBVU0FSVF9JU1JfVFhGRSAvKiE8IFRYIEZJRk8gZW1wdHkgZmxhZyAqLw0KLSNkZWZpbmUgTExfTFBVQVJUX0lTUl9SWEZGIFVTQVJUX0lTUl9SWEZGIC8qITwgUlggRklGTyBmdWxsIGZsYWcgKi8NCi0jZGVmaW5lIExMX0xQVUFSVF9JU1JfUlhGVCBVU0FSVF9JU1JfUlhGVCAvKiE8IFJYIEZJRk8gdGhyZXNob2xkIGZsYWcgKi8NCi0jZGVmaW5lIExMX0xQVUFSVF9JU1JfVFhGVCBVU0FSVF9JU1JfVFhGVCAvKiE8IFRYIEZJRk8gdGhyZXNob2xkIGZsYWcgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX0VDX0lUIElUIERlZmluZXMNCi0gKiBAYnJpZWYgICAgSVQgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX0xQVUFSVF9SZWFkUmVnIGFuZA0KLSAqIExMX0xQVUFSVF9Xcml0ZVJlZyBmdW5jdGlvbnMNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfTFBVQVJUX0NSMV9JRExFSUUgVVNBUlRfQ1IxX0lETEVJRSAvKiE8IElETEUgaW50ZXJydXB0IGVuYWJsZSAqLw0KLSNkZWZpbmUgTExfTFBVQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSAvKiE8IFJlYWQgZGF0YSByZWdpc3RlciBhbmQgUlhGSUZPIG5vdCBlbXB0eSBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHQgZW5hYmxlICovDQotI2RlZmluZSBMTF9MUFVBUlRfQ1IxX1RDSUUgXA0KLSAgVVNBUlRfQ1IxX1RDSUUgLyohPCBUcmFuc21pc3Npb24gY29tcGxldGUgaW50ZXJydXB0IGVuYWJsZSAqLw0KLSNkZWZpbmUgTExfTFBVQVJUX0NSMV9UWEVJRV9UWEZORklFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIFVTQVJUX0NSMV9UWEVJRV9UWEZORklFIC8qITwgVHJhbnNtaXQgZGF0YSByZWdpc3RlciBlbXB0eSBhbmQgVFggRklGTyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBmdWxsIGludGVycnVwdCBlbmFibGUgKi8NCi0jZGVmaW5lIExMX0xQVUFSVF9DUjFfUEVJRSBVU0FSVF9DUjFfUEVJRSAvKiE8IFBhcml0eSBlcnJvciAqLw0KLSNkZWZpbmUgTExfTFBVQVJUX0NSMV9DTUlFIFwNCi0gIFVTQVJUX0NSMV9DTUlFIC8qITwgQ2hhcmFjdGVyIG1hdGNoIGludGVycnVwdCBlbmFibGUgKi8NCi0jZGVmaW5lIExMX0xQVUFSVF9DUjFfVFhGRUlFIFwNCi0gIFVTQVJUX0NSMV9UWEZFSUUgLyohPCBUWCBGSUZPIGVtcHR5IGludGVycnVwdCBlbmFibGUgKi8NCi0jZGVmaW5lIExMX0xQVUFSVF9DUjFfUlhGRklFIFwNCi0gIFVTQVJUX0NSMV9SWEZGSUUgICAgICAgICAgICAgICAgICAgICAgLyohPCBSWCBGSUZPIGZ1bGwgaW50ZXJydXB0IGVuYWJsZSAqLw0KLSNkZWZpbmUgTExfTFBVQVJUX0NSM19FSUUgVVNBUlRfQ1IzX0VJRSAvKiE8IEVycm9yIGludGVycnVwdCBlbmFibGUgKi8NCi0jZGVmaW5lIExMX0xQVUFSVF9DUjNfQ1RTSUUgVVNBUlRfQ1IzX0NUU0lFIC8qITwgQ1RTIGludGVycnVwdCBlbmFibGUgKi8NCi0jZGVmaW5lIExMX0xQVUFSVF9DUjNfV1VGSUUgXA0KLSAgVVNBUlRfQ1IzX1dVRklFIC8qITwgV2FrZXVwIGZyb20gU3RvcCBtb2RlIGludGVycnVwdCBlbmFibGUgKi8NCi0jZGVmaW5lIExMX0xQVUFSVF9DUjNfVFhGVElFIFwNCi0gIFVTQVJUX0NSM19UWEZUSUUgLyohPCBUWCBGSUZPIHRocmVzaG9sZCBpbnRlcnJ1cHQgZW5hYmxlICovDQotI2RlZmluZSBMTF9MUFVBUlRfQ1IzX1JYRlRJRSBcDQotICBVU0FSVF9DUjNfUlhGVElFIC8qITwgUlggRklGTyB0aHJlc2hvbGQgaW50ZXJydXB0IGVuYWJsZSAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUNfRklGT1RIUkVTSE9MRCBGSUZPIFRocmVzaG9sZA0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF8xXzggXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBGSUZPIHJlYWNoZXMgMS84IG9mIGl0cyBkZXB0aCAqLw0KLSNkZWZpbmUgTExfTFBVQVJUX0ZJRk9USFJFU0hPTERfMV80IFwNCi0gIDB4MDAwMDAwMDFVIC8qITwgRklGTyByZWFjaGVzIDEvNCBvZiBpdHMgZGVwdGggKi8NCi0jZGVmaW5lIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzFfMiBcDQotICAweDAwMDAwMDAyVSAvKiE8IEZJRk8gcmVhY2hlcyAxLzIgb2YgaXRzIGRlcHRoICovDQotI2RlZmluZSBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF8zXzQgXA0KLSAgMHgwMDAwMDAwM1UgLyohPCBGSUZPIHJlYWNoZXMgMy80IG9mIGl0cyBkZXB0aCAqLw0KLSNkZWZpbmUgTExfTFBVQVJUX0ZJRk9USFJFU0hPTERfN184IFwNCi0gIDB4MDAwMDAwMDRVIC8qITwgRklGTyByZWFjaGVzIDcvOCBvZiBpdHMgZGVwdGggKi8NCi0jZGVmaW5lIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzhfOCBcDQotICAweDAwMDAwMDA1VSAvKiE8IEZJRk8gYmVjb21lcyBlbXB0eSBmb3IgVFggYW5kIGZ1bGwgZm9yIFJYICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIExQVUFSVF9MTF9FQ19ESVJFQ1RJT04gRGlyZWN0aW9uDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX0xQVUFSVF9ESVJFQ1RJT05fTk9ORSBcDQotICAweDAwMDAwMDAwVSAvKiE8IFRyYW5zbWl0dGVyIGFuZCBSZWNlaXZlciBhcmUgZGlzYWJsZWQgICAgICAgICAgICovDQotI2RlZmluZSBMTF9MUFVBUlRfRElSRUNUSU9OX1JYIFwNCi0gIFVTQVJUX0NSMV9SRSAvKiE8IFRyYW5zbWl0dGVyIGlzIGRpc2FibGVkIGFuZCBSZWNlaXZlciBpcyBlbmFibGVkICovDQotI2RlZmluZSBMTF9MUFVBUlRfRElSRUNUSU9OX1RYIFwNCi0gIFVTQVJUX0NSMV9URSAvKiE8IFRyYW5zbWl0dGVyIGlzIGVuYWJsZWQgYW5kIFJlY2VpdmVyIGlzIGRpc2FibGVkICovDQotI2RlZmluZSBMTF9MUFVBUlRfRElSRUNUSU9OX1RYX1JYIFwNCi0gIChVU0FSVF9DUjFfVEUgfCBVU0FSVF9DUjFfUkUpIC8qITwgVHJhbnNtaXR0ZXIgYW5kIFJlY2VpdmVyIGFyZSBlbmFibGVkICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIExQVUFSVF9MTF9FQ19QQVJJVFkgUGFyaXR5IENvbnRyb2wNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfTFBVQVJUX1BBUklUWV9OT05FIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgUGFyaXR5IGNvbnRyb2wgZGlzYWJsZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX0xQVUFSVF9QQVJJVFlfRVZFTiBcDQotICBVU0FSVF9DUjFfUENFIC8qITwgUGFyaXR5IGNvbnRyb2wgZW5hYmxlZCBhbmQgRXZlbiBQYXJpdHkgaXMgc2VsZWN0ZWQgKi8NCi0jZGVmaW5lIExMX0xQVUFSVF9QQVJJVFlfT0REIFwNCi0gIChVU0FSVF9DUjFfUENFIHwgICAgICAgICAgIFwNCi0gICBVU0FSVF9DUjFfUFMpIC8qITwgUGFyaXR5IGNvbnRyb2wgZW5hYmxlZCBhbmQgT2RkIFBhcml0eSBpcyBzZWxlY3RlZCAgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX0VDX1dBS0VVUCBXYWtldXANCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfTFBVQVJUX1dBS0VVUF9JRExFTElORSBcDQotICAweDAwMDAwMDAwVSAvKiE8ICBMUFVBUlQgd2FrZSB1cCBmcm9tIE11dGUgbW9kZSBvbiBJZGxlIExpbmUgICAgKi8NCi0jZGVmaW5lIExMX0xQVUFSVF9XQUtFVVBfQUREUkVTU01BUksgXA0KLSAgVVNBUlRfQ1IxX1dBS0UgLyohPCAgTFBVQVJUIHdha2UgdXAgZnJvbSBNdXRlIG1vZGUgb24gQWRkcmVzcyBNYXJrICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIExQVUFSVF9MTF9FQ19EQVRBV0lEVEggRGF0YXdpZHRoDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX0xQVUFSVF9EQVRBV0lEVEhfN0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIFVTQVJUX0NSMV9NMSAvKiE8IDcgYml0cyB3b3JkIGxlbmd0aCA6IFN0YXJ0IGJpdCwgNyBkYXRhIGJpdHMsIG4gc3RvcCBiaXRzIFwNCi0gICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX0xQVUFSVF9EQVRBV0lEVEhfOEIgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCA4IGJpdHMgd29yZCBsZW5ndGggOiBTdGFydCBiaXQsIDggZGF0YSBiaXRzLCBuIHN0b3AgYml0cyAqLw0KLSNkZWZpbmUgTExfTFBVQVJUX0RBVEFXSURUSF85QiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgVVNBUlRfQ1IxX00wIC8qITwgOSBiaXRzIHdvcmQgbGVuZ3RoIDogU3RhcnQgYml0LCA5IGRhdGEgYml0cywgbiBzdG9wIGJpdHMgXA0KLSAgICAgICAgICAgICAgICAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUNfUFJFU0NBTEVSIENsb2NrIFNvdXJjZSBQcmVzY2FsZXINCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYxIDB4MDAwMDAwMDBVIC8qITwgSW5wdXQgY2xvY2sgbm90IGRpdmlkZWQgICAqLw0KLSNkZWZpbmUgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYyIFwNCi0gIChVU0FSVF9QUkVTQ19QUkVTQ0FMRVJfMCkgLyohPCBJbnB1dCBjbG9jayBkaXZpZGVkIGJ5IDIgICovDQotI2RlZmluZSBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjQgXA0KLSAgKFVTQVJUX1BSRVNDX1BSRVNDQUxFUl8xKSAvKiE8IElucHV0IGNsb2NrIGRpdmlkZWQgYnkgNCAgKi8NCi0jZGVmaW5lIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWNiBcDQotICAoVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzEgfCAgICAgXA0KLSAgIFVTQVJUX1BSRVNDX1BSRVNDQUxFUl8wKSAvKiE8IElucHV0IGNsb2NrIGRpdmlkZWQgYnkgNiAgKi8NCi0jZGVmaW5lIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWOCBcDQotICAoVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzIpIC8qITwgSW5wdXQgY2xvY2sgZGl2aWRlZCBieSA4ICAqLw0KLSNkZWZpbmUgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYxMCBcDQotICAoVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzIgfCAgICAgIFwNCi0gICBVU0FSVF9QUkVTQ19QUkVTQ0FMRVJfMCkgLyohPCBJbnB1dCBjbG9jayBkaXZpZGVkIGJ5IDEwICovDQotI2RlZmluZSBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjEyIFwNCi0gIChVU0FSVF9QUkVTQ19QUkVTQ0FMRVJfMiB8ICAgICAgXA0KLSAgIFVTQVJUX1BSRVNDX1BSRVNDQUxFUl8xKSAvKiE8IElucHV0IGNsb2NrIGRpdmlkZWQgYnkgMTIgKi8NCi0jZGVmaW5lIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMTYgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKFVTQVJUX1BSRVNDX1BSRVNDQUxFUl8yIHwgVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzEgfCBcDQotICAgVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzApIC8qITwgSW5wdXQgY2xvY2sgZGl2aWRlZCBieSAxNiAqLw0KLSNkZWZpbmUgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYzMiBcDQotICAoVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzMpIC8qITwgSW5wdXQgY2xvY2sgZGl2aWRlZCBieSAzMiAqLw0KLSNkZWZpbmUgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVY2NCBcDQotICAoVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzMgfCAgICAgIFwNCi0gICBVU0FSVF9QUkVTQ19QUkVTQ0FMRVJfMCkgLyohPCBJbnB1dCBjbG9jayBkaXZpZGVkIGJ5IDY0ICovDQotI2RlZmluZSBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjEyOCBcDQotICAoVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzMgfCAgICAgICBcDQotICAgVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzEpIC8qITwgSW5wdXQgY2xvY2sgZGl2aWRlZCBieSAxMjggKi8NCi0jZGVmaW5lIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMjU2ICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKFVTQVJUX1BSRVNDX1BSRVNDQUxFUl8zIHwgVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzEgfCBcDQotICAgVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzApIC8qITwgSW5wdXQgY2xvY2sgZGl2aWRlZCBieSAyNTYgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX0VDX1NUT1BCSVRTIFN0b3AgQml0cw0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9MUFVBUlRfU1RPUEJJVFNfMSAweDAwMDAwMDAwVSAgICAgIC8qITwgMSBzdG9wIGJpdCAqLw0KLSNkZWZpbmUgTExfTFBVQVJUX1NUT1BCSVRTXzIgVVNBUlRfQ1IyX1NUT1BfMSAvKiE8IDIgc3RvcCBiaXRzICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIExQVUFSVF9MTF9FQ19UWFJYIFRYIFJYIFBpbnMgU3dhcA0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9MUFVBUlRfVFhSWF9TVEFOREFSRCBcDQotICAweDAwMDAwMDAwVSAvKiE8IFRYL1JYIHBpbnMgYXJlIHVzZWQgYXMgZGVmaW5lZCBpbiBzdGFuZGFyZCBwaW5vdXQgKi8NCi0jZGVmaW5lIExMX0xQVUFSVF9UWFJYX1NXQVBQRUQgXA0KLSAgKFVTQVJUX0NSMl9TV0FQKSAvKiE8IFRYIGFuZCBSWCBwaW5zIGZ1bmN0aW9ucyBhcmUgc3dhcHBlZC4gICAgICAgICAgICAgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX0VDX1JYUElOX0xFVkVMIFJYIFBpbiBBY3RpdmUgTGV2ZWwgSW52ZXJzaW9uDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX0xQVUFSVF9SWFBJTl9MRVZFTF9TVEFOREFSRCBcDQotICAweDAwMDAwMDAwVSAvKiE8IFJYIHBpbiBzaWduYWwgd29ya3MgdXNpbmcgdGhlIHN0YW5kYXJkIGxvZ2ljIGxldmVscyAqLw0KLSNkZWZpbmUgTExfTFBVQVJUX1JYUElOX0xFVkVMX0lOVkVSVEVEIFwNCi0gIChVU0FSVF9DUjJfUlhJTlYpIC8qITwgUlggcGluIHNpZ25hbCB2YWx1ZXMgYXJlIGludmVydGVkLiAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUNfVFhQSU5fTEVWRUwgVFggUGluIEFjdGl2ZSBMZXZlbCBJbnZlcnNpb24NCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfTFBVQVJUX1RYUElOX0xFVkVMX1NUQU5EQVJEIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgVFggcGluIHNpZ25hbCB3b3JrcyB1c2luZyB0aGUgc3RhbmRhcmQgbG9naWMgbGV2ZWxzICovDQotI2RlZmluZSBMTF9MUFVBUlRfVFhQSU5fTEVWRUxfSU5WRVJURUQgXA0KLSAgKFVTQVJUX0NSMl9UWElOVikgLyohPCBUWCBwaW4gc2lnbmFsIHZhbHVlcyBhcmUgaW52ZXJ0ZWQuICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIExQVUFSVF9MTF9FQ19CSU5BUllfTE9HSUMgQmluYXJ5IERhdGEgSW52ZXJzaW9uDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX0xQVUFSVF9CSU5BUllfTE9HSUNfUE9TSVRJVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBMb2dpY2FsIGRhdGEgZnJvbSB0aGUgZGF0YSByZWdpc3RlciBhcmUgc2VuZC9yZWNlaXZlZCBcDQotICAgICAgICAgICAgICAgICAgIGluIHBvc2l0aXZlL2RpcmVjdCBsb2dpYy4gKDE9SCwgMD1MKSAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9MUFVBUlRfQklOQVJZX0xPR0lDX05FR0FUSVZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIFVTQVJUX0NSMl9EQVRBSU5WIC8qITwgTG9naWNhbCBkYXRhIGZyb20gdGhlIGRhdGEgcmVnaXN0ZXIgYXJlIHNlbmQvcmVjZWl2ZWQgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBpbiBuZWdhdGl2ZS9pbnZlcnNlIGxvZ2ljLiAoMT1MLCAwPUgpLiAgICAgICAgICAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBwYXJpdHkgYml0IGlzIGFsc28gaW52ZXJ0ZWQuICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIExQVUFSVF9MTF9FQ19CSVRPUkRFUiBCaXQgT3JkZXINCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfTFBVQVJUX0JJVE9SREVSX0xTQkZJUlNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBkYXRhIGlzIHRyYW5zbWl0dGVkL3JlY2VpdmVkIHdpdGggZGF0YSBiaXQgMCBmaXJzdCwgXA0KLSAgICAgICAgICAgICAgICAgICBmb2xsb3dpbmcgdGhlIHN0YXJ0IGJpdCAqLw0KLSNkZWZpbmUgTExfTFBVQVJUX0JJVE9SREVSX01TQkZJUlNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIFVTQVJUX0NSMl9NU0JGSVJTVCAvKiE8IGRhdGEgaXMgdHJhbnNtaXR0ZWQvcmVjZWl2ZWQgd2l0aCB0aGUgTVNCIGZpcnN0LCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xsb3dpbmcgdGhlIHN0YXJ0IGJpdCAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUNfQUREUkVTU19ERVRFQ1QgQWRkcmVzcyBMZW5ndGggRGV0ZWN0aW9uDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX0xQVUFSVF9BRERSRVNTX0RFVEVDVF80QiBcDQotICAweDAwMDAwMDAwVSAvKiE8IDQtYml0IGFkZHJlc3MgZGV0ZWN0aW9uIG1ldGhvZCBzZWxlY3RlZCAqLw0KLSNkZWZpbmUgTExfTFBVQVJUX0FERFJFU1NfREVURUNUXzdCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIFVTQVJUX0NSMl9BRERNNyAvKiE8IDctYml0IGFkZHJlc3MgZGV0ZWN0aW9uIChpbiA4LWJpdCBkYXRhIG1vZGUpIG1ldGhvZCBcDQotICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX0VDX0hXQ09OVFJPTCBIYXJkd2FyZSBDb250cm9sDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX0xQVUFSVF9IV0NPTlRST0xfTk9ORSBcDQotICAweDAwMDAwMDAwVSAvKiE8IENUUyBhbmQgUlRTIGhhcmR3YXJlIGZsb3cgY29udHJvbCBkaXNhYmxlZCAqLw0KLSNkZWZpbmUgTExfTFBVQVJUX0hXQ09OVFJPTF9SVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgVVNBUlRfQ1IzX1JUU0UgLyohPCBSVFMgb3V0cHV0IGVuYWJsZWQsIGRhdGEgaXMgb25seSByZXF1ZXN0ZWQgXA0KLSAgICAgICAgICAgICAgICAgICAgICB3aGVuIHRoZXJlIGlzIHNwYWNlIGluIHRoZSByZWNlaXZlIGJ1ZmZlciAgKi8NCi0jZGVmaW5lIExMX0xQVUFSVF9IV0NPTlRST0xfQ1RTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIFVTQVJUX0NSM19DVFNFIC8qITwgQ1RTIG1vZGUgZW5hYmxlZCwgZGF0YSBpcyBvbmx5IHRyYW5zbWl0dGVkIFwNCi0gICAgICAgICAgICAgICAgICAgICAgd2hlbiB0aGUgbkNUUyBpbnB1dCBpcyBhc3NlcnRlZCAodGllZCB0byAwKSovDQotI2RlZmluZSBMTF9MUFVBUlRfSFdDT05UUk9MX1JUU19DVFMgXA0KLSAgKFVTQVJUX0NSM19SVFNFIHwgICAgICAgICAgICAgICAgIFwNCi0gICBVU0FSVF9DUjNfQ1RTRSkgLyohPCBDVFMgYW5kIFJUUyBoYXJkd2FyZSBmbG93IGNvbnRyb2wgZW5hYmxlZCAgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX0VDX1dBS0VVUF9PTiBXYWtldXAgQWN0aXZhdGlvbg0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9MUFVBUlRfV0FLRVVQX09OX0FERFJFU1MgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBXYWtlIHVwIGFjdGl2ZSBvbiBhZGRyZXNzIG1hdGNoICovDQotI2RlZmluZSBMTF9MUFVBUlRfV0FLRVVQX09OX1NUQVJUQklUIFwNCi0gIFVTQVJUX0NSM19XVVNfMSAvKiE8IFdha2UgdXAgYWN0aXZlIG9uIFN0YXJ0IGJpdCBkZXRlY3Rpb24gKi8NCi0jZGVmaW5lIExMX0xQVUFSVF9XQUtFVVBfT05fUlhORSBcDQotICAoVVNBUlRfQ1IzX1dVU18wIHwgVVNBUlRfQ1IzX1dVU18xKSAvKiE8IFdha2UgdXAgYWN0aXZlIG9uIFJYTkUgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX0VDX0RFX1BPTEFSSVRZIERyaXZlciBFbmFibGUgUG9sYXJpdHkNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfTFBVQVJUX0RFX1BPTEFSSVRZX0hJR0ggICAgICAgICAgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBERSBzaWduYWwgaXMgYWN0aXZlIGhpZ2ggXA0KLSAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9MUFVBUlRfREVfUE9MQVJJVFlfTE9XICAgICAgICAgICAgXA0KLSAgVVNBUlRfQ1IzX0RFUCAvKiE8IERFIHNpZ25hbCBpcyBhY3RpdmUgbG93IFwNCi0gICAgICAgICAgICAgICAgICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIExQVUFSVF9MTF9FQ19ETUFfUkVHX0RBVEEgRE1BIFJlZ2lzdGVyIERhdGENCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfTFBVQVJUX0RNQV9SRUdfREFUQV9UUkFOU01JVCBcDQotICAweDAwMDAwMDAwVSAvKiE8IEdldCBhZGRyZXNzIG9mIGRhdGEgcmVnaXN0ZXIgdXNlZCBmb3IgdHJhbnNtaXNzaW9uICovDQotI2RlZmluZSBMTF9MUFVBUlRfRE1BX1JFR19EQVRBX1JFQ0VJVkUgXA0KLSAgMHgwMDAwMDAwMVUgLyohPCBHZXQgYWRkcmVzcyBvZiBkYXRhIHJlZ2lzdGVyIHVzZWQgZm9yIHJlY2VwdGlvbiAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX0V4cG9ydGVkX01hY3JvcyBMUFVBUlQgRXhwb3J0ZWQgTWFjcm9zDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIExQVUFSVF9MTF9FTV9XUklURV9SRUFEIENvbW1vbiBXcml0ZSBhbmQgcmVhZCByZWdpc3RlcnMgTWFjcm9zDQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFdyaXRlIGEgdmFsdWUgaW4gTFBVQVJUIHJlZ2lzdGVyDQotICogQHBhcmFtICBfX0lOU1RBTkNFX18gTFBVQVJUIEluc3RhbmNlDQotICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHdyaXR0ZW4NCi0gKiBAcGFyYW0gIF9fVkFMVUVfXyBWYWx1ZSB0byBiZSB3cml0dGVuIGluIHRoZSByZWdpc3Rlcg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgTExfTFBVQVJUX1dyaXRlUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXywgX19WQUxVRV9fKSBcDQotICBXUklURV9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fLCAoX19WQUxVRV9fKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJlYWQgYSB2YWx1ZSBpbiBMUFVBUlQgcmVnaXN0ZXINCi0gKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgcmVhZA0KLSAqIEByZXR2YWwgUmVnaXN0ZXIgdmFsdWUNCi0gKi8NCi0jZGVmaW5lIExMX0xQVUFSVF9SZWFkUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXykgUkVBRF9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fKQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRU1fRXhwb3J0ZWRfTWFjcm9zX0hlbHBlciBIZWxwZXIgTWFjcm9zDQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENvbXB1dGUgTFBVQVJURElWIHZhbHVlIGFjY29yZGluZyB0byBQZXJpcGhlcmFsIENsb2NrIGFuZA0KLSAqICAgICAgICAgZXhwZWN0ZWQgQmF1ZCBSYXRlICgyMC1iaXQgdmFsdWUgb2YgTFBVQVJURElWIGlzIHJldHVybmVkKQ0KLSAqIEBwYXJhbSAgX19QRVJJUEhDTEtfXyBQZXJpcGhlcmFsIENsb2NrIGZyZXF1ZW5jeSB1c2VkIGZvciBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcGFyYW0gIF9fUFJFU0NBTEVSX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjEwDQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYxMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMTYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjMyDQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVY2NA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMTI4DQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYyNTYNCi0gKiBAcGFyYW0gIF9fQkFVRFJBVEVfXyBCYXVkIFJhdGUgdmFsdWUgdG8gYWNoaWV2ZQ0KLSAqIEByZXR2YWwgTFBVQVJURElWIHZhbHVlIHRvIGJlIHVzZWQgZm9yIEJSUiByZWdpc3RlciBmaWxsaW5nDQotICovDQotI2RlZmluZSBfX0xMX0xQVUFSVF9ESVYoX19QRVJJUEhDTEtfXywgX19QUkVTQ0FMRVJfXywgX19CQVVEUkFURV9fKSAgICAgIFwNCi0gICh1aW50MzJfdCkoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICgoKCgodWludDY0X3QpKF9fUEVSSVBIQ0xLX18pIC8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICAgICh1aW50NjRfdCkoTFBVQVJUX1BSRVNDQUxFUl9UQUJbKHVpbnQxNl90KShfX1BSRVNDQUxFUl9fKV0pKSAqIFwNCi0gICAgICAgICBMUFVBUlRfTFBVQVJURElWX0ZSRVFfTVVMKSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgKHVpbnQzMl90KSgoX19CQVVEUkFURV9fKSAvIDJVKSkgLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgIChfX0JBVURSQVRFX18pKSAmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICBMUFVBUlRfQlJSX01BU0spDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRXhwb3J0ZWRfRnVuY3Rpb25zIExQVUFSVCBFeHBvcnRlZCBGdW5jdGlvbnMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX0VGX0NvbmZpZ3VyYXRpb24gQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgTFBVQVJUIEVuYWJsZQ0KLSAqIEBybXRvbGwgQ1IxICAgICAgICAgIFVFICAgICAgICAgICAgTExfTFBVQVJUX0VuYWJsZQ0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRW5hYmxlKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsNCi0gIFNFVF9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfVUUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIExQVUFSVCBEaXNhYmxlDQotICogQG5vdGUgICBXaGVuIExQVUFSVCBpcyBkaXNhYmxlZCwgTFBVQVJUIHByZXNjYWxlcnMgYW5kIG91dHB1dHMgYXJlIHN0b3BwZWQNCi0gKiBpbW1lZGlhdGVseSwgYW5kIGN1cnJlbnQgb3BlcmF0aW9ucyBhcmUgZGlzY2FyZGVkLiBUaGUgY29uZmlndXJhdGlvbiBvZiB0aGUNCi0gKiBMUFVBUlQgaXMga2VwdCwgYnV0IGFsbCB0aGUgc3RhdHVzIGZsYWdzLCBpbiB0aGUgTFBVQVJUeF9JU1IgYXJlIHNldCB0byB0aGVpcg0KLSAqIGRlZmF1bHQgdmFsdWVzLg0KLSAqIEBub3RlICAgSW4gb3JkZXIgdG8gZ28gaW50byBsb3ctcG93ZXIgbW9kZSB3aXRob3V0IGdlbmVyYXRpbmcgZXJyb3JzIG9uIHRoZQ0KLSAqIGxpbmUsIHRoZSBURSBiaXQgbXVzdCBiZSByZXNldCBiZWZvcmUgYW5kIHRoZSBzb2Z0d2FyZSBtdXN0IHdhaXQgZm9yIHRoZSBUQw0KLSAqIGJpdCBpbiB0aGUgTFBVQVJUX0lTUiB0byBiZSBzZXQgYmVmb3JlIHJlc2V0dGluZyB0aGUgVUUgYml0LiBUaGUgRE1BIHJlcXVlc3RzDQotICogYXJlIGFsc28gcmVzZXQgd2hlbiBVRSA9IDAgc28gdGhlIERNQSBjaGFubmVsIG11c3QgYmUgZGlzYWJsZWQgYmVmb3JlDQotICogcmVzZXR0aW5nIHRoZSBVRSBiaXQuDQotICogQHJtdG9sbCBDUjEgICAgICAgICAgVUUgICAgICAgICAgICBMTF9MUFVBUlRfRGlzYWJsZQ0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRGlzYWJsZShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7DQotICBDTEVBUl9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfVUUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEluZGljYXRlIGlmIExQVUFSVCBpcyBlbmFibGVkDQotICogQHJtdG9sbCBDUjEgICAgICAgICAgVUUgICAgICAgICAgICBMTF9MUFVBUlRfSXNFbmFibGVkDQotICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfSXNFbmFibGVkKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX1VFKSA9PSAoVVNBUlRfQ1IxX1VFKSkgPyAxVUwgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEZJRk8gTW9kZSBFbmFibGUNCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBGSUZPRU4gICAgICAgIExMX0xQVUFSVF9FbmFibGVGSUZPDQotICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9FbmFibGVGSUZPKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsNCi0gIFNFVF9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfRklGT0VOKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBGSUZPIE1vZGUgRGlzYWJsZQ0KLSAqIEBybXRvbGwgQ1IxICAgICAgICAgIEZJRk9FTiAgICAgICAgTExfTFBVQVJUX0Rpc2FibGVGSUZPDQotICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9EaXNhYmxlRklGTyhVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7DQotICBDTEVBUl9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfRklGT0VOKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBJbmRpY2F0ZSBpZiBGSUZPIE1vZGUgaXMgZW5hYmxlZA0KLSAqIEBybXRvbGwgQ1IxICAgICAgICAgIEZJRk9FTiAgICAgICAgTExfTFBVQVJUX0lzRW5hYmxlZEZJRk8NCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0VuYWJsZWRGSUZPKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX0ZJRk9FTikgPT0gKFVTQVJUX0NSMV9GSUZPRU4pKQ0KLSAgICAgICAgICAgICAgPyAxVUwNCi0gICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDb25maWd1cmUgVFggRklGTyBUaHJlc2hvbGQNCi0gKiBAcm10b2xsIENSMyAgICAgICAgICBUWEZUQ0ZHICAgICAgIExMX0xQVUFSVF9TZXRUWEZJRk9UaHJlc2hvbGQNCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHBhcmFtICBUaHJlc2hvbGQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF8xXzgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF8xXzQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF8xXzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF8zXzQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF83XzgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF84XzgNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfU2V0VFhGSUZPVGhyZXNob2xkKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaHJlc2hvbGQpIHsNCi0gIEFUT01JQ19NT0RJRllfUkVHKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX1RYRlRDRkcsDQotICAgICAgICAgICAgICAgICAgICBUaHJlc2hvbGQgPDwgVVNBUlRfQ1IzX1RYRlRDRkdfUG9zKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBSZXR1cm4gVFggRklGTyBUaHJlc2hvbGQgQ29uZmlndXJhdGlvbg0KLSAqIEBybXRvbGwgQ1IzICAgICAgICAgIFRYRlRDRkcgICAgICAgTExfTFBVQVJUX0dldFRYRklGT1RocmVzaG9sZA0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0ZJRk9USFJFU0hPTERfMV84DQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0ZJRk9USFJFU0hPTERfMV80DQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0ZJRk9USFJFU0hPTERfMV8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0ZJRk9USFJFU0hPTERfM180DQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0ZJRk9USFJFU0hPTERfN184DQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0ZJRk9USFJFU0hPTERfOF84DQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9HZXRUWEZJRk9UaHJlc2hvbGQoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfVFhGVENGRykgPj4NCi0gICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSM19UWEZUQ0ZHX1Bvcyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ29uZmlndXJlIFJYIEZJRk8gVGhyZXNob2xkDQotICogQHJtdG9sbCBDUjMgICAgICAgICAgUlhGVENGRyAgICAgICBMTF9MUFVBUlRfU2V0UlhGSUZPVGhyZXNob2xkDQotICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQ0KLSAqIEBwYXJhbSAgVGhyZXNob2xkIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0ZJRk9USFJFU0hPTERfMV84DQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0ZJRk9USFJFU0hPTERfMV80DQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0ZJRk9USFJFU0hPTERfMV8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0ZJRk9USFJFU0hPTERfM180DQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0ZJRk9USFJFU0hPTERfN184DQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0ZJRk9USFJFU0hPTERfOF84DQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX1NldFJYRklGT1RocmVzaG9sZChVU0FSVF9UeXBlRGVmICpMUFVBUlR4LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGhyZXNob2xkKSB7DQotICBBVE9NSUNfTU9ESUZZX1JFRyhMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19SWEZUQ0ZHLA0KLSAgICAgICAgICAgICAgICAgICAgVGhyZXNob2xkIDw8IFVTQVJUX0NSM19SWEZUQ0ZHX1Bvcyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmV0dXJuIFJYIEZJRk8gVGhyZXNob2xkIENvbmZpZ3VyYXRpb24NCi0gKiBAcm10b2xsIENSMyAgICAgICAgICBSWEZUQ0ZHICAgICAgIExMX0xQVUFSVF9HZXRSWEZJRk9UaHJlc2hvbGQNCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzFfOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzFfNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzFfMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzNfNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzdfOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzhfOA0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfR2V0UlhGSUZPVGhyZXNob2xkKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX1JYRlRDRkcpID4+DQotICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjNfUlhGVENGR19Qb3MpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENvbmZpZ3VyZSBUWCBhbmQgUlggRklGT3MgVGhyZXNob2xkDQotICogQHJtdG9sbCBDUjMgICAgICAgICAgVFhGVENGRyAgICAgICBMTF9MUFVBUlRfQ29uZmlnRklGT3NUaHJlc2hvbGRcbg0KLSAqICAgICAgICAgQ1IzICAgICAgICAgIFJYRlRDRkcgICAgICAgTExfTFBVQVJUX0NvbmZpZ0ZJRk9zVGhyZXNob2xkDQotICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQ0KLSAqIEBwYXJhbSAgVFhUaHJlc2hvbGQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF8xXzgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF8xXzQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF8xXzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF8zXzQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF83XzgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF84XzgNCi0gKiBAcGFyYW0gIFJYVGhyZXNob2xkIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0ZJRk9USFJFU0hPTERfMV84DQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0ZJRk9USFJFU0hPTERfMV80DQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0ZJRk9USFJFU0hPTERfMV8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0ZJRk9USFJFU0hPTERfM180DQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0ZJRk9USFJFU0hPTERfN184DQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0ZJRk9USFJFU0hPTERfOF84DQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0NvbmZpZ0ZJRk9zVGhyZXNob2xkKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRYVGhyZXNob2xkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBSWFRocmVzaG9sZCkgew0KLSAgQVRPTUlDX01PRElGWV9SRUcoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfVFhGVENGRyB8IFVTQVJUX0NSM19SWEZUQ0ZHLA0KLSAgICAgICAgICAgICAgICAgICAgKFRYVGhyZXNob2xkIDw8IFVTQVJUX0NSM19UWEZUQ0ZHX1BvcykgfA0KLSAgICAgICAgICAgICAgICAgICAgICAgIChSWFRocmVzaG9sZCA8PCBVU0FSVF9DUjNfUlhGVENGR19Qb3MpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBMUFVBUlQgZW5hYmxlZCBpbiBTVE9QIE1vZGUNCi0gKiBAbm90ZSAgIFdoZW4gdGhpcyBmdW5jdGlvbiBpcyBlbmFibGVkLCBMUFVBUlQgaXMgYWJsZSB0byB3YWtlIHVwIHRoZSBNQ1UgZnJvbQ0KLSAqIFN0b3AgbW9kZSwgcHJvdmlkZWQgdGhhdCBMUFVBUlQgY2xvY2sgc2VsZWN0aW9uIGlzIEhTSSBvciBMU0UgaW4gUkNDLg0KLSAqIEBybXRvbGwgQ1IxICAgICAgICAgIFVFU00gICAgICAgICAgTExfTFBVQVJUX0VuYWJsZUluU3RvcE1vZGUNCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0VuYWJsZUluU3RvcE1vZGUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgew0KLSAgQVRPTUlDX1NFVF9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfVUVTTSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgTFBVQVJUIGRpc2FibGVkIGluIFNUT1AgTW9kZQ0KLSAqIEBub3RlICAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGRpc2FibGVkLCBMUFVBUlQgaXMgbm90IGFibGUgdG8gd2FrZSB1cCB0aGUgTUNVDQotICogZnJvbSBTdG9wIG1vZGUNCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBVRVNNICAgICAgICAgIExMX0xQVUFSVF9EaXNhYmxlSW5TdG9wTW9kZQ0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRGlzYWJsZUluU3RvcE1vZGUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgew0KLSAgQVRPTUlDX0NMRUFSX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9VRVNNKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBJbmRpY2F0ZSBpZiBMUFVBUlQgaXMgZW5hYmxlZCBpbiBTVE9QIE1vZGUNCi0gKiAgICAgICAgIChhYmxlIHRvIHdha2UgdXAgTUNVIGZyb20gU3RvcCBtb2RlIG9yIG5vdCkNCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBVRVNNICAgICAgICAgIExMX0xQVUFSVF9Jc0VuYWJsZWRJblN0b3BNb2RlDQotICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfSXNFbmFibGVkSW5TdG9wTW9kZShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9VRVNNKSA9PSAoVVNBUlRfQ1IxX1VFU00pKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJlY2VpdmVyIEVuYWJsZSAoUmVjZWl2ZXIgaXMgZW5hYmxlZCBhbmQgYmVnaW5zIHNlYXJjaGluZyBmb3IgYSBzdGFydA0KLSAqIGJpdCkNCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBSRSAgICAgICAgICAgIExMX0xQVUFSVF9FbmFibGVEaXJlY3Rpb25SeA0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRW5hYmxlRGlyZWN0aW9uUngoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgew0KLSAgQVRPTUlDX1NFVF9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUkUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJlY2VpdmVyIERpc2FibGUNCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBSRSAgICAgICAgICAgIExMX0xQVUFSVF9EaXNhYmxlRGlyZWN0aW9uUngNCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0Rpc2FibGVEaXJlY3Rpb25SeChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7DQotICBBVE9NSUNfQ0xFQVJfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX1JFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBUcmFuc21pdHRlciBFbmFibGUNCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBURSAgICAgICAgICAgIExMX0xQVUFSVF9FbmFibGVEaXJlY3Rpb25UeA0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRW5hYmxlRGlyZWN0aW9uVHgoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgew0KLSAgQVRPTUlDX1NFVF9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfVEUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFRyYW5zbWl0dGVyIERpc2FibGUNCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBURSAgICAgICAgICAgIExMX0xQVUFSVF9EaXNhYmxlRGlyZWN0aW9uVHgNCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0Rpc2FibGVEaXJlY3Rpb25UeChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7DQotICBBVE9NSUNfQ0xFQVJfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX1RFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDb25maWd1cmUgc2ltdWx0YW5lb3VzbHkgZW5hYmxlZC9kaXNhYmxlZCBzdGF0ZXMNCi0gKiAgICAgICAgIG9mIFRyYW5zbWl0dGVyIGFuZCBSZWNlaXZlcg0KLSAqIEBybXRvbGwgQ1IxICAgICAgICAgIFJFICAgICAgICAgICAgTExfTFBVQVJUX1NldFRyYW5zZmVyRGlyZWN0aW9uXG4NCi0gKiAgICAgICAgIENSMSAgICAgICAgICBURSAgICAgICAgICAgIExMX0xQVUFSVF9TZXRUcmFuc2ZlckRpcmVjdGlvbg0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcGFyYW0gIFRyYW5zZmVyRGlyZWN0aW9uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0RJUkVDVElPTl9OT05FDQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0RJUkVDVElPTl9SWA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9ESVJFQ1RJT05fVFgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRElSRUNUSU9OX1RYX1JYDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX1NldFRyYW5zZmVyRGlyZWN0aW9uKA0KLSAgICBVU0FSVF9UeXBlRGVmICpMUFVBUlR4LCB1aW50MzJfdCBUcmFuc2ZlckRpcmVjdGlvbikgew0KLSAgQVRPTUlDX01PRElGWV9SRUcoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUkUgfCBVU0FSVF9DUjFfVEUsDQotICAgICAgICAgICAgICAgICAgICBUcmFuc2ZlckRpcmVjdGlvbik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmV0dXJuIGVuYWJsZWQvZGlzYWJsZWQgc3RhdGVzIG9mIFRyYW5zbWl0dGVyIGFuZCBSZWNlaXZlcg0KLSAqIEBybXRvbGwgQ1IxICAgICAgICAgIFJFICAgICAgICAgICAgTExfTFBVQVJUX0dldFRyYW5zZmVyRGlyZWN0aW9uXG4NCi0gKiAgICAgICAgIENSMSAgICAgICAgICBURSAgICAgICAgICAgIExMX0xQVUFSVF9HZXRUcmFuc2ZlckRpcmVjdGlvbg0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0RJUkVDVElPTl9OT05FDQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0RJUkVDVElPTl9SWA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9ESVJFQ1RJT05fVFgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRElSRUNUSU9OX1RYX1JYDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90DQotTExfTFBVQVJUX0dldFRyYW5zZmVyRGlyZWN0aW9uKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX1JFIHwgVVNBUlRfQ1IxX1RFKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ29uZmlndXJlIFBhcml0eSAoZW5hYmxlZC9kaXNhYmxlZCBhbmQgcGFyaXR5IG1vZGUgaWYgZW5hYmxlZCkNCi0gKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gc2VsZWN0cyBpZiBoYXJkd2FyZSBwYXJpdHkgY29udHJvbCAoZ2VuZXJhdGlvbiBhbmQNCi0gKiBkZXRlY3Rpb24pIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuIFdoZW4gdGhlIHBhcml0eSBjb250cm9sIGlzIGVuYWJsZWQgKE9kZCBvcg0KLSAqIEV2ZW4pLCBjb21wdXRlZCBwYXJpdHkgYml0IGlzIGluc2VydGVkIGF0IHRoZSBNU0IgcG9zaXRpb24gKGRlcGVuZGluZyBvbiBkYXRhDQotICogd2lkdGgpIGFuZCBwYXJpdHkgaXMgY2hlY2tlZCBvbiB0aGUgcmVjZWl2ZWQgZGF0YS4NCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBQUyAgICAgICAgICAgIExMX0xQVUFSVF9TZXRQYXJpdHlcbg0KLSAqICAgICAgICAgQ1IxICAgICAgICAgIFBDRSAgICAgICAgICAgTExfTFBVQVJUX1NldFBhcml0eQ0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcGFyYW0gIFBhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QQVJJVFlfTk9ORQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QQVJJVFlfRVZFTg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QQVJJVFlfT0REDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX1NldFBhcml0eShVU0FSVF9UeXBlRGVmICpMUFVBUlR4LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUGFyaXR5KSB7DQotICBNT0RJRllfUkVHKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX1BTIHwgVVNBUlRfQ1IxX1BDRSwgUGFyaXR5KTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBSZXR1cm4gUGFyaXR5IGNvbmZpZ3VyYXRpb24gKGVuYWJsZWQvZGlzYWJsZWQgYW5kIHBhcml0eSBtb2RlIGlmDQotICogZW5hYmxlZCkNCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBQUyAgICAgICAgICAgIExMX0xQVUFSVF9HZXRQYXJpdHlcbg0KLSAqICAgICAgICAgQ1IxICAgICAgICAgIFBDRSAgICAgICAgICAgTExfTFBVQVJUX0dldFBhcml0eQ0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BBUklUWV9OT05FDQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BBUklUWV9FVkVODQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BBUklUWV9PREQNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0dldFBhcml0eShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9QUyB8IFVTQVJUX0NSMV9QQ0UpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZXQgUmVjZWl2ZXIgV2FrZSBVcCBtZXRob2QgZnJvbSBNdXRlIG1vZGUuDQotICogQHJtdG9sbCBDUjEgICAgICAgICAgV0FLRSAgICAgICAgICBMTF9MUFVBUlRfU2V0V2FrZVVwTWV0aG9kDQotICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQ0KLSAqIEBwYXJhbSAgTWV0aG9kIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1dBS0VVUF9JRExFTElORQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9XQUtFVVBfQUREUkVTU01BUksNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfU2V0V2FrZVVwTWV0aG9kKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBNZXRob2QpIHsNCi0gIE1PRElGWV9SRUcoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfV0FLRSwgTWV0aG9kKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBSZXR1cm4gUmVjZWl2ZXIgV2FrZSBVcCBtZXRob2QgZnJvbSBNdXRlIG1vZGUNCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBXQUtFICAgICAgICAgIExMX0xQVUFSVF9HZXRXYWtlVXBNZXRob2QNCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9XQUtFVVBfSURMRUxJTkUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfV0FLRVVQX0FERFJFU1NNQVJLDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9HZXRXYWtlVXBNZXRob2QoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfV0FLRSkpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCBXb3JkIGxlbmd0aCAobmIgb2YgZGF0YSBiaXRzLCBleGNsdWRpbmcgc3RhcnQgYW5kIHN0b3AgYml0cykNCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBNICAgICAgICAgICAgIExMX0xQVUFSVF9TZXREYXRhV2lkdGgNCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHBhcmFtICBEYXRhV2lkdGggVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfREFUQVdJRFRIXzdCDQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0RBVEFXSURUSF84Qg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9EQVRBV0lEVEhfOUINCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfU2V0RGF0YVdpZHRoKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBEYXRhV2lkdGgpIHsNCi0gIE1PRElGWV9SRUcoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfTSwgRGF0YVdpZHRoKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBSZXR1cm4gV29yZCBsZW5ndGggKGkuZS4gbmIgb2YgZGF0YSBiaXRzLCBleGNsdWRpbmcgc3RhcnQgYW5kIHN0b3ANCi0gKiBiaXRzKQ0KLSAqIEBybXRvbGwgQ1IxICAgICAgICAgIE0gICAgICAgICAgICAgTExfTFBVQVJUX0dldERhdGFXaWR0aA0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0RBVEFXSURUSF83Qg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9EQVRBV0lEVEhfOEINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfREFUQVdJRFRIXzlCDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9HZXREYXRhV2lkdGgoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfTSkpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEFsbG93IHN3aXRjaCBiZXR3ZWVuIE11dGUgTW9kZSBhbmQgQWN0aXZlIG1vZGUNCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBNTUUgICAgICAgICAgIExMX0xQVUFSVF9FbmFibGVNdXRlTW9kZQ0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRW5hYmxlTXV0ZU1vZGUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgew0KLSAgQVRPTUlDX1NFVF9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfTU1FKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBQcmV2ZW50IE11dGUgTW9kZSB1c2UuIFNldCBSZWNlaXZlciBpbiBhY3RpdmUgbW9kZSBwZXJtYW5lbnRseS4NCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBNTUUgICAgICAgICAgIExMX0xQVUFSVF9EaXNhYmxlTXV0ZU1vZGUNCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0Rpc2FibGVNdXRlTW9kZShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7DQotICBBVE9NSUNfQ0xFQVJfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX01NRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSW5kaWNhdGUgaWYgc3dpdGNoIGJldHdlZW4gTXV0ZSBNb2RlIGFuZCBBY3RpdmUgbW9kZSBpcyBhbGxvd2VkDQotICogQHJtdG9sbCBDUjEgICAgICAgICAgTU1FICAgICAgICAgICBMTF9MUFVBUlRfSXNFbmFibGVkTXV0ZU1vZGUNCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0VuYWJsZWRNdXRlTW9kZShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9NTUUpID09IChVU0FSVF9DUjFfTU1FKSkgPyAxVUwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ29uZmlndXJlIENsb2NrIHNvdXJjZSBwcmVzY2FsZXIgZm9yIGJhdWRyYXRlIGdlbmVyYXRvciBhbmQNCi0gKiBvdmVyc2FtcGxpbmcNCi0gKiBAcm10b2xsIFBSRVNDICAgICAgICBQUkVTQ0FMRVIgICAgIExMX0xQVUFSVF9TZXRQcmVzY2FsZXINCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHBhcmFtICBQcmVzY2FsZXJWYWx1ZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMTANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjEyDQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYxNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjY0DQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYxMjgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjI1Ng0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9TZXRQcmVzY2FsZXIoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFByZXNjYWxlclZhbHVlKSB7DQotICBNT0RJRllfUkVHKExQVUFSVHgtPlBSRVNDLCBVU0FSVF9QUkVTQ19QUkVTQ0FMRVIsICh1aW50MTZfdClQcmVzY2FsZXJWYWx1ZSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmV0cmlldmUgdGhlIENsb2NrIHNvdXJjZSBwcmVzY2FsZXIgZm9yIGJhdWRyYXRlIGdlbmVyYXRvciBhbmQNCi0gKiBvdmVyc2FtcGxpbmcNCi0gKiBAcm10b2xsIFBSRVNDICAgICAgICBQUkVTQ0FMRVIgICAgIExMX0xQVUFSVF9HZXRQcmVzY2FsZXINCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMTANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjEyDQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYxNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjY0DQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYxMjgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjI1Ng0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfR2V0UHJlc2NhbGVyKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKExQVUFSVHgtPlBSRVNDLCBVU0FSVF9QUkVTQ19QUkVTQ0FMRVIpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZXQgdGhlIGxlbmd0aCBvZiB0aGUgc3RvcCBiaXRzDQotICogQHJtdG9sbCBDUjIgICAgICAgICAgU1RPUCAgICAgICAgICBMTF9MUFVBUlRfU2V0U3RvcEJpdHNMZW5ndGgNCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHBhcmFtICBTdG9wQml0cyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9TVE9QQklUU18xDQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1NUT1BCSVRTXzINCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfU2V0U3RvcEJpdHNMZW5ndGgoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgU3RvcEJpdHMpIHsNCi0gIE1PRElGWV9SRUcoTFBVQVJUeC0+Q1IyLCBVU0FSVF9DUjJfU1RPUCwgU3RvcEJpdHMpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJldHJpZXZlIHRoZSBsZW5ndGggb2YgdGhlIHN0b3AgYml0cw0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgIFNUT1AgICAgICAgICAgTExfTFBVQVJUX0dldFN0b3BCaXRzTGVuZ3RoDQotICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfU1RPUEJJVFNfMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9TVE9QQklUU18yDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9HZXRTdG9wQml0c0xlbmd0aChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChMUFVBUlR4LT5DUjIsIFVTQVJUX0NSMl9TVE9QKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ29uZmlndXJlIENoYXJhY3RlciBmcmFtZSBmb3JtYXQgKERhdGF3aWR0aCwgUGFyaXR5IGNvbnRyb2wsIFN0b3ANCi0gKiBCaXRzKQ0KLSAqIEBub3RlICAgQ2FsbCBvZiB0aGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gZm9sbG93aW5nIGZ1bmN0aW9uIGNhbGwNCi0gKiBzZXF1ZW5jZSA6DQotICogICAgICAgICAtIERhdGEgV2lkdGggY29uZmlndXJhdGlvbiB1c2luZyBAcmVmIExMX0xQVUFSVF9TZXREYXRhV2lkdGgoKQ0KLSAqIGZ1bmN0aW9uDQotICogICAgICAgICAtIFBhcml0eSBDb250cm9sIGFuZCBtb2RlIGNvbmZpZ3VyYXRpb24gdXNpbmcgQHJlZg0KLSAqIExMX0xQVUFSVF9TZXRQYXJpdHkoKSBmdW5jdGlvbg0KLSAqICAgICAgICAgLSBTdG9wIGJpdHMgY29uZmlndXJhdGlvbiB1c2luZyBAcmVmIExMX0xQVUFSVF9TZXRTdG9wQml0c0xlbmd0aCgpDQotICogZnVuY3Rpb24NCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBQUyAgICAgICAgICAgIExMX0xQVUFSVF9Db25maWdDaGFyYWN0ZXJcbg0KLSAqICAgICAgICAgQ1IxICAgICAgICAgIFBDRSAgICAgICAgICAgTExfTFBVQVJUX0NvbmZpZ0NoYXJhY3RlclxuDQotICogICAgICAgICBDUjEgICAgICAgICAgTSAgICAgICAgICAgICBMTF9MUFVBUlRfQ29uZmlnQ2hhcmFjdGVyXG4NCi0gKiAgICAgICAgIENSMiAgICAgICAgICBTVE9QICAgICAgICAgIExMX0xQVUFSVF9Db25maWdDaGFyYWN0ZXINCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHBhcmFtICBEYXRhV2lkdGggVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfREFUQVdJRFRIXzdCDQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0RBVEFXSURUSF84Qg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9EQVRBV0lEVEhfOUINCi0gKiBAcGFyYW0gIFBhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QQVJJVFlfTk9ORQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QQVJJVFlfRVZFTg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QQVJJVFlfT0REDQotICogQHBhcmFtICBTdG9wQml0cyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9TVE9QQklUU18xDQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1NUT1BCSVRTXzINCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfQ29uZmlnQ2hhcmFjdGVyKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBEYXRhV2lkdGgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQYXJpdHksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBTdG9wQml0cykgew0KLSAgTU9ESUZZX1JFRyhMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9QUyB8IFVTQVJUX0NSMV9QQ0UgfCBVU0FSVF9DUjFfTSwNCi0gICAgICAgICAgICAgUGFyaXR5IHwgRGF0YVdpZHRoKTsNCi0gIE1PRElGWV9SRUcoTFBVQVJUeC0+Q1IyLCBVU0FSVF9DUjJfU1RPUCwgU3RvcEJpdHMpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENvbmZpZ3VyZSBUWC9SWCBwaW5zIHN3YXBwaW5nIHNldHRpbmcuDQotICogQHJtdG9sbCBDUjIgICAgICAgICAgU1dBUCAgICAgICAgICBMTF9MUFVBUlRfU2V0VFhSWFN3YXANCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHBhcmFtICBTd2FwQ29uZmlnIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1RYUlhfU1RBTkRBUkQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfVFhSWF9TV0FQUEVEDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX1NldFRYUlhTd2FwKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFN3YXBDb25maWcpIHsNCi0gIE1PRElGWV9SRUcoTFBVQVJUeC0+Q1IyLCBVU0FSVF9DUjJfU1dBUCwgU3dhcENvbmZpZyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmV0cmlldmUgVFgvUlggcGlucyBzd2FwcGluZyBjb25maWd1cmF0aW9uLg0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgIFNXQVAgICAgICAgICAgTExfTFBVQVJUX0dldFRYUlhTd2FwDQotICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfVFhSWF9TVEFOREFSRA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9UWFJYX1NXQVBQRUQNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0dldFRYUlhTd2FwKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKExQVUFSVHgtPkNSMiwgVVNBUlRfQ1IyX1NXQVApKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDb25maWd1cmUgUlggcGluIGFjdGl2ZSBsZXZlbCBsb2dpYw0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgIFJYSU5WICAgICAgICAgTExfTFBVQVJUX1NldFJYUGluTGV2ZWwNCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHBhcmFtICBQaW5JbnZNZXRob2QgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUlhQSU5fTEVWRUxfU1RBTkRBUkQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUlhQSU5fTEVWRUxfSU5WRVJURUQNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfU2V0UlhQaW5MZXZlbChVU0FSVF9UeXBlRGVmICpMUFVBUlR4LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFBpbkludk1ldGhvZCkgew0KLSAgTU9ESUZZX1JFRyhMUFVBUlR4LT5DUjIsIFVTQVJUX0NSMl9SWElOViwgUGluSW52TWV0aG9kKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBSZXRyaWV2ZSBSWCBwaW4gYWN0aXZlIGxldmVsIGxvZ2ljIGNvbmZpZ3VyYXRpb24NCi0gKiBAcm10b2xsIENSMiAgICAgICAgICBSWElOViAgICAgICAgIExMX0xQVUFSVF9HZXRSWFBpbkxldmVsDQotICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUlhQSU5fTEVWRUxfU1RBTkRBUkQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUlhQSU5fTEVWRUxfSU5WRVJURUQNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0dldFJYUGluTGV2ZWwoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoTFBVQVJUeC0+Q1IyLCBVU0FSVF9DUjJfUlhJTlYpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDb25maWd1cmUgVFggcGluIGFjdGl2ZSBsZXZlbCBsb2dpYw0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgIFRYSU5WICAgICAgICAgTExfTFBVQVJUX1NldFRYUGluTGV2ZWwNCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHBhcmFtICBQaW5JbnZNZXRob2QgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfVFhQSU5fTEVWRUxfU1RBTkRBUkQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfVFhQSU5fTEVWRUxfSU5WRVJURUQNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfU2V0VFhQaW5MZXZlbChVU0FSVF9UeXBlRGVmICpMUFVBUlR4LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFBpbkludk1ldGhvZCkgew0KLSAgTU9ESUZZX1JFRyhMUFVBUlR4LT5DUjIsIFVTQVJUX0NSMl9UWElOViwgUGluSW52TWV0aG9kKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBSZXRyaWV2ZSBUWCBwaW4gYWN0aXZlIGxldmVsIGxvZ2ljIGNvbmZpZ3VyYXRpb24NCi0gKiBAcm10b2xsIENSMiAgICAgICAgICBUWElOViAgICAgICAgIExMX0xQVUFSVF9HZXRUWFBpbkxldmVsDQotICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfVFhQSU5fTEVWRUxfU1RBTkRBUkQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfVFhQSU5fTEVWRUxfSU5WRVJURUQNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0dldFRYUGluTGV2ZWwoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoTFBVQVJUeC0+Q1IyLCBVU0FSVF9DUjJfVFhJTlYpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDb25maWd1cmUgQmluYXJ5IGRhdGEgbG9naWMuDQotICoNCi0gKiBAbm90ZSAgIEFsbG93IHRvIGRlZmluZSBob3cgTG9naWNhbCBkYXRhIGZyb20gdGhlIGRhdGEgcmVnaXN0ZXIgYXJlDQotICogc2VuZC9yZWNlaXZlZCA6IGVpdGhlciBpbiBwb3NpdGl2ZS9kaXJlY3QgbG9naWMgKDE9SCwgMD1MKSBvciBpbg0KLSAqIG5lZ2F0aXZlL2ludmVyc2UgbG9naWMgKDE9TCwgMD1IKQ0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgIERBVEFJTlYgICAgICAgTExfTFBVQVJUX1NldEJpbmFyeURhdGFMb2dpYw0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcGFyYW0gIERhdGFMb2dpYyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9CSU5BUllfTE9HSUNfUE9TSVRJVkUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfQklOQVJZX0xPR0lDX05FR0FUSVZFDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX1NldEJpbmFyeURhdGFMb2dpYyhVU0FSVF9UeXBlRGVmICpMUFVBUlR4LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRGF0YUxvZ2ljKSB7DQotICBNT0RJRllfUkVHKExQVUFSVHgtPkNSMiwgVVNBUlRfQ1IyX0RBVEFJTlYsIERhdGFMb2dpYyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmV0cmlldmUgQmluYXJ5IGRhdGEgY29uZmlndXJhdGlvbg0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgIERBVEFJTlYgICAgICAgTExfTFBVQVJUX0dldEJpbmFyeURhdGFMb2dpYw0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0JJTkFSWV9MT0dJQ19QT1NJVElWRQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9CSU5BUllfTE9HSUNfTkVHQVRJVkUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0dldEJpbmFyeURhdGFMb2dpYyhVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChMUFVBUlR4LT5DUjIsIFVTQVJUX0NSMl9EQVRBSU5WKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ29uZmlndXJlIHRyYW5zZmVyIGJpdCBvcmRlciAoZWl0aGVyIExlc3Mgb3IgTW9zdCBTaWduaWZpY2FudCBCaXQNCi0gKiBGaXJzdCkNCi0gKiBAbm90ZSAgIE1TQiBGaXJzdCBtZWFucyBkYXRhIGlzIHRyYW5zbWl0dGVkL3JlY2VpdmVkIHdpdGggdGhlIE1TQiBmaXJzdCwNCi0gKiBmb2xsb3dpbmcgdGhlIHN0YXJ0IGJpdC4gTFNCIEZpcnN0IG1lYW5zIGRhdGEgaXMgdHJhbnNtaXR0ZWQvcmVjZWl2ZWQgd2l0aA0KLSAqIGRhdGEgYml0IDAgZmlyc3QsIGZvbGxvd2luZyB0aGUgc3RhcnQgYml0Lg0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgIE1TQkZJUlNUICAgICAgTExfTFBVQVJUX1NldFRyYW5zZmVyQml0T3JkZXINCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHBhcmFtICBCaXRPcmRlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9CSVRPUkRFUl9MU0JGSVJTVA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9CSVRPUkRFUl9NU0JGSVJTVA0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9TZXRUcmFuc2ZlckJpdE9yZGVyKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQml0T3JkZXIpIHsNCi0gIE1PRElGWV9SRUcoTFBVQVJUeC0+Q1IyLCBVU0FSVF9DUjJfTVNCRklSU1QsIEJpdE9yZGVyKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBSZXR1cm4gdHJhbnNmZXIgYml0IG9yZGVyIChlaXRoZXIgTGVzcyBvciBNb3N0IFNpZ25pZmljYW50IEJpdCBGaXJzdCkNCi0gKiBAbm90ZSAgIE1TQiBGaXJzdCBtZWFucyBkYXRhIGlzIHRyYW5zbWl0dGVkL3JlY2VpdmVkIHdpdGggdGhlIE1TQiBmaXJzdCwNCi0gKiBmb2xsb3dpbmcgdGhlIHN0YXJ0IGJpdC4gTFNCIEZpcnN0IG1lYW5zIGRhdGEgaXMgdHJhbnNtaXR0ZWQvcmVjZWl2ZWQgd2l0aA0KLSAqIGRhdGEgYml0IDAgZmlyc3QsIGZvbGxvd2luZyB0aGUgc3RhcnQgYml0Lg0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgIE1TQkZJUlNUICAgICAgTExfTFBVQVJUX0dldFRyYW5zZmVyQml0T3JkZXINCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9CSVRPUkRFUl9MU0JGSVJTVA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9CSVRPUkRFUl9NU0JGSVJTVA0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfR2V0VHJhbnNmZXJCaXRPcmRlcihVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChMUFVBUlR4LT5DUjIsIFVTQVJUX0NSMl9NU0JGSVJTVCkpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCBBZGRyZXNzIG9mIHRoZSBMUFVBUlQgbm9kZS4NCi0gKiBAbm90ZSAgIFRoaXMgaXMgdXNlZCBpbiBtdWx0aXByb2Nlc3NvciBjb21tdW5pY2F0aW9uIGR1cmluZyBNdXRlIG1vZGUgb3IgU3RvcA0KLSAqIG1vZGUsIGZvciB3YWtlIHVwIHdpdGggYWRkcmVzcyBtYXJrIGRldGVjdGlvbi4NCi0gKiBAbm90ZSAgIDRiaXRzIGFkZHJlc3Mgbm9kZSBpcyB1c2VkIHdoZW4gNC1iaXQgQWRkcmVzcyBEZXRlY3Rpb24gaXMgc2VsZWN0ZWQNCi0gKiBpbiBBRERNNy4gKGI3LWI0IHNob3VsZCBiZSBzZXQgdG8gMCkgOGJpdHMgYWRkcmVzcyBub2RlIGlzIHVzZWQgd2hlbiA3LWJpdA0KLSAqIEFkZHJlc3MgRGV0ZWN0aW9uIGlzIHNlbGVjdGVkIGluIEFERE03LiAoVGhpcyBpcyB1c2VkIGluIG11bHRpcHJvY2Vzc29yDQotICogY29tbXVuaWNhdGlvbiBkdXJpbmcgTXV0ZSBtb2RlIG9yIFN0b3AgbW9kZSwgZm9yIHdha2UgdXAgd2l0aCA3LWJpdCBhZGRyZXNzDQotICogbWFyayBkZXRlY3Rpb24uIFRoZSBNU0Igb2YgdGhlIGNoYXJhY3RlciBzZW50IGJ5IHRoZSB0cmFuc21pdHRlciBzaG91bGQgYmUNCi0gKiBlcXVhbCB0byAxLiBJdCBtYXkgYWxzbyBiZSB1c2VkIGZvciBjaGFyYWN0ZXIgZGV0ZWN0aW9uIGR1cmluZyBub3JtYWwNCi0gKiByZWNlcHRpb24sIE11dGUgbW9kZSBpbmFjdGl2ZSAoZm9yIGV4YW1wbGUsIGVuZCBvZiBibG9jayBkZXRlY3Rpb24gaW4gTW9kQnVzDQotICogcHJvdG9jb2wpLiBJbiB0aGlzIGNhc2UsIHRoZSB3aG9sZSByZWNlaXZlZCBjaGFyYWN0ZXIgKDgtYml0KSBpcyBjb21wYXJlZCB0bw0KLSAqIHRoZSBBRERbNzowXSB2YWx1ZSBhbmQgQ01GIGZsYWcgaXMgc2V0IG9uIG1hdGNoKQ0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgIEFERCAgICAgICAgICAgTExfTFBVQVJUX0NvbmZpZ05vZGVBZGRyZXNzXG4NCi0gKiAgICAgICAgIENSMiAgICAgICAgICBBRERNNyAgICAgICAgIExMX0xQVUFSVF9Db25maWdOb2RlQWRkcmVzcw0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcGFyYW0gIEFkZHJlc3NMZW4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfQUREUkVTU19ERVRFQ1RfNEINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfQUREUkVTU19ERVRFQ1RfN0INCi0gKiBAcGFyYW0gIE5vZGVBZGRyZXNzIDQgb3IgNyBiaXQgQWRkcmVzcyBvZiB0aGUgTFBVQVJUIG5vZGUuDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0NvbmZpZ05vZGVBZGRyZXNzKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEFkZHJlc3NMZW4sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE5vZGVBZGRyZXNzKSB7DQotICBNT0RJRllfUkVHKExQVUFSVHgtPkNSMiwgVVNBUlRfQ1IyX0FERCB8IFVTQVJUX0NSMl9BRERNNywNCi0gICAgICAgICAgICAgKHVpbnQzMl90KShBZGRyZXNzTGVuIHwgKE5vZGVBZGRyZXNzIDw8IFVTQVJUX0NSMl9BRERfUG9zKSkpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJldHVybiA4IGJpdCBBZGRyZXNzIG9mIHRoZSBMUFVBUlQgbm9kZSBhcyBzZXQgaW4gQUREIGZpZWxkIG9mIENSMi4NCi0gKiBAbm90ZSAgIElmIDQtYml0IEFkZHJlc3MgRGV0ZWN0aW9uIGlzIHNlbGVjdGVkIGluIEFERE03LA0KLSAqICAgICAgICAgb25seSA0Yml0cyAoYjMtYjApIG9mIHJldHVybmVkIHZhbHVlIGFyZSByZWxldmFudCAoYjMxLWI0IGFyZSBub3QNCi0gKiByZWxldmFudCkgSWYgNy1iaXQgQWRkcmVzcyBEZXRlY3Rpb24gaXMgc2VsZWN0ZWQgaW4gQURETTcsIG9ubHkgOGJpdHMgKGI3LWIwKQ0KLSAqIG9mIHJldHVybmVkIHZhbHVlIGFyZSByZWxldmFudCAoYjMxLWI4IGFyZSBub3QgcmVsZXZhbnQpDQotICogQHJtdG9sbCBDUjIgICAgICAgICAgQUREICAgICAgICAgICBMTF9MUFVBUlRfR2V0Tm9kZUFkZHJlc3MNCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBBZGRyZXNzIG9mIHRoZSBMUFVBUlQgbm9kZSAoVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZA0KLSAqIE1heF9EYXRhPTI1NSkNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0dldE5vZGVBZGRyZXNzKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKExQVUFSVHgtPkNSMiwgVVNBUlRfQ1IyX0FERCkgPj4gVVNBUlRfQ1IyX0FERF9Qb3MpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJldHVybiBMZW5ndGggb2YgTm9kZSBBZGRyZXNzIHVzZWQgaW4gQWRkcmVzcyBEZXRlY3Rpb24gbW9kZSAoNy1iaXQNCi0gKiBvciA0LWJpdCkNCi0gKiBAcm10b2xsIENSMiAgICAgICAgICBBRERNNyAgICAgICAgIExMX0xQVUFSVF9HZXROb2RlQWRkcmVzc0xlbg0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0FERFJFU1NfREVURUNUXzRCDQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0FERFJFU1NfREVURUNUXzdCDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9HZXROb2RlQWRkcmVzc0xlbihVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChMUFVBUlR4LT5DUjIsIFVTQVJUX0NSMl9BRERNNykpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSBSVFMgSFcgRmxvdyBDb250cm9sDQotICogQHJtdG9sbCBDUjMgICAgICAgICAgUlRTRSAgICAgICAgICBMTF9MUFVBUlRfRW5hYmxlUlRTSFdGbG93Q3RybA0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRW5hYmxlUlRTSFdGbG93Q3RybChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7DQotICBTRVRfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX1JUU0UpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgUlRTIEhXIEZsb3cgQ29udHJvbA0KLSAqIEBybXRvbGwgQ1IzICAgICAgICAgIFJUU0UgICAgICAgICAgTExfTFBVQVJUX0Rpc2FibGVSVFNIV0Zsb3dDdHJsDQotICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9EaXNhYmxlUlRTSFdGbG93Q3RybChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7DQotICBDTEVBUl9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfUlRTRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIENUUyBIVyBGbG93IENvbnRyb2wNCi0gKiBAcm10b2xsIENSMyAgICAgICAgICBDVFNFICAgICAgICAgIExMX0xQVUFSVF9FbmFibGVDVFNIV0Zsb3dDdHJsDQotICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9FbmFibGVDVFNIV0Zsb3dDdHJsKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsNCi0gIFNFVF9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfQ1RTRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBDVFMgSFcgRmxvdyBDb250cm9sDQotICogQHJtdG9sbCBDUjMgICAgICAgICAgQ1RTRSAgICAgICAgICBMTF9MUFVBUlRfRGlzYWJsZUNUU0hXRmxvd0N0cmwNCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0Rpc2FibGVDVFNIV0Zsb3dDdHJsKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsNCi0gIENMRUFSX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19DVFNFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDb25maWd1cmUgSFcgRmxvdyBDb250cm9sIG1vZGUgKGJvdGggQ1RTIGFuZCBSVFMpDQotICogQHJtdG9sbCBDUjMgICAgICAgICAgUlRTRSAgICAgICAgICBMTF9MUFVBUlRfU2V0SFdGbG93Q3RybFxuDQotICogICAgICAgICBDUjMgICAgICAgICAgQ1RTRSAgICAgICAgICBMTF9MUFVBUlRfU2V0SFdGbG93Q3RybA0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcGFyYW0gIEhhcmR3YXJlRmxvd0NvbnRyb2wgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nDQotICogdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9IV0NPTlRST0xfTk9ORQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9IV0NPTlRST0xfUlRTDQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0hXQ09OVFJPTF9DVFMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfSFdDT05UUk9MX1JUU19DVFMNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfU2V0SFdGbG93Q3RybChVU0FSVF9UeXBlRGVmICpMUFVBUlR4LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEhhcmR3YXJlRmxvd0NvbnRyb2wpIHsNCi0gIE1PRElGWV9SRUcoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfUlRTRSB8IFVTQVJUX0NSM19DVFNFLA0KLSAgICAgICAgICAgICBIYXJkd2FyZUZsb3dDb250cm9sKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBSZXR1cm4gSFcgRmxvdyBDb250cm9sIGNvbmZpZ3VyYXRpb24gKGJvdGggQ1RTIGFuZCBSVFMpDQotICogQHJtdG9sbCBDUjMgICAgICAgICAgUlRTRSAgICAgICAgICBMTF9MUFVBUlRfR2V0SFdGbG93Q3RybFxuDQotICogICAgICAgICBDUjMgICAgICAgICAgQ1RTRSAgICAgICAgICBMTF9MUFVBUlRfR2V0SFdGbG93Q3RybA0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0hXQ09OVFJPTF9OT05FDQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0hXQ09OVFJPTF9SVFMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfSFdDT05UUk9MX0NUUw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9IV0NPTlRST0xfUlRTX0NUUw0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfR2V0SFdGbG93Q3RybChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19SVFNFIHwgVVNBUlRfQ1IzX0NUU0UpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgT3ZlcnJ1biBkZXRlY3Rpb24NCi0gKiBAcm10b2xsIENSMyAgICAgICAgICBPVlJESVMgICAgICAgIExMX0xQVUFSVF9FbmFibGVPdmVycnVuRGV0ZWN0DQotICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9FbmFibGVPdmVycnVuRGV0ZWN0KFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsNCi0gIENMRUFSX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19PVlJESVMpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgT3ZlcnJ1biBkZXRlY3Rpb24NCi0gKiBAcm10b2xsIENSMyAgICAgICAgICBPVlJESVMgICAgICAgIExMX0xQVUFSVF9EaXNhYmxlT3ZlcnJ1bkRldGVjdA0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRGlzYWJsZU92ZXJydW5EZXRlY3QoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgew0KLSAgU0VUX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19PVlJESVMpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEluZGljYXRlIGlmIE92ZXJydW4gZGV0ZWN0aW9uIGlzIGVuYWJsZWQNCi0gKiBAcm10b2xsIENSMyAgICAgICAgICBPVlJESVMgICAgICAgIExMX0xQVUFSVF9Jc0VuYWJsZWRPdmVycnVuRGV0ZWN0DQotICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdA0KLUxMX0xQVUFSVF9Jc0VuYWJsZWRPdmVycnVuRGV0ZWN0KFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX09WUkRJUykgIT0gVVNBUlRfQ1IzX09WUkRJUykgPyAxVUwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNlbGVjdCBldmVudCB0eXBlIGZvciBXYWtlIFVQIEludGVycnVwdCBGbGFnIChXVVNbMTowXSBiaXRzKQ0KLSAqIEBybXRvbGwgQ1IzICAgICAgICAgIFdVUyAgICAgICAgICAgTExfTFBVQVJUX1NldFdLVVBUeXBlDQotICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQ0KLSAqIEBwYXJhbSAgVHlwZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9XQUtFVVBfT05fQUREUkVTUw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9XQUtFVVBfT05fU1RBUlRCSVQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfV0FLRVVQX09OX1JYTkUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfU2V0V0tVUFR5cGUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVHlwZSkgew0KLSAgTU9ESUZZX1JFRyhMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19XVVMsIFR5cGUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJldHVybiBldmVudCB0eXBlIGZvciBXYWtlIFVQIEludGVycnVwdCBGbGFnIChXVVNbMTowXSBiaXRzKQ0KLSAqIEBybXRvbGwgQ1IzICAgICAgICAgIFdVUyAgICAgICAgICAgTExfTFBVQVJUX0dldFdLVVBUeXBlDQotICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfV0FLRVVQX09OX0FERFJFU1MNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfV0FLRVVQX09OX1NUQVJUQklUDQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1dBS0VVUF9PTl9SWE5FDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9HZXRXS1VQVHlwZShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19XVVMpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDb25maWd1cmUgTFBVQVJUIEJSUiByZWdpc3RlciBmb3IgYWNoaWV2aW5nIGV4cGVjdGVkIEJhdWQgUmF0ZSB2YWx1ZS4NCi0gKg0KLSAqIEBub3RlICAgQ29tcHV0ZSBhbmQgc2V0IExQVUFSVERJViB2YWx1ZSBpbiBCUlIgUmVnaXN0ZXIgKGZ1bGwgQlJSIGNvbnRlbnQpDQotICogICAgICAgICBhY2NvcmRpbmcgdG8gdXNlZCBQZXJpcGhlcmFsIENsb2NrIGFuZCBleHBlY3RlZCBCYXVkIFJhdGUgdmFsdWVzDQotICogQG5vdGUgICBQZXJpcGhlcmFsIGNsb2NrIGFuZCBCYXVkIFJhdGUgdmFsdWVzIHByb3ZpZGVkIGFzIGZ1bmN0aW9uIHBhcmFtZXRlcnMNCi0gKiBzaG91bGQgYmUgdmFsaWQgKEJhdWQgcmF0ZSB2YWx1ZSAhPSAwKS4NCi0gKiBAbm90ZSAgIFByb3ZpZGVkIHRoYXQgTFBVQVJUeF9CUlIgbXVzdCBiZSA+ID0gMHgzMDAgYW5kIExQVUFSVF9CUlIgaXMgMjAtYml0LA0KLSAqICAgICAgICAgYSBjYXJlIHNob3VsZCBiZSB0YWtlbiB3aGVuIGdlbmVyYXRpbmcgaGlnaCBiYXVkIHJhdGVzIHVzaW5nIGhpZ2gNCi0gKiBQZXJpcGhDbGsgdmFsdWVzLiBQZXJpcGhDbGsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzMgeCBCYXVkUmF0ZSwgNDA5NiB4DQotICogQmF1ZFJhdGVdLg0KLSAqIEBybXRvbGwgQlJSICAgICAgICAgIEJSUiAgICAgICAgICAgTExfTFBVQVJUX1NldEJhdWRSYXRlDQotICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQ0KLSAqIEBwYXJhbSAgUGVyaXBoQ2xrIFBlcmlwaGVyYWwgQ2xvY2sNCi0gKiBAcGFyYW0gIFByZXNjYWxlclZhbHVlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYxDQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYyDQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVY0DQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVY2DQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVY4DQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYxMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMTINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjE2DQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYzMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWNjQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjEyOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMjU2DQotICogQHBhcmFtICBCYXVkUmF0ZSBCYXVkIFJhdGUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfU2V0QmF1ZFJhdGUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUGVyaXBoQ2xrLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQcmVzY2FsZXJWYWx1ZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQmF1ZFJhdGUpIHsNCi0gIGlmIChCYXVkUmF0ZSAhPSAwVSkgew0KLSAgICBMUFVBUlR4LT5CUlIgPSBfX0xMX0xQVUFSVF9ESVYoUGVyaXBoQ2xrLCBQcmVzY2FsZXJWYWx1ZSwgQmF1ZFJhdGUpOw0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJldHVybiBjdXJyZW50IEJhdWQgUmF0ZSB2YWx1ZSwgYWNjb3JkaW5nIHRvIExQVUFSVERJViBwcmVzZW50IGluIEJSUg0KLSAqIHJlZ2lzdGVyIChmdWxsIEJSUiBjb250ZW50KSwgYW5kIHRvIHVzZWQgUGVyaXBoZXJhbCBDbG9jayB2YWx1ZXMNCi0gKiBAbm90ZSAgIEluIGNhc2Ugb2Ygbm9uLWluaXRpYWxpemVkIG9yIGludmFsaWQgdmFsdWUgc3RvcmVkIGluIEJSUiByZWdpc3RlciwNCi0gKiB2YWx1ZSAwIHdpbGwgYmUgcmV0dXJuZWQuDQotICogQHJtdG9sbCBCUlIgICAgICAgICAgQlJSICAgICAgICAgICBMTF9MUFVBUlRfR2V0QmF1ZFJhdGUNCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHBhcmFtICBQZXJpcGhDbGsgUGVyaXBoZXJhbCBDbG9jaw0KLSAqIEBwYXJhbSAgUHJlc2NhbGVyVmFsdWUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjEwDQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYxMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMTYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjMyDQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVY2NA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMTI4DQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYyNTYNCi0gKiBAcmV0dmFsIEJhdWQgUmF0ZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfR2V0QmF1ZFJhdGUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFBlcmlwaENsaywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFByZXNjYWxlclZhbHVlKSB7DQotICB1aW50MzJfdCBscHVhcnRkaXY7DQotICB1aW50MzJfdCBicnJyZXN1bHQ7DQotICB1aW50MzJfdCBwZXJpcGhjbGtwcmVzYyA9DQotICAgICAgKHVpbnQzMl90KShQZXJpcGhDbGsgLyAoTFBVQVJUX1BSRVNDQUxFUl9UQUJbKHVpbnQxNl90KVByZXNjYWxlclZhbHVlXSkpOw0KLQ0KLSAgbHB1YXJ0ZGl2ID0gTFBVQVJUeC0+QlJSICYgTFBVQVJUX0JSUl9NQVNLOw0KLQ0KLSAgaWYgKGxwdWFydGRpdiA+PSBMUFVBUlRfQlJSX01JTl9WQUxVRSkgew0KLSAgICBicnJyZXN1bHQgPQ0KLSAgICAgICAgKHVpbnQzMl90KSgoKHVpbnQ2NF90KShwZXJpcGhjbGtwcmVzYykqTFBVQVJUX0xQVUFSVERJVl9GUkVRX01VTCkgLw0KLSAgICAgICAgICAgICAgICAgICBscHVhcnRkaXYpOw0KLSAgfSBlbHNlIHsNCi0gICAgYnJycmVzdWx0ID0gMHgwVUw7DQotICB9DQotDQotICByZXR1cm4gKGJycnJlc3VsdCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUZfQ29uZmlndXJhdGlvbl9IYWxmRHVwbGV4IENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zDQotICogcmVsYXRlZCB0byBIYWxmIER1cGxleCBmZWF0dXJlDQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSBTaW5nbGUgV2lyZSBIYWxmLUR1cGxleCBtb2RlDQotICogQHJtdG9sbCBDUjMgICAgICAgICAgSERTRUwgICAgICAgICBMTF9MUFVBUlRfRW5hYmxlSGFsZkR1cGxleA0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRW5hYmxlSGFsZkR1cGxleChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7DQotICBTRVRfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX0hEU0VMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIFNpbmdsZSBXaXJlIEhhbGYtRHVwbGV4IG1vZGUNCi0gKiBAcm10b2xsIENSMyAgICAgICAgICBIRFNFTCAgICAgICAgIExMX0xQVUFSVF9EaXNhYmxlSGFsZkR1cGxleA0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRGlzYWJsZUhhbGZEdXBsZXgoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgew0KLSAgQ0xFQVJfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX0hEU0VMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBJbmRpY2F0ZSBpZiBTaW5nbGUgV2lyZSBIYWxmLUR1cGxleCBtb2RlIGlzIGVuYWJsZWQNCi0gKiBAcm10b2xsIENSMyAgICAgICAgICBIRFNFTCAgICAgICAgIExMX0xQVUFSVF9Jc0VuYWJsZWRIYWxmRHVwbGV4DQotICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfSXNFbmFibGVkSGFsZkR1cGxleChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19IRFNFTCkgPT0gKFVTQVJUX0NSM19IRFNFTCkpID8gMVVMDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIExQVUFSVF9MTF9FRl9Db25maWd1cmF0aW9uX0RFIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zIHJlbGF0ZWQgdG8NCi0gKiBEcml2ZXIgRW5hYmxlIGZlYXR1cmUNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IERFRFQgKERyaXZlciBFbmFibGUgRGUtQXNzZXJ0aW9uIFRpbWUpLCBUaW1lIHZhbHVlIGV4cHJlc3NlZCBvbiA1DQotICogYml0cyAoWzQ6MF0gYml0cykuDQotICogQHJtdG9sbCBDUjEgICAgICAgICAgREVEVCAgICAgICAgICBMTF9MUFVBUlRfU2V0REVEZWFzc2VydGlvblRpbWUNCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHBhcmFtICBUaW1lIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MzENCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfU2V0REVEZWFzc2VydGlvblRpbWUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZSkgew0KLSAgTU9ESUZZX1JFRyhMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9ERURULCBUaW1lIDw8IFVTQVJUX0NSMV9ERURUX1Bvcyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmV0dXJuIERFRFQgKERyaXZlciBFbmFibGUgRGUtQXNzZXJ0aW9uIFRpbWUpDQotICogQHJtdG9sbCBDUjEgICAgICAgICAgREVEVCAgICAgICAgICBMTF9MUFVBUlRfR2V0REVEZWFzc2VydGlvblRpbWUNCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBUaW1lIHZhbHVlIGV4cHJlc3NlZCBvbiA1IGJpdHMgKFs0OjBdIGJpdHMpIDogYw0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdA0KLUxMX0xQVUFSVF9HZXRERURlYXNzZXJ0aW9uVGltZShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9ERURUKSA+Pg0KLSAgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX0RFRFRfUG9zKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZXQgREVBVCAoRHJpdmVyIEVuYWJsZSBBc3NlcnRpb24gVGltZSksIFRpbWUgdmFsdWUgZXhwcmVzc2VkIG9uIDUNCi0gKiBiaXRzIChbNDowXSBiaXRzKS4NCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBERUFUICAgICAgICAgIExMX0xQVUFSVF9TZXRERUFzc2VydGlvblRpbWUNCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHBhcmFtICBUaW1lIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MzENCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfU2V0REVBc3NlcnRpb25UaW1lKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lKSB7DQotICBNT0RJRllfUkVHKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX0RFQVQsIFRpbWUgPDwgVVNBUlRfQ1IxX0RFQVRfUG9zKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBSZXR1cm4gREVBVCAoRHJpdmVyIEVuYWJsZSBBc3NlcnRpb24gVGltZSkNCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBERUFUICAgICAgICAgIExMX0xQVUFSVF9HZXRERUFzc2VydGlvblRpbWUNCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBUaW1lIHZhbHVlIGV4cHJlc3NlZCBvbiA1IGJpdHMgKFs0OjBdIGJpdHMpIDogVGltZSBWYWx1ZSBiZXR3ZWVuDQotICogTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MzENCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0dldERFQXNzZXJ0aW9uVGltZShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9ERUFUKSA+Pg0KLSAgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX0RFQVRfUG9zKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgRHJpdmVyIEVuYWJsZSAoREUpIE1vZGUNCi0gKiBAcm10b2xsIENSMyAgICAgICAgICBERU0gICAgICAgICAgIExMX0xQVUFSVF9FbmFibGVERU1vZGUNCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0VuYWJsZURFTW9kZShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7DQotICBTRVRfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX0RFTSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBEcml2ZXIgRW5hYmxlIChERSkgTW9kZQ0KLSAqIEBybXRvbGwgQ1IzICAgICAgICAgIERFTSAgICAgICAgICAgTExfTFBVQVJUX0Rpc2FibGVERU1vZGUNCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0Rpc2FibGVERU1vZGUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgew0KLSAgQ0xFQVJfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX0RFTSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSW5kaWNhdGUgaWYgRHJpdmVyIEVuYWJsZSAoREUpIE1vZGUgaXMgZW5hYmxlZA0KLSAqIEBybXRvbGwgQ1IzICAgICAgICAgIERFTSAgICAgICAgICAgTExfTFBVQVJUX0lzRW5hYmxlZERFTW9kZQ0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0lzRW5hYmxlZERFTW9kZShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19ERU0pID09IChVU0FSVF9DUjNfREVNKSkgPyAxVUwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2VsZWN0IERyaXZlciBFbmFibGUgUG9sYXJpdHkNCi0gKiBAcm10b2xsIENSMyAgICAgICAgICBERVAgICAgICAgICAgIExMX0xQVUFSVF9TZXRERVNpZ25hbFBvbGFyaXR5DQotICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQ0KLSAqIEBwYXJhbSAgUG9sYXJpdHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfREVfUE9MQVJJVFlfSElHSA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9ERV9QT0xBUklUWV9MT1cNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfU2V0REVTaWduYWxQb2xhcml0eShVU0FSVF9UeXBlRGVmICpMUFVBUlR4LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFBvbGFyaXR5KSB7DQotICBNT0RJRllfUkVHKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX0RFUCwgUG9sYXJpdHkpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJldHVybiBEcml2ZXIgRW5hYmxlIFBvbGFyaXR5DQotICogQHJtdG9sbCBDUjMgICAgICAgICAgREVQICAgICAgICAgICBMTF9MUFVBUlRfR2V0REVTaWduYWxQb2xhcml0eQ0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0RFX1BPTEFSSVRZX0hJR0gNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfREVfUE9MQVJJVFlfTE9XDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9HZXRERVNpZ25hbFBvbGFyaXR5KFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX0RFUCkpOw0KLX0NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX0VGX0ZMQUdfTWFuYWdlbWVudCBGTEFHX01hbmFnZW1lbnQNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBQYXJpdHkgRXJyb3IgRmxhZyBpcyBzZXQgb3Igbm90DQotICogQHJtdG9sbCBJU1IgICAgICAgICAgUEUgICAgICAgICAgICBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX1BFDQotICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX1BFKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPklTUiwgVVNBUlRfSVNSX1BFKSA9PSAoVVNBUlRfSVNSX1BFKSkgPyAxVUwgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBMUFVBUlQgRnJhbWluZyBFcnJvciBGbGFnIGlzIHNldCBvciBub3QNCi0gKiBAcm10b2xsIElTUiAgICAgICAgICBGRSAgICAgICAgICAgIExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfRkUNCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfRkUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoTFBVQVJUeC0+SVNSLCBVU0FSVF9JU1JfRkUpID09IChVU0FSVF9JU1JfRkUpKSA/IDFVTCA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBOb2lzZSBlcnJvciBkZXRlY3RlZCBGbGFnIGlzIHNldCBvciBub3QNCi0gKiBAcm10b2xsIElTUiAgICAgICAgICBORSAgICAgICAgICAgIExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfTkUNCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfTkUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoTFBVQVJUeC0+SVNSLCBVU0FSVF9JU1JfTkUpID09IChVU0FSVF9JU1JfTkUpKSA/IDFVTCA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBPdmVyUnVuIEVycm9yIEZsYWcgaXMgc2V0IG9yIG5vdA0KLSAqIEBybXRvbGwgSVNSICAgICAgICAgIE9SRSAgICAgICAgICAgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19PUkUNCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfT1JFKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPklTUiwgVVNBUlRfSVNSX09SRSkgPT0gKFVTQVJUX0lTUl9PUkUpKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiB0aGUgTFBVQVJUIElETEUgbGluZSBkZXRlY3RlZCBGbGFnIGlzIHNldCBvciBub3QNCi0gKiBAcm10b2xsIElTUiAgICAgICAgICBJRExFICAgICAgICAgIExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfSURMRQ0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19JRExFKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPklTUiwgVVNBUlRfSVNSX0lETEUpID09IChVU0FSVF9JU1JfSURMRSkpID8gMVVMDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qIExlZ2FjeSBkZWZpbmUgKi8NCi0jZGVmaW5lIExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfUlhORSBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX1JYTkVfUlhGTkUNCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBMUFVBUlQgUmVhZCBEYXRhIFJlZ2lzdGVyIG9yIExQVUFSVCBSWCBGSUZPIE5vdCBFbXB0eQ0KLSAqIEZsYWcgaXMgc2V0IG9yIG5vdA0KLSAqIEBybXRvbGwgSVNSICAgICAgICAgIFJYTkVfUlhGTkUgICAgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19SWE5FX1JYRk5FDQotICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdA0KLUxMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfUlhORV9SWEZORShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7DQotICByZXR1cm4gKA0KLSAgICAgIChSRUFEX0JJVChMUFVBUlR4LT5JU1IsIFVTQVJUX0lTUl9SWE5FX1JYRk5FKSA9PSAoVVNBUlRfSVNSX1JYTkVfUlhGTkUpKQ0KLSAgICAgICAgICA/IDFVTA0KLSAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBUcmFuc21pc3Npb24gQ29tcGxldGUgRmxhZyBpcyBzZXQgb3Igbm90DQotICogQHJtdG9sbCBJU1IgICAgICAgICAgVEMgICAgICAgICAgICBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX1RDDQotICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX1RDKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPklTUiwgVVNBUlRfSVNSX1RDKSA9PSAoVVNBUlRfSVNSX1RDKSkgPyAxVUwgOiAwVUwpOw0KLX0NCi0NCi0vKiBMZWdhY3kgZGVmaW5lICovDQotI2RlZmluZSBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX1RYRSBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX1RYRV9UWEZORg0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBUcmFuc21pdCBEYXRhIFJlZ2lzdGVyIEVtcHR5IG9yIExQVUFSVCBUWCBGSUZPDQotICogTm90IEZ1bGwgRmxhZyBpcyBzZXQgb3Igbm90DQotICogQHJtdG9sbCBJU1IgICAgICAgICAgVFhFX1RYRk5GICAgICBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX1RYRV9UWEZORg0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QNCi1MTF9MUFVBUlRfSXNBY3RpdmVGbGFnX1RYRV9UWEZORihVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5JU1IsIFVTQVJUX0lTUl9UWEVfVFhGTkYpID09IChVU0FSVF9JU1JfVFhFX1RYRk5GKSkNCi0gICAgICAgICAgICAgID8gMVVMDQotICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBDVFMgaW50ZXJydXB0IEZsYWcgaXMgc2V0IG9yIG5vdA0KLSAqIEBybXRvbGwgSVNSICAgICAgICAgIENUU0lGICAgICAgICAgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19uQ1RTDQotICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX25DVFMoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoTFBVQVJUeC0+SVNSLCBVU0FSVF9JU1JfQ1RTSUYpID09IChVU0FSVF9JU1JfQ1RTSUYpKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBDVFMgRmxhZyBpcyBzZXQgb3Igbm90DQotICogQHJtdG9sbCBJU1IgICAgICAgICAgQ1RTICAgICAgICAgICBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX0NUUw0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19DVFMoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoTFBVQVJUeC0+SVNSLCBVU0FSVF9JU1JfQ1RTKSA9PSAoVVNBUlRfSVNSX0NUUykpID8gMVVMDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBMUFVBUlQgQnVzeSBGbGFnIGlzIHNldCBvciBub3QNCi0gKiBAcm10b2xsIElTUiAgICAgICAgICBCVVNZICAgICAgICAgIExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfQlVTWQ0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19CVVNZKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPklTUiwgVVNBUlRfSVNSX0JVU1kpID09IChVU0FSVF9JU1JfQlVTWSkpID8gMVVMDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBDaGFyYWN0ZXIgTWF0Y2ggRmxhZyBpcyBzZXQgb3Igbm90DQotICogQHJtdG9sbCBJU1IgICAgICAgICAgQ01GICAgICAgICAgICBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX0NNDQotICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX0NNKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPklTUiwgVVNBUlRfSVNSX0NNRikgPT0gKFVTQVJUX0lTUl9DTUYpKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiB0aGUgTFBVQVJUIFNlbmQgQnJlYWsgRmxhZyBpcyBzZXQgb3Igbm90DQotICogQHJtdG9sbCBJU1IgICAgICAgICAgU0JLRiAgICAgICAgICBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX1NCSw0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19TQksoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoTFBVQVJUeC0+SVNSLCBVU0FSVF9JU1JfU0JLRikgPT0gKFVTQVJUX0lTUl9TQktGKSkgPyAxVUwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiB0aGUgTFBVQVJUIFJlY2VpdmUgV2FrZSBVcCBmcm9tIG11dGUgbW9kZSBGbGFnIGlzIHNldCBvciBub3QNCi0gKiBAcm10b2xsIElTUiAgICAgICAgICBSV1UgICAgICAgICAgIExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfUldVDQotICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX1JXVShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5JU1IsIFVTQVJUX0lTUl9SV1UpID09IChVU0FSVF9JU1JfUldVKSkgPyAxVUwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBXYWtlIFVwIGZyb20gc3RvcCBtb2RlIEZsYWcgaXMgc2V0IG9yIG5vdA0KLSAqIEBybXRvbGwgSVNSICAgICAgICAgIFdVRiAgICAgICAgICAgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19XS1VQDQotICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX1dLVVAoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoTFBVQVJUeC0+SVNSLCBVU0FSVF9JU1JfV1VGKSA9PSAoVVNBUlRfSVNSX1dVRikpID8gMVVMDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBMUFVBUlQgVHJhbnNtaXQgRW5hYmxlIEFja25vd2xlZGdlIEZsYWcgaXMgc2V0IG9yIG5vdA0KLSAqIEBybXRvbGwgSVNSICAgICAgICAgIFRFQUNLICAgICAgICAgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19URUFDSw0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19URUFDSyhVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5JU1IsIFVTQVJUX0lTUl9URUFDSykgPT0gKFVTQVJUX0lTUl9URUFDSykpID8gMVVMDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiB0aGUgTFBVQVJUIFJlY2VpdmUgRW5hYmxlIEFja25vd2xlZGdlIEZsYWcgaXMgc2V0IG9yIG5vdA0KLSAqIEBybXRvbGwgSVNSICAgICAgICAgIFJFQUNLICAgICAgICAgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19SRUFDSw0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19SRUFDSyhVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5JU1IsIFVTQVJUX0lTUl9SRUFDSykgPT0gKFVTQVJUX0lTUl9SRUFDSykpID8gMVVMDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiB0aGUgTFBVQVJUIFRYIEZJRk8gRW1wdHkgRmxhZyBpcyBzZXQgb3Igbm90DQotICogQHJtdG9sbCBJU1IgICAgICAgICAgVFhGRSAgICAgICAgICBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX1RYRkUNCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfVFhGRShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5JU1IsIFVTQVJUX0lTUl9UWEZFKSA9PSAoVVNBUlRfSVNSX1RYRkUpKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBMUFVBUlQgUlggRklGTyBGdWxsIEZsYWcgaXMgc2V0IG9yIG5vdA0KLSAqIEBybXRvbGwgSVNSICAgICAgICAgIFJYRkYgICAgICAgICAgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19SWEZGDQotICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX1JYRkYoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoTFBVQVJUeC0+SVNSLCBVU0FSVF9JU1JfUlhGRikgPT0gKFVTQVJUX0lTUl9SWEZGKSkgPyAxVUwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiB0aGUgTFBVQVJUIFRYIEZJRk8gVGhyZXNob2xkIEZsYWcgaXMgc2V0IG9yIG5vdA0KLSAqIEBybXRvbGwgSVNSICAgICAgICAgIFRYRlQgICAgICAgICAgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19UWEZUDQotICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX1RYRlQoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoTFBVQVJUeC0+SVNSLCBVU0FSVF9JU1JfVFhGVCkgPT0gKFVTQVJUX0lTUl9UWEZUKSkgPyAxVUwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiB0aGUgTFBVQVJUIFJYIEZJRk8gVGhyZXNob2xkIEZsYWcgaXMgc2V0IG9yIG5vdA0KLSAqIEBybXRvbGwgSVNSICAgICAgICAgIFJYRlQgICAgICAgICAgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19SWEZUDQotICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX1JYRlQoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoTFBVQVJUeC0+SVNSLCBVU0FSVF9JU1JfUlhGVCkgPT0gKFVTQVJUX0lTUl9SWEZUKSkgPyAxVUwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDbGVhciBQYXJpdHkgRXJyb3IgRmxhZw0KLSAqIEBybXRvbGwgSUNSICAgICAgICAgIFBFQ0YgICAgICAgICAgTExfTFBVQVJUX0NsZWFyRmxhZ19QRQ0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfQ2xlYXJGbGFnX1BFKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsNCi0gIFdSSVRFX1JFRyhMUFVBUlR4LT5JQ1IsIFVTQVJUX0lDUl9QRUNGKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDbGVhciBGcmFtaW5nIEVycm9yIEZsYWcNCi0gKiBAcm10b2xsIElDUiAgICAgICAgICBGRUNGICAgICAgICAgIExMX0xQVUFSVF9DbGVhckZsYWdfRkUNCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0NsZWFyRmxhZ19GRShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7DQotICBXUklURV9SRUcoTFBVQVJUeC0+SUNSLCBVU0FSVF9JQ1JfRkVDRik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2xlYXIgTm9pc2UgZGV0ZWN0ZWQgRmxhZw0KLSAqIEBybXRvbGwgSUNSICAgICAgICAgIE5FQ0YgICAgICAgICAgTExfTFBVQVJUX0NsZWFyRmxhZ19ORQ0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfQ2xlYXJGbGFnX05FKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsNCi0gIFdSSVRFX1JFRyhMUFVBUlR4LT5JQ1IsIFVTQVJUX0lDUl9ORUNGKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDbGVhciBPdmVyUnVuIEVycm9yIEZsYWcNCi0gKiBAcm10b2xsIElDUiAgICAgICAgICBPUkVDRiAgICAgICAgIExMX0xQVUFSVF9DbGVhckZsYWdfT1JFDQotICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9DbGVhckZsYWdfT1JFKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsNCi0gIFdSSVRFX1JFRyhMUFVBUlR4LT5JQ1IsIFVTQVJUX0lDUl9PUkVDRik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2xlYXIgSURMRSBsaW5lIGRldGVjdGVkIEZsYWcNCi0gKiBAcm10b2xsIElDUiAgICAgICAgICBJRExFQ0YgICAgICAgIExMX0xQVUFSVF9DbGVhckZsYWdfSURMRQ0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfQ2xlYXJGbGFnX0lETEUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgew0KLSAgV1JJVEVfUkVHKExQVUFSVHgtPklDUiwgVVNBUlRfSUNSX0lETEVDRik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2xlYXIgVHJhbnNtaXNzaW9uIENvbXBsZXRlIEZsYWcNCi0gKiBAcm10b2xsIElDUiAgICAgICAgICBUQ0NGICAgICAgICAgIExMX0xQVUFSVF9DbGVhckZsYWdfVEMNCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0NsZWFyRmxhZ19UQyhVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7DQotICBXUklURV9SRUcoTFBVQVJUeC0+SUNSLCBVU0FSVF9JQ1JfVENDRik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2xlYXIgQ1RTIEludGVycnVwdCBGbGFnDQotICogQHJtdG9sbCBJQ1IgICAgICAgICAgQ1RTQ0YgICAgICAgICBMTF9MUFVBUlRfQ2xlYXJGbGFnX25DVFMNCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0NsZWFyRmxhZ19uQ1RTKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsNCi0gIFdSSVRFX1JFRyhMUFVBUlR4LT5JQ1IsIFVTQVJUX0lDUl9DVFNDRik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2xlYXIgQ2hhcmFjdGVyIE1hdGNoIEZsYWcNCi0gKiBAcm10b2xsIElDUiAgICAgICAgICBDTUNGICAgICAgICAgIExMX0xQVUFSVF9DbGVhckZsYWdfQ00NCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0NsZWFyRmxhZ19DTShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7DQotICBXUklURV9SRUcoTFBVQVJUeC0+SUNSLCBVU0FSVF9JQ1JfQ01DRik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2xlYXIgV2FrZSBVcCBmcm9tIHN0b3AgbW9kZSBGbGFnDQotICogQHJtdG9sbCBJQ1IgICAgICAgICAgV1VDRiAgICAgICAgICBMTF9MUFVBUlRfQ2xlYXJGbGFnX1dLVVANCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0NsZWFyRmxhZ19XS1VQKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsNCi0gIFdSSVRFX1JFRyhMUFVBUlR4LT5JQ1IsIFVTQVJUX0lDUl9XVUNGKTsNCi19DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIExQVUFSVF9MTF9FRl9JVF9NYW5hZ2VtZW50IElUX01hbmFnZW1lbnQNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIElETEUgSW50ZXJydXB0DQotICogQHJtdG9sbCBDUjEgICAgICAgICAgSURMRUlFICAgICAgICBMTF9MUFVBUlRfRW5hYmxlSVRfSURMRQ0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRW5hYmxlSVRfSURMRShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7DQotICBBVE9NSUNfU0VUX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9JRExFSUUpOw0KLX0NCi0NCi0vKiBMZWdhY3kgZGVmaW5lICovDQotI2RlZmluZSBMTF9MUFVBUlRfRW5hYmxlSVRfUlhORSBMTF9MUFVBUlRfRW5hYmxlSVRfUlhORV9SWEZORQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIFJYIE5vdCBFbXB0eSBhbmQgUlggRklGTyBOb3QgRW1wdHkgSW50ZXJydXB0DQotICogQHJtdG9sbCBDUjEgICAgICAgIFJYTkVJRV9SWEZORUlFICBMTF9MUFVBUlRfRW5hYmxlSVRfUlhORV9SWEZORQ0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRW5hYmxlSVRfUlhORV9SWEZORShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7DQotICBBVE9NSUNfU0VUX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBJbnRlcnJ1cHQNCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBUQ0lFICAgICAgICAgIExMX0xQVUFSVF9FbmFibGVJVF9UQw0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRW5hYmxlSVRfVEMoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgew0KLSAgQVRPTUlDX1NFVF9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfVENJRSk7DQotfQ0KLQ0KLS8qIExlZ2FjeSBkZWZpbmUgKi8NCi0jZGVmaW5lIExMX0xQVUFSVF9FbmFibGVJVF9UWEUgTExfTFBVQVJUX0VuYWJsZUlUX1RYRV9UWEZORg0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIFRYIEVtcHR5IGFuZCBUWCBGSUZPIE5vdCBGdWxsIEludGVycnVwdA0KLSAqIEBybXRvbGwgQ1IxICAgICAgICAgVFhFSUVfVFhGTkZJRSAgTExfTFBVQVJUX0VuYWJsZUlUX1RYRV9UWEZORg0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRW5hYmxlSVRfVFhFX1RYRk5GKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsNCi0gIEFUT01JQ19TRVRfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX1RYRUlFX1RYRk5GSUUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSBQYXJpdHkgRXJyb3IgSW50ZXJydXB0DQotICogQHJtdG9sbCBDUjEgICAgICAgICAgUEVJRSAgICAgICAgICBMTF9MUFVBUlRfRW5hYmxlSVRfUEUNCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0VuYWJsZUlUX1BFKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsNCi0gIEFUT01JQ19TRVRfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX1BFSUUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSBDaGFyYWN0ZXIgTWF0Y2ggSW50ZXJydXB0DQotICogQHJtdG9sbCBDUjEgICAgICAgICAgQ01JRSAgICAgICAgICBMTF9MUFVBUlRfRW5hYmxlSVRfQ00NCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0VuYWJsZUlUX0NNKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsNCi0gIEFUT01JQ19TRVRfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX0NNSUUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSBUWCBGSUZPIEVtcHR5IEludGVycnVwdA0KLSAqIEBybXRvbGwgQ1IxICAgICAgICAgIFRYRkVJRSAgICAgICAgTExfTFBVQVJUX0VuYWJsZUlUX1RYRkUNCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0VuYWJsZUlUX1RYRkUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgew0KLSAgQVRPTUlDX1NFVF9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfVFhGRUlFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgUlggRklGTyBGdWxsIEludGVycnVwdA0KLSAqIEBybXRvbGwgQ1IxICAgICAgICAgIFJYRkZJRSAgICAgICAgTExfTFBVQVJUX0VuYWJsZUlUX1JYRkYNCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0VuYWJsZUlUX1JYRkYoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgew0KLSAgQVRPTUlDX1NFVF9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUlhGRklFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgRXJyb3IgSW50ZXJydXB0DQotICogQG5vdGUgICBXaGVuIHNldCwgRXJyb3IgSW50ZXJydXB0IEVuYWJsZSBCaXQgaXMgZW5hYmxpbmcgaW50ZXJydXB0IGdlbmVyYXRpb24NCi0gKiBpbiBjYXNlIG9mIGEgZnJhbWluZyBlcnJvciwgb3ZlcnJ1biBlcnJvciBvciBub2lzZSBmbGFnIChGRT0xIG9yIE9SRT0xIG9yDQotICogTkY9MSBpbiB0aGUgTFBVQVJUeF9JU1IgcmVnaXN0ZXIpLg0KLSAqICAgICAgICAgLSAwOiBJbnRlcnJ1cHQgaXMgaW5oaWJpdGVkDQotICogICAgICAgICAtIDE6IEFuIGludGVycnVwdCBpcyBnZW5lcmF0ZWQgd2hlbiBGRT0xIG9yIE9SRT0xIG9yIE5GPTEgaW4gdGhlDQotICogTFBVQVJUeF9JU1IgcmVnaXN0ZXIuDQotICogQHJtdG9sbCBDUjMgICAgICAgICAgRUlFICAgICAgICAgICBMTF9MUFVBUlRfRW5hYmxlSVRfRVJST1INCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0VuYWJsZUlUX0VSUk9SKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsNCi0gIEFUT01JQ19TRVRfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX0VJRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIENUUyBJbnRlcnJ1cHQNCi0gKiBAcm10b2xsIENSMyAgICAgICAgICBDVFNJRSAgICAgICAgIExMX0xQVUFSVF9FbmFibGVJVF9DVFMNCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0VuYWJsZUlUX0NUUyhVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7DQotICBBVE9NSUNfU0VUX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19DVFNJRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIFdha2UgVXAgZnJvbSBTdG9wIE1vZGUgSW50ZXJydXB0DQotICogQHJtdG9sbCBDUjMgICAgICAgICAgV1VGSUUgICAgICAgICBMTF9MUFVBUlRfRW5hYmxlSVRfV0tVUA0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRW5hYmxlSVRfV0tVUChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7DQotICBBVE9NSUNfU0VUX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19XVUZJRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIFRYIEZJRk8gVGhyZXNob2xkIEludGVycnVwdA0KLSAqIEBybXRvbGwgQ1IzICAgICAgICAgIFRYRlRJRSAgICAgICAgTExfTFBVQVJUX0VuYWJsZUlUX1RYRlQNCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0VuYWJsZUlUX1RYRlQoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgew0KLSAgQVRPTUlDX1NFVF9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfVFhGVElFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgUlggRklGTyBUaHJlc2hvbGQgSW50ZXJydXB0DQotICogQHJtdG9sbCBDUjMgICAgICAgICAgUlhGVElFICAgICAgICBMTF9MUFVBUlRfRW5hYmxlSVRfUlhGVA0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRW5hYmxlSVRfUlhGVChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7DQotICBBVE9NSUNfU0VUX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19SWEZUSUUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgSURMRSBJbnRlcnJ1cHQNCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBJRExFSUUgICAgICAgIExMX0xQVUFSVF9EaXNhYmxlSVRfSURMRQ0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRGlzYWJsZUlUX0lETEUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgew0KLSAgQVRPTUlDX0NMRUFSX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9JRExFSUUpOw0KLX0NCi0NCi0vKiBMZWdhY3kgZGVmaW5lICovDQotI2RlZmluZSBMTF9MUFVBUlRfRGlzYWJsZUlUX1JYTkUgTExfTFBVQVJUX0Rpc2FibGVJVF9SWE5FX1JYRk5FDQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIFJYIE5vdCBFbXB0eSBhbmQgUlggRklGTyBOb3QgRW1wdHkgSW50ZXJydXB0DQotICogQHJtdG9sbCBDUjEgICAgICAgIFJYTkVJRV9SWEZORUlFICBMTF9MUFVBUlRfRGlzYWJsZUlUX1JYTkVfUlhGTkUNCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0Rpc2FibGVJVF9SWE5FX1JYRk5FKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsNCi0gIEFUT01JQ19DTEVBUl9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUlhORUlFX1JYRk5FSUUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgVHJhbnNtaXNzaW9uIENvbXBsZXRlIEludGVycnVwdA0KLSAqIEBybXRvbGwgQ1IxICAgICAgICAgIFRDSUUgICAgICAgICAgTExfTFBVQVJUX0Rpc2FibGVJVF9UQw0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRGlzYWJsZUlUX1RDKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsNCi0gIEFUT01JQ19DTEVBUl9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfVENJRSk7DQotfQ0KLQ0KLS8qIExlZ2FjeSBkZWZpbmUgKi8NCi0jZGVmaW5lIExMX0xQVUFSVF9EaXNhYmxlSVRfVFhFIExMX0xQVUFSVF9EaXNhYmxlSVRfVFhFX1RYRk5GDQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIFRYIEVtcHR5IGFuZCBUWCBGSUZPIE5vdCBGdWxsIEludGVycnVwdA0KLSAqIEBybXRvbGwgQ1IxICAgICAgICBUWEVJRV9UWEZORklFICBMTF9MUFVBUlRfRGlzYWJsZUlUX1RYRV9UWEZORg0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRGlzYWJsZUlUX1RYRV9UWEZORihVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7DQotICBBVE9NSUNfQ0xFQVJfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX1RYRUlFX1RYRk5GSUUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgUGFyaXR5IEVycm9yIEludGVycnVwdA0KLSAqIEBybXRvbGwgQ1IxICAgICAgICAgIFBFSUUgICAgICAgICAgTExfTFBVQVJUX0Rpc2FibGVJVF9QRQ0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRGlzYWJsZUlUX1BFKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsNCi0gIEFUT01JQ19DTEVBUl9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUEVJRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBDaGFyYWN0ZXIgTWF0Y2ggSW50ZXJydXB0DQotICogQHJtdG9sbCBDUjEgICAgICAgICAgQ01JRSAgICAgICAgICBMTF9MUFVBUlRfRGlzYWJsZUlUX0NNDQotICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9EaXNhYmxlSVRfQ00oVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgew0KLSAgQVRPTUlDX0NMRUFSX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9DTUlFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIFRYIEZJRk8gRW1wdHkgSW50ZXJydXB0DQotICogQHJtdG9sbCBDUjEgICAgICAgICAgVFhGRUlFICAgICAgICBMTF9MUFVBUlRfRGlzYWJsZUlUX1RYRkUNCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0Rpc2FibGVJVF9UWEZFKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsNCi0gIEFUT01JQ19DTEVBUl9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfVFhGRUlFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIFJYIEZJRk8gRnVsbCBJbnRlcnJ1cHQNCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBSWEZGSUUgICAgICAgIExMX0xQVUFSVF9EaXNhYmxlSVRfUlhGRg0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRGlzYWJsZUlUX1JYRkYoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgew0KLSAgQVRPTUlDX0NMRUFSX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9SWEZGSUUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgRXJyb3IgSW50ZXJydXB0DQotICogQG5vdGUgICBXaGVuIHNldCwgRXJyb3IgSW50ZXJydXB0IEVuYWJsZSBCaXQgaXMgZW5hYmxpbmcgaW50ZXJydXB0IGdlbmVyYXRpb24NCi0gKiBpbiBjYXNlIG9mIGEgZnJhbWluZyBlcnJvciwgb3ZlcnJ1biBlcnJvciBvciBub2lzZSBmbGFnIChGRT0xIG9yIE9SRT0xIG9yDQotICogTkY9MSBpbiB0aGUgTFBVQVJUeF9JU1IgcmVnaXN0ZXIpLg0KLSAqICAgICAgICAgLSAwOiBJbnRlcnJ1cHQgaXMgaW5oaWJpdGVkDQotICogICAgICAgICAtIDE6IEFuIGludGVycnVwdCBpcyBnZW5lcmF0ZWQgd2hlbiBGRT0xIG9yIE9SRT0xIG9yIE5GPTEgaW4gdGhlDQotICogTFBVQVJUeF9JU1IgcmVnaXN0ZXIuDQotICogQHJtdG9sbCBDUjMgICAgICAgICAgRUlFICAgICAgICAgICBMTF9MUFVBUlRfRGlzYWJsZUlUX0VSUk9SDQotICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9EaXNhYmxlSVRfRVJST1IoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgew0KLSAgQVRPTUlDX0NMRUFSX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19FSUUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgQ1RTIEludGVycnVwdA0KLSAqIEBybXRvbGwgQ1IzICAgICAgICAgIENUU0lFICAgICAgICAgTExfTFBVQVJUX0Rpc2FibGVJVF9DVFMNCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0Rpc2FibGVJVF9DVFMoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgew0KLSAgQVRPTUlDX0NMRUFSX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19DVFNJRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBXYWtlIFVwIGZyb20gU3RvcCBNb2RlIEludGVycnVwdA0KLSAqIEBybXRvbGwgQ1IzICAgICAgICAgIFdVRklFICAgICAgICAgTExfTFBVQVJUX0Rpc2FibGVJVF9XS1VQDQotICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9EaXNhYmxlSVRfV0tVUChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7DQotICBBVE9NSUNfQ0xFQVJfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX1dVRklFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIFRYIEZJRk8gVGhyZXNob2xkIEludGVycnVwdA0KLSAqIEBybXRvbGwgQ1IzICAgICAgICAgIFRYRlRJRSAgICAgICAgTExfTFBVQVJUX0Rpc2FibGVJVF9UWEZUDQotICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9EaXNhYmxlSVRfVFhGVChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7DQotICBBVE9NSUNfQ0xFQVJfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX1RYRlRJRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBSWCBGSUZPIFRocmVzaG9sZCBJbnRlcnJ1cHQNCi0gKiBAcm10b2xsIENSMyAgICAgICAgICBSWEZUSUUgICAgICAgIExMX0xQVUFSVF9EaXNhYmxlSVRfUlhGVA0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRGlzYWJsZUlUX1JYRlQoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgew0KLSAgQVRPTUlDX0NMRUFSX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19SWEZUSUUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBMUFVBUlQgSURMRSBJbnRlcnJ1cHQgIHNvdXJjZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLg0KLSAqIEBybXRvbGwgQ1IxICAgICAgICAgIElETEVJRSAgICAgICAgTExfTFBVQVJUX0lzRW5hYmxlZElUX0lETEUNCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0VuYWJsZWRJVF9JRExFKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX0lETEVJRSkgPT0gKFVTQVJUX0NSMV9JRExFSUUpKQ0KLSAgICAgICAgICAgICAgPyAxVUwNCi0gICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyogTGVnYWN5IGRlZmluZSAqLw0KLSNkZWZpbmUgTExfTFBVQVJUX0lzRW5hYmxlZElUX1JYTkUgTExfTFBVQVJUX0lzRW5hYmxlZElUX1JYTkVfUlhGTkUNCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBMUFVBUlQgUlggTm90IEVtcHR5IGFuZCBMUFVBUlQgUlggRklGTyBOb3QgRW1wdHkNCi0gKiBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4NCi0gKiBAcm10b2xsIENSMSAgICAgICAgUlhORUlFX1JYRk5FSUUgIExMX0xQVUFSVF9Jc0VuYWJsZWRJVF9SWE5FX1JYRk5FDQotICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdA0KLUxMX0xQVUFSVF9Jc0VuYWJsZWRJVF9SWE5FX1JYRk5FKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFKSA9PQ0KLSAgICAgICAgICAgKFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSkpDQotICAgICAgICAgICAgICA/IDFVTA0KLSAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBMUFVBUlQgVHJhbnNtaXNzaW9uIENvbXBsZXRlIEludGVycnVwdCBpcyBlbmFibGVkIG9yDQotICogZGlzYWJsZWQuDQotICogQHJtdG9sbCBDUjEgICAgICAgICAgVENJRSAgICAgICAgICBMTF9MUFVBUlRfSXNFbmFibGVkSVRfVEMNCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0VuYWJsZWRJVF9UQyhVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9UQ0lFKSA9PSAoVVNBUlRfQ1IxX1RDSUUpKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKiBMZWdhY3kgZGVmaW5lICovDQotI2RlZmluZSBMTF9MUFVBUlRfSXNFbmFibGVkSVRfVFhFIExMX0xQVUFSVF9Jc0VuYWJsZWRJVF9UWEVfVFhGTkYNCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBMUFVBUlQgVFggRW1wdHkgYW5kIExQVUFSVCBUWCBGSUZPIE5vdCBGdWxsIEludGVycnVwdCBpcw0KLSAqIGVuYWJsZWQgb3IgZGlzYWJsZWQNCi0gKiBAcm10b2xsIENSMSAgICAgICAgIFRYRUlFX1RYRk5GSUUgIExMX0xQVUFSVF9Jc0VuYWJsZWRJVF9UWEVfVFhGTkYNCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90DQotTExfTFBVQVJUX0lzRW5hYmxlZElUX1RYRV9UWEZORihVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9UWEVJRV9UWEZORklFKSA9PQ0KLSAgICAgICAgICAgKFVTQVJUX0NSMV9UWEVJRV9UWEZORklFKSkNCi0gICAgICAgICAgICAgID8gMVVMDQotICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBQYXJpdHkgRXJyb3IgSW50ZXJydXB0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuDQotICogQHJtdG9sbCBDUjEgICAgICAgICAgUEVJRSAgICAgICAgICBMTF9MUFVBUlRfSXNFbmFibGVkSVRfUEUNCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0VuYWJsZWRJVF9QRShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9QRUlFKSA9PSAoVVNBUlRfQ1IxX1BFSUUpKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBMUFVBUlQgQ2hhcmFjdGVyIE1hdGNoIEludGVycnVwdCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLg0KLSAqIEBybXRvbGwgQ1IxICAgICAgICAgIENNSUUgICAgICAgICAgTExfTFBVQVJUX0lzRW5hYmxlZElUX0NNDQotICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfSXNFbmFibGVkSVRfQ00oVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfQ01JRSkgPT0gKFVTQVJUX0NSMV9DTUlFKSkgPyAxVUwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiB0aGUgTFBVQVJUIFRYIEZJRk8gRW1wdHkgSW50ZXJydXB0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQNCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBUWEZFSUUgICAgICAgIExMX0xQVUFSVF9Jc0VuYWJsZWRJVF9UWEZFDQotICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfSXNFbmFibGVkSVRfVFhGRShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9UWEZFSUUpID09IChVU0FSVF9DUjFfVFhGRUlFKSkNCi0gICAgICAgICAgICAgID8gMVVMDQotICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBSWCBGSUZPIEZ1bGwgSW50ZXJydXB0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQNCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBSWEZGSUUgICAgICAgIExMX0xQVUFSVF9Jc0VuYWJsZWRJVF9SWEZGDQotICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfSXNFbmFibGVkSVRfUlhGRihVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9SWEZGSUUpID09IChVU0FSVF9DUjFfUlhGRklFKSkNCi0gICAgICAgICAgICAgID8gMVVMDQotICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBFcnJvciBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4NCi0gKiBAcm10b2xsIENSMyAgICAgICAgICBFSUUgICAgICAgICAgIExMX0xQVUFSVF9Jc0VuYWJsZWRJVF9FUlJPUg0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0lzRW5hYmxlZElUX0VSUk9SKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX0VJRSkgPT0gKFVTQVJUX0NSM19FSUUpKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiB0aGUgTFBVQVJUIENUUyBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4NCi0gKiBAcm10b2xsIENSMyAgICAgICAgICBDVFNJRSAgICAgICAgIExMX0xQVUFSVF9Jc0VuYWJsZWRJVF9DVFMNCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0VuYWJsZWRJVF9DVFMoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfQ1RTSUUpID09IChVU0FSVF9DUjNfQ1RTSUUpKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBXYWtlIFVwIGZyb20gU3RvcCBNb2RlIEludGVycnVwdCBpcyBlbmFibGVkIG9yDQotICogZGlzYWJsZWQuDQotICogQHJtdG9sbCBDUjMgICAgICAgICAgV1VGSUUgICAgICAgICBMTF9MUFVBUlRfSXNFbmFibGVkSVRfV0tVUA0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0lzRW5hYmxlZElUX1dLVVAoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfV1VGSUUpID09IChVU0FSVF9DUjNfV1VGSUUpKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgTFBVQVJUIFRYIEZJRk8gVGhyZXNob2xkIEludGVycnVwdCBpcyBlbmFibGVkIG9yIGRpc2FibGVkDQotICogQHJtdG9sbCBDUjMgICAgICAgICAgVFhGVElFICAgICAgICBMTF9MUFVBUlRfSXNFbmFibGVkSVRfVFhGVA0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0lzRW5hYmxlZElUX1RYRlQoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfVFhGVElFKSA9PSAoVVNBUlRfQ1IzX1RYRlRJRSkpDQotICAgICAgICAgICAgICA/IDFVTA0KLSAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIGlmIExQVUFSVCBSWCBGSUZPIFRocmVzaG9sZCBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZA0KLSAqIEBybXRvbGwgQ1IzICAgICAgICAgIFJYRlRJRSAgICAgICAgTExfTFBVQVJUX0lzRW5hYmxlZElUX1JYRlQNCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0VuYWJsZWRJVF9SWEZUKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX1JYRlRJRSkgPT0gKFVTQVJUX0NSM19SWEZUSUUpKQ0KLSAgICAgICAgICAgICAgPyAxVUwNCi0gICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIExQVUFSVF9MTF9FRl9ETUFfTWFuYWdlbWVudCBETUFfTWFuYWdlbWVudA0KLSAqIEB7DQotICovDQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgRE1BIE1vZGUgZm9yIHJlY2VwdGlvbg0KLSAqIEBybXRvbGwgQ1IzICAgICAgICAgIERNQVIgICAgICAgICAgTExfTFBVQVJUX0VuYWJsZURNQVJlcV9SWA0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRW5hYmxlRE1BUmVxX1JYKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsNCi0gIEFUT01JQ19TRVRfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgRE1BIE1vZGUgZm9yIHJlY2VwdGlvbg0KLSAqIEBybXRvbGwgQ1IzICAgICAgICAgIERNQVIgICAgICAgICAgTExfTFBVQVJUX0Rpc2FibGVETUFSZXFfUlgNCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0Rpc2FibGVETUFSZXFfUlgoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgew0KLSAgQVRPTUlDX0NMRUFSX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19ETUFSKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiBETUEgTW9kZSBpcyBlbmFibGVkIGZvciByZWNlcHRpb24NCi0gKiBAcm10b2xsIENSMyAgICAgICAgICBETUFSICAgICAgICAgIExMX0xQVUFSVF9Jc0VuYWJsZWRETUFSZXFfUlgNCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0VuYWJsZWRETUFSZXFfUlgoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfRE1BUikgPT0gKFVTQVJUX0NSM19ETUFSKSkgPyAxVUwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgRE1BIE1vZGUgZm9yIHRyYW5zbWlzc2lvbg0KLSAqIEBybXRvbGwgQ1IzICAgICAgICAgIERNQVQgICAgICAgICAgTExfTFBVQVJUX0VuYWJsZURNQVJlcV9UWA0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRW5hYmxlRE1BUmVxX1RYKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsNCi0gIEFUT01JQ19TRVRfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgRE1BIE1vZGUgZm9yIHRyYW5zbWlzc2lvbg0KLSAqIEBybXRvbGwgQ1IzICAgICAgICAgIERNQVQgICAgICAgICAgTExfTFBVQVJUX0Rpc2FibGVETUFSZXFfVFgNCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0Rpc2FibGVETUFSZXFfVFgoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgew0KLSAgQVRPTUlDX0NMRUFSX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19ETUFUKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiBETUEgTW9kZSBpcyBlbmFibGVkIGZvciB0cmFuc21pc3Npb24NCi0gKiBAcm10b2xsIENSMyAgICAgICAgICBETUFUICAgICAgICAgIExMX0xQVUFSVF9Jc0VuYWJsZWRETUFSZXFfVFgNCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0VuYWJsZWRETUFSZXFfVFgoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfRE1BVCkgPT0gKFVTQVJUX0NSM19ETUFUKSkgPyAxVUwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgRE1BIERpc2FibGluZyBvbiBSZWNlcHRpb24gRXJyb3INCi0gKiBAcm10b2xsIENSMyAgICAgICAgICBERFJFICAgICAgICAgIExMX0xQVUFSVF9FbmFibGVETUFEZWFjdE9uUnhFcnINCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0VuYWJsZURNQURlYWN0T25SeEVycihVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7DQotICBTRVRfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX0REUkUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgRE1BIERpc2FibGluZyBvbiBSZWNlcHRpb24gRXJyb3INCi0gKiBAcm10b2xsIENSMyAgICAgICAgICBERFJFICAgICAgICAgIExMX0xQVUFSVF9EaXNhYmxlRE1BRGVhY3RPblJ4RXJyDQotICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9EaXNhYmxlRE1BRGVhY3RPblJ4RXJyKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsNCi0gIENMRUFSX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19ERFJFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBJbmRpY2F0ZSBpZiBETUEgRGlzYWJsaW5nIG9uIFJlY2VwdGlvbiBFcnJvciBpcyBkaXNhYmxlZA0KLSAqIEBybXRvbGwgQ1IzICAgICAgICAgIEREUkUgICAgICAgICAgTExfTFBVQVJUX0lzRW5hYmxlZERNQURlYWN0T25SeEVycg0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QNCi1MTF9MUFVBUlRfSXNFbmFibGVkRE1BRGVhY3RPblJ4RXJyKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX0REUkUpID09IChVU0FSVF9DUjNfRERSRSkpID8gMVVMDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IHRoZSBMUFVBUlQgZGF0YSByZWdpc3RlciBhZGRyZXNzIHVzZWQgZm9yIERNQSB0cmFuc2Zlcg0KLSAqIEBybXRvbGwgUkRSICAgICAgICAgIFJEUiAgICAgICAgICAgTExfTFBVQVJUX0RNQV9HZXRSZWdBZGRyXG4NCi0gKiBAcm10b2xsIFREUiAgICAgICAgICBURFIgICAgICAgICAgIExMX0xQVUFSVF9ETUFfR2V0UmVnQWRkcg0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcGFyYW0gIERpcmVjdGlvbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9ETUFfUkVHX0RBVEFfVFJBTlNNSVQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRE1BX1JFR19EQVRBX1JFQ0VJVkUNCi0gKiBAcmV0dmFsIEFkZHJlc3Mgb2YgZGF0YSByZWdpc3Rlcg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfRE1BX0dldFJlZ0FkZHIoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IERpcmVjdGlvbikgew0KLSAgdWludDMyX3QgZGF0YV9yZWdfYWRkcjsNCi0NCi0gIGlmIChEaXJlY3Rpb24gPT0gTExfTFBVQVJUX0RNQV9SRUdfREFUQV9UUkFOU01JVCkgew0KLSAgICAvKiByZXR1cm4gYWRkcmVzcyBvZiBURFIgcmVnaXN0ZXIgKi8NCi0gICAgZGF0YV9yZWdfYWRkciA9ICh1aW50MzJfdCkgJiAoTFBVQVJUeC0+VERSKTsNCi0gIH0gZWxzZSB7DQotICAgIC8qIHJldHVybiBhZGRyZXNzIG9mIFJEUiByZWdpc3RlciAqLw0KLSAgICBkYXRhX3JlZ19hZGRyID0gKHVpbnQzMl90KSAmIChMUFVBUlR4LT5SRFIpOw0KLSAgfQ0KLQ0KLSAgcmV0dXJuIGRhdGFfcmVnX2FkZHI7DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUZfRGF0YV9NYW5hZ2VtZW50IERhdGFfTWFuYWdlbWVudA0KLSAqIEB7DQotICovDQotDQotLyoqDQotICogQGJyaWVmICBSZWFkIFJlY2VpdmVyIERhdGEgcmVnaXN0ZXIgKFJlY2VpdmUgRGF0YSB2YWx1ZSwgOCBiaXRzKQ0KLSAqIEBybXRvbGwgUkRSICAgICAgICAgIFJEUiAgICAgICAgICAgTExfTFBVQVJUX1JlY2VpdmVEYXRhOA0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFRpbWUgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEZGDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQ4X3QgTExfTFBVQVJUX1JlY2VpdmVEYXRhOChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7DQotICByZXR1cm4gKHVpbnQ4X3QpKFJFQURfQklUKExQVUFSVHgtPlJEUiwgVVNBUlRfUkRSX1JEUikgJiAweEZGVSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmVhZCBSZWNlaXZlciBEYXRhIHJlZ2lzdGVyIChSZWNlaXZlIERhdGEgdmFsdWUsIDkgYml0cykNCi0gKiBAcm10b2xsIFJEUiAgICAgICAgICBSRFIgICAgICAgICAgIExMX0xQVUFSVF9SZWNlaXZlRGF0YTkNCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBUaW1lIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHgxRkYNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDE2X3QgTExfTFBVQVJUX1JlY2VpdmVEYXRhOShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7DQotICByZXR1cm4gKHVpbnQxNl90KShSRUFEX0JJVChMUFVBUlR4LT5SRFIsIFVTQVJUX1JEUl9SRFIpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBXcml0ZSBpbiBUcmFuc21pdHRlciBEYXRhIFJlZ2lzdGVyIChUcmFuc21pdCBEYXRhIHZhbHVlLCA4IGJpdHMpDQotICogQHJtdG9sbCBURFIgICAgICAgICAgVERSICAgICAgICAgICBMTF9MUFVBUlRfVHJhbnNtaXREYXRhOA0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcGFyYW0gIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9UcmFuc21pdERhdGE4KFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBWYWx1ZSkgew0KLSAgTFBVQVJUeC0+VERSID0gVmFsdWU7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgV3JpdGUgaW4gVHJhbnNtaXR0ZXIgRGF0YSBSZWdpc3RlciAoVHJhbnNtaXQgRGF0YSB2YWx1ZSwgOSBiaXRzKQ0KLSAqIEBybXRvbGwgVERSICAgICAgICAgIFREUiAgICAgICAgICAgTExfTFBVQVJUX1RyYW5zbWl0RGF0YTkNCi0gKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlDQotICogQHBhcmFtICBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4MUZGDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX1RyYW5zbWl0RGF0YTkoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBWYWx1ZSkgew0KLSAgTFBVQVJUeC0+VERSID0gVmFsdWUgJiAweDFGRlVMOw0KLX0NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX0VGX0V4ZWN1dGlvbiBFeGVjdXRpb24NCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmVxdWVzdCBCcmVhayBzZW5kaW5nDQotICogQHJtdG9sbCBSUVIgICAgICAgICAgU0JLUlEgICAgICAgICBMTF9MUFVBUlRfUmVxdWVzdEJyZWFrU2VuZGluZw0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfUmVxdWVzdEJyZWFrU2VuZGluZyhVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7DQotICBTRVRfQklUKExQVUFSVHgtPlJRUiwgKHVpbnQxNl90KVVTQVJUX1JRUl9TQktSUSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUHV0IExQVUFSVCBpbiBtdXRlIG1vZGUgYW5kIHNldCB0aGUgUldVIGZsYWcNCi0gKiBAcm10b2xsIFJRUiAgICAgICAgICBNTVJRICAgICAgICAgIExMX0xQVUFSVF9SZXF1ZXN0RW50ZXJNdXRlTW9kZQ0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfUmVxdWVzdEVudGVyTXV0ZU1vZGUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgew0KLSAgU0VUX0JJVChMUFVBUlR4LT5SUVIsICh1aW50MTZfdClVU0FSVF9SUVJfTU1SUSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmVxdWVzdCBhIFJlY2VpdmUgRGF0YSBhbmQgRklGTyBmbHVzaA0KLSAqIEBub3RlICAgQWxsb3dzIHRvIGRpc2NhcmQgdGhlIHJlY2VpdmVkIGRhdGEgd2l0aG91dCByZWFkaW5nIHRoZW0sIGFuZCBhdm9pZA0KLSAqIGFuIG92ZXJydW4gY29uZGl0aW9uLg0KLSAqIEBybXRvbGwgUlFSICAgICAgICAgIFJYRlJRICAgICAgICAgTExfTFBVQVJUX1JlcXVlc3RSeERhdGFGbHVzaA0KLSAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfUmVxdWVzdFJ4RGF0YUZsdXNoKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsNCi0gIFNFVF9CSVQoTFBVQVJUeC0+UlFSLCAodWludDE2X3QpVVNBUlRfUlFSX1JYRlJRKTsNCi19DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0jaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpDQotLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUZfSW5pdCBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zDQotICogQHsNCi0gKi8NCi1FcnJvclN0YXR1cyBMTF9MUFVBUlRfRGVJbml0KFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpOw0KLUVycm9yU3RhdHVzIExMX0xQVUFSVF9Jbml0KFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfTFBVQVJUX0luaXRUeXBlRGVmICpMUFVBUlRfSW5pdFN0cnVjdCk7DQotdm9pZCBMTF9MUFVBUlRfU3RydWN0SW5pdChMTF9MUFVBUlRfSW5pdFR5cGVEZWYgKkxQVUFSVF9Jbml0U3RydWN0KTsNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLSNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotI2VuZGlmIC8qIExQVUFSVDEgKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLSNpZmRlZiBfX2NwbHVzcGx1cw0KLX0NCi0jZW5kaWYNCi0NCi0jZW5kaWYgLyogU1RNMzJHNHh4X0xMX0xQVUFSVF9IICovDQorLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAZmlsZSAgICBzdG0zMmc0eHhfbGxfbHB1YXJ0LmgKKyAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBMUFVBUlQgTEwgbW9kdWxlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGF0dGVudGlvbgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGVybXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZQorICogaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc29mdHdhcmUgY29tcG9uZW50LgorICogSWYgbm8gTElDRU5TRSBmaWxlIGNvbWVzIHdpdGggdGhpcyBzb2Z0d2FyZSwgaXQgaXMgcHJvdmlkZWQgQVMtSVMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyRzR4eF9MTF9MUFVBUlRfSAorI2RlZmluZSBTVE0zMkc0eHhfTExfTFBVQVJUX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzR4eC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHNHh4X0xMX0RyaXZlcgorICogQHsKKyAqLworCisjaWYgZGVmaW5lZChMUFVBUlQxKQorCisvKiogQGRlZmdyb3VwIExQVUFSVF9MTCBMUFVBUlQKKyAqIEB7CisgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIExQVUFSVF9MTF9Qcml2YXRlX1ZhcmlhYmxlcyBMUFVBUlQgUHJpdmF0ZSBWYXJpYWJsZXMKKyAqIEB7CisgKi8KKy8qIEFycmF5IHVzZWQgdG8gZ2V0IHRoZSBMUFVBUlQgcHJlc2NhbGVyIGRpdmlzaW9uIGRlY2ltYWwgdmFsdWVzIHZlcnN1cyBAcmVmCisgKiBMUFVBUlRfTExfRUNfUFJFU0NBTEVSIHZhbHVlcyAqLworc3RhdGljIGNvbnN0IHVpbnQxNl90IExQVUFSVF9QUkVTQ0FMRVJfVEFCW10gPSB7CisgICAgKHVpbnQxNl90KTEsICAodWludDE2X3QpMiwgICh1aW50MTZfdCk0LCAgICh1aW50MTZfdCk2LAorICAgICh1aW50MTZfdCk4LCAgKHVpbnQxNl90KTEwLCAodWludDE2X3QpMTIsICAodWludDE2X3QpMTYsCisgICAgKHVpbnQxNl90KTMyLCAodWludDE2X3QpNjQsICh1aW50MTZfdCkxMjgsICh1aW50MTZfdCkyNTZ9OworLyoqCisgKiBAfQorICovCisKKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIExQVUFSVF9MTF9Qcml2YXRlX0NvbnN0YW50cyBMUFVBUlQgUHJpdmF0ZSBDb25zdGFudHMKKyAqIEB7CisgKi8KKy8qIERlZmluZXMgdXNlZCBpbiBCYXVkIFJhdGUgcmVsYXRlZCBtYWNyb3MgYW5kIGNvcnJlc3BvbmRpbmcgcmVnaXN0ZXIgc2V0dGluZworICogY29tcHV0YXRpb24gKi8KKyNkZWZpbmUgTFBVQVJUX0xQVUFSVERJVl9GUkVRX01VTCAyNTZVCisjZGVmaW5lIExQVUFSVF9CUlJfTUFTSyAweDAwMEZGRkZGVQorI2RlZmluZSBMUFVBUlRfQlJSX01JTl9WQUxVRSAweDAwMDAwMzAwVQorLyoqCisgKiBAfQorICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIExQVUFSVF9MTF9Qcml2YXRlX01hY3JvcyBMUFVBUlQgUHJpdmF0ZSBNYWNyb3MKKyAqIEB7CisgKi8KKy8qKgorICogQH0KKyAqLworI2VuZGlmIC8qVVNFX0ZVTExfTExfRFJJVkVSKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX0VTX0lOSVQgTFBVQVJUIEV4cG9ydGVkIEluaXQgc3RydWN0dXJlcworICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiBMTCBMUFVBUlQgSW5pdCBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQzMl90IFByZXNjYWxlclZhbHVlOyAvKiE8IFNwZWNpZmllcyB0aGUgUHJlc2NhbGVyIHRvIGNvbXB1dGUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tdW5pY2F0aW9uIGJhdWQgcmF0ZS4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIG9mIEByZWYgTFBVQVJUX0xMX0VDX1BSRVNDQUxFUi4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9MUFVBUlRfU2V0UHJlc2NhbGVyKCkuKi8KKworICB1aW50MzJfdAorICAgICAgQmF1ZFJhdGU7IC8qITwgVGhpcyBmaWVsZCBkZWZpbmVzIGV4cGVjdGVkIExQVUFSVCBjb21tdW5pY2F0aW9uIGJhdWQgcmF0ZS4KKworICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkKKyAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEByZWYgTExfTFBVQVJUX1NldEJhdWRSYXRlKCkuKi8KKworICB1aW50MzJfdCBEYXRhV2lkdGg7IC8qITwgU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgZGF0YSBiaXRzIHRyYW5zbWl0dGVkIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZWQgaW4gYSBmcmFtZS4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExQVUFSVF9MTF9FQ19EQVRBV0lEVEguCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBAcmVmIExMX0xQVUFSVF9TZXREYXRhV2lkdGgoKS4qLworCisgIHVpbnQzMl90IFN0b3BCaXRzOyAvKiE8IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHN0b3AgYml0cyB0cmFuc21pdHRlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgTFBVQVJUX0xMX0VDX1NUT1BCSVRTLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEByZWYgTExfTFBVQVJUX1NldFN0b3BCaXRzTGVuZ3RoKCkuKi8KKworICB1aW50MzJfdAorICAgICAgUGFyaXR5OyAvKiE8IFNwZWNpZmllcyB0aGUgcGFyaXR5IG1vZGUuCisgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBMUFVBUlRfTExfRUNfUEFSSVRZLgorCisgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkKKyAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBAcmVmIExMX0xQVUFSVF9TZXRQYXJpdHkoKS4qLworCisgIHVpbnQzMl90IFRyYW5zZmVyRGlyZWN0aW9uOyAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBSZWNlaXZlIGFuZC9vciBUcmFuc21pdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLiBUaGlzIHBhcmFtZXRlciBjYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGEgdmFsdWUgb2YgQHJlZiBMUFVBUlRfTExfRUNfRElSRUNUSU9OLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdGFyeSBmdW5jdGlvbiBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTF9MUFVBUlRfU2V0VHJhbnNmZXJEaXJlY3Rpb24oKS4qLworCisgIHVpbnQzMl90CisgICAgICBIYXJkd2FyZUZsb3dDb250cm9sOyAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBoYXJkd2FyZSBmbG93IGNvbnRyb2wgbW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIG9mIEByZWYgTFBVQVJUX0xMX0VDX0hXQ09OVFJPTC4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9MUFVBUlRfU2V0SFdGbG93Q3RybCgpLiovCisKK30gTExfTFBVQVJUX0luaXRUeXBlRGVmOworCisvKioKKyAqIEB9CisgKi8KKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX0V4cG9ydGVkX0NvbnN0YW50cyBMUFVBUlQgRXhwb3J0ZWQgQ29uc3RhbnRzCisgKiBAeworICovCisKKy8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX0VDX0NMRUFSX0ZMQUcgQ2xlYXIgRmxhZ3MgRGVmaW5lcworICogQGJyaWVmICAgIEZsYWdzIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9MUFVBUlRfV3JpdGVSZWcgZnVuY3Rpb24KKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0lDUl9QRUNGIFVTQVJUX0lDUl9QRUNGIC8qITwgUGFyaXR5IGVycm9yIGNsZWFyIGZsYWcgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0lDUl9GRUNGIFVTQVJUX0lDUl9GRUNGIC8qITwgRnJhbWluZyBlcnJvciBjbGVhciBmbGFnICovCisjZGVmaW5lIExMX0xQVUFSVF9JQ1JfTkNGICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFVTQVJUX0lDUl9ORUNGIC8qITwgTm9pc2UgZXJyb3IgZGV0ZWN0ZWQgY2xlYXIgZmxhZyBcCisgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9MUFVBUlRfSUNSX09SRUNGIFVTQVJUX0lDUl9PUkVDRiAvKiE8IE92ZXJydW4gZXJyb3IgY2xlYXIgZmxhZyAqLworI2RlZmluZSBMTF9MUFVBUlRfSUNSX0lETEVDRiBcCisgIFVTQVJUX0lDUl9JRExFQ0YgLyohPCBJZGxlIGxpbmUgZGV0ZWN0ZWQgY2xlYXIgZmxhZyAqLworI2RlZmluZSBMTF9MUFVBUlRfSUNSX1RDQ0YgXAorICBVU0FSVF9JQ1JfVENDRiAvKiE8IFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBjbGVhciBmbGFnICovCisjZGVmaW5lIExMX0xQVUFSVF9JQ1JfQ1RTQ0YgVVNBUlRfSUNSX0NUU0NGIC8qITwgQ1RTIGNsZWFyIGZsYWcgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0lDUl9DTUNGIFVTQVJUX0lDUl9DTUNGICAgLyohPCBDaGFyYWN0ZXIgbWF0Y2ggY2xlYXIgZmxhZyAqLworI2RlZmluZSBMTF9MUFVBUlRfSUNSX1dVQ0YgXAorICBVU0FSVF9JQ1JfV1VDRiAvKiE8IFdha2V1cCBmcm9tIFN0b3AgbW9kZSBjbGVhciBmbGFnICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUNfR0VUX0ZMQUcgR2V0IEZsYWdzIERlZmluZXMKKyAqIEBicmllZiAgICBGbGFncyBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfTFBVQVJUX1JlYWRSZWcgZnVuY3Rpb24KKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0lTUl9QRSBVU0FSVF9JU1JfUEUgICAgIC8qITwgUGFyaXR5IGVycm9yIGZsYWcgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0lTUl9GRSBVU0FSVF9JU1JfRkUgICAgIC8qITwgRnJhbWluZyBlcnJvciBmbGFnICovCisjZGVmaW5lIExMX0xQVUFSVF9JU1JfTkUgVVNBUlRfSVNSX05FICAgICAvKiE8IE5vaXNlIGRldGVjdGVkIGZsYWcgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0lTUl9PUkUgVVNBUlRfSVNSX09SRSAgIC8qITwgT3ZlcnJ1biBlcnJvciBmbGFnICovCisjZGVmaW5lIExMX0xQVUFSVF9JU1JfSURMRSBVU0FSVF9JU1JfSURMRSAvKiE8IElkbGUgbGluZSBkZXRlY3RlZCBmbGFnICovCisjZGVmaW5lIExMX0xQVUFSVF9JU1JfUlhORV9SWEZORSBcCisgIFVTQVJUX0lTUl9SWE5FX1JYRk5FIC8qITwgUmVhZCBkYXRhIHJlZ2lzdGVyIG9yIFJYIEZJRk8gbm90IGVtcHR5IGZsYWcgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0lTUl9UQyBVU0FSVF9JU1JfVEMgLyohPCBUcmFuc21pc3Npb24gY29tcGxldGUgZmxhZyAqLworI2RlZmluZSBMTF9MUFVBUlRfSVNSX1RYRV9UWEZORiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVVNBUlRfSVNSX1RYRV9UWEZORiAvKiE8IFRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgZW1wdHkgb3IgVFggRklGTyBOb3QgRnVsbCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZyovCisjZGVmaW5lIExMX0xQVUFSVF9JU1JfQ1RTSUYgVVNBUlRfSVNSX0NUU0lGIC8qITwgQ1RTIGludGVycnVwdCBmbGFnICovCisjZGVmaW5lIExMX0xQVUFSVF9JU1JfQ1RTIFVTQVJUX0lTUl9DVFMgICAgIC8qITwgQ1RTIGZsYWcgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0lTUl9CVVNZIFVTQVJUX0lTUl9CVVNZICAgLyohPCBCdXN5IGZsYWcgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0lTUl9DTUYgVVNBUlRfSVNSX0NNRiAgICAgLyohPCBDaGFyYWN0ZXIgbWF0Y2ggZmxhZyAqLworI2RlZmluZSBMTF9MUFVBUlRfSVNSX1NCS0YgVVNBUlRfSVNSX1NCS0YgICAvKiE8IFNlbmQgYnJlYWsgZmxhZyAqLworI2RlZmluZSBMTF9MUFVBUlRfSVNSX1JXVSBcCisgIFVTQVJUX0lTUl9SV1UgLyohPCBSZWNlaXZlciB3YWtldXAgZnJvbSBNdXRlIG1vZGUgZmxhZyAqLworI2RlZmluZSBMTF9MUFVBUlRfSVNSX1dVRiBVU0FSVF9JU1JfV1VGIC8qITwgV2FrZXVwIGZyb20gU3RvcCBtb2RlIGZsYWcgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0lTUl9URUFDSyBcCisgIFVTQVJUX0lTUl9URUFDSyAvKiE8IFRyYW5zbWl0IGVuYWJsZSBhY2tub3dsZWRnZSBmbGFnICovCisjZGVmaW5lIExMX0xQVUFSVF9JU1JfUkVBQ0sgXAorICBVU0FSVF9JU1JfUkVBQ0sgLyohPCBSZWNlaXZlIGVuYWJsZSBhY2tub3dsZWRnZSBmbGFnICovCisjZGVmaW5lIExMX0xQVUFSVF9JU1JfVFhGRSBVU0FSVF9JU1JfVFhGRSAvKiE8IFRYIEZJRk8gZW1wdHkgZmxhZyAqLworI2RlZmluZSBMTF9MUFVBUlRfSVNSX1JYRkYgVVNBUlRfSVNSX1JYRkYgLyohPCBSWCBGSUZPIGZ1bGwgZmxhZyAqLworI2RlZmluZSBMTF9MUFVBUlRfSVNSX1JYRlQgVVNBUlRfSVNSX1JYRlQgLyohPCBSWCBGSUZPIHRocmVzaG9sZCBmbGFnICovCisjZGVmaW5lIExMX0xQVUFSVF9JU1JfVFhGVCBVU0FSVF9JU1JfVFhGVCAvKiE8IFRYIEZJRk8gdGhyZXNob2xkIGZsYWcgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIExQVUFSVF9MTF9FQ19JVCBJVCBEZWZpbmVzCisgKiBAYnJpZWYgICAgSVQgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX0xQVUFSVF9SZWFkUmVnIGFuZAorICogTExfTFBVQVJUX1dyaXRlUmVnIGZ1bmN0aW9ucworICogQHsKKyAqLworI2RlZmluZSBMTF9MUFVBUlRfQ1IxX0lETEVJRSBVU0FSVF9DUjFfSURMRUlFIC8qITwgSURMRSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX0xQVUFSVF9DUjFfUlhORUlFX1JYRk5FSUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSAvKiE8IFJlYWQgZGF0YSByZWdpc3RlciBhbmQgUlhGSUZPIG5vdCBlbXB0eSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0NSMV9UQ0lFIFwKKyAgVVNBUlRfQ1IxX1RDSUUgLyohPCBUcmFuc21pc3Npb24gY29tcGxldGUgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBMTF9MUFVBUlRfQ1IxX1RYRUlFX1RYRk5GSUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBVU0FSVF9DUjFfVFhFSUVfVFhGTkZJRSAvKiE8IFRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgZW1wdHkgYW5kIFRYIEZJRk8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBmdWxsIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0NSMV9QRUlFIFVTQVJUX0NSMV9QRUlFIC8qITwgUGFyaXR5IGVycm9yICovCisjZGVmaW5lIExMX0xQVUFSVF9DUjFfQ01JRSBcCisgIFVTQVJUX0NSMV9DTUlFIC8qITwgQ2hhcmFjdGVyIG1hdGNoIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0NSMV9UWEZFSUUgXAorICBVU0FSVF9DUjFfVFhGRUlFIC8qITwgVFggRklGTyBlbXB0eSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX0xQVUFSVF9DUjFfUlhGRklFIFwKKyAgVVNBUlRfQ1IxX1JYRkZJRSAgICAgICAgICAgICAgICAgICAgICAvKiE8IFJYIEZJRk8gZnVsbCBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX0xQVUFSVF9DUjNfRUlFIFVTQVJUX0NSM19FSUUgLyohPCBFcnJvciBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX0xQVUFSVF9DUjNfQ1RTSUUgVVNBUlRfQ1IzX0NUU0lFIC8qITwgQ1RTIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0NSM19XVUZJRSBcCisgIFVTQVJUX0NSM19XVUZJRSAvKiE8IFdha2V1cCBmcm9tIFN0b3AgbW9kZSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX0xQVUFSVF9DUjNfVFhGVElFIFwKKyAgVVNBUlRfQ1IzX1RYRlRJRSAvKiE8IFRYIEZJRk8gdGhyZXNob2xkIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0NSM19SWEZUSUUgXAorICBVU0FSVF9DUjNfUlhGVElFIC8qITwgUlggRklGTyB0aHJlc2hvbGQgaW50ZXJydXB0IGVuYWJsZSAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX0VDX0ZJRk9USFJFU0hPTEQgRklGTyBUaHJlc2hvbGQKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0ZJRk9USFJFU0hPTERfMV84IFwKKyAgMHgwMDAwMDAwMFUgLyohPCBGSUZPIHJlYWNoZXMgMS84IG9mIGl0cyBkZXB0aCAqLworI2RlZmluZSBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF8xXzQgXAorICAweDAwMDAwMDAxVSAvKiE8IEZJRk8gcmVhY2hlcyAxLzQgb2YgaXRzIGRlcHRoICovCisjZGVmaW5lIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzFfMiBcCisgIDB4MDAwMDAwMDJVIC8qITwgRklGTyByZWFjaGVzIDEvMiBvZiBpdHMgZGVwdGggKi8KKyNkZWZpbmUgTExfTFBVQVJUX0ZJRk9USFJFU0hPTERfM180IFwKKyAgMHgwMDAwMDAwM1UgLyohPCBGSUZPIHJlYWNoZXMgMy80IG9mIGl0cyBkZXB0aCAqLworI2RlZmluZSBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF83XzggXAorICAweDAwMDAwMDA0VSAvKiE8IEZJRk8gcmVhY2hlcyA3Lzggb2YgaXRzIGRlcHRoICovCisjZGVmaW5lIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzhfOCBcCisgIDB4MDAwMDAwMDVVIC8qITwgRklGTyBiZWNvbWVzIGVtcHR5IGZvciBUWCBhbmQgZnVsbCBmb3IgUlggKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIExQVUFSVF9MTF9FQ19ESVJFQ1RJT04gRGlyZWN0aW9uCisgKiBAeworICovCisjZGVmaW5lIExMX0xQVUFSVF9ESVJFQ1RJT05fTk9ORSBcCisgIDB4MDAwMDAwMDBVIC8qITwgVHJhbnNtaXR0ZXIgYW5kIFJlY2VpdmVyIGFyZSBkaXNhYmxlZCAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0RJUkVDVElPTl9SWCBcCisgIFVTQVJUX0NSMV9SRSAvKiE8IFRyYW5zbWl0dGVyIGlzIGRpc2FibGVkIGFuZCBSZWNlaXZlciBpcyBlbmFibGVkICovCisjZGVmaW5lIExMX0xQVUFSVF9ESVJFQ1RJT05fVFggXAorICBVU0FSVF9DUjFfVEUgLyohPCBUcmFuc21pdHRlciBpcyBlbmFibGVkIGFuZCBSZWNlaXZlciBpcyBkaXNhYmxlZCAqLworI2RlZmluZSBMTF9MUFVBUlRfRElSRUNUSU9OX1RYX1JYIFwKKyAgKFVTQVJUX0NSMV9URSB8IFVTQVJUX0NSMV9SRSkgLyohPCBUcmFuc21pdHRlciBhbmQgUmVjZWl2ZXIgYXJlIGVuYWJsZWQgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIExQVUFSVF9MTF9FQ19QQVJJVFkgUGFyaXR5IENvbnRyb2wKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfTFBVQVJUX1BBUklUWV9OT05FIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBQYXJpdHkgY29udHJvbCBkaXNhYmxlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9MUFVBUlRfUEFSSVRZX0VWRU4gXAorICBVU0FSVF9DUjFfUENFIC8qITwgUGFyaXR5IGNvbnRyb2wgZW5hYmxlZCBhbmQgRXZlbiBQYXJpdHkgaXMgc2VsZWN0ZWQgKi8KKyNkZWZpbmUgTExfTFBVQVJUX1BBUklUWV9PREQgXAorICAoVVNBUlRfQ1IxX1BDRSB8ICAgICAgICAgICBcCisgICBVU0FSVF9DUjFfUFMpIC8qITwgUGFyaXR5IGNvbnRyb2wgZW5hYmxlZCBhbmQgT2RkIFBhcml0eSBpcyBzZWxlY3RlZCAgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIExQVUFSVF9MTF9FQ19XQUtFVVAgV2FrZXVwCisgKiBAeworICovCisjZGVmaW5lIExMX0xQVUFSVF9XQUtFVVBfSURMRUxJTkUgXAorICAweDAwMDAwMDAwVSAvKiE8ICBMUFVBUlQgd2FrZSB1cCBmcm9tIE11dGUgbW9kZSBvbiBJZGxlIExpbmUgICAgKi8KKyNkZWZpbmUgTExfTFBVQVJUX1dBS0VVUF9BRERSRVNTTUFSSyBcCisgIFVTQVJUX0NSMV9XQUtFIC8qITwgIExQVUFSVCB3YWtlIHVwIGZyb20gTXV0ZSBtb2RlIG9uIEFkZHJlc3MgTWFyayAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX0VDX0RBVEFXSURUSCBEYXRhd2lkdGgKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0RBVEFXSURUSF83QiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBVU0FSVF9DUjFfTTEgLyohPCA3IGJpdHMgd29yZCBsZW5ndGggOiBTdGFydCBiaXQsIDcgZGF0YSBiaXRzLCBuIHN0b3AgYml0cyBcCisgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0RBVEFXSURUSF84QiBcCisgIDB4MDAwMDAwMDBVIC8qITwgOCBiaXRzIHdvcmQgbGVuZ3RoIDogU3RhcnQgYml0LCA4IGRhdGEgYml0cywgbiBzdG9wIGJpdHMgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0RBVEFXSURUSF85QiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBVU0FSVF9DUjFfTTAgLyohPCA5IGJpdHMgd29yZCBsZW5ndGggOiBTdGFydCBiaXQsIDkgZGF0YSBiaXRzLCBuIHN0b3AgYml0cyBcCisgICAgICAgICAgICAgICAgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIExQVUFSVF9MTF9FQ19QUkVTQ0FMRVIgQ2xvY2sgU291cmNlIFByZXNjYWxlcgorICogQHsKKyAqLworI2RlZmluZSBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjEgMHgwMDAwMDAwMFUgLyohPCBJbnB1dCBjbG9jayBub3QgZGl2aWRlZCAgICovCisjZGVmaW5lIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMiBcCisgIChVU0FSVF9QUkVTQ19QUkVTQ0FMRVJfMCkgLyohPCBJbnB1dCBjbG9jayBkaXZpZGVkIGJ5IDIgICovCisjZGVmaW5lIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWNCBcCisgIChVU0FSVF9QUkVTQ19QUkVTQ0FMRVJfMSkgLyohPCBJbnB1dCBjbG9jayBkaXZpZGVkIGJ5IDQgICovCisjZGVmaW5lIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWNiBcCisgIChVU0FSVF9QUkVTQ19QUkVTQ0FMRVJfMSB8ICAgICBcCisgICBVU0FSVF9QUkVTQ19QUkVTQ0FMRVJfMCkgLyohPCBJbnB1dCBjbG9jayBkaXZpZGVkIGJ5IDYgICovCisjZGVmaW5lIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWOCBcCisgIChVU0FSVF9QUkVTQ19QUkVTQ0FMRVJfMikgLyohPCBJbnB1dCBjbG9jayBkaXZpZGVkIGJ5IDggICovCisjZGVmaW5lIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMTAgXAorICAoVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzIgfCAgICAgIFwKKyAgIFVTQVJUX1BSRVNDX1BSRVNDQUxFUl8wKSAvKiE8IElucHV0IGNsb2NrIGRpdmlkZWQgYnkgMTAgKi8KKyNkZWZpbmUgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYxMiBcCisgIChVU0FSVF9QUkVTQ19QUkVTQ0FMRVJfMiB8ICAgICAgXAorICAgVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzEpIC8qITwgSW5wdXQgY2xvY2sgZGl2aWRlZCBieSAxMiAqLworI2RlZmluZSBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjE2ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKFVTQVJUX1BSRVNDX1BSRVNDQUxFUl8yIHwgVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzEgfCBcCisgICBVU0FSVF9QUkVTQ19QUkVTQ0FMRVJfMCkgLyohPCBJbnB1dCBjbG9jayBkaXZpZGVkIGJ5IDE2ICovCisjZGVmaW5lIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMzIgXAorICAoVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzMpIC8qITwgSW5wdXQgY2xvY2sgZGl2aWRlZCBieSAzMiAqLworI2RlZmluZSBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjY0IFwKKyAgKFVTQVJUX1BSRVNDX1BSRVNDQUxFUl8zIHwgICAgICBcCisgICBVU0FSVF9QUkVTQ19QUkVTQ0FMRVJfMCkgLyohPCBJbnB1dCBjbG9jayBkaXZpZGVkIGJ5IDY0ICovCisjZGVmaW5lIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMTI4IFwKKyAgKFVTQVJUX1BSRVNDX1BSRVNDQUxFUl8zIHwgICAgICAgXAorICAgVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzEpIC8qITwgSW5wdXQgY2xvY2sgZGl2aWRlZCBieSAxMjggKi8KKyNkZWZpbmUgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYyNTYgICAgICAgICAgICAgICAgICAgICBcCisgIChVU0FSVF9QUkVTQ19QUkVTQ0FMRVJfMyB8IFVTQVJUX1BSRVNDX1BSRVNDQUxFUl8xIHwgXAorICAgVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzApIC8qITwgSW5wdXQgY2xvY2sgZGl2aWRlZCBieSAyNTYgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIExQVUFSVF9MTF9FQ19TVE9QQklUUyBTdG9wIEJpdHMKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfTFBVQVJUX1NUT1BCSVRTXzEgMHgwMDAwMDAwMFUgICAgICAvKiE8IDEgc3RvcCBiaXQgKi8KKyNkZWZpbmUgTExfTFBVQVJUX1NUT1BCSVRTXzIgVVNBUlRfQ1IyX1NUT1BfMSAvKiE8IDIgc3RvcCBiaXRzICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUNfVFhSWCBUWCBSWCBQaW5zIFN3YXAKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfTFBVQVJUX1RYUlhfU1RBTkRBUkQgXAorICAweDAwMDAwMDAwVSAvKiE8IFRYL1JYIHBpbnMgYXJlIHVzZWQgYXMgZGVmaW5lZCBpbiBzdGFuZGFyZCBwaW5vdXQgKi8KKyNkZWZpbmUgTExfTFBVQVJUX1RYUlhfU1dBUFBFRCBcCisgIChVU0FSVF9DUjJfU1dBUCkgLyohPCBUWCBhbmQgUlggcGlucyBmdW5jdGlvbnMgYXJlIHN3YXBwZWQuICAgICAgICAgICAgICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUNfUlhQSU5fTEVWRUwgUlggUGluIEFjdGl2ZSBMZXZlbCBJbnZlcnNpb24KKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfTFBVQVJUX1JYUElOX0xFVkVMX1NUQU5EQVJEIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBSWCBwaW4gc2lnbmFsIHdvcmtzIHVzaW5nIHRoZSBzdGFuZGFyZCBsb2dpYyBsZXZlbHMgKi8KKyNkZWZpbmUgTExfTFBVQVJUX1JYUElOX0xFVkVMX0lOVkVSVEVEIFwKKyAgKFVTQVJUX0NSMl9SWElOVikgLyohPCBSWCBwaW4gc2lnbmFsIHZhbHVlcyBhcmUgaW52ZXJ0ZWQuICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUNfVFhQSU5fTEVWRUwgVFggUGluIEFjdGl2ZSBMZXZlbCBJbnZlcnNpb24KKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfTFBVQVJUX1RYUElOX0xFVkVMX1NUQU5EQVJEIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBUWCBwaW4gc2lnbmFsIHdvcmtzIHVzaW5nIHRoZSBzdGFuZGFyZCBsb2dpYyBsZXZlbHMgKi8KKyNkZWZpbmUgTExfTFBVQVJUX1RYUElOX0xFVkVMX0lOVkVSVEVEIFwKKyAgKFVTQVJUX0NSMl9UWElOVikgLyohPCBUWCBwaW4gc2lnbmFsIHZhbHVlcyBhcmUgaW52ZXJ0ZWQuICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUNfQklOQVJZX0xPR0lDIEJpbmFyeSBEYXRhIEludmVyc2lvbgorICogQHsKKyAqLworI2RlZmluZSBMTF9MUFVBUlRfQklOQVJZX0xPR0lDX1BPU0lUSVZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBMb2dpY2FsIGRhdGEgZnJvbSB0aGUgZGF0YSByZWdpc3RlciBhcmUgc2VuZC9yZWNlaXZlZCBcCisgICAgICAgICAgICAgICAgICAgaW4gcG9zaXRpdmUvZGlyZWN0IGxvZ2ljLiAoMT1ILCAwPUwpICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0JJTkFSWV9MT0dJQ19ORUdBVElWRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFVTQVJUX0NSMl9EQVRBSU5WIC8qITwgTG9naWNhbCBkYXRhIGZyb20gdGhlIGRhdGEgcmVnaXN0ZXIgYXJlIHNlbmQvcmVjZWl2ZWQgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGluIG5lZ2F0aXZlL2ludmVyc2UgbG9naWMuICgxPUwsIDA9SCkuICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgcGFyaXR5IGJpdCBpcyBhbHNvIGludmVydGVkLiAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX0VDX0JJVE9SREVSIEJpdCBPcmRlcgorICogQHsKKyAqLworI2RlZmluZSBMTF9MUFVBUlRfQklUT1JERVJfTFNCRklSU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMDAwMDBVIC8qITwgZGF0YSBpcyB0cmFuc21pdHRlZC9yZWNlaXZlZCB3aXRoIGRhdGEgYml0IDAgZmlyc3QsIFwKKyAgICAgICAgICAgICAgICAgICBmb2xsb3dpbmcgdGhlIHN0YXJ0IGJpdCAqLworI2RlZmluZSBMTF9MUFVBUlRfQklUT1JERVJfTVNCRklSU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBVU0FSVF9DUjJfTVNCRklSU1QgLyohPCBkYXRhIGlzIHRyYW5zbWl0dGVkL3JlY2VpdmVkIHdpdGggdGhlIE1TQiBmaXJzdCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xsb3dpbmcgdGhlIHN0YXJ0IGJpdCAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX0VDX0FERFJFU1NfREVURUNUIEFkZHJlc3MgTGVuZ3RoIERldGVjdGlvbgorICogQHsKKyAqLworI2RlZmluZSBMTF9MUFVBUlRfQUREUkVTU19ERVRFQ1RfNEIgXAorICAweDAwMDAwMDAwVSAvKiE8IDQtYml0IGFkZHJlc3MgZGV0ZWN0aW9uIG1ldGhvZCBzZWxlY3RlZCAqLworI2RlZmluZSBMTF9MUFVBUlRfQUREUkVTU19ERVRFQ1RfN0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBVU0FSVF9DUjJfQURETTcgLyohPCA3LWJpdCBhZGRyZXNzIGRldGVjdGlvbiAoaW4gOC1iaXQgZGF0YSBtb2RlKSBtZXRob2QgXAorICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIExQVUFSVF9MTF9FQ19IV0NPTlRST0wgSGFyZHdhcmUgQ29udHJvbAorICogQHsKKyAqLworI2RlZmluZSBMTF9MUFVBUlRfSFdDT05UUk9MX05PTkUgXAorICAweDAwMDAwMDAwVSAvKiE8IENUUyBhbmQgUlRTIGhhcmR3YXJlIGZsb3cgY29udHJvbCBkaXNhYmxlZCAqLworI2RlZmluZSBMTF9MUFVBUlRfSFdDT05UUk9MX1JUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFVTQVJUX0NSM19SVFNFIC8qITwgUlRTIG91dHB1dCBlbmFibGVkLCBkYXRhIGlzIG9ubHkgcmVxdWVzdGVkIFwKKyAgICAgICAgICAgICAgICAgICAgICB3aGVuIHRoZXJlIGlzIHNwYWNlIGluIHRoZSByZWNlaXZlIGJ1ZmZlciAgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0hXQ09OVFJPTF9DVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBVU0FSVF9DUjNfQ1RTRSAvKiE8IENUUyBtb2RlIGVuYWJsZWQsIGRhdGEgaXMgb25seSB0cmFuc21pdHRlZCBcCisgICAgICAgICAgICAgICAgICAgICAgd2hlbiB0aGUgbkNUUyBpbnB1dCBpcyBhc3NlcnRlZCAodGllZCB0byAwKSovCisjZGVmaW5lIExMX0xQVUFSVF9IV0NPTlRST0xfUlRTX0NUUyBcCisgIChVU0FSVF9DUjNfUlRTRSB8ICAgICAgICAgICAgICAgICBcCisgICBVU0FSVF9DUjNfQ1RTRSkgLyohPCBDVFMgYW5kIFJUUyBoYXJkd2FyZSBmbG93IGNvbnRyb2wgZW5hYmxlZCAgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIExQVUFSVF9MTF9FQ19XQUtFVVBfT04gV2FrZXVwIEFjdGl2YXRpb24KKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfTFBVQVJUX1dBS0VVUF9PTl9BRERSRVNTIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBXYWtlIHVwIGFjdGl2ZSBvbiBhZGRyZXNzIG1hdGNoICovCisjZGVmaW5lIExMX0xQVUFSVF9XQUtFVVBfT05fU1RBUlRCSVQgXAorICBVU0FSVF9DUjNfV1VTXzEgLyohPCBXYWtlIHVwIGFjdGl2ZSBvbiBTdGFydCBiaXQgZGV0ZWN0aW9uICovCisjZGVmaW5lIExMX0xQVUFSVF9XQUtFVVBfT05fUlhORSBcCisgIChVU0FSVF9DUjNfV1VTXzAgfCBVU0FSVF9DUjNfV1VTXzEpIC8qITwgV2FrZSB1cCBhY3RpdmUgb24gUlhORSAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX0VDX0RFX1BPTEFSSVRZIERyaXZlciBFbmFibGUgUG9sYXJpdHkKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0RFX1BPTEFSSVRZX0hJR0ggICAgICAgICAgXAorICAweDAwMDAwMDAwVSAvKiE8IERFIHNpZ25hbCBpcyBhY3RpdmUgaGlnaCBcCisgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9MUFVBUlRfREVfUE9MQVJJVFlfTE9XICAgICAgICAgICAgXAorICBVU0FSVF9DUjNfREVQIC8qITwgREUgc2lnbmFsIGlzIGFjdGl2ZSBsb3cgXAorICAgICAgICAgICAgICAgICAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX0VDX0RNQV9SRUdfREFUQSBETUEgUmVnaXN0ZXIgRGF0YQorICogQHsKKyAqLworI2RlZmluZSBMTF9MUFVBUlRfRE1BX1JFR19EQVRBX1RSQU5TTUlUIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBHZXQgYWRkcmVzcyBvZiBkYXRhIHJlZ2lzdGVyIHVzZWQgZm9yIHRyYW5zbWlzc2lvbiAqLworI2RlZmluZSBMTF9MUFVBUlRfRE1BX1JFR19EQVRBX1JFQ0VJVkUgXAorICAweDAwMDAwMDAxVSAvKiE8IEdldCBhZGRyZXNzIG9mIGRhdGEgcmVnaXN0ZXIgdXNlZCBmb3IgcmVjZXB0aW9uICovCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIExQVUFSVF9MTF9FeHBvcnRlZF9NYWNyb3MgTFBVQVJUIEV4cG9ydGVkIE1hY3JvcworICogQHsKKyAqLworCisvKiogQGRlZmdyb3VwIExQVUFSVF9MTF9FTV9XUklURV9SRUFEIENvbW1vbiBXcml0ZSBhbmQgcmVhZCByZWdpc3RlcnMgTWFjcm9zCisgKiBAeworICovCisKKy8qKgorICogQGJyaWVmICBXcml0ZSBhIHZhbHVlIGluIExQVUFSVCByZWdpc3RlcgorICogQHBhcmFtICBfX0lOU1RBTkNFX18gTFBVQVJUIEluc3RhbmNlCisgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgd3JpdHRlbgorICogQHBhcmFtICBfX1ZBTFVFX18gVmFsdWUgdG8gYmUgd3JpdHRlbiBpbiB0aGUgcmVnaXN0ZXIKKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIExMX0xQVUFSVF9Xcml0ZVJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18sIF9fVkFMVUVfXykgXAorICBXUklURV9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fLCAoX19WQUxVRV9fKSkKKworLyoqCisgKiBAYnJpZWYgIFJlYWQgYSB2YWx1ZSBpbiBMUFVBUlQgcmVnaXN0ZXIKKyAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIExQVUFSVCBJbnN0YW5jZQorICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHJlYWQKKyAqIEByZXR2YWwgUmVnaXN0ZXIgdmFsdWUKKyAqLworI2RlZmluZSBMTF9MUFVBUlRfUmVhZFJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18pIFJFQURfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXykKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIExQVUFSVF9MTF9FTV9FeHBvcnRlZF9NYWNyb3NfSGVscGVyIEhlbHBlciBNYWNyb3MKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgIENvbXB1dGUgTFBVQVJURElWIHZhbHVlIGFjY29yZGluZyB0byBQZXJpcGhlcmFsIENsb2NrIGFuZAorICogICAgICAgICBleHBlY3RlZCBCYXVkIFJhdGUgKDIwLWJpdCB2YWx1ZSBvZiBMUFVBUlRESVYgaXMgcmV0dXJuZWQpCisgKiBAcGFyYW0gIF9fUEVSSVBIQ0xLX18gUGVyaXBoZXJhbCBDbG9jayBmcmVxdWVuY3kgdXNlZCBmb3IgTFBVQVJUIEluc3RhbmNlCisgKiBAcGFyYW0gIF9fUFJFU0NBTEVSX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMQorICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWNgorICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVY4CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjEwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjEyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjE2CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjMyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjY0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjEyOAorICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYyNTYKKyAqIEBwYXJhbSAgX19CQVVEUkFURV9fIEJhdWQgUmF0ZSB2YWx1ZSB0byBhY2hpZXZlCisgKiBAcmV0dmFsIExQVUFSVERJViB2YWx1ZSB0byBiZSB1c2VkIGZvciBCUlIgcmVnaXN0ZXIgZmlsbGluZworICovCisjZGVmaW5lIF9fTExfTFBVQVJUX0RJVihfX1BFUklQSENMS19fLCBfX1BSRVNDQUxFUl9fLCBfX0JBVURSQVRFX18pICAgICAgXAorICAodWludDMyX3QpKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICgoKCgodWludDY0X3QpKF9fUEVSSVBIQ0xLX18pIC8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKHVpbnQ2NF90KShMUFVBUlRfUFJFU0NBTEVSX1RBQlsodWludDE2X3QpKF9fUFJFU0NBTEVSX18pXSkpICogXAorICAgICAgICAgTFBVQVJUX0xQVUFSVERJVl9GUkVRX01VTCkgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKHVpbnQzMl90KSgoX19CQVVEUkFURV9fKSAvIDJVKSkgLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgKF9fQkFVRFJBVEVfXykpICYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgTFBVQVJUX0JSUl9NQVNLKQorCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIExQVUFSVF9MTF9FeHBvcnRlZF9GdW5jdGlvbnMgTFBVQVJUIEV4cG9ydGVkIEZ1bmN0aW9ucworICogQHsKKyAqLworCisvKiogQGRlZmdyb3VwIExQVUFSVF9MTF9FRl9Db25maWd1cmF0aW9uIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgKiBAeworICovCisKKy8qKgorICogQGJyaWVmICBMUFVBUlQgRW5hYmxlCisgKiBAcm10b2xsIENSMSAgICAgICAgICBVRSAgICAgICAgICAgIExMX0xQVUFSVF9FbmFibGUKKyAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRW5hYmxlKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsKKyAgU0VUX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9VRSk7Cit9CisKKy8qKgorICogQGJyaWVmICBMUFVBUlQgRGlzYWJsZQorICogQG5vdGUgICBXaGVuIExQVUFSVCBpcyBkaXNhYmxlZCwgTFBVQVJUIHByZXNjYWxlcnMgYW5kIG91dHB1dHMgYXJlIHN0b3BwZWQKKyAqIGltbWVkaWF0ZWx5LCBhbmQgY3VycmVudCBvcGVyYXRpb25zIGFyZSBkaXNjYXJkZWQuIFRoZSBjb25maWd1cmF0aW9uIG9mIHRoZQorICogTFBVQVJUIGlzIGtlcHQsIGJ1dCBhbGwgdGhlIHN0YXR1cyBmbGFncywgaW4gdGhlIExQVUFSVHhfSVNSIGFyZSBzZXQgdG8gdGhlaXIKKyAqIGRlZmF1bHQgdmFsdWVzLgorICogQG5vdGUgICBJbiBvcmRlciB0byBnbyBpbnRvIGxvdy1wb3dlciBtb2RlIHdpdGhvdXQgZ2VuZXJhdGluZyBlcnJvcnMgb24gdGhlCisgKiBsaW5lLCB0aGUgVEUgYml0IG11c3QgYmUgcmVzZXQgYmVmb3JlIGFuZCB0aGUgc29mdHdhcmUgbXVzdCB3YWl0IGZvciB0aGUgVEMKKyAqIGJpdCBpbiB0aGUgTFBVQVJUX0lTUiB0byBiZSBzZXQgYmVmb3JlIHJlc2V0dGluZyB0aGUgVUUgYml0LiBUaGUgRE1BIHJlcXVlc3RzCisgKiBhcmUgYWxzbyByZXNldCB3aGVuIFVFID0gMCBzbyB0aGUgRE1BIGNoYW5uZWwgbXVzdCBiZSBkaXNhYmxlZCBiZWZvcmUKKyAqIHJlc2V0dGluZyB0aGUgVUUgYml0LgorICogQHJtdG9sbCBDUjEgICAgICAgICAgVUUgICAgICAgICAgICBMTF9MUFVBUlRfRGlzYWJsZQorICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9EaXNhYmxlKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsKKyAgQ0xFQVJfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX1VFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEluZGljYXRlIGlmIExQVUFSVCBpcyBlbmFibGVkCisgKiBAcm10b2xsIENSMSAgICAgICAgICBVRSAgICAgICAgICAgIExMX0xQVUFSVF9Jc0VuYWJsZWQKKyAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0lzRW5hYmxlZChjb25zdCBVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7CisgIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX1VFKSA9PSAoVVNBUlRfQ1IxX1VFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgRklGTyBNb2RlIEVuYWJsZQorICogQHJtdG9sbCBDUjEgICAgICAgICAgRklGT0VOICAgICAgICBMTF9MUFVBUlRfRW5hYmxlRklGTworICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9FbmFibGVGSUZPKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsKKyAgU0VUX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9GSUZPRU4pOworfQorCisvKioKKyAqIEBicmllZiAgRklGTyBNb2RlIERpc2FibGUKKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIEZJRk9FTiAgICAgICAgTExfTFBVQVJUX0Rpc2FibGVGSUZPCisgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0Rpc2FibGVGSUZPKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsKKyAgQ0xFQVJfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX0ZJRk9FTik7Cit9CisKKy8qKgorICogQGJyaWVmICBJbmRpY2F0ZSBpZiBGSUZPIE1vZGUgaXMgZW5hYmxlZAorICogQHJtdG9sbCBDUjEgICAgICAgICAgRklGT0VOICAgICAgICBMTF9MUFVBUlRfSXNFbmFibGVkRklGTworICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfSXNFbmFibGVkRklGTyhjb25zdCBVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7CisgIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX0ZJRk9FTikgPT0gKFVTQVJUX0NSMV9GSUZPRU4pKQorICAgICAgICAgICAgICA/IDFVTAorICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDb25maWd1cmUgVFggRklGTyBUaHJlc2hvbGQKKyAqIEBybXRvbGwgQ1IzICAgICAgICAgIFRYRlRDRkcgICAgICAgTExfTFBVQVJUX1NldFRYRklGT1RocmVzaG9sZAorICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHBhcmFtICBUaHJlc2hvbGQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzFfOAorICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0ZJRk9USFJFU0hPTERfMV80CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF8xXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzNfNAorICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0ZJRk9USFJFU0hPTERfN184CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF84XzgKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfU2V0VFhGSUZPVGhyZXNob2xkKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRocmVzaG9sZCkgeworICBBVE9NSUNfTU9ESUZZX1JFRyhMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19UWEZUQ0ZHLAorICAgICAgICAgICAgICAgICAgICBUaHJlc2hvbGQgPDwgVVNBUlRfQ1IzX1RYRlRDRkdfUG9zKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFJldHVybiBUWCBGSUZPIFRocmVzaG9sZCBDb25maWd1cmF0aW9uCisgKiBAcm10b2xsIENSMyAgICAgICAgICBUWEZUQ0ZHICAgICAgIExMX0xQVUFSVF9HZXRUWEZJRk9UaHJlc2hvbGQKKyAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzFfOAorICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0ZJRk9USFJFU0hPTERfMV80CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF8xXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzNfNAorICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0ZJRk9USFJFU0hPTERfN184CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF84XzgKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9MUFVBUlRfR2V0VFhGSUZPVGhyZXNob2xkKGNvbnN0IFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfVFhGVENGRykgPj4KKyAgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IzX1RYRlRDRkdfUG9zKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENvbmZpZ3VyZSBSWCBGSUZPIFRocmVzaG9sZAorICogQHJtdG9sbCBDUjMgICAgICAgICAgUlhGVENGRyAgICAgICBMTF9MUFVBUlRfU2V0UlhGSUZPVGhyZXNob2xkCisgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgKiBAcGFyYW0gIFRocmVzaG9sZCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0ZJRk9USFJFU0hPTERfMV84CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF8xXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzFfMgorICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0ZJRk9USFJFU0hPTERfM180CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF83XzgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzhfOAorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9TZXRSWEZJRk9UaHJlc2hvbGQoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGhyZXNob2xkKSB7CisgIEFUT01JQ19NT0RJRllfUkVHKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX1JYRlRDRkcsCisgICAgICAgICAgICAgICAgICAgIFRocmVzaG9sZCA8PCBVU0FSVF9DUjNfUlhGVENGR19Qb3MpOworfQorCisvKioKKyAqIEBicmllZiAgUmV0dXJuIFJYIEZJRk8gVGhyZXNob2xkIENvbmZpZ3VyYXRpb24KKyAqIEBybXRvbGwgQ1IzICAgICAgICAgIFJYRlRDRkcgICAgICAgTExfTFBVQVJUX0dldFJYRklGT1RocmVzaG9sZAorICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0ZJRk9USFJFU0hPTERfMV84CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF8xXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzFfMgorICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0ZJRk9USFJFU0hPTERfM180CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF83XzgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzhfOAorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX0xQVUFSVF9HZXRSWEZJRk9UaHJlc2hvbGQoY29uc3QgVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19SWEZUQ0ZHKSA+PgorICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjNfUlhGVENGR19Qb3MpOworfQorCisvKioKKyAqIEBicmllZiAgQ29uZmlndXJlIFRYIGFuZCBSWCBGSUZPcyBUaHJlc2hvbGQKKyAqIEBybXRvbGwgQ1IzICAgICAgICAgIFRYRlRDRkcgICAgICAgTExfTFBVQVJUX0NvbmZpZ0ZJRk9zVGhyZXNob2xkXG4KKyAqICAgICAgICAgQ1IzICAgICAgICAgIFJYRlRDRkcgICAgICAgTExfTFBVQVJUX0NvbmZpZ0ZJRk9zVGhyZXNob2xkCisgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgKiBAcGFyYW0gIFRYVGhyZXNob2xkIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF8xXzgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzFfNAorICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0ZJRk9USFJFU0hPTERfMV8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF8zXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzdfOAorICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0ZJRk9USFJFU0hPTERfOF84CisgKiBAcGFyYW0gIFJYVGhyZXNob2xkIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF8xXzgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzFfNAorICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0ZJRk9USFJFU0hPTERfMV8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF8zXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzdfOAorICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0ZJRk9USFJFU0hPTERfOF84CisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0NvbmZpZ0ZJRk9zVGhyZXNob2xkKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVFhUaHJlc2hvbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUlhUaHJlc2hvbGQpIHsKKyAgQVRPTUlDX01PRElGWV9SRUcoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfVFhGVENGRyB8IFVTQVJUX0NSM19SWEZUQ0ZHLAorICAgICAgICAgICAgICAgICAgICAoVFhUaHJlc2hvbGQgPDwgVVNBUlRfQ1IzX1RYRlRDRkdfUG9zKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAoUlhUaHJlc2hvbGQgPDwgVVNBUlRfQ1IzX1JYRlRDRkdfUG9zKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBMUFVBUlQgZW5hYmxlZCBpbiBTVE9QIE1vZGUKKyAqIEBub3RlICAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGVuYWJsZWQsIExQVUFSVCBpcyBhYmxlIHRvIHdha2UgdXAgdGhlIE1DVSBmcm9tCisgKiBTdG9wIG1vZGUsIHByb3ZpZGVkIHRoYXQgTFBVQVJUIGNsb2NrIHNlbGVjdGlvbiBpcyBIU0kgb3IgTFNFIGluIFJDQy4KKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIFVFU00gICAgICAgICAgTExfTFBVQVJUX0VuYWJsZUluU3RvcE1vZGUKKyAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRW5hYmxlSW5TdG9wTW9kZShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7CisgIEFUT01JQ19TRVRfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX1VFU00pOworfQorCisvKioKKyAqIEBicmllZiAgTFBVQVJUIGRpc2FibGVkIGluIFNUT1AgTW9kZQorICogQG5vdGUgICBXaGVuIHRoaXMgZnVuY3Rpb24gaXMgZGlzYWJsZWQsIExQVUFSVCBpcyBub3QgYWJsZSB0byB3YWtlIHVwIHRoZSBNQ1UKKyAqIGZyb20gU3RvcCBtb2RlCisgKiBAcm10b2xsIENSMSAgICAgICAgICBVRVNNICAgICAgICAgIExMX0xQVUFSVF9EaXNhYmxlSW5TdG9wTW9kZQorICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9EaXNhYmxlSW5TdG9wTW9kZShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7CisgIEFUT01JQ19DTEVBUl9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfVUVTTSk7Cit9CisKKy8qKgorICogQGJyaWVmICBJbmRpY2F0ZSBpZiBMUFVBUlQgaXMgZW5hYmxlZCBpbiBTVE9QIE1vZGUKKyAqICAgICAgICAgKGFibGUgdG8gd2FrZSB1cCBNQ1UgZnJvbSBTdG9wIG1vZGUgb3Igbm90KQorICogQHJtdG9sbCBDUjEgICAgICAgICAgVUVTTSAgICAgICAgICBMTF9MUFVBUlRfSXNFbmFibGVkSW5TdG9wTW9kZQorICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfTFBVQVJUX0lzRW5hYmxlZEluU3RvcE1vZGUoY29uc3QgVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgeworICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9VRVNNKSA9PSAoVVNBUlRfQ1IxX1VFU00pKSA/IDFVTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBSZWNlaXZlciBFbmFibGUgKFJlY2VpdmVyIGlzIGVuYWJsZWQgYW5kIGJlZ2lucyBzZWFyY2hpbmcgZm9yIGEgc3RhcnQKKyAqIGJpdCkKKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIFJFICAgICAgICAgICAgTExfTFBVQVJUX0VuYWJsZURpcmVjdGlvblJ4CisgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0VuYWJsZURpcmVjdGlvblJ4KFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsKKyAgQVRPTUlDX1NFVF9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUkUpOworfQorCisvKioKKyAqIEBicmllZiAgUmVjZWl2ZXIgRGlzYWJsZQorICogQHJtdG9sbCBDUjEgICAgICAgICAgUkUgICAgICAgICAgICBMTF9MUFVBUlRfRGlzYWJsZURpcmVjdGlvblJ4CisgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0Rpc2FibGVEaXJlY3Rpb25SeChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7CisgIEFUT01JQ19DTEVBUl9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUkUpOworfQorCisvKioKKyAqIEBicmllZiAgVHJhbnNtaXR0ZXIgRW5hYmxlCisgKiBAcm10b2xsIENSMSAgICAgICAgICBURSAgICAgICAgICAgIExMX0xQVUFSVF9FbmFibGVEaXJlY3Rpb25UeAorICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9FbmFibGVEaXJlY3Rpb25UeChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7CisgIEFUT01JQ19TRVRfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX1RFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFRyYW5zbWl0dGVyIERpc2FibGUKKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIFRFICAgICAgICAgICAgTExfTFBVQVJUX0Rpc2FibGVEaXJlY3Rpb25UeAorICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9EaXNhYmxlRGlyZWN0aW9uVHgoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgeworICBBVE9NSUNfQ0xFQVJfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX1RFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENvbmZpZ3VyZSBzaW11bHRhbmVvdXNseSBlbmFibGVkL2Rpc2FibGVkIHN0YXRlcworICogICAgICAgICBvZiBUcmFuc21pdHRlciBhbmQgUmVjZWl2ZXIKKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIFJFICAgICAgICAgICAgTExfTFBVQVJUX1NldFRyYW5zZmVyRGlyZWN0aW9uXG4KKyAqICAgICAgICAgQ1IxICAgICAgICAgIFRFICAgICAgICAgICAgTExfTFBVQVJUX1NldFRyYW5zZmVyRGlyZWN0aW9uCisgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgKiBAcGFyYW0gIFRyYW5zZmVyRGlyZWN0aW9uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRElSRUNUSU9OX05PTkUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9ESVJFQ1RJT05fUlgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9ESVJFQ1RJT05fVFgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9ESVJFQ1RJT05fVFhfUlgKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfU2V0VHJhbnNmZXJEaXJlY3Rpb24oCisgICAgVVNBUlRfVHlwZURlZiAqTFBVQVJUeCwgdWludDMyX3QgVHJhbnNmZXJEaXJlY3Rpb24pIHsKKyAgQVRPTUlDX01PRElGWV9SRUcoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUkUgfCBVU0FSVF9DUjFfVEUsCisgICAgICAgICAgICAgICAgICAgIFRyYW5zZmVyRGlyZWN0aW9uKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFJldHVybiBlbmFibGVkL2Rpc2FibGVkIHN0YXRlcyBvZiBUcmFuc21pdHRlciBhbmQgUmVjZWl2ZXIKKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIFJFICAgICAgICAgICAgTExfTFBVQVJUX0dldFRyYW5zZmVyRGlyZWN0aW9uXG4KKyAqICAgICAgICAgQ1IxICAgICAgICAgIFRFICAgICAgICAgICAgTExfTFBVQVJUX0dldFRyYW5zZmVyRGlyZWN0aW9uCisgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRElSRUNUSU9OX05PTkUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9ESVJFQ1RJT05fUlgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9ESVJFQ1RJT05fVFgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9ESVJFQ1RJT05fVFhfUlgKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9MUFVBUlRfR2V0VHJhbnNmZXJEaXJlY3Rpb24oY29uc3QgVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9SRSB8IFVTQVJUX0NSMV9URSkpOworfQorCisvKioKKyAqIEBicmllZiAgQ29uZmlndXJlIFBhcml0eSAoZW5hYmxlZC9kaXNhYmxlZCBhbmQgcGFyaXR5IG1vZGUgaWYgZW5hYmxlZCkKKyAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBzZWxlY3RzIGlmIGhhcmR3YXJlIHBhcml0eSBjb250cm9sIChnZW5lcmF0aW9uIGFuZAorICogZGV0ZWN0aW9uKSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLiBXaGVuIHRoZSBwYXJpdHkgY29udHJvbCBpcyBlbmFibGVkIChPZGQgb3IKKyAqIEV2ZW4pLCBjb21wdXRlZCBwYXJpdHkgYml0IGlzIGluc2VydGVkIGF0IHRoZSBNU0IgcG9zaXRpb24gKGRlcGVuZGluZyBvbiBkYXRhCisgKiB3aWR0aCkgYW5kIHBhcml0eSBpcyBjaGVja2VkIG9uIHRoZSByZWNlaXZlZCBkYXRhLgorICogQHJtdG9sbCBDUjEgICAgICAgICAgUFMgICAgICAgICAgICBMTF9MUFVBUlRfU2V0UGFyaXR5XG4KKyAqICAgICAgICAgQ1IxICAgICAgICAgIFBDRSAgICAgICAgICAgTExfTFBVQVJUX1NldFBhcml0eQorICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHBhcmFtICBQYXJpdHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QQVJJVFlfTk9ORQorICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BBUklUWV9FVkVOCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUEFSSVRZX09ERAorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9TZXRQYXJpdHkoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUGFyaXR5KSB7CisgIE1PRElGWV9SRUcoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUFMgfCBVU0FSVF9DUjFfUENFLCBQYXJpdHkpOworfQorCisvKioKKyAqIEBicmllZiAgUmV0dXJuIFBhcml0eSBjb25maWd1cmF0aW9uIChlbmFibGVkL2Rpc2FibGVkIGFuZCBwYXJpdHkgbW9kZSBpZgorICogZW5hYmxlZCkKKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIFBTICAgICAgICAgICAgTExfTFBVQVJUX0dldFBhcml0eVxuCisgKiAgICAgICAgIENSMSAgICAgICAgICBQQ0UgICAgICAgICAgIExMX0xQVUFSVF9HZXRQYXJpdHkKKyAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QQVJJVFlfTk9ORQorICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BBUklUWV9FVkVOCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUEFSSVRZX09ERAorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0dldFBhcml0eShjb25zdCBVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX1BTIHwgVVNBUlRfQ1IxX1BDRSkpOworfQorCisvKioKKyAqIEBicmllZiAgU2V0IFJlY2VpdmVyIFdha2UgVXAgbWV0aG9kIGZyb20gTXV0ZSBtb2RlLgorICogQHJtdG9sbCBDUjEgICAgICAgICAgV0FLRSAgICAgICAgICBMTF9MUFVBUlRfU2V0V2FrZVVwTWV0aG9kCisgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgKiBAcGFyYW0gIE1ldGhvZCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1dBS0VVUF9JRExFTElORQorICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1dBS0VVUF9BRERSRVNTTUFSSworICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9TZXRXYWtlVXBNZXRob2QoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgTWV0aG9kKSB7CisgIE1PRElGWV9SRUcoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfV0FLRSwgTWV0aG9kKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFJldHVybiBSZWNlaXZlciBXYWtlIFVwIG1ldGhvZCBmcm9tIE11dGUgbW9kZQorICogQHJtdG9sbCBDUjEgICAgICAgICAgV0FLRSAgICAgICAgICBMTF9MUFVBUlRfR2V0V2FrZVVwTWV0aG9kCisgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfV0FLRVVQX0lETEVMSU5FCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfV0FLRVVQX0FERFJFU1NNQVJLCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfTFBVQVJUX0dldFdha2VVcE1ldGhvZChjb25zdCBVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX1dBS0UpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFNldCBXb3JkIGxlbmd0aCAobmIgb2YgZGF0YSBiaXRzLCBleGNsdWRpbmcgc3RhcnQgYW5kIHN0b3AgYml0cykKKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIE0gICAgICAgICAgICAgTExfTFBVQVJUX1NldERhdGFXaWR0aAorICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHBhcmFtICBEYXRhV2lkdGggVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9EQVRBV0lEVEhfN0IKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9EQVRBV0lEVEhfOEIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9EQVRBV0lEVEhfOUIKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfU2V0RGF0YVdpZHRoKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IERhdGFXaWR0aCkgeworICBNT0RJRllfUkVHKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX00sIERhdGFXaWR0aCk7Cit9CisKKy8qKgorICogQGJyaWVmICBSZXR1cm4gV29yZCBsZW5ndGggKGkuZS4gbmIgb2YgZGF0YSBiaXRzLCBleGNsdWRpbmcgc3RhcnQgYW5kIHN0b3AKKyAqIGJpdHMpCisgKiBAcm10b2xsIENSMSAgICAgICAgICBNICAgICAgICAgICAgIExMX0xQVUFSVF9HZXREYXRhV2lkdGgKKyAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9EQVRBV0lEVEhfN0IKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9EQVRBV0lEVEhfOEIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9EQVRBV0lEVEhfOUIKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9HZXREYXRhV2lkdGgoY29uc3QgVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9NKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBBbGxvdyBzd2l0Y2ggYmV0d2VlbiBNdXRlIE1vZGUgYW5kIEFjdGl2ZSBtb2RlCisgKiBAcm10b2xsIENSMSAgICAgICAgICBNTUUgICAgICAgICAgIExMX0xQVUFSVF9FbmFibGVNdXRlTW9kZQorICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9FbmFibGVNdXRlTW9kZShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7CisgIEFUT01JQ19TRVRfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX01NRSk7Cit9CisKKy8qKgorICogQGJyaWVmICBQcmV2ZW50IE11dGUgTW9kZSB1c2UuIFNldCBSZWNlaXZlciBpbiBhY3RpdmUgbW9kZSBwZXJtYW5lbnRseS4KKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIE1NRSAgICAgICAgICAgTExfTFBVQVJUX0Rpc2FibGVNdXRlTW9kZQorICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9EaXNhYmxlTXV0ZU1vZGUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgeworICBBVE9NSUNfQ0xFQVJfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX01NRSk7Cit9CisKKy8qKgorICogQGJyaWVmICBJbmRpY2F0ZSBpZiBzd2l0Y2ggYmV0d2VlbiBNdXRlIE1vZGUgYW5kIEFjdGl2ZSBtb2RlIGlzIGFsbG93ZWQKKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIE1NRSAgICAgICAgICAgTExfTFBVQVJUX0lzRW5hYmxlZE11dGVNb2RlCisgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9MUFVBUlRfSXNFbmFibGVkTXV0ZU1vZGUoY29uc3QgVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgeworICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9NTUUpID09IChVU0FSVF9DUjFfTU1FKSkgPyAxVUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENvbmZpZ3VyZSBDbG9jayBzb3VyY2UgcHJlc2NhbGVyIGZvciBiYXVkcmF0ZSBnZW5lcmF0b3IgYW5kCisgKiBvdmVyc2FtcGxpbmcKKyAqIEBybXRvbGwgUFJFU0MgICAgICAgIFBSRVNDQUxFUiAgICAgTExfTFBVQVJUX1NldFByZXNjYWxlcgorICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHBhcmFtICBQcmVzY2FsZXJWYWx1ZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWNAorICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVY2CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMTAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMTIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMTYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWNjQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMTI4CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjI1NgorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9TZXRQcmVzY2FsZXIoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUHJlc2NhbGVyVmFsdWUpIHsKKyAgTU9ESUZZX1JFRyhMUFVBUlR4LT5QUkVTQywgVVNBUlRfUFJFU0NfUFJFU0NBTEVSLCAodWludDE2X3QpUHJlc2NhbGVyVmFsdWUpOworfQorCisvKioKKyAqIEBicmllZiAgUmV0cmlldmUgdGhlIENsb2NrIHNvdXJjZSBwcmVzY2FsZXIgZm9yIGJhdWRyYXRlIGdlbmVyYXRvciBhbmQKKyAqIG92ZXJzYW1wbGluZworICogQHJtdG9sbCBQUkVTQyAgICAgICAgUFJFU0NBTEVSICAgICBMTF9MUFVBUlRfR2V0UHJlc2NhbGVyCisgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMgorICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVY0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWOAorICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYxMAorICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYxMgorICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYxNgorICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYzMgorICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVY2NAorICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYxMjgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMjU2CisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfR2V0UHJlc2NhbGVyKGNvbnN0IFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoTFBVQVJUeC0+UFJFU0MsIFVTQVJUX1BSRVNDX1BSRVNDQUxFUikpOworfQorCisvKioKKyAqIEBicmllZiAgU2V0IHRoZSBsZW5ndGggb2YgdGhlIHN0b3AgYml0cworICogQHJtdG9sbCBDUjIgICAgICAgICAgU1RPUCAgICAgICAgICBMTF9MUFVBUlRfU2V0U3RvcEJpdHNMZW5ndGgKKyAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAqIEBwYXJhbSAgU3RvcEJpdHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9TVE9QQklUU18xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfU1RPUEJJVFNfMgorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9TZXRTdG9wQml0c0xlbmd0aChVU0FSVF9UeXBlRGVmICpMUFVBUlR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFN0b3BCaXRzKSB7CisgIE1PRElGWV9SRUcoTFBVQVJUeC0+Q1IyLCBVU0FSVF9DUjJfU1RPUCwgU3RvcEJpdHMpOworfQorCisvKioKKyAqIEBicmllZiAgUmV0cmlldmUgdGhlIGxlbmd0aCBvZiB0aGUgc3RvcCBiaXRzCisgKiBAcm10b2xsIENSMiAgICAgICAgICBTVE9QICAgICAgICAgIExMX0xQVUFSVF9HZXRTdG9wQml0c0xlbmd0aAorICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1NUT1BCSVRTXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9TVE9QQklUU18yCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfTFBVQVJUX0dldFN0b3BCaXRzTGVuZ3RoKGNvbnN0IFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoTFBVQVJUeC0+Q1IyLCBVU0FSVF9DUjJfU1RPUCkpOworfQorCisvKioKKyAqIEBicmllZiAgQ29uZmlndXJlIENoYXJhY3RlciBmcmFtZSBmb3JtYXQgKERhdGF3aWR0aCwgUGFyaXR5IGNvbnRyb2wsIFN0b3AKKyAqIEJpdHMpCisgKiBAbm90ZSAgIENhbGwgb2YgdGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIGZvbGxvd2luZyBmdW5jdGlvbiBjYWxsCisgKiBzZXF1ZW5jZSA6CisgKiAgICAgICAgIC0gRGF0YSBXaWR0aCBjb25maWd1cmF0aW9uIHVzaW5nIEByZWYgTExfTFBVQVJUX1NldERhdGFXaWR0aCgpCisgKiBmdW5jdGlvbgorICogICAgICAgICAtIFBhcml0eSBDb250cm9sIGFuZCBtb2RlIGNvbmZpZ3VyYXRpb24gdXNpbmcgQHJlZgorICogTExfTFBVQVJUX1NldFBhcml0eSgpIGZ1bmN0aW9uCisgKiAgICAgICAgIC0gU3RvcCBiaXRzIGNvbmZpZ3VyYXRpb24gdXNpbmcgQHJlZiBMTF9MUFVBUlRfU2V0U3RvcEJpdHNMZW5ndGgoKQorICogZnVuY3Rpb24KKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIFBTICAgICAgICAgICAgTExfTFBVQVJUX0NvbmZpZ0NoYXJhY3RlclxuCisgKiAgICAgICAgIENSMSAgICAgICAgICBQQ0UgICAgICAgICAgIExMX0xQVUFSVF9Db25maWdDaGFyYWN0ZXJcbgorICogICAgICAgICBDUjEgICAgICAgICAgTSAgICAgICAgICAgICBMTF9MUFVBUlRfQ29uZmlnQ2hhcmFjdGVyXG4KKyAqICAgICAgICAgQ1IyICAgICAgICAgIFNUT1AgICAgICAgICAgTExfTFBVQVJUX0NvbmZpZ0NoYXJhY3RlcgorICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHBhcmFtICBEYXRhV2lkdGggVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9EQVRBV0lEVEhfN0IKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9EQVRBV0lEVEhfOEIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9EQVRBV0lEVEhfOUIKKyAqIEBwYXJhbSAgUGFyaXR5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUEFSSVRZX05PTkUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QQVJJVFlfRVZFTgorICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BBUklUWV9PREQKKyAqIEBwYXJhbSAgU3RvcEJpdHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9TVE9QQklUU18xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfU1RPUEJJVFNfMgorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9Db25maWdDaGFyYWN0ZXIoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRGF0YVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQYXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFN0b3BCaXRzKSB7CisgIE1PRElGWV9SRUcoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUFMgfCBVU0FSVF9DUjFfUENFIHwgVVNBUlRfQ1IxX00sCisgICAgICAgICAgICAgUGFyaXR5IHwgRGF0YVdpZHRoKTsKKyAgTU9ESUZZX1JFRyhMUFVBUlR4LT5DUjIsIFVTQVJUX0NSMl9TVE9QLCBTdG9wQml0cyk7Cit9CisKKy8qKgorICogQGJyaWVmICBDb25maWd1cmUgVFgvUlggcGlucyBzd2FwcGluZyBzZXR0aW5nLgorICogQHJtdG9sbCBDUjIgICAgICAgICAgU1dBUCAgICAgICAgICBMTF9MUFVBUlRfU2V0VFhSWFN3YXAKKyAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAqIEBwYXJhbSAgU3dhcENvbmZpZyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1RYUlhfU1RBTkRBUkQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9UWFJYX1NXQVBQRUQKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfU2V0VFhSWFN3YXAoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBTd2FwQ29uZmlnKSB7CisgIE1PRElGWV9SRUcoTFBVQVJUeC0+Q1IyLCBVU0FSVF9DUjJfU1dBUCwgU3dhcENvbmZpZyk7Cit9CisKKy8qKgorICogQGJyaWVmICBSZXRyaWV2ZSBUWC9SWCBwaW5zIHN3YXBwaW5nIGNvbmZpZ3VyYXRpb24uCisgKiBAcm10b2xsIENSMiAgICAgICAgICBTV0FQICAgICAgICAgIExMX0xQVUFSVF9HZXRUWFJYU3dhcAorICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1RYUlhfU1RBTkRBUkQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9UWFJYX1NXQVBQRUQKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9HZXRUWFJYU3dhcChjb25zdCBVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKExQVUFSVHgtPkNSMiwgVVNBUlRfQ1IyX1NXQVApKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENvbmZpZ3VyZSBSWCBwaW4gYWN0aXZlIGxldmVsIGxvZ2ljCisgKiBAcm10b2xsIENSMiAgICAgICAgICBSWElOViAgICAgICAgIExMX0xQVUFSVF9TZXRSWFBpbkxldmVsCisgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgKiBAcGFyYW0gIFBpbkludk1ldGhvZCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1JYUElOX0xFVkVMX1NUQU5EQVJECisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUlhQSU5fTEVWRUxfSU5WRVJURUQKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfU2V0UlhQaW5MZXZlbChVU0FSVF9UeXBlRGVmICpMUFVBUlR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUGluSW52TWV0aG9kKSB7CisgIE1PRElGWV9SRUcoTFBVQVJUeC0+Q1IyLCBVU0FSVF9DUjJfUlhJTlYsIFBpbkludk1ldGhvZCk7Cit9CisKKy8qKgorICogQGJyaWVmICBSZXRyaWV2ZSBSWCBwaW4gYWN0aXZlIGxldmVsIGxvZ2ljIGNvbmZpZ3VyYXRpb24KKyAqIEBybXRvbGwgQ1IyICAgICAgICAgIFJYSU5WICAgICAgICAgTExfTFBVQVJUX0dldFJYUGluTGV2ZWwKKyAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9SWFBJTl9MRVZFTF9TVEFOREFSRAorICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1JYUElOX0xFVkVMX0lOVkVSVEVECisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfR2V0UlhQaW5MZXZlbChjb25zdCBVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKExQVUFSVHgtPkNSMiwgVVNBUlRfQ1IyX1JYSU5WKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBDb25maWd1cmUgVFggcGluIGFjdGl2ZSBsZXZlbCBsb2dpYworICogQHJtdG9sbCBDUjIgICAgICAgICAgVFhJTlYgICAgICAgICBMTF9MUFVBUlRfU2V0VFhQaW5MZXZlbAorICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHBhcmFtICBQaW5JbnZNZXRob2QgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9UWFBJTl9MRVZFTF9TVEFOREFSRAorICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1RYUElOX0xFVkVMX0lOVkVSVEVECisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX1NldFRYUGluTGV2ZWwoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFBpbkludk1ldGhvZCkgeworICBNT0RJRllfUkVHKExQVUFSVHgtPkNSMiwgVVNBUlRfQ1IyX1RYSU5WLCBQaW5JbnZNZXRob2QpOworfQorCisvKioKKyAqIEBicmllZiAgUmV0cmlldmUgVFggcGluIGFjdGl2ZSBsZXZlbCBsb2dpYyBjb25maWd1cmF0aW9uCisgKiBAcm10b2xsIENSMiAgICAgICAgICBUWElOViAgICAgICAgIExMX0xQVUFSVF9HZXRUWFBpbkxldmVsCisgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfVFhQSU5fTEVWRUxfU1RBTkRBUkQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9UWFBJTl9MRVZFTF9JTlZFUlRFRAorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0dldFRYUGluTGV2ZWwoY29uc3QgVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChMUFVBUlR4LT5DUjIsIFVTQVJUX0NSMl9UWElOVikpOworfQorCisvKioKKyAqIEBicmllZiAgQ29uZmlndXJlIEJpbmFyeSBkYXRhIGxvZ2ljLgorICoKKyAqIEBub3RlICAgQWxsb3cgdG8gZGVmaW5lIGhvdyBMb2dpY2FsIGRhdGEgZnJvbSB0aGUgZGF0YSByZWdpc3RlciBhcmUKKyAqIHNlbmQvcmVjZWl2ZWQgOiBlaXRoZXIgaW4gcG9zaXRpdmUvZGlyZWN0IGxvZ2ljICgxPUgsIDA9TCkgb3IgaW4KKyAqIG5lZ2F0aXZlL2ludmVyc2UgbG9naWMgKDE9TCwgMD1IKQorICogQHJtdG9sbCBDUjIgICAgICAgICAgREFUQUlOViAgICAgICBMTF9MUFVBUlRfU2V0QmluYXJ5RGF0YUxvZ2ljCisgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgKiBAcGFyYW0gIERhdGFMb2dpYyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0JJTkFSWV9MT0dJQ19QT1NJVElWRQorICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0JJTkFSWV9MT0dJQ19ORUdBVElWRQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9TZXRCaW5hcnlEYXRhTG9naWMoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRGF0YUxvZ2ljKSB7CisgIE1PRElGWV9SRUcoTFBVQVJUeC0+Q1IyLCBVU0FSVF9DUjJfREFUQUlOViwgRGF0YUxvZ2ljKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFJldHJpZXZlIEJpbmFyeSBkYXRhIGNvbmZpZ3VyYXRpb24KKyAqIEBybXRvbGwgQ1IyICAgICAgICAgIERBVEFJTlYgICAgICAgTExfTFBVQVJUX0dldEJpbmFyeURhdGFMb2dpYworICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0JJTkFSWV9MT0dJQ19QT1NJVElWRQorICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0JJTkFSWV9MT0dJQ19ORUdBVElWRQorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX0xQVUFSVF9HZXRCaW5hcnlEYXRhTG9naWMoY29uc3QgVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChMUFVBUlR4LT5DUjIsIFVTQVJUX0NSMl9EQVRBSU5WKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBDb25maWd1cmUgdHJhbnNmZXIgYml0IG9yZGVyIChlaXRoZXIgTGVzcyBvciBNb3N0IFNpZ25pZmljYW50IEJpdAorICogRmlyc3QpCisgKiBAbm90ZSAgIE1TQiBGaXJzdCBtZWFucyBkYXRhIGlzIHRyYW5zbWl0dGVkL3JlY2VpdmVkIHdpdGggdGhlIE1TQiBmaXJzdCwKKyAqIGZvbGxvd2luZyB0aGUgc3RhcnQgYml0LiBMU0IgRmlyc3QgbWVhbnMgZGF0YSBpcyB0cmFuc21pdHRlZC9yZWNlaXZlZCB3aXRoCisgKiBkYXRhIGJpdCAwIGZpcnN0LCBmb2xsb3dpbmcgdGhlIHN0YXJ0IGJpdC4KKyAqIEBybXRvbGwgQ1IyICAgICAgICAgIE1TQkZJUlNUICAgICAgTExfTFBVQVJUX1NldFRyYW5zZmVyQml0T3JkZXIKKyAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAqIEBwYXJhbSAgQml0T3JkZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9CSVRPUkRFUl9MU0JGSVJTVAorICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0JJVE9SREVSX01TQkZJUlNUCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX1NldFRyYW5zZmVyQml0T3JkZXIoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEJpdE9yZGVyKSB7CisgIE1PRElGWV9SRUcoTFBVQVJUeC0+Q1IyLCBVU0FSVF9DUjJfTVNCRklSU1QsIEJpdE9yZGVyKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFJldHVybiB0cmFuc2ZlciBiaXQgb3JkZXIgKGVpdGhlciBMZXNzIG9yIE1vc3QgU2lnbmlmaWNhbnQgQml0IEZpcnN0KQorICogQG5vdGUgICBNU0IgRmlyc3QgbWVhbnMgZGF0YSBpcyB0cmFuc21pdHRlZC9yZWNlaXZlZCB3aXRoIHRoZSBNU0IgZmlyc3QsCisgKiBmb2xsb3dpbmcgdGhlIHN0YXJ0IGJpdC4gTFNCIEZpcnN0IG1lYW5zIGRhdGEgaXMgdHJhbnNtaXR0ZWQvcmVjZWl2ZWQgd2l0aAorICogZGF0YSBiaXQgMCBmaXJzdCwgZm9sbG93aW5nIHRoZSBzdGFydCBiaXQuCisgKiBAcm10b2xsIENSMiAgICAgICAgICBNU0JGSVJTVCAgICAgIExMX0xQVUFSVF9HZXRUcmFuc2ZlckJpdE9yZGVyCisgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfQklUT1JERVJfTFNCRklSU1QKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9CSVRPUkRFUl9NU0JGSVJTVAorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX0xQVUFSVF9HZXRUcmFuc2ZlckJpdE9yZGVyKGNvbnN0IFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoTFBVQVJUeC0+Q1IyLCBVU0FSVF9DUjJfTVNCRklSU1QpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFNldCBBZGRyZXNzIG9mIHRoZSBMUFVBUlQgbm9kZS4KKyAqIEBub3RlICAgVGhpcyBpcyB1c2VkIGluIG11bHRpcHJvY2Vzc29yIGNvbW11bmljYXRpb24gZHVyaW5nIE11dGUgbW9kZSBvciBTdG9wCisgKiBtb2RlLCBmb3Igd2FrZSB1cCB3aXRoIGFkZHJlc3MgbWFyayBkZXRlY3Rpb24uCisgKiBAbm90ZSAgIDRiaXRzIGFkZHJlc3Mgbm9kZSBpcyB1c2VkIHdoZW4gNC1iaXQgQWRkcmVzcyBEZXRlY3Rpb24gaXMgc2VsZWN0ZWQKKyAqIGluIEFERE03LiAoYjctYjQgc2hvdWxkIGJlIHNldCB0byAwKSA4Yml0cyBhZGRyZXNzIG5vZGUgaXMgdXNlZCB3aGVuIDctYml0CisgKiBBZGRyZXNzIERldGVjdGlvbiBpcyBzZWxlY3RlZCBpbiBBRERNNy4gKFRoaXMgaXMgdXNlZCBpbiBtdWx0aXByb2Nlc3NvcgorICogY29tbXVuaWNhdGlvbiBkdXJpbmcgTXV0ZSBtb2RlIG9yIFN0b3AgbW9kZSwgZm9yIHdha2UgdXAgd2l0aCA3LWJpdCBhZGRyZXNzCisgKiBtYXJrIGRldGVjdGlvbi4gVGhlIE1TQiBvZiB0aGUgY2hhcmFjdGVyIHNlbnQgYnkgdGhlIHRyYW5zbWl0dGVyIHNob3VsZCBiZQorICogZXF1YWwgdG8gMS4gSXQgbWF5IGFsc28gYmUgdXNlZCBmb3IgY2hhcmFjdGVyIGRldGVjdGlvbiBkdXJpbmcgbm9ybWFsCisgKiByZWNlcHRpb24sIE11dGUgbW9kZSBpbmFjdGl2ZSAoZm9yIGV4YW1wbGUsIGVuZCBvZiBibG9jayBkZXRlY3Rpb24gaW4gTW9kQnVzCisgKiBwcm90b2NvbCkuIEluIHRoaXMgY2FzZSwgdGhlIHdob2xlIHJlY2VpdmVkIGNoYXJhY3RlciAoOC1iaXQpIGlzIGNvbXBhcmVkIHRvCisgKiB0aGUgQUREWzc6MF0gdmFsdWUgYW5kIENNRiBmbGFnIGlzIHNldCBvbiBtYXRjaCkKKyAqIEBybXRvbGwgQ1IyICAgICAgICAgIEFERCAgICAgICAgICAgTExfTFBVQVJUX0NvbmZpZ05vZGVBZGRyZXNzXG4KKyAqICAgICAgICAgQ1IyICAgICAgICAgIEFERE03ICAgICAgICAgTExfTFBVQVJUX0NvbmZpZ05vZGVBZGRyZXNzCisgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgKiBAcGFyYW0gIEFkZHJlc3NMZW4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9BRERSRVNTX0RFVEVDVF80QgorICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0FERFJFU1NfREVURUNUXzdCCisgKiBAcGFyYW0gIE5vZGVBZGRyZXNzIDQgb3IgNyBiaXQgQWRkcmVzcyBvZiB0aGUgTFBVQVJUIG5vZGUuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0NvbmZpZ05vZGVBZGRyZXNzKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQWRkcmVzc0xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBOb2RlQWRkcmVzcykgeworICBNT0RJRllfUkVHKExQVUFSVHgtPkNSMiwgVVNBUlRfQ1IyX0FERCB8IFVTQVJUX0NSMl9BRERNNywKKyAgICAgICAgICAgICAodWludDMyX3QpKEFkZHJlc3NMZW4gfCAoTm9kZUFkZHJlc3MgPDwgVVNBUlRfQ1IyX0FERF9Qb3MpKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBSZXR1cm4gOCBiaXQgQWRkcmVzcyBvZiB0aGUgTFBVQVJUIG5vZGUgYXMgc2V0IGluIEFERCBmaWVsZCBvZiBDUjIuCisgKiBAbm90ZSAgIElmIDQtYml0IEFkZHJlc3MgRGV0ZWN0aW9uIGlzIHNlbGVjdGVkIGluIEFERE03LAorICogICAgICAgICBvbmx5IDRiaXRzIChiMy1iMCkgb2YgcmV0dXJuZWQgdmFsdWUgYXJlIHJlbGV2YW50IChiMzEtYjQgYXJlIG5vdAorICogcmVsZXZhbnQpIElmIDctYml0IEFkZHJlc3MgRGV0ZWN0aW9uIGlzIHNlbGVjdGVkIGluIEFERE03LCBvbmx5IDhiaXRzIChiNy1iMCkKKyAqIG9mIHJldHVybmVkIHZhbHVlIGFyZSByZWxldmFudCAoYjMxLWI4IGFyZSBub3QgcmVsZXZhbnQpCisgKiBAcm10b2xsIENSMiAgICAgICAgICBBREQgICAgICAgICAgIExMX0xQVUFSVF9HZXROb2RlQWRkcmVzcworICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHJldHZhbCBBZGRyZXNzIG9mIHRoZSBMUFVBUlQgbm9kZSAoVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZAorICogTWF4X0RhdGE9MjU1KQorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX0xQVUFSVF9HZXROb2RlQWRkcmVzcyhjb25zdCBVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKExQVUFSVHgtPkNSMiwgVVNBUlRfQ1IyX0FERCkgPj4gVVNBUlRfQ1IyX0FERF9Qb3MpOworfQorCisvKioKKyAqIEBicmllZiAgUmV0dXJuIExlbmd0aCBvZiBOb2RlIEFkZHJlc3MgdXNlZCBpbiBBZGRyZXNzIERldGVjdGlvbiBtb2RlICg3LWJpdAorICogb3IgNC1iaXQpCisgKiBAcm10b2xsIENSMiAgICAgICAgICBBRERNNyAgICAgICAgIExMX0xQVUFSVF9HZXROb2RlQWRkcmVzc0xlbgorICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0FERFJFU1NfREVURUNUXzRCCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfQUREUkVTU19ERVRFQ1RfN0IKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9MUFVBUlRfR2V0Tm9kZUFkZHJlc3NMZW4oY29uc3QgVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChMUFVBUlR4LT5DUjIsIFVTQVJUX0NSMl9BRERNNykpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIFJUUyBIVyBGbG93IENvbnRyb2wKKyAqIEBybXRvbGwgQ1IzICAgICAgICAgIFJUU0UgICAgICAgICAgTExfTFBVQVJUX0VuYWJsZVJUU0hXRmxvd0N0cmwKKyAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRW5hYmxlUlRTSFdGbG93Q3RybChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7CisgIFNFVF9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfUlRTRSk7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIFJUUyBIVyBGbG93IENvbnRyb2wKKyAqIEBybXRvbGwgQ1IzICAgICAgICAgIFJUU0UgICAgICAgICAgTExfTFBVQVJUX0Rpc2FibGVSVFNIV0Zsb3dDdHJsCisgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0Rpc2FibGVSVFNIV0Zsb3dDdHJsKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsKKyAgQ0xFQVJfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX1JUU0UpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIENUUyBIVyBGbG93IENvbnRyb2wKKyAqIEBybXRvbGwgQ1IzICAgICAgICAgIENUU0UgICAgICAgICAgTExfTFBVQVJUX0VuYWJsZUNUU0hXRmxvd0N0cmwKKyAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRW5hYmxlQ1RTSFdGbG93Q3RybChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7CisgIFNFVF9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfQ1RTRSk7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIENUUyBIVyBGbG93IENvbnRyb2wKKyAqIEBybXRvbGwgQ1IzICAgICAgICAgIENUU0UgICAgICAgICAgTExfTFBVQVJUX0Rpc2FibGVDVFNIV0Zsb3dDdHJsCisgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0Rpc2FibGVDVFNIV0Zsb3dDdHJsKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsKKyAgQ0xFQVJfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX0NUU0UpOworfQorCisvKioKKyAqIEBicmllZiAgQ29uZmlndXJlIEhXIEZsb3cgQ29udHJvbCBtb2RlIChib3RoIENUUyBhbmQgUlRTKQorICogQHJtdG9sbCBDUjMgICAgICAgICAgUlRTRSAgICAgICAgICBMTF9MUFVBUlRfU2V0SFdGbG93Q3RybFxuCisgKiAgICAgICAgIENSMyAgICAgICAgICBDVFNFICAgICAgICAgIExMX0xQVUFSVF9TZXRIV0Zsb3dDdHJsCisgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgKiBAcGFyYW0gIEhhcmR3YXJlRmxvd0NvbnRyb2wgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nCisgKiB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfSFdDT05UUk9MX05PTkUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9IV0NPTlRST0xfUlRTCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfSFdDT05UUk9MX0NUUworICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0hXQ09OVFJPTF9SVFNfQ1RTCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX1NldEhXRmxvd0N0cmwoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEhhcmR3YXJlRmxvd0NvbnRyb2wpIHsKKyAgTU9ESUZZX1JFRyhMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19SVFNFIHwgVVNBUlRfQ1IzX0NUU0UsCisgICAgICAgICAgICAgSGFyZHdhcmVGbG93Q29udHJvbCk7Cit9CisKKy8qKgorICogQGJyaWVmICBSZXR1cm4gSFcgRmxvdyBDb250cm9sIGNvbmZpZ3VyYXRpb24gKGJvdGggQ1RTIGFuZCBSVFMpCisgKiBAcm10b2xsIENSMyAgICAgICAgICBSVFNFICAgICAgICAgIExMX0xQVUFSVF9HZXRIV0Zsb3dDdHJsXG4KKyAqICAgICAgICAgQ1IzICAgICAgICAgIENUU0UgICAgICAgICAgTExfTFBVQVJUX0dldEhXRmxvd0N0cmwKKyAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9IV0NPTlRST0xfTk9ORQorICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0hXQ09OVFJPTF9SVFMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9IV0NPTlRST0xfQ1RTCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfSFdDT05UUk9MX1JUU19DVFMKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9HZXRIV0Zsb3dDdHJsKGNvbnN0IFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfUlRTRSB8IFVTQVJUX0NSM19DVFNFKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgT3ZlcnJ1biBkZXRlY3Rpb24KKyAqIEBybXRvbGwgQ1IzICAgICAgICAgIE9WUkRJUyAgICAgICAgTExfTFBVQVJUX0VuYWJsZU92ZXJydW5EZXRlY3QKKyAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRW5hYmxlT3ZlcnJ1bkRldGVjdChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7CisgIENMRUFSX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19PVlJESVMpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBPdmVycnVuIGRldGVjdGlvbgorICogQHJtdG9sbCBDUjMgICAgICAgICAgT1ZSRElTICAgICAgICBMTF9MUFVBUlRfRGlzYWJsZU92ZXJydW5EZXRlY3QKKyAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRGlzYWJsZU92ZXJydW5EZXRlY3QoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgeworICBTRVRfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX09WUkRJUyk7Cit9CisKKy8qKgorICogQGJyaWVmICBJbmRpY2F0ZSBpZiBPdmVycnVuIGRldGVjdGlvbiBpcyBlbmFibGVkCisgKiBAcm10b2xsIENSMyAgICAgICAgICBPVlJESVMgICAgICAgIExMX0xQVUFSVF9Jc0VuYWJsZWRPdmVycnVuRGV0ZWN0CisgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9MUFVBUlRfSXNFbmFibGVkT3ZlcnJ1bkRldGVjdChjb25zdCBVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7CisgIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX09WUkRJUykgIT0gVVNBUlRfQ1IzX09WUkRJUykgPyAxVUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBTZWxlY3QgZXZlbnQgdHlwZSBmb3IgV2FrZSBVUCBJbnRlcnJ1cHQgRmxhZyAoV1VTWzE6MF0gYml0cykKKyAqIEBybXRvbGwgQ1IzICAgICAgICAgIFdVUyAgICAgICAgICAgTExfTFBVQVJUX1NldFdLVVBUeXBlCisgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgKiBAcGFyYW0gIFR5cGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9XQUtFVVBfT05fQUREUkVTUworICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1dBS0VVUF9PTl9TVEFSVEJJVAorICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1dBS0VVUF9PTl9SWE5FCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX1NldFdLVVBUeXBlKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVHlwZSkgeworICBNT0RJRllfUkVHKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX1dVUywgVHlwZSk7Cit9CisKKy8qKgorICogQGJyaWVmICBSZXR1cm4gZXZlbnQgdHlwZSBmb3IgV2FrZSBVUCBJbnRlcnJ1cHQgRmxhZyAoV1VTWzE6MF0gYml0cykKKyAqIEBybXRvbGwgQ1IzICAgICAgICAgIFdVUyAgICAgICAgICAgTExfTFBVQVJUX0dldFdLVVBUeXBlCisgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfV0FLRVVQX09OX0FERFJFU1MKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9XQUtFVVBfT05fU1RBUlRCSVQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9XQUtFVVBfT05fUlhORQorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0dldFdLVVBUeXBlKGNvbnN0IFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfV1VTKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBDb25maWd1cmUgTFBVQVJUIEJSUiByZWdpc3RlciBmb3IgYWNoaWV2aW5nIGV4cGVjdGVkIEJhdWQgUmF0ZSB2YWx1ZS4KKyAqCisgKiBAbm90ZSAgIENvbXB1dGUgYW5kIHNldCBMUFVBUlRESVYgdmFsdWUgaW4gQlJSIFJlZ2lzdGVyIChmdWxsIEJSUiBjb250ZW50KQorICogICAgICAgICBhY2NvcmRpbmcgdG8gdXNlZCBQZXJpcGhlcmFsIENsb2NrIGFuZCBleHBlY3RlZCBCYXVkIFJhdGUgdmFsdWVzCisgKiBAbm90ZSAgIFBlcmlwaGVyYWwgY2xvY2sgYW5kIEJhdWQgUmF0ZSB2YWx1ZXMgcHJvdmlkZWQgYXMgZnVuY3Rpb24gcGFyYW1ldGVycworICogc2hvdWxkIGJlIHZhbGlkIChCYXVkIHJhdGUgdmFsdWUgIT0gMCkuCisgKiBAbm90ZSAgIFByb3ZpZGVkIHRoYXQgTFBVQVJUeF9CUlIgbXVzdCBiZSA+ID0gMHgzMDAgYW5kIExQVUFSVF9CUlIgaXMgMjAtYml0LAorICogICAgICAgICBhIGNhcmUgc2hvdWxkIGJlIHRha2VuIHdoZW4gZ2VuZXJhdGluZyBoaWdoIGJhdWQgcmF0ZXMgdXNpbmcgaGlnaAorICogUGVyaXBoQ2xrIHZhbHVlcy4gUGVyaXBoQ2xrIG11c3QgYmUgaW4gdGhlIHJhbmdlIFszIHggQmF1ZFJhdGUsIDQwOTYgeAorICogQmF1ZFJhdGVdLgorICogQHJtdG9sbCBCUlIgICAgICAgICAgQlJSICAgICAgICAgICBMTF9MUFVBUlRfU2V0QmF1ZFJhdGUKKyAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAqIEBwYXJhbSAgUGVyaXBoQ2xrIFBlcmlwaGVyYWwgQ2xvY2sKKyAqIEBwYXJhbSAgUHJlc2NhbGVyVmFsdWUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMQorICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWNgorICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVY4CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjEwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjEyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjE2CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjMyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjY0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjEyOAorICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYyNTYKKyAqIEBwYXJhbSAgQmF1ZFJhdGUgQmF1ZCBSYXRlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX1NldEJhdWRSYXRlKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUGVyaXBoQ2xrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFByZXNjYWxlclZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEJhdWRSYXRlKSB7CisgIGlmIChCYXVkUmF0ZSAhPSAwVSkgeworICAgIExQVUFSVHgtPkJSUiA9IF9fTExfTFBVQVJUX0RJVihQZXJpcGhDbGssIFByZXNjYWxlclZhbHVlLCBCYXVkUmF0ZSk7CisgIH0KK30KKworLyoqCisgKiBAYnJpZWYgIFJldHVybiBjdXJyZW50IEJhdWQgUmF0ZSB2YWx1ZSwgYWNjb3JkaW5nIHRvIExQVUFSVERJViBwcmVzZW50IGluIEJSUgorICogcmVnaXN0ZXIgKGZ1bGwgQlJSIGNvbnRlbnQpLCBhbmQgdG8gdXNlZCBQZXJpcGhlcmFsIENsb2NrIHZhbHVlcworICogQG5vdGUgICBJbiBjYXNlIG9mIG5vbi1pbml0aWFsaXplZCBvciBpbnZhbGlkIHZhbHVlIHN0b3JlZCBpbiBCUlIgcmVnaXN0ZXIsCisgKiB2YWx1ZSAwIHdpbGwgYmUgcmV0dXJuZWQuCisgKiBAcm10b2xsIEJSUiAgICAgICAgICBCUlIgICAgICAgICAgIExMX0xQVUFSVF9HZXRCYXVkUmF0ZQorICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHBhcmFtICBQZXJpcGhDbGsgUGVyaXBoZXJhbCBDbG9jaworICogQHBhcmFtICBQcmVzY2FsZXJWYWx1ZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWNAorICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVY2CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMTAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMTIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMTYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWNjQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMTI4CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjI1NgorICogQHJldHZhbCBCYXVkIFJhdGUKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9HZXRCYXVkUmF0ZShjb25zdCBVU0FSVF9UeXBlRGVmICpMUFVBUlR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQZXJpcGhDbGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFByZXNjYWxlclZhbHVlKSB7CisgIHVpbnQzMl90IGxwdWFydGRpdjsKKyAgdWludDMyX3QgYnJycmVzdWx0OworICB1aW50MzJfdCBwZXJpcGhjbGtwcmVzYyA9CisgICAgICAodWludDMyX3QpKFBlcmlwaENsayAvIChMUFVBUlRfUFJFU0NBTEVSX1RBQlsodWludDE2X3QpUHJlc2NhbGVyVmFsdWVdKSk7CisKKyAgbHB1YXJ0ZGl2ID0gTFBVQVJUeC0+QlJSICYgTFBVQVJUX0JSUl9NQVNLOworCisgIGlmIChscHVhcnRkaXYgPj0gTFBVQVJUX0JSUl9NSU5fVkFMVUUpIHsKKyAgICBicnJyZXN1bHQgPQorICAgICAgICAodWludDMyX3QpKCgodWludDY0X3QpKHBlcmlwaGNsa3ByZXNjKSpMUFVBUlRfTFBVQVJURElWX0ZSRVFfTVVMKSAvCisgICAgICAgICAgICAgICAgICAgbHB1YXJ0ZGl2KTsKKyAgfSBlbHNlIHsKKyAgICBicnJyZXN1bHQgPSAweDBVTDsKKyAgfQorCisgIHJldHVybiAoYnJycmVzdWx0KTsKK30KKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX0VGX0NvbmZpZ3VyYXRpb25fSGFsZkR1cGxleCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICogcmVsYXRlZCB0byBIYWxmIER1cGxleCBmZWF0dXJlCisgKiBAeworICovCisKKy8qKgorICogQGJyaWVmICBFbmFibGUgU2luZ2xlIFdpcmUgSGFsZi1EdXBsZXggbW9kZQorICogQHJtdG9sbCBDUjMgICAgICAgICAgSERTRUwgICAgICAgICBMTF9MUFVBUlRfRW5hYmxlSGFsZkR1cGxleAorICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9FbmFibGVIYWxmRHVwbGV4KFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsKKyAgU0VUX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19IRFNFTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIFNpbmdsZSBXaXJlIEhhbGYtRHVwbGV4IG1vZGUKKyAqIEBybXRvbGwgQ1IzICAgICAgICAgIEhEU0VMICAgICAgICAgTExfTFBVQVJUX0Rpc2FibGVIYWxmRHVwbGV4CisgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0Rpc2FibGVIYWxmRHVwbGV4KFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsKKyAgQ0xFQVJfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX0hEU0VMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEluZGljYXRlIGlmIFNpbmdsZSBXaXJlIEhhbGYtRHVwbGV4IG1vZGUgaXMgZW5hYmxlZAorICogQHJtdG9sbCBDUjMgICAgICAgICAgSERTRUwgICAgICAgICBMTF9MUFVBUlRfSXNFbmFibGVkSGFsZkR1cGxleAorICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfTFBVQVJUX0lzRW5hYmxlZEhhbGZEdXBsZXgoY29uc3QgVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgeworICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19IRFNFTCkgPT0gKFVTQVJUX0NSM19IRFNFTCkpID8gMVVMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUZfQ29uZmlndXJhdGlvbl9ERSBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucyByZWxhdGVkIHRvCisgKiBEcml2ZXIgRW5hYmxlIGZlYXR1cmUKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgIFNldCBERURUIChEcml2ZXIgRW5hYmxlIERlLUFzc2VydGlvbiBUaW1lKSwgVGltZSB2YWx1ZSBleHByZXNzZWQgb24gNQorICogYml0cyAoWzQ6MF0gYml0cykuCisgKiBAcm10b2xsIENSMSAgICAgICAgICBERURUICAgICAgICAgIExMX0xQVUFSVF9TZXRERURlYXNzZXJ0aW9uVGltZQorICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHBhcmFtICBUaW1lIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MzEKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfU2V0REVEZWFzc2VydGlvblRpbWUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lKSB7CisgIE1PRElGWV9SRUcoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfREVEVCwgVGltZSA8PCBVU0FSVF9DUjFfREVEVF9Qb3MpOworfQorCisvKioKKyAqIEBicmllZiAgUmV0dXJuIERFRFQgKERyaXZlciBFbmFibGUgRGUtQXNzZXJ0aW9uIFRpbWUpCisgKiBAcm10b2xsIENSMSAgICAgICAgICBERURUICAgICAgICAgIExMX0xQVUFSVF9HZXRERURlYXNzZXJ0aW9uVGltZQorICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHJldHZhbCBUaW1lIHZhbHVlIGV4cHJlc3NlZCBvbiA1IGJpdHMgKFs0OjBdIGJpdHMpIDogYworICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX0xQVUFSVF9HZXRERURlYXNzZXJ0aW9uVGltZShjb25zdCBVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX0RFRFQpID4+CisgICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMV9ERURUX1Bvcyk7Cit9CisKKy8qKgorICogQGJyaWVmICBTZXQgREVBVCAoRHJpdmVyIEVuYWJsZSBBc3NlcnRpb24gVGltZSksIFRpbWUgdmFsdWUgZXhwcmVzc2VkIG9uIDUKKyAqIGJpdHMgKFs0OjBdIGJpdHMpLgorICogQHJtdG9sbCBDUjEgICAgICAgICAgREVBVCAgICAgICAgICBMTF9MUFVBUlRfU2V0REVBc3NlcnRpb25UaW1lCisgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgKiBAcGFyYW0gIFRpbWUgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0zMQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9TZXRERUFzc2VydGlvblRpbWUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZSkgeworICBNT0RJRllfUkVHKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX0RFQVQsIFRpbWUgPDwgVVNBUlRfQ1IxX0RFQVRfUG9zKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFJldHVybiBERUFUIChEcml2ZXIgRW5hYmxlIEFzc2VydGlvbiBUaW1lKQorICogQHJtdG9sbCBDUjEgICAgICAgICAgREVBVCAgICAgICAgICBMTF9MUFVBUlRfR2V0REVBc3NlcnRpb25UaW1lCisgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIFRpbWUgdmFsdWUgZXhwcmVzc2VkIG9uIDUgYml0cyAoWzQ6MF0gYml0cykgOiBUaW1lIFZhbHVlIGJldHdlZW4KKyAqIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTMxCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfTFBVQVJUX0dldERFQXNzZXJ0aW9uVGltZShjb25zdCBVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX0RFQVQpID4+CisgICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMV9ERUFUX1Bvcyk7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgRHJpdmVyIEVuYWJsZSAoREUpIE1vZGUKKyAqIEBybXRvbGwgQ1IzICAgICAgICAgIERFTSAgICAgICAgICAgTExfTFBVQVJUX0VuYWJsZURFTW9kZQorICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9FbmFibGVERU1vZGUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgeworICBTRVRfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX0RFTSk7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIERyaXZlciBFbmFibGUgKERFKSBNb2RlCisgKiBAcm10b2xsIENSMyAgICAgICAgICBERU0gICAgICAgICAgIExMX0xQVUFSVF9EaXNhYmxlREVNb2RlCisgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0Rpc2FibGVERU1vZGUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgeworICBDTEVBUl9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfREVNKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEluZGljYXRlIGlmIERyaXZlciBFbmFibGUgKERFKSBNb2RlIGlzIGVuYWJsZWQKKyAqIEBybXRvbGwgQ1IzICAgICAgICAgIERFTSAgICAgICAgICAgTExfTFBVQVJUX0lzRW5hYmxlZERFTW9kZQorICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfTFBVQVJUX0lzRW5hYmxlZERFTW9kZShjb25zdCBVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7CisgIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX0RFTSkgPT0gKFVTQVJUX0NSM19ERU0pKSA/IDFVTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgU2VsZWN0IERyaXZlciBFbmFibGUgUG9sYXJpdHkKKyAqIEBybXRvbGwgQ1IzICAgICAgICAgIERFUCAgICAgICAgICAgTExfTFBVQVJUX1NldERFU2lnbmFsUG9sYXJpdHkKKyAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAqIEBwYXJhbSAgUG9sYXJpdHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9ERV9QT0xBUklUWV9ISUdICisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfREVfUE9MQVJJVFlfTE9XCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX1NldERFU2lnbmFsUG9sYXJpdHkoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFBvbGFyaXR5KSB7CisgIE1PRElGWV9SRUcoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfREVQLCBQb2xhcml0eSk7Cit9CisKKy8qKgorICogQGJyaWVmICBSZXR1cm4gRHJpdmVyIEVuYWJsZSBQb2xhcml0eQorICogQHJtdG9sbCBDUjMgICAgICAgICAgREVQICAgICAgICAgICBMTF9MUFVBUlRfR2V0REVTaWduYWxQb2xhcml0eQorICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0RFX1BPTEFSSVRZX0hJR0gKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9ERV9QT0xBUklUWV9MT1cKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9MUFVBUlRfR2V0REVTaWduYWxQb2xhcml0eShjb25zdCBVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX0RFUCkpOworfQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUZfRkxBR19NYW5hZ2VtZW50IEZMQUdfTWFuYWdlbWVudAorICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBQYXJpdHkgRXJyb3IgRmxhZyBpcyBzZXQgb3Igbm90CisgKiBAcm10b2xsIElTUiAgICAgICAgICBQRSAgICAgICAgICAgIExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfUEUKKyAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfUEUoY29uc3QgVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgeworICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5JU1IsIFVTQVJUX0lTUl9QRSkgPT0gKFVTQVJUX0lTUl9QRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBMUFVBUlQgRnJhbWluZyBFcnJvciBGbGFnIGlzIHNldCBvciBub3QKKyAqIEBybXRvbGwgSVNSICAgICAgICAgIEZFICAgICAgICAgICAgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19GRQorICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19GRShjb25zdCBVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7CisgIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPklTUiwgVVNBUlRfSVNSX0ZFKSA9PSAoVVNBUlRfSVNSX0ZFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBOb2lzZSBlcnJvciBkZXRlY3RlZCBGbGFnIGlzIHNldCBvciBub3QKKyAqIEBybXRvbGwgSVNSICAgICAgICAgIE5FICAgICAgICAgICAgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19ORQorICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19ORShjb25zdCBVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7CisgIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPklTUiwgVVNBUlRfSVNSX05FKSA9PSAoVVNBUlRfSVNSX05FKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBPdmVyUnVuIEVycm9yIEZsYWcgaXMgc2V0IG9yIG5vdAorICogQHJtdG9sbCBJU1IgICAgICAgICAgT1JFICAgICAgICAgICBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX09SRQorICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19PUkUoY29uc3QgVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgeworICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5JU1IsIFVTQVJUX0lTUl9PUkUpID09IChVU0FSVF9JU1JfT1JFKSkgPyAxVUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBMUFVBUlQgSURMRSBsaW5lIGRldGVjdGVkIEZsYWcgaXMgc2V0IG9yIG5vdAorICogQHJtdG9sbCBJU1IgICAgICAgICAgSURMRSAgICAgICAgICBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX0lETEUKKyAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfSURMRShjb25zdCBVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7CisgIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPklTUiwgVVNBUlRfSVNSX0lETEUpID09IChVU0FSVF9JU1JfSURMRSkpID8gMVVMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsKK30KKworI2RlZmluZSBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX1JYTkUgXAorICBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX1JYTkVfUlhGTkUgLyogUmVkZWZpbml0aW9uIGZvciBsZWdhY3kgcHVycG9zZSAqLworCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBSZWFkIERhdGEgUmVnaXN0ZXIgb3IgTFBVQVJUIFJYIEZJRk8gTm90IEVtcHR5CisgKiBGbGFnIGlzIHNldCBvciBub3QKKyAqIEBybXRvbGwgSVNSICAgICAgICAgIFJYTkVfUlhGTkUgICAgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19SWE5FX1JYRk5FCisgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX1JYTkVfUlhGTkUoY29uc3QgVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgeworICByZXR1cm4gKAorICAgICAgKFJFQURfQklUKExQVUFSVHgtPklTUiwgVVNBUlRfSVNSX1JYTkVfUlhGTkUpID09IChVU0FSVF9JU1JfUlhORV9SWEZORSkpCisgICAgICAgICAgPyAxVUwKKyAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiB0aGUgTFBVQVJUIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBGbGFnIGlzIHNldCBvciBub3QKKyAqIEBybXRvbGwgSVNSICAgICAgICAgIFRDICAgICAgICAgICAgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19UQworICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19UQyhjb25zdCBVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7CisgIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPklTUiwgVVNBUlRfSVNSX1RDKSA9PSAoVVNBUlRfSVNSX1RDKSkgPyAxVUwgOiAwVUwpOworfQorCisjZGVmaW5lIExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfVFhFIFwKKyAgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19UWEVfVFhGTkYgLyogUmVkZWZpbml0aW9uIGZvciBsZWdhY3kgcHVycG9zZSAqLworCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBUcmFuc21pdCBEYXRhIFJlZ2lzdGVyIEVtcHR5IG9yIExQVUFSVCBUWCBGSUZPCisgKiBOb3QgRnVsbCBGbGFnIGlzIHNldCBvciBub3QKKyAqIEBybXRvbGwgSVNSICAgICAgICAgIFRYRV9UWEZORiAgICAgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19UWEVfVFhGTkYKKyAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfVFhFX1RYRk5GKGNvbnN0IFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoTFBVQVJUeC0+SVNSLCBVU0FSVF9JU1JfVFhFX1RYRk5GKSA9PSAoVVNBUlRfSVNSX1RYRV9UWEZORikpCisgICAgICAgICAgICAgID8gMVVMCisgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBMUFVBUlQgQ1RTIGludGVycnVwdCBGbGFnIGlzIHNldCBvciBub3QKKyAqIEBybXRvbGwgSVNSICAgICAgICAgIENUU0lGICAgICAgICAgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19uQ1RTCisgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX25DVFMoY29uc3QgVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgeworICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5JU1IsIFVTQVJUX0lTUl9DVFNJRikgPT0gKFVTQVJUX0lTUl9DVFNJRikpID8gMVVMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBDVFMgRmxhZyBpcyBzZXQgb3Igbm90CisgKiBAcm10b2xsIElTUiAgICAgICAgICBDVFMgICAgICAgICAgIExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfQ1RTCisgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX0NUUyhjb25zdCBVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7CisgIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPklTUiwgVVNBUlRfSVNSX0NUUykgPT0gKFVTQVJUX0lTUl9DVFMpKSA/IDFVTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBCdXN5IEZsYWcgaXMgc2V0IG9yIG5vdAorICogQHJtdG9sbCBJU1IgICAgICAgICAgQlVTWSAgICAgICAgICBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX0JVU1kKKyAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfQlVTWShjb25zdCBVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7CisgIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPklTUiwgVVNBUlRfSVNSX0JVU1kpID09IChVU0FSVF9JU1JfQlVTWSkpID8gMVVMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBMUFVBUlQgQ2hhcmFjdGVyIE1hdGNoIEZsYWcgaXMgc2V0IG9yIG5vdAorICogQHJtdG9sbCBJU1IgICAgICAgICAgQ01GICAgICAgICAgICBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX0NNCisgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX0NNKGNvbnN0IFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoTFBVQVJUeC0+SVNSLCBVU0FSVF9JU1JfQ01GKSA9PSAoVVNBUlRfSVNSX0NNRikpID8gMVVMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiB0aGUgTFBVQVJUIFNlbmQgQnJlYWsgRmxhZyBpcyBzZXQgb3Igbm90CisgKiBAcm10b2xsIElTUiAgICAgICAgICBTQktGICAgICAgICAgIExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfU0JLCisgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX1NCSyhjb25zdCBVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7CisgIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPklTUiwgVVNBUlRfSVNSX1NCS0YpID09IChVU0FSVF9JU1JfU0JLRikpID8gMVVMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBMUFVBUlQgUmVjZWl2ZSBXYWtlIFVwIGZyb20gbXV0ZSBtb2RlIEZsYWcgaXMgc2V0IG9yIG5vdAorICogQHJtdG9sbCBJU1IgICAgICAgICAgUldVICAgICAgICAgICBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX1JXVQorICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19SV1UoY29uc3QgVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgeworICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5JU1IsIFVTQVJUX0lTUl9SV1UpID09IChVU0FSVF9JU1JfUldVKSkgPyAxVUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBMUFVBUlQgV2FrZSBVcCBmcm9tIHN0b3AgbW9kZSBGbGFnIGlzIHNldCBvciBub3QKKyAqIEBybXRvbGwgSVNSICAgICAgICAgIFdVRiAgICAgICAgICAgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19XS1VQCisgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX1dLVVAoY29uc3QgVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgeworICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5JU1IsIFVTQVJUX0lTUl9XVUYpID09IChVU0FSVF9JU1JfV1VGKSkgPyAxVUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBMUFVBUlQgVHJhbnNtaXQgRW5hYmxlIEFja25vd2xlZGdlIEZsYWcgaXMgc2V0IG9yIG5vdAorICogQHJtdG9sbCBJU1IgICAgICAgICAgVEVBQ0sgICAgICAgICBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX1RFQUNLCisgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX1RFQUNLKGNvbnN0IFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoTFBVQVJUeC0+SVNSLCBVU0FSVF9JU1JfVEVBQ0spID09IChVU0FSVF9JU1JfVEVBQ0spKSA/IDFVTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBMUFVBUlQgUmVjZWl2ZSBFbmFibGUgQWNrbm93bGVkZ2UgRmxhZyBpcyBzZXQgb3Igbm90CisgKiBAcm10b2xsIElTUiAgICAgICAgICBSRUFDSyAgICAgICAgIExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfUkVBQ0sKKyAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfUkVBQ0soY29uc3QgVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgeworICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5JU1IsIFVTQVJUX0lTUl9SRUFDSykgPT0gKFVTQVJUX0lTUl9SRUFDSykpID8gMVVMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBUWCBGSUZPIEVtcHR5IEZsYWcgaXMgc2V0IG9yIG5vdAorICogQHJtdG9sbCBJU1IgICAgICAgICAgVFhGRSAgICAgICAgICBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX1RYRkUKKyAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfVFhGRShjb25zdCBVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7CisgIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPklTUiwgVVNBUlRfSVNSX1RYRkUpID09IChVU0FSVF9JU1JfVFhGRSkpID8gMVVMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBMUFVBUlQgUlggRklGTyBGdWxsIEZsYWcgaXMgc2V0IG9yIG5vdAorICogQHJtdG9sbCBJU1IgICAgICAgICAgUlhGRiAgICAgICAgICBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX1JYRkYKKyAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfUlhGRihjb25zdCBVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7CisgIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPklTUiwgVVNBUlRfSVNSX1JYRkYpID09IChVU0FSVF9JU1JfUlhGRikpID8gMVVMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBMUFVBUlQgVFggRklGTyBUaHJlc2hvbGQgRmxhZyBpcyBzZXQgb3Igbm90CisgKiBAcm10b2xsIElTUiAgICAgICAgICBUWEZUICAgICAgICAgIExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfVFhGVAorICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19UWEZUKGNvbnN0IFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoTFBVQVJUeC0+SVNSLCBVU0FSVF9JU1JfVFhGVCkgPT0gKFVTQVJUX0lTUl9UWEZUKSkgPyAxVUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBSWCBGSUZPIFRocmVzaG9sZCBGbGFnIGlzIHNldCBvciBub3QKKyAqIEBybXRvbGwgSVNSICAgICAgICAgIFJYRlQgICAgICAgICAgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19SWEZUCisgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX1JYRlQoY29uc3QgVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgeworICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5JU1IsIFVTQVJUX0lTUl9SWEZUKSA9PSAoVVNBUlRfSVNSX1JYRlQpKSA/IDFVTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDbGVhciBQYXJpdHkgRXJyb3IgRmxhZworICogQHJtdG9sbCBJQ1IgICAgICAgICAgUEVDRiAgICAgICAgICBMTF9MUFVBUlRfQ2xlYXJGbGFnX1BFCisgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0NsZWFyRmxhZ19QRShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7CisgIFdSSVRFX1JFRyhMUFVBUlR4LT5JQ1IsIFVTQVJUX0lDUl9QRUNGKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENsZWFyIEZyYW1pbmcgRXJyb3IgRmxhZworICogQHJtdG9sbCBJQ1IgICAgICAgICAgRkVDRiAgICAgICAgICBMTF9MUFVBUlRfQ2xlYXJGbGFnX0ZFCisgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0NsZWFyRmxhZ19GRShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7CisgIFdSSVRFX1JFRyhMUFVBUlR4LT5JQ1IsIFVTQVJUX0lDUl9GRUNGKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENsZWFyIE5vaXNlIGRldGVjdGVkIEZsYWcKKyAqIEBybXRvbGwgSUNSICAgICAgICAgIE5FQ0YgICAgICAgICAgTExfTFBVQVJUX0NsZWFyRmxhZ19ORQorICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9DbGVhckZsYWdfTkUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgeworICBXUklURV9SRUcoTFBVQVJUeC0+SUNSLCBVU0FSVF9JQ1JfTkVDRik7Cit9CisKKy8qKgorICogQGJyaWVmICBDbGVhciBPdmVyUnVuIEVycm9yIEZsYWcKKyAqIEBybXRvbGwgSUNSICAgICAgICAgIE9SRUNGICAgICAgICAgTExfTFBVQVJUX0NsZWFyRmxhZ19PUkUKKyAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfQ2xlYXJGbGFnX09SRShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7CisgIFdSSVRFX1JFRyhMUFVBUlR4LT5JQ1IsIFVTQVJUX0lDUl9PUkVDRik7Cit9CisKKy8qKgorICogQGJyaWVmICBDbGVhciBJRExFIGxpbmUgZGV0ZWN0ZWQgRmxhZworICogQHJtdG9sbCBJQ1IgICAgICAgICAgSURMRUNGICAgICAgICBMTF9MUFVBUlRfQ2xlYXJGbGFnX0lETEUKKyAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfQ2xlYXJGbGFnX0lETEUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgeworICBXUklURV9SRUcoTFBVQVJUeC0+SUNSLCBVU0FSVF9JQ1JfSURMRUNGKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENsZWFyIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBGbGFnCisgKiBAcm10b2xsIElDUiAgICAgICAgICBUQ0NGICAgICAgICAgIExMX0xQVUFSVF9DbGVhckZsYWdfVEMKKyAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfQ2xlYXJGbGFnX1RDKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsKKyAgV1JJVEVfUkVHKExQVUFSVHgtPklDUiwgVVNBUlRfSUNSX1RDQ0YpOworfQorCisvKioKKyAqIEBicmllZiAgQ2xlYXIgQ1RTIEludGVycnVwdCBGbGFnCisgKiBAcm10b2xsIElDUiAgICAgICAgICBDVFNDRiAgICAgICAgIExMX0xQVUFSVF9DbGVhckZsYWdfbkNUUworICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9DbGVhckZsYWdfbkNUUyhVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7CisgIFdSSVRFX1JFRyhMUFVBUlR4LT5JQ1IsIFVTQVJUX0lDUl9DVFNDRik7Cit9CisKKy8qKgorICogQGJyaWVmICBDbGVhciBDaGFyYWN0ZXIgTWF0Y2ggRmxhZworICogQHJtdG9sbCBJQ1IgICAgICAgICAgQ01DRiAgICAgICAgICBMTF9MUFVBUlRfQ2xlYXJGbGFnX0NNCisgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0NsZWFyRmxhZ19DTShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7CisgIFdSSVRFX1JFRyhMUFVBUlR4LT5JQ1IsIFVTQVJUX0lDUl9DTUNGKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENsZWFyIFdha2UgVXAgZnJvbSBzdG9wIG1vZGUgRmxhZworICogQHJtdG9sbCBJQ1IgICAgICAgICAgV1VDRiAgICAgICAgICBMTF9MUFVBUlRfQ2xlYXJGbGFnX1dLVVAKKyAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfQ2xlYXJGbGFnX1dLVVAoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgeworICBXUklURV9SRUcoTFBVQVJUeC0+SUNSLCBVU0FSVF9JQ1JfV1VDRik7Cit9CisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIExQVUFSVF9MTF9FRl9JVF9NYW5hZ2VtZW50IElUX01hbmFnZW1lbnQKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBJRExFIEludGVycnVwdAorICogQHJtdG9sbCBDUjEgICAgICAgICAgSURMRUlFICAgICAgICBMTF9MUFVBUlRfRW5hYmxlSVRfSURMRQorICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9FbmFibGVJVF9JRExFKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsKKyAgQVRPTUlDX1NFVF9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfSURMRUlFKTsKK30KKworI2RlZmluZSBMTF9MUFVBUlRfRW5hYmxlSVRfUlhORSBcCisgIExMX0xQVUFSVF9FbmFibGVJVF9SWE5FX1JYRk5FIC8qIFJlZGVmaW5pdGlvbiBmb3IgbGVnYWN5IHB1cnBvc2UgKi8KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBSWCBOb3QgRW1wdHkgYW5kIFJYIEZJRk8gTm90IEVtcHR5IEludGVycnVwdAorICogQHJtdG9sbCBDUjEgICAgICAgIFJYTkVJRV9SWEZORUlFICBMTF9MUFVBUlRfRW5hYmxlSVRfUlhORV9SWEZORQorICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9FbmFibGVJVF9SWE5FX1JYRk5FKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsKKyAgQVRPTUlDX1NFVF9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUlhORUlFX1JYRk5FSUUpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBJbnRlcnJ1cHQKKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIFRDSUUgICAgICAgICAgTExfTFBVQVJUX0VuYWJsZUlUX1RDCisgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0VuYWJsZUlUX1RDKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsKKyAgQVRPTUlDX1NFVF9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfVENJRSk7Cit9CisKKyNkZWZpbmUgTExfTFBVQVJUX0VuYWJsZUlUX1RYRSBcCisgIExMX0xQVUFSVF9FbmFibGVJVF9UWEVfVFhGTkYgLyogUmVkZWZpbml0aW9uIGZvciBsZWdhY3kgcHVycG9zZSAqLworCisvKioKKyAqIEBicmllZiAgRW5hYmxlIFRYIEVtcHR5IGFuZCBUWCBGSUZPIE5vdCBGdWxsIEludGVycnVwdAorICogQHJtdG9sbCBDUjEgICAgICAgICBUWEVJRV9UWEZORklFICBMTF9MUFVBUlRfRW5hYmxlSVRfVFhFX1RYRk5GCisgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0VuYWJsZUlUX1RYRV9UWEZORihVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7CisgIEFUT01JQ19TRVRfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX1RYRUlFX1RYRk5GSUUpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIFBhcml0eSBFcnJvciBJbnRlcnJ1cHQKKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIFBFSUUgICAgICAgICAgTExfTFBVQVJUX0VuYWJsZUlUX1BFCisgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0VuYWJsZUlUX1BFKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsKKyAgQVRPTUlDX1NFVF9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUEVJRSk7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgQ2hhcmFjdGVyIE1hdGNoIEludGVycnVwdAorICogQHJtdG9sbCBDUjEgICAgICAgICAgQ01JRSAgICAgICAgICBMTF9MUFVBUlRfRW5hYmxlSVRfQ00KKyAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRW5hYmxlSVRfQ00oVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgeworICBBVE9NSUNfU0VUX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9DTUlFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBUWCBGSUZPIEVtcHR5IEludGVycnVwdAorICogQHJtdG9sbCBDUjEgICAgICAgICAgVFhGRUlFICAgICAgICBMTF9MUFVBUlRfRW5hYmxlSVRfVFhGRQorICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9FbmFibGVJVF9UWEZFKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsKKyAgQVRPTUlDX1NFVF9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfVFhGRUlFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBSWCBGSUZPIEZ1bGwgSW50ZXJydXB0CisgKiBAcm10b2xsIENSMSAgICAgICAgICBSWEZGSUUgICAgICAgIExMX0xQVUFSVF9FbmFibGVJVF9SWEZGCisgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0VuYWJsZUlUX1JYRkYoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgeworICBBVE9NSUNfU0VUX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9SWEZGSUUpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIEVycm9yIEludGVycnVwdAorICogQG5vdGUgICBXaGVuIHNldCwgRXJyb3IgSW50ZXJydXB0IEVuYWJsZSBCaXQgaXMgZW5hYmxpbmcgaW50ZXJydXB0IGdlbmVyYXRpb24KKyAqIGluIGNhc2Ugb2YgYSBmcmFtaW5nIGVycm9yLCBvdmVycnVuIGVycm9yIG9yIG5vaXNlIGZsYWcgKEZFPTEgb3IgT1JFPTEgb3IKKyAqIE5GPTEgaW4gdGhlIExQVUFSVHhfSVNSIHJlZ2lzdGVyKS4KKyAqICAgICAgICAgLSAwOiBJbnRlcnJ1cHQgaXMgaW5oaWJpdGVkCisgKiAgICAgICAgIC0gMTogQW4gaW50ZXJydXB0IGlzIGdlbmVyYXRlZCB3aGVuIEZFPTEgb3IgT1JFPTEgb3IgTkY9MSBpbiB0aGUKKyAqIExQVUFSVHhfSVNSIHJlZ2lzdGVyLgorICogQHJtdG9sbCBDUjMgICAgICAgICAgRUlFICAgICAgICAgICBMTF9MUFVBUlRfRW5hYmxlSVRfRVJST1IKKyAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRW5hYmxlSVRfRVJST1IoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgeworICBBVE9NSUNfU0VUX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19FSUUpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIENUUyBJbnRlcnJ1cHQKKyAqIEBybXRvbGwgQ1IzICAgICAgICAgIENUU0lFICAgICAgICAgTExfTFBVQVJUX0VuYWJsZUlUX0NUUworICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9FbmFibGVJVF9DVFMoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgeworICBBVE9NSUNfU0VUX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19DVFNJRSk7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgV2FrZSBVcCBmcm9tIFN0b3AgTW9kZSBJbnRlcnJ1cHQKKyAqIEBybXRvbGwgQ1IzICAgICAgICAgIFdVRklFICAgICAgICAgTExfTFBVQVJUX0VuYWJsZUlUX1dLVVAKKyAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRW5hYmxlSVRfV0tVUChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7CisgIEFUT01JQ19TRVRfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX1dVRklFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBUWCBGSUZPIFRocmVzaG9sZCBJbnRlcnJ1cHQKKyAqIEBybXRvbGwgQ1IzICAgICAgICAgIFRYRlRJRSAgICAgICAgTExfTFBVQVJUX0VuYWJsZUlUX1RYRlQKKyAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRW5hYmxlSVRfVFhGVChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7CisgIEFUT01JQ19TRVRfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX1RYRlRJRSk7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgUlggRklGTyBUaHJlc2hvbGQgSW50ZXJydXB0CisgKiBAcm10b2xsIENSMyAgICAgICAgICBSWEZUSUUgICAgICAgIExMX0xQVUFSVF9FbmFibGVJVF9SWEZUCisgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0VuYWJsZUlUX1JYRlQoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgeworICBBVE9NSUNfU0VUX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19SWEZUSUUpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBJRExFIEludGVycnVwdAorICogQHJtdG9sbCBDUjEgICAgICAgICAgSURMRUlFICAgICAgICBMTF9MUFVBUlRfRGlzYWJsZUlUX0lETEUKKyAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRGlzYWJsZUlUX0lETEUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgeworICBBVE9NSUNfQ0xFQVJfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX0lETEVJRSk7Cit9CisKKyNkZWZpbmUgTExfTFBVQVJUX0Rpc2FibGVJVF9SWE5FIFwKKyAgTExfTFBVQVJUX0Rpc2FibGVJVF9SWE5FX1JYRk5FIC8qIFJlZGVmaW5pdGlvbiBmb3IgbGVnYWN5IHB1cnBvc2UgKi8KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgUlggTm90IEVtcHR5IGFuZCBSWCBGSUZPIE5vdCBFbXB0eSBJbnRlcnJ1cHQKKyAqIEBybXRvbGwgQ1IxICAgICAgICBSWE5FSUVfUlhGTkVJRSAgTExfTFBVQVJUX0Rpc2FibGVJVF9SWE5FX1JYRk5FCisgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0Rpc2FibGVJVF9SWE5FX1JYRk5FKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsKKyAgQVRPTUlDX0NMRUFSX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSk7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBJbnRlcnJ1cHQKKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIFRDSUUgICAgICAgICAgTExfTFBVQVJUX0Rpc2FibGVJVF9UQworICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9EaXNhYmxlSVRfVEMoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgeworICBBVE9NSUNfQ0xFQVJfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX1RDSUUpOworfQorCisjZGVmaW5lIExMX0xQVUFSVF9EaXNhYmxlSVRfVFhFIFwKKyAgTExfTFBVQVJUX0Rpc2FibGVJVF9UWEVfVFhGTkYgLyogUmVkZWZpbml0aW9uIGZvciBsZWdhY3kgcHVycG9zZSAqLworCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBUWCBFbXB0eSBhbmQgVFggRklGTyBOb3QgRnVsbCBJbnRlcnJ1cHQKKyAqIEBybXRvbGwgQ1IxICAgICAgICBUWEVJRV9UWEZORklFICBMTF9MUFVBUlRfRGlzYWJsZUlUX1RYRV9UWEZORgorICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9EaXNhYmxlSVRfVFhFX1RYRk5GKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsKKyAgQVRPTUlDX0NMRUFSX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9UWEVJRV9UWEZORklFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgUGFyaXR5IEVycm9yIEludGVycnVwdAorICogQHJtdG9sbCBDUjEgICAgICAgICAgUEVJRSAgICAgICAgICBMTF9MUFVBUlRfRGlzYWJsZUlUX1BFCisgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0Rpc2FibGVJVF9QRShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7CisgIEFUT01JQ19DTEVBUl9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUEVJRSk7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIENoYXJhY3RlciBNYXRjaCBJbnRlcnJ1cHQKKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIENNSUUgICAgICAgICAgTExfTFBVQVJUX0Rpc2FibGVJVF9DTQorICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9EaXNhYmxlSVRfQ00oVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgeworICBBVE9NSUNfQ0xFQVJfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX0NNSUUpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBUWCBGSUZPIEVtcHR5IEludGVycnVwdAorICogQHJtdG9sbCBDUjEgICAgICAgICAgVFhGRUlFICAgICAgICBMTF9MUFVBUlRfRGlzYWJsZUlUX1RYRkUKKyAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRGlzYWJsZUlUX1RYRkUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgeworICBBVE9NSUNfQ0xFQVJfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX1RYRkVJRSk7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIFJYIEZJRk8gRnVsbCBJbnRlcnJ1cHQKKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIFJYRkZJRSAgICAgICAgTExfTFBVQVJUX0Rpc2FibGVJVF9SWEZGCisgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0Rpc2FibGVJVF9SWEZGKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsKKyAgQVRPTUlDX0NMRUFSX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9SWEZGSUUpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBFcnJvciBJbnRlcnJ1cHQKKyAqIEBub3RlICAgV2hlbiBzZXQsIEVycm9yIEludGVycnVwdCBFbmFibGUgQml0IGlzIGVuYWJsaW5nIGludGVycnVwdCBnZW5lcmF0aW9uCisgKiBpbiBjYXNlIG9mIGEgZnJhbWluZyBlcnJvciwgb3ZlcnJ1biBlcnJvciBvciBub2lzZSBmbGFnIChGRT0xIG9yIE9SRT0xIG9yCisgKiBORj0xIGluIHRoZSBMUFVBUlR4X0lTUiByZWdpc3RlcikuCisgKiAgICAgICAgIC0gMDogSW50ZXJydXB0IGlzIGluaGliaXRlZAorICogICAgICAgICAtIDE6IEFuIGludGVycnVwdCBpcyBnZW5lcmF0ZWQgd2hlbiBGRT0xIG9yIE9SRT0xIG9yIE5GPTEgaW4gdGhlCisgKiBMUFVBUlR4X0lTUiByZWdpc3Rlci4KKyAqIEBybXRvbGwgQ1IzICAgICAgICAgIEVJRSAgICAgICAgICAgTExfTFBVQVJUX0Rpc2FibGVJVF9FUlJPUgorICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9EaXNhYmxlSVRfRVJST1IoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgeworICBBVE9NSUNfQ0xFQVJfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX0VJRSk7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIENUUyBJbnRlcnJ1cHQKKyAqIEBybXRvbGwgQ1IzICAgICAgICAgIENUU0lFICAgICAgICAgTExfTFBVQVJUX0Rpc2FibGVJVF9DVFMKKyAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRGlzYWJsZUlUX0NUUyhVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7CisgIEFUT01JQ19DTEVBUl9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfQ1RTSUUpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBXYWtlIFVwIGZyb20gU3RvcCBNb2RlIEludGVycnVwdAorICogQHJtdG9sbCBDUjMgICAgICAgICAgV1VGSUUgICAgICAgICBMTF9MUFVBUlRfRGlzYWJsZUlUX1dLVVAKKyAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRGlzYWJsZUlUX1dLVVAoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgeworICBBVE9NSUNfQ0xFQVJfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX1dVRklFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgVFggRklGTyBUaHJlc2hvbGQgSW50ZXJydXB0CisgKiBAcm10b2xsIENSMyAgICAgICAgICBUWEZUSUUgICAgICAgIExMX0xQVUFSVF9EaXNhYmxlSVRfVFhGVAorICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9EaXNhYmxlSVRfVFhGVChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7CisgIEFUT01JQ19DTEVBUl9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfVFhGVElFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgUlggRklGTyBUaHJlc2hvbGQgSW50ZXJydXB0CisgKiBAcm10b2xsIENSMyAgICAgICAgICBSWEZUSUUgICAgICAgIExMX0xQVUFSVF9EaXNhYmxlSVRfUlhGVAorICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9EaXNhYmxlSVRfUlhGVChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7CisgIEFUT01JQ19DTEVBUl9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfUlhGVElFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBMUFVBUlQgSURMRSBJbnRlcnJ1cHQgIHNvdXJjZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICogQHJtdG9sbCBDUjEgICAgICAgICAgSURMRUlFICAgICAgICBMTF9MUFVBUlRfSXNFbmFibGVkSVRfSURMRQorICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfTFBVQVJUX0lzRW5hYmxlZElUX0lETEUoY29uc3QgVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgeworICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9JRExFSUUpID09IChVU0FSVF9DUjFfSURMRUlFKSkKKyAgICAgICAgICAgICAgPyAxVUwKKyAgICAgICAgICAgICAgOiAwVUwpOworfQorCisjZGVmaW5lIExMX0xQVUFSVF9Jc0VuYWJsZWRJVF9SWE5FIFwKKyAgTExfTFBVQVJUX0lzRW5hYmxlZElUX1JYTkVfUlhGTkUgLyogUmVkZWZpbml0aW9uIGZvciBsZWdhY3kgcHVycG9zZSAqLworCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBSWCBOb3QgRW1wdHkgYW5kIExQVUFSVCBSWCBGSUZPIE5vdCBFbXB0eQorICogSW50ZXJydXB0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgKiBAcm10b2xsIENSMSAgICAgICAgUlhORUlFX1JYRk5FSUUgIExMX0xQVUFSVF9Jc0VuYWJsZWRJVF9SWE5FX1JYRk5FCisgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9MUFVBUlRfSXNFbmFibGVkSVRfUlhORV9SWEZORShjb25zdCBVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7CisgIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFKSA9PQorICAgICAgICAgICAoVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFKSkKKyAgICAgICAgICAgICAgPyAxVUwKKyAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBUcmFuc21pc3Npb24gQ29tcGxldGUgSW50ZXJydXB0IGlzIGVuYWJsZWQgb3IKKyAqIGRpc2FibGVkLgorICogQHJtdG9sbCBDUjEgICAgICAgICAgVENJRSAgICAgICAgICBMTF9MUFVBUlRfSXNFbmFibGVkSVRfVEMKKyAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX0xQVUFSVF9Jc0VuYWJsZWRJVF9UQyhjb25zdCBVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7CisgIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX1RDSUUpID09IChVU0FSVF9DUjFfVENJRSkpID8gMVVMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsKK30KKworI2RlZmluZSBMTF9MUFVBUlRfSXNFbmFibGVkSVRfVFhFIFwKKyAgTExfTFBVQVJUX0lzRW5hYmxlZElUX1RYRV9UWEZORiAvKiBSZWRlZmluaXRpb24gZm9yIGxlZ2FjeSBwdXJwb3NlICovCisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiB0aGUgTFBVQVJUIFRYIEVtcHR5IGFuZCBMUFVBUlQgVFggRklGTyBOb3QgRnVsbCBJbnRlcnJ1cHQgaXMKKyAqIGVuYWJsZWQgb3IgZGlzYWJsZWQKKyAqIEBybXRvbGwgQ1IxICAgICAgICAgVFhFSUVfVFhGTkZJRSAgTExfTFBVQVJUX0lzRW5hYmxlZElUX1RYRV9UWEZORgorICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfTFBVQVJUX0lzRW5hYmxlZElUX1RYRV9UWEZORihjb25zdCBVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7CisgIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX1RYRUlFX1RYRk5GSUUpID09CisgICAgICAgICAgIChVU0FSVF9DUjFfVFhFSUVfVFhGTkZJRSkpCisgICAgICAgICAgICAgID8gMVVMCisgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBMUFVBUlQgUGFyaXR5IEVycm9yIEludGVycnVwdCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICogQHJtdG9sbCBDUjEgICAgICAgICAgUEVJRSAgICAgICAgICBMTF9MUFVBUlRfSXNFbmFibGVkSVRfUEUKKyAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX0xQVUFSVF9Jc0VuYWJsZWRJVF9QRShjb25zdCBVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7CisgIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX1BFSUUpID09IChVU0FSVF9DUjFfUEVJRSkpID8gMVVMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBMUFVBUlQgQ2hhcmFjdGVyIE1hdGNoIEludGVycnVwdCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICogQHJtdG9sbCBDUjEgICAgICAgICAgQ01JRSAgICAgICAgICBMTF9MUFVBUlRfSXNFbmFibGVkSVRfQ00KKyAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX0xQVUFSVF9Jc0VuYWJsZWRJVF9DTShjb25zdCBVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7CisgIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX0NNSUUpID09IChVU0FSVF9DUjFfQ01JRSkpID8gMVVMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBMUFVBUlQgVFggRklGTyBFbXB0eSBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZAorICogQHJtdG9sbCBDUjEgICAgICAgICAgVFhGRUlFICAgICAgICBMTF9MUFVBUlRfSXNFbmFibGVkSVRfVFhGRQorICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfTFBVQVJUX0lzRW5hYmxlZElUX1RYRkUoY29uc3QgVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgeworICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9UWEZFSUUpID09IChVU0FSVF9DUjFfVFhGRUlFKSkKKyAgICAgICAgICAgICAgPyAxVUwKKyAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBSWCBGSUZPIEZ1bGwgSW50ZXJydXB0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQKKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIFJYRkZJRSAgICAgICAgTExfTFBVQVJUX0lzRW5hYmxlZElUX1JYRkYKKyAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX0xQVUFSVF9Jc0VuYWJsZWRJVF9SWEZGKGNvbnN0IFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUlhGRklFKSA9PSAoVVNBUlRfQ1IxX1JYRkZJRSkpCisgICAgICAgICAgICAgID8gMVVMCisgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBMUFVBUlQgRXJyb3IgSW50ZXJydXB0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgKiBAcm10b2xsIENSMyAgICAgICAgICBFSUUgICAgICAgICAgIExMX0xQVUFSVF9Jc0VuYWJsZWRJVF9FUlJPUgorICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfTFBVQVJUX0lzRW5hYmxlZElUX0VSUk9SKGNvbnN0IFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfRUlFKSA9PSAoVVNBUlRfQ1IzX0VJRSkpID8gMVVMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiB0aGUgTFBVQVJUIENUUyBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAqIEBybXRvbGwgQ1IzICAgICAgICAgIENUU0lFICAgICAgICAgTExfTFBVQVJUX0lzRW5hYmxlZElUX0NUUworICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfTFBVQVJUX0lzRW5hYmxlZElUX0NUUyhjb25zdCBVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7CisgIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX0NUU0lFKSA9PSAoVVNBUlRfQ1IzX0NUU0lFKSkgPyAxVUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiB0aGUgTFBVQVJUIFdha2UgVXAgZnJvbSBTdG9wIE1vZGUgSW50ZXJydXB0IGlzIGVuYWJsZWQgb3IKKyAqIGRpc2FibGVkLgorICogQHJtdG9sbCBDUjMgICAgICAgICAgV1VGSUUgICAgICAgICBMTF9MUFVBUlRfSXNFbmFibGVkSVRfV0tVUAorICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfTFBVQVJUX0lzRW5hYmxlZElUX1dLVVAoY29uc3QgVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgeworICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19XVUZJRSkgPT0gKFVTQVJUX0NSM19XVUZJRSkpID8gMVVMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgTFBVQVJUIFRYIEZJRk8gVGhyZXNob2xkIEludGVycnVwdCBpcyBlbmFibGVkIG9yIGRpc2FibGVkCisgKiBAcm10b2xsIENSMyAgICAgICAgICBUWEZUSUUgICAgICAgIExMX0xQVUFSVF9Jc0VuYWJsZWRJVF9UWEZUCisgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9MUFVBUlRfSXNFbmFibGVkSVRfVFhGVChjb25zdCBVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7CisgIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX1RYRlRJRSkgPT0gKFVTQVJUX0NSM19UWEZUSUUpKQorICAgICAgICAgICAgICA/IDFVTAorICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiBMUFVBUlQgUlggRklGTyBUaHJlc2hvbGQgSW50ZXJydXB0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQKKyAqIEBybXRvbGwgQ1IzICAgICAgICAgIFJYRlRJRSAgICAgICAgTExfTFBVQVJUX0lzRW5hYmxlZElUX1JYRlQKKyAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX0xQVUFSVF9Jc0VuYWJsZWRJVF9SWEZUKGNvbnN0IFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfUlhGVElFKSA9PSAoVVNBUlRfQ1IzX1JYRlRJRSkpCisgICAgICAgICAgICAgID8gMVVMCisgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX0VGX0RNQV9NYW5hZ2VtZW50IERNQV9NYW5hZ2VtZW50CisgKiBAeworICovCisKKy8qKgorICogQGJyaWVmICBFbmFibGUgRE1BIE1vZGUgZm9yIHJlY2VwdGlvbgorICogQHJtdG9sbCBDUjMgICAgICAgICAgRE1BUiAgICAgICAgICBMTF9MUFVBUlRfRW5hYmxlRE1BUmVxX1JYCisgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0VuYWJsZURNQVJlcV9SWChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7CisgIEFUT01JQ19TRVRfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBETUEgTW9kZSBmb3IgcmVjZXB0aW9uCisgKiBAcm10b2xsIENSMyAgICAgICAgICBETUFSICAgICAgICAgIExMX0xQVUFSVF9EaXNhYmxlRE1BUmVxX1JYCisgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0Rpc2FibGVETUFSZXFfUlgoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgeworICBBVE9NSUNfQ0xFQVJfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgRE1BIE1vZGUgaXMgZW5hYmxlZCBmb3IgcmVjZXB0aW9uCisgKiBAcm10b2xsIENSMyAgICAgICAgICBETUFSICAgICAgICAgIExMX0xQVUFSVF9Jc0VuYWJsZWRETUFSZXFfUlgKKyAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX0xQVUFSVF9Jc0VuYWJsZWRETUFSZXFfUlgoY29uc3QgVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgeworICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19ETUFSKSA9PSAoVVNBUlRfQ1IzX0RNQVIpKSA/IDFVTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgRE1BIE1vZGUgZm9yIHRyYW5zbWlzc2lvbgorICogQHJtdG9sbCBDUjMgICAgICAgICAgRE1BVCAgICAgICAgICBMTF9MUFVBUlRfRW5hYmxlRE1BUmVxX1RYCisgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0VuYWJsZURNQVJlcV9UWChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7CisgIEFUT01JQ19TRVRfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBETUEgTW9kZSBmb3IgdHJhbnNtaXNzaW9uCisgKiBAcm10b2xsIENSMyAgICAgICAgICBETUFUICAgICAgICAgIExMX0xQVUFSVF9EaXNhYmxlRE1BUmVxX1RYCisgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0Rpc2FibGVETUFSZXFfVFgoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgeworICBBVE9NSUNfQ0xFQVJfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgRE1BIE1vZGUgaXMgZW5hYmxlZCBmb3IgdHJhbnNtaXNzaW9uCisgKiBAcm10b2xsIENSMyAgICAgICAgICBETUFUICAgICAgICAgIExMX0xQVUFSVF9Jc0VuYWJsZWRETUFSZXFfVFgKKyAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX0xQVUFSVF9Jc0VuYWJsZWRETUFSZXFfVFgoY29uc3QgVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgeworICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19ETUFUKSA9PSAoVVNBUlRfQ1IzX0RNQVQpKSA/IDFVTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgRE1BIERpc2FibGluZyBvbiBSZWNlcHRpb24gRXJyb3IKKyAqIEBybXRvbGwgQ1IzICAgICAgICAgIEREUkUgICAgICAgICAgTExfTFBVQVJUX0VuYWJsZURNQURlYWN0T25SeEVycgorICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9FbmFibGVETUFEZWFjdE9uUnhFcnIoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgeworICBTRVRfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX0REUkUpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBETUEgRGlzYWJsaW5nIG9uIFJlY2VwdGlvbiBFcnJvcgorICogQHJtdG9sbCBDUjMgICAgICAgICAgRERSRSAgICAgICAgICBMTF9MUFVBUlRfRGlzYWJsZURNQURlYWN0T25SeEVycgorICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9EaXNhYmxlRE1BRGVhY3RPblJ4RXJyKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsKKyAgQ0xFQVJfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX0REUkUpOworfQorCisvKioKKyAqIEBicmllZiAgSW5kaWNhdGUgaWYgRE1BIERpc2FibGluZyBvbiBSZWNlcHRpb24gRXJyb3IgaXMgZGlzYWJsZWQKKyAqIEBybXRvbGwgQ1IzICAgICAgICAgIEREUkUgICAgICAgICAgTExfTFBVQVJUX0lzRW5hYmxlZERNQURlYWN0T25SeEVycgorICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfTFBVQVJUX0lzRW5hYmxlZERNQURlYWN0T25SeEVycihjb25zdCBVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7CisgIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX0REUkUpID09IChVU0FSVF9DUjNfRERSRSkpID8gMVVMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCB0aGUgTFBVQVJUIGRhdGEgcmVnaXN0ZXIgYWRkcmVzcyB1c2VkIGZvciBETUEgdHJhbnNmZXIKKyAqIEBybXRvbGwgUkRSICAgICAgICAgIFJEUiAgICAgICAgICAgTExfTFBVQVJUX0RNQV9HZXRSZWdBZGRyXG4KKyAqIEBybXRvbGwgVERSICAgICAgICAgIFREUiAgICAgICAgICAgTExfTFBVQVJUX0RNQV9HZXRSZWdBZGRyCisgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgKiBAcGFyYW0gIERpcmVjdGlvbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0RNQV9SRUdfREFUQV9UUkFOU01JVAorICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0RNQV9SRUdfREFUQV9SRUNFSVZFCisgKiBAcmV0dmFsIEFkZHJlc3Mgb2YgZGF0YSByZWdpc3RlcgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0RNQV9HZXRSZWdBZGRyKGNvbnN0IFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IERpcmVjdGlvbikgeworICB1aW50MzJfdCBkYXRhX3JlZ19hZGRyOworCisgIGlmIChEaXJlY3Rpb24gPT0gTExfTFBVQVJUX0RNQV9SRUdfREFUQV9UUkFOU01JVCkgeworICAgIC8qIHJldHVybiBhZGRyZXNzIG9mIFREUiByZWdpc3RlciAqLworICAgIGRhdGFfcmVnX2FkZHIgPSAodWludDMyX3QpICYgKExQVUFSVHgtPlREUik7CisgIH0gZWxzZSB7CisgICAgLyogcmV0dXJuIGFkZHJlc3Mgb2YgUkRSIHJlZ2lzdGVyICovCisgICAgZGF0YV9yZWdfYWRkciA9ICh1aW50MzJfdCkgJiAoTFBVQVJUeC0+UkRSKTsKKyAgfQorCisgIHJldHVybiBkYXRhX3JlZ19hZGRyOworfQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUZfRGF0YV9NYW5hZ2VtZW50IERhdGFfTWFuYWdlbWVudAorICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiAgUmVhZCBSZWNlaXZlciBEYXRhIHJlZ2lzdGVyIChSZWNlaXZlIERhdGEgdmFsdWUsIDggYml0cykKKyAqIEBybXRvbGwgUkRSICAgICAgICAgIFJEUiAgICAgICAgICAgTExfTFBVQVJUX1JlY2VpdmVEYXRhOAorICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHJldHZhbCBUaW1lIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDhfdCBMTF9MUFVBUlRfUmVjZWl2ZURhdGE4KGNvbnN0IFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsKKyAgcmV0dXJuICh1aW50OF90KShSRUFEX0JJVChMUFVBUlR4LT5SRFIsIFVTQVJUX1JEUl9SRFIpICYgMHhGRlUpOworfQorCisvKioKKyAqIEBicmllZiAgUmVhZCBSZWNlaXZlciBEYXRhIHJlZ2lzdGVyIChSZWNlaXZlIERhdGEgdmFsdWUsIDkgYml0cykKKyAqIEBybXRvbGwgUkRSICAgICAgICAgIFJEUiAgICAgICAgICAgTExfTFBVQVJUX1JlY2VpdmVEYXRhOQorICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICogQHJldHZhbCBUaW1lIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHgxRkYKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQxNl90IExMX0xQVUFSVF9SZWNlaXZlRGF0YTkoY29uc3QgVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgeworICByZXR1cm4gKHVpbnQxNl90KShSRUFEX0JJVChMUFVBUlR4LT5SRFIsIFVTQVJUX1JEUl9SRFIpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFdyaXRlIGluIFRyYW5zbWl0dGVyIERhdGEgUmVnaXN0ZXIgKFRyYW5zbWl0IERhdGEgdmFsdWUsIDggYml0cykKKyAqIEBybXRvbGwgVERSICAgICAgICAgIFREUiAgICAgICAgICAgTExfTFBVQVJUX1RyYW5zbWl0RGF0YTgKKyAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAqIEBwYXJhbSAgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEZGCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX1RyYW5zbWl0RGF0YTgoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgVmFsdWUpIHsKKyAgTFBVQVJUeC0+VERSID0gVmFsdWU7Cit9CisKKy8qKgorICogQGJyaWVmICBXcml0ZSBpbiBUcmFuc21pdHRlciBEYXRhIFJlZ2lzdGVyIChUcmFuc21pdCBEYXRhIHZhbHVlLCA5IGJpdHMpCisgKiBAcm10b2xsIFREUiAgICAgICAgICBURFIgICAgICAgICAgIExMX0xQVUFSVF9UcmFuc21pdERhdGE5CisgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgKiBAcGFyYW0gIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHgxRkYKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfVHJhbnNtaXREYXRhOShVU0FSVF9UeXBlRGVmICpMUFVBUlR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgVmFsdWUpIHsKKyAgTFBVQVJUeC0+VERSID0gVmFsdWUgJiAweDFGRlVMOworfQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUZfRXhlY3V0aW9uIEV4ZWN1dGlvbgorICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiAgUmVxdWVzdCBCcmVhayBzZW5kaW5nCisgKiBAcm10b2xsIFJRUiAgICAgICAgICBTQktSUSAgICAgICAgIExMX0xQVUFSVF9SZXF1ZXN0QnJlYWtTZW5kaW5nCisgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX1JlcXVlc3RCcmVha1NlbmRpbmcoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgeworICBTRVRfQklUKExQVUFSVHgtPlJRUiwgKHVpbnQxNl90KVVTQVJUX1JRUl9TQktSUSk7Cit9CisKKy8qKgorICogQGJyaWVmICBQdXQgTFBVQVJUIGluIG11dGUgbW9kZSBhbmQgc2V0IHRoZSBSV1UgZmxhZworICogQHJtdG9sbCBSUVIgICAgICAgICAgTU1SUSAgICAgICAgICBMTF9MUFVBUlRfUmVxdWVzdEVudGVyTXV0ZU1vZGUKKyAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfUmVxdWVzdEVudGVyTXV0ZU1vZGUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkgeworICBTRVRfQklUKExQVUFSVHgtPlJRUiwgKHVpbnQxNl90KVVTQVJUX1JRUl9NTVJRKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFJlcXVlc3QgYSBSZWNlaXZlIERhdGEgYW5kIEZJRk8gZmx1c2gKKyAqIEBub3RlICAgQWxsb3dzIHRvIGRpc2NhcmQgdGhlIHJlY2VpdmVkIGRhdGEgd2l0aG91dCByZWFkaW5nIHRoZW0sIGFuZCBhdm9pZAorICogYW4gb3ZlcnJ1biBjb25kaXRpb24uCisgKiBAcm10b2xsIFJRUiAgICAgICAgICBSWEZSUSAgICAgICAgIExMX0xQVUFSVF9SZXF1ZXN0UnhEYXRhRmx1c2gKKyAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfUmVxdWVzdFJ4RGF0YUZsdXNoKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpIHsKKyAgU0VUX0JJVChMUFVBUlR4LT5SUVIsICh1aW50MTZfdClVU0FSVF9SUVJfUlhGUlEpOworfQorCisvKioKKyAqIEBicmllZiAgUmVxdWVzdCBhIFRyYW5zbWl0IGRhdGEgRklGTyBmbHVzaAorICogQG5vdGUgICBUWEZSUSBiaXQgaXMgc2V0IHRvIGZsdXNoIHRoZSB3aG9sZSBGSUZPIHdoZW4gRklGTyBtb2RlIGlzIGVuYWJsZWQuCisgKiBUaGlzIGFsc28gc2V0cyB0aGUgZmxhZyBUWEZFIChUWEZJRk8gZW1wdHkgYml0IGluIHRoZSBMUFVBUlRfSVNSIHJlZ2lzdGVyKS4KKyAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9GSUZPX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvcgorICogbm90IEZJRk8gbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICogQHJtdG9sbCBSUVIgICAgICAgICAgVFhGUlEgICAgICAgICBMTF9MUFVBUlRfUmVxdWVzdFR4RGF0YUZsdXNoCisgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX1JlcXVlc3RUeERhdGFGbHVzaChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KSB7CisgIFNFVF9CSVQoTFBVQVJUeC0+UlFSLCAodWludDE2X3QpVVNBUlRfUlFSX1RYRlJRKTsKK30KKworLyoqCisgKiBAfQorICovCisKKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX0VGX0luaXQgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICogQHsKKyAqLworRXJyb3JTdGF0dXMgTExfTFBVQVJUX0RlSW5pdChjb25zdCBVU0FSVF9UeXBlRGVmICpMUFVBUlR4KTsKK0Vycm9yU3RhdHVzIExMX0xQVUFSVF9Jbml0KFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMTF9MUFVBUlRfSW5pdFR5cGVEZWYgKkxQVUFSVF9Jbml0U3RydWN0KTsKK3ZvaWQgTExfTFBVQVJUX1N0cnVjdEluaXQoTExfTFBVQVJUX0luaXRUeXBlRGVmICpMUFVBUlRfSW5pdFN0cnVjdCk7CisvKioKKyAqIEB9CisgKi8KKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisjZW5kaWYgLyogTFBVQVJUMSAqLworCisvKioKKyAqIEB9CisgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyRzR4eF9MTF9MUFVBUlRfSCAqLwpkaWZmIC0tZ2l0IGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfbGxfcHdyLmggYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9sbF9wd3IuaAppbmRleCBjOTc2ZWNiLi40NzRjYjE1IDEwMDY0NAotLS0gYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9sbF9wd3IuaAorKysgYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9sbF9wd3IuaApAQCAtMSwxNTI3ICsxLDE1MjkgQEAKLS8qKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBAZmlsZSAgICBzdG0zMmc0eHhfbGxfcHdyLmgNCi0gKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQ0KLSAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFBXUiBMTCBtb2R1bGUuDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEBhdHRlbnRpb24NCi0gKg0KLSAqIENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4NCi0gKg0KLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGVybXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZQ0KLSAqIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4NCi0gKiBJZiBubyBMSUNFTlNFIGZpbGUgY29tZXMgd2l0aCB0aGlzIHNvZnR3YXJlLCBpdCBpcyBwcm92aWRlZCBBUy1JUy4NCi0gKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKi8NCi0NCi0vKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpZm5kZWYgU1RNMzJHNHh4X0xMX1BXUl9IDQotI2RlZmluZSBTVE0zMkc0eHhfTExfUFdSX0gNCi0NCi0jaWZkZWYgX19jcGx1c3BsdXMNCi1leHRlcm4gIkMiIHsNCi0jZW5kaWYNCi0NCi0vKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpbmNsdWRlICJzdG0zMmc0eHguaCINCi0NCi0vKiogQGFkZHRvZ3JvdXAgU1RNMzJHNHh4X0xMX0RyaXZlcg0KLSAqIEB7DQotICovDQotDQotI2lmIGRlZmluZWQoUFdSKQ0KLQ0KLS8qKiBAZGVmZ3JvdXAgUFdSX0xMIFBXUg0KLSAqIEB7DQotICovDQotDQotLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLQ0KLS8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotDQotLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0NCi0vKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBkZWZncm91cCBQV1JfTExfRXhwb3J0ZWRfQ29uc3RhbnRzIFBXUiBFeHBvcnRlZCBDb25zdGFudHMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUFdSX0xMX0VDX0NMRUFSX0ZMQUcgQ2xlYXIgRmxhZ3MgRGVmaW5lcw0KLSAqIEBicmllZiAgICBGbGFncyBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfUFdSX1dyaXRlUmVnIGZ1bmN0aW9uDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1BXUl9TQ1JfQ1NCRiBQV1JfU0NSX0NTQkYNCi0jZGVmaW5lIExMX1BXUl9TQ1JfQ1dVRiBQV1JfU0NSX0NXVUYNCi0jZGVmaW5lIExMX1BXUl9TQ1JfQ1dVRjUgUFdSX1NDUl9DV1VGNQ0KLSNkZWZpbmUgTExfUFdSX1NDUl9DV1VGNCBQV1JfU0NSX0NXVUY0DQotI2RlZmluZSBMTF9QV1JfU0NSX0NXVUYzIFBXUl9TQ1JfQ1dVRjMNCi0jZGVmaW5lIExMX1BXUl9TQ1JfQ1dVRjIgUFdSX1NDUl9DV1VGMg0KLSNkZWZpbmUgTExfUFdSX1NDUl9DV1VGMSBQV1JfU0NSX0NXVUYxDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFBXUl9MTF9FQ19HRVRfRkxBRyBHZXQgRmxhZ3MgRGVmaW5lcw0KLSAqIEBicmllZiAgICBGbGFncyBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfUFdSX1JlYWRSZWcgZnVuY3Rpb24NCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfUFdSX1NSMV9XVUZJIFBXUl9TUjFfV1VGSQ0KLSNkZWZpbmUgTExfUFdSX1NSMV9TQkYgUFdSX1NSMV9TQkYNCi0jZGVmaW5lIExMX1BXUl9TUjFfV1VGNSBQV1JfU1IxX1dVRjUNCi0jZGVmaW5lIExMX1BXUl9TUjFfV1VGNCBQV1JfU1IxX1dVRjQNCi0jZGVmaW5lIExMX1BXUl9TUjFfV1VGMyBQV1JfU1IxX1dVRjMNCi0jZGVmaW5lIExMX1BXUl9TUjFfV1VGMiBQV1JfU1IxX1dVRjINCi0jZGVmaW5lIExMX1BXUl9TUjFfV1VGMSBQV1JfU1IxX1dVRjENCi0jaWYgZGVmaW5lZChQV1JfU1IyX1BWTU80KQ0KLSNkZWZpbmUgTExfUFdSX1NSMl9QVk1PNCBQV1JfU1IyX1BWTU80DQotI2VuZGlmIC8qIFBXUl9TUjJfUFZNTzQgKi8NCi0jaWYgZGVmaW5lZChQV1JfU1IyX1BWTU8zKQ0KLSNkZWZpbmUgTExfUFdSX1NSMl9QVk1PMyBQV1JfU1IyX1BWTU8zDQotI2VuZGlmIC8qIFBXUl9TUjJfUFZNTzMgKi8NCi0jaWYgZGVmaW5lZChQV1JfU1IyX1BWTU8yKQ0KLSNkZWZpbmUgTExfUFdSX1NSMl9QVk1PMiBQV1JfU1IyX1BWTU8yDQotI2VuZGlmIC8qIFBXUl9TUjJfUFZNTzIgKi8NCi0jaWYgZGVmaW5lZChQV1JfU1IyX1BWTU8xKQ0KLSNkZWZpbmUgTExfUFdSX1NSMl9QVk1PMSBQV1JfU1IyX1BWTU8xDQotI2VuZGlmIC8qIFBXUl9TUjJfUFZNTzEgKi8NCi0jZGVmaW5lIExMX1BXUl9TUjJfUFZETyBQV1JfU1IyX1BWRE8NCi0jZGVmaW5lIExMX1BXUl9TUjJfVk9TRiBQV1JfU1IyX1ZPU0YNCi0jZGVmaW5lIExMX1BXUl9TUjJfUkVHTFBGIFBXUl9TUjJfUkVHTFBGDQotI2RlZmluZSBMTF9QV1JfU1IyX1JFR0xQUyBQV1JfU1IyX1JFR0xQUw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBQV1JfTExfRUNfUkVHVV9WT0xUQUdFIFJFR1UgVk9MVEFHRQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9QV1JfUkVHVV9WT0xUQUdFX1NDQUxFMSAoUFdSX0NSMV9WT1NfMCkNCi0jZGVmaW5lIExMX1BXUl9SRUdVX1ZPTFRBR0VfU0NBTEUyIChQV1JfQ1IxX1ZPU18xKQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBQV1JfTExfRUNfTU9ERV9QV1IgTU9ERSBQV1INCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfUFdSX01PREVfU1RPUDAgKFBXUl9DUjFfTFBNU19TVE9QMCkNCi0jZGVmaW5lIExMX1BXUl9NT0RFX1NUT1AxIChQV1JfQ1IxX0xQTVNfU1RPUDEpDQotI2RlZmluZSBMTF9QV1JfTU9ERV9TVEFOREJZIChQV1JfQ1IxX0xQTVNfU1RBTkRCWSkNCi0jZGVmaW5lIExMX1BXUl9NT0RFX1NIVVRET1dOIChQV1JfQ1IxX0xQTVNfU0hVVERPV04pDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFBXUl9MTF9FQ19QVk1fVkREVVNCXzEgUGVyaXBoZXJhbCB2b2x0YWdlIG1vbml0b3JpbmcNCi0gKiBAew0KLSAqLw0KLSNpZiBkZWZpbmVkKFBXUl9DUjJfUFZNRTEpDQotI2RlZmluZSBMTF9QV1JfUFZNX1ZEREFfQ09NUCAoUFdSX0NSMl9QVk1FMSkgLyogTW9uaXRvcmluZyBWRERBIHZzLiB4LnhWICovDQotI2VuZGlmDQotI2lmIGRlZmluZWQoUFdSX0NSMl9QVk1FMikNCi0jZGVmaW5lIExMX1BXUl9QVk1fVkREQV9GQVNUREFDIChQV1JfQ1IyX1BWTUUyKSAvKiBNb25pdG9yaW5nIFZEREEgdnMuIHgueFYgKi8NCi0jZW5kaWYNCi0jaWYgZGVmaW5lZChQV1JfQ1IyX1BWTUUzKQ0KLSNkZWZpbmUgTExfUFdSX1BWTV9WRERBX0FEQyAoUFdSX0NSMl9QVk1FMykgLyogTW9uaXRvcmluZyBWRERBIHZzLiAxLjYyViAgKi8NCi0jZW5kaWYNCi0jaWYgZGVmaW5lZChQV1JfQ1IyX1BWTUU0KQ0KLSNkZWZpbmUgTExfUFdSX1BWTV9WRERBX09QQU1QX0RBQyBcDQotICAoUFdSX0NSMl9QVk1FNCkgLyogTW9uaXRvcmluZyBWRERBIHZzLiAxeC54ViAgICovDQotI2VuZGlmDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFBXUl9MTF9FQ19QVkRMRVZFTCBQVkRMRVZFTA0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9QV1JfUFZETEVWRUxfMCAoUFdSX0NSMl9QTFNfTEVWMCkgLyogVlBWRDAgYXJvdW5kIDIuMCBWICovDQotI2RlZmluZSBMTF9QV1JfUFZETEVWRUxfMSAoUFdSX0NSMl9QTFNfTEVWMSkgLyogVlBWRDEgYXJvdW5kIDIuMiBWICovDQotI2RlZmluZSBMTF9QV1JfUFZETEVWRUxfMiAoUFdSX0NSMl9QTFNfTEVWMikgLyogVlBWRDIgYXJvdW5kIDIuNCBWICovDQotI2RlZmluZSBMTF9QV1JfUFZETEVWRUxfMyAoUFdSX0NSMl9QTFNfTEVWMykgLyogVlBWRDMgYXJvdW5kIDIuNSBWICovDQotI2RlZmluZSBMTF9QV1JfUFZETEVWRUxfNCAoUFdSX0NSMl9QTFNfTEVWNCkgLyogVlBWRDQgYXJvdW5kIDIuNiBWICovDQotI2RlZmluZSBMTF9QV1JfUFZETEVWRUxfNSAoUFdSX0NSMl9QTFNfTEVWNSkgLyogVlBWRDUgYXJvdW5kIDIuOCBWICovDQotI2RlZmluZSBMTF9QV1JfUFZETEVWRUxfNiAoUFdSX0NSMl9QTFNfTEVWNikgLyogVlBWRDYgYXJvdW5kIDIuOSBWICovDQotI2RlZmluZSBMTF9QV1JfUFZETEVWRUxfNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChQV1JfQ1IyX1BMU19MRVY3KSAvKiBFeHRlcm5hbCBpbnB1dCBhbmFsb2cgdm9sdGFnZSAgIChDb21wYXJlIGludGVybmFsbHkgdG8gXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIFZSRUZJTlQpICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFBXUl9MTF9FQ19XQUtFVVAgV0FLRVVQDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1BXUl9XQUtFVVBfUElOMSAoUFdSX0NSM19FV1VQMSkNCi0jZGVmaW5lIExMX1BXUl9XQUtFVVBfUElOMiAoUFdSX0NSM19FV1VQMikNCi0jZGVmaW5lIExMX1BXUl9XQUtFVVBfUElOMyAoUFdSX0NSM19FV1VQMykNCi0jZGVmaW5lIExMX1BXUl9XQUtFVVBfUElONCAoUFdSX0NSM19FV1VQNCkNCi0jZGVmaW5lIExMX1BXUl9XQUtFVVBfUElONSAoUFdSX0NSM19FV1VQNSkNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUFdSX0xMX0VDX0JBVFRfQ0hBUkdfUkVTSVNUT1IgQkFUVCBDSEFSRyBSRVNJU1RPUg0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9QV1JfQkFUVF9DSEFSR19SRVNJU1RPUl81SyAoKHVpbnQzMl90KTB4MDAwMDAwMDApDQotI2RlZmluZSBMTF9QV1JfQkFUVF9DSEFSR1JFU0lTVE9SXzFfNUsgKFBXUl9DUjRfVkJSUykNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUFdSX0xMX0VDX0dQSU8gR1BJTw0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9QV1JfR1BJT19BICgodWludDMyX3QpKCYoUFdSLT5QVUNSQSkpKQ0KLSNkZWZpbmUgTExfUFdSX0dQSU9fQiAoKHVpbnQzMl90KSgmKFBXUi0+UFVDUkIpKSkNCi0jZGVmaW5lIExMX1BXUl9HUElPX0MgKCh1aW50MzJfdCkoJihQV1ItPlBVQ1JDKSkpDQotI2RlZmluZSBMTF9QV1JfR1BJT19EICgodWludDMyX3QpKCYoUFdSLT5QVUNSRCkpKQ0KLSNkZWZpbmUgTExfUFdSX0dQSU9fRSAoKHVpbnQzMl90KSgmKFBXUi0+UFVDUkUpKSkNCi0jZGVmaW5lIExMX1BXUl9HUElPX0YgKCh1aW50MzJfdCkoJihQV1ItPlBVQ1JGKSkpDQotI2RlZmluZSBMTF9QV1JfR1BJT19HICgodWludDMyX3QpKCYoUFdSLT5QVUNSRykpKQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBQV1JfTExfRUNfR1BJT19CSVQgR1BJTyBCSVQNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfUFdSX0dQSU9fQklUXzAgKCh1aW50MzJfdCkweDAwMDAwMDAxKQ0KLSNkZWZpbmUgTExfUFdSX0dQSU9fQklUXzEgKCh1aW50MzJfdCkweDAwMDAwMDAyKQ0KLSNkZWZpbmUgTExfUFdSX0dQSU9fQklUXzIgKCh1aW50MzJfdCkweDAwMDAwMDA0KQ0KLSNkZWZpbmUgTExfUFdSX0dQSU9fQklUXzMgKCh1aW50MzJfdCkweDAwMDAwMDA4KQ0KLSNkZWZpbmUgTExfUFdSX0dQSU9fQklUXzQgKCh1aW50MzJfdCkweDAwMDAwMDEwKQ0KLSNkZWZpbmUgTExfUFdSX0dQSU9fQklUXzUgKCh1aW50MzJfdCkweDAwMDAwMDIwKQ0KLSNkZWZpbmUgTExfUFdSX0dQSU9fQklUXzYgKCh1aW50MzJfdCkweDAwMDAwMDQwKQ0KLSNkZWZpbmUgTExfUFdSX0dQSU9fQklUXzcgKCh1aW50MzJfdCkweDAwMDAwMDgwKQ0KLSNkZWZpbmUgTExfUFdSX0dQSU9fQklUXzggKCh1aW50MzJfdCkweDAwMDAwMTAwKQ0KLSNkZWZpbmUgTExfUFdSX0dQSU9fQklUXzkgKCh1aW50MzJfdCkweDAwMDAwMjAwKQ0KLSNkZWZpbmUgTExfUFdSX0dQSU9fQklUXzEwICgodWludDMyX3QpMHgwMDAwMDQwMCkNCi0jZGVmaW5lIExMX1BXUl9HUElPX0JJVF8xMSAoKHVpbnQzMl90KTB4MDAwMDA4MDApDQotI2RlZmluZSBMTF9QV1JfR1BJT19CSVRfMTIgKCh1aW50MzJfdCkweDAwMDAxMDAwKQ0KLSNkZWZpbmUgTExfUFdSX0dQSU9fQklUXzEzICgodWludDMyX3QpMHgwMDAwMjAwMCkNCi0jZGVmaW5lIExMX1BXUl9HUElPX0JJVF8xNCAoKHVpbnQzMl90KTB4MDAwMDQwMDApDQotI2RlZmluZSBMTF9QV1JfR1BJT19CSVRfMTUgKCh1aW50MzJfdCkweDAwMDA4MDAwKQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgUFdSX0xMX0V4cG9ydGVkX01hY3JvcyBQV1IgRXhwb3J0ZWQgTWFjcm9zDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFBXUl9MTF9FTV9XUklURV9SRUFEIENvbW1vbiBXcml0ZSBhbmQgcmVhZCByZWdpc3RlcnMgTWFjcm9zDQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFdyaXRlIGEgdmFsdWUgaW4gUFdSIHJlZ2lzdGVyDQotICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHdyaXR0ZW4NCi0gKiBAcGFyYW0gIF9fVkFMVUVfXyBWYWx1ZSB0byBiZSB3cml0dGVuIGluIHRoZSByZWdpc3Rlcg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgTExfUFdSX1dyaXRlUmVnKF9fUkVHX18sIF9fVkFMVUVfXykgV1JJVEVfUkVHKFBXUi0+X19SRUdfXywgKF9fVkFMVUVfXykpDQotDQotLyoqDQotICogQGJyaWVmICBSZWFkIGEgdmFsdWUgaW4gUFdSIHJlZ2lzdGVyDQotICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHJlYWQNCi0gKiBAcmV0dmFsIFJlZ2lzdGVyIHZhbHVlDQotICovDQotI2RlZmluZSBMTF9QV1JfUmVhZFJlZyhfX1JFR19fKSBSRUFEX1JFRyhQV1ItPl9fUkVHX18pDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBkZWZncm91cCBQV1JfTExfRXhwb3J0ZWRfRnVuY3Rpb25zIFBXUiBFeHBvcnRlZCBGdW5jdGlvbnMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUFdSX0xMX0VGX0NvbmZpZ3VyYXRpb24gQ29uZmlndXJhdGlvbg0KLSAqIEB7DQotICovDQotDQotLyoqDQotICogQGJyaWVmICBTd2l0Y2ggdGhlIHJlZ3VsYXRvciBmcm9tIG1haW4gbW9kZSB0byBsb3ctcG93ZXIgbW9kZQ0KLSAqIEBybXRvbGwgQ1IxICAgICAgICAgIExQUiAgICAgICAgICAgTExfUFdSX0VuYWJsZUxvd1Bvd2VyUnVuTW9kZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9FbmFibGVMb3dQb3dlclJ1bk1vZGUodm9pZCkgew0KLSAgU0VUX0JJVChQV1ItPkNSMSwgUFdSX0NSMV9MUFIpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFN3aXRjaCB0aGUgcmVndWxhdG9yIGZyb20gbG93LXBvd2VyIG1vZGUgdG8gbWFpbiBtb2RlDQotICogQHJtdG9sbCBDUjEgICAgICAgICAgTFBSICAgICAgICAgICBMTF9QV1JfRGlzYWJsZUxvd1Bvd2VyUnVuTW9kZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9EaXNhYmxlTG93UG93ZXJSdW5Nb2RlKHZvaWQpIHsNCi0gIENMRUFSX0JJVChQV1ItPkNSMSwgUFdSX0NSMV9MUFIpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIGlmIHRoZSByZWd1bGF0b3IgaXMgaW4gbG93LXBvd2VyIG1vZGUNCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBMUFIgICAgICAgICAgIExMX1BXUl9Jc0VuYWJsZWRMb3dQb3dlclJ1bk1vZGUNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUFdSX0lzRW5hYmxlZExvd1Bvd2VyUnVuTW9kZSh2b2lkKSB7DQotICB1aW50MzJfdCB0ZW1wOw0KLSAgdGVtcCA9IFJFQURfQklUKFBXUi0+Q1IxLCBQV1JfQ1IxX0xQUik7DQotDQotICByZXR1cm4gKCh0ZW1wID09IChQV1JfQ1IxX0xQUikpID8gMVUgOiAwVSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU3dpdGNoIGZyb20gcnVuIG1haW4gbW9kZSB0byBydW4gbG93LXBvd2VyIG1vZGUuDQotICogQHJtdG9sbCBDUjEgICAgICAgICAgTFBSICAgICAgICAgICBMTF9QV1JfRW50ZXJMb3dQb3dlclJ1bk1vZGUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRW50ZXJMb3dQb3dlclJ1bk1vZGUodm9pZCkgew0KLSAgTExfUFdSX0VuYWJsZUxvd1Bvd2VyUnVuTW9kZSgpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFN3aXRjaCBmcm9tIHJ1biBtYWluIG1vZGUgdG8gbG93LXBvd2VyIG1vZGUuDQotICogQHJtdG9sbCBDUjEgICAgICAgICAgTFBSICAgICAgICAgICBMTF9QV1JfRXhpdExvd1Bvd2VyUnVuTW9kZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9FeGl0TG93UG93ZXJSdW5Nb2RlKHZvaWQpIHsNCi0gIExMX1BXUl9EaXNhYmxlTG93UG93ZXJSdW5Nb2RlKCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IHRoZSBtYWluIGludGVybmFsIHJlZ3VsYXRvciBvdXRwdXQgdm9sdGFnZQ0KLSAqIEBybXRvbGwgQ1IxICAgICAgICAgIFZPUyAgICAgICAgICAgTExfUFdSX1NldFJlZ3VsVm9sdGFnZVNjYWxpbmcNCi0gKiBAcGFyYW0gIFZvbHRhZ2VTY2FsaW5nIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1JFR1VfVk9MVEFHRV9TQ0FMRTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUkVHVV9WT0xUQUdFX1NDQUxFMg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9TZXRSZWd1bFZvbHRhZ2VTY2FsaW5nKHVpbnQzMl90IFZvbHRhZ2VTY2FsaW5nKSB7DQotICBNT0RJRllfUkVHKFBXUi0+Q1IxLCBQV1JfQ1IxX1ZPUywgVm9sdGFnZVNjYWxpbmcpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCB0aGUgbWFpbiBpbnRlcm5hbCByZWd1bGF0b3Igb3V0cHV0IHZvbHRhZ2UNCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBWT1MgICAgICAgICAgIExMX1BXUl9HZXRSZWd1bFZvbHRhZ2VTY2FsaW5nDQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9SRUdVX1ZPTFRBR0VfU0NBTEUxDQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1JFR1VfVk9MVEFHRV9TQ0FMRTINCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUFdSX0dldFJlZ3VsVm9sdGFnZVNjYWxpbmcodm9pZCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUFdSLT5DUjEsIFBXUl9DUjFfVk9TKSk7DQotfQ0KLQ0KLSNpZiBkZWZpbmVkKFBXUl9DUjVfUjFNT0RFKQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIG1haW4gcmVndWxhdG9yIHZvbHRhZ2UgcmFuZ2UgMSBib29zdCBtb2RlDQotICogQHJtdG9sbCBDUjUgICAgICAgICAgUjFNT0RFICAgICAgICBMTF9QV1JfRW5hYmxlUmFuZ2UxQm9vc3RNb2RlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0VuYWJsZVJhbmdlMUJvb3N0TW9kZSh2b2lkKSB7DQotICBDTEVBUl9CSVQoUFdSLT5DUjUsIFBXUl9DUjVfUjFNT0RFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIG1haW4gcmVndWxhdG9yIHZvbHRhZ2UgcmFuZ2UgMSBib29zdCBtb2RlDQotICogQHJtdG9sbCBDUjUgICAgICAgICAgUjFNT0RFICAgICAgICBMTF9QV1JfRGlzYWJsZVJhbmdlMUJvb3N0TW9kZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9EaXNhYmxlUmFuZ2UxQm9vc3RNb2RlKHZvaWQpIHsNCi0gIFNFVF9CSVQoUFdSLT5DUjUsIFBXUl9DUjVfUjFNT0RFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiB0aGUgbWFpbiByZWd1bGF0b3Igdm9sdGFnZSByYW5nZSAxIGJvb3N0IG1vZGUgaXMgZW5hYmxlZA0KLSAqIEBybXRvbGwgQ1I1ICAgICAgICAgIFIxTU9ERSAgICAgICAgTExfUFdSX0lzRW5hYmxlZFJhbmdlMUJvb3N0TW9kZQ0KLSAqIEByZXR2YWwgSW52ZXJ0ZWQgc3RhdGUgb2YgYml0ICgwIG9yIDEpLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfSXNFbmFibGVkUmFuZ2UxQm9vc3RNb2RlKHZvaWQpIHsNCi0gIHVpbnQzMl90IHRlbXA7DQotICB0ZW1wID0gUkVBRF9CSVQoUFdSLT5DUjUsIFBXUl9DUjVfUjFNT0RFKTsNCi0NCi0gIHJldHVybiAoKHRlbXAgPT0gKDBVKSkgPyAxVSA6IDBVKTsNCi19DQotI2VuZGlmIC8qIFBXUl9DUjVfUjFNT0RFICovDQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgYWNjZXNzIHRvIHRoZSBiYWNrdXAgZG9tYWluDQotICogQHJtdG9sbCBDUjEgICAgICAgICAgREJQICAgICAgICAgICBMTF9QV1JfRW5hYmxlQmtVcEFjY2Vzcw0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9FbmFibGVCa1VwQWNjZXNzKHZvaWQpIHsNCi0gIFNFVF9CSVQoUFdSLT5DUjEsIFBXUl9DUjFfREJQKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIGFjY2VzcyB0byB0aGUgYmFja3VwIGRvbWFpbg0KLSAqIEBybXRvbGwgQ1IxICAgICAgICAgIERCUCAgICAgICAgICAgTExfUFdSX0Rpc2FibGVCa1VwQWNjZXNzDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0Rpc2FibGVCa1VwQWNjZXNzKHZvaWQpIHsNCi0gIENMRUFSX0JJVChQV1ItPkNSMSwgUFdSX0NSMV9EQlApOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBiYWNrdXAgZG9tYWluIGlzIGVuYWJsZWQNCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBEQlAgICAgICAgICAgIExMX1BXUl9Jc0VuYWJsZWRCa1VwQWNjZXNzDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0VuYWJsZWRCa1VwQWNjZXNzKHZvaWQpIHsNCi0gIHVpbnQzMl90IHRlbXA7DQotICB0ZW1wID0gUkVBRF9CSVQoUFdSLT5DUjEsIFBXUl9DUjFfREJQKTsNCi0NCi0gIHJldHVybiAoKHRlbXAgPT0gKFBXUl9DUjFfREJQKSkgPyAxVSA6IDBVKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZXQgTG93LVBvd2VyIG1vZGUNCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBMUE1TICAgICAgICAgIExMX1BXUl9TZXRQb3dlck1vZGUNCi0gKiBAcGFyYW0gIExvd1Bvd2VyTW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9NT0RFX1NUT1AwDQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX01PREVfU1RPUDENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfTU9ERV9TVEFOREJZDQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX01PREVfU0hVVERPV04NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfU2V0UG93ZXJNb2RlKHVpbnQzMl90IExvd1Bvd2VyTW9kZSkgew0KLSAgTU9ESUZZX1JFRyhQV1ItPkNSMSwgUFdSX0NSMV9MUE1TLCBMb3dQb3dlck1vZGUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBMb3ctUG93ZXIgbW9kZQ0KLSAqIEBybXRvbGwgQ1IxICAgICAgICAgIExQTVMgICAgICAgICAgTExfUFdSX0dldFBvd2VyTW9kZQ0KLSAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfTU9ERV9TVE9QMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9NT0RFX1NUT1AxDQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX01PREVfU1RBTkRCWQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9NT0RFX1NIVVRET1dODQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9HZXRQb3dlck1vZGUodm9pZCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUFdSLT5DUjEsIFBXUl9DUjFfTFBNUykpOw0KLX0NCi0NCi0jaWYgZGVmaW5lZChQV1JfQ1IzX1VDUERfU1REQlkpDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgdGhlIFVTQiBUeXBlLUMgYW5kIFBvd2VyIERlbGl2ZXJ5IG1lbW9yaXphdGlvbiBpbiBTdGFuZGJ5DQotICogbW9kZS4NCi0gKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQganVzdCBiZWZvcmUgZW50ZXJpbmcgU3RhbmRieSBtb2RlLg0KLSAqIEBybXRvbGwgQ1IzICAgICAgICAgIFVDUERfU1REQlkgICAgTExfUFdSX0VuYWJsZVVDUERTdGFuZGJ5TW9kZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9FbmFibGVVQ1BEU3RhbmRieU1vZGUodm9pZCkgew0KLSAgU0VUX0JJVChQV1ItPkNSMywgUFdSX0NSM19VQ1BEX1NUREJZKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIHRoZSBVU0IgVHlwZS1DIGFuZCBQb3dlciBEZWxpdmVyeSBtZW1vcml6YXRpb24gaW4gU3RhbmRieQ0KLSAqIG1vZGUuDQotICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGFmdGVyIGV4aXRpbmcgU3RhbmRieSBtb2RlIGFuZCBiZWZvcmUNCi0gKiBhbnkgVUNQRCBjb25maWd1cmF0aW9uIHVwZGF0ZS4NCi0gKiBAcm10b2xsIENSMyAgICAgICAgICBVQ1BEX1NUREJZICAgICBMTF9QV1JfRGlzYWJsZVVDUERTdGFuZGJ5TW9kZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9EaXNhYmxlVUNQRFN0YW5kYnlNb2RlKHZvaWQpIHsNCi0gIENMRUFSX0JJVChQV1ItPkNSMywgUFdSX0NSM19VQ1BEX1NUREJZKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayB0aGUgVVNCIFR5cGUtQyBhbmQgUG93ZXIgRGVsaXZlcnkgU3RhbmRieSBtb2RlIG1lbW9yaXphdGlvbg0KLSAqIHN0YXRlLg0KLSAqIEBybXRvbGwgQ1IzICAgICAgICAgIFVDUERfU1REQlkgICAgICAgICAgIExMX1BXUl9Jc0VuYWJsZWRVQ1BEU3RhbmRieU1vZGUNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUFdSX0lzRW5hYmxlZFVDUERTdGFuZGJ5TW9kZSh2b2lkKSB7DQotICByZXR1cm4gKChSRUFEX0JJVChQV1ItPkNSMywgUFdSX0NSM19VQ1BEX1NUREJZKSA9PSAoUFdSX0NSM19VQ1BEX1NUREJZKSkNCi0gICAgICAgICAgICAgID8gMVVMDQotICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLSNlbmRpZiAvKiBQV1JfQ1IzX1VDUERfU1REQlkgKi8NCi0NCi0jaWYgZGVmaW5lZChQV1JfQ1IzX1VDUERfREJESVMpDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgdGhlIFVTQiBUeXBlLUMgYW5kIHBvd2VyIGRlbGl2ZXJ5IGRlYWQgYmF0dGVyeSBwdWxsLWRvd24NCi0gKiBiZWhhdmlvciBvbiBVQ1BEIENDMSBhbmQgQ0MyIHBpbnMuDQotICogQG5vdGUgICBBZnRlciBleGl0aW5nIHJlc2V0LCB0aGUgVVNCIFR5cGUtQyBkZWFkIGJhdHRlcnkgYmVoYXZpb3IgaXMgZW5hYmxlZCwNCi0gKiAgICAgICAgIHdoaWNoIG1heSBoYXZlIGEgcHVsbC1kb3duIGVmZmVjdCBvbiBDQzEgYW5kIENDMiBwaW5zLiBJdCBpcw0KLSAqIHJlY29tbWVuZGVkIHRvIGRpc2FibGUgaXQgaW4gYWxsIGNhc2VzLCBlaXRoZXIgdG8gc3RvcCB0aGlzIHB1bGwtZG93biBvciB0bw0KLSAqIGhhbmQgb3ZlciBjb250cm9sIHRvIHRoZSBVQ1BEICh3aGljaCBzaG91bGQgdGhlcmVmb3JlIGJlIGluaXRpYWxpemVkIGJlZm9yZQ0KLSAqIGRvaW5nIHRoZSBkaXNhYmxlKS4NCi0gKiBAcm10b2xsIENSMyAgICAgICAgICBVQ1BEX0RCRElTICAgICAgICAgICBMTF9QV1JfRW5hYmxlVUNQRERlYWRCYXR0ZXJ5DQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0VuYWJsZVVDUEREZWFkQmF0dGVyeSh2b2lkKSB7DQotICBDTEVBUl9CSVQoUFdSLT5DUjMsIFBXUl9DUjNfVUNQRF9EQkRJUyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSB0aGUgVVNCIFR5cGUtQyBhbmQgcG93ZXIgZGVsaXZlcnkgZGVhZCBiYXR0ZXJ5IHB1bGwtZG93bg0KLSAqIGJlaGF2aW9yIG9uIFVDUEQgQ0MxIGFuZCBDQzIgcGlucy4NCi0gKiBAbm90ZSAgIEFmdGVyIGV4aXRpbmcgcmVzZXQsIHRoZSBVU0IgVHlwZS1DIGRlYWQgYmF0dGVyeSBiZWhhdmlvciBpcyBlbmFibGVkLA0KLSAqICAgICAgICAgd2hpY2ggbWF5IGhhdmUgYSBwdWxsLWRvd24gZWZmZWN0IG9uIENDMSBhbmQgQ0MyIHBpbnMuIEl0IGlzDQotICogcmVjb21tZW5kZWQgdG8gZGlzYWJsZSBpdCBpbiBhbGwgY2FzZXMsIGVpdGhlciB0byBzdG9wIHRoaXMgcHVsbC1kb3duIG9yIHRvDQotICogaGFuZCBvdmVyIGNvbnRyb2wgdG8gdGhlIFVDUEQgKHdoaWNoIHNob3VsZCB0aGVyZWZvcmUgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlDQotICogZG9pbmcgdGhlIGRpc2FibGUpLg0KLSAqIEBybXRvbGwgQ1IzICAgICAgICAgIFVDUERfREJESVMgICAgICAgICAgIExMX1BXUl9EaXNhYmxlVUNQRERlYWRCYXR0ZXJ5DQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0Rpc2FibGVVQ1BERGVhZEJhdHRlcnkodm9pZCkgew0KLSAgU0VUX0JJVChQV1ItPkNSMywgUFdSX0NSM19VQ1BEX0RCRElTKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayB0aGUgVVNCIFR5cGUtQyBhbmQgcG93ZXIgZGVsaXZlcnkgZGVhZCBiYXR0ZXJ5IHB1bGwtZG93bg0KLSAqIGJlaGF2aW9yIG9uIFVDUEQgQ0MxIGFuZCBDQzIgcGlucy4NCi0gKiBAbm90ZSAgIEFmdGVyIGV4aXRpbmcgcmVzZXQsIHRoZSBVU0IgVHlwZS1DIGRlYWQgYmF0dGVyeSBiZWhhdmlvciBpcyBlbmFibGVkLA0KLSAqICAgICAgICAgd2hpY2ggbWF5IGhhdmUgYSBwdWxsLWRvd24gZWZmZWN0IG9uIENDMSBhbmQgQ0MyIHBpbnMuIEl0IGlzDQotICogcmVjb21tZW5kZWQgdG8gZGlzYWJsZSBpdCBpbiBhbGwgY2FzZXMsIGVpdGhlciB0byBzdG9wIHRoaXMgcHVsbC1kb3duIG9yIHRvDQotICogaGFuZCBvdmVyIGNvbnRyb2wgdG8gdGhlIFVDUEQgKHdoaWNoIHNob3VsZCB0aGVyZWZvcmUgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlDQotICogZG9pbmcgdGhlIGRpc2FibGUpLg0KLSAqIEBybXRvbGwgQ1IzICAgICAgICAgIFVDUERfREJESVMgICAgICAgICAgIExMX1BXUl9Jc0VuYWJsZWRVQ1BERGVhZEJhdHRlcnkNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGZlYXR1cmUgKDEgOiBlbmFibGVkOyAwIDogZGlzYWJsZWQpLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfSXNFbmFibGVkVUNQRERlYWRCYXR0ZXJ5KHZvaWQpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFBXUi0+Q1IzLCBQV1JfQ1IzX1VDUERfREJESVMpID09IChQV1JfQ1IzX1VDUERfREJESVMpKQ0KLSAgICAgICAgICAgICAgPyAwVUwNCi0gICAgICAgICAgICAgIDogMVVMKTsNCi19DQotI2VuZGlmIC8qIFBXUl9DUjNfVUNQRF9EQkRJUyAqLw0KLQ0KLSNpZiBkZWZpbmVkKFBXUl9DUjJfVVNWKQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIFZERFVTQiBzdXBwbHkNCi0gKiBAcm10b2xsIENSMiAgICAgICAgICBVU1YgICAgICAgICAgIExMX1BXUl9FbmFibGVWZGRVU0INCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRW5hYmxlVmRkVVNCKHZvaWQpIHsNCi0gIFNFVF9CSVQoUFdSLT5DUjIsIFBXUl9DUjJfVVNWKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIFZERFVTQiBzdXBwbHkNCi0gKiBAcm10b2xsIENSMiAgICAgICAgICBVU1YgICAgICAgICAgIExMX1BXUl9EaXNhYmxlVmRkVVNCDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0Rpc2FibGVWZGRVU0Iodm9pZCkgew0KLSAgQ0xFQVJfQklUKFBXUi0+Q1IyLCBQV1JfQ1IyX1VTVik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgVkREVVNCIHN1cHBseSBpcyBlbmFibGVkDQotICogQHJtdG9sbCBDUjIgICAgICAgICAgVVNWICAgICAgICAgICBMTF9QV1JfSXNFbmFibGVkVmRkVVNCDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0VuYWJsZWRWZGRVU0Iodm9pZCkgew0KLSAgdWludDMyX3QgdGVtcDsNCi0gIHRlbXAgPSBSRUFEX0JJVChQV1ItPkNSMiwgUFdSX0NSMl9VU1YpOw0KLQ0KLSAgcmV0dXJuICgodGVtcCA9PSAoUFdSX0NSMl9VU1YpKSA/IDFVIDogMFUpOw0KLX0NCi0jZW5kaWYNCi0NCi0jaWYgZGVmaW5lZChQV1JfQ1IyX0lPU1YpDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgVkRESU8yIHN1cHBseQ0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgIElPU1YgICAgICAgICAgTExfUFdSX0VuYWJsZVZkZElPMg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9FbmFibGVWZGRJTzIodm9pZCkgew0KLSAgU0VUX0JJVChQV1ItPkNSMiwgUFdSX0NSMl9JT1NWKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIFZERElPMiBzdXBwbHkNCi0gKiBAcm10b2xsIENSMiAgICAgICAgICBJT1NWICAgICAgICAgIExMX1BXUl9EaXNhYmxlVmRkSU8yDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0Rpc2FibGVWZGRJTzIodm9pZCkgew0KLSAgQ0xFQVJfQklUKFBXUi0+Q1IyLCBQV1JfQ1IyX0lPU1YpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIGlmIFZERElPMiBzdXBwbHkgaXMgZW5hYmxlZA0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgIElPU1YgICAgICAgICAgTExfUFdSX0lzRW5hYmxlZFZkZElPMg0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfSXNFbmFibGVkVmRkSU8yKHZvaWQpIHsNCi0gIHVpbnQzMl90IHRlbXA7DQotICB0ZW1wID0gUkVBRF9CSVQoUFdSLT5DUjIsIFBXUl9DUjJfSU9TVik7DQotDQotICByZXR1cm4gKCh0ZW1wID09IChQV1JfQ1IyX0lPU1YpKSA/IDFVIDogMFUpOw0KLX0NCi0jZW5kaWYNCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSB0aGUgUG93ZXIgVm9sdGFnZSBNb25pdG9yaW5nIG9uIGEgcGVyaXBoZXJhbA0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgIFBWTUUxICAgICAgICAgTExfUFdSX0VuYWJsZVBWTVxuDQotICogICAgICAgICBDUjIgICAgICAgICAgUFZNRTIgICAgICAgICBMTF9QV1JfRW5hYmxlUFZNXG4NCi0gKiAgICAgICAgIENSMiAgICAgICAgICBQVk1FMyAgICAgICAgIExMX1BXUl9FbmFibGVQVk1cbg0KLSAqICAgICAgICAgQ1IyICAgICAgICAgIFBWTUU0ICAgICAgICAgTExfUFdSX0VuYWJsZVBWTQ0KLSAqIEBwYXJhbSAgUGVyaXBoVm9sdGFnZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9QVk1fVkREQV9DT01QICAgICAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZNX1ZEREFfRkFTVERBQyAgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1BWTV9WRERBX0FEQw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9QVk1fVkREQV9PUEFNUF9EQUMNCi0gKg0KLSAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0VuYWJsZVBWTSh1aW50MzJfdCBQZXJpcGhWb2x0YWdlKSB7DQotICBTRVRfQklUKFBXUi0+Q1IyLCBQZXJpcGhWb2x0YWdlKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIHRoZSBQb3dlciBWb2x0YWdlIE1vbml0b3Jpbmcgb24gYSBwZXJpcGhlcmFsDQotICogQHJtdG9sbCBDUjIgICAgICAgICAgUFZNRTEgICAgICAgICBMTF9QV1JfRGlzYWJsZVBWTVxuDQotICogICAgICAgICBDUjIgICAgICAgICAgUFZNRTIgICAgICAgICBMTF9QV1JfRGlzYWJsZVBWTVxuDQotICogICAgICAgICBDUjIgICAgICAgICAgUFZNRTMgICAgICAgICBMTF9QV1JfRGlzYWJsZVBWTVxuDQotICogICAgICAgICBDUjIgICAgICAgICAgUFZNRTQgICAgICAgICBMTF9QV1JfRGlzYWJsZVBWTQ0KLSAqIEBwYXJhbSAgUGVyaXBoVm9sdGFnZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9QVk1fVkREQV9DT01QICAgICAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZNX1ZEREFfRkFTVERBQyAgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1BWTV9WRERBX0FEQw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9QVk1fVkREQV9PUEFNUF9EQUMNCi0gKg0KLSAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0Rpc2FibGVQVk0odWludDMyX3QgUGVyaXBoVm9sdGFnZSkgew0KLSAgQ0xFQVJfQklUKFBXUi0+Q1IyLCBQZXJpcGhWb2x0YWdlKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiBQb3dlciBWb2x0YWdlIE1vbml0b3JpbmcgaXMgZW5hYmxlZCBvbiBhIHBlcmlwaGVyYWwNCi0gKiBAcm10b2xsIENSMiAgICAgICAgICBQVk1FMSAgICAgICAgIExMX1BXUl9Jc0VuYWJsZWRQVk1cbg0KLSAqICAgICAgICAgQ1IyICAgICAgICAgIFBWTUUyICAgICAgICAgTExfUFdSX0lzRW5hYmxlZFBWTVxuDQotICogICAgICAgICBDUjIgICAgICAgICAgUFZNRTMgICAgICAgICBMTF9QV1JfSXNFbmFibGVkUFZNXG4NCi0gKiAgICAgICAgIENSMiAgICAgICAgICBQVk1FNCAgICAgICAgIExMX1BXUl9Jc0VuYWJsZWRQVk0NCi0gKiBAcGFyYW0gIFBlcmlwaFZvbHRhZ2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZNX1ZEREFfQ09NUCAgICAgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1BWTV9WRERBX0ZBU1REQUMgICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9QVk1fVkREQV9BREMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZNX1ZEREFfT1BBTVBfREFDDQotICoNCi0gKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcw0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfSXNFbmFibGVkUFZNKHVpbnQzMl90IFBlcmlwaFZvbHRhZ2UpIHsNCi0gIHVpbnQzMl90IHRlbXA7DQotICB0ZW1wID0gUkVBRF9CSVQoUFdSLT5DUjIsIFBlcmlwaFZvbHRhZ2UpOw0KLQ0KLSAgcmV0dXJuICgodGVtcCA9PSAoUGVyaXBoVm9sdGFnZSkpID8gMVUgOiAwVSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ29uZmlndXJlIHRoZSB2b2x0YWdlIHRocmVzaG9sZCBkZXRlY3RlZCBieSB0aGUgUG93ZXIgVm9sdGFnZQ0KLSAqIERldGVjdG9yDQotICogQHJtdG9sbCBDUjIgICAgICAgICAgUExTICAgICAgICAgICBMTF9QV1JfU2V0UFZETGV2ZWwNCi0gKiBAcGFyYW0gIFBWRExldmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1BWRExFVkVMXzANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZETEVWRUxfMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9QVkRMRVZFTF8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1BWRExFVkVMXzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZETEVWRUxfNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9QVkRMRVZFTF81DQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1BWRExFVkVMXzYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZETEVWRUxfNw0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9TZXRQVkRMZXZlbCh1aW50MzJfdCBQVkRMZXZlbCkgew0KLSAgTU9ESUZZX1JFRyhQV1ItPkNSMiwgUFdSX0NSMl9QTFMsIFBWRExldmVsKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgdGhlIHZvbHRhZ2UgdGhyZXNob2xkIGRldGVjdGlvbg0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgIFBMUyAgICAgICAgICAgTExfUFdSX0dldFBWRExldmVsDQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9QVkRMRVZFTF8wDQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1BWRExFVkVMXzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZETEVWRUxfMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9QVkRMRVZFTF8zDQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1BWRExFVkVMXzQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZETEVWRUxfNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9QVkRMRVZFTF82DQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1BWRExFVkVMXzcNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUFdSX0dldFBWRExldmVsKHZvaWQpIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFBXUi0+Q1IyLCBQV1JfQ1IyX1BMUykpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSBQb3dlciBWb2x0YWdlIERldGVjdG9yDQotICogQHJtdG9sbCBDUjIgICAgICAgICAgUFZERSAgICAgICAgICBMTF9QV1JfRW5hYmxlUFZEDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0VuYWJsZVBWRCh2b2lkKSB7IFNFVF9CSVQoUFdSLT5DUjIsIFBXUl9DUjJfUFZERSk7IH0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgUG93ZXIgVm9sdGFnZSBEZXRlY3Rvcg0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgIFBWREUgICAgICAgICAgTExfUFdSX0Rpc2FibGVQVkQNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRGlzYWJsZVBWRCh2b2lkKSB7DQotICBDTEVBUl9CSVQoUFdSLT5DUjIsIFBXUl9DUjJfUFZERSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgUG93ZXIgVm9sdGFnZSBEZXRlY3RvciBpcyBlbmFibGVkDQotICogQHJtdG9sbCBDUjIgICAgICAgICAgUFZERSAgICAgICAgICBMTF9QV1JfSXNFbmFibGVkUFZEDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0VuYWJsZWRQVkQodm9pZCkgew0KLSAgdWludDMyX3QgdGVtcDsNCi0gIHRlbXAgPSBSRUFEX0JJVChQV1ItPkNSMiwgUFdSX0NSMl9QVkRFKTsNCi0NCi0gIHJldHVybiAoKHRlbXAgPT0gKFBXUl9DUjJfUFZERSkpID8gMVUgOiAwVSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIEludGVybmFsIFdha2UtdXAgbGluZQ0KLSAqIEBybXRvbGwgQ1IzICAgICAgICAgIEVJV0YgICAgICAgICAgTExfUFdSX0VuYWJsZUludGVybldVDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0VuYWJsZUludGVybldVKHZvaWQpIHsNCi0gIFNFVF9CSVQoUFdSLT5DUjMsIFBXUl9DUjNfRUlXRik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBJbnRlcm5hbCBXYWtlLXVwIGxpbmUNCi0gKiBAcm10b2xsIENSMyAgICAgICAgICBFSVdGICAgICAgICAgIExMX1BXUl9EaXNhYmxlSW50ZXJuV1UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRGlzYWJsZUludGVybldVKHZvaWQpIHsNCi0gIENMRUFSX0JJVChQV1ItPkNSMywgUFdSX0NSM19FSVdGKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiBJbnRlcm5hbCBXYWtlLXVwIGxpbmUgaXMgZW5hYmxlZA0KLSAqIEBybXRvbGwgQ1IzICAgICAgICAgIEVJV0YgICAgICAgICAgTExfUFdSX0lzRW5hYmxlZEludGVybldVDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0VuYWJsZWRJbnRlcm5XVSh2b2lkKSB7DQotICByZXR1cm4gKChSRUFEX0JJVChQV1ItPkNSMywgUFdSX0NSM19FSVdGKSA9PSAoUFdSX0NSM19FSVdGKSkgPyAxVUwgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSBwdWxsLXVwIGFuZCBwdWxsLWRvd24gY29uZmlndXJhdGlvbg0KLSAqIEBybXRvbGwgQ1IzICAgICAgICAgIEFQQyAgICAgICAgICAgTExfUFdSX0VuYWJsZVBVUERDZmcNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRW5hYmxlUFVQRENmZyh2b2lkKSB7DQotICBTRVRfQklUKFBXUi0+Q1IzLCBQV1JfQ1IzX0FQQyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBwdWxsLXVwIGFuZCBwdWxsLWRvd24gY29uZmlndXJhdGlvbg0KLSAqIEBybXRvbGwgQ1IzICAgICAgICAgIEFQQyAgICAgICAgICAgTExfUFdSX0Rpc2FibGVQVVBEQ2ZnDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0Rpc2FibGVQVVBEQ2ZnKHZvaWQpIHsNCi0gIENMRUFSX0JJVChQV1ItPkNSMywgUFdSX0NSM19BUEMpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIGlmIHB1bGwtdXAgYW5kIHB1bGwtZG93biBjb25maWd1cmF0aW9uICBpcyBlbmFibGVkDQotICogQHJtdG9sbCBDUjMgICAgICAgICAgQVBDICAgICAgICAgICBMTF9QV1JfSXNFbmFibGVkUFVQRENmZw0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfSXNFbmFibGVkUFVQRENmZyh2b2lkKSB7DQotICB1aW50MzJfdCB0ZW1wOw0KLSAgdGVtcCA9IFJFQURfQklUKFBXUi0+Q1IzLCBQV1JfQ1IzX0FQQyk7DQotDQotICByZXR1cm4gKCh0ZW1wID09IChQV1JfQ1IzX0FQQykpID8gMVUgOiAwVSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIFNSQU0yIGNvbnRlbnQgcmV0ZW50aW9uIGluIFN0YW5kYnkgbW9kZQ0KLSAqIEBybXRvbGwgQ1IzICAgICAgICAgIFJSUyAgICAgICAgICAgTExfUFdSX0VuYWJsZVNSQU0yUmV0ZW50aW9uDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0VuYWJsZVNSQU0yUmV0ZW50aW9uKHZvaWQpIHsNCi0gIFNFVF9CSVQoUFdSLT5DUjMsIFBXUl9DUjNfUlJTKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIFNSQU0yIGNvbnRlbnQgcmV0ZW50aW9uIGluIFN0YW5kYnkgbW9kZQ0KLSAqIEBybXRvbGwgQ1IzICAgICAgICAgIFJSUyAgICAgICAgICAgTExfUFdSX0Rpc2FibGVTUkFNMlJldGVudGlvbg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9EaXNhYmxlU1JBTTJSZXRlbnRpb24odm9pZCkgew0KLSAgQ0xFQVJfQklUKFBXUi0+Q1IzLCBQV1JfQ1IzX1JSUyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgU1JBTTIgY29udGVudCByZXRlbnRpb24gaW4gU3RhbmRieSBtb2RlICBpcyBlbmFibGVkDQotICogQHJtdG9sbCBDUjMgICAgICAgICAgUlJTICAgICAgICAgICBMTF9QV1JfSXNFbmFibGVkU1JBTTJSZXRlbnRpb24NCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUFdSX0lzRW5hYmxlZFNSQU0yUmV0ZW50aW9uKHZvaWQpIHsNCi0gIHVpbnQzMl90IHRlbXA7DQotICB0ZW1wID0gUkVBRF9CSVQoUFdSLT5DUjMsIFBXUl9DUjNfUlJTKTsNCi0NCi0gIHJldHVybiAoKHRlbXAgPT0gKFBXUl9DUjNfUlJTKSkgPyAxVSA6IDBVKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgdGhlIFdha2VVcCBQSU54IGZ1bmN0aW9uYWxpdHkNCi0gKiBAcm10b2xsIENSMyAgICAgICAgICBFV1VQMSAgICAgICAgIExMX1BXUl9FbmFibGVXYWtlVXBQaW5cbg0KLSAqICAgICAgICAgQ1IzICAgICAgICAgIEVXVVAyICAgICAgICAgTExfUFdSX0VuYWJsZVdha2VVcFBpblxuDQotICogICAgICAgICBDUjMgICAgICAgICAgRVdVUDMgICAgICAgICBMTF9QV1JfRW5hYmxlV2FrZVVwUGluXG4NCi0gKiAgICAgICAgIENSMyAgICAgICAgICBFV1VQNCAgICAgICAgIExMX1BXUl9FbmFibGVXYWtlVXBQaW5cbg0KLSAqICAgICAgICAgQ1IzICAgICAgICAgIEVXVVA1ICAgICAgICAgTExfUFdSX0VuYWJsZVdha2VVcFBpblxuDQotICogQHBhcmFtICBXYWtlVXBQaW4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRW5hYmxlV2FrZVVwUGluKHVpbnQzMl90IFdha2VVcFBpbikgew0KLSAgU0VUX0JJVChQV1ItPkNSMywgV2FrZVVwUGluKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIHRoZSBXYWtlVXAgUElOeCBmdW5jdGlvbmFsaXR5DQotICogQHJtdG9sbCBDUjMgICAgICAgICAgRVdVUDEgICAgICAgICBMTF9QV1JfRGlzYWJsZVdha2VVcFBpblxuDQotICogICAgICAgICBDUjMgICAgICAgICAgRVdVUDIgICAgICAgICBMTF9QV1JfRGlzYWJsZVdha2VVcFBpblxuDQotICogICAgICAgICBDUjMgICAgICAgICAgRVdVUDMgICAgICAgICBMTF9QV1JfRGlzYWJsZVdha2VVcFBpblxuDQotICogICAgICAgICBDUjMgICAgICAgICAgRVdVUDQgICAgICAgICBMTF9QV1JfRGlzYWJsZVdha2VVcFBpblxuDQotICogICAgICAgICBDUjMgICAgICAgICAgRVdVUDUgICAgICAgICBMTF9QV1JfRGlzYWJsZVdha2VVcFBpblxuDQotICogQHBhcmFtICBXYWtlVXBQaW4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRGlzYWJsZVdha2VVcFBpbih1aW50MzJfdCBXYWtlVXBQaW4pIHsNCi0gIENMRUFSX0JJVChQV1ItPkNSMywgV2FrZVVwUGluKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiB0aGUgV2FrZVVwIFBJTnggZnVuY3Rpb25hbGl0eSBpcyBlbmFibGVkDQotICogQHJtdG9sbCBDUjMgICAgICAgICAgRVdVUDEgICAgICAgICBMTF9QV1JfSXNFbmFibGVkV2FrZVVwUGluXG4NCi0gKiAgICAgICAgIENSMyAgICAgICAgICBFV1VQMiAgICAgICAgIExMX1BXUl9Jc0VuYWJsZWRXYWtlVXBQaW5cbg0KLSAqICAgICAgICAgQ1IzICAgICAgICAgIEVXVVAzICAgICAgICAgTExfUFdSX0lzRW5hYmxlZFdha2VVcFBpblxuDQotICogICAgICAgICBDUjMgICAgICAgICAgRVdVUDQgICAgICAgICBMTF9QV1JfSXNFbmFibGVkV2FrZVVwUGluXG4NCi0gKiAgICAgICAgIENSMyAgICAgICAgICBFV1VQNSAgICAgICAgIExMX1BXUl9Jc0VuYWJsZWRXYWtlVXBQaW5cbg0KLSAqIEBwYXJhbSAgV2FrZVVwUGluIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1dBS0VVUF9QSU4xDQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1dBS0VVUF9QSU4yDQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1dBS0VVUF9QSU4zDQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1dBS0VVUF9QSU40DQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1dBS0VVUF9QSU41DQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0VuYWJsZWRXYWtlVXBQaW4odWludDMyX3QgV2FrZVVwUGluKSB7DQotICB1aW50MzJfdCB0ZW1wOw0KLSAgdGVtcCA9IFJFQURfQklUKFBXUi0+Q1IzLCBXYWtlVXBQaW4pOw0KLQ0KLSAgcmV0dXJuICgodGVtcCA9PSAoV2FrZVVwUGluKSkgPyAxVSA6IDBVKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZXQgdGhlIHJlc2lzdG9yIGltcGVkYW5jZQ0KLSAqIEBybXRvbGwgQ1I0ICAgICAgICAgIFZCUlMgICAgICAgICAgTExfUFdSX1NldEJhdHRDaGFyZ1Jlc2lzdG9yDQotICogQHBhcmFtICBSZXNpc3RvciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9CQVRUX0NIQVJHX1JFU0lTVE9SXzVLDQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0JBVFRfQ0hBUkdSRVNJU1RPUl8xXzVLDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX1NldEJhdHRDaGFyZ1Jlc2lzdG9yKHVpbnQzMl90IFJlc2lzdG9yKSB7DQotICBNT0RJRllfUkVHKFBXUi0+Q1I0LCBQV1JfQ1I0X1ZCUlMsIFJlc2lzdG9yKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgdGhlIHJlc2lzdG9yIGltcGVkYW5jZQ0KLSAqIEBybXRvbGwgQ1I0ICAgICAgICAgIFZCUlMgICAgICAgICAgTExfUFdSX0dldEJhdHRDaGFyZ1Jlc2lzdG9yDQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9CQVRUX0NIQVJHX1JFU0lTVE9SXzVLDQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0JBVFRfQ0hBUkdSRVNJU1RPUl8xXzVLDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9HZXRCYXR0Q2hhcmdSZXNpc3Rvcih2b2lkKSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChQV1ItPkNSNCwgUFdSX0NSNF9WQlJTKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIGJhdHRlcnkgY2hhcmdpbmcNCi0gKiBAcm10b2xsIENSNCAgICAgICAgICBWQkUgICAgICAgICAgIExMX1BXUl9FbmFibGVCYXR0ZXJ5Q2hhcmdpbmcNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRW5hYmxlQmF0dGVyeUNoYXJnaW5nKHZvaWQpIHsNCi0gIFNFVF9CSVQoUFdSLT5DUjQsIFBXUl9DUjRfVkJFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIGJhdHRlcnkgY2hhcmdpbmcNCi0gKiBAcm10b2xsIENSNCAgICAgICAgICBWQkUgICAgICAgICAgIExMX1BXUl9EaXNhYmxlQmF0dGVyeUNoYXJnaW5nDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0Rpc2FibGVCYXR0ZXJ5Q2hhcmdpbmcodm9pZCkgew0KLSAgQ0xFQVJfQklUKFBXUi0+Q1I0LCBQV1JfQ1I0X1ZCRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgYmF0dGVyeSBjaGFyZ2luZyBpcyBlbmFibGVkDQotICogQHJtdG9sbCBDUjQgICAgICAgICAgVkJFICAgICAgICAgICBMTF9QV1JfSXNFbmFibGVkQmF0dGVyeUNoYXJnaW5nDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0VuYWJsZWRCYXR0ZXJ5Q2hhcmdpbmcodm9pZCkgew0KLSAgdWludDMyX3QgdGVtcDsNCi0gIHRlbXAgPSBSRUFEX0JJVChQV1ItPkNSNCwgUFdSX0NSNF9WQkUpOw0KLQ0KLSAgcmV0dXJuICgodGVtcCA9PSAoUFdSX0NSNF9WQkUpKSA/IDFVIDogMFUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCB0aGUgV2FrZS1VcCBwaW4gcG9sYXJpdHkgbG93IGZvciB0aGUgZXZlbnQgZGV0ZWN0aW9uDQotICogQHJtdG9sbCBDUjQgICAgICAgICAgV1AxICAgICAgICAgICBMTF9QV1JfU2V0V2FrZVVwUGluUG9sYXJpdHlMb3dcbg0KLSAqICAgICAgICAgQ1I0ICAgICAgICAgIFdQMiAgICAgICAgICAgTExfUFdSX1NldFdha2VVcFBpblBvbGFyaXR5TG93XG4NCi0gKiAgICAgICAgIENSNCAgICAgICAgICBXUDMgICAgICAgICAgIExMX1BXUl9TZXRXYWtlVXBQaW5Qb2xhcml0eUxvd1xuDQotICogICAgICAgICBDUjQgICAgICAgICAgV1A0ICAgICAgICAgICBMTF9QV1JfU2V0V2FrZVVwUGluUG9sYXJpdHlMb3dcbg0KLSAqICAgICAgICAgQ1I0ICAgICAgICAgIFdQNSAgICAgICAgICAgTExfUFdSX1NldFdha2VVcFBpblBvbGFyaXR5TG93DQotICogQHBhcmFtICBXYWtlVXBQaW4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfU2V0V2FrZVVwUGluUG9sYXJpdHlMb3codWludDMyX3QgV2FrZVVwUGluKSB7DQotICBTRVRfQklUKFBXUi0+Q1I0LCBXYWtlVXBQaW4pOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCB0aGUgV2FrZS1VcCBwaW4gcG9sYXJpdHkgaGlnaCBmb3IgdGhlIGV2ZW50IGRldGVjdGlvbg0KLSAqIEBybXRvbGwgQ1I0ICAgICAgICAgIFdQMSAgICAgICAgICAgTExfUFdSX1NldFdha2VVcFBpblBvbGFyaXR5SGlnaFxuDQotICogICAgICAgICBDUjQgICAgICAgICAgV1AyICAgICAgICAgICBMTF9QV1JfU2V0V2FrZVVwUGluUG9sYXJpdHlIaWdoXG4NCi0gKiAgICAgICAgIENSNCAgICAgICAgICBXUDMgICAgICAgICAgIExMX1BXUl9TZXRXYWtlVXBQaW5Qb2xhcml0eUhpZ2hcbg0KLSAqICAgICAgICAgQ1I0ICAgICAgICAgIFdQNCAgICAgICAgICAgTExfUFdSX1NldFdha2VVcFBpblBvbGFyaXR5SGlnaFxuDQotICogICAgICAgICBDUjQgICAgICAgICAgV1A1ICAgICAgICAgICBMTF9QV1JfU2V0V2FrZVVwUGluUG9sYXJpdHlIaWdoDQotICogQHBhcmFtICBXYWtlVXBQaW4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfU2V0V2FrZVVwUGluUG9sYXJpdHlIaWdoKHVpbnQzMl90IFdha2VVcFBpbikgew0KLSAgQ0xFQVJfQklUKFBXUi0+Q1I0LCBXYWtlVXBQaW4pOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCB0aGUgV2FrZS1VcCBwaW4gcG9sYXJpdHkgZm9yIHRoZSBldmVudCBkZXRlY3Rpb24NCi0gKiBAcm10b2xsIENSNCAgICAgICAgICBXUDEgICAgICAgICAgIExMX1BXUl9Jc1dha2VVcFBpblBvbGFyaXR5TG93XG4NCi0gKiAgICAgICAgIENSNCAgICAgICAgICBXUDIgICAgICAgICAgIExMX1BXUl9Jc1dha2VVcFBpblBvbGFyaXR5TG93XG4NCi0gKiAgICAgICAgIENSNCAgICAgICAgICBXUDMgICAgICAgICAgIExMX1BXUl9Jc1dha2VVcFBpblBvbGFyaXR5TG93XG4NCi0gKiAgICAgICAgIENSNCAgICAgICAgICBXUDQgICAgICAgICAgIExMX1BXUl9Jc1dha2VVcFBpblBvbGFyaXR5TG93XG4NCi0gKiAgICAgICAgIENSNCAgICAgICAgICBXUDUgICAgICAgICAgIExMX1BXUl9Jc1dha2VVcFBpblBvbGFyaXR5TG93DQotICogQHBhcmFtICBXYWtlVXBQaW4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjUNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUFdSX0lzV2FrZVVwUGluUG9sYXJpdHlMb3codWludDMyX3QgV2FrZVVwUGluKSB7DQotICB1aW50MzJfdCB0ZW1wOw0KLSAgdGVtcCA9IFJFQURfQklUKFBXUi0+Q1I0LCBXYWtlVXBQaW4pOw0KLQ0KLSAgcmV0dXJuICgodGVtcCA9PSAoV2FrZVVwUGluKSkgPyAxVSA6IDBVKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgR1BJTyBwdWxsLXVwIHN0YXRlIGluIFN0YW5kYnkgYW5kIFNodXRkb3duIG1vZGVzDQotICogQHJtdG9sbCBQVUNSQSAgICAgICAgUFUwLTE1ICAgICAgICBMTF9QV1JfRW5hYmxlR1BJT1B1bGxVcFxuDQotICogICAgICAgICBQVUNSQiAgICAgICAgUFUwLTE1ICAgICAgICBMTF9QV1JfRW5hYmxlR1BJT1B1bGxVcFxuDQotICogICAgICAgICBQVUNSQyAgICAgICAgUFUwLTE1ICAgICAgICBMTF9QV1JfRW5hYmxlR1BJT1B1bGxVcFxuDQotICogICAgICAgICBQVUNSRCAgICAgICAgUFUwLTE1ICAgICAgICBMTF9QV1JfRW5hYmxlR1BJT1B1bGxVcFxuDQotICogICAgICAgICBQVUNSRSAgICAgICAgUFUwLTE1ICAgICAgICBMTF9QV1JfRW5hYmxlR1BJT1B1bGxVcFxuDQotICogICAgICAgICBQVUNSRiAgICAgICAgUFUwLTE1ICAgICAgICBMTF9QV1JfRW5hYmxlR1BJT1B1bGxVcFxuDQotICogICAgICAgICBQVUNSRyAgICAgICAgUFUwLTE1ICAgICAgICBMTF9QV1JfRW5hYmxlR1BJT1B1bGxVcFxuDQotICogQHBhcmFtICBHUElPIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0INCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19DDQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fRA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0UNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19GDQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fRw0KLSAqDQotICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMNCi0gKiBAcGFyYW0gIEdQSU9OdW1iZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xDQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF80DQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF83DQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xNQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9FbmFibGVHUElPUHVsbFVwKHVpbnQzMl90IEdQSU8sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgR1BJT051bWJlcikgew0KLSAgU0VUX0JJVCgqKChfX0lPIHVpbnQzMl90ICopR1BJTyksIEdQSU9OdW1iZXIpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgR1BJTyBwdWxsLXVwIHN0YXRlIGluIFN0YW5kYnkgYW5kIFNodXRkb3duIG1vZGVzDQotICogQHJtdG9sbCBQVUNSQSAgICAgICAgUFUwLTE1ICAgICAgICBMTF9QV1JfRGlzYWJsZUdQSU9QdWxsVXBcbg0KLSAqICAgICAgICAgUFVDUkIgICAgICAgIFBVMC0xNSAgICAgICAgTExfUFdSX0Rpc2FibGVHUElPUHVsbFVwXG4NCi0gKiAgICAgICAgIFBVQ1JDICAgICAgICBQVTAtMTUgICAgICAgIExMX1BXUl9EaXNhYmxlR1BJT1B1bGxVcFxuDQotICogICAgICAgICBQVUNSRCAgICAgICAgUFUwLTE1ICAgICAgICBMTF9QV1JfRGlzYWJsZUdQSU9QdWxsVXBcbg0KLSAqICAgICAgICAgUFVDUkUgICAgICAgIFBVMC0xNSAgICAgICAgTExfUFdSX0Rpc2FibGVHUElPUHVsbFVwXG4NCi0gKiAgICAgICAgIFBVQ1JGICAgICAgICBQVTAtMTUgICAgICAgIExMX1BXUl9EaXNhYmxlR1BJT1B1bGxVcFxuDQotICogICAgICAgICBQVUNSRyAgICAgICAgUFUwLTE1ICAgICAgICBMTF9QV1JfRGlzYWJsZUdQSU9QdWxsVXBcbg0KLSAqIEBwYXJhbSAgR1BJTyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0ENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CDQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0QNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19FDQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fRg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0cNCi0gKg0KLSAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzDQotICogQHBhcmFtICBHUElPTnVtYmVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF81DQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfNw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF84DQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMTANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMTINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMTMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMTQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMTUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRGlzYWJsZUdQSU9QdWxsVXAodWludDMyX3QgR1BJTywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgR1BJT051bWJlcikgew0KLSAgQ0xFQVJfQklUKCooKF9fSU8gdWludDMyX3QgKilHUElPKSwgR1BJT051bWJlcik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgR1BJTyBwdWxsLXVwIHN0YXRlIGlzIGVuYWJsZWQNCi0gKiBAcm10b2xsIFBVQ1JBICAgICAgICBQVTAtMTUgICAgICAgIExMX1BXUl9Jc0VuYWJsZWRHUElPUHVsbFVwXG4NCi0gKiAgICAgICAgIFBVQ1JCICAgICAgICBQVTAtMTUgICAgICAgIExMX1BXUl9Jc0VuYWJsZWRHUElPUHVsbFVwXG4NCi0gKiAgICAgICAgIFBVQ1JDICAgICAgICBQVTAtMTUgICAgICAgIExMX1BXUl9Jc0VuYWJsZWRHUElPUHVsbFVwXG4NCi0gKiAgICAgICAgIFBVQ1JEICAgICAgICBQVTAtMTUgICAgICAgIExMX1BXUl9Jc0VuYWJsZWRHUElPUHVsbFVwXG4NCi0gKiAgICAgICAgIFBVQ1JFICAgICAgICBQVTAtMTUgICAgICAgIExMX1BXUl9Jc0VuYWJsZWRHUElPUHVsbFVwXG4NCi0gKiAgICAgICAgIFBVQ1JGICAgICAgICBQVTAtMTUgICAgICAgIExMX1BXUl9Jc0VuYWJsZWRHUElPUHVsbFVwXG4NCi0gKiAgICAgICAgIFBVQ1JHICAgICAgICBQVTAtMTUgICAgICAgIExMX1BXUl9Jc0VuYWJsZWRHUElPUHVsbFVwXG4NCi0gKiBAcGFyYW0gIEdQSU8gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19BDQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0MNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19EDQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fRQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0YNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19HDQotICoNCi0gKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcw0KLSAqIEBwYXJhbSAgR1BJT051bWJlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8wDQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8zDQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF82DQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF85DQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzEwDQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzExDQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzEyDQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzEzDQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzE0DQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzE1DQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0VuYWJsZWRHUElPUHVsbFVwKHVpbnQzMl90IEdQSU8sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEdQSU9OdW1iZXIpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKCooKF9fSU8gdWludDMyX3QgKilHUElPKSwgR1BJT051bWJlcikgPT0gKEdQSU9OdW1iZXIpKQ0KLSAgICAgICAgICAgICAgPyAxVUwNCi0gICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgR1BJTyBwdWxsLWRvd24gc3RhdGUgaW4gU3RhbmRieSBhbmQgU2h1dGRvd24gbW9kZXMNCi0gKiBAcm10b2xsIFBEQ1JBICAgICAgICBQRDAtMTUgICAgICAgIExMX1BXUl9FbmFibGVHUElPUHVsbERvd25cbg0KLSAqICAgICAgICAgUERDUkIgICAgICAgIFBEMC0xNSAgICAgICAgTExfUFdSX0VuYWJsZUdQSU9QdWxsRG93blxuDQotICogICAgICAgICBQRENSQyAgICAgICAgUEQwLTE1ICAgICAgICBMTF9QV1JfRW5hYmxlR1BJT1B1bGxEb3duXG4NCi0gKiAgICAgICAgIFBEQ1JEICAgICAgICBQRDAtMTUgICAgICAgIExMX1BXUl9FbmFibGVHUElPUHVsbERvd25cbg0KLSAqICAgICAgICAgUERDUkUgICAgICAgIFBEMC0xNSAgICAgICAgTExfUFdSX0VuYWJsZUdQSU9QdWxsRG93blxuDQotICogICAgICAgICBQRENSRiAgICAgICAgUEQwLTE1ICAgICAgICBMTF9QV1JfRW5hYmxlR1BJT1B1bGxEb3duXG4NCi0gKiAgICAgICAgIFBEQ1JHICAgICAgICBQRDAtMTUgICAgICAgIExMX1BXUl9FbmFibGVHUElPUHVsbERvd25cbg0KLSAqIEBwYXJhbSAgR1BJTyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0ENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CDQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0QNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19FDQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fRg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0cNCi0gKg0KLSAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzDQotICogQHBhcmFtICBHUElPTnVtYmVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF81DQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfNw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF84DQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMTANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMTINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMTMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMTQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMTUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRW5hYmxlR1BJT1B1bGxEb3duKHVpbnQzMl90IEdQSU8sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBHUElPTnVtYmVyKSB7DQotICBTRVRfQklUKCooKF9fSU8gdWludDMyX3QgKikoR1BJTyArIDRVKSksIEdQSU9OdW1iZXIpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgR1BJTyBwdWxsLWRvd24gc3RhdGUgaW4gU3RhbmRieSBhbmQgU2h1dGRvd24gbW9kZXMNCi0gKiBAcm10b2xsIFBEQ1JBICAgICAgICBQRDAtMTUgICAgICAgIExMX1BXUl9EaXNhYmxlR1BJT1B1bGxEb3duXG4NCi0gKiAgICAgICAgIFBEQ1JCICAgICAgICBQRDAtMTUgICAgICAgIExMX1BXUl9EaXNhYmxlR1BJT1B1bGxEb3duXG4NCi0gKiAgICAgICAgIFBEQ1JDICAgICAgICBQRDAtMTUgICAgICAgIExMX1BXUl9EaXNhYmxlR1BJT1B1bGxEb3duXG4NCi0gKiAgICAgICAgIFBEQ1JEICAgICAgICBQRDAtMTUgICAgICAgIExMX1BXUl9EaXNhYmxlR1BJT1B1bGxEb3duXG4NCi0gKiAgICAgICAgIFBEQ1JFICAgICAgICBQRDAtMTUgICAgICAgIExMX1BXUl9EaXNhYmxlR1BJT1B1bGxEb3duXG4NCi0gKiAgICAgICAgIFBEQ1JGICAgICAgICBQRDAtMTUgICAgICAgIExMX1BXUl9EaXNhYmxlR1BJT1B1bGxEb3duXG4NCi0gKiAgICAgICAgIFBEQ1JHICAgICAgICBQRDAtMTUgICAgICAgIExMX1BXUl9EaXNhYmxlR1BJT1B1bGxEb3duXG4NCi0gKiBAcGFyYW0gIEdQSU8gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19BDQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0MNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19EDQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fRQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0YNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19HDQotICoNCi0gKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcw0KLSAqIEBwYXJhbSAgR1BJT051bWJlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8wDQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8zDQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF82DQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF85DQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzEwDQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzExDQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzEyDQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzEzDQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzE0DQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzE1DQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0Rpc2FibGVHUElPUHVsbERvd24odWludDMyX3QgR1BJTywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBHUElPTnVtYmVyKSB7DQotICBDTEVBUl9CSVQoKigoX19JTyB1aW50MzJfdCAqKShHUElPICsgNFUpKSwgR1BJT051bWJlcik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgR1BJTyBwdWxsLWRvd24gc3RhdGUgaXMgZW5hYmxlZA0KLSAqIEBybXRvbGwgUERDUkEgICAgICAgIFBEMC0xNSAgICAgICAgTExfUFdSX0lzRW5hYmxlZEdQSU9QdWxsRG93blxuDQotICogICAgICAgICBQRENSQiAgICAgICAgUEQwLTE1ICAgICAgICBMTF9QV1JfSXNFbmFibGVkR1BJT1B1bGxEb3duXG4NCi0gKiAgICAgICAgIFBEQ1JDICAgICAgICBQRDAtMTUgICAgICAgIExMX1BXUl9Jc0VuYWJsZWRHUElPUHVsbERvd25cbg0KLSAqICAgICAgICAgUERDUkQgICAgICAgIFBEMC0xNSAgICAgICAgTExfUFdSX0lzRW5hYmxlZEdQSU9QdWxsRG93blxuDQotICogICAgICAgICBQRENSRSAgICAgICAgUEQwLTE1ICAgICAgICBMTF9QV1JfSXNFbmFibGVkR1BJT1B1bGxEb3duXG4NCi0gKiAgICAgICAgIFBEQ1JGICAgICAgICBQRDAtMTUgICAgICAgIExMX1BXUl9Jc0VuYWJsZWRHUElPUHVsbERvd25cbg0KLSAqICAgICAgICAgUERDUkcgICAgICAgIFBEMC0xNSAgICAgICAgTExfUFdSX0lzRW5hYmxlZEdQSU9QdWxsRG93blxuDQotICogQHBhcmFtICBHUElPIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0INCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19DDQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fRA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0UNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19GDQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fRw0KLSAqDQotICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMNCi0gKiBAcGFyYW0gIEdQSU9OdW1iZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xDQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF80DQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF83DQotICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xNQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfSXNFbmFibGVkR1BJT1B1bGxEb3duKHVpbnQzMl90IEdQSU8sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgR1BJT051bWJlcikgew0KLSAgcmV0dXJuICgNCi0gICAgICAoUkVBRF9CSVQoKigoX19JTyB1aW50MzJfdCAqKShHUElPICsgNFUpKSwgR1BJT051bWJlcikgPT0gKEdQSU9OdW1iZXIpKQ0KLSAgICAgICAgICA/IDFVTA0KLSAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBQV1JfTExfRUZfRkxBR19NYW5hZ2VtZW50IEZMQUdfTWFuYWdlbWVudA0KLSAqIEB7DQotICovDQotDQotLyoqDQotICogQGJyaWVmICBHZXQgSW50ZXJuYWwgV2FrZS11cCBsaW5lIEZsYWcNCi0gKiBAcm10b2xsIFNSMSAgICAgICAgICBXVUZJICAgICAgICAgIExMX1BXUl9Jc0FjdGl2ZUZsYWdfSW50ZXJuV1UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUFdSX0lzQWN0aXZlRmxhZ19JbnRlcm5XVSh2b2lkKSB7DQotICB1aW50MzJfdCB0ZW1wOw0KLSAgdGVtcCA9IFJFQURfQklUKFBXUi0+U1IxLCBQV1JfU1IxX1dVRkkpOw0KLQ0KLSAgcmV0dXJuICgodGVtcCA9PSAoUFdSX1NSMV9XVUZJKSkgPyAxVSA6IDBVKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgU3RhbmQtQnkgRmxhZw0KLSAqIEBybXRvbGwgU1IxICAgICAgICAgIFNCRiAgICAgICAgICAgTExfUFdSX0lzQWN0aXZlRmxhZ19TQg0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfSXNBY3RpdmVGbGFnX1NCKHZvaWQpIHsNCi0gIHVpbnQzMl90IHRlbXA7DQotICB0ZW1wID0gUkVBRF9CSVQoUFdSLT5TUjEsIFBXUl9TUjFfU0JGKTsNCi0NCi0gIHJldHVybiAoKHRlbXAgPT0gKFBXUl9TUjFfU0JGKSkgPyAxVSA6IDBVKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgV2FrZS11cCBGbGFnIDUNCi0gKiBAcm10b2xsIFNSMSAgICAgICAgICBXVUY1ICAgICAgICAgIExMX1BXUl9Jc0FjdGl2ZUZsYWdfV1U1DQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0FjdGl2ZUZsYWdfV1U1KHZvaWQpIHsNCi0gIHVpbnQzMl90IHRlbXA7DQotICB0ZW1wID0gUkVBRF9CSVQoUFdSLT5TUjEsIFBXUl9TUjFfV1VGNSk7DQotDQotICByZXR1cm4gKCh0ZW1wID09IChQV1JfU1IxX1dVRjUpKSA/IDFVIDogMFUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBXYWtlLXVwIEZsYWcgNA0KLSAqIEBybXRvbGwgU1IxICAgICAgICAgIFdVRjQgICAgICAgICAgTExfUFdSX0lzQWN0aXZlRmxhZ19XVTQNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUFdSX0lzQWN0aXZlRmxhZ19XVTQodm9pZCkgew0KLSAgdWludDMyX3QgdGVtcDsNCi0gIHRlbXAgPSBSRUFEX0JJVChQV1ItPlNSMSwgUFdSX1NSMV9XVUY0KTsNCi0NCi0gIHJldHVybiAoKHRlbXAgPT0gKFBXUl9TUjFfV1VGNCkpID8gMVUgOiAwVSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IFdha2UtdXAgRmxhZyAzDQotICogQHJtdG9sbCBTUjEgICAgICAgICAgV1VGMyAgICAgICAgICBMTF9QV1JfSXNBY3RpdmVGbGFnX1dVMw0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfSXNBY3RpdmVGbGFnX1dVMyh2b2lkKSB7DQotICB1aW50MzJfdCB0ZW1wOw0KLSAgdGVtcCA9IFJFQURfQklUKFBXUi0+U1IxLCBQV1JfU1IxX1dVRjMpOw0KLQ0KLSAgcmV0dXJuICgodGVtcCA9PSAoUFdSX1NSMV9XVUYzKSkgPyAxVSA6IDBVKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgV2FrZS11cCBGbGFnIDINCi0gKiBAcm10b2xsIFNSMSAgICAgICAgICBXVUYyICAgICAgICAgIExMX1BXUl9Jc0FjdGl2ZUZsYWdfV1UyDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0FjdGl2ZUZsYWdfV1UyKHZvaWQpIHsNCi0gIHVpbnQzMl90IHRlbXA7DQotICB0ZW1wID0gUkVBRF9CSVQoUFdSLT5TUjEsIFBXUl9TUjFfV1VGMik7DQotDQotICByZXR1cm4gKCh0ZW1wID09IChQV1JfU1IxX1dVRjIpKSA/IDFVIDogMFUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBXYWtlLXVwIEZsYWcgMQ0KLSAqIEBybXRvbGwgU1IxICAgICAgICAgIFdVRjEgICAgICAgICAgTExfUFdSX0lzQWN0aXZlRmxhZ19XVTENCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUFdSX0lzQWN0aXZlRmxhZ19XVTEodm9pZCkgew0KLSAgdWludDMyX3QgdGVtcDsNCi0gIHRlbXAgPSBSRUFEX0JJVChQV1ItPlNSMSwgUFdSX1NSMV9XVUYxKTsNCi0NCi0gIHJldHVybiAoKHRlbXAgPT0gKFBXUl9TUjFfV1VGMSkpID8gMVUgOiAwVSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2xlYXIgU3RhbmQtQnkgRmxhZw0KLSAqIEBybXRvbGwgU0NSICAgICAgICAgIENTQkYgICAgICAgICAgTExfUFdSX0NsZWFyRmxhZ19TQg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9DbGVhckZsYWdfU0Iodm9pZCkgew0KLSAgV1JJVEVfUkVHKFBXUi0+U0NSLCBQV1JfU0NSX0NTQkYpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENsZWFyIFdha2UtdXAgRmxhZ3MNCi0gKiBAcm10b2xsIFNDUiAgICAgICAgICBDV1VGICAgICAgICAgIExMX1BXUl9DbGVhckZsYWdfV1UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfQ2xlYXJGbGFnX1dVKHZvaWQpIHsNCi0gIFdSSVRFX1JFRyhQV1ItPlNDUiwgUFdSX1NDUl9DV1VGKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDbGVhciBXYWtlLXVwIEZsYWcgNQ0KLSAqIEBybXRvbGwgU0NSICAgICAgICAgIENXVUY1ICAgICAgICAgTExfUFdSX0NsZWFyRmxhZ19XVTUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfQ2xlYXJGbGFnX1dVNSh2b2lkKSB7DQotICBXUklURV9SRUcoUFdSLT5TQ1IsIFBXUl9TQ1JfQ1dVRjUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENsZWFyIFdha2UtdXAgRmxhZyA0DQotICogQHJtdG9sbCBTQ1IgICAgICAgICAgQ1dVRjQgICAgICAgICBMTF9QV1JfQ2xlYXJGbGFnX1dVNA0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9DbGVhckZsYWdfV1U0KHZvaWQpIHsNCi0gIFdSSVRFX1JFRyhQV1ItPlNDUiwgUFdSX1NDUl9DV1VGNCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2xlYXIgV2FrZS11cCBGbGFnIDMNCi0gKiBAcm10b2xsIFNDUiAgICAgICAgICBDV1VGMyAgICAgICAgIExMX1BXUl9DbGVhckZsYWdfV1UzDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0NsZWFyRmxhZ19XVTModm9pZCkgew0KLSAgV1JJVEVfUkVHKFBXUi0+U0NSLCBQV1JfU0NSX0NXVUYzKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDbGVhciBXYWtlLXVwIEZsYWcgMg0KLSAqIEBybXRvbGwgU0NSICAgICAgICAgIENXVUYyICAgICAgICAgTExfUFdSX0NsZWFyRmxhZ19XVTINCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfQ2xlYXJGbGFnX1dVMih2b2lkKSB7DQotICBXUklURV9SRUcoUFdSLT5TQ1IsIFBXUl9TQ1JfQ1dVRjIpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENsZWFyIFdha2UtdXAgRmxhZyAxDQotICogQHJtdG9sbCBTQ1IgICAgICAgICAgQ1dVRjEgICAgICAgICBMTF9QV1JfQ2xlYXJGbGFnX1dVMQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9DbGVhckZsYWdfV1UxKHZvaWQpIHsNCi0gIFdSSVRFX1JFRyhQV1ItPlNDUiwgUFdSX1NDUl9DV1VGMSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciBWRERBIHZvbHRhZ2UgaXMgYmVsb3cgb3IgYWJvdmUgUFZNNCB0aHJlc2hvbGQNCi0gKiBAcm10b2xsIFNSMiAgICAgICAgICBQVk1PNCAgICAgICAgIExMX1BXUl9Jc0FjdGl2ZUZsYWdfUFZNTzQNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUFdSX0lzQWN0aXZlRmxhZ19QVk1PNCh2b2lkKSB7DQotICB1aW50MzJfdCB0ZW1wOw0KLSAgdGVtcCA9IFJFQURfQklUKFBXUi0+U1IyLCBQV1JfU1IyX1BWTU80KTsNCi0NCi0gIHJldHVybiAoKHRlbXAgPT0gKFBXUl9TUjJfUFZNTzQpKSA/IDFVIDogMFUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgVkREQSB2b2x0YWdlIGlzIGJlbG93IG9yIGFib3ZlIFBWTTMgdGhyZXNob2xkDQotICogQHJtdG9sbCBTUjIgICAgICAgICAgUFZNTzMgICAgICAgICBMTF9QV1JfSXNBY3RpdmVGbGFnX1BWTU8zDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0FjdGl2ZUZsYWdfUFZNTzModm9pZCkgew0KLSAgdWludDMyX3QgdGVtcDsNCi0gIHRlbXAgPSBSRUFEX0JJVChQV1ItPlNSMiwgUFdSX1NSMl9QVk1PMyk7DQotDQotICByZXR1cm4gKCh0ZW1wID09IChQV1JfU1IyX1BWTU8zKSkgPyAxVSA6IDBVKTsNCi19DQotDQotI2lmIGRlZmluZWQoUFdSX1NSMl9QVk1PMikNCi0vKioNCi0gKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgVkRESU8yIHZvbHRhZ2UgaXMgYmVsb3cgb3IgYWJvdmUgUFZNMiB0aHJlc2hvbGQNCi0gKiBAcm10b2xsIFNSMiAgICAgICAgICBQVk1PMiAgICAgICAgIExMX1BXUl9Jc0FjdGl2ZUZsYWdfUFZNTzINCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUFdSX0lzQWN0aXZlRmxhZ19QVk1PMih2b2lkKSB7DQotICB1aW50MzJfdCB0ZW1wOw0KLSAgdGVtcCA9IFJFQURfQklUKFBXUi0+U1IyLCBQV1JfU1IyX1BWTU8yKTsNCi0NCi0gIHJldHVybiAoKHRlbXAgPT0gKFBXUl9TUjJfUFZNTzIpKSA/IDFVIDogMFUpOw0KLX0NCi0jZW5kaWYgLyogUFdSX1NSMl9QVk1PMiAqLw0KLQ0KLSNpZiBkZWZpbmVkKFBXUl9TUjJfUFZNTzEpDQotLyoqDQotICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIFZERFVTQiB2b2x0YWdlIGlzIGJlbG93IG9yIGFib3ZlIFBWTTEgdGhyZXNob2xkDQotICogQHJtdG9sbCBTUjIgICAgICAgICAgUFZNTzEgICAgICAgICBMTF9QV1JfSXNBY3RpdmVGbGFnX1BWTU8xDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0FjdGl2ZUZsYWdfUFZNTzEodm9pZCkgew0KLSAgdWludDMyX3QgdGVtcDsNCi0gIHRlbXAgPSBSRUFEX0JJVChQV1ItPlNSMiwgUFdSX1NSMl9QVk1PMSk7DQotDQotICByZXR1cm4gKCh0ZW1wID09IChQV1JfU1IyX1BWTU8xKSkgPyAxVSA6IDBVKTsNCi19DQotI2VuZGlmIC8qIFBXUl9TUjJfUFZNTzEgKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgVkREIHZvbHRhZ2UgaXMgYmVsb3cgb3IgYWJvdmUgdGhlIHNlbGVjdGVkIFBWRA0KLSAqIHRocmVzaG9sZA0KLSAqIEBybXRvbGwgU1IyICAgICAgICAgIFBWRE8gICAgICAgICAgTExfUFdSX0lzQWN0aXZlRmxhZ19QVkRPDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0FjdGl2ZUZsYWdfUFZETyh2b2lkKSB7DQotICB1aW50MzJfdCB0ZW1wOw0KLSAgdGVtcCA9IFJFQURfQklUKFBXUi0+U1IyLCBQV1JfU1IyX1BWRE8pOw0KLQ0KLSAgcmV0dXJuICgodGVtcCA9PSAoUFdSX1NSMl9QVkRPKSkgPyAxVSA6IDBVKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIHRoZSByZWd1bGF0b3IgaXMgcmVhZHkgaW4gdGhlIHNlbGVjdGVkIHZvbHRhZ2UgcmFuZ2UNCi0gKiBvciBpZiBpdHMgb3V0cHV0IHZvbHRhZ2UgaXMgc3RpbGwgY2hhbmdpbmcgdG8gdGhlIHJlcXVpcmVkIHZvbHRhZ2UgbGV2ZWwNCi0gKiBAcm10b2xsIFNSMiAgICAgICAgICBWT1NGICAgICAgICAgIExMX1BXUl9Jc0FjdGl2ZUZsYWdfVk9TDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0FjdGl2ZUZsYWdfVk9TKHZvaWQpIHsNCi0gIHVpbnQzMl90IHRlbXA7DQotICB0ZW1wID0gUkVBRF9CSVQoUFdSLT5TUjIsIFBXUl9TUjJfVk9TRik7DQotDQotICByZXR1cm4gKCh0ZW1wID09IChQV1JfU1IyX1ZPU0YpKSA/IDFVIDogMFUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgdGhlIHJlZ3VsYXRvciBpcyByZWFkeSBpbiBtYWluIG1vZGUgb3IgaXMgaW4NCi0gKiBsb3ctcG93ZXIgbW9kZQ0KLSAqIEBub3RlOiBUYWtlIGNhcmUsIHJldHVybiB2YWx1ZSAiMCIgbWVhbnMgdGhlIHJlZ3VsYXRvciBpcyByZWFkeS4gIFJldHVybg0KLSAqIHZhbHVlICIxIiBtZWFucyB0aGUgb3V0cHV0IHZvbHRhZ2UgcmFuZ2UgaXMgc3RpbGwgY2hhbmdpbmcuDQotICogQHJtdG9sbCBTUjIgICAgICAgICAgUkVHTFBGICAgICAgICBMTF9QV1JfSXNBY3RpdmVGbGFnX1JFR0xQRg0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfSXNBY3RpdmVGbGFnX1JFR0xQRih2b2lkKSB7DQotICB1aW50MzJfdCB0ZW1wOw0KLSAgdGVtcCA9IFJFQURfQklUKFBXUi0+U1IyLCBQV1JfU1IyX1JFR0xQRik7DQotDQotICByZXR1cm4gKCh0ZW1wID09IChQV1JfU1IyX1JFR0xQRikpID8gMVUgOiAwVSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciBvciBub3QgdGhlIGxvdy1wb3dlciByZWd1bGF0b3IgaXMgcmVhZHkNCi0gKiBAcm10b2xsIFNSMiAgICAgICAgICBSRUdMUFMgICAgICAgIExMX1BXUl9Jc0FjdGl2ZUZsYWdfUkVHTFBTDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0FjdGl2ZUZsYWdfUkVHTFBTKHZvaWQpIHsNCi0gIHVpbnQzMl90IHRlbXA7DQotICB0ZW1wID0gUkVBRF9CSVQoUFdSLT5TUjIsIFBXUl9TUjJfUkVHTFBTKTsNCi0NCi0gIHJldHVybiAoKHRlbXAgPT0gKFBXUl9TUjJfUkVHTFBTKSkgPyAxVSA6IDBVKTsNCi19DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0jaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpDQotLyoqIEBkZWZncm91cCBQV1JfTExfRUZfSW5pdCBEZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbg0KLSAqIEB7DQotICovDQotRXJyb3JTdGF0dXMgTExfUFdSX0RlSW5pdCh2b2lkKTsNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLSNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8NCi0NCi0vKiogQGRlZmdyb3VwIFBXUl9MTF9FRl9MZWdhY3lfRnVuY3Rpb25zIExlZ2FjeSBmdW5jdGlvbnMgbmFtZQ0KLSAqIEB7DQotICovDQotLyogT2xkIGZ1bmN0aW9ucyBuYW1lIGtlcHQgZm9yIGxlZ2FjeSBwdXJwb3NlLCB0byBiZSByZXBsYWNlZCBieSB0aGUgICAgICAgICAgKi8NCi0vKiBjdXJyZW50IGZ1bmN0aW9ucyBuYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfUFdSX0lzQWN0aXZlRmxhZ19WT1NGIExMX1BXUl9Jc0FjdGl2ZUZsYWdfVk9TDQotI2RlZmluZSBMTF9QV1JfRW5hYmxlVVNCRGVhZEJhdHRlcnkgTExfUFdSX0VuYWJsZVVDUEREZWFkQmF0dGVyeQ0KLSNkZWZpbmUgTExfUFdSX0Rpc2FibGVVU0JEZWFkQmF0dGVyeSBMTF9QV1JfRGlzYWJsZVVDUEREZWFkQmF0dGVyeQ0KLSNkZWZpbmUgTExfUFdSX0lzRW5hYmxlZFVTQkRlYWRCYXR0ZXJ5IExMX1BXUl9Jc0VuYWJsZWRVQ1BERGVhZEJhdHRlcnkNCi0jZGVmaW5lIExMX1BXUl9FbmFibGVEZWFkQmF0dGVyeVBEIExMX1BXUl9FbmFibGVVQ1BERGVhZEJhdHRlcnkNCi0jZGVmaW5lIExMX1BXUl9EaXNhYmxlRGVhZEJhdHRlcnlQRCBMTF9QV1JfRGlzYWJsZVVDUEREZWFkQmF0dGVyeQ0KLSNkZWZpbmUgTExfUFdSX0VuYWJsZVVTQlN0YW5kQnlNb2RlUEQgTExfUFdSX0VuYWJsZVVDUERTdGFuZGJ5TW9kZQ0KLSNkZWZpbmUgTExfUFdSX0VuYWJsZVN0YW5kQnlNb2RlUEQgTExfUFdSX0VuYWJsZVVDUERTdGFuZGJ5TW9kZQ0KLSNkZWZpbmUgTExfUFdSX0Rpc2FibGVVU0JTdGFuZEJ5TW9kZVBEIExMX1BXUl9EaXNhYmxlVUNQRFN0YW5kYnlNb2RlDQotI2RlZmluZSBMTF9QV1JfRGlzYWJsZVN0YW5kQnlNb2RlUEQgTExfUFdSX0Rpc2FibGVVQ1BEU3RhbmRieU1vZGUNCi0jZGVmaW5lIExMX1BXUl9Jc0VuYWJsZWRVU0JTdGFuZEJ5TW9kZVBEIExMX1BXUl9Jc0VuYWJsZWRVQ1BEU3RhbmRieU1vZGUNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0jZW5kaWYgLyogZGVmaW5lZChQV1IpICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0jaWZkZWYgX19jcGx1c3BsdXMNCi19DQotI2VuZGlmDQotDQotI2VuZGlmIC8qIFNUTTMyRzR4eF9MTF9QV1JfSCAqLw0KKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGZpbGUgICAgc3RtMzJnNHh4X2xsX3B3ci5oCisgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgUFdSIExMIG1vZHVsZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBhdHRlbnRpb24KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRlcm1zIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUKKyAqIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4KKyAqIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcyB3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMkc0eHhfTExfUFdSX0gKKyNkZWZpbmUgU1RNMzJHNHh4X0xMX1BXUl9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmc0eHguaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzR4eF9MTF9Ecml2ZXIKKyAqIEB7CisgKi8KKworI2lmIGRlZmluZWQoUFdSKQorCisvKiogQGRlZmdyb3VwIFBXUl9MTCBQV1IKKyAqIEB7CisgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBQV1JfTExfRXhwb3J0ZWRfQ29uc3RhbnRzIFBXUiBFeHBvcnRlZCBDb25zdGFudHMKKyAqIEB7CisgKi8KKworLyoqIEBkZWZncm91cCBQV1JfTExfRUNfQ0xFQVJfRkxBRyBDbGVhciBGbGFncyBEZWZpbmVzCisgKiBAYnJpZWYgICAgRmxhZ3MgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX1BXUl9Xcml0ZVJlZyBmdW5jdGlvbgorICogQHsKKyAqLworI2RlZmluZSBMTF9QV1JfU0NSX0NTQkYgUFdSX1NDUl9DU0JGCisjZGVmaW5lIExMX1BXUl9TQ1JfQ1dVRiBQV1JfU0NSX0NXVUYKKyNkZWZpbmUgTExfUFdSX1NDUl9DV1VGNSBQV1JfU0NSX0NXVUY1CisjZGVmaW5lIExMX1BXUl9TQ1JfQ1dVRjQgUFdSX1NDUl9DV1VGNAorI2RlZmluZSBMTF9QV1JfU0NSX0NXVUYzIFBXUl9TQ1JfQ1dVRjMKKyNkZWZpbmUgTExfUFdSX1NDUl9DV1VGMiBQV1JfU0NSX0NXVUYyCisjZGVmaW5lIExMX1BXUl9TQ1JfQ1dVRjEgUFdSX1NDUl9DV1VGMQorLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgUFdSX0xMX0VDX0dFVF9GTEFHIEdldCBGbGFncyBEZWZpbmVzCisgKiBAYnJpZWYgICAgRmxhZ3MgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX1BXUl9SZWFkUmVnIGZ1bmN0aW9uCisgKiBAeworICovCisjZGVmaW5lIExMX1BXUl9TUjFfV1VGSSBQV1JfU1IxX1dVRkkKKyNkZWZpbmUgTExfUFdSX1NSMV9TQkYgUFdSX1NSMV9TQkYKKyNkZWZpbmUgTExfUFdSX1NSMV9XVUY1IFBXUl9TUjFfV1VGNQorI2RlZmluZSBMTF9QV1JfU1IxX1dVRjQgUFdSX1NSMV9XVUY0CisjZGVmaW5lIExMX1BXUl9TUjFfV1VGMyBQV1JfU1IxX1dVRjMKKyNkZWZpbmUgTExfUFdSX1NSMV9XVUYyIFBXUl9TUjFfV1VGMgorI2RlZmluZSBMTF9QV1JfU1IxX1dVRjEgUFdSX1NSMV9XVUYxCisjaWYgZGVmaW5lZChQV1JfU1IyX1BWTU80KQorI2RlZmluZSBMTF9QV1JfU1IyX1BWTU80IFBXUl9TUjJfUFZNTzQKKyNlbmRpZiAvKiBQV1JfU1IyX1BWTU80ICovCisjaWYgZGVmaW5lZChQV1JfU1IyX1BWTU8zKQorI2RlZmluZSBMTF9QV1JfU1IyX1BWTU8zIFBXUl9TUjJfUFZNTzMKKyNlbmRpZiAvKiBQV1JfU1IyX1BWTU8zICovCisjaWYgZGVmaW5lZChQV1JfU1IyX1BWTU8yKQorI2RlZmluZSBMTF9QV1JfU1IyX1BWTU8yIFBXUl9TUjJfUFZNTzIKKyNlbmRpZiAvKiBQV1JfU1IyX1BWTU8yICovCisjaWYgZGVmaW5lZChQV1JfU1IyX1BWTU8xKQorI2RlZmluZSBMTF9QV1JfU1IyX1BWTU8xIFBXUl9TUjJfUFZNTzEKKyNlbmRpZiAvKiBQV1JfU1IyX1BWTU8xICovCisjZGVmaW5lIExMX1BXUl9TUjJfUFZETyBQV1JfU1IyX1BWRE8KKyNkZWZpbmUgTExfUFdSX1NSMl9WT1NGIFBXUl9TUjJfVk9TRgorI2RlZmluZSBMTF9QV1JfU1IyX1JFR0xQRiBQV1JfU1IyX1JFR0xQRgorI2RlZmluZSBMTF9QV1JfU1IyX1JFR0xQUyBQV1JfU1IyX1JFR0xQUworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgUFdSX0xMX0VDX1JFR1VfVk9MVEFHRSBSRUdVIFZPTFRBR0UKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfUFdSX1JFR1VfVk9MVEFHRV9TQ0FMRTEgKFBXUl9DUjFfVk9TXzApCisjZGVmaW5lIExMX1BXUl9SRUdVX1ZPTFRBR0VfU0NBTEUyIChQV1JfQ1IxX1ZPU18xKQorLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgUFdSX0xMX0VDX01PREVfUFdSIE1PREUgUFdSCisgKiBAeworICovCisjZGVmaW5lIExMX1BXUl9NT0RFX1NUT1AwIChQV1JfQ1IxX0xQTVNfU1RPUDApCisjZGVmaW5lIExMX1BXUl9NT0RFX1NUT1AxIChQV1JfQ1IxX0xQTVNfU1RPUDEpCisjZGVmaW5lIExMX1BXUl9NT0RFX1NUQU5EQlkgKFBXUl9DUjFfTFBNU19TVEFOREJZKQorI2RlZmluZSBMTF9QV1JfTU9ERV9TSFVURE9XTiAoUFdSX0NSMV9MUE1TX1NIVVRET1dOKQorLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgUFdSX0xMX0VDX1BWTV9WRERVU0JfMSBQZXJpcGhlcmFsIHZvbHRhZ2UgbW9uaXRvcmluZworICogQHsKKyAqLworI2lmIGRlZmluZWQoUFdSX0NSMl9QVk1FMSkKKyNkZWZpbmUgTExfUFdSX1BWTV9WRERBX0NPTVAgKFBXUl9DUjJfUFZNRTEpIC8qIE1vbml0b3JpbmcgVkREQSB2cy4geC54ViAqLworI2VuZGlmCisjaWYgZGVmaW5lZChQV1JfQ1IyX1BWTUUyKQorI2RlZmluZSBMTF9QV1JfUFZNX1ZEREFfRkFTVERBQyAoUFdSX0NSMl9QVk1FMikgLyogTW9uaXRvcmluZyBWRERBIHZzLiB4LnhWICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKFBXUl9DUjJfUFZNRTMpCisjZGVmaW5lIExMX1BXUl9QVk1fVkREQV9BREMgKFBXUl9DUjJfUFZNRTMpIC8qIE1vbml0b3JpbmcgVkREQSB2cy4gMS42MlYgICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKFBXUl9DUjJfUFZNRTQpCisjZGVmaW5lIExMX1BXUl9QVk1fVkREQV9PUEFNUF9EQUMgXAorICAoUFdSX0NSMl9QVk1FNCkgLyogTW9uaXRvcmluZyBWRERBIHZzLiAxeC54ViAgICovCisjZW5kaWYKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFBXUl9MTF9FQ19QVkRMRVZFTCBQVkRMRVZFTAorICogQHsKKyAqLworI2RlZmluZSBMTF9QV1JfUFZETEVWRUxfMCAoUFdSX0NSMl9QTFNfTEVWMCkgLyogVlBWRDAgYXJvdW5kIDIuMCBWICovCisjZGVmaW5lIExMX1BXUl9QVkRMRVZFTF8xIChQV1JfQ1IyX1BMU19MRVYxKSAvKiBWUFZEMSBhcm91bmQgMi4yIFYgKi8KKyNkZWZpbmUgTExfUFdSX1BWRExFVkVMXzIgKFBXUl9DUjJfUExTX0xFVjIpIC8qIFZQVkQyIGFyb3VuZCAyLjQgViAqLworI2RlZmluZSBMTF9QV1JfUFZETEVWRUxfMyAoUFdSX0NSMl9QTFNfTEVWMykgLyogVlBWRDMgYXJvdW5kIDIuNSBWICovCisjZGVmaW5lIExMX1BXUl9QVkRMRVZFTF80IChQV1JfQ1IyX1BMU19MRVY0KSAvKiBWUFZENCBhcm91bmQgMi42IFYgKi8KKyNkZWZpbmUgTExfUFdSX1BWRExFVkVMXzUgKFBXUl9DUjJfUExTX0xFVjUpIC8qIFZQVkQ1IGFyb3VuZCAyLjggViAqLworI2RlZmluZSBMTF9QV1JfUFZETEVWRUxfNiAoUFdSX0NSMl9QTFNfTEVWNikgLyogVlBWRDYgYXJvdW5kIDIuOSBWICovCisjZGVmaW5lIExMX1BXUl9QVkRMRVZFTF83ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoUFdSX0NSMl9QTFNfTEVWNykgLyogRXh0ZXJuYWwgaW5wdXQgYW5hbG9nIHZvbHRhZ2UgICAoQ29tcGFyZSBpbnRlcm5hbGx5IHRvIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFZSRUZJTlQpICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBQV1JfTExfRUNfV0FLRVVQIFdBS0VVUAorICogQHsKKyAqLworI2RlZmluZSBMTF9QV1JfV0FLRVVQX1BJTjEgKFBXUl9DUjNfRVdVUDEpCisjZGVmaW5lIExMX1BXUl9XQUtFVVBfUElOMiAoUFdSX0NSM19FV1VQMikKKyNkZWZpbmUgTExfUFdSX1dBS0VVUF9QSU4zIChQV1JfQ1IzX0VXVVAzKQorI2RlZmluZSBMTF9QV1JfV0FLRVVQX1BJTjQgKFBXUl9DUjNfRVdVUDQpCisjZGVmaW5lIExMX1BXUl9XQUtFVVBfUElONSAoUFdSX0NSM19FV1VQNSkKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFBXUl9MTF9FQ19CQVRUX0NIQVJHX1JFU0lTVE9SIEJBVFQgQ0hBUkcgUkVTSVNUT1IKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfUFdSX0JBVFRfQ0hBUkdfUkVTSVNUT1JfNUsgKCh1aW50MzJfdCkweDAwMDAwMDAwKQorI2RlZmluZSBMTF9QV1JfQkFUVF9DSEFSR1JFU0lTVE9SXzFfNUsgKFBXUl9DUjRfVkJSUykKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFBXUl9MTF9FQ19HUElPIEdQSU8KKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfUFdSX0dQSU9fQSAoKHVpbnQzMl90KSgmKFBXUi0+UFVDUkEpKSkKKyNkZWZpbmUgTExfUFdSX0dQSU9fQiAoKHVpbnQzMl90KSgmKFBXUi0+UFVDUkIpKSkKKyNkZWZpbmUgTExfUFdSX0dQSU9fQyAoKHVpbnQzMl90KSgmKFBXUi0+UFVDUkMpKSkKKyNkZWZpbmUgTExfUFdSX0dQSU9fRCAoKHVpbnQzMl90KSgmKFBXUi0+UFVDUkQpKSkKKyNkZWZpbmUgTExfUFdSX0dQSU9fRSAoKHVpbnQzMl90KSgmKFBXUi0+UFVDUkUpKSkKKyNkZWZpbmUgTExfUFdSX0dQSU9fRiAoKHVpbnQzMl90KSgmKFBXUi0+UFVDUkYpKSkKKyNkZWZpbmUgTExfUFdSX0dQSU9fRyAoKHVpbnQzMl90KSgmKFBXUi0+UFVDUkcpKSkKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFBXUl9MTF9FQ19HUElPX0JJVCBHUElPIEJJVAorICogQHsKKyAqLworI2RlZmluZSBMTF9QV1JfR1BJT19CSVRfMCAoKHVpbnQzMl90KTB4MDAwMDAwMDEpCisjZGVmaW5lIExMX1BXUl9HUElPX0JJVF8xICgodWludDMyX3QpMHgwMDAwMDAwMikKKyNkZWZpbmUgTExfUFdSX0dQSU9fQklUXzIgKCh1aW50MzJfdCkweDAwMDAwMDA0KQorI2RlZmluZSBMTF9QV1JfR1BJT19CSVRfMyAoKHVpbnQzMl90KTB4MDAwMDAwMDgpCisjZGVmaW5lIExMX1BXUl9HUElPX0JJVF80ICgodWludDMyX3QpMHgwMDAwMDAxMCkKKyNkZWZpbmUgTExfUFdSX0dQSU9fQklUXzUgKCh1aW50MzJfdCkweDAwMDAwMDIwKQorI2RlZmluZSBMTF9QV1JfR1BJT19CSVRfNiAoKHVpbnQzMl90KTB4MDAwMDAwNDApCisjZGVmaW5lIExMX1BXUl9HUElPX0JJVF83ICgodWludDMyX3QpMHgwMDAwMDA4MCkKKyNkZWZpbmUgTExfUFdSX0dQSU9fQklUXzggKCh1aW50MzJfdCkweDAwMDAwMTAwKQorI2RlZmluZSBMTF9QV1JfR1BJT19CSVRfOSAoKHVpbnQzMl90KTB4MDAwMDAyMDApCisjZGVmaW5lIExMX1BXUl9HUElPX0JJVF8xMCAoKHVpbnQzMl90KTB4MDAwMDA0MDApCisjZGVmaW5lIExMX1BXUl9HUElPX0JJVF8xMSAoKHVpbnQzMl90KTB4MDAwMDA4MDApCisjZGVmaW5lIExMX1BXUl9HUElPX0JJVF8xMiAoKHVpbnQzMl90KTB4MDAwMDEwMDApCisjZGVmaW5lIExMX1BXUl9HUElPX0JJVF8xMyAoKHVpbnQzMl90KTB4MDAwMDIwMDApCisjZGVmaW5lIExMX1BXUl9HUElPX0JJVF8xNCAoKHVpbnQzMl90KTB4MDAwMDQwMDApCisjZGVmaW5lIExMX1BXUl9HUElPX0JJVF8xNSAoKHVpbnQzMl90KTB4MDAwMDgwMDApCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFBXUl9MTF9FeHBvcnRlZF9NYWNyb3MgUFdSIEV4cG9ydGVkIE1hY3JvcworICogQHsKKyAqLworCisvKiogQGRlZmdyb3VwIFBXUl9MTF9FTV9XUklURV9SRUFEIENvbW1vbiBXcml0ZSBhbmQgcmVhZCByZWdpc3RlcnMgTWFjcm9zCisgKiBAeworICovCisKKy8qKgorICogQGJyaWVmICBXcml0ZSBhIHZhbHVlIGluIFBXUiByZWdpc3RlcgorICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHdyaXR0ZW4KKyAqIEBwYXJhbSAgX19WQUxVRV9fIFZhbHVlIHRvIGJlIHdyaXR0ZW4gaW4gdGhlIHJlZ2lzdGVyCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBMTF9QV1JfV3JpdGVSZWcoX19SRUdfXywgX19WQUxVRV9fKSBXUklURV9SRUcoUFdSLT5fX1JFR19fLCAoX19WQUxVRV9fKSkKKworLyoqCisgKiBAYnJpZWYgIFJlYWQgYSB2YWx1ZSBpbiBQV1IgcmVnaXN0ZXIKKyAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSByZWFkCisgKiBAcmV0dmFsIFJlZ2lzdGVyIHZhbHVlCisgKi8KKyNkZWZpbmUgTExfUFdSX1JlYWRSZWcoX19SRUdfXykgUkVBRF9SRUcoUFdSLT5fX1JFR19fKQorLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBQV1JfTExfRXhwb3J0ZWRfRnVuY3Rpb25zIFBXUiBFeHBvcnRlZCBGdW5jdGlvbnMKKyAqIEB7CisgKi8KKworLyoqIEBkZWZncm91cCBQV1JfTExfRUZfQ29uZmlndXJhdGlvbiBDb25maWd1cmF0aW9uCisgKiBAeworICovCisKKy8qKgorICogQGJyaWVmICBTd2l0Y2ggdGhlIHJlZ3VsYXRvciBmcm9tIG1haW4gbW9kZSB0byBsb3ctcG93ZXIgbW9kZQorICogQHJtdG9sbCBDUjEgICAgICAgICAgTFBSICAgICAgICAgICBMTF9QV1JfRW5hYmxlTG93UG93ZXJSdW5Nb2RlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0VuYWJsZUxvd1Bvd2VyUnVuTW9kZSh2b2lkKSB7CisgIFNFVF9CSVQoUFdSLT5DUjEsIFBXUl9DUjFfTFBSKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFN3aXRjaCB0aGUgcmVndWxhdG9yIGZyb20gbG93LXBvd2VyIG1vZGUgdG8gbWFpbiBtb2RlCisgKiBAcm10b2xsIENSMSAgICAgICAgICBMUFIgICAgICAgICAgIExMX1BXUl9EaXNhYmxlTG93UG93ZXJSdW5Nb2RlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0Rpc2FibGVMb3dQb3dlclJ1bk1vZGUodm9pZCkgeworICBDTEVBUl9CSVQoUFdSLT5DUjEsIFBXUl9DUjFfTFBSKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSByZWd1bGF0b3IgaXMgaW4gbG93LXBvd2VyIG1vZGUKKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIExQUiAgICAgICAgICAgTExfUFdSX0lzRW5hYmxlZExvd1Bvd2VyUnVuTW9kZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfSXNFbmFibGVkTG93UG93ZXJSdW5Nb2RlKHZvaWQpIHsKKyAgdWludDMyX3QgdGVtcDsKKyAgdGVtcCA9IFJFQURfQklUKFBXUi0+Q1IxLCBQV1JfQ1IxX0xQUik7CisKKyAgcmV0dXJuICgodGVtcCA9PSAoUFdSX0NSMV9MUFIpKSA/IDFVIDogMFUpOworfQorCisvKioKKyAqIEBicmllZiAgU3dpdGNoIGZyb20gcnVuIG1haW4gbW9kZSB0byBydW4gbG93LXBvd2VyIG1vZGUuCisgKiBAcm10b2xsIENSMSAgICAgICAgICBMUFIgICAgICAgICAgIExMX1BXUl9FbnRlckxvd1Bvd2VyUnVuTW9kZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9FbnRlckxvd1Bvd2VyUnVuTW9kZSh2b2lkKSB7CisgIExMX1BXUl9FbmFibGVMb3dQb3dlclJ1bk1vZGUoKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFN3aXRjaCBmcm9tIHJ1biBtYWluIG1vZGUgdG8gbG93LXBvd2VyIG1vZGUuCisgKiBAcm10b2xsIENSMSAgICAgICAgICBMUFIgICAgICAgICAgIExMX1BXUl9FeGl0TG93UG93ZXJSdW5Nb2RlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0V4aXRMb3dQb3dlclJ1bk1vZGUodm9pZCkgeworICBMTF9QV1JfRGlzYWJsZUxvd1Bvd2VyUnVuTW9kZSgpOworfQorCisvKioKKyAqIEBicmllZiAgU2V0IHRoZSBtYWluIGludGVybmFsIHJlZ3VsYXRvciBvdXRwdXQgdm9sdGFnZQorICogQHJtdG9sbCBDUjEgICAgICAgICAgVk9TICAgICAgICAgICBMTF9QV1JfU2V0UmVndWxWb2x0YWdlU2NhbGluZworICogQHBhcmFtICBWb2x0YWdlU2NhbGluZyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1JFR1VfVk9MVEFHRV9TQ0FMRTEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9SRUdVX1ZPTFRBR0VfU0NBTEUyCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX1NldFJlZ3VsVm9sdGFnZVNjYWxpbmcodWludDMyX3QgVm9sdGFnZVNjYWxpbmcpIHsKKyAgTU9ESUZZX1JFRyhQV1ItPkNSMSwgUFdSX0NSMV9WT1MsIFZvbHRhZ2VTY2FsaW5nKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCB0aGUgbWFpbiBpbnRlcm5hbCByZWd1bGF0b3Igb3V0cHV0IHZvbHRhZ2UKKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIFZPUyAgICAgICAgICAgTExfUFdSX0dldFJlZ3VsVm9sdGFnZVNjYWxpbmcKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9SRUdVX1ZPTFRBR0VfU0NBTEUxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUkVHVV9WT0xUQUdFX1NDQUxFMgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUFdSX0dldFJlZ3VsVm9sdGFnZVNjYWxpbmcodm9pZCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChQV1ItPkNSMSwgUFdSX0NSMV9WT1MpKTsKK30KKworI2lmIGRlZmluZWQoUFdSX0NSNV9SMU1PREUpCisvKioKKyAqIEBicmllZiAgRW5hYmxlIG1haW4gcmVndWxhdG9yIHZvbHRhZ2UgcmFuZ2UgMSBib29zdCBtb2RlCisgKiBAcm10b2xsIENSNSAgICAgICAgICBSMU1PREUgICAgICAgIExMX1BXUl9FbmFibGVSYW5nZTFCb29zdE1vZGUKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRW5hYmxlUmFuZ2UxQm9vc3RNb2RlKHZvaWQpIHsKKyAgQ0xFQVJfQklUKFBXUi0+Q1I1LCBQV1JfQ1I1X1IxTU9ERSk7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIG1haW4gcmVndWxhdG9yIHZvbHRhZ2UgcmFuZ2UgMSBib29zdCBtb2RlCisgKiBAcm10b2xsIENSNSAgICAgICAgICBSMU1PREUgICAgICAgIExMX1BXUl9EaXNhYmxlUmFuZ2UxQm9vc3RNb2RlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0Rpc2FibGVSYW5nZTFCb29zdE1vZGUodm9pZCkgeworICBTRVRfQklUKFBXUi0+Q1I1LCBQV1JfQ1I1X1IxTU9ERSk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiB0aGUgbWFpbiByZWd1bGF0b3Igdm9sdGFnZSByYW5nZSAxIGJvb3N0IG1vZGUgaXMgZW5hYmxlZAorICogQHJtdG9sbCBDUjUgICAgICAgICAgUjFNT0RFICAgICAgICBMTF9QV1JfSXNFbmFibGVkUmFuZ2UxQm9vc3RNb2RlCisgKiBAcmV0dmFsIEludmVydGVkIHN0YXRlIG9mIGJpdCAoMCBvciAxKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0VuYWJsZWRSYW5nZTFCb29zdE1vZGUodm9pZCkgeworICB1aW50MzJfdCB0ZW1wOworICB0ZW1wID0gUkVBRF9CSVQoUFdSLT5DUjUsIFBXUl9DUjVfUjFNT0RFKTsKKworICByZXR1cm4gKCh0ZW1wID09ICgwVSkpID8gMVUgOiAwVSk7Cit9CisjZW5kaWYgLyogUFdSX0NSNV9SMU1PREUgKi8KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBhY2Nlc3MgdG8gdGhlIGJhY2t1cCBkb21haW4KKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIERCUCAgICAgICAgICAgTExfUFdSX0VuYWJsZUJrVXBBY2Nlc3MKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRW5hYmxlQmtVcEFjY2Vzcyh2b2lkKSB7CisgIFNFVF9CSVQoUFdSLT5DUjEsIFBXUl9DUjFfREJQKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgYWNjZXNzIHRvIHRoZSBiYWNrdXAgZG9tYWluCisgKiBAcm10b2xsIENSMSAgICAgICAgICBEQlAgICAgICAgICAgIExMX1BXUl9EaXNhYmxlQmtVcEFjY2VzcworICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9EaXNhYmxlQmtVcEFjY2Vzcyh2b2lkKSB7CisgIENMRUFSX0JJVChQV1ItPkNSMSwgUFdSX0NSMV9EQlApOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIGJhY2t1cCBkb21haW4gaXMgZW5hYmxlZAorICogQHJtdG9sbCBDUjEgICAgICAgICAgREJQICAgICAgICAgICBMTF9QV1JfSXNFbmFibGVkQmtVcEFjY2VzcworICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfSXNFbmFibGVkQmtVcEFjY2Vzcyh2b2lkKSB7CisgIHVpbnQzMl90IHRlbXA7CisgIHRlbXAgPSBSRUFEX0JJVChQV1ItPkNSMSwgUFdSX0NSMV9EQlApOworCisgIHJldHVybiAoKHRlbXAgPT0gKFBXUl9DUjFfREJQKSkgPyAxVSA6IDBVKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFNldCBMb3ctUG93ZXIgbW9kZQorICogQHJtdG9sbCBDUjEgICAgICAgICAgTFBNUyAgICAgICAgICBMTF9QV1JfU2V0UG93ZXJNb2RlCisgKiBAcGFyYW0gIExvd1Bvd2VyTW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX01PREVfU1RPUDAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9NT0RFX1NUT1AxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfTU9ERV9TVEFOREJZCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfTU9ERV9TSFVURE9XTgorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9TZXRQb3dlck1vZGUodWludDMyX3QgTG93UG93ZXJNb2RlKSB7CisgIE1PRElGWV9SRUcoUFdSLT5DUjEsIFBXUl9DUjFfTFBNUywgTG93UG93ZXJNb2RlKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBMb3ctUG93ZXIgbW9kZQorICogQHJtdG9sbCBDUjEgICAgICAgICAgTFBNUyAgICAgICAgICBMTF9QV1JfR2V0UG93ZXJNb2RlCisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfTU9ERV9TVE9QMAorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX01PREVfU1RPUDEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9NT0RFX1NUQU5EQlkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9NT0RFX1NIVVRET1dOCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfR2V0UG93ZXJNb2RlKHZvaWQpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUFdSLT5DUjEsIFBXUl9DUjFfTFBNUykpOworfQorCisjaWYgZGVmaW5lZChQV1JfQ1IzX1VDUERfU1REQlkpCisvKioKKyAqIEBicmllZiAgRW5hYmxlIHRoZSBVU0IgVHlwZS1DIGFuZCBQb3dlciBEZWxpdmVyeSBtZW1vcml6YXRpb24gaW4gU3RhbmRieQorICogbW9kZS4KKyAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBqdXN0IGJlZm9yZSBlbnRlcmluZyBTdGFuZGJ5IG1vZGUuCisgKiBAcm10b2xsIENSMyAgICAgICAgICBVQ1BEX1NUREJZICAgIExMX1BXUl9FbmFibGVVQ1BEU3RhbmRieU1vZGUKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRW5hYmxlVUNQRFN0YW5kYnlNb2RlKHZvaWQpIHsKKyAgU0VUX0JJVChQV1ItPkNSMywgUFdSX0NSM19VQ1BEX1NUREJZKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgdGhlIFVTQiBUeXBlLUMgYW5kIFBvd2VyIERlbGl2ZXJ5IG1lbW9yaXphdGlvbiBpbiBTdGFuZGJ5CisgKiBtb2RlLgorICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGFmdGVyIGV4aXRpbmcgU3RhbmRieSBtb2RlIGFuZCBiZWZvcmUKKyAqIGFueSBVQ1BEIGNvbmZpZ3VyYXRpb24gdXBkYXRlLgorICogQHJtdG9sbCBDUjMgICAgICAgICAgVUNQRF9TVERCWSAgICAgTExfUFdSX0Rpc2FibGVVQ1BEU3RhbmRieU1vZGUKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRGlzYWJsZVVDUERTdGFuZGJ5TW9kZSh2b2lkKSB7CisgIENMRUFSX0JJVChQV1ItPkNSMywgUFdSX0NSM19VQ1BEX1NUREJZKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIHRoZSBVU0IgVHlwZS1DIGFuZCBQb3dlciBEZWxpdmVyeSBTdGFuZGJ5IG1vZGUgbWVtb3JpemF0aW9uCisgKiBzdGF0ZS4KKyAqIEBybXRvbGwgQ1IzICAgICAgICAgIFVDUERfU1REQlkgICAgICAgICAgIExMX1BXUl9Jc0VuYWJsZWRVQ1BEU3RhbmRieU1vZGUKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUFdSX0lzRW5hYmxlZFVDUERTdGFuZGJ5TW9kZSh2b2lkKSB7CisgIHJldHVybiAoKFJFQURfQklUKFBXUi0+Q1IzLCBQV1JfQ1IzX1VDUERfU1REQlkpID09IChQV1JfQ1IzX1VDUERfU1REQlkpKQorICAgICAgICAgICAgICA/IDFVTAorICAgICAgICAgICAgICA6IDBVTCk7Cit9CisjZW5kaWYgLyogUFdSX0NSM19VQ1BEX1NUREJZICovCisKKyNpZiBkZWZpbmVkKFBXUl9DUjNfVUNQRF9EQkRJUykKKy8qKgorICogQGJyaWVmICBFbmFibGUgdGhlIFVTQiBUeXBlLUMgYW5kIHBvd2VyIGRlbGl2ZXJ5IGRlYWQgYmF0dGVyeSBwdWxsLWRvd24KKyAqIGJlaGF2aW9yIG9uIFVDUEQgQ0MxIGFuZCBDQzIgcGlucy4KKyAqIEBub3RlICAgQWZ0ZXIgZXhpdGluZyByZXNldCwgdGhlIFVTQiBUeXBlLUMgZGVhZCBiYXR0ZXJ5IGJlaGF2aW9yIGlzIGVuYWJsZWQsCisgKiAgICAgICAgIHdoaWNoIG1heSBoYXZlIGEgcHVsbC1kb3duIGVmZmVjdCBvbiBDQzEgYW5kIENDMiBwaW5zLiBJdCBpcworICogcmVjb21tZW5kZWQgdG8gZGlzYWJsZSBpdCBpbiBhbGwgY2FzZXMsIGVpdGhlciB0byBzdG9wIHRoaXMgcHVsbC1kb3duIG9yIHRvCisgKiBoYW5kIG92ZXIgY29udHJvbCB0byB0aGUgVUNQRCAod2hpY2ggc2hvdWxkIHRoZXJlZm9yZSBiZSBpbml0aWFsaXplZCBiZWZvcmUKKyAqIGRvaW5nIHRoZSBkaXNhYmxlKS4KKyAqIEBybXRvbGwgQ1IzICAgICAgICAgIFVDUERfREJESVMgICAgICAgICAgIExMX1BXUl9FbmFibGVVQ1BERGVhZEJhdHRlcnkKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRW5hYmxlVUNQRERlYWRCYXR0ZXJ5KHZvaWQpIHsKKyAgQ0xFQVJfQklUKFBXUi0+Q1IzLCBQV1JfQ1IzX1VDUERfREJESVMpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSB0aGUgVVNCIFR5cGUtQyBhbmQgcG93ZXIgZGVsaXZlcnkgZGVhZCBiYXR0ZXJ5IHB1bGwtZG93bgorICogYmVoYXZpb3Igb24gVUNQRCBDQzEgYW5kIENDMiBwaW5zLgorICogQG5vdGUgICBBZnRlciBleGl0aW5nIHJlc2V0LCB0aGUgVVNCIFR5cGUtQyBkZWFkIGJhdHRlcnkgYmVoYXZpb3IgaXMgZW5hYmxlZCwKKyAqICAgICAgICAgd2hpY2ggbWF5IGhhdmUgYSBwdWxsLWRvd24gZWZmZWN0IG9uIENDMSBhbmQgQ0MyIHBpbnMuIEl0IGlzCisgKiByZWNvbW1lbmRlZCB0byBkaXNhYmxlIGl0IGluIGFsbCBjYXNlcywgZWl0aGVyIHRvIHN0b3AgdGhpcyBwdWxsLWRvd24gb3IgdG8KKyAqIGhhbmQgb3ZlciBjb250cm9sIHRvIHRoZSBVQ1BEICh3aGljaCBzaG91bGQgdGhlcmVmb3JlIGJlIGluaXRpYWxpemVkIGJlZm9yZQorICogZG9pbmcgdGhlIGRpc2FibGUpLgorICogQHJtdG9sbCBDUjMgICAgICAgICAgVUNQRF9EQkRJUyAgICAgICAgICAgTExfUFdSX0Rpc2FibGVVQ1BERGVhZEJhdHRlcnkKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRGlzYWJsZVVDUEREZWFkQmF0dGVyeSh2b2lkKSB7CisgIFNFVF9CSVQoUFdSLT5DUjMsIFBXUl9DUjNfVUNQRF9EQkRJUyk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayB0aGUgVVNCIFR5cGUtQyBhbmQgcG93ZXIgZGVsaXZlcnkgZGVhZCBiYXR0ZXJ5IHB1bGwtZG93bgorICogYmVoYXZpb3Igb24gVUNQRCBDQzEgYW5kIENDMiBwaW5zLgorICogQG5vdGUgICBBZnRlciBleGl0aW5nIHJlc2V0LCB0aGUgVVNCIFR5cGUtQyBkZWFkIGJhdHRlcnkgYmVoYXZpb3IgaXMgZW5hYmxlZCwKKyAqICAgICAgICAgd2hpY2ggbWF5IGhhdmUgYSBwdWxsLWRvd24gZWZmZWN0IG9uIENDMSBhbmQgQ0MyIHBpbnMuIEl0IGlzCisgKiByZWNvbW1lbmRlZCB0byBkaXNhYmxlIGl0IGluIGFsbCBjYXNlcywgZWl0aGVyIHRvIHN0b3AgdGhpcyBwdWxsLWRvd24gb3IgdG8KKyAqIGhhbmQgb3ZlciBjb250cm9sIHRvIHRoZSBVQ1BEICh3aGljaCBzaG91bGQgdGhlcmVmb3JlIGJlIGluaXRpYWxpemVkIGJlZm9yZQorICogZG9pbmcgdGhlIGRpc2FibGUpLgorICogQHJtdG9sbCBDUjMgICAgICAgICAgVUNQRF9EQkRJUyAgICAgICAgICAgTExfUFdSX0lzRW5hYmxlZFVDUEREZWFkQmF0dGVyeQorICogQHJldHZhbCBTdGF0ZSBvZiBmZWF0dXJlICgxIDogZW5hYmxlZDsgMCA6IGRpc2FibGVkKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0VuYWJsZWRVQ1BERGVhZEJhdHRlcnkodm9pZCkgeworICByZXR1cm4gKChSRUFEX0JJVChQV1ItPkNSMywgUFdSX0NSM19VQ1BEX0RCRElTKSA9PSAoUFdSX0NSM19VQ1BEX0RCRElTKSkKKyAgICAgICAgICAgICAgPyAwVUwKKyAgICAgICAgICAgICAgOiAxVUwpOworfQorI2VuZGlmIC8qIFBXUl9DUjNfVUNQRF9EQkRJUyAqLworCisjaWYgZGVmaW5lZChQV1JfQ1IyX1VTVikKKy8qKgorICogQGJyaWVmICBFbmFibGUgVkREVVNCIHN1cHBseQorICogQHJtdG9sbCBDUjIgICAgICAgICAgVVNWICAgICAgICAgICBMTF9QV1JfRW5hYmxlVmRkVVNCCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0VuYWJsZVZkZFVTQih2b2lkKSB7CisgIFNFVF9CSVQoUFdSLT5DUjIsIFBXUl9DUjJfVVNWKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgVkREVVNCIHN1cHBseQorICogQHJtdG9sbCBDUjIgICAgICAgICAgVVNWICAgICAgICAgICBMTF9QV1JfRGlzYWJsZVZkZFVTQgorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9EaXNhYmxlVmRkVVNCKHZvaWQpIHsKKyAgQ0xFQVJfQklUKFBXUi0+Q1IyLCBQV1JfQ1IyX1VTVik7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiBWRERVU0Igc3VwcGx5IGlzIGVuYWJsZWQKKyAqIEBybXRvbGwgQ1IyICAgICAgICAgIFVTViAgICAgICAgICAgTExfUFdSX0lzRW5hYmxlZFZkZFVTQgorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfSXNFbmFibGVkVmRkVVNCKHZvaWQpIHsKKyAgdWludDMyX3QgdGVtcDsKKyAgdGVtcCA9IFJFQURfQklUKFBXUi0+Q1IyLCBQV1JfQ1IyX1VTVik7CisKKyAgcmV0dXJuICgodGVtcCA9PSAoUFdSX0NSMl9VU1YpKSA/IDFVIDogMFUpOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBXUl9DUjJfSU9TVikKKy8qKgorICogQGJyaWVmICBFbmFibGUgVkRESU8yIHN1cHBseQorICogQHJtdG9sbCBDUjIgICAgICAgICAgSU9TViAgICAgICAgICBMTF9QV1JfRW5hYmxlVmRkSU8yCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0VuYWJsZVZkZElPMih2b2lkKSB7CisgIFNFVF9CSVQoUFdSLT5DUjIsIFBXUl9DUjJfSU9TVik7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIFZERElPMiBzdXBwbHkKKyAqIEBybXRvbGwgQ1IyICAgICAgICAgIElPU1YgICAgICAgICAgTExfUFdSX0Rpc2FibGVWZGRJTzIKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRGlzYWJsZVZkZElPMih2b2lkKSB7CisgIENMRUFSX0JJVChQV1ItPkNSMiwgUFdSX0NSMl9JT1NWKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIFZERElPMiBzdXBwbHkgaXMgZW5hYmxlZAorICogQHJtdG9sbCBDUjIgICAgICAgICAgSU9TViAgICAgICAgICBMTF9QV1JfSXNFbmFibGVkVmRkSU8yCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0VuYWJsZWRWZGRJTzIodm9pZCkgeworICB1aW50MzJfdCB0ZW1wOworICB0ZW1wID0gUkVBRF9CSVQoUFdSLT5DUjIsIFBXUl9DUjJfSU9TVik7CisKKyAgcmV0dXJuICgodGVtcCA9PSAoUFdSX0NSMl9JT1NWKSkgPyAxVSA6IDBVKTsKK30KKyNlbmRpZgorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIHRoZSBQb3dlciBWb2x0YWdlIE1vbml0b3Jpbmcgb24gYSBwZXJpcGhlcmFsCisgKiBAcm10b2xsIENSMiAgICAgICAgICBQVk1FMSAgICAgICAgIExMX1BXUl9FbmFibGVQVk1cbgorICogICAgICAgICBDUjIgICAgICAgICAgUFZNRTIgICAgICAgICBMTF9QV1JfRW5hYmxlUFZNXG4KKyAqICAgICAgICAgQ1IyICAgICAgICAgIFBWTUUzICAgICAgICAgTExfUFdSX0VuYWJsZVBWTVxuCisgKiAgICAgICAgIENSMiAgICAgICAgICBQVk1FNCAgICAgICAgIExMX1BXUl9FbmFibGVQVk0KKyAqIEBwYXJhbSAgUGVyaXBoVm9sdGFnZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1BWTV9WRERBX0NPTVAgICAgICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1BWTV9WRERBX0ZBU1REQUMgICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1BWTV9WRERBX0FEQworICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1BWTV9WRERBX09QQU1QX0RBQworICoKKyAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0VuYWJsZVBWTSh1aW50MzJfdCBQZXJpcGhWb2x0YWdlKSB7CisgIFNFVF9CSVQoUFdSLT5DUjIsIFBlcmlwaFZvbHRhZ2UpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSB0aGUgUG93ZXIgVm9sdGFnZSBNb25pdG9yaW5nIG9uIGEgcGVyaXBoZXJhbAorICogQHJtdG9sbCBDUjIgICAgICAgICAgUFZNRTEgICAgICAgICBMTF9QV1JfRGlzYWJsZVBWTVxuCisgKiAgICAgICAgIENSMiAgICAgICAgICBQVk1FMiAgICAgICAgIExMX1BXUl9EaXNhYmxlUFZNXG4KKyAqICAgICAgICAgQ1IyICAgICAgICAgIFBWTUUzICAgICAgICAgTExfUFdSX0Rpc2FibGVQVk1cbgorICogICAgICAgICBDUjIgICAgICAgICAgUFZNRTQgICAgICAgICBMTF9QV1JfRGlzYWJsZVBWTQorICogQHBhcmFtICBQZXJpcGhWb2x0YWdlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZNX1ZEREFfQ09NUCAgICAgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZNX1ZEREFfRkFTVERBQyAgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZNX1ZEREFfQURDCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZNX1ZEREFfT1BBTVBfREFDCisgKgorICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRGlzYWJsZVBWTSh1aW50MzJfdCBQZXJpcGhWb2x0YWdlKSB7CisgIENMRUFSX0JJVChQV1ItPkNSMiwgUGVyaXBoVm9sdGFnZSk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiBQb3dlciBWb2x0YWdlIE1vbml0b3JpbmcgaXMgZW5hYmxlZCBvbiBhIHBlcmlwaGVyYWwKKyAqIEBybXRvbGwgQ1IyICAgICAgICAgIFBWTUUxICAgICAgICAgTExfUFdSX0lzRW5hYmxlZFBWTVxuCisgKiAgICAgICAgIENSMiAgICAgICAgICBQVk1FMiAgICAgICAgIExMX1BXUl9Jc0VuYWJsZWRQVk1cbgorICogICAgICAgICBDUjIgICAgICAgICAgUFZNRTMgICAgICAgICBMTF9QV1JfSXNFbmFibGVkUFZNXG4KKyAqICAgICAgICAgQ1IyICAgICAgICAgIFBWTUU0ICAgICAgICAgTExfUFdSX0lzRW5hYmxlZFBWTQorICogQHBhcmFtICBQZXJpcGhWb2x0YWdlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZNX1ZEREFfQ09NUCAgICAgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZNX1ZEREFfRkFTVERBQyAgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZNX1ZEREFfQURDCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZNX1ZEREFfT1BBTVBfREFDCisgKgorICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUFdSX0lzRW5hYmxlZFBWTSh1aW50MzJfdCBQZXJpcGhWb2x0YWdlKSB7CisgIHVpbnQzMl90IHRlbXA7CisgIHRlbXAgPSBSRUFEX0JJVChQV1ItPkNSMiwgUGVyaXBoVm9sdGFnZSk7CisKKyAgcmV0dXJuICgodGVtcCA9PSAoUGVyaXBoVm9sdGFnZSkpID8gMVUgOiAwVSk7Cit9CisKKy8qKgorICogQGJyaWVmICBDb25maWd1cmUgdGhlIHZvbHRhZ2UgdGhyZXNob2xkIGRldGVjdGVkIGJ5IHRoZSBQb3dlciBWb2x0YWdlCisgKiBEZXRlY3RvcgorICogQHJtdG9sbCBDUjIgICAgICAgICAgUExTICAgICAgICAgICBMTF9QV1JfU2V0UFZETGV2ZWwKKyAqIEBwYXJhbSAgUFZETGV2ZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9QVkRMRVZFTF8wCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZETEVWRUxfMQorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1BWRExFVkVMXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9QVkRMRVZFTF8zCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZETEVWRUxfNAorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1BWRExFVkVMXzUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9QVkRMRVZFTF82CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZETEVWRUxfNworICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9TZXRQVkRMZXZlbCh1aW50MzJfdCBQVkRMZXZlbCkgeworICBNT0RJRllfUkVHKFBXUi0+Q1IyLCBQV1JfQ1IyX1BMUywgUFZETGV2ZWwpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IHRoZSB2b2x0YWdlIHRocmVzaG9sZCBkZXRlY3Rpb24KKyAqIEBybXRvbGwgQ1IyICAgICAgICAgIFBMUyAgICAgICAgICAgTExfUFdSX0dldFBWRExldmVsCisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZETEVWRUxfMAorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1BWRExFVkVMXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9QVkRMRVZFTF8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZETEVWRUxfMworICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1BWRExFVkVMXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9QVkRMRVZFTF81CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZETEVWRUxfNgorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1BWRExFVkVMXzcKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9HZXRQVkRMZXZlbCh2b2lkKSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFBXUi0+Q1IyLCBQV1JfQ1IyX1BMUykpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIFBvd2VyIFZvbHRhZ2UgRGV0ZWN0b3IKKyAqIEBybXRvbGwgQ1IyICAgICAgICAgIFBWREUgICAgICAgICAgTExfUFdSX0VuYWJsZVBWRAorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9FbmFibGVQVkQodm9pZCkgeyBTRVRfQklUKFBXUi0+Q1IyLCBQV1JfQ1IyX1BWREUpOyB9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIFBvd2VyIFZvbHRhZ2UgRGV0ZWN0b3IKKyAqIEBybXRvbGwgQ1IyICAgICAgICAgIFBWREUgICAgICAgICAgTExfUFdSX0Rpc2FibGVQVkQKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRGlzYWJsZVBWRCh2b2lkKSB7CisgIENMRUFSX0JJVChQV1ItPkNSMiwgUFdSX0NSMl9QVkRFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIFBvd2VyIFZvbHRhZ2UgRGV0ZWN0b3IgaXMgZW5hYmxlZAorICogQHJtdG9sbCBDUjIgICAgICAgICAgUFZERSAgICAgICAgICBMTF9QV1JfSXNFbmFibGVkUFZECisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0VuYWJsZWRQVkQodm9pZCkgeworICB1aW50MzJfdCB0ZW1wOworICB0ZW1wID0gUkVBRF9CSVQoUFdSLT5DUjIsIFBXUl9DUjJfUFZERSk7CisKKyAgcmV0dXJuICgodGVtcCA9PSAoUFdSX0NSMl9QVkRFKSkgPyAxVSA6IDBVKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBJbnRlcm5hbCBXYWtlLXVwIGxpbmUKKyAqIEBybXRvbGwgQ1IzICAgICAgICAgIEVJV0YgICAgICAgICAgTExfUFdSX0VuYWJsZUludGVybldVCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0VuYWJsZUludGVybldVKHZvaWQpIHsKKyAgU0VUX0JJVChQV1ItPkNSMywgUFdSX0NSM19FSVdGKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgSW50ZXJuYWwgV2FrZS11cCBsaW5lCisgKiBAcm10b2xsIENSMyAgICAgICAgICBFSVdGICAgICAgICAgIExMX1BXUl9EaXNhYmxlSW50ZXJuV1UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRGlzYWJsZUludGVybldVKHZvaWQpIHsKKyAgQ0xFQVJfQklUKFBXUi0+Q1IzLCBQV1JfQ1IzX0VJV0YpOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgSW50ZXJuYWwgV2FrZS11cCBsaW5lIGlzIGVuYWJsZWQKKyAqIEBybXRvbGwgQ1IzICAgICAgICAgIEVJV0YgICAgICAgICAgTExfUFdSX0lzRW5hYmxlZEludGVybldVCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0VuYWJsZWRJbnRlcm5XVSh2b2lkKSB7CisgIHJldHVybiAoKFJFQURfQklUKFBXUi0+Q1IzLCBQV1JfQ1IzX0VJV0YpID09IChQV1JfQ1IzX0VJV0YpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgcHVsbC11cCBhbmQgcHVsbC1kb3duIGNvbmZpZ3VyYXRpb24KKyAqIEBybXRvbGwgQ1IzICAgICAgICAgIEFQQyAgICAgICAgICAgTExfUFdSX0VuYWJsZVBVUERDZmcKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRW5hYmxlUFVQRENmZyh2b2lkKSB7CisgIFNFVF9CSVQoUFdSLT5DUjMsIFBXUl9DUjNfQVBDKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgcHVsbC11cCBhbmQgcHVsbC1kb3duIGNvbmZpZ3VyYXRpb24KKyAqIEBybXRvbGwgQ1IzICAgICAgICAgIEFQQyAgICAgICAgICAgTExfUFdSX0Rpc2FibGVQVVBEQ2ZnCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0Rpc2FibGVQVVBEQ2ZnKHZvaWQpIHsKKyAgQ0xFQVJfQklUKFBXUi0+Q1IzLCBQV1JfQ1IzX0FQQyk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiBwdWxsLXVwIGFuZCBwdWxsLWRvd24gY29uZmlndXJhdGlvbiAgaXMgZW5hYmxlZAorICogQHJtdG9sbCBDUjMgICAgICAgICAgQVBDICAgICAgICAgICBMTF9QV1JfSXNFbmFibGVkUFVQRENmZworICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfSXNFbmFibGVkUFVQRENmZyh2b2lkKSB7CisgIHVpbnQzMl90IHRlbXA7CisgIHRlbXAgPSBSRUFEX0JJVChQV1ItPkNSMywgUFdSX0NSM19BUEMpOworCisgIHJldHVybiAoKHRlbXAgPT0gKFBXUl9DUjNfQVBDKSkgPyAxVSA6IDBVKTsKK30KKworI2lmIGRlZmluZWQoU1JBTTJfQkFTRSkKKy8qKgorICogQGJyaWVmICBFbmFibGUgU1JBTTIgY29udGVudCByZXRlbnRpb24gaW4gU3RhbmRieSBtb2RlCisgKiBAcm10b2xsIENSMyAgICAgICAgICBSUlMgICAgICAgICAgIExMX1BXUl9FbmFibGVTUkFNMlJldGVudGlvbgorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9FbmFibGVTUkFNMlJldGVudGlvbih2b2lkKSB7CisgIFNFVF9CSVQoUFdSLT5DUjMsIFBXUl9DUjNfUlJTKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgU1JBTTIgY29udGVudCByZXRlbnRpb24gaW4gU3RhbmRieSBtb2RlCisgKiBAcm10b2xsIENSMyAgICAgICAgICBSUlMgICAgICAgICAgIExMX1BXUl9EaXNhYmxlU1JBTTJSZXRlbnRpb24KKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRGlzYWJsZVNSQU0yUmV0ZW50aW9uKHZvaWQpIHsKKyAgQ0xFQVJfQklUKFBXUi0+Q1IzLCBQV1JfQ1IzX1JSUyk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiBTUkFNMiBjb250ZW50IHJldGVudGlvbiBpbiBTdGFuZGJ5IG1vZGUgIGlzIGVuYWJsZWQKKyAqIEBybXRvbGwgQ1IzICAgICAgICAgIFJSUyAgICAgICAgICAgTExfUFdSX0lzRW5hYmxlZFNSQU0yUmV0ZW50aW9uCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0VuYWJsZWRTUkFNMlJldGVudGlvbih2b2lkKSB7CisgIHVpbnQzMl90IHRlbXA7CisgIHRlbXAgPSBSRUFEX0JJVChQV1ItPkNSMywgUFdSX0NSM19SUlMpOworCisgIHJldHVybiAoKHRlbXAgPT0gKFBXUl9DUjNfUlJTKSkgPyAxVSA6IDBVKTsKK30KKworI2VuZGlmIC8qIFNSQU0yX0JBU0UgKi8KKy8qKgorICogQGJyaWVmICBFbmFibGUgdGhlIFdha2VVcCBQSU54IGZ1bmN0aW9uYWxpdHkKKyAqIEBybXRvbGwgQ1IzICAgICAgICAgIEVXVVAxICAgICAgICAgTExfUFdSX0VuYWJsZVdha2VVcFBpblxuCisgKiAgICAgICAgIENSMyAgICAgICAgICBFV1VQMiAgICAgICAgIExMX1BXUl9FbmFibGVXYWtlVXBQaW5cbgorICogICAgICAgICBDUjMgICAgICAgICAgRVdVUDMgICAgICAgICBMTF9QV1JfRW5hYmxlV2FrZVVwUGluXG4KKyAqICAgICAgICAgQ1IzICAgICAgICAgIEVXVVA0ICAgICAgICAgTExfUFdSX0VuYWJsZVdha2VVcFBpblxuCisgKiAgICAgICAgIENSMyAgICAgICAgICBFV1VQNSAgICAgICAgIExMX1BXUl9FbmFibGVXYWtlVXBQaW5cbgorICogQHBhcmFtICBXYWtlVXBQaW4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9XQUtFVVBfUElOMQorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1dBS0VVUF9QSU4yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9XQUtFVVBfUElONAorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1dBS0VVUF9QSU41CisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0VuYWJsZVdha2VVcFBpbih1aW50MzJfdCBXYWtlVXBQaW4pIHsKKyAgU0VUX0JJVChQV1ItPkNSMywgV2FrZVVwUGluKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgdGhlIFdha2VVcCBQSU54IGZ1bmN0aW9uYWxpdHkKKyAqIEBybXRvbGwgQ1IzICAgICAgICAgIEVXVVAxICAgICAgICAgTExfUFdSX0Rpc2FibGVXYWtlVXBQaW5cbgorICogICAgICAgICBDUjMgICAgICAgICAgRVdVUDIgICAgICAgICBMTF9QV1JfRGlzYWJsZVdha2VVcFBpblxuCisgKiAgICAgICAgIENSMyAgICAgICAgICBFV1VQMyAgICAgICAgIExMX1BXUl9EaXNhYmxlV2FrZVVwUGluXG4KKyAqICAgICAgICAgQ1IzICAgICAgICAgIEVXVVA0ICAgICAgICAgTExfUFdSX0Rpc2FibGVXYWtlVXBQaW5cbgorICogICAgICAgICBDUjMgICAgICAgICAgRVdVUDUgICAgICAgICBMTF9QV1JfRGlzYWJsZVdha2VVcFBpblxuCisgKiBAcGFyYW0gIFdha2VVcFBpbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1dBS0VVUF9QSU4xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9XQUtFVVBfUElOMworICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1dBS0VVUF9QSU40CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjUKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRGlzYWJsZVdha2VVcFBpbih1aW50MzJfdCBXYWtlVXBQaW4pIHsKKyAgQ0xFQVJfQklUKFBXUi0+Q1IzLCBXYWtlVXBQaW4pOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFdha2VVcCBQSU54IGZ1bmN0aW9uYWxpdHkgaXMgZW5hYmxlZAorICogQHJtdG9sbCBDUjMgICAgICAgICAgRVdVUDEgICAgICAgICBMTF9QV1JfSXNFbmFibGVkV2FrZVVwUGluXG4KKyAqICAgICAgICAgQ1IzICAgICAgICAgIEVXVVAyICAgICAgICAgTExfUFdSX0lzRW5hYmxlZFdha2VVcFBpblxuCisgKiAgICAgICAgIENSMyAgICAgICAgICBFV1VQMyAgICAgICAgIExMX1BXUl9Jc0VuYWJsZWRXYWtlVXBQaW5cbgorICogICAgICAgICBDUjMgICAgICAgICAgRVdVUDQgICAgICAgICBMTF9QV1JfSXNFbmFibGVkV2FrZVVwUGluXG4KKyAqICAgICAgICAgQ1IzICAgICAgICAgIEVXVVA1ICAgICAgICAgTExfUFdSX0lzRW5hYmxlZFdha2VVcFBpblxuCisgKiBAcGFyYW0gIFdha2VVcFBpbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1dBS0VVUF9QSU4xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9XQUtFVVBfUElOMworICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1dBS0VVUF9QSU40CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjUKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUFdSX0lzRW5hYmxlZFdha2VVcFBpbih1aW50MzJfdCBXYWtlVXBQaW4pIHsKKyAgdWludDMyX3QgdGVtcDsKKyAgdGVtcCA9IFJFQURfQklUKFBXUi0+Q1IzLCBXYWtlVXBQaW4pOworCisgIHJldHVybiAoKHRlbXAgPT0gKFdha2VVcFBpbikpID8gMVUgOiAwVSk7Cit9CisKKy8qKgorICogQGJyaWVmICBTZXQgdGhlIHJlc2lzdG9yIGltcGVkYW5jZQorICogQHJtdG9sbCBDUjQgICAgICAgICAgVkJSUyAgICAgICAgICBMTF9QV1JfU2V0QmF0dENoYXJnUmVzaXN0b3IKKyAqIEBwYXJhbSAgUmVzaXN0b3IgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9CQVRUX0NIQVJHX1JFU0lTVE9SXzVLCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfQkFUVF9DSEFSR1JFU0lTVE9SXzFfNUsKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfU2V0QmF0dENoYXJnUmVzaXN0b3IodWludDMyX3QgUmVzaXN0b3IpIHsKKyAgTU9ESUZZX1JFRyhQV1ItPkNSNCwgUFdSX0NSNF9WQlJTLCBSZXNpc3Rvcik7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgdGhlIHJlc2lzdG9yIGltcGVkYW5jZQorICogQHJtdG9sbCBDUjQgICAgICAgICAgVkJSUyAgICAgICAgICBMTF9QV1JfR2V0QmF0dENoYXJnUmVzaXN0b3IKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9CQVRUX0NIQVJHX1JFU0lTVE9SXzVLCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfQkFUVF9DSEFSR1JFU0lTVE9SXzFfNUsKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9HZXRCYXR0Q2hhcmdSZXNpc3Rvcih2b2lkKSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFBXUi0+Q1I0LCBQV1JfQ1I0X1ZCUlMpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBiYXR0ZXJ5IGNoYXJnaW5nCisgKiBAcm10b2xsIENSNCAgICAgICAgICBWQkUgICAgICAgICAgIExMX1BXUl9FbmFibGVCYXR0ZXJ5Q2hhcmdpbmcKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRW5hYmxlQmF0dGVyeUNoYXJnaW5nKHZvaWQpIHsKKyAgU0VUX0JJVChQV1ItPkNSNCwgUFdSX0NSNF9WQkUpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBiYXR0ZXJ5IGNoYXJnaW5nCisgKiBAcm10b2xsIENSNCAgICAgICAgICBWQkUgICAgICAgICAgIExMX1BXUl9EaXNhYmxlQmF0dGVyeUNoYXJnaW5nCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0Rpc2FibGVCYXR0ZXJ5Q2hhcmdpbmcodm9pZCkgeworICBDTEVBUl9CSVQoUFdSLT5DUjQsIFBXUl9DUjRfVkJFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIGJhdHRlcnkgY2hhcmdpbmcgaXMgZW5hYmxlZAorICogQHJtdG9sbCBDUjQgICAgICAgICAgVkJFICAgICAgICAgICBMTF9QV1JfSXNFbmFibGVkQmF0dGVyeUNoYXJnaW5nCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0VuYWJsZWRCYXR0ZXJ5Q2hhcmdpbmcodm9pZCkgeworICB1aW50MzJfdCB0ZW1wOworICB0ZW1wID0gUkVBRF9CSVQoUFdSLT5DUjQsIFBXUl9DUjRfVkJFKTsKKworICByZXR1cm4gKCh0ZW1wID09IChQV1JfQ1I0X1ZCRSkpID8gMVUgOiAwVSk7Cit9CisKKy8qKgorICogQGJyaWVmICBTZXQgdGhlIFdha2UtVXAgcGluIHBvbGFyaXR5IGxvdyBmb3IgdGhlIGV2ZW50IGRldGVjdGlvbgorICogQHJtdG9sbCBDUjQgICAgICAgICAgV1AxICAgICAgICAgICBMTF9QV1JfU2V0V2FrZVVwUGluUG9sYXJpdHlMb3dcbgorICogICAgICAgICBDUjQgICAgICAgICAgV1AyICAgICAgICAgICBMTF9QV1JfU2V0V2FrZVVwUGluUG9sYXJpdHlMb3dcbgorICogICAgICAgICBDUjQgICAgICAgICAgV1AzICAgICAgICAgICBMTF9QV1JfU2V0V2FrZVVwUGluUG9sYXJpdHlMb3dcbgorICogICAgICAgICBDUjQgICAgICAgICAgV1A0ICAgICAgICAgICBMTF9QV1JfU2V0V2FrZVVwUGluUG9sYXJpdHlMb3dcbgorICogICAgICAgICBDUjQgICAgICAgICAgV1A1ICAgICAgICAgICBMTF9QV1JfU2V0V2FrZVVwUGluUG9sYXJpdHlMb3cKKyAqIEBwYXJhbSAgV2FrZVVwUGluIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9XQUtFVVBfUElOMgorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1dBS0VVUF9QSU4zCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9XQUtFVVBfUElONQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9TZXRXYWtlVXBQaW5Qb2xhcml0eUxvdyh1aW50MzJfdCBXYWtlVXBQaW4pIHsKKyAgU0VUX0JJVChQV1ItPkNSNCwgV2FrZVVwUGluKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFNldCB0aGUgV2FrZS1VcCBwaW4gcG9sYXJpdHkgaGlnaCBmb3IgdGhlIGV2ZW50IGRldGVjdGlvbgorICogQHJtdG9sbCBDUjQgICAgICAgICAgV1AxICAgICAgICAgICBMTF9QV1JfU2V0V2FrZVVwUGluUG9sYXJpdHlIaWdoXG4KKyAqICAgICAgICAgQ1I0ICAgICAgICAgIFdQMiAgICAgICAgICAgTExfUFdSX1NldFdha2VVcFBpblBvbGFyaXR5SGlnaFxuCisgKiAgICAgICAgIENSNCAgICAgICAgICBXUDMgICAgICAgICAgIExMX1BXUl9TZXRXYWtlVXBQaW5Qb2xhcml0eUhpZ2hcbgorICogICAgICAgICBDUjQgICAgICAgICAgV1A0ICAgICAgICAgICBMTF9QV1JfU2V0V2FrZVVwUGluUG9sYXJpdHlIaWdoXG4KKyAqICAgICAgICAgQ1I0ICAgICAgICAgIFdQNSAgICAgICAgICAgTExfUFdSX1NldFdha2VVcFBpblBvbGFyaXR5SGlnaAorICogQHBhcmFtICBXYWtlVXBQaW4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9XQUtFVVBfUElOMQorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1dBS0VVUF9QSU4yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9XQUtFVVBfUElONAorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1dBS0VVUF9QSU41CisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX1NldFdha2VVcFBpblBvbGFyaXR5SGlnaCh1aW50MzJfdCBXYWtlVXBQaW4pIHsKKyAgQ0xFQVJfQklUKFBXUi0+Q1I0LCBXYWtlVXBQaW4pOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IHRoZSBXYWtlLVVwIHBpbiBwb2xhcml0eSBmb3IgdGhlIGV2ZW50IGRldGVjdGlvbgorICogQHJtdG9sbCBDUjQgICAgICAgICAgV1AxICAgICAgICAgICBMTF9QV1JfSXNXYWtlVXBQaW5Qb2xhcml0eUxvd1xuCisgKiAgICAgICAgIENSNCAgICAgICAgICBXUDIgICAgICAgICAgIExMX1BXUl9Jc1dha2VVcFBpblBvbGFyaXR5TG93XG4KKyAqICAgICAgICAgQ1I0ICAgICAgICAgIFdQMyAgICAgICAgICAgTExfUFdSX0lzV2FrZVVwUGluUG9sYXJpdHlMb3dcbgorICogICAgICAgICBDUjQgICAgICAgICAgV1A0ICAgICAgICAgICBMTF9QV1JfSXNXYWtlVXBQaW5Qb2xhcml0eUxvd1xuCisgKiAgICAgICAgIENSNCAgICAgICAgICBXUDUgICAgICAgICAgIExMX1BXUl9Jc1dha2VVcFBpblBvbGFyaXR5TG93CisgKiBAcGFyYW0gIFdha2VVcFBpbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1dBS0VVUF9QSU4xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9XQUtFVVBfUElOMworICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1dBS0VVUF9QSU40CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjUKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUFdSX0lzV2FrZVVwUGluUG9sYXJpdHlMb3codWludDMyX3QgV2FrZVVwUGluKSB7CisgIHVpbnQzMl90IHRlbXA7CisgIHRlbXAgPSBSRUFEX0JJVChQV1ItPkNSNCwgV2FrZVVwUGluKTsKKworICByZXR1cm4gKCh0ZW1wID09IChXYWtlVXBQaW4pKSA/IDFVIDogMFUpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIEdQSU8gcHVsbC11cCBzdGF0ZSBpbiBTdGFuZGJ5IGFuZCBTaHV0ZG93biBtb2RlcworICogQHJtdG9sbCBQVUNSQSAgICAgICAgUFUwLTE1ICAgICAgICBMTF9QV1JfRW5hYmxlR1BJT1B1bGxVcFxuCisgKiAgICAgICAgIFBVQ1JCICAgICAgICBQVTAtMTUgICAgICAgIExMX1BXUl9FbmFibGVHUElPUHVsbFVwXG4KKyAqICAgICAgICAgUFVDUkMgICAgICAgIFBVMC0xNSAgICAgICAgTExfUFdSX0VuYWJsZUdQSU9QdWxsVXBcbgorICogICAgICAgICBQVUNSRCAgICAgICAgUFUwLTE1ICAgICAgICBMTF9QV1JfRW5hYmxlR1BJT1B1bGxVcFxuCisgKiAgICAgICAgIFBVQ1JFICAgICAgICBQVTAtMTUgICAgICAgIExMX1BXUl9FbmFibGVHUElPUHVsbFVwXG4KKyAqICAgICAgICAgUFVDUkYgICAgICAgIFBVMC0xNSAgICAgICAgTExfUFdSX0VuYWJsZUdQSU9QdWxsVXBcbgorICogICAgICAgICBQVUNSRyAgICAgICAgUFUwLTE1ICAgICAgICBMTF9QV1JfRW5hYmxlR1BJT1B1bGxVcFxuCisgKiBAcGFyYW0gIEdQSU8gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0EKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0IKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0MKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0QKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0UKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0YKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0cKKyAqCisgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcworICogQHBhcmFtICBHUElPTnVtYmVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMAorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMworICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF81CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfNgorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF84CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfOQorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzEwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMTEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xMgorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzEzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMTQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xNQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9FbmFibGVHUElPUHVsbFVwKHVpbnQzMl90IEdQSU8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBHUElPTnVtYmVyKSB7CisgIFNFVF9CSVQoKigoX19JTyB1aW50MzJfdCAqKUdQSU8pLCBHUElPTnVtYmVyKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgR1BJTyBwdWxsLXVwIHN0YXRlIGluIFN0YW5kYnkgYW5kIFNodXRkb3duIG1vZGVzCisgKiBAcm10b2xsIFBVQ1JBICAgICAgICBQVTAtMTUgICAgICAgIExMX1BXUl9EaXNhYmxlR1BJT1B1bGxVcFxuCisgKiAgICAgICAgIFBVQ1JCICAgICAgICBQVTAtMTUgICAgICAgIExMX1BXUl9EaXNhYmxlR1BJT1B1bGxVcFxuCisgKiAgICAgICAgIFBVQ1JDICAgICAgICBQVTAtMTUgICAgICAgIExMX1BXUl9EaXNhYmxlR1BJT1B1bGxVcFxuCisgKiAgICAgICAgIFBVQ1JEICAgICAgICBQVTAtMTUgICAgICAgIExMX1BXUl9EaXNhYmxlR1BJT1B1bGxVcFxuCisgKiAgICAgICAgIFBVQ1JFICAgICAgICBQVTAtMTUgICAgICAgIExMX1BXUl9EaXNhYmxlR1BJT1B1bGxVcFxuCisgKiAgICAgICAgIFBVQ1JGICAgICAgICBQVTAtMTUgICAgICAgIExMX1BXUl9EaXNhYmxlR1BJT1B1bGxVcFxuCisgKiAgICAgICAgIFBVQ1JHICAgICAgICBQVTAtMTUgICAgICAgIExMX1BXUl9EaXNhYmxlR1BJT1B1bGxVcFxuCisgKiBAcGFyYW0gIEdQSU8gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0EKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0IKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0MKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0QKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0UKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0YKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0cKKyAqCisgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcworICogQHBhcmFtICBHUElPTnVtYmVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMAorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMworICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF81CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfNgorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF84CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfOQorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzEwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMTEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xMgorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzEzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMTQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xNQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9EaXNhYmxlR1BJT1B1bGxVcCh1aW50MzJfdCBHUElPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEdQSU9OdW1iZXIpIHsKKyAgQ0xFQVJfQklUKCooKF9fSU8gdWludDMyX3QgKilHUElPKSwgR1BJT051bWJlcik7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiBHUElPIHB1bGwtdXAgc3RhdGUgaXMgZW5hYmxlZAorICogQHJtdG9sbCBQVUNSQSAgICAgICAgUFUwLTE1ICAgICAgICBMTF9QV1JfSXNFbmFibGVkR1BJT1B1bGxVcFxuCisgKiAgICAgICAgIFBVQ1JCICAgICAgICBQVTAtMTUgICAgICAgIExMX1BXUl9Jc0VuYWJsZWRHUElPUHVsbFVwXG4KKyAqICAgICAgICAgUFVDUkMgICAgICAgIFBVMC0xNSAgICAgICAgTExfUFdSX0lzRW5hYmxlZEdQSU9QdWxsVXBcbgorICogICAgICAgICBQVUNSRCAgICAgICAgUFUwLTE1ICAgICAgICBMTF9QV1JfSXNFbmFibGVkR1BJT1B1bGxVcFxuCisgKiAgICAgICAgIFBVQ1JFICAgICAgICBQVTAtMTUgICAgICAgIExMX1BXUl9Jc0VuYWJsZWRHUElPUHVsbFVwXG4KKyAqICAgICAgICAgUFVDUkYgICAgICAgIFBVMC0xNSAgICAgICAgTExfUFdSX0lzRW5hYmxlZEdQSU9QdWxsVXBcbgorICogICAgICAgICBQVUNSRyAgICAgICAgUFUwLTE1ICAgICAgICBMTF9QV1JfSXNFbmFibGVkR1BJT1B1bGxVcFxuCisgKiBAcGFyYW0gIEdQSU8gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0EKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0IKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0MKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0QKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0UKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0YKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0cKKyAqCisgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcworICogQHBhcmFtICBHUElPTnVtYmVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMAorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMworICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF81CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfNgorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF84CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfOQorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzEwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMTEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xMgorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzEzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMTQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xNQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfSXNFbmFibGVkR1BJT1B1bGxVcCh1aW50MzJfdCBHUElPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEdQSU9OdW1iZXIpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoKigoX19JTyB1aW50MzJfdCAqKUdQSU8pLCBHUElPTnVtYmVyKSA9PSAoR1BJT051bWJlcikpCisgICAgICAgICAgICAgID8gMVVMCisgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBHUElPIHB1bGwtZG93biBzdGF0ZSBpbiBTdGFuZGJ5IGFuZCBTaHV0ZG93biBtb2RlcworICogQHJtdG9sbCBQRENSQSAgICAgICAgUEQwLTE1ICAgICAgICBMTF9QV1JfRW5hYmxlR1BJT1B1bGxEb3duXG4KKyAqICAgICAgICAgUERDUkIgICAgICAgIFBEMC0xNSAgICAgICAgTExfUFdSX0VuYWJsZUdQSU9QdWxsRG93blxuCisgKiAgICAgICAgIFBEQ1JDICAgICAgICBQRDAtMTUgICAgICAgIExMX1BXUl9FbmFibGVHUElPUHVsbERvd25cbgorICogICAgICAgICBQRENSRCAgICAgICAgUEQwLTE1ICAgICAgICBMTF9QV1JfRW5hYmxlR1BJT1B1bGxEb3duXG4KKyAqICAgICAgICAgUERDUkUgICAgICAgIFBEMC0xNSAgICAgICAgTExfUFdSX0VuYWJsZUdQSU9QdWxsRG93blxuCisgKiAgICAgICAgIFBEQ1JGICAgICAgICBQRDAtMTUgICAgICAgIExMX1BXUl9FbmFibGVHUElPUHVsbERvd25cbgorICogICAgICAgICBQRENSRyAgICAgICAgUEQwLTE1ICAgICAgICBMTF9QV1JfRW5hYmxlR1BJT1B1bGxEb3duXG4KKyAqIEBwYXJhbSAgR1BJTyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQQorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQgorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQworICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fRAorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fRQorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fRgorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fRworICoKKyAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzCisgKiBAcGFyYW0gIEdQSU9OdW1iZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8wCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMQorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8zCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfNAorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF82CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfNworICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF85CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMTAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xMQorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzEyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMTMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xNAorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzE1CisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0VuYWJsZUdQSU9QdWxsRG93bih1aW50MzJfdCBHUElPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBHUElPTnVtYmVyKSB7CisgIFNFVF9CSVQoKigoX19JTyB1aW50MzJfdCAqKShHUElPICsgNFUpKSwgR1BJT051bWJlcik7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIEdQSU8gcHVsbC1kb3duIHN0YXRlIGluIFN0YW5kYnkgYW5kIFNodXRkb3duIG1vZGVzCisgKiBAcm10b2xsIFBEQ1JBICAgICAgICBQRDAtMTUgICAgICAgIExMX1BXUl9EaXNhYmxlR1BJT1B1bGxEb3duXG4KKyAqICAgICAgICAgUERDUkIgICAgICAgIFBEMC0xNSAgICAgICAgTExfUFdSX0Rpc2FibGVHUElPUHVsbERvd25cbgorICogICAgICAgICBQRENSQyAgICAgICAgUEQwLTE1ICAgICAgICBMTF9QV1JfRGlzYWJsZUdQSU9QdWxsRG93blxuCisgKiAgICAgICAgIFBEQ1JEICAgICAgICBQRDAtMTUgICAgICAgIExMX1BXUl9EaXNhYmxlR1BJT1B1bGxEb3duXG4KKyAqICAgICAgICAgUERDUkUgICAgICAgIFBEMC0xNSAgICAgICAgTExfUFdSX0Rpc2FibGVHUElPUHVsbERvd25cbgorICogICAgICAgICBQRENSRiAgICAgICAgUEQwLTE1ICAgICAgICBMTF9QV1JfRGlzYWJsZUdQSU9QdWxsRG93blxuCisgKiAgICAgICAgIFBEQ1JHICAgICAgICBQRDAtMTUgICAgICAgIExMX1BXUl9EaXNhYmxlR1BJT1B1bGxEb3duXG4KKyAqIEBwYXJhbSAgR1BJTyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQQorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQgorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQworICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fRAorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fRQorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fRgorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fRworICoKKyAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzCisgKiBAcGFyYW0gIEdQSU9OdW1iZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8wCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMQorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8zCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfNAorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF82CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfNworICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF85CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMTAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xMQorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzEyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMTMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xNAorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzE1CisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0Rpc2FibGVHUElPUHVsbERvd24odWludDMyX3QgR1BJTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEdQSU9OdW1iZXIpIHsKKyAgQ0xFQVJfQklUKCooKF9fSU8gdWludDMyX3QgKikoR1BJTyArIDRVKSksIEdQSU9OdW1iZXIpOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgR1BJTyBwdWxsLWRvd24gc3RhdGUgaXMgZW5hYmxlZAorICogQHJtdG9sbCBQRENSQSAgICAgICAgUEQwLTE1ICAgICAgICBMTF9QV1JfSXNFbmFibGVkR1BJT1B1bGxEb3duXG4KKyAqICAgICAgICAgUERDUkIgICAgICAgIFBEMC0xNSAgICAgICAgTExfUFdSX0lzRW5hYmxlZEdQSU9QdWxsRG93blxuCisgKiAgICAgICAgIFBEQ1JDICAgICAgICBQRDAtMTUgICAgICAgIExMX1BXUl9Jc0VuYWJsZWRHUElPUHVsbERvd25cbgorICogICAgICAgICBQRENSRCAgICAgICAgUEQwLTE1ICAgICAgICBMTF9QV1JfSXNFbmFibGVkR1BJT1B1bGxEb3duXG4KKyAqICAgICAgICAgUERDUkUgICAgICAgIFBEMC0xNSAgICAgICAgTExfUFdSX0lzRW5hYmxlZEdQSU9QdWxsRG93blxuCisgKiAgICAgICAgIFBEQ1JGICAgICAgICBQRDAtMTUgICAgICAgIExMX1BXUl9Jc0VuYWJsZWRHUElPUHVsbERvd25cbgorICogICAgICAgICBQRENSRyAgICAgICAgUEQwLTE1ICAgICAgICBMTF9QV1JfSXNFbmFibGVkR1BJT1B1bGxEb3duXG4KKyAqIEBwYXJhbSAgR1BJTyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQQorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQgorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQworICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fRAorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fRQorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fRgorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fRworICoKKyAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzCisgKiBAcGFyYW0gIEdQSU9OdW1iZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8wCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMQorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8zCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfNAorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF82CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfNworICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF85CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMTAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xMQorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzEyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMTMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xNAorICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzE1CisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0VuYWJsZWRHUElPUHVsbERvd24odWludDMyX3QgR1BJTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEdQSU9OdW1iZXIpIHsKKyAgcmV0dXJuICgKKyAgICAgIChSRUFEX0JJVCgqKChfX0lPIHVpbnQzMl90ICopKEdQSU8gKyA0VSkpLCBHUElPTnVtYmVyKSA9PSAoR1BJT051bWJlcikpCisgICAgICAgICAgPyAxVUwKKyAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFBXUl9MTF9FRl9GTEFHX01hbmFnZW1lbnQgRkxBR19NYW5hZ2VtZW50CisgKiBAeworICovCisKKy8qKgorICogQGJyaWVmICBHZXQgSW50ZXJuYWwgV2FrZS11cCBsaW5lIEZsYWcKKyAqIEBybXRvbGwgU1IxICAgICAgICAgIFdVRkkgICAgICAgICAgTExfUFdSX0lzQWN0aXZlRmxhZ19JbnRlcm5XVQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfSXNBY3RpdmVGbGFnX0ludGVybldVKHZvaWQpIHsKKyAgdWludDMyX3QgdGVtcDsKKyAgdGVtcCA9IFJFQURfQklUKFBXUi0+U1IxLCBQV1JfU1IxX1dVRkkpOworCisgIHJldHVybiAoKHRlbXAgPT0gKFBXUl9TUjFfV1VGSSkpID8gMVUgOiAwVSk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgU3RhbmQtQnkgRmxhZworICogQHJtdG9sbCBTUjEgICAgICAgICAgU0JGICAgICAgICAgICBMTF9QV1JfSXNBY3RpdmVGbGFnX1NCCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0FjdGl2ZUZsYWdfU0Iodm9pZCkgeworICB1aW50MzJfdCB0ZW1wOworICB0ZW1wID0gUkVBRF9CSVQoUFdSLT5TUjEsIFBXUl9TUjFfU0JGKTsKKworICByZXR1cm4gKCh0ZW1wID09IChQV1JfU1IxX1NCRikpID8gMVUgOiAwVSk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgV2FrZS11cCBGbGFnIDUKKyAqIEBybXRvbGwgU1IxICAgICAgICAgIFdVRjUgICAgICAgICAgTExfUFdSX0lzQWN0aXZlRmxhZ19XVTUKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUFdSX0lzQWN0aXZlRmxhZ19XVTUodm9pZCkgeworICB1aW50MzJfdCB0ZW1wOworICB0ZW1wID0gUkVBRF9CSVQoUFdSLT5TUjEsIFBXUl9TUjFfV1VGNSk7CisKKyAgcmV0dXJuICgodGVtcCA9PSAoUFdSX1NSMV9XVUY1KSkgPyAxVSA6IDBVKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBXYWtlLXVwIEZsYWcgNAorICogQHJtdG9sbCBTUjEgICAgICAgICAgV1VGNCAgICAgICAgICBMTF9QV1JfSXNBY3RpdmVGbGFnX1dVNAorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfSXNBY3RpdmVGbGFnX1dVNCh2b2lkKSB7CisgIHVpbnQzMl90IHRlbXA7CisgIHRlbXAgPSBSRUFEX0JJVChQV1ItPlNSMSwgUFdSX1NSMV9XVUY0KTsKKworICByZXR1cm4gKCh0ZW1wID09IChQV1JfU1IxX1dVRjQpKSA/IDFVIDogMFUpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IFdha2UtdXAgRmxhZyAzCisgKiBAcm10b2xsIFNSMSAgICAgICAgICBXVUYzICAgICAgICAgIExMX1BXUl9Jc0FjdGl2ZUZsYWdfV1UzCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0FjdGl2ZUZsYWdfV1UzKHZvaWQpIHsKKyAgdWludDMyX3QgdGVtcDsKKyAgdGVtcCA9IFJFQURfQklUKFBXUi0+U1IxLCBQV1JfU1IxX1dVRjMpOworCisgIHJldHVybiAoKHRlbXAgPT0gKFBXUl9TUjFfV1VGMykpID8gMVUgOiAwVSk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgV2FrZS11cCBGbGFnIDIKKyAqIEBybXRvbGwgU1IxICAgICAgICAgIFdVRjIgICAgICAgICAgTExfUFdSX0lzQWN0aXZlRmxhZ19XVTIKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUFdSX0lzQWN0aXZlRmxhZ19XVTIodm9pZCkgeworICB1aW50MzJfdCB0ZW1wOworICB0ZW1wID0gUkVBRF9CSVQoUFdSLT5TUjEsIFBXUl9TUjFfV1VGMik7CisKKyAgcmV0dXJuICgodGVtcCA9PSAoUFdSX1NSMV9XVUYyKSkgPyAxVSA6IDBVKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBXYWtlLXVwIEZsYWcgMQorICogQHJtdG9sbCBTUjEgICAgICAgICAgV1VGMSAgICAgICAgICBMTF9QV1JfSXNBY3RpdmVGbGFnX1dVMQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfSXNBY3RpdmVGbGFnX1dVMSh2b2lkKSB7CisgIHVpbnQzMl90IHRlbXA7CisgIHRlbXAgPSBSRUFEX0JJVChQV1ItPlNSMSwgUFdSX1NSMV9XVUYxKTsKKworICByZXR1cm4gKCh0ZW1wID09IChQV1JfU1IxX1dVRjEpKSA/IDFVIDogMFUpOworfQorCisvKioKKyAqIEBicmllZiAgQ2xlYXIgU3RhbmQtQnkgRmxhZworICogQHJtdG9sbCBTQ1IgICAgICAgICAgQ1NCRiAgICAgICAgICBMTF9QV1JfQ2xlYXJGbGFnX1NCCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0NsZWFyRmxhZ19TQih2b2lkKSB7CisgIFdSSVRFX1JFRyhQV1ItPlNDUiwgUFdSX1NDUl9DU0JGKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENsZWFyIFdha2UtdXAgRmxhZ3MKKyAqIEBybXRvbGwgU0NSICAgICAgICAgIENXVUYgICAgICAgICAgTExfUFdSX0NsZWFyRmxhZ19XVQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9DbGVhckZsYWdfV1Uodm9pZCkgeworICBXUklURV9SRUcoUFdSLT5TQ1IsIFBXUl9TQ1JfQ1dVRik7Cit9CisKKy8qKgorICogQGJyaWVmICBDbGVhciBXYWtlLXVwIEZsYWcgNQorICogQHJtdG9sbCBTQ1IgICAgICAgICAgQ1dVRjUgICAgICAgICBMTF9QV1JfQ2xlYXJGbGFnX1dVNQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9DbGVhckZsYWdfV1U1KHZvaWQpIHsKKyAgV1JJVEVfUkVHKFBXUi0+U0NSLCBQV1JfU0NSX0NXVUY1KTsKK30KKworLyoqCisgKiBAYnJpZWYgIENsZWFyIFdha2UtdXAgRmxhZyA0CisgKiBAcm10b2xsIFNDUiAgICAgICAgICBDV1VGNCAgICAgICAgIExMX1BXUl9DbGVhckZsYWdfV1U0CisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0NsZWFyRmxhZ19XVTQodm9pZCkgeworICBXUklURV9SRUcoUFdSLT5TQ1IsIFBXUl9TQ1JfQ1dVRjQpOworfQorCisvKioKKyAqIEBicmllZiAgQ2xlYXIgV2FrZS11cCBGbGFnIDMKKyAqIEBybXRvbGwgU0NSICAgICAgICAgIENXVUYzICAgICAgICAgTExfUFdSX0NsZWFyRmxhZ19XVTMKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfQ2xlYXJGbGFnX1dVMyh2b2lkKSB7CisgIFdSSVRFX1JFRyhQV1ItPlNDUiwgUFdSX1NDUl9DV1VGMyk7Cit9CisKKy8qKgorICogQGJyaWVmICBDbGVhciBXYWtlLXVwIEZsYWcgMgorICogQHJtdG9sbCBTQ1IgICAgICAgICAgQ1dVRjIgICAgICAgICBMTF9QV1JfQ2xlYXJGbGFnX1dVMgorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9DbGVhckZsYWdfV1UyKHZvaWQpIHsKKyAgV1JJVEVfUkVHKFBXUi0+U0NSLCBQV1JfU0NSX0NXVUYyKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENsZWFyIFdha2UtdXAgRmxhZyAxCisgKiBAcm10b2xsIFNDUiAgICAgICAgICBDV1VGMSAgICAgICAgIExMX1BXUl9DbGVhckZsYWdfV1UxCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0NsZWFyRmxhZ19XVTEodm9pZCkgeworICBXUklURV9SRUcoUFdSLT5TQ1IsIFBXUl9TQ1JfQ1dVRjEpOworfQorCisvKioKKyAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciBWRERBIHZvbHRhZ2UgaXMgYmVsb3cgb3IgYWJvdmUgUFZNNCB0aHJlc2hvbGQKKyAqIEBybXRvbGwgU1IyICAgICAgICAgIFBWTU80ICAgICAgICAgTExfUFdSX0lzQWN0aXZlRmxhZ19QVk1PNAorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfSXNBY3RpdmVGbGFnX1BWTU80KHZvaWQpIHsKKyAgdWludDMyX3QgdGVtcDsKKyAgdGVtcCA9IFJFQURfQklUKFBXUi0+U1IyLCBQV1JfU1IyX1BWTU80KTsKKworICByZXR1cm4gKCh0ZW1wID09IChQV1JfU1IyX1BWTU80KSkgPyAxVSA6IDBVKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgVkREQSB2b2x0YWdlIGlzIGJlbG93IG9yIGFib3ZlIFBWTTMgdGhyZXNob2xkCisgKiBAcm10b2xsIFNSMiAgICAgICAgICBQVk1PMyAgICAgICAgIExMX1BXUl9Jc0FjdGl2ZUZsYWdfUFZNTzMKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUFdSX0lzQWN0aXZlRmxhZ19QVk1PMyh2b2lkKSB7CisgIHVpbnQzMl90IHRlbXA7CisgIHRlbXAgPSBSRUFEX0JJVChQV1ItPlNSMiwgUFdSX1NSMl9QVk1PMyk7CisKKyAgcmV0dXJuICgodGVtcCA9PSAoUFdSX1NSMl9QVk1PMykpID8gMVUgOiAwVSk7Cit9CisKKyNpZiBkZWZpbmVkKFBXUl9TUjJfUFZNTzIpCisvKioKKyAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciBWRERJTzIgdm9sdGFnZSBpcyBiZWxvdyBvciBhYm92ZSBQVk0yIHRocmVzaG9sZAorICogQHJtdG9sbCBTUjIgICAgICAgICAgUFZNTzIgICAgICAgICBMTF9QV1JfSXNBY3RpdmVGbGFnX1BWTU8yCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0FjdGl2ZUZsYWdfUFZNTzIodm9pZCkgeworICB1aW50MzJfdCB0ZW1wOworICB0ZW1wID0gUkVBRF9CSVQoUFdSLT5TUjIsIFBXUl9TUjJfUFZNTzIpOworCisgIHJldHVybiAoKHRlbXAgPT0gKFBXUl9TUjJfUFZNTzIpKSA/IDFVIDogMFUpOworfQorI2VuZGlmIC8qIFBXUl9TUjJfUFZNTzIgKi8KKworI2lmIGRlZmluZWQoUFdSX1NSMl9QVk1PMSkKKy8qKgorICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIFZERFVTQiB2b2x0YWdlIGlzIGJlbG93IG9yIGFib3ZlIFBWTTEgdGhyZXNob2xkCisgKiBAcm10b2xsIFNSMiAgICAgICAgICBQVk1PMSAgICAgICAgIExMX1BXUl9Jc0FjdGl2ZUZsYWdfUFZNTzEKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUFdSX0lzQWN0aXZlRmxhZ19QVk1PMSh2b2lkKSB7CisgIHVpbnQzMl90IHRlbXA7CisgIHRlbXAgPSBSRUFEX0JJVChQV1ItPlNSMiwgUFdSX1NSMl9QVk1PMSk7CisKKyAgcmV0dXJuICgodGVtcCA9PSAoUFdSX1NSMl9QVk1PMSkpID8gMVUgOiAwVSk7Cit9CisjZW5kaWYgLyogUFdSX1NSMl9QVk1PMSAqLworCisvKioKKyAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciBWREQgdm9sdGFnZSBpcyBiZWxvdyBvciBhYm92ZSB0aGUgc2VsZWN0ZWQgUFZECisgKiB0aHJlc2hvbGQKKyAqIEBybXRvbGwgU1IyICAgICAgICAgIFBWRE8gICAgICAgICAgTExfUFdSX0lzQWN0aXZlRmxhZ19QVkRPCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0FjdGl2ZUZsYWdfUFZETyh2b2lkKSB7CisgIHVpbnQzMl90IHRlbXA7CisgIHRlbXAgPSBSRUFEX0JJVChQV1ItPlNSMiwgUFdSX1NSMl9QVkRPKTsKKworICByZXR1cm4gKCh0ZW1wID09IChQV1JfU1IyX1BWRE8pKSA/IDFVIDogMFUpOworfQorCisvKioKKyAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciB0aGUgcmVndWxhdG9yIGlzIHJlYWR5IGluIHRoZSBzZWxlY3RlZCB2b2x0YWdlIHJhbmdlCisgKiBvciBpZiBpdHMgb3V0cHV0IHZvbHRhZ2UgaXMgc3RpbGwgY2hhbmdpbmcgdG8gdGhlIHJlcXVpcmVkIHZvbHRhZ2UgbGV2ZWwKKyAqIEBybXRvbGwgU1IyICAgICAgICAgIFZPU0YgICAgICAgICAgTExfUFdSX0lzQWN0aXZlRmxhZ19WT1MKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUFdSX0lzQWN0aXZlRmxhZ19WT1Modm9pZCkgeworICB1aW50MzJfdCB0ZW1wOworICB0ZW1wID0gUkVBRF9CSVQoUFdSLT5TUjIsIFBXUl9TUjJfVk9TRik7CisKKyAgcmV0dXJuICgodGVtcCA9PSAoUFdSX1NSMl9WT1NGKSkgPyAxVSA6IDBVKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgdGhlIHJlZ3VsYXRvciBpcyByZWFkeSBpbiBtYWluIG1vZGUgb3IgaXMgaW4KKyAqIGxvdy1wb3dlciBtb2RlCisgKiBAbm90ZTogVGFrZSBjYXJlLCByZXR1cm4gdmFsdWUgIjAiIG1lYW5zIHRoZSByZWd1bGF0b3IgaXMgcmVhZHkuICBSZXR1cm4KKyAqIHZhbHVlICIxIiBtZWFucyB0aGUgb3V0cHV0IHZvbHRhZ2UgcmFuZ2UgaXMgc3RpbGwgY2hhbmdpbmcuCisgKiBAcm10b2xsIFNSMiAgICAgICAgICBSRUdMUEYgICAgICAgIExMX1BXUl9Jc0FjdGl2ZUZsYWdfUkVHTFBGCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0FjdGl2ZUZsYWdfUkVHTFBGKHZvaWQpIHsKKyAgdWludDMyX3QgdGVtcDsKKyAgdGVtcCA9IFJFQURfQklUKFBXUi0+U1IyLCBQV1JfU1IyX1JFR0xQRik7CisKKyAgcmV0dXJuICgodGVtcCA9PSAoUFdSX1NSMl9SRUdMUEYpKSA/IDFVIDogMFUpOworfQorCisvKioKKyAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciBvciBub3QgdGhlIGxvdy1wb3dlciByZWd1bGF0b3IgaXMgcmVhZHkKKyAqIEBybXRvbGwgU1IyICAgICAgICAgIFJFR0xQUyAgICAgICAgTExfUFdSX0lzQWN0aXZlRmxhZ19SRUdMUFMKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUFdSX0lzQWN0aXZlRmxhZ19SRUdMUFModm9pZCkgeworICB1aW50MzJfdCB0ZW1wOworICB0ZW1wID0gUkVBRF9CSVQoUFdSLT5TUjIsIFBXUl9TUjJfUkVHTFBTKTsKKworICByZXR1cm4gKCh0ZW1wID09IChQV1JfU1IyX1JFR0xQUykpID8gMVUgOiAwVSk7Cit9CisKKy8qKgorICogQH0KKyAqLworCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIFBXUl9MTF9FRl9Jbml0IERlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9uCisgKiBAeworICovCitFcnJvclN0YXR1cyBMTF9QV1JfRGVJbml0KHZvaWQpOworLyoqCisgKiBAfQorICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKiBAZGVmZ3JvdXAgUFdSX0xMX0VGX0xlZ2FjeV9GdW5jdGlvbnMgTGVnYWN5IGZ1bmN0aW9ucyBuYW1lCisgKiBAeworICovCisvKiBPbGQgZnVuY3Rpb25zIG5hbWUga2VwdCBmb3IgbGVnYWN5IHB1cnBvc2UsIHRvIGJlIHJlcGxhY2VkIGJ5IHRoZSAgICAgICAgICAqLworLyogY3VycmVudCBmdW5jdGlvbnMgbmFtZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfUFdSX0lzQWN0aXZlRmxhZ19WT1NGIExMX1BXUl9Jc0FjdGl2ZUZsYWdfVk9TCisjZGVmaW5lIExMX1BXUl9FbmFibGVVU0JEZWFkQmF0dGVyeSBMTF9QV1JfRW5hYmxlVUNQRERlYWRCYXR0ZXJ5CisjZGVmaW5lIExMX1BXUl9EaXNhYmxlVVNCRGVhZEJhdHRlcnkgTExfUFdSX0Rpc2FibGVVQ1BERGVhZEJhdHRlcnkKKyNkZWZpbmUgTExfUFdSX0lzRW5hYmxlZFVTQkRlYWRCYXR0ZXJ5IExMX1BXUl9Jc0VuYWJsZWRVQ1BERGVhZEJhdHRlcnkKKyNkZWZpbmUgTExfUFdSX0VuYWJsZURlYWRCYXR0ZXJ5UEQgTExfUFdSX0VuYWJsZVVDUEREZWFkQmF0dGVyeQorI2RlZmluZSBMTF9QV1JfRGlzYWJsZURlYWRCYXR0ZXJ5UEQgTExfUFdSX0Rpc2FibGVVQ1BERGVhZEJhdHRlcnkKKyNkZWZpbmUgTExfUFdSX0VuYWJsZVVTQlN0YW5kQnlNb2RlUEQgTExfUFdSX0VuYWJsZVVDUERTdGFuZGJ5TW9kZQorI2RlZmluZSBMTF9QV1JfRW5hYmxlU3RhbmRCeU1vZGVQRCBMTF9QV1JfRW5hYmxlVUNQRFN0YW5kYnlNb2RlCisjZGVmaW5lIExMX1BXUl9EaXNhYmxlVVNCU3RhbmRCeU1vZGVQRCBMTF9QV1JfRGlzYWJsZVVDUERTdGFuZGJ5TW9kZQorI2RlZmluZSBMTF9QV1JfRGlzYWJsZVN0YW5kQnlNb2RlUEQgTExfUFdSX0Rpc2FibGVVQ1BEU3RhbmRieU1vZGUKKyNkZWZpbmUgTExfUFdSX0lzRW5hYmxlZFVTQlN0YW5kQnlNb2RlUEQgTExfUFdSX0lzRW5hYmxlZFVDUERTdGFuZGJ5TW9kZQorLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworI2VuZGlmIC8qIGRlZmluZWQoUFdSKSAqLworCisvKioKKyAqIEB9CisgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyRzR4eF9MTF9QV1JfSCAqLwpkaWZmIC0tZ2l0IGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfbGxfcmNjLmggYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9sbF9yY2MuaAppbmRleCA4ZmM5YWMyLi5jNTFkMzRlIDEwMDY0NAotLS0gYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9sbF9yY2MuaAorKysgYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9sbF9yY2MuaApAQCAtMSwzMjY0ICsxLDMyODcgQEAKLS8qKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBAZmlsZSAgICBzdG0zMmc0eHhfbGxfcmNjLmgNCi0gKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQ0KLSAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFJDQyBMTCBtb2R1bGUuDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEBhdHRlbnRpb24NCi0gKg0KLSAqIENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4NCi0gKg0KLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGVybXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZQ0KLSAqaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc29mdHdhcmUgY29tcG9uZW50LiBJZiBubyBMSUNFTlNFIGZpbGUgY29tZXMNCi0gKndpdGggdGhpcyBzb2Z0d2FyZSwgaXQgaXMgcHJvdmlkZWQgQVMtSVMuDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqLw0KLQ0KLS8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotI2lmbmRlZiBTVE0zMkc0eHhfTExfUkNDX0gNCi0jZGVmaW5lIFNUTTMyRzR4eF9MTF9SQ0NfSA0KLQ0KLSNpZmRlZiBfX2NwbHVzcGx1cw0KLWV4dGVybiAiQyIgew0KLSNlbmRpZg0KLQ0KLS8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotI2luY2x1ZGUgInN0bTMyZzR4eC5oIg0KLQ0KLS8qKiBAYWRkdG9ncm91cCBTVE0zMkc0eHhfTExfRHJpdmVyDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFJDQ19MTCBSQ0MNCi0gKiBAew0KLSAqLw0KLQ0KLS8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGRlZmdyb3VwIFJDQ19MTF9Qcml2YXRlX1ZhcmlhYmxlcyBSQ0MgUHJpdmF0ZSBWYXJpYWJsZXMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGRlZmdyb3VwIFJDQ19MTF9Qcml2YXRlX0NvbnN0YW50cyBSQ0MgUHJpdmF0ZSBDb25zdGFudHMNCi0gKiBAew0KLSAqLw0KLS8qIERlZmluZXMgdXNlZCB0byBwZXJmb3JtIG9mZnNldHMqLw0KLS8qIE9mZnNldCB1c2VkIHRvIGFjY2VzcyB0byBSQ0NfQ0NJUFIgYW5kIFJDQ19DQ0lQUjIgcmVnaXN0ZXJzICovDQotI2RlZmluZSBSQ0NfT0ZGU0VUX0NDSVBSIDBVDQotI2RlZmluZSBSQ0NfT0ZGU0VUX0NDSVBSMiAweDE0VQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpDQotLyoqIEBkZWZncm91cCBSQ0NfTExfUHJpdmF0ZV9NYWNyb3MgUkNDIFByaXZhdGUgTWFjcm9zDQotICogQHsNCi0gKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLSNlbmRpZiAvKlVTRV9GVUxMX0xMX0RSSVZFUiovDQotDQotLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpDQotLyoqIEBkZWZncm91cCBSQ0NfTExfRXhwb3J0ZWRfVHlwZXMgUkNDIEV4cG9ydGVkIFR5cGVzDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIExMX0VTX0NMT0NLX0ZSRVEgQ2xvY2tzIEZyZXF1ZW5jeSBTdHJ1Y3R1cmUNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUkNDIENsb2NrcyBGcmVxdWVuY3kgU3RydWN0dXJlDQotICovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgdWludDMyX3QgU1lTQ0xLX0ZyZXF1ZW5jeTsgLyohPCBTWVNDTEsgY2xvY2sgZnJlcXVlbmN5ICovDQotICB1aW50MzJfdCBIQ0xLX0ZyZXF1ZW5jeTsgICAvKiE8IEhDTEsgY2xvY2sgZnJlcXVlbmN5ICovDQotICB1aW50MzJfdCBQQ0xLMV9GcmVxdWVuY3k7ICAvKiE8IFBDTEsxIGNsb2NrIGZyZXF1ZW5jeSAqLw0KLSAgdWludDMyX3QgUENMSzJfRnJlcXVlbmN5OyAgLyohPCBQQ0xLMiBjbG9jayBmcmVxdWVuY3kgKi8NCi19IExMX1JDQ19DbG9ja3NUeXBlRGVmOw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0jZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovDQotDQotLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGRlZmdyb3VwIFJDQ19MTF9FeHBvcnRlZF9Db25zdGFudHMgUkNDIEV4cG9ydGVkIENvbnN0YW50cw0KLSAqIEB7DQotICovDQotDQotLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfT1NDX1ZBTFVFUyBPc2NpbGxhdG9yIFZhbHVlcyBhZGFwdGF0aW9uDQotICogQGJyaWVmICAgIERlZmluZXMgdXNlZCB0byBhZGFwdCB2YWx1ZXMgb2YgZGlmZmVyZW50IG9zY2lsbGF0b3JzDQotICogQG5vdGUgICAgIFRoZXNlIHZhbHVlcyBjb3VsZCBiZSBtb2RpZmllZCBpbiB0aGUgdXNlciBlbnZpcm9ubWVudCBhY2NvcmRpbmcgdG8NCi0gKiAgICAgICAgICAgSFcgc2V0LXVwLg0KLSAqIEB7DQotICovDQotI2lmICFkZWZpbmVkKEhTRV9WQUxVRSkNCi0jZGVmaW5lIEhTRV9WQUxVRSA4MDAwMDAwVSAvKiE8IFZhbHVlIG9mIHRoZSBIU0Ugb3NjaWxsYXRvciBpbiBIeiAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgICAgICAgIC8qIEhTRV9WQUxVRSAqLw0KLQ0KLSNpZiAhZGVmaW5lZChIU0lfVkFMVUUpDQotI2RlZmluZSBIU0lfVkFMVUUgMTYwMDAwMDBVIC8qITwgVmFsdWUgb2YgdGhlIEhTSSBvc2NpbGxhdG9yIGluIEh6ICovDQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgIC8qIEhTSV9WQUxVRSAqLw0KLQ0KLSNpZiAhZGVmaW5lZChMU0VfVkFMVUUpDQotI2RlZmluZSBMU0VfVkFMVUUgMzI3NjhVIC8qITwgVmFsdWUgb2YgdGhlIExTRSBvc2NpbGxhdG9yIGluIEh6ICovDQotI2VuZGlmICAgICAgICAgICAgICAgICAgIC8qIExTRV9WQUxVRSAqLw0KLQ0KLSNpZiAhZGVmaW5lZChMU0lfVkFMVUUpDQotI2RlZmluZSBMU0lfVkFMVUUgMzIwMDBVIC8qITwgVmFsdWUgb2YgdGhlIExTSSBvc2NpbGxhdG9yIGluIEh6ICovDQotI2VuZGlmICAgICAgICAgICAgICAgICAgIC8qIExTSV9WQUxVRSAqLw0KLQ0KLSNpZiAhZGVmaW5lZChIU0k0OF9WQUxVRSkNCi0jZGVmaW5lIEhTSTQ4X1ZBTFVFIDQ4MDAwMDAwVSAvKiE8IFZhbHVlIG9mIHRoZSBIU0k0OCBvc2NpbGxhdG9yIGluIEh6ICovDQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgLyogSFNJNDhfVkFMVUUgKi8NCi0NCi0jaWYgIWRlZmluZWQoRVhURVJOQUxfQ0xPQ0tfVkFMVUUpDQotI2RlZmluZSBFWFRFUk5BTF9DTE9DS19WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgNDgwMDBVIC8qITwgVmFsdWUgb2YgdGhlIEkyU19DS0lOLCBJMlMgYW5kIFNBSTEgZXh0ZXJuYWwgY2xvY2sgc291cmNlIGluIEh6IFwNCi0gICAgICAgICAgKi8NCi0jZW5kaWYgICAvKiBFWFRFUk5BTF9DTE9DS19WQUxVRSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfQ0xFQVJfRkxBRyBDbGVhciBGbGFncyBEZWZpbmVzDQotICogQGJyaWVmICAgIEZsYWdzIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9SQ0NfV3JpdGVSZWcgZnVuY3Rpb24NCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfUkNDX0NJQ1JfTFNJUkRZQyBSQ0NfQ0lDUl9MU0lSRFlDIC8qITwgTFNJIFJlYWR5IEludGVycnVwdCBDbGVhciAqLw0KLSNkZWZpbmUgTExfUkNDX0NJQ1JfTFNFUkRZQyBSQ0NfQ0lDUl9MU0VSRFlDIC8qITwgTFNFIFJlYWR5IEludGVycnVwdCBDbGVhciAqLw0KLSNkZWZpbmUgTExfUkNDX0NJQ1JfSFNJUkRZQyBSQ0NfQ0lDUl9IU0lSRFlDIC8qITwgSFNJIFJlYWR5IEludGVycnVwdCBDbGVhciAqLw0KLSNkZWZpbmUgTExfUkNDX0NJQ1JfSFNFUkRZQyBSQ0NfQ0lDUl9IU0VSRFlDIC8qITwgSFNFIFJlYWR5IEludGVycnVwdCBDbGVhciAqLw0KLSNkZWZpbmUgTExfUkNDX0NJQ1JfUExMUkRZQyBSQ0NfQ0lDUl9QTExSRFlDIC8qITwgUExMIFJlYWR5IEludGVycnVwdCBDbGVhciAqLw0KLSNkZWZpbmUgTExfUkNDX0NJQ1JfSFNJNDhSRFlDIFwNCi0gIFJDQ19DSUNSX0hTSTQ4UkRZQyAvKiE8IEhTSTQ4IFJlYWR5IEludGVycnVwdCBDbGVhciAqLw0KLSNkZWZpbmUgTExfUkNDX0NJQ1JfTFNFQ1NTQyBcDQotICBSQ0NfQ0lDUl9MU0VDU1NDIC8qITwgTFNFIENsb2NrIFNlY3VyaXR5IFN5c3RlbSBJbnRlcnJ1cHQgQ2xlYXIgKi8NCi0jZGVmaW5lIExMX1JDQ19DSUNSX0NTU0MgXA0KLSAgUkNDX0NJQ1JfQ1NTQyAvKiE8IENsb2NrIFNlY3VyaXR5IFN5c3RlbSBJbnRlcnJ1cHQgQ2xlYXIgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX0dFVF9GTEFHIEdldCBGbGFncyBEZWZpbmVzDQotICogQGJyaWVmICAgIEZsYWdzIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9SQ0NfUmVhZFJlZyBmdW5jdGlvbg0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9SQ0NfQ0lGUl9MU0lSRFlGIFJDQ19DSUZSX0xTSVJEWUYgLyohPCBMU0kgUmVhZHkgSW50ZXJydXB0IGZsYWcgKi8NCi0jZGVmaW5lIExMX1JDQ19DSUZSX0xTRVJEWUYgUkNDX0NJRlJfTFNFUkRZRiAvKiE8IExTRSBSZWFkeSBJbnRlcnJ1cHQgZmxhZyAqLw0KLSNkZWZpbmUgTExfUkNDX0NJRlJfSFNJUkRZRiBSQ0NfQ0lGUl9IU0lSRFlGIC8qITwgSFNJIFJlYWR5IEludGVycnVwdCBmbGFnICovDQotI2RlZmluZSBMTF9SQ0NfQ0lGUl9IU0VSRFlGIFJDQ19DSUZSX0hTRVJEWUYgLyohPCBIU0UgUmVhZHkgSW50ZXJydXB0IGZsYWcgKi8NCi0jZGVmaW5lIExMX1JDQ19DSUZSX1BMTFJEWUYgUkNDX0NJRlJfUExMUkRZRiAvKiE8IFBMTCBSZWFkeSBJbnRlcnJ1cHQgZmxhZyAqLw0KLSNkZWZpbmUgTExfUkNDX0NJRlJfSFNJNDhSRFlGIFwNCi0gIFJDQ19DSUZSX0hTSTQ4UkRZRiAvKiE8IEhTSTQ4IFJlYWR5IEludGVycnVwdCBmbGFnICovDQotI2RlZmluZSBMTF9SQ0NfQ0lGUl9MU0VDU1NGIFwNCi0gIFJDQ19DSUZSX0xTRUNTU0YgLyohPCBMU0UgQ2xvY2sgU2VjdXJpdHkgU3lzdGVtIEludGVycnVwdCBmbGFnICovDQotI2RlZmluZSBMTF9SQ0NfQ0lGUl9DU1NGIFwNCi0gIFJDQ19DSUZSX0NTU0YgLyohPCBDbG9jayBTZWN1cml0eSBTeXN0ZW0gSW50ZXJydXB0IGZsYWcgKi8NCi0jZGVmaW5lIExMX1JDQ19DU1JfTFBXUlJTVEYgUkNDX0NTUl9MUFdSUlNURiAvKiE8IExvdy1Qb3dlciByZXNldCBmbGFnICovDQotI2RlZmluZSBMTF9SQ0NfQ1NSX09CTFJTVEYgUkNDX0NTUl9PQkxSU1RGICAgLyohPCBPQkwgcmVzZXQgZmxhZyAqLw0KLSNkZWZpbmUgTExfUkNDX0NTUl9QSU5SU1RGIFJDQ19DU1JfUElOUlNURiAgIC8qITwgUElOIHJlc2V0IGZsYWcgKi8NCi0jZGVmaW5lIExMX1JDQ19DU1JfU0ZUUlNURiBSQ0NfQ1NSX1NGVFJTVEYgICAvKiE8IFNvZnR3YXJlIFJlc2V0IGZsYWcgKi8NCi0jZGVmaW5lIExMX1JDQ19DU1JfSVdER1JTVEYgXA0KLSAgUkNDX0NTUl9JV0RHUlNURiAvKiE8IEluZGVwZW5kZW50IFdhdGNoZG9nIHJlc2V0IGZsYWcgKi8NCi0jZGVmaW5lIExMX1JDQ19DU1JfV1dER1JTVEYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBSQ0NfQ1NSX1dXREdSU1RGICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgV2luZG93IHdhdGNoZG9nIHJlc2V0IGZsYWcgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX1JDQ19DU1JfQk9SUlNURiBSQ0NfQ1NSX0JPUlJTVEYgLyohPCBCT1IgcmVzZXQgZmxhZyAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfSVQgSVQgRGVmaW5lcw0KLSAqIEBicmllZiAgICBJVCBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfUkNDX1JlYWRSZWcgYW5kDQotICogTExfUkNDX1dyaXRlUmVnIGZ1bmN0aW9ucw0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9SQ0NfQ0lFUl9MU0lSRFlJRSBcDQotICBSQ0NfQ0lFUl9MU0lSRFlJRSAvKiE8IExTSSBSZWFkeSBJbnRlcnJ1cHQgRW5hYmxlICovDQotI2RlZmluZSBMTF9SQ0NfQ0lFUl9MU0VSRFlJRSBcDQotICBSQ0NfQ0lFUl9MU0VSRFlJRSAvKiE8IExTRSBSZWFkeSBJbnRlcnJ1cHQgRW5hYmxlICovDQotI2RlZmluZSBMTF9SQ0NfQ0lFUl9IU0lSRFlJRSBcDQotICBSQ0NfQ0lFUl9IU0lSRFlJRSAvKiE8IEhTSSBSZWFkeSBJbnRlcnJ1cHQgRW5hYmxlICovDQotI2RlZmluZSBMTF9SQ0NfQ0lFUl9IU0VSRFlJRSBcDQotICBSQ0NfQ0lFUl9IU0VSRFlJRSAvKiE8IEhTRSBSZWFkeSBJbnRlcnJ1cHQgRW5hYmxlICovDQotI2RlZmluZSBMTF9SQ0NfQ0lFUl9QTExSRFlJRSBcDQotICBSQ0NfQ0lFUl9QTExSRFlJRSAvKiE8IFBMTCBSZWFkeSBJbnRlcnJ1cHQgRW5hYmxlICovDQotI2RlZmluZSBMTF9SQ0NfQ0lFUl9IU0k0OFJEWUlFIFwNCi0gIFJDQ19DSUVSX0hTSTQ4UkRZSUUgLyohPCBIU0k0OCBSZWFkeSBJbnRlcnJ1cHQgRW5hYmxlICovDQotI2RlZmluZSBMTF9SQ0NfQ0lFUl9MU0VDU1NJRSAgICAgICAgICAgICAgICAgICAgICBcDQotICBSQ0NfQ0lFUl9MU0VDU1NJRSAvKiE8IExTRSBDU1MgSW50ZXJydXB0IEVuYWJsZSBcDQotICAgICAgICAgICAgICAgICAgICAgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX0xTRURSSVZFICBMU0Ugb3NjaWxsYXRvciBkcml2ZSBjYXBhYmlsaXR5DQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1JDQ19MU0VEUklWRV9MT1cgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBYdGFsIG1vZGUgbG93ZXIgZHJpdmluZyBjYXBhYmlsaXR5ICovDQotI2RlZmluZSBMTF9SQ0NfTFNFRFJJVkVfTUVESVVNTE9XIFwNCi0gIFJDQ19CRENSX0xTRURSVl8wIC8qITwgWHRhbCBtb2RlIG1lZGl1bSBsb3cgZHJpdmluZyBjYXBhYmlsaXR5ICovDQotI2RlZmluZSBMTF9SQ0NfTFNFRFJJVkVfTUVESVVNSElHSCBcDQotICBSQ0NfQkRDUl9MU0VEUlZfMSAvKiE8IFh0YWwgbW9kZSBtZWRpdW0gaGlnaCBkcml2aW5nIGNhcGFiaWxpdHkgKi8NCi0jZGVmaW5lIExMX1JDQ19MU0VEUklWRV9ISUdIIFwNCi0gIFJDQ19CRENSX0xTRURSViAvKiE8IFh0YWwgbW9kZSBoaWdoZXIgZHJpdmluZyBjYXBhYmlsaXR5ICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19MU0NPX0NMS1NPVVJDRSAgTFNDTyBTZWxlY3Rpb24NCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfUkNDX0xTQ09fQ0xLU09VUkNFX0xTSSBcDQotICAweDAwMDAwMDAwVSAvKiE8IExTSSBzZWxlY3Rpb24gZm9yIGxvdyBzcGVlZCBjbG9jayAgKi8NCi0jZGVmaW5lIExMX1JDQ19MU0NPX0NMS1NPVVJDRV9MU0UgXA0KLSAgUkNDX0JEQ1JfTFNDT1NFTCAvKiE8IExTRSBzZWxlY3Rpb24gZm9yIGxvdyBzcGVlZCBjbG9jayAgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX1NZU19DTEtTT1VSQ0UgIFN5c3RlbSBjbG9jayBzd2l0Y2gNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfUkNDX1NZU19DTEtTT1VSQ0VfSFNJIFwNCi0gIFJDQ19DRkdSX1NXX0hTSSAvKiE8IEhTSSBzZWxlY3Rpb24gYXMgc3lzdGVtIGNsb2NrICovDQotI2RlZmluZSBMTF9SQ0NfU1lTX0NMS1NPVVJDRV9IU0UgXA0KLSAgUkNDX0NGR1JfU1dfSFNFIC8qITwgSFNFIHNlbGVjdGlvbiBhcyBzeXN0ZW0gY2xvY2sgKi8NCi0jZGVmaW5lIExMX1JDQ19TWVNfQ0xLU09VUkNFX1BMTCBcDQotICBSQ0NfQ0ZHUl9TV19QTEwgLyohPCBQTEwgc2VsZWN0aW9uIGFzIHN5c3RlbSBjbG9jayAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfU1lTX0NMS1NPVVJDRV9TVEFUVVMgIFN5c3RlbSBjbG9jayBzd2l0Y2ggc3RhdHVzDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1JDQ19TWVNfQ0xLU09VUkNFX1NUQVRVU19IU0kgXA0KLSAgUkNDX0NGR1JfU1dTX0hTSSAvKiE8IEhTSSB1c2VkIGFzIHN5c3RlbSBjbG9jayAqLw0KLSNkZWZpbmUgTExfUkNDX1NZU19DTEtTT1VSQ0VfU1RBVFVTX0hTRSBcDQotICBSQ0NfQ0ZHUl9TV1NfSFNFIC8qITwgSFNFIHVzZWQgYXMgc3lzdGVtIGNsb2NrICovDQotI2RlZmluZSBMTF9SQ0NfU1lTX0NMS1NPVVJDRV9TVEFUVVNfUExMIFwNCi0gIFJDQ19DRkdSX1NXU19QTEwgLyohPCBQTEwgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX1NZU0NMS19ESVYgIEFIQiBwcmVzY2FsZXINCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfUkNDX1NZU0NMS19ESVZfMSBSQ0NfQ0ZHUl9IUFJFX0RJVjEgICAvKiE8IFNZU0NMSyBub3QgZGl2aWRlZCAqLw0KLSNkZWZpbmUgTExfUkNDX1NZU0NMS19ESVZfMiBSQ0NfQ0ZHUl9IUFJFX0RJVjIgICAvKiE8IFNZU0NMSyBkaXZpZGVkIGJ5IDIgKi8NCi0jZGVmaW5lIExMX1JDQ19TWVNDTEtfRElWXzQgUkNDX0NGR1JfSFBSRV9ESVY0ICAgLyohPCBTWVNDTEsgZGl2aWRlZCBieSA0ICovDQotI2RlZmluZSBMTF9SQ0NfU1lTQ0xLX0RJVl84IFJDQ19DRkdSX0hQUkVfRElWOCAgIC8qITwgU1lTQ0xLIGRpdmlkZWQgYnkgOCAqLw0KLSNkZWZpbmUgTExfUkNDX1NZU0NMS19ESVZfMTYgUkNDX0NGR1JfSFBSRV9ESVYxNiAvKiE8IFNZU0NMSyBkaXZpZGVkIGJ5IDE2ICovDQotI2RlZmluZSBMTF9SQ0NfU1lTQ0xLX0RJVl82NCBSQ0NfQ0ZHUl9IUFJFX0RJVjY0IC8qITwgU1lTQ0xLIGRpdmlkZWQgYnkgNjQgKi8NCi0jZGVmaW5lIExMX1JDQ19TWVNDTEtfRElWXzEyOCAgICAgICAgICAgICAgICAgICAgIFwNCi0gIFJDQ19DRkdSX0hQUkVfRElWMTI4IC8qITwgU1lTQ0xLIGRpdmlkZWQgYnkgMTI4IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfUkNDX1NZU0NMS19ESVZfMjU2ICAgICAgICAgICAgICAgICAgICAgXA0KLSAgUkNDX0NGR1JfSFBSRV9ESVYyNTYgLyohPCBTWVNDTEsgZGl2aWRlZCBieSAyNTYgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9SQ0NfU1lTQ0xLX0RJVl81MTIgICAgICAgICAgICAgICAgICAgICBcDQotICBSQ0NfQ0ZHUl9IUFJFX0RJVjUxMiAvKiE8IFNZU0NMSyBkaXZpZGVkIGJ5IDUxMiBcDQotICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX0FQQjFfRElWICBBUEIgbG93LXNwZWVkIHByZXNjYWxlciAoQVBCMSkNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfUkNDX0FQQjFfRElWXzEgUkNDX0NGR1JfUFBSRTFfRElWMSAgIC8qITwgSENMSyBub3QgZGl2aWRlZCAqLw0KLSNkZWZpbmUgTExfUkNDX0FQQjFfRElWXzIgUkNDX0NGR1JfUFBSRTFfRElWMiAgIC8qITwgSENMSyBkaXZpZGVkIGJ5IDIgKi8NCi0jZGVmaW5lIExMX1JDQ19BUEIxX0RJVl80IFJDQ19DRkdSX1BQUkUxX0RJVjQgICAvKiE8IEhDTEsgZGl2aWRlZCBieSA0ICovDQotI2RlZmluZSBMTF9SQ0NfQVBCMV9ESVZfOCBSQ0NfQ0ZHUl9QUFJFMV9ESVY4ICAgLyohPCBIQ0xLIGRpdmlkZWQgYnkgOCAqLw0KLSNkZWZpbmUgTExfUkNDX0FQQjFfRElWXzE2IFJDQ19DRkdSX1BQUkUxX0RJVjE2IC8qITwgSENMSyBkaXZpZGVkIGJ5IDE2ICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19BUEIyX0RJViAgQVBCIGhpZ2gtc3BlZWQgcHJlc2NhbGVyIChBUEIyKQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9SQ0NfQVBCMl9ESVZfMSBSQ0NfQ0ZHUl9QUFJFMl9ESVYxICAgLyohPCBIQ0xLIG5vdCBkaXZpZGVkICovDQotI2RlZmluZSBMTF9SQ0NfQVBCMl9ESVZfMiBSQ0NfQ0ZHUl9QUFJFMl9ESVYyICAgLyohPCBIQ0xLIGRpdmlkZWQgYnkgMiAqLw0KLSNkZWZpbmUgTExfUkNDX0FQQjJfRElWXzQgUkNDX0NGR1JfUFBSRTJfRElWNCAgIC8qITwgSENMSyBkaXZpZGVkIGJ5IDQgKi8NCi0jZGVmaW5lIExMX1JDQ19BUEIyX0RJVl84IFJDQ19DRkdSX1BQUkUyX0RJVjggICAvKiE8IEhDTEsgZGl2aWRlZCBieSA4ICovDQotI2RlZmluZSBMTF9SQ0NfQVBCMl9ESVZfMTYgUkNDX0NGR1JfUFBSRTJfRElWMTYgLyohPCBIQ0xLIGRpdmlkZWQgYnkgMTYgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX01DTzFTT1VSQ0UgIE1DTzEgU09VUkNFIHNlbGVjdGlvbg0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9SQ0NfTUNPMVNPVVJDRV9OT0NMT0NLIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgTUNPIG91dHB1dCBkaXNhYmxlZCwgbm8gY2xvY2sgb24gTUNPICovDQotI2RlZmluZSBMTF9SQ0NfTUNPMVNPVVJDRV9TWVNDTEsgXA0KLSAgUkNDX0NGR1JfTUNPU0VMXzAgLyohPCBTWVNDTEsgc2VsZWN0aW9uIGFzIE1DTzEgc291cmNlICovDQotI2RlZmluZSBMTF9SQ0NfTUNPMVNPVVJDRV9IU0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKFJDQ19DRkdSX01DT1NFTF8wIHwgUkNDX0NGR1JfTUNPU0VMXzEpIC8qITwgSFNJMTYgc2VsZWN0aW9uIGFzIE1DTzEgc291cmNlIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX1JDQ19NQ08xU09VUkNFX0hTRSBcDQotICBSQ0NfQ0ZHUl9NQ09TRUxfMiAvKiE8IEhTRSBzZWxlY3Rpb24gYXMgTUNPMSBzb3VyY2UgKi8NCi0jZGVmaW5lIExMX1JDQ19NQ08xU09VUkNFX1BMTENMSyBcDQotICAoUkNDX0NGR1JfTUNPU0VMXzAgfCAgICAgICAgICAgXA0KLSAgIFJDQ19DRkdSX01DT1NFTF8yKSAvKiE8IE1haW4gUExMIHNlbGVjdGlvbiBhcyBNQ08xIHNvdXJjZSAqLw0KLSNkZWZpbmUgTExfUkNDX01DTzFTT1VSQ0VfTFNJIFwNCi0gIChSQ0NfQ0ZHUl9NQ09TRUxfMSB8IFJDQ19DRkdSX01DT1NFTF8yKSAvKiE8IExTSSBzZWxlY3Rpb24gYXMgTUNPMSBzb3VyY2UgKi8NCi0jZGVmaW5lIExMX1JDQ19NQ08xU09VUkNFX0xTRSAgICAgICAgICAgICAgXA0KLSAgKFJDQ19DRkdSX01DT1NFTF8wIHwgUkNDX0NGR1JfTUNPU0VMXzEgfCBcDQotICAgUkNDX0NGR1JfTUNPU0VMXzIpIC8qITwgTFNFIHNlbGVjdGlvbiBhcyBNQ08xIHNvdXJjZSAqLw0KLSNkZWZpbmUgTExfUkNDX01DTzFTT1VSQ0VfSFNJNDggXA0KLSAgUkNDX0NGR1JfTUNPU0VMXzMgLyohPCBIU0k0OCBzZWxlY3Rpb24gYXMgTUNPMSBzb3VyY2UgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX01DTzFfRElWICBNQ08xIHByZXNjYWxlcg0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9SQ0NfTUNPMV9ESVZfMSBSQ0NfQ0ZHUl9NQ09QUkVfRElWMSAgIC8qITwgTUNPIG5vdCBkaXZpZGVkICovDQotI2RlZmluZSBMTF9SQ0NfTUNPMV9ESVZfMiBSQ0NfQ0ZHUl9NQ09QUkVfRElWMiAgIC8qITwgTUNPIGRpdmlkZWQgYnkgMiAqLw0KLSNkZWZpbmUgTExfUkNDX01DTzFfRElWXzQgUkNDX0NGR1JfTUNPUFJFX0RJVjQgICAvKiE8IE1DTyBkaXZpZGVkIGJ5IDQgKi8NCi0jZGVmaW5lIExMX1JDQ19NQ08xX0RJVl84IFJDQ19DRkdSX01DT1BSRV9ESVY4ICAgLyohPCBNQ08gZGl2aWRlZCBieSA4ICovDQotI2RlZmluZSBMTF9SQ0NfTUNPMV9ESVZfMTYgUkNDX0NGR1JfTUNPUFJFX0RJVjE2IC8qITwgTUNPIGRpdmlkZWQgYnkgMTYgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLSNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikNCi0vKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19QRVJJUEhfRlJFUVVFTkNZIFBlcmlwaGVyYWwgY2xvY2sgZnJlcXVlbmN5DQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1JDQ19QRVJJUEhfRlJFUVVFTkNZX05PIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgTm8gY2xvY2sgZW5hYmxlZCBmb3IgdGhlIHBlcmlwaGVyYWwgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfUkNDX1BFUklQSF9GUkVRVUVOQ1lfTkEgXA0KLSAgMHhGRkZGRkZGRlUgLyohPCBGcmVxdWVuY3kgY2Fubm90IGJlIHByb3ZpZGVkIGFzIGV4dGVybmFsIGNsb2NrICovDQotLyoqDQotICogQH0NCi0gKi8NCi0jZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovDQotDQotLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfVVNBUlR4X0NMS1NPVVJDRSAgUGVyaXBoZXJhbCBVU0FSVCBjbG9jayBzb3VyY2UNCi0gKiBzZWxlY3Rpb24NCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfUkNDX1VTQVJUMV9DTEtTT1VSQ0VfUENMSzIgXA0KLSAgKFJDQ19DQ0lQUl9VU0FSVDFTRUwgPDwgMTZVKSAvKiE8IFBDTEsyIGNsb2NrIHVzZWQgYXMgVVNBUlQxIGNsb2NrIHNvdXJjZSAqLw0KLSNkZWZpbmUgTExfUkNDX1VTQVJUMV9DTEtTT1VSQ0VfU1lTQ0xLIFwNCi0gICgoUkNDX0NDSVBSX1VTQVJUMVNFTCA8PCAxNlUpIHwgICAgICBcDQotICAgUkNDX0NDSVBSX1VTQVJUMVNFTF8wKSAvKiE8IFNZU0NMSyBjbG9jayB1c2VkIGFzIFVTQVJUMSBjbG9jayBzb3VyY2UgKi8NCi0jZGVmaW5lIExMX1JDQ19VU0FSVDFfQ0xLU09VUkNFX0hTSSBcDQotICAoKFJDQ19DQ0lQUl9VU0FSVDFTRUwgPDwgMTZVKSB8ICAgXA0KLSAgIFJDQ19DQ0lQUl9VU0FSVDFTRUxfMSkgLyohPCBIU0kgY2xvY2sgdXNlZCBhcyBVU0FSVDEgY2xvY2sgc291cmNlICovDQotI2RlZmluZSBMTF9SQ0NfVVNBUlQxX0NMS1NPVVJDRV9MU0UgXA0KLSAgKChSQ0NfQ0NJUFJfVVNBUlQxU0VMIDw8IDE2VSkgfCAgIFwNCi0gICBSQ0NfQ0NJUFJfVVNBUlQxU0VMKSAvKiE8IExTRSBjbG9jayB1c2VkIGFzIFVTQVJUMSBjbG9jayBzb3VyY2UgKi8NCi0jZGVmaW5lIExMX1JDQ19VU0FSVDJfQ0xLU09VUkNFX1BDTEsxIFwNCi0gIChSQ0NfQ0NJUFJfVVNBUlQyU0VMIDw8IDE2VSkgLyohPCBQQ0xLMSBjbG9jayB1c2VkIGFzIFVTQVJUMiBjbG9jayBzb3VyY2UgKi8NCi0jZGVmaW5lIExMX1JDQ19VU0FSVDJfQ0xLU09VUkNFX1NZU0NMSyBcDQotICAoKFJDQ19DQ0lQUl9VU0FSVDJTRUwgPDwgMTZVKSB8ICAgICAgXA0KLSAgIFJDQ19DQ0lQUl9VU0FSVDJTRUxfMCkgLyohPCBTWVNDTEsgY2xvY2sgdXNlZCBhcyBVU0FSVDIgY2xvY2sgc291cmNlICovDQotI2RlZmluZSBMTF9SQ0NfVVNBUlQyX0NMS1NPVVJDRV9IU0kgXA0KLSAgKChSQ0NfQ0NJUFJfVVNBUlQyU0VMIDw8IDE2VSkgfCAgIFwNCi0gICBSQ0NfQ0NJUFJfVVNBUlQyU0VMXzEpIC8qITwgSFNJIGNsb2NrIHVzZWQgYXMgVVNBUlQyIGNsb2NrIHNvdXJjZSAqLw0KLSNkZWZpbmUgTExfUkNDX1VTQVJUMl9DTEtTT1VSQ0VfTFNFIFwNCi0gICgoUkNDX0NDSVBSX1VTQVJUMlNFTCA8PCAxNlUpIHwgICBcDQotICAgUkNDX0NDSVBSX1VTQVJUMlNFTCkgLyohPCBMU0UgY2xvY2sgdXNlZCBhcyBVU0FSVDIgY2xvY2sgc291cmNlICovDQotI2RlZmluZSBMTF9SQ0NfVVNBUlQzX0NMS1NPVVJDRV9QQ0xLMSBcDQotICAoUkNDX0NDSVBSX1VTQVJUM1NFTCA8PCAxNlUpIC8qITwgUENMSzEgY2xvY2sgdXNlZCBhcyBVU0FSVDMgY2xvY2sgc291cmNlICovDQotI2RlZmluZSBMTF9SQ0NfVVNBUlQzX0NMS1NPVVJDRV9TWVNDTEsgXA0KLSAgKChSQ0NfQ0NJUFJfVVNBUlQzU0VMIDw8IDE2VSkgfCAgICAgIFwNCi0gICBSQ0NfQ0NJUFJfVVNBUlQzU0VMXzApIC8qITwgU1lTQ0xLIGNsb2NrIHVzZWQgYXMgVVNBUlQzIGNsb2NrIHNvdXJjZSAqLw0KLSNkZWZpbmUgTExfUkNDX1VTQVJUM19DTEtTT1VSQ0VfSFNJIFwNCi0gICgoUkNDX0NDSVBSX1VTQVJUM1NFTCA8PCAxNlUpIHwgICBcDQotICAgUkNDX0NDSVBSX1VTQVJUM1NFTF8xKSAvKiE8IEhTSSBjbG9jayB1c2VkIGFzIFVTQVJUMyBjbG9jayBzb3VyY2UgKi8NCi0jZGVmaW5lIExMX1JDQ19VU0FSVDNfQ0xLU09VUkNFX0xTRSBcDQotICAoKFJDQ19DQ0lQUl9VU0FSVDNTRUwgPDwgMTZVKSB8ICAgXA0KLSAgIFJDQ19DQ0lQUl9VU0FSVDNTRUwpIC8qITwgTFNFIGNsb2NrIHVzZWQgYXMgVVNBUlQzIGNsb2NrIHNvdXJjZSAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfVUFSVHhfQ0xLU09VUkNFICBQZXJpcGhlcmFsIFVBUlQgY2xvY2sgc291cmNlIHNlbGVjdGlvbg0KLSAqIEB7DQotICovDQotI2lmIGRlZmluZWQoUkNDX0NDSVBSX1VBUlQ0U0VMKQ0KLSNkZWZpbmUgTExfUkNDX1VBUlQ0X0NMS1NPVVJDRV9QQ0xLMSBcDQotICAoUkNDX0NDSVBSX1VBUlQ0U0VMIDw8IDE2VSkgLyohPCBQQ0xLMSBjbG9jayB1c2VkIGFzIFVBUlQ0IGNsb2NrIHNvdXJjZSAqLw0KLSNkZWZpbmUgTExfUkNDX1VBUlQ0X0NMS1NPVVJDRV9TWVNDTEsgXA0KLSAgKChSQ0NfQ0NJUFJfVUFSVDRTRUwgPDwgMTZVKSB8ICAgICAgXA0KLSAgIFJDQ19DQ0lQUl9VQVJUNFNFTF8wKSAvKiE8IFNZU0NMSyBjbG9jayB1c2VkIGFzIFVBUlQ0IGNsb2NrIHNvdXJjZSAqLw0KLSNkZWZpbmUgTExfUkNDX1VBUlQ0X0NMS1NPVVJDRV9IU0kgXA0KLSAgKChSQ0NfQ0NJUFJfVUFSVDRTRUwgPDwgMTZVKSB8ICAgXA0KLSAgIFJDQ19DQ0lQUl9VQVJUNFNFTF8xKSAvKiE8IEhTSSBjbG9jayB1c2VkIGFzIFVBUlQ0IGNsb2NrIHNvdXJjZSAqLw0KLSNkZWZpbmUgTExfUkNDX1VBUlQ0X0NMS1NPVVJDRV9MU0UgXA0KLSAgKChSQ0NfQ0NJUFJfVUFSVDRTRUwgPDwgMTZVKSB8ICAgXA0KLSAgIFJDQ19DQ0lQUl9VQVJUNFNFTCkgLyohPCBMU0UgY2xvY2sgdXNlZCBhcyBVQVJUNCBjbG9jayBzb3VyY2UgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgIC8qIFJDQ19DQ0lQUl9VQVJUNFNFTCAqLw0KLSNpZiBkZWZpbmVkKFJDQ19DQ0lQUl9VQVJUNVNFTCkNCi0jZGVmaW5lIExMX1JDQ19VQVJUNV9DTEtTT1VSQ0VfUENMSzEgXA0KLSAgKFJDQ19DQ0lQUl9VQVJUNVNFTCA8PCAxNlUpIC8qITwgUENMSzEgY2xvY2sgdXNlZCBhcyBVQVJUNSBjbG9jayBzb3VyY2UgKi8NCi0jZGVmaW5lIExMX1JDQ19VQVJUNV9DTEtTT1VSQ0VfU1lTQ0xLIFwNCi0gICgoUkNDX0NDSVBSX1VBUlQ1U0VMIDw8IDE2VSkgfCAgICAgIFwNCi0gICBSQ0NfQ0NJUFJfVUFSVDVTRUxfMCkgLyohPCBTWVNDTEsgY2xvY2sgdXNlZCBhcyBVQVJUNSBjbG9jayBzb3VyY2UgKi8NCi0jZGVmaW5lIExMX1JDQ19VQVJUNV9DTEtTT1VSQ0VfSFNJIFwNCi0gICgoUkNDX0NDSVBSX1VBUlQ1U0VMIDw8IDE2VSkgfCAgIFwNCi0gICBSQ0NfQ0NJUFJfVUFSVDVTRUxfMSkgLyohPCBIU0kgY2xvY2sgdXNlZCBhcyBVQVJUNSBjbG9jayBzb3VyY2UgKi8NCi0jZGVmaW5lIExMX1JDQ19VQVJUNV9DTEtTT1VSQ0VfTFNFIFwNCi0gICgoUkNDX0NDSVBSX1VBUlQ1U0VMIDw8IDE2VSkgfCAgIFwNCi0gICBSQ0NfQ0NJUFJfVUFSVDVTRUwpIC8qITwgTFNFIGNsb2NrIHVzZWQgYXMgVUFSVDUgY2xvY2sgc291cmNlICovDQotI2VuZGlmICAgICAgICAgICAgICAgICAvKiBSQ0NfQ0NJUFJfVUFSVDVTRUwgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX0xQVUFSVDFfQ0xLU09VUkNFICBQZXJpcGhlcmFsIExQVUFSVCBjbG9jayBzb3VyY2UNCi0gKiBzZWxlY3Rpb24NCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfUkNDX0xQVUFSVDFfQ0xLU09VUkNFX1BDTEsxIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgUENMSzEgY2xvY2sgdXNlZCBhcyBMUFVBUlQxIGNsb2NrIHNvdXJjZSAqLw0KLSNkZWZpbmUgTExfUkNDX0xQVUFSVDFfQ0xLU09VUkNFX1NZU0NMSyBcDQotICBSQ0NfQ0NJUFJfTFBVQVJUMVNFTF8wIC8qITwgU1lTQ0xLIGNsb2NrIHVzZWQgYXMgTFBVQVJUMSBjbG9jayBzb3VyY2UgKi8NCi0jZGVmaW5lIExMX1JDQ19MUFVBUlQxX0NMS1NPVVJDRV9IU0kgXA0KLSAgUkNDX0NDSVBSX0xQVUFSVDFTRUxfMSAvKiE8IEhTSSBjbG9jayB1c2VkIGFzIExQVUFSVDEgY2xvY2sgc291cmNlICovDQotI2RlZmluZSBMTF9SQ0NfTFBVQVJUMV9DTEtTT1VSQ0VfTFNFIFwNCi0gIFJDQ19DQ0lQUl9MUFVBUlQxU0VMIC8qITwgTFNFIGNsb2NrIHVzZWQgYXMgTFBVQVJUMSBjbG9jayBzb3VyY2UgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX0kyQ3hfQ0xLU09VUkNFICBQZXJpcGhlcmFsIEkyQyBjbG9jayBzb3VyY2Ugc2VsZWN0aW9uDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1JDQ19JMkMxX0NMS1NPVVJDRV9QQ0xLMSBcDQotICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgIChSQ0NfT0ZGU0VUX0NDSVBSIDw8IDI0VSkgfCAgIFwNCi0gICAgICAoUkNDX0NDSVBSX0kyQzFTRUxfUG9zICAgICAgICBcDQotICAgICAgIDw8IDE2VSkpIC8qITwgUENMSzEgY2xvY2sgdXNlZCBhcyBJMkMxIGNsb2NrIHNvdXJjZSAqLw0KLSNkZWZpbmUgTExfUkNDX0kyQzFfQ0xLU09VUkNFX1NZU0NMSyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKFJDQ19PRkZTRVRfQ0NJUFIgPDwgMjRVKSB8IChSQ0NfQ0NJUFJfSTJDMVNFTF9Qb3MgPDwgMTZVKSB8IFwNCi0gICAoUkNDX0NDSVBSX0kyQzFTRUxfMCA+PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBSQ0NfQ0NJUFJfSTJDMVNFTF9Qb3MpKSAvKiE8IFNZU0NMSyBjbG9jayB1c2VkIGFzIEkyQzEgY2xvY2sgc291cmNlICovDQotI2RlZmluZSBMTF9SQ0NfSTJDMV9DTEtTT1VSQ0VfSFNJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoUkNDX09GRlNFVF9DQ0lQUiA8PCAyNFUpIHwgKFJDQ19DQ0lQUl9JMkMxU0VMX1BvcyA8PCAxNlUpIHwgXA0KLSAgIChSQ0NfQ0NJUFJfSTJDMVNFTF8xID4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIFJDQ19DQ0lQUl9JMkMxU0VMX1BvcykpIC8qITwgSFNJIGNsb2NrIHVzZWQgYXMgSTJDMSBjbG9jayBzb3VyY2UgKi8NCi0jZGVmaW5lIExMX1JDQ19JMkMyX0NMS1NPVVJDRV9QQ0xLMSBcDQotICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgIChSQ0NfT0ZGU0VUX0NDSVBSIDw8IDI0VSkgfCAgIFwNCi0gICAgICAoUkNDX0NDSVBSX0kyQzJTRUxfUG9zICAgICAgICBcDQotICAgICAgIDw8IDE2VSkpIC8qITwgUENMSzEgY2xvY2sgdXNlZCBhcyBJMkMyIGNsb2NrIHNvdXJjZSAqLw0KLSNkZWZpbmUgTExfUkNDX0kyQzJfQ0xLU09VUkNFX1NZU0NMSyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKFJDQ19PRkZTRVRfQ0NJUFIgPDwgMjRVKSB8IChSQ0NfQ0NJUFJfSTJDMlNFTF9Qb3MgPDwgMTZVKSB8IFwNCi0gICAoUkNDX0NDSVBSX0kyQzJTRUxfMCA+PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBSQ0NfQ0NJUFJfSTJDMlNFTF9Qb3MpKSAvKiE8IFNZU0NMSyBjbG9jayB1c2VkIGFzIEkyQzIgY2xvY2sgc291cmNlICovDQotI2RlZmluZSBMTF9SQ0NfSTJDMl9DTEtTT1VSQ0VfSFNJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoUkNDX09GRlNFVF9DQ0lQUiA8PCAyNFUpIHwgKFJDQ19DQ0lQUl9JMkMyU0VMX1BvcyA8PCAxNlUpIHwgXA0KLSAgIChSQ0NfQ0NJUFJfSTJDMlNFTF8xID4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIFJDQ19DQ0lQUl9JMkMyU0VMX1BvcykpIC8qITwgSFNJIGNsb2NrIHVzZWQgYXMgSTJDMiBjbG9jayBzb3VyY2UgKi8NCi0jZGVmaW5lIExMX1JDQ19JMkMzX0NMS1NPVVJDRV9QQ0xLMSBcDQotICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgIChSQ0NfT0ZGU0VUX0NDSVBSIDw8IDI0VSkgfCAgIFwNCi0gICAgICAoUkNDX0NDSVBSX0kyQzNTRUxfUG9zICAgICAgICBcDQotICAgICAgIDw8IDE2VSkpIC8qITwgUENMSzEgY2xvY2sgdXNlZCBhcyBJMkMzIGNsb2NrIHNvdXJjZSAqLw0KLSNkZWZpbmUgTExfUkNDX0kyQzNfQ0xLU09VUkNFX1NZU0NMSyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKFJDQ19PRkZTRVRfQ0NJUFIgPDwgMjRVKSB8IChSQ0NfQ0NJUFJfSTJDM1NFTF9Qb3MgPDwgMTZVKSB8IFwNCi0gICAoUkNDX0NDSVBSX0kyQzNTRUxfMCA+PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBSQ0NfQ0NJUFJfSTJDM1NFTF9Qb3MpKSAvKiE8IFNZU0NMSyBjbG9jayB1c2VkIGFzIEkyQzMgY2xvY2sgc291cmNlICovDQotI2RlZmluZSBMTF9SQ0NfSTJDM19DTEtTT1VSQ0VfSFNJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoUkNDX09GRlNFVF9DQ0lQUiA8PCAyNFUpIHwgKFJDQ19DQ0lQUl9JMkMzU0VMX1BvcyA8PCAxNlUpIHwgXA0KLSAgIChSQ0NfQ0NJUFJfSTJDM1NFTF8xID4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIFJDQ19DQ0lQUl9JMkMzU0VMX1BvcykpIC8qITwgSFNJIGNsb2NrIHVzZWQgYXMgSTJDMyBjbG9jayBzb3VyY2UgKi8NCi0jaWYgZGVmaW5lZChSQ0NfQ0NJUFIyX0kyQzRTRUwpDQotI2RlZmluZSBMTF9SQ0NfSTJDNF9DTEtTT1VSQ0VfUENMSzEgXA0KLSAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAoUkNDX09GRlNFVF9DQ0lQUjIgPDwgMjRVKSB8ICBcDQotICAgICAgKFJDQ19DQ0lQUjJfSTJDNFNFTF9Qb3MgICAgICAgXA0KLSAgICAgICA8PCAxNlUpKSAvKiE8IFBDTEsxIGNsb2NrIHVzZWQgYXMgSTJDNCBjbG9jayBzb3VyY2UgKi8NCi0jZGVmaW5lIExMX1JDQ19JMkM0X0NMS1NPVVJDRV9TWVNDTEsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKFJDQ19PRkZTRVRfQ0NJUFIyIDw8IDI0VSkgfCAoUkNDX0NDSVBSMl9JMkM0U0VMX1BvcyA8PCAxNlUpIHwgXA0KLSAgIChSQ0NfQ0NJUFIyX0kyQzRTRUxfMCA+PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgUkNDX0NDSVBSMl9JMkM0U0VMX1BvcykpIC8qITwgU1lTQ0xLIGNsb2NrIHVzZWQgYXMgSTJDNCBjbG9jayBzb3VyY2UgKi8NCi0jZGVmaW5lIExMX1JDQ19JMkM0X0NMS1NPVVJDRV9IU0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKFJDQ19PRkZTRVRfQ0NJUFIyIDw8IDI0VSkgfCAoUkNDX0NDSVBSMl9JMkM0U0VMX1BvcyA8PCAxNlUpIHwgXA0KLSAgIChSQ0NfQ0NJUFIyX0kyQzRTRUxfMSA+PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgUkNDX0NDSVBSMl9JMkM0U0VMX1BvcykpIC8qITwgSFNJIGNsb2NrIHVzZWQgYXMgSTJDNCBjbG9jayBzb3VyY2UgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgIC8qIFJDQ19DQ0lQUjJfSTJDNFNFTCAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfTFBUSU0xX0NMS1NPVVJDRSAgUGVyaXBoZXJhbCBMUFRJTSBjbG9jayBzb3VyY2UNCi0gKiBzZWxlY3Rpb24NCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfUkNDX0xQVElNMV9DTEtTT1VSQ0VfUENMSzEgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBQQ0xLMSBjbG9jayB1c2VkIGFzIExQVElNMSBjbG9jayBzb3VyY2UgKi8NCi0jZGVmaW5lIExMX1JDQ19MUFRJTTFfQ0xLU09VUkNFX0xTSSBcDQotICBSQ0NfQ0NJUFJfTFBUSU0xU0VMXzAgLyohPCBMU0kgY2xvY2sgdXNlZCBhcyBMUFRJTTEgY2xvY2sgc291cmNlICovDQotI2RlZmluZSBMTF9SQ0NfTFBUSU0xX0NMS1NPVVJDRV9IU0kgXA0KLSAgUkNDX0NDSVBSX0xQVElNMVNFTF8xIC8qITwgSFNJIGNsb2NrIHVzZWQgYXMgTFBUSU0xIGNsb2NrIHNvdXJjZSAqLw0KLSNkZWZpbmUgTExfUkNDX0xQVElNMV9DTEtTT1VSQ0VfTFNFIFwNCi0gIFJDQ19DQ0lQUl9MUFRJTTFTRUwgLyohPCBMU0UgY2xvY2sgdXNlZCBhcyBMUFRJTTEgY2xvY2sgc291cmNlICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19TQUkxX0NMS1NPVVJDRSAgUGVyaXBoZXJhbCBTQUkgY2xvY2sgc291cmNlIHNlbGVjdGlvbg0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9SQ0NfU0FJMV9DTEtTT1VSQ0VfU1lTQ0xLIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgU3lzdGVtIGNsb2NrIHVzZWQgYXMgU0FJMSBjbG9jayBzb3VyY2UgKi8NCi0jZGVmaW5lIExMX1JDQ19TQUkxX0NMS1NPVVJDRV9QTEwgXA0KLSAgUkNDX0NDSVBSX1NBSTFTRUxfMCAvKiE8IFBMTCBjbG9jayB1c2VkIGFzIFNBSTEgY2xvY2sgc291cmNlICovDQotI2RlZmluZSBMTF9SQ0NfU0FJMV9DTEtTT1VSQ0VfUElOIFwNCi0gIFJDQ19DQ0lQUl9TQUkxU0VMXzEgLyohPCBFWFQgY2xvY2sgdXNlZCBhcyBTQUkxIGNsb2NrIHNvdXJjZSAqLw0KLSNkZWZpbmUgTExfUkNDX1NBSTFfQ0xLU09VUkNFX0hTSSBcDQotICAoUkNDX0NDSVBSX1NBSTFTRUxfMCB8ICAgICAgICAgIFwNCi0gICBSQ0NfQ0NJUFJfU0FJMVNFTF8xKSAvKiE8IEhTSSBjbG9jayB1c2VkIGFzIFNBSTEgY2xvY2sgc291cmNlICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19JMlNfQ0xLU09VUkNFICBQZXJpcGhlcmFsIEkyUyBjbG9jayBzb3VyY2Ugc2VsZWN0aW9uDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1JDQ19JMlNfQ0xLU09VUkNFX1NZU0NMSyBcDQotICAweDAwMDAwMDAwVSAvKiE8IFN5c3RlbSBjbG9jayB1c2VkIGFzIEkyUyBjbG9jayBzb3VyY2UgKi8NCi0jZGVmaW5lIExMX1JDQ19JMlNfQ0xLU09VUkNFX1BMTCBcDQotICBSQ0NfQ0NJUFJfSTJTMjNTRUxfMCAvKiE8IFBMTCBjbG9jayB1c2VkIGFzIEkyUyBjbG9jayBzb3VyY2UgKi8NCi0jZGVmaW5lIExMX1JDQ19JMlNfQ0xLU09VUkNFX1BJTiBcDQotICBSQ0NfQ0NJUFJfSTJTMjNTRUxfMSAvKiE8IEVYVCBjbG9jayB1c2VkIGFzIEkyUyBjbG9jayBzb3VyY2UgKi8NCi0jZGVmaW5lIExMX1JDQ19JMlNfQ0xLU09VUkNFX0hTSSBcDQotICAoUkNDX0NDSVBSX0kyUzIzU0VMXzAgfCAgICAgICAgXA0KLSAgIFJDQ19DQ0lQUl9JMlMyM1NFTF8xKSAvKiE8IEhTSSBjbG9jayB1c2VkIGFzIEkyUyBjbG9jayBzb3VyY2UgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLSNpZiBkZWZpbmVkKEZEQ0FOMSkNCi0vKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19GRENBTl9DTEtTT1VSQ0UgIFBlcmlwaGVyYWwgRkRDQU4gY2xvY2sgc291cmNlIHNlbGVjdGlvbg0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9SQ0NfRkRDQU5fQ0xLU09VUkNFX0hTRSBcDQotICAweDAwMDAwMDAwVSAvKiE8IEhTRSBjbG9jayB1c2VkIGFzIEZEQ0FOIGNsb2NrIHNvdXJjZSAqLw0KLSNkZWZpbmUgTExfUkNDX0ZEQ0FOX0NMS1NPVVJDRV9QTEwgXA0KLSAgUkNDX0NDSVBSX0ZEQ0FOU0VMXzAgLyohPCBQTEwgY2xvY2sgdXNlZCBhcyBGRENBTiBjbG9jayBzb3VyY2UgKi8NCi0jZGVmaW5lIExMX1JDQ19GRENBTl9DTEtTT1VSQ0VfUENMSzEgXA0KLSAgUkNDX0NDSVBSX0ZEQ0FOU0VMXzEgLyohPCBQQ0xLMSBjbG9jayB1c2VkIGFzIEZEQ0FOIGNsb2NrIHNvdXJjZSAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotI2VuZGlmIC8qIEZEQ0FOMSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX1JOR19DTEtTT1VSQ0UgIFBlcmlwaGVyYWwgUk5HIGNsb2NrIHNvdXJjZSBzZWxlY3Rpb24NCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfUkNDX1JOR19DTEtTT1VSQ0VfSFNJNDggXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBIU0k0OCBjbG9jayB1c2VkIGFzIFJORyBjbG9jayBzb3VyY2UgKi8NCi0jZGVmaW5lIExMX1JDQ19STkdfQ0xLU09VUkNFX1BMTCBcDQotICBSQ0NfQ0NJUFJfQ0xLNDhTRUxfMSAvKiE8IFBMTCBjbG9jayB1c2VkIGFzIFJORyBjbG9jayBzb3VyY2UgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX1VTQl9DTEtTT1VSQ0UgIFBlcmlwaGVyYWwgVVNCIGNsb2NrIHNvdXJjZSBzZWxlY3Rpb24NCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfUkNDX1VTQl9DTEtTT1VSQ0VfSFNJNDggXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBIU0k0OCBjbG9jayB1c2VkIGFzIFVTQiBjbG9jayBzb3VyY2UgKi8NCi0jZGVmaW5lIExMX1JDQ19VU0JfQ0xLU09VUkNFX1BMTCBcDQotICBSQ0NfQ0NJUFJfQ0xLNDhTRUxfMSAvKiE8IFBMTCBjbG9jayB1c2VkIGFzIFVTQiBjbG9jayBzb3VyY2UgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX0FEQ19DTEtTT1VSQ0UgIFBlcmlwaGVyYWwgQURDIGNsb2NrIHNvdXJjZSBzZWxlY3Rpb24NCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfUkNDX0FEQzEyX0NMS1NPVVJDRV9OT05FIFwNCi0gICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgKFJDQ19PRkZTRVRfQ0NJUFIgPDwgMjRVKSB8ICAgXA0KLSAgICAgIChSQ0NfQ0NJUFJfQURDMTJTRUxfUG9zICAgICAgIFwNCi0gICAgICAgPDwgMTZVKSkgLyohPCBObyBjbG9jayB1c2VkIGFzIEFEQzEyIGNsb2NrIHNvdXJjZSAqLw0KLSNkZWZpbmUgTExfUkNDX0FEQzEyX0NMS1NPVVJDRV9QTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKChSQ0NfT0ZGU0VUX0NDSVBSIDw8IDI0VSkgfCAoUkNDX0NDSVBSX0FEQzEyU0VMX1BvcyA8PCAxNlUpIHwgXA0KLSAgIChSQ0NfQ0NJUFJfQURDMTJTRUxfMCA+PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBSQ0NfQ0NJUFJfQURDMTJTRUxfUG9zKSkgLyohPCBQTEwgY2xvY2sgdXNlZCBhcyBBREMxMiBjbG9jayBzb3VyY2UgKi8NCi0jZGVmaW5lIExMX1JDQ19BREMxMl9DTEtTT1VSQ0VfU1lTQ0xLICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoUkNDX09GRlNFVF9DQ0lQUiA8PCAyNFUpIHwgKFJDQ19DQ0lQUl9BREMxMlNFTF9Qb3MgPDwgMTZVKSB8IFwNCi0gICAoUkNDX0NDSVBSX0FEQzEyU0VMXzEgPj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgUkNDX0NDSVBSX0FEQzEyU0VMX1BvcykpIC8qITwgU1lTQ0xLIGNsb2NrIHVzZWQgYXMgQURDMTIgY2xvY2sgc291cmNlICovDQotI2lmIGRlZmluZWQoUkNDX0NDSVBSX0FEQzM0NVNFTCkNCi0jZGVmaW5lIExMX1JDQ19BREMzNDVfQ0xLU09VUkNFX05PTkUgXA0KLSAgKChSQ0NfT0ZGU0VUX0NDSVBSIDw8IDI0VSkgfCAgICAgICBcDQotICAgKFJDQ19DQ0lQUl9BREMzNDVTRUxfUG9zICAgICAgICAgIFwNCi0gICAgPDwgMTZVKSkgLyohPCBObyBjbG9jayB1c2VkIGFzIEFEQzM0NSBjbG9jayBzb3VyY2UgKi8NCi0jZGVmaW5lIExMX1JDQ19BREMzNDVfQ0xLU09VUkNFX1BMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKFJDQ19PRkZTRVRfQ0NJUFIgPDwgMjRVKSB8IChSQ0NfQ0NJUFJfQURDMzQ1U0VMX1BvcyA8PCAxNlUpIHwgXA0KLSAgIChSQ0NfQ0NJUFJfQURDMzQ1U0VMXzAgPj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgUkNDX0NDSVBSX0FEQzM0NVNFTF9Qb3MpKSAvKiE8IFBMTCBjbG9jayB1c2VkIGFzIEFEQzM0NSBjbG9jayBzb3VyY2UgKi8NCi0jZGVmaW5lIExMX1JDQ19BREMzNDVfQ0xLU09VUkNFX1NZU0NMSyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKFJDQ19PRkZTRVRfQ0NJUFIgPDwgMjRVKSB8IChSQ0NfQ0NJUFJfQURDMzQ1U0VMX1BvcyA8PCAxNlUpIHwgXA0KLSAgIChSQ0NfQ0NJUFJfQURDMzQ1U0VMXzEgPj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgUkNDX0NDSVBSX0FEQzM0NVNFTF9Qb3MpKSAvKiE8IFNZU0NMSyBjbG9jayB1c2VkIGFzIEFEQzM0NSBjbG9jayBzb3VyY2UgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAvKiBSQ0NfQ0NJUFJfQURDMzQ1U0VMICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19RVUFEU1BJICBQZXJpcGhlcmFsIFFVQURTUEkgZ2V0IGNsb2NrIHNvdXJjZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9SQ0NfUVVBRFNQSV9DTEtTT1VSQ0VfU1lTQ0xLIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgU1lTQ0xLIHVzZWQgYXMgUXVhZFNQSSBjbG9jayBzb3VyY2UgKi8NCi0jZGVmaW5lIExMX1JDQ19RVUFEU1BJX0NMS1NPVVJDRV9IU0kgXA0KLSAgUkNDX0NDSVBSMl9RU1BJU0VMXzAgLyohPCBIU0kgdXNlZCBhcyBRdWFkU1BJIGNsb2NrIHNvdXJjZSAqLw0KLSNkZWZpbmUgTExfUkNDX1FVQURTUElfQ0xLU09VUkNFX1BMTCBcDQotICBSQ0NfQ0NJUFIyX1FTUElTRUxfMSAvKiE8IFBMTCB1c2VkIGFzIFF1YWRTUEkgY2xvY2sgc291cmNlICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19VU0FSVHggUGVyaXBoZXJhbCBVU0FSVCBnZXQgY2xvY2sgc291cmNlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1JDQ19VU0FSVDFfQ0xLU09VUkNFIFwNCi0gIFJDQ19DQ0lQUl9VU0FSVDFTRUwgLyohPCBVU0FSVDEgQ2xvY2sgc291cmNlIHNlbGVjdGlvbiAqLw0KLSNkZWZpbmUgTExfUkNDX1VTQVJUMl9DTEtTT1VSQ0UgXA0KLSAgUkNDX0NDSVBSX1VTQVJUMlNFTCAvKiE8IFVTQVJUMiBDbG9jayBzb3VyY2Ugc2VsZWN0aW9uICovDQotI2RlZmluZSBMTF9SQ0NfVVNBUlQzX0NMS1NPVVJDRSBcDQotICBSQ0NfQ0NJUFJfVVNBUlQzU0VMIC8qITwgVVNBUlQzIENsb2NrIHNvdXJjZSBzZWxlY3Rpb24gKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX1VBUlR4IFBlcmlwaGVyYWwgVUFSVCBnZXQgY2xvY2sgc291cmNlDQotICogQHsNCi0gKi8NCi0jaWYgZGVmaW5lZChSQ0NfQ0NJUFJfVUFSVDRTRUwpDQotI2RlZmluZSBMTF9SQ0NfVUFSVDRfQ0xLU09VUkNFIFwNCi0gIFJDQ19DQ0lQUl9VQVJUNFNFTCAvKiE8IFVBUlQ0IENsb2NrIHNvdXJjZSBzZWxlY3Rpb24gKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAvKiBSQ0NfQ0NJUFJfVUFSVDRTRUwgKi8NCi0jaWYgZGVmaW5lZChSQ0NfQ0NJUFJfVUFSVDVTRUwpDQotI2RlZmluZSBMTF9SQ0NfVUFSVDVfQ0xLU09VUkNFIFwNCi0gIFJDQ19DQ0lQUl9VQVJUNVNFTCAvKiE8IFVBUlQ1IENsb2NrIHNvdXJjZSBzZWxlY3Rpb24gKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAvKiBSQ0NfQ0NJUFJfVUFSVDVTRUwgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX0xQVUFSVDEgUGVyaXBoZXJhbCBMUFVBUlQgZ2V0IGNsb2NrIHNvdXJjZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9SQ0NfTFBVQVJUMV9DTEtTT1VSQ0UgXA0KLSAgUkNDX0NDSVBSX0xQVUFSVDFTRUwgLyohPCBMUFVBUlQxIENsb2NrIHNvdXJjZSBzZWxlY3Rpb24gKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX0kyQzEgUGVyaXBoZXJhbCBJMkMgZ2V0IGNsb2NrIHNvdXJjZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9SQ0NfSTJDMV9DTEtTT1VSQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoUkNDX09GRlNFVF9DQ0lQUiA8PCAyNFUpIHwgKFJDQ19DQ0lQUl9JMkMxU0VMX1BvcyA8PCAxNlUpIHwgXA0KLSAgIChSQ0NfQ0NJUFJfSTJDMVNFTCA+PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIFJDQ19DQ0lQUl9JMkMxU0VMX1BvcykpIC8qITwgSTJDMSBDbG9jayBzb3VyY2Ugc2VsZWN0aW9uICovDQotI2RlZmluZSBMTF9SQ0NfSTJDMl9DTEtTT1VSQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoUkNDX09GRlNFVF9DQ0lQUiA8PCAyNFUpIHwgKFJDQ19DQ0lQUl9JMkMyU0VMX1BvcyA8PCAxNlUpIHwgXA0KLSAgIChSQ0NfQ0NJUFJfSTJDMlNFTCA+PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIFJDQ19DQ0lQUl9JMkMyU0VMX1BvcykpIC8qITwgSTJDMiBDbG9jayBzb3VyY2Ugc2VsZWN0aW9uICovDQotI2RlZmluZSBMTF9SQ0NfSTJDM19DTEtTT1VSQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoUkNDX09GRlNFVF9DQ0lQUiA8PCAyNFUpIHwgKFJDQ19DQ0lQUl9JMkMzU0VMX1BvcyA8PCAxNlUpIHwgXA0KLSAgIChSQ0NfQ0NJUFJfSTJDM1NFTCA+PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIFJDQ19DQ0lQUl9JMkMzU0VMX1BvcykpIC8qITwgSTJDMyBDbG9jayBzb3VyY2Ugc2VsZWN0aW9uICovDQotI2lmIGRlZmluZWQoUkNDX0NDSVBSMl9JMkM0U0VMKQ0KLSNkZWZpbmUgTExfUkNDX0kyQzRfQ0xLU09VUkNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoUkNDX09GRlNFVF9DQ0lQUjIgPDwgMjRVKSB8IChSQ0NfQ0NJUFIyX0kyQzRTRUxfUG9zIDw8IDE2VSkgfCBcDQotICAgKFJDQ19DQ0lQUjJfSTJDNFNFTCA+PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBSQ0NfQ0NJUFIyX0kyQzRTRUxfUG9zKSkgLyohPCBJMkM0IENsb2NrIHNvdXJjZSBzZWxlY3Rpb24gKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgIC8qIFJDQ19DQ0lQUjJfSTJDNFNFTCAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfTFBUSU0xIFBlcmlwaGVyYWwgTFBUSU0gZ2V0IGNsb2NrIHNvdXJjZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9SQ0NfTFBUSU0xX0NMS1NPVVJDRSBcDQotICBSQ0NfQ0NJUFJfTFBUSU0xU0VMIC8qITwgTFBUSU0xIENsb2NrIHNvdXJjZSBzZWxlY3Rpb24gKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX1NBSTEgIFBlcmlwaGVyYWwgU0FJIGdldCBjbG9jayBzb3VyY2UNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfUkNDX1NBSTFfQ0xLU09VUkNFIFwNCi0gIFJDQ19DQ0lQUl9TQUkxU0VMIC8qITwgU0FJMSBDbG9jayBzb3VyY2Ugc2VsZWN0aW9uICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19JMlMgIFBlcmlwaGVyYWwgSTJTIGdldCBjbG9jayBzb3VyY2UNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfUkNDX0kyU19DTEtTT1VSQ0UgXA0KLSAgUkNDX0NDSVBSX0kyUzIzU0VMIC8qITwgSTJTIENsb2NrIHNvdXJjZSBzZWxlY3Rpb24gKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLSNpZiBkZWZpbmVkKEZEQ0FOMSkNCi0vKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19GRENBTiAgUGVyaXBoZXJhbCBGRENBTiBnZXQgY2xvY2sgc291cmNlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1JDQ19GRENBTl9DTEtTT1VSQ0UgXA0KLSAgUkNDX0NDSVBSX0ZEQ0FOU0VMIC8qITwgRkRDQU4gQ2xvY2sgc291cmNlIHNlbGVjdGlvbiAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgIC8qIEZEQ0FOMSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfUk5HICBQZXJpcGhlcmFsIFJORyBnZXQgY2xvY2sgc291cmNlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1JDQ19STkdfQ0xLU09VUkNFIFwNCi0gIFJDQ19DQ0lQUl9DTEs0OFNFTCAvKiE8IFJORyBDbG9jayBzb3VyY2Ugc2VsZWN0aW9uICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19VU0IgIFBlcmlwaGVyYWwgVVNCIGdldCBjbG9jayBzb3VyY2UNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfUkNDX1VTQl9DTEtTT1VSQ0UgXA0KLSAgUkNDX0NDSVBSX0NMSzQ4U0VMIC8qITwgVVNCIENsb2NrIHNvdXJjZSBzZWxlY3Rpb24gKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX0FEQyAgUGVyaXBoZXJhbCBBREMgZ2V0IGNsb2NrIHNvdXJjZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9SQ0NfQURDMTJfQ0xLU09VUkNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKFJDQ19PRkZTRVRfQ0NJUFIgPDwgMjRVKSB8IChSQ0NfQ0NJUFJfQURDMTJTRUxfUG9zIDw8IDE2VSkgfCBcDQotICAgKFJDQ19DQ0lQUl9BREMxMlNFTCA+PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIFJDQ19DQ0lQUl9BREMxMlNFTF9Qb3MpKSAvKiE8IEFEQzEyIENsb2NrIHNvdXJjZSBzZWxlY3Rpb24gKi8NCi0jaWYgZGVmaW5lZChSQ0NfQ0NJUFJfQURDMzQ1U0VMX1BvcykNCi0jZGVmaW5lIExMX1JDQ19BREMzNDVfQ0xLU09VUkNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKFJDQ19PRkZTRVRfQ0NJUFIgPDwgMjRVKSB8IChSQ0NfQ0NJUFJfQURDMzQ1U0VMX1BvcyA8PCAxNlUpIHwgXA0KLSAgIChSQ0NfQ0NJUFJfQURDMzQ1U0VMID4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgUkNDX0NDSVBSX0FEQzM0NVNFTF9Qb3MpKSAvKiE8IEFEQzM0NSBDbG9jayBzb3VyY2Ugc2VsZWN0aW9uICovDQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgLyogUkNDX0NDSVBSX0FEQzM0NVNFTF9Qb3MgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX1FVQURTUEkgIFBlcmlwaGVyYWwgUVVBRFNQSSBnZXQgY2xvY2sgc291cmNlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1JDQ19RVUFEU1BJX0NMS1NPVVJDRSBcDQotICBSQ0NfQ0NJUFIyX1FTUElTRUwgLyohPCBRdWFkU1BJIENsb2NrIHNvdXJjZSBzZWxlY3Rpb24gKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX1JUQ19DTEtTT1VSQ0UgIFJUQyBjbG9jayBzb3VyY2Ugc2VsZWN0aW9uDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1JDQ19SVENfQ0xLU09VUkNFX05PTkUgICAgICAgICAgICAgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBObyBjbG9jayB1c2VkIGFzIFJUQyBjbG9jayBcDQotICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX1JDQ19SVENfQ0xLU09VUkNFX0xTRSBcDQotICBSQ0NfQkRDUl9SVENTRUxfMCAvKiE8IExTRSBvc2NpbGxhdG9yIGNsb2NrIHVzZWQgYXMgUlRDIGNsb2NrICovDQotI2RlZmluZSBMTF9SQ0NfUlRDX0NMS1NPVVJDRV9MU0kgXA0KLSAgUkNDX0JEQ1JfUlRDU0VMXzEgLyohPCBMU0kgb3NjaWxsYXRvciBjbG9jayB1c2VkIGFzIFJUQyBjbG9jayAqLw0KLSNkZWZpbmUgTExfUkNDX1JUQ19DTEtTT1VSQ0VfSFNFX0RJVjMyIFwNCi0gIFJDQ19CRENSX1JUQ1NFTCAvKiE8IEhTRSBvc2NpbGxhdG9yIGNsb2NrIGRpdmlkZWQgYnkgMzIgdXNlZCBhcyBSVEMgY2xvY2sgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX1BMTFNPVVJDRSAgUExMIGVudHJ5IGNsb2NrIHNvdXJjZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9SQ0NfUExMU09VUkNFX05PTkUgMHgwMDAwMDAwMFUgLyohPCBObyBjbG9jayAqLw0KLSNkZWZpbmUgTExfUkNDX1BMTFNPVVJDRV9IU0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgUkNDX1BMTENGR1JfUExMU1JDX0hTSSAvKiE8IEhTSTE2IGNsb2NrIHNlbGVjdGVkIGFzIFBMTCBlbnRyeSBjbG9jayBzb3VyY2UgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX1JDQ19QTExTT1VSQ0VfSFNFIFwNCi0gIFJDQ19QTExDRkdSX1BMTFNSQ19IU0UgLyohPCBIU0UgY2xvY2sgc2VsZWN0ZWQgYXMgUExMIGVudHJ5IGNsb2NrIHNvdXJjZSAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfUExMTV9ESVYgIFBMTCBkaXZpc2lvbiBmYWN0b3INCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfUkNDX1BMTE1fRElWXzEgMHgwMDAwMDAwMFUgICAgICAgIC8qITwgUExMIGRpdmlzaW9uIGZhY3RvciBieSAxICovDQotI2RlZmluZSBMTF9SQ0NfUExMTV9ESVZfMiBSQ0NfUExMQ0ZHUl9QTExNXzAgLyohPCBQTEwgZGl2aXNpb24gZmFjdG9yIGJ5IDIgKi8NCi0jZGVmaW5lIExMX1JDQ19QTExNX0RJVl8zIFJDQ19QTExDRkdSX1BMTE1fMSAvKiE8IFBMTCBkaXZpc2lvbiBmYWN0b3IgYnkgMyAqLw0KLSNkZWZpbmUgTExfUkNDX1BMTE1fRElWXzQgXA0KLSAgKFJDQ19QTExDRkdSX1BMTE1fMSB8IFJDQ19QTExDRkdSX1BMTE1fMCkgIC8qITwgUExMIGRpdmlzaW9uIGZhY3RvciBieSA0ICovDQotI2RlZmluZSBMTF9SQ0NfUExMTV9ESVZfNSBSQ0NfUExMQ0ZHUl9QTExNXzIgLyohPCBQTEwgZGl2aXNpb24gZmFjdG9yIGJ5IDUgKi8NCi0jZGVmaW5lIExMX1JDQ19QTExNX0RJVl82IFwNCi0gIChSQ0NfUExMQ0ZHUl9QTExNXzIgfCBSQ0NfUExMQ0ZHUl9QTExNXzApIC8qITwgUExMIGRpdmlzaW9uIGZhY3RvciBieSA2ICovDQotI2RlZmluZSBMTF9SQ0NfUExMTV9ESVZfNyBcDQotICAoUkNDX1BMTENGR1JfUExMTV8yIHwgUkNDX1BMTENGR1JfUExMTV8xKSAvKiE8IFBMTCBkaXZpc2lvbiBmYWN0b3IgYnkgNyAqLw0KLSNkZWZpbmUgTExfUkNDX1BMTE1fRElWXzggICAgICAgICAgICAgICAgICAgIFwNCi0gIChSQ0NfUExMQ0ZHUl9QTExNXzIgfCBSQ0NfUExMQ0ZHUl9QTExNXzEgfCBcDQotICAgUkNDX1BMTENGR1JfUExMTV8wKSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBQTEwgZGl2aXNpb24gZmFjdG9yIGJ5IDggKi8NCi0jZGVmaW5lIExMX1JDQ19QTExNX0RJVl85IFJDQ19QTExDRkdSX1BMTE1fMyAvKiE8IFBMTCBkaXZpc2lvbiBmYWN0b3IgYnkgOSAqLw0KLSNkZWZpbmUgTExfUkNDX1BMTE1fRElWXzEwIFwNCi0gIChSQ0NfUExMQ0ZHUl9QTExNXzMgfCBSQ0NfUExMQ0ZHUl9QTExNXzApIC8qITwgUExMIGRpdmlzaW9uIGZhY3RvciBieSAxMCAqLw0KLSNkZWZpbmUgTExfUkNDX1BMTE1fRElWXzExIFwNCi0gIChSQ0NfUExMQ0ZHUl9QTExNXzMgfCBSQ0NfUExMQ0ZHUl9QTExNXzEpIC8qITwgUExMIGRpdmlzaW9uIGZhY3RvciBieSAxMSAqLw0KLSNkZWZpbmUgTExfUkNDX1BMTE1fRElWXzEyICAgICAgICAgICAgICAgICAgIFwNCi0gIChSQ0NfUExMQ0ZHUl9QTExNXzMgfCBSQ0NfUExMQ0ZHUl9QTExNXzEgfCBcDQotICAgUkNDX1BMTENGR1JfUExMTV8wKSAvKiE8IFBMTCBkaXZpc2lvbiBmYWN0b3IgYnkgMTIgKi8NCi0jZGVmaW5lIExMX1JDQ19QTExNX0RJVl8xMyBcDQotICAoUkNDX1BMTENGR1JfUExMTV8zIHwgUkNDX1BMTENGR1JfUExMTV8yKSAvKiE8IFBMTCBkaXZpc2lvbiBmYWN0b3IgYnkgMTMgKi8NCi0jZGVmaW5lIExMX1JDQ19QTExNX0RJVl8xNCAgICAgICAgICAgICAgICAgICBcDQotICAoUkNDX1BMTENGR1JfUExMTV8zIHwgUkNDX1BMTENGR1JfUExMTV8yIHwgXA0KLSAgIFJDQ19QTExDRkdSX1BMTE1fMCkgLyohPCBQTEwgZGl2aXNpb24gZmFjdG9yIGJ5IDE0ICovDQotI2RlZmluZSBMTF9SQ0NfUExMTV9ESVZfMTUgICAgICAgICAgICAgICAgICAgXA0KLSAgKFJDQ19QTExDRkdSX1BMTE1fMyB8IFJDQ19QTExDRkdSX1BMTE1fMiB8IFwNCi0gICBSQ0NfUExMQ0ZHUl9QTExNXzEpIC8qITwgUExMIGRpdmlzaW9uIGZhY3RvciBieSAxNSAqLw0KLSNkZWZpbmUgTExfUkNDX1BMTE1fRElWXzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChSQ0NfUExMQ0ZHUl9QTExNXzMgfCBSQ0NfUExMQ0ZHUl9QTExNXzIgfCBSQ0NfUExMQ0ZHUl9QTExNXzEgfCBcDQotICAgUkNDX1BMTENGR1JfUExMTV8wKSAvKiE8IFBMTCBkaXZpc2lvbiBmYWN0b3IgYnkgMTYgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX1BMTFJfRElWICBQTEwgZGl2aXNpb24gZmFjdG9yIChQTExSKQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9SQ0NfUExMUl9ESVZfMiBcDQotICAweDAwMDAwMDAwVSAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMQ0xLIChzeXN0ZW0gY2xvY2spIGJ5IDIgKi8NCi0jZGVmaW5lIExMX1JDQ19QTExSX0RJVl80ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKFJDQ19QTExDRkdSX1BMTFJfMCkgLyohPCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTENMSyAoc3lzdGVtIGNsb2NrKSBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICBieSA0ICovDQotI2RlZmluZSBMTF9SQ0NfUExMUl9ESVZfNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChSQ0NfUExMQ0ZHUl9QTExSXzEpIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExDTEsgKHN5c3RlbSBjbG9jaykgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgNiAqLw0KLSNkZWZpbmUgTExfUkNDX1BMTFJfRElWXzggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKFJDQ19QTExDRkdSX1BMTFIpIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExDTEsgKHN5c3RlbSBjbG9jaykgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJ5IDggKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX1BMTFBfRElWICBQTEwgZGl2aXNpb24gZmFjdG9yIChQTExQKQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9SQ0NfUExMUF9ESVZfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoUkNDX1BMTENGR1JfUExMUERJVl8xKSAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUCBvdXRwdXQgYnkgMiBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX1JDQ19QTExQX0RJVl8zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChSQ0NfUExMQ0ZHUl9QTExQRElWXzEgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBSQ0NfUExMQ0ZHUl9QTExQRElWXzApIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSAzIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfUkNDX1BMTFBfRElWXzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKFJDQ19QTExDRkdSX1BMTFBESVZfMikgLyohPCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFAgb3V0cHV0IGJ5IDQgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9SQ0NfUExMUF9ESVZfNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoUkNDX1BMTENGR1JfUExMUERJVl8yIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgUkNDX1BMTENGR1JfUExMUERJVl8wKSAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUCBvdXRwdXQgYnkgNSBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX1JDQ19QTExQX0RJVl82ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChSQ0NfUExMQ0ZHUl9QTExQRElWXzIgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBSQ0NfUExMQ0ZHUl9QTExQRElWXzEpIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSA2IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfUkNDX1BMTFBfRElWXzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKFJDQ19QTExDRkdSX1BMTFBESVZfMiB8IFJDQ19QTExDRkdSX1BMTFBESVZfMSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIFJDQ19QTExDRkdSX1BMTFBESVZfMCkgLyohPCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFAgb3V0cHV0IGJ5IDcgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9SQ0NfUExMUF9ESVZfOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoUkNDX1BMTENGR1JfUExMUERJVl8zKSAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUCBvdXRwdXQgYnkgOCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX1JDQ19QTExQX0RJVl85ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChSQ0NfUExMQ0ZHUl9QTExQRElWXzMgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBSQ0NfUExMQ0ZHUl9QTExQRElWXzApIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSA5IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfUkNDX1BMTFBfRElWXzEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChSQ0NfUExMQ0ZHUl9QTExQRElWXzMgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgUkNDX1BMTENGR1JfUExMUERJVl8xKSAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUCBvdXRwdXQgYnkgMTAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9SQ0NfUExMUF9ESVZfMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKFJDQ19QTExDRkdSX1BMTFBESVZfMyB8IFJDQ19QTExDRkdSX1BMTFBESVZfMSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBSQ0NfUExMQ0ZHUl9QTExQRElWXzApIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSAxMSBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX1JDQ19QTExQX0RJVl8xMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoUkNDX1BMTENGR1JfUExMUERJVl8zIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIFJDQ19QTExDRkdSX1BMTFBESVZfMikgLyohPCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFAgb3V0cHV0IGJ5IDEyIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfUkNDX1BMTFBfRElWXzEzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChSQ0NfUExMQ0ZHUl9QTExQRElWXzMgfCBSQ0NfUExMQ0ZHUl9QTExQRElWXzIgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgUkNDX1BMTENGR1JfUExMUERJVl8wKSAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUCBvdXRwdXQgYnkgMTMgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9SQ0NfUExMUF9ESVZfMTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKFJDQ19QTExDRkdSX1BMTFBESVZfMyB8IFJDQ19QTExDRkdSX1BMTFBESVZfMiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBSQ0NfUExMQ0ZHUl9QTExQRElWXzEpIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSAxNCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX1JDQ19QTExQX0RJVl8xNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoUkNDX1BMTENGR1JfUExMUERJVl8zIHwgUkNDX1BMTENGR1JfUExMUERJVl8yIHwgUkNDX1BMTENGR1JfUExMUERJVl8xIHwgICAgXA0KLSAgIFJDQ19QTExDRkdSX1BMTFBESVZfMCkgLyohPCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFAgb3V0cHV0IGJ5IDE1IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfUkNDX1BMTFBfRElWXzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChSQ0NfUExMQ0ZHUl9QTExQRElWXzQpIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSAxNiBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX1JDQ19QTExQX0RJVl8xNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoUkNDX1BMTENGR1JfUExMUERJVl80IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIFJDQ19QTExDRkdSX1BMTFBESVZfMCkgLyohPCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFAgb3V0cHV0IGJ5IDE3IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfUkNDX1BMTFBfRElWXzE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChSQ0NfUExMQ0ZHUl9QTExQRElWXzQgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgUkNDX1BMTENGR1JfUExMUERJVl8xKSAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUCBvdXRwdXQgYnkgMTggXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9SQ0NfUExMUF9ESVZfMTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKFJDQ19QTExDRkdSX1BMTFBESVZfNCB8IFJDQ19QTExDRkdSX1BMTFBESVZfMSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBSQ0NfUExMQ0ZHUl9QTExQRElWXzApIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSAxOSBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX1JDQ19QTExQX0RJVl8yMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoUkNDX1BMTENGR1JfUExMUERJVl80IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIFJDQ19QTExDRkdSX1BMTFBESVZfMikgLyohPCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFAgb3V0cHV0IGJ5IDIwIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfUkNDX1BMTFBfRElWXzIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChSQ0NfUExMQ0ZHUl9QTExQRElWXzQgfCBSQ0NfUExMQ0ZHUl9QTExQRElWXzIgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgUkNDX1BMTENGR1JfUExMUERJVl8wKSAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUCBvdXRwdXQgYnkgMjEgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9SQ0NfUExMUF9ESVZfMjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKFJDQ19QTExDRkdSX1BMTFBESVZfNCB8IFJDQ19QTExDRkdSX1BMTFBESVZfMiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBSQ0NfUExMQ0ZHUl9QTExQRElWXzEpIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSAyMiBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX1JDQ19QTExQX0RJVl8yMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoUkNDX1BMTENGR1JfUExMUERJVl80IHwgUkNDX1BMTENGR1JfUExMUERJVl8yIHwgUkNDX1BMTENGR1JfUExMUERJVl8xIHwgICAgXA0KLSAgIFJDQ19QTExDRkdSX1BMTFBESVZfMCkgLyohPCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFAgb3V0cHV0IGJ5IDIzIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfUkNDX1BMTFBfRElWXzI0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChSQ0NfUExMQ0ZHUl9QTExQRElWXzQgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgUkNDX1BMTENGR1JfUExMUERJVl8zKSAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUCBvdXRwdXQgYnkgMjQgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9SQ0NfUExMUF9ESVZfMjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKFJDQ19QTExDRkdSX1BMTFBESVZfNCB8IFJDQ19QTExDRkdSX1BMTFBESVZfMyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBSQ0NfUExMQ0ZHUl9QTExQRElWXzApIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSAyNSBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX1JDQ19QTExQX0RJVl8yNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoUkNDX1BMTENGR1JfUExMUERJVl80IHwgUkNDX1BMTENGR1JfUExMUERJVl8zIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIFJDQ19QTExDRkdSX1BMTFBESVZfMSkgLyohPCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFAgb3V0cHV0IGJ5IDI2IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfUkNDX1BMTFBfRElWXzI3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChSQ0NfUExMQ0ZHUl9QTExQRElWXzQgfCBSQ0NfUExMQ0ZHUl9QTExQRElWXzMgfCBSQ0NfUExMQ0ZHUl9QTExQRElWXzEgfCAgICBcDQotICAgUkNDX1BMTENGR1JfUExMUERJVl8wKSAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUCBvdXRwdXQgYnkgMjcgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9SQ0NfUExMUF9ESVZfMjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKFJDQ19QTExDRkdSX1BMTFBESVZfNCB8IFJDQ19QTExDRkdSX1BMTFBESVZfMyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBSQ0NfUExMQ0ZHUl9QTExQRElWXzIpIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSAyOCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX1JDQ19QTExQX0RJVl8yOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoUkNDX1BMTENGR1JfUExMUERJVl80IHwgUkNDX1BMTENGR1JfUExMUERJVl8zIHwgUkNDX1BMTENGR1JfUExMUERJVl8yIHwgICAgXA0KLSAgIFJDQ19QTExDRkdSX1BMTFBESVZfMCkgLyohPCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFAgb3V0cHV0IGJ5IDI5IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfUkNDX1BMTFBfRElWXzMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChSQ0NfUExMQ0ZHUl9QTExQRElWXzQgfCBSQ0NfUExMQ0ZHUl9QTExQRElWXzMgfCBSQ0NfUExMQ0ZHUl9QTExQRElWXzIgfCAgICBcDQotICAgUkNDX1BMTENGR1JfUExMUERJVl8xKSAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUCBvdXRwdXQgYnkgMzAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9SQ0NfUExMUF9ESVZfMzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKFJDQ19QTExDRkdSX1BMTFBESVZfNCB8IFJDQ19QTExDRkdSX1BMTFBESVZfMyB8IFJDQ19QTExDRkdSX1BMTFBESVZfMiB8ICAgIFwNCi0gICBSQ0NfUExMQ0ZHUl9QTExQRElWXzEgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgUkNDX1BMTENGR1JfUExMUERJVl8wKSAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUCBvdXRwdXQgYnkgMzEgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19QTExRX0RJViAgUExMIGRpdmlzaW9uIGZhY3RvciAoUExMUSkNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfUkNDX1BMTFFfRElWXzIgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFEgb3V0cHV0IGJ5IDIgKi8NCi0jZGVmaW5lIExMX1JDQ19QTExRX0RJVl80IFwNCi0gIChSQ0NfUExMQ0ZHUl9QTExRXzApIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExRIG91dHB1dCBieSA0ICovDQotI2RlZmluZSBMTF9SQ0NfUExMUV9ESVZfNiBcDQotICAoUkNDX1BMTENGR1JfUExMUV8xKSAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUSBvdXRwdXQgYnkgNiAqLw0KLSNkZWZpbmUgTExfUkNDX1BMTFFfRElWXzggXA0KLSAgKFJDQ19QTExDRkdSX1BMTFEpIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExRIG91dHB1dCBieSA4ICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBkZWZncm91cCBSQ0NfTExfRXhwb3J0ZWRfTWFjcm9zIFJDQyBFeHBvcnRlZCBNYWNyb3MNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VNX1dSSVRFX1JFQUQgQ29tbW9uIFdyaXRlIGFuZCByZWFkIHJlZ2lzdGVycyBNYWNyb3MNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgV3JpdGUgYSB2YWx1ZSBpbiBSQ0MgcmVnaXN0ZXINCi0gKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgd3JpdHRlbg0KLSAqIEBwYXJhbSAgX19WQUxVRV9fIFZhbHVlIHRvIGJlIHdyaXR0ZW4gaW4gdGhlIHJlZ2lzdGVyDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBMTF9SQ0NfV3JpdGVSZWcoX19SRUdfXywgX19WQUxVRV9fKSBXUklURV9SRUcoUkNDLT5fX1JFR19fLCBfX1ZBTFVFX18pDQotDQotLyoqDQotICogQGJyaWVmICBSZWFkIGEgdmFsdWUgaW4gUkNDIHJlZ2lzdGVyDQotICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHJlYWQNCi0gKiBAcmV0dmFsIFJlZ2lzdGVyIHZhbHVlDQotICovDQotI2RlZmluZSBMTF9SQ0NfUmVhZFJlZyhfX1JFR19fKSBSRUFEX1JFRyhSQ0MtPl9fUkVHX18pDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFJDQ19MTF9FTV9DQUxDX0ZSRVEgQ2FsY3VsYXRlIGZyZXF1ZW5jaWVzDQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBjYWxjdWxhdGUgdGhlIFBMTENMSyBmcmVxdWVuY3kgb24gc3lzdGVtIGRvbWFpbg0KLSAqIEBub3RlIGV4OiBAcmVmIF9fTExfUkNDX0NBTENfUExMQ0xLX0ZSRVEgKEhTRV9WQUxVRSxAcmVmDQotICogTExfUkNDX1BMTF9HZXREaXZpZGVyICgpLA0KLSAqICAgICAgICAgICAgIEByZWYgTExfUkNDX1BMTF9HZXROICgpLCBAcmVmIExMX1JDQ19QTExfR2V0UiAoKSk7DQotICogQHBhcmFtICBfX0lOUFVURlJFUV9fIFBMTCBJbnB1dCBmcmVxdWVuY3kgKGJhc2VkIG9uIEhTRS9IU0kpDQotICogQHBhcmFtICBfX1BMTE1fXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8xDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl80DQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl83DQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8xMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8xMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8xMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8xMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8xNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8xNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8xNg0KLSAqIEBwYXJhbSAgX19QTExOX18gQmV0d2VlbiBNaW5fRGF0YSA9IDggYW5kIE1heF9EYXRhID0gMTI3DQotICogQHBhcmFtICBfX1BMTFJfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExSX0RJVl8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFJfRElWXzQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUl9ESVZfNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExSX0RJVl84DQotICogQHJldHZhbCBQTEwgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikNCi0gKi8NCi0jZGVmaW5lIF9fTExfUkNDX0NBTENfUExMQ0xLX0ZSRVEoX19JTlBVVEZSRVFfXywgX19QTExNX18sIF9fUExMTl9fLCBfX1BMTFJfXykgXA0KLSAgKChfX0lOUFVURlJFUV9fKSAqIChfX1BMTE5fXykgLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKCgoKF9fUExMTV9fKSA+PiBSQ0NfUExMQ0ZHUl9QTExNX1BvcykgKyAxVSkpIC8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAoKCgoX19QTExSX18pID4+IFJDQ19QTExDRkdSX1BMTFJfUG9zKSArIDFVKSAqIDJVKSkNCi0NCi0vKioNCi0gICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gY2FsY3VsYXRlIHRoZSBQTExDTEsgZnJlcXVlbmN5IHVzZWQgb24gQURDIGRvbWFpbg0KLSAgKiBAbm90ZSBleDogQHJlZiBfX0xMX1JDQ19DQUxDX1BMTENMS19BRENfRlJFUSAoSFNFX1ZBTFVFLEByZWYNCi0gIExMX1JDQ19QTExfR2V0RGl2aWRlciAoKSwNCi0gICogICAgICAgICAgICAgQHJlZiBMTF9SQ0NfUExMX0dldE4gKCksIEByZWYgTExfUkNDX1BMTF9HZXRQICgpKTsNCi0gICogQHBhcmFtICBfX0lOUFVURlJFUV9fIFBMTCBJbnB1dCBmcmVxdWVuY3kgKGJhc2VkIG9uIEhTRS9IU0kpDQotICAqIEBwYXJhbSAgX19QTExNX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzENCi0gICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzINCi0gICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzMNCi0gICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzQNCi0gICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzUNCi0gICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzYNCi0gICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzcNCi0gICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzgNCi0gICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzkNCi0gICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzEwDQotICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8xMQ0KLSAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMTINCi0gICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzEzDQotICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8xNA0KLSAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMTUNCi0gICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzE2DQotDQotICAqIEBwYXJhbSAgX19QTExOX18gQmV0d2VlbiBNaW5fRGF0YSA9IDggYW5kIE1heF9EYXRhID0gMTI3DQotICAqIEBwYXJhbSAgX19QTExQX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzINCi0gICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzMNCi0gICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzQNCi0gICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzUNCi0gICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzYNCi0gICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzcNCi0gICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzgNCi0gICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzkNCi0gICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzEwDQotICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8xMQ0KLSAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTINCi0gICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzEzDQotICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8xNA0KLSAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTUNCi0gICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzE2DQotICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8xNw0KLSAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTgNCi0gICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzE5DQotICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8yMA0KLSAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjENCi0gICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzIyDQotICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8yMw0KLSAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjQNCi0gICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzI1DQotICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8yNg0KLSAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjcNCi0gICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzI4DQotICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8yOQ0KLSAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMzANCi0gICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzMxDQotICAqIEByZXR2YWwgUExMIGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopDQotICAqLw0KLSNkZWZpbmUgX19MTF9SQ0NfQ0FMQ19QTExDTEtfQURDX0ZSRVEoX19JTlBVVEZSRVFfXywgX19QTExNX18sIF9fUExMTl9fLCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX1BMTFBfXykgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoX19JTlBVVEZSRVFfXykgKiAoX19QTExOX18pIC8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoKChfX1BMTE1fXykgPj4gUkNDX1BMTENGR1JfUExMTV9Qb3MpICsgMVUpKSAvICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKChfX1BMTFBfXykgPj4gUkNDX1BMTENGR1JfUExMUERJVl9Qb3MpKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGNhbGN1bGF0ZSB0aGUgUExMQ0xLIGZyZXF1ZW5jeSB1c2VkIG9uIDQ4TSBkb21haW4NCi0gKiBAbm90ZSBleDogQHJlZiBfX0xMX1JDQ19DQUxDX1BMTENMS180OE1fRlJFUSAoSFNFX1ZBTFVFLEByZWYNCi0gKiBMTF9SQ0NfUExMX0dldERpdmlkZXIgKCksDQotICogICAgICAgICAgICAgQHJlZiBMTF9SQ0NfUExMX0dldE4gKCksIEByZWYgTExfUkNDX1BMTF9HZXRRICgpKTsNCi0gKiBAcGFyYW0gIF9fSU5QVVRGUkVRX18gUExMIElucHV0IGZyZXF1ZW5jeSAoYmFzZWQgb24gSFNFL0hTSSkNCi0gKiBAcGFyYW0gIF9fUExMTV9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8zDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl82DQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl85DQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzEwDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzExDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzEyDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzEzDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzE0DQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzE1DQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzE2DQotICogQHBhcmFtICBfX1BMTE5fXyBCZXR3ZWVuIE1pbl9EYXRhID0gOCBhbmQgTWF4X0RhdGEgPSAxMjcNCi0gKiBAcGFyYW0gIF9fUExMUV9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFFfRElWXzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUV9ESVZfNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExRX0RJVl82DQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFFfRElWXzgNCi0gKiBAcmV0dmFsIFBMTCBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQ0KLSAqLw0KLSNkZWZpbmUgX19MTF9SQ0NfQ0FMQ19QTExDTEtfNDhNX0ZSRVEoX19JTlBVVEZSRVFfXywgX19QTExNX18sIF9fUExMTl9fLCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX1BMTFFfXykgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoX19JTlBVVEZSRVFfXykgKiAoX19QTExOX18pIC8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICgoKChfX1BMTE1fXykgPj4gUkNDX1BMTENGR1JfUExMTV9Qb3MpICsgMVUpKSAvICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKCgoKF9fUExMUV9fKSA+PiBSQ0NfUExMQ0ZHUl9QTExRX1BvcykgKyAxVSkgPDwgMVUpKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGNhbGN1bGF0ZSB0aGUgSENMSyBmcmVxdWVuY3kNCi0gKiBAcGFyYW0gIF9fU1lTQ0xLRlJFUV9fIFNZU0NMSyBmcmVxdWVuY3kgKGJhc2VkIG9uIEhTRS9IU0kvUExMQ0xLKQ0KLSAqIEBwYXJhbSAgX19BSEJQUkVTQ0FMRVJfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl8xNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzY0DQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfMTI4DQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfMjU2DQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfNTEyDQotICogQHJldHZhbCBIQ0xLIGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopDQotICovDQotI2RlZmluZSBfX0xMX1JDQ19DQUxDX0hDTEtfRlJFUShfX1NZU0NMS0ZSRVFfXywgX19BSEJQUkVTQ0FMRVJfXykgICAgICAgICAgICAgIFwNCi0gICgoX19TWVNDTEtGUkVRX18pID4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIChBSEJQcmVzY1RhYmxlWygoX19BSEJQUkVTQ0FMRVJfXykgJiBSQ0NfQ0ZHUl9IUFJFKSA+PiBSQ0NfQ0ZHUl9IUFJFX1Bvc10gJiBcDQotICAgIDB4MUZVKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBjYWxjdWxhdGUgdGhlIFBDTEsxIGZyZXF1ZW5jeSAoQUJQMSkNCi0gKiBAcGFyYW0gIF9fSENMS0ZSRVFfXyBIQ0xLIGZyZXF1ZW5jeQ0KLSAqIEBwYXJhbSAgX19BUEIxUFJFU0NBTEVSX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQVBCMV9ESVZfMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BUEIxX0RJVl8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjFfRElWXzQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQVBCMV9ESVZfOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BUEIxX0RJVl8xNg0KLSAqIEByZXR2YWwgUENMSzEgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikNCi0gKi8NCi0jZGVmaW5lIF9fTExfUkNDX0NBTENfUENMSzFfRlJFUShfX0hDTEtGUkVRX18sIF9fQVBCMVBSRVNDQUxFUl9fKSBcDQotICAoKF9fSENMS0ZSRVFfXykgPj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIChBUEJQcmVzY1RhYmxlWyhfX0FQQjFQUkVTQ0FMRVJfXykgPj4gUkNDX0NGR1JfUFBSRTFfUG9zXSAmIDB4MUZVKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBjYWxjdWxhdGUgdGhlIFBDTEsyIGZyZXF1ZW5jeSAoQUJQMikNCi0gKiBAcGFyYW0gIF9fSENMS0ZSRVFfXyBIQ0xLIGZyZXF1ZW5jeQ0KLSAqIEBwYXJhbSAgX19BUEIyUFJFU0NBTEVSX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQVBCMl9ESVZfMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BUEIyX0RJVl8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjJfRElWXzQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQVBCMl9ESVZfOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BUEIyX0RJVl8xNg0KLSAqIEByZXR2YWwgUENMSzIgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikNCi0gKi8NCi0jZGVmaW5lIF9fTExfUkNDX0NBTENfUENMSzJfRlJFUShfX0hDTEtGUkVRX18sIF9fQVBCMlBSRVNDQUxFUl9fKSBcDQotICAoKF9fSENMS0ZSRVFfXykgPj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIChBUEJQcmVzY1RhYmxlWyhfX0FQQjJQUkVTQ0FMRVJfXykgPj4gUkNDX0NGR1JfUFBSRTJfUG9zXSAmIDB4MUZVKSkNCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGRlZmdyb3VwIFJDQ19MTF9FeHBvcnRlZF9GdW5jdGlvbnMgUkNDIEV4cG9ydGVkIEZ1bmN0aW9ucw0KLSAqIEB7DQotICovDQotDQotLyoqIEBkZWZncm91cCBSQ0NfTExfRUZfSFNFIEhTRQ0KLSAqIEB7DQotICovDQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgdGhlIENsb2NrIFNlY3VyaXR5IFN5c3RlbS4NCi0gKiBAcm10b2xsIENSICAgICAgICAgICBDU1NPTiAgICAgICAgIExMX1JDQ19IU0VfRW5hYmxlQ1NTDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0hTRV9FbmFibGVDU1Modm9pZCkgew0KLSAgU0VUX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfQ1NTT04pOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSBIU0UgZXh0ZXJuYWwgb3NjaWxsYXRvciAoSFNFIEJ5cGFzcykNCi0gKiBAcm10b2xsIENSICAgICAgICAgICBIU0VCWVAgICAgICAgIExMX1JDQ19IU0VfRW5hYmxlQnlwYXNzDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0hTRV9FbmFibGVCeXBhc3Modm9pZCkgew0KLSAgU0VUX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNFQllQKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIEhTRSBleHRlcm5hbCBvc2NpbGxhdG9yIChIU0UgQnlwYXNzKQ0KLSAqIEBybXRvbGwgQ1IgICAgICAgICAgIEhTRUJZUCAgICAgICAgTExfUkNDX0hTRV9EaXNhYmxlQnlwYXNzDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0hTRV9EaXNhYmxlQnlwYXNzKHZvaWQpIHsNCi0gIENMRUFSX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNFQllQKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgSFNFIGNyeXN0YWwgb3NjaWxsYXRvciAoSFNFIE9OKQ0KLSAqIEBybXRvbGwgQ1IgICAgICAgICAgIEhTRU9OICAgICAgICAgTExfUkNDX0hTRV9FbmFibGUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfSFNFX0VuYWJsZSh2b2lkKSB7IFNFVF9CSVQoUkNDLT5DUiwgUkNDX0NSX0hTRU9OKTsgfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBIU0UgY3J5c3RhbCBvc2NpbGxhdG9yIChIU0UgT04pDQotICogQHJtdG9sbCBDUiAgICAgICAgICAgSFNFT04gICAgICAgICBMTF9SQ0NfSFNFX0Rpc2FibGUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfSFNFX0Rpc2FibGUodm9pZCkgew0KLSAgQ0xFQVJfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0VPTik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgSFNFIG9zY2lsbGF0b3IgUmVhZHkNCi0gKiBAcm10b2xsIENSICAgICAgICAgICBIU0VSRFkgICAgICAgIExMX1JDQ19IU0VfSXNSZWFkeQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSFNFX0lzUmVhZHkodm9pZCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5DUiwgUkNDX0NSX0hTRVJEWSkgPT0gKFJDQ19DUl9IU0VSRFkpKSA/IDFVTCA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBSQ0NfTExfRUZfSFNJIEhTSQ0KLSAqIEB7DQotICovDQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgSFNJIGV2ZW4gaW4gc3RvcCBtb2RlDQotICogQG5vdGUgSFNJIG9zY2lsbGF0b3IgaXMgZm9yY2VkIE9OIGV2ZW4gaW4gU3RvcCBtb2RlDQotICogQHJtdG9sbCBDUiAgICAgICAgICAgSFNJS0VST04gICAgICBMTF9SQ0NfSFNJX0VuYWJsZUluU3RvcE1vZGUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfSFNJX0VuYWJsZUluU3RvcE1vZGUodm9pZCkgew0KLSAgU0VUX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJS0VST04pOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgSFNJIGluIHN0b3AgbW9kZQ0KLSAqIEBybXRvbGwgQ1IgICAgICAgICAgIEhTSUtFUk9OICAgICAgTExfUkNDX0hTSV9EaXNhYmxlSW5TdG9wTW9kZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19IU0lfRGlzYWJsZUluU3RvcE1vZGUodm9pZCkgew0KLSAgQ0xFQVJfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0lLRVJPTik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIEhTSSBvc2NpbGxhdG9yDQotICogQHJtdG9sbCBDUiAgICAgICAgICAgSFNJT04gICAgICAgICBMTF9SQ0NfSFNJX0VuYWJsZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19IU0lfRW5hYmxlKHZvaWQpIHsgU0VUX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJT04pOyB9DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIEhTSSBvc2NpbGxhdG9yDQotICogQHJtdG9sbCBDUiAgICAgICAgICAgSFNJT04gICAgICAgICBMTF9SQ0NfSFNJX0Rpc2FibGUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfSFNJX0Rpc2FibGUodm9pZCkgew0KLSAgQ0xFQVJfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0lPTik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgSFNJIGNsb2NrIGlzIHJlYWR5DQotICogQHJtdG9sbCBDUiAgICAgICAgICAgSFNJUkRZICAgICAgICBMTF9SQ0NfSFNJX0lzUmVhZHkNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0hTSV9Jc1JlYWR5KHZvaWQpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0lSRFkpID09IChSQ0NfQ1JfSFNJUkRZKSkgPyAxVUwgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBIU0kgQ2FsaWJyYXRpb24gdmFsdWUNCi0gKiBAbm90ZSBXaGVuIEhTSVRSSU0gaXMgd3JpdHRlbiwgSFNJQ0FMIGlzIHVwZGF0ZWQgd2l0aCB0aGUgc3VtIG9mDQotICogICAgICAgSFNJVFJJTSBhbmQgdGhlIGZhY3RvcnkgdHJpbSB2YWx1ZQ0KLSAqIEBybXRvbGwgSUNTQ1IgICAgICAgIEhTSUNBTCAgICAgICAgTExfUkNDX0hTSV9HZXRDYWxpYnJhdGlvbg0KLSAqIEByZXR2YWwgQmV0d2VlbiBNaW5fRGF0YSA9IDB4MDAgYW5kIE1heF9EYXRhID0gMHhGRg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSFNJX0dldENhbGlicmF0aW9uKHZvaWQpIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJDQy0+SUNTQ1IsIFJDQ19JQ1NDUl9IU0lDQUwpID4+DQotICAgICAgICAgICAgICAgICAgICBSQ0NfSUNTQ1JfSFNJQ0FMX1Bvcyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IEhTSSBDYWxpYnJhdGlvbiB0cmltbWluZw0KLSAqIEBub3RlIHVzZXItcHJvZ3JhbW1hYmxlIHRyaW1taW5nIHZhbHVlIHRoYXQgaXMgYWRkZWQgdG8gdGhlIEhTSUNBTA0KLSAqIEBub3RlIERlZmF1bHQgdmFsdWUgaXMgMTYsIHdoaWNoLCB3aGVuIGFkZGVkIHRvIHRoZSBIU0lDQUwgdmFsdWUsDQotICogICAgICAgc2hvdWxkIHRyaW0gdGhlIEhTSSB0byAxNiBNSHogKy8tIDEgJQ0KLSAqIEBybXRvbGwgSUNTQ1IgICAgICAgIEhTSVRSSU0gICAgICAgTExfUkNDX0hTSV9TZXRDYWxpYlRyaW1taW5nDQotICogQHBhcmFtICBWYWx1ZSBCZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAxMjcNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfSFNJX1NldENhbGliVHJpbW1pbmcodWludDMyX3QgVmFsdWUpIHsNCi0gIE1PRElGWV9SRUcoUkNDLT5JQ1NDUiwgUkNDX0lDU0NSX0hTSVRSSU0sIFZhbHVlIDw8IFJDQ19JQ1NDUl9IU0lUUklNX1Bvcyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IEhTSSBDYWxpYnJhdGlvbiB0cmltbWluZw0KLSAqIEBybXRvbGwgSUNTQ1IgICAgICAgIEhTSVRSSU0gICAgICAgTExfUkNDX0hTSV9HZXRDYWxpYlRyaW1taW5nDQotICogQHJldHZhbCBCZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAxMjcNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0hTSV9HZXRDYWxpYlRyaW1taW5nKHZvaWQpIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJDQy0+SUNTQ1IsIFJDQ19JQ1NDUl9IU0lUUklNKSA+Pg0KLSAgICAgICAgICAgICAgICAgICAgUkNDX0lDU0NSX0hTSVRSSU1fUG9zKTsNCi19DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFJDQ19MTF9FRl9IU0k0OCBIU0k0OA0KLSAqIEB7DQotICovDQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgSFNJNDgNCi0gKiBAcm10b2xsIENSUkNSICAgICAgICAgIEhTSTQ4T04gICAgICAgTExfUkNDX0hTSTQ4X0VuYWJsZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19IU0k0OF9FbmFibGUodm9pZCkgew0KLSAgU0VUX0JJVChSQ0MtPkNSUkNSLCBSQ0NfQ1JSQ1JfSFNJNDhPTik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBIU0k0OA0KLSAqIEBybXRvbGwgQ1JSQ1IgICAgICAgICAgSFNJNDhPTiAgICAgICBMTF9SQ0NfSFNJNDhfRGlzYWJsZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19IU0k0OF9EaXNhYmxlKHZvaWQpIHsNCi0gIENMRUFSX0JJVChSQ0MtPkNSUkNSLCBSQ0NfQ1JSQ1JfSFNJNDhPTik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgSFNJNDggb3NjaWxsYXRvciBSZWFkeQ0KLSAqIEBybXRvbGwgQ1JSQ1IgICAgICAgICAgSFNJNDhSRFkgICAgICBMTF9SQ0NfSFNJNDhfSXNSZWFkeQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSFNJNDhfSXNSZWFkeSh2b2lkKSB7DQotICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkNSUkNSLCBSQ0NfQ1JSQ1JfSFNJNDhSRFkpID09IChSQ0NfQ1JSQ1JfSFNJNDhSRFkpKQ0KLSAgICAgICAgICAgICAgPyAxVUwNCi0gICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgSFNJNDggQ2FsaWJyYXRpb24gdmFsdWUNCi0gKiBAcm10b2xsIENSUkNSICAgICAgICAgIEhTSTQ4Q0FMICAgICAgTExfUkNDX0hTSTQ4X0dldENhbGlicmF0aW9uDQotICogQHJldHZhbCBCZXR3ZWVuIE1pbl9EYXRhID0gMHgwMCBhbmQgTWF4X0RhdGEgPSAweDFGRg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSFNJNDhfR2V0Q2FsaWJyYXRpb24odm9pZCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DUlJDUiwgUkNDX0NSUkNSX0hTSTQ4Q0FMKSA+Pg0KLSAgICAgICAgICAgICAgICAgICAgUkNDX0NSUkNSX0hTSTQ4Q0FMX1Bvcyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBSQ0NfTExfRUZfTFNFIExTRQ0KLSAqIEB7DQotICovDQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgIExvdyBTcGVlZCBFeHRlcm5hbCAoTFNFKSBjcnlzdGFsLg0KLSAqIEBybXRvbGwgQkRDUiAgICAgICAgIExTRU9OICAgICAgICAgTExfUkNDX0xTRV9FbmFibGUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfTFNFX0VuYWJsZSh2b2lkKSB7DQotICBTRVRfQklUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfTFNFT04pOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgIExvdyBTcGVlZCBFeHRlcm5hbCAoTFNFKSBjcnlzdGFsLg0KLSAqIEBybXRvbGwgQkRDUiAgICAgICAgIExTRU9OICAgICAgICAgTExfUkNDX0xTRV9EaXNhYmxlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0xTRV9EaXNhYmxlKHZvaWQpIHsNCi0gIENMRUFSX0JJVChSQ0MtPkJEQ1IsIFJDQ19CRENSX0xTRU9OKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgZXh0ZXJuYWwgY2xvY2sgc291cmNlIChMU0UgYnlwYXNzKS4NCi0gKiBAcm10b2xsIEJEQ1IgICAgICAgICBMU0VCWVAgICAgICAgIExMX1JDQ19MU0VfRW5hYmxlQnlwYXNzDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0xTRV9FbmFibGVCeXBhc3Modm9pZCkgew0KLSAgU0VUX0JJVChSQ0MtPkJEQ1IsIFJDQ19CRENSX0xTRUJZUCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBleHRlcm5hbCBjbG9jayBzb3VyY2UgKExTRSBieXBhc3MpLg0KLSAqIEBybXRvbGwgQkRDUiAgICAgICAgIExTRUJZUCAgICAgICAgTExfUkNDX0xTRV9EaXNhYmxlQnlwYXNzDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0xTRV9EaXNhYmxlQnlwYXNzKHZvaWQpIHsNCi0gIENMRUFSX0JJVChSQ0MtPkJEQ1IsIFJDQ19CRENSX0xTRUJZUCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IExTRSBvc2NpbGxhdG9yIGRyaXZlIGNhcGFiaWxpdHkNCi0gKiBAbm90ZSBUaGUgb3NjaWxsYXRvciBpcyBpbiBYdGFsIG1vZGUgd2hlbiBpdCBpcyBub3QgaW4gYnlwYXNzIG1vZGUuDQotICogQHJtdG9sbCBCRENSICAgICAgICAgTFNFRFJWICAgICAgICBMTF9SQ0NfTFNFX1NldERyaXZlQ2FwYWJpbGl0eQ0KLSAqIEBwYXJhbSAgTFNFRHJpdmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTFNFRFJJVkVfTE9XDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xTRURSSVZFX01FRElVTUxPVw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MU0VEUklWRV9NRURJVU1ISUdIDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xTRURSSVZFX0hJR0gNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfTFNFX1NldERyaXZlQ2FwYWJpbGl0eSh1aW50MzJfdCBMU0VEcml2ZSkgew0KLSAgTU9ESUZZX1JFRyhSQ0MtPkJEQ1IsIFJDQ19CRENSX0xTRURSViwgTFNFRHJpdmUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBMU0Ugb3NjaWxsYXRvciBkcml2ZSBjYXBhYmlsaXR5DQotICogQHJtdG9sbCBCRENSICAgICAgICAgTFNFRFJWICAgICAgICBMTF9SQ0NfTFNFX0dldERyaXZlQ2FwYWJpbGl0eQ0KLSAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTFNFRFJJVkVfTE9XDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xTRURSSVZFX01FRElVTUxPVw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MU0VEUklWRV9NRURJVU1ISUdIDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xTRURSSVZFX0hJR0gNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0xTRV9HZXREcml2ZUNhcGFiaWxpdHkodm9pZCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9MU0VEUlYpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgQ2xvY2sgc2VjdXJpdHkgc3lzdGVtIG9uIExTRS4NCi0gKiBAcm10b2xsIEJEQ1IgICAgICAgICBMU0VDU1NPTiAgICAgIExMX1JDQ19MU0VfRW5hYmxlQ1NTDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0xTRV9FbmFibGVDU1Modm9pZCkgew0KLSAgU0VUX0JJVChSQ0MtPkJEQ1IsIFJDQ19CRENSX0xTRUNTU09OKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIENsb2NrIHNlY3VyaXR5IHN5c3RlbSBvbiBMU0UuDQotICogQG5vdGUgQ2xvY2sgc2VjdXJpdHkgc3lzdGVtIGNhbiBiZSBkaXNhYmxlZCBvbmx5IGFmdGVyIGEgTFNFDQotICogICAgICAgZmFpbHVyZSBkZXRlY3Rpb24uIEluIHRoYXQgY2FzZSBpdCBNVVNUIGJlIGRpc2FibGVkIGJ5IHNvZnR3YXJlLg0KLSAqIEBybXRvbGwgQkRDUiAgICAgICAgIExTRUNTU09OICAgICAgTExfUkNDX0xTRV9EaXNhYmxlQ1NTDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0xTRV9EaXNhYmxlQ1NTKHZvaWQpIHsNCi0gIENMRUFSX0JJVChSQ0MtPkJEQ1IsIFJDQ19CRENSX0xTRUNTU09OKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiBMU0Ugb3NjaWxsYXRvciBSZWFkeQ0KLSAqIEBybXRvbGwgQkRDUiAgICAgICAgIExTRVJEWSAgICAgICAgTExfUkNDX0xTRV9Jc1JlYWR5DQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19MU0VfSXNSZWFkeSh2b2lkKSB7DQotICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkJEQ1IsIFJDQ19CRENSX0xTRVJEWSkgPT0gKFJDQ19CRENSX0xTRVJEWSkpID8gMVVMDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiBDU1Mgb24gTFNFIGZhaWx1cmUgRGV0ZWN0aW9uDQotICogQHJtdG9sbCBCRENSICAgICAgICAgTFNFQ1NTRCAgICAgICBMTF9SQ0NfTFNFX0lzQ1NTRGV0ZWN0ZWQNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0xTRV9Jc0NTU0RldGVjdGVkKHZvaWQpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfTFNFQ1NTRCkgPT0gKFJDQ19CRENSX0xTRUNTU0QpKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFJDQ19MTF9FRl9MU0kgTFNJDQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSBMU0kgT3NjaWxsYXRvcg0KLSAqIEBybXRvbGwgQ1NSICAgICAgICAgIExTSU9OICAgICAgICAgTExfUkNDX0xTSV9FbmFibGUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfTFNJX0VuYWJsZSh2b2lkKSB7DQotICBTRVRfQklUKFJDQy0+Q1NSLCBSQ0NfQ1NSX0xTSU9OKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIExTSSBPc2NpbGxhdG9yDQotICogQHJtdG9sbCBDU1IgICAgICAgICAgTFNJT04gICAgICAgICBMTF9SQ0NfTFNJX0Rpc2FibGUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfTFNJX0Rpc2FibGUodm9pZCkgew0KLSAgQ0xFQVJfQklUKFJDQy0+Q1NSLCBSQ0NfQ1NSX0xTSU9OKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiBMU0kgaXMgUmVhZHkNCi0gKiBAcm10b2xsIENTUiAgICAgICAgICBMU0lSRFkgICAgICAgIExMX1JDQ19MU0lfSXNSZWFkeQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfTFNJX0lzUmVhZHkodm9pZCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5DU1IsIFJDQ19DU1JfTFNJUkRZKSA9PSAoUkNDX0NTUl9MU0lSRFkpKSA/IDFVTCA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBSQ0NfTExfRUZfTFNDTyBMU0NPDQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSBMb3cgc3BlZWQgY2xvY2sNCi0gKiBAcm10b2xsIEJEQ1IgICAgICAgICBMU0NPRU4gICAgICAgIExMX1JDQ19MU0NPX0VuYWJsZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19MU0NPX0VuYWJsZSh2b2lkKSB7DQotICBTRVRfQklUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfTFNDT0VOKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIExvdyBzcGVlZCBjbG9jaw0KLSAqIEBybXRvbGwgQkRDUiAgICAgICAgIExTQ09FTiAgICAgICAgTExfUkNDX0xTQ09fRGlzYWJsZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19MU0NPX0Rpc2FibGUodm9pZCkgew0KLSAgQ0xFQVJfQklUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfTFNDT0VOKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDb25maWd1cmUgTG93IHNwZWVkIGNsb2NrIHNlbGVjdGlvbg0KLSAqIEBybXRvbGwgQkRDUiAgICAgICAgIExTQ09TRUwgICAgICAgTExfUkNDX0xTQ09fU2V0U291cmNlDQotICogQHBhcmFtICBTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTFNDT19DTEtTT1VSQ0VfTFNJDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xTQ09fQ0xLU09VUkNFX0xTRQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19MU0NPX1NldFNvdXJjZSh1aW50MzJfdCBTb3VyY2UpIHsNCi0gIE1PRElGWV9SRUcoUkNDLT5CRENSLCBSQ0NfQkRDUl9MU0NPU0VMLCBTb3VyY2UpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBMb3cgc3BlZWQgY2xvY2sgc2VsZWN0aW9uDQotICogQHJtdG9sbCBCRENSICAgICAgICAgTFNDT1NFTCAgICAgICBMTF9SQ0NfTFNDT19HZXRTb3VyY2UNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xTQ09fQ0xLU09VUkNFX0xTSQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MU0NPX0NMS1NPVVJDRV9MU0UNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0xTQ09fR2V0U291cmNlKHZvaWQpIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfTFNDT1NFTCkpOw0KLX0NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VGX1N5c3RlbSBTeXN0ZW0NCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBzeXN0ZW0gY2xvY2sgc291cmNlDQotICogQHJtdG9sbCBDRkdSICAgICAgICAgU1cgICAgICAgICAgICBMTF9SQ0NfU2V0U3lzQ2xrU291cmNlDQotICogQHBhcmFtICBTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTX0NMS1NPVVJDRV9IU0kNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTX0NMS1NPVVJDRV9IU0UNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTX0NMS1NPVVJDRV9QTEwNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfU2V0U3lzQ2xrU291cmNlKHVpbnQzMl90IFNvdXJjZSkgew0KLSAgTU9ESUZZX1JFRyhSQ0MtPkNGR1IsIFJDQ19DRkdSX1NXLCBTb3VyY2UpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCB0aGUgc3lzdGVtIGNsb2NrIHNvdXJjZQ0KLSAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIFNXUyAgICAgICAgICAgTExfUkNDX0dldFN5c0Nsa1NvdXJjZQ0KLSAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTX0NMS1NPVVJDRV9TVEFUVVNfSFNJDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU19DTEtTT1VSQ0VfU1RBVFVTX0hTRQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNfQ0xLU09VUkNFX1NUQVRVU19QTEwNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0dldFN5c0Nsa1NvdXJjZSh2b2lkKSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPkNGR1IsIFJDQ19DRkdSX1NXUykpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCBBSEIgcHJlc2NhbGVyDQotICogQHJtdG9sbCBDRkdSICAgICAgICAgSFBSRSAgICAgICAgICBMTF9SQ0NfU2V0QUhCUHJlc2NhbGVyDQotICogQHBhcmFtICBQcmVzY2FsZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl8xDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl84DQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfMTYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl82NA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzEyOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzI1Ng0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzUxMg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19TZXRBSEJQcmVzY2FsZXIodWludDMyX3QgUHJlc2NhbGVyKSB7DQotICBNT0RJRllfUkVHKFJDQy0+Q0ZHUiwgUkNDX0NGR1JfSFBSRSwgUHJlc2NhbGVyKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZXQgQVBCMSBwcmVzY2FsZXINCi0gKiBAcm10b2xsIENGR1IgICAgICAgICBQUFJFMSAgICAgICAgIExMX1JDQ19TZXRBUEIxUHJlc2NhbGVyDQotICogQHBhcmFtICBQcmVzY2FsZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQVBCMV9ESVZfMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BUEIxX0RJVl8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjFfRElWXzQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQVBCMV9ESVZfOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BUEIxX0RJVl8xNg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19TZXRBUEIxUHJlc2NhbGVyKHVpbnQzMl90IFByZXNjYWxlcikgew0KLSAgTU9ESUZZX1JFRyhSQ0MtPkNGR1IsIFJDQ19DRkdSX1BQUkUxLCBQcmVzY2FsZXIpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCBBUEIyIHByZXNjYWxlcg0KLSAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIFBQUkUyICAgICAgICAgTExfUkNDX1NldEFQQjJQcmVzY2FsZXINCi0gKiBAcGFyYW0gIFByZXNjYWxlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BUEIyX0RJVl8xDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjJfRElWXzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQVBCMl9ESVZfNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BUEIyX0RJVl84DQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjJfRElWXzE2DQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX1NldEFQQjJQcmVzY2FsZXIodWludDMyX3QgUHJlc2NhbGVyKSB7DQotICBNT0RJRllfUkVHKFJDQy0+Q0ZHUiwgUkNDX0NGR1JfUFBSRTIsIFByZXNjYWxlcik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IEFIQiBwcmVzY2FsZXINCi0gKiBAcm10b2xsIENGR1IgICAgICAgICBIUFJFICAgICAgICAgIExMX1JDQ19HZXRBSEJQcmVzY2FsZXINCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl80DQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzE2DQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfNjQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl8xMjgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl8yNTYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl81MTINCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0dldEFIQlByZXNjYWxlcih2b2lkKSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPkNGR1IsIFJDQ19DRkdSX0hQUkUpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgQVBCMSBwcmVzY2FsZXINCi0gKiBAcm10b2xsIENGR1IgICAgICAgICBQUFJFMSAgICAgICAgIExMX1JDQ19HZXRBUEIxUHJlc2NhbGVyDQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BUEIxX0RJVl8xDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjFfRElWXzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQVBCMV9ESVZfNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BUEIxX0RJVl84DQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjFfRElWXzE2DQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19HZXRBUEIxUHJlc2NhbGVyKHZvaWQpIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJDQy0+Q0ZHUiwgUkNDX0NGR1JfUFBSRTEpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgQVBCMiBwcmVzY2FsZXINCi0gKiBAcm10b2xsIENGR1IgICAgICAgICBQUFJFMiAgICAgICAgIExMX1JDQ19HZXRBUEIyUHJlc2NhbGVyDQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BUEIyX0RJVl8xDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjJfRElWXzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQVBCMl9ESVZfNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BUEIyX0RJVl84DQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjJfRElWXzE2DQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19HZXRBUEIyUHJlc2NhbGVyKHZvaWQpIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJDQy0+Q0ZHUiwgUkNDX0NGR1JfUFBSRTIpKTsNCi19DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFJDQ19MTF9FRl9NQ08gTUNPDQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENvbmZpZ3VyZSBNQ094DQotICogQHJtdG9sbCBDRkdSICAgICAgICAgTUNPU0VMICAgICAgICBMTF9SQ0NfQ29uZmlnTUNPXG4NCi0gKiAgICAgICAgIENGR1IgICAgICAgICBNQ09QUkUgICAgICAgIExMX1JDQ19Db25maWdNQ08NCi0gKiBAcGFyYW0gIE1DT3hTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTUNPMVNPVVJDRV9OT0NMT0NLDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX01DTzFTT1VSQ0VfU1lTQ0xLDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX01DTzFTT1VSQ0VfSFNJDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX01DTzFTT1VSQ0VfSFNFDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX01DTzFTT1VSQ0VfSFNJNDgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTUNPMVNPVVJDRV9QTExDTEsNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTUNPMVNPVVJDRV9MU0kNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTUNPMVNPVVJDRV9MU0UNCi0gKg0KLSAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLg0KLSAqIEBwYXJhbSAgTUNPeFByZXNjYWxlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19NQ08xX0RJVl8xDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX01DTzFfRElWXzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTUNPMV9ESVZfNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19NQ08xX0RJVl84DQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX01DTzFfRElWXzE2DQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0NvbmZpZ01DTyh1aW50MzJfdCBNQ094U291cmNlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgTUNPeFByZXNjYWxlcikgew0KLSAgTU9ESUZZX1JFRyhSQ0MtPkNGR1IsIFJDQ19DRkdSX01DT1NFTCB8IFJDQ19DRkdSX01DT1BSRSwNCi0gICAgICAgICAgICAgTUNPeFNvdXJjZSB8IE1DT3hQcmVzY2FsZXIpOw0KLX0NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VGX1BlcmlwaGVyYWxfQ2xvY2tfU291cmNlIFBlcmlwaGVyYWwgQ2xvY2sgU291cmNlDQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENvbmZpZ3VyZSBVU0FSVHggY2xvY2sgc291cmNlDQotICogQHJtdG9sbCBDQ0lQUiAgICAgICAgVVNBUlR4U0VMICAgICBMTF9SQ0NfU2V0VVNBUlRDbG9ja1NvdXJjZQ0KLSAqIEBwYXJhbSAgVVNBUlR4U291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQVJUMV9DTEtTT1VSQ0VfUENMSzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVVNBUlQxX0NMS1NPVVJDRV9TWVNDTEsNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVVNBUlQxX0NMS1NPVVJDRV9IU0kNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVVNBUlQxX0NMS1NPVVJDRV9MU0UNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVVNBUlQyX0NMS1NPVVJDRV9QQ0xLMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0FSVDJfQ0xLU09VUkNFX1NZU0NMSw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0FSVDJfQ0xLU09VUkNFX0hTSQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0FSVDJfQ0xLU09VUkNFX0xTRQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0FSVDNfQ0xLU09VUkNFX1BDTEsxDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQVJUM19DTEtTT1VSQ0VfU1lTQ0xLDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQVJUM19DTEtTT1VSQ0VfSFNJDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQVJUM19DTEtTT1VSQ0VfTFNFDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX1NldFVTQVJUQ2xvY2tTb3VyY2UodWludDMyX3QgVVNBUlR4U291cmNlKSB7DQotICBNT0RJRllfUkVHKFJDQy0+Q0NJUFIsIChVU0FSVHhTb3VyY2UgPj4gMTZVKSwgKFVTQVJUeFNvdXJjZSAmIDB4MDAwMEZGRkZVKSk7DQotfQ0KLQ0KLSNpZiBkZWZpbmVkKFVBUlQ0KQ0KLS8qKg0KLSAqIEBicmllZiAgQ29uZmlndXJlIFVBUlR4IGNsb2NrIHNvdXJjZQ0KLSAqIEBybXRvbGwgQ0NJUFIgICAgICAgIFVBUlR4U0VMICAgICAgTExfUkNDX1NldFVBUlRDbG9ja1NvdXJjZQ0KLSAqIEBwYXJhbSAgVUFSVHhTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVUFSVDRfQ0xLU09VUkNFX1BDTEsxICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VQVJUNF9DTEtTT1VSQ0VfU1lTQ0xLICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VQVJUNF9DTEtTT1VSQ0VfSFNJICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VQVJUNF9DTEtTT1VSQ0VfTFNFICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VQVJUNV9DTEtTT1VSQ0VfUENMSzEgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VBUlQ1X0NMS1NPVVJDRV9TWVNDTEsgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VBUlQ1X0NMS1NPVVJDRV9IU0kgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VBUlQ1X0NMS1NPVVJDRV9MU0UgKCopDQotICoNCi0gKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfU2V0VUFSVENsb2NrU291cmNlKHVpbnQzMl90IFVBUlR4U291cmNlKSB7DQotICBNT0RJRllfUkVHKFJDQy0+Q0NJUFIsIChVQVJUeFNvdXJjZSA+PiAxNlUpLCAoVUFSVHhTb3VyY2UgJiAweDAwMDBGRkZGVSkpOw0KLX0NCi0jZW5kaWYgLyogVUFSVDQgKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENvbmZpZ3VyZSBMUFVBUlQxeCBjbG9jayBzb3VyY2UNCi0gKiBAcm10b2xsIENDSVBSICAgICAgICBMUFVBUlQxU0VMICAgIExMX1JDQ19TZXRMUFVBUlRDbG9ja1NvdXJjZQ0KLSAqIEBwYXJhbSAgTFBVQVJUeFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MUFVBUlQxX0NMS1NPVVJDRV9QQ0xLMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MUFVBUlQxX0NMS1NPVVJDRV9TWVNDTEsNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTFBVQVJUMV9DTEtTT1VSQ0VfSFNJDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xQVUFSVDFfQ0xLU09VUkNFX0xTRQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19TZXRMUFVBUlRDbG9ja1NvdXJjZSh1aW50MzJfdCBMUFVBUlR4U291cmNlKSB7DQotICBNT0RJRllfUkVHKFJDQy0+Q0NJUFIsIFJDQ19DQ0lQUl9MUFVBUlQxU0VMLCBMUFVBUlR4U291cmNlKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDb25maWd1cmUgSTJDeCBjbG9jayBzb3VyY2UNCi0gKiBAcm10b2xsIENDSVBSICAgICAgICBJMkN4U0VMICAgICAgIExMX1JDQ19TZXRJMkNDbG9ja1NvdXJjZQ0KLSAqIEBwYXJhbSAgSTJDeFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19JMkMxX0NMS1NPVVJDRV9QQ0xLMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19JMkMxX0NMS1NPVVJDRV9TWVNDTEsNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSTJDMV9DTEtTT1VSQ0VfSFNJDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0kyQzJfQ0xLU09VUkNFX1BDTEsxDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0kyQzJfQ0xLU09VUkNFX1NZU0NMSw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19JMkMyX0NMS1NPVVJDRV9IU0kNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSTJDM19DTEtTT1VSQ0VfUENMSzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSTJDM19DTEtTT1VSQ0VfU1lTQ0xLDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0kyQzNfQ0xLU09VUkNFX0hTSQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19JMkM0X0NMS1NPVVJDRV9QQ0xLMSAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSTJDNF9DTEtTT1VSQ0VfU1lTQ0xLICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19JMkM0X0NMS1NPVVJDRV9IU0kgKCopDQotICoNCi0gKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfU2V0STJDQ2xvY2tTb3VyY2UodWludDMyX3QgSTJDeFNvdXJjZSkgew0KLSAgX19JTyB1aW50MzJfdCAqcmVnID0NCi0gICAgICAoX19JTyB1aW50MzJfdCAqKSh1aW50MzJfdCkoUkNDX0JBU0UgKyAweDg4VSArIChJMkN4U291cmNlID4+IDI0VSkpOw0KLSAgTU9ESUZZX1JFRygNCi0gICAgICAqcmVnLCAzVUwgPDwgKChJMkN4U291cmNlICYgMHgwMDFGMDAwMFUpID4+IDE2VSksDQotICAgICAgKChJMkN4U291cmNlICYgMHgwMDAwMDBGRlUpIDw8ICgoSTJDeFNvdXJjZSAmIDB4MDAxRjAwMDBVKSA+PiAxNlUpKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ29uZmlndXJlIExQVElNeCBjbG9jayBzb3VyY2UNCi0gKiBAcm10b2xsIENDSVBSICAgICAgICBMUFRJTTFTRUwgICAgIExMX1JDQ19TZXRMUFRJTUNsb2NrU291cmNlDQotICogQHBhcmFtICBMUFRJTXhTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTFBUSU0xX0NMS1NPVVJDRV9QQ0xLMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MUFRJTTFfQ0xLU09VUkNFX0xTSQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MUFRJTTFfQ0xLU09VUkNFX0hTSQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MUFRJTTFfQ0xLU09VUkNFX0xTRQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19TZXRMUFRJTUNsb2NrU291cmNlKHVpbnQzMl90IExQVElNeFNvdXJjZSkgew0KLSAgTU9ESUZZX1JFRyhSQ0MtPkNDSVBSLCBSQ0NfQ0NJUFJfTFBUSU0xU0VMLCBMUFRJTXhTb3VyY2UpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENvbmZpZ3VyZSBTQUl4IGNsb2NrIHNvdXJjZQ0KLSAqIEBybXRvbGwgQ0NJUFIgICAgICAgIFNBSTFTRUwgICAgICAgTExfUkNDX1NldFNBSUNsb2NrU291cmNlDQotICogQHBhcmFtICBTQUl4U291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NBSTFfQ0xLU09VUkNFX1NZU0NMSw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TQUkxX0NMS1NPVVJDRV9QTEwNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU0FJMV9DTEtTT1VSQ0VfUElODQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NBSTFfQ0xLU09VUkNFX0hTSQ0KLSAqDQotICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX1NldFNBSUNsb2NrU291cmNlKHVpbnQzMl90IFNBSXhTb3VyY2UpIHsNCi0gIE1PRElGWV9SRUcoUkNDLT5DQ0lQUiwgUkNDX0NDSVBSX1NBSTFTRUwsIFNBSXhTb3VyY2UpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENvbmZpZ3VyZSBJMlMgY2xvY2sgc291cmNlDQotICogQHJtdG9sbCBDQ0lQUiAgICAgICAgSTJTMjNTRUwgICAgICBMTF9SQ0NfU2V0STJTQ2xvY2tTb3VyY2UNCi0gKiBAcGFyYW0gIEkyU3hTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSTJTX0NMS1NPVVJDRV9TWVNDTEsNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSTJTX0NMS1NPVVJDRV9QTEwNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSTJTX0NMS1NPVVJDRV9QSU4NCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSTJTX0NMS1NPVVJDRV9IU0kNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfU2V0STJTQ2xvY2tTb3VyY2UodWludDMyX3QgSTJTeFNvdXJjZSkgew0KLSAgTU9ESUZZX1JFRyhSQ0MtPkNDSVBSLCBSQ0NfQ0NJUFJfSTJTMjNTRUwsIEkyU3hTb3VyY2UpOw0KLX0NCi0NCi0jaWYgZGVmaW5lZChGRENBTjEpDQotLyoqDQotICogQGJyaWVmICBDb25maWd1cmUgRkRDQU4gY2xvY2sgc291cmNlDQotICogQHJtdG9sbCBDQ0lQUiAgICAgICAgRkRDQU5TRUwgICAgICBMTF9SQ0NfU2V0RkRDQU5DbG9ja1NvdXJjZQ0KLSAqIEBwYXJhbSAgRkRDQU54U291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0ZEQ0FOX0NMS1NPVVJDRV9IU0UNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfRkRDQU5fQ0xLU09VUkNFX1BMTA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19GRENBTl9DTEtTT1VSQ0VfUENMSzENCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfU2V0RkRDQU5DbG9ja1NvdXJjZSh1aW50MzJfdCBGRENBTnhTb3VyY2UpIHsNCi0gIE1PRElGWV9SRUcoUkNDLT5DQ0lQUiwgUkNDX0NDSVBSX0ZEQ0FOU0VMLCBGRENBTnhTb3VyY2UpOw0KLX0NCi0jZW5kaWYgLyogRkRDQU4xICovDQotDQotLyoqDQotICogQGJyaWVmICBDb25maWd1cmUgUk5HIGNsb2NrIHNvdXJjZQ0KLSAqIEBybXRvbGwgQ0NJUFIgICAgICAgIENMSzQ4U0VMICAgICAgTExfUkNDX1NldFJOR0Nsb2NrU291cmNlDQotICogQHBhcmFtICBSTkd4U291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1JOR19DTEtTT1VSQ0VfSFNJNDgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUk5HX0NMS1NPVVJDRV9QTEwNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfU2V0Uk5HQ2xvY2tTb3VyY2UodWludDMyX3QgUk5HeFNvdXJjZSkgew0KLSAgTU9ESUZZX1JFRyhSQ0MtPkNDSVBSLCBSQ0NfQ0NJUFJfQ0xLNDhTRUwsIFJOR3hTb3VyY2UpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENvbmZpZ3VyZSBVU0IgY2xvY2sgc291cmNlDQotICogQHJtdG9sbCBDQ0lQUiAgICAgICAgQ0xLNDhTRUwgICAgICBMTF9SQ0NfU2V0VVNCQ2xvY2tTb3VyY2UNCi0gKiBAcGFyYW0gIFVTQnhTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVVNCX0NMS1NPVVJDRV9IU0k0OA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0JfQ0xLU09VUkNFX1BMTA0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19TZXRVU0JDbG9ja1NvdXJjZSh1aW50MzJfdCBVU0J4U291cmNlKSB7DQotICBNT0RJRllfUkVHKFJDQy0+Q0NJUFIsIFJDQ19DQ0lQUl9DTEs0OFNFTCwgVVNCeFNvdXJjZSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ29uZmlndXJlIEFEQyBjbG9jayBzb3VyY2UNCi0gKiBAcm10b2xsIENDSVBSICAgICAgICBBREMxMlNFTCAgICAgICAgIExMX1JDQ19TZXRBRENDbG9ja1NvdXJjZVxuDQotICogICAgICAgICBDQ0lQUiAgICAgICAgQURDMzQ1U0VMICAgICAgICBMTF9SQ0NfU2V0QURDQ2xvY2tTb3VyY2UNCi0gKiBAcGFyYW0gIEFEQ3hTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQURDMTJfQ0xLU09VUkNFX05PTkUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQURDMTJfQ0xLU09VUkNFX1BMTA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BREMxMl9DTEtTT1VSQ0VfU1lTQ0xLDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FEQzM0NV9DTEtTT1VSQ0VfTk9ORSAgICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BREMzNDVfQ0xLU09VUkNFX1BMTCAgICAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQURDMzQ1X0NMS1NPVVJDRV9TWVNDTEsgKCopDQotICoNCi0gKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfU2V0QURDQ2xvY2tTb3VyY2UodWludDMyX3QgQURDeFNvdXJjZSkgew0KLSAgTU9ESUZZX1JFRygNCi0gICAgICBSQ0MtPkNDSVBSLCAzVSA8PCAoKEFEQ3hTb3VyY2UgJiAweDAwMUYwMDAwVSkgPj4gMTZVKSwNCi0gICAgICAoKEFEQ3hTb3VyY2UgJiAweDAwMDAwMEZGVSkgPDwgKChBREN4U291cmNlICYgMHgwMDFGMDAwMFUpID4+IDE2VSkpKTsNCi19DQotDQotI2lmIGRlZmluZWQoUVVBRFNQSSkNCi0vKioNCi0gKiBAYnJpZWYgIENvbmZpZ3VyZSBRVUFEU1BJIGNsb2NrIHNvdXJjZQ0KLSAqIEBybXRvbGwgQ0NJUFIyICAgICAgICAgUVNQSVNFTCAgICAgTExfUkNDX1NldFFVQURTUElDbG9ja1NvdXJjZQ0KLSAqIEBwYXJhbSAgU291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1FVQURTUElfQ0xLU09VUkNFX1NZU0NMSw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19RVUFEU1BJX0NMS1NPVVJDRV9IU0kNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUVVBRFNQSV9DTEtTT1VSQ0VfUExMDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX1NldFFVQURTUElDbG9ja1NvdXJjZSh1aW50MzJfdCBTb3VyY2UpIHsNCi0gIE1PRElGWV9SRUcoUkNDLT5DQ0lQUjIsIFJDQ19DQ0lQUjJfUVNQSVNFTCwgU291cmNlKTsNCi19DQotI2VuZGlmIC8qIFFVQURTUEkgKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBVU0FSVHggY2xvY2sgc291cmNlDQotICogQHJtdG9sbCBDQ0lQUiAgICAgICAgVVNBUlR4U0VMICAgICBMTF9SQ0NfR2V0VVNBUlRDbG9ja1NvdXJjZQ0KLSAqIEBwYXJhbSAgVVNBUlR4IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQVJUMV9DTEtTT1VSQ0UNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVVNBUlQyX0NMS1NPVVJDRQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0FSVDNfQ0xLU09VUkNFDQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0FSVDFfQ0xLU09VUkNFX1BDTEsyDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQVJUMV9DTEtTT1VSQ0VfU1lTQ0xLDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQVJUMV9DTEtTT1VSQ0VfSFNJDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQVJUMV9DTEtTT1VSQ0VfTFNFDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQVJUMl9DTEtTT1VSQ0VfUENMSzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVVNBUlQyX0NMS1NPVVJDRV9TWVNDTEsNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVVNBUlQyX0NMS1NPVVJDRV9IU0kNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVVNBUlQyX0NMS1NPVVJDRV9MU0UNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVVNBUlQzX0NMS1NPVVJDRV9QQ0xLMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0FSVDNfQ0xLU09VUkNFX1NZU0NMSw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0FSVDNfQ0xLU09VUkNFX0hTSQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0FSVDNfQ0xLU09VUkNFX0xTRQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfR2V0VVNBUlRDbG9ja1NvdXJjZSh1aW50MzJfdCBVU0FSVHgpIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJDQy0+Q0NJUFIsIFVTQVJUeCkgfCAoVVNBUlR4IDw8IDE2VSkpOw0KLX0NCi0NCi0jaWYgZGVmaW5lZChVQVJUNCkNCi0vKioNCi0gKiBAYnJpZWYgIEdldCBVQVJUeCBjbG9jayBzb3VyY2UNCi0gKiBAcm10b2xsIENDSVBSICAgICAgICBVQVJUeFNFTCAgICAgIExMX1JDQ19HZXRVQVJUQ2xvY2tTb3VyY2UNCi0gKiBAcGFyYW0gIFVBUlR4IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VBUlQ0X0NMS1NPVVJDRSAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVUFSVDVfQ0xLU09VUkNFICgqKQ0KLSAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVUFSVDRfQ0xLU09VUkNFX1BDTEsxICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VQVJUNF9DTEtTT1VSQ0VfU1lTQ0xLICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VQVJUNF9DTEtTT1VSQ0VfSFNJICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VQVJUNF9DTEtTT1VSQ0VfTFNFICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VQVJUNV9DTEtTT1VSQ0VfUENMSzEgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VBUlQ1X0NMS1NPVVJDRV9TWVNDTEsgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VBUlQ1X0NMS1NPVVJDRV9IU0kgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VBUlQ1X0NMS1NPVVJDRV9MU0UgKCopDQotICoNCi0gKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0dldFVBUlRDbG9ja1NvdXJjZSh1aW50MzJfdCBVQVJUeCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DQ0lQUiwgVUFSVHgpIHwgKFVBUlR4IDw8IDE2VSkpOw0KLX0NCi0jZW5kaWYgLyogVUFSVDQgKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBMUFVBUlR4IGNsb2NrIHNvdXJjZQ0KLSAqIEBybXRvbGwgQ0NJUFIgICAgICAgIExQVUFSVDFTRUwgICAgTExfUkNDX0dldExQVUFSVENsb2NrU291cmNlDQotICogQHBhcmFtICBMUFVBUlR4IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xQVUFSVDFfQ0xLU09VUkNFDQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MUFVBUlQxX0NMS1NPVVJDRV9QQ0xLMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MUFVBUlQxX0NMS1NPVVJDRV9TWVNDTEsNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTFBVQVJUMV9DTEtTT1VSQ0VfSFNJDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xQVUFSVDFfQ0xLU09VUkNFX0xTRQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfR2V0TFBVQVJUQ2xvY2tTb3VyY2UodWludDMyX3QgTFBVQVJUeCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DQ0lQUiwgTFBVQVJUeCkpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBJMkN4IGNsb2NrIHNvdXJjZQ0KLSAqIEBybXRvbGwgQ0NJUFIgICAgICAgIEkyQ3hTRUwgICAgICAgTExfUkNDX0dldEkyQ0Nsb2NrU291cmNlDQotICogQHBhcmFtICBJMkN4IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0kyQzFfQ0xLU09VUkNFDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0kyQzJfQ0xLU09VUkNFDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0kyQzNfQ0xLU09VUkNFDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0kyQzRfQ0xLU09VUkNFICgqKQ0KLSAqDQotICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuDQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19JMkMxX0NMS1NPVVJDRV9QQ0xLMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19JMkMxX0NMS1NPVVJDRV9TWVNDTEsNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSTJDMV9DTEtTT1VSQ0VfSFNJDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0kyQzJfQ0xLU09VUkNFX1BDTEsxDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0kyQzJfQ0xLU09VUkNFX1NZU0NMSw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19JMkMyX0NMS1NPVVJDRV9IU0kNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSTJDM19DTEtTT1VSQ0VfUENMSzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSTJDM19DTEtTT1VSQ0VfU1lTQ0xLDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0kyQzNfQ0xLU09VUkNFX0hTSQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19JMkM0X0NMS1NPVVJDRV9QQ0xLMSAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSTJDNF9DTEtTT1VSQ0VfU1lTQ0xLICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19JMkM0X0NMS1NPVVJDRV9IU0kgKCopDQotICoNCi0gKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0dldEkyQ0Nsb2NrU291cmNlKHVpbnQzMl90IEkyQ3gpIHsNCi0gIF9fSU8gY29uc3QgdWludDMyX3QgKnJlZyA9DQotICAgICAgKF9fSU8gdWludDMyX3QgKikodWludDMyX3QpKFJDQ19CQVNFICsgMHg4OFUgKyAoSTJDeCA+PiAyNFUpKTsNCi0gIHJldHVybiAodWludDMyX3QpKChSRUFEX0JJVCgqcmVnLCAzVUwgPDwgKChJMkN4ICYgMHgwMDFGMDAwMFUpID4+IDE2VSkpID4+DQotICAgICAgICAgICAgICAgICAgICAgKChJMkN4ICYgMHgwMDFGMDAwMFUpID4+IDE2VSkpIHwNCi0gICAgICAgICAgICAgICAgICAgIChJMkN4ICYgMHhGRkZGMDAwMFUpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgTFBUSU14IGNsb2NrIHNvdXJjZQ0KLSAqIEBybXRvbGwgQ0NJUFIgICAgICAgIExQVElNeFNFTCAgICAgTExfUkNDX0dldExQVElNQ2xvY2tTb3VyY2UNCi0gKiBAcGFyYW0gIExQVElNeCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MUFRJTTFfQ0xLU09VUkNFDQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MUFRJTTFfQ0xLU09VUkNFX1BDTEsxDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xQVElNMV9DTEtTT1VSQ0VfTFNJDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xQVElNMV9DTEtTT1VSQ0VfSFNJDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xQVElNMV9DTEtTT1VSQ0VfTFNFDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19HZXRMUFRJTUNsb2NrU291cmNlKHVpbnQzMl90IExQVElNeCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DQ0lQUiwgTFBUSU14KSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IFNBSXggY2xvY2sgc291cmNlDQotICogQHJtdG9sbCBDQ0lQUiAgICAgICAgU0FJMVNFTCAgICAgICBMTF9SQ0NfR2V0U0FJQ2xvY2tTb3VyY2UNCi0gKiBAcGFyYW0gIFNBSXggVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU0FJMV9DTEtTT1VSQ0UNCi0gKg0KLSAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLg0KLSAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU0FJMV9DTEtTT1VSQ0VfU1lTQ0xLDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NBSTFfQ0xLU09VUkNFX1BMTA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TQUkxX0NMS1NPVVJDRV9QSU4NCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU0FJMV9DTEtTT1VSQ0VfSFNJDQotICoNCi0gKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0dldFNBSUNsb2NrU291cmNlKHVpbnQzMl90IFNBSXgpIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJDQy0+Q0NJUFIsIFNBSXgpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgSTJTeCBjbG9jayBzb3VyY2UNCi0gKiBAcm10b2xsIENDSVBSICAgICAgICBJMlMyM1NFTCAgICAgIExMX1JDQ19HZXRJMlNDbG9ja1NvdXJjZQ0KLSAqIEBwYXJhbSAgSTJTeCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19JMlNfQ0xLU09VUkNFDQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19JMlNfQ0xLU09VUkNFX1NZU0NMSw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19JMlNfQ0xLU09VUkNFX1BMTA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19JMlNfQ0xLU09VUkNFX1BJTg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19JMlNfQ0xLU09VUkNFX0hTSQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfR2V0STJTQ2xvY2tTb3VyY2UodWludDMyX3QgSTJTeCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DQ0lQUiwgSTJTeCkpOw0KLX0NCi0NCi0jaWYgZGVmaW5lZChGRENBTjEpDQotLyoqDQotICogQGJyaWVmICBHZXQgRkRDQU54IGNsb2NrIHNvdXJjZQ0KLSAqIEBybXRvbGwgQ0NJUFIgICAgICAgIEZEQ0FOU0VMICAgICAgTExfUkNDX0dldEZEQ0FOQ2xvY2tTb3VyY2UNCi0gKiBAcGFyYW0gIEZEQ0FOeCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19GRENBTl9DTEtTT1VSQ0UNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0ZEQ0FOX0NMS1NPVVJDRV9IU0UNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfRkRDQU5fQ0xLU09VUkNFX1BMTA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19GRENBTl9DTEtTT1VSQ0VfUENMSzENCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0dldEZEQ0FOQ2xvY2tTb3VyY2UodWludDMyX3QgRkRDQU54KSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPkNDSVBSLCBGRENBTngpKTsNCi19DQotI2VuZGlmIC8qIEZEQ0FOMSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IFJOR3ggY2xvY2sgc291cmNlDQotICogQHJtdG9sbCBDQ0lQUiAgICAgICAgQ0xLNDhTRUwgICAgICBMTF9SQ0NfR2V0Uk5HQ2xvY2tTb3VyY2UNCi0gKiBAcGFyYW0gIFJOR3ggVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUk5HX0NMS1NPVVJDRQ0KLSAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUk5HX0NMS1NPVVJDRV9IU0k0OA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19STkdfQ0xLU09VUkNFX1BMTA0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfR2V0Uk5HQ2xvY2tTb3VyY2UodWludDMyX3QgUk5HeCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DQ0lQUiwgUk5HeCkpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBVU0J4IGNsb2NrIHNvdXJjZQ0KLSAqIEBybXRvbGwgQ0NJUFIgICAgICAgIENMSzQ4U0VMICAgICAgTExfUkNDX0dldFVTQkNsb2NrU291cmNlDQotICogQHBhcmFtICBVU0J4IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQl9DTEtTT1VSQ0UNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQl9DTEtTT1VSQ0VfSFNJNDgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVVNCX0NMS1NPVVJDRV9QTEwNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0dldFVTQkNsb2NrU291cmNlKHVpbnQzMl90IFVTQngpIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJDQy0+Q0NJUFIsIFVTQngpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgQURDeCBjbG9jayBzb3VyY2UNCi0gKiBAcm10b2xsIENDSVBSICAgICAgICBBRENTRUwgICAgICAgIExMX1JDQ19HZXRBRENDbG9ja1NvdXJjZQ0KLSAqIEBwYXJhbSAgQURDeCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BREMxMl9DTEtTT1VSQ0UNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQURDMzQ1X0NMS1NPVVJDRSAgICAgICAgKCopDQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BREMxMl9DTEtTT1VSQ0VfTk9ORQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BREMxMl9DTEtTT1VSQ0VfUExMDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FEQzEyX0NMS1NPVVJDRV9TWVNDTEsNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQURDMzQ1X0NMS1NPVVJDRV9OT05FICAgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FEQzM0NV9DTEtTT1VSQ0VfUExMICAgICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BREMzNDVfQ0xLU09VUkNFX1NZU0NMSyAoKikNCi0gKg0KLSAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfR2V0QURDQ2xvY2tTb3VyY2UodWludDMyX3QgQURDeCkgew0KLSAgcmV0dXJuICgNCi0gICAgICB1aW50MzJfdCkoKFJFQURfQklUKFJDQy0+Q0NJUFIsIDNVTCA8PCAoKEFEQ3ggJiAweDAwMUYwMDAwVSkgPj4gMTZVKSkgPj4NCi0gICAgICAgICAgICAgICAgICgoQURDeCAmIDB4MDAxRjAwMDBVKSA+PiAxNlUpKSB8DQotICAgICAgICAgICAgICAgIChBREN4ICYgMHhGRkZGMDAwMFUpKTsNCi19DQotDQotI2lmIGRlZmluZWQoUVVBRFNQSSkNCi0vKioNCi0gKiBAYnJpZWYgIEdldCBRVUFEU1BJIGNsb2NrIHNvdXJjZQ0KLSAqIEBybXRvbGwgQ0NJUFIyICAgICAgICAgUVNQSVNFTCAgICAgTExfUkNDX0dldFFVQURTUElDbG9ja1NvdXJjZQ0KLSAqIEBwYXJhbSAgUVVBRFNQSXggVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUVVBRFNQSV9DTEtTT1VSQ0UNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1FVQURTUElfQ0xLU09VUkNFX1NZU0NMSw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19RVUFEU1BJX0NMS1NPVVJDRV9IU0kNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUVVBRFNQSV9DTEtTT1VSQ0VfUExMDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19HZXRRVUFEU1BJQ2xvY2tTb3VyY2UodWludDMyX3QgUVVBRFNQSXgpIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJDQy0+Q0NJUFIyLCBRVUFEU1BJeCkpOw0KLX0NCi0jZW5kaWYgLyogUVVBRFNQSSAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBSQ0NfTExfRUZfUlRDIFJUQw0KLSAqIEB7DQotICovDQotDQotLyoqDQotICogQGJyaWVmICBTZXQgUlRDIENsb2NrIFNvdXJjZQ0KLSAqIEBub3RlIE9uY2UgdGhlIFJUQyBjbG9jayBzb3VyY2UgaGFzIGJlZW4gc2VsZWN0ZWQsIGl0IGNhbm5vdCBiZSBjaGFuZ2VkDQotICogYW55bW9yZSB1bmxlc3MgdGhlIEJhY2t1cCBkb21haW4gaXMgcmVzZXQsIG9yIHVubGVzcyBhIGZhaWx1cmUgaXMgZGV0ZWN0ZWQgb24NCi0gKiBMU0UgKExTRUNTU0QgaXMgc2V0KS4gVGhlIEJEUlNUIGJpdCBjYW4gYmUgdXNlZCB0byByZXNldCB0aGVtLg0KLSAqIEBybXRvbGwgQkRDUiAgICAgICAgIFJUQ1NFTCAgICAgICAgTExfUkNDX1NldFJUQ0Nsb2NrU291cmNlDQotICogQHBhcmFtICBTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUlRDX0NMS1NPVVJDRV9OT05FDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1JUQ19DTEtTT1VSQ0VfTFNFDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1JUQ19DTEtTT1VSQ0VfTFNJDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1JUQ19DTEtTT1VSQ0VfSFNFX0RJVjMyDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX1NldFJUQ0Nsb2NrU291cmNlKHVpbnQzMl90IFNvdXJjZSkgew0KLSAgTU9ESUZZX1JFRyhSQ0MtPkJEQ1IsIFJDQ19CRENSX1JUQ1NFTCwgU291cmNlKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgUlRDIENsb2NrIFNvdXJjZQ0KLSAqIEBybXRvbGwgQkRDUiAgICAgICAgIFJUQ1NFTCAgICAgICAgTExfUkNDX0dldFJUQ0Nsb2NrU291cmNlDQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19SVENfQ0xLU09VUkNFX05PTkUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUlRDX0NMS1NPVVJDRV9MU0UNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUlRDX0NMS1NPVVJDRV9MU0kNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUlRDX0NMS1NPVVJDRV9IU0VfRElWMzINCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0dldFJUQ0Nsb2NrU291cmNlKHZvaWQpIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfUlRDU0VMKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIFJUQw0KLSAqIEBybXRvbGwgQkRDUiAgICAgICAgIFJUQ0VOICAgICAgICAgTExfUkNDX0VuYWJsZVJUQw0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19FbmFibGVSVEModm9pZCkgew0KLSAgU0VUX0JJVChSQ0MtPkJEQ1IsIFJDQ19CRENSX1JUQ0VOKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIFJUQw0KLSAqIEBybXRvbGwgQkRDUiAgICAgICAgIFJUQ0VOICAgICAgICAgTExfUkNDX0Rpc2FibGVSVEMNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfRGlzYWJsZVJUQyh2b2lkKSB7DQotICBDTEVBUl9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9SVENFTik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgUlRDIGhhcyBiZWVuIGVuYWJsZWQgb3Igbm90DQotICogQHJtdG9sbCBCRENSICAgICAgICAgUlRDRU4gICAgICAgICBMTF9SQ0NfSXNFbmFibGVkUlRDDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19Jc0VuYWJsZWRSVEModm9pZCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9SVENFTikgPT0gKFJDQ19CRENSX1JUQ0VOKSkgPyAxVUwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBGb3JjZSB0aGUgQmFja3VwIGRvbWFpbiByZXNldA0KLSAqIEBybXRvbGwgQkRDUiAgICAgICAgIEJEUlNUICAgICAgICAgTExfUkNDX0ZvcmNlQmFja3VwRG9tYWluUmVzZXQNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfRm9yY2VCYWNrdXBEb21haW5SZXNldCh2b2lkKSB7DQotICBTRVRfQklUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfQkRSU1QpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJlbGVhc2UgdGhlIEJhY2t1cCBkb21haW4gcmVzZXQNCi0gKiBAcm10b2xsIEJEQ1IgICAgICAgICBCRFJTVCAgICAgICAgIExMX1JDQ19SZWxlYXNlQmFja3VwRG9tYWluUmVzZXQNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfUmVsZWFzZUJhY2t1cERvbWFpblJlc2V0KHZvaWQpIHsNCi0gIENMRUFSX0JJVChSQ0MtPkJEQ1IsIFJDQ19CRENSX0JEUlNUKTsNCi19DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFJDQ19MTF9FRl9QTEwgUExMDQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSBQTEwNCi0gKiBAcm10b2xsIENSICAgICAgICAgICBQTExPTiAgICAgICAgIExMX1JDQ19QTExfRW5hYmxlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX1BMTF9FbmFibGUodm9pZCkgeyBTRVRfQklUKFJDQy0+Q1IsIFJDQ19DUl9QTExPTik7IH0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgUExMDQotICogQG5vdGUgQ2Fubm90IGJlIGRpc2FibGVkIGlmIHRoZSBQTEwgY2xvY2sgaXMgdXNlZCBhcyB0aGUgc3lzdGVtIGNsb2NrDQotICogQHJtdG9sbCBDUiAgICAgICAgICAgUExMT04gICAgICAgICBMTF9SQ0NfUExMX0Rpc2FibGUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfUExMX0Rpc2FibGUodm9pZCkgew0KLSAgQ0xFQVJfQklUKFJDQy0+Q1IsIFJDQ19DUl9QTExPTik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgUExMIFJlYWR5DQotICogQHJtdG9sbCBDUiAgICAgICAgICAgUExMUkRZICAgICAgICBMTF9SQ0NfUExMX0lzUmVhZHkNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX1BMTF9Jc1JlYWR5KHZvaWQpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q1IsIFJDQ19DUl9QTExSRFkpID09IChSQ0NfQ1JfUExMUkRZKSkgPyAxVUwgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENvbmZpZ3VyZSBQTEwgdXNlZCBmb3IgU1lTQ0xLIERvbWFpbg0KLSAqIEBub3RlIFBMTCBTb3VyY2UgYW5kIFBMTE0gRGl2aWRlciBjYW4gYmUgd3JpdHRlbiBvbmx5IHdoZW4gUExMDQotICogICAgICAgaXMgZGlzYWJsZWQuDQotICogQG5vdGUgUExMTi9QTExSIGNhbiBiZSB3cml0dGVuIG9ubHkgd2hlbiBQTEwgaXMgZGlzYWJsZWQuDQotICogQHJtdG9sbCBQTExDRkdSICAgICAgUExMU1JDICAgICAgICBMTF9SQ0NfUExMX0NvbmZpZ0RvbWFpbl9TWVNcbg0KLSAqICAgICAgICAgUExMQ0ZHUiAgICAgIFBMTE0gICAgICAgICAgTExfUkNDX1BMTF9Db25maWdEb21haW5fU1lTXG4NCi0gKiAgICAgICAgIFBMTENGR1IgICAgICBQTExOICAgICAgICAgIExMX1JDQ19QTExfQ29uZmlnRG9tYWluX1NZU1xuDQotICogICAgICAgICBQTExDRkdSICAgICAgUExMUiAgICAgICAgICBMTF9SQ0NfUExMX0NvbmZpZ0RvbWFpbl9TWVMNCi0gKiBAcGFyYW0gIFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTT1VSQ0VfTk9ORQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTT1VSQ0VfSFNJDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNPVVJDRV9IU0UNCi0gKiBAcGFyYW0gIFBMTE0gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl81DQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfNw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl84DQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMTANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMTINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMTMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMTQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMTUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMTYNCi0gKiBAcGFyYW0gIFBMTE4gQmV0d2VlbiBNaW5fRGF0YSA9IDggYW5kIE1heF9EYXRhID0gMTI3DQotICogQHBhcmFtICBQTExSIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFJfRElWXzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUl9ESVZfNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExSX0RJVl82DQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFJfRElWXzgNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfUExMX0NvbmZpZ0RvbWFpbl9TWVModWludDMyX3QgU291cmNlLCB1aW50MzJfdCBQTExNLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQTExOLCB1aW50MzJfdCBQTExSKSB7DQotICBNT0RJRllfUkVHKFJDQy0+UExMQ0ZHUiwNCi0gICAgICAgICAgICAgUkNDX1BMTENGR1JfUExMU1JDIHwgUkNDX1BMTENGR1JfUExMTSB8IFJDQ19QTExDRkdSX1BMTE4gfA0KLSAgICAgICAgICAgICAgICAgUkNDX1BMTENGR1JfUExMUiwNCi0gICAgICAgICAgICAgU291cmNlIHwgUExMTSB8IChQTExOIDw8IFJDQ19QTExDRkdSX1BMTE5fUG9zKSB8IFBMTFIpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENvbmZpZ3VyZSBQTEwgdXNlZCBmb3IgQURDIGRvbWFpbiBjbG9jaw0KLSAqIEBub3RlIFBMTCBTb3VyY2UgYW5kIFBMTE0gRGl2aWRlciBjYW4gYmUgd3JpdHRlbiBvbmx5IHdoZW4gUExMDQotICogICAgICAgaXMgZGlzYWJsZWQuDQotICogQG5vdGUgUExMTi9QTExQIGNhbiBiZSB3cml0dGVuIG9ubHkgd2hlbiBQTEwgaXMgZGlzYWJsZWQuDQotICogQHJtdG9sbCBQTExDRkdSICAgICAgUExMU1JDICAgICAgICBMTF9SQ0NfUExMX0NvbmZpZ0RvbWFpbl9BRENcbg0KLSAqICAgICAgICAgUExMQ0ZHUiAgICAgIFBMTE0gICAgICAgICAgTExfUkNDX1BMTF9Db25maWdEb21haW5fQURDXG4NCi0gKiAgICAgICAgIFBMTENGR1IgICAgICBQTExOICAgICAgICAgIExMX1JDQ19QTExfQ29uZmlnRG9tYWluX0FEQ1xuDQotICogICAgICAgICBQTExDRkdSICAgICAgUExMUERJViAgICAgICBMTF9SQ0NfUExMX0NvbmZpZ0RvbWFpbl9BREMNCi0gKiBAcGFyYW0gIFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTT1VSQ0VfTk9ORQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTT1VSQ0VfSFNJDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNPVVJDRV9IU0UNCi0gKiBAcGFyYW0gIFBMTE0gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl81DQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfNw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl84DQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMTANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMTINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMTMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMTQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMTUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMTYNCi0gKiBAcGFyYW0gIFBMTE4gQmV0d2VlbiBNaW5fRGF0YSA9IDggYW5kIE1heF9EYXRhID0gMTI3DQotICogQHBhcmFtICBQTExQIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl80DQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl83DQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8xMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8xMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8xMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8xMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8xNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8xNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8xNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8xNw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8xOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8xOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8yMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8yMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8yMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8yMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8yNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8yNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8yNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8yNw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8yOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8yOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8zMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8zMQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19QTExfQ29uZmlnRG9tYWluX0FEQyh1aW50MzJfdCBTb3VyY2UsIHVpbnQzMl90IFBMTE0sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFBMTE4sIHVpbnQzMl90IFBMTFApIHsNCi0gIE1PRElGWV9SRUcoUkNDLT5QTExDRkdSLA0KLSAgICAgICAgICAgICBSQ0NfUExMQ0ZHUl9QTExTUkMgfCBSQ0NfUExMQ0ZHUl9QTExNIHwgUkNDX1BMTENGR1JfUExMTiB8DQotICAgICAgICAgICAgICAgICBSQ0NfUExMQ0ZHUl9QTExQRElWLA0KLSAgICAgICAgICAgICBTb3VyY2UgfCBQTExNIHwgKFBMTE4gPDwgUkNDX1BMTENGR1JfUExMTl9Qb3MpIHwgUExMUCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ29uZmlndXJlIFBMTCB1c2VkIGZvciA0OE1oeiBkb21haW4gY2xvY2sNCi0gKiBAbm90ZSBQTEwgU291cmNlIGFuZCBQTExNIERpdmlkZXIgY2FuIGJlIHdyaXR0ZW4gb25seSB3aGVuIFBMTCwNCi0gKiAgICAgICBpcyBkaXNhYmxlZC4NCi0gKiBAbm90ZSBQTExOL1BMTFEgY2FuIGJlIHdyaXR0ZW4gb25seSB3aGVuIFBMTCBpcyBkaXNhYmxlZC4NCi0gKiBAbm90ZSBUaGlzICBjYW4gYmUgc2VsZWN0ZWQgZm9yIFVTQiwgUk5HDQotICogQHJtdG9sbCBQTExDRkdSICAgICAgUExMU1JDICAgICAgICBMTF9SQ0NfUExMX0NvbmZpZ0RvbWFpbl80OE1cbg0KLSAqICAgICAgICAgUExMQ0ZHUiAgICAgIFBMTE0gICAgICAgICAgTExfUkNDX1BMTF9Db25maWdEb21haW5fNDhNXG4NCi0gKiAgICAgICAgIFBMTENGR1IgICAgICBQTExOICAgICAgICAgIExMX1JDQ19QTExfQ29uZmlnRG9tYWluXzQ4TVxuDQotICogICAgICAgICBQTExDRkdSICAgICAgUExMUSAgICAgICAgICBMTF9SQ0NfUExMX0NvbmZpZ0RvbWFpbl80OE0NCi0gKiBAcGFyYW0gIFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTT1VSQ0VfTk9ORQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTT1VSQ0VfSFNJDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNPVVJDRV9IU0UNCi0gKiBAcGFyYW0gIFBMTE0gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl81DQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfNw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl84DQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMTANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMTINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMTMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMTQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMTUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMTYNCi0gKiBAcGFyYW0gIFBMTE4gQmV0d2VlbiBNaW5fRGF0YSA9IDggYW5kIE1heF9EYXRhID0gMTI3DQotICogQHBhcmFtICBQTExRIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFFfRElWXzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUV9ESVZfNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExRX0RJVl82DQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFFfRElWXzgNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfUExMX0NvbmZpZ0RvbWFpbl80OE0odWludDMyX3QgU291cmNlLCB1aW50MzJfdCBQTExNLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQTExOLCB1aW50MzJfdCBQTExRKSB7DQotICBNT0RJRllfUkVHKFJDQy0+UExMQ0ZHUiwNCi0gICAgICAgICAgICAgUkNDX1BMTENGR1JfUExMU1JDIHwgUkNDX1BMTENGR1JfUExMTSB8IFJDQ19QTExDRkdSX1BMTE4gfA0KLSAgICAgICAgICAgICAgICAgUkNDX1BMTENGR1JfUExMUSwNCi0gICAgICAgICAgICAgU291cmNlIHwgUExMTSB8IChQTExOIDw8IFJDQ19QTExDRkdSX1BMTE5fUG9zKSB8IFBMTFEpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENvbmZpZ3VyZSBQTEwgY2xvY2sgc291cmNlDQotICogQHJtdG9sbCBQTExDRkdSICAgICAgUExMU1JDICAgICAgICBMTF9SQ0NfUExMX1NldE1haW5Tb3VyY2UNCi0gKiBAcGFyYW0gUExMU291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNPVVJDRV9OT05FDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNPVVJDRV9IU0kNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU09VUkNFX0hTRQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19QTExfU2V0TWFpblNvdXJjZSh1aW50MzJfdCBQTExTb3VyY2UpIHsNCi0gIE1PRElGWV9SRUcoUkNDLT5QTExDRkdSLCBSQ0NfUExMQ0ZHUl9QTExTUkMsIFBMTFNvdXJjZSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IHRoZSBvc2NpbGxhdG9yIHVzZWQgYXMgUExMIGNsb2NrIHNvdXJjZS4NCi0gKiBAcm10b2xsIFBMTENGR1IgICAgICBQTExTUkMgICAgICAgIExMX1JDQ19QTExfR2V0TWFpblNvdXJjZQ0KLSAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU09VUkNFX05PTkUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU09VUkNFX0hTSQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTT1VSQ0VfSFNFDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19QTExfR2V0TWFpblNvdXJjZSh2b2lkKSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTFNSQykpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBNYWluIFBMTCBtdWx0aXBsaWNhdGlvbiBmYWN0b3IgZm9yIFZDTw0KLSAqIEBybXRvbGwgUExMQ0ZHUiAgICAgIFBMTE4gICAgICAgICAgTExfUkNDX1BMTF9HZXRODQotICogQHJldHZhbCBCZXR3ZWVuIE1pbl9EYXRhID0gOCBhbmQgTWF4X0RhdGEgPSAxMjcNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX1BMTF9HZXROKHZvaWQpIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMTikgPj4NCi0gICAgICAgICAgICAgICAgICAgIFJDQ19QTExDRkdSX1BMTE5fUG9zKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQDQotICogQG5vdGUgVXNlZCBmb3IgUExMQURDQ0xLIChBREMgY2xvY2spDQotICogQHJtdG9sbCBQTExDRkdSICAgICAgUExMUERJViAgICAgICBMTF9SQ0NfUExMX0dldFBcbg0KLSAqIEBybXRvbGwgUExMQ0ZHUiAgICAgIFBMTFAgICAgICAgICAgTExfUkNDX1BMTF9HZXRQDQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl81DQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfNw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl84DQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMzANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMzENCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX1BMTF9HZXRQKHZvaWQpIHsNCi0gIHJldHVybiAodWludDMyX3QpKChSRUFEX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTFBESVYpICE9IDBVKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgID8gUkVBRF9CSVQoUkNDLT5QTExDRkdSLCBSQ0NfUExMQ0ZHUl9QTExQRElWKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIDogKChSRUFEX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTFApID09DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19QTExDRkdSX1BMTFApDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gTExfUkNDX1BMTFBfRElWXzE3DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTExfUkNDX1BMTFBfRElWXzcpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExRDQotICogQG5vdGUgVXNlZCBmb3IgUExMNDhNMUNMSyBzZWxlY3RlZCBmb3IgVVNCLCBSTkcgKDQ4IE1IeiBjbG9jaykNCi0gKiBAcm10b2xsIFBMTENGR1IgICAgICBQTExRICAgICAgICAgIExMX1JDQ19QTExfR2V0UQ0KLSAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUV9ESVZfMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExRX0RJVl80DQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFFfRElWXzYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUV9ESVZfOA0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfUExMX0dldFEodm9pZCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5QTExDRkdSLCBSQ0NfUExMQ0ZHUl9QTExRKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUg0KLSAqIEBub3RlIFVzZWQgZm9yIFBMTENMSyAoc3lzdGVtIGNsb2NrKQ0KLSAqIEBybXRvbGwgUExMQ0ZHUiAgICAgIFBMTFIgICAgICAgICAgTExfUkNDX1BMTF9HZXRSDQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExSX0RJVl8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFJfRElWXzQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUl9ESVZfNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExSX0RJVl84DQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19QTExfR2V0Uih2b2lkKSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTFIpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgRGl2aXNpb24gZmFjdG9yIGZvciB0aGUgbWFpbiBQTEwgYW5kIG90aGVyIFBMTA0KLSAqIEBybXRvbGwgUExMQ0ZHUiAgICAgIFBMTE0gICAgICAgICAgTExfUkNDX1BMTF9HZXREaXZpZGVyDQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8xDQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl80DQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl83DQotICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8xMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8xMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8xMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8xMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8xNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8xNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8xNg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfUExMX0dldERpdmlkZXIodm9pZCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5QTExDRkdSLCBSQ0NfUExMQ0ZHUl9QTExNKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIFBMTCBvdXRwdXQgbWFwcGVkIG9uIEFEQyBkb21haW4gY2xvY2sNCi0gKiBAcm10b2xsIFBMTENGR1IgICAgICBQTExQRU4gICAgICAgIExMX1JDQ19QTExfRW5hYmxlRG9tYWluX0FEQw0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19QTExfRW5hYmxlRG9tYWluX0FEQyh2b2lkKSB7DQotICBTRVRfQklUKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMUEVOKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIFBMTCBvdXRwdXQgbWFwcGVkIG9uIEFEQyBkb21haW4gY2xvY2sNCi0gKiBAbm90ZSBDYW5ub3QgYmUgZGlzYWJsZWQgaWYgdGhlIFBMTCBjbG9jayBpcyB1c2VkIGFzIHRoZSBzeXN0ZW0NCi0gKiAgICAgICBjbG9jaw0KLSAqIEBub3RlIEluIG9yZGVyIHRvIHNhdmUgcG93ZXIsIHdoZW4gdGhlIFBMTENMSyAgb2YgdGhlIFBMTCBpcw0KLSAqICAgICAgIG5vdCB1c2VkLCAgc2hvdWxkIGJlIDANCi0gKiBAcm10b2xsIFBMTENGR1IgICAgICBQTExQRU4gICAgICAgIExMX1JDQ19QTExfRGlzYWJsZURvbWFpbl9BREMNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfUExMX0Rpc2FibGVEb21haW5fQURDKHZvaWQpIHsNCi0gIENMRUFSX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTFBFTik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgUExMIG91dHB1dCBtYXBwZWQgb24gQURDIGRvbWFpbiBjbG9jayBpcyBlbmFibGVkDQotICogQHJtdG9sbCBQTExDRkdSICAgICAgUExMUEVOICAgICAgICBMTF9SQ0NfUExMX0lzRW5hYmxlZERvbWFpbl9BREMNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX1BMTF9Jc0VuYWJsZWREb21haW5fQURDKHZvaWQpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMUEVOKSA9PSAoUkNDX1BMTENGR1JfUExMUEVOKSkNCi0gICAgICAgICAgICAgID8gMVVMDQotICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIFBMTCBvdXRwdXQgbWFwcGVkIG9uIDQ4TUh6IGRvbWFpbiBjbG9jaw0KLSAqIEBybXRvbGwgUExMQ0ZHUiAgICAgIFBMTFFFTiAgICAgICAgTExfUkNDX1BMTF9FbmFibGVEb21haW5fNDhNDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX1BMTF9FbmFibGVEb21haW5fNDhNKHZvaWQpIHsNCi0gIFNFVF9CSVQoUkNDLT5QTExDRkdSLCBSQ0NfUExMQ0ZHUl9QTExRRU4pOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgUExMIG91dHB1dCBtYXBwZWQgb24gNDhNSHogZG9tYWluIGNsb2NrDQotICogQG5vdGUgQ2Fubm90IGJlIGRpc2FibGVkIGlmIHRoZSBQTEwgY2xvY2sgaXMgdXNlZCBhcyB0aGUgc3lzdGVtDQotICogICAgICAgY2xvY2sNCi0gKiBAbm90ZSBJbiBvcmRlciB0byBzYXZlIHBvd2VyLCB3aGVuIHRoZSBQTExDTEsgIG9mIHRoZSBQTEwgaXMNCi0gKiAgICAgICBub3QgdXNlZCwgIHNob3VsZCBiZSAwDQotICogQHJtdG9sbCBQTExDRkdSICAgICAgUExMUUVOICAgICAgICBMTF9SQ0NfUExMX0Rpc2FibGVEb21haW5fNDhNDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX1BMTF9EaXNhYmxlRG9tYWluXzQ4TSh2b2lkKSB7DQotICBDTEVBUl9CSVQoUkNDLT5QTExDRkdSLCBSQ0NfUExMQ0ZHUl9QTExRRU4pOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIGlmIFBMTCBvdXRwdXQgbWFwcGVkIG9uIDQ4TUh6IGRvbWFpbiBjbG9jayBpcyBlbmFibGVkDQotICogQHJtdG9sbCBQTExDRkdSICAgICAgUExMUUVOICAgICAgICBMTF9SQ0NfUExMX0lzRW5hYmxlZERvbWFpbl80OE0NCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX1BMTF9Jc0VuYWJsZWREb21haW5fNDhNKHZvaWQpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMUUVOKSA9PSAoUkNDX1BMTENGR1JfUExMUUVOKSkNCi0gICAgICAgICAgICAgID8gMVVMDQotICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIFBMTCBvdXRwdXQgbWFwcGVkIG9uIFNZU0NMSyBkb21haW4NCi0gKiBAcm10b2xsIFBMTENGR1IgICAgICBQTExSRU4gICAgICAgIExMX1JDQ19QTExfRW5hYmxlRG9tYWluX1NZUw0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19QTExfRW5hYmxlRG9tYWluX1NZUyh2b2lkKSB7DQotICBTRVRfQklUKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMUkVOKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIFBMTCBvdXRwdXQgbWFwcGVkIG9uIFNZU0NMSyBkb21haW4NCi0gKiBAbm90ZSBDYW5ub3QgYmUgZGlzYWJsZWQgaWYgdGhlIFBMTCBjbG9jayBpcyB1c2VkIGFzIHRoZSBzeXN0ZW0NCi0gKiAgICAgICBjbG9jaw0KLSAqIEBub3RlIEluIG9yZGVyIHRvIHNhdmUgcG93ZXIsIHdoZW4gdGhlIFBMTENMSyAgb2YgdGhlIFBMTCBpcw0KLSAqICAgICAgIG5vdCB1c2VkLCBNYWluIFBMTCAgc2hvdWxkIGJlIDANCi0gKiBAcm10b2xsIFBMTENGR1IgICAgICBQTExSRU4gICAgICAgIExMX1JDQ19QTExfRGlzYWJsZURvbWFpbl9TWVMNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfUExMX0Rpc2FibGVEb21haW5fU1lTKHZvaWQpIHsNCi0gIENMRUFSX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTFJFTik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgUExMIG91dHB1dCBtYXBwZWQgb24gU1lTQ0xLIGRvbWFpbiBjbG9jayBpcyBlbmFibGVkDQotICogQHJtdG9sbCBQTExDRkdSICAgICAgUExMUkVOICAgICAgICBMTF9SQ0NfUExMX0lzRW5hYmxlZERvbWFpbl9TWVMNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX1BMTF9Jc0VuYWJsZWREb21haW5fU1lTKHZvaWQpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMUkVOKSA9PSAoUkNDX1BMTENGR1JfUExMUkVOKSkNCi0gICAgICAgICAgICAgID8gMVVMDQotICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBSQ0NfTExfRUZfRkxBR19NYW5hZ2VtZW50IEZMQUcgTWFuYWdlbWVudA0KLSAqIEB7DQotICovDQotDQotLyoqDQotICogQGJyaWVmICBDbGVhciBMU0kgcmVhZHkgaW50ZXJydXB0IGZsYWcNCi0gKiBAcm10b2xsIENJQ1IgICAgICAgICBMU0lSRFlDICAgICAgIExMX1JDQ19DbGVhckZsYWdfTFNJUkRZDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0NsZWFyRmxhZ19MU0lSRFkodm9pZCkgew0KLSAgU0VUX0JJVChSQ0MtPkNJQ1IsIFJDQ19DSUNSX0xTSVJEWUMpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENsZWFyIExTRSByZWFkeSBpbnRlcnJ1cHQgZmxhZw0KLSAqIEBybXRvbGwgQ0lDUiAgICAgICAgIExTRVJEWUMgICAgICAgTExfUkNDX0NsZWFyRmxhZ19MU0VSRFkNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfQ2xlYXJGbGFnX0xTRVJEWSh2b2lkKSB7DQotICBTRVRfQklUKFJDQy0+Q0lDUiwgUkNDX0NJQ1JfTFNFUkRZQyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2xlYXIgSFNJIHJlYWR5IGludGVycnVwdCBmbGFnDQotICogQHJtdG9sbCBDSUNSICAgICAgICAgSFNJUkRZQyAgICAgICBMTF9SQ0NfQ2xlYXJGbGFnX0hTSVJEWQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19DbGVhckZsYWdfSFNJUkRZKHZvaWQpIHsNCi0gIFNFVF9CSVQoUkNDLT5DSUNSLCBSQ0NfQ0lDUl9IU0lSRFlDKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDbGVhciBIU0UgcmVhZHkgaW50ZXJydXB0IGZsYWcNCi0gKiBAcm10b2xsIENJQ1IgICAgICAgICBIU0VSRFlDICAgICAgIExMX1JDQ19DbGVhckZsYWdfSFNFUkRZDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0NsZWFyRmxhZ19IU0VSRFkodm9pZCkgew0KLSAgU0VUX0JJVChSQ0MtPkNJQ1IsIFJDQ19DSUNSX0hTRVJEWUMpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENsZWFyIFBMTCByZWFkeSBpbnRlcnJ1cHQgZmxhZw0KLSAqIEBybXRvbGwgQ0lDUiAgICAgICAgIFBMTFJEWUMgICAgICAgTExfUkNDX0NsZWFyRmxhZ19QTExSRFkNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfQ2xlYXJGbGFnX1BMTFJEWSh2b2lkKSB7DQotICBTRVRfQklUKFJDQy0+Q0lDUiwgUkNDX0NJQ1JfUExMUkRZQyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2xlYXIgSFNJNDggcmVhZHkgaW50ZXJydXB0IGZsYWcNCi0gKiBAcm10b2xsIENJQ1IgICAgICAgICAgSFNJNDhSRFlDICAgICBMTF9SQ0NfQ2xlYXJGbGFnX0hTSTQ4UkRZDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0NsZWFyRmxhZ19IU0k0OFJEWSh2b2lkKSB7DQotICBTRVRfQklUKFJDQy0+Q0lDUiwgUkNDX0NJQ1JfSFNJNDhSRFlDKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDbGVhciBDbG9jayBzZWN1cml0eSBzeXN0ZW0gaW50ZXJydXB0IGZsYWcNCi0gKiBAcm10b2xsIENJQ1IgICAgICAgICBDU1NDICAgICAgICAgIExMX1JDQ19DbGVhckZsYWdfSFNFQ1NTDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0NsZWFyRmxhZ19IU0VDU1Modm9pZCkgew0KLSAgU0VUX0JJVChSQ0MtPkNJQ1IsIFJDQ19DSUNSX0NTU0MpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENsZWFyIExTRSBDbG9jayBzZWN1cml0eSBzeXN0ZW0gaW50ZXJydXB0IGZsYWcNCi0gKiBAcm10b2xsIENJQ1IgICAgICAgICBMU0VDU1NDICAgICAgIExMX1JDQ19DbGVhckZsYWdfTFNFQ1NTDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0NsZWFyRmxhZ19MU0VDU1Modm9pZCkgew0KLSAgU0VUX0JJVChSQ0MtPkNJQ1IsIFJDQ19DSUNSX0xTRUNTU0MpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIGlmIExTSSByZWFkeSBpbnRlcnJ1cHQgb2NjdXJyZWQgb3Igbm90DQotICogQHJtdG9sbCBDSUZSICAgICAgICAgTFNJUkRZRiAgICAgICBMTF9SQ0NfSXNBY3RpdmVGbGFnX0xTSVJEWQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSXNBY3RpdmVGbGFnX0xTSVJEWSh2b2lkKSB7DQotICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkNJRlIsIFJDQ19DSUZSX0xTSVJEWUYpID09IChSQ0NfQ0lGUl9MU0lSRFlGKSkgPyAxVUwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgTFNFIHJlYWR5IGludGVycnVwdCBvY2N1cnJlZCBvciBub3QNCi0gKiBAcm10b2xsIENJRlIgICAgICAgICBMU0VSRFlGICAgICAgIExMX1JDQ19Jc0FjdGl2ZUZsYWdfTFNFUkRZDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19Jc0FjdGl2ZUZsYWdfTFNFUkRZKHZvaWQpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q0lGUiwgUkNDX0NJRlJfTFNFUkRZRikgPT0gKFJDQ19DSUZSX0xTRVJEWUYpKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiBIU0kgcmVhZHkgaW50ZXJydXB0IG9jY3VycmVkIG9yIG5vdA0KLSAqIEBybXRvbGwgQ0lGUiAgICAgICAgIEhTSVJEWUYgICAgICAgTExfUkNDX0lzQWN0aXZlRmxhZ19IU0lSRFkNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0lzQWN0aXZlRmxhZ19IU0lSRFkodm9pZCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5DSUZSLCBSQ0NfQ0lGUl9IU0lSRFlGKSA9PSAoUkNDX0NJRlJfSFNJUkRZRikpID8gMVVMDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIGlmIEhTRSByZWFkeSBpbnRlcnJ1cHQgb2NjdXJyZWQgb3Igbm90DQotICogQHJtdG9sbCBDSUZSICAgICAgICAgSFNFUkRZRiAgICAgICBMTF9SQ0NfSXNBY3RpdmVGbGFnX0hTRVJEWQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSXNBY3RpdmVGbGFnX0hTRVJEWSh2b2lkKSB7DQotICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkNJRlIsIFJDQ19DSUZSX0hTRVJEWUYpID09IChSQ0NfQ0lGUl9IU0VSRFlGKSkgPyAxVUwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgUExMIHJlYWR5IGludGVycnVwdCBvY2N1cnJlZCBvciBub3QNCi0gKiBAcm10b2xsIENJRlIgICAgICAgICBQTExSRFlGICAgICAgIExMX1JDQ19Jc0FjdGl2ZUZsYWdfUExMUkRZDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19Jc0FjdGl2ZUZsYWdfUExMUkRZKHZvaWQpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q0lGUiwgUkNDX0NJRlJfUExMUkRZRikgPT0gKFJDQ19DSUZSX1BMTFJEWUYpKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiBIU0k0OCByZWFkeSBpbnRlcnJ1cHQgb2NjdXJyZWQgb3Igbm90DQotICogQHJtdG9sbCBDSVIgICAgICAgICAgSFNJNDhSRFlGICAgICBMTF9SQ0NfSXNBY3RpdmVGbGFnX0hTSTQ4UkRZDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19Jc0FjdGl2ZUZsYWdfSFNJNDhSRFkodm9pZCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5DSUZSLCBSQ0NfQ0lGUl9IU0k0OFJEWUYpID09IChSQ0NfQ0lGUl9IU0k0OFJEWUYpKQ0KLSAgICAgICAgICAgICAgPyAxVUwNCi0gICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiBDbG9jayBzZWN1cml0eSBzeXN0ZW0gaW50ZXJydXB0IG9jY3VycmVkIG9yIG5vdA0KLSAqIEBybXRvbGwgQ0lGUiAgICAgICAgIENTU0YgICAgICAgICAgTExfUkNDX0lzQWN0aXZlRmxhZ19IU0VDU1MNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0lzQWN0aXZlRmxhZ19IU0VDU1Modm9pZCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5DSUZSLCBSQ0NfQ0lGUl9DU1NGKSA9PSAoUkNDX0NJRlJfQ1NTRikpID8gMVVMIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiBMU0UgQ2xvY2sgc2VjdXJpdHkgc3lzdGVtIGludGVycnVwdCBvY2N1cnJlZCBvciBub3QNCi0gKiBAcm10b2xsIENJRlIgICAgICAgICBMU0VDU1NGICAgICAgIExMX1JDQ19Jc0FjdGl2ZUZsYWdfTFNFQ1NTDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19Jc0FjdGl2ZUZsYWdfTFNFQ1NTKHZvaWQpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q0lGUiwgUkNDX0NJRlJfTFNFQ1NTRikgPT0gKFJDQ19DSUZSX0xTRUNTU0YpKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiBSQ0MgZmxhZyBJbmRlcGVuZGVudCBXYXRjaGRvZyByZXNldCBpcyBzZXQgb3Igbm90Lg0KLSAqIEBybXRvbGwgQ1NSICAgICAgICAgIElXREdSU1RGICAgICAgTExfUkNDX0lzQWN0aXZlRmxhZ19JV0RHUlNUDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19Jc0FjdGl2ZUZsYWdfSVdER1JTVCh2b2lkKSB7DQotICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkNTUiwgUkNDX0NTUl9JV0RHUlNURikgPT0gKFJDQ19DU1JfSVdER1JTVEYpKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIGlmIFJDQyBmbGFnIExvdyBQb3dlciByZXNldCBpcyBzZXQgb3Igbm90Lg0KLSAqIEBybXRvbGwgQ1NSICAgICAgICAgIExQV1JSU1RGICAgICAgTExfUkNDX0lzQWN0aXZlRmxhZ19MUFdSUlNUDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19Jc0FjdGl2ZUZsYWdfTFBXUlJTVCh2b2lkKSB7DQotICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkNTUiwgUkNDX0NTUl9MUFdSUlNURikgPT0gKFJDQ19DU1JfTFBXUlJTVEYpKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIGlmIFJDQyBmbGFnIE9wdGlvbiBieXRlIHJlc2V0IGlzIHNldCBvciBub3QuDQotICogQHJtdG9sbCBDU1IgICAgICAgICAgT0JMUlNURiAgICAgICBMTF9SQ0NfSXNBY3RpdmVGbGFnX09CTFJTVA0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSXNBY3RpdmVGbGFnX09CTFJTVCh2b2lkKSB7DQotICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkNTUiwgUkNDX0NTUl9PQkxSU1RGKSA9PSAoUkNDX0NTUl9PQkxSU1RGKSkgPyAxVUwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgUkNDIGZsYWcgUGluIHJlc2V0IGlzIHNldCBvciBub3QuDQotICogQHJtdG9sbCBDU1IgICAgICAgICAgUElOUlNURiAgICAgICBMTF9SQ0NfSXNBY3RpdmVGbGFnX1BJTlJTVA0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSXNBY3RpdmVGbGFnX1BJTlJTVCh2b2lkKSB7DQotICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkNTUiwgUkNDX0NTUl9QSU5SU1RGKSA9PSAoUkNDX0NTUl9QSU5SU1RGKSkgPyAxVUwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgUkNDIGZsYWcgU29mdHdhcmUgcmVzZXQgaXMgc2V0IG9yIG5vdC4NCi0gKiBAcm10b2xsIENTUiAgICAgICAgICBTRlRSU1RGICAgICAgIExMX1JDQ19Jc0FjdGl2ZUZsYWdfU0ZUUlNUDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19Jc0FjdGl2ZUZsYWdfU0ZUUlNUKHZvaWQpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q1NSLCBSQ0NfQ1NSX1NGVFJTVEYpID09IChSQ0NfQ1NSX1NGVFJTVEYpKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiBSQ0MgZmxhZyBXaW5kb3cgV2F0Y2hkb2cgcmVzZXQgaXMgc2V0IG9yIG5vdC4NCi0gKiBAcm10b2xsIENTUiAgICAgICAgICBXV0RHUlNURiAgICAgIExMX1JDQ19Jc0FjdGl2ZUZsYWdfV1dER1JTVA0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSXNBY3RpdmVGbGFnX1dXREdSU1Qodm9pZCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5DU1IsIFJDQ19DU1JfV1dER1JTVEYpID09IChSQ0NfQ1NSX1dXREdSU1RGKSkgPyAxVUwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiBSQ0MgZmxhZyBCT1IgcmVzZXQgaXMgc2V0IG9yIG5vdC4NCi0gKiBAcm10b2xsIENTUiAgICAgICAgICBCT1JSU1RGICAgICAgIExMX1JDQ19Jc0FjdGl2ZUZsYWdfQk9SUlNUDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19Jc0FjdGl2ZUZsYWdfQk9SUlNUKHZvaWQpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q1NSLCBSQ0NfQ1NSX0JPUlJTVEYpID09IChSQ0NfQ1NSX0JPUlJTVEYpKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZXQgUk1WRiBiaXQgdG8gY2xlYXIgdGhlIHJlc2V0IGZsYWdzLg0KLSAqIEBybXRvbGwgQ1NSICAgICAgICAgIFJNVkYgICAgICAgICAgTExfUkNDX0NsZWFyUmVzZXRGbGFncw0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19DbGVhclJlc2V0RmxhZ3Modm9pZCkgew0KLSAgU0VUX0JJVChSQ0MtPkNTUiwgUkNDX0NTUl9STVZGKTsNCi19DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFJDQ19MTF9FRl9JVF9NYW5hZ2VtZW50IElUIE1hbmFnZW1lbnQNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIExTSSByZWFkeSBpbnRlcnJ1cHQNCi0gKiBAcm10b2xsIENJRVIgICAgICAgICBMU0lSRFlJRSAgICAgIExMX1JDQ19FbmFibGVJVF9MU0lSRFkNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfRW5hYmxlSVRfTFNJUkRZKHZvaWQpIHsNCi0gIFNFVF9CSVQoUkNDLT5DSUVSLCBSQ0NfQ0lFUl9MU0lSRFlJRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIExTRSByZWFkeSBpbnRlcnJ1cHQNCi0gKiBAcm10b2xsIENJRVIgICAgICAgICBMU0VSRFlJRSAgICAgIExMX1JDQ19FbmFibGVJVF9MU0VSRFkNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfRW5hYmxlSVRfTFNFUkRZKHZvaWQpIHsNCi0gIFNFVF9CSVQoUkNDLT5DSUVSLCBSQ0NfQ0lFUl9MU0VSRFlJRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIEhTSSByZWFkeSBpbnRlcnJ1cHQNCi0gKiBAcm10b2xsIENJRVIgICAgICAgICBIU0lSRFlJRSAgICAgIExMX1JDQ19FbmFibGVJVF9IU0lSRFkNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfRW5hYmxlSVRfSFNJUkRZKHZvaWQpIHsNCi0gIFNFVF9CSVQoUkNDLT5DSUVSLCBSQ0NfQ0lFUl9IU0lSRFlJRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIEhTRSByZWFkeSBpbnRlcnJ1cHQNCi0gKiBAcm10b2xsIENJRVIgICAgICAgICBIU0VSRFlJRSAgICAgIExMX1JDQ19FbmFibGVJVF9IU0VSRFkNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfRW5hYmxlSVRfSFNFUkRZKHZvaWQpIHsNCi0gIFNFVF9CSVQoUkNDLT5DSUVSLCBSQ0NfQ0lFUl9IU0VSRFlJRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIFBMTCByZWFkeSBpbnRlcnJ1cHQNCi0gKiBAcm10b2xsIENJRVIgICAgICAgICBQTExSRFlJRSAgICAgIExMX1JDQ19FbmFibGVJVF9QTExSRFkNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfRW5hYmxlSVRfUExMUkRZKHZvaWQpIHsNCi0gIFNFVF9CSVQoUkNDLT5DSUVSLCBSQ0NfQ0lFUl9QTExSRFlJRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIEhTSTQ4IHJlYWR5IGludGVycnVwdA0KLSAqIEBybXRvbGwgQ0lFUiAgICAgICAgICBIU0k0OFJEWUlFICAgIExMX1JDQ19FbmFibGVJVF9IU0k0OFJEWQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19FbmFibGVJVF9IU0k0OFJEWSh2b2lkKSB7DQotICBTRVRfQklUKFJDQy0+Q0lFUiwgUkNDX0NJRVJfSFNJNDhSRFlJRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIExTRSBjbG9jayBzZWN1cml0eSBzeXN0ZW0gaW50ZXJydXB0DQotICogQHJtdG9sbCBDSUVSICAgICAgICAgTFNFQ1NTSUUgICAgICBMTF9SQ0NfRW5hYmxlSVRfTFNFQ1NTDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0VuYWJsZUlUX0xTRUNTUyh2b2lkKSB7DQotICBTRVRfQklUKFJDQy0+Q0lFUiwgUkNDX0NJRVJfTFNFQ1NTSUUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgTFNJIHJlYWR5IGludGVycnVwdA0KLSAqIEBybXRvbGwgQ0lFUiAgICAgICAgIExTSVJEWUlFICAgICAgTExfUkNDX0Rpc2FibGVJVF9MU0lSRFkNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfRGlzYWJsZUlUX0xTSVJEWSh2b2lkKSB7DQotICBDTEVBUl9CSVQoUkNDLT5DSUVSLCBSQ0NfQ0lFUl9MU0lSRFlJRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBMU0UgcmVhZHkgaW50ZXJydXB0DQotICogQHJtdG9sbCBDSUVSICAgICAgICAgTFNFUkRZSUUgICAgICBMTF9SQ0NfRGlzYWJsZUlUX0xTRVJEWQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19EaXNhYmxlSVRfTFNFUkRZKHZvaWQpIHsNCi0gIENMRUFSX0JJVChSQ0MtPkNJRVIsIFJDQ19DSUVSX0xTRVJEWUlFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIEhTSSByZWFkeSBpbnRlcnJ1cHQNCi0gKiBAcm10b2xsIENJRVIgICAgICAgICBIU0lSRFlJRSAgICAgIExMX1JDQ19EaXNhYmxlSVRfSFNJUkRZDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0Rpc2FibGVJVF9IU0lSRFkodm9pZCkgew0KLSAgQ0xFQVJfQklUKFJDQy0+Q0lFUiwgUkNDX0NJRVJfSFNJUkRZSUUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgSFNFIHJlYWR5IGludGVycnVwdA0KLSAqIEBybXRvbGwgQ0lFUiAgICAgICAgIEhTRVJEWUlFICAgICAgTExfUkNDX0Rpc2FibGVJVF9IU0VSRFkNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfRGlzYWJsZUlUX0hTRVJEWSh2b2lkKSB7DQotICBDTEVBUl9CSVQoUkNDLT5DSUVSLCBSQ0NfQ0lFUl9IU0VSRFlJRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBQTEwgcmVhZHkgaW50ZXJydXB0DQotICogQHJtdG9sbCBDSUVSICAgICAgICAgUExMUkRZSUUgICAgICBMTF9SQ0NfRGlzYWJsZUlUX1BMTFJEWQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19EaXNhYmxlSVRfUExMUkRZKHZvaWQpIHsNCi0gIENMRUFSX0JJVChSQ0MtPkNJRVIsIFJDQ19DSUVSX1BMTFJEWUlFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIEhTSTQ4IHJlYWR5IGludGVycnVwdA0KLSAqIEBybXRvbGwgQ0lFUiAgICAgICAgICBIU0k0OFJEWUlFICAgIExMX1JDQ19EaXNhYmxlSVRfSFNJNDhSRFkNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfRGlzYWJsZUlUX0hTSTQ4UkRZKHZvaWQpIHsNCi0gIENMRUFSX0JJVChSQ0MtPkNJRVIsIFJDQ19DSUVSX0hTSTQ4UkRZSUUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgTFNFIGNsb2NrIHNlY3VyaXR5IHN5c3RlbSBpbnRlcnJ1cHQNCi0gKiBAcm10b2xsIENJRVIgICAgICAgICBMU0VDU1NJRSAgICAgIExMX1JDQ19EaXNhYmxlSVRfTFNFQ1NTDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0Rpc2FibGVJVF9MU0VDU1Modm9pZCkgew0KLSAgQ0xFQVJfQklUKFJDQy0+Q0lFUiwgUkNDX0NJRVJfTFNFQ1NTSUUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrcyBpZiBMU0kgcmVhZHkgaW50ZXJydXB0IHNvdXJjZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLg0KLSAqIEBybXRvbGwgQ0lFUiAgICAgICAgIExTSVJEWUlFICAgICAgTExfUkNDX0lzRW5hYmxlZElUX0xTSVJEWQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSXNFbmFibGVkSVRfTFNJUkRZKHZvaWQpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q0lFUiwgUkNDX0NJRVJfTFNJUkRZSUUpID09IChSQ0NfQ0lFUl9MU0lSRFlJRSkpDQotICAgICAgICAgICAgICA/IDFVTA0KLSAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrcyBpZiBMU0UgcmVhZHkgaW50ZXJydXB0IHNvdXJjZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLg0KLSAqIEBybXRvbGwgQ0lFUiAgICAgICAgIExTRVJEWUlFICAgICAgTExfUkNDX0lzRW5hYmxlZElUX0xTRVJEWQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSXNFbmFibGVkSVRfTFNFUkRZKHZvaWQpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q0lFUiwgUkNDX0NJRVJfTFNFUkRZSUUpID09IChSQ0NfQ0lFUl9MU0VSRFlJRSkpDQotICAgICAgICAgICAgICA/IDFVTA0KLSAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrcyBpZiBIU0kgcmVhZHkgaW50ZXJydXB0IHNvdXJjZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLg0KLSAqIEBybXRvbGwgQ0lFUiAgICAgICAgIEhTSVJEWUlFICAgICAgTExfUkNDX0lzRW5hYmxlZElUX0hTSVJEWQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSXNFbmFibGVkSVRfSFNJUkRZKHZvaWQpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q0lFUiwgUkNDX0NJRVJfSFNJUkRZSUUpID09IChSQ0NfQ0lFUl9IU0lSRFlJRSkpDQotICAgICAgICAgICAgICA/IDFVTA0KLSAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrcyBpZiBIU0UgcmVhZHkgaW50ZXJydXB0IHNvdXJjZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLg0KLSAqIEBybXRvbGwgQ0lFUiAgICAgICAgIEhTRVJEWUlFICAgICAgTExfUkNDX0lzRW5hYmxlZElUX0hTRVJEWQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSXNFbmFibGVkSVRfSFNFUkRZKHZvaWQpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q0lFUiwgUkNDX0NJRVJfSFNFUkRZSUUpID09IChSQ0NfQ0lFUl9IU0VSRFlJRSkpDQotICAgICAgICAgICAgICA/IDFVTA0KLSAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrcyBpZiBQTEwgcmVhZHkgaW50ZXJydXB0IHNvdXJjZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLg0KLSAqIEBybXRvbGwgQ0lFUiAgICAgICAgIFBMTFJEWUlFICAgICAgTExfUkNDX0lzRW5hYmxlZElUX1BMTFJEWQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSXNFbmFibGVkSVRfUExMUkRZKHZvaWQpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q0lFUiwgUkNDX0NJRVJfUExMUkRZSUUpID09IChSQ0NfQ0lFUl9QTExSRFlJRSkpDQotICAgICAgICAgICAgICA/IDFVTA0KLSAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrcyBpZiBIU0k0OCByZWFkeSBpbnRlcnJ1cHQgc291cmNlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuDQotICogQHJtdG9sbCBDSUVSICAgICAgICAgIEhTSTQ4UkRZSUUgICAgTExfUkNDX0lzRW5hYmxlZElUX0hTSTQ4UkRZDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19Jc0VuYWJsZWRJVF9IU0k0OFJEWSh2b2lkKSB7DQotICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkNJRVIsIFJDQ19DSUVSX0hTSTQ4UkRZSUUpID09IChSQ0NfQ0lFUl9IU0k0OFJEWUlFKSkNCi0gICAgICAgICAgICAgID8gMVVMDQotICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2tzIGlmIExTRUNTUyBpbnRlcnJ1cHQgc291cmNlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuDQotICogQHJtdG9sbCBDSUVSICAgICAgICAgTFNFQ1NTSUUgICAgICBMTF9SQ0NfSXNFbmFibGVkSVRfTFNFQ1NTDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19Jc0VuYWJsZWRJVF9MU0VDU1Modm9pZCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5DSUVSLCBSQ0NfQ0lFUl9MU0VDU1NJRSkgPT0gKFJDQ19DSUVSX0xTRUNTU0lFKSkNCi0gICAgICAgICAgICAgID8gMVVMDQotICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQ0KLS8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VGX0luaXQgRGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24NCi0gKiBAew0KLSAqLw0KLUVycm9yU3RhdHVzIExMX1JDQ19EZUluaXQodm9pZCk7DQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFJDQ19MTF9FRl9HZXRfRnJlcSBHZXQgc3lzdGVtIGFuZCBwZXJpcGhlcmFscyBjbG9ja3MgZnJlcXVlbmN5DQotICogZnVuY3Rpb25zDQotICogQHsNCi0gKi8NCi12b2lkIExMX1JDQ19HZXRTeXN0ZW1DbG9ja3NGcmVxKExMX1JDQ19DbG9ja3NUeXBlRGVmICpSQ0NfQ2xvY2tzKTsNCi11aW50MzJfdCBMTF9SQ0NfR2V0VVNBUlRDbG9ja0ZyZXEodWludDMyX3QgVVNBUlR4U291cmNlKTsNCi0jaWYgZGVmaW5lZChVQVJUNCkNCi11aW50MzJfdCBMTF9SQ0NfR2V0VUFSVENsb2NrRnJlcSh1aW50MzJfdCBVQVJUeFNvdXJjZSk7DQotI2VuZGlmIC8qIFVBUlQ0ICovDQotdWludDMyX3QgTExfUkNDX0dldEkyQ0Nsb2NrRnJlcSh1aW50MzJfdCBJMkN4U291cmNlKTsNCi11aW50MzJfdCBMTF9SQ0NfR2V0TFBVQVJUQ2xvY2tGcmVxKHVpbnQzMl90IExQVUFSVHhTb3VyY2UpOw0KLXVpbnQzMl90IExMX1JDQ19HZXRMUFRJTUNsb2NrRnJlcSh1aW50MzJfdCBMUFRJTXhTb3VyY2UpOw0KLXVpbnQzMl90IExMX1JDQ19HZXRTQUlDbG9ja0ZyZXEodWludDMyX3QgU0FJeFNvdXJjZSk7DQotdWludDMyX3QgTExfUkNDX0dldEkyU0Nsb2NrRnJlcSh1aW50MzJfdCBJMlN4U291cmNlKTsNCi0jaWYgZGVmaW5lZChGRENBTjEpDQotdWludDMyX3QgTExfUkNDX0dldEZEQ0FOQ2xvY2tGcmVxKHVpbnQzMl90IEZEQ0FOeFNvdXJjZSk7DQotI2VuZGlmIC8qIEZEQ0FOMSAqLw0KLXVpbnQzMl90IExMX1JDQ19HZXRSTkdDbG9ja0ZyZXEodWludDMyX3QgUk5HeFNvdXJjZSk7DQotdWludDMyX3QgTExfUkNDX0dldFVTQkNsb2NrRnJlcSh1aW50MzJfdCBVU0J4U291cmNlKTsNCi11aW50MzJfdCBMTF9SQ0NfR2V0QURDQ2xvY2tGcmVxKHVpbnQzMl90IEFEQ3hTb3VyY2UpOw0KLSNpZiBkZWZpbmVkKFFVQURTUEkpDQotdWludDMyX3QgTExfUkNDX0dldFFVQURTUElDbG9ja0ZyZXEodWludDMyX3QgUVVBRFNQSXhTb3VyY2UpOw0KLSNlbmRpZiAvKiBRVUFEU1BJICovDQotLyoqDQotICogQH0NCi0gKi8NCi0jZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotI2lmZGVmIF9fY3BsdXNwbHVzDQotfQ0KLSNlbmRpZg0KLQ0KLSNlbmRpZiAvKiBTVE0zMkc0eHhfTExfUkNDX0ggKi8NCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBmaWxlICAgIHN0bTMyZzR4eF9sbF9yY2MuaAorICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFJDQyBMTCBtb2R1bGUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYXR0ZW50aW9uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0ZXJtcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlCisgKmluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4gSWYgbm8gTElDRU5TRSBmaWxlIGNvbWVzCisgKndpdGggdGhpcyBzb2Z0d2FyZSwgaXQgaXMgcHJvdmlkZWQgQVMtSVMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJHNHh4X0xMX1JDQ19ICisjZGVmaW5lIFNUTTMyRzR4eF9MTF9SQ0NfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnNHh4LmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkc0eHhfTExfRHJpdmVyCisgKiBAeworICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMIFJDQworICogQHsKKyAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX1ByaXZhdGVfVmFyaWFibGVzIFJDQyBQcml2YXRlIFZhcmlhYmxlcworICogQHsKKyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX1ByaXZhdGVfQ29uc3RhbnRzIFJDQyBQcml2YXRlIENvbnN0YW50cworICogQHsKKyAqLworLyogRGVmaW5lcyB1c2VkIHRvIHBlcmZvcm0gb2Zmc2V0cyovCisvKiBPZmZzZXQgdXNlZCB0byBhY2Nlc3MgdG8gUkNDX0NDSVBSIGFuZCBSQ0NfQ0NJUFIyIHJlZ2lzdGVycyAqLworI2RlZmluZSBSQ0NfT0ZGU0VUX0NDSVBSIDBVCisjZGVmaW5lIFJDQ19PRkZTRVRfQ0NJUFIyIDB4MTRVCisKKy8qKgorICogQH0KKyAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBSQ0NfTExfUHJpdmF0ZV9NYWNyb3MgUkNDIFByaXZhdGUgTWFjcm9zCisgKiBAeworICovCisvKioKKyAqIEB9CisgKi8KKyNlbmRpZiAvKlVTRV9GVUxMX0xMX0RSSVZFUiovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FeHBvcnRlZF9UeXBlcyBSQ0MgRXhwb3J0ZWQgVHlwZXMKKyAqIEB7CisgKi8KKworLyoqIEBkZWZncm91cCBMTF9FU19DTE9DS19GUkVRIENsb2NrcyBGcmVxdWVuY3kgU3RydWN0dXJlCisgKiBAeworICovCisKKy8qKgorICogQGJyaWVmICBSQ0MgQ2xvY2tzIEZyZXF1ZW5jeSBTdHJ1Y3R1cmUKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50MzJfdCBTWVNDTEtfRnJlcXVlbmN5OyAvKiE8IFNZU0NMSyBjbG9jayBmcmVxdWVuY3kgKi8KKyAgdWludDMyX3QgSENMS19GcmVxdWVuY3k7ICAgLyohPCBIQ0xLIGNsb2NrIGZyZXF1ZW5jeSAqLworICB1aW50MzJfdCBQQ0xLMV9GcmVxdWVuY3k7ICAvKiE8IFBDTEsxIGNsb2NrIGZyZXF1ZW5jeSAqLworICB1aW50MzJfdCBQQ0xLMl9GcmVxdWVuY3k7ICAvKiE8IFBDTEsyIGNsb2NrIGZyZXF1ZW5jeSAqLworfSBMTF9SQ0NfQ2xvY2tzVHlwZURlZjsKKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBSQ0NfTExfRXhwb3J0ZWRfQ29uc3RhbnRzIFJDQyBFeHBvcnRlZCBDb25zdGFudHMKKyAqIEB7CisgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfT1NDX1ZBTFVFUyBPc2NpbGxhdG9yIFZhbHVlcyBhZGFwdGF0aW9uCisgKiBAYnJpZWYgICAgRGVmaW5lcyB1c2VkIHRvIGFkYXB0IHZhbHVlcyBvZiBkaWZmZXJlbnQgb3NjaWxsYXRvcnMKKyAqIEBub3RlICAgICBUaGVzZSB2YWx1ZXMgY291bGQgYmUgbW9kaWZpZWQgaW4gdGhlIHVzZXIgZW52aXJvbm1lbnQgYWNjb3JkaW5nIHRvCisgKiAgICAgICAgICAgSFcgc2V0LXVwLgorICogQHsKKyAqLworI2lmICFkZWZpbmVkKEhTRV9WQUxVRSkKKyNkZWZpbmUgSFNFX1ZBTFVFIDgwMDAwMDBVIC8qITwgVmFsdWUgb2YgdGhlIEhTRSBvc2NpbGxhdG9yIGluIEh6ICovCisjZW5kaWYgICAgICAgICAgICAgICAgICAgICAvKiBIU0VfVkFMVUUgKi8KKworI2lmICFkZWZpbmVkKEhTSV9WQUxVRSkKKyNkZWZpbmUgSFNJX1ZBTFVFIDE2MDAwMDAwVSAvKiE8IFZhbHVlIG9mIHRoZSBIU0kgb3NjaWxsYXRvciBpbiBIeiAqLworI2VuZGlmICAgICAgICAgICAgICAgICAgICAgIC8qIEhTSV9WQUxVRSAqLworCisjaWYgIWRlZmluZWQoTFNFX1ZBTFVFKQorI2RlZmluZSBMU0VfVkFMVUUgMzI3NjhVIC8qITwgVmFsdWUgb2YgdGhlIExTRSBvc2NpbGxhdG9yIGluIEh6ICovCisjZW5kaWYgICAgICAgICAgICAgICAgICAgLyogTFNFX1ZBTFVFICovCisKKyNpZiAhZGVmaW5lZChMU0lfVkFMVUUpCisjZGVmaW5lIExTSV9WQUxVRSAzMjAwMFUgLyohPCBWYWx1ZSBvZiB0aGUgTFNJIG9zY2lsbGF0b3IgaW4gSHogKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAgICAvKiBMU0lfVkFMVUUgKi8KKworI2lmICFkZWZpbmVkKEhTSTQ4X1ZBTFVFKQorI2RlZmluZSBIU0k0OF9WQUxVRSA0ODAwMDAwMFUgLyohPCBWYWx1ZSBvZiB0aGUgSFNJNDggb3NjaWxsYXRvciBpbiBIeiAqLworI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgLyogSFNJNDhfVkFMVUUgKi8KKworI2lmICFkZWZpbmVkKEVYVEVSTkFMX0NMT0NLX1ZBTFVFKQorI2RlZmluZSBFWFRFUk5BTF9DTE9DS19WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICA0ODAwMFUgLyohPCBWYWx1ZSBvZiB0aGUgSTJTX0NLSU4sIEkyUyBhbmQgU0FJMSBleHRlcm5hbCBjbG9jayBzb3VyY2UgaW4gSHogXAorICAgICAgICAgICovCisjZW5kaWYgICAvKiBFWFRFUk5BTF9DTE9DS19WQUxVRSAqLworCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfQ0xFQVJfRkxBRyBDbGVhciBGbGFncyBEZWZpbmVzCisgKiBAYnJpZWYgICAgRmxhZ3MgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX1JDQ19Xcml0ZVJlZyBmdW5jdGlvbgorICogQHsKKyAqLworI2RlZmluZSBMTF9SQ0NfQ0lDUl9MU0lSRFlDIFJDQ19DSUNSX0xTSVJEWUMgLyohPCBMU0kgUmVhZHkgSW50ZXJydXB0IENsZWFyICovCisjZGVmaW5lIExMX1JDQ19DSUNSX0xTRVJEWUMgUkNDX0NJQ1JfTFNFUkRZQyAvKiE8IExTRSBSZWFkeSBJbnRlcnJ1cHQgQ2xlYXIgKi8KKyNkZWZpbmUgTExfUkNDX0NJQ1JfSFNJUkRZQyBSQ0NfQ0lDUl9IU0lSRFlDIC8qITwgSFNJIFJlYWR5IEludGVycnVwdCBDbGVhciAqLworI2RlZmluZSBMTF9SQ0NfQ0lDUl9IU0VSRFlDIFJDQ19DSUNSX0hTRVJEWUMgLyohPCBIU0UgUmVhZHkgSW50ZXJydXB0IENsZWFyICovCisjZGVmaW5lIExMX1JDQ19DSUNSX1BMTFJEWUMgUkNDX0NJQ1JfUExMUkRZQyAvKiE8IFBMTCBSZWFkeSBJbnRlcnJ1cHQgQ2xlYXIgKi8KKyNkZWZpbmUgTExfUkNDX0NJQ1JfSFNJNDhSRFlDIFwKKyAgUkNDX0NJQ1JfSFNJNDhSRFlDIC8qITwgSFNJNDggUmVhZHkgSW50ZXJydXB0IENsZWFyICovCisjZGVmaW5lIExMX1JDQ19DSUNSX0xTRUNTU0MgXAorICBSQ0NfQ0lDUl9MU0VDU1NDIC8qITwgTFNFIENsb2NrIFNlY3VyaXR5IFN5c3RlbSBJbnRlcnJ1cHQgQ2xlYXIgKi8KKyNkZWZpbmUgTExfUkNDX0NJQ1JfQ1NTQyBcCisgIFJDQ19DSUNSX0NTU0MgLyohPCBDbG9jayBTZWN1cml0eSBTeXN0ZW0gSW50ZXJydXB0IENsZWFyICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfR0VUX0ZMQUcgR2V0IEZsYWdzIERlZmluZXMKKyAqIEBicmllZiAgICBGbGFncyBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfUkNDX1JlYWRSZWcgZnVuY3Rpb24KKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfUkNDX0NJRlJfTFNJUkRZRiBSQ0NfQ0lGUl9MU0lSRFlGIC8qITwgTFNJIFJlYWR5IEludGVycnVwdCBmbGFnICovCisjZGVmaW5lIExMX1JDQ19DSUZSX0xTRVJEWUYgUkNDX0NJRlJfTFNFUkRZRiAvKiE8IExTRSBSZWFkeSBJbnRlcnJ1cHQgZmxhZyAqLworI2RlZmluZSBMTF9SQ0NfQ0lGUl9IU0lSRFlGIFJDQ19DSUZSX0hTSVJEWUYgLyohPCBIU0kgUmVhZHkgSW50ZXJydXB0IGZsYWcgKi8KKyNkZWZpbmUgTExfUkNDX0NJRlJfSFNFUkRZRiBSQ0NfQ0lGUl9IU0VSRFlGIC8qITwgSFNFIFJlYWR5IEludGVycnVwdCBmbGFnICovCisjZGVmaW5lIExMX1JDQ19DSUZSX1BMTFJEWUYgUkNDX0NJRlJfUExMUkRZRiAvKiE8IFBMTCBSZWFkeSBJbnRlcnJ1cHQgZmxhZyAqLworI2RlZmluZSBMTF9SQ0NfQ0lGUl9IU0k0OFJEWUYgXAorICBSQ0NfQ0lGUl9IU0k0OFJEWUYgLyohPCBIU0k0OCBSZWFkeSBJbnRlcnJ1cHQgZmxhZyAqLworI2RlZmluZSBMTF9SQ0NfQ0lGUl9MU0VDU1NGIFwKKyAgUkNDX0NJRlJfTFNFQ1NTRiAvKiE8IExTRSBDbG9jayBTZWN1cml0eSBTeXN0ZW0gSW50ZXJydXB0IGZsYWcgKi8KKyNkZWZpbmUgTExfUkNDX0NJRlJfQ1NTRiBcCisgIFJDQ19DSUZSX0NTU0YgLyohPCBDbG9jayBTZWN1cml0eSBTeXN0ZW0gSW50ZXJydXB0IGZsYWcgKi8KKyNkZWZpbmUgTExfUkNDX0NTUl9MUFdSUlNURiBSQ0NfQ1NSX0xQV1JSU1RGIC8qITwgTG93LVBvd2VyIHJlc2V0IGZsYWcgKi8KKyNkZWZpbmUgTExfUkNDX0NTUl9PQkxSU1RGIFJDQ19DU1JfT0JMUlNURiAgIC8qITwgT0JMIHJlc2V0IGZsYWcgKi8KKyNkZWZpbmUgTExfUkNDX0NTUl9QSU5SU1RGIFJDQ19DU1JfUElOUlNURiAgIC8qITwgUElOIHJlc2V0IGZsYWcgKi8KKyNkZWZpbmUgTExfUkNDX0NTUl9TRlRSU1RGIFJDQ19DU1JfU0ZUUlNURiAgIC8qITwgU29mdHdhcmUgUmVzZXQgZmxhZyAqLworI2RlZmluZSBMTF9SQ0NfQ1NSX0lXREdSU1RGIFwKKyAgUkNDX0NTUl9JV0RHUlNURiAvKiE8IEluZGVwZW5kZW50IFdhdGNoZG9nIHJlc2V0IGZsYWcgKi8KKyNkZWZpbmUgTExfUkNDX0NTUl9XV0RHUlNURiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgUkNDX0NTUl9XV0RHUlNURiAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFdpbmRvdyB3YXRjaGRvZyByZXNldCBmbGFnIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfUkNDX0NTUl9CT1JSU1RGIFJDQ19DU1JfQk9SUlNURiAvKiE8IEJPUiByZXNldCBmbGFnICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfSVQgSVQgRGVmaW5lcworICogQGJyaWVmICAgIElUIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9SQ0NfUmVhZFJlZyBhbmQKKyAqIExMX1JDQ19Xcml0ZVJlZyBmdW5jdGlvbnMKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfUkNDX0NJRVJfTFNJUkRZSUUgXAorICBSQ0NfQ0lFUl9MU0lSRFlJRSAvKiE8IExTSSBSZWFkeSBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIExMX1JDQ19DSUVSX0xTRVJEWUlFIFwKKyAgUkNDX0NJRVJfTFNFUkRZSUUgLyohPCBMU0UgUmVhZHkgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSBMTF9SQ0NfQ0lFUl9IU0lSRFlJRSBcCisgIFJDQ19DSUVSX0hTSVJEWUlFIC8qITwgSFNJIFJlYWR5IEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgTExfUkNDX0NJRVJfSFNFUkRZSUUgXAorICBSQ0NfQ0lFUl9IU0VSRFlJRSAvKiE8IEhTRSBSZWFkeSBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIExMX1JDQ19DSUVSX1BMTFJEWUlFIFwKKyAgUkNDX0NJRVJfUExMUkRZSUUgLyohPCBQTEwgUmVhZHkgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSBMTF9SQ0NfQ0lFUl9IU0k0OFJEWUlFIFwKKyAgUkNDX0NJRVJfSFNJNDhSRFlJRSAvKiE8IEhTSTQ4IFJlYWR5IEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgTExfUkNDX0NJRVJfTFNFQ1NTSUUgICAgICAgICAgICAgICAgICAgICAgXAorICBSQ0NfQ0lFUl9MU0VDU1NJRSAvKiE8IExTRSBDU1MgSW50ZXJydXB0IEVuYWJsZSBcCisgICAgICAgICAgICAgICAgICAgICAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX0xTRURSSVZFICBMU0Ugb3NjaWxsYXRvciBkcml2ZSBjYXBhYmlsaXR5CisgKiBAeworICovCisjZGVmaW5lIExMX1JDQ19MU0VEUklWRV9MT1cgXAorICAweDAwMDAwMDAwVSAvKiE8IFh0YWwgbW9kZSBsb3dlciBkcml2aW5nIGNhcGFiaWxpdHkgKi8KKyNkZWZpbmUgTExfUkNDX0xTRURSSVZFX01FRElVTUxPVyBcCisgIFJDQ19CRENSX0xTRURSVl8wIC8qITwgWHRhbCBtb2RlIG1lZGl1bSBsb3cgZHJpdmluZyBjYXBhYmlsaXR5ICovCisjZGVmaW5lIExMX1JDQ19MU0VEUklWRV9NRURJVU1ISUdIIFwKKyAgUkNDX0JEQ1JfTFNFRFJWXzEgLyohPCBYdGFsIG1vZGUgbWVkaXVtIGhpZ2ggZHJpdmluZyBjYXBhYmlsaXR5ICovCisjZGVmaW5lIExMX1JDQ19MU0VEUklWRV9ISUdIIFwKKyAgUkNDX0JEQ1JfTFNFRFJWIC8qITwgWHRhbCBtb2RlIGhpZ2hlciBkcml2aW5nIGNhcGFiaWxpdHkgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19MU0NPX0NMS1NPVVJDRSAgTFNDTyBTZWxlY3Rpb24KKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfUkNDX0xTQ09fQ0xLU09VUkNFX0xTSSBcCisgIDB4MDAwMDAwMDBVIC8qITwgTFNJIHNlbGVjdGlvbiBmb3IgbG93IHNwZWVkIGNsb2NrICAqLworI2RlZmluZSBMTF9SQ0NfTFNDT19DTEtTT1VSQ0VfTFNFIFwKKyAgUkNDX0JEQ1JfTFNDT1NFTCAvKiE8IExTRSBzZWxlY3Rpb24gZm9yIGxvdyBzcGVlZCBjbG9jayAgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19TWVNfQ0xLU09VUkNFICBTeXN0ZW0gY2xvY2sgc3dpdGNoCisgKiBAeworICovCisjZGVmaW5lIExMX1JDQ19TWVNfQ0xLU09VUkNFX0hTSSBcCisgIFJDQ19DRkdSX1NXX0hTSSAvKiE8IEhTSSBzZWxlY3Rpb24gYXMgc3lzdGVtIGNsb2NrICovCisjZGVmaW5lIExMX1JDQ19TWVNfQ0xLU09VUkNFX0hTRSBcCisgIFJDQ19DRkdSX1NXX0hTRSAvKiE8IEhTRSBzZWxlY3Rpb24gYXMgc3lzdGVtIGNsb2NrICovCisjZGVmaW5lIExMX1JDQ19TWVNfQ0xLU09VUkNFX1BMTCBcCisgIFJDQ19DRkdSX1NXX1BMTCAvKiE8IFBMTCBzZWxlY3Rpb24gYXMgc3lzdGVtIGNsb2NrICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfU1lTX0NMS1NPVVJDRV9TVEFUVVMgIFN5c3RlbSBjbG9jayBzd2l0Y2ggc3RhdHVzCisgKiBAeworICovCisjZGVmaW5lIExMX1JDQ19TWVNfQ0xLU09VUkNFX1NUQVRVU19IU0kgXAorICBSQ0NfQ0ZHUl9TV1NfSFNJIC8qITwgSFNJIHVzZWQgYXMgc3lzdGVtIGNsb2NrICovCisjZGVmaW5lIExMX1JDQ19TWVNfQ0xLU09VUkNFX1NUQVRVU19IU0UgXAorICBSQ0NfQ0ZHUl9TV1NfSFNFIC8qITwgSFNFIHVzZWQgYXMgc3lzdGVtIGNsb2NrICovCisjZGVmaW5lIExMX1JDQ19TWVNfQ0xLU09VUkNFX1NUQVRVU19QTEwgXAorICBSQ0NfQ0ZHUl9TV1NfUExMIC8qITwgUExMIHVzZWQgYXMgc3lzdGVtIGNsb2NrICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfU1lTQ0xLX0RJViAgQUhCIHByZXNjYWxlcgorICogQHsKKyAqLworI2RlZmluZSBMTF9SQ0NfU1lTQ0xLX0RJVl8xIFJDQ19DRkdSX0hQUkVfRElWMSAgIC8qITwgU1lTQ0xLIG5vdCBkaXZpZGVkICovCisjZGVmaW5lIExMX1JDQ19TWVNDTEtfRElWXzIgUkNDX0NGR1JfSFBSRV9ESVYyICAgLyohPCBTWVNDTEsgZGl2aWRlZCBieSAyICovCisjZGVmaW5lIExMX1JDQ19TWVNDTEtfRElWXzQgUkNDX0NGR1JfSFBSRV9ESVY0ICAgLyohPCBTWVNDTEsgZGl2aWRlZCBieSA0ICovCisjZGVmaW5lIExMX1JDQ19TWVNDTEtfRElWXzggUkNDX0NGR1JfSFBSRV9ESVY4ICAgLyohPCBTWVNDTEsgZGl2aWRlZCBieSA4ICovCisjZGVmaW5lIExMX1JDQ19TWVNDTEtfRElWXzE2IFJDQ19DRkdSX0hQUkVfRElWMTYgLyohPCBTWVNDTEsgZGl2aWRlZCBieSAxNiAqLworI2RlZmluZSBMTF9SQ0NfU1lTQ0xLX0RJVl82NCBSQ0NfQ0ZHUl9IUFJFX0RJVjY0IC8qITwgU1lTQ0xLIGRpdmlkZWQgYnkgNjQgKi8KKyNkZWZpbmUgTExfUkNDX1NZU0NMS19ESVZfMTI4ICAgICAgICAgICAgICAgICAgICAgXAorICBSQ0NfQ0ZHUl9IUFJFX0RJVjEyOCAvKiE8IFNZU0NMSyBkaXZpZGVkIGJ5IDEyOCBcCisgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9SQ0NfU1lTQ0xLX0RJVl8yNTYgICAgICAgICAgICAgICAgICAgICBcCisgIFJDQ19DRkdSX0hQUkVfRElWMjU2IC8qITwgU1lTQ0xLIGRpdmlkZWQgYnkgMjU2IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX1JDQ19TWVNDTEtfRElWXzUxMiAgICAgICAgICAgICAgICAgICAgIFwKKyAgUkNDX0NGR1JfSFBSRV9ESVY1MTIgLyohPCBTWVNDTEsgZGl2aWRlZCBieSA1MTIgXAorICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19BUEIxX0RJViAgQVBCIGxvdy1zcGVlZCBwcmVzY2FsZXIgKEFQQjEpCisgKiBAeworICovCisjZGVmaW5lIExMX1JDQ19BUEIxX0RJVl8xIFJDQ19DRkdSX1BQUkUxX0RJVjEgICAvKiE8IEhDTEsgbm90IGRpdmlkZWQgKi8KKyNkZWZpbmUgTExfUkNDX0FQQjFfRElWXzIgUkNDX0NGR1JfUFBSRTFfRElWMiAgIC8qITwgSENMSyBkaXZpZGVkIGJ5IDIgKi8KKyNkZWZpbmUgTExfUkNDX0FQQjFfRElWXzQgUkNDX0NGR1JfUFBSRTFfRElWNCAgIC8qITwgSENMSyBkaXZpZGVkIGJ5IDQgKi8KKyNkZWZpbmUgTExfUkNDX0FQQjFfRElWXzggUkNDX0NGR1JfUFBSRTFfRElWOCAgIC8qITwgSENMSyBkaXZpZGVkIGJ5IDggKi8KKyNkZWZpbmUgTExfUkNDX0FQQjFfRElWXzE2IFJDQ19DRkdSX1BQUkUxX0RJVjE2IC8qITwgSENMSyBkaXZpZGVkIGJ5IDE2ICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfQVBCMl9ESVYgIEFQQiBoaWdoLXNwZWVkIHByZXNjYWxlciAoQVBCMikKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfUkNDX0FQQjJfRElWXzEgUkNDX0NGR1JfUFBSRTJfRElWMSAgIC8qITwgSENMSyBub3QgZGl2aWRlZCAqLworI2RlZmluZSBMTF9SQ0NfQVBCMl9ESVZfMiBSQ0NfQ0ZHUl9QUFJFMl9ESVYyICAgLyohPCBIQ0xLIGRpdmlkZWQgYnkgMiAqLworI2RlZmluZSBMTF9SQ0NfQVBCMl9ESVZfNCBSQ0NfQ0ZHUl9QUFJFMl9ESVY0ICAgLyohPCBIQ0xLIGRpdmlkZWQgYnkgNCAqLworI2RlZmluZSBMTF9SQ0NfQVBCMl9ESVZfOCBSQ0NfQ0ZHUl9QUFJFMl9ESVY4ICAgLyohPCBIQ0xLIGRpdmlkZWQgYnkgOCAqLworI2RlZmluZSBMTF9SQ0NfQVBCMl9ESVZfMTYgUkNDX0NGR1JfUFBSRTJfRElWMTYgLyohPCBIQ0xLIGRpdmlkZWQgYnkgMTYgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19NQ08xU09VUkNFICBNQ08xIFNPVVJDRSBzZWxlY3Rpb24KKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfUkNDX01DTzFTT1VSQ0VfTk9DTE9DSyBcCisgIDB4MDAwMDAwMDBVIC8qITwgTUNPIG91dHB1dCBkaXNhYmxlZCwgbm8gY2xvY2sgb24gTUNPICovCisjZGVmaW5lIExMX1JDQ19NQ08xU09VUkNFX1NZU0NMSyBcCisgIFJDQ19DRkdSX01DT1NFTF8wIC8qITwgU1lTQ0xLIHNlbGVjdGlvbiBhcyBNQ08xIHNvdXJjZSAqLworI2RlZmluZSBMTF9SQ0NfTUNPMVNPVVJDRV9IU0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoUkNDX0NGR1JfTUNPU0VMXzAgfCBSQ0NfQ0ZHUl9NQ09TRUxfMSkgLyohPCBIU0kxNiBzZWxlY3Rpb24gYXMgTUNPMSBzb3VyY2UgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX1JDQ19NQ08xU09VUkNFX0hTRSBcCisgIFJDQ19DRkdSX01DT1NFTF8yIC8qITwgSFNFIHNlbGVjdGlvbiBhcyBNQ08xIHNvdXJjZSAqLworI2RlZmluZSBMTF9SQ0NfTUNPMVNPVVJDRV9QTExDTEsgXAorICAoUkNDX0NGR1JfTUNPU0VMXzAgfCAgICAgICAgICAgXAorICAgUkNDX0NGR1JfTUNPU0VMXzIpIC8qITwgTWFpbiBQTEwgc2VsZWN0aW9uIGFzIE1DTzEgc291cmNlICovCisjZGVmaW5lIExMX1JDQ19NQ08xU09VUkNFX0xTSSBcCisgIChSQ0NfQ0ZHUl9NQ09TRUxfMSB8IFJDQ19DRkdSX01DT1NFTF8yKSAvKiE8IExTSSBzZWxlY3Rpb24gYXMgTUNPMSBzb3VyY2UgKi8KKyNkZWZpbmUgTExfUkNDX01DTzFTT1VSQ0VfTFNFICAgICAgICAgICAgICBcCisgIChSQ0NfQ0ZHUl9NQ09TRUxfMCB8IFJDQ19DRkdSX01DT1NFTF8xIHwgXAorICAgUkNDX0NGR1JfTUNPU0VMXzIpIC8qITwgTFNFIHNlbGVjdGlvbiBhcyBNQ08xIHNvdXJjZSAqLworI2RlZmluZSBMTF9SQ0NfTUNPMVNPVVJDRV9IU0k0OCBcCisgIFJDQ19DRkdSX01DT1NFTF8zIC8qITwgSFNJNDggc2VsZWN0aW9uIGFzIE1DTzEgc291cmNlICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfTUNPMV9ESVYgIE1DTzEgcHJlc2NhbGVyCisgKiBAeworICovCisjZGVmaW5lIExMX1JDQ19NQ08xX0RJVl8xIFJDQ19DRkdSX01DT1BSRV9ESVYxICAgLyohPCBNQ08gbm90IGRpdmlkZWQgKi8KKyNkZWZpbmUgTExfUkNDX01DTzFfRElWXzIgUkNDX0NGR1JfTUNPUFJFX0RJVjIgICAvKiE8IE1DTyBkaXZpZGVkIGJ5IDIgKi8KKyNkZWZpbmUgTExfUkNDX01DTzFfRElWXzQgUkNDX0NGR1JfTUNPUFJFX0RJVjQgICAvKiE8IE1DTyBkaXZpZGVkIGJ5IDQgKi8KKyNkZWZpbmUgTExfUkNDX01DTzFfRElWXzggUkNDX0NGR1JfTUNPUFJFX0RJVjggICAvKiE8IE1DTyBkaXZpZGVkIGJ5IDggKi8KKyNkZWZpbmUgTExfUkNDX01DTzFfRElWXzE2IFJDQ19DRkdSX01DT1BSRV9ESVYxNiAvKiE8IE1DTyBkaXZpZGVkIGJ5IDE2ICovCisvKioKKyAqIEB9CisgKi8KKworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfUEVSSVBIX0ZSRVFVRU5DWSBQZXJpcGhlcmFsIGNsb2NrIGZyZXF1ZW5jeQorICogQHsKKyAqLworI2RlZmluZSBMTF9SQ0NfUEVSSVBIX0ZSRVFVRU5DWV9OTyBcCisgIDB4MDAwMDAwMDBVIC8qITwgTm8gY2xvY2sgZW5hYmxlZCBmb3IgdGhlIHBlcmlwaGVyYWwgICAgICAgICAgICAqLworI2RlZmluZSBMTF9SQ0NfUEVSSVBIX0ZSRVFVRU5DWV9OQSBcCisgIDB4RkZGRkZGRkZVIC8qITwgRnJlcXVlbmN5IGNhbm5vdCBiZSBwcm92aWRlZCBhcyBleHRlcm5hbCBjbG9jayAqLworLyoqCisgKiBAfQorICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX1VTQVJUeF9DTEtTT1VSQ0UgIFBlcmlwaGVyYWwgVVNBUlQgY2xvY2sgc291cmNlCisgKiBzZWxlY3Rpb24KKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfUkNDX1VTQVJUMV9DTEtTT1VSQ0VfUENMSzIgXAorICAoUkNDX0NDSVBSX1VTQVJUMVNFTCA8PCAxNlUpIC8qITwgUENMSzIgY2xvY2sgdXNlZCBhcyBVU0FSVDEgY2xvY2sgc291cmNlICovCisjZGVmaW5lIExMX1JDQ19VU0FSVDFfQ0xLU09VUkNFX1NZU0NMSyBcCisgICgoUkNDX0NDSVBSX1VTQVJUMVNFTCA8PCAxNlUpIHwgICAgICBcCisgICBSQ0NfQ0NJUFJfVVNBUlQxU0VMXzApIC8qITwgU1lTQ0xLIGNsb2NrIHVzZWQgYXMgVVNBUlQxIGNsb2NrIHNvdXJjZSAqLworI2RlZmluZSBMTF9SQ0NfVVNBUlQxX0NMS1NPVVJDRV9IU0kgXAorICAoKFJDQ19DQ0lQUl9VU0FSVDFTRUwgPDwgMTZVKSB8ICAgXAorICAgUkNDX0NDSVBSX1VTQVJUMVNFTF8xKSAvKiE8IEhTSSBjbG9jayB1c2VkIGFzIFVTQVJUMSBjbG9jayBzb3VyY2UgKi8KKyNkZWZpbmUgTExfUkNDX1VTQVJUMV9DTEtTT1VSQ0VfTFNFIFwKKyAgKChSQ0NfQ0NJUFJfVVNBUlQxU0VMIDw8IDE2VSkgfCAgIFwKKyAgIFJDQ19DQ0lQUl9VU0FSVDFTRUwpIC8qITwgTFNFIGNsb2NrIHVzZWQgYXMgVVNBUlQxIGNsb2NrIHNvdXJjZSAqLworI2RlZmluZSBMTF9SQ0NfVVNBUlQyX0NMS1NPVVJDRV9QQ0xLMSBcCisgIChSQ0NfQ0NJUFJfVVNBUlQyU0VMIDw8IDE2VSkgLyohPCBQQ0xLMSBjbG9jayB1c2VkIGFzIFVTQVJUMiBjbG9jayBzb3VyY2UgKi8KKyNkZWZpbmUgTExfUkNDX1VTQVJUMl9DTEtTT1VSQ0VfU1lTQ0xLIFwKKyAgKChSQ0NfQ0NJUFJfVVNBUlQyU0VMIDw8IDE2VSkgfCAgICAgIFwKKyAgIFJDQ19DQ0lQUl9VU0FSVDJTRUxfMCkgLyohPCBTWVNDTEsgY2xvY2sgdXNlZCBhcyBVU0FSVDIgY2xvY2sgc291cmNlICovCisjZGVmaW5lIExMX1JDQ19VU0FSVDJfQ0xLU09VUkNFX0hTSSBcCisgICgoUkNDX0NDSVBSX1VTQVJUMlNFTCA8PCAxNlUpIHwgICBcCisgICBSQ0NfQ0NJUFJfVVNBUlQyU0VMXzEpIC8qITwgSFNJIGNsb2NrIHVzZWQgYXMgVVNBUlQyIGNsb2NrIHNvdXJjZSAqLworI2RlZmluZSBMTF9SQ0NfVVNBUlQyX0NMS1NPVVJDRV9MU0UgXAorICAoKFJDQ19DQ0lQUl9VU0FSVDJTRUwgPDwgMTZVKSB8ICAgXAorICAgUkNDX0NDSVBSX1VTQVJUMlNFTCkgLyohPCBMU0UgY2xvY2sgdXNlZCBhcyBVU0FSVDIgY2xvY2sgc291cmNlICovCisjaWYgZGVmaW5lZChSQ0NfQ0NJUFJfVVNBUlQzU0VMKQorI2RlZmluZSBMTF9SQ0NfVVNBUlQzX0NMS1NPVVJDRV9QQ0xLMSBcCisgIChSQ0NfQ0NJUFJfVVNBUlQzU0VMIDw8IDE2VSkgLyohPCBQQ0xLMSBjbG9jayB1c2VkIGFzIFVTQVJUMyBjbG9jayBzb3VyY2UgKi8KKyNkZWZpbmUgTExfUkNDX1VTQVJUM19DTEtTT1VSQ0VfU1lTQ0xLIFwKKyAgKChSQ0NfQ0NJUFJfVVNBUlQzU0VMIDw8IDE2VSkgfCAgICAgIFwKKyAgIFJDQ19DQ0lQUl9VU0FSVDNTRUxfMCkgLyohPCBTWVNDTEsgY2xvY2sgdXNlZCBhcyBVU0FSVDMgY2xvY2sgc291cmNlICovCisjZGVmaW5lIExMX1JDQ19VU0FSVDNfQ0xLU09VUkNFX0hTSSBcCisgICgoUkNDX0NDSVBSX1VTQVJUM1NFTCA8PCAxNlUpIHwgICBcCisgICBSQ0NfQ0NJUFJfVVNBUlQzU0VMXzEpIC8qITwgSFNJIGNsb2NrIHVzZWQgYXMgVVNBUlQzIGNsb2NrIHNvdXJjZSAqLworI2RlZmluZSBMTF9SQ0NfVVNBUlQzX0NMS1NPVVJDRV9MU0UgXAorICAoKFJDQ19DQ0lQUl9VU0FSVDNTRUwgPDwgMTZVKSB8ICAgXAorICAgUkNDX0NDSVBSX1VTQVJUM1NFTCkgLyohPCBMU0UgY2xvY2sgdXNlZCBhcyBVU0FSVDMgY2xvY2sgc291cmNlICovCisjZW5kaWYgICAgICAgICAgICAgICAgICAvKiBSQ0NfQ0NJUFJfVVNBUlQzU0VMICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfVUFSVHhfQ0xLU09VUkNFICBQZXJpcGhlcmFsIFVBUlQgY2xvY2sgc291cmNlIHNlbGVjdGlvbgorICogQHsKKyAqLworI2lmIGRlZmluZWQoUkNDX0NDSVBSX1VBUlQ0U0VMKQorI2RlZmluZSBMTF9SQ0NfVUFSVDRfQ0xLU09VUkNFX1BDTEsxIFwKKyAgKFJDQ19DQ0lQUl9VQVJUNFNFTCA8PCAxNlUpIC8qITwgUENMSzEgY2xvY2sgdXNlZCBhcyBVQVJUNCBjbG9jayBzb3VyY2UgKi8KKyNkZWZpbmUgTExfUkNDX1VBUlQ0X0NMS1NPVVJDRV9TWVNDTEsgXAorICAoKFJDQ19DQ0lQUl9VQVJUNFNFTCA8PCAxNlUpIHwgICAgICBcCisgICBSQ0NfQ0NJUFJfVUFSVDRTRUxfMCkgLyohPCBTWVNDTEsgY2xvY2sgdXNlZCBhcyBVQVJUNCBjbG9jayBzb3VyY2UgKi8KKyNkZWZpbmUgTExfUkNDX1VBUlQ0X0NMS1NPVVJDRV9IU0kgXAorICAoKFJDQ19DQ0lQUl9VQVJUNFNFTCA8PCAxNlUpIHwgICBcCisgICBSQ0NfQ0NJUFJfVUFSVDRTRUxfMSkgLyohPCBIU0kgY2xvY2sgdXNlZCBhcyBVQVJUNCBjbG9jayBzb3VyY2UgKi8KKyNkZWZpbmUgTExfUkNDX1VBUlQ0X0NMS1NPVVJDRV9MU0UgXAorICAoKFJDQ19DQ0lQUl9VQVJUNFNFTCA8PCAxNlUpIHwgICBcCisgICBSQ0NfQ0NJUFJfVUFSVDRTRUwpIC8qITwgTFNFIGNsb2NrIHVzZWQgYXMgVUFSVDQgY2xvY2sgc291cmNlICovCisjZW5kaWYgICAgICAgICAgICAgICAgIC8qIFJDQ19DQ0lQUl9VQVJUNFNFTCAqLworI2lmIGRlZmluZWQoUkNDX0NDSVBSX1VBUlQ1U0VMKQorI2RlZmluZSBMTF9SQ0NfVUFSVDVfQ0xLU09VUkNFX1BDTEsxIFwKKyAgKFJDQ19DQ0lQUl9VQVJUNVNFTCA8PCAxNlUpIC8qITwgUENMSzEgY2xvY2sgdXNlZCBhcyBVQVJUNSBjbG9jayBzb3VyY2UgKi8KKyNkZWZpbmUgTExfUkNDX1VBUlQ1X0NMS1NPVVJDRV9TWVNDTEsgXAorICAoKFJDQ19DQ0lQUl9VQVJUNVNFTCA8PCAxNlUpIHwgICAgICBcCisgICBSQ0NfQ0NJUFJfVUFSVDVTRUxfMCkgLyohPCBTWVNDTEsgY2xvY2sgdXNlZCBhcyBVQVJUNSBjbG9jayBzb3VyY2UgKi8KKyNkZWZpbmUgTExfUkNDX1VBUlQ1X0NMS1NPVVJDRV9IU0kgXAorICAoKFJDQ19DQ0lQUl9VQVJUNVNFTCA8PCAxNlUpIHwgICBcCisgICBSQ0NfQ0NJUFJfVUFSVDVTRUxfMSkgLyohPCBIU0kgY2xvY2sgdXNlZCBhcyBVQVJUNSBjbG9jayBzb3VyY2UgKi8KKyNkZWZpbmUgTExfUkNDX1VBUlQ1X0NMS1NPVVJDRV9MU0UgXAorICAoKFJDQ19DQ0lQUl9VQVJUNVNFTCA8PCAxNlUpIHwgICBcCisgICBSQ0NfQ0NJUFJfVUFSVDVTRUwpIC8qITwgTFNFIGNsb2NrIHVzZWQgYXMgVUFSVDUgY2xvY2sgc291cmNlICovCisjZW5kaWYgICAgICAgICAgICAgICAgIC8qIFJDQ19DQ0lQUl9VQVJUNVNFTCAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX0xQVUFSVDFfQ0xLU09VUkNFICBQZXJpcGhlcmFsIExQVUFSVCBjbG9jayBzb3VyY2UKKyAqIHNlbGVjdGlvbgorICogQHsKKyAqLworI2RlZmluZSBMTF9SQ0NfTFBVQVJUMV9DTEtTT1VSQ0VfUENMSzEgXAorICAweDAwMDAwMDAwVSAvKiE8IFBDTEsxIGNsb2NrIHVzZWQgYXMgTFBVQVJUMSBjbG9jayBzb3VyY2UgKi8KKyNkZWZpbmUgTExfUkNDX0xQVUFSVDFfQ0xLU09VUkNFX1NZU0NMSyBcCisgIFJDQ19DQ0lQUl9MUFVBUlQxU0VMXzAgLyohPCBTWVNDTEsgY2xvY2sgdXNlZCBhcyBMUFVBUlQxIGNsb2NrIHNvdXJjZSAqLworI2RlZmluZSBMTF9SQ0NfTFBVQVJUMV9DTEtTT1VSQ0VfSFNJIFwKKyAgUkNDX0NDSVBSX0xQVUFSVDFTRUxfMSAvKiE8IEhTSSBjbG9jayB1c2VkIGFzIExQVUFSVDEgY2xvY2sgc291cmNlICovCisjZGVmaW5lIExMX1JDQ19MUFVBUlQxX0NMS1NPVVJDRV9MU0UgXAorICBSQ0NfQ0NJUFJfTFBVQVJUMVNFTCAvKiE8IExTRSBjbG9jayB1c2VkIGFzIExQVUFSVDEgY2xvY2sgc291cmNlICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfSTJDeF9DTEtTT1VSQ0UgIFBlcmlwaGVyYWwgSTJDIGNsb2NrIHNvdXJjZSBzZWxlY3Rpb24KKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfUkNDX0kyQzFfQ0xLU09VUkNFX1BDTEsxICAgICAgXAorICAoKCh1aW50MzJfdClSQ0NfT0ZGU0VUX0NDSVBSIDw8IDI0VSkgfCBcCisgICAoKHVpbnQzMl90KVJDQ19DQ0lQUl9JMkMxU0VMX1BvcyAgICAgIFwKKyAgICA8PCAxNlUpKSAvKiE8IFBDTEsxIGNsb2NrIHVzZWQgYXMgSTJDMSBjbG9jayBzb3VyY2UgKi8KKyNkZWZpbmUgTExfUkNDX0kyQzFfQ0xLU09VUkNFX1NZU0NMSyAgICAgICAgICBcCisgICgoKHVpbnQzMl90KVJDQ19PRkZTRVRfQ0NJUFIgPDwgMjRVKSB8ICAgICAgXAorICAgKCh1aW50MzJfdClSQ0NfQ0NJUFJfSTJDMVNFTF9Qb3MgPDwgMTZVKSB8IFwKKyAgIChSQ0NfQ0NJUFJfSTJDMVNFTF8wID4+ICAgICAgICAgICAgICAgICAgICBcCisgICAgUkNDX0NDSVBSX0kyQzFTRUxfUG9zKSkgLyohPCBTWVNDTEsgY2xvY2sgdXNlZCBhcyBJMkMxIGNsb2NrIHNvdXJjZSAqLworI2RlZmluZSBMTF9SQ0NfSTJDMV9DTEtTT1VSQ0VfSFNJICAgICAgICAgICAgIFwKKyAgKCgodWludDMyX3QpUkNDX09GRlNFVF9DQ0lQUiA8PCAyNFUpIHwgICAgICBcCisgICAoKHVpbnQzMl90KVJDQ19DQ0lQUl9JMkMxU0VMX1BvcyA8PCAxNlUpIHwgXAorICAgKFJDQ19DQ0lQUl9JMkMxU0VMXzEgPj4gICAgICAgICAgICAgICAgICAgIFwKKyAgICBSQ0NfQ0NJUFJfSTJDMVNFTF9Qb3MpKSAvKiE8IEhTSSBjbG9jayB1c2VkIGFzIEkyQzEgY2xvY2sgc291cmNlICovCisjZGVmaW5lIExMX1JDQ19JMkMyX0NMS1NPVVJDRV9QQ0xLMSAgICAgIFwKKyAgKCgodWludDMyX3QpUkNDX09GRlNFVF9DQ0lQUiA8PCAyNFUpIHwgXAorICAgKCh1aW50MzJfdClSQ0NfQ0NJUFJfSTJDMlNFTF9Qb3MgICAgICBcCisgICAgPDwgMTZVKSkgLyohPCBQQ0xLMSBjbG9jayB1c2VkIGFzIEkyQzIgY2xvY2sgc291cmNlICovCisjZGVmaW5lIExMX1JDQ19JMkMyX0NMS1NPVVJDRV9TWVNDTEsgICAgICAgICAgXAorICAoKCh1aW50MzJfdClSQ0NfT0ZGU0VUX0NDSVBSIDw8IDI0VSkgfCAgICAgIFwKKyAgICgodWludDMyX3QpUkNDX0NDSVBSX0kyQzJTRUxfUG9zIDw8IDE2VSkgfCBcCisgICAoUkNDX0NDSVBSX0kyQzJTRUxfMCA+PiAgICAgICAgICAgICAgICAgICAgXAorICAgIFJDQ19DQ0lQUl9JMkMyU0VMX1BvcykpIC8qITwgU1lTQ0xLIGNsb2NrIHVzZWQgYXMgSTJDMiBjbG9jayBzb3VyY2UgKi8KKyNkZWZpbmUgTExfUkNDX0kyQzJfQ0xLU09VUkNFX0hTSSAgICAgICAgICAgICBcCisgICgoKHVpbnQzMl90KVJDQ19PRkZTRVRfQ0NJUFIgPDwgMjRVKSB8ICAgICAgXAorICAgKCh1aW50MzJfdClSQ0NfQ0NJUFJfSTJDMlNFTF9Qb3MgPDwgMTZVKSB8IFwKKyAgIChSQ0NfQ0NJUFJfSTJDMlNFTF8xID4+ICAgICAgICAgICAgICAgICAgICBcCisgICAgUkNDX0NDSVBSX0kyQzJTRUxfUG9zKSkgLyohPCBIU0kgY2xvY2sgdXNlZCBhcyBJMkMyIGNsb2NrIHNvdXJjZSAqLworI2RlZmluZSBMTF9SQ0NfSTJDM19DTEtTT1VSQ0VfUENMSzEgICAgICBcCisgICgoKHVpbnQzMl90KVJDQ19PRkZTRVRfQ0NJUFIgPDwgMjRVKSB8IFwKKyAgICgodWludDMyX3QpUkNDX0NDSVBSX0kyQzNTRUxfUG9zICAgICAgXAorICAgIDw8IDE2VSkpIC8qITwgUENMSzEgY2xvY2sgdXNlZCBhcyBJMkMzIGNsb2NrIHNvdXJjZSAqLworI2RlZmluZSBMTF9SQ0NfSTJDM19DTEtTT1VSQ0VfU1lTQ0xLICAgICAgICAgIFwKKyAgKCgodWludDMyX3QpUkNDX09GRlNFVF9DQ0lQUiA8PCAyNFUpIHwgICAgICBcCisgICAoKHVpbnQzMl90KVJDQ19DQ0lQUl9JMkMzU0VMX1BvcyA8PCAxNlUpIHwgXAorICAgKFJDQ19DQ0lQUl9JMkMzU0VMXzAgPj4gICAgICAgICAgICAgICAgICAgIFwKKyAgICBSQ0NfQ0NJUFJfSTJDM1NFTF9Qb3MpKSAvKiE8IFNZU0NMSyBjbG9jayB1c2VkIGFzIEkyQzMgY2xvY2sgc291cmNlICovCisjZGVmaW5lIExMX1JDQ19JMkMzX0NMS1NPVVJDRV9IU0kgICAgICAgICAgICAgXAorICAoKCh1aW50MzJfdClSQ0NfT0ZGU0VUX0NDSVBSIDw8IDI0VSkgfCAgICAgIFwKKyAgICgodWludDMyX3QpUkNDX0NDSVBSX0kyQzNTRUxfUG9zIDw8IDE2VSkgfCBcCisgICAoUkNDX0NDSVBSX0kyQzNTRUxfMSA+PiAgICAgICAgICAgICAgICAgICAgXAorICAgIFJDQ19DQ0lQUl9JMkMzU0VMX1BvcykpIC8qITwgSFNJIGNsb2NrIHVzZWQgYXMgSTJDMyBjbG9jayBzb3VyY2UgKi8KKyNpZiBkZWZpbmVkKFJDQ19DQ0lQUjJfSTJDNFNFTCkKKyNkZWZpbmUgTExfUkNDX0kyQzRfQ0xLU09VUkNFX1BDTEsxICAgICAgIFwKKyAgKCgodWludDMyX3QpUkNDX09GRlNFVF9DQ0lQUjIgPDwgMjRVKSB8IFwKKyAgICgodWludDMyX3QpUkNDX0NDSVBSMl9JMkM0U0VMX1BvcyAgICAgIFwKKyAgICA8PCAxNlUpKSAvKiE8IFBDTEsxIGNsb2NrIHVzZWQgYXMgSTJDNCBjbG9jayBzb3VyY2UgKi8KKyNkZWZpbmUgTExfUkNDX0kyQzRfQ0xLU09VUkNFX1NZU0NMSyAgICAgICAgICAgXAorICAoKCh1aW50MzJfdClSQ0NfT0ZGU0VUX0NDSVBSMiA8PCAyNFUpIHwgICAgICBcCisgICAoKHVpbnQzMl90KVJDQ19DQ0lQUjJfSTJDNFNFTF9Qb3MgPDwgMTZVKSB8IFwKKyAgIChSQ0NfQ0NJUFIyX0kyQzRTRUxfMCA+PiAgICAgICAgICAgICAgICAgICAgXAorICAgIFJDQ19DQ0lQUjJfSTJDNFNFTF9Qb3MpKSAvKiE8IFNZU0NMSyBjbG9jayB1c2VkIGFzIEkyQzQgY2xvY2sgc291cmNlICovCisjZGVmaW5lIExMX1JDQ19JMkM0X0NMS1NPVVJDRV9IU0kgICAgICAgICAgICAgIFwKKyAgKCgodWludDMyX3QpUkNDX09GRlNFVF9DQ0lQUjIgPDwgMjRVKSB8ICAgICAgXAorICAgKCh1aW50MzJfdClSQ0NfQ0NJUFIyX0kyQzRTRUxfUG9zIDw8IDE2VSkgfCBcCisgICAoUkNDX0NDSVBSMl9JMkM0U0VMXzEgPj4gICAgICAgICAgICAgICAgICAgIFwKKyAgICBSQ0NfQ0NJUFIyX0kyQzRTRUxfUG9zKSkgLyohPCBIU0kgY2xvY2sgdXNlZCBhcyBJMkM0IGNsb2NrIHNvdXJjZSAqLworI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAvKiBSQ0NfQ0NJUFIyX0kyQzRTRUwgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19MUFRJTTFfQ0xLU09VUkNFICBQZXJpcGhlcmFsIExQVElNIGNsb2NrIHNvdXJjZQorICogc2VsZWN0aW9uCisgKiBAeworICovCisjZGVmaW5lIExMX1JDQ19MUFRJTTFfQ0xLU09VUkNFX1BDTEsxIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBQQ0xLMSBjbG9jayB1c2VkIGFzIExQVElNMSBjbG9jayBzb3VyY2UgKi8KKyNkZWZpbmUgTExfUkNDX0xQVElNMV9DTEtTT1VSQ0VfTFNJIFwKKyAgUkNDX0NDSVBSX0xQVElNMVNFTF8wIC8qITwgTFNJIGNsb2NrIHVzZWQgYXMgTFBUSU0xIGNsb2NrIHNvdXJjZSAqLworI2RlZmluZSBMTF9SQ0NfTFBUSU0xX0NMS1NPVVJDRV9IU0kgXAorICBSQ0NfQ0NJUFJfTFBUSU0xU0VMXzEgLyohPCBIU0kgY2xvY2sgdXNlZCBhcyBMUFRJTTEgY2xvY2sgc291cmNlICovCisjZGVmaW5lIExMX1JDQ19MUFRJTTFfQ0xLU09VUkNFX0xTRSBcCisgIFJDQ19DQ0lQUl9MUFRJTTFTRUwgLyohPCBMU0UgY2xvY2sgdXNlZCBhcyBMUFRJTTEgY2xvY2sgc291cmNlICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfU0FJMV9DTEtTT1VSQ0UgIFBlcmlwaGVyYWwgU0FJIGNsb2NrIHNvdXJjZSBzZWxlY3Rpb24KKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfUkNDX1NBSTFfQ0xLU09VUkNFX1NZU0NMSyBcCisgIDB4MDAwMDAwMDBVIC8qITwgU3lzdGVtIGNsb2NrIHVzZWQgYXMgU0FJMSBjbG9jayBzb3VyY2UgKi8KKyNkZWZpbmUgTExfUkNDX1NBSTFfQ0xLU09VUkNFX1BMTCBcCisgIFJDQ19DQ0lQUl9TQUkxU0VMXzAgLyohPCBQTEwgY2xvY2sgdXNlZCBhcyBTQUkxIGNsb2NrIHNvdXJjZSAqLworI2RlZmluZSBMTF9SQ0NfU0FJMV9DTEtTT1VSQ0VfUElOIFwKKyAgUkNDX0NDSVBSX1NBSTFTRUxfMSAvKiE8IEVYVCBjbG9jayB1c2VkIGFzIFNBSTEgY2xvY2sgc291cmNlICovCisjZGVmaW5lIExMX1JDQ19TQUkxX0NMS1NPVVJDRV9IU0kgXAorICAoUkNDX0NDSVBSX1NBSTFTRUxfMCB8ICAgICAgICAgIFwKKyAgIFJDQ19DQ0lQUl9TQUkxU0VMXzEpIC8qITwgSFNJIGNsb2NrIHVzZWQgYXMgU0FJMSBjbG9jayBzb3VyY2UgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19JMlNfQ0xLU09VUkNFICBQZXJpcGhlcmFsIEkyUyBjbG9jayBzb3VyY2Ugc2VsZWN0aW9uCisgKiBAeworICovCisjZGVmaW5lIExMX1JDQ19JMlNfQ0xLU09VUkNFX1NZU0NMSyBcCisgIDB4MDAwMDAwMDBVIC8qITwgU3lzdGVtIGNsb2NrIHVzZWQgYXMgSTJTIGNsb2NrIHNvdXJjZSAqLworI2RlZmluZSBMTF9SQ0NfSTJTX0NMS1NPVVJDRV9QTEwgXAorICBSQ0NfQ0NJUFJfSTJTMjNTRUxfMCAvKiE8IFBMTCBjbG9jayB1c2VkIGFzIEkyUyBjbG9jayBzb3VyY2UgKi8KKyNkZWZpbmUgTExfUkNDX0kyU19DTEtTT1VSQ0VfUElOIFwKKyAgUkNDX0NDSVBSX0kyUzIzU0VMXzEgLyohPCBFWFQgY2xvY2sgdXNlZCBhcyBJMlMgY2xvY2sgc291cmNlICovCisjZGVmaW5lIExMX1JDQ19JMlNfQ0xLU09VUkNFX0hTSSBcCisgIChSQ0NfQ0NJUFJfSTJTMjNTRUxfMCB8ICAgICAgICBcCisgICBSQ0NfQ0NJUFJfSTJTMjNTRUxfMSkgLyohPCBIU0kgY2xvY2sgdXNlZCBhcyBJMlMgY2xvY2sgc291cmNlICovCisvKioKKyAqIEB9CisgKi8KKworI2lmIGRlZmluZWQoRkRDQU4xKQorLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfRkRDQU5fQ0xLU09VUkNFICBQZXJpcGhlcmFsIEZEQ0FOIGNsb2NrIHNvdXJjZSBzZWxlY3Rpb24KKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfUkNDX0ZEQ0FOX0NMS1NPVVJDRV9IU0UgXAorICAweDAwMDAwMDAwVSAvKiE8IEhTRSBjbG9jayB1c2VkIGFzIEZEQ0FOIGNsb2NrIHNvdXJjZSAqLworI2RlZmluZSBMTF9SQ0NfRkRDQU5fQ0xLU09VUkNFX1BMTCBcCisgIFJDQ19DQ0lQUl9GRENBTlNFTF8wIC8qITwgUExMIGNsb2NrIHVzZWQgYXMgRkRDQU4gY2xvY2sgc291cmNlICovCisjZGVmaW5lIExMX1JDQ19GRENBTl9DTEtTT1VSQ0VfUENMSzEgXAorICBSQ0NfQ0NJUFJfRkRDQU5TRUxfMSAvKiE8IFBDTEsxIGNsb2NrIHVzZWQgYXMgRkRDQU4gY2xvY2sgc291cmNlICovCisvKioKKyAqIEB9CisgKi8KKyNlbmRpZiAvKiBGRENBTjEgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfUk5HX0NMS1NPVVJDRSAgUGVyaXBoZXJhbCBSTkcgY2xvY2sgc291cmNlIHNlbGVjdGlvbgorICogQHsKKyAqLworI2RlZmluZSBMTF9SQ0NfUk5HX0NMS1NPVVJDRV9IU0k0OCBcCisgIDB4MDAwMDAwMDBVIC8qITwgSFNJNDggY2xvY2sgdXNlZCBhcyBSTkcgY2xvY2sgc291cmNlICovCisjZGVmaW5lIExMX1JDQ19STkdfQ0xLU09VUkNFX1BMTCBcCisgIFJDQ19DQ0lQUl9DTEs0OFNFTF8xIC8qITwgUExMIGNsb2NrIHVzZWQgYXMgUk5HIGNsb2NrIHNvdXJjZSAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX1VTQl9DTEtTT1VSQ0UgIFBlcmlwaGVyYWwgVVNCIGNsb2NrIHNvdXJjZSBzZWxlY3Rpb24KKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfUkNDX1VTQl9DTEtTT1VSQ0VfSFNJNDggXAorICAweDAwMDAwMDAwVSAvKiE8IEhTSTQ4IGNsb2NrIHVzZWQgYXMgVVNCIGNsb2NrIHNvdXJjZSAqLworI2RlZmluZSBMTF9SQ0NfVVNCX0NMS1NPVVJDRV9QTEwgXAorICBSQ0NfQ0NJUFJfQ0xLNDhTRUxfMSAvKiE8IFBMTCBjbG9jayB1c2VkIGFzIFVTQiBjbG9jayBzb3VyY2UgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19BRENfQ0xLU09VUkNFICBQZXJpcGhlcmFsIEFEQyBjbG9jayBzb3VyY2Ugc2VsZWN0aW9uCisgKiBAeworICovCisjZGVmaW5lIExMX1JDQ19BREMxMl9DTEtTT1VSQ0VfTk9ORSAgICAgIFwKKyAgKCgodWludDMyX3QpUkNDX09GRlNFVF9DQ0lQUiA8PCAyNFUpIHwgXAorICAgKCh1aW50MzJfdClSQ0NfQ0NJUFJfQURDMTJTRUxfUG9zICAgICBcCisgICAgPDwgMTZVKSkgLyohPCBObyBjbG9jayB1c2VkIGFzIEFEQzEyIGNsb2NrIHNvdXJjZSAqLworI2RlZmluZSBMTF9SQ0NfQURDMTJfQ0xLU09VUkNFX1BMTCAgICAgICAgICAgICBcCisgICgoKHVpbnQzMl90KVJDQ19PRkZTRVRfQ0NJUFIgPDwgMjRVKSB8ICAgICAgIFwKKyAgICgodWludDMyX3QpUkNDX0NDSVBSX0FEQzEyU0VMX1BvcyA8PCAxNlUpIHwgXAorICAgKFJDQ19DQ0lQUl9BREMxMlNFTF8wID4+ICAgICAgICAgICAgICAgICAgICBcCisgICAgUkNDX0NDSVBSX0FEQzEyU0VMX1BvcykpIC8qITwgUExMIGNsb2NrIHVzZWQgYXMgQURDMTIgY2xvY2sgc291cmNlICovCisjZGVmaW5lIExMX1JDQ19BREMxMl9DTEtTT1VSQ0VfU1lTQ0xLICAgICAgICAgIFwKKyAgKCgodWludDMyX3QpUkNDX09GRlNFVF9DQ0lQUiA8PCAyNFUpIHwgICAgICAgXAorICAgKCh1aW50MzJfdClSQ0NfQ0NJUFJfQURDMTJTRUxfUG9zIDw8IDE2VSkgfCBcCisgICAoUkNDX0NDSVBSX0FEQzEyU0VMXzEgPj4gICAgICAgICAgICAgICAgICAgIFwKKyAgICBSQ0NfQ0NJUFJfQURDMTJTRUxfUG9zKSkgLyohPCBTWVNDTEsgY2xvY2sgdXNlZCBhcyBBREMxMiBjbG9jayBzb3VyY2UgKi8KKyNpZiBkZWZpbmVkKFJDQ19DQ0lQUl9BREMzNDVTRUwpCisjZGVmaW5lIExMX1JDQ19BREMzNDVfQ0xLU09VUkNFX05PTkUgICAgIFwKKyAgKCgodWludDMyX3QpUkNDX09GRlNFVF9DQ0lQUiA8PCAyNFUpIHwgXAorICAgKCh1aW50MzJfdClSQ0NfQ0NJUFJfQURDMzQ1U0VMX1BvcyAgICBcCisgICAgPDwgMTZVKSkgLyohPCBObyBjbG9jayB1c2VkIGFzIEFEQzM0NSBjbG9jayBzb3VyY2UgKi8KKyNkZWZpbmUgTExfUkNDX0FEQzM0NV9DTEtTT1VSQ0VfUExMICAgICAgICAgICAgIFwKKyAgKCgodWludDMyX3QpUkNDX09GRlNFVF9DQ0lQUiA8PCAyNFUpIHwgICAgICAgIFwKKyAgICgodWludDMyX3QpUkNDX0NDSVBSX0FEQzM0NVNFTF9Qb3MgPDwgMTZVKSB8IFwKKyAgIChSQ0NfQ0NJUFJfQURDMzQ1U0VMXzAgPj4gICAgICAgICAgICAgICAgICAgIFwKKyAgICBSQ0NfQ0NJUFJfQURDMzQ1U0VMX1BvcykpIC8qITwgUExMIGNsb2NrIHVzZWQgYXMgQURDMzQ1IGNsb2NrIHNvdXJjZSAqLworI2RlZmluZSBMTF9SQ0NfQURDMzQ1X0NMS1NPVVJDRV9TWVNDTEsgICAgICAgICAgXAorICAoKCh1aW50MzJfdClSQ0NfT0ZGU0VUX0NDSVBSIDw8IDI0VSkgfCAgICAgICAgXAorICAgKCh1aW50MzJfdClSQ0NfQ0NJUFJfQURDMzQ1U0VMX1BvcyA8PCAxNlUpIHwgXAorICAgKFJDQ19DQ0lQUl9BREMzNDVTRUxfMSA+PiAgICAgICAgICAgICAgICAgICAgXAorICAgIFJDQ19DQ0lQUl9BREMzNDVTRUxfUG9zKSkgLyohPCBTWVNDTEsgY2xvY2sgdXNlZCBhcyBBREMzNDUgY2xvY2sgc291cmNlICovCisjZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAvKiBSQ0NfQ0NJUFJfQURDMzQ1U0VMICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfUVVBRFNQSSAgUGVyaXBoZXJhbCBRVUFEU1BJIGdldCBjbG9jayBzb3VyY2UKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfUkNDX1FVQURTUElfQ0xLU09VUkNFX1NZU0NMSyBcCisgIDB4MDAwMDAwMDBVIC8qITwgU1lTQ0xLIHVzZWQgYXMgUXVhZFNQSSBjbG9jayBzb3VyY2UgKi8KKyNkZWZpbmUgTExfUkNDX1FVQURTUElfQ0xLU09VUkNFX0hTSSBcCisgIFJDQ19DQ0lQUjJfUVNQSVNFTF8wIC8qITwgSFNJIHVzZWQgYXMgUXVhZFNQSSBjbG9jayBzb3VyY2UgKi8KKyNkZWZpbmUgTExfUkNDX1FVQURTUElfQ0xLU09VUkNFX1BMTCBcCisgIFJDQ19DQ0lQUjJfUVNQSVNFTF8xIC8qITwgUExMIHVzZWQgYXMgUXVhZFNQSSBjbG9jayBzb3VyY2UgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19VU0FSVHggUGVyaXBoZXJhbCBVU0FSVCBnZXQgY2xvY2sgc291cmNlCisgKiBAeworICovCisjZGVmaW5lIExMX1JDQ19VU0FSVDFfQ0xLU09VUkNFIFwKKyAgUkNDX0NDSVBSX1VTQVJUMVNFTCAvKiE8IFVTQVJUMSBDbG9jayBzb3VyY2Ugc2VsZWN0aW9uICovCisjZGVmaW5lIExMX1JDQ19VU0FSVDJfQ0xLU09VUkNFIFwKKyAgUkNDX0NDSVBSX1VTQVJUMlNFTCAvKiE8IFVTQVJUMiBDbG9jayBzb3VyY2Ugc2VsZWN0aW9uICovCisjaWYgZGVmaW5lZChSQ0NfQ0NJUFJfVVNBUlQzU0VMKQorI2RlZmluZSBMTF9SQ0NfVVNBUlQzX0NMS1NPVVJDRSBcCisgIFJDQ19DQ0lQUl9VU0FSVDNTRUwgLyohPCBVU0FSVDMgQ2xvY2sgc291cmNlIHNlbGVjdGlvbiAqLworI2VuZGlmICAgICAgICAgICAgICAgIC8qIFJDQ19DQ0lQUl9VU0FSVDNTRUwgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19VQVJUeCBQZXJpcGhlcmFsIFVBUlQgZ2V0IGNsb2NrIHNvdXJjZQorICogQHsKKyAqLworI2lmIGRlZmluZWQoUkNDX0NDSVBSX1VBUlQ0U0VMKQorI2RlZmluZSBMTF9SQ0NfVUFSVDRfQ0xLU09VUkNFIFwKKyAgUkNDX0NDSVBSX1VBUlQ0U0VMIC8qITwgVUFSVDQgQ2xvY2sgc291cmNlIHNlbGVjdGlvbiAqLworI2VuZGlmICAgICAgICAgICAgICAgLyogUkNDX0NDSVBSX1VBUlQ0U0VMICovCisjaWYgZGVmaW5lZChSQ0NfQ0NJUFJfVUFSVDVTRUwpCisjZGVmaW5lIExMX1JDQ19VQVJUNV9DTEtTT1VSQ0UgXAorICBSQ0NfQ0NJUFJfVUFSVDVTRUwgLyohPCBVQVJUNSBDbG9jayBzb3VyY2Ugc2VsZWN0aW9uICovCisjZW5kaWYgICAgICAgICAgICAgICAvKiBSQ0NfQ0NJUFJfVUFSVDVTRUwgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19MUFVBUlQxIFBlcmlwaGVyYWwgTFBVQVJUIGdldCBjbG9jayBzb3VyY2UKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfUkNDX0xQVUFSVDFfQ0xLU09VUkNFIFwKKyAgUkNDX0NDSVBSX0xQVUFSVDFTRUwgLyohPCBMUFVBUlQxIENsb2NrIHNvdXJjZSBzZWxlY3Rpb24gKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19JMkMxIFBlcmlwaGVyYWwgSTJDIGdldCBjbG9jayBzb3VyY2UKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfUkNDX0kyQzFfQ0xLU09VUkNFICAgICAgICAgICAgICAgICBcCisgICgoKHVpbnQzMl90KVJDQ19PRkZTRVRfQ0NJUFIgPDwgMjRVKSB8ICAgICAgXAorICAgKCh1aW50MzJfdClSQ0NfQ0NJUFJfSTJDMVNFTF9Qb3MgPDwgMTZVKSB8IFwKKyAgIChSQ0NfQ0NJUFJfSTJDMVNFTCA+PiAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUkNDX0NDSVBSX0kyQzFTRUxfUG9zKSkgLyohPCBJMkMxIENsb2NrIHNvdXJjZSBzZWxlY3Rpb24gKi8KKyNkZWZpbmUgTExfUkNDX0kyQzJfQ0xLU09VUkNFICAgICAgICAgICAgICAgICBcCisgICgoKHVpbnQzMl90KVJDQ19PRkZTRVRfQ0NJUFIgPDwgMjRVKSB8ICAgICAgXAorICAgKCh1aW50MzJfdClSQ0NfQ0NJUFJfSTJDMlNFTF9Qb3MgPDwgMTZVKSB8IFwKKyAgIChSQ0NfQ0NJUFJfSTJDMlNFTCA+PiAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUkNDX0NDSVBSX0kyQzJTRUxfUG9zKSkgLyohPCBJMkMyIENsb2NrIHNvdXJjZSBzZWxlY3Rpb24gKi8KKyNpZiBkZWZpbmVkKFJDQ19DQ0lQUl9JMkMzU0VMKQorI2RlZmluZSBMTF9SQ0NfSTJDM19DTEtTT1VSQ0UgICAgICAgICAgICAgICAgIFwKKyAgKCgodWludDMyX3QpUkNDX09GRlNFVF9DQ0lQUiA8PCAyNFUpIHwgICAgICBcCisgICAoKHVpbnQzMl90KVJDQ19DQ0lQUl9JMkMzU0VMX1BvcyA8PCAxNlUpIHwgXAorICAgKFJDQ19DQ0lQUl9JMkMzU0VMID4+ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBSQ0NfQ0NJUFJfSTJDM1NFTF9Qb3MpKSAvKiE8IEkyQzMgQ2xvY2sgc291cmNlIHNlbGVjdGlvbiAqLworI2VuZGlmICAgICAgICAgICAgICAgICAgICAgIC8qIFJDQ19DQ0lQUl9JMkMzU0VMICovCisjaWYgZGVmaW5lZChSQ0NfQ0NJUFIyX0kyQzRTRUwpCisjZGVmaW5lIExMX1JDQ19JMkM0X0NMS1NPVVJDRSAgICAgICAgICAgICAgICAgIFwKKyAgKCgodWludDMyX3QpUkNDX09GRlNFVF9DQ0lQUjIgPDwgMjRVKSB8ICAgICAgXAorICAgKCh1aW50MzJfdClSQ0NfQ0NJUFIyX0kyQzRTRUxfUG9zIDw8IDE2VSkgfCBcCisgICAoUkNDX0NDSVBSMl9JMkM0U0VMID4+ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBSQ0NfQ0NJUFIyX0kyQzRTRUxfUG9zKSkgLyohPCBJMkM0IENsb2NrIHNvdXJjZSBzZWxlY3Rpb24gKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgLyogUkNDX0NDSVBSMl9JMkM0U0VMICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfTFBUSU0xIFBlcmlwaGVyYWwgTFBUSU0gZ2V0IGNsb2NrIHNvdXJjZQorICogQHsKKyAqLworI2RlZmluZSBMTF9SQ0NfTFBUSU0xX0NMS1NPVVJDRSBcCisgIFJDQ19DQ0lQUl9MUFRJTTFTRUwgLyohPCBMUFRJTTEgQ2xvY2sgc291cmNlIHNlbGVjdGlvbiAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX1NBSTEgIFBlcmlwaGVyYWwgU0FJIGdldCBjbG9jayBzb3VyY2UKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfUkNDX1NBSTFfQ0xLU09VUkNFIFwKKyAgUkNDX0NDSVBSX1NBSTFTRUwgLyohPCBTQUkxIENsb2NrIHNvdXJjZSBzZWxlY3Rpb24gKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19JMlMgIFBlcmlwaGVyYWwgSTJTIGdldCBjbG9jayBzb3VyY2UKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfUkNDX0kyU19DTEtTT1VSQ0UgXAorICBSQ0NfQ0NJUFJfSTJTMjNTRUwgLyohPCBJMlMgQ2xvY2sgc291cmNlIHNlbGVjdGlvbiAqLworLyoqCisgKiBAfQorICovCisKKyNpZiBkZWZpbmVkKEZEQ0FOMSkKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX0ZEQ0FOICBQZXJpcGhlcmFsIEZEQ0FOIGdldCBjbG9jayBzb3VyY2UKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfUkNDX0ZEQ0FOX0NMS1NPVVJDRSBcCisgIFJDQ19DQ0lQUl9GRENBTlNFTCAvKiE8IEZEQ0FOIENsb2NrIHNvdXJjZSBzZWxlY3Rpb24gKi8KKyNlbmRpZiAgICAgICAgICAgICAgIC8qIEZEQ0FOMSAqLworCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfUk5HICBQZXJpcGhlcmFsIFJORyBnZXQgY2xvY2sgc291cmNlCisgKiBAeworICovCisjZGVmaW5lIExMX1JDQ19STkdfQ0xLU09VUkNFIFwKKyAgUkNDX0NDSVBSX0NMSzQ4U0VMIC8qITwgUk5HIENsb2NrIHNvdXJjZSBzZWxlY3Rpb24gKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19VU0IgIFBlcmlwaGVyYWwgVVNCIGdldCBjbG9jayBzb3VyY2UKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfUkNDX1VTQl9DTEtTT1VSQ0UgXAorICBSQ0NfQ0NJUFJfQ0xLNDhTRUwgLyohPCBVU0IgQ2xvY2sgc291cmNlIHNlbGVjdGlvbiAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX0FEQyAgUGVyaXBoZXJhbCBBREMgZ2V0IGNsb2NrIHNvdXJjZQorICogQHsKKyAqLworI2RlZmluZSBMTF9SQ0NfQURDMTJfQ0xLU09VUkNFICAgICAgICAgICAgICAgICBcCisgICgoKHVpbnQzMl90KVJDQ19PRkZTRVRfQ0NJUFIgPDwgMjRVKSB8ICAgICAgIFwKKyAgICgodWludDMyX3QpUkNDX0NDSVBSX0FEQzEyU0VMX1BvcyA8PCAxNlUpIHwgXAorICAgKFJDQ19DQ0lQUl9BREMxMlNFTCA+PiAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUkNDX0NDSVBSX0FEQzEyU0VMX1BvcykpIC8qITwgQURDMTIgQ2xvY2sgc291cmNlIHNlbGVjdGlvbiAqLworI2lmIGRlZmluZWQoUkNDX0NDSVBSX0FEQzM0NVNFTF9Qb3MpCisjZGVmaW5lIExMX1JDQ19BREMzNDVfQ0xLU09VUkNFICAgICAgICAgICAgICAgICBcCisgICgoKHVpbnQzMl90KVJDQ19PRkZTRVRfQ0NJUFIgPDwgMjRVKSB8ICAgICAgICBcCisgICAoKHVpbnQzMl90KVJDQ19DQ0lQUl9BREMzNDVTRUxfUG9zIDw8IDE2VSkgfCBcCisgICAoUkNDX0NDSVBSX0FEQzM0NVNFTCA+PiAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUkNDX0NDSVBSX0FEQzM0NVNFTF9Qb3MpKSAvKiE8IEFEQzM0NSBDbG9jayBzb3VyY2Ugc2VsZWN0aW9uICovCisjZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAvKiBSQ0NfQ0NJUFJfQURDMzQ1U0VMX1BvcyAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX1FVQURTUEkgIFBlcmlwaGVyYWwgUVVBRFNQSSBnZXQgY2xvY2sgc291cmNlCisgKiBAeworICovCisjZGVmaW5lIExMX1JDQ19RVUFEU1BJX0NMS1NPVVJDRSBcCisgIFJDQ19DQ0lQUjJfUVNQSVNFTCAvKiE8IFF1YWRTUEkgQ2xvY2sgc291cmNlIHNlbGVjdGlvbiAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX1JUQ19DTEtTT1VSQ0UgIFJUQyBjbG9jayBzb3VyY2Ugc2VsZWN0aW9uCisgKiBAeworICovCisjZGVmaW5lIExMX1JDQ19SVENfQ0xLU09VUkNFX05PTkUgICAgICAgICAgICAgXAorICAweDAwMDAwMDAwVSAvKiE8IE5vIGNsb2NrIHVzZWQgYXMgUlRDIGNsb2NrIFwKKyAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX1JDQ19SVENfQ0xLU09VUkNFX0xTRSBcCisgIFJDQ19CRENSX1JUQ1NFTF8wIC8qITwgTFNFIG9zY2lsbGF0b3IgY2xvY2sgdXNlZCBhcyBSVEMgY2xvY2sgKi8KKyNkZWZpbmUgTExfUkNDX1JUQ19DTEtTT1VSQ0VfTFNJIFwKKyAgUkNDX0JEQ1JfUlRDU0VMXzEgLyohPCBMU0kgb3NjaWxsYXRvciBjbG9jayB1c2VkIGFzIFJUQyBjbG9jayAqLworI2RlZmluZSBMTF9SQ0NfUlRDX0NMS1NPVVJDRV9IU0VfRElWMzIgXAorICBSQ0NfQkRDUl9SVENTRUwgLyohPCBIU0Ugb3NjaWxsYXRvciBjbG9jayBkaXZpZGVkIGJ5IDMyIHVzZWQgYXMgUlRDIGNsb2NrICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfUExMU09VUkNFICBQTEwgZW50cnkgY2xvY2sgc291cmNlCisgKiBAeworICovCisjZGVmaW5lIExMX1JDQ19QTExTT1VSQ0VfTk9ORSAweDAwMDAwMDAwVSAvKiE8IE5vIGNsb2NrICovCisjZGVmaW5lIExMX1JDQ19QTExTT1VSQ0VfSFNJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgUkNDX1BMTENGR1JfUExMU1JDX0hTSSAvKiE8IEhTSTE2IGNsb2NrIHNlbGVjdGVkIGFzIFBMTCBlbnRyeSBjbG9jayBzb3VyY2UgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9SQ0NfUExMU09VUkNFX0hTRSBcCisgIFJDQ19QTExDRkdSX1BMTFNSQ19IU0UgLyohPCBIU0UgY2xvY2sgc2VsZWN0ZWQgYXMgUExMIGVudHJ5IGNsb2NrIHNvdXJjZSAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX1BMTE1fRElWICBQTEwgZGl2aXNpb24gZmFjdG9yCisgKiBAeworICovCisjZGVmaW5lIExMX1JDQ19QTExNX0RJVl8xIDB4MDAwMDAwMDBVICAgICAgICAvKiE8IFBMTCBkaXZpc2lvbiBmYWN0b3IgYnkgMSAqLworI2RlZmluZSBMTF9SQ0NfUExMTV9ESVZfMiBSQ0NfUExMQ0ZHUl9QTExNXzAgLyohPCBQTEwgZGl2aXNpb24gZmFjdG9yIGJ5IDIgKi8KKyNkZWZpbmUgTExfUkNDX1BMTE1fRElWXzMgUkNDX1BMTENGR1JfUExMTV8xIC8qITwgUExMIGRpdmlzaW9uIGZhY3RvciBieSAzICovCisjZGVmaW5lIExMX1JDQ19QTExNX0RJVl80IFwKKyAgKFJDQ19QTExDRkdSX1BMTE1fMSB8IFJDQ19QTExDRkdSX1BMTE1fMCkgIC8qITwgUExMIGRpdmlzaW9uIGZhY3RvciBieSA0ICovCisjZGVmaW5lIExMX1JDQ19QTExNX0RJVl81IFJDQ19QTExDRkdSX1BMTE1fMiAvKiE8IFBMTCBkaXZpc2lvbiBmYWN0b3IgYnkgNSAqLworI2RlZmluZSBMTF9SQ0NfUExMTV9ESVZfNiBcCisgIChSQ0NfUExMQ0ZHUl9QTExNXzIgfCBSQ0NfUExMQ0ZHUl9QTExNXzApIC8qITwgUExMIGRpdmlzaW9uIGZhY3RvciBieSA2ICovCisjZGVmaW5lIExMX1JDQ19QTExNX0RJVl83IFwKKyAgKFJDQ19QTExDRkdSX1BMTE1fMiB8IFJDQ19QTExDRkdSX1BMTE1fMSkgLyohPCBQTEwgZGl2aXNpb24gZmFjdG9yIGJ5IDcgKi8KKyNkZWZpbmUgTExfUkNDX1BMTE1fRElWXzggICAgICAgICAgICAgICAgICAgIFwKKyAgKFJDQ19QTExDRkdSX1BMTE1fMiB8IFJDQ19QTExDRkdSX1BMTE1fMSB8IFwKKyAgIFJDQ19QTExDRkdSX1BMTE1fMCkgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUExMIGRpdmlzaW9uIGZhY3RvciBieSA4ICovCisjZGVmaW5lIExMX1JDQ19QTExNX0RJVl85IFJDQ19QTExDRkdSX1BMTE1fMyAvKiE8IFBMTCBkaXZpc2lvbiBmYWN0b3IgYnkgOSAqLworI2RlZmluZSBMTF9SQ0NfUExMTV9ESVZfMTAgXAorICAoUkNDX1BMTENGR1JfUExMTV8zIHwgUkNDX1BMTENGR1JfUExMTV8wKSAvKiE8IFBMTCBkaXZpc2lvbiBmYWN0b3IgYnkgMTAgKi8KKyNkZWZpbmUgTExfUkNDX1BMTE1fRElWXzExIFwKKyAgKFJDQ19QTExDRkdSX1BMTE1fMyB8IFJDQ19QTExDRkdSX1BMTE1fMSkgLyohPCBQTEwgZGl2aXNpb24gZmFjdG9yIGJ5IDExICovCisjZGVmaW5lIExMX1JDQ19QTExNX0RJVl8xMiAgICAgICAgICAgICAgICAgICBcCisgIChSQ0NfUExMQ0ZHUl9QTExNXzMgfCBSQ0NfUExMQ0ZHUl9QTExNXzEgfCBcCisgICBSQ0NfUExMQ0ZHUl9QTExNXzApIC8qITwgUExMIGRpdmlzaW9uIGZhY3RvciBieSAxMiAqLworI2RlZmluZSBMTF9SQ0NfUExMTV9ESVZfMTMgXAorICAoUkNDX1BMTENGR1JfUExMTV8zIHwgUkNDX1BMTENGR1JfUExMTV8yKSAvKiE8IFBMTCBkaXZpc2lvbiBmYWN0b3IgYnkgMTMgKi8KKyNkZWZpbmUgTExfUkNDX1BMTE1fRElWXzE0ICAgICAgICAgICAgICAgICAgIFwKKyAgKFJDQ19QTExDRkdSX1BMTE1fMyB8IFJDQ19QTExDRkdSX1BMTE1fMiB8IFwKKyAgIFJDQ19QTExDRkdSX1BMTE1fMCkgLyohPCBQTEwgZGl2aXNpb24gZmFjdG9yIGJ5IDE0ICovCisjZGVmaW5lIExMX1JDQ19QTExNX0RJVl8xNSAgICAgICAgICAgICAgICAgICBcCisgIChSQ0NfUExMQ0ZHUl9QTExNXzMgfCBSQ0NfUExMQ0ZHUl9QTExNXzIgfCBcCisgICBSQ0NfUExMQ0ZHUl9QTExNXzEpIC8qITwgUExMIGRpdmlzaW9uIGZhY3RvciBieSAxNSAqLworI2RlZmluZSBMTF9SQ0NfUExMTV9ESVZfMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoUkNDX1BMTENGR1JfUExMTV8zIHwgUkNDX1BMTENGR1JfUExMTV8yIHwgUkNDX1BMTENGR1JfUExMTV8xIHwgXAorICAgUkNDX1BMTENGR1JfUExMTV8wKSAvKiE8IFBMTCBkaXZpc2lvbiBmYWN0b3IgYnkgMTYgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19QTExSX0RJViAgUExMIGRpdmlzaW9uIGZhY3RvciAoUExMUikKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfUkNDX1BMTFJfRElWXzIgXAorICAweDAwMDAwMDAwVSAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMQ0xLIChzeXN0ZW0gY2xvY2spIGJ5IDIgKi8KKyNkZWZpbmUgTExfUkNDX1BMTFJfRElWXzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChSQ0NfUExMQ0ZHUl9QTExSXzApIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExDTEsgKHN5c3RlbSBjbG9jaykgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBieSA0ICovCisjZGVmaW5lIExMX1JDQ19QTExSX0RJVl82ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoUkNDX1BMTENGR1JfUExMUl8xKSAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMQ0xLIChzeXN0ZW0gY2xvY2spIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgNiAqLworI2RlZmluZSBMTF9SQ0NfUExMUl9ESVZfOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChSQ0NfUExMQ0ZHUl9QTExSKSAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMQ0xLIChzeXN0ZW0gY2xvY2spIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5IDggKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19QTExQX0RJViAgUExMIGRpdmlzaW9uIGZhY3RvciAoUExMUCkKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfUkNDX1BMTFBfRElWXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoUkNDX1BMTENGR1JfUExMUERJVl8xKSAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUCBvdXRwdXQgYnkgMiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9SQ0NfUExMUF9ESVZfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChSQ0NfUExMQ0ZHUl9QTExQRElWXzEgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIFJDQ19QTExDRkdSX1BMTFBESVZfMCkgLyohPCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFAgb3V0cHV0IGJ5IDMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfUkNDX1BMTFBfRElWXzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoUkNDX1BMTENGR1JfUExMUERJVl8yKSAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUCBvdXRwdXQgYnkgNCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9SQ0NfUExMUF9ESVZfNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChSQ0NfUExMQ0ZHUl9QTExQRElWXzIgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIFJDQ19QTExDRkdSX1BMTFBESVZfMCkgLyohPCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFAgb3V0cHV0IGJ5IDUgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfUkNDX1BMTFBfRElWXzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoUkNDX1BMTENGR1JfUExMUERJVl8yIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBSQ0NfUExMQ0ZHUl9QTExQRElWXzEpIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSA2IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX1JDQ19QTExQX0RJVl83ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKFJDQ19QTExDRkdSX1BMTFBESVZfMiB8IFJDQ19QTExDRkdSX1BMTFBESVZfMSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgUkNDX1BMTENGR1JfUExMUERJVl8wKSAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUCBvdXRwdXQgYnkgNyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9SQ0NfUExMUF9ESVZfOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChSQ0NfUExMQ0ZHUl9QTExQRElWXzMpIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSA4IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX1JDQ19QTExQX0RJVl85ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKFJDQ19QTExDRkdSX1BMTFBESVZfMyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgUkNDX1BMTENGR1JfUExMUERJVl8wKSAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUCBvdXRwdXQgYnkgOSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9SQ0NfUExMUF9ESVZfMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoUkNDX1BMTENGR1JfUExMUERJVl8zIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgUkNDX1BMTENGR1JfUExMUERJVl8xKSAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUCBvdXRwdXQgYnkgMTAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfUkNDX1BMTFBfRElWXzExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKFJDQ19QTExDRkdSX1BMTFBESVZfMyB8IFJDQ19QTExDRkdSX1BMTFBESVZfMSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIFJDQ19QTExDRkdSX1BMTFBESVZfMCkgLyohPCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFAgb3V0cHV0IGJ5IDExIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX1JDQ19QTExQX0RJVl8xMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChSQ0NfUExMQ0ZHUl9QTExQRElWXzMgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBSQ0NfUExMQ0ZHUl9QTExQRElWXzIpIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSAxMiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9SQ0NfUExMUF9ESVZfMTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoUkNDX1BMTENGR1JfUExMUERJVl8zIHwgUkNDX1BMTENGR1JfUExMUERJVl8yIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgUkNDX1BMTENGR1JfUExMUERJVl8wKSAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUCBvdXRwdXQgYnkgMTMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfUkNDX1BMTFBfRElWXzE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKFJDQ19QTExDRkdSX1BMTFBESVZfMyB8IFJDQ19QTExDRkdSX1BMTFBESVZfMiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIFJDQ19QTExDRkdSX1BMTFBESVZfMSkgLyohPCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFAgb3V0cHV0IGJ5IDE0IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX1JDQ19QTExQX0RJVl8xNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChSQ0NfUExMQ0ZHUl9QTExQRElWXzMgfCBSQ0NfUExMQ0ZHUl9QTExQRElWXzIgfCBSQ0NfUExMQ0ZHUl9QTExQRElWXzEgfCAgICBcCisgICBSQ0NfUExMQ0ZHUl9QTExQRElWXzApIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSAxNSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9SQ0NfUExMUF9ESVZfMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoUkNDX1BMTENGR1JfUExMUERJVl80KSAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUCBvdXRwdXQgYnkgMTYgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfUkNDX1BMTFBfRElWXzE3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKFJDQ19QTExDRkdSX1BMTFBESVZfNCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIFJDQ19QTExDRkdSX1BMTFBESVZfMCkgLyohPCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFAgb3V0cHV0IGJ5IDE3IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX1JDQ19QTExQX0RJVl8xOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChSQ0NfUExMQ0ZHUl9QTExQRElWXzQgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBSQ0NfUExMQ0ZHUl9QTExQRElWXzEpIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSAxOCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9SQ0NfUExMUF9ESVZfMTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoUkNDX1BMTENGR1JfUExMUERJVl80IHwgUkNDX1BMTENGR1JfUExMUERJVl8xIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgUkNDX1BMTENGR1JfUExMUERJVl8wKSAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUCBvdXRwdXQgYnkgMTkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfUkNDX1BMTFBfRElWXzIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKFJDQ19QTExDRkdSX1BMTFBESVZfNCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIFJDQ19QTExDRkdSX1BMTFBESVZfMikgLyohPCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFAgb3V0cHV0IGJ5IDIwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX1JDQ19QTExQX0RJVl8yMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChSQ0NfUExMQ0ZHUl9QTExQRElWXzQgfCBSQ0NfUExMQ0ZHUl9QTExQRElWXzIgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBSQ0NfUExMQ0ZHUl9QTExQRElWXzApIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSAyMSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9SQ0NfUExMUF9ESVZfMjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoUkNDX1BMTENGR1JfUExMUERJVl80IHwgUkNDX1BMTENGR1JfUExMUERJVl8yIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgUkNDX1BMTENGR1JfUExMUERJVl8xKSAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUCBvdXRwdXQgYnkgMjIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfUkNDX1BMTFBfRElWXzIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKFJDQ19QTExDRkdSX1BMTFBESVZfNCB8IFJDQ19QTExDRkdSX1BMTFBESVZfMiB8IFJDQ19QTExDRkdSX1BMTFBESVZfMSB8ICAgIFwKKyAgIFJDQ19QTExDRkdSX1BMTFBESVZfMCkgLyohPCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFAgb3V0cHV0IGJ5IDIzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX1JDQ19QTExQX0RJVl8yNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChSQ0NfUExMQ0ZHUl9QTExQRElWXzQgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBSQ0NfUExMQ0ZHUl9QTExQRElWXzMpIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSAyNCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9SQ0NfUExMUF9ESVZfMjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoUkNDX1BMTENGR1JfUExMUERJVl80IHwgUkNDX1BMTENGR1JfUExMUERJVl8zIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgUkNDX1BMTENGR1JfUExMUERJVl8wKSAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUCBvdXRwdXQgYnkgMjUgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfUkNDX1BMTFBfRElWXzI2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKFJDQ19QTExDRkdSX1BMTFBESVZfNCB8IFJDQ19QTExDRkdSX1BMTFBESVZfMyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIFJDQ19QTExDRkdSX1BMTFBESVZfMSkgLyohPCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFAgb3V0cHV0IGJ5IDI2IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX1JDQ19QTExQX0RJVl8yNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChSQ0NfUExMQ0ZHUl9QTExQRElWXzQgfCBSQ0NfUExMQ0ZHUl9QTExQRElWXzMgfCBSQ0NfUExMQ0ZHUl9QTExQRElWXzEgfCAgICBcCisgICBSQ0NfUExMQ0ZHUl9QTExQRElWXzApIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSAyNyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9SQ0NfUExMUF9ESVZfMjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoUkNDX1BMTENGR1JfUExMUERJVl80IHwgUkNDX1BMTENGR1JfUExMUERJVl8zIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgUkNDX1BMTENGR1JfUExMUERJVl8yKSAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUCBvdXRwdXQgYnkgMjggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfUkNDX1BMTFBfRElWXzI5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKFJDQ19QTExDRkdSX1BMTFBESVZfNCB8IFJDQ19QTExDRkdSX1BMTFBESVZfMyB8IFJDQ19QTExDRkdSX1BMTFBESVZfMiB8ICAgIFwKKyAgIFJDQ19QTExDRkdSX1BMTFBESVZfMCkgLyohPCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFAgb3V0cHV0IGJ5IDI5IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX1JDQ19QTExQX0RJVl8zMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChSQ0NfUExMQ0ZHUl9QTExQRElWXzQgfCBSQ0NfUExMQ0ZHUl9QTExQRElWXzMgfCBSQ0NfUExMQ0ZHUl9QTExQRElWXzIgfCAgICBcCisgICBSQ0NfUExMQ0ZHUl9QTExQRElWXzEpIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSAzMCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9SQ0NfUExMUF9ESVZfMzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoUkNDX1BMTENGR1JfUExMUERJVl80IHwgUkNDX1BMTENGR1JfUExMUERJVl8zIHwgUkNDX1BMTENGR1JfUExMUERJVl8yIHwgICAgXAorICAgUkNDX1BMTENGR1JfUExMUERJVl8xIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgUkNDX1BMTENGR1JfUExMUERJVl8wKSAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUCBvdXRwdXQgYnkgMzEgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19QTExRX0RJViAgUExMIGRpdmlzaW9uIGZhY3RvciAoUExMUSkKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfUkNDX1BMTFFfRElWXzIgXAorICAweDAwMDAwMDAwVSAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUSBvdXRwdXQgYnkgMiAqLworI2RlZmluZSBMTF9SQ0NfUExMUV9ESVZfNCBcCisgIChSQ0NfUExMQ0ZHUl9QTExRXzApIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExRIG91dHB1dCBieSA0ICovCisjZGVmaW5lIExMX1JDQ19QTExRX0RJVl82IFwKKyAgKFJDQ19QTExDRkdSX1BMTFFfMSkgLyohPCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFEgb3V0cHV0IGJ5IDYgKi8KKyNkZWZpbmUgTExfUkNDX1BMTFFfRElWXzggXAorICAoUkNDX1BMTENGR1JfUExMUSkgLyohPCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFEgb3V0cHV0IGJ5IDggKi8KKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0V4cG9ydGVkX01hY3JvcyBSQ0MgRXhwb3J0ZWQgTWFjcm9zCisgKiBAeworICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VNX1dSSVRFX1JFQUQgQ29tbW9uIFdyaXRlIGFuZCByZWFkIHJlZ2lzdGVycyBNYWNyb3MKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgIFdyaXRlIGEgdmFsdWUgaW4gUkNDIHJlZ2lzdGVyCisgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgd3JpdHRlbgorICogQHBhcmFtICBfX1ZBTFVFX18gVmFsdWUgdG8gYmUgd3JpdHRlbiBpbiB0aGUgcmVnaXN0ZXIKKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIExMX1JDQ19Xcml0ZVJlZyhfX1JFR19fLCBfX1ZBTFVFX18pIFdSSVRFX1JFRyhSQ0MtPl9fUkVHX18sIF9fVkFMVUVfXykKKworLyoqCisgKiBAYnJpZWYgIFJlYWQgYSB2YWx1ZSBpbiBSQ0MgcmVnaXN0ZXIKKyAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSByZWFkCisgKiBAcmV0dmFsIFJlZ2lzdGVyIHZhbHVlCisgKi8KKyNkZWZpbmUgTExfUkNDX1JlYWRSZWcoX19SRUdfXykgUkVBRF9SRUcoUkNDLT5fX1JFR19fKQorLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VNX0NBTENfRlJFUSBDYWxjdWxhdGUgZnJlcXVlbmNpZXMKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBjYWxjdWxhdGUgdGhlIFBMTENMSyBmcmVxdWVuY3kgb24gc3lzdGVtIGRvbWFpbgorICogQG5vdGUgZXg6IEByZWYgX19MTF9SQ0NfQ0FMQ19QTExDTEtfRlJFUSAoSFNFX1ZBTFVFLEByZWYKKyAqIExMX1JDQ19QTExfR2V0RGl2aWRlciAoKSwKKyAqICAgICAgICAgICAgIEByZWYgTExfUkNDX1BMTF9HZXROICgpLCBAcmVmIExMX1JDQ19QTExfR2V0UiAoKSk7CisgKiBAcGFyYW0gIF9fSU5QVVRGUkVRX18gUExMIElucHV0IGZyZXF1ZW5jeSAoYmFzZWQgb24gSFNFL0hTSSkKKyAqIEBwYXJhbSAgX19QTExNX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMgorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl80CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfNQorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl83CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfOAorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8xMAorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzExCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMTIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8xMworICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzE0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMTUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8xNgorICogQHBhcmFtICBfX1BMTE5fXyBCZXR3ZWVuIE1pbl9EYXRhID0gOCBhbmQgTWF4X0RhdGEgPSAxMjcKKyAqIEBwYXJhbSAgX19QTExSX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExSX0RJVl8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUl9ESVZfNAorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFJfRElWXzYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExSX0RJVl84CisgKiBAcmV0dmFsIFBMTCBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQorICovCisjZGVmaW5lIF9fTExfUkNDX0NBTENfUExMQ0xLX0ZSRVEoX19JTlBVVEZSRVFfXywgX19QTExNX18sIF9fUExMTl9fLCBfX1BMTFJfXykgXAorICAoKF9fSU5QVVRGUkVRX18pICogKF9fUExMTl9fKSAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoKChfX1BMTE1fXykgPj4gUkNDX1BMTENGR1JfUExMTV9Qb3MpICsgMVUpKSAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKCgoX19QTExSX18pID4+IFJDQ19QTExDRkdSX1BMTFJfUG9zKSArIDFVKSAqIDJVKSkKKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gY2FsY3VsYXRlIHRoZSBQTExDTEsgZnJlcXVlbmN5IHVzZWQgb24gQURDIGRvbWFpbgorICAqIEBub3RlIGV4OiBAcmVmIF9fTExfUkNDX0NBTENfUExMQ0xLX0FEQ19GUkVRIChIU0VfVkFMVUUsQHJlZgorICBMTF9SQ0NfUExMX0dldERpdmlkZXIgKCksCisgICogICAgICAgICAgICAgQHJlZiBMTF9SQ0NfUExMX0dldE4gKCksIEByZWYgTExfUkNDX1BMTF9HZXRQICgpKTsKKyAgKiBAcGFyYW0gIF9fSU5QVVRGUkVRX18gUExMIElucHV0IGZyZXF1ZW5jeSAoYmFzZWQgb24gSFNFL0hTSSkKKyAgKiBAcGFyYW0gIF9fUExMTV9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl85CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzE2CisKKyAgKiBAcGFyYW0gIF9fUExMTl9fIEJldHdlZW4gTWluX0RhdGEgPSA4IGFuZCBNYXhfRGF0YSA9IDEyNworICAqIEBwYXJhbSAgX19QTExQX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl85CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzE4CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzE5CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzIwCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzIyCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzIzCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzI0CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzI1CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzI2CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzI3CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzI4CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzI5CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzMwCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzMxCisgICogQHJldHZhbCBQTEwgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAgKi8KKyNkZWZpbmUgX19MTF9SQ0NfQ0FMQ19QTExDTEtfQURDX0ZSRVEoX19JTlBVVEZSRVFfXywgX19QTExNX18sIF9fUExMTl9fLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fUExMUF9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKF9fSU5QVVRGUkVRX18pICogKF9fUExMTl9fKSAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoKChfX1BMTE1fXykgPj4gUkNDX1BMTENGR1JfUExMTV9Qb3MpICsgMVUpKSAvICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKF9fUExMUF9fKSA+PiBSQ0NfUExMQ0ZHUl9QTExQRElWX1BvcykpCisKKy8qKgorICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gY2FsY3VsYXRlIHRoZSBQTExDTEsgZnJlcXVlbmN5IHVzZWQgb24gNDhNIGRvbWFpbgorICogQG5vdGUgZXg6IEByZWYgX19MTF9SQ0NfQ0FMQ19QTExDTEtfNDhNX0ZSRVEgKEhTRV9WQUxVRSxAcmVmCisgKiBMTF9SQ0NfUExMX0dldERpdmlkZXIgKCksCisgKiAgICAgICAgICAgICBAcmVmIExMX1JDQ19QTExfR2V0TiAoKSwgQHJlZiBMTF9SQ0NfUExMX0dldFEgKCkpOworICogQHBhcmFtICBfX0lOUFVURlJFUV9fIFBMTCBJbnB1dCBmcmVxdWVuY3kgKGJhc2VkIG9uIEhTRS9IU0kpCisgKiBAcGFyYW0gIF9fUExMTV9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMQorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8zCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfNAorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl82CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfNworICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl85CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMTAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8xMQorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzEyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMTMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8xNAorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzE1CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMTYKKyAqIEBwYXJhbSAgX19QTExOX18gQmV0d2VlbiBNaW5fRGF0YSA9IDggYW5kIE1heF9EYXRhID0gMTI3CisgKiBAcGFyYW0gIF9fUExMUV9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUV9ESVZfMgorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFFfRElWXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExRX0RJVl82CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUV9ESVZfOAorICogQHJldHZhbCBQTEwgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAqLworI2RlZmluZSBfX0xMX1JDQ19DQUxDX1BMTENMS180OE1fRlJFUShfX0lOUFVURlJFUV9fLCBfX1BMTE1fXywgX19QTExOX18sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19QTExRX18pICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoX19JTlBVVEZSRVFfXykgKiAoX19QTExOX18pIC8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKCgoKF9fUExMTV9fKSA+PiBSQ0NfUExMQ0ZHUl9QTExNX1BvcykgKyAxVSkpIC8gICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoKChfX1BMTFFfXykgPj4gUkNDX1BMTENGR1JfUExMUV9Qb3MpICsgMVUpIDw8IDFVKSkKKworLyoqCisgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBjYWxjdWxhdGUgdGhlIEhDTEsgZnJlcXVlbmN5CisgKiBAcGFyYW0gIF9fU1lTQ0xLRlJFUV9fIFNZU0NMSyBmcmVxdWVuY3kgKGJhc2VkIG9uIEhTRS9IU0kvUExMQ0xLKQorICogQHBhcmFtICBfX0FIQlBSRVNDQUxFUl9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl8xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl80CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl84CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl8xNgorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfNjQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzEyOAorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfMjU2CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl81MTIKKyAqIEByZXR2YWwgSENMSyBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQorICovCisjZGVmaW5lIF9fTExfUkNDX0NBTENfSENMS19GUkVRKF9fU1lTQ0xLRlJFUV9fLCBfX0FIQlBSRVNDQUxFUl9fKSAgICAgICAgICAgICAgXAorICAoKF9fU1lTQ0xLRlJFUV9fKSA+PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIChBSEJQcmVzY1RhYmxlWygoX19BSEJQUkVTQ0FMRVJfXykgJiBSQ0NfQ0ZHUl9IUFJFKSA+PiBSQ0NfQ0ZHUl9IUFJFX1Bvc10gJiBcCisgICAgMHgxRlUpKQorCisvKioKKyAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGNhbGN1bGF0ZSB0aGUgUENMSzEgZnJlcXVlbmN5IChBQlAxKQorICogQHBhcmFtICBfX0hDTEtGUkVRX18gSENMSyBmcmVxdWVuY3kKKyAqIEBwYXJhbSAgX19BUEIxUFJFU0NBTEVSX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BUEIxX0RJVl8xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQVBCMV9ESVZfMgorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjFfRElWXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BUEIxX0RJVl84CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQVBCMV9ESVZfMTYKKyAqIEByZXR2YWwgUENMSzEgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAqLworI2RlZmluZSBfX0xMX1JDQ19DQUxDX1BDTEsxX0ZSRVEoX19IQ0xLRlJFUV9fLCBfX0FQQjFQUkVTQ0FMRVJfXykgXAorICAoKF9fSENMS0ZSRVFfXykgPj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKEFQQlByZXNjVGFibGVbKF9fQVBCMVBSRVNDQUxFUl9fKSA+PiBSQ0NfQ0ZHUl9QUFJFMV9Qb3NdICYgMHgxRlUpKQorCisvKioKKyAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGNhbGN1bGF0ZSB0aGUgUENMSzIgZnJlcXVlbmN5IChBQlAyKQorICogQHBhcmFtICBfX0hDTEtGUkVRX18gSENMSyBmcmVxdWVuY3kKKyAqIEBwYXJhbSAgX19BUEIyUFJFU0NBTEVSX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BUEIyX0RJVl8xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQVBCMl9ESVZfMgorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjJfRElWXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BUEIyX0RJVl84CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQVBCMl9ESVZfMTYKKyAqIEByZXR2YWwgUENMSzIgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAqLworI2RlZmluZSBfX0xMX1JDQ19DQUxDX1BDTEsyX0ZSRVEoX19IQ0xLRlJFUV9fLCBfX0FQQjJQUkVTQ0FMRVJfXykgXAorICAoKF9fSENMS0ZSRVFfXykgPj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKEFQQlByZXNjVGFibGVbKF9fQVBCMlBSRVNDQUxFUl9fKSA+PiBSQ0NfQ0ZHUl9QUFJFMl9Qb3NdICYgMHgxRlUpKQorCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FeHBvcnRlZF9GdW5jdGlvbnMgUkNDIEV4cG9ydGVkIEZ1bmN0aW9ucworICogQHsKKyAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FRl9IU0UgSFNFCisgKiBAeworICovCisKKy8qKgorICogQGJyaWVmICBFbmFibGUgdGhlIENsb2NrIFNlY3VyaXR5IFN5c3RlbS4KKyAqIEBybXRvbGwgQ1IgICAgICAgICAgIENTU09OICAgICAgICAgTExfUkNDX0hTRV9FbmFibGVDU1MKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfSFNFX0VuYWJsZUNTUyh2b2lkKSB7CisgIFNFVF9CSVQoUkNDLT5DUiwgUkNDX0NSX0NTU09OKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBIU0UgZXh0ZXJuYWwgb3NjaWxsYXRvciAoSFNFIEJ5cGFzcykKKyAqIEBybXRvbGwgQ1IgICAgICAgICAgIEhTRUJZUCAgICAgICAgTExfUkNDX0hTRV9FbmFibGVCeXBhc3MKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfSFNFX0VuYWJsZUJ5cGFzcyh2b2lkKSB7CisgIFNFVF9CSVQoUkNDLT5DUiwgUkNDX0NSX0hTRUJZUCk7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIEhTRSBleHRlcm5hbCBvc2NpbGxhdG9yIChIU0UgQnlwYXNzKQorICogQHJtdG9sbCBDUiAgICAgICAgICAgSFNFQllQICAgICAgICBMTF9SQ0NfSFNFX0Rpc2FibGVCeXBhc3MKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfSFNFX0Rpc2FibGVCeXBhc3Modm9pZCkgeworICBDTEVBUl9CSVQoUkNDLT5DUiwgUkNDX0NSX0hTRUJZUCk7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgSFNFIGNyeXN0YWwgb3NjaWxsYXRvciAoSFNFIE9OKQorICogQHJtdG9sbCBDUiAgICAgICAgICAgSFNFT04gICAgICAgICBMTF9SQ0NfSFNFX0VuYWJsZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19IU0VfRW5hYmxlKHZvaWQpIHsgU0VUX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNFT04pOyB9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIEhTRSBjcnlzdGFsIG9zY2lsbGF0b3IgKEhTRSBPTikKKyAqIEBybXRvbGwgQ1IgICAgICAgICAgIEhTRU9OICAgICAgICAgTExfUkNDX0hTRV9EaXNhYmxlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0hTRV9EaXNhYmxlKHZvaWQpIHsKKyAgQ0xFQVJfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0VPTik7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiBIU0Ugb3NjaWxsYXRvciBSZWFkeQorICogQHJtdG9sbCBDUiAgICAgICAgICAgSFNFUkRZICAgICAgICBMTF9SQ0NfSFNFX0lzUmVhZHkKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0hTRV9Jc1JlYWR5KHZvaWQpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5DUiwgUkNDX0NSX0hTRVJEWSkgPT0gKFJDQ19DUl9IU0VSRFkpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FRl9IU0kgSFNJCisgKiBAeworICovCisKKy8qKgorICogQGJyaWVmICBFbmFibGUgSFNJIGV2ZW4gaW4gc3RvcCBtb2RlCisgKiBAbm90ZSBIU0kgb3NjaWxsYXRvciBpcyBmb3JjZWQgT04gZXZlbiBpbiBTdG9wIG1vZGUKKyAqIEBybXRvbGwgQ1IgICAgICAgICAgIEhTSUtFUk9OICAgICAgTExfUkNDX0hTSV9FbmFibGVJblN0b3BNb2RlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0hTSV9FbmFibGVJblN0b3BNb2RlKHZvaWQpIHsKKyAgU0VUX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJS0VST04pOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBIU0kgaW4gc3RvcCBtb2RlCisgKiBAcm10b2xsIENSICAgICAgICAgICBIU0lLRVJPTiAgICAgIExMX1JDQ19IU0lfRGlzYWJsZUluU3RvcE1vZGUKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfSFNJX0Rpc2FibGVJblN0b3BNb2RlKHZvaWQpIHsKKyAgQ0xFQVJfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0lLRVJPTik7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgSFNJIG9zY2lsbGF0b3IKKyAqIEBybXRvbGwgQ1IgICAgICAgICAgIEhTSU9OICAgICAgICAgTExfUkNDX0hTSV9FbmFibGUKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfSFNJX0VuYWJsZSh2b2lkKSB7IFNFVF9CSVQoUkNDLT5DUiwgUkNDX0NSX0hTSU9OKTsgfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBIU0kgb3NjaWxsYXRvcgorICogQHJtdG9sbCBDUiAgICAgICAgICAgSFNJT04gICAgICAgICBMTF9SQ0NfSFNJX0Rpc2FibGUKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfSFNJX0Rpc2FibGUodm9pZCkgeworICBDTEVBUl9CSVQoUkNDLT5DUiwgUkNDX0NSX0hTSU9OKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIEhTSSBjbG9jayBpcyByZWFkeQorICogQHJtdG9sbCBDUiAgICAgICAgICAgSFNJUkRZICAgICAgICBMTF9SQ0NfSFNJX0lzUmVhZHkKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0hTSV9Jc1JlYWR5KHZvaWQpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5DUiwgUkNDX0NSX0hTSVJEWSkgPT0gKFJDQ19DUl9IU0lSRFkpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgSFNJIENhbGlicmF0aW9uIHZhbHVlCisgKiBAbm90ZSBXaGVuIEhTSVRSSU0gaXMgd3JpdHRlbiwgSFNJQ0FMIGlzIHVwZGF0ZWQgd2l0aCB0aGUgc3VtIG9mCisgKiAgICAgICBIU0lUUklNIGFuZCB0aGUgZmFjdG9yeSB0cmltIHZhbHVlCisgKiBAcm10b2xsIElDU0NSICAgICAgICBIU0lDQUwgICAgICAgIExMX1JDQ19IU0lfR2V0Q2FsaWJyYXRpb24KKyAqIEByZXR2YWwgQmV0d2VlbiBNaW5fRGF0YSA9IDB4MDAgYW5kIE1heF9EYXRhID0gMHhGRgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0hTSV9HZXRDYWxpYnJhdGlvbih2b2lkKSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJDQy0+SUNTQ1IsIFJDQ19JQ1NDUl9IU0lDQUwpID4+CisgICAgICAgICAgICAgICAgICAgIFJDQ19JQ1NDUl9IU0lDQUxfUG9zKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFNldCBIU0kgQ2FsaWJyYXRpb24gdHJpbW1pbmcKKyAqIEBub3RlIHVzZXItcHJvZ3JhbW1hYmxlIHRyaW1taW5nIHZhbHVlIHRoYXQgaXMgYWRkZWQgdG8gdGhlIEhTSUNBTAorICogQG5vdGUgRGVmYXVsdCB2YWx1ZSBpcyAxNiwgd2hpY2gsIHdoZW4gYWRkZWQgdG8gdGhlIEhTSUNBTCB2YWx1ZSwKKyAqICAgICAgIHNob3VsZCB0cmltIHRoZSBIU0kgdG8gMTYgTUh6ICsvLSAxICUKKyAqIEBybXRvbGwgSUNTQ1IgICAgICAgIEhTSVRSSU0gICAgICAgTExfUkNDX0hTSV9TZXRDYWxpYlRyaW1taW5nCisgKiBAcGFyYW0gIFZhbHVlIEJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDEyNworICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19IU0lfU2V0Q2FsaWJUcmltbWluZyh1aW50MzJfdCBWYWx1ZSkgeworICBNT0RJRllfUkVHKFJDQy0+SUNTQ1IsIFJDQ19JQ1NDUl9IU0lUUklNLCBWYWx1ZSA8PCBSQ0NfSUNTQ1JfSFNJVFJJTV9Qb3MpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IEhTSSBDYWxpYnJhdGlvbiB0cmltbWluZworICogQHJtdG9sbCBJQ1NDUiAgICAgICAgSFNJVFJJTSAgICAgICBMTF9SQ0NfSFNJX0dldENhbGliVHJpbW1pbmcKKyAqIEByZXR2YWwgQmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMTI3CisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSFNJX0dldENhbGliVHJpbW1pbmcodm9pZCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPklDU0NSLCBSQ0NfSUNTQ1JfSFNJVFJJTSkgPj4KKyAgICAgICAgICAgICAgICAgICAgUkNDX0lDU0NSX0hTSVRSSU1fUG9zKTsKK30KKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VGX0hTSTQ4IEhTSTQ4CisgKiBAeworICovCisKKy8qKgorICogQGJyaWVmICBFbmFibGUgSFNJNDgKKyAqIEBybXRvbGwgQ1JSQ1IgICAgICAgICAgSFNJNDhPTiAgICAgICBMTF9SQ0NfSFNJNDhfRW5hYmxlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0hTSTQ4X0VuYWJsZSh2b2lkKSB7CisgIFNFVF9CSVQoUkNDLT5DUlJDUiwgUkNDX0NSUkNSX0hTSTQ4T04pOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBIU0k0OAorICogQHJtdG9sbCBDUlJDUiAgICAgICAgICBIU0k0OE9OICAgICAgIExMX1JDQ19IU0k0OF9EaXNhYmxlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0hTSTQ4X0Rpc2FibGUodm9pZCkgeworICBDTEVBUl9CSVQoUkNDLT5DUlJDUiwgUkNDX0NSUkNSX0hTSTQ4T04pOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgSFNJNDggb3NjaWxsYXRvciBSZWFkeQorICogQHJtdG9sbCBDUlJDUiAgICAgICAgICBIU0k0OFJEWSAgICAgIExMX1JDQ19IU0k0OF9Jc1JlYWR5CisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19IU0k0OF9Jc1JlYWR5KHZvaWQpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5DUlJDUiwgUkNDX0NSUkNSX0hTSTQ4UkRZKSA9PSAoUkNDX0NSUkNSX0hTSTQ4UkRZKSkKKyAgICAgICAgICAgICAgPyAxVUwKKyAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IEhTSTQ4IENhbGlicmF0aW9uIHZhbHVlCisgKiBAcm10b2xsIENSUkNSICAgICAgICAgIEhTSTQ4Q0FMICAgICAgTExfUkNDX0hTSTQ4X0dldENhbGlicmF0aW9uCisgKiBAcmV0dmFsIEJldHdlZW4gTWluX0RhdGEgPSAweDAwIGFuZCBNYXhfRGF0YSA9IDB4MUZGCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSFNJNDhfR2V0Q2FsaWJyYXRpb24odm9pZCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPkNSUkNSLCBSQ0NfQ1JSQ1JfSFNJNDhDQUwpID4+CisgICAgICAgICAgICAgICAgICAgIFJDQ19DUlJDUl9IU0k0OENBTF9Qb3MpOworfQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUZfTFNFIExTRQorICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiAgRW5hYmxlICBMb3cgU3BlZWQgRXh0ZXJuYWwgKExTRSkgY3J5c3RhbC4KKyAqIEBybXRvbGwgQkRDUiAgICAgICAgIExTRU9OICAgICAgICAgTExfUkNDX0xTRV9FbmFibGUKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfTFNFX0VuYWJsZSh2b2lkKSB7CisgIFNFVF9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9MU0VPTik7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlICBMb3cgU3BlZWQgRXh0ZXJuYWwgKExTRSkgY3J5c3RhbC4KKyAqIEBybXRvbGwgQkRDUiAgICAgICAgIExTRU9OICAgICAgICAgTExfUkNDX0xTRV9EaXNhYmxlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0xTRV9EaXNhYmxlKHZvaWQpIHsKKyAgQ0xFQVJfQklUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfTFNFT04pOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIGV4dGVybmFsIGNsb2NrIHNvdXJjZSAoTFNFIGJ5cGFzcykuCisgKiBAcm10b2xsIEJEQ1IgICAgICAgICBMU0VCWVAgICAgICAgIExMX1JDQ19MU0VfRW5hYmxlQnlwYXNzCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0xTRV9FbmFibGVCeXBhc3Modm9pZCkgeworICBTRVRfQklUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfTFNFQllQKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgZXh0ZXJuYWwgY2xvY2sgc291cmNlIChMU0UgYnlwYXNzKS4KKyAqIEBybXRvbGwgQkRDUiAgICAgICAgIExTRUJZUCAgICAgICAgTExfUkNDX0xTRV9EaXNhYmxlQnlwYXNzCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0xTRV9EaXNhYmxlQnlwYXNzKHZvaWQpIHsKKyAgQ0xFQVJfQklUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfTFNFQllQKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFNldCBMU0Ugb3NjaWxsYXRvciBkcml2ZSBjYXBhYmlsaXR5CisgKiBAbm90ZSBUaGUgb3NjaWxsYXRvciBpcyBpbiBYdGFsIG1vZGUgd2hlbiBpdCBpcyBub3QgaW4gYnlwYXNzIG1vZGUuCisgKiBAcm10b2xsIEJEQ1IgICAgICAgICBMU0VEUlYgICAgICAgIExMX1JDQ19MU0VfU2V0RHJpdmVDYXBhYmlsaXR5CisgKiBAcGFyYW0gIExTRURyaXZlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTFNFRFJJVkVfTE9XCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTFNFRFJJVkVfTUVESVVNTE9XCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTFNFRFJJVkVfTUVESVVNSElHSAorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xTRURSSVZFX0hJR0gKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfTFNFX1NldERyaXZlQ2FwYWJpbGl0eSh1aW50MzJfdCBMU0VEcml2ZSkgeworICBNT0RJRllfUkVHKFJDQy0+QkRDUiwgUkNDX0JEQ1JfTFNFRFJWLCBMU0VEcml2ZSk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgTFNFIG9zY2lsbGF0b3IgZHJpdmUgY2FwYWJpbGl0eQorICogQHJtdG9sbCBCRENSICAgICAgICAgTFNFRFJWICAgICAgICBMTF9SQ0NfTFNFX0dldERyaXZlQ2FwYWJpbGl0eQorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xTRURSSVZFX0xPVworICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xTRURSSVZFX01FRElVTUxPVworICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xTRURSSVZFX01FRElVTUhJR0gKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MU0VEUklWRV9ISUdICisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfTFNFX0dldERyaXZlQ2FwYWJpbGl0eSh2b2lkKSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfTFNFRFJWKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgQ2xvY2sgc2VjdXJpdHkgc3lzdGVtIG9uIExTRS4KKyAqIEBybXRvbGwgQkRDUiAgICAgICAgIExTRUNTU09OICAgICAgTExfUkNDX0xTRV9FbmFibGVDU1MKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfTFNFX0VuYWJsZUNTUyh2b2lkKSB7CisgIFNFVF9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9MU0VDU1NPTik7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIENsb2NrIHNlY3VyaXR5IHN5c3RlbSBvbiBMU0UuCisgKiBAbm90ZSBDbG9jayBzZWN1cml0eSBzeXN0ZW0gY2FuIGJlIGRpc2FibGVkIG9ubHkgYWZ0ZXIgYSBMU0UKKyAqICAgICAgIGZhaWx1cmUgZGV0ZWN0aW9uLiBJbiB0aGF0IGNhc2UgaXQgTVVTVCBiZSBkaXNhYmxlZCBieSBzb2Z0d2FyZS4KKyAqIEBybXRvbGwgQkRDUiAgICAgICAgIExTRUNTU09OICAgICAgTExfUkNDX0xTRV9EaXNhYmxlQ1NTCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0xTRV9EaXNhYmxlQ1NTKHZvaWQpIHsKKyAgQ0xFQVJfQklUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfTFNFQ1NTT04pOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgTFNFIG9zY2lsbGF0b3IgUmVhZHkKKyAqIEBybXRvbGwgQkRDUiAgICAgICAgIExTRVJEWSAgICAgICAgTExfUkNDX0xTRV9Jc1JlYWR5CisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19MU0VfSXNSZWFkeSh2b2lkKSB7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfTFNFUkRZKSA9PSAoUkNDX0JEQ1JfTFNFUkRZKSkgPyAxVUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiBDU1Mgb24gTFNFIGZhaWx1cmUgRGV0ZWN0aW9uCisgKiBAcm10b2xsIEJEQ1IgICAgICAgICBMU0VDU1NEICAgICAgIExMX1JDQ19MU0VfSXNDU1NEZXRlY3RlZAorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfTFNFX0lzQ1NTRGV0ZWN0ZWQodm9pZCkgeworICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkJEQ1IsIFJDQ19CRENSX0xTRUNTU0QpID09IChSQ0NfQkRDUl9MU0VDU1NEKSkgPyAxVUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VGX0xTSSBMU0kKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBMU0kgT3NjaWxsYXRvcgorICogQHJtdG9sbCBDU1IgICAgICAgICAgTFNJT04gICAgICAgICBMTF9SQ0NfTFNJX0VuYWJsZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19MU0lfRW5hYmxlKHZvaWQpIHsKKyAgU0VUX0JJVChSQ0MtPkNTUiwgUkNDX0NTUl9MU0lPTik7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIExTSSBPc2NpbGxhdG9yCisgKiBAcm10b2xsIENTUiAgICAgICAgICBMU0lPTiAgICAgICAgIExMX1JDQ19MU0lfRGlzYWJsZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19MU0lfRGlzYWJsZSh2b2lkKSB7CisgIENMRUFSX0JJVChSQ0MtPkNTUiwgUkNDX0NTUl9MU0lPTik7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiBMU0kgaXMgUmVhZHkKKyAqIEBybXRvbGwgQ1NSICAgICAgICAgIExTSVJEWSAgICAgICAgTExfUkNDX0xTSV9Jc1JlYWR5CisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19MU0lfSXNSZWFkeSh2b2lkKSB7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q1NSLCBSQ0NfQ1NSX0xTSVJEWSkgPT0gKFJDQ19DU1JfTFNJUkRZKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUZfTFNDTyBMU0NPCisgKiBAeworICovCisKKy8qKgorICogQGJyaWVmICBFbmFibGUgTG93IHNwZWVkIGNsb2NrCisgKiBAcm10b2xsIEJEQ1IgICAgICAgICBMU0NPRU4gICAgICAgIExMX1JDQ19MU0NPX0VuYWJsZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19MU0NPX0VuYWJsZSh2b2lkKSB7CisgIFNFVF9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9MU0NPRU4pOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBMb3cgc3BlZWQgY2xvY2sKKyAqIEBybXRvbGwgQkRDUiAgICAgICAgIExTQ09FTiAgICAgICAgTExfUkNDX0xTQ09fRGlzYWJsZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19MU0NPX0Rpc2FibGUodm9pZCkgeworICBDTEVBUl9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9MU0NPRU4pOworfQorCisvKioKKyAqIEBicmllZiAgQ29uZmlndXJlIExvdyBzcGVlZCBjbG9jayBzZWxlY3Rpb24KKyAqIEBybXRvbGwgQkRDUiAgICAgICAgIExTQ09TRUwgICAgICAgTExfUkNDX0xTQ09fU2V0U291cmNlCisgKiBAcGFyYW0gIFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xTQ09fQ0xLU09VUkNFX0xTSQorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xTQ09fQ0xLU09VUkNFX0xTRQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19MU0NPX1NldFNvdXJjZSh1aW50MzJfdCBTb3VyY2UpIHsKKyAgTU9ESUZZX1JFRyhSQ0MtPkJEQ1IsIFJDQ19CRENSX0xTQ09TRUwsIFNvdXJjZSk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgTG93IHNwZWVkIGNsb2NrIHNlbGVjdGlvbgorICogQHJtdG9sbCBCRENSICAgICAgICAgTFNDT1NFTCAgICAgICBMTF9SQ0NfTFNDT19HZXRTb3VyY2UKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MU0NPX0NMS1NPVVJDRV9MU0kKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MU0NPX0NMS1NPVVJDRV9MU0UKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19MU0NPX0dldFNvdXJjZSh2b2lkKSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfTFNDT1NFTCkpOworfQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUZfU3lzdGVtIFN5c3RlbQorICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBzeXN0ZW0gY2xvY2sgc291cmNlCisgKiBAcm10b2xsIENGR1IgICAgICAgICBTVyAgICAgICAgICAgIExMX1JDQ19TZXRTeXNDbGtTb3VyY2UKKyAqIEBwYXJhbSAgU291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTX0NMS1NPVVJDRV9IU0kKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNfQ0xLU09VUkNFX0hTRQorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU19DTEtTT1VSQ0VfUExMCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX1NldFN5c0Nsa1NvdXJjZSh1aW50MzJfdCBTb3VyY2UpIHsKKyAgTU9ESUZZX1JFRyhSQ0MtPkNGR1IsIFJDQ19DRkdSX1NXLCBTb3VyY2UpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IHRoZSBzeXN0ZW0gY2xvY2sgc291cmNlCisgKiBAcm10b2xsIENGR1IgICAgICAgICBTV1MgICAgICAgICAgIExMX1JDQ19HZXRTeXNDbGtTb3VyY2UKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNfQ0xLU09VUkNFX1NUQVRVU19IU0kKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNfQ0xLU09VUkNFX1NUQVRVU19IU0UKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNfQ0xLU09VUkNFX1NUQVRVU19QTEwKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19HZXRTeXNDbGtTb3VyY2Uodm9pZCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPkNGR1IsIFJDQ19DRkdSX1NXUykpOworfQorCisvKioKKyAqIEBicmllZiAgU2V0IEFIQiBwcmVzY2FsZXIKKyAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIEhQUkUgICAgICAgICAgTExfUkNDX1NldEFIQlByZXNjYWxlcgorICogQHBhcmFtICBQcmVzY2FsZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzE2CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl82NAorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfMTI4CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl8yNTYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzUxMgorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19TZXRBSEJQcmVzY2FsZXIodWludDMyX3QgUHJlc2NhbGVyKSB7CisgIE1PRElGWV9SRUcoUkNDLT5DRkdSLCBSQ0NfQ0ZHUl9IUFJFLCBQcmVzY2FsZXIpOworfQorCisvKioKKyAqIEBicmllZiAgU2V0IEFQQjEgcHJlc2NhbGVyCisgKiBAcm10b2xsIENGR1IgICAgICAgICBQUFJFMSAgICAgICAgIExMX1JDQ19TZXRBUEIxUHJlc2NhbGVyCisgKiBAcGFyYW0gIFByZXNjYWxlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjFfRElWXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BUEIxX0RJVl8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQVBCMV9ESVZfNAorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjFfRElWXzgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BUEIxX0RJVl8xNgorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19TZXRBUEIxUHJlc2NhbGVyKHVpbnQzMl90IFByZXNjYWxlcikgeworICBNT0RJRllfUkVHKFJDQy0+Q0ZHUiwgUkNDX0NGR1JfUFBSRTEsIFByZXNjYWxlcik7Cit9CisKKy8qKgorICogQGJyaWVmICBTZXQgQVBCMiBwcmVzY2FsZXIKKyAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIFBQUkUyICAgICAgICAgTExfUkNDX1NldEFQQjJQcmVzY2FsZXIKKyAqIEBwYXJhbSAgUHJlc2NhbGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQVBCMl9ESVZfMQorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjJfRElWXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BUEIyX0RJVl80CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQVBCMl9ESVZfOAorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjJfRElWXzE2CisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX1NldEFQQjJQcmVzY2FsZXIodWludDMyX3QgUHJlc2NhbGVyKSB7CisgIE1PRElGWV9SRUcoUkNDLT5DRkdSLCBSQ0NfQ0ZHUl9QUFJFMiwgUHJlc2NhbGVyKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBBSEIgcHJlc2NhbGVyCisgKiBAcm10b2xsIENGR1IgICAgICAgICBIUFJFICAgICAgICAgIExMX1JDQ19HZXRBSEJQcmVzY2FsZXIKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzE2CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl82NAorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfMTI4CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl8yNTYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzUxMgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0dldEFIQlByZXNjYWxlcih2b2lkKSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJDQy0+Q0ZHUiwgUkNDX0NGR1JfSFBSRSkpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IEFQQjEgcHJlc2NhbGVyCisgKiBAcm10b2xsIENGR1IgICAgICAgICBQUFJFMSAgICAgICAgIExMX1JDQ19HZXRBUEIxUHJlc2NhbGVyCisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQVBCMV9ESVZfMQorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjFfRElWXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BUEIxX0RJVl80CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQVBCMV9ESVZfOAorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjFfRElWXzE2CisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfR2V0QVBCMVByZXNjYWxlcih2b2lkKSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJDQy0+Q0ZHUiwgUkNDX0NGR1JfUFBSRTEpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBBUEIyIHByZXNjYWxlcgorICogQHJtdG9sbCBDRkdSICAgICAgICAgUFBSRTIgICAgICAgICBMTF9SQ0NfR2V0QVBCMlByZXNjYWxlcgorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjJfRElWXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BUEIyX0RJVl8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQVBCMl9ESVZfNAorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjJfRElWXzgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BUEIyX0RJVl8xNgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0dldEFQQjJQcmVzY2FsZXIodm9pZCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPkNGR1IsIFJDQ19DRkdSX1BQUkUyKSk7Cit9CisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FRl9NQ08gTUNPCisgKiBAeworICovCisKKy8qKgorICogQGJyaWVmICBDb25maWd1cmUgTUNPeAorICogQHJtdG9sbCBDRkdSICAgICAgICAgTUNPU0VMICAgICAgICBMTF9SQ0NfQ29uZmlnTUNPXG4KKyAqICAgICAgICAgQ0ZHUiAgICAgICAgIE1DT1BSRSAgICAgICAgTExfUkNDX0NvbmZpZ01DTworICogQHBhcmFtICBNQ094U291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTUNPMVNPVVJDRV9OT0NMT0NLCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTUNPMVNPVVJDRV9TWVNDTEsKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19NQ08xU09VUkNFX0hTSQorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX01DTzFTT1VSQ0VfSFNFCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTUNPMVNPVVJDRV9IU0k0OAorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX01DTzFTT1VSQ0VfUExMQ0xLCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTUNPMVNPVVJDRV9MU0kKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19NQ08xU09VUkNFX0xTRQorICoKKyAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICogQHBhcmFtICBNQ094UHJlc2NhbGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTUNPMV9ESVZfMQorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX01DTzFfRElWXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19NQ08xX0RJVl80CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTUNPMV9ESVZfOAorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX01DTzFfRElWXzE2CisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0NvbmZpZ01DTyh1aW50MzJfdCBNQ094U291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBNQ094UHJlc2NhbGVyKSB7CisgIE1PRElGWV9SRUcoUkNDLT5DRkdSLCBSQ0NfQ0ZHUl9NQ09TRUwgfCBSQ0NfQ0ZHUl9NQ09QUkUsCisgICAgICAgICAgICAgTUNPeFNvdXJjZSB8IE1DT3hQcmVzY2FsZXIpOworfQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUZfUGVyaXBoZXJhbF9DbG9ja19Tb3VyY2UgUGVyaXBoZXJhbCBDbG9jayBTb3VyY2UKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgIENvbmZpZ3VyZSBVU0FSVHggY2xvY2sgc291cmNlCisgKiBAcm10b2xsIENDSVBSICAgICAgICBVU0FSVHhTRUwgICAgIExMX1JDQ19TZXRVU0FSVENsb2NrU291cmNlCisgKiBAcGFyYW0gIFVTQVJUeFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQVJUMV9DTEtTT1VSQ0VfUENMSzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0FSVDFfQ0xLU09VUkNFX1NZU0NMSworICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQVJUMV9DTEtTT1VSQ0VfSFNJCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVVNBUlQxX0NMS1NPVVJDRV9MU0UKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0FSVDJfQ0xLU09VUkNFX1BDTEsxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVVNBUlQyX0NMS1NPVVJDRV9TWVNDTEsKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0FSVDJfQ0xLU09VUkNFX0hTSQorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQVJUMl9DTEtTT1VSQ0VfTFNFCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVVNBUlQzX0NMS1NPVVJDRV9QQ0xLMQorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQVJUM19DTEtTT1VSQ0VfU1lTQ0xLCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVVNBUlQzX0NMS1NPVVJDRV9IU0kKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0FSVDNfQ0xLU09VUkNFX0xTRQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19TZXRVU0FSVENsb2NrU291cmNlKHVpbnQzMl90IFVTQVJUeFNvdXJjZSkgeworICBNT0RJRllfUkVHKFJDQy0+Q0NJUFIsIChVU0FSVHhTb3VyY2UgPj4gMTZVKSwgKFVTQVJUeFNvdXJjZSAmIDB4MDAwMEZGRkZVKSk7Cit9CisKKyNpZiBkZWZpbmVkKFVBUlQ0KQorLyoqCisgKiBAYnJpZWYgIENvbmZpZ3VyZSBVQVJUeCBjbG9jayBzb3VyY2UKKyAqIEBybXRvbGwgQ0NJUFIgICAgICAgIFVBUlR4U0VMICAgICAgTExfUkNDX1NldFVBUlRDbG9ja1NvdXJjZQorICogQHBhcmFtICBVQVJUeFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VBUlQ0X0NMS1NPVVJDRV9QQ0xLMSAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VQVJUNF9DTEtTT1VSQ0VfU1lTQ0xLICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VBUlQ0X0NMS1NPVVJDRV9IU0kgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVUFSVDRfQ0xLU09VUkNFX0xTRSAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VQVJUNV9DTEtTT1VSQ0VfUENMSzEgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVUFSVDVfQ0xLU09VUkNFX1NZU0NMSyAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VQVJUNV9DTEtTT1VSQ0VfSFNJICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VBUlQ1X0NMS1NPVVJDRV9MU0UgKCopCisgKgorICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX1NldFVBUlRDbG9ja1NvdXJjZSh1aW50MzJfdCBVQVJUeFNvdXJjZSkgeworICBNT0RJRllfUkVHKFJDQy0+Q0NJUFIsIChVQVJUeFNvdXJjZSA+PiAxNlUpLCAoVUFSVHhTb3VyY2UgJiAweDAwMDBGRkZGVSkpOworfQorI2VuZGlmIC8qIFVBUlQ0ICovCisKKy8qKgorICogQGJyaWVmICBDb25maWd1cmUgTFBVQVJUMXggY2xvY2sgc291cmNlCisgKiBAcm10b2xsIENDSVBSICAgICAgICBMUFVBUlQxU0VMICAgIExMX1JDQ19TZXRMUFVBUlRDbG9ja1NvdXJjZQorICogQHBhcmFtICBMUFVBUlR4U291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTFBVQVJUMV9DTEtTT1VSQ0VfUENMSzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MUFVBUlQxX0NMS1NPVVJDRV9TWVNDTEsKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MUFVBUlQxX0NMS1NPVVJDRV9IU0kKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MUFVBUlQxX0NMS1NPVVJDRV9MU0UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfU2V0TFBVQVJUQ2xvY2tTb3VyY2UodWludDMyX3QgTFBVQVJUeFNvdXJjZSkgeworICBNT0RJRllfUkVHKFJDQy0+Q0NJUFIsIFJDQ19DQ0lQUl9MUFVBUlQxU0VMLCBMUFVBUlR4U291cmNlKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENvbmZpZ3VyZSBJMkN4IGNsb2NrIHNvdXJjZQorICogQHJtdG9sbCBDQ0lQUiAgICAgICAgSTJDeFNFTCAgICAgICBMTF9SQ0NfU2V0STJDQ2xvY2tTb3VyY2UKKyAqIEBwYXJhbSAgSTJDeFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0kyQzFfQ0xLU09VUkNFX1BDTEsxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSTJDMV9DTEtTT1VSQ0VfU1lTQ0xLCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSTJDMV9DTEtTT1VSQ0VfSFNJCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSTJDMl9DTEtTT1VSQ0VfUENMSzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19JMkMyX0NMS1NPVVJDRV9TWVNDTEsKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19JMkMyX0NMS1NPVVJDRV9IU0kKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19JMkMzX0NMS1NPVVJDRV9QQ0xLMQorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0kyQzNfQ0xLU09VUkNFX1NZU0NMSworICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0kyQzNfQ0xLU09VUkNFX0hTSQorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0kyQzRfQ0xLU09VUkNFX1BDTEsxICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0kyQzRfQ0xLU09VUkNFX1NZU0NMSyAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19JMkM0X0NMS1NPVVJDRV9IU0kgKCopCisgKgorICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX1NldEkyQ0Nsb2NrU291cmNlKHVpbnQzMl90IEkyQ3hTb3VyY2UpIHsKKyAgX19JTyB1aW50MzJfdCAqcmVnID0KKyAgICAgIChfX0lPIHVpbnQzMl90ICopKHVpbnQzMl90KShSQ0NfQkFTRSArIDB4ODhVICsgKEkyQ3hTb3VyY2UgPj4gMjRVKSk7CisgIE1PRElGWV9SRUcoCisgICAgICAqcmVnLCAzVUwgPDwgKChJMkN4U291cmNlICYgMHgwMDFGMDAwMFUpID4+IDE2VSksCisgICAgICAoKEkyQ3hTb3VyY2UgJiAweDAwMDAwMEZGVSkgPDwgKChJMkN4U291cmNlICYgMHgwMDFGMDAwMFUpID4+IDE2VSkpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENvbmZpZ3VyZSBMUFRJTXggY2xvY2sgc291cmNlCisgKiBAcm10b2xsIENDSVBSICAgICAgICBMUFRJTTFTRUwgICAgIExMX1JDQ19TZXRMUFRJTUNsb2NrU291cmNlCisgKiBAcGFyYW0gIExQVElNeFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xQVElNMV9DTEtTT1VSQ0VfUENMSzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MUFRJTTFfQ0xLU09VUkNFX0xTSQorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xQVElNMV9DTEtTT1VSQ0VfSFNJCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTFBUSU0xX0NMS1NPVVJDRV9MU0UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfU2V0TFBUSU1DbG9ja1NvdXJjZSh1aW50MzJfdCBMUFRJTXhTb3VyY2UpIHsKKyAgTU9ESUZZX1JFRyhSQ0MtPkNDSVBSLCBSQ0NfQ0NJUFJfTFBUSU0xU0VMLCBMUFRJTXhTb3VyY2UpOworfQorCisjaWYgZGVmaW5lZChTQUkxKQorLyoqCisgKiBAYnJpZWYgIENvbmZpZ3VyZSBTQUl4IGNsb2NrIHNvdXJjZQorICogQHJtdG9sbCBDQ0lQUiAgICAgICAgU0FJMVNFTCAgICAgICBMTF9SQ0NfU2V0U0FJQ2xvY2tTb3VyY2UKKyAqIEBwYXJhbSAgU0FJeFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NBSTFfQ0xLU09VUkNFX1NZU0NMSworICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NBSTFfQ0xLU09VUkNFX1BMTAorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NBSTFfQ0xLU09VUkNFX1BJTgorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NBSTFfQ0xLU09VUkNFX0hTSQorICoKKyAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19TZXRTQUlDbG9ja1NvdXJjZSh1aW50MzJfdCBTQUl4U291cmNlKSB7CisgIE1PRElGWV9SRUcoUkNDLT5DQ0lQUiwgUkNDX0NDSVBSX1NBSTFTRUwsIFNBSXhTb3VyY2UpOworfQorI2VuZGlmIC8qIFNBSTEgKi8KKworI2lmIGRlZmluZWQoU1BJX0kyU19TVVBQT1JUKQorLyoqCisgKiBAYnJpZWYgIENvbmZpZ3VyZSBJMlMgY2xvY2sgc291cmNlCisgKiBAcm10b2xsIENDSVBSICAgICAgICBJMlMyM1NFTCAgICAgIExMX1JDQ19TZXRJMlNDbG9ja1NvdXJjZQorICogQHBhcmFtICBJMlN4U291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSTJTX0NMS1NPVVJDRV9TWVNDTEsKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19JMlNfQ0xLU09VUkNFX1BMTAorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0kyU19DTEtTT1VSQ0VfUElOCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSTJTX0NMS1NPVVJDRV9IU0kKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfU2V0STJTQ2xvY2tTb3VyY2UodWludDMyX3QgSTJTeFNvdXJjZSkgeworICBNT0RJRllfUkVHKFJDQy0+Q0NJUFIsIFJDQ19DQ0lQUl9JMlMyM1NFTCwgSTJTeFNvdXJjZSk7Cit9CisjZW5kaWYgLyogU1BJX0kyU19TVVBQT1JUICovCisKKyNpZiBkZWZpbmVkKEZEQ0FOMSkKKy8qKgorICogQGJyaWVmICBDb25maWd1cmUgRkRDQU4gY2xvY2sgc291cmNlCisgKiBAcm10b2xsIENDSVBSICAgICAgICBGRENBTlNFTCAgICAgIExMX1JDQ19TZXRGRENBTkNsb2NrU291cmNlCisgKiBAcGFyYW0gIEZEQ0FOeFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0ZEQ0FOX0NMS1NPVVJDRV9IU0UKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19GRENBTl9DTEtTT1VSQ0VfUExMCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfRkRDQU5fQ0xLU09VUkNFX1BDTEsxCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX1NldEZEQ0FOQ2xvY2tTb3VyY2UodWludDMyX3QgRkRDQU54U291cmNlKSB7CisgIE1PRElGWV9SRUcoUkNDLT5DQ0lQUiwgUkNDX0NDSVBSX0ZEQ0FOU0VMLCBGRENBTnhTb3VyY2UpOworfQorI2VuZGlmIC8qIEZEQ0FOMSAqLworCisvKioKKyAqIEBicmllZiAgQ29uZmlndXJlIFJORyBjbG9jayBzb3VyY2UKKyAqIEBybXRvbGwgQ0NJUFIgICAgICAgIENMSzQ4U0VMICAgICAgTExfUkNDX1NldFJOR0Nsb2NrU291cmNlCisgKiBAcGFyYW0gIFJOR3hTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19STkdfQ0xLU09VUkNFX0hTSTQ4CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUk5HX0NMS1NPVVJDRV9QTEwKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfU2V0Uk5HQ2xvY2tTb3VyY2UodWludDMyX3QgUk5HeFNvdXJjZSkgeworICBNT0RJRllfUkVHKFJDQy0+Q0NJUFIsIFJDQ19DQ0lQUl9DTEs0OFNFTCwgUk5HeFNvdXJjZSk7Cit9CisKKy8qKgorICogQGJyaWVmICBDb25maWd1cmUgVVNCIGNsb2NrIHNvdXJjZQorICogQHJtdG9sbCBDQ0lQUiAgICAgICAgQ0xLNDhTRUwgICAgICBMTF9SQ0NfU2V0VVNCQ2xvY2tTb3VyY2UKKyAqIEBwYXJhbSAgVVNCeFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQl9DTEtTT1VSQ0VfSFNJNDgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0JfQ0xLU09VUkNFX1BMTAorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19TZXRVU0JDbG9ja1NvdXJjZSh1aW50MzJfdCBVU0J4U291cmNlKSB7CisgIE1PRElGWV9SRUcoUkNDLT5DQ0lQUiwgUkNDX0NDSVBSX0NMSzQ4U0VMLCBVU0J4U291cmNlKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENvbmZpZ3VyZSBBREMgY2xvY2sgc291cmNlCisgKiBAcm10b2xsIENDSVBSICAgICAgICBBREMxMlNFTCAgICAgICAgIExMX1JDQ19TZXRBRENDbG9ja1NvdXJjZVxuCisgKiAgICAgICAgIENDSVBSICAgICAgICBBREMzNDVTRUwgICAgICAgIExMX1JDQ19TZXRBRENDbG9ja1NvdXJjZQorICogQHBhcmFtICBBREN4U291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQURDMTJfQ0xLU09VUkNFX05PTkUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BREMxMl9DTEtTT1VSQ0VfUExMCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQURDMTJfQ0xLU09VUkNFX1NZU0NMSworICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FEQzM0NV9DTEtTT1VSQ0VfTk9ORSAgICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FEQzM0NV9DTEtTT1VSQ0VfUExMICAgICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FEQzM0NV9DTEtTT1VSQ0VfU1lTQ0xLICgqKQorICoKKyAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19TZXRBRENDbG9ja1NvdXJjZSh1aW50MzJfdCBBREN4U291cmNlKSB7CisgIE1PRElGWV9SRUcoCisgICAgICBSQ0MtPkNDSVBSLCAzVSA8PCAoKEFEQ3hTb3VyY2UgJiAweDAwMUYwMDAwVSkgPj4gMTZVKSwKKyAgICAgICgoQURDeFNvdXJjZSAmIDB4MDAwMDAwRkZVKSA8PCAoKEFEQ3hTb3VyY2UgJiAweDAwMUYwMDAwVSkgPj4gMTZVKSkpOworfQorCisjaWYgZGVmaW5lZChRVUFEU1BJKQorLyoqCisgKiBAYnJpZWYgIENvbmZpZ3VyZSBRVUFEU1BJIGNsb2NrIHNvdXJjZQorICogQHJtdG9sbCBDQ0lQUjIgICAgICAgICBRU1BJU0VMICAgICBMTF9SQ0NfU2V0UVVBRFNQSUNsb2NrU291cmNlCisgKiBAcGFyYW0gIFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1FVQURTUElfQ0xLU09VUkNFX1NZU0NMSworICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1FVQURTUElfQ0xLU09VUkNFX0hTSQorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1FVQURTUElfQ0xLU09VUkNFX1BMTAorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19TZXRRVUFEU1BJQ2xvY2tTb3VyY2UodWludDMyX3QgU291cmNlKSB7CisgIE1PRElGWV9SRUcoUkNDLT5DQ0lQUjIsIFJDQ19DQ0lQUjJfUVNQSVNFTCwgU291cmNlKTsKK30KKyNlbmRpZiAvKiBRVUFEU1BJICovCisKKy8qKgorICogQGJyaWVmICBHZXQgVVNBUlR4IGNsb2NrIHNvdXJjZQorICogQHJtdG9sbCBDQ0lQUiAgICAgICAgVVNBUlR4U0VMICAgICBMTF9SQ0NfR2V0VVNBUlRDbG9ja1NvdXJjZQorICogQHBhcmFtICBVU0FSVHggVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0FSVDFfQ0xLU09VUkNFCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVVNBUlQyX0NMS1NPVVJDRQorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQVJUM19DTEtTT1VSQ0UKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0FSVDFfQ0xLU09VUkNFX1BDTEsyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVVNBUlQxX0NMS1NPVVJDRV9TWVNDTEsKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0FSVDFfQ0xLU09VUkNFX0hTSQorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQVJUMV9DTEtTT1VSQ0VfTFNFCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVVNBUlQyX0NMS1NPVVJDRV9QQ0xLMQorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQVJUMl9DTEtTT1VSQ0VfU1lTQ0xLCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVVNBUlQyX0NMS1NPVVJDRV9IU0kKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0FSVDJfQ0xLU09VUkNFX0xTRQorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQVJUM19DTEtTT1VSQ0VfUENMSzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0FSVDNfQ0xLU09VUkNFX1NZU0NMSworICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQVJUM19DTEtTT1VSQ0VfSFNJCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVVNBUlQzX0NMS1NPVVJDRV9MU0UKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19HZXRVU0FSVENsb2NrU291cmNlKHVpbnQzMl90IFVTQVJUeCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPkNDSVBSLCBVU0FSVHgpIHwgKFVTQVJUeCA8PCAxNlUpKTsKK30KKworI2lmIGRlZmluZWQoVUFSVDQpCisvKioKKyAqIEBicmllZiAgR2V0IFVBUlR4IGNsb2NrIHNvdXJjZQorICogQHJtdG9sbCBDQ0lQUiAgICAgICAgVUFSVHhTRUwgICAgICBMTF9SQ0NfR2V0VUFSVENsb2NrU291cmNlCisgKiBAcGFyYW0gIFVBUlR4IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVUFSVDRfQ0xLU09VUkNFICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VBUlQ1X0NMS1NPVVJDRSAoKikKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VQVJUNF9DTEtTT1VSQ0VfUENMSzEgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVUFSVDRfQ0xLU09VUkNFX1NZU0NMSyAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VQVJUNF9DTEtTT1VSQ0VfSFNJICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VBUlQ0X0NMS1NPVVJDRV9MU0UgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVUFSVDVfQ0xLU09VUkNFX1BDTEsxICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VBUlQ1X0NMS1NPVVJDRV9TWVNDTEsgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVUFSVDVfQ0xLU09VUkNFX0hTSSAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VQVJUNV9DTEtTT1VSQ0VfTFNFICgqKQorICoKKyAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0dldFVBUlRDbG9ja1NvdXJjZSh1aW50MzJfdCBVQVJUeCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPkNDSVBSLCBVQVJUeCkgfCAoVUFSVHggPDwgMTZVKSk7Cit9CisjZW5kaWYgLyogVUFSVDQgKi8KKworLyoqCisgKiBAYnJpZWYgIEdldCBMUFVBUlR4IGNsb2NrIHNvdXJjZQorICogQHJtdG9sbCBDQ0lQUiAgICAgICAgTFBVQVJUMVNFTCAgICBMTF9SQ0NfR2V0TFBVQVJUQ2xvY2tTb3VyY2UKKyAqIEBwYXJhbSAgTFBVQVJUeCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xQVUFSVDFfQ0xLU09VUkNFCisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTFBVQVJUMV9DTEtTT1VSQ0VfUENMSzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MUFVBUlQxX0NMS1NPVVJDRV9TWVNDTEsKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MUFVBUlQxX0NMS1NPVVJDRV9IU0kKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MUFVBUlQxX0NMS1NPVVJDRV9MU0UKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19HZXRMUFVBUlRDbG9ja1NvdXJjZSh1aW50MzJfdCBMUFVBUlR4KSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJDQy0+Q0NJUFIsIExQVUFSVHgpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBJMkN4IGNsb2NrIHNvdXJjZQorICogQHJtdG9sbCBDQ0lQUiAgICAgICAgSTJDeFNFTCAgICAgICBMTF9SQ0NfR2V0STJDQ2xvY2tTb3VyY2UKKyAqIEBwYXJhbSAgSTJDeCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0kyQzFfQ0xLU09VUkNFCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSTJDMl9DTEtTT1VSQ0UKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19JMkMzX0NMS1NPVVJDRQorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0kyQzRfQ0xLU09VUkNFICgqKQorICoKKyAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0kyQzFfQ0xLU09VUkNFX1BDTEsxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSTJDMV9DTEtTT1VSQ0VfU1lTQ0xLCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSTJDMV9DTEtTT1VSQ0VfSFNJCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSTJDMl9DTEtTT1VSQ0VfUENMSzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19JMkMyX0NMS1NPVVJDRV9TWVNDTEsKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19JMkMyX0NMS1NPVVJDRV9IU0kKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19JMkMzX0NMS1NPVVJDRV9QQ0xLMQorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0kyQzNfQ0xLU09VUkNFX1NZU0NMSworICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0kyQzNfQ0xLU09VUkNFX0hTSQorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0kyQzRfQ0xLU09VUkNFX1BDTEsxICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0kyQzRfQ0xLU09VUkNFX1NZU0NMSyAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19JMkM0X0NMS1NPVVJDRV9IU0kgKCopCisgKgorICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfR2V0STJDQ2xvY2tTb3VyY2UodWludDMyX3QgSTJDeCkgeworICBfX0lPIGNvbnN0IHVpbnQzMl90ICpyZWcgPQorICAgICAgKF9fSU8gdWludDMyX3QgKikodWludDMyX3QpKFJDQ19CQVNFICsgMHg4OFUgKyAoSTJDeCA+PiAyNFUpKTsKKyAgcmV0dXJuICh1aW50MzJfdCkoKFJFQURfQklUKCpyZWcsIDNVTCA8PCAoKEkyQ3ggJiAweDAwMUYwMDAwVSkgPj4gMTZVKSkgPj4KKyAgICAgICAgICAgICAgICAgICAgICgoSTJDeCAmIDB4MDAxRjAwMDBVKSA+PiAxNlUpKSB8CisgICAgICAgICAgICAgICAgICAgIChJMkN4ICYgMHhGRkZGMDAwMFUpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBMUFRJTXggY2xvY2sgc291cmNlCisgKiBAcm10b2xsIENDSVBSICAgICAgICBMUFRJTXhTRUwgICAgIExMX1JDQ19HZXRMUFRJTUNsb2NrU291cmNlCisgKiBAcGFyYW0gIExQVElNeCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xQVElNMV9DTEtTT1VSQ0UKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MUFRJTTFfQ0xLU09VUkNFX1BDTEsxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTFBUSU0xX0NMS1NPVVJDRV9MU0kKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MUFRJTTFfQ0xLU09VUkNFX0hTSQorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xQVElNMV9DTEtTT1VSQ0VfTFNFCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfR2V0TFBUSU1DbG9ja1NvdXJjZSh1aW50MzJfdCBMUFRJTXgpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DQ0lQUiwgTFBUSU14KSk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgU0FJeCBjbG9jayBzb3VyY2UKKyAqIEBybXRvbGwgQ0NJUFIgICAgICAgIFNBSTFTRUwgICAgICAgTExfUkNDX0dldFNBSUNsb2NrU291cmNlCisgKiBAcGFyYW0gIFNBSXggVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TQUkxX0NMS1NPVVJDRQorICoKKyAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NBSTFfQ0xLU09VUkNFX1NZU0NMSworICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NBSTFfQ0xLU09VUkNFX1BMTAorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NBSTFfQ0xLU09VUkNFX1BJTgorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NBSTFfQ0xLU09VUkNFX0hTSQorICoKKyAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0dldFNBSUNsb2NrU291cmNlKHVpbnQzMl90IFNBSXgpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DQ0lQUiwgU0FJeCkpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IEkyU3ggY2xvY2sgc291cmNlCisgKiBAcm10b2xsIENDSVBSICAgICAgICBJMlMyM1NFTCAgICAgIExMX1JDQ19HZXRJMlNDbG9ja1NvdXJjZQorICogQHBhcmFtICBJMlN4IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSTJTX0NMS1NPVVJDRQorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0kyU19DTEtTT1VSQ0VfU1lTQ0xLCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSTJTX0NMS1NPVVJDRV9QTEwKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19JMlNfQ0xLU09VUkNFX1BJTgorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0kyU19DTEtTT1VSQ0VfSFNJCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfR2V0STJTQ2xvY2tTb3VyY2UodWludDMyX3QgSTJTeCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPkNDSVBSLCBJMlN4KSk7Cit9CisKKyNpZiBkZWZpbmVkKEZEQ0FOMSkKKy8qKgorICogQGJyaWVmICBHZXQgRkRDQU54IGNsb2NrIHNvdXJjZQorICogQHJtdG9sbCBDQ0lQUiAgICAgICAgRkRDQU5TRUwgICAgICBMTF9SQ0NfR2V0RkRDQU5DbG9ja1NvdXJjZQorICogQHBhcmFtICBGRENBTnggVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19GRENBTl9DTEtTT1VSQ0UKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19GRENBTl9DTEtTT1VSQ0VfSFNFCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfRkRDQU5fQ0xLU09VUkNFX1BMTAorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0ZEQ0FOX0NMS1NPVVJDRV9QQ0xLMQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfR2V0RkRDQU5DbG9ja1NvdXJjZSh1aW50MzJfdCBGRENBTngpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DQ0lQUiwgRkRDQU54KSk7Cit9CisjZW5kaWYgLyogRkRDQU4xICovCisKKy8qKgorICogQGJyaWVmICBHZXQgUk5HeCBjbG9jayBzb3VyY2UKKyAqIEBybXRvbGwgQ0NJUFIgICAgICAgIENMSzQ4U0VMICAgICAgTExfUkNDX0dldFJOR0Nsb2NrU291cmNlCisgKiBAcGFyYW0gIFJOR3ggVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19STkdfQ0xLU09VUkNFCisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUk5HX0NMS1NPVVJDRV9IU0k0OAorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1JOR19DTEtTT1VSQ0VfUExMCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfR2V0Uk5HQ2xvY2tTb3VyY2UodWludDMyX3QgUk5HeCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPkNDSVBSLCBSTkd4KSk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgVVNCeCBjbG9jayBzb3VyY2UKKyAqIEBybXRvbGwgQ0NJUFIgICAgICAgIENMSzQ4U0VMICAgICAgTExfUkNDX0dldFVTQkNsb2NrU291cmNlCisgKiBAcGFyYW0gIFVTQnggVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0JfQ0xLU09VUkNFCisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVVNCX0NMS1NPVVJDRV9IU0k0OAorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQl9DTEtTT1VSQ0VfUExMCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfR2V0VVNCQ2xvY2tTb3VyY2UodWludDMyX3QgVVNCeCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPkNDSVBSLCBVU0J4KSk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgQURDeCBjbG9jayBzb3VyY2UKKyAqIEBybXRvbGwgQ0NJUFIgICAgICAgIEFEQ1NFTCAgICAgICAgTExfUkNDX0dldEFEQ0Nsb2NrU291cmNlCisgKiBAcGFyYW0gIEFEQ3ggVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BREMxMl9DTEtTT1VSQ0UKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BREMzNDVfQ0xLU09VUkNFICAgICAgICAoKikKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BREMxMl9DTEtTT1VSQ0VfTk9ORQorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FEQzEyX0NMS1NPVVJDRV9QTEwKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BREMxMl9DTEtTT1VSQ0VfU1lTQ0xLCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQURDMzQ1X0NMS1NPVVJDRV9OT05FICAgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQURDMzQ1X0NMS1NPVVJDRV9QTEwgICAgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQURDMzQ1X0NMS1NPVVJDRV9TWVNDTEsgKCopCisgKgorICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfR2V0QURDQ2xvY2tTb3VyY2UodWludDMyX3QgQURDeCkgeworICByZXR1cm4gKAorICAgICAgdWludDMyX3QpKChSRUFEX0JJVChSQ0MtPkNDSVBSLCAzVUwgPDwgKChBREN4ICYgMHgwMDFGMDAwMFUpID4+IDE2VSkpID4+CisgICAgICAgICAgICAgICAgICgoQURDeCAmIDB4MDAxRjAwMDBVKSA+PiAxNlUpKSB8CisgICAgICAgICAgICAgICAgKEFEQ3ggJiAweEZGRkYwMDAwVSkpOworfQorCisjaWYgZGVmaW5lZChRVUFEU1BJKQorLyoqCisgKiBAYnJpZWYgIEdldCBRVUFEU1BJIGNsb2NrIHNvdXJjZQorICogQHJtdG9sbCBDQ0lQUjIgICAgICAgICBRU1BJU0VMICAgICBMTF9SQ0NfR2V0UVVBRFNQSUNsb2NrU291cmNlCisgKiBAcGFyYW0gIFFVQURTUEl4IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUVVBRFNQSV9DTEtTT1VSQ0UKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19RVUFEU1BJX0NMS1NPVVJDRV9TWVNDTEsKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19RVUFEU1BJX0NMS1NPVVJDRV9IU0kKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19RVUFEU1BJX0NMS1NPVVJDRV9QTEwKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19HZXRRVUFEU1BJQ2xvY2tTb3VyY2UodWludDMyX3QgUVVBRFNQSXgpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DQ0lQUjIsIFFVQURTUEl4KSk7Cit9CisjZW5kaWYgLyogUVVBRFNQSSAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VGX1JUQyBSVEMKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgIFNldCBSVEMgQ2xvY2sgU291cmNlCisgKiBAbm90ZSBPbmNlIHRoZSBSVEMgY2xvY2sgc291cmNlIGhhcyBiZWVuIHNlbGVjdGVkLCBpdCBjYW5ub3QgYmUgY2hhbmdlZAorICogYW55bW9yZSB1bmxlc3MgdGhlIEJhY2t1cCBkb21haW4gaXMgcmVzZXQsIG9yIHVubGVzcyBhIGZhaWx1cmUgaXMgZGV0ZWN0ZWQgb24KKyAqIExTRSAoTFNFQ1NTRCBpcyBzZXQpLiBUaGUgQkRSU1QgYml0IGNhbiBiZSB1c2VkIHRvIHJlc2V0IHRoZW0uCisgKiBAcm10b2xsIEJEQ1IgICAgICAgICBSVENTRUwgICAgICAgIExMX1JDQ19TZXRSVENDbG9ja1NvdXJjZQorICogQHBhcmFtICBTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19SVENfQ0xLU09VUkNFX05PTkUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19SVENfQ0xLU09VUkNFX0xTRQorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1JUQ19DTEtTT1VSQ0VfTFNJCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUlRDX0NMS1NPVVJDRV9IU0VfRElWMzIKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfU2V0UlRDQ2xvY2tTb3VyY2UodWludDMyX3QgU291cmNlKSB7CisgIE1PRElGWV9SRUcoUkNDLT5CRENSLCBSQ0NfQkRDUl9SVENTRUwsIFNvdXJjZSk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgUlRDIENsb2NrIFNvdXJjZQorICogQHJtdG9sbCBCRENSICAgICAgICAgUlRDU0VMICAgICAgICBMTF9SQ0NfR2V0UlRDQ2xvY2tTb3VyY2UKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19SVENfQ0xLU09VUkNFX05PTkUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19SVENfQ0xLU09VUkNFX0xTRQorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1JUQ19DTEtTT1VSQ0VfTFNJCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUlRDX0NMS1NPVVJDRV9IU0VfRElWMzIKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19HZXRSVENDbG9ja1NvdXJjZSh2b2lkKSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfUlRDU0VMKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgUlRDCisgKiBAcm10b2xsIEJEQ1IgICAgICAgICBSVENFTiAgICAgICAgIExMX1JDQ19FbmFibGVSVEMKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfRW5hYmxlUlRDKHZvaWQpIHsKKyAgU0VUX0JJVChSQ0MtPkJEQ1IsIFJDQ19CRENSX1JUQ0VOKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgUlRDCisgKiBAcm10b2xsIEJEQ1IgICAgICAgICBSVENFTiAgICAgICAgIExMX1JDQ19EaXNhYmxlUlRDCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0Rpc2FibGVSVEModm9pZCkgeworICBDTEVBUl9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9SVENFTik7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiBSVEMgaGFzIGJlZW4gZW5hYmxlZCBvciBub3QKKyAqIEBybXRvbGwgQkRDUiAgICAgICAgIFJUQ0VOICAgICAgICAgTExfUkNDX0lzRW5hYmxlZFJUQworICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSXNFbmFibGVkUlRDKHZvaWQpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9SVENFTikgPT0gKFJDQ19CRENSX1JUQ0VOKSkgPyAxVUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgRm9yY2UgdGhlIEJhY2t1cCBkb21haW4gcmVzZXQKKyAqIEBybXRvbGwgQkRDUiAgICAgICAgIEJEUlNUICAgICAgICAgTExfUkNDX0ZvcmNlQmFja3VwRG9tYWluUmVzZXQKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfRm9yY2VCYWNrdXBEb21haW5SZXNldCh2b2lkKSB7CisgIFNFVF9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9CRFJTVCk7Cit9CisKKy8qKgorICogQGJyaWVmICBSZWxlYXNlIHRoZSBCYWNrdXAgZG9tYWluIHJlc2V0CisgKiBAcm10b2xsIEJEQ1IgICAgICAgICBCRFJTVCAgICAgICAgIExMX1JDQ19SZWxlYXNlQmFja3VwRG9tYWluUmVzZXQKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfUmVsZWFzZUJhY2t1cERvbWFpblJlc2V0KHZvaWQpIHsKKyAgQ0xFQVJfQklUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfQkRSU1QpOworfQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUZfUExMIFBMTAorICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiAgRW5hYmxlIFBMTAorICogQHJtdG9sbCBDUiAgICAgICAgICAgUExMT04gICAgICAgICBMTF9SQ0NfUExMX0VuYWJsZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19QTExfRW5hYmxlKHZvaWQpIHsgU0VUX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfUExMT04pOyB9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIFBMTAorICogQG5vdGUgQ2Fubm90IGJlIGRpc2FibGVkIGlmIHRoZSBQTEwgY2xvY2sgaXMgdXNlZCBhcyB0aGUgc3lzdGVtIGNsb2NrCisgKiBAcm10b2xsIENSICAgICAgICAgICBQTExPTiAgICAgICAgIExMX1JDQ19QTExfRGlzYWJsZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19QTExfRGlzYWJsZSh2b2lkKSB7CisgIENMRUFSX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfUExMT04pOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgUExMIFJlYWR5CisgKiBAcm10b2xsIENSICAgICAgICAgICBQTExSRFkgICAgICAgIExMX1JDQ19QTExfSXNSZWFkeQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfUExMX0lzUmVhZHkodm9pZCkgeworICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfUExMUkRZKSA9PSAoUkNDX0NSX1BMTFJEWSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENvbmZpZ3VyZSBQTEwgdXNlZCBmb3IgU1lTQ0xLIERvbWFpbgorICogQG5vdGUgUExMIFNvdXJjZSBhbmQgUExMTSBEaXZpZGVyIGNhbiBiZSB3cml0dGVuIG9ubHkgd2hlbiBQTEwKKyAqICAgICAgIGlzIGRpc2FibGVkLgorICogQG5vdGUgUExMTi9QTExSIGNhbiBiZSB3cml0dGVuIG9ubHkgd2hlbiBQTEwgaXMgZGlzYWJsZWQuCisgKiBAcm10b2xsIFBMTENGR1IgICAgICBQTExTUkMgICAgICAgIExMX1JDQ19QTExfQ29uZmlnRG9tYWluX1NZU1xuCisgKiAgICAgICAgIFBMTENGR1IgICAgICBQTExNICAgICAgICAgIExMX1JDQ19QTExfQ29uZmlnRG9tYWluX1NZU1xuCisgKiAgICAgICAgIFBMTENGR1IgICAgICBQTExOICAgICAgICAgIExMX1JDQ19QTExfQ29uZmlnRG9tYWluX1NZU1xuCisgKiAgICAgICAgIFBMTENGR1IgICAgICBQTExSICAgICAgICAgIExMX1JDQ19QTExfQ29uZmlnRG9tYWluX1NZUworICogQHBhcmFtICBTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTT1VSQ0VfTk9ORQorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNPVVJDRV9IU0kKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTT1VSQ0VfSFNFCisgKiBAcGFyYW0gIFBMTE0gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMgorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl80CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfNQorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl83CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfOAorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8xMAorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzExCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMTIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8xMworICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzE0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMTUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8xNgorICogQHBhcmFtICBQTExOIEJldHdlZW4gTWluX0RhdGEgPSA4IGFuZCBNYXhfRGF0YSA9IDEyNworICogQHBhcmFtICBQTExSIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUl9ESVZfMgorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFJfRElWXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExSX0RJVl82CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUl9ESVZfOAorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19QTExfQ29uZmlnRG9tYWluX1NZUyh1aW50MzJfdCBTb3VyY2UsIHVpbnQzMl90IFBMTE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUExMTiwgdWludDMyX3QgUExMUikgeworICBNT0RJRllfUkVHKFJDQy0+UExMQ0ZHUiwKKyAgICAgICAgICAgICBSQ0NfUExMQ0ZHUl9QTExTUkMgfCBSQ0NfUExMQ0ZHUl9QTExNIHwgUkNDX1BMTENGR1JfUExMTiB8CisgICAgICAgICAgICAgICAgIFJDQ19QTExDRkdSX1BMTFIsCisgICAgICAgICAgICAgU291cmNlIHwgUExMTSB8IChQTExOIDw8IFJDQ19QTExDRkdSX1BMTE5fUG9zKSB8IFBMTFIpOworfQorCisvKioKKyAqIEBicmllZiAgQ29uZmlndXJlIFBMTCB1c2VkIGZvciBBREMgZG9tYWluIGNsb2NrCisgKiBAbm90ZSBQTEwgU291cmNlIGFuZCBQTExNIERpdmlkZXIgY2FuIGJlIHdyaXR0ZW4gb25seSB3aGVuIFBMTAorICogICAgICAgaXMgZGlzYWJsZWQuCisgKiBAbm90ZSBQTExOL1BMTFAgY2FuIGJlIHdyaXR0ZW4gb25seSB3aGVuIFBMTCBpcyBkaXNhYmxlZC4KKyAqIEBybXRvbGwgUExMQ0ZHUiAgICAgIFBMTFNSQyAgICAgICAgTExfUkNDX1BMTF9Db25maWdEb21haW5fQURDXG4KKyAqICAgICAgICAgUExMQ0ZHUiAgICAgIFBMTE0gICAgICAgICAgTExfUkNDX1BMTF9Db25maWdEb21haW5fQURDXG4KKyAqICAgICAgICAgUExMQ0ZHUiAgICAgIFBMTE4gICAgICAgICAgTExfUkNDX1BMTF9Db25maWdEb21haW5fQURDXG4KKyAqICAgICAgICAgUExMQ0ZHUiAgICAgIFBMTFBESVYgICAgICAgTExfUkNDX1BMTF9Db25maWdEb21haW5fQURDCisgKiBAcGFyYW0gIFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNPVVJDRV9OT05FCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU09VUkNFX0hTSQorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNPVVJDRV9IU0UKKyAqIEBwYXJhbSAgUExMTSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMworICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl81CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfNgorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl84CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfOQorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzEwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMTEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8xMgorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzEzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMTQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8xNQorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzE2CisgKiBAcGFyYW0gIFBMTE4gQmV0d2VlbiBNaW5fRGF0YSA9IDggYW5kIE1heF9EYXRhID0gMTI3CisgKiBAcGFyYW0gIFBMTFAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMworICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl81CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfNgorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl84CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfOQorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzEwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8xMgorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzEzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8xNQorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzE2CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8xOAorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzE5CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8yMQorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzIyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8yNAorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzI1CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8yNworICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzI4CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8zMAorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzMxCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX1BMTF9Db25maWdEb21haW5fQURDKHVpbnQzMl90IFNvdXJjZSwgdWludDMyX3QgUExMTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQTExOLCB1aW50MzJfdCBQTExQKSB7CisgIE1PRElGWV9SRUcoUkNDLT5QTExDRkdSLAorICAgICAgICAgICAgIFJDQ19QTExDRkdSX1BMTFNSQyB8IFJDQ19QTExDRkdSX1BMTE0gfCBSQ0NfUExMQ0ZHUl9QTExOIHwKKyAgICAgICAgICAgICAgICAgUkNDX1BMTENGR1JfUExMUERJViwKKyAgICAgICAgICAgICBTb3VyY2UgfCBQTExNIHwgKFBMTE4gPDwgUkNDX1BMTENGR1JfUExMTl9Qb3MpIHwgUExMUCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDb25maWd1cmUgUExMIHVzZWQgZm9yIDQ4TWh6IGRvbWFpbiBjbG9jaworICogQG5vdGUgUExMIFNvdXJjZSBhbmQgUExMTSBEaXZpZGVyIGNhbiBiZSB3cml0dGVuIG9ubHkgd2hlbiBQTEwsCisgKiAgICAgICBpcyBkaXNhYmxlZC4KKyAqIEBub3RlIFBMTE4vUExMUSBjYW4gYmUgd3JpdHRlbiBvbmx5IHdoZW4gUExMIGlzIGRpc2FibGVkLgorICogQG5vdGUgVGhpcyAgY2FuIGJlIHNlbGVjdGVkIGZvciBVU0IsIFJORworICogQHJtdG9sbCBQTExDRkdSICAgICAgUExMU1JDICAgICAgICBMTF9SQ0NfUExMX0NvbmZpZ0RvbWFpbl80OE1cbgorICogICAgICAgICBQTExDRkdSICAgICAgUExMTSAgICAgICAgICBMTF9SQ0NfUExMX0NvbmZpZ0RvbWFpbl80OE1cbgorICogICAgICAgICBQTExDRkdSICAgICAgUExMTiAgICAgICAgICBMTF9SQ0NfUExMX0NvbmZpZ0RvbWFpbl80OE1cbgorICogICAgICAgICBQTExDRkdSICAgICAgUExMUSAgICAgICAgICBMTF9SQ0NfUExMX0NvbmZpZ0RvbWFpbl80OE0KKyAqIEBwYXJhbSAgU291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU09VUkNFX05PTkUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTT1VSQ0VfSFNJCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU09VUkNFX0hTRQorICogQHBhcmFtICBQTExNIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMQorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8zCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfNAorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl82CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfNworICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl85CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMTAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8xMQorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzEyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMTMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8xNAorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzE1CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMTYKKyAqIEBwYXJhbSAgUExMTiBCZXR3ZWVuIE1pbl9EYXRhID0gOCBhbmQgTWF4X0RhdGEgPSAxMjcKKyAqIEBwYXJhbSAgUExMUSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFFfRElWXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExRX0RJVl80CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUV9ESVZfNgorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFFfRElWXzgKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfUExMX0NvbmZpZ0RvbWFpbl80OE0odWludDMyX3QgU291cmNlLCB1aW50MzJfdCBQTExNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFBMTE4sIHVpbnQzMl90IFBMTFEpIHsKKyAgTU9ESUZZX1JFRyhSQ0MtPlBMTENGR1IsCisgICAgICAgICAgICAgUkNDX1BMTENGR1JfUExMU1JDIHwgUkNDX1BMTENGR1JfUExMTSB8IFJDQ19QTExDRkdSX1BMTE4gfAorICAgICAgICAgICAgICAgICBSQ0NfUExMQ0ZHUl9QTExRLAorICAgICAgICAgICAgIFNvdXJjZSB8IFBMTE0gfCAoUExMTiA8PCBSQ0NfUExMQ0ZHUl9QTExOX1BvcykgfCBQTExRKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENvbmZpZ3VyZSBQTEwgY2xvY2sgc291cmNlCisgKiBAcm10b2xsIFBMTENGR1IgICAgICBQTExTUkMgICAgICAgIExMX1JDQ19QTExfU2V0TWFpblNvdXJjZQorICogQHBhcmFtIFBMTFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNPVVJDRV9OT05FCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU09VUkNFX0hTSQorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNPVVJDRV9IU0UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfUExMX1NldE1haW5Tb3VyY2UodWludDMyX3QgUExMU291cmNlKSB7CisgIE1PRElGWV9SRUcoUkNDLT5QTExDRkdSLCBSQ0NfUExMQ0ZHUl9QTExTUkMsIFBMTFNvdXJjZSk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgdGhlIG9zY2lsbGF0b3IgdXNlZCBhcyBQTEwgY2xvY2sgc291cmNlLgorICogQHJtdG9sbCBQTExDRkdSICAgICAgUExMU1JDICAgICAgICBMTF9SQ0NfUExMX0dldE1haW5Tb3VyY2UKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTT1VSQ0VfTk9ORQorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNPVVJDRV9IU0kKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTT1VSQ0VfSFNFCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfUExMX0dldE1haW5Tb3VyY2Uodm9pZCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTFNSQykpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IE1haW4gUExMIG11bHRpcGxpY2F0aW9uIGZhY3RvciBmb3IgVkNPCisgKiBAcm10b2xsIFBMTENGR1IgICAgICBQTExOICAgICAgICAgIExMX1JDQ19QTExfR2V0TgorICogQHJldHZhbCBCZXR3ZWVuIE1pbl9EYXRhID0gOCBhbmQgTWF4X0RhdGEgPSAxMjcKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19QTExfR2V0Tih2b2lkKSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMTikgPj4KKyAgICAgICAgICAgICAgICAgICAgUkNDX1BMTENGR1JfUExMTl9Qb3MpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUAorICogQG5vdGUgVXNlZCBmb3IgUExMQURDQ0xLIChBREMgY2xvY2spCisgKiBAcm10b2xsIFBMTENGR1IgICAgICBQTExQRElWICAgICAgIExMX1JDQ19QTExfR2V0UFxuCisgKiBAcm10b2xsIFBMTENGR1IgICAgICBQTExQICAgICAgICAgIExMX1JDQ19QTExfR2V0UAorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8zCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfNAorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl82CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfNworICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl85CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8xMQorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzEyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8xNAorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzE1CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8xNworICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzE4CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8yMAorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzIxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8yMworICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzI0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8yNgorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzI3CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8yOQorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzMwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMzEKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19QTExfR2V0UCh2b2lkKSB7CisgIHJldHVybiAodWludDMyX3QpKChSRUFEX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTFBESVYpICE9IDBVKQorICAgICAgICAgICAgICAgICAgICAgICAgPyBSRUFEX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTFBESVYpCisgICAgICAgICAgICAgICAgICAgICAgICA6ICgoUkVBRF9CSVQoUkNDLT5QTExDRkdSLCBSQ0NfUExMQ0ZHUl9QTExQKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19QTExDRkdSX1BMTFApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBMTF9SQ0NfUExMUF9ESVZfMTcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IExMX1JDQ19QTExQX0RJVl83KSk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExRCisgKiBAbm90ZSBVc2VkIGZvciBQTEw0OE0xQ0xLIHNlbGVjdGVkIGZvciBVU0IsIFJORyAoNDggTUh6IGNsb2NrKQorICogQHJtdG9sbCBQTExDRkdSICAgICAgUExMUSAgICAgICAgICBMTF9SQ0NfUExMX0dldFEKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExRX0RJVl8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUV9ESVZfNAorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFFfRElWXzYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExRX0RJVl84CisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfUExMX0dldFEodm9pZCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTFEpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFIKKyAqIEBub3RlIFVzZWQgZm9yIFBMTENMSyAoc3lzdGVtIGNsb2NrKQorICogQHJtdG9sbCBQTExDRkdSICAgICAgUExMUiAgICAgICAgICBMTF9SQ0NfUExMX0dldFIKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExSX0RJVl8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUl9ESVZfNAorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFJfRElWXzYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExSX0RJVl84CisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfUExMX0dldFIodm9pZCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTFIpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBEaXZpc2lvbiBmYWN0b3IgZm9yIHRoZSBtYWluIFBMTCBhbmQgb3RoZXIgUExMCisgKiBAcm10b2xsIFBMTENGR1IgICAgICBQTExNICAgICAgICAgIExMX1JDQ19QTExfR2V0RGl2aWRlcgorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMworICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl81CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfNgorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl84CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfOQorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzEwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMTEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8xMgorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzEzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMTQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8xNQorICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzE2CisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfUExMX0dldERpdmlkZXIodm9pZCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTE0pKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBQTEwgb3V0cHV0IG1hcHBlZCBvbiBBREMgZG9tYWluIGNsb2NrCisgKiBAcm10b2xsIFBMTENGR1IgICAgICBQTExQRU4gICAgICAgIExMX1JDQ19QTExfRW5hYmxlRG9tYWluX0FEQworICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19QTExfRW5hYmxlRG9tYWluX0FEQyh2b2lkKSB7CisgIFNFVF9CSVQoUkNDLT5QTExDRkdSLCBSQ0NfUExMQ0ZHUl9QTExQRU4pOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBQTEwgb3V0cHV0IG1hcHBlZCBvbiBBREMgZG9tYWluIGNsb2NrCisgKiBAbm90ZSBDYW5ub3QgYmUgZGlzYWJsZWQgaWYgdGhlIFBMTCBjbG9jayBpcyB1c2VkIGFzIHRoZSBzeXN0ZW0KKyAqICAgICAgIGNsb2NrCisgKiBAbm90ZSBJbiBvcmRlciB0byBzYXZlIHBvd2VyLCB3aGVuIHRoZSBQTExDTEsgIG9mIHRoZSBQTEwgaXMKKyAqICAgICAgIG5vdCB1c2VkLCAgc2hvdWxkIGJlIDAKKyAqIEBybXRvbGwgUExMQ0ZHUiAgICAgIFBMTFBFTiAgICAgICAgTExfUkNDX1BMTF9EaXNhYmxlRG9tYWluX0FEQworICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19QTExfRGlzYWJsZURvbWFpbl9BREModm9pZCkgeworICBDTEVBUl9CSVQoUkNDLT5QTExDRkdSLCBSQ0NfUExMQ0ZHUl9QTExQRU4pOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgUExMIG91dHB1dCBtYXBwZWQgb24gQURDIGRvbWFpbiBjbG9jayBpcyBlbmFibGVkCisgKiBAcm10b2xsIFBMTENGR1IgICAgICBQTExQRU4gICAgICAgIExMX1JDQ19QTExfSXNFbmFibGVkRG9tYWluX0FEQworICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfUExMX0lzRW5hYmxlZERvbWFpbl9BREModm9pZCkgeworICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTFBFTikgPT0gKFJDQ19QTExDRkdSX1BMTFBFTikpCisgICAgICAgICAgICAgID8gMVVMCisgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBQTEwgb3V0cHV0IG1hcHBlZCBvbiA0OE1IeiBkb21haW4gY2xvY2sKKyAqIEBybXRvbGwgUExMQ0ZHUiAgICAgIFBMTFFFTiAgICAgICAgTExfUkNDX1BMTF9FbmFibGVEb21haW5fNDhNCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX1BMTF9FbmFibGVEb21haW5fNDhNKHZvaWQpIHsKKyAgU0VUX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTFFFTik7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIFBMTCBvdXRwdXQgbWFwcGVkIG9uIDQ4TUh6IGRvbWFpbiBjbG9jaworICogQG5vdGUgQ2Fubm90IGJlIGRpc2FibGVkIGlmIHRoZSBQTEwgY2xvY2sgaXMgdXNlZCBhcyB0aGUgc3lzdGVtCisgKiAgICAgICBjbG9jaworICogQG5vdGUgSW4gb3JkZXIgdG8gc2F2ZSBwb3dlciwgd2hlbiB0aGUgUExMQ0xLICBvZiB0aGUgUExMIGlzCisgKiAgICAgICBub3QgdXNlZCwgIHNob3VsZCBiZSAwCisgKiBAcm10b2xsIFBMTENGR1IgICAgICBQTExRRU4gICAgICAgIExMX1JDQ19QTExfRGlzYWJsZURvbWFpbl80OE0KKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfUExMX0Rpc2FibGVEb21haW5fNDhNKHZvaWQpIHsKKyAgQ0xFQVJfQklUKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMUUVOKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIFBMTCBvdXRwdXQgbWFwcGVkIG9uIDQ4TUh6IGRvbWFpbiBjbG9jayBpcyBlbmFibGVkCisgKiBAcm10b2xsIFBMTENGR1IgICAgICBQTExRRU4gICAgICAgIExMX1JDQ19QTExfSXNFbmFibGVkRG9tYWluXzQ4TQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfUExMX0lzRW5hYmxlZERvbWFpbl80OE0odm9pZCkgeworICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTFFFTikgPT0gKFJDQ19QTExDRkdSX1BMTFFFTikpCisgICAgICAgICAgICAgID8gMVVMCisgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBQTEwgb3V0cHV0IG1hcHBlZCBvbiBTWVNDTEsgZG9tYWluCisgKiBAcm10b2xsIFBMTENGR1IgICAgICBQTExSRU4gICAgICAgIExMX1JDQ19QTExfRW5hYmxlRG9tYWluX1NZUworICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19QTExfRW5hYmxlRG9tYWluX1NZUyh2b2lkKSB7CisgIFNFVF9CSVQoUkNDLT5QTExDRkdSLCBSQ0NfUExMQ0ZHUl9QTExSRU4pOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBQTEwgb3V0cHV0IG1hcHBlZCBvbiBTWVNDTEsgZG9tYWluCisgKiBAbm90ZSBDYW5ub3QgYmUgZGlzYWJsZWQgaWYgdGhlIFBMTCBjbG9jayBpcyB1c2VkIGFzIHRoZSBzeXN0ZW0KKyAqICAgICAgIGNsb2NrCisgKiBAbm90ZSBJbiBvcmRlciB0byBzYXZlIHBvd2VyLCB3aGVuIHRoZSBQTExDTEsgIG9mIHRoZSBQTEwgaXMKKyAqICAgICAgIG5vdCB1c2VkLCBNYWluIFBMTCAgc2hvdWxkIGJlIDAKKyAqIEBybXRvbGwgUExMQ0ZHUiAgICAgIFBMTFJFTiAgICAgICAgTExfUkNDX1BMTF9EaXNhYmxlRG9tYWluX1NZUworICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19QTExfRGlzYWJsZURvbWFpbl9TWVModm9pZCkgeworICBDTEVBUl9CSVQoUkNDLT5QTExDRkdSLCBSQ0NfUExMQ0ZHUl9QTExSRU4pOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgUExMIG91dHB1dCBtYXBwZWQgb24gU1lTQ0xLIGRvbWFpbiBjbG9jayBpcyBlbmFibGVkCisgKiBAcm10b2xsIFBMTENGR1IgICAgICBQTExSRU4gICAgICAgIExMX1JDQ19QTExfSXNFbmFibGVkRG9tYWluX1NZUworICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfUExMX0lzRW5hYmxlZERvbWFpbl9TWVModm9pZCkgeworICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTFJFTikgPT0gKFJDQ19QTExDRkdSX1BMTFJFTikpCisgICAgICAgICAgICAgID8gMVVMCisgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VGX0ZMQUdfTWFuYWdlbWVudCBGTEFHIE1hbmFnZW1lbnQKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgIENsZWFyIExTSSByZWFkeSBpbnRlcnJ1cHQgZmxhZworICogQHJtdG9sbCBDSUNSICAgICAgICAgTFNJUkRZQyAgICAgICBMTF9SQ0NfQ2xlYXJGbGFnX0xTSVJEWQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19DbGVhckZsYWdfTFNJUkRZKHZvaWQpIHsKKyAgU0VUX0JJVChSQ0MtPkNJQ1IsIFJDQ19DSUNSX0xTSVJEWUMpOworfQorCisvKioKKyAqIEBicmllZiAgQ2xlYXIgTFNFIHJlYWR5IGludGVycnVwdCBmbGFnCisgKiBAcm10b2xsIENJQ1IgICAgICAgICBMU0VSRFlDICAgICAgIExMX1JDQ19DbGVhckZsYWdfTFNFUkRZCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0NsZWFyRmxhZ19MU0VSRFkodm9pZCkgeworICBTRVRfQklUKFJDQy0+Q0lDUiwgUkNDX0NJQ1JfTFNFUkRZQyk7Cit9CisKKy8qKgorICogQGJyaWVmICBDbGVhciBIU0kgcmVhZHkgaW50ZXJydXB0IGZsYWcKKyAqIEBybXRvbGwgQ0lDUiAgICAgICAgIEhTSVJEWUMgICAgICAgTExfUkNDX0NsZWFyRmxhZ19IU0lSRFkKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfQ2xlYXJGbGFnX0hTSVJEWSh2b2lkKSB7CisgIFNFVF9CSVQoUkNDLT5DSUNSLCBSQ0NfQ0lDUl9IU0lSRFlDKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENsZWFyIEhTRSByZWFkeSBpbnRlcnJ1cHQgZmxhZworICogQHJtdG9sbCBDSUNSICAgICAgICAgSFNFUkRZQyAgICAgICBMTF9SQ0NfQ2xlYXJGbGFnX0hTRVJEWQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19DbGVhckZsYWdfSFNFUkRZKHZvaWQpIHsKKyAgU0VUX0JJVChSQ0MtPkNJQ1IsIFJDQ19DSUNSX0hTRVJEWUMpOworfQorCisvKioKKyAqIEBicmllZiAgQ2xlYXIgUExMIHJlYWR5IGludGVycnVwdCBmbGFnCisgKiBAcm10b2xsIENJQ1IgICAgICAgICBQTExSRFlDICAgICAgIExMX1JDQ19DbGVhckZsYWdfUExMUkRZCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0NsZWFyRmxhZ19QTExSRFkodm9pZCkgeworICBTRVRfQklUKFJDQy0+Q0lDUiwgUkNDX0NJQ1JfUExMUkRZQyk7Cit9CisKKy8qKgorICogQGJyaWVmICBDbGVhciBIU0k0OCByZWFkeSBpbnRlcnJ1cHQgZmxhZworICogQHJtdG9sbCBDSUNSICAgICAgICAgIEhTSTQ4UkRZQyAgICAgTExfUkNDX0NsZWFyRmxhZ19IU0k0OFJEWQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19DbGVhckZsYWdfSFNJNDhSRFkodm9pZCkgeworICBTRVRfQklUKFJDQy0+Q0lDUiwgUkNDX0NJQ1JfSFNJNDhSRFlDKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENsZWFyIENsb2NrIHNlY3VyaXR5IHN5c3RlbSBpbnRlcnJ1cHQgZmxhZworICogQHJtdG9sbCBDSUNSICAgICAgICAgQ1NTQyAgICAgICAgICBMTF9SQ0NfQ2xlYXJGbGFnX0hTRUNTUworICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19DbGVhckZsYWdfSFNFQ1NTKHZvaWQpIHsKKyAgU0VUX0JJVChSQ0MtPkNJQ1IsIFJDQ19DSUNSX0NTU0MpOworfQorCisvKioKKyAqIEBicmllZiAgQ2xlYXIgTFNFIENsb2NrIHNlY3VyaXR5IHN5c3RlbSBpbnRlcnJ1cHQgZmxhZworICogQHJtdG9sbCBDSUNSICAgICAgICAgTFNFQ1NTQyAgICAgICBMTF9SQ0NfQ2xlYXJGbGFnX0xTRUNTUworICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19DbGVhckZsYWdfTFNFQ1NTKHZvaWQpIHsKKyAgU0VUX0JJVChSQ0MtPkNJQ1IsIFJDQ19DSUNSX0xTRUNTU0MpOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgTFNJIHJlYWR5IGludGVycnVwdCBvY2N1cnJlZCBvciBub3QKKyAqIEBybXRvbGwgQ0lGUiAgICAgICAgIExTSVJEWUYgICAgICAgTExfUkNDX0lzQWN0aXZlRmxhZ19MU0lSRFkKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0lzQWN0aXZlRmxhZ19MU0lSRFkodm9pZCkgeworICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkNJRlIsIFJDQ19DSUZSX0xTSVJEWUYpID09IChSQ0NfQ0lGUl9MU0lSRFlGKSkgPyAxVUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIExTRSByZWFkeSBpbnRlcnJ1cHQgb2NjdXJyZWQgb3Igbm90CisgKiBAcm10b2xsIENJRlIgICAgICAgICBMU0VSRFlGICAgICAgIExMX1JDQ19Jc0FjdGl2ZUZsYWdfTFNFUkRZCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19Jc0FjdGl2ZUZsYWdfTFNFUkRZKHZvaWQpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5DSUZSLCBSQ0NfQ0lGUl9MU0VSRFlGKSA9PSAoUkNDX0NJRlJfTFNFUkRZRikpID8gMVVMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiBIU0kgcmVhZHkgaW50ZXJydXB0IG9jY3VycmVkIG9yIG5vdAorICogQHJtdG9sbCBDSUZSICAgICAgICAgSFNJUkRZRiAgICAgICBMTF9SQ0NfSXNBY3RpdmVGbGFnX0hTSVJEWQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSXNBY3RpdmVGbGFnX0hTSVJEWSh2b2lkKSB7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q0lGUiwgUkNDX0NJRlJfSFNJUkRZRikgPT0gKFJDQ19DSUZSX0hTSVJEWUYpKSA/IDFVTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgSFNFIHJlYWR5IGludGVycnVwdCBvY2N1cnJlZCBvciBub3QKKyAqIEBybXRvbGwgQ0lGUiAgICAgICAgIEhTRVJEWUYgICAgICAgTExfUkNDX0lzQWN0aXZlRmxhZ19IU0VSRFkKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0lzQWN0aXZlRmxhZ19IU0VSRFkodm9pZCkgeworICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkNJRlIsIFJDQ19DSUZSX0hTRVJEWUYpID09IChSQ0NfQ0lGUl9IU0VSRFlGKSkgPyAxVUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIFBMTCByZWFkeSBpbnRlcnJ1cHQgb2NjdXJyZWQgb3Igbm90CisgKiBAcm10b2xsIENJRlIgICAgICAgICBQTExSRFlGICAgICAgIExMX1JDQ19Jc0FjdGl2ZUZsYWdfUExMUkRZCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19Jc0FjdGl2ZUZsYWdfUExMUkRZKHZvaWQpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5DSUZSLCBSQ0NfQ0lGUl9QTExSRFlGKSA9PSAoUkNDX0NJRlJfUExMUkRZRikpID8gMVVMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiBIU0k0OCByZWFkeSBpbnRlcnJ1cHQgb2NjdXJyZWQgb3Igbm90CisgKiBAcm10b2xsIENJUiAgICAgICAgICBIU0k0OFJEWUYgICAgIExMX1JDQ19Jc0FjdGl2ZUZsYWdfSFNJNDhSRFkKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0lzQWN0aXZlRmxhZ19IU0k0OFJEWSh2b2lkKSB7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q0lGUiwgUkNDX0NJRlJfSFNJNDhSRFlGKSA9PSAoUkNDX0NJRlJfSFNJNDhSRFlGKSkKKyAgICAgICAgICAgICAgPyAxVUwKKyAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgQ2xvY2sgc2VjdXJpdHkgc3lzdGVtIGludGVycnVwdCBvY2N1cnJlZCBvciBub3QKKyAqIEBybXRvbGwgQ0lGUiAgICAgICAgIENTU0YgICAgICAgICAgTExfUkNDX0lzQWN0aXZlRmxhZ19IU0VDU1MKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0lzQWN0aXZlRmxhZ19IU0VDU1Modm9pZCkgeworICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkNJRlIsIFJDQ19DSUZSX0NTU0YpID09IChSQ0NfQ0lGUl9DU1NGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgTFNFIENsb2NrIHNlY3VyaXR5IHN5c3RlbSBpbnRlcnJ1cHQgb2NjdXJyZWQgb3Igbm90CisgKiBAcm10b2xsIENJRlIgICAgICAgICBMU0VDU1NGICAgICAgIExMX1JDQ19Jc0FjdGl2ZUZsYWdfTFNFQ1NTCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19Jc0FjdGl2ZUZsYWdfTFNFQ1NTKHZvaWQpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5DSUZSLCBSQ0NfQ0lGUl9MU0VDU1NGKSA9PSAoUkNDX0NJRlJfTFNFQ1NTRikpID8gMVVMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiBSQ0MgZmxhZyBJbmRlcGVuZGVudCBXYXRjaGRvZyByZXNldCBpcyBzZXQgb3Igbm90LgorICogQHJtdG9sbCBDU1IgICAgICAgICAgSVdER1JTVEYgICAgICBMTF9SQ0NfSXNBY3RpdmVGbGFnX0lXREdSU1QKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0lzQWN0aXZlRmxhZ19JV0RHUlNUKHZvaWQpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5DU1IsIFJDQ19DU1JfSVdER1JTVEYpID09IChSQ0NfQ1NSX0lXREdSU1RGKSkgPyAxVUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgUkNDIGZsYWcgTG93IFBvd2VyIHJlc2V0IGlzIHNldCBvciBub3QuCisgKiBAcm10b2xsIENTUiAgICAgICAgICBMUFdSUlNURiAgICAgIExMX1JDQ19Jc0FjdGl2ZUZsYWdfTFBXUlJTVAorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSXNBY3RpdmVGbGFnX0xQV1JSU1Qodm9pZCkgeworICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkNTUiwgUkNDX0NTUl9MUFdSUlNURikgPT0gKFJDQ19DU1JfTFBXUlJTVEYpKSA/IDFVTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiBSQ0MgZmxhZyBPcHRpb24gYnl0ZSByZXNldCBpcyBzZXQgb3Igbm90LgorICogQHJtdG9sbCBDU1IgICAgICAgICAgT0JMUlNURiAgICAgICBMTF9SQ0NfSXNBY3RpdmVGbGFnX09CTFJTVAorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSXNBY3RpdmVGbGFnX09CTFJTVCh2b2lkKSB7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q1NSLCBSQ0NfQ1NSX09CTFJTVEYpID09IChSQ0NfQ1NSX09CTFJTVEYpKSA/IDFVTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgUkNDIGZsYWcgUGluIHJlc2V0IGlzIHNldCBvciBub3QuCisgKiBAcm10b2xsIENTUiAgICAgICAgICBQSU5SU1RGICAgICAgIExMX1JDQ19Jc0FjdGl2ZUZsYWdfUElOUlNUCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19Jc0FjdGl2ZUZsYWdfUElOUlNUKHZvaWQpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5DU1IsIFJDQ19DU1JfUElOUlNURikgPT0gKFJDQ19DU1JfUElOUlNURikpID8gMVVMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiBSQ0MgZmxhZyBTb2Z0d2FyZSByZXNldCBpcyBzZXQgb3Igbm90LgorICogQHJtdG9sbCBDU1IgICAgICAgICAgU0ZUUlNURiAgICAgICBMTF9SQ0NfSXNBY3RpdmVGbGFnX1NGVFJTVAorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSXNBY3RpdmVGbGFnX1NGVFJTVCh2b2lkKSB7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q1NSLCBSQ0NfQ1NSX1NGVFJTVEYpID09IChSQ0NfQ1NSX1NGVFJTVEYpKSA/IDFVTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgUkNDIGZsYWcgV2luZG93IFdhdGNoZG9nIHJlc2V0IGlzIHNldCBvciBub3QuCisgKiBAcm10b2xsIENTUiAgICAgICAgICBXV0RHUlNURiAgICAgIExMX1JDQ19Jc0FjdGl2ZUZsYWdfV1dER1JTVAorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSXNBY3RpdmVGbGFnX1dXREdSU1Qodm9pZCkgeworICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkNTUiwgUkNDX0NTUl9XV0RHUlNURikgPT0gKFJDQ19DU1JfV1dER1JTVEYpKSA/IDFVTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiBSQ0MgZmxhZyBCT1IgcmVzZXQgaXMgc2V0IG9yIG5vdC4KKyAqIEBybXRvbGwgQ1NSICAgICAgICAgIEJPUlJTVEYgICAgICAgTExfUkNDX0lzQWN0aXZlRmxhZ19CT1JSU1QKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0lzQWN0aXZlRmxhZ19CT1JSU1Qodm9pZCkgeworICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkNTUiwgUkNDX0NTUl9CT1JSU1RGKSA9PSAoUkNDX0NTUl9CT1JSU1RGKSkgPyAxVUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFNldCBSTVZGIGJpdCB0byBjbGVhciB0aGUgcmVzZXQgZmxhZ3MuCisgKiBAcm10b2xsIENTUiAgICAgICAgICBSTVZGICAgICAgICAgIExMX1JDQ19DbGVhclJlc2V0RmxhZ3MKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfQ2xlYXJSZXNldEZsYWdzKHZvaWQpIHsKKyAgU0VUX0JJVChSQ0MtPkNTUiwgUkNDX0NTUl9STVZGKTsKK30KKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VGX0lUX01hbmFnZW1lbnQgSVQgTWFuYWdlbWVudAorICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiAgRW5hYmxlIExTSSByZWFkeSBpbnRlcnJ1cHQKKyAqIEBybXRvbGwgQ0lFUiAgICAgICAgIExTSVJEWUlFICAgICAgTExfUkNDX0VuYWJsZUlUX0xTSVJEWQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19FbmFibGVJVF9MU0lSRFkodm9pZCkgeworICBTRVRfQklUKFJDQy0+Q0lFUiwgUkNDX0NJRVJfTFNJUkRZSUUpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIExTRSByZWFkeSBpbnRlcnJ1cHQKKyAqIEBybXRvbGwgQ0lFUiAgICAgICAgIExTRVJEWUlFICAgICAgTExfUkNDX0VuYWJsZUlUX0xTRVJEWQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19FbmFibGVJVF9MU0VSRFkodm9pZCkgeworICBTRVRfQklUKFJDQy0+Q0lFUiwgUkNDX0NJRVJfTFNFUkRZSUUpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIEhTSSByZWFkeSBpbnRlcnJ1cHQKKyAqIEBybXRvbGwgQ0lFUiAgICAgICAgIEhTSVJEWUlFICAgICAgTExfUkNDX0VuYWJsZUlUX0hTSVJEWQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19FbmFibGVJVF9IU0lSRFkodm9pZCkgeworICBTRVRfQklUKFJDQy0+Q0lFUiwgUkNDX0NJRVJfSFNJUkRZSUUpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIEhTRSByZWFkeSBpbnRlcnJ1cHQKKyAqIEBybXRvbGwgQ0lFUiAgICAgICAgIEhTRVJEWUlFICAgICAgTExfUkNDX0VuYWJsZUlUX0hTRVJEWQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19FbmFibGVJVF9IU0VSRFkodm9pZCkgeworICBTRVRfQklUKFJDQy0+Q0lFUiwgUkNDX0NJRVJfSFNFUkRZSUUpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIFBMTCByZWFkeSBpbnRlcnJ1cHQKKyAqIEBybXRvbGwgQ0lFUiAgICAgICAgIFBMTFJEWUlFICAgICAgTExfUkNDX0VuYWJsZUlUX1BMTFJEWQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19FbmFibGVJVF9QTExSRFkodm9pZCkgeworICBTRVRfQklUKFJDQy0+Q0lFUiwgUkNDX0NJRVJfUExMUkRZSUUpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIEhTSTQ4IHJlYWR5IGludGVycnVwdAorICogQHJtdG9sbCBDSUVSICAgICAgICAgIEhTSTQ4UkRZSUUgICAgTExfUkNDX0VuYWJsZUlUX0hTSTQ4UkRZCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0VuYWJsZUlUX0hTSTQ4UkRZKHZvaWQpIHsKKyAgU0VUX0JJVChSQ0MtPkNJRVIsIFJDQ19DSUVSX0hTSTQ4UkRZSUUpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIExTRSBjbG9jayBzZWN1cml0eSBzeXN0ZW0gaW50ZXJydXB0CisgKiBAcm10b2xsIENJRVIgICAgICAgICBMU0VDU1NJRSAgICAgIExMX1JDQ19FbmFibGVJVF9MU0VDU1MKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfRW5hYmxlSVRfTFNFQ1NTKHZvaWQpIHsKKyAgU0VUX0JJVChSQ0MtPkNJRVIsIFJDQ19DSUVSX0xTRUNTU0lFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgTFNJIHJlYWR5IGludGVycnVwdAorICogQHJtdG9sbCBDSUVSICAgICAgICAgTFNJUkRZSUUgICAgICBMTF9SQ0NfRGlzYWJsZUlUX0xTSVJEWQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19EaXNhYmxlSVRfTFNJUkRZKHZvaWQpIHsKKyAgQ0xFQVJfQklUKFJDQy0+Q0lFUiwgUkNDX0NJRVJfTFNJUkRZSUUpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBMU0UgcmVhZHkgaW50ZXJydXB0CisgKiBAcm10b2xsIENJRVIgICAgICAgICBMU0VSRFlJRSAgICAgIExMX1JDQ19EaXNhYmxlSVRfTFNFUkRZCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0Rpc2FibGVJVF9MU0VSRFkodm9pZCkgeworICBDTEVBUl9CSVQoUkNDLT5DSUVSLCBSQ0NfQ0lFUl9MU0VSRFlJRSk7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIEhTSSByZWFkeSBpbnRlcnJ1cHQKKyAqIEBybXRvbGwgQ0lFUiAgICAgICAgIEhTSVJEWUlFICAgICAgTExfUkNDX0Rpc2FibGVJVF9IU0lSRFkKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfRGlzYWJsZUlUX0hTSVJEWSh2b2lkKSB7CisgIENMRUFSX0JJVChSQ0MtPkNJRVIsIFJDQ19DSUVSX0hTSVJEWUlFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgSFNFIHJlYWR5IGludGVycnVwdAorICogQHJtdG9sbCBDSUVSICAgICAgICAgSFNFUkRZSUUgICAgICBMTF9SQ0NfRGlzYWJsZUlUX0hTRVJEWQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19EaXNhYmxlSVRfSFNFUkRZKHZvaWQpIHsKKyAgQ0xFQVJfQklUKFJDQy0+Q0lFUiwgUkNDX0NJRVJfSFNFUkRZSUUpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBQTEwgcmVhZHkgaW50ZXJydXB0CisgKiBAcm10b2xsIENJRVIgICAgICAgICBQTExSRFlJRSAgICAgIExMX1JDQ19EaXNhYmxlSVRfUExMUkRZCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0Rpc2FibGVJVF9QTExSRFkodm9pZCkgeworICBDTEVBUl9CSVQoUkNDLT5DSUVSLCBSQ0NfQ0lFUl9QTExSRFlJRSk7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIEhTSTQ4IHJlYWR5IGludGVycnVwdAorICogQHJtdG9sbCBDSUVSICAgICAgICAgIEhTSTQ4UkRZSUUgICAgTExfUkNDX0Rpc2FibGVJVF9IU0k0OFJEWQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19EaXNhYmxlSVRfSFNJNDhSRFkodm9pZCkgeworICBDTEVBUl9CSVQoUkNDLT5DSUVSLCBSQ0NfQ0lFUl9IU0k0OFJEWUlFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgTFNFIGNsb2NrIHNlY3VyaXR5IHN5c3RlbSBpbnRlcnJ1cHQKKyAqIEBybXRvbGwgQ0lFUiAgICAgICAgIExTRUNTU0lFICAgICAgTExfUkNDX0Rpc2FibGVJVF9MU0VDU1MKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfRGlzYWJsZUlUX0xTRUNTUyh2b2lkKSB7CisgIENMRUFSX0JJVChSQ0MtPkNJRVIsIFJDQ19DSUVSX0xTRUNTU0lFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrcyBpZiBMU0kgcmVhZHkgaW50ZXJydXB0IHNvdXJjZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICogQHJtdG9sbCBDSUVSICAgICAgICAgTFNJUkRZSUUgICAgICBMTF9SQ0NfSXNFbmFibGVkSVRfTFNJUkRZCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19Jc0VuYWJsZWRJVF9MU0lSRFkodm9pZCkgeworICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkNJRVIsIFJDQ19DSUVSX0xTSVJEWUlFKSA9PSAoUkNDX0NJRVJfTFNJUkRZSUUpKQorICAgICAgICAgICAgICA/IDFVTAorICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVja3MgaWYgTFNFIHJlYWR5IGludGVycnVwdCBzb3VyY2UgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAqIEBybXRvbGwgQ0lFUiAgICAgICAgIExTRVJEWUlFICAgICAgTExfUkNDX0lzRW5hYmxlZElUX0xTRVJEWQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSXNFbmFibGVkSVRfTFNFUkRZKHZvaWQpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5DSUVSLCBSQ0NfQ0lFUl9MU0VSRFlJRSkgPT0gKFJDQ19DSUVSX0xTRVJEWUlFKSkKKyAgICAgICAgICAgICAgPyAxVUwKKyAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2tzIGlmIEhTSSByZWFkeSBpbnRlcnJ1cHQgc291cmNlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgKiBAcm10b2xsIENJRVIgICAgICAgICBIU0lSRFlJRSAgICAgIExMX1JDQ19Jc0VuYWJsZWRJVF9IU0lSRFkKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0lzRW5hYmxlZElUX0hTSVJEWSh2b2lkKSB7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q0lFUiwgUkNDX0NJRVJfSFNJUkRZSUUpID09IChSQ0NfQ0lFUl9IU0lSRFlJRSkpCisgICAgICAgICAgICAgID8gMVVMCisgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrcyBpZiBIU0UgcmVhZHkgaW50ZXJydXB0IHNvdXJjZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICogQHJtdG9sbCBDSUVSICAgICAgICAgSFNFUkRZSUUgICAgICBMTF9SQ0NfSXNFbmFibGVkSVRfSFNFUkRZCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19Jc0VuYWJsZWRJVF9IU0VSRFkodm9pZCkgeworICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkNJRVIsIFJDQ19DSUVSX0hTRVJEWUlFKSA9PSAoUkNDX0NJRVJfSFNFUkRZSUUpKQorICAgICAgICAgICAgICA/IDFVTAorICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVja3MgaWYgUExMIHJlYWR5IGludGVycnVwdCBzb3VyY2UgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAqIEBybXRvbGwgQ0lFUiAgICAgICAgIFBMTFJEWUlFICAgICAgTExfUkNDX0lzRW5hYmxlZElUX1BMTFJEWQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSXNFbmFibGVkSVRfUExMUkRZKHZvaWQpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5DSUVSLCBSQ0NfQ0lFUl9QTExSRFlJRSkgPT0gKFJDQ19DSUVSX1BMTFJEWUlFKSkKKyAgICAgICAgICAgICAgPyAxVUwKKyAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2tzIGlmIEhTSTQ4IHJlYWR5IGludGVycnVwdCBzb3VyY2UgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAqIEBybXRvbGwgQ0lFUiAgICAgICAgICBIU0k0OFJEWUlFICAgIExMX1JDQ19Jc0VuYWJsZWRJVF9IU0k0OFJEWQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSXNFbmFibGVkSVRfSFNJNDhSRFkodm9pZCkgeworICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkNJRVIsIFJDQ19DSUVSX0hTSTQ4UkRZSUUpID09IChSQ0NfQ0lFUl9IU0k0OFJEWUlFKSkKKyAgICAgICAgICAgICAgPyAxVUwKKyAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2tzIGlmIExTRUNTUyBpbnRlcnJ1cHQgc291cmNlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgKiBAcm10b2xsIENJRVIgICAgICAgICBMU0VDU1NJRSAgICAgIExMX1JDQ19Jc0VuYWJsZWRJVF9MU0VDU1MKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0lzRW5hYmxlZElUX0xTRUNTUyh2b2lkKSB7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q0lFUiwgUkNDX0NJRVJfTFNFQ1NTSUUpID09IChSQ0NfQ0lFUl9MU0VDU1NJRSkpCisgICAgICAgICAgICAgID8gMVVMCisgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAfQorICovCisKKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VGX0luaXQgRGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24KKyAqIEB7CisgKi8KK0Vycm9yU3RhdHVzIExMX1JDQ19EZUluaXQodm9pZCk7CisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUZfR2V0X0ZyZXEgR2V0IHN5c3RlbSBhbmQgcGVyaXBoZXJhbHMgY2xvY2tzIGZyZXF1ZW5jeQorICogZnVuY3Rpb25zCisgKiBAeworICovCit2b2lkIExMX1JDQ19HZXRTeXN0ZW1DbG9ja3NGcmVxKExMX1JDQ19DbG9ja3NUeXBlRGVmICpSQ0NfQ2xvY2tzKTsKK3VpbnQzMl90IExMX1JDQ19HZXRVU0FSVENsb2NrRnJlcSh1aW50MzJfdCBVU0FSVHhTb3VyY2UpOworI2lmIGRlZmluZWQoVUFSVDQpCit1aW50MzJfdCBMTF9SQ0NfR2V0VUFSVENsb2NrRnJlcSh1aW50MzJfdCBVQVJUeFNvdXJjZSk7CisjZW5kaWYgLyogVUFSVDQgKi8KK3VpbnQzMl90IExMX1JDQ19HZXRJMkNDbG9ja0ZyZXEodWludDMyX3QgSTJDeFNvdXJjZSk7Cit1aW50MzJfdCBMTF9SQ0NfR2V0TFBVQVJUQ2xvY2tGcmVxKHVpbnQzMl90IExQVUFSVHhTb3VyY2UpOwordWludDMyX3QgTExfUkNDX0dldExQVElNQ2xvY2tGcmVxKHVpbnQzMl90IExQVElNeFNvdXJjZSk7Cit1aW50MzJfdCBMTF9SQ0NfR2V0U0FJQ2xvY2tGcmVxKHVpbnQzMl90IFNBSXhTb3VyY2UpOwordWludDMyX3QgTExfUkNDX0dldEkyU0Nsb2NrRnJlcSh1aW50MzJfdCBJMlN4U291cmNlKTsKKyNpZiBkZWZpbmVkKEZEQ0FOMSkKK3VpbnQzMl90IExMX1JDQ19HZXRGRENBTkNsb2NrRnJlcSh1aW50MzJfdCBGRENBTnhTb3VyY2UpOworI2VuZGlmIC8qIEZEQ0FOMSAqLwordWludDMyX3QgTExfUkNDX0dldFJOR0Nsb2NrRnJlcSh1aW50MzJfdCBSTkd4U291cmNlKTsKK3VpbnQzMl90IExMX1JDQ19HZXRVU0JDbG9ja0ZyZXEodWludDMyX3QgVVNCeFNvdXJjZSk7Cit1aW50MzJfdCBMTF9SQ0NfR2V0QURDQ2xvY2tGcmVxKHVpbnQzMl90IEFEQ3hTb3VyY2UpOworI2lmIGRlZmluZWQoUVVBRFNQSSkKK3VpbnQzMl90IExMX1JDQ19HZXRRVUFEU1BJQ2xvY2tGcmVxKHVpbnQzMl90IFFVQURTUEl4U291cmNlKTsKKyNlbmRpZiAvKiBRVUFEU1BJICovCisvKioKKyAqIEB9CisgKi8KKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyRzR4eF9MTF9SQ0NfSCAqLwpkaWZmIC0tZ2l0IGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfbGxfc3BpLmggYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9sbF9zcGkuaAppbmRleCA2YzQxNzcyLi40N2JhMWM4IDEwMDY0NAotLS0gYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9sbF9zcGkuaAorKysgYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9sbF9zcGkuaApAQCAtMSwyMzQxICsxLDIzNDEgQEAKLS8qKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBAZmlsZSAgICBzdG0zMmc0eHhfbGxfc3BpLmgNCi0gKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQ0KLSAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFNQSSBMTCBtb2R1bGUuDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEBhdHRlbnRpb24NCi0gKg0KLSAqIENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4NCi0gKg0KLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGVybXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZQ0KLSAqIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4NCi0gKiBJZiBubyBMSUNFTlNFIGZpbGUgY29tZXMgd2l0aCB0aGlzIHNvZnR3YXJlLCBpdCBpcyBwcm92aWRlZCBBUy1JUy4NCi0gKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKi8NCi0NCi0vKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpZm5kZWYgU1RNMzJHNHh4X0xMX1NQSV9IDQotI2RlZmluZSBTVE0zMkc0eHhfTExfU1BJX0gNCi0NCi0jaWZkZWYgX19jcGx1c3BsdXMNCi1leHRlcm4gIkMiIHsNCi0jZW5kaWYNCi0NCi0vKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpbmNsdWRlICJzdG0zMmc0eHguaCINCi0NCi0vKiogQGFkZHRvZ3JvdXAgU1RNMzJHNHh4X0xMX0RyaXZlcg0KLSAqIEB7DQotICovDQotDQotI2lmIGRlZmluZWQoU1BJMSkgfHwgZGVmaW5lZChTUEkyKSB8fCBkZWZpbmVkKFNQSTMpIHx8IGRlZmluZWQoU1BJNCkNCi0NCi0vKiogQGRlZmdyb3VwIFNQSV9MTCBTUEkNCi0gKiBAew0KLSAqLw0KLQ0KLS8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLQ0KLS8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQ0KLS8qKiBAZGVmZ3JvdXAgU1BJX0xMX0VTX0lOSVQgU1BJIEV4cG9ydGVkIEluaXQgc3RydWN0dXJlDQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNQSSBJbml0IHN0cnVjdHVyZXMgZGVmaW5pdGlvbg0KLSAqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gIHVpbnQzMl90IFRyYW5zZmVyRGlyZWN0aW9uOyAvKiE8IFNwZWNpZmllcyB0aGUgU1BJIHVuaWRpcmVjdGlvbmFsIG9yDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkaXJlY3Rpb25hbCBkYXRhIG1vZGUuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgdmFsdWUgb2YgQHJlZiBTUElfTExfRUNfVFJBTlNGRVJfTU9ERS4NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRhcnkgZnVuY3Rpb24gQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX1NQSV9TZXRUcmFuc2ZlckRpcmVjdGlvbigpLiovDQotDQotICB1aW50MzJfdCBNb2RlOyAvKiE8IFNwZWNpZmllcyB0aGUgU1BJIG1vZGUgKE1hc3Rlci9TbGF2ZSkuDQotICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU1BJX0xMX0VDX01PREUuDQotDQotICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5DQotICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBAcmVmIExMX1NQSV9TZXRNb2RlKCkuKi8NCi0NCi0gIHVpbnQzMl90DQotICAgICAgRGF0YVdpZHRoOyAvKiE8IFNwZWNpZmllcyB0aGUgU1BJIGRhdGEgd2lkdGguDQotICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU1BJX0xMX0VDX0RBVEFXSURUSC4NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkNCi0gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEByZWYgTExfU1BJX1NldERhdGFXaWR0aCgpLiovDQotDQotICB1aW50MzJfdCBDbG9ja1BvbGFyaXR5OyAvKiE8IFNwZWNpZmllcyB0aGUgc2VyaWFsIGNsb2NrIHN0ZWFkeSBzdGF0ZS4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BJX0xMX0VDX1BPTEFSSVRZLg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9TUElfU2V0Q2xvY2tQb2xhcml0eSgpLiovDQotDQotICB1aW50MzJfdA0KLSAgICAgIENsb2NrUGhhc2U7IC8qITwgU3BlY2lmaWVzIHRoZSBjbG9jayBhY3RpdmUgZWRnZSBmb3IgdGhlIGJpdCBjYXB0dXJlLg0KLSAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfTExfRUNfUEhBU0UuDQotDQotICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeQ0KLSAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEByZWYgTExfU1BJX1NldENsb2NrUGhhc2UoKS4qLw0KLQ0KLSAgdWludDMyX3QgTlNTOyAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBOU1Mgc2lnbmFsIGlzIG1hbmFnZWQgYnkgaGFyZHdhcmUNCi0gICAgICAgICAgICAgICAgICAgKE5TUyBwaW4pIG9yIGJ5IHNvZnR3YXJlIHVzaW5nIHRoZSBTU0kgYml0LiBUaGlzIHBhcmFtZXRlcg0KLSAgICAgICAgICAgICAgICAgICBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9MTF9FQ19OU1NfTU9ERS4NCi0NCi0gICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeQ0KLSAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBAcmVmIExMX1NQSV9TZXROU1NNb2RlKCkuKi8NCi0NCi0gIHVpbnQzMl90DQotICAgICAgQmF1ZFJhdGU7IC8qITwgU3BlY2lmaWVzIHRoZSBCYXVkUmF0ZSBwcmVzY2FsZXIgdmFsdWUgd2hpY2ggd2lsbCBiZSB1c2VkDQotICAgICAgICAgICAgICAgICAgIHRvIGNvbmZpZ3VyZSB0aGUgdHJhbnNtaXQgYW5kIHJlY2VpdmUgU0NLIGNsb2NrLiBUaGlzDQotICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9MTF9FQ19CQVVEUkFURVBSRVNDQUxFUi4NCi0gICAgICAgICAgICAgICAgICAgICBAbm90ZSBUaGUgY29tbXVuaWNhdGlvbiBjbG9jayBpcyBkZXJpdmVkIGZyb20gdGhlIG1hc3Rlcg0KLSAgICAgICAgICAgICAgICAgICBjbG9jay4gVGhlIHNsYXZlIGNsb2NrIGRvZXMgbm90IG5lZWQgdG8gYmUgc2V0Lg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5DQotICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEByZWYgTExfU1BJX1NldEJhdWRSYXRlUHJlc2NhbGVyKCkuKi8NCi0NCi0gIHVpbnQzMl90DQotICAgICAgQml0T3JkZXI7IC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgZGF0YSB0cmFuc2ZlcnMgc3RhcnQgZnJvbSBNU0Igb3IgTFNCIGJpdC4NCi0gICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9MTF9FQ19CSVRfT1JERVIuDQotDQotICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkNCi0gICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gQHJlZiBMTF9TUElfU2V0VHJhbnNmZXJCaXRPcmRlcigpLiovDQotDQotICB1aW50MzJfdCBDUkNDYWxjdWxhdGlvbjsgLyohPCBTcGVjaWZpZXMgaWYgdGhlIENSQyBjYWxjdWxhdGlvbiBpcyBlbmFibGVkIG9yDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90LiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BJX0xMX0VDX0NSQ19DQUxDVUxBVElPTi4NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRhcnkgZnVuY3Rpb25zIEByZWYgTExfU1BJX0VuYWJsZUNSQygpIGFuZCBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfU1BJX0Rpc2FibGVDUkMoKS4qLw0KLQ0KLSAgdWludDMyX3QgQ1JDUG9seTsgLyohPCBTcGVjaWZpZXMgdGhlIHBvbHlub21pYWwgdXNlZCBmb3IgdGhlIENSQyBjYWxjdWxhdGlvbi4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMA0KLSAgICAgICAgICAgICAgICAgICAgICAgYW5kIE1heF9EYXRhID0gMHhGRkZGLg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeQ0KLSAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gQHJlZiBMTF9TUElfU2V0Q1JDUG9seW5vbWlhbCgpLiovDQotDQotfSBMTF9TUElfSW5pdFR5cGVEZWY7DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0jZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovDQotDQotLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGRlZmdyb3VwIFNQSV9MTF9FeHBvcnRlZF9Db25zdGFudHMgU1BJIEV4cG9ydGVkIENvbnN0YW50cw0KLSAqIEB7DQotICovDQotDQotLyoqIEBkZWZncm91cCBTUElfTExfRUNfR0VUX0ZMQUcgR2V0IEZsYWdzIERlZmluZXMNCi0gKiBAYnJpZWYgICAgRmxhZ3MgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX1NQSV9SZWFkUmVnIGZ1bmN0aW9uDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1NQSV9TUl9SWE5FIFNQSV9TUl9SWE5FICAgICAvKiE8IFJ4IGJ1ZmZlciBub3QgZW1wdHkgZmxhZyAgICAgICAgICovDQotI2RlZmluZSBMTF9TUElfU1JfVFhFIFNQSV9TUl9UWEUgICAgICAgLyohPCBUeCBidWZmZXIgZW1wdHkgZmxhZyAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfU1BJX1NSX0JTWSBTUElfU1JfQlNZICAgICAgIC8qITwgQnVzeSBmbGFnICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX1NQSV9TUl9DUkNFUlIgU1BJX1NSX0NSQ0VSUiAvKiE8IENSQyBlcnJvciBmbGFnICovDQotI2RlZmluZSBMTF9TUElfU1JfTU9ERiBTUElfU1JfTU9ERiAgICAgLyohPCBNb2RlIGZhdWx0IGZsYWcgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfU1BJX1NSX09WUiBTUElfU1JfT1ZSICAgICAgIC8qITwgT3ZlcnJ1biBmbGFnICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX1NQSV9TUl9GUkUgU1BJX1NSX0ZSRSAgICAgICAvKiE8IFRJIG1vZGUgZnJhbWUgZm9ybWF0IGVycm9yIGZsYWcgICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFNQSV9MTF9FQ19JVCBJVCBEZWZpbmVzDQotICogQGJyaWVmICAgIElUIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9TUElfUmVhZFJlZyBhbmQNCi0gKiBMTF9TUElfV3JpdGVSZWcgZnVuY3Rpb25zDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1NQSV9DUjJfUlhORUlFIFwNCi0gIFNQSV9DUjJfUlhORUlFIC8qITwgUnggYnVmZmVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQgZW5hYmxlICovDQotI2RlZmluZSBMTF9TUElfQ1IyX1RYRUlFIFwNCi0gIFNQSV9DUjJfVFhFSUUgLyohPCBUeCBidWZmZXIgZW1wdHkgaW50ZXJydXB0IGVuYWJsZSAgICAgKi8NCi0jZGVmaW5lIExMX1NQSV9DUjJfRVJSSUUgXA0KLSAgU1BJX0NSMl9FUlJJRSAvKiE8IEVycm9yIGludGVycnVwdCBlbmFibGUgICAgICAgICAgICAgICAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBTUElfTExfRUNfTU9ERSBPcGVyYXRpb24gTW9kZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9TUElfTU9ERV9NQVNURVIgXA0KLSAgKFNQSV9DUjFfTVNUUiB8IFNQSV9DUjFfU1NJKSAgICAgICAgLyohPCBNYXN0ZXIgY29uZmlndXJhdGlvbiAgKi8NCi0jZGVmaW5lIExMX1NQSV9NT0RFX1NMQVZFIDB4MDAwMDAwMDBVIC8qITwgU2xhdmUgY29uZmlndXJhdGlvbiAgICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFNQSV9MTF9FQ19QUk9UT0NPTCBTZXJpYWwgUHJvdG9jb2wNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfU1BJX1BST1RPQ09MX01PVE9ST0xBIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgTW90b3JvbGEgbW9kZS4gVXNlZCBhcyBkZWZhdWx0IHZhbHVlICovDQotI2RlZmluZSBMTF9TUElfUFJPVE9DT0xfVEkgXA0KLSAgKFNQSV9DUjJfRlJGKSAvKiE8IFRJIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBTUElfTExfRUNfUEhBU0UgQ2xvY2sgUGhhc2UNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfU1BJX1BIQVNFXzFFREdFIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgRmlyc3QgY2xvY2sgdHJhbnNpdGlvbiBpcyB0aGUgZmlyc3QgZGF0YSBjYXB0dXJlIGVkZ2UgICovDQotI2RlZmluZSBMTF9TUElfUEhBU0VfMkVER0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoU1BJX0NSMV9DUEhBKSAvKiE8IFNlY29uZCBjbG9jayB0cmFuc2l0aW9uIGlzIHRoZSBmaXJzdCBkYXRhIGNhcHR1cmUgZWRnZSBcDQotICAgICAgICAgICAgICAgICAgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgU1BJX0xMX0VDX1BPTEFSSVRZIENsb2NrIFBvbGFyaXR5DQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1NQSV9QT0xBUklUWV9MT1cgMHgwMDAwMDAwMFUgICAgIC8qITwgQ2xvY2sgdG8gMCB3aGVuIGlkbGUgKi8NCi0jZGVmaW5lIExMX1NQSV9QT0xBUklUWV9ISUdIIChTUElfQ1IxX0NQT0wpIC8qITwgQ2xvY2sgdG8gMSB3aGVuIGlkbGUgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgU1BJX0xMX0VDX0JBVURSQVRFUFJFU0NBTEVSIEJhdWQgUmF0ZSBQcmVzY2FsZXINCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjIgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBCYXVkUmF0ZSBjb250cm9sIGVxdWFsIHRvIGZQQ0xLLzIgICAqLw0KLSNkZWZpbmUgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjQgXA0KLSAgKFNQSV9DUjFfQlJfMCkgLyohPCBCYXVkUmF0ZSBjb250cm9sIGVxdWFsIHRvIGZQQ0xLLzQgICAqLw0KLSNkZWZpbmUgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjggXA0KLSAgKFNQSV9DUjFfQlJfMSkgLyohPCBCYXVkUmF0ZSBjb250cm9sIGVxdWFsIHRvIGZQQ0xLLzggICAqLw0KLSNkZWZpbmUgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjE2IFwNCi0gIChTUElfQ1IxX0JSXzEgfCBTUElfQ1IxX0JSXzApIC8qITwgQmF1ZFJhdGUgY29udHJvbCBlcXVhbCB0byBmUENMSy8xNiAgKi8NCi0jZGVmaW5lIExMX1NQSV9CQVVEUkFURVBSRVNDQUxFUl9ESVYzMiBcDQotICAoU1BJX0NSMV9CUl8yKSAvKiE8IEJhdWRSYXRlIGNvbnRyb2wgZXF1YWwgdG8gZlBDTEsvMzIgICovDQotI2RlZmluZSBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWNjQgXA0KLSAgKFNQSV9DUjFfQlJfMiB8IFNQSV9DUjFfQlJfMCkgLyohPCBCYXVkUmF0ZSBjb250cm9sIGVxdWFsIHRvIGZQQ0xLLzY0ICAqLw0KLSNkZWZpbmUgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjEyOCBcDQotICAoU1BJX0NSMV9CUl8yIHwgU1BJX0NSMV9CUl8xKSAvKiE8IEJhdWRSYXRlIGNvbnRyb2wgZXF1YWwgdG8gZlBDTEsvMTI4ICovDQotI2RlZmluZSBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWMjU2IFwNCi0gIChTUElfQ1IxX0JSXzIgfCBTUElfQ1IxX0JSXzEgfCAgICAgICAgXA0KLSAgIFNQSV9DUjFfQlJfMCkgLyohPCBCYXVkUmF0ZSBjb250cm9sIGVxdWFsIHRvIGZQQ0xLLzI1NiAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBTUElfTExfRUNfQklUX09SREVSIFRyYW5zbWlzc2lvbiBCaXQgT3JkZXINCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfU1BJX0xTQl9GSVJTVCBcDQotICAoU1BJX0NSMV9MU0JGSVJTVCkgLyohPCBEYXRhIGlzIHRyYW5zbWl0dGVkL3JlY2VpdmVkIHdpdGggdGhlIExTQiBmaXJzdCAqLw0KLSNkZWZpbmUgTExfU1BJX01TQl9GSVJTVCBcDQotICAweDAwMDAwMDAwVSAvKiE8IERhdGEgaXMgdHJhbnNtaXR0ZWQvcmVjZWl2ZWQgd2l0aCB0aGUgTVNCIGZpcnN0ICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFNQSV9MTF9FQ19UUkFOU0ZFUl9NT0RFIFRyYW5zZmVyIE1vZGUNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfU1BJX0ZVTExfRFVQTEVYIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgRnVsbC1EdXBsZXggbW9kZS4gUnggYW5kIFR4IHRyYW5zZmVyIG9uIDIgbGluZXMgKi8NCi0jZGVmaW5lIExMX1NQSV9TSU1QTEVYX1JYIFwNCi0gIChTUElfQ1IxX1JYT05MWSkgLyohPCBTaW1wbGV4IFJ4IG1vZGUuICBSeCB0cmFuc2ZlciBvbmx5IG9uIDEgbGluZSAgICAqLw0KLSNkZWZpbmUgTExfU1BJX0hBTEZfRFVQTEVYX1JYIFwNCi0gIChTUElfQ1IxX0JJRElNT0RFKSAvKiE8IEhhbGYtRHVwbGV4IFJ4IG1vZGUuIFJ4IHRyYW5zZmVyIG9uIDEgbGluZSAgICAgICovDQotI2RlZmluZSBMTF9TUElfSEFMRl9EVVBMRVhfVFggXA0KLSAgKFNQSV9DUjFfQklESU1PREUgfCAgICAgICAgIFwNCi0gICBTUElfQ1IxX0JJRElPRSkgLyohPCBIYWxmLUR1cGxleCBUeCBtb2RlLiBUeCB0cmFuc2ZlciBvbiAxIGxpbmUgICAgICAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBTUElfTExfRUNfTlNTX01PREUgU2xhdmUgU2VsZWN0IFBpbiBNb2RlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1NQSV9OU1NfU09GVCBcDQotICAoU1BJX0NSMV9TU00pIC8qITwgTlNTIG1hbmFnZWQgaW50ZXJuYWxseS4gTlNTIHBpbiBub3QgdXNlZCBhbmQgZnJlZSAqLw0KLSNkZWZpbmUgTExfU1BJX05TU19IQVJEX0lOUFVUIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgTlNTIHBpbiB1c2VkIGluIElucHV0LiBPbmx5IHVzZWQgaW4gTWFzdGVyIG1vZGUgKi8NCi0jZGVmaW5lIExMX1NQSV9OU1NfSEFSRF9PVVRQVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKCh1aW50MzJfdClTUElfQ1IyX1NTT0UgPDwgMTZVKSkgLyohPCBOU1MgcGluIHVzZWQgaW4gT3V0cHV0LiBPbmx5IHVzZWQgaW4gXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsYXZlIG1vZGUgYXMgY2hpcCBzZWxlY3QgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgU1BJX0xMX0VDX0RBVEFXSURUSCBEYXRhd2lkdGgNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfU1BJX0RBVEFXSURUSF80QklUIFwNCi0gIChTUElfQ1IyX0RTXzAgfCBTUElfQ1IyX0RTXzEpIC8qITwgRGF0YSBsZW5ndGggZm9yIFNQSSB0cmFuc2ZlcjogIDQgYml0cyAqLw0KLSNkZWZpbmUgTExfU1BJX0RBVEFXSURUSF81QklUIFwNCi0gIChTUElfQ1IyX0RTXzIpIC8qITwgRGF0YSBsZW5ndGggZm9yIFNQSSB0cmFuc2ZlcjogIDUgYml0cyAqLw0KLSNkZWZpbmUgTExfU1BJX0RBVEFXSURUSF82QklUIFwNCi0gIChTUElfQ1IyX0RTXzIgfCBTUElfQ1IyX0RTXzApIC8qITwgRGF0YSBsZW5ndGggZm9yIFNQSSB0cmFuc2ZlcjogIDYgYml0cyAqLw0KLSNkZWZpbmUgTExfU1BJX0RBVEFXSURUSF83QklUIFwNCi0gIChTUElfQ1IyX0RTXzIgfCBTUElfQ1IyX0RTXzEpIC8qITwgRGF0YSBsZW5ndGggZm9yIFNQSSB0cmFuc2ZlcjogIDcgYml0cyAqLw0KLSNkZWZpbmUgTExfU1BJX0RBVEFXSURUSF84QklUICAgIFwNCi0gIChTUElfQ1IyX0RTXzIgfCBTUElfQ1IyX0RTXzEgfCBcDQotICAgU1BJX0NSMl9EU18wKSAvKiE8IERhdGEgbGVuZ3RoIGZvciBTUEkgdHJhbnNmZXI6ICA4IGJpdHMgKi8NCi0jZGVmaW5lIExMX1NQSV9EQVRBV0lEVEhfOUJJVCBcDQotICAoU1BJX0NSMl9EU18zKSAvKiE8IERhdGEgbGVuZ3RoIGZvciBTUEkgdHJhbnNmZXI6ICA5IGJpdHMgKi8NCi0jZGVmaW5lIExMX1NQSV9EQVRBV0lEVEhfMTBCSVQgXA0KLSAgKFNQSV9DUjJfRFNfMyB8IFNQSV9DUjJfRFNfMCkgLyohPCBEYXRhIGxlbmd0aCBmb3IgU1BJIHRyYW5zZmVyOiAxMCBiaXRzICovDQotI2RlZmluZSBMTF9TUElfREFUQVdJRFRIXzExQklUIFwNCi0gIChTUElfQ1IyX0RTXzMgfCBTUElfQ1IyX0RTXzEpIC8qITwgRGF0YSBsZW5ndGggZm9yIFNQSSB0cmFuc2ZlcjogMTEgYml0cyAqLw0KLSNkZWZpbmUgTExfU1BJX0RBVEFXSURUSF8xMkJJVCAgIFwNCi0gIChTUElfQ1IyX0RTXzMgfCBTUElfQ1IyX0RTXzEgfCBcDQotICAgU1BJX0NSMl9EU18wKSAvKiE8IERhdGEgbGVuZ3RoIGZvciBTUEkgdHJhbnNmZXI6IDEyIGJpdHMgKi8NCi0jZGVmaW5lIExMX1NQSV9EQVRBV0lEVEhfMTNCSVQgXA0KLSAgKFNQSV9DUjJfRFNfMyB8IFNQSV9DUjJfRFNfMikgLyohPCBEYXRhIGxlbmd0aCBmb3IgU1BJIHRyYW5zZmVyOiAxMyBiaXRzICovDQotI2RlZmluZSBMTF9TUElfREFUQVdJRFRIXzE0QklUICAgXA0KLSAgKFNQSV9DUjJfRFNfMyB8IFNQSV9DUjJfRFNfMiB8IFwNCi0gICBTUElfQ1IyX0RTXzApIC8qITwgRGF0YSBsZW5ndGggZm9yIFNQSSB0cmFuc2ZlcjogMTQgYml0cyAqLw0KLSNkZWZpbmUgTExfU1BJX0RBVEFXSURUSF8xNUJJVCAgIFwNCi0gIChTUElfQ1IyX0RTXzMgfCBTUElfQ1IyX0RTXzIgfCBcDQotICAgU1BJX0NSMl9EU18xKSAvKiE8IERhdGEgbGVuZ3RoIGZvciBTUEkgdHJhbnNmZXI6IDE1IGJpdHMgKi8NCi0jZGVmaW5lIExMX1NQSV9EQVRBV0lEVEhfMTZCSVQgICAgICAgICAgICAgICAgICBcDQotICAoU1BJX0NSMl9EU18zIHwgU1BJX0NSMl9EU18yIHwgU1BJX0NSMl9EU18xIHwgXA0KLSAgIFNQSV9DUjJfRFNfMCkgLyohPCBEYXRhIGxlbmd0aCBmb3IgU1BJIHRyYW5zZmVyOiAxNiBiaXRzICovDQotLyoqDQotICogQH0NCi0gKi8NCi0jaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpDQotDQotLyoqIEBkZWZncm91cCBTUElfTExfRUNfQ1JDX0NBTENVTEFUSU9OIENSQyBDYWxjdWxhdGlvbg0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9TUElfQ1JDQ0FMQ1VMQVRJT05fRElTQUJMRSBcDQotICAweDAwMDAwMDAwVSAvKiE8IENSQyBjYWxjdWxhdGlvbiBkaXNhYmxlZCAqLw0KLSNkZWZpbmUgTExfU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSBcDQotICAoU1BJX0NSMV9DUkNFTikgLyohPCBDUkMgY2FsY3VsYXRpb24gZW5hYmxlZCAgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLSNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8NCi0NCi0vKiogQGRlZmdyb3VwIFNQSV9MTF9FQ19DUkNfTEVOR1RIIENSQyBMZW5ndGgNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfU1BJX0NSQ184QklUIDB4MDAwMDAwMDBVICAgICAvKiE8ICA4LWJpdCBDUkMgbGVuZ3RoICovDQotI2RlZmluZSBMTF9TUElfQ1JDXzE2QklUIChTUElfQ1IxX0NSQ0wpIC8qITwgMTYtYml0IENSQyBsZW5ndGggKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgU1BJX0xMX0VDX1JYX0ZJRk9fVEggUlggRklGTyBUaHJlc2hvbGQNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfU1BJX1JYX0ZJRk9fVEhfSEFMRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAweDAwMDAwMDAwVSAvKiE8IFJYTkUgZXZlbnQgaXMgZ2VuZXJhdGVkIGlmIEZJRk8gbGV2ZWwgaXMgZ3JlYXRlciB0aGFuIG9yIFwNCi0gICAgICAgICAgICAgICAgIGVxdWFsIHRvIDEvMiAoMTYtYml0KSAqLw0KLSNkZWZpbmUgTExfU1BJX1JYX0ZJRk9fVEhfUVVBUlRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKFNQSV9DUjJfRlJYVEgpIC8qITwgUlhORSBldmVudCBpcyBnZW5lcmF0ZWQgaWYgRklGTyBsZXZlbCBpcyBncmVhdGVyIHRoYW4gXA0KLSAgICAgICAgICAgICAgICAgICAgIG9yIGVxdWFsIHRvIDEvNCAoOC1iaXQpICAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBTUElfTExfRUNfUlhfRklGTyBSWCBGSUZPIExldmVsDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1NQSV9SWF9GSUZPX0VNUFRZIDB4MDAwMDAwMDBVIC8qITwgRklGTyByZWNlcHRpb24gZW1wdHkgKi8NCi0jZGVmaW5lIExMX1NQSV9SWF9GSUZPX1FVQVJURVJfRlVMTCBcDQotICAoU1BJX1NSX0ZSTFZMXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEZJRk8gcmVjZXB0aW9uIDEvNCAgICovDQotI2RlZmluZSBMTF9TUElfUlhfRklGT19IQUxGX0ZVTEwgKFNQSV9TUl9GUkxWTF8xKSAvKiE8IEZJRk8gcmVjZXB0aW9uIDEvMiAgICovDQotI2RlZmluZSBMTF9TUElfUlhfRklGT19GVUxMIFwNCi0gIChTUElfU1JfRlJMVkxfMSB8IFNQSV9TUl9GUkxWTF8wKSAvKiE8IEZJRk8gcmVjZXB0aW9uIGZ1bGwgICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFNQSV9MTF9FQ19UWF9GSUZPIFRYIEZJRk8gTGV2ZWwNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfU1BJX1RYX0ZJRk9fRU1QVFkgMHgwMDAwMDAwMFUgLyohPCBGSUZPIHRyYW5zbWlzc2lvbiBlbXB0eSAqLw0KLSNkZWZpbmUgTExfU1BJX1RYX0ZJRk9fUVVBUlRFUl9GVUxMIFwNCi0gIChTUElfU1JfRlRMVkxfMCkgLyohPCBGSUZPIHRyYW5zbWlzc2lvbiAxLzQgICAqLw0KLSNkZWZpbmUgTExfU1BJX1RYX0ZJRk9fSEFMRl9GVUxMIFwNCi0gIChTUElfU1JfRlRMVkxfMSkgLyohPCBGSUZPIHRyYW5zbWlzc2lvbiAxLzIgICAqLw0KLSNkZWZpbmUgTExfU1BJX1RYX0ZJRk9fRlVMTCBcDQotICAoU1BJX1NSX0ZUTFZMXzEgfCBTUElfU1JfRlRMVkxfMCkgLyohPCBGSUZPIHRyYW5zbWlzc2lvbiBmdWxsICAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBTUElfTExfRUNfRE1BX1BBUklUWSBETUEgUGFyaXR5DQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1NQSV9ETUFfUEFSSVRZX0VWRU4gMHgwMDAwMDAwMFUgLyohPCBTZWxlY3QgRE1BIHBhcml0eSBFdmVuICovDQotI2RlZmluZSBMTF9TUElfRE1BX1BBUklUWV9PREQgMHgwMDAwMDAwMVUgIC8qITwgU2VsZWN0IERNQSBwYXJpdHkgT2RkICAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgU1BJX0xMX0V4cG9ydGVkX01hY3JvcyBTUEkgRXhwb3J0ZWQgTWFjcm9zDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFNQSV9MTF9FTV9XUklURV9SRUFEIENvbW1vbiBXcml0ZSBhbmQgcmVhZCByZWdpc3RlcnMgTWFjcm9zDQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFdyaXRlIGEgdmFsdWUgaW4gU1BJIHJlZ2lzdGVyDQotICogQHBhcmFtICBfX0lOU1RBTkNFX18gU1BJIEluc3RhbmNlDQotICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHdyaXR0ZW4NCi0gKiBAcGFyYW0gIF9fVkFMVUVfXyBWYWx1ZSB0byBiZSB3cml0dGVuIGluIHRoZSByZWdpc3Rlcg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgTExfU1BJX1dyaXRlUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXywgX19WQUxVRV9fKSBcDQotICBXUklURV9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fLCAoX19WQUxVRV9fKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJlYWQgYSB2YWx1ZSBpbiBTUEkgcmVnaXN0ZXINCi0gKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBTUEkgSW5zdGFuY2UNCi0gKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgcmVhZA0KLSAqIEByZXR2YWwgUmVnaXN0ZXIgdmFsdWUNCi0gKi8NCi0jZGVmaW5lIExMX1NQSV9SZWFkUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXykgUkVBRF9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fKQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgU1BJX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucyBTUEkgRXhwb3J0ZWQgRnVuY3Rpb25zDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFNQSV9MTF9FRl9Db25maWd1cmF0aW9uIENvbmZpZ3VyYXRpb24NCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIFNQSSBwZXJpcGhlcmFsDQotICogQHJtdG9sbCBDUjEgICAgICAgICAgU1BFICAgICAgICAgICBMTF9TUElfRW5hYmxlDQotICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9FbmFibGUoU1BJX1R5cGVEZWYgKlNQSXgpIHsNCi0gIFNFVF9CSVQoU1BJeC0+Q1IxLCBTUElfQ1IxX1NQRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBTUEkgcGVyaXBoZXJhbA0KLSAqIEBub3RlICAgV2hlbiBkaXNhYmxpbmcgdGhlIFNQSSwgZm9sbG93IHRoZSBwcm9jZWR1cmUgZGVzY3JpYmVkIGluIHRoZQ0KLSAqIFJlZmVyZW5jZSBNYW51YWwuDQotICogQHJtdG9sbCBDUjEgICAgICAgICAgU1BFICAgICAgICAgICBMTF9TUElfRGlzYWJsZQ0KLSAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfRGlzYWJsZShTUElfVHlwZURlZiAqU1BJeCkgew0KLSAgQ0xFQVJfQklUKFNQSXgtPkNSMSwgU1BJX0NSMV9TUEUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIGlmIFNQSSBwZXJpcGhlcmFsIGlzIGVuYWJsZWQNCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBTUEUgICAgICAgICAgIExMX1NQSV9Jc0VuYWJsZWQNCi0gKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9Jc0VuYWJsZWQoU1BJX1R5cGVEZWYgKlNQSXgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFNQSXgtPkNSMSwgU1BJX0NSMV9TUEUpID09IChTUElfQ1IxX1NQRSkpID8gMVVMIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZXQgU1BJIG9wZXJhdGlvbiBtb2RlIHRvIE1hc3RlciBvciBTbGF2ZQ0KLSAqIEBub3RlICAgVGhpcyBiaXQgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkIHdoZW4gY29tbXVuaWNhdGlvbiBpcyBvbmdvaW5nLg0KLSAqIEBybXRvbGwgQ1IxICAgICAgICAgIE1TVFIgICAgICAgICAgTExfU1BJX1NldE1vZGVcbg0KLSAqICAgICAgICAgQ1IxICAgICAgICAgIFNTSSAgICAgICAgICAgTExfU1BJX1NldE1vZGUNCi0gKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlDQotICogQHBhcmFtICBNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX01PREVfTUFTVEVSDQotICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX01PREVfU0xBVkUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfU2V0TW9kZShTUElfVHlwZURlZiAqU1BJeCwgdWludDMyX3QgTW9kZSkgew0KLSAgTU9ESUZZX1JFRyhTUEl4LT5DUjEsIFNQSV9DUjFfTVNUUiB8IFNQSV9DUjFfU1NJLCBNb2RlKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgU1BJIG9wZXJhdGlvbiBtb2RlIChNYXN0ZXIgb3IgU2xhdmUpDQotICogQHJtdG9sbCBDUjEgICAgICAgICAgTVNUUiAgICAgICAgICBMTF9TUElfR2V0TW9kZVxuDQotICogICAgICAgICBDUjEgICAgICAgICAgU1NJICAgICAgICAgICBMTF9TUElfR2V0TW9kZQ0KLSAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX01PREVfTUFTVEVSDQotICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX01PREVfU0xBVkUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0dldE1vZGUoU1BJX1R5cGVEZWYgKlNQSXgpIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFNQSXgtPkNSMSwgU1BJX0NSMV9NU1RSIHwgU1BJX0NSMV9TU0kpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZXQgc2VyaWFsIHByb3RvY29sIHVzZWQNCi0gKiBAbm90ZSAgIFRoaXMgYml0IHNob3VsZCBiZSB3cml0dGVuIG9ubHkgd2hlbiBTUEkgaXMgZGlzYWJsZWQgKFNQRSA9IDApIGZvcg0KLSAqIGNvcnJlY3Qgb3BlcmF0aW9uLg0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgIEZSRiAgICAgICAgICAgTExfU1BJX1NldFN0YW5kYXJkDQotICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQ0KLSAqIEBwYXJhbSAgU3RhbmRhcmQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfUFJPVE9DT0xfTU9UT1JPTEENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfUFJPVE9DT0xfVEkNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfU2V0U3RhbmRhcmQoU1BJX1R5cGVEZWYgKlNQSXgsIHVpbnQzMl90IFN0YW5kYXJkKSB7DQotICBNT0RJRllfUkVHKFNQSXgtPkNSMiwgU1BJX0NSMl9GUkYsIFN0YW5kYXJkKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgc2VyaWFsIHByb3RvY29sIHVzZWQNCi0gKiBAcm10b2xsIENSMiAgICAgICAgICBGUkYgICAgICAgICAgIExMX1NQSV9HZXRTdGFuZGFyZA0KLSAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX1BST1RPQ09MX01PVE9ST0xBDQotICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX1BST1RPQ09MX1RJDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9HZXRTdGFuZGFyZChTUElfVHlwZURlZiAqU1BJeCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoU1BJeC0+Q1IyLCBTUElfQ1IyX0ZSRikpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCBjbG9jayBwaGFzZQ0KLSAqIEBub3RlICAgVGhpcyBiaXQgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkIHdoZW4gY29tbXVuaWNhdGlvbiBpcyBvbmdvaW5nLg0KLSAqICAgICAgICAgVGhpcyBiaXQgaXMgbm90IHVzZWQgaW4gU1BJIFRJIG1vZGUuDQotICogQHJtdG9sbCBDUjEgICAgICAgICAgQ1BIQSAgICAgICAgICBMTF9TUElfU2V0Q2xvY2tQaGFzZQ0KLSAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UNCi0gKiBAcGFyYW0gIENsb2NrUGhhc2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfUEhBU0VfMUVER0UNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfUEhBU0VfMkVER0UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfU2V0Q2xvY2tQaGFzZShTUElfVHlwZURlZiAqU1BJeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDbG9ja1BoYXNlKSB7DQotICBNT0RJRllfUkVHKFNQSXgtPkNSMSwgU1BJX0NSMV9DUEhBLCBDbG9ja1BoYXNlKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgY2xvY2sgcGhhc2UNCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBDUEhBICAgICAgICAgIExMX1NQSV9HZXRDbG9ja1BoYXNlDQotICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfUEhBU0VfMUVER0UNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfUEhBU0VfMkVER0UNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0dldENsb2NrUGhhc2UoU1BJX1R5cGVEZWYgKlNQSXgpIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFNQSXgtPkNSMSwgU1BJX0NSMV9DUEhBKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IGNsb2NrIHBvbGFyaXR5DQotICogQG5vdGUgICBUaGlzIGJpdCBzaG91bGQgbm90IGJlIGNoYW5nZWQgd2hlbiBjb21tdW5pY2F0aW9uIGlzIG9uZ29pbmcuDQotICogICAgICAgICBUaGlzIGJpdCBpcyBub3QgdXNlZCBpbiBTUEkgVEkgbW9kZS4NCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBDUE9MICAgICAgICAgIExMX1NQSV9TZXRDbG9ja1BvbGFyaXR5DQotICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQ0KLSAqIEBwYXJhbSAgQ2xvY2tQb2xhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9QT0xBUklUWV9MT1cNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfUE9MQVJJVFlfSElHSA0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9TZXRDbG9ja1BvbGFyaXR5KFNQSV9UeXBlRGVmICpTUEl4LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENsb2NrUG9sYXJpdHkpIHsNCi0gIE1PRElGWV9SRUcoU1BJeC0+Q1IxLCBTUElfQ1IxX0NQT0wsIENsb2NrUG9sYXJpdHkpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBjbG9jayBwb2xhcml0eQ0KLSAqIEBybXRvbGwgQ1IxICAgICAgICAgIENQT0wgICAgICAgICAgTExfU1BJX0dldENsb2NrUG9sYXJpdHkNCi0gKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlDQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9QT0xBUklUWV9MT1cNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfUE9MQVJJVFlfSElHSA0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfR2V0Q2xvY2tQb2xhcml0eShTUElfVHlwZURlZiAqU1BJeCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoU1BJeC0+Q1IxLCBTUElfQ1IxX0NQT0wpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZXQgYmF1ZCByYXRlIHByZXNjYWxlcg0KLSAqIEBub3RlICAgVGhlc2UgYml0cyBzaG91bGQgbm90IGJlIGNoYW5nZWQgd2hlbiBjb21tdW5pY2F0aW9uIGlzIG9uZ29pbmcuIFNQSQ0KLSAqIEJhdWRSYXRlID0gZlBDTEsvUHJlc2NhbGVyLg0KLSAqIEBybXRvbGwgQ1IxICAgICAgICAgIEJSICAgICAgICAgICAgTExfU1BJX1NldEJhdWRSYXRlUHJlc2NhbGVyDQotICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQ0KLSAqIEBwYXJhbSAgQmF1ZFJhdGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9CQVVEUkFURVBSRVNDQUxFUl9ESVY0DQotICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWMTYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWMzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWNjQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWMTI4DQotICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjI1Ng0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9TZXRCYXVkUmF0ZVByZXNjYWxlcihTUElfVHlwZURlZiAqU1BJeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQmF1ZFJhdGUpIHsNCi0gIE1PRElGWV9SRUcoU1BJeC0+Q1IxLCBTUElfQ1IxX0JSLCBCYXVkUmF0ZSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IGJhdWQgcmF0ZSBwcmVzY2FsZXINCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBCUiAgICAgICAgICAgIExMX1NQSV9HZXRCYXVkUmF0ZVByZXNjYWxlcg0KLSAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9CQVVEUkFURVBSRVNDQUxFUl9ESVY4DQotICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjE2DQotICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjMyDQotICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjY0DQotICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjEyOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9CQVVEUkFURVBSRVNDQUxFUl9ESVYyNTYNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0dldEJhdWRSYXRlUHJlc2NhbGVyKFNQSV9UeXBlRGVmICpTUEl4KSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTUEl4LT5DUjEsIFNQSV9DUjFfQlIpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZXQgdHJhbnNmZXIgYml0IG9yZGVyDQotICogQG5vdGUgICBUaGlzIGJpdCBzaG91bGQgbm90IGJlIGNoYW5nZWQgd2hlbiBjb21tdW5pY2F0aW9uIGlzIG9uZ29pbmcuIFRoaXMNCi0gKiBiaXQgaXMgbm90IHVzZWQgaW4gU1BJIFRJIG1vZGUuDQotICogQHJtdG9sbCBDUjEgICAgICAgICAgTFNCRklSU1QgICAgICBMTF9TUElfU2V0VHJhbnNmZXJCaXRPcmRlcg0KLSAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UNCi0gKiBAcGFyYW0gIEJpdE9yZGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0xTQl9GSVJTVA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9NU0JfRklSU1QNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfU2V0VHJhbnNmZXJCaXRPcmRlcihTUElfVHlwZURlZiAqU1BJeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBCaXRPcmRlcikgew0KLSAgTU9ESUZZX1JFRyhTUEl4LT5DUjEsIFNQSV9DUjFfTFNCRklSU1QsIEJpdE9yZGVyKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgdHJhbnNmZXIgYml0IG9yZGVyDQotICogQHJtdG9sbCBDUjEgICAgICAgICAgTFNCRklSU1QgICAgICBMTF9TUElfR2V0VHJhbnNmZXJCaXRPcmRlcg0KLSAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0xTQl9GSVJTVA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9NU0JfRklSU1QNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0dldFRyYW5zZmVyQml0T3JkZXIoU1BJX1R5cGVEZWYgKlNQSXgpIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFNQSXgtPkNSMSwgU1BJX0NSMV9MU0JGSVJTVCkpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCB0cmFuc2ZlciBkaXJlY3Rpb24gbW9kZQ0KLSAqIEBub3RlICAgRm9yIEhhbGYtRHVwbGV4IG1vZGUsIFJ4IERpcmVjdGlvbiBpcyBzZXQgYnkgZGVmYXVsdC4NCi0gKiAgICAgICAgIEluIG1hc3RlciBtb2RlLCB0aGUgTU9TSSBwaW4gaXMgdXNlZCBhbmQgaW4gc2xhdmUgbW9kZSwgdGhlIE1JU08gcGluDQotICogaXMgdXNlZCBmb3IgSGFsZi1EdXBsZXguDQotICogQHJtdG9sbCBDUjEgICAgICAgICAgUlhPTkxZICAgICAgICBMTF9TUElfU2V0VHJhbnNmZXJEaXJlY3Rpb25cbg0KLSAqICAgICAgICAgQ1IxICAgICAgICAgIEJJRElNT0RFICAgICAgTExfU1BJX1NldFRyYW5zZmVyRGlyZWN0aW9uXG4NCi0gKiAgICAgICAgIENSMSAgICAgICAgICBCSURJT0UgICAgICAgIExMX1NQSV9TZXRUcmFuc2ZlckRpcmVjdGlvbg0KLSAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UNCi0gKiBAcGFyYW0gIFRyYW5zZmVyRGlyZWN0aW9uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0ZVTExfRFVQTEVYDQotICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX1NJTVBMRVhfUlgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfSEFMRl9EVVBMRVhfUlgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfSEFMRl9EVVBMRVhfVFgNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfU2V0VHJhbnNmZXJEaXJlY3Rpb24oU1BJX1R5cGVEZWYgKlNQSXgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRyYW5zZmVyRGlyZWN0aW9uKSB7DQotICBNT0RJRllfUkVHKFNQSXgtPkNSMSwgU1BJX0NSMV9SWE9OTFkgfCBTUElfQ1IxX0JJRElNT0RFIHwgU1BJX0NSMV9CSURJT0UsDQotICAgICAgICAgICAgIFRyYW5zZmVyRGlyZWN0aW9uKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgdHJhbnNmZXIgZGlyZWN0aW9uIG1vZGUNCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBSWE9OTFkgICAgICAgIExMX1NQSV9HZXRUcmFuc2ZlckRpcmVjdGlvblxuDQotICogICAgICAgICBDUjEgICAgICAgICAgQklESU1PREUgICAgICBMTF9TUElfR2V0VHJhbnNmZXJEaXJlY3Rpb25cbg0KLSAqICAgICAgICAgQ1IxICAgICAgICAgIEJJRElPRSAgICAgICAgTExfU1BJX0dldFRyYW5zZmVyRGlyZWN0aW9uDQotICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfRlVMTF9EVVBMRVgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfU0lNUExFWF9SWA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9IQUxGX0RVUExFWF9SWA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9IQUxGX0RVUExFWF9UWA0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfR2V0VHJhbnNmZXJEaXJlY3Rpb24oU1BJX1R5cGVEZWYgKlNQSXgpIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKA0KLSAgICAgIFNQSXgtPkNSMSwgU1BJX0NSMV9SWE9OTFkgfCBTUElfQ1IxX0JJRElNT0RFIHwgU1BJX0NSMV9CSURJT0UpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZXQgZnJhbWUgZGF0YSB3aWR0aA0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgIERTICAgICAgICAgICAgTExfU1BJX1NldERhdGFXaWR0aA0KLSAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UNCi0gKiBAcGFyYW0gIERhdGFXaWR0aCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9EQVRBV0lEVEhfNEJJVA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9EQVRBV0lEVEhfNUJJVA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9EQVRBV0lEVEhfNkJJVA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9EQVRBV0lEVEhfN0JJVA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9EQVRBV0lEVEhfOEJJVA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9EQVRBV0lEVEhfOUJJVA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9EQVRBV0lEVEhfMTBCSVQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzExQklUDQotICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0RBVEFXSURUSF8xMkJJVA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9EQVRBV0lEVEhfMTNCSVQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzE0QklUDQotICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0RBVEFXSURUSF8xNUJJVA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9EQVRBV0lEVEhfMTZCSVQNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfU2V0RGF0YVdpZHRoKFNQSV9UeXBlRGVmICpTUEl4LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRGF0YVdpZHRoKSB7DQotICBNT0RJRllfUkVHKFNQSXgtPkNSMiwgU1BJX0NSMl9EUywgRGF0YVdpZHRoKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgZnJhbWUgZGF0YSB3aWR0aA0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgIERTICAgICAgICAgICAgTExfU1BJX0dldERhdGFXaWR0aA0KLSAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0RBVEFXSURUSF80QklUDQotICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0RBVEFXSURUSF81QklUDQotICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0RBVEFXSURUSF82QklUDQotICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0RBVEFXSURUSF83QklUDQotICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0RBVEFXSURUSF84QklUDQotICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0RBVEFXSURUSF85QklUDQotICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0RBVEFXSURUSF8xMEJJVA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9EQVRBV0lEVEhfMTFCSVQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzEyQklUDQotICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0RBVEFXSURUSF8xM0JJVA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9EQVRBV0lEVEhfMTRCSVQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzE1QklUDQotICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0RBVEFXSURUSF8xNkJJVA0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfR2V0RGF0YVdpZHRoKFNQSV9UeXBlRGVmICpTUEl4KSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTUEl4LT5DUjIsIFNQSV9DUjJfRFMpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZXQgdGhyZXNob2xkIG9mIFJYRklGTyB0aGF0IHRyaWdnZXJzIGFuIFJYTkUgZXZlbnQNCi0gKiBAcm10b2xsIENSMiAgICAgICAgICBGUlhUSCAgICAgICAgIExMX1NQSV9TZXRSeEZJRk9UaHJlc2hvbGQNCi0gKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlDQotICogQHBhcmFtICBUaHJlc2hvbGQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfUlhfRklGT19USF9IQUxGDQotICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX1JYX0ZJRk9fVEhfUVVBUlRFUg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9TZXRSeEZJRk9UaHJlc2hvbGQoU1BJX1R5cGVEZWYgKlNQSXgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaHJlc2hvbGQpIHsNCi0gIE1PRElGWV9SRUcoU1BJeC0+Q1IyLCBTUElfQ1IyX0ZSWFRILCBUaHJlc2hvbGQpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCB0aHJlc2hvbGQgb2YgUlhGSUZPIHRoYXQgdHJpZ2dlcnMgYW4gUlhORSBldmVudA0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgIEZSWFRIICAgICAgICAgTExfU1BJX0dldFJ4RklGT1RocmVzaG9sZA0KLSAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX1JYX0ZJRk9fVEhfSEFMRg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9SWF9GSUZPX1RIX1FVQVJURVINCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0dldFJ4RklGT1RocmVzaG9sZChTUElfVHlwZURlZiAqU1BJeCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoU1BJeC0+Q1IyLCBTUElfQ1IyX0ZSWFRIKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBTUElfTExfRUZfQ1JDX01hbmFnZW1lbnQgQ1JDIE1hbmFnZW1lbnQNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIENSQw0KLSAqIEBub3RlICAgVGhpcyBiaXQgc2hvdWxkIGJlIHdyaXR0ZW4gb25seSB3aGVuIFNQSSBpcyBkaXNhYmxlZCAoU1BFID0gMCkgZm9yDQotICogY29ycmVjdCBvcGVyYXRpb24uDQotICogQHJtdG9sbCBDUjEgICAgICAgICAgQ1JDRU4gICAgICAgICBMTF9TUElfRW5hYmxlQ1JDDQotICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9FbmFibGVDUkMoU1BJX1R5cGVEZWYgKlNQSXgpIHsNCi0gIFNFVF9CSVQoU1BJeC0+Q1IxLCBTUElfQ1IxX0NSQ0VOKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIENSQw0KLSAqIEBub3RlICAgVGhpcyBiaXQgc2hvdWxkIGJlIHdyaXR0ZW4gb25seSB3aGVuIFNQSSBpcyBkaXNhYmxlZCAoU1BFID0gMCkgZm9yDQotICogY29ycmVjdCBvcGVyYXRpb24uDQotICogQHJtdG9sbCBDUjEgICAgICAgICAgQ1JDRU4gICAgICAgICBMTF9TUElfRGlzYWJsZUNSQw0KLSAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfRGlzYWJsZUNSQyhTUElfVHlwZURlZiAqU1BJeCkgew0KLSAgQ0xFQVJfQklUKFNQSXgtPkNSMSwgU1BJX0NSMV9DUkNFTik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgQ1JDIGlzIGVuYWJsZWQNCi0gKiBAbm90ZSAgIFRoaXMgYml0IHNob3VsZCBiZSB3cml0dGVuIG9ubHkgd2hlbiBTUEkgaXMgZGlzYWJsZWQgKFNQRSA9IDApIGZvcg0KLSAqIGNvcnJlY3Qgb3BlcmF0aW9uLg0KLSAqIEBybXRvbGwgQ1IxICAgICAgICAgIENSQ0VOICAgICAgICAgTExfU1BJX0lzRW5hYmxlZENSQw0KLSAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0lzRW5hYmxlZENSQyhTUElfVHlwZURlZiAqU1BJeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoU1BJeC0+Q1IxLCBTUElfQ1IxX0NSQ0VOKSA9PSAoU1BJX0NSMV9DUkNFTikpID8gMVVMIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZXQgQ1JDIExlbmd0aA0KLSAqIEBub3RlICAgVGhpcyBiaXQgc2hvdWxkIGJlIHdyaXR0ZW4gb25seSB3aGVuIFNQSSBpcyBkaXNhYmxlZCAoU1BFID0gMCkgZm9yDQotICogY29ycmVjdCBvcGVyYXRpb24uDQotICogQHJtdG9sbCBDUjEgICAgICAgICAgQ1JDTCAgICAgICAgICBMTF9TUElfU2V0Q1JDV2lkdGgNCi0gKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlDQotICogQHBhcmFtICBDUkNMZW5ndGggVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfQ1JDXzhCSVQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfQ1JDXzE2QklUDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX1NldENSQ1dpZHRoKFNQSV9UeXBlRGVmICpTUEl4LCB1aW50MzJfdCBDUkNMZW5ndGgpIHsNCi0gIE1PRElGWV9SRUcoU1BJeC0+Q1IxLCBTUElfQ1IxX0NSQ0wsIENSQ0xlbmd0aCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IENSQyBMZW5ndGgNCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBDUkNMICAgICAgICAgIExMX1NQSV9HZXRDUkNXaWR0aA0KLSAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0NSQ184QklUDQotICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0NSQ18xNkJJVA0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfR2V0Q1JDV2lkdGgoU1BJX1R5cGVEZWYgKlNQSXgpIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFNQSXgtPkNSMSwgU1BJX0NSMV9DUkNMKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IENSQ05leHQgdG8gdHJhbnNmZXIgQ1JDIG9uIHRoZSBsaW5lDQotICogQG5vdGUgICBUaGlzIGJpdCBoYXMgdG8gYmUgd3JpdHRlbiBhcyBzb29uIGFzIHRoZSBsYXN0IGRhdGEgaXMgd3JpdHRlbiBpbiB0aGUNCi0gKiBTUEl4X0RSIHJlZ2lzdGVyLg0KLSAqIEBybXRvbGwgQ1IxICAgICAgICAgIENSQ05FWFQgICAgICAgTExfU1BJX1NldENSQ05leHQNCi0gKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX1NldENSQ05leHQoU1BJX1R5cGVEZWYgKlNQSXgpIHsNCi0gIFNFVF9CSVQoU1BJeC0+Q1IxLCBTUElfQ1IxX0NSQ05FWFQpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCBwb2x5bm9taWFsIGZvciBDUkMgY2FsY3VsYXRpb24NCi0gKiBAcm10b2xsIENSQ1BSICAgICAgICBDUkNQT0xZICAgICAgIExMX1NQSV9TZXRDUkNQb2x5bm9taWFsDQotICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQ0KLSAqIEBwYXJhbSAgQ1JDUG9seSBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAwIGFuZA0KLSAqIE1heF9EYXRhID0gMHhGRkZGDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX1NldENSQ1BvbHlub21pYWwoU1BJX1R5cGVEZWYgKlNQSXgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ1JDUG9seSkgew0KLSAgV1JJVEVfUkVHKFNQSXgtPkNSQ1BSLCAodWludDE2X3QpQ1JDUG9seSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IHBvbHlub21pYWwgZm9yIENSQyBjYWxjdWxhdGlvbg0KLSAqIEBybXRvbGwgQ1JDUFIgICAgICAgIENSQ1BPTFkgICAgICAgTExfU1BJX0dldENSQ1BvbHlub21pYWwNCi0gKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlDQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBpcyBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMCBhbmQgTWF4X0RhdGEgPQ0KLSAqIDB4RkZGRg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfR2V0Q1JDUG9seW5vbWlhbChTUElfVHlwZURlZiAqU1BJeCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9SRUcoU1BJeC0+Q1JDUFIpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgUnggQ1JDDQotICogQHJtdG9sbCBSWENSQ1IgICAgICAgUlhDUkMgICAgICAgICBMTF9TUElfR2V0UnhDUkMNCi0gKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlDQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBpcyBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMCBhbmQgTWF4X0RhdGEgPQ0KLSAqIDB4RkZGRg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfR2V0UnhDUkMoU1BJX1R5cGVEZWYgKlNQSXgpIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfUkVHKFNQSXgtPlJYQ1JDUikpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBUeCBDUkMNCi0gKiBAcm10b2xsIFRYQ1JDUiAgICAgICBUWENSQyAgICAgICAgIExMX1NQSV9HZXRUeENSQw0KLSAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGlzIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAwIGFuZCBNYXhfRGF0YSA9DQotICogMHhGRkZGDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9HZXRUeENSQyhTUElfVHlwZURlZiAqU1BJeCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9SRUcoU1BJeC0+VFhDUkNSKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBTUElfTExfRUZfTlNTX01hbmFnZW1lbnQgU2xhdmUgU2VsZWN0IFBpbiBNYW5hZ2VtZW50DQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCBOU1MgbW9kZQ0KLSAqIEBub3RlICAgTExfU1BJX05TU19TT0ZUIE1vZGUgaXMgbm90IHVzZWQgaW4gU1BJIFRJIG1vZGUuDQotICogQHJtdG9sbCBDUjEgICAgICAgICAgU1NNICAgICAgICAgICBMTF9TUElfU2V0TlNTTW9kZVxuDQotICogQHJtdG9sbCBDUjIgICAgICAgICAgU1NPRSAgICAgICAgICBMTF9TUElfU2V0TlNTTW9kZQ0KLSAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UNCi0gKiBAcGFyYW0gIE5TUyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9OU1NfU09GVA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9OU1NfSEFSRF9JTlBVVA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9OU1NfSEFSRF9PVVRQVVQNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfU2V0TlNTTW9kZShTUElfVHlwZURlZiAqU1BJeCwgdWludDMyX3QgTlNTKSB7DQotICBNT0RJRllfUkVHKFNQSXgtPkNSMSwgU1BJX0NSMV9TU00sIE5TUyk7DQotICBNT0RJRllfUkVHKFNQSXgtPkNSMiwgU1BJX0NSMl9TU09FLCAoKHVpbnQzMl90KShOU1MgPj4gMTZVKSkpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBOU1MgbW9kZQ0KLSAqIEBybXRvbGwgQ1IxICAgICAgICAgIFNTTSAgICAgICAgICAgTExfU1BJX0dldE5TU01vZGVcbg0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgIFNTT0UgICAgICAgICAgTExfU1BJX0dldE5TU01vZGUNCi0gKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlDQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9OU1NfU09GVA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9OU1NfSEFSRF9JTlBVVA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9OU1NfSEFSRF9PVVRQVVQNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0dldE5TU01vZGUoU1BJX1R5cGVEZWYgKlNQSXgpIHsNCi0gIHVpbnQzMl90IFNzbSA9IChSRUFEX0JJVChTUEl4LT5DUjEsIFNQSV9DUjFfU1NNKSk7DQotICB1aW50MzJfdCBTc29lID0gKFJFQURfQklUKFNQSXgtPkNSMiwgU1BJX0NSMl9TU09FKSA8PCAxNlUpOw0KLSAgcmV0dXJuIChTc20gfCBTc29lKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgTlNTIHB1bHNlIG1hbmFnZW1lbnQNCi0gKiBAbm90ZSAgIFRoaXMgYml0IHNob3VsZCBub3QgYmUgY2hhbmdlZCB3aGVuIGNvbW11bmljYXRpb24gaXMgb25nb2luZy4gVGhpcw0KLSAqIGJpdCBpcyBub3QgdXNlZCBpbiBTUEkgVEkgbW9kZS4NCi0gKiBAcm10b2xsIENSMiAgICAgICAgICBOU1NQICAgICAgICAgIExMX1NQSV9FbmFibGVOU1NQdWxzZU1ndA0KLSAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfRW5hYmxlTlNTUHVsc2VNZ3QoU1BJX1R5cGVEZWYgKlNQSXgpIHsNCi0gIFNFVF9CSVQoU1BJeC0+Q1IyLCBTUElfQ1IyX05TU1ApOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgTlNTIHB1bHNlIG1hbmFnZW1lbnQNCi0gKiBAbm90ZSAgIFRoaXMgYml0IHNob3VsZCBub3QgYmUgY2hhbmdlZCB3aGVuIGNvbW11bmljYXRpb24gaXMgb25nb2luZy4gVGhpcw0KLSAqIGJpdCBpcyBub3QgdXNlZCBpbiBTUEkgVEkgbW9kZS4NCi0gKiBAcm10b2xsIENSMiAgICAgICAgICBOU1NQICAgICAgICAgIExMX1NQSV9EaXNhYmxlTlNTUHVsc2VNZ3QNCi0gKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX0Rpc2FibGVOU1NQdWxzZU1ndChTUElfVHlwZURlZiAqU1BJeCkgew0KLSAgQ0xFQVJfQklUKFNQSXgtPkNSMiwgU1BJX0NSMl9OU1NQKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiBOU1MgcHVsc2UgaXMgZW5hYmxlZA0KLSAqIEBub3RlICAgVGhpcyBiaXQgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkIHdoZW4gY29tbXVuaWNhdGlvbiBpcyBvbmdvaW5nLiBUaGlzDQotICogYml0IGlzIG5vdCB1c2VkIGluIFNQSSBUSSBtb2RlLg0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgIE5TU1AgICAgICAgICAgTExfU1BJX0lzRW5hYmxlZE5TU1B1bHNlDQotICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfSXNFbmFibGVkTlNTUHVsc2UoU1BJX1R5cGVEZWYgKlNQSXgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFNQSXgtPkNSMiwgU1BJX0NSMl9OU1NQKSA9PSAoU1BJX0NSMl9OU1NQKSkgPyAxVUwgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgU1BJX0xMX0VGX0ZMQUdfTWFuYWdlbWVudCBGTEFHIE1hbmFnZW1lbnQNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgUnggYnVmZmVyIGlzIG5vdCBlbXB0eQ0KLSAqIEBybXRvbGwgU1IgICAgICAgICAgIFJYTkUgICAgICAgICAgTExfU1BJX0lzQWN0aXZlRmxhZ19SWE5FDQotICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfSXNBY3RpdmVGbGFnX1JYTkUoU1BJX1R5cGVEZWYgKlNQSXgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFNQSXgtPlNSLCBTUElfU1JfUlhORSkgPT0gKFNQSV9TUl9SWE5FKSkgPyAxVUwgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIGlmIFR4IGJ1ZmZlciBpcyBlbXB0eQ0KLSAqIEBybXRvbGwgU1IgICAgICAgICAgIFRYRSAgICAgICAgICAgTExfU1BJX0lzQWN0aXZlRmxhZ19UWEUNCi0gKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9Jc0FjdGl2ZUZsYWdfVFhFKFNQSV9UeXBlRGVmICpTUEl4KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChTUEl4LT5TUiwgU1BJX1NSX1RYRSkgPT0gKFNQSV9TUl9UWEUpKSA/IDFVTCA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IENSQyBlcnJvciBmbGFnDQotICogQHJtdG9sbCBTUiAgICAgICAgICAgQ1JDRVJSICAgICAgICBMTF9TUElfSXNBY3RpdmVGbGFnX0NSQ0VSUg0KLSAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0lzQWN0aXZlRmxhZ19DUkNFUlIoU1BJX1R5cGVEZWYgKlNQSXgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFNQSXgtPlNSLCBTUElfU1JfQ1JDRVJSKSA9PSAoU1BJX1NSX0NSQ0VSUikpID8gMVVMIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgbW9kZSBmYXVsdCBlcnJvciBmbGFnDQotICogQHJtdG9sbCBTUiAgICAgICAgICAgTU9ERiAgICAgICAgICBMTF9TUElfSXNBY3RpdmVGbGFnX01PREYNCi0gKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9Jc0FjdGl2ZUZsYWdfTU9ERihTUElfVHlwZURlZiAqU1BJeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoU1BJeC0+U1IsIFNQSV9TUl9NT0RGKSA9PSAoU1BJX1NSX01PREYpKSA/IDFVTCA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IG92ZXJydW4gZXJyb3IgZmxhZw0KLSAqIEBybXRvbGwgU1IgICAgICAgICAgIE9WUiAgICAgICAgICAgTExfU1BJX0lzQWN0aXZlRmxhZ19PVlINCi0gKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9Jc0FjdGl2ZUZsYWdfT1ZSKFNQSV9UeXBlRGVmICpTUEl4KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChTUEl4LT5TUiwgU1BJX1NSX09WUikgPT0gKFNQSV9TUl9PVlIpKSA/IDFVTCA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IGJ1c3kgZmxhZw0KLSAqIEBub3RlICAgVGhlIEJTWSBmbGFnIGlzIGNsZWFyZWQgdW5kZXIgYW55IG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotICogLVdoZW4gdGhlIFNQSSBpcyBjb3JyZWN0bHkgZGlzYWJsZWQNCi0gKiAtV2hlbiBhIGZhdWx0IGlzIGRldGVjdGVkIGluIE1hc3RlciBtb2RlIChNT0RGIGJpdCBzZXQgdG8gMSkNCi0gKiAtSW4gTWFzdGVyIG1vZGUsIHdoZW4gaXQgZmluaXNoZXMgYSBkYXRhIHRyYW5zbWlzc2lvbiBhbmQgbm8gbmV3IGRhdGEgaXMNCi0gKiByZWFkeSB0byBiZSBzZW50IC1JbiBTbGF2ZSBtb2RlLCB3aGVuIHRoZSBCU1kgZmxhZyBpcyBzZXQgdG8gJzAnIGZvciBhdCBsZWFzdA0KLSAqIG9uZSBTUEkgY2xvY2sgY3ljbGUgYmV0d2VlbiBlYWNoIGRhdGEgdHJhbnNmZXIuDQotICogQHJtdG9sbCBTUiAgICAgICAgICAgQlNZICAgICAgICAgICBMTF9TUElfSXNBY3RpdmVGbGFnX0JTWQ0KLSAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0lzQWN0aXZlRmxhZ19CU1koU1BJX1R5cGVEZWYgKlNQSXgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFNQSXgtPlNSLCBTUElfU1JfQlNZKSA9PSAoU1BJX1NSX0JTWSkpID8gMVVMIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgZnJhbWUgZm9ybWF0IGVycm9yIGZsYWcNCi0gKiBAcm10b2xsIFNSICAgICAgICAgICBGUkUgICAgICAgICAgIExMX1NQSV9Jc0FjdGl2ZUZsYWdfRlJFDQotICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfSXNBY3RpdmVGbGFnX0ZSRShTUElfVHlwZURlZiAqU1BJeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoU1BJeC0+U1IsIFNQSV9TUl9GUkUpID09IChTUElfU1JfRlJFKSkgPyAxVUwgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBGSUZPIHJlY2VwdGlvbiBMZXZlbA0KLSAqIEBybXRvbGwgU1IgICAgICAgICAgIEZSTFZMICAgICAgICAgTExfU1BJX0dldFJ4RklGT0xldmVsDQotICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfUlhfRklGT19FTVBUWQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9SWF9GSUZPX1FVQVJURVJfRlVMTA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9SWF9GSUZPX0hBTEZfRlVMTA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9SWF9GSUZPX0ZVTEwNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0dldFJ4RklGT0xldmVsKFNQSV9UeXBlRGVmICpTUEl4KSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTUEl4LT5TUiwgU1BJX1NSX0ZSTFZMKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IEZJRk8gVHJhbnNtaXNzaW9uIExldmVsDQotICogQHJtdG9sbCBTUiAgICAgICAgICAgRlRMVkwgICAgICAgICBMTF9TUElfR2V0VHhGSUZPTGV2ZWwNCi0gKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlDQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9UWF9GSUZPX0VNUFRZDQotICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX1RYX0ZJRk9fUVVBUlRFUl9GVUxMDQotICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX1RYX0ZJRk9fSEFMRl9GVUxMDQotICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX1RYX0ZJRk9fRlVMTA0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfR2V0VHhGSUZPTGV2ZWwoU1BJX1R5cGVEZWYgKlNQSXgpIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFNQSXgtPlNSLCBTUElfU1JfRlRMVkwpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDbGVhciBDUkMgZXJyb3IgZmxhZw0KLSAqIEBybXRvbGwgU1IgICAgICAgICAgIENSQ0VSUiAgICAgICAgTExfU1BJX0NsZWFyRmxhZ19DUkNFUlINCi0gKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX0NsZWFyRmxhZ19DUkNFUlIoU1BJX1R5cGVEZWYgKlNQSXgpIHsNCi0gIENMRUFSX0JJVChTUEl4LT5TUiwgU1BJX1NSX0NSQ0VSUik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2xlYXIgbW9kZSBmYXVsdCBlcnJvciBmbGFnDQotICogQG5vdGUgICBDbGVhcmluZyB0aGlzIGZsYWcgaXMgZG9uZSBieSBhIHJlYWQgYWNjZXNzIHRvIHRoZSBTUEl4X1NSDQotICogICAgICAgICByZWdpc3RlciBmb2xsb3dlZCBieSBhIHdyaXRlIGFjY2VzcyB0byB0aGUgU1BJeF9DUjEgcmVnaXN0ZXINCi0gKiBAcm10b2xsIFNSICAgICAgICAgICBNT0RGICAgICAgICAgIExMX1NQSV9DbGVhckZsYWdfTU9ERg0KLSAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfQ2xlYXJGbGFnX01PREYoU1BJX1R5cGVEZWYgKlNQSXgpIHsNCi0gIF9fSU8gdWludDMyX3QgdG1wcmVnX3NyOw0KLSAgdG1wcmVnX3NyID0gU1BJeC0+U1I7DQotICAodm9pZCl0bXByZWdfc3I7DQotICBDTEVBUl9CSVQoU1BJeC0+Q1IxLCBTUElfQ1IxX1NQRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2xlYXIgb3ZlcnJ1biBlcnJvciBmbGFnDQotICogQG5vdGUgICBDbGVhcmluZyB0aGlzIGZsYWcgaXMgZG9uZSBieSBhIHJlYWQgYWNjZXNzIHRvIHRoZSBTUEl4X0RSDQotICogICAgICAgICByZWdpc3RlciBmb2xsb3dlZCBieSBhIHJlYWQgYWNjZXNzIHRvIHRoZSBTUEl4X1NSIHJlZ2lzdGVyDQotICogQHJtdG9sbCBTUiAgICAgICAgICAgT1ZSICAgICAgICAgICBMTF9TUElfQ2xlYXJGbGFnX09WUg0KLSAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfQ2xlYXJGbGFnX09WUihTUElfVHlwZURlZiAqU1BJeCkgew0KLSAgX19JTyB1aW50MzJfdCB0bXByZWc7DQotICB0bXByZWcgPSBTUEl4LT5EUjsNCi0gICh2b2lkKXRtcHJlZzsNCi0gIHRtcHJlZyA9IFNQSXgtPlNSOw0KLSAgKHZvaWQpdG1wcmVnOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENsZWFyIGZyYW1lIGZvcm1hdCBlcnJvciBmbGFnDQotICogQG5vdGUgICBDbGVhcmluZyB0aGlzIGZsYWcgaXMgZG9uZSBieSByZWFkaW5nIFNQSXhfU1IgcmVnaXN0ZXINCi0gKiBAcm10b2xsIFNSICAgICAgICAgICBGUkUgICAgICAgICAgIExMX1NQSV9DbGVhckZsYWdfRlJFDQotICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9DbGVhckZsYWdfRlJFKFNQSV9UeXBlRGVmICpTUEl4KSB7DQotICBfX0lPIHVpbnQzMl90IHRtcHJlZzsNCi0gIHRtcHJlZyA9IFNQSXgtPlNSOw0KLSAgKHZvaWQpdG1wcmVnOw0KLX0NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgU1BJX0xMX0VGX0lUX01hbmFnZW1lbnQgSW50ZXJydXB0IE1hbmFnZW1lbnQNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIGVycm9yIGludGVycnVwdA0KLSAqIEBub3RlICAgVGhpcyBiaXQgY29udHJvbHMgdGhlIGdlbmVyYXRpb24gb2YgYW4gaW50ZXJydXB0IHdoZW4gYW4gZXJyb3INCi0gKiBjb25kaXRpb24gb2NjdXJzIChDUkNFUlIsIE9WUiwgTU9ERiBpbiBTUEkgbW9kZSwgRlJFIGF0IFRJIG1vZGUpLg0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgIEVSUklFICAgICAgICAgTExfU1BJX0VuYWJsZUlUX0VSUg0KLSAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfRW5hYmxlSVRfRVJSKFNQSV9UeXBlRGVmICpTUEl4KSB7DQotICBTRVRfQklUKFNQSXgtPkNSMiwgU1BJX0NSMl9FUlJJRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIFJ4IGJ1ZmZlciBub3QgZW1wdHkgaW50ZXJydXB0DQotICogQHJtdG9sbCBDUjIgICAgICAgICAgUlhORUlFICAgICAgICBMTF9TUElfRW5hYmxlSVRfUlhORQ0KLSAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfRW5hYmxlSVRfUlhORShTUElfVHlwZURlZiAqU1BJeCkgew0KLSAgU0VUX0JJVChTUEl4LT5DUjIsIFNQSV9DUjJfUlhORUlFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgVHggYnVmZmVyIGVtcHR5IGludGVycnVwdA0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgIFRYRUlFICAgICAgICAgTExfU1BJX0VuYWJsZUlUX1RYRQ0KLSAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfRW5hYmxlSVRfVFhFKFNQSV9UeXBlRGVmICpTUEl4KSB7DQotICBTRVRfQklUKFNQSXgtPkNSMiwgU1BJX0NSMl9UWEVJRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBlcnJvciBpbnRlcnJ1cHQNCi0gKiBAbm90ZSAgIFRoaXMgYml0IGNvbnRyb2xzIHRoZSBnZW5lcmF0aW9uIG9mIGFuIGludGVycnVwdCB3aGVuIGFuIGVycm9yDQotICogY29uZGl0aW9uIG9jY3VycyAoQ1JDRVJSLCBPVlIsIE1PREYgaW4gU1BJIG1vZGUsIEZSRSBhdCBUSSBtb2RlKS4NCi0gKiBAcm10b2xsIENSMiAgICAgICAgICBFUlJJRSAgICAgICAgIExMX1NQSV9EaXNhYmxlSVRfRVJSDQotICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9EaXNhYmxlSVRfRVJSKFNQSV9UeXBlRGVmICpTUEl4KSB7DQotICBDTEVBUl9CSVQoU1BJeC0+Q1IyLCBTUElfQ1IyX0VSUklFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIFJ4IGJ1ZmZlciBub3QgZW1wdHkgaW50ZXJydXB0DQotICogQHJtdG9sbCBDUjIgICAgICAgICAgUlhORUlFICAgICAgICBMTF9TUElfRGlzYWJsZUlUX1JYTkUNCi0gKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX0Rpc2FibGVJVF9SWE5FKFNQSV9UeXBlRGVmICpTUEl4KSB7DQotICBDTEVBUl9CSVQoU1BJeC0+Q1IyLCBTUElfQ1IyX1JYTkVJRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBUeCBidWZmZXIgZW1wdHkgaW50ZXJydXB0DQotICogQHJtdG9sbCBDUjIgICAgICAgICAgVFhFSUUgICAgICAgICBMTF9TUElfRGlzYWJsZUlUX1RYRQ0KLSAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfRGlzYWJsZUlUX1RYRShTUElfVHlwZURlZiAqU1BJeCkgew0KLSAgQ0xFQVJfQklUKFNQSXgtPkNSMiwgU1BJX0NSMl9UWEVJRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgZXJyb3IgaW50ZXJydXB0IGlzIGVuYWJsZWQNCi0gKiBAcm10b2xsIENSMiAgICAgICAgICBFUlJJRSAgICAgICAgIExMX1NQSV9Jc0VuYWJsZWRJVF9FUlINCi0gKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9Jc0VuYWJsZWRJVF9FUlIoU1BJX1R5cGVEZWYgKlNQSXgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFNQSXgtPkNSMiwgU1BJX0NSMl9FUlJJRSkgPT0gKFNQSV9DUjJfRVJSSUUpKSA/IDFVTCA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgUnggYnVmZmVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQgaXMgZW5hYmxlZA0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgIFJYTkVJRSAgICAgICAgTExfU1BJX0lzRW5hYmxlZElUX1JYTkUNCi0gKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9Jc0VuYWJsZWRJVF9SWE5FKFNQSV9UeXBlRGVmICpTUEl4KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChTUEl4LT5DUjIsIFNQSV9DUjJfUlhORUlFKSA9PSAoU1BJX0NSMl9SWE5FSUUpKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIGlmIFR4IGJ1ZmZlciBlbXB0eSBpbnRlcnJ1cHQNCi0gKiBAcm10b2xsIENSMiAgICAgICAgICBUWEVJRSAgICAgICAgIExMX1NQSV9Jc0VuYWJsZWRJVF9UWEUNCi0gKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9Jc0VuYWJsZWRJVF9UWEUoU1BJX1R5cGVEZWYgKlNQSXgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFNQSXgtPkNSMiwgU1BJX0NSMl9UWEVJRSkgPT0gKFNQSV9DUjJfVFhFSUUpKSA/IDFVTCA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBTUElfTExfRUZfRE1BX01hbmFnZW1lbnQgRE1BIE1hbmFnZW1lbnQNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIERNQSBSeA0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgIFJYRE1BRU4gICAgICAgTExfU1BJX0VuYWJsZURNQVJlcV9SWA0KLSAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfRW5hYmxlRE1BUmVxX1JYKFNQSV9UeXBlRGVmICpTUEl4KSB7DQotICBTRVRfQklUKFNQSXgtPkNSMiwgU1BJX0NSMl9SWERNQUVOKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIERNQSBSeA0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgIFJYRE1BRU4gICAgICAgTExfU1BJX0Rpc2FibGVETUFSZXFfUlgNCi0gKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX0Rpc2FibGVETUFSZXFfUlgoU1BJX1R5cGVEZWYgKlNQSXgpIHsNCi0gIENMRUFSX0JJVChTUEl4LT5DUjIsIFNQSV9DUjJfUlhETUFFTik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgRE1BIFJ4IGlzIGVuYWJsZWQNCi0gKiBAcm10b2xsIENSMiAgICAgICAgICBSWERNQUVOICAgICAgIExMX1NQSV9Jc0VuYWJsZWRETUFSZXFfUlgNCi0gKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9Jc0VuYWJsZWRETUFSZXFfUlgoU1BJX1R5cGVEZWYgKlNQSXgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFNQSXgtPkNSMiwgU1BJX0NSMl9SWERNQUVOKSA9PSAoU1BJX0NSMl9SWERNQUVOKSkgPyAxVUwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSBETUEgVHgNCi0gKiBAcm10b2xsIENSMiAgICAgICAgICBUWERNQUVOICAgICAgIExMX1NQSV9FbmFibGVETUFSZXFfVFgNCi0gKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX0VuYWJsZURNQVJlcV9UWChTUElfVHlwZURlZiAqU1BJeCkgew0KLSAgU0VUX0JJVChTUEl4LT5DUjIsIFNQSV9DUjJfVFhETUFFTik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBETUEgVHgNCi0gKiBAcm10b2xsIENSMiAgICAgICAgICBUWERNQUVOICAgICAgIExMX1NQSV9EaXNhYmxlRE1BUmVxX1RYDQotICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9EaXNhYmxlRE1BUmVxX1RYKFNQSV9UeXBlRGVmICpTUEl4KSB7DQotICBDTEVBUl9CSVQoU1BJeC0+Q1IyLCBTUElfQ1IyX1RYRE1BRU4pOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIGlmIERNQSBUeCBpcyBlbmFibGVkDQotICogQHJtdG9sbCBDUjIgICAgICAgICAgVFhETUFFTiAgICAgICBMTF9TUElfSXNFbmFibGVkRE1BUmVxX1RYDQotICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfSXNFbmFibGVkRE1BUmVxX1RYKFNQSV9UeXBlRGVmICpTUEl4KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChTUEl4LT5DUjIsIFNQSV9DUjJfVFhETUFFTikgPT0gKFNQSV9DUjJfVFhETUFFTikpID8gMVVMDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZXQgcGFyaXR5IG9mICBMYXN0IERNQSByZWNlcHRpb24NCi0gKiBAcm10b2xsIENSMiAgICAgICAgICBMRE1BUlggICAgICAgIExMX1NQSV9TZXRETUFQYXJpdHlfUlgNCi0gKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlDQotICogQHBhcmFtICBQYXJpdHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfRE1BX1BBUklUWV9PREQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfRE1BX1BBUklUWV9FVkVODQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX1NldERNQVBhcml0eV9SWChTUElfVHlwZURlZiAqU1BJeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFBhcml0eSkgew0KLSAgTU9ESUZZX1JFRyhTUEl4LT5DUjIsIFNQSV9DUjJfTERNQVJYLCAoUGFyaXR5IDw8IFNQSV9DUjJfTERNQVJYX1BvcykpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBwYXJpdHkgY29uZmlndXJhdGlvbiBmb3IgIExhc3QgRE1BIHJlY2VwdGlvbg0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgIExETUFSWCAgICAgICAgTExfU1BJX0dldERNQVBhcml0eV9SWA0KLSAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0RNQV9QQVJJVFlfT0REDQotICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0RNQV9QQVJJVFlfRVZFTg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfR2V0RE1BUGFyaXR5X1JYKFNQSV9UeXBlRGVmICpTUEl4KSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTUEl4LT5DUjIsIFNQSV9DUjJfTERNQVJYKSA+PiBTUElfQ1IyX0xETUFSWF9Qb3MpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCBwYXJpdHkgb2YgIExhc3QgRE1BIHRyYW5zbWlzc2lvbg0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgIExETUFUWCAgICAgICAgTExfU1BJX1NldERNQVBhcml0eV9UWA0KLSAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UNCi0gKiBAcGFyYW0gIFBhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9ETUFfUEFSSVRZX09ERA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9ETUFfUEFSSVRZX0VWRU4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfU2V0RE1BUGFyaXR5X1RYKFNQSV9UeXBlRGVmICpTUEl4LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUGFyaXR5KSB7DQotICBNT0RJRllfUkVHKFNQSXgtPkNSMiwgU1BJX0NSMl9MRE1BVFgsIChQYXJpdHkgPDwgU1BJX0NSMl9MRE1BVFhfUG9zKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IHBhcml0eSBjb25maWd1cmF0aW9uIGZvciBMYXN0IERNQSB0cmFuc21pc3Npb24NCi0gKiBAcm10b2xsIENSMiAgICAgICAgICBMRE1BVFggICAgICAgIExMX1NQSV9HZXRETUFQYXJpdHlfVFgNCi0gKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlDQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9ETUFfUEFSSVRZX09ERA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9ETUFfUEFSSVRZX0VWRU4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0dldERNQVBhcml0eV9UWChTUElfVHlwZURlZiAqU1BJeCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoU1BJeC0+Q1IyLCBTUElfQ1IyX0xETUFUWCkgPj4gU1BJX0NSMl9MRE1BVFhfUG9zKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgdGhlIGRhdGEgcmVnaXN0ZXIgYWRkcmVzcyB1c2VkIGZvciBETUEgdHJhbnNmZXINCi0gKiBAcm10b2xsIERSICAgICAgICAgICBEUiAgICAgICAgICAgIExMX1NQSV9ETUFfR2V0UmVnQWRkcg0KLSAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIEFkZHJlc3Mgb2YgZGF0YSByZWdpc3Rlcg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfRE1BX0dldFJlZ0FkZHIoU1BJX1R5cGVEZWYgKlNQSXgpIHsNCi0gIHJldHVybiAodWludDMyX3QpICYgKFNQSXgtPkRSKTsNCi19DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFNQSV9MTF9FRl9EQVRBX01hbmFnZW1lbnQgREFUQSBNYW5hZ2VtZW50DQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJlYWQgOC1CaXRzIGluIHRoZSBkYXRhIHJlZ2lzdGVyDQotICogQHJtdG9sbCBEUiAgICAgICAgICAgRFIgICAgICAgICAgICBMTF9TUElfUmVjZWl2ZURhdGE4DQotICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgUnhEYXRhIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50OF90IExMX1NQSV9SZWNlaXZlRGF0YTgoU1BJX1R5cGVEZWYgKlNQSXgpIHsNCi0gIHJldHVybiAoKigoX19JTyB1aW50OF90ICopJlNQSXgtPkRSKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmVhZCAxNi1CaXRzIGluIHRoZSBkYXRhIHJlZ2lzdGVyDQotICogQHJtdG9sbCBEUiAgICAgICAgICAgRFIgICAgICAgICAgICBMTF9TUElfUmVjZWl2ZURhdGExNg0KLSAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFJ4RGF0YSBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkZGRg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MTZfdCBMTF9TUElfUmVjZWl2ZURhdGExNihTUElfVHlwZURlZiAqU1BJeCkgew0KLSAgcmV0dXJuICh1aW50MTZfdCkoUkVBRF9SRUcoU1BJeC0+RFIpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBXcml0ZSA4LUJpdHMgaW4gdGhlIGRhdGEgcmVnaXN0ZXINCi0gKiBAcm10b2xsIERSICAgICAgICAgICBEUiAgICAgICAgICAgIExMX1NQSV9UcmFuc21pdERhdGE4DQotICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQ0KLSAqIEBwYXJhbSAgVHhEYXRhIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9UcmFuc21pdERhdGE4KFNQSV9UeXBlRGVmICpTUEl4LCB1aW50OF90IFR4RGF0YSkgew0KLSNpZiBkZWZpbmVkKF9fR05VQ19fKQ0KLSAgX19JTyB1aW50OF90ICpzcGlkciA9ICgoX19JTyB1aW50OF90ICopJlNQSXgtPkRSKTsNCi0gICpzcGlkciA9IFR4RGF0YTsNCi0jZWxzZQ0KLSAgKigoX19JTyB1aW50OF90ICopJlNQSXgtPkRSKSA9IFR4RGF0YTsNCi0jZW5kaWYgLyogX19HTlVDX18gKi8NCi19DQotDQotLyoqDQotICogQGJyaWVmICBXcml0ZSAxNi1CaXRzIGluIHRoZSBkYXRhIHJlZ2lzdGVyDQotICogQHJtdG9sbCBEUiAgICAgICAgICAgRFIgICAgICAgICAgICBMTF9TUElfVHJhbnNtaXREYXRhMTYNCi0gKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlDQotICogQHBhcmFtICBUeERhdGEgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEZGRkYNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfVHJhbnNtaXREYXRhMTYoU1BJX1R5cGVEZWYgKlNQSXgsIHVpbnQxNl90IFR4RGF0YSkgew0KLSNpZiBkZWZpbmVkKF9fR05VQ19fKQ0KLSAgX19JTyB1aW50MTZfdCAqc3BpZHIgPSAoKF9fSU8gdWludDE2X3QgKikmU1BJeC0+RFIpOw0KLSAgKnNwaWRyID0gVHhEYXRhOw0KLSNlbHNlDQotICBTUEl4LT5EUiA9IFR4RGF0YTsNCi0jZW5kaWYgLyogX19HTlVDX18gKi8NCi19DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0jaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpDQotLyoqIEBkZWZncm91cCBTUElfTExfRUZfSW5pdCBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zDQotICogQHsNCi0gKi8NCi0NCi1FcnJvclN0YXR1cyBMTF9TUElfRGVJbml0KFNQSV9UeXBlRGVmICpTUEl4KTsNCi1FcnJvclN0YXR1cyBMTF9TUElfSW5pdChTUElfVHlwZURlZiAqU1BJeCwgTExfU1BJX0luaXRUeXBlRGVmICpTUElfSW5pdFN0cnVjdCk7DQotdm9pZCBMTF9TUElfU3RydWN0SW5pdChMTF9TUElfSW5pdFR5cGVEZWYgKlNQSV9Jbml0U3RydWN0KTsNCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLSNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotI2lmIGRlZmluZWQoU1BJX0kyU19TVVBQT1JUKQ0KLS8qKiBAZGVmZ3JvdXAgSTJTX0xMIEkyUw0KLSAqIEB7DQotICovDQotDQotLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotDQotLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpDQotLyoqIEBkZWZncm91cCBJMlNfTExfRVNfSU5JVCBJMlMgRXhwb3J0ZWQgSW5pdCBzdHJ1Y3R1cmUNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSTJTIEluaXQgc3RydWN0dXJlIGRlZmluaXRpb24NCi0gKi8NCi0NCi10eXBlZGVmIHN0cnVjdCB7DQotICB1aW50MzJfdCBNb2RlOyAvKiE8IFNwZWNpZmllcyB0aGUgSTJTIG9wZXJhdGluZyBtb2RlLg0KLSAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEkyU19MTF9FQ19NT0RFDQotDQotICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5DQotICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBAcmVmIExMX0kyU19TZXRUcmFuc2Zlck1vZGUoKS4qLw0KLQ0KLSAgdWludDMyX3QNCi0gICAgICBTdGFuZGFyZDsgLyohPCBTcGVjaWZpZXMgdGhlIHN0YW5kYXJkIHVzZWQgZm9yIHRoZSBJMlMgY29tbXVuaWNhdGlvbi4NCi0gICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEkyU19MTF9FQ19TVEFOREFSRA0KLQ0KLSAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5DQotICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEByZWYgTExfSTJTX1NldFN0YW5kYXJkKCkuKi8NCi0NCi0gIHVpbnQzMl90IERhdGFGb3JtYXQ7IC8qITwgU3BlY2lmaWVzIHRoZSBkYXRhIGZvcm1hdCBmb3IgdGhlIEkyUyBjb21tdW5pY2F0aW9uLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgICBJMlNfTExfRUNfREFUQV9GT1JNQVQNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nDQotICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfSTJTX1NldERhdGFGb3JtYXQoKS4qLw0KLQ0KLSAgdWludDMyX3QgTUNMS091dHB1dDsgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgSTJTIE1DTEsgb3V0cHV0IGlzIGVuYWJsZWQgb3INCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG5vdC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgSTJTX0xMX0VDX01DTEtfT1VUUFVUDQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdGFyeSBmdW5jdGlvbnMgQHJlZiBMTF9JMlNfRW5hYmxlTWFzdGVyQ2xvY2soKSBvcg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBMTF9JMlNfRGlzYWJsZU1hc3RlckNsb2NrLiovDQotDQotICB1aW50MzJfdA0KLSAgICAgIEF1ZGlvRnJlcTsgLyohPCBTcGVjaWZpZXMgdGhlIGZyZXF1ZW5jeSBzZWxlY3RlZCBmb3IgdGhlIEkyUw0KLSAgICAgICAgICAgICAgICAgICAgY29tbXVuaWNhdGlvbi4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgSTJTX0xMX0VDX0FVRElPX0ZSRVENCi0NCi0gICAgICAgICAgICAgICAgICAgICAgQXVkaW8gRnJlcXVlbmN5IGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIFJlZmVyZW5jZQ0KLSAgICAgICAgICAgICAgICAgICAgbWFudWFsIGZvcm11bGFzIHRvIGNhbGN1bGF0ZSBQcmVzY2FsZXIgTGluZWFyLCBQYXJpdHkgYW5kDQotICAgICAgICAgICAgICAgICAgICB1bml0YXJ5IGZ1bmN0aW9ucyBAcmVmIExMX0kyU19TZXRQcmVzY2FsZXJMaW5lYXIoKSBhbmQgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgTExfSTJTX1NldFByZXNjYWxlclBhcml0eSgpIHRvIHNldCBpdC4qLw0KLQ0KLSAgdWludDMyX3QgQ2xvY2tQb2xhcml0eTsgLyohPCBTcGVjaWZpZXMgdGhlIGlkbGUgc3RhdGUgb2YgdGhlIEkyUyBjbG9jay4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSTJTX0xMX0VDX1BPTEFSSVRZDQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0kyU19TZXRDbG9ja1BvbGFyaXR5KCkuKi8NCi0NCi19IExMX0kyU19Jbml0VHlwZURlZjsNCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLSNlbmRpZiAvKlVTRV9GVUxMX0xMX0RSSVZFUiovDQotDQotLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGRlZmdyb3VwIEkyU19MTF9FeHBvcnRlZF9Db25zdGFudHMgSTJTIEV4cG9ydGVkIENvbnN0YW50cw0KLSAqIEB7DQotICovDQotDQotLyoqIEBkZWZncm91cCBJMlNfTExfRUNfR0VUX0ZMQUcgR2V0IEZsYWdzIERlZmluZXMNCi0gKiBAYnJpZWYgICAgRmxhZ3MgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX0kyU19SZWFkUmVnIGZ1bmN0aW9uDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX0kyU19TUl9SWE5FIExMX1NQSV9TUl9SWE5FIC8qITwgUnggYnVmZmVyIG5vdCBlbXB0eSBmbGFnICAgICAgICAgKi8NCi0jZGVmaW5lIExMX0kyU19TUl9UWEUgTExfU1BJX1NSX1RYRSAgIC8qITwgVHggYnVmZmVyIGVtcHR5IGZsYWcgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX0kyU19TUl9CU1kgTExfU1BJX1NSX0JTWSAgIC8qITwgQnVzeSBmbGFnICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX0kyU19TUl9VRFIgU1BJX1NSX1VEUiAgICAgIC8qITwgVW5kZXJydW4gZmxhZyAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX0kyU19TUl9PVlIgTExfU1BJX1NSX09WUiAgIC8qITwgT3ZlcnJ1biBmbGFnICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX0kyU19TUl9GUkUgTExfU1BJX1NSX0ZSRSAgIC8qITwgVEkgbW9kZSBmcmFtZSBmb3JtYXQgZXJyb3IgZmxhZyAgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgU1BJX0xMX0VDX0lUIElUIERlZmluZXMNCi0gKiBAYnJpZWYgICAgSVQgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX1NQSV9SZWFkUmVnIGFuZA0KLSAqIExMX1NQSV9Xcml0ZVJlZyBmdW5jdGlvbnMNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfSTJTX0NSMl9SWE5FSUUgXA0KLSAgTExfU1BJX0NSMl9SWE5FSUUgLyohPCBSeCBidWZmZXIgbm90IGVtcHR5IGludGVycnVwdCBlbmFibGUgKi8NCi0jZGVmaW5lIExMX0kyU19DUjJfVFhFSUUgXA0KLSAgTExfU1BJX0NSMl9UWEVJRSAvKiE8IFR4IGJ1ZmZlciBlbXB0eSBpbnRlcnJ1cHQgZW5hYmxlICAgICAqLw0KLSNkZWZpbmUgTExfSTJTX0NSMl9FUlJJRSBcDQotICBMTF9TUElfQ1IyX0VSUklFIC8qITwgRXJyb3IgaW50ZXJydXB0IGVuYWJsZSAgICAgICAgICAgICAgICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEkyU19MTF9FQ19EQVRBX0ZPUk1BVCBEYXRhIGZvcm1hdA0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9JMlNfREFUQUZPUk1BVF8xNkIgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBEYXRhIGxlbmd0aCAxNiBiaXRzLCBDaGFubmVsIGxlbmd0aCAxNmJpdCAqLw0KLSNkZWZpbmUgTExfSTJTX0RBVEFGT1JNQVRfMTZCX0VYVEVOREVEIFwNCi0gIChTUElfSTJTQ0ZHUl9DSExFTikgLyohPCBEYXRhIGxlbmd0aCAxNiBiaXRzLCBDaGFubmVsIGxlbmd0aCAzMmJpdCAqLw0KLSNkZWZpbmUgTExfSTJTX0RBVEFGT1JNQVRfMjRCIFwNCi0gIChTUElfSTJTQ0ZHUl9DSExFTiB8ICAgICAgICBcDQotICAgU1BJX0kyU0NGR1JfREFUTEVOXzApIC8qITwgRGF0YSBsZW5ndGggMjQgYml0cywgQ2hhbm5lbCBsZW5ndGggMzJiaXQgKi8NCi0jZGVmaW5lIExMX0kyU19EQVRBRk9STUFUXzMyQiBcDQotICAoU1BJX0kyU0NGR1JfQ0hMRU4gfCAgICAgICAgXA0KLSAgIFNQSV9JMlNDRkdSX0RBVExFTl8xKSAvKiE8IERhdGEgbGVuZ3RoIDE2IGJpdHMsIENoYW5uZWwgbGVuZ3RoIDMyYml0ICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEkyU19MTF9FQ19QT0xBUklUWSBDbG9jayBQb2xhcml0eQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9JMlNfUE9MQVJJVFlfTE9XICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBDbG9jayBzdGVhZHkgc3RhdGUgaXMgbG93IGxldmVsIFwNCi0gICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfSTJTX1BPTEFSSVRZX0hJR0ggXA0KLSAgKFNQSV9JMlNDRkdSX0NLUE9MKSAvKiE8IENsb2NrIHN0ZWFkeSBzdGF0ZSBpcyBoaWdoIGxldmVsICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEkyU19MTF9FQ19TVEFOREFSRCBJMnMgU3RhbmRhcmQNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfSTJTX1NUQU5EQVJEX1BISUxJUFMgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBJMlMgc3RhbmRhcmQgcGhpbGlwcyAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfSTJTX1NUQU5EQVJEX01TQiBcDQotICAoU1BJX0kyU0NGR1JfSTJTU1REXzApIC8qITwgTVNCIGp1c3RpZmllZCBzdGFuZGFyZCAobGVmdCBqdXN0aWZpZWQpICAgKi8NCi0jZGVmaW5lIExMX0kyU19TVEFOREFSRF9MU0IgXA0KLSAgKFNQSV9JMlNDRkdSX0kyU1NURF8xKSAvKiE8IExTQiBqdXN0aWZpZWQgc3RhbmRhcmQgKHJpZ2h0IGp1c3RpZmllZCkgICovDQotI2RlZmluZSBMTF9JMlNfU1RBTkRBUkRfUENNX1NIT1JUIFwNCi0gIChTUElfSTJTQ0ZHUl9JMlNTVERfMCB8ICAgICAgICAgXA0KLSAgIFNQSV9JMlNDRkdSX0kyU1NURF8xKSAvKiE8IFBDTSBzdGFuZGFyZCwgc2hvcnQgZnJhbWUgc3luY2hyb25pemF0aW9uICovDQotI2RlZmluZSBMTF9JMlNfU1RBTkRBUkRfUENNX0xPTkcgICAgICAgICAgICAgICAgIFwNCi0gIChTUElfSTJTQ0ZHUl9JMlNTVERfMCB8IFNQSV9JMlNDRkdSX0kyU1NURF8xIHwgXA0KLSAgIFNQSV9JMlNDRkdSX1BDTVNZTkMpIC8qITwgUENNIHN0YW5kYXJkLCBsb25nIGZyYW1lIHN5bmNocm9uaXphdGlvbiAgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgSTJTX0xMX0VDX01PREUgT3BlcmF0aW9uIE1vZGUNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfSTJTX01PREVfU0xBVkVfVFggMHgwMDAwMDAwMFUgLyohPCBTbGF2ZSBUeCBjb25maWd1cmF0aW9uICAqLw0KLSNkZWZpbmUgTExfSTJTX01PREVfU0xBVkVfUlggXA0KLSAgKFNQSV9JMlNDRkdSX0kyU0NGR18wKSAvKiE8IFNsYXZlIFJ4IGNvbmZpZ3VyYXRpb24gICovDQotI2RlZmluZSBMTF9JMlNfTU9ERV9NQVNURVJfVFggXA0KLSAgKFNQSV9JMlNDRkdSX0kyU0NGR18xKSAvKiE8IE1hc3RlciBUeCBjb25maWd1cmF0aW9uICovDQotI2RlZmluZSBMTF9JMlNfTU9ERV9NQVNURVJfUlggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoU1BJX0kyU0NGR1JfSTJTQ0ZHXzAgfCBTUElfSTJTQ0ZHUl9JMlNDRkdfMSkgLyohPCBNYXN0ZXIgUnggY29uZmlndXJhdGlvbiBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEkyU19MTF9FQ19QUkVTQ0FMRVJfRkFDVE9SIFByZXNjYWxlciBGYWN0b3INCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfSTJTX1BSRVNDQUxFUl9QQVJJVFlfRVZFTiBcDQotICAweDAwMDAwMDAwVSAvKiE8IE9kZCBmYWN0b3I6IFJlYWwgZGl2aWRlciB2YWx1ZSBpcyA9ICBJMlNESVYgKiAyICAgICovDQotI2RlZmluZSBMTF9JMlNfUFJFU0NBTEVSX1BBUklUWV9PREQgXA0KLSAgKFNQSV9JMlNQUl9PREQgPj4gICAgICAgICAgICAgICAgIFwNCi0gICA4VSkgLyohPCBPZGQgZmFjdG9yOiBSZWFsIGRpdmlkZXIgdmFsdWUgaXMgPSAoSTJTRElWICogMikrMSAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQ0KLQ0KLS8qKiBAZGVmZ3JvdXAgSTJTX0xMX0VDX01DTEtfT1VUUFVUIE1DTEsgT3V0cHV0DQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX0kyU19NQ0xLX09VVFBVVF9ESVNBQkxFIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgTWFzdGVyIGNsb2NrIG91dHB1dCBpcyBkaXNhYmxlZCAqLw0KLSNkZWZpbmUgTExfSTJTX01DTEtfT1VUUFVUX0VOQUJMRSBcDQotICAoU1BJX0kyU1BSX01DS09FKSAvKiE8IE1hc3RlciBjbG9jayBvdXRwdXQgaXMgZW5hYmxlZCAgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgSTJTX0xMX0VDX0FVRElPX0ZSRVEgQXVkaW8gRnJlcXVlbmN5DQotICogQHsNCi0gKi8NCi0NCi0jZGVmaW5lIExMX0kyU19BVURJT0ZSRVFfMTkySyBcDQotICAxOTIwMDBVIC8qITwgQXVkaW8gRnJlcXVlbmN5IGNvbmZpZ3VyYXRpb24gMTkyMDAwIEh6ICAgICAgICovDQotI2RlZmluZSBMTF9JMlNfQVVESU9GUkVRXzk2SyBcDQotICA5NjAwMFUgLyohPCBBdWRpbyBGcmVxdWVuY3kgY29uZmlndXJhdGlvbiAgOTYwMDAgSHogICAgICAgKi8NCi0jZGVmaW5lIExMX0kyU19BVURJT0ZSRVFfNDhLIFwNCi0gIDQ4MDAwVSAvKiE8IEF1ZGlvIEZyZXF1ZW5jeSBjb25maWd1cmF0aW9uICA0ODAwMCBIeiAgICAgICAqLw0KLSNkZWZpbmUgTExfSTJTX0FVRElPRlJFUV80NEsgXA0KLSAgNDQxMDBVIC8qITwgQXVkaW8gRnJlcXVlbmN5IGNvbmZpZ3VyYXRpb24gIDQ0MTAwIEh6ICAgICAgICovDQotI2RlZmluZSBMTF9JMlNfQVVESU9GUkVRXzMySyBcDQotICAzMjAwMFUgLyohPCBBdWRpbyBGcmVxdWVuY3kgY29uZmlndXJhdGlvbiAgMzIwMDAgSHogICAgICAgKi8NCi0jZGVmaW5lIExMX0kyU19BVURJT0ZSRVFfMjJLIFwNCi0gIDIyMDUwVSAvKiE8IEF1ZGlvIEZyZXF1ZW5jeSBjb25maWd1cmF0aW9uICAyMjA1MCBIeiAgICAgICAqLw0KLSNkZWZpbmUgTExfSTJTX0FVRElPRlJFUV8xNksgXA0KLSAgMTYwMDBVIC8qITwgQXVkaW8gRnJlcXVlbmN5IGNvbmZpZ3VyYXRpb24gIDE2MDAwIEh6ICAgICAgICovDQotI2RlZmluZSBMTF9JMlNfQVVESU9GUkVRXzExSyBcDQotICAxMTAyNVUgLyohPCBBdWRpbyBGcmVxdWVuY3kgY29uZmlndXJhdGlvbiAgMTEwMjUgSHogICAgICAgKi8NCi0jZGVmaW5lIExMX0kyU19BVURJT0ZSRVFfOEsgXA0KLSAgODAwMFUgLyohPCBBdWRpbyBGcmVxdWVuY3kgY29uZmlndXJhdGlvbiAgIDgwMDAgSHogICAgICAgKi8NCi0jZGVmaW5lIExMX0kyU19BVURJT0ZSRVFfREVGQVVMVCBcDQotICAyVSAvKiE8IEF1ZGlvIEZyZXEgbm90IHNwZWNpZmllZC4gUmVnaXN0ZXIgSTJTRElWID0gMiAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGRlZmdyb3VwIEkyU19MTF9FeHBvcnRlZF9NYWNyb3MgSTJTIEV4cG9ydGVkIE1hY3Jvcw0KLSAqIEB7DQotICovDQotDQotLyoqIEBkZWZncm91cCBJMlNfTExfRU1fV1JJVEVfUkVBRCBDb21tb24gV3JpdGUgYW5kIHJlYWQgcmVnaXN0ZXJzIE1hY3Jvcw0KLSAqIEB7DQotICovDQotDQotLyoqDQotICogQGJyaWVmICBXcml0ZSBhIHZhbHVlIGluIEkyUyByZWdpc3Rlcg0KLSAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIEkyUyBJbnN0YW5jZQ0KLSAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSB3cml0dGVuDQotICogQHBhcmFtICBfX1ZBTFVFX18gVmFsdWUgdG8gYmUgd3JpdHRlbiBpbiB0aGUgcmVnaXN0ZXINCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi0jZGVmaW5lIExMX0kyU19Xcml0ZVJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18sIF9fVkFMVUVfXykgXA0KLSAgV1JJVEVfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXywgKF9fVkFMVUVfXykpDQotDQotLyoqDQotICogQGJyaWVmICBSZWFkIGEgdmFsdWUgaW4gSTJTIHJlZ2lzdGVyDQotICogQHBhcmFtICBfX0lOU1RBTkNFX18gSTJTIEluc3RhbmNlDQotICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHJlYWQNCi0gKiBAcmV0dmFsIFJlZ2lzdGVyIHZhbHVlDQotICovDQotI2RlZmluZSBMTF9JMlNfUmVhZFJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18pIFJFQURfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXykNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0NCi0vKiogQGRlZmdyb3VwIEkyU19MTF9FeHBvcnRlZF9GdW5jdGlvbnMgSTJTIEV4cG9ydGVkIEZ1bmN0aW9ucw0KLSAqIEB7DQotICovDQotDQotLyoqIEBkZWZncm91cCBJMlNfTExfRUZfQ29uZmlndXJhdGlvbiBDb25maWd1cmF0aW9uDQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNlbGVjdCBJMlMgbW9kZSBhbmQgRW5hYmxlIEkyUyBwZXJpcGhlcmFsDQotICogQHJtdG9sbCBJMlNDRkdSICAgICAgSTJTTU9EICAgICAgICBMTF9JMlNfRW5hYmxlXG4NCi0gKiAgICAgICAgIEkyU0NGR1IgICAgICBJMlNFICAgICAgICAgIExMX0kyU19FbmFibGUNCi0gKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJTX0VuYWJsZShTUElfVHlwZURlZiAqU1BJeCkgew0KLSAgU0VUX0JJVChTUEl4LT5JMlNDRkdSLCBTUElfSTJTQ0ZHUl9JMlNNT0QgfCBTUElfSTJTQ0ZHUl9JMlNFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIEkyUyBwZXJpcGhlcmFsDQotICogQHJtdG9sbCBJMlNDRkdSICAgICAgSTJTRSAgICAgICAgICBMTF9JMlNfRGlzYWJsZQ0KLSAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMlNfRGlzYWJsZShTUElfVHlwZURlZiAqU1BJeCkgew0KLSAgQ0xFQVJfQklUKFNQSXgtPkkyU0NGR1IsIFNQSV9JMlNDRkdSX0kyU01PRCB8IFNQSV9JMlNDRkdSX0kyU0UpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIGlmIEkyUyBwZXJpcGhlcmFsIGlzIGVuYWJsZWQNCi0gKiBAcm10b2xsIEkyU0NGR1IgICAgICBJMlNFICAgICAgICAgIExMX0kyU19Jc0VuYWJsZWQNCi0gKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyU19Jc0VuYWJsZWQoU1BJX1R5cGVEZWYgKlNQSXgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFNQSXgtPkkyU0NGR1IsIFNQSV9JMlNDRkdSX0kyU0UpID09IChTUElfSTJTQ0ZHUl9JMlNFKSkNCi0gICAgICAgICAgICAgID8gMVVMDQotICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IEkyUyBkYXRhIGZyYW1lIGxlbmd0aA0KLSAqIEBybXRvbGwgSTJTQ0ZHUiAgICAgIERBVExFTiAgICAgICAgTExfSTJTX1NldERhdGFGb3JtYXRcbg0KLSAqICAgICAgICAgSTJTQ0ZHUiAgICAgIENITEVOICAgICAgICAgTExfSTJTX1NldERhdGFGb3JtYXQNCi0gKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlDQotICogQHBhcmFtICBEYXRhRm9ybWF0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX0RBVEFGT1JNQVRfMTZCDQotICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX0RBVEFGT1JNQVRfMTZCX0VYVEVOREVEDQotICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX0RBVEFGT1JNQVRfMjRCDQotICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX0RBVEFGT1JNQVRfMzJCDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJTX1NldERhdGFGb3JtYXQoU1BJX1R5cGVEZWYgKlNQSXgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRGF0YUZvcm1hdCkgew0KLSAgTU9ESUZZX1JFRyhTUEl4LT5JMlNDRkdSLCBTUElfSTJTQ0ZHUl9EQVRMRU4gfCBTUElfSTJTQ0ZHUl9DSExFTiwgRGF0YUZvcm1hdCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IEkyUyBkYXRhIGZyYW1lIGxlbmd0aA0KLSAqIEBybXRvbGwgSTJTQ0ZHUiAgICAgIERBVExFTiAgICAgICAgTExfSTJTX0dldERhdGFGb3JtYXRcbg0KLSAqICAgICAgICAgSTJTQ0ZHUiAgICAgIENITEVOICAgICAgICAgTExfSTJTX0dldERhdGFGb3JtYXQNCi0gKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlDQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyU19EQVRBRk9STUFUXzE2Qg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyU19EQVRBRk9STUFUXzE2Ql9FWFRFTkRFRA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyU19EQVRBRk9STUFUXzI0Qg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyU19EQVRBRk9STUFUXzMyQg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMlNfR2V0RGF0YUZvcm1hdChTUElfVHlwZURlZiAqU1BJeCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoU1BJeC0+STJTQ0ZHUiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQSV9JMlNDRkdSX0RBVExFTiB8IFNQSV9JMlNDRkdSX0NITEVOKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IEkyUyBjbG9jayBwb2xhcml0eQ0KLSAqIEBybXRvbGwgSTJTQ0ZHUiAgICAgIENLUE9MICAgICAgICAgTExfSTJTX1NldENsb2NrUG9sYXJpdHkNCi0gKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlDQotICogQHBhcmFtICBDbG9ja1BvbGFyaXR5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX1BPTEFSSVRZX0xPVw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyU19QT0xBUklUWV9ISUdIDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJTX1NldENsb2NrUG9sYXJpdHkoU1BJX1R5cGVEZWYgKlNQSXgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2xvY2tQb2xhcml0eSkgew0KLSAgU0VUX0JJVChTUEl4LT5JMlNDRkdSLCBDbG9ja1BvbGFyaXR5KTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgSTJTIGNsb2NrIHBvbGFyaXR5DQotICogQHJtdG9sbCBJMlNDRkdSICAgICAgQ0tQT0wgICAgICAgICBMTF9JMlNfR2V0Q2xvY2tQb2xhcml0eQ0KLSAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX1BPTEFSSVRZX0xPVw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyU19QT0xBUklUWV9ISUdIDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyU19HZXRDbG9ja1BvbGFyaXR5KFNQSV9UeXBlRGVmICpTUEl4KSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTUEl4LT5JMlNDRkdSLCBTUElfSTJTQ0ZHUl9DS1BPTCkpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCBJMlMgc3RhbmRhcmQgcHJvdG9jb2wNCi0gKiBAcm10b2xsIEkyU0NGR1IgICAgICBJMlNTVEQgICAgICAgIExMX0kyU19TZXRTdGFuZGFyZFxuDQotICogICAgICAgICBJMlNDRkdSICAgICAgUENNU1lOQyAgICAgICBMTF9JMlNfU2V0U3RhbmRhcmQNCi0gKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlDQotICogQHBhcmFtICBTdGFuZGFyZCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyU19TVEFOREFSRF9QSElMSVBTDQotICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX1NUQU5EQVJEX01TQg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyU19TVEFOREFSRF9MU0INCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfU1RBTkRBUkRfUENNX1NIT1JUDQotICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX1NUQU5EQVJEX1BDTV9MT05HDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJTX1NldFN0YW5kYXJkKFNQSV9UeXBlRGVmICpTUEl4LCB1aW50MzJfdCBTdGFuZGFyZCkgew0KLSAgTU9ESUZZX1JFRyhTUEl4LT5JMlNDRkdSLCBTUElfSTJTQ0ZHUl9JMlNTVEQgfCBTUElfSTJTQ0ZHUl9QQ01TWU5DLCBTdGFuZGFyZCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IEkyUyBzdGFuZGFyZCBwcm90b2NvbA0KLSAqIEBybXRvbGwgSTJTQ0ZHUiAgICAgIEkyU1NURCAgICAgICAgTExfSTJTX0dldFN0YW5kYXJkXG4NCi0gKiAgICAgICAgIEkyU0NGR1IgICAgICBQQ01TWU5DICAgICAgIExMX0kyU19HZXRTdGFuZGFyZA0KLSAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX1NUQU5EQVJEX1BISUxJUFMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfU1RBTkRBUkRfTVNCDQotICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX1NUQU5EQVJEX0xTQg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyU19TVEFOREFSRF9QQ01fU0hPUlQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfU1RBTkRBUkRfUENNX0xPTkcNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJTX0dldFN0YW5kYXJkKFNQSV9UeXBlRGVmICpTUEl4KSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTUEl4LT5JMlNDRkdSLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BJX0kyU0NGR1JfSTJTU1REIHwgU1BJX0kyU0NGR1JfUENNU1lOQykpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCBJMlMgdHJhbnNmZXIgbW9kZQ0KLSAqIEBybXRvbGwgSTJTQ0ZHUiAgICAgIEkyU0NGRyAgICAgICAgTExfSTJTX1NldFRyYW5zZmVyTW9kZQ0KLSAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UNCi0gKiBAcGFyYW0gIE1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfTU9ERV9TTEFWRV9UWA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyU19NT0RFX1NMQVZFX1JYDQotICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX01PREVfTUFTVEVSX1RYDQotICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX01PREVfTUFTVEVSX1JYDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJTX1NldFRyYW5zZmVyTW9kZShTUElfVHlwZURlZiAqU1BJeCwgdWludDMyX3QgTW9kZSkgew0KLSAgTU9ESUZZX1JFRyhTUEl4LT5JMlNDRkdSLCBTUElfSTJTQ0ZHUl9JMlNDRkcsIE1vZGUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBJMlMgdHJhbnNmZXIgbW9kZQ0KLSAqIEBybXRvbGwgSTJTQ0ZHUiAgICAgIEkyU0NGRyAgICAgICAgTExfSTJTX0dldFRyYW5zZmVyTW9kZQ0KLSAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX01PREVfU0xBVkVfVFgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfTU9ERV9TTEFWRV9SWA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyU19NT0RFX01BU1RFUl9UWA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyU19NT0RFX01BU1RFUl9SWA0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMlNfR2V0VHJhbnNmZXJNb2RlKFNQSV9UeXBlRGVmICpTUEl4KSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTUEl4LT5JMlNDRkdSLCBTUElfSTJTQ0ZHUl9JMlNDRkcpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZXQgSTJTIGxpbmVhciBwcmVzY2FsZXINCi0gKiBAcm10b2xsIEkyU1BSICAgICAgICBJMlNESVYgICAgICAgIExMX0kyU19TZXRQcmVzY2FsZXJMaW5lYXINCi0gKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlDQotICogQHBhcmFtICBQcmVzY2FsZXJMaW5lYXIgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAyIGFuZCBNYXhfRGF0YT0weEZGDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJTX1NldFByZXNjYWxlckxpbmVhcihTUElfVHlwZURlZiAqU1BJeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgUHJlc2NhbGVyTGluZWFyKSB7DQotICBNT0RJRllfUkVHKFNQSXgtPkkyU1BSLCBTUElfSTJTUFJfSTJTRElWLCBQcmVzY2FsZXJMaW5lYXIpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBJMlMgbGluZWFyIHByZXNjYWxlcg0KLSAqIEBybXRvbGwgSTJTUFIgICAgICAgIEkyU0RJViAgICAgICAgTExfSTJTX0dldFByZXNjYWxlckxpbmVhcg0KLSAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFByZXNjYWxlckxpbmVhciBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDIgYW5kIE1heF9EYXRhPTB4RkYNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJTX0dldFByZXNjYWxlckxpbmVhcihTUElfVHlwZURlZiAqU1BJeCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoU1BJeC0+STJTUFIsIFNQSV9JMlNQUl9JMlNESVYpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZXQgSTJTIHBhcml0eSBwcmVzY2FsZXINCi0gKiBAcm10b2xsIEkyU1BSICAgICAgICBPREQgICAgICAgICAgIExMX0kyU19TZXRQcmVzY2FsZXJQYXJpdHkNCi0gKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlDQotICogQHBhcmFtICBQcmVzY2FsZXJQYXJpdHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfUFJFU0NBTEVSX1BBUklUWV9FVkVODQotICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX1BSRVNDQUxFUl9QQVJJVFlfT0REDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJTX1NldFByZXNjYWxlclBhcml0eShTUElfVHlwZURlZiAqU1BJeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFByZXNjYWxlclBhcml0eSkgew0KLSAgTU9ESUZZX1JFRyhTUEl4LT5JMlNQUiwgU1BJX0kyU1BSX09ERCwgUHJlc2NhbGVyUGFyaXR5IDw8IDhVKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgSTJTIHBhcml0eSBwcmVzY2FsZXINCi0gKiBAcm10b2xsIEkyU1BSICAgICAgICBPREQgICAgICAgICAgIExMX0kyU19HZXRQcmVzY2FsZXJQYXJpdHkNCi0gKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlDQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyU19QUkVTQ0FMRVJfUEFSSVRZX0VWRU4NCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfUFJFU0NBTEVSX1BBUklUWV9PREQNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJTX0dldFByZXNjYWxlclBhcml0eShTUElfVHlwZURlZiAqU1BJeCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoU1BJeC0+STJTUFIsIFNQSV9JMlNQUl9PREQpID4+IDhVKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgdGhlIG1hc3RlciBjbG9jayBvdXRwdXQgKFBpbiBNQ0spDQotICogQHJtdG9sbCBJMlNQUiAgICAgICAgTUNLT0UgICAgICAgICBMTF9JMlNfRW5hYmxlTWFzdGVyQ2xvY2sNCi0gKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJTX0VuYWJsZU1hc3RlckNsb2NrKFNQSV9UeXBlRGVmICpTUEl4KSB7DQotICBTRVRfQklUKFNQSXgtPkkyU1BSLCBTUElfSTJTUFJfTUNLT0UpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgdGhlIG1hc3RlciBjbG9jayBvdXRwdXQgKFBpbiBNQ0spDQotICogQHJtdG9sbCBJMlNQUiAgICAgICAgTUNLT0UgICAgICAgICBMTF9JMlNfRGlzYWJsZU1hc3RlckNsb2NrDQotICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0kyU19EaXNhYmxlTWFzdGVyQ2xvY2soU1BJX1R5cGVEZWYgKlNQSXgpIHsNCi0gIENMRUFSX0JJVChTUEl4LT5JMlNQUiwgU1BJX0kyU1BSX01DS09FKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiB0aGUgbWFzdGVyIGNsb2NrIG91dHB1dCAoUGluIE1DSykgaXMgZW5hYmxlZA0KLSAqIEBybXRvbGwgSTJTUFIgICAgICAgIE1DS09FICAgICAgICAgTExfSTJTX0lzRW5hYmxlZE1hc3RlckNsb2NrDQotICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMlNfSXNFbmFibGVkTWFzdGVyQ2xvY2soU1BJX1R5cGVEZWYgKlNQSXgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFNQSXgtPkkyU1BSLCBTUElfSTJTUFJfTUNLT0UpID09IChTUElfSTJTUFJfTUNLT0UpKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotI2lmIGRlZmluZWQoU1BJX0kyU0NGR1JfQVNUUlRFTikNCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSBhc3luY2hyb25vdXMgc3RhcnQNCi0gKiBAcm10b2xsIEkyU0NGR1IgICAgICBBU1RSVEVOICAgICAgIExMX0kyU19FbmFibGVBc3luY1N0YXJ0DQotICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0kyU19FbmFibGVBc3luY1N0YXJ0KFNQSV9UeXBlRGVmICpTUEl4KSB7DQotICBTRVRfQklUKFNQSXgtPkkyU0NGR1IsIFNQSV9JMlNDRkdSX0FTVFJURU4pOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgIGFzeW5jaHJvbm91cyBzdGFydA0KLSAqIEBybXRvbGwgSTJTQ0ZHUiAgICAgIEFTVFJURU4gICAgICAgTExfSTJTX0Rpc2FibGVBc3luY1N0YXJ0DQotICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0kyU19EaXNhYmxlQXN5bmNTdGFydChTUElfVHlwZURlZiAqU1BJeCkgew0KLSAgQ0xFQVJfQklUKFNQSXgtPkkyU0NGR1IsIFNQSV9JMlNDRkdSX0FTVFJURU4pOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIGlmIGFzeW5jaHJvbm91cyBzdGFydCBpcyBlbmFibGVkDQotICogQHJtdG9sbCBJMlNDRkdSICAgICAgQVNUUlRFTiAgICAgICBMTF9JMlNfSXNFbmFibGVkQXN5bmNTdGFydA0KLSAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJTX0lzRW5hYmxlZEFzeW5jU3RhcnQoU1BJX1R5cGVEZWYgKlNQSXgpIHsNCi0gIHJldHVybiAoDQotICAgICAgKFJFQURfQklUKFNQSXgtPkkyU0NGR1IsIFNQSV9JMlNDRkdSX0FTVFJURU4pID09IChTUElfSTJTQ0ZHUl9BU1RSVEVOKSkNCi0gICAgICAgICAgPyAxVUwNCi0gICAgICAgICAgOiAwVUwpOw0KLX0NCi0jZW5kaWYgLyogU1BJX0kyU0NGR1JfQVNUUlRFTiAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBJMlNfTExfRUZfRkxBRyBGTEFHIE1hbmFnZW1lbnQNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgUnggYnVmZmVyIGlzIG5vdCBlbXB0eQ0KLSAqIEBybXRvbGwgU1IgICAgICAgICAgIFJYTkUgICAgICAgICAgTExfSTJTX0lzQWN0aXZlRmxhZ19SWE5FDQotICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMlNfSXNBY3RpdmVGbGFnX1JYTkUoU1BJX1R5cGVEZWYgKlNQSXgpIHsNCi0gIHJldHVybiBMTF9TUElfSXNBY3RpdmVGbGFnX1JYTkUoU1BJeCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgVHggYnVmZmVyIGlzIGVtcHR5DQotICogQHJtdG9sbCBTUiAgICAgICAgICAgVFhFICAgICAgICAgICBMTF9JMlNfSXNBY3RpdmVGbGFnX1RYRQ0KLSAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJTX0lzQWN0aXZlRmxhZ19UWEUoU1BJX1R5cGVEZWYgKlNQSXgpIHsNCi0gIHJldHVybiBMTF9TUElfSXNBY3RpdmVGbGFnX1RYRShTUEl4KTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgYnVzeSBmbGFnDQotICogQHJtdG9sbCBTUiAgICAgICAgICAgQlNZICAgICAgICAgICBMTF9JMlNfSXNBY3RpdmVGbGFnX0JTWQ0KLSAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJTX0lzQWN0aXZlRmxhZ19CU1koU1BJX1R5cGVEZWYgKlNQSXgpIHsNCi0gIHJldHVybiBMTF9TUElfSXNBY3RpdmVGbGFnX0JTWShTUEl4KTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgb3ZlcnJ1biBlcnJvciBmbGFnDQotICogQHJtdG9sbCBTUiAgICAgICAgICAgT1ZSICAgICAgICAgICBMTF9JMlNfSXNBY3RpdmVGbGFnX09WUg0KLSAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJTX0lzQWN0aXZlRmxhZ19PVlIoU1BJX1R5cGVEZWYgKlNQSXgpIHsNCi0gIHJldHVybiBMTF9TUElfSXNBY3RpdmVGbGFnX09WUihTUEl4KTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgdW5kZXJydW4gZXJyb3IgZmxhZw0KLSAqIEBybXRvbGwgU1IgICAgICAgICAgIFVEUiAgICAgICAgICAgTExfSTJTX0lzQWN0aXZlRmxhZ19VRFINCi0gKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyU19Jc0FjdGl2ZUZsYWdfVURSKFNQSV9UeXBlRGVmICpTUEl4KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChTUEl4LT5TUiwgU1BJX1NSX1VEUikgPT0gKFNQSV9TUl9VRFIpKSA/IDFVTCA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IGZyYW1lIGZvcm1hdCBlcnJvciBmbGFnDQotICogQHJtdG9sbCBTUiAgICAgICAgICAgRlJFICAgICAgICAgICBMTF9JMlNfSXNBY3RpdmVGbGFnX0ZSRQ0KLSAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJTX0lzQWN0aXZlRmxhZ19GUkUoU1BJX1R5cGVEZWYgKlNQSXgpIHsNCi0gIHJldHVybiBMTF9TUElfSXNBY3RpdmVGbGFnX0ZSRShTUEl4KTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgY2hhbm5lbCBzaWRlIGZsYWcuDQotICogQG5vdGUgICAwOiBDaGFubmVsIExlZnQgaGFzIHRvIGJlIHRyYW5zbWl0dGVkIG9yIGhhcyBiZWVuIHJlY2VpdmVkXG4NCi0gKiAgICAgICAgIDE6IENoYW5uZWwgUmlnaHQgaGFzIHRvIGJlIHRyYW5zbWl0dGVkIG9yIGhhcyBiZWVuIHJlY2VpdmVkXG4NCi0gKiAgICAgICAgIEl0IGhhcyBubyBzaWduaWZpY2FuY2UgaW4gUENNIG1vZGUuDQotICogQHJtdG9sbCBTUiAgICAgICAgICAgQ0hTSURFICAgICAgICBMTF9JMlNfSXNBY3RpdmVGbGFnX0NIU0lERQ0KLSAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJTX0lzQWN0aXZlRmxhZ19DSFNJREUoU1BJX1R5cGVEZWYgKlNQSXgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFNQSXgtPlNSLCBTUElfU1JfQ0hTSURFKSA9PSAoU1BJX1NSX0NIU0lERSkpID8gMVVMIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDbGVhciBvdmVycnVuIGVycm9yIGZsYWcNCi0gKiBAcm10b2xsIFNSICAgICAgICAgICBPVlIgICAgICAgICAgIExMX0kyU19DbGVhckZsYWdfT1ZSDQotICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0kyU19DbGVhckZsYWdfT1ZSKFNQSV9UeXBlRGVmICpTUEl4KSB7DQotICBMTF9TUElfQ2xlYXJGbGFnX09WUihTUEl4KTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDbGVhciB1bmRlcnJ1biBlcnJvciBmbGFnDQotICogQHJtdG9sbCBTUiAgICAgICAgICAgVURSICAgICAgICAgICBMTF9JMlNfQ2xlYXJGbGFnX1VEUg0KLSAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMlNfQ2xlYXJGbGFnX1VEUihTUElfVHlwZURlZiAqU1BJeCkgew0KLSAgX19JTyB1aW50MzJfdCB0bXByZWc7DQotICB0bXByZWcgPSBTUEl4LT5TUjsNCi0gICh2b2lkKXRtcHJlZzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDbGVhciBmcmFtZSBmb3JtYXQgZXJyb3IgZmxhZw0KLSAqIEBybXRvbGwgU1IgICAgICAgICAgIEZSRSAgICAgICAgICAgTExfSTJTX0NsZWFyRmxhZ19GUkUNCi0gKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJTX0NsZWFyRmxhZ19GUkUoU1BJX1R5cGVEZWYgKlNQSXgpIHsNCi0gIExMX1NQSV9DbGVhckZsYWdfRlJFKFNQSXgpOw0KLX0NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgSTJTX0xMX0VGX0lUIEludGVycnVwdCBNYW5hZ2VtZW50DQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSBlcnJvciBJVA0KLSAqIEBub3RlICAgVGhpcyBiaXQgY29udHJvbHMgdGhlIGdlbmVyYXRpb24gb2YgYW4gaW50ZXJydXB0IHdoZW4gYW4gZXJyb3INCi0gKiBjb25kaXRpb24gb2NjdXJzIChPVlIsIFVEUiBhbmQgRlJFIGluIEkyUyBtb2RlKS4NCi0gKiBAcm10b2xsIENSMiAgICAgICAgICBFUlJJRSAgICAgICAgIExMX0kyU19FbmFibGVJVF9FUlINCi0gKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJTX0VuYWJsZUlUX0VSUihTUElfVHlwZURlZiAqU1BJeCkgew0KLSAgTExfU1BJX0VuYWJsZUlUX0VSUihTUEl4KTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgUnggYnVmZmVyIG5vdCBlbXB0eSBJVA0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgIFJYTkVJRSAgICAgICAgTExfSTJTX0VuYWJsZUlUX1JYTkUNCi0gKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJTX0VuYWJsZUlUX1JYTkUoU1BJX1R5cGVEZWYgKlNQSXgpIHsNCi0gIExMX1NQSV9FbmFibGVJVF9SWE5FKFNQSXgpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSBUeCBidWZmZXIgZW1wdHkgSVQNCi0gKiBAcm10b2xsIENSMiAgICAgICAgICBUWEVJRSAgICAgICAgIExMX0kyU19FbmFibGVJVF9UWEUNCi0gKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJTX0VuYWJsZUlUX1RYRShTUElfVHlwZURlZiAqU1BJeCkgew0KLSAgTExfU1BJX0VuYWJsZUlUX1RYRShTUEl4KTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIGVycm9yIElUDQotICogQG5vdGUgICBUaGlzIGJpdCBjb250cm9scyB0aGUgZ2VuZXJhdGlvbiBvZiBhbiBpbnRlcnJ1cHQgd2hlbiBhbiBlcnJvcg0KLSAqIGNvbmRpdGlvbiBvY2N1cnMgKE9WUiwgVURSIGFuZCBGUkUgaW4gSTJTIG1vZGUpLg0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgIEVSUklFICAgICAgICAgTExfSTJTX0Rpc2FibGVJVF9FUlINCi0gKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJTX0Rpc2FibGVJVF9FUlIoU1BJX1R5cGVEZWYgKlNQSXgpIHsNCi0gIExMX1NQSV9EaXNhYmxlSVRfRVJSKFNQSXgpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgUnggYnVmZmVyIG5vdCBlbXB0eSBJVA0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgIFJYTkVJRSAgICAgICAgTExfSTJTX0Rpc2FibGVJVF9SWE5FDQotICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0kyU19EaXNhYmxlSVRfUlhORShTUElfVHlwZURlZiAqU1BJeCkgew0KLSAgTExfU1BJX0Rpc2FibGVJVF9SWE5FKFNQSXgpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgVHggYnVmZmVyIGVtcHR5IElUDQotICogQHJtdG9sbCBDUjIgICAgICAgICAgVFhFSUUgICAgICAgICBMTF9JMlNfRGlzYWJsZUlUX1RYRQ0KLSAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMlNfRGlzYWJsZUlUX1RYRShTUElfVHlwZURlZiAqU1BJeCkgew0KLSAgTExfU1BJX0Rpc2FibGVJVF9UWEUoU1BJeCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgRVJSIElUIGlzIGVuYWJsZWQNCi0gKiBAcm10b2xsIENSMiAgICAgICAgICBFUlJJRSAgICAgICAgIExMX0kyU19Jc0VuYWJsZWRJVF9FUlINCi0gKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyU19Jc0VuYWJsZWRJVF9FUlIoU1BJX1R5cGVEZWYgKlNQSXgpIHsNCi0gIHJldHVybiBMTF9TUElfSXNFbmFibGVkSVRfRVJSKFNQSXgpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIGlmIFJYTkUgSVQgaXMgZW5hYmxlZA0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgIFJYTkVJRSAgICAgICAgTExfSTJTX0lzRW5hYmxlZElUX1JYTkUNCi0gKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyU19Jc0VuYWJsZWRJVF9SWE5FKFNQSV9UeXBlRGVmICpTUEl4KSB7DQotICByZXR1cm4gTExfU1BJX0lzRW5hYmxlZElUX1JYTkUoU1BJeCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgVFhFIElUIGlzIGVuYWJsZWQNCi0gKiBAcm10b2xsIENSMiAgICAgICAgICBUWEVJRSAgICAgICAgIExMX0kyU19Jc0VuYWJsZWRJVF9UWEUNCi0gKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyU19Jc0VuYWJsZWRJVF9UWEUoU1BJX1R5cGVEZWYgKlNQSXgpIHsNCi0gIHJldHVybiBMTF9TUElfSXNFbmFibGVkSVRfVFhFKFNQSXgpOw0KLX0NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgSTJTX0xMX0VGX0RNQSBETUEgTWFuYWdlbWVudA0KLSAqIEB7DQotICovDQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgRE1BIFJ4DQotICogQHJtdG9sbCBDUjIgICAgICAgICAgUlhETUFFTiAgICAgICBMTF9JMlNfRW5hYmxlRE1BUmVxX1JYDQotICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0kyU19FbmFibGVETUFSZXFfUlgoU1BJX1R5cGVEZWYgKlNQSXgpIHsNCi0gIExMX1NQSV9FbmFibGVETUFSZXFfUlgoU1BJeCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBETUEgUngNCi0gKiBAcm10b2xsIENSMiAgICAgICAgICBSWERNQUVOICAgICAgIExMX0kyU19EaXNhYmxlRE1BUmVxX1JYDQotICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0kyU19EaXNhYmxlRE1BUmVxX1JYKFNQSV9UeXBlRGVmICpTUEl4KSB7DQotICBMTF9TUElfRGlzYWJsZURNQVJlcV9SWChTUEl4KTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiBETUEgUnggaXMgZW5hYmxlZA0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgIFJYRE1BRU4gICAgICAgTExfSTJTX0lzRW5hYmxlZERNQVJlcV9SWA0KLSAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJTX0lzRW5hYmxlZERNQVJlcV9SWChTUElfVHlwZURlZiAqU1BJeCkgew0KLSAgcmV0dXJuIExMX1NQSV9Jc0VuYWJsZWRETUFSZXFfUlgoU1BJeCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIERNQSBUeA0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgIFRYRE1BRU4gICAgICAgTExfSTJTX0VuYWJsZURNQVJlcV9UWA0KLSAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMlNfRW5hYmxlRE1BUmVxX1RYKFNQSV9UeXBlRGVmICpTUEl4KSB7DQotICBMTF9TUElfRW5hYmxlRE1BUmVxX1RYKFNQSXgpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgRE1BIFR4DQotICogQHJtdG9sbCBDUjIgICAgICAgICAgVFhETUFFTiAgICAgICBMTF9JMlNfRGlzYWJsZURNQVJlcV9UWA0KLSAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMlNfRGlzYWJsZURNQVJlcV9UWChTUElfVHlwZURlZiAqU1BJeCkgew0KLSAgTExfU1BJX0Rpc2FibGVETUFSZXFfVFgoU1BJeCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgRE1BIFR4IGlzIGVuYWJsZWQNCi0gKiBAcm10b2xsIENSMiAgICAgICAgICBUWERNQUVOICAgICAgIExMX0kyU19Jc0VuYWJsZWRETUFSZXFfVFgNCi0gKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyU19Jc0VuYWJsZWRETUFSZXFfVFgoU1BJX1R5cGVEZWYgKlNQSXgpIHsNCi0gIHJldHVybiBMTF9TUElfSXNFbmFibGVkRE1BUmVxX1RYKFNQSXgpOw0KLX0NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgSTJTX0xMX0VGX0RBVEEgREFUQSBNYW5hZ2VtZW50DQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJlYWQgMTYtQml0cyBpbiBkYXRhIHJlZ2lzdGVyDQotICogQHJtdG9sbCBEUiAgICAgICAgICAgRFIgICAgICAgICAgICBMTF9JMlNfUmVjZWl2ZURhdGExNg0KLSAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFJ4RGF0YSBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwMCBhbmQgTWF4X0RhdGE9MHhGRkZGDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQxNl90IExMX0kyU19SZWNlaXZlRGF0YTE2KFNQSV9UeXBlRGVmICpTUEl4KSB7DQotICByZXR1cm4gTExfU1BJX1JlY2VpdmVEYXRhMTYoU1BJeCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgV3JpdGUgMTYtQml0cyBpbiBkYXRhIHJlZ2lzdGVyDQotICogQHJtdG9sbCBEUiAgICAgICAgICAgRFIgICAgICAgICAgICBMTF9JMlNfVHJhbnNtaXREYXRhMTYNCi0gKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlDQotICogQHBhcmFtICBUeERhdGEgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMDAgYW5kIE1heF9EYXRhPTB4RkZGRg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0kyU19UcmFuc21pdERhdGExNihTUElfVHlwZURlZiAqU1BJeCwgdWludDE2X3QgVHhEYXRhKSB7DQotICBMTF9TUElfVHJhbnNtaXREYXRhMTYoU1BJeCwgVHhEYXRhKTsNCi19DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0jaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpDQotLyoqIEBkZWZncm91cCBJMlNfTExfRUZfSW5pdCBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zDQotICogQHsNCi0gKi8NCi0NCi1FcnJvclN0YXR1cyBMTF9JMlNfRGVJbml0KFNQSV9UeXBlRGVmICpTUEl4KTsNCi1FcnJvclN0YXR1cyBMTF9JMlNfSW5pdChTUElfVHlwZURlZiAqU1BJeCwgTExfSTJTX0luaXRUeXBlRGVmICpJMlNfSW5pdFN0cnVjdCk7DQotdm9pZCBMTF9JMlNfU3RydWN0SW5pdChMTF9JMlNfSW5pdFR5cGVEZWYgKkkyU19Jbml0U3RydWN0KTsNCi12b2lkIExMX0kyU19Db25maWdQcmVzY2FsZXIoU1BJX1R5cGVEZWYgKlNQSXgsIHVpbnQzMl90IFByZXNjYWxlckxpbmVhciwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUHJlc2NhbGVyUGFyaXR5KTsNCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLSNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotI2VuZGlmIC8qIFNQSV9JMlNfU1VQUE9SVCAqLw0KLQ0KLSNlbmRpZiAvKiBkZWZpbmVkIChTUEkxKSB8fCBkZWZpbmVkIChTUEkyKSB8fCBkZWZpbmVkIChTUEkzKSB8fCBkZWZpbmVkIChTUEk0KSBcDQotICAgICAgICAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotI2lmZGVmIF9fY3BsdXNwbHVzDQotfQ0KLSNlbmRpZg0KLQ0KLSNlbmRpZiAvKiBTVE0zMkc0eHhfTExfU1BJX0ggKi8NCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBmaWxlICAgIHN0bTMyZzR4eF9sbF9zcGkuaAorICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFNQSSBMTCBtb2R1bGUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYXR0ZW50aW9uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0ZXJtcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlCisgKiBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb2Z0d2FyZSBjb21wb25lbnQuCisgKiBJZiBubyBMSUNFTlNFIGZpbGUgY29tZXMgd2l0aCB0aGlzIHNvZnR3YXJlLCBpdCBpcyBwcm92aWRlZCBBUy1JUy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJHNHh4X0xMX1NQSV9ICisjZGVmaW5lIFNUTTMyRzR4eF9MTF9TUElfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnNHh4LmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkc0eHhfTExfRHJpdmVyCisgKiBAeworICovCisKKyNpZiBkZWZpbmVkKFNQSTEpIHx8IGRlZmluZWQoU1BJMikgfHwgZGVmaW5lZChTUEkzKSB8fCBkZWZpbmVkKFNQSTQpCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0xMIFNQSQorICogQHsKKyAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIFNQSV9MTF9FU19JTklUIFNQSSBFeHBvcnRlZCBJbml0IHN0cnVjdHVyZQorICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiAgU1BJIEluaXQgc3RydWN0dXJlcyBkZWZpbml0aW9uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDMyX3QgVHJhbnNmZXJEaXJlY3Rpb247IC8qITwgU3BlY2lmaWVzIHRoZSBTUEkgdW5pZGlyZWN0aW9uYWwgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZGlyZWN0aW9uYWwgZGF0YSBtb2RlLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgdmFsdWUgb2YgQHJlZiBTUElfTExfRUNfVFJBTlNGRVJfTU9ERS4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRhcnkgZnVuY3Rpb24gQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfU1BJX1NldFRyYW5zZmVyRGlyZWN0aW9uKCkuKi8KKworICB1aW50MzJfdCBNb2RlOyAvKiE8IFNwZWNpZmllcyB0aGUgU1BJIG1vZGUgKE1hc3Rlci9TbGF2ZSkuCisgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfTExfRUNfTU9ERS4KKworICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5CisgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gQHJlZiBMTF9TUElfU2V0TW9kZSgpLiovCisKKyAgdWludDMyX3QKKyAgICAgIERhdGFXaWR0aDsgLyohPCBTcGVjaWZpZXMgdGhlIFNQSSBkYXRhIHdpZHRoLgorICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU1BJX0xMX0VDX0RBVEFXSURUSC4KKworICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5CisgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gQHJlZiBMTF9TUElfU2V0RGF0YVdpZHRoKCkuKi8KKworICB1aW50MzJfdCBDbG9ja1BvbGFyaXR5OyAvKiE8IFNwZWNpZmllcyB0aGUgc2VyaWFsIGNsb2NrIHN0ZWFkeSBzdGF0ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQSV9MTF9FQ19QT0xBUklUWS4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfU1BJX1NldENsb2NrUG9sYXJpdHkoKS4qLworCisgIHVpbnQzMl90CisgICAgICBDbG9ja1BoYXNlOyAvKiE8IFNwZWNpZmllcyB0aGUgY2xvY2sgYWN0aXZlIGVkZ2UgZm9yIHRoZSBiaXQgY2FwdHVyZS4KKyAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfTExfRUNfUEhBU0UuCisKKyAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkKKyAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gQHJlZiBMTF9TUElfU2V0Q2xvY2tQaGFzZSgpLiovCisKKyAgdWludDMyX3QgTlNTOyAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBOU1Mgc2lnbmFsIGlzIG1hbmFnZWQgYnkgaGFyZHdhcmUKKyAgICAgICAgICAgICAgICAgICAoTlNTIHBpbikgb3IgYnkgc29mdHdhcmUgdXNpbmcgdGhlIFNTSSBiaXQuIFRoaXMgcGFyYW1ldGVyCisgICAgICAgICAgICAgICAgICAgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfTExfRUNfTlNTX01PREUuCisKKyAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5CisgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBAcmVmIExMX1NQSV9TZXROU1NNb2RlKCkuKi8KKworICB1aW50MzJfdCBCYXVkUmF0ZTsgLyohPCBTcGVjaWZpZXMgdGhlIEJhdWRSYXRlIHByZXNjYWxlciB2YWx1ZSB3aGljaCB3aWxsIGJlCisgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgdHJhbnNtaXQgYW5kIHJlY2VpdmUgU0NLIGNsb2NrLgorICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgICBTUElfTExfRUNfQkFVRFJBVEVQUkVTQ0FMRVIuCisgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIFRoZSBjb21tdW5pY2F0aW9uIGNsb2NrIGlzIGRlcml2ZWQgZnJvbSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hc3RlciBjbG9jay4gVGhlIHNsYXZlIGNsb2NrIGRvZXMgbm90IG5lZWQgdG8gYmUgc2V0LgorCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEByZWYgTExfU1BJX1NldEJhdWRSYXRlUHJlc2NhbGVyKCkuKi8KKworICB1aW50MzJfdAorICAgICAgQml0T3JkZXI7IC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgZGF0YSB0cmFuc2ZlcnMgc3RhcnQgZnJvbSBNU0Igb3IgTFNCIGJpdC4KKyAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU1BJX0xMX0VDX0JJVF9PUkRFUi4KKworICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkKKyAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEByZWYgTExfU1BJX1NldFRyYW5zZmVyQml0T3JkZXIoKS4qLworCisgIHVpbnQzMl90IENSQ0NhbGN1bGF0aW9uOyAvKiE8IFNwZWNpZmllcyBpZiB0aGUgQ1JDIGNhbGN1bGF0aW9uIGlzIGVuYWJsZWQgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BJX0xMX0VDX0NSQ19DQUxDVUxBVElPTi4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRhcnkgZnVuY3Rpb25zIEByZWYgTExfU1BJX0VuYWJsZUNSQygpIGFuZCBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTF9TUElfRGlzYWJsZUNSQygpLiovCisKKyAgdWludDMyX3QgQ1JDUG9seTsgLyohPCBTcGVjaWZpZXMgdGhlIHBvbHlub21pYWwgdXNlZCBmb3IgdGhlIENSQyBjYWxjdWxhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAwCisgICAgICAgICAgICAgICAgICAgICAgIGFuZCBNYXhfRGF0YSA9IDB4RkZGRi4KKworICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gQHJlZiBMTF9TUElfU2V0Q1JDUG9seW5vbWlhbCgpLiovCisKK30gTExfU1BJX0luaXRUeXBlRGVmOworCisvKioKKyAqIEB9CisgKi8KKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgU1BJX0xMX0V4cG9ydGVkX0NvbnN0YW50cyBTUEkgRXhwb3J0ZWQgQ29uc3RhbnRzCisgKiBAeworICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0xMX0VDX0dFVF9GTEFHIEdldCBGbGFncyBEZWZpbmVzCisgKiBAYnJpZWYgICAgRmxhZ3MgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX1NQSV9SZWFkUmVnIGZ1bmN0aW9uCisgKiBAeworICovCisjZGVmaW5lIExMX1NQSV9TUl9SWE5FIFNQSV9TUl9SWE5FICAgICAvKiE8IFJ4IGJ1ZmZlciBub3QgZW1wdHkgZmxhZyAgICAgICAgICovCisjZGVmaW5lIExMX1NQSV9TUl9UWEUgU1BJX1NSX1RYRSAgICAgICAvKiE8IFR4IGJ1ZmZlciBlbXB0eSBmbGFnICAgICAgICAgICAgICovCisjZGVmaW5lIExMX1NQSV9TUl9CU1kgU1BJX1NSX0JTWSAgICAgICAvKiE8IEJ1c3kgZmxhZyAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX1NQSV9TUl9DUkNFUlIgU1BJX1NSX0NSQ0VSUiAvKiE8IENSQyBlcnJvciBmbGFnICovCisjZGVmaW5lIExMX1NQSV9TUl9NT0RGIFNQSV9TUl9NT0RGICAgICAvKiE8IE1vZGUgZmF1bHQgZmxhZyAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX1NQSV9TUl9PVlIgU1BJX1NSX09WUiAgICAgICAvKiE8IE92ZXJydW4gZmxhZyAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX1NQSV9TUl9GUkUgU1BJX1NSX0ZSRSAgICAgICAvKiE8IFRJIG1vZGUgZnJhbWUgZm9ybWF0IGVycm9yIGZsYWcgICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBTUElfTExfRUNfSVQgSVQgRGVmaW5lcworICogQGJyaWVmICAgIElUIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9TUElfUmVhZFJlZyBhbmQKKyAqIExMX1NQSV9Xcml0ZVJlZyBmdW5jdGlvbnMKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfU1BJX0NSMl9SWE5FSUUgXAorICBTUElfQ1IyX1JYTkVJRSAvKiE8IFJ4IGJ1ZmZlciBub3QgZW1wdHkgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBMTF9TUElfQ1IyX1RYRUlFIFwKKyAgU1BJX0NSMl9UWEVJRSAvKiE8IFR4IGJ1ZmZlciBlbXB0eSBpbnRlcnJ1cHQgZW5hYmxlICAgICAqLworI2RlZmluZSBMTF9TUElfQ1IyX0VSUklFIFwKKyAgU1BJX0NSMl9FUlJJRSAvKiE8IEVycm9yIGludGVycnVwdCBlbmFibGUgICAgICAgICAgICAgICAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0xMX0VDX01PREUgT3BlcmF0aW9uIE1vZGUKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfU1BJX01PREVfTUFTVEVSIFwKKyAgKFNQSV9DUjFfTVNUUiB8IFNQSV9DUjFfU1NJKSAgICAgICAgLyohPCBNYXN0ZXIgY29uZmlndXJhdGlvbiAgKi8KKyNkZWZpbmUgTExfU1BJX01PREVfU0xBVkUgMHgwMDAwMDAwMFUgLyohPCBTbGF2ZSBjb25maWd1cmF0aW9uICAgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFNQSV9MTF9FQ19QUk9UT0NPTCBTZXJpYWwgUHJvdG9jb2wKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfU1BJX1BST1RPQ09MX01PVE9ST0xBIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBNb3Rvcm9sYSBtb2RlLiBVc2VkIGFzIGRlZmF1bHQgdmFsdWUgKi8KKyNkZWZpbmUgTExfU1BJX1BST1RPQ09MX1RJIFwKKyAgKFNQSV9DUjJfRlJGKSAvKiE8IFRJIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0xMX0VDX1BIQVNFIENsb2NrIFBoYXNlCisgKiBAeworICovCisjZGVmaW5lIExMX1NQSV9QSEFTRV8xRURHRSBcCisgIDB4MDAwMDAwMDBVIC8qITwgRmlyc3QgY2xvY2sgdHJhbnNpdGlvbiBpcyB0aGUgZmlyc3QgZGF0YSBjYXB0dXJlIGVkZ2UgICovCisjZGVmaW5lIExMX1NQSV9QSEFTRV8yRURHRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKFNQSV9DUjFfQ1BIQSkgLyohPCBTZWNvbmQgY2xvY2sgdHJhbnNpdGlvbiBpcyB0aGUgZmlyc3QgZGF0YSBjYXB0dXJlIGVkZ2UgXAorICAgICAgICAgICAgICAgICAgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFNQSV9MTF9FQ19QT0xBUklUWSBDbG9jayBQb2xhcml0eQorICogQHsKKyAqLworI2RlZmluZSBMTF9TUElfUE9MQVJJVFlfTE9XIDB4MDAwMDAwMDBVICAgICAvKiE8IENsb2NrIHRvIDAgd2hlbiBpZGxlICovCisjZGVmaW5lIExMX1NQSV9QT0xBUklUWV9ISUdIIChTUElfQ1IxX0NQT0wpIC8qITwgQ2xvY2sgdG8gMSB3aGVuIGlkbGUgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFNQSV9MTF9FQ19CQVVEUkFURVBSRVNDQUxFUiBCYXVkIFJhdGUgUHJlc2NhbGVyCisgKiBAeworICovCisjZGVmaW5lIExMX1NQSV9CQVVEUkFURVBSRVNDQUxFUl9ESVYyIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBCYXVkUmF0ZSBjb250cm9sIGVxdWFsIHRvIGZQQ0xLLzIgICAqLworI2RlZmluZSBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWNCBcCisgIChTUElfQ1IxX0JSXzApIC8qITwgQmF1ZFJhdGUgY29udHJvbCBlcXVhbCB0byBmUENMSy80ICAgKi8KKyNkZWZpbmUgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjggXAorICAoU1BJX0NSMV9CUl8xKSAvKiE8IEJhdWRSYXRlIGNvbnRyb2wgZXF1YWwgdG8gZlBDTEsvOCAgICovCisjZGVmaW5lIExMX1NQSV9CQVVEUkFURVBSRVNDQUxFUl9ESVYxNiBcCisgIChTUElfQ1IxX0JSXzEgfCBTUElfQ1IxX0JSXzApIC8qITwgQmF1ZFJhdGUgY29udHJvbCBlcXVhbCB0byBmUENMSy8xNiAgKi8KKyNkZWZpbmUgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjMyIFwKKyAgKFNQSV9DUjFfQlJfMikgLyohPCBCYXVkUmF0ZSBjb250cm9sIGVxdWFsIHRvIGZQQ0xLLzMyICAqLworI2RlZmluZSBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWNjQgXAorICAoU1BJX0NSMV9CUl8yIHwgU1BJX0NSMV9CUl8wKSAvKiE8IEJhdWRSYXRlIGNvbnRyb2wgZXF1YWwgdG8gZlBDTEsvNjQgICovCisjZGVmaW5lIExMX1NQSV9CQVVEUkFURVBSRVNDQUxFUl9ESVYxMjggXAorICAoU1BJX0NSMV9CUl8yIHwgU1BJX0NSMV9CUl8xKSAvKiE8IEJhdWRSYXRlIGNvbnRyb2wgZXF1YWwgdG8gZlBDTEsvMTI4ICovCisjZGVmaW5lIExMX1NQSV9CQVVEUkFURVBSRVNDQUxFUl9ESVYyNTYgXAorICAoU1BJX0NSMV9CUl8yIHwgU1BJX0NSMV9CUl8xIHwgICAgICAgIFwKKyAgIFNQSV9DUjFfQlJfMCkgLyohPCBCYXVkUmF0ZSBjb250cm9sIGVxdWFsIHRvIGZQQ0xLLzI1NiAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0xMX0VDX0JJVF9PUkRFUiBUcmFuc21pc3Npb24gQml0IE9yZGVyCisgKiBAeworICovCisjZGVmaW5lIExMX1NQSV9MU0JfRklSU1QgXAorICAoU1BJX0NSMV9MU0JGSVJTVCkgLyohPCBEYXRhIGlzIHRyYW5zbWl0dGVkL3JlY2VpdmVkIHdpdGggdGhlIExTQiBmaXJzdCAqLworI2RlZmluZSBMTF9TUElfTVNCX0ZJUlNUIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBEYXRhIGlzIHRyYW5zbWl0dGVkL3JlY2VpdmVkIHdpdGggdGhlIE1TQiBmaXJzdCAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0xMX0VDX1RSQU5TRkVSX01PREUgVHJhbnNmZXIgTW9kZQorICogQHsKKyAqLworI2RlZmluZSBMTF9TUElfRlVMTF9EVVBMRVggXAorICAweDAwMDAwMDAwVSAvKiE8IEZ1bGwtRHVwbGV4IG1vZGUuIFJ4IGFuZCBUeCB0cmFuc2ZlciBvbiAyIGxpbmVzICovCisjZGVmaW5lIExMX1NQSV9TSU1QTEVYX1JYIFwKKyAgKFNQSV9DUjFfUlhPTkxZKSAvKiE8IFNpbXBsZXggUnggbW9kZS4gIFJ4IHRyYW5zZmVyIG9ubHkgb24gMSBsaW5lICAgICovCisjZGVmaW5lIExMX1NQSV9IQUxGX0RVUExFWF9SWCBcCisgIChTUElfQ1IxX0JJRElNT0RFKSAvKiE8IEhhbGYtRHVwbGV4IFJ4IG1vZGUuIFJ4IHRyYW5zZmVyIG9uIDEgbGluZSAgICAgICovCisjZGVmaW5lIExMX1NQSV9IQUxGX0RVUExFWF9UWCBcCisgIChTUElfQ1IxX0JJRElNT0RFIHwgICAgICAgICBcCisgICBTUElfQ1IxX0JJRElPRSkgLyohPCBIYWxmLUR1cGxleCBUeCBtb2RlLiBUeCB0cmFuc2ZlciBvbiAxIGxpbmUgICAgICAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0xMX0VDX05TU19NT0RFIFNsYXZlIFNlbGVjdCBQaW4gTW9kZQorICogQHsKKyAqLworI2RlZmluZSBMTF9TUElfTlNTX1NPRlQgXAorICAoU1BJX0NSMV9TU00pIC8qITwgTlNTIG1hbmFnZWQgaW50ZXJuYWxseS4gTlNTIHBpbiBub3QgdXNlZCBhbmQgZnJlZSAqLworI2RlZmluZSBMTF9TUElfTlNTX0hBUkRfSU5QVVQgXAorICAweDAwMDAwMDAwVSAvKiE8IE5TUyBwaW4gdXNlZCBpbiBJbnB1dC4gT25seSB1c2VkIGluIE1hc3RlciBtb2RlICovCisjZGVmaW5lIExMX1NQSV9OU1NfSEFSRF9PVVRQVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKHVpbnQzMl90KVNQSV9DUjJfU1NPRSA8PCAxNlUpKSAvKiE8IE5TUyBwaW4gdXNlZCBpbiBPdXRwdXQuIE9ubHkgdXNlZCBpbiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbGF2ZSBtb2RlIGFzIGNoaXAgc2VsZWN0ICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBTUElfTExfRUNfREFUQVdJRFRIIERhdGF3aWR0aAorICogQHsKKyAqLworI2RlZmluZSBMTF9TUElfREFUQVdJRFRIXzRCSVQgXAorICAoU1BJX0NSMl9EU18wIHwgU1BJX0NSMl9EU18xKSAvKiE8IERhdGEgbGVuZ3RoIGZvciBTUEkgdHJhbnNmZXI6ICA0IGJpdHMgKi8KKyNkZWZpbmUgTExfU1BJX0RBVEFXSURUSF81QklUIFwKKyAgKFNQSV9DUjJfRFNfMikgLyohPCBEYXRhIGxlbmd0aCBmb3IgU1BJIHRyYW5zZmVyOiAgNSBiaXRzICovCisjZGVmaW5lIExMX1NQSV9EQVRBV0lEVEhfNkJJVCBcCisgIChTUElfQ1IyX0RTXzIgfCBTUElfQ1IyX0RTXzApIC8qITwgRGF0YSBsZW5ndGggZm9yIFNQSSB0cmFuc2ZlcjogIDYgYml0cyAqLworI2RlZmluZSBMTF9TUElfREFUQVdJRFRIXzdCSVQgXAorICAoU1BJX0NSMl9EU18yIHwgU1BJX0NSMl9EU18xKSAvKiE8IERhdGEgbGVuZ3RoIGZvciBTUEkgdHJhbnNmZXI6ICA3IGJpdHMgKi8KKyNkZWZpbmUgTExfU1BJX0RBVEFXSURUSF84QklUICAgIFwKKyAgKFNQSV9DUjJfRFNfMiB8IFNQSV9DUjJfRFNfMSB8IFwKKyAgIFNQSV9DUjJfRFNfMCkgLyohPCBEYXRhIGxlbmd0aCBmb3IgU1BJIHRyYW5zZmVyOiAgOCBiaXRzICovCisjZGVmaW5lIExMX1NQSV9EQVRBV0lEVEhfOUJJVCBcCisgIChTUElfQ1IyX0RTXzMpIC8qITwgRGF0YSBsZW5ndGggZm9yIFNQSSB0cmFuc2ZlcjogIDkgYml0cyAqLworI2RlZmluZSBMTF9TUElfREFUQVdJRFRIXzEwQklUIFwKKyAgKFNQSV9DUjJfRFNfMyB8IFNQSV9DUjJfRFNfMCkgLyohPCBEYXRhIGxlbmd0aCBmb3IgU1BJIHRyYW5zZmVyOiAxMCBiaXRzICovCisjZGVmaW5lIExMX1NQSV9EQVRBV0lEVEhfMTFCSVQgXAorICAoU1BJX0NSMl9EU18zIHwgU1BJX0NSMl9EU18xKSAvKiE8IERhdGEgbGVuZ3RoIGZvciBTUEkgdHJhbnNmZXI6IDExIGJpdHMgKi8KKyNkZWZpbmUgTExfU1BJX0RBVEFXSURUSF8xMkJJVCAgIFwKKyAgKFNQSV9DUjJfRFNfMyB8IFNQSV9DUjJfRFNfMSB8IFwKKyAgIFNQSV9DUjJfRFNfMCkgLyohPCBEYXRhIGxlbmd0aCBmb3IgU1BJIHRyYW5zZmVyOiAxMiBiaXRzICovCisjZGVmaW5lIExMX1NQSV9EQVRBV0lEVEhfMTNCSVQgXAorICAoU1BJX0NSMl9EU18zIHwgU1BJX0NSMl9EU18yKSAvKiE8IERhdGEgbGVuZ3RoIGZvciBTUEkgdHJhbnNmZXI6IDEzIGJpdHMgKi8KKyNkZWZpbmUgTExfU1BJX0RBVEFXSURUSF8xNEJJVCAgIFwKKyAgKFNQSV9DUjJfRFNfMyB8IFNQSV9DUjJfRFNfMiB8IFwKKyAgIFNQSV9DUjJfRFNfMCkgLyohPCBEYXRhIGxlbmd0aCBmb3IgU1BJIHRyYW5zZmVyOiAxNCBiaXRzICovCisjZGVmaW5lIExMX1NQSV9EQVRBV0lEVEhfMTVCSVQgICBcCisgIChTUElfQ1IyX0RTXzMgfCBTUElfQ1IyX0RTXzIgfCBcCisgICBTUElfQ1IyX0RTXzEpIC8qITwgRGF0YSBsZW5ndGggZm9yIFNQSSB0cmFuc2ZlcjogMTUgYml0cyAqLworI2RlZmluZSBMTF9TUElfREFUQVdJRFRIXzE2QklUICAgICAgICAgICAgICAgICAgXAorICAoU1BJX0NSMl9EU18zIHwgU1BJX0NSMl9EU18yIHwgU1BJX0NSMl9EU18xIHwgXAorICAgU1BJX0NSMl9EU18wKSAvKiE8IERhdGEgbGVuZ3RoIGZvciBTUEkgdHJhbnNmZXI6IDE2IGJpdHMgKi8KKy8qKgorICogQH0KKyAqLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorCisvKiogQGRlZmdyb3VwIFNQSV9MTF9FQ19DUkNfQ0FMQ1VMQVRJT04gQ1JDIENhbGN1bGF0aW9uCisgKiBAeworICovCisjZGVmaW5lIExMX1NQSV9DUkNDQUxDVUxBVElPTl9ESVNBQkxFIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBDUkMgY2FsY3VsYXRpb24gZGlzYWJsZWQgKi8KKyNkZWZpbmUgTExfU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSBcCisgIChTUElfQ1IxX0NSQ0VOKSAvKiE8IENSQyBjYWxjdWxhdGlvbiBlbmFibGVkICAqLworLyoqCisgKiBAfQorICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0xMX0VDX0NSQ19MRU5HVEggQ1JDIExlbmd0aAorICogQHsKKyAqLworI2RlZmluZSBMTF9TUElfQ1JDXzhCSVQgMHgwMDAwMDAwMFUgICAgIC8qITwgIDgtYml0IENSQyBsZW5ndGggKi8KKyNkZWZpbmUgTExfU1BJX0NSQ18xNkJJVCAoU1BJX0NSMV9DUkNMKSAvKiE8IDE2LWJpdCBDUkMgbGVuZ3RoICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBTUElfTExfRUNfUlhfRklGT19USCBSWCBGSUZPIFRocmVzaG9sZAorICogQHsKKyAqLworI2RlZmluZSBMTF9TUElfUlhfRklGT19USF9IQUxGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBSWE5FIGV2ZW50IGlzIGdlbmVyYXRlZCBpZiBGSUZPIGxldmVsIGlzIGdyZWF0ZXIgdGhhbiBvciBcCisgICAgICAgICAgICAgICAgIGVxdWFsIHRvIDEvMiAoMTYtYml0KSAqLworI2RlZmluZSBMTF9TUElfUlhfRklGT19USF9RVUFSVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChTUElfQ1IyX0ZSWFRIKSAvKiE8IFJYTkUgZXZlbnQgaXMgZ2VuZXJhdGVkIGlmIEZJRk8gbGV2ZWwgaXMgZ3JlYXRlciB0aGFuIFwKKyAgICAgICAgICAgICAgICAgICAgIG9yIGVxdWFsIHRvIDEvNCAoOC1iaXQpICAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0xMX0VDX1JYX0ZJRk8gUlggRklGTyBMZXZlbAorICogQHsKKyAqLworI2RlZmluZSBMTF9TUElfUlhfRklGT19FTVBUWSAweDAwMDAwMDAwVSAvKiE8IEZJRk8gcmVjZXB0aW9uIGVtcHR5ICovCisjZGVmaW5lIExMX1NQSV9SWF9GSUZPX1FVQVJURVJfRlVMTCBcCisgIChTUElfU1JfRlJMVkxfMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRklGTyByZWNlcHRpb24gMS80ICAgKi8KKyNkZWZpbmUgTExfU1BJX1JYX0ZJRk9fSEFMRl9GVUxMIChTUElfU1JfRlJMVkxfMSkgLyohPCBGSUZPIHJlY2VwdGlvbiAxLzIgICAqLworI2RlZmluZSBMTF9TUElfUlhfRklGT19GVUxMIFwKKyAgKFNQSV9TUl9GUkxWTF8xIHwgU1BJX1NSX0ZSTFZMXzApIC8qITwgRklGTyByZWNlcHRpb24gZnVsbCAgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFNQSV9MTF9FQ19UWF9GSUZPIFRYIEZJRk8gTGV2ZWwKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfU1BJX1RYX0ZJRk9fRU1QVFkgMHgwMDAwMDAwMFUgLyohPCBGSUZPIHRyYW5zbWlzc2lvbiBlbXB0eSAqLworI2RlZmluZSBMTF9TUElfVFhfRklGT19RVUFSVEVSX0ZVTEwgXAorICAoU1BJX1NSX0ZUTFZMXzApIC8qITwgRklGTyB0cmFuc21pc3Npb24gMS80ICAgKi8KKyNkZWZpbmUgTExfU1BJX1RYX0ZJRk9fSEFMRl9GVUxMIFwKKyAgKFNQSV9TUl9GVExWTF8xKSAvKiE8IEZJRk8gdHJhbnNtaXNzaW9uIDEvMiAgICovCisjZGVmaW5lIExMX1NQSV9UWF9GSUZPX0ZVTEwgXAorICAoU1BJX1NSX0ZUTFZMXzEgfCBTUElfU1JfRlRMVkxfMCkgLyohPCBGSUZPIHRyYW5zbWlzc2lvbiBmdWxsICAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0xMX0VDX0RNQV9QQVJJVFkgRE1BIFBhcml0eQorICogQHsKKyAqLworI2RlZmluZSBMTF9TUElfRE1BX1BBUklUWV9FVkVOIDB4MDAwMDAwMDBVIC8qITwgU2VsZWN0IERNQSBwYXJpdHkgRXZlbiAqLworI2RlZmluZSBMTF9TUElfRE1BX1BBUklUWV9PREQgMHgwMDAwMDAwMVUgIC8qITwgU2VsZWN0IERNQSBwYXJpdHkgT2RkICAqLworCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFNQSV9MTF9FeHBvcnRlZF9NYWNyb3MgU1BJIEV4cG9ydGVkIE1hY3JvcworICogQHsKKyAqLworCisvKiogQGRlZmdyb3VwIFNQSV9MTF9FTV9XUklURV9SRUFEIENvbW1vbiBXcml0ZSBhbmQgcmVhZCByZWdpc3RlcnMgTWFjcm9zCisgKiBAeworICovCisKKy8qKgorICogQGJyaWVmICBXcml0ZSBhIHZhbHVlIGluIFNQSSByZWdpc3RlcgorICogQHBhcmFtICBfX0lOU1RBTkNFX18gU1BJIEluc3RhbmNlCisgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgd3JpdHRlbgorICogQHBhcmFtICBfX1ZBTFVFX18gVmFsdWUgdG8gYmUgd3JpdHRlbiBpbiB0aGUgcmVnaXN0ZXIKKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIExMX1NQSV9Xcml0ZVJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18sIF9fVkFMVUVfXykgXAorICBXUklURV9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fLCAoX19WQUxVRV9fKSkKKworLyoqCisgKiBAYnJpZWYgIFJlYWQgYSB2YWx1ZSBpbiBTUEkgcmVnaXN0ZXIKKyAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIFNQSSBJbnN0YW5jZQorICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHJlYWQKKyAqIEByZXR2YWwgUmVnaXN0ZXIgdmFsdWUKKyAqLworI2RlZmluZSBMTF9TUElfUmVhZFJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18pIFJFQURfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXykKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgU1BJX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucyBTUEkgRXhwb3J0ZWQgRnVuY3Rpb25zCisgKiBAeworICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0xMX0VGX0NvbmZpZ3VyYXRpb24gQ29uZmlndXJhdGlvbgorICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiAgRW5hYmxlIFNQSSBwZXJpcGhlcmFsCisgKiBAcm10b2xsIENSMSAgICAgICAgICBTUEUgICAgICAgICAgIExMX1NQSV9FbmFibGUKKyAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfRW5hYmxlKFNQSV9UeXBlRGVmICpTUEl4KSB7CisgIFNFVF9CSVQoU1BJeC0+Q1IxLCBTUElfQ1IxX1NQRSk7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIFNQSSBwZXJpcGhlcmFsCisgKiBAbm90ZSAgIFdoZW4gZGlzYWJsaW5nIHRoZSBTUEksIGZvbGxvdyB0aGUgcHJvY2VkdXJlIGRlc2NyaWJlZCBpbiB0aGUKKyAqIFJlZmVyZW5jZSBNYW51YWwuCisgKiBAcm10b2xsIENSMSAgICAgICAgICBTUEUgICAgICAgICAgIExMX1NQSV9EaXNhYmxlCisgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX0Rpc2FibGUoU1BJX1R5cGVEZWYgKlNQSXgpIHsKKyAgQ0xFQVJfQklUKFNQSXgtPkNSMSwgU1BJX0NSMV9TUEUpOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgU1BJIHBlcmlwaGVyYWwgaXMgZW5hYmxlZAorICogQHJtdG9sbCBDUjEgICAgICAgICAgU1BFICAgICAgICAgICBMTF9TUElfSXNFbmFibGVkCisgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9Jc0VuYWJsZWQoY29uc3QgU1BJX1R5cGVEZWYgKlNQSXgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoU1BJeC0+Q1IxLCBTUElfQ1IxX1NQRSkgPT0gKFNQSV9DUjFfU1BFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgU2V0IFNQSSBvcGVyYXRpb24gbW9kZSB0byBNYXN0ZXIgb3IgU2xhdmUKKyAqIEBub3RlICAgVGhpcyBiaXQgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkIHdoZW4gY29tbXVuaWNhdGlvbiBpcyBvbmdvaW5nLgorICogQHJtdG9sbCBDUjEgICAgICAgICAgTVNUUiAgICAgICAgICBMTF9TUElfU2V0TW9kZVxuCisgKiAgICAgICAgIENSMSAgICAgICAgICBTU0kgICAgICAgICAgIExMX1NQSV9TZXRNb2RlCisgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgKiBAcGFyYW0gIE1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9NT0RFX01BU1RFUgorICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX01PREVfU0xBVkUKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfU2V0TW9kZShTUElfVHlwZURlZiAqU1BJeCwgdWludDMyX3QgTW9kZSkgeworICBNT0RJRllfUkVHKFNQSXgtPkNSMSwgU1BJX0NSMV9NU1RSIHwgU1BJX0NSMV9TU0ksIE1vZGUpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IFNQSSBvcGVyYXRpb24gbW9kZSAoTWFzdGVyIG9yIFNsYXZlKQorICogQHJtdG9sbCBDUjEgICAgICAgICAgTVNUUiAgICAgICAgICBMTF9TUElfR2V0TW9kZVxuCisgKiAgICAgICAgIENSMSAgICAgICAgICBTU0kgICAgICAgICAgIExMX1NQSV9HZXRNb2RlCisgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfTU9ERV9NQVNURVIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9NT0RFX1NMQVZFCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfR2V0TW9kZShjb25zdCBTUElfVHlwZURlZiAqU1BJeCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTUEl4LT5DUjEsIFNQSV9DUjFfTVNUUiB8IFNQSV9DUjFfU1NJKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBTZXQgc2VyaWFsIHByb3RvY29sIHVzZWQKKyAqIEBub3RlICAgVGhpcyBiaXQgc2hvdWxkIGJlIHdyaXR0ZW4gb25seSB3aGVuIFNQSSBpcyBkaXNhYmxlZCAoU1BFID0gMCkgZm9yCisgKiBjb3JyZWN0IG9wZXJhdGlvbi4KKyAqIEBybXRvbGwgQ1IyICAgICAgICAgIEZSRiAgICAgICAgICAgTExfU1BJX1NldFN0YW5kYXJkCisgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgKiBAcGFyYW0gIFN0YW5kYXJkIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfUFJPVE9DT0xfTU9UT1JPTEEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9QUk9UT0NPTF9USQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9TZXRTdGFuZGFyZChTUElfVHlwZURlZiAqU1BJeCwgdWludDMyX3QgU3RhbmRhcmQpIHsKKyAgTU9ESUZZX1JFRyhTUEl4LT5DUjIsIFNQSV9DUjJfRlJGLCBTdGFuZGFyZCk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgc2VyaWFsIHByb3RvY29sIHVzZWQKKyAqIEBybXRvbGwgQ1IyICAgICAgICAgIEZSRiAgICAgICAgICAgTExfU1BJX0dldFN0YW5kYXJkCisgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfUFJPVE9DT0xfTU9UT1JPTEEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9QUk9UT0NPTF9USQorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0dldFN0YW5kYXJkKGNvbnN0IFNQSV9UeXBlRGVmICpTUEl4KSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFNQSXgtPkNSMiwgU1BJX0NSMl9GUkYpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFNldCBjbG9jayBwaGFzZQorICogQG5vdGUgICBUaGlzIGJpdCBzaG91bGQgbm90IGJlIGNoYW5nZWQgd2hlbiBjb21tdW5pY2F0aW9uIGlzIG9uZ29pbmcuCisgKiAgICAgICAgIFRoaXMgYml0IGlzIG5vdCB1c2VkIGluIFNQSSBUSSBtb2RlLgorICogQHJtdG9sbCBDUjEgICAgICAgICAgQ1BIQSAgICAgICAgICBMTF9TUElfU2V0Q2xvY2tQaGFzZQorICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICogQHBhcmFtICBDbG9ja1BoYXNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfUEhBU0VfMUVER0UKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9QSEFTRV8yRURHRQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9TZXRDbG9ja1BoYXNlKFNQSV9UeXBlRGVmICpTUEl4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2xvY2tQaGFzZSkgeworICBNT0RJRllfUkVHKFNQSXgtPkNSMSwgU1BJX0NSMV9DUEhBLCBDbG9ja1BoYXNlKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBjbG9jayBwaGFzZQorICogQHJtdG9sbCBDUjEgICAgICAgICAgQ1BIQSAgICAgICAgICBMTF9TUElfR2V0Q2xvY2tQaGFzZQorICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX1BIQVNFXzFFREdFCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfUEhBU0VfMkVER0UKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9HZXRDbG9ja1BoYXNlKGNvbnN0IFNQSV9UeXBlRGVmICpTUEl4KSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFNQSXgtPkNSMSwgU1BJX0NSMV9DUEhBKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBTZXQgY2xvY2sgcG9sYXJpdHkKKyAqIEBub3RlICAgVGhpcyBiaXQgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkIHdoZW4gY29tbXVuaWNhdGlvbiBpcyBvbmdvaW5nLgorICogICAgICAgICBUaGlzIGJpdCBpcyBub3QgdXNlZCBpbiBTUEkgVEkgbW9kZS4KKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIENQT0wgICAgICAgICAgTExfU1BJX1NldENsb2NrUG9sYXJpdHkKKyAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAqIEBwYXJhbSAgQ2xvY2tQb2xhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX1BPTEFSSVRZX0xPVworICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX1BPTEFSSVRZX0hJR0gKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfU2V0Q2xvY2tQb2xhcml0eShTUElfVHlwZURlZiAqU1BJeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENsb2NrUG9sYXJpdHkpIHsKKyAgTU9ESUZZX1JFRyhTUEl4LT5DUjEsIFNQSV9DUjFfQ1BPTCwgQ2xvY2tQb2xhcml0eSk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgY2xvY2sgcG9sYXJpdHkKKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIENQT0wgICAgICAgICAgTExfU1BJX0dldENsb2NrUG9sYXJpdHkKKyAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9QT0xBUklUWV9MT1cKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9QT0xBUklUWV9ISUdICisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfR2V0Q2xvY2tQb2xhcml0eShjb25zdCBTUElfVHlwZURlZiAqU1BJeCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTUEl4LT5DUjEsIFNQSV9DUjFfQ1BPTCkpOworfQorCisvKioKKyAqIEBicmllZiAgU2V0IGJhdWQgcmF0ZSBwcmVzY2FsZXIKKyAqIEBub3RlICAgVGhlc2UgYml0cyBzaG91bGQgbm90IGJlIGNoYW5nZWQgd2hlbiBjb21tdW5pY2F0aW9uIGlzIG9uZ29pbmcuIFNQSQorICogQmF1ZFJhdGUgPSBmUENMSy9QcmVzY2FsZXIuCisgKiBAcm10b2xsIENSMSAgICAgICAgICBCUiAgICAgICAgICAgIExMX1NQSV9TZXRCYXVkUmF0ZVByZXNjYWxlcgorICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICogQHBhcmFtICBCYXVkUmF0ZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9CQVVEUkFURVBSRVNDQUxFUl9ESVY0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWOAorICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjE2CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWMzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9CQVVEUkFURVBSRVNDQUxFUl9ESVY2NAorICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjEyOAorICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjI1NgorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9TZXRCYXVkUmF0ZVByZXNjYWxlcihTUElfVHlwZURlZiAqU1BJeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBCYXVkUmF0ZSkgeworICBNT0RJRllfUkVHKFNQSXgtPkNSMSwgU1BJX0NSMV9CUiwgQmF1ZFJhdGUpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IGJhdWQgcmF0ZSBwcmVzY2FsZXIKKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIEJSICAgICAgICAgICAgTExfU1BJX0dldEJhdWRSYXRlUHJlc2NhbGVyCisgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWMgorICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9CQVVEUkFURVBSRVNDQUxFUl9ESVY4CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWMTYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9CQVVEUkFURVBSRVNDQUxFUl9ESVYzMgorICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjY0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWMTI4CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWMjU2CisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfR2V0QmF1ZFJhdGVQcmVzY2FsZXIoY29uc3QgU1BJX1R5cGVEZWYgKlNQSXgpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoU1BJeC0+Q1IxLCBTUElfQ1IxX0JSKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBTZXQgdHJhbnNmZXIgYml0IG9yZGVyCisgKiBAbm90ZSAgIFRoaXMgYml0IHNob3VsZCBub3QgYmUgY2hhbmdlZCB3aGVuIGNvbW11bmljYXRpb24gaXMgb25nb2luZy4gVGhpcworICogYml0IGlzIG5vdCB1c2VkIGluIFNQSSBUSSBtb2RlLgorICogQHJtdG9sbCBDUjEgICAgICAgICAgTFNCRklSU1QgICAgICBMTF9TUElfU2V0VHJhbnNmZXJCaXRPcmRlcgorICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICogQHBhcmFtICBCaXRPcmRlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0xTQl9GSVJTVAorICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX01TQl9GSVJTVAorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9TZXRUcmFuc2ZlckJpdE9yZGVyKFNQSV9UeXBlRGVmICpTUEl4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQml0T3JkZXIpIHsKKyAgTU9ESUZZX1JFRyhTUEl4LT5DUjEsIFNQSV9DUjFfTFNCRklSU1QsIEJpdE9yZGVyKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCB0cmFuc2ZlciBiaXQgb3JkZXIKKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIExTQkZJUlNUICAgICAgTExfU1BJX0dldFRyYW5zZmVyQml0T3JkZXIKKyAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9MU0JfRklSU1QKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9NU0JfRklSU1QKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9HZXRUcmFuc2ZlckJpdE9yZGVyKGNvbnN0IFNQSV9UeXBlRGVmICpTUEl4KSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFNQSXgtPkNSMSwgU1BJX0NSMV9MU0JGSVJTVCkpOworfQorCisvKioKKyAqIEBicmllZiAgU2V0IHRyYW5zZmVyIGRpcmVjdGlvbiBtb2RlCisgKiBAbm90ZSAgIEZvciBIYWxmLUR1cGxleCBtb2RlLCBSeCBEaXJlY3Rpb24gaXMgc2V0IGJ5IGRlZmF1bHQuCisgKiAgICAgICAgIEluIG1hc3RlciBtb2RlLCB0aGUgTU9TSSBwaW4gaXMgdXNlZCBhbmQgaW4gc2xhdmUgbW9kZSwgdGhlIE1JU08gcGluCisgKiBpcyB1c2VkIGZvciBIYWxmLUR1cGxleC4KKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIFJYT05MWSAgICAgICAgTExfU1BJX1NldFRyYW5zZmVyRGlyZWN0aW9uXG4KKyAqICAgICAgICAgQ1IxICAgICAgICAgIEJJRElNT0RFICAgICAgTExfU1BJX1NldFRyYW5zZmVyRGlyZWN0aW9uXG4KKyAqICAgICAgICAgQ1IxICAgICAgICAgIEJJRElPRSAgICAgICAgTExfU1BJX1NldFRyYW5zZmVyRGlyZWN0aW9uCisgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgKiBAcGFyYW0gIFRyYW5zZmVyRGlyZWN0aW9uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfRlVMTF9EVVBMRVgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9TSU1QTEVYX1JYCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfSEFMRl9EVVBMRVhfUlgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9IQUxGX0RVUExFWF9UWAorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9TZXRUcmFuc2ZlckRpcmVjdGlvbihTUElfVHlwZURlZiAqU1BJeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUcmFuc2ZlckRpcmVjdGlvbikgeworICBNT0RJRllfUkVHKFNQSXgtPkNSMSwgU1BJX0NSMV9SWE9OTFkgfCBTUElfQ1IxX0JJRElNT0RFIHwgU1BJX0NSMV9CSURJT0UsCisgICAgICAgICAgICAgVHJhbnNmZXJEaXJlY3Rpb24pOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IHRyYW5zZmVyIGRpcmVjdGlvbiBtb2RlCisgKiBAcm10b2xsIENSMSAgICAgICAgICBSWE9OTFkgICAgICAgIExMX1NQSV9HZXRUcmFuc2ZlckRpcmVjdGlvblxuCisgKiAgICAgICAgIENSMSAgICAgICAgICBCSURJTU9ERSAgICAgIExMX1NQSV9HZXRUcmFuc2ZlckRpcmVjdGlvblxuCisgKiAgICAgICAgIENSMSAgICAgICAgICBCSURJT0UgICAgICAgIExMX1NQSV9HZXRUcmFuc2ZlckRpcmVjdGlvbgorICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0ZVTExfRFVQTEVYCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfU0lNUExFWF9SWAorICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0hBTEZfRFVQTEVYX1JYCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfSEFMRl9EVVBMRVhfVFgKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9HZXRUcmFuc2ZlckRpcmVjdGlvbihjb25zdCBTUElfVHlwZURlZiAqU1BJeCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVCgKKyAgICAgIFNQSXgtPkNSMSwgU1BJX0NSMV9SWE9OTFkgfCBTUElfQ1IxX0JJRElNT0RFIHwgU1BJX0NSMV9CSURJT0UpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFNldCBmcmFtZSBkYXRhIHdpZHRoCisgKiBAcm10b2xsIENSMiAgICAgICAgICBEUyAgICAgICAgICAgIExMX1NQSV9TZXREYXRhV2lkdGgKKyAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAqIEBwYXJhbSAgRGF0YVdpZHRoIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzRCSVQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9EQVRBV0lEVEhfNUJJVAorICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0RBVEFXSURUSF82QklUCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzdCSVQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9EQVRBV0lEVEhfOEJJVAorICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0RBVEFXSURUSF85QklUCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzEwQklUCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzExQklUCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzEyQklUCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzEzQklUCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzE0QklUCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzE1QklUCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzE2QklUCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX1NldERhdGFXaWR0aChTUElfVHlwZURlZiAqU1BJeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRGF0YVdpZHRoKSB7CisgIE1PRElGWV9SRUcoU1BJeC0+Q1IyLCBTUElfQ1IyX0RTLCBEYXRhV2lkdGgpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IGZyYW1lIGRhdGEgd2lkdGgKKyAqIEBybXRvbGwgQ1IyICAgICAgICAgIERTICAgICAgICAgICAgTExfU1BJX0dldERhdGFXaWR0aAorICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0RBVEFXSURUSF80QklUCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzVCSVQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9EQVRBV0lEVEhfNkJJVAorICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0RBVEFXSURUSF83QklUCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzhCSVQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9EQVRBV0lEVEhfOUJJVAorICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0RBVEFXSURUSF8xMEJJVAorICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0RBVEFXSURUSF8xMUJJVAorICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0RBVEFXSURUSF8xMkJJVAorICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0RBVEFXSURUSF8xM0JJVAorICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0RBVEFXSURUSF8xNEJJVAorICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0RBVEFXSURUSF8xNUJJVAorICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0RBVEFXSURUSF8xNkJJVAorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0dldERhdGFXaWR0aChjb25zdCBTUElfVHlwZURlZiAqU1BJeCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTUEl4LT5DUjIsIFNQSV9DUjJfRFMpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFNldCB0aHJlc2hvbGQgb2YgUlhGSUZPIHRoYXQgdHJpZ2dlcnMgYW4gUlhORSBldmVudAorICogQHJtdG9sbCBDUjIgICAgICAgICAgRlJYVEggICAgICAgICBMTF9TUElfU2V0UnhGSUZPVGhyZXNob2xkCisgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgKiBAcGFyYW0gIFRocmVzaG9sZCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX1JYX0ZJRk9fVEhfSEFMRgorICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX1JYX0ZJRk9fVEhfUVVBUlRFUgorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9TZXRSeEZJRk9UaHJlc2hvbGQoU1BJX1R5cGVEZWYgKlNQSXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRocmVzaG9sZCkgeworICBNT0RJRllfUkVHKFNQSXgtPkNSMiwgU1BJX0NSMl9GUlhUSCwgVGhyZXNob2xkKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCB0aHJlc2hvbGQgb2YgUlhGSUZPIHRoYXQgdHJpZ2dlcnMgYW4gUlhORSBldmVudAorICogQHJtdG9sbCBDUjIgICAgICAgICAgRlJYVEggICAgICAgICBMTF9TUElfR2V0UnhGSUZPVGhyZXNob2xkCisgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfUlhfRklGT19USF9IQUxGCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfUlhfRklGT19USF9RVUFSVEVSCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfR2V0UnhGSUZPVGhyZXNob2xkKGNvbnN0IFNQSV9UeXBlRGVmICpTUEl4KSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFNQSXgtPkNSMiwgU1BJX0NSMl9GUlhUSCkpOworfQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBTUElfTExfRUZfQ1JDX01hbmFnZW1lbnQgQ1JDIE1hbmFnZW1lbnQKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBDUkMKKyAqIEBub3RlICAgVGhpcyBiaXQgc2hvdWxkIGJlIHdyaXR0ZW4gb25seSB3aGVuIFNQSSBpcyBkaXNhYmxlZCAoU1BFID0gMCkgZm9yCisgKiBjb3JyZWN0IG9wZXJhdGlvbi4KKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIENSQ0VOICAgICAgICAgTExfU1BJX0VuYWJsZUNSQworICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9FbmFibGVDUkMoU1BJX1R5cGVEZWYgKlNQSXgpIHsKKyAgU0VUX0JJVChTUEl4LT5DUjEsIFNQSV9DUjFfQ1JDRU4pOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBDUkMKKyAqIEBub3RlICAgVGhpcyBiaXQgc2hvdWxkIGJlIHdyaXR0ZW4gb25seSB3aGVuIFNQSSBpcyBkaXNhYmxlZCAoU1BFID0gMCkgZm9yCisgKiBjb3JyZWN0IG9wZXJhdGlvbi4KKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIENSQ0VOICAgICAgICAgTExfU1BJX0Rpc2FibGVDUkMKKyAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfRGlzYWJsZUNSQyhTUElfVHlwZURlZiAqU1BJeCkgeworICBDTEVBUl9CSVQoU1BJeC0+Q1IxLCBTUElfQ1IxX0NSQ0VOKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIENSQyBpcyBlbmFibGVkCisgKiBAbm90ZSAgIFRoaXMgYml0IHNob3VsZCBiZSB3cml0dGVuIG9ubHkgd2hlbiBTUEkgaXMgZGlzYWJsZWQgKFNQRSA9IDApIGZvcgorICogY29ycmVjdCBvcGVyYXRpb24uCisgKiBAcm10b2xsIENSMSAgICAgICAgICBDUkNFTiAgICAgICAgIExMX1NQSV9Jc0VuYWJsZWRDUkMKKyAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0lzRW5hYmxlZENSQyhjb25zdCBTUElfVHlwZURlZiAqU1BJeCkgeworICByZXR1cm4gKChSRUFEX0JJVChTUEl4LT5DUjEsIFNQSV9DUjFfQ1JDRU4pID09IChTUElfQ1IxX0NSQ0VOKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgU2V0IENSQyBMZW5ndGgKKyAqIEBub3RlICAgVGhpcyBiaXQgc2hvdWxkIGJlIHdyaXR0ZW4gb25seSB3aGVuIFNQSSBpcyBkaXNhYmxlZCAoU1BFID0gMCkgZm9yCisgKiBjb3JyZWN0IG9wZXJhdGlvbi4KKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIENSQ0wgICAgICAgICAgTExfU1BJX1NldENSQ1dpZHRoCisgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgKiBAcGFyYW0gIENSQ0xlbmd0aCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0NSQ184QklUCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfQ1JDXzE2QklUCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX1NldENSQ1dpZHRoKFNQSV9UeXBlRGVmICpTUEl4LCB1aW50MzJfdCBDUkNMZW5ndGgpIHsKKyAgTU9ESUZZX1JFRyhTUEl4LT5DUjEsIFNQSV9DUjFfQ1JDTCwgQ1JDTGVuZ3RoKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBDUkMgTGVuZ3RoCisgKiBAcm10b2xsIENSMSAgICAgICAgICBDUkNMICAgICAgICAgIExMX1NQSV9HZXRDUkNXaWR0aAorICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0NSQ184QklUCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfQ1JDXzE2QklUCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfR2V0Q1JDV2lkdGgoY29uc3QgU1BJX1R5cGVEZWYgKlNQSXgpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoU1BJeC0+Q1IxLCBTUElfQ1IxX0NSQ0wpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFNldCBDUkNOZXh0IHRvIHRyYW5zZmVyIENSQyBvbiB0aGUgbGluZQorICogQG5vdGUgICBUaGlzIGJpdCBoYXMgdG8gYmUgd3JpdHRlbiBhcyBzb29uIGFzIHRoZSBsYXN0IGRhdGEgaXMgd3JpdHRlbiBpbiB0aGUKKyAqIFNQSXhfRFIgcmVnaXN0ZXIuCisgKiBAcm10b2xsIENSMSAgICAgICAgICBDUkNORVhUICAgICAgIExMX1NQSV9TZXRDUkNOZXh0CisgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX1NldENSQ05leHQoU1BJX1R5cGVEZWYgKlNQSXgpIHsKKyAgU0VUX0JJVChTUEl4LT5DUjEsIFNQSV9DUjFfQ1JDTkVYVCk7Cit9CisKKy8qKgorICogQGJyaWVmICBTZXQgcG9seW5vbWlhbCBmb3IgQ1JDIGNhbGN1bGF0aW9uCisgKiBAcm10b2xsIENSQ1BSICAgICAgICBDUkNQT0xZICAgICAgIExMX1NQSV9TZXRDUkNQb2x5bm9taWFsCisgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgKiBAcGFyYW0gIENSQ1BvbHkgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMCBhbmQKKyAqIE1heF9EYXRhID0gMHhGRkZGCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX1NldENSQ1BvbHlub21pYWwoU1BJX1R5cGVEZWYgKlNQSXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDUkNQb2x5KSB7CisgIFdSSVRFX1JFRyhTUEl4LT5DUkNQUiwgKHVpbnQxNl90KUNSQ1BvbHkpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IHBvbHlub21pYWwgZm9yIENSQyBjYWxjdWxhdGlvbgorICogQHJtdG9sbCBDUkNQUiAgICAgICAgQ1JDUE9MWSAgICAgICBMTF9TUElfR2V0Q1JDUG9seW5vbWlhbAorICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBpcyBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMCBhbmQgTWF4X0RhdGEgPQorICogMHhGRkZGCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfR2V0Q1JDUG9seW5vbWlhbChjb25zdCBTUElfVHlwZURlZiAqU1BJeCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX1JFRyhTUEl4LT5DUkNQUikpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IFJ4IENSQworICogQHJtdG9sbCBSWENSQ1IgICAgICAgUlhDUkMgICAgICAgICBMTF9TUElfR2V0UnhDUkMKKyAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgaXMgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MDAgYW5kIE1heF9EYXRhID0KKyAqIDB4RkZGRgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0dldFJ4Q1JDKGNvbnN0IFNQSV9UeXBlRGVmICpTUEl4KSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfUkVHKFNQSXgtPlJYQ1JDUikpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IFR4IENSQworICogQHJtdG9sbCBUWENSQ1IgICAgICAgVFhDUkMgICAgICAgICBMTF9TUElfR2V0VHhDUkMKKyAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgaXMgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MDAgYW5kIE1heF9EYXRhID0KKyAqIDB4RkZGRgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0dldFR4Q1JDKGNvbnN0IFNQSV9UeXBlRGVmICpTUEl4KSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfUkVHKFNQSXgtPlRYQ1JDUikpOworfQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBTUElfTExfRUZfTlNTX01hbmFnZW1lbnQgU2xhdmUgU2VsZWN0IFBpbiBNYW5hZ2VtZW50CisgKiBAeworICovCisKKy8qKgorICogQGJyaWVmICBTZXQgTlNTIG1vZGUKKyAqIEBub3RlICAgTExfU1BJX05TU19TT0ZUIE1vZGUgaXMgbm90IHVzZWQgaW4gU1BJIFRJIG1vZGUuCisgKiBAcm10b2xsIENSMSAgICAgICAgICBTU00gICAgICAgICAgIExMX1NQSV9TZXROU1NNb2RlXG4KKyAqIEBybXRvbGwgQ1IyICAgICAgICAgIFNTT0UgICAgICAgICAgTExfU1BJX1NldE5TU01vZGUKKyAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAqIEBwYXJhbSAgTlNTIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfTlNTX1NPRlQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9OU1NfSEFSRF9JTlBVVAorICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX05TU19IQVJEX09VVFBVVAorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9TZXROU1NNb2RlKFNQSV9UeXBlRGVmICpTUEl4LCB1aW50MzJfdCBOU1MpIHsKKyAgTU9ESUZZX1JFRyhTUEl4LT5DUjEsIFNQSV9DUjFfU1NNLCBOU1MpOworICBNT0RJRllfUkVHKFNQSXgtPkNSMiwgU1BJX0NSMl9TU09FLCAoKHVpbnQzMl90KShOU1MgPj4gMTZVKSkpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IE5TUyBtb2RlCisgKiBAcm10b2xsIENSMSAgICAgICAgICBTU00gICAgICAgICAgIExMX1NQSV9HZXROU1NNb2RlXG4KKyAqIEBybXRvbGwgQ1IyICAgICAgICAgIFNTT0UgICAgICAgICAgTExfU1BJX0dldE5TU01vZGUKKyAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9OU1NfU09GVAorICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX05TU19IQVJEX0lOUFVUCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfTlNTX0hBUkRfT1VUUFVUCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfR2V0TlNTTW9kZShjb25zdCBTUElfVHlwZURlZiAqU1BJeCkgeworICB1aW50MzJfdCBTc20gPSAoUkVBRF9CSVQoU1BJeC0+Q1IxLCBTUElfQ1IxX1NTTSkpOworICB1aW50MzJfdCBTc29lID0gKFJFQURfQklUKFNQSXgtPkNSMiwgU1BJX0NSMl9TU09FKSA8PCAxNlUpOworICByZXR1cm4gKFNzbSB8IFNzb2UpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIE5TUyBwdWxzZSBtYW5hZ2VtZW50CisgKiBAbm90ZSAgIFRoaXMgYml0IHNob3VsZCBub3QgYmUgY2hhbmdlZCB3aGVuIGNvbW11bmljYXRpb24gaXMgb25nb2luZy4gVGhpcworICogYml0IGlzIG5vdCB1c2VkIGluIFNQSSBUSSBtb2RlLgorICogQHJtdG9sbCBDUjIgICAgICAgICAgTlNTUCAgICAgICAgICBMTF9TUElfRW5hYmxlTlNTUHVsc2VNZ3QKKyAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfRW5hYmxlTlNTUHVsc2VNZ3QoU1BJX1R5cGVEZWYgKlNQSXgpIHsKKyAgU0VUX0JJVChTUEl4LT5DUjIsIFNQSV9DUjJfTlNTUCk7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIE5TUyBwdWxzZSBtYW5hZ2VtZW50CisgKiBAbm90ZSAgIFRoaXMgYml0IHNob3VsZCBub3QgYmUgY2hhbmdlZCB3aGVuIGNvbW11bmljYXRpb24gaXMgb25nb2luZy4gVGhpcworICogYml0IGlzIG5vdCB1c2VkIGluIFNQSSBUSSBtb2RlLgorICogQHJtdG9sbCBDUjIgICAgICAgICAgTlNTUCAgICAgICAgICBMTF9TUElfRGlzYWJsZU5TU1B1bHNlTWd0CisgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX0Rpc2FibGVOU1NQdWxzZU1ndChTUElfVHlwZURlZiAqU1BJeCkgeworICBDTEVBUl9CSVQoU1BJeC0+Q1IyLCBTUElfQ1IyX05TU1ApOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgTlNTIHB1bHNlIGlzIGVuYWJsZWQKKyAqIEBub3RlICAgVGhpcyBiaXQgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkIHdoZW4gY29tbXVuaWNhdGlvbiBpcyBvbmdvaW5nLiBUaGlzCisgKiBiaXQgaXMgbm90IHVzZWQgaW4gU1BJIFRJIG1vZGUuCisgKiBAcm10b2xsIENSMiAgICAgICAgICBOU1NQICAgICAgICAgIExMX1NQSV9Jc0VuYWJsZWROU1NQdWxzZQorICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfSXNFbmFibGVkTlNTUHVsc2UoY29uc3QgU1BJX1R5cGVEZWYgKlNQSXgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoU1BJeC0+Q1IyLCBTUElfQ1IyX05TU1ApID09IChTUElfQ1IyX05TU1ApKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFNQSV9MTF9FRl9GTEFHX01hbmFnZW1lbnQgRkxBRyBNYW5hZ2VtZW50CisgKiBAeworICovCisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiBSeCBidWZmZXIgaXMgbm90IGVtcHR5CisgKiBAcm10b2xsIFNSICAgICAgICAgICBSWE5FICAgICAgICAgIExMX1NQSV9Jc0FjdGl2ZUZsYWdfUlhORQorICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfSXNBY3RpdmVGbGFnX1JYTkUoY29uc3QgU1BJX1R5cGVEZWYgKlNQSXgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoU1BJeC0+U1IsIFNQSV9TUl9SWE5FKSA9PSAoU1BJX1NSX1JYTkUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiBUeCBidWZmZXIgaXMgZW1wdHkKKyAqIEBybXRvbGwgU1IgICAgICAgICAgIFRYRSAgICAgICAgICAgTExfU1BJX0lzQWN0aXZlRmxhZ19UWEUKKyAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0lzQWN0aXZlRmxhZ19UWEUoY29uc3QgU1BJX1R5cGVEZWYgKlNQSXgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoU1BJeC0+U1IsIFNQSV9TUl9UWEUpID09IChTUElfU1JfVFhFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IENSQyBlcnJvciBmbGFnCisgKiBAcm10b2xsIFNSICAgICAgICAgICBDUkNFUlIgICAgICAgIExMX1NQSV9Jc0FjdGl2ZUZsYWdfQ1JDRVJSCisgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9Jc0FjdGl2ZUZsYWdfQ1JDRVJSKGNvbnN0IFNQSV9UeXBlRGVmICpTUEl4KSB7CisgIHJldHVybiAoKFJFQURfQklUKFNQSXgtPlNSLCBTUElfU1JfQ1JDRVJSKSA9PSAoU1BJX1NSX0NSQ0VSUikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBtb2RlIGZhdWx0IGVycm9yIGZsYWcKKyAqIEBybXRvbGwgU1IgICAgICAgICAgIE1PREYgICAgICAgICAgTExfU1BJX0lzQWN0aXZlRmxhZ19NT0RGCisgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9Jc0FjdGl2ZUZsYWdfTU9ERihjb25zdCBTUElfVHlwZURlZiAqU1BJeCkgeworICByZXR1cm4gKChSRUFEX0JJVChTUEl4LT5TUiwgU1BJX1NSX01PREYpID09IChTUElfU1JfTU9ERikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBvdmVycnVuIGVycm9yIGZsYWcKKyAqIEBybXRvbGwgU1IgICAgICAgICAgIE9WUiAgICAgICAgICAgTExfU1BJX0lzQWN0aXZlRmxhZ19PVlIKKyAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0lzQWN0aXZlRmxhZ19PVlIoY29uc3QgU1BJX1R5cGVEZWYgKlNQSXgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoU1BJeC0+U1IsIFNQSV9TUl9PVlIpID09IChTUElfU1JfT1ZSKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IGJ1c3kgZmxhZworICogQG5vdGUgICBUaGUgQlNZIGZsYWcgaXMgY2xlYXJlZCB1bmRlciBhbnkgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqIC1XaGVuIHRoZSBTUEkgaXMgY29ycmVjdGx5IGRpc2FibGVkCisgKiAtV2hlbiBhIGZhdWx0IGlzIGRldGVjdGVkIGluIE1hc3RlciBtb2RlIChNT0RGIGJpdCBzZXQgdG8gMSkKKyAqIC1JbiBNYXN0ZXIgbW9kZSwgd2hlbiBpdCBmaW5pc2hlcyBhIGRhdGEgdHJhbnNtaXNzaW9uIGFuZCBubyBuZXcgZGF0YSBpcworICogcmVhZHkgdG8gYmUgc2VudCAtSW4gU2xhdmUgbW9kZSwgd2hlbiB0aGUgQlNZIGZsYWcgaXMgc2V0IHRvICcwJyBmb3IgYXQgbGVhc3QKKyAqIG9uZSBTUEkgY2xvY2sgY3ljbGUgYmV0d2VlbiBlYWNoIGRhdGEgdHJhbnNmZXIuCisgKiBAcm10b2xsIFNSICAgICAgICAgICBCU1kgICAgICAgICAgIExMX1NQSV9Jc0FjdGl2ZUZsYWdfQlNZCisgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9Jc0FjdGl2ZUZsYWdfQlNZKGNvbnN0IFNQSV9UeXBlRGVmICpTUEl4KSB7CisgIHJldHVybiAoKFJFQURfQklUKFNQSXgtPlNSLCBTUElfU1JfQlNZKSA9PSAoU1BJX1NSX0JTWSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBmcmFtZSBmb3JtYXQgZXJyb3IgZmxhZworICogQHJtdG9sbCBTUiAgICAgICAgICAgRlJFICAgICAgICAgICBMTF9TUElfSXNBY3RpdmVGbGFnX0ZSRQorICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfSXNBY3RpdmVGbGFnX0ZSRShjb25zdCBTUElfVHlwZURlZiAqU1BJeCkgeworICByZXR1cm4gKChSRUFEX0JJVChTUEl4LT5TUiwgU1BJX1NSX0ZSRSkgPT0gKFNQSV9TUl9GUkUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgRklGTyByZWNlcHRpb24gTGV2ZWwKKyAqIEBybXRvbGwgU1IgICAgICAgICAgIEZSTFZMICAgICAgICAgTExfU1BJX0dldFJ4RklGT0xldmVsCisgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfUlhfRklGT19FTVBUWQorICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX1JYX0ZJRk9fUVVBUlRFUl9GVUxMCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfUlhfRklGT19IQUxGX0ZVTEwKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9SWF9GSUZPX0ZVTEwKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9HZXRSeEZJRk9MZXZlbChjb25zdCBTUElfVHlwZURlZiAqU1BJeCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTUEl4LT5TUiwgU1BJX1NSX0ZSTFZMKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgRklGTyBUcmFuc21pc3Npb24gTGV2ZWwKKyAqIEBybXRvbGwgU1IgICAgICAgICAgIEZUTFZMICAgICAgICAgTExfU1BJX0dldFR4RklGT0xldmVsCisgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfVFhfRklGT19FTVBUWQorICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX1RYX0ZJRk9fUVVBUlRFUl9GVUxMCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfVFhfRklGT19IQUxGX0ZVTEwKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9UWF9GSUZPX0ZVTEwKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9HZXRUeEZJRk9MZXZlbChjb25zdCBTUElfVHlwZURlZiAqU1BJeCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTUEl4LT5TUiwgU1BJX1NSX0ZUTFZMKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBDbGVhciBDUkMgZXJyb3IgZmxhZworICogQHJtdG9sbCBTUiAgICAgICAgICAgQ1JDRVJSICAgICAgICBMTF9TUElfQ2xlYXJGbGFnX0NSQ0VSUgorICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9DbGVhckZsYWdfQ1JDRVJSKFNQSV9UeXBlRGVmICpTUEl4KSB7CisgIENMRUFSX0JJVChTUEl4LT5TUiwgU1BJX1NSX0NSQ0VSUik7Cit9CisKKy8qKgorICogQGJyaWVmICBDbGVhciBtb2RlIGZhdWx0IGVycm9yIGZsYWcKKyAqIEBub3RlICAgQ2xlYXJpbmcgdGhpcyBmbGFnIGlzIGRvbmUgYnkgYSByZWFkIGFjY2VzcyB0byB0aGUgU1BJeF9TUgorICogICAgICAgICByZWdpc3RlciBmb2xsb3dlZCBieSBhIHdyaXRlIGFjY2VzcyB0byB0aGUgU1BJeF9DUjEgcmVnaXN0ZXIKKyAqIEBybXRvbGwgU1IgICAgICAgICAgIE1PREYgICAgICAgICAgTExfU1BJX0NsZWFyRmxhZ19NT0RGCisgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX0NsZWFyRmxhZ19NT0RGKFNQSV9UeXBlRGVmICpTUEl4KSB7CisgIF9fSU8gdWludDMyX3QgdG1wcmVnX3NyOworICB0bXByZWdfc3IgPSBTUEl4LT5TUjsKKyAgKHZvaWQpdG1wcmVnX3NyOworICBDTEVBUl9CSVQoU1BJeC0+Q1IxLCBTUElfQ1IxX1NQRSk7Cit9CisKKy8qKgorICogQGJyaWVmICBDbGVhciBvdmVycnVuIGVycm9yIGZsYWcKKyAqIEBub3RlICAgQ2xlYXJpbmcgdGhpcyBmbGFnIGlzIGRvbmUgYnkgYSByZWFkIGFjY2VzcyB0byB0aGUgU1BJeF9EUgorICogICAgICAgICByZWdpc3RlciBmb2xsb3dlZCBieSBhIHJlYWQgYWNjZXNzIHRvIHRoZSBTUEl4X1NSIHJlZ2lzdGVyCisgKiBAcm10b2xsIFNSICAgICAgICAgICBPVlIgICAgICAgICAgIExMX1NQSV9DbGVhckZsYWdfT1ZSCisgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX0NsZWFyRmxhZ19PVlIoY29uc3QgU1BJX1R5cGVEZWYgKlNQSXgpIHsKKyAgX19JTyB1aW50MzJfdCB0bXByZWc7CisgIHRtcHJlZyA9IFNQSXgtPkRSOworICAodm9pZCl0bXByZWc7CisgIHRtcHJlZyA9IFNQSXgtPlNSOworICAodm9pZCl0bXByZWc7Cit9CisKKy8qKgorICogQGJyaWVmICBDbGVhciBmcmFtZSBmb3JtYXQgZXJyb3IgZmxhZworICogQG5vdGUgICBDbGVhcmluZyB0aGlzIGZsYWcgaXMgZG9uZSBieSByZWFkaW5nIFNQSXhfU1IgcmVnaXN0ZXIKKyAqIEBybXRvbGwgU1IgICAgICAgICAgIEZSRSAgICAgICAgICAgTExfU1BJX0NsZWFyRmxhZ19GUkUKKyAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfQ2xlYXJGbGFnX0ZSRShjb25zdCBTUElfVHlwZURlZiAqU1BJeCkgeworICBfX0lPIHVpbnQzMl90IHRtcHJlZzsKKyAgdG1wcmVnID0gU1BJeC0+U1I7CisgICh2b2lkKXRtcHJlZzsKK30KKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0xMX0VGX0lUX01hbmFnZW1lbnQgSW50ZXJydXB0IE1hbmFnZW1lbnQKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBlcnJvciBpbnRlcnJ1cHQKKyAqIEBub3RlICAgVGhpcyBiaXQgY29udHJvbHMgdGhlIGdlbmVyYXRpb24gb2YgYW4gaW50ZXJydXB0IHdoZW4gYW4gZXJyb3IKKyAqIGNvbmRpdGlvbiBvY2N1cnMgKENSQ0VSUiwgT1ZSLCBNT0RGIGluIFNQSSBtb2RlLCBGUkUgYXQgVEkgbW9kZSkuCisgKiBAcm10b2xsIENSMiAgICAgICAgICBFUlJJRSAgICAgICAgIExMX1NQSV9FbmFibGVJVF9FUlIKKyAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfRW5hYmxlSVRfRVJSKFNQSV9UeXBlRGVmICpTUEl4KSB7CisgIFNFVF9CSVQoU1BJeC0+Q1IyLCBTUElfQ1IyX0VSUklFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBSeCBidWZmZXIgbm90IGVtcHR5IGludGVycnVwdAorICogQHJtdG9sbCBDUjIgICAgICAgICAgUlhORUlFICAgICAgICBMTF9TUElfRW5hYmxlSVRfUlhORQorICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9FbmFibGVJVF9SWE5FKFNQSV9UeXBlRGVmICpTUEl4KSB7CisgIFNFVF9CSVQoU1BJeC0+Q1IyLCBTUElfQ1IyX1JYTkVJRSk7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgVHggYnVmZmVyIGVtcHR5IGludGVycnVwdAorICogQHJtdG9sbCBDUjIgICAgICAgICAgVFhFSUUgICAgICAgICBMTF9TUElfRW5hYmxlSVRfVFhFCisgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX0VuYWJsZUlUX1RYRShTUElfVHlwZURlZiAqU1BJeCkgeworICBTRVRfQklUKFNQSXgtPkNSMiwgU1BJX0NSMl9UWEVJRSk7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIGVycm9yIGludGVycnVwdAorICogQG5vdGUgICBUaGlzIGJpdCBjb250cm9scyB0aGUgZ2VuZXJhdGlvbiBvZiBhbiBpbnRlcnJ1cHQgd2hlbiBhbiBlcnJvcgorICogY29uZGl0aW9uIG9jY3VycyAoQ1JDRVJSLCBPVlIsIE1PREYgaW4gU1BJIG1vZGUsIEZSRSBhdCBUSSBtb2RlKS4KKyAqIEBybXRvbGwgQ1IyICAgICAgICAgIEVSUklFICAgICAgICAgTExfU1BJX0Rpc2FibGVJVF9FUlIKKyAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfRGlzYWJsZUlUX0VSUihTUElfVHlwZURlZiAqU1BJeCkgeworICBDTEVBUl9CSVQoU1BJeC0+Q1IyLCBTUElfQ1IyX0VSUklFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgUnggYnVmZmVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQKKyAqIEBybXRvbGwgQ1IyICAgICAgICAgIFJYTkVJRSAgICAgICAgTExfU1BJX0Rpc2FibGVJVF9SWE5FCisgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX0Rpc2FibGVJVF9SWE5FKFNQSV9UeXBlRGVmICpTUEl4KSB7CisgIENMRUFSX0JJVChTUEl4LT5DUjIsIFNQSV9DUjJfUlhORUlFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgVHggYnVmZmVyIGVtcHR5IGludGVycnVwdAorICogQHJtdG9sbCBDUjIgICAgICAgICAgVFhFSUUgICAgICAgICBMTF9TUElfRGlzYWJsZUlUX1RYRQorICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9EaXNhYmxlSVRfVFhFKFNQSV9UeXBlRGVmICpTUEl4KSB7CisgIENMRUFSX0JJVChTUEl4LT5DUjIsIFNQSV9DUjJfVFhFSUUpOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgZXJyb3IgaW50ZXJydXB0IGlzIGVuYWJsZWQKKyAqIEBybXRvbGwgQ1IyICAgICAgICAgIEVSUklFICAgICAgICAgTExfU1BJX0lzRW5hYmxlZElUX0VSUgorICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfSXNFbmFibGVkSVRfRVJSKGNvbnN0IFNQSV9UeXBlRGVmICpTUEl4KSB7CisgIHJldHVybiAoKFJFQURfQklUKFNQSXgtPkNSMiwgU1BJX0NSMl9FUlJJRSkgPT0gKFNQSV9DUjJfRVJSSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiBSeCBidWZmZXIgbm90IGVtcHR5IGludGVycnVwdCBpcyBlbmFibGVkCisgKiBAcm10b2xsIENSMiAgICAgICAgICBSWE5FSUUgICAgICAgIExMX1NQSV9Jc0VuYWJsZWRJVF9SWE5FCisgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9Jc0VuYWJsZWRJVF9SWE5FKGNvbnN0IFNQSV9UeXBlRGVmICpTUEl4KSB7CisgIHJldHVybiAoKFJFQURfQklUKFNQSXgtPkNSMiwgU1BJX0NSMl9SWE5FSUUpID09IChTUElfQ1IyX1JYTkVJRSkpID8gMVVMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIFR4IGJ1ZmZlciBlbXB0eSBpbnRlcnJ1cHQKKyAqIEBybXRvbGwgQ1IyICAgICAgICAgIFRYRUlFICAgICAgICAgTExfU1BJX0lzRW5hYmxlZElUX1RYRQorICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfSXNFbmFibGVkSVRfVFhFKGNvbnN0IFNQSV9UeXBlRGVmICpTUEl4KSB7CisgIHJldHVybiAoKFJFQURfQklUKFNQSXgtPkNSMiwgU1BJX0NSMl9UWEVJRSkgPT0gKFNQSV9DUjJfVFhFSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFNQSV9MTF9FRl9ETUFfTWFuYWdlbWVudCBETUEgTWFuYWdlbWVudAorICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiAgRW5hYmxlIERNQSBSeAorICogQHJtdG9sbCBDUjIgICAgICAgICAgUlhETUFFTiAgICAgICBMTF9TUElfRW5hYmxlRE1BUmVxX1JYCisgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX0VuYWJsZURNQVJlcV9SWChTUElfVHlwZURlZiAqU1BJeCkgeworICBTRVRfQklUKFNQSXgtPkNSMiwgU1BJX0NSMl9SWERNQUVOKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgRE1BIFJ4CisgKiBAcm10b2xsIENSMiAgICAgICAgICBSWERNQUVOICAgICAgIExMX1NQSV9EaXNhYmxlRE1BUmVxX1JYCisgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX0Rpc2FibGVETUFSZXFfUlgoU1BJX1R5cGVEZWYgKlNQSXgpIHsKKyAgQ0xFQVJfQklUKFNQSXgtPkNSMiwgU1BJX0NSMl9SWERNQUVOKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIERNQSBSeCBpcyBlbmFibGVkCisgKiBAcm10b2xsIENSMiAgICAgICAgICBSWERNQUVOICAgICAgIExMX1NQSV9Jc0VuYWJsZWRETUFSZXFfUlgKKyAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0lzRW5hYmxlZERNQVJlcV9SWChjb25zdCBTUElfVHlwZURlZiAqU1BJeCkgeworICByZXR1cm4gKChSRUFEX0JJVChTUEl4LT5DUjIsIFNQSV9DUjJfUlhETUFFTikgPT0gKFNQSV9DUjJfUlhETUFFTikpID8gMVVMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIERNQSBUeAorICogQHJtdG9sbCBDUjIgICAgICAgICAgVFhETUFFTiAgICAgICBMTF9TUElfRW5hYmxlRE1BUmVxX1RYCisgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX0VuYWJsZURNQVJlcV9UWChTUElfVHlwZURlZiAqU1BJeCkgeworICBTRVRfQklUKFNQSXgtPkNSMiwgU1BJX0NSMl9UWERNQUVOKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgRE1BIFR4CisgKiBAcm10b2xsIENSMiAgICAgICAgICBUWERNQUVOICAgICAgIExMX1NQSV9EaXNhYmxlRE1BUmVxX1RYCisgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX0Rpc2FibGVETUFSZXFfVFgoU1BJX1R5cGVEZWYgKlNQSXgpIHsKKyAgQ0xFQVJfQklUKFNQSXgtPkNSMiwgU1BJX0NSMl9UWERNQUVOKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIERNQSBUeCBpcyBlbmFibGVkCisgKiBAcm10b2xsIENSMiAgICAgICAgICBUWERNQUVOICAgICAgIExMX1NQSV9Jc0VuYWJsZWRETUFSZXFfVFgKKyAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0lzRW5hYmxlZERNQVJlcV9UWChjb25zdCBTUElfVHlwZURlZiAqU1BJeCkgeworICByZXR1cm4gKChSRUFEX0JJVChTUEl4LT5DUjIsIFNQSV9DUjJfVFhETUFFTikgPT0gKFNQSV9DUjJfVFhETUFFTikpID8gMVVMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgU2V0IHBhcml0eSBvZiAgTGFzdCBETUEgcmVjZXB0aW9uCisgKiBAcm10b2xsIENSMiAgICAgICAgICBMRE1BUlggICAgICAgIExMX1NQSV9TZXRETUFQYXJpdHlfUlgKKyAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAqIEBwYXJhbSAgUGFyaXR5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfRE1BX1BBUklUWV9PREQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9ETUFfUEFSSVRZX0VWRU4KKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfU2V0RE1BUGFyaXR5X1JYKFNQSV9UeXBlRGVmICpTUEl4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQYXJpdHkpIHsKKyAgTU9ESUZZX1JFRyhTUEl4LT5DUjIsIFNQSV9DUjJfTERNQVJYLCAoUGFyaXR5IDw8IFNQSV9DUjJfTERNQVJYX1BvcykpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IHBhcml0eSBjb25maWd1cmF0aW9uIGZvciAgTGFzdCBETUEgcmVjZXB0aW9uCisgKiBAcm10b2xsIENSMiAgICAgICAgICBMRE1BUlggICAgICAgIExMX1NQSV9HZXRETUFQYXJpdHlfUlgKKyAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9ETUFfUEFSSVRZX09ERAorICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0RNQV9QQVJJVFlfRVZFTgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0dldERNQVBhcml0eV9SWChjb25zdCBTUElfVHlwZURlZiAqU1BJeCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTUEl4LT5DUjIsIFNQSV9DUjJfTERNQVJYKSA+PiBTUElfQ1IyX0xETUFSWF9Qb3MpOworfQorCisvKioKKyAqIEBicmllZiAgU2V0IHBhcml0eSBvZiAgTGFzdCBETUEgdHJhbnNtaXNzaW9uCisgKiBAcm10b2xsIENSMiAgICAgICAgICBMRE1BVFggICAgICAgIExMX1NQSV9TZXRETUFQYXJpdHlfVFgKKyAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAqIEBwYXJhbSAgUGFyaXR5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfRE1BX1BBUklUWV9PREQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9ETUFfUEFSSVRZX0VWRU4KKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfU2V0RE1BUGFyaXR5X1RYKFNQSV9UeXBlRGVmICpTUEl4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQYXJpdHkpIHsKKyAgTU9ESUZZX1JFRyhTUEl4LT5DUjIsIFNQSV9DUjJfTERNQVRYLCAoUGFyaXR5IDw8IFNQSV9DUjJfTERNQVRYX1BvcykpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IHBhcml0eSBjb25maWd1cmF0aW9uIGZvciBMYXN0IERNQSB0cmFuc21pc3Npb24KKyAqIEBybXRvbGwgQ1IyICAgICAgICAgIExETUFUWCAgICAgICAgTExfU1BJX0dldERNQVBhcml0eV9UWAorICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0RNQV9QQVJJVFlfT0RECisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfRE1BX1BBUklUWV9FVkVOCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfR2V0RE1BUGFyaXR5X1RYKGNvbnN0IFNQSV9UeXBlRGVmICpTUEl4KSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFNQSXgtPkNSMiwgU1BJX0NSMl9MRE1BVFgpID4+IFNQSV9DUjJfTERNQVRYX1Bvcyk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgdGhlIGRhdGEgcmVnaXN0ZXIgYWRkcmVzcyB1c2VkIGZvciBETUEgdHJhbnNmZXIKKyAqIEBybXRvbGwgRFIgICAgICAgICAgIERSICAgICAgICAgICAgTExfU1BJX0RNQV9HZXRSZWdBZGRyCisgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgKiBAcmV0dmFsIEFkZHJlc3Mgb2YgZGF0YSByZWdpc3RlcgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0RNQV9HZXRSZWdBZGRyKGNvbnN0IFNQSV9UeXBlRGVmICpTUEl4KSB7CisgIHJldHVybiAodWludDMyX3QpICYgKFNQSXgtPkRSKTsKK30KKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0xMX0VGX0RBVEFfTWFuYWdlbWVudCBEQVRBIE1hbmFnZW1lbnQKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgIFJlYWQgOC1CaXRzIGluIHRoZSBkYXRhIHJlZ2lzdGVyCisgKiBAcm10b2xsIERSICAgICAgICAgICBEUiAgICAgICAgICAgIExMX1NQSV9SZWNlaXZlRGF0YTgKKyAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAqIEByZXR2YWwgUnhEYXRhIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDhfdCBMTF9TUElfUmVjZWl2ZURhdGE4KFNQSV9UeXBlRGVmICpTUEl4KSB7CisgIHJldHVybiAoKigoX19JTyB1aW50OF90ICopJlNQSXgtPkRSKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBSZWFkIDE2LUJpdHMgaW4gdGhlIGRhdGEgcmVnaXN0ZXIKKyAqIEBybXRvbGwgRFIgICAgICAgICAgIERSICAgICAgICAgICAgTExfU1BJX1JlY2VpdmVEYXRhMTYKKyAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAqIEByZXR2YWwgUnhEYXRhIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRkZGCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MTZfdCBMTF9TUElfUmVjZWl2ZURhdGExNihTUElfVHlwZURlZiAqU1BJeCkgeworICByZXR1cm4gKHVpbnQxNl90KShSRUFEX1JFRyhTUEl4LT5EUikpOworfQorCisvKioKKyAqIEBicmllZiAgV3JpdGUgOC1CaXRzIGluIHRoZSBkYXRhIHJlZ2lzdGVyCisgKiBAcm10b2xsIERSICAgICAgICAgICBEUiAgICAgICAgICAgIExMX1NQSV9UcmFuc21pdERhdGE4CisgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgKiBAcGFyYW0gIFR4RGF0YSBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkYKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfVHJhbnNtaXREYXRhOChTUElfVHlwZURlZiAqU1BJeCwgdWludDhfdCBUeERhdGEpIHsKKyNpZiBkZWZpbmVkKF9fR05VQ19fKQorICBfX0lPIHVpbnQ4X3QgKnNwaWRyID0gKChfX0lPIHVpbnQ4X3QgKikmU1BJeC0+RFIpOworICAqc3BpZHIgPSBUeERhdGE7CisjZWxzZQorICAqKChfX0lPIHVpbnQ4X3QgKikmU1BJeC0+RFIpID0gVHhEYXRhOworI2VuZGlmIC8qIF9fR05VQ19fICovCit9CisKKy8qKgorICogQGJyaWVmICBXcml0ZSAxNi1CaXRzIGluIHRoZSBkYXRhIHJlZ2lzdGVyCisgKiBAcm10b2xsIERSICAgICAgICAgICBEUiAgICAgICAgICAgIExMX1NQSV9UcmFuc21pdERhdGExNgorICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICogQHBhcmFtICBUeERhdGEgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEZGRkYKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfVHJhbnNtaXREYXRhMTYoU1BJX1R5cGVEZWYgKlNQSXgsIHVpbnQxNl90IFR4RGF0YSkgeworI2lmIGRlZmluZWQoX19HTlVDX18pCisgIF9fSU8gdWludDE2X3QgKnNwaWRyID0gKChfX0lPIHVpbnQxNl90ICopJlNQSXgtPkRSKTsKKyAgKnNwaWRyID0gVHhEYXRhOworI2Vsc2UKKyAgU1BJeC0+RFIgPSBUeERhdGE7CisjZW5kaWYgLyogX19HTlVDX18gKi8KK30KKworLyoqCisgKiBAfQorICovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIFNQSV9MTF9FRl9Jbml0IEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAqIEB7CisgKi8KKworRXJyb3JTdGF0dXMgTExfU1BJX0RlSW5pdChjb25zdCBTUElfVHlwZURlZiAqU1BJeCk7CitFcnJvclN0YXR1cyBMTF9TUElfSW5pdChTUElfVHlwZURlZiAqU1BJeCwgTExfU1BJX0luaXRUeXBlRGVmICpTUElfSW5pdFN0cnVjdCk7Cit2b2lkIExMX1NQSV9TdHJ1Y3RJbml0KExMX1NQSV9Jbml0VHlwZURlZiAqU1BJX0luaXRTdHJ1Y3QpOworCisvKioKKyAqIEB9CisgKi8KKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworI2lmIGRlZmluZWQoU1BJX0kyU19TVVBQT1JUKQorLyoqIEBkZWZncm91cCBJMlNfTEwgSTJTCisgKiBAeworICovCisKKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgSTJTX0xMX0VTX0lOSVQgSTJTIEV4cG9ydGVkIEluaXQgc3RydWN0dXJlCisgKiBAeworICovCisKKy8qKgorICogQGJyaWVmICBJMlMgSW5pdCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDMyX3QgTW9kZTsgLyohPCBTcGVjaWZpZXMgdGhlIEkyUyBvcGVyYXRpbmcgbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEkyU19MTF9FQ19NT0RFCisKKyAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeQorICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBAcmVmIExMX0kyU19TZXRUcmFuc2Zlck1vZGUoKS4qLworCisgIHVpbnQzMl90CisgICAgICBTdGFuZGFyZDsgLyohPCBTcGVjaWZpZXMgdGhlIHN0YW5kYXJkIHVzZWQgZm9yIHRoZSBJMlMgY29tbXVuaWNhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSTJTX0xMX0VDX1NUQU5EQVJECisKKyAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5CisgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gQHJlZiBMTF9JMlNfU2V0U3RhbmRhcmQoKS4qLworCisgIHVpbnQzMl90IERhdGFGb3JtYXQ7IC8qITwgU3BlY2lmaWVzIHRoZSBkYXRhIGZvcm1hdCBmb3IgdGhlIEkyUyBjb21tdW5pY2F0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSTJTX0xMX0VDX0RBVEFfRk9STUFUCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0kyU19TZXREYXRhRm9ybWF0KCkuKi8KKworICB1aW50MzJfdCBNQ0xLT3V0cHV0OyAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBJMlMgTUNMSyBvdXRwdXQgaXMgZW5hYmxlZCBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICBub3QuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSTJTX0xMX0VDX01DTEtfT1VUUFVUCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdGFyeSBmdW5jdGlvbnMgQHJlZiBMTF9JMlNfRW5hYmxlTWFzdGVyQ2xvY2soKSBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExMX0kyU19EaXNhYmxlTWFzdGVyQ2xvY2suKi8KKworICB1aW50MzJfdAorICAgICAgQXVkaW9GcmVxOyAvKiE8IFNwZWNpZmllcyB0aGUgZnJlcXVlbmN5IHNlbGVjdGVkIGZvciB0aGUgSTJTCisgICAgICAgICAgICAgICAgICAgIGNvbW11bmljYXRpb24uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgSTJTX0xMX0VDX0FVRElPX0ZSRVEKKworICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvIEZyZXF1ZW5jeSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyBSZWZlcmVuY2UKKyAgICAgICAgICAgICAgICAgICAgbWFudWFsIGZvcm11bGFzIHRvIGNhbGN1bGF0ZSBQcmVzY2FsZXIgTGluZWFyLCBQYXJpdHkgYW5kCisgICAgICAgICAgICAgICAgICAgIHVuaXRhcnkgZnVuY3Rpb25zIEByZWYgTExfSTJTX1NldFByZXNjYWxlckxpbmVhcigpIGFuZCBAcmVmCisgICAgICAgICAgICAgICAgICAgIExMX0kyU19TZXRQcmVzY2FsZXJQYXJpdHkoKSB0byBzZXQgaXQuKi8KKworICB1aW50MzJfdCBDbG9ja1BvbGFyaXR5OyAvKiE8IFNwZWNpZmllcyB0aGUgaWRsZSBzdGF0ZSBvZiB0aGUgSTJTIGNsb2NrLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSTJTX0xMX0VDX1BPTEFSSVRZCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0kyU19TZXRDbG9ja1BvbGFyaXR5KCkuKi8KKworfSBMTF9JMlNfSW5pdFR5cGVEZWY7CisKKy8qKgorICogQH0KKyAqLworI2VuZGlmIC8qVVNFX0ZVTExfTExfRFJJVkVSKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSTJTX0xMX0V4cG9ydGVkX0NvbnN0YW50cyBJMlMgRXhwb3J0ZWQgQ29uc3RhbnRzCisgKiBAeworICovCisKKy8qKiBAZGVmZ3JvdXAgSTJTX0xMX0VDX0dFVF9GTEFHIEdldCBGbGFncyBEZWZpbmVzCisgKiBAYnJpZWYgICAgRmxhZ3MgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX0kyU19SZWFkUmVnIGZ1bmN0aW9uCisgKiBAeworICovCisjZGVmaW5lIExMX0kyU19TUl9SWE5FIExMX1NQSV9TUl9SWE5FIC8qITwgUnggYnVmZmVyIG5vdCBlbXB0eSBmbGFnICAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJTX1NSX1RYRSBMTF9TUElfU1JfVFhFICAgLyohPCBUeCBidWZmZXIgZW1wdHkgZmxhZyAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9JMlNfU1JfQlNZIExMX1NQSV9TUl9CU1kgICAvKiE8IEJ1c3kgZmxhZyAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0kyU19TUl9VRFIgU1BJX1NSX1VEUiAgICAgIC8qITwgVW5kZXJydW4gZmxhZyAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJTX1NSX09WUiBMTF9TUElfU1JfT1ZSICAgLyohPCBPdmVycnVuIGZsYWcgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9JMlNfU1JfRlJFIExMX1NQSV9TUl9GUkUgICAvKiE8IFRJIG1vZGUgZnJhbWUgZm9ybWF0IGVycm9yIGZsYWcgICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBTUElfTExfRUNfSVQgSVQgRGVmaW5lcworICogQGJyaWVmICAgIElUIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9TUElfUmVhZFJlZyBhbmQKKyAqIExMX1NQSV9Xcml0ZVJlZyBmdW5jdGlvbnMKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfSTJTX0NSMl9SWE5FSUUgXAorICBMTF9TUElfQ1IyX1JYTkVJRSAvKiE8IFJ4IGJ1ZmZlciBub3QgZW1wdHkgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBMTF9JMlNfQ1IyX1RYRUlFIFwKKyAgTExfU1BJX0NSMl9UWEVJRSAvKiE8IFR4IGJ1ZmZlciBlbXB0eSBpbnRlcnJ1cHQgZW5hYmxlICAgICAqLworI2RlZmluZSBMTF9JMlNfQ1IyX0VSUklFIFwKKyAgTExfU1BJX0NSMl9FUlJJRSAvKiE8IEVycm9yIGludGVycnVwdCBlbmFibGUgICAgICAgICAgICAgICAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgSTJTX0xMX0VDX0RBVEFfRk9STUFUIERhdGEgZm9ybWF0CisgKiBAeworICovCisjZGVmaW5lIExMX0kyU19EQVRBRk9STUFUXzE2QiBcCisgIDB4MDAwMDAwMDBVIC8qITwgRGF0YSBsZW5ndGggMTYgYml0cywgQ2hhbm5lbCBsZW5ndGggMTZiaXQgKi8KKyNkZWZpbmUgTExfSTJTX0RBVEFGT1JNQVRfMTZCX0VYVEVOREVEIFwKKyAgKFNQSV9JMlNDRkdSX0NITEVOKSAvKiE8IERhdGEgbGVuZ3RoIDE2IGJpdHMsIENoYW5uZWwgbGVuZ3RoIDMyYml0ICovCisjZGVmaW5lIExMX0kyU19EQVRBRk9STUFUXzI0QiBcCisgIChTUElfSTJTQ0ZHUl9DSExFTiB8ICAgICAgICBcCisgICBTUElfSTJTQ0ZHUl9EQVRMRU5fMCkgLyohPCBEYXRhIGxlbmd0aCAyNCBiaXRzLCBDaGFubmVsIGxlbmd0aCAzMmJpdCAqLworI2RlZmluZSBMTF9JMlNfREFUQUZPUk1BVF8zMkIgXAorICAoU1BJX0kyU0NGR1JfQ0hMRU4gfCAgICAgICAgXAorICAgU1BJX0kyU0NGR1JfREFUTEVOXzEpIC8qITwgRGF0YSBsZW5ndGggMTYgYml0cywgQ2hhbm5lbCBsZW5ndGggMzJiaXQgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEkyU19MTF9FQ19QT0xBUklUWSBDbG9jayBQb2xhcml0eQorICogQHsKKyAqLworI2RlZmluZSBMTF9JMlNfUE9MQVJJVFlfTE9XICAgICAgICAgICAgICAgICAgICAgICAgXAorICAweDAwMDAwMDAwVSAvKiE8IENsb2NrIHN0ZWFkeSBzdGF0ZSBpcyBsb3cgbGV2ZWwgXAorICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJTX1BPTEFSSVRZX0hJR0ggXAorICAoU1BJX0kyU0NGR1JfQ0tQT0wpIC8qITwgQ2xvY2sgc3RlYWR5IHN0YXRlIGlzIGhpZ2ggbGV2ZWwgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEkyU19MTF9FQ19TVEFOREFSRCBJMnMgU3RhbmRhcmQKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfSTJTX1NUQU5EQVJEX1BISUxJUFMgXAorICAweDAwMDAwMDAwVSAvKiE8IEkyUyBzdGFuZGFyZCBwaGlsaXBzICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0kyU19TVEFOREFSRF9NU0IgXAorICAoU1BJX0kyU0NGR1JfSTJTU1REXzApIC8qITwgTVNCIGp1c3RpZmllZCBzdGFuZGFyZCAobGVmdCBqdXN0aWZpZWQpICAgKi8KKyNkZWZpbmUgTExfSTJTX1NUQU5EQVJEX0xTQiBcCisgIChTUElfSTJTQ0ZHUl9JMlNTVERfMSkgLyohPCBMU0IganVzdGlmaWVkIHN0YW5kYXJkIChyaWdodCBqdXN0aWZpZWQpICAqLworI2RlZmluZSBMTF9JMlNfU1RBTkRBUkRfUENNX1NIT1JUIFwKKyAgKFNQSV9JMlNDRkdSX0kyU1NURF8wIHwgICAgICAgICBcCisgICBTUElfSTJTQ0ZHUl9JMlNTVERfMSkgLyohPCBQQ00gc3RhbmRhcmQsIHNob3J0IGZyYW1lIHN5bmNocm9uaXphdGlvbiAqLworI2RlZmluZSBMTF9JMlNfU1RBTkRBUkRfUENNX0xPTkcgICAgICAgICAgICAgICAgIFwKKyAgKFNQSV9JMlNDRkdSX0kyU1NURF8wIHwgU1BJX0kyU0NGR1JfSTJTU1REXzEgfCBcCisgICBTUElfSTJTQ0ZHUl9QQ01TWU5DKSAvKiE8IFBDTSBzdGFuZGFyZCwgbG9uZyBmcmFtZSBzeW5jaHJvbml6YXRpb24gICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBJMlNfTExfRUNfTU9ERSBPcGVyYXRpb24gTW9kZQorICogQHsKKyAqLworI2RlZmluZSBMTF9JMlNfTU9ERV9TTEFWRV9UWCAweDAwMDAwMDAwVSAvKiE8IFNsYXZlIFR4IGNvbmZpZ3VyYXRpb24gICovCisjZGVmaW5lIExMX0kyU19NT0RFX1NMQVZFX1JYIFwKKyAgKFNQSV9JMlNDRkdSX0kyU0NGR18wKSAvKiE8IFNsYXZlIFJ4IGNvbmZpZ3VyYXRpb24gICovCisjZGVmaW5lIExMX0kyU19NT0RFX01BU1RFUl9UWCBcCisgIChTUElfSTJTQ0ZHUl9JMlNDRkdfMSkgLyohPCBNYXN0ZXIgVHggY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBMTF9JMlNfTU9ERV9NQVNURVJfUlggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChTUElfSTJTQ0ZHUl9JMlNDRkdfMCB8IFNQSV9JMlNDRkdSX0kyU0NGR18xKSAvKiE8IE1hc3RlciBSeCBjb25maWd1cmF0aW9uIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgSTJTX0xMX0VDX1BSRVNDQUxFUl9GQUNUT1IgUHJlc2NhbGVyIEZhY3RvcgorICogQHsKKyAqLworI2RlZmluZSBMTF9JMlNfUFJFU0NBTEVSX1BBUklUWV9FVkVOIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBPZGQgZmFjdG9yOiBSZWFsIGRpdmlkZXIgdmFsdWUgaXMgPSAgSTJTRElWICogMiAgICAqLworI2RlZmluZSBMTF9JMlNfUFJFU0NBTEVSX1BBUklUWV9PREQgXAorICAoU1BJX0kyU1BSX09ERCA+PiAgICAgICAgICAgICAgICAgXAorICAgOFUpIC8qITwgT2RkIGZhY3RvcjogUmVhbCBkaXZpZGVyIHZhbHVlIGlzID0gKEkyU0RJViAqIDIpKzEgKi8KKy8qKgorICogQH0KKyAqLworCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisKKy8qKiBAZGVmZ3JvdXAgSTJTX0xMX0VDX01DTEtfT1VUUFVUIE1DTEsgT3V0cHV0CisgKiBAeworICovCisjZGVmaW5lIExMX0kyU19NQ0xLX09VVFBVVF9ESVNBQkxFIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBNYXN0ZXIgY2xvY2sgb3V0cHV0IGlzIGRpc2FibGVkICovCisjZGVmaW5lIExMX0kyU19NQ0xLX09VVFBVVF9FTkFCTEUgXAorICAoU1BJX0kyU1BSX01DS09FKSAvKiE8IE1hc3RlciBjbG9jayBvdXRwdXQgaXMgZW5hYmxlZCAgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEkyU19MTF9FQ19BVURJT19GUkVRIEF1ZGlvIEZyZXF1ZW5jeQorICogQHsKKyAqLworCisjZGVmaW5lIExMX0kyU19BVURJT0ZSRVFfMTkySyBcCisgIDE5MjAwMFUgLyohPCBBdWRpbyBGcmVxdWVuY3kgY29uZmlndXJhdGlvbiAxOTIwMDAgSHogICAgICAgKi8KKyNkZWZpbmUgTExfSTJTX0FVRElPRlJFUV85NksgXAorICA5NjAwMFUgLyohPCBBdWRpbyBGcmVxdWVuY3kgY29uZmlndXJhdGlvbiAgOTYwMDAgSHogICAgICAgKi8KKyNkZWZpbmUgTExfSTJTX0FVRElPRlJFUV80OEsgXAorICA0ODAwMFUgLyohPCBBdWRpbyBGcmVxdWVuY3kgY29uZmlndXJhdGlvbiAgNDgwMDAgSHogICAgICAgKi8KKyNkZWZpbmUgTExfSTJTX0FVRElPRlJFUV80NEsgXAorICA0NDEwMFUgLyohPCBBdWRpbyBGcmVxdWVuY3kgY29uZmlndXJhdGlvbiAgNDQxMDAgSHogICAgICAgKi8KKyNkZWZpbmUgTExfSTJTX0FVRElPRlJFUV8zMksgXAorICAzMjAwMFUgLyohPCBBdWRpbyBGcmVxdWVuY3kgY29uZmlndXJhdGlvbiAgMzIwMDAgSHogICAgICAgKi8KKyNkZWZpbmUgTExfSTJTX0FVRElPRlJFUV8yMksgXAorICAyMjA1MFUgLyohPCBBdWRpbyBGcmVxdWVuY3kgY29uZmlndXJhdGlvbiAgMjIwNTAgSHogICAgICAgKi8KKyNkZWZpbmUgTExfSTJTX0FVRElPRlJFUV8xNksgXAorICAxNjAwMFUgLyohPCBBdWRpbyBGcmVxdWVuY3kgY29uZmlndXJhdGlvbiAgMTYwMDAgSHogICAgICAgKi8KKyNkZWZpbmUgTExfSTJTX0FVRElPRlJFUV8xMUsgXAorICAxMTAyNVUgLyohPCBBdWRpbyBGcmVxdWVuY3kgY29uZmlndXJhdGlvbiAgMTEwMjUgSHogICAgICAgKi8KKyNkZWZpbmUgTExfSTJTX0FVRElPRlJFUV84SyBcCisgIDgwMDBVIC8qITwgQXVkaW8gRnJlcXVlbmN5IGNvbmZpZ3VyYXRpb24gICA4MDAwIEh6ICAgICAgICovCisjZGVmaW5lIExMX0kyU19BVURJT0ZSRVFfREVGQVVMVCBcCisgIDJVIC8qITwgQXVkaW8gRnJlcSBub3Qgc3BlY2lmaWVkLiBSZWdpc3RlciBJMlNESVYgPSAyICovCisvKioKKyAqIEB9CisgKi8KKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEkyU19MTF9FeHBvcnRlZF9NYWNyb3MgSTJTIEV4cG9ydGVkIE1hY3JvcworICogQHsKKyAqLworCisvKiogQGRlZmdyb3VwIEkyU19MTF9FTV9XUklURV9SRUFEIENvbW1vbiBXcml0ZSBhbmQgcmVhZCByZWdpc3RlcnMgTWFjcm9zCisgKiBAeworICovCisKKy8qKgorICogQGJyaWVmICBXcml0ZSBhIHZhbHVlIGluIEkyUyByZWdpc3RlcgorICogQHBhcmFtICBfX0lOU1RBTkNFX18gSTJTIEluc3RhbmNlCisgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgd3JpdHRlbgorICogQHBhcmFtICBfX1ZBTFVFX18gVmFsdWUgdG8gYmUgd3JpdHRlbiBpbiB0aGUgcmVnaXN0ZXIKKyAqIEByZXR2YWwgTm9uZQorICovCisjZGVmaW5lIExMX0kyU19Xcml0ZVJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18sIF9fVkFMVUVfXykgXAorICBXUklURV9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fLCAoX19WQUxVRV9fKSkKKworLyoqCisgKiBAYnJpZWYgIFJlYWQgYSB2YWx1ZSBpbiBJMlMgcmVnaXN0ZXIKKyAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIEkyUyBJbnN0YW5jZQorICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHJlYWQKKyAqIEByZXR2YWwgUmVnaXN0ZXIgdmFsdWUKKyAqLworI2RlZmluZSBMTF9JMlNfUmVhZFJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18pIFJFQURfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXykKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBJMlNfTExfRXhwb3J0ZWRfRnVuY3Rpb25zIEkyUyBFeHBvcnRlZCBGdW5jdGlvbnMKKyAqIEB7CisgKi8KKworLyoqIEBkZWZncm91cCBJMlNfTExfRUZfQ29uZmlndXJhdGlvbiBDb25maWd1cmF0aW9uCisgKiBAeworICovCisKKy8qKgorICogQGJyaWVmICBTZWxlY3QgSTJTIG1vZGUgYW5kIEVuYWJsZSBJMlMgcGVyaXBoZXJhbAorICogQHJtdG9sbCBJMlNDRkdSICAgICAgSTJTTU9EICAgICAgICBMTF9JMlNfRW5hYmxlXG4KKyAqICAgICAgICAgSTJTQ0ZHUiAgICAgIEkyU0UgICAgICAgICAgTExfSTJTX0VuYWJsZQorICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyU19FbmFibGUoU1BJX1R5cGVEZWYgKlNQSXgpIHsKKyAgU0VUX0JJVChTUEl4LT5JMlNDRkdSLCBTUElfSTJTQ0ZHUl9JMlNNT0QgfCBTUElfSTJTQ0ZHUl9JMlNFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgSTJTIHBlcmlwaGVyYWwKKyAqIEBybXRvbGwgSTJTQ0ZHUiAgICAgIEkyU0UgICAgICAgICAgTExfSTJTX0Rpc2FibGUKKyAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMlNfRGlzYWJsZShTUElfVHlwZURlZiAqU1BJeCkgeworICBDTEVBUl9CSVQoU1BJeC0+STJTQ0ZHUiwgU1BJX0kyU0NGR1JfSTJTTU9EIHwgU1BJX0kyU0NGR1JfSTJTRSk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiBJMlMgcGVyaXBoZXJhbCBpcyBlbmFibGVkCisgKiBAcm10b2xsIEkyU0NGR1IgICAgICBJMlNFICAgICAgICAgIExMX0kyU19Jc0VuYWJsZWQKKyAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJTX0lzRW5hYmxlZChjb25zdCBTUElfVHlwZURlZiAqU1BJeCkgeworICByZXR1cm4gKChSRUFEX0JJVChTUEl4LT5JMlNDRkdSLCBTUElfSTJTQ0ZHUl9JMlNFKSA9PSAoU1BJX0kyU0NGR1JfSTJTRSkpCisgICAgICAgICAgICAgID8gMVVMCisgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFNldCBJMlMgZGF0YSBmcmFtZSBsZW5ndGgKKyAqIEBybXRvbGwgSTJTQ0ZHUiAgICAgIERBVExFTiAgICAgICAgTExfSTJTX1NldERhdGFGb3JtYXRcbgorICogICAgICAgICBJMlNDRkdSICAgICAgQ0hMRU4gICAgICAgICBMTF9JMlNfU2V0RGF0YUZvcm1hdAorICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICogQHBhcmFtICBEYXRhRm9ybWF0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfREFUQUZPUk1BVF8xNkIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyU19EQVRBRk9STUFUXzE2Ql9FWFRFTkRFRAorICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX0RBVEFGT1JNQVRfMjRCCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfREFUQUZPUk1BVF8zMkIKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMlNfU2V0RGF0YUZvcm1hdChTUElfVHlwZURlZiAqU1BJeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IERhdGFGb3JtYXQpIHsKKyAgTU9ESUZZX1JFRyhTUEl4LT5JMlNDRkdSLCBTUElfSTJTQ0ZHUl9EQVRMRU4gfCBTUElfSTJTQ0ZHUl9DSExFTiwgRGF0YUZvcm1hdCk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgSTJTIGRhdGEgZnJhbWUgbGVuZ3RoCisgKiBAcm10b2xsIEkyU0NGR1IgICAgICBEQVRMRU4gICAgICAgIExMX0kyU19HZXREYXRhRm9ybWF0XG4KKyAqICAgICAgICAgSTJTQ0ZHUiAgICAgIENITEVOICAgICAgICAgTExfSTJTX0dldERhdGFGb3JtYXQKKyAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyU19EQVRBRk9STUFUXzE2QgorICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX0RBVEFGT1JNQVRfMTZCX0VYVEVOREVECisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfREFUQUZPUk1BVF8yNEIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyU19EQVRBRk9STUFUXzMyQgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJTX0dldERhdGFGb3JtYXQoY29uc3QgU1BJX1R5cGVEZWYgKlNQSXgpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoU1BJeC0+STJTQ0ZHUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BJX0kyU0NGR1JfREFUTEVOIHwgU1BJX0kyU0NGR1JfQ0hMRU4pKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFNldCBJMlMgY2xvY2sgcG9sYXJpdHkKKyAqIEBybXRvbGwgSTJTQ0ZHUiAgICAgIENLUE9MICAgICAgICAgTExfSTJTX1NldENsb2NrUG9sYXJpdHkKKyAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAqIEBwYXJhbSAgQ2xvY2tQb2xhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX1BPTEFSSVRZX0xPVworICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX1BPTEFSSVRZX0hJR0gKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMlNfU2V0Q2xvY2tQb2xhcml0eShTUElfVHlwZURlZiAqU1BJeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENsb2NrUG9sYXJpdHkpIHsKKyAgU0VUX0JJVChTUEl4LT5JMlNDRkdSLCBDbG9ja1BvbGFyaXR5KTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBJMlMgY2xvY2sgcG9sYXJpdHkKKyAqIEBybXRvbGwgSTJTQ0ZHUiAgICAgIENLUE9MICAgICAgICAgTExfSTJTX0dldENsb2NrUG9sYXJpdHkKKyAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyU19QT0xBUklUWV9MT1cKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyU19QT0xBUklUWV9ISUdICisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMlNfR2V0Q2xvY2tQb2xhcml0eShjb25zdCBTUElfVHlwZURlZiAqU1BJeCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTUEl4LT5JMlNDRkdSLCBTUElfSTJTQ0ZHUl9DS1BPTCkpOworfQorCisvKioKKyAqIEBicmllZiAgU2V0IEkyUyBzdGFuZGFyZCBwcm90b2NvbAorICogQHJtdG9sbCBJMlNDRkdSICAgICAgSTJTU1REICAgICAgICBMTF9JMlNfU2V0U3RhbmRhcmRcbgorICogICAgICAgICBJMlNDRkdSICAgICAgUENNU1lOQyAgICAgICBMTF9JMlNfU2V0U3RhbmRhcmQKKyAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAqIEBwYXJhbSAgU3RhbmRhcmQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyU19TVEFOREFSRF9QSElMSVBTCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfU1RBTkRBUkRfTVNCCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfU1RBTkRBUkRfTFNCCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfU1RBTkRBUkRfUENNX1NIT1JUCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfU1RBTkRBUkRfUENNX0xPTkcKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMlNfU2V0U3RhbmRhcmQoU1BJX1R5cGVEZWYgKlNQSXgsIHVpbnQzMl90IFN0YW5kYXJkKSB7CisgIE1PRElGWV9SRUcoU1BJeC0+STJTQ0ZHUiwgU1BJX0kyU0NGR1JfSTJTU1REIHwgU1BJX0kyU0NGR1JfUENNU1lOQywgU3RhbmRhcmQpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IEkyUyBzdGFuZGFyZCBwcm90b2NvbAorICogQHJtdG9sbCBJMlNDRkdSICAgICAgSTJTU1REICAgICAgICBMTF9JMlNfR2V0U3RhbmRhcmRcbgorICogICAgICAgICBJMlNDRkdSICAgICAgUENNU1lOQyAgICAgICBMTF9JMlNfR2V0U3RhbmRhcmQKKyAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyU19TVEFOREFSRF9QSElMSVBTCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfU1RBTkRBUkRfTVNCCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfU1RBTkRBUkRfTFNCCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfU1RBTkRBUkRfUENNX1NIT1JUCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfU1RBTkRBUkRfUENNX0xPTkcKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyU19HZXRTdGFuZGFyZChjb25zdCBTUElfVHlwZURlZiAqU1BJeCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTUEl4LT5JMlNDRkdSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUElfSTJTQ0ZHUl9JMlNTVEQgfCBTUElfSTJTQ0ZHUl9QQ01TWU5DKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBTZXQgSTJTIHRyYW5zZmVyIG1vZGUKKyAqIEBybXRvbGwgSTJTQ0ZHUiAgICAgIEkyU0NGRyAgICAgICAgTExfSTJTX1NldFRyYW5zZmVyTW9kZQorICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICogQHBhcmFtICBNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfTU9ERV9TTEFWRV9UWAorICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX01PREVfU0xBVkVfUlgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyU19NT0RFX01BU1RFUl9UWAorICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX01PREVfTUFTVEVSX1JYCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJTX1NldFRyYW5zZmVyTW9kZShTUElfVHlwZURlZiAqU1BJeCwgdWludDMyX3QgTW9kZSkgeworICBNT0RJRllfUkVHKFNQSXgtPkkyU0NGR1IsIFNQSV9JMlNDRkdSX0kyU0NGRywgTW9kZSk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgSTJTIHRyYW5zZmVyIG1vZGUKKyAqIEBybXRvbGwgSTJTQ0ZHUiAgICAgIEkyU0NGRyAgICAgICAgTExfSTJTX0dldFRyYW5zZmVyTW9kZQorICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX01PREVfU0xBVkVfVFgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyU19NT0RFX1NMQVZFX1JYCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfTU9ERV9NQVNURVJfVFgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyU19NT0RFX01BU1RFUl9SWAorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJTX0dldFRyYW5zZmVyTW9kZShjb25zdCBTUElfVHlwZURlZiAqU1BJeCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTUEl4LT5JMlNDRkdSLCBTUElfSTJTQ0ZHUl9JMlNDRkcpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFNldCBJMlMgbGluZWFyIHByZXNjYWxlcgorICogQHJtdG9sbCBJMlNQUiAgICAgICAgSTJTRElWICAgICAgICBMTF9JMlNfU2V0UHJlc2NhbGVyTGluZWFyCisgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgKiBAcGFyYW0gIFByZXNjYWxlckxpbmVhciBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDIgYW5kIE1heF9EYXRhPTB4RkYKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMlNfU2V0UHJlc2NhbGVyTGluZWFyKFNQSV9UeXBlRGVmICpTUEl4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IFByZXNjYWxlckxpbmVhcikgeworICBNT0RJRllfUkVHKFNQSXgtPkkyU1BSLCBTUElfSTJTUFJfSTJTRElWLCBQcmVzY2FsZXJMaW5lYXIpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IEkyUyBsaW5lYXIgcHJlc2NhbGVyCisgKiBAcm10b2xsIEkyU1BSICAgICAgICBJMlNESVYgICAgICAgIExMX0kyU19HZXRQcmVzY2FsZXJMaW5lYXIKKyAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAqIEByZXR2YWwgUHJlc2NhbGVyTGluZWFyIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMiBhbmQgTWF4X0RhdGE9MHhGRgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJTX0dldFByZXNjYWxlckxpbmVhcihjb25zdCBTUElfVHlwZURlZiAqU1BJeCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTUEl4LT5JMlNQUiwgU1BJX0kyU1BSX0kyU0RJVikpOworfQorCisvKioKKyAqIEBicmllZiAgU2V0IEkyUyBwYXJpdHkgcHJlc2NhbGVyCisgKiBAcm10b2xsIEkyU1BSICAgICAgICBPREQgICAgICAgICAgIExMX0kyU19TZXRQcmVzY2FsZXJQYXJpdHkKKyAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAqIEBwYXJhbSAgUHJlc2NhbGVyUGFyaXR5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfUFJFU0NBTEVSX1BBUklUWV9FVkVOCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfUFJFU0NBTEVSX1BBUklUWV9PREQKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMlNfU2V0UHJlc2NhbGVyUGFyaXR5KFNQSV9UeXBlRGVmICpTUEl4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQcmVzY2FsZXJQYXJpdHkpIHsKKyAgTU9ESUZZX1JFRyhTUEl4LT5JMlNQUiwgU1BJX0kyU1BSX09ERCwgUHJlc2NhbGVyUGFyaXR5IDw8IDhVKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBJMlMgcGFyaXR5IHByZXNjYWxlcgorICogQHJtdG9sbCBJMlNQUiAgICAgICAgT0REICAgICAgICAgICBMTF9JMlNfR2V0UHJlc2NhbGVyUGFyaXR5CisgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfUFJFU0NBTEVSX1BBUklUWV9FVkVOCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfUFJFU0NBTEVSX1BBUklUWV9PREQKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyU19HZXRQcmVzY2FsZXJQYXJpdHkoY29uc3QgU1BJX1R5cGVEZWYgKlNQSXgpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoU1BJeC0+STJTUFIsIFNQSV9JMlNQUl9PREQpID4+IDhVKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSB0aGUgbWFzdGVyIGNsb2NrIG91dHB1dCAoUGluIE1DSykKKyAqIEBybXRvbGwgSTJTUFIgICAgICAgIE1DS09FICAgICAgICAgTExfSTJTX0VuYWJsZU1hc3RlckNsb2NrCisgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJTX0VuYWJsZU1hc3RlckNsb2NrKFNQSV9UeXBlRGVmICpTUEl4KSB7CisgIFNFVF9CSVQoU1BJeC0+STJTUFIsIFNQSV9JMlNQUl9NQ0tPRSk7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIHRoZSBtYXN0ZXIgY2xvY2sgb3V0cHV0IChQaW4gTUNLKQorICogQHJtdG9sbCBJMlNQUiAgICAgICAgTUNLT0UgICAgICAgICBMTF9JMlNfRGlzYWJsZU1hc3RlckNsb2NrCisgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJTX0Rpc2FibGVNYXN0ZXJDbG9jayhTUElfVHlwZURlZiAqU1BJeCkgeworICBDTEVBUl9CSVQoU1BJeC0+STJTUFIsIFNQSV9JMlNQUl9NQ0tPRSk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiB0aGUgbWFzdGVyIGNsb2NrIG91dHB1dCAoUGluIE1DSykgaXMgZW5hYmxlZAorICogQHJtdG9sbCBJMlNQUiAgICAgICAgTUNLT0UgICAgICAgICBMTF9JMlNfSXNFbmFibGVkTWFzdGVyQ2xvY2sKKyAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJTX0lzRW5hYmxlZE1hc3RlckNsb2NrKGNvbnN0IFNQSV9UeXBlRGVmICpTUEl4KSB7CisgIHJldHVybiAoKFJFQURfQklUKFNQSXgtPkkyU1BSLCBTUElfSTJTUFJfTUNLT0UpID09IChTUElfSTJTUFJfTUNLT0UpKSA/IDFVTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOworfQorCisjaWYgZGVmaW5lZChTUElfSTJTQ0ZHUl9BU1RSVEVOKQorLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBhc3luY2hyb25vdXMgc3RhcnQKKyAqIEBybXRvbGwgSTJTQ0ZHUiAgICAgIEFTVFJURU4gICAgICAgTExfSTJTX0VuYWJsZUFzeW5jU3RhcnQKKyAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMlNfRW5hYmxlQXN5bmNTdGFydChTUElfVHlwZURlZiAqU1BJeCkgeworICBTRVRfQklUKFNQSXgtPkkyU0NGR1IsIFNQSV9JMlNDRkdSX0FTVFJURU4pOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSAgYXN5bmNocm9ub3VzIHN0YXJ0CisgKiBAcm10b2xsIEkyU0NGR1IgICAgICBBU1RSVEVOICAgICAgIExMX0kyU19EaXNhYmxlQXN5bmNTdGFydAorICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyU19EaXNhYmxlQXN5bmNTdGFydChTUElfVHlwZURlZiAqU1BJeCkgeworICBDTEVBUl9CSVQoU1BJeC0+STJTQ0ZHUiwgU1BJX0kyU0NGR1JfQVNUUlRFTik7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiBhc3luY2hyb25vdXMgc3RhcnQgaXMgZW5hYmxlZAorICogQHJtdG9sbCBJMlNDRkdSICAgICAgQVNUUlRFTiAgICAgICBMTF9JMlNfSXNFbmFibGVkQXN5bmNTdGFydAorICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMlNfSXNFbmFibGVkQXN5bmNTdGFydChjb25zdCBTUElfVHlwZURlZiAqU1BJeCkgeworICByZXR1cm4gKAorICAgICAgKFJFQURfQklUKFNQSXgtPkkyU0NGR1IsIFNQSV9JMlNDRkdSX0FTVFJURU4pID09IChTUElfSTJTQ0ZHUl9BU1RSVEVOKSkKKyAgICAgICAgICA/IDFVTAorICAgICAgICAgIDogMFVMKTsKK30KKyNlbmRpZiAvKiBTUElfSTJTQ0ZHUl9BU1RSVEVOICovCisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEkyU19MTF9FRl9GTEFHIEZMQUcgTWFuYWdlbWVudAorICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgUnggYnVmZmVyIGlzIG5vdCBlbXB0eQorICogQHJtdG9sbCBTUiAgICAgICAgICAgUlhORSAgICAgICAgICBMTF9JMlNfSXNBY3RpdmVGbGFnX1JYTkUKKyAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJTX0lzQWN0aXZlRmxhZ19SWE5FKGNvbnN0IFNQSV9UeXBlRGVmICpTUEl4KSB7CisgIHJldHVybiBMTF9TUElfSXNBY3RpdmVGbGFnX1JYTkUoU1BJeCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiBUeCBidWZmZXIgaXMgZW1wdHkKKyAqIEBybXRvbGwgU1IgICAgICAgICAgIFRYRSAgICAgICAgICAgTExfSTJTX0lzQWN0aXZlRmxhZ19UWEUKKyAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJTX0lzQWN0aXZlRmxhZ19UWEUoY29uc3QgU1BJX1R5cGVEZWYgKlNQSXgpIHsKKyAgcmV0dXJuIExMX1NQSV9Jc0FjdGl2ZUZsYWdfVFhFKFNQSXgpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IGJ1c3kgZmxhZworICogQHJtdG9sbCBTUiAgICAgICAgICAgQlNZICAgICAgICAgICBMTF9JMlNfSXNBY3RpdmVGbGFnX0JTWQorICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMlNfSXNBY3RpdmVGbGFnX0JTWShjb25zdCBTUElfVHlwZURlZiAqU1BJeCkgeworICByZXR1cm4gTExfU1BJX0lzQWN0aXZlRmxhZ19CU1koU1BJeCk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgb3ZlcnJ1biBlcnJvciBmbGFnCisgKiBAcm10b2xsIFNSICAgICAgICAgICBPVlIgICAgICAgICAgIExMX0kyU19Jc0FjdGl2ZUZsYWdfT1ZSCisgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyU19Jc0FjdGl2ZUZsYWdfT1ZSKGNvbnN0IFNQSV9UeXBlRGVmICpTUEl4KSB7CisgIHJldHVybiBMTF9TUElfSXNBY3RpdmVGbGFnX09WUihTUEl4KTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCB1bmRlcnJ1biBlcnJvciBmbGFnCisgKiBAcm10b2xsIFNSICAgICAgICAgICBVRFIgICAgICAgICAgIExMX0kyU19Jc0FjdGl2ZUZsYWdfVURSCisgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyU19Jc0FjdGl2ZUZsYWdfVURSKGNvbnN0IFNQSV9UeXBlRGVmICpTUEl4KSB7CisgIHJldHVybiAoKFJFQURfQklUKFNQSXgtPlNSLCBTUElfU1JfVURSKSA9PSAoU1BJX1NSX1VEUikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBmcmFtZSBmb3JtYXQgZXJyb3IgZmxhZworICogQHJtdG9sbCBTUiAgICAgICAgICAgRlJFICAgICAgICAgICBMTF9JMlNfSXNBY3RpdmVGbGFnX0ZSRQorICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMlNfSXNBY3RpdmVGbGFnX0ZSRShjb25zdCBTUElfVHlwZURlZiAqU1BJeCkgeworICByZXR1cm4gTExfU1BJX0lzQWN0aXZlRmxhZ19GUkUoU1BJeCk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgY2hhbm5lbCBzaWRlIGZsYWcuCisgKiBAbm90ZSAgIDA6IENoYW5uZWwgTGVmdCBoYXMgdG8gYmUgdHJhbnNtaXR0ZWQgb3IgaGFzIGJlZW4gcmVjZWl2ZWRcbgorICogICAgICAgICAxOiBDaGFubmVsIFJpZ2h0IGhhcyB0byBiZSB0cmFuc21pdHRlZCBvciBoYXMgYmVlbiByZWNlaXZlZFxuCisgKiAgICAgICAgIEl0IGhhcyBubyBzaWduaWZpY2FuY2UgaW4gUENNIG1vZGUuCisgKiBAcm10b2xsIFNSICAgICAgICAgICBDSFNJREUgICAgICAgIExMX0kyU19Jc0FjdGl2ZUZsYWdfQ0hTSURFCisgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyU19Jc0FjdGl2ZUZsYWdfQ0hTSURFKGNvbnN0IFNQSV9UeXBlRGVmICpTUEl4KSB7CisgIHJldHVybiAoKFJFQURfQklUKFNQSXgtPlNSLCBTUElfU1JfQ0hTSURFKSA9PSAoU1BJX1NSX0NIU0lERSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENsZWFyIG92ZXJydW4gZXJyb3IgZmxhZworICogQHJtdG9sbCBTUiAgICAgICAgICAgT1ZSICAgICAgICAgICBMTF9JMlNfQ2xlYXJGbGFnX09WUgorICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyU19DbGVhckZsYWdfT1ZSKFNQSV9UeXBlRGVmICpTUEl4KSB7CisgIExMX1NQSV9DbGVhckZsYWdfT1ZSKFNQSXgpOworfQorCisvKioKKyAqIEBicmllZiAgQ2xlYXIgdW5kZXJydW4gZXJyb3IgZmxhZworICogQHJtdG9sbCBTUiAgICAgICAgICAgVURSICAgICAgICAgICBMTF9JMlNfQ2xlYXJGbGFnX1VEUgorICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyU19DbGVhckZsYWdfVURSKGNvbnN0IFNQSV9UeXBlRGVmICpTUEl4KSB7CisgIF9fSU8gdWludDMyX3QgdG1wcmVnOworICB0bXByZWcgPSBTUEl4LT5TUjsKKyAgKHZvaWQpdG1wcmVnOworfQorCisvKioKKyAqIEBicmllZiAgQ2xlYXIgZnJhbWUgZm9ybWF0IGVycm9yIGZsYWcKKyAqIEBybXRvbGwgU1IgICAgICAgICAgIEZSRSAgICAgICAgICAgTExfSTJTX0NsZWFyRmxhZ19GUkUKKyAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMlNfQ2xlYXJGbGFnX0ZSRShjb25zdCBTUElfVHlwZURlZiAqU1BJeCkgeworICBMTF9TUElfQ2xlYXJGbGFnX0ZSRShTUEl4KTsKK30KKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgSTJTX0xMX0VGX0lUIEludGVycnVwdCBNYW5hZ2VtZW50CisgKiBAeworICovCisKKy8qKgorICogQGJyaWVmICBFbmFibGUgZXJyb3IgSVQKKyAqIEBub3RlICAgVGhpcyBiaXQgY29udHJvbHMgdGhlIGdlbmVyYXRpb24gb2YgYW4gaW50ZXJydXB0IHdoZW4gYW4gZXJyb3IKKyAqIGNvbmRpdGlvbiBvY2N1cnMgKE9WUiwgVURSIGFuZCBGUkUgaW4gSTJTIG1vZGUpLgorICogQHJtdG9sbCBDUjIgICAgICAgICAgRVJSSUUgICAgICAgICBMTF9JMlNfRW5hYmxlSVRfRVJSCisgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJTX0VuYWJsZUlUX0VSUihTUElfVHlwZURlZiAqU1BJeCkgeworICBMTF9TUElfRW5hYmxlSVRfRVJSKFNQSXgpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIFJ4IGJ1ZmZlciBub3QgZW1wdHkgSVQKKyAqIEBybXRvbGwgQ1IyICAgICAgICAgIFJYTkVJRSAgICAgICAgTExfSTJTX0VuYWJsZUlUX1JYTkUKKyAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMlNfRW5hYmxlSVRfUlhORShTUElfVHlwZURlZiAqU1BJeCkgeworICBMTF9TUElfRW5hYmxlSVRfUlhORShTUEl4KTsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBUeCBidWZmZXIgZW1wdHkgSVQKKyAqIEBybXRvbGwgQ1IyICAgICAgICAgIFRYRUlFICAgICAgICAgTExfSTJTX0VuYWJsZUlUX1RYRQorICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyU19FbmFibGVJVF9UWEUoU1BJX1R5cGVEZWYgKlNQSXgpIHsKKyAgTExfU1BJX0VuYWJsZUlUX1RYRShTUEl4KTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgZXJyb3IgSVQKKyAqIEBub3RlICAgVGhpcyBiaXQgY29udHJvbHMgdGhlIGdlbmVyYXRpb24gb2YgYW4gaW50ZXJydXB0IHdoZW4gYW4gZXJyb3IKKyAqIGNvbmRpdGlvbiBvY2N1cnMgKE9WUiwgVURSIGFuZCBGUkUgaW4gSTJTIG1vZGUpLgorICogQHJtdG9sbCBDUjIgICAgICAgICAgRVJSSUUgICAgICAgICBMTF9JMlNfRGlzYWJsZUlUX0VSUgorICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyU19EaXNhYmxlSVRfRVJSKFNQSV9UeXBlRGVmICpTUEl4KSB7CisgIExMX1NQSV9EaXNhYmxlSVRfRVJSKFNQSXgpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBSeCBidWZmZXIgbm90IGVtcHR5IElUCisgKiBAcm10b2xsIENSMiAgICAgICAgICBSWE5FSUUgICAgICAgIExMX0kyU19EaXNhYmxlSVRfUlhORQorICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyU19EaXNhYmxlSVRfUlhORShTUElfVHlwZURlZiAqU1BJeCkgeworICBMTF9TUElfRGlzYWJsZUlUX1JYTkUoU1BJeCk7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIFR4IGJ1ZmZlciBlbXB0eSBJVAorICogQHJtdG9sbCBDUjIgICAgICAgICAgVFhFSUUgICAgICAgICBMTF9JMlNfRGlzYWJsZUlUX1RYRQorICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyU19EaXNhYmxlSVRfVFhFKFNQSV9UeXBlRGVmICpTUEl4KSB7CisgIExMX1NQSV9EaXNhYmxlSVRfVFhFKFNQSXgpOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgRVJSIElUIGlzIGVuYWJsZWQKKyAqIEBybXRvbGwgQ1IyICAgICAgICAgIEVSUklFICAgICAgICAgTExfSTJTX0lzRW5hYmxlZElUX0VSUgorICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMlNfSXNFbmFibGVkSVRfRVJSKGNvbnN0IFNQSV9UeXBlRGVmICpTUEl4KSB7CisgIHJldHVybiBMTF9TUElfSXNFbmFibGVkSVRfRVJSKFNQSXgpOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgUlhORSBJVCBpcyBlbmFibGVkCisgKiBAcm10b2xsIENSMiAgICAgICAgICBSWE5FSUUgICAgICAgIExMX0kyU19Jc0VuYWJsZWRJVF9SWE5FCisgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyU19Jc0VuYWJsZWRJVF9SWE5FKGNvbnN0IFNQSV9UeXBlRGVmICpTUEl4KSB7CisgIHJldHVybiBMTF9TUElfSXNFbmFibGVkSVRfUlhORShTUEl4KTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIFRYRSBJVCBpcyBlbmFibGVkCisgKiBAcm10b2xsIENSMiAgICAgICAgICBUWEVJRSAgICAgICAgIExMX0kyU19Jc0VuYWJsZWRJVF9UWEUKKyAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJTX0lzRW5hYmxlZElUX1RYRShjb25zdCBTUElfVHlwZURlZiAqU1BJeCkgeworICByZXR1cm4gTExfU1BJX0lzRW5hYmxlZElUX1RYRShTUEl4KTsKK30KKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgSTJTX0xMX0VGX0RNQSBETUEgTWFuYWdlbWVudAorICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiAgRW5hYmxlIERNQSBSeAorICogQHJtdG9sbCBDUjIgICAgICAgICAgUlhETUFFTiAgICAgICBMTF9JMlNfRW5hYmxlRE1BUmVxX1JYCisgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJTX0VuYWJsZURNQVJlcV9SWChTUElfVHlwZURlZiAqU1BJeCkgeworICBMTF9TUElfRW5hYmxlRE1BUmVxX1JYKFNQSXgpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBETUEgUngKKyAqIEBybXRvbGwgQ1IyICAgICAgICAgIFJYRE1BRU4gICAgICAgTExfSTJTX0Rpc2FibGVETUFSZXFfUlgKKyAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMlNfRGlzYWJsZURNQVJlcV9SWChTUElfVHlwZURlZiAqU1BJeCkgeworICBMTF9TUElfRGlzYWJsZURNQVJlcV9SWChTUEl4KTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIERNQSBSeCBpcyBlbmFibGVkCisgKiBAcm10b2xsIENSMiAgICAgICAgICBSWERNQUVOICAgICAgIExMX0kyU19Jc0VuYWJsZWRETUFSZXFfUlgKKyAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJTX0lzRW5hYmxlZERNQVJlcV9SWChjb25zdCBTUElfVHlwZURlZiAqU1BJeCkgeworICByZXR1cm4gTExfU1BJX0lzRW5hYmxlZERNQVJlcV9SWChTUEl4KTsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBETUEgVHgKKyAqIEBybXRvbGwgQ1IyICAgICAgICAgIFRYRE1BRU4gICAgICAgTExfSTJTX0VuYWJsZURNQVJlcV9UWAorICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyU19FbmFibGVETUFSZXFfVFgoU1BJX1R5cGVEZWYgKlNQSXgpIHsKKyAgTExfU1BJX0VuYWJsZURNQVJlcV9UWChTUEl4KTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgRE1BIFR4CisgKiBAcm10b2xsIENSMiAgICAgICAgICBUWERNQUVOICAgICAgIExMX0kyU19EaXNhYmxlRE1BUmVxX1RYCisgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJTX0Rpc2FibGVETUFSZXFfVFgoU1BJX1R5cGVEZWYgKlNQSXgpIHsKKyAgTExfU1BJX0Rpc2FibGVETUFSZXFfVFgoU1BJeCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiBETUEgVHggaXMgZW5hYmxlZAorICogQHJtdG9sbCBDUjIgICAgICAgICAgVFhETUFFTiAgICAgICBMTF9JMlNfSXNFbmFibGVkRE1BUmVxX1RYCisgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyU19Jc0VuYWJsZWRETUFSZXFfVFgoY29uc3QgU1BJX1R5cGVEZWYgKlNQSXgpIHsKKyAgcmV0dXJuIExMX1NQSV9Jc0VuYWJsZWRETUFSZXFfVFgoU1BJeCk7Cit9CisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEkyU19MTF9FRl9EQVRBIERBVEEgTWFuYWdlbWVudAorICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiAgUmVhZCAxNi1CaXRzIGluIGRhdGEgcmVnaXN0ZXIKKyAqIEBybXRvbGwgRFIgICAgICAgICAgIERSICAgICAgICAgICAgTExfSTJTX1JlY2VpdmVEYXRhMTYKKyAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAqIEByZXR2YWwgUnhEYXRhIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMDAwIGFuZCBNYXhfRGF0YT0weEZGRkYKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQxNl90IExMX0kyU19SZWNlaXZlRGF0YTE2KFNQSV9UeXBlRGVmICpTUEl4KSB7CisgIHJldHVybiBMTF9TUElfUmVjZWl2ZURhdGExNihTUEl4KTsKK30KKworLyoqCisgKiBAYnJpZWYgIFdyaXRlIDE2LUJpdHMgaW4gZGF0YSByZWdpc3RlcgorICogQHJtdG9sbCBEUiAgICAgICAgICAgRFIgICAgICAgICAgICBMTF9JMlNfVHJhbnNtaXREYXRhMTYKKyAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAqIEBwYXJhbSAgVHhEYXRhIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMDAwIGFuZCBNYXhfRGF0YT0weEZGRkYKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMlNfVHJhbnNtaXREYXRhMTYoU1BJX1R5cGVEZWYgKlNQSXgsIHVpbnQxNl90IFR4RGF0YSkgeworICBMTF9TUElfVHJhbnNtaXREYXRhMTYoU1BJeCwgVHhEYXRhKTsKK30KKworLyoqCisgKiBAfQorICovCisKKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgSTJTX0xMX0VGX0luaXQgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICogQHsKKyAqLworCitFcnJvclN0YXR1cyBMTF9JMlNfRGVJbml0KGNvbnN0IFNQSV9UeXBlRGVmICpTUEl4KTsKK0Vycm9yU3RhdHVzIExMX0kyU19Jbml0KFNQSV9UeXBlRGVmICpTUEl4LCBMTF9JMlNfSW5pdFR5cGVEZWYgKkkyU19Jbml0U3RydWN0KTsKK3ZvaWQgTExfSTJTX1N0cnVjdEluaXQoTExfSTJTX0luaXRUeXBlRGVmICpJMlNfSW5pdFN0cnVjdCk7Cit2b2lkIExMX0kyU19Db25maWdQcmVzY2FsZXIoU1BJX1R5cGVEZWYgKlNQSXgsIHVpbnQzMl90IFByZXNjYWxlckxpbmVhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQcmVzY2FsZXJQYXJpdHkpOworCisvKioKKyAqIEB9CisgKi8KKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworI2VuZGlmIC8qIFNQSV9JMlNfU1VQUE9SVCAqLworCisjZW5kaWYgLyogZGVmaW5lZCAoU1BJMSkgfHwgZGVmaW5lZCAoU1BJMikgfHwgZGVmaW5lZCAoU1BJMykgfHwgZGVmaW5lZCAoU1BJNCkgXAorICAgICAgICAqLworCisvKioKKyAqIEB9CisgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyRzR4eF9MTF9TUElfSCAqLwpkaWZmIC0tZ2l0IGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfbGxfc3lzdGVtLmggYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9sbF9zeXN0ZW0uaAppbmRleCBjZjdiODNjLi4yMTBkNTI1IDEwMDY0NAotLS0gYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9sbF9zeXN0ZW0uaAorKysgYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9sbF9zeXN0ZW0uaApAQCAtMSwxNjI3ICsxLDE2MzAgQEAKLS8qKg0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICAqIEBmaWxlICAgIHN0bTMyZzR4eF9sbF9zeXN0ZW0uaA0KLSAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQ0KLSAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBTWVNURU0gTEwgbW9kdWxlLg0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICAqIEBhdHRlbnRpb24NCi0gICoNCi0gICogQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4NCi0gICogQWxsIHJpZ2h0cyByZXNlcnZlZC4NCi0gICoNCi0gICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0ZXJtcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlDQotICAqIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4NCi0gICogSWYgbm8gTElDRU5TRSBmaWxlIGNvbWVzIHdpdGggdGhpcyBzb2Z0d2FyZSwgaXQgaXMgcHJvdmlkZWQgQVMtSVMuDQotICAqDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gIEB2ZXJiYXRpbQ0KLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIw0KLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgIFsuLl0NCi0gICAgVGhlIExMIFNZU1RFTSBkcml2ZXIgY29udGFpbnMgYSBzZXQgb2YgZ2VuZXJpYyBBUElzIHRoYXQgY2FuIGJlDQotICAgIHVzZWQgYnkgdXNlcjoNCi0gICAgICAoKykgU29tZSBvZiB0aGUgRkxBU0ggZmVhdHVyZXMgbmVlZCB0byBiZSBoYW5kbGVkIGluIHRoZSBTWVNURU0gZmlsZS4NCi0gICAgICAoKykgQWNjZXNzIHRvIERCR0NNVSByZWdpc3RlcnMNCi0gICAgICAoKykgQWNjZXNzIHRvIFNZU0NGRyByZWdpc3RlcnMNCi0gICAgICAoKykgQWNjZXNzIHRvIFZSRUZCVUYgcmVnaXN0ZXJzDQotDQotICBAZW5kdmVyYmF0aW0NCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgKi8NCi0NCi0vKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpZm5kZWYgX19TVE0zMkc0eHhfTExfU1lTVEVNX0gNCi0jZGVmaW5lIF9fU1RNMzJHNHh4X0xMX1NZU1RFTV9IDQotDQotI2lmZGVmIF9fY3BsdXNwbHVzDQotZXh0ZXJuICJDIiB7DQotI2VuZGlmDQotDQotLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaW5jbHVkZSAic3RtMzJnNHh4LmgiDQotDQotLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzR4eF9MTF9Ecml2ZXINCi0gKiBAew0KLSAqLw0KLQ0KLSNpZiBkZWZpbmVkKEZMQVNIKSB8fCBkZWZpbmVkKFNZU0NGRykgfHwgZGVmaW5lZChEQkdNQ1UpIHx8IGRlZmluZWQoVlJFRkJVRikNCi0NCi0vKiogQGRlZmdyb3VwIFNZU1RFTV9MTCBTWVNURU0NCi0gKiBAew0KLSAqLw0KLQ0KLS8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0NCi0vKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgU1lTVEVNX0xMX1ByaXZhdGVfQ29uc3RhbnRzIFNZU1RFTSBQcml2YXRlIENvbnN0YW50cw0KLSAqIEB7DQotICovDQotDQotLyogRGVmaW5lcyB1c2VkIGZvciBwb3NpdGlvbiBpbiB0aGUgcmVnaXN0ZXIgKi8NCi0jZGVmaW5lIERCR01DVV9SRVZJRF9QT1NJVElPTiAodWludDMyX3QpIFBPU0lUSU9OX1ZBTChEQkdNQ1VfSURDT0RFX1JFVl9JRCkNCi0NCi0vKioNCi0gKiBAYnJpZWYgUG93ZXItZG93biBpbiBSdW4gbW9kZSBGbGFzaCBrZXkNCi0gKi8NCi0jZGVmaW5lIEZMQVNIX1BES0VZMSAweDA0MTUyNjM3VSAvKiE8IEZsYXNoIHBvd2VyIGRvd24ga2V5MSAqLw0KLSNkZWZpbmUgRkxBU0hfUERLRVkyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgMHhGQUZCRkNGRFUgLyohPCBGbGFzaCBwb3dlciBkb3duIGtleTI6IHVzZWQgd2l0aCBGTEFTSF9QREtFWTEgXA0KLSAgICAgICAgICAgICAgICAgICB0byB1bmxvY2sgdGhlIFJVTl9QRCBiaXQgaW4gRkxBU0hfQUNSICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLQ0KLS8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGRlZmdyb3VwIFNZU1RFTV9MTF9FeHBvcnRlZF9Db25zdGFudHMgU1lTVEVNIEV4cG9ydGVkIENvbnN0YW50cw0KLSAqIEB7DQotICovDQotDQotLyoqIEBkZWZncm91cCBTWVNURU1fTExfRUNfUkVNQVAgU1lTQ0ZHIFJFTUFQDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1NZU0NGR19SRU1BUF9GTEFTSCBcDQotICAweDAwMDAwMDAwVSAvKiE8IE1haW4gRmxhc2ggbWVtb3J5IG1hcHBlZCBhdCAweDAwMDAwMDAwICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfU1lTQ0ZHX1JFTUFQX1NZU1RFTUZMQVNIIFwNCi0gIFNZU0NGR19NRU1STVBfTUVNX01PREVfMCAvKiE8IFN5c3RlbSBGbGFzaCBtZW1vcnkgbWFwcGVkIGF0IDB4MDAwMDAwMDAgKi8NCi0jZGVmaW5lIExMX1NZU0NGR19SRU1BUF9TUkFNICBcDQotICAoU1lTQ0ZHX01FTVJNUF9NRU1fTU9ERV8xIHwgXA0KLSAgIFNZU0NGR19NRU1STVBfTUVNX01PREVfMCkgLyohPCBTUkFNMSBtYXBwZWQgYXQgMHgwMDAwMDAwMCAqLw0KLSNpZiBkZWZpbmVkKEZNQ19CYW5rMV9SKQ0KLSNkZWZpbmUgTExfU1lTQ0ZHX1JFTUFQX0ZNQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBTWVNDRkdfTUVNUk1QX01FTV9NT0RFXzEgLyohPCBGTUMgYmFuayAxIChOT1IvUFNSQU0gMSBhbmQgMikgbWFwcGVkIGF0IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwICovDQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgLyogRk1DX0JhbmsxX1IgKi8NCi0jZGVmaW5lIExMX1NZU0NGR19SRU1BUF9RVUFEU1BJIFwNCi0gIChTWVNDRkdfTUVNUk1QX01FTV9NT0RFXzIgfCAgIFwNCi0gICBTWVNDRkdfTUVNUk1QX01FTV9NT0RFXzEpIC8qITwgUVVBRFNQSSBtZW1vcnkgbWFwcGVkIGF0IDB4MDAwMDAwMDAgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLSNpZiBkZWZpbmVkKFNZU0NGR19NRU1STVBfRkJfTU9ERSkNCi0vKiogQGRlZmdyb3VwIFNZU1RFTV9MTF9FQ19CQU5LTU9ERSBTWVNDRkcgQkFOSyBNT0RFDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1NZU0NGR19CQU5LTU9ERV9CQU5LMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAweDAwMDAwMDAwVSAvKiE8IEZsYXNoIEJhbmsxIG1hcHBlZCBhdCAweDA4MDAwMDAwIChhbmQgYWxpYXNlZCBAMHgwMDAwMDAwMCkgXA0KLSAgICAgICAgICAgICAgIGFuZCBGbGFzaCBCYW5rMiBtYXBwZWQgYXQgMHgwODA0MDAwMCAoYW5kIGFsaWFzZWQgYXQgICAgICAgICAgIFwNCi0gICAgICAgICAgICAgICAweDAwMDgwMDAwKSAqLw0KLSNkZWZpbmUgTExfU1lTQ0ZHX0JBTktNT0RFX0JBTksyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIFNZU0NGR19NRU1STVBfRkJfTU9ERSAvKiE8IEZsYXNoIEJhbmsyIG1hcHBlZCBhdCAweDA4MDAwMDAwIChhbmQgYWxpYXNlZCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgIEAweDAwMDAwMDAwKSBhbmQgRmxhc2ggQmFuazEgbWFwcGVkIGF0IDB4MDgwNDAwMDAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAoYW5kIGFsaWFzZWQgYXQgMHgwMDA4MDAwMCkgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLSNlbmRpZiAvKiBTWVNDRkdfTUVNUk1QX0ZCX01PREUgKi8NCi0vKiogQGRlZmdyb3VwIFNZU1RFTV9MTF9FQ19JMkNfRkFTVE1PREVQTFVTIFNZU0NGRyBJMkMgRkFTVE1PREVQTFVTDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1NZU0NGR19JMkNfRkFTVE1PREVQTFVTX1BCNiBcDQotICBTWVNDRkdfQ0ZHUjFfSTJDX1BCNl9GTVAgLyohPCBFbmFibGUgRmFzdCBNb2RlIFBsdXMgb24gUEI2ICAgICAgICovDQotI2RlZmluZSBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19QQjcgXA0KLSAgU1lTQ0ZHX0NGR1IxX0kyQ19QQjdfRk1QIC8qITwgRW5hYmxlIEZhc3QgTW9kZSBQbHVzIG9uIFBCNyAgICAgICAqLw0KLSNpZiBkZWZpbmVkKFNZU0NGR19DRkdSMV9JMkNfUEI4X0ZNUCkNCi0jZGVmaW5lIExMX1NZU0NGR19JMkNfRkFTVE1PREVQTFVTX1BCOCBcDQotICBTWVNDRkdfQ0ZHUjFfSTJDX1BCOF9GTVAgLyohPCBFbmFibGUgRmFzdCBNb2RlIFBsdXMgb24gUEI4ICAgICAgICovDQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgLyogU1lTQ0ZHX0NGR1IxX0kyQ19QQjhfRk1QICovDQotI2lmIGRlZmluZWQoU1lTQ0ZHX0NGR1IxX0kyQ19QQjlfRk1QKQ0KLSNkZWZpbmUgTExfU1lTQ0ZHX0kyQ19GQVNUTU9ERVBMVVNfUEI5IFwNCi0gIFNZU0NGR19DRkdSMV9JMkNfUEI5X0ZNUCAvKiE8IEVuYWJsZSBGYXN0IE1vZGUgUGx1cyBvbiBQQjkgICAgICAgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAvKiBTWVNDRkdfQ0ZHUjFfSTJDX1BCOV9GTVAgKi8NCi0jZGVmaW5lIExMX1NZU0NGR19JMkNfRkFTVE1PREVQTFVTX0kyQzEgXA0KLSAgU1lTQ0ZHX0NGR1IxX0kyQzFfRk1QIC8qITwgRW5hYmxlIEZhc3QgTW9kZSBQbHVzIG9uIEkyQzEgcGlucyAqLw0KLSNpZiBkZWZpbmVkKEkyQzIpDQotI2RlZmluZSBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19JMkMyIFwNCi0gIFNZU0NGR19DRkdSMV9JMkMyX0ZNUCAvKiE8IEVuYWJsZSBGYXN0IE1vZGUgUGx1cyBvbiBJMkMyIHBpbnMgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgICAvKiBJMkMyICovDQotI2RlZmluZSBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19JMkMzIFwNCi0gIFNZU0NGR19DRkdSMV9JMkMzX0ZNUCAvKiE8IEVuYWJsZSBGYXN0IE1vZGUgUGx1cyBvbiBJMkMzIHBpbnMgKi8NCi0jaWYgZGVmaW5lZChJMkM0KQ0KLSNkZWZpbmUgTExfU1lTQ0ZHX0kyQ19GQVNUTU9ERVBMVVNfSTJDNCBcDQotICBTWVNDRkdfQ0ZHUjFfSTJDNF9GTVAgLyohPCBFbmFibGUgRmFzdCBNb2RlIFBsdXMgb24gSTJDNCBwaW5zICovDQotI2VuZGlmICAgICAgICAgICAgICAgICAgLyogSTJDNCAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBTWVNURU1fTExfRUNfRVhUSV9QT1JUIFNZU0NGRyBFWFRJIFBPUlQNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfU1lTQ0ZHX0VYVElfUE9SVEEgMFUgLyohPCBFWFRJIFBPUlQgQSAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9TWVNDRkdfRVhUSV9QT1JUQiAxVSAvKiE8IEVYVEkgUE9SVCBCICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX1NZU0NGR19FWFRJX1BPUlRDIDJVIC8qITwgRVhUSSBQT1JUIEMgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfU1lTQ0ZHX0VYVElfUE9SVEQgM1UgLyohPCBFWFRJIFBPUlQgRCAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9TWVNDRkdfRVhUSV9QT1JURSA0VSAvKiE8IEVYVEkgUE9SVCBFICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX1NZU0NGR19FWFRJX1BPUlRGIDVVIC8qITwgRVhUSSBQT1JUIEYgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfU1lTQ0ZHX0VYVElfUE9SVEcgNlUgLyohPCBFWFRJIFBPUlQgRyAgICAgICAgICAgICAgICAgICAgICAgICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFNZU1RFTV9MTF9FQ19FWFRJX0xJTkUgU1lTQ0ZHIEVYVEkgTElORQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9TWVNDRkdfRVhUSV9MSU5FMCBcDQotICAodWludDMyX3QpKCgweDAwMEZVIDw8IDE2VSkgfCAwVSkgLyogITwgRVhUSV9QT1NJVElPTl8wICB8IEVYVElDUlswXSAqLw0KLSNkZWZpbmUgTExfU1lTQ0ZHX0VYVElfTElORTEgXA0KLSAgKHVpbnQzMl90KSgoMHgwMEYwVSA8PCAxNlUpIHwgMFUpIC8qICE8IEVYVElfUE9TSVRJT05fNCAgfCBFWFRJQ1JbMF0gKi8NCi0jZGVmaW5lIExMX1NZU0NGR19FWFRJX0xJTkUyIFwNCi0gICh1aW50MzJfdCkoKDB4MEYwMFUgPDwgMTZVKSB8IDBVKSAvKiAhPCBFWFRJX1BPU0lUSU9OXzggIHwgRVhUSUNSWzBdICovDQotI2RlZmluZSBMTF9TWVNDRkdfRVhUSV9MSU5FMyBcDQotICAodWludDMyX3QpKCgweEYwMDBVIDw8IDE2VSkgfCAwVSkgLyogITwgRVhUSV9QT1NJVElPTl8xMiB8IEVYVElDUlswXSAqLw0KLSNkZWZpbmUgTExfU1lTQ0ZHX0VYVElfTElORTQgXA0KLSAgKHVpbnQzMl90KSgoMHgwMDBGVSA8PCAxNlUpIHwgMVUpIC8qICE8IEVYVElfUE9TSVRJT05fMCAgfCBFWFRJQ1JbMV0gKi8NCi0jZGVmaW5lIExMX1NZU0NGR19FWFRJX0xJTkU1IFwNCi0gICh1aW50MzJfdCkoKDB4MDBGMFUgPDwgMTZVKSB8IDFVKSAvKiAhPCBFWFRJX1BPU0lUSU9OXzQgIHwgRVhUSUNSWzFdICovDQotI2RlZmluZSBMTF9TWVNDRkdfRVhUSV9MSU5FNiBcDQotICAodWludDMyX3QpKCgweDBGMDBVIDw8IDE2VSkgfCAxVSkgLyogITwgRVhUSV9QT1NJVElPTl84ICB8IEVYVElDUlsxXSAqLw0KLSNkZWZpbmUgTExfU1lTQ0ZHX0VYVElfTElORTcgXA0KLSAgKHVpbnQzMl90KSgoMHhGMDAwVSA8PCAxNlUpIHwgMVUpIC8qICE8IEVYVElfUE9TSVRJT05fMTIgfCBFWFRJQ1JbMV0gKi8NCi0jZGVmaW5lIExMX1NZU0NGR19FWFRJX0xJTkU4IFwNCi0gICh1aW50MzJfdCkoKDB4MDAwRlUgPDwgMTZVKSB8IDJVKSAvKiAhPCBFWFRJX1BPU0lUSU9OXzAgIHwgRVhUSUNSWzJdICovDQotI2RlZmluZSBMTF9TWVNDRkdfRVhUSV9MSU5FOSBcDQotICAodWludDMyX3QpKCgweDAwRjBVIDw8IDE2VSkgfCAyVSkgLyogITwgRVhUSV9QT1NJVElPTl80ICB8IEVYVElDUlsyXSAqLw0KLSNkZWZpbmUgTExfU1lTQ0ZHX0VYVElfTElORTEwIFwNCi0gICh1aW50MzJfdCkoKDB4MEYwMFUgPDwgMTZVKSB8IDJVKSAvKiAhPCBFWFRJX1BPU0lUSU9OXzggIHwgRVhUSUNSWzJdICovDQotI2RlZmluZSBMTF9TWVNDRkdfRVhUSV9MSU5FMTEgXA0KLSAgKHVpbnQzMl90KSgoMHhGMDAwVSA8PCAxNlUpIHwgMlUpIC8qICE8IEVYVElfUE9TSVRJT05fMTIgfCBFWFRJQ1JbMl0gKi8NCi0jZGVmaW5lIExMX1NZU0NGR19FWFRJX0xJTkUxMiBcDQotICAodWludDMyX3QpKCgweDAwMEZVIDw8IDE2VSkgfCAzVSkgLyogITwgRVhUSV9QT1NJVElPTl8wICB8IEVYVElDUlszXSAqLw0KLSNkZWZpbmUgTExfU1lTQ0ZHX0VYVElfTElORTEzIFwNCi0gICh1aW50MzJfdCkoKDB4MDBGMFUgPDwgMTZVKSB8IDNVKSAvKiAhPCBFWFRJX1BPU0lUSU9OXzQgIHwgRVhUSUNSWzNdICovDQotI2RlZmluZSBMTF9TWVNDRkdfRVhUSV9MSU5FMTQgXA0KLSAgKHVpbnQzMl90KSgoMHgwRjAwVSA8PCAxNlUpIHwgM1UpIC8qICE8IEVYVElfUE9TSVRJT05fOCAgfCBFWFRJQ1JbM10gKi8NCi0jZGVmaW5lIExMX1NZU0NGR19FWFRJX0xJTkUxNSBcDQotICAodWludDMyX3QpKCgweEYwMDBVIDw8IDE2VSkgfCAzVSkgLyogITwgRVhUSV9QT1NJVElPTl8xMiB8IEVYVElDUlszXSAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBTWVNURU1fTExfRUNfVElNQlJFQUsgU1lTQ0ZHIFRJTUVSIEJSRUFLDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1NZU0NGR19USU1CUkVBS19FQ0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgU1lTQ0ZHX0NGR1IyX0VDQ0wgLyohPCBFbmFibGVzIGFuZCBsb2NrcyB0aGUgRUNDIGVycm9yIHNpZ25hbCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggQnJlYWsgSW5wdXQgb2YgVElNMS84LzE1LzE2LzE3ICovDQotI2RlZmluZSBMTF9TWVNDRkdfVElNQlJFQUtfUFZEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBTWVNDRkdfQ0ZHUjJfUFZETCAvKiE8IEVuYWJsZXMgYW5kIGxvY2tzIHRoZSBQVkQgY29ubmVjdGlvbiAgICAgICAgICAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggVElNMS84LzE1LzE2LzE3IEJyZWFrIElucHV0ICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBhbHNvIHRoZSBQVkRFIGFuZCBQTFMgYml0cyBvZiB0aGUgUG93ZXIgQ29udHJvbCBcDQotICAgICAgICAgICAgICAgICAgICAgICBJbnRlcmZhY2UgKi8NCi0jZGVmaW5lIExMX1NZU0NGR19USU1CUkVBS19TUkFNX1BBUklUWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIFNZU0NGR19DRkdSMl9TUEwgLyohPCBFbmFibGVzIGFuZCBsb2NrcyB0aGUgU1JBTV9QQVJJVFkgZXJyb3Igc2lnbmFsIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICB3aXRoIEJyZWFrIElucHV0IG9mIFRJTTEvOC8xNS8xNi8xNyAqLw0KLSNkZWZpbmUgTExfU1lTQ0ZHX1RJTUJSRUFLX0xPQ0tVUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIFNZU0NGR19DRkdSMl9DTEwgLyohPCBFbmFibGVzIGFuZCBsb2NrcyB0aGUgTE9DS1VQIG91dHB1dCBvZiBDb3J0ZXhNNCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBCcmVhayBJbnB1dCBvZiBUSU0xLzE1LzE2LzE3ICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFNZU1RFTV9MTF9FQ19DQ01TUkFNV1JQIFNZU0NGRyBDQ01TUkFNIFdSUA0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9TWVNDRkdfQ0NNU1JBTVdSUF9QQUdFMCBcDQotICBTWVNDRkdfU1dQUl9QQUdFMCAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDAgICovDQotI2RlZmluZSBMTF9TWVNDRkdfQ0NNU1JBTVdSUF9QQUdFMSBcDQotICBTWVNDRkdfU1dQUl9QQUdFMSAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDEgICovDQotI2RlZmluZSBMTF9TWVNDRkdfQ0NNU1JBTVdSUF9QQUdFMiBcDQotICBTWVNDRkdfU1dQUl9QQUdFMiAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDIgICovDQotI2RlZmluZSBMTF9TWVNDRkdfQ0NNU1JBTVdSUF9QQUdFMyBcDQotICBTWVNDRkdfU1dQUl9QQUdFMyAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDMgICovDQotI2RlZmluZSBMTF9TWVNDRkdfQ0NNU1JBTVdSUF9QQUdFNCBcDQotICBTWVNDRkdfU1dQUl9QQUdFNCAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDQgICovDQotI2RlZmluZSBMTF9TWVNDRkdfQ0NNU1JBTVdSUF9QQUdFNSBcDQotICBTWVNDRkdfU1dQUl9QQUdFNSAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDUgICovDQotI2RlZmluZSBMTF9TWVNDRkdfQ0NNU1JBTVdSUF9QQUdFNiBcDQotICBTWVNDRkdfU1dQUl9QQUdFNiAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDYgICovDQotI2RlZmluZSBMTF9TWVNDRkdfQ0NNU1JBTVdSUF9QQUdFNyBcDQotICBTWVNDRkdfU1dQUl9QQUdFNyAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDcgICovDQotI2RlZmluZSBMTF9TWVNDRkdfQ0NNU1JBTVdSUF9QQUdFOCBcDQotICBTWVNDRkdfU1dQUl9QQUdFOCAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDggICovDQotI2RlZmluZSBMTF9TWVNDRkdfQ0NNU1JBTVdSUF9QQUdFOSBcDQotICBTWVNDRkdfU1dQUl9QQUdFOSAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDkgICovDQotI2lmIGRlZmluZWQoU1lTQ0ZHX1NXUFJfUEFHRTEwKQ0KLSNkZWZpbmUgTExfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTEwIFwNCi0gIFNZU0NGR19TV1BSX1BBR0UxMCAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDEwICovDQotI2RlZmluZSBMTF9TWVNDRkdfQ0NNU1JBTVdSUF9QQUdFMTEgXA0KLSAgU1lTQ0ZHX1NXUFJfUEFHRTExIC8qITwgQ0NNU1JBTSBXcml0ZSBwcm90ZWN0aW9uIHBhZ2UgMTEgKi8NCi0jZGVmaW5lIExMX1NZU0NGR19DQ01TUkFNV1JQX1BBR0UxMiBcDQotICBTWVNDRkdfU1dQUl9QQUdFMTIgLyohPCBDQ01TUkFNIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAxMiAqLw0KLSNkZWZpbmUgTExfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTEzIFwNCi0gIFNZU0NGR19TV1BSX1BBR0UxMyAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDEzICovDQotI2RlZmluZSBMTF9TWVNDRkdfQ0NNU1JBTVdSUF9QQUdFMTQgXA0KLSAgU1lTQ0ZHX1NXUFJfUEFHRTE0IC8qITwgQ0NNU1JBTSBXcml0ZSBwcm90ZWN0aW9uIHBhZ2UgMTQgKi8NCi0jZGVmaW5lIExMX1NZU0NGR19DQ01TUkFNV1JQX1BBR0UxNSBcDQotICBTWVNDRkdfU1dQUl9QQUdFMTUgLyohPCBDQ01TUkFNIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAxNSAqLw0KLSNkZWZpbmUgTExfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTE2IFwNCi0gIFNZU0NGR19TV1BSX1BBR0UxNiAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDE2ICovDQotI2RlZmluZSBMTF9TWVNDRkdfQ0NNU1JBTVdSUF9QQUdFMTcgXA0KLSAgU1lTQ0ZHX1NXUFJfUEFHRTE3IC8qITwgQ0NNU1JBTSBXcml0ZSBwcm90ZWN0aW9uIHBhZ2UgMTcgKi8NCi0jZGVmaW5lIExMX1NZU0NGR19DQ01TUkFNV1JQX1BBR0UxOCBcDQotICBTWVNDRkdfU1dQUl9QQUdFMTggLyohPCBDQ01TUkFNIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAxOCAqLw0KLSNkZWZpbmUgTExfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTE5IFwNCi0gIFNZU0NGR19TV1BSX1BBR0UxOSAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDE5ICovDQotI2RlZmluZSBMTF9TWVNDRkdfQ0NNU1JBTVdSUF9QQUdFMjAgXA0KLSAgU1lTQ0ZHX1NXUFJfUEFHRTIwIC8qITwgQ0NNU1JBTSBXcml0ZSBwcm90ZWN0aW9uIHBhZ2UgMjAgKi8NCi0jZGVmaW5lIExMX1NZU0NGR19DQ01TUkFNV1JQX1BBR0UyMSBcDQotICBTWVNDRkdfU1dQUl9QQUdFMjEgLyohPCBDQ01TUkFNIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAyMSAqLw0KLSNkZWZpbmUgTExfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTIyIFwNCi0gIFNZU0NGR19TV1BSX1BBR0UyMiAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDIyICovDQotI2RlZmluZSBMTF9TWVNDRkdfQ0NNU1JBTVdSUF9QQUdFMjMgXA0KLSAgU1lTQ0ZHX1NXUFJfUEFHRTIzIC8qITwgQ0NNU1JBTSBXcml0ZSBwcm90ZWN0aW9uIHBhZ2UgMjMgKi8NCi0jZGVmaW5lIExMX1NZU0NGR19DQ01TUkFNV1JQX1BBR0UyNCBcDQotICBTWVNDRkdfU1dQUl9QQUdFMjQgLyohPCBDQ01TUkFNIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAyNCAqLw0KLSNkZWZpbmUgTExfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTI1IFwNCi0gIFNZU0NGR19TV1BSX1BBR0UyNSAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDI1ICovDQotI2RlZmluZSBMTF9TWVNDRkdfQ0NNU1JBTVdSUF9QQUdFMjYgXA0KLSAgU1lTQ0ZHX1NXUFJfUEFHRTI2IC8qITwgQ0NNU1JBTSBXcml0ZSBwcm90ZWN0aW9uIHBhZ2UgMjYgKi8NCi0jZGVmaW5lIExMX1NZU0NGR19DQ01TUkFNV1JQX1BBR0UyNyBcDQotICBTWVNDRkdfU1dQUl9QQUdFMjcgLyohPCBDQ01TUkFNIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAyNyAqLw0KLSNkZWZpbmUgTExfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTI4IFwNCi0gIFNZU0NGR19TV1BSX1BBR0UyOCAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDI4ICovDQotI2RlZmluZSBMTF9TWVNDRkdfQ0NNU1JBTVdSUF9QQUdFMjkgXA0KLSAgU1lTQ0ZHX1NXUFJfUEFHRTI5IC8qITwgQ0NNU1JBTSBXcml0ZSBwcm90ZWN0aW9uIHBhZ2UgMjkgKi8NCi0jZGVmaW5lIExMX1NZU0NGR19DQ01TUkFNV1JQX1BBR0UzMCBcDQotICBTWVNDRkdfU1dQUl9QQUdFMzAgLyohPCBDQ01TUkFNIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAzMCAqLw0KLSNkZWZpbmUgTExfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTMxIFwNCi0gIFNZU0NGR19TV1BSX1BBR0UzMSAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDMxICovDQotI2VuZGlmICAgICAgICAgICAgICAgLyogU1lTQ0ZHX1NXUFJfUEFHRTEwICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFNZU1RFTV9MTF9FQ19UUkFDRSBEQkdNQ1UgVFJBQ0UgUGluIEFzc2lnbm1lbnQNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfREJHTUNVX1RSQUNFX05PTkUgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBUUkFDRSBwaW5zIG5vdCBhc3NpZ25lZCAoZGVmYXVsdCBzdGF0ZSkgKi8NCi0jZGVmaW5lIExMX0RCR01DVV9UUkFDRV9BU1lOQ0ggXA0KLSAgREJHTUNVX0NSX1RSQUNFX0lPRU4gLyohPCBUUkFDRSBwaW4gYXNzaWdubWVudCBmb3IgQXN5bmNocm9ub3VzIE1vZGUgKi8NCi0jZGVmaW5lIExMX0RCR01DVV9UUkFDRV9TWU5DSF9TSVpFMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKERCR01DVV9DUl9UUkFDRV9JT0VOIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgREJHTUNVX0NSX1RSQUNFX01PREVfMCkgLyohPCBUUkFDRSBwaW4gYXNzaWdubWVudCBmb3IgU3luY2hyb25vdXMgTW9kZSB3aXRoIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIFRSQUNFREFUQSBzaXplIG9mIDEgKi8NCi0jZGVmaW5lIExMX0RCR01DVV9UUkFDRV9TWU5DSF9TSVpFMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKERCR01DVV9DUl9UUkFDRV9JT0VOIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgREJHTUNVX0NSX1RSQUNFX01PREVfMSkgLyohPCBUUkFDRSBwaW4gYXNzaWdubWVudCBmb3IgU3luY2hyb25vdXMgTW9kZSB3aXRoIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIFRSQUNFREFUQSBzaXplIG9mIDIgKi8NCi0jZGVmaW5lIExMX0RCR01DVV9UUkFDRV9TWU5DSF9TSVpFNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKERCR01DVV9DUl9UUkFDRV9JT0VOIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgREJHTUNVX0NSX1RSQUNFX01PREUpIC8qITwgVFJBQ0UgcGluIGFzc2lnbm1lbnQgZm9yIFN5bmNocm9ub3VzIE1vZGUgd2l0aCBhIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VEQVRBIHNpemUgb2YgNCAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBTWVNURU1fTExfRUNfQVBCMV9HUlAxX1NUT1BfSVAgREJHTUNVIEFQQjEgR1JQMSBTVE9QIElQDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX0RCR01DVV9BUEIxX0dSUDFfVElNMl9TVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgREJHTUNVX0FQQjFGWlIxX0RCR19USU0yX1NUT1AgLyohPCBUaGUgY291bnRlciBjbG9jayBvZiBUSU0yIGlzIHN0b3BwZWQgd2hlbiBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29yZSBpcyBoYWx0ZWQqLw0KLSNpZiBkZWZpbmVkKFRJTTMpDQotI2RlZmluZSBMTF9EQkdNQ1VfQVBCMV9HUlAxX1RJTTNfU1RPUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIERCR01DVV9BUEIxRlpSMV9EQkdfVElNM19TVE9QIC8qITwgVGhlIGNvdW50ZXIgY2xvY2sgb2YgVElNMyBpcyBzdG9wcGVkIHdoZW4gXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvcmUgaXMgaGFsdGVkKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRJTTMgKi8NCi0jaWYgZGVmaW5lZChUSU00KQ0KLSNkZWZpbmUgTExfREJHTUNVX0FQQjFfR1JQMV9USU00X1NUT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBEQkdNQ1VfQVBCMUZaUjFfREJHX1RJTTRfU1RPUCAvKiE8IFRoZSBjb3VudGVyIGNsb2NrIG9mIFRJTTQgaXMgc3RvcHBlZCB3aGVuIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb3JlIGlzIGhhbHRlZCovDQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUSU00ICovDQotI2lmIGRlZmluZWQoVElNNSkNCi0jZGVmaW5lIExMX0RCR01DVV9BUEIxX0dSUDFfVElNNV9TVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgREJHTUNVX0FQQjFGWlIxX0RCR19USU01X1NUT1AgLyohPCBUaGUgY291bnRlciBjbG9jayBvZiBUSU01IGlzIHN0b3BwZWQgd2hlbiBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29yZSBpcyBoYWx0ZWQqLw0KLSNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVElNNSAqLw0KLSNkZWZpbmUgTExfREJHTUNVX0FQQjFfR1JQMV9USU02X1NUT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBEQkdNQ1VfQVBCMUZaUjFfREJHX1RJTTZfU1RPUCAvKiE8IFRoZSBjb3VudGVyIGNsb2NrIG9mIFRJTTYgaXMgc3RvcHBlZCB3aGVuIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb3JlIGlzIGhhbHRlZCovDQotI2lmIGRlZmluZWQoVElNNykNCi0jZGVmaW5lIExMX0RCR01DVV9BUEIxX0dSUDFfVElNN19TVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgREJHTUNVX0FQQjFGWlIxX0RCR19USU03X1NUT1AgLyohPCBUaGUgY291bnRlciBjbG9jayBvZiBUSU03IGlzIHN0b3BwZWQgd2hlbiBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29yZSBpcyBoYWx0ZWQqLw0KLSNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVElNNyAqLw0KLSNkZWZpbmUgTExfREJHTUNVX0FQQjFfR1JQMV9SVENfU1RPUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBEQkdNQ1VfQVBCMUZaUjFfREJHX1JUQ19TVE9QIC8qITwgVGhlIGNsb2NrIG9mIHRoZSBSVEMgY291bnRlciBpcyBzdG9wcGVkIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiB0aGUgY29yZSBpcyBoYWx0ZWQqLw0KLSNkZWZpbmUgTExfREJHTUNVX0FQQjFfR1JQMV9XV0RHX1NUT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgREJHTUNVX0FQQjFGWlIxX0RCR19XV0RHX1NUT1AgLyohPCBUaGUgd2luZG93IHdhdGNoZG9nIGNvdW50ZXIgY2xvY2sgaXMgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcHBlZCB3aGVuIHRoZSBjb3JlIGlzIGhhbHRlZCovDQotI2RlZmluZSBMTF9EQkdNQ1VfQVBCMV9HUlAxX0lXREdfU1RPUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIERCR01DVV9BUEIxRlpSMV9EQkdfSVdER19TVE9QIC8qITwgVGhlIGluZGVwZW5kZW50IHdhdGNoZG9nIGNvdW50ZXIgY2xvY2sgaXMgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcHBlZCB3aGVuIHRoZSBjb3JlIGlzIGhhbHRlZCovDQotI2RlZmluZSBMTF9EQkdNQ1VfQVBCMV9HUlAxX0kyQzFfU1RPUCBcDQotICBEQkdNQ1VfQVBCMUZaUjFfREJHX0kyQzFfU1RPUCAvKiE8IFRoZSBJMkMxIFNNQnVzIHRpbWVvdXQgaXMgZnJvemVuKi8NCi0jaWYgZGVmaW5lZChJMkMyKQ0KLSNkZWZpbmUgTExfREJHTUNVX0FQQjFfR1JQMV9JMkMyX1NUT1AgXA0KLSAgREJHTUNVX0FQQjFGWlIxX0RCR19JMkMyX1NUT1AgLyohPCBUaGUgSTJDMiBTTUJ1cyB0aW1lb3V0IGlzIGZyb3plbiovDQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJMkMyICovDQotI2RlZmluZSBMTF9EQkdNQ1VfQVBCMV9HUlAxX0kyQzNfU1RPUCBcDQotICBEQkdNQ1VfQVBCMUZaUjFfREJHX0kyQzNfU1RPUCAvKiE8IFRoZSBJMkMzIFNNQnVzIHRpbWVvdXQgaXMgZnJvemVuKi8NCi0jZGVmaW5lIExMX0RCR01DVV9BUEIxX0dSUDFfTFBUSU0xX1NUT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBEQkdNQ1VfQVBCMUZaUjFfREJHX0xQVElNMV9TVE9QIC8qITwgVGhlIGNvdW50ZXIgY2xvY2sgb2YgTFBUSU0xIGlzIHN0b3BwZWQgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIHRoZSBjb3JlIGlzIGhhbHRlZCovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFNZU1RFTV9MTF9FQ19BUEIxX0dSUDJfU1RPUF9JUCBEQkdNQ1UgQVBCMSBHUlAyIFNUT1AgSVANCi0gKiBAew0KLSAqLw0KLSNpZiBkZWZpbmVkKEkyQzQpDQotI2RlZmluZSBMTF9EQkdNQ1VfQVBCMV9HUlAyX0kyQzRfU1RPUCBcDQotICBEQkdNQ1VfQVBCMUZaUjJfREJHX0kyQzRfU1RPUCAvKiE8IFRoZSBJMkM0IFNNQnVzIHRpbWVvdXQgaXMgZnJvemVuKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEkyQzQgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgU1lTVEVNX0xMX0VDX0FQQjJfR1JQMV9TVE9QX0lQIERCR01DVSBBUEIyIEdSUDEgU1RPUCBJUA0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9EQkdNQ1VfQVBCMl9HUlAxX1RJTTFfU1RPUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBEQkdNQ1VfQVBCMkZaX0RCR19USU0xX1NUT1AgLyohPCBUaGUgY291bnRlciBjbG9jayBvZiBUSU0xIGlzIHN0b3BwZWQgd2hlbiBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvcmUgaXMgaGFsdGVkKi8NCi0jaWYgZGVmaW5lZChUSU04KQ0KLSNkZWZpbmUgTExfREJHTUNVX0FQQjJfR1JQMV9USU04X1NUT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgREJHTUNVX0FQQjJGWl9EQkdfVElNOF9TVE9QIC8qITwgVGhlIGNvdW50ZXIgY2xvY2sgb2YgVElNOCBpcyBzdG9wcGVkIHdoZW4gXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb3JlIGlzIGhhbHRlZCovDQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgLyogVElNOCAqLw0KLSNkZWZpbmUgTExfREJHTUNVX0FQQjJfR1JQMV9USU0xNV9TVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBEQkdNQ1VfQVBCMkZaX0RCR19USU0xNV9TVE9QIC8qITwgVGhlIGNvdW50ZXIgY2xvY2sgb2YgVElNMTUgaXMgc3RvcHBlZCB3aGVuIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvcmUgaXMgaGFsdGVkKi8NCi0jZGVmaW5lIExMX0RCR01DVV9BUEIyX0dSUDFfVElNMTZfU1RPUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgREJHTUNVX0FQQjJGWl9EQkdfVElNMTZfU1RPUCAvKiE8IFRoZSBjb3VudGVyIGNsb2NrIG9mIFRJTTE2IGlzIHN0b3BwZWQgd2hlbiBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb3JlIGlzIGhhbHRlZCovDQotI2lmIGRlZmluZWQoVElNMTcpDQotI2RlZmluZSBMTF9EQkdNQ1VfQVBCMl9HUlAxX1RJTTE3X1NUT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIERCR01DVV9BUEIyRlpfREJHX1RJTTE3X1NUT1AgLyohPCBUaGUgY291bnRlciBjbG9jayBvZiBUSU0xNyBpcyBzdG9wcGVkIHdoZW4gXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29yZSBpcyBoYWx0ZWQqLw0KLSNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUSU0xNyAqLw0KLSNpZiBkZWZpbmVkKFRJTTIwKQ0KLSNkZWZpbmUgTExfREJHTUNVX0FQQjJfR1JQMV9USU0yMF9TVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBEQkdNQ1VfQVBCMkZaX0RCR19USU0yMF9TVE9QIC8qITwgVGhlIGNvdW50ZXIgY2xvY2sgb2YgVElNMjAgaXMgc3RvcHBlZCB3aGVuIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvcmUgaXMgaGFsdGVkKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgLyogVElNMjAgKi8NCi0jaWYgZGVmaW5lZChIUlRJTTEpDQotI2RlZmluZSBMTF9EQkdNQ1VfQVBCMl9HUlAxX0hSVElNMV9TVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIERCR01DVV9BUEIyRlpfREJHX0hSVElNMV9TVE9QIC8qITwgVGhlIGNvdW50ZXIgY2xvY2sgb2YgSFJUSU0xIGlzIHN0b3BwZWQgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiB0aGUgY29yZSBpcyBoYWx0ZWQqLw0KLSNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSFJUSU0xICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0jaWYgZGVmaW5lZChWUkVGQlVGKQ0KLS8qKiBAZGVmZ3JvdXAgU1lTVEVNX0xMX0VDX1ZPTFRBR0UgVlJFRkJVRiBWT0xUQUdFDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1ZSRUZCVUZfVk9MVEFHRV9TQ0FMRTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKCh1aW50MzJfdCkweDAwMDAwMDAwKSAvKiE8IFZvbHRhZ2UgcmVmZXJlbmNlIHNjYWxlIDAgKFZSRUZCVUZfT1VUID0gMi4wNDhWKSBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfVlJFRkJVRl9WT0xUQUdFX1NDQUxFMSBcDQotICBWUkVGQlVGX0NTUl9WUlNfMCAvKiE8IFZvbHRhZ2UgcmVmZXJlbmNlIHNjYWxlIDEgKFZSRUZCVUZfT1VUID0gMi41VikgICAqLw0KLSNkZWZpbmUgTExfVlJFRkJVRl9WT0xUQUdFX1NDQUxFMiBcDQotICBWUkVGQlVGX0NTUl9WUlNfMSAvKiE8IFZvbHRhZ2UgcmVmZXJlbmNlIHNjYWxlIDIgKFZSRUZCVUZfT1VUID0gMi45VikgICAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotI2VuZGlmIC8qIFZSRUZCVUYgKi8NCi0NCi0vKiogQGRlZmdyb3VwIFNZU1RFTV9MTF9FQ19MQVRFTkNZIEZMQVNIIExBVEVOQ1kNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfRkxBU0hfTEFURU5DWV8wIEZMQVNIX0FDUl9MQVRFTkNZXzBXUyAvKiE8IEZMQVNIIFplcm8gd2FpdCBzdGF0ZSAqLw0KLSNkZWZpbmUgTExfRkxBU0hfTEFURU5DWV8xIEZMQVNIX0FDUl9MQVRFTkNZXzFXUyAvKiE8IEZMQVNIIE9uZSB3YWl0IHN0YXRlICovDQotI2RlZmluZSBMTF9GTEFTSF9MQVRFTkNZXzIgRkxBU0hfQUNSX0xBVEVOQ1lfMldTIC8qITwgRkxBU0ggVHdvIHdhaXQgc3RhdGVzICovDQotI2RlZmluZSBMTF9GTEFTSF9MQVRFTkNZXzMgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBGTEFTSF9BQ1JfTEFURU5DWV8zV1MgLyohPCBGTEFTSCBUaHJlZSB3YWl0IHN0YXRlcyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9GTEFTSF9MQVRFTkNZXzQgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIEZMQVNIX0FDUl9MQVRFTkNZXzRXUyAvKiE8IEZMQVNIIEZvdXIgd2FpdCBzdGF0ZXMgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNpZiBkZWZpbmVkKEZMQVNIX0FDUl9MQVRFTkNZXzVXUykNCi0jZGVmaW5lIExMX0ZMQVNIX0xBVEVOQ1lfNSBGTEFTSF9BQ1JfTEFURU5DWV81V1MgLyohPCBGTEFTSCBmaXZlIHdhaXQgc3RhdGUgKi8NCi0jZGVmaW5lIExMX0ZMQVNIX0xBVEVOQ1lfNiBGTEFTSF9BQ1JfTEFURU5DWV82V1MgLyohPCBGTEFTSCBzaXggd2FpdCBzdGF0ZSAqLw0KLSNkZWZpbmUgTExfRkxBU0hfTEFURU5DWV83ICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgRkxBU0hfQUNSX0xBVEVOQ1lfN1dTIC8qITwgRkxBU0ggc2V2ZW4gd2FpdCBzdGF0ZXMgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfRkxBU0hfTEFURU5DWV84ICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgRkxBU0hfQUNSX0xBVEVOQ1lfOFdTIC8qITwgRkxBU0ggZWlnaHQgd2FpdCBzdGF0ZXMgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfRkxBU0hfTEFURU5DWV85ICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBGTEFTSF9BQ1JfTEFURU5DWV85V1MgLyohPCBGTEFTSCBuaW5lIHdhaXQgc3RhdGVzIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX0ZMQVNIX0xBVEVOQ1lfMTAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgRkxBU0hfQUNSX0xBVEVOQ1lfMTBXUyAvKiE8IEZMQVNIIHRlbiB3YWl0IHN0YXRlcyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfRkxBU0hfTEFURU5DWV8xMSBcDQotICBGTEFTSF9BQ1JfTEFURU5DWV8xMVdTIC8qITwgRkxBU0ggZWxldmVuIHdhaXQgc3RhdGVzICovDQotI2RlZmluZSBMTF9GTEFTSF9MQVRFTkNZXzEyIFwNCi0gIEZMQVNIX0FDUl9MQVRFTkNZXzEyV1MgLyohPCBGTEFTSCB0d2VsdmUgd2FpdCBzdGF0ZXMgKi8NCi0jZGVmaW5lIExMX0ZMQVNIX0xBVEVOQ1lfMTMgXA0KLSAgRkxBU0hfQUNSX0xBVEVOQ1lfMTNXUyAvKiE8IEZMQVNIIHRoaXJ0ZWVuIHdhaXQgc3RhdGVzICovDQotI2RlZmluZSBMTF9GTEFTSF9MQVRFTkNZXzE0IFwNCi0gIEZMQVNIX0FDUl9MQVRFTkNZXzE0V1MgLyohPCBGTEFTSCBmb3VydGVlbiB3YWl0IHN0YXRlcyAqLw0KLSNkZWZpbmUgTExfRkxBU0hfTEFURU5DWV8xNSBcDQotICBGTEFTSF9BQ1JfTEFURU5DWV8xNVdTIC8qITwgRkxBU0ggZmlmdGVlbiB3YWl0IHN0YXRlcyAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgICAgICAvKiBGTEFTSF9BQ1JfTEFURU5DWV81V1MgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0NCi0vKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgU1lTVEVNX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucyBTWVNURU0gRXhwb3J0ZWQgRnVuY3Rpb25zDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFNZU1RFTV9MTF9FRl9TWVNDRkcgU1lTQ0ZHDQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCBtZW1vcnkgbWFwcGluZyBhdCBhZGRyZXNzIDB4MDAwMDAwMDANCi0gKiBAcm10b2xsIFNZU0NGR19NRU1STVAgTUVNX01PREUgICAgICBMTF9TWVNDRkdfU2V0UmVtYXBNZW1vcnkNCi0gKiBAcGFyYW0gIE1lbW9yeSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19SRU1BUF9GTEFTSA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19SRU1BUF9TWVNURU1GTEFTSA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19SRU1BUF9TUkFNDQotICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1JFTUFQX0ZNQyAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfUkVNQVBfUVVBRFNQSSAoKikNCi0gKg0KLSAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTQ0ZHX1NldFJlbWFwTWVtb3J5KHVpbnQzMl90IE1lbW9yeSkgew0KLSAgTU9ESUZZX1JFRyhTWVNDRkctPk1FTVJNUCwgU1lTQ0ZHX01FTVJNUF9NRU1fTU9ERSwgTWVtb3J5KTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgbWVtb3J5IG1hcHBpbmcgYXQgYWRkcmVzcyAweDAwMDAwMDAwDQotICogQHJtdG9sbCBTWVNDRkdfTUVNUk1QIE1FTV9NT0RFICAgICAgTExfU1lTQ0ZHX0dldFJlbWFwTWVtb3J5DQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19SRU1BUF9GTEFTSA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19SRU1BUF9TWVNURU1GTEFTSA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19SRU1BUF9TUkFNDQotICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1JFTUFQX0ZNQyAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfUkVNQVBfUVVBRFNQSSAoKikNCi0gKg0KLSAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU0NGR19HZXRSZW1hcE1lbW9yeSh2b2lkKSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTWVNDRkctPk1FTVJNUCwgU1lTQ0ZHX01FTVJNUF9NRU1fTU9ERSkpOw0KLX0NCi0NCi0jaWYgZGVmaW5lZChTWVNDRkdfTUVNUk1QX0ZCX01PREUpDQotLyoqDQotICogQGJyaWVmICBTZWxlY3QgRmxhc2ggYmFuayBtb2RlIChCYW5rIGZsYXNoZWQgYXQgMHgwODAwMDAwMCkNCi0gKiBAcm10b2xsIFNZU0NGR19NRU1STVAgRkJfTU9ERSAgICAgICBMTF9TWVNDRkdfU2V0Rmxhc2hCYW5rTW9kZQ0KLSAqIEBwYXJhbSAgQmFuayBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19CQU5LTU9ERV9CQU5LMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19CQU5LTU9ERV9CQU5LMg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU0NGR19TZXRGbGFzaEJhbmtNb2RlKHVpbnQzMl90IEJhbmspIHsNCi0gIE1PRElGWV9SRUcoU1lTQ0ZHLT5NRU1STVAsIFNZU0NGR19NRU1STVBfRkJfTU9ERSwgQmFuayk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IEZsYXNoIGJhbmsgbW9kZSAoQmFuayBmbGFzaGVkIGF0IDB4MDgwMDAwMDApDQotICogQHJtdG9sbCBTWVNDRkdfTUVNUk1QIEZCX01PREUgICAgICAgTExfU1lTQ0ZHX0dldEZsYXNoQmFua01vZGUNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0JBTktNT0RFX0JBTksxDQotICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0JBTktNT0RFX0JBTksyDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU0NGR19HZXRGbGFzaEJhbmtNb2RlKHZvaWQpIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFNZU0NGRy0+TUVNUk1QLCBTWVNDRkdfTUVNUk1QX0ZCX01PREUpKTsNCi19DQotI2VuZGlmIC8qIFNZU0NGR19NRU1STVBfRkJfTU9ERSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIEkvTyBhbmFsb2cgc3dpdGNoIHZvbHRhZ2UgYm9vc3Rlci4NCi0gKiBAbm90ZSAgIFdoZW4gdm9sdGFnZSBib29zdGVyIGlzIGVuYWJsZWQsIEkvTyBhbmFsb2cgc3dpdGNoZXMgYXJlIHN1cHBsaWVkDQotICogICAgICAgICBieSBhIGRlZGljYXRlZCB2b2x0YWdlIGJvb3N0ZXIsIGZyb20gVkREIHBvd2VyIGRvbWFpbi4gVGhpcyBpcw0KLSAqICAgICAgICAgdGhlIHJlY29tbWVuZGVkIGNvbmZpZ3VyYXRpb24gd2l0aCBsb3cgVkREQSB2b2x0YWdlIG9wZXJhdGlvbi4NCi0gKiBAbm90ZSAgIFRoZSBJL08gYW5hbG9nIHN3aXRjaCB2b2x0YWdlIGJvb3N0ZXIgaXMgcmVsZXZhbnQgZm9yIHBlcmlwaGVyYWxzDQotICogICAgICAgICB1c2luZyBJL08gaW4gYW5hbG9nIGlucHV0OiBBREMsIENPTVAsIE9QQU1QLg0KLSAqICAgICAgICAgSG93ZXZlciwgQ09NUCBhbmQgT1BBTVAgaW5wdXRzIGhhdmUgYSBoaWdoIGltcGVkYW5jZSBhbmQNCi0gKiAgICAgICAgIHZvbHRhZ2UgYm9vc3RlciBkbyBub3QgaW1wYWN0IHBlcmZvcm1hbmNlIHNpZ25pZmljYW50bHkuDQotICogICAgICAgICBUaGVyZWZvcmUsIHRoZSB2b2x0YWdlIGJvb3N0ZXIgaXMgbWFpbmx5IGludGVuZGVkIGZvcg0KLSAqICAgICAgICAgdXNhZ2Ugd2l0aCBBREMuDQotICogQHJtdG9sbCBTWVNDRkdfQ0ZHUjEgQk9PU1RFTiAgICAgICBMTF9TWVNDRkdfRW5hYmxlQW5hbG9nQm9vc3Rlcg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU0NGR19FbmFibGVBbmFsb2dCb29zdGVyKHZvaWQpIHsNCi0gIFNFVF9CSVQoU1lTQ0ZHLT5DRkdSMSwgU1lTQ0ZHX0NGR1IxX0JPT1NURU4pOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgSS9PIGFuYWxvZyBzd2l0Y2ggdm9sdGFnZSBib29zdGVyLg0KLSAqIEBub3RlICAgV2hlbiB2b2x0YWdlIGJvb3N0ZXIgaXMgZW5hYmxlZCwgSS9PIGFuYWxvZyBzd2l0Y2hlcyBhcmUgc3VwcGxpZWQNCi0gKiAgICAgICAgIGJ5IGEgZGVkaWNhdGVkIHZvbHRhZ2UgYm9vc3RlciwgZnJvbSBWREQgcG93ZXIgZG9tYWluLiBUaGlzIGlzDQotICogICAgICAgICB0aGUgcmVjb21tZW5kZWQgY29uZmlndXJhdGlvbiB3aXRoIGxvdyBWRERBIHZvbHRhZ2Ugb3BlcmF0aW9uLg0KLSAqIEBub3RlICAgVGhlIEkvTyBhbmFsb2cgc3dpdGNoIHZvbHRhZ2UgYm9vc3RlciBpcyByZWxldmFudCBmb3IgcGVyaXBoZXJhbHMNCi0gKiAgICAgICAgIHVzaW5nIEkvTyBpbiBhbmFsb2cgaW5wdXQ6IEFEQywgQ09NUCwgT1BBTVAuDQotICogICAgICAgICBIb3dldmVyLCBDT01QIGFuZCBPUEFNUCBpbnB1dHMgaGF2ZSBhIGhpZ2ggaW1wZWRhbmNlIGFuZA0KLSAqICAgICAgICAgdm9sdGFnZSBib29zdGVyIGRvIG5vdCBpbXBhY3QgcGVyZm9ybWFuY2Ugc2lnbmlmaWNhbnRseS4NCi0gKiAgICAgICAgIFRoZXJlZm9yZSwgdGhlIHZvbHRhZ2UgYm9vc3RlciBpcyBtYWlubHkgaW50ZW5kZWQgZm9yDQotICogICAgICAgICB1c2FnZSB3aXRoIEFEQy4NCi0gKiBAcm10b2xsIFNZU0NGR19DRkdSMSBCT09TVEVOICAgICAgIExMX1NZU0NGR19EaXNhYmxlQW5hbG9nQm9vc3Rlcg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU0NGR19EaXNhYmxlQW5hbG9nQm9vc3Rlcih2b2lkKSB7DQotICBDTEVBUl9CSVQoU1lTQ0ZHLT5DRkdSMSwgU1lTQ0ZHX0NGR1IxX0JPT1NURU4pOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSB0aGUgSTJDIGZhc3QgbW9kZSBwbHVzIGRyaXZpbmcgY2FwYWJpbGl0eS4NCi0gKiBAcm10b2xsIFNZU0NGR19DRkdSMSBJMkNfUEJ4X0ZNUCAgIExMX1NZU0NGR19FbmFibGVGYXN0TW9kZVBsdXNcbg0KLSAqICAgICAgICAgU1lTQ0ZHX0NGR1IxIEkyQ3hfRk1QICAgICAgTExfU1lTQ0ZHX0VuYWJsZUZhc3RNb2RlUGx1cw0KLSAqIEBwYXJhbSAgQ29uZmlnRmFzdE1vZGVQbHVzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZQ0KLSAqIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0kyQ19GQVNUTU9ERVBMVVNfUEI2DQotICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0kyQ19GQVNUTU9ERVBMVVNfUEI3DQotICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0kyQ19GQVNUTU9ERVBMVVNfUEI4ICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19JMkNfRkFTVE1PREVQTFVTX1BCOSAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19JMkMxDQotICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0kyQ19GQVNUTU9ERVBMVVNfSTJDMiAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19JMkMzDQotICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0kyQ19GQVNUTU9ERVBMVVNfSTJDNCAoKikNCi0gKg0KLSAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTQ0ZHX0VuYWJsZUZhc3RNb2RlUGx1cyh1aW50MzJfdCBDb25maWdGYXN0TW9kZVBsdXMpIHsNCi0gIFNFVF9CSVQoU1lTQ0ZHLT5DRkdSMSwgQ29uZmlnRmFzdE1vZGVQbHVzKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIHRoZSBJMkMgZmFzdCBtb2RlIHBsdXMgZHJpdmluZyBjYXBhYmlsaXR5Lg0KLSAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IxIEkyQ19QQnhfRk1QICAgTExfU1lTQ0ZHX0Rpc2FibGVGYXN0TW9kZVBsdXNcbg0KLSAqICAgICAgICAgU1lTQ0ZHX0NGR1IxIEkyQ3hfRk1QICAgICAgTExfU1lTQ0ZHX0Rpc2FibGVGYXN0TW9kZVBsdXMNCi0gKiBAcGFyYW0gIENvbmZpZ0Zhc3RNb2RlUGx1cyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUNCi0gKiBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19JMkNfRkFTVE1PREVQTFVTX1BCNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19JMkNfRkFTVE1PREVQTFVTX1BCNw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19JMkNfRkFTVE1PREVQTFVTX1BCOCAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19QQjkgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0kyQ19GQVNUTU9ERVBMVVNfSTJDMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19JMkNfRkFTVE1PREVQTFVTX0kyQzIgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0kyQ19GQVNUTU9ERVBMVVNfSTJDMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19JMkNfRkFTVE1PREVQTFVTX0kyQzQgKCopDQotICoNCi0gKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcw0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU0NGR19EaXNhYmxlRmFzdE1vZGVQbHVzKA0KLSAgICB1aW50MzJfdCBDb25maWdGYXN0TW9kZVBsdXMpIHsNCi0gIENMRUFSX0JJVChTWVNDRkctPkNGR1IxLCBDb25maWdGYXN0TW9kZVBsdXMpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSBGbG9hdGluZyBQb2ludCBVbml0IEludmFsaWQgb3BlcmF0aW9uIEludGVycnVwdA0KLSAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IxIEZQVV9JRV8wICAgICAgTExfU1lTQ0ZHX0VuYWJsZUlUX0ZQVV9JT0MNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TWVNDRkdfRW5hYmxlSVRfRlBVX0lPQyh2b2lkKSB7DQotICBTRVRfQklUKFNZU0NGRy0+Q0ZHUjEsIFNZU0NGR19DRkdSMV9GUFVfSUVfMCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIEZsb2F0aW5nIFBvaW50IFVuaXQgRGl2aWRlLWJ5LXplcm8gSW50ZXJydXB0DQotICogQHJtdG9sbCBTWVNDRkdfQ0ZHUjEgRlBVX0lFXzEgICAgICBMTF9TWVNDRkdfRW5hYmxlSVRfRlBVX0RaQw0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU0NGR19FbmFibGVJVF9GUFVfRFpDKHZvaWQpIHsNCi0gIFNFVF9CSVQoU1lTQ0ZHLT5DRkdSMSwgU1lTQ0ZHX0NGR1IxX0ZQVV9JRV8xKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgRmxvYXRpbmcgUG9pbnQgVW5pdCBVbmRlcmZsb3cgSW50ZXJydXB0DQotICogQHJtdG9sbCBTWVNDRkdfQ0ZHUjEgRlBVX0lFXzIgICAgICBMTF9TWVNDRkdfRW5hYmxlSVRfRlBVX1VGQw0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU0NGR19FbmFibGVJVF9GUFVfVUZDKHZvaWQpIHsNCi0gIFNFVF9CSVQoU1lTQ0ZHLT5DRkdSMSwgU1lTQ0ZHX0NGR1IxX0ZQVV9JRV8yKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgRmxvYXRpbmcgUG9pbnQgVW5pdCBPdmVyZmxvdyBJbnRlcnJ1cHQNCi0gKiBAcm10b2xsIFNZU0NGR19DRkdSMSBGUFVfSUVfMyAgICAgIExMX1NZU0NGR19FbmFibGVJVF9GUFVfT0ZDDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTQ0ZHX0VuYWJsZUlUX0ZQVV9PRkModm9pZCkgew0KLSAgU0VUX0JJVChTWVNDRkctPkNGR1IxLCBTWVNDRkdfQ0ZHUjFfRlBVX0lFXzMpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSBGbG9hdGluZyBQb2ludCBVbml0IElucHV0IGRlbm9ybWFsIEludGVycnVwdA0KLSAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IxIEZQVV9JRV80ICAgICAgTExfU1lTQ0ZHX0VuYWJsZUlUX0ZQVV9JREMNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TWVNDRkdfRW5hYmxlSVRfRlBVX0lEQyh2b2lkKSB7DQotICBTRVRfQklUKFNZU0NGRy0+Q0ZHUjEsIFNZU0NGR19DRkdSMV9GUFVfSUVfNCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIEZsb2F0aW5nIFBvaW50IFVuaXQgSW5leGFjdCBJbnRlcnJ1cHQNCi0gKiBAcm10b2xsIFNZU0NGR19DRkdSMSBGUFVfSUVfNSAgICAgIExMX1NZU0NGR19FbmFibGVJVF9GUFVfSVhDDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTQ0ZHX0VuYWJsZUlUX0ZQVV9JWEModm9pZCkgew0KLSAgU0VUX0JJVChTWVNDRkctPkNGR1IxLCBTWVNDRkdfQ0ZHUjFfRlBVX0lFXzUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgRmxvYXRpbmcgUG9pbnQgVW5pdCBJbnZhbGlkIG9wZXJhdGlvbiBJbnRlcnJ1cHQNCi0gKiBAcm10b2xsIFNZU0NGR19DRkdSMSBGUFVfSUVfMCAgICAgIExMX1NZU0NGR19EaXNhYmxlSVRfRlBVX0lPQw0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU0NGR19EaXNhYmxlSVRfRlBVX0lPQyh2b2lkKSB7DQotICBDTEVBUl9CSVQoU1lTQ0ZHLT5DRkdSMSwgU1lTQ0ZHX0NGR1IxX0ZQVV9JRV8wKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIEZsb2F0aW5nIFBvaW50IFVuaXQgRGl2aWRlLWJ5LXplcm8gSW50ZXJydXB0DQotICogQHJtdG9sbCBTWVNDRkdfQ0ZHUjEgRlBVX0lFXzEgICAgICBMTF9TWVNDRkdfRGlzYWJsZUlUX0ZQVV9EWkMNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TWVNDRkdfRGlzYWJsZUlUX0ZQVV9EWkModm9pZCkgew0KLSAgQ0xFQVJfQklUKFNZU0NGRy0+Q0ZHUjEsIFNZU0NGR19DRkdSMV9GUFVfSUVfMSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBGbG9hdGluZyBQb2ludCBVbml0IFVuZGVyZmxvdyBJbnRlcnJ1cHQNCi0gKiBAcm10b2xsIFNZU0NGR19DRkdSMSBGUFVfSUVfMiAgICAgIExMX1NZU0NGR19EaXNhYmxlSVRfRlBVX1VGQw0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU0NGR19EaXNhYmxlSVRfRlBVX1VGQyh2b2lkKSB7DQotICBDTEVBUl9CSVQoU1lTQ0ZHLT5DRkdSMSwgU1lTQ0ZHX0NGR1IxX0ZQVV9JRV8yKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIEZsb2F0aW5nIFBvaW50IFVuaXQgT3ZlcmZsb3cgSW50ZXJydXB0DQotICogQHJtdG9sbCBTWVNDRkdfQ0ZHUjEgRlBVX0lFXzMgICAgICBMTF9TWVNDRkdfRGlzYWJsZUlUX0ZQVV9PRkMNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TWVNDRkdfRGlzYWJsZUlUX0ZQVV9PRkModm9pZCkgew0KLSAgQ0xFQVJfQklUKFNZU0NGRy0+Q0ZHUjEsIFNZU0NGR19DRkdSMV9GUFVfSUVfMyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBGbG9hdGluZyBQb2ludCBVbml0IElucHV0IGRlbm9ybWFsIEludGVycnVwdA0KLSAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IxIEZQVV9JRV80ICAgICAgTExfU1lTQ0ZHX0Rpc2FibGVJVF9GUFVfSURDDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTQ0ZHX0Rpc2FibGVJVF9GUFVfSURDKHZvaWQpIHsNCi0gIENMRUFSX0JJVChTWVNDRkctPkNGR1IxLCBTWVNDRkdfQ0ZHUjFfRlBVX0lFXzQpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgRmxvYXRpbmcgUG9pbnQgVW5pdCBJbmV4YWN0IEludGVycnVwdA0KLSAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IxIEZQVV9JRV81ICAgICAgTExfU1lTQ0ZHX0Rpc2FibGVJVF9GUFVfSVhDDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTQ0ZHX0Rpc2FibGVJVF9GUFVfSVhDKHZvaWQpIHsNCi0gIENMRUFSX0JJVChTWVNDRkctPkNGR1IxLCBTWVNDRkdfQ0ZHUjFfRlBVX0lFXzUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIGlmIEZsb2F0aW5nIFBvaW50IFVuaXQgSW52YWxpZCBvcGVyYXRpb24gSW50ZXJydXB0IHNvdXJjZSBpcw0KLSAqIGVuYWJsZWQgb3IgZGlzYWJsZWQuDQotICogQHJtdG9sbCBTWVNDRkdfQ0ZHUjEgRlBVX0lFXzAgICAgICBMTF9TWVNDRkdfSXNFbmFibGVkSVRfRlBVX0lPQw0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TWVNDRkdfSXNFbmFibGVkSVRfRlBVX0lPQyh2b2lkKSB7DQotICByZXR1cm4gKChSRUFEX0JJVChTWVNDRkctPkNGR1IxLCBTWVNDRkdfQ0ZHUjFfRlBVX0lFXzApID09DQotICAgICAgICAgICAoU1lTQ0ZHX0NGR1IxX0ZQVV9JRV8wKSkNCi0gICAgICAgICAgICAgID8gMVVMDQotICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgRmxvYXRpbmcgUG9pbnQgVW5pdCBEaXZpZGUtYnktemVybyBJbnRlcnJ1cHQgc291cmNlIGlzDQotICogZW5hYmxlZCBvciBkaXNhYmxlZC4NCi0gKiBAcm10b2xsIFNZU0NGR19DRkdSMSBGUFVfSUVfMSAgICAgIExMX1NZU0NGR19Jc0VuYWJsZWRJVF9GUFVfRFpDDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU0NGR19Jc0VuYWJsZWRJVF9GUFVfRFpDKHZvaWQpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFNZU0NGRy0+Q0ZHUjEsIFNZU0NGR19DRkdSMV9GUFVfSUVfMSkgPT0NCi0gICAgICAgICAgIChTWVNDRkdfQ0ZHUjFfRlBVX0lFXzEpKQ0KLSAgICAgICAgICAgICAgPyAxVUwNCi0gICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiBGbG9hdGluZyBQb2ludCBVbml0IFVuZGVyZmxvdyBJbnRlcnJ1cHQgc291cmNlIGlzIGVuYWJsZWQgb3INCi0gKiBkaXNhYmxlZC4NCi0gKiBAcm10b2xsIFNZU0NGR19DRkdSMSBGUFVfSUVfMiAgICAgIExMX1NZU0NGR19Jc0VuYWJsZWRJVF9GUFVfVUZDDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU0NGR19Jc0VuYWJsZWRJVF9GUFVfVUZDKHZvaWQpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFNZU0NGRy0+Q0ZHUjEsIFNZU0NGR19DRkdSMV9GUFVfSUVfMikgPT0NCi0gICAgICAgICAgIChTWVNDRkdfQ0ZHUjFfRlBVX0lFXzIpKQ0KLSAgICAgICAgICAgICAgPyAxVUwNCi0gICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiBGbG9hdGluZyBQb2ludCBVbml0IE92ZXJmbG93IEludGVycnVwdCBzb3VyY2UgaXMgZW5hYmxlZCBvcg0KLSAqIGRpc2FibGVkLg0KLSAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IxIEZQVV9JRV8zICAgICAgTExfU1lTQ0ZHX0lzRW5hYmxlZElUX0ZQVV9PRkMNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1lTQ0ZHX0lzRW5hYmxlZElUX0ZQVV9PRkModm9pZCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoU1lTQ0ZHLT5DRkdSMSwgU1lTQ0ZHX0NGR1IxX0ZQVV9JRV8zKSA9PQ0KLSAgICAgICAgICAgKFNZU0NGR19DRkdSMV9GUFVfSUVfMykpDQotICAgICAgICAgICAgICA/IDFVTA0KLSAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIGlmIEZsb2F0aW5nIFBvaW50IFVuaXQgSW5wdXQgZGVub3JtYWwgSW50ZXJydXB0IHNvdXJjZSBpcw0KLSAqIGVuYWJsZWQgb3IgZGlzYWJsZWQuDQotICogQHJtdG9sbCBTWVNDRkdfQ0ZHUjEgRlBVX0lFXzQgICAgICBMTF9TWVNDRkdfSXNFbmFibGVkSVRfRlBVX0lEQw0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TWVNDRkdfSXNFbmFibGVkSVRfRlBVX0lEQyh2b2lkKSB7DQotICByZXR1cm4gKChSRUFEX0JJVChTWVNDRkctPkNGR1IxLCBTWVNDRkdfQ0ZHUjFfRlBVX0lFXzQpID09DQotICAgICAgICAgICAoU1lTQ0ZHX0NGR1IxX0ZQVV9JRV80KSkNCi0gICAgICAgICAgICAgID8gMVVMDQotICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgRmxvYXRpbmcgUG9pbnQgVW5pdCBJbmV4YWN0IEludGVycnVwdCBzb3VyY2UgaXMgZW5hYmxlZCBvcg0KLSAqIGRpc2FibGVkLg0KLSAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IxIEZQVV9JRV81ICAgICAgTExfU1lTQ0ZHX0lzRW5hYmxlZElUX0ZQVV9JWEMNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1lTQ0ZHX0lzRW5hYmxlZElUX0ZQVV9JWEModm9pZCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoU1lTQ0ZHLT5DRkdSMSwgU1lTQ0ZHX0NGR1IxX0ZQVV9JRV81KSA9PQ0KLSAgICAgICAgICAgKFNZU0NGR19DRkdSMV9GUFVfSUVfNSkpDQotICAgICAgICAgICAgICA/IDFVTA0KLSAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENvbmZpZ3VyZSBzb3VyY2UgaW5wdXQgZm9yIHRoZSBFWFRJIGV4dGVybmFsIGludGVycnVwdC4NCi0gKiBAcm10b2xsIFNZU0NGR19FWFRJQ1IxIEVYVEl4ICAgICAgICAgTExfU1lTQ0ZHX1NldEVYVElTb3VyY2Vcbg0KLSAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjIgRVhUSXggICAgICAgICBMTF9TWVNDRkdfU2V0RVhUSVNvdXJjZVxuDQotICogICAgICAgICBTWVNDRkdfRVhUSUNSMyBFWFRJeCAgICAgICAgIExMX1NZU0NGR19TZXRFWFRJU291cmNlXG4NCi0gKiAgICAgICAgIFNZU0NGR19FWFRJQ1I0IEVYVEl4ICAgICAgICAgTExfU1lTQ0ZHX1NldEVYVElTb3VyY2UNCi0gKiBAcGFyYW0gIFBvcnQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9QT1JUQQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX1BPUlRCDQotICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfUE9SVEMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9QT1JURA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX1BPUlRFDQotICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfUE9SVEYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9QT1JURw0KLSAqDQotICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMNCi0gKiBAcGFyYW0gIExpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9MSU5FMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkUxDQotICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfTElORTINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9MSU5FMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkU0DQotICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfTElORTUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9MSU5FNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkU3DQotICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfTElORTgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9MSU5FOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkUxMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkUxMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkUxMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkUxMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkUxNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkUxNQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU0NGR19TZXRFWFRJU291cmNlKHVpbnQzMl90IFBvcnQsIHVpbnQzMl90IExpbmUpIHsNCi0gIE1PRElGWV9SRUcoU1lTQ0ZHLT5FWFRJQ1JbTGluZSAmIDB4M1VdLCAoTGluZSA+PiAxNlUpLA0KLSAgICAgICAgICAgICBQb3J0IDw8IChQT1NJVElPTl9WQUwoKExpbmUgPj4gMTZVKSkgJiAweDFGVSkpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCB0aGUgY29uZmlndXJlZCBkZWZpbmVkIGZvciBzcGVjaWZpYyBFWFRJIExpbmUNCi0gKiBAcm10b2xsIFNZU0NGR19FWFRJQ1IxIEVYVEl4ICAgICAgICAgTExfU1lTQ0ZHX0dldEVYVElTb3VyY2Vcbg0KLSAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjIgRVhUSXggICAgICAgICBMTF9TWVNDRkdfR2V0RVhUSVNvdXJjZVxuDQotICogICAgICAgICBTWVNDRkdfRVhUSUNSMyBFWFRJeCAgICAgICAgIExMX1NZU0NGR19HZXRFWFRJU291cmNlXG4NCi0gKiAgICAgICAgIFNZU0NGR19FWFRJQ1I0IEVYVEl4ICAgICAgICAgTExfU1lTQ0ZHX0dldEVYVElTb3VyY2UNCi0gKiBAcGFyYW0gIExpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9MSU5FMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkUxDQotICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfTElORTINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9MSU5FMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkU0DQotICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfTElORTUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9MSU5FNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkU3DQotICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfTElORTgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9MSU5FOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkUxMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkUxMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkUxMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkUxMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkUxNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkUxNQ0KLSAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9QT1JUQQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX1BPUlRCDQotICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfUE9SVEMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9QT1JURA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX1BPUlRFDQotICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfUE9SVEYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9QT1JURw0KLSAqDQotICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1lTQ0ZHX0dldEVYVElTb3VyY2UodWludDMyX3QgTGluZSkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoU1lTQ0ZHLT5FWFRJQ1JbTGluZSAmIDB4M1VdLCAoTGluZSA+PiAxNlUpKSA+Pg0KLSAgICAgICAgICAgICAgICAgICAgKFBPU0lUSU9OX1ZBTChMaW5lID4+IDE2VSkgJiAweDFGVSkpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSBDQ01TUkFNIEVyYXNlIChzdGFydHMgYSBoYXJkd2FyZSBDQ01TUkFNIGVyYXNlIG9wZXJhdGlvbi4gVGhpcw0KLSAqIGJpdCBpcyBhdXRvbWF0aWNhbGx5IGNsZWFyZWQgYXQgdGhlIGVuZCBvZiB0aGUgQ0NNU1JBTSBlcmFzZSBvcGVyYXRpb24uKQ0KLSAqIEBub3RlIFRoaXMgYml0IGlzIHdyaXRlLXByb3RlY3RlZDogc2V0dGluZyB0aGlzIGJpdCBpcyBwb3NzaWJsZSBvbmx5IGFmdGVyDQotICogdGhlIGNvcnJlY3Qga2V5IHNlcXVlbmNlIGlzIHdyaXR0ZW4gaW4gdGhlIFNZU0NGR19TS1IgcmVnaXN0ZXIgYXMgZGVzY3JpYmVkDQotICogaW4gdGhlIFJlZmVyZW5jZSBNYW51YWwuDQotICogQHJtdG9sbCBTWVNDRkdfU0NTUiAgQ0NNRVIgICAgICAgTExfU1lTQ0ZHX0VuYWJsZUNDTVNSQU1FcmFzZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU0NGR19FbmFibGVDQ01TUkFNRXJhc2Uodm9pZCkgew0KLSAgLyogU3RhcnRzIGEgaGFyZHdhcmUgQ0NNU1JBTSBlcmFzZSBvcGVyYXRpb24qLw0KLSAgU0VUX0JJVChTWVNDRkctPlNDU1IsIFNZU0NGR19TQ1NSX0NDTUVSKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiBDQ01TUkFNIGVyYXNlIG9wZXJhdGlvbiBpcyBvbiBnb2luZw0KLSAqIEBybXRvbGwgU1lTQ0ZHX1NDU1IgIENDTUJTWSAgICAgIExMX1NZU0NGR19Jc0NDTVNSQU1FcmFzZU9uZ29pbmcNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1lTQ0ZHX0lzQ0NNU1JBTUVyYXNlT25nb2luZyh2b2lkKSB7DQotICByZXR1cm4gKChSRUFEX0JJVChTWVNDRkctPlNDU1IsIFNZU0NGR19TQ1NSX0NDTUJTWSkgPT0gKFNZU0NGR19TQ1NSX0NDTUJTWSkpDQotICAgICAgICAgICAgICA/IDFVTA0KLSAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCBjb25uZWN0aW9ucyB0byBUSU0xLzgvMTUvMTYvMTcgQnJlYWsgaW5wdXRzDQotICogQHJtdG9sbCBTWVNDRkdfQ0ZHUjIgQ0xMICAgICAgICAgICBMTF9TWVNDRkdfU2V0VElNQnJlYWtJbnB1dHNcbg0KLSAqICAgICAgICAgU1lTQ0ZHX0NGR1IyIFNQTCAgICAgICAgICAgTExfU1lTQ0ZHX1NldFRJTUJyZWFrSW5wdXRzXG4NCi0gKiAgICAgICAgIFNZU0NGR19DRkdSMiBQVkRMICAgICAgICAgIExMX1NZU0NGR19TZXRUSU1CcmVha0lucHV0c1xuDQotICogICAgICAgICBTWVNDRkdfQ0ZHUjIgRUNDTCAgICAgICAgICBMTF9TWVNDRkdfU2V0VElNQnJlYWtJbnB1dHMNCi0gKiBAcGFyYW0gIEJyZWFrIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19USU1CUkVBS19FQ0MNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfVElNQlJFQUtfUFZEDQotICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1RJTUJSRUFLX1NSQU1fUEFSSVRZDQotICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1RJTUJSRUFLX0xPQ0tVUA0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU0NGR19TZXRUSU1CcmVha0lucHV0cyh1aW50MzJfdCBCcmVhaykgew0KLSAgTU9ESUZZX1JFRyhTWVNDRkctPkNGR1IyLA0KLSAgICAgICAgICAgICBTWVNDRkdfQ0ZHUjJfQ0xMIHwgU1lTQ0ZHX0NGR1IyX1NQTCB8IFNZU0NGR19DRkdSMl9QVkRMIHwNCi0gICAgICAgICAgICAgICAgIFNZU0NGR19DRkdSMl9FQ0NMLA0KLSAgICAgICAgICAgICBCcmVhayk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IGNvbm5lY3Rpb25zIHRvIFRJTTEvOC8xNS8xNi8xNyBCcmVhayBpbnB1dHMNCi0gKiBAcm10b2xsIFNZU0NGR19DRkdSMiBDTEwgICAgICAgICAgIExMX1NZU0NGR19HZXRUSU1CcmVha0lucHV0c1xuDQotICogICAgICAgICBTWVNDRkdfQ0ZHUjIgU1BMICAgICAgICAgICBMTF9TWVNDRkdfR2V0VElNQnJlYWtJbnB1dHNcbg0KLSAqICAgICAgICAgU1lTQ0ZHX0NGR1IyIFBWREwgICAgICAgICAgTExfU1lTQ0ZHX0dldFRJTUJyZWFrSW5wdXRzXG4NCi0gKiAgICAgICAgIFNZU0NGR19DRkdSMiBFQ0NMICAgICAgICAgIExMX1NZU0NGR19HZXRUSU1CcmVha0lucHV0cw0KLSAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19USU1CUkVBS19FQ0MNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfVElNQlJFQUtfUFZEDQotICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1RJTUJSRUFLX1NSQU1fUEFSSVRZDQotICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1RJTUJSRUFLX0xPQ0tVUA0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TWVNDRkdfR2V0VElNQnJlYWtJbnB1dHModm9pZCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoDQotICAgICAgU1lTQ0ZHLT5DRkdSMiwgU1lTQ0ZHX0NGR1IyX0NMTCB8IFNZU0NGR19DRkdSMl9TUEwgfCBTWVNDRkdfQ0ZHUjJfUFZETCB8DQotICAgICAgICAgICAgICAgICAgICAgICAgIFNZU0NGR19DRkdSMl9FQ0NMKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgU1JBTSBwYXJpdHkgZXJyb3IgZGV0ZWN0ZWQNCi0gKiBAcm10b2xsIFNZU0NGR19DRkdSMiBTUEYgICAgICAgICAgIExMX1NZU0NGR19Jc0FjdGl2ZUZsYWdfU1ANCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1lTQ0ZHX0lzQWN0aXZlRmxhZ19TUCh2b2lkKSB7DQotICByZXR1cm4gKChSRUFEX0JJVChTWVNDRkctPkNGR1IyLCBTWVNDRkdfQ0ZHUjJfU1BGKSA9PSAoU1lTQ0ZHX0NGR1IyX1NQRikpDQotICAgICAgICAgICAgICA/IDFVTA0KLSAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENsZWFyIFNSQU0gcGFyaXR5IGVycm9yIGZsYWcNCi0gKiBAcm10b2xsIFNZU0NGR19DRkdSMiBTUEYgICAgICAgICAgIExMX1NZU0NGR19DbGVhckZsYWdfU1ANCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TWVNDRkdfQ2xlYXJGbGFnX1NQKHZvaWQpIHsNCi0gIFNFVF9CSVQoU1lTQ0ZHLT5DRkdSMiwgU1lTQ0ZHX0NGR1IyX1NQRik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIENDTVNSQU0gcGFnZSB3cml0ZSBwcm90ZWN0aW9uDQotICogQG5vdGUgV3JpdGUgcHJvdGVjdGlvbiBpcyBjbGVhcmVkIG9ubHkgYnkgYSBzeXN0ZW0gcmVzZXQNCi0gKiBAcm10b2xsIFNZU0NGR19TV1BSICBQQUdFeCAgICAgICAgIExMX1NZU0NGR19FbmFibGVDQ01TUkFNUGFnZVdSUA0KLSAqIEBwYXJhbSAgQ0NNU1JBTVdSUCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nDQotICogdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19DQ01TUkFNV1JQX1BBR0UwDQotICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfQ0NNU1JBTVdSUF9QQUdFMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19DQ01TUkFNV1JQX1BBR0UzDQotICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfQ0NNU1JBTVdSUF9QQUdFNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19DQ01TUkFNV1JQX1BBR0U2DQotICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfQ0NNU1JBTVdSUF9QQUdFOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19DQ01TUkFNV1JQX1BBR0U5DQotICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTEwICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19DQ01TUkFNV1JQX1BBR0UxMSAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfQ0NNU1JBTVdSUF9QQUdFMTIgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTEzICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19DQ01TUkFNV1JQX1BBR0UxNCAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfQ0NNU1JBTVdSUF9QQUdFMTUgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTE2ICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19DQ01TUkFNV1JQX1BBR0UxNyAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfQ0NNU1JBTVdSUF9QQUdFMTggKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTE5ICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19DQ01TUkFNV1JQX1BBR0UyMCAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfQ0NNU1JBTVdSUF9QQUdFMjEgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTIyICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19DQ01TUkFNV1JQX1BBR0UyMyAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfQ0NNU1JBTVdSUF9QQUdFMjQgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTI1ICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19DQ01TUkFNV1JQX1BBR0UyNiAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfQ0NNU1JBTVdSUF9QQUdFMjcgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTI4ICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19DQ01TUkFNV1JQX1BBR0UyOSAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfQ0NNU1JBTVdSUF9QQUdFMzAgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTMxICgqKQ0KLSAqDQotICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TWVNDRkdfRW5hYmxlQ0NNU1JBTVBhZ2VXUlAodWludDMyX3QgQ0NNU1JBTVdSUCkgew0KLSAgU0VUX0JJVChTWVNDRkctPlNXUFIsIENDTVNSQU1XUlApOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENDTVNSQU0gcGFnZSB3cml0ZSBwcm90ZWN0aW9uIGxvY2sgcHJpb3IgdG8gZXJhc2UNCi0gKiBAcm10b2xsIFNZU0NGR19TS1IgICBLRVkgICAgICAgICAgIExMX1NZU0NGR19Mb2NrQ0NNU1JBTVdSUA0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU0NGR19Mb2NrQ0NNU1JBTVdSUCh2b2lkKSB7DQotICAvKiBXcml0aW5nIGEgd3Jvbmcga2V5IHJlYWN0aXZhdGVzIHRoZSB3cml0ZSBwcm90ZWN0aW9uICovDQotICBXUklURV9SRUcoU1lTQ0ZHLT5TS1IsIDB4MDApOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENDTVNSQU0gcGFnZSB3cml0ZSBwcm90ZWN0aW9uIHVubG9jayBwcmlvciB0byBlcmFzZQ0KLSAqIEBybXRvbGwgU1lTQ0ZHX1NLUiAgIEtFWSAgICAgICAgICAgTExfU1lTQ0ZHX1VubG9ja0NDTVNSQU1XUlANCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TWVNDRkdfVW5sb2NrQ0NNU1JBTVdSUCh2b2lkKSB7DQotICAvKiB1bmxvY2sgdGhlIHdyaXRlIHByb3RlY3Rpb24gb2YgdGhlIENDTUVSIGJpdCAqLw0KLSAgV1JJVEVfUkVHKFNZU0NGRy0+U0tSLCAweENBKTsNCi0gIFdSSVRFX1JFRyhTWVNDRkctPlNLUiwgMHg1Myk7DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBTWVNURU1fTExfRUZfREJHTUNVIERCR01DVQ0KLSAqIEB7DQotICovDQotDQotLyoqDQotICogQGJyaWVmICBSZXR1cm4gdGhlIGRldmljZSBpZGVudGlmaWVyDQotICogQHJtdG9sbCBEQkdNQ1VfSURDT0RFIERFVl9JRCAgICAgICAgTExfREJHTUNVX0dldERldmljZUlEDQotICogQHJldHZhbCBWYWx1ZXMgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDBGRkYgKGV4OiBkZXZpY2UgSUQgaXMNCi0gKiAweDY0MTUpDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RCR01DVV9HZXREZXZpY2VJRCh2b2lkKSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChEQkdNQ1UtPklEQ09ERSwgREJHTUNVX0lEQ09ERV9ERVZfSUQpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBSZXR1cm4gdGhlIGRldmljZSByZXZpc2lvbiBpZGVudGlmaWVyDQotICogQG5vdGUgVGhpcyBmaWVsZCBpbmRpY2F0ZXMgdGhlIHJldmlzaW9uIG9mIHRoZSBkZXZpY2UuDQotICogQHJtdG9sbCBEQkdNQ1VfSURDT0RFIFJFVl9JRCAgICAgICAgTExfREJHTUNVX0dldFJldmlzaW9uSUQNCi0gKiBAcmV0dmFsIFZhbHVlcyBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkZGRg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9EQkdNQ1VfR2V0UmV2aXNpb25JRCh2b2lkKSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChEQkdNQ1UtPklEQ09ERSwgREJHTUNVX0lEQ09ERV9SRVZfSUQpID4+DQotICAgICAgICAgICAgICAgICAgICAoREJHTUNVX1JFVklEX1BPU0lUSU9OICYgMHgxRlUpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgdGhlIERlYnVnIE1vZHVsZSBkdXJpbmcgU0xFRVAgbW9kZQ0KLSAqIEBybXRvbGwgREJHTUNVX0NSICAgIERCR19TTEVFUCAgICAgTExfREJHTUNVX0VuYWJsZURCR1NsZWVwTW9kZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0RCR01DVV9FbmFibGVEQkdTbGVlcE1vZGUodm9pZCkgew0KLSAgU0VUX0JJVChEQkdNQ1UtPkNSLCBEQkdNQ1VfQ1JfREJHX1NMRUVQKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIHRoZSBEZWJ1ZyBNb2R1bGUgZHVyaW5nIFNMRUVQIG1vZGUNCi0gKiBAcm10b2xsIERCR01DVV9DUiAgICBEQkdfU0xFRVAgICAgIExMX0RCR01DVV9EaXNhYmxlREJHU2xlZXBNb2RlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfREJHTUNVX0Rpc2FibGVEQkdTbGVlcE1vZGUodm9pZCkgew0KLSAgQ0xFQVJfQklUKERCR01DVS0+Q1IsIERCR01DVV9DUl9EQkdfU0xFRVApOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSB0aGUgRGVidWcgTW9kdWxlIGR1cmluZyBTVE9QIG1vZGUNCi0gKiBAcm10b2xsIERCR01DVV9DUiAgICBEQkdfU1RPUCAgICAgIExMX0RCR01DVV9FbmFibGVEQkdTdG9wTW9kZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0RCR01DVV9FbmFibGVEQkdTdG9wTW9kZSh2b2lkKSB7DQotICBTRVRfQklUKERCR01DVS0+Q1IsIERCR01DVV9DUl9EQkdfU1RPUCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSB0aGUgRGVidWcgTW9kdWxlIGR1cmluZyBTVE9QIG1vZGUNCi0gKiBAcm10b2xsIERCR01DVV9DUiAgICBEQkdfU1RPUCAgICAgIExMX0RCR01DVV9EaXNhYmxlREJHU3RvcE1vZGUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9EQkdNQ1VfRGlzYWJsZURCR1N0b3BNb2RlKHZvaWQpIHsNCi0gIENMRUFSX0JJVChEQkdNQ1UtPkNSLCBEQkdNQ1VfQ1JfREJHX1NUT1ApOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSB0aGUgRGVidWcgTW9kdWxlIGR1cmluZyBTVEFOREJZIG1vZGUNCi0gKiBAcm10b2xsIERCR01DVV9DUiAgICBEQkdfU1RBTkRCWSAgIExMX0RCR01DVV9FbmFibGVEQkdTdGFuZGJ5TW9kZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0RCR01DVV9FbmFibGVEQkdTdGFuZGJ5TW9kZSh2b2lkKSB7DQotICBTRVRfQklUKERCR01DVS0+Q1IsIERCR01DVV9DUl9EQkdfU1RBTkRCWSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSB0aGUgRGVidWcgTW9kdWxlIGR1cmluZyBTVEFOREJZIG1vZGUNCi0gKiBAcm10b2xsIERCR01DVV9DUiAgICBEQkdfU1RBTkRCWSAgIExMX0RCR01DVV9EaXNhYmxlREJHU3RhbmRieU1vZGUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9EQkdNQ1VfRGlzYWJsZURCR1N0YW5kYnlNb2RlKHZvaWQpIHsNCi0gIENMRUFSX0JJVChEQkdNQ1UtPkNSLCBEQkdNQ1VfQ1JfREJHX1NUQU5EQlkpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCBUcmFjZSBwaW4gYXNzaWdubWVudCBjb250cm9sDQotICogQHJtdG9sbCBEQkdNQ1VfQ1IgICAgVFJBQ0VfSU9FTiAgICBMTF9EQkdNQ1VfU2V0VHJhY2VQaW5Bc3NpZ25tZW50XG4NCi0gKiAgICAgICAgIERCR01DVV9DUiAgICBUUkFDRV9NT0RFICAgIExMX0RCR01DVV9TZXRUcmFjZVBpbkFzc2lnbm1lbnQNCi0gKiBAcGFyYW0gIFBpbkFzc2lnbm1lbnQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfVFJBQ0VfTk9ORQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9UUkFDRV9BU1lOQ0gNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfVFJBQ0VfU1lOQ0hfU0laRTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfVFJBQ0VfU1lOQ0hfU0laRTINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfVFJBQ0VfU1lOQ0hfU0laRTQNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9EQkdNQ1VfU2V0VHJhY2VQaW5Bc3NpZ25tZW50KHVpbnQzMl90IFBpbkFzc2lnbm1lbnQpIHsNCi0gIE1PRElGWV9SRUcoREJHTUNVLT5DUiwgREJHTUNVX0NSX1RSQUNFX0lPRU4gfCBEQkdNQ1VfQ1JfVFJBQ0VfTU9ERSwNCi0gICAgICAgICAgICAgUGluQXNzaWdubWVudCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IFRyYWNlIHBpbiBhc3NpZ25tZW50IGNvbnRyb2wNCi0gKiBAcm10b2xsIERCR01DVV9DUiAgICBUUkFDRV9JT0VOICAgIExMX0RCR01DVV9HZXRUcmFjZVBpbkFzc2lnbm1lbnRcbg0KLSAqICAgICAgICAgREJHTUNVX0NSICAgIFRSQUNFX01PREUgICAgTExfREJHTUNVX0dldFRyYWNlUGluQXNzaWdubWVudA0KLSAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfVFJBQ0VfTk9ORQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9UUkFDRV9BU1lOQ0gNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfVFJBQ0VfU1lOQ0hfU0laRTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfVFJBQ0VfU1lOQ0hfU0laRTINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfVFJBQ0VfU1lOQ0hfU0laRTQNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfREJHTUNVX0dldFRyYWNlUGluQXNzaWdubWVudCh2b2lkKSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChEQkdNQ1UtPkNSLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJHTUNVX0NSX1RSQUNFX0lPRU4gfCBEQkdNQ1VfQ1JfVFJBQ0VfTU9ERSkpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEZyZWV6ZSBBUEIxIHBlcmlwaGVyYWxzIChncm91cDEgcGVyaXBoZXJhbHMpDQotICogQHJtdG9sbCBEQkdNQ1VfQVBCMUZaUjEgREJHX3h4eHhfU1RPUCAgTExfREJHTUNVX0FQQjFfR1JQMV9GcmVlemVQZXJpcGgNCi0gKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjFfR1JQMV9USU0yX1NUT1ANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMV9HUlAxX1RJTTNfU1RPUA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIxX0dSUDFfVElNNF9TVE9QDQotICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjFfR1JQMV9USU01X1NUT1AgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjFfR1JQMV9USU02X1NUT1ANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMV9HUlAxX1RJTTdfU1RPUA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIxX0dSUDFfUlRDX1NUT1ANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMV9HUlAxX1dXREdfU1RPUA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIxX0dSUDFfSVdER19TVE9QDQotICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjFfR1JQMV9JMkMxX1NUT1ANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMV9HUlAxX0kyQzJfU1RPUA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIxX0dSUDFfSTJDM19TVE9QDQotICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjFfR1JQMV9MUFRJTTFfU1RPUA0KLSAqDQotICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfREJHTUNVX0FQQjFfR1JQMV9GcmVlemVQZXJpcGgodWludDMyX3QgUGVyaXBocykgew0KLSAgU0VUX0JJVChEQkdNQ1UtPkFQQjFGWlIxLCBQZXJpcGhzKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBGcmVlemUgQVBCMSBwZXJpcGhlcmFscyAoZ3JvdXAyIHBlcmlwaGVyYWxzKQ0KLSAqIEBybXRvbGwgREJHTUNVX0FQQjFGWlIyIERCR194eHh4X1NUT1AgIExMX0RCR01DVV9BUEIxX0dSUDJfRnJlZXplUGVyaXBoDQotICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIxX0dSUDJfSTJDNF9TVE9QICgqKQ0KLSAqDQotICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfREJHTUNVX0FQQjFfR1JQMl9GcmVlemVQZXJpcGgodWludDMyX3QgUGVyaXBocykgew0KLSAgU0VUX0JJVChEQkdNQ1UtPkFQQjFGWlIyLCBQZXJpcGhzKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBVbmZyZWV6ZSBBUEIxIHBlcmlwaGVyYWxzIChncm91cDEgcGVyaXBoZXJhbHMpDQotICogQHJtdG9sbCBEQkdNQ1VfQVBCMUZaUjEgREJHX3h4eHhfU1RPUCAgTExfREJHTUNVX0FQQjFfR1JQMV9VbkZyZWV6ZVBlcmlwaA0KLSAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMV9HUlAxX1RJTTJfU1RPUA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIxX0dSUDFfVElNM19TVE9QDQotICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjFfR1JQMV9USU00X1NUT1ANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMV9HUlAxX1RJTTVfU1RPUCAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMV9HUlAxX1RJTTZfU1RPUA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIxX0dSUDFfVElNN19TVE9QDQotICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjFfR1JQMV9SVENfU1RPUA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIxX0dSUDFfV1dER19TVE9QDQotICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjFfR1JQMV9JV0RHX1NUT1ANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMV9HUlAxX0kyQzFfU1RPUA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIxX0dSUDFfSTJDMl9TVE9QDQotICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjFfR1JQMV9JMkMzX1NUT1ANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMV9HUlAxX0xQVElNMV9TVE9QDQotICoNCi0gKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9EQkdNQ1VfQVBCMV9HUlAxX1VuRnJlZXplUGVyaXBoKHVpbnQzMl90IFBlcmlwaHMpIHsNCi0gIENMRUFSX0JJVChEQkdNQ1UtPkFQQjFGWlIxLCBQZXJpcGhzKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBVbmZyZWV6ZSBBUEIxIHBlcmlwaGVyYWxzIChncm91cDIgcGVyaXBoZXJhbHMpDQotICogQHJtdG9sbCBEQkdNQ1VfQVBCMUZaUjIgREJHX3h4eHhfU1RPUCAgTExfREJHTUNVX0FQQjFfR1JQMl9VbkZyZWV6ZVBlcmlwaA0KLSAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMV9HUlAyX0kyQzRfU1RPUCAoKikNCi0gKg0KLSAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0RCR01DVV9BUEIxX0dSUDJfVW5GcmVlemVQZXJpcGgodWludDMyX3QgUGVyaXBocykgew0KLSAgQ0xFQVJfQklUKERCR01DVS0+QVBCMUZaUjIsIFBlcmlwaHMpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEZyZWV6ZSBBUEIyIHBlcmlwaGVyYWxzDQotICogQHJtdG9sbCBEQkdNQ1VfQVBCMkZaIERCR19USU14X1NUT1AgIExMX0RCR01DVV9BUEIyX0dSUDFfRnJlZXplUGVyaXBoDQotICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIyX0dSUDFfVElNMV9TVE9QDQotICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjJfR1JQMV9USU04X1NUT1ANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMl9HUlAxX1RJTTE1X1NUT1ANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMl9HUlAxX1RJTTE2X1NUT1ANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMl9HUlAxX1RJTTE3X1NUT1ANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMl9HUlAxX1RJTTIwX1NUT1AgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjJfR1JQMV9IUlRJTTFfU1RPUCAoKikNCi0gKg0KLSAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0RCR01DVV9BUEIyX0dSUDFfRnJlZXplUGVyaXBoKHVpbnQzMl90IFBlcmlwaHMpIHsNCi0gIFNFVF9CSVQoREJHTUNVLT5BUEIyRlosIFBlcmlwaHMpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFVuZnJlZXplIEFQQjIgcGVyaXBoZXJhbHMNCi0gKiBAcm10b2xsIERCR01DVV9BUEIyRlogREJHX1RJTXhfU1RPUCAgTExfREJHTUNVX0FQQjJfR1JQMV9VbkZyZWV6ZVBlcmlwaA0KLSAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMl9HUlAxX1RJTTFfU1RPUA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIyX0dSUDFfVElNOF9TVE9QDQotICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjJfR1JQMV9USU0xNV9TVE9QDQotICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjJfR1JQMV9USU0xNl9TVE9QDQotICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjJfR1JQMV9USU0xN19TVE9QDQotICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjJfR1JQMV9USU0yMF9TVE9QICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIyX0dSUDFfSFJUSU0xX1NUT1AgKCopDQotICoNCi0gKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9EQkdNQ1VfQVBCMl9HUlAxX1VuRnJlZXplUGVyaXBoKHVpbnQzMl90IFBlcmlwaHMpIHsNCi0gIENMRUFSX0JJVChEQkdNQ1UtPkFQQjJGWiwgUGVyaXBocyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotI2lmIGRlZmluZWQoVlJFRkJVRikNCi0vKiogQGRlZmdyb3VwIFNZU1RFTV9MTF9FRl9WUkVGQlVGIFZSRUZCVUYNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIEludGVybmFsIHZvbHRhZ2UgcmVmZXJlbmNlDQotICogQHJtdG9sbCBWUkVGQlVGX0NTUiAgRU5WUiAgICAgICAgICBMTF9WUkVGQlVGX0VuYWJsZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1ZSRUZCVUZfRW5hYmxlKHZvaWQpIHsNCi0gIFNFVF9CSVQoVlJFRkJVRi0+Q1NSLCBWUkVGQlVGX0NTUl9FTlZSKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIEludGVybmFsIHZvbHRhZ2UgcmVmZXJlbmNlDQotICogQHJtdG9sbCBWUkVGQlVGX0NTUiAgRU5WUiAgICAgICAgICBMTF9WUkVGQlVGX0Rpc2FibGUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9WUkVGQlVGX0Rpc2FibGUodm9pZCkgew0KLSAgQ0xFQVJfQklUKFZSRUZCVUYtPkNTUiwgVlJFRkJVRl9DU1JfRU5WUik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIGhpZ2ggaW1wZWRhbmNlIChWUkVGK3BpbiBpcyBoaWdoIGltcGVkYW5jZSkNCi0gKiBAcm10b2xsIFZSRUZCVUZfQ1NSICBISVogICAgICAgICAgIExMX1ZSRUZCVUZfRW5hYmxlSElaDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVlJFRkJVRl9FbmFibGVISVoodm9pZCkgew0KLSAgU0VUX0JJVChWUkVGQlVGLT5DU1IsIFZSRUZCVUZfQ1NSX0hJWik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBoaWdoIGltcGVkYW5jZSAoVlJFRitwaW4gaXMgaW50ZXJuYWxseSBjb25uZWN0ZWQgdG8gdGhlDQotICogdm9sdGFnZSByZWZlcmVuY2UgYnVmZmVyIG91dHB1dCkNCi0gKiBAcm10b2xsIFZSRUZCVUZfQ1NSICBISVogICAgICAgICAgIExMX1ZSRUZCVUZfRGlzYWJsZUhJWg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1ZSRUZCVUZfRGlzYWJsZUhJWih2b2lkKSB7DQotICBDTEVBUl9CSVQoVlJFRkJVRi0+Q1NSLCBWUkVGQlVGX0NTUl9ISVopOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCB0aGUgVm9sdGFnZSByZWZlcmVuY2Ugc2NhbGUNCi0gKiBAcm10b2xsIFZSRUZCVUZfQ1NSICBWUlMgICAgICAgICAgIExMX1ZSRUZCVUZfU2V0Vm9sdGFnZVNjYWxpbmcNCi0gKiBAcGFyYW0gIFNjYWxlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfVlJFRkJVRl9WT0xUQUdFX1NDQUxFMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1ZSRUZCVUZfVk9MVEFHRV9TQ0FMRTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9WUkVGQlVGX1ZPTFRBR0VfU0NBTEUyDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVlJFRkJVRl9TZXRWb2x0YWdlU2NhbGluZyh1aW50MzJfdCBTY2FsZSkgew0KLSAgTU9ESUZZX1JFRyhWUkVGQlVGLT5DU1IsIFZSRUZCVUZfQ1NSX1ZSUywgU2NhbGUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCB0aGUgVm9sdGFnZSByZWZlcmVuY2Ugc2NhbGUNCi0gKiBAcm10b2xsIFZSRUZCVUZfQ1NSICBWUlMgICAgICAgICAgIExMX1ZSRUZCVUZfR2V0Vm9sdGFnZVNjYWxpbmcNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfVlJFRkJVRl9WT0xUQUdFX1NDQUxFMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1ZSRUZCVUZfVk9MVEFHRV9TQ0FMRTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9WUkVGQlVGX1ZPTFRBR0VfU0NBTEUyDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1ZSRUZCVUZfR2V0Vm9sdGFnZVNjYWxpbmcodm9pZCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVlJFRkJVRi0+Q1NSLCBWUkVGQlVGX0NTUl9WUlMpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiBWb2x0YWdlIHJlZmVyZW5jZSBidWZmZXIgaXMgcmVhZHkNCi0gKiBAcm10b2xsIFZSRUZCVUZfQ1NSICBWUlIgICAgICAgICAgIExMX1ZSRUZCVUZfSXNWUkVGUmVhZHkNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVlJFRkJVRl9Jc1ZSRUZSZWFkeSh2b2lkKSB7DQotICByZXR1cm4gKChSRUFEX0JJVChWUkVGQlVGLT5DU1IsIFZSRUZCVUZfQ1NSX1ZSUikgPT0gKFZSRUZCVUZfQ1NSX1ZSUikpID8gMVVMDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgdGhlIHRyaW1taW5nIGNvZGUgZm9yIFZSRUZCVUYgY2FsaWJyYXRpb24NCi0gKiBAcm10b2xsIFZSRUZCVUZfQ0NSICBUUklNICAgICAgICAgIExMX1ZSRUZCVUZfR2V0VHJpbW1pbmcNCi0gKiBAcmV0dmFsIEJldHdlZW4gMCBhbmQgMHgzRg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9WUkVGQlVGX0dldFRyaW1taW5nKHZvaWQpIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFZSRUZCVUYtPkNDUiwgVlJFRkJVRl9DQ1JfVFJJTSkpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCB0aGUgdHJpbW1pbmcgY29kZSBmb3IgVlJFRkJVRiBjYWxpYnJhdGlvbiAoVHVuZSB0aGUgaW50ZXJuYWwNCi0gKiByZWZlcmVuY2UgYnVmZmVyIHZvbHRhZ2UpDQotICogQHJtdG9sbCBWUkVGQlVGX0NDUiAgVFJJTSAgICAgICAgICBMTF9WUkVGQlVGX1NldFRyaW1taW5nDQotICogQHBhcmFtICBWYWx1ZSBCZXR3ZWVuIDAgYW5kIDB4M0YNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9WUkVGQlVGX1NldFRyaW1taW5nKHVpbnQzMl90IFZhbHVlKSB7DQotICBXUklURV9SRUcoVlJFRkJVRi0+Q0NSLCBWYWx1ZSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotI2VuZGlmIC8qIFZSRUZCVUYgKi8NCi0NCi0vKiogQGRlZmdyb3VwIFNZU1RFTV9MTF9FRl9GTEFTSCBGTEFTSA0KLSAqIEB7DQotICovDQotDQotLyoqDQotICogQGJyaWVmICBTZXQgRkxBU0ggTGF0ZW5jeQ0KLSAqIEBybXRvbGwgRkxBU0hfQUNSICAgIExBVEVOQ1kgICAgICAgTExfRkxBU0hfU2V0TGF0ZW5jeQ0KLSAqIEBwYXJhbSAgTGF0ZW5jeSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZMQVNIX0xBVEVOQ1lfMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZMQVNIX0xBVEVOQ1lfMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZMQVNIX0xBVEVOQ1lfMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZMQVNIX0xBVEVOQ1lfMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZMQVNIX0xBVEVOQ1lfNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZMQVNIX0xBVEVOQ1lfNSAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9GTEFTSF9MQVRFTkNZXzYgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRkxBU0hfTEFURU5DWV83ICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZMQVNIX0xBVEVOQ1lfOCAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9GTEFTSF9MQVRFTkNZXzkgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRkxBU0hfTEFURU5DWV8xMCAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9GTEFTSF9MQVRFTkNZXzExICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZMQVNIX0xBVEVOQ1lfMTIgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRkxBU0hfTEFURU5DWV8xMyAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9GTEFTSF9MQVRFTkNZXzE0ICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZMQVNIX0xBVEVOQ1lfMTUgKCopDQotICoNCi0gKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9GTEFTSF9TZXRMYXRlbmN5KHVpbnQzMl90IExhdGVuY3kpIHsNCi0gIE1PRElGWV9SRUcoRkxBU0gtPkFDUiwgRkxBU0hfQUNSX0xBVEVOQ1ksIExhdGVuY3kpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBGTEFTSCBMYXRlbmN5DQotICogQHJtdG9sbCBGTEFTSF9BQ1IgICAgTEFURU5DWSAgICAgICBMTF9GTEFTSF9HZXRMYXRlbmN5DQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZMQVNIX0xBVEVOQ1lfMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZMQVNIX0xBVEVOQ1lfMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZMQVNIX0xBVEVOQ1lfMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZMQVNIX0xBVEVOQ1lfMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZMQVNIX0xBVEVOQ1lfNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZMQVNIX0xBVEVOQ1lfNSAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9GTEFTSF9MQVRFTkNZXzYgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRkxBU0hfTEFURU5DWV83ICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZMQVNIX0xBVEVOQ1lfOCAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9GTEFTSF9MQVRFTkNZXzkgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRkxBU0hfTEFURU5DWV8xMCAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9GTEFTSF9MQVRFTkNZXzExICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZMQVNIX0xBVEVOQ1lfMTIgKCopDQotICogICAgICAgICBAYXJnIEByZWYgTExfRkxBU0hfTEFURU5DWV8xMyAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9GTEFTSF9MQVRFTkNZXzE0ICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZMQVNIX0xBVEVOQ1lfMTUgKCopDQotICoNCi0gKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRkxBU0hfR2V0TGF0ZW5jeSh2b2lkKSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChGTEFTSC0+QUNSLCBGTEFTSF9BQ1JfTEFURU5DWSkpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSBQcmVmZXRjaA0KLSAqIEBybXRvbGwgRkxBU0hfQUNSICAgIFBSRlRFTiAgICAgICAgTExfRkxBU0hfRW5hYmxlUHJlZmV0Y2gNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9GTEFTSF9FbmFibGVQcmVmZXRjaCh2b2lkKSB7DQotICBTRVRfQklUKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9QUkZURU4pOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgUHJlZmV0Y2gNCi0gKiBAcm10b2xsIEZMQVNIX0FDUiAgICBQUkZURU4gICAgICAgIExMX0ZMQVNIX0Rpc2FibGVQcmVmZXRjaA0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0ZMQVNIX0Rpc2FibGVQcmVmZXRjaCh2b2lkKSB7DQotICBDTEVBUl9CSVQoRkxBU0gtPkFDUiwgRkxBU0hfQUNSX1BSRlRFTik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgUHJlZmV0Y2ggYnVmZmVyIGlzIGVuYWJsZWQNCi0gKiBAcm10b2xsIEZMQVNIX0FDUiAgICBQUkZURU4gICAgICAgIExMX0ZMQVNIX0lzUHJlZmV0Y2hFbmFibGVkDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0ZMQVNIX0lzUHJlZmV0Y2hFbmFibGVkKHZvaWQpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9QUkZURU4pID09IChGTEFTSF9BQ1JfUFJGVEVOKSkgPyAxVUwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSBJbnN0cnVjdGlvbiBjYWNoZQ0KLSAqIEBybXRvbGwgRkxBU0hfQUNSICAgIElDRU4gICAgICAgICAgTExfRkxBU0hfRW5hYmxlSW5zdENhY2hlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRkxBU0hfRW5hYmxlSW5zdENhY2hlKHZvaWQpIHsNCi0gIFNFVF9CSVQoRkxBU0gtPkFDUiwgRkxBU0hfQUNSX0lDRU4pOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgSW5zdHJ1Y3Rpb24gY2FjaGUNCi0gKiBAcm10b2xsIEZMQVNIX0FDUiAgICBJQ0VOICAgICAgICAgIExMX0ZMQVNIX0Rpc2FibGVJbnN0Q2FjaGUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9GTEFTSF9EaXNhYmxlSW5zdENhY2hlKHZvaWQpIHsNCi0gIENMRUFSX0JJVChGTEFTSC0+QUNSLCBGTEFTSF9BQ1JfSUNFTik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIERhdGEgY2FjaGUNCi0gKiBAcm10b2xsIEZMQVNIX0FDUiAgICBEQ0VOICAgICAgICAgIExMX0ZMQVNIX0VuYWJsZURhdGFDYWNoZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0ZMQVNIX0VuYWJsZURhdGFDYWNoZSh2b2lkKSB7DQotICBTRVRfQklUKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9EQ0VOKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIERhdGEgY2FjaGUNCi0gKiBAcm10b2xsIEZMQVNIX0FDUiAgICBEQ0VOICAgICAgICAgIExMX0ZMQVNIX0Rpc2FibGVEYXRhQ2FjaGUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9GTEFTSF9EaXNhYmxlRGF0YUNhY2hlKHZvaWQpIHsNCi0gIENMRUFSX0JJVChGTEFTSC0+QUNSLCBGTEFTSF9BQ1JfRENFTik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIEluc3RydWN0aW9uIGNhY2hlIHJlc2V0DQotICogQG5vdGUgIGJpdCBjYW4gYmUgd3JpdHRlbiBvbmx5IHdoZW4gdGhlIGluc3RydWN0aW9uIGNhY2hlIGlzIGRpc2FibGVkDQotICogQHJtdG9sbCBGTEFTSF9BQ1IgICAgSUNSU1QgICAgICAgICBMTF9GTEFTSF9FbmFibGVJbnN0Q2FjaGVSZXNldA0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0ZMQVNIX0VuYWJsZUluc3RDYWNoZVJlc2V0KHZvaWQpIHsNCi0gIFNFVF9CSVQoRkxBU0gtPkFDUiwgRkxBU0hfQUNSX0lDUlNUKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIEluc3RydWN0aW9uIGNhY2hlIHJlc2V0DQotICogQHJtdG9sbCBGTEFTSF9BQ1IgICAgSUNSU1QgICAgICAgICBMTF9GTEFTSF9EaXNhYmxlSW5zdENhY2hlUmVzZXQNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9GTEFTSF9EaXNhYmxlSW5zdENhY2hlUmVzZXQodm9pZCkgew0KLSAgQ0xFQVJfQklUKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9JQ1JTVCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIERhdGEgY2FjaGUgcmVzZXQNCi0gKiBAbm90ZSBiaXQgY2FuIGJlIHdyaXR0ZW4gb25seSB3aGVuIHRoZSBkYXRhIGNhY2hlIGlzIGRpc2FibGVkDQotICogQHJtdG9sbCBGTEFTSF9BQ1IgICAgRENSU1QgICAgICAgICBMTF9GTEFTSF9FbmFibGVEYXRhQ2FjaGVSZXNldA0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0ZMQVNIX0VuYWJsZURhdGFDYWNoZVJlc2V0KHZvaWQpIHsNCi0gIFNFVF9CSVQoRkxBU0gtPkFDUiwgRkxBU0hfQUNSX0RDUlNUKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIERhdGEgY2FjaGUgcmVzZXQNCi0gKiBAcm10b2xsIEZMQVNIX0FDUiAgICBEQ1JTVCAgICAgICAgIExMX0ZMQVNIX0Rpc2FibGVEYXRhQ2FjaGVSZXNldA0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0ZMQVNIX0Rpc2FibGVEYXRhQ2FjaGVSZXNldCh2b2lkKSB7DQotICBDTEVBUl9CSVQoRkxBU0gtPkFDUiwgRkxBU0hfQUNSX0RDUlNUKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgRmxhc2ggUG93ZXItZG93biBtb2RlIGR1cmluZyBydW4gbW9kZSBvciBMb3ctcG93ZXIgcnVuIG1vZGUNCi0gKiBAbm90ZSBGbGFzaCBtZW1vcnkgY2FuIGJlIHB1dCBpbiBwb3dlci1kb3duIG1vZGUgb25seSB3aGVuIHRoZSBjb2RlIGlzDQotICogZXhlY3V0ZWQgZnJvbSBSQU0NCi0gKiBAbm90ZSBGbGFzaCBtdXN0IG5vdCBiZSBhY2Nlc3NlZCB3aGVuIHBvd2VyIGRvd24gaXMgZW5hYmxlZA0KLSAqIEBub3RlIEZsYXNoIG11c3Qgbm90IGJlIHB1dCBpbiBwb3dlci1kb3duIHdoaWxlIGEgcHJvZ3JhbSBvciBhbiBlcmFzZQ0KLSAqIG9wZXJhdGlvbiBpcyBvbi1nb2luZw0KLSAqIEBybXRvbGwgRkxBU0hfQUNSICAgIFJVTl9QRCAgICAgICAgTExfRkxBU0hfRW5hYmxlUnVuUG93ZXJEb3duXG4NCi0gKiAgICAgICAgIEZMQVNIX1BES0VZUiBQREtFWTEgICAgICAgIExMX0ZMQVNIX0VuYWJsZVJ1blBvd2VyRG93blxuDQotICogICAgICAgICBGTEFTSF9QREtFWVIgUERLRVkyICAgICAgICBMTF9GTEFTSF9FbmFibGVSdW5Qb3dlckRvd24NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9GTEFTSF9FbmFibGVSdW5Qb3dlckRvd24odm9pZCkgew0KLSAgLyogRm9sbG93aW5nIHZhbHVlcyBtdXN0IGJlIHdyaXR0ZW4gY29uc2VjdXRpdmVseSB0byB1bmxvY2sgdGhlIFJVTl9QRCBiaXQgaW4NCi0gICAgIEZMQVNIX0FDUiAqLw0KLSAgV1JJVEVfUkVHKEZMQVNILT5QREtFWVIsIEZMQVNIX1BES0VZMSk7DQotICBXUklURV9SRUcoRkxBU0gtPlBES0VZUiwgRkxBU0hfUERLRVkyKTsNCi0gIFNFVF9CSVQoRkxBU0gtPkFDUiwgRkxBU0hfQUNSX1JVTl9QRCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBGbGFzaCBQb3dlci1kb3duIG1vZGUgZHVyaW5nIHJ1biBtb2RlIG9yIExvdy1wb3dlciBydW4gbW9kZQ0KLSAqIEBybXRvbGwgRkxBU0hfQUNSICAgIFJVTl9QRCAgICAgICAgTExfRkxBU0hfRGlzYWJsZVJ1blBvd2VyRG93blxuDQotICogICAgICAgICBGTEFTSF9QREtFWVIgUERLRVkxICAgICAgICBMTF9GTEFTSF9EaXNhYmxlUnVuUG93ZXJEb3duXG4NCi0gKiAgICAgICAgIEZMQVNIX1BES0VZUiBQREtFWTIgICAgICAgIExMX0ZMQVNIX0Rpc2FibGVSdW5Qb3dlckRvd24NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9GTEFTSF9EaXNhYmxlUnVuUG93ZXJEb3duKHZvaWQpIHsNCi0gIC8qIEZvbGxvd2luZyB2YWx1ZXMgbXVzdCBiZSB3cml0dGVuIGNvbnNlY3V0aXZlbHkgdG8gdW5sb2NrIHRoZSBSVU5fUEQgYml0IGluDQotICAgICBGTEFTSF9BQ1IgKi8NCi0gIFdSSVRFX1JFRyhGTEFTSC0+UERLRVlSLCBGTEFTSF9QREtFWTEpOw0KLSAgV1JJVEVfUkVHKEZMQVNILT5QREtFWVIsIEZMQVNIX1BES0VZMik7DQotICBDTEVBUl9CSVQoRkxBU0gtPkFDUiwgRkxBU0hfQUNSX1JVTl9QRCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIEZsYXNoIFBvd2VyLWRvd24gbW9kZSBkdXJpbmcgU2xlZXAgb3IgTG93LXBvd2VyIHNsZWVwIG1vZGUNCi0gKiBAbm90ZSBGbGFzaCBtdXN0IG5vdCBiZSBwdXQgaW4gcG93ZXItZG93biB3aGlsZSBhIHByb2dyYW0gb3IgYW4gZXJhc2UNCi0gKiBvcGVyYXRpb24gaXMgb24tZ29pbmcNCi0gKiBAcm10b2xsIEZMQVNIX0FDUiAgICBTTEVFUF9QRCAgICAgIExMX0ZMQVNIX0VuYWJsZVNsZWVwUG93ZXJEb3duDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRkxBU0hfRW5hYmxlU2xlZXBQb3dlckRvd24odm9pZCkgew0KLSAgU0VUX0JJVChGTEFTSC0+QUNSLCBGTEFTSF9BQ1JfU0xFRVBfUEQpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgRmxhc2ggUG93ZXItZG93biBtb2RlIGR1cmluZyBTbGVlcCBvciBMb3ctcG93ZXIgc2xlZXAgbW9kZQ0KLSAqIEBybXRvbGwgRkxBU0hfQUNSICAgIFNMRUVQX1BEICAgICAgTExfRkxBU0hfRGlzYWJsZVNsZWVwUG93ZXJEb3duDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRkxBU0hfRGlzYWJsZVNsZWVwUG93ZXJEb3duKHZvaWQpIHsNCi0gIENMRUFSX0JJVChGTEFTSC0+QUNSLCBGTEFTSF9BQ1JfU0xFRVBfUEQpOw0KLX0NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0jZW5kaWYgLyogZGVmaW5lZCAoRkxBU0gpIHx8IGRlZmluZWQgKFNZU0NGRykgfHwgZGVmaW5lZCAoREJHTUNVKSB8fCBkZWZpbmVkIFwNCi0gICAgICAgICAgKFZSRUZCVUYpICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0jaWZkZWYgX19jcGx1c3BsdXMNCi19DQotI2VuZGlmDQotDQotI2VuZGlmIC8qIF9fU1RNMzJHNHh4X0xMX1NZU1RFTV9IICovDQorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZzR4eF9sbF9zeXN0ZW0uaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgU1lTVEVNIExMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0ZXJtcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlCisgICogaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc29mdHdhcmUgY29tcG9uZW50LgorICAqIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcyB3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICBAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGUgTEwgU1lTVEVNIGRyaXZlciBjb250YWlucyBhIHNldCBvZiBnZW5lcmljIEFQSXMgdGhhdCBjYW4gYmUKKyAgICB1c2VkIGJ5IHVzZXI6CisgICAgICAoKykgU29tZSBvZiB0aGUgRkxBU0ggZmVhdHVyZXMgbmVlZCB0byBiZSBoYW5kbGVkIGluIHRoZSBTWVNURU0gZmlsZS4KKyAgICAgICgrKSBBY2Nlc3MgdG8gREJHQ01VIHJlZ2lzdGVycworICAgICAgKCspIEFjY2VzcyB0byBTWVNDRkcgcmVnaXN0ZXJzCisgICAgICAoKykgQWNjZXNzIHRvIFZSRUZCVUYgcmVnaXN0ZXJzCisKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBfX1NUTTMyRzR4eF9MTF9TWVNURU1fSAorI2RlZmluZSBfX1NUTTMyRzR4eF9MTF9TWVNURU1fSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnNHh4LmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkc0eHhfTExfRHJpdmVyCisgKiBAeworICovCisKKyNpZiBkZWZpbmVkKEZMQVNIKSB8fCBkZWZpbmVkKFNZU0NGRykgfHwgZGVmaW5lZChEQkdNQ1UpIHx8IGRlZmluZWQoVlJFRkJVRikKKworLyoqIEBkZWZncm91cCBTWVNURU1fTEwgU1lTVEVNCisgKiBAeworICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBTWVNURU1fTExfUHJpdmF0ZV9Db25zdGFudHMgU1lTVEVNIFByaXZhdGUgQ29uc3RhbnRzCisgKiBAeworICovCisKKy8qIERlZmluZXMgdXNlZCBmb3IgcG9zaXRpb24gaW4gdGhlIHJlZ2lzdGVyICovCisjZGVmaW5lIERCR01DVV9SRVZJRF9QT1NJVElPTiAodWludDMyX3QpIFBPU0lUSU9OX1ZBTChEQkdNQ1VfSURDT0RFX1JFVl9JRCkKKworLyoqCisgKiBAYnJpZWYgUG93ZXItZG93biBpbiBSdW4gbW9kZSBGbGFzaCBrZXkKKyAqLworI2RlZmluZSBGTEFTSF9QREtFWTEgMHgwNDE1MjYzN1UgLyohPCBGbGFzaCBwb3dlciBkb3duIGtleTEgKi8KKyNkZWZpbmUgRkxBU0hfUERLRVkyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAweEZBRkJGQ0ZEVSAvKiE8IEZsYXNoIHBvd2VyIGRvd24ga2V5MjogdXNlZCB3aXRoIEZMQVNIX1BES0VZMSBcCisgICAgICAgICAgICAgICAgICAgdG8gdW5sb2NrIHRoZSBSVU5fUEQgYml0IGluIEZMQVNIX0FDUiAqLworCisvKioKKyAqIEB9CisgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFNZU1RFTV9MTF9FeHBvcnRlZF9Db25zdGFudHMgU1lTVEVNIEV4cG9ydGVkIENvbnN0YW50cworICogQHsKKyAqLworCisvKiogQGRlZmdyb3VwIFNZU1RFTV9MTF9FQ19SRU1BUCBTWVNDRkcgUkVNQVAKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX1JFTUFQX0ZMQVNIIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBNYWluIEZsYXNoIG1lbW9yeSBtYXBwZWQgYXQgMHgwMDAwMDAwMCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX1JFTUFQX1NZU1RFTUZMQVNIIFwKKyAgU1lTQ0ZHX01FTVJNUF9NRU1fTU9ERV8wIC8qITwgU3lzdGVtIEZsYXNoIG1lbW9yeSBtYXBwZWQgYXQgMHgwMDAwMDAwMCAqLworI2RlZmluZSBMTF9TWVNDRkdfUkVNQVBfU1JBTSAgXAorICAoU1lTQ0ZHX01FTVJNUF9NRU1fTU9ERV8xIHwgXAorICAgU1lTQ0ZHX01FTVJNUF9NRU1fTU9ERV8wKSAvKiE8IFNSQU0xIG1hcHBlZCBhdCAweDAwMDAwMDAwICovCisjaWYgZGVmaW5lZChGTUNfQmFuazFfUikKKyNkZWZpbmUgTExfU1lTQ0ZHX1JFTUFQX0ZNQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFNZU0NGR19NRU1STVBfTUVNX01PREVfMSAvKiE8IEZNQyBiYW5rIDEgKE5PUi9QU1JBTSAxIGFuZCAyKSBtYXBwZWQgYXQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMCAqLworI2VuZGlmICAgICAgICAgICAgICAgICAgICAgLyogRk1DX0JhbmsxX1IgKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX1JFTUFQX1FVQURTUEkgXAorICAoU1lTQ0ZHX01FTVJNUF9NRU1fTU9ERV8yIHwgICBcCisgICBTWVNDRkdfTUVNUk1QX01FTV9NT0RFXzEpIC8qITwgUVVBRFNQSSBtZW1vcnkgbWFwcGVkIGF0IDB4MDAwMDAwMDAgKi8KKy8qKgorICogQH0KKyAqLworCisjaWYgZGVmaW5lZChTWVNDRkdfTUVNUk1QX0ZCX01PREUpCisvKiogQGRlZmdyb3VwIFNZU1RFTV9MTF9FQ19CQU5LTU9ERSBTWVNDRkcgQkFOSyBNT0RFCisgKiBAeworICovCisjZGVmaW5lIExMX1NZU0NGR19CQU5LTU9ERV9CQU5LMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMDAwMDBVIC8qITwgRmxhc2ggQmFuazEgbWFwcGVkIGF0IDB4MDgwMDAwMDAgKGFuZCBhbGlhc2VkIEAweDAwMDAwMDAwKSBcCisgICAgICAgICAgICAgICBhbmQgRmxhc2ggQmFuazIgbWFwcGVkIGF0IDB4MDgwNDAwMDAgKGFuZCBhbGlhc2VkIGF0ICAgICAgICAgICBcCisgICAgICAgICAgICAgICAweDAwMDgwMDAwKSAqLworI2RlZmluZSBMTF9TWVNDRkdfQkFOS01PREVfQkFOSzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBTWVNDRkdfTUVNUk1QX0ZCX01PREUgLyohPCBGbGFzaCBCYW5rMiBtYXBwZWQgYXQgMHgwODAwMDAwMCAoYW5kIGFsaWFzZWQgXAorICAgICAgICAgICAgICAgICAgICAgICAgIEAweDAwMDAwMDAwKSBhbmQgRmxhc2ggQmFuazEgbWFwcGVkIGF0IDB4MDgwNDAwMDAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgYWxpYXNlZCBhdCAweDAwMDgwMDAwKSAqLworLyoqCisgKiBAfQorICovCisKKyNlbmRpZiAvKiBTWVNDRkdfTUVNUk1QX0ZCX01PREUgKi8KKy8qKiBAZGVmZ3JvdXAgU1lTVEVNX0xMX0VDX0kyQ19GQVNUTU9ERVBMVVMgU1lTQ0ZHIEkyQyBGQVNUTU9ERVBMVVMKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX0kyQ19GQVNUTU9ERVBMVVNfUEI2IFwKKyAgU1lTQ0ZHX0NGR1IxX0kyQ19QQjZfRk1QIC8qITwgRW5hYmxlIEZhc3QgTW9kZSBQbHVzIG9uIFBCNiAgICAgICAqLworI2RlZmluZSBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19QQjcgXAorICBTWVNDRkdfQ0ZHUjFfSTJDX1BCN19GTVAgLyohPCBFbmFibGUgRmFzdCBNb2RlIFBsdXMgb24gUEI3ICAgICAgICovCisjaWYgZGVmaW5lZChTWVNDRkdfQ0ZHUjFfSTJDX1BCOF9GTVApCisjZGVmaW5lIExMX1NZU0NGR19JMkNfRkFTVE1PREVQTFVTX1BCOCBcCisgIFNZU0NGR19DRkdSMV9JMkNfUEI4X0ZNUCAvKiE8IEVuYWJsZSBGYXN0IE1vZGUgUGx1cyBvbiBQQjggICAgICAgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAgICAgIC8qIFNZU0NGR19DRkdSMV9JMkNfUEI4X0ZNUCAqLworI2lmIGRlZmluZWQoU1lTQ0ZHX0NGR1IxX0kyQ19QQjlfRk1QKQorI2RlZmluZSBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19QQjkgXAorICBTWVNDRkdfQ0ZHUjFfSTJDX1BCOV9GTVAgLyohPCBFbmFibGUgRmFzdCBNb2RlIFBsdXMgb24gUEI5ICAgICAgICovCisjZW5kaWYgICAgICAgICAgICAgICAgICAgICAvKiBTWVNDRkdfQ0ZHUjFfSTJDX1BCOV9GTVAgKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX0kyQ19GQVNUTU9ERVBMVVNfSTJDMSBcCisgIFNZU0NGR19DRkdSMV9JMkMxX0ZNUCAvKiE8IEVuYWJsZSBGYXN0IE1vZGUgUGx1cyBvbiBJMkMxIHBpbnMgKi8KKyNpZiBkZWZpbmVkKEkyQzIpCisjZGVmaW5lIExMX1NZU0NGR19JMkNfRkFTVE1PREVQTFVTX0kyQzIgXAorICBTWVNDRkdfQ0ZHUjFfSTJDMl9GTVAgLyohPCBFbmFibGUgRmFzdCBNb2RlIFBsdXMgb24gSTJDMiBwaW5zICovCisjZW5kaWYgICAgICAgICAgICAgICAgICAvKiBJMkMyICovCisjZGVmaW5lIExMX1NZU0NGR19JMkNfRkFTVE1PREVQTFVTX0kyQzMgXAorICBTWVNDRkdfQ0ZHUjFfSTJDM19GTVAgLyohPCBFbmFibGUgRmFzdCBNb2RlIFBsdXMgb24gSTJDMyBwaW5zICovCisjaWYgZGVmaW5lZChJMkM0KQorI2RlZmluZSBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19JMkM0IFwKKyAgU1lTQ0ZHX0NGR1IxX0kyQzRfRk1QIC8qITwgRW5hYmxlIEZhc3QgTW9kZSBQbHVzIG9uIEkyQzQgcGlucyAqLworI2VuZGlmICAgICAgICAgICAgICAgICAgLyogSTJDNCAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgU1lTVEVNX0xMX0VDX0VYVElfUE9SVCBTWVNDRkcgRVhUSSBQT1JUCisgKiBAeworICovCisjZGVmaW5lIExMX1NZU0NGR19FWFRJX1BPUlRBIDBVIC8qITwgRVhUSSBQT1JUIEEgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9TWVNDRkdfRVhUSV9QT1JUQiAxVSAvKiE8IEVYVEkgUE9SVCBCICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX0VYVElfUE9SVEMgMlUgLyohPCBFWFRJIFBPUlQgQyAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX1NZU0NGR19FWFRJX1BPUlREIDNVIC8qITwgRVhUSSBQT1JUIEQgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9TWVNDRkdfRVhUSV9QT1JURSA0VSAvKiE8IEVYVEkgUE9SVCBFICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX0VYVElfUE9SVEYgNVUgLyohPCBFWFRJIFBPUlQgRiAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX1NZU0NGR19FWFRJX1BPUlRHIDZVIC8qITwgRVhUSSBQT1JUIEcgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgU1lTVEVNX0xMX0VDX0VYVElfTElORSBTWVNDRkcgRVhUSSBMSU5FCisgKiBAeworICovCisjZGVmaW5lIExMX1NZU0NGR19FWFRJX0xJTkUwIFwKKyAgKHVpbnQzMl90KSgoMHgwMDBGVSA8PCAxNlUpIHwgMFUpIC8qICE8IEVYVElfUE9TSVRJT05fMCAgfCBFWFRJQ1JbMF0gKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX0VYVElfTElORTEgXAorICAodWludDMyX3QpKCgweDAwRjBVIDw8IDE2VSkgfCAwVSkgLyogITwgRVhUSV9QT1NJVElPTl80ICB8IEVYVElDUlswXSAqLworI2RlZmluZSBMTF9TWVNDRkdfRVhUSV9MSU5FMiBcCisgICh1aW50MzJfdCkoKDB4MEYwMFUgPDwgMTZVKSB8IDBVKSAvKiAhPCBFWFRJX1BPU0lUSU9OXzggIHwgRVhUSUNSWzBdICovCisjZGVmaW5lIExMX1NZU0NGR19FWFRJX0xJTkUzIFwKKyAgKHVpbnQzMl90KSgoMHhGMDAwVSA8PCAxNlUpIHwgMFUpIC8qICE8IEVYVElfUE9TSVRJT05fMTIgfCBFWFRJQ1JbMF0gKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX0VYVElfTElORTQgXAorICAodWludDMyX3QpKCgweDAwMEZVIDw8IDE2VSkgfCAxVSkgLyogITwgRVhUSV9QT1NJVElPTl8wICB8IEVYVElDUlsxXSAqLworI2RlZmluZSBMTF9TWVNDRkdfRVhUSV9MSU5FNSBcCisgICh1aW50MzJfdCkoKDB4MDBGMFUgPDwgMTZVKSB8IDFVKSAvKiAhPCBFWFRJX1BPU0lUSU9OXzQgIHwgRVhUSUNSWzFdICovCisjZGVmaW5lIExMX1NZU0NGR19FWFRJX0xJTkU2IFwKKyAgKHVpbnQzMl90KSgoMHgwRjAwVSA8PCAxNlUpIHwgMVUpIC8qICE8IEVYVElfUE9TSVRJT05fOCAgfCBFWFRJQ1JbMV0gKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX0VYVElfTElORTcgXAorICAodWludDMyX3QpKCgweEYwMDBVIDw8IDE2VSkgfCAxVSkgLyogITwgRVhUSV9QT1NJVElPTl8xMiB8IEVYVElDUlsxXSAqLworI2RlZmluZSBMTF9TWVNDRkdfRVhUSV9MSU5FOCBcCisgICh1aW50MzJfdCkoKDB4MDAwRlUgPDwgMTZVKSB8IDJVKSAvKiAhPCBFWFRJX1BPU0lUSU9OXzAgIHwgRVhUSUNSWzJdICovCisjZGVmaW5lIExMX1NZU0NGR19FWFRJX0xJTkU5IFwKKyAgKHVpbnQzMl90KSgoMHgwMEYwVSA8PCAxNlUpIHwgMlUpIC8qICE8IEVYVElfUE9TSVRJT05fNCAgfCBFWFRJQ1JbMl0gKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX0VYVElfTElORTEwIFwKKyAgKHVpbnQzMl90KSgoMHgwRjAwVSA8PCAxNlUpIHwgMlUpIC8qICE8IEVYVElfUE9TSVRJT05fOCAgfCBFWFRJQ1JbMl0gKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX0VYVElfTElORTExIFwKKyAgKHVpbnQzMl90KSgoMHhGMDAwVSA8PCAxNlUpIHwgMlUpIC8qICE8IEVYVElfUE9TSVRJT05fMTIgfCBFWFRJQ1JbMl0gKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX0VYVElfTElORTEyIFwKKyAgKHVpbnQzMl90KSgoMHgwMDBGVSA8PCAxNlUpIHwgM1UpIC8qICE8IEVYVElfUE9TSVRJT05fMCAgfCBFWFRJQ1JbM10gKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX0VYVElfTElORTEzIFwKKyAgKHVpbnQzMl90KSgoMHgwMEYwVSA8PCAxNlUpIHwgM1UpIC8qICE8IEVYVElfUE9TSVRJT05fNCAgfCBFWFRJQ1JbM10gKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX0VYVElfTElORTE0IFwKKyAgKHVpbnQzMl90KSgoMHgwRjAwVSA8PCAxNlUpIHwgM1UpIC8qICE8IEVYVElfUE9TSVRJT05fOCAgfCBFWFRJQ1JbM10gKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX0VYVElfTElORTE1IFwKKyAgKHVpbnQzMl90KSgoMHhGMDAwVSA8PCAxNlUpIHwgM1UpIC8qICE8IEVYVElfUE9TSVRJT05fMTIgfCBFWFRJQ1JbM10gKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFNZU1RFTV9MTF9FQ19USU1CUkVBSyBTWVNDRkcgVElNRVIgQlJFQUsKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX1RJTUJSRUFLX0VDQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFNZU0NGR19DRkdSMl9FQ0NMIC8qITwgRW5hYmxlcyBhbmQgbG9ja3MgdGhlIEVDQyBlcnJvciBzaWduYWwgXAorICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggQnJlYWsgSW5wdXQgb2YgVElNMS84LzE1LzE2LzE3ICovCisjZGVmaW5lIExMX1NZU0NGR19USU1CUkVBS19QVkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU1lTQ0ZHX0NGR1IyX1BWREwgLyohPCBFbmFibGVzIGFuZCBsb2NrcyB0aGUgUFZEIGNvbm5lY3Rpb24gICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggVElNMS84LzE1LzE2LzE3IEJyZWFrIElucHV0ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGFsc28gdGhlIFBWREUgYW5kIFBMUyBiaXRzIG9mIHRoZSBQb3dlciBDb250cm9sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJmYWNlICovCisjZGVmaW5lIExMX1NZU0NGR19USU1CUkVBS19TUkFNX1BBUklUWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU1lTQ0ZHX0NGR1IyX1NQTCAvKiE8IEVuYWJsZXMgYW5kIGxvY2tzIHRoZSBTUkFNX1BBUklUWSBlcnJvciBzaWduYWwgXAorICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBCcmVhayBJbnB1dCBvZiBUSU0xLzgvMTUvMTYvMTcgKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX1RJTUJSRUFLX0xPQ0tVUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU1lTQ0ZHX0NGR1IyX0NMTCAvKiE8IEVuYWJsZXMgYW5kIGxvY2tzIHRoZSBMT0NLVVAgb3V0cHV0IG9mIENvcnRleE00IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggQnJlYWsgSW5wdXQgb2YgVElNMS8xNS8xNi8xNyAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgU1lTVEVNX0xMX0VDX0NDTVNSQU1XUlAgU1lTQ0ZHIENDTVNSQU0gV1JQCisgKiBAeworICovCisjZGVmaW5lIExMX1NZU0NGR19DQ01TUkFNV1JQX1BBR0UwIFwKKyAgU1lTQ0ZHX1NXUFJfUEFHRTAgLyohPCBDQ01TUkFNIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAwICAqLworI2RlZmluZSBMTF9TWVNDRkdfQ0NNU1JBTVdSUF9QQUdFMSBcCisgIFNZU0NGR19TV1BSX1BBR0UxIC8qITwgQ0NNU1JBTSBXcml0ZSBwcm90ZWN0aW9uIHBhZ2UgMSAgKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTIgXAorICBTWVNDRkdfU1dQUl9QQUdFMiAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDIgICovCisjZGVmaW5lIExMX1NZU0NGR19DQ01TUkFNV1JQX1BBR0UzIFwKKyAgU1lTQ0ZHX1NXUFJfUEFHRTMgLyohPCBDQ01TUkFNIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAzICAqLworI2RlZmluZSBMTF9TWVNDRkdfQ0NNU1JBTVdSUF9QQUdFNCBcCisgIFNZU0NGR19TV1BSX1BBR0U0IC8qITwgQ0NNU1JBTSBXcml0ZSBwcm90ZWN0aW9uIHBhZ2UgNCAgKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTUgXAorICBTWVNDRkdfU1dQUl9QQUdFNSAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDUgICovCisjZGVmaW5lIExMX1NZU0NGR19DQ01TUkFNV1JQX1BBR0U2IFwKKyAgU1lTQ0ZHX1NXUFJfUEFHRTYgLyohPCBDQ01TUkFNIFdyaXRlIHByb3RlY3Rpb24gcGFnZSA2ICAqLworI2RlZmluZSBMTF9TWVNDRkdfQ0NNU1JBTVdSUF9QQUdFNyBcCisgIFNZU0NGR19TV1BSX1BBR0U3IC8qITwgQ0NNU1JBTSBXcml0ZSBwcm90ZWN0aW9uIHBhZ2UgNyAgKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTggXAorICBTWVNDRkdfU1dQUl9QQUdFOCAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDggICovCisjZGVmaW5lIExMX1NZU0NGR19DQ01TUkFNV1JQX1BBR0U5IFwKKyAgU1lTQ0ZHX1NXUFJfUEFHRTkgLyohPCBDQ01TUkFNIFdyaXRlIHByb3RlY3Rpb24gcGFnZSA5ICAqLworI2lmIGRlZmluZWQoU1lTQ0ZHX1NXUFJfUEFHRTEwKQorI2RlZmluZSBMTF9TWVNDRkdfQ0NNU1JBTVdSUF9QQUdFMTAgXAorICBTWVNDRkdfU1dQUl9QQUdFMTAgLyohPCBDQ01TUkFNIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAxMCAqLworI2RlZmluZSBMTF9TWVNDRkdfQ0NNU1JBTVdSUF9QQUdFMTEgXAorICBTWVNDRkdfU1dQUl9QQUdFMTEgLyohPCBDQ01TUkFNIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAxMSAqLworI2RlZmluZSBMTF9TWVNDRkdfQ0NNU1JBTVdSUF9QQUdFMTIgXAorICBTWVNDRkdfU1dQUl9QQUdFMTIgLyohPCBDQ01TUkFNIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAxMiAqLworI2RlZmluZSBMTF9TWVNDRkdfQ0NNU1JBTVdSUF9QQUdFMTMgXAorICBTWVNDRkdfU1dQUl9QQUdFMTMgLyohPCBDQ01TUkFNIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAxMyAqLworI2RlZmluZSBMTF9TWVNDRkdfQ0NNU1JBTVdSUF9QQUdFMTQgXAorICBTWVNDRkdfU1dQUl9QQUdFMTQgLyohPCBDQ01TUkFNIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAxNCAqLworI2RlZmluZSBMTF9TWVNDRkdfQ0NNU1JBTVdSUF9QQUdFMTUgXAorICBTWVNDRkdfU1dQUl9QQUdFMTUgLyohPCBDQ01TUkFNIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAxNSAqLworI2RlZmluZSBMTF9TWVNDRkdfQ0NNU1JBTVdSUF9QQUdFMTYgXAorICBTWVNDRkdfU1dQUl9QQUdFMTYgLyohPCBDQ01TUkFNIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAxNiAqLworI2RlZmluZSBMTF9TWVNDRkdfQ0NNU1JBTVdSUF9QQUdFMTcgXAorICBTWVNDRkdfU1dQUl9QQUdFMTcgLyohPCBDQ01TUkFNIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAxNyAqLworI2RlZmluZSBMTF9TWVNDRkdfQ0NNU1JBTVdSUF9QQUdFMTggXAorICBTWVNDRkdfU1dQUl9QQUdFMTggLyohPCBDQ01TUkFNIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAxOCAqLworI2RlZmluZSBMTF9TWVNDRkdfQ0NNU1JBTVdSUF9QQUdFMTkgXAorICBTWVNDRkdfU1dQUl9QQUdFMTkgLyohPCBDQ01TUkFNIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAxOSAqLworI2VuZGlmICAgICAgICAgICAgICAgLyogU1lTQ0ZHX1NXUFJfUEFHRTEwICovCisjaWYgZGVmaW5lZChTWVNDRkdfU1dQUl9QQUdFMjApCisjZGVmaW5lIExMX1NZU0NGR19DQ01TUkFNV1JQX1BBR0UyMCBcCisgIFNZU0NGR19TV1BSX1BBR0UyMCAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDIwICovCisjZGVmaW5lIExMX1NZU0NGR19DQ01TUkFNV1JQX1BBR0UyMSBcCisgIFNZU0NGR19TV1BSX1BBR0UyMSAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDIxICovCisjZGVmaW5lIExMX1NZU0NGR19DQ01TUkFNV1JQX1BBR0UyMiBcCisgIFNZU0NGR19TV1BSX1BBR0UyMiAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDIyICovCisjZGVmaW5lIExMX1NZU0NGR19DQ01TUkFNV1JQX1BBR0UyMyBcCisgIFNZU0NGR19TV1BSX1BBR0UyMyAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDIzICovCisjZGVmaW5lIExMX1NZU0NGR19DQ01TUkFNV1JQX1BBR0UyNCBcCisgIFNZU0NGR19TV1BSX1BBR0UyNCAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDI0ICovCisjZGVmaW5lIExMX1NZU0NGR19DQ01TUkFNV1JQX1BBR0UyNSBcCisgIFNZU0NGR19TV1BSX1BBR0UyNSAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDI1ICovCisjZGVmaW5lIExMX1NZU0NGR19DQ01TUkFNV1JQX1BBR0UyNiBcCisgIFNZU0NGR19TV1BSX1BBR0UyNiAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDI2ICovCisjZGVmaW5lIExMX1NZU0NGR19DQ01TUkFNV1JQX1BBR0UyNyBcCisgIFNZU0NGR19TV1BSX1BBR0UyNyAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDI3ICovCisjZGVmaW5lIExMX1NZU0NGR19DQ01TUkFNV1JQX1BBR0UyOCBcCisgIFNZU0NGR19TV1BSX1BBR0UyOCAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDI4ICovCisjZGVmaW5lIExMX1NZU0NGR19DQ01TUkFNV1JQX1BBR0UyOSBcCisgIFNZU0NGR19TV1BSX1BBR0UyOSAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDI5ICovCisjZGVmaW5lIExMX1NZU0NGR19DQ01TUkFNV1JQX1BBR0UzMCBcCisgIFNZU0NGR19TV1BSX1BBR0UzMCAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDMwICovCisjZGVmaW5lIExMX1NZU0NGR19DQ01TUkFNV1JQX1BBR0UzMSBcCisgIFNZU0NGR19TV1BSX1BBR0UzMSAvKiE8IENDTVNSQU0gV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDMxICovCisjZW5kaWYgICAgICAgICAgICAgICAvKiBTWVNDRkdfU1dQUl9QQUdFMjAgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFNZU1RFTV9MTF9FQ19UUkFDRSBEQkdNQ1UgVFJBQ0UgUGluIEFzc2lnbm1lbnQKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfREJHTUNVX1RSQUNFX05PTkUgXAorICAweDAwMDAwMDAwVSAvKiE8IFRSQUNFIHBpbnMgbm90IGFzc2lnbmVkIChkZWZhdWx0IHN0YXRlKSAqLworI2RlZmluZSBMTF9EQkdNQ1VfVFJBQ0VfQVNZTkNIIFwKKyAgREJHTUNVX0NSX1RSQUNFX0lPRU4gLyohPCBUUkFDRSBwaW4gYXNzaWdubWVudCBmb3IgQXN5bmNocm9ub3VzIE1vZGUgKi8KKyNkZWZpbmUgTExfREJHTUNVX1RSQUNFX1NZTkNIX1NJWkUxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChEQkdNQ1VfQ1JfVFJBQ0VfSU9FTiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgREJHTUNVX0NSX1RSQUNFX01PREVfMCkgLyohPCBUUkFDRSBwaW4gYXNzaWdubWVudCBmb3IgU3luY2hyb25vdXMgTW9kZSB3aXRoIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgVFJBQ0VEQVRBIHNpemUgb2YgMSAqLworI2RlZmluZSBMTF9EQkdNQ1VfVFJBQ0VfU1lOQ0hfU0laRTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKERCR01DVV9DUl9UUkFDRV9JT0VOIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBEQkdNQ1VfQ1JfVFJBQ0VfTU9ERV8xKSAvKiE8IFRSQUNFIHBpbiBhc3NpZ25tZW50IGZvciBTeW5jaHJvbm91cyBNb2RlIHdpdGggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBUUkFDRURBVEEgc2l6ZSBvZiAyICovCisjZGVmaW5lIExMX0RCR01DVV9UUkFDRV9TWU5DSF9TSVpFNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoREJHTUNVX0NSX1RSQUNFX0lPRU4gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIERCR01DVV9DUl9UUkFDRV9NT0RFKSAvKiE8IFRSQUNFIHBpbiBhc3NpZ25tZW50IGZvciBTeW5jaHJvbm91cyBNb2RlIHdpdGggYSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VEQVRBIHNpemUgb2YgNCAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgU1lTVEVNX0xMX0VDX0FQQjFfR1JQMV9TVE9QX0lQIERCR01DVSBBUEIxIEdSUDEgU1RPUCBJUAorICogQHsKKyAqLworI2RlZmluZSBMTF9EQkdNQ1VfQVBCMV9HUlAxX1RJTTJfU1RPUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgREJHTUNVX0FQQjFGWlIxX0RCR19USU0yX1NUT1AgLyohPCBUaGUgY291bnRlciBjbG9jayBvZiBUSU0yIGlzIHN0b3BwZWQgd2hlbiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb3JlIGlzIGhhbHRlZCovCisjaWYgZGVmaW5lZChUSU0zKQorI2RlZmluZSBMTF9EQkdNQ1VfQVBCMV9HUlAxX1RJTTNfU1RPUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgREJHTUNVX0FQQjFGWlIxX0RCR19USU0zX1NUT1AgLyohPCBUaGUgY291bnRlciBjbG9jayBvZiBUSU0zIGlzIHN0b3BwZWQgd2hlbiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb3JlIGlzIGhhbHRlZCovCisjZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRJTTMgKi8KKyNpZiBkZWZpbmVkKFRJTTQpCisjZGVmaW5lIExMX0RCR01DVV9BUEIxX0dSUDFfVElNNF9TVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBEQkdNQ1VfQVBCMUZaUjFfREJHX1RJTTRfU1RPUCAvKiE8IFRoZSBjb3VudGVyIGNsb2NrIG9mIFRJTTQgaXMgc3RvcHBlZCB3aGVuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvcmUgaXMgaGFsdGVkKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVElNNCAqLworI2lmIGRlZmluZWQoVElNNSkKKyNkZWZpbmUgTExfREJHTUNVX0FQQjFfR1JQMV9USU01X1NUT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIERCR01DVV9BUEIxRlpSMV9EQkdfVElNNV9TVE9QIC8qITwgVGhlIGNvdW50ZXIgY2xvY2sgb2YgVElNNSBpcyBzdG9wcGVkIHdoZW4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29yZSBpcyBoYWx0ZWQqLworI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUSU01ICovCisjZGVmaW5lIExMX0RCR01DVV9BUEIxX0dSUDFfVElNNl9TVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBEQkdNQ1VfQVBCMUZaUjFfREJHX1RJTTZfU1RPUCAvKiE8IFRoZSBjb3VudGVyIGNsb2NrIG9mIFRJTTYgaXMgc3RvcHBlZCB3aGVuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvcmUgaXMgaGFsdGVkKi8KKyNpZiBkZWZpbmVkKFRJTTcpCisjZGVmaW5lIExMX0RCR01DVV9BUEIxX0dSUDFfVElNN19TVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBEQkdNQ1VfQVBCMUZaUjFfREJHX1RJTTdfU1RPUCAvKiE8IFRoZSBjb3VudGVyIGNsb2NrIG9mIFRJTTcgaXMgc3RvcHBlZCB3aGVuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvcmUgaXMgaGFsdGVkKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVElNNyAqLworI2RlZmluZSBMTF9EQkdNQ1VfQVBCMV9HUlAxX1JUQ19TVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgREJHTUNVX0FQQjFGWlIxX0RCR19SVENfU1RPUCAvKiE8IFRoZSBjbG9jayBvZiB0aGUgUlRDIGNvdW50ZXIgaXMgc3RvcHBlZCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiB0aGUgY29yZSBpcyBoYWx0ZWQqLworI2RlZmluZSBMTF9EQkdNQ1VfQVBCMV9HUlAxX1dXREdfU1RPUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIERCR01DVV9BUEIxRlpSMV9EQkdfV1dER19TVE9QIC8qITwgVGhlIHdpbmRvdyB3YXRjaGRvZyBjb3VudGVyIGNsb2NrIGlzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcHBlZCB3aGVuIHRoZSBjb3JlIGlzIGhhbHRlZCovCisjZGVmaW5lIExMX0RCR01DVV9BUEIxX0dSUDFfSVdER19TVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBEQkdNQ1VfQVBCMUZaUjFfREJHX0lXREdfU1RPUCAvKiE8IFRoZSBpbmRlcGVuZGVudCB3YXRjaGRvZyBjb3VudGVyIGNsb2NrIGlzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcHBlZCB3aGVuIHRoZSBjb3JlIGlzIGhhbHRlZCovCisjZGVmaW5lIExMX0RCR01DVV9BUEIxX0dSUDFfSTJDMV9TVE9QIFwKKyAgREJHTUNVX0FQQjFGWlIxX0RCR19JMkMxX1NUT1AgLyohPCBUaGUgSTJDMSBTTUJ1cyB0aW1lb3V0IGlzIGZyb3plbiovCisjaWYgZGVmaW5lZChJMkMyKQorI2RlZmluZSBMTF9EQkdNQ1VfQVBCMV9HUlAxX0kyQzJfU1RPUCBcCisgIERCR01DVV9BUEIxRlpSMV9EQkdfSTJDMl9TVE9QIC8qITwgVGhlIEkyQzIgU01CdXMgdGltZW91dCBpcyBmcm96ZW4qLworI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJMkMyICovCisjaWYgZGVmaW5lZChJMkMzKQorI2RlZmluZSBMTF9EQkdNQ1VfQVBCMV9HUlAxX0kyQzNfU1RPUCBcCisgIERCR01DVV9BUEIxRlpSMV9EQkdfSTJDM19TVE9QIC8qITwgVGhlIEkyQzMgU01CdXMgdGltZW91dCBpcyBmcm96ZW4qLworI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJMkMzICovCisjZGVmaW5lIExMX0RCR01DVV9BUEIxX0dSUDFfTFBUSU0xX1NUT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIERCR01DVV9BUEIxRlpSMV9EQkdfTFBUSU0xX1NUT1AgLyohPCBUaGUgY291bnRlciBjbG9jayBvZiBMUFRJTTEgaXMgc3RvcHBlZCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiB0aGUgY29yZSBpcyBoYWx0ZWQqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgU1lTVEVNX0xMX0VDX0FQQjFfR1JQMl9TVE9QX0lQIERCR01DVSBBUEIxIEdSUDIgU1RPUCBJUAorICogQHsKKyAqLworI2lmIGRlZmluZWQoSTJDNCkKKyNkZWZpbmUgTExfREJHTUNVX0FQQjFfR1JQMl9JMkM0X1NUT1AgXAorICBEQkdNQ1VfQVBCMUZaUjJfREJHX0kyQzRfU1RPUCAvKiE8IFRoZSBJMkM0IFNNQnVzIHRpbWVvdXQgaXMgZnJvemVuKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSTJDNCAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgU1lTVEVNX0xMX0VDX0FQQjJfR1JQMV9TVE9QX0lQIERCR01DVSBBUEIyIEdSUDEgU1RPUCBJUAorICogQHsKKyAqLworI2RlZmluZSBMTF9EQkdNQ1VfQVBCMl9HUlAxX1RJTTFfU1RPUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIERCR01DVV9BUEIyRlpfREJHX1RJTTFfU1RPUCAvKiE8IFRoZSBjb3VudGVyIGNsb2NrIG9mIFRJTTEgaXMgc3RvcHBlZCB3aGVuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb3JlIGlzIGhhbHRlZCovCisjaWYgZGVmaW5lZChUSU04KQorI2RlZmluZSBMTF9EQkdNQ1VfQVBCMl9HUlAxX1RJTThfU1RPUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIERCR01DVV9BUEIyRlpfREJHX1RJTThfU1RPUCAvKiE8IFRoZSBjb3VudGVyIGNsb2NrIG9mIFRJTTggaXMgc3RvcHBlZCB3aGVuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb3JlIGlzIGhhbHRlZCovCisjZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAvKiBUSU04ICovCisjZGVmaW5lIExMX0RCR01DVV9BUEIyX0dSUDFfVElNMTVfU1RPUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBEQkdNQ1VfQVBCMkZaX0RCR19USU0xNV9TVE9QIC8qITwgVGhlIGNvdW50ZXIgY2xvY2sgb2YgVElNMTUgaXMgc3RvcHBlZCB3aGVuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29yZSBpcyBoYWx0ZWQqLworI2RlZmluZSBMTF9EQkdNQ1VfQVBCMl9HUlAxX1RJTTE2X1NUT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgREJHTUNVX0FQQjJGWl9EQkdfVElNMTZfU1RPUCAvKiE8IFRoZSBjb3VudGVyIGNsb2NrIG9mIFRJTTE2IGlzIHN0b3BwZWQgd2hlbiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvcmUgaXMgaGFsdGVkKi8KKyNpZiBkZWZpbmVkKFRJTTE3KQorI2RlZmluZSBMTF9EQkdNQ1VfQVBCMl9HUlAxX1RJTTE3X1NUT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgREJHTUNVX0FQQjJGWl9EQkdfVElNMTdfU1RPUCAvKiE8IFRoZSBjb3VudGVyIGNsb2NrIG9mIFRJTTE3IGlzIHN0b3BwZWQgd2hlbiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvcmUgaXMgaGFsdGVkKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUSU0xNyAqLworI2lmIGRlZmluZWQoVElNMjApCisjZGVmaW5lIExMX0RCR01DVV9BUEIyX0dSUDFfVElNMjBfU1RPUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBEQkdNQ1VfQVBCMkZaX0RCR19USU0yMF9TVE9QIC8qITwgVGhlIGNvdW50ZXIgY2xvY2sgb2YgVElNMjAgaXMgc3RvcHBlZCB3aGVuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29yZSBpcyBoYWx0ZWQqLworI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRJTTIwICovCisjaWYgZGVmaW5lZChIUlRJTTEpCisjZGVmaW5lIExMX0RCR01DVV9BUEIyX0dSUDFfSFJUSU0xX1NUT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBEQkdNQ1VfQVBCMkZaX0RCR19IUlRJTTFfU1RPUCAvKiE8IFRoZSBjb3VudGVyIGNsb2NrIG9mIEhSVElNMSBpcyBzdG9wcGVkIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiB0aGUgY29yZSBpcyBoYWx0ZWQqLworI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBIUlRJTTEgKi8KKy8qKgorICogQH0KKyAqLworCisjaWYgZGVmaW5lZChWUkVGQlVGKQorLyoqIEBkZWZncm91cCBTWVNURU1fTExfRUNfVk9MVEFHRSBWUkVGQlVGIFZPTFRBR0UKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfVlJFRkJVRl9WT0xUQUdFX1NDQUxFMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgodWludDMyX3QpMHgwMDAwMDAwMCkgLyohPCBWb2x0YWdlIHJlZmVyZW5jZSBzY2FsZSAwIChWUkVGQlVGX09VVCA9IDIuMDQ4VikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9WUkVGQlVGX1ZPTFRBR0VfU0NBTEUxIFwKKyAgVlJFRkJVRl9DU1JfVlJTXzAgLyohPCBWb2x0YWdlIHJlZmVyZW5jZSBzY2FsZSAxIChWUkVGQlVGX09VVCA9IDIuNVYpICAgKi8KKyNkZWZpbmUgTExfVlJFRkJVRl9WT0xUQUdFX1NDQUxFMiBcCisgIFZSRUZCVUZfQ1NSX1ZSU18xIC8qITwgVm9sdGFnZSByZWZlcmVuY2Ugc2NhbGUgMiAoVlJFRkJVRl9PVVQgPSAyLjlWKSAgICovCisvKioKKyAqIEB9CisgKi8KKyNlbmRpZiAvKiBWUkVGQlVGICovCisKKy8qKiBAZGVmZ3JvdXAgU1lTVEVNX0xMX0VDX0xBVEVOQ1kgRkxBU0ggTEFURU5DWQorICogQHsKKyAqLworI2RlZmluZSBMTF9GTEFTSF9MQVRFTkNZXzAgRkxBU0hfQUNSX0xBVEVOQ1lfMFdTIC8qITwgRkxBU0ggWmVybyB3YWl0IHN0YXRlICovCisjZGVmaW5lIExMX0ZMQVNIX0xBVEVOQ1lfMSBGTEFTSF9BQ1JfTEFURU5DWV8xV1MgLyohPCBGTEFTSCBPbmUgd2FpdCBzdGF0ZSAqLworI2RlZmluZSBMTF9GTEFTSF9MQVRFTkNZXzIgRkxBU0hfQUNSX0xBVEVOQ1lfMldTIC8qITwgRkxBU0ggVHdvIHdhaXQgc3RhdGVzICovCisjZGVmaW5lIExMX0ZMQVNIX0xBVEVOQ1lfMyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRkxBU0hfQUNSX0xBVEVOQ1lfM1dTIC8qITwgRkxBU0ggVGhyZWUgd2FpdCBzdGF0ZXMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0ZMQVNIX0xBVEVOQ1lfNCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBGTEFTSF9BQ1JfTEFURU5DWV80V1MgLyohPCBGTEFTSCBGb3VyIHdhaXQgc3RhdGVzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2lmIGRlZmluZWQoRkxBU0hfQUNSX0xBVEVOQ1lfNVdTKQorI2RlZmluZSBMTF9GTEFTSF9MQVRFTkNZXzUgRkxBU0hfQUNSX0xBVEVOQ1lfNVdTIC8qITwgRkxBU0ggZml2ZSB3YWl0IHN0YXRlICovCisjZGVmaW5lIExMX0ZMQVNIX0xBVEVOQ1lfNiBGTEFTSF9BQ1JfTEFURU5DWV82V1MgLyohPCBGTEFTSCBzaXggd2FpdCBzdGF0ZSAqLworI2RlZmluZSBMTF9GTEFTSF9MQVRFTkNZXzcgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEZMQVNIX0FDUl9MQVRFTkNZXzdXUyAvKiE8IEZMQVNIIHNldmVuIHdhaXQgc3RhdGVzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9GTEFTSF9MQVRFTkNZXzggICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEZMQVNIX0FDUl9MQVRFTkNZXzhXUyAvKiE8IEZMQVNIIGVpZ2h0IHdhaXQgc3RhdGVzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9GTEFTSF9MQVRFTkNZXzkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRkxBU0hfQUNSX0xBVEVOQ1lfOVdTIC8qITwgRkxBU0ggbmluZSB3YWl0IHN0YXRlcyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfRkxBU0hfTEFURU5DWV8xMCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEZMQVNIX0FDUl9MQVRFTkNZXzEwV1MgLyohPCBGTEFTSCB0ZW4gd2FpdCBzdGF0ZXMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9GTEFTSF9MQVRFTkNZXzExIFwKKyAgRkxBU0hfQUNSX0xBVEVOQ1lfMTFXUyAvKiE8IEZMQVNIIGVsZXZlbiB3YWl0IHN0YXRlcyAqLworI2RlZmluZSBMTF9GTEFTSF9MQVRFTkNZXzEyIFwKKyAgRkxBU0hfQUNSX0xBVEVOQ1lfMTJXUyAvKiE8IEZMQVNIIHR3ZWx2ZSB3YWl0IHN0YXRlcyAqLworI2RlZmluZSBMTF9GTEFTSF9MQVRFTkNZXzEzIFwKKyAgRkxBU0hfQUNSX0xBVEVOQ1lfMTNXUyAvKiE8IEZMQVNIIHRoaXJ0ZWVuIHdhaXQgc3RhdGVzICovCisjZGVmaW5lIExMX0ZMQVNIX0xBVEVOQ1lfMTQgXAorICBGTEFTSF9BQ1JfTEFURU5DWV8xNFdTIC8qITwgRkxBU0ggZm91cnRlZW4gd2FpdCBzdGF0ZXMgKi8KKyNkZWZpbmUgTExfRkxBU0hfTEFURU5DWV8xNSBcCisgIEZMQVNIX0FDUl9MQVRFTkNZXzE1V1MgLyohPCBGTEFTSCBmaWZ0ZWVuIHdhaXQgc3RhdGVzICovCisjZW5kaWYgICAgICAgICAgICAgICAgICAgLyogRkxBU0hfQUNSX0xBVEVOQ1lfNVdTICovCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFNZU1RFTV9MTF9FeHBvcnRlZF9GdW5jdGlvbnMgU1lTVEVNIEV4cG9ydGVkIEZ1bmN0aW9ucworICogQHsKKyAqLworCisvKiogQGRlZmdyb3VwIFNZU1RFTV9MTF9FRl9TWVNDRkcgU1lTQ0ZHCisgKiBAeworICovCisKKy8qKgorICogQGJyaWVmICBTZXQgbWVtb3J5IG1hcHBpbmcgYXQgYWRkcmVzcyAweDAwMDAwMDAwCisgKiBAcm10b2xsIFNZU0NGR19NRU1STVAgTUVNX01PREUgICAgICBMTF9TWVNDRkdfU2V0UmVtYXBNZW1vcnkKKyAqIEBwYXJhbSAgTWVtb3J5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfUkVNQVBfRkxBU0gKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19SRU1BUF9TWVNURU1GTEFTSAorICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1JFTUFQX1NSQU0KKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19SRU1BUF9GTUMgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfUkVNQVBfUVVBRFNQSSAoKikKKyAqCisgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcworICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU0NGR19TZXRSZW1hcE1lbW9yeSh1aW50MzJfdCBNZW1vcnkpIHsKKyAgTU9ESUZZX1JFRyhTWVNDRkctPk1FTVJNUCwgU1lTQ0ZHX01FTVJNUF9NRU1fTU9ERSwgTWVtb3J5KTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBtZW1vcnkgbWFwcGluZyBhdCBhZGRyZXNzIDB4MDAwMDAwMDAKKyAqIEBybXRvbGwgU1lTQ0ZHX01FTVJNUCBNRU1fTU9ERSAgICAgIExMX1NZU0NGR19HZXRSZW1hcE1lbW9yeQorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1JFTUFQX0ZMQVNICisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfUkVNQVBfU1lTVEVNRkxBU0gKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19SRU1BUF9TUkFNCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfUkVNQVBfRk1DICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1JFTUFQX1FVQURTUEkgKCopCisgKgorICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU0NGR19HZXRSZW1hcE1lbW9yeSh2b2lkKSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFNZU0NGRy0+TUVNUk1QLCBTWVNDRkdfTUVNUk1QX01FTV9NT0RFKSk7Cit9CisKKyNpZiBkZWZpbmVkKFNZU0NGR19NRU1STVBfRkJfTU9ERSkKKy8qKgorICogQGJyaWVmICBTZWxlY3QgRmxhc2ggYmFuayBtb2RlIChCYW5rIGZsYXNoZWQgYXQgMHgwODAwMDAwMCkKKyAqIEBybXRvbGwgU1lTQ0ZHX01FTVJNUCBGQl9NT0RFICAgICAgIExMX1NZU0NGR19TZXRGbGFzaEJhbmtNb2RlCisgKiBAcGFyYW0gIEJhbmsgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19CQU5LTU9ERV9CQU5LMQorICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0JBTktNT0RFX0JBTksyCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTQ0ZHX1NldEZsYXNoQmFua01vZGUodWludDMyX3QgQmFuaykgeworICBNT0RJRllfUkVHKFNZU0NGRy0+TUVNUk1QLCBTWVNDRkdfTUVNUk1QX0ZCX01PREUsIEJhbmspOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IEZsYXNoIGJhbmsgbW9kZSAoQmFuayBmbGFzaGVkIGF0IDB4MDgwMDAwMDApCisgKiBAcm10b2xsIFNZU0NGR19NRU1STVAgRkJfTU9ERSAgICAgICBMTF9TWVNDRkdfR2V0Rmxhc2hCYW5rTW9kZQorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0JBTktNT0RFX0JBTksxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfQkFOS01PREVfQkFOSzIKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU0NGR19HZXRGbGFzaEJhbmtNb2RlKHZvaWQpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoU1lTQ0ZHLT5NRU1STVAsIFNZU0NGR19NRU1STVBfRkJfTU9ERSkpOworfQorI2VuZGlmIC8qIFNZU0NGR19NRU1STVBfRkJfTU9ERSAqLworCisvKioKKyAqIEBicmllZiAgRW5hYmxlIEkvTyBhbmFsb2cgc3dpdGNoIHZvbHRhZ2UgYm9vc3Rlci4KKyAqIEBub3RlICAgV2hlbiB2b2x0YWdlIGJvb3N0ZXIgaXMgZW5hYmxlZCwgSS9PIGFuYWxvZyBzd2l0Y2hlcyBhcmUgc3VwcGxpZWQKKyAqICAgICAgICAgYnkgYSBkZWRpY2F0ZWQgdm9sdGFnZSBib29zdGVyLCBmcm9tIFZERCBwb3dlciBkb21haW4uIFRoaXMgaXMKKyAqICAgICAgICAgdGhlIHJlY29tbWVuZGVkIGNvbmZpZ3VyYXRpb24gd2l0aCBsb3cgVkREQSB2b2x0YWdlIG9wZXJhdGlvbi4KKyAqIEBub3RlICAgVGhlIEkvTyBhbmFsb2cgc3dpdGNoIHZvbHRhZ2UgYm9vc3RlciBpcyByZWxldmFudCBmb3IgcGVyaXBoZXJhbHMKKyAqICAgICAgICAgdXNpbmcgSS9PIGluIGFuYWxvZyBpbnB1dDogQURDLCBDT01QLCBPUEFNUC4KKyAqICAgICAgICAgSG93ZXZlciwgQ09NUCBhbmQgT1BBTVAgaW5wdXRzIGhhdmUgYSBoaWdoIGltcGVkYW5jZSBhbmQKKyAqICAgICAgICAgdm9sdGFnZSBib29zdGVyIGRvIG5vdCBpbXBhY3QgcGVyZm9ybWFuY2Ugc2lnbmlmaWNhbnRseS4KKyAqICAgICAgICAgVGhlcmVmb3JlLCB0aGUgdm9sdGFnZSBib29zdGVyIGlzIG1haW5seSBpbnRlbmRlZCBmb3IKKyAqICAgICAgICAgdXNhZ2Ugd2l0aCBBREMuCisgKiBAcm10b2xsIFNZU0NGR19DRkdSMSBCT09TVEVOICAgICAgIExMX1NZU0NGR19FbmFibGVBbmFsb2dCb29zdGVyCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTQ0ZHX0VuYWJsZUFuYWxvZ0Jvb3N0ZXIodm9pZCkgeworICBTRVRfQklUKFNZU0NGRy0+Q0ZHUjEsIFNZU0NGR19DRkdSMV9CT09TVEVOKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgSS9PIGFuYWxvZyBzd2l0Y2ggdm9sdGFnZSBib29zdGVyLgorICogQG5vdGUgICBXaGVuIHZvbHRhZ2UgYm9vc3RlciBpcyBlbmFibGVkLCBJL08gYW5hbG9nIHN3aXRjaGVzIGFyZSBzdXBwbGllZAorICogICAgICAgICBieSBhIGRlZGljYXRlZCB2b2x0YWdlIGJvb3N0ZXIsIGZyb20gVkREIHBvd2VyIGRvbWFpbi4gVGhpcyBpcworICogICAgICAgICB0aGUgcmVjb21tZW5kZWQgY29uZmlndXJhdGlvbiB3aXRoIGxvdyBWRERBIHZvbHRhZ2Ugb3BlcmF0aW9uLgorICogQG5vdGUgICBUaGUgSS9PIGFuYWxvZyBzd2l0Y2ggdm9sdGFnZSBib29zdGVyIGlzIHJlbGV2YW50IGZvciBwZXJpcGhlcmFscworICogICAgICAgICB1c2luZyBJL08gaW4gYW5hbG9nIGlucHV0OiBBREMsIENPTVAsIE9QQU1QLgorICogICAgICAgICBIb3dldmVyLCBDT01QIGFuZCBPUEFNUCBpbnB1dHMgaGF2ZSBhIGhpZ2ggaW1wZWRhbmNlIGFuZAorICogICAgICAgICB2b2x0YWdlIGJvb3N0ZXIgZG8gbm90IGltcGFjdCBwZXJmb3JtYW5jZSBzaWduaWZpY2FudGx5LgorICogICAgICAgICBUaGVyZWZvcmUsIHRoZSB2b2x0YWdlIGJvb3N0ZXIgaXMgbWFpbmx5IGludGVuZGVkIGZvcgorICogICAgICAgICB1c2FnZSB3aXRoIEFEQy4KKyAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IxIEJPT1NURU4gICAgICAgTExfU1lTQ0ZHX0Rpc2FibGVBbmFsb2dCb29zdGVyCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTQ0ZHX0Rpc2FibGVBbmFsb2dCb29zdGVyKHZvaWQpIHsKKyAgQ0xFQVJfQklUKFNZU0NGRy0+Q0ZHUjEsIFNZU0NGR19DRkdSMV9CT09TVEVOKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSB0aGUgSTJDIGZhc3QgbW9kZSBwbHVzIGRyaXZpbmcgY2FwYWJpbGl0eS4KKyAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IxIEkyQ19QQnhfRk1QICAgTExfU1lTQ0ZHX0VuYWJsZUZhc3RNb2RlUGx1c1xuCisgKiAgICAgICAgIFNZU0NGR19DRkdSMSBJMkN4X0ZNUCAgICAgIExMX1NZU0NGR19FbmFibGVGYXN0TW9kZVBsdXMKKyAqIEBwYXJhbSAgQ29uZmlnRmFzdE1vZGVQbHVzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZQorICogZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19JMkNfRkFTVE1PREVQTFVTX1BCNgorICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0kyQ19GQVNUTU9ERVBMVVNfUEI3CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19QQjggKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19QQjkgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19JMkMxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19JMkMyICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0kyQ19GQVNUTU9ERVBMVVNfSTJDMworICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0kyQ19GQVNUTU9ERVBMVVNfSTJDNCAoKikKKyAqCisgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcworICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU0NGR19FbmFibGVGYXN0TW9kZVBsdXModWludDMyX3QgQ29uZmlnRmFzdE1vZGVQbHVzKSB7CisgIFNFVF9CSVQoU1lTQ0ZHLT5DRkdSMSwgQ29uZmlnRmFzdE1vZGVQbHVzKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgdGhlIEkyQyBmYXN0IG1vZGUgcGx1cyBkcml2aW5nIGNhcGFiaWxpdHkuCisgKiBAcm10b2xsIFNZU0NGR19DRkdSMSBJMkNfUEJ4X0ZNUCAgIExMX1NZU0NGR19EaXNhYmxlRmFzdE1vZGVQbHVzXG4KKyAqICAgICAgICAgU1lTQ0ZHX0NGR1IxIEkyQ3hfRk1QICAgICAgTExfU1lTQ0ZHX0Rpc2FibGVGYXN0TW9kZVBsdXMKKyAqIEBwYXJhbSAgQ29uZmlnRmFzdE1vZGVQbHVzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZQorICogZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19JMkNfRkFTVE1PREVQTFVTX1BCNgorICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0kyQ19GQVNUTU9ERVBMVVNfUEI3CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19QQjggKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19QQjkgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19JMkMxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19JMkMyICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0kyQ19GQVNUTU9ERVBMVVNfSTJDMworICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0kyQ19GQVNUTU9ERVBMVVNfSTJDNCAoKikKKyAqCisgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcworICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU0NGR19EaXNhYmxlRmFzdE1vZGVQbHVzKAorICAgIHVpbnQzMl90IENvbmZpZ0Zhc3RNb2RlUGx1cykgeworICBDTEVBUl9CSVQoU1lTQ0ZHLT5DRkdSMSwgQ29uZmlnRmFzdE1vZGVQbHVzKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBGbG9hdGluZyBQb2ludCBVbml0IEludmFsaWQgb3BlcmF0aW9uIEludGVycnVwdAorICogQHJtdG9sbCBTWVNDRkdfQ0ZHUjEgRlBVX0lFXzAgICAgICBMTF9TWVNDRkdfRW5hYmxlSVRfRlBVX0lPQworICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU0NGR19FbmFibGVJVF9GUFVfSU9DKHZvaWQpIHsKKyAgU0VUX0JJVChTWVNDRkctPkNGR1IxLCBTWVNDRkdfQ0ZHUjFfRlBVX0lFXzApOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIEZsb2F0aW5nIFBvaW50IFVuaXQgRGl2aWRlLWJ5LXplcm8gSW50ZXJydXB0CisgKiBAcm10b2xsIFNZU0NGR19DRkdSMSBGUFVfSUVfMSAgICAgIExMX1NZU0NGR19FbmFibGVJVF9GUFVfRFpDCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTQ0ZHX0VuYWJsZUlUX0ZQVV9EWkModm9pZCkgeworICBTRVRfQklUKFNZU0NGRy0+Q0ZHUjEsIFNZU0NGR19DRkdSMV9GUFVfSUVfMSk7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgRmxvYXRpbmcgUG9pbnQgVW5pdCBVbmRlcmZsb3cgSW50ZXJydXB0CisgKiBAcm10b2xsIFNZU0NGR19DRkdSMSBGUFVfSUVfMiAgICAgIExMX1NZU0NGR19FbmFibGVJVF9GUFVfVUZDCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTQ0ZHX0VuYWJsZUlUX0ZQVV9VRkModm9pZCkgeworICBTRVRfQklUKFNZU0NGRy0+Q0ZHUjEsIFNZU0NGR19DRkdSMV9GUFVfSUVfMik7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgRmxvYXRpbmcgUG9pbnQgVW5pdCBPdmVyZmxvdyBJbnRlcnJ1cHQKKyAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IxIEZQVV9JRV8zICAgICAgTExfU1lTQ0ZHX0VuYWJsZUlUX0ZQVV9PRkMKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TWVNDRkdfRW5hYmxlSVRfRlBVX09GQyh2b2lkKSB7CisgIFNFVF9CSVQoU1lTQ0ZHLT5DRkdSMSwgU1lTQ0ZHX0NGR1IxX0ZQVV9JRV8zKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBGbG9hdGluZyBQb2ludCBVbml0IElucHV0IGRlbm9ybWFsIEludGVycnVwdAorICogQHJtdG9sbCBTWVNDRkdfQ0ZHUjEgRlBVX0lFXzQgICAgICBMTF9TWVNDRkdfRW5hYmxlSVRfRlBVX0lEQworICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU0NGR19FbmFibGVJVF9GUFVfSURDKHZvaWQpIHsKKyAgU0VUX0JJVChTWVNDRkctPkNGR1IxLCBTWVNDRkdfQ0ZHUjFfRlBVX0lFXzQpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIEZsb2F0aW5nIFBvaW50IFVuaXQgSW5leGFjdCBJbnRlcnJ1cHQKKyAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IxIEZQVV9JRV81ICAgICAgTExfU1lTQ0ZHX0VuYWJsZUlUX0ZQVV9JWEMKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TWVNDRkdfRW5hYmxlSVRfRlBVX0lYQyh2b2lkKSB7CisgIFNFVF9CSVQoU1lTQ0ZHLT5DRkdSMSwgU1lTQ0ZHX0NGR1IxX0ZQVV9JRV81KTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgRmxvYXRpbmcgUG9pbnQgVW5pdCBJbnZhbGlkIG9wZXJhdGlvbiBJbnRlcnJ1cHQKKyAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IxIEZQVV9JRV8wICAgICAgTExfU1lTQ0ZHX0Rpc2FibGVJVF9GUFVfSU9DCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTQ0ZHX0Rpc2FibGVJVF9GUFVfSU9DKHZvaWQpIHsKKyAgQ0xFQVJfQklUKFNZU0NGRy0+Q0ZHUjEsIFNZU0NGR19DRkdSMV9GUFVfSUVfMCk7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIEZsb2F0aW5nIFBvaW50IFVuaXQgRGl2aWRlLWJ5LXplcm8gSW50ZXJydXB0CisgKiBAcm10b2xsIFNZU0NGR19DRkdSMSBGUFVfSUVfMSAgICAgIExMX1NZU0NGR19EaXNhYmxlSVRfRlBVX0RaQworICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU0NGR19EaXNhYmxlSVRfRlBVX0RaQyh2b2lkKSB7CisgIENMRUFSX0JJVChTWVNDRkctPkNGR1IxLCBTWVNDRkdfQ0ZHUjFfRlBVX0lFXzEpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBGbG9hdGluZyBQb2ludCBVbml0IFVuZGVyZmxvdyBJbnRlcnJ1cHQKKyAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IxIEZQVV9JRV8yICAgICAgTExfU1lTQ0ZHX0Rpc2FibGVJVF9GUFVfVUZDCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTQ0ZHX0Rpc2FibGVJVF9GUFVfVUZDKHZvaWQpIHsKKyAgQ0xFQVJfQklUKFNZU0NGRy0+Q0ZHUjEsIFNZU0NGR19DRkdSMV9GUFVfSUVfMik7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIEZsb2F0aW5nIFBvaW50IFVuaXQgT3ZlcmZsb3cgSW50ZXJydXB0CisgKiBAcm10b2xsIFNZU0NGR19DRkdSMSBGUFVfSUVfMyAgICAgIExMX1NZU0NGR19EaXNhYmxlSVRfRlBVX09GQworICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU0NGR19EaXNhYmxlSVRfRlBVX09GQyh2b2lkKSB7CisgIENMRUFSX0JJVChTWVNDRkctPkNGR1IxLCBTWVNDRkdfQ0ZHUjFfRlBVX0lFXzMpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBGbG9hdGluZyBQb2ludCBVbml0IElucHV0IGRlbm9ybWFsIEludGVycnVwdAorICogQHJtdG9sbCBTWVNDRkdfQ0ZHUjEgRlBVX0lFXzQgICAgICBMTF9TWVNDRkdfRGlzYWJsZUlUX0ZQVV9JREMKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TWVNDRkdfRGlzYWJsZUlUX0ZQVV9JREModm9pZCkgeworICBDTEVBUl9CSVQoU1lTQ0ZHLT5DRkdSMSwgU1lTQ0ZHX0NGR1IxX0ZQVV9JRV80KTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgRmxvYXRpbmcgUG9pbnQgVW5pdCBJbmV4YWN0IEludGVycnVwdAorICogQHJtdG9sbCBTWVNDRkdfQ0ZHUjEgRlBVX0lFXzUgICAgICBMTF9TWVNDRkdfRGlzYWJsZUlUX0ZQVV9JWEMKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TWVNDRkdfRGlzYWJsZUlUX0ZQVV9JWEModm9pZCkgeworICBDTEVBUl9CSVQoU1lTQ0ZHLT5DRkdSMSwgU1lTQ0ZHX0NGR1IxX0ZQVV9JRV81KTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIEZsb2F0aW5nIFBvaW50IFVuaXQgSW52YWxpZCBvcGVyYXRpb24gSW50ZXJydXB0IHNvdXJjZSBpcworICogZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IxIEZQVV9JRV8wICAgICAgTExfU1lTQ0ZHX0lzRW5hYmxlZElUX0ZQVV9JT0MKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1lTQ0ZHX0lzRW5hYmxlZElUX0ZQVV9JT0Modm9pZCkgeworICByZXR1cm4gKChSRUFEX0JJVChTWVNDRkctPkNGR1IxLCBTWVNDRkdfQ0ZHUjFfRlBVX0lFXzApID09CisgICAgICAgICAgIChTWVNDRkdfQ0ZHUjFfRlBVX0lFXzApKQorICAgICAgICAgICAgICA/IDFVTAorICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiBGbG9hdGluZyBQb2ludCBVbml0IERpdmlkZS1ieS16ZXJvIEludGVycnVwdCBzb3VyY2UgaXMKKyAqIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgKiBAcm10b2xsIFNZU0NGR19DRkdSMSBGUFVfSUVfMSAgICAgIExMX1NZU0NGR19Jc0VuYWJsZWRJVF9GUFVfRFpDCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU0NGR19Jc0VuYWJsZWRJVF9GUFVfRFpDKHZvaWQpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoU1lTQ0ZHLT5DRkdSMSwgU1lTQ0ZHX0NGR1IxX0ZQVV9JRV8xKSA9PQorICAgICAgICAgICAoU1lTQ0ZHX0NGR1IxX0ZQVV9JRV8xKSkKKyAgICAgICAgICAgICAgPyAxVUwKKyAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgRmxvYXRpbmcgUG9pbnQgVW5pdCBVbmRlcmZsb3cgSW50ZXJydXB0IHNvdXJjZSBpcyBlbmFibGVkIG9yCisgKiBkaXNhYmxlZC4KKyAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IxIEZQVV9JRV8yICAgICAgTExfU1lTQ0ZHX0lzRW5hYmxlZElUX0ZQVV9VRkMKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1lTQ0ZHX0lzRW5hYmxlZElUX0ZQVV9VRkModm9pZCkgeworICByZXR1cm4gKChSRUFEX0JJVChTWVNDRkctPkNGR1IxLCBTWVNDRkdfQ0ZHUjFfRlBVX0lFXzIpID09CisgICAgICAgICAgIChTWVNDRkdfQ0ZHUjFfRlBVX0lFXzIpKQorICAgICAgICAgICAgICA/IDFVTAorICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiBGbG9hdGluZyBQb2ludCBVbml0IE92ZXJmbG93IEludGVycnVwdCBzb3VyY2UgaXMgZW5hYmxlZCBvcgorICogZGlzYWJsZWQuCisgKiBAcm10b2xsIFNZU0NGR19DRkdSMSBGUFVfSUVfMyAgICAgIExMX1NZU0NGR19Jc0VuYWJsZWRJVF9GUFVfT0ZDCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU0NGR19Jc0VuYWJsZWRJVF9GUFVfT0ZDKHZvaWQpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoU1lTQ0ZHLT5DRkdSMSwgU1lTQ0ZHX0NGR1IxX0ZQVV9JRV8zKSA9PQorICAgICAgICAgICAoU1lTQ0ZHX0NGR1IxX0ZQVV9JRV8zKSkKKyAgICAgICAgICAgICAgPyAxVUwKKyAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgRmxvYXRpbmcgUG9pbnQgVW5pdCBJbnB1dCBkZW5vcm1hbCBJbnRlcnJ1cHQgc291cmNlIGlzCisgKiBlbmFibGVkIG9yIGRpc2FibGVkLgorICogQHJtdG9sbCBTWVNDRkdfQ0ZHUjEgRlBVX0lFXzQgICAgICBMTF9TWVNDRkdfSXNFbmFibGVkSVRfRlBVX0lEQworICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TWVNDRkdfSXNFbmFibGVkSVRfRlBVX0lEQyh2b2lkKSB7CisgIHJldHVybiAoKFJFQURfQklUKFNZU0NGRy0+Q0ZHUjEsIFNZU0NGR19DRkdSMV9GUFVfSUVfNCkgPT0KKyAgICAgICAgICAgKFNZU0NGR19DRkdSMV9GUFVfSUVfNCkpCisgICAgICAgICAgICAgID8gMVVMCisgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIEZsb2F0aW5nIFBvaW50IFVuaXQgSW5leGFjdCBJbnRlcnJ1cHQgc291cmNlIGlzIGVuYWJsZWQgb3IKKyAqIGRpc2FibGVkLgorICogQHJtdG9sbCBTWVNDRkdfQ0ZHUjEgRlBVX0lFXzUgICAgICBMTF9TWVNDRkdfSXNFbmFibGVkSVRfRlBVX0lYQworICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TWVNDRkdfSXNFbmFibGVkSVRfRlBVX0lYQyh2b2lkKSB7CisgIHJldHVybiAoKFJFQURfQklUKFNZU0NGRy0+Q0ZHUjEsIFNZU0NGR19DRkdSMV9GUFVfSUVfNSkgPT0KKyAgICAgICAgICAgKFNZU0NGR19DRkdSMV9GUFVfSUVfNSkpCisgICAgICAgICAgICAgID8gMVVMCisgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENvbmZpZ3VyZSBzb3VyY2UgaW5wdXQgZm9yIHRoZSBFWFRJIGV4dGVybmFsIGludGVycnVwdC4KKyAqIEBybXRvbGwgU1lTQ0ZHX0VYVElDUjEgRVhUSXggICAgICAgICBMTF9TWVNDRkdfU2V0RVhUSVNvdXJjZVxuCisgKiAgICAgICAgIFNZU0NGR19FWFRJQ1IyIEVYVEl4ICAgICAgICAgTExfU1lTQ0ZHX1NldEVYVElTb3VyY2VcbgorICogICAgICAgICBTWVNDRkdfRVhUSUNSMyBFWFRJeCAgICAgICAgIExMX1NZU0NGR19TZXRFWFRJU291cmNlXG4KKyAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjQgRVhUSXggICAgICAgICBMTF9TWVNDRkdfU2V0RVhUSVNvdXJjZQorICogQHBhcmFtICBQb3J0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9QT1JUQQorICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfUE9SVEIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX1BPUlRDCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9QT1JURAorICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfUE9SVEUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX1BPUlRGCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9QT1JURworICoKKyAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzCisgKiBAcGFyYW0gIExpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkUwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9MSU5FMQorICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfTElORTIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkUzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9MSU5FNAorICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfTElORTUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkU2CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9MSU5FNworICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfTElORTgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkU5CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9MSU5FMTAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkUxMQorICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfTElORTEyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9MSU5FMTMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkUxNAorICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfTElORTE1CisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTQ0ZHX1NldEVYVElTb3VyY2UodWludDMyX3QgUG9ydCwgdWludDMyX3QgTGluZSkgeworICBNT0RJRllfUkVHKFNZU0NGRy0+RVhUSUNSW0xpbmUgJiAweDNVXSwgKExpbmUgPj4gMTZVKSwKKyAgICAgICAgICAgICBQb3J0IDw8IChQT1NJVElPTl9WQUwoKExpbmUgPj4gMTZVKSkgJiAweDFGVSkpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IHRoZSBjb25maWd1cmVkIGRlZmluZWQgZm9yIHNwZWNpZmljIEVYVEkgTGluZQorICogQHJtdG9sbCBTWVNDRkdfRVhUSUNSMSBFWFRJeCAgICAgICAgIExMX1NZU0NGR19HZXRFWFRJU291cmNlXG4KKyAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjIgRVhUSXggICAgICAgICBMTF9TWVNDRkdfR2V0RVhUSVNvdXJjZVxuCisgKiAgICAgICAgIFNZU0NGR19FWFRJQ1IzIEVYVEl4ICAgICAgICAgTExfU1lTQ0ZHX0dldEVYVElTb3VyY2VcbgorICogICAgICAgICBTWVNDRkdfRVhUSUNSNCBFWFRJeCAgICAgICAgIExMX1NZU0NGR19HZXRFWFRJU291cmNlCisgKiBAcGFyYW0gIExpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkUwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9MSU5FMQorICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfTElORTIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkUzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9MSU5FNAorICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfTElORTUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkU2CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9MSU5FNworICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfTElORTgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkU5CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9MSU5FMTAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkUxMQorICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfTElORTEyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9MSU5FMTMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkUxNAorICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfTElORTE1CisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9QT1JUQQorICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfUE9SVEIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX1BPUlRDCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9QT1JURAorICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfUE9SVEUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX1BPUlRGCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9QT1JURworICoKKyAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TWVNDRkdfR2V0RVhUSVNvdXJjZSh1aW50MzJfdCBMaW5lKSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFNZU0NGRy0+RVhUSUNSW0xpbmUgJiAweDNVXSwgKExpbmUgPj4gMTZVKSkgPj4KKyAgICAgICAgICAgICAgICAgICAgKFBPU0lUSU9OX1ZBTChMaW5lID4+IDE2VSkgJiAweDFGVSkpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIENDTVNSQU0gRXJhc2UgKHN0YXJ0cyBhIGhhcmR3YXJlIENDTVNSQU0gZXJhc2Ugb3BlcmF0aW9uLiBUaGlzCisgKiBiaXQgaXMgYXV0b21hdGljYWxseSBjbGVhcmVkIGF0IHRoZSBlbmQgb2YgdGhlIENDTVNSQU0gZXJhc2Ugb3BlcmF0aW9uLikKKyAqIEBub3RlIFRoaXMgYml0IGlzIHdyaXRlLXByb3RlY3RlZDogc2V0dGluZyB0aGlzIGJpdCBpcyBwb3NzaWJsZSBvbmx5IGFmdGVyCisgKiB0aGUgY29ycmVjdCBrZXkgc2VxdWVuY2UgaXMgd3JpdHRlbiBpbiB0aGUgU1lTQ0ZHX1NLUiByZWdpc3RlciBhcyBkZXNjcmliZWQKKyAqIGluIHRoZSBSZWZlcmVuY2UgTWFudWFsLgorICogQHJtdG9sbCBTWVNDRkdfU0NTUiAgQ0NNRVIgICAgICAgTExfU1lTQ0ZHX0VuYWJsZUNDTVNSQU1FcmFzZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU0NGR19FbmFibGVDQ01TUkFNRXJhc2Uodm9pZCkgeworICAvKiBTdGFydHMgYSBoYXJkd2FyZSBDQ01TUkFNIGVyYXNlIG9wZXJhdGlvbiovCisgIFNFVF9CSVQoU1lTQ0ZHLT5TQ1NSLCBTWVNDRkdfU0NTUl9DQ01FUik7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiBDQ01TUkFNIGVyYXNlIG9wZXJhdGlvbiBpcyBvbiBnb2luZworICogQHJtdG9sbCBTWVNDRkdfU0NTUiAgQ0NNQlNZICAgICAgTExfU1lTQ0ZHX0lzQ0NNU1JBTUVyYXNlT25nb2luZworICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TWVNDRkdfSXNDQ01TUkFNRXJhc2VPbmdvaW5nKHZvaWQpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoU1lTQ0ZHLT5TQ1NSLCBTWVNDRkdfU0NTUl9DQ01CU1kpID09IChTWVNDRkdfU0NTUl9DQ01CU1kpKQorICAgICAgICAgICAgICA/IDFVTAorICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBTZXQgY29ubmVjdGlvbnMgdG8gVElNMS84LzE1LzE2LzE3IEJyZWFrIGlucHV0cworICogQHJtdG9sbCBTWVNDRkdfQ0ZHUjIgQ0xMICAgICAgICAgICBMTF9TWVNDRkdfU2V0VElNQnJlYWtJbnB1dHNcbgorICogICAgICAgICBTWVNDRkdfQ0ZHUjIgU1BMICAgICAgICAgICBMTF9TWVNDRkdfU2V0VElNQnJlYWtJbnB1dHNcbgorICogICAgICAgICBTWVNDRkdfQ0ZHUjIgUFZETCAgICAgICAgICBMTF9TWVNDRkdfU2V0VElNQnJlYWtJbnB1dHNcbgorICogICAgICAgICBTWVNDRkdfQ0ZHUjIgRUNDTCAgICAgICAgICBMTF9TWVNDRkdfU2V0VElNQnJlYWtJbnB1dHMKKyAqIEBwYXJhbSAgQnJlYWsgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfVElNQlJFQUtfRUNDCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfVElNQlJFQUtfUFZECisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfVElNQlJFQUtfU1JBTV9QQVJJVFkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19USU1CUkVBS19MT0NLVVAKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TWVNDRkdfU2V0VElNQnJlYWtJbnB1dHModWludDMyX3QgQnJlYWspIHsKKyAgTU9ESUZZX1JFRyhTWVNDRkctPkNGR1IyLAorICAgICAgICAgICAgIFNZU0NGR19DRkdSMl9DTEwgfCBTWVNDRkdfQ0ZHUjJfU1BMIHwgU1lTQ0ZHX0NGR1IyX1BWREwgfAorICAgICAgICAgICAgICAgICBTWVNDRkdfQ0ZHUjJfRUNDTCwKKyAgICAgICAgICAgICBCcmVhayk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgY29ubmVjdGlvbnMgdG8gVElNMS84LzE1LzE2LzE3IEJyZWFrIGlucHV0cworICogQHJtdG9sbCBTWVNDRkdfQ0ZHUjIgQ0xMICAgICAgICAgICBMTF9TWVNDRkdfR2V0VElNQnJlYWtJbnB1dHNcbgorICogICAgICAgICBTWVNDRkdfQ0ZHUjIgU1BMICAgICAgICAgICBMTF9TWVNDRkdfR2V0VElNQnJlYWtJbnB1dHNcbgorICogICAgICAgICBTWVNDRkdfQ0ZHUjIgUFZETCAgICAgICAgICBMTF9TWVNDRkdfR2V0VElNQnJlYWtJbnB1dHNcbgorICogICAgICAgICBTWVNDRkdfQ0ZHUjIgRUNDTCAgICAgICAgICBMTF9TWVNDRkdfR2V0VElNQnJlYWtJbnB1dHMKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1RJTUJSRUFLX0VDQworICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1RJTUJSRUFLX1BWRAorICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1RJTUJSRUFLX1NSQU1fUEFSSVRZCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfVElNQlJFQUtfTE9DS1VQCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TWVNDRkdfR2V0VElNQnJlYWtJbnB1dHModm9pZCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVCgKKyAgICAgIFNZU0NGRy0+Q0ZHUjIsIFNZU0NGR19DRkdSMl9DTEwgfCBTWVNDRkdfQ0ZHUjJfU1BMIHwgU1lTQ0ZHX0NGR1IyX1BWREwgfAorICAgICAgICAgICAgICAgICAgICAgICAgIFNZU0NGR19DRkdSMl9FQ0NMKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiBTUkFNIHBhcml0eSBlcnJvciBkZXRlY3RlZAorICogQHJtdG9sbCBTWVNDRkdfQ0ZHUjIgU1BGICAgICAgICAgICBMTF9TWVNDRkdfSXNBY3RpdmVGbGFnX1NQCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU0NGR19Jc0FjdGl2ZUZsYWdfU1Aodm9pZCkgeworICByZXR1cm4gKChSRUFEX0JJVChTWVNDRkctPkNGR1IyLCBTWVNDRkdfQ0ZHUjJfU1BGKSA9PSAoU1lTQ0ZHX0NGR1IyX1NQRikpCisgICAgICAgICAgICAgID8gMVVMCisgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENsZWFyIFNSQU0gcGFyaXR5IGVycm9yIGZsYWcKKyAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IyIFNQRiAgICAgICAgICAgTExfU1lTQ0ZHX0NsZWFyRmxhZ19TUAorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU0NGR19DbGVhckZsYWdfU1Aodm9pZCkgeworICBTRVRfQklUKFNZU0NGRy0+Q0ZHUjIsIFNZU0NGR19DRkdSMl9TUEYpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIENDTVNSQU0gcGFnZSB3cml0ZSBwcm90ZWN0aW9uCisgKiBAbm90ZSBXcml0ZSBwcm90ZWN0aW9uIGlzIGNsZWFyZWQgb25seSBieSBhIHN5c3RlbSByZXNldAorICogQHJtdG9sbCBTWVNDRkdfU1dQUiAgUEFHRXggICAgICAgICBMTF9TWVNDRkdfRW5hYmxlQ0NNU1JBTVBhZ2VXUlAKKyAqIEBwYXJhbSAgQ0NNU1JBTVdSUCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nCisgKiB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfQ0NNU1JBTVdSUF9QQUdFMAorICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19DQ01TUkFNV1JQX1BBR0UyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfQ0NNU1JBTVdSUF9QQUdFMworICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19DQ01TUkFNV1JQX1BBR0U1CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfQ0NNU1JBTVdSUF9QQUdFNgorICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19DQ01TUkFNV1JQX1BBR0U4CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfQ0NNU1JBTVdSUF9QQUdFOQorICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTEwICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTExICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTEyICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTEzICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTE0ICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTE1ICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTE2ICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTE3ICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTE4ICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTE5ICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTIwICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTIxICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTIyICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTIzICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTI0ICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTI1ICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTI2ICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTI3ICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTI4ICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTI5ICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTMwICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRTMxICgqKQorICoKKyAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTQ0ZHX0VuYWJsZUNDTVNSQU1QYWdlV1JQKHVpbnQzMl90IENDTVNSQU1XUlApIHsKKyAgU0VUX0JJVChTWVNDRkctPlNXUFIsIENDTVNSQU1XUlApOworfQorCisvKioKKyAqIEBicmllZiAgQ0NNU1JBTSBwYWdlIHdyaXRlIHByb3RlY3Rpb24gbG9jayBwcmlvciB0byBlcmFzZQorICogQHJtdG9sbCBTWVNDRkdfU0tSICAgS0VZICAgICAgICAgICBMTF9TWVNDRkdfTG9ja0NDTVNSQU1XUlAKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TWVNDRkdfTG9ja0NDTVNSQU1XUlAodm9pZCkgeworICAvKiBXcml0aW5nIGEgd3Jvbmcga2V5IHJlYWN0aXZhdGVzIHRoZSB3cml0ZSBwcm90ZWN0aW9uICovCisgIFdSSVRFX1JFRyhTWVNDRkctPlNLUiwgMHgwMCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDQ01TUkFNIHBhZ2Ugd3JpdGUgcHJvdGVjdGlvbiB1bmxvY2sgcHJpb3IgdG8gZXJhc2UKKyAqIEBybXRvbGwgU1lTQ0ZHX1NLUiAgIEtFWSAgICAgICAgICAgTExfU1lTQ0ZHX1VubG9ja0NDTVNSQU1XUlAKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TWVNDRkdfVW5sb2NrQ0NNU1JBTVdSUCh2b2lkKSB7CisgIC8qIHVubG9jayB0aGUgd3JpdGUgcHJvdGVjdGlvbiBvZiB0aGUgQ0NNRVIgYml0ICovCisgIFdSSVRFX1JFRyhTWVNDRkctPlNLUiwgMHhDQSk7CisgIFdSSVRFX1JFRyhTWVNDRkctPlNLUiwgMHg1Myk7Cit9CisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBTWVNURU1fTExfRUZfREJHTUNVIERCR01DVQorICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiAgUmV0dXJuIHRoZSBkZXZpY2UgaWRlbnRpZmllcgorICogQHJtdG9sbCBEQkdNQ1VfSURDT0RFIERFVl9JRCAgICAgICAgTExfREJHTUNVX0dldERldmljZUlECisgKiBAcmV0dmFsIFZhbHVlcyBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4MEZGRiAoZXg6IGRldmljZSBJRCBpcworICogMHg2NDE1KQorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfREJHTUNVX0dldERldmljZUlEKHZvaWQpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoREJHTUNVLT5JRENPREUsIERCR01DVV9JRENPREVfREVWX0lEKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBSZXR1cm4gdGhlIGRldmljZSByZXZpc2lvbiBpZGVudGlmaWVyCisgKiBAbm90ZSBUaGlzIGZpZWxkIGluZGljYXRlcyB0aGUgcmV2aXNpb24gb2YgdGhlIGRldmljZS4KKyAqIEBybXRvbGwgREJHTUNVX0lEQ09ERSBSRVZfSUQgICAgICAgIExMX0RCR01DVV9HZXRSZXZpc2lvbklECisgKiBAcmV0dmFsIFZhbHVlcyBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkZGRgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfREJHTUNVX0dldFJldmlzaW9uSUQodm9pZCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChEQkdNQ1UtPklEQ09ERSwgREJHTUNVX0lEQ09ERV9SRVZfSUQpID4+CisgICAgICAgICAgICAgICAgICAgIChEQkdNQ1VfUkVWSURfUE9TSVRJT04gJiAweDFGVSkpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIHRoZSBEZWJ1ZyBNb2R1bGUgZHVyaW5nIFNMRUVQIG1vZGUKKyAqIEBybXRvbGwgREJHTUNVX0NSICAgIERCR19TTEVFUCAgICAgTExfREJHTUNVX0VuYWJsZURCR1NsZWVwTW9kZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RCR01DVV9FbmFibGVEQkdTbGVlcE1vZGUodm9pZCkgeworICBTRVRfQklUKERCR01DVS0+Q1IsIERCR01DVV9DUl9EQkdfU0xFRVApOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSB0aGUgRGVidWcgTW9kdWxlIGR1cmluZyBTTEVFUCBtb2RlCisgKiBAcm10b2xsIERCR01DVV9DUiAgICBEQkdfU0xFRVAgICAgIExMX0RCR01DVV9EaXNhYmxlREJHU2xlZXBNb2RlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfREJHTUNVX0Rpc2FibGVEQkdTbGVlcE1vZGUodm9pZCkgeworICBDTEVBUl9CSVQoREJHTUNVLT5DUiwgREJHTUNVX0NSX0RCR19TTEVFUCk7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgdGhlIERlYnVnIE1vZHVsZSBkdXJpbmcgU1RPUCBtb2RlCisgKiBAcm10b2xsIERCR01DVV9DUiAgICBEQkdfU1RPUCAgICAgIExMX0RCR01DVV9FbmFibGVEQkdTdG9wTW9kZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RCR01DVV9FbmFibGVEQkdTdG9wTW9kZSh2b2lkKSB7CisgIFNFVF9CSVQoREJHTUNVLT5DUiwgREJHTUNVX0NSX0RCR19TVE9QKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgdGhlIERlYnVnIE1vZHVsZSBkdXJpbmcgU1RPUCBtb2RlCisgKiBAcm10b2xsIERCR01DVV9DUiAgICBEQkdfU1RPUCAgICAgIExMX0RCR01DVV9EaXNhYmxlREJHU3RvcE1vZGUKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9EQkdNQ1VfRGlzYWJsZURCR1N0b3BNb2RlKHZvaWQpIHsKKyAgQ0xFQVJfQklUKERCR01DVS0+Q1IsIERCR01DVV9DUl9EQkdfU1RPUCk7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgdGhlIERlYnVnIE1vZHVsZSBkdXJpbmcgU1RBTkRCWSBtb2RlCisgKiBAcm10b2xsIERCR01DVV9DUiAgICBEQkdfU1RBTkRCWSAgIExMX0RCR01DVV9FbmFibGVEQkdTdGFuZGJ5TW9kZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RCR01DVV9FbmFibGVEQkdTdGFuZGJ5TW9kZSh2b2lkKSB7CisgIFNFVF9CSVQoREJHTUNVLT5DUiwgREJHTUNVX0NSX0RCR19TVEFOREJZKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgdGhlIERlYnVnIE1vZHVsZSBkdXJpbmcgU1RBTkRCWSBtb2RlCisgKiBAcm10b2xsIERCR01DVV9DUiAgICBEQkdfU1RBTkRCWSAgIExMX0RCR01DVV9EaXNhYmxlREJHU3RhbmRieU1vZGUKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9EQkdNQ1VfRGlzYWJsZURCR1N0YW5kYnlNb2RlKHZvaWQpIHsKKyAgQ0xFQVJfQklUKERCR01DVS0+Q1IsIERCR01DVV9DUl9EQkdfU1RBTkRCWSk7Cit9CisKKy8qKgorICogQGJyaWVmICBTZXQgVHJhY2UgcGluIGFzc2lnbm1lbnQgY29udHJvbAorICogQHJtdG9sbCBEQkdNQ1VfQ1IgICAgVFJBQ0VfSU9FTiAgICBMTF9EQkdNQ1VfU2V0VHJhY2VQaW5Bc3NpZ25tZW50XG4KKyAqICAgICAgICAgREJHTUNVX0NSICAgIFRSQUNFX01PREUgICAgTExfREJHTUNVX1NldFRyYWNlUGluQXNzaWdubWVudAorICogQHBhcmFtICBQaW5Bc3NpZ25tZW50IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfVFJBQ0VfTk9ORQorICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX1RSQUNFX0FTWU5DSAorICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX1RSQUNFX1NZTkNIX1NJWkUxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfVFJBQ0VfU1lOQ0hfU0laRTIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9UUkFDRV9TWU5DSF9TSVpFNAorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RCR01DVV9TZXRUcmFjZVBpbkFzc2lnbm1lbnQodWludDMyX3QgUGluQXNzaWdubWVudCkgeworICBNT0RJRllfUkVHKERCR01DVS0+Q1IsIERCR01DVV9DUl9UUkFDRV9JT0VOIHwgREJHTUNVX0NSX1RSQUNFX01PREUsCisgICAgICAgICAgICAgUGluQXNzaWdubWVudCk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgVHJhY2UgcGluIGFzc2lnbm1lbnQgY29udHJvbAorICogQHJtdG9sbCBEQkdNQ1VfQ1IgICAgVFJBQ0VfSU9FTiAgICBMTF9EQkdNQ1VfR2V0VHJhY2VQaW5Bc3NpZ25tZW50XG4KKyAqICAgICAgICAgREJHTUNVX0NSICAgIFRSQUNFX01PREUgICAgTExfREJHTUNVX0dldFRyYWNlUGluQXNzaWdubWVudAorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX1RSQUNFX05PTkUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9UUkFDRV9BU1lOQ0gKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9UUkFDRV9TWU5DSF9TSVpFMQorICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX1RSQUNFX1NZTkNIX1NJWkUyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfVFJBQ0VfU1lOQ0hfU0laRTQKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RCR01DVV9HZXRUcmFjZVBpbkFzc2lnbm1lbnQodm9pZCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChEQkdNQ1UtPkNSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkdNQ1VfQ1JfVFJBQ0VfSU9FTiB8IERCR01DVV9DUl9UUkFDRV9NT0RFKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBGcmVlemUgQVBCMSBwZXJpcGhlcmFscyAoZ3JvdXAxIHBlcmlwaGVyYWxzKQorICogQHJtdG9sbCBEQkdNQ1VfQVBCMUZaUjEgREJHX3h4eHhfU1RPUCAgTExfREJHTUNVX0FQQjFfR1JQMV9GcmVlemVQZXJpcGgKKyAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIxX0dSUDFfVElNMl9TVE9QCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMV9HUlAxX1RJTTNfU1RPUAorICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjFfR1JQMV9USU00X1NUT1AKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIxX0dSUDFfVElNNV9TVE9QICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjFfR1JQMV9USU02X1NUT1AKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIxX0dSUDFfVElNN19TVE9QCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMV9HUlAxX1JUQ19TVE9QCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMV9HUlAxX1dXREdfU1RPUAorICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjFfR1JQMV9JV0RHX1NUT1AKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIxX0dSUDFfSTJDMV9TVE9QCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMV9HUlAxX0kyQzJfU1RPUAorICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjFfR1JQMV9JMkMzX1NUT1AKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIxX0dSUDFfTFBUSU0xX1NUT1AKKyAqCisgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4KKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9EQkdNQ1VfQVBCMV9HUlAxX0ZyZWV6ZVBlcmlwaCh1aW50MzJfdCBQZXJpcGhzKSB7CisgIFNFVF9CSVQoREJHTUNVLT5BUEIxRlpSMSwgUGVyaXBocyk7Cit9CisKKy8qKgorICogQGJyaWVmICBGcmVlemUgQVBCMSBwZXJpcGhlcmFscyAoZ3JvdXAyIHBlcmlwaGVyYWxzKQorICogQHJtdG9sbCBEQkdNQ1VfQVBCMUZaUjIgREJHX3h4eHhfU1RPUCAgTExfREJHTUNVX0FQQjFfR1JQMl9GcmVlemVQZXJpcGgKKyAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIxX0dSUDJfSTJDNF9TVE9QICgqKQorICoKKyAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RCR01DVV9BUEIxX0dSUDJfRnJlZXplUGVyaXBoKHVpbnQzMl90IFBlcmlwaHMpIHsKKyAgU0VUX0JJVChEQkdNQ1UtPkFQQjFGWlIyLCBQZXJpcGhzKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFVuZnJlZXplIEFQQjEgcGVyaXBoZXJhbHMgKGdyb3VwMSBwZXJpcGhlcmFscykKKyAqIEBybXRvbGwgREJHTUNVX0FQQjFGWlIxIERCR194eHh4X1NUT1AgIExMX0RCR01DVV9BUEIxX0dSUDFfVW5GcmVlemVQZXJpcGgKKyAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIxX0dSUDFfVElNMl9TVE9QCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMV9HUlAxX1RJTTNfU1RPUAorICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjFfR1JQMV9USU00X1NUT1AKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIxX0dSUDFfVElNNV9TVE9QICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjFfR1JQMV9USU02X1NUT1AKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIxX0dSUDFfVElNN19TVE9QCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMV9HUlAxX1JUQ19TVE9QCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMV9HUlAxX1dXREdfU1RPUAorICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjFfR1JQMV9JV0RHX1NUT1AKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIxX0dSUDFfSTJDMV9TVE9QCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMV9HUlAxX0kyQzJfU1RPUAorICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjFfR1JQMV9JMkMzX1NUT1AKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIxX0dSUDFfTFBUSU0xX1NUT1AKKyAqCisgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4KKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9EQkdNQ1VfQVBCMV9HUlAxX1VuRnJlZXplUGVyaXBoKHVpbnQzMl90IFBlcmlwaHMpIHsKKyAgQ0xFQVJfQklUKERCR01DVS0+QVBCMUZaUjEsIFBlcmlwaHMpOworfQorCisvKioKKyAqIEBicmllZiAgVW5mcmVlemUgQVBCMSBwZXJpcGhlcmFscyAoZ3JvdXAyIHBlcmlwaGVyYWxzKQorICogQHJtdG9sbCBEQkdNQ1VfQVBCMUZaUjIgREJHX3h4eHhfU1RPUCAgTExfREJHTUNVX0FQQjFfR1JQMl9VbkZyZWV6ZVBlcmlwaAorICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjFfR1JQMl9JMkM0X1NUT1AgKCopCisgKgorICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfREJHTUNVX0FQQjFfR1JQMl9VbkZyZWV6ZVBlcmlwaCh1aW50MzJfdCBQZXJpcGhzKSB7CisgIENMRUFSX0JJVChEQkdNQ1UtPkFQQjFGWlIyLCBQZXJpcGhzKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEZyZWV6ZSBBUEIyIHBlcmlwaGVyYWxzCisgKiBAcm10b2xsIERCR01DVV9BUEIyRlogREJHX1RJTXhfU1RPUCAgTExfREJHTUNVX0FQQjJfR1JQMV9GcmVlemVQZXJpcGgKKyAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIyX0dSUDFfVElNMV9TVE9QCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMl9HUlAxX1RJTThfU1RPUAorICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjJfR1JQMV9USU0xNV9TVE9QCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMl9HUlAxX1RJTTE2X1NUT1AKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIyX0dSUDFfVElNMTdfU1RPUAorICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjJfR1JQMV9USU0yMF9TVE9QICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjJfR1JQMV9IUlRJTTFfU1RPUCAoKikKKyAqCisgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4KKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9EQkdNQ1VfQVBCMl9HUlAxX0ZyZWV6ZVBlcmlwaCh1aW50MzJfdCBQZXJpcGhzKSB7CisgIFNFVF9CSVQoREJHTUNVLT5BUEIyRlosIFBlcmlwaHMpOworfQorCisvKioKKyAqIEBicmllZiAgVW5mcmVlemUgQVBCMiBwZXJpcGhlcmFscworICogQHJtdG9sbCBEQkdNQ1VfQVBCMkZaIERCR19USU14X1NUT1AgIExMX0RCR01DVV9BUEIyX0dSUDFfVW5GcmVlemVQZXJpcGgKKyAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIyX0dSUDFfVElNMV9TVE9QCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMl9HUlAxX1RJTThfU1RPUAorICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjJfR1JQMV9USU0xNV9TVE9QCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMl9HUlAxX1RJTTE2X1NUT1AKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIyX0dSUDFfVElNMTdfU1RPUAorICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjJfR1JQMV9USU0yMF9TVE9QICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjJfR1JQMV9IUlRJTTFfU1RPUCAoKikKKyAqCisgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4KKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9EQkdNQ1VfQVBCMl9HUlAxX1VuRnJlZXplUGVyaXBoKHVpbnQzMl90IFBlcmlwaHMpIHsKKyAgQ0xFQVJfQklUKERCR01DVS0+QVBCMkZaLCBQZXJpcGhzKTsKK30KKworLyoqCisgKiBAfQorICovCisKKyNpZiBkZWZpbmVkKFZSRUZCVUYpCisvKiogQGRlZmdyb3VwIFNZU1RFTV9MTF9FRl9WUkVGQlVGIFZSRUZCVUYKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBJbnRlcm5hbCB2b2x0YWdlIHJlZmVyZW5jZQorICogQHJtdG9sbCBWUkVGQlVGX0NTUiAgRU5WUiAgICAgICAgICBMTF9WUkVGQlVGX0VuYWJsZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1ZSRUZCVUZfRW5hYmxlKHZvaWQpIHsKKyAgU0VUX0JJVChWUkVGQlVGLT5DU1IsIFZSRUZCVUZfQ1NSX0VOVlIpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBJbnRlcm5hbCB2b2x0YWdlIHJlZmVyZW5jZQorICogQHJtdG9sbCBWUkVGQlVGX0NTUiAgRU5WUiAgICAgICAgICBMTF9WUkVGQlVGX0Rpc2FibGUKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9WUkVGQlVGX0Rpc2FibGUodm9pZCkgeworICBDTEVBUl9CSVQoVlJFRkJVRi0+Q1NSLCBWUkVGQlVGX0NTUl9FTlZSKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBoaWdoIGltcGVkYW5jZSAoVlJFRitwaW4gaXMgaGlnaCBpbXBlZGFuY2UpCisgKiBAcm10b2xsIFZSRUZCVUZfQ1NSICBISVogICAgICAgICAgIExMX1ZSRUZCVUZfRW5hYmxlSElaCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVlJFRkJVRl9FbmFibGVISVoodm9pZCkgeworICBTRVRfQklUKFZSRUZCVUYtPkNTUiwgVlJFRkJVRl9DU1JfSElaKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgaGlnaCBpbXBlZGFuY2UgKFZSRUYrcGluIGlzIGludGVybmFsbHkgY29ubmVjdGVkIHRvIHRoZQorICogdm9sdGFnZSByZWZlcmVuY2UgYnVmZmVyIG91dHB1dCkKKyAqIEBybXRvbGwgVlJFRkJVRl9DU1IgIEhJWiAgICAgICAgICAgTExfVlJFRkJVRl9EaXNhYmxlSElaCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVlJFRkJVRl9EaXNhYmxlSElaKHZvaWQpIHsKKyAgQ0xFQVJfQklUKFZSRUZCVUYtPkNTUiwgVlJFRkJVRl9DU1JfSElaKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFNldCB0aGUgVm9sdGFnZSByZWZlcmVuY2Ugc2NhbGUKKyAqIEBybXRvbGwgVlJFRkJVRl9DU1IgIFZSUyAgICAgICAgICAgTExfVlJFRkJVRl9TZXRWb2x0YWdlU2NhbGluZworICogQHBhcmFtICBTY2FsZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfVlJFRkJVRl9WT0xUQUdFX1NDQUxFMAorICogICAgICAgICBAYXJnIEByZWYgTExfVlJFRkJVRl9WT0xUQUdFX1NDQUxFMQorICogICAgICAgICBAYXJnIEByZWYgTExfVlJFRkJVRl9WT0xUQUdFX1NDQUxFMgorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1ZSRUZCVUZfU2V0Vm9sdGFnZVNjYWxpbmcodWludDMyX3QgU2NhbGUpIHsKKyAgTU9ESUZZX1JFRyhWUkVGQlVGLT5DU1IsIFZSRUZCVUZfQ1NSX1ZSUywgU2NhbGUpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IHRoZSBWb2x0YWdlIHJlZmVyZW5jZSBzY2FsZQorICogQHJtdG9sbCBWUkVGQlVGX0NTUiAgVlJTICAgICAgICAgICBMTF9WUkVGQlVGX0dldFZvbHRhZ2VTY2FsaW5nCisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9WUkVGQlVGX1ZPTFRBR0VfU0NBTEUwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9WUkVGQlVGX1ZPTFRBR0VfU0NBTEUxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9WUkVGQlVGX1ZPTFRBR0VfU0NBTEUyCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9WUkVGQlVGX0dldFZvbHRhZ2VTY2FsaW5nKHZvaWQpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVlJFRkJVRi0+Q1NSLCBWUkVGQlVGX0NTUl9WUlMpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIFZvbHRhZ2UgcmVmZXJlbmNlIGJ1ZmZlciBpcyByZWFkeQorICogQHJtdG9sbCBWUkVGQlVGX0NTUiAgVlJSICAgICAgICAgICBMTF9WUkVGQlVGX0lzVlJFRlJlYWR5CisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1ZSRUZCVUZfSXNWUkVGUmVhZHkodm9pZCkgeworICByZXR1cm4gKChSRUFEX0JJVChWUkVGQlVGLT5DU1IsIFZSRUZCVUZfQ1NSX1ZSUikgPT0gKFZSRUZCVUZfQ1NSX1ZSUikpID8gMVVMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IHRoZSB0cmltbWluZyBjb2RlIGZvciBWUkVGQlVGIGNhbGlicmF0aW9uCisgKiBAcm10b2xsIFZSRUZCVUZfQ0NSICBUUklNICAgICAgICAgIExMX1ZSRUZCVUZfR2V0VHJpbW1pbmcKKyAqIEByZXR2YWwgQmV0d2VlbiAwIGFuZCAweDNGCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9WUkVGQlVGX0dldFRyaW1taW5nKHZvaWQpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVlJFRkJVRi0+Q0NSLCBWUkVGQlVGX0NDUl9UUklNKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBTZXQgdGhlIHRyaW1taW5nIGNvZGUgZm9yIFZSRUZCVUYgY2FsaWJyYXRpb24gKFR1bmUgdGhlIGludGVybmFsCisgKiByZWZlcmVuY2UgYnVmZmVyIHZvbHRhZ2UpCisgKiBAcm10b2xsIFZSRUZCVUZfQ0NSICBUUklNICAgICAgICAgIExMX1ZSRUZCVUZfU2V0VHJpbW1pbmcKKyAqIEBwYXJhbSAgVmFsdWUgQmV0d2VlbiAwIGFuZCAweDNGCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVlJFRkJVRl9TZXRUcmltbWluZyh1aW50MzJfdCBWYWx1ZSkgeworICBXUklURV9SRUcoVlJFRkJVRi0+Q0NSLCBWYWx1ZSk7Cit9CisKKy8qKgorICogQH0KKyAqLworI2VuZGlmIC8qIFZSRUZCVUYgKi8KKworLyoqIEBkZWZncm91cCBTWVNURU1fTExfRUZfRkxBU0ggRkxBU0gKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgIFNldCBGTEFTSCBMYXRlbmN5CisgKiBAcm10b2xsIEZMQVNIX0FDUiAgICBMQVRFTkNZICAgICAgIExMX0ZMQVNIX1NldExhdGVuY3kKKyAqIEBwYXJhbSAgTGF0ZW5jeSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfRkxBU0hfTEFURU5DWV8wCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9GTEFTSF9MQVRFTkNZXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZMQVNIX0xBVEVOQ1lfMgorICogICAgICAgICBAYXJnIEByZWYgTExfRkxBU0hfTEFURU5DWV8zCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9GTEFTSF9MQVRFTkNZXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZMQVNIX0xBVEVOQ1lfNSAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZMQVNIX0xBVEVOQ1lfNiAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZMQVNIX0xBVEVOQ1lfNyAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZMQVNIX0xBVEVOQ1lfOCAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZMQVNIX0xBVEVOQ1lfOSAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZMQVNIX0xBVEVOQ1lfMTAgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9GTEFTSF9MQVRFTkNZXzExICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRkxBU0hfTEFURU5DWV8xMiAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZMQVNIX0xBVEVOQ1lfMTMgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9GTEFTSF9MQVRFTkNZXzE0ICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRkxBU0hfTEFURU5DWV8xNSAoKikKKyAqCisgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4KKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9GTEFTSF9TZXRMYXRlbmN5KHVpbnQzMl90IExhdGVuY3kpIHsKKyAgTU9ESUZZX1JFRyhGTEFTSC0+QUNSLCBGTEFTSF9BQ1JfTEFURU5DWSwgTGF0ZW5jeSk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgRkxBU0ggTGF0ZW5jeQorICogQHJtdG9sbCBGTEFTSF9BQ1IgICAgTEFURU5DWSAgICAgICBMTF9GTEFTSF9HZXRMYXRlbmN5CisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9GTEFTSF9MQVRFTkNZXzAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZMQVNIX0xBVEVOQ1lfMQorICogICAgICAgICBAYXJnIEByZWYgTExfRkxBU0hfTEFURU5DWV8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9GTEFTSF9MQVRFTkNZXzMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZMQVNIX0xBVEVOQ1lfNAorICogICAgICAgICBAYXJnIEByZWYgTExfRkxBU0hfTEFURU5DWV81ICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRkxBU0hfTEFURU5DWV82ICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRkxBU0hfTEFURU5DWV83ICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRkxBU0hfTEFURU5DWV84ICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRkxBU0hfTEFURU5DWV85ICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRkxBU0hfTEFURU5DWV8xMCAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZMQVNIX0xBVEVOQ1lfMTEgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9GTEFTSF9MQVRFTkNZXzEyICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfRkxBU0hfTEFURU5DWV8xMyAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZMQVNIX0xBVEVOQ1lfMTQgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9GTEFTSF9MQVRFTkNZXzE1ICgqKQorICoKKyAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRkxBU0hfR2V0TGF0ZW5jeSh2b2lkKSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9MQVRFTkNZKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgUHJlZmV0Y2gKKyAqIEBybXRvbGwgRkxBU0hfQUNSICAgIFBSRlRFTiAgICAgICAgTExfRkxBU0hfRW5hYmxlUHJlZmV0Y2gKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9GTEFTSF9FbmFibGVQcmVmZXRjaCh2b2lkKSB7CisgIFNFVF9CSVQoRkxBU0gtPkFDUiwgRkxBU0hfQUNSX1BSRlRFTik7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIFByZWZldGNoCisgKiBAcm10b2xsIEZMQVNIX0FDUiAgICBQUkZURU4gICAgICAgIExMX0ZMQVNIX0Rpc2FibGVQcmVmZXRjaAorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0ZMQVNIX0Rpc2FibGVQcmVmZXRjaCh2b2lkKSB7CisgIENMRUFSX0JJVChGTEFTSC0+QUNSLCBGTEFTSF9BQ1JfUFJGVEVOKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIFByZWZldGNoIGJ1ZmZlciBpcyBlbmFibGVkCisgKiBAcm10b2xsIEZMQVNIX0FDUiAgICBQUkZURU4gICAgICAgIExMX0ZMQVNIX0lzUHJlZmV0Y2hFbmFibGVkCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0ZMQVNIX0lzUHJlZmV0Y2hFbmFibGVkKHZvaWQpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoRkxBU0gtPkFDUiwgRkxBU0hfQUNSX1BSRlRFTikgPT0gKEZMQVNIX0FDUl9QUkZURU4pKSA/IDFVTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBJbnN0cnVjdGlvbiBjYWNoZQorICogQHJtdG9sbCBGTEFTSF9BQ1IgICAgSUNFTiAgICAgICAgICBMTF9GTEFTSF9FbmFibGVJbnN0Q2FjaGUKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9GTEFTSF9FbmFibGVJbnN0Q2FjaGUodm9pZCkgeworICBTRVRfQklUKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9JQ0VOKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgSW5zdHJ1Y3Rpb24gY2FjaGUKKyAqIEBybXRvbGwgRkxBU0hfQUNSICAgIElDRU4gICAgICAgICAgTExfRkxBU0hfRGlzYWJsZUluc3RDYWNoZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0ZMQVNIX0Rpc2FibGVJbnN0Q2FjaGUodm9pZCkgeworICBDTEVBUl9CSVQoRkxBU0gtPkFDUiwgRkxBU0hfQUNSX0lDRU4pOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIERhdGEgY2FjaGUKKyAqIEBybXRvbGwgRkxBU0hfQUNSICAgIERDRU4gICAgICAgICAgTExfRkxBU0hfRW5hYmxlRGF0YUNhY2hlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRkxBU0hfRW5hYmxlRGF0YUNhY2hlKHZvaWQpIHsKKyAgU0VUX0JJVChGTEFTSC0+QUNSLCBGTEFTSF9BQ1JfRENFTik7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIERhdGEgY2FjaGUKKyAqIEBybXRvbGwgRkxBU0hfQUNSICAgIERDRU4gICAgICAgICAgTExfRkxBU0hfRGlzYWJsZURhdGFDYWNoZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0ZMQVNIX0Rpc2FibGVEYXRhQ2FjaGUodm9pZCkgeworICBDTEVBUl9CSVQoRkxBU0gtPkFDUiwgRkxBU0hfQUNSX0RDRU4pOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIEluc3RydWN0aW9uIGNhY2hlIHJlc2V0CisgKiBAbm90ZSAgYml0IGNhbiBiZSB3cml0dGVuIG9ubHkgd2hlbiB0aGUgaW5zdHJ1Y3Rpb24gY2FjaGUgaXMgZGlzYWJsZWQKKyAqIEBybXRvbGwgRkxBU0hfQUNSICAgIElDUlNUICAgICAgICAgTExfRkxBU0hfRW5hYmxlSW5zdENhY2hlUmVzZXQKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9GTEFTSF9FbmFibGVJbnN0Q2FjaGVSZXNldCh2b2lkKSB7CisgIFNFVF9CSVQoRkxBU0gtPkFDUiwgRkxBU0hfQUNSX0lDUlNUKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgSW5zdHJ1Y3Rpb24gY2FjaGUgcmVzZXQKKyAqIEBybXRvbGwgRkxBU0hfQUNSICAgIElDUlNUICAgICAgICAgTExfRkxBU0hfRGlzYWJsZUluc3RDYWNoZVJlc2V0CisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRkxBU0hfRGlzYWJsZUluc3RDYWNoZVJlc2V0KHZvaWQpIHsKKyAgQ0xFQVJfQklUKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9JQ1JTVCk7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgRGF0YSBjYWNoZSByZXNldAorICogQG5vdGUgYml0IGNhbiBiZSB3cml0dGVuIG9ubHkgd2hlbiB0aGUgZGF0YSBjYWNoZSBpcyBkaXNhYmxlZAorICogQHJtdG9sbCBGTEFTSF9BQ1IgICAgRENSU1QgICAgICAgICBMTF9GTEFTSF9FbmFibGVEYXRhQ2FjaGVSZXNldAorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0ZMQVNIX0VuYWJsZURhdGFDYWNoZVJlc2V0KHZvaWQpIHsKKyAgU0VUX0JJVChGTEFTSC0+QUNSLCBGTEFTSF9BQ1JfRENSU1QpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBEYXRhIGNhY2hlIHJlc2V0CisgKiBAcm10b2xsIEZMQVNIX0FDUiAgICBEQ1JTVCAgICAgICAgIExMX0ZMQVNIX0Rpc2FibGVEYXRhQ2FjaGVSZXNldAorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0ZMQVNIX0Rpc2FibGVEYXRhQ2FjaGVSZXNldCh2b2lkKSB7CisgIENMRUFSX0JJVChGTEFTSC0+QUNSLCBGTEFTSF9BQ1JfRENSU1QpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIEZsYXNoIFBvd2VyLWRvd24gbW9kZSBkdXJpbmcgcnVuIG1vZGUgb3IgTG93LXBvd2VyIHJ1biBtb2RlCisgKiBAbm90ZSBGbGFzaCBtZW1vcnkgY2FuIGJlIHB1dCBpbiBwb3dlci1kb3duIG1vZGUgb25seSB3aGVuIHRoZSBjb2RlIGlzCisgKiBleGVjdXRlZCBmcm9tIFJBTQorICogQG5vdGUgRmxhc2ggbXVzdCBub3QgYmUgYWNjZXNzZWQgd2hlbiBwb3dlciBkb3duIGlzIGVuYWJsZWQKKyAqIEBub3RlIEZsYXNoIG11c3Qgbm90IGJlIHB1dCBpbiBwb3dlci1kb3duIHdoaWxlIGEgcHJvZ3JhbSBvciBhbiBlcmFzZQorICogb3BlcmF0aW9uIGlzIG9uLWdvaW5nCisgKiBAcm10b2xsIEZMQVNIX0FDUiAgICBSVU5fUEQgICAgICAgIExMX0ZMQVNIX0VuYWJsZVJ1blBvd2VyRG93blxuCisgKiAgICAgICAgIEZMQVNIX1BES0VZUiBQREtFWTEgICAgICAgIExMX0ZMQVNIX0VuYWJsZVJ1blBvd2VyRG93blxuCisgKiAgICAgICAgIEZMQVNIX1BES0VZUiBQREtFWTIgICAgICAgIExMX0ZMQVNIX0VuYWJsZVJ1blBvd2VyRG93bgorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0ZMQVNIX0VuYWJsZVJ1blBvd2VyRG93bih2b2lkKSB7CisgIC8qIEZvbGxvd2luZyB2YWx1ZXMgbXVzdCBiZSB3cml0dGVuIGNvbnNlY3V0aXZlbHkgdG8gdW5sb2NrIHRoZSBSVU5fUEQgYml0IGluCisgICAgIEZMQVNIX0FDUiAqLworICBXUklURV9SRUcoRkxBU0gtPlBES0VZUiwgRkxBU0hfUERLRVkxKTsKKyAgV1JJVEVfUkVHKEZMQVNILT5QREtFWVIsIEZMQVNIX1BES0VZMik7CisgIFNFVF9CSVQoRkxBU0gtPkFDUiwgRkxBU0hfQUNSX1JVTl9QRCk7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIEZsYXNoIFBvd2VyLWRvd24gbW9kZSBkdXJpbmcgcnVuIG1vZGUgb3IgTG93LXBvd2VyIHJ1biBtb2RlCisgKiBAcm10b2xsIEZMQVNIX0FDUiAgICBSVU5fUEQgICAgICAgIExMX0ZMQVNIX0Rpc2FibGVSdW5Qb3dlckRvd25cbgorICogICAgICAgICBGTEFTSF9QREtFWVIgUERLRVkxICAgICAgICBMTF9GTEFTSF9EaXNhYmxlUnVuUG93ZXJEb3duXG4KKyAqICAgICAgICAgRkxBU0hfUERLRVlSIFBES0VZMiAgICAgICAgTExfRkxBU0hfRGlzYWJsZVJ1blBvd2VyRG93bgorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0ZMQVNIX0Rpc2FibGVSdW5Qb3dlckRvd24odm9pZCkgeworICAvKiBGb2xsb3dpbmcgdmFsdWVzIG11c3QgYmUgd3JpdHRlbiBjb25zZWN1dGl2ZWx5IHRvIHVubG9jayB0aGUgUlVOX1BEIGJpdCBpbgorICAgICBGTEFTSF9BQ1IgKi8KKyAgV1JJVEVfUkVHKEZMQVNILT5QREtFWVIsIEZMQVNIX1BES0VZMSk7CisgIFdSSVRFX1JFRyhGTEFTSC0+UERLRVlSLCBGTEFTSF9QREtFWTIpOworICBDTEVBUl9CSVQoRkxBU0gtPkFDUiwgRkxBU0hfQUNSX1JVTl9QRCk7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgRmxhc2ggUG93ZXItZG93biBtb2RlIGR1cmluZyBTbGVlcCBvciBMb3ctcG93ZXIgc2xlZXAgbW9kZQorICogQG5vdGUgRmxhc2ggbXVzdCBub3QgYmUgcHV0IGluIHBvd2VyLWRvd24gd2hpbGUgYSBwcm9ncmFtIG9yIGFuIGVyYXNlCisgKiBvcGVyYXRpb24gaXMgb24tZ29pbmcKKyAqIEBybXRvbGwgRkxBU0hfQUNSICAgIFNMRUVQX1BEICAgICAgTExfRkxBU0hfRW5hYmxlU2xlZXBQb3dlckRvd24KKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9GTEFTSF9FbmFibGVTbGVlcFBvd2VyRG93bih2b2lkKSB7CisgIFNFVF9CSVQoRkxBU0gtPkFDUiwgRkxBU0hfQUNSX1NMRUVQX1BEKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgRmxhc2ggUG93ZXItZG93biBtb2RlIGR1cmluZyBTbGVlcCBvciBMb3ctcG93ZXIgc2xlZXAgbW9kZQorICogQHJtdG9sbCBGTEFTSF9BQ1IgICAgU0xFRVBfUEQgICAgICBMTF9GTEFTSF9EaXNhYmxlU2xlZXBQb3dlckRvd24KKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9GTEFTSF9EaXNhYmxlU2xlZXBQb3dlckRvd24odm9pZCkgeworICBDTEVBUl9CSVQoRkxBU0gtPkFDUiwgRkxBU0hfQUNSX1NMRUVQX1BEKTsKK30KKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworI2VuZGlmIC8qIGRlZmluZWQgKEZMQVNIKSB8fCBkZWZpbmVkIChTWVNDRkcpIHx8IGRlZmluZWQgKERCR01DVSkgfHwgZGVmaW5lZCBcCisgICAgICAgICAgKFZSRUZCVUYpICovCisKKy8qKgorICogQH0KKyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19TVE0zMkc0eHhfTExfU1lTVEVNX0ggKi8KZGlmZiAtLWdpdCBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9JbmMvc3RtMzJnNHh4X2xsX3RpbS5oIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfbGxfdGltLmgKaW5kZXggMmRjNDkwYy4uYTgwYTYxNCAxMDA2NDQKLS0tIGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfbGxfdGltLmgKKysrIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfbGxfdGltLmgKQEAgLTEsNzY2MCArMSw3NjgwIEBACi0vKioNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQGZpbGUgICAgc3RtMzJnNHh4X2xsX3RpbS5oDQotICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0NCi0gKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBUSU0gTEwgbW9kdWxlLg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBAYXR0ZW50aW9uDQotICoNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQotICoNCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRlcm1zIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUNCi0gKiBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb2Z0d2FyZSBjb21wb25lbnQuDQotICogSWYgbm8gTElDRU5TRSBmaWxlIGNvbWVzIHdpdGggdGhpcyBzb2Z0d2FyZSwgaXQgaXMgcHJvdmlkZWQgQVMtSVMuDQotICoNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICovDQotDQotLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaWZuZGVmIF9fU1RNMzJHNHh4X0xMX1RJTV9IDQotI2RlZmluZSBfX1NUTTMyRzR4eF9MTF9USU1fSA0KLQ0KLSNpZmRlZiBfX2NwbHVzcGx1cw0KLWV4dGVybiAiQyIgew0KLSNlbmRpZg0KLQ0KLS8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotI2luY2x1ZGUgInN0bTMyZzR4eC5oIg0KLQ0KLS8qKiBAYWRkdG9ncm91cCBTVE0zMkc0eHhfTExfRHJpdmVyDQotICogQHsNCi0gKi8NCi0NCi0jaWYgZGVmaW5lZChUSU0xKSB8fCBkZWZpbmVkKFRJTTIpIHx8IGRlZmluZWQoVElNMykgfHwgZGVmaW5lZChUSU00KSB8fCBcDQotICAgIGRlZmluZWQoVElNNSkgfHwgZGVmaW5lZChUSU02KSB8fCBkZWZpbmVkKFRJTTcpIHx8IGRlZmluZWQoVElNOCkgfHwgXA0KLSAgICBkZWZpbmVkKFRJTTE1KSB8fCBkZWZpbmVkKFRJTTE2KSB8fCBkZWZpbmVkKFRJTTE3KSB8fCBkZWZpbmVkKFRJTTIwKQ0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0xMIFRJTQ0KLSAqIEB7DQotICovDQotDQotLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgVElNX0xMX1ByaXZhdGVfVmFyaWFibGVzIFRJTSBQcml2YXRlIFZhcmlhYmxlcw0KLSAqIEB7DQotICovDQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgT0ZGU0VUX1RBQl9DQ01SeFtdID0gew0KLSAgICAweDAwVSwgLyogMDogVElNeF9DSDEgICovDQotICAgIDB4MDBVLCAvKiAxOiBUSU14X0NIMU4gKi8NCi0gICAgMHgwMFUsIC8qIDI6IFRJTXhfQ0gyICAqLw0KLSAgICAweDAwVSwgLyogMzogVElNeF9DSDJOICovDQotICAgIDB4MDRVLCAvKiA0OiBUSU14X0NIMyAgKi8NCi0gICAgMHgwNFUsIC8qIDU6IFRJTXhfQ0gzTiAqLw0KLSAgICAweDA0VSwgLyogNjogVElNeF9DSDQgICovDQotICAgIDB4MDRVLCAvKiA3OiBUSU14X0NINE4gKi8NCi0gICAgMHgzOFUsIC8qIDg6IFRJTXhfQ0g1ICAqLw0KLSAgICAweDM4VSAgLyogOTogVElNeF9DSDYgICovDQotDQotfTsNCi0NCi1zdGF0aWMgY29uc3QgdWludDhfdCBTSElGVF9UQUJfT0N4eFtdID0gew0KLSAgICAwVSwgLyogMDogT0MxTSwgT0MxRkUsIE9DMVBFICovDQotICAgIDBVLCAvKiAxOiAtIE5BICovDQotICAgIDhVLCAvKiAyOiBPQzJNLCBPQzJGRSwgT0MyUEUgKi8NCi0gICAgMFUsIC8qIDM6IC0gTkEgKi8NCi0gICAgMFUsIC8qIDQ6IE9DM00sIE9DM0ZFLCBPQzNQRSAqLw0KLSAgICAwVSwgLyogNTogLSBOQSAqLw0KLSAgICA4VSwgLyogNjogT0M0TSwgT0M0RkUsIE9DNFBFICovDQotICAgIDBVLCAvKiA3OiAtIE5BICovDQotICAgIDBVLCAvKiA4OiBPQzVNLCBPQzVGRSwgT0M1UEUgKi8NCi0gICAgOFUgIC8qIDk6IE9DNk0sIE9DNkZFLCBPQzZQRSAqLw0KLX07DQotDQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgU0hJRlRfVEFCX0lDeHhbXSA9IHsNCi0gICAgMFUsIC8qIDA6IENDMVMsIElDMVBTQywgSUMxRiAqLw0KLSAgICAwVSwgLyogMTogLSBOQSAqLw0KLSAgICA4VSwgLyogMjogQ0MyUywgSUMyUFNDLCBJQzJGICovDQotICAgIDBVLCAvKiAzOiAtIE5BICovDQotICAgIDBVLCAvKiA0OiBDQzNTLCBJQzNQU0MsIElDM0YgKi8NCi0gICAgMFUsIC8qIDU6IC0gTkEgKi8NCi0gICAgOFUsIC8qIDY6IENDNFMsIElDNFBTQywgSUM0RiAqLw0KLSAgICAwVSwgLyogNzogLSBOQSAqLw0KLSAgICAwVSwgLyogODogLSBOQSAqLw0KLSAgICAwVSAgLyogOTogLSBOQSAqLw0KLX07DQotDQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgU0hJRlRfVEFCX0NDeFBbXSA9IHsNCi0gICAgMFUsICAvKiAwOiBDQzFQICovDQotICAgIDJVLCAgLyogMTogQ0MxTlAgKi8NCi0gICAgNFUsICAvKiAyOiBDQzJQICovDQotICAgIDZVLCAgLyogMzogQ0MyTlAgKi8NCi0gICAgOFUsICAvKiA0OiBDQzNQICovDQotICAgIDEwVSwgLyogNTogQ0MzTlAgKi8NCi0gICAgMTJVLCAvKiA2OiBDQzRQICovDQotICAgIDE0VSwgLyogNzogQ0M0TlAgKi8NCi0gICAgMTZVLCAvKiA4OiBDQzVQICovDQotICAgIDIwVSAgLyogOTogQ0M2UCAqLw0KLX07DQotDQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgU0hJRlRfVEFCX09JU3hbXSA9IHsNCi0gICAgMFUsIC8qIDA6IE9JUzEgKi8NCi0gICAgMVUsIC8qIDE6IE9JUzFOICovDQotICAgIDJVLCAvKiAyOiBPSVMyICovDQotICAgIDNVLCAvKiAzOiBPSVMyTiAqLw0KLSAgICA0VSwgLyogNDogT0lTMyAqLw0KLSAgICA1VSwgLyogNTogT0lTM04gKi8NCi0gICAgNlUsIC8qIDY6IE9JUzQgKi8NCi0gICAgN1UsIC8qIDc6IE9JUzROICovDQotICAgIDhVLCAvKiA4OiBPSVM1ICovDQotICAgIDEwVSAvKiA5OiBPSVM2ICovDQotfTsNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBkZWZncm91cCBUSU1fTExfUHJpdmF0ZV9Db25zdGFudHMgVElNIFByaXZhdGUgQ29uc3RhbnRzDQotICogQHsNCi0gKi8NCi0NCi0vKiBEZWZpbmVzIHVzZWQgZm9yIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIHJlZ2lzdGVyIGFuZCBwZXJmb3JtIG9mZnNldHMgKi8NCi0jZGVmaW5lIFRJTV9QT1NJVElPTl9CUktfU09VUkNFIChQT1NJVElPTl9WQUwoU291cmNlKSAmIDB4MUZVTCkNCi0NCi0vKiBHZW5lcmljIGJpdCBkZWZpbml0aW9ucyBmb3IgVElNeF9BRjEgcmVnaXN0ZXIgKi8NCi0jZGVmaW5lIFRJTXhfQUYxX0JLSU5QIFRJTTFfQUYxX0JLSU5QICAgLyohPCBCUksgQktJTiBpbnB1dCBwb2xhcml0eSAqLw0KLSNkZWZpbmUgVElNeF9BRjFfRVRSU0VMIFRJTTFfQUYxX0VUUlNFTCAvKiE8IFRJTXggRVRSIHNvdXJjZSBzZWxlY3Rpb24gKi8NCi0NCi0vKiBNYXNrIHVzZWQgdG8gc2V0IHRoZSBUREdbeDowXSBvZiB0aGUgRFRHIGJpdHMgb2YgdGhlIFRJTXhfQkRUUiByZWdpc3RlciAqLw0KLSNkZWZpbmUgRFRfREVMQVlfMSAoKHVpbnQ4X3QpMHg3RikNCi0jZGVmaW5lIERUX0RFTEFZXzIgKCh1aW50OF90KTB4M0YpDQotI2RlZmluZSBEVF9ERUxBWV8zICgodWludDhfdCkweDFGKQ0KLSNkZWZpbmUgRFRfREVMQVlfNCAoKHVpbnQ4X3QpMHgxRikNCi0NCi0vKiBNYXNrIHVzZWQgdG8gc2V0IHRoZSBEVEdbNzo1XSBiaXRzIG9mIHRoZSBEVEcgYml0cyBvZiB0aGUgVElNeF9CRFRSIHJlZ2lzdGVyDQotICovDQotI2RlZmluZSBEVF9SQU5HRV8xICgodWludDhfdCkweDAwKQ0KLSNkZWZpbmUgRFRfUkFOR0VfMiAoKHVpbnQ4X3QpMHg4MCkNCi0jZGVmaW5lIERUX1JBTkdFXzMgKCh1aW50OF90KTB4QzApDQotI2RlZmluZSBEVF9SQU5HRV80ICgodWludDhfdCkweEUwKQ0KLQ0KLS8qKiBMZWdhY3kgZGVmaW5pdGlvbnMgZm9yIGNvbXBhdGliaWxpdHkgcHVycG9zZQ0KLUBjb25kIDANCi0gICovDQotLyoqDQotQGVuZGNvbmQNCi0gICovDQotDQotI2RlZmluZSBPQ1JFRl9DTEVBUl9TRUxFQ1RfUG9zICgyOFUpDQotI2RlZmluZSBPQ1JFRl9DTEVBUl9TRUxFQ1RfTXNrIFwNCi0gICgweDFVIDw8IE9DUkVGX0NMRUFSX1NFTEVDVF9Qb3MpIC8qITwgMHgxMDAwMDAwMCAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGRlZmdyb3VwIFRJTV9MTF9Qcml2YXRlX01hY3JvcyBUSU0gUHJpdmF0ZSBNYWNyb3MNCi0gKiBAew0KLSAqLw0KLS8qKiBAYnJpZWYgIENvbnZlcnQgY2hhbm5lbCBpZCBpbnRvIGNoYW5uZWwgaW5kZXguDQotICogQHBhcmFtICBfX0NIQU5ORUxfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMU4NCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDJODQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzTg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINE4NCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDYNCi0gKiBAcmV0dmFsIG5vbmUNCi0gKi8NCi0jZGVmaW5lIFRJTV9HRVRfQ0hBTk5FTF9JTkRFWChfX0NIQU5ORUxfXykgICAgICAgXA0KLSAgKCgoX19DSEFOTkVMX18pID09IExMX1RJTV9DSEFOTkVMX0NIMSkgICAgPyAwVSBcDQotICAgOiAoKF9fQ0hBTk5FTF9fKSA9PSBMTF9USU1fQ0hBTk5FTF9DSDFOKSA/IDFVIFwNCi0gICA6ICgoX19DSEFOTkVMX18pID09IExMX1RJTV9DSEFOTkVMX0NIMikgID8gMlUgXA0KLSAgIDogKChfX0NIQU5ORUxfXykgPT0gTExfVElNX0NIQU5ORUxfQ0gyTikgPyAzVSBcDQotICAgOiAoKF9fQ0hBTk5FTF9fKSA9PSBMTF9USU1fQ0hBTk5FTF9DSDMpICA/IDRVIFwNCi0gICA6ICgoX19DSEFOTkVMX18pID09IExMX1RJTV9DSEFOTkVMX0NIM04pID8gNVUgXA0KLSAgIDogKChfX0NIQU5ORUxfXykgPT0gTExfVElNX0NIQU5ORUxfQ0g0KSAgPyA2VSBcDQotICAgOiAoKF9fQ0hBTk5FTF9fKSA9PSBMTF9USU1fQ0hBTk5FTF9DSDROKSA/IDdVIFwNCi0gICA6ICgoX19DSEFOTkVMX18pID09IExMX1RJTV9DSEFOTkVMX0NINSkgID8gOFUgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiA5VSkNCi0NCi0vKiogQGJyaWVmICBDYWxjdWxhdGUgdGhlIGRlYWR0aW1lIHNhbXBsaW5nIHBlcmlvZChpbiBwcykuDQotICogQHBhcmFtICBfX1RJTUNMS19fIHRpbWVyIGlucHV0IGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopLg0KLSAqIEBwYXJhbSAgX19DS0RfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DTE9DS0RJVklTSU9OX0RJVjENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0xPQ0tESVZJU0lPTl9ESVYyDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NMT0NLRElWSVNJT05fRElWNA0KLSAqIEByZXR2YWwgbm9uZQ0KLSAqLw0KLSNkZWZpbmUgVElNX0NBTENfRFRTKF9fVElNQ0xLX18sIF9fQ0tEX18pICAgICAgICAgICAgICAgICAgXA0KLSAgKCgoX19DS0RfXykgPT0gTExfVElNX0NMT0NLRElWSVNJT05fRElWMSkgICAgICAgICAgICAgICAgXA0KLSAgICAgICA/ICgodWludDY0X3QpMTAwMDAwMDAwMDAwMFUgLyAoX19USU1DTEtfXykpICAgICAgICAgXA0KLSAgIDogKChfX0NLRF9fKSA9PSBMTF9USU1fQ0xPQ0tESVZJU0lPTl9ESVYyKSAgICAgICAgICAgICAgXA0KLSAgICAgICA/ICgodWludDY0X3QpMTAwMDAwMDAwMDAwMFUgLyAoKF9fVElNQ0xLX18pID4+IDFVKSkgXA0KLSAgICAgICA6ICgodWludDY0X3QpMTAwMDAwMDAwMDAwMFUgLyAoKF9fVElNQ0xLX18pID4+IDJVKSkpDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikNCi0vKiogQGRlZmdyb3VwIFRJTV9MTF9FU19JTklUIFRJTSBFeHBvcnRlZCBJbml0IHN0cnVjdHVyZQ0KLSAqIEB7DQotICovDQotDQotLyoqDQotICogQGJyaWVmICBUSU0gVGltZSBCYXNlIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlIGRlZmluaXRpb24uDQotICovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgdWludDE2X3QgUHJlc2NhbGVyOyAvKiE8IFNwZWNpZmllcyB0aGUgcHJlc2NhbGVyIHZhbHVlIHVzZWQgdG8gZGl2aWRlIHRoZSBUSU0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xvY2suIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuDQotICAgICAgICAgICAgICAgICAgICAgICAgIE1pbl9EYXRhPTB4MDAwMCBhbmQgTWF4X0RhdGE9MHhGRkZGLg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5DQotICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBMTF9USU1fU2V0UHJlc2NhbGVyKCkuKi8NCi0NCi0gIHVpbnQzMl90IENvdW50ZXJNb2RlOyAvKiE8IFNwZWNpZmllcyB0aGUgY291bnRlciBtb2RlLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9MTF9FQ19DT1VOVEVSTU9ERS4NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRhcnkgZnVuY3Rpb24NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgTExfVElNX1NldENvdW50ZXJNb2RlKCkuKi8NCi0NCi0gIHVpbnQzMl90IEF1dG9yZWxvYWQ7IC8qITwgU3BlY2lmaWVzIHRoZSBhdXRvIHJlbG9hZCB2YWx1ZSB0byBiZSBsb2FkZWQgaW50bw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGFjdGl2ZSBBdXRvLVJlbG9hZCBSZWdpc3RlciBhdCB0aGUgbmV4dCB1cGRhdGUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LiBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE1pbl9EYXRhPTB4MDAwMCBhbmQgTWF4X0RhdGE9MHhGRkZGLiBTb21lIHRpbWVyDQotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZXMgbWF5IHN1cHBvcnQgMzIgYml0cyBjb3VudGVycy4gSW4gdGhhdCBjYXNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gMHgwMDAwIGFuZA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkZGRi4NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nDQotICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0YXJ5IGZ1bmN0aW9uDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgTExfVElNX1NldEF1dG9SZWxvYWQoKS4qLw0KLQ0KLSAgdWludDMyX3QgQ2xvY2tEaXZpc2lvbjsgLyohPCBTcGVjaWZpZXMgdGhlIGNsb2NrIGRpdmlzaW9uLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fTExfRUNfQ0xPQ0tESVZJU0lPTi4NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0YXJ5IGZ1bmN0aW9uDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgTExfVElNX1NldENsb2NrRGl2aXNpb24oKS4qLw0KLQ0KLSAgdWludDMyX3QNCi0gICAgICBSZXBldGl0aW9uQ291bnRlcjsgLyohPCBTcGVjaWZpZXMgdGhlIHJlcGV0aXRpb24gY291bnRlciB2YWx1ZS4gRWFjaCB0aW1lDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBSQ1IgZG93bmNvdW50ZXIgcmVhY2hlcyB6ZXJvLCBhbiB1cGRhdGUgZXZlbnQgaXMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkIGFuZCBjb3VudGluZyByZXN0YXJ0cyBmcm9tIHRoZSBSQ1IgdmFsdWUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE4pLiBUaGlzIG1lYW5zIGluIFBXTSBtb2RlIHRoYXQgKE4rMSkgY29ycmVzcG9uZHMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG86DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHRoZSBudW1iZXIgb2YgUFdNIHBlcmlvZHMgaW4gZWRnZS1hbGlnbmVkIG1vZGUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gdGhlIG51bWJlciBvZiBoYWxmIFBXTSBwZXJpb2QgaW4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyLWFsaWduZWQgbW9kZSBHUCB0aW1lcnM6IHRoaXMgcGFyYW1ldGVyIG11c3QNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MDAgYW5kIE1heF9EYXRhID0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRi4gQWR2YW5jZWQgdGltZXJzOiB0aGlzIHBhcmFtZXRlciBtdXN0IGJlIGENCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAwMDAgYW5kIE1heF9EYXRhID0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGLg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRhcnkgZnVuY3Rpb24NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgTExfVElNX1NldFJlcGV0aXRpb25Db3VudGVyKCkuKi8NCi19IExMX1RJTV9Jbml0VHlwZURlZjsNCi0NCi0vKioNCi0gKiBAYnJpZWYgIFRJTSBPdXRwdXQgQ29tcGFyZSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSBkZWZpbml0aW9uLg0KLSAqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gIHVpbnQzMl90IE9DTW9kZTsgLyohPCBTcGVjaWZpZXMgdGhlIG91dHB1dCBtb2RlLg0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0xMX0VDX09DTU9ERS4NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeQ0KLSAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbg0KLSAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgTExfVElNX09DX1NldE1vZGUoKS4qLw0KLQ0KLSAgdWludDMyX3QNCi0gICAgICBPQ1N0YXRlOyAvKiE8IFNwZWNpZmllcyB0aGUgVElNIE91dHB1dCBDb21wYXJlIHN0YXRlLg0KLSAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTExfRUNfT0NTVEFURS4NCi0NCi0gICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5DQotICAgICAgICAgICAgICAgICAgZnVuY3Rpb25zDQotICAgICAgICAgICAgICAgICAgICBAcmVmIExMX1RJTV9DQ19FbmFibGVDaGFubmVsKCkgb3IgQHJlZg0KLSAgICAgICAgICAgICAgICAgIExMX1RJTV9DQ19EaXNhYmxlQ2hhbm5lbCgpLiovDQotDQotICB1aW50MzJfdA0KLSAgICAgIE9DTlN0YXRlOyAvKiE8IFNwZWNpZmllcyB0aGUgVElNIGNvbXBsZW1lbnRhcnkgT3V0cHV0IENvbXBhcmUgc3RhdGUuDQotICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTExfRUNfT0NTVEFURS4NCi0NCi0gICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeQ0KLSAgICAgICAgICAgICAgICAgICBmdW5jdGlvbnMNCi0gICAgICAgICAgICAgICAgICAgICBAcmVmIExMX1RJTV9DQ19FbmFibGVDaGFubmVsKCkgb3IgQHJlZg0KLSAgICAgICAgICAgICAgICAgICBMTF9USU1fQ0NfRGlzYWJsZUNoYW5uZWwoKS4qLw0KLQ0KLSAgdWludDMyX3QgQ29tcGFyZVZhbHVlOyAvKiE8IFNwZWNpZmllcyB0aGUgQ29tcGFyZSB2YWx1ZSB0byBiZSBsb2FkZWQgaW50byB0aGUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FwdHVyZSBDb21wYXJlIFJlZ2lzdGVyLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YT0weDAwMDAgYW5kIE1heF9EYXRhPTB4RkZGRi4NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdGFyeSBmdW5jdGlvbiBMTF9USU1fT0NfU2V0Q29tcGFyZUNIeCAoeD0xLi42KS4qLw0KLQ0KLSAgdWludDMyX3QgT0NQb2xhcml0eTsgLyohPCBTcGVjaWZpZXMgdGhlIG91dHB1dCBwb2xhcml0eS4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX0xMX0VDX09DUE9MQVJJVFkuDQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdGFyeSBmdW5jdGlvbg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExMX1RJTV9PQ19TZXRQb2xhcml0eSgpLiovDQotDQotICB1aW50MzJfdCBPQ05Qb2xhcml0eTsgLyohPCBTcGVjaWZpZXMgdGhlIGNvbXBsZW1lbnRhcnkgb3V0cHV0IHBvbGFyaXR5Lg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9MTF9FQ19PQ1BPTEFSSVRZLg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdGFyeSBmdW5jdGlvbg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBMTF9USU1fT0NfU2V0UG9sYXJpdHkoKS4qLw0KLQ0KLSAgdWludDMyX3QgT0NJZGxlU3RhdGU7IC8qITwgU3BlY2lmaWVzIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgcGluIHN0YXRlIGR1cmluZw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIElkbGUgc3RhdGUuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fTExfRUNfT0NJRExFU1RBVEUuDQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0YXJ5IGZ1bmN0aW9uDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExMX1RJTV9PQ19TZXRJZGxlU3RhdGUoKS4qLw0KLQ0KLSAgdWludDMyX3QgT0NOSWRsZVN0YXRlOyAvKiE8IFNwZWNpZmllcyB0aGUgVElNIE91dHB1dCBDb21wYXJlIHBpbiBzdGF0ZSBkdXJpbmcNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRsZSBzdGF0ZS4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fTExfRUNfT0NJRExFU1RBVEUuDQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRhcnkgZnVuY3Rpb24NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExMX1RJTV9PQ19TZXRJZGxlU3RhdGUoKS4qLw0KLX0gTExfVElNX09DX0luaXRUeXBlRGVmOw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgVElNIElucHV0IENhcHR1cmUgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4NCi0gKi8NCi0NCi10eXBlZGVmIHN0cnVjdCB7DQotICB1aW50MzJfdCBJQ1BvbGFyaXR5OyAvKiE8IFNwZWNpZmllcyB0aGUgYWN0aXZlIGVkZ2Ugb2YgdGhlIGlucHV0IHNpZ25hbC4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX0xMX0VDX0lDX1BPTEFSSVRZLg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRhcnkgZnVuY3Rpb24NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBMTF9USU1fSUNfU2V0UG9sYXJpdHkoKS4qLw0KLQ0KLSAgdWludDMyX3QgSUNBY3RpdmVJbnB1dDsgLyohPCBTcGVjaWZpZXMgdGhlIGlucHV0Lg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fTExfRUNfQUNUSVZFSU5QVVQuDQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdGFyeSBmdW5jdGlvbg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExMX1RJTV9JQ19TZXRBY3RpdmVJbnB1dCgpLiovDQotDQotICB1aW50MzJfdA0KLSAgICAgIElDUHJlc2NhbGVyOyAvKiE8IFNwZWNpZmllcyB0aGUgSW5wdXQgQ2FwdHVyZSBQcmVzY2FsZXIuDQotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTExfRUNfSUNQU0MuDQotDQotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkNCi0gICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24NCi0gICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExMX1RJTV9JQ19TZXRQcmVzY2FsZXIoKS4qLw0KLQ0KLSAgdWludDMyX3QNCi0gICAgICBJQ0ZpbHRlcjsgLyohPCBTcGVjaWZpZXMgdGhlIGlucHV0IGNhcHR1cmUgZmlsdGVyLg0KLSAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0xMX0VDX0lDX0ZJTFRFUi4NCi0NCi0gICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeQ0KLSAgICAgICAgICAgICAgICAgICBmdW5jdGlvbg0KLSAgICAgICAgICAgICAgICAgICAgIEByZWYgTExfVElNX0lDX1NldEZpbHRlcigpLiovDQotfSBMTF9USU1fSUNfSW5pdFR5cGVEZWY7DQotDQotLyoqDQotICogQGJyaWVmICBUSU0gRW5jb2RlciBpbnRlcmZhY2UgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4NCi0gKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICB1aW50MzJfdCBFbmNvZGVyTW9kZTsgLyohPCBTcGVjaWZpZXMgdGhlIGVuY29kZXIgcmVzb2x1dGlvbiAoeDIgb3IgeDQpLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9MTF9FQ19FTkNPREVSTU9ERS4NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRhcnkgZnVuY3Rpb24NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgTExfVElNX1NldEVuY29kZXJNb2RlKCkuKi8NCi0NCi0gIHVpbnQzMl90IElDMVBvbGFyaXR5OyAvKiE8IFNwZWNpZmllcyB0aGUgYWN0aXZlIGVkZ2Ugb2YgVEkxIGlucHV0Lg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9MTF9FQ19JQ19QT0xBUklUWS4NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRhcnkgZnVuY3Rpb24NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgTExfVElNX0lDX1NldFBvbGFyaXR5KCkuKi8NCi0NCi0gIHVpbnQzMl90IElDMUFjdGl2ZUlucHV0OyAvKiE8IFNwZWNpZmllcyB0aGUgVEkxIGlucHV0IHNvdXJjZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9MTF9FQ19BQ1RJVkVJTlBVVC4NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRhcnkgZnVuY3Rpb24NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgTExfVElNX0lDX1NldEFjdGl2ZUlucHV0KCkuKi8NCi0NCi0gIHVpbnQzMl90DQotICAgICAgSUMxUHJlc2NhbGVyOyAvKiE8IFNwZWNpZmllcyB0aGUgVEkxIGlucHV0IHByZXNjYWxlciB2YWx1ZS4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTExfRUNfSUNQU0MuDQotDQotICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5DQotICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbg0KLSAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExMX1RJTV9JQ19TZXRQcmVzY2FsZXIoKS4qLw0KLQ0KLSAgdWludDMyX3QNCi0gICAgICBJQzFGaWx0ZXI7IC8qITwgU3BlY2lmaWVzIHRoZSBUSTEgaW5wdXQgZmlsdGVyLg0KLSAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9MTF9FQ19JQ19GSUxURVIuDQotDQotICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5DQotICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbg0KLSAgICAgICAgICAgICAgICAgICAgICBAcmVmIExMX1RJTV9JQ19TZXRGaWx0ZXIoKS4qLw0KLQ0KLSAgdWludDMyX3QgSUMyUG9sYXJpdHk7IC8qITwgU3BlY2lmaWVzIHRoZSBhY3RpdmUgZWRnZSBvZiBUSTIgaW5wdXQuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fTExfRUNfSUNfUE9MQVJJVFkuDQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRhcnkgZnVuY3Rpb24NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBMTF9USU1fSUNfU2V0UG9sYXJpdHkoKS4qLw0KLQ0KLSAgdWludDMyX3QgSUMyQWN0aXZlSW5wdXQ7IC8qITwgU3BlY2lmaWVzIHRoZSBUSTIgaW5wdXQgc291cmNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX0xMX0VDX0FDVElWRUlOUFVULg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdGFyeSBmdW5jdGlvbg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBMTF9USU1fSUNfU2V0QWN0aXZlSW5wdXQoKS4qLw0KLQ0KLSAgdWludDMyX3QNCi0gICAgICBJQzJQcmVzY2FsZXI7IC8qITwgU3BlY2lmaWVzIHRoZSBUSTIgaW5wdXQgcHJlc2NhbGVyIHZhbHVlLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9MTF9FQ19JQ1BTQy4NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkNCi0gICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uDQotICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgTExfVElNX0lDX1NldFByZXNjYWxlcigpLiovDQotDQotICB1aW50MzJfdA0KLSAgICAgIElDMkZpbHRlcjsgLyohPCBTcGVjaWZpZXMgdGhlIFRJMiBpbnB1dCBmaWx0ZXIuDQotICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0xMX0VDX0lDX0ZJTFRFUi4NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkNCi0gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uDQotICAgICAgICAgICAgICAgICAgICAgIEByZWYgTExfVElNX0lDX1NldEZpbHRlcigpLiovDQotDQotfSBMTF9USU1fRU5DT0RFUl9Jbml0VHlwZURlZjsNCi0NCi0vKioNCi0gKiBAYnJpZWYgIFRJTSBIYWxsIHNlbnNvciBpbnRlcmZhY2UgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4NCi0gKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICB1aW50MzJfdCBJQzFQb2xhcml0eTsgLyohPCBTcGVjaWZpZXMgdGhlIGFjdGl2ZSBlZGdlIG9mIFRJMSBpbnB1dC4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fTExfRUNfSUNfUE9MQVJJVFkuDQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0YXJ5IGZ1bmN0aW9uDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExMX1RJTV9JQ19TZXRQb2xhcml0eSgpLiovDQotDQotICB1aW50MzJfdCBJQzFQcmVzY2FsZXI7IC8qITwgU3BlY2lmaWVzIHRoZSBUSTEgaW5wdXQgcHJlc2NhbGVyIHZhbHVlLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZXNjYWxlciBtdXN0IGJlIHNldCB0byBnZXQgYSBtYXhpbXVtIGNvdW50ZXINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyaW9kIGxvbmdlciB0aGFuIHRoZSB0aW1lIGludGVydmFsIGJldHdlZW4gMg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zZWN1dGl2ZSBjaGFuZ2VzIG9uIHRoZSBIYWxsIGlucHV0cy4gVGhpcw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTExfRUNfSUNQU0MuDQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRhcnkgZnVuY3Rpb24NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExMX1RJTV9JQ19TZXRQcmVzY2FsZXIoKS4qLw0KLQ0KLSAgdWludDMyX3QgSUMxRmlsdGVyOyAvKiE8IFNwZWNpZmllcyB0aGUgVEkxIGlucHV0IGZpbHRlci4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgVElNX0xMX0VDX0lDX0ZJTFRFUi4NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgTExfVElNX0lDX1NldEZpbHRlcigpLiovDQotDQotICB1aW50MzJfdCBDb21tdXRhdGlvbkRlbGF5OyAvKiE8IFNwZWNpZmllcyB0aGUgY29tcGFyZSB2YWx1ZSB0byBiZSBsb2FkZWQgaW50bw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIENhcHR1cmUgQ29tcGFyZSBSZWdpc3Rlci4gQSBwb3NpdGl2ZSBwdWxzZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFRSR08gZXZlbnQpIGlzIGdlbmVyYXRlZCB3aXRoIGEgcHJvZ3JhbW1hYmxlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheSBldmVyeSB0aW1lIGEgY2hhbmdlIG9jY3VycyBvbiB0aGUgSGFsbA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRzLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBudW1iZXIgYmV0d2Vlbg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWluX0RhdGEgPSAweDAwMDAgYW5kIE1heF9EYXRhID0gMHhGRkZGLg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRhcnkgZnVuY3Rpb24NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBMTF9USU1fT0NfU2V0Q29tcGFyZUNIMigpLiovDQotfSBMTF9USU1fSEFMTFNFTlNPUl9Jbml0VHlwZURlZjsNCi0NCi0vKioNCi0gKiBAYnJpZWYgIEJEVFIgKEJyZWFrIGFuZCBEZWFkIFRpbWUpIHN0cnVjdHVyZSBkZWZpbml0aW9uDQotICovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgdWludDMyX3QgT1NTUlN0YXRlOyAvKiE8IFNwZWNpZmllcyB0aGUgT2ZmLVN0YXRlIHNlbGVjdGlvbiB1c2VkIGluIFJ1biBtb2RlLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0xMX0VDX09TU1INCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgTExfVElNX1NldE9mZlN0YXRlcygpDQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgVGhpcyBiaXQtZmllbGQgY2Fubm90IGJlIG1vZGlmaWVkIGFzIGxvbmcgYXMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgTE9DSyBsZXZlbCAyIGhhcyBiZWVuIHByb2dyYW1tZWQuICovDQotDQotICB1aW50MzJfdCBPU1NJU3RhdGU7IC8qITwgU3BlY2lmaWVzIHRoZSBPZmYtU3RhdGUgdXNlZCBpbiBJZGxlIHN0YXRlLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0xMX0VDX09TU0kNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgTExfVElNX1NldE9mZlN0YXRlcygpDQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgVGhpcyBiaXQtZmllbGQgY2Fubm90IGJlIG1vZGlmaWVkIGFzIGxvbmcgYXMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgTE9DSyBsZXZlbCAyIGhhcyBiZWVuIHByb2dyYW1tZWQuICovDQotDQotICB1aW50MzJfdA0KLSAgICAgIExvY2tMZXZlbDsgLyohPCBTcGVjaWZpZXMgdGhlIExPQ0sgbGV2ZWwgcGFyYW1ldGVycy4NCi0gICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTExfRUNfTE9DS0xFVkVMDQotDQotICAgICAgICAgICAgICAgICAgICAgIEBub3RlIFRoZSBMT0NLIGJpdHMgY2FuIGJlIHdyaXR0ZW4gb25seSBvbmNlIGFmdGVyIHRoZQ0KLSAgICAgICAgICAgICAgICAgICAgcmVzZXQuIE9uY2UgdGhlIFRJTXhfQkRUUiByZWdpc3RlciBoYXMgYmVlbiB3cml0dGVuLCB0aGVpcg0KLSAgICAgICAgICAgICAgICAgICAgY29udGVudCBpcyBmcm96ZW4gdW50aWwgdGhlIG5leHQgcmVzZXQuKi8NCi0NCi0gIHVpbnQ4X3QgRGVhZFRpbWU7IC8qITwgU3BlY2lmaWVzIHRoZSBkZWxheSB0aW1lIGJldHdlZW4gdGhlIHN3aXRjaGluZy1vZmYgYW5kDQotICAgICAgICAgICAgICAgICAgICAgICB0aGUgc3dpdGNoaW5nLW9uIG9mIHRoZSBvdXRwdXRzLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYQ0KLSAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAwIGFuZCBNYXhfRGF0YSA9IDB4RkYuDQotDQotICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5DQotICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbg0KLSAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExMX1RJTV9PQ19TZXREZWFkVGltZSgpDQotDQotICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIFRoaXMgYml0LWZpZWxkIGNhbiBub3QgYmUgbW9kaWZpZWQgYXMgbG9uZyBhcw0KLSAgICAgICAgICAgICAgICAgICAgICAgTE9DSyBsZXZlbCAxLCAyIG9yIDMgaGFzIGJlZW4gcHJvZ3JhbW1lZC4gKi8NCi0NCi0gIHVpbnQxNl90IEJyZWFrU3RhdGU7IC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIFRJTSBCcmVhayBpbnB1dCBpcyBlbmFibGVkIG9yDQotICAgICAgICAgICAgICAgICAgICAgICAgICBub3QuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9MTF9FQ19CUkVBS19FTkFCTEUNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nDQotICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0YXJ5IGZ1bmN0aW9ucw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExMX1RJTV9FbmFibGVCUksoKSBvciBAcmVmIExMX1RJTV9EaXNhYmxlQlJLKCkNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgVGhpcyBiaXQtZmllbGQgY2FuIG5vdCBiZSBtb2RpZmllZCBhcyBsb25nIGFzDQotICAgICAgICAgICAgICAgICAgICAgICAgICBMT0NLIGxldmVsIDEgaGFzIGJlZW4gcHJvZ3JhbW1lZC4gKi8NCi0NCi0gIHVpbnQzMl90IEJyZWFrUG9sYXJpdHk7IC8qITwgU3BlY2lmaWVzIHRoZSBUSU0gQnJlYWsgSW5wdXQgcGluIHBvbGFyaXR5Lg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fTExfRUNfQlJFQUtfUE9MQVJJVFkNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0YXJ5IGZ1bmN0aW9uDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgTExfVElNX0NvbmZpZ0JSSygpDQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIFRoaXMgYml0LWZpZWxkIGNhbiBub3QgYmUgbW9kaWZpZWQgYXMgbG9uZw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgTE9DSyBsZXZlbCAxIGhhcyBiZWVuIHByb2dyYW1tZWQuICovDQotDQotICB1aW50MzJfdCBCcmVha0ZpbHRlcjsgLyohPCBTcGVjaWZpZXMgdGhlIFRJTSBCcmVhayBGaWx0ZXIuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX0xMX0VDX0JSRUFLX0ZJTFRFUg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdGFyeSBmdW5jdGlvbg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBMTF9USU1fQ29uZmlnQlJLKCkNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIFRoaXMgYml0LWZpZWxkIGNhbiBub3QgYmUgbW9kaWZpZWQgYXMgbG9uZyBhcw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIExPQ0sgbGV2ZWwgMSBoYXMgYmVlbiBwcm9ncmFtbWVkLiAqLw0KLQ0KLSAgdWludDMyX3QgQnJlYWtBRk1vZGU7IC8qITwgU3BlY2lmaWVzIHRoZSBhbHRlcm5hdGUgZnVuY3Rpb24gbW9kZSBvZiB0aGUgYnJlYWsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9MTF9FQ19CUkVBS19BRk1PREUNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdGFyeSBmdW5jdGlvbnMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBMTF9USU1fQ29uZmlnQlJLKCkNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgQmlkaXJlY3Rpb25hbCBicmVhayBpbnB1dCBpcyBvbmx5IHN1cHBvcnRlZCBieQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkdmFuY2VkIHRpbWVycyBpbnN0YW5jZXMuDQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIFRoaXMgYml0LWZpZWxkIGNhbiBub3QgYmUgbW9kaWZpZWQgYXMgbG9uZyBhcw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIExPQ0sgbGV2ZWwgMSBoYXMgYmVlbiBwcm9ncmFtbWVkLiAqLw0KLQ0KLSAgdWludDMyX3QNCi0gICAgICBCcmVhazJTdGF0ZTsgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgVElNIEJyZWFrMiBpbnB1dCBpcyBlbmFibGVkIG9yDQotICAgICAgICAgICAgICAgICAgICAgIG5vdC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICBUSU1fTExfRUNfQlJFQUsyX0VOQUJMRQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5DQotICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9ucw0KLSAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgTExfVElNX0VuYWJsZUJSSzIoKSBvciBAcmVmIExMX1RJTV9EaXNhYmxlQlJLMigpDQotDQotICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgVGhpcyBiaXQtZmllbGQgY2FuIG5vdCBiZSBtb2RpZmllZCBhcyBsb25nIGFzIExPQ0sNCi0gICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgMSBoYXMgYmVlbiBwcm9ncmFtbWVkLiAqLw0KLQ0KLSAgdWludDMyX3QgQnJlYWsyUG9sYXJpdHk7IC8qITwgU3BlY2lmaWVzIHRoZSBUSU0gQnJlYWsyIElucHV0IHBpbiBwb2xhcml0eS4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9MTF9FQ19CUkVBSzJfUE9MQVJJVFkNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdGFyeSBmdW5jdGlvbg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExMX1RJTV9Db25maWdCUksyKCkNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgVGhpcyBiaXQtZmllbGQgY2FuIG5vdCBiZSBtb2RpZmllZCBhcyBsb25nDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgTE9DSyBsZXZlbCAxIGhhcyBiZWVuIHByb2dyYW1tZWQuICovDQotDQotICB1aW50MzJfdCBCcmVhazJGaWx0ZXI7IC8qITwgU3BlY2lmaWVzIHRoZSBUSU0gQnJlYWsyIEZpbHRlci4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX0xMX0VDX0JSRUFLMl9GSUxURVINCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0YXJ5IGZ1bmN0aW9uDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExMX1RJTV9Db25maWdCUksyKCkNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIFRoaXMgYml0LWZpZWxkIGNhbiBub3QgYmUgbW9kaWZpZWQgYXMgbG9uZyBhcw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0NLIGxldmVsIDEgaGFzIGJlZW4gcHJvZ3JhbW1lZC4gKi8NCi0NCi0gIHVpbnQzMl90IEJyZWFrMkFGTW9kZTsgLyohPCBTcGVjaWZpZXMgdGhlIGFsdGVybmF0ZSBmdW5jdGlvbiBtb2RlIG9mIHRoZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazIgaW5wdXQuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX0xMX0VDX0JSRUFLMl9BRk1PREUNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0YXJ5IGZ1bmN0aW9ucw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBMTF9USU1fQ29uZmlnQlJLMigpDQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBCaWRpcmVjdGlvbmFsIGJyZWFrIGlucHV0IGlzIG9ubHkgc3VwcG9ydGVkDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IGFkdmFuY2VkIHRpbWVycyBpbnN0YW5jZXMuDQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBUaGlzIGJpdC1maWVsZCBjYW4gbm90IGJlIG1vZGlmaWVkIGFzIGxvbmcgYXMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9DSyBsZXZlbCAxIGhhcyBiZWVuIHByb2dyYW1tZWQuICovDQotDQotICB1aW50MzJfdCBBdXRvbWF0aWNPdXRwdXQ7IC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIFRJTSBBdXRvbWF0aWMgT3V0cHV0DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmUgaXMgZW5hYmxlZCBvciBub3QuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHZhbHVlIG9mIEByZWYgVElNX0xMX0VDX0FVVE9NQVRJQ09VVFBVVF9FTkFCTEUNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdGFyeSBmdW5jdGlvbnMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExMX1RJTV9FbmFibGVBdXRvbWF0aWNPdXRwdXQoKSBvciBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX1RJTV9EaXNhYmxlQXV0b21hdGljT3V0cHV0KCkNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBUaGlzIGJpdC1maWVsZCBjYW4gbm90IGJlIG1vZGlmaWVkIGFzDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgYXMgTE9DSyBsZXZlbCAxIGhhcyBiZWVuIHByb2dyYW1tZWQuICovDQotfSBMTF9USU1fQkRUUl9Jbml0VHlwZURlZjsNCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLSNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8NCi0NCi0vKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgVElNX0xMX0V4cG9ydGVkX0NvbnN0YW50cyBUSU0gRXhwb3J0ZWQgQ29uc3RhbnRzDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19HRVRfRkxBRyBHZXQgRmxhZ3MgRGVmaW5lcw0KLSAqIEBicmllZiAgICBGbGFncyBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfVElNX1JlYWRSZWcgZnVuY3Rpb24uDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1RJTV9TUl9VSUYgVElNX1NSX1VJRiAgICAgLyohPCBVcGRhdGUgaW50ZXJydXB0IGZsYWcgKi8NCi0jZGVmaW5lIExMX1RJTV9TUl9DQzFJRiBUSU1fU1JfQ0MxSUYgLyohPCBDYXB0dXJlL2NvbXBhcmUgMSBpbnRlcnJ1cHQgZmxhZyAqLw0KLSNkZWZpbmUgTExfVElNX1NSX0NDMklGIFRJTV9TUl9DQzJJRiAvKiE8IENhcHR1cmUvY29tcGFyZSAyIGludGVycnVwdCBmbGFnICovDQotI2RlZmluZSBMTF9USU1fU1JfQ0MzSUYgVElNX1NSX0NDM0lGIC8qITwgQ2FwdHVyZS9jb21wYXJlIDMgaW50ZXJydXB0IGZsYWcgKi8NCi0jZGVmaW5lIExMX1RJTV9TUl9DQzRJRiBUSU1fU1JfQ0M0SUYgLyohPCBDYXB0dXJlL2NvbXBhcmUgNCBpbnRlcnJ1cHQgZmxhZyAqLw0KLSNkZWZpbmUgTExfVElNX1NSX0NDNUlGIFRJTV9TUl9DQzVJRiAvKiE8IENhcHR1cmUvY29tcGFyZSA1IGludGVycnVwdCBmbGFnICovDQotI2RlZmluZSBMTF9USU1fU1JfQ0M2SUYgVElNX1NSX0NDNklGIC8qITwgQ2FwdHVyZS9jb21wYXJlIDYgaW50ZXJydXB0IGZsYWcgKi8NCi0jZGVmaW5lIExMX1RJTV9TUl9DT01JRiBUSU1fU1JfQ09NSUYgLyohPCBDT00gaW50ZXJydXB0IGZsYWcgKi8NCi0jZGVmaW5lIExMX1RJTV9TUl9USUYgVElNX1NSX1RJRiAgICAgLyohPCBUcmlnZ2VyIGludGVycnVwdCBmbGFnICovDQotI2RlZmluZSBMTF9USU1fU1JfQklGIFRJTV9TUl9CSUYgICAgIC8qITwgQnJlYWsgaW50ZXJydXB0IGZsYWcgKi8NCi0jZGVmaW5lIExMX1RJTV9TUl9CMklGIFRJTV9TUl9CMklGICAgLyohPCBTZWNvbmQgYnJlYWsgaW50ZXJydXB0IGZsYWcgKi8NCi0jZGVmaW5lIExMX1RJTV9TUl9DQzFPRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgVElNX1NSX0NDMU9GIC8qITwgQ2FwdHVyZS9Db21wYXJlIDEgb3ZlcmNhcHR1cmUgZmxhZyBcDQotICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9USU1fU1JfQ0MyT0YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIFRJTV9TUl9DQzJPRiAvKiE8IENhcHR1cmUvQ29tcGFyZSAyIG92ZXJjYXB0dXJlIGZsYWcgXA0KLSAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfVElNX1NSX0NDM09GICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBUSU1fU1JfQ0MzT0YgLyohPCBDYXB0dXJlL0NvbXBhcmUgMyBvdmVyY2FwdHVyZSBmbGFnIFwNCi0gICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX1RJTV9TUl9DQzRPRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIFRJTV9TUl9DQzRPRiAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDYXB0dXJlL0NvbXBhcmUgNCBvdmVyY2FwdHVyZSBmbGFnIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9USU1fU1JfU0JJRiBUSU1fU1JfU0JJRiAgIC8qITwgU3lzdGVtIEJyZWFrIGludGVycnVwdCBmbGFnICAqLw0KLSNkZWZpbmUgTExfVElNX1NSX0lEWEYgVElNX1NSX0lEWEYgICAvKiE8IEluZGV4IGludGVycnVwdCBmbGFnICAqLw0KLSNkZWZpbmUgTExfVElNX1NSX0RJUkYgVElNX1NSX0RJUkYgICAvKiE8IERpcmVjdGlvbiBDaGFuZ2UgaW50ZXJydXB0IGZsYWcgICovDQotI2RlZmluZSBMTF9USU1fU1JfSUVSUkYgVElNX1NSX0lFUlJGIC8qITwgSW5kZXggRXJyb3IgZmxhZyAgKi8NCi0jZGVmaW5lIExMX1RJTV9TUl9URVJSRiBUSU1fU1JfVEVSUkYgLyohPCBUcmFuc2l0aW9uIEVycm9yIGZsYWcgICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0jaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpDQotLyoqIEBkZWZncm91cCBUSU1fTExfRUNfQlJFQUtfRU5BQkxFIEJyZWFrIEVuYWJsZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9USU1fQlJFQUtfRElTQUJMRSAweDAwMDAwMDAwVSAvKiE8IEJyZWFrIGZ1bmN0aW9uIGRpc2FibGVkICovDQotI2RlZmluZSBMTF9USU1fQlJFQUtfRU5BQkxFIFRJTV9CRFRSX0JLRSAvKiE8IEJyZWFrIGZ1bmN0aW9uIGVuYWJsZWQgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0JSRUFLMl9FTkFCTEUgQnJlYWsyIEVuYWJsZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9USU1fQlJFQUsyX0RJU0FCTEUgMHgwMDAwMDAwMFUgIC8qITwgQnJlYWsyIGZ1bmN0aW9uIGRpc2FibGVkICovDQotI2RlZmluZSBMTF9USU1fQlJFQUsyX0VOQUJMRSBUSU1fQkRUUl9CSzJFIC8qITwgQnJlYWsyIGZ1bmN0aW9uIGVuYWJsZWQgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0FVVE9NQVRJQ09VVFBVVF9FTkFCTEUgQXV0b21hdGljIG91dHB1dCBlbmFibGUNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfVElNX0FVVE9NQVRJQ09VVFBVVF9ESVNBQkxFIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgTU9FIGNhbiBiZSBzZXQgb25seSBieSBzb2Z0d2FyZSAqLw0KLSNkZWZpbmUgTExfVElNX0FVVE9NQVRJQ09VVFBVVF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBUSU1fQkRUUl9BT0UgLyohPCBNT0UgY2FuIGJlIHNldCBieSBzb2Z0d2FyZSBvciBhdXRvbWF0aWNhbGx5IGF0IHRoZSBuZXh0IFwNCi0gICAgICAgICAgICAgICAgICB1cGRhdGUgZXZlbnQgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLSNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19JVCBJVCBEZWZpbmVzDQotICogQGJyaWVmICAgIElUIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9USU1fUmVhZFJlZyBhbmQNCi0gKiBMTF9USU1fV3JpdGVSZWcgZnVuY3Rpb25zLg0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9USU1fRElFUl9VSUUgVElNX0RJRVJfVUlFIC8qITwgVXBkYXRlIGludGVycnVwdCBlbmFibGUgKi8NCi0jZGVmaW5lIExMX1RJTV9ESUVSX0NDMUlFIFwNCi0gIFRJTV9ESUVSX0NDMUlFIC8qITwgQ2FwdHVyZS9jb21wYXJlIDEgaW50ZXJydXB0IGVuYWJsZSAqLw0KLSNkZWZpbmUgTExfVElNX0RJRVJfQ0MySUUgXA0KLSAgVElNX0RJRVJfQ0MySUUgLyohPCBDYXB0dXJlL2NvbXBhcmUgMiBpbnRlcnJ1cHQgZW5hYmxlICovDQotI2RlZmluZSBMTF9USU1fRElFUl9DQzNJRSBcDQotICBUSU1fRElFUl9DQzNJRSAvKiE8IENhcHR1cmUvY29tcGFyZSAzIGludGVycnVwdCBlbmFibGUgKi8NCi0jZGVmaW5lIExMX1RJTV9ESUVSX0NDNElFIFwNCi0gIFRJTV9ESUVSX0NDNElFIC8qITwgQ2FwdHVyZS9jb21wYXJlIDQgaW50ZXJydXB0IGVuYWJsZSAqLw0KLSNkZWZpbmUgTExfVElNX0RJRVJfQ09NSUUgVElNX0RJRVJfQ09NSUUgLyohPCBDT00gaW50ZXJydXB0IGVuYWJsZSAqLw0KLSNkZWZpbmUgTExfVElNX0RJRVJfVElFIFRJTV9ESUVSX1RJRSAgICAgLyohPCBUcmlnZ2VyIGludGVycnVwdCBlbmFibGUgKi8NCi0jZGVmaW5lIExMX1RJTV9ESUVSX0JJRSBUSU1fRElFUl9CSUUgICAgIC8qITwgQnJlYWsgaW50ZXJydXB0IGVuYWJsZSAqLw0KLSNkZWZpbmUgTExfVElNX0RJRVJfSURYSUUgVElNX0RJRVJfSURYSUUgLyohPCBJbmRleCBpbnRlcnJ1cHQgZW5hYmxlICovDQotI2RlZmluZSBMTF9USU1fRElFUl9ESVJJRSBcDQotICBUSU1fRElFUl9ESVJJRSAvKiE8IERpcmVjdGlvbiBDaGFuZ2UgaW50ZXJydXB0IGVuYWJsZSAqLw0KLSNkZWZpbmUgTExfVElNX0RJRVJfSUVSUklFICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBUSU1fRElFUl9JRVJSSUUgLyohPCBJbmRleCBFcnJvciBpbnRlcnJ1cHQgZW5hYmxlIFwNCi0gICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX1RJTV9ESUVSX1RFUlJJRSBcDQotICBUSU1fRElFUl9URVJSSUUgLyohPCBUcmFuc2l0aW9uIEVycm9yIGludGVycnVwdCBlbmFibGUgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX1VQREFURVNPVVJDRSBVcGRhdGUgU291cmNlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1RJTV9VUERBVEVTT1VSQ0VfUkVHVUxBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBDb3VudGVyIG92ZXJmbG93L3VuZGVyZmxvdywgU2V0dGluZyB0aGUgVUcgYml0IG9yIFVwZGF0ZSBcDQotICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uIHRocm91Z2ggdGhlIHNsYXZlIG1vZGUgY29udHJvbGxlciBnZW5lcmF0ZXMgYW4gIFwNCi0gICAgICAgICAgICAgICAgIHVwZGF0ZSByZXF1ZXN0ICovDQotI2RlZmluZSBMTF9USU1fVVBEQVRFU09VUkNFX0NPVU5URVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIFRJTV9DUjFfVVJTIC8qITwgT25seSBjb3VudGVyIG92ZXJmbG93L3VuZGVyZmxvdyBnZW5lcmF0ZXMgYW4gdXBkYXRlIHJlcXVlc3QgXA0KLSAgICAgICAgICAgICAgICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19PTkVQVUxTRU1PREUgT25lIFB1bHNlIE1vZGUNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfVElNX09ORVBVTFNFTU9ERV9TSU5HTEUgXA0KLSAgVElNX0NSMV9PUE0gLyohPCBDb3VudGVyIHN0b3BzIGNvdW50aW5nIGF0IHRoZSBuZXh0IHVwZGF0ZSBldmVudCAqLw0KLSNkZWZpbmUgTExfVElNX09ORVBVTFNFTU9ERV9SRVBFVElUSVZFIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgQ291bnRlciBpcyBub3Qgc3RvcHBlZCBhdCB1cGRhdGUgZXZlbnQgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0NPVU5URVJNT0RFIENvdW50ZXIgTW9kZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9USU1fQ09VTlRFUk1PREVfVVAgMHgwMDAwMDAwMFUgLyohPENvdW50ZXIgdXNlZCBhcyB1cGNvdW50ZXIgKi8NCi0jZGVmaW5lIExMX1RJTV9DT1VOVEVSTU9ERV9ET1dOICAgICAgICAgICAgICAgIFwNCi0gIFRJTV9DUjFfRElSIC8qITwgQ291bnRlciB1c2VkIGFzIGRvd25jb3VudGVyIFwNCi0gICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfVElNX0NPVU5URVJNT0RFX0NFTlRFUl9ET1dOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBUSU1fQ1IxX0NNU18wIC8qITwgVGhlIGNvdW50ZXIgY291bnRzIHVwIGFuZCBkb3duIGFsdGVybmF0aXZlbHkuIE91dHB1dCAgIFwNCi0gICAgICAgICAgICAgICAgICAgY29tcGFyZSBpbnRlcnJ1cHQgZmxhZ3Mgb2Ygb3V0cHV0IGNoYW5uZWxzICBhcmUgc2V0IG9ubHkgXA0KLSAgICAgICAgICAgICAgICAgICB3aGVuIHRoZSBjb3VudGVyIGlzIGNvdW50aW5nIGRvd24uICovDQotI2RlZmluZSBMTF9USU1fQ09VTlRFUk1PREVfQ0VOVEVSX1VQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIFRJTV9DUjFfQ01TXzEgLyohPFRoZSBjb3VudGVyIGNvdW50cyB1cCBhbmQgZG93biBhbHRlcm5hdGl2ZWx5LiBPdXRwdXQgICAgXA0KLSAgICAgICAgICAgICAgICAgICBjb21wYXJlIGludGVycnVwdCBmbGFncyBvZiBvdXRwdXQgY2hhbm5lbHMgIGFyZSBzZXQgb25seSBcDQotICAgICAgICAgICAgICAgICAgIHdoZW4gdGhlIGNvdW50ZXIgaXMgY291bnRpbmcgdXAgKi8NCi0jZGVmaW5lIExMX1RJTV9DT1VOVEVSTU9ERV9DRU5URVJfVVBfRE9XTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgVElNX0NSMV9DTVMgLyohPCBUaGUgY291bnRlciBjb3VudHMgdXAgYW5kIGRvd24gYWx0ZXJuYXRpdmVseS4gT3V0cHV0ICAgICAgICBcDQotICAgICAgICAgICAgICAgICBjb21wYXJlIGludGVycnVwdCBmbGFncyBvZiBvdXRwdXQgY2hhbm5lbHMgIGFyZSBzZXQgb25seSB3aGVuIFwNCi0gICAgICAgICAgICAgICAgIHRoZSBjb3VudGVyIGlzIGNvdW50aW5nIHVwIG9yIGRvd24uICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19DTE9DS0RJVklTSU9OIENsb2NrIERpdmlzaW9uDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1RJTV9DTE9DS0RJVklTSU9OX0RJVjEgMHgwMDAwMDAwMFUgICAvKiE8IHREVFM9dENLX0lOVCAqLw0KLSNkZWZpbmUgTExfVElNX0NMT0NLRElWSVNJT05fRElWMiBUSU1fQ1IxX0NLRF8wIC8qITwgdERUUz0yKnRDS19JTlQgKi8NCi0jZGVmaW5lIExMX1RJTV9DTE9DS0RJVklTSU9OX0RJVjQgVElNX0NSMV9DS0RfMSAvKiE8IHREVFM9NCp0Q0tfSU5UICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19DT1VOVEVSRElSRUNUSU9OIENvdW50ZXIgRGlyZWN0aW9uDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1RJTV9DT1VOVEVSRElSRUNUSU9OX1VQIDB4MDAwMDAwMDBVIC8qITwgVGltZXIgY291bnRlciBjb3VudHMgdXAgKi8NCi0jZGVmaW5lIExMX1RJTV9DT1VOVEVSRElSRUNUSU9OX0RPV04gXA0KLSAgVElNX0NSMV9ESVIgLyohPCBUaW1lciBjb3VudGVyIGNvdW50cyBkb3duICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19DQ1VQREFURVNPVVJDRSBDYXB0dXJlIENvbXBhcmUgIFVwZGF0ZSBTb3VyY2UNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfVElNX0NDVVBEQVRFU09VUkNFX0NPTUdfT05MWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgQ2FwdHVyZS9jb21wYXJlIGNvbnRyb2wgYml0cyBhcmUgdXBkYXRlZCBieSBzZXR0aW5nIHRoZSBcDQotICAgICAgICAgICAgICAgICBDT01HIGJpdCBvbmx5ICovDQotI2RlZmluZSBMTF9USU1fQ0NVUERBVEVTT1VSQ0VfQ09NR19BTkRfVFJHSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIFRJTV9DUjJfQ0NVUyAvKiE8IENhcHR1cmUvY29tcGFyZSBjb250cm9sIGJpdHMgYXJlIHVwZGF0ZWQgYnkgc2V0dGluZyB0aGUgXA0KLSAgICAgICAgICAgICAgICAgIENPTUcgYml0IG9yIHdoZW4gYSByaXNpbmcgZWRnZSBvY2N1cnMgb24gdHJpZ2dlciBpbnB1dCAgICBcDQotICAgICAgICAgICAgICAgICAgKFRSR0kpICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19DQ0RNQVJFUVVFU1QgQ2FwdHVyZSBDb21wYXJlIERNQSBSZXF1ZXN0DQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1RJTV9DQ0RNQVJFUVVFU1RfQ0MgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBDQ3ggRE1BIHJlcXVlc3Qgc2VudCB3aGVuIENDeCBldmVudCBvY2N1cnMgKi8NCi0jZGVmaW5lIExMX1RJTV9DQ0RNQVJFUVVFU1RfVVBEQVRFIFwNCi0gIFRJTV9DUjJfQ0NEUyAvKiE8IENDeCBETUEgcmVxdWVzdHMgc2VudCB3aGVuIHVwZGF0ZSBldmVudCBvY2N1cnMgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0xPQ0tMRVZFTCBMb2NrIExldmVsDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1RJTV9MT0NLTEVWRUxfT0ZGIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgTE9DSyBPRkYgLSBObyBiaXQgaXMgd3JpdGUgcHJvdGVjdGVkICovDQotI2RlZmluZSBMTF9USU1fTE9DS0xFVkVMXzEgVElNX0JEVFJfTE9DS18wIC8qITwgTE9DSyBMZXZlbCAxICovDQotI2RlZmluZSBMTF9USU1fTE9DS0xFVkVMXzIgVElNX0JEVFJfTE9DS18xIC8qITwgTE9DSyBMZXZlbCAyICovDQotI2RlZmluZSBMTF9USU1fTE9DS0xFVkVMXzMgVElNX0JEVFJfTE9DSyAgIC8qITwgTE9DSyBMZXZlbCAzICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19DSEFOTkVMIENoYW5uZWwNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfVElNX0NIQU5ORUxfQ0gxIFRJTV9DQ0VSX0NDMUUgLyohPCBUaW1lciBpbnB1dC9vdXRwdXQgY2hhbm5lbCAxICovDQotI2RlZmluZSBMTF9USU1fQ0hBTk5FTF9DSDFOIFwNCi0gIFRJTV9DQ0VSX0NDMU5FIC8qITwgVGltZXIgY29tcGxlbWVudGFyeSBvdXRwdXQgY2hhbm5lbCAxICovDQotI2RlZmluZSBMTF9USU1fQ0hBTk5FTF9DSDIgVElNX0NDRVJfQ0MyRSAvKiE8IFRpbWVyIGlucHV0L291dHB1dCBjaGFubmVsIDIgKi8NCi0jZGVmaW5lIExMX1RJTV9DSEFOTkVMX0NIMk4gXA0KLSAgVElNX0NDRVJfQ0MyTkUgLyohPCBUaW1lciBjb21wbGVtZW50YXJ5IG91dHB1dCBjaGFubmVsIDIgKi8NCi0jZGVmaW5lIExMX1RJTV9DSEFOTkVMX0NIMyBUSU1fQ0NFUl9DQzNFIC8qITwgVGltZXIgaW5wdXQvb3V0cHV0IGNoYW5uZWwgMyAqLw0KLSNkZWZpbmUgTExfVElNX0NIQU5ORUxfQ0gzTiBcDQotICBUSU1fQ0NFUl9DQzNORSAvKiE8IFRpbWVyIGNvbXBsZW1lbnRhcnkgb3V0cHV0IGNoYW5uZWwgMyAqLw0KLSNkZWZpbmUgTExfVElNX0NIQU5ORUxfQ0g0IFRJTV9DQ0VSX0NDNEUgLyohPCBUaW1lciBpbnB1dC9vdXRwdXQgY2hhbm5lbCA0ICovDQotI2RlZmluZSBMTF9USU1fQ0hBTk5FTF9DSDROIFwNCi0gIFRJTV9DQ0VSX0NDNE5FIC8qITwgVGltZXIgY29tcGxlbWVudGFyeSBvdXRwdXQgY2hhbm5lbCA0ICovDQotI2RlZmluZSBMTF9USU1fQ0hBTk5FTF9DSDUgVElNX0NDRVJfQ0M1RSAvKiE8IFRpbWVyIG91dHB1dCBjaGFubmVsIDUgKi8NCi0jZGVmaW5lIExMX1RJTV9DSEFOTkVMX0NINiBUSU1fQ0NFUl9DQzZFIC8qITwgVGltZXIgb3V0cHV0IGNoYW5uZWwgNiAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX09DU1RBVEUgT3V0cHV0IENvbmZpZ3VyYXRpb24gU3RhdGUNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfVElNX09DU1RBVEVfRElTQUJMRSAweDAwMDAwMDAwVSAvKiE8IE9DeCBpcyBub3QgYWN0aXZlICovDQotI2RlZmluZSBMTF9USU1fT0NTVEFURV9FTkFCTEUgXA0KLSAgVElNX0NDRVJfQ0MxRSAvKiE8IE9DeCBzaWduYWwgaXMgb3V0cHV0IG9uIHRoZSBjb3JyZXNwb25kaW5nIG91dHB1dCBwaW4gKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLSNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19PQ01PREUgT3V0cHV0IENvbmZpZ3VyYXRpb24gTW9kZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9USU1fT0NNT0RFX0ZST1pFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIDB4MDAwMDAwMDBVIC8qITxUaGUgY29tcGFyaXNvbiBiZXR3ZWVuIHRoZSBvdXRwdXQgY29tcGFyZSByZWdpc3RlciBUSU14X0NDUnkgXA0KLSAgICAgICAgICAgICAgICAgYW5kIHRoZSBjb3VudGVyIFRJTXhfQ05UIGhhcyBubyBlZmZlY3Qgb24gdGhlIG91dHB1dCBjaGFubmVsICBcDQotICAgICAgICAgICAgICAgICBsZXZlbCAqLw0KLSNkZWZpbmUgTExfVElNX09DTU9ERV9BQ1RJVkUgXA0KLSAgVElNX0NDTVIxX09DMU1fMCAvKiE8T0N5UkVGIGlzIGZvcmNlZCBoaWdoIG9uIGNvbXBhcmUgbWF0Y2gqLw0KLSNkZWZpbmUgTExfVElNX09DTU9ERV9JTkFDVElWRSBcDQotICBUSU1fQ0NNUjFfT0MxTV8xIC8qITxPQ3lSRUYgaXMgZm9yY2VkIGxvdyBvbiBjb21wYXJlIG1hdGNoKi8NCi0jZGVmaW5lIExMX1RJTV9PQ01PREVfVE9HR0xFIFwNCi0gIChUSU1fQ0NNUjFfT0MxTV8xIHwgVElNX0NDTVIxX09DMU1fMCkgLyohPE9DeVJFRiB0b2dnbGVzIG9uIGNvbXBhcmUgbWF0Y2gqLw0KLSNkZWZpbmUgTExfVElNX09DTU9ERV9GT1JDRURfSU5BQ1RJVkUgXA0KLSAgVElNX0NDTVIxX09DMU1fMiAvKiE8T0N5UkVGIGlzIGZvcmNlZCBsb3cqLw0KLSNkZWZpbmUgTExfVElNX09DTU9ERV9GT1JDRURfQUNUSVZFIFwNCi0gIChUSU1fQ0NNUjFfT0MxTV8yIHwgVElNX0NDTVIxX09DMU1fMCkgLyohPE9DeVJFRiBpcyBmb3JjZWQgaGlnaCovDQotI2RlZmluZSBMTF9USU1fT0NNT0RFX1BXTTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChUSU1fQ0NNUjFfT0MxTV8yIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIFRJTV9DQ01SMV9PQzFNXzEpIC8qITxJbiB1cGNvdW50aW5nLCBjaGFubmVsIHkgaXMgYWN0aXZlIGFzIGxvbmcgYXMgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgVElNeF9DTlQ8VElNeF9DQ1J5IGVsc2UgaW5hY3RpdmUuICBJbiBkb3duY291bnRpbmcsIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsIHkgaXMgaW5hY3RpdmUgYXMgbG9uZyBhcyBUSU14X0NOVD5USU14X0NDUnkgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgYWN0aXZlLiovDQotI2RlZmluZSBMTF9USU1fT0NNT0RFX1BXTTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChUSU1fQ0NNUjFfT0MxTV8yIHwgVElNX0NDTVIxX09DMU1fMSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIFRJTV9DQ01SMV9PQzFNXzApIC8qITxJbiB1cGNvdW50aW5nLCBjaGFubmVsIHkgaXMgaW5hY3RpdmUgYXMgbG9uZyBhcyAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICAgVElNeF9DTlQ8VElNeF9DQ1J5IGVsc2UgYWN0aXZlLiAgSW4gZG93bmNvdW50aW5nLCAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsIHkgaXMgYWN0aXZlIGFzIGxvbmcgYXMgVElNeF9DTlQ+VElNeF9DQ1J5IGVsc2UgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGluYWN0aXZlKi8NCi0jZGVmaW5lIExMX1RJTV9PQ01PREVfUkVUUklHX09QTTEgXA0KLSAgVElNX0NDTVIxX09DMU1fMyAvKiE8UmV0cmlnZXJyYWJsZSBPUE0gbW9kZSAxKi8NCi0jZGVmaW5lIExMX1RJTV9PQ01PREVfUkVUUklHX09QTTIgXA0KLSAgKFRJTV9DQ01SMV9PQzFNXzMgfCBUSU1fQ0NNUjFfT0MxTV8wKSAvKiE8UmV0cmlnZXJyYWJsZSBPUE0gbW9kZSAyKi8NCi0jZGVmaW5lIExMX1RJTV9PQ01PREVfQ09NQklORURfUFdNMSBcDQotICAoVElNX0NDTVIxX09DMU1fMyB8IFRJTV9DQ01SMV9PQzFNXzIpIC8qITxDb21iaW5lZCBQV00gbW9kZSAxKi8NCi0jZGVmaW5lIExMX1RJTV9PQ01PREVfQ09NQklORURfUFdNMiAgICAgIFwNCi0gIChUSU1fQ0NNUjFfT0MxTV8zIHwgVElNX0NDTVIxX09DMU1fMCB8IFwNCi0gICBUSU1fQ0NNUjFfT0MxTV8yKSAvKiE8Q29tYmluZWQgUFdNIG1vZGUgMiovDQotI2RlZmluZSBMTF9USU1fT0NNT0RFX0FTU1lNRVRSSUNfUFdNMSAgICBcDQotICAoVElNX0NDTVIxX09DMU1fMyB8IFRJTV9DQ01SMV9PQzFNXzEgfCBcDQotICAgVElNX0NDTVIxX09DMU1fMikgLyohPEFzeW1tZXRyaWMgUFdNIG1vZGUgMSovDQotI2RlZmluZSBMTF9USU1fT0NNT0RFX0FTU1lNRVRSSUNfUFdNMiBcDQotICAoVElNX0NDTVIxX09DMU1fMyB8IFRJTV9DQ01SMV9PQzFNKSAvKiE8QXN5bW1ldHJpYyBQV00gbW9kZSAyKi8NCi0jZGVmaW5lIExMX1RJTV9PQ01PREVfUFVMU0VfT05fQ09NUEFSRSBcDQotICAoVElNX0NDTVIyX09DM01fMyB8IFRJTV9DQ01SMl9PQzNNXzEpIC8qITxQdWxzZSBvbiBDb21wYXJlIG1vZGUgKi8NCi0jZGVmaW5lIExMX1RJTV9PQ01PREVfRElSRUNUSU9OX09VVFBVVCAgIFwNCi0gIChUSU1fQ0NNUjJfT0MzTV8zIHwgVElNX0NDTVIyX09DM01fMSB8IFwNCi0gICBUSU1fQ0NNUjJfT0MzTV8wKSAvKiE8RGlyZWN0aW9uIG91dHB1dCBtb2RlICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19PQ1BPTEFSSVRZIE91dHB1dCBDb25maWd1cmF0aW9uIFBvbGFyaXR5DQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1RJTV9PQ1BPTEFSSVRZX0hJR0ggMHgwMDAwMDAwMFUgIC8qITwgT0N4YWN0aXZlIGhpZ2gqLw0KLSNkZWZpbmUgTExfVElNX09DUE9MQVJJVFlfTE9XIFRJTV9DQ0VSX0NDMVAgLyohPCBPQ3hhY3RpdmUgbG93Ki8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX09DSURMRVNUQVRFIE91dHB1dCBDb25maWd1cmF0aW9uIElkbGUgU3RhdGUNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfVElNX09DSURMRVNUQVRFX0xPVyBcDQotICAweDAwMDAwMDAwVSAvKiE8T0N4PTAgKGFmdGVyIGEgZGVhZC10aW1lIGlmIE9DIGlzIGltcGxlbWVudGVkKSB3aGVuIE1PRT0wKi8NCi0jZGVmaW5lIExMX1RJTV9PQ0lETEVTVEFURV9ISUdIIFwNCi0gIFRJTV9DUjJfT0lTMSAvKiE8T0N4PTEgKGFmdGVyIGEgZGVhZC10aW1lIGlmIE9DIGlzIGltcGxlbWVudGVkKSB3aGVuIE1PRT0wKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0dST1VQQ0g1IEdST1VQQ0g1DQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1RJTV9HUk9VUENINV9OT05FIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgTm8gZWZmZWN0IG9mIE9DNVJFRiBvbiBPQzFSRUZDLCBPQzJSRUZDIGFuZCBPQzNSRUZDICovDQotI2RlZmluZSBMTF9USU1fR1JPVVBDSDVfT0MxUkVGQyBcDQotICBUSU1fQ0NSNV9HQzVDMSAvKiE8IE9DMVJFRkMgaXMgdGhlIGxvZ2ljYWwgQU5EIG9mIE9DMVJFRkMgYW5kIE9DNVJFRiAqLw0KLSNkZWZpbmUgTExfVElNX0dST1VQQ0g1X09DMlJFRkMgXA0KLSAgVElNX0NDUjVfR0M1QzIgLyohPCBPQzJSRUZDIGlzIHRoZSBsb2dpY2FsIEFORCBvZiBPQzJSRUZDIGFuZCBPQzVSRUYgKi8NCi0jZGVmaW5lIExMX1RJTV9HUk9VUENINV9PQzNSRUZDIFwNCi0gIFRJTV9DQ1I1X0dDNUMzIC8qITwgT0MzUkVGQyBpcyB0aGUgbG9naWNhbCBBTkQgb2YgT0MzUkVGQyBhbmQgT0M1UkVGICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19BQ1RJVkVJTlBVVCBBY3RpdmUgSW5wdXQgU2VsZWN0aW9uDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1RJTV9BQ1RJVkVJTlBVVF9ESVJFQ1RUSSBcDQotICAoVElNX0NDTVIxX0NDMVNfMCA8PCAxNlUpIC8qITwgSUN4IGlzIG1hcHBlZCBvbiBUSXggKi8NCi0jZGVmaW5lIExMX1RJTV9BQ1RJVkVJTlBVVF9JTkRJUkVDVFRJIFwNCi0gIChUSU1fQ0NNUjFfQ0MxU18xIDw8IDE2VSkgLyohPCBJQ3ggaXMgbWFwcGVkIG9uIFRJeSAqLw0KLSNkZWZpbmUgTExfVElNX0FDVElWRUlOUFVUX1RSQyBcDQotICAoVElNX0NDTVIxX0NDMVMgPDwgMTZVKSAvKiE8IElDeCBpcyBtYXBwZWQgb24gVFJDICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19JQ1BTQyBJbnB1dCBDb25maWd1cmF0aW9uIFByZXNjYWxlcg0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9USU1fSUNQU0NfRElWMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgTm8gcHJlc2NhbGVyLCBjYXB0dXJlIGlzIGRvbmUgZWFjaCB0aW1lIGFuIGVkZ2UgaXMgZGV0ZWN0ZWQgXA0KLSAgICAgICAgICAgICAgICAgb24gdGhlIGNhcHR1cmUgaW5wdXQgKi8NCi0jZGVmaW5lIExMX1RJTV9JQ1BTQ19ESVYyIFwNCi0gIChUSU1fQ0NNUjFfSUMxUFNDXzAgPDwgMTZVKSAvKiE8IENhcHR1cmUgaXMgZG9uZSBvbmNlIGV2ZXJ5IDIgZXZlbnRzICovDQotI2RlZmluZSBMTF9USU1fSUNQU0NfRElWNCBcDQotICAoVElNX0NDTVIxX0lDMVBTQ18xIDw8IDE2VSkgLyohPCBDYXB0dXJlIGlzIGRvbmUgb25jZSBldmVyeSA0IGV2ZW50cyAqLw0KLSNkZWZpbmUgTExfVElNX0lDUFNDX0RJVjggXA0KLSAgKFRJTV9DQ01SMV9JQzFQU0MgPDwgMTZVKSAvKiE8IENhcHR1cmUgaXMgZG9uZSBvbmNlIGV2ZXJ5IDggZXZlbnRzICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19JQ19GSUxURVIgSW5wdXQgQ29uZmlndXJhdGlvbiBGaWx0ZXINCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfVElNX0lDX0ZJTFRFUl9GRElWMSBcDQotICAweDAwMDAwMDAwVSAvKiE8IE5vIGZpbHRlciwgc2FtcGxpbmcgaXMgZG9uZSBhdCBmRFRTICovDQotI2RlZmluZSBMTF9USU1fSUNfRklMVEVSX0ZESVYxX04yIFwNCi0gIChUSU1fQ0NNUjFfSUMxRl8wIDw8IDE2VSkgLyohPCBmU0FNUExJTkc9ZkNLX0lOVCwgTj0yICovDQotI2RlZmluZSBMTF9USU1fSUNfRklMVEVSX0ZESVYxX040IFwNCi0gIChUSU1fQ0NNUjFfSUMxRl8xIDw8IDE2VSkgLyohPCBmU0FNUExJTkc9ZkNLX0lOVCwgTj00ICovDQotI2RlZmluZSBMTF9USU1fSUNfRklMVEVSX0ZESVYxX044ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKFRJTV9DQ01SMV9JQzFGXzEgfCBUSU1fQ0NNUjFfSUMxRl8wKSA8PCAxNlUpIC8qITwgZlNBTVBMSU5HPWZDS19JTlQsIE49OCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfVElNX0lDX0ZJTFRFUl9GRElWMl9ONiBcDQotICAoVElNX0NDTVIxX0lDMUZfMiA8PCAxNlUpIC8qITwgZlNBTVBMSU5HPWZEVFMvMiwgTj02ICovDQotI2RlZmluZSBMTF9USU1fSUNfRklMVEVSX0ZESVYyX044IFwNCi0gICgoVElNX0NDTVIxX0lDMUZfMiB8IFRJTV9DQ01SMV9JQzFGXzApIDw8IDE2VSkgLyohPCBmU0FNUExJTkc9ZkRUUy8yLCBOPTggKi8NCi0jZGVmaW5lIExMX1RJTV9JQ19GSUxURVJfRkRJVjRfTjYgXA0KLSAgKChUSU1fQ0NNUjFfSUMxRl8yIHwgVElNX0NDTVIxX0lDMUZfMSkgPDwgMTZVKSAvKiE8IGZTQU1QTElORz1mRFRTLzQsIE49NiAqLw0KLSNkZWZpbmUgTExfVElNX0lDX0ZJTFRFUl9GRElWNF9OOCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoVElNX0NDTVIxX0lDMUZfMiB8IFRJTV9DQ01SMV9JQzFGXzEgfCBUSU1fQ0NNUjFfSUMxRl8wKSBcDQotICAgPDwgMTZVKSAvKiE8IGZTQU1QTElORz1mRFRTLzQsIE49OCAqLw0KLSNkZWZpbmUgTExfVElNX0lDX0ZJTFRFUl9GRElWOF9ONiBcDQotICAoVElNX0NDTVIxX0lDMUZfMyA8PCAxNlUpIC8qITwgZlNBTVBMSU5HPWZEVFMvOCwgTj02ICovDQotI2RlZmluZSBMTF9USU1fSUNfRklMVEVSX0ZESVY4X044IFwNCi0gICgoVElNX0NDTVIxX0lDMUZfMyB8IFRJTV9DQ01SMV9JQzFGXzApIDw8IDE2VSkgLyohPCBmU0FNUExJTkc9ZkRUUy84LCBOPTggKi8NCi0jZGVmaW5lIExMX1RJTV9JQ19GSUxURVJfRkRJVjE2X041ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgoVElNX0NDTVIxX0lDMUZfMyB8IFRJTV9DQ01SMV9JQzFGXzEpIDw8IDE2VSkgLyohPCBmU0FNUExJTkc9ZkRUUy8xNiwgTj01IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9USU1fSUNfRklMVEVSX0ZESVYxNl9ONiAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKChUSU1fQ0NNUjFfSUMxRl8zIHwgVElNX0NDTVIxX0lDMUZfMSB8IFRJTV9DQ01SMV9JQzFGXzApIFwNCi0gICA8PCAxNlUpIC8qITwgZlNBTVBMSU5HPWZEVFMvMTYsIE49NiAqLw0KLSNkZWZpbmUgTExfVElNX0lDX0ZJTFRFUl9GRElWMTZfTjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKChUSU1fQ0NNUjFfSUMxRl8zIHwgVElNX0NDTVIxX0lDMUZfMikgPDwgMTZVKSAvKiE8IGZTQU1QTElORz1mRFRTLzE2LCBOPTggXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX1RJTV9JQ19GSUxURVJfRkRJVjMyX041ICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKFRJTV9DQ01SMV9JQzFGXzMgfCBUSU1fQ0NNUjFfSUMxRl8yIHwgVElNX0NDTVIxX0lDMUZfMCkgXA0KLSAgIDw8IDE2VSkgLyohPCBmU0FNUExJTkc9ZkRUUy8zMiwgTj01ICovDQotI2RlZmluZSBMTF9USU1fSUNfRklMVEVSX0ZESVYzMl9ONiAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKChUSU1fQ0NNUjFfSUMxRl8zIHwgVElNX0NDTVIxX0lDMUZfMiB8IFRJTV9DQ01SMV9JQzFGXzEpIFwNCi0gICA8PCAxNlUpIC8qITwgZlNBTVBMSU5HPWZEVFMvMzIsIE49NiAqLw0KLSNkZWZpbmUgTExfVElNX0lDX0ZJTFRFUl9GRElWMzJfTjggXA0KLSAgKFRJTV9DQ01SMV9JQzFGIDw8IDE2VSkgLyohPCBmU0FNUExJTkc9ZkRUUy8zMiwgTj04ICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19JQ19QT0xBUklUWSBJbnB1dCBDb25maWd1cmF0aW9uIFBvbGFyaXR5DQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1RJTV9JQ19QT0xBUklUWV9SSVNJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgVGhlIGNpcmN1aXQgaXMgc2Vuc2l0aXZlIHRvIFRJeEZQMSByaXNpbmcgZWRnZSwgVEl4RlAxIGlzIFwNCi0gICAgICAgICAgICAgICAgIG5vdCBpbnZlcnRlZCAqLw0KLSNkZWZpbmUgTExfVElNX0lDX1BPTEFSSVRZX0ZBTExJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgVElNX0NDRVJfQ0MxUCAvKiE8IFRoZSBjaXJjdWl0IGlzIHNlbnNpdGl2ZSB0byBUSXhGUDEgZmFsbGluZyBlZGdlLCBUSXhGUDEgXA0KLSAgICAgICAgICAgICAgICAgICBpcyBpbnZlcnRlZCAqLw0KLSNkZWZpbmUgTExfVElNX0lDX1BPTEFSSVRZX0JPVEhFREdFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChUSU1fQ0NFUl9DQzFQIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgVElNX0NDRVJfQ0MxTlApIC8qITwgVGhlIGNpcmN1aXQgaXMgc2Vuc2l0aXZlIHRvIGJvdGggVEl4RlAxIHJpc2luZyBhbmQgXA0KLSAgICAgICAgICAgICAgICAgICAgICBmYWxsaW5nIGVkZ2VzLCBUSXhGUDEgaXMgbm90IGludmVydGVkICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19DTE9DS1NPVVJDRSBDbG9jayBTb3VyY2UNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfVElNX0NMT0NLU09VUkNFX0lOVEVSTkFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAweDAwMDAwMDAwVSAvKiE8IFRoZSB0aW1lciBpcyBjbG9ja2VkIGJ5IHRoZSBpbnRlcm5hbCBjbG9jayBwcm92aWRlZCBmcm9tIFwNCi0gICAgICAgICAgICAgICAgIHRoZSBSQ0MgKi8NCi0jZGVmaW5lIExMX1RJTV9DTE9DS1NPVVJDRV9FWFRfTU9ERTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoVElNX1NNQ1JfU01TXzIgfCBUSU1fU01DUl9TTVNfMSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIFRJTV9TTUNSX1NNU18wKSAvKiE8IENvdW50ZXIgY291bnRzIGF0IGVhY2ggcmlzaW5nIG9yIGZhbGxpbmcgZWRnZSBvbiBhIFwNCi0gICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQgaW5wdXQqLw0KLSNkZWZpbmUgTExfVElNX0NMT0NLU09VUkNFX0VYVF9NT0RFMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBUSU1fU01DUl9FQ0UgLyohPCBDb3VudGVyIGNvdW50cyBhdCBlYWNoIHJpc2luZyBvciBmYWxsaW5nIGVkZ2Ugb24gdGhlIFwNCi0gICAgICAgICAgICAgICAgICBleHRlcm5hbCB0cmlnZ2VyIGlucHV0IEVUUiAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBUSU1fTExfRUNfRU5DT0RFUk1PREUgRW5jb2RlciBNb2RlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1RJTV9FTkNPREVSTU9ERV9YMl9USTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIFRJTV9TTUNSX1NNU18wIC8qITwgUXVhZHJhdHVyZSBlbmNvZGVyIG1vZGUgMSwgeDIgbW9kZSAtIENvdW50ZXIgY291bnRzIFwNCi0gICAgICAgICAgICAgICAgICAgIHVwL2Rvd24gb24gVEkxRlAxIGVkZ2UgZGVwZW5kaW5nIG9uIFRJMkZQMiBsZXZlbCAqLw0KLSNkZWZpbmUgTExfVElNX0VOQ09ERVJNT0RFX1gyX1RJMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgVElNX1NNQ1JfU01TXzEgLyohPCBRdWFkcmF0dXJlIGVuY29kZXIgbW9kZSAyLCB4MiBtb2RlIC0gQ291bnRlciBjb3VudHMgXA0KLSAgICAgICAgICAgICAgICAgICAgdXAvZG93biBvbiBUSTJGUDIgZWRnZSBkZXBlbmRpbmcgb24gVEkxRlAxIGxldmVsICovDQotI2RlZmluZSBMTF9USU1fRU5DT0RFUk1PREVfWDRfVEkxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChUSU1fU01DUl9TTVNfMSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIFRJTV9TTUNSX1NNU18wKSAvKiE8IFF1YWRyYXR1cmUgZW5jb2RlciBtb2RlIDMsIHg0IG1vZGUgLSBDb3VudGVyIGNvdW50cyAgICBcDQotICAgICAgICAgICAgICAgICAgICAgIHVwL2Rvd24gb24gYm90aCBUSTFGUDEgYW5kIFRJMkZQMiBlZGdlcyBkZXBlbmRpbmcgb24gdGhlIFwNCi0gICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgb2YgdGhlIG90aGVyIGlucHV0ICovDQotI2RlZmluZSBMTF9USU1fRU5DT0RFUk1PREVfQ0xPQ0tQTFVTRElSRUNUSU9OX1gyIFwNCi0gIChUSU1fU01DUl9TTVNfMyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIFRJTV9TTUNSX1NNU18xKSAvKiE8IEVuY29kZXIgbW9kZTogQ2xvY2sgcGx1cyBkaXJlY3Rpb24gLSB4MiBtb2RlICovDQotI2RlZmluZSBMTF9USU1fRU5DT0RFUk1PREVfQ0xPQ0tQTFVTRElSRUNUSU9OX1gxICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChUSU1fU01DUl9TTVNfMyB8IFRJTV9TTUNSX1NNU18xIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIFRJTV9TTUNSX1NNU18wKSAvKiE8IEVuY29kZXIgbW9kZTogQ2xvY2sgcGx1cyBkaXJlY3Rpb24sIHgxIG1vZGUsIFRJMkZQMiBcDQotICAgICAgICAgICAgICAgICAgICAgIGVkZ2Ugc2Vuc2l0aXZpdHkgaXMgc2V0IGJ5IENDMlAgKi8NCi0jZGVmaW5lIExMX1RJTV9FTkNPREVSTU9ERV9ESVJFQ1RJT05BTENMT0NLX1gyIFwNCi0gIChUSU1fU01DUl9TTVNfMyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBUSU1fU01DUl9TTVNfMikgLyohPCBFbmNvZGVyIG1vZGU6IERpcmVjdGlvbmFsIENsb2NrLCB4MiBtb2RlICovDQotI2RlZmluZSBMTF9USU1fRU5DT0RFUk1PREVfRElSRUNUSU9OQUxDTE9DS19YMV9USTEyICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoVElNX1NNQ1JfU01TXzMgfCBUSU1fU01DUl9TTVNfMiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgVElNX1NNQ1JfU01TXzApIC8qITwgRW5jb2RlciBtb2RlOiBEaXJlY3Rpb25hbCBDbG9jaywgeDEgbW9kZSwgVEkxRlAxIGFuZCBcDQotICAgICAgICAgICAgICAgICAgICAgIFRJMkZQMiBlZGdlIHNlbnNpdGl2aXR5IGlzIHNldCBieSBDQzFQIGFuZCBDQzJQICovDQotI2RlZmluZSBMTF9USU1fRU5DT0RFUk1PREVfWDFfVEkxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoVElNX1NNQ1JfU01TXzMgfCBUSU1fU01DUl9TTVNfMiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgVElNX1NNQ1JfU01TXzEpIC8qITwgUXVhZHJhdHVyZSBlbmNvZGVyIG1vZGU6IHgxIG1vZGUsIGNvdW50aW5nIG9uIFRJMUZQMSBcDQotICAgICAgICAgICAgICAgICAgICAgIGVkZ2VzIG9ubHksIGVkZ2Ugc2Vuc2l0aXZpdHkgaXMgc2V0IGJ5IENDMVAgKi8NCi0jZGVmaW5lIExMX1RJTV9FTkNPREVSTU9ERV9YMV9USTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChUSU1fU01DUl9TTVNfMyB8IFRJTV9TTUNSX1NNU18yIHwgVElNX1NNQ1JfU01TXzEgfCAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBUSU1fU01DUl9TTVNfMCkgLyohPCBRdWFkcmF0dXJlIGVuY29kZXIgbW9kZTogeDEgbW9kZSwgY291bnRpbmcgb24gVEkyRlAyIFwNCi0gICAgICAgICAgICAgICAgICAgICAgZWRnZXMgb25seSwgZWRnZSBzZW5zaXRpdml0eSBpcyBzZXQgYnkgQ0MxUCAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBUSU1fTExfRUNfVFJHTyBUcmlnZ2VyIE91dHB1dA0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9USU1fVFJHT19SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgVUcgYml0IGZyb20gdGhlIFRJTXhfRUdSIHJlZ2lzdGVyIGlzIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQgXA0KLSAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9USU1fVFJHT19FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgVElNX0NSMl9NTVNfMCAvKiE8IENvdW50ZXIgRW5hYmxlIHNpZ25hbCAoQ05UX0VOKSBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0IFwNCi0gICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9USU1fVFJHT19VUERBVEUgXA0KLSAgVElNX0NSMl9NTVNfMSAvKiE8IFVwZGF0ZSBldmVudCBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0ICovDQotI2RlZmluZSBMTF9USU1fVFJHT19DQzFJRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKFRJTV9DUjJfTU1TXzEgfCBUSU1fQ1IyX01NU18wKSAvKiE8IENDMSBjYXB0dXJlIG9yIGEgY29tcGFyZSBtYXRjaCBpcyB1c2VkIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgdHJpZ2dlciBvdXRwdXQgKi8NCi0jZGVmaW5lIExMX1RJTV9UUkdPX09DMVJFRiBcDQotICBUSU1fQ1IyX01NU18yIC8qITwgT0MxUkVGIHNpZ25hbCBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0ICovDQotI2RlZmluZSBMTF9USU1fVFJHT19PQzJSRUYgXA0KLSAgKFRJTV9DUjJfTU1TXzIgfCAgICAgICAgIFwNCi0gICBUSU1fQ1IyX01NU18wKSAvKiE8IE9DMlJFRiBzaWduYWwgaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAqLw0KLSNkZWZpbmUgTExfVElNX1RSR09fT0MzUkVGIFwNCi0gIChUSU1fQ1IyX01NU18yIHwgICAgICAgICBcDQotICAgVElNX0NSMl9NTVNfMSkgLyohPCBPQzNSRUYgc2lnbmFsIGlzIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQgKi8NCi0jZGVmaW5lIExMX1RJTV9UUkdPX09DNFJFRiAgICAgICAgIFwNCi0gIChUSU1fQ1IyX01NU18yIHwgVElNX0NSMl9NTVNfMSB8IFwNCi0gICBUSU1fQ1IyX01NU18wKSAvKiE8IE9DNFJFRiBzaWduYWwgaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAqLw0KLSNkZWZpbmUgTExfVElNX1RSR09fRU5DT0RFUkNMSyBcDQotICBUSU1fQ1IyX01NU18zIC8qITwgRW5jb2RlciBjbG9jayBzaWduYWwgaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBUSU1fTExfRUNfVFJHTzIgVHJpZ2dlciBPdXRwdXQgMg0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9USU1fVFJHTzJfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgVUcgYml0IGZyb20gdGhlIFRJTXhfRUdSIHJlZ2lzdGVyIGlzIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQgXA0KLSAgICAgICAgICAgICAgICAgMiAqLw0KLSNkZWZpbmUgTExfVElNX1RSR08yX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBUSU1fQ1IyX01NUzJfMCAvKiE8IENvdW50ZXIgRW5hYmxlIHNpZ25hbCAoQ05UX0VOKSBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0IFwNCi0gICAgICAgICAgICAgICAgICAgIDIgKi8NCi0jZGVmaW5lIExMX1RJTV9UUkdPMl9VUERBVEUgXA0KLSAgVElNX0NSMl9NTVMyXzEgLyohPCBVcGRhdGUgZXZlbnQgaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAyICovDQotI2RlZmluZSBMTF9USU1fVFJHTzJfQ0MxRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKFRJTV9DUjJfTU1TMl8xIHwgVElNX0NSMl9NTVMyXzApIC8qITwgQ0MxIGNhcHR1cmUgb3IgYSBjb21wYXJlIG1hdGNoIGlzIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0IDIgKi8NCi0jZGVmaW5lIExMX1RJTV9UUkdPMl9PQzEgXA0KLSAgVElNX0NSMl9NTVMyXzIgLyohPCBPQzFSRUYgc2lnbmFsIGlzIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQgMiAqLw0KLSNkZWZpbmUgTExfVElNX1RSR08yX09DMiBcDQotICAoVElNX0NSMl9NTVMyXzIgfCAgICAgIFwNCi0gICBUSU1fQ1IyX01NUzJfMCkgLyohPCBPQzJSRUYgc2lnbmFsIGlzIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQgMiAqLw0KLSNkZWZpbmUgTExfVElNX1RSR08yX09DMyBcDQotICAoVElNX0NSMl9NTVMyXzIgfCAgICAgIFwNCi0gICBUSU1fQ1IyX01NUzJfMSkgLyohPCBPQzNSRUYgc2lnbmFsIGlzIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQgMiAqLw0KLSNkZWZpbmUgTExfVElNX1RSR08yX09DNCAgICAgICAgICAgICBcDQotICAoVElNX0NSMl9NTVMyXzIgfCBUSU1fQ1IyX01NUzJfMSB8IFwNCi0gICBUSU1fQ1IyX01NUzJfMCkgLyohPCBPQzRSRUYgc2lnbmFsIGlzIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQgMiAqLw0KLSNkZWZpbmUgTExfVElNX1RSR08yX09DNSBcDQotICBUSU1fQ1IyX01NUzJfMyAvKiE8IE9DNVJFRiBzaWduYWwgaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAyICovDQotI2RlZmluZSBMTF9USU1fVFJHTzJfT0M2IFwNCi0gIChUSU1fQ1IyX01NUzJfMyB8ICAgICAgXA0KLSAgIFRJTV9DUjJfTU1TMl8wKSAvKiE8IE9DNlJFRiBzaWduYWwgaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAyICovDQotI2RlZmluZSBMTF9USU1fVFJHTzJfT0M0X1JJU0lOR0ZBTExJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChUSU1fQ1IyX01NUzJfMyB8IFRJTV9DUjJfTU1TMl8xKSAvKiE8IE9DNFJFRiByaXNpbmcgb3IgZmFsbGluZyBlZGdlcyBhcmUgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQgMiAqLw0KLSNkZWZpbmUgTExfVElNX1RSR08yX09DNl9SSVNJTkdGQUxMSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChUSU1fQ1IyX01NUzJfMyB8IFRJTV9DUjJfTU1TMl8xIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgVElNX0NSMl9NTVMyXzApIC8qITwgT0M2UkVGIHJpc2luZyBvciBmYWxsaW5nIGVkZ2VzIGFyZSB1c2VkIGFzIHRyaWdnZXIgXA0KLSAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgMiAqLw0KLSNkZWZpbmUgTExfVElNX1RSR08yX09DNF9SSVNJTkdfT0M2X1JJU0lORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChUSU1fQ1IyX01NUzJfMyB8IFRJTV9DUjJfTU1TMl8yKSAvKiE8IE9DNFJFRiBvciBPQzZSRUYgcmlzaW5nIGVkZ2VzIGFyZSBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAyICovDQotI2RlZmluZSBMTF9USU1fVFJHTzJfT0M0X1JJU0lOR19PQzZfRkFMTElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoVElNX0NSMl9NTVMyXzMgfCBUSU1fQ1IyX01NUzJfMiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgVElNX0NSMl9NTVMyXzApIC8qITwgT0M0UkVGIHJpc2luZyBvciBPQzZSRUYgZmFsbGluZyBlZGdlcyBhcmUgdXNlZCBhcyBcDQotICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXIgb3V0cHV0IDIgKi8NCi0jZGVmaW5lIExMX1RJTV9UUkdPMl9PQzVfUklTSU5HX09DNl9SSVNJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChUSU1fQ1IyX01NUzJfMyB8IFRJTV9DUjJfTU1TMl8yIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBUSU1fQ1IyX01NUzJfMSkgLyohPCBPQzVSRUYgb3IgT0M2UkVGIHJpc2luZyBlZGdlcyBhcmUgdXNlZCBhcyB0cmlnZ2VyIFwNCi0gICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IDIgKi8NCi0jZGVmaW5lIExMX1RJTV9UUkdPMl9PQzVfUklTSU5HX09DNl9GQUxMSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChUSU1fQ1IyX01NUzJfMyB8IFRJTV9DUjJfTU1TMl8yIHwgVElNX0NSMl9NTVMyXzEgfCAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBUSU1fQ1IyX01NUzJfMCkgLyohPCBPQzVSRUYgcmlzaW5nIG9yIE9DNlJFRiBmYWxsaW5nIGVkZ2VzIGFyZSB1c2VkIGFzIFwNCi0gICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlciBvdXRwdXQgMiAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBUSU1fTExfRUNfU0xBVkVNT0RFIFNsYXZlIE1vZGUNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfVElNX1NMQVZFTU9ERV9ESVNBQkxFRCAweDAwMDAwMDAwVSAvKiE8IFNsYXZlIG1vZGUgZGlzYWJsZWQgKi8NCi0jZGVmaW5lIExMX1RJTV9TTEFWRU1PREVfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIFRJTV9TTUNSX1NNU18yIC8qITwgUmVzZXQgTW9kZSAtIFJpc2luZyBlZGdlIG9mIHRoZSBzZWxlY3RlZCB0cmlnZ2VyIGlucHV0IFwNCi0gICAgICAgICAgICAgICAgICAgIChUUkdJKSByZWluaXRpYWxpemVzIHRoZSBjb3VudGVyICovDQotI2RlZmluZSBMTF9USU1fU0xBVkVNT0RFX0dBVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKFRJTV9TTUNSX1NNU18yIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBUSU1fU01DUl9TTVNfMCkgLyohPCBHYXRlZCBNb2RlIC0gVGhlIGNvdW50ZXIgY2xvY2sgaXMgZW5hYmxlZCB3aGVuIHRoZSBcDQotICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXIgaW5wdXQgKFRSR0kpIGlzIGhpZ2ggKi8NCi0jZGVmaW5lIExMX1RJTV9TTEFWRU1PREVfVFJJR0dFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoVElNX1NNQ1JfU01TXzIgfCBUSU1fU01DUl9TTVNfMSkgLyohPCBUcmlnZ2VyIE1vZGUgLSBUaGUgY291bnRlciBzdGFydHMgYXQgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgcmlzaW5nIGVkZ2Ugb2YgdGhlIHRyaWdnZXIgVFJHSSAqLw0KLSNkZWZpbmUgTExfVElNX1NMQVZFTU9ERV9DT01CSU5FRF9SRVNFVFRSSUdHRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIFRJTV9TTUNSX1NNU18zIC8qITwgQ29tYmluZWQgcmVzZXQgKyB0cmlnZ2VyIG1vZGUgLSBSaXNpbmcgZWRnZSBvZiB0aGUgICAgICBcDQotICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZCB0cmlnZ2VyIGlucHV0IChUUkdJKSAgcmVpbml0aWFsaXplcyB0aGUgY291bnRlciwgXA0KLSAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVzIGFuIHVwZGF0ZSBvZiB0aGUgcmVnaXN0ZXJzIGFuZCBzdGFydHMgdGhlICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgIGNvdW50ZXIgKi8NCi0jZGVmaW5lIExMX1RJTV9TTEFWRU1PREVfQ09NQklORURfR0FURURSRVNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoVElNX1NNQ1JfU01TXzMgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIFRJTV9TTUNSX1NNU18wKSAvKiE8IENvbWJpbmVkIGdhdGVkICsgcmVzZXQgbW9kZSAtIFRoZSBjb3VudGVyIGNsb2NrIGlzIFwNCi0gICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZCB3aGVuIHRoZSB0cmlnZ2VyIGlucHV0IChUUkdJKSBpcyBoaWdoLiBUaGUgICBcDQotICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXIgc3RvcHMgYW5kIGlzIHJlc2V0KSBhcyBzb29uIGFzIHRoZSB0cmlnZ2VyICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICBiZWNvbWVzIGxvdy5Cb3RoIHN0YXJ0YW5kIHN0b3Agb2YgdGhlIGNvdW50ZXIgYXJlICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlZC4gKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX1NNU19QUkVMT0FEX1NPVVJDRSBTTVMgUHJlbG9hZCBTb3VyY2UNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfVElNX1NNU1BTX1RJTVVQREFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAweDAwMDAwMDAwVSAvKiE8IFRoZSBTTVMgcHJlbG9hZCB0cmFuc2ZlciBpcyB0cmlnZ2VyZWQgYnkgdGhlIFRpbWVyJ3MgVXBkYXRlIFwNCi0gICAgICAgICAgICAgICAgIGV2ZW50ICovDQotI2RlZmluZSBMTF9USU1fU01TUFNfSU5ERVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIFRJTV9TTUNSX1NNU1BTIC8qITwgVGhlIFNNUyBwcmVsb2FkIHRyYW5zZmVyIGlzIHRyaWdnZXJlZCBieSB0aGUgSW5kZXggZXZlbnQgXA0KLSAgICAgICAgICAgICAgICAgICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19UUyBUcmlnZ2VyIFNlbGVjdGlvbg0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9USU1fVFNfSVRSMCBcDQotICAweDAwMDAwMDAwVSAvKiE8IEludGVybmFsIFRyaWdnZXIgMCAoSVRSMCkgaXMgdXNlZCBhcyB0cmlnZ2VyIGlucHV0ICovDQotI2RlZmluZSBMTF9USU1fVFNfSVRSMSBcDQotICBUSU1fU01DUl9UU18wIC8qITwgSW50ZXJuYWwgVHJpZ2dlciAxIChJVFIxKSBpcyB1c2VkIGFzIHRyaWdnZXIgaW5wdXQgKi8NCi0jZGVmaW5lIExMX1RJTV9UU19JVFIyIFwNCi0gIFRJTV9TTUNSX1RTXzEgLyohPCBJbnRlcm5hbCBUcmlnZ2VyIDIgKElUUjIpIGlzIHVzZWQgYXMgdHJpZ2dlciBpbnB1dCAqLw0KLSNkZWZpbmUgTExfVElNX1RTX0lUUjMgXA0KLSAgKFRJTV9TTUNSX1RTXzAgfCAgICAgXA0KLSAgIFRJTV9TTUNSX1RTXzEpIC8qITwgSW50ZXJuYWwgVHJpZ2dlciAzIChJVFIzKSBpcyB1c2VkIGFzIHRyaWdnZXIgaW5wdXQgKi8NCi0jZGVmaW5lIExMX1RJTV9UU19USTFGX0VEIFwNCi0gIFRJTV9TTUNSX1RTXzIgLyohPCBUSTEgRWRnZSBEZXRlY3RvciAoVEkxRl9FRCkgaXMgdXNlZCBhcyB0cmlnZ2VyIGlucHV0ICovDQotI2RlZmluZSBMTF9USU1fVFNfVEkxRlAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChUSU1fU01DUl9UU18yIHwgVElNX1NNQ1JfVFNfMCkgLyohPCBGaWx0ZXJlZCBUaW1lciBJbnB1dCAxIChUSTFGUDEpIGlzIHVzZWQgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcyB0cmlnZ2VyIGlucHV0ICovDQotI2RlZmluZSBMTF9USU1fVFNfVEkyRlAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChUSU1fU01DUl9UU18yIHwgVElNX1NNQ1JfVFNfMSkgLyohPCBGaWx0ZXJlZCBUaW1lciBJbnB1dCAyIChUSTEyUDIpIGlzIHVzZWQgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcyB0cmlnZ2VyIGlucHV0ICovDQotI2RlZmluZSBMTF9USU1fVFNfRVRSRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKFRJTV9TTUNSX1RTXzIgfCBUSU1fU01DUl9UU18xIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBUSU1fU01DUl9UU18wKSAvKiE8IEZpbHRlcmVkIGV4dGVybmFsIFRyaWdnZXIgKEVUUkYpIGlzIHVzZWQgYXMgdHJpZ2dlciBcDQotICAgICAgICAgICAgICAgICAgICAgaW5wdXQgKi8NCi0jZGVmaW5lIExMX1RJTV9UU19JVFI0IFwNCi0gIFRJTV9TTUNSX1RTXzMgLyohPCBJbnRlcm5hbCBUcmlnZ2VyIDQgKElUUjQpIGlzIHVzZWQgYXMgdHJpZ2dlciBpbnB1dCAqLw0KLSNkZWZpbmUgTExfVElNX1RTX0lUUjUgXA0KLSAgKFRJTV9TTUNSX1RTXzMgfCAgICAgXA0KLSAgIFRJTV9TTUNSX1RTXzApIC8qITwgSW50ZXJuYWwgVHJpZ2dlciA1IChJVFI1KSBpcyB1c2VkIGFzIHRyaWdnZXIgaW5wdXQgKi8NCi0jZGVmaW5lIExMX1RJTV9UU19JVFI2IFwNCi0gIChUSU1fU01DUl9UU18zIHwgICAgIFwNCi0gICBUSU1fU01DUl9UU18xKSAvKiE8IEludGVybmFsIFRyaWdnZXIgNiAoSVRSNikgaXMgdXNlZCBhcyB0cmlnZ2VyIGlucHV0ICovDQotI2RlZmluZSBMTF9USU1fVFNfSVRSNyAgICAgICAgICAgICBcDQotICAoVElNX1NNQ1JfVFNfMyB8IFRJTV9TTUNSX1RTXzEgfCBcDQotICAgVElNX1NNQ1JfVFNfMCkgLyohPCBJbnRlcm5hbCBUcmlnZ2VyIDcgKElUUjcpIGlzIHVzZWQgYXMgdHJpZ2dlciBpbnB1dCAqLw0KLSNkZWZpbmUgTExfVElNX1RTX0lUUjggXA0KLSAgKFRJTV9TTUNSX1RTXzMgfCAgICAgXA0KLSAgIFRJTV9TTUNSX1RTXzIpIC8qITwgSW50ZXJuYWwgVHJpZ2dlciA4IChJVFI4KSBpcyB1c2VkIGFzIHRyaWdnZXIgaW5wdXQgKi8NCi0jZGVmaW5lIExMX1RJTV9UU19JVFI5ICAgICAgICAgICAgIFwNCi0gIChUSU1fU01DUl9UU18zIHwgVElNX1NNQ1JfVFNfMiB8IFwNCi0gICBUSU1fU01DUl9UU18wKSAvKiE8IEludGVybmFsIFRyaWdnZXIgOSAoSVRSOSkgaXMgdXNlZCBhcyB0cmlnZ2VyIGlucHV0ICovDQotI2RlZmluZSBMTF9USU1fVFNfSVRSMTAgICAgICAgICAgICBcDQotICAoVElNX1NNQ1JfVFNfMyB8IFRJTV9TTUNSX1RTXzIgfCBcDQotICAgVElNX1NNQ1JfVFNfMSkgLyohPCBJbnRlcm5hbCBUcmlnZ2VyIDEwIChJVFIxMCkgaXMgdXNlZCBhcyB0cmlnZ2VyIGlucHV0ICovDQotI2RlZmluZSBMTF9USU1fVFNfSVRSMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKFRJTV9TTUNSX1RTXzMgfCBUSU1fU01DUl9UU18yIHwgVElNX1NNQ1JfVFNfMSB8IFwNCi0gICBUSU1fU01DUl9UU18wKSAvKiE8IEludGVybmFsIFRyaWdnZXIgMTEgKElUUjExKSBpcyB1c2VkIGFzIHRyaWdnZXIgaW5wdXQgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0VUUl9QT0xBUklUWSBFeHRlcm5hbCBUcmlnZ2VyIFBvbGFyaXR5DQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1RJTV9FVFJfUE9MQVJJVFlfTk9OSU5WRVJURUQgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBFVFIgaXMgbm9uLWludmVydGVkLCBhY3RpdmUgYXQgaGlnaCBsZXZlbCBvciByaXNpbmcgZWRnZSAqLw0KLSNkZWZpbmUgTExfVElNX0VUUl9QT0xBUklUWV9JTlZFUlRFRCBcDQotICBUSU1fU01DUl9FVFAgLyohPCBFVFIgaXMgaW52ZXJ0ZWQsIGFjdGl2ZSBhdCBsb3cgbGV2ZWwgb3IgZmFsbGluZyBlZGdlICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19FVFJfUFJFU0NBTEVSIEV4dGVybmFsIFRyaWdnZXIgUHJlc2NhbGVyDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1RJTV9FVFJfUFJFU0NBTEVSX0RJVjEgMHgwMDAwMDAwMFUgLyohPCBFVFIgcHJlc2NhbGVyIE9GRiAqLw0KLSNkZWZpbmUgTExfVElNX0VUUl9QUkVTQ0FMRVJfRElWMiBcDQotICBUSU1fU01DUl9FVFBTXzAgLyohPCBFVFIgZnJlcXVlbmN5IGlzIGRpdmlkZWQgYnkgMiAqLw0KLSNkZWZpbmUgTExfVElNX0VUUl9QUkVTQ0FMRVJfRElWNCBcDQotICBUSU1fU01DUl9FVFBTXzEgLyohPCBFVFIgZnJlcXVlbmN5IGlzIGRpdmlkZWQgYnkgNCAqLw0KLSNkZWZpbmUgTExfVElNX0VUUl9QUkVTQ0FMRVJfRElWOCBcDQotICBUSU1fU01DUl9FVFBTIC8qITwgRVRSIGZyZXF1ZW5jeSBpcyBkaXZpZGVkIGJ5IDggKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0VUUl9GSUxURVIgRXh0ZXJuYWwgVHJpZ2dlciBGaWx0ZXINCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfVElNX0VUUl9GSUxURVJfRkRJVjEgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBObyBmaWx0ZXIsIHNhbXBsaW5nIGlzIGRvbmUgYXQgZkRUUyAqLw0KLSNkZWZpbmUgTExfVElNX0VUUl9GSUxURVJfRkRJVjFfTjIgICAgICAgICAgIFwNCi0gIFRJTV9TTUNSX0VURl8wIC8qITwgZlNBTVBMSU5HPWZDS19JTlQsIE49MiBcDQotICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX1RJTV9FVFJfRklMVEVSX0ZESVYxX040ICAgICAgICAgICBcDQotICBUSU1fU01DUl9FVEZfMSAvKiE8IGZTQU1QTElORz1mQ0tfSU5ULCBOPTQgXA0KLSAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9USU1fRVRSX0ZJTFRFUl9GRElWMV9OOCBcDQotICAoVElNX1NNQ1JfRVRGXzEgfCBUSU1fU01DUl9FVEZfMCkgLyohPCBmU0FNUExJTkc9ZkNLX0lOVCwgTj04ICovDQotI2RlZmluZSBMTF9USU1fRVRSX0ZJTFRFUl9GRElWMl9ONiAgICAgICAgICBcDQotICBUSU1fU01DUl9FVEZfMiAvKiE8IGZTQU1QTElORz1mRFRTLzIsIE49NiBcDQotICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX1RJTV9FVFJfRklMVEVSX0ZESVYyX044IFwNCi0gIChUSU1fU01DUl9FVEZfMiB8IFRJTV9TTUNSX0VURl8wKSAvKiE8IGZTQU1QTElORz1mRFRTLzIsIE49OCAqLw0KLSNkZWZpbmUgTExfVElNX0VUUl9GSUxURVJfRkRJVjRfTjYgXA0KLSAgKFRJTV9TTUNSX0VURl8yIHwgVElNX1NNQ1JfRVRGXzEpIC8qITwgZlNBTVBMSU5HPWZEVFMvNCwgTj02ICovDQotI2RlZmluZSBMTF9USU1fRVRSX0ZJTFRFUl9GRElWNF9OOCAgIFwNCi0gIChUSU1fU01DUl9FVEZfMiB8IFRJTV9TTUNSX0VURl8xIHwgXA0KLSAgIFRJTV9TTUNSX0VURl8wKSAvKiE8IGZTQU1QTElORz1mRFRTLzQsIE49OCAqLw0KLSNkZWZpbmUgTExfVElNX0VUUl9GSUxURVJfRkRJVjhfTjYgICAgICAgICAgXA0KLSAgVElNX1NNQ1JfRVRGXzMgLyohPCBmU0FNUExJTkc9ZkRUUy84LCBOPTggXA0KLSAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9USU1fRVRSX0ZJTFRFUl9GRElWOF9OOCBcDQotICAoVElNX1NNQ1JfRVRGXzMgfCBUSU1fU01DUl9FVEZfMCkgLyohPCBmU0FNUExJTkc9ZkRUUy8xNiwgTj01ICovDQotI2RlZmluZSBMTF9USU1fRVRSX0ZJTFRFUl9GRElWMTZfTjUgXA0KLSAgKFRJTV9TTUNSX0VURl8zIHwgVElNX1NNQ1JfRVRGXzEpIC8qITwgZlNBTVBMSU5HPWZEVFMvMTYsIE49NiAqLw0KLSNkZWZpbmUgTExfVElNX0VUUl9GSUxURVJfRkRJVjE2X042ICBcDQotICAoVElNX1NNQ1JfRVRGXzMgfCBUSU1fU01DUl9FVEZfMSB8IFwNCi0gICBUSU1fU01DUl9FVEZfMCkgLyohPCBmU0FNUExJTkc9ZkRUUy8xNiwgTj04ICovDQotI2RlZmluZSBMTF9USU1fRVRSX0ZJTFRFUl9GRElWMTZfTjggXA0KLSAgKFRJTV9TTUNSX0VURl8zIHwgVElNX1NNQ1JfRVRGXzIpIC8qITwgZlNBTVBMSU5HPWZEVFMvMTYsIE49NSAqLw0KLSNkZWZpbmUgTExfVElNX0VUUl9GSUxURVJfRkRJVjMyX041ICBcDQotICAoVElNX1NNQ1JfRVRGXzMgfCBUSU1fU01DUl9FVEZfMiB8IFwNCi0gICBUSU1fU01DUl9FVEZfMCkgLyohPCBmU0FNUExJTkc9ZkRUUy8zMiwgTj01ICovDQotI2RlZmluZSBMTF9USU1fRVRSX0ZJTFRFUl9GRElWMzJfTjYgIFwNCi0gIChUSU1fU01DUl9FVEZfMyB8IFRJTV9TTUNSX0VURl8yIHwgXA0KLSAgIFRJTV9TTUNSX0VURl8xKSAvKiE8IGZTQU1QTElORz1mRFRTLzMyLCBOPTYgKi8NCi0jZGVmaW5lIExMX1RJTV9FVFJfRklMVEVSX0ZESVYzMl9OOCAgICAgICAgXA0KLSAgVElNX1NNQ1JfRVRGIC8qITwgZlNBTVBMSU5HPWZEVFMvMzIsIE49OCBcDQotICAgICAgICAgICAgICAgICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19USU0xX0VUUlNPVVJDRSBFeHRlcm5hbCBUcmlnZ2VyIFNvdXJjZSBUSU0xDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1RJTV9USU0xX0VUUlNPVVJDRV9HUElPIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBHUElPICovDQotI2RlZmluZSBMTF9USU1fVElNMV9FVFJTT1VSQ0VfQ09NUDEgXA0KLSAgVElNMV9BRjFfRVRSU0VMXzAgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVAxX09VVCAqLw0KLSNkZWZpbmUgTExfVElNX1RJTTFfRVRSU09VUkNFX0NPTVAyIFwNCi0gIFRJTTFfQUYxX0VUUlNFTF8xIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QMl9PVVQgKi8NCi0jZGVmaW5lIExMX1RJTV9USU0xX0VUUlNPVVJDRV9DT01QMyBcDQotICAoVElNMV9BRjFfRVRSU0VMXzEgfCAgICAgICAgICAgICAgXA0KLSAgIFRJTTFfQUYxX0VUUlNFTF8wKSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDNfT1VUICovDQotI2RlZmluZSBMTF9USU1fVElNMV9FVFJTT1VSQ0VfQ09NUDQgXA0KLSAgVElNMV9BRjFfRVRSU0VMXzIgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVA0X09VVCAqLw0KLSNpZiBkZWZpbmVkKENPTVA1KQ0KLSNkZWZpbmUgTExfVElNX1RJTTFfRVRSU09VUkNFX0NPTVA1IFwNCi0gIChUSU0xX0FGMV9FVFJTRUxfMiB8ICAgICAgICAgICAgICBcDQotICAgVElNMV9BRjFfRVRSU0VMXzApIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QNV9PVVQgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgLyogQ09NUDUgKi8NCi0jaWYgZGVmaW5lZChDT01QNikNCi0jZGVmaW5lIExMX1RJTV9USU0xX0VUUlNPVVJDRV9DT01QNiBcDQotICAoVElNMV9BRjFfRVRSU0VMXzIgfCAgICAgICAgICAgICAgXA0KLSAgIFRJTTFfQUYxX0VUUlNFTF8xKSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDZfT1VUICovDQotI2VuZGlmICAgICAgICAgICAgICAgIC8qIENPTVA2ICovDQotI2lmIGRlZmluZWQoQ09NUDcpDQotI2RlZmluZSBMTF9USU1fVElNMV9FVFJTT1VSQ0VfQ09NUDcgICAgICAgIFwNCi0gIChUSU0xX0FGMV9FVFJTRUxfMiB8IFRJTTFfQUYxX0VUUlNFTF8xIHwgXA0KLSAgIFRJTTFfQUYxX0VUUlNFTF8wKSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDdfT1VUICovDQotI2VuZGlmICAgICAgICAgICAgICAgIC8qIENPTVA3ICovDQotI2RlZmluZSBMTF9USU1fVElNMV9FVFJTT1VSQ0VfQURDMV9BV0QxIFwNCi0gIFRJTTFfQUYxX0VUUlNFTF8zIC8qITwgQURDMSBhbmFsb2cgd2F0Y2hkb2cgMSAqLw0KLSNkZWZpbmUgTExfVElNX1RJTTFfRVRSU09VUkNFX0FEQzFfQVdEMiBcDQotICAoVElNMV9BRjFfRVRSU0VMXzMgfCBUSU0xX0FGMV9FVFJTRUxfMCkgLyohPCBBREMxIGFuYWxvZyB3YXRjaGRvZyAyICovDQotI2RlZmluZSBMTF9USU1fVElNMV9FVFJTT1VSQ0VfQURDMV9BV0QzIFwNCi0gIChUSU0xX0FGMV9FVFJTRUxfMyB8IFRJTTFfQUYxX0VUUlNFTF8xKSAvKiE8IEFEQzEgYW5hbG9nIHdhdGNoZG9nIDMgKi8NCi0jaWYgZGVmaW5lZChBREM0KQ0KLSNkZWZpbmUgTExfVElNX1RJTTFfRVRSU09VUkNFX0FEQzRfQVdEMSAgICBcDQotICAoVElNMV9BRjFfRVRSU0VMXzMgfCBUSU0xX0FGMV9FVFJTRUxfMSB8IFwNCi0gICBUSU0xX0FGMV9FVFJTRUxfMCkgLyohPCBBREM0IGFuYWxvZyB3YXRjaGRvZyAxICovDQotI2RlZmluZSBMTF9USU1fVElNMV9FVFJTT1VSQ0VfQURDNF9BV0QyIFwNCi0gIChUSU0xX0FGMV9FVFJTRUxfMyB8IFRJTTFfQUYxX0VUUlNFTF8yKSAvKiE8IEFEQzQgYW5hbG9nIHdhdGNoZG9nIDIgKi8NCi0jZGVmaW5lIExMX1RJTV9USU0xX0VUUlNPVVJDRV9BREM0X0FXRDMgICAgXA0KLSAgKFRJTTFfQUYxX0VUUlNFTF8zIHwgVElNMV9BRjFfRVRSU0VMXzIgfCBcDQotICAgVElNMV9BRjFfRVRSU0VMXzApIC8qITwgQURDNCBhbmFsb2cgd2F0Y2hkb2cgMyAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgICAvKiBBREM0ICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19USU0yX0VUUlNPVVJDRSBFeHRlcm5hbCBUcmlnZ2VyIFNvdXJjZSBUSU0yDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1RJTV9USU0yX0VUUlNPVVJDRV9HUElPIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBHUElPICovDQotI2RlZmluZSBMTF9USU1fVElNMl9FVFJTT1VSQ0VfQ09NUDEgXA0KLSAgVElNMV9BRjFfRVRSU0VMXzAgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVAxX09VVCAqLw0KLSNkZWZpbmUgTExfVElNX1RJTTJfRVRSU09VUkNFX0NPTVAyIFwNCi0gIFRJTTFfQUYxX0VUUlNFTF8xIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QMl9PVVQgKi8NCi0jZGVmaW5lIExMX1RJTV9USU0yX0VUUlNPVVJDRV9DT01QMyBcDQotICAoVElNMV9BRjFfRVRSU0VMXzEgfCAgICAgICAgICAgICAgXA0KLSAgIFRJTTFfQUYxX0VUUlNFTF8wKSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDNfT1VUICovDQotI2RlZmluZSBMTF9USU1fVElNMl9FVFJTT1VSQ0VfQ09NUDQgXA0KLSAgVElNMV9BRjFfRVRSU0VMXzIgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVA0X09VVCAqLw0KLSNpZiBkZWZpbmVkKENPTVA1KQ0KLSNkZWZpbmUgTExfVElNX1RJTTJfRVRSU09VUkNFX0NPTVA1IFwNCi0gIChUSU0xX0FGMV9FVFJTRUxfMiB8ICAgICAgICAgICAgICBcDQotICAgVElNMV9BRjFfRVRSU0VMXzApIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QNV9PVVQgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgLyogQ09NUDUgKi8NCi0jaWYgZGVmaW5lZChDT01QNikNCi0jZGVmaW5lIExMX1RJTV9USU0yX0VUUlNPVVJDRV9DT01QNiBcDQotICAoVElNMV9BRjFfRVRSU0VMXzIgfCAgICAgICAgICAgICAgXA0KLSAgIFRJTTFfQUYxX0VUUlNFTF8xKSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDZfT1VUICovDQotI2VuZGlmICAgICAgICAgICAgICAgIC8qIENPTVA2ICovDQotI2lmIGRlZmluZWQoQ09NUDcpDQotI2RlZmluZSBMTF9USU1fVElNMl9FVFJTT1VSQ0VfQ09NUDcgICAgICAgIFwNCi0gIChUSU0xX0FGMV9FVFJTRUxfMiB8IFRJTTFfQUYxX0VUUlNFTF8xIHwgXA0KLSAgIFRJTTFfQUYxX0VUUlNFTF8wKSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDdfT1VUICovDQotI2VuZGlmICAgICAgICAgICAgICAgIC8qIENPTVA3ICovDQotI2RlZmluZSBMTF9USU1fVElNMl9FVFJTT1VSQ0VfVElNM19FVFIgXA0KLSAgVElNMV9BRjFfRVRSU0VMXzMgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIFRJTTMgRVRSICovDQotI2RlZmluZSBMTF9USU1fVElNMl9FVFJTT1VSQ0VfVElNNF9FVFIgXA0KLSAgKFRJTTFfQUYxX0VUUlNFTF8zIHwgICAgICAgICAgICAgICAgIFwNCi0gICBUSU0xX0FGMV9FVFJTRUxfMCkgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIFRJTTQgRVRSICovDQotI2lmIGRlZmluZWQoVElNNSkNCi0jZGVmaW5lIExMX1RJTV9USU0yX0VUUlNPVVJDRV9USU01X0VUUiBcDQotICAoVElNMV9BRjFfRVRSU0VMXzMgfCAgICAgICAgICAgICAgICAgXA0KLSAgIFRJTTFfQUYxX0VUUlNFTF8xKSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gVElNNSBFVFIgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgLyogVElNNSAqLw0KLSNkZWZpbmUgTExfVElNX1RJTTJfRVRSU09VUkNFX0xTRSAgICAgICAgICBcDQotICAoVElNMV9BRjFfRVRSU0VMXzMgfCBUSU0xX0FGMV9FVFJTRUxfMSB8IFwNCi0gICBUSU0xX0FGMV9FVFJTRUxfMCkgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIExTRSAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBUSU1fTExfRUNfVElNM19FVFJTT1VSQ0UgRXh0ZXJuYWwgVHJpZ2dlciBTb3VyY2UgVElNMw0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9USU1fVElNM19FVFJTT1VSQ0VfR1BJTyBcDQotICAweDAwMDAwMDAwVSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gR1BJTyAqLw0KLSNkZWZpbmUgTExfVElNX1RJTTNfRVRSU09VUkNFX0NPTVAxIFwNCi0gIFRJTTFfQUYxX0VUUlNFTF8wIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QMV9PVVQgKi8NCi0jZGVmaW5lIExMX1RJTV9USU0zX0VUUlNPVVJDRV9DT01QMiBcDQotICBUSU0xX0FGMV9FVFJTRUxfMSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDJfT1VUICovDQotI2RlZmluZSBMTF9USU1fVElNM19FVFJTT1VSQ0VfQ09NUDMgXA0KLSAgKFRJTTFfQUYxX0VUUlNFTF8xIHwgICAgICAgICAgICAgIFwNCi0gICBUSU0xX0FGMV9FVFJTRUxfMCkgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVAzX09VVCAqLw0KLSNkZWZpbmUgTExfVElNX1RJTTNfRVRSU09VUkNFX0NPTVA0IFwNCi0gIFRJTTFfQUYxX0VUUlNFTF8yIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QNF9PVVQgKi8NCi0jaWYgZGVmaW5lZChDT01QNSkNCi0jZGVmaW5lIExMX1RJTV9USU0zX0VUUlNPVVJDRV9DT01QNSBcDQotICAoVElNMV9BRjFfRVRSU0VMXzIgfCAgICAgICAgICAgICAgXA0KLSAgIFRJTTFfQUYxX0VUUlNFTF8wKSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDVfT1VUICovDQotI2VuZGlmICAgICAgICAgICAgICAgIC8qIENPTVA1ICovDQotI2lmIGRlZmluZWQoQ09NUDYpDQotI2RlZmluZSBMTF9USU1fVElNM19FVFJTT1VSQ0VfQ09NUDYgXA0KLSAgKFRJTTFfQUYxX0VUUlNFTF8yIHwgICAgICAgICAgICAgIFwNCi0gICBUSU0xX0FGMV9FVFJTRUxfMSkgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVA2X09VVCAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgICAvKiBDT01QNiAqLw0KLSNpZiBkZWZpbmVkKENPTVA3KQ0KLSNkZWZpbmUgTExfVElNX1RJTTNfRVRSU09VUkNFX0NPTVA3ICAgICAgICBcDQotICAoVElNMV9BRjFfRVRSU0VMXzIgfCBUSU0xX0FGMV9FVFJTRUxfMSB8IFwNCi0gICBUSU0xX0FGMV9FVFJTRUxfMCkgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVA3X09VVCAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgICAvKiBDT01QNyAqLw0KLSNkZWZpbmUgTExfVElNX1RJTTNfRVRSU09VUkNFX1RJTTJfRVRSIFwNCi0gIFRJTTFfQUYxX0VUUlNFTF8zIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBUSU0yIEVUUiAqLw0KLSNkZWZpbmUgTExfVElNX1RJTTNfRVRSU09VUkNFX1RJTTRfRVRSIFwNCi0gIChUSU0xX0FGMV9FVFJTRUxfMyB8ICAgICAgICAgICAgICAgICBcDQotICAgVElNMV9BRjFfRVRSU0VMXzApIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBUSU00IEVUUiAqLw0KLSNkZWZpbmUgTExfVElNX1RJTTNfRVRSU09VUkNFX0FEQzJfQVdEMSAgICBcDQotICAoVElNMV9BRjFfRVRSU0VMXzMgfCBUSU0xX0FGMV9FVFJTRUxfMSB8IFwNCi0gICBUSU0xX0FGMV9FVFJTRUxfMCkgLyohPCBBREMyIGFuYWxvZyB3YXRjaGRvZyAxICovDQotI2RlZmluZSBMTF9USU1fVElNM19FVFJTT1VSQ0VfQURDMl9BV0QyIFwNCi0gIChUSU0xX0FGMV9FVFJTRUxfMyB8IFRJTTFfQUYxX0VUUlNFTF8yKSAvKiE8IEFEQzIgYW5hbG9nIHdhdGNoZG9nIDIgKi8NCi0jZGVmaW5lIExMX1RJTV9USU0zX0VUUlNPVVJDRV9BREMyX0FXRDMgICAgXA0KLSAgKFRJTTFfQUYxX0VUUlNFTF8zIHwgVElNMV9BRjFfRVRSU0VMXzIgfCBcDQotICAgVElNMV9BRjFfRVRSU0VMXzApIC8qITwgQURDMiBhbmFsb2cgd2F0Y2hkb2cgMyAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBUSU1fTExfRUNfVElNNF9FVFJTT1VSQ0UgRXh0ZXJuYWwgVHJpZ2dlciBTb3VyY2UgVElNNA0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9USU1fVElNNF9FVFJTT1VSQ0VfR1BJTyBcDQotICAweDAwMDAwMDAwVSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gR1BJTyAqLw0KLSNkZWZpbmUgTExfVElNX1RJTTRfRVRSU09VUkNFX0NPTVAxIFwNCi0gIFRJTTFfQUYxX0VUUlNFTF8wIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QMV9PVVQgKi8NCi0jZGVmaW5lIExMX1RJTV9USU00X0VUUlNPVVJDRV9DT01QMiBcDQotICBUSU0xX0FGMV9FVFJTRUxfMSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDJfT1VUICovDQotI2RlZmluZSBMTF9USU1fVElNNF9FVFJTT1VSQ0VfQ09NUDMgXA0KLSAgKFRJTTFfQUYxX0VUUlNFTF8xIHwgICAgICAgICAgICAgIFwNCi0gICBUSU0xX0FGMV9FVFJTRUxfMCkgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVAzX09VVCAqLw0KLSNkZWZpbmUgTExfVElNX1RJTTRfRVRSU09VUkNFX0NPTVA0IFwNCi0gIFRJTTFfQUYxX0VUUlNFTF8yIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QNF9PVVQgKi8NCi0jaWYgZGVmaW5lZChDT01QNSkNCi0jZGVmaW5lIExMX1RJTV9USU00X0VUUlNPVVJDRV9DT01QNSBcDQotICAoVElNMV9BRjFfRVRSU0VMXzIgfCAgICAgICAgICAgICAgXA0KLSAgIFRJTTFfQUYxX0VUUlNFTF8wKSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDVfT1VUICovDQotI2VuZGlmICAgICAgICAgICAgICAgIC8qIENPTVA1ICovDQotI2lmIGRlZmluZWQoQ09NUDYpDQotI2RlZmluZSBMTF9USU1fVElNNF9FVFJTT1VSQ0VfQ09NUDYgXA0KLSAgKFRJTTFfQUYxX0VUUlNFTF8yIHwgICAgICAgICAgICAgIFwNCi0gICBUSU0xX0FGMV9FVFJTRUxfMSkgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVA2X09VVCAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgICAvKiBDT01QNiAqLw0KLSNpZiBkZWZpbmVkKENPTVA3KQ0KLSNkZWZpbmUgTExfVElNX1RJTTRfRVRSU09VUkNFX0NPTVA3ICAgICAgICBcDQotICAoVElNMV9BRjFfRVRSU0VMXzIgfCBUSU0xX0FGMV9FVFJTRUxfMSB8IFwNCi0gICBUSU0xX0FGMV9FVFJTRUxfMCkgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVA3X09VVCAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgICAvKiBDT01QNyAqLw0KLSNkZWZpbmUgTExfVElNX1RJTTRfRVRSU09VUkNFX1RJTTNfRVRSIFwNCi0gIFRJTTFfQUYxX0VUUlNFTF8zIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBUSU0zIEVUUiAqLw0KLSNpZiBkZWZpbmVkKFRJTTUpDQotI2RlZmluZSBMTF9USU1fVElNNF9FVFJTT1VSQ0VfVElNNV9FVFIgXA0KLSAgKFRJTTFfQUYxX0VUUlNFTF8zIHwgICAgICAgICAgICAgICAgIFwNCi0gICBUSU0xX0FGMV9FVFJTRUxfMCkgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIFRJTTUgRVRSICovDQotI2VuZGlmICAgICAgICAgICAgICAgIC8qIFRJTTUgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLSNpZiBkZWZpbmVkKFRJTTUpDQotLyoqIEBkZWZncm91cCBUSU1fTExfRUNfVElNNV9FVFJTT1VSQ0UgRXh0ZXJuYWwgVHJpZ2dlciBTb3VyY2UgVElNNQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9USU1fVElNNV9FVFJTT1VSQ0VfR1BJTyBcDQotICAweDAwMDAwMDAwVSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gR1BJTyAqLw0KLSNkZWZpbmUgTExfVElNX1RJTTVfRVRSU09VUkNFX0NPTVAxIFwNCi0gIFRJTTFfQUYxX0VUUlNFTF8wIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QMV9PVVQgKi8NCi0jZGVmaW5lIExMX1RJTV9USU01X0VUUlNPVVJDRV9DT01QMiBcDQotICBUSU0xX0FGMV9FVFJTRUxfMSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDJfT1VUICovDQotI2RlZmluZSBMTF9USU1fVElNNV9FVFJTT1VSQ0VfQ09NUDMgXA0KLSAgKFRJTTFfQUYxX0VUUlNFTF8xIHwgICAgICAgICAgICAgIFwNCi0gICBUSU0xX0FGMV9FVFJTRUxfMCkgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVAzX09VVCAqLw0KLSNkZWZpbmUgTExfVElNX1RJTTVfRVRSU09VUkNFX0NPTVA0IFwNCi0gIFRJTTFfQUYxX0VUUlNFTF8yIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QNF9PVVQgKi8NCi0jaWYgZGVmaW5lZChDT01QNSkNCi0jZGVmaW5lIExMX1RJTV9USU01X0VUUlNPVVJDRV9DT01QNSBcDQotICAoVElNMV9BRjFfRVRSU0VMXzIgfCAgICAgICAgICAgICAgXA0KLSAgIFRJTTFfQUYxX0VUUlNFTF8wKSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDVfT1VUICovDQotI2VuZGlmICAgICAgICAgICAgICAgIC8qIENPTVA1ICovDQotI2lmIGRlZmluZWQoQ09NUDYpDQotI2RlZmluZSBMTF9USU1fVElNNV9FVFJTT1VSQ0VfQ09NUDYgXA0KLSAgKFRJTTFfQUYxX0VUUlNFTF8yIHwgICAgICAgICAgICAgIFwNCi0gICBUSU0xX0FGMV9FVFJTRUxfMSkgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVA2X09VVCAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgICAvKiBDT01QNiAqLw0KLSNpZiBkZWZpbmVkKENPTVA3KQ0KLSNkZWZpbmUgTExfVElNX1RJTTVfRVRSU09VUkNFX0NPTVA3ICAgICAgICBcDQotICAoVElNMV9BRjFfRVRSU0VMXzIgfCBUSU0xX0FGMV9FVFJTRUxfMSB8IFwNCi0gICBUSU0xX0FGMV9FVFJTRUxfMCkgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVA3X09VVCAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgICAvKiBDT01QNyAqLw0KLSNkZWZpbmUgTExfVElNX1RJTTVfRVRSU09VUkNFX1RJTTJfRVRSIFwNCi0gIFRJTTFfQUYxX0VUUlNFTF8zIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBUSU0yIEVUUiAqLw0KLSNkZWZpbmUgTExfVElNX1RJTTVfRVRSU09VUkNFX1RJTTNfRVRSIFwNCi0gIChUSU0xX0FGMV9FVFJTRUxfMyB8ICAgICAgICAgICAgICAgICBcDQotICAgVElNMV9BRjFfRVRSU0VMXzApIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBUSU0zIEVUUiAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotI2VuZGlmIC8qIFRJTTUgKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19USU04X0VUUlNPVVJDRSBFeHRlcm5hbCBUcmlnZ2VyIFNvdXJjZSBUSU04DQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1RJTV9USU04X0VUUlNPVVJDRV9HUElPIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBHUElPICovDQotI2RlZmluZSBMTF9USU1fVElNOF9FVFJTT1VSQ0VfQ09NUDEgXA0KLSAgVElNMV9BRjFfRVRSU0VMXzAgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVAxX09VVCAqLw0KLSNkZWZpbmUgTExfVElNX1RJTThfRVRSU09VUkNFX0NPTVAyIFwNCi0gIFRJTTFfQUYxX0VUUlNFTF8xIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QMl9PVVQgKi8NCi0jZGVmaW5lIExMX1RJTV9USU04X0VUUlNPVVJDRV9DT01QMyBcDQotICAoVElNMV9BRjFfRVRSU0VMXzEgfCAgICAgICAgICAgICAgXA0KLSAgIFRJTTFfQUYxX0VUUlNFTF8wKSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDNfT1VUICovDQotI2RlZmluZSBMTF9USU1fVElNOF9FVFJTT1VSQ0VfQ09NUDQgXA0KLSAgVElNMV9BRjFfRVRSU0VMXzIgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVA0X09VVCAqLw0KLSNpZiBkZWZpbmVkKENPTVA1KQ0KLSNkZWZpbmUgTExfVElNX1RJTThfRVRSU09VUkNFX0NPTVA1IFwNCi0gIChUSU0xX0FGMV9FVFJTRUxfMiB8ICAgICAgICAgICAgICBcDQotICAgVElNMV9BRjFfRVRSU0VMXzApIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QNV9PVVQgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgLyogQ09NUDUgKi8NCi0jaWYgZGVmaW5lZChDT01QNikNCi0jZGVmaW5lIExMX1RJTV9USU04X0VUUlNPVVJDRV9DT01QNiBcDQotICAoVElNMV9BRjFfRVRSU0VMXzIgfCAgICAgICAgICAgICAgXA0KLSAgIFRJTTFfQUYxX0VUUlNFTF8xKSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDZfT1VUICovDQotI2VuZGlmICAgICAgICAgICAgICAgIC8qIENPTVA2ICovDQotI2lmIGRlZmluZWQoQ09NUDcpDQotI2RlZmluZSBMTF9USU1fVElNOF9FVFJTT1VSQ0VfQ09NUDcgICAgICAgIFwNCi0gIChUSU0xX0FGMV9FVFJTRUxfMiB8IFRJTTFfQUYxX0VUUlNFTF8xIHwgXA0KLSAgIFRJTTFfQUYxX0VUUlNFTF8wKSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDdfT1VUICovDQotI2VuZGlmICAgICAgICAgICAgICAgIC8qIENPTVA3ICovDQotI2RlZmluZSBMTF9USU1fVElNOF9FVFJTT1VSQ0VfQURDMl9BV0QxIFwNCi0gIFRJTTFfQUYxX0VUUlNFTF8zIC8qITwgQURDMiBhbmFsb2cgd2F0Y2hkb2cgMSAqLw0KLSNkZWZpbmUgTExfVElNX1RJTThfRVRSU09VUkNFX0FEQzJfQVdEMiBcDQotICAoVElNMV9BRjFfRVRSU0VMXzMgfCBUSU0xX0FGMV9FVFJTRUxfMCkgLyohPCBBREMyIGFuYWxvZyB3YXRjaGRvZyAyICovDQotI2RlZmluZSBMTF9USU1fVElNOF9FVFJTT1VSQ0VfQURDMl9BV0QzIFwNCi0gIChUSU0xX0FGMV9FVFJTRUxfMyB8IFRJTTFfQUYxX0VUUlNFTF8xKSAvKiE8IEFEQzIgYW5hbG9nIHdhdGNoZG9nIDMgKi8NCi0jaWYgZGVmaW5lZChBREMzKQ0KLSNkZWZpbmUgTExfVElNX1RJTThfRVRSU09VUkNFX0FEQzNfQVdEMSAgICBcDQotICAoVElNMV9BRjFfRVRSU0VMXzMgfCBUSU0xX0FGMV9FVFJTRUxfMSB8IFwNCi0gICBUSU0xX0FGMV9FVFJTRUxfMCkgLyohPCBBREMzIGFuYWxvZyB3YXRjaGRvZyAxICovDQotI2RlZmluZSBMTF9USU1fVElNOF9FVFJTT1VSQ0VfQURDM19BV0QyIFwNCi0gIChUSU0xX0FGMV9FVFJTRUxfMyB8IFRJTTFfQUYxX0VUUlNFTF8yKSAvKiE8IEFEQzMgYW5hbG9nIHdhdGNoZG9nIDIgKi8NCi0jZGVmaW5lIExMX1RJTV9USU04X0VUUlNPVVJDRV9BREMzX0FXRDMgICAgXA0KLSAgKFRJTTFfQUYxX0VUUlNFTF8zIHwgVElNMV9BRjFfRVRSU0VMXzIgfCBcDQotICAgVElNMV9BRjFfRVRSU0VMXzApIC8qITwgQURDMyBhbmFsb2cgd2F0Y2hkb2cgMyAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgICAvKiBBREMzICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0jaWYgZGVmaW5lZChUSU0yMCkNCi0vKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19USU0yMF9FVFJTT1VSQ0UgRXh0ZXJuYWwgVHJpZ2dlciBTb3VyY2UgVElNMjANCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfVElNX1RJTTIwX0VUUlNPVVJDRV9HUElPIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBHUElPICovDQotI2RlZmluZSBMTF9USU1fVElNMjBfRVRSU09VUkNFX0NPTVAxIFwNCi0gIFRJTTFfQUYxX0VUUlNFTF8wIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QMV9PVVQgKi8NCi0jZGVmaW5lIExMX1RJTV9USU0yMF9FVFJTT1VSQ0VfQ09NUDIgXA0KLSAgVElNMV9BRjFfRVRSU0VMXzEgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVAyX09VVCAqLw0KLSNkZWZpbmUgTExfVElNX1RJTTIwX0VUUlNPVVJDRV9DT01QMyBcDQotICAoVElNMV9BRjFfRVRSU0VMXzEgfCAgICAgICAgICAgICAgIFwNCi0gICBUSU0xX0FGMV9FVFJTRUxfMCkgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVAzX09VVCAqLw0KLSNkZWZpbmUgTExfVElNX1RJTTIwX0VUUlNPVVJDRV9DT01QNCBcDQotICBUSU0xX0FGMV9FVFJTRUxfMiAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDRfT1VUICovDQotI2lmIGRlZmluZWQoQ09NUDUpDQotI2RlZmluZSBMTF9USU1fVElNMjBfRVRSU09VUkNFX0NPTVA1IFwNCi0gIChUSU0xX0FGMV9FVFJTRUxfMiB8ICAgICAgICAgICAgICAgXA0KLSAgIFRJTTFfQUYxX0VUUlNFTF8wKSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDVfT1VUICovDQotI2VuZGlmICAgICAgICAgICAgICAgIC8qIENPTVA1ICovDQotI2lmIGRlZmluZWQoQ09NUDYpDQotI2RlZmluZSBMTF9USU1fVElNMjBfRVRSU09VUkNFX0NPTVA2IFwNCi0gIChUSU0xX0FGMV9FVFJTRUxfMiB8ICAgICAgICAgICAgICAgXA0KLSAgIFRJTTFfQUYxX0VUUlNFTF8xKSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDZfT1VUICovDQotI2VuZGlmICAgICAgICAgICAgICAgIC8qIENPTVA2ICovDQotI2lmIGRlZmluZWQoQ09NUDcpDQotI2RlZmluZSBMTF9USU1fVElNMjBfRVRSU09VUkNFX0NPTVA3ICAgICAgIFwNCi0gIChUSU0xX0FGMV9FVFJTRUxfMiB8IFRJTTFfQUYxX0VUUlNFTF8xIHwgXA0KLSAgIFRJTTFfQUYxX0VUUlNFTF8wKSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDdfT1VUICovDQotI2VuZGlmICAgICAgICAgICAgICAgIC8qIENPTVA3ICovDQotI2lmIGRlZmluZWQoQURDMykNCi0jZGVmaW5lIExMX1RJTV9USU0yMF9FVFJTT1VSQ0VfQURDM19BV0QxIFwNCi0gIFRJTTFfQUYxX0VUUlNFTF8zIC8qITwgQURDMyBhbmFsb2cgd2F0Y2hkb2cgMSAqLw0KLSNkZWZpbmUgTExfVElNX1RJTTIwX0VUUlNPVVJDRV9BREMzX0FXRDIgXA0KLSAgKFRJTTFfQUYxX0VUUlNFTF8zIHwgVElNMV9BRjFfRVRSU0VMXzApIC8qITwgQURDMyBhbmFsb2cgd2F0Y2hkb2cgMiAqLw0KLSNkZWZpbmUgTExfVElNX1RJTTIwX0VUUlNPVVJDRV9BREMzX0FXRDMgXA0KLSAgKFRJTTFfQUYxX0VUUlNFTF8zIHwgVElNMV9BRjFfRVRSU0VMXzEpIC8qITwgQURDMyBhbmFsb2cgd2F0Y2hkb2cgMyAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFEQzMgKi8NCi0jaWYgZGVmaW5lZChBREM1KQ0KLSNkZWZpbmUgTExfVElNX1RJTTIwX0VUUlNPVVJDRV9BREM1X0FXRDEgICBcDQotICAoVElNMV9BRjFfRVRSU0VMXzMgfCBUSU0xX0FGMV9FVFJTRUxfMSB8IFwNCi0gICBUSU0xX0FGMV9FVFJTRUxfMCkgLyohPCBBREM1IGFuYWxvZyB3YXRjaGRvZyAxICovDQotI2RlZmluZSBMTF9USU1fVElNMjBfRVRSU09VUkNFX0FEQzVfQVdEMiBcDQotICAoVElNMV9BRjFfRVRSU0VMXzMgfCBUSU0xX0FGMV9FVFJTRUxfMikgLyohPCBBREM1IGFuYWxvZyB3YXRjaGRvZyAyICovDQotI2RlZmluZSBMTF9USU1fVElNMjBfRVRSU09VUkNFX0FEQzVfQVdEMyAgIFwNCi0gIChUSU0xX0FGMV9FVFJTRUxfMyB8IFRJTTFfQUYxX0VUUlNFTF8yIHwgXA0KLSAgIFRJTTFfQUYxX0VUUlNFTF8wKSAvKiE8IEFEQzUgYW5hbG9nIHdhdGNoZG9nIDMgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgLyogQURDNSAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotI2VuZGlmIC8qIFRJTTIwICovDQotDQotLyoqIEBkZWZncm91cCBUSU1fTExfRUNfQlJFQUtfUE9MQVJJVFkgYnJlYWsgcG9sYXJpdHkNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfVElNX0JSRUFLX1BPTEFSSVRZX0xPVyBcDQotICAweDAwMDAwMDAwVSAvKiE8IEJyZWFrIGlucHV0IEJSSyBpcyBhY3RpdmUgbG93ICovDQotI2RlZmluZSBMTF9USU1fQlJFQUtfUE9MQVJJVFlfSElHSCBcDQotICBUSU1fQkRUUl9CS1AgLyohPCBCcmVhayBpbnB1dCBCUksgaXMgYWN0aXZlIGhpZ2ggKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0JSRUFLX0ZJTFRFUiBicmVhayBmaWx0ZXINCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWMSBcDQotICAweDAwMDAwMDAwVSAvKiE8IE5vIGZpbHRlciwgQlJLIGFjdHMgYXN5bmNocm9ub3VzbHkgKi8NCi0jZGVmaW5lIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjFfTjIgICAgICBcDQotICAweDAwMDEwMDAwVSAvKiE8IGZTQU1QTElORz1mQ0tfSU5ULCBOPTIgXA0KLSAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYxX040ICAgICAgXA0KLSAgMHgwMDAyMDAwMFUgLyohPCBmU0FNUExJTkc9ZkNLX0lOVCwgTj00IFwNCi0gICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWMV9OOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgMHgwMDAzMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZTQU1QTElORz1mQ0tfSU5ULCBOPTggXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjJfTjYgMHgwMDA0MDAwMFUgLyohPCBmU0FNUExJTkc9ZkRUUy8yLCBOPTYgKi8NCi0jZGVmaW5lIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjJfTjggMHgwMDA1MDAwMFUgLyohPCBmU0FNUExJTkc9ZkRUUy8yLCBOPTggKi8NCi0jZGVmaW5lIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjRfTjYgMHgwMDA2MDAwMFUgLyohPCBmU0FNUExJTkc9ZkRUUy80LCBOPTYgKi8NCi0jZGVmaW5lIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjRfTjggMHgwMDA3MDAwMFUgLyohPCBmU0FNUExJTkc9ZkRUUy80LCBOPTggKi8NCi0jZGVmaW5lIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjhfTjYgMHgwMDA4MDAwMFUgLyohPCBmU0FNUExJTkc9ZkRUUy84LCBOPTYgKi8NCi0jZGVmaW5lIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjhfTjggMHgwMDA5MDAwMFUgLyohPCBmU0FNUExJTkc9ZkRUUy84LCBOPTggKi8NCi0jZGVmaW5lIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjE2X041ICAgICBcDQotICAweDAwMEEwMDAwVSAvKiE8IGZTQU1QTElORz1mRFRTLzE2LCBOPTUgXA0KLSAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYxNl9ONiAgICAgXA0KLSAgMHgwMDBCMDAwMFUgLyohPCBmU0FNUExJTkc9ZkRUUy8xNiwgTj02IFwNCi0gICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWMTZfTjggICAgIFwNCi0gIDB4MDAwQzAwMDBVIC8qITwgZlNBTVBMSU5HPWZEVFMvMTYsIE49OCBcDQotICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjMyX041ICAgICBcDQotICAweDAwMEQwMDAwVSAvKiE8IGZTQU1QTElORz1mRFRTLzMyLCBOPTUgXA0KLSAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYzMl9ONiAgICAgXA0KLSAgMHgwMDBFMDAwMFUgLyohPCBmU0FNUExJTkc9ZkRUUy8zMiwgTj02IFwNCi0gICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWMzJfTjggICAgIFwNCi0gIDB4MDAwRjAwMDBVIC8qITwgZlNBTVBMSU5HPWZEVFMvMzIsIE49OCBcDQotICAgICAgICAgICAgICAgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0JSRUFLMl9QT0xBUklUWSBCUkVBSzIgUE9MQVJJVFkNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfVElNX0JSRUFLMl9QT0xBUklUWV9MT1cgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBCcmVhayBpbnB1dCBCUksyIGlzIGFjdGl2ZSBsb3cgKi8NCi0jZGVmaW5lIExMX1RJTV9CUkVBSzJfUE9MQVJJVFlfSElHSCBcDQotICBUSU1fQkRUUl9CSzJQIC8qITwgQnJlYWsgaW5wdXQgQlJLMiBpcyBhY3RpdmUgaGlnaCAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBUSU1fTExfRUNfQlJFQUsyX0ZJTFRFUiBCUkVBSzIgRklMVEVSDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYxIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgTm8gZmlsdGVyLCBCUksgYWN0cyBhc3luY2hyb25vdXNseSAqLw0KLSNkZWZpbmUgTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjFfTjIgICAgIFwNCi0gIDB4MDAxMDAwMDBVIC8qITwgZlNBTVBMSU5HPWZDS19JTlQsIE49MiBcDQotICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYxX040ICAgICBcDQotICAweDAwMjAwMDAwVSAvKiE8IGZTQU1QTElORz1mQ0tfSU5ULCBOPTQgXA0KLSAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMV9OOCAgICAgXA0KLSAgMHgwMDMwMDAwMFUgLyohPCBmU0FNUExJTkc9ZkNLX0lOVCwgTj04IFwNCi0gICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjJfTjYgICAgXA0KLSAgMHgwMDQwMDAwMFUgLyohPCBmU0FNUExJTkc9ZkRUUy8yLCBOPTYgXA0KLSAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMl9OOCAgICBcDQotICAweDAwNTAwMDAwVSAvKiE8IGZTQU1QTElORz1mRFRTLzIsIE49OCBcDQotICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVY0X042ICAgIFwNCi0gIDB4MDA2MDAwMDBVIC8qITwgZlNBTVBMSU5HPWZEVFMvNCwgTj02IFwNCi0gICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjRfTjggICAgXA0KLSAgMHgwMDcwMDAwMFUgLyohPCBmU0FNUExJTkc9ZkRUUy80LCBOPTggXA0KLSAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWOF9ONiAgICBcDQotICAweDAwODAwMDAwVSAvKiE8IGZTQU1QTElORz1mRFRTLzgsIE49NiBcDQotICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVY4X044ICAgIFwNCi0gIDB4MDA5MDAwMDBVIC8qITwgZlNBTVBMSU5HPWZEVFMvOCwgTj04IFwNCi0gICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjE2X041IFwNCi0gIDB4MDBBMDAwMDBVIC8qITwgZlNBTVBMSU5HPWZEVFMvMTYsIE49NSAqLw0KLSNkZWZpbmUgTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjE2X042IFwNCi0gIDB4MDBCMDAwMDBVIC8qITwgZlNBTVBMSU5HPWZEVFMvMTYsIE49NiAqLw0KLSNkZWZpbmUgTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjE2X044IFwNCi0gIDB4MDBDMDAwMDBVIC8qITwgZlNBTVBMSU5HPWZEVFMvMTYsIE49OCAqLw0KLSNkZWZpbmUgTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjMyX041IFwNCi0gIDB4MDBEMDAwMDBVIC8qITwgZlNBTVBMSU5HPWZEVFMvMzIsIE49NSAqLw0KLSNkZWZpbmUgTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjMyX042IFwNCi0gIDB4MDBFMDAwMDBVIC8qITwgZlNBTVBMSU5HPWZEVFMvMzIsIE49NiAqLw0KLSNkZWZpbmUgTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjMyX044IFwNCi0gIDB4MDBGMDAwMDBVIC8qITwgZlNBTVBMSU5HPWZEVFMvMzIsIE49OCAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBUSU1fTExfRUNfT1NTSSBPU1NJDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1RJTV9PU1NJX0RJU0FCTEUgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBXaGVuIGluYWN0aXZlLCBPQ3gvT0N4TiBvdXRwdXRzIGFyZSBkaXNhYmxlZCAqLw0KLSNkZWZpbmUgTExfVElNX09TU0lfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIFRJTV9CRFRSX09TU0kgLyohPCBXaGVuIGluYWN0aXZlLCBPeEMvT0N4TiBvdXRwdXRzIGFyZSBmaXJzdCBmb3JjZWQgd2l0aCAgICBcDQotICAgICAgICAgICAgICAgICAgIHRoZWlyIGluYWN0aXZlIGxldmVsIHRoZW4gZm9yY2VkIHRvIHRoZWlyIGlkbGUgbGV2ZWwgYWZ0ZXIgXA0KLSAgICAgICAgICAgICAgICAgICB0aGUgZGVhZHRpbWUgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX09TU1IgT1NTUg0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9USU1fT1NTUl9ESVNBQkxFIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgV2hlbiBpbmFjdGl2ZSwgT0N4L09DeE4gb3V0cHV0cyBhcmUgZGlzYWJsZWQgKi8NCi0jZGVmaW5lIExMX1RJTV9PU1NSX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIFRJTV9CRFRSX09TU1IgLyohPCBXaGVuIGluYWN0aXZlLCBPQy9PQ04gb3V0cHV0cyBhcmUgZW5hYmxlZCB3aXRoIHRoZWlyIFwNCi0gICAgICAgICAgICAgICAgICAgaW5hY3RpdmUgbGV2ZWwgYXMgc29vbiBhcyBDQ3hFPTEgb3IgQ0N4TkU9MSAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBUSU1fTExfRUNfQlJFQUtfSU5QVVQgQlJFQUsgSU5QVVQNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfVElNX0JSRUFLX0lOUFVUX0JLSU4gMHgwMDAwMDAwMFUgIC8qITwgVElNeF9CS0lOIGlucHV0ICovDQotI2RlZmluZSBMTF9USU1fQlJFQUtfSU5QVVRfQktJTjIgMHgwMDAwMDAwNFUgLyohPCBUSU14X0JLSU4yIGlucHV0ICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19CS0lOX1NPVVJDRSBCS0lOIFNPVVJDRQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9USU1fQktJTl9TT1VSQ0VfQktJTiBcDQotICBUSU0xX0FGMV9CS0lORSAvKiE8IEJLSU4gaW5wdXQgZnJvbSBBRiBjb250cm9sbGVyICovDQotI2RlZmluZSBMTF9USU1fQktJTl9TT1VSQ0VfQktDT01QMSBcDQotICBUSU0xX0FGMV9CS0NNUDFFIC8qITwgaW50ZXJuYWwgc2lnbmFsOiBDT01QMSBvdXRwdXQgKi8NCi0jZGVmaW5lIExMX1RJTV9CS0lOX1NPVVJDRV9CS0NPTVAyIFwNCi0gIFRJTTFfQUYxX0JLQ01QMkUgLyohPCBpbnRlcm5hbCBzaWduYWw6IENPTVAyIG91dHB1dCAqLw0KLSNkZWZpbmUgTExfVElNX0JLSU5fU09VUkNFX0JLQ09NUDMgXA0KLSAgVElNMV9BRjFfQktDTVAzRSAvKiE8IGludGVybmFsIHNpZ25hbDogQ09NUDMgb3V0cHV0ICovDQotI2RlZmluZSBMTF9USU1fQktJTl9TT1VSQ0VfQktDT01QNCBcDQotICBUSU0xX0FGMV9CS0NNUDRFIC8qITwgaW50ZXJuYWwgc2lnbmFsOiBDT01QNCBvdXRwdXQgKi8NCi0jaWYgZGVmaW5lZChDT01QNSkNCi0jZGVmaW5lIExMX1RJTV9CS0lOX1NPVVJDRV9CS0NPTVA1IFwNCi0gIFRJTTFfQUYxX0JLQ01QNUUgLyohPCBpbnRlcm5hbCBzaWduYWw6IENPTVA1IG91dHB1dCAqLw0KLSNlbmRpZiAgICAgICAgICAgICAvKiBDT01QNSAqLw0KLSNpZiBkZWZpbmVkKENPTVA2KQ0KLSNkZWZpbmUgTExfVElNX0JLSU5fU09VUkNFX0JLQ09NUDYgXA0KLSAgVElNMV9BRjFfQktDTVA2RSAvKiE8IGludGVybmFsIHNpZ25hbDogQ09NUDYgb3V0cHV0ICovDQotI2VuZGlmICAgICAgICAgICAgIC8qIENPTVA2ICovDQotI2lmIGRlZmluZWQoQ09NUDcpDQotI2RlZmluZSBMTF9USU1fQktJTl9TT1VSQ0VfQktDT01QNyBcDQotICBUSU0xX0FGMV9CS0NNUDdFIC8qITwgaW50ZXJuYWwgc2lnbmFsOiBDT01QNyBvdXRwdXQgKi8NCi0jZW5kaWYgICAgICAgICAgICAgLyogQ09NUDcgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0JLSU5fUE9MQVJJVFkgQktJTiBQT0xBUklUWQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9USU1fQktJTl9QT0xBUklUWV9MT1cgXA0KLSAgVElNMV9BRjFfQktJTlAgLyohPCBCUksgQktJTiBpbnB1dCBpcyBhY3RpdmUgbG93ICovDQotI2RlZmluZSBMTF9USU1fQktJTl9QT0xBUklUWV9ISUdIIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgQlJLIEJLSU4gaW5wdXQgaXMgYWN0aXZlIGhpZ2ggKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0JSRUFLX0FGTU9ERSBCUkVBSyBBRiBNT0RFDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1RJTV9CUkVBS19BRk1PREVfSU5QVVQgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBCcmVhayBpbnB1dCBCUksgaW4gaW5wdXQgbW9kZSAqLw0KLSNkZWZpbmUgTExfVElNX0JSRUFLX0FGTU9ERV9CSURJUkVDVElPTkFMIFwNCi0gIFRJTV9CRFRSX0JLQklEIC8qITwgQnJlYWsgaW5wdXQgQlJLIGluIGJpZGlyZWN0aW9uYWwgbW9kZSAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBUSU1fTExfRUNfQlJFQUsyX0FGTU9ERSBCUkVBSzIgQUYgTU9ERQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9USU1fQlJFQUsyX0FGTU9ERV9JTlBVVCBcDQotICAweDAwMDAwMDAwVSAvKiE8IEJyZWFrMiBpbnB1dCBCUksyIGluIGlucHV0IG1vZGUgKi8NCi0jZGVmaW5lIExMX1RJTV9CUkVBSzJfQUZNT0RFX0JJRElSRUNUSU9OQUwgXA0KLSAgVElNX0JEVFJfQksyQklEIC8qITwgQnJlYWsyIGlucHV0IEJSSzIgaW4gYmlkaXJlY3Rpb25hbCBtb2RlICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19ETUFCVVJTVF9CQVNFQUREUiBETUEgQnVyc3QgQmFzZSBBZGRyZXNzDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DUjEgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBUSU14X0NSMSByZWdpc3RlciBpcyB0aGUgRE1BIGJhc2UgYWRkcmVzcyBmb3IgRE1BIGJ1cnN0ICovDQotI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQ1IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBUSU1fRENSX0RCQV8wIC8qITwgVElNeF9DUjIgcmVnaXN0ZXIgaXMgdGhlIERNQSBiYXNlIGFkZHJlc3MgZm9yIERNQSBidXJzdCBcDQotICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX1NNQ1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIFRJTV9EQ1JfREJBXzEgLyohPCBUSU14X1NNQ1IgcmVnaXN0ZXIgaXMgdGhlIERNQSBiYXNlIGFkZHJlc3MgZm9yIERNQSBidXJzdCBcDQotICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0RJRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKFRJTV9EQ1JfREJBXzEgfCBUSU1fRENSX0RCQV8wKSAvKiE8IFRJTXhfRElFUiByZWdpc3RlciBpcyB0aGUgRE1BIGJhc2UgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzIGZvciBETUEgYnVyc3QgKi8NCi0jZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9TUiBcDQotICBUSU1fRENSX0RCQV8yIC8qITwgVElNeF9TUiByZWdpc3RlciBpcyB0aGUgRE1BIGJhc2UgYWRkcmVzcyBmb3IgRE1BIGJ1cnN0ICovDQotI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfRUdSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChUSU1fRENSX0RCQV8yIHwgVElNX0RDUl9EQkFfMCkgLyohPCBUSU14X0VHUiByZWdpc3RlciBpcyB0aGUgRE1BIGJhc2UgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzIGZvciBETUEgYnVyc3QgKi8NCi0jZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DQ01SMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoVElNX0RDUl9EQkFfMiB8IFRJTV9EQ1JfREJBXzEpIC8qITwgVElNeF9DQ01SMSByZWdpc3RlciBpcyB0aGUgRE1BIGJhc2UgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzIGZvciBETUEgYnVyc3QgKi8NCi0jZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DQ01SMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoVElNX0RDUl9EQkFfMiB8IFRJTV9EQ1JfREJBXzEgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIFRJTV9EQ1JfREJBXzApIC8qITwgVElNeF9DQ01SMiByZWdpc3RlciBpcyB0aGUgRE1BIGJhc2UgYWRkcmVzcyBmb3IgRE1BIFwNCi0gICAgICAgICAgICAgICAgICAgICBidXJzdCAqLw0KLSNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0NDRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIFRJTV9EQ1JfREJBXzMgLyohPCBUSU14X0NDRVIgcmVnaXN0ZXIgaXMgdGhlIERNQSBiYXNlIGFkZHJlc3MgZm9yIERNQSBidXJzdCBcDQotICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0NOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoVElNX0RDUl9EQkFfMyB8IFRJTV9EQ1JfREJBXzApIC8qITwgVElNeF9DTlQgcmVnaXN0ZXIgaXMgdGhlIERNQSBiYXNlIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyBmb3IgRE1BIGJ1cnN0ICovDQotI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfUFNDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChUSU1fRENSX0RCQV8zIHwgVElNX0RDUl9EQkFfMSkgLyohPCBUSU14X1BTQyByZWdpc3RlciBpcyB0aGUgRE1BIGJhc2UgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzIGZvciBETUEgYnVyc3QgKi8NCi0jZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9BUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKFRJTV9EQ1JfREJBXzMgfCBUSU1fRENSX0RCQV8xIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgVElNX0RDUl9EQkFfMCkgLyohPCBUSU14X0FSUiByZWdpc3RlciBpcyB0aGUgRE1BIGJhc2UgYWRkcmVzcyBmb3IgRE1BIGJ1cnN0IFwNCi0gICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9SQ1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKFRJTV9EQ1JfREJBXzMgfCBUSU1fRENSX0RCQV8yKSAvKiE8IFRJTXhfUkNSIHJlZ2lzdGVyIGlzIHRoZSBETUEgYmFzZSBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgZm9yIERNQSBidXJzdCAqLw0KLSNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0NDUjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKFRJTV9EQ1JfREJBXzMgfCBUSU1fRENSX0RCQV8yIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIFRJTV9EQ1JfREJBXzApIC8qITwgVElNeF9DQ1IxIHJlZ2lzdGVyIGlzIHRoZSBETUEgYmFzZSBhZGRyZXNzIGZvciBETUEgXA0KLSAgICAgICAgICAgICAgICAgICAgIGJ1cnN0ICovDQotI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQ0NSMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoVElNX0RDUl9EQkFfMyB8IFRJTV9EQ1JfREJBXzIgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgVElNX0RDUl9EQkFfMSkgLyohPCBUSU14X0NDUjIgcmVnaXN0ZXIgaXMgdGhlIERNQSBiYXNlIGFkZHJlc3MgZm9yIERNQSBcDQotICAgICAgICAgICAgICAgICAgICAgYnVyc3QgKi8NCi0jZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DQ1IzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChUSU1fRENSX0RCQV8zIHwgVElNX0RDUl9EQkFfMiB8IFRJTV9EQ1JfREJBXzEgfCAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBUSU1fRENSX0RCQV8wKSAvKiE8IFRJTXhfQ0NSMyByZWdpc3RlciBpcyB0aGUgRE1BIGJhc2UgYWRkcmVzcyBmb3IgRE1BIFwNCi0gICAgICAgICAgICAgICAgICAgICBidXJzdCAqLw0KLSNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0NDUjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIFRJTV9EQ1JfREJBXzQgLyohPCBUSU14X0NDUjQgcmVnaXN0ZXIgaXMgdGhlIERNQSBiYXNlIGFkZHJlc3MgZm9yIERNQSBidXJzdCBcDQotICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0JEVFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKFRJTV9EQ1JfREJBXzQgfCBUSU1fRENSX0RCQV8wKSAvKiE8IFRJTXhfQkRUUiByZWdpc3RlciBpcyB0aGUgRE1BIGJhc2UgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzIGZvciBETUEgYnVyc3QgKi8NCi0jZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DQ1I1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChUSU1fRENSX0RCQV80IHwgVElNX0RDUl9EQkFfMSkgLyohPCBUSU14X0NDUjUgcmVnaXN0ZXIgaXMgdGhlIERNQSBiYXNlIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyBmb3IgRE1BIGJ1cnN0ICovDQotI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQ0NSNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoVElNX0RDUl9EQkFfNCB8IFRJTV9EQ1JfREJBXzEgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgVElNX0RDUl9EQkFfMCkgLyohPCBUSU14X0NDUjYgcmVnaXN0ZXIgaXMgdGhlIERNQSBiYXNlIGFkZHJlc3MgZm9yIERNQSBcDQotICAgICAgICAgICAgICAgICAgICAgYnVyc3QgKi8NCi0jZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DQ01SMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoVElNX0RDUl9EQkFfNCB8IFRJTV9EQ1JfREJBXzIpIC8qITwgVElNeF9DQ01SMyByZWdpc3RlciBpcyB0aGUgRE1BIGJhc2UgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzIGZvciBETUEgYnVyc3QgKi8NCi0jZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9EVFIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChUSU1fRENSX0RCQV80IHwgVElNX0RDUl9EQkFfMiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBUSU1fRENSX0RCQV8wKSAvKiE8IFRJTXhfRFRSMiByZWdpc3RlciBpcyB0aGUgRE1BIGJhc2UgYWRkcmVzcyBmb3IgRE1BIFwNCi0gICAgICAgICAgICAgICAgICAgICBidXJzdCAqLw0KLSNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0VDUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoVElNX0RDUl9EQkFfNCB8IFRJTV9EQ1JfREJBXzIgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBUSU1fRENSX0RCQV8xKSAvKiE8IFRJTXhfRUNSIHJlZ2lzdGVyIGlzIHRoZSBETUEgYmFzZSBhZGRyZXNzIGZvciBETUEgYnVyc3QgXA0KLSAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX1RJU0VMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChUSU1fRENSX0RCQV80IHwgVElNX0RDUl9EQkFfMiB8IFRJTV9EQ1JfREJBXzEgfCAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgVElNX0RDUl9EQkFfMCkgLyohPCBUSU14X1RJU0VMIHJlZ2lzdGVyIGlzIHRoZSBETUEgYmFzZSBhZGRyZXNzIGZvciBETUEgXA0KLSAgICAgICAgICAgICAgICAgICAgIGJ1cnN0ICovDQotI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQUYxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIChUSU1fRENSX0RCQV80IHwgVElNX0RDUl9EQkFfMykgLyohPCBUSU14X0FGMSByZWdpc3RlciBpcyB0aGUgRE1BIGJhc2UgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzIGZvciBETUEgYnVyc3QgKi8NCi0jZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9BRjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKFRJTV9EQ1JfREJBXzQgfCBUSU1fRENSX0RCQV8zIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgVElNX0RDUl9EQkFfMCkgLyohPCBUSU14X0FGMiByZWdpc3RlciBpcyB0aGUgRE1BIGJhc2UgYWRkcmVzcyBmb3IgRE1BIGJ1cnN0IFwNCi0gICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9PUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoVElNX0RDUl9EQkFfNCB8IFRJTV9EQ1JfREJBXzMgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIFRJTV9EQ1JfREJBXzEpIC8qITwgVElNeF9PUiByZWdpc3RlciBpcyB0aGUgRE1BIGJhc2UgYWRkcmVzcyBmb3IgRE1BIGJ1cnN0IFwNCi0gICAgICAgICAgICAgICAgICAgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0RNQUJVUlNUX0xFTkdUSCBETUEgQnVyc3QgTGVuZ3RoDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfMVRSQU5TRkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAweDAwMDAwMDAwVSAvKiE8IFRyYW5zZmVyIGlzIGRvbmUgdG8gMSByZWdpc3RlciBzdGFydGluZyBmcm9tIHRoZSBETUEgYnVyc3QgXA0KLSAgICAgICAgICAgICAgICAgYmFzZSBhZGRyZXNzICovDQotI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzJUUkFOU0ZFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgVElNX0RDUl9EQkxfMCAvKiE8IFRyYW5zZmVyIGlzIGRvbmUgdG8gMiByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSB0aGUgRE1BIFwNCi0gICAgICAgICAgICAgICAgICAgYnVyc3QgYmFzZSBhZGRyZXNzICovDQotI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzNUUkFOU0ZFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgVElNX0RDUl9EQkxfMSAvKiE8IFRyYW5zZmVyIGlzIGRvbmUgdG8gMyByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSB0aGUgRE1BIFwNCi0gICAgICAgICAgICAgICAgICAgYnVyc3QgYmFzZSBhZGRyZXNzICovDQotI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzRUUkFOU0ZFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoVElNX0RDUl9EQkxfMSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgVElNX0RDUl9EQkxfMCkgLyohPCBUcmFuc2ZlciBpcyBkb25lIHRvIDQgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gdGhlIERNQSBcDQotICAgICAgICAgICAgICAgICAgICAgYnVyc3QgYmFzZSBhZGRyZXNzICovDQotI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzVUUkFOU0ZFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgVElNX0RDUl9EQkxfMiAvKiE8IFRyYW5zZmVyIGlzIGRvbmUgdG8gNSByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSB0aGUgRE1BIFwNCi0gICAgICAgICAgICAgICAgICAgYnVyc3QgYmFzZSBhZGRyZXNzICovDQotI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzZUUkFOU0ZFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoVElNX0RDUl9EQkxfMiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgVElNX0RDUl9EQkxfMCkgLyohPCBUcmFuc2ZlciBpcyBkb25lIHRvIDYgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gdGhlIERNQSBcDQotICAgICAgICAgICAgICAgICAgICAgYnVyc3QgYmFzZSBhZGRyZXNzICovDQotI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzdUUkFOU0ZFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoVElNX0RDUl9EQkxfMiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgVElNX0RDUl9EQkxfMSkgLyohPCBUcmFuc2ZlciBpcyBkb25lIHRvIDcgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gdGhlIERNQSBcDQotICAgICAgICAgICAgICAgICAgICAgYnVyc3QgYmFzZSBhZGRyZXNzICovDQotI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzhUUkFOU0ZFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoVElNX0RDUl9EQkxfMiB8IFRJTV9EQ1JfREJMXzEgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgVElNX0RDUl9EQkxfMCkgLyohPCBUcmFuc2ZlciBpcyBkb25lIHRvIDEgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gdGhlIERNQSBcDQotICAgICAgICAgICAgICAgICAgICAgYnVyc3QgYmFzZSBhZGRyZXNzICovDQotI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzlUUkFOU0ZFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgVElNX0RDUl9EQkxfMyAvKiE8IFRyYW5zZmVyIGlzIGRvbmUgdG8gOSByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSB0aGUgRE1BIFwNCi0gICAgICAgICAgICAgICAgICAgYnVyc3QgYmFzZSBhZGRyZXNzICovDQotI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzEwVFJBTlNGRVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKFRJTV9EQ1JfREJMXzMgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBUSU1fRENSX0RCTF8wKSAvKiE8IFRyYW5zZmVyIGlzIGRvbmUgdG8gMTAgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gdGhlIERNQSBcDQotICAgICAgICAgICAgICAgICAgICAgYnVyc3QgYmFzZSBhZGRyZXNzICovDQotI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzExVFJBTlNGRVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKFRJTV9EQ1JfREJMXzMgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBUSU1fRENSX0RCTF8xKSAvKiE8IFRyYW5zZmVyIGlzIGRvbmUgdG8gMTEgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gdGhlIERNQSBcDQotICAgICAgICAgICAgICAgICAgICAgYnVyc3QgYmFzZSBhZGRyZXNzICovDQotI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzEyVFJBTlNGRVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKFRJTV9EQ1JfREJMXzMgfCBUSU1fRENSX0RCTF8xIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBUSU1fRENSX0RCTF8wKSAvKiE8IFRyYW5zZmVyIGlzIGRvbmUgdG8gMTIgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gdGhlIERNQSBcDQotICAgICAgICAgICAgICAgICAgICAgYnVyc3QgYmFzZSBhZGRyZXNzICovDQotI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzEzVFJBTlNGRVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKFRJTV9EQ1JfREJMXzMgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBUSU1fRENSX0RCTF8yKSAvKiE8IFRyYW5zZmVyIGlzIGRvbmUgdG8gMTMgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gdGhlIERNQSBcDQotICAgICAgICAgICAgICAgICAgICAgYnVyc3QgYmFzZSBhZGRyZXNzICovDQotI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzE0VFJBTlNGRVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKFRJTV9EQ1JfREJMXzMgfCBUSU1fRENSX0RCTF8yIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBUSU1fRENSX0RCTF8wKSAvKiE8IFRyYW5zZmVyIGlzIGRvbmUgdG8gMTQgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gdGhlIERNQSBcDQotICAgICAgICAgICAgICAgICAgICAgYnVyc3QgYmFzZSBhZGRyZXNzICovDQotI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzE1VFJBTlNGRVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKFRJTV9EQ1JfREJMXzMgfCBUSU1fRENSX0RCTF8yIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBUSU1fRENSX0RCTF8xKSAvKiE8IFRyYW5zZmVyIGlzIGRvbmUgdG8gMTUgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gdGhlIERNQSBcDQotICAgICAgICAgICAgICAgICAgICAgYnVyc3QgYmFzZSBhZGRyZXNzICovDQotI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzE2VFJBTlNGRVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKFRJTV9EQ1JfREJMXzMgfCBUSU1fRENSX0RCTF8yIHwgVElNX0RDUl9EQkxfMSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICBUSU1fRENSX0RCTF8wKSAvKiE8IFRyYW5zZmVyIGlzIGRvbmUgdG8gMTYgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gdGhlIERNQSBcDQotICAgICAgICAgICAgICAgICAgICAgYnVyc3QgYmFzZSBhZGRyZXNzICovDQotI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzE3VFJBTlNGRVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIFRJTV9EQ1JfREJMXzQgLyohPCBUcmFuc2ZlciBpcyBkb25lIHRvIDE3IHJlZ2lzdGVycyBzdGFydGluZyBmcm9tIHRoZSBETUEgXA0KLSAgICAgICAgICAgICAgICAgICBidXJzdCBiYXNlIGFkZHJlc3MgKi8NCi0jZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfMThUUkFOU0ZFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoVElNX0RDUl9EQkxfNCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIFRJTV9EQ1JfREJMXzApIC8qITwgVHJhbnNmZXIgaXMgZG9uZSB0byAxOCByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSB0aGUgRE1BIFwNCi0gICAgICAgICAgICAgICAgICAgICBidXJzdCBiYXNlIGFkZHJlc3MgKi8NCi0jZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfMTlUUkFOU0ZFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoVElNX0RDUl9EQkxfNCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIFRJTV9EQ1JfREJMXzEpIC8qITwgVHJhbnNmZXIgaXMgZG9uZSB0byAxOSByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSB0aGUgRE1BIFwNCi0gICAgICAgICAgICAgICAgICAgICBidXJzdCBiYXNlIGFkZHJlc3MgKi8NCi0jZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfMjBUUkFOU0ZFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoVElNX0RDUl9EQkxfNCB8IFRJTV9EQ1JfREJMXzEgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIFRJTV9EQ1JfREJMXzApIC8qITwgVHJhbnNmZXIgaXMgZG9uZSB0byAyMCByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSB0aGUgRE1BIFwNCi0gICAgICAgICAgICAgICAgICAgICBidXJzdCBiYXNlIGFkZHJlc3MgKi8NCi0jZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfMjFUUkFOU0ZFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoVElNX0RDUl9EQkxfNCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIFRJTV9EQ1JfREJMXzIpIC8qITwgVHJhbnNmZXIgaXMgZG9uZSB0byAyMSByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSB0aGUgRE1BIFwNCi0gICAgICAgICAgICAgICAgICAgICBidXJzdCBiYXNlIGFkZHJlc3MgKi8NCi0jZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfMjJUUkFOU0ZFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoVElNX0RDUl9EQkxfNCB8IFRJTV9EQ1JfREJMXzIgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIFRJTV9EQ1JfREJMXzApIC8qITwgVHJhbnNmZXIgaXMgZG9uZSB0byAyMiByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSB0aGUgRE1BIFwNCi0gICAgICAgICAgICAgICAgICAgICBidXJzdCBiYXNlIGFkZHJlc3MgKi8NCi0jZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfMjNUUkFOU0ZFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoVElNX0RDUl9EQkxfNCB8IFRJTV9EQ1JfREJMXzIgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIFRJTV9EQ1JfREJMXzEpIC8qITwgVHJhbnNmZXIgaXMgZG9uZSB0byAyMyByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSB0aGUgRE1BIFwNCi0gICAgICAgICAgICAgICAgICAgICBidXJzdCBiYXNlIGFkZHJlc3MgKi8NCi0jZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfMjRUUkFOU0ZFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoVElNX0RDUl9EQkxfNCB8IFRJTV9EQ1JfREJMXzIgfCBUSU1fRENSX0RCTF8xIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIFRJTV9EQ1JfREJMXzApIC8qITwgVHJhbnNmZXIgaXMgZG9uZSB0byAyNCByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSB0aGUgRE1BIFwNCi0gICAgICAgICAgICAgICAgICAgICBidXJzdCBiYXNlIGFkZHJlc3MgKi8NCi0jZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfMjVUUkFOU0ZFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoVElNX0RDUl9EQkxfNCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIFRJTV9EQ1JfREJMXzMpIC8qITwgVHJhbnNmZXIgaXMgZG9uZSB0byAyNSByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSB0aGUgRE1BIFwNCi0gICAgICAgICAgICAgICAgICAgICBidXJzdCBiYXNlIGFkZHJlc3MgKi8NCi0jZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfMjZUUkFOU0ZFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoVElNX0RDUl9EQkxfNCB8IFRJTV9EQ1JfREJMXzMgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIFRJTV9EQ1JfREJMXzApIC8qITwgVHJhbnNmZXIgaXMgZG9uZSB0byAyNiByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSB0aGUgRE1BIFwNCi0gICAgICAgICAgICAgICAgICAgICBidXJzdCBiYXNlIGFkZHJlc3MgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX1RJTTFfVEkxX1JNUCAgVElNMSBUaW1lciBJbnB1dCBDaDEgUmVtYXANCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfVElNX1RJTTFfVEkxX1JNUF9HUElPIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgVElNMSBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBHUElPICovDQotI2RlZmluZSBMTF9USU1fVElNMV9USTFfUk1QX0NPTVAxIFwNCi0gIFRJTV9USVNFTF9USTFTRUxfMCAvKiE8IFRJTTEgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDFfT1VUICovDQotI2RlZmluZSBMTF9USU1fVElNMV9USTFfUk1QX0NPTVAyIFwNCi0gIFRJTV9USVNFTF9USTFTRUxfMSAvKiE8IFRJTTEgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDJfT1VUICovDQotI2RlZmluZSBMTF9USU1fVElNMV9USTFfUk1QX0NPTVAzIFwNCi0gIChUSU1fVElTRUxfVEkxU0VMXzEgfCAgICAgICAgICAgXA0KLSAgIFRJTV9USVNFTF9USTFTRUxfMCkgLyohPCBUSU0xIGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVAzX09VVCAqLw0KLSNkZWZpbmUgTExfVElNX1RJTTFfVEkxX1JNUF9DT01QNCBcDQotICBUSU1fVElTRUxfVEkxU0VMXzIgLyohPCBUSU0xIGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVA0X09VVCAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBUSU1fTExfRUNfVElNMl9USTFfUk1QICBUSU0yIFRpbWVyIElucHV0IENoMSBSZW1hcA0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9USU1fVElNMl9USTFfUk1QX0dQSU8gXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBUSU0yIGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIEdQSU8gKi8NCi0jZGVmaW5lIExMX1RJTV9USU0yX1RJMV9STVBfQ09NUDEgXA0KLSAgVElNX1RJU0VMX1RJMVNFTF8wIC8qITwgVElNMiBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QMV9PVVQgKi8NCi0jZGVmaW5lIExMX1RJTV9USU0yX1RJMV9STVBfQ09NUDIgXA0KLSAgVElNX1RJU0VMX1RJMVNFTF8xIC8qITwgVElNMiBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QMl9PVVQgKi8NCi0jZGVmaW5lIExMX1RJTV9USU0yX1RJMV9STVBfQ09NUDMgXA0KLSAgKFRJTV9USVNFTF9USTFTRUxfMSB8ICAgICAgICAgICBcDQotICAgVElNX1RJU0VMX1RJMVNFTF8wKSAvKiE8IFRJTTIgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDNfT1VUICovDQotI2RlZmluZSBMTF9USU1fVElNMl9USTFfUk1QX0NPTVA0IFwNCi0gIFRJTV9USVNFTF9USTFTRUxfMiAvKiE8IFRJTTIgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDRfT1VUICovDQotI2lmIGRlZmluZWQoQ09NUDUpDQotI2RlZmluZSBMTF9USU1fVElNMl9USTFfUk1QX0NPTVA1IFwNCi0gIChUSU1fVElTRUxfVEkxU0VMXzIgfCAgICAgICAgICAgXA0KLSAgIFRJTV9USVNFTF9USTFTRUxfMCkgLyohPCBUSU0yIGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVA1X09VVCAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgICAgLyogQ09NUDUgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX1RJTTJfVEkyX1JNUCAgVElNMiBUaW1lciBJbnB1dCBDaDIgUmVtYXANCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfVElNX1RJTTJfVEkyX1JNUF9HUElPIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgVElNMiBpbnB1dCAyIGlzIGNvbm5lY3RlZCB0byBHUElPICovDQotI2RlZmluZSBMTF9USU1fVElNMl9USTJfUk1QX0NPTVAxIFwNCi0gIFRJTV9USVNFTF9USTJTRUxfMCAvKiE8IFRJTTIgaW5wdXQgMiBpcyBjb25uZWN0ZWQgdG8gQ09NUDFfT1VUICovDQotI2RlZmluZSBMTF9USU1fVElNMl9USTJfUk1QX0NPTVAyIFwNCi0gIFRJTV9USVNFTF9USTJTRUxfMSAvKiE8IFRJTTIgaW5wdXQgMiBpcyBjb25uZWN0ZWQgdG8gQ09NUDJfT1VUICovDQotI2RlZmluZSBMTF9USU1fVElNMl9USTJfUk1QX0NPTVAzIFwNCi0gIChUSU1fVElTRUxfVEkyU0VMXzEgfCAgICAgICAgICAgXA0KLSAgIFRJTV9USVNFTF9USTJTRUxfMCkgLyohPCBUSU0yIGlucHV0IDIgaXMgY29ubmVjdGVkIHRvIENPTVAzX09VVCAqLw0KLSNkZWZpbmUgTExfVElNX1RJTTJfVEkyX1JNUF9DT01QNCBcDQotICBUSU1fVElTRUxfVEkyU0VMXzIgLyohPCBUSU0yIGlucHV0IDIgaXMgY29ubmVjdGVkIHRvIENPTVA0X09VVCAqLw0KLSNpZiBkZWZpbmVkKENPTVA2KQ0KLSNkZWZpbmUgTExfVElNX1RJTTJfVEkyX1JNUF9DT01QNiBcDQotICAoVElNX1RJU0VMX1RJMlNFTF8yIHwgICAgICAgICAgIFwNCi0gICBUSU1fVElTRUxfVEkyU0VMXzApIC8qITwgVElNMiBpbnB1dCAyIGlzIGNvbm5lY3RlZCB0byBDT01QNl9PVVQgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgIC8qIENPTVA2ICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19USU0yX1RJM19STVAgIFRJTTIgVGltZXIgSW5wdXQgQ2gzIFJlbWFwDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1RJTV9USU0yX1RJM19STVBfR1BJTyBcDQotICAweDAwMDAwMDAwVSAvKiE8IFRJTTIgaW5wdXQgMyBpcyBjb25uZWN0ZWQgdG8gR1BJTyAqLw0KLSNkZWZpbmUgTExfVElNX1RJTTJfVEkzX1JNUF9DT01QNCBcDQotICBUSU1fVElTRUxfVEkzU0VMXzAgLyohPCBUSU0yIGlucHV0IDMgaXMgY29ubmVjdGVkIHRvIENPTVA0X09VVCAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBUSU1fTExfRUNfVElNMl9USTRfUk1QICBUSU0yIFRpbWVyIElucHV0IENoNCBSZW1hcA0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9USU1fVElNMl9USTRfUk1QX0dQSU8gXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBUSU0yIGlucHV0IDQgaXMgY29ubmVjdGVkIHRvIEdQSU8gKi8NCi0jZGVmaW5lIExMX1RJTV9USU0yX1RJNF9STVBfQ09NUDEgXA0KLSAgVElNX1RJU0VMX1RJNFNFTF8wIC8qITwgVElNMiBpbnB1dCA0IGlzIGNvbm5lY3RlZCB0byBDT01QMV9PVVQgKi8NCi0jZGVmaW5lIExMX1RJTV9USU0yX1RJNF9STVBfQ09NUDIgXA0KLSAgVElNX1RJU0VMX1RJNFNFTF8xIC8qITwgVElNMiBpbnB1dCA0IGlzIGNvbm5lY3RlZCB0byBDT01QMl9PVVQgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX1RJTTNfVEkxX1JNUCAgVElNMyBUaW1lciBJbnB1dCBDaDEgUmVtYXANCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfVElNX1RJTTNfVEkxX1JNUF9HUElPIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgVElNMyBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBHUElPICovDQotI2RlZmluZSBMTF9USU1fVElNM19USTFfUk1QX0NPTVAxIFwNCi0gIFRJTV9USVNFTF9USTFTRUxfMCAvKiE8IFRJTTMgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDFfT1VUICovDQotI2RlZmluZSBMTF9USU1fVElNM19USTFfUk1QX0NPTVAyIFwNCi0gIFRJTV9USVNFTF9USTFTRUxfMSAvKiE8IFRJTTMgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDJfT1VUICovDQotI2RlZmluZSBMTF9USU1fVElNM19USTFfUk1QX0NPTVAzIFwNCi0gIChUSU1fVElTRUxfVEkxU0VMXzEgfCAgICAgICAgICAgXA0KLSAgIFRJTV9USVNFTF9USTFTRUxfMCkgLyohPCBUSU0zIGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVAzX09VVCAqLw0KLSNkZWZpbmUgTExfVElNX1RJTTNfVEkxX1JNUF9DT01QNCBcDQotICBUSU1fVElTRUxfVEkxU0VMXzIgLyohPCBUSU0zIGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVA0X09VVCAqLw0KLSNpZiBkZWZpbmVkKENPTVA1KQ0KLSNkZWZpbmUgTExfVElNX1RJTTNfVEkxX1JNUF9DT01QNSBcDQotICAoVElNX1RJU0VMX1RJMVNFTF8yIHwgICAgICAgICAgIFwNCi0gICBUSU1fVElTRUxfVEkxU0VMXzApIC8qITwgVElNMyBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QNV9PVVQgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgIC8qIENPTVA1ICovDQotI2lmIGRlZmluZWQoQ09NUDYpDQotI2RlZmluZSBMTF9USU1fVElNM19USTFfUk1QX0NPTVA2IFwNCi0gIChUSU1fVElTRUxfVEkxU0VMXzIgfCAgICAgICAgICAgXA0KLSAgIFRJTV9USVNFTF9USTFTRUxfMSkgLyohPCBUSU0zIGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVA2X09VVCAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgICAgLyogQ09NUDYgKi8NCi0jaWYgZGVmaW5lZChDT01QNykNCi0jZGVmaW5lIExMX1RJTV9USU0zX1RJMV9STVBfQ09NUDcgICAgICAgICAgICBcDQotICAoVElNX1RJU0VMX1RJMVNFTF8yIHwgVElNX1RJU0VMX1RJMVNFTF8xIHwgXA0KLSAgIFRJTV9USVNFTF9USTFTRUxfMCkgLyohPCBUSU0zIGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVA3X09VVCAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgICAgLyogQ09NUDcgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX1RJTTNfVEkyX1JNUCAgVElNMyBUaW1lciBJbnB1dCBDaDIgUmVtYXANCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfVElNX1RJTTNfVEkyX1JNUF9HUElPIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgVElNMyBpbnB1dCAyIGlzIGNvbm5lY3RlZCB0byBHUElPICovDQotI2RlZmluZSBMTF9USU1fVElNM19USTJfUk1QX0NPTVAxIFwNCi0gIFRJTV9USVNFTF9USTJTRUxfMCAvKiE8IFRJTTMgaW5wdXQgMiBpcyBjb25uZWN0ZWQgdG8gQ09NUDFfT1VUICovDQotI2RlZmluZSBMTF9USU1fVElNM19USTJfUk1QX0NPTVAyIFwNCi0gIFRJTV9USVNFTF9USTJTRUxfMSAvKiE8IFRJTTMgaW5wdXQgMiBpcyBjb25uZWN0ZWQgdG8gQ09NUDJfT1VUICovDQotI2RlZmluZSBMTF9USU1fVElNM19USTJfUk1QX0NPTVAzIFwNCi0gIChUSU1fVElTRUxfVEkyU0VMXzEgfCAgICAgICAgICAgXA0KLSAgIFRJTV9USVNFTF9USTJTRUxfMCkgLyohPCBUSU0zIGlucHV0IDIgaXMgY29ubmVjdGVkIHRvIENPTVAzX09VVCAqLw0KLSNkZWZpbmUgTExfVElNX1RJTTNfVEkyX1JNUF9DT01QNCBcDQotICBUSU1fVElTRUxfVEkyU0VMXzIgLyohPCBUSU0zIGlucHV0IDIgaXMgY29ubmVjdGVkIHRvIENPTVA0X09VVCAqLw0KLSNpZiBkZWZpbmVkKENPTVA1KQ0KLSNkZWZpbmUgTExfVElNX1RJTTNfVEkyX1JNUF9DT01QNSBcDQotICAoVElNX1RJU0VMX1RJMlNFTF8yIHwgICAgICAgICAgIFwNCi0gICBUSU1fVElTRUxfVEkyU0VMXzApIC8qITwgVElNMyBpbnB1dCAyIGlzIGNvbm5lY3RlZCB0byBDT01QNV9PVVQgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgIC8qIENPTVA1ICovDQotI2lmIGRlZmluZWQoQ09NUDYpDQotI2RlZmluZSBMTF9USU1fVElNM19USTJfUk1QX0NPTVA2IFwNCi0gIChUSU1fVElTRUxfVEkyU0VMXzIgfCAgICAgICAgICAgXA0KLSAgIFRJTV9USVNFTF9USTJTRUxfMSkgLyohPCBUSU0zIGlucHV0IDIgaXMgY29ubmVjdGVkIHRvIENPTVA2X09VVCAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgICAgLyogQ09NUDYgKi8NCi0jaWYgZGVmaW5lZChDT01QNykNCi0jZGVmaW5lIExMX1RJTV9USU0zX1RJMl9STVBfQ09NUDcgICAgICAgICAgICBcDQotICAoVElNX1RJU0VMX1RJMlNFTF8yIHwgVElNX1RJU0VMX1RJMlNFTF8xIHwgXA0KLSAgIFRJTV9USVNFTF9USTJTRUxfMCkgLyohPCBUSU0zIGlucHV0IDIgaXMgY29ubmVjdGVkIHRvIENPTVA3X09VVCAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgICAgLyogQ09NUDcgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX1RJTTNfVEkzX1JNUCAgVElNMyBUaW1lciBJbnB1dCBDaDMgUmVtYXANCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfVElNX1RJTTNfVEkzX1JNUF9HUElPIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgVElNMyBpbnB1dCAzIGlzIGNvbm5lY3RlZCB0byBHUElPICovDQotI2RlZmluZSBMTF9USU1fVElNM19USTNfUk1QX0NPTVAzIFwNCi0gIFRJTV9USVNFTF9USTNTRUxfMCAvKiE8IFRJTTMgaW5wdXQgMyBpcyBjb25uZWN0ZWQgdG8gQ09NUDNfT1VUICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19USU00X1RJMV9STVAgIFRJTTQgVGltZXIgSW5wdXQgQ2gxIFJlbWFwDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1RJTV9USU00X1RJMV9STVBfR1BJTyBcDQotICAweDAwMDAwMDAwVSAvKiE8IFRJTTQgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gR1BJTyAqLw0KLSNkZWZpbmUgTExfVElNX1RJTTRfVEkxX1JNUF9DT01QMSBcDQotICBUSU1fVElTRUxfVEkxU0VMXzAgLyohPCBUSU00IGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVAxX09VVCAqLw0KLSNkZWZpbmUgTExfVElNX1RJTTRfVEkxX1JNUF9DT01QMiBcDQotICBUSU1fVElTRUxfVEkxU0VMXzEgLyohPCBUSU00IGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVAyX09VVCAqLw0KLSNkZWZpbmUgTExfVElNX1RJTTRfVEkxX1JNUF9DT01QMyBcDQotICAoVElNX1RJU0VMX1RJMVNFTF8xIHwgICAgICAgICAgIFwNCi0gICBUSU1fVElTRUxfVEkxU0VMXzApIC8qITwgVElNNCBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QM19PVVQgKi8NCi0jZGVmaW5lIExMX1RJTV9USU00X1RJMV9STVBfQ09NUDQgXA0KLSAgVElNX1RJU0VMX1RJMVNFTF8yIC8qITwgVElNNCBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QNF9PVVQgKi8NCi0jaWYgZGVmaW5lZChDT01QNSkNCi0jZGVmaW5lIExMX1RJTV9USU00X1RJMV9STVBfQ09NUDUgXA0KLSAgKFRJTV9USVNFTF9USTFTRUxfMiB8ICAgICAgICAgICBcDQotICAgVElNX1RJU0VMX1RJMVNFTF8wKSAvKiE8IFRJTTQgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDVfT1VUICovDQotI2VuZGlmICAgICAgICAgICAgICAgICAvKiBDT01QNSAqLw0KLSNpZiBkZWZpbmVkKENPTVA2KQ0KLSNkZWZpbmUgTExfVElNX1RJTTRfVEkxX1JNUF9DT01QNiBcDQotICAoVElNX1RJU0VMX1RJMVNFTF8yIHwgICAgICAgICAgIFwNCi0gICBUSU1fVElTRUxfVEkxU0VMXzEpIC8qITwgVElNNCBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QNl9PVVQgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgIC8qIENPTVA2ICovDQotI2lmIGRlZmluZWQoQ09NUDcpDQotI2RlZmluZSBMTF9USU1fVElNNF9USTFfUk1QX0NPTVA3ICAgICAgICAgICAgXA0KLSAgKFRJTV9USVNFTF9USTFTRUxfMiB8IFRJTV9USVNFTF9USTFTRUxfMSB8IFwNCi0gICBUSU1fVElTRUxfVEkxU0VMXzApIC8qITwgVElNNCBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QN19PVVQgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgIC8qIENPTVA3ICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19USU00X1RJMl9STVAgIFRJTTQgVGltZXIgSW5wdXQgQ2gyIFJlbWFwDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1RJTV9USU00X1RJMl9STVBfR1BJTyBcDQotICAweDAwMDAwMDAwVSAvKiE8IFRJTTQgaW5wdXQgMiBpcyBjb25uZWN0ZWQgdG8gR1BJTyAqLw0KLSNkZWZpbmUgTExfVElNX1RJTTRfVEkyX1JNUF9DT01QMSBcDQotICBUSU1fVElTRUxfVEkyU0VMXzAgLyohPCBUSU00IGlucHV0IDIgaXMgY29ubmVjdGVkIHRvIENPTVAxX09VVCAqLw0KLSNkZWZpbmUgTExfVElNX1RJTTRfVEkyX1JNUF9DT01QMiBcDQotICBUSU1fVElTRUxfVEkyU0VMXzEgLyohPCBUSU00IGlucHV0IDIgaXMgY29ubmVjdGVkIHRvIENPTVAyX09VVCAqLw0KLSNkZWZpbmUgTExfVElNX1RJTTRfVEkyX1JNUF9DT01QMyBcDQotICAoVElNX1RJU0VMX1RJMlNFTF8xIHwgICAgICAgICAgIFwNCi0gICBUSU1fVElTRUxfVEkyU0VMXzApIC8qITwgVElNNCBpbnB1dCAyIGlzIGNvbm5lY3RlZCB0byBDT01QM19PVVQgKi8NCi0jZGVmaW5lIExMX1RJTV9USU00X1RJMl9STVBfQ09NUDQgXA0KLSAgVElNX1RJU0VMX1RJMlNFTF8yIC8qITwgVElNNCBpbnB1dCAyIGlzIGNvbm5lY3RlZCB0byBDT01QNF9PVVQgKi8NCi0jaWYgZGVmaW5lZChDT01QNSkNCi0jZGVmaW5lIExMX1RJTV9USU00X1RJMl9STVBfQ09NUDUgXA0KLSAgKFRJTV9USVNFTF9USTJTRUxfMiB8ICAgICAgICAgICBcDQotICAgVElNX1RJU0VMX1RJMlNFTF8wKSAvKiE8IFRJTTQgaW5wdXQgMiBpcyBjb25uZWN0ZWQgdG8gQ09NUDVfT1VUICovDQotI2VuZGlmICAgICAgICAgICAgICAgICAvKiBDT01QNSAqLw0KLSNpZiBkZWZpbmVkKENPTVA2KQ0KLSNkZWZpbmUgTExfVElNX1RJTTRfVEkyX1JNUF9DT01QNiBcDQotICAoVElNX1RJU0VMX1RJMlNFTF8yIHwgICAgICAgICAgIFwNCi0gICBUSU1fVElTRUxfVEkyU0VMXzEpIC8qITwgVElNNCBpbnB1dCAyIGlzIGNvbm5lY3RlZCB0byBDT01QNl9PVVQgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgIC8qIENPTVA2ICovDQotI2lmIGRlZmluZWQoQ09NUDcpDQotI2RlZmluZSBMTF9USU1fVElNNF9USTJfUk1QX0NPTVA3ICAgICAgICAgICAgXA0KLSAgKFRJTV9USVNFTF9USTJTRUxfMiB8IFRJTV9USVNFTF9USTJTRUxfMSB8IFwNCi0gICBUSU1fVElTRUxfVEkyU0VMXzApIC8qITwgVElNNCBpbnB1dCAyIGlzIGNvbm5lY3RlZCB0byBDT01QN19PVVQgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgIC8qIENPTVA3ICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19USU00X1RJM19STVAgIFRJTTQgVGltZXIgSW5wdXQgQ2gzIFJlbWFwDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1RJTV9USU00X1RJM19STVBfR1BJTyBcDQotICAweDAwMDAwMDAwVSAvKiE8IFRJTTQgaW5wdXQgMyBpcyBjb25uZWN0ZWQgdG8gR1BJTyAqLw0KLSNpZiBkZWZpbmVkKENPTVA1KQ0KLSNkZWZpbmUgTExfVElNX1RJTTRfVEkzX1JNUF9DT01QNSBcDQotICBUSU1fVElTRUxfVEkzU0VMXzAgLyohPCBUSU00IGlucHV0IDMgaXMgY29ubmVjdGVkIHRvIENPTVA1X09VVCAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgIC8qIENPTVA1ICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19USU00X1RJNF9STVAgIFRJTTQgVGltZXIgSW5wdXQgQ2g0IFJlbWFwDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1RJTV9USU00X1RJNF9STVBfR1BJTyBcDQotICAweDAwMDAwMDAwVSAvKiE8IFRJTTQgaW5wdXQgNCBpcyBjb25uZWN0ZWQgdG8gR1BJTyAqLw0KLSNpZiBkZWZpbmVkKENPTVA2KQ0KLSNkZWZpbmUgTExfVElNX1RJTTRfVEk0X1JNUF9DT01QNiBcDQotICBUSU1fVElTRUxfVEk0U0VMXzAgLyohPCBUSU00IGlucHV0IDQgaXMgY29ubmVjdGVkIHRvIENPTVA2X09VVCAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgIC8qIENPTVA2ICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0jaWYgZGVmaW5lZChUSU01KQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX1RJTTVfVEkxX1JNUCAgVElNNSBUaW1lciBJbnB1dCBDaDEgUmVtYXANCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfVElNX1RJTTVfVEkxX1JNUF9HUElPIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgVElNNSBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBHUElPICovDQotI2RlZmluZSBMTF9USU1fVElNNV9USTFfUk1QX0xTSSBcDQotICBUSU1fVElTRUxfVEkxU0VMXzAgLyohPCBUSU01IGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIExTSSAqLw0KLSNkZWZpbmUgTExfVElNX1RJTTVfVEkxX1JNUF9MU0UgXA0KLSAgVElNX1RJU0VMX1RJMVNFTF8xIC8qITwgVElNNSBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBMU0UgKi8NCi0jZGVmaW5lIExMX1RJTV9USU01X1RJMV9STVBfUlRDX1dLIFwNCi0gIChUSU1fVElTRUxfVEkxU0VMXzEgfCAgICAgICAgICAgIFwNCi0gICBUSU1fVElTRUxfVEkxU0VMXzApIC8qITwgVElNNSBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBSVENfV0FLRVVQICovDQotI2RlZmluZSBMTF9USU1fVElNNV9USTFfUk1QX0NPTVAxIFwNCi0gIFRJTV9USVNFTF9USTFTRUxfMiAvKiE8IFRJTTUgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDFfT1VUICovDQotI2RlZmluZSBMTF9USU1fVElNNV9USTFfUk1QX0NPTVAyIFwNCi0gIChUSU1fVElTRUxfVEkxU0VMXzIgfCAgICAgICAgICAgXA0KLSAgIFRJTV9USVNFTF9USTFTRUxfMCkgLyohPCBUSU01IGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVAyX09VVCAqLw0KLSNkZWZpbmUgTExfVElNX1RJTTVfVEkxX1JNUF9DT01QMyBcDQotICAoVElNX1RJU0VMX1RJMVNFTF8yIHwgICAgICAgICAgIFwNCi0gICBUSU1fVElTRUxfVEkxU0VMXzEpIC8qITwgVElNNSBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QM19PVVQgKi8NCi0jZGVmaW5lIExMX1RJTV9USU01X1RJMV9STVBfQ09NUDQgICAgICAgICAgICBcDQotICAoVElNX1RJU0VMX1RJMVNFTF8yIHwgVElNX1RJU0VMX1RJMVNFTF8xIHwgXA0KLSAgIFRJTV9USVNFTF9USTFTRUxfMCkgLyohPCBUSU01IGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVA0X09VVCAqLw0KLSNpZiBkZWZpbmVkKENPTVA1KQ0KLSNkZWZpbmUgTExfVElNX1RJTTVfVEkxX1JNUF9DT01QNSBcDQotICBUSU1fVElTRUxfVEkxU0VMXzMgLyohPCBUSU01IGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVA1X09VVCAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgIC8qIENPTVA1ICovDQotI2lmIGRlZmluZWQoQ09NUDYpDQotI2RlZmluZSBMTF9USU1fVElNNV9USTFfUk1QX0NPTVA2IFwNCi0gIChUSU1fVElTRUxfVEkxU0VMXzMgfCAgICAgICAgICAgXA0KLSAgIFRJTV9USVNFTF9USTFTRUxfMCkgLyohPCBUSU01IGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVA2X09VVCAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgICAgLyogQ09NUDYgKi8NCi0jaWYgZGVmaW5lZChDT01QNykNCi0jZGVmaW5lIExMX1RJTV9USU01X1RJMV9STVBfQ09NUDcgXA0KLSAgKFRJTV9USVNFTF9USTFTRUxfMyB8ICAgICAgICAgICBcDQotICAgVElNX1RJU0VMX1RJMVNFTF8xKSAvKiE8IFRJTTUgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDdfT1VUICovDQotI2VuZGlmICAgICAgICAgICAgICAgICAvKiBDT01QNyAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBUSU1fTExfRUNfVElNNV9USTJfUk1QICBUSU01IFRpbWVyIElucHV0IENoMiBSZW1hcA0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9USU1fVElNNV9USTJfUk1QX0dQSU8gXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBUSU01IGlucHV0IDIgaXMgY29ubmVjdGVkIHRvIEdQSU8gKi8NCi0jZGVmaW5lIExMX1RJTV9USU01X1RJMl9STVBfQ09NUDEgXA0KLSAgVElNX1RJU0VMX1RJMlNFTF8wIC8qITwgVElNNSBpbnB1dCAyIGlzIGNvbm5lY3RlZCB0byBDT01QMV9PVVQgKi8NCi0jZGVmaW5lIExMX1RJTV9USU01X1RJMl9STVBfQ09NUDIgXA0KLSAgVElNX1RJU0VMX1RJMlNFTF8xIC8qITwgVElNNSBpbnB1dCAyIGlzIGNvbm5lY3RlZCB0byBDT01QMl9PVVQgKi8NCi0jZGVmaW5lIExMX1RJTV9USU01X1RJMl9STVBfQ09NUDMgXA0KLSAgKFRJTV9USVNFTF9USTJTRUxfMSB8ICAgICAgICAgICBcDQotICAgVElNX1RJU0VMX1RJMlNFTF8wKSAvKiE8IFRJTTUgaW5wdXQgMiBpcyBjb25uZWN0ZWQgdG8gQ09NUDNfT1VUICovDQotI2RlZmluZSBMTF9USU1fVElNNV9USTJfUk1QX0NPTVA0IFwNCi0gIFRJTV9USVNFTF9USTJTRUxfMiAvKiE8IFRJTTUgaW5wdXQgMiBpcyBjb25uZWN0ZWQgdG8gQ09NUDRfT1VUICovDQotI2lmIGRlZmluZWQoQ09NUDUpDQotI2RlZmluZSBMTF9USU1fVElNNV9USTJfUk1QX0NPTVA1IFwNCi0gIChUSU1fVElTRUxfVEkyU0VMXzIgfCAgICAgICAgICAgXA0KLSAgIFRJTV9USVNFTF9USTJTRUxfMCkgLyohPCBUSU01IGlucHV0IDIgaXMgY29ubmVjdGVkIHRvIENPTVA1X09VVCAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgICAgLyogQ09NUDUgKi8NCi0jaWYgZGVmaW5lZChDT01QNikNCi0jZGVmaW5lIExMX1RJTV9USU01X1RJMl9STVBfQ09NUDYgXA0KLSAgKFRJTV9USVNFTF9USTJTRUxfMiB8ICAgICAgICAgICBcDQotICAgVElNX1RJU0VMX1RJMlNFTF8xKSAvKiE8IFRJTTUgaW5wdXQgMiBpcyBjb25uZWN0ZWQgdG8gQ09NUDZfT1VUICovDQotI2VuZGlmICAgICAgICAgICAgICAgICAvKiBDT01QNiAqLw0KLSNpZiBkZWZpbmVkKENPTVA3KQ0KLSNkZWZpbmUgTExfVElNX1RJTTVfVEkyX1JNUF9DT01QNyAgICAgICAgICAgIFwNCi0gIChUSU1fVElTRUxfVEkyU0VMXzIgfCBUSU1fVElTRUxfVEkyU0VMXzEgfCBcDQotICAgVElNX1RJU0VMX1RJMlNFTF8wKSAvKiE8IFRJTTUgaW5wdXQgMiBpcyBjb25uZWN0ZWQgdG8gQ09NUDdfT1VUICovDQotI2VuZGlmICAgICAgICAgICAgICAgICAvKiBDT01QNyAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotI2VuZGlmIC8qIFRJTTUgKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19USU04X1RJMV9STVAgIFRJTTggVGltZXIgSW5wdXQgQ2gxIFJlbWFwDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1RJTV9USU04X1RJMV9STVBfR1BJTyBcDQotICAweDAwMDAwMDAwVSAvKiE8IFRJTTggaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gR1BJTyAqLw0KLSNkZWZpbmUgTExfVElNX1RJTThfVEkxX1JNUF9DT01QMSBcDQotICBUSU1fVElTRUxfVEkxU0VMXzAgLyohPCBUSU04IGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVAxX09VVCAqLw0KLSNkZWZpbmUgTExfVElNX1RJTThfVEkxX1JNUF9DT01QMiBcDQotICBUSU1fVElTRUxfVEkxU0VMXzEgLyohPCBUSU04IGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVAyX09VVCAqLw0KLSNkZWZpbmUgTExfVElNX1RJTThfVEkxX1JNUF9DT01QMyBcDQotICAoVElNX1RJU0VMX1RJMVNFTF8xIHwgICAgICAgICAgIFwNCi0gICBUSU1fVElTRUxfVEkxU0VMXzApIC8qITwgVElNOCBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QM19PVVQgKi8NCi0jZGVmaW5lIExMX1RJTV9USU04X1RJMV9STVBfQ09NUDQgXA0KLSAgVElNX1RJU0VMX1RJMVNFTF8yIC8qITwgVElNOCBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QNF9PVVQgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX1RJTTE1X1RJMV9STVAgIFRJTTE1IFRpbWVyIElucHV0IENoMSBSZW1hcA0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9USU1fVElNMTVfVEkxX1JNUF9HUElPIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgVElNMTUgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gR1BJTyAqLw0KLSNkZWZpbmUgTExfVElNX1RJTTE1X1RJMV9STVBfTFNFIFwNCi0gIFRJTV9USVNFTF9USTFTRUxfMCAvKiE8IFRJTTE1IGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIExTRSAqLw0KLSNkZWZpbmUgTExfVElNX1RJTTE1X1RJMV9STVBfQ09NUDEgXA0KLSAgVElNX1RJU0VMX1RJMVNFTF8xIC8qITwgVElNMTUgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDFfT1VUICovDQotI2RlZmluZSBMTF9USU1fVElNMTVfVEkxX1JNUF9DT01QMiBcDQotICAoVElNX1RJU0VMX1RJMVNFTF8xIHwgICAgICAgICAgICBcDQotICAgVElNX1RJU0VMX1RJMVNFTF8wKSAvKiE8IFRJTTE1IGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVAyX09VVCAqLw0KLSNpZiBkZWZpbmVkKENPTVA1KQ0KLSNkZWZpbmUgTExfVElNX1RJTTE1X1RJMV9STVBfQ09NUDUgXA0KLSAgVElNX1RJU0VMX1RJMVNFTF8yIC8qITwgVElNMTUgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDVfT1VUICovDQotI2VuZGlmICAgICAgICAgICAgICAgLyogQ09NUDUgKi8NCi0jaWYgZGVmaW5lZChDT01QNykNCi0jZGVmaW5lIExMX1RJTV9USU0xNV9USTFfUk1QX0NPTVA3IFwNCi0gIChUSU1fVElTRUxfVEkxU0VMXzIgfCAgICAgICAgICAgIFwNCi0gICBUSU1fVElTRUxfVEkxU0VMXzApIC8qITwgVElNMTUgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDdfT1VUICovDQotI2VuZGlmICAgICAgICAgICAgICAgICAvKiBDT01QNyAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBUSU1fTExfRUNfVElNMTVfVEkyX1JNUCAgVElNMTUgVGltZXIgSW5wdXQgQ2gyIFJlbWFwDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1RJTV9USU0xNV9USTJfUk1QX0dQSU8gXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBUSU0xNSBpbnB1dCAyIGlzIGNvbm5lY3RlZCB0byBHUElPICovDQotI2RlZmluZSBMTF9USU1fVElNMTVfVEkyX1JNUF9DT01QMiBcDQotICBUSU1fVElTRUxfVEkyU0VMXzAgLyohPCBUSU0xNSBpbnB1dCAyIGlzIGNvbm5lY3RlZCB0byBDT01QMl9PVVQgKi8NCi0jZGVmaW5lIExMX1RJTV9USU0xNV9USTJfUk1QX0NPTVAzIFwNCi0gIFRJTV9USVNFTF9USTJTRUxfMSAvKiE8IFRJTTE1IGlucHV0IDIgaXMgY29ubmVjdGVkIHRvIENPTVAzX09VVCAqLw0KLSNpZiBkZWZpbmVkKENPTVA2KQ0KLSNkZWZpbmUgTExfVElNX1RJTTE1X1RJMl9STVBfQ09NUDYgXA0KLSAgKFRJTV9USVNFTF9USTJTRUxfMSB8ICAgICAgICAgICAgXA0KLSAgIFRJTV9USVNFTF9USTJTRUxfMCkgLyohPCBUSU0xNSBpbnB1dCAyIGlzIGNvbm5lY3RlZCB0byBDT01QNl9PVVQgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgIC8qIENPTVA2ICovDQotI2lmIGRlZmluZWQoQ09NUDcpDQotI2RlZmluZSBMTF9USU1fVElNMTVfVEkyX1JNUF9DT01QNyBcDQotICBUSU1fVElTRUxfVEkyU0VMXzIgLyohPCBUSU0xNSBpbnB1dCAyIGlzIGNvbm5lY3RlZCB0byBDT01QN19PVVQgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAvKiBDT01QNyAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBUSU1fTExfRUNfVElNMTZfVEkxX1JNUCAgVElNMTYgVGltZXIgSW5wdXQgQ2gxIFJlbWFwDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1RJTV9USU0xNl9USTFfUk1QX0dQSU8gXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBUSU0xNiBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBHUElPICovDQotI2lmIGRlZmluZWQoQ09NUDYpDQotI2RlZmluZSBMTF9USU1fVElNMTZfVEkxX1JNUF9DT01QNiBcDQotICBUSU1fVElTRUxfVEkxU0VMXzAgLyohPCBUSU0xNiBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QNl9PVVQgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAvKiBDT01QNiAqLw0KLSNkZWZpbmUgTExfVElNX1RJTTE2X1RJMV9STVBfTUNPIFwNCi0gIFRJTV9USVNFTF9USTFTRUxfMSAvKiE8IFRJTTE2IGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIE1DTyAqLw0KLSNkZWZpbmUgTExfVElNX1RJTTE2X1RJMV9STVBfSFNFXzMyIFwNCi0gIChUSU1fVElTRUxfVEkxU0VMXzEgfCAgICAgICAgICAgICBcDQotICAgVElNX1RJU0VMX1RJMVNFTF8wKSAvKiE8IFRJTTE2IGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIEhTRS8zMiAqLw0KLSNkZWZpbmUgTExfVElNX1RJTTE2X1RJMV9STVBfUlRDX1dLIFwNCi0gIFRJTV9USVNFTF9USTFTRUxfMiAvKiE8IFRJTTE2IGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIFJUQ19XQUtFVVAgKi8NCi0jZGVmaW5lIExMX1RJTV9USU0xNl9USTFfUk1QX0xTRSBcDQotICAoVElNX1RJU0VMX1RJMVNFTF8yIHwgICAgICAgICAgXA0KLSAgIFRJTV9USVNFTF9USTFTRUxfMCkgLyohPCBUSU0xNiBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBMU0UgKi8NCi0jZGVmaW5lIExMX1RJTV9USU0xNl9USTFfUk1QX0xTSSBcDQotICAoVElNX1RJU0VMX1RJMVNFTF8yIHwgICAgICAgICAgXA0KLSAgIFRJTV9USVNFTF9USTFTRUxfMSkgLyohPCBUSU0xNiBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBMU0kgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX1RJTTE3X1RJMV9STVAgIFRJTTE3IFRpbWVyIElucHV0IENoMSBSZW1hcA0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9USU1fVElNMTdfVEkxX1JNUF9HUElPIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgVElNMTcgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gR1BJTyAqLw0KLSNpZiBkZWZpbmVkKENPTVA1KQ0KLSNkZWZpbmUgTExfVElNX1RJTTE3X1RJMV9STVBfQ09NUDUgXA0KLSAgVElNX1RJU0VMX1RJMVNFTF8wIC8qITwgVElNMTcgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDVfT1VUICovDQotI2VuZGlmICAgICAgICAgICAgICAgLyogQ09NUDUgKi8NCi0jZGVmaW5lIExMX1RJTV9USU0xN19USTFfUk1QX01DTyBcDQotICBUSU1fVElTRUxfVEkxU0VMXzEgLyohPCBUSU0xNyBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBNQ08gKi8NCi0jZGVmaW5lIExMX1RJTV9USU0xN19USTFfUk1QX0hTRV8zMiBcDQotICAoVElNX1RJU0VMX1RJMVNFTF8xIHwgICAgICAgICAgICAgXA0KLSAgIFRJTV9USVNFTF9USTFTRUxfMCkgLyohPCBUSU0xNyBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBIU0UvMzIgKi8NCi0jZGVmaW5lIExMX1RJTV9USU0xN19USTFfUk1QX1JUQ19XSyBcDQotICBUSU1fVElTRUxfVEkxU0VMXzIgLyohPCBUSU0xNyBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBSVENfV0FLRVVQICovDQotI2RlZmluZSBMTF9USU1fVElNMTdfVEkxX1JNUF9MU0UgXA0KLSAgKFRJTV9USVNFTF9USTFTRUxfMiB8ICAgICAgICAgIFwNCi0gICBUSU1fVElTRUxfVEkxU0VMXzApIC8qITwgVElNMTcgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gTFNFICovDQotI2RlZmluZSBMTF9USU1fVElNMTdfVEkxX1JNUF9MU0kgXA0KLSAgKFRJTV9USVNFTF9USTFTRUxfMiB8ICAgICAgICAgIFwNCi0gICBUSU1fVElTRUxfVEkxU0VMXzEpIC8qITwgVElNMTcgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gTFNJICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0jaWYgZGVmaW5lZChUSU0yMCkNCi0vKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19USU0yMF9USTFfUk1QICBUSU0yMCBUaW1lciBJbnB1dCBDaDEgUmVtYXANCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfVElNX1RJTTIwX1RJMV9STVBfR1BJTyBcDQotICAweDAwMDAwMDAwVSAvKiE8IFRJTTIwIGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIEdQSU8gKi8NCi0jZGVmaW5lIExMX1RJTV9USU0yMF9USTFfUk1QX0NPTVAxIFwNCi0gIFRJTV9USVNFTF9USTFTRUxfMCAvKiE8IFRJTTIwIGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVAxX09VVCAqLw0KLSNkZWZpbmUgTExfVElNX1RJTTIwX1RJMV9STVBfQ09NUDIgXA0KLSAgVElNX1RJU0VMX1RJMVNFTF8xIC8qITwgVElNMjAgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDJfT1VUICovDQotI2RlZmluZSBMTF9USU1fVElNMjBfVEkxX1JNUF9DT01QMyBcDQotICAoVElNX1RJU0VMX1RJMVNFTF8xIHwgICAgICAgICAgICBcDQotICAgVElNX1RJU0VMX1RJMVNFTF8wKSAvKiE8IFRJTTIwIGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVAzX09VVCAqLw0KLSNkZWZpbmUgTExfVElNX1RJTTIwX1RJMV9STVBfQ09NUDQgXA0KLSAgVElNX1RJU0VMX1RJMVNFTF8yIC8qITwgVElNMjAgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDRfT1VUICovDQotLyoqDQotICogQH0NCi0gKi8NCi0jZW5kaWYgLyogVElNMjAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19PQ1JFRl9DTFJfSU5UIE9DUkVGIGNsZWFyIGlucHV0IHNlbGVjdGlvbg0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9USU1fT0NSRUZfQ0xSX0lOVF9FVFIgXA0KLSAgT0NSRUZfQ0xFQVJfU0VMRUNUX01zayAvKiE8IE9DUkVGX0NMUl9JTlQgaXMgY29ubmVjdGVkIHRvIEVUUkYgKi8NCi0jZGVmaW5lIExMX1RJTV9PQ1JFRl9DTFJfSU5UX0NPTVAxIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgT0NSRUYgY2xlYXIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVAxX09VVCAqLw0KLSNkZWZpbmUgTExfVElNX09DUkVGX0NMUl9JTlRfQ09NUDIgXA0KLSAgVElNMV9BRjJfT0NSU0VMXzAgLyohPCBPQ1JFRiBjbGVhciBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDJfT1VUICovDQotI2RlZmluZSBMTF9USU1fT0NSRUZfQ0xSX0lOVF9DT01QMyBcDQotICBUSU0xX0FGMl9PQ1JTRUxfMSAvKiE8IE9DUkVGIGNsZWFyIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QM19PVVQgKi8NCi0jZGVmaW5lIExMX1RJTV9PQ1JFRl9DTFJfSU5UX0NPTVA0IFwNCi0gIChUSU0xX0FGMl9PQ1JTRUxfMSB8ICAgICAgICAgICAgIFwNCi0gICBUSU0xX0FGMl9PQ1JTRUxfMCkgLyohPCBPQ1JFRiBjbGVhciBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDRfT1VUICovDQotI2lmIGRlZmluZWQoQ09NUDUpDQotI2RlZmluZSBMTF9USU1fT0NSRUZfQ0xSX0lOVF9DT01QNSBcDQotICBUSU0xX0FGMl9PQ1JTRUxfMiAvKiE8IE9DUkVGIGNsZWFyIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QNV9PVVQgKi8NCi0jZW5kaWYgICAgICAgICAgICAgIC8qIENPTVA1ICovDQotI2lmIGRlZmluZWQoQ09NUDYpDQotI2RlZmluZSBMTF9USU1fT0NSRUZfQ0xSX0lOVF9DT01QNiBcDQotICAoVElNMV9BRjJfT0NSU0VMXzIgfCAgICAgICAgICAgICBcDQotICAgVElNMV9BRjJfT0NSU0VMXzApIC8qITwgT0NSRUYgY2xlYXIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVA2X09VVCAqLw0KLSNlbmRpZiAgICAgICAgICAgICAgICAvKiBDT01QNiAqLw0KLSNpZiBkZWZpbmVkKENPTVA3KQ0KLSNkZWZpbmUgTExfVElNX09DUkVGX0NMUl9JTlRfQ09NUDcgXA0KLSAgKFRJTTFfQUYyX09DUlNFTF8yIHwgICAgICAgICAgICAgXA0KLSAgIFRJTTFfQUYyX09DUlNFTF8xKSAvKiE8IE9DUkVGIGNsZWFyIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QN19PVVQgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgLyogQ09NUDcgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0lOREVYX0RJUiBpbmRleCBkaXJlY3Rpb24gc2VsZWN0aW9uDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1RJTV9JTkRFWF9VUF9ET1dOIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgSW5kZXggcmVzZXRzIHRoZSBjb3VudGVyIHdoYXRldmVyIHRoZSBkaXJlY3Rpb24gKi8NCi0jZGVmaW5lIExMX1RJTV9JTkRFWF9VUCBcDQotICBUSU1fRUNSX0lESVJfMCAvKiE8IEluZGV4IHJlc2V0cyB0aGUgY291bnRlciB3aGVuIHVwLWNvdW50aW5nIG9ubHkgKi8NCi0jZGVmaW5lIExMX1RJTV9JTkRFWF9ET1dOIFwNCi0gIFRJTV9FQ1JfSURJUl8xIC8qITwgSW5kZXggcmVzZXRzIHRoZSBjb3VudGVyIHdoZW4gZG93bi1jb3VudGluZyBvbmx5ICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19JTkRFWF9QT1NJVElPTiBpbmRleCBwb3NpdGlvbmluZyBzZWxlY3Rpb24NCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfVElNX0lOREVYX1BPU0lUSU9OX0RPV05fRE9XTiBcDQotICAweDAwMDAwMDAwVSAvKiE8IEluZGV4IHJlc2V0cyB0aGUgY291bnRlciB3aGVuIEFCID0gMDAgKi8NCi0jZGVmaW5lIExMX1RJTV9JTkRFWF9QT1NJVElPTl9ET1dOX1VQIFwNCi0gIFRJTV9FQ1JfSVBPU18wIC8qITwgSW5kZXggcmVzZXRzIHRoZSBjb3VudGVyIHdoZW4gQUIgPSAwMSAqLw0KLSNkZWZpbmUgTExfVElNX0lOREVYX1BPU0lUSU9OX1VQX0RPV04gXA0KLSAgVElNX0VDUl9JUE9TXzEgLyohPCBJbmRleCByZXNldHMgdGhlIGNvdW50ZXIgd2hlbiBBQiA9IDEwICovDQotI2RlZmluZSBMTF9USU1fSU5ERVhfUE9TSVRJT05fVVBfVVAgXA0KLSAgKFRJTV9FQ1JfSVBPU18xIHwgICAgICAgICAgICAgICAgIFwNCi0gICBUSU1fRUNSX0lQT1NfMCkgLyohPCBJbmRleCByZXNldHMgdGhlIGNvdW50ZXIgd2hlbiBBQiA9IDExICovDQotI2RlZmluZSBMTF9USU1fSU5ERVhfUE9TSVRJT05fRE9XTiBcDQotICAweDAwMDAwMDAwVSAvKiE8IEluZGV4IHJlc2V0cyB0aGUgY291bnRlciB3aGVuIGNsb2NrIGlzIDAgKi8NCi0jZGVmaW5lIExMX1RJTV9JTkRFWF9QT1NJVElPTl9VUCBcDQotICBUSU1fRUNSX0lQT1NfMCAvKiE8IEluZGV4IHJlc2V0cyB0aGUgY291bnRlciB3aGVuIGNsb2NrIGlzIDEgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0ZJUlNUX0lOREVYIGZpcnN0IGluZGV4IHNlbGVjdGlvbg0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9USU1fSU5ERVhfQUxMIDB4MDAwMDAwMDBVIC8qITwgSW5kZXggaXMgYWx3YXlzIGFjdGl2ZSAqLw0KLSNkZWZpbmUgTExfVElNX0lOREVYX0ZJUlNUX09OTFkgXA0KLSAgVElNX0VDUl9GSURYIC8qITwgVGhlIGZpcnN0IEluZGV4IG9ubHkgcmVzZXRzIHRoZSBjb3VudGVyICovDQotLyoqDQotICogQH0NCi0gKi8NCi0vKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19QV1BSU0MgUHVsc2Ugb24gY29tcGFyZSBwdWxzZSB3aWR0aCBwcmVzY2FsZXINCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfVElNX1BXUFJTQ19YMSBcDQotICAweDAwMDAwMDAwVSAvKiE8IFB1bHNlIG9uIGNvbXBhcmUgcHVsc2Ugd2lkdGggcHJlc2NhbGVyIDEgKi8NCi0jZGVmaW5lIExMX1RJTV9QV1BSU0NfWDIgXA0KLSAgVElNX0VDUl9QV1BSU0NfMCAvKiE8IFB1bHNlIG9uIGNvbXBhcmUgcHVsc2Ugd2lkdGggcHJlc2NhbGVyIDIgKi8NCi0jZGVmaW5lIExMX1RJTV9QV1BSU0NfWDQgXA0KLSAgVElNX0VDUl9QV1BSU0NfMSAvKiE8IFB1bHNlIG9uIGNvbXBhcmUgcHVsc2Ugd2lkdGggcHJlc2NhbGVyIDQgKi8NCi0jZGVmaW5lIExMX1RJTV9QV1BSU0NfWDggXA0KLSAgKFRJTV9FQ1JfUFdQUlNDXzEgfCAgICBcDQotICAgVElNX0VDUl9QV1BSU0NfMCkgLyohPCBQdWxzZSBvbiBjb21wYXJlIHB1bHNlIHdpZHRoIHByZXNjYWxlciA4ICovDQotI2RlZmluZSBMTF9USU1fUFdQUlNDX1gxNiBcDQotICBUSU1fRUNSX1BXUFJTQ18yIC8qITwgUHVsc2Ugb24gY29tcGFyZSBwdWxzZSB3aWR0aCBwcmVzY2FsZXIgMTYgKi8NCi0jZGVmaW5lIExMX1RJTV9QV1BSU0NfWDMyIFwNCi0gIChUSU1fRUNSX1BXUFJTQ18yIHwgICAgIFwNCi0gICBUSU1fRUNSX1BXUFJTQ18wKSAvKiE8IFB1bHNlIG9uIGNvbXBhcmUgcHVsc2Ugd2lkdGggcHJlc2NhbGVyIDMyICovDQotI2RlZmluZSBMTF9USU1fUFdQUlNDX1g2NCBcDQotICAoVElNX0VDUl9QV1BSU0NfMiB8ICAgICBcDQotICAgVElNX0VDUl9QV1BSU0NfMSkgLyohPCBQdWxzZSBvbiBjb21wYXJlIHB1bHNlIHdpZHRoIHByZXNjYWxlciA2NCAqLw0KLSNkZWZpbmUgTExfVElNX1BXUFJTQ19YMTI4ICAgICAgICAgICAgICAgXA0KLSAgKFRJTV9FQ1JfUFdQUlNDXzIgfCBUSU1fRUNSX1BXUFJTQ18xIHwgXA0KLSAgIFRJTV9FQ1JfUFdQUlNDXzApIC8qITwgUHVsc2Ugb24gY29tcGFyZSBwdWxzZSB3aWR0aCBwcmVzY2FsZXIgMTI4ICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19IU0VfMzJfUkVRVUVTVCBDbG9jayBIU0UvMzIgcmVxdWVzdA0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9USU1fSFNFXzMyX05PVF9SRVFVRVNUICAgICAgICAgICAgIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgQ2xvY2sgSFNFLzMyIG5vdCByZXF1ZXN0ZWQgXA0KLSAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9USU1fSFNFXzMyX1JFUVVFU1QgXA0KLSAgVElNX09SX0hTRTMyRU4gLyohPCBDbG9jayBIU0UvMzIgcmVxdWVzdGVkIGZvciBUSU0xNi8xNyBUSTFTRUwgcmVtYXAgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBMZWdhY3kgZGVmaW5pdGlvbnMgZm9yIGNvbXBhdGliaWxpdHkgcHVycG9zZQ0KLUBjb25kIDANCi0gICovDQotI2RlZmluZSBMTF9USU1fQktJTl9TT1VSQ0VfREZCSyBMTF9USU1fQktJTl9TT1VSQ0VfREYxQksNCi0vKioNCi1AZW5kY29uZA0KLSAgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBkZWZncm91cCBUSU1fTExfRXhwb3J0ZWRfTWFjcm9zIFRJTSBFeHBvcnRlZCBNYWNyb3MNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0xMX0VNX1dSSVRFX1JFQUQgQ29tbW9uIFdyaXRlIGFuZCByZWFkIHJlZ2lzdGVycyBNYWNyb3MNCi0gKiBAew0KLSAqLw0KLS8qKg0KLSAqIEBicmllZiAgV3JpdGUgYSB2YWx1ZSBpbiBUSU0gcmVnaXN0ZXIuDQotICogQHBhcmFtICBfX0lOU1RBTkNFX18gVElNIEluc3RhbmNlDQotICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHdyaXR0ZW4NCi0gKiBAcGFyYW0gIF9fVkFMVUVfXyBWYWx1ZSB0byBiZSB3cml0dGVuIGluIHRoZSByZWdpc3Rlcg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLSNkZWZpbmUgTExfVElNX1dyaXRlUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXywgX19WQUxVRV9fKSBcDQotICBXUklURV9SRUcoKF9fSU5TVEFOQ0VfXyktPl9fUkVHX18sIChfX1ZBTFVFX18pKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmVhZCBhIHZhbHVlIGluIFRJTSByZWdpc3Rlci4NCi0gKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBUSU0gSW5zdGFuY2UNCi0gKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgcmVhZA0KLSAqIEByZXR2YWwgUmVnaXN0ZXIgdmFsdWUNCi0gKi8NCi0jZGVmaW5lIExMX1RJTV9SZWFkUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXykgUkVBRF9SRUcoKF9fSU5TVEFOQ0VfXyktPl9fUkVHX18pDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9MTF9FTV9FeHBvcnRlZF9NYWNyb3MgRXhwb3J0ZWRfTWFjcm9zDQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEhFTFBFUiBtYWNybyByZXRyaWV2aW5nIHRoZSBVSUZDUFkgZmxhZyBmcm9tIHRoZSBjb3VudGVyIHZhbHVlLg0KLSAqIEBub3RlIGV4OiBAcmVmIF9fTExfVElNX0dFVEZMQUdfVUlGQ1BZIChAcmVmIExMX1RJTV9HZXRDb3VudGVyICgpKTsNCi0gKiBAbm90ZSAgUmVsZXZhbnQgb25seSBpZiBVSUYgZmxhZyByZW1hcHBpbmcgaGFzIGJlZW4gZW5hYmxlZCAgKFVJRiBzdGF0dXMgYml0DQotICogaXMgY29waWVkIHRvIFRJTXhfQ05UIHJlZ2lzdGVyIGJpdCAzMSkNCi0gKiBAcGFyYW0gIF9fQ05UX18gQ291bnRlciB2YWx1ZQ0KLSAqIEByZXR2YWwgVUlGIHN0YXR1cyBiaXQNCi0gKi8NCi0jZGVmaW5lIF9fTExfVElNX0dFVEZMQUdfVUlGQ1BZKF9fQ05UX18pIFwNCi0gIChSRUFEX0JJVCgoX19DTlRfXyksIFRJTV9DTlRfVUlGQ1BZKSA+PiBUSU1fQ05UX1VJRkNQWV9Qb3MpDQotDQotLyoqDQotICogQGJyaWVmICBIRUxQRVIgbWFjcm8gY2FsY3VsYXRpbmcgRFRHWzA6N10gaW4gdGhlIFRJTXhfQkRUUiByZWdpc3RlciB0bw0KLSAqIGFjaGlldmUgdGhlIHJlcXVlc3RlZCBkZWFkIHRpbWUgZHVyYXRpb24uDQotICogQG5vdGUgZXg6IEByZWYgX19MTF9USU1fQ0FMQ19ERUFEVElNRSAoODAwMDAwMDAsIEByZWYgTExfVElNX0dldENsb2NrRGl2aXNpb24NCi0gKiAoKSwgMTIwKTsNCi0gKiBAcGFyYW0gIF9fVElNQ0xLX18gdGltZXIgaW5wdXQgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikNCi0gKiBAcGFyYW0gIF9fQ0tEX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0xPQ0tESVZJU0lPTl9ESVYxDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NMT0NLRElWSVNJT05fRElWMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DTE9DS0RJVklTSU9OX0RJVjQNCi0gKiBAcGFyYW0gIF9fRFRfXyBkZWFkdGltZSBkdXJhdGlvbiAoaW4gbnMpDQotICogQHJldHZhbCBEVEdbMDo3XQ0KLSAqLw0KLSNkZWZpbmUgX19MTF9USU1fQ0FMQ19ERUFEVElNRShfX1RJTUNMS19fLCBfX0NLRF9fLCBfX0RUX18pICAgICAgICAgICAgICAgXA0KLSAgKCgoKHVpbnQ2NF90KSgoX19EVF9fKSAqIDEwMDBVKSkgPCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAoKERUX0RFTEFZXzEgKyAxVSkgKiBUSU1fQ0FMQ19EVFMoKF9fVElNQ0xLX18pLCAoX19DS0RfXykpKSkgICAgICAgICAgXA0KLSAgICAgICA/ICh1aW50OF90KSgoKHVpbnQ2NF90KSgoX19EVF9fKSAqIDEwMDBVKSAvICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgVElNX0NBTENfRFRTKChfX1RJTUNMS19fKSwgKF9fQ0tEX18pKSkgJiAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICBEVF9ERUxBWV8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCgodWludDY0X3QpKChfX0RUX18pICogMTAwMFUpKSA8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICgoNjRVICsgKERUX0RFTEFZXzIgKyAxVSkpICogMlUgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICBUSU1fQ0FMQ19EVFMoKF9fVElNQ0xLX18pLCAoX19DS0RfXykpKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICA/ICh1aW50OF90KShEVF9SQU5HRV8yIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpKCh1aW50OF90KSgoKCh1aW50NjRfdCkoKF9fRFRfXykgKiAxMDAwVSkpIC8gXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX0NBTENfRFRTKChfX1RJTUNMS19fKSwgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0NLRF9fKSkpID4+ICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxVSkgLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50OF90KTY0KSAmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgRFRfREVMQVlfMikpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCgodWludDY0X3QpKChfX0RUX18pICogMTAwMFUpKSA8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICgoMzJVICsgKERUX0RFTEFZXzMgKyAxVSkpICogOFUgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICBUSU1fQ0FMQ19EVFMoKF9fVElNQ0xLX18pLCAoX19DS0RfXykpKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICA/ICh1aW50OF90KShEVF9SQU5HRV8zIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpKCh1aW50OF90KSgoKCgodWludDY0X3QpKF9fRFRfXykgKiAxMDAwVSkpIC8gXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX0NBTENfRFRTKChfX1RJTUNMS19fKSwgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0NLRF9fKSkpID4+ICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzVSkgLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50OF90KTMyKSAmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgRFRfREVMQVlfMykpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgIDogKCgodWludDY0X3QpKChfX0RUX18pICogMTAwMFUpKSA8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICgoMzJVICsgKERUX0RFTEFZXzQgKyAxVSkpICogMTZVICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICBUSU1fQ0FMQ19EVFMoKF9fVElNQ0xLX18pLCAoX19DS0RfXykpKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICA/ICh1aW50OF90KShEVF9SQU5HRV80IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpKCh1aW50OF90KSgoKCgodWludDY0X3QpKF9fRFRfXykgKiAxMDAwVSkpIC8gXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX0NBTENfRFRTKChfX1RJTUNMS19fKSwgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0NLRF9fKSkpID4+ICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0VSkgLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50OF90KTMyKSAmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgRFRfREVMQVlfNCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICA6IDBVKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSEVMUEVSIG1hY3JvIGNhbGN1bGF0aW5nIHRoZSBwcmVzY2FsZXIgdmFsdWUgdG8gYWNoaWV2ZSB0aGUgcmVxdWlyZWQNCi0gKiBjb3VudGVyIGNsb2NrIGZyZXF1ZW5jeS4NCi0gKiBAbm90ZSBleDogQHJlZiBfX0xMX1RJTV9DQUxDX1BTQyAoODAwMDAwMDAsIDEwMDAwMDApOw0KLSAqIEBwYXJhbSAgX19USU1DTEtfXyB0aW1lciBpbnB1dCBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQ0KLSAqIEBwYXJhbSAgX19DTlRDTEtfXyBjb3VudGVyIGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopDQotICogQHJldHZhbCBQcmVzY2FsZXIgdmFsdWUgIChiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTY1NTM1KQ0KLSAqLw0KLSNkZWZpbmUgX19MTF9USU1fQ0FMQ19QU0MoX19USU1DTEtfXywgX19DTlRDTEtfXykgICAgICAgXA0KLSAgKCgoX19USU1DTEtfXykgPj0gKF9fQ05UQ0xLX18pKSAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICA/ICh1aW50MzJfdCkoKChfX1RJTUNMS19fKSAvIChfX0NOVENMS19fKSkgLSAxVSkgXA0KLSAgICAgICA6IDBVKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSEVMUEVSIG1hY3JvIGNhbGN1bGF0aW5nIHRoZSBhdXRvLXJlbG9hZCB2YWx1ZSB0byBhY2hpZXZlIHRoZQ0KLSAqIHJlcXVpcmVkIG91dHB1dCBzaWduYWwgZnJlcXVlbmN5Lg0KLSAqIEBub3RlIGV4OiBAcmVmIF9fTExfVElNX0NBTENfQVJSICgxMDAwMDAwLCBAcmVmIExMX1RJTV9HZXRQcmVzY2FsZXIgKCksDQotICogMTAwMDApOw0KLSAqIEBwYXJhbSAgX19USU1DTEtfXyB0aW1lciBpbnB1dCBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQ0KLSAqIEBwYXJhbSAgX19QU0NfXyBwcmVzY2FsZXINCi0gKiBAcGFyYW0gIF9fRlJFUV9fIG91dHB1dCBzaWduYWwgZnJlcXVlbmN5IChpbiBIeikNCi0gKiBAcmV0dmFsICBBdXRvLXJlbG9hZCB2YWx1ZSAgKGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9NjU1MzUpDQotICovDQotI2RlZmluZSBfX0xMX1RJTV9DQUxDX0FSUihfX1RJTUNMS19fLCBfX1BTQ19fLCBfX0ZSRVFfXykgICAgICAgICBcDQotICAoKCgoX19USU1DTEtfXykgLyAoKF9fUFNDX18pICsgMVUpKSA+PSAoX19GUkVRX18pKSAgICAgICAgICAgICBcDQotICAgICAgID8gKCgoX19USU1DTEtfXykgLyAoKF9fRlJFUV9fKSAqICgoX19QU0NfXykgKyAxVSkpKSAtIDFVKSBcDQotICAgICAgIDogMFUpDQotDQotLyoqDQotICogQGJyaWVmICBIRUxQRVIgbWFjcm8gY2FsY3VsYXRpbmcgdGhlIGF1dG8tcmVsb2FkIHZhbHVlLCB3aXRoIGRpdGhlcmluZw0KLSAqIGZlYXR1cmUgZW5hYmxlZCwgdG8gYWNoaWV2ZSB0aGUgcmVxdWlyZWQgb3V0cHV0IHNpZ25hbCBmcmVxdWVuY3kuDQotICogQG5vdGUgZXg6IEByZWYgX19MTF9USU1fQ0FMQ19BUlJfRElUSEVSICgxMDAwMDAwLCBAcmVmIExMX1RJTV9HZXRQcmVzY2FsZXINCi0gKiAoKSwgMTAwMDApOw0KLSAqIEBwYXJhbSAgX19USU1DTEtfXyB0aW1lciBpbnB1dCBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQ0KLSAqIEBwYXJhbSAgX19QU0NfXyBwcmVzY2FsZXINCi0gKiBAcGFyYW0gIF9fRlJFUV9fIG91dHB1dCBzaWduYWwgZnJlcXVlbmN5IChpbiBIeikNCi0gKiBAcmV0dmFsICBBdXRvLXJlbG9hZCB2YWx1ZSAgKGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9NjU1MzUpDQotICovDQotI2RlZmluZSBfX0xMX1RJTV9DQUxDX0FSUl9ESVRIRVIoX19USU1DTEtfXywgX19QU0NfXywgX19GUkVRX18pIFwNCi0gICgoKChfX1RJTUNMS19fKSAvICgoX19QU0NfXykgKyAxVSkpID49IChfX0ZSRVFfXykpICAgICAgICAgICAgXA0KLSAgICAgICA/ICh1aW50MzJfdCkoKCgodWludDY0X3QpKF9fVElNQ0xLX18pICogMTZVIC8gICAgICAgICAgICBcDQotICAgICAgICAgICAgICAgICAgICAgICgoX19GUkVRX18pICogKChfX1BTQ19fKSArIDFVKSkpIC0gICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAxNlUpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICA6IDBVKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSEVMUEVSIG1hY3JvIGNhbGN1bGF0aW5nIHRoZSBjb21wYXJlIHZhbHVlIHJlcXVpcmVkIHRvIGFjaGlldmUgdGhlDQotICogcmVxdWlyZWQgdGltZXIgb3V0cHV0IGNvbXBhcmUgYWN0aXZlL2luYWN0aXZlIGRlbGF5Lg0KLSAqIEBub3RlIGV4OiBAcmVmIF9fTExfVElNX0NBTENfREVMQVkgKDEwMDAwMDAsIEByZWYgTExfVElNX0dldFByZXNjYWxlciAoKSwNCi0gKiAxMCk7DQotICogQHBhcmFtICBfX1RJTUNMS19fIHRpbWVyIGlucHV0IGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopDQotICogQHBhcmFtICBfX1BTQ19fIHByZXNjYWxlcg0KLSAqIEBwYXJhbSAgX19ERUxBWV9fIHRpbWVyIG91dHB1dCBjb21wYXJlIGFjdGl2ZS9pbmFjdGl2ZSBkZWxheSAoaW4gdXMpDQotICogQHJldHZhbCBDb21wYXJlIHZhbHVlICAoYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUzNSkNCi0gKi8NCi0jZGVmaW5lIF9fTExfVElNX0NBTENfREVMQVkoX19USU1DTEtfXywgX19QU0NfXywgX19ERUxBWV9fKSAgICAgIFwNCi0gICgodWludDMyX3QpKCgodWludDY0X3QpKF9fVElNQ0xLX18pICogKHVpbnQ2NF90KShfX0RFTEFZX18pKSAvIFwNCi0gICAgICAgICAgICAgICgodWludDY0X3QpMTAwMDAwMFUgKiAodWludDY0X3QpKChfX1BTQ19fKSArIDFVKSkpKQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSEVMUEVSIG1hY3JvIGNhbGN1bGF0aW5nIHRoZSBjb21wYXJlIHZhbHVlLCB3aXRoIGRpdGhlcmluZyBmZWF0dXJlDQotICogZW5hYmxlZCwgdG8gYWNoaWV2ZSB0aGUgcmVxdWlyZWQgdGltZXIgb3V0cHV0IGNvbXBhcmUgYWN0aXZlL2luYWN0aXZlIGRlbGF5Lg0KLSAqIEBub3RlIGV4OiBAcmVmIF9fTExfVElNX0NBTENfREVMQVlfRElUSEVSICgxMDAwMDAwLCBAcmVmIExMX1RJTV9HZXRQcmVzY2FsZXINCi0gKiAoKSwgMTApOw0KLSAqIEBwYXJhbSAgX19USU1DTEtfXyB0aW1lciBpbnB1dCBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQ0KLSAqIEBwYXJhbSAgX19QU0NfXyBwcmVzY2FsZXINCi0gKiBAcGFyYW0gIF9fREVMQVlfXyB0aW1lciBvdXRwdXQgY29tcGFyZSBhY3RpdmUvaW5hY3RpdmUgZGVsYXkgKGluIHVzKQ0KLSAqIEByZXR2YWwgQ29tcGFyZSB2YWx1ZSAgKGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9NjU1MzUpDQotICovDQotI2RlZmluZSBfX0xMX1RJTV9DQUxDX0RFTEFZX0RJVEhFUihfX1RJTUNMS19fLCBfX1BTQ19fLCBfX0RFTEFZX18pICAgICBcDQotICAoKHVpbnQzMl90KSgoKHVpbnQ2NF90KShfX1RJTUNMS19fKSAqICh1aW50NjRfdCkoX19ERUxBWV9fKSAqIDE2VSkgLyBcDQotICAgICAgICAgICAgICAoKHVpbnQ2NF90KTEwMDAwMDBVICogKHVpbnQ2NF90KSgoX19QU0NfXykgKyAxVSkpKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgIEhFTFBFUiBtYWNybyBjYWxjdWxhdGluZyB0aGUgYXV0by1yZWxvYWQgdmFsdWUgdG8gYWNoaWV2ZSB0aGUNCi0gKiByZXF1aXJlZCBwdWxzZSBkdXJhdGlvbiAod2hlbiB0aGUgdGltZXIgb3BlcmF0ZXMgaW4gb25lIHB1bHNlIG1vZGUpLg0KLSAqIEBub3RlIGV4OiBAcmVmIF9fTExfVElNX0NBTENfUFVMU0UgKDEwMDAwMDAsIEByZWYgTExfVElNX0dldFByZXNjYWxlciAoKSwgMTAsDQotICogMjApOw0KLSAqIEBwYXJhbSAgX19USU1DTEtfXyB0aW1lciBpbnB1dCBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQ0KLSAqIEBwYXJhbSAgX19QU0NfXyBwcmVzY2FsZXINCi0gKiBAcGFyYW0gIF9fREVMQVlfXyB0aW1lciBvdXRwdXQgY29tcGFyZSBhY3RpdmUvaW5hY3RpdmUgZGVsYXkgKGluIHVzKQ0KLSAqIEBwYXJhbSAgX19QVUxTRV9fIHB1bHNlIGR1cmF0aW9uIChpbiB1cykNCi0gKiBAcmV0dmFsIEF1dG8tcmVsb2FkIHZhbHVlICAoYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUzNSkNCi0gKi8NCi0jZGVmaW5lIF9fTExfVElNX0NBTENfUFVMU0UoX19USU1DTEtfXywgX19QU0NfXywgX19ERUxBWV9fLCBfX1BVTFNFX18pICAgIFwNCi0gICgodWludDMyX3QpKF9fTExfVElNX0NBTENfREVMQVkoKF9fVElNQ0xLX18pLCAoX19QU0NfXyksIChfX1BVTFNFX18pKSArIFwNCi0gICAgICAgICAgICAgIF9fTExfVElNX0NBTENfREVMQVkoKF9fVElNQ0xLX18pLCAoX19QU0NfXyksIChfX0RFTEFZX18pKSkpDQotDQotLyoqDQotICogQGJyaWVmICBIRUxQRVIgbWFjcm8gY2FsY3VsYXRpbmcgdGhlIGF1dG8tcmVsb2FkIHZhbHVlLCB3aXRoIGRpdGhlcmluZw0KLSAqIGZlYXR1cmUgZW5hYmxlZCwgdG8gYWNoaWV2ZSB0aGUgcmVxdWlyZWQgcHVsc2UgZHVyYXRpb24gKHdoZW4gdGhlIHRpbWVyDQotICogb3BlcmF0ZXMgaW4gb25lIHB1bHNlIG1vZGUpLg0KLSAqIEBub3RlIGV4OiBAcmVmIF9fTExfVElNX0NBTENfUFVMU0VfRElUSEVSICgxMDAwMDAwLCBAcmVmIExMX1RJTV9HZXRQcmVzY2FsZXINCi0gKiAoKSwgMTAsIDIwKTsNCi0gKiBAcGFyYW0gIF9fVElNQ0xLX18gdGltZXIgaW5wdXQgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikNCi0gKiBAcGFyYW0gIF9fUFNDX18gcHJlc2NhbGVyDQotICogQHBhcmFtICBfX0RFTEFZX18gdGltZXIgb3V0cHV0IGNvbXBhcmUgYWN0aXZlL2luYWN0aXZlIGRlbGF5IChpbiB1cykNCi0gKiBAcGFyYW0gIF9fUFVMU0VfXyBwdWxzZSBkdXJhdGlvbiAoaW4gdXMpDQotICogQHJldHZhbCBBdXRvLXJlbG9hZCB2YWx1ZSAgKGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9NjU1MzUpDQotICovDQotI2RlZmluZSBfX0xMX1RJTV9DQUxDX1BVTFNFX0RJVEhFUihfX1RJTUNMS19fLCBfX1BTQ19fLCBfX0RFTEFZX18sIF9fUFVMU0VfXykgXA0KLSAgKCh1aW50MzJfdCkoX19MTF9USU1fQ0FMQ19ERUxBWV9ESVRIRVIoKF9fVElNQ0xLX18pLCAoX19QU0NfXyksICAgICAgICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX1BVTFNFX18pKSArICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICAgICAgICBfX0xMX1RJTV9DQUxDX0RFTEFZX0RJVEhFUigoX19USU1DTEtfXyksIChfX1BTQ19fKSwgICAgICAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fREVMQVlfXykpKSkNCi0NCi0vKioNCi0gKiBAYnJpZWYgIEhFTFBFUiBtYWNybyByZXRyaWV2aW5nIHRoZSByYXRpbyBvZiB0aGUgaW5wdXQgY2FwdHVyZSBwcmVzY2FsZXINCi0gKiBAbm90ZSBleDogQHJlZiBfX0xMX1RJTV9HRVRfSUNQU0NfUkFUSU8gKEByZWYgTExfVElNX0lDX0dldFByZXNjYWxlciAoKSk7DQotICogQHBhcmFtICBfX0lDUFNDX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNQU0NfRElWMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ1BTQ19ESVYyDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDUFNDX0RJVjQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNQU0NfRElWOA0KLSAqIEByZXR2YWwgSW5wdXQgY2FwdHVyZSBwcmVzY2FsZXIgcmF0aW8gKDEsIDIsIDQgb3IgOCkNCi0gKi8NCi0jZGVmaW5lIF9fTExfVElNX0dFVF9JQ1BTQ19SQVRJTyhfX0lDUFNDX18pIFwNCi0gICgodWludDMyX3QpKDB4MDFVIDw8ICgoKF9fSUNQU0NfXykgPj4gMTZVKSA+PiBUSU1fQ0NNUjFfSUMxUFNDX1BvcykpKQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgVElNX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucyBUSU0gRXhwb3J0ZWQgRnVuY3Rpb25zDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9MTF9FRl9UaW1lX0Jhc2UgVGltZSBCYXNlIGNvbmZpZ3VyYXRpb24NCi0gKiBAew0KLSAqLw0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIHRpbWVyIGNvdW50ZXIuDQotICogQHJtdG9sbCBDUjEgICAgICAgICAgQ0VOICAgICAgICAgICBMTF9USU1fRW5hYmxlQ291bnRlcg0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9FbmFibGVDb3VudGVyKFRJTV9UeXBlRGVmICpUSU14KSB7DQotICBTRVRfQklUKFRJTXgtPkNSMSwgVElNX0NSMV9DRU4pOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgdGltZXIgY291bnRlci4NCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBDRU4gICAgICAgICAgIExMX1RJTV9EaXNhYmxlQ291bnRlcg0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlQ291bnRlcihUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgQ0xFQVJfQklUKFRJTXgtPkNSMSwgVElNX0NSMV9DRU4pOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEluZGljYXRlcyB3aGV0aGVyIHRoZSB0aW1lciBjb3VudGVyIGlzIGVuYWJsZWQuDQotICogQHJtdG9sbCBDUjEgICAgICAgICAgQ0VOICAgICAgICAgICBMTF9USU1fSXNFbmFibGVkQ291bnRlcg0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNFbmFibGVkQ291bnRlcihUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+Q1IxLCBUSU1fQ1IxX0NFTikgPT0gKFRJTV9DUjFfQ0VOKSkgPyAxVUwgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSB1cGRhdGUgZXZlbnQgZ2VuZXJhdGlvbi4NCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBVRElTICAgICAgICAgIExMX1RJTV9FbmFibGVVcGRhdGVFdmVudA0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9FbmFibGVVcGRhdGVFdmVudChUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgQ0xFQVJfQklUKFRJTXgtPkNSMSwgVElNX0NSMV9VRElTKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIHVwZGF0ZSBldmVudCBnZW5lcmF0aW9uLg0KLSAqIEBybXRvbGwgQ1IxICAgICAgICAgIFVESVMgICAgICAgICAgTExfVElNX0Rpc2FibGVVcGRhdGVFdmVudA0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlVXBkYXRlRXZlbnQoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIFNFVF9CSVQoVElNeC0+Q1IxLCBUSU1fQ1IxX1VESVMpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEluZGljYXRlcyB3aGV0aGVyIHVwZGF0ZSBldmVudCBnZW5lcmF0aW9uIGlzIGVuYWJsZWQuDQotICogQHJtdG9sbCBDUjEgICAgICAgICAgVURJUyAgICAgICAgICBMTF9USU1fSXNFbmFibGVkVXBkYXRlRXZlbnQNCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIEludmVydGVkIHN0YXRlIG9mIGJpdCAoMCBvciAxKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzRW5hYmxlZFVwZGF0ZUV2ZW50KFRJTV9UeXBlRGVmICpUSU14KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5DUjEsIFRJTV9DUjFfVURJUykgPT0gKHVpbnQzMl90KVJFU0VUKSA/IDFVTCA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IHVwZGF0ZSBldmVudCBzb3VyY2UNCi0gKiBAbm90ZSBVcGRhdGUgZXZlbnQgc291cmNlIHNldCB0byBMTF9USU1fVVBEQVRFU09VUkNFX1JFR1VMQVI6IGFueSBvZiB0aGUNCi0gKiBmb2xsb3dpbmcgZXZlbnRzIGdlbmVyYXRlIGFuIHVwZGF0ZSBpbnRlcnJ1cHQgb3IgRE1BIHJlcXVlc3QgaWYgZW5hYmxlZDoNCi0gKiAgICAgICAgLSBDb3VudGVyIG92ZXJmbG93L3VuZGVyZmxvdw0KLSAqICAgICAgICAtIFNldHRpbmcgdGhlIFVHIGJpdA0KLSAqICAgICAgICAtIFVwZGF0ZSBnZW5lcmF0aW9uIHRocm91Z2ggdGhlIHNsYXZlIG1vZGUgY29udHJvbGxlcg0KLSAqIEBub3RlIFVwZGF0ZSBldmVudCBzb3VyY2Ugc2V0IHRvIExMX1RJTV9VUERBVEVTT1VSQ0VfQ09VTlRFUjogb25seSBjb3VudGVyDQotICogICAgICAgb3ZlcmZsb3cvdW5kZXJmbG93IGdlbmVyYXRlcyBhbiB1cGRhdGUgaW50ZXJydXB0IG9yIERNQSByZXF1ZXN0IGlmDQotICogZW5hYmxlZC4NCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBVUlMgICAgICAgICAgIExMX1RJTV9TZXRVcGRhdGVTb3VyY2UNCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcGFyYW0gIFVwZGF0ZVNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9VUERBVEVTT1VSQ0VfUkVHVUxBUg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9VUERBVEVTT1VSQ0VfQ09VTlRFUg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9TZXRVcGRhdGVTb3VyY2UoVElNX1R5cGVEZWYgKlRJTXgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBVcGRhdGVTb3VyY2UpIHsNCi0gIE1PRElGWV9SRUcoVElNeC0+Q1IxLCBUSU1fQ1IxX1VSUywgVXBkYXRlU291cmNlKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgYWN0dWFsIGV2ZW50IHVwZGF0ZSBzb3VyY2UNCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBVUlMgICAgICAgICAgIExMX1RJTV9HZXRVcGRhdGVTb3VyY2UNCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1VQREFURVNPVVJDRV9SRUdVTEFSDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1VQREFURVNPVVJDRV9DT1VOVEVSDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9HZXRVcGRhdGVTb3VyY2UoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFRJTXgtPkNSMSwgVElNX0NSMV9VUlMpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZXQgb25lIHB1bHNlIG1vZGUgKG9uZSBzaG90IHYucy4gcmVwZXRpdGl2ZSkuDQotICogQHJtdG9sbCBDUjEgICAgICAgICAgT1BNICAgICAgICAgICBMTF9USU1fU2V0T25lUHVsc2VNb2RlDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHBhcmFtICBPbmVQdWxzZU1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT05FUFVMU0VNT0RFX1NJTkdMRQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PTkVQVUxTRU1PREVfUkVQRVRJVElWRQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9TZXRPbmVQdWxzZU1vZGUoVElNX1R5cGVEZWYgKlRJTXgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBPbmVQdWxzZU1vZGUpIHsNCi0gIE1PRElGWV9SRUcoVElNeC0+Q1IxLCBUSU1fQ1IxX09QTSwgT25lUHVsc2VNb2RlKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgYWN0dWFsIG9uZSBwdWxzZSBtb2RlLg0KLSAqIEBybXRvbGwgQ1IxICAgICAgICAgIE9QTSAgICAgICAgICAgTExfVElNX0dldE9uZVB1bHNlTW9kZQ0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT05FUFVMU0VNT0RFX1NJTkdMRQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PTkVQVUxTRU1PREVfUkVQRVRJVElWRQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fR2V0T25lUHVsc2VNb2RlKFRJTV9UeXBlRGVmICpUSU14KSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChUSU14LT5DUjEsIFRJTV9DUjFfT1BNKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IHRoZSB0aW1lciBjb3VudGVyIGNvdW50aW5nIG1vZGUuDQotICogQG5vdGUgTWFjcm8gSVNfVElNX0NPVU5URVJfTU9ERV9TRUxFQ1RfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8NCi0gKiAgICAgICBjaGVjayB3aGV0aGVyIG9yIG5vdCB0aGUgY291bnRlciBtb2RlIHNlbGVjdGlvbiBmZWF0dXJlIGlzIHN1cHBvcnRlZA0KLSAqICAgICAgIGJ5IGEgdGltZXIgaW5zdGFuY2UuDQotICogQG5vdGUgU3dpdGNoaW5nIGZyb20gQ2VudGVyIEFsaWduZWQgY291bnRlciBtb2RlIHRvIEVkZ2UgY291bnRlciBtb2RlIChvcg0KLSAqIHJldmVyc2UpIHJlcXVpcmVzIGEgdGltZXIgcmVzZXQgdG8gYXZvaWQgdW5leHBlY3RlZCBkaXJlY3Rpb24gZHVlIHRvIERJUiBiaXQNCi0gKiByZWFkb25seSBpbiBjZW50ZXIgYWxpZ25lZCBtb2RlLg0KLSAqIEBybXRvbGwgQ1IxICAgICAgICAgIERJUiAgICAgICAgICAgTExfVElNX1NldENvdW50ZXJNb2RlXG4NCi0gKiAgICAgICAgIENSMSAgICAgICAgICBDTVMgICAgICAgICAgIExMX1RJTV9TZXRDb3VudGVyTW9kZQ0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEBwYXJhbSAgQ291bnRlck1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ09VTlRFUk1PREVfVVANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ09VTlRFUk1PREVfRE9XTg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DT1VOVEVSTU9ERV9DRU5URVJfVVANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ09VTlRFUk1PREVfQ0VOVEVSX0RPV04NCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ09VTlRFUk1PREVfQ0VOVEVSX1VQX0RPV04NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fU2V0Q291bnRlck1vZGUoVElNX1R5cGVEZWYgKlRJTXgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENvdW50ZXJNb2RlKSB7DQotICBNT0RJRllfUkVHKFRJTXgtPkNSMSwgKFRJTV9DUjFfRElSIHwgVElNX0NSMV9DTVMpLCBDb3VudGVyTW9kZSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IGFjdHVhbCBjb3VudGVyIG1vZGUuDQotICogQG5vdGUgTWFjcm8gSVNfVElNX0NPVU5URVJfTU9ERV9TRUxFQ1RfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8NCi0gKiAgICAgICBjaGVjayB3aGV0aGVyIG9yIG5vdCB0aGUgY291bnRlciBtb2RlIHNlbGVjdGlvbiBmZWF0dXJlIGlzIHN1cHBvcnRlZA0KLSAqICAgICAgIGJ5IGEgdGltZXIgaW5zdGFuY2UuDQotICogQHJtdG9sbCBDUjEgICAgICAgICAgRElSICAgICAgICAgICBMTF9USU1fR2V0Q291bnRlck1vZGVcbg0KLSAqICAgICAgICAgQ1IxICAgICAgICAgIENNUyAgICAgICAgICAgTExfVElNX0dldENvdW50ZXJNb2RlDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DT1VOVEVSTU9ERV9VUA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DT1VOVEVSTU9ERV9ET1dODQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NPVU5URVJNT0RFX0NFTlRFUl9VUA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DT1VOVEVSTU9ERV9DRU5URVJfRE9XTg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DT1VOVEVSTU9ERV9DRU5URVJfVVBfRE9XTg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fR2V0Q291bnRlck1vZGUoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIHVpbnQzMl90IGNvdW50ZXJfbW9kZTsNCi0NCi0gIGNvdW50ZXJfbW9kZSA9ICh1aW50MzJfdCkoUkVBRF9CSVQoVElNeC0+Q1IxLCBUSU1fQ1IxX0NNUykpOw0KLQ0KLSAgaWYgKGNvdW50ZXJfbW9kZSA9PSAwVSkgew0KLSAgICBjb3VudGVyX21vZGUgPSAodWludDMyX3QpKFJFQURfQklUKFRJTXgtPkNSMSwgVElNX0NSMV9ESVIpKTsNCi0gIH0NCi0NCi0gIHJldHVybiBjb3VudGVyX21vZGU7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIGF1dG8tcmVsb2FkIChBUlIpIHByZWxvYWQuDQotICogQHJtdG9sbCBDUjEgICAgICAgICAgQVJQRSAgICAgICAgICBMTF9USU1fRW5hYmxlQVJSUHJlbG9hZA0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9FbmFibGVBUlJQcmVsb2FkKFRJTV9UeXBlRGVmICpUSU14KSB7DQotICBTRVRfQklUKFRJTXgtPkNSMSwgVElNX0NSMV9BUlBFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIGF1dG8tcmVsb2FkIChBUlIpIHByZWxvYWQuDQotICogQHJtdG9sbCBDUjEgICAgICAgICAgQVJQRSAgICAgICAgICBMTF9USU1fRGlzYWJsZUFSUlByZWxvYWQNCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZUFSUlByZWxvYWQoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIENMRUFSX0JJVChUSU14LT5DUjEsIFRJTV9DUjFfQVJQRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgYXV0by1yZWxvYWQgKEFSUikgcHJlbG9hZCBpcyBlbmFibGVkLg0KLSAqIEBybXRvbGwgQ1IxICAgICAgICAgIEFSUEUgICAgICAgICAgTExfVElNX0lzRW5hYmxlZEFSUlByZWxvYWQNCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzRW5hYmxlZEFSUlByZWxvYWQoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFRJTXgtPkNSMSwgVElNX0NSMV9BUlBFKSA9PSAoVElNX0NSMV9BUlBFKSkgPyAxVUwgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCB0aGUgZGl2aXNpb24gcmF0aW8gYmV0d2VlbiB0aGUgdGltZXIgY2xvY2sgIGFuZCB0aGUgc2FtcGxpbmcNCi0gKiBjbG9jayB1c2VkIGJ5IHRoZSBkZWFkLXRpbWUgZ2VuZXJhdG9ycyAod2hlbiBzdXBwb3J0ZWQpIGFuZCB0aGUgZGlnaXRhbA0KLSAqIGZpbHRlcnMuDQotICogQG5vdGUgTWFjcm8gSVNfVElNX0NMT0NLX0RJVklTSU9OX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrDQotICogICAgICAgd2hldGhlciBvciBub3QgdGhlIGNsb2NrIGRpdmlzaW9uIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSB0aW1lcg0KLSAqICAgICAgIGluc3RhbmNlLg0KLSAqIEBybXRvbGwgQ1IxICAgICAgICAgIENLRCAgICAgICAgICAgTExfVElNX1NldENsb2NrRGl2aXNpb24NCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcGFyYW0gIENsb2NrRGl2aXNpb24gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0xPQ0tESVZJU0lPTl9ESVYxDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NMT0NLRElWSVNJT05fRElWMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DTE9DS0RJVklTSU9OX0RJVjQNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fU2V0Q2xvY2tEaXZpc2lvbihUSU1fVHlwZURlZiAqVElNeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDbG9ja0RpdmlzaW9uKSB7DQotICBNT0RJRllfUkVHKFRJTXgtPkNSMSwgVElNX0NSMV9DS0QsIENsb2NrRGl2aXNpb24pOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCB0aGUgYWN0dWFsIGRpdmlzaW9uIHJhdGlvIGJldHdlZW4gdGhlIHRpbWVyIGNsb2NrICBhbmQgdGhlDQotICogc2FtcGxpbmcgY2xvY2sgdXNlZCBieSB0aGUgZGVhZC10aW1lIGdlbmVyYXRvcnMgKHdoZW4gc3VwcG9ydGVkKSBhbmQgdGhlDQotICogZGlnaXRhbCBmaWx0ZXJzLg0KLSAqIEBub3RlIE1hY3JvIElTX1RJTV9DTE9DS19ESVZJU0lPTl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaw0KLSAqICAgICAgIHdoZXRoZXIgb3Igbm90IHRoZSBjbG9jayBkaXZpc2lvbiBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgdGltZXINCi0gKiAgICAgICBpbnN0YW5jZS4NCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBDS0QgICAgICAgICAgIExMX1RJTV9HZXRDbG9ja0RpdmlzaW9uDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DTE9DS0RJVklTSU9OX0RJVjENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0xPQ0tESVZJU0lPTl9ESVYyDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NMT0NLRElWSVNJT05fRElWNA0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fR2V0Q2xvY2tEaXZpc2lvbihUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVElNeC0+Q1IxLCBUSU1fQ1IxX0NLRCkpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCB0aGUgY291bnRlciB2YWx1ZS4NCi0gKiBAbm90ZSBNYWNybyBJU19USU1fMzJCX0NPVU5URVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sNCi0gKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGEgMzIgYml0cyBjb3VudGVyLg0KLSAqIEBub3RlIElmIGRpdGhlcmluZyBpcyBhY3RpdmF0ZWQsIHBheSBhdHRlbnRpb24gdG8gdGhlIENvdW50ZXIgdmFsdWUNCi0gKiBpbnRlcnByZXRhdGlvbg0KLSAqIEBybXRvbGwgQ05UICAgICAgICAgIENOVCAgICAgICAgICAgTExfVElNX1NldENvdW50ZXINCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcGFyYW0gIENvdW50ZXIgQ291bnRlciB2YWx1ZSAoYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0weEZGRkYgb3INCi0gKiAweEZGRkZGRkZGKQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9TZXRDb3VudGVyKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDb3VudGVyKSB7DQotICBXUklURV9SRUcoVElNeC0+Q05ULCBDb3VudGVyKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgdGhlIGNvdW50ZXIgdmFsdWUuDQotICogQG5vdGUgTWFjcm8gSVNfVElNXzMyQl9DT1VOVEVSX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrDQotICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBhIDMyIGJpdHMgY291bnRlci4NCi0gKiBAbm90ZSBJZiBkaXRoZXJpbmcgaXMgYWN0aXZhdGVkLCBwYXkgYXR0ZW50aW9uIHRvIHRoZSBDb3VudGVyIHZhbHVlDQotICogaW50ZXJwcmV0YXRpb24NCi0gKiBAcm10b2xsIENOVCAgICAgICAgICBDTlQgICAgICAgICAgIExMX1RJTV9HZXRDb3VudGVyDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBDb3VudGVyIHZhbHVlIChiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTB4RkZGRiBvciAweEZGRkZGRkZGKQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fR2V0Q291bnRlcihUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9SRUcoVElNeC0+Q05UKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IHRoZSBjdXJyZW50IGRpcmVjdGlvbiBvZiB0aGUgY291bnRlcg0KLSAqIEBybXRvbGwgQ1IxICAgICAgICAgIERJUiAgICAgICAgICAgTExfVElNX0dldERpcmVjdGlvbg0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ09VTlRFUkRJUkVDVElPTl9VUA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DT1VOVEVSRElSRUNUSU9OX0RPV04NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0dldERpcmVjdGlvbihUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVElNeC0+Q1IxLCBUSU1fQ1IxX0RJUikpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCB0aGUgcHJlc2NhbGVyIHZhbHVlLg0KLSAqIEBub3RlIFRoZSBjb3VudGVyIGNsb2NrIGZyZXF1ZW5jeSBDS19DTlQgaXMgZXF1YWwgdG8gZkNLX1BTQyAvIChQU0NbMTU6MF0gKw0KLSAqIDEpLg0KLSAqIEBub3RlIFRoZSBwcmVzY2FsZXIgY2FuIGJlIGNoYW5nZWQgb24gdGhlIGZseSBhcyB0aGlzIGNvbnRyb2wgcmVnaXN0ZXIgaXMNCi0gKiBidWZmZXJlZC4gVGhlIG5ldyBwcmVzY2FsZXIgcmF0aW8gaXMgdGFrZW4gaW50byBhY2NvdW50IGF0IHRoZSBuZXh0IHVwZGF0ZQ0KLSAqIGV2ZW50Lg0KLSAqIEBub3RlIEhlbHBlciBtYWNybyBAcmVmIF9fTExfVElNX0NBTENfUFNDIGNhbiBiZSB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUNCi0gKiBQcmVzY2FsZXIgcGFyYW1ldGVyDQotICogQHJtdG9sbCBQU0MgICAgICAgICAgUFNDICAgICAgICAgICBMTF9USU1fU2V0UHJlc2NhbGVyDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHBhcmFtICBQcmVzY2FsZXIgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUzNQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9TZXRQcmVzY2FsZXIoVElNX1R5cGVEZWYgKlRJTXgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQcmVzY2FsZXIpIHsNCi0gIFdSSVRFX1JFRyhUSU14LT5QU0MsIFByZXNjYWxlcik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IHRoZSBwcmVzY2FsZXIgdmFsdWUuDQotICogQHJtdG9sbCBQU0MgICAgICAgICAgUFNDICAgICAgICAgICBMTF9USU1fR2V0UHJlc2NhbGVyDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCAgUHJlc2NhbGVyIHZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9NjU1MzUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0dldFByZXNjYWxlcihUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9SRUcoVElNeC0+UFNDKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IHRoZSBhdXRvLXJlbG9hZCB2YWx1ZS4NCi0gKiBAbm90ZSBUaGUgY291bnRlciBpcyBibG9ja2VkIHdoaWxlIHRoZSBhdXRvLXJlbG9hZCB2YWx1ZSBpcyBudWxsLg0KLSAqIEBub3RlIE1hY3JvIElTX1RJTV8zMkJfQ09VTlRFUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaw0KLSAqICAgICAgIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgYSAzMiBiaXRzIGNvdW50ZXIuDQotICogQG5vdGUgSGVscGVyIG1hY3JvIEByZWYgX19MTF9USU1fQ0FMQ19BUlIgY2FuIGJlIHVzZWQgdG8gY2FsY3VsYXRlIHRoZQ0KLSAqIEF1dG9SZWxvYWQgcGFyYW1ldGVyIEluIGNhc2UgZGl0aGVyaW5nIGlzIGFjdGl2YXRlZCxtYWNybw0KLSAqIF9fTExfVElNX0NBTENfQVJSX0RJVEhFUiBjYW4gYmUgdXNlZCBpbnN0ZWFkLCB0byBjYWxjdWxhdGUgdGhlIEF1dG9SZWxvYWQNCi0gKiAgICAgICBwYXJhbWV0ZXIuDQotICogQHJtdG9sbCBBUlIgICAgICAgICAgQVJSICAgICAgICAgICBMTF9USU1fU2V0QXV0b1JlbG9hZA0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEBwYXJhbSAgQXV0b1JlbG9hZCBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTY1NTM1DQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX1NldEF1dG9SZWxvYWQoVElNX1R5cGVEZWYgKlRJTXgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQXV0b1JlbG9hZCkgew0KLSAgV1JJVEVfUkVHKFRJTXgtPkFSUiwgQXV0b1JlbG9hZCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IHRoZSBhdXRvLXJlbG9hZCB2YWx1ZS4NCi0gKiBAcm10b2xsIEFSUiAgICAgICAgICBBUlIgICAgICAgICAgIExMX1RJTV9HZXRBdXRvUmVsb2FkDQotICogQG5vdGUgTWFjcm8gSVNfVElNXzMyQl9DT1VOVEVSX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrDQotICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBhIDMyIGJpdHMgY291bnRlci4NCi0gKiBAbm90ZSBJZiBkaXRoZXJpbmcgaXMgYWN0aXZhdGVkLCBwYXkgYXR0ZW50aW9uIHRvIHRoZSByZXR1cm5lZCB2YWx1ZQ0KLSAqIGludGVycHJldGF0aW9uDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBBdXRvLXJlbG9hZCB2YWx1ZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fR2V0QXV0b1JlbG9hZChUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9SRUcoVElNeC0+QVJSKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IHRoZSByZXBldGl0aW9uIGNvdW50ZXIgdmFsdWUuDQotICogQG5vdGUgRm9yIGFkdmFuY2VkIHRpbWVyIGluc3RhbmNlcyBSZXBldGl0aW9uQ291bnRlciBjYW4gYmUgdXAgdG8gNjU1MzUuDQotICogQG5vdGUgTWFjcm8gSVNfVElNX1JFUEVUSVRJT05fQ09VTlRFUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaw0KLSAqICAgICAgIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgYSByZXBldGl0aW9uIGNvdW50ZXIuDQotICogQHJtdG9sbCBSQ1IgICAgICAgICAgUkVQICAgICAgICAgICBMTF9USU1fU2V0UmVwZXRpdGlvbkNvdW50ZXINCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcGFyYW0gIFJlcGV0aXRpb25Db3VudGVyIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MjU1IG9yIDY1NTM1IGZvcg0KLSAqIGFkdmFuY2VkIHRpbWVyLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9TZXRSZXBldGl0aW9uQ291bnRlcihUSU1fVHlwZURlZiAqVElNeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUmVwZXRpdGlvbkNvdW50ZXIpIHsNCi0gIFdSSVRFX1JFRyhUSU14LT5SQ1IsIFJlcGV0aXRpb25Db3VudGVyKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgdGhlIHJlcGV0aXRpb24gY291bnRlciB2YWx1ZS4NCi0gKiBAbm90ZSBNYWNybyBJU19USU1fUkVQRVRJVElPTl9DT1VOVEVSX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrDQotICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBhIHJlcGV0aXRpb24gY291bnRlci4NCi0gKiBAcm10b2xsIFJDUiAgICAgICAgICBSRVAgICAgICAgICAgIExMX1RJTV9HZXRSZXBldGl0aW9uQ291bnRlcg0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgUmVwZXRpdGlvbiBjb3VudGVyIHZhbHVlDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9HZXRSZXBldGl0aW9uQ291bnRlcihUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9SRUcoVElNeC0+UkNSKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRm9yY2UgYSBjb250aW51b3VzIGNvcHkgb2YgdGhlIHVwZGF0ZSBpbnRlcnJ1cHQgZmxhZyAoVUlGKSBpbnRvIHRoZQ0KLSAqIHRpbWVyIGNvdW50ZXIgcmVnaXN0ZXIgKGJpdCAzMSkuDQotICogQG5vdGUgVGhpcyBhbGxvd3MgYm90aCB0aGUgY291bnRlciB2YWx1ZSBhbmQgYSBwb3RlbnRpYWwgcm9sbC1vdmVyIGNvbmRpdGlvbg0KLSAqIHNpZ25hbGxlZCBieSB0aGUgVUlGQ1BZIGZsYWcgdG8gYmUgcmVhZCBpbiBhbiBhdG9taWMgd2F5Lg0KLSAqIEBybXRvbGwgQ1IxICAgICAgICAgIFVJRlJFTUFQICAgICAgTExfVElNX0VuYWJsZVVJRlJlbWFwDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZVVJRlJlbWFwKFRJTV9UeXBlRGVmICpUSU14KSB7DQotICBTRVRfQklUKFRJTXgtPkNSMSwgVElNX0NSMV9VSUZSRU1BUCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSB1cGRhdGUgaW50ZXJydXB0IGZsYWcgKFVJRikgcmVtYXBwaW5nLg0KLSAqIEBybXRvbGwgQ1IxICAgICAgICAgIFVJRlJFTUFQICAgICAgTExfVElNX0Rpc2FibGVVSUZSZW1hcA0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlVUlGUmVtYXAoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIENMRUFSX0JJVChUSU14LT5DUjEsIFRJTV9DUjFfVUlGUkVNQVApOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgdXBkYXRlIGludGVycnVwdCBmbGFnIChVSUYpIGNvcHkgaXMgc2V0Lg0KLSAqIEBwYXJhbSAgQ291bnRlciBDb3VudGVyIHZhbHVlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0FjdGl2ZVVJRkNQWSh1aW50MzJfdCBDb3VudGVyKSB7DQotICByZXR1cm4gKCgoQ291bnRlciAmIFRJTV9DTlRfVUlGQ1BZKSA9PSAoVElNX0NOVF9VSUZDUFkpKSA/IDFVTCA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIGRpdGhlcmluZy4NCi0gKiBAbm90ZSBNYWNybyBJU19USU1fRElUSEVSSU5HX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3INCi0gKiBub3QgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBkaXRoZXJpbmcuDQotICogQHJtdG9sbCBDUjEgICAgICAgICAgRElUSEVOICAgICAgICAgIExMX1RJTV9FbmFibGVEaXRoZXJpbmcNCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlRGl0aGVyaW5nKFRJTV9UeXBlRGVmICpUSU14KSB7DQotICBTRVRfQklUKFRJTXgtPkNSMSwgVElNX0NSMV9ESVRIRU4pOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgZGl0aGVyaW5nLg0KLSAqIEBub3RlIE1hY3JvIElTX1RJTV9ESVRIRVJJTkdfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvcg0KLSAqIG5vdCBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGRpdGhlcmluZy4NCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBESVRIRU4gICAgICAgICAgTExfVElNX0Rpc2FibGVEaXRoZXJpbmcNCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZURpdGhlcmluZyhUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgQ0xFQVJfQklUKFRJTXgtPkNSMSwgVElNX0NSMV9ESVRIRU4pOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEluZGljYXRlcyB3aGV0aGVyIGRpdGhlcmluZyBpcyBhY3RpdmF0ZWQuDQotICogQG5vdGUgTWFjcm8gSVNfVElNX0RJVEhFUklOR19JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yDQotICogbm90IGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgZGl0aGVyaW5nLg0KLSAqIEBybXRvbGwgQ1IxICAgICAgICAgIERJVEhFTiAgICAgICAgICBMTF9USU1fSXNFbmFibGVkRGl0aGVyaW5nDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0VuYWJsZWREaXRoZXJpbmcoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFRJTXgtPkNSMSwgVElNX0NSMV9ESVRIRU4pID09IChUSU1fQ1IxX0RJVEhFTikpID8gMVVMDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBUSU1fTExfRUZfQ2FwdHVyZV9Db21wYXJlIENhcHR1cmUgQ29tcGFyZSBjb25maWd1cmF0aW9uDQotICogQHsNCi0gKi8NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSAgdGhlIGNhcHR1cmUvY29tcGFyZSBjb250cm9sIGJpdHMgKENDeEUsIENDeE5FIGFuZCBPQ3hNKQ0KLSAqIHByZWxvYWQuDQotICogQG5vdGUgQ0N4RSwgQ0N4TkUgYW5kIE9DeE0gYml0cyBhcmUgcHJlbG9hZGVkLCBhZnRlciBoYXZpbmcgYmVlbiB3cml0dGVuLA0KLSAqICAgICAgIHRoZXkgYXJlIHVwZGF0ZWQgb25seSB3aGVuIGEgY29tbXV0YXRpb24gZXZlbnQgKENPTSkgb2NjdXJzLg0KLSAqIEBub3RlIE9ubHkgb24gY2hhbm5lbHMgdGhhdCBoYXZlIGEgY29tcGxlbWVudGFyeSBvdXRwdXQuDQotICogQG5vdGUgTWFjcm8gSVNfVElNX0NPTU1VVEFUSU9OX0VWRU5UX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrDQotICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBpcyBhYmxlIHRvIGdlbmVyYXRlIGEgY29tbXV0YXRpb24NCi0gKiBldmVudC4NCi0gKiBAcm10b2xsIENSMiAgICAgICAgICBDQ1BDICAgICAgICAgIExMX1RJTV9DQ19FbmFibGVQcmVsb2FkDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NDX0VuYWJsZVByZWxvYWQoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIFNFVF9CSVQoVElNeC0+Q1IyLCBUSU1fQ1IyX0NDUEMpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgIHRoZSBjYXB0dXJlL2NvbXBhcmUgY29udHJvbCBiaXRzIChDQ3hFLCBDQ3hORSBhbmQgT0N4TSkNCi0gKiBwcmVsb2FkLg0KLSAqIEBub3RlIE1hY3JvIElTX1RJTV9DT01NVVRBVElPTl9FVkVOVF9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaw0KLSAqICAgICAgIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2UgaXMgYWJsZSB0byBnZW5lcmF0ZSBhIGNvbW11dGF0aW9uDQotICogZXZlbnQuDQotICogQHJtdG9sbCBDUjIgICAgICAgICAgQ0NQQyAgICAgICAgICBMTF9USU1fQ0NfRGlzYWJsZVByZWxvYWQNCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ0NfRGlzYWJsZVByZWxvYWQoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIENMRUFSX0JJVChUSU14LT5DUjIsIFRJTV9DUjJfQ0NQQyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IHRoZSB1cGRhdGVkIHNvdXJjZSBvZiB0aGUgY2FwdHVyZS9jb21wYXJlIGNvbnRyb2wgYml0cyAoQ0N4RSwNCi0gKiBDQ3hORSBhbmQgT0N4TSkuDQotICogQG5vdGUgTWFjcm8gSVNfVElNX0NPTU1VVEFUSU9OX0VWRU5UX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrDQotICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBpcyBhYmxlIHRvIGdlbmVyYXRlIGEgY29tbXV0YXRpb24NCi0gKiBldmVudC4NCi0gKiBAcm10b2xsIENSMiAgICAgICAgICBDQ1VTICAgICAgICAgIExMX1RJTV9DQ19TZXRVcGRhdGUNCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcGFyYW0gIENDVXBkYXRlU291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NDVVBEQVRFU09VUkNFX0NPTUdfT05MWQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DQ1VQREFURVNPVVJDRV9DT01HX0FORF9UUkdJDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NDX1NldFVwZGF0ZShUSU1fVHlwZURlZiAqVElNeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENDVXBkYXRlU291cmNlKSB7DQotICBNT0RJRllfUkVHKFRJTXgtPkNSMiwgVElNX0NSMl9DQ1VTLCBDQ1VwZGF0ZVNvdXJjZSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IHRoZSB0cmlnZ2VyIG9mIHRoZSBjYXB0dXJlL2NvbXBhcmUgRE1BIHJlcXVlc3QuDQotICogQHJtdG9sbCBDUjIgICAgICAgICAgQ0NEUyAgICAgICAgICBMTF9USU1fQ0NfU2V0RE1BUmVxVHJpZ2dlcg0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEBwYXJhbSAgRE1BUmVxVHJpZ2dlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DQ0RNQVJFUVVFU1RfQ0MNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0NETUFSRVFVRVNUX1VQREFURQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9DQ19TZXRETUFSZXFUcmlnZ2VyKFRJTV9UeXBlRGVmICpUSU14LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IERNQVJlcVRyaWdnZXIpIHsNCi0gIE1PRElGWV9SRUcoVElNeC0+Q1IyLCBUSU1fQ1IyX0NDRFMsIERNQVJlcVRyaWdnZXIpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBhY3R1YWwgdHJpZ2dlciBvZiB0aGUgY2FwdHVyZS9jb21wYXJlIERNQSByZXF1ZXN0Lg0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgIENDRFMgICAgICAgICAgTExfVElNX0NDX0dldERNQVJlcVRyaWdnZXINCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NDRE1BUkVRVUVTVF9DQw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DQ0RNQVJFUVVFU1RfVVBEQVRFDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9DQ19HZXRETUFSZXFUcmlnZ2VyKFRJTV9UeXBlRGVmICpUSU14KSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChUSU14LT5DUjIsIFRJTV9DUjJfQ0NEUykpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCB0aGUgbG9jayBsZXZlbCB0byBmcmVlemUgdGhlDQotICogICAgICAgICBjb25maWd1cmF0aW9uIG9mIHNldmVyYWwgY2FwdHVyZS9jb21wYXJlIHBhcmFtZXRlcnMuDQotICogQG5vdGUgTWFjcm8gSVNfVElNX0JSRUFLX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90DQotICogICAgICAgdGhlIGxvY2sgbWVjaGFuaXNtIGlzIHN1cHBvcnRlZCBieSBhIHRpbWVyIGluc3RhbmNlLg0KLSAqIEBybXRvbGwgQkRUUiAgICAgICAgIExPQ0sgICAgICAgICAgTExfVElNX0NDX1NldExvY2tMZXZlbA0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEBwYXJhbSAgTG9ja0xldmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0xPQ0tMRVZFTF9PRkYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fTE9DS0xFVkVMXzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fTE9DS0xFVkVMXzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fTE9DS0xFVkVMXzMNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ0NfU2V0TG9ja0xldmVsKFRJTV9UeXBlRGVmICpUSU14LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgTG9ja0xldmVsKSB7DQotICBNT0RJRllfUkVHKFRJTXgtPkJEVFIsIFRJTV9CRFRSX0xPQ0ssIExvY2tMZXZlbCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIGNhcHR1cmUvY29tcGFyZSBjaGFubmVscy4NCi0gKiBAcm10b2xsIENDRVIgICAgICAgICBDQzFFICAgICAgICAgIExMX1RJTV9DQ19FbmFibGVDaGFubmVsXG4NCi0gKiAgICAgICAgIENDRVIgICAgICAgICBDQzFORSAgICAgICAgIExMX1RJTV9DQ19FbmFibGVDaGFubmVsXG4NCi0gKiAgICAgICAgIENDRVIgICAgICAgICBDQzJFICAgICAgICAgIExMX1RJTV9DQ19FbmFibGVDaGFubmVsXG4NCi0gKiAgICAgICAgIENDRVIgICAgICAgICBDQzJORSAgICAgICAgIExMX1RJTV9DQ19FbmFibGVDaGFubmVsXG4NCi0gKiAgICAgICAgIENDRVIgICAgICAgICBDQzNFICAgICAgICAgIExMX1RJTV9DQ19FbmFibGVDaGFubmVsXG4NCi0gKiAgICAgICAgIENDRVIgICAgICAgICBDQzNORSAgICAgICAgIExMX1RJTV9DQ19FbmFibGVDaGFubmVsXG4NCi0gKiAgICAgICAgIENDRVIgICAgICAgICBDQzRFICAgICAgICAgIExMX1RJTV9DQ19FbmFibGVDaGFubmVsXG4NCi0gKiAgICAgICAgIENDRVIgICAgICAgICBDQzRORSAgICAgICAgIExMX1RJTV9DQ19FbmFibGVDaGFubmVsXG4NCi0gKiAgICAgICAgIENDRVIgICAgICAgICBDQzVFICAgICAgICAgIExMX1RJTV9DQ19FbmFibGVDaGFubmVsXG4NCi0gKiAgICAgICAgIENDRVIgICAgICAgICBDQzZFICAgICAgICAgIExMX1RJTV9DQ19FbmFibGVDaGFubmVsDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHBhcmFtICBDaGFubmVscyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDFODQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyTg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIM04NCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDRODQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g1DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g2DQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NDX0VuYWJsZUNoYW5uZWwoVElNX1R5cGVEZWYgKlRJTXgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbHMpIHsNCi0gIFNFVF9CSVQoVElNeC0+Q0NFUiwgQ2hhbm5lbHMpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgY2FwdHVyZS9jb21wYXJlIGNoYW5uZWxzLg0KLSAqIEBybXRvbGwgQ0NFUiAgICAgICAgIENDMUUgICAgICAgICAgTExfVElNX0NDX0Rpc2FibGVDaGFubmVsXG4NCi0gKiAgICAgICAgIENDRVIgICAgICAgICBDQzFORSAgICAgICAgIExMX1RJTV9DQ19EaXNhYmxlQ2hhbm5lbFxuDQotICogICAgICAgICBDQ0VSICAgICAgICAgQ0MyRSAgICAgICAgICBMTF9USU1fQ0NfRGlzYWJsZUNoYW5uZWxcbg0KLSAqICAgICAgICAgQ0NFUiAgICAgICAgIENDMk5FICAgICAgICAgTExfVElNX0NDX0Rpc2FibGVDaGFubmVsXG4NCi0gKiAgICAgICAgIENDRVIgICAgICAgICBDQzNFICAgICAgICAgIExMX1RJTV9DQ19EaXNhYmxlQ2hhbm5lbFxuDQotICogICAgICAgICBDQ0VSICAgICAgICAgQ0MzTkUgICAgICAgICBMTF9USU1fQ0NfRGlzYWJsZUNoYW5uZWxcbg0KLSAqICAgICAgICAgQ0NFUiAgICAgICAgIENDNEUgICAgICAgICAgTExfVElNX0NDX0Rpc2FibGVDaGFubmVsXG4NCi0gKiAgICAgICAgIENDRVIgICAgICAgICBDQzRORSAgICAgICAgIExMX1RJTV9DQ19EaXNhYmxlQ2hhbm5lbFxuDQotICogICAgICAgICBDQ0VSICAgICAgICAgQ0M1RSAgICAgICAgICBMTF9USU1fQ0NfRGlzYWJsZUNoYW5uZWxcbg0KLSAqICAgICAgICAgQ0NFUiAgICAgICAgIENDNkUgICAgICAgICAgTExfVElNX0NDX0Rpc2FibGVDaGFubmVsDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHBhcmFtICBDaGFubmVscyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDFODQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyTg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIM04NCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDRODQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g1DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g2DQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NDX0Rpc2FibGVDaGFubmVsKFRJTV9UeXBlRGVmICpUSU14LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVscykgew0KLSAgQ0xFQVJfQklUKFRJTXgtPkNDRVIsIENoYW5uZWxzKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIGNoYW5uZWwocykgaXMoYXJlKSBlbmFibGVkLg0KLSAqIEBybXRvbGwgQ0NFUiAgICAgICAgIENDMUUgICAgICAgICAgTExfVElNX0NDX0lzRW5hYmxlZENoYW5uZWxcbg0KLSAqICAgICAgICAgQ0NFUiAgICAgICAgIENDMU5FICAgICAgICAgTExfVElNX0NDX0lzRW5hYmxlZENoYW5uZWxcbg0KLSAqICAgICAgICAgQ0NFUiAgICAgICAgIENDMkUgICAgICAgICAgTExfVElNX0NDX0lzRW5hYmxlZENoYW5uZWxcbg0KLSAqICAgICAgICAgQ0NFUiAgICAgICAgIENDMk5FICAgICAgICAgTExfVElNX0NDX0lzRW5hYmxlZENoYW5uZWxcbg0KLSAqICAgICAgICAgQ0NFUiAgICAgICAgIENDM0UgICAgICAgICAgTExfVElNX0NDX0lzRW5hYmxlZENoYW5uZWxcbg0KLSAqICAgICAgICAgQ0NFUiAgICAgICAgIENDM05FICAgICAgICAgTExfVElNX0NDX0lzRW5hYmxlZENoYW5uZWxcbg0KLSAqICAgICAgICAgQ0NFUiAgICAgICAgIENDNEUgICAgICAgICAgTExfVElNX0NDX0lzRW5hYmxlZENoYW5uZWxcbg0KLSAqICAgICAgICAgQ0NFUiAgICAgICAgIENDNE5FICAgICAgICAgTExfVElNX0NDX0lzRW5hYmxlZENoYW5uZWxcbg0KLSAqICAgICAgICAgQ0NFUiAgICAgICAgIENDNUUgICAgICAgICAgTExfVElNX0NDX0lzRW5hYmxlZENoYW5uZWxcbg0KLSAqICAgICAgICAgQ0NFUiAgICAgICAgIENDNkUgICAgICAgICAgTExfVElNX0NDX0lzRW5hYmxlZENoYW5uZWwNCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcGFyYW0gIENoYW5uZWxzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMU4NCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDJODQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzTg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINE4NCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDYNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0NDX0lzRW5hYmxlZENoYW5uZWwoVElNX1R5cGVEZWYgKlRJTXgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWxzKSB7DQotICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5DQ0VSLCBDaGFubmVscykgPT0gKENoYW5uZWxzKSkgPyAxVUwgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0xMX0VGX091dHB1dF9DaGFubmVsIE91dHB1dCBjaGFubmVsIGNvbmZpZ3VyYXRpb24NCi0gKiBAew0KLSAqLw0KLS8qKg0KLSAqIEBicmllZiAgQ29uZmlndXJlIGFuIG91dHB1dCBjaGFubmVsLg0KLSAqIEBybXRvbGwgQ0NNUjEgICAgICAgIENDMVMgICAgICAgICAgTExfVElNX09DX0NvbmZpZ091dHB1dFxuDQotICogICAgICAgICBDQ01SMSAgICAgICAgQ0MyUyAgICAgICAgICBMTF9USU1fT0NfQ29uZmlnT3V0cHV0XG4NCi0gKiAgICAgICAgIENDTVIyICAgICAgICBDQzNTICAgICAgICAgIExMX1RJTV9PQ19Db25maWdPdXRwdXRcbg0KLSAqICAgICAgICAgQ0NNUjIgICAgICAgIENDNFMgICAgICAgICAgTExfVElNX09DX0NvbmZpZ091dHB1dFxuDQotICogICAgICAgICBDQ01SMyAgICAgICAgQ0M1UyAgICAgICAgICBMTF9USU1fT0NfQ29uZmlnT3V0cHV0XG4NCi0gKiAgICAgICAgIENDTVIzICAgICAgICBDQzZTICAgICAgICAgIExMX1RJTV9PQ19Db25maWdPdXRwdXRcbg0KLSAqICAgICAgICAgQ0NFUiAgICAgICAgIENDMVAgICAgICAgICAgTExfVElNX09DX0NvbmZpZ091dHB1dFxuDQotICogICAgICAgICBDQ0VSICAgICAgICAgQ0MyUCAgICAgICAgICBMTF9USU1fT0NfQ29uZmlnT3V0cHV0XG4NCi0gKiAgICAgICAgIENDRVIgICAgICAgICBDQzNQICAgICAgICAgIExMX1RJTV9PQ19Db25maWdPdXRwdXRcbg0KLSAqICAgICAgICAgQ0NFUiAgICAgICAgIENDNFAgICAgICAgICAgTExfVElNX09DX0NvbmZpZ091dHB1dFxuDQotICogICAgICAgICBDQ0VSICAgICAgICAgQ0M1UCAgICAgICAgICBMTF9USU1fT0NfQ29uZmlnT3V0cHV0XG4NCi0gKiAgICAgICAgIENDRVIgICAgICAgICBDQzZQICAgICAgICAgIExMX1RJTV9PQ19Db25maWdPdXRwdXRcbg0KLSAqICAgICAgICAgQ1IyICAgICAgICAgIE9JUzEgICAgICAgICAgTExfVElNX09DX0NvbmZpZ091dHB1dFxuDQotICogICAgICAgICBDUjIgICAgICAgICAgT0lTMiAgICAgICAgICBMTF9USU1fT0NfQ29uZmlnT3V0cHV0XG4NCi0gKiAgICAgICAgIENSMiAgICAgICAgICBPSVMzICAgICAgICAgIExMX1RJTV9PQ19Db25maWdPdXRwdXRcbg0KLSAqICAgICAgICAgQ1IyICAgICAgICAgIE9JUzQgICAgICAgICAgTExfVElNX09DX0NvbmZpZ091dHB1dFxuDQotICogICAgICAgICBDUjIgICAgICAgICAgT0lTNSAgICAgICAgICBMTF9USU1fT0NfQ29uZmlnT3V0cHV0XG4NCi0gKiAgICAgICAgIENSMiAgICAgICAgICBPSVM2ICAgICAgICAgIExMX1RJTV9PQ19Db25maWdPdXRwdXQNCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDYNCi0gKiBAcGFyYW0gIENvbmZpZ3VyYXRpb24gVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIGNvbWJpbmF0aW9uIG9mIGFsbCB0aGUNCi0gKiBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ1BPTEFSSVRZX0hJR0ggb3IgQHJlZiBMTF9USU1fT0NQT0xBUklUWV9MT1cNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NJRExFU1RBVEVfTE9XIG9yIEByZWYgTExfVElNX09DSURMRVNUQVRFX0hJR0gNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fT0NfQ29uZmlnT3V0cHV0KFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDaGFubmVsLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ29uZmlndXJhdGlvbikgew0KLSAgdWludDhfdCBpQ2hhbm5lbCA9IFRJTV9HRVRfQ0hBTk5FTF9JTkRFWChDaGFubmVsKTsNCi0gIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgoDQotICAgICAgdWludDMyX3QpKCh1aW50MzJfdCkoJlRJTXgtPkNDTVIxKSArIE9GRlNFVF9UQUJfQ0NNUnhbaUNoYW5uZWxdKSk7DQotICBDTEVBUl9CSVQoKnBSZWcsIChUSU1fQ0NNUjFfQ0MxUyA8PCBTSElGVF9UQUJfT0N4eFtpQ2hhbm5lbF0pKTsNCi0gIE1PRElGWV9SRUcoVElNeC0+Q0NFUiwgKFRJTV9DQ0VSX0NDMVAgPDwgU0hJRlRfVEFCX0NDeFBbaUNoYW5uZWxdKSwNCi0gICAgICAgICAgICAgKENvbmZpZ3VyYXRpb24gJiBUSU1fQ0NFUl9DQzFQKSA8PCBTSElGVF9UQUJfQ0N4UFtpQ2hhbm5lbF0pOw0KLSAgTU9ESUZZX1JFRyhUSU14LT5DUjIsIChUSU1fQ1IyX09JUzEgPDwgU0hJRlRfVEFCX09JU3hbaUNoYW5uZWxdKSwNCi0gICAgICAgICAgICAgKENvbmZpZ3VyYXRpb24gJiBUSU1fQ1IyX09JUzEpIDw8IFNISUZUX1RBQl9PSVN4W2lDaGFubmVsXSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGVmaW5lIHRoZSBiZWhhdmlvciBvZiB0aGUgb3V0cHV0IHJlZmVyZW5jZSBzaWduYWwgT0N4UkVGIGZyb20gd2hpY2gNCi0gKiAgICAgICAgIE9DeCBhbmQgT0N4TiAod2hlbiByZWxldmFudCkgYXJlIGRlcml2ZWQuDQotICogQHJtdG9sbCBDQ01SMSAgICAgICAgT0MxTSAgICAgICAgICBMTF9USU1fT0NfU2V0TW9kZVxuDQotICogICAgICAgICBDQ01SMSAgICAgICAgT0MyTSAgICAgICAgICBMTF9USU1fT0NfU2V0TW9kZVxuDQotICogICAgICAgICBDQ01SMiAgICAgICAgT0MzTSAgICAgICAgICBMTF9USU1fT0NfU2V0TW9kZVxuDQotICogICAgICAgICBDQ01SMiAgICAgICAgT0M0TSAgICAgICAgICBMTF9USU1fT0NfU2V0TW9kZVxuDQotICogICAgICAgICBDQ01SMyAgICAgICAgT0M1TSAgICAgICAgICBMTF9USU1fT0NfU2V0TW9kZVxuDQotICogICAgICAgICBDQ01SMyAgICAgICAgT0M2TSAgICAgICAgICBMTF9USU1fT0NfU2V0TW9kZQ0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINg0KLSAqIEBwYXJhbSAgTW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ01PREVfRlJPWkVODQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9BQ1RJVkUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NNT0RFX0lOQUNUSVZFDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9UT0dHTEUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NNT0RFX0ZPUkNFRF9JTkFDVElWRQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ01PREVfRk9SQ0VEX0FDVElWRQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ01PREVfUFdNMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ01PREVfUFdNMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ01PREVfUkVUUklHX09QTTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NNT0RFX1JFVFJJR19PUE0yDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9DT01CSU5FRF9QV00xDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9DT01CSU5FRF9QV00yDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9BU1NZTUVUUklDX1BXTTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NNT0RFX0FTU1lNRVRSSUNfUFdNMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ01PREVfUFVMU0VfT05fQ09NUEFSRSAgIChmb3IgY2hhbm5lbCAzIG9yIGNoYW5uZWwNCi0gKiA0IG9ubHkpDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9ESVJFQ1RJT05fT1VUUFVUICAgKGZvciBjaGFubmVsIDMgb3IgY2hhbm5lbA0KLSAqIDQgb25seSkNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fT0NfU2V0TW9kZShUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBNb2RlKSB7DQotICB1aW50OF90IGlDaGFubmVsID0gVElNX0dFVF9DSEFOTkVMX0lOREVYKENoYW5uZWwpOw0KLSAgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCgNCi0gICAgICB1aW50MzJfdCkoKHVpbnQzMl90KSgmVElNeC0+Q0NNUjEpICsgT0ZGU0VUX1RBQl9DQ01SeFtpQ2hhbm5lbF0pKTsNCi0gIE1PRElGWV9SRUcoKnBSZWcsDQotICAgICAgICAgICAgICgoVElNX0NDTVIxX09DMU0gfCBUSU1fQ0NNUjFfQ0MxUykgPDwgU0hJRlRfVEFCX09DeHhbaUNoYW5uZWxdKSwNCi0gICAgICAgICAgICAgTW9kZSA8PCBTSElGVF9UQUJfT0N4eFtpQ2hhbm5lbF0pOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCB0aGUgb3V0cHV0IGNvbXBhcmUgbW9kZSBvZiBhbiBvdXRwdXQgY2hhbm5lbC4NCi0gKiBAcm10b2xsIENDTVIxICAgICAgICBPQzFNICAgICAgICAgIExMX1RJTV9PQ19HZXRNb2RlXG4NCi0gKiAgICAgICAgIENDTVIxICAgICAgICBPQzJNICAgICAgICAgIExMX1RJTV9PQ19HZXRNb2RlXG4NCi0gKiAgICAgICAgIENDTVIyICAgICAgICBPQzNNICAgICAgICAgIExMX1RJTV9PQ19HZXRNb2RlXG4NCi0gKiAgICAgICAgIENDTVIyICAgICAgICBPQzRNICAgICAgICAgIExMX1RJTV9PQ19HZXRNb2RlXG4NCi0gKiAgICAgICAgIENDTVIzICAgICAgICBPQzVNICAgICAgICAgIExMX1RJTV9PQ19HZXRNb2RlXG4NCi0gKiAgICAgICAgIENDTVIzICAgICAgICBPQzZNICAgICAgICAgIExMX1RJTV9PQ19HZXRNb2RlDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g1DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g2DQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ01PREVfRlJPWkVODQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9BQ1RJVkUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NNT0RFX0lOQUNUSVZFDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9UT0dHTEUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NNT0RFX0ZPUkNFRF9JTkFDVElWRQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ01PREVfRk9SQ0VEX0FDVElWRQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ01PREVfUFdNMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ01PREVfUFdNMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ01PREVfUkVUUklHX09QTTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NNT0RFX1JFVFJJR19PUE0yDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9DT01CSU5FRF9QV00xDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9DT01CSU5FRF9QV00yDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9BU1NZTUVUUklDX1BXTTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NNT0RFX0FTU1lNRVRSSUNfUFdNMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ01PREVfUFVMU0VfT05fQ09NUEFSRSAgIChmb3IgY2hhbm5lbCAzIG9yIGNoYW5uZWwNCi0gKiA0IG9ubHkpDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9ESVJFQ1RJT05fT1VUUFVUICAgKGZvciBjaGFubmVsIDMgb3IgY2hhbm5lbA0KLSAqIDQgb25seSkNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX09DX0dldE1vZGUoVElNX1R5cGVEZWYgKlRJTXgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpIHsNCi0gIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7DQotICBjb25zdCBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKA0KLSAgICAgIHVpbnQzMl90KSgodWludDMyX3QpKCZUSU14LT5DQ01SMSkgKyBPRkZTRVRfVEFCX0NDTVJ4W2lDaGFubmVsXSkpOw0KLSAgcmV0dXJuIChSRUFEX0JJVCgqcFJlZywgKChUSU1fQ0NNUjFfT0MxTSB8IFRJTV9DQ01SMV9DQzFTKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IFNISUZUX1RBQl9PQ3h4W2lDaGFubmVsXSkpID4+DQotICAgICAgICAgIFNISUZUX1RBQl9PQ3h4W2lDaGFubmVsXSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IHRoZSBwb2xhcml0eSBvZiBhbiBvdXRwdXQgY2hhbm5lbC4NCi0gKiBAcm10b2xsIENDRVIgICAgICAgICBDQzFQICAgICAgICAgIExMX1RJTV9PQ19TZXRQb2xhcml0eVxuDQotICogICAgICAgICBDQ0VSICAgICAgICAgQ0MxTlAgICAgICAgICBMTF9USU1fT0NfU2V0UG9sYXJpdHlcbg0KLSAqICAgICAgICAgQ0NFUiAgICAgICAgIENDMlAgICAgICAgICAgTExfVElNX09DX1NldFBvbGFyaXR5XG4NCi0gKiAgICAgICAgIENDRVIgICAgICAgICBDQzJOUCAgICAgICAgIExMX1RJTV9PQ19TZXRQb2xhcml0eVxuDQotICogICAgICAgICBDQ0VSICAgICAgICAgQ0MzUCAgICAgICAgICBMTF9USU1fT0NfU2V0UG9sYXJpdHlcbg0KLSAqICAgICAgICAgQ0NFUiAgICAgICAgIENDM05QICAgICAgICAgTExfVElNX09DX1NldFBvbGFyaXR5XG4NCi0gKiAgICAgICAgIENDRVIgICAgICAgICBDQzRQICAgICAgICAgIExMX1RJTV9PQ19TZXRQb2xhcml0eVxuDQotICogICAgICAgICBDQ0VSICAgICAgICAgQ0M0TlAgICAgICAgICBMTF9USU1fT0NfU2V0UG9sYXJpdHlcbg0KLSAqICAgICAgICAgQ0NFUiAgICAgICAgIENDNVAgICAgICAgICAgTExfVElNX09DX1NldFBvbGFyaXR5XG4NCi0gKiAgICAgICAgIENDRVIgICAgICAgICBDQzZQICAgICAgICAgIExMX1RJTV9PQ19TZXRQb2xhcml0eQ0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMU4NCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDJODQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzTg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINE4NCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDYNCi0gKiBAcGFyYW0gIFBvbGFyaXR5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DUE9MQVJJVFlfSElHSA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ1BPTEFSSVRZX0xPVw0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9PQ19TZXRQb2xhcml0eShUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUG9sYXJpdHkpIHsNCi0gIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7DQotICBNT0RJRllfUkVHKFRJTXgtPkNDRVIsIChUSU1fQ0NFUl9DQzFQIDw8IFNISUZUX1RBQl9DQ3hQW2lDaGFubmVsXSksDQotICAgICAgICAgICAgIFBvbGFyaXR5IDw8IFNISUZUX1RBQl9DQ3hQW2lDaGFubmVsXSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IHRoZSBwb2xhcml0eSBvZiBhbiBvdXRwdXQgY2hhbm5lbC4NCi0gKiBAcm10b2xsIENDRVIgICAgICAgICBDQzFQICAgICAgICAgIExMX1RJTV9PQ19HZXRQb2xhcml0eVxuDQotICogICAgICAgICBDQ0VSICAgICAgICAgQ0MxTlAgICAgICAgICBMTF9USU1fT0NfR2V0UG9sYXJpdHlcbg0KLSAqICAgICAgICAgQ0NFUiAgICAgICAgIENDMlAgICAgICAgICAgTExfVElNX09DX0dldFBvbGFyaXR5XG4NCi0gKiAgICAgICAgIENDRVIgICAgICAgICBDQzJOUCAgICAgICAgIExMX1RJTV9PQ19HZXRQb2xhcml0eVxuDQotICogICAgICAgICBDQ0VSICAgICAgICAgQ0MzUCAgICAgICAgICBMTF9USU1fT0NfR2V0UG9sYXJpdHlcbg0KLSAqICAgICAgICAgQ0NFUiAgICAgICAgIENDM05QICAgICAgICAgTExfVElNX09DX0dldFBvbGFyaXR5XG4NCi0gKiAgICAgICAgIENDRVIgICAgICAgICBDQzRQICAgICAgICAgIExMX1RJTV9PQ19HZXRQb2xhcml0eVxuDQotICogICAgICAgICBDQ0VSICAgICAgICAgQ0M0TlAgICAgICAgICBMTF9USU1fT0NfR2V0UG9sYXJpdHlcbg0KLSAqICAgICAgICAgQ0NFUiAgICAgICAgIENDNVAgICAgICAgICAgTExfVElNX09DX0dldFBvbGFyaXR5XG4NCi0gKiAgICAgICAgIENDRVIgICAgICAgICBDQzZQICAgICAgICAgIExMX1RJTV9PQ19HZXRQb2xhcml0eQ0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMU4NCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDJODQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzTg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINE4NCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDYNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DUE9MQVJJVFlfSElHSA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ1BPTEFSSVRZX0xPVw0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fT0NfR2V0UG9sYXJpdHkoVElNX1R5cGVEZWYgKlRJTXgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKSB7DQotICB1aW50OF90IGlDaGFubmVsID0gVElNX0dFVF9DSEFOTkVMX0lOREVYKENoYW5uZWwpOw0KLSAgcmV0dXJuIChSRUFEX0JJVChUSU14LT5DQ0VSLCAoVElNX0NDRVJfQ0MxUCA8PCBTSElGVF9UQUJfQ0N4UFtpQ2hhbm5lbF0pKSA+Pg0KLSAgICAgICAgICBTSElGVF9UQUJfQ0N4UFtpQ2hhbm5lbF0pOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCB0aGUgSURMRSBzdGF0ZSBvZiBhbiBvdXRwdXQgY2hhbm5lbA0KLSAqIEBub3RlIFRoaXMgZnVuY3Rpb24gaXMgc2lnbmlmaWNhbnQgb25seSBmb3IgdGhlIHRpbWVyIGluc3RhbmNlcw0KLSAqICAgICAgIHN1cHBvcnRpbmcgdGhlIGJyZWFrIGZlYXR1cmUuIE1hY3JvIElTX1RJTV9CUkVBS19JTlNUQU5DRShUSU14KQ0KLSAqICAgICAgIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMNCi0gKiAgICAgICBhIGJyZWFrIGlucHV0Lg0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgT0lTMSAgICAgICAgICBMTF9USU1fT0NfU2V0SWRsZVN0YXRlXG4NCi0gKiAgICAgICAgIENSMiAgICAgICAgIE9JUzJOICAgICAgICAgTExfVElNX09DX1NldElkbGVTdGF0ZVxuDQotICogICAgICAgICBDUjIgICAgICAgICBPSVMyICAgICAgICAgIExMX1RJTV9PQ19TZXRJZGxlU3RhdGVcbg0KLSAqICAgICAgICAgQ1IyICAgICAgICAgT0lTMk4gICAgICAgICBMTF9USU1fT0NfU2V0SWRsZVN0YXRlXG4NCi0gKiAgICAgICAgIENSMiAgICAgICAgIE9JUzMgICAgICAgICAgTExfVElNX09DX1NldElkbGVTdGF0ZVxuDQotICogICAgICAgICBDUjIgICAgICAgICBPSVMzTiAgICAgICAgIExMX1RJTV9PQ19TZXRJZGxlU3RhdGVcbg0KLSAqICAgICAgICAgQ1IyICAgICAgICAgT0lTNCAgICAgICAgICBMTF9USU1fT0NfU2V0SWRsZVN0YXRlXG4NCi0gKiAgICAgICAgIENSMiAgICAgICAgIE9JUzROICAgICAgICAgTExfVElNX09DX1NldElkbGVTdGF0ZVxuDQotICogICAgICAgICBDUjIgICAgICAgICBPSVM1ICAgICAgICAgIExMX1RJTV9PQ19TZXRJZGxlU3RhdGVcbg0KLSAqICAgICAgICAgQ1IyICAgICAgICAgT0lTNiAgICAgICAgICBMTF9USU1fT0NfU2V0SWRsZVN0YXRlDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxTg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMk4NCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDNODQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0Tg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINg0KLSAqIEBwYXJhbSAgSWRsZVN0YXRlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DSURMRVNUQVRFX0xPVw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ0lETEVTVEFURV9ISUdIDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX09DX1NldElkbGVTdGF0ZShUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IElkbGVTdGF0ZSkgew0KLSAgdWludDhfdCBpQ2hhbm5lbCA9IFRJTV9HRVRfQ0hBTk5FTF9JTkRFWChDaGFubmVsKTsNCi0gIE1PRElGWV9SRUcoVElNeC0+Q1IyLCAoVElNX0NSMl9PSVMxIDw8IFNISUZUX1RBQl9PSVN4W2lDaGFubmVsXSksDQotICAgICAgICAgICAgIElkbGVTdGF0ZSA8PCBTSElGVF9UQUJfT0lTeFtpQ2hhbm5lbF0pOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCB0aGUgSURMRSBzdGF0ZSBvZiBhbiBvdXRwdXQgY2hhbm5lbA0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgT0lTMSAgICAgICAgICBMTF9USU1fT0NfR2V0SWRsZVN0YXRlXG4NCi0gKiAgICAgICAgIENSMiAgICAgICAgIE9JUzJOICAgICAgICAgTExfVElNX09DX0dldElkbGVTdGF0ZVxuDQotICogICAgICAgICBDUjIgICAgICAgICBPSVMyICAgICAgICAgIExMX1RJTV9PQ19HZXRJZGxlU3RhdGVcbg0KLSAqICAgICAgICAgQ1IyICAgICAgICAgT0lTMk4gICAgICAgICBMTF9USU1fT0NfR2V0SWRsZVN0YXRlXG4NCi0gKiAgICAgICAgIENSMiAgICAgICAgIE9JUzMgICAgICAgICAgTExfVElNX09DX0dldElkbGVTdGF0ZVxuDQotICogICAgICAgICBDUjIgICAgICAgICBPSVMzTiAgICAgICAgIExMX1RJTV9PQ19HZXRJZGxlU3RhdGVcbg0KLSAqICAgICAgICAgQ1IyICAgICAgICAgT0lTNCAgICAgICAgICBMTF9USU1fT0NfR2V0SWRsZVN0YXRlXG4NCi0gKiAgICAgICAgIENSMiAgICAgICAgIE9JUzROICAgICAgICAgTExfVElNX09DX0dldElkbGVTdGF0ZVxuDQotICogICAgICAgICBDUjIgICAgICAgICBPSVM1ICAgICAgICAgIExMX1RJTV9PQ19HZXRJZGxlU3RhdGVcbg0KLSAqICAgICAgICAgQ1IyICAgICAgICAgT0lTNiAgICAgICAgICBMTF9USU1fT0NfR2V0SWRsZVN0YXRlDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxTg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMk4NCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDNODQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0Tg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINg0KLSAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NJRExFU1RBVEVfTE9XDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DSURMRVNUQVRFX0hJR0gNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX09DX0dldElkbGVTdGF0ZShUSU1fVHlwZURlZiAqVElNeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKSB7DQotICB1aW50OF90IGlDaGFubmVsID0gVElNX0dFVF9DSEFOTkVMX0lOREVYKENoYW5uZWwpOw0KLSAgcmV0dXJuIChSRUFEX0JJVChUSU14LT5DUjIsIChUSU1fQ1IyX09JUzEgPDwgU0hJRlRfVEFCX09JU3hbaUNoYW5uZWxdKSkgPj4NCi0gICAgICAgICAgU0hJRlRfVEFCX09JU3hbaUNoYW5uZWxdKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgZmFzdCBtb2RlIGZvciB0aGUgb3V0cHV0IGNoYW5uZWwuDQotICogQG5vdGUgQWN0cyBvbmx5IGlmIHRoZSBjaGFubmVsIGlzIGNvbmZpZ3VyZWQgaW4gUFdNMSBvciBQV00yIG1vZGUuDQotICogQHJtdG9sbCBDQ01SMSAgICAgICAgT0MxRkUgICAgICAgICAgTExfVElNX09DX0VuYWJsZUZhc3Rcbg0KLSAqICAgICAgICAgQ0NNUjEgICAgICAgIE9DMkZFICAgICAgICAgIExMX1RJTV9PQ19FbmFibGVGYXN0XG4NCi0gKiAgICAgICAgIENDTVIyICAgICAgICBPQzNGRSAgICAgICAgICBMTF9USU1fT0NfRW5hYmxlRmFzdFxuDQotICogICAgICAgICBDQ01SMiAgICAgICAgT0M0RkUgICAgICAgICAgTExfVElNX09DX0VuYWJsZUZhc3Rcbg0KLSAqICAgICAgICAgQ0NNUjMgICAgICAgIE9DNUZFICAgICAgICAgIExMX1RJTV9PQ19FbmFibGVGYXN0XG4NCi0gKiAgICAgICAgIENDTVIzICAgICAgICBPQzZGRSAgICAgICAgICBMTF9USU1fT0NfRW5hYmxlRmFzdA0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9PQ19FbmFibGVGYXN0KFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDaGFubmVsKSB7DQotICB1aW50OF90IGlDaGFubmVsID0gVElNX0dFVF9DSEFOTkVMX0lOREVYKENoYW5uZWwpOw0KLSAgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCgNCi0gICAgICB1aW50MzJfdCkoKHVpbnQzMl90KSgmVElNeC0+Q0NNUjEpICsgT0ZGU0VUX1RBQl9DQ01SeFtpQ2hhbm5lbF0pKTsNCi0gIFNFVF9CSVQoKnBSZWcsIChUSU1fQ0NNUjFfT0MxRkUgPDwgU0hJRlRfVEFCX09DeHhbaUNoYW5uZWxdKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBmYXN0IG1vZGUgZm9yIHRoZSBvdXRwdXQgY2hhbm5lbC4NCi0gKiBAcm10b2xsIENDTVIxICAgICAgICBPQzFGRSAgICAgICAgICBMTF9USU1fT0NfRGlzYWJsZUZhc3Rcbg0KLSAqICAgICAgICAgQ0NNUjEgICAgICAgIE9DMkZFICAgICAgICAgIExMX1RJTV9PQ19EaXNhYmxlRmFzdFxuDQotICogICAgICAgICBDQ01SMiAgICAgICAgT0MzRkUgICAgICAgICAgTExfVElNX09DX0Rpc2FibGVGYXN0XG4NCi0gKiAgICAgICAgIENDTVIyICAgICAgICBPQzRGRSAgICAgICAgICBMTF9USU1fT0NfRGlzYWJsZUZhc3Rcbg0KLSAqICAgICAgICAgQ0NNUjMgICAgICAgIE9DNUZFICAgICAgICAgIExMX1RJTV9PQ19EaXNhYmxlRmFzdFxuDQotICogICAgICAgICBDQ01SMyAgICAgICAgT0M2RkUgICAgICAgICAgTExfVElNX09DX0Rpc2FibGVGYXN0DQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g1DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g2DQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX09DX0Rpc2FibGVGYXN0KFRJTV9UeXBlRGVmICpUSU14LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKSB7DQotICB1aW50OF90IGlDaGFubmVsID0gVElNX0dFVF9DSEFOTkVMX0lOREVYKENoYW5uZWwpOw0KLSAgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCgNCi0gICAgICB1aW50MzJfdCkoKHVpbnQzMl90KSgmVElNeC0+Q0NNUjEpICsgT0ZGU0VUX1RBQl9DQ01SeFtpQ2hhbm5lbF0pKTsNCi0gIENMRUFSX0JJVCgqcFJlZywgKFRJTV9DQ01SMV9PQzFGRSA8PCBTSElGVF9UQUJfT0N4eFtpQ2hhbm5lbF0pKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciBmYXN0IG1vZGUgaXMgZW5hYmxlZCBmb3IgdGhlIG91dHB1dCBjaGFubmVsLg0KLSAqIEBybXRvbGwgQ0NNUjEgICAgICAgIE9DMUZFICAgICAgICAgIExMX1RJTV9PQ19Jc0VuYWJsZWRGYXN0XG4NCi0gKiAgICAgICAgIENDTVIxICAgICAgICBPQzJGRSAgICAgICAgICBMTF9USU1fT0NfSXNFbmFibGVkRmFzdFxuDQotICogICAgICAgICBDQ01SMiAgICAgICAgT0MzRkUgICAgICAgICAgTExfVElNX09DX0lzRW5hYmxlZEZhc3Rcbg0KLSAqICAgICAgICAgQ0NNUjIgICAgICAgIE9DNEZFICAgICAgICAgIExMX1RJTV9PQ19Jc0VuYWJsZWRGYXN0XG4NCi0gKiAgICAgICAgIENDTVIzICAgICAgICBPQzVGRSAgICAgICAgICBMTF9USU1fT0NfSXNFbmFibGVkRmFzdFxuDQotICogICAgICAgICBDQ01SMyAgICAgICAgT0M2RkUgICAgICAgICAgTExfVElNX09DX0lzRW5hYmxlZEZhc3QNCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDYNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX09DX0lzRW5hYmxlZEZhc3QoVElNX1R5cGVEZWYgKlRJTXgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpIHsNCi0gIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7DQotICBjb25zdCBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKA0KLSAgICAgIHVpbnQzMl90KSgodWludDMyX3QpKCZUSU14LT5DQ01SMSkgKyBPRkZTRVRfVEFCX0NDTVJ4W2lDaGFubmVsXSkpOw0KLSAgdWludDMyX3QgYml0ZmllbGQgPSBUSU1fQ0NNUjFfT0MxRkUgPDwgU0hJRlRfVEFCX09DeHhbaUNoYW5uZWxdOw0KLSAgcmV0dXJuICgoUkVBRF9CSVQoKnBSZWcsIGJpdGZpZWxkKSA9PSBiaXRmaWVsZCkgPyAxVUwgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSBjb21wYXJlIHJlZ2lzdGVyIChUSU14X0NDUngpIHByZWxvYWQgZm9yIHRoZSBvdXRwdXQgY2hhbm5lbC4NCi0gKiBAcm10b2xsIENDTVIxICAgICAgICBPQzFQRSAgICAgICAgICBMTF9USU1fT0NfRW5hYmxlUHJlbG9hZFxuDQotICogICAgICAgICBDQ01SMSAgICAgICAgT0MyUEUgICAgICAgICAgTExfVElNX09DX0VuYWJsZVByZWxvYWRcbg0KLSAqICAgICAgICAgQ0NNUjIgICAgICAgIE9DM1BFICAgICAgICAgIExMX1RJTV9PQ19FbmFibGVQcmVsb2FkXG4NCi0gKiAgICAgICAgIENDTVIyICAgICAgICBPQzRQRSAgICAgICAgICBMTF9USU1fT0NfRW5hYmxlUHJlbG9hZFxuDQotICogICAgICAgICBDQ01SMyAgICAgICAgT0M1UEUgICAgICAgICAgTExfVElNX09DX0VuYWJsZVByZWxvYWRcbg0KLSAqICAgICAgICAgQ0NNUjMgICAgICAgIE9DNlBFICAgICAgICAgIExMX1RJTV9PQ19FbmFibGVQcmVsb2FkDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g1DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g2DQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX09DX0VuYWJsZVByZWxvYWQoVElNX1R5cGVEZWYgKlRJTXgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCkgew0KLSAgdWludDhfdCBpQ2hhbm5lbCA9IFRJTV9HRVRfQ0hBTk5FTF9JTkRFWChDaGFubmVsKTsNCi0gIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgoDQotICAgICAgdWludDMyX3QpKCh1aW50MzJfdCkoJlRJTXgtPkNDTVIxKSArIE9GRlNFVF9UQUJfQ0NNUnhbaUNoYW5uZWxdKSk7DQotICBTRVRfQklUKCpwUmVnLCAoVElNX0NDTVIxX09DMVBFIDw8IFNISUZUX1RBQl9PQ3h4W2lDaGFubmVsXSkpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgY29tcGFyZSByZWdpc3RlciAoVElNeF9DQ1J4KSBwcmVsb2FkIGZvciB0aGUgb3V0cHV0IGNoYW5uZWwuDQotICogQHJtdG9sbCBDQ01SMSAgICAgICAgT0MxUEUgICAgICAgICAgTExfVElNX09DX0Rpc2FibGVQcmVsb2FkXG4NCi0gKiAgICAgICAgIENDTVIxICAgICAgICBPQzJQRSAgICAgICAgICBMTF9USU1fT0NfRGlzYWJsZVByZWxvYWRcbg0KLSAqICAgICAgICAgQ0NNUjIgICAgICAgIE9DM1BFICAgICAgICAgIExMX1RJTV9PQ19EaXNhYmxlUHJlbG9hZFxuDQotICogICAgICAgICBDQ01SMiAgICAgICAgT0M0UEUgICAgICAgICAgTExfVElNX09DX0Rpc2FibGVQcmVsb2FkXG4NCi0gKiAgICAgICAgIENDTVIzICAgICAgICBPQzVQRSAgICAgICAgICBMTF9USU1fT0NfRGlzYWJsZVByZWxvYWRcbg0KLSAqICAgICAgICAgQ0NNUjMgICAgICAgIE9DNlBFICAgICAgICAgIExMX1RJTV9PQ19EaXNhYmxlUHJlbG9hZA0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9PQ19EaXNhYmxlUHJlbG9hZChUSU1fVHlwZURlZiAqVElNeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCkgew0KLSAgdWludDhfdCBpQ2hhbm5lbCA9IFRJTV9HRVRfQ0hBTk5FTF9JTkRFWChDaGFubmVsKTsNCi0gIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgoDQotICAgICAgdWludDMyX3QpKCh1aW50MzJfdCkoJlRJTXgtPkNDTVIxKSArIE9GRlNFVF9UQUJfQ0NNUnhbaUNoYW5uZWxdKSk7DQotICBDTEVBUl9CSVQoKnBSZWcsIChUSU1fQ0NNUjFfT0MxUEUgPDwgU0hJRlRfVEFCX09DeHhbaUNoYW5uZWxdKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgY29tcGFyZSByZWdpc3RlciAoVElNeF9DQ1J4KSBwcmVsb2FkIGlzIGVuYWJsZWQgZm9yDQotICogdGhlIG91dHB1dCBjaGFubmVsLg0KLSAqIEBybXRvbGwgQ0NNUjEgICAgICAgIE9DMVBFICAgICAgICAgIExMX1RJTV9PQ19Jc0VuYWJsZWRQcmVsb2FkXG4NCi0gKiAgICAgICAgIENDTVIxICAgICAgICBPQzJQRSAgICAgICAgICBMTF9USU1fT0NfSXNFbmFibGVkUHJlbG9hZFxuDQotICogICAgICAgICBDQ01SMiAgICAgICAgT0MzUEUgICAgICAgICAgTExfVElNX09DX0lzRW5hYmxlZFByZWxvYWRcbg0KLSAqICAgICAgICAgQ0NNUjIgICAgICAgIE9DNFBFICAgICAgICAgIExMX1RJTV9PQ19Jc0VuYWJsZWRQcmVsb2FkXG4NCi0gKiAgICAgICAgIENDTVIzICAgICAgICBPQzVQRSAgICAgICAgICBMTF9USU1fT0NfSXNFbmFibGVkUHJlbG9hZFxuDQotICogICAgICAgICBDQ01SMyAgICAgICAgT0M2UEUgICAgICAgICAgTExfVElNX09DX0lzRW5hYmxlZFByZWxvYWQNCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDYNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX09DX0lzRW5hYmxlZFByZWxvYWQoVElNX1R5cGVEZWYgKlRJTXgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpIHsNCi0gIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7DQotICBjb25zdCBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKA0KLSAgICAgIHVpbnQzMl90KSgodWludDMyX3QpKCZUSU14LT5DQ01SMSkgKyBPRkZTRVRfVEFCX0NDTVJ4W2lDaGFubmVsXSkpOw0KLSAgdWludDMyX3QgYml0ZmllbGQgPSBUSU1fQ0NNUjFfT0MxUEUgPDwgU0hJRlRfVEFCX09DeHhbaUNoYW5uZWxdOw0KLSAgcmV0dXJuICgoUkVBRF9CSVQoKnBSZWcsIGJpdGZpZWxkKSA9PSBiaXRmaWVsZCkgPyAxVUwgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSBjbGVhcmluZyB0aGUgb3V0cHV0IGNoYW5uZWwgb24gYW4gZXh0ZXJuYWwgZXZlbnQuDQotICogQG5vdGUgVGhpcyBmdW5jdGlvbiBjYW4gb25seSBiZSB1c2VkIGluIE91dHB1dCBjb21wYXJlIGFuZCBQV00gbW9kZXMuIEl0IGRvZXMNCi0gKiBub3Qgd29yayBpbiBGb3JjZWQgbW9kZS4NCi0gKiBAbm90ZSBNYWNybyBJU19USU1fT0NYUkVGX0NMRUFSX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXINCi0gKiAgICAgICBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBjYW4gY2xlYXIgdGhlIE9DeFJFRiBzaWduYWwgb24gYW4gZXh0ZXJuYWwNCi0gKiBldmVudC4NCi0gKiBAcm10b2xsIENDTVIxICAgICAgICBPQzFDRSAgICAgICAgICBMTF9USU1fT0NfRW5hYmxlQ2xlYXJcbg0KLSAqICAgICAgICAgQ0NNUjEgICAgICAgIE9DMkNFICAgICAgICAgIExMX1RJTV9PQ19FbmFibGVDbGVhclxuDQotICogICAgICAgICBDQ01SMiAgICAgICAgT0MzQ0UgICAgICAgICAgTExfVElNX09DX0VuYWJsZUNsZWFyXG4NCi0gKiAgICAgICAgIENDTVIyICAgICAgICBPQzRDRSAgICAgICAgICBMTF9USU1fT0NfRW5hYmxlQ2xlYXJcbg0KLSAqICAgICAgICAgQ0NNUjMgICAgICAgIE9DNUNFICAgICAgICAgIExMX1RJTV9PQ19FbmFibGVDbGVhclxuDQotICogICAgICAgICBDQ01SMyAgICAgICAgT0M2Q0UgICAgICAgICAgTExfVElNX09DX0VuYWJsZUNsZWFyDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g1DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g2DQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX09DX0VuYWJsZUNsZWFyKFRJTV9UeXBlRGVmICpUSU14LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKSB7DQotICB1aW50OF90IGlDaGFubmVsID0gVElNX0dFVF9DSEFOTkVMX0lOREVYKENoYW5uZWwpOw0KLSAgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCgNCi0gICAgICB1aW50MzJfdCkoKHVpbnQzMl90KSgmVElNeC0+Q0NNUjEpICsgT0ZGU0VUX1RBQl9DQ01SeFtpQ2hhbm5lbF0pKTsNCi0gIFNFVF9CSVQoKnBSZWcsIChUSU1fQ0NNUjFfT0MxQ0UgPDwgU0hJRlRfVEFCX09DeHhbaUNoYW5uZWxdKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBjbGVhcmluZyB0aGUgb3V0cHV0IGNoYW5uZWwgb24gYW4gZXh0ZXJuYWwgZXZlbnQuDQotICogQG5vdGUgTWFjcm8gSVNfVElNX09DWFJFRl9DTEVBUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyDQotICogICAgICAgb3Igbm90IGEgdGltZXIgaW5zdGFuY2UgY2FuIGNsZWFyIHRoZSBPQ3hSRUYgc2lnbmFsIG9uIGFuIGV4dGVybmFsDQotICogZXZlbnQuDQotICogQHJtdG9sbCBDQ01SMSAgICAgICAgT0MxQ0UgICAgICAgICAgTExfVElNX09DX0Rpc2FibGVDbGVhclxuDQotICogICAgICAgICBDQ01SMSAgICAgICAgT0MyQ0UgICAgICAgICAgTExfVElNX09DX0Rpc2FibGVDbGVhclxuDQotICogICAgICAgICBDQ01SMiAgICAgICAgT0MzQ0UgICAgICAgICAgTExfVElNX09DX0Rpc2FibGVDbGVhclxuDQotICogICAgICAgICBDQ01SMiAgICAgICAgT0M0Q0UgICAgICAgICAgTExfVElNX09DX0Rpc2FibGVDbGVhclxuDQotICogICAgICAgICBDQ01SMyAgICAgICAgT0M1Q0UgICAgICAgICAgTExfVElNX09DX0Rpc2FibGVDbGVhclxuDQotICogICAgICAgICBDQ01SMyAgICAgICAgT0M2Q0UgICAgICAgICAgTExfVElNX09DX0Rpc2FibGVDbGVhcg0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9PQ19EaXNhYmxlQ2xlYXIoVElNX1R5cGVEZWYgKlRJTXgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKSB7DQotICB1aW50OF90IGlDaGFubmVsID0gVElNX0dFVF9DSEFOTkVMX0lOREVYKENoYW5uZWwpOw0KLSAgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCgNCi0gICAgICB1aW50MzJfdCkoKHVpbnQzMl90KSgmVElNeC0+Q0NNUjEpICsgT0ZGU0VUX1RBQl9DQ01SeFtpQ2hhbm5lbF0pKTsNCi0gIENMRUFSX0JJVCgqcFJlZywgKFRJTV9DQ01SMV9PQzFDRSA8PCBTSElGVF9UQUJfT0N4eFtpQ2hhbm5lbF0pKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBJbmRpY2F0ZXMgY2xlYXJpbmcgdGhlIG91dHB1dCBjaGFubmVsIG9uIGFuIGV4dGVybmFsIGV2ZW50IGlzIGVuYWJsZWQNCi0gKiBmb3IgdGhlIG91dHB1dCBjaGFubmVsLg0KLSAqIEBub3RlIFRoaXMgZnVuY3Rpb24gZW5hYmxlcyBjbGVhcmluZyB0aGUgb3V0cHV0IGNoYW5uZWwgb24gYW4gZXh0ZXJuYWwgZXZlbnQuDQotICogQG5vdGUgVGhpcyBmdW5jdGlvbiBjYW4gb25seSBiZSB1c2VkIGluIE91dHB1dCBjb21wYXJlIGFuZCBQV00gbW9kZXMuIEl0IGRvZXMNCi0gKiBub3Qgd29yayBpbiBGb3JjZWQgbW9kZS4NCi0gKiBAbm90ZSBNYWNybyBJU19USU1fT0NYUkVGX0NMRUFSX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXINCi0gKiAgICAgICBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBjYW4gY2xlYXIgdGhlIE9DeFJFRiBzaWduYWwgb24gYW4gZXh0ZXJuYWwNCi0gKiBldmVudC4NCi0gKiBAcm10b2xsIENDTVIxICAgICAgICBPQzFDRSAgICAgICAgICBMTF9USU1fT0NfSXNFbmFibGVkQ2xlYXJcbg0KLSAqICAgICAgICAgQ0NNUjEgICAgICAgIE9DMkNFICAgICAgICAgIExMX1RJTV9PQ19Jc0VuYWJsZWRDbGVhclxuDQotICogICAgICAgICBDQ01SMiAgICAgICAgT0MzQ0UgICAgICAgICAgTExfVElNX09DX0lzRW5hYmxlZENsZWFyXG4NCi0gKiAgICAgICAgIENDTVIyICAgICAgICBPQzRDRSAgICAgICAgICBMTF9USU1fT0NfSXNFbmFibGVkQ2xlYXJcbg0KLSAqICAgICAgICAgQ0NNUjMgICAgICAgIE9DNUNFICAgICAgICAgIExMX1RJTV9PQ19Jc0VuYWJsZWRDbGVhclxuDQotICogICAgICAgICBDQ01SMyAgICAgICAgT0M2Q0UgICAgICAgICAgTExfVElNX09DX0lzRW5hYmxlZENsZWFyDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g1DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g2DQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9PQ19Jc0VuYWJsZWRDbGVhcihUSU1fVHlwZURlZiAqVElNeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpIHsNCi0gIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7DQotICBjb25zdCBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKA0KLSAgICAgIHVpbnQzMl90KSgodWludDMyX3QpKCZUSU14LT5DQ01SMSkgKyBPRkZTRVRfVEFCX0NDTVJ4W2lDaGFubmVsXSkpOw0KLSAgdWludDMyX3QgYml0ZmllbGQgPSBUSU1fQ0NNUjFfT0MxQ0UgPDwgU0hJRlRfVEFCX09DeHhbaUNoYW5uZWxdOw0KLSAgcmV0dXJuICgoUkVBRF9CSVQoKnBSZWcsIGJpdGZpZWxkKSA9PSBiaXRmaWVsZCkgPyAxVUwgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCB0aGUgZGVhZC10aW1lIGRlbGF5IChkZWxheSBpbnNlcnRlZCBiZXR3ZWVuIHRoZSByaXNpbmcgZWRnZSBvZg0KLSAqIHRoZSBPQ3hSRUYgc2lnbmFsIGFuZCB0aGUgcmlzaW5nIGVkZ2Ugb2YgdGhlIE9jeCBhbmQgT0N4TiBzaWduYWxzKS4NCi0gKiBAbm90ZSBNYWNybyBJU19USU1fQlJFQUtfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QNCi0gKiAgICAgICBkZWFkLXRpbWUgaW5zZXJ0aW9uIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IGEgdGltZXIgaW5zdGFuY2UuDQotICogQG5vdGUgSGVscGVyIG1hY3JvIEByZWYgX19MTF9USU1fQ0FMQ19ERUFEVElNRSBjYW4gYmUgdXNlZCB0byBjYWxjdWxhdGUgdGhlDQotICogRGVhZFRpbWUgcGFyYW1ldGVyDQotICogQHJtdG9sbCBCRFRSICAgICAgICAgRFRHICAgICAgICAgICBMTF9USU1fT0NfU2V0RGVhZFRpbWUNCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcGFyYW0gIERlYWRUaW1lIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MjU1DQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX09DX1NldERlYWRUaW1lKFRJTV9UeXBlRGVmICpUSU14LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBEZWFkVGltZSkgew0KLSAgTU9ESUZZX1JFRyhUSU14LT5CRFRSLCBUSU1fQkRUUl9EVEcsIERlYWRUaW1lKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZXQgY29tcGFyZSB2YWx1ZSBmb3Igb3V0cHV0IGNoYW5uZWwgMSAoVElNeF9DQ1IxKS4NCi0gKiBAbm90ZSBJbiAzMi1iaXQgdGltZXIgaW1wbGVtZW50YXRpb25zIGNvbXBhcmUgdmFsdWUgY2FuIGJlIGJldHdlZW4gMHgwMDAwMDAwMA0KLSAqIGFuZCAweEZGRkZGRkZGLg0KLSAqIEBub3RlIE1hY3JvIElTX1RJTV8zMkJfQ09VTlRFUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaw0KLSAqICAgICAgIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgYSAzMiBiaXRzIGNvdW50ZXIuDQotICogQG5vdGUgTWFjcm8gSVNfVElNX0NDMV9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdA0KLSAqICAgICAgIG91dHB1dCBjaGFubmVsIDEgaXMgc3VwcG9ydGVkIGJ5IGEgdGltZXIgaW5zdGFuY2UuDQotICogQG5vdGUgSWYgZGl0aGVyaW5nIGlzIGFjdGl2YXRlZCwgQ29tcGFyZVZhbHVlIGNhbiBiZSBjYWxjdWxhdGVkIHdpdGggbWFjcm8NCi0gKiBAcmVmIF9fTExfVElNX0NBTENfREVMQVlfRElUSEVSIC4NCi0gKiBAcm10b2xsIENDUjEgICAgICAgICBDQ1IxICAgICAgICAgIExMX1RJTV9PQ19TZXRDb21wYXJlQ0gxDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHBhcmFtICBDb21wYXJlVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUzNQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9PQ19TZXRDb21wYXJlQ0gxKFRJTV9UeXBlRGVmICpUSU14LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENvbXBhcmVWYWx1ZSkgew0KLSAgV1JJVEVfUkVHKFRJTXgtPkNDUjEsIENvbXBhcmVWYWx1ZSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IGNvbXBhcmUgdmFsdWUgZm9yIG91dHB1dCBjaGFubmVsIDIgKFRJTXhfQ0NSMikuDQotICogQG5vdGUgSW4gMzItYml0IHRpbWVyIGltcGxlbWVudGF0aW9ucyBjb21wYXJlIHZhbHVlIGNhbiBiZSBiZXR3ZWVuIDB4MDAwMDAwMDANCi0gKiBhbmQgMHhGRkZGRkZGRi4NCi0gKiBAbm90ZSBNYWNybyBJU19USU1fMzJCX0NPVU5URVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sNCi0gKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGEgMzIgYml0cyBjb3VudGVyLg0KLSAqIEBub3RlIE1hY3JvIElTX1RJTV9DQzJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QNCi0gKiAgICAgICBvdXRwdXQgY2hhbm5lbCAyIGlzIHN1cHBvcnRlZCBieSBhIHRpbWVyIGluc3RhbmNlLg0KLSAqIEBub3RlIElmIGRpdGhlcmluZyBpcyBhY3RpdmF0ZWQsIENvbXBhcmVWYWx1ZSBjYW4gYmUgY2FsY3VsYXRlZCB3aXRoIG1hY3JvDQotICogQHJlZiBfX0xMX1RJTV9DQUxDX0RFTEFZX0RJVEhFUiAuDQotICogQHJtdG9sbCBDQ1IyICAgICAgICAgQ0NSMiAgICAgICAgICBMTF9USU1fT0NfU2V0Q29tcGFyZUNIMg0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEBwYXJhbSAgQ29tcGFyZVZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9NjU1MzUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fT0NfU2V0Q29tcGFyZUNIMihUSU1fVHlwZURlZiAqVElNeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDb21wYXJlVmFsdWUpIHsNCi0gIFdSSVRFX1JFRyhUSU14LT5DQ1IyLCBDb21wYXJlVmFsdWUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCBjb21wYXJlIHZhbHVlIGZvciBvdXRwdXQgY2hhbm5lbCAzIChUSU14X0NDUjMpLg0KLSAqIEBub3RlIEluIDMyLWJpdCB0aW1lciBpbXBsZW1lbnRhdGlvbnMgY29tcGFyZSB2YWx1ZSBjYW4gYmUgYmV0d2VlbiAweDAwMDAwMDAwDQotICogYW5kIDB4RkZGRkZGRkYuDQotICogQG5vdGUgTWFjcm8gSVNfVElNXzMyQl9DT1VOVEVSX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrDQotICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBhIDMyIGJpdHMgY291bnRlci4NCi0gKiBAbm90ZSBNYWNybyBJU19USU1fQ0MzX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90DQotICogICAgICAgb3V0cHV0IGNoYW5uZWwgaXMgc3VwcG9ydGVkIGJ5IGEgdGltZXIgaW5zdGFuY2UuDQotICogQG5vdGUgSWYgZGl0aGVyaW5nIGlzIGFjdGl2YXRlZCwgQ29tcGFyZVZhbHVlIGNhbiBiZSBjYWxjdWxhdGVkIHdpdGggbWFjcm8NCi0gKiBAcmVmIF9fTExfVElNX0NBTENfREVMQVlfRElUSEVSIC4NCi0gKiBAcm10b2xsIENDUjMgICAgICAgICBDQ1IzICAgICAgICAgIExMX1RJTV9PQ19TZXRDb21wYXJlQ0gzDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHBhcmFtICBDb21wYXJlVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUzNQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9PQ19TZXRDb21wYXJlQ0gzKFRJTV9UeXBlRGVmICpUSU14LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENvbXBhcmVWYWx1ZSkgew0KLSAgV1JJVEVfUkVHKFRJTXgtPkNDUjMsIENvbXBhcmVWYWx1ZSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IGNvbXBhcmUgdmFsdWUgZm9yIG91dHB1dCBjaGFubmVsIDQgKFRJTXhfQ0NSNCkuDQotICogQG5vdGUgSW4gMzItYml0IHRpbWVyIGltcGxlbWVudGF0aW9ucyBjb21wYXJlIHZhbHVlIGNhbiBiZSBiZXR3ZWVuIDB4MDAwMDAwMDANCi0gKiBhbmQgMHhGRkZGRkZGRi4NCi0gKiBAbm90ZSBNYWNybyBJU19USU1fMzJCX0NPVU5URVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sNCi0gKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGEgMzIgYml0cyBjb3VudGVyLg0KLSAqIEBub3RlIE1hY3JvIElTX1RJTV9DQzRfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QNCi0gKiAgICAgICBvdXRwdXQgY2hhbm5lbCA0IGlzIHN1cHBvcnRlZCBieSBhIHRpbWVyIGluc3RhbmNlLg0KLSAqIEBub3RlIElmIGRpdGhlcmluZyBpcyBhY3RpdmF0ZWQsIENvbXBhcmVWYWx1ZSBjYW4gYmUgY2FsY3VsYXRlZCB3aXRoIG1hY3JvDQotICogQHJlZiBfX0xMX1RJTV9DQUxDX0RFTEFZX0RJVEhFUiAuDQotICogQHJtdG9sbCBDQ1I0ICAgICAgICAgQ0NSNCAgICAgICAgICBMTF9USU1fT0NfU2V0Q29tcGFyZUNINA0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEBwYXJhbSAgQ29tcGFyZVZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9NjU1MzUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fT0NfU2V0Q29tcGFyZUNINChUSU1fVHlwZURlZiAqVElNeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDb21wYXJlVmFsdWUpIHsNCi0gIFdSSVRFX1JFRyhUSU14LT5DQ1I0LCBDb21wYXJlVmFsdWUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCBjb21wYXJlIHZhbHVlIGZvciBvdXRwdXQgY2hhbm5lbCA1IChUSU14X0NDUjUpLg0KLSAqIEBub3RlIE1hY3JvIElTX1RJTV9DQzVfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QNCi0gKiAgICAgICBvdXRwdXQgY2hhbm5lbCA1IGlzIHN1cHBvcnRlZCBieSBhIHRpbWVyIGluc3RhbmNlLg0KLSAqIEBub3RlIElmIGRpdGhlcmluZyBpcyBhY3RpdmF0ZWQsIENvbXBhcmVWYWx1ZSBjYW4gYmUgY2FsY3VsYXRlZCB3aXRoIG1hY3JvDQotICogQHJlZiBfX0xMX1RJTV9DQUxDX0RFTEFZX0RJVEhFUiAuDQotICogQHJtdG9sbCBDQ1I1ICAgICAgICAgQ0NSNSAgICAgICAgICBMTF9USU1fT0NfU2V0Q29tcGFyZUNINQ0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEBwYXJhbSAgQ29tcGFyZVZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9NjU1MzUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fT0NfU2V0Q29tcGFyZUNINShUSU1fVHlwZURlZiAqVElNeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDb21wYXJlVmFsdWUpIHsNCi0gIE1PRElGWV9SRUcoVElNeC0+Q0NSNSwgVElNX0NDUjVfQ0NSNSwgQ29tcGFyZVZhbHVlKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZXQgY29tcGFyZSB2YWx1ZSBmb3Igb3V0cHV0IGNoYW5uZWwgNiAoVElNeF9DQ1I2KS4NCi0gKiBAbm90ZSBNYWNybyBJU19USU1fQ0M2X0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90DQotICogICAgICAgb3V0cHV0IGNoYW5uZWwgNiBpcyBzdXBwb3J0ZWQgYnkgYSB0aW1lciBpbnN0YW5jZS4NCi0gKiBAbm90ZSBJZiBkaXRoZXJpbmcgaXMgYWN0aXZhdGVkLCBDb21wYXJlVmFsdWUgY2FuIGJlIGNhbGN1bGF0ZWQgd2l0aCBtYWNybw0KLSAqIEByZWYgX19MTF9USU1fQ0FMQ19ERUxBWV9ESVRIRVIgLg0KLSAqIEBybXRvbGwgQ0NSNiAgICAgICAgIENDUjYgICAgICAgICAgTExfVElNX09DX1NldENvbXBhcmVDSDYNCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcGFyYW0gIENvbXBhcmVWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTY1NTM1DQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX09DX1NldENvbXBhcmVDSDYoVElNX1R5cGVEZWYgKlRJTXgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ29tcGFyZVZhbHVlKSB7DQotICBXUklURV9SRUcoVElNeC0+Q0NSNiwgQ29tcGFyZVZhbHVlKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgY29tcGFyZSB2YWx1ZSAoVElNeF9DQ1IxKSBzZXQgZm9yICBvdXRwdXQgY2hhbm5lbCAxLg0KLSAqIEBub3RlIEluIDMyLWJpdCB0aW1lciBpbXBsZW1lbnRhdGlvbnMgcmV0dXJuZWQgY29tcGFyZSB2YWx1ZSBjYW4gYmUgYmV0d2Vlbg0KLSAqIDB4MDAwMDAwMDAgYW5kIDB4RkZGRkZGRkYuDQotICogQG5vdGUgTWFjcm8gSVNfVElNXzMyQl9DT1VOVEVSX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrDQotICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBhIDMyIGJpdHMgY291bnRlci4NCi0gKiBAbm90ZSBNYWNybyBJU19USU1fQ0MxX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90DQotICogICAgICAgb3V0cHV0IGNoYW5uZWwgMSBpcyBzdXBwb3J0ZWQgYnkgYSB0aW1lciBpbnN0YW5jZS4NCi0gKiBAbm90ZSBJZiBkaXRoZXJpbmcgaXMgYWN0aXZhdGVkLCBwYXkgYXR0ZW50aW9uIHRvIHRoZSByZXR1cm5lZCB2YWx1ZQ0KLSAqIGludGVycHJldGF0aW9uLg0KLSAqIEBybXRvbGwgQ0NSMSAgICAgICAgIENDUjEgICAgICAgICAgTExfVElNX09DX0dldENvbXBhcmVDSDENCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIENvbXBhcmVWYWx1ZSAoYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUzNSkNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX09DX0dldENvbXBhcmVDSDEoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfUkVHKFRJTXgtPkNDUjEpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgY29tcGFyZSB2YWx1ZSAoVElNeF9DQ1IyKSBzZXQgZm9yICBvdXRwdXQgY2hhbm5lbCAyLg0KLSAqIEBub3RlIEluIDMyLWJpdCB0aW1lciBpbXBsZW1lbnRhdGlvbnMgcmV0dXJuZWQgY29tcGFyZSB2YWx1ZSBjYW4gYmUgYmV0d2Vlbg0KLSAqIDB4MDAwMDAwMDAgYW5kIDB4RkZGRkZGRkYuDQotICogQG5vdGUgTWFjcm8gSVNfVElNXzMyQl9DT1VOVEVSX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrDQotICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBhIDMyIGJpdHMgY291bnRlci4NCi0gKiBAbm90ZSBNYWNybyBJU19USU1fQ0MyX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90DQotICogICAgICAgb3V0cHV0IGNoYW5uZWwgMiBpcyBzdXBwb3J0ZWQgYnkgYSB0aW1lciBpbnN0YW5jZS4NCi0gKiBAbm90ZSBJZiBkaXRoZXJpbmcgaXMgYWN0aXZhdGVkLCBwYXkgYXR0ZW50aW9uIHRvIHRoZSByZXR1cm5lZCB2YWx1ZQ0KLSAqIGludGVycHJldGF0aW9uLg0KLSAqIEBybXRvbGwgQ0NSMiAgICAgICAgIENDUjIgICAgICAgICAgTExfVElNX09DX0dldENvbXBhcmVDSDINCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIENvbXBhcmVWYWx1ZSAoYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUzNSkNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX09DX0dldENvbXBhcmVDSDIoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfUkVHKFRJTXgtPkNDUjIpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgY29tcGFyZSB2YWx1ZSAoVElNeF9DQ1IzKSBzZXQgZm9yICBvdXRwdXQgY2hhbm5lbCAzLg0KLSAqIEBub3RlIEluIDMyLWJpdCB0aW1lciBpbXBsZW1lbnRhdGlvbnMgcmV0dXJuZWQgY29tcGFyZSB2YWx1ZSBjYW4gYmUgYmV0d2Vlbg0KLSAqIDB4MDAwMDAwMDAgYW5kIDB4RkZGRkZGRkYuDQotICogQG5vdGUgTWFjcm8gSVNfVElNXzMyQl9DT1VOVEVSX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrDQotICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBhIDMyIGJpdHMgY291bnRlci4NCi0gKiBAbm90ZSBNYWNybyBJU19USU1fQ0MzX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90DQotICogICAgICAgb3V0cHV0IGNoYW5uZWwgMyBpcyBzdXBwb3J0ZWQgYnkgYSB0aW1lciBpbnN0YW5jZS4NCi0gKiBAbm90ZSBJZiBkaXRoZXJpbmcgaXMgYWN0aXZhdGVkLCBwYXkgYXR0ZW50aW9uIHRvIHRoZSByZXR1cm5lZCB2YWx1ZQ0KLSAqIGludGVycHJldGF0aW9uLg0KLSAqIEBybXRvbGwgQ0NSMyAgICAgICAgIENDUjMgICAgICAgICAgTExfVElNX09DX0dldENvbXBhcmVDSDMNCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIENvbXBhcmVWYWx1ZSAoYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUzNSkNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX09DX0dldENvbXBhcmVDSDMoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfUkVHKFRJTXgtPkNDUjMpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgY29tcGFyZSB2YWx1ZSAoVElNeF9DQ1I0KSBzZXQgZm9yICBvdXRwdXQgY2hhbm5lbCA0Lg0KLSAqIEBub3RlIEluIDMyLWJpdCB0aW1lciBpbXBsZW1lbnRhdGlvbnMgcmV0dXJuZWQgY29tcGFyZSB2YWx1ZSBjYW4gYmUgYmV0d2Vlbg0KLSAqIDB4MDAwMDAwMDAgYW5kIDB4RkZGRkZGRkYuDQotICogQG5vdGUgTWFjcm8gSVNfVElNXzMyQl9DT1VOVEVSX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrDQotICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBhIDMyIGJpdHMgY291bnRlci4NCi0gKiBAbm90ZSBNYWNybyBJU19USU1fQ0M0X0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90DQotICogICAgICAgb3V0cHV0IGNoYW5uZWwgNCBpcyBzdXBwb3J0ZWQgYnkgYSB0aW1lciBpbnN0YW5jZS4NCi0gKiBAbm90ZSBJZiBkaXRoZXJpbmcgaXMgYWN0aXZhdGVkLCBwYXkgYXR0ZW50aW9uIHRvIHRoZSByZXR1cm5lZCB2YWx1ZQ0KLSAqIGludGVycHJldGF0aW9uLg0KLSAqIEBybXRvbGwgQ0NSNCAgICAgICAgIENDUjQgICAgICAgICAgTExfVElNX09DX0dldENvbXBhcmVDSDQNCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIENvbXBhcmVWYWx1ZSAoYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUzNSkNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX09DX0dldENvbXBhcmVDSDQoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfUkVHKFRJTXgtPkNDUjQpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgY29tcGFyZSB2YWx1ZSAoVElNeF9DQ1I1KSBzZXQgZm9yICBvdXRwdXQgY2hhbm5lbCA1Lg0KLSAqIEBub3RlIE1hY3JvIElTX1RJTV9DQzVfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QNCi0gKiAgICAgICBvdXRwdXQgY2hhbm5lbCA1IGlzIHN1cHBvcnRlZCBieSBhIHRpbWVyIGluc3RhbmNlLg0KLSAqIEBub3RlIElmIGRpdGhlcmluZyBpcyBhY3RpdmF0ZWQsIHBheSBhdHRlbnRpb24gdG8gdGhlIHJldHVybmVkIHZhbHVlDQotICogaW50ZXJwcmV0YXRpb24uDQotICogQHJtdG9sbCBDQ1I1ICAgICAgICAgQ0NSNSAgICAgICAgICBMTF9USU1fT0NfR2V0Q29tcGFyZUNINQ0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgQ29tcGFyZVZhbHVlIChiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTY1NTM1KQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fT0NfR2V0Q29tcGFyZUNINShUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVElNeC0+Q0NSNSwgVElNX0NDUjVfQ0NSNSkpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBjb21wYXJlIHZhbHVlIChUSU14X0NDUjYpIHNldCBmb3IgIG91dHB1dCBjaGFubmVsIDYuDQotICogQG5vdGUgTWFjcm8gSVNfVElNX0NDNl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdA0KLSAqICAgICAgIG91dHB1dCBjaGFubmVsIDYgaXMgc3VwcG9ydGVkIGJ5IGEgdGltZXIgaW5zdGFuY2UuDQotICogQG5vdGUgSWYgZGl0aGVyaW5nIGlzIGFjdGl2YXRlZCwgcGF5IGF0dGVudGlvbiB0byB0aGUgcmV0dXJuZWQgdmFsdWUNCi0gKiBpbnRlcnByZXRhdGlvbi4NCi0gKiBAcm10b2xsIENDUjYgICAgICAgICBDQ1I2ICAgICAgICAgIExMX1RJTV9PQ19HZXRDb21wYXJlQ0g2DQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBDb21wYXJlVmFsdWUgKGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9NjU1MzUpDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9PQ19HZXRDb21wYXJlQ0g2KFRJTV9UeXBlRGVmICpUSU14KSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX1JFRyhUSU14LT5DQ1I2KSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2VsZWN0IG9uIHdoaWNoIHJlZmVyZW5jZSBzaWduYWwgdGhlIE9DNVJFRiBpcyBjb21iaW5lZCB0by4NCi0gKiBAbm90ZSBNYWNybyBJU19USU1fQ09NQklORUQzUEhBU0VQV01fSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sNCi0gKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIHRoZSBjb21iaW5lZCAzLXBoYXNlIFBXTSBtb2RlLg0KLSAqIEBybXRvbGwgQ0NSNSAgICAgICAgIEdDNUMzICAgICAgICAgIExMX1RJTV9TZXRDSDVDb21iaW5lZENoYW5uZWxzXG4NCi0gKiAgICAgICAgIENDUjUgICAgICAgICBHQzVDMiAgICAgICAgICBMTF9USU1fU2V0Q0g1Q29tYmluZWRDaGFubmVsc1xuDQotICogICAgICAgICBDQ1I1ICAgICAgICAgR0M1QzEgICAgICAgICAgTExfVElNX1NldENINUNvbWJpbmVkQ2hhbm5lbHMNCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcGFyYW0gIEdyb3VwQ0g1IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9HUk9VUENINV9OT05FDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0dST1VQQ0g1X09DMVJFRkMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fR1JPVVBDSDVfT0MyUkVGQw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9HUk9VUENINV9PQzNSRUZDDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX1NldENINUNvbWJpbmVkQ2hhbm5lbHMoVElNX1R5cGVEZWYgKlRJTXgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgR3JvdXBDSDUpIHsNCi0gIE1PRElGWV9SRUcoVElNeC0+Q0NSNSwgKFRJTV9DQ1I1X0dDNUMzIHwgVElNX0NDUjVfR0M1QzIgfCBUSU1fQ0NSNV9HQzVDMSksDQotICAgICAgICAgICAgIEdyb3VwQ0g1KTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZXQgdGhlIHB1bHNlIG9uIGNvbXBhcmUgcHVsc2Ugd2lkdGggcHJlc2NhbGVyLg0KLSAqIEBub3RlIE1hY3JvIElTX1RJTV9QVUxTRU9OQ09NUEFSRV9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaw0KLSAqICAgICAgIHdoZXRoZXIgb3Igbm90IHRoZSBwdWxzZSBvbiBjb21wYXJlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSB0aW1lcg0KLSAqICAgICAgIGluc3RhbmNlLg0KLSAqIEBybXRvbGwgRUNSICAgICAgICAgIFBXUFJTQyAgICAgICAgICAgTExfVElNX09DX1NldFB1bHNlV2lkdGhQcmVzY2FsZXINCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcGFyYW0gIFB1bHNlV2lkdGhQcmVzY2FsZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nDQotICogdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9QV1BSU0NfWDENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fUFdQUlNDX1gyDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1BXUFJTQ19YNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9QV1BSU0NfWDgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fUFdQUlNDX1gxNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9QV1BSU0NfWDMyDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1BXUFJTQ19YNjQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fUFdQUlNDX1gxMjgNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fT0NfU2V0UHVsc2VXaWR0aFByZXNjYWxlcigNCi0gICAgVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IFB1bHNlV2lkdGhQcmVzY2FsZXIpIHsNCi0gIE1PRElGWV9SRUcoVElNeC0+RUNSLCBUSU1fRUNSX1BXUFJTQywgUHVsc2VXaWR0aFByZXNjYWxlcik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IHRoZSBwdWxzZSBvbiBjb21wYXJlIHB1bHNlIHdpZHRoIHByZXNjYWxlci4NCi0gKiBAbm90ZSBNYWNybyBJU19USU1fUFVMU0VPTkNPTVBBUkVfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sNCi0gKiAgICAgICB3aGV0aGVyIG9yIG5vdCB0aGUgcHVsc2Ugb24gY29tcGFyZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgdGltZXINCi0gKiAgICAgICBpbnN0YW5jZS4NCi0gKiBAcm10b2xsIEVDUiAgICAgICAgICBQV1BSU0MgICAgICAgICAgIExMX1RJTV9PQ19HZXRQdWxzZVdpZHRoUHJlc2NhbGVyDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9QV1BSU0NfWDENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fUFdQUlNDX1gyDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1BXUFJTQ19YNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9QV1BSU0NfWDgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fUFdQUlNDX1gxNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9QV1BSU0NfWDMyDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1BXUFJTQ19YNjQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fUFdQUlNDX1gxMjgNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX09DX0dldFB1bHNlV2lkdGhQcmVzY2FsZXIoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFRJTXgtPkVDUiwgVElNX0VDUl9QV1BSU0MpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZXQgdGhlIHB1bHNlIG9uIGNvbXBhcmUgcHVsc2Ugd2lkdGggZHVyYXRpb24uDQotICogQG5vdGUgTWFjcm8gSVNfVElNX1BVTFNFT05DT01QQVJFX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrDQotICogICAgICAgd2hldGhlciBvciBub3QgdGhlIHB1bHNlIG9uIGNvbXBhcmUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIHRpbWVyDQotICogICAgICAgaW5zdGFuY2UuDQotICogQHJtdG9sbCBFQ1IgICAgICAgICAgUFcgICAgICAgICAgIExMX1RJTV9PQ19TZXRQdWxzZVdpZHRoDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHBhcmFtICBQdWxzZVdpZHRoIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTI1NQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9PQ19TZXRQdWxzZVdpZHRoKFRJTV9UeXBlRGVmICpUSU14LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFB1bHNlV2lkdGgpIHsNCi0gIE1PRElGWV9SRUcoVElNeC0+RUNSLCBUSU1fRUNSX1BXLCBQdWxzZVdpZHRoIDw8IFRJTV9FQ1JfUFdfUG9zKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgdGhlIHB1bHNlIG9uIGNvbXBhcmUgcHVsc2Ugd2lkdGggZHVyYXRpb24uDQotICogQG5vdGUgTWFjcm8gSVNfVElNX1BVTFNFT05DT01QQVJFX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrDQotICogICAgICAgd2hldGhlciBvciBub3QgdGhlIHB1bHNlIG9uIGNvbXBhcmUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIHRpbWVyDQotICogICAgICAgaW5zdGFuY2UuDQotICogQHJtdG9sbCBFQ1IgICAgICAgICAgUFcgICAgICAgICAgIExMX1RJTV9PQ19HZXRQdWxzZVdpZHRoDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0yNTU6DQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9PQ19HZXRQdWxzZVdpZHRoKFRJTV9UeXBlRGVmICpUSU14KSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChUSU14LT5FQ1IsIFRJTV9FQ1JfUFcpKTsNCi19DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9MTF9FRl9JbnB1dF9DaGFubmVsIElucHV0IGNoYW5uZWwgY29uZmlndXJhdGlvbg0KLSAqIEB7DQotICovDQotLyoqDQotICogQGJyaWVmICBDb25maWd1cmUgaW5wdXQgY2hhbm5lbC4NCi0gKiBAcm10b2xsIENDTVIxICAgICAgICBDQzFTICAgICAgICAgIExMX1RJTV9JQ19Db25maWdcbg0KLSAqICAgICAgICAgQ0NNUjEgICAgICAgIElDMVBTQyAgICAgICAgTExfVElNX0lDX0NvbmZpZ1xuDQotICogICAgICAgICBDQ01SMSAgICAgICAgSUMxRiAgICAgICAgICBMTF9USU1fSUNfQ29uZmlnXG4NCi0gKiAgICAgICAgIENDTVIxICAgICAgICBDQzJTICAgICAgICAgIExMX1RJTV9JQ19Db25maWdcbg0KLSAqICAgICAgICAgQ0NNUjEgICAgICAgIElDMlBTQyAgICAgICAgTExfVElNX0lDX0NvbmZpZ1xuDQotICogICAgICAgICBDQ01SMSAgICAgICAgSUMyRiAgICAgICAgICBMTF9USU1fSUNfQ29uZmlnXG4NCi0gKiAgICAgICAgIENDTVIyICAgICAgICBDQzNTICAgICAgICAgIExMX1RJTV9JQ19Db25maWdcbg0KLSAqICAgICAgICAgQ0NNUjIgICAgICAgIElDM1BTQyAgICAgICAgTExfVElNX0lDX0NvbmZpZ1xuDQotICogICAgICAgICBDQ01SMiAgICAgICAgSUMzRiAgICAgICAgICBMTF9USU1fSUNfQ29uZmlnXG4NCi0gKiAgICAgICAgIENDTVIyICAgICAgICBDQzRTICAgICAgICAgIExMX1RJTV9JQ19Db25maWdcbg0KLSAqICAgICAgICAgQ0NNUjIgICAgICAgIElDNFBTQyAgICAgICAgTExfVElNX0lDX0NvbmZpZ1xuDQotICogICAgICAgICBDQ01SMiAgICAgICAgSUM0RiAgICAgICAgICBMTF9USU1fSUNfQ29uZmlnXG4NCi0gKiAgICAgICAgIENDRVIgICAgICAgICBDQzFQICAgICAgICAgIExMX1RJTV9JQ19Db25maWdcbg0KLSAqICAgICAgICAgQ0NFUiAgICAgICAgIENDMU5QICAgICAgICAgTExfVElNX0lDX0NvbmZpZ1xuDQotICogICAgICAgICBDQ0VSICAgICAgICAgQ0MyUCAgICAgICAgICBMTF9USU1fSUNfQ29uZmlnXG4NCi0gKiAgICAgICAgIENDRVIgICAgICAgICBDQzJOUCAgICAgICAgIExMX1RJTV9JQ19Db25maWdcbg0KLSAqICAgICAgICAgQ0NFUiAgICAgICAgIENDM1AgICAgICAgICAgTExfVElNX0lDX0NvbmZpZ1xuDQotICogICAgICAgICBDQ0VSICAgICAgICAgQ0MzTlAgICAgICAgICBMTF9USU1fSUNfQ29uZmlnXG4NCi0gKiAgICAgICAgIENDRVIgICAgICAgICBDQzRQICAgICAgICAgIExMX1RJTV9JQ19Db25maWdcbg0KLSAqICAgICAgICAgQ0NFUiAgICAgICAgIENDNE5QICAgICAgICAgTExfVElNX0lDX0NvbmZpZw0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINA0KLSAqIEBwYXJhbSAgQ29uZmlndXJhdGlvbiBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgY29tYmluYXRpb24gb2YgYWxsIHRoZQ0KLSAqIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0FDVElWRUlOUFVUX0RJUkVDVFRJIG9yIEByZWYNCi0gKiBMTF9USU1fQUNUSVZFSU5QVVRfSU5ESVJFQ1RUSSBvciBAcmVmIExMX1RJTV9BQ1RJVkVJTlBVVF9UUkMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNQU0NfRElWMSBvciAuLi4gb3IgQHJlZiBMTF9USU1fSUNQU0NfRElWOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjEgb3IgLi4uIG9yIEByZWYNCi0gKiBMTF9USU1fSUNfRklMVEVSX0ZESVYzMl9OOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19QT0xBUklUWV9SSVNJTkcgb3IgQHJlZg0KLSAqIExMX1RJTV9JQ19QT0xBUklUWV9GQUxMSU5HIG9yIEByZWYgTExfVElNX0lDX1BPTEFSSVRZX0JPVEhFREdFDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0lDX0NvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENvbmZpZ3VyYXRpb24pIHsNCi0gIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7DQotICBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKA0KLSAgICAgIHVpbnQzMl90KSgodWludDMyX3QpKCZUSU14LT5DQ01SMSkgKyBPRkZTRVRfVEFCX0NDTVJ4W2lDaGFubmVsXSkpOw0KLSAgTU9ESUZZX1JFRygqcFJlZywNCi0gICAgICAgICAgICAgKChUSU1fQ0NNUjFfSUMxRiB8IFRJTV9DQ01SMV9JQzFQU0MgfCBUSU1fQ0NNUjFfQ0MxUykNCi0gICAgICAgICAgICAgIDw8IFNISUZUX1RBQl9JQ3h4W2lDaGFubmVsXSksDQotICAgICAgICAgICAgICgoQ29uZmlndXJhdGlvbiA+PiAxNlUpICYNCi0gICAgICAgICAgICAgIChUSU1fQ0NNUjFfSUMxRiB8IFRJTV9DQ01SMV9JQzFQU0MgfCBUSU1fQ0NNUjFfQ0MxUykpDQotICAgICAgICAgICAgICAgICA8PCBTSElGVF9UQUJfSUN4eFtpQ2hhbm5lbF0pOw0KLSAgTU9ESUZZX1JFRyhUSU14LT5DQ0VSLA0KLSAgICAgICAgICAgICAoKFRJTV9DQ0VSX0NDMU5QIHwgVElNX0NDRVJfQ0MxUCkgPDwgU0hJRlRfVEFCX0NDeFBbaUNoYW5uZWxdKSwNCi0gICAgICAgICAgICAgKENvbmZpZ3VyYXRpb24gJiAoVElNX0NDRVJfQ0MxTlAgfCBUSU1fQ0NFUl9DQzFQKSkNCi0gICAgICAgICAgICAgICAgIDw8IFNISUZUX1RBQl9DQ3hQW2lDaGFubmVsXSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IHRoZSBhY3RpdmUgaW5wdXQuDQotICogQHJtdG9sbCBDQ01SMSAgICAgICAgQ0MxUyAgICAgICAgICBMTF9USU1fSUNfU2V0QWN0aXZlSW5wdXRcbg0KLSAqICAgICAgICAgQ0NNUjEgICAgICAgIENDMlMgICAgICAgICAgTExfVElNX0lDX1NldEFjdGl2ZUlucHV0XG4NCi0gKiAgICAgICAgIENDTVIyICAgICAgICBDQzNTICAgICAgICAgIExMX1RJTV9JQ19TZXRBY3RpdmVJbnB1dFxuDQotICogICAgICAgICBDQ01SMiAgICAgICAgQ0M0UyAgICAgICAgICBMTF9USU1fSUNfU2V0QWN0aXZlSW5wdXQNCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDQNCi0gKiBAcGFyYW0gIElDQWN0aXZlSW5wdXQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQUNUSVZFSU5QVVRfRElSRUNUVEkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQUNUSVZFSU5QVVRfSU5ESVJFQ1RUSQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9BQ1RJVkVJTlBVVF9UUkMNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fSUNfU2V0QWN0aXZlSW5wdXQoVElNX1R5cGVEZWYgKlRJTXgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IElDQWN0aXZlSW5wdXQpIHsNCi0gIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7DQotICBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKA0KLSAgICAgIHVpbnQzMl90KSgodWludDMyX3QpKCZUSU14LT5DQ01SMSkgKyBPRkZTRVRfVEFCX0NDTVJ4W2lDaGFubmVsXSkpOw0KLSAgTU9ESUZZX1JFRygqcFJlZywgKChUSU1fQ0NNUjFfQ0MxUykgPDwgU0hJRlRfVEFCX0lDeHhbaUNoYW5uZWxdKSwNCi0gICAgICAgICAgICAgKElDQWN0aXZlSW5wdXQgPj4gMTZVKSA8PCBTSElGVF9UQUJfSUN4eFtpQ2hhbm5lbF0pOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCB0aGUgY3VycmVudCBhY3RpdmUgaW5wdXQuDQotICogQHJtdG9sbCBDQ01SMSAgICAgICAgQ0MxUyAgICAgICAgICBMTF9USU1fSUNfR2V0QWN0aXZlSW5wdXRcbg0KLSAqICAgICAgICAgQ0NNUjEgICAgICAgIENDMlMgICAgICAgICAgTExfVElNX0lDX0dldEFjdGl2ZUlucHV0XG4NCi0gKiAgICAgICAgIENDTVIyICAgICAgICBDQzNTICAgICAgICAgIExMX1RJTV9JQ19HZXRBY3RpdmVJbnB1dFxuDQotICogICAgICAgICBDQ01SMiAgICAgICAgQ0M0UyAgICAgICAgICBMTF9USU1fSUNfR2V0QWN0aXZlSW5wdXQNCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDQNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0FDVElWRUlOUFVUX0RJUkVDVFRJDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0FDVElWRUlOUFVUX0lORElSRUNUVEkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQUNUSVZFSU5QVVRfVFJDDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9JQ19HZXRBY3RpdmVJbnB1dChUSU1fVHlwZURlZiAqVElNeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpIHsNCi0gIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7DQotICBjb25zdCBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKA0KLSAgICAgIHVpbnQzMl90KSgodWludDMyX3QpKCZUSU14LT5DQ01SMSkgKyBPRkZTRVRfVEFCX0NDTVJ4W2lDaGFubmVsXSkpOw0KLSAgcmV0dXJuICgoUkVBRF9CSVQoKnBSZWcsICgoVElNX0NDTVIxX0NDMVMpIDw8IFNISUZUX1RBQl9JQ3h4W2lDaGFubmVsXSkpID4+DQotICAgICAgICAgICBTSElGVF9UQUJfSUN4eFtpQ2hhbm5lbF0pDQotICAgICAgICAgIDw8IDE2VSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IHRoZSBwcmVzY2FsZXIgb2YgaW5wdXQgY2hhbm5lbC4NCi0gKiBAcm10b2xsIENDTVIxICAgICAgICBJQzFQU0MgICAgICAgIExMX1RJTV9JQ19TZXRQcmVzY2FsZXJcbg0KLSAqICAgICAgICAgQ0NNUjEgICAgICAgIElDMlBTQyAgICAgICAgTExfVElNX0lDX1NldFByZXNjYWxlclxuDQotICogICAgICAgICBDQ01SMiAgICAgICAgSUMzUFNDICAgICAgICBMTF9USU1fSUNfU2V0UHJlc2NhbGVyXG4NCi0gKiAgICAgICAgIENDTVIyICAgICAgICBJQzRQU0MgICAgICAgIExMX1RJTV9JQ19TZXRQcmVzY2FsZXINCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDQNCi0gKiBAcGFyYW0gIElDUHJlc2NhbGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDUFNDX0RJVjENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNQU0NfRElWMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ1BTQ19ESVY0DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDUFNDX0RJVjgNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fSUNfU2V0UHJlc2NhbGVyKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDaGFubmVsLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgSUNQcmVzY2FsZXIpIHsNCi0gIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7DQotICBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKA0KLSAgICAgIHVpbnQzMl90KSgodWludDMyX3QpKCZUSU14LT5DQ01SMSkgKyBPRkZTRVRfVEFCX0NDTVJ4W2lDaGFubmVsXSkpOw0KLSAgTU9ESUZZX1JFRygqcFJlZywgKChUSU1fQ0NNUjFfSUMxUFNDKSA8PCBTSElGVF9UQUJfSUN4eFtpQ2hhbm5lbF0pLA0KLSAgICAgICAgICAgICAoSUNQcmVzY2FsZXIgPj4gMTZVKSA8PCBTSElGVF9UQUJfSUN4eFtpQ2hhbm5lbF0pOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCB0aGUgY3VycmVudCBwcmVzY2FsZXIgdmFsdWUgYWN0aW5nIG9uIGFuICBpbnB1dCBjaGFubmVsLg0KLSAqIEBybXRvbGwgQ0NNUjEgICAgICAgIElDMVBTQyAgICAgICAgTExfVElNX0lDX0dldFByZXNjYWxlclxuDQotICogICAgICAgICBDQ01SMSAgICAgICAgSUMyUFNDICAgICAgICBMTF9USU1fSUNfR2V0UHJlc2NhbGVyXG4NCi0gKiAgICAgICAgIENDTVIyICAgICAgICBJQzNQU0MgICAgICAgIExMX1RJTV9JQ19HZXRQcmVzY2FsZXJcbg0KLSAqICAgICAgICAgQ0NNUjIgICAgICAgIElDNFBTQyAgICAgICAgTExfVElNX0lDX0dldFByZXNjYWxlcg0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINA0KLSAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNQU0NfRElWMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ1BTQ19ESVYyDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDUFNDX0RJVjQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNQU0NfRElWOA0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSUNfR2V0UHJlc2NhbGVyKFRJTV9UeXBlRGVmICpUSU14LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpIHsNCi0gIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7DQotICBjb25zdCBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKA0KLSAgICAgIHVpbnQzMl90KSgodWludDMyX3QpKCZUSU14LT5DQ01SMSkgKyBPRkZTRVRfVEFCX0NDTVJ4W2lDaGFubmVsXSkpOw0KLSAgcmV0dXJuICgoUkVBRF9CSVQoKnBSZWcsICgoVElNX0NDTVIxX0lDMVBTQykgPDwgU0hJRlRfVEFCX0lDeHhbaUNoYW5uZWxdKSkgPj4NCi0gICAgICAgICAgIFNISUZUX1RBQl9JQ3h4W2lDaGFubmVsXSkNCi0gICAgICAgICAgPDwgMTZVKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZXQgdGhlIGlucHV0IGZpbHRlciBkdXJhdGlvbi4NCi0gKiBAcm10b2xsIENDTVIxICAgICAgICBJQzFGICAgICAgICAgIExMX1RJTV9JQ19TZXRGaWx0ZXJcbg0KLSAqICAgICAgICAgQ0NNUjEgICAgICAgIElDMkYgICAgICAgICAgTExfVElNX0lDX1NldEZpbHRlclxuDQotICogICAgICAgICBDQ01SMiAgICAgICAgSUMzRiAgICAgICAgICBMTF9USU1fSUNfU2V0RmlsdGVyXG4NCi0gKiAgICAgICAgIENDTVIyICAgICAgICBJQzRGICAgICAgICAgIExMX1RJTV9JQ19TZXRGaWx0ZXINCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDQNCi0gKiBAcGFyYW0gIElDRmlsdGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjFfTjINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVYxX040DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWMV9OOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjJfTjYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVYyX044DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWNF9ONg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjRfTjgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVY4X042DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWOF9OOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjE2X041DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWMTZfTjYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVYxNl9OOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjMyX041DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWMzJfTjYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVYzMl9OOA0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9JQ19TZXRGaWx0ZXIoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENoYW5uZWwsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBJQ0ZpbHRlcikgew0KLSAgdWludDhfdCBpQ2hhbm5lbCA9IFRJTV9HRVRfQ0hBTk5FTF9JTkRFWChDaGFubmVsKTsNCi0gIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgoDQotICAgICAgdWludDMyX3QpKCh1aW50MzJfdCkoJlRJTXgtPkNDTVIxKSArIE9GRlNFVF9UQUJfQ0NNUnhbaUNoYW5uZWxdKSk7DQotICBNT0RJRllfUkVHKCpwUmVnLCAoKFRJTV9DQ01SMV9JQzFGKSA8PCBTSElGVF9UQUJfSUN4eFtpQ2hhbm5lbF0pLA0KLSAgICAgICAgICAgICAoSUNGaWx0ZXIgPj4gMTZVKSA8PCBTSElGVF9UQUJfSUN4eFtpQ2hhbm5lbF0pOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCB0aGUgaW5wdXQgZmlsdGVyIGR1cmF0aW9uLg0KLSAqIEBybXRvbGwgQ0NNUjEgICAgICAgIElDMUYgICAgICAgICAgTExfVElNX0lDX0dldEZpbHRlclxuDQotICogICAgICAgICBDQ01SMSAgICAgICAgSUMyRiAgICAgICAgICBMTF9USU1fSUNfR2V0RmlsdGVyXG4NCi0gKiAgICAgICAgIENDTVIyICAgICAgICBJQzNGICAgICAgICAgIExMX1RJTV9JQ19HZXRGaWx0ZXJcbg0KLSAqICAgICAgICAgQ0NNUjIgICAgICAgIElDNEYgICAgICAgICAgTExfVElNX0lDX0dldEZpbHRlcg0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINA0KLSAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVYxDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWMV9OMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjFfTjQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVYxX044DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWMl9ONg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjJfTjgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVY0X042DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWNF9OOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjhfTjYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVY4X044DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWMTZfTjUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVYxNl9ONg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjE2X044DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWMzJfTjUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVYzMl9ONg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjMyX044DQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9JQ19HZXRGaWx0ZXIoVElNX1R5cGVEZWYgKlRJTXgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCkgew0KLSAgdWludDhfdCBpQ2hhbm5lbCA9IFRJTV9HRVRfQ0hBTk5FTF9JTkRFWChDaGFubmVsKTsNCi0gIGNvbnN0IF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgoDQotICAgICAgdWludDMyX3QpKCh1aW50MzJfdCkoJlRJTXgtPkNDTVIxKSArIE9GRlNFVF9UQUJfQ0NNUnhbaUNoYW5uZWxdKSk7DQotICByZXR1cm4gKChSRUFEX0JJVCgqcFJlZywgKChUSU1fQ0NNUjFfSUMxRikgPDwgU0hJRlRfVEFCX0lDeHhbaUNoYW5uZWxdKSkgPj4NCi0gICAgICAgICAgIFNISUZUX1RBQl9JQ3h4W2lDaGFubmVsXSkNCi0gICAgICAgICAgPDwgMTZVKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZXQgdGhlIGlucHV0IGNoYW5uZWwgcG9sYXJpdHkuDQotICogQHJtdG9sbCBDQ0VSICAgICAgICAgQ0MxUCAgICAgICAgICBMTF9USU1fSUNfU2V0UG9sYXJpdHlcbg0KLSAqICAgICAgICAgQ0NFUiAgICAgICAgIENDMU5QICAgICAgICAgTExfVElNX0lDX1NldFBvbGFyaXR5XG4NCi0gKiAgICAgICAgIENDRVIgICAgICAgICBDQzJQICAgICAgICAgIExMX1RJTV9JQ19TZXRQb2xhcml0eVxuDQotICogICAgICAgICBDQ0VSICAgICAgICAgQ0MyTlAgICAgICAgICBMTF9USU1fSUNfU2V0UG9sYXJpdHlcbg0KLSAqICAgICAgICAgQ0NFUiAgICAgICAgIENDM1AgICAgICAgICAgTExfVElNX0lDX1NldFBvbGFyaXR5XG4NCi0gKiAgICAgICAgIENDRVIgICAgICAgICBDQzNOUCAgICAgICAgIExMX1RJTV9JQ19TZXRQb2xhcml0eVxuDQotICogICAgICAgICBDQ0VSICAgICAgICAgQ0M0UCAgICAgICAgICBMTF9USU1fSUNfU2V0UG9sYXJpdHlcbg0KLSAqICAgICAgICAgQ0NFUiAgICAgICAgIENDNE5QICAgICAgICAgTExfVElNX0lDX1NldFBvbGFyaXR5DQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0DQotICogQHBhcmFtICBJQ1BvbGFyaXR5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX1BPTEFSSVRZX1JJU0lORw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19QT0xBUklUWV9GQUxMSU5HDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX1BPTEFSSVRZX0JPVEhFREdFDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0lDX1NldFBvbGFyaXR5KFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDaGFubmVsLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBJQ1BvbGFyaXR5KSB7DQotICB1aW50OF90IGlDaGFubmVsID0gVElNX0dFVF9DSEFOTkVMX0lOREVYKENoYW5uZWwpOw0KLSAgTU9ESUZZX1JFRyhUSU14LT5DQ0VSLA0KLSAgICAgICAgICAgICAoKFRJTV9DQ0VSX0NDMU5QIHwgVElNX0NDRVJfQ0MxUCkgPDwgU0hJRlRfVEFCX0NDeFBbaUNoYW5uZWxdKSwNCi0gICAgICAgICAgICAgSUNQb2xhcml0eSA8PCBTSElGVF9UQUJfQ0N4UFtpQ2hhbm5lbF0pOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCB0aGUgY3VycmVudCBpbnB1dCBjaGFubmVsIHBvbGFyaXR5Lg0KLSAqIEBybXRvbGwgQ0NFUiAgICAgICAgIENDMVAgICAgICAgICAgTExfVElNX0lDX0dldFBvbGFyaXR5XG4NCi0gKiAgICAgICAgIENDRVIgICAgICAgICBDQzFOUCAgICAgICAgIExMX1RJTV9JQ19HZXRQb2xhcml0eVxuDQotICogICAgICAgICBDQ0VSICAgICAgICAgQ0MyUCAgICAgICAgICBMTF9USU1fSUNfR2V0UG9sYXJpdHlcbg0KLSAqICAgICAgICAgQ0NFUiAgICAgICAgIENDMk5QICAgICAgICAgTExfVElNX0lDX0dldFBvbGFyaXR5XG4NCi0gKiAgICAgICAgIENDRVIgICAgICAgICBDQzNQICAgICAgICAgIExMX1RJTV9JQ19HZXRQb2xhcml0eVxuDQotICogICAgICAgICBDQ0VSICAgICAgICAgQ0MzTlAgICAgICAgICBMTF9USU1fSUNfR2V0UG9sYXJpdHlcbg0KLSAqICAgICAgICAgQ0NFUiAgICAgICAgIENDNFAgICAgICAgICAgTExfVElNX0lDX0dldFBvbGFyaXR5XG4NCi0gKiAgICAgICAgIENDRVIgICAgICAgICBDQzROUCAgICAgICAgIExMX1RJTV9JQ19HZXRQb2xhcml0eQ0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINA0KLSAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfUE9MQVJJVFlfUklTSU5HDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX1BPTEFSSVRZX0ZBTExJTkcNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfUE9MQVJJVFlfQk9USEVER0UNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lDX0dldFBvbGFyaXR5KFRJTV9UeXBlRGVmICpUSU14LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCkgew0KLSAgdWludDhfdCBpQ2hhbm5lbCA9IFRJTV9HRVRfQ0hBTk5FTF9JTkRFWChDaGFubmVsKTsNCi0gIHJldHVybiAoUkVBRF9CSVQoVElNeC0+Q0NFUiwgKChUSU1fQ0NFUl9DQzFOUCB8IFRJTV9DQ0VSX0NDMVApDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBTSElGVF9UQUJfQ0N4UFtpQ2hhbm5lbF0pKSA+Pg0KLSAgICAgICAgICBTSElGVF9UQUJfQ0N4UFtpQ2hhbm5lbF0pOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENvbm5lY3QgdGhlIFRJTXhfQ0gxLCBDSDIgYW5kIENIMyBwaW5zICB0byB0aGUgVEkxIGlucHV0IChYT1INCi0gKiBjb21iaW5hdGlvbikuDQotICogQG5vdGUgTWFjcm8gSVNfVElNX1hPUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdA0KLSAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgYW4gWE9SIGlucHV0Lg0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgIFRJMVMgICAgICAgICAgTExfVElNX0lDX0VuYWJsZVhPUkNvbWJpbmF0aW9uDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0lDX0VuYWJsZVhPUkNvbWJpbmF0aW9uKFRJTV9UeXBlRGVmICpUSU14KSB7DQotICBTRVRfQklUKFRJTXgtPkNSMiwgVElNX0NSMl9USTFTKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNjb25uZWN0IHRoZSBUSU14X0NIMSwgQ0gyIGFuZCBDSDMgcGlucyAgZnJvbSB0aGUgVEkxIGlucHV0Lg0KLSAqIEBub3RlIE1hY3JvIElTX1RJTV9YT1JfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QNCi0gKiAgICAgICBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGFuIFhPUiBpbnB1dC4NCi0gKiBAcm10b2xsIENSMiAgICAgICAgICBUSTFTICAgICAgICAgIExMX1RJTV9JQ19EaXNhYmxlWE9SQ29tYmluYXRpb24NCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fSUNfRGlzYWJsZVhPUkNvbWJpbmF0aW9uKFRJTV9UeXBlRGVmICpUSU14KSB7DQotICBDTEVBUl9CSVQoVElNeC0+Q1IyLCBUSU1fQ1IyX1RJMVMpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEluZGljYXRlcyB3aGV0aGVyIHRoZSBUSU14X0NIMSwgQ0gyIGFuZCBDSDMgcGlucyBhcmUgY29ubmVjdGVjdGVkIHRvDQotICogdGhlIFRJMSBpbnB1dC4NCi0gKiBAbm90ZSBNYWNybyBJU19USU1fWE9SX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90DQotICogYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBhbiBYT1IgaW5wdXQuDQotICogQHJtdG9sbCBDUjIgICAgICAgICAgVEkxUyAgICAgICAgICBMTF9USU1fSUNfSXNFbmFibGVkWE9SQ29tYmluYXRpb24NCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lDX0lzRW5hYmxlZFhPUkNvbWJpbmF0aW9uKFRJTV9UeXBlRGVmICpUSU14KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5DUjIsIFRJTV9DUjJfVEkxUykgPT0gKFRJTV9DUjJfVEkxUykpID8gMVVMIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgY2FwdHVyZWQgdmFsdWUgZm9yIGlucHV0IGNoYW5uZWwgMS4NCi0gKiBAbm90ZSBJbiAzMi1iaXQgdGltZXIgaW1wbGVtZW50YXRpb25zIHJldHVybmVkIGNhcHR1cmVkIHZhbHVlIGNhbiBiZSBiZXR3ZWVuDQotICogMHgwMDAwMDAwMCBhbmQgMHhGRkZGRkZGRi4NCi0gKiBAbm90ZSBNYWNybyBJU19USU1fMzJCX0NPVU5URVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sNCi0gKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGEgMzIgYml0cyBjb3VudGVyLg0KLSAqIEBub3RlIE1hY3JvIElTX1RJTV9DQzFfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QNCi0gKiAgICAgICBpbnB1dCBjaGFubmVsIDEgaXMgc3VwcG9ydGVkIGJ5IGEgdGltZXIgaW5zdGFuY2UuDQotICogQG5vdGUgSWYgZGl0aGVyaW5nIGlzIGFjdGl2YXRlZCwgcGF5IGF0dGVudGlvbiB0byB0aGUgcmV0dXJuZWQgdmFsdWUNCi0gKiBpbnRlcnByZXRhdGlvbi4NCi0gKiBAcm10b2xsIENDUjEgICAgICAgICBDQ1IxICAgICAgICAgIExMX1RJTV9JQ19HZXRDYXB0dXJlQ0gxDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBDYXB0dXJlZFZhbHVlIChiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTY1NTM1KQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSUNfR2V0Q2FwdHVyZUNIMShUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9SRUcoVElNeC0+Q0NSMSkpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBjYXB0dXJlZCB2YWx1ZSBmb3IgaW5wdXQgY2hhbm5lbCAyLg0KLSAqIEBub3RlIEluIDMyLWJpdCB0aW1lciBpbXBsZW1lbnRhdGlvbnMgcmV0dXJuZWQgY2FwdHVyZWQgdmFsdWUgY2FuIGJlIGJldHdlZW4NCi0gKiAweDAwMDAwMDAwIGFuZCAweEZGRkZGRkZGLg0KLSAqIEBub3RlIE1hY3JvIElTX1RJTV8zMkJfQ09VTlRFUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaw0KLSAqICAgICAgIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgYSAzMiBiaXRzIGNvdW50ZXIuDQotICogQG5vdGUgTWFjcm8gSVNfVElNX0NDMl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdA0KLSAqICAgICAgIGlucHV0IGNoYW5uZWwgMiBpcyBzdXBwb3J0ZWQgYnkgYSB0aW1lciBpbnN0YW5jZS4NCi0gKiBAbm90ZSBJZiBkaXRoZXJpbmcgaXMgYWN0aXZhdGVkLCBwYXkgYXR0ZW50aW9uIHRvIHRoZSByZXR1cm5lZCB2YWx1ZQ0KLSAqIGludGVycHJldGF0aW9uLg0KLSAqIEBybXRvbGwgQ0NSMiAgICAgICAgIENDUjIgICAgICAgICAgTExfVElNX0lDX0dldENhcHR1cmVDSDINCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIENhcHR1cmVkVmFsdWUgKGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9NjU1MzUpDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9JQ19HZXRDYXB0dXJlQ0gyKFRJTV9UeXBlRGVmICpUSU14KSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX1JFRyhUSU14LT5DQ1IyKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IGNhcHR1cmVkIHZhbHVlIGZvciBpbnB1dCBjaGFubmVsIDMuDQotICogQG5vdGUgSW4gMzItYml0IHRpbWVyIGltcGxlbWVudGF0aW9ucyByZXR1cm5lZCBjYXB0dXJlZCB2YWx1ZSBjYW4gYmUgYmV0d2Vlbg0KLSAqIDB4MDAwMDAwMDAgYW5kIDB4RkZGRkZGRkYuDQotICogQG5vdGUgTWFjcm8gSVNfVElNXzMyQl9DT1VOVEVSX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrDQotICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBhIDMyIGJpdHMgY291bnRlci4NCi0gKiBAbm90ZSBNYWNybyBJU19USU1fQ0MzX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90DQotICogICAgICAgaW5wdXQgY2hhbm5lbCAzIGlzIHN1cHBvcnRlZCBieSBhIHRpbWVyIGluc3RhbmNlLg0KLSAqIEBub3RlIElmIGRpdGhlcmluZyBpcyBhY3RpdmF0ZWQsIHBheSBhdHRlbnRpb24gdG8gdGhlIHJldHVybmVkIHZhbHVlDQotICogaW50ZXJwcmV0YXRpb24uDQotICogQHJtdG9sbCBDQ1IzICAgICAgICAgQ0NSMyAgICAgICAgICBMTF9USU1fSUNfR2V0Q2FwdHVyZUNIMw0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgQ2FwdHVyZWRWYWx1ZSAoYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUzNSkNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lDX0dldENhcHR1cmVDSDMoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfUkVHKFRJTXgtPkNDUjMpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgY2FwdHVyZWQgdmFsdWUgZm9yIGlucHV0IGNoYW5uZWwgNC4NCi0gKiBAbm90ZSBJbiAzMi1iaXQgdGltZXIgaW1wbGVtZW50YXRpb25zIHJldHVybmVkIGNhcHR1cmVkIHZhbHVlIGNhbiBiZSBiZXR3ZWVuDQotICogMHgwMDAwMDAwMCBhbmQgMHhGRkZGRkZGRi4NCi0gKiBAbm90ZSBNYWNybyBJU19USU1fMzJCX0NPVU5URVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sNCi0gKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGEgMzIgYml0cyBjb3VudGVyLg0KLSAqIEBub3RlIE1hY3JvIElTX1RJTV9DQzRfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QNCi0gKiAgICAgICBpbnB1dCBjaGFubmVsIDQgaXMgc3VwcG9ydGVkIGJ5IGEgdGltZXIgaW5zdGFuY2UuDQotICogQG5vdGUgSWYgZGl0aGVyaW5nIGlzIGFjdGl2YXRlZCwgcGF5IGF0dGVudGlvbiB0byB0aGUgcmV0dXJuZWQgdmFsdWUNCi0gKiBpbnRlcnByZXRhdGlvbi4NCi0gKiBAcm10b2xsIENDUjQgICAgICAgICBDQ1I0ICAgICAgICAgIExMX1RJTV9JQ19HZXRDYXB0dXJlQ0g0DQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBDYXB0dXJlZFZhbHVlIChiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTY1NTM1KQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSUNfR2V0Q2FwdHVyZUNINChUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9SRUcoVElNeC0+Q0NSNCkpOw0KLX0NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0xMX0VGX0Nsb2NrX1NlbGVjdGlvbiBDb3VudGVyIGNsb2NrIHNlbGVjdGlvbg0KLSAqIEB7DQotICovDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgZXh0ZXJuYWwgY2xvY2sgbW9kZSAyLg0KLSAqIEBub3RlIFdoZW4gZXh0ZXJuYWwgY2xvY2sgbW9kZSAyIGlzIGVuYWJsZWQgdGhlIGNvdW50ZXIgaXMgY2xvY2tlZCBieSBhbnkNCi0gKiBhY3RpdmUgZWRnZSBvbiB0aGUgRVRSRiBzaWduYWwuDQotICogQG5vdGUgTWFjcm8gSVNfVElNX0NMT0NLU09VUkNFX0VUUk1PREUyX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrDQotICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBleHRlcm5hbCBjbG9jayBtb2RlMi4NCi0gKiBAcm10b2xsIFNNQ1IgICAgICAgICBFQ0UgICAgICAgICAgIExMX1RJTV9FbmFibGVFeHRlcm5hbENsb2NrDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZUV4dGVybmFsQ2xvY2soVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIFNFVF9CSVQoVElNeC0+U01DUiwgVElNX1NNQ1JfRUNFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIGV4dGVybmFsIGNsb2NrIG1vZGUgMi4NCi0gKiBAbm90ZSBNYWNybyBJU19USU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sNCi0gKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGV4dGVybmFsIGNsb2NrIG1vZGUyLg0KLSAqIEBybXRvbGwgU01DUiAgICAgICAgIEVDRSAgICAgICAgICAgTExfVElNX0Rpc2FibGVFeHRlcm5hbENsb2NrDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0Rpc2FibGVFeHRlcm5hbENsb2NrKFRJTV9UeXBlRGVmICpUSU14KSB7DQotICBDTEVBUl9CSVQoVElNeC0+U01DUiwgVElNX1NNQ1JfRUNFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIGV4dGVybmFsIGNsb2NrIG1vZGUgMiBpcyBlbmFibGVkLg0KLSAqIEBub3RlIE1hY3JvIElTX1RJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaw0KLSAqICAgICAgIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgZXh0ZXJuYWwgY2xvY2sgbW9kZTIuDQotICogQHJtdG9sbCBTTUNSICAgICAgICAgRUNFICAgICAgICAgICBMTF9USU1fSXNFbmFibGVkRXh0ZXJuYWxDbG9jaw0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNFbmFibGVkRXh0ZXJuYWxDbG9jayhUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+U01DUiwgVElNX1NNQ1JfRUNFKSA9PSAoVElNX1NNQ1JfRUNFKSkgPyAxVUwgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCB0aGUgY2xvY2sgc291cmNlIG9mIHRoZSBjb3VudGVyIGNsb2NrLg0KLSAqIEBub3RlIHdoZW4gc2VsZWN0ZWQgY2xvY2sgc291cmNlIGlzIGV4dGVybmFsIGNsb2NrIG1vZGUgMSwgdGhlIHRpbWVyIGlucHV0DQotICogICAgICAgdGhlIGV4dGVybmFsIGNsb2NrIGlzIGFwcGxpZWQgaXMgc2VsZWN0ZWQgYnkgY2FsbGluZyB0aGUgQHJlZg0KLSAqIExMX1RJTV9TZXRUcmlnZ2VySW5wdXQoKSBmdW5jdGlvbi4gVGhpcyB0aW1lciBpbnB1dCBtdXN0IGJlIGNvbmZpZ3VyZWQgYnkNCi0gKiBjYWxsaW5nIHRoZSBAcmVmIExMX1RJTV9JQ19Db25maWcoKSBmdW5jdGlvbi4NCi0gKiBAbm90ZSBNYWNybyBJU19USU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTFfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sNCi0gKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGV4dGVybmFsIGNsb2NrIG1vZGUxLg0KLSAqIEBub3RlIE1hY3JvIElTX1RJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaw0KLSAqICAgICAgIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgZXh0ZXJuYWwgY2xvY2sgbW9kZTIuDQotICogQHJtdG9sbCBTTUNSICAgICAgICAgU01TICAgICAgICAgICBMTF9USU1fU2V0Q2xvY2tTb3VyY2Vcbg0KLSAqICAgICAgICAgU01DUiAgICAgICAgIEVDRSAgICAgICAgICAgTExfVElNX1NldENsb2NrU291cmNlDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHBhcmFtICBDbG9ja1NvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DTE9DS1NPVVJDRV9JTlRFUk5BTA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DTE9DS1NPVVJDRV9FWFRfTU9ERTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0xPQ0tTT1VSQ0VfRVhUX01PREUyDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX1NldENsb2NrU291cmNlKFRJTV9UeXBlRGVmICpUSU14LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDbG9ja1NvdXJjZSkgew0KLSAgTU9ESUZZX1JFRyhUSU14LT5TTUNSLCBUSU1fU01DUl9TTVMgfCBUSU1fU01DUl9FQ0UsIENsb2NrU291cmNlKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZXQgdGhlIGVuY29kZXIgaW50ZXJmYWNlIG1vZGUuDQotICogQG5vdGUgTWFjcm8gSVNfVElNX0VOQ09ERVJfSU5URVJGQUNFX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrDQotICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyB0aGUgZW5jb2RlciBtb2RlLg0KLSAqIEBybXRvbGwgU01DUiAgICAgICAgIFNNUyAgICAgICAgICAgTExfVElNX1NldEVuY29kZXJNb2RlDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHBhcmFtICBFbmNvZGVyTW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FTkNPREVSTU9ERV9YMl9USTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRU5DT0RFUk1PREVfWDJfVEkyDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VOQ09ERVJNT0RFX1g0X1RJMTINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRU5DT0RFUk1PREVfQ0xPQ0tQTFVTRElSRUNUSU9OX1gyDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VOQ09ERVJNT0RFX0NMT0NLUExVU0RJUkVDVElPTl9YMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FTkNPREVSTU9ERV9ESVJFQ1RJT05BTENMT0NLX1gyDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VOQ09ERVJNT0RFX0RJUkVDVElPTkFMQ0xPQ0tfWDFfVEkxMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FTkNPREVSTU9ERV9YMV9USTENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRU5DT0RFUk1PREVfWDFfVEkyDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX1NldEVuY29kZXJNb2RlKFRJTV9UeXBlRGVmICpUSU14LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBFbmNvZGVyTW9kZSkgew0KLSAgTU9ESUZZX1JFRyhUSU14LT5TTUNSLCBUSU1fU01DUl9TTVMsIEVuY29kZXJNb2RlKTsNCi19DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9MTF9FRl9UaW1lcl9TeW5jaHJvbml6YXRpb24gVGltZXIgc3luY2hyb25pc2F0aW9uDQotICogY29uZmlndXJhdGlvbg0KLSAqIEB7DQotICovDQotLyoqDQotICogQGJyaWVmICBTZXQgdGhlIHRyaWdnZXIgb3V0cHV0IChUUkdPKSB1c2VkIGZvciB0aW1lciBzeW5jaHJvbml6YXRpb24gLg0KLSAqIEBub3RlIE1hY3JvIElTX1RJTV9NQVNURVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sNCi0gKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIGNhbiBvcGVyYXRlIGFzIGEgbWFzdGVyIHRpbWVyLg0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgIE1NUyAgICAgICAgICAgTExfVElNX1NldFRyaWdnZXJPdXRwdXQNCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcGFyYW0gIFRpbWVyU3luY2hyb25pemF0aW9uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZw0KLSAqIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFJHT19SRVNFVA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UUkdPX0VOQUJMRQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UUkdPX1VQREFURQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UUkdPX0NDMUlGDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RSR09fT0MxUkVGDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RSR09fT0MyUkVGDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RSR09fT0MzUkVGDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RSR09fT0M0UkVGDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RSR09fRU5DT0RFUkNMSw0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9TZXRUcmlnZ2VyT3V0cHV0KFRJTV9UeXBlRGVmICpUSU14LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVyU3luY2hyb25pemF0aW9uKSB7DQotICBNT0RJRllfUkVHKFRJTXgtPkNSMiwgVElNX0NSMl9NTVMsIFRpbWVyU3luY2hyb25pemF0aW9uKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZXQgdGhlIHRyaWdnZXIgb3V0cHV0IDIgKFRSR08yKSB1c2VkIGZvciBBREMgc3luY2hyb25pemF0aW9uIC4NCi0gKiBAbm90ZSBNYWNybyBJU19USU1fVFJHTzJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sNCi0gKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIGNhbiBiZSB1c2VkIGZvciBBREMgc3luY2hyb25pemF0aW9uLg0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgIE1NUzIgICAgICAgICAgTExfVElNX1NldFRyaWdnZXJPdXRwdXQyDQotICogQHBhcmFtICBUSU14IFRpbWVyIEluc3RhbmNlDQotICogQHBhcmFtICBBRENTeW5jaHJvbml6YXRpb24gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFJHTzJfUkVTRVQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFJHTzJfRU5BQkxFDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RSR08yX1VQREFURQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UUkdPMl9DQzFGDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RSR08yX09DMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UUkdPMl9PQzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFJHTzJfT0MzDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RSR08yX09DNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UUkdPMl9PQzUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFJHTzJfT0M2DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RSR08yX09DNF9SSVNJTkdGQUxMSU5HDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RSR08yX09DNl9SSVNJTkdGQUxMSU5HDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RSR08yX09DNF9SSVNJTkdfT0M2X1JJU0lORw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UUkdPMl9PQzRfUklTSU5HX09DNl9GQUxMSU5HDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RSR08yX09DNV9SSVNJTkdfT0M2X1JJU0lORw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UUkdPMl9PQzVfUklTSU5HX09DNl9GQUxMSU5HDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX1NldFRyaWdnZXJPdXRwdXQyKFRJTV9UeXBlRGVmICpUSU14LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBBRENTeW5jaHJvbml6YXRpb24pIHsNCi0gIE1PRElGWV9SRUcoVElNeC0+Q1IyLCBUSU1fQ1IyX01NUzIsIEFEQ1N5bmNocm9uaXphdGlvbik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IHRoZSBzeW5jaHJvbml6YXRpb24gbW9kZSBvZiBhIHNsYXZlIHRpbWVyLg0KLSAqIEBub3RlIE1hY3JvIElTX1RJTV9TTEFWRV9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdA0KLSAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgY2FuIG9wZXJhdGUgYXMgYSBzbGF2ZSB0aW1lci4NCi0gKiBAcm10b2xsIFNNQ1IgICAgICAgICBTTVMgICAgICAgICAgIExMX1RJTV9TZXRTbGF2ZU1vZGUNCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcGFyYW0gIFNsYXZlTW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9TTEFWRU1PREVfRElTQUJMRUQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fU0xBVkVNT0RFX1JFU0VUDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1NMQVZFTU9ERV9HQVRFRA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9TTEFWRU1PREVfVFJJR0dFUg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9TTEFWRU1PREVfQ09NQklORURfUkVTRVRUUklHR0VSDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1NMQVZFTU9ERV9DT01CSU5FRF9HQVRFRFJFU0VUDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX1NldFNsYXZlTW9kZShUSU1fVHlwZURlZiAqVElNeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFNsYXZlTW9kZSkgew0KLSAgTU9ESUZZX1JFRyhUSU14LT5TTUNSLCBUSU1fU01DUl9TTVMsIFNsYXZlTW9kZSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IHRoZSBzZWxlY3RzIHRoZSB0cmlnZ2VyIGlucHV0IHRvIGJlIHVzZWQgdG8gc3luY2hyb25pemUgdGhlDQotICogY291bnRlci4NCi0gKiBAbm90ZSBNYWNybyBJU19USU1fU0xBVkVfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QNCi0gKiAgICAgICBhIHRpbWVyIGluc3RhbmNlIGNhbiBvcGVyYXRlIGFzIGEgc2xhdmUgdGltZXIuDQotICogQHJtdG9sbCBTTUNSICAgICAgICAgVFMgICAgICAgICAgICBMTF9USU1fU2V0VHJpZ2dlcklucHV0DQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHBhcmFtICBUcmlnZ2VySW5wdXQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFNfSVRSMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UU19JVFIxDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RTX0lUUjINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFNfSVRSMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UU19USTFGX0VEDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RTX1RJMUZQMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UU19USTJGUDINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFNfRVRSRg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UU19JVFI0DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RTX0lUUjUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFNfSVRSNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UU19JVFI3DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RTX0lUUjgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFNfSVRSOQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UU19JVFIxMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UU19JVFIxMQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9TZXRUcmlnZ2VySW5wdXQoVElNX1R5cGVEZWYgKlRJTXgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUcmlnZ2VySW5wdXQpIHsNCi0gIE1PRElGWV9SRUcoVElNeC0+U01DUiwgVElNX1NNQ1JfVFMsIFRyaWdnZXJJbnB1dCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIHRoZSBNYXN0ZXIvU2xhdmUgbW9kZS4NCi0gKiBAbm90ZSBNYWNybyBJU19USU1fU0xBVkVfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QNCi0gKiAgICAgICBhIHRpbWVyIGluc3RhbmNlIGNhbiBvcGVyYXRlIGFzIGEgc2xhdmUgdGltZXIuDQotICogQHJtdG9sbCBTTUNSICAgICAgICAgTVNNICAgICAgICAgICBMTF9USU1fRW5hYmxlTWFzdGVyU2xhdmVNb2RlDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZU1hc3RlclNsYXZlTW9kZShUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgU0VUX0JJVChUSU14LT5TTUNSLCBUSU1fU01DUl9NU00pOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgdGhlIE1hc3Rlci9TbGF2ZSBtb2RlLg0KLSAqIEBub3RlIE1hY3JvIElTX1RJTV9TTEFWRV9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdA0KLSAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgY2FuIG9wZXJhdGUgYXMgYSBzbGF2ZSB0aW1lci4NCi0gKiBAcm10b2xsIFNNQ1IgICAgICAgICBNU00gICAgICAgICAgIExMX1RJTV9EaXNhYmxlTWFzdGVyU2xhdmVNb2RlDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0Rpc2FibGVNYXN0ZXJTbGF2ZU1vZGUoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIENMRUFSX0JJVChUSU14LT5TTUNSLCBUSU1fU01DUl9NU00pOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIE1hc3Rlci9TbGF2ZSBtb2RlIGlzIGVuYWJsZWQuDQotICogQG5vdGUgTWFjcm8gSVNfVElNX1NMQVZFX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90DQotICogYSB0aW1lciBpbnN0YW5jZSBjYW4gb3BlcmF0ZSBhcyBhIHNsYXZlIHRpbWVyLg0KLSAqIEBybXRvbGwgU01DUiAgICAgICAgIE1TTSAgICAgICAgICAgTExfVElNX0lzRW5hYmxlZE1hc3RlclNsYXZlTW9kZQ0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNFbmFibGVkTWFzdGVyU2xhdmVNb2RlKFRJTV9UeXBlRGVmICpUSU14KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5TTUNSLCBUSU1fU01DUl9NU00pID09IChUSU1fU01DUl9NU00pKSA/IDFVTCA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBleHRlcm5hbCB0cmlnZ2VyIChFVFIpIGlucHV0Lg0KLSAqIEBub3RlIE1hY3JvIElTX1RJTV9FVFJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QNCi0gKiAgICAgICBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGFuIGV4dGVybmFsIHRyaWdnZXIgaW5wdXQuDQotICogQHJtdG9sbCBTTUNSICAgICAgICAgRVRQICAgICAgICAgICBMTF9USU1fQ29uZmlnRVRSXG4NCi0gKiAgICAgICAgIFNNQ1IgICAgICAgICBFVFBTICAgICAgICAgIExMX1RJTV9Db25maWdFVFJcbg0KLSAqICAgICAgICAgU01DUiAgICAgICAgIEVURiAgICAgICAgICAgTExfVElNX0NvbmZpZ0VUUg0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEBwYXJhbSAgRVRSUG9sYXJpdHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRVRSX1BPTEFSSVRZX05PTklOVkVSVEVEDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VUUl9QT0xBUklUWV9JTlZFUlRFRA0KLSAqIEBwYXJhbSAgRVRSUHJlc2NhbGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VUUl9QUkVTQ0FMRVJfRElWMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FVFJfUFJFU0NBTEVSX0RJVjINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRVRSX1BSRVNDQUxFUl9ESVY0DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VUUl9QUkVTQ0FMRVJfRElWOA0KLSAqIEBwYXJhbSAgRVRSRmlsdGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VUUl9GSUxURVJfRkRJVjENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRVRSX0ZJTFRFUl9GRElWMV9OMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FVFJfRklMVEVSX0ZESVYxX040DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VUUl9GSUxURVJfRkRJVjFfTjgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRVRSX0ZJTFRFUl9GRElWMl9ONg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FVFJfRklMVEVSX0ZESVYyX044DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VUUl9GSUxURVJfRkRJVjRfTjYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRVRSX0ZJTFRFUl9GRElWNF9OOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FVFJfRklMVEVSX0ZESVY4X042DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VUUl9GSUxURVJfRkRJVjhfTjgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRVRSX0ZJTFRFUl9GRElWMTZfTjUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRVRSX0ZJTFRFUl9GRElWMTZfTjYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRVRSX0ZJTFRFUl9GRElWMTZfTjgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRVRSX0ZJTFRFUl9GRElWMzJfTjUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRVRSX0ZJTFRFUl9GRElWMzJfTjYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRVRSX0ZJTFRFUl9GRElWMzJfTjgNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ29uZmlnRVRSKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBFVFJQb2xhcml0eSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEVUUlByZXNjYWxlciwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEVUUkZpbHRlcikgew0KLSAgTU9ESUZZX1JFRyhUSU14LT5TTUNSLCBUSU1fU01DUl9FVFAgfCBUSU1fU01DUl9FVFBTIHwgVElNX1NNQ1JfRVRGLA0KLSAgICAgICAgICAgICBFVFJQb2xhcml0eSB8IEVUUlByZXNjYWxlciB8IEVUUkZpbHRlcik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2VsZWN0IHRoZSBleHRlcm5hbCB0cmlnZ2VyIChFVFIpIGlucHV0IHNvdXJjZS4NCi0gKiBAbm90ZSBNYWNybyBJU19USU1fRVRSU0VMX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3INCi0gKiAgICAgICBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBFVFIgc291cmNlIHNlbGVjdGlvbi4NCi0gKiBAcm10b2xsIEFGMSAgICAgICAgICBFVFJTRUwgICAgICAgIExMX1RJTV9TZXRFVFJTb3VyY2UNCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcGFyYW0gIEVUUlNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqDQotICogICAgICAgICBUSU0xOiBhbnkgY29tYmluYXRpb24gb2YgRVRSX1JNUCB3aGVyZQ0KLSAqDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTFfRVRSU09VUkNFX0dQSU8NCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMV9FVFJTT1VSQ0VfQ09NUDENCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMV9FVFJTT1VSQ0VfQ09NUDINCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMV9FVFJTT1VSQ0VfQ09NUDMNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMV9FVFJTT1VSQ0VfQ09NUDQNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMV9FVFJTT1VSQ0VfQ09NUDUgICAgICAgKCopDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTFfRVRSU09VUkNFX0NPTVA2ICAgICAgICgqKQ0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0xX0VUUlNPVVJDRV9DT01QNyAgICAgICAoKikNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMV9FVFJTT1VSQ0VfQURDMV9BV0QxDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTFfRVRSU09VUkNFX0FEQzFfQVdEMg0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0xX0VUUlNPVVJDRV9BREMxX0FXRDMNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMV9FVFJTT1VSQ0VfQURDNF9BV0QxICAgKCopDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTFfRVRSU09VUkNFX0FEQzRfQVdEMiAgICgqKQ0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0xX0VUUlNPVVJDRV9BREM0X0FXRDMgICAoKikNCi0gKg0KLSAqICAgICAgICAgVElNMjogYW55IGNvbWJpbmF0aW9uIG9mIEVUUl9STVAgd2hlcmUNCi0gKg0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0yX0VUUlNPVVJDRV9HUElPDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTJfRVRSU09VUkNFX0NPTVAxDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTJfRVRSU09VUkNFX0NPTVAyDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTJfRVRSU09VUkNFX0NPTVAzDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTJfRVRSU09VUkNFX0NPTVA0DQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTJfRVRSU09VUkNFX0NPTVA1ICAgICAgICgqKQ0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0yX0VUUlNPVVJDRV9DT01QNiAgICAgICAoKikNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMl9FVFJTT1VSQ0VfQ09NUDcgICAgICAgKCopDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTJfRVRSU09VUkNFX1RJTTNfRVRSDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTJfRVRSU09VUkNFX1RJTTRfRVRSDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTJfRVRSU09VUkNFX1RJTTVfRVRSICAgICgqKQ0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0yX0VUUlNPVVJDRV9MU0UNCi0gKg0KLSAqICAgICAgICAgVElNMzogYW55IGNvbWJpbmF0aW9uIG9mIEVUUl9STVAgd2hlcmUNCi0gKg0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0zX0VUUlNPVVJDRV9HUElPDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTNfRVRSU09VUkNFX0NPTVAxDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTNfRVRSU09VUkNFX0NPTVAyDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTNfRVRSU09VUkNFX0NPTVAzDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTNfRVRSU09VUkNFX0NPTVA0DQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTNfRVRSU09VUkNFX0NPTVA1ICAgICAgICgqKQ0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0zX0VUUlNPVVJDRV9DT01QNiAgICAgICAoKikNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNM19FVFJTT1VSQ0VfQ09NUDcgICAgICAgKCopDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTNfRVRSU09VUkNFX1RJTTJfRVRSDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTNfRVRSU09VUkNFX1RJTTRfRVRSDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTNfRVRSU09VUkNFX0FEQzJfQVdEMQ0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0zX0VUUlNPVVJDRV9BREMyX0FXRDINCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNM19FVFJTT1VSQ0VfQURDMl9BV0QzDQotICoNCi0gKiAgICAgICAgIFRJTTQ6IGFueSBjb21iaW5hdGlvbiBvZiBFVFJfUk1QIHdoZXJlDQotICoNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNNF9FVFJTT1VSQ0VfR1BJTw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU00X0VUUlNPVVJDRV9DT01QMQ0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU00X0VUUlNPVVJDRV9DT01QMg0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU00X0VUUlNPVVJDRV9DT01QMw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU00X0VUUlNPVVJDRV9DT01QNA0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU00X0VUUlNPVVJDRV9DT01QNSAgICAgICAoKikNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNNF9FVFJTT1VSQ0VfQ09NUDYgICAgICAgKCopDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTRfRVRSU09VUkNFX0NPTVA3ICAgICAgICgqKQ0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU00X0VUUlNPVVJDRV9USU0zX0VUUg0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU00X0VUUlNPVVJDRV9USU01X0VUUiAgICAoKikNCi0gKg0KLSAqICAgICAgICAgVElNNTogYW55IGNvbWJpbmF0aW9uIG9mIEVUUl9STVAgd2hlcmUgICAgICAgKCoqKQ0KLSAqDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTVfRVRSU09VUkNFX0dQSU8gICAgICAgICgqKQ0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU01X0VUUlNPVVJDRV9DT01QMSAgICAgICAoKikNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNNV9FVFJTT1VSQ0VfQ09NUDIgICAgICAgKCopDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTVfRVRSU09VUkNFX0NPTVAzICAgICAgICgqKQ0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU01X0VUUlNPVVJDRV9DT01QNCAgICAgICAoKikNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNNV9FVFJTT1VSQ0VfQ09NUDUgICAgICAgKCopDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTVfRVRSU09VUkNFX0NPTVA2ICAgICAgICgqKQ0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU01X0VUUlNPVVJDRV9DT01QNyAgICAgICAoKikNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNNV9FVFJTT1VSQ0VfVElNMl9FVFIgICAgKCopDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTVfRVRSU09VUkNFX1RJTTNfRVRSICAgICgqKQ0KLSAqDQotICogICAgICAgICBUSU04OiBhbnkgY29tYmluYXRpb24gb2YgRVRSX1JNUCB3aGVyZQ0KLSAqDQotICogICAgICAgICAgICAuIC4gRVRSX1JNUCBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTThfRVRSU09VUkNFX0dQSU8NCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNOF9FVFJTT1VSQ0VfQ09NUDENCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNOF9FVFJTT1VSQ0VfQ09NUDINCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNOF9FVFJTT1VSQ0VfQ09NUDMNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNOF9FVFJTT1VSQ0VfQ09NUDQNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNOF9FVFJTT1VSQ0VfQ09NUDUgICAgICAgKCopDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTThfRVRSU09VUkNFX0NPTVA2ICAgICAgICgqKQ0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU04X0VUUlNPVVJDRV9DT01QNyAgICAgICAoKikNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNOF9FVFJTT1VSQ0VfQURDMl9BV0QxDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTThfRVRSU09VUkNFX0FEQzJfQVdEMg0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU04X0VUUlNPVVJDRV9BREMyX0FXRDMNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNOF9FVFJTT1VSQ0VfQURDM19BV0QxICAgKCopDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTThfRVRSU09VUkNFX0FEQzNfQVdEMiAgICgqKQ0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU04X0VUUlNPVVJDRV9BREMzX0FXRDMgICAoKikNCi0gKg0KLSAqICAgICAgICAgVElNMjA6IGFueSBjb21iaW5hdGlvbiBvZiBFVFJfUk1QIHdoZXJlICAgICAgICgqKikNCi0gKg0KLSAqICAgICAgICAgICAgLiAuIEVUUl9STVAgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0yMF9FVFJTT1VSQ0VfR1BJTyAgICAgICAoKikNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMjBfRVRSU09VUkNFX0NPTVAxICAgICAgKCopDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTIwX0VUUlNPVVJDRV9DT01QMiAgICAgICgqKQ0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0yMF9FVFJTT1VSQ0VfQ09NUDMgICAgICAoKikNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMjBfRVRSU09VUkNFX0NPTVA0ICAgICAgKCopDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTIwX0VUUlNPVVJDRV9DT01QNSAgICAgICgqKQ0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0yMF9FVFJTT1VSQ0VfQ09NUDYgICAgICAoKikNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMjBfRVRSU09VUkNFX0NPTVA3ICAgICAgKCopDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTIwX0VUUlNPVVJDRV9BREMzX0FXRDEgICgqKQ0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0yMF9FVFJTT1VSQ0VfQURDM19BV0QyICAoKikNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMjBfRVRSU09VUkNFX0FEQzNfQVdEMyAgKCopDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTIwX0VUUlNPVVJDRV9BREM1X0FXRDEgICgqKQ0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0yMF9FVFJTT1VSQ0VfQURDNV9BV0QyICAoKikNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMjBfRVRSU09VUkNFX0FEQzVfQVdEMyAgKCopDQotICoNCi0gKiAgICAgICAgICgqKSAgVmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuIFxuDQotICogICAgICAgICAoKiopIFJlZ2lzdGVyIG5vdCBhdmFpbGFibGUgaW4gYWxsIGRldmljZXMuDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX1NldEVUUlNvdXJjZShUSU1fVHlwZURlZiAqVElNeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEVUUlNvdXJjZSkgew0KLSAgTU9ESUZZX1JFRyhUSU14LT5BRjEsIFRJTXhfQUYxX0VUUlNFTCwgRVRSU291cmNlKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgU01TIHByZWxvYWQuDQotICogQG5vdGUgTWFjcm8gSVNfVElNX1NNU19QUkVMT0FEX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrDQotICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyB0aGUgcHJlbG9hZCBvZiBTTVMgZmllbGQgaW4NCi0gKiBTTUNSIHJlZ2lzdGVyLg0KLSAqIEBybXRvbGwgU01DUiAgICAgICAgIFNNU1BFICAgICAgICAgICBMTF9USU1fRW5hYmxlU01TUHJlbG9hZA0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9FbmFibGVTTVNQcmVsb2FkKFRJTV9UeXBlRGVmICpUSU14KSB7DQotICBTRVRfQklUKFRJTXgtPlNNQ1IsIFRJTV9TTUNSX1NNU1BFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIFNNUyBwcmVsb2FkLg0KLSAqIEBub3RlIE1hY3JvIElTX1RJTV9TTVNfUFJFTE9BRF9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaw0KLSAqICAgICAgIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgdGhlIHByZWxvYWQgb2YgU01TIGZpZWxkIGluDQotICogU01DUiByZWdpc3Rlci4NCi0gKiBAcm10b2xsIFNNQ1IgICAgICAgICBTTVNQRSAgICAgICAgICAgTExfVElNX0Rpc2FibGVTTVNQcmVsb2FkDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0Rpc2FibGVTTVNQcmVsb2FkKFRJTV9UeXBlRGVmICpUSU14KSB7DQotICBDTEVBUl9CSVQoVElNeC0+U01DUiwgVElNX1NNQ1JfU01TUEUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgIFNNUyBwcmVsb2FkIGlzIGVuYWJsZWQuDQotICogQG5vdGUgTWFjcm8gSVNfVElNX1NNU19QUkVMT0FEX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrDQotICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyB0aGUgcHJlbG9hZCBvZiBTTVMgZmllbGQgaW4NCi0gKiBTTUNSIHJlZ2lzdGVyLg0KLSAqIEBybXRvbGwgU01DUiAgICAgICAgIFNNU1BFICAgICAgICAgICBMTF9USU1fSXNFbmFibGVkU01TUHJlbG9hZA0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNFbmFibGVkU01TUHJlbG9hZChUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+U01DUiwgVElNX1NNQ1JfU01TUEUpID09IChUSU1fU01DUl9TTVNQRSkpID8gMVVMDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCB0aGUgcHJlbG9hZCBzb3VyY2Ugb2YgU01TLg0KLSAqIEBub3RlIE1hY3JvIElTX1RJTV9TTVNfUFJFTE9BRF9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaw0KLSAqICAgICAgIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgdGhlIHByZWxvYWQgb2YgU01TIGZpZWxkIGluDQotICogU01DUiByZWdpc3Rlci4NCi0gKiBAcm10b2xsIFNNQ1IgICAgICAgICBTTVNQUyAgICAgICAgTExfVElNX1NldFNNU1ByZWxvYWRTb3VyY2Vcbg0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEBwYXJhbSAgUHJlbG9hZFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9TTVNQU19USU1VUERBVEUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fU01TUFNfSU5ERVgNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fU2V0U01TUHJlbG9hZFNvdXJjZShUSU1fVHlwZURlZiAqVElNeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQcmVsb2FkU291cmNlKSB7DQotICBNT0RJRllfUkVHKFRJTXgtPlNNQ1IsIFRJTV9TTUNSX1NNU1BTLCBQcmVsb2FkU291cmNlKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgdGhlIHByZWxvYWQgc291cmNlIG9mIFNNUy4NCi0gKiBAbm90ZSBNYWNybyBJU19USU1fU01TX1BSRUxPQURfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sNCi0gKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIHRoZSBwcmVsb2FkIG9mIFNNUyBmaWVsZCBpbg0KLSAqIFNNQ1IgcmVnaXN0ZXIuDQotICogQHJtdG9sbCBTTUNSICAgICAgICAgU01TUFMgICAgICAgIExMX1RJTV9HZXRTTVNQcmVsb2FkU291cmNlXG4NCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1NNU1BTX1RJTVVQREFURQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9TTVNQU19JTkRFWA0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fR2V0U01TUHJlbG9hZFNvdXJjZShUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVElNeC0+U01DUiwgVElNX1NNQ1JfU01TUFMpKTsNCi19DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9MTF9FRl9CcmVha19GdW5jdGlvbiBCcmVhayBmdW5jdGlvbiBjb25maWd1cmF0aW9uDQotICogQHsNCi0gKi8NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSB0aGUgYnJlYWsgZnVuY3Rpb24uDQotICogQG5vdGUgTWFjcm8gSVNfVElNX0JSRUFLX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90DQotICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBhIGJyZWFrIGlucHV0Lg0KLSAqIEBybXRvbGwgQkRUUiAgICAgICAgIEJLRSAgICAgICAgICAgTExfVElNX0VuYWJsZUJSSw0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9FbmFibGVCUksoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIFNFVF9CSVQoVElNeC0+QkRUUiwgVElNX0JEVFJfQktFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIHRoZSBicmVhayBmdW5jdGlvbi4NCi0gKiBAcm10b2xsIEJEVFIgICAgICAgICBCS0UgICAgICAgICAgIExMX1RJTV9EaXNhYmxlQlJLDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQG5vdGUgTWFjcm8gSVNfVElNX0JSRUFLX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90DQotICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBhIGJyZWFrIGlucHV0Lg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlQlJLKFRJTV9UeXBlRGVmICpUSU14KSB7DQotICBDTEVBUl9CSVQoVElNeC0+QkRUUiwgVElNX0JEVFJfQktFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDb25maWd1cmUgdGhlIGJyZWFrIGlucHV0Lg0KLSAqIEBub3RlIE1hY3JvIElTX1RJTV9CUkVBS19JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdA0KLSAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgYSBicmVhayBpbnB1dC4NCi0gKiBAbm90ZSBCaWRpcmVjdGlvbmFsIG1vZGUgaXMgb25seSBzdXBwb3J0ZWQgYnkgYWR2YW5jZWQgdGltZXIgaW5zdGFuY2VzLg0KLSAqICAgICAgIE1hY3JvIElTX1RJTV9BRFZBTkNFRF9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yDQotICogbm90IGEgdGltZXIgaW5zdGFuY2UgaXMgYW4gYWR2YW5jZWQtY29udHJvbCB0aW1lci4NCi0gKiBAbm90ZSBJbiBiaWRpcmVjdGlvbmFsIG1vZGUgKEJLQklEIGJpdCBzZXQpLCB0aGUgQnJlYWsgaW5wdXQgaXMgY29uZmlndXJlZA0KLSAqIGJvdGggaW4gaW5wdXQgbW9kZSBhbmQgaW4gb3BlbiBkcmFpbiBvdXRwdXQgbW9kZS4gQW55IGFjdGl2ZSBCcmVhayBldmVudCB3aWxsDQotICogICAgICAgIGFzc2VydCBhIGxvdyBsb2dpYyBsZXZlbCBvbiB0aGUgQnJlYWsgaW5wdXQgdG8gaW5kaWNhdGUgYW4gaW50ZXJuYWwNCi0gKiBicmVhayBldmVudCB0byBleHRlcm5hbCBkZXZpY2VzLg0KLSAqIEBub3RlIFdoZW4gYmlkaXJlY3Rpb25hbCBtb2RlIGlzbid0IHN1cHBvcnRlZCwgQnJlYWtBRk1vZGUgbXVzdCBiZSBzZXQgdG8NCi0gKiAgICAgICBMTF9USU1fQlJFQUtfQUZNT0RFX0lOUFVULg0KLSAqIEBybXRvbGwgQkRUUiAgICAgICAgIEJLUCAgICAgICAgICAgTExfVElNX0NvbmZpZ0JSS1xuDQotICogICAgICAgICBCRFRSICAgICAgICAgQktGICAgICAgICAgICBMTF9USU1fQ29uZmlnQlJLXG4NCi0gKiAgICAgICAgIEJEVFIgICAgICAgICBCS0JJRCAgICAgICAgIExMX1RJTV9Db25maWdCUksNCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcGFyYW0gIEJyZWFrUG9sYXJpdHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUtfUE9MQVJJVFlfTE9XDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLX1BPTEFSSVRZX0hJR0gNCi0gKiBAcGFyYW0gIEJyZWFrRmlsdGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjFfTjINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYxX040DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWMV9OOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjJfTjYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYyX044DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWNF9ONg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjRfTjgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVY4X042DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWOF9OOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjE2X041DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWMTZfTjYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYxNl9OOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjMyX041DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWMzJfTjYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYzMl9OOA0KLSAqIEBwYXJhbSAgQnJlYWtBRk1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUtfQUZNT0RFX0lOUFVUDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLX0FGTU9ERV9CSURJUkVDVElPTkFMDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NvbmZpZ0JSSyhUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQnJlYWtQb2xhcml0eSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEJyZWFrRmlsdGVyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQnJlYWtBRk1vZGUpIHsNCi0gIE1PRElGWV9SRUcoVElNeC0+QkRUUiwgVElNX0JEVFJfQktQIHwgVElNX0JEVFJfQktGIHwgVElNX0JEVFJfQktCSUQsDQotICAgICAgICAgICAgIEJyZWFrUG9sYXJpdHkgfCBCcmVha0ZpbHRlciB8IEJyZWFrQUZNb2RlKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhcm0gdGhlIGJyZWFrIGlucHV0ICh3aGVuIGl0IG9wZXJhdGVzIGluIGJpZGlyZWN0aW9uYWwgbW9kZSkuDQotICogQG5vdGUgIFRoZSBicmVhayBpbnB1dCBjYW4gYmUgZGlzYXJtZWQgb25seSB3aGVuIGl0IGlzIGNvbmZpZ3VyZWQgaW4NCi0gKiAgICAgICAgYmlkaXJlY3Rpb25hbCBtb2RlIGFuZCB3aGVuIHdoZW4gTU9FIGlzIHJlc2V0Lg0KLSAqIEBub3RlICBQdXJwb3NlIGlzIHRvIGJlIGFibGUgdG8gaGF2ZSB0aGUgaW5wdXQgdm9sdGFnZSBiYWNrIHRvIGhpZ2gtc3RhdGUsDQotICogICAgICAgIHdoYXRldmVyIHRoZSB0aW1lIGNvbnN0YW50IG9uIHRoZSBvdXRwdXQgLg0KLSAqIEBybXRvbGwgQkRUUiAgICAgICAgIEJLRFNSTSAgICAgICAgTExfVElNX0Rpc2FybUJSSw0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhcm1CUksoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIFNFVF9CSVQoVElNeC0+QkRUUiwgVElNX0JEVFJfQktEU1JNKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBSZS1hcm0gdGhlIGJyZWFrIGlucHV0ICh3aGVuIGl0IG9wZXJhdGVzIGluIGJpZGlyZWN0aW9uYWwgbW9kZSkuDQotICogQG5vdGUgIFRoZSBCcmVhayBpbnB1dCBpcyBhdXRvbWF0aWNhbGx5IGFybWVkIGFzIHNvb24gYXMgTU9FIGJpdCBpcyBzZXQuDQotICogQHJtdG9sbCBCRFRSICAgICAgICAgQktEU1JNICAgICAgICBMTF9USU1fUmVBcm1CUksNCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fUmVBcm1CUksoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIENMRUFSX0JJVChUSU14LT5CRFRSLCBUSU1fQkRUUl9CS0RTUk0pOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSB0aGUgYnJlYWsgMiBmdW5jdGlvbi4NCi0gKiBAbm90ZSBNYWNybyBJU19USU1fQktJTjJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QNCi0gKiAgICAgICBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGEgc2Vjb25kIGJyZWFrIGlucHV0Lg0KLSAqIEBybXRvbGwgQkRUUiAgICAgICAgIEJLMkUgICAgICAgICAgTExfVElNX0VuYWJsZUJSSzINCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlQlJLMihUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgU0VUX0JJVChUSU14LT5CRFRSLCBUSU1fQkRUUl9CSzJFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIHRoZSBicmVhayAgMiBmdW5jdGlvbi4NCi0gKiBAbm90ZSBNYWNybyBJU19USU1fQktJTjJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QNCi0gKiAgICAgICBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGEgc2Vjb25kIGJyZWFrIGlucHV0Lg0KLSAqIEBybXRvbGwgQkRUUiAgICAgICAgIEJLMkUgICAgICAgICAgTExfVElNX0Rpc2FibGVCUksyDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0Rpc2FibGVCUksyKFRJTV9UeXBlRGVmICpUSU14KSB7DQotICBDTEVBUl9CSVQoVElNeC0+QkRUUiwgVElNX0JEVFJfQksyRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBicmVhayAyIGlucHV0Lg0KLSAqIEBub3RlIE1hY3JvIElTX1RJTV9CS0lOMl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdA0KLSAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgYSBzZWNvbmQgYnJlYWsgaW5wdXQuDQotICogQG5vdGUgQmlkaXJlY3Rpb25hbCBtb2RlIGlzIG9ubHkgc3VwcG9ydGVkIGJ5IGFkdmFuY2VkIHRpbWVyIGluc3RhbmNlcy4NCi0gKiAgICAgICBNYWNybyBJU19USU1fQURWQU5DRURfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvcg0KLSAqIG5vdCBhIHRpbWVyIGluc3RhbmNlIGlzIGFuIGFkdmFuY2VkLWNvbnRyb2wgdGltZXIuDQotICogQG5vdGUgSW4gYmlkaXJlY3Rpb25hbCBtb2RlIChCSzJCSUQgYml0IHNldCksIHRoZSBCcmVhayAyIGlucHV0IGlzIGNvbmZpZ3VyZWQNCi0gKiBib3RoIGluIGlucHV0IG1vZGUgYW5kIGluIG9wZW4gZHJhaW4gb3V0cHV0IG1vZGUuIEFueSBhY3RpdmUgQnJlYWsgZXZlbnQgd2lsbA0KLSAqICAgICAgICBhc3NlcnQgYSBsb3cgbG9naWMgbGV2ZWwgb24gdGhlIEJyZWFrIDIgaW5wdXQgdG8gaW5kaWNhdGUgYW4gaW50ZXJuYWwNCi0gKiBicmVhayBldmVudCB0byBleHRlcm5hbCBkZXZpY2VzLg0KLSAqIEBub3RlIFdoZW4gYmlkaXJlY3Rpb25hbCBtb2RlIGlzbid0IHN1cHBvcnRlZCwgQnJlYWsyQUZNb2RlIG11c3QgYmUgc2V0IHRvDQotICogICAgICAgTExfVElNX0JSRUFLMl9BRk1PREVfSU5QVVQuDQotICogQHJtdG9sbCBCRFRSICAgICAgICAgQksyUCAgICAgICAgICBMTF9USU1fQ29uZmlnQlJLMlxuDQotICogICAgICAgICBCRFRSICAgICAgICAgQksyRiAgICAgICAgICBMTF9USU1fQ29uZmlnQlJLMlxuDQotICogICAgICAgICBCRFRSICAgICAgICAgQksyQklEICAgICAgICBMTF9USU1fQ29uZmlnQlJLMg0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEBwYXJhbSAgQnJlYWsyUG9sYXJpdHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUsyX1BPTEFSSVRZX0xPVw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBSzJfUE9MQVJJVFlfSElHSA0KLSAqIEBwYXJhbSAgQnJlYWsyRmlsdGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMV9OMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYxX040DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjFfTjgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMl9ONg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYyX044DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjRfTjYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWNF9OOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVY4X042DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjhfTjgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMTZfTjUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMTZfTjYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMTZfTjgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMzJfTjUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMzJfTjYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMzJfTjgNCi0gKiBAcGFyYW0gIEJyZWFrMkFGTW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBSzJfQUZNT0RFX0lOUFVUDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLMl9BRk1PREVfQklESVJFQ1RJT05BTA0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9Db25maWdCUksyKFRJTV9UeXBlRGVmICpUSU14LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEJyZWFrMlBvbGFyaXR5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEJyZWFrMkZpbHRlciwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBCcmVhazJBRk1vZGUpIHsNCi0gIE1PRElGWV9SRUcoVElNeC0+QkRUUiwgVElNX0JEVFJfQksyUCB8IFRJTV9CRFRSX0JLMkYgfCBUSU1fQkRUUl9CSzJCSUQsDQotICAgICAgICAgICAgIEJyZWFrMlBvbGFyaXR5IHwgQnJlYWsyRmlsdGVyIHwgQnJlYWsyQUZNb2RlKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhcm0gdGhlIGJyZWFrIDIgaW5wdXQgKHdoZW4gaXQgb3BlcmF0ZXMgaW4gYmlkaXJlY3Rpb25hbCBtb2RlKS4NCi0gKiBAbm90ZSAgVGhlIGJyZWFrIDIgaW5wdXQgY2FuIGJlIGRpc2FybWVkIG9ubHkgd2hlbiBpdCBpcyBjb25maWd1cmVkIGluDQotICogICAgICAgIGJpZGlyZWN0aW9uYWwgbW9kZSBhbmQgd2hlbiB3aGVuIE1PRSBpcyByZXNldC4NCi0gKiBAbm90ZSAgUHVycG9zZSBpcyB0byBiZSBhYmxlIHRvIGhhdmUgdGhlIGlucHV0IHZvbHRhZ2UgYmFjayB0byBoaWdoLXN0YXRlLA0KLSAqICAgICAgICB3aGF0ZXZlciB0aGUgdGltZSBjb25zdGFudCBvbiB0aGUgb3V0cHV0Lg0KLSAqIEBybXRvbGwgQkRUUiAgICAgICAgIEJLMkRTUk0gICAgICAgTExfVElNX0Rpc2FybUJSSzINCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYXJtQlJLMihUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgU0VUX0JJVChUSU14LT5CRFRSLCBUSU1fQkRUUl9CSzJEU1JNKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBSZS1hcm0gdGhlIGJyZWFrIDIgaW5wdXQgKHdoZW4gaXQgb3BlcmF0ZXMgaW4gYmlkaXJlY3Rpb25hbCBtb2RlKS4NCi0gKiBAbm90ZSAgVGhlIEJyZWFrIDIgaW5wdXQgaXMgYXV0b21hdGljYWxseSBhcm1lZCBhcyBzb29uIGFzIE1PRSBiaXQgaXMgc2V0Lg0KLSAqIEBybXRvbGwgQkRUUiAgICAgICAgIEJLMkRTUk0gICAgICAgTExfVElNX1JlQXJtQlJLMg0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9SZUFybUJSSzIoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIENMRUFSX0JJVChUSU14LT5CRFRSLCBUSU1fQkRUUl9CSzJEU1JNKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZWxlY3QgdGhlIG91dHB1dHMgb2ZmIHN0YXRlIChlbmFibGVkIHYucy4gZGlzYWJsZWQpIGluIElkbGUgYW5kIFJ1bg0KLSAqIG1vZGVzLg0KLSAqIEBub3RlIE1hY3JvIElTX1RJTV9CUkVBS19JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdA0KLSAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgYSBicmVhayBpbnB1dC4NCi0gKiBAcm10b2xsIEJEVFIgICAgICAgICBPU1NJICAgICAgICAgIExMX1RJTV9TZXRPZmZTdGF0ZXNcbg0KLSAqICAgICAgICAgQkRUUiAgICAgICAgIE9TU1IgICAgICAgICAgTExfVElNX1NldE9mZlN0YXRlcw0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEBwYXJhbSAgT2ZmU3RhdGVJZGxlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09TU0lfRElTQUJMRQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PU1NJX0VOQUJMRQ0KLSAqIEBwYXJhbSAgT2ZmU3RhdGVSdW4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT1NTUl9ESVNBQkxFDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09TU1JfRU5BQkxFDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX1NldE9mZlN0YXRlcyhUSU1fVHlwZURlZiAqVElNeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE9mZlN0YXRlSWRsZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE9mZlN0YXRlUnVuKSB7DQotICBNT0RJRllfUkVHKFRJTXgtPkJEVFIsIFRJTV9CRFRSX09TU0kgfCBUSU1fQkRUUl9PU1NSLA0KLSAgICAgICAgICAgICBPZmZTdGF0ZUlkbGUgfCBPZmZTdGF0ZVJ1bik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIGF1dG9tYXRpYyBvdXRwdXQgKE1PRSBjYW4gYmUgc2V0IGJ5IHNvZnR3YXJlIG9yIGF1dG9tYXRpY2FsbHkNCi0gKiB3aGVuIGEgYnJlYWsgaW5wdXQgaXMgYWN0aXZlKS4NCi0gKiBAbm90ZSBNYWNybyBJU19USU1fQlJFQUtfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QNCi0gKiAgICAgICBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGEgYnJlYWsgaW5wdXQuDQotICogQHJtdG9sbCBCRFRSICAgICAgICAgQU9FICAgICAgICAgICBMTF9USU1fRW5hYmxlQXV0b21hdGljT3V0cHV0DQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZUF1dG9tYXRpY091dHB1dChUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgU0VUX0JJVChUSU14LT5CRFRSLCBUSU1fQkRUUl9BT0UpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgYXV0b21hdGljIG91dHB1dCAoTU9FIGNhbiBiZSBzZXQgb25seSBieSBzb2Z0d2FyZSkuDQotICogQG5vdGUgTWFjcm8gSVNfVElNX0JSRUFLX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90DQotICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBhIGJyZWFrIGlucHV0Lg0KLSAqIEBybXRvbGwgQkRUUiAgICAgICAgIEFPRSAgICAgICAgICAgTExfVElNX0Rpc2FibGVBdXRvbWF0aWNPdXRwdXQNCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZUF1dG9tYXRpY091dHB1dChUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgQ0xFQVJfQklUKFRJTXgtPkJEVFIsIFRJTV9CRFRSX0FPRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciBhdXRvbWF0aWMgb3V0cHV0IGlzIGVuYWJsZWQuDQotICogQG5vdGUgTWFjcm8gSVNfVElNX0JSRUFLX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90DQotICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBhIGJyZWFrIGlucHV0Lg0KLSAqIEBybXRvbGwgQkRUUiAgICAgICAgIEFPRSAgICAgICAgICAgTExfVElNX0lzRW5hYmxlZEF1dG9tYXRpY091dHB1dA0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNFbmFibGVkQXV0b21hdGljT3V0cHV0KFRJTV9UeXBlRGVmICpUSU14KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5CRFRSLCBUSU1fQkRUUl9BT0UpID09IChUSU1fQkRUUl9BT0UpKSA/IDFVTCA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIHRoZSBvdXRwdXRzIChzZXQgdGhlIE1PRSBiaXQgaW4gVElNeF9CRFRSIHJlZ2lzdGVyKS4NCi0gKiBAbm90ZSBUaGUgTU9FIGJpdCBpbiBUSU14X0JEVFIgcmVnaXN0ZXIgYWxsb3dzIHRvIGVuYWJsZSAvZGlzYWJsZSB0aGUgb3V0cHV0cw0KLSAqIGJ5IHNvZnR3YXJlIGFuZCBpcyByZXNldCBpbiBjYXNlIG9mIGJyZWFrIG9yIGJyZWFrMiBldmVudA0KLSAqIEBub3RlIE1hY3JvIElTX1RJTV9CUkVBS19JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdA0KLSAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgYSBicmVhayBpbnB1dC4NCi0gKiBAcm10b2xsIEJEVFIgICAgICAgICBNT0UgICAgICAgICAgIExMX1RJTV9FbmFibGVBbGxPdXRwdXRzDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZUFsbE91dHB1dHMoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIFNFVF9CSVQoVElNeC0+QkRUUiwgVElNX0JEVFJfTU9FKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIHRoZSBvdXRwdXRzIChyZXNldCB0aGUgTU9FIGJpdCBpbiBUSU14X0JEVFIgcmVnaXN0ZXIpLg0KLSAqIEBub3RlIFRoZSBNT0UgYml0IGluIFRJTXhfQkRUUiByZWdpc3RlciBhbGxvd3MgdG8gZW5hYmxlIC9kaXNhYmxlIHRoZSBvdXRwdXRzDQotICogYnkgc29mdHdhcmUgYW5kIGlzIHJlc2V0IGluIGNhc2Ugb2YgYnJlYWsgb3IgYnJlYWsyIGV2ZW50Lg0KLSAqIEBub3RlIE1hY3JvIElTX1RJTV9CUkVBS19JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdA0KLSAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgYSBicmVhayBpbnB1dC4NCi0gKiBAcm10b2xsIEJEVFIgICAgICAgICBNT0UgICAgICAgICAgIExMX1RJTV9EaXNhYmxlQWxsT3V0cHV0cw0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlQWxsT3V0cHV0cyhUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgQ0xFQVJfQklUKFRJTXgtPkJEVFIsIFRJTV9CRFRSX01PRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgb3V0cHV0cyBhcmUgZW5hYmxlZC4NCi0gKiBAbm90ZSBNYWNybyBJU19USU1fQlJFQUtfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QNCi0gKiAgICAgICBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGEgYnJlYWsgaW5wdXQuDQotICogQHJtdG9sbCBCRFRSICAgICAgICAgTU9FICAgICAgICAgICBMTF9USU1fSXNFbmFibGVkQWxsT3V0cHV0cw0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNFbmFibGVkQWxsT3V0cHV0cyhUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+QkRUUiwgVElNX0JEVFJfTU9FKSA9PSAoVElNX0JEVFJfTU9FKSkgPyAxVUwgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSB0aGUgc2lnbmFscyBjb25uZWN0ZWQgdG8gdGhlIGRlc2lnbmF0ZWQgdGltZXIgYnJlYWsgaW5wdXQuDQotICogQG5vdGUgTWFjcm8gSVNfVElNX0JSRUFLU09VUkNFX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXINCi0gKiAgICAgICBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBhbGxvd3MgZm9yIGJyZWFrIGlucHV0IHNlbGVjdGlvbi4NCi0gKiBAcm10b2xsIEFGMSAgICAgICAgICBCS0lORSAgICAgICAgIExMX1RJTV9FbmFibGVCcmVha0lucHV0U291cmNlXG4NCi0gKiAgICAgICAgIEFGMSAgICAgICAgICBCS0NNUDFFICAgICAgIExMX1RJTV9FbmFibGVCcmVha0lucHV0U291cmNlXG4NCi0gKiAgICAgICAgIEFGMSAgICAgICAgICBCS0NNUDJFICAgICAgIExMX1RJTV9FbmFibGVCcmVha0lucHV0U291cmNlXG4NCi0gKiAgICAgICAgIEFGMSAgICAgICAgICBCS0NNUDNFICAgICAgIExMX1RJTV9FbmFibGVCcmVha0lucHV0U291cmNlXG4NCi0gKiAgICAgICAgIEFGMSAgICAgICAgICBCS0NNUDRFICAgICAgIExMX1RJTV9FbmFibGVCcmVha0lucHV0U291cmNlXG4NCi0gKiAgICAgICAgIEFGMSAgICAgICAgICBCS0NNUDVFICAgICAgIExMX1RJTV9FbmFibGVCcmVha0lucHV0U291cmNlXG4NCi0gKiAgICAgICAgIEFGMSAgICAgICAgICBCS0NNUDZFICAgICAgIExMX1RJTV9FbmFibGVCcmVha0lucHV0U291cmNlXG4NCi0gKiAgICAgICAgIEFGMSAgICAgICAgICBCS0NNUDdFICAgICAgIExMX1RJTV9FbmFibGVCcmVha0lucHV0U291cmNlXG4NCi0gKiAgICAgICAgIEFGMiAgICAgICAgICBCSzJORSAgICAgICAgIExMX1RJTV9FbmFibGVCcmVha0lucHV0U291cmNlXG4NCi0gKiAgICAgICAgIEFGMiAgICAgICAgICBCSzJDTVAxRSAgICAgIExMX1RJTV9FbmFibGVCcmVha0lucHV0U291cmNlXG4NCi0gKiAgICAgICAgIEFGMiAgICAgICAgICBCSzJDTVAyRSAgICAgIExMX1RJTV9FbmFibGVCcmVha0lucHV0U291cmNlXG4NCi0gKiAgICAgICAgIEFGMiAgICAgICAgICBCSzJDTVAzRSAgICAgIExMX1RJTV9FbmFibGVCcmVha0lucHV0U291cmNlXG4NCi0gKiAgICAgICAgIEFGMiAgICAgICAgICBCSzJDTVA0RSAgICAgIExMX1RJTV9FbmFibGVCcmVha0lucHV0U291cmNlXG4NCi0gKiAgICAgICAgIEFGMiAgICAgICAgICBCSzJDTVA1RSAgICAgIExMX1RJTV9FbmFibGVCcmVha0lucHV0U291cmNlXG4NCi0gKiAgICAgICAgIEFGMiAgICAgICAgICBCSzJDTVA2RSAgICAgIExMX1RJTV9FbmFibGVCcmVha0lucHV0U291cmNlXG4NCi0gKiAgICAgICAgIEFGMiAgICAgICAgICBCSzJDTVA3RSAgICAgIExMX1RJTV9FbmFibGVCcmVha0lucHV0U291cmNlDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHBhcmFtICBCcmVha0lucHV0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLX0lOUFVUX0JLSU4NCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUtfSU5QVVRfQktJTjINCi0gKiBAcGFyYW0gIFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CS0lOX1NPVVJDRV9CS0lODQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JLSU5fU09VUkNFX0JLQ09NUDENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQktJTl9TT1VSQ0VfQktDT01QMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CS0lOX1NPVVJDRV9CS0NPTVAzDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JLSU5fU09VUkNFX0JLQ09NUDQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQktJTl9TT1VSQ0VfQktDT01QNSAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQktJTl9TT1VSQ0VfQktDT01QNiAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQktJTl9TT1VSQ0VfQktDT01QNyAoKikNCi0gKg0KLSAqICAgICAgICAgKCopICBWYWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlQnJlYWtJbnB1dFNvdXJjZShUSU1fVHlwZURlZiAqVElNeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBCcmVha0lucHV0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFNvdXJjZSkgew0KLSAgX19JTyB1aW50MzJfdCAqcFJlZyA9DQotICAgICAgKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZUSU14LT5BRjEpICsgQnJlYWtJbnB1dCkpOw0KLSAgU0VUX0JJVCgqcFJlZywgU291cmNlKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIHRoZSBzaWduYWxzIGNvbm5lY3RlZCB0byB0aGUgZGVzaWduYXRlZCB0aW1lciBicmVhayBpbnB1dC4NCi0gKiBAbm90ZSBNYWNybyBJU19USU1fQlJFQUtTT1VSQ0VfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlcg0KLSAqICAgICAgIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIGFsbG93cyBmb3IgYnJlYWsgaW5wdXQgc2VsZWN0aW9uLg0KLSAqIEBybXRvbGwgQUYxICAgICAgICAgIEJLSU5FICAgICAgICAgTExfVElNX0Rpc2FibGVCcmVha0lucHV0U291cmNlXG4NCi0gKiAgICAgICAgIEFGMSAgICAgICAgICBCS0NNUDFFICAgICAgIExMX1RJTV9EaXNhYmxlQnJlYWtJbnB1dFNvdXJjZVxuDQotICogICAgICAgICBBRjEgICAgICAgICAgQktDTVAyRSAgICAgICBMTF9USU1fRGlzYWJsZUJyZWFrSW5wdXRTb3VyY2Vcbg0KLSAqICAgICAgICAgQUYxICAgICAgICAgIEJLQ01QM0UgICAgICAgTExfVElNX0Rpc2FibGVCcmVha0lucHV0U291cmNlXG4NCi0gKiAgICAgICAgIEFGMSAgICAgICAgICBCS0NNUDRFICAgICAgIExMX1RJTV9EaXNhYmxlQnJlYWtJbnB1dFNvdXJjZVxuDQotICogICAgICAgICBBRjEgICAgICAgICAgQktDTVA1RSAgICAgICBMTF9USU1fRGlzYWJsZUJyZWFrSW5wdXRTb3VyY2Vcbg0KLSAqICAgICAgICAgQUYxICAgICAgICAgIEJLQ01QNkUgICAgICAgTExfVElNX0Rpc2FibGVCcmVha0lucHV0U291cmNlXG4NCi0gKiAgICAgICAgIEFGMSAgICAgICAgICBCS0NNUDdFICAgICAgIExMX1RJTV9EaXNhYmxlQnJlYWtJbnB1dFNvdXJjZVxuDQotICogICAgICAgICBBRjIgICAgICAgICAgQktJTkUgICAgICAgICBMTF9USU1fRGlzYWJsZUJyZWFrSW5wdXRTb3VyY2Vcbg0KLSAqICAgICAgICAgQUYyICAgICAgICAgIEJLQ01QMUUgICAgICAgTExfVElNX0Rpc2FibGVCcmVha0lucHV0U291cmNlXG4NCi0gKiAgICAgICAgIEFGMiAgICAgICAgICBCS0NNUDJFICAgICAgIExMX1RJTV9EaXNhYmxlQnJlYWtJbnB1dFNvdXJjZVxuDQotICogICAgICAgICBBRjIgICAgICAgICAgQktDTVAzRSAgICAgICBMTF9USU1fRGlzYWJsZUJyZWFrSW5wdXRTb3VyY2Vcbg0KLSAqICAgICAgICAgQUYyICAgICAgICAgIEJLQ01QNEUgICAgICAgTExfVElNX0Rpc2FibGVCcmVha0lucHV0U291cmNlXG4NCi0gKiAgICAgICAgIEFGMiAgICAgICAgICBCS0NNUDVFICAgICAgIExMX1RJTV9EaXNhYmxlQnJlYWtJbnB1dFNvdXJjZVxuDQotICogICAgICAgICBBRjIgICAgICAgICAgQktDTVA2RSAgICAgICBMTF9USU1fRGlzYWJsZUJyZWFrSW5wdXRTb3VyY2Vcbg0KLSAqICAgICAgICAgQUYyICAgICAgICAgIEJLQ01QN0UgICAgICAgTExfVElNX0Rpc2FibGVCcmVha0lucHV0U291cmNlDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHBhcmFtICBCcmVha0lucHV0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLX0lOUFVUX0JLSU4NCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUtfSU5QVVRfQktJTjINCi0gKiBAcGFyYW0gIFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CS0lOX1NPVVJDRV9CS0lODQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JLSU5fU09VUkNFX0JLQ09NUDENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQktJTl9TT1VSQ0VfQktDT01QMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CS0lOX1NPVVJDRV9CS0NPTVAzDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JLSU5fU09VUkNFX0JLQ09NUDQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQktJTl9TT1VSQ0VfQktDT01QNSAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQktJTl9TT1VSQ0VfQktDT01QNiAoKikNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQktJTl9TT1VSQ0VfQktDT01QNyAoKikNCi0gKg0KLSAqICAgICAgICAgKCopICBWYWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZUJyZWFrSW5wdXRTb3VyY2UoVElNX1R5cGVEZWYgKlRJTXgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEJyZWFrSW5wdXQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFNvdXJjZSkgew0KLSAgX19JTyB1aW50MzJfdCAqcFJlZyA9DQotICAgICAgKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZUSU14LT5BRjEpICsgQnJlYWtJbnB1dCkpOw0KLSAgQ0xFQVJfQklUKCpwUmVnLCBTb3VyY2UpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCB0aGUgcG9sYXJpdHkgb2YgdGhlIGJyZWFrIHNpZ25hbCBmb3IgdGhlIHRpbWVyIGJyZWFrIGlucHV0Lg0KLSAqIEBub3RlIE1hY3JvIElTX1RJTV9CUkVBS1NPVVJDRV9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyDQotICogICAgICAgb3Igbm90IGEgdGltZXIgaW5zdGFuY2UgYWxsb3dzIGZvciBicmVhayBpbnB1dCBzZWxlY3Rpb24uDQotICogQHJtdG9sbCBBRjEgICAgICAgICAgQktJTlAgICAgICAgICBMTF9USU1fU2V0QnJlYWtJbnB1dFNvdXJjZVBvbGFyaXR5XG4NCi0gKiAgICAgICAgIEFGMSAgICAgICAgICBCS0NNUDFQICAgICAgIExMX1RJTV9TZXRCcmVha0lucHV0U291cmNlUG9sYXJpdHlcbg0KLSAqICAgICAgICAgQUYxICAgICAgICAgIEJLQ01QMlAgICAgICAgTExfVElNX1NldEJyZWFrSW5wdXRTb3VyY2VQb2xhcml0eVxuDQotICogICAgICAgICBBRjEgICAgICAgICAgQktDTVAzUCAgICAgICBMTF9USU1fU2V0QnJlYWtJbnB1dFNvdXJjZVBvbGFyaXR5XG4NCi0gKiAgICAgICAgIEFGMSAgICAgICAgICBCS0NNUDRQICAgICAgIExMX1RJTV9TZXRCcmVha0lucHV0U291cmNlUG9sYXJpdHlcbg0KLSAqICAgICAgICAgQUYyICAgICAgICAgIEJLMklOUCAgICAgICAgTExfVElNX1NldEJyZWFrSW5wdXRTb3VyY2VQb2xhcml0eVxuDQotICogICAgICAgICBBRjIgICAgICAgICAgQksyQ01QMVAgICAgICBMTF9USU1fU2V0QnJlYWtJbnB1dFNvdXJjZVBvbGFyaXR5XG4NCi0gKiAgICAgICAgIEFGMiAgICAgICAgICBCSzJDTVAyUCAgICAgIExMX1RJTV9TZXRCcmVha0lucHV0U291cmNlUG9sYXJpdHlcbg0KLSAqICAgICAgICAgQUYyICAgICAgICAgIEJLMkNNUDNQICAgICAgTExfVElNX1NldEJyZWFrSW5wdXRTb3VyY2VQb2xhcml0eVxuDQotICogICAgICAgICBBRjIgICAgICAgICAgQksyQ01QNFAgICAgICBMTF9USU1fU2V0QnJlYWtJbnB1dFNvdXJjZVBvbGFyaXR5DQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHBhcmFtICBCcmVha0lucHV0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLX0lOUFVUX0JLSU4NCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUtfSU5QVVRfQktJTjINCi0gKiBAcGFyYW0gIFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CS0lOX1NPVVJDRV9CS0lODQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JLSU5fU09VUkNFX0JLQ09NUDENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQktJTl9TT1VSQ0VfQktDT01QMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CS0lOX1NPVVJDRV9CS0NPTVAzDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JLSU5fU09VUkNFX0JLQ09NUDQNCi0gKiBAcGFyYW0gIFBvbGFyaXR5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JLSU5fUE9MQVJJVFlfTE9XDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JLSU5fUE9MQVJJVFlfSElHSA0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9TZXRCcmVha0lucHV0U291cmNlUG9sYXJpdHkoVElNX1R5cGVEZWYgKlRJTXgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBCcmVha0lucHV0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgU291cmNlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUG9sYXJpdHkpIHsNCi0gIF9fSU8gdWludDMyX3QgKnBSZWcgPQ0KLSAgICAgIChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmVElNeC0+QUYxKSArIEJyZWFrSW5wdXQpKTsNCi0gIE1PRElGWV9SRUcoKnBSZWcsIChUSU14X0FGMV9CS0lOUCA8PCBUSU1fUE9TSVRJT05fQlJLX1NPVVJDRSksDQotICAgICAgICAgICAgIChQb2xhcml0eSA8PCBUSU1fUE9TSVRJT05fQlJLX1NPVVJDRSkpOw0KLX0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSBhc3ltbWV0cmljYWwgZGVhZHRpbWUuDQotICogQG5vdGUgTWFjcm8gSVNfVElNX0RFQURUSU1FX0FTWU1NRVRSSUNBTF9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaw0KLSAqIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgYXN5bW1ldHJpY2FsIGRlYWR0aW1lLg0KLSAqIEBybXRvbGwgRFRSMiAgICAgICAgICBEVEFFICAgICAgICAgIExMX1RJTV9FbmFibGVBc3ltbWV0cmljYWxEZWFkVGltZQ0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9FbmFibGVBc3ltbWV0cmljYWxEZWFkVGltZShUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgU0VUX0JJVChUSU14LT5EVFIyLCBUSU1fRFRSMl9EVEFFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIGFzeW1tZXRyaWNhbCBkZWFkLXRpbWUuDQotICogQG5vdGUgTWFjcm8gSVNfVElNX0RFQURUSU1FX0FTWU1NRVRSSUNBTF9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaw0KLSAqIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgYXN5bW1ldHJpY2FsIGRlYWR0aW1lLg0KLSAqIEBybXRvbGwgRFRSMiAgICAgICAgICBEVEFFICAgICAgICAgIExMX1RJTV9EaXNhYmxlQXN5bW1ldHJpY2FsRGVhZFRpbWUNCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZUFzeW1tZXRyaWNhbERlYWRUaW1lKFRJTV9UeXBlRGVmICpUSU14KSB7DQotICBDTEVBUl9CSVQoVElNeC0+RFRSMiwgVElNX0RUUjJfRFRBRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgYXN5bW1ldHJpY2FsIGRlYWR0aW1lIGlzIGFjdGl2YXRlZC4NCi0gKiBAbm90ZSBNYWNybyBJU19USU1fREVBRFRJTUVfQVNZTU1FVFJJQ0FMX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrDQotICogd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBhc3ltbWV0cmljYWwgZGVhZHRpbWUuDQotICogQHJtdG9sbCBEVFIyICAgICAgICAgIERUQUUgICAgICAgICAgTExfVElNX0lzRW5hYmxlZEFzeW1tZXRyaWNhbERlYWRUaW1lDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90DQotTExfVElNX0lzRW5hYmxlZEFzeW1tZXRyaWNhbERlYWRUaW1lKFRJTV9UeXBlRGVmICpUSU14KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5EVFIyLCBUSU1fRFRSMl9EVEFFKSA9PSAoVElNX0RUUjJfRFRBRSkpID8gMVVMIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZXQgdGhlIGZhbGxpbmcgZWRnZSBkZWFkLXRpbWUgZGVsYXkgKGRlbGF5IGluc2VydGVkIGJldHdlZW4gdGhlDQotICogZmFsbGluZyBlZGdlIG9mIHRoZSBPQ3hSRUYgc2lnbmFsIGFuZCB0aGUgcmlzaW5nIGVkZ2Ugb2YgT0N4TiBzaWduYWxzKS4NCi0gKiBAbm90ZSBNYWNybyBJU19USU1fREVBRFRJTUVfQVNZTU1FVFJJQ0FMX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrDQotICogd2hldGhlciBvciBub3QgYXN5bW1ldHJpY2FsIGRlYWQtdGltZSBpbnNlcnRpb24gZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgYQ0KLSAqIHRpbWVyIGluc3RhbmNlLg0KLSAqIEBub3RlIEhlbHBlciBtYWNybyBAcmVmIF9fTExfVElNX0NBTENfREVBRFRJTUUgY2FuIGJlIHVzZWQgdG8gY2FsY3VsYXRlIHRoZQ0KLSAqIERlYWRUaW1lIHBhcmFtZXRlcg0KLSAqIEBub3RlIFRoaXMgYml0LWZpZWxkIGNhbiBub3QgYmUgbW9kaWZpZWQgYXMgbG9uZyBhcyBMT0NLIGxldmVsIDEsIDIgb3IgMyBoYXMNCi0gKiBiZWVuIHByb2dyYW1tZWQgKExPQ0sgYml0cyBpbiBUSU14X0JEVFIgcmVnaXN0ZXIpLg0KLSAqIEBybXRvbGwgRFRSMiAgICAgICAgIERUR0YgICAgICAgICAgIExMX1RJTV9TZXRGYWxsaW5nRGVhZFRpbWUNCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcGFyYW0gIERlYWRUaW1lIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MjU1DQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX1NldEZhbGxpbmdEZWFkVGltZShUSU1fVHlwZURlZiAqVElNeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IERlYWRUaW1lKSB7DQotICBNT0RJRllfUkVHKFRJTXgtPkRUUjIsIFRJTV9EVFIyX0RUR0YsIERlYWRUaW1lKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgdGhlIGZhbGxpbmcgZWRnZSBkZWFkLXRpbWUgZGVsYXkgKGRlbGF5IGluc2VydGVkIGJldHdlZW4gdGhlDQotICogZmFsbGluZyBlZGdlIG9mIHRoZSBPQ3hSRUYgc2lnbmFsIGFuZCB0aGUgcmlzaW5nIGVkZ2Ugb2YgT0N4TiBzaWduYWxzKS4NCi0gKiBAbm90ZSBNYWNybyBJU19USU1fREVBRFRJTUVfQVNZTU1FVFJJQ0FMX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrDQotICogd2hldGhlciBvciBub3QgYXN5bW1ldHJpY2FsIGRlYWQtdGltZSBpbnNlcnRpb24gZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgYQ0KLSAqIHRpbWVyIGluc3RhbmNlLg0KLSAqIEBub3RlIFRoaXMgYml0LWZpZWxkIGNhbiBub3QgYmUgbW9kaWZpZWQgYXMgbG9uZyBhcyBMT0NLIGxldmVsIDEsIDIgb3IgMyBoYXMNCi0gKiBiZWVuIHByb2dyYW1tZWQgKExPQ0sgYml0cyBpbiBUSU14X0JEVFIgcmVnaXN0ZXIpLg0KLSAqIEBybXRvbGwgRFRSMiAgICAgICAgICBEVEdGICAgICAgICAgICBMTF9USU1fR2V0RmFsbGluZ0RlYWRUaW1lDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0yNTU6DQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9HZXRGYWxsaW5nRGVhZFRpbWUoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFRJTXgtPkRUUjIsIFRJTV9EVFIyX0RUR0YpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgZGVhZHRpbWUgcHJlbG9hZC4NCi0gKiBAbm90ZSBNYWNybyBJU19USU1fQlJFQUtfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QNCi0gKiAgICAgICBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGRlYWR0aW1lIHByZWxvYWQuDQotICogQHJtdG9sbCBEVFIyICAgICAgICAgIERUUEUgICAgICAgICAgTExfVElNX0VuYWJsZURlYWRUaW1lUHJlbG9hZA0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9FbmFibGVEZWFkVGltZVByZWxvYWQoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIFNFVF9CSVQoVElNeC0+RFRSMiwgVElNX0RUUjJfRFRQRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBkZWFkLXRpbWUgcHJlbG9hZC4NCi0gKiBAbm90ZSBNYWNybyBJU19USU1fQlJFQUtfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QNCi0gKiAgICAgICBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGRlYWR0aW1lIHByZWxvYWQuDQotICogQHJtdG9sbCBEVFIyICAgICAgICAgIERUUEUgICAgICAgICAgTExfVElNX0Rpc2FibGVEZWFkVGltZVByZWxvYWQNCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZURlYWRUaW1lUHJlbG9hZChUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgQ0xFQVJfQklUKFRJTXgtPkRUUjIsIFRJTV9EVFIyX0RUUEUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEluZGljYXRlcyB3aGV0aGVyIGRlYWR0aW1lIHByZWxvYWQgaXMgYWN0aXZhdGVkLg0KLSAqIEBub3RlIE1hY3JvIElTX1RJTV9CUkVBS19JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdA0KLSAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgZGVhZHRpbWUgcHJlbG9hZC4NCi0gKiBAcm10b2xsIERUUjIgICAgICAgICAgRFRQRSAgICAgICAgICBMTF9USU1fSXNFbmFibGVkRGVhZFRpbWVQcmVsb2FkDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0VuYWJsZWREZWFkVGltZVByZWxvYWQoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFRJTXgtPkRUUjIsIFRJTV9EVFIyX0RUUEUpID09IChUSU1fRFRSMl9EVFBFKSkgPyAxVUwgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0xMX0VGX0RNQV9CdXJzdF9Nb2RlIERNQSBidXJzdCBtb2RlIGNvbmZpZ3VyYXRpb24NCi0gKiBAew0KLSAqLw0KLS8qKg0KLSAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgdGltZXIgRE1BIGJ1cnN0IGZlYXR1cmUuDQotICogQG5vdGUgTWFjcm8gSVNfVElNX0RNQUJVUlNUX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3INCi0gKiAgICAgICBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyB0aGUgRE1BIGJ1cnN0IG1vZGUuDQotICogQHJtdG9sbCBEQ1IgICAgICAgICAgREJMICAgICAgICAgICBMTF9USU1fQ29uZmlnRE1BQnVyc3Rcbg0KLSAqICAgICAgICAgRENSICAgICAgICAgIERCQSAgICAgICAgICAgTExfVElNX0NvbmZpZ0RNQUJ1cnN0DQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHBhcmFtICBETUFCdXJzdEJhc2VBZGRyZXNzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZw0KLSAqIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQ1IxDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0NSMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9TTUNSDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0RJRVINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfU1INCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfRUdSDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0NDTVIxDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0NDTVIyDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0NDRVINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQ05UDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX1BTQw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9BUlINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfUkNSDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0NDUjENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQ0NSMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DQ1IzDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0NDUjQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQkRUUg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DQ01SMw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DQ1I1DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0NDUjYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfRFRSMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9FQ1INCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfVElTRUwNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQUYxDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0FGMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9PUg0KLSAqIEBwYXJhbSAgRE1BQnVyc3RMZW5ndGggVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzFUUkFOU0ZFUg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfMlRSQU5TRkVSUw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfM1RSQU5TRkVSUw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfNFRSQU5TRkVSUw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfNVRSQU5TRkVSUw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfNlRSQU5TRkVSUw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfN1RSQU5TRkVSUw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfOFRSQU5TRkVSUw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfOVRSQU5TRkVSUw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfMTBUUkFOU0ZFUlMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzExVFJBTlNGRVJTDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0xFTkdUSF8xMlRSQU5TRkVSUw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfMTNUUkFOU0ZFUlMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzE0VFJBTlNGRVJTDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0xFTkdUSF8xNVRSQU5TRkVSUw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfMTZUUkFOU0ZFUlMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzE3VFJBTlNGRVJTDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0xFTkdUSF8xOFRSQU5TRkVSUw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfMTlUUkFOU0ZFUlMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzIwVFJBTlNGRVJTDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0xFTkdUSF8yMVRSQU5TRkVSUw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfMjJUUkFOU0ZFUlMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzIzVFJBTlNGRVJTDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0xFTkdUSF8yNFRSQU5TRkVSUw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfMjVUUkFOU0ZFUlMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzI2VFJBTlNGRVJTDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NvbmZpZ0RNQUJ1cnN0KFRJTV9UeXBlRGVmICpUSU14LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBETUFCdXJzdEJhc2VBZGRyZXNzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBETUFCdXJzdExlbmd0aCkgew0KLSAgTU9ESUZZX1JFRyhUSU14LT5EQ1IsIChUSU1fRENSX0RCTCB8IFRJTV9EQ1JfREJBKSwNCi0gICAgICAgICAgICAgKERNQUJ1cnN0QmFzZUFkZHJlc3MgfCBETUFCdXJzdExlbmd0aCkpOw0KLX0NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0xMX0VGX0VuY29kZXIgRW5jb2RlciBjb25maWd1cmF0aW9uDQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSBlbmNvZGVyIGluZGV4Lg0KLSAqIEBub3RlIE1hY3JvIElTX1RJTV9JTkRFWF9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdA0KLSAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgYW4gaW5kZXggaW5wdXQuDQotICogQHJtdG9sbCBFQ1IgICAgICAgICBJRSAgICAgICAgICAgTExfVElNX0VuYWJsZUVuY29kZXJJbmRleA0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9FbmFibGVFbmNvZGVySW5kZXgoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIFNFVF9CSVQoVElNeC0+RUNSLCBUSU1fRUNSX0lFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIGVuY29kZXIgaW5kZXguDQotICogQG5vdGUgTWFjcm8gSVNfVElNX0lOREVYX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90DQotICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBhbiBpbmRleCBpbnB1dC4NCi0gKiBAcm10b2xsIEVDUiAgICAgICAgIElFICAgICAgICAgICBMTF9USU1fRGlzYWJsZUVuY29kZXJJbmRleA0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlRW5jb2RlckluZGV4KFRJTV9UeXBlRGVmICpUSU14KSB7DQotICBDTEVBUl9CSVQoVElNeC0+RUNSLCBUSU1fRUNSX0lFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIGVuY29kZXIgaW5kZXggaXMgZW5hYmxlZC4NCi0gKiBAbm90ZSBNYWNybyBJU19USU1fSU5ERVhfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QNCi0gKiAgICAgICBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGFuIGluZGV4IGlucHV0Lg0KLSAqIEBybXRvbGwgRUNSICAgICAgICAgSUUgICAgICAgICAgIExMX1RJTV9Jc0VuYWJsZWRFbmNvZGVySW5kZXgNCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzRW5hYmxlZEVuY29kZXJJbmRleChUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+RUNSLCBUSU1fRUNSX0lFKSA9PSAoVElNX0VDUl9JRSkpID8gMVUgOiAwVSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IGluZGV4IGRpcmVjdGlvbg0KLSAqIEBub3RlIE1hY3JvIElTX1RJTV9JTkRFWF9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdA0KLSAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgYW4gaW5kZXggaW5wdXQuDQotICogQHJtdG9sbCBFQ1IgICAgICAgICAgSURJUiAgICAgICAgICAgTExfVElNX1NldEluZGV4RGlyZWN0aW9uDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHBhcmFtICBJbmRleERpcmVjdGlvbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JTkRFWF9VUF9ET1dODQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lOREVYX1VQDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lOREVYX0RPV04NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fU2V0SW5kZXhEaXJlY3Rpb24oVElNX1R5cGVEZWYgKlRJTXgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEluZGV4RGlyZWN0aW9uKSB7DQotICBNT0RJRllfUkVHKFRJTXgtPkVDUiwgVElNX0VDUl9JRElSLCBJbmRleERpcmVjdGlvbik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IGFjdHVhbCBpbmRleCBkaXJlY3Rpb24NCi0gKiBAbm90ZSBNYWNybyBJU19USU1fSU5ERVhfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QNCi0gKiAgICAgICBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGFuIGluZGV4IGlucHV0Lg0KLSAqIEBybXRvbGwgRUNSICAgICAgICAgIElESVIgICAgICAgICAgIExMX1RJTV9HZXRJbmRleERpcmVjdGlvbg0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSU5ERVhfVVBfRE9XTg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JTkRFWF9VUA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JTkRFWF9ET1dODQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9HZXRJbmRleERpcmVjdGlvbihUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVElNeC0+RUNSLCBUSU1fRUNSX0lESVIpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgZmlyc3QgaW5kZXguDQotICogQG5vdGUgTWFjcm8gSVNfVElNX0lOREVYX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90DQotICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBhbiBpbmRleCBpbnB1dC4NCi0gKiBAcm10b2xsIEVDUiAgICAgICAgICBGSURYICAgICAgICAgIExMX1RJTV9FbmFibGVGaXJzdEluZGV4DQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZUZpcnN0SW5kZXgoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIFNFVF9CSVQoVElNeC0+RUNSLCBUSU1fRUNSX0ZJRFgpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgZmlyc3QgaW5kZXguDQotICogQG5vdGUgTWFjcm8gSVNfVElNX0lOREVYX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90DQotICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBhbiBpbmRleCBpbnB1dC4NCi0gKiBAcm10b2xsIEVDUiAgICAgICAgICBGSURYICAgICAgICAgIExMX1RJTV9EaXNhYmxlRmlyc3RJbmRleA0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlRmlyc3RJbmRleChUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgQ0xFQVJfQklUKFRJTXgtPkVDUiwgVElNX0VDUl9GSURYKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciBmaXJzdCBpbmRleCBpcyBlbmFibGVkLg0KLSAqIEBub3RlIE1hY3JvIElTX1RJTV9JTkRFWF9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdA0KLSAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgYW4gaW5kZXggaW5wdXQuDQotICogQHJtdG9sbCBFQ1IgICAgICAgICAgRklEWCAgICAgICAgICBMTF9USU1fSXNFbmFibGVkRmlyc3RJbmRleA0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNFbmFibGVkRmlyc3RJbmRleChUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+RUNSLCBUSU1fRUNSX0ZJRFgpID09IChUSU1fRUNSX0ZJRFgpKSA/IDFVTCA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IGluZGV4IHBvc2l0aW9uaW5nDQotICogQG5vdGUgTWFjcm8gSVNfVElNX0lOREVYX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90DQotICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBhbiBpbmRleCBpbnB1dC4NCi0gKiBAcm10b2xsIEVDUiAgICAgICAgICBJUE9TICAgICAgICAgICBMTF9USU1fU2V0SW5kZXhQb3NpdGlvbm5pbmcNCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcGFyYW0gIEluZGV4UG9zaXRpb25uaW5nIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lOREVYX1BPU0lUSU9OX0RPV05fRE9XTg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JTkRFWF9QT1NJVElPTl9ET1dOX1VQDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lOREVYX1BPU0lUSU9OX1VQX0RPV04NCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSU5ERVhfUE9TSVRJT05fVVBfVVANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSU5ERVhfUE9TSVRJT05fRE9XTg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JTkRFWF9QT1NJVElPTl9VUA0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9TZXRJbmRleFBvc2l0aW9ubmluZyhUSU1fVHlwZURlZiAqVElNeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgSW5kZXhQb3NpdGlvbm5pbmcpIHsNCi0gIE1PRElGWV9SRUcoVElNeC0+RUNSLCBUSU1fRUNSX0lQT1MsIEluZGV4UG9zaXRpb25uaW5nKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgYWN0dWFsIGluZGV4IHBvc2l0aW9uaW5nDQotICogQG5vdGUgTWFjcm8gSVNfVElNX0lOREVYX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90DQotICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBhbiBpbmRleCBpbnB1dC4NCi0gKiBAcm10b2xsIEVDUiAgICAgICAgICBJUE9TICAgICAgICAgICBMTF9USU1fR2V0SW5kZXhQb3NpdGlvbm5pbmcNCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lOREVYX1BPU0lUSU9OX0RPV05fRE9XTg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JTkRFWF9QT1NJVElPTl9ET1dOX1VQDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lOREVYX1BPU0lUSU9OX1VQX0RPV04NCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSU5ERVhfUE9TSVRJT05fVVBfVVANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSU5ERVhfUE9TSVRJT05fRE9XTg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JTkRFWF9QT1NJVElPTl9VUA0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fR2V0SW5kZXhQb3NpdGlvbm5pbmcoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFRJTXgtPkVDUiwgVElNX0VDUl9JUE9TKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ29uZmlndXJlIGVuY29kZXIgaW5kZXguDQotICogQG5vdGUgTWFjcm8gSVNfVElNX0lOREVYX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90DQotICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBhbiBpbmRleCBpbnB1dC4NCi0gKiBAcm10b2xsIEVDUiAgICAgICAgICBJRElSICAgICAgICAgIExMX1RJTV9Db25maWdJRFhcbg0KLSAqICAgICAgICAgRUNSICAgICAgICAgIEZJRFggICAgICAgICAgTExfVElNX0NvbmZpZ0lEWFxuDQotICogICAgICAgICBFQ1IgICAgICAgICAgSVBPUyAgICAgICAgICBMTF9USU1fQ29uZmlnSURYDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHBhcmFtICBDb25maWd1cmF0aW9uIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBjb21iaW5hdGlvbiBvZiBhbGwgdGhlDQotICogZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSU5ERVhfVVAgb3IgQHJlZiBMTF9USU1fSU5ERVhfRE9XTiBvciBAcmVmDQotICogTExfVElNX0lOREVYX1VQX0RPV04NCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSU5ERVhfQUxMIG9yIEByZWYgTExfVElNX0lOREVYX0ZJUlNUX09OTFkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSU5ERVhfUE9TSVRJT05fRE9XTl9ET1dOIG9yIC4uLiBvciBAcmVmDQotICogTExfVElNX0lOREVYX1BPU0lUSU9OX1VQDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NvbmZpZ0lEWChUSU1fVHlwZURlZiAqVElNeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENvbmZpZ3VyYXRpb24pIHsNCi0gIE1PRElGWV9SRUcoVElNeC0+RUNSLCBUSU1fRUNSX0lESVIgfCBUSU1fRUNSX0ZJRFggfCBUSU1fRUNSX0lQT1MsDQotICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24pOw0KLX0NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0xMX0VGX1RpbWVyX0lucHV0c19SZW1hcHBpbmcgVGltZXIgaW5wdXQgcmVtYXBwaW5nDQotICogQHsNCi0gKi8NCi0vKioNCi0gKiBAYnJpZWYgIFJlbWFwIFRJTSBpbnB1dHMgKGlucHV0IGNoYW5uZWwsIGludGVybmFsL2V4dGVybmFsIHRyaWdnZXJzKS4NCi0gKiBAbm90ZSBNYWNybyBJU19USU1fUkVNQVBfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QNCi0gKiAgICAgICBhIHNvbWUgdGltZXIgaW5wdXRzIGNhbiBiZSByZW1hcHBlZC4NCi0gKiBAcm10b2xsIFRJTTFfVElTRUwgICAgVEkxU0VMICAgICAgTExfVElNX1NldFJlbWFwXG4NCi0gKiAgICAgICAgIFRJTTJfVElTRUwgICAgVEkxU0VMICAgICAgTExfVElNX1NldFJlbWFwXG4NCi0gKiAgICAgICAgIFRJTTJfVElTRUwgICAgVEkyU0VMICAgICAgTExfVElNX1NldFJlbWFwXG4NCi0gKiAgICAgICAgIFRJTTJfVElTRUwgICAgVEkzU0VMICAgICAgTExfVElNX1NldFJlbWFwXG4NCi0gKiAgICAgICAgIFRJTTJfVElTRUwgICAgVEk0U0VMICAgICAgTExfVElNX1NldFJlbWFwXG4NCi0gKiAgICAgICAgIFRJTTNfVElTRUwgICAgVEkxU0VMICAgICAgTExfVElNX1NldFJlbWFwXG4NCi0gKiAgICAgICAgIFRJTTNfVElTRUwgICAgVEkyU0VMICAgICAgTExfVElNX1NldFJlbWFwXG4NCi0gKiAgICAgICAgIFRJTTNfVElTRUwgICAgVEkzU0VMICAgICAgTExfVElNX1NldFJlbWFwXG4NCi0gKiAgICAgICAgIFRJTTRfVElTRUwgICAgVEkxU0VMICAgICAgTExfVElNX1NldFJlbWFwXG4NCi0gKiAgICAgICAgIFRJTTRfVElTRUwgICAgVEkyU0VMICAgICAgTExfVElNX1NldFJlbWFwXG4NCi0gKiAgICAgICAgIFRJTTRfVElTRUwgICAgVEkzU0VMICAgICAgTExfVElNX1NldFJlbWFwXG4NCi0gKiAgICAgICAgIFRJTTRfVElTRUwgICAgVEk0U0VMICAgICAgTExfVElNX1NldFJlbWFwXG4NCi0gKiAgICAgICAgIFRJTTVfVElTRUwgICAgVEkxU0VMICAgICAgTExfVElNX1NldFJlbWFwXG4NCi0gKiAgICAgICAgIFRJTTVfVElTRUwgICAgVEkyU0VMICAgICAgTExfVElNX1NldFJlbWFwXG4NCi0gKiAgICAgICAgIFRJTThfVElTRUwgICAgVEkxU0VMICAgICAgTExfVElNX1NldFJlbWFwXG4NCi0gKiAgICAgICAgIFRJTTE1X1RJU0VMICAgVEkxU0VMICAgICAgTExfVElNX1NldFJlbWFwXG4NCi0gKiAgICAgICAgIFRJTTE1X1RJU0VMICAgVEkyU0VMICAgICAgTExfVElNX1NldFJlbWFwXG4NCi0gKiAgICAgICAgIFRJTTE2X1RJU0VMICAgVEkxU0VMICAgICAgTExfVElNX1NldFJlbWFwXG4NCi0gKiAgICAgICAgIFRJTTE3X1RJU0VMICAgVEkxU0VMICAgICAgTExfVElNX1NldFJlbWFwXG4NCi0gKiAgICAgICAgIFRJTTIwX1RJU0VMICAgVEkxU0VMICAgICAgTExfVElNX1NldFJlbWFwDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHBhcmFtICBSZW1hcCBSZW1hcCBwYXJhbSBkZXBlbmRzIG9uIHRoZSBUSU14LiBEZXNjcmlwdGlvbiBhdmFpbGFibGUgb25seQ0KLSAqICAgICAgICAgaW4gQ0hNIHZlcnNpb24gb2YgdGhlIFVzZXIgTWFudWFsIChub3QgaW4gLnBkZikuDQotICogICAgICAgICBPdGhlcndpc2Ugc2VlIFJlZmVyZW5jZSBNYW51YWwgZGVzY3JpcHRpb24gb2YgVElTRUwgcmVnaXN0ZXJzLg0KLSAqDQotICogICAgICAgICBCZWxvdyBkZXNjcmlwdGlvbiBzdW1tYXJpemVzICJUaW1lciBJbnN0YW5jZSIgYW5kICJSZW1hcCIgcGFyYW0NCi0gKiBjb21iaW5hdGlvbnM6DQotICoNCi0gKiAgICAgICAgIFRJTTE6IG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcw0KLSAqDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTFfVEkxX1JNUF9HUElPDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTFfVEkxX1JNUF9DT01QMQ0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0xX1RJMV9STVBfQ09NUDINCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMV9USTFfUk1QX0NPTVAzDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTFfVEkxX1JNUF9DT01QNA0KLSAqDQotICogICAgICAgICBUSU0yOiBhbnkgY29tYmluYXRpb24gb2YgVEkxX1JNUCwgVEkyX1JNUCwgVEkzX1JNUCBhbmQgVEk0X1JNUCB3aGVyZQ0KLSAqDQotICogICAgICAgICAgICAuIC4gVEkxX1JNUCBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTJfVEkxX1JNUF9HUElPDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTJfVEkxX1JNUF9DT01QMQ0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0yX1RJMV9STVBfQ09NUDINCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMl9USTFfUk1QX0NPTVAzDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTJfVEkxX1JNUF9DT01QNA0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0yX1RJMV9STVBfQ09NUDUgKCopDQotICoNCi0gKiAgICAgICAgICAgIC4gLiBUSTJfUk1QIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMl9USTJfUk1QX0dQSU8NCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMl9USTJfUk1QX0NPTVAxDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTJfVEkyX1JNUF9DT01QMg0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0yX1RJMl9STVBfQ09NUDMNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMl9USTJfUk1QX0NPTVA0DQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTJfVEkyX1JNUF9DT01QNiAoKikNCi0gKg0KLSAqICAgICAgICAgICAgLiAuIFRJM19STVAgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0yX1RJM19STVBfR1BJTw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0yX1RJM19STVBfQ09NUDQNCi0gKg0KLSAqICAgICAgICAgICAgLiAuIFRJNF9STVAgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0yX1RJNF9STVBfR1BJTw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0yX1RJNF9STVBfQ09NUDENCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMl9USTRfUk1QX0NPTVAyDQotICoNCi0gKiAgICAgICAgIFRJTTM6IGFueSBjb21iaW5hdGlvbiBvZiBUSTFfUk1QIGFuZCBUSTJfUk1QIHdoZXJlDQotICoNCi0gKiAgICAgICAgICAgIC4gLiBUSTFfUk1QIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNM19USTFfUk1QX0dQSU8NCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNM19USTFfUk1QX0NPTVAxDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTNfVEkxX1JNUF9DT01QMg0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0zX1RJMV9STVBfQ09NUDMNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNM19USTFfUk1QX0NPTVA0DQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTNfVEkxX1JNUF9DT01QNSAoKikNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNM19USTFfUk1QX0NPTVA2ICgqKQ0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0zX1RJMV9STVBfQ09NUDcgKCopDQotICoNCi0gKiAgICAgICAgICAgIC4gLiBUSTJfUk1QIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNM19USTJfUk1QX0dQSU8NCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNM19USTJfUk1QX0NPTVAxDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTNfVEkyX1JNUF9DT01QMg0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0zX1RJMl9STVBfQ09NUDMNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNM19USTJfUk1QX0NPTVA0DQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTNfVEkyX1JNUF9DT01QNSAoKikNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNM19USTJfUk1QX0NPTVA2ICgqKQ0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0zX1RJMl9STVBfQ09NUDcgKCopDQotICoNCi0gKiAgICAgICAgICAgIC4gLiBUSTNfUk1QIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNM19USTNfUk1QX0dQSU8NCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNM19USTNfUk1QX0NPTVAzDQotICoNCi0gKiAgICAgICAgIFRJTTQ6IGFueSBjb21iaW5hdGlvbiBvZiBUSTFfUk1QLCBUSTJfUk1QLCBUSTNfUk1QIGFuZCBUSTRfUk1QIHdoZXJlDQotICoNCi0gKiAgICAgICAgICAgIC4gLiBUSTFfUk1QIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNNF9USTFfUk1QX0dQSU8NCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNNF9USTFfUk1QX0NPTVAxDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTRfVEkxX1JNUF9DT01QMg0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU00X1RJMV9STVBfQ09NUDMNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNNF9USTFfUk1QX0NPTVA0DQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTRfVEkxX1JNUF9DT01QNSAoKikNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNNF9USTFfUk1QX0NPTVA2ICgqKQ0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU00X1RJMV9STVBfQ09NUDcgKCopDQotICoNCi0gKiAgICAgICAgICAgIC4gLiBUSTJfUk1QIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNNF9USTJfUk1QX0dQSU8NCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNNF9USTJfUk1QX0NPTVAxDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTRfVEkyX1JNUF9DT01QMg0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU00X1RJMl9STVBfQ09NUDMNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNNF9USTJfUk1QX0NPTVA0DQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTRfVEkyX1JNUF9DT01QNSAoKikNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNNF9USTJfUk1QX0NPTVA2ICgqKQ0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU00X1RJMl9STVBfQ09NUDcgKCopDQotICoNCi0gKiAgICAgICAgICAgIC4gLiBUSTNfUk1QIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNNF9USTNfUk1QX0dQSU8NCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNNF9USTNfUk1QX0NPTVA1ICgqKQ0KLSAqDQotICogICAgICAgICAgICAuIC4gVEk0X1JNUCBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTRfVEk0X1JNUF9HUElPDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTRfVEk0X1JNUF9DT01QNiAoKikNCi0gKg0KLSAqICAgICAgICAgVElNNTogYW55IGNvbWJpbmF0aW9uIG9mIFRJMV9STVAgYW5kIFRJMl9STVAgd2hlcmUgKCoqKQ0KLSAqDQotICogICAgICAgICAgICAuIC4gVEkxX1JNUCBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTVfVEkxX1JNUF9HUElPICAgKCopDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTVfVEkxX1JNUF9MU0kgICAgKCopDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTVfVEkxX1JNUF9MU0UgICAgKCopDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTVfVEkxX1JNUF9SVENfV0sgKCopDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTVfVEkxX1JNUF9DT01QMSAgKCopDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTVfVEkxX1JNUF9DT01QMiAgKCopDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTVfVEkxX1JNUF9DT01QMyAgKCopDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTVfVEkxX1JNUF9DT01QNCAgKCopDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTVfVEkxX1JNUF9DT01QNSAgKCopDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTVfVEkxX1JNUF9DT01QNiAgKCopDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTVfVEkxX1JNUF9DT01QNyAgKCopDQotICoNCi0gKiAgICAgICAgICAgIC4gLiBUSTJfUk1QIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNNV9USTJfUk1QX0dQSU8gICgqKQ0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU01X1RJMl9STVBfQ09NUDEgKCopDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTVfVEkyX1JNUF9DT01QMiAoKikNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNNV9USTJfUk1QX0NPTVAzICgqKQ0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU01X1RJMl9STVBfQ09NUDQgKCopDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTVfVEkyX1JNUF9DT01QNSAoKikNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNNV9USTJfUk1QX0NPTVA2ICgqKQ0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU01X1RJMl9STVBfQ09NUDcgKCopDQotICoNCi0gKiAgICAgICAgIFRJTTg6IG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcw0KLSAqDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTThfVEkxX1JNUF9HUElPDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTThfVEkxX1JNUF9DT01QMQ0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU04X1RJMV9STVBfQ09NUDINCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNOF9USTFfUk1QX0NPTVAzDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTThfVEkxX1JNUF9DT01QNA0KLSAqDQotICogICAgICAgICBUSU0xNTogYW55IGNvbWJpbmF0aW9uIG9mIFRJMV9STVAgYW5kIFRJMl9STVAgd2hlcmUNCi0gKg0KLSAqICAgICAgICAgICAgLiAuIFRJMV9STVAgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0xNV9USTFfUk1QX0dQSU8NCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMTVfVEkxX1JNUF9MU0UNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMTVfVEkxX1JNUF9DT01QMQ0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0xNV9USTFfUk1QX0NPTVAyDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTE1X1RJMV9STVBfQ09NUDUgKCopDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTE1X1RJMV9STVBfQ09NUDcgKCopDQotICoNCi0gKiAgICAgICAgICAgIC4gLiBUSTJfUk1QIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMTVfVEkyX1JNUF9HUElPDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTE1X1RJMl9STVBfQ09NUDINCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMTVfVEkyX1JNUF9DT01QMw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0xNV9USTJfUk1QX0NPTVA2ICgqKQ0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0xNV9USTJfUk1QX0NPTVA3ICgqKQ0KLSAqDQotICogICAgICAgICBUSU0xNjogb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzDQotICoNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMTZfVEkxX1JNUF9HUElPDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTE2X1RJMV9STVBfQ09NUDYgKCopDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTE2X1RJMV9STVBfTUNPDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTE2X1RJMV9STVBfSFNFXzMyDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTE2X1RJMV9STVBfUlRDX1dLDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTE2X1RJMV9STVBfTFNFDQotICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTE2X1RJMV9STVBfTFNJDQotICoNCi0gKiAgICAgICAgIFRJTTE3OiBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMNCi0gKg0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0xN19USTFfUk1QX0dQSU8NCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMTdfVEkxX1JNUF9DT01QNSAoKikNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMTdfVEkxX1JNUF9NQ08NCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMTdfVEkxX1JNUF9IU0VfMzINCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMTdfVEkxX1JNUF9SVENfV0sNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMTdfVEkxX1JNUF9MU0UNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMTdfVEkxX1JNUF9MU0kNCi0gKg0KLSAqICAgICAgICAgVElNMjA6IG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcyAoKiopDQotICoNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMjBfVEkxX1JNUF9HUElPICAoKikNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMjBfVEkxX1JNUF9DT01QMSAoKikNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMjBfVEkxX1JNUF9DT01QMiAoKikNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMjBfVEkxX1JNUF9DT01QMyAoKikNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMjBfVEkxX1JNUF9DT01QNCAoKikNCi0gKg0KLSAqICAgICAgICAgKCopICBWYWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4gXG4NCi0gKiAgICAgICAgICgqKikgUmVnaXN0ZXIgbm90IGF2YWlsYWJsZSBpbiBhbGwgZGV2aWNlcy4NCi0gKg0KLSAqDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX1NldFJlbWFwKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBSZW1hcCkgew0KLSAgTU9ESUZZX1JFRyhUSU14LT5USVNFTCwNCi0gICAgICAgICAgICAgKFRJTV9USVNFTF9USTFTRUwgfCBUSU1fVElTRUxfVEkyU0VMIHwgVElNX1RJU0VMX1RJM1NFTCB8DQotICAgICAgICAgICAgICBUSU1fVElTRUxfVEk0U0VMKSwNCi0gICAgICAgICAgICAgUmVtYXApOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSByZXF1ZXN0IGZvciBIU0UvMzIgY2xvY2sgdXNlZCBmb3IgVElTRUwgcmVtYXAuDQotICogQG5vdGUgT25seSBUSU0xNiBhbmQgVElNMTcgc3VwcG9ydCBIU0UvMzIgcmVtYXANCi0gKiBAcm10b2xsIE9SICAgICAgICAgSFNFMzJFTiAgICAgICAgICAgTExfVElNX0VuYWJsZUhTRTMyDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZUhTRTMyKFRJTV9UeXBlRGVmICpUSU14KSB7DQotICBTRVRfQklUKFRJTXgtPk9SLCBUSU1fT1JfSFNFMzJFTik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSByZXF1ZXN0IGZvciBIU0UvMzIgY2xvY2sgdXNlZCBmb3IgVElTRUwgcmVtYXAuDQotICogQG5vdGUgT25seSBUSU0xNiBhbmQgVElNMTcgc3VwcG9ydCBIU0UvMzIgcmVtYXANCi0gKiBAcm10b2xsIE9SICAgICAgICAgSFNFMzJFTiAgICAgICAgICAgTExfVElNX0Rpc2FibGVIU0UzMg0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlSFNFMzIoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIENMRUFSX0JJVChUSU14LT5PUiwgVElNX09SX0hTRTMyRU4pOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgcmVxdWVzdCBmb3IgSFNFLzMyIGNsb2NrIGlzIGVuYWJsZWQuDQotICogQG5vdGUgT25seSBUSU0xNiBhbmQgVElNMTcgc3VwcG9ydCBIU0UvMzIgcmVtYXANCi0gKiBAcm10b2xsIE9SICAgICAgICAgSFNFMzJFTiAgICAgICAgICAgTExfVElNX0lzRW5hYmxlZEhTRTMyDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0VuYWJsZWRIU0UzMihUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+T1IsIFRJTV9PUl9IU0UzMkVOKSA9PSAoVElNX09SX0hTRTMyRU4pKSA/IDFVTCA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBUSU1fTExfRUZfT0NSRUZfQ2xlYXIgT0NSRUZfQ2xlYXJfTWFuYWdlbWVudA0KLSAqIEB7DQotICovDQotLyoqDQotICogQGJyaWVmICBTZXQgdGhlIE9DUkVGIGNsZWFyIGlucHV0IHNvdXJjZQ0KLSAqIEBub3RlIFRoZSBPQ3hSRUYgc2lnbmFsIG9mIGEgZ2l2ZW4gY2hhbm5lbCBjYW4gYmUgY2xlYXJlZCB3aGVuIGEgaGlnaCBsZXZlbA0KLSAqIGlzIGFwcGxpZWQgb24gdGhlIE9DUkVGX0NMUl9JTlBVVA0KLSAqIEBub3RlIFRoaXMgZnVuY3Rpb24gY2FuIG9ubHkgYmUgdXNlZCBpbiBPdXRwdXQgY29tcGFyZSBhbmQgUFdNIG1vZGVzLg0KLSAqIEBub3RlIE1hY3JvIElTX1RJTV9PQ0NTX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXINCi0gKiAgICAgICBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBjYW4gY29uZmlndXJlIE9DUkVGIGNsZWFyIGlucHV0IHNvdXJjZS4NCi0gKiBAcm10b2xsIFNNQ1IgICAgICAgICAgT0NDUyAgICAgICAgICAgICAgICBMTF9USU1fU2V0T0NSZWZDbGVhcklucHV0U291cmNlDQotICogQHJtdG9sbCBBRjIgICAgICAgICAgIE9DUlNFTCAgICAgICAgICAgICAgTExfVElNX1NldE9DUmVmQ2xlYXJJbnB1dFNvdXJjZQ0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEBwYXJhbSAgT0NSZWZDbGVhcklucHV0U291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZw0KLSAqIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NSRUZfQ0xSX0lOVF9FVFINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NSRUZfQ0xSX0lOVF9DT01QMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ1JFRl9DTFJfSU5UX0NPTVAyDQotICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DUkVGX0NMUl9JTlRfQ09NUDMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NSRUZfQ0xSX0lOVF9DT01QNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ1JFRl9DTFJfSU5UX0NPTVA1ICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ1JFRl9DTFJfSU5UX0NPTVA2ICgqKQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ1JFRl9DTFJfSU5UX0NPTVA3ICgqKQ0KLSAqDQotICogICAgICAgICAoKikgIFZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLiBcbg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9TZXRPQ1JlZkNsZWFySW5wdXRTb3VyY2UoDQotICAgIFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBPQ1JlZkNsZWFySW5wdXRTb3VyY2UpIHsNCi0gIE1PRElGWV9SRUcoVElNeC0+U01DUiwgVElNX1NNQ1JfT0NDUywNCi0gICAgICAgICAgICAgKChPQ1JlZkNsZWFySW5wdXRTb3VyY2UgJiBPQ1JFRl9DTEVBUl9TRUxFQ1RfTXNrKSA+Pg0KLSAgICAgICAgICAgICAgT0NSRUZfQ0xFQVJfU0VMRUNUX1BvcykNCi0gICAgICAgICAgICAgICAgIDw8IFRJTV9TTUNSX09DQ1NfUG9zKTsNCi0gIE1PRElGWV9SRUcoVElNeC0+QUYyLCBUSU0xX0FGMl9PQ1JTRUwsIE9DUmVmQ2xlYXJJbnB1dFNvdXJjZSk7DQotfQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBUSU1fTExfRUZfRkxBR19NYW5hZ2VtZW50IEZMQUctTWFuYWdlbWVudA0KLSAqIEB7DQotICovDQotLyoqDQotICogQGJyaWVmICBDbGVhciB0aGUgdXBkYXRlIGludGVycnVwdCBmbGFnIChVSUYpLg0KLSAqIEBybXRvbGwgU1IgICAgICAgICAgIFVJRiAgICAgICAgICAgTExfVElNX0NsZWFyRmxhZ19VUERBVEUNCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ2xlYXJGbGFnX1VQREFURShUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgV1JJVEVfUkVHKFRJTXgtPlNSLCB+KFRJTV9TUl9VSUYpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIHVwZGF0ZSBpbnRlcnJ1cHQgZmxhZyAoVUlGKSBpcyBzZXQgKHVwZGF0ZSBpbnRlcnJ1cHQNCi0gKiBpcyBwZW5kaW5nKS4NCi0gKiBAcm10b2xsIFNSICAgICAgICAgICBVSUYgICAgICAgICAgIExMX1RJTV9Jc0FjdGl2ZUZsYWdfVVBEQVRFDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0FjdGl2ZUZsYWdfVVBEQVRFKFRJTV9UeXBlRGVmICpUSU14KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5TUiwgVElNX1NSX1VJRikgPT0gKFRJTV9TUl9VSUYpKSA/IDFVTCA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2xlYXIgdGhlIENhcHR1cmUvQ29tcGFyZSAxIGludGVycnVwdCBmbGFnIChDQzFGKS4NCi0gKiBAcm10b2xsIFNSICAgICAgICAgICBDQzFJRiAgICAgICAgIExMX1RJTV9DbGVhckZsYWdfQ0MxDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NsZWFyRmxhZ19DQzEoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIFdSSVRFX1JFRyhUSU14LT5TUiwgfihUSU1fU1JfQ0MxSUYpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIENhcHR1cmUvQ29tcGFyZSAxIGludGVycnVwdCBmbGFnIChDQzFGKSBpcyBzZXQNCi0gKiAoQ2FwdHVyZS9Db21wYXJlIDEgaW50ZXJydXB0IGlzIHBlbmRpbmcpLg0KLSAqIEBybXRvbGwgU1IgICAgICAgICAgIENDMUlGICAgICAgICAgTExfVElNX0lzQWN0aXZlRmxhZ19DQzENCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzQWN0aXZlRmxhZ19DQzEoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFRJTXgtPlNSLCBUSU1fU1JfQ0MxSUYpID09IChUSU1fU1JfQ0MxSUYpKSA/IDFVTCA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2xlYXIgdGhlIENhcHR1cmUvQ29tcGFyZSAyIGludGVycnVwdCBmbGFnIChDQzJGKS4NCi0gKiBAcm10b2xsIFNSICAgICAgICAgICBDQzJJRiAgICAgICAgIExMX1RJTV9DbGVhckZsYWdfQ0MyDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NsZWFyRmxhZ19DQzIoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIFdSSVRFX1JFRyhUSU14LT5TUiwgfihUSU1fU1JfQ0MySUYpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIENhcHR1cmUvQ29tcGFyZSAyIGludGVycnVwdCBmbGFnIChDQzJGKSBpcyBzZXQNCi0gKiAoQ2FwdHVyZS9Db21wYXJlIDIgaW50ZXJydXB0IGlzIHBlbmRpbmcpLg0KLSAqIEBybXRvbGwgU1IgICAgICAgICAgIENDMklGICAgICAgICAgTExfVElNX0lzQWN0aXZlRmxhZ19DQzINCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzQWN0aXZlRmxhZ19DQzIoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFRJTXgtPlNSLCBUSU1fU1JfQ0MySUYpID09IChUSU1fU1JfQ0MySUYpKSA/IDFVTCA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2xlYXIgdGhlIENhcHR1cmUvQ29tcGFyZSAzIGludGVycnVwdCBmbGFnIChDQzNGKS4NCi0gKiBAcm10b2xsIFNSICAgICAgICAgICBDQzNJRiAgICAgICAgIExMX1RJTV9DbGVhckZsYWdfQ0MzDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NsZWFyRmxhZ19DQzMoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIFdSSVRFX1JFRyhUSU14LT5TUiwgfihUSU1fU1JfQ0MzSUYpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIENhcHR1cmUvQ29tcGFyZSAzIGludGVycnVwdCBmbGFnIChDQzNGKSBpcyBzZXQNCi0gKiAoQ2FwdHVyZS9Db21wYXJlIDMgaW50ZXJydXB0IGlzIHBlbmRpbmcpLg0KLSAqIEBybXRvbGwgU1IgICAgICAgICAgIENDM0lGICAgICAgICAgTExfVElNX0lzQWN0aXZlRmxhZ19DQzMNCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzQWN0aXZlRmxhZ19DQzMoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFRJTXgtPlNSLCBUSU1fU1JfQ0MzSUYpID09IChUSU1fU1JfQ0MzSUYpKSA/IDFVTCA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2xlYXIgdGhlIENhcHR1cmUvQ29tcGFyZSA0IGludGVycnVwdCBmbGFnIChDQzRGKS4NCi0gKiBAcm10b2xsIFNSICAgICAgICAgICBDQzRJRiAgICAgICAgIExMX1RJTV9DbGVhckZsYWdfQ0M0DQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NsZWFyRmxhZ19DQzQoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIFdSSVRFX1JFRyhUSU14LT5TUiwgfihUSU1fU1JfQ0M0SUYpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIENhcHR1cmUvQ29tcGFyZSA0IGludGVycnVwdCBmbGFnIChDQzRGKSBpcyBzZXQNCi0gKiAoQ2FwdHVyZS9Db21wYXJlIDQgaW50ZXJydXB0IGlzIHBlbmRpbmcpLg0KLSAqIEBybXRvbGwgU1IgICAgICAgICAgIENDNElGICAgICAgICAgTExfVElNX0lzQWN0aXZlRmxhZ19DQzQNCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzQWN0aXZlRmxhZ19DQzQoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFRJTXgtPlNSLCBUSU1fU1JfQ0M0SUYpID09IChUSU1fU1JfQ0M0SUYpKSA/IDFVTCA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2xlYXIgdGhlIENhcHR1cmUvQ29tcGFyZSA1IGludGVycnVwdCBmbGFnIChDQzVGKS4NCi0gKiBAcm10b2xsIFNSICAgICAgICAgICBDQzVJRiAgICAgICAgIExMX1RJTV9DbGVhckZsYWdfQ0M1DQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NsZWFyRmxhZ19DQzUoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIFdSSVRFX1JFRyhUSU14LT5TUiwgfihUSU1fU1JfQ0M1SUYpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIENhcHR1cmUvQ29tcGFyZSA1IGludGVycnVwdCBmbGFnIChDQzVGKSBpcyBzZXQNCi0gKiAoQ2FwdHVyZS9Db21wYXJlIDUgaW50ZXJydXB0IGlzIHBlbmRpbmcpLg0KLSAqIEBybXRvbGwgU1IgICAgICAgICAgIENDNUlGICAgICAgICAgTExfVElNX0lzQWN0aXZlRmxhZ19DQzUNCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzQWN0aXZlRmxhZ19DQzUoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFRJTXgtPlNSLCBUSU1fU1JfQ0M1SUYpID09IChUSU1fU1JfQ0M1SUYpKSA/IDFVTCA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2xlYXIgdGhlIENhcHR1cmUvQ29tcGFyZSA2IGludGVycnVwdCBmbGFnIChDQzZGKS4NCi0gKiBAcm10b2xsIFNSICAgICAgICAgICBDQzZJRiAgICAgICAgIExMX1RJTV9DbGVhckZsYWdfQ0M2DQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NsZWFyRmxhZ19DQzYoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIFdSSVRFX1JFRyhUSU14LT5TUiwgfihUSU1fU1JfQ0M2SUYpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIENhcHR1cmUvQ29tcGFyZSA2IGludGVycnVwdCBmbGFnIChDQzZGKSBpcyBzZXQNCi0gKiAoQ2FwdHVyZS9Db21wYXJlIDYgaW50ZXJydXB0IGlzIHBlbmRpbmcpLg0KLSAqIEBybXRvbGwgU1IgICAgICAgICAgIENDNklGICAgICAgICAgTExfVElNX0lzQWN0aXZlRmxhZ19DQzYNCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzQWN0aXZlRmxhZ19DQzYoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFRJTXgtPlNSLCBUSU1fU1JfQ0M2SUYpID09IChUSU1fU1JfQ0M2SUYpKSA/IDFVTCA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2xlYXIgdGhlIGNvbW11dGF0aW9uIGludGVycnVwdCBmbGFnIChDT01JRikuDQotICogQHJtdG9sbCBTUiAgICAgICAgICAgQ09NSUYgICAgICAgICBMTF9USU1fQ2xlYXJGbGFnX0NPTQ0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9DbGVhckZsYWdfQ09NKFRJTV9UeXBlRGVmICpUSU14KSB7DQotICBXUklURV9SRUcoVElNeC0+U1IsIH4oVElNX1NSX0NPTUlGKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciBjb21tdXRhdGlvbiBpbnRlcnJ1cHQgZmxhZyAoQ09NSUYpIGlzIHNldA0KLSAqIChjb21tdXRhdGlvbiBpbnRlcnJ1cHQgaXMgcGVuZGluZykuDQotICogQHJtdG9sbCBTUiAgICAgICAgICAgQ09NSUYgICAgICAgICBMTF9USU1fSXNBY3RpdmVGbGFnX0NPTQ0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNBY3RpdmVGbGFnX0NPTShUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+U1IsIFRJTV9TUl9DT01JRikgPT0gKFRJTV9TUl9DT01JRikpID8gMVVMIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDbGVhciB0aGUgdHJpZ2dlciBpbnRlcnJ1cHQgZmxhZyAoVElGKS4NCi0gKiBAcm10b2xsIFNSICAgICAgICAgICBUSUYgICAgICAgICAgIExMX1RJTV9DbGVhckZsYWdfVFJJRw0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9DbGVhckZsYWdfVFJJRyhUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgV1JJVEVfUkVHKFRJTXgtPlNSLCB+KFRJTV9TUl9USUYpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIHRyaWdnZXIgaW50ZXJydXB0IGZsYWcgKFRJRikgaXMgc2V0ICh0cmlnZ2VyDQotICogaW50ZXJydXB0IGlzIHBlbmRpbmcpLg0KLSAqIEBybXRvbGwgU1IgICAgICAgICAgIFRJRiAgICAgICAgICAgTExfVElNX0lzQWN0aXZlRmxhZ19UUklHDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0FjdGl2ZUZsYWdfVFJJRyhUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+U1IsIFRJTV9TUl9USUYpID09IChUSU1fU1JfVElGKSkgPyAxVUwgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENsZWFyIHRoZSBicmVhayBpbnRlcnJ1cHQgZmxhZyAoQklGKS4NCi0gKiBAcm10b2xsIFNSICAgICAgICAgICBCSUYgICAgICAgICAgIExMX1RJTV9DbGVhckZsYWdfQlJLDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NsZWFyRmxhZ19CUksoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIFdSSVRFX1JFRyhUSU14LT5TUiwgfihUSU1fU1JfQklGKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciBicmVhayBpbnRlcnJ1cHQgZmxhZyAoQklGKSBpcyBzZXQgKGJyZWFrIGludGVycnVwdA0KLSAqIGlzIHBlbmRpbmcpLg0KLSAqIEBybXRvbGwgU1IgICAgICAgICAgIEJJRiAgICAgICAgICAgTExfVElNX0lzQWN0aXZlRmxhZ19CUksNCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzQWN0aXZlRmxhZ19CUksoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFRJTXgtPlNSLCBUSU1fU1JfQklGKSA9PSAoVElNX1NSX0JJRikpID8gMVVMIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDbGVhciB0aGUgYnJlYWsgMiBpbnRlcnJ1cHQgZmxhZyAoQjJJRikuDQotICogQHJtdG9sbCBTUiAgICAgICAgICAgQjJJRiAgICAgICAgICBMTF9USU1fQ2xlYXJGbGFnX0JSSzINCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ2xlYXJGbGFnX0JSSzIoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIFdSSVRFX1JFRyhUSU14LT5TUiwgfihUSU1fU1JfQjJJRikpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgYnJlYWsgMiBpbnRlcnJ1cHQgZmxhZyAoQjJJRikgaXMgc2V0IChicmVhayAyDQotICogaW50ZXJydXB0IGlzIHBlbmRpbmcpLg0KLSAqIEBybXRvbGwgU1IgICAgICAgICAgIEIySUYgICAgICAgICAgTExfVElNX0lzQWN0aXZlRmxhZ19CUksyDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0FjdGl2ZUZsYWdfQlJLMihUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+U1IsIFRJTV9TUl9CMklGKSA9PSAoVElNX1NSX0IySUYpKSA/IDFVTCA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2xlYXIgdGhlIENhcHR1cmUvQ29tcGFyZSAxIG92ZXItY2FwdHVyZSBpbnRlcnJ1cHQgZmxhZyAoQ0MxT0YpLg0KLSAqIEBybXRvbGwgU1IgICAgICAgICAgIENDMU9GICAgICAgICAgTExfVElNX0NsZWFyRmxhZ19DQzFPVlINCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ2xlYXJGbGFnX0NDMU9WUihUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgV1JJVEVfUkVHKFRJTXgtPlNSLCB+KFRJTV9TUl9DQzFPRikpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgQ2FwdHVyZS9Db21wYXJlIDEgb3Zlci1jYXB0dXJlIGludGVycnVwdCBmbGFnDQotICogKENDMU9GKSBpcyBzZXQgKENhcHR1cmUvQ29tcGFyZSAxIGludGVycnVwdCBpcyBwZW5kaW5nKS4NCi0gKiBAcm10b2xsIFNSICAgICAgICAgICBDQzFPRiAgICAgICAgIExMX1RJTV9Jc0FjdGl2ZUZsYWdfQ0MxT1ZSDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0FjdGl2ZUZsYWdfQ0MxT1ZSKFRJTV9UeXBlRGVmICpUSU14KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5TUiwgVElNX1NSX0NDMU9GKSA9PSAoVElNX1NSX0NDMU9GKSkgPyAxVUwgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENsZWFyIHRoZSBDYXB0dXJlL0NvbXBhcmUgMiBvdmVyLWNhcHR1cmUgaW50ZXJydXB0IGZsYWcgKENDMk9GKS4NCi0gKiBAcm10b2xsIFNSICAgICAgICAgICBDQzJPRiAgICAgICAgIExMX1RJTV9DbGVhckZsYWdfQ0MyT1ZSDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NsZWFyRmxhZ19DQzJPVlIoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIFdSSVRFX1JFRyhUSU14LT5TUiwgfihUSU1fU1JfQ0MyT0YpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIENhcHR1cmUvQ29tcGFyZSAyIG92ZXItY2FwdHVyZSBpbnRlcnJ1cHQgZmxhZw0KLSAqIChDQzJPRikgaXMgc2V0IChDYXB0dXJlL0NvbXBhcmUgMiBvdmVyLWNhcHR1cmUgaW50ZXJydXB0IGlzIHBlbmRpbmcpLg0KLSAqIEBybXRvbGwgU1IgICAgICAgICAgIENDMk9GICAgICAgICAgTExfVElNX0lzQWN0aXZlRmxhZ19DQzJPVlINCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzQWN0aXZlRmxhZ19DQzJPVlIoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFRJTXgtPlNSLCBUSU1fU1JfQ0MyT0YpID09IChUSU1fU1JfQ0MyT0YpKSA/IDFVTCA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2xlYXIgdGhlIENhcHR1cmUvQ29tcGFyZSAzIG92ZXItY2FwdHVyZSBpbnRlcnJ1cHQgZmxhZyAoQ0MzT0YpLg0KLSAqIEBybXRvbGwgU1IgICAgICAgICAgIENDM09GICAgICAgICAgTExfVElNX0NsZWFyRmxhZ19DQzNPVlINCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ2xlYXJGbGFnX0NDM09WUihUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgV1JJVEVfUkVHKFRJTXgtPlNSLCB+KFRJTV9TUl9DQzNPRikpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgQ2FwdHVyZS9Db21wYXJlIDMgb3Zlci1jYXB0dXJlIGludGVycnVwdCBmbGFnDQotICogKENDM09GKSBpcyBzZXQgKENhcHR1cmUvQ29tcGFyZSAzIG92ZXItY2FwdHVyZSBpbnRlcnJ1cHQgaXMgcGVuZGluZykuDQotICogQHJtdG9sbCBTUiAgICAgICAgICAgQ0MzT0YgICAgICAgICBMTF9USU1fSXNBY3RpdmVGbGFnX0NDM09WUg0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNBY3RpdmVGbGFnX0NDM09WUihUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+U1IsIFRJTV9TUl9DQzNPRikgPT0gKFRJTV9TUl9DQzNPRikpID8gMVVMIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDbGVhciB0aGUgQ2FwdHVyZS9Db21wYXJlIDQgb3Zlci1jYXB0dXJlIGludGVycnVwdCBmbGFnIChDQzRPRikuDQotICogQHJtdG9sbCBTUiAgICAgICAgICAgQ0M0T0YgICAgICAgICBMTF9USU1fQ2xlYXJGbGFnX0NDNE9WUg0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9DbGVhckZsYWdfQ0M0T1ZSKFRJTV9UeXBlRGVmICpUSU14KSB7DQotICBXUklURV9SRUcoVElNeC0+U1IsIH4oVElNX1NSX0NDNE9GKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciBDYXB0dXJlL0NvbXBhcmUgNCBvdmVyLWNhcHR1cmUgaW50ZXJydXB0IGZsYWcNCi0gKiAoQ0M0T0YpIGlzIHNldCAoQ2FwdHVyZS9Db21wYXJlIDQgb3Zlci1jYXB0dXJlIGludGVycnVwdCBpcyBwZW5kaW5nKS4NCi0gKiBAcm10b2xsIFNSICAgICAgICAgICBDQzRPRiAgICAgICAgIExMX1RJTV9Jc0FjdGl2ZUZsYWdfQ0M0T1ZSDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0FjdGl2ZUZsYWdfQ0M0T1ZSKFRJTV9UeXBlRGVmICpUSU14KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5TUiwgVElNX1NSX0NDNE9GKSA9PSAoVElNX1NSX0NDNE9GKSkgPyAxVUwgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENsZWFyIHRoZSBzeXN0ZW0gYnJlYWsgaW50ZXJydXB0IGZsYWcgKFNCSUYpLg0KLSAqIEBybXRvbGwgU1IgICAgICAgICAgIFNCSUYgICAgICAgICAgTExfVElNX0NsZWFyRmxhZ19TWVNCUksNCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ2xlYXJGbGFnX1NZU0JSSyhUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgV1JJVEVfUkVHKFRJTXgtPlNSLCB+KFRJTV9TUl9TQklGKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciBzeXN0ZW0gYnJlYWsgaW50ZXJydXB0IGZsYWcgKFNCSUYpIGlzIHNldCAoc3lzdGVtDQotICogYnJlYWsgaW50ZXJydXB0IGlzIHBlbmRpbmcpLg0KLSAqIEBybXRvbGwgU1IgICAgICAgICAgIFNCSUYgICAgICAgICAgTExfVElNX0lzQWN0aXZlRmxhZ19TWVNCUksNCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzQWN0aXZlRmxhZ19TWVNCUksoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFRJTXgtPlNSLCBUSU1fU1JfU0JJRikgPT0gKFRJTV9TUl9TQklGKSkgPyAxVUwgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENsZWFyIHRoZSB0cmFuc2l0aW9uIGVycm9yIGludGVycnVwdCBmbGFnIChURVJSRikuDQotICogQG5vdGUgTWFjcm8gSVNfVElNX0VOQ09ERVJfRVJST1JfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlcg0KLSAqIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGVuY29kZXIgZXJyb3IgbWFuYWdlbWVudC4NCi0gKiBAcm10b2xsIFNSICAgICAgICAgICBURVJSRiAgICAgICAgICAgTExfVElNX0NsZWFyRmxhZ19URVJSDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NsZWFyRmxhZ19URVJSKFRJTV9UeXBlRGVmICpUSU14KSB7DQotICBXUklURV9SRUcoVElNeC0+U1IsIH4oVElNX1NSX1RFUlJGKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciB0cmFuc2l0aW9uIGVycm9yIGludGVycnVwdCBmbGFnIChURVJSRikgaXMgc2V0DQotICogKHRyYW5zaXRpb24gZXJyb3IgaW50ZXJydXB0IGlzIHBlbmRpbmcpLg0KLSAqIEBub3RlIE1hY3JvIElTX1RJTV9FTkNPREVSX0VSUk9SX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXINCi0gKiBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBlbmNvZGVyIGVycm9yIG1hbmFnZW1lbnQuDQotICogQHJtdG9sbCBTUiAgICAgICAgICAgVEVSUkYgICAgICAgICAgIExMX1RJTV9Jc0FjdGl2ZUZsYWdfVEVSUg0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNBY3RpdmVGbGFnX1RFUlIoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFRJTXgtPlNSLCBUSU1fU1JfVEVSUkYpID09IChUSU1fU1JfVEVSUkYpKSA/IDFVTCA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2xlYXIgdGhlIGluZGV4IGVycm9yIGludGVycnVwdCBmbGFnIChJRVJSRikuDQotICogQG5vdGUgTWFjcm8gSVNfVElNX0VOQ09ERVJfRVJST1JfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlcg0KLSAqIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGVuY29kZXIgZXJyb3IgbWFuYWdlbWVudC4NCi0gKiBAcm10b2xsIFNSICAgICAgICAgICBJRVJSRiAgICAgICAgICAgTExfVElNX0NsZWFyRmxhZ19JRVJSDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NsZWFyRmxhZ19JRVJSKFRJTV9UeXBlRGVmICpUSU14KSB7DQotICBXUklURV9SRUcoVElNeC0+U1IsIH4oVElNX1NSX0lFUlJGKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciBpbmRleCBlcnJvciBpbnRlcnJ1cHQgZmxhZyAoSUVSUkYpIGlzIHNldCAoaW5kZXgNCi0gKiBlcnJvciBpbnRlcnJ1cHQgaXMgcGVuZGluZykuDQotICogQG5vdGUgTWFjcm8gSVNfVElNX0VOQ09ERVJfRVJST1JfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlcg0KLSAqIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGVuY29kZXIgZXJyb3IgbWFuYWdlbWVudC4NCi0gKiBAcm10b2xsIFNSICAgICAgICAgICBJRVJSRiAgICAgICAgICAgTExfVElNX0lzQWN0aXZlRmxhZ19JRVJSDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0FjdGl2ZUZsYWdfSUVSUihUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+U1IsIFRJTV9TUl9JRVJSRikgPT0gKFRJTV9TUl9JRVJSRikpID8gMVVMIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDbGVhciB0aGUgZGlyZWN0aW9uIGNoYW5nZSBpbnRlcnJ1cHQgZmxhZyAoRElSRikuDQotICogQG5vdGUgTWFjcm8gSVNfVElNX0ZVTkNUSU5PTkFMX0VOQ09ERVJfSU5URVJSVVBUX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkDQotICogdG8gY2hlY2sgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBlbmNvZGVyIGludGVycnVwdA0KLSAqIG1hbmFnZW1lbnQuDQotICogQHJtdG9sbCBTUiAgICAgICAgICAgRElSRiAgICAgICAgICAgTExfVElNX0NsZWFyRmxhZ19ESVINCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ2xlYXJGbGFnX0RJUihUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgV1JJVEVfUkVHKFRJTXgtPlNSLCB+KFRJTV9TUl9ESVJGKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciBkaXJlY3Rpb24gY2hhbmdlIGludGVycnVwdCBmbGFnIChESVJGKSBpcyBzZXQNCi0gKiAoZGlyZWN0aW9uIGNoYW5nZSBpbnRlcnJ1cHQgaXMgcGVuZGluZykuDQotICogQG5vdGUgTWFjcm8gSVNfVElNX0ZVTkNUSU5PTkFMX0VOQ09ERVJfSU5URVJSVVBUX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkDQotICogdG8gY2hlY2sgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBlbmNvZGVyIGludGVycnVwdA0KLSAqIG1hbmFnZW1lbnQuDQotICogQHJtdG9sbCBTUiAgICAgICAgICAgRElSRiAgICAgICAgICAgTExfVElNX0lzQWN0aXZlRmxhZ19ESVINCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzQWN0aXZlRmxhZ19ESVIoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFRJTXgtPlNSLCBUSU1fU1JfRElSRikgPT0gKFRJTV9TUl9ESVJGKSkgPyAxVUwgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENsZWFyIHRoZSBpbmRleCBpbnRlcnJ1cHQgZmxhZyAoSURYRikuDQotICogQG5vdGUgTWFjcm8gSVNfVElNX0ZVTkNUSU5PTkFMX0VOQ09ERVJfSU5URVJSVVBUX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkDQotICogdG8gY2hlY2sgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBlbmNvZGVyIGludGVycnVwdA0KLSAqIG1hbmFnZW1lbnQuDQotICogQHJtdG9sbCBTUiAgICAgICAgICAgSURYRiAgICAgICAgICAgTExfVElNX0NsZWFyRmxhZ19JRFgNCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ2xlYXJGbGFnX0lEWChUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgV1JJVEVfUkVHKFRJTXgtPlNSLCB+KFRJTV9TUl9JRFhGKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciBpbmRleCBpbnRlcnJ1cHQgZmxhZyAoSURYRikgaXMgc2V0IChpbmRleCBpbnRlcnJ1cHQNCi0gKiBpcyBwZW5kaW5nKS4NCi0gKiBAbm90ZSBNYWNybyBJU19USU1fRlVOQ1RJTk9OQUxfRU5DT0RFUl9JTlRFUlJVUFRfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQNCi0gKiB0byBjaGVjayB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGVuY29kZXIgaW50ZXJydXB0DQotICogbWFuYWdlbWVudC4NCi0gKiBAcm10b2xsIFNSICAgICAgICAgICBJRFhGICAgICAgICAgICBMTF9USU1fSXNBY3RpdmVGbGFnX0lEWA0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNBY3RpdmVGbGFnX0lEWChUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+U1IsIFRJTV9TUl9JRFhGKSA9PSAoVElNX1NSX0lEWEYpKSA/IDFVTCA6IDBVTCk7DQotfQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBUSU1fTExfRUZfSVRfTWFuYWdlbWVudCBJVC1NYW5hZ2VtZW50DQotICogQHsNCi0gKi8NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSB1cGRhdGUgaW50ZXJydXB0IChVSUUpLg0KLSAqIEBybXRvbGwgRElFUiAgICAgICAgIFVJRSAgICAgICAgICAgTExfVElNX0VuYWJsZUlUX1VQREFURQ0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9FbmFibGVJVF9VUERBVEUoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIFNFVF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfVUlFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIHVwZGF0ZSBpbnRlcnJ1cHQgKFVJRSkuDQotICogQHJtdG9sbCBESUVSICAgICAgICAgVUlFICAgICAgICAgICBMTF9USU1fRGlzYWJsZUlUX1VQREFURQ0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlSVRfVVBEQVRFKFRJTV9UeXBlRGVmICpUSU14KSB7DQotICBDTEVBUl9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfVUlFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdXBkYXRlIGludGVycnVwdCAoVUlFKSBpcyBlbmFibGVkLg0KLSAqIEBybXRvbGwgRElFUiAgICAgICAgIFVJRSAgICAgICAgICAgTExfVElNX0lzRW5hYmxlZElUX1VQREFURQ0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNFbmFibGVkSVRfVVBEQVRFKFRJTV9UeXBlRGVmICpUSU14KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9VSUUpID09IChUSU1fRElFUl9VSUUpKSA/IDFVTCA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIGNhcHR1cmUvY29tcGFyZSAxIGludGVycnVwdCAoQ0MxSUUpLg0KLSAqIEBybXRvbGwgRElFUiAgICAgICAgIENDMUlFICAgICAgICAgTExfVElNX0VuYWJsZUlUX0NDMQ0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9FbmFibGVJVF9DQzEoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIFNFVF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ0MxSUUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgY2FwdHVyZS9jb21wYXJlIDEgIGludGVycnVwdCAoQ0MxSUUpLg0KLSAqIEBybXRvbGwgRElFUiAgICAgICAgIENDMUlFICAgICAgICAgTExfVElNX0Rpc2FibGVJVF9DQzENCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZUlUX0NDMShUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgQ0xFQVJfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NDMUlFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY2FwdHVyZS9jb21wYXJlIDEgaW50ZXJydXB0IChDQzFJRSkgaXMgZW5hYmxlZC4NCi0gKiBAcm10b2xsIERJRVIgICAgICAgICBDQzFJRSAgICAgICAgIExMX1RJTV9Jc0VuYWJsZWRJVF9DQzENCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzRW5hYmxlZElUX0NDMShUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ0MxSUUpID09IChUSU1fRElFUl9DQzFJRSkpID8gMVVMDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSBjYXB0dXJlL2NvbXBhcmUgMiBpbnRlcnJ1cHQgKENDMklFKS4NCi0gKiBAcm10b2xsIERJRVIgICAgICAgICBDQzJJRSAgICAgICAgIExMX1RJTV9FbmFibGVJVF9DQzINCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlSVRfQ0MyKFRJTV9UeXBlRGVmICpUSU14KSB7DQotICBTRVRfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NDMklFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIGNhcHR1cmUvY29tcGFyZSAyICBpbnRlcnJ1cHQgKENDMklFKS4NCi0gKiBAcm10b2xsIERJRVIgICAgICAgICBDQzJJRSAgICAgICAgIExMX1RJTV9EaXNhYmxlSVRfQ0MyDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0Rpc2FibGVJVF9DQzIoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIENMRUFSX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DQzJJRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNhcHR1cmUvY29tcGFyZSAyIGludGVycnVwdCAoQ0MySUUpIGlzIGVuYWJsZWQuDQotICogQHJtdG9sbCBESUVSICAgICAgICAgQ0MySUUgICAgICAgICBMTF9USU1fSXNFbmFibGVkSVRfQ0MyDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0VuYWJsZWRJVF9DQzIoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NDMklFKSA9PSAoVElNX0RJRVJfQ0MySUUpKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgY2FwdHVyZS9jb21wYXJlIDMgaW50ZXJydXB0IChDQzNJRSkuDQotICogQHJtdG9sbCBESUVSICAgICAgICAgQ0MzSUUgICAgICAgICBMTF9USU1fRW5hYmxlSVRfQ0MzDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZUlUX0NDMyhUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgU0VUX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DQzNJRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBjYXB0dXJlL2NvbXBhcmUgMyAgaW50ZXJydXB0IChDQzNJRSkuDQotICogQHJtdG9sbCBESUVSICAgICAgICAgQ0MzSUUgICAgICAgICBMTF9USU1fRGlzYWJsZUlUX0NDMw0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlSVRfQ0MzKFRJTV9UeXBlRGVmICpUSU14KSB7DQotICBDTEVBUl9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ0MzSUUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjYXB0dXJlL2NvbXBhcmUgMyBpbnRlcnJ1cHQgKENDM0lFKSBpcyBlbmFibGVkLg0KLSAqIEBybXRvbGwgRElFUiAgICAgICAgIENDM0lFICAgICAgICAgTExfVElNX0lzRW5hYmxlZElUX0NDMw0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNFbmFibGVkSVRfQ0MzKFRJTV9UeXBlRGVmICpUSU14KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DQzNJRSkgPT0gKFRJTV9ESUVSX0NDM0lFKSkgPyAxVUwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIGNhcHR1cmUvY29tcGFyZSA0IGludGVycnVwdCAoQ0M0SUUpLg0KLSAqIEBybXRvbGwgRElFUiAgICAgICAgIENDNElFICAgICAgICAgTExfVElNX0VuYWJsZUlUX0NDNA0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9FbmFibGVJVF9DQzQoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIFNFVF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ0M0SUUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgY2FwdHVyZS9jb21wYXJlIDQgIGludGVycnVwdCAoQ0M0SUUpLg0KLSAqIEBybXRvbGwgRElFUiAgICAgICAgIENDNElFICAgICAgICAgTExfVElNX0Rpc2FibGVJVF9DQzQNCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZUlUX0NDNChUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgQ0xFQVJfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NDNElFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY2FwdHVyZS9jb21wYXJlIDQgaW50ZXJydXB0IChDQzRJRSkgaXMgZW5hYmxlZC4NCi0gKiBAcm10b2xsIERJRVIgICAgICAgICBDQzRJRSAgICAgICAgIExMX1RJTV9Jc0VuYWJsZWRJVF9DQzQNCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzRW5hYmxlZElUX0NDNChUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ0M0SUUpID09IChUSU1fRElFUl9DQzRJRSkpID8gMVVMDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSBjb21tdXRhdGlvbiBpbnRlcnJ1cHQgKENPTUlFKS4NCi0gKiBAcm10b2xsIERJRVIgICAgICAgICBDT01JRSAgICAgICAgIExMX1RJTV9FbmFibGVJVF9DT00NCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlSVRfQ09NKFRJTV9UeXBlRGVmICpUSU14KSB7DQotICBTRVRfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NPTUlFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIGNvbW11dGF0aW9uIGludGVycnVwdCAoQ09NSUUpLg0KLSAqIEBybXRvbGwgRElFUiAgICAgICAgIENPTUlFICAgICAgICAgTExfVElNX0Rpc2FibGVJVF9DT00NCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZUlUX0NPTShUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgQ0xFQVJfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NPTUlFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY29tbXV0YXRpb24gaW50ZXJydXB0IChDT01JRSkgaXMgZW5hYmxlZC4NCi0gKiBAcm10b2xsIERJRVIgICAgICAgICBDT01JRSAgICAgICAgIExMX1RJTV9Jc0VuYWJsZWRJVF9DT00NCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzRW5hYmxlZElUX0NPTShUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ09NSUUpID09IChUSU1fRElFUl9DT01JRSkpID8gMVVMDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSB0cmlnZ2VyIGludGVycnVwdCAoVElFKS4NCi0gKiBAcm10b2xsIERJRVIgICAgICAgICBUSUUgICAgICAgICAgIExMX1RJTV9FbmFibGVJVF9UUklHDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZUlUX1RSSUcoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIFNFVF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfVElFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIHRyaWdnZXIgaW50ZXJydXB0IChUSUUpLg0KLSAqIEBybXRvbGwgRElFUiAgICAgICAgIFRJRSAgICAgICAgICAgTExfVElNX0Rpc2FibGVJVF9UUklHDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0Rpc2FibGVJVF9UUklHKFRJTV9UeXBlRGVmICpUSU14KSB7DQotICBDTEVBUl9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfVElFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdHJpZ2dlciBpbnRlcnJ1cHQgKFRJRSkgaXMgZW5hYmxlZC4NCi0gKiBAcm10b2xsIERJRVIgICAgICAgICBUSUUgICAgICAgICAgIExMX1RJTV9Jc0VuYWJsZWRJVF9UUklHDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0VuYWJsZWRJVF9UUklHKFRJTV9UeXBlRGVmICpUSU14KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9USUUpID09IChUSU1fRElFUl9USUUpKSA/IDFVTCA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIGJyZWFrIGludGVycnVwdCAoQklFKS4NCi0gKiBAcm10b2xsIERJRVIgICAgICAgICBCSUUgICAgICAgICAgIExMX1RJTV9FbmFibGVJVF9CUksNCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlSVRfQlJLKFRJTV9UeXBlRGVmICpUSU14KSB7DQotICBTRVRfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0JJRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBicmVhayBpbnRlcnJ1cHQgKEJJRSkuDQotICogQHJtdG9sbCBESUVSICAgICAgICAgQklFICAgICAgICAgICBMTF9USU1fRGlzYWJsZUlUX0JSSw0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlSVRfQlJLKFRJTV9UeXBlRGVmICpUSU14KSB7DQotICBDTEVBUl9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQklFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgYnJlYWsgaW50ZXJydXB0IChCSUUpIGlzIGVuYWJsZWQuDQotICogQHJtdG9sbCBESUVSICAgICAgICAgQklFICAgICAgICAgICBMTF9USU1fSXNFbmFibGVkSVRfQlJLDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0VuYWJsZWRJVF9CUksoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0JJRSkgPT0gKFRJTV9ESUVSX0JJRSkpID8gMVVMIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgdHJhbnNpdGlvbiBlcnJvciBpbnRlcnJ1cHQgKFRFUlJJRSkuDQotICogQG5vdGUgTWFjcm8gSVNfVElNX0VOQ09ERVJfRVJST1JfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlcg0KLSAqIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGVuY29kZXIgZXJyb3IgbWFuYWdlbWVudC4NCi0gKiBAcm10b2xsIERJRVIgICAgICAgICBURVJSSUUgICAgICAgICAgIExMX1RJTV9FbmFibGVJVF9URVJSDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZUlUX1RFUlIoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIFNFVF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfVEVSUklFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIHRyYW5zaXRpb24gZXJyb3IgaW50ZXJydXB0IChURVJSSUUpLg0KLSAqIEBub3RlIE1hY3JvIElTX1RJTV9FTkNPREVSX0VSUk9SX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXINCi0gKiBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBlbmNvZGVyIGVycm9yIG1hbmFnZW1lbnQuDQotICogQHJtdG9sbCBESUVSICAgICAgICAgVEVSUklFICAgICAgICAgICBMTF9USU1fRGlzYWJsZUlUX1RFUlINCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZUlUX1RFUlIoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIENMRUFSX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9URVJSSUUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEluZGljYXRlcyB3aGV0aGVyIHRoZSB0cmFuc2l0aW9uIGVycm9yIGludGVycnVwdCAoVEVSUklFKSBpcyBlbmFibGVkLg0KLSAqIEBub3RlIE1hY3JvIElTX1RJTV9FTkNPREVSX0VSUk9SX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXINCi0gKiBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBlbmNvZGVyIGVycm9yIG1hbmFnZW1lbnQuDQotICogQHJtdG9sbCBESUVSICAgICAgICAgVEVSUklFICAgICAgICAgICBMTF9USU1fSXNFbmFibGVkSVRfVEVSUg0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNFbmFibGVkSVRfVEVSUihUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfVEVSUklFKSA9PSAoVElNX0RJRVJfVEVSUklFKSkgPyAxVUwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgaW5kZXggZXJyb3IgaW50ZXJydXB0IChJRVJSSUUpLg0KLSAqIEBub3RlIE1hY3JvIElTX1RJTV9FTkNPREVSX0VSUk9SX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXINCi0gKiBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBlbmNvZGVyIGVycm9yIG1hbmFnZW1lbnQuDQotICogQHJtdG9sbCBESUVSICAgICAgICAgSUVSUklFICAgICAgICAgICBMTF9USU1fRW5hYmxlSVRfSUVSUg0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9FbmFibGVJVF9JRVJSKFRJTV9UeXBlRGVmICpUSU14KSB7DQotICBTRVRfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0lFUlJJRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBpbmRleCBlcnJvciBpbnRlcnJ1cHQgKElFUlJJRSkuDQotICogQG5vdGUgTWFjcm8gSVNfVElNX0VOQ09ERVJfRVJST1JfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlcg0KLSAqIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGVuY29kZXIgZXJyb3IgbWFuYWdlbWVudC4NCi0gKiBAcm10b2xsIERJRVIgICAgICAgICBJRVJSSUUgICAgICAgICAgIExMX1RJTV9EaXNhYmxlSVRfSUVSUg0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlSVRfSUVSUihUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgQ0xFQVJfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0lFUlJJRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGluZGV4IGVycm9yIGludGVycnVwdCAoSUVSUklFKSBpcyBlbmFibGVkLg0KLSAqIEBub3RlIE1hY3JvIElTX1RJTV9FTkNPREVSX0VSUk9SX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXINCi0gKiBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBlbmNvZGVyIGVycm9yIG1hbmFnZW1lbnQuDQotICogQHJtdG9sbCBESUVSICAgICAgICAgSUVSUklFICAgICAgICAgICBMTF9USU1fSXNFbmFibGVkSVRfSUVSUg0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNFbmFibGVkSVRfSUVSUihUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfSUVSUklFKSA9PSAoVElNX0RJRVJfSUVSUklFKSkgPyAxVUwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgZGlyZWN0aW9uIGNoYW5nZSBpbnRlcnJ1cHQgKERJUklFKS4NCi0gKiBAbm90ZSBNYWNybyBJU19USU1fRlVOQ1RJTk9OQUxfRU5DT0RFUl9JTlRFUlJVUFRfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQNCi0gKiB0byBjaGVjayB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGVuY29kZXIgaW50ZXJydXB0DQotICogbWFuYWdlbWVudC4NCi0gKiBAcm10b2xsIERJRVIgICAgICAgICBESVJJRSAgICAgICAgICAgTExfVElNX0VuYWJsZUlUX0RJUg0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9FbmFibGVJVF9ESVIoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIFNFVF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfRElSSUUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgZGlyZWN0aW9uIGNoYW5nZSBpbnRlcnJ1cHQgKERJUklFKS4NCi0gKiBAbm90ZSBNYWNybyBJU19USU1fRlVOQ1RJTk9OQUxfRU5DT0RFUl9JTlRFUlJVUFRfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQNCi0gKiB0byBjaGVjayB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGVuY29kZXIgaW50ZXJydXB0DQotICogbWFuYWdlbWVudC4NCi0gKiBAcm10b2xsIERJRVIgICAgICAgICBESVJJRSAgICAgICAgICAgTExfVElNX0Rpc2FibGVJVF9ESVINCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZUlUX0RJUihUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgQ0xFQVJfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0RJUklFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZGlyZWN0aW9uIGNoYW5nZSBpbnRlcnJ1cHQgKERJUklFKSBpcyBlbmFibGVkLg0KLSAqIEBub3RlIE1hY3JvIElTX1RJTV9GVU5DVElOT05BTF9FTkNPREVSX0lOVEVSUlVQVF9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZA0KLSAqIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgZW5jb2RlciBpbnRlcnJ1cHQNCi0gKiBtYW5hZ2VtZW50Lg0KLSAqIEBybXRvbGwgRElFUiAgICAgICAgIERJUklFICAgICAgICAgICBMTF9USU1fSXNFbmFibGVkSVRfRElSDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0VuYWJsZWRJVF9ESVIoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0RJUklFKSA9PSAoVElNX0RJRVJfRElSSUUpKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgaW5kZXggaW50ZXJydXB0IChJRFhJRSkuDQotICogQG5vdGUgTWFjcm8gSVNfVElNX0ZVTkNUSU5PTkFMX0VOQ09ERVJfSU5URVJSVVBUX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkDQotICogdG8gY2hlY2sgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBlbmNvZGVyIGludGVycnVwdA0KLSAqIG1hbmFnZW1lbnQuDQotICogQHJtdG9sbCBESUVSICAgICAgICAgSURYSUUgICAgICAgICAgIExMX1RJTV9FbmFibGVJVF9JRFgNCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlSVRfSURYKFRJTV9UeXBlRGVmICpUSU14KSB7DQotICBTRVRfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0lEWElFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIGluZGV4IGludGVycnVwdCAoSURYSUUpLg0KLSAqIEBub3RlIE1hY3JvIElTX1RJTV9GVU5DVElOT05BTF9FTkNPREVSX0lOVEVSUlVQVF9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZA0KLSAqIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgZW5jb2RlciBpbnRlcnJ1cHQNCi0gKiBtYW5hZ2VtZW50Lg0KLSAqIEBybXRvbGwgRElFUiAgICAgICAgIElEWElFICAgICAgICAgICBMTF9USU1fRGlzYWJsZUlUX0lEWA0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlSVRfSURYKFRJTV9UeXBlRGVmICpUSU14KSB7DQotICBDTEVBUl9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfSURYSUUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEluZGljYXRlcyB3aGV0aGVyIHRoZSBpbmRleCBpbnRlcnJ1cHQgKElEWElFKSBpcyBlbmFibGVkLg0KLSAqIEBub3RlIE1hY3JvIElTX1RJTV9GVU5DVElOT05BTF9FTkNPREVSX0lOVEVSUlVQVF9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZA0KLSAqIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgZW5jb2RlciBpbnRlcnJ1cHQNCi0gKiBtYW5hZ2VtZW50Lg0KLSAqIEBybXRvbGwgRElFUiAgICAgICAgIElEWElFICAgICAgICAgICBMTF9USU1fSXNFbmFibGVkSVRfSURYDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0VuYWJsZWRJVF9JRFgoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0lEWElFKSA9PSAoVElNX0RJRVJfSURYSUUpKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9MTF9FRl9ETUFfTWFuYWdlbWVudCBETUEgTWFuYWdlbWVudA0KLSAqIEB7DQotICovDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgdXBkYXRlIERNQSByZXF1ZXN0IChVREUpLg0KLSAqIEBybXRvbGwgRElFUiAgICAgICAgIFVERSAgICAgICAgICAgTExfVElNX0VuYWJsZURNQVJlcV9VUERBVEUNCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlRE1BUmVxX1VQREFURShUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgU0VUX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9VREUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgdXBkYXRlIERNQSByZXF1ZXN0IChVREUpLg0KLSAqIEBybXRvbGwgRElFUiAgICAgICAgIFVERSAgICAgICAgICAgTExfVElNX0Rpc2FibGVETUFSZXFfVVBEQVRFDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0Rpc2FibGVETUFSZXFfVVBEQVRFKFRJTV9UeXBlRGVmICpUSU14KSB7DQotICBDTEVBUl9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfVURFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdXBkYXRlIERNQSByZXF1ZXN0ICAoVURFKSBpcyBlbmFibGVkLg0KLSAqIEBybXRvbGwgRElFUiAgICAgICAgIFVERSAgICAgICAgICAgTExfVElNX0lzRW5hYmxlZERNQVJlcV9VUERBVEUNCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzRW5hYmxlZERNQVJlcV9VUERBVEUoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX1VERSkgPT0gKFRJTV9ESUVSX1VERSkpID8gMVVMIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgY2FwdHVyZS9jb21wYXJlIDEgRE1BIHJlcXVlc3QgKENDMURFKS4NCi0gKiBAcm10b2xsIERJRVIgICAgICAgICBDQzFERSAgICAgICAgIExMX1RJTV9FbmFibGVETUFSZXFfQ0MxDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZURNQVJlcV9DQzEoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIFNFVF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ0MxREUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgY2FwdHVyZS9jb21wYXJlIDEgIERNQSByZXF1ZXN0IChDQzFERSkuDQotICogQHJtdG9sbCBESUVSICAgICAgICAgQ0MxREUgICAgICAgICBMTF9USU1fRGlzYWJsZURNQVJlcV9DQzENCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZURNQVJlcV9DQzEoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIENMRUFSX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DQzFERSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNhcHR1cmUvY29tcGFyZSAxIERNQSByZXF1ZXN0IChDQzFERSkgaXMNCi0gKiBlbmFibGVkLg0KLSAqIEBybXRvbGwgRElFUiAgICAgICAgIENDMURFICAgICAgICAgTExfVElNX0lzRW5hYmxlZERNQVJlcV9DQzENCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzRW5hYmxlZERNQVJlcV9DQzEoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NDMURFKSA9PSAoVElNX0RJRVJfQ0MxREUpKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgY2FwdHVyZS9jb21wYXJlIDIgRE1BIHJlcXVlc3QgKENDMkRFKS4NCi0gKiBAcm10b2xsIERJRVIgICAgICAgICBDQzJERSAgICAgICAgIExMX1RJTV9FbmFibGVETUFSZXFfQ0MyDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZURNQVJlcV9DQzIoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIFNFVF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ0MyREUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgY2FwdHVyZS9jb21wYXJlIDIgIERNQSByZXF1ZXN0IChDQzJERSkuDQotICogQHJtdG9sbCBESUVSICAgICAgICAgQ0MyREUgICAgICAgICBMTF9USU1fRGlzYWJsZURNQVJlcV9DQzINCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZURNQVJlcV9DQzIoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIENMRUFSX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DQzJERSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNhcHR1cmUvY29tcGFyZSAyIERNQSByZXF1ZXN0IChDQzJERSkgaXMNCi0gKiBlbmFibGVkLg0KLSAqIEBybXRvbGwgRElFUiAgICAgICAgIENDMkRFICAgICAgICAgTExfVElNX0lzRW5hYmxlZERNQVJlcV9DQzINCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzRW5hYmxlZERNQVJlcV9DQzIoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NDMkRFKSA9PSAoVElNX0RJRVJfQ0MyREUpKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgY2FwdHVyZS9jb21wYXJlIDMgRE1BIHJlcXVlc3QgKENDM0RFKS4NCi0gKiBAcm10b2xsIERJRVIgICAgICAgICBDQzNERSAgICAgICAgIExMX1RJTV9FbmFibGVETUFSZXFfQ0MzDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZURNQVJlcV9DQzMoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIFNFVF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ0MzREUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgY2FwdHVyZS9jb21wYXJlIDMgIERNQSByZXF1ZXN0IChDQzNERSkuDQotICogQHJtdG9sbCBESUVSICAgICAgICAgQ0MzREUgICAgICAgICBMTF9USU1fRGlzYWJsZURNQVJlcV9DQzMNCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZURNQVJlcV9DQzMoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIENMRUFSX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DQzNERSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNhcHR1cmUvY29tcGFyZSAzIERNQSByZXF1ZXN0IChDQzNERSkgaXMNCi0gKiBlbmFibGVkLg0KLSAqIEBybXRvbGwgRElFUiAgICAgICAgIENDM0RFICAgICAgICAgTExfVElNX0lzRW5hYmxlZERNQVJlcV9DQzMNCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzRW5hYmxlZERNQVJlcV9DQzMoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NDM0RFKSA9PSAoVElNX0RJRVJfQ0MzREUpKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgY2FwdHVyZS9jb21wYXJlIDQgRE1BIHJlcXVlc3QgKENDNERFKS4NCi0gKiBAcm10b2xsIERJRVIgICAgICAgICBDQzRERSAgICAgICAgIExMX1RJTV9FbmFibGVETUFSZXFfQ0M0DQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZURNQVJlcV9DQzQoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIFNFVF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ0M0REUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgY2FwdHVyZS9jb21wYXJlIDQgIERNQSByZXF1ZXN0IChDQzRERSkuDQotICogQHJtdG9sbCBESUVSICAgICAgICAgQ0M0REUgICAgICAgICBMTF9USU1fRGlzYWJsZURNQVJlcV9DQzQNCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZURNQVJlcV9DQzQoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIENMRUFSX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DQzRERSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNhcHR1cmUvY29tcGFyZSA0IERNQSByZXF1ZXN0IChDQzRERSkgaXMNCi0gKiBlbmFibGVkLg0KLSAqIEBybXRvbGwgRElFUiAgICAgICAgIENDNERFICAgICAgICAgTExfVElNX0lzRW5hYmxlZERNQVJlcV9DQzQNCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzRW5hYmxlZERNQVJlcV9DQzQoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NDNERFKSA9PSAoVElNX0RJRVJfQ0M0REUpKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgY29tbXV0YXRpb24gRE1BIHJlcXVlc3QgKENPTURFKS4NCi0gKiBAcm10b2xsIERJRVIgICAgICAgICBDT01ERSAgICAgICAgIExMX1RJTV9FbmFibGVETUFSZXFfQ09NDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZURNQVJlcV9DT00oVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIFNFVF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ09NREUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgY29tbXV0YXRpb24gRE1BIHJlcXVlc3QgKENPTURFKS4NCi0gKiBAcm10b2xsIERJRVIgICAgICAgICBDT01ERSAgICAgICAgIExMX1RJTV9EaXNhYmxlRE1BUmVxX0NPTQ0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlRE1BUmVxX0NPTShUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgQ0xFQVJfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NPTURFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY29tbXV0YXRpb24gRE1BIHJlcXVlc3QgKENPTURFKSBpcyBlbmFibGVkLg0KLSAqIEBybXRvbGwgRElFUiAgICAgICAgIENPTURFICAgICAgICAgTExfVElNX0lzRW5hYmxlZERNQVJlcV9DT00NCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzRW5hYmxlZERNQVJlcV9DT00oVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NPTURFKSA9PSAoVElNX0RJRVJfQ09NREUpKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgdHJpZ2dlciBpbnRlcnJ1cHQgKFRERSkuDQotICogQHJtdG9sbCBESUVSICAgICAgICAgVERFICAgICAgICAgICBMTF9USU1fRW5hYmxlRE1BUmVxX1RSSUcNCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlRE1BUmVxX1RSSUcoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIFNFVF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfVERFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIHRyaWdnZXIgaW50ZXJydXB0IChUREUpLg0KLSAqIEBybXRvbGwgRElFUiAgICAgICAgIFRERSAgICAgICAgICAgTExfVElNX0Rpc2FibGVETUFSZXFfVFJJRw0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlRE1BUmVxX1RSSUcoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIENMRUFSX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9UREUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEluZGljYXRlcyB3aGV0aGVyIHRoZSB0cmlnZ2VyIGludGVycnVwdCAoVERFKSBpcyBlbmFibGVkLg0KLSAqIEBybXRvbGwgRElFUiAgICAgICAgIFRERSAgICAgICAgICAgTExfVElNX0lzRW5hYmxlZERNQVJlcV9UUklHDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0VuYWJsZWRETUFSZXFfVFJJRyhUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfVERFKSA9PSAoVElNX0RJRVJfVERFKSkgPyAxVUwgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0xMX0VGX0VWRU5UX01hbmFnZW1lbnQgRVZFTlQtTWFuYWdlbWVudA0KLSAqIEB7DQotICovDQotLyoqDQotICogQGJyaWVmICBHZW5lcmF0ZSBhbiB1cGRhdGUgZXZlbnQuDQotICogQHJtdG9sbCBFR1IgICAgICAgICAgVUcgICAgICAgICAgICBMTF9USU1fR2VuZXJhdGVFdmVudF9VUERBVEUNCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fR2VuZXJhdGVFdmVudF9VUERBVEUoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIFNFVF9CSVQoVElNeC0+RUdSLCBUSU1fRUdSX1VHKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZW5lcmF0ZSBDYXB0dXJlL0NvbXBhcmUgMSBldmVudC4NCi0gKiBAcm10b2xsIEVHUiAgICAgICAgICBDQzFHICAgICAgICAgIExMX1RJTV9HZW5lcmF0ZUV2ZW50X0NDMQ0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9HZW5lcmF0ZUV2ZW50X0NDMShUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgU0VUX0JJVChUSU14LT5FR1IsIFRJTV9FR1JfQ0MxRyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2VuZXJhdGUgQ2FwdHVyZS9Db21wYXJlIDIgZXZlbnQuDQotICogQHJtdG9sbCBFR1IgICAgICAgICAgQ0MyRyAgICAgICAgICBMTF9USU1fR2VuZXJhdGVFdmVudF9DQzINCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fR2VuZXJhdGVFdmVudF9DQzIoVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIFNFVF9CSVQoVElNeC0+RUdSLCBUSU1fRUdSX0NDMkcpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdlbmVyYXRlIENhcHR1cmUvQ29tcGFyZSAzIGV2ZW50Lg0KLSAqIEBybXRvbGwgRUdSICAgICAgICAgIENDM0cgICAgICAgICAgTExfVElNX0dlbmVyYXRlRXZlbnRfQ0MzDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0dlbmVyYXRlRXZlbnRfQ0MzKFRJTV9UeXBlRGVmICpUSU14KSB7DQotICBTRVRfQklUKFRJTXgtPkVHUiwgVElNX0VHUl9DQzNHKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZW5lcmF0ZSBDYXB0dXJlL0NvbXBhcmUgNCBldmVudC4NCi0gKiBAcm10b2xsIEVHUiAgICAgICAgICBDQzRHICAgICAgICAgIExMX1RJTV9HZW5lcmF0ZUV2ZW50X0NDNA0KLSAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9HZW5lcmF0ZUV2ZW50X0NDNChUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgU0VUX0JJVChUSU14LT5FR1IsIFRJTV9FR1JfQ0M0Ryk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2VuZXJhdGUgY29tbXV0YXRpb24gZXZlbnQuDQotICogQHJtdG9sbCBFR1IgICAgICAgICAgQ09NRyAgICAgICAgICBMTF9USU1fR2VuZXJhdGVFdmVudF9DT00NCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fR2VuZXJhdGVFdmVudF9DT00oVElNX1R5cGVEZWYgKlRJTXgpIHsNCi0gIFNFVF9CSVQoVElNeC0+RUdSLCBUSU1fRUdSX0NPTUcpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdlbmVyYXRlIHRyaWdnZXIgZXZlbnQuDQotICogQHJtdG9sbCBFR1IgICAgICAgICAgVEcgICAgICAgICAgICBMTF9USU1fR2VuZXJhdGVFdmVudF9UUklHDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0dlbmVyYXRlRXZlbnRfVFJJRyhUSU1fVHlwZURlZiAqVElNeCkgew0KLSAgU0VUX0JJVChUSU14LT5FR1IsIFRJTV9FR1JfVEcpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdlbmVyYXRlIGJyZWFrIGV2ZW50Lg0KLSAqIEBybXRvbGwgRUdSICAgICAgICAgIEJHICAgICAgICAgICAgTExfVElNX0dlbmVyYXRlRXZlbnRfQlJLDQotICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0dlbmVyYXRlRXZlbnRfQlJLKFRJTV9UeXBlRGVmICpUSU14KSB7DQotICBTRVRfQklUKFRJTXgtPkVHUiwgVElNX0VHUl9CRyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2VuZXJhdGUgYnJlYWsgMiBldmVudC4NCi0gKiBAcm10b2xsIEVHUiAgICAgICAgICBCMkcgICAgICAgICAgIExMX1RJTV9HZW5lcmF0ZUV2ZW50X0JSSzINCi0gKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fR2VuZXJhdGVFdmVudF9CUksyKFRJTV9UeXBlRGVmICpUSU14KSB7DQotICBTRVRfQklUKFRJTXgtPkVHUiwgVElNX0VHUl9CMkcpOw0KLX0NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLSNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikNCi0vKiogQGRlZmdyb3VwIFRJTV9MTF9FRl9Jbml0IEluaXRpYWxpc2F0aW9uIGFuZCBkZWluaXRpYWxpc2F0aW9uIGZ1bmN0aW9ucw0KLSAqIEB7DQotICovDQotDQotRXJyb3JTdGF0dXMgTExfVElNX0RlSW5pdChUSU1fVHlwZURlZiAqVElNeCk7DQotdm9pZCBMTF9USU1fU3RydWN0SW5pdChMTF9USU1fSW5pdFR5cGVEZWYgKlRJTV9Jbml0U3RydWN0KTsNCi1FcnJvclN0YXR1cyBMTF9USU1fSW5pdChUSU1fVHlwZURlZiAqVElNeCwgTExfVElNX0luaXRUeXBlRGVmICpUSU1fSW5pdFN0cnVjdCk7DQotdm9pZCBMTF9USU1fT0NfU3RydWN0SW5pdChMTF9USU1fT0NfSW5pdFR5cGVEZWYgKlRJTV9PQ19Jbml0U3RydWN0KTsNCi1FcnJvclN0YXR1cyBMTF9USU1fT0NfSW5pdChUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBMTF9USU1fT0NfSW5pdFR5cGVEZWYgKlRJTV9PQ19Jbml0U3RydWN0KTsNCi12b2lkIExMX1RJTV9JQ19TdHJ1Y3RJbml0KExMX1RJTV9JQ19Jbml0VHlwZURlZiAqVElNX0lDSW5pdFN0cnVjdCk7DQotRXJyb3JTdGF0dXMgTExfVElNX0lDX0luaXQoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENoYW5uZWwsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfVElNX0lDX0luaXRUeXBlRGVmICpUSU1fSUNfSW5pdFN0cnVjdCk7DQotdm9pZCBMTF9USU1fRU5DT0RFUl9TdHJ1Y3RJbml0KA0KLSAgICBMTF9USU1fRU5DT0RFUl9Jbml0VHlwZURlZiAqVElNX0VuY29kZXJJbml0U3RydWN0KTsNCi1FcnJvclN0YXR1cyBMTF9USU1fRU5DT0RFUl9Jbml0KA0KLSAgICBUSU1fVHlwZURlZiAqVElNeCwgTExfVElNX0VOQ09ERVJfSW5pdFR5cGVEZWYgKlRJTV9FbmNvZGVySW5pdFN0cnVjdCk7DQotdm9pZCBMTF9USU1fSEFMTFNFTlNPUl9TdHJ1Y3RJbml0KA0KLSAgICBMTF9USU1fSEFMTFNFTlNPUl9Jbml0VHlwZURlZiAqVElNX0hhbGxTZW5zb3JJbml0U3RydWN0KTsNCi1FcnJvclN0YXR1cyBMTF9USU1fSEFMTFNFTlNPUl9Jbml0KA0KLSAgICBUSU1fVHlwZURlZiAqVElNeCwgTExfVElNX0hBTExTRU5TT1JfSW5pdFR5cGVEZWYgKlRJTV9IYWxsU2Vuc29ySW5pdFN0cnVjdCk7DQotdm9pZCBMTF9USU1fQkRUUl9TdHJ1Y3RJbml0KExMX1RJTV9CRFRSX0luaXRUeXBlRGVmICpUSU1fQkRUUkluaXRTdHJ1Y3QpOw0KLUVycm9yU3RhdHVzIExMX1RJTV9CRFRSX0luaXQoVElNX1R5cGVEZWYgKlRJTXgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTF9USU1fQkRUUl9Jbml0VHlwZURlZiAqVElNX0JEVFJJbml0U3RydWN0KTsNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLSNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotI2VuZGlmIC8qIFRJTTEgfHwgVElNMiB8fCBUSU0zIHx8IFRJTTQgfHwgVElNNSB8fCBUSU02IHx8IFRJTTcgfHwgVElNOCB8fCBcDQotICAgICAgICAgIFRJTTE1IHx8IFRJTTE2IHx8IFRJTTE3IHx8IFRJTTIwICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0jaWZkZWYgX19jcGx1c3BsdXMNCi19DQotI2VuZGlmDQotDQotI2VuZGlmIC8qIF9fU1RNMzJHNHh4X0xMX1RJTV9IICovDQorLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAZmlsZSAgICBzdG0zMmc0eHhfbGxfdGltLmgKKyAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBUSU0gTEwgbW9kdWxlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGF0dGVudGlvbgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGVybXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZQorICogaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc29mdHdhcmUgY29tcG9uZW50LgorICogSWYgbm8gTElDRU5TRSBmaWxlIGNvbWVzIHdpdGggdGhpcyBzb2Z0d2FyZSwgaXQgaXMgcHJvdmlkZWQgQVMtSVMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9fU1RNMzJHNHh4X0xMX1RJTV9ICisjZGVmaW5lIF9fU1RNMzJHNHh4X0xMX1RJTV9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmc0eHguaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzR4eF9MTF9Ecml2ZXIKKyAqIEB7CisgKi8KKworI2lmIGRlZmluZWQoVElNMSkgfHwgZGVmaW5lZChUSU0yKSB8fCBkZWZpbmVkKFRJTTMpIHx8IGRlZmluZWQoVElNNCkgfHwgXAorICAgIGRlZmluZWQoVElNNSkgfHwgZGVmaW5lZChUSU02KSB8fCBkZWZpbmVkKFRJTTcpIHx8IGRlZmluZWQoVElNOCkgfHwgXAorICAgIGRlZmluZWQoVElNMTUpIHx8IGRlZmluZWQoVElNMTYpIHx8IGRlZmluZWQoVElNMTcpIHx8IGRlZmluZWQoVElNMjApCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMIFRJTQorICogQHsKKyAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVElNX0xMX1ByaXZhdGVfVmFyaWFibGVzIFRJTSBQcml2YXRlIFZhcmlhYmxlcworICogQHsKKyAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgT0ZGU0VUX1RBQl9DQ01SeFtdID0geworICAgIDB4MDBVLCAvKiAwOiBUSU14X0NIMSAgKi8KKyAgICAweDAwVSwgLyogMTogVElNeF9DSDFOICovCisgICAgMHgwMFUsIC8qIDI6IFRJTXhfQ0gyICAqLworICAgIDB4MDBVLCAvKiAzOiBUSU14X0NIMk4gKi8KKyAgICAweDA0VSwgLyogNDogVElNeF9DSDMgICovCisgICAgMHgwNFUsIC8qIDU6IFRJTXhfQ0gzTiAqLworICAgIDB4MDRVLCAvKiA2OiBUSU14X0NINCAgKi8KKyAgICAweDA0VSwgLyogNzogVElNeF9DSDROICovCisgICAgMHgzOFUsIC8qIDg6IFRJTXhfQ0g1ICAqLworICAgIDB4MzhVICAvKiA5OiBUSU14X0NINiAgKi8KKworfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgU0hJRlRfVEFCX09DeHhbXSA9IHsKKyAgICAwVSwgLyogMDogT0MxTSwgT0MxRkUsIE9DMVBFICovCisgICAgMFUsIC8qIDE6IC0gTkEgKi8KKyAgICA4VSwgLyogMjogT0MyTSwgT0MyRkUsIE9DMlBFICovCisgICAgMFUsIC8qIDM6IC0gTkEgKi8KKyAgICAwVSwgLyogNDogT0MzTSwgT0MzRkUsIE9DM1BFICovCisgICAgMFUsIC8qIDU6IC0gTkEgKi8KKyAgICA4VSwgLyogNjogT0M0TSwgT0M0RkUsIE9DNFBFICovCisgICAgMFUsIC8qIDc6IC0gTkEgKi8KKyAgICAwVSwgLyogODogT0M1TSwgT0M1RkUsIE9DNVBFICovCisgICAgOFUgIC8qIDk6IE9DNk0sIE9DNkZFLCBPQzZQRSAqLworfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgU0hJRlRfVEFCX0lDeHhbXSA9IHsKKyAgICAwVSwgLyogMDogQ0MxUywgSUMxUFNDLCBJQzFGICovCisgICAgMFUsIC8qIDE6IC0gTkEgKi8KKyAgICA4VSwgLyogMjogQ0MyUywgSUMyUFNDLCBJQzJGICovCisgICAgMFUsIC8qIDM6IC0gTkEgKi8KKyAgICAwVSwgLyogNDogQ0MzUywgSUMzUFNDLCBJQzNGICovCisgICAgMFUsIC8qIDU6IC0gTkEgKi8KKyAgICA4VSwgLyogNjogQ0M0UywgSUM0UFNDLCBJQzRGICovCisgICAgMFUsIC8qIDc6IC0gTkEgKi8KKyAgICAwVSwgLyogODogLSBOQSAqLworICAgIDBVICAvKiA5OiAtIE5BICovCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBTSElGVF9UQUJfQ0N4UFtdID0geworICAgIDBVLCAgLyogMDogQ0MxUCAqLworICAgIDJVLCAgLyogMTogQ0MxTlAgKi8KKyAgICA0VSwgIC8qIDI6IENDMlAgKi8KKyAgICA2VSwgIC8qIDM6IENDMk5QICovCisgICAgOFUsICAvKiA0OiBDQzNQICovCisgICAgMTBVLCAvKiA1OiBDQzNOUCAqLworICAgIDEyVSwgLyogNjogQ0M0UCAqLworICAgIDE0VSwgLyogNzogQ0M0TlAgKi8KKyAgICAxNlUsIC8qIDg6IENDNVAgKi8KKyAgICAyMFUgIC8qIDk6IENDNlAgKi8KK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IFNISUZUX1RBQl9PSVN4W10gPSB7CisgICAgMFUsIC8qIDA6IE9JUzEgKi8KKyAgICAxVSwgLyogMTogT0lTMU4gKi8KKyAgICAyVSwgLyogMjogT0lTMiAqLworICAgIDNVLCAvKiAzOiBPSVMyTiAqLworICAgIDRVLCAvKiA0OiBPSVMzICovCisgICAgNVUsIC8qIDU6IE9JUzNOICovCisgICAgNlUsIC8qIDY6IE9JUzQgKi8KKyAgICA3VSwgLyogNzogT0lTNE4gKi8KKyAgICA4VSwgLyogODogT0lTNSAqLworICAgIDEwVSAvKiA5OiBPSVM2ICovCit9OworLyoqCisgKiBAfQorICovCisKKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFRJTV9MTF9Qcml2YXRlX0NvbnN0YW50cyBUSU0gUHJpdmF0ZSBDb25zdGFudHMKKyAqIEB7CisgKi8KKworLyogRGVmaW5lcyB1c2VkIGZvciB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSByZWdpc3RlciBhbmQgcGVyZm9ybSBvZmZzZXRzICovCisjZGVmaW5lIFRJTV9QT1NJVElPTl9CUktfU09VUkNFIChQT1NJVElPTl9WQUwoU291cmNlKSAmIDB4MUZVTCkKKworLyogR2VuZXJpYyBiaXQgZGVmaW5pdGlvbnMgZm9yIFRJTXhfQUYxIHJlZ2lzdGVyICovCisjZGVmaW5lIFRJTXhfQUYxX0JLSU5QIFRJTTFfQUYxX0JLSU5QICAgLyohPCBCUksgQktJTiBpbnB1dCBwb2xhcml0eSAqLworI2RlZmluZSBUSU14X0FGMV9FVFJTRUwgVElNMV9BRjFfRVRSU0VMIC8qITwgVElNeCBFVFIgc291cmNlIHNlbGVjdGlvbiAqLworCisvKiBNYXNrIHVzZWQgdG8gc2V0IHRoZSBUREdbeDowXSBvZiB0aGUgRFRHIGJpdHMgb2YgdGhlIFRJTXhfQkRUUiByZWdpc3RlciAqLworI2RlZmluZSBEVF9ERUxBWV8xICgodWludDhfdCkweDdGKQorI2RlZmluZSBEVF9ERUxBWV8yICgodWludDhfdCkweDNGKQorI2RlZmluZSBEVF9ERUxBWV8zICgodWludDhfdCkweDFGKQorI2RlZmluZSBEVF9ERUxBWV80ICgodWludDhfdCkweDFGKQorCisvKiBNYXNrIHVzZWQgdG8gc2V0IHRoZSBEVEdbNzo1XSBiaXRzIG9mIHRoZSBEVEcgYml0cyBvZiB0aGUgVElNeF9CRFRSIHJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgRFRfUkFOR0VfMSAoKHVpbnQ4X3QpMHgwMCkKKyNkZWZpbmUgRFRfUkFOR0VfMiAoKHVpbnQ4X3QpMHg4MCkKKyNkZWZpbmUgRFRfUkFOR0VfMyAoKHVpbnQ4X3QpMHhDMCkKKyNkZWZpbmUgRFRfUkFOR0VfNCAoKHVpbnQ4X3QpMHhFMCkKKworLyoqIExlZ2FjeSBkZWZpbml0aW9ucyBmb3IgY29tcGF0aWJpbGl0eSBwdXJwb3NlCitAY29uZCAwCisgICovCisvKioKK0BlbmRjb25kCisgICovCisKKyNkZWZpbmUgT0NSRUZfQ0xFQVJfU0VMRUNUX1BvcyAoMjhVKQorI2RlZmluZSBPQ1JFRl9DTEVBUl9TRUxFQ1RfTXNrIFwKKyAgKDB4MVUgPDwgT0NSRUZfQ0xFQVJfU0VMRUNUX1BvcykgLyohPCAweDEwMDAwMDAwICovCisvKioKKyAqIEB9CisgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVElNX0xMX1ByaXZhdGVfTWFjcm9zIFRJTSBQcml2YXRlIE1hY3JvcworICogQHsKKyAqLworLyoqIEBicmllZiAgQ29udmVydCBjaGFubmVsIGlkIGludG8gY2hhbm5lbCBpbmRleC4KKyAqIEBwYXJhbSAgX19DSEFOTkVMX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxTgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDJOCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIM04KKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINAorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0TgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g1CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDYKKyAqIEByZXR2YWwgbm9uZQorICovCisjZGVmaW5lIFRJTV9HRVRfQ0hBTk5FTF9JTkRFWChfX0NIQU5ORUxfXykgICAgICAgXAorICAoKChfX0NIQU5ORUxfXykgPT0gTExfVElNX0NIQU5ORUxfQ0gxKSAgICA/IDBVIFwKKyAgIDogKChfX0NIQU5ORUxfXykgPT0gTExfVElNX0NIQU5ORUxfQ0gxTikgPyAxVSBcCisgICA6ICgoX19DSEFOTkVMX18pID09IExMX1RJTV9DSEFOTkVMX0NIMikgID8gMlUgXAorICAgOiAoKF9fQ0hBTk5FTF9fKSA9PSBMTF9USU1fQ0hBTk5FTF9DSDJOKSA/IDNVIFwKKyAgIDogKChfX0NIQU5ORUxfXykgPT0gTExfVElNX0NIQU5ORUxfQ0gzKSAgPyA0VSBcCisgICA6ICgoX19DSEFOTkVMX18pID09IExMX1RJTV9DSEFOTkVMX0NIM04pID8gNVUgXAorICAgOiAoKF9fQ0hBTk5FTF9fKSA9PSBMTF9USU1fQ0hBTk5FTF9DSDQpICA/IDZVIFwKKyAgIDogKChfX0NIQU5ORUxfXykgPT0gTExfVElNX0NIQU5ORUxfQ0g0TikgPyA3VSBcCisgICA6ICgoX19DSEFOTkVMX18pID09IExMX1RJTV9DSEFOTkVMX0NINSkgID8gOFUgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDlVKQorCisvKiogQGJyaWVmICBDYWxjdWxhdGUgdGhlIGRlYWR0aW1lIHNhbXBsaW5nIHBlcmlvZChpbiBwcykuCisgKiBAcGFyYW0gIF9fVElNQ0xLX18gdGltZXIgaW5wdXQgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikuCisgKiBAcGFyYW0gIF9fQ0tEX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DTE9DS0RJVklTSU9OX0RJVjEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DTE9DS0RJVklTSU9OX0RJVjIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DTE9DS0RJVklTSU9OX0RJVjQKKyAqIEByZXR2YWwgbm9uZQorICovCisjZGVmaW5lIFRJTV9DQUxDX0RUUyhfX1RJTUNMS19fLCBfX0NLRF9fKSAgICAgICAgICAgICAgICAgIFwKKyAgKCgoX19DS0RfXykgPT0gTExfVElNX0NMT0NLRElWSVNJT05fRElWMSkgICAgICAgICAgICAgICAgXAorICAgICAgID8gKCh1aW50NjRfdCkxMDAwMDAwMDAwMDAwVSAvIChfX1RJTUNMS19fKSkgICAgICAgICBcCisgICA6ICgoX19DS0RfXykgPT0gTExfVElNX0NMT0NLRElWSVNJT05fRElWMikgICAgICAgICAgICAgIFwKKyAgICAgICA/ICgodWludDY0X3QpMTAwMDAwMDAwMDAwMFUgLyAoKF9fVElNQ0xLX18pID4+IDFVKSkgXAorICAgICAgIDogKCh1aW50NjRfdCkxMDAwMDAwMDAwMDAwVSAvICgoX19USU1DTEtfXykgPj4gMlUpKSkKKy8qKgorICogQH0KKyAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBUSU1fTExfRVNfSU5JVCBUSU0gRXhwb3J0ZWQgSW5pdCBzdHJ1Y3R1cmUKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgIFRJTSBUaW1lIEJhc2UgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50MTZfdCBQcmVzY2FsZXI7IC8qITwgU3BlY2lmaWVzIHRoZSBwcmVzY2FsZXIgdmFsdWUgdXNlZCB0byBkaXZpZGUgdGhlIFRJTQorICAgICAgICAgICAgICAgICAgICAgICAgIGNsb2NrLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBudW1iZXIgYmV0d2VlbgorICAgICAgICAgICAgICAgICAgICAgICAgIE1pbl9EYXRhPTB4MDAwMCBhbmQgTWF4X0RhdGE9MHhGRkZGLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeQorICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExMX1RJTV9TZXRQcmVzY2FsZXIoKS4qLworCisgIHVpbnQzMl90IENvdW50ZXJNb2RlOyAvKiE8IFNwZWNpZmllcyB0aGUgY291bnRlciBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fTExfRUNfQ09VTlRFUk1PREUuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0YXJ5IGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgTExfVElNX1NldENvdW50ZXJNb2RlKCkuKi8KKworICB1aW50MzJfdCBBdXRvcmVsb2FkOyAvKiE8IFNwZWNpZmllcyB0aGUgYXV0byByZWxvYWQgdmFsdWUgdG8gYmUgbG9hZGVkIGludG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGFjdGl2ZSBBdXRvLVJlbG9hZCBSZWdpc3RlciBhdCB0aGUgbmV4dCB1cGRhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbgorICAgICAgICAgICAgICAgICAgICAgICAgICBNaW5fRGF0YT0weDAwMDAgYW5kIE1heF9EYXRhPTB4RkZGRi4gU29tZSB0aW1lcgorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZXMgbWF5IHN1cHBvcnQgMzIgYml0cyBjb3VudGVycy4gSW4gdGhhdCBjYXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiAweDAwMDAgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkYuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdGFyeSBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgTExfVElNX1NldEF1dG9SZWxvYWQoKS4qLworCisgIHVpbnQzMl90IENsb2NrRGl2aXNpb247IC8qITwgU3BlY2lmaWVzIHRoZSBjbG9jayBkaXZpc2lvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9MTF9FQ19DTE9DS0RJVklTSU9OLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRhcnkgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExMX1RJTV9TZXRDbG9ja0RpdmlzaW9uKCkuKi8KKworICB1aW50MzJfdAorICAgICAgUmVwZXRpdGlvbkNvdW50ZXI7IC8qITwgU3BlY2lmaWVzIHRoZSByZXBldGl0aW9uIGNvdW50ZXIgdmFsdWUuIEVhY2ggdGltZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBSQ1IgZG93bmNvdW50ZXIgcmVhY2hlcyB6ZXJvLCBhbiB1cGRhdGUgZXZlbnQgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWQgYW5kIGNvdW50aW5nIHJlc3RhcnRzIGZyb20gdGhlIFJDUiB2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChOKS4gVGhpcyBtZWFucyBpbiBQV00gbW9kZSB0aGF0IChOKzEpIGNvcnJlc3BvbmRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG86CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gdGhlIG51bWJlciBvZiBQV00gcGVyaW9kcyBpbiBlZGdlLWFsaWduZWQgbW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHRoZSBudW1iZXIgb2YgaGFsZiBQV00gcGVyaW9kIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyLWFsaWduZWQgbW9kZSBHUCB0aW1lcnM6IHRoaXMgcGFyYW1ldGVyIG11c3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMCBhbmQgTWF4X0RhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkYuIEFkdmFuY2VkIHRpbWVyczogdGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAwMDAgYW5kIE1heF9EYXRhID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkYuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdGFyeSBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExMX1RJTV9TZXRSZXBldGl0aW9uQ291bnRlcigpLiovCit9IExMX1RJTV9Jbml0VHlwZURlZjsKKworLyoqCisgKiBAYnJpZWYgIFRJTSBPdXRwdXQgQ29tcGFyZSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSBkZWZpbml0aW9uLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQzMl90IE9DTW9kZTsgLyohPCBTcGVjaWZpZXMgdGhlIG91dHB1dCBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTExfRUNfT0NNT0RFLgorCisgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeQorICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExMX1RJTV9PQ19TZXRNb2RlKCkuKi8KKworICB1aW50MzJfdAorICAgICAgT0NTdGF0ZTsgLyohPCBTcGVjaWZpZXMgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBzdGF0ZS4KKyAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTExfRUNfT0NTVEFURS4KKworICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeQorICAgICAgICAgICAgICAgICAgZnVuY3Rpb25zCisgICAgICAgICAgICAgICAgICAgIEByZWYgTExfVElNX0NDX0VuYWJsZUNoYW5uZWwoKSBvciBAcmVmCisgICAgICAgICAgICAgICAgICBMTF9USU1fQ0NfRGlzYWJsZUNoYW5uZWwoKS4qLworCisgIHVpbnQzMl90CisgICAgICBPQ05TdGF0ZTsgLyohPCBTcGVjaWZpZXMgdGhlIFRJTSBjb21wbGVtZW50YXJ5IE91dHB1dCBDb21wYXJlIHN0YXRlLgorICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTExfRUNfT0NTVEFURS4KKworICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkKKyAgICAgICAgICAgICAgICAgICBmdW5jdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgIEByZWYgTExfVElNX0NDX0VuYWJsZUNoYW5uZWwoKSBvciBAcmVmCisgICAgICAgICAgICAgICAgICAgTExfVElNX0NDX0Rpc2FibGVDaGFubmVsKCkuKi8KKworICB1aW50MzJfdCBDb21wYXJlVmFsdWU7IC8qITwgU3BlY2lmaWVzIHRoZSBDb21wYXJlIHZhbHVlIHRvIGJlIGxvYWRlZCBpbnRvIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhcHR1cmUgQ29tcGFyZSBSZWdpc3Rlci4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YT0weDAwMDAgYW5kIE1heF9EYXRhPTB4RkZGRi4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdGFyeSBmdW5jdGlvbiBMTF9USU1fT0NfU2V0Q29tcGFyZUNIeCAoeD0xLi42KS4qLworCisgIHVpbnQzMl90IE9DUG9sYXJpdHk7IC8qITwgU3BlY2lmaWVzIHRoZSBvdXRwdXQgcG9sYXJpdHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fTExfRUNfT0NQT0xBUklUWS4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZworICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0YXJ5IGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBMTF9USU1fT0NfU2V0UG9sYXJpdHkoKS4qLworCisgIHVpbnQzMl90IE9DTlBvbGFyaXR5OyAvKiE8IFNwZWNpZmllcyB0aGUgY29tcGxlbWVudGFyeSBvdXRwdXQgcG9sYXJpdHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9MTF9FQ19PQ1BPTEFSSVRZLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdGFyeSBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExMX1RJTV9PQ19TZXRQb2xhcml0eSgpLiovCisKKyAgdWludDMyX3QgT0NJZGxlU3RhdGU7IC8qITwgU3BlY2lmaWVzIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgcGluIHN0YXRlIGR1cmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRsZSBzdGF0ZS4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX0xMX0VDX09DSURMRVNUQVRFLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdGFyeSBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExMX1RJTV9PQ19TZXRJZGxlU3RhdGUoKS4qLworCisgIHVpbnQzMl90IE9DTklkbGVTdGF0ZTsgLyohPCBTcGVjaWZpZXMgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBwaW4gc3RhdGUgZHVyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRsZSBzdGF0ZS4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9MTF9FQ19PQ0lETEVTVEFURS4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdGFyeSBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBMTF9USU1fT0NfU2V0SWRsZVN0YXRlKCkuKi8KK30gTExfVElNX09DX0luaXRUeXBlRGVmOworCisvKioKKyAqIEBicmllZiAgVElNIElucHV0IENhcHR1cmUgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQzMl90IElDUG9sYXJpdHk7IC8qITwgU3BlY2lmaWVzIHRoZSBhY3RpdmUgZWRnZSBvZiB0aGUgaW5wdXQgc2lnbmFsLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX0xMX0VDX0lDX1BPTEFSSVRZLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRhcnkgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExMX1RJTV9JQ19TZXRQb2xhcml0eSgpLiovCisKKyAgdWludDMyX3QgSUNBY3RpdmVJbnB1dDsgLyohPCBTcGVjaWZpZXMgdGhlIGlucHV0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX0xMX0VDX0FDVElWRUlOUFVULgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRhcnkgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExMX1RJTV9JQ19TZXRBY3RpdmVJbnB1dCgpLiovCisKKyAgdWludDMyX3QKKyAgICAgIElDUHJlc2NhbGVyOyAvKiE8IFNwZWNpZmllcyB0aGUgSW5wdXQgQ2FwdHVyZSBQcmVzY2FsZXIuCisgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9MTF9FQ19JQ1BTQy4KKworICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkKKyAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBMTF9USU1fSUNfU2V0UHJlc2NhbGVyKCkuKi8KKworICB1aW50MzJfdAorICAgICAgSUNGaWx0ZXI7IC8qITwgU3BlY2lmaWVzIHRoZSBpbnB1dCBjYXB0dXJlIGZpbHRlci4KKyAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0xMX0VDX0lDX0ZJTFRFUi4KKworICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkKKyAgICAgICAgICAgICAgICAgICBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgQHJlZiBMTF9USU1fSUNfU2V0RmlsdGVyKCkuKi8KK30gTExfVElNX0lDX0luaXRUeXBlRGVmOworCisvKioKKyAqIEBicmllZiAgVElNIEVuY29kZXIgaW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlIGRlZmluaXRpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDMyX3QgRW5jb2Rlck1vZGU7IC8qITwgU3BlY2lmaWVzIHRoZSBlbmNvZGVyIHJlc29sdXRpb24gKHgyIG9yIHg0KS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX0xMX0VDX0VOQ09ERVJNT0RFLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdGFyeSBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExMX1RJTV9TZXRFbmNvZGVyTW9kZSgpLiovCisKKyAgdWludDMyX3QgSUMxUG9sYXJpdHk7IC8qITwgU3BlY2lmaWVzIHRoZSBhY3RpdmUgZWRnZSBvZiBUSTEgaW5wdXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9MTF9FQ19JQ19QT0xBUklUWS4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRhcnkgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBMTF9USU1fSUNfU2V0UG9sYXJpdHkoKS4qLworCisgIHVpbnQzMl90IElDMUFjdGl2ZUlucHV0OyAvKiE8IFNwZWNpZmllcyB0aGUgVEkxIGlucHV0IHNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fTExfRUNfQUNUSVZFSU5QVVQuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0YXJ5IGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgTExfVElNX0lDX1NldEFjdGl2ZUlucHV0KCkuKi8KKworICB1aW50MzJfdAorICAgICAgSUMxUHJlc2NhbGVyOyAvKiE8IFNwZWNpZmllcyB0aGUgVEkxIGlucHV0IHByZXNjYWxlciB2YWx1ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9MTF9FQ19JQ1BTQy4KKworICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5CisgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBMTF9USU1fSUNfU2V0UHJlc2NhbGVyKCkuKi8KKworICB1aW50MzJfdAorICAgICAgSUMxRmlsdGVyOyAvKiE8IFNwZWNpZmllcyB0aGUgVEkxIGlucHV0IGZpbHRlci4KKyAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9MTF9FQ19JQ19GSUxURVIuCisKKyAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeQorICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgIEByZWYgTExfVElNX0lDX1NldEZpbHRlcigpLiovCisKKyAgdWludDMyX3QgSUMyUG9sYXJpdHk7IC8qITwgU3BlY2lmaWVzIHRoZSBhY3RpdmUgZWRnZSBvZiBUSTIgaW5wdXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX0xMX0VDX0lDX1BPTEFSSVRZLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0YXJ5IGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBMTF9USU1fSUNfU2V0UG9sYXJpdHkoKS4qLworCisgIHVpbnQzMl90IElDMkFjdGl2ZUlucHV0OyAvKiE8IFNwZWNpZmllcyB0aGUgVEkyIGlucHV0IHNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fTExfRUNfQUNUSVZFSU5QVVQuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0YXJ5IGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgTExfVElNX0lDX1NldEFjdGl2ZUlucHV0KCkuKi8KKworICB1aW50MzJfdAorICAgICAgSUMyUHJlc2NhbGVyOyAvKiE8IFNwZWNpZmllcyB0aGUgVEkyIGlucHV0IHByZXNjYWxlciB2YWx1ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9MTF9FQ19JQ1BTQy4KKworICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5CisgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBMTF9USU1fSUNfU2V0UHJlc2NhbGVyKCkuKi8KKworICB1aW50MzJfdAorICAgICAgSUMyRmlsdGVyOyAvKiE8IFNwZWNpZmllcyB0aGUgVEkyIGlucHV0IGZpbHRlci4KKyAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9MTF9FQ19JQ19GSUxURVIuCisKKyAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeQorICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgIEByZWYgTExfVElNX0lDX1NldEZpbHRlcigpLiovCisKK30gTExfVElNX0VOQ09ERVJfSW5pdFR5cGVEZWY7CisKKy8qKgorICogQGJyaWVmICBUSU0gSGFsbCBzZW5zb3IgaW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlIGRlZmluaXRpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDMyX3QgSUMxUG9sYXJpdHk7IC8qITwgU3BlY2lmaWVzIHRoZSBhY3RpdmUgZWRnZSBvZiBUSTEgaW5wdXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9MTF9FQ19JQ19QT0xBUklUWS4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRhcnkgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBMTF9USU1fSUNfU2V0UG9sYXJpdHkoKS4qLworCisgIHVpbnQzMl90IElDMVByZXNjYWxlcjsgLyohPCBTcGVjaWZpZXMgdGhlIFRJMSBpbnB1dCBwcmVzY2FsZXIgdmFsdWUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVzY2FsZXIgbXVzdCBiZSBzZXQgdG8gZ2V0IGEgbWF4aW11bSBjb3VudGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyaW9kIGxvbmdlciB0aGFuIHRoZSB0aW1lIGludGVydmFsIGJldHdlZW4gMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNlY3V0aXZlIGNoYW5nZXMgb24gdGhlIEhhbGwgaW5wdXRzLiBUaGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0xMX0VDX0lDUFNDLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0YXJ5IGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExMX1RJTV9JQ19TZXRQcmVzY2FsZXIoKS4qLworCisgIHVpbnQzMl90IElDMUZpbHRlcjsgLyohPCBTcGVjaWZpZXMgdGhlIFRJMSBpbnB1dCBmaWx0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBUSU1fTExfRUNfSUNfRklMVEVSLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeQorICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExMX1RJTV9JQ19TZXRGaWx0ZXIoKS4qLworCisgIHVpbnQzMl90IENvbW11dGF0aW9uRGVsYXk7IC8qITwgU3BlY2lmaWVzIHRoZSBjb21wYXJlIHZhbHVlIHRvIGJlIGxvYWRlZCBpbnRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBDYXB0dXJlIENvbXBhcmUgUmVnaXN0ZXIuIEEgcG9zaXRpdmUgcHVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFRSR08gZXZlbnQpIGlzIGdlbmVyYXRlZCB3aXRoIGEgcHJvZ3JhbW1hYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5IGV2ZXJ5IHRpbWUgYSBjaGFuZ2Ugb2NjdXJzIG9uIHRoZSBIYWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0cy4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgbnVtYmVyIGJldHdlZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWluX0RhdGEgPSAweDAwMDAgYW5kIE1heF9EYXRhID0gMHhGRkZGLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRhcnkgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExMX1RJTV9PQ19TZXRDb21wYXJlQ0gyKCkuKi8KK30gTExfVElNX0hBTExTRU5TT1JfSW5pdFR5cGVEZWY7CisKKy8qKgorICogQGJyaWVmICBCRFRSIChCcmVhayBhbmQgRGVhZCBUaW1lKSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQzMl90IE9TU1JTdGF0ZTsgLyohPCBTcGVjaWZpZXMgdGhlIE9mZi1TdGF0ZSBzZWxlY3Rpb24gdXNlZCBpbiBSdW4gbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0xMX0VDX09TU1IKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBMTF9USU1fU2V0T2ZmU3RhdGVzKCkKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgVGhpcyBiaXQtZmllbGQgY2Fubm90IGJlIG1vZGlmaWVkIGFzIGxvbmcgYXMKKyAgICAgICAgICAgICAgICAgICAgICAgICBMT0NLIGxldmVsIDIgaGFzIGJlZW4gcHJvZ3JhbW1lZC4gKi8KKworICB1aW50MzJfdCBPU1NJU3RhdGU7IC8qITwgU3BlY2lmaWVzIHRoZSBPZmYtU3RhdGUgdXNlZCBpbiBJZGxlIHN0YXRlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTExfRUNfT1NTSQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeQorICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExMX1RJTV9TZXRPZmZTdGF0ZXMoKQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBUaGlzIGJpdC1maWVsZCBjYW5ub3QgYmUgbW9kaWZpZWQgYXMgbG9uZyBhcworICAgICAgICAgICAgICAgICAgICAgICAgIExPQ0sgbGV2ZWwgMiBoYXMgYmVlbiBwcm9ncmFtbWVkLiAqLworCisgIHVpbnQzMl90CisgICAgICBMb2NrTGV2ZWw7IC8qITwgU3BlY2lmaWVzIHRoZSBMT0NLIGxldmVsIHBhcmFtZXRlcnMuCisgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTExfRUNfTE9DS0xFVkVMCisKKyAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBUaGUgTE9DSyBiaXRzIGNhbiBiZSB3cml0dGVuIG9ubHkgb25jZSBhZnRlciB0aGUKKyAgICAgICAgICAgICAgICAgICAgcmVzZXQuIE9uY2UgdGhlIFRJTXhfQkRUUiByZWdpc3RlciBoYXMgYmVlbiB3cml0dGVuLCB0aGVpcgorICAgICAgICAgICAgICAgICAgICBjb250ZW50IGlzIGZyb3plbiB1bnRpbCB0aGUgbmV4dCByZXNldC4qLworCisgIHVpbnQ4X3QgRGVhZFRpbWU7IC8qITwgU3BlY2lmaWVzIHRoZSBkZWxheSB0aW1lIGJldHdlZW4gdGhlIHN3aXRjaGluZy1vZmYgYW5kCisgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzd2l0Y2hpbmctb24gb2YgdGhlIG91dHB1dHMuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhCisgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMCBhbmQgTWF4X0RhdGEgPSAweEZGLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkKKyAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExMX1RJTV9PQ19TZXREZWFkVGltZSgpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBUaGlzIGJpdC1maWVsZCBjYW4gbm90IGJlIG1vZGlmaWVkIGFzIGxvbmcgYXMKKyAgICAgICAgICAgICAgICAgICAgICAgTE9DSyBsZXZlbCAxLCAyIG9yIDMgaGFzIGJlZW4gcHJvZ3JhbW1lZC4gKi8KKworICB1aW50MTZfdCBCcmVha1N0YXRlOyAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBUSU0gQnJlYWsgaW5wdXQgaXMgZW5hYmxlZCBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICBub3QuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX0xMX0VDX0JSRUFLX0VOQUJMRQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRhcnkgZnVuY3Rpb25zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBMTF9USU1fRW5hYmxlQlJLKCkgb3IgQHJlZiBMTF9USU1fRGlzYWJsZUJSSygpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBUaGlzIGJpdC1maWVsZCBjYW4gbm90IGJlIG1vZGlmaWVkIGFzIGxvbmcgYXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTE9DSyBsZXZlbCAxIGhhcyBiZWVuIHByb2dyYW1tZWQuICovCisKKyAgdWludDMyX3QgQnJlYWtQb2xhcml0eTsgLyohPCBTcGVjaWZpZXMgdGhlIFRJTSBCcmVhayBJbnB1dCBwaW4gcG9sYXJpdHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fTExfRUNfQlJFQUtfUE9MQVJJVFkKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0YXJ5IGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBMTF9USU1fQ29uZmlnQlJLKCkKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIFRoaXMgYml0LWZpZWxkIGNhbiBub3QgYmUgbW9kaWZpZWQgYXMgbG9uZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcyBMT0NLIGxldmVsIDEgaGFzIGJlZW4gcHJvZ3JhbW1lZC4gKi8KKworICB1aW50MzJfdCBCcmVha0ZpbHRlcjsgLyohPCBTcGVjaWZpZXMgdGhlIFRJTSBCcmVhayBGaWx0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9MTF9FQ19CUkVBS19GSUxURVIKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRhcnkgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBMTF9USU1fQ29uZmlnQlJLKCkKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBUaGlzIGJpdC1maWVsZCBjYW4gbm90IGJlIG1vZGlmaWVkIGFzIGxvbmcgYXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExPQ0sgbGV2ZWwgMSBoYXMgYmVlbiBwcm9ncmFtbWVkLiAqLworCisgIHVpbnQzMl90IEJyZWFrQUZNb2RlOyAvKiE8IFNwZWNpZmllcyB0aGUgYWx0ZXJuYXRlIGZ1bmN0aW9uIG1vZGUgb2YgdGhlIGJyZWFrCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX0xMX0VDX0JSRUFLX0FGTU9ERQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0YXJ5IGZ1bmN0aW9ucworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgTExfVElNX0NvbmZpZ0JSSygpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBCaWRpcmVjdGlvbmFsIGJyZWFrIGlucHV0IGlzIG9ubHkgc3VwcG9ydGVkIGJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICBhZHZhbmNlZCB0aW1lcnMgaW5zdGFuY2VzLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgVGhpcyBiaXQtZmllbGQgY2FuIG5vdCBiZSBtb2RpZmllZCBhcyBsb25nIGFzCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0NLIGxldmVsIDEgaGFzIGJlZW4gcHJvZ3JhbW1lZC4gKi8KKworICB1aW50MzJfdAorICAgICAgQnJlYWsyU3RhdGU7IC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIFRJTSBCcmVhazIgaW5wdXQgaXMgZW5hYmxlZCBvcgorICAgICAgICAgICAgICAgICAgICAgIG5vdC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgIFRJTV9MTF9FQ19CUkVBSzJfRU5BQkxFCisKKyAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5CisgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25zCisgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExMX1RJTV9FbmFibGVCUksyKCkgb3IgQHJlZiBMTF9USU1fRGlzYWJsZUJSSzIoKQorCisgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBUaGlzIGJpdC1maWVsZCBjYW4gbm90IGJlIG1vZGlmaWVkIGFzIGxvbmcgYXMgTE9DSworICAgICAgICAgICAgICAgICAgICAgIGxldmVsIDEgaGFzIGJlZW4gcHJvZ3JhbW1lZC4gKi8KKworICB1aW50MzJfdCBCcmVhazJQb2xhcml0eTsgLyohPCBTcGVjaWZpZXMgdGhlIFRJTSBCcmVhazIgSW5wdXQgcGluIHBvbGFyaXR5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9MTF9FQ19CUkVBSzJfUE9MQVJJVFkKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdGFyeSBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgTExfVElNX0NvbmZpZ0JSSzIoKQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgVGhpcyBiaXQtZmllbGQgY2FuIG5vdCBiZSBtb2RpZmllZCBhcyBsb25nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcyBMT0NLIGxldmVsIDEgaGFzIGJlZW4gcHJvZ3JhbW1lZC4gKi8KKworICB1aW50MzJfdCBCcmVhazJGaWx0ZXI7IC8qITwgU3BlY2lmaWVzIHRoZSBUSU0gQnJlYWsyIEZpbHRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9MTF9FQ19CUkVBSzJfRklMVEVSCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdGFyeSBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExMX1RJTV9Db25maWdCUksyKCkKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBUaGlzIGJpdC1maWVsZCBjYW4gbm90IGJlIG1vZGlmaWVkIGFzIGxvbmcgYXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0NLIGxldmVsIDEgaGFzIGJlZW4gcHJvZ3JhbW1lZC4gKi8KKworICB1aW50MzJfdCBCcmVhazJBRk1vZGU7IC8qITwgU3BlY2lmaWVzIHRoZSBhbHRlcm5hdGUgZnVuY3Rpb24gbW9kZSBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazIgaW5wdXQuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fTExfRUNfQlJFQUsyX0FGTU9ERQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRhcnkgZnVuY3Rpb25zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgTExfVElNX0NvbmZpZ0JSSzIoKQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIEJpZGlyZWN0aW9uYWwgYnJlYWsgaW5wdXQgaXMgb25seSBzdXBwb3J0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSBhZHZhbmNlZCB0aW1lcnMgaW5zdGFuY2VzLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIFRoaXMgYml0LWZpZWxkIGNhbiBub3QgYmUgbW9kaWZpZWQgYXMgbG9uZyBhcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPQ0sgbGV2ZWwgMSBoYXMgYmVlbiBwcm9ncmFtbWVkLiAqLworCisgIHVpbnQzMl90IEF1dG9tYXRpY091dHB1dDsgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgVElNIEF1dG9tYXRpYyBPdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlIGlzIGVuYWJsZWQgb3Igbm90LiBUaGlzIHBhcmFtZXRlciBjYW4gYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHZhbHVlIG9mIEByZWYgVElNX0xMX0VDX0FVVE9NQVRJQ09VVFBVVF9FTkFCTEUKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdGFyeSBmdW5jdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgTExfVElNX0VuYWJsZUF1dG9tYXRpY091dHB1dCgpIG9yIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTF9USU1fRGlzYWJsZUF1dG9tYXRpY091dHB1dCgpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIFRoaXMgYml0LWZpZWxkIGNhbiBub3QgYmUgbW9kaWZpZWQgYXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGFzIExPQ0sgbGV2ZWwgMSBoYXMgYmVlbiBwcm9ncmFtbWVkLiAqLworfSBMTF9USU1fQkRUUl9Jbml0VHlwZURlZjsKKworLyoqCisgKiBAfQorICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FeHBvcnRlZF9Db25zdGFudHMgVElNIEV4cG9ydGVkIENvbnN0YW50cworICogQHsKKyAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19HRVRfRkxBRyBHZXQgRmxhZ3MgRGVmaW5lcworICogQGJyaWVmICAgIEZsYWdzIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9USU1fUmVhZFJlZyBmdW5jdGlvbi4KKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfVElNX1NSX1VJRiBUSU1fU1JfVUlGICAgICAvKiE8IFVwZGF0ZSBpbnRlcnJ1cHQgZmxhZyAqLworI2RlZmluZSBMTF9USU1fU1JfQ0MxSUYgVElNX1NSX0NDMUlGIC8qITwgQ2FwdHVyZS9jb21wYXJlIDEgaW50ZXJydXB0IGZsYWcgKi8KKyNkZWZpbmUgTExfVElNX1NSX0NDMklGIFRJTV9TUl9DQzJJRiAvKiE8IENhcHR1cmUvY29tcGFyZSAyIGludGVycnVwdCBmbGFnICovCisjZGVmaW5lIExMX1RJTV9TUl9DQzNJRiBUSU1fU1JfQ0MzSUYgLyohPCBDYXB0dXJlL2NvbXBhcmUgMyBpbnRlcnJ1cHQgZmxhZyAqLworI2RlZmluZSBMTF9USU1fU1JfQ0M0SUYgVElNX1NSX0NDNElGIC8qITwgQ2FwdHVyZS9jb21wYXJlIDQgaW50ZXJydXB0IGZsYWcgKi8KKyNkZWZpbmUgTExfVElNX1NSX0NDNUlGIFRJTV9TUl9DQzVJRiAvKiE8IENhcHR1cmUvY29tcGFyZSA1IGludGVycnVwdCBmbGFnICovCisjZGVmaW5lIExMX1RJTV9TUl9DQzZJRiBUSU1fU1JfQ0M2SUYgLyohPCBDYXB0dXJlL2NvbXBhcmUgNiBpbnRlcnJ1cHQgZmxhZyAqLworI2RlZmluZSBMTF9USU1fU1JfQ09NSUYgVElNX1NSX0NPTUlGIC8qITwgQ09NIGludGVycnVwdCBmbGFnICovCisjZGVmaW5lIExMX1RJTV9TUl9USUYgVElNX1NSX1RJRiAgICAgLyohPCBUcmlnZ2VyIGludGVycnVwdCBmbGFnICovCisjZGVmaW5lIExMX1RJTV9TUl9CSUYgVElNX1NSX0JJRiAgICAgLyohPCBCcmVhayBpbnRlcnJ1cHQgZmxhZyAqLworI2RlZmluZSBMTF9USU1fU1JfQjJJRiBUSU1fU1JfQjJJRiAgIC8qITwgU2Vjb25kIGJyZWFrIGludGVycnVwdCBmbGFnICovCisjZGVmaW5lIExMX1RJTV9TUl9DQzFPRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUSU1fU1JfQ0MxT0YgLyohPCBDYXB0dXJlL0NvbXBhcmUgMSBvdmVyY2FwdHVyZSBmbGFnIFwKKyAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9USU1fU1JfQ0MyT0YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVElNX1NSX0NDMk9GIC8qITwgQ2FwdHVyZS9Db21wYXJlIDIgb3ZlcmNhcHR1cmUgZmxhZyBcCisgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfVElNX1NSX0NDM09GICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRJTV9TUl9DQzNPRiAvKiE8IENhcHR1cmUvQ29tcGFyZSAzIG92ZXJjYXB0dXJlIGZsYWcgXAorICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX1RJTV9TUl9DQzRPRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVElNX1NSX0NDNE9GICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENhcHR1cmUvQ29tcGFyZSA0IG92ZXJjYXB0dXJlIGZsYWcgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9USU1fU1JfU0JJRiBUSU1fU1JfU0JJRiAgIC8qITwgU3lzdGVtIEJyZWFrIGludGVycnVwdCBmbGFnICAqLworI2RlZmluZSBMTF9USU1fU1JfSURYRiBUSU1fU1JfSURYRiAgIC8qITwgSW5kZXggaW50ZXJydXB0IGZsYWcgICovCisjZGVmaW5lIExMX1RJTV9TUl9ESVJGIFRJTV9TUl9ESVJGICAgLyohPCBEaXJlY3Rpb24gQ2hhbmdlIGludGVycnVwdCBmbGFnICAqLworI2RlZmluZSBMTF9USU1fU1JfSUVSUkYgVElNX1NSX0lFUlJGIC8qITwgSW5kZXggRXJyb3IgZmxhZyAgKi8KKyNkZWZpbmUgTExfVElNX1NSX1RFUlJGIFRJTV9TUl9URVJSRiAvKiE8IFRyYW5zaXRpb24gRXJyb3IgZmxhZyAgKi8KKy8qKgorICogQH0KKyAqLworCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19CUkVBS19FTkFCTEUgQnJlYWsgRW5hYmxlCisgKiBAeworICovCisjZGVmaW5lIExMX1RJTV9CUkVBS19ESVNBQkxFIDB4MDAwMDAwMDBVIC8qITwgQnJlYWsgZnVuY3Rpb24gZGlzYWJsZWQgKi8KKyNkZWZpbmUgTExfVElNX0JSRUFLX0VOQUJMRSBUSU1fQkRUUl9CS0UgLyohPCBCcmVhayBmdW5jdGlvbiBlbmFibGVkICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfQlJFQUsyX0VOQUJMRSBCcmVhazIgRW5hYmxlCisgKiBAeworICovCisjZGVmaW5lIExMX1RJTV9CUkVBSzJfRElTQUJMRSAweDAwMDAwMDAwVSAgLyohPCBCcmVhazIgZnVuY3Rpb24gZGlzYWJsZWQgKi8KKyNkZWZpbmUgTExfVElNX0JSRUFLMl9FTkFCTEUgVElNX0JEVFJfQksyRSAvKiE8IEJyZWFrMiBmdW5jdGlvbiBlbmFibGVkICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfQVVUT01BVElDT1VUUFVUX0VOQUJMRSBBdXRvbWF0aWMgb3V0cHV0IGVuYWJsZQorICogQHsKKyAqLworI2RlZmluZSBMTF9USU1fQVVUT01BVElDT1VUUFVUX0RJU0FCTEUgXAorICAweDAwMDAwMDAwVSAvKiE8IE1PRSBjYW4gYmUgc2V0IG9ubHkgYnkgc29mdHdhcmUgKi8KKyNkZWZpbmUgTExfVElNX0FVVE9NQVRJQ09VVFBVVF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRJTV9CRFRSX0FPRSAvKiE8IE1PRSBjYW4gYmUgc2V0IGJ5IHNvZnR3YXJlIG9yIGF1dG9tYXRpY2FsbHkgYXQgdGhlIG5leHQgXAorICAgICAgICAgICAgICAgICAgdXBkYXRlIGV2ZW50ICovCisvKioKKyAqIEB9CisgKi8KKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfSVQgSVQgRGVmaW5lcworICogQGJyaWVmICAgIElUIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9USU1fUmVhZFJlZyBhbmQKKyAqIExMX1RJTV9Xcml0ZVJlZyBmdW5jdGlvbnMuCisgKiBAeworICovCisjZGVmaW5lIExMX1RJTV9ESUVSX1VJRSBUSU1fRElFUl9VSUUgLyohPCBVcGRhdGUgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBMTF9USU1fRElFUl9DQzFJRSBcCisgIFRJTV9ESUVSX0NDMUlFIC8qITwgQ2FwdHVyZS9jb21wYXJlIDEgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBMTF9USU1fRElFUl9DQzJJRSBcCisgIFRJTV9ESUVSX0NDMklFIC8qITwgQ2FwdHVyZS9jb21wYXJlIDIgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBMTF9USU1fRElFUl9DQzNJRSBcCisgIFRJTV9ESUVSX0NDM0lFIC8qITwgQ2FwdHVyZS9jb21wYXJlIDMgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBMTF9USU1fRElFUl9DQzRJRSBcCisgIFRJTV9ESUVSX0NDNElFIC8qITwgQ2FwdHVyZS9jb21wYXJlIDQgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBMTF9USU1fRElFUl9DT01JRSBUSU1fRElFUl9DT01JRSAvKiE8IENPTSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX1RJTV9ESUVSX1RJRSBUSU1fRElFUl9USUUgICAgIC8qITwgVHJpZ2dlciBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX1RJTV9ESUVSX0JJRSBUSU1fRElFUl9CSUUgICAgIC8qITwgQnJlYWsgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBMTF9USU1fRElFUl9JRFhJRSBUSU1fRElFUl9JRFhJRSAvKiE8IEluZGV4IGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgTExfVElNX0RJRVJfRElSSUUgXAorICBUSU1fRElFUl9ESVJJRSAvKiE8IERpcmVjdGlvbiBDaGFuZ2UgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBMTF9USU1fRElFUl9JRVJSSUUgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVElNX0RJRVJfSUVSUklFIC8qITwgSW5kZXggRXJyb3IgaW50ZXJydXB0IGVuYWJsZSBcCisgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfVElNX0RJRVJfVEVSUklFIFwKKyAgVElNX0RJRVJfVEVSUklFIC8qITwgVHJhbnNpdGlvbiBFcnJvciBpbnRlcnJ1cHQgZW5hYmxlICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfVVBEQVRFU09VUkNFIFVwZGF0ZSBTb3VyY2UKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfVElNX1VQREFURVNPVVJDRV9SRUdVTEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMDAwMDBVIC8qITwgQ291bnRlciBvdmVyZmxvdy91bmRlcmZsb3csIFNldHRpbmcgdGhlIFVHIGJpdCBvciBVcGRhdGUgXAorICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uIHRocm91Z2ggdGhlIHNsYXZlIG1vZGUgY29udHJvbGxlciBnZW5lcmF0ZXMgYW4gIFwKKyAgICAgICAgICAgICAgICAgdXBkYXRlIHJlcXVlc3QgKi8KKyNkZWZpbmUgTExfVElNX1VQREFURVNPVVJDRV9DT1VOVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRJTV9DUjFfVVJTIC8qITwgT25seSBjb3VudGVyIG92ZXJmbG93L3VuZGVyZmxvdyBnZW5lcmF0ZXMgYW4gdXBkYXRlIHJlcXVlc3QgXAorICAgICAgICAgICAgICAgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19PTkVQVUxTRU1PREUgT25lIFB1bHNlIE1vZGUKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfVElNX09ORVBVTFNFTU9ERV9TSU5HTEUgXAorICBUSU1fQ1IxX09QTSAvKiE8IENvdW50ZXIgc3RvcHMgY291bnRpbmcgYXQgdGhlIG5leHQgdXBkYXRlIGV2ZW50ICovCisjZGVmaW5lIExMX1RJTV9PTkVQVUxTRU1PREVfUkVQRVRJVElWRSBcCisgIDB4MDAwMDAwMDBVIC8qITwgQ291bnRlciBpcyBub3Qgc3RvcHBlZCBhdCB1cGRhdGUgZXZlbnQgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19DT1VOVEVSTU9ERSBDb3VudGVyIE1vZGUKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfVElNX0NPVU5URVJNT0RFX1VQIDB4MDAwMDAwMDBVIC8qITwgQ291bnRlciB1c2VkIGFzIHVwY291bnRlciAqLworI2RlZmluZSBMTF9USU1fQ09VTlRFUk1PREVfRE9XTiAgICAgICAgICAgICAgICBcCisgIFRJTV9DUjFfRElSIC8qITwgQ291bnRlciB1c2VkIGFzIGRvd25jb3VudGVyIFwKKyAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX1RJTV9DT1VOVEVSTU9ERV9DRU5URVJfRE9XTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUSU1fQ1IxX0NNU18wIC8qITwgVGhlIGNvdW50ZXIgY291bnRzIHVwIGFuZCBkb3duIGFsdGVybmF0aXZlbHkuIE91dHB1dCAgIFwKKyAgICAgICAgICAgICAgICAgICBjb21wYXJlIGludGVycnVwdCBmbGFncyBvZiBvdXRwdXQgY2hhbm5lbHMgIGFyZSBzZXQgb25seSBcCisgICAgICAgICAgICAgICAgICAgd2hlbiB0aGUgY291bnRlciBpcyBjb3VudGluZyBkb3duLiAqLworI2RlZmluZSBMTF9USU1fQ09VTlRFUk1PREVfQ0VOVEVSX1VQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVElNX0NSMV9DTVNfMSAvKiE8IFRoZSBjb3VudGVyIGNvdW50cyB1cCBhbmQgZG93biBhbHRlcm5hdGl2ZWx5LiBPdXRwdXQgICBcCisgICAgICAgICAgICAgICAgICAgY29tcGFyZSBpbnRlcnJ1cHQgZmxhZ3Mgb2Ygb3V0cHV0IGNoYW5uZWxzICBhcmUgc2V0IG9ubHkgXAorICAgICAgICAgICAgICAgICAgIHdoZW4gdGhlIGNvdW50ZXIgaXMgY291bnRpbmcgdXAgKi8KKyNkZWZpbmUgTExfVElNX0NPVU5URVJNT0RFX0NFTlRFUl9VUF9ET1dOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRJTV9DUjFfQ01TIC8qITwgVGhlIGNvdW50ZXIgY291bnRzIHVwIGFuZCBkb3duIGFsdGVybmF0aXZlbHkuIE91dHB1dCAgICAgICAgXAorICAgICAgICAgICAgICAgICBjb21wYXJlIGludGVycnVwdCBmbGFncyBvZiBvdXRwdXQgY2hhbm5lbHMgIGFyZSBzZXQgb25seSB3aGVuIFwKKyAgICAgICAgICAgICAgICAgdGhlIGNvdW50ZXIgaXMgY291bnRpbmcgdXAgb3IgZG93bi4gKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19DTE9DS0RJVklTSU9OIENsb2NrIERpdmlzaW9uCisgKiBAeworICovCisjZGVmaW5lIExMX1RJTV9DTE9DS0RJVklTSU9OX0RJVjEgMHgwMDAwMDAwMFUgICAvKiE8IHREVFM9dENLX0lOVCAqLworI2RlZmluZSBMTF9USU1fQ0xPQ0tESVZJU0lPTl9ESVYyIFRJTV9DUjFfQ0tEXzAgLyohPCB0RFRTPTIqdENLX0lOVCAqLworI2RlZmluZSBMTF9USU1fQ0xPQ0tESVZJU0lPTl9ESVY0IFRJTV9DUjFfQ0tEXzEgLyohPCB0RFRTPTQqdENLX0lOVCAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0NPVU5URVJESVJFQ1RJT04gQ291bnRlciBEaXJlY3Rpb24KKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfVElNX0NPVU5URVJESVJFQ1RJT05fVVAgMHgwMDAwMDAwMFUgLyohPCBUaW1lciBjb3VudGVyIGNvdW50cyB1cCAqLworI2RlZmluZSBMTF9USU1fQ09VTlRFUkRJUkVDVElPTl9ET1dOIFwKKyAgVElNX0NSMV9ESVIgLyohPCBUaW1lciBjb3VudGVyIGNvdW50cyBkb3duICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfQ0NVUERBVEVTT1VSQ0UgQ2FwdHVyZSBDb21wYXJlICBVcGRhdGUgU291cmNlCisgKiBAeworICovCisjZGVmaW5lIExMX1RJTV9DQ1VQREFURVNPVVJDRV9DT01HX09OTFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMDAwMDBVIC8qITwgQ2FwdHVyZS9jb21wYXJlIGNvbnRyb2wgYml0cyBhcmUgdXBkYXRlZCBieSBzZXR0aW5nIHRoZSBcCisgICAgICAgICAgICAgICAgIENPTUcgYml0IG9ubHkgKi8KKyNkZWZpbmUgTExfVElNX0NDVVBEQVRFU09VUkNFX0NPTUdfQU5EX1RSR0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRJTV9DUjJfQ0NVUyAvKiE8IENhcHR1cmUvY29tcGFyZSBjb250cm9sIGJpdHMgYXJlIHVwZGF0ZWQgYnkgc2V0dGluZyB0aGUgXAorICAgICAgICAgICAgICAgICAgQ09NRyBiaXQgb3Igd2hlbiBhIHJpc2luZyBlZGdlIG9jY3VycyBvbiB0cmlnZ2VyIGlucHV0ICAgIFwKKyAgICAgICAgICAgICAgICAgIChUUkdJKSAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0NDRE1BUkVRVUVTVCBDYXB0dXJlIENvbXBhcmUgRE1BIFJlcXVlc3QKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfVElNX0NDRE1BUkVRVUVTVF9DQyBcCisgIDB4MDAwMDAwMDBVIC8qITwgQ0N4IERNQSByZXF1ZXN0IHNlbnQgd2hlbiBDQ3ggZXZlbnQgb2NjdXJzICovCisjZGVmaW5lIExMX1RJTV9DQ0RNQVJFUVVFU1RfVVBEQVRFIFwKKyAgVElNX0NSMl9DQ0RTIC8qITwgQ0N4IERNQSByZXF1ZXN0cyBzZW50IHdoZW4gdXBkYXRlIGV2ZW50IG9jY3VycyAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0xPQ0tMRVZFTCBMb2NrIExldmVsCisgKiBAeworICovCisjZGVmaW5lIExMX1RJTV9MT0NLTEVWRUxfT0ZGIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBMT0NLIE9GRiAtIE5vIGJpdCBpcyB3cml0ZSBwcm90ZWN0ZWQgKi8KKyNkZWZpbmUgTExfVElNX0xPQ0tMRVZFTF8xIFRJTV9CRFRSX0xPQ0tfMCAvKiE8IExPQ0sgTGV2ZWwgMSAqLworI2RlZmluZSBMTF9USU1fTE9DS0xFVkVMXzIgVElNX0JEVFJfTE9DS18xIC8qITwgTE9DSyBMZXZlbCAyICovCisjZGVmaW5lIExMX1RJTV9MT0NLTEVWRUxfMyBUSU1fQkRUUl9MT0NLICAgLyohPCBMT0NLIExldmVsIDMgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19DSEFOTkVMIENoYW5uZWwKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfVElNX0NIQU5ORUxfQ0gxIFRJTV9DQ0VSX0NDMUUgLyohPCBUaW1lciBpbnB1dC9vdXRwdXQgY2hhbm5lbCAxICovCisjZGVmaW5lIExMX1RJTV9DSEFOTkVMX0NIMU4gXAorICBUSU1fQ0NFUl9DQzFORSAvKiE8IFRpbWVyIGNvbXBsZW1lbnRhcnkgb3V0cHV0IGNoYW5uZWwgMSAqLworI2RlZmluZSBMTF9USU1fQ0hBTk5FTF9DSDIgVElNX0NDRVJfQ0MyRSAvKiE8IFRpbWVyIGlucHV0L291dHB1dCBjaGFubmVsIDIgKi8KKyNkZWZpbmUgTExfVElNX0NIQU5ORUxfQ0gyTiBcCisgIFRJTV9DQ0VSX0NDMk5FIC8qITwgVGltZXIgY29tcGxlbWVudGFyeSBvdXRwdXQgY2hhbm5lbCAyICovCisjZGVmaW5lIExMX1RJTV9DSEFOTkVMX0NIMyBUSU1fQ0NFUl9DQzNFIC8qITwgVGltZXIgaW5wdXQvb3V0cHV0IGNoYW5uZWwgMyAqLworI2RlZmluZSBMTF9USU1fQ0hBTk5FTF9DSDNOIFwKKyAgVElNX0NDRVJfQ0MzTkUgLyohPCBUaW1lciBjb21wbGVtZW50YXJ5IG91dHB1dCBjaGFubmVsIDMgKi8KKyNkZWZpbmUgTExfVElNX0NIQU5ORUxfQ0g0IFRJTV9DQ0VSX0NDNEUgLyohPCBUaW1lciBpbnB1dC9vdXRwdXQgY2hhbm5lbCA0ICovCisjZGVmaW5lIExMX1RJTV9DSEFOTkVMX0NINE4gXAorICBUSU1fQ0NFUl9DQzRORSAvKiE8IFRpbWVyIGNvbXBsZW1lbnRhcnkgb3V0cHV0IGNoYW5uZWwgNCAqLworI2RlZmluZSBMTF9USU1fQ0hBTk5FTF9DSDUgVElNX0NDRVJfQ0M1RSAvKiE8IFRpbWVyIG91dHB1dCBjaGFubmVsIDUgKi8KKyNkZWZpbmUgTExfVElNX0NIQU5ORUxfQ0g2IFRJTV9DQ0VSX0NDNkUgLyohPCBUaW1lciBvdXRwdXQgY2hhbm5lbCA2ICovCisvKioKKyAqIEB9CisgKi8KKworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBUSU1fTExfRUNfT0NTVEFURSBPdXRwdXQgQ29uZmlndXJhdGlvbiBTdGF0ZQorICogQHsKKyAqLworI2RlZmluZSBMTF9USU1fT0NTVEFURV9ESVNBQkxFIDB4MDAwMDAwMDBVIC8qITwgT0N4IGlzIG5vdCBhY3RpdmUgKi8KKyNkZWZpbmUgTExfVElNX09DU1RBVEVfRU5BQkxFIFwKKyAgVElNX0NDRVJfQ0MxRSAvKiE8IE9DeCBzaWduYWwgaXMgb3V0cHV0IG9uIHRoZSBjb3JyZXNwb25kaW5nIG91dHB1dCBwaW4gKi8KKy8qKgorICogQH0KKyAqLworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKiogTGVnYWN5IGRlZmluaXRpb25zIGZvciBjb21wYXRpYmlsaXR5IHB1cnBvc2UKK0Bjb25kIDAKKyAgKi8KKyNkZWZpbmUgTExfVElNX09DTU9ERV9BU1NZTUVUUklDX1BXTTEgTExfVElNX09DTU9ERV9BU1lNTUVUUklDX1BXTTEKKyNkZWZpbmUgTExfVElNX09DTU9ERV9BU1NZTUVUUklDX1BXTTIgTExfVElNX09DTU9ERV9BU1lNTUVUUklDX1BXTTIKKy8qKgorQGVuZGNvbmQKKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfT0NNT0RFIE91dHB1dCBDb25maWd1cmF0aW9uIE1vZGUKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfVElNX09DTU9ERV9GUk9aRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMDAwMDBVIC8qITxUaGUgY29tcGFyaXNvbiBiZXR3ZWVuIHRoZSBvdXRwdXQgY29tcGFyZSByZWdpc3RlciBUSU14X0NDUnkgXAorICAgICAgICAgICAgICAgICBhbmQgdGhlIGNvdW50ZXIgVElNeF9DTlQgaGFzIG5vIGVmZmVjdCBvbiB0aGUgb3V0cHV0IGNoYW5uZWwgIFwKKyAgICAgICAgICAgICAgICAgbGV2ZWwgKi8KKyNkZWZpbmUgTExfVElNX09DTU9ERV9BQ1RJVkUgXAorICBUSU1fQ0NNUjFfT0MxTV8wIC8qITxPQ3lSRUYgaXMgZm9yY2VkIGhpZ2ggb24gY29tcGFyZSBtYXRjaCovCisjZGVmaW5lIExMX1RJTV9PQ01PREVfSU5BQ1RJVkUgXAorICBUSU1fQ0NNUjFfT0MxTV8xIC8qITxPQ3lSRUYgaXMgZm9yY2VkIGxvdyBvbiBjb21wYXJlIG1hdGNoKi8KKyNkZWZpbmUgTExfVElNX09DTU9ERV9UT0dHTEUgXAorICAoVElNX0NDTVIxX09DMU1fMSB8IFRJTV9DQ01SMV9PQzFNXzApIC8qITxPQ3lSRUYgdG9nZ2xlcyBvbiBjb21wYXJlIG1hdGNoKi8KKyNkZWZpbmUgTExfVElNX09DTU9ERV9GT1JDRURfSU5BQ1RJVkUgXAorICBUSU1fQ0NNUjFfT0MxTV8yIC8qITxPQ3lSRUYgaXMgZm9yY2VkIGxvdyovCisjZGVmaW5lIExMX1RJTV9PQ01PREVfRk9SQ0VEX0FDVElWRSBcCisgIChUSU1fQ0NNUjFfT0MxTV8yIHwgVElNX0NDTVIxX09DMU1fMCkgLyohPE9DeVJFRiBpcyBmb3JjZWQgaGlnaCovCisjZGVmaW5lIExMX1RJTV9PQ01PREVfUFdNMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoVElNX0NDTVIxX09DMU1fMiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIFRJTV9DQ01SMV9PQzFNXzEpIC8qITxJbiB1cGNvdW50aW5nLCBjaGFubmVsIHkgaXMgYWN0aXZlIGFzIGxvbmcgYXMgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBUSU14X0NOVDxUSU14X0NDUnkgZWxzZSBpbmFjdGl2ZS4gIEluIGRvd25jb3VudGluZywgXAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCB5IGlzIGluYWN0aXZlIGFzIGxvbmcgYXMgVElNeF9DTlQ+VElNeF9DQ1J5IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgYWN0aXZlLiovCisjZGVmaW5lIExMX1RJTV9PQ01PREVfUFdNMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoVElNX0NDTVIxX09DMU1fMiB8IFRJTV9DQ01SMV9PQzFNXzEgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIFRJTV9DQ01SMV9PQzFNXzApIC8qITxJbiB1cGNvdW50aW5nLCBjaGFubmVsIHkgaXMgaW5hY3RpdmUgYXMgbG9uZyBhcyAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBUSU14X0NOVDxUSU14X0NDUnkgZWxzZSBhY3RpdmUuICBJbiBkb3duY291bnRpbmcsICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCB5IGlzIGFjdGl2ZSBhcyBsb25nIGFzIFRJTXhfQ05UPlRJTXhfQ0NSeSBlbHNlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGluYWN0aXZlKi8KKyNkZWZpbmUgTExfVElNX09DTU9ERV9SRVRSSUdfT1BNMSBcCisgIFRJTV9DQ01SMV9PQzFNXzMgLyohPFJldHJpZ2VycmFibGUgT1BNIG1vZGUgMSovCisjZGVmaW5lIExMX1RJTV9PQ01PREVfUkVUUklHX09QTTIgXAorICAoVElNX0NDTVIxX09DMU1fMyB8IFRJTV9DQ01SMV9PQzFNXzApIC8qITxSZXRyaWdlcnJhYmxlIE9QTSBtb2RlIDIqLworI2RlZmluZSBMTF9USU1fT0NNT0RFX0NPTUJJTkVEX1BXTTEgXAorICAoVElNX0NDTVIxX09DMU1fMyB8IFRJTV9DQ01SMV9PQzFNXzIpIC8qITxDb21iaW5lZCBQV00gbW9kZSAxKi8KKyNkZWZpbmUgTExfVElNX09DTU9ERV9DT01CSU5FRF9QV00yICAgICAgXAorICAoVElNX0NDTVIxX09DMU1fMyB8IFRJTV9DQ01SMV9PQzFNXzAgfCBcCisgICBUSU1fQ0NNUjFfT0MxTV8yKSAvKiE8Q29tYmluZWQgUFdNIG1vZGUgMiovCisjZGVmaW5lIExMX1RJTV9PQ01PREVfQVNZTU1FVFJJQ19QV00xICAgIFwKKyAgKFRJTV9DQ01SMV9PQzFNXzMgfCBUSU1fQ0NNUjFfT0MxTV8xIHwgXAorICAgVElNX0NDTVIxX09DMU1fMikgLyohPEFzeW1tZXRyaWMgUFdNIG1vZGUgMSovCisjZGVmaW5lIExMX1RJTV9PQ01PREVfQVNZTU1FVFJJQ19QV00yIFwKKyAgKFRJTV9DQ01SMV9PQzFNXzMgfCBUSU1fQ0NNUjFfT0MxTSkgLyohPEFzeW1tZXRyaWMgUFdNIG1vZGUgMiovCisjZGVmaW5lIExMX1RJTV9PQ01PREVfUFVMU0VfT05fQ09NUEFSRSBcCisgIChUSU1fQ0NNUjJfT0MzTV8zIHwgVElNX0NDTVIyX09DM01fMSkgLyohPFB1bHNlIG9uIENvbXBhcmUgbW9kZSAqLworI2RlZmluZSBMTF9USU1fT0NNT0RFX0RJUkVDVElPTl9PVVRQVVQgICBcCisgIChUSU1fQ0NNUjJfT0MzTV8zIHwgVElNX0NDTVIyX09DM01fMSB8IFwKKyAgIFRJTV9DQ01SMl9PQzNNXzApIC8qITxEaXJlY3Rpb24gb3V0cHV0IG1vZGUgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19PQ1BPTEFSSVRZIE91dHB1dCBDb25maWd1cmF0aW9uIFBvbGFyaXR5CisgKiBAeworICovCisjZGVmaW5lIExMX1RJTV9PQ1BPTEFSSVRZX0hJR0ggMHgwMDAwMDAwMFUgIC8qITwgT0N4YWN0aXZlIGhpZ2gqLworI2RlZmluZSBMTF9USU1fT0NQT0xBUklUWV9MT1cgVElNX0NDRVJfQ0MxUCAvKiE8IE9DeGFjdGl2ZSBsb3cqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX09DSURMRVNUQVRFIE91dHB1dCBDb25maWd1cmF0aW9uIElkbGUgU3RhdGUKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfVElNX09DSURMRVNUQVRFX0xPVyBcCisgIDB4MDAwMDAwMDBVIC8qITxPQ3g9MCAoYWZ0ZXIgYSBkZWFkLXRpbWUgaWYgT0MgaXMgaW1wbGVtZW50ZWQpIHdoZW4gTU9FPTAqLworI2RlZmluZSBMTF9USU1fT0NJRExFU1RBVEVfSElHSCBcCisgIFRJTV9DUjJfT0lTMSAvKiE8T0N4PTEgKGFmdGVyIGEgZGVhZC10aW1lIGlmIE9DIGlzIGltcGxlbWVudGVkKSB3aGVuIE1PRT0wKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19HUk9VUENINSBHUk9VUENINQorICogQHsKKyAqLworI2RlZmluZSBMTF9USU1fR1JPVVBDSDVfTk9ORSBcCisgIDB4MDAwMDAwMDBVIC8qITwgTm8gZWZmZWN0IG9mIE9DNVJFRiBvbiBPQzFSRUZDLCBPQzJSRUZDIGFuZCBPQzNSRUZDICovCisjZGVmaW5lIExMX1RJTV9HUk9VUENINV9PQzFSRUZDIFwKKyAgVElNX0NDUjVfR0M1QzEgLyohPCBPQzFSRUZDIGlzIHRoZSBsb2dpY2FsIEFORCBvZiBPQzFSRUZDIGFuZCBPQzVSRUYgKi8KKyNkZWZpbmUgTExfVElNX0dST1VQQ0g1X09DMlJFRkMgXAorICBUSU1fQ0NSNV9HQzVDMiAvKiE8IE9DMlJFRkMgaXMgdGhlIGxvZ2ljYWwgQU5EIG9mIE9DMlJFRkMgYW5kIE9DNVJFRiAqLworI2RlZmluZSBMTF9USU1fR1JPVVBDSDVfT0MzUkVGQyBcCisgIFRJTV9DQ1I1X0dDNUMzIC8qITwgT0MzUkVGQyBpcyB0aGUgbG9naWNhbCBBTkQgb2YgT0MzUkVGQyBhbmQgT0M1UkVGICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfQUNUSVZFSU5QVVQgQWN0aXZlIElucHV0IFNlbGVjdGlvbgorICogQHsKKyAqLworI2RlZmluZSBMTF9USU1fQUNUSVZFSU5QVVRfRElSRUNUVEkgXAorICAoVElNX0NDTVIxX0NDMVNfMCA8PCAxNlUpIC8qITwgSUN4IGlzIG1hcHBlZCBvbiBUSXggKi8KKyNkZWZpbmUgTExfVElNX0FDVElWRUlOUFVUX0lORElSRUNUVEkgXAorICAoVElNX0NDTVIxX0NDMVNfMSA8PCAxNlUpIC8qITwgSUN4IGlzIG1hcHBlZCBvbiBUSXkgKi8KKyNkZWZpbmUgTExfVElNX0FDVElWRUlOUFVUX1RSQyBcCisgIChUSU1fQ0NNUjFfQ0MxUyA8PCAxNlUpIC8qITwgSUN4IGlzIG1hcHBlZCBvbiBUUkMgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19JQ1BTQyBJbnB1dCBDb25maWd1cmF0aW9uIFByZXNjYWxlcgorICogQHsKKyAqLworI2RlZmluZSBMTF9USU1fSUNQU0NfRElWMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBObyBwcmVzY2FsZXIsIGNhcHR1cmUgaXMgZG9uZSBlYWNoIHRpbWUgYW4gZWRnZSBpcyBkZXRlY3RlZCBcCisgICAgICAgICAgICAgICAgIG9uIHRoZSBjYXB0dXJlIGlucHV0ICovCisjZGVmaW5lIExMX1RJTV9JQ1BTQ19ESVYyIFwKKyAgKFRJTV9DQ01SMV9JQzFQU0NfMCA8PCAxNlUpIC8qITwgQ2FwdHVyZSBpcyBkb25lIG9uY2UgZXZlcnkgMiBldmVudHMgKi8KKyNkZWZpbmUgTExfVElNX0lDUFNDX0RJVjQgXAorICAoVElNX0NDTVIxX0lDMVBTQ18xIDw8IDE2VSkgLyohPCBDYXB0dXJlIGlzIGRvbmUgb25jZSBldmVyeSA0IGV2ZW50cyAqLworI2RlZmluZSBMTF9USU1fSUNQU0NfRElWOCBcCisgIChUSU1fQ0NNUjFfSUMxUFNDIDw8IDE2VSkgLyohPCBDYXB0dXJlIGlzIGRvbmUgb25jZSBldmVyeSA4IGV2ZW50cyAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0lDX0ZJTFRFUiBJbnB1dCBDb25maWd1cmF0aW9uIEZpbHRlcgorICogQHsKKyAqLworI2RlZmluZSBMTF9USU1fSUNfRklMVEVSX0ZESVYxIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBObyBmaWx0ZXIsIHNhbXBsaW5nIGlzIGRvbmUgYXQgZkRUUyAqLworI2RlZmluZSBMTF9USU1fSUNfRklMVEVSX0ZESVYxX04yIFwKKyAgKFRJTV9DQ01SMV9JQzFGXzAgPDwgMTZVKSAvKiE8IGZTQU1QTElORz1mQ0tfSU5ULCBOPTIgKi8KKyNkZWZpbmUgTExfVElNX0lDX0ZJTFRFUl9GRElWMV9ONCBcCisgIChUSU1fQ0NNUjFfSUMxRl8xIDw8IDE2VSkgLyohPCBmU0FNUExJTkc9ZkNLX0lOVCwgTj00ICovCisjZGVmaW5lIExMX1RJTV9JQ19GSUxURVJfRkRJVjFfTjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChUSU1fQ0NNUjFfSUMxRl8xIHwgVElNX0NDTVIxX0lDMUZfMCkgPDwgMTZVKSAvKiE8IGZTQU1QTElORz1mQ0tfSU5ULCBOPTggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9USU1fSUNfRklMVEVSX0ZESVYyX042IFwKKyAgKFRJTV9DQ01SMV9JQzFGXzIgPDwgMTZVKSAvKiE8IGZTQU1QTElORz1mRFRTLzIsIE49NiAqLworI2RlZmluZSBMTF9USU1fSUNfRklMVEVSX0ZESVYyX044IFwKKyAgKChUSU1fQ0NNUjFfSUMxRl8yIHwgVElNX0NDTVIxX0lDMUZfMCkgPDwgMTZVKSAvKiE8IGZTQU1QTElORz1mRFRTLzIsIE49OCAqLworI2RlZmluZSBMTF9USU1fSUNfRklMVEVSX0ZESVY0X042IFwKKyAgKChUSU1fQ0NNUjFfSUMxRl8yIHwgVElNX0NDTVIxX0lDMUZfMSkgPDwgMTZVKSAvKiE8IGZTQU1QTElORz1mRFRTLzQsIE49NiAqLworI2RlZmluZSBMTF9USU1fSUNfRklMVEVSX0ZESVY0X044ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKFRJTV9DQ01SMV9JQzFGXzIgfCBUSU1fQ0NNUjFfSUMxRl8xIHwgVElNX0NDTVIxX0lDMUZfMCkgXAorICAgPDwgMTZVKSAvKiE8IGZTQU1QTElORz1mRFRTLzQsIE49OCAqLworI2RlZmluZSBMTF9USU1fSUNfRklMVEVSX0ZESVY4X042IFwKKyAgKFRJTV9DQ01SMV9JQzFGXzMgPDwgMTZVKSAvKiE8IGZTQU1QTElORz1mRFRTLzgsIE49NiAqLworI2RlZmluZSBMTF9USU1fSUNfRklMVEVSX0ZESVY4X044IFwKKyAgKChUSU1fQ0NNUjFfSUMxRl8zIHwgVElNX0NDTVIxX0lDMUZfMCkgPDwgMTZVKSAvKiE8IGZTQU1QTElORz1mRFRTLzgsIE49OCAqLworI2RlZmluZSBMTF9USU1fSUNfRklMVEVSX0ZESVYxNl9ONSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoVElNX0NDTVIxX0lDMUZfMyB8IFRJTV9DQ01SMV9JQzFGXzEpIDw8IDE2VSkgLyohPCBmU0FNUExJTkc9ZkRUUy8xNiwgTj01IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfVElNX0lDX0ZJTFRFUl9GRElWMTZfTjYgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChUSU1fQ0NNUjFfSUMxRl8zIHwgVElNX0NDTVIxX0lDMUZfMSB8IFRJTV9DQ01SMV9JQzFGXzApIFwKKyAgIDw8IDE2VSkgLyohPCBmU0FNUExJTkc9ZkRUUy8xNiwgTj02ICovCisjZGVmaW5lIExMX1RJTV9JQ19GSUxURVJfRkRJVjE2X044ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChUSU1fQ0NNUjFfSUMxRl8zIHwgVElNX0NDTVIxX0lDMUZfMikgPDwgMTZVKSAvKiE8IGZTQU1QTElORz1mRFRTLzE2LCBOPTggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9USU1fSUNfRklMVEVSX0ZESVYzMl9ONSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKFRJTV9DQ01SMV9JQzFGXzMgfCBUSU1fQ0NNUjFfSUMxRl8yIHwgVElNX0NDTVIxX0lDMUZfMCkgXAorICAgPDwgMTZVKSAvKiE8IGZTQU1QTElORz1mRFRTLzMyLCBOPTUgKi8KKyNkZWZpbmUgTExfVElNX0lDX0ZJTFRFUl9GRElWMzJfTjYgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChUSU1fQ0NNUjFfSUMxRl8zIHwgVElNX0NDTVIxX0lDMUZfMiB8IFRJTV9DQ01SMV9JQzFGXzEpIFwKKyAgIDw8IDE2VSkgLyohPCBmU0FNUExJTkc9ZkRUUy8zMiwgTj02ICovCisjZGVmaW5lIExMX1RJTV9JQ19GSUxURVJfRkRJVjMyX044IFwKKyAgKFRJTV9DQ01SMV9JQzFGIDw8IDE2VSkgLyohPCBmU0FNUExJTkc9ZkRUUy8zMiwgTj04ICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfSUNfUE9MQVJJVFkgSW5wdXQgQ29uZmlndXJhdGlvbiBQb2xhcml0eQorICogQHsKKyAqLworI2RlZmluZSBMTF9USU1fSUNfUE9MQVJJVFlfUklTSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMDAwMDBVIC8qITwgVGhlIGNpcmN1aXQgaXMgc2Vuc2l0aXZlIHRvIFRJeEZQMSByaXNpbmcgZWRnZSwgVEl4RlAxIGlzIFwKKyAgICAgICAgICAgICAgICAgbm90IGludmVydGVkICovCisjZGVmaW5lIExMX1RJTV9JQ19QT0xBUklUWV9GQUxMSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVElNX0NDRVJfQ0MxUCAvKiE8IFRoZSBjaXJjdWl0IGlzIHNlbnNpdGl2ZSB0byBUSXhGUDEgZmFsbGluZyBlZGdlLCBUSXhGUDEgXAorICAgICAgICAgICAgICAgICAgIGlzIGludmVydGVkICovCisjZGVmaW5lIExMX1RJTV9JQ19QT0xBUklUWV9CT1RIRURHRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChUSU1fQ0NFUl9DQzFQIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBUSU1fQ0NFUl9DQzFOUCkgLyohPCBUaGUgY2lyY3VpdCBpcyBzZW5zaXRpdmUgdG8gYm90aCBUSXhGUDEgcmlzaW5nIGFuZCBcCisgICAgICAgICAgICAgICAgICAgICAgZmFsbGluZyBlZGdlcywgVEl4RlAxIGlzIG5vdCBpbnZlcnRlZCAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0NMT0NLU09VUkNFIENsb2NrIFNvdXJjZQorICogQHsKKyAqLworI2RlZmluZSBMTF9USU1fQ0xPQ0tTT1VSQ0VfSU5URVJOQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBUaGUgdGltZXIgaXMgY2xvY2tlZCBieSB0aGUgaW50ZXJuYWwgY2xvY2sgcHJvdmlkZWQgZnJvbSBcCisgICAgICAgICAgICAgICAgIHRoZSBSQ0MgKi8KKyNkZWZpbmUgTExfVElNX0NMT0NLU09VUkNFX0VYVF9NT0RFMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKFRJTV9TTUNSX1NNU18yIHwgVElNX1NNQ1JfU01TXzEgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIFRJTV9TTUNSX1NNU18wKSAvKiE8IENvdW50ZXIgY291bnRzIGF0IGVhY2ggcmlzaW5nIG9yIGZhbGxpbmcgZWRnZSBvbiBhIFwKKyAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZCBpbnB1dCovCisjZGVmaW5lIExMX1RJTV9DTE9DS1NPVVJDRV9FWFRfTU9ERTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUSU1fU01DUl9FQ0UgLyohPCBDb3VudGVyIGNvdW50cyBhdCBlYWNoIHJpc2luZyBvciBmYWxsaW5nIGVkZ2Ugb24gdGhlIFwKKyAgICAgICAgICAgICAgICAgIGV4dGVybmFsIHRyaWdnZXIgaW5wdXQgRVRSICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfRU5DT0RFUk1PREUgRW5jb2RlciBNb2RlCisgKiBAeworICovCisjZGVmaW5lIExMX1RJTV9FTkNPREVSTU9ERV9YMl9USTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVElNX1NNQ1JfU01TXzAgLyohPCBRdWFkcmF0dXJlIGVuY29kZXIgbW9kZSAxLCB4MiBtb2RlIC0gQ291bnRlciBjb3VudHMgXAorICAgICAgICAgICAgICAgICAgICB1cC9kb3duIG9uIFRJMUZQMSBlZGdlIGRlcGVuZGluZyBvbiBUSTJGUDIgbGV2ZWwgKi8KKyNkZWZpbmUgTExfVElNX0VOQ09ERVJNT0RFX1gyX1RJMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUSU1fU01DUl9TTVNfMSAvKiE8IFF1YWRyYXR1cmUgZW5jb2RlciBtb2RlIDIsIHgyIG1vZGUgLSBDb3VudGVyIGNvdW50cyBcCisgICAgICAgICAgICAgICAgICAgIHVwL2Rvd24gb24gVEkyRlAyIGVkZ2UgZGVwZW5kaW5nIG9uIFRJMUZQMSBsZXZlbCAqLworI2RlZmluZSBMTF9USU1fRU5DT0RFUk1PREVfWDRfVEkxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKFRJTV9TTUNSX1NNU18xIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBUSU1fU01DUl9TTVNfMCkgLyohPCBRdWFkcmF0dXJlIGVuY29kZXIgbW9kZSAzLCB4NCBtb2RlIC0gQ291bnRlciBjb3VudHMgICAgXAorICAgICAgICAgICAgICAgICAgICAgIHVwL2Rvd24gb24gYm90aCBUSTFGUDEgYW5kIFRJMkZQMiBlZGdlcyBkZXBlbmRpbmcgb24gdGhlIFwKKyAgICAgICAgICAgICAgICAgICAgICBsZXZlbCBvZiB0aGUgb3RoZXIgaW5wdXQgKi8KKyNkZWZpbmUgTExfVElNX0VOQ09ERVJNT0RFX0NMT0NLUExVU0RJUkVDVElPTl9YMiBcCisgIChUSU1fU01DUl9TTVNfMyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgVElNX1NNQ1JfU01TXzEpIC8qITwgRW5jb2RlciBtb2RlOiBDbG9jayBwbHVzIGRpcmVjdGlvbiAtIHgyIG1vZGUgKi8KKyNkZWZpbmUgTExfVElNX0VOQ09ERVJNT0RFX0NMT0NLUExVU0RJUkVDVElPTl9YMSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChUSU1fU01DUl9TTVNfMyB8IFRJTV9TTUNSX1NNU18xIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgVElNX1NNQ1JfU01TXzApIC8qITwgRW5jb2RlciBtb2RlOiBDbG9jayBwbHVzIGRpcmVjdGlvbiwgeDEgbW9kZSwgVEkyRlAyIFwKKyAgICAgICAgICAgICAgICAgICAgICBlZGdlIHNlbnNpdGl2aXR5IGlzIHNldCBieSBDQzJQICovCisjZGVmaW5lIExMX1RJTV9FTkNPREVSTU9ERV9ESVJFQ1RJT05BTENMT0NLX1gyIFwKKyAgKFRJTV9TTUNSX1NNU18zIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgVElNX1NNQ1JfU01TXzIpIC8qITwgRW5jb2RlciBtb2RlOiBEaXJlY3Rpb25hbCBDbG9jaywgeDIgbW9kZSAqLworI2RlZmluZSBMTF9USU1fRU5DT0RFUk1PREVfRElSRUNUSU9OQUxDTE9DS19YMV9USTEyICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChUSU1fU01DUl9TTVNfMyB8IFRJTV9TTUNSX1NNU18yIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIFRJTV9TTUNSX1NNU18wKSAvKiE8IEVuY29kZXIgbW9kZTogRGlyZWN0aW9uYWwgQ2xvY2ssIHgxIG1vZGUsIFRJMUZQMSBhbmQgXAorICAgICAgICAgICAgICAgICAgICAgIFRJMkZQMiBlZGdlIHNlbnNpdGl2aXR5IGlzIHNldCBieSBDQzFQIGFuZCBDQzJQICovCisjZGVmaW5lIExMX1RJTV9FTkNPREVSTU9ERV9YMV9USTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKFRJTV9TTUNSX1NNU18zIHwgVElNX1NNQ1JfU01TXzIgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgVElNX1NNQ1JfU01TXzEpIC8qITwgUXVhZHJhdHVyZSBlbmNvZGVyIG1vZGU6IHgxIG1vZGUsIGNvdW50aW5nIG9uIFRJMUZQMSBcCisgICAgICAgICAgICAgICAgICAgICAgZWRnZXMgb25seSwgZWRnZSBzZW5zaXRpdml0eSBpcyBzZXQgYnkgQ0MxUCAqLworI2RlZmluZSBMTF9USU1fRU5DT0RFUk1PREVfWDFfVEkyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChUSU1fU01DUl9TTVNfMyB8IFRJTV9TTUNSX1NNU18yIHwgVElNX1NNQ1JfU01TXzEgfCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIFRJTV9TTUNSX1NNU18wKSAvKiE8IFF1YWRyYXR1cmUgZW5jb2RlciBtb2RlOiB4MSBtb2RlLCBjb3VudGluZyBvbiBUSTJGUDIgXAorICAgICAgICAgICAgICAgICAgICAgIGVkZ2VzIG9ubHksIGVkZ2Ugc2Vuc2l0aXZpdHkgaXMgc2V0IGJ5IENDMVAgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19UUkdPIFRyaWdnZXIgT3V0cHV0CisgKiBAeworICovCisjZGVmaW5lIExMX1RJTV9UUkdPX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAweDAwMDAwMDAwVSAvKiE8IFVHIGJpdCBmcm9tIHRoZSBUSU14X0VHUiByZWdpc3RlciBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0IFwKKyAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX1RJTV9UUkdPX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRJTV9DUjJfTU1TXzAgLyohPCBDb3VudGVyIEVuYWJsZSBzaWduYWwgKENOVF9FTikgaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCBcCisgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX1RJTV9UUkdPX1VQREFURSBcCisgIFRJTV9DUjJfTU1TXzEgLyohPCBVcGRhdGUgZXZlbnQgaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAqLworI2RlZmluZSBMTF9USU1fVFJHT19DQzFJRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoVElNX0NSMl9NTVNfMSB8IFRJTV9DUjJfTU1TXzApIC8qITwgQ0MxIGNhcHR1cmUgb3IgYSBjb21wYXJlIG1hdGNoIGlzIHVzZWQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzIHRyaWdnZXIgb3V0cHV0ICovCisjZGVmaW5lIExMX1RJTV9UUkdPX09DMVJFRiBcCisgIFRJTV9DUjJfTU1TXzIgLyohPCBPQzFSRUYgc2lnbmFsIGlzIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQgKi8KKyNkZWZpbmUgTExfVElNX1RSR09fT0MyUkVGIFwKKyAgKFRJTV9DUjJfTU1TXzIgfCAgICAgICAgIFwKKyAgIFRJTV9DUjJfTU1TXzApIC8qITwgT0MyUkVGIHNpZ25hbCBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0ICovCisjZGVmaW5lIExMX1RJTV9UUkdPX09DM1JFRiBcCisgIChUSU1fQ1IyX01NU18yIHwgICAgICAgICBcCisgICBUSU1fQ1IyX01NU18xKSAvKiE8IE9DM1JFRiBzaWduYWwgaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAqLworI2RlZmluZSBMTF9USU1fVFJHT19PQzRSRUYgICAgICAgICBcCisgIChUSU1fQ1IyX01NU18yIHwgVElNX0NSMl9NTVNfMSB8IFwKKyAgIFRJTV9DUjJfTU1TXzApIC8qITwgT0M0UkVGIHNpZ25hbCBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0ICovCisjZGVmaW5lIExMX1RJTV9UUkdPX0VOQ09ERVJDTEsgXAorICBUSU1fQ1IyX01NU18zIC8qITwgRW5jb2RlciBjbG9jayBzaWduYWwgaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX1RSR08yIFRyaWdnZXIgT3V0cHV0IDIKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfVElNX1RSR08yX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMDAwMDBVIC8qITwgVUcgYml0IGZyb20gdGhlIFRJTXhfRUdSIHJlZ2lzdGVyIGlzIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQgXAorICAgICAgICAgICAgICAgICAyICovCisjZGVmaW5lIExMX1RJTV9UUkdPMl9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUSU1fQ1IyX01NUzJfMCAvKiE8IENvdW50ZXIgRW5hYmxlIHNpZ25hbCAoQ05UX0VOKSBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0IFwKKyAgICAgICAgICAgICAgICAgICAgMiAqLworI2RlZmluZSBMTF9USU1fVFJHTzJfVVBEQVRFIFwKKyAgVElNX0NSMl9NTVMyXzEgLyohPCBVcGRhdGUgZXZlbnQgaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAyICovCisjZGVmaW5lIExMX1RJTV9UUkdPMl9DQzFGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChUSU1fQ1IyX01NUzJfMSB8IFRJTV9DUjJfTU1TMl8wKSAvKiE8IENDMSBjYXB0dXJlIG9yIGEgY29tcGFyZSBtYXRjaCBpcyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0IDIgKi8KKyNkZWZpbmUgTExfVElNX1RSR08yX09DMSBcCisgIFRJTV9DUjJfTU1TMl8yIC8qITwgT0MxUkVGIHNpZ25hbCBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0IDIgKi8KKyNkZWZpbmUgTExfVElNX1RSR08yX09DMiBcCisgIChUSU1fQ1IyX01NUzJfMiB8ICAgICAgXAorICAgVElNX0NSMl9NTVMyXzApIC8qITwgT0MyUkVGIHNpZ25hbCBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0IDIgKi8KKyNkZWZpbmUgTExfVElNX1RSR08yX09DMyBcCisgIChUSU1fQ1IyX01NUzJfMiB8ICAgICAgXAorICAgVElNX0NSMl9NTVMyXzEpIC8qITwgT0MzUkVGIHNpZ25hbCBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0IDIgKi8KKyNkZWZpbmUgTExfVElNX1RSR08yX09DNCAgICAgICAgICAgICBcCisgIChUSU1fQ1IyX01NUzJfMiB8IFRJTV9DUjJfTU1TMl8xIHwgXAorICAgVElNX0NSMl9NTVMyXzApIC8qITwgT0M0UkVGIHNpZ25hbCBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0IDIgKi8KKyNkZWZpbmUgTExfVElNX1RSR08yX09DNSBcCisgIFRJTV9DUjJfTU1TMl8zIC8qITwgT0M1UkVGIHNpZ25hbCBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0IDIgKi8KKyNkZWZpbmUgTExfVElNX1RSR08yX09DNiBcCisgIChUSU1fQ1IyX01NUzJfMyB8ICAgICAgXAorICAgVElNX0NSMl9NTVMyXzApIC8qITwgT0M2UkVGIHNpZ25hbCBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0IDIgKi8KKyNkZWZpbmUgTExfVElNX1RSR08yX09DNF9SSVNJTkdGQUxMSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChUSU1fQ1IyX01NUzJfMyB8IFRJTV9DUjJfTU1TMl8xKSAvKiE8IE9DNFJFRiByaXNpbmcgb3IgZmFsbGluZyBlZGdlcyBhcmUgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAyICovCisjZGVmaW5lIExMX1RJTV9UUkdPMl9PQzZfUklTSU5HRkFMTElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChUSU1fQ1IyX01NUzJfMyB8IFRJTV9DUjJfTU1TMl8xIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBUSU1fQ1IyX01NUzJfMCkgLyohPCBPQzZSRUYgcmlzaW5nIG9yIGZhbGxpbmcgZWRnZXMgYXJlIHVzZWQgYXMgdHJpZ2dlciBcCisgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IDIgKi8KKyNkZWZpbmUgTExfVElNX1RSR08yX09DNF9SSVNJTkdfT0M2X1JJU0lORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKFRJTV9DUjJfTU1TMl8zIHwgVElNX0NSMl9NTVMyXzIpIC8qITwgT0M0UkVGIG9yIE9DNlJFRiByaXNpbmcgZWRnZXMgYXJlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQgMiAqLworI2RlZmluZSBMTF9USU1fVFJHTzJfT0M0X1JJU0lOR19PQzZfRkFMTElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChUSU1fQ1IyX01NUzJfMyB8IFRJTV9DUjJfTU1TMl8yIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIFRJTV9DUjJfTU1TMl8wKSAvKiE8IE9DNFJFRiByaXNpbmcgb3IgT0M2UkVGIGZhbGxpbmcgZWRnZXMgYXJlIHVzZWQgYXMgXAorICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXIgb3V0cHV0IDIgKi8KKyNkZWZpbmUgTExfVElNX1RSR08yX09DNV9SSVNJTkdfT0M2X1JJU0lORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoVElNX0NSMl9NTVMyXzMgfCBUSU1fQ1IyX01NUzJfMiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBUSU1fQ1IyX01NUzJfMSkgLyohPCBPQzVSRUYgb3IgT0M2UkVGIHJpc2luZyBlZGdlcyBhcmUgdXNlZCBhcyB0cmlnZ2VyIFwKKyAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgMiAqLworI2RlZmluZSBMTF9USU1fVFJHTzJfT0M1X1JJU0lOR19PQzZfRkFMTElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChUSU1fQ1IyX01NUzJfMyB8IFRJTV9DUjJfTU1TMl8yIHwgVElNX0NSMl9NTVMyXzEgfCAgICAgICAgICAgICAgICAgICAgIFwKKyAgIFRJTV9DUjJfTU1TMl8wKSAvKiE8IE9DNVJFRiByaXNpbmcgb3IgT0M2UkVGIGZhbGxpbmcgZWRnZXMgYXJlIHVzZWQgYXMgXAorICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXIgb3V0cHV0IDIgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19TTEFWRU1PREUgU2xhdmUgTW9kZQorICogQHsKKyAqLworI2RlZmluZSBMTF9USU1fU0xBVkVNT0RFX0RJU0FCTEVEIDB4MDAwMDAwMDBVIC8qITwgU2xhdmUgbW9kZSBkaXNhYmxlZCAqLworI2RlZmluZSBMTF9USU1fU0xBVkVNT0RFX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRJTV9TTUNSX1NNU18yIC8qITwgUmVzZXQgTW9kZSAtIFJpc2luZyBlZGdlIG9mIHRoZSBzZWxlY3RlZCB0cmlnZ2VyIGlucHV0IFwKKyAgICAgICAgICAgICAgICAgICAgKFRSR0kpIHJlaW5pdGlhbGl6ZXMgdGhlIGNvdW50ZXIgKi8KKyNkZWZpbmUgTExfVElNX1NMQVZFTU9ERV9HQVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKFRJTV9TTUNSX1NNU18yIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIFRJTV9TTUNSX1NNU18wKSAvKiE8IEdhdGVkIE1vZGUgLSBUaGUgY291bnRlciBjbG9jayBpcyBlbmFibGVkIHdoZW4gdGhlIFwKKyAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyIGlucHV0IChUUkdJKSBpcyBoaWdoICovCisjZGVmaW5lIExMX1RJTV9TTEFWRU1PREVfVFJJR0dFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChUSU1fU01DUl9TTVNfMiB8IFRJTV9TTUNSX1NNU18xKSAvKiE8IFRyaWdnZXIgTW9kZSAtIFRoZSBjb3VudGVyIHN0YXJ0cyBhdCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHJpc2luZyBlZGdlIG9mIHRoZSB0cmlnZ2VyIFRSR0kgKi8KKyNkZWZpbmUgTExfVElNX1NMQVZFTU9ERV9DT01CSU5FRF9SRVNFVFRSSUdHRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVElNX1NNQ1JfU01TXzMgLyohPCBDb21iaW5lZCByZXNldCArIHRyaWdnZXIgbW9kZSAtIFJpc2luZyBlZGdlIG9mIHRoZSAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQgdHJpZ2dlciBpbnB1dCAoVFJHSSkgIHJlaW5pdGlhbGl6ZXMgdGhlIGNvdW50ZXIsIFwKKyAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVzIGFuIHVwZGF0ZSBvZiB0aGUgcmVnaXN0ZXJzIGFuZCBzdGFydHMgdGhlICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY291bnRlciAqLworI2RlZmluZSBMTF9USU1fU0xBVkVNT0RFX0NPTUJJTkVEX0dBVEVEUkVTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoVElNX1NNQ1JfU01TXzMgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgVElNX1NNQ1JfU01TXzApIC8qITwgQ29tYmluZWQgZ2F0ZWQgKyByZXNldCBtb2RlIC0gVGhlIGNvdW50ZXIgY2xvY2sgaXMgXAorICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQgd2hlbiB0aGUgdHJpZ2dlciBpbnB1dCAoVFJHSSkgaXMgaGlnaC4gVGhlICAgXAorICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXIgc3RvcHMgYW5kIGlzIHJlc2V0KSBhcyBzb29uIGFzIHRoZSB0cmlnZ2VyICAgXAorICAgICAgICAgICAgICAgICAgICAgIGJlY29tZXMgbG93LkJvdGggc3RhcnRhbmQgc3RvcCBvZiB0aGUgY291bnRlciBhcmUgICAgXAorICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZWQuICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfU01TX1BSRUxPQURfU09VUkNFIFNNUyBQcmVsb2FkIFNvdXJjZQorICogQHsKKyAqLworI2RlZmluZSBMTF9USU1fU01TUFNfVElNVVBEQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBUaGUgU01TIHByZWxvYWQgdHJhbnNmZXIgaXMgdHJpZ2dlcmVkIGJ5IHRoZSBUaW1lcidzIFVwZGF0ZSBcCisgICAgICAgICAgICAgICAgIGV2ZW50ICovCisjZGVmaW5lIExMX1RJTV9TTVNQU19JTkRFWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUSU1fU01DUl9TTVNQUyAvKiE8IFRoZSBTTVMgcHJlbG9hZCB0cmFuc2ZlciBpcyB0cmlnZ2VyZWQgYnkgdGhlIEluZGV4IGV2ZW50IFwKKyAgICAgICAgICAgICAgICAgICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfVFMgVHJpZ2dlciBTZWxlY3Rpb24KKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfVElNX1RTX0lUUjAgXAorICAweDAwMDAwMDAwVSAvKiE8IEludGVybmFsIFRyaWdnZXIgMCAoSVRSMCkgaXMgdXNlZCBhcyB0cmlnZ2VyIGlucHV0ICovCisjZGVmaW5lIExMX1RJTV9UU19JVFIxIFwKKyAgVElNX1NNQ1JfVFNfMCAvKiE8IEludGVybmFsIFRyaWdnZXIgMSAoSVRSMSkgaXMgdXNlZCBhcyB0cmlnZ2VyIGlucHV0ICovCisjZGVmaW5lIExMX1RJTV9UU19JVFIyIFwKKyAgVElNX1NNQ1JfVFNfMSAvKiE8IEludGVybmFsIFRyaWdnZXIgMiAoSVRSMikgaXMgdXNlZCBhcyB0cmlnZ2VyIGlucHV0ICovCisjZGVmaW5lIExMX1RJTV9UU19JVFIzIFwKKyAgKFRJTV9TTUNSX1RTXzAgfCAgICAgXAorICAgVElNX1NNQ1JfVFNfMSkgLyohPCBJbnRlcm5hbCBUcmlnZ2VyIDMgKElUUjMpIGlzIHVzZWQgYXMgdHJpZ2dlciBpbnB1dCAqLworI2RlZmluZSBMTF9USU1fVFNfSVRSNCBcCisgIFRJTV9TTUNSX1RTXzMgLyohPCBJbnRlcm5hbCBUcmlnZ2VyIDQgKElUUjQpIGlzIHVzZWQgYXMgdHJpZ2dlciBpbnB1dCAqLworI2RlZmluZSBMTF9USU1fVFNfSVRSNSBcCisgIChUSU1fU01DUl9UU18zIHwgICAgIFwKKyAgIFRJTV9TTUNSX1RTXzApIC8qITwgSW50ZXJuYWwgVHJpZ2dlciA1IChJVFI1KSBpcyB1c2VkIGFzIHRyaWdnZXIgaW5wdXQgKi8KKyNkZWZpbmUgTExfVElNX1RTX0lUUjYgXAorICAoVElNX1NNQ1JfVFNfMyB8ICAgICBcCisgICBUSU1fU01DUl9UU18xKSAvKiE8IEludGVybmFsIFRyaWdnZXIgNiAoSVRSNikgaXMgdXNlZCBhcyB0cmlnZ2VyIGlucHV0ICovCisjZGVmaW5lIExMX1RJTV9UU19JVFI3ICAgICAgICAgICAgIFwKKyAgKFRJTV9TTUNSX1RTXzMgfCBUSU1fU01DUl9UU18xIHwgXAorICAgVElNX1NNQ1JfVFNfMCkgLyohPCBJbnRlcm5hbCBUcmlnZ2VyIDcgKElUUjcpIGlzIHVzZWQgYXMgdHJpZ2dlciBpbnB1dCAqLworI2RlZmluZSBMTF9USU1fVFNfSVRSOCBcCisgIChUSU1fU01DUl9UU18zIHwgICAgIFwKKyAgIFRJTV9TTUNSX1RTXzIpIC8qITwgSW50ZXJuYWwgVHJpZ2dlciA4IChJVFI4KSBpcyB1c2VkIGFzIHRyaWdnZXIgaW5wdXQgKi8KKyNkZWZpbmUgTExfVElNX1RTX0lUUjkgICAgICAgICAgICAgXAorICAoVElNX1NNQ1JfVFNfMyB8IFRJTV9TTUNSX1RTXzIgfCBcCisgICBUSU1fU01DUl9UU18wKSAvKiE8IEludGVybmFsIFRyaWdnZXIgOSAoSVRSOSkgaXMgdXNlZCBhcyB0cmlnZ2VyIGlucHV0ICovCisjZGVmaW5lIExMX1RJTV9UU19JVFIxMCAgICAgICAgICAgIFwKKyAgKFRJTV9TTUNSX1RTXzMgfCBUSU1fU01DUl9UU18yIHwgXAorICAgVElNX1NNQ1JfVFNfMSkgLyohPCBJbnRlcm5hbCBUcmlnZ2VyIDEwIChJVFIxMCkgaXMgdXNlZCBhcyB0cmlnZ2VyIGlucHV0ICovCisjZGVmaW5lIExMX1RJTV9UU19JVFIxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChUSU1fU01DUl9UU18zIHwgVElNX1NNQ1JfVFNfMiB8IFRJTV9TTUNSX1RTXzEgfCBcCisgICBUSU1fU01DUl9UU18wKSAvKiE8IEludGVybmFsIFRyaWdnZXIgMTEgKElUUjExKSBpcyB1c2VkIGFzIHRyaWdnZXIgaW5wdXQgKi8KKyNkZWZpbmUgTExfVElNX1RTX1RJMUZfRUQgXAorICBUSU1fU01DUl9UU18yIC8qITwgVEkxIEVkZ2UgRGV0ZWN0b3IgKFRJMUZfRUQpIGlzIHVzZWQgYXMgdHJpZ2dlciBpbnB1dCAqLworI2RlZmluZSBMTF9USU1fVFNfVEkxRlAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKFRJTV9TTUNSX1RTXzIgfCBUSU1fU01DUl9UU18wKSAvKiE8IEZpbHRlcmVkIFRpbWVyIElucHV0IDEgKFRJMUZQMSkgaXMgdXNlZCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgdHJpZ2dlciBpbnB1dCAqLworI2RlZmluZSBMTF9USU1fVFNfVEkyRlAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKFRJTV9TTUNSX1RTXzIgfCBUSU1fU01DUl9UU18xKSAvKiE8IEZpbHRlcmVkIFRpbWVyIElucHV0IDIgKFRJMTJQMikgaXMgdXNlZCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgdHJpZ2dlciBpbnB1dCAqLworI2RlZmluZSBMTF9USU1fVFNfRVRSRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoVElNX1NNQ1JfVFNfMiB8IFRJTV9TTUNSX1RTXzEgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgVElNX1NNQ1JfVFNfMCkgLyohPCBGaWx0ZXJlZCBleHRlcm5hbCBUcmlnZ2VyIChFVFJGKSBpcyB1c2VkIGFzIHRyaWdnZXIgXAorICAgICAgICAgICAgICAgICAgICAgaW5wdXQgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19FVFJfUE9MQVJJVFkgRXh0ZXJuYWwgVHJpZ2dlciBQb2xhcml0eQorICogQHsKKyAqLworI2RlZmluZSBMTF9USU1fRVRSX1BPTEFSSVRZX05PTklOVkVSVEVEIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBFVFIgaXMgbm9uLWludmVydGVkLCBhY3RpdmUgYXQgaGlnaCBsZXZlbCBvciByaXNpbmcgZWRnZSAqLworI2RlZmluZSBMTF9USU1fRVRSX1BPTEFSSVRZX0lOVkVSVEVEIFwKKyAgVElNX1NNQ1JfRVRQIC8qITwgRVRSIGlzIGludmVydGVkLCBhY3RpdmUgYXQgbG93IGxldmVsIG9yIGZhbGxpbmcgZWRnZSAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0VUUl9QUkVTQ0FMRVIgRXh0ZXJuYWwgVHJpZ2dlciBQcmVzY2FsZXIKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfVElNX0VUUl9QUkVTQ0FMRVJfRElWMSAweDAwMDAwMDAwVSAvKiE8IEVUUiBwcmVzY2FsZXIgT0ZGICovCisjZGVmaW5lIExMX1RJTV9FVFJfUFJFU0NBTEVSX0RJVjIgXAorICBUSU1fU01DUl9FVFBTXzAgLyohPCBFVFIgZnJlcXVlbmN5IGlzIGRpdmlkZWQgYnkgMiAqLworI2RlZmluZSBMTF9USU1fRVRSX1BSRVNDQUxFUl9ESVY0IFwKKyAgVElNX1NNQ1JfRVRQU18xIC8qITwgRVRSIGZyZXF1ZW5jeSBpcyBkaXZpZGVkIGJ5IDQgKi8KKyNkZWZpbmUgTExfVElNX0VUUl9QUkVTQ0FMRVJfRElWOCBcCisgIFRJTV9TTUNSX0VUUFMgLyohPCBFVFIgZnJlcXVlbmN5IGlzIGRpdmlkZWQgYnkgOCAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0VUUl9GSUxURVIgRXh0ZXJuYWwgVHJpZ2dlciBGaWx0ZXIKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfVElNX0VUUl9GSUxURVJfRkRJVjEgXAorICAweDAwMDAwMDAwVSAvKiE8IE5vIGZpbHRlciwgc2FtcGxpbmcgaXMgZG9uZSBhdCBmRFRTICovCisjZGVmaW5lIExMX1RJTV9FVFJfRklMVEVSX0ZESVYxX04yICAgICAgICAgICBcCisgIFRJTV9TTUNSX0VURl8wIC8qITwgZlNBTVBMSU5HPWZDS19JTlQsIE49MiBcCisgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9USU1fRVRSX0ZJTFRFUl9GRElWMV9ONCAgICAgICAgICAgXAorICBUSU1fU01DUl9FVEZfMSAvKiE8IGZTQU1QTElORz1mQ0tfSU5ULCBOPTQgXAorICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfVElNX0VUUl9GSUxURVJfRkRJVjFfTjggXAorICAoVElNX1NNQ1JfRVRGXzEgfCBUSU1fU01DUl9FVEZfMCkgLyohPCBmU0FNUExJTkc9ZkNLX0lOVCwgTj04ICovCisjZGVmaW5lIExMX1RJTV9FVFJfRklMVEVSX0ZESVYyX042ICAgICAgICAgIFwKKyAgVElNX1NNQ1JfRVRGXzIgLyohPCBmU0FNUExJTkc9ZkRUUy8yLCBOPTYgXAorICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfVElNX0VUUl9GSUxURVJfRkRJVjJfTjggXAorICAoVElNX1NNQ1JfRVRGXzIgfCBUSU1fU01DUl9FVEZfMCkgLyohPCBmU0FNUExJTkc9ZkRUUy8yLCBOPTggKi8KKyNkZWZpbmUgTExfVElNX0VUUl9GSUxURVJfRkRJVjRfTjYgXAorICAoVElNX1NNQ1JfRVRGXzIgfCBUSU1fU01DUl9FVEZfMSkgLyohPCBmU0FNUExJTkc9ZkRUUy80LCBOPTYgKi8KKyNkZWZpbmUgTExfVElNX0VUUl9GSUxURVJfRkRJVjRfTjggICBcCisgIChUSU1fU01DUl9FVEZfMiB8IFRJTV9TTUNSX0VURl8xIHwgXAorICAgVElNX1NNQ1JfRVRGXzApIC8qITwgZlNBTVBMSU5HPWZEVFMvNCwgTj04ICovCisjZGVmaW5lIExMX1RJTV9FVFJfRklMVEVSX0ZESVY4X042ICAgICAgICAgIFwKKyAgVElNX1NNQ1JfRVRGXzMgLyohPCBmU0FNUExJTkc9ZkRUUy84LCBOPTYgXAorICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfVElNX0VUUl9GSUxURVJfRkRJVjhfTjggXAorICAoVElNX1NNQ1JfRVRGXzMgfCBUSU1fU01DUl9FVEZfMCkgLyohPCBmU0FNUExJTkc9ZkRUUy8xNiwgTj04ICovCisjZGVmaW5lIExMX1RJTV9FVFJfRklMVEVSX0ZESVYxNl9ONSBcCisgIChUSU1fU01DUl9FVEZfMyB8IFRJTV9TTUNSX0VURl8xKSAvKiE8IGZTQU1QTElORz1mRFRTLzE2LCBOPTUgKi8KKyNkZWZpbmUgTExfVElNX0VUUl9GSUxURVJfRkRJVjE2X042ICBcCisgIChUSU1fU01DUl9FVEZfMyB8IFRJTV9TTUNSX0VURl8xIHwgXAorICAgVElNX1NNQ1JfRVRGXzApIC8qITwgZlNBTVBMSU5HPWZEVFMvMTYsIE49NiAqLworI2RlZmluZSBMTF9USU1fRVRSX0ZJTFRFUl9GRElWMTZfTjggXAorICAoVElNX1NNQ1JfRVRGXzMgfCBUSU1fU01DUl9FVEZfMikgLyohPCBmU0FNUExJTkc9ZkRUUy8xNiwgTj04ICovCisjZGVmaW5lIExMX1RJTV9FVFJfRklMVEVSX0ZESVYzMl9ONSAgXAorICAoVElNX1NNQ1JfRVRGXzMgfCBUSU1fU01DUl9FVEZfMiB8IFwKKyAgIFRJTV9TTUNSX0VURl8wKSAvKiE8IGZTQU1QTElORz1mRFRTLzMyLCBOPTUgKi8KKyNkZWZpbmUgTExfVElNX0VUUl9GSUxURVJfRkRJVjMyX042ICBcCisgIChUSU1fU01DUl9FVEZfMyB8IFRJTV9TTUNSX0VURl8yIHwgXAorICAgVElNX1NNQ1JfRVRGXzEpIC8qITwgZlNBTVBMSU5HPWZEVFMvMzIsIE49NiAqLworI2RlZmluZSBMTF9USU1fRVRSX0ZJTFRFUl9GRElWMzJfTjggICAgICAgIFwKKyAgVElNX1NNQ1JfRVRGIC8qITwgZlNBTVBMSU5HPWZEVFMvMzIsIE49OCBcCisgICAgICAgICAgICAgICAgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19USU0xX0VUUlNPVVJDRSBFeHRlcm5hbCBUcmlnZ2VyIFNvdXJjZSBUSU0xCisgKiBAeworICovCisjZGVmaW5lIExMX1RJTV9USU0xX0VUUlNPVVJDRV9HUElPIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIEdQSU8gKi8KKyNkZWZpbmUgTExfVElNX1RJTTFfRVRSU09VUkNFX0NPTVAxIFwKKyAgVElNMV9BRjFfRVRSU0VMXzAgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVAxX09VVCAqLworI2RlZmluZSBMTF9USU1fVElNMV9FVFJTT1VSQ0VfQ09NUDIgXAorICBUSU0xX0FGMV9FVFJTRUxfMSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDJfT1VUICovCisjZGVmaW5lIExMX1RJTV9USU0xX0VUUlNPVVJDRV9DT01QMyBcCisgIChUSU0xX0FGMV9FVFJTRUxfMSB8ICAgICAgICAgICAgICBcCisgICBUSU0xX0FGMV9FVFJTRUxfMCkgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVAzX09VVCAqLworI2RlZmluZSBMTF9USU1fVElNMV9FVFJTT1VSQ0VfQ09NUDQgXAorICBUSU0xX0FGMV9FVFJTRUxfMiAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDRfT1VUICovCisjaWYgZGVmaW5lZChDT01QNSkKKyNkZWZpbmUgTExfVElNX1RJTTFfRVRSU09VUkNFX0NPTVA1IFwKKyAgKFRJTTFfQUYxX0VUUlNFTF8yIHwgICAgICAgICAgICAgIFwKKyAgIFRJTTFfQUYxX0VUUlNFTF8wKSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDVfT1VUICovCisjZW5kaWYgICAgICAgICAgICAgICAgLyogQ09NUDUgKi8KKyNpZiBkZWZpbmVkKENPTVA2KQorI2RlZmluZSBMTF9USU1fVElNMV9FVFJTT1VSQ0VfQ09NUDYgXAorICAoVElNMV9BRjFfRVRSU0VMXzIgfCAgICAgICAgICAgICAgXAorICAgVElNMV9BRjFfRVRSU0VMXzEpIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QNl9PVVQgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAvKiBDT01QNiAqLworI2lmIGRlZmluZWQoQ09NUDcpCisjZGVmaW5lIExMX1RJTV9USU0xX0VUUlNPVVJDRV9DT01QNyAgICAgICAgXAorICAoVElNMV9BRjFfRVRSU0VMXzIgfCBUSU0xX0FGMV9FVFJTRUxfMSB8IFwKKyAgIFRJTTFfQUYxX0VUUlNFTF8wKSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDdfT1VUICovCisjZW5kaWYgICAgICAgICAgICAgICAgLyogQ09NUDcgKi8KKyNkZWZpbmUgTExfVElNX1RJTTFfRVRSU09VUkNFX0FEQzFfQVdEMSBcCisgIFRJTTFfQUYxX0VUUlNFTF8zIC8qITwgQURDMSBhbmFsb2cgd2F0Y2hkb2cgMSAqLworI2RlZmluZSBMTF9USU1fVElNMV9FVFJTT1VSQ0VfQURDMV9BV0QyIFwKKyAgKFRJTTFfQUYxX0VUUlNFTF8zIHwgVElNMV9BRjFfRVRSU0VMXzApIC8qITwgQURDMSBhbmFsb2cgd2F0Y2hkb2cgMiAqLworI2RlZmluZSBMTF9USU1fVElNMV9FVFJTT1VSQ0VfQURDMV9BV0QzIFwKKyAgKFRJTTFfQUYxX0VUUlNFTF8zIHwgVElNMV9BRjFfRVRSU0VMXzEpIC8qITwgQURDMSBhbmFsb2cgd2F0Y2hkb2cgMyAqLworI2lmIGRlZmluZWQoQURDNCkKKyNkZWZpbmUgTExfVElNX1RJTTFfRVRSU09VUkNFX0FEQzRfQVdEMSAgICBcCisgIChUSU0xX0FGMV9FVFJTRUxfMyB8IFRJTTFfQUYxX0VUUlNFTF8xIHwgXAorICAgVElNMV9BRjFfRVRSU0VMXzApIC8qITwgQURDNCBhbmFsb2cgd2F0Y2hkb2cgMSAqLworI2RlZmluZSBMTF9USU1fVElNMV9FVFJTT1VSQ0VfQURDNF9BV0QyIFwKKyAgKFRJTTFfQUYxX0VUUlNFTF8zIHwgVElNMV9BRjFfRVRSU0VMXzIpIC8qITwgQURDNCBhbmFsb2cgd2F0Y2hkb2cgMiAqLworI2RlZmluZSBMTF9USU1fVElNMV9FVFJTT1VSQ0VfQURDNF9BV0QzICAgIFwKKyAgKFRJTTFfQUYxX0VUUlNFTF8zIHwgVElNMV9BRjFfRVRSU0VMXzIgfCBcCisgICBUSU0xX0FGMV9FVFJTRUxfMCkgLyohPCBBREM0IGFuYWxvZyB3YXRjaGRvZyAzICovCisjZW5kaWYgICAgICAgICAgICAgICAgLyogQURDNCAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX1RJTTJfRVRSU09VUkNFIEV4dGVybmFsIFRyaWdnZXIgU291cmNlIFRJTTIKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfVElNX1RJTTJfRVRSU09VUkNFX0dQSU8gXAorICAweDAwMDAwMDAwVSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gR1BJTyAqLworI2RlZmluZSBMTF9USU1fVElNMl9FVFJTT1VSQ0VfQ09NUDEgXAorICBUSU0xX0FGMV9FVFJTRUxfMCAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDFfT1VUICovCisjZGVmaW5lIExMX1RJTV9USU0yX0VUUlNPVVJDRV9DT01QMiBcCisgIFRJTTFfQUYxX0VUUlNFTF8xIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QMl9PVVQgKi8KKyNkZWZpbmUgTExfVElNX1RJTTJfRVRSU09VUkNFX0NPTVAzIFwKKyAgKFRJTTFfQUYxX0VUUlNFTF8xIHwgICAgICAgICAgICAgIFwKKyAgIFRJTTFfQUYxX0VUUlNFTF8wKSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDNfT1VUICovCisjZGVmaW5lIExMX1RJTV9USU0yX0VUUlNPVVJDRV9DT01QNCBcCisgIFRJTTFfQUYxX0VUUlNFTF8yIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QNF9PVVQgKi8KKyNpZiBkZWZpbmVkKENPTVA1KQorI2RlZmluZSBMTF9USU1fVElNMl9FVFJTT1VSQ0VfQ09NUDUgXAorICAoVElNMV9BRjFfRVRSU0VMXzIgfCAgICAgICAgICAgICAgXAorICAgVElNMV9BRjFfRVRSU0VMXzApIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QNV9PVVQgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAvKiBDT01QNSAqLworI2lmIGRlZmluZWQoQ09NUDYpCisjZGVmaW5lIExMX1RJTV9USU0yX0VUUlNPVVJDRV9DT01QNiBcCisgIChUSU0xX0FGMV9FVFJTRUxfMiB8ICAgICAgICAgICAgICBcCisgICBUSU0xX0FGMV9FVFJTRUxfMSkgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVA2X09VVCAqLworI2VuZGlmICAgICAgICAgICAgICAgIC8qIENPTVA2ICovCisjaWYgZGVmaW5lZChDT01QNykKKyNkZWZpbmUgTExfVElNX1RJTTJfRVRSU09VUkNFX0NPTVA3ICAgICAgICBcCisgIChUSU0xX0FGMV9FVFJTRUxfMiB8IFRJTTFfQUYxX0VUUlNFTF8xIHwgXAorICAgVElNMV9BRjFfRVRSU0VMXzApIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QN19PVVQgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAvKiBDT01QNyAqLworI2RlZmluZSBMTF9USU1fVElNMl9FVFJTT1VSQ0VfVElNM19FVFIgXAorICBUSU0xX0FGMV9FVFJTRUxfMyAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gVElNMyBFVFIgKi8KKyNkZWZpbmUgTExfVElNX1RJTTJfRVRSU09VUkNFX1RJTTRfRVRSIFwKKyAgKFRJTTFfQUYxX0VUUlNFTF8zIHwgICAgICAgICAgICAgICAgIFwKKyAgIFRJTTFfQUYxX0VUUlNFTF8wKSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gVElNNCBFVFIgKi8KKyNpZiBkZWZpbmVkKFRJTTUpCisjZGVmaW5lIExMX1RJTV9USU0yX0VUUlNPVVJDRV9USU01X0VUUiBcCisgIChUSU0xX0FGMV9FVFJTRUxfMyB8ICAgICAgICAgICAgICAgICBcCisgICBUSU0xX0FGMV9FVFJTRUxfMSkgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIFRJTTUgRVRSICovCisjZW5kaWYgICAgICAgICAgICAgICAgLyogVElNNSAqLworI2RlZmluZSBMTF9USU1fVElNMl9FVFJTT1VSQ0VfTFNFICAgICAgICAgIFwKKyAgKFRJTTFfQUYxX0VUUlNFTF8zIHwgVElNMV9BRjFfRVRSU0VMXzEgfCBcCisgICBUSU0xX0FGMV9FVFJTRUxfMCkgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIExTRSAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX1RJTTNfRVRSU09VUkNFIEV4dGVybmFsIFRyaWdnZXIgU291cmNlIFRJTTMKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfVElNX1RJTTNfRVRSU09VUkNFX0dQSU8gXAorICAweDAwMDAwMDAwVSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gR1BJTyAqLworI2RlZmluZSBMTF9USU1fVElNM19FVFJTT1VSQ0VfQ09NUDEgXAorICBUSU0xX0FGMV9FVFJTRUxfMCAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDFfT1VUICovCisjZGVmaW5lIExMX1RJTV9USU0zX0VUUlNPVVJDRV9DT01QMiBcCisgIFRJTTFfQUYxX0VUUlNFTF8xIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QMl9PVVQgKi8KKyNkZWZpbmUgTExfVElNX1RJTTNfRVRSU09VUkNFX0NPTVAzIFwKKyAgKFRJTTFfQUYxX0VUUlNFTF8xIHwgICAgICAgICAgICAgIFwKKyAgIFRJTTFfQUYxX0VUUlNFTF8wKSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDNfT1VUICovCisjZGVmaW5lIExMX1RJTV9USU0zX0VUUlNPVVJDRV9DT01QNCBcCisgIFRJTTFfQUYxX0VUUlNFTF8yIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QNF9PVVQgKi8KKyNpZiBkZWZpbmVkKENPTVA1KQorI2RlZmluZSBMTF9USU1fVElNM19FVFJTT1VSQ0VfQ09NUDUgXAorICAoVElNMV9BRjFfRVRSU0VMXzIgfCAgICAgICAgICAgICAgXAorICAgVElNMV9BRjFfRVRSU0VMXzApIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QNV9PVVQgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAvKiBDT01QNSAqLworI2lmIGRlZmluZWQoQ09NUDYpCisjZGVmaW5lIExMX1RJTV9USU0zX0VUUlNPVVJDRV9DT01QNiBcCisgIChUSU0xX0FGMV9FVFJTRUxfMiB8ICAgICAgICAgICAgICBcCisgICBUSU0xX0FGMV9FVFJTRUxfMSkgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVA2X09VVCAqLworI2VuZGlmICAgICAgICAgICAgICAgIC8qIENPTVA2ICovCisjaWYgZGVmaW5lZChDT01QNykKKyNkZWZpbmUgTExfVElNX1RJTTNfRVRSU09VUkNFX0NPTVA3ICAgICAgICBcCisgIChUSU0xX0FGMV9FVFJTRUxfMiB8IFRJTTFfQUYxX0VUUlNFTF8xIHwgXAorICAgVElNMV9BRjFfRVRSU0VMXzApIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QN19PVVQgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAvKiBDT01QNyAqLworI2RlZmluZSBMTF9USU1fVElNM19FVFJTT1VSQ0VfVElNMl9FVFIgXAorICBUSU0xX0FGMV9FVFJTRUxfMyAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gVElNMiBFVFIgKi8KKyNkZWZpbmUgTExfVElNX1RJTTNfRVRSU09VUkNFX1RJTTRfRVRSIFwKKyAgKFRJTTFfQUYxX0VUUlNFTF8zIHwgICAgICAgICAgICAgICAgIFwKKyAgIFRJTTFfQUYxX0VUUlNFTF8wKSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gVElNNCBFVFIgKi8KKyNkZWZpbmUgTExfVElNX1RJTTNfRVRSU09VUkNFX0FEQzJfQVdEMSAgICBcCisgIChUSU0xX0FGMV9FVFJTRUxfMyB8IFRJTTFfQUYxX0VUUlNFTF8xIHwgXAorICAgVElNMV9BRjFfRVRSU0VMXzApIC8qITwgQURDMiBhbmFsb2cgd2F0Y2hkb2cgMSAqLworI2RlZmluZSBMTF9USU1fVElNM19FVFJTT1VSQ0VfQURDMl9BV0QyIFwKKyAgKFRJTTFfQUYxX0VUUlNFTF8zIHwgVElNMV9BRjFfRVRSU0VMXzIpIC8qITwgQURDMiBhbmFsb2cgd2F0Y2hkb2cgMiAqLworI2RlZmluZSBMTF9USU1fVElNM19FVFJTT1VSQ0VfQURDMl9BV0QzICAgIFwKKyAgKFRJTTFfQUYxX0VUUlNFTF8zIHwgVElNMV9BRjFfRVRSU0VMXzIgfCBcCisgICBUSU0xX0FGMV9FVFJTRUxfMCkgLyohPCBBREMyIGFuYWxvZyB3YXRjaGRvZyAzICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfVElNNF9FVFJTT1VSQ0UgRXh0ZXJuYWwgVHJpZ2dlciBTb3VyY2UgVElNNAorICogQHsKKyAqLworI2RlZmluZSBMTF9USU1fVElNNF9FVFJTT1VSQ0VfR1BJTyBcCisgIDB4MDAwMDAwMDBVIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBHUElPICovCisjZGVmaW5lIExMX1RJTV9USU00X0VUUlNPVVJDRV9DT01QMSBcCisgIFRJTTFfQUYxX0VUUlNFTF8wIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QMV9PVVQgKi8KKyNkZWZpbmUgTExfVElNX1RJTTRfRVRSU09VUkNFX0NPTVAyIFwKKyAgVElNMV9BRjFfRVRSU0VMXzEgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVAyX09VVCAqLworI2RlZmluZSBMTF9USU1fVElNNF9FVFJTT1VSQ0VfQ09NUDMgXAorICAoVElNMV9BRjFfRVRSU0VMXzEgfCAgICAgICAgICAgICAgXAorICAgVElNMV9BRjFfRVRSU0VMXzApIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QM19PVVQgKi8KKyNkZWZpbmUgTExfVElNX1RJTTRfRVRSU09VUkNFX0NPTVA0IFwKKyAgVElNMV9BRjFfRVRSU0VMXzIgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVA0X09VVCAqLworI2lmIGRlZmluZWQoQ09NUDUpCisjZGVmaW5lIExMX1RJTV9USU00X0VUUlNPVVJDRV9DT01QNSBcCisgIChUSU0xX0FGMV9FVFJTRUxfMiB8ICAgICAgICAgICAgICBcCisgICBUSU0xX0FGMV9FVFJTRUxfMCkgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVA1X09VVCAqLworI2VuZGlmICAgICAgICAgICAgICAgIC8qIENPTVA1ICovCisjaWYgZGVmaW5lZChDT01QNikKKyNkZWZpbmUgTExfVElNX1RJTTRfRVRSU09VUkNFX0NPTVA2IFwKKyAgKFRJTTFfQUYxX0VUUlNFTF8yIHwgICAgICAgICAgICAgIFwKKyAgIFRJTTFfQUYxX0VUUlNFTF8xKSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDZfT1VUICovCisjZW5kaWYgICAgICAgICAgICAgICAgLyogQ09NUDYgKi8KKyNpZiBkZWZpbmVkKENPTVA3KQorI2RlZmluZSBMTF9USU1fVElNNF9FVFJTT1VSQ0VfQ09NUDcgICAgICAgIFwKKyAgKFRJTTFfQUYxX0VUUlNFTF8yIHwgVElNMV9BRjFfRVRSU0VMXzEgfCBcCisgICBUSU0xX0FGMV9FVFJTRUxfMCkgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVA3X09VVCAqLworI2VuZGlmICAgICAgICAgICAgICAgIC8qIENPTVA3ICovCisjZGVmaW5lIExMX1RJTV9USU00X0VUUlNPVVJDRV9USU0zX0VUUiBcCisgIFRJTTFfQUYxX0VUUlNFTF8zIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBUSU0zIEVUUiAqLworI2lmIGRlZmluZWQoVElNNSkKKyNkZWZpbmUgTExfVElNX1RJTTRfRVRSU09VUkNFX1RJTTVfRVRSIFwKKyAgKFRJTTFfQUYxX0VUUlNFTF8zIHwgICAgICAgICAgICAgICAgIFwKKyAgIFRJTTFfQUYxX0VUUlNFTF8wKSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gVElNNSBFVFIgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAvKiBUSU01ICovCisvKioKKyAqIEB9CisgKi8KKworI2lmIGRlZmluZWQoVElNNSkKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX1RJTTVfRVRSU09VUkNFIEV4dGVybmFsIFRyaWdnZXIgU291cmNlIFRJTTUKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfVElNX1RJTTVfRVRSU09VUkNFX0dQSU8gXAorICAweDAwMDAwMDAwVSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gR1BJTyAqLworI2RlZmluZSBMTF9USU1fVElNNV9FVFJTT1VSQ0VfQ09NUDEgXAorICBUSU0xX0FGMV9FVFJTRUxfMCAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDFfT1VUICovCisjZGVmaW5lIExMX1RJTV9USU01X0VUUlNPVVJDRV9DT01QMiBcCisgIFRJTTFfQUYxX0VUUlNFTF8xIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QMl9PVVQgKi8KKyNkZWZpbmUgTExfVElNX1RJTTVfRVRSU09VUkNFX0NPTVAzIFwKKyAgKFRJTTFfQUYxX0VUUlNFTF8xIHwgICAgICAgICAgICAgIFwKKyAgIFRJTTFfQUYxX0VUUlNFTF8wKSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDNfT1VUICovCisjZGVmaW5lIExMX1RJTV9USU01X0VUUlNPVVJDRV9DT01QNCBcCisgIFRJTTFfQUYxX0VUUlNFTF8yIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QNF9PVVQgKi8KKyNpZiBkZWZpbmVkKENPTVA1KQorI2RlZmluZSBMTF9USU1fVElNNV9FVFJTT1VSQ0VfQ09NUDUgXAorICAoVElNMV9BRjFfRVRSU0VMXzIgfCAgICAgICAgICAgICAgXAorICAgVElNMV9BRjFfRVRSU0VMXzApIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QNV9PVVQgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAvKiBDT01QNSAqLworI2lmIGRlZmluZWQoQ09NUDYpCisjZGVmaW5lIExMX1RJTV9USU01X0VUUlNPVVJDRV9DT01QNiBcCisgIChUSU0xX0FGMV9FVFJTRUxfMiB8ICAgICAgICAgICAgICBcCisgICBUSU0xX0FGMV9FVFJTRUxfMSkgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVA2X09VVCAqLworI2VuZGlmICAgICAgICAgICAgICAgIC8qIENPTVA2ICovCisjaWYgZGVmaW5lZChDT01QNykKKyNkZWZpbmUgTExfVElNX1RJTTVfRVRSU09VUkNFX0NPTVA3ICAgICAgICBcCisgIChUSU0xX0FGMV9FVFJTRUxfMiB8IFRJTTFfQUYxX0VUUlNFTF8xIHwgXAorICAgVElNMV9BRjFfRVRSU0VMXzApIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QN19PVVQgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAvKiBDT01QNyAqLworI2RlZmluZSBMTF9USU1fVElNNV9FVFJTT1VSQ0VfVElNMl9FVFIgXAorICBUSU0xX0FGMV9FVFJTRUxfMyAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gVElNMiBFVFIgKi8KKyNkZWZpbmUgTExfVElNX1RJTTVfRVRSU09VUkNFX1RJTTNfRVRSIFwKKyAgKFRJTTFfQUYxX0VUUlNFTF8zIHwgICAgICAgICAgICAgICAgIFwKKyAgIFRJTTFfQUYxX0VUUlNFTF8wKSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gVElNMyBFVFIgKi8KKy8qKgorICogQH0KKyAqLworI2VuZGlmIC8qIFRJTTUgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfVElNOF9FVFJTT1VSQ0UgRXh0ZXJuYWwgVHJpZ2dlciBTb3VyY2UgVElNOAorICogQHsKKyAqLworI2RlZmluZSBMTF9USU1fVElNOF9FVFJTT1VSQ0VfR1BJTyBcCisgIDB4MDAwMDAwMDBVIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBHUElPICovCisjZGVmaW5lIExMX1RJTV9USU04X0VUUlNPVVJDRV9DT01QMSBcCisgIFRJTTFfQUYxX0VUUlNFTF8wIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QMV9PVVQgKi8KKyNkZWZpbmUgTExfVElNX1RJTThfRVRSU09VUkNFX0NPTVAyIFwKKyAgVElNMV9BRjFfRVRSU0VMXzEgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVAyX09VVCAqLworI2RlZmluZSBMTF9USU1fVElNOF9FVFJTT1VSQ0VfQ09NUDMgXAorICAoVElNMV9BRjFfRVRSU0VMXzEgfCAgICAgICAgICAgICAgXAorICAgVElNMV9BRjFfRVRSU0VMXzApIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QM19PVVQgKi8KKyNkZWZpbmUgTExfVElNX1RJTThfRVRSU09VUkNFX0NPTVA0IFwKKyAgVElNMV9BRjFfRVRSU0VMXzIgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVA0X09VVCAqLworI2lmIGRlZmluZWQoQ09NUDUpCisjZGVmaW5lIExMX1RJTV9USU04X0VUUlNPVVJDRV9DT01QNSBcCisgIChUSU0xX0FGMV9FVFJTRUxfMiB8ICAgICAgICAgICAgICBcCisgICBUSU0xX0FGMV9FVFJTRUxfMCkgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVA1X09VVCAqLworI2VuZGlmICAgICAgICAgICAgICAgIC8qIENPTVA1ICovCisjaWYgZGVmaW5lZChDT01QNikKKyNkZWZpbmUgTExfVElNX1RJTThfRVRSU09VUkNFX0NPTVA2IFwKKyAgKFRJTTFfQUYxX0VUUlNFTF8yIHwgICAgICAgICAgICAgIFwKKyAgIFRJTTFfQUYxX0VUUlNFTF8xKSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDZfT1VUICovCisjZW5kaWYgICAgICAgICAgICAgICAgLyogQ09NUDYgKi8KKyNpZiBkZWZpbmVkKENPTVA3KQorI2RlZmluZSBMTF9USU1fVElNOF9FVFJTT1VSQ0VfQ09NUDcgICAgICAgIFwKKyAgKFRJTTFfQUYxX0VUUlNFTF8yIHwgVElNMV9BRjFfRVRSU0VMXzEgfCBcCisgICBUSU0xX0FGMV9FVFJTRUxfMCkgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVA3X09VVCAqLworI2VuZGlmICAgICAgICAgICAgICAgIC8qIENPTVA3ICovCisjZGVmaW5lIExMX1RJTV9USU04X0VUUlNPVVJDRV9BREMyX0FXRDEgXAorICBUSU0xX0FGMV9FVFJTRUxfMyAvKiE8IEFEQzIgYW5hbG9nIHdhdGNoZG9nIDEgKi8KKyNkZWZpbmUgTExfVElNX1RJTThfRVRSU09VUkNFX0FEQzJfQVdEMiBcCisgIChUSU0xX0FGMV9FVFJTRUxfMyB8IFRJTTFfQUYxX0VUUlNFTF8wKSAvKiE8IEFEQzIgYW5hbG9nIHdhdGNoZG9nIDIgKi8KKyNkZWZpbmUgTExfVElNX1RJTThfRVRSU09VUkNFX0FEQzJfQVdEMyBcCisgIChUSU0xX0FGMV9FVFJTRUxfMyB8IFRJTTFfQUYxX0VUUlNFTF8xKSAvKiE8IEFEQzIgYW5hbG9nIHdhdGNoZG9nIDMgKi8KKyNpZiBkZWZpbmVkKEFEQzMpCisjZGVmaW5lIExMX1RJTV9USU04X0VUUlNPVVJDRV9BREMzX0FXRDEgICAgXAorICAoVElNMV9BRjFfRVRSU0VMXzMgfCBUSU0xX0FGMV9FVFJTRUxfMSB8IFwKKyAgIFRJTTFfQUYxX0VUUlNFTF8wKSAvKiE8IEFEQzMgYW5hbG9nIHdhdGNoZG9nIDEgKi8KKyNkZWZpbmUgTExfVElNX1RJTThfRVRSU09VUkNFX0FEQzNfQVdEMiBcCisgIChUSU0xX0FGMV9FVFJTRUxfMyB8IFRJTTFfQUYxX0VUUlNFTF8yKSAvKiE8IEFEQzMgYW5hbG9nIHdhdGNoZG9nIDIgKi8KKyNkZWZpbmUgTExfVElNX1RJTThfRVRSU09VUkNFX0FEQzNfQVdEMyAgICBcCisgIChUSU0xX0FGMV9FVFJTRUxfMyB8IFRJTTFfQUYxX0VUUlNFTF8yIHwgXAorICAgVElNMV9BRjFfRVRSU0VMXzApIC8qITwgQURDMyBhbmFsb2cgd2F0Y2hkb2cgMyAqLworI2VuZGlmICAgICAgICAgICAgICAgIC8qIEFEQzMgKi8KKy8qKgorICogQH0KKyAqLworCisjaWYgZGVmaW5lZChUSU0yMCkKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX1RJTTIwX0VUUlNPVVJDRSBFeHRlcm5hbCBUcmlnZ2VyIFNvdXJjZSBUSU0yMAorICogQHsKKyAqLworI2RlZmluZSBMTF9USU1fVElNMjBfRVRSU09VUkNFX0dQSU8gXAorICAweDAwMDAwMDAwVSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gR1BJTyAqLworI2RlZmluZSBMTF9USU1fVElNMjBfRVRSU09VUkNFX0NPTVAxIFwKKyAgVElNMV9BRjFfRVRSU0VMXzAgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVAxX09VVCAqLworI2RlZmluZSBMTF9USU1fVElNMjBfRVRSU09VUkNFX0NPTVAyIFwKKyAgVElNMV9BRjFfRVRSU0VMXzEgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVAyX09VVCAqLworI2RlZmluZSBMTF9USU1fVElNMjBfRVRSU09VUkNFX0NPTVAzIFwKKyAgKFRJTTFfQUYxX0VUUlNFTF8xIHwgICAgICAgICAgICAgICBcCisgICBUSU0xX0FGMV9FVFJTRUxfMCkgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVAzX09VVCAqLworI2RlZmluZSBMTF9USU1fVElNMjBfRVRSU09VUkNFX0NPTVA0IFwKKyAgVElNMV9BRjFfRVRSU0VMXzIgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVA0X09VVCAqLworI2lmIGRlZmluZWQoQ09NUDUpCisjZGVmaW5lIExMX1RJTV9USU0yMF9FVFJTT1VSQ0VfQ09NUDUgXAorICAoVElNMV9BRjFfRVRSU0VMXzIgfCAgICAgICAgICAgICAgIFwKKyAgIFRJTTFfQUYxX0VUUlNFTF8wKSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDVfT1VUICovCisjZW5kaWYgICAgICAgICAgICAgICAgLyogQ09NUDUgKi8KKyNpZiBkZWZpbmVkKENPTVA2KQorI2RlZmluZSBMTF9USU1fVElNMjBfRVRSU09VUkNFX0NPTVA2IFwKKyAgKFRJTTFfQUYxX0VUUlNFTF8yIHwgICAgICAgICAgICAgICBcCisgICBUSU0xX0FGMV9FVFJTRUxfMSkgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVA2X09VVCAqLworI2VuZGlmICAgICAgICAgICAgICAgIC8qIENPTVA2ICovCisjaWYgZGVmaW5lZChDT01QNykKKyNkZWZpbmUgTExfVElNX1RJTTIwX0VUUlNPVVJDRV9DT01QNyAgICAgICBcCisgIChUSU0xX0FGMV9FVFJTRUxfMiB8IFRJTTFfQUYxX0VUUlNFTF8xIHwgXAorICAgVElNMV9BRjFfRVRSU0VMXzApIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QN19PVVQgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAvKiBDT01QNyAqLworI2lmIGRlZmluZWQoQURDMykKKyNkZWZpbmUgTExfVElNX1RJTTIwX0VUUlNPVVJDRV9BREMzX0FXRDEgXAorICBUSU0xX0FGMV9FVFJTRUxfMyAvKiE8IEFEQzMgYW5hbG9nIHdhdGNoZG9nIDEgKi8KKyNkZWZpbmUgTExfVElNX1RJTTIwX0VUUlNPVVJDRV9BREMzX0FXRDIgXAorICAoVElNMV9BRjFfRVRSU0VMXzMgfCBUSU0xX0FGMV9FVFJTRUxfMCkgLyohPCBBREMzIGFuYWxvZyB3YXRjaGRvZyAyICovCisjZGVmaW5lIExMX1RJTV9USU0yMF9FVFJTT1VSQ0VfQURDM19BV0QzIFwKKyAgKFRJTTFfQUYxX0VUUlNFTF8zIHwgVElNMV9BRjFfRVRSU0VMXzEpIC8qITwgQURDMyBhbmFsb2cgd2F0Y2hkb2cgMyAqLworI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQURDMyAqLworI2lmIGRlZmluZWQoQURDNSkKKyNkZWZpbmUgTExfVElNX1RJTTIwX0VUUlNPVVJDRV9BREM1X0FXRDEgICBcCisgIChUSU0xX0FGMV9FVFJTRUxfMyB8IFRJTTFfQUYxX0VUUlNFTF8xIHwgXAorICAgVElNMV9BRjFfRVRSU0VMXzApIC8qITwgQURDNSBhbmFsb2cgd2F0Y2hkb2cgMSAqLworI2RlZmluZSBMTF9USU1fVElNMjBfRVRSU09VUkNFX0FEQzVfQVdEMiBcCisgIChUSU0xX0FGMV9FVFJTRUxfMyB8IFRJTTFfQUYxX0VUUlNFTF8yKSAvKiE8IEFEQzUgYW5hbG9nIHdhdGNoZG9nIDIgKi8KKyNkZWZpbmUgTExfVElNX1RJTTIwX0VUUlNPVVJDRV9BREM1X0FXRDMgICBcCisgIChUSU0xX0FGMV9FVFJTRUxfMyB8IFRJTTFfQUYxX0VUUlNFTF8yIHwgXAorICAgVElNMV9BRjFfRVRSU0VMXzApIC8qITwgQURDNSBhbmFsb2cgd2F0Y2hkb2cgMyAqLworI2VuZGlmICAgICAgICAgICAgICAgIC8qIEFEQzUgKi8KKy8qKgorICogQH0KKyAqLworI2VuZGlmIC8qIFRJTTIwICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0JSRUFLX1BPTEFSSVRZIGJyZWFrIHBvbGFyaXR5CisgKiBAeworICovCisjZGVmaW5lIExMX1RJTV9CUkVBS19QT0xBUklUWV9MT1cgXAorICAweDAwMDAwMDAwVSAvKiE8IEJyZWFrIGlucHV0IEJSSyBpcyBhY3RpdmUgbG93ICovCisjZGVmaW5lIExMX1RJTV9CUkVBS19QT0xBUklUWV9ISUdIIFwKKyAgVElNX0JEVFJfQktQIC8qITwgQnJlYWsgaW5wdXQgQlJLIGlzIGFjdGl2ZSBoaWdoICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfQlJFQUtfRklMVEVSIGJyZWFrIGZpbHRlcgorICogQHsKKyAqLworI2RlZmluZSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYxIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBObyBmaWx0ZXIsIEJSSyBhY3RzIGFzeW5jaHJvbm91c2x5ICovCisjZGVmaW5lIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjFfTjIgICAgICBcCisgIDB4MDAwMTAwMDBVIC8qITwgZlNBTVBMSU5HPWZDS19JTlQsIE49MiBcCisgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYxX040ICAgICAgXAorICAweDAwMDIwMDAwVSAvKiE8IGZTQU1QTElORz1mQ0tfSU5ULCBOPTQgXAorICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWMV9OOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAweDAwMDMwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZlNBTVBMSU5HPWZDS19JTlQsIE49OCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjJfTjYgMHgwMDA0MDAwMFUgLyohPCBmU0FNUExJTkc9ZkRUUy8yLCBOPTYgKi8KKyNkZWZpbmUgTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWMl9OOCAweDAwMDUwMDAwVSAvKiE8IGZTQU1QTElORz1mRFRTLzIsIE49OCAqLworI2RlZmluZSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVY0X042IDB4MDAwNjAwMDBVIC8qITwgZlNBTVBMSU5HPWZEVFMvNCwgTj02ICovCisjZGVmaW5lIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjRfTjggMHgwMDA3MDAwMFUgLyohPCBmU0FNUExJTkc9ZkRUUy80LCBOPTggKi8KKyNkZWZpbmUgTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWOF9ONiAweDAwMDgwMDAwVSAvKiE8IGZTQU1QTElORz1mRFRTLzgsIE49NiAqLworI2RlZmluZSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVY4X044IDB4MDAwOTAwMDBVIC8qITwgZlNBTVBMSU5HPWZEVFMvOCwgTj04ICovCisjZGVmaW5lIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjE2X041ICAgICBcCisgIDB4MDAwQTAwMDBVIC8qITwgZlNBTVBMSU5HPWZEVFMvMTYsIE49NSBcCisgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYxNl9ONiAgICAgXAorICAweDAwMEIwMDAwVSAvKiE8IGZTQU1QTElORz1mRFRTLzE2LCBOPTYgXAorICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWMTZfTjggICAgIFwKKyAgMHgwMDBDMDAwMFUgLyohPCBmU0FNUExJTkc9ZkRUUy8xNiwgTj04IFwKKyAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjMyX041ICAgICBcCisgIDB4MDAwRDAwMDBVIC8qITwgZlNBTVBMSU5HPWZEVFMvMzIsIE49NSBcCisgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYzMl9ONiAgICAgXAorICAweDAwMEUwMDAwVSAvKiE8IGZTQU1QTElORz1mRFRTLzMyLCBOPTYgXAorICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWMzJfTjggICAgIFwKKyAgMHgwMDBGMDAwMFUgLyohPCBmU0FNUExJTkc9ZkRUUy8zMiwgTj04IFwKKyAgICAgICAgICAgICAgICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfQlJFQUsyX1BPTEFSSVRZIEJSRUFLMiBQT0xBUklUWQorICogQHsKKyAqLworI2RlZmluZSBMTF9USU1fQlJFQUsyX1BPTEFSSVRZX0xPVyBcCisgIDB4MDAwMDAwMDBVIC8qITwgQnJlYWsgaW5wdXQgQlJLMiBpcyBhY3RpdmUgbG93ICovCisjZGVmaW5lIExMX1RJTV9CUkVBSzJfUE9MQVJJVFlfSElHSCBcCisgIFRJTV9CRFRSX0JLMlAgLyohPCBCcmVhayBpbnB1dCBCUksyIGlzIGFjdGl2ZSBoaWdoICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfQlJFQUsyX0ZJTFRFUiBCUkVBSzIgRklMVEVSCisgKiBAeworICovCisjZGVmaW5lIExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYxIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBObyBmaWx0ZXIsIEJSSyBhY3RzIGFzeW5jaHJvbm91c2x5ICovCisjZGVmaW5lIExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYxX04yICAgICBcCisgIDB4MDAxMDAwMDBVIC8qITwgZlNBTVBMSU5HPWZDS19JTlQsIE49MiBcCisgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMV9ONCAgICAgXAorICAweDAwMjAwMDAwVSAvKiE8IGZTQU1QTElORz1mQ0tfSU5ULCBOPTQgXAorICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjFfTjggICAgIFwKKyAgMHgwMDMwMDAwMFUgLyohPCBmU0FNUExJTkc9ZkNLX0lOVCwgTj04IFwKKyAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYyX042ICAgIFwKKyAgMHgwMDQwMDAwMFUgLyohPCBmU0FNUExJTkc9ZkRUUy8yLCBOPTYgXAorICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjJfTjggICAgXAorICAweDAwNTAwMDAwVSAvKiE8IGZTQU1QTElORz1mRFRTLzIsIE49OCBcCisgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWNF9ONiAgICBcCisgIDB4MDA2MDAwMDBVIC8qITwgZlNBTVBMSU5HPWZEVFMvNCwgTj02IFwKKyAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVY0X044ICAgIFwKKyAgMHgwMDcwMDAwMFUgLyohPCBmU0FNUExJTkc9ZkRUUy80LCBOPTggXAorICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjhfTjYgICAgXAorICAweDAwODAwMDAwVSAvKiE8IGZTQU1QTElORz1mRFRTLzgsIE49NiBcCisgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWOF9OOCAgICBcCisgIDB4MDA5MDAwMDBVIC8qITwgZlNBTVBMSU5HPWZEVFMvOCwgTj04IFwKKyAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYxNl9ONSBcCisgIDB4MDBBMDAwMDBVIC8qITwgZlNBTVBMSU5HPWZEVFMvMTYsIE49NSAqLworI2RlZmluZSBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMTZfTjYgXAorICAweDAwQjAwMDAwVSAvKiE8IGZTQU1QTElORz1mRFRTLzE2LCBOPTYgKi8KKyNkZWZpbmUgTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjE2X044IFwKKyAgMHgwMEMwMDAwMFUgLyohPCBmU0FNUExJTkc9ZkRUUy8xNiwgTj04ICovCisjZGVmaW5lIExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYzMl9ONSBcCisgIDB4MDBEMDAwMDBVIC8qITwgZlNBTVBMSU5HPWZEVFMvMzIsIE49NSAqLworI2RlZmluZSBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMzJfTjYgXAorICAweDAwRTAwMDAwVSAvKiE8IGZTQU1QTElORz1mRFRTLzMyLCBOPTYgKi8KKyNkZWZpbmUgTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjMyX044IFwKKyAgMHgwMEYwMDAwMFUgLyohPCBmU0FNUExJTkc9ZkRUUy8zMiwgTj04ICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfT1NTSSBPU1NJCisgKiBAeworICovCisjZGVmaW5lIExMX1RJTV9PU1NJX0RJU0FCTEUgXAorICAweDAwMDAwMDAwVSAvKiE8IFdoZW4gaW5hY3RpdmUsIE9DeC9PQ3hOIG91dHB1dHMgYXJlIGRpc2FibGVkICovCisjZGVmaW5lIExMX1RJTV9PU1NJX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRJTV9CRFRSX09TU0kgLyohPCBXaGVuIGluYWN0aXZlLCBPeEMvT0N4TiBvdXRwdXRzIGFyZSBmaXJzdCBmb3JjZWQgd2l0aCAgICBcCisgICAgICAgICAgICAgICAgICAgdGhlaXIgaW5hY3RpdmUgbGV2ZWwgdGhlbiBmb3JjZWQgdG8gdGhlaXIgaWRsZSBsZXZlbCBhZnRlciBcCisgICAgICAgICAgICAgICAgICAgdGhlIGRlYWR0aW1lICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfT1NTUiBPU1NSCisgKiBAeworICovCisjZGVmaW5lIExMX1RJTV9PU1NSX0RJU0FCTEUgXAorICAweDAwMDAwMDAwVSAvKiE8IFdoZW4gaW5hY3RpdmUsIE9DeC9PQ3hOIG91dHB1dHMgYXJlIGRpc2FibGVkICovCisjZGVmaW5lIExMX1RJTV9PU1NSX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVElNX0JEVFJfT1NTUiAvKiE8IFdoZW4gaW5hY3RpdmUsIE9DL09DTiBvdXRwdXRzIGFyZSBlbmFibGVkIHdpdGggdGhlaXIgXAorICAgICAgICAgICAgICAgICAgIGluYWN0aXZlIGxldmVsIGFzIHNvb24gYXMgQ0N4RT0xIG9yIENDeE5FPTEgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19CUkVBS19JTlBVVCBCUkVBSyBJTlBVVAorICogQHsKKyAqLworI2RlZmluZSBMTF9USU1fQlJFQUtfSU5QVVRfQktJTiAweDAwMDAwMDAwVSAgLyohPCBUSU14X0JLSU4gaW5wdXQgKi8KKyNkZWZpbmUgTExfVElNX0JSRUFLX0lOUFVUX0JLSU4yIDB4MDAwMDAwMDRVIC8qITwgVElNeF9CS0lOMiBpbnB1dCAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0JLSU5fU09VUkNFIEJLSU4gU09VUkNFCisgKiBAeworICovCisjZGVmaW5lIExMX1RJTV9CS0lOX1NPVVJDRV9CS0lOIFwKKyAgVElNMV9BRjFfQktJTkUgLyohPCBCS0lOIGlucHV0IGZyb20gQUYgY29udHJvbGxlciAqLworI2RlZmluZSBMTF9USU1fQktJTl9TT1VSQ0VfQktDT01QMSBcCisgIFRJTTFfQUYxX0JLQ01QMUUgLyohPCBpbnRlcm5hbCBzaWduYWw6IENPTVAxIG91dHB1dCAqLworI2RlZmluZSBMTF9USU1fQktJTl9TT1VSQ0VfQktDT01QMiBcCisgIFRJTTFfQUYxX0JLQ01QMkUgLyohPCBpbnRlcm5hbCBzaWduYWw6IENPTVAyIG91dHB1dCAqLworI2RlZmluZSBMTF9USU1fQktJTl9TT1VSQ0VfQktDT01QMyBcCisgIFRJTTFfQUYxX0JLQ01QM0UgLyohPCBpbnRlcm5hbCBzaWduYWw6IENPTVAzIG91dHB1dCAqLworI2RlZmluZSBMTF9USU1fQktJTl9TT1VSQ0VfQktDT01QNCBcCisgIFRJTTFfQUYxX0JLQ01QNEUgLyohPCBpbnRlcm5hbCBzaWduYWw6IENPTVA0IG91dHB1dCAqLworI2lmIGRlZmluZWQoQ09NUDUpCisjZGVmaW5lIExMX1RJTV9CS0lOX1NPVVJDRV9CS0NPTVA1IFwKKyAgVElNMV9BRjFfQktDTVA1RSAvKiE8IGludGVybmFsIHNpZ25hbDogQ09NUDUgb3V0cHV0ICovCisjZW5kaWYgICAgICAgICAgICAgLyogQ09NUDUgKi8KKyNpZiBkZWZpbmVkKENPTVA2KQorI2RlZmluZSBMTF9USU1fQktJTl9TT1VSQ0VfQktDT01QNiBcCisgIFRJTTFfQUYxX0JLQ01QNkUgLyohPCBpbnRlcm5hbCBzaWduYWw6IENPTVA2IG91dHB1dCAqLworI2VuZGlmICAgICAgICAgICAgIC8qIENPTVA2ICovCisjaWYgZGVmaW5lZChDT01QNykKKyNkZWZpbmUgTExfVElNX0JLSU5fU09VUkNFX0JLQ09NUDcgXAorICBUSU0xX0FGMV9CS0NNUDdFIC8qITwgaW50ZXJuYWwgc2lnbmFsOiBDT01QNyBvdXRwdXQgKi8KKyNlbmRpZiAgICAgICAgICAgICAvKiBDT01QNyAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0JLSU5fUE9MQVJJVFkgQktJTiBQT0xBUklUWQorICogQHsKKyAqLworI2RlZmluZSBMTF9USU1fQktJTl9QT0xBUklUWV9MT1cgXAorICBUSU0xX0FGMV9CS0lOUCAvKiE8IEJSSyBCS0lOIGlucHV0IGlzIGFjdGl2ZSBsb3cgKi8KKyNkZWZpbmUgTExfVElNX0JLSU5fUE9MQVJJVFlfSElHSCBcCisgIDB4MDAwMDAwMDBVIC8qITwgQlJLIEJLSU4gaW5wdXQgaXMgYWN0aXZlIGhpZ2ggKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19CUkVBS19BRk1PREUgQlJFQUsgQUYgTU9ERQorICogQHsKKyAqLworI2RlZmluZSBMTF9USU1fQlJFQUtfQUZNT0RFX0lOUFVUIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBCcmVhayBpbnB1dCBCUksgaW4gaW5wdXQgbW9kZSAqLworI2RlZmluZSBMTF9USU1fQlJFQUtfQUZNT0RFX0JJRElSRUNUSU9OQUwgXAorICBUSU1fQkRUUl9CS0JJRCAvKiE8IEJyZWFrIGlucHV0IEJSSyBpbiBiaWRpcmVjdGlvbmFsIG1vZGUgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19CUkVBSzJfQUZNT0RFIEJSRUFLMiBBRiBNT0RFCisgKiBAeworICovCisjZGVmaW5lIExMX1RJTV9CUkVBSzJfQUZNT0RFX0lOUFVUIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBCcmVhazIgaW5wdXQgQlJLMiBpbiBpbnB1dCBtb2RlICovCisjZGVmaW5lIExMX1RJTV9CUkVBSzJfQUZNT0RFX0JJRElSRUNUSU9OQUwgXAorICBUSU1fQkRUUl9CSzJCSUQgLyohPCBCcmVhazIgaW5wdXQgQlJLMiBpbiBiaWRpcmVjdGlvbmFsIG1vZGUgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogTGVnYWN5IGRlZmluaXRpb25zIGZvciBjb21wYXRpYmlsaXR5IHB1cnBvc2UKK0Bjb25kIDAKKyAgKi8KKyNkZWZpbmUgTExfVElNX1JlQXJtQlJLKF9QQVJBTV8pCisjZGVmaW5lIExMX1RJTV9SZUFybUJSSzIoX1BBUkFNXykKKy8qKgorQGVuZGNvbmQKKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfRE1BQlVSU1RfQkFTRUFERFIgRE1BIEJ1cnN0IEJhc2UgQWRkcmVzcworICogQHsKKyAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQ1IxIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBUSU14X0NSMSByZWdpc3RlciBpcyB0aGUgRE1BIGJhc2UgYWRkcmVzcyBmb3IgRE1BIGJ1cnN0ICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DUjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVElNX0RDUl9EQkFfMCAvKiE8IFRJTXhfQ1IyIHJlZ2lzdGVyIGlzIHRoZSBETUEgYmFzZSBhZGRyZXNzIGZvciBETUEgYnVyc3QgXAorICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfU01DUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUSU1fRENSX0RCQV8xIC8qITwgVElNeF9TTUNSIHJlZ2lzdGVyIGlzIHRoZSBETUEgYmFzZSBhZGRyZXNzIGZvciBETUEgYnVyc3QgXAorICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfRElFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChUSU1fRENSX0RCQV8xIHwgVElNX0RDUl9EQkFfMCkgLyohPCBUSU14X0RJRVIgcmVnaXN0ZXIgaXMgdGhlIERNQSBiYXNlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzIGZvciBETUEgYnVyc3QgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX1NSIFwKKyAgVElNX0RDUl9EQkFfMiAvKiE8IFRJTXhfU1IgcmVnaXN0ZXIgaXMgdGhlIERNQSBiYXNlIGFkZHJlc3MgZm9yIERNQSBidXJzdCAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfRUdSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKFRJTV9EQ1JfREJBXzIgfCBUSU1fRENSX0RCQV8wKSAvKiE8IFRJTXhfRUdSIHJlZ2lzdGVyIGlzIHRoZSBETUEgYmFzZSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyBmb3IgRE1BIGJ1cnN0ICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DQ01SMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChUSU1fRENSX0RCQV8yIHwgVElNX0RDUl9EQkFfMSkgLyohPCBUSU14X0NDTVIxIHJlZ2lzdGVyIGlzIHRoZSBETUEgYmFzZSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyBmb3IgRE1BIGJ1cnN0ICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DQ01SMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChUSU1fRENSX0RCQV8yIHwgVElNX0RDUl9EQkFfMSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBUSU1fRENSX0RCQV8wKSAvKiE8IFRJTXhfQ0NNUjIgcmVnaXN0ZXIgaXMgdGhlIERNQSBiYXNlIGFkZHJlc3MgZm9yIERNQSBcCisgICAgICAgICAgICAgICAgICAgICBidXJzdCAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQ0NFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUSU1fRENSX0RCQV8zIC8qITwgVElNeF9DQ0VSIHJlZ2lzdGVyIGlzIHRoZSBETUEgYmFzZSBhZGRyZXNzIGZvciBETUEgYnVyc3QgXAorICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQ05UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKFRJTV9EQ1JfREJBXzMgfCBUSU1fRENSX0RCQV8wKSAvKiE8IFRJTXhfQ05UIHJlZ2lzdGVyIGlzIHRoZSBETUEgYmFzZSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyBmb3IgRE1BIGJ1cnN0ICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9QU0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoVElNX0RDUl9EQkFfMyB8IFRJTV9EQ1JfREJBXzEpIC8qITwgVElNeF9QU0MgcmVnaXN0ZXIgaXMgdGhlIERNQSBiYXNlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzIGZvciBETUEgYnVyc3QgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0FSUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChUSU1fRENSX0RCQV8zIHwgVElNX0RDUl9EQkFfMSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgVElNX0RDUl9EQkFfMCkgLyohPCBUSU14X0FSUiByZWdpc3RlciBpcyB0aGUgRE1BIGJhc2UgYWRkcmVzcyBmb3IgRE1BIGJ1cnN0IFwKKyAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfUkNSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKFRJTV9EQ1JfREJBXzMgfCBUSU1fRENSX0RCQV8yKSAvKiE8IFRJTXhfUkNSIHJlZ2lzdGVyIGlzIHRoZSBETUEgYmFzZSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyBmb3IgRE1BIGJ1cnN0ICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DQ1IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKFRJTV9EQ1JfREJBXzMgfCBUSU1fRENSX0RCQV8yIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgVElNX0RDUl9EQkFfMCkgLyohPCBUSU14X0NDUjEgcmVnaXN0ZXIgaXMgdGhlIERNQSBiYXNlIGFkZHJlc3MgZm9yIERNQSBcCisgICAgICAgICAgICAgICAgICAgICBidXJzdCAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQ0NSMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChUSU1fRENSX0RCQV8zIHwgVElNX0RDUl9EQkFfMiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIFRJTV9EQ1JfREJBXzEpIC8qITwgVElNeF9DQ1IyIHJlZ2lzdGVyIGlzIHRoZSBETUEgYmFzZSBhZGRyZXNzIGZvciBETUEgXAorICAgICAgICAgICAgICAgICAgICAgYnVyc3QgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0NDUjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoVElNX0RDUl9EQkFfMyB8IFRJTV9EQ1JfREJBXzIgfCBUSU1fRENSX0RCQV8xIHwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBUSU1fRENSX0RCQV8wKSAvKiE8IFRJTXhfQ0NSMyByZWdpc3RlciBpcyB0aGUgRE1BIGJhc2UgYWRkcmVzcyBmb3IgRE1BIFwKKyAgICAgICAgICAgICAgICAgICAgIGJ1cnN0ICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DQ1I0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRJTV9EQ1JfREJBXzQgLyohPCBUSU14X0NDUjQgcmVnaXN0ZXIgaXMgdGhlIERNQSBiYXNlIGFkZHJlc3MgZm9yIERNQSBidXJzdCBcCisgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9CRFRSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKFRJTV9EQ1JfREJBXzQgfCBUSU1fRENSX0RCQV8wKSAvKiE8IFRJTXhfQkRUUiByZWdpc3RlciBpcyB0aGUgRE1BIGJhc2UgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgZm9yIERNQSBidXJzdCAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQ0NSNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChUSU1fRENSX0RCQV80IHwgVElNX0RDUl9EQkFfMSkgLyohPCBUSU14X0NDUjUgcmVnaXN0ZXIgaXMgdGhlIERNQSBiYXNlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzIGZvciBETUEgYnVyc3QgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0NDUjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoVElNX0RDUl9EQkFfNCB8IFRJTV9EQ1JfREJBXzEgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBUSU1fRENSX0RCQV8wKSAvKiE8IFRJTXhfQ0NSNiByZWdpc3RlciBpcyB0aGUgRE1BIGJhc2UgYWRkcmVzcyBmb3IgRE1BIFwKKyAgICAgICAgICAgICAgICAgICAgIGJ1cnN0ICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DQ01SMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChUSU1fRENSX0RCQV80IHwgVElNX0RDUl9EQkFfMikgLyohPCBUSU14X0NDTVIzIHJlZ2lzdGVyIGlzIHRoZSBETUEgYmFzZSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyBmb3IgRE1BIGJ1cnN0ICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9EVFIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKFRJTV9EQ1JfREJBXzQgfCBUSU1fRENSX0RCQV8yIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgVElNX0RDUl9EQkFfMCkgLyohPCBUSU14X0RUUjIgcmVnaXN0ZXIgaXMgdGhlIERNQSBiYXNlIGFkZHJlc3MgZm9yIERNQSBcCisgICAgICAgICAgICAgICAgICAgICBidXJzdCAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfRUNSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKFRJTV9EQ1JfREJBXzQgfCBUSU1fRENSX0RCQV8yIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBUSU1fRENSX0RCQV8xKSAvKiE8IFRJTXhfRUNSIHJlZ2lzdGVyIGlzIHRoZSBETUEgYmFzZSBhZGRyZXNzIGZvciBETUEgYnVyc3QgXAorICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9USVNFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChUSU1fRENSX0RCQV80IHwgVElNX0RDUl9EQkFfMiB8IFRJTV9EQ1JfREJBXzEgfCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBUSU1fRENSX0RCQV8wKSAvKiE8IFRJTXhfVElTRUwgcmVnaXN0ZXIgaXMgdGhlIERNQSBiYXNlIGFkZHJlc3MgZm9yIERNQSBcCisgICAgICAgICAgICAgICAgICAgICBidXJzdCAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQUYxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKFRJTV9EQ1JfREJBXzQgfCBUSU1fRENSX0RCQV8zKSAvKiE8IFRJTXhfQUYxIHJlZ2lzdGVyIGlzIHRoZSBETUEgYmFzZSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyBmb3IgRE1BIGJ1cnN0ICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9BRjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoVElNX0RDUl9EQkFfNCB8IFRJTV9EQ1JfREJBXzMgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIFRJTV9EQ1JfREJBXzApIC8qITwgVElNeF9BRjIgcmVnaXN0ZXIgaXMgdGhlIERNQSBiYXNlIGFkZHJlc3MgZm9yIERNQSBidXJzdCBcCisgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX09SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKFRJTV9EQ1JfREJBXzQgfCBUSU1fRENSX0RCQV8zIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIFRJTV9EQ1JfREJBXzEpIC8qITwgVElNeF9PUiByZWdpc3RlciBpcyB0aGUgRE1BIGJhc2UgYWRkcmVzcyBmb3IgRE1BIGJ1cnN0IFwKKyAgICAgICAgICAgICAgICAgICAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0RNQUJVUlNUX0xFTkdUSCBETUEgQnVyc3QgTGVuZ3RoCisgKiBAeworICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfMVRSQU5TRkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMDAwMDBVIC8qITwgVHJhbnNmZXIgaXMgZG9uZSB0byAxIHJlZ2lzdGVyIHN0YXJ0aW5nIGZyb20gdGhlIERNQSBidXJzdCBcCisgICAgICAgICAgICAgICAgIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzJUUkFOU0ZFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUSU1fRENSX0RCTF8wIC8qITwgVHJhbnNmZXIgaXMgZG9uZSB0byAyIHJlZ2lzdGVycyBzdGFydGluZyBmcm9tIHRoZSBETUEgXAorICAgICAgICAgICAgICAgICAgIGJ1cnN0IGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzNUUkFOU0ZFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUSU1fRENSX0RCTF8xIC8qITwgVHJhbnNmZXIgaXMgZG9uZSB0byAzIHJlZ2lzdGVycyBzdGFydGluZyBmcm9tIHRoZSBETUEgXAorICAgICAgICAgICAgICAgICAgIGJ1cnN0IGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzRUUkFOU0ZFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChUSU1fRENSX0RCTF8xIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIFRJTV9EQ1JfREJMXzApIC8qITwgVHJhbnNmZXIgaXMgZG9uZSB0byA0IHJlZ2lzdGVycyBzdGFydGluZyBmcm9tIHRoZSBETUEgXAorICAgICAgICAgICAgICAgICAgICAgYnVyc3QgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfNVRSQU5TRkVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRJTV9EQ1JfREJMXzIgLyohPCBUcmFuc2ZlciBpcyBkb25lIHRvIDUgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gdGhlIERNQSBcCisgICAgICAgICAgICAgICAgICAgYnVyc3QgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfNlRSQU5TRkVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKFRJTV9EQ1JfREJMXzIgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgVElNX0RDUl9EQkxfMCkgLyohPCBUcmFuc2ZlciBpcyBkb25lIHRvIDYgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gdGhlIERNQSBcCisgICAgICAgICAgICAgICAgICAgICBidXJzdCBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0xFTkdUSF83VFJBTlNGRVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoVElNX0RDUl9EQkxfMiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBUSU1fRENSX0RCTF8xKSAvKiE8IFRyYW5zZmVyIGlzIGRvbmUgdG8gNyByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSB0aGUgRE1BIFwKKyAgICAgICAgICAgICAgICAgICAgIGJ1cnN0IGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzhUUkFOU0ZFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChUSU1fRENSX0RCTF8yIHwgVElNX0RDUl9EQkxfMSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIFRJTV9EQ1JfREJMXzApIC8qITwgVHJhbnNmZXIgaXMgZG9uZSB0byAxIHJlZ2lzdGVycyBzdGFydGluZyBmcm9tIHRoZSBETUEgXAorICAgICAgICAgICAgICAgICAgICAgYnVyc3QgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfOVRSQU5TRkVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRJTV9EQ1JfREJMXzMgLyohPCBUcmFuc2ZlciBpcyBkb25lIHRvIDkgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gdGhlIERNQSBcCisgICAgICAgICAgICAgICAgICAgYnVyc3QgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfMTBUUkFOU0ZFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChUSU1fRENSX0RCTF8zIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBUSU1fRENSX0RCTF8wKSAvKiE8IFRyYW5zZmVyIGlzIGRvbmUgdG8gMTAgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gdGhlIERNQSBcCisgICAgICAgICAgICAgICAgICAgICBidXJzdCBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0xFTkdUSF8xMVRSQU5TRkVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKFRJTV9EQ1JfREJMXzMgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIFRJTV9EQ1JfREJMXzEpIC8qITwgVHJhbnNmZXIgaXMgZG9uZSB0byAxMSByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSB0aGUgRE1BIFwKKyAgICAgICAgICAgICAgICAgICAgIGJ1cnN0IGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzEyVFJBTlNGRVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoVElNX0RDUl9EQkxfMyB8IFRJTV9EQ1JfREJMXzEgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgVElNX0RDUl9EQkxfMCkgLyohPCBUcmFuc2ZlciBpcyBkb25lIHRvIDEyIHJlZ2lzdGVycyBzdGFydGluZyBmcm9tIHRoZSBETUEgXAorICAgICAgICAgICAgICAgICAgICAgYnVyc3QgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfMTNUUkFOU0ZFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChUSU1fRENSX0RCTF8zIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBUSU1fRENSX0RCTF8yKSAvKiE8IFRyYW5zZmVyIGlzIGRvbmUgdG8gMTMgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gdGhlIERNQSBcCisgICAgICAgICAgICAgICAgICAgICBidXJzdCBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0xFTkdUSF8xNFRSQU5TRkVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKFRJTV9EQ1JfREJMXzMgfCBUSU1fRENSX0RCTF8yIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIFRJTV9EQ1JfREJMXzApIC8qITwgVHJhbnNmZXIgaXMgZG9uZSB0byAxNCByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSB0aGUgRE1BIFwKKyAgICAgICAgICAgICAgICAgICAgIGJ1cnN0IGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzE1VFJBTlNGRVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoVElNX0RDUl9EQkxfMyB8IFRJTV9EQ1JfREJMXzIgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgVElNX0RDUl9EQkxfMSkgLyohPCBUcmFuc2ZlciBpcyBkb25lIHRvIDE1IHJlZ2lzdGVycyBzdGFydGluZyBmcm9tIHRoZSBETUEgXAorICAgICAgICAgICAgICAgICAgICAgYnVyc3QgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfMTZUUkFOU0ZFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChUSU1fRENSX0RCTF8zIHwgVElNX0RDUl9EQkxfMiB8IFRJTV9EQ1JfREJMXzEgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBUSU1fRENSX0RCTF8wKSAvKiE8IFRyYW5zZmVyIGlzIGRvbmUgdG8gMTYgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gdGhlIERNQSBcCisgICAgICAgICAgICAgICAgICAgICBidXJzdCBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0xFTkdUSF8xN1RSQU5TRkVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRJTV9EQ1JfREJMXzQgLyohPCBUcmFuc2ZlciBpcyBkb25lIHRvIDE3IHJlZ2lzdGVycyBzdGFydGluZyBmcm9tIHRoZSBETUEgXAorICAgICAgICAgICAgICAgICAgIGJ1cnN0IGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzE4VFJBTlNGRVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoVElNX0RDUl9EQkxfNCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgVElNX0RDUl9EQkxfMCkgLyohPCBUcmFuc2ZlciBpcyBkb25lIHRvIDE4IHJlZ2lzdGVycyBzdGFydGluZyBmcm9tIHRoZSBETUEgXAorICAgICAgICAgICAgICAgICAgICAgYnVyc3QgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfMTlUUkFOU0ZFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChUSU1fRENSX0RCTF80IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBUSU1fRENSX0RCTF8xKSAvKiE8IFRyYW5zZmVyIGlzIGRvbmUgdG8gMTkgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gdGhlIERNQSBcCisgICAgICAgICAgICAgICAgICAgICBidXJzdCBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0xFTkdUSF8yMFRSQU5TRkVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKFRJTV9EQ1JfREJMXzQgfCBUSU1fRENSX0RCTF8xIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIFRJTV9EQ1JfREJMXzApIC8qITwgVHJhbnNmZXIgaXMgZG9uZSB0byAyMCByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSB0aGUgRE1BIFwKKyAgICAgICAgICAgICAgICAgICAgIGJ1cnN0IGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzIxVFJBTlNGRVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoVElNX0RDUl9EQkxfNCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgVElNX0RDUl9EQkxfMikgLyohPCBUcmFuc2ZlciBpcyBkb25lIHRvIDIxIHJlZ2lzdGVycyBzdGFydGluZyBmcm9tIHRoZSBETUEgXAorICAgICAgICAgICAgICAgICAgICAgYnVyc3QgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfMjJUUkFOU0ZFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChUSU1fRENSX0RCTF80IHwgVElNX0RDUl9EQkxfMiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBUSU1fRENSX0RCTF8wKSAvKiE8IFRyYW5zZmVyIGlzIGRvbmUgdG8gMjIgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gdGhlIERNQSBcCisgICAgICAgICAgICAgICAgICAgICBidXJzdCBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0xFTkdUSF8yM1RSQU5TRkVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKFRJTV9EQ1JfREJMXzQgfCBUSU1fRENSX0RCTF8yIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIFRJTV9EQ1JfREJMXzEpIC8qITwgVHJhbnNmZXIgaXMgZG9uZSB0byAyMyByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSB0aGUgRE1BIFwKKyAgICAgICAgICAgICAgICAgICAgIGJ1cnN0IGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzI0VFJBTlNGRVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoVElNX0RDUl9EQkxfNCB8IFRJTV9EQ1JfREJMXzIgfCBUSU1fRENSX0RCTF8xIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgVElNX0RDUl9EQkxfMCkgLyohPCBUcmFuc2ZlciBpcyBkb25lIHRvIDI0IHJlZ2lzdGVycyBzdGFydGluZyBmcm9tIHRoZSBETUEgXAorICAgICAgICAgICAgICAgICAgICAgYnVyc3QgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfMjVUUkFOU0ZFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChUSU1fRENSX0RCTF80IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBUSU1fRENSX0RCTF8zKSAvKiE8IFRyYW5zZmVyIGlzIGRvbmUgdG8gMjUgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gdGhlIERNQSBcCisgICAgICAgICAgICAgICAgICAgICBidXJzdCBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0xFTkdUSF8yNlRSQU5TRkVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKFRJTV9EQ1JfREJMXzQgfCBUSU1fRENSX0RCTF8zIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIFRJTV9EQ1JfREJMXzApIC8qITwgVHJhbnNmZXIgaXMgZG9uZSB0byAyNiByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSB0aGUgRE1BIFwKKyAgICAgICAgICAgICAgICAgICAgIGJ1cnN0IGJhc2UgYWRkcmVzcyAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX1RJTTFfVEkxX1JNUCAgVElNMSBUaW1lciBJbnB1dCBDaDEgUmVtYXAKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfVElNX1RJTTFfVEkxX1JNUF9HUElPIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBUSU0xIGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIEdQSU8gKi8KKyNkZWZpbmUgTExfVElNX1RJTTFfVEkxX1JNUF9DT01QMSBcCisgIFRJTV9USVNFTF9USTFTRUxfMCAvKiE8IFRJTTEgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDFfT1VUICovCisjZGVmaW5lIExMX1RJTV9USU0xX1RJMV9STVBfQ09NUDIgXAorICBUSU1fVElTRUxfVEkxU0VMXzEgLyohPCBUSU0xIGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVAyX09VVCAqLworI2RlZmluZSBMTF9USU1fVElNMV9USTFfUk1QX0NPTVAzIFwKKyAgKFRJTV9USVNFTF9USTFTRUxfMSB8ICAgICAgICAgICBcCisgICBUSU1fVElTRUxfVEkxU0VMXzApIC8qITwgVElNMSBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QM19PVVQgKi8KKyNkZWZpbmUgTExfVElNX1RJTTFfVEkxX1JNUF9DT01QNCBcCisgIFRJTV9USVNFTF9USTFTRUxfMiAvKiE8IFRJTTEgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDRfT1VUICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfVElNMl9USTFfUk1QICBUSU0yIFRpbWVyIElucHV0IENoMSBSZW1hcAorICogQHsKKyAqLworI2RlZmluZSBMTF9USU1fVElNMl9USTFfUk1QX0dQSU8gXAorICAweDAwMDAwMDAwVSAvKiE8IFRJTTIgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gR1BJTyAqLworI2RlZmluZSBMTF9USU1fVElNMl9USTFfUk1QX0NPTVAxIFwKKyAgVElNX1RJU0VMX1RJMVNFTF8wIC8qITwgVElNMiBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QMV9PVVQgKi8KKyNkZWZpbmUgTExfVElNX1RJTTJfVEkxX1JNUF9DT01QMiBcCisgIFRJTV9USVNFTF9USTFTRUxfMSAvKiE8IFRJTTIgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDJfT1VUICovCisjZGVmaW5lIExMX1RJTV9USU0yX1RJMV9STVBfQ09NUDMgXAorICAoVElNX1RJU0VMX1RJMVNFTF8xIHwgICAgICAgICAgIFwKKyAgIFRJTV9USVNFTF9USTFTRUxfMCkgLyohPCBUSU0yIGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVAzX09VVCAqLworI2RlZmluZSBMTF9USU1fVElNMl9USTFfUk1QX0NPTVA0IFwKKyAgVElNX1RJU0VMX1RJMVNFTF8yIC8qITwgVElNMiBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QNF9PVVQgKi8KKyNpZiBkZWZpbmVkKENPTVA1KQorI2RlZmluZSBMTF9USU1fVElNMl9USTFfUk1QX0NPTVA1IFwKKyAgKFRJTV9USVNFTF9USTFTRUxfMiB8ICAgICAgICAgICBcCisgICBUSU1fVElTRUxfVEkxU0VMXzApIC8qITwgVElNMiBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QNV9PVVQgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAgLyogQ09NUDUgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19USU0yX1RJMl9STVAgIFRJTTIgVGltZXIgSW5wdXQgQ2gyIFJlbWFwCisgKiBAeworICovCisjZGVmaW5lIExMX1RJTV9USU0yX1RJMl9STVBfR1BJTyBcCisgIDB4MDAwMDAwMDBVIC8qITwgVElNMiBpbnB1dCAyIGlzIGNvbm5lY3RlZCB0byBHUElPICovCisjZGVmaW5lIExMX1RJTV9USU0yX1RJMl9STVBfQ09NUDEgXAorICBUSU1fVElTRUxfVEkyU0VMXzAgLyohPCBUSU0yIGlucHV0IDIgaXMgY29ubmVjdGVkIHRvIENPTVAxX09VVCAqLworI2RlZmluZSBMTF9USU1fVElNMl9USTJfUk1QX0NPTVAyIFwKKyAgVElNX1RJU0VMX1RJMlNFTF8xIC8qITwgVElNMiBpbnB1dCAyIGlzIGNvbm5lY3RlZCB0byBDT01QMl9PVVQgKi8KKyNkZWZpbmUgTExfVElNX1RJTTJfVEkyX1JNUF9DT01QMyBcCisgIChUSU1fVElTRUxfVEkyU0VMXzEgfCAgICAgICAgICAgXAorICAgVElNX1RJU0VMX1RJMlNFTF8wKSAvKiE8IFRJTTIgaW5wdXQgMiBpcyBjb25uZWN0ZWQgdG8gQ09NUDNfT1VUICovCisjZGVmaW5lIExMX1RJTV9USU0yX1RJMl9STVBfQ09NUDQgXAorICBUSU1fVElTRUxfVEkyU0VMXzIgLyohPCBUSU0yIGlucHV0IDIgaXMgY29ubmVjdGVkIHRvIENPTVA0X09VVCAqLworI2lmIGRlZmluZWQoQ09NUDYpCisjZGVmaW5lIExMX1RJTV9USU0yX1RJMl9STVBfQ09NUDYgXAorICAoVElNX1RJU0VMX1RJMlNFTF8yIHwgICAgICAgICAgIFwKKyAgIFRJTV9USVNFTF9USTJTRUxfMCkgLyohPCBUSU0yIGlucHV0IDIgaXMgY29ubmVjdGVkIHRvIENPTVA2X09VVCAqLworI2VuZGlmICAgICAgICAgICAgICAgICAvKiBDT01QNiAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX1RJTTJfVEkzX1JNUCAgVElNMiBUaW1lciBJbnB1dCBDaDMgUmVtYXAKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfVElNX1RJTTJfVEkzX1JNUF9HUElPIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBUSU0yIGlucHV0IDMgaXMgY29ubmVjdGVkIHRvIEdQSU8gKi8KKyNkZWZpbmUgTExfVElNX1RJTTJfVEkzX1JNUF9DT01QNCBcCisgIFRJTV9USVNFTF9USTNTRUxfMCAvKiE8IFRJTTIgaW5wdXQgMyBpcyBjb25uZWN0ZWQgdG8gQ09NUDRfT1VUICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfVElNMl9USTRfUk1QICBUSU0yIFRpbWVyIElucHV0IENoNCBSZW1hcAorICogQHsKKyAqLworI2RlZmluZSBMTF9USU1fVElNMl9USTRfUk1QX0dQSU8gXAorICAweDAwMDAwMDAwVSAvKiE8IFRJTTIgaW5wdXQgNCBpcyBjb25uZWN0ZWQgdG8gR1BJTyAqLworI2RlZmluZSBMTF9USU1fVElNMl9USTRfUk1QX0NPTVAxIFwKKyAgVElNX1RJU0VMX1RJNFNFTF8wIC8qITwgVElNMiBpbnB1dCA0IGlzIGNvbm5lY3RlZCB0byBDT01QMV9PVVQgKi8KKyNkZWZpbmUgTExfVElNX1RJTTJfVEk0X1JNUF9DT01QMiBcCisgIFRJTV9USVNFTF9USTRTRUxfMSAvKiE8IFRJTTIgaW5wdXQgNCBpcyBjb25uZWN0ZWQgdG8gQ09NUDJfT1VUICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfVElNM19USTFfUk1QICBUSU0zIFRpbWVyIElucHV0IENoMSBSZW1hcAorICogQHsKKyAqLworI2RlZmluZSBMTF9USU1fVElNM19USTFfUk1QX0dQSU8gXAorICAweDAwMDAwMDAwVSAvKiE8IFRJTTMgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gR1BJTyAqLworI2RlZmluZSBMTF9USU1fVElNM19USTFfUk1QX0NPTVAxIFwKKyAgVElNX1RJU0VMX1RJMVNFTF8wIC8qITwgVElNMyBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QMV9PVVQgKi8KKyNkZWZpbmUgTExfVElNX1RJTTNfVEkxX1JNUF9DT01QMiBcCisgIFRJTV9USVNFTF9USTFTRUxfMSAvKiE8IFRJTTMgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDJfT1VUICovCisjZGVmaW5lIExMX1RJTV9USU0zX1RJMV9STVBfQ09NUDMgXAorICAoVElNX1RJU0VMX1RJMVNFTF8xIHwgICAgICAgICAgIFwKKyAgIFRJTV9USVNFTF9USTFTRUxfMCkgLyohPCBUSU0zIGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVAzX09VVCAqLworI2RlZmluZSBMTF9USU1fVElNM19USTFfUk1QX0NPTVA0IFwKKyAgVElNX1RJU0VMX1RJMVNFTF8yIC8qITwgVElNMyBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QNF9PVVQgKi8KKyNpZiBkZWZpbmVkKENPTVA1KQorI2RlZmluZSBMTF9USU1fVElNM19USTFfUk1QX0NPTVA1IFwKKyAgKFRJTV9USVNFTF9USTFTRUxfMiB8ICAgICAgICAgICBcCisgICBUSU1fVElTRUxfVEkxU0VMXzApIC8qITwgVElNMyBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QNV9PVVQgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAgLyogQ09NUDUgKi8KKyNpZiBkZWZpbmVkKENPTVA2KQorI2RlZmluZSBMTF9USU1fVElNM19USTFfUk1QX0NPTVA2IFwKKyAgKFRJTV9USVNFTF9USTFTRUxfMiB8ICAgICAgICAgICBcCisgICBUSU1fVElTRUxfVEkxU0VMXzEpIC8qITwgVElNMyBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QNl9PVVQgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAgLyogQ09NUDYgKi8KKyNpZiBkZWZpbmVkKENPTVA3KQorI2RlZmluZSBMTF9USU1fVElNM19USTFfUk1QX0NPTVA3ICAgICAgICAgICAgXAorICAoVElNX1RJU0VMX1RJMVNFTF8yIHwgVElNX1RJU0VMX1RJMVNFTF8xIHwgXAorICAgVElNX1RJU0VMX1RJMVNFTF8wKSAvKiE8IFRJTTMgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDdfT1VUICovCisjZW5kaWYgICAgICAgICAgICAgICAgIC8qIENPTVA3ICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfVElNM19USTJfUk1QICBUSU0zIFRpbWVyIElucHV0IENoMiBSZW1hcAorICogQHsKKyAqLworI2RlZmluZSBMTF9USU1fVElNM19USTJfUk1QX0dQSU8gXAorICAweDAwMDAwMDAwVSAvKiE8IFRJTTMgaW5wdXQgMiBpcyBjb25uZWN0ZWQgdG8gR1BJTyAqLworI2RlZmluZSBMTF9USU1fVElNM19USTJfUk1QX0NPTVAxIFwKKyAgVElNX1RJU0VMX1RJMlNFTF8wIC8qITwgVElNMyBpbnB1dCAyIGlzIGNvbm5lY3RlZCB0byBDT01QMV9PVVQgKi8KKyNkZWZpbmUgTExfVElNX1RJTTNfVEkyX1JNUF9DT01QMiBcCisgIFRJTV9USVNFTF9USTJTRUxfMSAvKiE8IFRJTTMgaW5wdXQgMiBpcyBjb25uZWN0ZWQgdG8gQ09NUDJfT1VUICovCisjZGVmaW5lIExMX1RJTV9USU0zX1RJMl9STVBfQ09NUDMgXAorICAoVElNX1RJU0VMX1RJMlNFTF8xIHwgICAgICAgICAgIFwKKyAgIFRJTV9USVNFTF9USTJTRUxfMCkgLyohPCBUSU0zIGlucHV0IDIgaXMgY29ubmVjdGVkIHRvIENPTVAzX09VVCAqLworI2RlZmluZSBMTF9USU1fVElNM19USTJfUk1QX0NPTVA0IFwKKyAgVElNX1RJU0VMX1RJMlNFTF8yIC8qITwgVElNMyBpbnB1dCAyIGlzIGNvbm5lY3RlZCB0byBDT01QNF9PVVQgKi8KKyNpZiBkZWZpbmVkKENPTVA1KQorI2RlZmluZSBMTF9USU1fVElNM19USTJfUk1QX0NPTVA1IFwKKyAgKFRJTV9USVNFTF9USTJTRUxfMiB8ICAgICAgICAgICBcCisgICBUSU1fVElTRUxfVEkyU0VMXzApIC8qITwgVElNMyBpbnB1dCAyIGlzIGNvbm5lY3RlZCB0byBDT01QNV9PVVQgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAgLyogQ09NUDUgKi8KKyNpZiBkZWZpbmVkKENPTVA2KQorI2RlZmluZSBMTF9USU1fVElNM19USTJfUk1QX0NPTVA2IFwKKyAgKFRJTV9USVNFTF9USTJTRUxfMiB8ICAgICAgICAgICBcCisgICBUSU1fVElTRUxfVEkyU0VMXzEpIC8qITwgVElNMyBpbnB1dCAyIGlzIGNvbm5lY3RlZCB0byBDT01QNl9PVVQgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAgLyogQ09NUDYgKi8KKyNpZiBkZWZpbmVkKENPTVA3KQorI2RlZmluZSBMTF9USU1fVElNM19USTJfUk1QX0NPTVA3ICAgICAgICAgICAgXAorICAoVElNX1RJU0VMX1RJMlNFTF8yIHwgVElNX1RJU0VMX1RJMlNFTF8xIHwgXAorICAgVElNX1RJU0VMX1RJMlNFTF8wKSAvKiE8IFRJTTMgaW5wdXQgMiBpcyBjb25uZWN0ZWQgdG8gQ09NUDdfT1VUICovCisjZW5kaWYgICAgICAgICAgICAgICAgIC8qIENPTVA3ICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfVElNM19USTNfUk1QICBUSU0zIFRpbWVyIElucHV0IENoMyBSZW1hcAorICogQHsKKyAqLworI2RlZmluZSBMTF9USU1fVElNM19USTNfUk1QX0dQSU8gXAorICAweDAwMDAwMDAwVSAvKiE8IFRJTTMgaW5wdXQgMyBpcyBjb25uZWN0ZWQgdG8gR1BJTyAqLworI2RlZmluZSBMTF9USU1fVElNM19USTNfUk1QX0NPTVAzIFwKKyAgVElNX1RJU0VMX1RJM1NFTF8wIC8qITwgVElNMyBpbnB1dCAzIGlzIGNvbm5lY3RlZCB0byBDT01QM19PVVQgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19USU00X1RJMV9STVAgIFRJTTQgVGltZXIgSW5wdXQgQ2gxIFJlbWFwCisgKiBAeworICovCisjZGVmaW5lIExMX1RJTV9USU00X1RJMV9STVBfR1BJTyBcCisgIDB4MDAwMDAwMDBVIC8qITwgVElNNCBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBHUElPICovCisjZGVmaW5lIExMX1RJTV9USU00X1RJMV9STVBfQ09NUDEgXAorICBUSU1fVElTRUxfVEkxU0VMXzAgLyohPCBUSU00IGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVAxX09VVCAqLworI2RlZmluZSBMTF9USU1fVElNNF9USTFfUk1QX0NPTVAyIFwKKyAgVElNX1RJU0VMX1RJMVNFTF8xIC8qITwgVElNNCBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QMl9PVVQgKi8KKyNkZWZpbmUgTExfVElNX1RJTTRfVEkxX1JNUF9DT01QMyBcCisgIChUSU1fVElTRUxfVEkxU0VMXzEgfCAgICAgICAgICAgXAorICAgVElNX1RJU0VMX1RJMVNFTF8wKSAvKiE8IFRJTTQgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDNfT1VUICovCisjZGVmaW5lIExMX1RJTV9USU00X1RJMV9STVBfQ09NUDQgXAorICBUSU1fVElTRUxfVEkxU0VMXzIgLyohPCBUSU00IGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVA0X09VVCAqLworI2lmIGRlZmluZWQoQ09NUDUpCisjZGVmaW5lIExMX1RJTV9USU00X1RJMV9STVBfQ09NUDUgXAorICAoVElNX1RJU0VMX1RJMVNFTF8yIHwgICAgICAgICAgIFwKKyAgIFRJTV9USVNFTF9USTFTRUxfMCkgLyohPCBUSU00IGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVA1X09VVCAqLworI2VuZGlmICAgICAgICAgICAgICAgICAvKiBDT01QNSAqLworI2lmIGRlZmluZWQoQ09NUDYpCisjZGVmaW5lIExMX1RJTV9USU00X1RJMV9STVBfQ09NUDYgXAorICAoVElNX1RJU0VMX1RJMVNFTF8yIHwgICAgICAgICAgIFwKKyAgIFRJTV9USVNFTF9USTFTRUxfMSkgLyohPCBUSU00IGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVA2X09VVCAqLworI2VuZGlmICAgICAgICAgICAgICAgICAvKiBDT01QNiAqLworI2lmIGRlZmluZWQoQ09NUDcpCisjZGVmaW5lIExMX1RJTV9USU00X1RJMV9STVBfQ09NUDcgICAgICAgICAgICBcCisgIChUSU1fVElTRUxfVEkxU0VMXzIgfCBUSU1fVElTRUxfVEkxU0VMXzEgfCBcCisgICBUSU1fVElTRUxfVEkxU0VMXzApIC8qITwgVElNNCBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QN19PVVQgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAgLyogQ09NUDcgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19USU00X1RJMl9STVAgIFRJTTQgVGltZXIgSW5wdXQgQ2gyIFJlbWFwCisgKiBAeworICovCisjZGVmaW5lIExMX1RJTV9USU00X1RJMl9STVBfR1BJTyBcCisgIDB4MDAwMDAwMDBVIC8qITwgVElNNCBpbnB1dCAyIGlzIGNvbm5lY3RlZCB0byBHUElPICovCisjZGVmaW5lIExMX1RJTV9USU00X1RJMl9STVBfQ09NUDEgXAorICBUSU1fVElTRUxfVEkyU0VMXzAgLyohPCBUSU00IGlucHV0IDIgaXMgY29ubmVjdGVkIHRvIENPTVAxX09VVCAqLworI2RlZmluZSBMTF9USU1fVElNNF9USTJfUk1QX0NPTVAyIFwKKyAgVElNX1RJU0VMX1RJMlNFTF8xIC8qITwgVElNNCBpbnB1dCAyIGlzIGNvbm5lY3RlZCB0byBDT01QMl9PVVQgKi8KKyNkZWZpbmUgTExfVElNX1RJTTRfVEkyX1JNUF9DT01QMyBcCisgIChUSU1fVElTRUxfVEkyU0VMXzEgfCAgICAgICAgICAgXAorICAgVElNX1RJU0VMX1RJMlNFTF8wKSAvKiE8IFRJTTQgaW5wdXQgMiBpcyBjb25uZWN0ZWQgdG8gQ09NUDNfT1VUICovCisjZGVmaW5lIExMX1RJTV9USU00X1RJMl9STVBfQ09NUDQgXAorICBUSU1fVElTRUxfVEkyU0VMXzIgLyohPCBUSU00IGlucHV0IDIgaXMgY29ubmVjdGVkIHRvIENPTVA0X09VVCAqLworI2lmIGRlZmluZWQoQ09NUDUpCisjZGVmaW5lIExMX1RJTV9USU00X1RJMl9STVBfQ09NUDUgXAorICAoVElNX1RJU0VMX1RJMlNFTF8yIHwgICAgICAgICAgIFwKKyAgIFRJTV9USVNFTF9USTJTRUxfMCkgLyohPCBUSU00IGlucHV0IDIgaXMgY29ubmVjdGVkIHRvIENPTVA1X09VVCAqLworI2VuZGlmICAgICAgICAgICAgICAgICAvKiBDT01QNSAqLworI2lmIGRlZmluZWQoQ09NUDYpCisjZGVmaW5lIExMX1RJTV9USU00X1RJMl9STVBfQ09NUDYgXAorICAoVElNX1RJU0VMX1RJMlNFTF8yIHwgICAgICAgICAgIFwKKyAgIFRJTV9USVNFTF9USTJTRUxfMSkgLyohPCBUSU00IGlucHV0IDIgaXMgY29ubmVjdGVkIHRvIENPTVA2X09VVCAqLworI2VuZGlmICAgICAgICAgICAgICAgICAvKiBDT01QNiAqLworI2lmIGRlZmluZWQoQ09NUDcpCisjZGVmaW5lIExMX1RJTV9USU00X1RJMl9STVBfQ09NUDcgICAgICAgICAgICBcCisgIChUSU1fVElTRUxfVEkyU0VMXzIgfCBUSU1fVElTRUxfVEkyU0VMXzEgfCBcCisgICBUSU1fVElTRUxfVEkyU0VMXzApIC8qITwgVElNNCBpbnB1dCAyIGlzIGNvbm5lY3RlZCB0byBDT01QN19PVVQgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAgLyogQ09NUDcgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19USU00X1RJM19STVAgIFRJTTQgVGltZXIgSW5wdXQgQ2gzIFJlbWFwCisgKiBAeworICovCisjZGVmaW5lIExMX1RJTV9USU00X1RJM19STVBfR1BJTyBcCisgIDB4MDAwMDAwMDBVIC8qITwgVElNNCBpbnB1dCAzIGlzIGNvbm5lY3RlZCB0byBHUElPICovCisjaWYgZGVmaW5lZChDT01QNSkKKyNkZWZpbmUgTExfVElNX1RJTTRfVEkzX1JNUF9DT01QNSBcCisgIFRJTV9USVNFTF9USTNTRUxfMCAvKiE8IFRJTTQgaW5wdXQgMyBpcyBjb25uZWN0ZWQgdG8gQ09NUDVfT1VUICovCisjZW5kaWYgICAgICAgICAgICAgICAvKiBDT01QNSAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX1RJTTRfVEk0X1JNUCAgVElNNCBUaW1lciBJbnB1dCBDaDQgUmVtYXAKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfVElNX1RJTTRfVEk0X1JNUF9HUElPIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBUSU00IGlucHV0IDQgaXMgY29ubmVjdGVkIHRvIEdQSU8gKi8KKyNpZiBkZWZpbmVkKENPTVA2KQorI2RlZmluZSBMTF9USU1fVElNNF9USTRfUk1QX0NPTVA2IFwKKyAgVElNX1RJU0VMX1RJNFNFTF8wIC8qITwgVElNNCBpbnB1dCA0IGlzIGNvbm5lY3RlZCB0byBDT01QNl9PVVQgKi8KKyNlbmRpZiAgICAgICAgICAgICAgIC8qIENPTVA2ICovCisvKioKKyAqIEB9CisgKi8KKworI2lmIGRlZmluZWQoVElNNSkKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX1RJTTVfVEkxX1JNUCAgVElNNSBUaW1lciBJbnB1dCBDaDEgUmVtYXAKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfVElNX1RJTTVfVEkxX1JNUF9HUElPIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBUSU01IGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIEdQSU8gKi8KKyNkZWZpbmUgTExfVElNX1RJTTVfVEkxX1JNUF9MU0kgXAorICBUSU1fVElTRUxfVEkxU0VMXzAgLyohPCBUSU01IGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIExTSSAqLworI2RlZmluZSBMTF9USU1fVElNNV9USTFfUk1QX0xTRSBcCisgIFRJTV9USVNFTF9USTFTRUxfMSAvKiE8IFRJTTUgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gTFNFICovCisjZGVmaW5lIExMX1RJTV9USU01X1RJMV9STVBfUlRDX1dLIFwKKyAgKFRJTV9USVNFTF9USTFTRUxfMSB8ICAgICAgICAgICAgXAorICAgVElNX1RJU0VMX1RJMVNFTF8wKSAvKiE8IFRJTTUgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gUlRDX1dBS0VVUCAqLworI2RlZmluZSBMTF9USU1fVElNNV9USTFfUk1QX0NPTVAxIFwKKyAgVElNX1RJU0VMX1RJMVNFTF8yIC8qITwgVElNNSBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QMV9PVVQgKi8KKyNkZWZpbmUgTExfVElNX1RJTTVfVEkxX1JNUF9DT01QMiBcCisgIChUSU1fVElTRUxfVEkxU0VMXzIgfCAgICAgICAgICAgXAorICAgVElNX1RJU0VMX1RJMVNFTF8wKSAvKiE8IFRJTTUgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDJfT1VUICovCisjZGVmaW5lIExMX1RJTV9USU01X1RJMV9STVBfQ09NUDMgXAorICAoVElNX1RJU0VMX1RJMVNFTF8yIHwgICAgICAgICAgIFwKKyAgIFRJTV9USVNFTF9USTFTRUxfMSkgLyohPCBUSU01IGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVAzX09VVCAqLworI2RlZmluZSBMTF9USU1fVElNNV9USTFfUk1QX0NPTVA0ICAgICAgICAgICAgXAorICAoVElNX1RJU0VMX1RJMVNFTF8yIHwgVElNX1RJU0VMX1RJMVNFTF8xIHwgXAorICAgVElNX1RJU0VMX1RJMVNFTF8wKSAvKiE8IFRJTTUgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDRfT1VUICovCisjaWYgZGVmaW5lZChDT01QNSkKKyNkZWZpbmUgTExfVElNX1RJTTVfVEkxX1JNUF9DT01QNSBcCisgIFRJTV9USVNFTF9USTFTRUxfMyAvKiE8IFRJTTUgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDVfT1VUICovCisjZW5kaWYgICAgICAgICAgICAgICAvKiBDT01QNSAqLworI2lmIGRlZmluZWQoQ09NUDYpCisjZGVmaW5lIExMX1RJTV9USU01X1RJMV9STVBfQ09NUDYgXAorICAoVElNX1RJU0VMX1RJMVNFTF8zIHwgICAgICAgICAgIFwKKyAgIFRJTV9USVNFTF9USTFTRUxfMCkgLyohPCBUSU01IGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVA2X09VVCAqLworI2VuZGlmICAgICAgICAgICAgICAgICAvKiBDT01QNiAqLworI2lmIGRlZmluZWQoQ09NUDcpCisjZGVmaW5lIExMX1RJTV9USU01X1RJMV9STVBfQ09NUDcgXAorICAoVElNX1RJU0VMX1RJMVNFTF8zIHwgICAgICAgICAgIFwKKyAgIFRJTV9USVNFTF9USTFTRUxfMSkgLyohPCBUSU01IGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVA3X09VVCAqLworI2VuZGlmICAgICAgICAgICAgICAgICAvKiBDT01QNyAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX1RJTTVfVEkyX1JNUCAgVElNNSBUaW1lciBJbnB1dCBDaDIgUmVtYXAKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfVElNX1RJTTVfVEkyX1JNUF9HUElPIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBUSU01IGlucHV0IDIgaXMgY29ubmVjdGVkIHRvIEdQSU8gKi8KKyNkZWZpbmUgTExfVElNX1RJTTVfVEkyX1JNUF9DT01QMSBcCisgIFRJTV9USVNFTF9USTJTRUxfMCAvKiE8IFRJTTUgaW5wdXQgMiBpcyBjb25uZWN0ZWQgdG8gQ09NUDFfT1VUICovCisjZGVmaW5lIExMX1RJTV9USU01X1RJMl9STVBfQ09NUDIgXAorICBUSU1fVElTRUxfVEkyU0VMXzEgLyohPCBUSU01IGlucHV0IDIgaXMgY29ubmVjdGVkIHRvIENPTVAyX09VVCAqLworI2RlZmluZSBMTF9USU1fVElNNV9USTJfUk1QX0NPTVAzIFwKKyAgKFRJTV9USVNFTF9USTJTRUxfMSB8ICAgICAgICAgICBcCisgICBUSU1fVElTRUxfVEkyU0VMXzApIC8qITwgVElNNSBpbnB1dCAyIGlzIGNvbm5lY3RlZCB0byBDT01QM19PVVQgKi8KKyNkZWZpbmUgTExfVElNX1RJTTVfVEkyX1JNUF9DT01QNCBcCisgIFRJTV9USVNFTF9USTJTRUxfMiAvKiE8IFRJTTUgaW5wdXQgMiBpcyBjb25uZWN0ZWQgdG8gQ09NUDRfT1VUICovCisjaWYgZGVmaW5lZChDT01QNSkKKyNkZWZpbmUgTExfVElNX1RJTTVfVEkyX1JNUF9DT01QNSBcCisgIChUSU1fVElTRUxfVEkyU0VMXzIgfCAgICAgICAgICAgXAorICAgVElNX1RJU0VMX1RJMlNFTF8wKSAvKiE8IFRJTTUgaW5wdXQgMiBpcyBjb25uZWN0ZWQgdG8gQ09NUDVfT1VUICovCisjZW5kaWYgICAgICAgICAgICAgICAgIC8qIENPTVA1ICovCisjaWYgZGVmaW5lZChDT01QNikKKyNkZWZpbmUgTExfVElNX1RJTTVfVEkyX1JNUF9DT01QNiBcCisgIChUSU1fVElTRUxfVEkyU0VMXzIgfCAgICAgICAgICAgXAorICAgVElNX1RJU0VMX1RJMlNFTF8xKSAvKiE8IFRJTTUgaW5wdXQgMiBpcyBjb25uZWN0ZWQgdG8gQ09NUDZfT1VUICovCisjZW5kaWYgICAgICAgICAgICAgICAgIC8qIENPTVA2ICovCisjaWYgZGVmaW5lZChDT01QNykKKyNkZWZpbmUgTExfVElNX1RJTTVfVEkyX1JNUF9DT01QNyAgICAgICAgICAgIFwKKyAgKFRJTV9USVNFTF9USTJTRUxfMiB8IFRJTV9USVNFTF9USTJTRUxfMSB8IFwKKyAgIFRJTV9USVNFTF9USTJTRUxfMCkgLyohPCBUSU01IGlucHV0IDIgaXMgY29ubmVjdGVkIHRvIENPTVA3X09VVCAqLworI2VuZGlmICAgICAgICAgICAgICAgICAvKiBDT01QNyAqLworLyoqCisgKiBAfQorICovCisjZW5kaWYgLyogVElNNSAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19USU04X1RJMV9STVAgIFRJTTggVGltZXIgSW5wdXQgQ2gxIFJlbWFwCisgKiBAeworICovCisjZGVmaW5lIExMX1RJTV9USU04X1RJMV9STVBfR1BJTyBcCisgIDB4MDAwMDAwMDBVIC8qITwgVElNOCBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBHUElPICovCisjZGVmaW5lIExMX1RJTV9USU04X1RJMV9STVBfQ09NUDEgXAorICBUSU1fVElTRUxfVEkxU0VMXzAgLyohPCBUSU04IGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVAxX09VVCAqLworI2RlZmluZSBMTF9USU1fVElNOF9USTFfUk1QX0NPTVAyIFwKKyAgVElNX1RJU0VMX1RJMVNFTF8xIC8qITwgVElNOCBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QMl9PVVQgKi8KKyNkZWZpbmUgTExfVElNX1RJTThfVEkxX1JNUF9DT01QMyBcCisgIChUSU1fVElTRUxfVEkxU0VMXzEgfCAgICAgICAgICAgXAorICAgVElNX1RJU0VMX1RJMVNFTF8wKSAvKiE8IFRJTTggaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDNfT1VUICovCisjZGVmaW5lIExMX1RJTV9USU04X1RJMV9STVBfQ09NUDQgXAorICBUSU1fVElTRUxfVEkxU0VMXzIgLyohPCBUSU04IGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVA0X09VVCAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX1RJTTE1X1RJMV9STVAgIFRJTTE1IFRpbWVyIElucHV0IENoMSBSZW1hcAorICogQHsKKyAqLworI2RlZmluZSBMTF9USU1fVElNMTVfVEkxX1JNUF9HUElPIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBUSU0xNSBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBHUElPICovCisjZGVmaW5lIExMX1RJTV9USU0xNV9USTFfUk1QX0xTRSBcCisgIFRJTV9USVNFTF9USTFTRUxfMCAvKiE8IFRJTTE1IGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIExTRSAqLworI2RlZmluZSBMTF9USU1fVElNMTVfVEkxX1JNUF9DT01QMSBcCisgIFRJTV9USVNFTF9USTFTRUxfMSAvKiE8IFRJTTE1IGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVAxX09VVCAqLworI2RlZmluZSBMTF9USU1fVElNMTVfVEkxX1JNUF9DT01QMiBcCisgIChUSU1fVElTRUxfVEkxU0VMXzEgfCAgICAgICAgICAgIFwKKyAgIFRJTV9USVNFTF9USTFTRUxfMCkgLyohPCBUSU0xNSBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QMl9PVVQgKi8KKyNpZiBkZWZpbmVkKENPTVA1KQorI2RlZmluZSBMTF9USU1fVElNMTVfVEkxX1JNUF9DT01QNSBcCisgIFRJTV9USVNFTF9USTFTRUxfMiAvKiE8IFRJTTE1IGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVA1X09VVCAqLworI2VuZGlmICAgICAgICAgICAgICAgLyogQ09NUDUgKi8KKyNpZiBkZWZpbmVkKENPTVA3KQorI2RlZmluZSBMTF9USU1fVElNMTVfVEkxX1JNUF9DT01QNyBcCisgIChUSU1fVElTRUxfVEkxU0VMXzIgfCAgICAgICAgICAgIFwKKyAgIFRJTV9USVNFTF9USTFTRUxfMCkgLyohPCBUSU0xNSBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QN19PVVQgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAgLyogQ09NUDcgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19USU0xNV9USTJfUk1QICBUSU0xNSBUaW1lciBJbnB1dCBDaDIgUmVtYXAKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfVElNX1RJTTE1X1RJMl9STVBfR1BJTyBcCisgIDB4MDAwMDAwMDBVIC8qITwgVElNMTUgaW5wdXQgMiBpcyBjb25uZWN0ZWQgdG8gR1BJTyAqLworI2RlZmluZSBMTF9USU1fVElNMTVfVEkyX1JNUF9DT01QMiBcCisgIFRJTV9USVNFTF9USTJTRUxfMCAvKiE8IFRJTTE1IGlucHV0IDIgaXMgY29ubmVjdGVkIHRvIENPTVAyX09VVCAqLworI2RlZmluZSBMTF9USU1fVElNMTVfVEkyX1JNUF9DT01QMyBcCisgIFRJTV9USVNFTF9USTJTRUxfMSAvKiE8IFRJTTE1IGlucHV0IDIgaXMgY29ubmVjdGVkIHRvIENPTVAzX09VVCAqLworI2lmIGRlZmluZWQoQ09NUDYpCisjZGVmaW5lIExMX1RJTV9USU0xNV9USTJfUk1QX0NPTVA2IFwKKyAgKFRJTV9USVNFTF9USTJTRUxfMSB8ICAgICAgICAgICAgXAorICAgVElNX1RJU0VMX1RJMlNFTF8wKSAvKiE8IFRJTTE1IGlucHV0IDIgaXMgY29ubmVjdGVkIHRvIENPTVA2X09VVCAqLworI2VuZGlmICAgICAgICAgICAgICAgICAvKiBDT01QNiAqLworI2lmIGRlZmluZWQoQ09NUDcpCisjZGVmaW5lIExMX1RJTV9USU0xNV9USTJfUk1QX0NPTVA3IFwKKyAgVElNX1RJU0VMX1RJMlNFTF8yIC8qITwgVElNMTUgaW5wdXQgMiBpcyBjb25uZWN0ZWQgdG8gQ09NUDdfT1VUICovCisjZW5kaWYgICAgICAgICAgICAgICAvKiBDT01QNyAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX1RJTTE2X1RJMV9STVAgIFRJTTE2IFRpbWVyIElucHV0IENoMSBSZW1hcAorICogQHsKKyAqLworI2RlZmluZSBMTF9USU1fVElNMTZfVEkxX1JNUF9HUElPIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBUSU0xNiBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBHUElPICovCisjaWYgZGVmaW5lZChDT01QNikKKyNkZWZpbmUgTExfVElNX1RJTTE2X1RJMV9STVBfQ09NUDYgXAorICBUSU1fVElTRUxfVEkxU0VMXzAgLyohPCBUSU0xNiBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QNl9PVVQgKi8KKyNlbmRpZiAgICAgICAgICAgICAgIC8qIENPTVA2ICovCisjZGVmaW5lIExMX1RJTV9USU0xNl9USTFfUk1QX01DTyBcCisgIFRJTV9USVNFTF9USTFTRUxfMSAvKiE8IFRJTTE2IGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIE1DTyAqLworI2RlZmluZSBMTF9USU1fVElNMTZfVEkxX1JNUF9IU0VfMzIgXAorICAoVElNX1RJU0VMX1RJMVNFTF8xIHwgICAgICAgICAgICAgXAorICAgVElNX1RJU0VMX1RJMVNFTF8wKSAvKiE8IFRJTTE2IGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIEhTRS8zMiAqLworI2RlZmluZSBMTF9USU1fVElNMTZfVEkxX1JNUF9SVENfV0sgXAorICBUSU1fVElTRUxfVEkxU0VMXzIgLyohPCBUSU0xNiBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBSVENfV0FLRVVQICovCisjZGVmaW5lIExMX1RJTV9USU0xNl9USTFfUk1QX0xTRSBcCisgIChUSU1fVElTRUxfVEkxU0VMXzIgfCAgICAgICAgICBcCisgICBUSU1fVElTRUxfVEkxU0VMXzApIC8qITwgVElNMTYgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gTFNFICovCisjZGVmaW5lIExMX1RJTV9USU0xNl9USTFfUk1QX0xTSSBcCisgIChUSU1fVElTRUxfVEkxU0VMXzIgfCAgICAgICAgICBcCisgICBUSU1fVElTRUxfVEkxU0VMXzEpIC8qITwgVElNMTYgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gTFNJICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfVElNMTdfVEkxX1JNUCAgVElNMTcgVGltZXIgSW5wdXQgQ2gxIFJlbWFwCisgKiBAeworICovCisjZGVmaW5lIExMX1RJTV9USU0xN19USTFfUk1QX0dQSU8gXAorICAweDAwMDAwMDAwVSAvKiE8IFRJTTE3IGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIEdQSU8gKi8KKyNpZiBkZWZpbmVkKENPTVA1KQorI2RlZmluZSBMTF9USU1fVElNMTdfVEkxX1JNUF9DT01QNSBcCisgIFRJTV9USVNFTF9USTFTRUxfMCAvKiE8IFRJTTE3IGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVA1X09VVCAqLworI2VuZGlmICAgICAgICAgICAgICAgLyogQ09NUDUgKi8KKyNkZWZpbmUgTExfVElNX1RJTTE3X1RJMV9STVBfTUNPIFwKKyAgVElNX1RJU0VMX1RJMVNFTF8xIC8qITwgVElNMTcgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gTUNPICovCisjZGVmaW5lIExMX1RJTV9USU0xN19USTFfUk1QX0hTRV8zMiBcCisgIChUSU1fVElTRUxfVEkxU0VMXzEgfCAgICAgICAgICAgICBcCisgICBUSU1fVElTRUxfVEkxU0VMXzApIC8qITwgVElNMTcgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gSFNFLzMyICovCisjZGVmaW5lIExMX1RJTV9USU0xN19USTFfUk1QX1JUQ19XSyBcCisgIFRJTV9USVNFTF9USTFTRUxfMiAvKiE8IFRJTTE3IGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIFJUQ19XQUtFVVAgKi8KKyNkZWZpbmUgTExfVElNX1RJTTE3X1RJMV9STVBfTFNFIFwKKyAgKFRJTV9USVNFTF9USTFTRUxfMiB8ICAgICAgICAgIFwKKyAgIFRJTV9USVNFTF9USTFTRUxfMCkgLyohPCBUSU0xNyBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBMU0UgKi8KKyNkZWZpbmUgTExfVElNX1RJTTE3X1RJMV9STVBfTFNJIFwKKyAgKFRJTV9USVNFTF9USTFTRUxfMiB8ICAgICAgICAgIFwKKyAgIFRJTV9USVNFTF9USTFTRUxfMSkgLyohPCBUSU0xNyBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBMU0kgKi8KKy8qKgorICogQH0KKyAqLworCisjaWYgZGVmaW5lZChUSU0yMCkKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX1RJTTIwX1RJMV9STVAgIFRJTTIwIFRpbWVyIElucHV0IENoMSBSZW1hcAorICogQHsKKyAqLworI2RlZmluZSBMTF9USU1fVElNMjBfVEkxX1JNUF9HUElPIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBUSU0yMCBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBHUElPICovCisjZGVmaW5lIExMX1RJTV9USU0yMF9USTFfUk1QX0NPTVAxIFwKKyAgVElNX1RJU0VMX1RJMVNFTF8wIC8qITwgVElNMjAgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDFfT1VUICovCisjZGVmaW5lIExMX1RJTV9USU0yMF9USTFfUk1QX0NPTVAyIFwKKyAgVElNX1RJU0VMX1RJMVNFTF8xIC8qITwgVElNMjAgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDJfT1VUICovCisjZGVmaW5lIExMX1RJTV9USU0yMF9USTFfUk1QX0NPTVAzIFwKKyAgKFRJTV9USVNFTF9USTFTRUxfMSB8ICAgICAgICAgICAgXAorICAgVElNX1RJU0VMX1RJMVNFTF8wKSAvKiE8IFRJTTIwIGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVAzX09VVCAqLworI2RlZmluZSBMTF9USU1fVElNMjBfVEkxX1JNUF9DT01QNCBcCisgIFRJTV9USVNFTF9USTFTRUxfMiAvKiE8IFRJTTIwIGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVA0X09VVCAqLworLyoqCisgKiBAfQorICovCisjZW5kaWYgLyogVElNMjAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfT0NSRUZfQ0xSX0lOVCBPQ1JFRiBjbGVhciBpbnB1dCBzZWxlY3Rpb24KKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfVElNX09DUkVGX0NMUl9JTlRfRVRSIFwKKyAgT0NSRUZfQ0xFQVJfU0VMRUNUX01zayAvKiE8IE9DUkVGX0NMUl9JTlQgaXMgY29ubmVjdGVkIHRvIEVUUkYgKi8KKyNkZWZpbmUgTExfVElNX09DUkVGX0NMUl9JTlRfQ09NUDEgXAorICAweDAwMDAwMDAwVSAvKiE8IE9DUkVGIGNsZWFyIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QMV9PVVQgKi8KKyNkZWZpbmUgTExfVElNX09DUkVGX0NMUl9JTlRfQ09NUDIgXAorICBUSU0xX0FGMl9PQ1JTRUxfMCAvKiE8IE9DUkVGIGNsZWFyIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QMl9PVVQgKi8KKyNkZWZpbmUgTExfVElNX09DUkVGX0NMUl9JTlRfQ09NUDMgXAorICBUSU0xX0FGMl9PQ1JTRUxfMSAvKiE8IE9DUkVGIGNsZWFyIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QM19PVVQgKi8KKyNkZWZpbmUgTExfVElNX09DUkVGX0NMUl9JTlRfQ09NUDQgXAorICAoVElNMV9BRjJfT0NSU0VMXzEgfCAgICAgICAgICAgICBcCisgICBUSU0xX0FGMl9PQ1JTRUxfMCkgLyohPCBPQ1JFRiBjbGVhciBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDRfT1VUICovCisjaWYgZGVmaW5lZChDT01QNSkKKyNkZWZpbmUgTExfVElNX09DUkVGX0NMUl9JTlRfQ09NUDUgXAorICBUSU0xX0FGMl9PQ1JTRUxfMiAvKiE8IE9DUkVGIGNsZWFyIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QNV9PVVQgKi8KKyNlbmRpZiAgICAgICAgICAgICAgLyogQ09NUDUgKi8KKyNpZiBkZWZpbmVkKENPTVA2KQorI2RlZmluZSBMTF9USU1fT0NSRUZfQ0xSX0lOVF9DT01QNiBcCisgIChUSU0xX0FGMl9PQ1JTRUxfMiB8ICAgICAgICAgICAgIFwKKyAgIFRJTTFfQUYyX09DUlNFTF8wKSAvKiE8IE9DUkVGIGNsZWFyIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QNl9PVVQgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAvKiBDT01QNiAqLworI2lmIGRlZmluZWQoQ09NUDcpCisjZGVmaW5lIExMX1RJTV9PQ1JFRl9DTFJfSU5UX0NPTVA3IFwKKyAgKFRJTTFfQUYyX09DUlNFTF8yIHwgICAgICAgICAgICAgXAorICAgVElNMV9BRjJfT0NSU0VMXzEpIC8qITwgT0NSRUYgY2xlYXIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVA3X09VVCAqLworI2VuZGlmICAgICAgICAgICAgICAgIC8qIENPTVA3ICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfSU5ERVhfRElSIGluZGV4IGRpcmVjdGlvbiBzZWxlY3Rpb24KKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfVElNX0lOREVYX1VQX0RPV04gXAorICAweDAwMDAwMDAwVSAvKiE8IEluZGV4IHJlc2V0cyB0aGUgY291bnRlciB3aGF0ZXZlciB0aGUgZGlyZWN0aW9uICovCisjZGVmaW5lIExMX1RJTV9JTkRFWF9VUCBcCisgIFRJTV9FQ1JfSURJUl8wIC8qITwgSW5kZXggcmVzZXRzIHRoZSBjb3VudGVyIHdoZW4gdXAtY291bnRpbmcgb25seSAqLworI2RlZmluZSBMTF9USU1fSU5ERVhfRE9XTiBcCisgIFRJTV9FQ1JfSURJUl8xIC8qITwgSW5kZXggcmVzZXRzIHRoZSBjb3VudGVyIHdoZW4gZG93bi1jb3VudGluZyBvbmx5ICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfSU5ERVhfUE9TSVRJT04gaW5kZXggcG9zaXRpb25pbmcgc2VsZWN0aW9uCisgKiBAeworICovCisjZGVmaW5lIExMX1RJTV9JTkRFWF9QT1NJVElPTl9ET1dOX0RPV04gXAorICAweDAwMDAwMDAwVSAvKiE8IEluZGV4IHJlc2V0cyB0aGUgY291bnRlciB3aGVuIEFCID0gMDAgKi8KKyNkZWZpbmUgTExfVElNX0lOREVYX1BPU0lUSU9OX0RPV05fVVAgXAorICBUSU1fRUNSX0lQT1NfMCAvKiE8IEluZGV4IHJlc2V0cyB0aGUgY291bnRlciB3aGVuIEFCID0gMDEgKi8KKyNkZWZpbmUgTExfVElNX0lOREVYX1BPU0lUSU9OX1VQX0RPV04gXAorICBUSU1fRUNSX0lQT1NfMSAvKiE8IEluZGV4IHJlc2V0cyB0aGUgY291bnRlciB3aGVuIEFCID0gMTAgKi8KKyNkZWZpbmUgTExfVElNX0lOREVYX1BPU0lUSU9OX1VQX1VQIFwKKyAgKFRJTV9FQ1JfSVBPU18xIHwgICAgICAgICAgICAgICAgIFwKKyAgIFRJTV9FQ1JfSVBPU18wKSAvKiE8IEluZGV4IHJlc2V0cyB0aGUgY291bnRlciB3aGVuIEFCID0gMTEgKi8KKyNkZWZpbmUgTExfVElNX0lOREVYX1BPU0lUSU9OX0RPV04gXAorICAweDAwMDAwMDAwVSAvKiE8IEluZGV4IHJlc2V0cyB0aGUgY291bnRlciB3aGVuIGNsb2NrIGlzIDAgKi8KKyNkZWZpbmUgTExfVElNX0lOREVYX1BPU0lUSU9OX1VQIFwKKyAgVElNX0VDUl9JUE9TXzAgLyohPCBJbmRleCByZXNldHMgdGhlIGNvdW50ZXIgd2hlbiBjbG9jayBpcyAxICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfRklSU1RfSU5ERVggZmlyc3QgaW5kZXggc2VsZWN0aW9uCisgKiBAeworICovCisjZGVmaW5lIExMX1RJTV9JTkRFWF9BTEwgMHgwMDAwMDAwMFUgLyohPCBJbmRleCBpcyBhbHdheXMgYWN0aXZlICovCisjZGVmaW5lIExMX1RJTV9JTkRFWF9GSVJTVF9PTkxZIFwKKyAgVElNX0VDUl9GSURYIC8qITwgVGhlIGZpcnN0IEluZGV4IG9ubHkgcmVzZXRzIHRoZSBjb3VudGVyICovCisvKioKKyAqIEB9CisgKi8KKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX1BXUFJTQyBQdWxzZSBvbiBjb21wYXJlIHB1bHNlIHdpZHRoIHByZXNjYWxlcgorICogQHsKKyAqLworI2RlZmluZSBMTF9USU1fUFdQUlNDX1gxIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBQdWxzZSBvbiBjb21wYXJlIHB1bHNlIHdpZHRoIHByZXNjYWxlciAxICovCisjZGVmaW5lIExMX1RJTV9QV1BSU0NfWDIgXAorICBUSU1fRUNSX1BXUFJTQ18wIC8qITwgUHVsc2Ugb24gY29tcGFyZSBwdWxzZSB3aWR0aCBwcmVzY2FsZXIgMiAqLworI2RlZmluZSBMTF9USU1fUFdQUlNDX1g0IFwKKyAgVElNX0VDUl9QV1BSU0NfMSAvKiE8IFB1bHNlIG9uIGNvbXBhcmUgcHVsc2Ugd2lkdGggcHJlc2NhbGVyIDQgKi8KKyNkZWZpbmUgTExfVElNX1BXUFJTQ19YOCBcCisgIChUSU1fRUNSX1BXUFJTQ18xIHwgICAgXAorICAgVElNX0VDUl9QV1BSU0NfMCkgLyohPCBQdWxzZSBvbiBjb21wYXJlIHB1bHNlIHdpZHRoIHByZXNjYWxlciA4ICovCisjZGVmaW5lIExMX1RJTV9QV1BSU0NfWDE2IFwKKyAgVElNX0VDUl9QV1BSU0NfMiAvKiE8IFB1bHNlIG9uIGNvbXBhcmUgcHVsc2Ugd2lkdGggcHJlc2NhbGVyIDE2ICovCisjZGVmaW5lIExMX1RJTV9QV1BSU0NfWDMyIFwKKyAgKFRJTV9FQ1JfUFdQUlNDXzIgfCAgICAgXAorICAgVElNX0VDUl9QV1BSU0NfMCkgLyohPCBQdWxzZSBvbiBjb21wYXJlIHB1bHNlIHdpZHRoIHByZXNjYWxlciAzMiAqLworI2RlZmluZSBMTF9USU1fUFdQUlNDX1g2NCBcCisgIChUSU1fRUNSX1BXUFJTQ18yIHwgICAgIFwKKyAgIFRJTV9FQ1JfUFdQUlNDXzEpIC8qITwgUHVsc2Ugb24gY29tcGFyZSBwdWxzZSB3aWR0aCBwcmVzY2FsZXIgNjQgKi8KKyNkZWZpbmUgTExfVElNX1BXUFJTQ19YMTI4ICAgICAgICAgICAgICAgXAorICAoVElNX0VDUl9QV1BSU0NfMiB8IFRJTV9FQ1JfUFdQUlNDXzEgfCBcCisgICBUSU1fRUNSX1BXUFJTQ18wKSAvKiE8IFB1bHNlIG9uIGNvbXBhcmUgcHVsc2Ugd2lkdGggcHJlc2NhbGVyIDEyOCAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0hTRV8zMl9SRVFVRVNUIENsb2NrIEhTRS8zMiByZXF1ZXN0CisgKiBAeworICovCisjZGVmaW5lIExMX1RJTV9IU0VfMzJfTk9UX1JFUVVFU1QgICAgICAgICAgICAgXAorICAweDAwMDAwMDAwVSAvKiE8IENsb2NrIEhTRS8zMiBub3QgcmVxdWVzdGVkIFwKKyAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX1RJTV9IU0VfMzJfUkVRVUVTVCBcCisgIFRJTV9PUl9IU0UzMkVOIC8qITwgQ2xvY2sgSFNFLzMyIHJlcXVlc3RlZCBmb3IgVElNMTYvMTcgVEkxU0VMIHJlbWFwICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIExlZ2FjeSBkZWZpbml0aW9ucyBmb3IgY29tcGF0aWJpbGl0eSBwdXJwb3NlCitAY29uZCAwCisgICovCisjZGVmaW5lIExMX1RJTV9CS0lOX1NPVVJDRV9ERkJLIExMX1RJTV9CS0lOX1NPVVJDRV9ERjFCSworLyoqCitAZW5kY29uZAorICAqLworCisvKioKKyAqIEB9CisgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0V4cG9ydGVkX01hY3JvcyBUSU0gRXhwb3J0ZWQgTWFjcm9zCisgKiBAeworICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VNX1dSSVRFX1JFQUQgQ29tbW9uIFdyaXRlIGFuZCByZWFkIHJlZ2lzdGVycyBNYWNyb3MKKyAqIEB7CisgKi8KKy8qKgorICogQGJyaWVmICBXcml0ZSBhIHZhbHVlIGluIFRJTSByZWdpc3Rlci4KKyAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIFRJTSBJbnN0YW5jZQorICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHdyaXR0ZW4KKyAqIEBwYXJhbSAgX19WQUxVRV9fIFZhbHVlIHRvIGJlIHdyaXR0ZW4gaW4gdGhlIHJlZ2lzdGVyCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBMTF9USU1fV3JpdGVSZWcoX19JTlNUQU5DRV9fLCBfX1JFR19fLCBfX1ZBTFVFX18pIFwKKyAgV1JJVEVfUkVHKChfX0lOU1RBTkNFX18pLT5fX1JFR19fLCAoX19WQUxVRV9fKSkKKworLyoqCisgKiBAYnJpZWYgIFJlYWQgYSB2YWx1ZSBpbiBUSU0gcmVnaXN0ZXIuCisgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBUSU0gSW5zdGFuY2UKKyAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSByZWFkCisgKiBAcmV0dmFsIFJlZ2lzdGVyIHZhbHVlCisgKi8KKyNkZWZpbmUgTExfVElNX1JlYWRSZWcoX19JTlNUQU5DRV9fLCBfX1JFR19fKSBSRUFEX1JFRygoX19JTlNUQU5DRV9fKS0+X19SRUdfXykKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEBicmllZiAgSEVMUEVSIG1hY3JvIHJldHJpZXZpbmcgdGhlIFVJRkNQWSBmbGFnIGZyb20gdGhlIGNvdW50ZXIgdmFsdWUuCisgKiBAbm90ZSBleDogQHJlZiBfX0xMX1RJTV9HRVRGTEFHX1VJRkNQWSAoQHJlZiBMTF9USU1fR2V0Q291bnRlciAoKSk7CisgKiBAbm90ZSAgUmVsZXZhbnQgb25seSBpZiBVSUYgZmxhZyByZW1hcHBpbmcgaGFzIGJlZW4gZW5hYmxlZCAgKFVJRiBzdGF0dXMgYml0CisgKiBpcyBjb3BpZWQgdG8gVElNeF9DTlQgcmVnaXN0ZXIgYml0IDMxKQorICogQHBhcmFtICBfX0NOVF9fIENvdW50ZXIgdmFsdWUKKyAqIEByZXR2YWwgVUlGIHN0YXR1cyBiaXQKKyAqLworI2RlZmluZSBfX0xMX1RJTV9HRVRGTEFHX1VJRkNQWShfX0NOVF9fKSBcCisgIChSRUFEX0JJVCgoX19DTlRfXyksIFRJTV9DTlRfVUlGQ1BZKSA+PiBUSU1fQ05UX1VJRkNQWV9Qb3MpCisKKy8qKgorICogQGJyaWVmICBIRUxQRVIgbWFjcm8gY2FsY3VsYXRpbmcgRFRHWzA6N10gaW4gdGhlIFRJTXhfQkRUUiByZWdpc3RlciB0bworICogYWNoaWV2ZSB0aGUgcmVxdWVzdGVkIGRlYWQgdGltZSBkdXJhdGlvbi4KKyAqIEBub3RlIGV4OiBAcmVmIF9fTExfVElNX0NBTENfREVBRFRJTUUgKDgwMDAwMDAwLCBAcmVmIExMX1RJTV9HZXRDbG9ja0RpdmlzaW9uCisgKiAoKSwgMTIwKTsKKyAqIEBwYXJhbSAgX19USU1DTEtfXyB0aW1lciBpbnB1dCBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQorICogQHBhcmFtICBfX0NLRF9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0xPQ0tESVZJU0lPTl9ESVYxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0xPQ0tESVZJU0lPTl9ESVYyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0xPQ0tESVZJU0lPTl9ESVY0CisgKiBAcGFyYW0gIF9fRFRfXyBkZWFkdGltZSBkdXJhdGlvbiAoaW4gbnMpCisgKiBAcmV0dmFsIERUR1swOjddCisgKi8KKyNkZWZpbmUgX19MTF9USU1fQ0FMQ19ERUFEVElNRShfX1RJTUNMS19fLCBfX0NLRF9fLCBfX0RUX18pICAgICAgICAgICAgICAgXAorICAoKCgodWludDY0X3QpKChfX0RUX18pICogMTAwMFUpKSA8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKChEVF9ERUxBWV8xICsgMVUpICogVElNX0NBTENfRFRTKChfX1RJTUNMS19fKSwgKF9fQ0tEX18pKSkpICAgICAgICAgIFwKKyAgICAgICA/ICh1aW50OF90KSgoKHVpbnQ2NF90KSgoX19EVF9fKSAqIDEwMDBVKSAvICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBUSU1fQ0FMQ19EVFMoKF9fVElNQ0xLX18pLCAoX19DS0RfXykpKSAmICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgRFRfREVMQVlfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIDogKCgodWludDY0X3QpKChfX0RUX18pICogMTAwMFUpKSA8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKCg2NFUgKyAoRFRfREVMQVlfMiArIDFVKSkgKiAyVSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgVElNX0NBTENfRFRTKChfX1RJTUNMS19fKSwgKF9fQ0tEX18pKSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICA/ICh1aW50OF90KShEVF9SQU5HRV8yIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICgodWludDhfdCkoKHVpbnQ4X3QpKCgoKHVpbnQ2NF90KSgoX19EVF9fKSAqIDEwMDBVKSkgLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9DQUxDX0RUUygoX19USU1DTEtfXyksICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0NLRF9fKSkpID4+ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDFVKSAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdCk2NCkgJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgRFRfREVMQVlfMikpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAoKCh1aW50NjRfdCkoKF9fRFRfXykgKiAxMDAwVSkpIDwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoKDMyVSArIChEVF9ERUxBWV8zICsgMVUpKSAqIDhVICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBUSU1fQ0FMQ19EVFMoKF9fVElNQ0xLX18pLCAoX19DS0RfXykpKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgID8gKHVpbnQ4X3QpKERUX1JBTkdFXzMgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgKCh1aW50OF90KSgodWludDhfdCkoKCgoKHVpbnQ2NF90KShfX0RUX18pICogMTAwMFUpKSAvIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX0NBTENfRFRTKChfX1RJTUNMS19fKSwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fQ0tEX18pKSkgPj4gICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgM1UpIC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50OF90KTMyKSAmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBEVF9ERUxBWV8zKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICA6ICgoKHVpbnQ2NF90KSgoX19EVF9fKSAqIDEwMDBVKSkgPCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICgoMzJVICsgKERUX0RFTEFZXzQgKyAxVSkpICogMTZVICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIFRJTV9DQUxDX0RUUygoX19USU1DTEtfXyksIChfX0NLRF9fKSkpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgPyAodWludDhfdCkoRFRfUkFOR0VfNCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpKCh1aW50OF90KSgoKCgodWludDY0X3QpKF9fRFRfXykgKiAxMDAwVSkpIC8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fQ0FMQ19EVFMoKF9fVElNQ0xLX18pLCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19DS0RfXykpKSA+PiAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0VSkgLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QpMzIpICYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIERUX0RFTEFZXzQpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICA6IDBVKQorCisvKioKKyAqIEBicmllZiAgSEVMUEVSIG1hY3JvIGNhbGN1bGF0aW5nIHRoZSBwcmVzY2FsZXIgdmFsdWUgdG8gYWNoaWV2ZSB0aGUgcmVxdWlyZWQKKyAqIGNvdW50ZXIgY2xvY2sgZnJlcXVlbmN5LgorICogQG5vdGUgZXg6IEByZWYgX19MTF9USU1fQ0FMQ19QU0MgKDgwMDAwMDAwLCAxMDAwMDAwKTsKKyAqIEBwYXJhbSAgX19USU1DTEtfXyB0aW1lciBpbnB1dCBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQorICogQHBhcmFtICBfX0NOVENMS19fIGNvdW50ZXIgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAqIEByZXR2YWwgUHJlc2NhbGVyIHZhbHVlICAoYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUzNSkKKyAqLworI2RlZmluZSBfX0xMX1RJTV9DQUxDX1BTQyhfX1RJTUNMS19fLCBfX0NOVENMS19fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKChfX1RJTUNMS19fKSA+PSAoX19DTlRDTEtfXykpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgID8gKHVpbnQzMl90KSgoKChfX1RJTUNMS19fKSArIChfX0NOVENMS19fKSAvIDJVKSAvIChfX0NOVENMS19fKSkgLSAxVSkgXAorICAgICAgIDogMFUpCisKKy8qKgorICogQGJyaWVmICBIRUxQRVIgbWFjcm8gY2FsY3VsYXRpbmcgdGhlIGF1dG8tcmVsb2FkIHZhbHVlIHRvIGFjaGlldmUgdGhlCisgKiByZXF1aXJlZCBvdXRwdXQgc2lnbmFsIGZyZXF1ZW5jeS4KKyAqIEBub3RlIGV4OiBAcmVmIF9fTExfVElNX0NBTENfQVJSICgxMDAwMDAwLCBAcmVmIExMX1RJTV9HZXRQcmVzY2FsZXIgKCksCisgKiAxMDAwMCk7CisgKiBAcGFyYW0gIF9fVElNQ0xLX18gdGltZXIgaW5wdXQgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAqIEBwYXJhbSAgX19QU0NfXyBwcmVzY2FsZXIKKyAqIEBwYXJhbSAgX19GUkVRX18gb3V0cHV0IHNpZ25hbCBmcmVxdWVuY3kgKGluIEh6KQorICogQHJldHZhbCAgQXV0by1yZWxvYWQgdmFsdWUgIChiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTY1NTM1KQorICovCisjZGVmaW5lIF9fTExfVElNX0NBTENfQVJSKF9fVElNQ0xLX18sIF9fUFNDX18sIF9fRlJFUV9fKSAgICAgICAgIFwKKyAgKCgoKF9fVElNQ0xLX18pIC8gKChfX1BTQ19fKSArIDFVKSkgPj0gKF9fRlJFUV9fKSkgICAgICAgICAgICAgXAorICAgICAgID8gKCgoX19USU1DTEtfXykgLyAoKF9fRlJFUV9fKSAqICgoX19QU0NfXykgKyAxVSkpKSAtIDFVKSBcCisgICAgICAgOiAwVSkKKworLyoqCisgKiBAYnJpZWYgIEhFTFBFUiBtYWNybyBjYWxjdWxhdGluZyB0aGUgYXV0by1yZWxvYWQgdmFsdWUsIHdpdGggZGl0aGVyaW5nCisgKiBmZWF0dXJlIGVuYWJsZWQsIHRvIGFjaGlldmUgdGhlIHJlcXVpcmVkIG91dHB1dCBzaWduYWwgZnJlcXVlbmN5LgorICogQG5vdGUgZXg6IEByZWYgX19MTF9USU1fQ0FMQ19BUlJfRElUSEVSICgxMDAwMDAwLCBAcmVmIExMX1RJTV9HZXRQcmVzY2FsZXIKKyAqICgpLCAxMDAwMCk7CisgKiBAcGFyYW0gIF9fVElNQ0xLX18gdGltZXIgaW5wdXQgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAqIEBwYXJhbSAgX19QU0NfXyBwcmVzY2FsZXIKKyAqIEBwYXJhbSAgX19GUkVRX18gb3V0cHV0IHNpZ25hbCBmcmVxdWVuY3kgKGluIEh6KQorICogQHJldHZhbCAgQXV0by1yZWxvYWQgdmFsdWUgIChiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTY1NTM1KQorICovCisjZGVmaW5lIF9fTExfVElNX0NBTENfQVJSX0RJVEhFUihfX1RJTUNMS19fLCBfX1BTQ19fLCBfX0ZSRVFfXykgXAorICAoKCgoX19USU1DTEtfXykgLyAoKF9fUFNDX18pICsgMVUpKSA+PSAoX19GUkVRX18pKSAgICAgICAgICAgIFwKKyAgICAgICA/ICh1aW50MzJfdCkoKCgodWludDY0X3QpKF9fVElNQ0xLX18pICogMTZVIC8gICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgKChfX0ZSRVFfXykgKiAoKF9fUFNDX18pICsgMVUpKSkgLSAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgMTZVKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICA6IDBVKQorCisvKioKKyAqIEBicmllZiAgSEVMUEVSIG1hY3JvIGNhbGN1bGF0aW5nIHRoZSBjb21wYXJlIHZhbHVlIHJlcXVpcmVkIHRvIGFjaGlldmUgdGhlCisgKiByZXF1aXJlZCB0aW1lciBvdXRwdXQgY29tcGFyZSBhY3RpdmUvaW5hY3RpdmUgZGVsYXkuCisgKiBAbm90ZSBleDogQHJlZiBfX0xMX1RJTV9DQUxDX0RFTEFZICgxMDAwMDAwLCBAcmVmIExMX1RJTV9HZXRQcmVzY2FsZXIgKCksCisgKiAxMCk7CisgKiBAcGFyYW0gIF9fVElNQ0xLX18gdGltZXIgaW5wdXQgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAqIEBwYXJhbSAgX19QU0NfXyBwcmVzY2FsZXIKKyAqIEBwYXJhbSAgX19ERUxBWV9fIHRpbWVyIG91dHB1dCBjb21wYXJlIGFjdGl2ZS9pbmFjdGl2ZSBkZWxheSAoaW4gdXMpCisgKiBAcmV0dmFsIENvbXBhcmUgdmFsdWUgIChiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTY1NTM1KQorICovCisjZGVmaW5lIF9fTExfVElNX0NBTENfREVMQVkoX19USU1DTEtfXywgX19QU0NfXywgX19ERUxBWV9fKSAgICAgIFwKKyAgKCh1aW50MzJfdCkoKCh1aW50NjRfdCkoX19USU1DTEtfXykgKiAodWludDY0X3QpKF9fREVMQVlfXykpIC8gXAorICAgICAgICAgICAgICAoKHVpbnQ2NF90KTEwMDAwMDBVICogKHVpbnQ2NF90KSgoX19QU0NfXykgKyAxVSkpKSkKKworLyoqCisgKiBAYnJpZWYgIEhFTFBFUiBtYWNybyBjYWxjdWxhdGluZyB0aGUgY29tcGFyZSB2YWx1ZSwgd2l0aCBkaXRoZXJpbmcgZmVhdHVyZQorICogZW5hYmxlZCwgdG8gYWNoaWV2ZSB0aGUgcmVxdWlyZWQgdGltZXIgb3V0cHV0IGNvbXBhcmUgYWN0aXZlL2luYWN0aXZlIGRlbGF5LgorICogQG5vdGUgZXg6IEByZWYgX19MTF9USU1fQ0FMQ19ERUxBWV9ESVRIRVIgKDEwMDAwMDAsIEByZWYgTExfVElNX0dldFByZXNjYWxlcgorICogKCksIDEwKTsKKyAqIEBwYXJhbSAgX19USU1DTEtfXyB0aW1lciBpbnB1dCBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQorICogQHBhcmFtICBfX1BTQ19fIHByZXNjYWxlcgorICogQHBhcmFtICBfX0RFTEFZX18gdGltZXIgb3V0cHV0IGNvbXBhcmUgYWN0aXZlL2luYWN0aXZlIGRlbGF5IChpbiB1cykKKyAqIEByZXR2YWwgQ29tcGFyZSB2YWx1ZSAgKGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9NjU1MzUpCisgKi8KKyNkZWZpbmUgX19MTF9USU1fQ0FMQ19ERUxBWV9ESVRIRVIoX19USU1DTEtfXywgX19QU0NfXywgX19ERUxBWV9fKSAgICAgXAorICAoKHVpbnQzMl90KSgoKHVpbnQ2NF90KShfX1RJTUNMS19fKSAqICh1aW50NjRfdCkoX19ERUxBWV9fKSAqIDE2VSkgLyBcCisgICAgICAgICAgICAgICgodWludDY0X3QpMTAwMDAwMFUgKiAodWludDY0X3QpKChfX1BTQ19fKSArIDFVKSkpKQorCisvKioKKyAqIEBicmllZiAgSEVMUEVSIG1hY3JvIGNhbGN1bGF0aW5nIHRoZSBhdXRvLXJlbG9hZCB2YWx1ZSB0byBhY2hpZXZlIHRoZQorICogcmVxdWlyZWQgcHVsc2UgZHVyYXRpb24gKHdoZW4gdGhlIHRpbWVyIG9wZXJhdGVzIGluIG9uZSBwdWxzZSBtb2RlKS4KKyAqIEBub3RlIGV4OiBAcmVmIF9fTExfVElNX0NBTENfUFVMU0UgKDEwMDAwMDAsIEByZWYgTExfVElNX0dldFByZXNjYWxlciAoKSwgMTAsCisgKiAyMCk7CisgKiBAcGFyYW0gIF9fVElNQ0xLX18gdGltZXIgaW5wdXQgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAqIEBwYXJhbSAgX19QU0NfXyBwcmVzY2FsZXIKKyAqIEBwYXJhbSAgX19ERUxBWV9fIHRpbWVyIG91dHB1dCBjb21wYXJlIGFjdGl2ZS9pbmFjdGl2ZSBkZWxheSAoaW4gdXMpCisgKiBAcGFyYW0gIF9fUFVMU0VfXyBwdWxzZSBkdXJhdGlvbiAoaW4gdXMpCisgKiBAcmV0dmFsIEF1dG8tcmVsb2FkIHZhbHVlICAoYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUzNSkKKyAqLworI2RlZmluZSBfX0xMX1RJTV9DQUxDX1BVTFNFKF9fVElNQ0xLX18sIF9fUFNDX18sIF9fREVMQVlfXywgX19QVUxTRV9fKSAgICBcCisgICgodWludDMyX3QpKF9fTExfVElNX0NBTENfREVMQVkoKF9fVElNQ0xLX18pLCAoX19QU0NfXyksIChfX1BVTFNFX18pKSArIFwKKyAgICAgICAgICAgICAgX19MTF9USU1fQ0FMQ19ERUxBWSgoX19USU1DTEtfXyksIChfX1BTQ19fKSwgKF9fREVMQVlfXykpKSkKKworLyoqCisgKiBAYnJpZWYgIEhFTFBFUiBtYWNybyBjYWxjdWxhdGluZyB0aGUgYXV0by1yZWxvYWQgdmFsdWUsIHdpdGggZGl0aGVyaW5nCisgKiBmZWF0dXJlIGVuYWJsZWQsIHRvIGFjaGlldmUgdGhlIHJlcXVpcmVkIHB1bHNlIGR1cmF0aW9uICh3aGVuIHRoZSB0aW1lcgorICogb3BlcmF0ZXMgaW4gb25lIHB1bHNlIG1vZGUpLgorICogQG5vdGUgZXg6IEByZWYgX19MTF9USU1fQ0FMQ19QVUxTRV9ESVRIRVIgKDEwMDAwMDAsIEByZWYgTExfVElNX0dldFByZXNjYWxlcgorICogKCksIDEwLCAyMCk7CisgKiBAcGFyYW0gIF9fVElNQ0xLX18gdGltZXIgaW5wdXQgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAqIEBwYXJhbSAgX19QU0NfXyBwcmVzY2FsZXIKKyAqIEBwYXJhbSAgX19ERUxBWV9fIHRpbWVyIG91dHB1dCBjb21wYXJlIGFjdGl2ZS9pbmFjdGl2ZSBkZWxheSAoaW4gdXMpCisgKiBAcGFyYW0gIF9fUFVMU0VfXyBwdWxzZSBkdXJhdGlvbiAoaW4gdXMpCisgKiBAcmV0dmFsIEF1dG8tcmVsb2FkIHZhbHVlICAoYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUzNSkKKyAqLworI2RlZmluZSBfX0xMX1RJTV9DQUxDX1BVTFNFX0RJVEhFUihfX1RJTUNMS19fLCBfX1BTQ19fLCBfX0RFTEFZX18sIF9fUFVMU0VfXykgXAorICAoKHVpbnQzMl90KShfX0xMX1RJTV9DQUxDX0RFTEFZX0RJVEhFUigoX19USU1DTEtfXyksIChfX1BTQ19fKSwgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19QVUxTRV9fKSkgKyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICBfX0xMX1RJTV9DQUxDX0RFTEFZX0RJVEhFUigoX19USU1DTEtfXyksIChfX1BTQ19fKSwgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19ERUxBWV9fKSkpKQorCisvKioKKyAqIEBicmllZiAgSEVMUEVSIG1hY3JvIHJldHJpZXZpbmcgdGhlIHJhdGlvIG9mIHRoZSBpbnB1dCBjYXB0dXJlIHByZXNjYWxlcgorICogQG5vdGUgZXg6IEByZWYgX19MTF9USU1fR0VUX0lDUFNDX1JBVElPIChAcmVmIExMX1RJTV9JQ19HZXRQcmVzY2FsZXIgKCkpOworICogQHBhcmFtICBfX0lDUFNDX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ1BTQ19ESVYxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNQU0NfRElWMgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDUFNDX0RJVjQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ1BTQ19ESVY4CisgKiBAcmV0dmFsIElucHV0IGNhcHR1cmUgcHJlc2NhbGVyIHJhdGlvICgxLCAyLCA0IG9yIDgpCisgKi8KKyNkZWZpbmUgX19MTF9USU1fR0VUX0lDUFNDX1JBVElPKF9fSUNQU0NfXykgXAorICAoKHVpbnQzMl90KSgweDAxVSA8PCAoKChfX0lDUFNDX18pID4+IDE2VSkgPj4gVElNX0NDTVIxX0lDMVBTQ19Qb3MpKSkKKworLyoqCisgKiBAfQorICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FeHBvcnRlZF9GdW5jdGlvbnMgVElNIEV4cG9ydGVkIEZ1bmN0aW9ucworICogQHsKKyAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FRl9UaW1lX0Jhc2UgVGltZSBCYXNlIGNvbmZpZ3VyYXRpb24KKyAqIEB7CisgKi8KKy8qKgorICogQGJyaWVmICBFbmFibGUgdGltZXIgY291bnRlci4KKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIENFTiAgICAgICAgICAgTExfVElNX0VuYWJsZUNvdW50ZXIKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9FbmFibGVDb3VudGVyKFRJTV9UeXBlRGVmICpUSU14KSB7CisgIFNFVF9CSVQoVElNeC0+Q1IxLCBUSU1fQ1IxX0NFTik7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIHRpbWVyIGNvdW50ZXIuCisgKiBAcm10b2xsIENSMSAgICAgICAgICBDRU4gICAgICAgICAgIExMX1RJTV9EaXNhYmxlQ291bnRlcgorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0Rpc2FibGVDb3VudGVyKFRJTV9UeXBlRGVmICpUSU14KSB7CisgIENMRUFSX0JJVChUSU14LT5DUjEsIFRJTV9DUjFfQ0VOKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEluZGljYXRlcyB3aGV0aGVyIHRoZSB0aW1lciBjb3VudGVyIGlzIGVuYWJsZWQuCisgKiBAcm10b2xsIENSMSAgICAgICAgICBDRU4gICAgICAgICAgIExMX1RJTV9Jc0VuYWJsZWRDb3VudGVyCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzRW5hYmxlZENvdW50ZXIoY29uc3QgVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+Q1IxLCBUSU1fQ1IxX0NFTikgPT0gKFRJTV9DUjFfQ0VOKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIHVwZGF0ZSBldmVudCBnZW5lcmF0aW9uLgorICogQHJtdG9sbCBDUjEgICAgICAgICAgVURJUyAgICAgICAgICBMTF9USU1fRW5hYmxlVXBkYXRlRXZlbnQKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9FbmFibGVVcGRhdGVFdmVudChUSU1fVHlwZURlZiAqVElNeCkgeworICBDTEVBUl9CSVQoVElNeC0+Q1IxLCBUSU1fQ1IxX1VESVMpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSB1cGRhdGUgZXZlbnQgZ2VuZXJhdGlvbi4KKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIFVESVMgICAgICAgICAgTExfVElNX0Rpc2FibGVVcGRhdGVFdmVudAorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0Rpc2FibGVVcGRhdGVFdmVudChUSU1fVHlwZURlZiAqVElNeCkgeworICBTRVRfQklUKFRJTXgtPkNSMSwgVElNX0NSMV9VRElTKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEluZGljYXRlcyB3aGV0aGVyIHVwZGF0ZSBldmVudCBnZW5lcmF0aW9uIGlzIGVuYWJsZWQuCisgKiBAcm10b2xsIENSMSAgICAgICAgICBVRElTICAgICAgICAgIExMX1RJTV9Jc0VuYWJsZWRVcGRhdGVFdmVudAorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIEludmVydGVkIHN0YXRlIG9mIGJpdCAoMCBvciAxKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0VuYWJsZWRVcGRhdGVFdmVudChjb25zdCBUSU1fVHlwZURlZiAqVElNeCkgeworICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5DUjEsIFRJTV9DUjFfVURJUykgPT0gKHVpbnQzMl90KVJFU0VUKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBTZXQgdXBkYXRlIGV2ZW50IHNvdXJjZQorICogQG5vdGUgVXBkYXRlIGV2ZW50IHNvdXJjZSBzZXQgdG8gTExfVElNX1VQREFURVNPVVJDRV9SRUdVTEFSOiBhbnkgb2YgdGhlCisgKiBmb2xsb3dpbmcgZXZlbnRzIGdlbmVyYXRlIGFuIHVwZGF0ZSBpbnRlcnJ1cHQgb3IgRE1BIHJlcXVlc3QgaWYgZW5hYmxlZDoKKyAqICAgICAgICAtIENvdW50ZXIgb3ZlcmZsb3cvdW5kZXJmbG93CisgKiAgICAgICAgLSBTZXR0aW5nIHRoZSBVRyBiaXQKKyAqICAgICAgICAtIFVwZGF0ZSBnZW5lcmF0aW9uIHRocm91Z2ggdGhlIHNsYXZlIG1vZGUgY29udHJvbGxlcgorICogQG5vdGUgVXBkYXRlIGV2ZW50IHNvdXJjZSBzZXQgdG8gTExfVElNX1VQREFURVNPVVJDRV9DT1VOVEVSOiBvbmx5IGNvdW50ZXIKKyAqICAgICAgIG92ZXJmbG93L3VuZGVyZmxvdyBnZW5lcmF0ZXMgYW4gdXBkYXRlIGludGVycnVwdCBvciBETUEgcmVxdWVzdCBpZgorICogZW5hYmxlZC4KKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIFVSUyAgICAgICAgICAgTExfVElNX1NldFVwZGF0ZVNvdXJjZQorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcGFyYW0gIFVwZGF0ZVNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1VQREFURVNPVVJDRV9SRUdVTEFSCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVVBEQVRFU09VUkNFX0NPVU5URVIKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fU2V0VXBkYXRlU291cmNlKFRJTV9UeXBlRGVmICpUSU14LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBVcGRhdGVTb3VyY2UpIHsKKyAgTU9ESUZZX1JFRyhUSU14LT5DUjEsIFRJTV9DUjFfVVJTLCBVcGRhdGVTb3VyY2UpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IGFjdHVhbCBldmVudCB1cGRhdGUgc291cmNlCisgKiBAcm10b2xsIENSMSAgICAgICAgICBVUlMgICAgICAgICAgIExMX1RJTV9HZXRVcGRhdGVTb3VyY2UKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1VQREFURVNPVVJDRV9SRUdVTEFSCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVVBEQVRFU09VUkNFX0NPVU5URVIKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9HZXRVcGRhdGVTb3VyY2UoY29uc3QgVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVElNeC0+Q1IxLCBUSU1fQ1IxX1VSUykpOworfQorCisvKioKKyAqIEBicmllZiAgU2V0IG9uZSBwdWxzZSBtb2RlIChvbmUgc2hvdCB2LnMuIHJlcGV0aXRpdmUpLgorICogQHJtdG9sbCBDUjEgICAgICAgICAgT1BNICAgICAgICAgICBMTF9USU1fU2V0T25lUHVsc2VNb2RlCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEBwYXJhbSAgT25lUHVsc2VNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT05FUFVMU0VNT0RFX1NJTkdMRQorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09ORVBVTFNFTU9ERV9SRVBFVElUSVZFCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX1NldE9uZVB1bHNlTW9kZShUSU1fVHlwZURlZiAqVElNeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgT25lUHVsc2VNb2RlKSB7CisgIE1PRElGWV9SRUcoVElNeC0+Q1IxLCBUSU1fQ1IxX09QTSwgT25lUHVsc2VNb2RlKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBhY3R1YWwgb25lIHB1bHNlIG1vZGUuCisgKiBAcm10b2xsIENSMSAgICAgICAgICBPUE0gICAgICAgICAgIExMX1RJTV9HZXRPbmVQdWxzZU1vZGUKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09ORVBVTFNFTU9ERV9TSU5HTEUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PTkVQVUxTRU1PREVfUkVQRVRJVElWRQorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0dldE9uZVB1bHNlTW9kZShjb25zdCBUSU1fVHlwZURlZiAqVElNeCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChUSU14LT5DUjEsIFRJTV9DUjFfT1BNKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBTZXQgdGhlIHRpbWVyIGNvdW50ZXIgY291bnRpbmcgbW9kZS4KKyAqIEBub3RlIE1hY3JvIElTX1RJTV9DT1VOVEVSX01PREVfU0VMRUNUX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvCisgKiAgICAgICBjaGVjayB3aGV0aGVyIG9yIG5vdCB0aGUgY291bnRlciBtb2RlIHNlbGVjdGlvbiBmZWF0dXJlIGlzIHN1cHBvcnRlZAorICogICAgICAgYnkgYSB0aW1lciBpbnN0YW5jZS4KKyAqIEBub3RlIFN3aXRjaGluZyBmcm9tIENlbnRlciBBbGlnbmVkIGNvdW50ZXIgbW9kZSB0byBFZGdlIGNvdW50ZXIgbW9kZSAob3IKKyAqIHJldmVyc2UpIHJlcXVpcmVzIGEgdGltZXIgcmVzZXQgdG8gYXZvaWQgdW5leHBlY3RlZCBkaXJlY3Rpb24gZHVlIHRvIERJUiBiaXQKKyAqIHJlYWRvbmx5IGluIGNlbnRlciBhbGlnbmVkIG1vZGUuCisgKiBAcm10b2xsIENSMSAgICAgICAgICBESVIgICAgICAgICAgIExMX1RJTV9TZXRDb3VudGVyTW9kZVxuCisgKiAgICAgICAgIENSMSAgICAgICAgICBDTVMgICAgICAgICAgIExMX1RJTV9TZXRDb3VudGVyTW9kZQorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcGFyYW0gIENvdW50ZXJNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ09VTlRFUk1PREVfVVAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DT1VOVEVSTU9ERV9ET1dOCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ09VTlRFUk1PREVfQ0VOVEVSX1VQCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ09VTlRFUk1PREVfQ0VOVEVSX0RPV04KKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DT1VOVEVSTU9ERV9DRU5URVJfVVBfRE9XTgorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9TZXRDb3VudGVyTW9kZShUSU1fVHlwZURlZiAqVElNeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDb3VudGVyTW9kZSkgeworICBNT0RJRllfUkVHKFRJTXgtPkNSMSwgKFRJTV9DUjFfRElSIHwgVElNX0NSMV9DTVMpLCBDb3VudGVyTW9kZSk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgYWN0dWFsIGNvdW50ZXIgbW9kZS4KKyAqIEBub3RlIE1hY3JvIElTX1RJTV9DT1VOVEVSX01PREVfU0VMRUNUX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvCisgKiAgICAgICBjaGVjayB3aGV0aGVyIG9yIG5vdCB0aGUgY291bnRlciBtb2RlIHNlbGVjdGlvbiBmZWF0dXJlIGlzIHN1cHBvcnRlZAorICogICAgICAgYnkgYSB0aW1lciBpbnN0YW5jZS4KKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIERJUiAgICAgICAgICAgTExfVElNX0dldENvdW50ZXJNb2RlXG4KKyAqICAgICAgICAgQ1IxICAgICAgICAgIENNUyAgICAgICAgICAgTExfVElNX0dldENvdW50ZXJNb2RlCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DT1VOVEVSTU9ERV9VUAorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NPVU5URVJNT0RFX0RPV04KKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DT1VOVEVSTU9ERV9DRU5URVJfVVAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DT1VOVEVSTU9ERV9DRU5URVJfRE9XTgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NPVU5URVJNT0RFX0NFTlRFUl9VUF9ET1dOCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fR2V0Q291bnRlck1vZGUoY29uc3QgVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgdWludDMyX3QgY291bnRlcl9tb2RlOworCisgIGNvdW50ZXJfbW9kZSA9ICh1aW50MzJfdCkoUkVBRF9CSVQoVElNeC0+Q1IxLCBUSU1fQ1IxX0NNUykpOworCisgIGlmIChjb3VudGVyX21vZGUgPT0gMFUpIHsKKyAgICBjb3VudGVyX21vZGUgPSAodWludDMyX3QpKFJFQURfQklUKFRJTXgtPkNSMSwgVElNX0NSMV9ESVIpKTsKKyAgfQorCisgIHJldHVybiBjb3VudGVyX21vZGU7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgYXV0by1yZWxvYWQgKEFSUikgcHJlbG9hZC4KKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIEFSUEUgICAgICAgICAgTExfVElNX0VuYWJsZUFSUlByZWxvYWQKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9FbmFibGVBUlJQcmVsb2FkKFRJTV9UeXBlRGVmICpUSU14KSB7CisgIFNFVF9CSVQoVElNeC0+Q1IxLCBUSU1fQ1IxX0FSUEUpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBhdXRvLXJlbG9hZCAoQVJSKSBwcmVsb2FkLgorICogQHJtdG9sbCBDUjEgICAgICAgICAgQVJQRSAgICAgICAgICBMTF9USU1fRGlzYWJsZUFSUlByZWxvYWQKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlQVJSUHJlbG9hZChUSU1fVHlwZURlZiAqVElNeCkgeworICBDTEVBUl9CSVQoVElNeC0+Q1IxLCBUSU1fQ1IxX0FSUEUpOworfQorCisvKioKKyAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgYXV0by1yZWxvYWQgKEFSUikgcHJlbG9hZCBpcyBlbmFibGVkLgorICogQHJtdG9sbCBDUjEgICAgICAgICAgQVJQRSAgICAgICAgICBMTF9USU1fSXNFbmFibGVkQVJSUHJlbG9hZAorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0VuYWJsZWRBUlJQcmVsb2FkKGNvbnN0IFRJTV9UeXBlRGVmICpUSU14KSB7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPkNSMSwgVElNX0NSMV9BUlBFKSA9PSAoVElNX0NSMV9BUlBFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgU2V0IHRoZSBkaXZpc2lvbiByYXRpbyBiZXR3ZWVuIHRoZSB0aW1lciBjbG9jayAgYW5kIHRoZSBzYW1wbGluZworICogY2xvY2sgdXNlZCBieSB0aGUgZGVhZC10aW1lIGdlbmVyYXRvcnMgKHdoZW4gc3VwcG9ydGVkKSBhbmQgdGhlIGRpZ2l0YWwKKyAqIGZpbHRlcnMuCisgKiBAbm90ZSBNYWNybyBJU19USU1fQ0xPQ0tfRElWSVNJT05fSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAqICAgICAgIHdoZXRoZXIgb3Igbm90IHRoZSBjbG9jayBkaXZpc2lvbiBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgdGltZXIKKyAqICAgICAgIGluc3RhbmNlLgorICogQHJtdG9sbCBDUjEgICAgICAgICAgQ0tEICAgICAgICAgICBMTF9USU1fU2V0Q2xvY2tEaXZpc2lvbgorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcGFyYW0gIENsb2NrRGl2aXNpb24gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DTE9DS0RJVklTSU9OX0RJVjEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DTE9DS0RJVklTSU9OX0RJVjIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DTE9DS0RJVklTSU9OX0RJVjQKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fU2V0Q2xvY2tEaXZpc2lvbihUSU1fVHlwZURlZiAqVElNeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENsb2NrRGl2aXNpb24pIHsKKyAgTU9ESUZZX1JFRyhUSU14LT5DUjEsIFRJTV9DUjFfQ0tELCBDbG9ja0RpdmlzaW9uKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCB0aGUgYWN0dWFsIGRpdmlzaW9uIHJhdGlvIGJldHdlZW4gdGhlIHRpbWVyIGNsb2NrICBhbmQgdGhlCisgKiBzYW1wbGluZyBjbG9jayB1c2VkIGJ5IHRoZSBkZWFkLXRpbWUgZ2VuZXJhdG9ycyAod2hlbiBzdXBwb3J0ZWQpIGFuZCB0aGUKKyAqIGRpZ2l0YWwgZmlsdGVycy4KKyAqIEBub3RlIE1hY3JvIElTX1RJTV9DTE9DS19ESVZJU0lPTl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICogICAgICAgd2hldGhlciBvciBub3QgdGhlIGNsb2NrIGRpdmlzaW9uIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSB0aW1lcgorICogICAgICAgaW5zdGFuY2UuCisgKiBAcm10b2xsIENSMSAgICAgICAgICBDS0QgICAgICAgICAgIExMX1RJTV9HZXRDbG9ja0RpdmlzaW9uCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DTE9DS0RJVklTSU9OX0RJVjEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DTE9DS0RJVklTSU9OX0RJVjIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DTE9DS0RJVklTSU9OX0RJVjQKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9HZXRDbG9ja0RpdmlzaW9uKGNvbnN0IFRJTV9UeXBlRGVmICpUSU14KSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFRJTXgtPkNSMSwgVElNX0NSMV9DS0QpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFNldCB0aGUgY291bnRlciB2YWx1ZS4KKyAqIEBub3RlIE1hY3JvIElTX1RJTV8zMkJfQ09VTlRFUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBhIDMyIGJpdHMgY291bnRlci4KKyAqIEBub3RlIElmIGRpdGhlcmluZyBpcyBhY3RpdmF0ZWQsIHBheSBhdHRlbnRpb24gdG8gdGhlIENvdW50ZXIgdmFsdWUKKyAqIGludGVycHJldGF0aW9uCisgKiBAcm10b2xsIENOVCAgICAgICAgICBDTlQgICAgICAgICAgIExMX1RJTV9TZXRDb3VudGVyCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEBwYXJhbSAgQ291bnRlciBDb3VudGVyIHZhbHVlIChiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTB4RkZGRiBvcgorICogMHhGRkZGRkZGRikKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fU2V0Q291bnRlcihUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ291bnRlcikgeworICBXUklURV9SRUcoVElNeC0+Q05ULCBDb3VudGVyKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCB0aGUgY291bnRlciB2YWx1ZS4KKyAqIEBub3RlIE1hY3JvIElTX1RJTV8zMkJfQ09VTlRFUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBhIDMyIGJpdHMgY291bnRlci4KKyAqIEBub3RlIElmIGRpdGhlcmluZyBpcyBhY3RpdmF0ZWQsIHBheSBhdHRlbnRpb24gdG8gdGhlIENvdW50ZXIgdmFsdWUKKyAqIGludGVycHJldGF0aW9uCisgKiBAcm10b2xsIENOVCAgICAgICAgICBDTlQgICAgICAgICAgIExMX1RJTV9HZXRDb3VudGVyCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgQ291bnRlciB2YWx1ZSAoYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0weEZGRkYgb3IgMHhGRkZGRkZGRikKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9HZXRDb3VudGVyKGNvbnN0IFRJTV9UeXBlRGVmICpUSU14KSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfUkVHKFRJTXgtPkNOVCkpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IHRoZSBjdXJyZW50IGRpcmVjdGlvbiBvZiB0aGUgY291bnRlcgorICogQHJtdG9sbCBDUjEgICAgICAgICAgRElSICAgICAgICAgICBMTF9USU1fR2V0RGlyZWN0aW9uCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DT1VOVEVSRElSRUNUSU9OX1VQCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ09VTlRFUkRJUkVDVElPTl9ET1dOCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fR2V0RGlyZWN0aW9uKGNvbnN0IFRJTV9UeXBlRGVmICpUSU14KSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFRJTXgtPkNSMSwgVElNX0NSMV9ESVIpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFNldCB0aGUgcHJlc2NhbGVyIHZhbHVlLgorICogQG5vdGUgVGhlIGNvdW50ZXIgY2xvY2sgZnJlcXVlbmN5IENLX0NOVCBpcyBlcXVhbCB0byBmQ0tfUFNDIC8gKFBTQ1sxNTowXSArCisgKiAxKS4KKyAqIEBub3RlIFRoZSBwcmVzY2FsZXIgY2FuIGJlIGNoYW5nZWQgb24gdGhlIGZseSBhcyB0aGlzIGNvbnRyb2wgcmVnaXN0ZXIgaXMKKyAqIGJ1ZmZlcmVkLiBUaGUgbmV3IHByZXNjYWxlciByYXRpbyBpcyB0YWtlbiBpbnRvIGFjY291bnQgYXQgdGhlIG5leHQgdXBkYXRlCisgKiBldmVudC4KKyAqIEBub3RlIEhlbHBlciBtYWNybyBAcmVmIF9fTExfVElNX0NBTENfUFNDIGNhbiBiZSB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUKKyAqIFByZXNjYWxlciBwYXJhbWV0ZXIKKyAqIEBybXRvbGwgUFNDICAgICAgICAgIFBTQyAgICAgICAgICAgTExfVElNX1NldFByZXNjYWxlcgorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcGFyYW0gIFByZXNjYWxlciBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTY1NTM1CisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX1NldFByZXNjYWxlcihUSU1fVHlwZURlZiAqVElNeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUHJlc2NhbGVyKSB7CisgIFdSSVRFX1JFRyhUSU14LT5QU0MsIFByZXNjYWxlcik7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgdGhlIHByZXNjYWxlciB2YWx1ZS4KKyAqIEBybXRvbGwgUFNDICAgICAgICAgIFBTQyAgICAgICAgICAgTExfVElNX0dldFByZXNjYWxlcgorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsICBQcmVzY2FsZXIgdmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUzNQorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0dldFByZXNjYWxlcihjb25zdCBUSU1fVHlwZURlZiAqVElNeCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX1JFRyhUSU14LT5QU0MpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFNldCB0aGUgYXV0by1yZWxvYWQgdmFsdWUuCisgKiBAbm90ZSBUaGUgY291bnRlciBpcyBibG9ja2VkIHdoaWxlIHRoZSBhdXRvLXJlbG9hZCB2YWx1ZSBpcyBudWxsLgorICogQG5vdGUgTWFjcm8gSVNfVElNXzMyQl9DT1VOVEVSX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGEgMzIgYml0cyBjb3VudGVyLgorICogQG5vdGUgSGVscGVyIG1hY3JvIEByZWYgX19MTF9USU1fQ0FMQ19BUlIgY2FuIGJlIHVzZWQgdG8gY2FsY3VsYXRlIHRoZQorICogQXV0b1JlbG9hZCBwYXJhbWV0ZXIgSW4gY2FzZSBkaXRoZXJpbmcgaXMgYWN0aXZhdGVkLG1hY3JvCisgKiBfX0xMX1RJTV9DQUxDX0FSUl9ESVRIRVIgY2FuIGJlIHVzZWQgaW5zdGVhZCwgdG8gY2FsY3VsYXRlIHRoZSBBdXRvUmVsb2FkCisgKiAgICAgICBwYXJhbWV0ZXIuCisgKiBAcm10b2xsIEFSUiAgICAgICAgICBBUlIgICAgICAgICAgIExMX1RJTV9TZXRBdXRvUmVsb2FkCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEBwYXJhbSAgQXV0b1JlbG9hZCBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTY1NTM1CisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX1NldEF1dG9SZWxvYWQoVElNX1R5cGVEZWYgKlRJTXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBBdXRvUmVsb2FkKSB7CisgIFdSSVRFX1JFRyhUSU14LT5BUlIsIEF1dG9SZWxvYWQpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IHRoZSBhdXRvLXJlbG9hZCB2YWx1ZS4KKyAqIEBybXRvbGwgQVJSICAgICAgICAgIEFSUiAgICAgICAgICAgTExfVElNX0dldEF1dG9SZWxvYWQKKyAqIEBub3RlIE1hY3JvIElTX1RJTV8zMkJfQ09VTlRFUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBhIDMyIGJpdHMgY291bnRlci4KKyAqIEBub3RlIElmIGRpdGhlcmluZyBpcyBhY3RpdmF0ZWQsIHBheSBhdHRlbnRpb24gdG8gdGhlIHJldHVybmVkIHZhbHVlCisgKiBpbnRlcnByZXRhdGlvbgorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIEF1dG8tcmVsb2FkIHZhbHVlCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fR2V0QXV0b1JlbG9hZChjb25zdCBUSU1fVHlwZURlZiAqVElNeCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX1JFRyhUSU14LT5BUlIpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFNldCB0aGUgcmVwZXRpdGlvbiBjb3VudGVyIHZhbHVlLgorICogQG5vdGUgRm9yIGFkdmFuY2VkIHRpbWVyIGluc3RhbmNlcyBSZXBldGl0aW9uQ291bnRlciBjYW4gYmUgdXAgdG8gNjU1MzUuCisgKiBAbm90ZSBNYWNybyBJU19USU1fUkVQRVRJVElPTl9DT1VOVEVSX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGEgcmVwZXRpdGlvbiBjb3VudGVyLgorICogQHJtdG9sbCBSQ1IgICAgICAgICAgUkVQICAgICAgICAgICBMTF9USU1fU2V0UmVwZXRpdGlvbkNvdW50ZXIKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHBhcmFtICBSZXBldGl0aW9uQ291bnRlciBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTI1NSBvciA2NTUzNSBmb3IKKyAqIGFkdmFuY2VkIHRpbWVyLgorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9TZXRSZXBldGl0aW9uQ291bnRlcihUSU1fVHlwZURlZiAqVElNeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBSZXBldGl0aW9uQ291bnRlcikgeworICBXUklURV9SRUcoVElNeC0+UkNSLCBSZXBldGl0aW9uQ291bnRlcik7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgdGhlIHJlcGV0aXRpb24gY291bnRlciB2YWx1ZS4KKyAqIEBub3RlIE1hY3JvIElTX1RJTV9SRVBFVElUSU9OX0NPVU5URVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAqICAgICAgIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgYSByZXBldGl0aW9uIGNvdW50ZXIuCisgKiBAcm10b2xsIFJDUiAgICAgICAgICBSRVAgICAgICAgICAgIExMX1RJTV9HZXRSZXBldGl0aW9uQ291bnRlcgorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIFJlcGV0aXRpb24gY291bnRlciB2YWx1ZQorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0dldFJlcGV0aXRpb25Db3VudGVyKGNvbnN0IFRJTV9UeXBlRGVmICpUSU14KSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfUkVHKFRJTXgtPlJDUikpOworfQorCisvKioKKyAqIEBicmllZiAgRm9yY2UgYSBjb250aW51b3VzIGNvcHkgb2YgdGhlIHVwZGF0ZSBpbnRlcnJ1cHQgZmxhZyAoVUlGKSBpbnRvIHRoZQorICogdGltZXIgY291bnRlciByZWdpc3RlciAoYml0IDMxKS4KKyAqIEBub3RlIFRoaXMgYWxsb3dzIGJvdGggdGhlIGNvdW50ZXIgdmFsdWUgYW5kIGEgcG90ZW50aWFsIHJvbGwtb3ZlciBjb25kaXRpb24KKyAqIHNpZ25hbGxlZCBieSB0aGUgVUlGQ1BZIGZsYWcgdG8gYmUgcmVhZCBpbiBhbiBhdG9taWMgd2F5LgorICogQHJtdG9sbCBDUjEgICAgICAgICAgVUlGUkVNQVAgICAgICBMTF9USU1fRW5hYmxlVUlGUmVtYXAKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9FbmFibGVVSUZSZW1hcChUSU1fVHlwZURlZiAqVElNeCkgeworICBTRVRfQklUKFRJTXgtPkNSMSwgVElNX0NSMV9VSUZSRU1BUCk7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIHVwZGF0ZSBpbnRlcnJ1cHQgZmxhZyAoVUlGKSByZW1hcHBpbmcuCisgKiBAcm10b2xsIENSMSAgICAgICAgICBVSUZSRU1BUCAgICAgIExMX1RJTV9EaXNhYmxlVUlGUmVtYXAKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlVUlGUmVtYXAoVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgQ0xFQVJfQklUKFRJTXgtPkNSMSwgVElNX0NSMV9VSUZSRU1BUCk7Cit9CisKKy8qKgorICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIHVwZGF0ZSBpbnRlcnJ1cHQgZmxhZyAoVUlGKSBjb3B5IGlzIHNldC4KKyAqIEBwYXJhbSAgQ291bnRlciBDb3VudGVyIHZhbHVlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0FjdGl2ZVVJRkNQWShjb25zdCB1aW50MzJfdCBDb3VudGVyKSB7CisgIHJldHVybiAoKChDb3VudGVyICYgVElNX0NOVF9VSUZDUFkpID09IChUSU1fQ05UX1VJRkNQWSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBkaXRoZXJpbmcuCisgKiBAbm90ZSBNYWNybyBJU19USU1fRElUSEVSSU5HX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3IKKyAqIG5vdCBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGRpdGhlcmluZy4KKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIERJVEhFTiAgICAgICAgICBMTF9USU1fRW5hYmxlRGl0aGVyaW5nCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlRGl0aGVyaW5nKFRJTV9UeXBlRGVmICpUSU14KSB7CisgIFNFVF9CSVQoVElNeC0+Q1IxLCBUSU1fQ1IxX0RJVEhFTik7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIGRpdGhlcmluZy4KKyAqIEBub3RlIE1hY3JvIElTX1RJTV9ESVRIRVJJTkdfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvcgorICogbm90IGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgZGl0aGVyaW5nLgorICogQHJtdG9sbCBDUjEgICAgICAgICAgRElUSEVOICAgICAgICAgIExMX1RJTV9EaXNhYmxlRGl0aGVyaW5nCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZURpdGhlcmluZyhUSU1fVHlwZURlZiAqVElNeCkgeworICBDTEVBUl9CSVQoVElNeC0+Q1IxLCBUSU1fQ1IxX0RJVEhFTik7Cit9CisKKy8qKgorICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciBkaXRoZXJpbmcgaXMgYWN0aXZhdGVkLgorICogQG5vdGUgTWFjcm8gSVNfVElNX0RJVEhFUklOR19JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yCisgKiBub3QgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBkaXRoZXJpbmcuCisgKiBAcm10b2xsIENSMSAgICAgICAgICBESVRIRU4gICAgICAgICAgTExfVElNX0lzRW5hYmxlZERpdGhlcmluZworICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0VuYWJsZWREaXRoZXJpbmcoY29uc3QgVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+Q1IxLCBUSU1fQ1IxX0RJVEhFTikgPT0gKFRJTV9DUjFfRElUSEVOKSkgPyAxVUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUZfQ2FwdHVyZV9Db21wYXJlIENhcHR1cmUgQ29tcGFyZSBjb25maWd1cmF0aW9uCisgKiBAeworICovCisvKioKKyAqIEBicmllZiAgRW5hYmxlICB0aGUgY2FwdHVyZS9jb21wYXJlIGNvbnRyb2wgYml0cyAoQ0N4RSwgQ0N4TkUgYW5kIE9DeE0pCisgKiBwcmVsb2FkLgorICogQG5vdGUgQ0N4RSwgQ0N4TkUgYW5kIE9DeE0gYml0cyBhcmUgcHJlbG9hZGVkLCBhZnRlciBoYXZpbmcgYmVlbiB3cml0dGVuLAorICogICAgICAgdGhleSBhcmUgdXBkYXRlZCBvbmx5IHdoZW4gYSBjb21tdXRhdGlvbiBldmVudCAoQ09NKSBvY2N1cnMuCisgKiBAbm90ZSBPbmx5IG9uIGNoYW5uZWxzIHRoYXQgaGF2ZSBhIGNvbXBsZW1lbnRhcnkgb3V0cHV0LgorICogQG5vdGUgTWFjcm8gSVNfVElNX0NPTU1VVEFUSU9OX0VWRU5UX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIGlzIGFibGUgdG8gZ2VuZXJhdGUgYSBjb21tdXRhdGlvbgorICogZXZlbnQuCisgKiBAcm10b2xsIENSMiAgICAgICAgICBDQ1BDICAgICAgICAgIExMX1RJTV9DQ19FbmFibGVQcmVsb2FkCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ0NfRW5hYmxlUHJlbG9hZChUSU1fVHlwZURlZiAqVElNeCkgeworICBTRVRfQklUKFRJTXgtPkNSMiwgVElNX0NSMl9DQ1BDKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgIHRoZSBjYXB0dXJlL2NvbXBhcmUgY29udHJvbCBiaXRzIChDQ3hFLCBDQ3hORSBhbmQgT0N4TSkKKyAqIHByZWxvYWQuCisgKiBAbm90ZSBNYWNybyBJU19USU1fQ09NTVVUQVRJT05fRVZFTlRfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAqICAgICAgIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2UgaXMgYWJsZSB0byBnZW5lcmF0ZSBhIGNvbW11dGF0aW9uCisgKiBldmVudC4KKyAqIEBybXRvbGwgQ1IyICAgICAgICAgIENDUEMgICAgICAgICAgTExfVElNX0NDX0Rpc2FibGVQcmVsb2FkCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ0NfRGlzYWJsZVByZWxvYWQoVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgQ0xFQVJfQklUKFRJTXgtPkNSMiwgVElNX0NSMl9DQ1BDKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjYXB0dXJlL2NvbXBhcmUgY29udHJvbCBiaXRzIChDQ3hFLCBDQ3hORSBhbmQKKyAqIE9DeE0pIHByZWxvYWQgaXMgZW5hYmxlZC4KKyAqIEBybXRvbGwgQ1IyICAgICAgICAgIENDUEMgICAgICAgICAgTExfVElNX0NDX0lzRW5hYmxlZFByZWxvYWQKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fQ0NfSXNFbmFibGVkUHJlbG9hZChjb25zdCBUSU1fVHlwZURlZiAqVElNeCkgeworICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5DUjIsIFRJTV9DUjJfQ0NQQykgPT0gKFRJTV9DUjJfQ0NQQykpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFNldCB0aGUgdXBkYXRlZCBzb3VyY2Ugb2YgdGhlIGNhcHR1cmUvY29tcGFyZSBjb250cm9sIGJpdHMgKENDeEUsCisgKiBDQ3hORSBhbmQgT0N4TSkuCisgKiBAbm90ZSBNYWNybyBJU19USU1fQ09NTVVUQVRJT05fRVZFTlRfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAqICAgICAgIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2UgaXMgYWJsZSB0byBnZW5lcmF0ZSBhIGNvbW11dGF0aW9uCisgKiBldmVudC4KKyAqIEBybXRvbGwgQ1IyICAgICAgICAgIENDVVMgICAgICAgICAgTExfVElNX0NDX1NldFVwZGF0ZQorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcGFyYW0gIENDVXBkYXRlU291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0NVUERBVEVTT1VSQ0VfQ09NR19PTkxZCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0NVUERBVEVTT1VSQ0VfQ09NR19BTkRfVFJHSQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9DQ19TZXRVcGRhdGUoVElNX1R5cGVEZWYgKlRJTXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENDVXBkYXRlU291cmNlKSB7CisgIE1PRElGWV9SRUcoVElNeC0+Q1IyLCBUSU1fQ1IyX0NDVVMsIENDVXBkYXRlU291cmNlKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFNldCB0aGUgdHJpZ2dlciBvZiB0aGUgY2FwdHVyZS9jb21wYXJlIERNQSByZXF1ZXN0LgorICogQHJtdG9sbCBDUjIgICAgICAgICAgQ0NEUyAgICAgICAgICBMTF9USU1fQ0NfU2V0RE1BUmVxVHJpZ2dlcgorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcGFyYW0gIERNQVJlcVRyaWdnZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DQ0RNQVJFUVVFU1RfQ0MKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DQ0RNQVJFUVVFU1RfVVBEQVRFCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NDX1NldERNQVJlcVRyaWdnZXIoVElNX1R5cGVEZWYgKlRJTXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBETUFSZXFUcmlnZ2VyKSB7CisgIE1PRElGWV9SRUcoVElNeC0+Q1IyLCBUSU1fQ1IyX0NDRFMsIERNQVJlcVRyaWdnZXIpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IGFjdHVhbCB0cmlnZ2VyIG9mIHRoZSBjYXB0dXJlL2NvbXBhcmUgRE1BIHJlcXVlc3QuCisgKiBAcm10b2xsIENSMiAgICAgICAgICBDQ0RTICAgICAgICAgIExMX1RJTV9DQ19HZXRETUFSZXFUcmlnZ2VyCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DQ0RNQVJFUVVFU1RfQ0MKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DQ0RNQVJFUVVFU1RfVVBEQVRFCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fQ0NfR2V0RE1BUmVxVHJpZ2dlcihjb25zdCBUSU1fVHlwZURlZiAqVElNeCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChUSU14LT5DUjIsIFRJTV9DUjJfQ0NEUykpOworfQorCisvKioKKyAqIEBicmllZiAgU2V0IHRoZSBsb2NrIGxldmVsIHRvIGZyZWV6ZSB0aGUKKyAqICAgICAgICAgY29uZmlndXJhdGlvbiBvZiBzZXZlcmFsIGNhcHR1cmUvY29tcGFyZSBwYXJhbWV0ZXJzLgorICogQG5vdGUgTWFjcm8gSVNfVElNX0JSRUFLX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgKiAgICAgICB0aGUgbG9jayBtZWNoYW5pc20gaXMgc3VwcG9ydGVkIGJ5IGEgdGltZXIgaW5zdGFuY2UuCisgKiBAcm10b2xsIEJEVFIgICAgICAgICBMT0NLICAgICAgICAgIExMX1RJTV9DQ19TZXRMb2NrTGV2ZWwKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHBhcmFtICBMb2NrTGV2ZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9MT0NLTEVWRUxfT0ZGCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fTE9DS0xFVkVMXzEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9MT0NLTEVWRUxfMgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0xPQ0tMRVZFTF8zCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NDX1NldExvY2tMZXZlbChUSU1fVHlwZURlZiAqVElNeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgTG9ja0xldmVsKSB7CisgIE1PRElGWV9SRUcoVElNeC0+QkRUUiwgVElNX0JEVFJfTE9DSywgTG9ja0xldmVsKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBjYXB0dXJlL2NvbXBhcmUgY2hhbm5lbHMuCisgKiBAcm10b2xsIENDRVIgICAgICAgICBDQzFFICAgICAgICAgIExMX1RJTV9DQ19FbmFibGVDaGFubmVsXG4KKyAqICAgICAgICAgQ0NFUiAgICAgICAgIENDMU5FICAgICAgICAgTExfVElNX0NDX0VuYWJsZUNoYW5uZWxcbgorICogICAgICAgICBDQ0VSICAgICAgICAgQ0MyRSAgICAgICAgICBMTF9USU1fQ0NfRW5hYmxlQ2hhbm5lbFxuCisgKiAgICAgICAgIENDRVIgICAgICAgICBDQzJORSAgICAgICAgIExMX1RJTV9DQ19FbmFibGVDaGFubmVsXG4KKyAqICAgICAgICAgQ0NFUiAgICAgICAgIENDM0UgICAgICAgICAgTExfVElNX0NDX0VuYWJsZUNoYW5uZWxcbgorICogICAgICAgICBDQ0VSICAgICAgICAgQ0MzTkUgICAgICAgICBMTF9USU1fQ0NfRW5hYmxlQ2hhbm5lbFxuCisgKiAgICAgICAgIENDRVIgICAgICAgICBDQzRFICAgICAgICAgIExMX1RJTV9DQ19FbmFibGVDaGFubmVsXG4KKyAqICAgICAgICAgQ0NFUiAgICAgICAgIENDNE5FICAgICAgICAgTExfVElNX0NDX0VuYWJsZUNoYW5uZWxcbgorICogICAgICAgICBDQ0VSICAgICAgICAgQ0M1RSAgICAgICAgICBMTF9USU1fQ0NfRW5hYmxlQ2hhbm5lbFxuCisgKiAgICAgICAgIENDRVIgICAgICAgICBDQzZFICAgICAgICAgIExMX1RJTV9DQ19FbmFibGVDaGFubmVsCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEBwYXJhbSAgQ2hhbm5lbHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMU4KKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyTgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDNOCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINE4KKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINQorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g2CisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NDX0VuYWJsZUNoYW5uZWwoVElNX1R5cGVEZWYgKlRJTXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVscykgeworICBTRVRfQklUKFRJTXgtPkNDRVIsIENoYW5uZWxzKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgY2FwdHVyZS9jb21wYXJlIGNoYW5uZWxzLgorICogQHJtdG9sbCBDQ0VSICAgICAgICAgQ0MxRSAgICAgICAgICBMTF9USU1fQ0NfRGlzYWJsZUNoYW5uZWxcbgorICogICAgICAgICBDQ0VSICAgICAgICAgQ0MxTkUgICAgICAgICBMTF9USU1fQ0NfRGlzYWJsZUNoYW5uZWxcbgorICogICAgICAgICBDQ0VSICAgICAgICAgQ0MyRSAgICAgICAgICBMTF9USU1fQ0NfRGlzYWJsZUNoYW5uZWxcbgorICogICAgICAgICBDQ0VSICAgICAgICAgQ0MyTkUgICAgICAgICBMTF9USU1fQ0NfRGlzYWJsZUNoYW5uZWxcbgorICogICAgICAgICBDQ0VSICAgICAgICAgQ0MzRSAgICAgICAgICBMTF9USU1fQ0NfRGlzYWJsZUNoYW5uZWxcbgorICogICAgICAgICBDQ0VSICAgICAgICAgQ0MzTkUgICAgICAgICBMTF9USU1fQ0NfRGlzYWJsZUNoYW5uZWxcbgorICogICAgICAgICBDQ0VSICAgICAgICAgQ0M0RSAgICAgICAgICBMTF9USU1fQ0NfRGlzYWJsZUNoYW5uZWxcbgorICogICAgICAgICBDQ0VSICAgICAgICAgQ0M0TkUgICAgICAgICBMTF9USU1fQ0NfRGlzYWJsZUNoYW5uZWxcbgorICogICAgICAgICBDQ0VSICAgICAgICAgQ0M1RSAgICAgICAgICBMTF9USU1fQ0NfRGlzYWJsZUNoYW5uZWxcbgorICogICAgICAgICBDQ0VSICAgICAgICAgQ0M2RSAgICAgICAgICBMTF9USU1fQ0NfRGlzYWJsZUNoYW5uZWwKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHBhcmFtICBDaGFubmVscyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxTgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDJOCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIM04KKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINAorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0TgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g1CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDYKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ0NfRGlzYWJsZUNoYW5uZWwoVElNX1R5cGVEZWYgKlRJTXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbHMpIHsKKyAgQ0xFQVJfQklUKFRJTXgtPkNDRVIsIENoYW5uZWxzKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgY2hhbm5lbChzKSBpcyhhcmUpIGVuYWJsZWQuCisgKiBAcm10b2xsIENDRVIgICAgICAgICBDQzFFICAgICAgICAgIExMX1RJTV9DQ19Jc0VuYWJsZWRDaGFubmVsXG4KKyAqICAgICAgICAgQ0NFUiAgICAgICAgIENDMU5FICAgICAgICAgTExfVElNX0NDX0lzRW5hYmxlZENoYW5uZWxcbgorICogICAgICAgICBDQ0VSICAgICAgICAgQ0MyRSAgICAgICAgICBMTF9USU1fQ0NfSXNFbmFibGVkQ2hhbm5lbFxuCisgKiAgICAgICAgIENDRVIgICAgICAgICBDQzJORSAgICAgICAgIExMX1RJTV9DQ19Jc0VuYWJsZWRDaGFubmVsXG4KKyAqICAgICAgICAgQ0NFUiAgICAgICAgIENDM0UgICAgICAgICAgTExfVElNX0NDX0lzRW5hYmxlZENoYW5uZWxcbgorICogICAgICAgICBDQ0VSICAgICAgICAgQ0MzTkUgICAgICAgICBMTF9USU1fQ0NfSXNFbmFibGVkQ2hhbm5lbFxuCisgKiAgICAgICAgIENDRVIgICAgICAgICBDQzRFICAgICAgICAgIExMX1RJTV9DQ19Jc0VuYWJsZWRDaGFubmVsXG4KKyAqICAgICAgICAgQ0NFUiAgICAgICAgIENDNE5FICAgICAgICAgTExfVElNX0NDX0lzRW5hYmxlZENoYW5uZWxcbgorICogICAgICAgICBDQ0VSICAgICAgICAgQ0M1RSAgICAgICAgICBMTF9USU1fQ0NfSXNFbmFibGVkQ2hhbm5lbFxuCisgKiAgICAgICAgIENDRVIgICAgICAgICBDQzZFICAgICAgICAgIExMX1RJTV9DQ19Jc0VuYWJsZWRDaGFubmVsCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEBwYXJhbSAgQ2hhbm5lbHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMU4KKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyTgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDNOCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINE4KKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINQorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g2CisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9DQ19Jc0VuYWJsZWRDaGFubmVsKGNvbnN0IFRJTV9UeXBlRGVmICpUSU14LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWxzKSB7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPkNDRVIsIENoYW5uZWxzKSA9PSAoQ2hhbm5lbHMpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FRl9PdXRwdXRfQ2hhbm5lbCBPdXRwdXQgY2hhbm5lbCBjb25maWd1cmF0aW9uCisgKiBAeworICovCisvKioKKyAqIEBicmllZiAgQ29uZmlndXJlIGFuIG91dHB1dCBjaGFubmVsLgorICogQHJtdG9sbCBDQ01SMSAgICAgICAgQ0MxUyAgICAgICAgICBMTF9USU1fT0NfQ29uZmlnT3V0cHV0XG4KKyAqICAgICAgICAgQ0NNUjEgICAgICAgIENDMlMgICAgICAgICAgTExfVElNX09DX0NvbmZpZ091dHB1dFxuCisgKiAgICAgICAgIENDTVIyICAgICAgICBDQzNTICAgICAgICAgIExMX1RJTV9PQ19Db25maWdPdXRwdXRcbgorICogICAgICAgICBDQ01SMiAgICAgICAgQ0M0UyAgICAgICAgICBMTF9USU1fT0NfQ29uZmlnT3V0cHV0XG4KKyAqICAgICAgICAgQ0NNUjMgICAgICAgIENDNVMgICAgICAgICAgTExfVElNX09DX0NvbmZpZ091dHB1dFxuCisgKiAgICAgICAgIENDTVIzICAgICAgICBDQzZTICAgICAgICAgIExMX1RJTV9PQ19Db25maWdPdXRwdXRcbgorICogICAgICAgICBDQ0VSICAgICAgICAgQ0MxUCAgICAgICAgICBMTF9USU1fT0NfQ29uZmlnT3V0cHV0XG4KKyAqICAgICAgICAgQ0NFUiAgICAgICAgIENDMlAgICAgICAgICAgTExfVElNX09DX0NvbmZpZ091dHB1dFxuCisgKiAgICAgICAgIENDRVIgICAgICAgICBDQzNQICAgICAgICAgIExMX1RJTV9PQ19Db25maWdPdXRwdXRcbgorICogICAgICAgICBDQ0VSICAgICAgICAgQ0M0UCAgICAgICAgICBMTF9USU1fT0NfQ29uZmlnT3V0cHV0XG4KKyAqICAgICAgICAgQ0NFUiAgICAgICAgIENDNVAgICAgICAgICAgTExfVElNX09DX0NvbmZpZ091dHB1dFxuCisgKiAgICAgICAgIENDRVIgICAgICAgICBDQzZQICAgICAgICAgIExMX1RJTV9PQ19Db25maWdPdXRwdXRcbgorICogICAgICAgICBDUjIgICAgICAgICAgT0lTMSAgICAgICAgICBMTF9USU1fT0NfQ29uZmlnT3V0cHV0XG4KKyAqICAgICAgICAgQ1IyICAgICAgICAgIE9JUzIgICAgICAgICAgTExfVElNX09DX0NvbmZpZ091dHB1dFxuCisgKiAgICAgICAgIENSMiAgICAgICAgICBPSVMzICAgICAgICAgIExMX1RJTV9PQ19Db25maWdPdXRwdXRcbgorICogICAgICAgICBDUjIgICAgICAgICAgT0lTNCAgICAgICAgICBMTF9USU1fT0NfQ29uZmlnT3V0cHV0XG4KKyAqICAgICAgICAgQ1IyICAgICAgICAgIE9JUzUgICAgICAgICAgTExfVElNX09DX0NvbmZpZ091dHB1dFxuCisgKiAgICAgICAgIENSMiAgICAgICAgICBPSVM2ICAgICAgICAgIExMX1RJTV9PQ19Db25maWdPdXRwdXQKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINQorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g2CisgKiBAcGFyYW0gIENvbmZpZ3VyYXRpb24gVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIGNvbWJpbmF0aW9uIG9mIGFsbCB0aGUKKyAqIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NQT0xBUklUWV9ISUdIIG9yIEByZWYgTExfVElNX09DUE9MQVJJVFlfTE9XCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NJRExFU1RBVEVfTE9XIG9yIEByZWYgTExfVElNX09DSURMRVNUQVRFX0hJR0gKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fT0NfQ29uZmlnT3V0cHV0KFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDb25maWd1cmF0aW9uKSB7CisgIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7CisgIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgoCisgICAgICB1aW50MzJfdCkoKHVpbnQzMl90KSgmVElNeC0+Q0NNUjEpICsgT0ZGU0VUX1RBQl9DQ01SeFtpQ2hhbm5lbF0pKTsKKyAgQ0xFQVJfQklUKCpwUmVnLCAoVElNX0NDTVIxX0NDMVMgPDwgU0hJRlRfVEFCX09DeHhbaUNoYW5uZWxdKSk7CisgIE1PRElGWV9SRUcoVElNeC0+Q0NFUiwgKFRJTV9DQ0VSX0NDMVAgPDwgU0hJRlRfVEFCX0NDeFBbaUNoYW5uZWxdKSwKKyAgICAgICAgICAgICAoQ29uZmlndXJhdGlvbiAmIFRJTV9DQ0VSX0NDMVApIDw8IFNISUZUX1RBQl9DQ3hQW2lDaGFubmVsXSk7CisgIE1PRElGWV9SRUcoVElNeC0+Q1IyLCAoVElNX0NSMl9PSVMxIDw8IFNISUZUX1RBQl9PSVN4W2lDaGFubmVsXSksCisgICAgICAgICAgICAgKENvbmZpZ3VyYXRpb24gJiBUSU1fQ1IyX09JUzEpIDw8IFNISUZUX1RBQl9PSVN4W2lDaGFubmVsXSk7Cit9CisKKy8qKgorICogQGJyaWVmICBEZWZpbmUgdGhlIGJlaGF2aW9yIG9mIHRoZSBvdXRwdXQgcmVmZXJlbmNlIHNpZ25hbCBPQ3hSRUYgZnJvbSB3aGljaAorICogICAgICAgICBPQ3ggYW5kIE9DeE4gKHdoZW4gcmVsZXZhbnQpIGFyZSBkZXJpdmVkLgorICogQHJtdG9sbCBDQ01SMSAgICAgICAgT0MxTSAgICAgICAgICBMTF9USU1fT0NfU2V0TW9kZVxuCisgKiAgICAgICAgIENDTVIxICAgICAgICBPQzJNICAgICAgICAgIExMX1RJTV9PQ19TZXRNb2RlXG4KKyAqICAgICAgICAgQ0NNUjIgICAgICAgIE9DM00gICAgICAgICAgTExfVElNX09DX1NldE1vZGVcbgorICogICAgICAgICBDQ01SMiAgICAgICAgT0M0TSAgICAgICAgICBMTF9USU1fT0NfU2V0TW9kZVxuCisgKiAgICAgICAgIENDTVIzICAgICAgICBPQzVNICAgICAgICAgIExMX1RJTV9PQ19TZXRNb2RlXG4KKyAqICAgICAgICAgQ0NNUjMgICAgICAgIE9DNk0gICAgICAgICAgTExfVElNX09DX1NldE1vZGUKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINQorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g2CisgKiBAcGFyYW0gIE1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ01PREVfRlJPWkVOCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NNT0RFX0FDVElWRQorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9JTkFDVElWRQorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9UT0dHTEUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ01PREVfRk9SQ0VEX0lOQUNUSVZFCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NNT0RFX0ZPUkNFRF9BQ1RJVkUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ01PREVfUFdNMQorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9QV00yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NNT0RFX1JFVFJJR19PUE0xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NNT0RFX1JFVFJJR19PUE0yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NNT0RFX0NPTUJJTkVEX1BXTTEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ01PREVfQ09NQklORURfUFdNMgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9BU1lNTUVUUklDX1BXTTEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ01PREVfQVNZTU1FVFJJQ19QV00yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NNT0RFX1BVTFNFX09OX0NPTVBBUkUgICAoZm9yIGNoYW5uZWwgMyBvciBjaGFubmVsCisgKiA0IG9ubHkpCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NNT0RFX0RJUkVDVElPTl9PVVRQVVQgICAoZm9yIGNoYW5uZWwgMyBvciBjaGFubmVsCisgKiA0IG9ubHkpCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX09DX1NldE1vZGUoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBNb2RlKSB7CisgIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7CisgIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgoCisgICAgICB1aW50MzJfdCkoKHVpbnQzMl90KSgmVElNeC0+Q0NNUjEpICsgT0ZGU0VUX1RBQl9DQ01SeFtpQ2hhbm5lbF0pKTsKKyAgTU9ESUZZX1JFRygqcFJlZywKKyAgICAgICAgICAgICAoKFRJTV9DQ01SMV9PQzFNIHwgVElNX0NDTVIxX0NDMVMpIDw8IFNISUZUX1RBQl9PQ3h4W2lDaGFubmVsXSksCisgICAgICAgICAgICAgTW9kZSA8PCBTSElGVF9UQUJfT0N4eFtpQ2hhbm5lbF0pOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IHRoZSBvdXRwdXQgY29tcGFyZSBtb2RlIG9mIGFuIG91dHB1dCBjaGFubmVsLgorICogQHJtdG9sbCBDQ01SMSAgICAgICAgT0MxTSAgICAgICAgICBMTF9USU1fT0NfR2V0TW9kZVxuCisgKiAgICAgICAgIENDTVIxICAgICAgICBPQzJNICAgICAgICAgIExMX1RJTV9PQ19HZXRNb2RlXG4KKyAqICAgICAgICAgQ0NNUjIgICAgICAgIE9DM00gICAgICAgICAgTExfVElNX09DX0dldE1vZGVcbgorICogICAgICAgICBDQ01SMiAgICAgICAgT0M0TSAgICAgICAgICBMTF9USU1fT0NfR2V0TW9kZVxuCisgKiAgICAgICAgIENDTVIzICAgICAgICBPQzVNICAgICAgICAgIExMX1RJTV9PQ19HZXRNb2RlXG4KKyAqICAgICAgICAgQ0NNUjMgICAgICAgIE9DNk0gICAgICAgICAgTExfVElNX09DX0dldE1vZGUKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINQorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g2CisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NNT0RFX0ZST1pFTgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9BQ1RJVkUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ01PREVfSU5BQ1RJVkUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ01PREVfVE9HR0xFCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NNT0RFX0ZPUkNFRF9JTkFDVElWRQorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9GT1JDRURfQUNUSVZFCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NNT0RFX1BXTTEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ01PREVfUFdNMgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9SRVRSSUdfT1BNMQorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9SRVRSSUdfT1BNMgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9DT01CSU5FRF9QV00xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NNT0RFX0NPTUJJTkVEX1BXTTIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ01PREVfQVNZTU1FVFJJQ19QV00xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NNT0RFX0FTWU1NRVRSSUNfUFdNMgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9QVUxTRV9PTl9DT01QQVJFICAgKGZvciBjaGFubmVsIDMgb3IgY2hhbm5lbAorICogNCBvbmx5KQorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9ESVJFQ1RJT05fT1VUUFVUICAgKGZvciBjaGFubmVsIDMgb3IgY2hhbm5lbAorICogNCBvbmx5KQorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX09DX0dldE1vZGUoY29uc3QgVElNX1R5cGVEZWYgKlRJTXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCkgeworICB1aW50OF90IGlDaGFubmVsID0gVElNX0dFVF9DSEFOTkVMX0lOREVYKENoYW5uZWwpOworICBjb25zdCBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKAorICAgICAgdWludDMyX3QpKCh1aW50MzJfdCkoJlRJTXgtPkNDTVIxKSArIE9GRlNFVF9UQUJfQ0NNUnhbaUNoYW5uZWxdKSk7CisgIHJldHVybiAoUkVBRF9CSVQoKnBSZWcsICgoVElNX0NDTVIxX09DMU0gfCBUSU1fQ0NNUjFfQ0MxUykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IFNISUZUX1RBQl9PQ3h4W2lDaGFubmVsXSkpID4+CisgICAgICAgICAgU0hJRlRfVEFCX09DeHhbaUNoYW5uZWxdKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFNldCB0aGUgcG9sYXJpdHkgb2YgYW4gb3V0cHV0IGNoYW5uZWwuCisgKiBAcm10b2xsIENDRVIgICAgICAgICBDQzFQICAgICAgICAgIExMX1RJTV9PQ19TZXRQb2xhcml0eVxuCisgKiAgICAgICAgIENDRVIgICAgICAgICBDQzFOUCAgICAgICAgIExMX1RJTV9PQ19TZXRQb2xhcml0eVxuCisgKiAgICAgICAgIENDRVIgICAgICAgICBDQzJQICAgICAgICAgIExMX1RJTV9PQ19TZXRQb2xhcml0eVxuCisgKiAgICAgICAgIENDRVIgICAgICAgICBDQzJOUCAgICAgICAgIExMX1RJTV9PQ19TZXRQb2xhcml0eVxuCisgKiAgICAgICAgIENDRVIgICAgICAgICBDQzNQICAgICAgICAgIExMX1RJTV9PQ19TZXRQb2xhcml0eVxuCisgKiAgICAgICAgIENDRVIgICAgICAgICBDQzNOUCAgICAgICAgIExMX1RJTV9PQ19TZXRQb2xhcml0eVxuCisgKiAgICAgICAgIENDRVIgICAgICAgICBDQzRQICAgICAgICAgIExMX1RJTV9PQ19TZXRQb2xhcml0eVxuCisgKiAgICAgICAgIENDRVIgICAgICAgICBDQzROUCAgICAgICAgIExMX1RJTV9PQ19TZXRQb2xhcml0eVxuCisgKiAgICAgICAgIENDRVIgICAgICAgICBDQzVQICAgICAgICAgIExMX1RJTV9PQ19TZXRQb2xhcml0eVxuCisgKiAgICAgICAgIENDRVIgICAgICAgICBDQzZQICAgICAgICAgIExMX1RJTV9PQ19TZXRQb2xhcml0eQorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxTgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDJOCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIM04KKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINAorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0TgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g1CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDYKKyAqIEBwYXJhbSAgUG9sYXJpdHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ1BPTEFSSVRZX0hJR0gKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ1BPTEFSSVRZX0xPVworICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9PQ19TZXRQb2xhcml0eShUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQb2xhcml0eSkgeworICB1aW50OF90IGlDaGFubmVsID0gVElNX0dFVF9DSEFOTkVMX0lOREVYKENoYW5uZWwpOworICBNT0RJRllfUkVHKFRJTXgtPkNDRVIsIChUSU1fQ0NFUl9DQzFQIDw8IFNISUZUX1RBQl9DQ3hQW2lDaGFubmVsXSksCisgICAgICAgICAgICAgUG9sYXJpdHkgPDwgU0hJRlRfVEFCX0NDeFBbaUNoYW5uZWxdKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCB0aGUgcG9sYXJpdHkgb2YgYW4gb3V0cHV0IGNoYW5uZWwuCisgKiBAcm10b2xsIENDRVIgICAgICAgICBDQzFQICAgICAgICAgIExMX1RJTV9PQ19HZXRQb2xhcml0eVxuCisgKiAgICAgICAgIENDRVIgICAgICAgICBDQzFOUCAgICAgICAgIExMX1RJTV9PQ19HZXRQb2xhcml0eVxuCisgKiAgICAgICAgIENDRVIgICAgICAgICBDQzJQICAgICAgICAgIExMX1RJTV9PQ19HZXRQb2xhcml0eVxuCisgKiAgICAgICAgIENDRVIgICAgICAgICBDQzJOUCAgICAgICAgIExMX1RJTV9PQ19HZXRQb2xhcml0eVxuCisgKiAgICAgICAgIENDRVIgICAgICAgICBDQzNQICAgICAgICAgIExMX1RJTV9PQ19HZXRQb2xhcml0eVxuCisgKiAgICAgICAgIENDRVIgICAgICAgICBDQzNOUCAgICAgICAgIExMX1RJTV9PQ19HZXRQb2xhcml0eVxuCisgKiAgICAgICAgIENDRVIgICAgICAgICBDQzRQICAgICAgICAgIExMX1RJTV9PQ19HZXRQb2xhcml0eVxuCisgKiAgICAgICAgIENDRVIgICAgICAgICBDQzROUCAgICAgICAgIExMX1RJTV9PQ19HZXRQb2xhcml0eVxuCisgKiAgICAgICAgIENDRVIgICAgICAgICBDQzVQICAgICAgICAgIExMX1RJTV9PQ19HZXRQb2xhcml0eVxuCisgKiAgICAgICAgIENDRVIgICAgICAgICBDQzZQICAgICAgICAgIExMX1RJTV9PQ19HZXRQb2xhcml0eQorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxTgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDJOCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIM04KKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINAorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0TgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g1CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDYKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ1BPTEFSSVRZX0hJR0gKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ1BPTEFSSVRZX0xPVworICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX09DX0dldFBvbGFyaXR5KGNvbnN0IFRJTV9UeXBlRGVmICpUSU14LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKSB7CisgIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7CisgIHJldHVybiAoUkVBRF9CSVQoVElNeC0+Q0NFUiwgKFRJTV9DQ0VSX0NDMVAgPDwgU0hJRlRfVEFCX0NDeFBbaUNoYW5uZWxdKSkgPj4KKyAgICAgICAgICBTSElGVF9UQUJfQ0N4UFtpQ2hhbm5lbF0pOworfQorCisvKioKKyAqIEBicmllZiAgU2V0IHRoZSBJRExFIHN0YXRlIG9mIGFuIG91dHB1dCBjaGFubmVsCisgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIGlzIHNpZ25pZmljYW50IG9ubHkgZm9yIHRoZSB0aW1lciBpbnN0YW5jZXMKKyAqICAgICAgIHN1cHBvcnRpbmcgdGhlIGJyZWFrIGZlYXR1cmUuIE1hY3JvIElTX1RJTV9CUkVBS19JTlNUQU5DRShUSU14KQorICogICAgICAgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcworICogICAgICAgYSBicmVhayBpbnB1dC4KKyAqIEBybXRvbGwgQ1IyICAgICAgICAgT0lTMSAgICAgICAgICBMTF9USU1fT0NfU2V0SWRsZVN0YXRlXG4KKyAqICAgICAgICAgQ1IyICAgICAgICAgT0lTMk4gICAgICAgICBMTF9USU1fT0NfU2V0SWRsZVN0YXRlXG4KKyAqICAgICAgICAgQ1IyICAgICAgICAgT0lTMiAgICAgICAgICBMTF9USU1fT0NfU2V0SWRsZVN0YXRlXG4KKyAqICAgICAgICAgQ1IyICAgICAgICAgT0lTMk4gICAgICAgICBMTF9USU1fT0NfU2V0SWRsZVN0YXRlXG4KKyAqICAgICAgICAgQ1IyICAgICAgICAgT0lTMyAgICAgICAgICBMTF9USU1fT0NfU2V0SWRsZVN0YXRlXG4KKyAqICAgICAgICAgQ1IyICAgICAgICAgT0lTM04gICAgICAgICBMTF9USU1fT0NfU2V0SWRsZVN0YXRlXG4KKyAqICAgICAgICAgQ1IyICAgICAgICAgT0lTNCAgICAgICAgICBMTF9USU1fT0NfU2V0SWRsZVN0YXRlXG4KKyAqICAgICAgICAgQ1IyICAgICAgICAgT0lTNE4gICAgICAgICBMTF9USU1fT0NfU2V0SWRsZVN0YXRlXG4KKyAqICAgICAgICAgQ1IyICAgICAgICAgT0lTNSAgICAgICAgICBMTF9USU1fT0NfU2V0SWRsZVN0YXRlXG4KKyAqICAgICAgICAgQ1IyICAgICAgICAgT0lTNiAgICAgICAgICBMTF9USU1fT0NfU2V0SWRsZVN0YXRlCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDFOCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMk4KKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMworICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzTgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDROCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINgorICogQHBhcmFtICBJZGxlU3RhdGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ0lETEVTVEFURV9MT1cKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ0lETEVTVEFURV9ISUdICisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX09DX1NldElkbGVTdGF0ZShUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgSWRsZVN0YXRlKSB7CisgIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7CisgIE1PRElGWV9SRUcoVElNeC0+Q1IyLCAoVElNX0NSMl9PSVMxIDw8IFNISUZUX1RBQl9PSVN4W2lDaGFubmVsXSksCisgICAgICAgICAgICAgSWRsZVN0YXRlIDw8IFNISUZUX1RBQl9PSVN4W2lDaGFubmVsXSk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgdGhlIElETEUgc3RhdGUgb2YgYW4gb3V0cHV0IGNoYW5uZWwKKyAqIEBybXRvbGwgQ1IyICAgICAgICAgT0lTMSAgICAgICAgICBMTF9USU1fT0NfR2V0SWRsZVN0YXRlXG4KKyAqICAgICAgICAgQ1IyICAgICAgICAgT0lTMk4gICAgICAgICBMTF9USU1fT0NfR2V0SWRsZVN0YXRlXG4KKyAqICAgICAgICAgQ1IyICAgICAgICAgT0lTMiAgICAgICAgICBMTF9USU1fT0NfR2V0SWRsZVN0YXRlXG4KKyAqICAgICAgICAgQ1IyICAgICAgICAgT0lTMk4gICAgICAgICBMTF9USU1fT0NfR2V0SWRsZVN0YXRlXG4KKyAqICAgICAgICAgQ1IyICAgICAgICAgT0lTMyAgICAgICAgICBMTF9USU1fT0NfR2V0SWRsZVN0YXRlXG4KKyAqICAgICAgICAgQ1IyICAgICAgICAgT0lTM04gICAgICAgICBMTF9USU1fT0NfR2V0SWRsZVN0YXRlXG4KKyAqICAgICAgICAgQ1IyICAgICAgICAgT0lTNCAgICAgICAgICBMTF9USU1fT0NfR2V0SWRsZVN0YXRlXG4KKyAqICAgICAgICAgQ1IyICAgICAgICAgT0lTNE4gICAgICAgICBMTF9USU1fT0NfR2V0SWRsZVN0YXRlXG4KKyAqICAgICAgICAgQ1IyICAgICAgICAgT0lTNSAgICAgICAgICBMTF9USU1fT0NfR2V0SWRsZVN0YXRlXG4KKyAqICAgICAgICAgQ1IyICAgICAgICAgT0lTNiAgICAgICAgICBMTF9USU1fT0NfR2V0SWRsZVN0YXRlCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDFOCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMk4KKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMworICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzTgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDROCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINgorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DSURMRVNUQVRFX0xPVworICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DSURMRVNUQVRFX0hJR0gKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9PQ19HZXRJZGxlU3RhdGUoY29uc3QgVElNX1R5cGVEZWYgKlRJTXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKSB7CisgIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7CisgIHJldHVybiAoUkVBRF9CSVQoVElNeC0+Q1IyLCAoVElNX0NSMl9PSVMxIDw8IFNISUZUX1RBQl9PSVN4W2lDaGFubmVsXSkpID4+CisgICAgICAgICAgU0hJRlRfVEFCX09JU3hbaUNoYW5uZWxdKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBmYXN0IG1vZGUgZm9yIHRoZSBvdXRwdXQgY2hhbm5lbC4KKyAqIEBub3RlIEFjdHMgb25seSBpZiB0aGUgY2hhbm5lbCBpcyBjb25maWd1cmVkIGluIFBXTTEgb3IgUFdNMiBtb2RlLgorICogQHJtdG9sbCBDQ01SMSAgICAgICAgT0MxRkUgICAgICAgICAgTExfVElNX09DX0VuYWJsZUZhc3RcbgorICogICAgICAgICBDQ01SMSAgICAgICAgT0MyRkUgICAgICAgICAgTExfVElNX09DX0VuYWJsZUZhc3RcbgorICogICAgICAgICBDQ01SMiAgICAgICAgT0MzRkUgICAgICAgICAgTExfVElNX09DX0VuYWJsZUZhc3RcbgorICogICAgICAgICBDQ01SMiAgICAgICAgT0M0RkUgICAgICAgICAgTExfVElNX09DX0VuYWJsZUZhc3RcbgorICogICAgICAgICBDQ01SMyAgICAgICAgT0M1RkUgICAgICAgICAgTExfVElNX09DX0VuYWJsZUZhc3RcbgorICogICAgICAgICBDQ01SMyAgICAgICAgT0M2RkUgICAgICAgICAgTExfVElNX09DX0VuYWJsZUZhc3QKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINQorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g2CisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX09DX0VuYWJsZUZhc3QoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENoYW5uZWwpIHsKKyAgdWludDhfdCBpQ2hhbm5lbCA9IFRJTV9HRVRfQ0hBTk5FTF9JTkRFWChDaGFubmVsKTsKKyAgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCgKKyAgICAgIHVpbnQzMl90KSgodWludDMyX3QpKCZUSU14LT5DQ01SMSkgKyBPRkZTRVRfVEFCX0NDTVJ4W2lDaGFubmVsXSkpOworICBTRVRfQklUKCpwUmVnLCAoVElNX0NDTVIxX09DMUZFIDw8IFNISUZUX1RBQl9PQ3h4W2lDaGFubmVsXSkpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBmYXN0IG1vZGUgZm9yIHRoZSBvdXRwdXQgY2hhbm5lbC4KKyAqIEBybXRvbGwgQ0NNUjEgICAgICAgIE9DMUZFICAgICAgICAgIExMX1RJTV9PQ19EaXNhYmxlRmFzdFxuCisgKiAgICAgICAgIENDTVIxICAgICAgICBPQzJGRSAgICAgICAgICBMTF9USU1fT0NfRGlzYWJsZUZhc3RcbgorICogICAgICAgICBDQ01SMiAgICAgICAgT0MzRkUgICAgICAgICAgTExfVElNX09DX0Rpc2FibGVGYXN0XG4KKyAqICAgICAgICAgQ0NNUjIgICAgICAgIE9DNEZFICAgICAgICAgIExMX1RJTV9PQ19EaXNhYmxlRmFzdFxuCisgKiAgICAgICAgIENDTVIzICAgICAgICBPQzVGRSAgICAgICAgICBMTF9USU1fT0NfRGlzYWJsZUZhc3RcbgorICogICAgICAgICBDQ01SMyAgICAgICAgT0M2RkUgICAgICAgICAgTExfVElNX09DX0Rpc2FibGVGYXN0CisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMworICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINgorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9PQ19EaXNhYmxlRmFzdChUSU1fVHlwZURlZiAqVElNeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKSB7CisgIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7CisgIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgoCisgICAgICB1aW50MzJfdCkoKHVpbnQzMl90KSgmVElNeC0+Q0NNUjEpICsgT0ZGU0VUX1RBQl9DQ01SeFtpQ2hhbm5lbF0pKTsKKyAgQ0xFQVJfQklUKCpwUmVnLCAoVElNX0NDTVIxX09DMUZFIDw8IFNISUZUX1RBQl9PQ3h4W2lDaGFubmVsXSkpOworfQorCisvKioKKyAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgZmFzdCBtb2RlIGlzIGVuYWJsZWQgZm9yIHRoZSBvdXRwdXQgY2hhbm5lbC4KKyAqIEBybXRvbGwgQ0NNUjEgICAgICAgIE9DMUZFICAgICAgICAgIExMX1RJTV9PQ19Jc0VuYWJsZWRGYXN0XG4KKyAqICAgICAgICAgQ0NNUjEgICAgICAgIE9DMkZFICAgICAgICAgIExMX1RJTV9PQ19Jc0VuYWJsZWRGYXN0XG4KKyAqICAgICAgICAgQ0NNUjIgICAgICAgIE9DM0ZFICAgICAgICAgIExMX1RJTV9PQ19Jc0VuYWJsZWRGYXN0XG4KKyAqICAgICAgICAgQ0NNUjIgICAgICAgIE9DNEZFICAgICAgICAgIExMX1RJTV9PQ19Jc0VuYWJsZWRGYXN0XG4KKyAqICAgICAgICAgQ0NNUjMgICAgICAgIE9DNUZFICAgICAgICAgIExMX1RJTV9PQ19Jc0VuYWJsZWRGYXN0XG4KKyAqICAgICAgICAgQ0NNUjMgICAgICAgIE9DNkZFICAgICAgICAgIExMX1RJTV9PQ19Jc0VuYWJsZWRGYXN0CisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMworICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINgorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fT0NfSXNFbmFibGVkRmFzdChjb25zdCBUSU1fVHlwZURlZiAqVElNeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKSB7CisgIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7CisgIGNvbnN0IF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgoCisgICAgICB1aW50MzJfdCkoKHVpbnQzMl90KSgmVElNeC0+Q0NNUjEpICsgT0ZGU0VUX1RBQl9DQ01SeFtpQ2hhbm5lbF0pKTsKKyAgdWludDMyX3QgYml0ZmllbGQgPSBUSU1fQ0NNUjFfT0MxRkUgPDwgU0hJRlRfVEFCX09DeHhbaUNoYW5uZWxdOworICByZXR1cm4gKChSRUFEX0JJVCgqcFJlZywgYml0ZmllbGQpID09IGJpdGZpZWxkKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgY29tcGFyZSByZWdpc3RlciAoVElNeF9DQ1J4KSBwcmVsb2FkIGZvciB0aGUgb3V0cHV0IGNoYW5uZWwuCisgKiBAcm10b2xsIENDTVIxICAgICAgICBPQzFQRSAgICAgICAgICBMTF9USU1fT0NfRW5hYmxlUHJlbG9hZFxuCisgKiAgICAgICAgIENDTVIxICAgICAgICBPQzJQRSAgICAgICAgICBMTF9USU1fT0NfRW5hYmxlUHJlbG9hZFxuCisgKiAgICAgICAgIENDTVIyICAgICAgICBPQzNQRSAgICAgICAgICBMTF9USU1fT0NfRW5hYmxlUHJlbG9hZFxuCisgKiAgICAgICAgIENDTVIyICAgICAgICBPQzRQRSAgICAgICAgICBMTF9USU1fT0NfRW5hYmxlUHJlbG9hZFxuCisgKiAgICAgICAgIENDTVIzICAgICAgICBPQzVQRSAgICAgICAgICBMTF9USU1fT0NfRW5hYmxlUHJlbG9hZFxuCisgKiAgICAgICAgIENDTVIzICAgICAgICBPQzZQRSAgICAgICAgICBMTF9USU1fT0NfRW5hYmxlUHJlbG9hZAorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINAorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g1CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDYKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fT0NfRW5hYmxlUHJlbG9hZChUSU1fVHlwZURlZiAqVElNeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpIHsKKyAgdWludDhfdCBpQ2hhbm5lbCA9IFRJTV9HRVRfQ0hBTk5FTF9JTkRFWChDaGFubmVsKTsKKyAgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCgKKyAgICAgIHVpbnQzMl90KSgodWludDMyX3QpKCZUSU14LT5DQ01SMSkgKyBPRkZTRVRfVEFCX0NDTVJ4W2lDaGFubmVsXSkpOworICBTRVRfQklUKCpwUmVnLCAoVElNX0NDTVIxX09DMVBFIDw8IFNISUZUX1RBQl9PQ3h4W2lDaGFubmVsXSkpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBjb21wYXJlIHJlZ2lzdGVyIChUSU14X0NDUngpIHByZWxvYWQgZm9yIHRoZSBvdXRwdXQgY2hhbm5lbC4KKyAqIEBybXRvbGwgQ0NNUjEgICAgICAgIE9DMVBFICAgICAgICAgIExMX1RJTV9PQ19EaXNhYmxlUHJlbG9hZFxuCisgKiAgICAgICAgIENDTVIxICAgICAgICBPQzJQRSAgICAgICAgICBMTF9USU1fT0NfRGlzYWJsZVByZWxvYWRcbgorICogICAgICAgICBDQ01SMiAgICAgICAgT0MzUEUgICAgICAgICAgTExfVElNX09DX0Rpc2FibGVQcmVsb2FkXG4KKyAqICAgICAgICAgQ0NNUjIgICAgICAgIE9DNFBFICAgICAgICAgIExMX1RJTV9PQ19EaXNhYmxlUHJlbG9hZFxuCisgKiAgICAgICAgIENDTVIzICAgICAgICBPQzVQRSAgICAgICAgICBMTF9USU1fT0NfRGlzYWJsZVByZWxvYWRcbgorICogICAgICAgICBDQ01SMyAgICAgICAgT0M2UEUgICAgICAgICAgTExfVElNX09DX0Rpc2FibGVQcmVsb2FkCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMworICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINgorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9PQ19EaXNhYmxlUHJlbG9hZChUSU1fVHlwZURlZiAqVElNeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKSB7CisgIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7CisgIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgoCisgICAgICB1aW50MzJfdCkoKHVpbnQzMl90KSgmVElNeC0+Q0NNUjEpICsgT0ZGU0VUX1RBQl9DQ01SeFtpQ2hhbm5lbF0pKTsKKyAgQ0xFQVJfQklUKCpwUmVnLCAoVElNX0NDTVIxX09DMVBFIDw8IFNISUZUX1RBQl9PQ3h4W2lDaGFubmVsXSkpOworfQorCisvKioKKyAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgY29tcGFyZSByZWdpc3RlciAoVElNeF9DQ1J4KSBwcmVsb2FkIGlzIGVuYWJsZWQgZm9yCisgKiB0aGUgb3V0cHV0IGNoYW5uZWwuCisgKiBAcm10b2xsIENDTVIxICAgICAgICBPQzFQRSAgICAgICAgICBMTF9USU1fT0NfSXNFbmFibGVkUHJlbG9hZFxuCisgKiAgICAgICAgIENDTVIxICAgICAgICBPQzJQRSAgICAgICAgICBMTF9USU1fT0NfSXNFbmFibGVkUHJlbG9hZFxuCisgKiAgICAgICAgIENDTVIyICAgICAgICBPQzNQRSAgICAgICAgICBMTF9USU1fT0NfSXNFbmFibGVkUHJlbG9hZFxuCisgKiAgICAgICAgIENDTVIyICAgICAgICBPQzRQRSAgICAgICAgICBMTF9USU1fT0NfSXNFbmFibGVkUHJlbG9hZFxuCisgKiAgICAgICAgIENDTVIzICAgICAgICBPQzVQRSAgICAgICAgICBMTF9USU1fT0NfSXNFbmFibGVkUHJlbG9hZFxuCisgKiAgICAgICAgIENDTVIzICAgICAgICBPQzZQRSAgICAgICAgICBMTF9USU1fT0NfSXNFbmFibGVkUHJlbG9hZAorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINAorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g1CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDYKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX09DX0lzRW5hYmxlZFByZWxvYWQoY29uc3QgVElNX1R5cGVEZWYgKlRJTXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCkgeworICB1aW50OF90IGlDaGFubmVsID0gVElNX0dFVF9DSEFOTkVMX0lOREVYKENoYW5uZWwpOworICBjb25zdCBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKAorICAgICAgdWludDMyX3QpKCh1aW50MzJfdCkoJlRJTXgtPkNDTVIxKSArIE9GRlNFVF9UQUJfQ0NNUnhbaUNoYW5uZWxdKSk7CisgIHVpbnQzMl90IGJpdGZpZWxkID0gVElNX0NDTVIxX09DMVBFIDw8IFNISUZUX1RBQl9PQ3h4W2lDaGFubmVsXTsKKyAgcmV0dXJuICgoUkVBRF9CSVQoKnBSZWcsIGJpdGZpZWxkKSA9PSBiaXRmaWVsZCkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIGNsZWFyaW5nIHRoZSBvdXRwdXQgY2hhbm5lbCBvbiBhbiBleHRlcm5hbCBldmVudC4KKyAqIEBub3RlIFRoaXMgZnVuY3Rpb24gY2FuIG9ubHkgYmUgdXNlZCBpbiBPdXRwdXQgY29tcGFyZSBhbmQgUFdNIG1vZGVzLiBJdCBkb2VzCisgKiBub3Qgd29yayBpbiBGb3JjZWQgbW9kZS4KKyAqIEBub3RlIE1hY3JvIElTX1RJTV9PQ1hSRUZfQ0xFQVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlcgorICogICAgICAgb3Igbm90IGEgdGltZXIgaW5zdGFuY2UgY2FuIGNsZWFyIHRoZSBPQ3hSRUYgc2lnbmFsIG9uIGFuIGV4dGVybmFsCisgKiBldmVudC4KKyAqIEBybXRvbGwgQ0NNUjEgICAgICAgIE9DMUNFICAgICAgICAgIExMX1RJTV9PQ19FbmFibGVDbGVhclxuCisgKiAgICAgICAgIENDTVIxICAgICAgICBPQzJDRSAgICAgICAgICBMTF9USU1fT0NfRW5hYmxlQ2xlYXJcbgorICogICAgICAgICBDQ01SMiAgICAgICAgT0MzQ0UgICAgICAgICAgTExfVElNX09DX0VuYWJsZUNsZWFyXG4KKyAqICAgICAgICAgQ0NNUjIgICAgICAgIE9DNENFICAgICAgICAgIExMX1RJTV9PQ19FbmFibGVDbGVhclxuCisgKiAgICAgICAgIENDTVIzICAgICAgICBPQzVDRSAgICAgICAgICBMTF9USU1fT0NfRW5hYmxlQ2xlYXJcbgorICogICAgICAgICBDQ01SMyAgICAgICAgT0M2Q0UgICAgICAgICAgTExfVElNX09DX0VuYWJsZUNsZWFyCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMworICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINgorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9PQ19FbmFibGVDbGVhcihUSU1fVHlwZURlZiAqVElNeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKSB7CisgIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7CisgIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgoCisgICAgICB1aW50MzJfdCkoKHVpbnQzMl90KSgmVElNeC0+Q0NNUjEpICsgT0ZGU0VUX1RBQl9DQ01SeFtpQ2hhbm5lbF0pKTsKKyAgU0VUX0JJVCgqcFJlZywgKFRJTV9DQ01SMV9PQzFDRSA8PCBTSElGVF9UQUJfT0N4eFtpQ2hhbm5lbF0pKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgY2xlYXJpbmcgdGhlIG91dHB1dCBjaGFubmVsIG9uIGFuIGV4dGVybmFsIGV2ZW50LgorICogQG5vdGUgTWFjcm8gSVNfVElNX09DWFJFRl9DTEVBUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyCisgKiAgICAgICBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBjYW4gY2xlYXIgdGhlIE9DeFJFRiBzaWduYWwgb24gYW4gZXh0ZXJuYWwKKyAqIGV2ZW50LgorICogQHJtdG9sbCBDQ01SMSAgICAgICAgT0MxQ0UgICAgICAgICAgTExfVElNX09DX0Rpc2FibGVDbGVhclxuCisgKiAgICAgICAgIENDTVIxICAgICAgICBPQzJDRSAgICAgICAgICBMTF9USU1fT0NfRGlzYWJsZUNsZWFyXG4KKyAqICAgICAgICAgQ0NNUjIgICAgICAgIE9DM0NFICAgICAgICAgIExMX1RJTV9PQ19EaXNhYmxlQ2xlYXJcbgorICogICAgICAgICBDQ01SMiAgICAgICAgT0M0Q0UgICAgICAgICAgTExfVElNX09DX0Rpc2FibGVDbGVhclxuCisgKiAgICAgICAgIENDTVIzICAgICAgICBPQzVDRSAgICAgICAgICBMTF9USU1fT0NfRGlzYWJsZUNsZWFyXG4KKyAqICAgICAgICAgQ0NNUjMgICAgICAgIE9DNkNFICAgICAgICAgIExMX1RJTV9PQ19EaXNhYmxlQ2xlYXIKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINQorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g2CisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX09DX0Rpc2FibGVDbGVhcihUSU1fVHlwZURlZiAqVElNeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCkgeworICB1aW50OF90IGlDaGFubmVsID0gVElNX0dFVF9DSEFOTkVMX0lOREVYKENoYW5uZWwpOworICBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKAorICAgICAgdWludDMyX3QpKCh1aW50MzJfdCkoJlRJTXgtPkNDTVIxKSArIE9GRlNFVF9UQUJfQ0NNUnhbaUNoYW5uZWxdKSk7CisgIENMRUFSX0JJVCgqcFJlZywgKFRJTV9DQ01SMV9PQzFDRSA8PCBTSElGVF9UQUJfT0N4eFtpQ2hhbm5lbF0pKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEluZGljYXRlcyBjbGVhcmluZyB0aGUgb3V0cHV0IGNoYW5uZWwgb24gYW4gZXh0ZXJuYWwgZXZlbnQgaXMgZW5hYmxlZAorICogZm9yIHRoZSBvdXRwdXQgY2hhbm5lbC4KKyAqIEBub3RlIFRoaXMgZnVuY3Rpb24gZW5hYmxlcyBjbGVhcmluZyB0aGUgb3V0cHV0IGNoYW5uZWwgb24gYW4gZXh0ZXJuYWwgZXZlbnQuCisgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIGNhbiBvbmx5IGJlIHVzZWQgaW4gT3V0cHV0IGNvbXBhcmUgYW5kIFBXTSBtb2Rlcy4gSXQgZG9lcworICogbm90IHdvcmsgaW4gRm9yY2VkIG1vZGUuCisgKiBAbm90ZSBNYWNybyBJU19USU1fT0NYUkVGX0NMRUFSX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIKKyAqICAgICAgIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIGNhbiBjbGVhciB0aGUgT0N4UkVGIHNpZ25hbCBvbiBhbiBleHRlcm5hbAorICogZXZlbnQuCisgKiBAcm10b2xsIENDTVIxICAgICAgICBPQzFDRSAgICAgICAgICBMTF9USU1fT0NfSXNFbmFibGVkQ2xlYXJcbgorICogICAgICAgICBDQ01SMSAgICAgICAgT0MyQ0UgICAgICAgICAgTExfVElNX09DX0lzRW5hYmxlZENsZWFyXG4KKyAqICAgICAgICAgQ0NNUjIgICAgICAgIE9DM0NFICAgICAgICAgIExMX1RJTV9PQ19Jc0VuYWJsZWRDbGVhclxuCisgKiAgICAgICAgIENDTVIyICAgICAgICBPQzRDRSAgICAgICAgICBMTF9USU1fT0NfSXNFbmFibGVkQ2xlYXJcbgorICogICAgICAgICBDQ01SMyAgICAgICAgT0M1Q0UgICAgICAgICAgTExfVElNX09DX0lzRW5hYmxlZENsZWFyXG4KKyAqICAgICAgICAgQ0NNUjMgICAgICAgIE9DNkNFICAgICAgICAgIExMX1RJTV9PQ19Jc0VuYWJsZWRDbGVhcgorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINAorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g1CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDYKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX09DX0lzRW5hYmxlZENsZWFyKGNvbnN0IFRJTV9UeXBlRGVmICpUSU14LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKSB7CisgIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7CisgIGNvbnN0IF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgoCisgICAgICB1aW50MzJfdCkoKHVpbnQzMl90KSgmVElNeC0+Q0NNUjEpICsgT0ZGU0VUX1RBQl9DQ01SeFtpQ2hhbm5lbF0pKTsKKyAgdWludDMyX3QgYml0ZmllbGQgPSBUSU1fQ0NNUjFfT0MxQ0UgPDwgU0hJRlRfVEFCX09DeHhbaUNoYW5uZWxdOworICByZXR1cm4gKChSRUFEX0JJVCgqcFJlZywgYml0ZmllbGQpID09IGJpdGZpZWxkKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBTZXQgdGhlIGRlYWQtdGltZSBkZWxheSAoZGVsYXkgaW5zZXJ0ZWQgYmV0d2VlbiB0aGUgcmlzaW5nIGVkZ2Ugb2YKKyAqIHRoZSBPQ3hSRUYgc2lnbmFsIGFuZCB0aGUgcmlzaW5nIGVkZ2Ugb2YgdGhlIE9jeCBhbmQgT0N4TiBzaWduYWxzKS4KKyAqIEBub3RlIE1hY3JvIElTX1RJTV9CUkVBS19JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICogICAgICAgZGVhZC10aW1lIGluc2VydGlvbiBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSBhIHRpbWVyIGluc3RhbmNlLgorICogQG5vdGUgSGVscGVyIG1hY3JvIEByZWYgX19MTF9USU1fQ0FMQ19ERUFEVElNRSBjYW4gYmUgdXNlZCB0byBjYWxjdWxhdGUgdGhlCisgKiBEZWFkVGltZSBwYXJhbWV0ZXIKKyAqIEBybXRvbGwgQkRUUiAgICAgICAgIERURyAgICAgICAgICAgTExfVElNX09DX1NldERlYWRUaW1lCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEBwYXJhbSAgRGVhZFRpbWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0yNTUKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fT0NfU2V0RGVhZFRpbWUoVElNX1R5cGVEZWYgKlRJTXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRGVhZFRpbWUpIHsKKyAgTU9ESUZZX1JFRyhUSU14LT5CRFRSLCBUSU1fQkRUUl9EVEcsIERlYWRUaW1lKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFNldCBjb21wYXJlIHZhbHVlIGZvciBvdXRwdXQgY2hhbm5lbCAxIChUSU14X0NDUjEpLgorICogQG5vdGUgSW4gMzItYml0IHRpbWVyIGltcGxlbWVudGF0aW9ucyBjb21wYXJlIHZhbHVlIGNhbiBiZSBiZXR3ZWVuIDB4MDAwMDAwMDAKKyAqIGFuZCAweEZGRkZGRkZGLgorICogQG5vdGUgTWFjcm8gSVNfVElNXzMyQl9DT1VOVEVSX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGEgMzIgYml0cyBjb3VudGVyLgorICogQG5vdGUgTWFjcm8gSVNfVElNX0NDMV9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICogICAgICAgb3V0cHV0IGNoYW5uZWwgMSBpcyBzdXBwb3J0ZWQgYnkgYSB0aW1lciBpbnN0YW5jZS4KKyAqIEBub3RlIElmIGRpdGhlcmluZyBpcyBhY3RpdmF0ZWQsIENvbXBhcmVWYWx1ZSBjYW4gYmUgY2FsY3VsYXRlZCB3aXRoIG1hY3JvCisgKiBAcmVmIF9fTExfVElNX0NBTENfREVMQVlfRElUSEVSIC4KKyAqIEBybXRvbGwgQ0NSMSAgICAgICAgIENDUjEgICAgICAgICAgTExfVElNX09DX1NldENvbXBhcmVDSDEKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHBhcmFtICBDb21wYXJlVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUzNQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9PQ19TZXRDb21wYXJlQ0gxKFRJTV9UeXBlRGVmICpUSU14LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ29tcGFyZVZhbHVlKSB7CisgIFdSSVRFX1JFRyhUSU14LT5DQ1IxLCBDb21wYXJlVmFsdWUpOworfQorCisvKioKKyAqIEBicmllZiAgU2V0IGNvbXBhcmUgdmFsdWUgZm9yIG91dHB1dCBjaGFubmVsIDIgKFRJTXhfQ0NSMikuCisgKiBAbm90ZSBJbiAzMi1iaXQgdGltZXIgaW1wbGVtZW50YXRpb25zIGNvbXBhcmUgdmFsdWUgY2FuIGJlIGJldHdlZW4gMHgwMDAwMDAwMAorICogYW5kIDB4RkZGRkZGRkYuCisgKiBAbm90ZSBNYWNybyBJU19USU1fMzJCX0NPVU5URVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAqICAgICAgIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgYSAzMiBiaXRzIGNvdW50ZXIuCisgKiBAbm90ZSBNYWNybyBJU19USU1fQ0MyX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgKiAgICAgICBvdXRwdXQgY2hhbm5lbCAyIGlzIHN1cHBvcnRlZCBieSBhIHRpbWVyIGluc3RhbmNlLgorICogQG5vdGUgSWYgZGl0aGVyaW5nIGlzIGFjdGl2YXRlZCwgQ29tcGFyZVZhbHVlIGNhbiBiZSBjYWxjdWxhdGVkIHdpdGggbWFjcm8KKyAqIEByZWYgX19MTF9USU1fQ0FMQ19ERUxBWV9ESVRIRVIgLgorICogQHJtdG9sbCBDQ1IyICAgICAgICAgQ0NSMiAgICAgICAgICBMTF9USU1fT0NfU2V0Q29tcGFyZUNIMgorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcGFyYW0gIENvbXBhcmVWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTY1NTM1CisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX09DX1NldENvbXBhcmVDSDIoVElNX1R5cGVEZWYgKlRJTXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDb21wYXJlVmFsdWUpIHsKKyAgV1JJVEVfUkVHKFRJTXgtPkNDUjIsIENvbXBhcmVWYWx1ZSk7Cit9CisKKy8qKgorICogQGJyaWVmICBTZXQgY29tcGFyZSB2YWx1ZSBmb3Igb3V0cHV0IGNoYW5uZWwgMyAoVElNeF9DQ1IzKS4KKyAqIEBub3RlIEluIDMyLWJpdCB0aW1lciBpbXBsZW1lbnRhdGlvbnMgY29tcGFyZSB2YWx1ZSBjYW4gYmUgYmV0d2VlbiAweDAwMDAwMDAwCisgKiBhbmQgMHhGRkZGRkZGRi4KKyAqIEBub3RlIE1hY3JvIElTX1RJTV8zMkJfQ09VTlRFUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBhIDMyIGJpdHMgY291bnRlci4KKyAqIEBub3RlIE1hY3JvIElTX1RJTV9DQzNfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAqICAgICAgIG91dHB1dCBjaGFubmVsIGlzIHN1cHBvcnRlZCBieSBhIHRpbWVyIGluc3RhbmNlLgorICogQG5vdGUgSWYgZGl0aGVyaW5nIGlzIGFjdGl2YXRlZCwgQ29tcGFyZVZhbHVlIGNhbiBiZSBjYWxjdWxhdGVkIHdpdGggbWFjcm8KKyAqIEByZWYgX19MTF9USU1fQ0FMQ19ERUxBWV9ESVRIRVIgLgorICogQHJtdG9sbCBDQ1IzICAgICAgICAgQ0NSMyAgICAgICAgICBMTF9USU1fT0NfU2V0Q29tcGFyZUNIMworICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcGFyYW0gIENvbXBhcmVWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTY1NTM1CisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX09DX1NldENvbXBhcmVDSDMoVElNX1R5cGVEZWYgKlRJTXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDb21wYXJlVmFsdWUpIHsKKyAgV1JJVEVfUkVHKFRJTXgtPkNDUjMsIENvbXBhcmVWYWx1ZSk7Cit9CisKKy8qKgorICogQGJyaWVmICBTZXQgY29tcGFyZSB2YWx1ZSBmb3Igb3V0cHV0IGNoYW5uZWwgNCAoVElNeF9DQ1I0KS4KKyAqIEBub3RlIEluIDMyLWJpdCB0aW1lciBpbXBsZW1lbnRhdGlvbnMgY29tcGFyZSB2YWx1ZSBjYW4gYmUgYmV0d2VlbiAweDAwMDAwMDAwCisgKiBhbmQgMHhGRkZGRkZGRi4KKyAqIEBub3RlIE1hY3JvIElTX1RJTV8zMkJfQ09VTlRFUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBhIDMyIGJpdHMgY291bnRlci4KKyAqIEBub3RlIE1hY3JvIElTX1RJTV9DQzRfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAqICAgICAgIG91dHB1dCBjaGFubmVsIDQgaXMgc3VwcG9ydGVkIGJ5IGEgdGltZXIgaW5zdGFuY2UuCisgKiBAbm90ZSBJZiBkaXRoZXJpbmcgaXMgYWN0aXZhdGVkLCBDb21wYXJlVmFsdWUgY2FuIGJlIGNhbGN1bGF0ZWQgd2l0aCBtYWNybworICogQHJlZiBfX0xMX1RJTV9DQUxDX0RFTEFZX0RJVEhFUiAuCisgKiBAcm10b2xsIENDUjQgICAgICAgICBDQ1I0ICAgICAgICAgIExMX1RJTV9PQ19TZXRDb21wYXJlQ0g0CisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEBwYXJhbSAgQ29tcGFyZVZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9NjU1MzUKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fT0NfU2V0Q29tcGFyZUNINChUSU1fVHlwZURlZiAqVElNeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENvbXBhcmVWYWx1ZSkgeworICBXUklURV9SRUcoVElNeC0+Q0NSNCwgQ29tcGFyZVZhbHVlKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFNldCBjb21wYXJlIHZhbHVlIGZvciBvdXRwdXQgY2hhbm5lbCA1IChUSU14X0NDUjUpLgorICogQG5vdGUgTWFjcm8gSVNfVElNX0NDNV9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICogICAgICAgb3V0cHV0IGNoYW5uZWwgNSBpcyBzdXBwb3J0ZWQgYnkgYSB0aW1lciBpbnN0YW5jZS4KKyAqIEBub3RlIElmIGRpdGhlcmluZyBpcyBhY3RpdmF0ZWQsIENvbXBhcmVWYWx1ZSBjYW4gYmUgY2FsY3VsYXRlZCB3aXRoIG1hY3JvCisgKiBAcmVmIF9fTExfVElNX0NBTENfREVMQVlfRElUSEVSIC4KKyAqIEBybXRvbGwgQ0NSNSAgICAgICAgIENDUjUgICAgICAgICAgTExfVElNX09DX1NldENvbXBhcmVDSDUKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHBhcmFtICBDb21wYXJlVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUzNQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9PQ19TZXRDb21wYXJlQ0g1KFRJTV9UeXBlRGVmICpUSU14LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ29tcGFyZVZhbHVlKSB7CisgIE1PRElGWV9SRUcoVElNeC0+Q0NSNSwgVElNX0NDUjVfQ0NSNSwgQ29tcGFyZVZhbHVlKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFNldCBjb21wYXJlIHZhbHVlIGZvciBvdXRwdXQgY2hhbm5lbCA2IChUSU14X0NDUjYpLgorICogQG5vdGUgTWFjcm8gSVNfVElNX0NDNl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICogICAgICAgb3V0cHV0IGNoYW5uZWwgNiBpcyBzdXBwb3J0ZWQgYnkgYSB0aW1lciBpbnN0YW5jZS4KKyAqIEBub3RlIElmIGRpdGhlcmluZyBpcyBhY3RpdmF0ZWQsIENvbXBhcmVWYWx1ZSBjYW4gYmUgY2FsY3VsYXRlZCB3aXRoIG1hY3JvCisgKiBAcmVmIF9fTExfVElNX0NBTENfREVMQVlfRElUSEVSIC4KKyAqIEBybXRvbGwgQ0NSNiAgICAgICAgIENDUjYgICAgICAgICAgTExfVElNX09DX1NldENvbXBhcmVDSDYKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHBhcmFtICBDb21wYXJlVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUzNQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9PQ19TZXRDb21wYXJlQ0g2KFRJTV9UeXBlRGVmICpUSU14LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ29tcGFyZVZhbHVlKSB7CisgIFdSSVRFX1JFRyhUSU14LT5DQ1I2LCBDb21wYXJlVmFsdWUpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IGNvbXBhcmUgdmFsdWUgKFRJTXhfQ0NSMSkgc2V0IGZvciAgb3V0cHV0IGNoYW5uZWwgMS4KKyAqIEBub3RlIEluIDMyLWJpdCB0aW1lciBpbXBsZW1lbnRhdGlvbnMgcmV0dXJuZWQgY29tcGFyZSB2YWx1ZSBjYW4gYmUgYmV0d2VlbgorICogMHgwMDAwMDAwMCBhbmQgMHhGRkZGRkZGRi4KKyAqIEBub3RlIE1hY3JvIElTX1RJTV8zMkJfQ09VTlRFUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBhIDMyIGJpdHMgY291bnRlci4KKyAqIEBub3RlIE1hY3JvIElTX1RJTV9DQzFfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAqICAgICAgIG91dHB1dCBjaGFubmVsIDEgaXMgc3VwcG9ydGVkIGJ5IGEgdGltZXIgaW5zdGFuY2UuCisgKiBAbm90ZSBJZiBkaXRoZXJpbmcgaXMgYWN0aXZhdGVkLCBwYXkgYXR0ZW50aW9uIHRvIHRoZSByZXR1cm5lZCB2YWx1ZQorICogaW50ZXJwcmV0YXRpb24uCisgKiBAcm10b2xsIENDUjEgICAgICAgICBDQ1IxICAgICAgICAgIExMX1RJTV9PQ19HZXRDb21wYXJlQ0gxCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgQ29tcGFyZVZhbHVlIChiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTY1NTM1KQorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX09DX0dldENvbXBhcmVDSDEoY29uc3QgVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9SRUcoVElNeC0+Q0NSMSkpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IGNvbXBhcmUgdmFsdWUgKFRJTXhfQ0NSMikgc2V0IGZvciAgb3V0cHV0IGNoYW5uZWwgMi4KKyAqIEBub3RlIEluIDMyLWJpdCB0aW1lciBpbXBsZW1lbnRhdGlvbnMgcmV0dXJuZWQgY29tcGFyZSB2YWx1ZSBjYW4gYmUgYmV0d2VlbgorICogMHgwMDAwMDAwMCBhbmQgMHhGRkZGRkZGRi4KKyAqIEBub3RlIE1hY3JvIElTX1RJTV8zMkJfQ09VTlRFUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBhIDMyIGJpdHMgY291bnRlci4KKyAqIEBub3RlIE1hY3JvIElTX1RJTV9DQzJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAqICAgICAgIG91dHB1dCBjaGFubmVsIDIgaXMgc3VwcG9ydGVkIGJ5IGEgdGltZXIgaW5zdGFuY2UuCisgKiBAbm90ZSBJZiBkaXRoZXJpbmcgaXMgYWN0aXZhdGVkLCBwYXkgYXR0ZW50aW9uIHRvIHRoZSByZXR1cm5lZCB2YWx1ZQorICogaW50ZXJwcmV0YXRpb24uCisgKiBAcm10b2xsIENDUjIgICAgICAgICBDQ1IyICAgICAgICAgIExMX1RJTV9PQ19HZXRDb21wYXJlQ0gyCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgQ29tcGFyZVZhbHVlIChiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTY1NTM1KQorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX09DX0dldENvbXBhcmVDSDIoY29uc3QgVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9SRUcoVElNeC0+Q0NSMikpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IGNvbXBhcmUgdmFsdWUgKFRJTXhfQ0NSMykgc2V0IGZvciAgb3V0cHV0IGNoYW5uZWwgMy4KKyAqIEBub3RlIEluIDMyLWJpdCB0aW1lciBpbXBsZW1lbnRhdGlvbnMgcmV0dXJuZWQgY29tcGFyZSB2YWx1ZSBjYW4gYmUgYmV0d2VlbgorICogMHgwMDAwMDAwMCBhbmQgMHhGRkZGRkZGRi4KKyAqIEBub3RlIE1hY3JvIElTX1RJTV8zMkJfQ09VTlRFUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBhIDMyIGJpdHMgY291bnRlci4KKyAqIEBub3RlIE1hY3JvIElTX1RJTV9DQzNfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAqICAgICAgIG91dHB1dCBjaGFubmVsIDMgaXMgc3VwcG9ydGVkIGJ5IGEgdGltZXIgaW5zdGFuY2UuCisgKiBAbm90ZSBJZiBkaXRoZXJpbmcgaXMgYWN0aXZhdGVkLCBwYXkgYXR0ZW50aW9uIHRvIHRoZSByZXR1cm5lZCB2YWx1ZQorICogaW50ZXJwcmV0YXRpb24uCisgKiBAcm10b2xsIENDUjMgICAgICAgICBDQ1IzICAgICAgICAgIExMX1RJTV9PQ19HZXRDb21wYXJlQ0gzCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgQ29tcGFyZVZhbHVlIChiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTY1NTM1KQorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX09DX0dldENvbXBhcmVDSDMoY29uc3QgVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9SRUcoVElNeC0+Q0NSMykpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IGNvbXBhcmUgdmFsdWUgKFRJTXhfQ0NSNCkgc2V0IGZvciAgb3V0cHV0IGNoYW5uZWwgNC4KKyAqIEBub3RlIEluIDMyLWJpdCB0aW1lciBpbXBsZW1lbnRhdGlvbnMgcmV0dXJuZWQgY29tcGFyZSB2YWx1ZSBjYW4gYmUgYmV0d2VlbgorICogMHgwMDAwMDAwMCBhbmQgMHhGRkZGRkZGRi4KKyAqIEBub3RlIE1hY3JvIElTX1RJTV8zMkJfQ09VTlRFUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBhIDMyIGJpdHMgY291bnRlci4KKyAqIEBub3RlIE1hY3JvIElTX1RJTV9DQzRfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAqICAgICAgIG91dHB1dCBjaGFubmVsIDQgaXMgc3VwcG9ydGVkIGJ5IGEgdGltZXIgaW5zdGFuY2UuCisgKiBAbm90ZSBJZiBkaXRoZXJpbmcgaXMgYWN0aXZhdGVkLCBwYXkgYXR0ZW50aW9uIHRvIHRoZSByZXR1cm5lZCB2YWx1ZQorICogaW50ZXJwcmV0YXRpb24uCisgKiBAcm10b2xsIENDUjQgICAgICAgICBDQ1I0ICAgICAgICAgIExMX1RJTV9PQ19HZXRDb21wYXJlQ0g0CisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgQ29tcGFyZVZhbHVlIChiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTY1NTM1KQorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX09DX0dldENvbXBhcmVDSDQoY29uc3QgVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9SRUcoVElNeC0+Q0NSNCkpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IGNvbXBhcmUgdmFsdWUgKFRJTXhfQ0NSNSkgc2V0IGZvciAgb3V0cHV0IGNoYW5uZWwgNS4KKyAqIEBub3RlIE1hY3JvIElTX1RJTV9DQzVfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAqICAgICAgIG91dHB1dCBjaGFubmVsIDUgaXMgc3VwcG9ydGVkIGJ5IGEgdGltZXIgaW5zdGFuY2UuCisgKiBAbm90ZSBJZiBkaXRoZXJpbmcgaXMgYWN0aXZhdGVkLCBwYXkgYXR0ZW50aW9uIHRvIHRoZSByZXR1cm5lZCB2YWx1ZQorICogaW50ZXJwcmV0YXRpb24uCisgKiBAcm10b2xsIENDUjUgICAgICAgICBDQ1I1ICAgICAgICAgIExMX1RJTV9PQ19HZXRDb21wYXJlQ0g1CisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgQ29tcGFyZVZhbHVlIChiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTY1NTM1KQorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX09DX0dldENvbXBhcmVDSDUoY29uc3QgVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVElNeC0+Q0NSNSwgVElNX0NDUjVfQ0NSNSkpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IGNvbXBhcmUgdmFsdWUgKFRJTXhfQ0NSNikgc2V0IGZvciAgb3V0cHV0IGNoYW5uZWwgNi4KKyAqIEBub3RlIE1hY3JvIElTX1RJTV9DQzZfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAqICAgICAgIG91dHB1dCBjaGFubmVsIDYgaXMgc3VwcG9ydGVkIGJ5IGEgdGltZXIgaW5zdGFuY2UuCisgKiBAbm90ZSBJZiBkaXRoZXJpbmcgaXMgYWN0aXZhdGVkLCBwYXkgYXR0ZW50aW9uIHRvIHRoZSByZXR1cm5lZCB2YWx1ZQorICogaW50ZXJwcmV0YXRpb24uCisgKiBAcm10b2xsIENDUjYgICAgICAgICBDQ1I2ICAgICAgICAgIExMX1RJTV9PQ19HZXRDb21wYXJlQ0g2CisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgQ29tcGFyZVZhbHVlIChiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTY1NTM1KQorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX09DX0dldENvbXBhcmVDSDYoY29uc3QgVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9SRUcoVElNeC0+Q0NSNikpOworfQorCisvKioKKyAqIEBicmllZiAgU2VsZWN0IG9uIHdoaWNoIHJlZmVyZW5jZSBzaWduYWwgdGhlIE9DNVJFRiBpcyBjb21iaW5lZCB0by4KKyAqIEBub3RlIE1hY3JvIElTX1RJTV9DT01CSU5FRDNQSEFTRVBXTV9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyB0aGUgY29tYmluZWQgMy1waGFzZSBQV00gbW9kZS4KKyAqIEBybXRvbGwgQ0NSNSAgICAgICAgIEdDNUMzICAgICAgICAgIExMX1RJTV9TZXRDSDVDb21iaW5lZENoYW5uZWxzXG4KKyAqICAgICAgICAgQ0NSNSAgICAgICAgIEdDNUMyICAgICAgICAgIExMX1RJTV9TZXRDSDVDb21iaW5lZENoYW5uZWxzXG4KKyAqICAgICAgICAgQ0NSNSAgICAgICAgIEdDNUMxICAgICAgICAgIExMX1RJTV9TZXRDSDVDb21iaW5lZENoYW5uZWxzCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEBwYXJhbSAgR3JvdXBDSDUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fR1JPVVBDSDVfTk9ORQorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0dST1VQQ0g1X09DMVJFRkMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9HUk9VUENINV9PQzJSRUZDCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fR1JPVVBDSDVfT0MzUkVGQworICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9TZXRDSDVDb21iaW5lZENoYW5uZWxzKFRJTV9UeXBlRGVmICpUSU14LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgR3JvdXBDSDUpIHsKKyAgTU9ESUZZX1JFRyhUSU14LT5DQ1I1LCAoVElNX0NDUjVfR0M1QzMgfCBUSU1fQ0NSNV9HQzVDMiB8IFRJTV9DQ1I1X0dDNUMxKSwKKyAgICAgICAgICAgICBHcm91cENINSk7Cit9CisKKy8qKgorICogQGJyaWVmICBTZXQgdGhlIHB1bHNlIG9uIGNvbXBhcmUgcHVsc2Ugd2lkdGggcHJlc2NhbGVyLgorICogQG5vdGUgTWFjcm8gSVNfVElNX1BVTFNFT05DT01QQVJFX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgKiAgICAgICB3aGV0aGVyIG9yIG5vdCB0aGUgcHVsc2Ugb24gY29tcGFyZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgdGltZXIKKyAqICAgICAgIGluc3RhbmNlLgorICogQHJtdG9sbCBFQ1IgICAgICAgICAgUFdQUlNDICAgICAgICAgICBMTF9USU1fT0NfU2V0UHVsc2VXaWR0aFByZXNjYWxlcgorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcGFyYW0gIFB1bHNlV2lkdGhQcmVzY2FsZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nCisgKiB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fUFdQUlNDX1gxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fUFdQUlNDX1gyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fUFdQUlNDX1g0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fUFdQUlNDX1g4CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fUFdQUlNDX1gxNgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1BXUFJTQ19YMzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9QV1BSU0NfWDY0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fUFdQUlNDX1gxMjgKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fT0NfU2V0UHVsc2VXaWR0aFByZXNjYWxlcigKKyAgICBUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgUHVsc2VXaWR0aFByZXNjYWxlcikgeworICBNT0RJRllfUkVHKFRJTXgtPkVDUiwgVElNX0VDUl9QV1BSU0MsIFB1bHNlV2lkdGhQcmVzY2FsZXIpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IHRoZSBwdWxzZSBvbiBjb21wYXJlIHB1bHNlIHdpZHRoIHByZXNjYWxlci4KKyAqIEBub3RlIE1hY3JvIElTX1RJTV9QVUxTRU9OQ09NUEFSRV9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICogICAgICAgd2hldGhlciBvciBub3QgdGhlIHB1bHNlIG9uIGNvbXBhcmUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIHRpbWVyCisgKiAgICAgICBpbnN0YW5jZS4KKyAqIEBybXRvbGwgRUNSICAgICAgICAgIFBXUFJTQyAgICAgICAgICAgTExfVElNX09DX0dldFB1bHNlV2lkdGhQcmVzY2FsZXIKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1BXUFJTQ19YMQorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1BXUFJTQ19YMgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1BXUFJTQ19YNAorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1BXUFJTQ19YOAorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1BXUFJTQ19YMTYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9QV1BSU0NfWDMyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fUFdQUlNDX1g2NAorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1BXUFJTQ19YMTI4CisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfVElNX09DX0dldFB1bHNlV2lkdGhQcmVzY2FsZXIoY29uc3QgVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVElNeC0+RUNSLCBUSU1fRUNSX1BXUFJTQykpOworfQorCisvKioKKyAqIEBicmllZiAgU2V0IHRoZSBwdWxzZSBvbiBjb21wYXJlIHB1bHNlIHdpZHRoIGR1cmF0aW9uLgorICogQG5vdGUgTWFjcm8gSVNfVElNX1BVTFNFT05DT01QQVJFX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgKiAgICAgICB3aGV0aGVyIG9yIG5vdCB0aGUgcHVsc2Ugb24gY29tcGFyZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgdGltZXIKKyAqICAgICAgIGluc3RhbmNlLgorICogQHJtdG9sbCBFQ1IgICAgICAgICAgUFcgICAgICAgICAgIExMX1RJTV9PQ19TZXRQdWxzZVdpZHRoCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEBwYXJhbSAgUHVsc2VXaWR0aCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0yNTUKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fT0NfU2V0UHVsc2VXaWR0aChUSU1fVHlwZURlZiAqVElNeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFB1bHNlV2lkdGgpIHsKKyAgTU9ESUZZX1JFRyhUSU14LT5FQ1IsIFRJTV9FQ1JfUFcsIFB1bHNlV2lkdGggPDwgVElNX0VDUl9QV19Qb3MpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IHRoZSBwdWxzZSBvbiBjb21wYXJlIHB1bHNlIHdpZHRoIGR1cmF0aW9uLgorICogQG5vdGUgTWFjcm8gSVNfVElNX1BVTFNFT05DT01QQVJFX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgKiAgICAgICB3aGV0aGVyIG9yIG5vdCB0aGUgcHVsc2Ugb24gY29tcGFyZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgdGltZXIKKyAqICAgICAgIGluc3RhbmNlLgorICogQHJtdG9sbCBFQ1IgICAgICAgICAgUFcgICAgICAgICAgIExMX1RJTV9PQ19HZXRQdWxzZVdpZHRoCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MjU1OgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX09DX0dldFB1bHNlV2lkdGgoY29uc3QgVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVElNeC0+RUNSLCBUSU1fRUNSX1BXKSk7Cit9CisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FRl9JbnB1dF9DaGFubmVsIElucHV0IGNoYW5uZWwgY29uZmlndXJhdGlvbgorICogQHsKKyAqLworLyoqCisgKiBAYnJpZWYgIENvbmZpZ3VyZSBpbnB1dCBjaGFubmVsLgorICogQHJtdG9sbCBDQ01SMSAgICAgICAgQ0MxUyAgICAgICAgICBMTF9USU1fSUNfQ29uZmlnXG4KKyAqICAgICAgICAgQ0NNUjEgICAgICAgIElDMVBTQyAgICAgICAgTExfVElNX0lDX0NvbmZpZ1xuCisgKiAgICAgICAgIENDTVIxICAgICAgICBJQzFGICAgICAgICAgIExMX1RJTV9JQ19Db25maWdcbgorICogICAgICAgICBDQ01SMSAgICAgICAgQ0MyUyAgICAgICAgICBMTF9USU1fSUNfQ29uZmlnXG4KKyAqICAgICAgICAgQ0NNUjEgICAgICAgIElDMlBTQyAgICAgICAgTExfVElNX0lDX0NvbmZpZ1xuCisgKiAgICAgICAgIENDTVIxICAgICAgICBJQzJGICAgICAgICAgIExMX1RJTV9JQ19Db25maWdcbgorICogICAgICAgICBDQ01SMiAgICAgICAgQ0MzUyAgICAgICAgICBMTF9USU1fSUNfQ29uZmlnXG4KKyAqICAgICAgICAgQ0NNUjIgICAgICAgIElDM1BTQyAgICAgICAgTExfVElNX0lDX0NvbmZpZ1xuCisgKiAgICAgICAgIENDTVIyICAgICAgICBJQzNGICAgICAgICAgIExMX1RJTV9JQ19Db25maWdcbgorICogICAgICAgICBDQ01SMiAgICAgICAgQ0M0UyAgICAgICAgICBMTF9USU1fSUNfQ29uZmlnXG4KKyAqICAgICAgICAgQ0NNUjIgICAgICAgIElDNFBTQyAgICAgICAgTExfVElNX0lDX0NvbmZpZ1xuCisgKiAgICAgICAgIENDTVIyICAgICAgICBJQzRGICAgICAgICAgIExMX1RJTV9JQ19Db25maWdcbgorICogICAgICAgICBDQ0VSICAgICAgICAgQ0MxUCAgICAgICAgICBMTF9USU1fSUNfQ29uZmlnXG4KKyAqICAgICAgICAgQ0NFUiAgICAgICAgIENDMU5QICAgICAgICAgTExfVElNX0lDX0NvbmZpZ1xuCisgKiAgICAgICAgIENDRVIgICAgICAgICBDQzJQICAgICAgICAgIExMX1RJTV9JQ19Db25maWdcbgorICogICAgICAgICBDQ0VSICAgICAgICAgQ0MyTlAgICAgICAgICBMTF9USU1fSUNfQ29uZmlnXG4KKyAqICAgICAgICAgQ0NFUiAgICAgICAgIENDM1AgICAgICAgICAgTExfVElNX0lDX0NvbmZpZ1xuCisgKiAgICAgICAgIENDRVIgICAgICAgICBDQzNOUCAgICAgICAgIExMX1RJTV9JQ19Db25maWdcbgorICogICAgICAgICBDQ0VSICAgICAgICAgQ0M0UCAgICAgICAgICBMTF9USU1fSUNfQ29uZmlnXG4KKyAqICAgICAgICAgQ0NFUiAgICAgICAgIENDNE5QICAgICAgICAgTExfVElNX0lDX0NvbmZpZworICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINAorICogQHBhcmFtICBDb25maWd1cmF0aW9uIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBjb21iaW5hdGlvbiBvZiBhbGwgdGhlCisgKiBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0FDVElWRUlOUFVUX0RJUkVDVFRJIG9yIEByZWYKKyAqIExMX1RJTV9BQ1RJVkVJTlBVVF9JTkRJUkVDVFRJIG9yIEByZWYgTExfVElNX0FDVElWRUlOUFVUX1RSQworICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDUFNDX0RJVjEgb3IgLi4uIG9yIEByZWYgTExfVElNX0lDUFNDX0RJVjgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjEgb3IgLi4uIG9yIEByZWYKKyAqIExMX1RJTV9JQ19GSUxURVJfRkRJVjMyX044CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfUE9MQVJJVFlfUklTSU5HIG9yIEByZWYKKyAqIExMX1RJTV9JQ19QT0xBUklUWV9GQUxMSU5HIG9yIEByZWYgTExfVElNX0lDX1BPTEFSSVRZX0JPVEhFREdFCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0lDX0NvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ29uZmlndXJhdGlvbikgeworICB1aW50OF90IGlDaGFubmVsID0gVElNX0dFVF9DSEFOTkVMX0lOREVYKENoYW5uZWwpOworICBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKAorICAgICAgdWludDMyX3QpKCh1aW50MzJfdCkoJlRJTXgtPkNDTVIxKSArIE9GRlNFVF9UQUJfQ0NNUnhbaUNoYW5uZWxdKSk7CisgIE1PRElGWV9SRUcoKnBSZWcsCisgICAgICAgICAgICAgKChUSU1fQ0NNUjFfSUMxRiB8IFRJTV9DQ01SMV9JQzFQU0MgfCBUSU1fQ0NNUjFfQ0MxUykKKyAgICAgICAgICAgICAgPDwgU0hJRlRfVEFCX0lDeHhbaUNoYW5uZWxdKSwKKyAgICAgICAgICAgICAoKENvbmZpZ3VyYXRpb24gPj4gMTZVKSAmCisgICAgICAgICAgICAgIChUSU1fQ0NNUjFfSUMxRiB8IFRJTV9DQ01SMV9JQzFQU0MgfCBUSU1fQ0NNUjFfQ0MxUykpCisgICAgICAgICAgICAgICAgIDw8IFNISUZUX1RBQl9JQ3h4W2lDaGFubmVsXSk7CisgIE1PRElGWV9SRUcoVElNeC0+Q0NFUiwKKyAgICAgICAgICAgICAoKFRJTV9DQ0VSX0NDMU5QIHwgVElNX0NDRVJfQ0MxUCkgPDwgU0hJRlRfVEFCX0NDeFBbaUNoYW5uZWxdKSwKKyAgICAgICAgICAgICAoQ29uZmlndXJhdGlvbiAmIChUSU1fQ0NFUl9DQzFOUCB8IFRJTV9DQ0VSX0NDMVApKQorICAgICAgICAgICAgICAgICA8PCBTSElGVF9UQUJfQ0N4UFtpQ2hhbm5lbF0pOworfQorCisvKioKKyAqIEBicmllZiAgU2V0IHRoZSBhY3RpdmUgaW5wdXQuCisgKiBAcm10b2xsIENDTVIxICAgICAgICBDQzFTICAgICAgICAgIExMX1RJTV9JQ19TZXRBY3RpdmVJbnB1dFxuCisgKiAgICAgICAgIENDTVIxICAgICAgICBDQzJTICAgICAgICAgIExMX1RJTV9JQ19TZXRBY3RpdmVJbnB1dFxuCisgKiAgICAgICAgIENDTVIyICAgICAgICBDQzNTICAgICAgICAgIExMX1RJTV9JQ19TZXRBY3RpdmVJbnB1dFxuCisgKiAgICAgICAgIENDTVIyICAgICAgICBDQzRTICAgICAgICAgIExMX1RJTV9JQ19TZXRBY3RpdmVJbnB1dAorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINAorICogQHBhcmFtICBJQ0FjdGl2ZUlucHV0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQUNUSVZFSU5QVVRfRElSRUNUVEkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9BQ1RJVkVJTlBVVF9JTkRJUkVDVFRJCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQUNUSVZFSU5QVVRfVFJDCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0lDX1NldEFjdGl2ZUlucHV0KFRJTV9UeXBlRGVmICpUSU14LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgSUNBY3RpdmVJbnB1dCkgeworICB1aW50OF90IGlDaGFubmVsID0gVElNX0dFVF9DSEFOTkVMX0lOREVYKENoYW5uZWwpOworICBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKAorICAgICAgdWludDMyX3QpKCh1aW50MzJfdCkoJlRJTXgtPkNDTVIxKSArIE9GRlNFVF9UQUJfQ0NNUnhbaUNoYW5uZWxdKSk7CisgIE1PRElGWV9SRUcoKnBSZWcsICgoVElNX0NDTVIxX0NDMVMpIDw8IFNISUZUX1RBQl9JQ3h4W2lDaGFubmVsXSksCisgICAgICAgICAgICAgKElDQWN0aXZlSW5wdXQgPj4gMTZVKSA8PCBTSElGVF9UQUJfSUN4eFtpQ2hhbm5lbF0pOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IHRoZSBjdXJyZW50IGFjdGl2ZSBpbnB1dC4KKyAqIEBybXRvbGwgQ0NNUjEgICAgICAgIENDMVMgICAgICAgICAgTExfVElNX0lDX0dldEFjdGl2ZUlucHV0XG4KKyAqICAgICAgICAgQ0NNUjEgICAgICAgIENDMlMgICAgICAgICAgTExfVElNX0lDX0dldEFjdGl2ZUlucHV0XG4KKyAqICAgICAgICAgQ0NNUjIgICAgICAgIENDM1MgICAgICAgICAgTExfVElNX0lDX0dldEFjdGl2ZUlucHV0XG4KKyAqICAgICAgICAgQ0NNUjIgICAgICAgIENDNFMgICAgICAgICAgTExfVElNX0lDX0dldEFjdGl2ZUlucHV0CisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMworICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0CisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQUNUSVZFSU5QVVRfRElSRUNUVEkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9BQ1RJVkVJTlBVVF9JTkRJUkVDVFRJCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQUNUSVZFSU5QVVRfVFJDCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSUNfR2V0QWN0aXZlSW5wdXQoY29uc3QgVElNX1R5cGVEZWYgKlRJTXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpIHsKKyAgdWludDhfdCBpQ2hhbm5lbCA9IFRJTV9HRVRfQ0hBTk5FTF9JTkRFWChDaGFubmVsKTsKKyAgY29uc3QgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCgKKyAgICAgIHVpbnQzMl90KSgodWludDMyX3QpKCZUSU14LT5DQ01SMSkgKyBPRkZTRVRfVEFCX0NDTVJ4W2lDaGFubmVsXSkpOworICByZXR1cm4gKChSRUFEX0JJVCgqcFJlZywgKChUSU1fQ0NNUjFfQ0MxUykgPDwgU0hJRlRfVEFCX0lDeHhbaUNoYW5uZWxdKSkgPj4KKyAgICAgICAgICAgU0hJRlRfVEFCX0lDeHhbaUNoYW5uZWxdKQorICAgICAgICAgIDw8IDE2VSk7Cit9CisKKy8qKgorICogQGJyaWVmICBTZXQgdGhlIHByZXNjYWxlciBvZiBpbnB1dCBjaGFubmVsLgorICogQHJtdG9sbCBDQ01SMSAgICAgICAgSUMxUFNDICAgICAgICBMTF9USU1fSUNfU2V0UHJlc2NhbGVyXG4KKyAqICAgICAgICAgQ0NNUjEgICAgICAgIElDMlBTQyAgICAgICAgTExfVElNX0lDX1NldFByZXNjYWxlclxuCisgKiAgICAgICAgIENDTVIyICAgICAgICBJQzNQU0MgICAgICAgIExMX1RJTV9JQ19TZXRQcmVzY2FsZXJcbgorICogICAgICAgICBDQ01SMiAgICAgICAgSUM0UFNDICAgICAgICBMTF9USU1fSUNfU2V0UHJlc2NhbGVyCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMworICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0CisgKiBAcGFyYW0gIElDUHJlc2NhbGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNQU0NfRElWMQorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDUFNDX0RJVjIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ1BTQ19ESVY0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNQU0NfRElWOAorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9JQ19TZXRQcmVzY2FsZXIoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IElDUHJlc2NhbGVyKSB7CisgIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7CisgIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgoCisgICAgICB1aW50MzJfdCkoKHVpbnQzMl90KSgmVElNeC0+Q0NNUjEpICsgT0ZGU0VUX1RBQl9DQ01SeFtpQ2hhbm5lbF0pKTsKKyAgTU9ESUZZX1JFRygqcFJlZywgKChUSU1fQ0NNUjFfSUMxUFNDKSA8PCBTSElGVF9UQUJfSUN4eFtpQ2hhbm5lbF0pLAorICAgICAgICAgICAgIChJQ1ByZXNjYWxlciA+PiAxNlUpIDw8IFNISUZUX1RBQl9JQ3h4W2lDaGFubmVsXSk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgdGhlIGN1cnJlbnQgcHJlc2NhbGVyIHZhbHVlIGFjdGluZyBvbiBhbiAgaW5wdXQgY2hhbm5lbC4KKyAqIEBybXRvbGwgQ0NNUjEgICAgICAgIElDMVBTQyAgICAgICAgTExfVElNX0lDX0dldFByZXNjYWxlclxuCisgKiAgICAgICAgIENDTVIxICAgICAgICBJQzJQU0MgICAgICAgIExMX1RJTV9JQ19HZXRQcmVzY2FsZXJcbgorICogICAgICAgICBDQ01SMiAgICAgICAgSUMzUFNDICAgICAgICBMTF9USU1fSUNfR2V0UHJlc2NhbGVyXG4KKyAqICAgICAgICAgQ0NNUjIgICAgICAgIElDNFBTQyAgICAgICAgTExfVElNX0lDX0dldFByZXNjYWxlcgorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINAorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDUFNDX0RJVjEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ1BTQ19ESVYyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNQU0NfRElWNAorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDUFNDX0RJVjgKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9JQ19HZXRQcmVzY2FsZXIoY29uc3QgVElNX1R5cGVEZWYgKlRJTXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKSB7CisgIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7CisgIGNvbnN0IF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgoCisgICAgICB1aW50MzJfdCkoKHVpbnQzMl90KSgmVElNeC0+Q0NNUjEpICsgT0ZGU0VUX1RBQl9DQ01SeFtpQ2hhbm5lbF0pKTsKKyAgcmV0dXJuICgoUkVBRF9CSVQoKnBSZWcsICgoVElNX0NDTVIxX0lDMVBTQykgPDwgU0hJRlRfVEFCX0lDeHhbaUNoYW5uZWxdKSkgPj4KKyAgICAgICAgICAgU0hJRlRfVEFCX0lDeHhbaUNoYW5uZWxdKQorICAgICAgICAgIDw8IDE2VSk7Cit9CisKKy8qKgorICogQGJyaWVmICBTZXQgdGhlIGlucHV0IGZpbHRlciBkdXJhdGlvbi4KKyAqIEBybXRvbGwgQ0NNUjEgICAgICAgIElDMUYgICAgICAgICAgTExfVElNX0lDX1NldEZpbHRlclxuCisgKiAgICAgICAgIENDTVIxICAgICAgICBJQzJGICAgICAgICAgIExMX1RJTV9JQ19TZXRGaWx0ZXJcbgorICogICAgICAgICBDQ01SMiAgICAgICAgSUMzRiAgICAgICAgICBMTF9USU1fSUNfU2V0RmlsdGVyXG4KKyAqICAgICAgICAgQ0NNUjIgICAgICAgIElDNEYgICAgICAgICAgTExfVElNX0lDX1NldEZpbHRlcgorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINAorICogQHBhcmFtICBJQ0ZpbHRlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWMQorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWMV9OMgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWMV9ONAorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWMV9OOAorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWMl9ONgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWMl9OOAorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWNF9ONgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWNF9OOAorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWOF9ONgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWOF9OOAorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWMTZfTjUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjE2X042CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVYxNl9OOAorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWMzJfTjUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjMyX042CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVYzMl9OOAorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9JQ19TZXRGaWx0ZXIoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IElDRmlsdGVyKSB7CisgIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7CisgIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgoCisgICAgICB1aW50MzJfdCkoKHVpbnQzMl90KSgmVElNeC0+Q0NNUjEpICsgT0ZGU0VUX1RBQl9DQ01SeFtpQ2hhbm5lbF0pKTsKKyAgTU9ESUZZX1JFRygqcFJlZywgKChUSU1fQ0NNUjFfSUMxRikgPDwgU0hJRlRfVEFCX0lDeHhbaUNoYW5uZWxdKSwKKyAgICAgICAgICAgICAoSUNGaWx0ZXIgPj4gMTZVKSA8PCBTSElGVF9UQUJfSUN4eFtpQ2hhbm5lbF0pOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IHRoZSBpbnB1dCBmaWx0ZXIgZHVyYXRpb24uCisgKiBAcm10b2xsIENDTVIxICAgICAgICBJQzFGICAgICAgICAgIExMX1RJTV9JQ19HZXRGaWx0ZXJcbgorICogICAgICAgICBDQ01SMSAgICAgICAgSUMyRiAgICAgICAgICBMTF9USU1fSUNfR2V0RmlsdGVyXG4KKyAqICAgICAgICAgQ0NNUjIgICAgICAgIElDM0YgICAgICAgICAgTExfVElNX0lDX0dldEZpbHRlclxuCisgKiAgICAgICAgIENDTVIyICAgICAgICBJQzRGICAgICAgICAgIExMX1RJTV9JQ19HZXRGaWx0ZXIKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDQKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjFfTjIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjFfTjQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjFfTjgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjJfTjYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjJfTjgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjRfTjYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjRfTjgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjhfTjYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjhfTjgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjE2X041CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVYxNl9ONgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWMTZfTjgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjMyX041CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVYzMl9ONgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWMzJfTjgKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9JQ19HZXRGaWx0ZXIoY29uc3QgVElNX1R5cGVEZWYgKlRJTXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKSB7CisgIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7CisgIGNvbnN0IF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgoCisgICAgICB1aW50MzJfdCkoKHVpbnQzMl90KSgmVElNeC0+Q0NNUjEpICsgT0ZGU0VUX1RBQl9DQ01SeFtpQ2hhbm5lbF0pKTsKKyAgcmV0dXJuICgoUkVBRF9CSVQoKnBSZWcsICgoVElNX0NDTVIxX0lDMUYpIDw8IFNISUZUX1RBQl9JQ3h4W2lDaGFubmVsXSkpID4+CisgICAgICAgICAgIFNISUZUX1RBQl9JQ3h4W2lDaGFubmVsXSkKKyAgICAgICAgICA8PCAxNlUpOworfQorCisvKioKKyAqIEBicmllZiAgU2V0IHRoZSBpbnB1dCBjaGFubmVsIHBvbGFyaXR5LgorICogQHJtdG9sbCBDQ0VSICAgICAgICAgQ0MxUCAgICAgICAgICBMTF9USU1fSUNfU2V0UG9sYXJpdHlcbgorICogICAgICAgICBDQ0VSICAgICAgICAgQ0MxTlAgICAgICAgICBMTF9USU1fSUNfU2V0UG9sYXJpdHlcbgorICogICAgICAgICBDQ0VSICAgICAgICAgQ0MyUCAgICAgICAgICBMTF9USU1fSUNfU2V0UG9sYXJpdHlcbgorICogICAgICAgICBDQ0VSICAgICAgICAgQ0MyTlAgICAgICAgICBMTF9USU1fSUNfU2V0UG9sYXJpdHlcbgorICogICAgICAgICBDQ0VSICAgICAgICAgQ0MzUCAgICAgICAgICBMTF9USU1fSUNfU2V0UG9sYXJpdHlcbgorICogICAgICAgICBDQ0VSICAgICAgICAgQ0MzTlAgICAgICAgICBMTF9USU1fSUNfU2V0UG9sYXJpdHlcbgorICogICAgICAgICBDQ0VSICAgICAgICAgQ0M0UCAgICAgICAgICBMTF9USU1fSUNfU2V0UG9sYXJpdHlcbgorICogICAgICAgICBDQ0VSICAgICAgICAgQ0M0TlAgICAgICAgICBMTF9USU1fSUNfU2V0UG9sYXJpdHkKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDQKKyAqIEBwYXJhbSAgSUNQb2xhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX1BPTEFSSVRZX1JJU0lORworICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX1BPTEFSSVRZX0ZBTExJTkcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19QT0xBUklUWV9CT1RIRURHRQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9JQ19TZXRQb2xhcml0eShUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBJQ1BvbGFyaXR5KSB7CisgIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7CisgIE1PRElGWV9SRUcoVElNeC0+Q0NFUiwKKyAgICAgICAgICAgICAoKFRJTV9DQ0VSX0NDMU5QIHwgVElNX0NDRVJfQ0MxUCkgPDwgU0hJRlRfVEFCX0NDeFBbaUNoYW5uZWxdKSwKKyAgICAgICAgICAgICBJQ1BvbGFyaXR5IDw8IFNISUZUX1RBQl9DQ3hQW2lDaGFubmVsXSk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgdGhlIGN1cnJlbnQgaW5wdXQgY2hhbm5lbCBwb2xhcml0eS4KKyAqIEBybXRvbGwgQ0NFUiAgICAgICAgIENDMVAgICAgICAgICAgTExfVElNX0lDX0dldFBvbGFyaXR5XG4KKyAqICAgICAgICAgQ0NFUiAgICAgICAgIENDMU5QICAgICAgICAgTExfVElNX0lDX0dldFBvbGFyaXR5XG4KKyAqICAgICAgICAgQ0NFUiAgICAgICAgIENDMlAgICAgICAgICAgTExfVElNX0lDX0dldFBvbGFyaXR5XG4KKyAqICAgICAgICAgQ0NFUiAgICAgICAgIENDMk5QICAgICAgICAgTExfVElNX0lDX0dldFBvbGFyaXR5XG4KKyAqICAgICAgICAgQ0NFUiAgICAgICAgIENDM1AgICAgICAgICAgTExfVElNX0lDX0dldFBvbGFyaXR5XG4KKyAqICAgICAgICAgQ0NFUiAgICAgICAgIENDM05QICAgICAgICAgTExfVElNX0lDX0dldFBvbGFyaXR5XG4KKyAqICAgICAgICAgQ0NFUiAgICAgICAgIENDNFAgICAgICAgICAgTExfVElNX0lDX0dldFBvbGFyaXR5XG4KKyAqICAgICAgICAgQ0NFUiAgICAgICAgIENDNE5QICAgICAgICAgTExfVElNX0lDX0dldFBvbGFyaXR5CisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMworICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0CisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfUE9MQVJJVFlfUklTSU5HCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfUE9MQVJJVFlfRkFMTElORworICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX1BPTEFSSVRZX0JPVEhFREdFCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSUNfR2V0UG9sYXJpdHkoY29uc3QgVElNX1R5cGVEZWYgKlRJTXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpIHsKKyAgdWludDhfdCBpQ2hhbm5lbCA9IFRJTV9HRVRfQ0hBTk5FTF9JTkRFWChDaGFubmVsKTsKKyAgcmV0dXJuIChSRUFEX0JJVChUSU14LT5DQ0VSLCAoKFRJTV9DQ0VSX0NDMU5QIHwgVElNX0NDRVJfQ0MxUCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgU0hJRlRfVEFCX0NDeFBbaUNoYW5uZWxdKSkgPj4KKyAgICAgICAgICBTSElGVF9UQUJfQ0N4UFtpQ2hhbm5lbF0pOworfQorCisvKioKKyAqIEBicmllZiAgQ29ubmVjdCB0aGUgVElNeF9DSDEsIENIMiBhbmQgQ0gzIHBpbnMgIHRvIHRoZSBUSTEgaW5wdXQgKFhPUgorICogY29tYmluYXRpb24pLgorICogQG5vdGUgTWFjcm8gSVNfVElNX1hPUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBhbiBYT1IgaW5wdXQuCisgKiBAcm10b2xsIENSMiAgICAgICAgICBUSTFTICAgICAgICAgIExMX1RJTV9JQ19FbmFibGVYT1JDb21iaW5hdGlvbgorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0lDX0VuYWJsZVhPUkNvbWJpbmF0aW9uKFRJTV9UeXBlRGVmICpUSU14KSB7CisgIFNFVF9CSVQoVElNeC0+Q1IyLCBUSU1fQ1IyX1RJMVMpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzY29ubmVjdCB0aGUgVElNeF9DSDEsIENIMiBhbmQgQ0gzIHBpbnMgIGZyb20gdGhlIFRJMSBpbnB1dC4KKyAqIEBub3RlIE1hY3JvIElTX1RJTV9YT1JfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgYW4gWE9SIGlucHV0LgorICogQHJtdG9sbCBDUjIgICAgICAgICAgVEkxUyAgICAgICAgICBMTF9USU1fSUNfRGlzYWJsZVhPUkNvbWJpbmF0aW9uCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fSUNfRGlzYWJsZVhPUkNvbWJpbmF0aW9uKFRJTV9UeXBlRGVmICpUSU14KSB7CisgIENMRUFSX0JJVChUSU14LT5DUjIsIFRJTV9DUjJfVEkxUyk7Cit9CisKKy8qKgorICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgVElNeF9DSDEsIENIMiBhbmQgQ0gzIHBpbnMgYXJlIGNvbm5lY3RlY3RlZCB0bworICogdGhlIFRJMSBpbnB1dC4KKyAqIEBub3RlIE1hY3JvIElTX1RJTV9YT1JfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAqIGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgYW4gWE9SIGlucHV0LgorICogQHJtdG9sbCBDUjIgICAgICAgICAgVEkxUyAgICAgICAgICBMTF9USU1fSUNfSXNFbmFibGVkWE9SQ29tYmluYXRpb24KKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfVElNX0lDX0lzRW5hYmxlZFhPUkNvbWJpbmF0aW9uKGNvbnN0IFRJTV9UeXBlRGVmICpUSU14KSB7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPkNSMiwgVElNX0NSMl9USTFTKSA9PSAoVElNX0NSMl9USTFTKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IGNhcHR1cmVkIHZhbHVlIGZvciBpbnB1dCBjaGFubmVsIDEuCisgKiBAbm90ZSBJbiAzMi1iaXQgdGltZXIgaW1wbGVtZW50YXRpb25zIHJldHVybmVkIGNhcHR1cmVkIHZhbHVlIGNhbiBiZSBiZXR3ZWVuCisgKiAweDAwMDAwMDAwIGFuZCAweEZGRkZGRkZGLgorICogQG5vdGUgTWFjcm8gSVNfVElNXzMyQl9DT1VOVEVSX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGEgMzIgYml0cyBjb3VudGVyLgorICogQG5vdGUgTWFjcm8gSVNfVElNX0NDMV9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICogICAgICAgaW5wdXQgY2hhbm5lbCAxIGlzIHN1cHBvcnRlZCBieSBhIHRpbWVyIGluc3RhbmNlLgorICogQG5vdGUgSWYgZGl0aGVyaW5nIGlzIGFjdGl2YXRlZCwgcGF5IGF0dGVudGlvbiB0byB0aGUgcmV0dXJuZWQgdmFsdWUKKyAqIGludGVycHJldGF0aW9uLgorICogQHJtdG9sbCBDQ1IxICAgICAgICAgQ0NSMSAgICAgICAgICBMTF9USU1fSUNfR2V0Q2FwdHVyZUNIMQorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIENhcHR1cmVkVmFsdWUgKGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9NjU1MzUpCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSUNfR2V0Q2FwdHVyZUNIMShjb25zdCBUSU1fVHlwZURlZiAqVElNeCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX1JFRyhUSU14LT5DQ1IxKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgY2FwdHVyZWQgdmFsdWUgZm9yIGlucHV0IGNoYW5uZWwgMi4KKyAqIEBub3RlIEluIDMyLWJpdCB0aW1lciBpbXBsZW1lbnRhdGlvbnMgcmV0dXJuZWQgY2FwdHVyZWQgdmFsdWUgY2FuIGJlIGJldHdlZW4KKyAqIDB4MDAwMDAwMDAgYW5kIDB4RkZGRkZGRkYuCisgKiBAbm90ZSBNYWNybyBJU19USU1fMzJCX0NPVU5URVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAqICAgICAgIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgYSAzMiBiaXRzIGNvdW50ZXIuCisgKiBAbm90ZSBNYWNybyBJU19USU1fQ0MyX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgKiAgICAgICBpbnB1dCBjaGFubmVsIDIgaXMgc3VwcG9ydGVkIGJ5IGEgdGltZXIgaW5zdGFuY2UuCisgKiBAbm90ZSBJZiBkaXRoZXJpbmcgaXMgYWN0aXZhdGVkLCBwYXkgYXR0ZW50aW9uIHRvIHRoZSByZXR1cm5lZCB2YWx1ZQorICogaW50ZXJwcmV0YXRpb24uCisgKiBAcm10b2xsIENDUjIgICAgICAgICBDQ1IyICAgICAgICAgIExMX1RJTV9JQ19HZXRDYXB0dXJlQ0gyCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgQ2FwdHVyZWRWYWx1ZSAoYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUzNSkKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9JQ19HZXRDYXB0dXJlQ0gyKGNvbnN0IFRJTV9UeXBlRGVmICpUSU14KSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfUkVHKFRJTXgtPkNDUjIpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBjYXB0dXJlZCB2YWx1ZSBmb3IgaW5wdXQgY2hhbm5lbCAzLgorICogQG5vdGUgSW4gMzItYml0IHRpbWVyIGltcGxlbWVudGF0aW9ucyByZXR1cm5lZCBjYXB0dXJlZCB2YWx1ZSBjYW4gYmUgYmV0d2VlbgorICogMHgwMDAwMDAwMCBhbmQgMHhGRkZGRkZGRi4KKyAqIEBub3RlIE1hY3JvIElTX1RJTV8zMkJfQ09VTlRFUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBhIDMyIGJpdHMgY291bnRlci4KKyAqIEBub3RlIE1hY3JvIElTX1RJTV9DQzNfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAqICAgICAgIGlucHV0IGNoYW5uZWwgMyBpcyBzdXBwb3J0ZWQgYnkgYSB0aW1lciBpbnN0YW5jZS4KKyAqIEBub3RlIElmIGRpdGhlcmluZyBpcyBhY3RpdmF0ZWQsIHBheSBhdHRlbnRpb24gdG8gdGhlIHJldHVybmVkIHZhbHVlCisgKiBpbnRlcnByZXRhdGlvbi4KKyAqIEBybXRvbGwgQ0NSMyAgICAgICAgIENDUjMgICAgICAgICAgTExfVElNX0lDX0dldENhcHR1cmVDSDMKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHJldHZhbCBDYXB0dXJlZFZhbHVlIChiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTY1NTM1KQorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lDX0dldENhcHR1cmVDSDMoY29uc3QgVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9SRUcoVElNeC0+Q0NSMykpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IGNhcHR1cmVkIHZhbHVlIGZvciBpbnB1dCBjaGFubmVsIDQuCisgKiBAbm90ZSBJbiAzMi1iaXQgdGltZXIgaW1wbGVtZW50YXRpb25zIHJldHVybmVkIGNhcHR1cmVkIHZhbHVlIGNhbiBiZSBiZXR3ZWVuCisgKiAweDAwMDAwMDAwIGFuZCAweEZGRkZGRkZGLgorICogQG5vdGUgTWFjcm8gSVNfVElNXzMyQl9DT1VOVEVSX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGEgMzIgYml0cyBjb3VudGVyLgorICogQG5vdGUgTWFjcm8gSVNfVElNX0NDNF9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICogICAgICAgaW5wdXQgY2hhbm5lbCA0IGlzIHN1cHBvcnRlZCBieSBhIHRpbWVyIGluc3RhbmNlLgorICogQG5vdGUgSWYgZGl0aGVyaW5nIGlzIGFjdGl2YXRlZCwgcGF5IGF0dGVudGlvbiB0byB0aGUgcmV0dXJuZWQgdmFsdWUKKyAqIGludGVycHJldGF0aW9uLgorICogQHJtdG9sbCBDQ1I0ICAgICAgICAgQ0NSNCAgICAgICAgICBMTF9USU1fSUNfR2V0Q2FwdHVyZUNINAorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIENhcHR1cmVkVmFsdWUgKGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9NjU1MzUpCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSUNfR2V0Q2FwdHVyZUNINChjb25zdCBUSU1fVHlwZURlZiAqVElNeCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX1JFRyhUSU14LT5DQ1I0KSk7Cit9CisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FRl9DbG9ja19TZWxlY3Rpb24gQ291bnRlciBjbG9jayBzZWxlY3Rpb24KKyAqIEB7CisgKi8KKy8qKgorICogQGJyaWVmICBFbmFibGUgZXh0ZXJuYWwgY2xvY2sgbW9kZSAyLgorICogQG5vdGUgV2hlbiBleHRlcm5hbCBjbG9jayBtb2RlIDIgaXMgZW5hYmxlZCB0aGUgY291bnRlciBpcyBjbG9ja2VkIGJ5IGFueQorICogYWN0aXZlIGVkZ2Ugb24gdGhlIEVUUkYgc2lnbmFsLgorICogQG5vdGUgTWFjcm8gSVNfVElNX0NMT0NLU09VUkNFX0VUUk1PREUyX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGV4dGVybmFsIGNsb2NrIG1vZGUyLgorICogQHJtdG9sbCBTTUNSICAgICAgICAgRUNFICAgICAgICAgICBMTF9USU1fRW5hYmxlRXh0ZXJuYWxDbG9jaworICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZUV4dGVybmFsQ2xvY2soVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgU0VUX0JJVChUSU14LT5TTUNSLCBUSU1fU01DUl9FQ0UpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBleHRlcm5hbCBjbG9jayBtb2RlIDIuCisgKiBAbm90ZSBNYWNybyBJU19USU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAqICAgICAgIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgZXh0ZXJuYWwgY2xvY2sgbW9kZTIuCisgKiBAcm10b2xsIFNNQ1IgICAgICAgICBFQ0UgICAgICAgICAgIExMX1RJTV9EaXNhYmxlRXh0ZXJuYWxDbG9jaworICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0Rpc2FibGVFeHRlcm5hbENsb2NrKFRJTV9UeXBlRGVmICpUSU14KSB7CisgIENMRUFSX0JJVChUSU14LT5TTUNSLCBUSU1fU01DUl9FQ0UpOworfQorCisvKioKKyAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciBleHRlcm5hbCBjbG9jayBtb2RlIDIgaXMgZW5hYmxlZC4KKyAqIEBub3RlIE1hY3JvIElTX1RJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBleHRlcm5hbCBjbG9jayBtb2RlMi4KKyAqIEBybXRvbGwgU01DUiAgICAgICAgIEVDRSAgICAgICAgICAgTExfVElNX0lzRW5hYmxlZEV4dGVybmFsQ2xvY2sKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfVElNX0lzRW5hYmxlZEV4dGVybmFsQ2xvY2soY29uc3QgVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+U01DUiwgVElNX1NNQ1JfRUNFKSA9PSAoVElNX1NNQ1JfRUNFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgU2V0IHRoZSBjbG9jayBzb3VyY2Ugb2YgdGhlIGNvdW50ZXIgY2xvY2suCisgKiBAbm90ZSB3aGVuIHNlbGVjdGVkIGNsb2NrIHNvdXJjZSBpcyBleHRlcm5hbCBjbG9jayBtb2RlIDEsIHRoZSB0aW1lciBpbnB1dAorICogICAgICAgdGhlIGV4dGVybmFsIGNsb2NrIGlzIGFwcGxpZWQgaXMgc2VsZWN0ZWQgYnkgY2FsbGluZyB0aGUgQHJlZgorICogTExfVElNX1NldFRyaWdnZXJJbnB1dCgpIGZ1bmN0aW9uLiBUaGlzIHRpbWVyIGlucHV0IG11c3QgYmUgY29uZmlndXJlZCBieQorICogY2FsbGluZyB0aGUgQHJlZiBMTF9USU1fSUNfQ29uZmlnKCkgZnVuY3Rpb24uCisgKiBAbm90ZSBNYWNybyBJU19USU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTFfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAqICAgICAgIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgZXh0ZXJuYWwgY2xvY2sgbW9kZTEuCisgKiBAbm90ZSBNYWNybyBJU19USU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAqICAgICAgIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgZXh0ZXJuYWwgY2xvY2sgbW9kZTIuCisgKiBAcm10b2xsIFNNQ1IgICAgICAgICBTTVMgICAgICAgICAgIExMX1RJTV9TZXRDbG9ja1NvdXJjZVxuCisgKiAgICAgICAgIFNNQ1IgICAgICAgICBFQ0UgICAgICAgICAgIExMX1RJTV9TZXRDbG9ja1NvdXJjZQorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcGFyYW0gIENsb2NrU291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0xPQ0tTT1VSQ0VfSU5URVJOQUwKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DTE9DS1NPVVJDRV9FWFRfTU9ERTEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DTE9DS1NPVVJDRV9FWFRfTU9ERTIKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fU2V0Q2xvY2tTb3VyY2UoVElNX1R5cGVEZWYgKlRJTXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2xvY2tTb3VyY2UpIHsKKyAgTU9ESUZZX1JFRyhUSU14LT5TTUNSLCBUSU1fU01DUl9TTVMgfCBUSU1fU01DUl9FQ0UsIENsb2NrU291cmNlKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFNldCB0aGUgZW5jb2RlciBpbnRlcmZhY2UgbW9kZS4KKyAqIEBub3RlIE1hY3JvIElTX1RJTV9FTkNPREVSX0lOVEVSRkFDRV9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyB0aGUgZW5jb2RlciBtb2RlLgorICogQHJtdG9sbCBTTUNSICAgICAgICAgU01TICAgICAgICAgICBMTF9USU1fU2V0RW5jb2Rlck1vZGUKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHBhcmFtICBFbmNvZGVyTW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VOQ09ERVJNT0RFX1gyX1RJMQorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VOQ09ERVJNT0RFX1gyX1RJMgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VOQ09ERVJNT0RFX1g0X1RJMTIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FTkNPREVSTU9ERV9DTE9DS1BMVVNESVJFQ1RJT05fWDIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FTkNPREVSTU9ERV9DTE9DS1BMVVNESVJFQ1RJT05fWDEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FTkNPREVSTU9ERV9ESVJFQ1RJT05BTENMT0NLX1gyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRU5DT0RFUk1PREVfRElSRUNUSU9OQUxDTE9DS19YMV9USTEyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRU5DT0RFUk1PREVfWDFfVEkxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRU5DT0RFUk1PREVfWDFfVEkyCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX1NldEVuY29kZXJNb2RlKFRJTV9UeXBlRGVmICpUSU14LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEVuY29kZXJNb2RlKSB7CisgIE1PRElGWV9SRUcoVElNeC0+U01DUiwgVElNX1NNQ1JfU01TLCBFbmNvZGVyTW9kZSk7Cit9CisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FRl9UaW1lcl9TeW5jaHJvbml6YXRpb24gVGltZXIgc3luY2hyb25pc2F0aW9uCisgKiBjb25maWd1cmF0aW9uCisgKiBAeworICovCisvKioKKyAqIEBicmllZiAgU2V0IHRoZSB0cmlnZ2VyIG91dHB1dCAoVFJHTykgdXNlZCBmb3IgdGltZXIgc3luY2hyb25pemF0aW9uIC4KKyAqIEBub3RlIE1hY3JvIElTX1RJTV9NQVNURVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAqICAgICAgIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2UgY2FuIG9wZXJhdGUgYXMgYSBtYXN0ZXIgdGltZXIuCisgKiBAcm10b2xsIENSMiAgICAgICAgICBNTVMgICAgICAgICAgIExMX1RJTV9TZXRUcmlnZ2VyT3V0cHV0CisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEBwYXJhbSAgVGltZXJTeW5jaHJvbml6YXRpb24gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nCisgKiB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFJHT19SRVNFVAorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RSR09fRU5BQkxFCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFJHT19VUERBVEUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UUkdPX0NDMUlGCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFJHT19PQzFSRUYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UUkdPX09DMlJFRgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RSR09fT0MzUkVGCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFJHT19PQzRSRUYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UUkdPX0VOQ09ERVJDTEsKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fU2V0VHJpZ2dlck91dHB1dChUSU1fVHlwZURlZiAqVElNeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVyU3luY2hyb25pemF0aW9uKSB7CisgIE1PRElGWV9SRUcoVElNeC0+Q1IyLCBUSU1fQ1IyX01NUywgVGltZXJTeW5jaHJvbml6YXRpb24pOworfQorCisvKioKKyAqIEBicmllZiAgU2V0IHRoZSB0cmlnZ2VyIG91dHB1dCAyIChUUkdPMikgdXNlZCBmb3IgQURDIHN5bmNocm9uaXphdGlvbiAuCisgKiBAbm90ZSBNYWNybyBJU19USU1fVFJHTzJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAqICAgICAgIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2UgY2FuIGJlIHVzZWQgZm9yIEFEQyBzeW5jaHJvbml6YXRpb24uCisgKiBAcm10b2xsIENSMiAgICAgICAgICBNTVMyICAgICAgICAgIExMX1RJTV9TZXRUcmlnZ2VyT3V0cHV0MgorICogQHBhcmFtICBUSU14IFRpbWVyIEluc3RhbmNlCisgKiBAcGFyYW0gIEFEQ1N5bmNocm9uaXphdGlvbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RSR08yX1JFU0VUCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFJHTzJfRU5BQkxFCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFJHTzJfVVBEQVRFCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFJHTzJfQ0MxRgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RSR08yX09DMQorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RSR08yX09DMgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RSR08yX09DMworICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RSR08yX09DNAorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RSR08yX09DNQorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RSR08yX09DNgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RSR08yX09DNF9SSVNJTkdGQUxMSU5HCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFJHTzJfT0M2X1JJU0lOR0ZBTExJTkcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UUkdPMl9PQzRfUklTSU5HX09DNl9SSVNJTkcKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UUkdPMl9PQzRfUklTSU5HX09DNl9GQUxMSU5HCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFJHTzJfT0M1X1JJU0lOR19PQzZfUklTSU5HCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFJHTzJfT0M1X1JJU0lOR19PQzZfRkFMTElORworICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9TZXRUcmlnZ2VyT3V0cHV0MihUSU1fVHlwZURlZiAqVElNeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBBRENTeW5jaHJvbml6YXRpb24pIHsKKyAgTU9ESUZZX1JFRyhUSU14LT5DUjIsIFRJTV9DUjJfTU1TMiwgQURDU3luY2hyb25pemF0aW9uKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFNldCB0aGUgc3luY2hyb25pemF0aW9uIG1vZGUgb2YgYSBzbGF2ZSB0aW1lci4KKyAqIEBub3RlIE1hY3JvIElTX1RJTV9TTEFWRV9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBjYW4gb3BlcmF0ZSBhcyBhIHNsYXZlIHRpbWVyLgorICogQHJtdG9sbCBTTUNSICAgICAgICAgU01TICAgICAgICAgICBMTF9USU1fU2V0U2xhdmVNb2RlCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEBwYXJhbSAgU2xhdmVNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fU0xBVkVNT0RFX0RJU0FCTEVECisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fU0xBVkVNT0RFX1JFU0VUCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fU0xBVkVNT0RFX0dBVEVECisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fU0xBVkVNT0RFX1RSSUdHRVIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9TTEFWRU1PREVfQ09NQklORURfUkVTRVRUUklHR0VSCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fU0xBVkVNT0RFX0NPTUJJTkVEX0dBVEVEUkVTRVQKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fU2V0U2xhdmVNb2RlKFRJTV9UeXBlRGVmICpUSU14LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBTbGF2ZU1vZGUpIHsKKyAgTU9ESUZZX1JFRyhUSU14LT5TTUNSLCBUSU1fU01DUl9TTVMsIFNsYXZlTW9kZSk7Cit9CisKKy8qKgorICogQGJyaWVmICBTZXQgdGhlIHNlbGVjdHMgdGhlIHRyaWdnZXIgaW5wdXQgdG8gYmUgdXNlZCB0byBzeW5jaHJvbml6ZSB0aGUKKyAqIGNvdW50ZXIuCisgKiBAbm90ZSBNYWNybyBJU19USU1fU0xBVkVfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgY2FuIG9wZXJhdGUgYXMgYSBzbGF2ZSB0aW1lci4KKyAqIEBybXRvbGwgU01DUiAgICAgICAgIFRTICAgICAgICAgICAgTExfVElNX1NldFRyaWdnZXJJbnB1dAorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcGFyYW0gIFRyaWdnZXJJbnB1dCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RTX0lUUjAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UU19JVFIxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFNfSVRSMgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RTX0lUUjMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UU19JVFI0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFNfSVRSNQorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RTX0lUUjYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UU19JVFI3CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFNfSVRSOAorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RTX0lUUjkKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UU19JVFIxMAorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RTX0lUUjExCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFNfVEkxRl9FRAorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RTX1RJMUZQMQorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RTX1RJMkZQMgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RTX0VUUkYKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fU2V0VHJpZ2dlcklucHV0KFRJTV9UeXBlRGVmICpUSU14LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUcmlnZ2VySW5wdXQpIHsKKyAgTU9ESUZZX1JFRyhUSU14LT5TTUNSLCBUSU1fU01DUl9UUywgVHJpZ2dlcklucHV0KTsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSB0aGUgTWFzdGVyL1NsYXZlIG1vZGUuCisgKiBAbm90ZSBNYWNybyBJU19USU1fU0xBVkVfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgY2FuIG9wZXJhdGUgYXMgYSBzbGF2ZSB0aW1lci4KKyAqIEBybXRvbGwgU01DUiAgICAgICAgIE1TTSAgICAgICAgICAgTExfVElNX0VuYWJsZU1hc3RlclNsYXZlTW9kZQorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZU1hc3RlclNsYXZlTW9kZShUSU1fVHlwZURlZiAqVElNeCkgeworICBTRVRfQklUKFRJTXgtPlNNQ1IsIFRJTV9TTUNSX01TTSk7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIHRoZSBNYXN0ZXIvU2xhdmUgbW9kZS4KKyAqIEBub3RlIE1hY3JvIElTX1RJTV9TTEFWRV9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBjYW4gb3BlcmF0ZSBhcyBhIHNsYXZlIHRpbWVyLgorICogQHJtdG9sbCBTTUNSICAgICAgICAgTVNNICAgICAgICAgICBMTF9USU1fRGlzYWJsZU1hc3RlclNsYXZlTW9kZQorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0Rpc2FibGVNYXN0ZXJTbGF2ZU1vZGUoVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgQ0xFQVJfQklUKFRJTXgtPlNNQ1IsIFRJTV9TTUNSX01TTSk7Cit9CisKKy8qKgorICogQGJyaWVmIEluZGljYXRlcyB3aGV0aGVyIHRoZSBNYXN0ZXIvU2xhdmUgbW9kZSBpcyBlbmFibGVkLgorICogQG5vdGUgTWFjcm8gSVNfVElNX1NMQVZFX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgKiBhIHRpbWVyIGluc3RhbmNlIGNhbiBvcGVyYXRlIGFzIGEgc2xhdmUgdGltZXIuCisgKiBAcm10b2xsIFNNQ1IgICAgICAgICBNU00gICAgICAgICAgIExMX1RJTV9Jc0VuYWJsZWRNYXN0ZXJTbGF2ZU1vZGUKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfVElNX0lzRW5hYmxlZE1hc3RlclNsYXZlTW9kZShjb25zdCBUSU1fVHlwZURlZiAqVElNeCkgeworICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5TTUNSLCBUSU1fU01DUl9NU00pID09IChUSU1fU01DUl9NU00pKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDb25maWd1cmUgdGhlIGV4dGVybmFsIHRyaWdnZXIgKEVUUikgaW5wdXQuCisgKiBAbm90ZSBNYWNybyBJU19USU1fRVRSX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgKiAgICAgICBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGFuIGV4dGVybmFsIHRyaWdnZXIgaW5wdXQuCisgKiBAcm10b2xsIFNNQ1IgICAgICAgICBFVFAgICAgICAgICAgIExMX1RJTV9Db25maWdFVFJcbgorICogICAgICAgICBTTUNSICAgICAgICAgRVRQUyAgICAgICAgICBMTF9USU1fQ29uZmlnRVRSXG4KKyAqICAgICAgICAgU01DUiAgICAgICAgIEVURiAgICAgICAgICAgTExfVElNX0NvbmZpZ0VUUgorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcGFyYW0gIEVUUlBvbGFyaXR5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRVRSX1BPTEFSSVRZX05PTklOVkVSVEVECisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRVRSX1BPTEFSSVRZX0lOVkVSVEVECisgKiBAcGFyYW0gIEVUUlByZXNjYWxlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VUUl9QUkVTQ0FMRVJfRElWMQorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VUUl9QUkVTQ0FMRVJfRElWMgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VUUl9QUkVTQ0FMRVJfRElWNAorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VUUl9QUkVTQ0FMRVJfRElWOAorICogQHBhcmFtICBFVFJGaWx0ZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FVFJfRklMVEVSX0ZESVYxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRVRSX0ZJTFRFUl9GRElWMV9OMgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VUUl9GSUxURVJfRkRJVjFfTjQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FVFJfRklMVEVSX0ZESVYxX044CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRVRSX0ZJTFRFUl9GRElWMl9ONgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VUUl9GSUxURVJfRkRJVjJfTjgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FVFJfRklMVEVSX0ZESVY0X042CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRVRSX0ZJTFRFUl9GRElWNF9OOAorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VUUl9GSUxURVJfRkRJVjhfTjYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FVFJfRklMVEVSX0ZESVY4X044CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRVRSX0ZJTFRFUl9GRElWMTZfTjUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FVFJfRklMVEVSX0ZESVYxNl9ONgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VUUl9GSUxURVJfRkRJVjE2X044CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRVRSX0ZJTFRFUl9GRElWMzJfTjUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FVFJfRklMVEVSX0ZESVYzMl9ONgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VUUl9GSUxURVJfRkRJVjMyX044CisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NvbmZpZ0VUUihUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgRVRSUG9sYXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEVUUlByZXNjYWxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRVRSRmlsdGVyKSB7CisgIE1PRElGWV9SRUcoVElNeC0+U01DUiwgVElNX1NNQ1JfRVRQIHwgVElNX1NNQ1JfRVRQUyB8IFRJTV9TTUNSX0VURiwKKyAgICAgICAgICAgICBFVFJQb2xhcml0eSB8IEVUUlByZXNjYWxlciB8IEVUUkZpbHRlcik7Cit9CisKKy8qKgorICogQGJyaWVmICBTZWxlY3QgdGhlIGV4dGVybmFsIHRyaWdnZXIgKEVUUikgaW5wdXQgc291cmNlLgorICogQG5vdGUgTWFjcm8gSVNfVElNX0VUUlNFTF9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yCisgKiAgICAgICBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBFVFIgc291cmNlIHNlbGVjdGlvbi4KKyAqIEBybXRvbGwgQUYxICAgICAgICAgIEVUUlNFTCAgICAgICAgTExfVElNX1NldEVUUlNvdXJjZQorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcGFyYW0gIEVUUlNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICoKKyAqICAgICAgICAgVElNMTogYW55IGNvbWJpbmF0aW9uIG9mIEVUUl9STVAgd2hlcmUKKyAqCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMV9FVFJTT1VSQ0VfR1BJTworICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTFfRVRSU09VUkNFX0NPTVAxCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMV9FVFJTT1VSQ0VfQ09NUDIKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0xX0VUUlNPVVJDRV9DT01QMworICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTFfRVRSU09VUkNFX0NPTVA0CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMV9FVFJTT1VSQ0VfQ09NUDUgICAgICAgKCopCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMV9FVFJTT1VSQ0VfQ09NUDYgICAgICAgKCopCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMV9FVFJTT1VSQ0VfQ09NUDcgICAgICAgKCopCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMV9FVFJTT1VSQ0VfQURDMV9BV0QxCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMV9FVFJTT1VSQ0VfQURDMV9BV0QyCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMV9FVFJTT1VSQ0VfQURDMV9BV0QzCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMV9FVFJTT1VSQ0VfQURDNF9BV0QxICAgKCopCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMV9FVFJTT1VSQ0VfQURDNF9BV0QyICAgKCopCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMV9FVFJTT1VSQ0VfQURDNF9BV0QzICAgKCopCisgKgorICogICAgICAgICBUSU0yOiBhbnkgY29tYmluYXRpb24gb2YgRVRSX1JNUCB3aGVyZQorICoKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0yX0VUUlNPVVJDRV9HUElPCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMl9FVFJTT1VSQ0VfQ09NUDEKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0yX0VUUlNPVVJDRV9DT01QMgorICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTJfRVRSU09VUkNFX0NPTVAzCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMl9FVFJTT1VSQ0VfQ09NUDQKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0yX0VUUlNPVVJDRV9DT01QNSAgICAgICAoKikKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0yX0VUUlNPVVJDRV9DT01QNiAgICAgICAoKikKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0yX0VUUlNPVVJDRV9DT01QNyAgICAgICAoKikKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0yX0VUUlNPVVJDRV9USU0zX0VUUgorICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTJfRVRSU09VUkNFX1RJTTRfRVRSCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMl9FVFJTT1VSQ0VfVElNNV9FVFIgICAgKCopCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMl9FVFJTT1VSQ0VfTFNFCisgKgorICogICAgICAgICBUSU0zOiBhbnkgY29tYmluYXRpb24gb2YgRVRSX1JNUCB3aGVyZQorICoKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0zX0VUUlNPVVJDRV9HUElPCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNM19FVFJTT1VSQ0VfQ09NUDEKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0zX0VUUlNPVVJDRV9DT01QMgorICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTNfRVRSU09VUkNFX0NPTVAzCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNM19FVFJTT1VSQ0VfQ09NUDQKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0zX0VUUlNPVVJDRV9DT01QNSAgICAgICAoKikKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0zX0VUUlNPVVJDRV9DT01QNiAgICAgICAoKikKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0zX0VUUlNPVVJDRV9DT01QNyAgICAgICAoKikKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0zX0VUUlNPVVJDRV9USU0yX0VUUgorICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTNfRVRSU09VUkNFX1RJTTRfRVRSCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNM19FVFJTT1VSQ0VfQURDMl9BV0QxCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNM19FVFJTT1VSQ0VfQURDMl9BV0QyCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNM19FVFJTT1VSQ0VfQURDMl9BV0QzCisgKgorICogICAgICAgICBUSU00OiBhbnkgY29tYmluYXRpb24gb2YgRVRSX1JNUCB3aGVyZQorICoKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU00X0VUUlNPVVJDRV9HUElPCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNNF9FVFJTT1VSQ0VfQ09NUDEKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU00X0VUUlNPVVJDRV9DT01QMgorICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTRfRVRSU09VUkNFX0NPTVAzCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNNF9FVFJTT1VSQ0VfQ09NUDQKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU00X0VUUlNPVVJDRV9DT01QNSAgICAgICAoKikKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU00X0VUUlNPVVJDRV9DT01QNiAgICAgICAoKikKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU00X0VUUlNPVVJDRV9DT01QNyAgICAgICAoKikKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU00X0VUUlNPVVJDRV9USU0zX0VUUgorICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTRfRVRSU09VUkNFX1RJTTVfRVRSICAgICgqKQorICoKKyAqICAgICAgICAgVElNNTogYW55IGNvbWJpbmF0aW9uIG9mIEVUUl9STVAgd2hlcmUgICAgICAgKCoqKQorICoKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU01X0VUUlNPVVJDRV9HUElPICAgICAgICAoKikKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU01X0VUUlNPVVJDRV9DT01QMSAgICAgICAoKikKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU01X0VUUlNPVVJDRV9DT01QMiAgICAgICAoKikKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU01X0VUUlNPVVJDRV9DT01QMyAgICAgICAoKikKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU01X0VUUlNPVVJDRV9DT01QNCAgICAgICAoKikKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU01X0VUUlNPVVJDRV9DT01QNSAgICAgICAoKikKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU01X0VUUlNPVVJDRV9DT01QNiAgICAgICAoKikKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU01X0VUUlNPVVJDRV9DT01QNyAgICAgICAoKikKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU01X0VUUlNPVVJDRV9USU0yX0VUUiAgICAoKikKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU01X0VUUlNPVVJDRV9USU0zX0VUUiAgICAoKikKKyAqCisgKiAgICAgICAgIFRJTTg6IGFueSBjb21iaW5hdGlvbiBvZiBFVFJfUk1QIHdoZXJlCisgKgorICogICAgICAgICAgICAuIC4gRVRSX1JNUCBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNOF9FVFJTT1VSQ0VfR1BJTworICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTThfRVRSU09VUkNFX0NPTVAxCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNOF9FVFJTT1VSQ0VfQ09NUDIKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU04X0VUUlNPVVJDRV9DT01QMworICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTThfRVRSU09VUkNFX0NPTVA0CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNOF9FVFJTT1VSQ0VfQ09NUDUgICAgICAgKCopCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNOF9FVFJTT1VSQ0VfQ09NUDYgICAgICAgKCopCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNOF9FVFJTT1VSQ0VfQ09NUDcgICAgICAgKCopCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNOF9FVFJTT1VSQ0VfQURDMl9BV0QxCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNOF9FVFJTT1VSQ0VfQURDMl9BV0QyCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNOF9FVFJTT1VSQ0VfQURDMl9BV0QzCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNOF9FVFJTT1VSQ0VfQURDM19BV0QxICAgKCopCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNOF9FVFJTT1VSQ0VfQURDM19BV0QyICAgKCopCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNOF9FVFJTT1VSQ0VfQURDM19BV0QzICAgKCopCisgKgorICogICAgICAgICBUSU0yMDogYW55IGNvbWJpbmF0aW9uIG9mIEVUUl9STVAgd2hlcmUgICAgICAgKCoqKQorICoKKyAqICAgICAgICAgICAgLiAuIEVUUl9STVAgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcworICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTIwX0VUUlNPVVJDRV9HUElPICAgICAgICgqKQorICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTIwX0VUUlNPVVJDRV9DT01QMSAgICAgICgqKQorICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTIwX0VUUlNPVVJDRV9DT01QMiAgICAgICgqKQorICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTIwX0VUUlNPVVJDRV9DT01QMyAgICAgICgqKQorICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTIwX0VUUlNPVVJDRV9DT01QNCAgICAgICgqKQorICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTIwX0VUUlNPVVJDRV9DT01QNSAgICAgICgqKQorICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTIwX0VUUlNPVVJDRV9DT01QNiAgICAgICgqKQorICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTIwX0VUUlNPVVJDRV9DT01QNyAgICAgICgqKQorICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTIwX0VUUlNPVVJDRV9BREMzX0FXRDEgICgqKQorICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTIwX0VUUlNPVVJDRV9BREMzX0FXRDIgICgqKQorICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTIwX0VUUlNPVVJDRV9BREMzX0FXRDMgICgqKQorICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTIwX0VUUlNPVVJDRV9BREM1X0FXRDEgICgqKQorICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTIwX0VUUlNPVVJDRV9BREM1X0FXRDIgICgqKQorICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTIwX0VUUlNPVVJDRV9BREM1X0FXRDMgICgqKQorICoKKyAqICAgICAgICAgKCopICBWYWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4gXG4KKyAqICAgICAgICAgKCoqKSBSZWdpc3RlciBub3QgYXZhaWxhYmxlIGluIGFsbCBkZXZpY2VzLgorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9TZXRFVFJTb3VyY2UoVElNX1R5cGVEZWYgKlRJTXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEVUUlNvdXJjZSkgeworICBNT0RJRllfUkVHKFRJTXgtPkFGMSwgVElNeF9BRjFfRVRSU0VMLCBFVFJTb3VyY2UpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIFNNUyBwcmVsb2FkLgorICogQG5vdGUgTWFjcm8gSVNfVElNX1NNU19QUkVMT0FEX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIHRoZSBwcmVsb2FkIG9mIFNNUyBmaWVsZCBpbgorICogU01DUiByZWdpc3Rlci4KKyAqIEBybXRvbGwgU01DUiAgICAgICAgIFNNU1BFICAgICAgICAgICBMTF9USU1fRW5hYmxlU01TUHJlbG9hZAorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZVNNU1ByZWxvYWQoVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgU0VUX0JJVChUSU14LT5TTUNSLCBUSU1fU01DUl9TTVNQRSk7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIFNNUyBwcmVsb2FkLgorICogQG5vdGUgTWFjcm8gSVNfVElNX1NNU19QUkVMT0FEX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIHRoZSBwcmVsb2FkIG9mIFNNUyBmaWVsZCBpbgorICogU01DUiByZWdpc3Rlci4KKyAqIEBybXRvbGwgU01DUiAgICAgICAgIFNNU1BFICAgICAgICAgICBMTF9USU1fRGlzYWJsZVNNU1ByZWxvYWQKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlU01TUHJlbG9hZChUSU1fVHlwZURlZiAqVElNeCkgeworICBDTEVBUl9CSVQoVElNeC0+U01DUiwgVElNX1NNQ1JfU01TUEUpOworfQorCisvKioKKyAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciAgU01TIHByZWxvYWQgaXMgZW5hYmxlZC4KKyAqIEBub3RlIE1hY3JvIElTX1RJTV9TTVNfUFJFTE9BRF9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyB0aGUgcHJlbG9hZCBvZiBTTVMgZmllbGQgaW4KKyAqIFNNQ1IgcmVnaXN0ZXIuCisgKiBAcm10b2xsIFNNQ1IgICAgICAgICBTTVNQRSAgICAgICAgICAgTExfVElNX0lzRW5hYmxlZFNNU1ByZWxvYWQKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNFbmFibGVkU01TUHJlbG9hZChjb25zdCBUSU1fVHlwZURlZiAqVElNeCkgeworICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5TTUNSLCBUSU1fU01DUl9TTVNQRSkgPT0gKFRJTV9TTUNSX1NNU1BFKSkgPyAxVUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFNldCB0aGUgcHJlbG9hZCBzb3VyY2Ugb2YgU01TLgorICogQG5vdGUgTWFjcm8gSVNfVElNX1NNU19QUkVMT0FEX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIHRoZSBwcmVsb2FkIG9mIFNNUyBmaWVsZCBpbgorICogU01DUiByZWdpc3Rlci4KKyAqIEBybXRvbGwgU01DUiAgICAgICAgIFNNU1BTICAgICAgICBMTF9USU1fU2V0U01TUHJlbG9hZFNvdXJjZVxuCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEBwYXJhbSAgUHJlbG9hZFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1NNU1BTX1RJTVVQREFURQorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1NNU1BTX0lOREVYCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX1NldFNNU1ByZWxvYWRTb3VyY2UoVElNX1R5cGVEZWYgKlRJTXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQcmVsb2FkU291cmNlKSB7CisgIE1PRElGWV9SRUcoVElNeC0+U01DUiwgVElNX1NNQ1JfU01TUFMsIFByZWxvYWRTb3VyY2UpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IHRoZSBwcmVsb2FkIHNvdXJjZSBvZiBTTVMuCisgKiBAbm90ZSBNYWNybyBJU19USU1fU01TX1BSRUxPQURfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAqICAgICAgIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgdGhlIHByZWxvYWQgb2YgU01TIGZpZWxkIGluCisgKiBTTUNSIHJlZ2lzdGVyLgorICogQHJtdG9sbCBTTUNSICAgICAgICAgU01TUFMgICAgICAgIExMX1RJTV9HZXRTTVNQcmVsb2FkU291cmNlXG4KKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1NNU1BTX1RJTVVQREFURQorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1NNU1BTX0lOREVYCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fR2V0U01TUHJlbG9hZFNvdXJjZShjb25zdCBUSU1fVHlwZURlZiAqVElNeCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChUSU14LT5TTUNSLCBUSU1fU01DUl9TTVNQUykpOworfQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUZfQnJlYWtfRnVuY3Rpb24gQnJlYWsgZnVuY3Rpb24gY29uZmlndXJhdGlvbgorICogQHsKKyAqLworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSB0aGUgYnJlYWsgZnVuY3Rpb24uCisgKiBAbm90ZSBNYWNybyBJU19USU1fQlJFQUtfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgYSBicmVhayBpbnB1dC4KKyAqIEBybXRvbGwgQkRUUiAgICAgICAgIEJLRSAgICAgICAgICAgTExfVElNX0VuYWJsZUJSSworICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZUJSSyhUSU1fVHlwZURlZiAqVElNeCkgeworICBTRVRfQklUKFRJTXgtPkJEVFIsIFRJTV9CRFRSX0JLRSk7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIHRoZSBicmVhayBmdW5jdGlvbi4KKyAqIEBybXRvbGwgQkRUUiAgICAgICAgIEJLRSAgICAgICAgICAgTExfVElNX0Rpc2FibGVCUksKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQG5vdGUgTWFjcm8gSVNfVElNX0JSRUFLX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgKiAgICAgICBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGEgYnJlYWsgaW5wdXQuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0Rpc2FibGVCUksoVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgQ0xFQVJfQklUKFRJTXgtPkJEVFIsIFRJTV9CRFRSX0JLRSk7Cit9CisKKy8qKgorICogQGJyaWVmICBDb25maWd1cmUgdGhlIGJyZWFrIGlucHV0LgorICogQG5vdGUgTWFjcm8gSVNfVElNX0JSRUFLX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgKiAgICAgICBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGEgYnJlYWsgaW5wdXQuCisgKiBAbm90ZSBCaWRpcmVjdGlvbmFsIG1vZGUgaXMgb25seSBzdXBwb3J0ZWQgYnkgYWR2YW5jZWQgdGltZXIgaW5zdGFuY2VzLgorICogICAgICAgTWFjcm8gSVNfVElNX0FEVkFOQ0VEX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3IKKyAqIG5vdCBhIHRpbWVyIGluc3RhbmNlIGlzIGFuIGFkdmFuY2VkLWNvbnRyb2wgdGltZXIuCisgKiBAbm90ZSBJbiBiaWRpcmVjdGlvbmFsIG1vZGUgKEJLQklEIGJpdCBzZXQpLCB0aGUgQnJlYWsgaW5wdXQgaXMgY29uZmlndXJlZAorICogYm90aCBpbiBpbnB1dCBtb2RlIGFuZCBpbiBvcGVuIGRyYWluIG91dHB1dCBtb2RlLiBBbnkgYWN0aXZlIEJyZWFrIGV2ZW50IHdpbGwKKyAqICAgICAgICBhc3NlcnQgYSBsb3cgbG9naWMgbGV2ZWwgb24gdGhlIEJyZWFrIGlucHV0IHRvIGluZGljYXRlIGFuIGludGVybmFsCisgKiBicmVhayBldmVudCB0byBleHRlcm5hbCBkZXZpY2VzLgorICogQG5vdGUgV2hlbiBiaWRpcmVjdGlvbmFsIG1vZGUgaXNuJ3Qgc3VwcG9ydGVkLCBCcmVha0FGTW9kZSBtdXN0IGJlIHNldCB0bworICogICAgICAgTExfVElNX0JSRUFLX0FGTU9ERV9JTlBVVC4KKyAqIEBybXRvbGwgQkRUUiAgICAgICAgIEJLUCAgICAgICAgICAgTExfVElNX0NvbmZpZ0JSS1xuCisgKiAgICAgICAgIEJEVFIgICAgICAgICBCS0YgICAgICAgICAgIExMX1RJTV9Db25maWdCUktcbgorICogICAgICAgICBCRFRSICAgICAgICAgQktCSUQgICAgICAgICBMTF9USU1fQ29uZmlnQlJLCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEBwYXJhbSAgQnJlYWtQb2xhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLX1BPTEFSSVRZX0xPVworICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLX1BPTEFSSVRZX0hJR0gKKyAqIEBwYXJhbSAgQnJlYWtGaWx0ZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjFfTjIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjFfTjQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjFfTjgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjJfTjYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjJfTjgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjRfTjYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjRfTjgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjhfTjYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjhfTjgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjE2X041CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYxNl9ONgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWMTZfTjgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjMyX041CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYzMl9ONgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWMzJfTjgKKyAqIEBwYXJhbSAgQnJlYWtBRk1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBS19BRk1PREVfSU5QVVQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBS19BRk1PREVfQklESVJFQ1RJT05BTAorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9Db25maWdCUksoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IEJyZWFrUG9sYXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEJyZWFrRmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBCcmVha0FGTW9kZSkgeworICBNT0RJRllfUkVHKFRJTXgtPkJEVFIsIFRJTV9CRFRSX0JLUCB8IFRJTV9CRFRSX0JLRiB8IFRJTV9CRFRSX0JLQklELAorICAgICAgICAgICAgIEJyZWFrUG9sYXJpdHkgfCBCcmVha0ZpbHRlciB8IEJyZWFrQUZNb2RlKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FybSB0aGUgYnJlYWsgaW5wdXQgKHdoZW4gaXQgb3BlcmF0ZXMgaW4gYmlkaXJlY3Rpb25hbCBtb2RlKS4KKyAqIEBub3RlICBUaGUgYnJlYWsgaW5wdXQgY2FuIGJlIGRpc2FybWVkIG9ubHkgd2hlbiBpdCBpcyBjb25maWd1cmVkIGluCisgKiAgICAgICAgYmlkaXJlY3Rpb25hbCBtb2RlIGFuZCB3aGVuIHdoZW4gTU9FIGlzIHJlc2V0LgorICogQG5vdGUgIFB1cnBvc2UgaXMgdG8gYmUgYWJsZSB0byBoYXZlIHRoZSBpbnB1dCB2b2x0YWdlIGJhY2sgdG8gaGlnaC1zdGF0ZSwKKyAqICAgICAgICB3aGF0ZXZlciB0aGUgdGltZSBjb25zdGFudCBvbiB0aGUgb3V0cHV0IC4KKyAqIEBybXRvbGwgQkRUUiAgICAgICAgIEJLRFNSTSAgICAgICAgTExfVElNX0Rpc2FybUJSSworICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0Rpc2FybUJSSyhUSU1fVHlwZURlZiAqVElNeCkgeworICBTRVRfQklUKFRJTXgtPkJEVFIsIFRJTV9CRFRSX0JLRFNSTSk7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgdGhlIGJyZWFrIDIgZnVuY3Rpb24uCisgKiBAbm90ZSBNYWNybyBJU19USU1fQktJTjJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgYSBzZWNvbmQgYnJlYWsgaW5wdXQuCisgKiBAcm10b2xsIEJEVFIgICAgICAgICBCSzJFICAgICAgICAgIExMX1RJTV9FbmFibGVCUksyCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlQlJLMihUSU1fVHlwZURlZiAqVElNeCkgeworICBTRVRfQklUKFRJTXgtPkJEVFIsIFRJTV9CRFRSX0JLMkUpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSB0aGUgYnJlYWsgIDIgZnVuY3Rpb24uCisgKiBAbm90ZSBNYWNybyBJU19USU1fQktJTjJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgYSBzZWNvbmQgYnJlYWsgaW5wdXQuCisgKiBAcm10b2xsIEJEVFIgICAgICAgICBCSzJFICAgICAgICAgIExMX1RJTV9EaXNhYmxlQlJLMgorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0Rpc2FibGVCUksyKFRJTV9UeXBlRGVmICpUSU14KSB7CisgIENMRUFSX0JJVChUSU14LT5CRFRSLCBUSU1fQkRUUl9CSzJFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgYnJlYWsgMiBpbnB1dC4KKyAqIEBub3RlIE1hY3JvIElTX1RJTV9CS0lOMl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBhIHNlY29uZCBicmVhayBpbnB1dC4KKyAqIEBub3RlIEJpZGlyZWN0aW9uYWwgbW9kZSBpcyBvbmx5IHN1cHBvcnRlZCBieSBhZHZhbmNlZCB0aW1lciBpbnN0YW5jZXMuCisgKiAgICAgICBNYWNybyBJU19USU1fQURWQU5DRURfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvcgorICogbm90IGEgdGltZXIgaW5zdGFuY2UgaXMgYW4gYWR2YW5jZWQtY29udHJvbCB0aW1lci4KKyAqIEBub3RlIEluIGJpZGlyZWN0aW9uYWwgbW9kZSAoQksyQklEIGJpdCBzZXQpLCB0aGUgQnJlYWsgMiBpbnB1dCBpcyBjb25maWd1cmVkCisgKiBib3RoIGluIGlucHV0IG1vZGUgYW5kIGluIG9wZW4gZHJhaW4gb3V0cHV0IG1vZGUuIEFueSBhY3RpdmUgQnJlYWsgZXZlbnQgd2lsbAorICogICAgICAgIGFzc2VydCBhIGxvdyBsb2dpYyBsZXZlbCBvbiB0aGUgQnJlYWsgMiBpbnB1dCB0byBpbmRpY2F0ZSBhbiBpbnRlcm5hbAorICogYnJlYWsgZXZlbnQgdG8gZXh0ZXJuYWwgZGV2aWNlcy4KKyAqIEBub3RlIFdoZW4gYmlkaXJlY3Rpb25hbCBtb2RlIGlzbid0IHN1cHBvcnRlZCwgQnJlYWsyQUZNb2RlIG11c3QgYmUgc2V0IHRvCisgKiAgICAgICBMTF9USU1fQlJFQUsyX0FGTU9ERV9JTlBVVC4KKyAqIEBybXRvbGwgQkRUUiAgICAgICAgIEJLMlAgICAgICAgICAgTExfVElNX0NvbmZpZ0JSSzJcbgorICogICAgICAgICBCRFRSICAgICAgICAgQksyRiAgICAgICAgICBMTF9USU1fQ29uZmlnQlJLMlxuCisgKiAgICAgICAgIEJEVFIgICAgICAgICBCSzJCSUQgICAgICAgIExMX1RJTV9Db25maWdCUksyCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEBwYXJhbSAgQnJlYWsyUG9sYXJpdHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBSzJfUE9MQVJJVFlfTE9XCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUsyX1BPTEFSSVRZX0hJR0gKKyAqIEBwYXJhbSAgQnJlYWsyRmlsdGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMQorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjFfTjIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYxX040CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMV9OOAorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjJfTjYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYyX044CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWNF9ONgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjRfTjgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVY4X042CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWOF9OOAorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjE2X041CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMTZfTjYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYxNl9OOAorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjMyX041CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMzJfTjYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYzMl9OOAorICogQHBhcmFtICBCcmVhazJBRk1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBSzJfQUZNT0RFX0lOUFVUCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUsyX0FGTU9ERV9CSURJUkVDVElPTkFMCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NvbmZpZ0JSSzIoVElNX1R5cGVEZWYgKlRJTXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBCcmVhazJQb2xhcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEJyZWFrMkZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEJyZWFrMkFGTW9kZSkgeworICBNT0RJRllfUkVHKFRJTXgtPkJEVFIsIFRJTV9CRFRSX0JLMlAgfCBUSU1fQkRUUl9CSzJGIHwgVElNX0JEVFJfQksyQklELAorICAgICAgICAgICAgIEJyZWFrMlBvbGFyaXR5IHwgQnJlYWsyRmlsdGVyIHwgQnJlYWsyQUZNb2RlKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FybSB0aGUgYnJlYWsgMiBpbnB1dCAod2hlbiBpdCBvcGVyYXRlcyBpbiBiaWRpcmVjdGlvbmFsIG1vZGUpLgorICogQG5vdGUgIFRoZSBicmVhayAyIGlucHV0IGNhbiBiZSBkaXNhcm1lZCBvbmx5IHdoZW4gaXQgaXMgY29uZmlndXJlZCBpbgorICogICAgICAgIGJpZGlyZWN0aW9uYWwgbW9kZSBhbmQgd2hlbiB3aGVuIE1PRSBpcyByZXNldC4KKyAqIEBub3RlICBQdXJwb3NlIGlzIHRvIGJlIGFibGUgdG8gaGF2ZSB0aGUgaW5wdXQgdm9sdGFnZSBiYWNrIHRvIGhpZ2gtc3RhdGUsCisgKiAgICAgICAgd2hhdGV2ZXIgdGhlIHRpbWUgY29uc3RhbnQgb24gdGhlIG91dHB1dC4KKyAqIEBybXRvbGwgQkRUUiAgICAgICAgIEJLMkRTUk0gICAgICAgTExfVElNX0Rpc2FybUJSSzIKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhcm1CUksyKFRJTV9UeXBlRGVmICpUSU14KSB7CisgIFNFVF9CSVQoVElNeC0+QkRUUiwgVElNX0JEVFJfQksyRFNSTSk7Cit9CisKKy8qKgorICogQGJyaWVmICBTZWxlY3QgdGhlIG91dHB1dHMgb2ZmIHN0YXRlIChlbmFibGVkIHYucy4gZGlzYWJsZWQpIGluIElkbGUgYW5kIFJ1bgorICogbW9kZXMuCisgKiBAbm90ZSBNYWNybyBJU19USU1fQlJFQUtfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgYSBicmVhayBpbnB1dC4KKyAqIEBybXRvbGwgQkRUUiAgICAgICAgIE9TU0kgICAgICAgICAgTExfVElNX1NldE9mZlN0YXRlc1xuCisgKiAgICAgICAgIEJEVFIgICAgICAgICBPU1NSICAgICAgICAgIExMX1RJTV9TZXRPZmZTdGF0ZXMKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHBhcmFtICBPZmZTdGF0ZUlkbGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PU1NJX0RJU0FCTEUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PU1NJX0VOQUJMRQorICogQHBhcmFtICBPZmZTdGF0ZVJ1biBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09TU1JfRElTQUJMRQorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09TU1JfRU5BQkxFCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX1NldE9mZlN0YXRlcyhUSU1fVHlwZURlZiAqVElNeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgT2ZmU3RhdGVJZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBPZmZTdGF0ZVJ1bikgeworICBNT0RJRllfUkVHKFRJTXgtPkJEVFIsIFRJTV9CRFRSX09TU0kgfCBUSU1fQkRUUl9PU1NSLAorICAgICAgICAgICAgIE9mZlN0YXRlSWRsZSB8IE9mZlN0YXRlUnVuKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBhdXRvbWF0aWMgb3V0cHV0IChNT0UgY2FuIGJlIHNldCBieSBzb2Z0d2FyZSBvciBhdXRvbWF0aWNhbGx5CisgKiB3aGVuIGEgYnJlYWsgaW5wdXQgaXMgYWN0aXZlKS4KKyAqIEBub3RlIE1hY3JvIElTX1RJTV9CUkVBS19JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBhIGJyZWFrIGlucHV0LgorICogQHJtdG9sbCBCRFRSICAgICAgICAgQU9FICAgICAgICAgICBMTF9USU1fRW5hYmxlQXV0b21hdGljT3V0cHV0CisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlQXV0b21hdGljT3V0cHV0KFRJTV9UeXBlRGVmICpUSU14KSB7CisgIFNFVF9CSVQoVElNeC0+QkRUUiwgVElNX0JEVFJfQU9FKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgYXV0b21hdGljIG91dHB1dCAoTU9FIGNhbiBiZSBzZXQgb25seSBieSBzb2Z0d2FyZSkuCisgKiBAbm90ZSBNYWNybyBJU19USU1fQlJFQUtfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgYSBicmVhayBpbnB1dC4KKyAqIEBybXRvbGwgQkRUUiAgICAgICAgIEFPRSAgICAgICAgICAgTExfVElNX0Rpc2FibGVBdXRvbWF0aWNPdXRwdXQKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlQXV0b21hdGljT3V0cHV0KFRJTV9UeXBlRGVmICpUSU14KSB7CisgIENMRUFSX0JJVChUSU14LT5CRFRSLCBUSU1fQkRUUl9BT0UpOworfQorCisvKioKKyAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciBhdXRvbWF0aWMgb3V0cHV0IGlzIGVuYWJsZWQuCisgKiBAbm90ZSBNYWNybyBJU19USU1fQlJFQUtfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgYSBicmVhayBpbnB1dC4KKyAqIEBybXRvbGwgQkRUUiAgICAgICAgIEFPRSAgICAgICAgICAgTExfVElNX0lzRW5hYmxlZEF1dG9tYXRpY091dHB1dAorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9USU1fSXNFbmFibGVkQXV0b21hdGljT3V0cHV0KGNvbnN0IFRJTV9UeXBlRGVmICpUSU14KSB7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPkJEVFIsIFRJTV9CRFRSX0FPRSkgPT0gKFRJTV9CRFRSX0FPRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSB0aGUgb3V0cHV0cyAoc2V0IHRoZSBNT0UgYml0IGluIFRJTXhfQkRUUiByZWdpc3RlcikuCisgKiBAbm90ZSBUaGUgTU9FIGJpdCBpbiBUSU14X0JEVFIgcmVnaXN0ZXIgYWxsb3dzIHRvIGVuYWJsZSAvZGlzYWJsZSB0aGUgb3V0cHV0cworICogYnkgc29mdHdhcmUgYW5kIGlzIHJlc2V0IGluIGNhc2Ugb2YgYnJlYWsgb3IgYnJlYWsyIGV2ZW50CisgKiBAbm90ZSBNYWNybyBJU19USU1fQlJFQUtfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgYSBicmVhayBpbnB1dC4KKyAqIEBybXRvbGwgQkRUUiAgICAgICAgIE1PRSAgICAgICAgICAgTExfVElNX0VuYWJsZUFsbE91dHB1dHMKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9FbmFibGVBbGxPdXRwdXRzKFRJTV9UeXBlRGVmICpUSU14KSB7CisgIFNFVF9CSVQoVElNeC0+QkRUUiwgVElNX0JEVFJfTU9FKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgdGhlIG91dHB1dHMgKHJlc2V0IHRoZSBNT0UgYml0IGluIFRJTXhfQkRUUiByZWdpc3RlcikuCisgKiBAbm90ZSBUaGUgTU9FIGJpdCBpbiBUSU14X0JEVFIgcmVnaXN0ZXIgYWxsb3dzIHRvIGVuYWJsZSAvZGlzYWJsZSB0aGUgb3V0cHV0cworICogYnkgc29mdHdhcmUgYW5kIGlzIHJlc2V0IGluIGNhc2Ugb2YgYnJlYWsgb3IgYnJlYWsyIGV2ZW50LgorICogQG5vdGUgTWFjcm8gSVNfVElNX0JSRUFLX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgKiAgICAgICBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGEgYnJlYWsgaW5wdXQuCisgKiBAcm10b2xsIEJEVFIgICAgICAgICBNT0UgICAgICAgICAgIExMX1RJTV9EaXNhYmxlQWxsT3V0cHV0cworICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0Rpc2FibGVBbGxPdXRwdXRzKFRJTV9UeXBlRGVmICpUSU14KSB7CisgIENMRUFSX0JJVChUSU14LT5CRFRSLCBUSU1fQkRUUl9NT0UpOworfQorCisvKioKKyAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgb3V0cHV0cyBhcmUgZW5hYmxlZC4KKyAqIEBub3RlIE1hY3JvIElTX1RJTV9CUkVBS19JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBhIGJyZWFrIGlucHV0LgorICogQHJtdG9sbCBCRFRSICAgICAgICAgTU9FICAgICAgICAgICBMTF9USU1fSXNFbmFibGVkQWxsT3V0cHV0cworICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0VuYWJsZWRBbGxPdXRwdXRzKGNvbnN0IFRJTV9UeXBlRGVmICpUSU14KSB7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPkJEVFIsIFRJTV9CRFRSX01PRSkgPT0gKFRJTV9CRFRSX01PRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSB0aGUgc2lnbmFscyBjb25uZWN0ZWQgdG8gdGhlIGRlc2lnbmF0ZWQgdGltZXIgYnJlYWsgaW5wdXQuCisgKiBAbm90ZSBNYWNybyBJU19USU1fQlJFQUtTT1VSQ0VfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlcgorICogICAgICAgb3Igbm90IGEgdGltZXIgaW5zdGFuY2UgYWxsb3dzIGZvciBicmVhayBpbnB1dCBzZWxlY3Rpb24uCisgKiBAcm10b2xsIEFGMSAgICAgICAgICBCS0lORSAgICAgICAgIExMX1RJTV9FbmFibGVCcmVha0lucHV0U291cmNlXG4KKyAqICAgICAgICAgQUYxICAgICAgICAgIEJLQ01QMUUgICAgICAgTExfVElNX0VuYWJsZUJyZWFrSW5wdXRTb3VyY2VcbgorICogICAgICAgICBBRjEgICAgICAgICAgQktDTVAyRSAgICAgICBMTF9USU1fRW5hYmxlQnJlYWtJbnB1dFNvdXJjZVxuCisgKiAgICAgICAgIEFGMSAgICAgICAgICBCS0NNUDNFICAgICAgIExMX1RJTV9FbmFibGVCcmVha0lucHV0U291cmNlXG4KKyAqICAgICAgICAgQUYxICAgICAgICAgIEJLQ01QNEUgICAgICAgTExfVElNX0VuYWJsZUJyZWFrSW5wdXRTb3VyY2VcbgorICogICAgICAgICBBRjEgICAgICAgICAgQktDTVA1RSAgICAgICBMTF9USU1fRW5hYmxlQnJlYWtJbnB1dFNvdXJjZVxuCisgKiAgICAgICAgIEFGMSAgICAgICAgICBCS0NNUDZFICAgICAgIExMX1RJTV9FbmFibGVCcmVha0lucHV0U291cmNlXG4KKyAqICAgICAgICAgQUYxICAgICAgICAgIEJLQ01QN0UgICAgICAgTExfVElNX0VuYWJsZUJyZWFrSW5wdXRTb3VyY2VcbgorICogICAgICAgICBBRjIgICAgICAgICAgQksyTkUgICAgICAgICBMTF9USU1fRW5hYmxlQnJlYWtJbnB1dFNvdXJjZVxuCisgKiAgICAgICAgIEFGMiAgICAgICAgICBCSzJDTVAxRSAgICAgIExMX1RJTV9FbmFibGVCcmVha0lucHV0U291cmNlXG4KKyAqICAgICAgICAgQUYyICAgICAgICAgIEJLMkNNUDJFICAgICAgTExfVElNX0VuYWJsZUJyZWFrSW5wdXRTb3VyY2VcbgorICogICAgICAgICBBRjIgICAgICAgICAgQksyQ01QM0UgICAgICBMTF9USU1fRW5hYmxlQnJlYWtJbnB1dFNvdXJjZVxuCisgKiAgICAgICAgIEFGMiAgICAgICAgICBCSzJDTVA0RSAgICAgIExMX1RJTV9FbmFibGVCcmVha0lucHV0U291cmNlXG4KKyAqICAgICAgICAgQUYyICAgICAgICAgIEJLMkNNUDVFICAgICAgTExfVElNX0VuYWJsZUJyZWFrSW5wdXRTb3VyY2VcbgorICogICAgICAgICBBRjIgICAgICAgICAgQksyQ01QNkUgICAgICBMTF9USU1fRW5hYmxlQnJlYWtJbnB1dFNvdXJjZVxuCisgKiAgICAgICAgIEFGMiAgICAgICAgICBCSzJDTVA3RSAgICAgIExMX1RJTV9FbmFibGVCcmVha0lucHV0U291cmNlCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEBwYXJhbSAgQnJlYWtJbnB1dCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLX0lOUFVUX0JLSU4KKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBS19JTlBVVF9CS0lOMgorICogQHBhcmFtICBTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CS0lOX1NPVVJDRV9CS0lOCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQktJTl9TT1VSQ0VfQktDT01QMQorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JLSU5fU09VUkNFX0JLQ09NUDIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CS0lOX1NPVVJDRV9CS0NPTVAzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQktJTl9TT1VSQ0VfQktDT01QNAorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JLSU5fU09VUkNFX0JLQ09NUDUgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQktJTl9TT1VSQ0VfQktDT01QNiAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CS0lOX1NPVVJDRV9CS0NPTVA3ICgqKQorICoKKyAqICAgICAgICAgKCopICBWYWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4KKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlQnJlYWtJbnB1dFNvdXJjZShUSU1fVHlwZURlZiAqVElNeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEJyZWFrSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBTb3VyY2UpIHsKKyAgX19JTyB1aW50MzJfdCAqcFJlZyA9CisgICAgICAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJlRJTXgtPkFGMSkgKyBCcmVha0lucHV0KSk7CisgIFNFVF9CSVQoKnBSZWcsIFNvdXJjZSk7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIHRoZSBzaWduYWxzIGNvbm5lY3RlZCB0byB0aGUgZGVzaWduYXRlZCB0aW1lciBicmVhayBpbnB1dC4KKyAqIEBub3RlIE1hY3JvIElTX1RJTV9CUkVBS1NPVVJDRV9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyCisgKiAgICAgICBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBhbGxvd3MgZm9yIGJyZWFrIGlucHV0IHNlbGVjdGlvbi4KKyAqIEBybXRvbGwgQUYxICAgICAgICAgIEJLSU5FICAgICAgICAgTExfVElNX0Rpc2FibGVCcmVha0lucHV0U291cmNlXG4KKyAqICAgICAgICAgQUYxICAgICAgICAgIEJLQ01QMUUgICAgICAgTExfVElNX0Rpc2FibGVCcmVha0lucHV0U291cmNlXG4KKyAqICAgICAgICAgQUYxICAgICAgICAgIEJLQ01QMkUgICAgICAgTExfVElNX0Rpc2FibGVCcmVha0lucHV0U291cmNlXG4KKyAqICAgICAgICAgQUYxICAgICAgICAgIEJLQ01QM0UgICAgICAgTExfVElNX0Rpc2FibGVCcmVha0lucHV0U291cmNlXG4KKyAqICAgICAgICAgQUYxICAgICAgICAgIEJLQ01QNEUgICAgICAgTExfVElNX0Rpc2FibGVCcmVha0lucHV0U291cmNlXG4KKyAqICAgICAgICAgQUYxICAgICAgICAgIEJLQ01QNUUgICAgICAgTExfVElNX0Rpc2FibGVCcmVha0lucHV0U291cmNlXG4KKyAqICAgICAgICAgQUYxICAgICAgICAgIEJLQ01QNkUgICAgICAgTExfVElNX0Rpc2FibGVCcmVha0lucHV0U291cmNlXG4KKyAqICAgICAgICAgQUYxICAgICAgICAgIEJLQ01QN0UgICAgICAgTExfVElNX0Rpc2FibGVCcmVha0lucHV0U291cmNlXG4KKyAqICAgICAgICAgQUYyICAgICAgICAgIEJLMklORSAgICAgICAgTExfVElNX0Rpc2FibGVCcmVha0lucHV0U291cmNlXG4KKyAqICAgICAgICAgQUYyICAgICAgICAgIEJLMkNNUDFFICAgICAgTExfVElNX0Rpc2FibGVCcmVha0lucHV0U291cmNlXG4KKyAqICAgICAgICAgQUYyICAgICAgICAgIEJLMkNNUDJFICAgICAgTExfVElNX0Rpc2FibGVCcmVha0lucHV0U291cmNlXG4KKyAqICAgICAgICAgQUYyICAgICAgICAgIEJLMkNNUDNFICAgICAgTExfVElNX0Rpc2FibGVCcmVha0lucHV0U291cmNlXG4KKyAqICAgICAgICAgQUYyICAgICAgICAgIEJLMkNNUDRFICAgICAgTExfVElNX0Rpc2FibGVCcmVha0lucHV0U291cmNlXG4KKyAqICAgICAgICAgQUYyICAgICAgICAgIEJLMkNNUDVFICAgICAgTExfVElNX0Rpc2FibGVCcmVha0lucHV0U291cmNlXG4KKyAqICAgICAgICAgQUYyICAgICAgICAgIEJLMkNNUDZFICAgICAgTExfVElNX0Rpc2FibGVCcmVha0lucHV0U291cmNlXG4KKyAqICAgICAgICAgQUYyICAgICAgICAgIEJLMkNNUDdFICAgICAgTExfVElNX0Rpc2FibGVCcmVha0lucHV0U291cmNlCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEBwYXJhbSAgQnJlYWtJbnB1dCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLX0lOUFVUX0JLSU4KKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBS19JTlBVVF9CS0lOMgorICogQHBhcmFtICBTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CS0lOX1NPVVJDRV9CS0lOCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQktJTl9TT1VSQ0VfQktDT01QMQorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JLSU5fU09VUkNFX0JLQ09NUDIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CS0lOX1NPVVJDRV9CS0NPTVAzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQktJTl9TT1VSQ0VfQktDT01QNAorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JLSU5fU09VUkNFX0JLQ09NUDUgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQktJTl9TT1VSQ0VfQktDT01QNiAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CS0lOX1NPVVJDRV9CS0NPTVA3ICgqKQorICoKKyAqICAgICAgICAgKCopICBWYWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4KKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZUJyZWFrSW5wdXRTb3VyY2UoVElNX1R5cGVEZWYgKlRJTXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQnJlYWtJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBTb3VyY2UpIHsKKyAgX19JTyB1aW50MzJfdCAqcFJlZyA9CisgICAgICAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJlRJTXgtPkFGMSkgKyBCcmVha0lucHV0KSk7CisgIENMRUFSX0JJVCgqcFJlZywgU291cmNlKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFNldCB0aGUgcG9sYXJpdHkgb2YgdGhlIGJyZWFrIHNpZ25hbCBmb3IgdGhlIHRpbWVyIGJyZWFrIGlucHV0LgorICogQG5vdGUgTWFjcm8gSVNfVElNX0JSRUFLU09VUkNFX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIKKyAqICAgICAgIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIGFsbG93cyBmb3IgYnJlYWsgaW5wdXQgc2VsZWN0aW9uLgorICogQHJtdG9sbCBBRjEgICAgICAgICAgQktJTlAgICAgICAgICBMTF9USU1fU2V0QnJlYWtJbnB1dFNvdXJjZVBvbGFyaXR5XG4KKyAqICAgICAgICAgQUYxICAgICAgICAgIEJLQ01QMVAgICAgICAgTExfVElNX1NldEJyZWFrSW5wdXRTb3VyY2VQb2xhcml0eVxuCisgKiAgICAgICAgIEFGMSAgICAgICAgICBCS0NNUDJQICAgICAgIExMX1RJTV9TZXRCcmVha0lucHV0U291cmNlUG9sYXJpdHlcbgorICogICAgICAgICBBRjEgICAgICAgICAgQktDTVAzUCAgICAgICBMTF9USU1fU2V0QnJlYWtJbnB1dFNvdXJjZVBvbGFyaXR5XG4KKyAqICAgICAgICAgQUYxICAgICAgICAgIEJLQ01QNFAgICAgICAgTExfVElNX1NldEJyZWFrSW5wdXRTb3VyY2VQb2xhcml0eVxuCisgKiAgICAgICAgIEFGMSAgICAgICAgICBCS0NNUDVQICAgICAgIExMX1RJTV9TZXRCcmVha0lucHV0U291cmNlUG9sYXJpdHlcbgorICogICAgICAgICBBRjEgICAgICAgICAgQktDTVA2UCAgICAgICBMTF9USU1fU2V0QnJlYWtJbnB1dFNvdXJjZVBvbGFyaXR5XG4KKyAqICAgICAgICAgQUYxICAgICAgICAgIEJLQ01QN1AgICAgICAgTExfVElNX1NldEJyZWFrSW5wdXRTb3VyY2VQb2xhcml0eVxuCisgKiAgICAgICAgIEFGMiAgICAgICAgICBCSzJJTlAgICAgICAgIExMX1RJTV9TZXRCcmVha0lucHV0U291cmNlUG9sYXJpdHlcbgorICogICAgICAgICBBRjIgICAgICAgICAgQksyQ01QMVAgICAgICBMTF9USU1fU2V0QnJlYWtJbnB1dFNvdXJjZVBvbGFyaXR5XG4KKyAqICAgICAgICAgQUYyICAgICAgICAgIEJLMkNNUDJQICAgICAgTExfVElNX1NldEJyZWFrSW5wdXRTb3VyY2VQb2xhcml0eVxuCisgKiAgICAgICAgIEFGMiAgICAgICAgICBCSzJDTVAzUCAgICAgIExMX1RJTV9TZXRCcmVha0lucHV0U291cmNlUG9sYXJpdHlcbgorICogICAgICAgICBBRjIgICAgICAgICAgQksyQ01QNFAgICAgICBMTF9USU1fU2V0QnJlYWtJbnB1dFNvdXJjZVBvbGFyaXR5XG4KKyAqICAgICAgICAgQUYyICAgICAgICAgIEJLMkNNUDVQICAgICAgTExfVElNX1NldEJyZWFrSW5wdXRTb3VyY2VQb2xhcml0eVxuCisgKiAgICAgICAgIEFGMiAgICAgICAgICBCSzJDTVA2UCAgICAgIExMX1RJTV9TZXRCcmVha0lucHV0U291cmNlUG9sYXJpdHlcbgorICogICAgICAgICBBRjIgICAgICAgICAgQksyQ01QN1AgICAgICBMTF9USU1fU2V0QnJlYWtJbnB1dFNvdXJjZVBvbGFyaXR5CisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEBwYXJhbSAgQnJlYWtJbnB1dCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLX0lOUFVUX0JLSU4KKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBS19JTlBVVF9CS0lOMgorICogQHBhcmFtICBTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CS0lOX1NPVVJDRV9CS0lOCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQktJTl9TT1VSQ0VfQktDT01QMQorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JLSU5fU09VUkNFX0JLQ09NUDIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CS0lOX1NPVVJDRV9CS0NPTVAzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQktJTl9TT1VSQ0VfQktDT01QNAorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JLSU5fU09VUkNFX0JLQ09NUDUgKCopCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQktJTl9TT1VSQ0VfQktDT01QNiAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CS0lOX1NPVVJDRV9CS0NPTVA3ICgqKQorICogQHBhcmFtICBQb2xhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JLSU5fUE9MQVJJVFlfTE9XCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQktJTl9QT0xBUklUWV9ISUdICisgKgorICogICAgICAgICAoKikgIFZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9TZXRCcmVha0lucHV0U291cmNlUG9sYXJpdHkoVElNX1R5cGVEZWYgKlRJTXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEJyZWFrSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUG9sYXJpdHkpIHsKKyAgX19JTyB1aW50MzJfdCAqcFJlZyA9CisgICAgICAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJlRJTXgtPkFGMSkgKyBCcmVha0lucHV0KSk7CisgIE1PRElGWV9SRUcoKnBSZWcsIChUSU14X0FGMV9CS0lOUCA8PCBUSU1fUE9TSVRJT05fQlJLX1NPVVJDRSksCisgICAgICAgICAgICAgKFBvbGFyaXR5IDw8IFRJTV9QT1NJVElPTl9CUktfU09VUkNFKSk7Cit9CisvKioKKyAqIEBicmllZiAgRW5hYmxlIGFzeW1tZXRyaWNhbCBkZWFkdGltZS4KKyAqIEBub3RlIE1hY3JvIElTX1RJTV9ERUFEVElNRV9BU1lNTUVUUklDQUxfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAqIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgYXN5bW1ldHJpY2FsIGRlYWR0aW1lLgorICogQHJtdG9sbCBEVFIyICAgICAgICAgIERUQUUgICAgICAgICAgTExfVElNX0VuYWJsZUFzeW1tZXRyaWNhbERlYWRUaW1lCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlQXN5bW1ldHJpY2FsRGVhZFRpbWUoVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgU0VUX0JJVChUSU14LT5EVFIyLCBUSU1fRFRSMl9EVEFFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgYXN5bW1ldHJpY2FsIGRlYWQtdGltZS4KKyAqIEBub3RlIE1hY3JvIElTX1RJTV9ERUFEVElNRV9BU1lNTUVUUklDQUxfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAqIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgYXN5bW1ldHJpY2FsIGRlYWR0aW1lLgorICogQHJtdG9sbCBEVFIyICAgICAgICAgIERUQUUgICAgICAgICAgTExfVElNX0Rpc2FibGVBc3ltbWV0cmljYWxEZWFkVGltZQorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0Rpc2FibGVBc3ltbWV0cmljYWxEZWFkVGltZShUSU1fVHlwZURlZiAqVElNeCkgeworICBDTEVBUl9CSVQoVElNeC0+RFRSMiwgVElNX0RUUjJfRFRBRSk7Cit9CisKKy8qKgorICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciBhc3ltbWV0cmljYWwgZGVhZHRpbWUgaXMgYWN0aXZhdGVkLgorICogQG5vdGUgTWFjcm8gSVNfVElNX0RFQURUSU1FX0FTWU1NRVRSSUNBTF9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICogd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBhc3ltbWV0cmljYWwgZGVhZHRpbWUuCisgKiBAcm10b2xsIERUUjIgICAgICAgICAgRFRBRSAgICAgICAgICBMTF9USU1fSXNFbmFibGVkQXN5bW1ldHJpY2FsRGVhZFRpbWUKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfVElNX0lzRW5hYmxlZEFzeW1tZXRyaWNhbERlYWRUaW1lKGNvbnN0IFRJTV9UeXBlRGVmICpUSU14KSB7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPkRUUjIsIFRJTV9EVFIyX0RUQUUpID09IChUSU1fRFRSMl9EVEFFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgU2V0IHRoZSBmYWxsaW5nIGVkZ2UgZGVhZC10aW1lIGRlbGF5IChkZWxheSBpbnNlcnRlZCBiZXR3ZWVuIHRoZQorICogZmFsbGluZyBlZGdlIG9mIHRoZSBPQ3hSRUYgc2lnbmFsIGFuZCB0aGUgcmlzaW5nIGVkZ2Ugb2YgT0N4TiBzaWduYWxzKS4KKyAqIEBub3RlIE1hY3JvIElTX1RJTV9ERUFEVElNRV9BU1lNTUVUUklDQUxfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAqIHdoZXRoZXIgb3Igbm90IGFzeW1tZXRyaWNhbCBkZWFkLXRpbWUgaW5zZXJ0aW9uIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IGEKKyAqIHRpbWVyIGluc3RhbmNlLgorICogQG5vdGUgSGVscGVyIG1hY3JvIEByZWYgX19MTF9USU1fQ0FMQ19ERUFEVElNRSBjYW4gYmUgdXNlZCB0byBjYWxjdWxhdGUgdGhlCisgKiBEZWFkVGltZSBwYXJhbWV0ZXIKKyAqIEBub3RlIFRoaXMgYml0LWZpZWxkIGNhbiBub3QgYmUgbW9kaWZpZWQgYXMgbG9uZyBhcyBMT0NLIGxldmVsIDEsIDIgb3IgMyBoYXMKKyAqIGJlZW4gcHJvZ3JhbW1lZCAoTE9DSyBiaXRzIGluIFRJTXhfQkRUUiByZWdpc3RlcikuCisgKiBAcm10b2xsIERUUjIgICAgICAgICBEVEdGICAgICAgICAgICBMTF9USU1fU2V0RmFsbGluZ0RlYWRUaW1lCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEBwYXJhbSAgRGVhZFRpbWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0yNTUKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fU2V0RmFsbGluZ0RlYWRUaW1lKFRJTV9UeXBlRGVmICpUSU14LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBEZWFkVGltZSkgeworICBNT0RJRllfUkVHKFRJTXgtPkRUUjIsIFRJTV9EVFIyX0RUR0YsIERlYWRUaW1lKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCB0aGUgZmFsbGluZyBlZGdlIGRlYWQtdGltZSBkZWxheSAoZGVsYXkgaW5zZXJ0ZWQgYmV0d2VlbiB0aGUKKyAqIGZhbGxpbmcgZWRnZSBvZiB0aGUgT0N4UkVGIHNpZ25hbCBhbmQgdGhlIHJpc2luZyBlZGdlIG9mIE9DeE4gc2lnbmFscykuCisgKiBAbm90ZSBNYWNybyBJU19USU1fREVBRFRJTUVfQVNZTU1FVFJJQ0FMX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgKiB3aGV0aGVyIG9yIG5vdCBhc3ltbWV0cmljYWwgZGVhZC10aW1lIGluc2VydGlvbiBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSBhCisgKiB0aW1lciBpbnN0YW5jZS4KKyAqIEBub3RlIFRoaXMgYml0LWZpZWxkIGNhbiBub3QgYmUgbW9kaWZpZWQgYXMgbG9uZyBhcyBMT0NLIGxldmVsIDEsIDIgb3IgMyBoYXMKKyAqIGJlZW4gcHJvZ3JhbW1lZCAoTE9DSyBiaXRzIGluIFRJTXhfQkRUUiByZWdpc3RlcikuCisgKiBAcm10b2xsIERUUjIgICAgICAgICAgRFRHRiAgICAgICAgICAgTExfVElNX0dldEZhbGxpbmdEZWFkVGltZQorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTI1NToKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9HZXRGYWxsaW5nRGVhZFRpbWUoY29uc3QgVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVElNeC0+RFRSMiwgVElNX0RUUjJfRFRHRikpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIGRlYWR0aW1lIHByZWxvYWQuCisgKiBAbm90ZSBNYWNybyBJU19USU1fQlJFQUtfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgZGVhZHRpbWUgcHJlbG9hZC4KKyAqIEBybXRvbGwgRFRSMiAgICAgICAgICBEVFBFICAgICAgICAgIExMX1RJTV9FbmFibGVEZWFkVGltZVByZWxvYWQKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9FbmFibGVEZWFkVGltZVByZWxvYWQoVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgU0VUX0JJVChUSU14LT5EVFIyLCBUSU1fRFRSMl9EVFBFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgZGVhZC10aW1lIHByZWxvYWQuCisgKiBAbm90ZSBNYWNybyBJU19USU1fQlJFQUtfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgZGVhZHRpbWUgcHJlbG9hZC4KKyAqIEBybXRvbGwgRFRSMiAgICAgICAgICBEVFBFICAgICAgICAgIExMX1RJTV9EaXNhYmxlRGVhZFRpbWVQcmVsb2FkCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZURlYWRUaW1lUHJlbG9hZChUSU1fVHlwZURlZiAqVElNeCkgeworICBDTEVBUl9CSVQoVElNeC0+RFRSMiwgVElNX0RUUjJfRFRQRSk7Cit9CisKKy8qKgorICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciBkZWFkdGltZSBwcmVsb2FkIGlzIGFjdGl2YXRlZC4KKyAqIEBub3RlIE1hY3JvIElTX1RJTV9CUkVBS19JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBkZWFkdGltZSBwcmVsb2FkLgorICogQHJtdG9sbCBEVFIyICAgICAgICAgIERUUEUgICAgICAgICAgTExfVElNX0lzRW5hYmxlZERlYWRUaW1lUHJlbG9hZAorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9USU1fSXNFbmFibGVkRGVhZFRpbWVQcmVsb2FkKGNvbnN0IFRJTV9UeXBlRGVmICpUSU14KSB7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPkRUUjIsIFRJTV9EVFIyX0RUUEUpID09IChUSU1fRFRSMl9EVFBFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUZfRE1BX0J1cnN0X01vZGUgRE1BIGJ1cnN0IG1vZGUgY29uZmlndXJhdGlvbgorICogQHsKKyAqLworLyoqCisgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIHRpbWVyIERNQSBidXJzdCBmZWF0dXJlLgorICogQG5vdGUgTWFjcm8gSVNfVElNX0RNQUJVUlNUX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3IKKyAqICAgICAgIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIHRoZSBETUEgYnVyc3QgbW9kZS4KKyAqIEBybXRvbGwgRENSICAgICAgICAgIERCTCAgICAgICAgICAgTExfVElNX0NvbmZpZ0RNQUJ1cnN0XG4KKyAqICAgICAgICAgRENSICAgICAgICAgIERCQSAgICAgICAgICAgTExfVElNX0NvbmZpZ0RNQUJ1cnN0CisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEBwYXJhbSAgRE1BQnVyc3RCYXNlQWRkcmVzcyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcKKyAqIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DUjEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DUjIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9TTUNSCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfRElFUgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX1NSCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfRUdSCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQ0NNUjEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DQ01SMgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0NDRVIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DTlQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9QU0MKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9BUlIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9SQ1IKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DQ1IxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQ0NSMgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0NDUjMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DQ1I0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQkRUUgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0NDTVIzCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQ0NSNQorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0NDUjYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9EVFIyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfRUNSCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfVElTRUwKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9BRjEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9BRjIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9PUgorICogQHBhcmFtICBETUFCdXJzdExlbmd0aCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0xFTkdUSF8xVFJBTlNGRVIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfMlRSQU5TRkVSUworICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0xFTkdUSF8zVFJBTlNGRVJTCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzRUUkFOU0ZFUlMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfNVRSQU5TRkVSUworICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0xFTkdUSF82VFJBTlNGRVJTCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzdUUkFOU0ZFUlMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfOFRSQU5TRkVSUworICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0xFTkdUSF85VFJBTlNGRVJTCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzEwVFJBTlNGRVJTCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzExVFJBTlNGRVJTCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzEyVFJBTlNGRVJTCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzEzVFJBTlNGRVJTCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzE0VFJBTlNGRVJTCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzE1VFJBTlNGRVJTCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzE2VFJBTlNGRVJTCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzE3VFJBTlNGRVJTCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzE4VFJBTlNGRVJTCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzE5VFJBTlNGRVJTCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzIwVFJBTlNGRVJTCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzIxVFJBTlNGRVJTCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzIyVFJBTlNGRVJTCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzIzVFJBTlNGRVJTCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzI0VFJBTlNGRVJTCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzI1VFJBTlNGRVJTCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzI2VFJBTlNGRVJTCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NvbmZpZ0RNQUJ1cnN0KFRJTV9UeXBlRGVmICpUSU14LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IERNQUJ1cnN0QmFzZUFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRE1BQnVyc3RMZW5ndGgpIHsKKyAgTU9ESUZZX1JFRyhUSU14LT5EQ1IsIChUSU1fRENSX0RCTCB8IFRJTV9EQ1JfREJBKSwKKyAgICAgICAgICAgICAoRE1BQnVyc3RCYXNlQWRkcmVzcyB8IERNQUJ1cnN0TGVuZ3RoKSk7Cit9CisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FRl9FbmNvZGVyIEVuY29kZXIgY29uZmlndXJhdGlvbgorICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiAgRW5hYmxlIGVuY29kZXIgaW5kZXguCisgKiBAbm90ZSBNYWNybyBJU19USU1fSU5ERVhfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgYW4gaW5kZXggaW5wdXQuCisgKiBAcm10b2xsIEVDUiAgICAgICAgIElFICAgICAgICAgICBMTF9USU1fRW5hYmxlRW5jb2RlckluZGV4CisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlRW5jb2RlckluZGV4KFRJTV9UeXBlRGVmICpUSU14KSB7CisgIFNFVF9CSVQoVElNeC0+RUNSLCBUSU1fRUNSX0lFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgZW5jb2RlciBpbmRleC4KKyAqIEBub3RlIE1hY3JvIElTX1RJTV9JTkRFWF9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBhbiBpbmRleCBpbnB1dC4KKyAqIEBybXRvbGwgRUNSICAgICAgICAgSUUgICAgICAgICAgIExMX1RJTV9EaXNhYmxlRW5jb2RlckluZGV4CisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZUVuY29kZXJJbmRleChUSU1fVHlwZURlZiAqVElNeCkgeworICBDTEVBUl9CSVQoVElNeC0+RUNSLCBUSU1fRUNSX0lFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgZW5jb2RlciBpbmRleCBpcyBlbmFibGVkLgorICogQG5vdGUgTWFjcm8gSVNfVElNX0lOREVYX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgKiAgICAgICBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGFuIGluZGV4IGlucHV0LgorICogQHJtdG9sbCBFQ1IgICAgICAgICBJRSAgICAgICAgICAgTExfVElNX0lzRW5hYmxlZEVuY29kZXJJbmRleAorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0VuYWJsZWRFbmNvZGVySW5kZXgoY29uc3QgVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+RUNSLCBUSU1fRUNSX0lFKSA9PSAoVElNX0VDUl9JRSkpID8gMVUgOiAwVSk7Cit9CisKKy8qKgorICogQGJyaWVmICBTZXQgaW5kZXggZGlyZWN0aW9uCisgKiBAbm90ZSBNYWNybyBJU19USU1fSU5ERVhfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgYW4gaW5kZXggaW5wdXQuCisgKiBAcm10b2xsIEVDUiAgICAgICAgICBJRElSICAgICAgICAgICBMTF9USU1fU2V0SW5kZXhEaXJlY3Rpb24KKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHBhcmFtICBJbmRleERpcmVjdGlvbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lOREVYX1VQX0RPV04KKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JTkRFWF9VUAorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lOREVYX0RPV04KKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fU2V0SW5kZXhEaXJlY3Rpb24oVElNX1R5cGVEZWYgKlRJTXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgSW5kZXhEaXJlY3Rpb24pIHsKKyAgTU9ESUZZX1JFRyhUSU14LT5FQ1IsIFRJTV9FQ1JfSURJUiwgSW5kZXhEaXJlY3Rpb24pOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IGFjdHVhbCBpbmRleCBkaXJlY3Rpb24KKyAqIEBub3RlIE1hY3JvIElTX1RJTV9JTkRFWF9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBhbiBpbmRleCBpbnB1dC4KKyAqIEBybXRvbGwgRUNSICAgICAgICAgIElESVIgICAgICAgICAgIExMX1RJTV9HZXRJbmRleERpcmVjdGlvbgorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSU5ERVhfVVBfRE9XTgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lOREVYX1VQCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSU5ERVhfRE9XTgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0dldEluZGV4RGlyZWN0aW9uKGNvbnN0IFRJTV9UeXBlRGVmICpUSU14KSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFRJTXgtPkVDUiwgVElNX0VDUl9JRElSKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgZmlyc3QgaW5kZXguCisgKiBAbm90ZSBNYWNybyBJU19USU1fSU5ERVhfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgYW4gaW5kZXggaW5wdXQuCisgKiBAcm10b2xsIEVDUiAgICAgICAgICBGSURYICAgICAgICAgIExMX1RJTV9FbmFibGVGaXJzdEluZGV4CisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlRmlyc3RJbmRleChUSU1fVHlwZURlZiAqVElNeCkgeworICBTRVRfQklUKFRJTXgtPkVDUiwgVElNX0VDUl9GSURYKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgZmlyc3QgaW5kZXguCisgKiBAbm90ZSBNYWNybyBJU19USU1fSU5ERVhfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgYW4gaW5kZXggaW5wdXQuCisgKiBAcm10b2xsIEVDUiAgICAgICAgICBGSURYICAgICAgICAgIExMX1RJTV9EaXNhYmxlRmlyc3RJbmRleAorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0Rpc2FibGVGaXJzdEluZGV4KFRJTV9UeXBlRGVmICpUSU14KSB7CisgIENMRUFSX0JJVChUSU14LT5FQ1IsIFRJTV9FQ1JfRklEWCk7Cit9CisKKy8qKgorICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciBmaXJzdCBpbmRleCBpcyBlbmFibGVkLgorICogQG5vdGUgTWFjcm8gSVNfVElNX0lOREVYX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgKiAgICAgICBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGFuIGluZGV4IGlucHV0LgorICogQHJtdG9sbCBFQ1IgICAgICAgICAgRklEWCAgICAgICAgICBMTF9USU1fSXNFbmFibGVkRmlyc3RJbmRleAorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0VuYWJsZWRGaXJzdEluZGV4KGNvbnN0IFRJTV9UeXBlRGVmICpUSU14KSB7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPkVDUiwgVElNX0VDUl9GSURYKSA9PSAoVElNX0VDUl9GSURYKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgU2V0IGluZGV4IHBvc2l0aW9uaW5nCisgKiBAbm90ZSBNYWNybyBJU19USU1fSU5ERVhfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgYW4gaW5kZXggaW5wdXQuCisgKiBAcm10b2xsIEVDUiAgICAgICAgICBJUE9TICAgICAgICAgICBMTF9USU1fU2V0SW5kZXhQb3NpdGlvbm5pbmcKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHBhcmFtICBJbmRleFBvc2l0aW9ubmluZyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lOREVYX1BPU0lUSU9OX0RPV05fRE9XTgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lOREVYX1BPU0lUSU9OX0RPV05fVVAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JTkRFWF9QT1NJVElPTl9VUF9ET1dOCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSU5ERVhfUE9TSVRJT05fVVBfVVAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JTkRFWF9QT1NJVElPTl9ET1dOCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSU5ERVhfUE9TSVRJT05fVVAKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fU2V0SW5kZXhQb3NpdGlvbm5pbmcoVElNX1R5cGVEZWYgKlRJTXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgSW5kZXhQb3NpdGlvbm5pbmcpIHsKKyAgTU9ESUZZX1JFRyhUSU14LT5FQ1IsIFRJTV9FQ1JfSVBPUywgSW5kZXhQb3NpdGlvbm5pbmcpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IGFjdHVhbCBpbmRleCBwb3NpdGlvbmluZworICogQG5vdGUgTWFjcm8gSVNfVElNX0lOREVYX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgKiAgICAgICBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGFuIGluZGV4IGlucHV0LgorICogQHJtdG9sbCBFQ1IgICAgICAgICAgSVBPUyAgICAgICAgICAgTExfVElNX0dldEluZGV4UG9zaXRpb25uaW5nCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JTkRFWF9QT1NJVElPTl9ET1dOX0RPV04KKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JTkRFWF9QT1NJVElPTl9ET1dOX1VQCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSU5ERVhfUE9TSVRJT05fVVBfRE9XTgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lOREVYX1BPU0lUSU9OX1VQX1VQCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSU5ERVhfUE9TSVRJT05fRE9XTgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lOREVYX1BPU0lUSU9OX1VQCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fR2V0SW5kZXhQb3NpdGlvbm5pbmcoY29uc3QgVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVElNeC0+RUNSLCBUSU1fRUNSX0lQT1MpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENvbmZpZ3VyZSBlbmNvZGVyIGluZGV4LgorICogQG5vdGUgTWFjcm8gSVNfVElNX0lOREVYX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgKiAgICAgICBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGFuIGluZGV4IGlucHV0LgorICogQHJtdG9sbCBFQ1IgICAgICAgICAgSURJUiAgICAgICAgICBMTF9USU1fQ29uZmlnSURYXG4KKyAqICAgICAgICAgRUNSICAgICAgICAgIEZJRFggICAgICAgICAgTExfVElNX0NvbmZpZ0lEWFxuCisgKiAgICAgICAgIEVDUiAgICAgICAgICBJUE9TICAgICAgICAgIExMX1RJTV9Db25maWdJRFgKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHBhcmFtICBDb25maWd1cmF0aW9uIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBjb21iaW5hdGlvbiBvZiBhbGwgdGhlCisgKiBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lOREVYX1VQIG9yIEByZWYgTExfVElNX0lOREVYX0RPV04gb3IgQHJlZgorICogTExfVElNX0lOREVYX1VQX0RPV04KKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JTkRFWF9BTEwgb3IgQHJlZiBMTF9USU1fSU5ERVhfRklSU1RfT05MWQorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lOREVYX1BPU0lUSU9OX0RPV05fRE9XTiBvciAuLi4gb3IgQHJlZgorICogTExfVElNX0lOREVYX1BPU0lUSU9OX1VQCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NvbmZpZ0lEWChUSU1fVHlwZURlZiAqVElNeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ29uZmlndXJhdGlvbikgeworICBNT0RJRllfUkVHKFRJTXgtPkVDUiwgVElNX0VDUl9JRElSIHwgVElNX0VDUl9GSURYIHwgVElNX0VDUl9JUE9TLAorICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24pOworfQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUZfVGltZXJfSW5wdXRzX1JlbWFwcGluZyBUaW1lciBpbnB1dCByZW1hcHBpbmcKKyAqIEB7CisgKi8KKy8qKgorICogQGJyaWVmICBSZW1hcCBUSU0gaW5wdXRzIChpbnB1dCBjaGFubmVsLCBpbnRlcm5hbC9leHRlcm5hbCB0cmlnZ2VycykuCisgKiBAbm90ZSBNYWNybyBJU19USU1fUkVNQVBfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAqICAgICAgIGEgc29tZSB0aW1lciBpbnB1dHMgY2FuIGJlIHJlbWFwcGVkLgorICogQHJtdG9sbCBUSU0xX1RJU0VMICAgIFRJMVNFTCAgICAgIExMX1RJTV9TZXRSZW1hcFxuCisgKiAgICAgICAgIFRJTTJfVElTRUwgICAgVEkxU0VMICAgICAgTExfVElNX1NldFJlbWFwXG4KKyAqICAgICAgICAgVElNMl9USVNFTCAgICBUSTJTRUwgICAgICBMTF9USU1fU2V0UmVtYXBcbgorICogICAgICAgICBUSU0yX1RJU0VMICAgIFRJM1NFTCAgICAgIExMX1RJTV9TZXRSZW1hcFxuCisgKiAgICAgICAgIFRJTTJfVElTRUwgICAgVEk0U0VMICAgICAgTExfVElNX1NldFJlbWFwXG4KKyAqICAgICAgICAgVElNM19USVNFTCAgICBUSTFTRUwgICAgICBMTF9USU1fU2V0UmVtYXBcbgorICogICAgICAgICBUSU0zX1RJU0VMICAgIFRJMlNFTCAgICAgIExMX1RJTV9TZXRSZW1hcFxuCisgKiAgICAgICAgIFRJTTNfVElTRUwgICAgVEkzU0VMICAgICAgTExfVElNX1NldFJlbWFwXG4KKyAqICAgICAgICAgVElNNF9USVNFTCAgICBUSTFTRUwgICAgICBMTF9USU1fU2V0UmVtYXBcbgorICogICAgICAgICBUSU00X1RJU0VMICAgIFRJMlNFTCAgICAgIExMX1RJTV9TZXRSZW1hcFxuCisgKiAgICAgICAgIFRJTTRfVElTRUwgICAgVEkzU0VMICAgICAgTExfVElNX1NldFJlbWFwXG4KKyAqICAgICAgICAgVElNNF9USVNFTCAgICBUSTRTRUwgICAgICBMTF9USU1fU2V0UmVtYXBcbgorICogICAgICAgICBUSU01X1RJU0VMICAgIFRJMVNFTCAgICAgIExMX1RJTV9TZXRSZW1hcFxuCisgKiAgICAgICAgIFRJTTVfVElTRUwgICAgVEkyU0VMICAgICAgTExfVElNX1NldFJlbWFwXG4KKyAqICAgICAgICAgVElNOF9USVNFTCAgICBUSTFTRUwgICAgICBMTF9USU1fU2V0UmVtYXBcbgorICogICAgICAgICBUSU0xNV9USVNFTCAgIFRJMVNFTCAgICAgIExMX1RJTV9TZXRSZW1hcFxuCisgKiAgICAgICAgIFRJTTE1X1RJU0VMICAgVEkyU0VMICAgICAgTExfVElNX1NldFJlbWFwXG4KKyAqICAgICAgICAgVElNMTZfVElTRUwgICBUSTFTRUwgICAgICBMTF9USU1fU2V0UmVtYXBcbgorICogICAgICAgICBUSU0xN19USVNFTCAgIFRJMVNFTCAgICAgIExMX1RJTV9TZXRSZW1hcFxuCisgKiAgICAgICAgIFRJTTIwX1RJU0VMICAgVEkxU0VMICAgICAgTExfVElNX1NldFJlbWFwCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEBwYXJhbSAgUmVtYXAgUmVtYXAgcGFyYW0gZGVwZW5kcyBvbiB0aGUgVElNeC4gRGVzY3JpcHRpb24gYXZhaWxhYmxlIG9ubHkKKyAqICAgICAgICAgaW4gQ0hNIHZlcnNpb24gb2YgdGhlIFVzZXIgTWFudWFsIChub3QgaW4gLnBkZikuCisgKiAgICAgICAgIE90aGVyd2lzZSBzZWUgUmVmZXJlbmNlIE1hbnVhbCBkZXNjcmlwdGlvbiBvZiBUSVNFTCByZWdpc3RlcnMuCisgKgorICogICAgICAgICBCZWxvdyBkZXNjcmlwdGlvbiBzdW1tYXJpemVzICJUaW1lciBJbnN0YW5jZSIgYW5kICJSZW1hcCIgcGFyYW0KKyAqIGNvbWJpbmF0aW9uczoKKyAqCisgKiAgICAgICAgIFRJTTE6IG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcworICoKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0xX1RJMV9STVBfR1BJTworICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTFfVEkxX1JNUF9DT01QMQorICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTFfVEkxX1JNUF9DT01QMgorICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTFfVEkxX1JNUF9DT01QMworICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTFfVEkxX1JNUF9DT01QNAorICoKKyAqICAgICAgICAgVElNMjogYW55IGNvbWJpbmF0aW9uIG9mIFRJMV9STVAsIFRJMl9STVAsIFRJM19STVAgYW5kIFRJNF9STVAgd2hlcmUKKyAqCisgKiAgICAgICAgICAgIC4gLiBUSTFfUk1QIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0yX1RJMV9STVBfR1BJTworICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTJfVEkxX1JNUF9DT01QMQorICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTJfVEkxX1JNUF9DT01QMgorICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTJfVEkxX1JNUF9DT01QMworICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTJfVEkxX1JNUF9DT01QNAorICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTJfVEkxX1JNUF9DT01QNSAoKikKKyAqCisgKiAgICAgICAgICAgIC4gLiBUSTJfUk1QIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0yX1RJMl9STVBfR1BJTworICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTJfVEkyX1JNUF9DT01QMQorICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTJfVEkyX1JNUF9DT01QMgorICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTJfVEkyX1JNUF9DT01QMworICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTJfVEkyX1JNUF9DT01QNAorICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTJfVEkyX1JNUF9DT01QNiAoKikKKyAqCisgKiAgICAgICAgICAgIC4gLiBUSTNfUk1QIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0yX1RJM19STVBfR1BJTworICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTJfVEkzX1JNUF9DT01QNAorICoKKyAqICAgICAgICAgICAgLiAuIFRJNF9STVAgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcworICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTJfVEk0X1JNUF9HUElPCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMl9USTRfUk1QX0NPTVAxCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMl9USTRfUk1QX0NPTVAyCisgKgorICogICAgICAgICBUSU0zOiBhbnkgY29tYmluYXRpb24gb2YgVEkxX1JNUCBhbmQgVEkyX1JNUCB3aGVyZQorICoKKyAqICAgICAgICAgICAgLiAuIFRJMV9STVAgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcworICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTNfVEkxX1JNUF9HUElPCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNM19USTFfUk1QX0NPTVAxCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNM19USTFfUk1QX0NPTVAyCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNM19USTFfUk1QX0NPTVAzCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNM19USTFfUk1QX0NPTVA0CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNM19USTFfUk1QX0NPTVA1ICgqKQorICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTNfVEkxX1JNUF9DT01QNiAoKikKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0zX1RJMV9STVBfQ09NUDcgKCopCisgKgorICogICAgICAgICAgICAuIC4gVEkyX1JNUCBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNM19USTJfUk1QX0dQSU8KKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0zX1RJMl9STVBfQ09NUDEKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0zX1RJMl9STVBfQ09NUDIKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0zX1RJMl9STVBfQ09NUDMKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0zX1RJMl9STVBfQ09NUDQKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0zX1RJMl9STVBfQ09NUDUgKCopCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNM19USTJfUk1QX0NPTVA2ICgqKQorICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTNfVEkyX1JNUF9DT01QNyAoKikKKyAqCisgKiAgICAgICAgICAgIC4gLiBUSTNfUk1QIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0zX1RJM19STVBfR1BJTworICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTNfVEkzX1JNUF9DT01QMworICoKKyAqICAgICAgICAgVElNNDogYW55IGNvbWJpbmF0aW9uIG9mIFRJMV9STVAsIFRJMl9STVAsIFRJM19STVAgYW5kIFRJNF9STVAgd2hlcmUKKyAqCisgKiAgICAgICAgICAgIC4gLiBUSTFfUk1QIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU00X1RJMV9STVBfR1BJTworICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTRfVEkxX1JNUF9DT01QMQorICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTRfVEkxX1JNUF9DT01QMgorICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTRfVEkxX1JNUF9DT01QMworICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTRfVEkxX1JNUF9DT01QNAorICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTRfVEkxX1JNUF9DT01QNSAoKikKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU00X1RJMV9STVBfQ09NUDYgKCopCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNNF9USTFfUk1QX0NPTVA3ICgqKQorICoKKyAqICAgICAgICAgICAgLiAuIFRJMl9STVAgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcworICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTRfVEkyX1JNUF9HUElPCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNNF9USTJfUk1QX0NPTVAxCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNNF9USTJfUk1QX0NPTVAyCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNNF9USTJfUk1QX0NPTVAzCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNNF9USTJfUk1QX0NPTVA0CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNNF9USTJfUk1QX0NPTVA1ICgqKQorICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTRfVEkyX1JNUF9DT01QNiAoKikKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU00X1RJMl9STVBfQ09NUDcgKCopCisgKgorICogICAgICAgICAgICAuIC4gVEkzX1JNUCBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNNF9USTNfUk1QX0dQSU8KKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU00X1RJM19STVBfQ09NUDUgKCopCisgKgorICogICAgICAgICAgICAuIC4gVEk0X1JNUCBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNNF9USTRfUk1QX0dQSU8KKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU00X1RJNF9STVBfQ09NUDYgKCopCisgKgorICogICAgICAgICBUSU01OiBhbnkgY29tYmluYXRpb24gb2YgVEkxX1JNUCBhbmQgVEkyX1JNUCB3aGVyZSAoKiopCisgKgorICogICAgICAgICAgICAuIC4gVEkxX1JNUCBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNNV9USTFfUk1QX0dQSU8gICAoKikKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU01X1RJMV9STVBfTFNJICAgICgqKQorICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTVfVEkxX1JNUF9MU0UgICAgKCopCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNNV9USTFfUk1QX1JUQ19XSyAoKikKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU01X1RJMV9STVBfQ09NUDEgICgqKQorICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTVfVEkxX1JNUF9DT01QMiAgKCopCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNNV9USTFfUk1QX0NPTVAzICAoKikKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU01X1RJMV9STVBfQ09NUDQgICgqKQorICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTVfVEkxX1JNUF9DT01QNSAgKCopCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNNV9USTFfUk1QX0NPTVA2ICAoKikKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU01X1RJMV9STVBfQ09NUDcgICgqKQorICoKKyAqICAgICAgICAgICAgLiAuIFRJMl9STVAgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcworICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTVfVEkyX1JNUF9HUElPICAoKikKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU01X1RJMl9STVBfQ09NUDEgKCopCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNNV9USTJfUk1QX0NPTVAyICgqKQorICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTVfVEkyX1JNUF9DT01QMyAoKikKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU01X1RJMl9STVBfQ09NUDQgKCopCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNNV9USTJfUk1QX0NPTVA1ICgqKQorICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTVfVEkyX1JNUF9DT01QNiAoKikKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU01X1RJMl9STVBfQ09NUDcgKCopCisgKgorICogICAgICAgICBUSU04OiBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMKKyAqCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNOF9USTFfUk1QX0dQSU8KKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU04X1RJMV9STVBfQ09NUDEKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU04X1RJMV9STVBfQ09NUDIKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU04X1RJMV9STVBfQ09NUDMKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU04X1RJMV9STVBfQ09NUDQKKyAqCisgKiAgICAgICAgIFRJTTE1OiBhbnkgY29tYmluYXRpb24gb2YgVEkxX1JNUCBhbmQgVEkyX1JNUCB3aGVyZQorICoKKyAqICAgICAgICAgICAgLiAuIFRJMV9STVAgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcworICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTE1X1RJMV9STVBfR1BJTworICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTE1X1RJMV9STVBfTFNFCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMTVfVEkxX1JNUF9DT01QMQorICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTE1X1RJMV9STVBfQ09NUDIKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0xNV9USTFfUk1QX0NPTVA1ICgqKQorICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTE1X1RJMV9STVBfQ09NUDcgKCopCisgKgorICogICAgICAgICAgICAuIC4gVEkyX1JNUCBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMTVfVEkyX1JNUF9HUElPCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMTVfVEkyX1JNUF9DT01QMgorICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTE1X1RJMl9STVBfQ09NUDMKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0xNV9USTJfUk1QX0NPTVA2ICgqKQorICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTE1X1RJMl9STVBfQ09NUDcgKCopCisgKgorICogICAgICAgICBUSU0xNjogb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzCisgKgorICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTE2X1RJMV9STVBfR1BJTworICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTE2X1RJMV9STVBfQ09NUDYgKCopCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMTZfVEkxX1JNUF9NQ08KKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0xNl9USTFfUk1QX0hTRV8zMgorICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTE2X1RJMV9STVBfUlRDX1dLCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMTZfVEkxX1JNUF9MU0UKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0xNl9USTFfUk1QX0xTSQorICoKKyAqICAgICAgICAgVElNMTc6IG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcworICoKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0xN19USTFfUk1QX0dQSU8KKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0xN19USTFfUk1QX0NPTVA1ICgqKQorICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTE3X1RJMV9STVBfTUNPCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMTdfVEkxX1JNUF9IU0VfMzIKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0xN19USTFfUk1QX1JUQ19XSworICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTE3X1RJMV9STVBfTFNFCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMTdfVEkxX1JNUF9MU0kKKyAqCisgKiAgICAgICAgIFRJTTIwOiBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMgKCoqKQorICoKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0yMF9USTFfUk1QX0dQSU8gICgqKQorICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTIwX1RJMV9STVBfQ09NUDEgKCopCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMjBfVEkxX1JNUF9DT01QMiAoKikKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0yMF9USTFfUk1QX0NPTVAzICgqKQorICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTIwX1RJMV9STVBfQ09NUDQgKCopCisgKgorICogICAgICAgICAoKikgIFZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLiBcbgorICogICAgICAgICAoKiopIFJlZ2lzdGVyIG5vdCBhdmFpbGFibGUgaW4gYWxsIGRldmljZXMuCisgKgorICoKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fU2V0UmVtYXAoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IFJlbWFwKSB7CisgIE1PRElGWV9SRUcoVElNeC0+VElTRUwsCisgICAgICAgICAgICAgKFRJTV9USVNFTF9USTFTRUwgfCBUSU1fVElTRUxfVEkyU0VMIHwgVElNX1RJU0VMX1RJM1NFTCB8CisgICAgICAgICAgICAgIFRJTV9USVNFTF9USTRTRUwpLAorICAgICAgICAgICAgIFJlbWFwKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSByZXF1ZXN0IGZvciBIU0UvMzIgY2xvY2sgdXNlZCBmb3IgVElTRUwgcmVtYXAuCisgKiBAbm90ZSBPbmx5IFRJTTE2IGFuZCBUSU0xNyBzdXBwb3J0IEhTRS8zMiByZW1hcAorICogQHJtdG9sbCBPUiAgICAgICAgIEhTRTMyRU4gICAgICAgICAgIExMX1RJTV9FbmFibGVIU0UzMgorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZUhTRTMyKFRJTV9UeXBlRGVmICpUSU14KSB7CisgIFNFVF9CSVQoVElNeC0+T1IsIFRJTV9PUl9IU0UzMkVOKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgcmVxdWVzdCBmb3IgSFNFLzMyIGNsb2NrIHVzZWQgZm9yIFRJU0VMIHJlbWFwLgorICogQG5vdGUgT25seSBUSU0xNiBhbmQgVElNMTcgc3VwcG9ydCBIU0UvMzIgcmVtYXAKKyAqIEBybXRvbGwgT1IgICAgICAgICBIU0UzMkVOICAgICAgICAgICBMTF9USU1fRGlzYWJsZUhTRTMyCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZUhTRTMyKFRJTV9UeXBlRGVmICpUSU14KSB7CisgIENMRUFSX0JJVChUSU14LT5PUiwgVElNX09SX0hTRTMyRU4pOworfQorCisvKioKKyAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciByZXF1ZXN0IGZvciBIU0UvMzIgY2xvY2sgaXMgZW5hYmxlZC4KKyAqIEBub3RlIE9ubHkgVElNMTYgYW5kIFRJTTE3IHN1cHBvcnQgSFNFLzMyIHJlbWFwCisgKiBAcm10b2xsIE9SICAgICAgICAgSFNFMzJFTiAgICAgICAgICAgTExfVElNX0lzRW5hYmxlZEhTRTMyCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzRW5hYmxlZEhTRTMyKGNvbnN0IFRJTV9UeXBlRGVmICpUSU14KSB7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPk9SLCBUSU1fT1JfSFNFMzJFTikgPT0gKFRJTV9PUl9IU0UzMkVOKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUZfT0NSRUZfQ2xlYXIgT0NSRUZfQ2xlYXJfTWFuYWdlbWVudAorICogQHsKKyAqLworLyoqCisgKiBAYnJpZWYgIFNldCB0aGUgT0NSRUYgY2xlYXIgaW5wdXQgc291cmNlCisgKiBAbm90ZSBUaGUgT0N4UkVGIHNpZ25hbCBvZiBhIGdpdmVuIGNoYW5uZWwgY2FuIGJlIGNsZWFyZWQgd2hlbiBhIGhpZ2ggbGV2ZWwKKyAqIGlzIGFwcGxpZWQgb24gdGhlIE9DUkVGX0NMUl9JTlBVVAorICogQG5vdGUgVGhpcyBmdW5jdGlvbiBjYW4gb25seSBiZSB1c2VkIGluIE91dHB1dCBjb21wYXJlIGFuZCBQV00gbW9kZXMuCisgKiBAbm90ZSBNYWNybyBJU19USU1fT0NDU19JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyCisgKiAgICAgICBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBjYW4gY29uZmlndXJlIE9DUkVGIGNsZWFyIGlucHV0IHNvdXJjZS4KKyAqIEBybXRvbGwgU01DUiAgICAgICAgICBPQ0NTICAgICAgICAgICAgICAgIExMX1RJTV9TZXRPQ1JlZkNsZWFySW5wdXRTb3VyY2UKKyAqIEBybXRvbGwgQUYyICAgICAgICAgICBPQ1JTRUwgICAgICAgICAgICAgIExMX1RJTV9TZXRPQ1JlZkNsZWFySW5wdXRTb3VyY2UKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHBhcmFtICBPQ1JlZkNsZWFySW5wdXRTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nCisgKiB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NSRUZfQ0xSX0lOVF9FVFIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ1JFRl9DTFJfSU5UX0NPTVAxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NSRUZfQ0xSX0lOVF9DT01QMgorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DUkVGX0NMUl9JTlRfQ09NUDMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ1JFRl9DTFJfSU5UX0NPTVA0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NSRUZfQ0xSX0lOVF9DT01QNSAoKikKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ1JFRl9DTFJfSU5UX0NPTVA2ICgqKQorICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DUkVGX0NMUl9JTlRfQ09NUDcgKCopCisgKgorICogICAgICAgICAoKikgIFZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLiBcbgorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9TZXRPQ1JlZkNsZWFySW5wdXRTb3VyY2UoCisgICAgVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IE9DUmVmQ2xlYXJJbnB1dFNvdXJjZSkgeworICBNT0RJRllfUkVHKFRJTXgtPlNNQ1IsIFRJTV9TTUNSX09DQ1MsCisgICAgICAgICAgICAgKChPQ1JlZkNsZWFySW5wdXRTb3VyY2UgJiBPQ1JFRl9DTEVBUl9TRUxFQ1RfTXNrKSA+PgorICAgICAgICAgICAgICBPQ1JFRl9DTEVBUl9TRUxFQ1RfUG9zKQorICAgICAgICAgICAgICAgICA8PCBUSU1fU01DUl9PQ0NTX1Bvcyk7CisgIE1PRElGWV9SRUcoVElNeC0+QUYyLCBUSU0xX0FGMl9PQ1JTRUwsIE9DUmVmQ2xlYXJJbnB1dFNvdXJjZSk7Cit9CisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUZfRkxBR19NYW5hZ2VtZW50IEZMQUctTWFuYWdlbWVudAorICogQHsKKyAqLworLyoqCisgKiBAYnJpZWYgIENsZWFyIHRoZSB1cGRhdGUgaW50ZXJydXB0IGZsYWcgKFVJRikuCisgKiBAcm10b2xsIFNSICAgICAgICAgICBVSUYgICAgICAgICAgIExMX1RJTV9DbGVhckZsYWdfVVBEQVRFCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ2xlYXJGbGFnX1VQREFURShUSU1fVHlwZURlZiAqVElNeCkgeworICBXUklURV9SRUcoVElNeC0+U1IsIH4oVElNX1NSX1VJRikpOworfQorCisvKioKKyAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciB1cGRhdGUgaW50ZXJydXB0IGZsYWcgKFVJRikgaXMgc2V0ICh1cGRhdGUgaW50ZXJydXB0CisgKiBpcyBwZW5kaW5nKS4KKyAqIEBybXRvbGwgU1IgICAgICAgICAgIFVJRiAgICAgICAgICAgTExfVElNX0lzQWN0aXZlRmxhZ19VUERBVEUKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNBY3RpdmVGbGFnX1VQREFURShjb25zdCBUSU1fVHlwZURlZiAqVElNeCkgeworICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5TUiwgVElNX1NSX1VJRikgPT0gKFRJTV9TUl9VSUYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDbGVhciB0aGUgQ2FwdHVyZS9Db21wYXJlIDEgaW50ZXJydXB0IGZsYWcgKENDMUYpLgorICogQHJtdG9sbCBTUiAgICAgICAgICAgQ0MxSUYgICAgICAgICBMTF9USU1fQ2xlYXJGbGFnX0NDMQorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NsZWFyRmxhZ19DQzEoVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgV1JJVEVfUkVHKFRJTXgtPlNSLCB+KFRJTV9TUl9DQzFJRikpOworfQorCisvKioKKyAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciBDYXB0dXJlL0NvbXBhcmUgMSBpbnRlcnJ1cHQgZmxhZyAoQ0MxRikgaXMgc2V0CisgKiAoQ2FwdHVyZS9Db21wYXJlIDEgaW50ZXJydXB0IGlzIHBlbmRpbmcpLgorICogQHJtdG9sbCBTUiAgICAgICAgICAgQ0MxSUYgICAgICAgICBMTF9USU1fSXNBY3RpdmVGbGFnX0NDMQorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0FjdGl2ZUZsYWdfQ0MxKGNvbnN0IFRJTV9UeXBlRGVmICpUSU14KSB7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPlNSLCBUSU1fU1JfQ0MxSUYpID09IChUSU1fU1JfQ0MxSUYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDbGVhciB0aGUgQ2FwdHVyZS9Db21wYXJlIDIgaW50ZXJydXB0IGZsYWcgKENDMkYpLgorICogQHJtdG9sbCBTUiAgICAgICAgICAgQ0MySUYgICAgICAgICBMTF9USU1fQ2xlYXJGbGFnX0NDMgorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NsZWFyRmxhZ19DQzIoVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgV1JJVEVfUkVHKFRJTXgtPlNSLCB+KFRJTV9TUl9DQzJJRikpOworfQorCisvKioKKyAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciBDYXB0dXJlL0NvbXBhcmUgMiBpbnRlcnJ1cHQgZmxhZyAoQ0MyRikgaXMgc2V0CisgKiAoQ2FwdHVyZS9Db21wYXJlIDIgaW50ZXJydXB0IGlzIHBlbmRpbmcpLgorICogQHJtdG9sbCBTUiAgICAgICAgICAgQ0MySUYgICAgICAgICBMTF9USU1fSXNBY3RpdmVGbGFnX0NDMgorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0FjdGl2ZUZsYWdfQ0MyKGNvbnN0IFRJTV9UeXBlRGVmICpUSU14KSB7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPlNSLCBUSU1fU1JfQ0MySUYpID09IChUSU1fU1JfQ0MySUYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDbGVhciB0aGUgQ2FwdHVyZS9Db21wYXJlIDMgaW50ZXJydXB0IGZsYWcgKENDM0YpLgorICogQHJtdG9sbCBTUiAgICAgICAgICAgQ0MzSUYgICAgICAgICBMTF9USU1fQ2xlYXJGbGFnX0NDMworICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NsZWFyRmxhZ19DQzMoVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgV1JJVEVfUkVHKFRJTXgtPlNSLCB+KFRJTV9TUl9DQzNJRikpOworfQorCisvKioKKyAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciBDYXB0dXJlL0NvbXBhcmUgMyBpbnRlcnJ1cHQgZmxhZyAoQ0MzRikgaXMgc2V0CisgKiAoQ2FwdHVyZS9Db21wYXJlIDMgaW50ZXJydXB0IGlzIHBlbmRpbmcpLgorICogQHJtdG9sbCBTUiAgICAgICAgICAgQ0MzSUYgICAgICAgICBMTF9USU1fSXNBY3RpdmVGbGFnX0NDMworICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0FjdGl2ZUZsYWdfQ0MzKGNvbnN0IFRJTV9UeXBlRGVmICpUSU14KSB7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPlNSLCBUSU1fU1JfQ0MzSUYpID09IChUSU1fU1JfQ0MzSUYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDbGVhciB0aGUgQ2FwdHVyZS9Db21wYXJlIDQgaW50ZXJydXB0IGZsYWcgKENDNEYpLgorICogQHJtdG9sbCBTUiAgICAgICAgICAgQ0M0SUYgICAgICAgICBMTF9USU1fQ2xlYXJGbGFnX0NDNAorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NsZWFyRmxhZ19DQzQoVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgV1JJVEVfUkVHKFRJTXgtPlNSLCB+KFRJTV9TUl9DQzRJRikpOworfQorCisvKioKKyAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciBDYXB0dXJlL0NvbXBhcmUgNCBpbnRlcnJ1cHQgZmxhZyAoQ0M0RikgaXMgc2V0CisgKiAoQ2FwdHVyZS9Db21wYXJlIDQgaW50ZXJydXB0IGlzIHBlbmRpbmcpLgorICogQHJtdG9sbCBTUiAgICAgICAgICAgQ0M0SUYgICAgICAgICBMTF9USU1fSXNBY3RpdmVGbGFnX0NDNAorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0FjdGl2ZUZsYWdfQ0M0KGNvbnN0IFRJTV9UeXBlRGVmICpUSU14KSB7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPlNSLCBUSU1fU1JfQ0M0SUYpID09IChUSU1fU1JfQ0M0SUYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDbGVhciB0aGUgQ2FwdHVyZS9Db21wYXJlIDUgaW50ZXJydXB0IGZsYWcgKENDNUYpLgorICogQHJtdG9sbCBTUiAgICAgICAgICAgQ0M1SUYgICAgICAgICBMTF9USU1fQ2xlYXJGbGFnX0NDNQorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NsZWFyRmxhZ19DQzUoVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgV1JJVEVfUkVHKFRJTXgtPlNSLCB+KFRJTV9TUl9DQzVJRikpOworfQorCisvKioKKyAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciBDYXB0dXJlL0NvbXBhcmUgNSBpbnRlcnJ1cHQgZmxhZyAoQ0M1RikgaXMgc2V0CisgKiAoQ2FwdHVyZS9Db21wYXJlIDUgaW50ZXJydXB0IGlzIHBlbmRpbmcpLgorICogQHJtdG9sbCBTUiAgICAgICAgICAgQ0M1SUYgICAgICAgICBMTF9USU1fSXNBY3RpdmVGbGFnX0NDNQorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0FjdGl2ZUZsYWdfQ0M1KGNvbnN0IFRJTV9UeXBlRGVmICpUSU14KSB7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPlNSLCBUSU1fU1JfQ0M1SUYpID09IChUSU1fU1JfQ0M1SUYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDbGVhciB0aGUgQ2FwdHVyZS9Db21wYXJlIDYgaW50ZXJydXB0IGZsYWcgKENDNkYpLgorICogQHJtdG9sbCBTUiAgICAgICAgICAgQ0M2SUYgICAgICAgICBMTF9USU1fQ2xlYXJGbGFnX0NDNgorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NsZWFyRmxhZ19DQzYoVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgV1JJVEVfUkVHKFRJTXgtPlNSLCB+KFRJTV9TUl9DQzZJRikpOworfQorCisvKioKKyAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciBDYXB0dXJlL0NvbXBhcmUgNiBpbnRlcnJ1cHQgZmxhZyAoQ0M2RikgaXMgc2V0CisgKiAoQ2FwdHVyZS9Db21wYXJlIDYgaW50ZXJydXB0IGlzIHBlbmRpbmcpLgorICogQHJtdG9sbCBTUiAgICAgICAgICAgQ0M2SUYgICAgICAgICBMTF9USU1fSXNBY3RpdmVGbGFnX0NDNgorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0FjdGl2ZUZsYWdfQ0M2KGNvbnN0IFRJTV9UeXBlRGVmICpUSU14KSB7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPlNSLCBUSU1fU1JfQ0M2SUYpID09IChUSU1fU1JfQ0M2SUYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDbGVhciB0aGUgY29tbXV0YXRpb24gaW50ZXJydXB0IGZsYWcgKENPTUlGKS4KKyAqIEBybXRvbGwgU1IgICAgICAgICAgIENPTUlGICAgICAgICAgTExfVElNX0NsZWFyRmxhZ19DT00KKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9DbGVhckZsYWdfQ09NKFRJTV9UeXBlRGVmICpUSU14KSB7CisgIFdSSVRFX1JFRyhUSU14LT5TUiwgfihUSU1fU1JfQ09NSUYpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgY29tbXV0YXRpb24gaW50ZXJydXB0IGZsYWcgKENPTUlGKSBpcyBzZXQKKyAqIChjb21tdXRhdGlvbiBpbnRlcnJ1cHQgaXMgcGVuZGluZykuCisgKiBAcm10b2xsIFNSICAgICAgICAgICBDT01JRiAgICAgICAgIExMX1RJTV9Jc0FjdGl2ZUZsYWdfQ09NCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzQWN0aXZlRmxhZ19DT00oY29uc3QgVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+U1IsIFRJTV9TUl9DT01JRikgPT0gKFRJTV9TUl9DT01JRikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENsZWFyIHRoZSB0cmlnZ2VyIGludGVycnVwdCBmbGFnIChUSUYpLgorICogQHJtdG9sbCBTUiAgICAgICAgICAgVElGICAgICAgICAgICBMTF9USU1fQ2xlYXJGbGFnX1RSSUcKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9DbGVhckZsYWdfVFJJRyhUSU1fVHlwZURlZiAqVElNeCkgeworICBXUklURV9SRUcoVElNeC0+U1IsIH4oVElNX1NSX1RJRikpOworfQorCisvKioKKyAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciB0cmlnZ2VyIGludGVycnVwdCBmbGFnIChUSUYpIGlzIHNldCAodHJpZ2dlcgorICogaW50ZXJydXB0IGlzIHBlbmRpbmcpLgorICogQHJtdG9sbCBTUiAgICAgICAgICAgVElGICAgICAgICAgICBMTF9USU1fSXNBY3RpdmVGbGFnX1RSSUcKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNBY3RpdmVGbGFnX1RSSUcoY29uc3QgVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+U1IsIFRJTV9TUl9USUYpID09IChUSU1fU1JfVElGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgQ2xlYXIgdGhlIGJyZWFrIGludGVycnVwdCBmbGFnIChCSUYpLgorICogQHJtdG9sbCBTUiAgICAgICAgICAgQklGICAgICAgICAgICBMTF9USU1fQ2xlYXJGbGFnX0JSSworICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NsZWFyRmxhZ19CUksoVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgV1JJVEVfUkVHKFRJTXgtPlNSLCB+KFRJTV9TUl9CSUYpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgYnJlYWsgaW50ZXJydXB0IGZsYWcgKEJJRikgaXMgc2V0IChicmVhayBpbnRlcnJ1cHQKKyAqIGlzIHBlbmRpbmcpLgorICogQHJtdG9sbCBTUiAgICAgICAgICAgQklGICAgICAgICAgICBMTF9USU1fSXNBY3RpdmVGbGFnX0JSSworICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0FjdGl2ZUZsYWdfQlJLKGNvbnN0IFRJTV9UeXBlRGVmICpUSU14KSB7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPlNSLCBUSU1fU1JfQklGKSA9PSAoVElNX1NSX0JJRikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENsZWFyIHRoZSBicmVhayAyIGludGVycnVwdCBmbGFnIChCMklGKS4KKyAqIEBybXRvbGwgU1IgICAgICAgICAgIEIySUYgICAgICAgICAgTExfVElNX0NsZWFyRmxhZ19CUksyCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ2xlYXJGbGFnX0JSSzIoVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgV1JJVEVfUkVHKFRJTXgtPlNSLCB+KFRJTV9TUl9CMklGKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIGJyZWFrIDIgaW50ZXJydXB0IGZsYWcgKEIySUYpIGlzIHNldCAoYnJlYWsgMgorICogaW50ZXJydXB0IGlzIHBlbmRpbmcpLgorICogQHJtdG9sbCBTUiAgICAgICAgICAgQjJJRiAgICAgICAgICBMTF9USU1fSXNBY3RpdmVGbGFnX0JSSzIKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNBY3RpdmVGbGFnX0JSSzIoY29uc3QgVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+U1IsIFRJTV9TUl9CMklGKSA9PSAoVElNX1NSX0IySUYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDbGVhciB0aGUgQ2FwdHVyZS9Db21wYXJlIDEgb3Zlci1jYXB0dXJlIGludGVycnVwdCBmbGFnIChDQzFPRikuCisgKiBAcm10b2xsIFNSICAgICAgICAgICBDQzFPRiAgICAgICAgIExMX1RJTV9DbGVhckZsYWdfQ0MxT1ZSCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ2xlYXJGbGFnX0NDMU9WUihUSU1fVHlwZURlZiAqVElNeCkgeworICBXUklURV9SRUcoVElNeC0+U1IsIH4oVElNX1NSX0NDMU9GKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIENhcHR1cmUvQ29tcGFyZSAxIG92ZXItY2FwdHVyZSBpbnRlcnJ1cHQgZmxhZworICogKENDMU9GKSBpcyBzZXQgKENhcHR1cmUvQ29tcGFyZSAxIGludGVycnVwdCBpcyBwZW5kaW5nKS4KKyAqIEBybXRvbGwgU1IgICAgICAgICAgIENDMU9GICAgICAgICAgTExfVElNX0lzQWN0aXZlRmxhZ19DQzFPVlIKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNBY3RpdmVGbGFnX0NDMU9WUihjb25zdCBUSU1fVHlwZURlZiAqVElNeCkgeworICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5TUiwgVElNX1NSX0NDMU9GKSA9PSAoVElNX1NSX0NDMU9GKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgQ2xlYXIgdGhlIENhcHR1cmUvQ29tcGFyZSAyIG92ZXItY2FwdHVyZSBpbnRlcnJ1cHQgZmxhZyAoQ0MyT0YpLgorICogQHJtdG9sbCBTUiAgICAgICAgICAgQ0MyT0YgICAgICAgICBMTF9USU1fQ2xlYXJGbGFnX0NDMk9WUgorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NsZWFyRmxhZ19DQzJPVlIoVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgV1JJVEVfUkVHKFRJTXgtPlNSLCB+KFRJTV9TUl9DQzJPRikpOworfQorCisvKioKKyAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciBDYXB0dXJlL0NvbXBhcmUgMiBvdmVyLWNhcHR1cmUgaW50ZXJydXB0IGZsYWcKKyAqIChDQzJPRikgaXMgc2V0IChDYXB0dXJlL0NvbXBhcmUgMiBvdmVyLWNhcHR1cmUgaW50ZXJydXB0IGlzIHBlbmRpbmcpLgorICogQHJtdG9sbCBTUiAgICAgICAgICAgQ0MyT0YgICAgICAgICBMTF9USU1fSXNBY3RpdmVGbGFnX0NDMk9WUgorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0FjdGl2ZUZsYWdfQ0MyT1ZSKGNvbnN0IFRJTV9UeXBlRGVmICpUSU14KSB7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPlNSLCBUSU1fU1JfQ0MyT0YpID09IChUSU1fU1JfQ0MyT0YpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDbGVhciB0aGUgQ2FwdHVyZS9Db21wYXJlIDMgb3Zlci1jYXB0dXJlIGludGVycnVwdCBmbGFnIChDQzNPRikuCisgKiBAcm10b2xsIFNSICAgICAgICAgICBDQzNPRiAgICAgICAgIExMX1RJTV9DbGVhckZsYWdfQ0MzT1ZSCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ2xlYXJGbGFnX0NDM09WUihUSU1fVHlwZURlZiAqVElNeCkgeworICBXUklURV9SRUcoVElNeC0+U1IsIH4oVElNX1NSX0NDM09GKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIENhcHR1cmUvQ29tcGFyZSAzIG92ZXItY2FwdHVyZSBpbnRlcnJ1cHQgZmxhZworICogKENDM09GKSBpcyBzZXQgKENhcHR1cmUvQ29tcGFyZSAzIG92ZXItY2FwdHVyZSBpbnRlcnJ1cHQgaXMgcGVuZGluZykuCisgKiBAcm10b2xsIFNSICAgICAgICAgICBDQzNPRiAgICAgICAgIExMX1RJTV9Jc0FjdGl2ZUZsYWdfQ0MzT1ZSCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzQWN0aXZlRmxhZ19DQzNPVlIoY29uc3QgVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+U1IsIFRJTV9TUl9DQzNPRikgPT0gKFRJTV9TUl9DQzNPRikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENsZWFyIHRoZSBDYXB0dXJlL0NvbXBhcmUgNCBvdmVyLWNhcHR1cmUgaW50ZXJydXB0IGZsYWcgKENDNE9GKS4KKyAqIEBybXRvbGwgU1IgICAgICAgICAgIENDNE9GICAgICAgICAgTExfVElNX0NsZWFyRmxhZ19DQzRPVlIKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9DbGVhckZsYWdfQ0M0T1ZSKFRJTV9UeXBlRGVmICpUSU14KSB7CisgIFdSSVRFX1JFRyhUSU14LT5TUiwgfihUSU1fU1JfQ0M0T0YpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgQ2FwdHVyZS9Db21wYXJlIDQgb3Zlci1jYXB0dXJlIGludGVycnVwdCBmbGFnCisgKiAoQ0M0T0YpIGlzIHNldCAoQ2FwdHVyZS9Db21wYXJlIDQgb3Zlci1jYXB0dXJlIGludGVycnVwdCBpcyBwZW5kaW5nKS4KKyAqIEBybXRvbGwgU1IgICAgICAgICAgIENDNE9GICAgICAgICAgTExfVElNX0lzQWN0aXZlRmxhZ19DQzRPVlIKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNBY3RpdmVGbGFnX0NDNE9WUihjb25zdCBUSU1fVHlwZURlZiAqVElNeCkgeworICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5TUiwgVElNX1NSX0NDNE9GKSA9PSAoVElNX1NSX0NDNE9GKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgQ2xlYXIgdGhlIHN5c3RlbSBicmVhayBpbnRlcnJ1cHQgZmxhZyAoU0JJRikuCisgKiBAcm10b2xsIFNSICAgICAgICAgICBTQklGICAgICAgICAgIExMX1RJTV9DbGVhckZsYWdfU1lTQlJLCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ2xlYXJGbGFnX1NZU0JSSyhUSU1fVHlwZURlZiAqVElNeCkgeworICBXUklURV9SRUcoVElNeC0+U1IsIH4oVElNX1NSX1NCSUYpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgc3lzdGVtIGJyZWFrIGludGVycnVwdCBmbGFnIChTQklGKSBpcyBzZXQgKHN5c3RlbQorICogYnJlYWsgaW50ZXJydXB0IGlzIHBlbmRpbmcpLgorICogQHJtdG9sbCBTUiAgICAgICAgICAgU0JJRiAgICAgICAgICBMTF9USU1fSXNBY3RpdmVGbGFnX1NZU0JSSworICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0FjdGl2ZUZsYWdfU1lTQlJLKGNvbnN0IFRJTV9UeXBlRGVmICpUSU14KSB7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPlNSLCBUSU1fU1JfU0JJRikgPT0gKFRJTV9TUl9TQklGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgQ2xlYXIgdGhlIHRyYW5zaXRpb24gZXJyb3IgaW50ZXJydXB0IGZsYWcgKFRFUlJGKS4KKyAqIEBub3RlIE1hY3JvIElTX1RJTV9FTkNPREVSX0VSUk9SX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIKKyAqIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGVuY29kZXIgZXJyb3IgbWFuYWdlbWVudC4KKyAqIEBybXRvbGwgU1IgICAgICAgICAgIFRFUlJGICAgICAgICAgICBMTF9USU1fQ2xlYXJGbGFnX1RFUlIKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9DbGVhckZsYWdfVEVSUihUSU1fVHlwZURlZiAqVElNeCkgeworICBXUklURV9SRUcoVElNeC0+U1IsIH4oVElNX1NSX1RFUlJGKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIHRyYW5zaXRpb24gZXJyb3IgaW50ZXJydXB0IGZsYWcgKFRFUlJGKSBpcyBzZXQKKyAqICh0cmFuc2l0aW9uIGVycm9yIGludGVycnVwdCBpcyBwZW5kaW5nKS4KKyAqIEBub3RlIE1hY3JvIElTX1RJTV9FTkNPREVSX0VSUk9SX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIKKyAqIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGVuY29kZXIgZXJyb3IgbWFuYWdlbWVudC4KKyAqIEBybXRvbGwgU1IgICAgICAgICAgIFRFUlJGICAgICAgICAgICBMTF9USU1fSXNBY3RpdmVGbGFnX1RFUlIKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNBY3RpdmVGbGFnX1RFUlIoY29uc3QgVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+U1IsIFRJTV9TUl9URVJSRikgPT0gKFRJTV9TUl9URVJSRikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENsZWFyIHRoZSBpbmRleCBlcnJvciBpbnRlcnJ1cHQgZmxhZyAoSUVSUkYpLgorICogQG5vdGUgTWFjcm8gSVNfVElNX0VOQ09ERVJfRVJST1JfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlcgorICogb3Igbm90IGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgZW5jb2RlciBlcnJvciBtYW5hZ2VtZW50LgorICogQHJtdG9sbCBTUiAgICAgICAgICAgSUVSUkYgICAgICAgICAgIExMX1RJTV9DbGVhckZsYWdfSUVSUgorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NsZWFyRmxhZ19JRVJSKFRJTV9UeXBlRGVmICpUSU14KSB7CisgIFdSSVRFX1JFRyhUSU14LT5TUiwgfihUSU1fU1JfSUVSUkYpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgaW5kZXggZXJyb3IgaW50ZXJydXB0IGZsYWcgKElFUlJGKSBpcyBzZXQgKGluZGV4CisgKiBlcnJvciBpbnRlcnJ1cHQgaXMgcGVuZGluZykuCisgKiBAbm90ZSBNYWNybyBJU19USU1fRU5DT0RFUl9FUlJPUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyCisgKiBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBlbmNvZGVyIGVycm9yIG1hbmFnZW1lbnQuCisgKiBAcm10b2xsIFNSICAgICAgICAgICBJRVJSRiAgICAgICAgICAgTExfVElNX0lzQWN0aXZlRmxhZ19JRVJSCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzQWN0aXZlRmxhZ19JRVJSKGNvbnN0IFRJTV9UeXBlRGVmICpUSU14KSB7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPlNSLCBUSU1fU1JfSUVSUkYpID09IChUSU1fU1JfSUVSUkYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDbGVhciB0aGUgZGlyZWN0aW9uIGNoYW5nZSBpbnRlcnJ1cHQgZmxhZyAoRElSRikuCisgKiBAbm90ZSBNYWNybyBJU19USU1fRlVOQ1RJTk9OQUxfRU5DT0RFUl9JTlRFUlJVUFRfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQKKyAqIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgZW5jb2RlciBpbnRlcnJ1cHQKKyAqIG1hbmFnZW1lbnQuCisgKiBAcm10b2xsIFNSICAgICAgICAgICBESVJGICAgICAgICAgICBMTF9USU1fQ2xlYXJGbGFnX0RJUgorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NsZWFyRmxhZ19ESVIoVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgV1JJVEVfUkVHKFRJTXgtPlNSLCB+KFRJTV9TUl9ESVJGKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIGRpcmVjdGlvbiBjaGFuZ2UgaW50ZXJydXB0IGZsYWcgKERJUkYpIGlzIHNldAorICogKGRpcmVjdGlvbiBjaGFuZ2UgaW50ZXJydXB0IGlzIHBlbmRpbmcpLgorICogQG5vdGUgTWFjcm8gSVNfVElNX0ZVTkNUSU5PTkFMX0VOQ09ERVJfSU5URVJSVVBUX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkCisgKiB0byBjaGVjayB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGVuY29kZXIgaW50ZXJydXB0CisgKiBtYW5hZ2VtZW50LgorICogQHJtdG9sbCBTUiAgICAgICAgICAgRElSRiAgICAgICAgICAgTExfVElNX0lzQWN0aXZlRmxhZ19ESVIKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNBY3RpdmVGbGFnX0RJUihjb25zdCBUSU1fVHlwZURlZiAqVElNeCkgeworICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5TUiwgVElNX1NSX0RJUkYpID09IChUSU1fU1JfRElSRikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENsZWFyIHRoZSBpbmRleCBpbnRlcnJ1cHQgZmxhZyAoSURYRikuCisgKiBAbm90ZSBNYWNybyBJU19USU1fRlVOQ1RJTk9OQUxfRU5DT0RFUl9JTlRFUlJVUFRfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQKKyAqIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgZW5jb2RlciBpbnRlcnJ1cHQKKyAqIG1hbmFnZW1lbnQuCisgKiBAcm10b2xsIFNSICAgICAgICAgICBJRFhGICAgICAgICAgICBMTF9USU1fQ2xlYXJGbGFnX0lEWAorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NsZWFyRmxhZ19JRFgoVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgV1JJVEVfUkVHKFRJTXgtPlNSLCB+KFRJTV9TUl9JRFhGKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIGluZGV4IGludGVycnVwdCBmbGFnIChJRFhGKSBpcyBzZXQgKGluZGV4IGludGVycnVwdAorICogaXMgcGVuZGluZykuCisgKiBAbm90ZSBNYWNybyBJU19USU1fRlVOQ1RJTk9OQUxfRU5DT0RFUl9JTlRFUlJVUFRfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQKKyAqIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgZW5jb2RlciBpbnRlcnJ1cHQKKyAqIG1hbmFnZW1lbnQuCisgKiBAcm10b2xsIFNSICAgICAgICAgICBJRFhGICAgICAgICAgICBMTF9USU1fSXNBY3RpdmVGbGFnX0lEWAorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0FjdGl2ZUZsYWdfSURYKGNvbnN0IFRJTV9UeXBlRGVmICpUSU14KSB7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPlNSLCBUSU1fU1JfSURYRikgPT0gKFRJTV9TUl9JRFhGKSkgPyAxVUwgOiAwVUwpOworfQorLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VGX0lUX01hbmFnZW1lbnQgSVQtTWFuYWdlbWVudAorICogQHsKKyAqLworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSB1cGRhdGUgaW50ZXJydXB0IChVSUUpLgorICogQHJtdG9sbCBESUVSICAgICAgICAgVUlFICAgICAgICAgICBMTF9USU1fRW5hYmxlSVRfVVBEQVRFCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlSVRfVVBEQVRFKFRJTV9UeXBlRGVmICpUSU14KSB7CisgIFNFVF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfVUlFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgdXBkYXRlIGludGVycnVwdCAoVUlFKS4KKyAqIEBybXRvbGwgRElFUiAgICAgICAgIFVJRSAgICAgICAgICAgTExfVElNX0Rpc2FibGVJVF9VUERBVEUKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlSVRfVVBEQVRFKFRJTV9UeXBlRGVmICpUSU14KSB7CisgIENMRUFSX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9VSUUpOworfQorCisvKioKKyAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHVwZGF0ZSBpbnRlcnJ1cHQgKFVJRSkgaXMgZW5hYmxlZC4KKyAqIEBybXRvbGwgRElFUiAgICAgICAgIFVJRSAgICAgICAgICAgTExfVElNX0lzRW5hYmxlZElUX1VQREFURQorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0VuYWJsZWRJVF9VUERBVEUoY29uc3QgVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfVUlFKSA9PSAoVElNX0RJRVJfVUlFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIGNhcHR1cmUvY29tcGFyZSAxIGludGVycnVwdCAoQ0MxSUUpLgorICogQHJtdG9sbCBESUVSICAgICAgICAgQ0MxSUUgICAgICAgICBMTF9USU1fRW5hYmxlSVRfQ0MxCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlSVRfQ0MxKFRJTV9UeXBlRGVmICpUSU14KSB7CisgIFNFVF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ0MxSUUpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBjYXB0dXJlL2NvbXBhcmUgMSAgaW50ZXJydXB0IChDQzFJRSkuCisgKiBAcm10b2xsIERJRVIgICAgICAgICBDQzFJRSAgICAgICAgIExMX1RJTV9EaXNhYmxlSVRfQ0MxCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZUlUX0NDMShUSU1fVHlwZURlZiAqVElNeCkgeworICBDTEVBUl9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ0MxSUUpOworfQorCisvKioKKyAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNhcHR1cmUvY29tcGFyZSAxIGludGVycnVwdCAoQ0MxSUUpIGlzIGVuYWJsZWQuCisgKiBAcm10b2xsIERJRVIgICAgICAgICBDQzFJRSAgICAgICAgIExMX1RJTV9Jc0VuYWJsZWRJVF9DQzEKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNFbmFibGVkSVRfQ0MxKGNvbnN0IFRJTV9UeXBlRGVmICpUSU14KSB7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NDMUlFKSA9PSAoVElNX0RJRVJfQ0MxSUUpKSA/IDFVTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIGNhcHR1cmUvY29tcGFyZSAyIGludGVycnVwdCAoQ0MySUUpLgorICogQHJtdG9sbCBESUVSICAgICAgICAgQ0MySUUgICAgICAgICBMTF9USU1fRW5hYmxlSVRfQ0MyCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlSVRfQ0MyKFRJTV9UeXBlRGVmICpUSU14KSB7CisgIFNFVF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ0MySUUpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBjYXB0dXJlL2NvbXBhcmUgMiAgaW50ZXJydXB0IChDQzJJRSkuCisgKiBAcm10b2xsIERJRVIgICAgICAgICBDQzJJRSAgICAgICAgIExMX1RJTV9EaXNhYmxlSVRfQ0MyCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZUlUX0NDMihUSU1fVHlwZURlZiAqVElNeCkgeworICBDTEVBUl9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ0MySUUpOworfQorCisvKioKKyAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNhcHR1cmUvY29tcGFyZSAyIGludGVycnVwdCAoQ0MySUUpIGlzIGVuYWJsZWQuCisgKiBAcm10b2xsIERJRVIgICAgICAgICBDQzJJRSAgICAgICAgIExMX1RJTV9Jc0VuYWJsZWRJVF9DQzIKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNFbmFibGVkSVRfQ0MyKGNvbnN0IFRJTV9UeXBlRGVmICpUSU14KSB7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NDMklFKSA9PSAoVElNX0RJRVJfQ0MySUUpKSA/IDFVTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIGNhcHR1cmUvY29tcGFyZSAzIGludGVycnVwdCAoQ0MzSUUpLgorICogQHJtdG9sbCBESUVSICAgICAgICAgQ0MzSUUgICAgICAgICBMTF9USU1fRW5hYmxlSVRfQ0MzCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlSVRfQ0MzKFRJTV9UeXBlRGVmICpUSU14KSB7CisgIFNFVF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ0MzSUUpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBjYXB0dXJlL2NvbXBhcmUgMyAgaW50ZXJydXB0IChDQzNJRSkuCisgKiBAcm10b2xsIERJRVIgICAgICAgICBDQzNJRSAgICAgICAgIExMX1RJTV9EaXNhYmxlSVRfQ0MzCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZUlUX0NDMyhUSU1fVHlwZURlZiAqVElNeCkgeworICBDTEVBUl9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ0MzSUUpOworfQorCisvKioKKyAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNhcHR1cmUvY29tcGFyZSAzIGludGVycnVwdCAoQ0MzSUUpIGlzIGVuYWJsZWQuCisgKiBAcm10b2xsIERJRVIgICAgICAgICBDQzNJRSAgICAgICAgIExMX1RJTV9Jc0VuYWJsZWRJVF9DQzMKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNFbmFibGVkSVRfQ0MzKGNvbnN0IFRJTV9UeXBlRGVmICpUSU14KSB7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NDM0lFKSA9PSAoVElNX0RJRVJfQ0MzSUUpKSA/IDFVTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIGNhcHR1cmUvY29tcGFyZSA0IGludGVycnVwdCAoQ0M0SUUpLgorICogQHJtdG9sbCBESUVSICAgICAgICAgQ0M0SUUgICAgICAgICBMTF9USU1fRW5hYmxlSVRfQ0M0CisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlSVRfQ0M0KFRJTV9UeXBlRGVmICpUSU14KSB7CisgIFNFVF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ0M0SUUpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBjYXB0dXJlL2NvbXBhcmUgNCAgaW50ZXJydXB0IChDQzRJRSkuCisgKiBAcm10b2xsIERJRVIgICAgICAgICBDQzRJRSAgICAgICAgIExMX1RJTV9EaXNhYmxlSVRfQ0M0CisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZUlUX0NDNChUSU1fVHlwZURlZiAqVElNeCkgeworICBDTEVBUl9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ0M0SUUpOworfQorCisvKioKKyAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNhcHR1cmUvY29tcGFyZSA0IGludGVycnVwdCAoQ0M0SUUpIGlzIGVuYWJsZWQuCisgKiBAcm10b2xsIERJRVIgICAgICAgICBDQzRJRSAgICAgICAgIExMX1RJTV9Jc0VuYWJsZWRJVF9DQzQKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNFbmFibGVkSVRfQ0M0KGNvbnN0IFRJTV9UeXBlRGVmICpUSU14KSB7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NDNElFKSA9PSAoVElNX0RJRVJfQ0M0SUUpKSA/IDFVTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIGNvbW11dGF0aW9uIGludGVycnVwdCAoQ09NSUUpLgorICogQHJtdG9sbCBESUVSICAgICAgICAgQ09NSUUgICAgICAgICBMTF9USU1fRW5hYmxlSVRfQ09NCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlSVRfQ09NKFRJTV9UeXBlRGVmICpUSU14KSB7CisgIFNFVF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ09NSUUpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBjb21tdXRhdGlvbiBpbnRlcnJ1cHQgKENPTUlFKS4KKyAqIEBybXRvbGwgRElFUiAgICAgICAgIENPTUlFICAgICAgICAgTExfVElNX0Rpc2FibGVJVF9DT00KKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlSVRfQ09NKFRJTV9UeXBlRGVmICpUSU14KSB7CisgIENMRUFSX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DT01JRSk7Cit9CisKKy8qKgorICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY29tbXV0YXRpb24gaW50ZXJydXB0IChDT01JRSkgaXMgZW5hYmxlZC4KKyAqIEBybXRvbGwgRElFUiAgICAgICAgIENPTUlFICAgICAgICAgTExfVElNX0lzRW5hYmxlZElUX0NPTQorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0VuYWJsZWRJVF9DT00oY29uc3QgVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ09NSUUpID09IChUSU1fRElFUl9DT01JRSkpID8gMVVMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgdHJpZ2dlciBpbnRlcnJ1cHQgKFRJRSkuCisgKiBAcm10b2xsIERJRVIgICAgICAgICBUSUUgICAgICAgICAgIExMX1RJTV9FbmFibGVJVF9UUklHCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlSVRfVFJJRyhUSU1fVHlwZURlZiAqVElNeCkgeworICBTRVRfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX1RJRSk7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIHRyaWdnZXIgaW50ZXJydXB0IChUSUUpLgorICogQHJtdG9sbCBESUVSICAgICAgICAgVElFICAgICAgICAgICBMTF9USU1fRGlzYWJsZUlUX1RSSUcKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlSVRfVFJJRyhUSU1fVHlwZURlZiAqVElNeCkgeworICBDTEVBUl9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfVElFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEluZGljYXRlcyB3aGV0aGVyIHRoZSB0cmlnZ2VyIGludGVycnVwdCAoVElFKSBpcyBlbmFibGVkLgorICogQHJtdG9sbCBESUVSICAgICAgICAgVElFICAgICAgICAgICBMTF9USU1fSXNFbmFibGVkSVRfVFJJRworICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0VuYWJsZWRJVF9UUklHKGNvbnN0IFRJTV9UeXBlRGVmICpUSU14KSB7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX1RJRSkgPT0gKFRJTV9ESUVSX1RJRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBicmVhayBpbnRlcnJ1cHQgKEJJRSkuCisgKiBAcm10b2xsIERJRVIgICAgICAgICBCSUUgICAgICAgICAgIExMX1RJTV9FbmFibGVJVF9CUksKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9FbmFibGVJVF9CUksoVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgU0VUX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9CSUUpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBicmVhayBpbnRlcnJ1cHQgKEJJRSkuCisgKiBAcm10b2xsIERJRVIgICAgICAgICBCSUUgICAgICAgICAgIExMX1RJTV9EaXNhYmxlSVRfQlJLCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZUlUX0JSSyhUSU1fVHlwZURlZiAqVElNeCkgeworICBDTEVBUl9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQklFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEluZGljYXRlcyB3aGV0aGVyIHRoZSBicmVhayBpbnRlcnJ1cHQgKEJJRSkgaXMgZW5hYmxlZC4KKyAqIEBybXRvbGwgRElFUiAgICAgICAgIEJJRSAgICAgICAgICAgTExfVElNX0lzRW5hYmxlZElUX0JSSworICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0VuYWJsZWRJVF9CUksoY29uc3QgVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQklFKSA9PSAoVElNX0RJRVJfQklFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIHRyYW5zaXRpb24gZXJyb3IgaW50ZXJydXB0IChURVJSSUUpLgorICogQG5vdGUgTWFjcm8gSVNfVElNX0VOQ09ERVJfRVJST1JfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlcgorICogb3Igbm90IGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgZW5jb2RlciBlcnJvciBtYW5hZ2VtZW50LgorICogQHJtdG9sbCBESUVSICAgICAgICAgVEVSUklFICAgICAgICAgICBMTF9USU1fRW5hYmxlSVRfVEVSUgorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZUlUX1RFUlIoVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgU0VUX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9URVJSSUUpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSB0cmFuc2l0aW9uIGVycm9yIGludGVycnVwdCAoVEVSUklFKS4KKyAqIEBub3RlIE1hY3JvIElTX1RJTV9FTkNPREVSX0VSUk9SX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIKKyAqIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGVuY29kZXIgZXJyb3IgbWFuYWdlbWVudC4KKyAqIEBybXRvbGwgRElFUiAgICAgICAgIFRFUlJJRSAgICAgICAgICAgTExfVElNX0Rpc2FibGVJVF9URVJSCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZUlUX1RFUlIoVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgQ0xFQVJfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX1RFUlJJRSk7Cit9CisKKy8qKgorICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdHJhbnNpdGlvbiBlcnJvciBpbnRlcnJ1cHQgKFRFUlJJRSkgaXMgZW5hYmxlZC4KKyAqIEBub3RlIE1hY3JvIElTX1RJTV9FTkNPREVSX0VSUk9SX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIKKyAqIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGVuY29kZXIgZXJyb3IgbWFuYWdlbWVudC4KKyAqIEBybXRvbGwgRElFUiAgICAgICAgIFRFUlJJRSAgICAgICAgICAgTExfVElNX0lzRW5hYmxlZElUX1RFUlIKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNFbmFibGVkSVRfVEVSUihjb25zdCBUSU1fVHlwZURlZiAqVElNeCkgeworICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9URVJSSUUpID09IChUSU1fRElFUl9URVJSSUUpKSA/IDFVTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgaW5kZXggZXJyb3IgaW50ZXJydXB0IChJRVJSSUUpLgorICogQG5vdGUgTWFjcm8gSVNfVElNX0VOQ09ERVJfRVJST1JfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlcgorICogb3Igbm90IGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgZW5jb2RlciBlcnJvciBtYW5hZ2VtZW50LgorICogQHJtdG9sbCBESUVSICAgICAgICAgSUVSUklFICAgICAgICAgICBMTF9USU1fRW5hYmxlSVRfSUVSUgorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZUlUX0lFUlIoVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgU0VUX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9JRVJSSUUpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBpbmRleCBlcnJvciBpbnRlcnJ1cHQgKElFUlJJRSkuCisgKiBAbm90ZSBNYWNybyBJU19USU1fRU5DT0RFUl9FUlJPUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyCisgKiBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBlbmNvZGVyIGVycm9yIG1hbmFnZW1lbnQuCisgKiBAcm10b2xsIERJRVIgICAgICAgICBJRVJSSUUgICAgICAgICAgIExMX1RJTV9EaXNhYmxlSVRfSUVSUgorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0Rpc2FibGVJVF9JRVJSKFRJTV9UeXBlRGVmICpUSU14KSB7CisgIENMRUFSX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9JRVJSSUUpOworfQorCisvKioKKyAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGluZGV4IGVycm9yIGludGVycnVwdCAoSUVSUklFKSBpcyBlbmFibGVkLgorICogQG5vdGUgTWFjcm8gSVNfVElNX0VOQ09ERVJfRVJST1JfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlcgorICogb3Igbm90IGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgZW5jb2RlciBlcnJvciBtYW5hZ2VtZW50LgorICogQHJtdG9sbCBESUVSICAgICAgICAgSUVSUklFICAgICAgICAgICBMTF9USU1fSXNFbmFibGVkSVRfSUVSUgorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0VuYWJsZWRJVF9JRVJSKGNvbnN0IFRJTV9UeXBlRGVmICpUSU14KSB7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0lFUlJJRSkgPT0gKFRJTV9ESUVSX0lFUlJJRSkpID8gMVVMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBkaXJlY3Rpb24gY2hhbmdlIGludGVycnVwdCAoRElSSUUpLgorICogQG5vdGUgTWFjcm8gSVNfVElNX0ZVTkNUSU5PTkFMX0VOQ09ERVJfSU5URVJSVVBUX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkCisgKiB0byBjaGVjayB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGVuY29kZXIgaW50ZXJydXB0CisgKiBtYW5hZ2VtZW50LgorICogQHJtdG9sbCBESUVSICAgICAgICAgRElSSUUgICAgICAgICAgIExMX1RJTV9FbmFibGVJVF9ESVIKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9FbmFibGVJVF9ESVIoVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgU0VUX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9ESVJJRSk7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIGRpcmVjdGlvbiBjaGFuZ2UgaW50ZXJydXB0IChESVJJRSkuCisgKiBAbm90ZSBNYWNybyBJU19USU1fRlVOQ1RJTk9OQUxfRU5DT0RFUl9JTlRFUlJVUFRfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQKKyAqIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgZW5jb2RlciBpbnRlcnJ1cHQKKyAqIG1hbmFnZW1lbnQuCisgKiBAcm10b2xsIERJRVIgICAgICAgICBESVJJRSAgICAgICAgICAgTExfVElNX0Rpc2FibGVJVF9ESVIKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlSVRfRElSKFRJTV9UeXBlRGVmICpUSU14KSB7CisgIENMRUFSX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9ESVJJRSk7Cit9CisKKy8qKgorICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZGlyZWN0aW9uIGNoYW5nZSBpbnRlcnJ1cHQgKERJUklFKSBpcyBlbmFibGVkLgorICogQG5vdGUgTWFjcm8gSVNfVElNX0ZVTkNUSU5PTkFMX0VOQ09ERVJfSU5URVJSVVBUX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkCisgKiB0byBjaGVjayB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGVuY29kZXIgaW50ZXJydXB0CisgKiBtYW5hZ2VtZW50LgorICogQHJtdG9sbCBESUVSICAgICAgICAgRElSSUUgICAgICAgICAgIExMX1RJTV9Jc0VuYWJsZWRJVF9ESVIKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNFbmFibGVkSVRfRElSKGNvbnN0IFRJTV9UeXBlRGVmICpUSU14KSB7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0RJUklFKSA9PSAoVElNX0RJRVJfRElSSUUpKSA/IDFVTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIGluZGV4IGludGVycnVwdCAoSURYSUUpLgorICogQG5vdGUgTWFjcm8gSVNfVElNX0ZVTkNUSU5PTkFMX0VOQ09ERVJfSU5URVJSVVBUX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkCisgKiB0byBjaGVjayB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGVuY29kZXIgaW50ZXJydXB0CisgKiBtYW5hZ2VtZW50LgorICogQHJtdG9sbCBESUVSICAgICAgICAgSURYSUUgICAgICAgICAgIExMX1RJTV9FbmFibGVJVF9JRFgKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9FbmFibGVJVF9JRFgoVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgU0VUX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9JRFhJRSk7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIGluZGV4IGludGVycnVwdCAoSURYSUUpLgorICogQG5vdGUgTWFjcm8gSVNfVElNX0ZVTkNUSU5PTkFMX0VOQ09ERVJfSU5URVJSVVBUX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkCisgKiB0byBjaGVjayB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGVuY29kZXIgaW50ZXJydXB0CisgKiBtYW5hZ2VtZW50LgorICogQHJtdG9sbCBESUVSICAgICAgICAgSURYSUUgICAgICAgICAgIExMX1RJTV9EaXNhYmxlSVRfSURYCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZUlUX0lEWChUSU1fVHlwZURlZiAqVElNeCkgeworICBDTEVBUl9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfSURYSUUpOworfQorCisvKioKKyAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGluZGV4IGludGVycnVwdCAoSURYSUUpIGlzIGVuYWJsZWQuCisgKiBAbm90ZSBNYWNybyBJU19USU1fRlVOQ1RJTk9OQUxfRU5DT0RFUl9JTlRFUlJVUFRfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQKKyAqIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgZW5jb2RlciBpbnRlcnJ1cHQKKyAqIG1hbmFnZW1lbnQuCisgKiBAcm10b2xsIERJRVIgICAgICAgICBJRFhJRSAgICAgICAgICAgTExfVElNX0lzRW5hYmxlZElUX0lEWAorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0VuYWJsZWRJVF9JRFgoY29uc3QgVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfSURYSUUpID09IChUSU1fRElFUl9JRFhJRSkpID8gMVVMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FRl9ETUFfTWFuYWdlbWVudCBETUEgTWFuYWdlbWVudAorICogQHsKKyAqLworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSB1cGRhdGUgRE1BIHJlcXVlc3QgKFVERSkuCisgKiBAcm10b2xsIERJRVIgICAgICAgICBVREUgICAgICAgICAgIExMX1RJTV9FbmFibGVETUFSZXFfVVBEQVRFCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlRE1BUmVxX1VQREFURShUSU1fVHlwZURlZiAqVElNeCkgeworICBTRVRfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX1VERSk7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIHVwZGF0ZSBETUEgcmVxdWVzdCAoVURFKS4KKyAqIEBybXRvbGwgRElFUiAgICAgICAgIFVERSAgICAgICAgICAgTExfVElNX0Rpc2FibGVETUFSZXFfVVBEQVRFCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZURNQVJlcV9VUERBVEUoVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgQ0xFQVJfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX1VERSk7Cit9CisKKy8qKgorICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdXBkYXRlIERNQSByZXF1ZXN0ICAoVURFKSBpcyBlbmFibGVkLgorICogQHJtdG9sbCBESUVSICAgICAgICAgVURFICAgICAgICAgICBMTF9USU1fSXNFbmFibGVkRE1BUmVxX1VQREFURQorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9USU1fSXNFbmFibGVkRE1BUmVxX1VQREFURShjb25zdCBUSU1fVHlwZURlZiAqVElNeCkgeworICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9VREUpID09IChUSU1fRElFUl9VREUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgY2FwdHVyZS9jb21wYXJlIDEgRE1BIHJlcXVlc3QgKENDMURFKS4KKyAqIEBybXRvbGwgRElFUiAgICAgICAgIENDMURFICAgICAgICAgTExfVElNX0VuYWJsZURNQVJlcV9DQzEKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9FbmFibGVETUFSZXFfQ0MxKFRJTV9UeXBlRGVmICpUSU14KSB7CisgIFNFVF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ0MxREUpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBjYXB0dXJlL2NvbXBhcmUgMSAgRE1BIHJlcXVlc3QgKENDMURFKS4KKyAqIEBybXRvbGwgRElFUiAgICAgICAgIENDMURFICAgICAgICAgTExfVElNX0Rpc2FibGVETUFSZXFfQ0MxCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZURNQVJlcV9DQzEoVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgQ0xFQVJfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NDMURFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjYXB0dXJlL2NvbXBhcmUgMSBETUEgcmVxdWVzdCAoQ0MxREUpIGlzCisgKiBlbmFibGVkLgorICogQHJtdG9sbCBESUVSICAgICAgICAgQ0MxREUgICAgICAgICBMTF9USU1fSXNFbmFibGVkRE1BUmVxX0NDMQorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0VuYWJsZWRETUFSZXFfQ0MxKGNvbnN0IFRJTV9UeXBlRGVmICpUSU14KSB7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NDMURFKSA9PSAoVElNX0RJRVJfQ0MxREUpKSA/IDFVTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIGNhcHR1cmUvY29tcGFyZSAyIERNQSByZXF1ZXN0IChDQzJERSkuCisgKiBAcm10b2xsIERJRVIgICAgICAgICBDQzJERSAgICAgICAgIExMX1RJTV9FbmFibGVETUFSZXFfQ0MyCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlRE1BUmVxX0NDMihUSU1fVHlwZURlZiAqVElNeCkgeworICBTRVRfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NDMkRFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgY2FwdHVyZS9jb21wYXJlIDIgIERNQSByZXF1ZXN0IChDQzJERSkuCisgKiBAcm10b2xsIERJRVIgICAgICAgICBDQzJERSAgICAgICAgIExMX1RJTV9EaXNhYmxlRE1BUmVxX0NDMgorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0Rpc2FibGVETUFSZXFfQ0MyKFRJTV9UeXBlRGVmICpUSU14KSB7CisgIENMRUFSX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DQzJERSk7Cit9CisKKy8qKgorICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY2FwdHVyZS9jb21wYXJlIDIgRE1BIHJlcXVlc3QgKENDMkRFKSBpcworICogZW5hYmxlZC4KKyAqIEBybXRvbGwgRElFUiAgICAgICAgIENDMkRFICAgICAgICAgTExfVElNX0lzRW5hYmxlZERNQVJlcV9DQzIKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNFbmFibGVkRE1BUmVxX0NDMihjb25zdCBUSU1fVHlwZURlZiAqVElNeCkgeworICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DQzJERSkgPT0gKFRJTV9ESUVSX0NDMkRFKSkgPyAxVUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBjYXB0dXJlL2NvbXBhcmUgMyBETUEgcmVxdWVzdCAoQ0MzREUpLgorICogQHJtdG9sbCBESUVSICAgICAgICAgQ0MzREUgICAgICAgICBMTF9USU1fRW5hYmxlRE1BUmVxX0NDMworICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZURNQVJlcV9DQzMoVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgU0VUX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DQzNERSk7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIGNhcHR1cmUvY29tcGFyZSAzICBETUEgcmVxdWVzdCAoQ0MzREUpLgorICogQHJtdG9sbCBESUVSICAgICAgICAgQ0MzREUgICAgICAgICBMTF9USU1fRGlzYWJsZURNQVJlcV9DQzMKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlRE1BUmVxX0NDMyhUSU1fVHlwZURlZiAqVElNeCkgeworICBDTEVBUl9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ0MzREUpOworfQorCisvKioKKyAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNhcHR1cmUvY29tcGFyZSAzIERNQSByZXF1ZXN0IChDQzNERSkgaXMKKyAqIGVuYWJsZWQuCisgKiBAcm10b2xsIERJRVIgICAgICAgICBDQzNERSAgICAgICAgIExMX1RJTV9Jc0VuYWJsZWRETUFSZXFfQ0MzCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzRW5hYmxlZERNQVJlcV9DQzMoY29uc3QgVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ0MzREUpID09IChUSU1fRElFUl9DQzNERSkpID8gMVVMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgY2FwdHVyZS9jb21wYXJlIDQgRE1BIHJlcXVlc3QgKENDNERFKS4KKyAqIEBybXRvbGwgRElFUiAgICAgICAgIENDNERFICAgICAgICAgTExfVElNX0VuYWJsZURNQVJlcV9DQzQKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9FbmFibGVETUFSZXFfQ0M0KFRJTV9UeXBlRGVmICpUSU14KSB7CisgIFNFVF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ0M0REUpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBjYXB0dXJlL2NvbXBhcmUgNCAgRE1BIHJlcXVlc3QgKENDNERFKS4KKyAqIEBybXRvbGwgRElFUiAgICAgICAgIENDNERFICAgICAgICAgTExfVElNX0Rpc2FibGVETUFSZXFfQ0M0CisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZURNQVJlcV9DQzQoVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgQ0xFQVJfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NDNERFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjYXB0dXJlL2NvbXBhcmUgNCBETUEgcmVxdWVzdCAoQ0M0REUpIGlzCisgKiBlbmFibGVkLgorICogQHJtdG9sbCBESUVSICAgICAgICAgQ0M0REUgICAgICAgICBMTF9USU1fSXNFbmFibGVkRE1BUmVxX0NDNAorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0VuYWJsZWRETUFSZXFfQ0M0KGNvbnN0IFRJTV9UeXBlRGVmICpUSU14KSB7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NDNERFKSA9PSAoVElNX0RJRVJfQ0M0REUpKSA/IDFVTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIGNvbW11dGF0aW9uIERNQSByZXF1ZXN0IChDT01ERSkuCisgKiBAcm10b2xsIERJRVIgICAgICAgICBDT01ERSAgICAgICAgIExMX1RJTV9FbmFibGVETUFSZXFfQ09NCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlRE1BUmVxX0NPTShUSU1fVHlwZURlZiAqVElNeCkgeworICBTRVRfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NPTURFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgY29tbXV0YXRpb24gRE1BIHJlcXVlc3QgKENPTURFKS4KKyAqIEBybXRvbGwgRElFUiAgICAgICAgIENPTURFICAgICAgICAgTExfVElNX0Rpc2FibGVETUFSZXFfQ09NCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZURNQVJlcV9DT00oVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgQ0xFQVJfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NPTURFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjb21tdXRhdGlvbiBETUEgcmVxdWVzdCAoQ09NREUpIGlzIGVuYWJsZWQuCisgKiBAcm10b2xsIERJRVIgICAgICAgICBDT01ERSAgICAgICAgIExMX1RJTV9Jc0VuYWJsZWRETUFSZXFfQ09NCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzRW5hYmxlZERNQVJlcV9DT00oY29uc3QgVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ09NREUpID09IChUSU1fRElFUl9DT01ERSkpID8gMVVMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgdHJpZ2dlciBpbnRlcnJ1cHQgKFRERSkuCisgKiBAcm10b2xsIERJRVIgICAgICAgICBUREUgICAgICAgICAgIExMX1RJTV9FbmFibGVETUFSZXFfVFJJRworICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZURNQVJlcV9UUklHKFRJTV9UeXBlRGVmICpUSU14KSB7CisgIFNFVF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfVERFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgdHJpZ2dlciBpbnRlcnJ1cHQgKFRERSkuCisgKiBAcm10b2xsIERJRVIgICAgICAgICBUREUgICAgICAgICAgIExMX1RJTV9EaXNhYmxlRE1BUmVxX1RSSUcKKyAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlRE1BUmVxX1RSSUcoVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgQ0xFQVJfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX1RERSk7Cit9CisKKy8qKgorICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdHJpZ2dlciBpbnRlcnJ1cHQgKFRERSkgaXMgZW5hYmxlZC4KKyAqIEBybXRvbGwgRElFUiAgICAgICAgIFRERSAgICAgICAgICAgTExfVElNX0lzRW5hYmxlZERNQVJlcV9UUklHCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzRW5hYmxlZERNQVJlcV9UUklHKGNvbnN0IFRJTV9UeXBlRGVmICpUSU14KSB7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX1RERSkgPT0gKFRJTV9ESUVSX1RERSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VGX0VWRU5UX01hbmFnZW1lbnQgRVZFTlQtTWFuYWdlbWVudAorICogQHsKKyAqLworLyoqCisgKiBAYnJpZWYgIEdlbmVyYXRlIGFuIHVwZGF0ZSBldmVudC4KKyAqIEBybXRvbGwgRUdSICAgICAgICAgIFVHICAgICAgICAgICAgTExfVElNX0dlbmVyYXRlRXZlbnRfVVBEQVRFCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fR2VuZXJhdGVFdmVudF9VUERBVEUoVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgU0VUX0JJVChUSU14LT5FR1IsIFRJTV9FR1JfVUcpOworfQorCisvKioKKyAqIEBicmllZiAgR2VuZXJhdGUgQ2FwdHVyZS9Db21wYXJlIDEgZXZlbnQuCisgKiBAcm10b2xsIEVHUiAgICAgICAgICBDQzFHICAgICAgICAgIExMX1RJTV9HZW5lcmF0ZUV2ZW50X0NDMQorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0dlbmVyYXRlRXZlbnRfQ0MxKFRJTV9UeXBlRGVmICpUSU14KSB7CisgIFNFVF9CSVQoVElNeC0+RUdSLCBUSU1fRUdSX0NDMUcpOworfQorCisvKioKKyAqIEBicmllZiAgR2VuZXJhdGUgQ2FwdHVyZS9Db21wYXJlIDIgZXZlbnQuCisgKiBAcm10b2xsIEVHUiAgICAgICAgICBDQzJHICAgICAgICAgIExMX1RJTV9HZW5lcmF0ZUV2ZW50X0NDMgorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0dlbmVyYXRlRXZlbnRfQ0MyKFRJTV9UeXBlRGVmICpUSU14KSB7CisgIFNFVF9CSVQoVElNeC0+RUdSLCBUSU1fRUdSX0NDMkcpOworfQorCisvKioKKyAqIEBicmllZiAgR2VuZXJhdGUgQ2FwdHVyZS9Db21wYXJlIDMgZXZlbnQuCisgKiBAcm10b2xsIEVHUiAgICAgICAgICBDQzNHICAgICAgICAgIExMX1RJTV9HZW5lcmF0ZUV2ZW50X0NDMworICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0dlbmVyYXRlRXZlbnRfQ0MzKFRJTV9UeXBlRGVmICpUSU14KSB7CisgIFNFVF9CSVQoVElNeC0+RUdSLCBUSU1fRUdSX0NDM0cpOworfQorCisvKioKKyAqIEBicmllZiAgR2VuZXJhdGUgQ2FwdHVyZS9Db21wYXJlIDQgZXZlbnQuCisgKiBAcm10b2xsIEVHUiAgICAgICAgICBDQzRHICAgICAgICAgIExMX1RJTV9HZW5lcmF0ZUV2ZW50X0NDNAorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0dlbmVyYXRlRXZlbnRfQ0M0KFRJTV9UeXBlRGVmICpUSU14KSB7CisgIFNFVF9CSVQoVElNeC0+RUdSLCBUSU1fRUdSX0NDNEcpOworfQorCisvKioKKyAqIEBicmllZiAgR2VuZXJhdGUgY29tbXV0YXRpb24gZXZlbnQuCisgKiBAcm10b2xsIEVHUiAgICAgICAgICBDT01HICAgICAgICAgIExMX1RJTV9HZW5lcmF0ZUV2ZW50X0NPTQorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0dlbmVyYXRlRXZlbnRfQ09NKFRJTV9UeXBlRGVmICpUSU14KSB7CisgIFNFVF9CSVQoVElNeC0+RUdSLCBUSU1fRUdSX0NPTUcpOworfQorCisvKioKKyAqIEBicmllZiAgR2VuZXJhdGUgdHJpZ2dlciBldmVudC4KKyAqIEBybXRvbGwgRUdSICAgICAgICAgIFRHICAgICAgICAgICAgTExfVElNX0dlbmVyYXRlRXZlbnRfVFJJRworICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0dlbmVyYXRlRXZlbnRfVFJJRyhUSU1fVHlwZURlZiAqVElNeCkgeworICBTRVRfQklUKFRJTXgtPkVHUiwgVElNX0VHUl9URyk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZW5lcmF0ZSBicmVhayBldmVudC4KKyAqIEBybXRvbGwgRUdSICAgICAgICAgIEJHICAgICAgICAgICAgTExfVElNX0dlbmVyYXRlRXZlbnRfQlJLCisgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fR2VuZXJhdGVFdmVudF9CUksoVElNX1R5cGVEZWYgKlRJTXgpIHsKKyAgU0VUX0JJVChUSU14LT5FR1IsIFRJTV9FR1JfQkcpOworfQorCisvKioKKyAqIEBicmllZiAgR2VuZXJhdGUgYnJlYWsgMiBldmVudC4KKyAqIEBybXRvbGwgRUdSICAgICAgICAgIEIyRyAgICAgICAgICAgTExfVElNX0dlbmVyYXRlRXZlbnRfQlJLMgorICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0dlbmVyYXRlRXZlbnRfQlJLMihUSU1fVHlwZURlZiAqVElNeCkgeworICBTRVRfQklUKFRJTXgtPkVHUiwgVElNX0VHUl9CMkcpOworfQorCisvKioKKyAqIEB9CisgKi8KKworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBUSU1fTExfRUZfSW5pdCBJbml0aWFsaXNhdGlvbiBhbmQgZGVpbml0aWFsaXNhdGlvbiBmdW5jdGlvbnMKKyAqIEB7CisgKi8KKworRXJyb3JTdGF0dXMgTExfVElNX0RlSW5pdChjb25zdCBUSU1fVHlwZURlZiAqVElNeCk7Cit2b2lkIExMX1RJTV9TdHJ1Y3RJbml0KExMX1RJTV9Jbml0VHlwZURlZiAqVElNX0luaXRTdHJ1Y3QpOworRXJyb3JTdGF0dXMgTExfVElNX0luaXQoVElNX1R5cGVEZWYgKlRJTXgsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMTF9USU1fSW5pdFR5cGVEZWYgKlRJTV9Jbml0U3RydWN0KTsKK3ZvaWQgTExfVElNX09DX1N0cnVjdEluaXQoTExfVElNX09DX0luaXRUeXBlRGVmICpUSU1fT0NfSW5pdFN0cnVjdCk7CitFcnJvclN0YXR1cyBMTF9USU1fT0NfSW5pdChUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExMX1RJTV9PQ19Jbml0VHlwZURlZiAqVElNX09DX0luaXRTdHJ1Y3QpOwordm9pZCBMTF9USU1fSUNfU3RydWN0SW5pdChMTF9USU1fSUNfSW5pdFR5cGVEZWYgKlRJTV9JQ0luaXRTdHJ1Y3QpOworRXJyb3JTdGF0dXMgTExfVElNX0lDX0luaXQoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMTF9USU1fSUNfSW5pdFR5cGVEZWYgKlRJTV9JQ19Jbml0U3RydWN0KTsKK3ZvaWQgTExfVElNX0VOQ09ERVJfU3RydWN0SW5pdCgKKyAgICBMTF9USU1fRU5DT0RFUl9Jbml0VHlwZURlZiAqVElNX0VuY29kZXJJbml0U3RydWN0KTsKK0Vycm9yU3RhdHVzIExMX1RJTV9FTkNPREVSX0luaXQoCisgICAgVElNX1R5cGVEZWYgKlRJTXgsIGNvbnN0IExMX1RJTV9FTkNPREVSX0luaXRUeXBlRGVmICpUSU1fRW5jb2RlckluaXRTdHJ1Y3QpOwordm9pZCBMTF9USU1fSEFMTFNFTlNPUl9TdHJ1Y3RJbml0KAorICAgIExMX1RJTV9IQUxMU0VOU09SX0luaXRUeXBlRGVmICpUSU1fSGFsbFNlbnNvckluaXRTdHJ1Y3QpOworRXJyb3JTdGF0dXMgTExfVElNX0hBTExTRU5TT1JfSW5pdCgKKyAgICBUSU1fVHlwZURlZiAqVElNeCwKKyAgICBjb25zdCBMTF9USU1fSEFMTFNFTlNPUl9Jbml0VHlwZURlZiAqVElNX0hhbGxTZW5zb3JJbml0U3RydWN0KTsKK3ZvaWQgTExfVElNX0JEVFJfU3RydWN0SW5pdChMTF9USU1fQkRUUl9Jbml0VHlwZURlZiAqVElNX0JEVFJJbml0U3RydWN0KTsKK0Vycm9yU3RhdHVzIExMX1RJTV9CRFRSX0luaXQoVElNX1R5cGVEZWYgKlRJTXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExMX1RJTV9CRFRSX0luaXRUeXBlRGVmICpUSU1fQkRUUkluaXRTdHJ1Y3QpOworLyoqCisgKiBAfQorICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworI2VuZGlmIC8qIFRJTTEgfHwgVElNMiB8fCBUSU0zIHx8IFRJTTQgfHwgVElNNSB8fCBUSU02IHx8IFRJTTcgfHwgVElNOCB8fCBcCisgICAgICAgICAgVElNMTUgfHwgVElNMTYgfHwgVElNMTcgfHwgVElNMjAgKi8KKworLyoqCisgKiBAfQorICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1NUTTMyRzR4eF9MTF9USU1fSCAqLwpkaWZmIC0tZ2l0IGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfbGxfdXNhcnQuaCBiL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9JbmMvc3RtMzJnNHh4X2xsX3VzYXJ0LmgKaW5kZXggZTNiYzllMy4uMjgxYWY3NSAxMDA2NDQKLS0tIGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfbGxfdXNhcnQuaAorKysgYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9sbF91c2FydC5oCkBAIC0xLDQ1MTAgKzEsNDU3NiBAQAotLyoqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEBmaWxlICAgIHN0bTMyZzR4eF9sbF91c2FydC5oDQotICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0NCi0gKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBVU0FSVCBMTCBtb2R1bGUuDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEBhdHRlbnRpb24NCi0gKg0KLSAqIENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4NCi0gKg0KLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGVybXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZQ0KLSAqIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4NCi0gKiBJZiBubyBMSUNFTlNFIGZpbGUgY29tZXMgd2l0aCB0aGlzIHNvZnR3YXJlLCBpdCBpcyBwcm92aWRlZCBBUy1JUy4NCi0gKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKi8NCi0NCi0vKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpZm5kZWYgU1RNMzJHNHh4X0xMX1VTQVJUX0gNCi0jZGVmaW5lIFNUTTMyRzR4eF9MTF9VU0FSVF9IDQotDQotI2lmZGVmIF9fY3BsdXNwbHVzDQotZXh0ZXJuICJDIiB7DQotI2VuZGlmDQotDQotLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaW5jbHVkZSAic3RtMzJnNHh4LmgiDQotDQotLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzR4eF9MTF9Ecml2ZXINCi0gKiBAew0KLSAqLw0KLQ0KLSNpZiBkZWZpbmVkKFVTQVJUMSkgfHwgZGVmaW5lZChVU0FSVDIpIHx8IGRlZmluZWQoVVNBUlQzKSB8fCBkZWZpbmVkKFVBUlQ0KSB8fCBcDQotICAgIGRlZmluZWQoVUFSVDUpDQotDQotLyoqIEBkZWZncm91cCBVU0FSVF9MTCBVU0FSVA0KLSAqIEB7DQotICovDQotDQotLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfUHJpdmF0ZV9WYXJpYWJsZXMgVVNBUlQgUHJpdmF0ZSBWYXJpYWJsZXMNCi0gKiBAew0KLSAqLw0KLS8qIEFycmF5IHVzZWQgdG8gZ2V0IHRoZSBVU0FSVCBwcmVzY2FsZXIgZGl2aXNpb24gZGVjaW1hbCB2YWx1ZXMgdmVyc3VzIEByZWYNCi0gKiBVU0FSVF9MTF9FQ19QUkVTQ0FMRVIgdmFsdWVzICovDQotc3RhdGljIGNvbnN0IHVpbnQzMl90IFVTQVJUX1BSRVNDQUxFUl9UQUJbXSA9IHsNCi0gICAgMVVMLCAyVUwsIDRVTCwgNlVMLCA4VUwsIDEwVUwsIDEyVUwsIDE2VUwsIDMyVUwsIDY0VUwsIDEyOFVMLCAyNTZVTH07DQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQ0KLS8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfUHJpdmF0ZV9NYWNyb3MgVVNBUlQgUHJpdmF0ZSBNYWNyb3MNCi0gKiBAew0KLSAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotI2VuZGlmIC8qVVNFX0ZVTExfTExfRFJJVkVSKi8NCi0NCi0vKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikNCi0vKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VTX0lOSVQgVVNBUlQgRXhwb3J0ZWQgSW5pdCBzdHJ1Y3R1cmVzDQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgTEwgVVNBUlQgSW5pdCBTdHJ1Y3R1cmUgZGVmaW5pdGlvbg0KLSAqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gIHVpbnQzMl90IFByZXNjYWxlclZhbHVlOyAvKiE8IFNwZWNpZmllcyB0aGUgUHJlc2NhbGVyIHRvIGNvbXB1dGUgdGhlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbXVuaWNhdGlvbiBiYXVkIHJhdGUuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgb2YgQHJlZiBVU0FSVF9MTF9FQ19QUkVTQ0FMRVIuDQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVVNBUlRfU2V0UHJlc2NhbGVyKCkuKi8NCi0NCi0gIHVpbnQzMl90DQotICAgICAgQmF1ZFJhdGU7IC8qITwgVGhpcyBmaWVsZCBkZWZpbmVzIGV4cGVjdGVkIFVzYXJ0IGNvbW11bmljYXRpb24gYmF1ZCByYXRlLg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5DQotICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gQHJlZiBMTF9VU0FSVF9TZXRCYXVkUmF0ZSgpLiovDQotDQotICB1aW50MzJfdCBEYXRhV2lkdGg7IC8qITwgU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgZGF0YSBiaXRzIHRyYW5zbWl0dGVkIG9yDQotICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVkIGluIGEgZnJhbWUuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mDQotICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgVVNBUlRfTExfRUNfREFUQVdJRFRILg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gQHJlZiBMTF9VU0FSVF9TZXREYXRhV2lkdGgoKS4qLw0KLQ0KLSAgdWludDMyX3QNCi0gICAgICBTdG9wQml0czsgLyohPCBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBzdG9wIGJpdHMgdHJhbnNtaXR0ZWQuDQotICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVU0FSVF9MTF9FQ19TVE9QQklUUy4NCi0NCi0gICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeQ0KLSAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEByZWYgTExfVVNBUlRfU2V0U3RvcEJpdHNMZW5ndGgoKS4qLw0KLQ0KLSAgdWludDMyX3QNCi0gICAgICBQYXJpdHk7IC8qITwgU3BlY2lmaWVzIHRoZSBwYXJpdHkgbW9kZS4NCi0gICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVU0FSVF9MTF9FQ19QQVJJVFkuDQotDQotICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5DQotICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEByZWYgTExfVVNBUlRfU2V0UGFyaXR5KCkuKi8NCi0NCi0gIHVpbnQzMl90IFRyYW5zZmVyRGlyZWN0aW9uOyAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBSZWNlaXZlIGFuZC9vciBUcmFuc21pdA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4gVGhpcyBwYXJhbWV0ZXIgY2FuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgYSB2YWx1ZSBvZiBAcmVmIFVTQVJUX0xMX0VDX0RJUkVDVElPTi4NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRhcnkgZnVuY3Rpb24gQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX1VTQVJUX1NldFRyYW5zZmVyRGlyZWN0aW9uKCkuKi8NCi0NCi0gIHVpbnQzMl90DQotICAgICAgSGFyZHdhcmVGbG93Q29udHJvbDsgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgaGFyZHdhcmUgZmxvdyBjb250cm9sIG1vZGUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBlbmFibGVkIG9yIGRpc2FibGVkLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIG9mIEByZWYgVVNBUlRfTExfRUNfSFdDT05UUk9MLg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1VTQVJUX1NldEhXRmxvd0N0cmwoKS4qLw0KLQ0KLSAgdWludDMyX3QgT3ZlclNhbXBsaW5nOyAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIFVTQVJUIG92ZXJzYW1wbGluZyBtb2RlIGlzIDE2DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIDguIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfTExfRUNfT1ZFUlNBTVBMSU5HLg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVVNBUlRfU2V0T3ZlclNhbXBsaW5nKCkuKi8NCi0NCi19IExMX1VTQVJUX0luaXRUeXBlRGVmOw0KLQ0KLS8qKg0KLSAqIEBicmllZiBMTCBVU0FSVCBDbG9jayBJbml0IFN0cnVjdHVyZSBkZWZpbml0aW9uDQotICovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgdWludDMyX3QgQ2xvY2tPdXRwdXQ7IC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIFVTQVJUIGNsb2NrIGlzIGVuYWJsZWQgb3INCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0xMX0VDX0NMT0NLLg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlQgSFcgY29uZmlndXJhdGlvbiBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb25zDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExMX1VTQVJUX0VuYWJsZVNDTEtPdXRwdXQoKSBvciBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfVVNBUlRfRGlzYWJsZVNDTEtPdXRwdXQoKS4gRm9yIG1vcmUgZGV0YWlscywgcmVmZXINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0byBkZXNjcmlwdGlvbiBvZiB0aGlzIGZ1bmN0aW9uLiAqLw0KLQ0KLSAgdWludDMyX3QgQ2xvY2tQb2xhcml0eTsgLyohPCBTcGVjaWZpZXMgdGhlIHN0ZWFkeSBzdGF0ZSBvZiB0aGUgc2VyaWFsIGNsb2NrLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9MTF9FQ19QT0xBUklUWS4NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlQgSFcgY29uZmlndXJhdGlvbiBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbnMgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfVVNBUlRfU2V0Q2xvY2tQb2xhcml0eSgpLiBGb3IgbW9yZSBkZXRhaWxzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXIgdG8gZGVzY3JpcHRpb24gb2YgdGhpcyBmdW5jdGlvbi4gKi8NCi0NCi0gIHVpbnQzMl90IENsb2NrUGhhc2U7IC8qITwgU3BlY2lmaWVzIHRoZSBjbG9jayB0cmFuc2l0aW9uIG9uIHdoaWNoIHRoZSBiaXQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNhcHR1cmUgaXMgbWFkZS4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfTExfRUNfUEhBU0UuDQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUIEhXIGNvbmZpZ3VyYXRpb24gY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb25zIEByZWYgTExfVVNBUlRfU2V0Q2xvY2tQaGFzZSgpLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgbW9yZSBkZXRhaWxzLCByZWZlciB0byBkZXNjcmlwdGlvbiBvZiB0aGlzDQotICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbi4gKi8NCi0NCi0gIHVpbnQzMl90DQotICAgICAgTGFzdEJpdENsb2NrUHVsc2U7IC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGNsb2NrIHB1bHNlIGNvcnJlc3BvbmRpbmcgdG8NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGxhc3QgdHJhbnNtaXR0ZWQgZGF0YSBiaXQgKE1TQikgaGFzIHRvIGJlIG91dHB1dA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiB0aGUgU0NMSyBwaW4gaW4gc3luY2hyb25vdXMgbW9kZS4gVGhpcyBwYXJhbWV0ZXINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVU0FSVF9MTF9FQ19MQVNUQ0xLUFVMU0UuDQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlQgSFcgY29uZmlndXJhdGlvbiBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyB1bml0YXJ5IGZ1bmN0aW9ucyBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX1VTQVJUX1NldExhc3RDbGtQdWxzZU91dHB1dCgpLiBGb3IgbW9yZSBkZXRhaWxzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlciB0byBkZXNjcmlwdGlvbiBvZiB0aGlzIGZ1bmN0aW9uLiAqLw0KLQ0KLX0gTExfVVNBUlRfQ2xvY2tJbml0VHlwZURlZjsNCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLSNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8NCi0NCi0vKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRXhwb3J0ZWRfQ29uc3RhbnRzIFVTQVJUIEV4cG9ydGVkIENvbnN0YW50cw0KLSAqIEB7DQotICovDQotDQotLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FQ19DTEVBUl9GTEFHIENsZWFyIEZsYWdzIERlZmluZXMNCi0gKiBAYnJpZWYgICAgRmxhZ3MgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX1VTQVJUX1dyaXRlUmVnIGZ1bmN0aW9uDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1VTQVJUX0lDUl9QRUNGIFVTQVJUX0lDUl9QRUNGIC8qITwgUGFyaXR5IGVycm9yIGNsZWFyIGZsYWcgKi8NCi0jZGVmaW5lIExMX1VTQVJUX0lDUl9GRUNGIFVTQVJUX0lDUl9GRUNGIC8qITwgRnJhbWluZyBlcnJvciBjbGVhciBmbGFnICovDQotI2RlZmluZSBMTF9VU0FSVF9JQ1JfTkVDRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgVVNBUlRfSUNSX05FQ0YgLyohPCBOb2lzZSBlcnJvciBkZXRlY3RlZCBjbGVhciBmbGFnIFwNCi0gICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfVVNBUlRfSUNSX09SRUNGIFVTQVJUX0lDUl9PUkVDRiAvKiE8IE92ZXJydW4gZXJyb3IgY2xlYXIgZmxhZyAqLw0KLSNkZWZpbmUgTExfVVNBUlRfSUNSX0lETEVDRiBcDQotICBVU0FSVF9JQ1JfSURMRUNGIC8qITwgSWRsZSBsaW5lIGRldGVjdGVkIGNsZWFyIGZsYWcgKi8NCi0jZGVmaW5lIExMX1VTQVJUX0lDUl9UWEZFQ0YgVVNBUlRfSUNSX1RYRkVDRiAvKiE8IFRYIEZJRk8gRW1wdHkgY2xlYXIgZmxhZyAqLw0KLSNkZWZpbmUgTExfVVNBUlRfSUNSX1RDQ0YgXA0KLSAgVVNBUlRfSUNSX1RDQ0YgLyohPCBUcmFuc21pc3Npb24gY29tcGxldGUgY2xlYXIgZmxhZyAqLw0KLSNkZWZpbmUgTExfVVNBUlRfSUNSX1RDQkdUQ0YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgVVNBUlRfSUNSX1RDQkdUQ0YgLyohPCBUcmFuc21pc3Npb24gY29tcGxldGVkIGJlZm9yZSBndWFyZCB0aW1lIGNsZWFyIGZsYWcgXA0KLSAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9VU0FSVF9JQ1JfTEJEQ0YgXA0KLSAgVVNBUlRfSUNSX0xCRENGIC8qITwgTElOIGJyZWFrIGRldGVjdGlvbiBjbGVhciBmbGFnICovDQotI2RlZmluZSBMTF9VU0FSVF9JQ1JfQ1RTQ0YgVVNBUlRfSUNSX0NUU0NGIC8qITwgQ1RTIGNsZWFyIGZsYWcgKi8NCi0jZGVmaW5lIExMX1VTQVJUX0lDUl9SVE9DRiBVU0FSVF9JQ1JfUlRPQ0YgLyohPCBSZWNlaXZlciB0aW1lb3V0IGNsZWFyIGZsYWcgKi8NCi0jZGVmaW5lIExMX1VTQVJUX0lDUl9FT0JDRiBVU0FSVF9JQ1JfRU9CQ0YgLyohPCBFbmQgb2YgYmxvY2sgY2xlYXIgZmxhZyAqLw0KLSNkZWZpbmUgTExfVVNBUlRfSUNSX1VEUkNGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBVU0FSVF9JQ1JfVURSQ0YgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNQSSBTbGF2ZSBVbmRlcnJ1biBjbGVhciBmbGFnIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfVVNBUlRfSUNSX0NNQ0YgVVNBUlRfSUNSX0NNQ0YgLyohPCBDaGFyYWN0ZXIgbWF0Y2ggY2xlYXIgZmxhZyAqLw0KLSNkZWZpbmUgTExfVVNBUlRfSUNSX1dVQ0YgXA0KLSAgVVNBUlRfSUNSX1dVQ0YgLyohPCBXYWtldXAgZnJvbSBTdG9wIG1vZGUgY2xlYXIgZmxhZyAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FQ19HRVRfRkxBRyBHZXQgRmxhZ3MgRGVmaW5lcw0KLSAqIEBicmllZiAgICBGbGFncyBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfVVNBUlRfUmVhZFJlZyBmdW5jdGlvbg0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9VU0FSVF9JU1JfUEUgVVNBUlRfSVNSX1BFICAgICAvKiE8IFBhcml0eSBlcnJvciBmbGFnICovDQotI2RlZmluZSBMTF9VU0FSVF9JU1JfRkUgVVNBUlRfSVNSX0ZFICAgICAvKiE8IEZyYW1pbmcgZXJyb3IgZmxhZyAqLw0KLSNkZWZpbmUgTExfVVNBUlRfSVNSX05FIFVTQVJUX0lTUl9ORSAgICAgLyohPCBOb2lzZSBkZXRlY3RlZCBmbGFnICovDQotI2RlZmluZSBMTF9VU0FSVF9JU1JfT1JFIFVTQVJUX0lTUl9PUkUgICAvKiE8IE92ZXJydW4gZXJyb3IgZmxhZyAqLw0KLSNkZWZpbmUgTExfVVNBUlRfSVNSX0lETEUgVVNBUlRfSVNSX0lETEUgLyohPCBJZGxlIGxpbmUgZGV0ZWN0ZWQgZmxhZyAqLw0KLSNkZWZpbmUgTExfVVNBUlRfSVNSX1JYTkVfUlhGTkUgXA0KLSAgVVNBUlRfSVNSX1JYTkVfUlhGTkUgLyohPCBSZWFkIGRhdGEgcmVnaXN0ZXIgb3IgUlggRklGTyBub3QgZW1wdHkgZmxhZyAqLw0KLSNkZWZpbmUgTExfVVNBUlRfSVNSX1RDIFVTQVJUX0lTUl9UQyAvKiE8IFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBmbGFnICovDQotI2RlZmluZSBMTF9VU0FSVF9JU1JfVFhFX1RYRk5GICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIFVTQVJUX0lTUl9UWEVfVFhGTkYgLyohPCBUcmFuc21pdCBkYXRhIHJlZ2lzdGVyIGVtcHR5IG9yIFRYIEZJRk8gTm90IEZ1bGwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnKi8NCi0jZGVmaW5lIExMX1VTQVJUX0lTUl9MQkRGIFVTQVJUX0lTUl9MQkRGICAgLyohPCBMSU4gYnJlYWsgZGV0ZWN0aW9uIGZsYWcgKi8NCi0jZGVmaW5lIExMX1VTQVJUX0lTUl9DVFNJRiBVU0FSVF9JU1JfQ1RTSUYgLyohPCBDVFMgaW50ZXJydXB0IGZsYWcgKi8NCi0jZGVmaW5lIExMX1VTQVJUX0lTUl9DVFMgVVNBUlRfSVNSX0NUUyAgICAgLyohPCBDVFMgZmxhZyAqLw0KLSNkZWZpbmUgTExfVVNBUlRfSVNSX1JUT0YgVVNBUlRfSVNSX1JUT0YgICAvKiE8IFJlY2VpdmVyIHRpbWVvdXQgZmxhZyAqLw0KLSNkZWZpbmUgTExfVVNBUlRfSVNSX0VPQkYgVVNBUlRfSVNSX0VPQkYgICAvKiE8IEVuZCBvZiBibG9jayBmbGFnICovDQotI2RlZmluZSBMTF9VU0FSVF9JU1JfVURSIFVTQVJUX0lTUl9VRFIgICAgIC8qITwgU1BJIFNsYXZlIHVuZGVycnVuIGVycm9yIGZsYWcgKi8NCi0jZGVmaW5lIExMX1VTQVJUX0lTUl9BQlJFIFVTQVJUX0lTUl9BQlJFICAgLyohPCBBdXRvIGJhdWQgcmF0ZSBlcnJvciBmbGFnICovDQotI2RlZmluZSBMTF9VU0FSVF9JU1JfQUJSRiBVU0FSVF9JU1JfQUJSRiAgIC8qITwgQXV0byBiYXVkIHJhdGUgZmxhZyAqLw0KLSNkZWZpbmUgTExfVVNBUlRfSVNSX0JVU1kgVVNBUlRfSVNSX0JVU1kgICAvKiE8IEJ1c3kgZmxhZyAqLw0KLSNkZWZpbmUgTExfVVNBUlRfSVNSX0NNRiBVU0FSVF9JU1JfQ01GICAgICAvKiE8IENoYXJhY3RlciBtYXRjaCBmbGFnICovDQotI2RlZmluZSBMTF9VU0FSVF9JU1JfU0JLRiBVU0FSVF9JU1JfU0JLRiAgIC8qITwgU2VuZCBicmVhayBmbGFnICovDQotI2RlZmluZSBMTF9VU0FSVF9JU1JfUldVIFwNCi0gIFVTQVJUX0lTUl9SV1UgLyohPCBSZWNlaXZlciB3YWtldXAgZnJvbSBNdXRlIG1vZGUgZmxhZyAqLw0KLSNkZWZpbmUgTExfVVNBUlRfSVNSX1dVRiBVU0FSVF9JU1JfV1VGIC8qITwgV2FrZXVwIGZyb20gU3RvcCBtb2RlIGZsYWcgKi8NCi0jZGVmaW5lIExMX1VTQVJUX0lTUl9URUFDSyBcDQotICBVU0FSVF9JU1JfVEVBQ0sgLyohPCBUcmFuc21pdCBlbmFibGUgYWNrbm93bGVkZ2UgZmxhZyAqLw0KLSNkZWZpbmUgTExfVVNBUlRfSVNSX1JFQUNLIFwNCi0gIFVTQVJUX0lTUl9SRUFDSyAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUmVjZWl2ZSBlbmFibGUgYWNrbm93bGVkZ2UgZmxhZyAqLw0KLSNkZWZpbmUgTExfVVNBUlRfSVNSX1RYRkUgVVNBUlRfSVNSX1RYRkUgLyohPCBUWCBGSUZPIGVtcHR5IGZsYWcgKi8NCi0jZGVmaW5lIExMX1VTQVJUX0lTUl9SWEZGIFVTQVJUX0lTUl9SWEZGIC8qITwgUlggRklGTyBmdWxsIGZsYWcgKi8NCi0jZGVmaW5lIExMX1VTQVJUX0lTUl9UQ0JHVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgVVNBUlRfSVNSX1RDQkdUIC8qITwgVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGJlZm9yZSBndWFyZCB0aW1lIGNvbXBsZXRpb24gZmxhZyBcDQotICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9VU0FSVF9JU1JfUlhGVCBVU0FSVF9JU1JfUlhGVCAvKiE8IFJYIEZJRk8gdGhyZXNob2xkIGZsYWcgKi8NCi0jZGVmaW5lIExMX1VTQVJUX0lTUl9UWEZUIFVTQVJUX0lTUl9UWEZUIC8qITwgVFggRklGTyB0aHJlc2hvbGQgZmxhZyAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FQ19JVCBJVCBEZWZpbmVzDQotICogQGJyaWVmICAgIElUIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9VU0FSVF9SZWFkUmVnIGFuZA0KLSAqIExMX1VTQVJUX1dyaXRlUmVnIGZ1bmN0aW9ucw0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9VU0FSVF9DUjFfSURMRUlFIFVTQVJUX0NSMV9JRExFSUUgLyohPCBJRExFIGludGVycnVwdCBlbmFibGUgKi8NCi0jZGVmaW5lIExMX1VTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBVU0FSVF9DUjFfUlhORUlFX1JYRk5FSUUgLyohPCBSZWFkIGRhdGEgcmVnaXN0ZXIgYW5kIFJYRklGTyBub3QgZW1wdHkgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdCBlbmFibGUgKi8NCi0jZGVmaW5lIExMX1VTQVJUX0NSMV9UQ0lFIFwNCi0gIFVTQVJUX0NSMV9UQ0lFIC8qITwgVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGludGVycnVwdCBlbmFibGUgKi8NCi0jZGVmaW5lIExMX1VTQVJUX0NSMV9UWEVJRV9UWEZORklFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgVVNBUlRfQ1IxX1RYRUlFX1RYRk5GSUUgLyohPCBUcmFuc21pdCBkYXRhIHJlZ2lzdGVyIGVtcHR5IGFuZCBUWCBGSUZPIG5vdCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsIGludGVycnVwdCBlbmFibGUgKi8NCi0jZGVmaW5lIExMX1VTQVJUX0NSMV9QRUlFIFVTQVJUX0NSMV9QRUlFIC8qITwgUGFyaXR5IGVycm9yICovDQotI2RlZmluZSBMTF9VU0FSVF9DUjFfQ01JRSBcDQotICBVU0FSVF9DUjFfQ01JRSAvKiE8IENoYXJhY3RlciBtYXRjaCBpbnRlcnJ1cHQgZW5hYmxlICovDQotI2RlZmluZSBMTF9VU0FSVF9DUjFfUlRPSUUgXA0KLSAgVVNBUlRfQ1IxX1JUT0lFIC8qITwgUmVjZWl2ZXIgdGltZW91dCBpbnRlcnJ1cHQgZW5hYmxlICovDQotI2RlZmluZSBMTF9VU0FSVF9DUjFfRU9CSUUgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBVU0FSVF9DUjFfRU9CSUUgLyohPCBFbmQgb2YgQmxvY2sgaW50ZXJydXB0IGVuYWJsZSBcDQotICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9VU0FSVF9DUjFfVFhGRUlFIFwNCi0gIFVTQVJUX0NSMV9UWEZFSUUgLyohPCBUWCBGSUZPIGVtcHR5IGludGVycnVwdCBlbmFibGUgKi8NCi0jZGVmaW5lIExMX1VTQVJUX0NSMV9SWEZGSUUgXA0KLSAgVVNBUlRfQ1IxX1JYRkZJRSAvKiE8IFJYIEZJRk8gZnVsbCBpbnRlcnJ1cHQgZW5hYmxlICovDQotI2RlZmluZSBMTF9VU0FSVF9DUjJfTEJESUUgXA0KLSAgVVNBUlRfQ1IyX0xCRElFIC8qITwgTElOIGJyZWFrIGRldGVjdGlvbiBpbnRlcnJ1cHQgZW5hYmxlICovDQotI2RlZmluZSBMTF9VU0FSVF9DUjNfRUlFIFVTQVJUX0NSM19FSUUgICAgIC8qITwgRXJyb3IgaW50ZXJydXB0IGVuYWJsZSAqLw0KLSNkZWZpbmUgTExfVVNBUlRfQ1IzX0NUU0lFIFVTQVJUX0NSM19DVFNJRSAvKiE8IENUUyBpbnRlcnJ1cHQgZW5hYmxlICovDQotI2RlZmluZSBMTF9VU0FSVF9DUjNfV1VGSUUgXA0KLSAgVVNBUlRfQ1IzX1dVRklFIC8qITwgV2FrZXVwIGZyb20gU3RvcCBtb2RlIGludGVycnVwdCBlbmFibGUgKi8NCi0jZGVmaW5lIExMX1VTQVJUX0NSM19UWEZUSUUgXA0KLSAgVVNBUlRfQ1IzX1RYRlRJRSAvKiE8IFRYIEZJRk8gdGhyZXNob2xkIGludGVycnVwdCBlbmFibGUgKi8NCi0jZGVmaW5lIExMX1VTQVJUX0NSM19UQ0JHVElFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBVU0FSVF9DUjNfVENCR1RJRSAvKiE8IFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBiZWZvcmUgZ3VhcmQgdGltZSBpbnRlcnJ1cHQgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlICovDQotI2RlZmluZSBMTF9VU0FSVF9DUjNfUlhGVElFIFwNCi0gIFVTQVJUX0NSM19SWEZUSUUgLyohPCBSWCBGSUZPIHRocmVzaG9sZCBpbnRlcnJ1cHQgZW5hYmxlICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX0ZJRk9USFJFU0hPTEQgRklGTyBUaHJlc2hvbGQNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfVVNBUlRfRklGT1RIUkVTSE9MRF8xXzggXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBGSUZPIHJlYWNoZXMgMS84IG9mIGl0cyBkZXB0aCAqLw0KLSNkZWZpbmUgTExfVVNBUlRfRklGT1RIUkVTSE9MRF8xXzQgXA0KLSAgMHgwMDAwMDAwMVUgLyohPCBGSUZPIHJlYWNoZXMgMS80IG9mIGl0cyBkZXB0aCAqLw0KLSNkZWZpbmUgTExfVVNBUlRfRklGT1RIUkVTSE9MRF8xXzIgXA0KLSAgMHgwMDAwMDAwMlUgLyohPCBGSUZPIHJlYWNoZXMgMS8yIG9mIGl0cyBkZXB0aCAqLw0KLSNkZWZpbmUgTExfVVNBUlRfRklGT1RIUkVTSE9MRF8zXzQgXA0KLSAgMHgwMDAwMDAwM1UgLyohPCBGSUZPIHJlYWNoZXMgMy80IG9mIGl0cyBkZXB0aCAqLw0KLSNkZWZpbmUgTExfVVNBUlRfRklGT1RIUkVTSE9MRF83XzggXA0KLSAgMHgwMDAwMDAwNFUgLyohPCBGSUZPIHJlYWNoZXMgNy84IG9mIGl0cyBkZXB0aCAqLw0KLSNkZWZpbmUgTExfVVNBUlRfRklGT1RIUkVTSE9MRF84XzggXA0KLSAgMHgwMDAwMDAwNVUgLyohPCBGSUZPIGJlY29tZXMgZW1wdHkgZm9yIFRYIGFuZCBmdWxsIGZvciBSWCAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FQ19ESVJFQ1RJT04gQ29tbXVuaWNhdGlvbiBEaXJlY3Rpb24NCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfVVNBUlRfRElSRUNUSU9OX05PTkUgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBUcmFuc21pdHRlciBhbmQgUmVjZWl2ZXIgYXJlIGRpc2FibGVkICovDQotI2RlZmluZSBMTF9VU0FSVF9ESVJFQ1RJT05fUlggXA0KLSAgVVNBUlRfQ1IxX1JFIC8qITwgVHJhbnNtaXR0ZXIgaXMgZGlzYWJsZWQgYW5kIFJlY2VpdmVyIGlzIGVuYWJsZWQgKi8NCi0jZGVmaW5lIExMX1VTQVJUX0RJUkVDVElPTl9UWCBcDQotICBVU0FSVF9DUjFfVEUgLyohPCBUcmFuc21pdHRlciBpcyBlbmFibGVkIGFuZCBSZWNlaXZlciBpcyBkaXNhYmxlZCAqLw0KLSNkZWZpbmUgTExfVVNBUlRfRElSRUNUSU9OX1RYX1JYIFwNCi0gIChVU0FSVF9DUjFfVEUgfCBVU0FSVF9DUjFfUkUpIC8qITwgVHJhbnNtaXR0ZXIgYW5kIFJlY2VpdmVyIGFyZSBlbmFibGVkICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX1BBUklUWSBQYXJpdHkgQ29udHJvbA0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9VU0FSVF9QQVJJVFlfTk9ORSAweDAwMDAwMDAwVSAvKiE8IFBhcml0eSBjb250cm9sIGRpc2FibGVkICovDQotI2RlZmluZSBMTF9VU0FSVF9QQVJJVFlfRVZFTiBcDQotICBVU0FSVF9DUjFfUENFIC8qITwgUGFyaXR5IGNvbnRyb2wgZW5hYmxlZCBhbmQgRXZlbiBQYXJpdHkgaXMgc2VsZWN0ZWQgKi8NCi0jZGVmaW5lIExMX1VTQVJUX1BBUklUWV9PREQgXA0KLSAgKFVTQVJUX0NSMV9QQ0UgfCAgICAgICAgICBcDQotICAgVVNBUlRfQ1IxX1BTKSAvKiE8IFBhcml0eSBjb250cm9sIGVuYWJsZWQgYW5kIE9kZCBQYXJpdHkgaXMgc2VsZWN0ZWQgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUNfV0FLRVVQIFdha2V1cA0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9VU0FSVF9XQUtFVVBfSURMRUxJTkUgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCAgVVNBUlQgd2FrZSB1cCBmcm9tIE11dGUgbW9kZSBvbiBJZGxlIExpbmUgKi8NCi0jZGVmaW5lIExMX1VTQVJUX1dBS0VVUF9BRERSRVNTTUFSSyBcDQotICBVU0FSVF9DUjFfV0FLRSAvKiE8ICBVU0FSVCB3YWtlIHVwIGZyb20gTXV0ZSBtb2RlIG9uIEFkZHJlc3MgTWFyayAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FQ19EQVRBV0lEVEggRGF0YXdpZHRoDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1VTQVJUX0RBVEFXSURUSF83QiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIFVTQVJUX0NSMV9NMSAvKiE8IDcgYml0cyB3b3JkIGxlbmd0aCA6IFN0YXJ0IGJpdCwgNyBkYXRhIGJpdHMsIG4gc3RvcCBiaXRzIFwNCi0gICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX1VTQVJUX0RBVEFXSURUSF84QiBcDQotICAweDAwMDAwMDAwVSAvKiE8IDggYml0cyB3b3JkIGxlbmd0aCA6IFN0YXJ0IGJpdCwgOCBkYXRhIGJpdHMsIG4gc3RvcCBiaXRzICovDQotI2RlZmluZSBMTF9VU0FSVF9EQVRBV0lEVEhfOUIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBVU0FSVF9DUjFfTTAgLyohPCA5IGJpdHMgd29yZCBsZW5ndGggOiBTdGFydCBiaXQsIDkgZGF0YSBiaXRzLCBuIHN0b3AgYml0cyBcDQotICAgICAgICAgICAgICAgICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX09WRVJTQU1QTElORyBPdmVyc2FtcGxpbmcNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfVVNBUlRfT1ZFUlNBTVBMSU5HXzE2IDB4MDAwMDAwMDBVICAgIC8qITwgT3ZlcnNhbXBsaW5nIGJ5IDE2ICovDQotI2RlZmluZSBMTF9VU0FSVF9PVkVSU0FNUExJTkdfOCBVU0FSVF9DUjFfT1ZFUjggLyohPCBPdmVyc2FtcGxpbmcgYnkgOCAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQ0KLS8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUNfQ0xPQ0sgQ2xvY2sgU2lnbmFsDQotICogQHsNCi0gKi8NCi0NCi0jZGVmaW5lIExMX1VTQVJUX0NMT0NLX0RJU0FCTEUgMHgwMDAwMDAwMFUgICAgLyohPCBDbG9jayBzaWduYWwgbm90IHByb3ZpZGVkICovDQotI2RlZmluZSBMTF9VU0FSVF9DTE9DS19FTkFCTEUgVVNBUlRfQ1IyX0NMS0VOIC8qITwgQ2xvY2sgc2lnbmFsIHByb3ZpZGVkICovDQotLyoqDQotICogQH0NCi0gKi8NCi0jZW5kaWYgLypVU0VfRlVMTF9MTF9EUklWRVIqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUNfTEFTVENMS1BVTFNFIExhc3QgQ2xvY2sgUHVsc2UNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfVVNBUlRfTEFTVENMS1BVTFNFX05PX09VVFBVVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBUaGUgY2xvY2sgcHVsc2Ugb2YgdGhlIGxhc3QgZGF0YSBiaXQgaXMgbm90IG91dHB1dCB0byB0aGUgXA0KLSAgICAgICAgICAgICAgICAgU0NMSyBwaW4gKi8NCi0jZGVmaW5lIExMX1VTQVJUX0xBU1RDTEtQVUxTRV9PVVRQVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgVVNBUlRfQ1IyX0xCQ0wgLyohPCBUaGUgY2xvY2sgcHVsc2Ugb2YgdGhlIGxhc3QgZGF0YSBiaXQgaXMgb3V0cHV0IHRvIHRoZSBcDQotICAgICAgICAgICAgICAgICAgICBTQ0xLIHBpbiAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FQ19QSEFTRSBDbG9jayBQaGFzZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9VU0FSVF9QSEFTRV8xRURHRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAweDAwMDAwMDAwVSAvKiE8IFRoZSBmaXJzdCBjbG9jayB0cmFuc2l0aW9uIGlzIHRoZSBmaXJzdCBkYXRhIGNhcHR1cmUgZWRnZSBcDQotICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX1VTQVJUX1BIQVNFXzJFREdFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgVVNBUlRfQ1IyX0NQSEEgLyohPCBUaGUgc2Vjb25kIGNsb2NrIHRyYW5zaXRpb24gaXMgdGhlIGZpcnN0IGRhdGEgY2FwdHVyZSBcDQotICAgICAgICAgICAgICAgICAgICBlZGdlICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX1BPTEFSSVRZIENsb2NrIFBvbGFyaXR5DQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1VTQVJUX1BPTEFSSVRZX0xPVyBcDQotICAweDAwMDAwMDAwVSAvKiE8IFN0ZWFkeSBsb3cgdmFsdWUgb24gU0NMSyBwaW4gb3V0c2lkZSB0cmFuc21pc3Npb24gd2luZG93Ki8NCi0jZGVmaW5lIExMX1VTQVJUX1BPTEFSSVRZX0hJR0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgVVNBUlRfQ1IyX0NQT0wgLyohPCBTdGVhZHkgaGlnaCB2YWx1ZSBvbiBTQ0xLIHBpbiBvdXRzaWRlIHRyYW5zbWlzc2lvbiBcDQotICAgICAgICAgICAgICAgICAgICB3aW5kb3cgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUNfUFJFU0NBTEVSIENsb2NrIFNvdXJjZSBQcmVzY2FsZXINCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjEgMHgwMDAwMDAwMFUgLyohPCBJbnB1dCBjbG9jayBub3QgZGl2aWRlZCAgICovDQotI2RlZmluZSBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMiBcDQotICAoVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzApIC8qITwgSW5wdXQgY2xvY2sgZGl2aWRlZCBieSAyICAqLw0KLSNkZWZpbmUgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjQgXA0KLSAgKFVTQVJUX1BSRVNDX1BSRVNDQUxFUl8xKSAvKiE8IElucHV0IGNsb2NrIGRpdmlkZWQgYnkgNCAgKi8NCi0jZGVmaW5lIExMX1VTQVJUX1BSRVNDQUxFUl9ESVY2IFwNCi0gIChVU0FSVF9QUkVTQ19QUkVTQ0FMRVJfMSB8ICAgIFwNCi0gICBVU0FSVF9QUkVTQ19QUkVTQ0FMRVJfMCkgLyohPCBJbnB1dCBjbG9jayBkaXZpZGVkIGJ5IDYgICovDQotI2RlZmluZSBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWOCBcDQotICAoVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzIpIC8qITwgSW5wdXQgY2xvY2sgZGl2aWRlZCBieSA4ICAqLw0KLSNkZWZpbmUgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjEwIFwNCi0gIChVU0FSVF9QUkVTQ19QUkVTQ0FMRVJfMiB8ICAgICBcDQotICAgVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzApIC8qITwgSW5wdXQgY2xvY2sgZGl2aWRlZCBieSAxMCAqLw0KLSNkZWZpbmUgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjEyIFwNCi0gIChVU0FSVF9QUkVTQ19QUkVTQ0FMRVJfMiB8ICAgICBcDQotICAgVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzEpIC8qITwgSW5wdXQgY2xvY2sgZGl2aWRlZCBieSAxMiAqLw0KLSNkZWZpbmUgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjE2ICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzIgfCBVU0FSVF9QUkVTQ19QUkVTQ0FMRVJfMSB8IFwNCi0gICBVU0FSVF9QUkVTQ19QUkVTQ0FMRVJfMCkgLyohPCBJbnB1dCBjbG9jayBkaXZpZGVkIGJ5IDE2ICovDQotI2RlZmluZSBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMzIgXA0KLSAgKFVTQVJUX1BSRVNDX1BSRVNDQUxFUl8zKSAvKiE8IElucHV0IGNsb2NrIGRpdmlkZWQgYnkgMzIgKi8NCi0jZGVmaW5lIExMX1VTQVJUX1BSRVNDQUxFUl9ESVY2NCBcDQotICAoVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzMgfCAgICAgXA0KLSAgIFVTQVJUX1BSRVNDX1BSRVNDQUxFUl8wKSAvKiE8IElucHV0IGNsb2NrIGRpdmlkZWQgYnkgNjQgKi8NCi0jZGVmaW5lIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYxMjggXA0KLSAgKFVTQVJUX1BSRVNDX1BSRVNDQUxFUl8zIHwgICAgICBcDQotICAgVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzEpIC8qITwgSW5wdXQgY2xvY2sgZGl2aWRlZCBieSAxMjggKi8NCi0jZGVmaW5lIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYyNTYgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKFVTQVJUX1BSRVNDX1BSRVNDQUxFUl8zIHwgVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzEgfCBcDQotICAgVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzApIC8qITwgSW5wdXQgY2xvY2sgZGl2aWRlZCBieSAyNTYgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUNfU1RPUEJJVFMgU3RvcCBCaXRzDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1VTQVJUX1NUT1BCSVRTXzBfNSBVU0FSVF9DUjJfU1RPUF8wIC8qITwgMC41IHN0b3AgYml0ICovDQotI2RlZmluZSBMTF9VU0FSVF9TVE9QQklUU18xIDB4MDAwMDAwMDBVICAgICAgICAvKiE8IDEgc3RvcCBiaXQgKi8NCi0jZGVmaW5lIExMX1VTQVJUX1NUT1BCSVRTXzFfNSBcDQotICAoVVNBUlRfQ1IyX1NUT1BfMCB8IFVTQVJUX0NSMl9TVE9QXzEpICAgICAgLyohPCAxLjUgc3RvcCBiaXRzICovDQotI2RlZmluZSBMTF9VU0FSVF9TVE9QQklUU18yIFVTQVJUX0NSMl9TVE9QXzEgLyohPCAyIHN0b3AgYml0cyAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FQ19UWFJYIFRYIFJYIFBpbnMgU3dhcA0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9VU0FSVF9UWFJYX1NUQU5EQVJEIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgVFgvUlggcGlucyBhcmUgdXNlZCBhcyBkZWZpbmVkIGluIHN0YW5kYXJkIHBpbm91dCAqLw0KLSNkZWZpbmUgTExfVVNBUlRfVFhSWF9TV0FQUEVEIFwNCi0gIChVU0FSVF9DUjJfU1dBUCkgLyohPCBUWCBhbmQgUlggcGlucyBmdW5jdGlvbnMgYXJlIHN3YXBwZWQuICAgICAgICAgICAgICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX1JYUElOX0xFVkVMIFJYIFBpbiBBY3RpdmUgTGV2ZWwgSW52ZXJzaW9uDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1VTQVJUX1JYUElOX0xFVkVMX1NUQU5EQVJEIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgUlggcGluIHNpZ25hbCB3b3JrcyB1c2luZyB0aGUgc3RhbmRhcmQgbG9naWMgbGV2ZWxzICovDQotI2RlZmluZSBMTF9VU0FSVF9SWFBJTl9MRVZFTF9JTlZFUlRFRCBcDQotICAoVVNBUlRfQ1IyX1JYSU5WKSAvKiE8IFJYIHBpbiBzaWduYWwgdmFsdWVzIGFyZSBpbnZlcnRlZC4gKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUNfVFhQSU5fTEVWRUwgVFggUGluIEFjdGl2ZSBMZXZlbCBJbnZlcnNpb24NCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfVVNBUlRfVFhQSU5fTEVWRUxfU1RBTkRBUkQgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBUWCBwaW4gc2lnbmFsIHdvcmtzIHVzaW5nIHRoZSBzdGFuZGFyZCBsb2dpYyBsZXZlbHMgKi8NCi0jZGVmaW5lIExMX1VTQVJUX1RYUElOX0xFVkVMX0lOVkVSVEVEIFwNCi0gIChVU0FSVF9DUjJfVFhJTlYpIC8qITwgVFggcGluIHNpZ25hbCB2YWx1ZXMgYXJlIGludmVydGVkLiAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FQ19CSU5BUllfTE9HSUMgQmluYXJ5IERhdGEgSW52ZXJzaW9uDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1VTQVJUX0JJTkFSWV9MT0dJQ19QT1NJVElWRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBMb2dpY2FsIGRhdGEgZnJvbSB0aGUgZGF0YSByZWdpc3RlciBhcmUgc2VuZC9yZWNlaXZlZCBpbiBcDQotICAgICAgICAgICAgICAgICBwb3NpdGl2ZS9kaXJlY3QgbG9naWMuICgxPUgsIDA9TCkgKi8NCi0jZGVmaW5lIExMX1VTQVJUX0JJTkFSWV9MT0dJQ19ORUdBVElWRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgVVNBUlRfQ1IyX0RBVEFJTlYgLyohPCBMb2dpY2FsIGRhdGEgZnJvbSB0aGUgZGF0YSByZWdpc3RlciBhcmUgc2VuZC9yZWNlaXZlZCBcDQotICAgICAgICAgICAgICAgICAgICAgICBpbiBuZWdhdGl2ZS9pbnZlcnNlIGxvZ2ljLiAoMT1MLCAwPUgpLiBUaGUgcGFyaXR5IGJpdCAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgIGlzIGFsc28gaW52ZXJ0ZWQuICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX0JJVE9SREVSIEJpdCBPcmRlcg0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9VU0FSVF9CSVRPUkRFUl9MU0JGSVJTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAweDAwMDAwMDAwVSAvKiE8IGRhdGEgaXMgdHJhbnNtaXR0ZWQvcmVjZWl2ZWQgd2l0aCBkYXRhIGJpdCAwIGZpcnN0LCBcDQotICAgICAgICAgICAgICAgICBmb2xsb3dpbmcgdGhlIHN0YXJ0IGJpdCAqLw0KLSNkZWZpbmUgTExfVVNBUlRfQklUT1JERVJfTVNCRklSU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIFVTQVJUX0NSMl9NU0JGSVJTVCAvKiE8IGRhdGEgaXMgdHJhbnNtaXR0ZWQvcmVjZWl2ZWQgd2l0aCB0aGUgTVNCIGZpcnN0LCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgZm9sbG93aW5nIHRoZSBzdGFydCBiaXQgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUNfQVVUT0JBVURfREVURUNUX09OIEF1dG9iYXVkIERldGVjdGlvbg0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9VU0FSVF9BVVRPQkFVRF9ERVRFQ1RfT05fU1RBUlRCSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBNZWFzdXJlbWVudCBvZiB0aGUgc3RhcnQgYml0IGlzIHVzZWQgdG8gZGV0ZWN0IHRoZSBiYXVkIFwNCi0gICAgICAgICAgICAgICAgIHJhdGUgKi8NCi0jZGVmaW5lIExMX1VTQVJUX0FVVE9CQVVEX0RFVEVDVF9PTl9GQUxMSU5HRURHRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBVU0FSVF9DUjJfQUJSTU9ERV8wIC8qITwgRmFsbGluZyBlZGdlIHRvIGZhbGxpbmcgZWRnZSBtZWFzdXJlbWVudC4gUmVjZWl2ZWQgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZSBtdXN0IHN0YXJ0IHdpdGggYSBzaW5nbGUgYml0ID0gMSAtPiBGcmFtZSA9ICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnQxMHh4eHh4eCAqLw0KLSNkZWZpbmUgTExfVVNBUlRfQVVUT0JBVURfREVURUNUX09OXzdGX0ZSQU1FIFwNCi0gIFVTQVJUX0NSMl9BQlJNT0RFXzEgLyohPCAweDdGIGZyYW1lIGRldGVjdGlvbiAqLw0KLSNkZWZpbmUgTExfVVNBUlRfQVVUT0JBVURfREVURUNUX09OXzU1X0ZSQU1FIFwNCi0gIChVU0FSVF9DUjJfQUJSTU9ERV8xIHwgVVNBUlRfQ1IyX0FCUk1PREVfMCkgLyohPCAweDU1IGZyYW1lIGRldGVjdGlvbiAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FQ19BRERSRVNTX0RFVEVDVCBBZGRyZXNzIExlbmd0aCBEZXRlY3Rpb24NCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfVVNBUlRfQUREUkVTU19ERVRFQ1RfNEIgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCA0LWJpdCBhZGRyZXNzIGRldGVjdGlvbiBtZXRob2Qgc2VsZWN0ZWQgKi8NCi0jZGVmaW5lIExMX1VTQVJUX0FERFJFU1NfREVURUNUXzdCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICBVU0FSVF9DUjJfQURETTcgLyohPCA3LWJpdCBhZGRyZXNzIGRldGVjdGlvbiAoaW4gOC1iaXQgZGF0YSBtb2RlKSBtZXRob2QgXA0KLSAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX0hXQ09OVFJPTCBIYXJkd2FyZSBDb250cm9sDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIExMX1VTQVJUX0hXQ09OVFJPTF9OT05FIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgQ1RTIGFuZCBSVFMgaGFyZHdhcmUgZmxvdyBjb250cm9sIGRpc2FibGVkICovDQotI2RlZmluZSBMTF9VU0FSVF9IV0NPTlRST0xfUlRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIFVTQVJUX0NSM19SVFNFIC8qITwgUlRTIG91dHB1dCBlbmFibGVkLCBkYXRhIGlzIG9ubHkgcmVxdWVzdGVkIHdoZW4gdGhlcmUgaXMgXA0KLSAgICAgICAgICAgICAgICAgICAgc3BhY2UgaW4gdGhlIHJlY2VpdmUgYnVmZmVyICovDQotI2RlZmluZSBMTF9VU0FSVF9IV0NPTlRST0xfQ1RTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIFVTQVJUX0NSM19DVFNFIC8qITwgQ1RTIG1vZGUgZW5hYmxlZCwgZGF0YSBpcyBvbmx5IHRyYW5zbWl0dGVkIHdoZW4gdGhlIG5DVFMgXA0KLSAgICAgICAgICAgICAgICAgICAgaW5wdXQgaXMgYXNzZXJ0ZWQgKHRpZWQgdG8gMCkgKi8NCi0jZGVmaW5lIExMX1VTQVJUX0hXQ09OVFJPTF9SVFNfQ1RTIFwNCi0gIChVU0FSVF9DUjNfUlRTRSB8ICAgICAgICAgICAgICAgIFwNCi0gICBVU0FSVF9DUjNfQ1RTRSkgLyohPCBDVFMgYW5kIFJUUyBoYXJkd2FyZSBmbG93IGNvbnRyb2wgZW5hYmxlZCAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FQ19XQUtFVVBfT04gV2FrZXVwIEFjdGl2YXRpb24NCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfVVNBUlRfV0FLRVVQX09OX0FERFJFU1MgXA0KLSAgMHgwMDAwMDAwMFUgLyohPCBXYWtlIHVwIGFjdGl2ZSBvbiBhZGRyZXNzIG1hdGNoICovDQotI2RlZmluZSBMTF9VU0FSVF9XQUtFVVBfT05fU1RBUlRCSVQgXA0KLSAgVVNBUlRfQ1IzX1dVU18xIC8qITwgV2FrZSB1cCBhY3RpdmUgb24gU3RhcnQgYml0IGRldGVjdGlvbiAqLw0KLSNkZWZpbmUgTExfVVNBUlRfV0FLRVVQX09OX1JYTkUgXA0KLSAgKFVTQVJUX0NSM19XVVNfMCB8IFVTQVJUX0NSM19XVVNfMSkgLyohPCBXYWtlIHVwIGFjdGl2ZSBvbiBSWE5FICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX0lSREFfUE9XRVIgSXJEQSBQb3dlcg0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9VU0FSVF9JUkRBX1BPV0VSX05PUk1BTCAweDAwMDAwMDAwVSAvKiE8IElyREEgbm9ybWFsIHBvd2VyIG1vZGUgKi8NCi0jZGVmaW5lIExMX1VTQVJUX0lSREFfUE9XRVJfTE9XIFVTQVJUX0NSM19JUkxQIC8qITwgSXJEQSBsb3cgcG93ZXIgbW9kZSAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FQ19MSU5CUkVBS19ERVRFQ1QgTElOIEJyZWFrIERldGVjdGlvbiBMZW5ndGgNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfVVNBUlRfTElOQlJFQUtfREVURUNUXzEwQiBcDQotICAweDAwMDAwMDAwVSAvKiE8IDEwLWJpdCBicmVhayBkZXRlY3Rpb24gbWV0aG9kIHNlbGVjdGVkICovDQotI2RlZmluZSBMTF9VU0FSVF9MSU5CUkVBS19ERVRFQ1RfMTFCIFwNCi0gIFVTQVJUX0NSMl9MQkRMIC8qITwgMTEtYml0IGJyZWFrIGRldGVjdGlvbiBtZXRob2Qgc2VsZWN0ZWQgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUNfREVfUE9MQVJJVFkgRHJpdmVyIEVuYWJsZSBQb2xhcml0eQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9VU0FSVF9ERV9QT0xBUklUWV9ISUdIIDB4MDAwMDAwMDBVICAvKiE8IERFIHNpZ25hbCBpcyBhY3RpdmUgaGlnaCAqLw0KLSNkZWZpbmUgTExfVVNBUlRfREVfUE9MQVJJVFlfTE9XIFVTQVJUX0NSM19ERVAgLyohPCBERSBzaWduYWwgaXMgYWN0aXZlIGxvdyAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FQ19ETUFfUkVHX0RBVEEgRE1BIFJlZ2lzdGVyIERhdGENCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfVVNBUlRfRE1BX1JFR19EQVRBX1RSQU5TTUlUIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgR2V0IGFkZHJlc3Mgb2YgZGF0YSByZWdpc3RlciB1c2VkIGZvciB0cmFuc21pc3Npb24gKi8NCi0jZGVmaW5lIExMX1VTQVJUX0RNQV9SRUdfREFUQV9SRUNFSVZFIFwNCi0gIDB4MDAwMDAwMDFVIC8qITwgR2V0IGFkZHJlc3Mgb2YgZGF0YSByZWdpc3RlciB1c2VkIGZvciByZWNlcHRpb24gKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGRlZmdyb3VwIFVTQVJUX0xMX0V4cG9ydGVkX01hY3JvcyBVU0FSVCBFeHBvcnRlZCBNYWNyb3MNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRU1fV1JJVEVfUkVBRCBDb21tb24gV3JpdGUgYW5kIHJlYWQgcmVnaXN0ZXJzIE1hY3Jvcw0KLSAqIEB7DQotICovDQotDQotLyoqDQotICogQGJyaWVmICBXcml0ZSBhIHZhbHVlIGluIFVTQVJUIHJlZ2lzdGVyDQotICogQHBhcmFtICBfX0lOU1RBTkNFX18gVVNBUlQgSW5zdGFuY2UNCi0gKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgd3JpdHRlbg0KLSAqIEBwYXJhbSAgX19WQUxVRV9fIFZhbHVlIHRvIGJlIHdyaXR0ZW4gaW4gdGhlIHJlZ2lzdGVyDQotICogQHJldHZhbCBOb25lDQotICovDQotI2RlZmluZSBMTF9VU0FSVF9Xcml0ZVJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18sIF9fVkFMVUVfXykgXA0KLSAgV1JJVEVfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXywgKF9fVkFMVUVfXykpDQotDQotLyoqDQotICogQGJyaWVmICBSZWFkIGEgdmFsdWUgaW4gVVNBUlQgcmVnaXN0ZXINCi0gKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBVU0FSVCBJbnN0YW5jZQ0KLSAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSByZWFkDQotICogQHJldHZhbCBSZWdpc3RlciB2YWx1ZQ0KLSAqLw0KLSNkZWZpbmUgTExfVVNBUlRfUmVhZFJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18pIFJFQURfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXykNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRU1fRXhwb3J0ZWRfTWFjcm9zX0hlbHBlciBFeHBvcnRlZF9NYWNyb3NfSGVscGVyDQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENvbXB1dGUgVVNBUlRESVYgdmFsdWUgYWNjb3JkaW5nIHRvIFBlcmlwaGVyYWwgQ2xvY2sgYW5kDQotICogICAgICAgICBleHBlY3RlZCBCYXVkIFJhdGUgaW4gOCBiaXRzIHNhbXBsaW5nIG1vZGUgKDMyIGJpdHMgdmFsdWUgb2YgVVNBUlRESVYNCi0gKiBpcyByZXR1cm5lZCkNCi0gKiBAcGFyYW0gIF9fUEVSSVBIQ0xLX18gUGVyaXBoZXJhbCBDbG9jayBmcmVxdWVuY3kgdXNlZCBmb3IgVVNBUlQgaW5zdGFuY2UNCi0gKiBAcGFyYW0gIF9fUFJFU0NBTEVSX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYyDQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVY4DQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjEwDQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjEyDQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjE2DQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjMyDQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjY0DQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjEyOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYyNTYNCi0gKiBAcGFyYW0gIF9fQkFVRFJBVEVfXyBCYXVkIHJhdGUgdmFsdWUgdG8gYWNoaWV2ZQ0KLSAqIEByZXR2YWwgVVNBUlRESVYgdmFsdWUgdG8gYmUgdXNlZCBmb3IgQlJSIHJlZ2lzdGVyIGZpbGxpbmcgaW4gT3ZlclNhbXBsaW5nXzgNCi0gKiBjYXNlDQotICovDQotI2RlZmluZSBfX0xMX1VTQVJUX0RJVl9TQU1QTElORzgoX19QRVJJUEhDTEtfXywgX19QUkVTQ0FMRVJfXywgX19CQVVEUkFURV9fKSBcDQotICAoKCgoKF9fUEVSSVBIQ0xLX18pIC8gKFVTQVJUX1BSRVNDQUxFUl9UQUJbKF9fUFJFU0NBTEVSX18pXSkpICogMlUpICsgICAgICBcDQotICAgICgoX19CQVVEUkFURV9fKSAvIDJVKSkgLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKF9fQkFVRFJBVEVfXykpDQotDQotLyoqDQotICogQGJyaWVmICBDb21wdXRlIFVTQVJURElWIHZhbHVlIGFjY29yZGluZyB0byBQZXJpcGhlcmFsIENsb2NrIGFuZA0KLSAqICAgICAgICAgZXhwZWN0ZWQgQmF1ZCBSYXRlIGluIDE2IGJpdHMgc2FtcGxpbmcgbW9kZSAoMzIgYml0cyB2YWx1ZSBvZg0KLSAqIFVTQVJURElWIGlzIHJldHVybmVkKQ0KLSAqIEBwYXJhbSAgX19QRVJJUEhDTEtfXyBQZXJpcGhlcmFsIENsb2NrIGZyZXF1ZW5jeSB1c2VkIGZvciBVU0FSVCBpbnN0YW5jZQ0KLSAqIEBwYXJhbSAgX19QUkVTQ0FMRVJfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYxDQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVY2DQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMTANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMTINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMTYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWNjQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMTI4DQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjI1Ng0KLSAqIEBwYXJhbSAgX19CQVVEUkFURV9fIEJhdWQgcmF0ZSB2YWx1ZSB0byBhY2hpZXZlDQotICogQHJldHZhbCBVU0FSVERJViB2YWx1ZSB0byBiZSB1c2VkIGZvciBCUlIgcmVnaXN0ZXIgZmlsbGluZyBpbiBPdmVyU2FtcGxpbmdfMTYNCi0gKiBjYXNlDQotICovDQotI2RlZmluZSBfX0xMX1VTQVJUX0RJVl9TQU1QTElORzE2KF9fUEVSSVBIQ0xLX18sIF9fUFJFU0NBTEVSX18sIF9fQkFVRFJBVEVfXykgXA0KLSAgKCgoKF9fUEVSSVBIQ0xLX18pIC8gKFVTQVJUX1BSRVNDQUxFUl9UQUJbKF9fUFJFU0NBTEVSX18pXSkpICsgICAgICAgICAgICAgIFwNCi0gICAgKChfX0JBVURSQVRFX18pIC8gMlUpKSAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgKF9fQkFVRFJBVEVfXykpDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotDQotLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FeHBvcnRlZF9GdW5jdGlvbnMgVVNBUlQgRXhwb3J0ZWQgRnVuY3Rpb25zDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VGX0NvbmZpZ3VyYXRpb24gQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgVVNBUlQgRW5hYmxlDQotICogQHJtdG9sbCBDUjEgICAgICAgICAgVUUgICAgICAgICAgICBMTF9VU0FSVF9FbmFibGUNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIFNFVF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9VRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgVVNBUlQgRGlzYWJsZSAoYWxsIFVTQVJUIHByZXNjYWxlcnMgYW5kIG91dHB1dHMgYXJlIGRpc2FibGVkKQ0KLSAqIEBub3RlICAgV2hlbiBVU0FSVCBpcyBkaXNhYmxlZCwgVVNBUlQgcHJlc2NhbGVycyBhbmQgb3V0cHV0cyBhcmUgc3RvcHBlZA0KLSAqIGltbWVkaWF0ZWx5LCBhbmQgY3VycmVudCBvcGVyYXRpb25zIGFyZSBkaXNjYXJkZWQuIFRoZSBjb25maWd1cmF0aW9uIG9mIHRoZQ0KLSAqIFVTQVJUIGlzIGtlcHQsIGJ1dCBhbGwgdGhlIHN0YXR1cyBmbGFncywgaW4gdGhlIFVTQVJUeF9JU1IgYXJlIHNldCB0byB0aGVpcg0KLSAqIGRlZmF1bHQgdmFsdWVzLg0KLSAqIEBybXRvbGwgQ1IxICAgICAgICAgIFVFICAgICAgICAgICAgTExfVVNBUlRfRGlzYWJsZQ0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIENMRUFSX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1VFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBJbmRpY2F0ZSBpZiBVU0FSVCBpcyBlbmFibGVkDQotICogQHJtdG9sbCBDUjEgICAgICAgICAgVUUgICAgICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWQNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWQoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1VFKSA9PSAoVVNBUlRfQ1IxX1VFKSkgPyAxVUwgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEZJRk8gTW9kZSBFbmFibGUNCi0gKiBAbm90ZSAgIE1hY3JvIElTX1VBUlRfRklGT19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3INCi0gKiBub3QgRklGTyBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuDQotICogQHJtdG9sbCBDUjEgICAgICAgICAgRklGT0VOICAgICAgICBMTF9VU0FSVF9FbmFibGVGSUZPDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVGSUZPKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgU0VUX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX0ZJRk9FTik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRklGTyBNb2RlIERpc2FibGUNCi0gKiBAbm90ZSAgIE1hY3JvIElTX1VBUlRfRklGT19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3INCi0gKiBub3QgRklGTyBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuDQotICogQHJtdG9sbCBDUjEgICAgICAgICAgRklGT0VOICAgICAgICBMTF9VU0FSVF9EaXNhYmxlRklGTw0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZUZJRk8oVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7DQotICBDTEVBUl9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9GSUZPRU4pOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEluZGljYXRlIGlmIEZJRk8gTW9kZSBpcyBlbmFibGVkDQotICogQG5vdGUgICBNYWNybyBJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yDQotICogbm90IEZJRk8gbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLg0KLSAqIEBybXRvbGwgQ1IxICAgICAgICAgIEZJRk9FTiAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkRklGTw0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZEZJRk8oVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX0ZJRk9FTikgPT0gKFVTQVJUX0NSMV9GSUZPRU4pKQ0KLSAgICAgICAgICAgICAgPyAxVUwNCi0gICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDb25maWd1cmUgVFggRklGTyBUaHJlc2hvbGQNCi0gKiBAbm90ZSAgIE1hY3JvIElTX1VBUlRfRklGT19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3INCi0gKiBub3QgRklGTyBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuDQotICogQHJtdG9sbCBDUjMgICAgICAgICAgVFhGVENGRyAgICAgICBMTF9VU0FSVF9TZXRUWEZJRk9UaHJlc2hvbGQNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEBwYXJhbSAgVGhyZXNob2xkIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRklGT1RIUkVTSE9MRF8xXzgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9GSUZPVEhSRVNIT0xEXzFfNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0ZJRk9USFJFU0hPTERfMV8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRklGT1RIUkVTSE9MRF8zXzQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9GSUZPVEhSRVNIT0xEXzdfOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0ZJRk9USFJFU0hPTERfOF84DQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0VFhGSUZPVGhyZXNob2xkKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGhyZXNob2xkKSB7DQotICBBVE9NSUNfTU9ESUZZX1JFRyhVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX1RYRlRDRkcsDQotICAgICAgICAgICAgICAgICAgICBUaHJlc2hvbGQgPDwgVVNBUlRfQ1IzX1RYRlRDRkdfUG9zKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBSZXR1cm4gVFggRklGTyBUaHJlc2hvbGQgQ29uZmlndXJhdGlvbg0KLSAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9GSUZPX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvcg0KLSAqIG5vdCBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4NCi0gKiBAcm10b2xsIENSMyAgICAgICAgICBUWEZUQ0ZHICAgICAgIExMX1VTQVJUX0dldFRYRklGT1RocmVzaG9sZA0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0ZJRk9USFJFU0hPTERfMV84DQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRklGT1RIUkVTSE9MRF8xXzQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9GSUZPVEhSRVNIT0xEXzFfMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0ZJRk9USFJFU0hPTERfM180DQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRklGT1RIUkVTSE9MRF83XzgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9GSUZPVEhSRVNIT0xEXzhfOA0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXRUWEZJRk9UaHJlc2hvbGQoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX1RYRlRDRkcpID4+DQotICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjNfVFhGVENGR19Qb3MpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENvbmZpZ3VyZSBSWCBGSUZPIFRocmVzaG9sZA0KLSAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9GSUZPX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvcg0KLSAqIG5vdCBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4NCi0gKiBAcm10b2xsIENSMyAgICAgICAgICBSWEZUQ0ZHICAgICAgIExMX1VTQVJUX1NldFJYRklGT1RocmVzaG9sZA0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHBhcmFtICBUaHJlc2hvbGQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9GSUZPVEhSRVNIT0xEXzFfOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0ZJRk9USFJFU0hPTERfMV80DQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRklGT1RIUkVTSE9MRF8xXzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9GSUZPVEhSRVNIT0xEXzNfNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0ZJRk9USFJFU0hPTERfN184DQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRklGT1RIUkVTSE9MRF84XzgNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRSWEZJRk9UaHJlc2hvbGQoVVNBUlRfVHlwZURlZiAqVVNBUlR4LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaHJlc2hvbGQpIHsNCi0gIEFUT01JQ19NT0RJRllfUkVHKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfUlhGVENGRywNCi0gICAgICAgICAgICAgICAgICAgIFRocmVzaG9sZCA8PCBVU0FSVF9DUjNfUlhGVENGR19Qb3MpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJldHVybiBSWCBGSUZPIFRocmVzaG9sZCBDb25maWd1cmF0aW9uDQotICogQG5vdGUgICBNYWNybyBJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yDQotICogbm90IEZJRk8gbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLg0KLSAqIEBybXRvbGwgQ1IzICAgICAgICAgIFJYRlRDRkcgICAgICAgTExfVVNBUlRfR2V0UlhGSUZPVGhyZXNob2xkDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRklGT1RIUkVTSE9MRF8xXzgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9GSUZPVEhSRVNIT0xEXzFfNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0ZJRk9USFJFU0hPTERfMV8yDQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRklGT1RIUkVTSE9MRF8zXzQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9GSUZPVEhSRVNIT0xEXzdfOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0ZJRk9USFJFU0hPTERfOF84DQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldFJYRklGT1RocmVzaG9sZChVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfUlhGVENGRykgPj4NCi0gICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSM19SWEZUQ0ZHX1Bvcyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ29uZmlndXJlIFRYIGFuZCBSWCBGSUZPcyBUaHJlc2hvbGQNCi0gKiBAbm90ZSAgIE1hY3JvIElTX1VBUlRfRklGT19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3INCi0gKiBub3QgRklGTyBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuDQotICogQHJtdG9sbCBDUjMgICAgICAgICAgVFhGVENGRyAgICAgICBMTF9VU0FSVF9Db25maWdGSUZPc1RocmVzaG9sZFxuDQotICogICAgICAgICBDUjMgICAgICAgICAgUlhGVENGRyAgICAgICBMTF9VU0FSVF9Db25maWdGSUZPc1RocmVzaG9sZA0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHBhcmFtICBUWFRocmVzaG9sZCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0ZJRk9USFJFU0hPTERfMV84DQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRklGT1RIUkVTSE9MRF8xXzQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9GSUZPVEhSRVNIT0xEXzFfMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0ZJRk9USFJFU0hPTERfM180DQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRklGT1RIUkVTSE9MRF83XzgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9GSUZPVEhSRVNIT0xEXzhfOA0KLSAqIEBwYXJhbSAgUlhUaHJlc2hvbGQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9GSUZPVEhSRVNIT0xEXzFfOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0ZJRk9USFJFU0hPTERfMV80DQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRklGT1RIUkVTSE9MRF8xXzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9GSUZPVEhSRVNIT0xEXzNfNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0ZJRk9USFJFU0hPTERfN184DQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRklGT1RIUkVTSE9MRF84XzgNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9Db25maWdGSUZPc1RocmVzaG9sZChVU0FSVF9UeXBlRGVmICpVU0FSVHgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVFhUaHJlc2hvbGQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUlhUaHJlc2hvbGQpIHsNCi0gIEFUT01JQ19NT0RJRllfUkVHKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfVFhGVENGRyB8IFVTQVJUX0NSM19SWEZUQ0ZHLA0KLSAgICAgICAgICAgICAgICAgICAgKFRYVGhyZXNob2xkIDw8IFVTQVJUX0NSM19UWEZUQ0ZHX1BvcykgfA0KLSAgICAgICAgICAgICAgICAgICAgICAgIChSWFRocmVzaG9sZCA8PCBVU0FSVF9DUjNfUlhGVENGR19Qb3MpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBVU0FSVCBlbmFibGVkIGluIFNUT1AgTW9kZS4NCi0gKiBAbm90ZSAgIFdoZW4gdGhpcyBmdW5jdGlvbiBpcyBlbmFibGVkLCBVU0FSVCBpcyBhYmxlIHRvIHdha2UgdXAgdGhlIE1DVSBmcm9tDQotICogU3RvcCBtb2RlLCBwcm92aWRlZCB0aGF0IFVTQVJUIGNsb2NrIHNlbGVjdGlvbiBpcyBIU0kgb3IgTFNFIGluIFJDQy4NCi0gKiBAbm90ZSAgIE1hY3JvIElTX1VBUlRfV0FLRVVQX0ZST01TVE9QX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sNCi0gKiB3aGV0aGVyIG9yIG5vdCBXYWtlLXVwIGZyb20gU3RvcCBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHgNCi0gKiBpbnN0YW5jZS4NCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBVRVNNICAgICAgICAgIExMX1VTQVJUX0VuYWJsZUluU3RvcE1vZGUNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZUluU3RvcE1vZGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7DQotICBBVE9NSUNfU0VUX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1VFU00pOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFVTQVJUIGRpc2FibGVkIGluIFNUT1AgTW9kZS4NCi0gKiBAbm90ZSAgIFdoZW4gdGhpcyBmdW5jdGlvbiBpcyBkaXNhYmxlZCwgVVNBUlQgaXMgbm90IGFibGUgdG8gd2FrZSB1cCB0aGUgTUNVDQotICogZnJvbSBTdG9wIG1vZGUNCi0gKiBAbm90ZSAgIE1hY3JvIElTX1VBUlRfV0FLRVVQX0ZST01TVE9QX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sNCi0gKiB3aGV0aGVyIG9yIG5vdCBXYWtlLXVwIGZyb20gU3RvcCBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHgNCi0gKiBpbnN0YW5jZS4NCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBVRVNNICAgICAgICAgIExMX1VTQVJUX0Rpc2FibGVJblN0b3BNb2RlDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlSW5TdG9wTW9kZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIEFUT01JQ19DTEVBUl9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9VRVNNKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBJbmRpY2F0ZSBpZiBVU0FSVCBpcyBlbmFibGVkIGluIFNUT1AgTW9kZSAoYWJsZSB0byB3YWtlIHVwIE1DVSBmcm9tDQotICogU3RvcCBtb2RlIG9yIG5vdCkNCi0gKiBAbm90ZSAgIE1hY3JvIElTX1VBUlRfV0FLRVVQX0ZST01TVE9QX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sNCi0gKiB3aGV0aGVyIG9yIG5vdCBXYWtlLXVwIGZyb20gU3RvcCBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHgNCi0gKiBpbnN0YW5jZS4NCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBVRVNNICAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZEluU3RvcE1vZGUNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRJblN0b3BNb2RlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9VRVNNKSA9PSAoVVNBUlRfQ1IxX1VFU00pKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmVjZWl2ZXIgRW5hYmxlIChSZWNlaXZlciBpcyBlbmFibGVkIGFuZCBiZWdpbnMgc2VhcmNoaW5nIGZvciBhIHN0YXJ0DQotICogYml0KQ0KLSAqIEBybXRvbGwgQ1IxICAgICAgICAgIFJFICAgICAgICAgICAgTExfVVNBUlRfRW5hYmxlRGlyZWN0aW9uUngNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZURpcmVjdGlvblJ4KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgQVRPTUlDX1NFVF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9SRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmVjZWl2ZXIgRGlzYWJsZQ0KLSAqIEBybXRvbGwgQ1IxICAgICAgICAgIFJFICAgICAgICAgICAgTExfVVNBUlRfRGlzYWJsZURpcmVjdGlvblJ4DQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlRGlyZWN0aW9uUngoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7DQotICBBVE9NSUNfQ0xFQVJfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUkUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFRyYW5zbWl0dGVyIEVuYWJsZQ0KLSAqIEBybXRvbGwgQ1IxICAgICAgICAgIFRFICAgICAgICAgICAgTExfVVNBUlRfRW5hYmxlRGlyZWN0aW9uVHgNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZURpcmVjdGlvblR4KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgQVRPTUlDX1NFVF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9URSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgVHJhbnNtaXR0ZXIgRGlzYWJsZQ0KLSAqIEBybXRvbGwgQ1IxICAgICAgICAgIFRFICAgICAgICAgICAgTExfVVNBUlRfRGlzYWJsZURpcmVjdGlvblR4DQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlRGlyZWN0aW9uVHgoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7DQotICBBVE9NSUNfQ0xFQVJfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfVEUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENvbmZpZ3VyZSBzaW11bHRhbmVvdXNseSBlbmFibGVkL2Rpc2FibGVkIHN0YXRlcw0KLSAqICAgICAgICAgb2YgVHJhbnNtaXR0ZXIgYW5kIFJlY2VpdmVyDQotICogQHJtdG9sbCBDUjEgICAgICAgICAgUkUgICAgICAgICAgICBMTF9VU0FSVF9TZXRUcmFuc2ZlckRpcmVjdGlvblxuDQotICogICAgICAgICBDUjEgICAgICAgICAgVEUgICAgICAgICAgICBMTF9VU0FSVF9TZXRUcmFuc2ZlckRpcmVjdGlvbg0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHBhcmFtICBUcmFuc2ZlckRpcmVjdGlvbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0RJUkVDVElPTl9OT05FDQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRElSRUNUSU9OX1JYDQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRElSRUNUSU9OX1RYDQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRElSRUNUSU9OX1RYX1JYDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0VHJhbnNmZXJEaXJlY3Rpb24oVVNBUlRfVHlwZURlZiAqVVNBUlR4LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRyYW5zZmVyRGlyZWN0aW9uKSB7DQotICBBVE9NSUNfTU9ESUZZX1JFRyhVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1JFIHwgVVNBUlRfQ1IxX1RFLA0KLSAgICAgICAgICAgICAgICAgICAgVHJhbnNmZXJEaXJlY3Rpb24pOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJldHVybiBlbmFibGVkL2Rpc2FibGVkIHN0YXRlcyBvZiBUcmFuc21pdHRlciBhbmQgUmVjZWl2ZXINCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBSRSAgICAgICAgICAgIExMX1VTQVJUX0dldFRyYW5zZmVyRGlyZWN0aW9uXG4NCi0gKiAgICAgICAgIENSMSAgICAgICAgICBURSAgICAgICAgICAgIExMX1VTQVJUX0dldFRyYW5zZmVyRGlyZWN0aW9uDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRElSRUNUSU9OX05PTkUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9ESVJFQ1RJT05fUlgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9ESVJFQ1RJT05fVFgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9ESVJFQ1RJT05fVFhfUlgNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0VHJhbnNmZXJEaXJlY3Rpb24oVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1JFIHwgVVNBUlRfQ1IxX1RFKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ29uZmlndXJlIFBhcml0eSAoZW5hYmxlZC9kaXNhYmxlZCBhbmQgcGFyaXR5IG1vZGUgaWYgZW5hYmxlZCkuDQotICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIHNlbGVjdHMgaWYgaGFyZHdhcmUgcGFyaXR5IGNvbnRyb2wgKGdlbmVyYXRpb24gYW5kDQotICogZGV0ZWN0aW9uKSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLiBXaGVuIHRoZSBwYXJpdHkgY29udHJvbCBpcyBlbmFibGVkIChPZGQgb3INCi0gKiBFdmVuKSwgY29tcHV0ZWQgcGFyaXR5IGJpdCBpcyBpbnNlcnRlZCBhdCB0aGUgTVNCIHBvc2l0aW9uICg5dGggb3IgOHRoIGJpdA0KLSAqIGRlcGVuZGluZyBvbiBkYXRhIHdpZHRoKSBhbmQgcGFyaXR5IGlzIGNoZWNrZWQgb24gdGhlIHJlY2VpdmVkIGRhdGEuDQotICogQHJtdG9sbCBDUjEgICAgICAgICAgUFMgICAgICAgICAgICBMTF9VU0FSVF9TZXRQYXJpdHlcbg0KLSAqICAgICAgICAgQ1IxICAgICAgICAgIFBDRSAgICAgICAgICAgTExfVVNBUlRfU2V0UGFyaXR5DQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcGFyYW0gIFBhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BBUklUWV9OT05FDQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUEFSSVRZX0VWRU4NCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QQVJJVFlfT0REDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0UGFyaXR5KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUGFyaXR5KSB7DQotICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUFMgfCBVU0FSVF9DUjFfUENFLCBQYXJpdHkpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJldHVybiBQYXJpdHkgY29uZmlndXJhdGlvbiAoZW5hYmxlZC9kaXNhYmxlZCBhbmQgcGFyaXR5IG1vZGUgaWYNCi0gKiBlbmFibGVkKQ0KLSAqIEBybXRvbGwgQ1IxICAgICAgICAgIFBTICAgICAgICAgICAgTExfVVNBUlRfR2V0UGFyaXR5XG4NCi0gKiAgICAgICAgIENSMSAgICAgICAgICBQQ0UgICAgICAgICAgIExMX1VTQVJUX0dldFBhcml0eQ0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BBUklUWV9OT05FDQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUEFSSVRZX0VWRU4NCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QQVJJVFlfT0REDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldFBhcml0eShVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUFMgfCBVU0FSVF9DUjFfUENFKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IFJlY2VpdmVyIFdha2UgVXAgbWV0aG9kIGZyb20gTXV0ZSBtb2RlLg0KLSAqIEBybXRvbGwgQ1IxICAgICAgICAgIFdBS0UgICAgICAgICAgTExfVVNBUlRfU2V0V2FrZVVwTWV0aG9kDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcGFyYW0gIE1ldGhvZCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1dBS0VVUF9JRExFTElORQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1dBS0VVUF9BRERSRVNTTUFSSw0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldFdha2VVcE1ldGhvZChVU0FSVF9UeXBlRGVmICpVU0FSVHgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE1ldGhvZCkgew0KLSAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1dBS0UsIE1ldGhvZCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmV0dXJuIFJlY2VpdmVyIFdha2UgVXAgbWV0aG9kIGZyb20gTXV0ZSBtb2RlDQotICogQHJtdG9sbCBDUjEgICAgICAgICAgV0FLRSAgICAgICAgICBMTF9VU0FSVF9HZXRXYWtlVXBNZXRob2QNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9XQUtFVVBfSURMRUxJTkUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9XQUtFVVBfQUREUkVTU01BUksNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0V2FrZVVwTWV0aG9kKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9XQUtFKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IFdvcmQgbGVuZ3RoIChpLmUuIG5iIG9mIGRhdGEgYml0cywgZXhjbHVkaW5nIHN0YXJ0IGFuZCBzdG9wIGJpdHMpDQotICogQHJtdG9sbCBDUjEgICAgICAgICAgTTAgICAgICAgICAgICBMTF9VU0FSVF9TZXREYXRhV2lkdGhcbg0KLSAqICAgICAgICAgQ1IxICAgICAgICAgIE0xICAgICAgICAgICAgTExfVVNBUlRfU2V0RGF0YVdpZHRoDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcGFyYW0gIERhdGFXaWR0aCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0RBVEFXSURUSF83Qg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0RBVEFXSURUSF84Qg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0RBVEFXSURUSF85Qg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldERhdGFXaWR0aChVU0FSVF9UeXBlRGVmICpVU0FSVHgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IERhdGFXaWR0aCkgew0KLSAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX00sIERhdGFXaWR0aCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmV0dXJuIFdvcmQgbGVuZ3RoIChpLmUuIG5iIG9mIGRhdGEgYml0cywgZXhjbHVkaW5nIHN0YXJ0IGFuZCBzdG9wDQotICogYml0cykNCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBNMCAgICAgICAgICAgIExMX1VTQVJUX0dldERhdGFXaWR0aFxuDQotICogICAgICAgICBDUjEgICAgICAgICAgTTEgICAgICAgICAgICBMTF9VU0FSVF9HZXREYXRhV2lkdGgNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9EQVRBV0lEVEhfN0INCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9EQVRBV0lEVEhfOEINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9EQVRBV0lEVEhfOUINCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0RGF0YVdpZHRoKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9NKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQWxsb3cgc3dpdGNoIGJldHdlZW4gTXV0ZSBNb2RlIGFuZCBBY3RpdmUgbW9kZQ0KLSAqIEBybXRvbGwgQ1IxICAgICAgICAgIE1NRSAgICAgICAgICAgTExfVVNBUlRfRW5hYmxlTXV0ZU1vZGUNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZU11dGVNb2RlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgQVRPTUlDX1NFVF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9NTUUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFByZXZlbnQgTXV0ZSBNb2RlIHVzZS4gU2V0IFJlY2VpdmVyIGluIGFjdGl2ZSBtb2RlIHBlcm1hbmVudGx5Lg0KLSAqIEBybXRvbGwgQ1IxICAgICAgICAgIE1NRSAgICAgICAgICAgTExfVVNBUlRfRGlzYWJsZU11dGVNb2RlDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlTXV0ZU1vZGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7DQotICBBVE9NSUNfQ0xFQVJfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfTU1FKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBJbmRpY2F0ZSBpZiBzd2l0Y2ggYmV0d2VlbiBNdXRlIE1vZGUgYW5kIEFjdGl2ZSBtb2RlIGlzIGFsbG93ZWQNCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBNTUUgICAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZE11dGVNb2RlDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkTXV0ZU1vZGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX01NRSkgPT0gKFVTQVJUX0NSMV9NTUUpKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCBPdmVyc2FtcGxpbmcgdG8gOC1iaXQgb3IgMTYtYml0IG1vZGUNCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBPVkVSOCAgICAgICAgIExMX1VTQVJUX1NldE92ZXJTYW1wbGluZw0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHBhcmFtICBPdmVyU2FtcGxpbmcgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9PVkVSU0FNUExJTkdfMTYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9PVkVSU0FNUExJTkdfOA0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldE92ZXJTYW1wbGluZyhVU0FSVF9UeXBlRGVmICpVU0FSVHgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE92ZXJTYW1wbGluZykgew0KLSAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX09WRVI4LCBPdmVyU2FtcGxpbmcpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJldHVybiBPdmVyc2FtcGxpbmcgbW9kZQ0KLSAqIEBybXRvbGwgQ1IxICAgICAgICAgIE9WRVI4ICAgICAgICAgTExfVVNBUlRfR2V0T3ZlclNhbXBsaW5nDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfT1ZFUlNBTVBMSU5HXzE2DQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfT1ZFUlNBTVBMSU5HXzgNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0T3ZlclNhbXBsaW5nKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9PVkVSOCkpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENvbmZpZ3VyZSBpZiBDbG9jayBwdWxzZSBvZiB0aGUgbGFzdCBkYXRhIGJpdCBpcyBvdXRwdXQgdG8gdGhlIFNDTEsNCi0gKiBwaW4gb3Igbm90DQotICogQG5vdGUgICBNYWNybyBJU19VU0FSVF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90DQotICogICAgICAgICBTeW5jaHJvbm91cyBtb2RlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLg0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgIExCQ0wgICAgICAgICAgTExfVVNBUlRfU2V0TGFzdENsa1B1bHNlT3V0cHV0DQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcGFyYW0gIExhc3RCaXRDbG9ja1B1bHNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfTEFTVENMS1BVTFNFX05PX09VVFBVVA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0xBU1RDTEtQVUxTRV9PVVRQVVQNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRMYXN0Q2xrUHVsc2VPdXRwdXQoDQotICAgIFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgdWludDMyX3QgTGFzdEJpdENsb2NrUHVsc2UpIHsNCi0gIE1PRElGWV9SRUcoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9MQkNMLCBMYXN0Qml0Q2xvY2tQdWxzZSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmV0cmlldmUgQ2xvY2sgcHVsc2Ugb2YgdGhlIGxhc3QgZGF0YSBiaXQgb3V0cHV0IGNvbmZpZ3VyYXRpb24NCi0gKiAgICAgICAgIChMYXN0IGJpdCBDbG9jayBwdWxzZSBvdXRwdXQgdG8gdGhlIFNDTEsgcGluIG9yIG5vdCkNCi0gKiBAbm90ZSAgIE1hY3JvIElTX1VTQVJUX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QNCi0gKiAgICAgICAgIFN5bmNocm9ub3VzIG1vZGUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuDQotICogQHJtdG9sbCBDUjIgICAgICAgICAgTEJDTCAgICAgICAgICBMTF9VU0FSVF9HZXRMYXN0Q2xrUHVsc2VPdXRwdXQNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9MQVNUQ0xLUFVMU0VfTk9fT1VUUFVUDQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfTEFTVENMS1BVTFNFX09VVFBVVA0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXRMYXN0Q2xrUHVsc2VPdXRwdXQoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0xCQ0wpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZWxlY3QgdGhlIHBoYXNlIG9mIHRoZSBjbG9jayBvdXRwdXQgb24gdGhlIFNDTEsgcGluIGluIHN5bmNocm9ub3VzDQotICogbW9kZQ0KLSAqIEBub3RlICAgTWFjcm8gSVNfVVNBUlRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdA0KLSAqICAgICAgICAgU3luY2hyb25vdXMgbW9kZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4NCi0gKiBAcm10b2xsIENSMiAgICAgICAgICBDUEhBICAgICAgICAgIExMX1VTQVJUX1NldENsb2NrUGhhc2UNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEBwYXJhbSAgQ2xvY2tQaGFzZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BIQVNFXzFFREdFDQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUEhBU0VfMkVER0UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRDbG9ja1BoYXNlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENsb2NrUGhhc2UpIHsNCi0gIE1PRElGWV9SRUcoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9DUEhBLCBDbG9ja1BoYXNlKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBSZXR1cm4gcGhhc2Ugb2YgdGhlIGNsb2NrIG91dHB1dCBvbiB0aGUgU0NMSyBwaW4gaW4gc3luY2hyb25vdXMgbW9kZQ0KLSAqIEBub3RlICAgTWFjcm8gSVNfVVNBUlRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdA0KLSAqICAgICAgICAgU3luY2hyb25vdXMgbW9kZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4NCi0gKiBAcm10b2xsIENSMiAgICAgICAgICBDUEhBICAgICAgICAgIExMX1VTQVJUX0dldENsb2NrUGhhc2UNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QSEFTRV8xRURHRQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BIQVNFXzJFREdFDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldENsb2NrUGhhc2UoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0NQSEEpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZWxlY3QgdGhlIHBvbGFyaXR5IG9mIHRoZSBjbG9jayBvdXRwdXQgb24gdGhlIFNDTEsgcGluIGluDQotICogc3luY2hyb25vdXMgbW9kZQ0KLSAqIEBub3RlICAgTWFjcm8gSVNfVVNBUlRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdA0KLSAqICAgICAgICAgU3luY2hyb25vdXMgbW9kZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4NCi0gKiBAcm10b2xsIENSMiAgICAgICAgICBDUE9MICAgICAgICAgIExMX1VTQVJUX1NldENsb2NrUG9sYXJpdHkNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEBwYXJhbSAgQ2xvY2tQb2xhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BPTEFSSVRZX0xPVw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BPTEFSSVRZX0hJR0gNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRDbG9ja1BvbGFyaXR5KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENsb2NrUG9sYXJpdHkpIHsNCi0gIE1PRElGWV9SRUcoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9DUE9MLCBDbG9ja1BvbGFyaXR5KTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBSZXR1cm4gcG9sYXJpdHkgb2YgdGhlIGNsb2NrIG91dHB1dCBvbiB0aGUgU0NMSyBwaW4gaW4gc3luY2hyb25vdXMNCi0gKiBtb2RlDQotICogQG5vdGUgICBNYWNybyBJU19VU0FSVF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90DQotICogICAgICAgICBTeW5jaHJvbm91cyBtb2RlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLg0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgIENQT0wgICAgICAgICAgTExfVVNBUlRfR2V0Q2xvY2tQb2xhcml0eQ0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BPTEFSSVRZX0xPVw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BPTEFSSVRZX0hJR0gNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0Q2xvY2tQb2xhcml0eShVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfQ1BPTCkpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENvbmZpZ3VyZSBDbG9jayBzaWduYWwgZm9ybWF0IChQaGFzZSBQb2xhcml0eSBhbmQgY2hvaWNlIGFib3V0IG91dHB1dA0KLSAqIG9mIGxhc3QgYml0IGNsb2NrIHB1bHNlKQ0KLSAqIEBub3RlICAgTWFjcm8gSVNfVVNBUlRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdA0KLSAqICAgICAgICAgU3luY2hyb25vdXMgbW9kZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4NCi0gKiBAbm90ZSAgIENhbGwgb2YgdGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIGZvbGxvd2luZyBmdW5jdGlvbiBjYWxsDQotICogc2VxdWVuY2UgOg0KLSAqICAgICAgICAgLSBDbG9jayBQaGFzZSBjb25maWd1cmF0aW9uIHVzaW5nIEByZWYgTExfVVNBUlRfU2V0Q2xvY2tQaGFzZSgpDQotICogZnVuY3Rpb24NCi0gKiAgICAgICAgIC0gQ2xvY2sgUG9sYXJpdHkgY29uZmlndXJhdGlvbiB1c2luZyBAcmVmIExMX1VTQVJUX1NldENsb2NrUG9sYXJpdHkoKQ0KLSAqIGZ1bmN0aW9uDQotICogICAgICAgICAtIE91dHB1dCBvZiBMYXN0IGJpdCBDbG9jayBwdWxzZSBjb25maWd1cmF0aW9uIHVzaW5nIEByZWYNCi0gKiBMTF9VU0FSVF9TZXRMYXN0Q2xrUHVsc2VPdXRwdXQoKSBmdW5jdGlvbg0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgIENQSEEgICAgICAgICAgTExfVVNBUlRfQ29uZmlnQ2xvY2tcbg0KLSAqICAgICAgICAgQ1IyICAgICAgICAgIENQT0wgICAgICAgICAgTExfVVNBUlRfQ29uZmlnQ2xvY2tcbg0KLSAqICAgICAgICAgQ1IyICAgICAgICAgIExCQ0wgICAgICAgICAgTExfVVNBUlRfQ29uZmlnQ2xvY2sNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEBwYXJhbSAgUGhhc2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QSEFTRV8xRURHRQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BIQVNFXzJFREdFDQotICogQHBhcmFtICBQb2xhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BPTEFSSVRZX0xPVw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BPTEFSSVRZX0hJR0gNCi0gKiBAcGFyYW0gIExCQ1BPdXRwdXQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9MQVNUQ0xLUFVMU0VfTk9fT1VUUFVUDQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfTEFTVENMS1BVTFNFX09VVFBVVA0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0NvbmZpZ0Nsb2NrKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgdWludDMyX3QgUGhhc2UsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUG9sYXJpdHksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgTEJDUE91dHB1dCkgew0KLSAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0NQSEEgfCBVU0FSVF9DUjJfQ1BPTCB8IFVTQVJUX0NSMl9MQkNMLA0KLSAgICAgICAgICAgICBQaGFzZSB8IFBvbGFyaXR5IHwgTEJDUE91dHB1dCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ29uZmlndXJlIENsb2NrIHNvdXJjZSBwcmVzY2FsZXIgZm9yIGJhdWRyYXRlIGdlbmVyYXRvciBhbmQNCi0gKiBvdmVyc2FtcGxpbmcNCi0gKiBAbm90ZSAgIE1hY3JvIElTX1VBUlRfRklGT19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3INCi0gKiBub3QgRklGTyBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuDQotICogQHJtdG9sbCBQUkVTQyAgICAgICAgUFJFU0NBTEVSICAgICBMTF9VU0FSVF9TZXRQcmVzY2FsZXINCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEBwYXJhbSAgUHJlc2NhbGVyVmFsdWUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYyDQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVY4DQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjEwDQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjEyDQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjE2DQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjMyDQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjY0DQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjEyOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYyNTYNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRQcmVzY2FsZXIoVVNBUlRfVHlwZURlZiAqVVNBUlR4LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQcmVzY2FsZXJWYWx1ZSkgew0KLSAgTU9ESUZZX1JFRyhVU0FSVHgtPlBSRVNDLCBVU0FSVF9QUkVTQ19QUkVTQ0FMRVIsICh1aW50MTZfdClQcmVzY2FsZXJWYWx1ZSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmV0cmlldmUgdGhlIENsb2NrIHNvdXJjZSBwcmVzY2FsZXIgZm9yIGJhdWRyYXRlIGdlbmVyYXRvciBhbmQNCi0gKiBvdmVyc2FtcGxpbmcNCi0gKiBAbm90ZSAgIE1hY3JvIElTX1VBUlRfRklGT19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3INCi0gKiBub3QgRklGTyBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuDQotICogQHJtdG9sbCBQUkVTQyAgICAgICAgUFJFU0NBTEVSICAgICBMTF9VU0FSVF9HZXRQcmVzY2FsZXINCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYyDQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVY4DQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjEwDQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjEyDQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjE2DQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjMyDQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjY0DQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjEyOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYyNTYNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0UHJlc2NhbGVyKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5QUkVTQywgVVNBUlRfUFJFU0NfUFJFU0NBTEVSKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIENsb2NrIG91dHB1dCBvbiBTQ0xLIHBpbg0KLSAqIEBub3RlICAgTWFjcm8gSVNfVVNBUlRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdA0KLSAqICAgICAgICAgU3luY2hyb25vdXMgbW9kZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4NCi0gKiBAcm10b2xsIENSMiAgICAgICAgICBDTEtFTiAgICAgICAgIExMX1VTQVJUX0VuYWJsZVNDTEtPdXRwdXQNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZVNDTEtPdXRwdXQoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7DQotICBTRVRfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfQ0xLRU4pOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgQ2xvY2sgb3V0cHV0IG9uIFNDTEsgcGluDQotICogQG5vdGUgICBNYWNybyBJU19VU0FSVF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90DQotICogICAgICAgICBTeW5jaHJvbm91cyBtb2RlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLg0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgIENMS0VOICAgICAgICAgTExfVVNBUlRfRGlzYWJsZVNDTEtPdXRwdXQNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVTQ0xLT3V0cHV0KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfQ0xLRU4pOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEluZGljYXRlIGlmIENsb2NrIG91dHB1dCBvbiBTQ0xLIHBpbiBpcyBlbmFibGVkDQotICogQG5vdGUgICBNYWNybyBJU19VU0FSVF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90DQotICogICAgICAgICBTeW5jaHJvbm91cyBtb2RlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLg0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgIENMS0VOICAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkU0NMS091dHB1dA0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZFNDTEtPdXRwdXQoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0NMS0VOKSA9PSAoVVNBUlRfQ1IyX0NMS0VOKSkgPyAxVUwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IHRoZSBsZW5ndGggb2YgdGhlIHN0b3AgYml0cw0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgIFNUT1AgICAgICAgICAgTExfVVNBUlRfU2V0U3RvcEJpdHNMZW5ndGgNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEBwYXJhbSAgU3RvcEJpdHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9TVE9QQklUU18wXzUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9TVE9QQklUU18xDQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfU1RPUEJJVFNfMV81DQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfU1RPUEJJVFNfMg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldFN0b3BCaXRzTGVuZ3RoKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBTdG9wQml0cykgew0KLSAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX1NUT1AsIFN0b3BCaXRzKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBSZXRyaWV2ZSB0aGUgbGVuZ3RoIG9mIHRoZSBzdG9wIGJpdHMNCi0gKiBAcm10b2xsIENSMiAgICAgICAgICBTVE9QICAgICAgICAgIExMX1VTQVJUX0dldFN0b3BCaXRzTGVuZ3RoDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfU1RPUEJJVFNfMF81DQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfU1RPUEJJVFNfMQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1NUT1BCSVRTXzFfNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1NUT1BCSVRTXzINCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0U3RvcEJpdHNMZW5ndGgoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX1NUT1ApKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDb25maWd1cmUgQ2hhcmFjdGVyIGZyYW1lIGZvcm1hdCAoRGF0YXdpZHRoLCBQYXJpdHkgY29udHJvbCwgU3RvcA0KLSAqIEJpdHMpDQotICogQG5vdGUgICBDYWxsIG9mIHRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byBmb2xsb3dpbmcgZnVuY3Rpb24gY2FsbA0KLSAqIHNlcXVlbmNlIDoNCi0gKiAgICAgICAgIC0gRGF0YSBXaWR0aCBjb25maWd1cmF0aW9uIHVzaW5nIEByZWYgTExfVVNBUlRfU2V0RGF0YVdpZHRoKCkNCi0gKiBmdW5jdGlvbg0KLSAqICAgICAgICAgLSBQYXJpdHkgQ29udHJvbCBhbmQgbW9kZSBjb25maWd1cmF0aW9uIHVzaW5nIEByZWYNCi0gKiBMTF9VU0FSVF9TZXRQYXJpdHkoKSBmdW5jdGlvbg0KLSAqICAgICAgICAgLSBTdG9wIGJpdHMgY29uZmlndXJhdGlvbiB1c2luZyBAcmVmIExMX1VTQVJUX1NldFN0b3BCaXRzTGVuZ3RoKCkNCi0gKiBmdW5jdGlvbg0KLSAqIEBybXRvbGwgQ1IxICAgICAgICAgIFBTICAgICAgICAgICAgTExfVVNBUlRfQ29uZmlnQ2hhcmFjdGVyXG4NCi0gKiAgICAgICAgIENSMSAgICAgICAgICBQQ0UgICAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0NoYXJhY3RlclxuDQotICogICAgICAgICBDUjEgICAgICAgICAgTTAgICAgICAgICAgICBMTF9VU0FSVF9Db25maWdDaGFyYWN0ZXJcbg0KLSAqICAgICAgICAgQ1IxICAgICAgICAgIE0xICAgICAgICAgICAgTExfVVNBUlRfQ29uZmlnQ2hhcmFjdGVyXG4NCi0gKiAgICAgICAgIENSMiAgICAgICAgICBTVE9QICAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0NoYXJhY3Rlcg0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHBhcmFtICBEYXRhV2lkdGggVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9EQVRBV0lEVEhfN0INCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9EQVRBV0lEVEhfOEINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9EQVRBV0lEVEhfOUINCi0gKiBAcGFyYW0gIFBhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BBUklUWV9OT05FDQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUEFSSVRZX0VWRU4NCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QQVJJVFlfT0REDQotICogQHBhcmFtICBTdG9wQml0cyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1NUT1BCSVRTXzBfNQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1NUT1BCSVRTXzENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9TVE9QQklUU18xXzUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9TVE9QQklUU18yDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfQ29uZmlnQ2hhcmFjdGVyKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRGF0YVdpZHRoLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQYXJpdHksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFN0b3BCaXRzKSB7DQotICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUFMgfCBVU0FSVF9DUjFfUENFIHwgVVNBUlRfQ1IxX00sDQotICAgICAgICAgICAgIFBhcml0eSB8IERhdGFXaWR0aCk7DQotICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfU1RPUCwgU3RvcEJpdHMpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENvbmZpZ3VyZSBUWC9SWCBwaW5zIHN3YXBwaW5nIHNldHRpbmcuDQotICogQHJtdG9sbCBDUjIgICAgICAgICAgU1dBUCAgICAgICAgICBMTF9VU0FSVF9TZXRUWFJYU3dhcA0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHBhcmFtICBTd2FwQ29uZmlnIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfVFhSWF9TVEFOREFSRA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1RYUlhfU1dBUFBFRA0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldFRYUlhTd2FwKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBTd2FwQ29uZmlnKSB7DQotICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfU1dBUCwgU3dhcENvbmZpZyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmV0cmlldmUgVFgvUlggcGlucyBzd2FwcGluZyBjb25maWd1cmF0aW9uLg0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgIFNXQVAgICAgICAgICAgTExfVVNBUlRfR2V0VFhSWFN3YXANCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9UWFJYX1NUQU5EQVJEDQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfVFhSWF9TV0FQUEVEDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldFRYUlhTd2FwKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9TV0FQKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ29uZmlndXJlIFJYIHBpbiBhY3RpdmUgbGV2ZWwgbG9naWMNCi0gKiBAcm10b2xsIENSMiAgICAgICAgICBSWElOViAgICAgICAgIExMX1VTQVJUX1NldFJYUGluTGV2ZWwNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEBwYXJhbSAgUGluSW52TWV0aG9kIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUlhQSU5fTEVWRUxfU1RBTkRBUkQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9SWFBJTl9MRVZFTF9JTlZFUlRFRA0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldFJYUGluTGV2ZWwoVVNBUlRfVHlwZURlZiAqVVNBUlR4LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUGluSW52TWV0aG9kKSB7DQotICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfUlhJTlYsIFBpbkludk1ldGhvZCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmV0cmlldmUgUlggcGluIGFjdGl2ZSBsZXZlbCBsb2dpYyBjb25maWd1cmF0aW9uDQotICogQHJtdG9sbCBDUjIgICAgICAgICAgUlhJTlYgICAgICAgICBMTF9VU0FSVF9HZXRSWFBpbkxldmVsDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUlhQSU5fTEVWRUxfU1RBTkRBUkQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9SWFBJTl9MRVZFTF9JTlZFUlRFRA0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXRSWFBpbkxldmVsKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9SWElOVikpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENvbmZpZ3VyZSBUWCBwaW4gYWN0aXZlIGxldmVsIGxvZ2ljDQotICogQHJtdG9sbCBDUjIgICAgICAgICAgVFhJTlYgICAgICAgICBMTF9VU0FSVF9TZXRUWFBpbkxldmVsDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcGFyYW0gIFBpbkludk1ldGhvZCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1RYUElOX0xFVkVMX1NUQU5EQVJEDQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfVFhQSU5fTEVWRUxfSU5WRVJURUQNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRUWFBpbkxldmVsKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFBpbkludk1ldGhvZCkgew0KLSAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX1RYSU5WLCBQaW5JbnZNZXRob2QpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJldHJpZXZlIFRYIHBpbiBhY3RpdmUgbGV2ZWwgbG9naWMgY29uZmlndXJhdGlvbg0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgIFRYSU5WICAgICAgICAgTExfVVNBUlRfR2V0VFhQaW5MZXZlbA0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1RYUElOX0xFVkVMX1NUQU5EQVJEDQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfVFhQSU5fTEVWRUxfSU5WRVJURUQNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0VFhQaW5MZXZlbChVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfVFhJTlYpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDb25maWd1cmUgQmluYXJ5IGRhdGEgbG9naWMuDQotICogQG5vdGUgICBBbGxvdyB0byBkZWZpbmUgaG93IExvZ2ljYWwgZGF0YSBmcm9tIHRoZSBkYXRhIHJlZ2lzdGVyIGFyZQ0KLSAqIHNlbmQvcmVjZWl2ZWQgOiBlaXRoZXIgaW4gcG9zaXRpdmUvZGlyZWN0IGxvZ2ljICgxPUgsIDA9TCkgb3IgaW4NCi0gKiBuZWdhdGl2ZS9pbnZlcnNlIGxvZ2ljICgxPUwsIDA9SCkNCi0gKiBAcm10b2xsIENSMiAgICAgICAgICBEQVRBSU5WICAgICAgIExMX1VTQVJUX1NldEJpbmFyeURhdGFMb2dpYw0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHBhcmFtICBEYXRhTG9naWMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9CSU5BUllfTE9HSUNfUE9TSVRJVkUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9CSU5BUllfTE9HSUNfTkVHQVRJVkUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRCaW5hcnlEYXRhTG9naWMoVVNBUlRfVHlwZURlZiAqVVNBUlR4LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBEYXRhTG9naWMpIHsNCi0gIE1PRElGWV9SRUcoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9EQVRBSU5WLCBEYXRhTG9naWMpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJldHJpZXZlIEJpbmFyeSBkYXRhIGNvbmZpZ3VyYXRpb24NCi0gKiBAcm10b2xsIENSMiAgICAgICAgICBEQVRBSU5WICAgICAgIExMX1VTQVJUX0dldEJpbmFyeURhdGFMb2dpYw0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0JJTkFSWV9MT0dJQ19QT1NJVElWRQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0JJTkFSWV9MT0dJQ19ORUdBVElWRQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXRCaW5hcnlEYXRhTG9naWMoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0RBVEFJTlYpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDb25maWd1cmUgdHJhbnNmZXIgYml0IG9yZGVyIChlaXRoZXIgTGVzcyBvciBNb3N0IFNpZ25pZmljYW50IEJpdA0KLSAqIEZpcnN0KQ0KLSAqIEBub3RlICAgTVNCIEZpcnN0IG1lYW5zIGRhdGEgaXMgdHJhbnNtaXR0ZWQvcmVjZWl2ZWQgd2l0aCB0aGUgTVNCIGZpcnN0LA0KLSAqIGZvbGxvd2luZyB0aGUgc3RhcnQgYml0LiBMU0IgRmlyc3QgbWVhbnMgZGF0YSBpcyB0cmFuc21pdHRlZC9yZWNlaXZlZCB3aXRoDQotICogZGF0YSBiaXQgMCBmaXJzdCwgZm9sbG93aW5nIHRoZSBzdGFydCBiaXQuDQotICogQHJtdG9sbCBDUjIgICAgICAgICAgTVNCRklSU1QgICAgICBMTF9VU0FSVF9TZXRUcmFuc2ZlckJpdE9yZGVyDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcGFyYW0gIEJpdE9yZGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfQklUT1JERVJfTFNCRklSU1QNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9CSVRPUkRFUl9NU0JGSVJTVA0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldFRyYW5zZmVyQml0T3JkZXIoVVNBUlRfVHlwZURlZiAqVVNBUlR4LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQml0T3JkZXIpIHsNCi0gIE1PRElGWV9SRUcoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9NU0JGSVJTVCwgQml0T3JkZXIpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJldHVybiB0cmFuc2ZlciBiaXQgb3JkZXIgKGVpdGhlciBMZXNzIG9yIE1vc3QgU2lnbmlmaWNhbnQgQml0IEZpcnN0KQ0KLSAqIEBub3RlICAgTVNCIEZpcnN0IG1lYW5zIGRhdGEgaXMgdHJhbnNtaXR0ZWQvcmVjZWl2ZWQgd2l0aCB0aGUgTVNCIGZpcnN0LA0KLSAqIGZvbGxvd2luZyB0aGUgc3RhcnQgYml0LiBMU0IgRmlyc3QgbWVhbnMgZGF0YSBpcyB0cmFuc21pdHRlZC9yZWNlaXZlZCB3aXRoDQotICogZGF0YSBiaXQgMCBmaXJzdCwgZm9sbG93aW5nIHRoZSBzdGFydCBiaXQuDQotICogQHJtdG9sbCBDUjIgICAgICAgICAgTVNCRklSU1QgICAgICBMTF9VU0FSVF9HZXRUcmFuc2ZlckJpdE9yZGVyDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfQklUT1JERVJfTFNCRklSU1QNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9CSVRPUkRFUl9NU0JGSVJTVA0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXRUcmFuc2ZlckJpdE9yZGVyKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9NU0JGSVJTVCkpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSBBdXRvIEJhdWQtUmF0ZSBEZXRlY3Rpb24NCi0gKiBAbm90ZSAgIE1hY3JvIElTX1VTQVJUX0FVVE9CQVVEUkFURV9ERVRFQ1RJT05fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0bw0KLSAqIGNoZWNrIHdoZXRoZXIgb3Igbm90IEF1dG8gQmF1ZCBSYXRlIGRldGVjdGlvbiBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUNCi0gKiBVU0FSVHggaW5zdGFuY2UuDQotICogQHJtdG9sbCBDUjIgICAgICAgICAgQUJSRU4gICAgICAgICBMTF9VU0FSVF9FbmFibGVBdXRvQmF1ZFJhdGUNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZUF1dG9CYXVkUmF0ZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIFNFVF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9BQlJFTik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBBdXRvIEJhdWQtUmF0ZSBEZXRlY3Rpb24NCi0gKiBAbm90ZSAgIE1hY3JvIElTX1VTQVJUX0FVVE9CQVVEUkFURV9ERVRFQ1RJT05fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0bw0KLSAqIGNoZWNrIHdoZXRoZXIgb3Igbm90IEF1dG8gQmF1ZCBSYXRlIGRldGVjdGlvbiBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUNCi0gKiBVU0FSVHggaW5zdGFuY2UuDQotICogQHJtdG9sbCBDUjIgICAgICAgICAgQUJSRU4gICAgICAgICBMTF9VU0FSVF9EaXNhYmxlQXV0b0JhdWRSYXRlDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlQXV0b0JhdWRSYXRlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfQUJSRU4pOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEluZGljYXRlIGlmIEF1dG8gQmF1ZC1SYXRlIERldGVjdGlvbiBtZWNoYW5pc20gaXMgZW5hYmxlZA0KLSAqIEBub3RlICAgTWFjcm8gSVNfVVNBUlRfQVVUT0JBVURSQVRFX0RFVEVDVElPTl9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvDQotICogY2hlY2sgd2hldGhlciBvciBub3QgQXV0byBCYXVkIFJhdGUgZGV0ZWN0aW9uIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZQ0KLSAqIFVTQVJUeCBpbnN0YW5jZS4NCi0gKiBAcm10b2xsIENSMiAgICAgICAgICBBQlJFTiAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZEF1dG9CYXVkDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkQXV0b0JhdWQoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0FCUkVOKSA9PSAoVVNBUlRfQ1IyX0FCUkVOKSkgPyAxVUwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IEF1dG8gQmF1ZC1SYXRlIG1vZGUgYml0cw0KLSAqIEBub3RlICAgTWFjcm8gSVNfVVNBUlRfQVVUT0JBVURSQVRFX0RFVEVDVElPTl9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvDQotICogY2hlY2sgd2hldGhlciBvciBub3QgQXV0byBCYXVkIFJhdGUgZGV0ZWN0aW9uIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZQ0KLSAqIFVTQVJUeCBpbnN0YW5jZS4NCi0gKiBAcm10b2xsIENSMiAgICAgICAgICBBQlJNT0RFICAgICAgIExMX1VTQVJUX1NldEF1dG9CYXVkUmF0ZU1vZGUNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEBwYXJhbSAgQXV0b0JhdWRSYXRlTW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0FVVE9CQVVEX0RFVEVDVF9PTl9TVEFSVEJJVA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0FVVE9CQVVEX0RFVEVDVF9PTl9GQUxMSU5HRURHRQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0FVVE9CQVVEX0RFVEVDVF9PTl83Rl9GUkFNRQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0FVVE9CQVVEX0RFVEVDVF9PTl81NV9GUkFNRQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldEF1dG9CYXVkUmF0ZU1vZGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQXV0b0JhdWRSYXRlTW9kZSkgew0KLSAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0FCUk1PREUsIEF1dG9CYXVkUmF0ZU1vZGUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJldHVybiBBdXRvIEJhdWQtUmF0ZSBtb2RlDQotICogQG5vdGUgICBNYWNybyBJU19VU0FSVF9BVVRPQkFVRFJBVEVfREVURUNUSU9OX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8NCi0gKiBjaGVjayB3aGV0aGVyIG9yIG5vdCBBdXRvIEJhdWQgUmF0ZSBkZXRlY3Rpb24gZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlDQotICogVVNBUlR4IGluc3RhbmNlLg0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgIEFCUk1PREUgICAgICAgTExfVVNBUlRfR2V0QXV0b0JhdWRSYXRlTW9kZQ0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0FVVE9CQVVEX0RFVEVDVF9PTl9TVEFSVEJJVA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0FVVE9CQVVEX0RFVEVDVF9PTl9GQUxMSU5HRURHRQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0FVVE9CQVVEX0RFVEVDVF9PTl83Rl9GUkFNRQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0FVVE9CQVVEX0RFVEVDVF9PTl81NV9GUkFNRQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXRBdXRvQmF1ZFJhdGVNb2RlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9BQlJNT0RFKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIFJlY2VpdmVyIFRpbWVvdXQNCi0gKiBAcm10b2xsIENSMiAgICAgICAgICBSVE9FTiAgICAgICAgIExMX1VTQVJUX0VuYWJsZVJ4VGltZW91dA0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlUnhUaW1lb3V0KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgU0VUX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX1JUT0VOKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIFJlY2VpdmVyIFRpbWVvdXQNCi0gKiBAcm10b2xsIENSMiAgICAgICAgICBSVE9FTiAgICAgICAgIExMX1VTQVJUX0Rpc2FibGVSeFRpbWVvdXQNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVSeFRpbWVvdXQoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7DQotICBDTEVBUl9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9SVE9FTik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSW5kaWNhdGUgaWYgUmVjZWl2ZXIgVGltZW91dCBmZWF0dXJlIGlzIGVuYWJsZWQNCi0gKiBAcm10b2xsIENSMiAgICAgICAgICBSVE9FTiAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZFJ4VGltZW91dA0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZFJ4VGltZW91dChVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfUlRPRU4pID09IChVU0FSVF9DUjJfUlRPRU4pKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZXQgQWRkcmVzcyBvZiB0aGUgVVNBUlQgbm9kZS4NCi0gKiBAbm90ZSAgIFRoaXMgaXMgdXNlZCBpbiBtdWx0aXByb2Nlc3NvciBjb21tdW5pY2F0aW9uIGR1cmluZyBNdXRlIG1vZGUgb3IgU3RvcA0KLSAqIG1vZGUsIGZvciB3YWtlIHVwIHdpdGggYWRkcmVzcyBtYXJrIGRldGVjdGlvbi4NCi0gKiBAbm90ZSAgIDRiaXRzIGFkZHJlc3Mgbm9kZSBpcyB1c2VkIHdoZW4gNC1iaXQgQWRkcmVzcyBEZXRlY3Rpb24gaXMgc2VsZWN0ZWQNCi0gKiBpbiBBRERNNy4gKGI3LWI0IHNob3VsZCBiZSBzZXQgdG8gMCkgOGJpdHMgYWRkcmVzcyBub2RlIGlzIHVzZWQgd2hlbiA3LWJpdA0KLSAqIEFkZHJlc3MgRGV0ZWN0aW9uIGlzIHNlbGVjdGVkIGluIEFERE03LiAoVGhpcyBpcyB1c2VkIGluIG11bHRpcHJvY2Vzc29yDQotICogY29tbXVuaWNhdGlvbiBkdXJpbmcgTXV0ZSBtb2RlIG9yIFN0b3AgbW9kZSwgZm9yIHdha2UgdXAgd2l0aCA3LWJpdCBhZGRyZXNzDQotICogbWFyayBkZXRlY3Rpb24uIFRoZSBNU0Igb2YgdGhlIGNoYXJhY3RlciBzZW50IGJ5IHRoZSB0cmFuc21pdHRlciBzaG91bGQgYmUNCi0gKiBlcXVhbCB0byAxLiBJdCBtYXkgYWxzbyBiZSB1c2VkIGZvciBjaGFyYWN0ZXIgZGV0ZWN0aW9uIGR1cmluZyBub3JtYWwNCi0gKiByZWNlcHRpb24sIE11dGUgbW9kZSBpbmFjdGl2ZSAoZm9yIGV4YW1wbGUsIGVuZCBvZiBibG9jayBkZXRlY3Rpb24gaW4gTW9kQnVzDQotICogcHJvdG9jb2wpLiBJbiB0aGlzIGNhc2UsIHRoZSB3aG9sZSByZWNlaXZlZCBjaGFyYWN0ZXIgKDgtYml0KSBpcyBjb21wYXJlZCB0bw0KLSAqIHRoZSBBRERbNzowXSB2YWx1ZSBhbmQgQ01GIGZsYWcgaXMgc2V0IG9uIG1hdGNoKQ0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgIEFERCAgICAgICAgICAgTExfVVNBUlRfQ29uZmlnTm9kZUFkZHJlc3Ncbg0KLSAqICAgICAgICAgQ1IyICAgICAgICAgIEFERE03ICAgICAgICAgTExfVVNBUlRfQ29uZmlnTm9kZUFkZHJlc3MNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEBwYXJhbSAgQWRkcmVzc0xlbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0FERFJFU1NfREVURUNUXzRCDQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfQUREUkVTU19ERVRFQ1RfN0INCi0gKiBAcGFyYW0gIE5vZGVBZGRyZXNzIDQgb3IgNyBiaXQgQWRkcmVzcyBvZiB0aGUgVVNBUlQgbm9kZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9Db25maWdOb2RlQWRkcmVzcyhVU0FSVF9UeXBlRGVmICpVU0FSVHgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQWRkcmVzc0xlbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBOb2RlQWRkcmVzcykgew0KLSAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0FERCB8IFVTQVJUX0NSMl9BRERNNywNCi0gICAgICAgICAgICAgKHVpbnQzMl90KShBZGRyZXNzTGVuIHwgKE5vZGVBZGRyZXNzIDw8IFVTQVJUX0NSMl9BRERfUG9zKSkpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJldHVybiA4IGJpdCBBZGRyZXNzIG9mIHRoZSBVU0FSVCBub2RlIGFzIHNldCBpbiBBREQgZmllbGQgb2YgQ1IyLg0KLSAqIEBub3RlICAgSWYgNC1iaXQgQWRkcmVzcyBEZXRlY3Rpb24gaXMgc2VsZWN0ZWQgaW4gQURETTcsDQotICogICAgICAgICBvbmx5IDRiaXRzIChiMy1iMCkgb2YgcmV0dXJuZWQgdmFsdWUgYXJlIHJlbGV2YW50IChiMzEtYjQgYXJlIG5vdA0KLSAqIHJlbGV2YW50KSBJZiA3LWJpdCBBZGRyZXNzIERldGVjdGlvbiBpcyBzZWxlY3RlZCBpbiBBRERNNywgb25seSA4Yml0cyAoYjctYjApDQotICogb2YgcmV0dXJuZWQgdmFsdWUgYXJlIHJlbGV2YW50IChiMzEtYjggYXJlIG5vdCByZWxldmFudCkNCi0gKiBAcm10b2xsIENSMiAgICAgICAgICBBREQgICAgICAgICAgIExMX1VTQVJUX0dldE5vZGVBZGRyZXNzDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIEFkZHJlc3Mgb2YgdGhlIFVTQVJUIG5vZGUgKFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MjU1KQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXROb2RlQWRkcmVzcyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfQUREKSA+PiBVU0FSVF9DUjJfQUREX1Bvcyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmV0dXJuIExlbmd0aCBvZiBOb2RlIEFkZHJlc3MgdXNlZCBpbiBBZGRyZXNzIERldGVjdGlvbiBtb2RlICg3LWJpdA0KLSAqIG9yIDQtYml0KQ0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgIEFERE03ICAgICAgICAgTExfVVNBUlRfR2V0Tm9kZUFkZHJlc3NMZW4NCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9BRERSRVNTX0RFVEVDVF80Qg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0FERFJFU1NfREVURUNUXzdCDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldE5vZGVBZGRyZXNzTGVuKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9BRERNNykpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSBSVFMgSFcgRmxvdyBDb250cm9sDQotICogQG5vdGUgICBNYWNybyBJU19VQVJUX0hXRkxPV19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3INCi0gKiBub3QgSGFyZHdhcmUgRmxvdyBjb250cm9sIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuDQotICogQHJtdG9sbCBDUjMgICAgICAgICAgUlRTRSAgICAgICAgICBMTF9VU0FSVF9FbmFibGVSVFNIV0Zsb3dDdHJsDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVSVFNIV0Zsb3dDdHJsKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgU0VUX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX1JUU0UpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgUlRTIEhXIEZsb3cgQ29udHJvbA0KLSAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9IV0ZMT1dfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yDQotICogbm90IEhhcmR3YXJlIEZsb3cgY29udHJvbCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLg0KLSAqIEBybXRvbGwgQ1IzICAgICAgICAgIFJUU0UgICAgICAgICAgTExfVVNBUlRfRGlzYWJsZVJUU0hXRmxvd0N0cmwNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVSVFNIV0Zsb3dDdHJsKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfUlRTRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIENUUyBIVyBGbG93IENvbnRyb2wNCi0gKiBAbm90ZSAgIE1hY3JvIElTX1VBUlRfSFdGTE9XX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvcg0KLSAqIG5vdCBIYXJkd2FyZSBGbG93IGNvbnRyb2wgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4NCi0gKiBAcm10b2xsIENSMyAgICAgICAgICBDVFNFICAgICAgICAgIExMX1VTQVJUX0VuYWJsZUNUU0hXRmxvd0N0cmwNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZUNUU0hXRmxvd0N0cmwoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7DQotICBTRVRfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfQ1RTRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBDVFMgSFcgRmxvdyBDb250cm9sDQotICogQG5vdGUgICBNYWNybyBJU19VQVJUX0hXRkxPV19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3INCi0gKiBub3QgSGFyZHdhcmUgRmxvdyBjb250cm9sIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuDQotICogQHJtdG9sbCBDUjMgICAgICAgICAgQ1RTRSAgICAgICAgICBMTF9VU0FSVF9EaXNhYmxlQ1RTSFdGbG93Q3RybA0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZUNUU0hXRmxvd0N0cmwoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7DQotICBDTEVBUl9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19DVFNFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDb25maWd1cmUgSFcgRmxvdyBDb250cm9sIG1vZGUgKGJvdGggQ1RTIGFuZCBSVFMpDQotICogQG5vdGUgICBNYWNybyBJU19VQVJUX0hXRkxPV19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3INCi0gKiBub3QgSGFyZHdhcmUgRmxvdyBjb250cm9sIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuDQotICogQHJtdG9sbCBDUjMgICAgICAgICAgUlRTRSAgICAgICAgICBMTF9VU0FSVF9TZXRIV0Zsb3dDdHJsXG4NCi0gKiAgICAgICAgIENSMyAgICAgICAgICBDVFNFICAgICAgICAgIExMX1VTQVJUX1NldEhXRmxvd0N0cmwNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEBwYXJhbSAgSGFyZHdhcmVGbG93Q29udHJvbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcNCi0gKiB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfSFdDT05UUk9MX05PTkUNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9IV0NPTlRST0xfUlRTDQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfSFdDT05UUk9MX0NUUw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0hXQ09OVFJPTF9SVFNfQ1RTDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0SFdGbG93Q3RybChVU0FSVF9UeXBlRGVmICpVU0FSVHgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBIYXJkd2FyZUZsb3dDb250cm9sKSB7DQotICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfUlRTRSB8IFVTQVJUX0NSM19DVFNFLCBIYXJkd2FyZUZsb3dDb250cm9sKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBSZXR1cm4gSFcgRmxvdyBDb250cm9sIGNvbmZpZ3VyYXRpb24gKGJvdGggQ1RTIGFuZCBSVFMpDQotICogQG5vdGUgICBNYWNybyBJU19VQVJUX0hXRkxPV19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3INCi0gKiBub3QgSGFyZHdhcmUgRmxvdyBjb250cm9sIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuDQotICogQHJtdG9sbCBDUjMgICAgICAgICAgUlRTRSAgICAgICAgICBMTF9VU0FSVF9HZXRIV0Zsb3dDdHJsXG4NCi0gKiAgICAgICAgIENSMyAgICAgICAgICBDVFNFICAgICAgICAgIExMX1VTQVJUX0dldEhXRmxvd0N0cmwNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9IV0NPTlRST0xfTk9ORQ0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0hXQ09OVFJPTF9SVFMNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9IV0NPTlRST0xfQ1RTDQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfSFdDT05UUk9MX1JUU19DVFMNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0SFdGbG93Q3RybChVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfUlRTRSB8IFVTQVJUX0NSM19DVFNFKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIE9uZSBiaXQgc2FtcGxpbmcgbWV0aG9kDQotICogQHJtdG9sbCBDUjMgICAgICAgICAgT05FQklUICAgICAgICBMTF9VU0FSVF9FbmFibGVPbmVCaXRTYW1wDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVPbmVCaXRTYW1wKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgU0VUX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX09ORUJJVCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBPbmUgYml0IHNhbXBsaW5nIG1ldGhvZA0KLSAqIEBybXRvbGwgQ1IzICAgICAgICAgIE9ORUJJVCAgICAgICAgTExfVVNBUlRfRGlzYWJsZU9uZUJpdFNhbXANCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVPbmVCaXRTYW1wKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfT05FQklUKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBJbmRpY2F0ZSBpZiBPbmUgYml0IHNhbXBsaW5nIG1ldGhvZCBpcyBlbmFibGVkDQotICogQHJtdG9sbCBDUjMgICAgICAgICAgT05FQklUICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRPbmVCaXRTYW1wDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkT25lQml0U2FtcChVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfT05FQklUKSA9PSAoVVNBUlRfQ1IzX09ORUJJVCkpDQotICAgICAgICAgICAgICA/IDFVTA0KLSAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSBPdmVycnVuIGRldGVjdGlvbg0KLSAqIEBybXRvbGwgQ1IzICAgICAgICAgIE9WUkRJUyAgICAgICAgTExfVVNBUlRfRW5hYmxlT3ZlcnJ1bkRldGVjdA0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlT3ZlcnJ1bkRldGVjdChVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIENMRUFSX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX09WUkRJUyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBPdmVycnVuIGRldGVjdGlvbg0KLSAqIEBybXRvbGwgQ1IzICAgICAgICAgIE9WUkRJUyAgICAgICAgTExfVVNBUlRfRGlzYWJsZU92ZXJydW5EZXRlY3QNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVPdmVycnVuRGV0ZWN0KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgU0VUX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX09WUkRJUyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSW5kaWNhdGUgaWYgT3ZlcnJ1biBkZXRlY3Rpb24gaXMgZW5hYmxlZA0KLSAqIEBybXRvbGwgQ1IzICAgICAgICAgIE9WUkRJUyAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkT3ZlcnJ1bkRldGVjdA0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90DQotTExfVVNBUlRfSXNFbmFibGVkT3ZlcnJ1bkRldGVjdChVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfT1ZSRElTKSAhPSBVU0FSVF9DUjNfT1ZSRElTKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZWxlY3QgZXZlbnQgdHlwZSBmb3IgV2FrZSBVUCBJbnRlcnJ1cHQgRmxhZyAoV1VTWzE6MF0gYml0cykNCi0gKiBAbm90ZSAgIE1hY3JvIElTX1VBUlRfV0FLRVVQX0ZST01TVE9QX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sNCi0gKiB3aGV0aGVyIG9yIG5vdCBXYWtlLXVwIGZyb20gU3RvcCBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHgNCi0gKiBpbnN0YW5jZS4NCi0gKiBAcm10b2xsIENSMyAgICAgICAgICBXVVMgICAgICAgICAgIExMX1VTQVJUX1NldFdLVVBUeXBlDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcGFyYW0gIFR5cGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9XQUtFVVBfT05fQUREUkVTUw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1dBS0VVUF9PTl9TVEFSVEJJVA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1dBS0VVUF9PTl9SWE5FDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0V0tVUFR5cGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFR5cGUpIHsNCi0gIE1PRElGWV9SRUcoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19XVVMsIFR5cGUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJldHVybiBldmVudCB0eXBlIGZvciBXYWtlIFVQIEludGVycnVwdCBGbGFnIChXVVNbMTowXSBiaXRzKQ0KLSAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9XQUtFVVBfRlJPTVNUT1BfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjaw0KLSAqIHdoZXRoZXIgb3Igbm90IFdha2UtdXAgZnJvbSBTdG9wIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeA0KLSAqIGluc3RhbmNlLg0KLSAqIEBybXRvbGwgQ1IzICAgICAgICAgIFdVUyAgICAgICAgICAgTExfVVNBUlRfR2V0V0tVUFR5cGUNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9XQUtFVVBfT05fQUREUkVTUw0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1dBS0VVUF9PTl9TVEFSVEJJVA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1dBS0VVUF9PTl9SWE5FDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldFdLVVBUeXBlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19XVVMpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDb25maWd1cmUgVVNBUlQgQlJSIHJlZ2lzdGVyIGZvciBhY2hpZXZpbmcgZXhwZWN0ZWQgQmF1ZCBSYXRlIHZhbHVlLg0KLSAqIEBub3RlICAgQ29tcHV0ZSBhbmQgc2V0IFVTQVJURElWIHZhbHVlIGluIEJSUiBSZWdpc3RlciAoZnVsbCBCUlIgY29udGVudCkNCi0gKiAgICAgICAgIGFjY29yZGluZyB0byB1c2VkIFBlcmlwaGVyYWwgQ2xvY2ssIE92ZXJzYW1wbGluZyBtb2RlLCBhbmQgZXhwZWN0ZWQNCi0gKiBCYXVkIFJhdGUgdmFsdWVzDQotICogQG5vdGUgICBQZXJpcGhlcmFsIGNsb2NrIGFuZCBCYXVkIHJhdGUgdmFsdWVzIHByb3ZpZGVkIGFzIGZ1bmN0aW9uIHBhcmFtZXRlcnMNCi0gKiBzaG91bGQgYmUgdmFsaWQgKEJhdWQgcmF0ZSB2YWx1ZSAhPSAwKQ0KLSAqIEBub3RlICAgSW4gY2FzZSBvZiBvdmVyc2FtcGxpbmcgYnkgMTYgYW5kIDgsIEJSUiBjb250ZW50IG11c3QgYmUgZ3JlYXRlciB0aGFuDQotICogb3IgZXF1YWwgdG8gMTZkLg0KLSAqIEBybXRvbGwgQlJSICAgICAgICAgIEJSUiAgICAgICAgICAgTExfVVNBUlRfU2V0QmF1ZFJhdGUNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEBwYXJhbSAgUGVyaXBoQ2xrIFBlcmlwaGVyYWwgQ2xvY2sNCi0gKiBAcGFyYW0gIFByZXNjYWxlclZhbHVlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVY0DQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWOA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYxMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYxMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYxNg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYzMg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVY2NA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYxMjgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMjU2DQotICogQHBhcmFtICBPdmVyU2FtcGxpbmcgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9PVkVSU0FNUExJTkdfMTYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9PVkVSU0FNUExJTkdfOA0KLSAqIEBwYXJhbSAgQmF1ZFJhdGUgQmF1ZCBSYXRlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0QmF1ZFJhdGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFBlcmlwaENsaywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQcmVzY2FsZXJWYWx1ZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBPdmVyU2FtcGxpbmcsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQmF1ZFJhdGUpIHsNCi0gIHVpbnQzMl90IHVzYXJ0ZGl2Ow0KLSAgdWludDMyX3QgYnJydGVtcDsNCi0NCi0gIGlmIChQcmVzY2FsZXJWYWx1ZSA+IExMX1VTQVJUX1BSRVNDQUxFUl9ESVYyNTYpIHsNCi0gICAgLyogRG8gbm90IG92ZXJzdGVwIHRoZSBzaXplIG9mIFVTQVJUX1BSRVNDQUxFUl9UQUIgKi8NCi0gIH0gZWxzZSBpZiAoQmF1ZFJhdGUgPT0gMFUpIHsNCi0gICAgLyogQ2FuIE5vdCBkaXZpZGUgcGVyIDAgKi8NCi0gIH0gZWxzZSBpZiAoT3ZlclNhbXBsaW5nID09IExMX1VTQVJUX09WRVJTQU1QTElOR184KSB7DQotICAgIHVzYXJ0ZGl2ID0gKHVpbnQxNl90KShfX0xMX1VTQVJUX0RJVl9TQU1QTElORzgoDQotICAgICAgICBQZXJpcGhDbGssICh1aW50OF90KVByZXNjYWxlclZhbHVlLCBCYXVkUmF0ZSkpOw0KLSAgICBicnJ0ZW1wID0gdXNhcnRkaXYgJiAweEZGRjBVOw0KLSAgICBicnJ0ZW1wIHw9ICh1aW50MTZfdCkoKHVzYXJ0ZGl2ICYgKHVpbnQxNl90KTB4MDAwRlUpID4+IDFVKTsNCi0gICAgVVNBUlR4LT5CUlIgPSBicnJ0ZW1wOw0KLSAgfSBlbHNlIHsNCi0gICAgVVNBUlR4LT5CUlIgPSAodWludDE2X3QpKF9fTExfVVNBUlRfRElWX1NBTVBMSU5HMTYoDQotICAgICAgICBQZXJpcGhDbGssICh1aW50OF90KVByZXNjYWxlclZhbHVlLCBCYXVkUmF0ZSkpOw0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJldHVybiBjdXJyZW50IEJhdWQgUmF0ZSB2YWx1ZSwgYWNjb3JkaW5nIHRvIFVTQVJURElWIHByZXNlbnQgaW4gQlJSDQotICogcmVnaXN0ZXIgKGZ1bGwgQlJSIGNvbnRlbnQpLCBhbmQgdG8gdXNlZCBQZXJpcGhlcmFsIENsb2NrIGFuZCBPdmVyc2FtcGxpbmcNCi0gKiBtb2RlIHZhbHVlcw0KLSAqIEBub3RlICAgSW4gY2FzZSBvZiBub24taW5pdGlhbGl6ZWQgb3IgaW52YWxpZCB2YWx1ZSBzdG9yZWQgaW4gQlJSIHJlZ2lzdGVyLA0KLSAqIHZhbHVlIDAgd2lsbCBiZSByZXR1cm5lZC4NCi0gKiBAbm90ZSAgIEluIGNhc2Ugb2Ygb3ZlcnNhbXBsaW5nIGJ5IDE2IGFuZCA4LCBCUlIgY29udGVudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbg0KLSAqIG9yIGVxdWFsIHRvIDE2ZC4NCi0gKiBAcm10b2xsIEJSUiAgICAgICAgICBCUlIgICAgICAgICAgIExMX1VTQVJUX0dldEJhdWRSYXRlDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcGFyYW0gIFBlcmlwaENsayBQZXJpcGhlcmFsIENsb2NrDQotICogQHBhcmFtICBQcmVzY2FsZXJWYWx1ZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYxDQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWNA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVY2DQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjgNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMTANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMTINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMTYNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWNjQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMTI4DQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjI1Ng0KLSAqIEBwYXJhbSAgT3ZlclNhbXBsaW5nIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfT1ZFUlNBTVBMSU5HXzE2DQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfT1ZFUlNBTVBMSU5HXzgNCi0gKiBAcmV0dmFsIEJhdWQgUmF0ZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXRCYXVkUmF0ZShVU0FSVF9UeXBlRGVmICpVU0FSVHgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFBlcmlwaENsaywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUHJlc2NhbGVyVmFsdWUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE92ZXJTYW1wbGluZykgew0KLSAgdWludDMyX3QgdXNhcnRkaXY7DQotICB1aW50MzJfdCBicnJyZXN1bHQgPSAweDBVOw0KLSAgdWludDMyX3QgcGVyaXBoY2xrcHJlc2MgPQ0KLSAgICAgICh1aW50MzJfdCkoUGVyaXBoQ2xrIC8gKFVTQVJUX1BSRVNDQUxFUl9UQUJbKHVpbnQ4X3QpUHJlc2NhbGVyVmFsdWVdKSk7DQotDQotICB1c2FydGRpdiA9IFVTQVJUeC0+QlJSOw0KLQ0KLSAgaWYgKHVzYXJ0ZGl2ID09IDBVKSB7DQotICAgIC8qIERvIG5vdCBwZXJmb3JtIGEgZGl2aXNpb24gYnkgMCAqLw0KLSAgfSBlbHNlIGlmIChPdmVyU2FtcGxpbmcgPT0gTExfVVNBUlRfT1ZFUlNBTVBMSU5HXzgpIHsNCi0gICAgdXNhcnRkaXYgPSAodWludDE2X3QpKCh1c2FydGRpdiAmIDB4RkZGMFUpIHwgKCh1c2FydGRpdiAmIDB4MDAwN1UpIDw8IDFVKSk7DQotICAgIGlmICh1c2FydGRpdiAhPSAwVSkgew0KLSAgICAgIGJycnJlc3VsdCA9IChwZXJpcGhjbGtwcmVzYyAqIDJVKSAvIHVzYXJ0ZGl2Ow0KLSAgICB9DQotICB9IGVsc2Ugew0KLSAgICBpZiAoKHVzYXJ0ZGl2ICYgMHhGRkZGVSkgIT0gMFUpIHsNCi0gICAgICBicnJyZXN1bHQgPSBwZXJpcGhjbGtwcmVzYyAvIHVzYXJ0ZGl2Ow0KLSAgICB9DQotICB9DQotICByZXR1cm4gKGJycnJlc3VsdCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IFJlY2VpdmVyIFRpbWUgT3V0IFZhbHVlIChleHByZXNzZWQgaW4gbmIgb2YgYml0cyBkdXJhdGlvbikNCi0gKiBAcm10b2xsIFJUT1IgICAgICAgICBSVE8gICAgICAgICAgIExMX1VTQVJUX1NldFJ4VGltZW91dA0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHBhcmFtICBUaW1lb3V0IFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHgwMEZGRkZGRg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldFJ4VGltZW91dChVU0FSVF9UeXBlRGVmICpVU0FSVHgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVvdXQpIHsNCi0gIE1PRElGWV9SRUcoVVNBUlR4LT5SVE9SLCBVU0FSVF9SVE9SX1JUTywgVGltZW91dCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IFJlY2VpdmVyIFRpbWUgT3V0IFZhbHVlIChleHByZXNzZWQgaW4gbmIgb2YgYml0cyBkdXJhdGlvbikNCi0gKiBAcm10b2xsIFJUT1IgICAgICAgICBSVE8gICAgICAgICAgIExMX1VTQVJUX0dldFJ4VGltZW91dA0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4MDBGRkZGRkYNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0UnhUaW1lb3V0KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5SVE9SLCBVU0FSVF9SVE9SX1JUTykpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCBCbG9jayBMZW5ndGggdmFsdWUgaW4gcmVjZXB0aW9uDQotICogQHJtdG9sbCBSVE9SICAgICAgICAgQkxFTiAgICAgICAgICBMTF9VU0FSVF9TZXRCbG9ja0xlbmd0aA0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHBhcmFtICBCbG9ja0xlbmd0aCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkYNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRCbG9ja0xlbmd0aChVU0FSVF9UeXBlRGVmICpVU0FSVHgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQmxvY2tMZW5ndGgpIHsNCi0gIE1PRElGWV9SRUcoVVNBUlR4LT5SVE9SLCBVU0FSVF9SVE9SX0JMRU4sIEJsb2NrTGVuZ3RoIDw8IFVTQVJUX1JUT1JfQkxFTl9Qb3MpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBCbG9jayBMZW5ndGggdmFsdWUgaW4gcmVjZXB0aW9uDQotICogQHJtdG9sbCBSVE9SICAgICAgICAgQkxFTiAgICAgICAgICBMTF9VU0FSVF9HZXRCbG9ja0xlbmd0aA0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkYNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0QmxvY2tMZW5ndGgoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChVU0FSVHgtPlJUT1IsIFVTQVJUX1JUT1JfQkxFTikgPj4NCi0gICAgICAgICAgICAgICAgICAgIFVTQVJUX1JUT1JfQkxFTl9Qb3MpOw0KLX0NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUZfQ29uZmlndXJhdGlvbl9JUkRBIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zIHJlbGF0ZWQgdG8NCi0gKiBJcmRhIGZlYXR1cmUNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIElyREEgbW9kZQ0KLSAqIEBub3RlICAgTWFjcm8gSVNfSVJEQV9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90DQotICogICAgICAgICBJckRBIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuDQotICogQHJtdG9sbCBDUjMgICAgICAgICAgSVJFTiAgICAgICAgICBMTF9VU0FSVF9FbmFibGVJcmRhDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVJcmRhKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgU0VUX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX0lSRU4pOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgSXJEQSBtb2RlDQotICogQG5vdGUgICBNYWNybyBJU19JUkRBX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QNCi0gKiAgICAgICAgIElyREEgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4NCi0gKiBAcm10b2xsIENSMyAgICAgICAgICBJUkVOICAgICAgICAgIExMX1VTQVJUX0Rpc2FibGVJcmRhDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlSXJkYShVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIENMRUFSX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX0lSRU4pOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEluZGljYXRlIGlmIElyREEgbW9kZSBpcyBlbmFibGVkDQotICogQG5vdGUgICBNYWNybyBJU19JUkRBX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QNCi0gKiAgICAgICAgIElyREEgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4NCi0gKiBAcm10b2xsIENSMyAgICAgICAgICBJUkVOICAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZElyZGENCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRJcmRhKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19JUkVOKSA9PSAoVVNBUlRfQ1IzX0lSRU4pKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ29uZmlndXJlIElyREEgUG93ZXIgTW9kZSAoTm9ybWFsIG9yIExvdyBQb3dlcikNCi0gKiBAbm90ZSAgIE1hY3JvIElTX0lSREFfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdA0KLSAqICAgICAgICAgSXJEQSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLg0KLSAqIEBybXRvbGwgQ1IzICAgICAgICAgIElSTFAgICAgICAgICAgTExfVVNBUlRfU2V0SXJkYVBvd2VyTW9kZQ0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHBhcmFtICBQb3dlck1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9JUkRBX1BPV0VSX05PUk1BTA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0lSREFfUE9XRVJfTE9XDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0SXJkYVBvd2VyTW9kZShVU0FSVF9UeXBlRGVmICpVU0FSVHgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQb3dlck1vZGUpIHsNCi0gIE1PRElGWV9SRUcoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19JUkxQLCBQb3dlck1vZGUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJldHJpZXZlIElyREEgUG93ZXIgTW9kZSBjb25maWd1cmF0aW9uIChOb3JtYWwgb3IgTG93IFBvd2VyKQ0KLSAqIEBub3RlICAgTWFjcm8gSVNfSVJEQV9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90DQotICogICAgICAgICBJckRBIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuDQotICogQHJtdG9sbCBDUjMgICAgICAgICAgSVJMUCAgICAgICAgICBMTF9VU0FSVF9HZXRJcmRhUG93ZXJNb2RlDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfSVJEQV9QT1dFUl9OT1JNQUwNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QSEFTRV8yRURHRQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXRJcmRhUG93ZXJNb2RlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19JUkxQKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IElyZGEgcHJlc2NhbGVyIHZhbHVlLCB1c2VkIGZvciBkaXZpZGluZyB0aGUgVVNBUlQgY2xvY2sgc291cmNlDQotICogICAgICAgICB0byBhY2hpZXZlIHRoZSBJcmRhIExvdyBQb3dlciBmcmVxdWVuY3kgKDggYml0cyB2YWx1ZSkNCi0gKiBAbm90ZSAgIE1hY3JvIElTX0lSREFfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdA0KLSAqICAgICAgICAgSXJEQSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLg0KLSAqIEBybXRvbGwgR1RQUiAgICAgICAgIFBTQyAgICAgICAgICAgTExfVVNBUlRfU2V0SXJkYVByZXNjYWxlcg0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHBhcmFtICBQcmVzY2FsZXJWYWx1ZSBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkYNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRJcmRhUHJlc2NhbGVyKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFByZXNjYWxlclZhbHVlKSB7DQotICBNT0RJRllfUkVHKFVTQVJUeC0+R1RQUiwgVVNBUlRfR1RQUl9QU0MsICh1aW50MTZfdClQcmVzY2FsZXJWYWx1ZSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmV0dXJuIElyZGEgcHJlc2NhbGVyIHZhbHVlLCB1c2VkIGZvciBkaXZpZGluZyB0aGUgVVNBUlQgY2xvY2sgc291cmNlDQotICogICAgICAgICB0byBhY2hpZXZlIHRoZSBJcmRhIExvdyBQb3dlciBmcmVxdWVuY3kgKDggYml0cyB2YWx1ZSkNCi0gKiBAbm90ZSAgIE1hY3JvIElTX0lSREFfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdA0KLSAqICAgICAgICAgSXJEQSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLg0KLSAqIEBybXRvbGwgR1RQUiAgICAgICAgIFBTQyAgICAgICAgICAgTExfVVNBUlRfR2V0SXJkYVByZXNjYWxlcg0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBJcmRhIHByZXNjYWxlciB2YWx1ZSAoVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEZGKQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXRJcmRhUHJlc2NhbGVyKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5HVFBSLCBVU0FSVF9HVFBSX1BTQykpOw0KLX0NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUZfQ29uZmlndXJhdGlvbl9TbWFydGNhcmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMNCi0gKiByZWxhdGVkIHRvIFNtYXJ0Y2FyZCBmZWF0dXJlDQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSBTbWFydGNhcmQgTkFDSyB0cmFuc21pc3Npb24NCi0gKiBAbm90ZSAgIE1hY3JvIElTX1NNQVJUQ0FSRF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3INCi0gKiBub3QgU21hcnRjYXJkIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuDQotICogQHJtdG9sbCBDUjMgICAgICAgICAgTkFDSyAgICAgICAgICBMTF9VU0FSVF9FbmFibGVTbWFydGNhcmROQUNLDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVTbWFydGNhcmROQUNLKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgU0VUX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX05BQ0spOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgU21hcnRjYXJkIE5BQ0sgdHJhbnNtaXNzaW9uDQotICogQG5vdGUgICBNYWNybyBJU19TTUFSVENBUkRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yDQotICogbm90IFNtYXJ0Y2FyZCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLg0KLSAqIEBybXRvbGwgQ1IzICAgICAgICAgIE5BQ0sgICAgICAgICAgTExfVVNBUlRfRGlzYWJsZVNtYXJ0Y2FyZE5BQ0sNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVTbWFydGNhcmROQUNLKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfTkFDSyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSW5kaWNhdGUgaWYgU21hcnRjYXJkIE5BQ0sgdHJhbnNtaXNzaW9uIGlzIGVuYWJsZWQNCi0gKiBAbm90ZSAgIE1hY3JvIElTX1NNQVJUQ0FSRF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3INCi0gKiBub3QgU21hcnRjYXJkIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuDQotICogQHJtdG9sbCBDUjMgICAgICAgICAgTkFDSyAgICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRTbWFydGNhcmROQUNLDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QNCi1MTF9VU0FSVF9Jc0VuYWJsZWRTbWFydGNhcmROQUNLKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19OQUNLKSA9PSAoVVNBUlRfQ1IzX05BQ0spKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIFNtYXJ0Y2FyZCBtb2RlDQotICogQG5vdGUgICBNYWNybyBJU19TTUFSVENBUkRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yDQotICogbm90IFNtYXJ0Y2FyZCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLg0KLSAqIEBybXRvbGwgQ1IzICAgICAgICAgIFNDRU4gICAgICAgICAgTExfVVNBUlRfRW5hYmxlU21hcnRjYXJkDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVTbWFydGNhcmQoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7DQotICBTRVRfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfU0NFTik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBTbWFydGNhcmQgbW9kZQ0KLSAqIEBub3RlICAgTWFjcm8gSVNfU01BUlRDQVJEX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvcg0KLSAqIG5vdCBTbWFydGNhcmQgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4NCi0gKiBAcm10b2xsIENSMyAgICAgICAgICBTQ0VOICAgICAgICAgIExMX1VTQVJUX0Rpc2FibGVTbWFydGNhcmQNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVTbWFydGNhcmQoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7DQotICBDTEVBUl9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19TQ0VOKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBJbmRpY2F0ZSBpZiBTbWFydGNhcmQgbW9kZSBpcyBlbmFibGVkDQotICogQG5vdGUgICBNYWNybyBJU19TTUFSVENBUkRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yDQotICogbm90IFNtYXJ0Y2FyZCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLg0KLSAqIEBybXRvbGwgQ1IzICAgICAgICAgIFNDRU4gICAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkU21hcnRjYXJkDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkU21hcnRjYXJkKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19TQ0VOKSA9PSAoVVNBUlRfQ1IzX1NDRU4pKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IFNtYXJ0Y2FyZCBBdXRvLVJldHJ5IENvdW50IHZhbHVlIChTQ0FSQ05UWzI6MF0gYml0cykNCi0gKiBAbm90ZSAgIE1hY3JvIElTX1NNQVJUQ0FSRF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3INCi0gKiBub3QgU21hcnRjYXJkIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuDQotICogQG5vdGUgICBUaGlzIGJpdC1maWVsZCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiByZXRyaWVzIGluIHRyYW5zbWl0IGFuZA0KLSAqIHJlY2VpdmUsIGluIFNtYXJ0Y2FyZCBtb2RlLiBJbiB0cmFuc21pc3Npb24gbW9kZSwgaXQgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YNCi0gKiBhdXRvbWF0aWMgcmV0cmFuc21pc3Npb24gcmV0cmllcywgYmVmb3JlIGdlbmVyYXRpbmcgYSB0cmFuc21pc3Npb24gZXJyb3IgKEZFDQotICogYml0IHNldCkuIEluIHJlY2VwdGlvbiBtb2RlLCBpdCBzcGVjaWZpZXMgdGhlIG51bWJlciBvciBlcnJvbmVvdXMgcmVjZXB0aW9uDQotICogdHJpYWxzLCBiZWZvcmUgZ2VuZXJhdGluZyBhIHJlY2VwdGlvbiBlcnJvciAoUlhORSBhbmQgUEUgYml0cyBzZXQpDQotICogQHJtdG9sbCBDUjMgICAgICAgICAgU0NBUkNOVCAgICAgICBMTF9VU0FSVF9TZXRTbWFydGNhcmRBdXRvUmV0cnlDb3VudA0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHBhcmFtICBBdXRvUmV0cnlDb3VudCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTcNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRTbWFydGNhcmRBdXRvUmV0cnlDb3VudCgNCi0gICAgVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBBdXRvUmV0cnlDb3VudCkgew0KLSAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX1NDQVJDTlQsDQotICAgICAgICAgICAgIEF1dG9SZXRyeUNvdW50IDw8IFVTQVJUX0NSM19TQ0FSQ05UX1Bvcyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmV0dXJuIFNtYXJ0Y2FyZCBBdXRvLVJldHJ5IENvdW50IHZhbHVlIChTQ0FSQ05UWzI6MF0gYml0cykNCi0gKiBAbm90ZSAgIE1hY3JvIElTX1NNQVJUQ0FSRF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3INCi0gKiBub3QgU21hcnRjYXJkIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuDQotICogQHJtdG9sbCBDUjMgICAgICAgICAgU0NBUkNOVCAgICAgICBMTF9VU0FSVF9HZXRTbWFydGNhcmRBdXRvUmV0cnlDb3VudA0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBTbWFydGNhcmQgQXV0by1SZXRyeSBDb3VudCB2YWx1ZSAoVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZA0KLSAqIE1heF9EYXRhPTcpDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90DQotTExfVVNBUlRfR2V0U21hcnRjYXJkQXV0b1JldHJ5Q291bnQoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX1NDQVJDTlQpID4+DQotICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjNfU0NBUkNOVF9Qb3MpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCBTbWFydGNhcmQgcHJlc2NhbGVyIHZhbHVlLCB1c2VkIGZvciBkaXZpZGluZyB0aGUgVVNBUlQgY2xvY2sNCi0gKiAgICAgICAgIHNvdXJjZSB0byBwcm92aWRlIHRoZSBTTUFSVENBUkQgQ2xvY2sgKDUgYml0cyB2YWx1ZSkNCi0gKiBAbm90ZSAgIE1hY3JvIElTX1NNQVJUQ0FSRF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3INCi0gKiBub3QgU21hcnRjYXJkIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuDQotICogQHJtdG9sbCBHVFBSICAgICAgICAgUFNDICAgICAgICAgICBMTF9VU0FSVF9TZXRTbWFydGNhcmRQcmVzY2FsZXINCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEBwYXJhbSAgUHJlc2NhbGVyVmFsdWUgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0zMQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldFNtYXJ0Y2FyZFByZXNjYWxlcihVU0FSVF9UeXBlRGVmICpVU0FSVHgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFByZXNjYWxlclZhbHVlKSB7DQotICBNT0RJRllfUkVHKFVTQVJUeC0+R1RQUiwgVVNBUlRfR1RQUl9QU0MsICh1aW50MTZfdClQcmVzY2FsZXJWYWx1ZSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmV0dXJuIFNtYXJ0Y2FyZCBwcmVzY2FsZXIgdmFsdWUsIHVzZWQgZm9yIGRpdmlkaW5nIHRoZSBVU0FSVCBjbG9jaw0KLSAqICAgICAgICAgc291cmNlIHRvIHByb3ZpZGUgdGhlIFNNQVJUQ0FSRCBDbG9jayAoNSBiaXRzIHZhbHVlKQ0KLSAqIEBub3RlICAgTWFjcm8gSVNfU01BUlRDQVJEX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvcg0KLSAqIG5vdCBTbWFydGNhcmQgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4NCi0gKiBAcm10b2xsIEdUUFIgICAgICAgICBQU0MgICAgICAgICAgIExMX1VTQVJUX0dldFNtYXJ0Y2FyZFByZXNjYWxlcg0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBTbWFydGNhcmQgcHJlc2NhbGVyIHZhbHVlIChWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTMxKQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXRTbWFydGNhcmRQcmVzY2FsZXIoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChVU0FSVHgtPkdUUFIsIFVTQVJUX0dUUFJfUFNDKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IFNtYXJ0Y2FyZCBHdWFyZCB0aW1lIHZhbHVlLCBleHByZXNzZWQgaW4gbmIgb2YgYmF1ZCBjbG9ja3MNCi0gKiBwZXJpb2RzIChHVFs3OjBdIGJpdHMgOiBHdWFyZCB0aW1lIHZhbHVlKQ0KLSAqIEBub3RlICAgTWFjcm8gSVNfU01BUlRDQVJEX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvcg0KLSAqIG5vdCBTbWFydGNhcmQgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4NCi0gKiBAcm10b2xsIEdUUFIgICAgICAgICBHVCAgICAgICAgICAgIExMX1VTQVJUX1NldFNtYXJ0Y2FyZEd1YXJkVGltZQ0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHBhcmFtICBHdWFyZFRpbWUgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEZGDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0U21hcnRjYXJkR3VhcmRUaW1lKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgR3VhcmRUaW1lKSB7DQotICBNT0RJRllfUkVHKFVTQVJUeC0+R1RQUiwgVVNBUlRfR1RQUl9HVCwNCi0gICAgICAgICAgICAgKHVpbnQxNl90KShHdWFyZFRpbWUgPDwgVVNBUlRfR1RQUl9HVF9Qb3MpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBSZXR1cm4gU21hcnRjYXJkIEd1YXJkIHRpbWUgdmFsdWUsIGV4cHJlc3NlZCBpbiBuYiBvZiBiYXVkIGNsb2Nrcw0KLSAqIHBlcmlvZHMgKEdUWzc6MF0gYml0cyA6IEd1YXJkIHRpbWUgdmFsdWUpDQotICogQG5vdGUgICBNYWNybyBJU19TTUFSVENBUkRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yDQotICogbm90IFNtYXJ0Y2FyZCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLg0KLSAqIEBybXRvbGwgR1RQUiAgICAgICAgIEdUICAgICAgICAgICAgTExfVVNBUlRfR2V0U21hcnRjYXJkR3VhcmRUaW1lDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFNtYXJ0Y2FyZCBHdWFyZCB0aW1lIHZhbHVlIChWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kDQotICogTWF4X0RhdGE9MHhGRikNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0U21hcnRjYXJkR3VhcmRUaW1lKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5HVFBSLCBVU0FSVF9HVFBSX0dUKSA+PiBVU0FSVF9HVFBSX0dUX1Bvcyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FRl9Db25maWd1cmF0aW9uX0hhbGZEdXBsZXggQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMNCi0gKiByZWxhdGVkIHRvIEhhbGYgRHVwbGV4IGZlYXR1cmUNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIFNpbmdsZSBXaXJlIEhhbGYtRHVwbGV4IG1vZGUNCi0gKiBAbm90ZSAgIE1hY3JvIElTX1VBUlRfSEFMRkRVUExFWF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrDQotICogd2hldGhlciBvciBub3QgSGFsZi1EdXBsZXggbW9kZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4NCi0gKiBAcm10b2xsIENSMyAgICAgICAgICBIRFNFTCAgICAgICAgIExMX1VTQVJUX0VuYWJsZUhhbGZEdXBsZXgNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZUhhbGZEdXBsZXgoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7DQotICBTRVRfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfSERTRUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgU2luZ2xlIFdpcmUgSGFsZi1EdXBsZXggbW9kZQ0KLSAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9IQUxGRFVQTEVYX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sNCi0gKiB3aGV0aGVyIG9yIG5vdCBIYWxmLUR1cGxleCBtb2RlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLg0KLSAqIEBybXRvbGwgQ1IzICAgICAgICAgIEhEU0VMICAgICAgICAgTExfVVNBUlRfRGlzYWJsZUhhbGZEdXBsZXgNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVIYWxmRHVwbGV4KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfSERTRUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEluZGljYXRlIGlmIFNpbmdsZSBXaXJlIEhhbGYtRHVwbGV4IG1vZGUgaXMgZW5hYmxlZA0KLSAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9IQUxGRFVQTEVYX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sNCi0gKiB3aGV0aGVyIG9yIG5vdCBIYWxmLUR1cGxleCBtb2RlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLg0KLSAqIEBybXRvbGwgQ1IzICAgICAgICAgIEhEU0VMICAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkSGFsZkR1cGxleA0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZEhhbGZEdXBsZXgoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX0hEU0VMKSA9PSAoVVNBUlRfQ1IzX0hEU0VMKSkgPyAxVUwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FRl9Db25maWd1cmF0aW9uX1NQSV9TTEFWRSBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucw0KLSAqIHJlbGF0ZWQgdG8gU1BJIFNsYXZlIGZlYXR1cmUNCi0gKiBAew0KLSAqLw0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIFNQSSBTeW5jaHJvbm91cyBTbGF2ZSBtb2RlDQotICogQG5vdGUgICBNYWNybyBJU19VQVJUX1NQSV9TTEFWRV9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXINCi0gKiBvciBub3QgU1BJIFNsYXZlIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4NCi0gKiBAcm10b2xsIENSMiAgICAgICAgICBTTFZFTiAgICAgICAgIExMX1VTQVJUX0VuYWJsZVNQSVNsYXZlDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVTUElTbGF2ZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIFNFVF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9TTFZFTik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBTUEkgU3luY2hyb25vdXMgU2xhdmUgbW9kZQ0KLSAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9TUElfU0xBVkVfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyDQotICogb3Igbm90IFNQSSBTbGF2ZSBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuDQotICogQHJtdG9sbCBDUjIgICAgICAgICAgU0xWRU4gICAgICAgICBMTF9VU0FSVF9EaXNhYmxlU1BJU2xhdmUNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVTUElTbGF2ZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIENMRUFSX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX1NMVkVOKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBJbmRpY2F0ZSBpZiAgU1BJIFN5bmNocm9ub3VzIFNsYXZlIG1vZGUgaXMgZW5hYmxlZA0KLSAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9TUElfU0xBVkVfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyDQotICogb3Igbm90IFNQSSBTbGF2ZSBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuDQotICogQHJtdG9sbCBDUjIgICAgICAgICAgU0xWRU4gICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRTUElTbGF2ZQ0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZFNQSVNsYXZlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9TTFZFTikgPT0gKFVTQVJUX0NSMl9TTFZFTikpID8gMVVMDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSBTUEkgU2xhdmUgU2VsZWN0aW9uIHVzaW5nIE5TUyBpbnB1dCBwaW4NCi0gKiBAbm90ZSAgIE1hY3JvIElTX1VBUlRfU1BJX1NMQVZFX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlcg0KLSAqIG9yIG5vdCBTUEkgU2xhdmUgbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLg0KLSAqIEBub3RlICAgU1BJIFNsYXZlIFNlbGVjdGlvbiBkZXBlbmRzIG9uIE5TUyBpbnB1dCBwaW4NCi0gKiAgICAgICAgIChUaGUgc2xhdmUgaXMgc2VsZWN0ZWQgd2hlbiBOU1MgaXMgbG93IGFuZCBkZXNlbGVjdGVkIHdoZW4gTlNTIGlzDQotICogaGlnaCkuDQotICogQHJtdG9sbCBDUjIgICAgICAgICAgRElTX05TUyAgICAgICBMTF9VU0FSVF9FbmFibGVTUElTbGF2ZVNlbGVjdA0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlU1BJU2xhdmVTZWxlY3QoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7DQotICBDTEVBUl9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9ESVNfTlNTKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIFNQSSBTbGF2ZSBTZWxlY3Rpb24gdXNpbmcgTlNTIGlucHV0IHBpbg0KLSAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9TUElfU0xBVkVfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyDQotICogb3Igbm90IFNQSSBTbGF2ZSBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuDQotICogQG5vdGUgICBTUEkgU2xhdmUgd2lsbCBiZSBhbHdheXMgc2VsZWN0ZWQgYW5kIE5TUyBpbnB1dCBwaW4gd2lsbCBiZSBpZ25vcmVkLg0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgIERJU19OU1MgICAgICAgTExfVVNBUlRfRGlzYWJsZVNQSVNsYXZlU2VsZWN0DQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlU1BJU2xhdmVTZWxlY3QoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7DQotICBTRVRfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfRElTX05TUyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSW5kaWNhdGUgaWYgIFNQSSBTbGF2ZSBTZWxlY3Rpb24gZGVwZW5kcyBvbiBOU1MgaW5wdXQgcGluDQotICogQG5vdGUgICBNYWNybyBJU19VQVJUX1NQSV9TTEFWRV9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXINCi0gKiBvciBub3QgU1BJIFNsYXZlIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4NCi0gKiBAcm10b2xsIENSMiAgICAgICAgICBESVNfTlNTICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZFNQSVNsYXZlU2VsZWN0DQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QNCi1MTF9VU0FSVF9Jc0VuYWJsZWRTUElTbGF2ZVNlbGVjdChVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfRElTX05TUykgIT0gKFVTQVJUX0NSMl9ESVNfTlNTKSkNCi0gICAgICAgICAgICAgID8gMVVMDQotICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FRl9Db25maWd1cmF0aW9uX0xJTiBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucyByZWxhdGVkIHRvDQotICogTElOIGZlYXR1cmUNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IExJTiBCcmVhayBEZXRlY3Rpb24gTGVuZ3RoDQotICogQG5vdGUgICBNYWNybyBJU19VQVJUX0xJTl9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3INCi0gKiBub3QgTElOIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuDQotICogQHJtdG9sbCBDUjIgICAgICAgICAgTEJETCAgICAgICAgICBMTF9VU0FSVF9TZXRMSU5CcmtEZXRlY3Rpb25MZW4NCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEBwYXJhbSAgTElOQkRMZW5ndGggVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9MSU5CUkVBS19ERVRFQ1RfMTBCDQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfTElOQlJFQUtfREVURUNUXzExQg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldExJTkJya0RldGVjdGlvbkxlbihVU0FSVF9UeXBlRGVmICpVU0FSVHgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IExJTkJETGVuZ3RoKSB7DQotICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfTEJETCwgTElOQkRMZW5ndGgpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJldHVybiBMSU4gQnJlYWsgRGV0ZWN0aW9uIExlbmd0aA0KLSAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9MSU5fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yDQotICogbm90IExJTiBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLg0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgIExCREwgICAgICAgICAgTExfVVNBUlRfR2V0TElOQnJrRGV0ZWN0aW9uTGVuDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfTElOQlJFQUtfREVURUNUXzEwQg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0xJTkJSRUFLX0RFVEVDVF8xMUINCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0TElOQnJrRGV0ZWN0aW9uTGVuKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9MQkRMKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIExJTiBtb2RlDQotICogQG5vdGUgICBNYWNybyBJU19VQVJUX0xJTl9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3INCi0gKiBub3QgTElOIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuDQotICogQHJtdG9sbCBDUjIgICAgICAgICAgTElORU4gICAgICAgICBMTF9VU0FSVF9FbmFibGVMSU4NCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZUxJTihVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIFNFVF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9MSU5FTik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBMSU4gbW9kZQ0KLSAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9MSU5fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yDQotICogbm90IExJTiBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLg0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgIExJTkVOICAgICAgICAgTExfVVNBUlRfRGlzYWJsZUxJTg0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZUxJTihVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIENMRUFSX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0xJTkVOKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBJbmRpY2F0ZSBpZiBMSU4gbW9kZSBpcyBlbmFibGVkDQotICogQG5vdGUgICBNYWNybyBJU19VQVJUX0xJTl9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3INCi0gKiBub3QgTElOIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuDQotICogQHJtdG9sbCBDUjIgICAgICAgICAgTElORU4gICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRMSU4NCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRMSU4oVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0xJTkVOKSA9PSAoVVNBUlRfQ1IyX0xJTkVOKSkgPyAxVUwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FRl9Db25maWd1cmF0aW9uX0RFIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zIHJlbGF0ZWQgdG8NCi0gKiBEcml2ZXIgRW5hYmxlIGZlYXR1cmUNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IERFRFQgKERyaXZlciBFbmFibGUgRGUtQXNzZXJ0aW9uIFRpbWUpLCBUaW1lIHZhbHVlIGV4cHJlc3NlZCBvbiA1DQotICogYml0cyAoWzQ6MF0gYml0cykuDQotICogQG5vdGUgICBNYWNybyBJU19VQVJUX0RSSVZFUl9FTkFCTEVfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjaw0KLSAqIHdoZXRoZXIgb3Igbm90IERyaXZlciBFbmFibGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4NCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBERURUICAgICAgICAgIExMX1VTQVJUX1NldERFRGVhc3NlcnRpb25UaW1lDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcGFyYW0gIFRpbWUgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0zMQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldERFRGVhc3NlcnRpb25UaW1lKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lKSB7DQotICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfREVEVCwgVGltZSA8PCBVU0FSVF9DUjFfREVEVF9Qb3MpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJldHVybiBERURUIChEcml2ZXIgRW5hYmxlIERlLUFzc2VydGlvbiBUaW1lKQ0KLSAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9EUklWRVJfRU5BQkxFX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sNCi0gKiB3aGV0aGVyIG9yIG5vdCBEcml2ZXIgRW5hYmxlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuDQotICogQHJtdG9sbCBDUjEgICAgICAgICAgREVEVCAgICAgICAgICBMTF9VU0FSVF9HZXRERURlYXNzZXJ0aW9uVGltZQ0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBUaW1lIHZhbHVlIGV4cHJlc3NlZCBvbiA1IGJpdHMgKFs0OjBdIGJpdHMpIDogVmFsdWUgYmV0d2Vlbg0KLSAqIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTMxDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldERFRGVhc3NlcnRpb25UaW1lKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9ERURUKSA+Pg0KLSAgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX0RFRFRfUG9zKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZXQgREVBVCAoRHJpdmVyIEVuYWJsZSBBc3NlcnRpb24gVGltZSksIFRpbWUgdmFsdWUgZXhwcmVzc2VkIG9uIDUNCi0gKiBiaXRzIChbNDowXSBiaXRzKS4NCi0gKiBAbm90ZSAgIE1hY3JvIElTX1VBUlRfRFJJVkVSX0VOQUJMRV9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrDQotICogd2hldGhlciBvciBub3QgRHJpdmVyIEVuYWJsZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLg0KLSAqIEBybXRvbGwgQ1IxICAgICAgICAgIERFQVQgICAgICAgICAgTExfVVNBUlRfU2V0REVBc3NlcnRpb25UaW1lDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcGFyYW0gIFRpbWUgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0zMQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldERFQXNzZXJ0aW9uVGltZShVU0FSVF9UeXBlRGVmICpVU0FSVHgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWUpIHsNCi0gIE1PRElGWV9SRUcoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9ERUFULCBUaW1lIDw8IFVTQVJUX0NSMV9ERUFUX1Bvcyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmV0dXJuIERFQVQgKERyaXZlciBFbmFibGUgQXNzZXJ0aW9uIFRpbWUpDQotICogQG5vdGUgICBNYWNybyBJU19VQVJUX0RSSVZFUl9FTkFCTEVfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjaw0KLSAqIHdoZXRoZXIgb3Igbm90IERyaXZlciBFbmFibGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4NCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBERUFUICAgICAgICAgIExMX1VTQVJUX0dldERFQXNzZXJ0aW9uVGltZQ0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBUaW1lIHZhbHVlIGV4cHJlc3NlZCBvbiA1IGJpdHMgKFs0OjBdIGJpdHMpIDogVmFsdWUgYmV0d2Vlbg0KLSAqIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTMxDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldERFQXNzZXJ0aW9uVGltZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfREVBVCkgPj4NCi0gICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMV9ERUFUX1Bvcyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIERyaXZlciBFbmFibGUgKERFKSBNb2RlDQotICogQG5vdGUgICBNYWNybyBJU19VQVJUX0RSSVZFUl9FTkFCTEVfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjaw0KLSAqIHdoZXRoZXIgb3Igbm90IERyaXZlciBFbmFibGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4NCi0gKiBAcm10b2xsIENSMyAgICAgICAgICBERU0gICAgICAgICAgIExMX1VTQVJUX0VuYWJsZURFTW9kZQ0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlREVNb2RlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgU0VUX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX0RFTSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBEcml2ZXIgRW5hYmxlIChERSkgTW9kZQ0KLSAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9EUklWRVJfRU5BQkxFX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sNCi0gKiB3aGV0aGVyIG9yIG5vdCBEcml2ZXIgRW5hYmxlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuDQotICogQHJtdG9sbCBDUjMgICAgICAgICAgREVNICAgICAgICAgICBMTF9VU0FSVF9EaXNhYmxlREVNb2RlDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlREVNb2RlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfREVNKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBJbmRpY2F0ZSBpZiBEcml2ZXIgRW5hYmxlIChERSkgTW9kZSBpcyBlbmFibGVkDQotICogQG5vdGUgICBNYWNybyBJU19VQVJUX0RSSVZFUl9FTkFCTEVfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjaw0KLSAqIHdoZXRoZXIgb3Igbm90IERyaXZlciBFbmFibGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4NCi0gKiBAcm10b2xsIENSMyAgICAgICAgICBERU0gICAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZERFTW9kZQ0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZERFTW9kZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfREVNKSA9PSAoVVNBUlRfQ1IzX0RFTSkpID8gMVVMDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2VsZWN0IERyaXZlciBFbmFibGUgUG9sYXJpdHkNCi0gKiBAbm90ZSAgIE1hY3JvIElTX1VBUlRfRFJJVkVSX0VOQUJMRV9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrDQotICogd2hldGhlciBvciBub3QgRHJpdmVyIEVuYWJsZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLg0KLSAqIEBybXRvbGwgQ1IzICAgICAgICAgIERFUCAgICAgICAgICAgTExfVVNBUlRfU2V0REVTaWduYWxQb2xhcml0eQ0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHBhcmFtICBQb2xhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0RFX1BPTEFSSVRZX0hJR0gNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9ERV9QT0xBUklUWV9MT1cNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRERVNpZ25hbFBvbGFyaXR5KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFBvbGFyaXR5KSB7DQotICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfREVQLCBQb2xhcml0eSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmV0dXJuIERyaXZlciBFbmFibGUgUG9sYXJpdHkNCi0gKiBAbm90ZSAgIE1hY3JvIElTX1VBUlRfRFJJVkVSX0VOQUJMRV9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrDQotICogd2hldGhlciBvciBub3QgRHJpdmVyIEVuYWJsZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLg0KLSAqIEBybXRvbGwgQ1IzICAgICAgICAgIERFUCAgICAgICAgICAgTExfVVNBUlRfR2V0REVTaWduYWxQb2xhcml0eQ0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0RFX1BPTEFSSVRZX0hJR0gNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9ERV9QT0xBUklUWV9MT1cNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0REVTaWduYWxQb2xhcml0eShVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfREVQKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FRl9BZHZhbmNlZENvbmZpZ3VyYXRpb24gQWR2YW5jZWQgQ29uZmlndXJhdGlvbnMgc2VydmljZXMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUGVyZm9ybSBiYXNpYyBjb25maWd1cmF0aW9uIG9mIFVTQVJUIGZvciBlbmFibGluZyB1c2UgaW4gQXN5bmNocm9ub3VzDQotICogTW9kZSAoVUFSVCkNCi0gKiBAbm90ZSAgIEluIFVBUlQgbW9kZSwgdGhlIGZvbGxvd2luZyBiaXRzIG11c3QgYmUga2VwdCBjbGVhcmVkOg0KLSAqICAgICAgICAgICAtIExJTkVOIGJpdCBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLA0KLSAqICAgICAgICAgICAtIENMS0VOIGJpdCBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLA0KLSAqICAgICAgICAgICAtIFNDRU4gYml0IGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIsDQotICogICAgICAgICAgIC0gSVJFTiBiaXQgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3RlciwNCi0gKiAgICAgICAgICAgLSBIRFNFTCBiaXQgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3Rlci4NCi0gKiBAbm90ZSAgIENhbGwgb2YgdGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIGZvbGxvd2luZyBmdW5jdGlvbiBjYWxsDQotICogc2VxdWVuY2UgOg0KLSAqICAgICAgICAgLSBDbGVhciBMSU5FTiBpbiBDUjIgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlTElOKCkgZnVuY3Rpb24NCi0gKiAgICAgICAgIC0gQ2xlYXIgQ0xLRU4gaW4gQ1IyIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZVNDTEtPdXRwdXQoKSBmdW5jdGlvbg0KLSAqICAgICAgICAgLSBDbGVhciBTQ0VOIGluIENSMyB1c2luZyBAcmVmIExMX1VTQVJUX0Rpc2FibGVTbWFydGNhcmQoKSBmdW5jdGlvbg0KLSAqICAgICAgICAgLSBDbGVhciBJUkVOIGluIENSMyB1c2luZyBAcmVmIExMX1VTQVJUX0Rpc2FibGVJcmRhKCkgZnVuY3Rpb24NCi0gKiAgICAgICAgIC0gQ2xlYXIgSERTRUwgaW4gQ1IzIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZUhhbGZEdXBsZXgoKSBmdW5jdGlvbg0KLSAqIEBub3RlICAgT3RoZXIgcmVtYWluaW5nIGNvbmZpZ3VyYXRpb25zIGl0ZW1zIHJlbGF0ZWQgdG8gQXN5bmNocm9ub3VzIE1vZGUNCi0gKiAgICAgICAgIChhcyBCYXVkIFJhdGUsIFdvcmQgbGVuZ3RoLCBQYXJpdHksIC4uLikgc2hvdWxkIGJlIHNldCB1c2luZw0KLSAqICAgICAgICAgZGVkaWNhdGVkIGZ1bmN0aW9ucw0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgIExJTkVOICAgICAgICAgTExfVVNBUlRfQ29uZmlnQXN5bmNNb2RlXG4NCi0gKiAgICAgICAgIENSMiAgICAgICAgICBDTEtFTiAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0FzeW5jTW9kZVxuDQotICogICAgICAgICBDUjMgICAgICAgICAgU0NFTiAgICAgICAgICBMTF9VU0FSVF9Db25maWdBc3luY01vZGVcbg0KLSAqICAgICAgICAgQ1IzICAgICAgICAgIElSRU4gICAgICAgICAgTExfVVNBUlRfQ29uZmlnQXN5bmNNb2RlXG4NCi0gKiAgICAgICAgIENSMyAgICAgICAgICBIRFNFTCAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0FzeW5jTW9kZQ0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfQ29uZmlnQXN5bmNNb2RlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgLyogSW4gQXN5bmNocm9ub3VzIG1vZGUsIHRoZSBmb2xsb3dpbmcgYml0cyBtdXN0IGJlIGtlcHQgY2xlYXJlZDoNCi0gIC0gTElORU4sIENMS0VOIGJpdHMgaW4gdGhlIFVTQVJUX0NSMiByZWdpc3RlciwNCi0gIC0gU0NFTiwgSVJFTiBhbmQgSERTRUwgYml0cyBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLg0KLSAgKi8NCi0gIENMRUFSX0JJVChVU0FSVHgtPkNSMiwgKFVTQVJUX0NSMl9MSU5FTiB8IFVTQVJUX0NSMl9DTEtFTikpOw0KLSAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IzLCAoVVNBUlRfQ1IzX1NDRU4gfCBVU0FSVF9DUjNfSVJFTiB8IFVTQVJUX0NSM19IRFNFTCkpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFBlcmZvcm0gYmFzaWMgY29uZmlndXJhdGlvbiBvZiBVU0FSVCBmb3IgZW5hYmxpbmcgdXNlIGluIFN5bmNocm9ub3VzDQotICogTW9kZQ0KLSAqIEBub3RlICAgSW4gU3luY2hyb25vdXMgbW9kZSwgdGhlIGZvbGxvd2luZyBiaXRzIG11c3QgYmUga2VwdCBjbGVhcmVkOg0KLSAqICAgICAgICAgICAtIExJTkVOIGJpdCBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLA0KLSAqICAgICAgICAgICAtIFNDRU4gYml0IGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIsDQotICogICAgICAgICAgIC0gSVJFTiBiaXQgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3RlciwNCi0gKiAgICAgICAgICAgLSBIRFNFTCBiaXQgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3Rlci4NCi0gKiAgICAgICAgIFRoaXMgZnVuY3Rpb24gYWxzbyBzZXRzIHRoZSBVU0FSVCBpbiBTeW5jaHJvbm91cyBtb2RlLg0KLSAqIEBub3RlICAgTWFjcm8gSVNfVVNBUlRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdA0KLSAqICAgICAgICAgU3luY2hyb25vdXMgbW9kZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4NCi0gKiBAbm90ZSAgIENhbGwgb2YgdGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIGZvbGxvd2luZyBmdW5jdGlvbiBjYWxsDQotICogc2VxdWVuY2UgOg0KLSAqICAgICAgICAgLSBDbGVhciBMSU5FTiBpbiBDUjIgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlTElOKCkgZnVuY3Rpb24NCi0gKiAgICAgICAgIC0gQ2xlYXIgSVJFTiBpbiBDUjMgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlSXJkYSgpIGZ1bmN0aW9uDQotICogICAgICAgICAtIENsZWFyIFNDRU4gaW4gQ1IzIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZVNtYXJ0Y2FyZCgpIGZ1bmN0aW9uDQotICogICAgICAgICAtIENsZWFyIEhEU0VMIGluIENSMyB1c2luZyBAcmVmIExMX1VTQVJUX0Rpc2FibGVIYWxmRHVwbGV4KCkgZnVuY3Rpb24NCi0gKiAgICAgICAgIC0gU2V0IENMS0VOIGluIENSMiB1c2luZyBAcmVmIExMX1VTQVJUX0VuYWJsZVNDTEtPdXRwdXQoKSBmdW5jdGlvbg0KLSAqIEBub3RlICAgT3RoZXIgcmVtYWluaW5nIGNvbmZpZ3VyYXRpb25zIGl0ZW1zIHJlbGF0ZWQgdG8gU3luY2hyb25vdXMgTW9kZQ0KLSAqICAgICAgICAgKGFzIEJhdWQgUmF0ZSwgV29yZCBsZW5ndGgsIFBhcml0eSwgQ2xvY2sgUG9sYXJpdHksIC4uLikgc2hvdWxkIGJlDQotICogc2V0IHVzaW5nIGRlZGljYXRlZCBmdW5jdGlvbnMNCi0gKiBAcm10b2xsIENSMiAgICAgICAgICBMSU5FTiAgICAgICAgIExMX1VTQVJUX0NvbmZpZ1N5bmNNb2RlXG4NCi0gKiAgICAgICAgIENSMiAgICAgICAgICBDTEtFTiAgICAgICAgIExMX1VTQVJUX0NvbmZpZ1N5bmNNb2RlXG4NCi0gKiAgICAgICAgIENSMyAgICAgICAgICBTQ0VOICAgICAgICAgIExMX1VTQVJUX0NvbmZpZ1N5bmNNb2RlXG4NCi0gKiAgICAgICAgIENSMyAgICAgICAgICBJUkVOICAgICAgICAgIExMX1VTQVJUX0NvbmZpZ1N5bmNNb2RlXG4NCi0gKiAgICAgICAgIENSMyAgICAgICAgICBIRFNFTCAgICAgICAgIExMX1VTQVJUX0NvbmZpZ1N5bmNNb2RlDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9Db25maWdTeW5jTW9kZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIC8qIEluIFN5bmNocm9ub3VzIG1vZGUsIHRoZSBmb2xsb3dpbmcgYml0cyBtdXN0IGJlIGtlcHQgY2xlYXJlZDoNCi0gIC0gTElORU4gYml0IGluIHRoZSBVU0FSVF9DUjIgcmVnaXN0ZXIsDQotICAtIFNDRU4sIElSRU4gYW5kIEhEU0VMIGJpdHMgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3Rlci4NCi0gICovDQotICBDTEVBUl9CSVQoVVNBUlR4LT5DUjIsIChVU0FSVF9DUjJfTElORU4pKTsNCi0gIENMRUFSX0JJVChVU0FSVHgtPkNSMywgKFVTQVJUX0NSM19TQ0VOIHwgVVNBUlRfQ1IzX0lSRU4gfCBVU0FSVF9DUjNfSERTRUwpKTsNCi0gIC8qIHNldCB0aGUgVUFSVC9VU0FSVCBpbiBTeW5jaHJvbm91cyBtb2RlICovDQotICBTRVRfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfQ0xLRU4pOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFBlcmZvcm0gYmFzaWMgY29uZmlndXJhdGlvbiBvZiBVU0FSVCBmb3IgZW5hYmxpbmcgdXNlIGluIExJTiBNb2RlDQotICogQG5vdGUgICBJbiBMSU4gbW9kZSwgdGhlIGZvbGxvd2luZyBiaXRzIG11c3QgYmUga2VwdCBjbGVhcmVkOg0KLSAqICAgICAgICAgICAtIFNUT1AgYW5kIENMS0VOIGJpdHMgaW4gdGhlIFVTQVJUX0NSMiByZWdpc3RlciwNCi0gKiAgICAgICAgICAgLSBTQ0VOIGJpdCBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLA0KLSAqICAgICAgICAgICAtIElSRU4gYml0IGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIsDQotICogICAgICAgICAgIC0gSERTRUwgYml0IGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIuDQotICogICAgICAgICBUaGlzIGZ1bmN0aW9uIGFsc28gc2V0IHRoZSBVQVJUL1VTQVJUIGluIExJTiBtb2RlLg0KLSAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9MSU5fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yDQotICogbm90IExJTiBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLg0KLSAqIEBub3RlICAgQ2FsbCBvZiB0aGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gZm9sbG93aW5nIGZ1bmN0aW9uIGNhbGwNCi0gKiBzZXF1ZW5jZSA6DQotICogICAgICAgICAtIENsZWFyIENMS0VOIGluIENSMiB1c2luZyBAcmVmIExMX1VTQVJUX0Rpc2FibGVTQ0xLT3V0cHV0KCkgZnVuY3Rpb24NCi0gKiAgICAgICAgIC0gQ2xlYXIgU1RPUCBpbiBDUjIgdXNpbmcgQHJlZiBMTF9VU0FSVF9TZXRTdG9wQml0c0xlbmd0aCgpIGZ1bmN0aW9uDQotICogICAgICAgICAtIENsZWFyIFNDRU4gaW4gQ1IzIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZVNtYXJ0Y2FyZCgpIGZ1bmN0aW9uDQotICogICAgICAgICAtIENsZWFyIElSRU4gaW4gQ1IzIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZUlyZGEoKSBmdW5jdGlvbg0KLSAqICAgICAgICAgLSBDbGVhciBIRFNFTCBpbiBDUjMgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlSGFsZkR1cGxleCgpIGZ1bmN0aW9uDQotICogICAgICAgICAtIFNldCBMSU5FTiBpbiBDUjIgdXNpbmcgQHJlZiBMTF9VU0FSVF9FbmFibGVMSU4oKSBmdW5jdGlvbg0KLSAqIEBub3RlICAgT3RoZXIgcmVtYWluaW5nIGNvbmZpZ3VyYXRpb25zIGl0ZW1zIHJlbGF0ZWQgdG8gTElOIE1vZGUNCi0gKiAgICAgICAgIChhcyBCYXVkIFJhdGUsIFdvcmQgbGVuZ3RoLCBMSU4gQnJlYWsgRGV0ZWN0aW9uIExlbmd0aCwgLi4uKSBzaG91bGQNCi0gKiBiZSBzZXQgdXNpbmcgZGVkaWNhdGVkIGZ1bmN0aW9ucw0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgIENMS0VOICAgICAgICAgTExfVVNBUlRfQ29uZmlnTElOTW9kZVxuDQotICogICAgICAgICBDUjIgICAgICAgICAgU1RPUCAgICAgICAgICBMTF9VU0FSVF9Db25maWdMSU5Nb2RlXG4NCi0gKiAgICAgICAgIENSMiAgICAgICAgICBMSU5FTiAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0xJTk1vZGVcbg0KLSAqICAgICAgICAgQ1IzICAgICAgICAgIElSRU4gICAgICAgICAgTExfVVNBUlRfQ29uZmlnTElOTW9kZVxuDQotICogICAgICAgICBDUjMgICAgICAgICAgU0NFTiAgICAgICAgICBMTF9VU0FSVF9Db25maWdMSU5Nb2RlXG4NCi0gKiAgICAgICAgIENSMyAgICAgICAgICBIRFNFTCAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0xJTk1vZGUNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0NvbmZpZ0xJTk1vZGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7DQotICAvKiBJbiBMSU4gbW9kZSwgdGhlIGZvbGxvd2luZyBiaXRzIG11c3QgYmUga2VwdCBjbGVhcmVkOg0KLSAgLSBTVE9QIGFuZCBDTEtFTiBiaXRzIGluIHRoZSBVU0FSVF9DUjIgcmVnaXN0ZXIsDQotICAtIElSRU4sIFNDRU4gYW5kIEhEU0VMIGJpdHMgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3Rlci4NCi0gICovDQotICBDTEVBUl9CSVQoVVNBUlR4LT5DUjIsIChVU0FSVF9DUjJfQ0xLRU4gfCBVU0FSVF9DUjJfU1RPUCkpOw0KLSAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IzLCAoVVNBUlRfQ1IzX0lSRU4gfCBVU0FSVF9DUjNfU0NFTiB8IFVTQVJUX0NSM19IRFNFTCkpOw0KLSAgLyogU2V0IHRoZSBVQVJUL1VTQVJUIGluIExJTiBtb2RlICovDQotICBTRVRfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfTElORU4pOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFBlcmZvcm0gYmFzaWMgY29uZmlndXJhdGlvbiBvZiBVU0FSVCBmb3IgZW5hYmxpbmcgdXNlIGluIEhhbGYgRHVwbGV4DQotICogTW9kZQ0KLSAqIEBub3RlICAgSW4gSGFsZiBEdXBsZXggbW9kZSwgdGhlIGZvbGxvd2luZyBiaXRzIG11c3QgYmUga2VwdCBjbGVhcmVkOg0KLSAqICAgICAgICAgICAtIExJTkVOIGJpdCBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLA0KLSAqICAgICAgICAgICAtIENMS0VOIGJpdCBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLA0KLSAqICAgICAgICAgICAtIFNDRU4gYml0IGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIsDQotICogICAgICAgICAgIC0gSVJFTiBiaXQgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3RlciwNCi0gKiAgICAgICAgIFRoaXMgZnVuY3Rpb24gYWxzbyBzZXRzIHRoZSBVQVJUL1VTQVJUIGluIEhhbGYgRHVwbGV4IG1vZGUuDQotICogQG5vdGUgICBNYWNybyBJU19VQVJUX0hBTEZEVVBMRVhfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjaw0KLSAqIHdoZXRoZXIgb3Igbm90IEhhbGYtRHVwbGV4IG1vZGUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuDQotICogQG5vdGUgICBDYWxsIG9mIHRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byBmb2xsb3dpbmcgZnVuY3Rpb24gY2FsbA0KLSAqIHNlcXVlbmNlIDoNCi0gKiAgICAgICAgIC0gQ2xlYXIgTElORU4gaW4gQ1IyIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZUxJTigpIGZ1bmN0aW9uDQotICogICAgICAgICAtIENsZWFyIENMS0VOIGluIENSMiB1c2luZyBAcmVmIExMX1VTQVJUX0Rpc2FibGVTQ0xLT3V0cHV0KCkgZnVuY3Rpb24NCi0gKiAgICAgICAgIC0gQ2xlYXIgU0NFTiBpbiBDUjMgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlU21hcnRjYXJkKCkgZnVuY3Rpb24NCi0gKiAgICAgICAgIC0gQ2xlYXIgSVJFTiBpbiBDUjMgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlSXJkYSgpIGZ1bmN0aW9uDQotICogICAgICAgICAtIFNldCBIRFNFTCBpbiBDUjMgdXNpbmcgQHJlZiBMTF9VU0FSVF9FbmFibGVIYWxmRHVwbGV4KCkgZnVuY3Rpb24NCi0gKiBAbm90ZSAgIE90aGVyIHJlbWFpbmluZyBjb25maWd1cmF0aW9ucyBpdGVtcyByZWxhdGVkIHRvIEhhbGYgRHVwbGV4IE1vZGUNCi0gKiAgICAgICAgIChhcyBCYXVkIFJhdGUsIFdvcmQgbGVuZ3RoLCBQYXJpdHksIC4uLikgc2hvdWxkIGJlIHNldCB1c2luZw0KLSAqICAgICAgICAgZGVkaWNhdGVkIGZ1bmN0aW9ucw0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgIExJTkVOICAgICAgICAgTExfVVNBUlRfQ29uZmlnSGFsZkR1cGxleE1vZGVcbg0KLSAqICAgICAgICAgQ1IyICAgICAgICAgIENMS0VOICAgICAgICAgTExfVVNBUlRfQ29uZmlnSGFsZkR1cGxleE1vZGVcbg0KLSAqICAgICAgICAgQ1IzICAgICAgICAgIEhEU0VMICAgICAgICAgTExfVVNBUlRfQ29uZmlnSGFsZkR1cGxleE1vZGVcbg0KLSAqICAgICAgICAgQ1IzICAgICAgICAgIFNDRU4gICAgICAgICAgTExfVVNBUlRfQ29uZmlnSGFsZkR1cGxleE1vZGVcbg0KLSAqICAgICAgICAgQ1IzICAgICAgICAgIElSRU4gICAgICAgICAgTExfVVNBUlRfQ29uZmlnSGFsZkR1cGxleE1vZGUNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0NvbmZpZ0hhbGZEdXBsZXhNb2RlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgLyogSW4gSGFsZiBEdXBsZXggbW9kZSwgdGhlIGZvbGxvd2luZyBiaXRzIG11c3QgYmUga2VwdCBjbGVhcmVkOg0KLSAgLSBMSU5FTiBhbmQgQ0xLRU4gYml0cyBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLA0KLSAgLSBTQ0VOIGFuZCBJUkVOIGJpdHMgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3Rlci4NCi0gICovDQotICBDTEVBUl9CSVQoVVNBUlR4LT5DUjIsIChVU0FSVF9DUjJfTElORU4gfCBVU0FSVF9DUjJfQ0xLRU4pKTsNCi0gIENMRUFSX0JJVChVU0FSVHgtPkNSMywgKFVTQVJUX0NSM19TQ0VOIHwgVVNBUlRfQ1IzX0lSRU4pKTsNCi0gIC8qIHNldCB0aGUgVUFSVC9VU0FSVCBpbiBIYWxmIER1cGxleCBtb2RlICovDQotICBTRVRfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfSERTRUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFBlcmZvcm0gYmFzaWMgY29uZmlndXJhdGlvbiBvZiBVU0FSVCBmb3IgZW5hYmxpbmcgdXNlIGluIFNtYXJ0Y2FyZA0KLSAqIE1vZGUNCi0gKiBAbm90ZSAgIEluIFNtYXJ0Y2FyZCBtb2RlLCB0aGUgZm9sbG93aW5nIGJpdHMgbXVzdCBiZSBrZXB0IGNsZWFyZWQ6DQotICogICAgICAgICAgIC0gTElORU4gYml0IGluIHRoZSBVU0FSVF9DUjIgcmVnaXN0ZXIsDQotICogICAgICAgICAgIC0gSVJFTiBiaXQgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3RlciwNCi0gKiAgICAgICAgICAgLSBIRFNFTCBiaXQgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3Rlci4NCi0gKiAgICAgICAgIFRoaXMgZnVuY3Rpb24gYWxzbyBjb25maWd1cmVzIFN0b3AgYml0cyB0byAxLjUgYml0cyBhbmQNCi0gKiAgICAgICAgIHNldHMgdGhlIFVTQVJUIGluIFNtYXJ0Y2FyZCBtb2RlIChTQ0VOIGJpdCkuDQotICogICAgICAgICBDbG9jayBPdXRwdXQgaXMgYWxzbyBlbmFibGVkIChDTEtFTikuDQotICogQG5vdGUgICBNYWNybyBJU19TTUFSVENBUkRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yDQotICogbm90IFNtYXJ0Y2FyZCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLg0KLSAqIEBub3RlICAgQ2FsbCBvZiB0aGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gZm9sbG93aW5nIGZ1bmN0aW9uIGNhbGwNCi0gKiBzZXF1ZW5jZSA6DQotICogICAgICAgICAtIENsZWFyIExJTkVOIGluIENSMiB1c2luZyBAcmVmIExMX1VTQVJUX0Rpc2FibGVMSU4oKSBmdW5jdGlvbg0KLSAqICAgICAgICAgLSBDbGVhciBJUkVOIGluIENSMyB1c2luZyBAcmVmIExMX1VTQVJUX0Rpc2FibGVJcmRhKCkgZnVuY3Rpb24NCi0gKiAgICAgICAgIC0gQ2xlYXIgSERTRUwgaW4gQ1IzIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZUhhbGZEdXBsZXgoKSBmdW5jdGlvbg0KLSAqICAgICAgICAgLSBDb25maWd1cmUgU1RPUCBpbiBDUjIgdXNpbmcgQHJlZiBMTF9VU0FSVF9TZXRTdG9wQml0c0xlbmd0aCgpDQotICogZnVuY3Rpb24NCi0gKiAgICAgICAgIC0gU2V0IENMS0VOIGluIENSMiB1c2luZyBAcmVmIExMX1VTQVJUX0VuYWJsZVNDTEtPdXRwdXQoKSBmdW5jdGlvbg0KLSAqICAgICAgICAgLSBTZXQgU0NFTiBpbiBDUjMgdXNpbmcgQHJlZiBMTF9VU0FSVF9FbmFibGVTbWFydGNhcmQoKSBmdW5jdGlvbg0KLSAqIEBub3RlICAgT3RoZXIgcmVtYWluaW5nIGNvbmZpZ3VyYXRpb25zIGl0ZW1zIHJlbGF0ZWQgdG8gU21hcnRjYXJkIE1vZGUNCi0gKiAgICAgICAgIChhcyBCYXVkIFJhdGUsIFdvcmQgbGVuZ3RoLCBQYXJpdHksIC4uLikgc2hvdWxkIGJlIHNldCB1c2luZw0KLSAqICAgICAgICAgZGVkaWNhdGVkIGZ1bmN0aW9ucw0KLSAqIEBybXRvbGwgQ1IyICAgICAgICAgIExJTkVOICAgICAgICAgTExfVVNBUlRfQ29uZmlnU21hcnRjYXJkTW9kZVxuDQotICogICAgICAgICBDUjIgICAgICAgICAgU1RPUCAgICAgICAgICBMTF9VU0FSVF9Db25maWdTbWFydGNhcmRNb2RlXG4NCi0gKiAgICAgICAgIENSMiAgICAgICAgICBDTEtFTiAgICAgICAgIExMX1VTQVJUX0NvbmZpZ1NtYXJ0Y2FyZE1vZGVcbg0KLSAqICAgICAgICAgQ1IzICAgICAgICAgIEhEU0VMICAgICAgICAgTExfVVNBUlRfQ29uZmlnU21hcnRjYXJkTW9kZVxuDQotICogICAgICAgICBDUjMgICAgICAgICAgU0NFTiAgICAgICAgICBMTF9VU0FSVF9Db25maWdTbWFydGNhcmRNb2RlDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9Db25maWdTbWFydGNhcmRNb2RlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgLyogSW4gU21hcnRjYXJkIG1vZGUsIHRoZSBmb2xsb3dpbmcgYml0cyBtdXN0IGJlIGtlcHQgY2xlYXJlZDoNCi0gIC0gTElORU4gYml0IGluIHRoZSBVU0FSVF9DUjIgcmVnaXN0ZXIsDQotICAtIElSRU4gYW5kIEhEU0VMIGJpdHMgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3Rlci4NCi0gICovDQotICBDTEVBUl9CSVQoVVNBUlR4LT5DUjIsIChVU0FSVF9DUjJfTElORU4pKTsNCi0gIENMRUFSX0JJVChVU0FSVHgtPkNSMywgKFVTQVJUX0NSM19JUkVOIHwgVVNBUlRfQ1IzX0hEU0VMKSk7DQotICAvKiBDb25maWd1cmUgU3RvcCBiaXRzIHRvIDEuNSBiaXRzICovDQotICAvKiBTeW5jaHJvbm91cyBtb2RlIGlzIGFjdGl2YXRlZCBieSBkZWZhdWx0ICovDQotICBTRVRfQklUKFVTQVJUeC0+Q1IyLCAoVVNBUlRfQ1IyX1NUT1BfMCB8IFVTQVJUX0NSMl9TVE9QXzEgfCBVU0FSVF9DUjJfQ0xLRU4pKTsNCi0gIC8qIHNldCB0aGUgVUFSVC9VU0FSVCBpbiBTbWFydGNhcmQgbW9kZSAqLw0KLSAgU0VUX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX1NDRU4pOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFBlcmZvcm0gYmFzaWMgY29uZmlndXJhdGlvbiBvZiBVU0FSVCBmb3IgZW5hYmxpbmcgdXNlIGluIElyZGEgTW9kZQ0KLSAqIEBub3RlICAgSW4gSVJEQSBtb2RlLCB0aGUgZm9sbG93aW5nIGJpdHMgbXVzdCBiZSBrZXB0IGNsZWFyZWQ6DQotICogICAgICAgICAgIC0gTElORU4gYml0IGluIHRoZSBVU0FSVF9DUjIgcmVnaXN0ZXIsDQotICogICAgICAgICAgIC0gU1RPUCBhbmQgQ0xLRU4gYml0cyBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLA0KLSAqICAgICAgICAgICAtIFNDRU4gYml0IGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIsDQotICogICAgICAgICAgIC0gSERTRUwgYml0IGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIuDQotICogICAgICAgICBUaGlzIGZ1bmN0aW9uIGFsc28gc2V0cyB0aGUgVUFSVC9VU0FSVCBpbiBJUkRBIG1vZGUgKElSRU4gYml0KS4NCi0gKiBAbm90ZSAgIE1hY3JvIElTX0lSREFfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdA0KLSAqICAgICAgICAgSXJEQSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLg0KLSAqIEBub3RlICAgQ2FsbCBvZiB0aGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gZm9sbG93aW5nIGZ1bmN0aW9uIGNhbGwNCi0gKiBzZXF1ZW5jZSA6DQotICogICAgICAgICAtIENsZWFyIExJTkVOIGluIENSMiB1c2luZyBAcmVmIExMX1VTQVJUX0Rpc2FibGVMSU4oKSBmdW5jdGlvbg0KLSAqICAgICAgICAgLSBDbGVhciBDTEtFTiBpbiBDUjIgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlU0NMS091dHB1dCgpIGZ1bmN0aW9uDQotICogICAgICAgICAtIENsZWFyIFNDRU4gaW4gQ1IzIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZVNtYXJ0Y2FyZCgpIGZ1bmN0aW9uDQotICogICAgICAgICAtIENsZWFyIEhEU0VMIGluIENSMyB1c2luZyBAcmVmIExMX1VTQVJUX0Rpc2FibGVIYWxmRHVwbGV4KCkgZnVuY3Rpb24NCi0gKiAgICAgICAgIC0gQ29uZmlndXJlIFNUT1AgaW4gQ1IyIHVzaW5nIEByZWYgTExfVVNBUlRfU2V0U3RvcEJpdHNMZW5ndGgoKQ0KLSAqIGZ1bmN0aW9uDQotICogICAgICAgICAtIFNldCBJUkVOIGluIENSMyB1c2luZyBAcmVmIExMX1VTQVJUX0VuYWJsZUlyZGEoKSBmdW5jdGlvbg0KLSAqIEBub3RlICAgT3RoZXIgcmVtYWluaW5nIGNvbmZpZ3VyYXRpb25zIGl0ZW1zIHJlbGF0ZWQgdG8gSXJkYSBNb2RlDQotICogICAgICAgICAoYXMgQmF1ZCBSYXRlLCBXb3JkIGxlbmd0aCwgUG93ZXIgbW9kZSwgLi4uKSBzaG91bGQgYmUgc2V0IHVzaW5nDQotICogICAgICAgICBkZWRpY2F0ZWQgZnVuY3Rpb25zDQotICogQHJtdG9sbCBDUjIgICAgICAgICAgTElORU4gICAgICAgICBMTF9VU0FSVF9Db25maWdJcmRhTW9kZVxuDQotICogICAgICAgICBDUjIgICAgICAgICAgQ0xLRU4gICAgICAgICBMTF9VU0FSVF9Db25maWdJcmRhTW9kZVxuDQotICogICAgICAgICBDUjIgICAgICAgICAgU1RPUCAgICAgICAgICBMTF9VU0FSVF9Db25maWdJcmRhTW9kZVxuDQotICogICAgICAgICBDUjMgICAgICAgICAgU0NFTiAgICAgICAgICBMTF9VU0FSVF9Db25maWdJcmRhTW9kZVxuDQotICogICAgICAgICBDUjMgICAgICAgICAgSERTRUwgICAgICAgICBMTF9VU0FSVF9Db25maWdJcmRhTW9kZVxuDQotICogICAgICAgICBDUjMgICAgICAgICAgSVJFTiAgICAgICAgICBMTF9VU0FSVF9Db25maWdJcmRhTW9kZQ0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfQ29uZmlnSXJkYU1vZGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7DQotICAvKiBJbiBJUkRBIG1vZGUsIHRoZSBmb2xsb3dpbmcgYml0cyBtdXN0IGJlIGtlcHQgY2xlYXJlZDoNCi0gIC0gTElORU4sIFNUT1AgYW5kIENMS0VOIGJpdHMgaW4gdGhlIFVTQVJUX0NSMiByZWdpc3RlciwNCi0gIC0gU0NFTiBhbmQgSERTRUwgYml0cyBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLg0KLSAgKi8NCi0gIENMRUFSX0JJVChVU0FSVHgtPkNSMiwgKFVTQVJUX0NSMl9MSU5FTiB8IFVTQVJUX0NSMl9DTEtFTiB8IFVTQVJUX0NSMl9TVE9QKSk7DQotICBDTEVBUl9CSVQoVVNBUlR4LT5DUjMsIChVU0FSVF9DUjNfU0NFTiB8IFVTQVJUX0NSM19IRFNFTCkpOw0KLSAgLyogc2V0IHRoZSBVQVJUL1VTQVJUIGluIElSREEgbW9kZSAqLw0KLSAgU0VUX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX0lSRU4pOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFBlcmZvcm0gYmFzaWMgY29uZmlndXJhdGlvbiBvZiBVU0FSVCBmb3IgZW5hYmxpbmcgdXNlIGluIE11bHRpDQotICogcHJvY2Vzc29yIE1vZGUgKHNldmVyYWwgVVNBUlRzIGNvbm5lY3RlZCBpbiBhIG5ldHdvcmssIG9uZSBvZiB0aGUgVVNBUlRzIGNhbg0KLSAqIGJlIHRoZSBtYXN0ZXIsIGl0cyBUWCBvdXRwdXQgY29ubmVjdGVkIHRvIHRoZSBSWCBpbnB1dHMgb2YgdGhlIG90aGVyIHNsYXZlcw0KLSAqIFVTQVJUcykuDQotICogQG5vdGUgICBJbiBNdWx0aVByb2Nlc3NvciBtb2RlLCB0aGUgZm9sbG93aW5nIGJpdHMgbXVzdCBiZSBrZXB0IGNsZWFyZWQ6DQotICogICAgICAgICAgIC0gTElORU4gYml0IGluIHRoZSBVU0FSVF9DUjIgcmVnaXN0ZXIsDQotICogICAgICAgICAgIC0gQ0xLRU4gYml0IGluIHRoZSBVU0FSVF9DUjIgcmVnaXN0ZXIsDQotICogICAgICAgICAgIC0gU0NFTiBiaXQgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3RlciwNCi0gKiAgICAgICAgICAgLSBJUkVOIGJpdCBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLA0KLSAqICAgICAgICAgICAtIEhEU0VMIGJpdCBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLg0KLSAqIEBub3RlICAgQ2FsbCBvZiB0aGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gZm9sbG93aW5nIGZ1bmN0aW9uIGNhbGwNCi0gKiBzZXF1ZW5jZSA6DQotICogICAgICAgICAtIENsZWFyIExJTkVOIGluIENSMiB1c2luZyBAcmVmIExMX1VTQVJUX0Rpc2FibGVMSU4oKSBmdW5jdGlvbg0KLSAqICAgICAgICAgLSBDbGVhciBDTEtFTiBpbiBDUjIgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlU0NMS091dHB1dCgpIGZ1bmN0aW9uDQotICogICAgICAgICAtIENsZWFyIFNDRU4gaW4gQ1IzIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZVNtYXJ0Y2FyZCgpIGZ1bmN0aW9uDQotICogICAgICAgICAtIENsZWFyIElSRU4gaW4gQ1IzIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZUlyZGEoKSBmdW5jdGlvbg0KLSAqICAgICAgICAgLSBDbGVhciBIRFNFTCBpbiBDUjMgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlSGFsZkR1cGxleCgpIGZ1bmN0aW9uDQotICogQG5vdGUgICBPdGhlciByZW1haW5pbmcgY29uZmlndXJhdGlvbnMgaXRlbXMgcmVsYXRlZCB0byBNdWx0aSBwcm9jZXNzb3IgTW9kZQ0KLSAqICAgICAgICAgKGFzIEJhdWQgUmF0ZSwgV2FrZSBVcCBNZXRob2QsIE5vZGUgYWRkcmVzcywgLi4uKSBzaG91bGQgYmUgc2V0IHVzaW5nDQotICogICAgICAgICBkZWRpY2F0ZWQgZnVuY3Rpb25zDQotICogQHJtdG9sbCBDUjIgICAgICAgICAgTElORU4gICAgICAgICBMTF9VU0FSVF9Db25maWdNdWx0aVByb2Nlc3NNb2RlXG4NCi0gKiAgICAgICAgIENSMiAgICAgICAgICBDTEtFTiAgICAgICAgIExMX1VTQVJUX0NvbmZpZ011bHRpUHJvY2Vzc01vZGVcbg0KLSAqICAgICAgICAgQ1IzICAgICAgICAgIFNDRU4gICAgICAgICAgTExfVVNBUlRfQ29uZmlnTXVsdGlQcm9jZXNzTW9kZVxuDQotICogICAgICAgICBDUjMgICAgICAgICAgSERTRUwgICAgICAgICBMTF9VU0FSVF9Db25maWdNdWx0aVByb2Nlc3NNb2RlXG4NCi0gKiAgICAgICAgIENSMyAgICAgICAgICBJUkVOICAgICAgICAgIExMX1VTQVJUX0NvbmZpZ011bHRpUHJvY2Vzc01vZGUNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0NvbmZpZ011bHRpUHJvY2Vzc01vZGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7DQotICAvKiBJbiBNdWx0aSBQcm9jZXNzb3IgbW9kZSwgdGhlIGZvbGxvd2luZyBiaXRzIG11c3QgYmUga2VwdCBjbGVhcmVkOg0KLSAgLSBMSU5FTiBhbmQgQ0xLRU4gYml0cyBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLA0KLSAgLSBJUkVOLCBTQ0VOIGFuZCBIRFNFTCBiaXRzIGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIuDQotICAqLw0KLSAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IyLCAoVVNBUlRfQ1IyX0xJTkVOIHwgVVNBUlRfQ1IyX0NMS0VOKSk7DQotICBDTEVBUl9CSVQoVVNBUlR4LT5DUjMsIChVU0FSVF9DUjNfU0NFTiB8IFVTQVJUX0NSM19IRFNFTCB8IFVTQVJUX0NSM19JUkVOKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FRl9GTEFHX01hbmFnZW1lbnQgRkxBR19NYW5hZ2VtZW50DQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBQYXJpdHkgRXJyb3IgRmxhZyBpcyBzZXQgb3Igbm90DQotICogQHJtdG9sbCBJU1IgICAgICAgICAgUEUgICAgICAgICAgICBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfUEUNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfUEUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPklTUiwgVVNBUlRfSVNSX1BFKSA9PSAoVVNBUlRfSVNSX1BFKSkgPyAxVUwgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBGcmFtaW5nIEVycm9yIEZsYWcgaXMgc2V0IG9yIG5vdA0KLSAqIEBybXRvbGwgSVNSICAgICAgICAgIEZFICAgICAgICAgICAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX0ZFDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNBY3RpdmVGbGFnX0ZFKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5JU1IsIFVTQVJUX0lTUl9GRSkgPT0gKFVTQVJUX0lTUl9GRSkpID8gMVVMIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgTm9pc2UgZXJyb3IgZGV0ZWN0ZWQgRmxhZyBpcyBzZXQgb3Igbm90DQotICogQHJtdG9sbCBJU1IgICAgICAgICAgTkUgICAgICAgICAgICBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfTkUNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfTkUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPklTUiwgVVNBUlRfSVNSX05FKSA9PSAoVVNBUlRfSVNSX05FKSkgPyAxVUwgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBPdmVyUnVuIEVycm9yIEZsYWcgaXMgc2V0IG9yIG5vdA0KLSAqIEBybXRvbGwgSVNSICAgICAgICAgIE9SRSAgICAgICAgICAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX09SRQ0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzQWN0aXZlRmxhZ19PUkUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPklTUiwgVVNBUlRfSVNSX09SRSkgPT0gKFVTQVJUX0lTUl9PUkUpKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBJRExFIGxpbmUgZGV0ZWN0ZWQgRmxhZyBpcyBzZXQgb3Igbm90DQotICogQHJtdG9sbCBJU1IgICAgICAgICAgSURMRSAgICAgICAgICBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfSURMRQ0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzQWN0aXZlRmxhZ19JRExFKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5JU1IsIFVTQVJUX0lTUl9JRExFKSA9PSAoVVNBUlRfSVNSX0lETEUpKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qIExlZ2FjeSBkZWZpbmUgKi8NCi0jZGVmaW5lIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19SWE5FIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19SWE5FX1JYRk5FDQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgUmVhZCBEYXRhIFJlZ2lzdGVyIG9yIFVTQVJUIFJYIEZJRk8gTm90IEVtcHR5IEZsYWcNCi0gKiBpcyBzZXQgb3Igbm90DQotICogQG5vdGUgICBNYWNybyBJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yDQotICogbm90IEZJRk8gbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLg0KLSAqIEBybXRvbGwgSVNSICAgICAgICAgIFJYTkVfUlhGTkUgICAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1JYTkVfUlhGTkUNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdA0KLUxMX1VTQVJUX0lzQWN0aXZlRmxhZ19SWE5FX1JYRk5FKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgcmV0dXJuICgNCi0gICAgICAoUkVBRF9CSVQoVVNBUlR4LT5JU1IsIFVTQVJUX0lTUl9SWE5FX1JYRk5FKSA9PSAoVVNBUlRfSVNSX1JYTkVfUlhGTkUpKQ0KLSAgICAgICAgICA/IDFVTA0KLSAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBGbGFnIGlzIHNldCBvciBub3QNCi0gKiBAcm10b2xsIElTUiAgICAgICAgICBUQyAgICAgICAgICAgIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19UQw0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzQWN0aXZlRmxhZ19UQyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+SVNSLCBVU0FSVF9JU1JfVEMpID09IChVU0FSVF9JU1JfVEMpKSA/IDFVTCA6IDBVTCk7DQotfQ0KLQ0KLS8qIExlZ2FjeSBkZWZpbmUgKi8NCi0jZGVmaW5lIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19UWEUgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1RYRV9UWEZORg0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIFRyYW5zbWl0IERhdGEgUmVnaXN0ZXIgRW1wdHkgb3IgVVNBUlQgVFggRklGTyBOb3QNCi0gKiBGdWxsIEZsYWcgaXMgc2V0IG9yIG5vdA0KLSAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9GSUZPX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvcg0KLSAqIG5vdCBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4NCi0gKiBAcm10b2xsIElTUiAgICAgICAgICBUWEVfVFhGTkYgICAgIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19UWEVfVFhGTkYNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdA0KLUxMX1VTQVJUX0lzQWN0aXZlRmxhZ19UWEVfVFhGTkYoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPklTUiwgVVNBUlRfSVNSX1RYRV9UWEZORikgPT0gKFVTQVJUX0lTUl9UWEVfVFhGTkYpKQ0KLSAgICAgICAgICAgICAgPyAxVUwNCi0gICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgTElOIEJyZWFrIERldGVjdGlvbiBGbGFnIGlzIHNldCBvciBub3QNCi0gKiBAbm90ZSAgIE1hY3JvIElTX1VBUlRfTElOX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvcg0KLSAqIG5vdCBMSU4gZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4NCi0gKiBAcm10b2xsIElTUiAgICAgICAgICBMQkRGICAgICAgICAgIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19MQkQNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfTEJEKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5JU1IsIFVTQVJUX0lTUl9MQkRGKSA9PSAoVVNBUlRfSVNSX0xCREYpKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIENUUyBpbnRlcnJ1cHQgRmxhZyBpcyBzZXQgb3Igbm90DQotICogQG5vdGUgICBNYWNybyBJU19VQVJUX0hXRkxPV19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3INCi0gKiBub3QgSGFyZHdhcmUgRmxvdyBjb250cm9sIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuDQotICogQHJtdG9sbCBJU1IgICAgICAgICAgQ1RTSUYgICAgICAgICBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfbkNUUw0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzQWN0aXZlRmxhZ19uQ1RTKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5JU1IsIFVTQVJUX0lTUl9DVFNJRikgPT0gKFVTQVJUX0lTUl9DVFNJRikpID8gMVVMDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBDVFMgRmxhZyBpcyBzZXQgb3Igbm90DQotICogQG5vdGUgICBNYWNybyBJU19VQVJUX0hXRkxPV19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3INCi0gKiBub3QgSGFyZHdhcmUgRmxvdyBjb250cm9sIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuDQotICogQHJtdG9sbCBJU1IgICAgICAgICAgQ1RTICAgICAgICAgICBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfQ1RTDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNBY3RpdmVGbGFnX0NUUyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+SVNSLCBVU0FSVF9JU1JfQ1RTKSA9PSAoVVNBUlRfSVNSX0NUUykpID8gMVVMDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIFJlY2VpdmVyIFRpbWUgT3V0IEZsYWcgaXMgc2V0IG9yIG5vdA0KLSAqIEBybXRvbGwgSVNSICAgICAgICAgIFJUT0YgICAgICAgICAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1JUTw0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzQWN0aXZlRmxhZ19SVE8oVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPklTUiwgVVNBUlRfSVNSX1JUT0YpID09IChVU0FSVF9JU1JfUlRPRikpID8gMVVMDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgRW5kIE9mIEJsb2NrIEZsYWcgaXMgc2V0IG9yIG5vdA0KLSAqIEBub3RlICAgTWFjcm8gSVNfU01BUlRDQVJEX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvcg0KLSAqIG5vdCBTbWFydGNhcmQgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4NCi0gKiBAcm10b2xsIElTUiAgICAgICAgICBFT0JGICAgICAgICAgIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19FT0INCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfRU9CKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5JU1IsIFVTQVJUX0lTUl9FT0JGKSA9PSAoVVNBUlRfSVNSX0VPQkYpKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFNQSSBTbGF2ZSBVbmRlcnJ1biBlcnJvciBmbGFnIGlzIHNldCBvciBub3QNCi0gKiBAbm90ZSAgIE1hY3JvIElTX1VBUlRfU1BJX1NMQVZFX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlcg0KLSAqIG9yIG5vdCBTUEkgU2xhdmUgbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLg0KLSAqIEBybXRvbGwgSVNSICAgICAgICAgIFVEUiAgICAgICAgICAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1VEUg0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzQWN0aXZlRmxhZ19VRFIoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPklTUiwgVVNBUlRfSVNSX1VEUikgPT0gKFVTQVJUX0lTUl9VRFIpKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBBdXRvLUJhdWQgUmF0ZSBFcnJvciBGbGFnIGlzIHNldCBvciBub3QNCi0gKiBAbm90ZSAgIE1hY3JvIElTX1VTQVJUX0FVVE9CQVVEUkFURV9ERVRFQ1RJT05fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0bw0KLSAqIGNoZWNrIHdoZXRoZXIgb3Igbm90IEF1dG8gQmF1ZCBSYXRlIGRldGVjdGlvbiBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUNCi0gKiBVU0FSVHggaW5zdGFuY2UuDQotICogQHJtdG9sbCBJU1IgICAgICAgICAgQUJSRSAgICAgICAgICBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfQUJSRQ0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzQWN0aXZlRmxhZ19BQlJFKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5JU1IsIFVTQVJUX0lTUl9BQlJFKSA9PSAoVVNBUlRfSVNSX0FCUkUpKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIEF1dG8tQmF1ZCBSYXRlIEZsYWcgaXMgc2V0IG9yIG5vdA0KLSAqIEBub3RlICAgTWFjcm8gSVNfVVNBUlRfQVVUT0JBVURSQVRFX0RFVEVDVElPTl9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvDQotICogY2hlY2sgd2hldGhlciBvciBub3QgQXV0byBCYXVkIFJhdGUgZGV0ZWN0aW9uIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZQ0KLSAqIFVTQVJUeCBpbnN0YW5jZS4NCi0gKiBAcm10b2xsIElTUiAgICAgICAgICBBQlJGICAgICAgICAgIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19BQlINCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfQUJSKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5JU1IsIFVTQVJUX0lTUl9BQlJGKSA9PSAoVVNBUlRfSVNSX0FCUkYpKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIEJ1c3kgRmxhZyBpcyBzZXQgb3Igbm90DQotICogQHJtdG9sbCBJU1IgICAgICAgICAgQlVTWSAgICAgICAgICBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfQlVTWQ0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzQWN0aXZlRmxhZ19CVVNZKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5JU1IsIFVTQVJUX0lTUl9CVVNZKSA9PSAoVVNBUlRfSVNSX0JVU1kpKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIENoYXJhY3RlciBNYXRjaCBGbGFnIGlzIHNldCBvciBub3QNCi0gKiBAcm10b2xsIElTUiAgICAgICAgICBDTUYgICAgICAgICAgIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19DTQ0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzQWN0aXZlRmxhZ19DTShVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+SVNSLCBVU0FSVF9JU1JfQ01GKSA9PSAoVVNBUlRfSVNSX0NNRikpID8gMVVMDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIFNlbmQgQnJlYWsgRmxhZyBpcyBzZXQgb3Igbm90DQotICogQHJtdG9sbCBJU1IgICAgICAgICAgU0JLRiAgICAgICAgICBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfU0JLDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1NCSyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+SVNSLCBVU0FSVF9JU1JfU0JLRikgPT0gKFVTQVJUX0lTUl9TQktGKSkgPyAxVUwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBSZWNlaXZlIFdha2UgVXAgZnJvbSBtdXRlIG1vZGUgRmxhZyBpcyBzZXQgb3Igbm90DQotICogQHJtdG9sbCBJU1IgICAgICAgICAgUldVICAgICAgICAgICBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfUldVDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1JXVShVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+SVNSLCBVU0FSVF9JU1JfUldVKSA9PSAoVVNBUlRfSVNSX1JXVSkpID8gMVVMDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIFdha2UgVXAgZnJvbSBzdG9wIG1vZGUgRmxhZyBpcyBzZXQgb3Igbm90DQotICogQG5vdGUgICBNYWNybyBJU19VQVJUX1dBS0VVUF9GUk9NU1RPUF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrDQotICogd2hldGhlciBvciBub3QgV2FrZS11cCBmcm9tIFN0b3AgbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4DQotICogaW5zdGFuY2UuDQotICogQHJtdG9sbCBJU1IgICAgICAgICAgV1VGICAgICAgICAgICBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfV0tVUA0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzQWN0aXZlRmxhZ19XS1VQKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5JU1IsIFVTQVJUX0lTUl9XVUYpID09IChVU0FSVF9JU1JfV1VGKSkgPyAxVUwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgVHJhbnNtaXQgRW5hYmxlIEFja25vd2xlZGdlIEZsYWcgaXMgc2V0IG9yIG5vdA0KLSAqIEBybXRvbGwgSVNSICAgICAgICAgIFRFQUNLICAgICAgICAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1RFQUNLDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1RFQUNLKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5JU1IsIFVTQVJUX0lTUl9URUFDSykgPT0gKFVTQVJUX0lTUl9URUFDSykpID8gMVVMDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBSZWNlaXZlIEVuYWJsZSBBY2tub3dsZWRnZSBGbGFnIGlzIHNldCBvciBub3QNCi0gKiBAcm10b2xsIElTUiAgICAgICAgICBSRUFDSyAgICAgICAgIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19SRUFDSw0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzQWN0aXZlRmxhZ19SRUFDSyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+SVNSLCBVU0FSVF9JU1JfUkVBQ0spID09IChVU0FSVF9JU1JfUkVBQ0spKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgVFggRklGTyBFbXB0eSBGbGFnIGlzIHNldCBvciBub3QNCi0gKiBAbm90ZSAgIE1hY3JvIElTX1VBUlRfRklGT19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3INCi0gKiBub3QgRklGTyBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuDQotICogQHJtdG9sbCBJU1IgICAgICAgICAgVFhGRSAgICAgICAgICBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfVFhGRQ0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzQWN0aXZlRmxhZ19UWEZFKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5JU1IsIFVTQVJUX0lTUl9UWEZFKSA9PSAoVVNBUlRfSVNSX1RYRkUpKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIFJYIEZJRk8gRnVsbCBGbGFnIGlzIHNldCBvciBub3QNCi0gKiBAbm90ZSAgIE1hY3JvIElTX1VBUlRfRklGT19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3INCi0gKiBub3QgRklGTyBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuDQotICogQHJtdG9sbCBJU1IgICAgICAgICAgUlhGRiAgICAgICAgICBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfUlhGRg0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzQWN0aXZlRmxhZ19SWEZGKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5JU1IsIFVTQVJUX0lTUl9SWEZGKSA9PSAoVVNBUlRfSVNSX1JYRkYpKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFNtYXJ0Y2FyZCBUcmFuc21pc3Npb24gQ29tcGxldGUgQmVmb3JlIEd1YXJkIFRpbWUgRmxhZw0KLSAqIGlzIHNldCBvciBub3QNCi0gKiBAcm10b2xsIElTUiAgICAgICAgICBUQ0JHVCAgICAgICAgIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19UQ0JHVA0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzQWN0aXZlRmxhZ19UQ0JHVChVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+SVNSLCBVU0FSVF9JU1JfVENCR1QpID09IChVU0FSVF9JU1JfVENCR1QpKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgVFggRklGTyBUaHJlc2hvbGQgRmxhZyBpcyBzZXQgb3Igbm90DQotICogQG5vdGUgICBNYWNybyBJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yDQotICogbm90IEZJRk8gbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLg0KLSAqIEBybXRvbGwgSVNSICAgICAgICAgIFRYRlQgICAgICAgICAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1RYRlQNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfVFhGVChVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+SVNSLCBVU0FSVF9JU1JfVFhGVCkgPT0gKFVTQVJUX0lTUl9UWEZUKSkgPyAxVUwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBSWCBGSUZPIFRocmVzaG9sZCBGbGFnIGlzIHNldCBvciBub3QNCi0gKiBAbm90ZSAgIE1hY3JvIElTX1VBUlRfRklGT19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3INCi0gKiBub3QgRklGTyBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuDQotICogQHJtdG9sbCBJU1IgICAgICAgICAgUlhGVCAgICAgICAgICBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfUlhGVA0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzQWN0aXZlRmxhZ19SWEZUKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5JU1IsIFVTQVJUX0lTUl9SWEZUKSA9PSAoVVNBUlRfSVNSX1JYRlQpKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2xlYXIgUGFyaXR5IEVycm9yIEZsYWcNCi0gKiBAcm10b2xsIElDUiAgICAgICAgICBQRUNGICAgICAgICAgIExMX1VTQVJUX0NsZWFyRmxhZ19QRQ0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfQ2xlYXJGbGFnX1BFKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgV1JJVEVfUkVHKFVTQVJUeC0+SUNSLCBVU0FSVF9JQ1JfUEVDRik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2xlYXIgRnJhbWluZyBFcnJvciBGbGFnDQotICogQHJtdG9sbCBJQ1IgICAgICAgICAgRkVDRiAgICAgICAgICBMTF9VU0FSVF9DbGVhckZsYWdfRkUNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0NsZWFyRmxhZ19GRShVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIFdSSVRFX1JFRyhVU0FSVHgtPklDUiwgVVNBUlRfSUNSX0ZFQ0YpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENsZWFyIE5vaXNlIEVycm9yIGRldGVjdGVkIEZsYWcNCi0gKiBAcm10b2xsIElDUiAgICAgICAgICBORUNGICAgICAgICAgIExMX1VTQVJUX0NsZWFyRmxhZ19ORQ0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfQ2xlYXJGbGFnX05FKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgV1JJVEVfUkVHKFVTQVJUeC0+SUNSLCBVU0FSVF9JQ1JfTkVDRik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2xlYXIgT3ZlclJ1biBFcnJvciBGbGFnDQotICogQHJtdG9sbCBJQ1IgICAgICAgICAgT1JFQ0YgICAgICAgICBMTF9VU0FSVF9DbGVhckZsYWdfT1JFDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9DbGVhckZsYWdfT1JFKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgV1JJVEVfUkVHKFVTQVJUeC0+SUNSLCBVU0FSVF9JQ1JfT1JFQ0YpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENsZWFyIElETEUgbGluZSBkZXRlY3RlZCBGbGFnDQotICogQHJtdG9sbCBJQ1IgICAgICAgICAgSURMRUNGICAgICAgICBMTF9VU0FSVF9DbGVhckZsYWdfSURMRQ0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfQ2xlYXJGbGFnX0lETEUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7DQotICBXUklURV9SRUcoVVNBUlR4LT5JQ1IsIFVTQVJUX0lDUl9JRExFQ0YpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENsZWFyIFRYIEZJRk8gRW1wdHkgRmxhZw0KLSAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9GSUZPX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvcg0KLSAqIG5vdCBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4NCi0gKiBAcm10b2xsIElDUiAgICAgICAgICBUWEZFQ0YgICAgICAgIExMX1VTQVJUX0NsZWFyRmxhZ19UWEZFDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9DbGVhckZsYWdfVFhGRShVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIFdSSVRFX1JFRyhVU0FSVHgtPklDUiwgVVNBUlRfSUNSX1RYRkVDRik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2xlYXIgVHJhbnNtaXNzaW9uIENvbXBsZXRlIEZsYWcNCi0gKiBAcm10b2xsIElDUiAgICAgICAgICBUQ0NGICAgICAgICAgIExMX1VTQVJUX0NsZWFyRmxhZ19UQw0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfQ2xlYXJGbGFnX1RDKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgV1JJVEVfUkVHKFVTQVJUeC0+SUNSLCBVU0FSVF9JQ1JfVENDRik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2xlYXIgU21hcnRjYXJkIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBCZWZvcmUgR3VhcmQgVGltZSBGbGFnDQotICogQHJtdG9sbCBJQ1IgICAgICAgICAgVENCR1RDRiAgICAgICBMTF9VU0FSVF9DbGVhckZsYWdfVENCR1QNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0NsZWFyRmxhZ19UQ0JHVChVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIFdSSVRFX1JFRyhVU0FSVHgtPklDUiwgVVNBUlRfSUNSX1RDQkdUQ0YpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENsZWFyIExJTiBCcmVhayBEZXRlY3Rpb24gRmxhZw0KLSAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9MSU5fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yDQotICogbm90IExJTiBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLg0KLSAqIEBybXRvbGwgSUNSICAgICAgICAgIExCRENGICAgICAgICAgTExfVVNBUlRfQ2xlYXJGbGFnX0xCRA0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfQ2xlYXJGbGFnX0xCRChVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIFdSSVRFX1JFRyhVU0FSVHgtPklDUiwgVVNBUlRfSUNSX0xCRENGKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDbGVhciBDVFMgSW50ZXJydXB0IEZsYWcNCi0gKiBAbm90ZSAgIE1hY3JvIElTX1VBUlRfSFdGTE9XX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvcg0KLSAqIG5vdCBIYXJkd2FyZSBGbG93IGNvbnRyb2wgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4NCi0gKiBAcm10b2xsIElDUiAgICAgICAgICBDVFNDRiAgICAgICAgIExMX1VTQVJUX0NsZWFyRmxhZ19uQ1RTDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9DbGVhckZsYWdfbkNUUyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIFdSSVRFX1JFRyhVU0FSVHgtPklDUiwgVVNBUlRfSUNSX0NUU0NGKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDbGVhciBSZWNlaXZlciBUaW1lIE91dCBGbGFnDQotICogQHJtdG9sbCBJQ1IgICAgICAgICAgUlRPQ0YgICAgICAgICBMTF9VU0FSVF9DbGVhckZsYWdfUlRPDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9DbGVhckZsYWdfUlRPKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgV1JJVEVfUkVHKFVTQVJUeC0+SUNSLCBVU0FSVF9JQ1JfUlRPQ0YpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENsZWFyIEVuZCBPZiBCbG9jayBGbGFnDQotICogQG5vdGUgICBNYWNybyBJU19TTUFSVENBUkRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yDQotICogbm90IFNtYXJ0Y2FyZCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLg0KLSAqIEBybXRvbGwgSUNSICAgICAgICAgIEVPQkNGICAgICAgICAgTExfVVNBUlRfQ2xlYXJGbGFnX0VPQg0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfQ2xlYXJGbGFnX0VPQihVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIFdSSVRFX1JFRyhVU0FSVHgtPklDUiwgVVNBUlRfSUNSX0VPQkNGKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDbGVhciBTUEkgU2xhdmUgVW5kZXJydW4gRmxhZw0KLSAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9TUElfU0xBVkVfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyDQotICogb3Igbm90IFNQSSBTbGF2ZSBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuDQotICogQHJtdG9sbCBJQ1IgICAgICAgICAgVURSQ0YgICAgICAgICBMTF9VU0FSVF9DbGVhckZsYWdfVURSDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9DbGVhckZsYWdfVURSKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgV1JJVEVfUkVHKFVTQVJUeC0+SUNSLCBVU0FSVF9JQ1JfVURSQ0YpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENsZWFyIENoYXJhY3RlciBNYXRjaCBGbGFnDQotICogQHJtdG9sbCBJQ1IgICAgICAgICAgQ01DRiAgICAgICAgICBMTF9VU0FSVF9DbGVhckZsYWdfQ00NCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0NsZWFyRmxhZ19DTShVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIFdSSVRFX1JFRyhVU0FSVHgtPklDUiwgVVNBUlRfSUNSX0NNQ0YpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENsZWFyIFdha2UgVXAgZnJvbSBzdG9wIG1vZGUgRmxhZw0KLSAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9XQUtFVVBfRlJPTVNUT1BfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjaw0KLSAqIHdoZXRoZXIgb3Igbm90IFdha2UtdXAgZnJvbSBTdG9wIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeA0KLSAqIGluc3RhbmNlLg0KLSAqIEBybXRvbGwgSUNSICAgICAgICAgIFdVQ0YgICAgICAgICAgTExfVVNBUlRfQ2xlYXJGbGFnX1dLVVANCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0NsZWFyRmxhZ19XS1VQKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgV1JJVEVfUkVHKFVTQVJUeC0+SUNSLCBVU0FSVF9JQ1JfV1VDRik7DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FRl9JVF9NYW5hZ2VtZW50IElUX01hbmFnZW1lbnQNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIElETEUgSW50ZXJydXB0DQotICogQHJtdG9sbCBDUjEgICAgICAgICAgSURMRUlFICAgICAgICBMTF9VU0FSVF9FbmFibGVJVF9JRExFDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVJVF9JRExFKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgQVRPTUlDX1NFVF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9JRExFSUUpOw0KLX0NCi0NCi0vKiBMZWdhY3kgZGVmaW5lICovDQotI2RlZmluZSBMTF9VU0FSVF9FbmFibGVJVF9SWE5FIExMX1VTQVJUX0VuYWJsZUlUX1JYTkVfUlhGTkUNCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSBSWCBOb3QgRW1wdHkgYW5kIFJYIEZJRk8gTm90IEVtcHR5IEludGVycnVwdA0KLSAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9GSUZPX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvcg0KLSAqIG5vdCBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4NCi0gKiBAcm10b2xsIENSMSAgICAgICAgUlhORUlFX1JYRk5FSUUgIExMX1VTQVJUX0VuYWJsZUlUX1JYTkVfUlhGTkUNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZUlUX1JYTkVfUlhGTkUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7DQotICBBVE9NSUNfU0VUX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgVHJhbnNtaXNzaW9uIENvbXBsZXRlIEludGVycnVwdA0KLSAqIEBybXRvbGwgQ1IxICAgICAgICAgIFRDSUUgICAgICAgICAgTExfVVNBUlRfRW5hYmxlSVRfVEMNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZUlUX1RDKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgQVRPTUlDX1NFVF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9UQ0lFKTsNCi19DQotDQotLyogTGVnYWN5IGRlZmluZSAqLw0KLSNkZWZpbmUgTExfVVNBUlRfRW5hYmxlSVRfVFhFIExMX1VTQVJUX0VuYWJsZUlUX1RYRV9UWEZORg0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIFRYIEVtcHR5IGFuZCBUWCBGSUZPIE5vdCBGdWxsIEludGVycnVwdA0KLSAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9GSUZPX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvcg0KLSAqIG5vdCBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4NCi0gKiBAcm10b2xsIENSMSAgICAgICAgIFRYRUlFX1RYRk5GSUUgIExMX1VTQVJUX0VuYWJsZUlUX1RYRV9UWEZORg0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlSVRfVFhFX1RYRk5GKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgQVRPTUlDX1NFVF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9UWEVJRV9UWEZORklFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgUGFyaXR5IEVycm9yIEludGVycnVwdA0KLSAqIEBybXRvbGwgQ1IxICAgICAgICAgIFBFSUUgICAgICAgICAgTExfVVNBUlRfRW5hYmxlSVRfUEUNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZUlUX1BFKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgQVRPTUlDX1NFVF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9QRUlFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgQ2hhcmFjdGVyIE1hdGNoIEludGVycnVwdA0KLSAqIEBybXRvbGwgQ1IxICAgICAgICAgIENNSUUgICAgICAgICAgTExfVVNBUlRfRW5hYmxlSVRfQ00NCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZUlUX0NNKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgQVRPTUlDX1NFVF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9DTUlFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgUmVjZWl2ZXIgVGltZW91dCBJbnRlcnJ1cHQNCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBSVE9JRSAgICAgICAgIExMX1VTQVJUX0VuYWJsZUlUX1JUTw0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlSVRfUlRPKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgQVRPTUlDX1NFVF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9SVE9JRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIEVuZCBPZiBCbG9jayBJbnRlcnJ1cHQNCi0gKiBAbm90ZSAgIE1hY3JvIElTX1NNQVJUQ0FSRF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3INCi0gKiBub3QgU21hcnRjYXJkIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuDQotICogQHJtdG9sbCBDUjEgICAgICAgICAgRU9CSUUgICAgICAgICBMTF9VU0FSVF9FbmFibGVJVF9FT0INCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZUlUX0VPQihVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIEFUT01JQ19TRVRfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfRU9CSUUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSBUWCBGSUZPIEVtcHR5IEludGVycnVwdA0KLSAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9GSUZPX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvcg0KLSAqIG5vdCBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4NCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBUWEZFSUUgICAgICAgIExMX1VTQVJUX0VuYWJsZUlUX1RYRkUNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZUlUX1RYRkUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7DQotICBBVE9NSUNfU0VUX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1RYRkVJRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIFJYIEZJRk8gRnVsbCBJbnRlcnJ1cHQNCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBSWEZGSUUgICAgICAgIExMX1VTQVJUX0VuYWJsZUlUX1JYRkYNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZUlUX1JYRkYoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7DQotICBBVE9NSUNfU0VUX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1JYRkZJRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIExJTiBCcmVhayBEZXRlY3Rpb24gSW50ZXJydXB0DQotICogQG5vdGUgICBNYWNybyBJU19VQVJUX0xJTl9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3INCi0gKiBub3QgTElOIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuDQotICogQHJtdG9sbCBDUjIgICAgICAgICAgTEJESUUgICAgICAgICBMTF9VU0FSVF9FbmFibGVJVF9MQkQNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZUlUX0xCRChVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIFNFVF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9MQkRJRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIEVycm9yIEludGVycnVwdA0KLSAqIEBub3RlICAgV2hlbiBzZXQsIEVycm9yIEludGVycnVwdCBFbmFibGUgQml0IGlzIGVuYWJsaW5nIGludGVycnVwdCBnZW5lcmF0aW9uDQotICogaW4gY2FzZSBvZiBhIGZyYW1pbmcgZXJyb3IsIG92ZXJydW4gZXJyb3Igb3Igbm9pc2UgZmxhZyAoRkU9MSBvciBPUkU9MSBvcg0KLSAqIE5GPTEgaW4gdGhlIFVTQVJUeF9JU1IgcmVnaXN0ZXIpLiAwOiBJbnRlcnJ1cHQgaXMgaW5oaWJpdGVkIDE6IEFuIGludGVycnVwdA0KLSAqIGlzIGdlbmVyYXRlZCB3aGVuIEZFPTEgb3IgT1JFPTEgb3IgTkY9MSBpbiB0aGUgVVNBUlR4X0lTUiByZWdpc3Rlci4NCi0gKiBAcm10b2xsIENSMyAgICAgICAgICBFSUUgICAgICAgICAgIExMX1VTQVJUX0VuYWJsZUlUX0VSUk9SDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVJVF9FUlJPUihVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIEFUT01JQ19TRVRfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgQ1RTIEludGVycnVwdA0KLSAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9IV0ZMT1dfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yDQotICogbm90IEhhcmR3YXJlIEZsb3cgY29udHJvbCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLg0KLSAqIEBybXRvbGwgQ1IzICAgICAgICAgIENUU0lFICAgICAgICAgTExfVVNBUlRfRW5hYmxlSVRfQ1RTDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVJVF9DVFMoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7DQotICBBVE9NSUNfU0VUX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX0NUU0lFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgV2FrZSBVcCBmcm9tIFN0b3AgTW9kZSBJbnRlcnJ1cHQNCi0gKiBAbm90ZSAgIE1hY3JvIElTX1VBUlRfV0FLRVVQX0ZST01TVE9QX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sNCi0gKiB3aGV0aGVyIG9yIG5vdCBXYWtlLXVwIGZyb20gU3RvcCBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHgNCi0gKiBpbnN0YW5jZS4NCi0gKiBAcm10b2xsIENSMyAgICAgICAgICBXVUZJRSAgICAgICAgIExMX1VTQVJUX0VuYWJsZUlUX1dLVVANCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZUlUX1dLVVAoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7DQotICBBVE9NSUNfU0VUX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX1dVRklFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgVFggRklGTyBUaHJlc2hvbGQgSW50ZXJydXB0DQotICogQG5vdGUgICBNYWNybyBJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yDQotICogbm90IEZJRk8gbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLg0KLSAqIEBybXRvbGwgQ1IzICAgICAgICAgIFRYRlRJRSAgICAgICAgTExfVVNBUlRfRW5hYmxlSVRfVFhGVA0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlSVRfVFhGVChVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIEFUT01JQ19TRVRfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfVFhGVElFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgU21hcnRjYXJkIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBCZWZvcmUgR3VhcmQgVGltZSBJbnRlcnJ1cHQNCi0gKiBAbm90ZSAgIE1hY3JvIElTX1NNQVJUQ0FSRF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3INCi0gKiBub3QgU21hcnRjYXJkIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuDQotICogQHJtdG9sbCBDUjMgICAgICAgICAgVENCR1RJRSAgICAgICBMTF9VU0FSVF9FbmFibGVJVF9UQ0JHVA0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlSVRfVENCR1QoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7DQotICBBVE9NSUNfU0VUX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX1RDQkdUSUUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSBSWCBGSUZPIFRocmVzaG9sZCBJbnRlcnJ1cHQNCi0gKiBAbm90ZSAgIE1hY3JvIElTX1VBUlRfRklGT19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3INCi0gKiBub3QgRklGTyBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuDQotICogQHJtdG9sbCBDUjMgICAgICAgICAgUlhGVElFICAgICAgICBMTF9VU0FSVF9FbmFibGVJVF9SWEZUDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVJVF9SWEZUKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgQVRPTUlDX1NFVF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19SWEZUSUUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgSURMRSBJbnRlcnJ1cHQNCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBJRExFSUUgICAgICAgIExMX1VTQVJUX0Rpc2FibGVJVF9JRExFDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlSVRfSURMRShVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIEFUT01JQ19DTEVBUl9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9JRExFSUUpOw0KLX0NCi0NCi0vKiBMZWdhY3kgZGVmaW5lICovDQotI2RlZmluZSBMTF9VU0FSVF9EaXNhYmxlSVRfUlhORSBMTF9VU0FSVF9EaXNhYmxlSVRfUlhORV9SWEZORQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBSWCBOb3QgRW1wdHkgYW5kIFJYIEZJRk8gTm90IEVtcHR5IEludGVycnVwdA0KLSAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9GSUZPX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvcg0KLSAqIG5vdCBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4NCi0gKiBAcm10b2xsIENSMSAgICAgICAgUlhORUlFX1JYRk5FSUUgIExMX1VTQVJUX0Rpc2FibGVJVF9SWE5FX1JYRk5FDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlSVRfUlhORV9SWEZORShVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIEFUT01JQ19DTEVBUl9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBUcmFuc21pc3Npb24gQ29tcGxldGUgSW50ZXJydXB0DQotICogQHJtdG9sbCBDUjEgICAgICAgICAgVENJRSAgICAgICAgICBMTF9VU0FSVF9EaXNhYmxlSVRfVEMNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVJVF9UQyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIEFUT01JQ19DTEVBUl9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9UQ0lFKTsNCi19DQotDQotLyogTGVnYWN5IGRlZmluZSAqLw0KLSNkZWZpbmUgTExfVVNBUlRfRGlzYWJsZUlUX1RYRSBMTF9VU0FSVF9EaXNhYmxlSVRfVFhFX1RYRk5GDQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIFRYIEVtcHR5IGFuZCBUWCBGSUZPIE5vdCBGdWxsIEludGVycnVwdA0KLSAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9GSUZPX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvcg0KLSAqIG5vdCBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4NCi0gKiBAcm10b2xsIENSMSAgICAgICAgVFhFSUVfVFhGTkZJRSAgTExfVVNBUlRfRGlzYWJsZUlUX1RYRV9UWEZORg0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZUlUX1RYRV9UWEZORihVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIEFUT01JQ19DTEVBUl9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9UWEVJRV9UWEZORklFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIFBhcml0eSBFcnJvciBJbnRlcnJ1cHQNCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBQRUlFICAgICAgICAgIExMX1VTQVJUX0Rpc2FibGVJVF9QRQ0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZUlUX1BFKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgQVRPTUlDX0NMRUFSX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1BFSUUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgQ2hhcmFjdGVyIE1hdGNoIEludGVycnVwdA0KLSAqIEBybXRvbGwgQ1IxICAgICAgICAgIENNSUUgICAgICAgICAgTExfVVNBUlRfRGlzYWJsZUlUX0NNDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlSVRfQ00oVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7DQotICBBVE9NSUNfQ0xFQVJfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfQ01JRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBSZWNlaXZlciBUaW1lb3V0IEludGVycnVwdA0KLSAqIEBybXRvbGwgQ1IxICAgICAgICAgIFJUT0lFICAgICAgICAgTExfVVNBUlRfRGlzYWJsZUlUX1JUTw0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZUlUX1JUTyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIEFUT01JQ19DTEVBUl9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9SVE9JRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBFbmQgT2YgQmxvY2sgSW50ZXJydXB0DQotICogQG5vdGUgICBNYWNybyBJU19TTUFSVENBUkRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yDQotICogbm90IFNtYXJ0Y2FyZCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLg0KLSAqIEBybXRvbGwgQ1IxICAgICAgICAgIEVPQklFICAgICAgICAgTExfVVNBUlRfRGlzYWJsZUlUX0VPQg0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZUlUX0VPQihVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIEFUT01JQ19DTEVBUl9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9FT0JJRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBUWCBGSUZPIEVtcHR5IEludGVycnVwdA0KLSAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9GSUZPX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvcg0KLSAqIG5vdCBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4NCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBUWEZFSUUgICAgICAgIExMX1VTQVJUX0Rpc2FibGVJVF9UWEZFDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlSVRfVFhGRShVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIEFUT01JQ19DTEVBUl9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9UWEZFSUUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgUlggRklGTyBGdWxsIEludGVycnVwdA0KLSAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9GSUZPX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvcg0KLSAqIG5vdCBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4NCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBSWEZGSUUgICAgICAgIExMX1VTQVJUX0Rpc2FibGVJVF9SWEZGDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlSVRfUlhGRihVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIEFUT01JQ19DTEVBUl9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9SWEZGSUUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgTElOIEJyZWFrIERldGVjdGlvbiBJbnRlcnJ1cHQNCi0gKiBAbm90ZSAgIE1hY3JvIElTX1VBUlRfTElOX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvcg0KLSAqIG5vdCBMSU4gZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4NCi0gKiBAcm10b2xsIENSMiAgICAgICAgICBMQkRJRSAgICAgICAgIExMX1VTQVJUX0Rpc2FibGVJVF9MQkQNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVJVF9MQkQoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7DQotICBDTEVBUl9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9MQkRJRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBFcnJvciBJbnRlcnJ1cHQNCi0gKiBAbm90ZSAgIFdoZW4gc2V0LCBFcnJvciBJbnRlcnJ1cHQgRW5hYmxlIEJpdCBpcyBlbmFibGluZyBpbnRlcnJ1cHQgZ2VuZXJhdGlvbg0KLSAqIGluIGNhc2Ugb2YgYSBmcmFtaW5nIGVycm9yLCBvdmVycnVuIGVycm9yIG9yIG5vaXNlIGZsYWcgKEZFPTEgb3IgT1JFPTEgb3INCi0gKiBORj0xIGluIHRoZSBVU0FSVHhfSVNSIHJlZ2lzdGVyKS4gMDogSW50ZXJydXB0IGlzIGluaGliaXRlZCAxOiBBbiBpbnRlcnJ1cHQNCi0gKiBpcyBnZW5lcmF0ZWQgd2hlbiBGRT0xIG9yIE9SRT0xIG9yIE5GPTEgaW4gdGhlIFVTQVJUeF9JU1IgcmVnaXN0ZXIuDQotICogQHJtdG9sbCBDUjMgICAgICAgICAgRUlFICAgICAgICAgICBMTF9VU0FSVF9EaXNhYmxlSVRfRVJST1INCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVJVF9FUlJPUihVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIEFUT01JQ19DTEVBUl9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19FSUUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgQ1RTIEludGVycnVwdA0KLSAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9IV0ZMT1dfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yDQotICogbm90IEhhcmR3YXJlIEZsb3cgY29udHJvbCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLg0KLSAqIEBybXRvbGwgQ1IzICAgICAgICAgIENUU0lFICAgICAgICAgTExfVVNBUlRfRGlzYWJsZUlUX0NUUw0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZUlUX0NUUyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIEFUT01JQ19DTEVBUl9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19DVFNJRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBXYWtlIFVwIGZyb20gU3RvcCBNb2RlIEludGVycnVwdA0KLSAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9XQUtFVVBfRlJPTVNUT1BfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjaw0KLSAqIHdoZXRoZXIgb3Igbm90IFdha2UtdXAgZnJvbSBTdG9wIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeA0KLSAqIGluc3RhbmNlLg0KLSAqIEBybXRvbGwgQ1IzICAgICAgICAgIFdVRklFICAgICAgICAgTExfVVNBUlRfRGlzYWJsZUlUX1dLVVANCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVJVF9XS1VQKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgQVRPTUlDX0NMRUFSX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX1dVRklFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIFRYIEZJRk8gVGhyZXNob2xkIEludGVycnVwdA0KLSAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9GSUZPX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvcg0KLSAqIG5vdCBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4NCi0gKiBAcm10b2xsIENSMyAgICAgICAgICBUWEZUSUUgICAgICAgIExMX1VTQVJUX0Rpc2FibGVJVF9UWEZUDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlSVRfVFhGVChVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIEFUT01JQ19DTEVBUl9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19UWEZUSUUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgU21hcnRjYXJkIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBCZWZvcmUgR3VhcmQgVGltZSBJbnRlcnJ1cHQNCi0gKiBAbm90ZSAgIE1hY3JvIElTX1NNQVJUQ0FSRF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3INCi0gKiBub3QgU21hcnRjYXJkIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuDQotICogQHJtdG9sbCBDUjMgICAgICAgICAgVENCR1RJRSAgICAgICBMTF9VU0FSVF9EaXNhYmxlSVRfVENCR1QNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVJVF9UQ0JHVChVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIEFUT01JQ19DTEVBUl9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19UQ0JHVElFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIFJYIEZJRk8gVGhyZXNob2xkIEludGVycnVwdA0KLSAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9GSUZPX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvcg0KLSAqIG5vdCBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4NCi0gKiBAcm10b2xsIENSMyAgICAgICAgICBSWEZUSUUgICAgICAgIExMX1VTQVJUX0Rpc2FibGVJVF9SWEZUDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlSVRfUlhGVChVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIEFUT01JQ19DTEVBUl9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19SWEZUSUUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBJRExFIEludGVycnVwdCAgc291cmNlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuDQotICogQHJtdG9sbCBDUjEgICAgICAgICAgSURMRUlFICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9JRExFDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkSVRfSURMRShVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfSURMRUlFKSA9PSAoVVNBUlRfQ1IxX0lETEVJRSkpDQotICAgICAgICAgICAgICA/IDFVTA0KLSAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKiBMZWdhY3kgZGVmaW5lICovDQotI2RlZmluZSBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9SWE5FIExMX1VTQVJUX0lzRW5hYmxlZElUX1JYTkVfUlhGTkUNCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBSWCBOb3QgRW1wdHkgYW5kIFVTQVJUIFJYIEZJRk8gTm90IEVtcHR5IEludGVycnVwdA0KLSAqIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuDQotICogQG5vdGUgICBNYWNybyBJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yDQotICogbm90IEZJRk8gbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLg0KLSAqIEBybXRvbGwgQ1IxICAgICAgICBSWE5FSUVfUlhGTkVJRSAgTExfVVNBUlRfSXNFbmFibGVkSVRfUlhORV9SWEZORQ0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90DQotTExfVVNBUlRfSXNFbmFibGVkSVRfUlhORV9SWEZORShVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUlhORUlFX1JYRk5FSUUpID09DQotICAgICAgICAgICAoVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFKSkNCi0gICAgICAgICAgICAgID8gMVVMDQotICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvcg0KLSAqIGRpc2FibGVkLg0KLSAqIEBybXRvbGwgQ1IxICAgICAgICAgIFRDSUUgICAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkSVRfVEMNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9UQyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfVENJRSkgPT0gKFVTQVJUX0NSMV9UQ0lFKSkgPyAxVUwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKiBMZWdhY3kgZGVmaW5lICovDQotI2RlZmluZSBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9UWEUgTExfVVNBUlRfSXNFbmFibGVkSVRfVFhFX1RYRk5GDQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgVFggRW1wdHkgYW5kIFVTQVJUIFRYIEZJRk8gTm90IEZ1bGwgSW50ZXJydXB0IGlzDQotICogZW5hYmxlZCBvciBkaXNhYmxlZA0KLSAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9GSUZPX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvcg0KLSAqIG5vdCBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4NCi0gKiBAcm10b2xsIENSMSAgICAgICAgIFRYRUlFX1RYRk5GSUUgIExMX1VTQVJUX0lzRW5hYmxlZElUX1RYRV9UWEZORg0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZElUX1RYRV9UWEZORihVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfVFhFSUVfVFhGTkZJRSkgPT0NCi0gICAgICAgICAgIChVU0FSVF9DUjFfVFhFSUVfVFhGTkZJRSkpDQotICAgICAgICAgICAgICA/IDFVTA0KLSAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBQYXJpdHkgRXJyb3IgSW50ZXJydXB0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuDQotICogQHJtdG9sbCBDUjEgICAgICAgICAgUEVJRSAgICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9QRQ0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZElUX1BFKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9QRUlFKSA9PSAoVVNBUlRfQ1IxX1BFSUUpKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIENoYXJhY3RlciBNYXRjaCBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4NCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBDTUlFICAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZElUX0NNDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkSVRfQ00oVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7DQotICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX0NNSUUpID09IChVU0FSVF9DUjFfQ01JRSkpID8gMVVMDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgUmVjZWl2ZXIgVGltZW91dCBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4NCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBSVE9JRSAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZElUX1JUTw0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZElUX1JUTyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUlRPSUUpID09IChVU0FSVF9DUjFfUlRPSUUpKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgRW5kIE9mIEJsb2NrIEludGVycnVwdCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLg0KLSAqIEBub3RlICAgTWFjcm8gSVNfU01BUlRDQVJEX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvcg0KLSAqIG5vdCBTbWFydGNhcmQgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4NCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBFT0JJRSAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZElUX0VPQg0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZElUX0VPQihVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfRU9CSUUpID09IChVU0FSVF9DUjFfRU9CSUUpKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgVFggRklGTyBFbXB0eSBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZA0KLSAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9GSUZPX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvcg0KLSAqIG5vdCBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4NCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBUWEZFSUUgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZElUX1RYRkUNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9UWEZFKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9UWEZFSUUpID09IChVU0FSVF9DUjFfVFhGRUlFKSkNCi0gICAgICAgICAgICAgID8gMVVMDQotICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIFJYIEZJRk8gRnVsbCBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZA0KLSAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9GSUZPX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvcg0KLSAqIG5vdCBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4NCi0gKiBAcm10b2xsIENSMSAgICAgICAgICBSWEZGSUUgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZElUX1JYRkYNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9SWEZGKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9SWEZGSUUpID09IChVU0FSVF9DUjFfUlhGRklFKSkNCi0gICAgICAgICAgICAgID8gMVVMDQotICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIExJTiBCcmVhayBEZXRlY3Rpb24gSW50ZXJydXB0IGlzIGVuYWJsZWQgb3INCi0gKiBkaXNhYmxlZC4NCi0gKiBAbm90ZSAgIE1hY3JvIElTX1VBUlRfTElOX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvcg0KLSAqIG5vdCBMSU4gZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4NCi0gKiBAcm10b2xsIENSMiAgICAgICAgICBMQkRJRSAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZElUX0xCRA0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZElUX0xCRChVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfTEJESUUpID09IChVU0FSVF9DUjJfTEJESUUpKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgRXJyb3IgSW50ZXJydXB0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuDQotICogQHJtdG9sbCBDUjMgICAgICAgICAgRUlFICAgICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9FUlJPUg0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZElUX0VSUk9SKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19FSUUpID09IChVU0FSVF9DUjNfRUlFKSkgPyAxVUwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgQ1RTIEludGVycnVwdCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLg0KLSAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9IV0ZMT1dfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yDQotICogbm90IEhhcmR3YXJlIEZsb3cgY29udHJvbCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLg0KLSAqIEBybXRvbGwgQ1IzICAgICAgICAgIENUU0lFICAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkSVRfQ1RTDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkSVRfQ1RTKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19DVFNJRSkgPT0gKFVTQVJUX0NSM19DVFNJRSkpID8gMVVMDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBXYWtlIFVwIGZyb20gU3RvcCBNb2RlIEludGVycnVwdCBpcyBlbmFibGVkIG9yDQotICogZGlzYWJsZWQuDQotICogQG5vdGUgICBNYWNybyBJU19VQVJUX1dBS0VVUF9GUk9NU1RPUF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrDQotICogd2hldGhlciBvciBub3QgV2FrZS11cCBmcm9tIFN0b3AgbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4DQotICogaW5zdGFuY2UuDQotICogQHJtdG9sbCBDUjMgICAgICAgICAgV1VGSUUgICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9XS1VQDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkSVRfV0tVUChVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfV1VGSUUpID09IChVU0FSVF9DUjNfV1VGSUUpKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiBVU0FSVCBUWCBGSUZPIFRocmVzaG9sZCBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZA0KLSAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9GSUZPX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvcg0KLSAqIG5vdCBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4NCi0gKiBAcm10b2xsIENSMyAgICAgICAgICBUWEZUSUUgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZElUX1RYRlQNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9UWEZUKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19UWEZUSUUpID09IChVU0FSVF9DUjNfVFhGVElFKSkNCi0gICAgICAgICAgICAgID8gMVVMDQotICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFNtYXJ0Y2FyZCBUcmFuc21pc3Npb24gQ29tcGxldGUgQmVmb3JlIEd1YXJkIFRpbWUNCi0gKiBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4NCi0gKiBAbm90ZSAgIE1hY3JvIElTX1NNQVJUQ0FSRF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3INCi0gKiBub3QgU21hcnRjYXJkIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuDQotICogQHJtdG9sbCBDUjMgICAgICAgICAgVENCR1RJRSAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9UQ0JHVA0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZElUX1RDQkdUKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19UQ0JHVElFKSA9PSAoVVNBUlRfQ1IzX1RDQkdUSUUpKQ0KLSAgICAgICAgICAgICAgPyAxVUwNCi0gICAgICAgICAgICAgIDogMFVMKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiBVU0FSVCBSWCBGSUZPIFRocmVzaG9sZCBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZA0KLSAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9GSUZPX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvcg0KLSAqIG5vdCBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4NCi0gKiBAcm10b2xsIENSMyAgICAgICAgICBSWEZUSUUgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZElUX1JYRlQNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9SWEZUKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19SWEZUSUUpID09IChVU0FSVF9DUjNfUlhGVElFKSkNCi0gICAgICAgICAgICAgID8gMVVMDQotICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FRl9ETUFfTWFuYWdlbWVudCBETUFfTWFuYWdlbWVudA0KLSAqIEB7DQotICovDQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgRE1BIE1vZGUgZm9yIHJlY2VwdGlvbg0KLSAqIEBybXRvbGwgQ1IzICAgICAgICAgIERNQVIgICAgICAgICAgTExfVVNBUlRfRW5hYmxlRE1BUmVxX1JYDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVETUFSZXFfUlgoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7DQotICBBVE9NSUNfU0VUX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgRE1BIE1vZGUgZm9yIHJlY2VwdGlvbg0KLSAqIEBybXRvbGwgQ1IzICAgICAgICAgIERNQVIgICAgICAgICAgTExfVVNBUlRfRGlzYWJsZURNQVJlcV9SWA0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZURNQVJlcV9SWChVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIEFUT01JQ19DTEVBUl9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19ETUFSKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiBETUEgTW9kZSBpcyBlbmFibGVkIGZvciByZWNlcHRpb24NCi0gKiBAcm10b2xsIENSMyAgICAgICAgICBETUFSICAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZERNQVJlcV9SWA0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZERNQVJlcV9SWChVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfRE1BUikgPT0gKFVTQVJUX0NSM19ETUFSKSkgPyAxVUwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSBETUEgTW9kZSBmb3IgdHJhbnNtaXNzaW9uDQotICogQHJtdG9sbCBDUjMgICAgICAgICAgRE1BVCAgICAgICAgICBMTF9VU0FSVF9FbmFibGVETUFSZXFfVFgNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZURNQVJlcV9UWChVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIEFUT01JQ19TRVRfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfRE1BVCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBETUEgTW9kZSBmb3IgdHJhbnNtaXNzaW9uDQotICogQHJtdG9sbCBDUjMgICAgICAgICAgRE1BVCAgICAgICAgICBMTF9VU0FSVF9EaXNhYmxlRE1BUmVxX1RYDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlRE1BUmVxX1RYKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgQVRPTUlDX0NMRUFSX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIGlmIERNQSBNb2RlIGlzIGVuYWJsZWQgZm9yIHRyYW5zbWlzc2lvbg0KLSAqIEBybXRvbGwgQ1IzICAgICAgICAgIERNQVQgICAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkRE1BUmVxX1RYDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkRE1BUmVxX1RYKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19ETUFUKSA9PSAoVVNBUlRfQ1IzX0RNQVQpKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIERNQSBEaXNhYmxpbmcgb24gUmVjZXB0aW9uIEVycm9yDQotICogQHJtdG9sbCBDUjMgICAgICAgICAgRERSRSAgICAgICAgICBMTF9VU0FSVF9FbmFibGVETUFEZWFjdE9uUnhFcnINCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZURNQURlYWN0T25SeEVycihVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIFNFVF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19ERFJFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIERNQSBEaXNhYmxpbmcgb24gUmVjZXB0aW9uIEVycm9yDQotICogQHJtdG9sbCBDUjMgICAgICAgICAgRERSRSAgICAgICAgICBMTF9VU0FSVF9EaXNhYmxlRE1BRGVhY3RPblJ4RXJyDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlRE1BRGVhY3RPblJ4RXJyKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfRERSRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSW5kaWNhdGUgaWYgRE1BIERpc2FibGluZyBvbiBSZWNlcHRpb24gRXJyb3IgaXMgZGlzYWJsZWQNCi0gKiBAcm10b2xsIENSMyAgICAgICAgICBERFJFICAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZERNQURlYWN0T25SeEVycg0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90DQotTExfVVNBUlRfSXNFbmFibGVkRE1BRGVhY3RPblJ4RXJyKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19ERFJFKSA9PSAoVVNBUlRfQ1IzX0REUkUpKSA/IDFVTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IHRoZSBkYXRhIHJlZ2lzdGVyIGFkZHJlc3MgdXNlZCBmb3IgRE1BIHRyYW5zZmVyDQotICogQHJtdG9sbCBSRFIgICAgICAgICAgUkRSICAgICAgICAgICBMTF9VU0FSVF9ETUFfR2V0UmVnQWRkclxuDQotICogQHJtdG9sbCBURFIgICAgICAgICAgVERSICAgICAgICAgICBMTF9VU0FSVF9ETUFfR2V0UmVnQWRkcg0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHBhcmFtICBEaXJlY3Rpb24gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9ETUFfUkVHX0RBVEFfVFJBTlNNSVQNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9ETUFfUkVHX0RBVEFfUkVDRUlWRQ0KLSAqIEByZXR2YWwgQWRkcmVzcyBvZiBkYXRhIHJlZ2lzdGVyDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0RNQV9HZXRSZWdBZGRyKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRGlyZWN0aW9uKSB7DQotICB1aW50MzJfdCBkYXRhX3JlZ19hZGRyOw0KLQ0KLSAgaWYgKERpcmVjdGlvbiA9PSBMTF9VU0FSVF9ETUFfUkVHX0RBVEFfVFJBTlNNSVQpIHsNCi0gICAgLyogcmV0dXJuIGFkZHJlc3Mgb2YgVERSIHJlZ2lzdGVyICovDQotICAgIGRhdGFfcmVnX2FkZHIgPSAodWludDMyX3QpICYgKFVTQVJUeC0+VERSKTsNCi0gIH0gZWxzZSB7DQotICAgIC8qIHJldHVybiBhZGRyZXNzIG9mIFJEUiByZWdpc3RlciAqLw0KLSAgICBkYXRhX3JlZ19hZGRyID0gKHVpbnQzMl90KSAmIChVU0FSVHgtPlJEUik7DQotICB9DQotDQotICByZXR1cm4gZGF0YV9yZWdfYWRkcjsNCi19DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VGX0RhdGFfTWFuYWdlbWVudCBEYXRhX01hbmFnZW1lbnQNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmVhZCBSZWNlaXZlciBEYXRhIHJlZ2lzdGVyIChSZWNlaXZlIERhdGEgdmFsdWUsIDggYml0cykNCi0gKiBAcm10b2xsIFJEUiAgICAgICAgICBSRFIgICAgICAgICAgIExMX1VTQVJUX1JlY2VpdmVEYXRhOA0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkYNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDhfdCBMTF9VU0FSVF9SZWNlaXZlRGF0YTgoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7DQotICByZXR1cm4gKHVpbnQ4X3QpKFJFQURfQklUKFVTQVJUeC0+UkRSLCBVU0FSVF9SRFJfUkRSKSAmIDB4RkZVKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBSZWFkIFJlY2VpdmVyIERhdGEgcmVnaXN0ZXIgKFJlY2VpdmUgRGF0YSB2YWx1ZSwgOSBiaXRzKQ0KLSAqIEBybXRvbGwgUkRSICAgICAgICAgIFJEUiAgICAgICAgICAgTExfVVNBUlRfUmVjZWl2ZURhdGE5DQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHgxRkYNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDE2X3QgTExfVVNBUlRfUmVjZWl2ZURhdGE5KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgcmV0dXJuICh1aW50MTZfdCkoUkVBRF9CSVQoVVNBUlR4LT5SRFIsIFVTQVJUX1JEUl9SRFIpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBXcml0ZSBpbiBUcmFuc21pdHRlciBEYXRhIFJlZ2lzdGVyIChUcmFuc21pdCBEYXRhIHZhbHVlLCA4IGJpdHMpDQotICogQHJtdG9sbCBURFIgICAgICAgICAgVERSICAgICAgICAgICBMTF9VU0FSVF9UcmFuc21pdERhdGE4DQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcGFyYW0gIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1RyYW5zbWl0RGF0YTgoVVNBUlRfVHlwZURlZiAqVVNBUlR4LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBWYWx1ZSkgew0KLSAgVVNBUlR4LT5URFIgPSBWYWx1ZTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBXcml0ZSBpbiBUcmFuc21pdHRlciBEYXRhIFJlZ2lzdGVyIChUcmFuc21pdCBEYXRhIHZhbHVlLCA5IGJpdHMpDQotICogQHJtdG9sbCBURFIgICAgICAgICAgVERSICAgICAgICAgICBMTF9VU0FSVF9UcmFuc21pdERhdGE5DQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcGFyYW0gIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHgxRkYNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9UcmFuc21pdERhdGE5KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IFZhbHVlKSB7DQotICBVU0FSVHgtPlREUiA9ICh1aW50MTZfdCkoVmFsdWUgJiAweDFGRlVMKTsNCi19DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VGX0V4ZWN1dGlvbiBFeGVjdXRpb24NCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmVxdWVzdCBhbiBBdXRvbWF0aWMgQmF1ZCBSYXRlIG1lYXN1cmVtZW50IG9uIG5leHQgcmVjZWl2ZWQgZGF0YQ0KLSAqIGZyYW1lDQotICogQG5vdGUgICBNYWNybyBJU19VU0FSVF9BVVRPQkFVRFJBVEVfREVURUNUSU9OX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8NCi0gKiBjaGVjayB3aGV0aGVyIG9yIG5vdCBBdXRvIEJhdWQgUmF0ZSBkZXRlY3Rpb24gZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlDQotICogVVNBUlR4IGluc3RhbmNlLg0KLSAqIEBybXRvbGwgUlFSICAgICAgICAgIEFCUlJRICAgICAgICAgTExfVVNBUlRfUmVxdWVzdEF1dG9CYXVkUmF0ZQ0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfUmVxdWVzdEF1dG9CYXVkUmF0ZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIFNFVF9CSVQoVVNBUlR4LT5SUVIsICh1aW50MTZfdClVU0FSVF9SUVJfQUJSUlEpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJlcXVlc3QgQnJlYWsgc2VuZGluZw0KLSAqIEBybXRvbGwgUlFSICAgICAgICAgIFNCS1JRICAgICAgICAgTExfVVNBUlRfUmVxdWVzdEJyZWFrU2VuZGluZw0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfUmVxdWVzdEJyZWFrU2VuZGluZyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIFNFVF9CSVQoVVNBUlR4LT5SUVIsICh1aW50MTZfdClVU0FSVF9SUVJfU0JLUlEpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFB1dCBVU0FSVCBpbiBtdXRlIG1vZGUgYW5kIHNldCB0aGUgUldVIGZsYWcNCi0gKiBAcm10b2xsIFJRUiAgICAgICAgICBNTVJRICAgICAgICAgIExMX1VTQVJUX1JlcXVlc3RFbnRlck11dGVNb2RlDQotICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9SZXF1ZXN0RW50ZXJNdXRlTW9kZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIFNFVF9CSVQoVVNBUlR4LT5SUVIsICh1aW50MTZfdClVU0FSVF9SUVJfTU1SUSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmVxdWVzdCBhIFJlY2VpdmUgRGF0YSBhbmQgRklGTyBmbHVzaA0KLSAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9GSUZPX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvcg0KLSAqIG5vdCBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4NCi0gKiBAbm90ZSAgIEFsbG93cyB0byBkaXNjYXJkIHRoZSByZWNlaXZlZCBkYXRhIHdpdGhvdXQgcmVhZGluZyB0aGVtLCBhbmQgYXZvaWQNCi0gKiBhbiBvdmVycnVuIGNvbmRpdGlvbi4NCi0gKiBAcm10b2xsIFJRUiAgICAgICAgICBSWEZSUSAgICAgICAgIExMX1VTQVJUX1JlcXVlc3RSeERhdGFGbHVzaA0KLSAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlDQotICogQHJldHZhbCBOb25lDQotICovDQotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfUmVxdWVzdFJ4RGF0YUZsdXNoKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgew0KLSAgU0VUX0JJVChVU0FSVHgtPlJRUiwgKHVpbnQxNl90KVVTQVJUX1JRUl9SWEZSUSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmVxdWVzdCBhIFRyYW5zbWl0IGRhdGEgYW5kIEZJRk8gZmx1c2gNCi0gKiBAbm90ZSAgIE1hY3JvIElTX1VBUlRfRklGT19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3INCi0gKiBub3QgRklGTyBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuDQotICogQHJtdG9sbCBSUVIgICAgICAgICAgVFhGUlEgICAgICAgICBMTF9VU0FSVF9SZXF1ZXN0VHhEYXRhRmx1c2gNCi0gKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1JlcXVlc3RUeERhdGFGbHVzaChVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsNCi0gIFNFVF9CSVQoVVNBUlR4LT5SUVIsICh1aW50MTZfdClVU0FSVF9SUVJfVFhGUlEpOw0KLX0NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLSNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikNCi0vKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VGX0luaXQgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucw0KLSAqIEB7DQotICovDQotRXJyb3JTdGF0dXMgTExfVVNBUlRfRGVJbml0KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCk7DQotRXJyb3JTdGF0dXMgTExfVVNBUlRfSW5pdChVU0FSVF9UeXBlRGVmICpVU0FSVHgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICBMTF9VU0FSVF9Jbml0VHlwZURlZiAqVVNBUlRfSW5pdFN0cnVjdCk7DQotdm9pZCBMTF9VU0FSVF9TdHJ1Y3RJbml0KExMX1VTQVJUX0luaXRUeXBlRGVmICpVU0FSVF9Jbml0U3RydWN0KTsNCi1FcnJvclN0YXR1cyBMTF9VU0FSVF9DbG9ja0luaXQoDQotICAgIFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgTExfVVNBUlRfQ2xvY2tJbml0VHlwZURlZiAqVVNBUlRfQ2xvY2tJbml0U3RydWN0KTsNCi12b2lkIExMX1VTQVJUX0Nsb2NrU3RydWN0SW5pdChMTF9VU0FSVF9DbG9ja0luaXRUeXBlRGVmICpVU0FSVF9DbG9ja0luaXRTdHJ1Y3QpOw0KLS8qKg0KLSAqIEB9DQotICovDQotI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0jZW5kaWYgLyogVVNBUlQxIHx8IFVTQVJUMiB8fCBVU0FSVDMgfHwgVUFSVDQgfHwgVUFSVDUgKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLSNpZmRlZiBfX2NwbHVzcGx1cw0KLX0NCi0jZW5kaWYNCi0NCi0jZW5kaWYgLyogU1RNMzJHNHh4X0xMX1VTQVJUX0ggKi8NCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBmaWxlICAgIHN0bTMyZzR4eF9sbF91c2FydC5oCisgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgVVNBUlQgTEwgbW9kdWxlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGF0dGVudGlvbgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGVybXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZQorICogaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc29mdHdhcmUgY29tcG9uZW50LgorICogSWYgbm8gTElDRU5TRSBmaWxlIGNvbWVzIHdpdGggdGhpcyBzb2Z0d2FyZSwgaXQgaXMgcHJvdmlkZWQgQVMtSVMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyRzR4eF9MTF9VU0FSVF9ICisjZGVmaW5lIFNUTTMyRzR4eF9MTF9VU0FSVF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmc0eHguaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzR4eF9MTF9Ecml2ZXIKKyAqIEB7CisgKi8KKworI2lmIGRlZmluZWQoVVNBUlQxKSB8fCBkZWZpbmVkKFVTQVJUMikgfHwgZGVmaW5lZChVU0FSVDMpIHx8IGRlZmluZWQoVUFSVDQpIHx8IFwKKyAgICBkZWZpbmVkKFVBUlQ1KQorCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMIFVTQVJUCisgKiBAeworICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9Qcml2YXRlX1ZhcmlhYmxlcyBVU0FSVCBQcml2YXRlIFZhcmlhYmxlcworICogQHsKKyAqLworLyogQXJyYXkgdXNlZCB0byBnZXQgdGhlIFVTQVJUIHByZXNjYWxlciBkaXZpc2lvbiBkZWNpbWFsIHZhbHVlcyB2ZXJzdXMgQHJlZgorICogVVNBUlRfTExfRUNfUFJFU0NBTEVSIHZhbHVlcyAqLworc3RhdGljIGNvbnN0IHVpbnQzMl90IFVTQVJUX1BSRVNDQUxFUl9UQUJbXSA9IHsKKyAgICAxVUwsIDJVTCwgNFVMLCA2VUwsIDhVTCwgMTBVTCwgMTJVTCwgMTZVTCwgMzJVTCwgNjRVTCwgMTI4VUwsIDI1NlVMfTsKKy8qKgorICogQH0KKyAqLworCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9Qcml2YXRlX0NvbnN0YW50cyBVU0FSVCBQcml2YXRlIENvbnN0YW50cworICogQHsKKyAqLworLyoqCisgKiBAfQorICovCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBVU0FSVF9MTF9Qcml2YXRlX01hY3JvcyBVU0FSVCBQcml2YXRlIE1hY3JvcworICogQHsKKyAqLworLyoqCisgKiBAfQorICovCisjZW5kaWYgLypVU0VfRlVMTF9MTF9EUklWRVIqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FU19JTklUIFVTQVJUIEV4cG9ydGVkIEluaXQgc3RydWN0dXJlcworICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiBMTCBVU0FSVCBJbml0IFN0cnVjdHVyZSBkZWZpbml0aW9uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDMyX3QgUHJlc2NhbGVyVmFsdWU7IC8qITwgU3BlY2lmaWVzIHRoZSBQcmVzY2FsZXIgdG8gY29tcHV0ZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW11bmljYXRpb24gYmF1ZCByYXRlLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgb2YgQHJlZiBVU0FSVF9MTF9FQ19QUkVTQ0FMRVIuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVVNBUlRfU2V0UHJlc2NhbGVyKCkuKi8KKworICB1aW50MzJfdAorICAgICAgQmF1ZFJhdGU7IC8qITwgVGhpcyBmaWVsZCBkZWZpbmVzIGV4cGVjdGVkIFVzYXJ0IGNvbW11bmljYXRpb24gYmF1ZCByYXRlLgorCisgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeQorICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gQHJlZiBMTF9VU0FSVF9TZXRCYXVkUmF0ZSgpLiovCisKKyAgdWludDMyX3QgRGF0YVdpZHRoOyAvKiE8IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGRhdGEgYml0cyB0cmFuc21pdHRlZCBvcgorICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVkIGluIGEgZnJhbWUuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBVU0FSVF9MTF9FQ19EQVRBV0lEVEguCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBAcmVmIExMX1VTQVJUX1NldERhdGFXaWR0aCgpLiovCisKKyAgdWludDMyX3QKKyAgICAgIFN0b3BCaXRzOyAvKiE8IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHN0b3AgYml0cyB0cmFuc21pdHRlZC4KKyAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVVNBUlRfTExfRUNfU1RPUEJJVFMuCisKKyAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5CisgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBAcmVmIExMX1VTQVJUX1NldFN0b3BCaXRzTGVuZ3RoKCkuKi8KKworICB1aW50MzJfdAorICAgICAgUGFyaXR5OyAvKiE8IFNwZWNpZmllcyB0aGUgcGFyaXR5IG1vZGUuCisgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVU0FSVF9MTF9FQ19QQVJJVFkuCisKKyAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeQorICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEByZWYgTExfVVNBUlRfU2V0UGFyaXR5KCkuKi8KKworICB1aW50MzJfdCBUcmFuc2ZlckRpcmVjdGlvbjsgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgUmVjZWl2ZSBhbmQvb3IgVHJhbnNtaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4gVGhpcyBwYXJhbWV0ZXIgY2FuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBhIHZhbHVlIG9mIEByZWYgVVNBUlRfTExfRUNfRElSRUNUSU9OLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdGFyeSBmdW5jdGlvbiBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTF9VU0FSVF9TZXRUcmFuc2ZlckRpcmVjdGlvbigpLiovCisKKyAgdWludDMyX3QKKyAgICAgIEhhcmR3YXJlRmxvd0NvbnRyb2w7IC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGhhcmR3YXJlIGZsb3cgY29udHJvbCBtb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBlbmFibGVkIG9yIGRpc2FibGVkLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgb2YgQHJlZiBVU0FSVF9MTF9FQ19IV0NPTlRST0wuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVVNBUlRfU2V0SFdGbG93Q3RybCgpLiovCisKKyAgdWludDMyX3QgT3ZlclNhbXBsaW5nOyAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIFVTQVJUIG92ZXJzYW1wbGluZyBtb2RlIGlzIDE2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgOC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0xMX0VDX09WRVJTQU1QTElORy4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1VTQVJUX1NldE92ZXJTYW1wbGluZygpLiovCisKK30gTExfVVNBUlRfSW5pdFR5cGVEZWY7CisKKy8qKgorICogQGJyaWVmIExMIFVTQVJUIENsb2NrIEluaXQgU3RydWN0dXJlIGRlZmluaXRpb24KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50MzJfdCBDbG9ja091dHB1dDsgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgVVNBUlQgY2xvY2sgaXMgZW5hYmxlZCBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0xMX0VDX0NMT0NLLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUIEhXIGNvbmZpZ3VyYXRpb24gY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb25zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgTExfVVNBUlRfRW5hYmxlU0NMS091dHB1dCgpIG9yIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX1VTQVJUX0Rpc2FibGVTQ0xLT3V0cHV0KCkuIEZvciBtb3JlIGRldGFpbHMsIHJlZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBkZXNjcmlwdGlvbiBvZiB0aGlzIGZ1bmN0aW9uLiAqLworCisgIHVpbnQzMl90IENsb2NrUG9sYXJpdHk7IC8qITwgU3BlY2lmaWVzIHRoZSBzdGVhZHkgc3RhdGUgb2YgdGhlIHNlcmlhbCBjbG9jay4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0xMX0VDX1BPTEFSSVRZLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlQgSFcgY29uZmlndXJhdGlvbiBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyB1bml0YXJ5IGZ1bmN0aW9ucyBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX1VTQVJUX1NldENsb2NrUG9sYXJpdHkoKS4gRm9yIG1vcmUgZGV0YWlscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXIgdG8gZGVzY3JpcHRpb24gb2YgdGhpcyBmdW5jdGlvbi4gKi8KKworICB1aW50MzJfdCBDbG9ja1BoYXNlOyAvKiE8IFNwZWNpZmllcyB0aGUgY2xvY2sgdHJhbnNpdGlvbiBvbiB3aGljaCB0aGUgYml0CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcHR1cmUgaXMgbWFkZS4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZgorICAgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9MTF9FQ19QSEFTRS4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUIEhXIGNvbmZpZ3VyYXRpb24gY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbnMgQHJlZiBMTF9VU0FSVF9TZXRDbG9ja1BoYXNlKCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIG1vcmUgZGV0YWlscywgcmVmZXIgdG8gZGVzY3JpcHRpb24gb2YgdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbi4gKi8KKworICB1aW50MzJfdAorICAgICAgTGFzdEJpdENsb2NrUHVsc2U7IC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGNsb2NrIHB1bHNlIGNvcnJlc3BvbmRpbmcgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbGFzdCB0cmFuc21pdHRlZCBkYXRhIGJpdCAoTVNCKSBoYXMgdG8gYmUgb3V0cHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gdGhlIFNDTEsgcGluIGluIHN5bmNocm9ub3VzIG1vZGUuIFRoaXMgcGFyYW1ldGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVU0FSVF9MTF9FQ19MQVNUQ0xLUFVMU0UuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUIEhXIGNvbmZpZ3VyYXRpb24gY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyB1bml0YXJ5IGZ1bmN0aW9ucyBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfVVNBUlRfU2V0TGFzdENsa1B1bHNlT3V0cHV0KCkuIEZvciBtb3JlIGRldGFpbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXIgdG8gZGVzY3JpcHRpb24gb2YgdGhpcyBmdW5jdGlvbi4gKi8KKworfSBMTF9VU0FSVF9DbG9ja0luaXRUeXBlRGVmOworCisvKioKKyAqIEB9CisgKi8KKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRXhwb3J0ZWRfQ29uc3RhbnRzIFVTQVJUIEV4cG9ydGVkIENvbnN0YW50cworICogQHsKKyAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX0NMRUFSX0ZMQUcgQ2xlYXIgRmxhZ3MgRGVmaW5lcworICogQGJyaWVmICAgIEZsYWdzIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9VU0FSVF9Xcml0ZVJlZyBmdW5jdGlvbgorICogQHsKKyAqLworI2RlZmluZSBMTF9VU0FSVF9JQ1JfUEVDRiBVU0FSVF9JQ1JfUEVDRiAvKiE8IFBhcml0eSBlcnJvciBjbGVhciBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lDUl9GRUNGIFVTQVJUX0lDUl9GRUNGIC8qITwgRnJhbWluZyBlcnJvciBjbGVhciBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lDUl9ORUNGICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFVTQVJUX0lDUl9ORUNGIC8qITwgTm9pc2UgZXJyb3IgZGV0ZWN0ZWQgY2xlYXIgZmxhZyBcCisgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9VU0FSVF9JQ1JfT1JFQ0YgVVNBUlRfSUNSX09SRUNGIC8qITwgT3ZlcnJ1biBlcnJvciBjbGVhciBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lDUl9JRExFQ0YgXAorICBVU0FSVF9JQ1JfSURMRUNGIC8qITwgSWRsZSBsaW5lIGRldGVjdGVkIGNsZWFyIGZsYWcgKi8KKyNkZWZpbmUgTExfVVNBUlRfSUNSX1RYRkVDRiBVU0FSVF9JQ1JfVFhGRUNGIC8qITwgVFggRklGTyBFbXB0eSBjbGVhciBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lDUl9UQ0NGIFwKKyAgVVNBUlRfSUNSX1RDQ0YgLyohPCBUcmFuc21pc3Npb24gY29tcGxldGUgY2xlYXIgZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JQ1JfVENCR1RDRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFVTQVJUX0lDUl9UQ0JHVENGIC8qITwgVHJhbnNtaXNzaW9uIGNvbXBsZXRlZCBiZWZvcmUgZ3VhcmQgdGltZSBjbGVhciBmbGFnIFwKKyAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX1VTQVJUX0lDUl9MQkRDRiBcCisgIFVTQVJUX0lDUl9MQkRDRiAvKiE8IExJTiBicmVhayBkZXRlY3Rpb24gY2xlYXIgZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JQ1JfQ1RTQ0YgVVNBUlRfSUNSX0NUU0NGIC8qITwgQ1RTIGNsZWFyIGZsYWcgKi8KKyNkZWZpbmUgTExfVVNBUlRfSUNSX1JUT0NGIFVTQVJUX0lDUl9SVE9DRiAvKiE8IFJlY2VpdmVyIHRpbWVvdXQgY2xlYXIgZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JQ1JfRU9CQ0YgVVNBUlRfSUNSX0VPQkNGIC8qITwgRW5kIG9mIGJsb2NrIGNsZWFyIGZsYWcgKi8KKyNkZWZpbmUgTExfVVNBUlRfSUNSX1VEUkNGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFVTQVJUX0lDUl9VRFJDRiAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU1BJIFNsYXZlIFVuZGVycnVuIGNsZWFyIGZsYWcgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfVVNBUlRfSUNSX0NNQ0YgVVNBUlRfSUNSX0NNQ0YgLyohPCBDaGFyYWN0ZXIgbWF0Y2ggY2xlYXIgZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JQ1JfV1VDRiBcCisgIFVTQVJUX0lDUl9XVUNGIC8qITwgV2FrZXVwIGZyb20gU3RvcCBtb2RlIGNsZWFyIGZsYWcgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX0dFVF9GTEFHIEdldCBGbGFncyBEZWZpbmVzCisgKiBAYnJpZWYgICAgRmxhZ3MgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX1VTQVJUX1JlYWRSZWcgZnVuY3Rpb24KKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfVVNBUlRfSVNSX1BFIFVTQVJUX0lTUl9QRSAgICAgLyohPCBQYXJpdHkgZXJyb3IgZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JU1JfRkUgVVNBUlRfSVNSX0ZFICAgICAvKiE8IEZyYW1pbmcgZXJyb3IgZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JU1JfTkUgVVNBUlRfSVNSX05FICAgICAvKiE8IE5vaXNlIGRldGVjdGVkIGZsYWcgKi8KKyNkZWZpbmUgTExfVVNBUlRfSVNSX09SRSBVU0FSVF9JU1JfT1JFICAgLyohPCBPdmVycnVuIGVycm9yIGZsYWcgKi8KKyNkZWZpbmUgTExfVVNBUlRfSVNSX0lETEUgVVNBUlRfSVNSX0lETEUgLyohPCBJZGxlIGxpbmUgZGV0ZWN0ZWQgZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JU1JfUlhORV9SWEZORSBcCisgIFVTQVJUX0lTUl9SWE5FX1JYRk5FIC8qITwgUmVhZCBkYXRhIHJlZ2lzdGVyIG9yIFJYIEZJRk8gbm90IGVtcHR5IGZsYWcgKi8KKyNkZWZpbmUgTExfVVNBUlRfSVNSX1RDIFVTQVJUX0lTUl9UQyAvKiE8IFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lTUl9UWEVfVFhGTkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBVU0FSVF9JU1JfVFhFX1RYRk5GIC8qITwgVHJhbnNtaXQgZGF0YSByZWdpc3RlciBlbXB0eSBvciBUWCBGSUZPIE5vdCBGdWxsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnKi8KKyNkZWZpbmUgTExfVVNBUlRfSVNSX0xCREYgVVNBUlRfSVNSX0xCREYgICAvKiE8IExJTiBicmVhayBkZXRlY3Rpb24gZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JU1JfQ1RTSUYgVVNBUlRfSVNSX0NUU0lGIC8qITwgQ1RTIGludGVycnVwdCBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lTUl9DVFMgVVNBUlRfSVNSX0NUUyAgICAgLyohPCBDVFMgZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JU1JfUlRPRiBVU0FSVF9JU1JfUlRPRiAgIC8qITwgUmVjZWl2ZXIgdGltZW91dCBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lTUl9FT0JGIFVTQVJUX0lTUl9FT0JGICAgLyohPCBFbmQgb2YgYmxvY2sgZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JU1JfVURSIFVTQVJUX0lTUl9VRFIgICAgIC8qITwgU1BJIFNsYXZlIHVuZGVycnVuIGVycm9yIGZsYWcgKi8KKyNkZWZpbmUgTExfVVNBUlRfSVNSX0FCUkUgVVNBUlRfSVNSX0FCUkUgICAvKiE8IEF1dG8gYmF1ZCByYXRlIGVycm9yIGZsYWcgKi8KKyNkZWZpbmUgTExfVVNBUlRfSVNSX0FCUkYgVVNBUlRfSVNSX0FCUkYgICAvKiE8IEF1dG8gYmF1ZCByYXRlIGZsYWcgKi8KKyNkZWZpbmUgTExfVVNBUlRfSVNSX0JVU1kgVVNBUlRfSVNSX0JVU1kgICAvKiE8IEJ1c3kgZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JU1JfQ01GIFVTQVJUX0lTUl9DTUYgICAgIC8qITwgQ2hhcmFjdGVyIG1hdGNoIGZsYWcgKi8KKyNkZWZpbmUgTExfVVNBUlRfSVNSX1NCS0YgVVNBUlRfSVNSX1NCS0YgICAvKiE8IFNlbmQgYnJlYWsgZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JU1JfUldVIFwKKyAgVVNBUlRfSVNSX1JXVSAvKiE8IFJlY2VpdmVyIHdha2V1cCBmcm9tIE11dGUgbW9kZSBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lTUl9XVUYgVVNBUlRfSVNSX1dVRiAvKiE8IFdha2V1cCBmcm9tIFN0b3AgbW9kZSBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lTUl9URUFDSyBcCisgIFVTQVJUX0lTUl9URUFDSyAvKiE8IFRyYW5zbWl0IGVuYWJsZSBhY2tub3dsZWRnZSBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lTUl9SRUFDSyBcCisgIFVTQVJUX0lTUl9SRUFDSyAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUmVjZWl2ZSBlbmFibGUgYWNrbm93bGVkZ2UgZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JU1JfVFhGRSBVU0FSVF9JU1JfVFhGRSAvKiE8IFRYIEZJRk8gZW1wdHkgZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JU1JfUlhGRiBVU0FSVF9JU1JfUlhGRiAvKiE8IFJYIEZJRk8gZnVsbCBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lTUl9UQ0JHVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBVU0FSVF9JU1JfVENCR1QgLyohPCBUcmFuc21pc3Npb24gY29tcGxldGUgYmVmb3JlIGd1YXJkIHRpbWUgY29tcGxldGlvbiBmbGFnIFwKKyAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9VU0FSVF9JU1JfUlhGVCBVU0FSVF9JU1JfUlhGVCAvKiE8IFJYIEZJRk8gdGhyZXNob2xkIGZsYWcgKi8KKyNkZWZpbmUgTExfVVNBUlRfSVNSX1RYRlQgVVNBUlRfSVNSX1RYRlQgLyohPCBUWCBGSUZPIHRocmVzaG9sZCBmbGFnICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FQ19JVCBJVCBEZWZpbmVzCisgKiBAYnJpZWYgICAgSVQgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX1VTQVJUX1JlYWRSZWcgYW5kCisgKiBMTF9VU0FSVF9Xcml0ZVJlZyBmdW5jdGlvbnMKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfVVNBUlRfQ1IxX0lETEVJRSBVU0FSVF9DUjFfSURMRUlFIC8qITwgSURMRSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX1VTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSAvKiE8IFJlYWQgZGF0YSByZWdpc3RlciBhbmQgUlhGSUZPIG5vdCBlbXB0eSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX1VTQVJUX0NSMV9UQ0lFIFwKKyAgVVNBUlRfQ1IxX1RDSUUgLyohPCBUcmFuc21pc3Npb24gY29tcGxldGUgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBMTF9VU0FSVF9DUjFfVFhFSUVfVFhGTkZJRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVVNBUlRfQ1IxX1RYRUlFX1RYRk5GSUUgLyohPCBUcmFuc21pdCBkYXRhIHJlZ2lzdGVyIGVtcHR5IGFuZCBUWCBGSUZPIG5vdCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGwgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBMTF9VU0FSVF9DUjFfUEVJRSBVU0FSVF9DUjFfUEVJRSAvKiE8IFBhcml0eSBlcnJvciAqLworI2RlZmluZSBMTF9VU0FSVF9DUjFfQ01JRSBcCisgIFVTQVJUX0NSMV9DTUlFIC8qITwgQ2hhcmFjdGVyIG1hdGNoIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgTExfVVNBUlRfQ1IxX1JUT0lFIFwKKyAgVVNBUlRfQ1IxX1JUT0lFIC8qITwgUmVjZWl2ZXIgdGltZW91dCBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX1VTQVJUX0NSMV9FT0JJRSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVVNBUlRfQ1IxX0VPQklFIC8qITwgRW5kIG9mIEJsb2NrIGludGVycnVwdCBlbmFibGUgXAorICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX1VTQVJUX0NSMV9UWEZFSUUgXAorICBVU0FSVF9DUjFfVFhGRUlFIC8qITwgVFggRklGTyBlbXB0eSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX1VTQVJUX0NSMV9SWEZGSUUgXAorICBVU0FSVF9DUjFfUlhGRklFIC8qITwgUlggRklGTyBmdWxsIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgTExfVVNBUlRfQ1IyX0xCRElFIFwKKyAgVVNBUlRfQ1IyX0xCRElFIC8qITwgTElOIGJyZWFrIGRldGVjdGlvbiBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX1VTQVJUX0NSM19FSUUgVVNBUlRfQ1IzX0VJRSAgICAgLyohPCBFcnJvciBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX1VTQVJUX0NSM19DVFNJRSBVU0FSVF9DUjNfQ1RTSUUgLyohPCBDVFMgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBMTF9VU0FSVF9DUjNfV1VGSUUgXAorICBVU0FSVF9DUjNfV1VGSUUgLyohPCBXYWtldXAgZnJvbSBTdG9wIG1vZGUgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBMTF9VU0FSVF9DUjNfVFhGVElFIFwKKyAgVVNBUlRfQ1IzX1RYRlRJRSAvKiE8IFRYIEZJRk8gdGhyZXNob2xkIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgTExfVVNBUlRfQ1IzX1RDQkdUSUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVVNBUlRfQ1IzX1RDQkdUSUUgLyohPCBUcmFuc21pc3Npb24gY29tcGxldGUgYmVmb3JlIGd1YXJkIHRpbWUgaW50ZXJydXB0IFwKKyAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlICovCisjZGVmaW5lIExMX1VTQVJUX0NSM19SWEZUSUUgXAorICBVU0FSVF9DUjNfUlhGVElFIC8qITwgUlggRklGTyB0aHJlc2hvbGQgaW50ZXJydXB0IGVuYWJsZSAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUNfRklGT1RIUkVTSE9MRCBGSUZPIFRocmVzaG9sZAorICogQHsKKyAqLworI2RlZmluZSBMTF9VU0FSVF9GSUZPVEhSRVNIT0xEXzFfOCBcCisgIDB4MDAwMDAwMDBVIC8qITwgRklGTyByZWFjaGVzIDEvOCBvZiBpdHMgZGVwdGggKi8KKyNkZWZpbmUgTExfVVNBUlRfRklGT1RIUkVTSE9MRF8xXzQgXAorICAweDAwMDAwMDAxVSAvKiE8IEZJRk8gcmVhY2hlcyAxLzQgb2YgaXRzIGRlcHRoICovCisjZGVmaW5lIExMX1VTQVJUX0ZJRk9USFJFU0hPTERfMV8yIFwKKyAgMHgwMDAwMDAwMlUgLyohPCBGSUZPIHJlYWNoZXMgMS8yIG9mIGl0cyBkZXB0aCAqLworI2RlZmluZSBMTF9VU0FSVF9GSUZPVEhSRVNIT0xEXzNfNCBcCisgIDB4MDAwMDAwMDNVIC8qITwgRklGTyByZWFjaGVzIDMvNCBvZiBpdHMgZGVwdGggKi8KKyNkZWZpbmUgTExfVVNBUlRfRklGT1RIUkVTSE9MRF83XzggXAorICAweDAwMDAwMDA0VSAvKiE8IEZJRk8gcmVhY2hlcyA3Lzggb2YgaXRzIGRlcHRoICovCisjZGVmaW5lIExMX1VTQVJUX0ZJRk9USFJFU0hPTERfOF84IFwKKyAgMHgwMDAwMDAwNVUgLyohPCBGSUZPIGJlY29tZXMgZW1wdHkgZm9yIFRYIGFuZCBmdWxsIGZvciBSWCAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUNfRElSRUNUSU9OIENvbW11bmljYXRpb24gRGlyZWN0aW9uCisgKiBAeworICovCisjZGVmaW5lIExMX1VTQVJUX0RJUkVDVElPTl9OT05FIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBUcmFuc21pdHRlciBhbmQgUmVjZWl2ZXIgYXJlIGRpc2FibGVkICovCisjZGVmaW5lIExMX1VTQVJUX0RJUkVDVElPTl9SWCBcCisgIFVTQVJUX0NSMV9SRSAvKiE8IFRyYW5zbWl0dGVyIGlzIGRpc2FibGVkIGFuZCBSZWNlaXZlciBpcyBlbmFibGVkICovCisjZGVmaW5lIExMX1VTQVJUX0RJUkVDVElPTl9UWCBcCisgIFVTQVJUX0NSMV9URSAvKiE8IFRyYW5zbWl0dGVyIGlzIGVuYWJsZWQgYW5kIFJlY2VpdmVyIGlzIGRpc2FibGVkICovCisjZGVmaW5lIExMX1VTQVJUX0RJUkVDVElPTl9UWF9SWCBcCisgIChVU0FSVF9DUjFfVEUgfCBVU0FSVF9DUjFfUkUpIC8qITwgVHJhbnNtaXR0ZXIgYW5kIFJlY2VpdmVyIGFyZSBlbmFibGVkICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FQ19QQVJJVFkgUGFyaXR5IENvbnRyb2wKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfVVNBUlRfUEFSSVRZX05PTkUgMHgwMDAwMDAwMFUgLyohPCBQYXJpdHkgY29udHJvbCBkaXNhYmxlZCAqLworI2RlZmluZSBMTF9VU0FSVF9QQVJJVFlfRVZFTiBcCisgIFVTQVJUX0NSMV9QQ0UgLyohPCBQYXJpdHkgY29udHJvbCBlbmFibGVkIGFuZCBFdmVuIFBhcml0eSBpcyBzZWxlY3RlZCAqLworI2RlZmluZSBMTF9VU0FSVF9QQVJJVFlfT0REIFwKKyAgKFVTQVJUX0NSMV9QQ0UgfCAgICAgICAgICBcCisgICBVU0FSVF9DUjFfUFMpIC8qITwgUGFyaXR5IGNvbnRyb2wgZW5hYmxlZCBhbmQgT2RkIFBhcml0eSBpcyBzZWxlY3RlZCAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUNfV0FLRVVQIFdha2V1cAorICogQHsKKyAqLworI2RlZmluZSBMTF9VU0FSVF9XQUtFVVBfSURMRUxJTkUgXAorICAweDAwMDAwMDAwVSAvKiE8ICBVU0FSVCB3YWtlIHVwIGZyb20gTXV0ZSBtb2RlIG9uIElkbGUgTGluZSAqLworI2RlZmluZSBMTF9VU0FSVF9XQUtFVVBfQUREUkVTU01BUksgXAorICBVU0FSVF9DUjFfV0FLRSAvKiE8ICBVU0FSVCB3YWtlIHVwIGZyb20gTXV0ZSBtb2RlIG9uIEFkZHJlc3MgTWFyayAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUNfREFUQVdJRFRIIERhdGF3aWR0aAorICogQHsKKyAqLworI2RlZmluZSBMTF9VU0FSVF9EQVRBV0lEVEhfN0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFVTQVJUX0NSMV9NMSAvKiE8IDcgYml0cyB3b3JkIGxlbmd0aCA6IFN0YXJ0IGJpdCwgNyBkYXRhIGJpdHMsIG4gc3RvcCBiaXRzIFwKKyAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9VU0FSVF9EQVRBV0lEVEhfOEIgXAorICAweDAwMDAwMDAwVSAvKiE8IDggYml0cyB3b3JkIGxlbmd0aCA6IFN0YXJ0IGJpdCwgOCBkYXRhIGJpdHMsIG4gc3RvcCBiaXRzICovCisjZGVmaW5lIExMX1VTQVJUX0RBVEFXSURUSF85QiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVVNBUlRfQ1IxX00wIC8qITwgOSBiaXRzIHdvcmQgbGVuZ3RoIDogU3RhcnQgYml0LCA5IGRhdGEgYml0cywgbiBzdG9wIGJpdHMgXAorICAgICAgICAgICAgICAgICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FQ19PVkVSU0FNUExJTkcgT3ZlcnNhbXBsaW5nCisgKiBAeworICovCisjZGVmaW5lIExMX1VTQVJUX09WRVJTQU1QTElOR18xNiAweDAwMDAwMDAwVSAgICAvKiE8IE92ZXJzYW1wbGluZyBieSAxNiAqLworI2RlZmluZSBMTF9VU0FSVF9PVkVSU0FNUExJTkdfOCBVU0FSVF9DUjFfT1ZFUjggLyohPCBPdmVyc2FtcGxpbmcgYnkgOCAqLworLyoqCisgKiBAfQorICovCisKKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUNfQ0xPQ0sgQ2xvY2sgU2lnbmFsCisgKiBAeworICovCisKKyNkZWZpbmUgTExfVVNBUlRfQ0xPQ0tfRElTQUJMRSAweDAwMDAwMDAwVSAgICAvKiE8IENsb2NrIHNpZ25hbCBub3QgcHJvdmlkZWQgKi8KKyNkZWZpbmUgTExfVVNBUlRfQ0xPQ0tfRU5BQkxFIFVTQVJUX0NSMl9DTEtFTiAvKiE8IENsb2NrIHNpZ25hbCBwcm92aWRlZCAqLworLyoqCisgKiBAfQorICovCisjZW5kaWYgLypVU0VfRlVMTF9MTF9EUklWRVIqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX0xBU1RDTEtQVUxTRSBMYXN0IENsb2NrIFB1bHNlCisgKiBAeworICovCisjZGVmaW5lIExMX1VTQVJUX0xBU1RDTEtQVUxTRV9OT19PVVRQVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBUaGUgY2xvY2sgcHVsc2Ugb2YgdGhlIGxhc3QgZGF0YSBiaXQgaXMgbm90IG91dHB1dCB0byB0aGUgXAorICAgICAgICAgICAgICAgICBTQ0xLIHBpbiAqLworI2RlZmluZSBMTF9VU0FSVF9MQVNUQ0xLUFVMU0VfT1VUUFVUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVVNBUlRfQ1IyX0xCQ0wgLyohPCBUaGUgY2xvY2sgcHVsc2Ugb2YgdGhlIGxhc3QgZGF0YSBiaXQgaXMgb3V0cHV0IHRvIHRoZSBcCisgICAgICAgICAgICAgICAgICAgIFNDTEsgcGluICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FQ19QSEFTRSBDbG9jayBQaGFzZQorICogQHsKKyAqLworI2RlZmluZSBMTF9VU0FSVF9QSEFTRV8xRURHRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMDAwMDBVIC8qITwgVGhlIGZpcnN0IGNsb2NrIHRyYW5zaXRpb24gaXMgdGhlIGZpcnN0IGRhdGEgY2FwdHVyZSBlZGdlIFwKKyAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX1VTQVJUX1BIQVNFXzJFREdFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBVU0FSVF9DUjJfQ1BIQSAvKiE8IFRoZSBzZWNvbmQgY2xvY2sgdHJhbnNpdGlvbiBpcyB0aGUgZmlyc3QgZGF0YSBjYXB0dXJlIFwKKyAgICAgICAgICAgICAgICAgICAgZWRnZSAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUNfUE9MQVJJVFkgQ2xvY2sgUG9sYXJpdHkKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfVVNBUlRfUE9MQVJJVFlfTE9XIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBTdGVhZHkgbG93IHZhbHVlIG9uIFNDTEsgcGluIG91dHNpZGUgdHJhbnNtaXNzaW9uIHdpbmRvdyovCisjZGVmaW5lIExMX1VTQVJUX1BPTEFSSVRZX0hJR0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBVU0FSVF9DUjJfQ1BPTCAvKiE8IFN0ZWFkeSBoaWdoIHZhbHVlIG9uIFNDTEsgcGluIG91dHNpZGUgdHJhbnNtaXNzaW9uIFwKKyAgICAgICAgICAgICAgICAgICAgd2luZG93ICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FQ19QUkVTQ0FMRVIgQ2xvY2sgU291cmNlIFByZXNjYWxlcgorICogQHsKKyAqLworI2RlZmluZSBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMSAweDAwMDAwMDAwVSAvKiE8IElucHV0IGNsb2NrIG5vdCBkaXZpZGVkICAgKi8KKyNkZWZpbmUgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjIgXAorICAoVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzApIC8qITwgSW5wdXQgY2xvY2sgZGl2aWRlZCBieSAyICAqLworI2RlZmluZSBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWNCBcCisgIChVU0FSVF9QUkVTQ19QUkVTQ0FMRVJfMSkgLyohPCBJbnB1dCBjbG9jayBkaXZpZGVkIGJ5IDQgICovCisjZGVmaW5lIExMX1VTQVJUX1BSRVNDQUxFUl9ESVY2IFwKKyAgKFVTQVJUX1BSRVNDX1BSRVNDQUxFUl8xIHwgICAgXAorICAgVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzApIC8qITwgSW5wdXQgY2xvY2sgZGl2aWRlZCBieSA2ICAqLworI2RlZmluZSBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWOCBcCisgIChVU0FSVF9QUkVTQ19QUkVTQ0FMRVJfMikgLyohPCBJbnB1dCBjbG9jayBkaXZpZGVkIGJ5IDggICovCisjZGVmaW5lIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYxMCBcCisgIChVU0FSVF9QUkVTQ19QUkVTQ0FMRVJfMiB8ICAgICBcCisgICBVU0FSVF9QUkVTQ19QUkVTQ0FMRVJfMCkgLyohPCBJbnB1dCBjbG9jayBkaXZpZGVkIGJ5IDEwICovCisjZGVmaW5lIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYxMiBcCisgIChVU0FSVF9QUkVTQ19QUkVTQ0FMRVJfMiB8ICAgICBcCisgICBVU0FSVF9QUkVTQ19QUkVTQ0FMRVJfMSkgLyohPCBJbnB1dCBjbG9jayBkaXZpZGVkIGJ5IDEyICovCisjZGVmaW5lIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYxNiAgICAgICAgICAgICAgICAgICAgICAgXAorICAoVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzIgfCBVU0FSVF9QUkVTQ19QUkVTQ0FMRVJfMSB8IFwKKyAgIFVTQVJUX1BSRVNDX1BSRVNDQUxFUl8wKSAvKiE8IElucHV0IGNsb2NrIGRpdmlkZWQgYnkgMTYgKi8KKyNkZWZpbmUgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjMyIFwKKyAgKFVTQVJUX1BSRVNDX1BSRVNDQUxFUl8zKSAvKiE8IElucHV0IGNsb2NrIGRpdmlkZWQgYnkgMzIgKi8KKyNkZWZpbmUgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjY0IFwKKyAgKFVTQVJUX1BSRVNDX1BSRVNDQUxFUl8zIHwgICAgIFwKKyAgIFVTQVJUX1BSRVNDX1BSRVNDQUxFUl8wKSAvKiE8IElucHV0IGNsb2NrIGRpdmlkZWQgYnkgNjQgKi8KKyNkZWZpbmUgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjEyOCBcCisgIChVU0FSVF9QUkVTQ19QUkVTQ0FMRVJfMyB8ICAgICAgXAorICAgVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzEpIC8qITwgSW5wdXQgY2xvY2sgZGl2aWRlZCBieSAxMjggKi8KKyNkZWZpbmUgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjI1NiAgICAgICAgICAgICAgICAgICAgICBcCisgIChVU0FSVF9QUkVTQ19QUkVTQ0FMRVJfMyB8IFVTQVJUX1BSRVNDX1BSRVNDQUxFUl8xIHwgXAorICAgVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzApIC8qITwgSW5wdXQgY2xvY2sgZGl2aWRlZCBieSAyNTYgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX1NUT1BCSVRTIFN0b3AgQml0cworICogQHsKKyAqLworI2RlZmluZSBMTF9VU0FSVF9TVE9QQklUU18wXzUgVVNBUlRfQ1IyX1NUT1BfMCAvKiE8IDAuNSBzdG9wIGJpdCAqLworI2RlZmluZSBMTF9VU0FSVF9TVE9QQklUU18xIDB4MDAwMDAwMDBVICAgICAgICAvKiE8IDEgc3RvcCBiaXQgKi8KKyNkZWZpbmUgTExfVVNBUlRfU1RPUEJJVFNfMV81IFwKKyAgKFVTQVJUX0NSMl9TVE9QXzAgfCBVU0FSVF9DUjJfU1RPUF8xKSAgICAgIC8qITwgMS41IHN0b3AgYml0cyAqLworI2RlZmluZSBMTF9VU0FSVF9TVE9QQklUU18yIFVTQVJUX0NSMl9TVE9QXzEgLyohPCAyIHN0b3AgYml0cyAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUNfVFhSWCBUWCBSWCBQaW5zIFN3YXAKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfVVNBUlRfVFhSWF9TVEFOREFSRCBcCisgIDB4MDAwMDAwMDBVIC8qITwgVFgvUlggcGlucyBhcmUgdXNlZCBhcyBkZWZpbmVkIGluIHN0YW5kYXJkIHBpbm91dCAqLworI2RlZmluZSBMTF9VU0FSVF9UWFJYX1NXQVBQRUQgXAorICAoVVNBUlRfQ1IyX1NXQVApIC8qITwgVFggYW5kIFJYIHBpbnMgZnVuY3Rpb25zIGFyZSBzd2FwcGVkLiAgICAgICAgICAgICAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUNfUlhQSU5fTEVWRUwgUlggUGluIEFjdGl2ZSBMZXZlbCBJbnZlcnNpb24KKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfVVNBUlRfUlhQSU5fTEVWRUxfU1RBTkRBUkQgXAorICAweDAwMDAwMDAwVSAvKiE8IFJYIHBpbiBzaWduYWwgd29ya3MgdXNpbmcgdGhlIHN0YW5kYXJkIGxvZ2ljIGxldmVscyAqLworI2RlZmluZSBMTF9VU0FSVF9SWFBJTl9MRVZFTF9JTlZFUlRFRCBcCisgIChVU0FSVF9DUjJfUlhJTlYpIC8qITwgUlggcGluIHNpZ25hbCB2YWx1ZXMgYXJlIGludmVydGVkLiAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUNfVFhQSU5fTEVWRUwgVFggUGluIEFjdGl2ZSBMZXZlbCBJbnZlcnNpb24KKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfVVNBUlRfVFhQSU5fTEVWRUxfU1RBTkRBUkQgXAorICAweDAwMDAwMDAwVSAvKiE8IFRYIHBpbiBzaWduYWwgd29ya3MgdXNpbmcgdGhlIHN0YW5kYXJkIGxvZ2ljIGxldmVscyAqLworI2RlZmluZSBMTF9VU0FSVF9UWFBJTl9MRVZFTF9JTlZFUlRFRCBcCisgIChVU0FSVF9DUjJfVFhJTlYpIC8qITwgVFggcGluIHNpZ25hbCB2YWx1ZXMgYXJlIGludmVydGVkLiAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUNfQklOQVJZX0xPR0lDIEJpbmFyeSBEYXRhIEludmVyc2lvbgorICogQHsKKyAqLworI2RlZmluZSBMTF9VU0FSVF9CSU5BUllfTE9HSUNfUE9TSVRJVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBMb2dpY2FsIGRhdGEgZnJvbSB0aGUgZGF0YSByZWdpc3RlciBhcmUgc2VuZC9yZWNlaXZlZCBpbiBcCisgICAgICAgICAgICAgICAgIHBvc2l0aXZlL2RpcmVjdCBsb2dpYy4gKDE9SCwgMD1MKSAqLworI2RlZmluZSBMTF9VU0FSVF9CSU5BUllfTE9HSUNfTkVHQVRJVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVVNBUlRfQ1IyX0RBVEFJTlYgLyohPCBMb2dpY2FsIGRhdGEgZnJvbSB0aGUgZGF0YSByZWdpc3RlciBhcmUgc2VuZC9yZWNlaXZlZCBcCisgICAgICAgICAgICAgICAgICAgICAgIGluIG5lZ2F0aXZlL2ludmVyc2UgbG9naWMuICgxPUwsIDA9SCkuIFRoZSBwYXJpdHkgYml0ICAgXAorICAgICAgICAgICAgICAgICAgICAgICBpcyBhbHNvIGludmVydGVkLiAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUNfQklUT1JERVIgQml0IE9yZGVyCisgKiBAeworICovCisjZGVmaW5lIExMX1VTQVJUX0JJVE9SREVSX0xTQkZJUlNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBkYXRhIGlzIHRyYW5zbWl0dGVkL3JlY2VpdmVkIHdpdGggZGF0YSBiaXQgMCBmaXJzdCwgXAorICAgICAgICAgICAgICAgICBmb2xsb3dpbmcgdGhlIHN0YXJ0IGJpdCAqLworI2RlZmluZSBMTF9VU0FSVF9CSVRPUkRFUl9NU0JGSVJTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBVU0FSVF9DUjJfTVNCRklSU1QgLyohPCBkYXRhIGlzIHRyYW5zbWl0dGVkL3JlY2VpdmVkIHdpdGggdGhlIE1TQiBmaXJzdCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgZm9sbG93aW5nIHRoZSBzdGFydCBiaXQgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX0FVVE9CQVVEX0RFVEVDVF9PTiBBdXRvYmF1ZCBEZXRlY3Rpb24KKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfVVNBUlRfQVVUT0JBVURfREVURUNUX09OX1NUQVJUQklUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBNZWFzdXJlbWVudCBvZiB0aGUgc3RhcnQgYml0IGlzIHVzZWQgdG8gZGV0ZWN0IHRoZSBiYXVkIFwKKyAgICAgICAgICAgICAgICAgcmF0ZSAqLworI2RlZmluZSBMTF9VU0FSVF9BVVRPQkFVRF9ERVRFQ1RfT05fRkFMTElOR0VER0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBVU0FSVF9DUjJfQUJSTU9ERV8wIC8qITwgRmFsbGluZyBlZGdlIHRvIGZhbGxpbmcgZWRnZSBtZWFzdXJlbWVudC4gUmVjZWl2ZWQgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lIG11c3Qgc3RhcnQgd2l0aCBhIHNpbmdsZSBiaXQgPSAxIC0+IEZyYW1lID0gICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0MTB4eHh4eHggKi8KKyNkZWZpbmUgTExfVVNBUlRfQVVUT0JBVURfREVURUNUX09OXzdGX0ZSQU1FIFwKKyAgVVNBUlRfQ1IyX0FCUk1PREVfMSAvKiE8IDB4N0YgZnJhbWUgZGV0ZWN0aW9uICovCisjZGVmaW5lIExMX1VTQVJUX0FVVE9CQVVEX0RFVEVDVF9PTl81NV9GUkFNRSBcCisgIChVU0FSVF9DUjJfQUJSTU9ERV8xIHwgVVNBUlRfQ1IyX0FCUk1PREVfMCkgLyohPCAweDU1IGZyYW1lIGRldGVjdGlvbiAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUNfQUREUkVTU19ERVRFQ1QgQWRkcmVzcyBMZW5ndGggRGV0ZWN0aW9uCisgKiBAeworICovCisjZGVmaW5lIExMX1VTQVJUX0FERFJFU1NfREVURUNUXzRCIFwKKyAgMHgwMDAwMDAwMFUgLyohPCA0LWJpdCBhZGRyZXNzIGRldGVjdGlvbiBtZXRob2Qgc2VsZWN0ZWQgKi8KKyNkZWZpbmUgTExfVVNBUlRfQUREUkVTU19ERVRFQ1RfN0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVVNBUlRfQ1IyX0FERE03IC8qITwgNy1iaXQgYWRkcmVzcyBkZXRlY3Rpb24gKGluIDgtYml0IGRhdGEgbW9kZSkgbWV0aG9kIFwKKyAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FQ19IV0NPTlRST0wgSGFyZHdhcmUgQ29udHJvbAorICogQHsKKyAqLworI2RlZmluZSBMTF9VU0FSVF9IV0NPTlRST0xfTk9ORSBcCisgIDB4MDAwMDAwMDBVIC8qITwgQ1RTIGFuZCBSVFMgaGFyZHdhcmUgZmxvdyBjb250cm9sIGRpc2FibGVkICovCisjZGVmaW5lIExMX1VTQVJUX0hXQ09OVFJPTF9SVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBVU0FSVF9DUjNfUlRTRSAvKiE8IFJUUyBvdXRwdXQgZW5hYmxlZCwgZGF0YSBpcyBvbmx5IHJlcXVlc3RlZCB3aGVuIHRoZXJlIGlzIFwKKyAgICAgICAgICAgICAgICAgICAgc3BhY2UgaW4gdGhlIHJlY2VpdmUgYnVmZmVyICovCisjZGVmaW5lIExMX1VTQVJUX0hXQ09OVFJPTF9DVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBVU0FSVF9DUjNfQ1RTRSAvKiE8IENUUyBtb2RlIGVuYWJsZWQsIGRhdGEgaXMgb25seSB0cmFuc21pdHRlZCB3aGVuIHRoZSBuQ1RTIFwKKyAgICAgICAgICAgICAgICAgICAgaW5wdXQgaXMgYXNzZXJ0ZWQgKHRpZWQgdG8gMCkgKi8KKyNkZWZpbmUgTExfVVNBUlRfSFdDT05UUk9MX1JUU19DVFMgXAorICAoVVNBUlRfQ1IzX1JUU0UgfCAgICAgICAgICAgICAgICBcCisgICBVU0FSVF9DUjNfQ1RTRSkgLyohPCBDVFMgYW5kIFJUUyBoYXJkd2FyZSBmbG93IGNvbnRyb2wgZW5hYmxlZCAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUNfV0FLRVVQX09OIFdha2V1cCBBY3RpdmF0aW9uCisgKiBAeworICovCisjZGVmaW5lIExMX1VTQVJUX1dBS0VVUF9PTl9BRERSRVNTIFwKKyAgMHgwMDAwMDAwMFUgLyohPCBXYWtlIHVwIGFjdGl2ZSBvbiBhZGRyZXNzIG1hdGNoICovCisjZGVmaW5lIExMX1VTQVJUX1dBS0VVUF9PTl9TVEFSVEJJVCBcCisgIFVTQVJUX0NSM19XVVNfMSAvKiE8IFdha2UgdXAgYWN0aXZlIG9uIFN0YXJ0IGJpdCBkZXRlY3Rpb24gKi8KKyNkZWZpbmUgTExfVVNBUlRfV0FLRVVQX09OX1JYTkUgXAorICAoVVNBUlRfQ1IzX1dVU18wIHwgVVNBUlRfQ1IzX1dVU18xKSAvKiE8IFdha2UgdXAgYWN0aXZlIG9uIFJYTkUgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX0lSREFfUE9XRVIgSXJEQSBQb3dlcgorICogQHsKKyAqLworI2RlZmluZSBMTF9VU0FSVF9JUkRBX1BPV0VSX05PUk1BTCAweDAwMDAwMDAwVSAvKiE8IElyREEgbm9ybWFsIHBvd2VyIG1vZGUgKi8KKyNkZWZpbmUgTExfVVNBUlRfSVJEQV9QT1dFUl9MT1cgVVNBUlRfQ1IzX0lSTFAgLyohPCBJckRBIGxvdyBwb3dlciBtb2RlICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FQ19MSU5CUkVBS19ERVRFQ1QgTElOIEJyZWFrIERldGVjdGlvbiBMZW5ndGgKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfVVNBUlRfTElOQlJFQUtfREVURUNUXzEwQiBcCisgIDB4MDAwMDAwMDBVIC8qITwgMTAtYml0IGJyZWFrIGRldGVjdGlvbiBtZXRob2Qgc2VsZWN0ZWQgKi8KKyNkZWZpbmUgTExfVVNBUlRfTElOQlJFQUtfREVURUNUXzExQiBcCisgIFVTQVJUX0NSMl9MQkRMIC8qITwgMTEtYml0IGJyZWFrIGRldGVjdGlvbiBtZXRob2Qgc2VsZWN0ZWQgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX0RFX1BPTEFSSVRZIERyaXZlciBFbmFibGUgUG9sYXJpdHkKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfVVNBUlRfREVfUE9MQVJJVFlfSElHSCAweDAwMDAwMDAwVSAgLyohPCBERSBzaWduYWwgaXMgYWN0aXZlIGhpZ2ggKi8KKyNkZWZpbmUgTExfVVNBUlRfREVfUE9MQVJJVFlfTE9XIFVTQVJUX0NSM19ERVAgLyohPCBERSBzaWduYWwgaXMgYWN0aXZlIGxvdyAqLworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUNfRE1BX1JFR19EQVRBIERNQSBSZWdpc3RlciBEYXRhCisgKiBAeworICovCisjZGVmaW5lIExMX1VTQVJUX0RNQV9SRUdfREFUQV9UUkFOU01JVCBcCisgIDB4MDAwMDAwMDBVIC8qITwgR2V0IGFkZHJlc3Mgb2YgZGF0YSByZWdpc3RlciB1c2VkIGZvciB0cmFuc21pc3Npb24gKi8KKyNkZWZpbmUgTExfVVNBUlRfRE1BX1JFR19EQVRBX1JFQ0VJVkUgXAorICAweDAwMDAwMDAxVSAvKiE8IEdldCBhZGRyZXNzIG9mIGRhdGEgcmVnaXN0ZXIgdXNlZCBmb3IgcmVjZXB0aW9uICovCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0V4cG9ydGVkX01hY3JvcyBVU0FSVCBFeHBvcnRlZCBNYWNyb3MKKyAqIEB7CisgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FTV9XUklURV9SRUFEIENvbW1vbiBXcml0ZSBhbmQgcmVhZCByZWdpc3RlcnMgTWFjcm9zCisgKiBAeworICovCisKKy8qKgorICogQGJyaWVmICBXcml0ZSBhIHZhbHVlIGluIFVTQVJUIHJlZ2lzdGVyCisgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBVU0FSVCBJbnN0YW5jZQorICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHdyaXR0ZW4KKyAqIEBwYXJhbSAgX19WQUxVRV9fIFZhbHVlIHRvIGJlIHdyaXR0ZW4gaW4gdGhlIHJlZ2lzdGVyCisgKiBAcmV0dmFsIE5vbmUKKyAqLworI2RlZmluZSBMTF9VU0FSVF9Xcml0ZVJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18sIF9fVkFMVUVfXykgXAorICBXUklURV9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fLCAoX19WQUxVRV9fKSkKKworLyoqCisgKiBAYnJpZWYgIFJlYWQgYSB2YWx1ZSBpbiBVU0FSVCByZWdpc3RlcgorICogQHBhcmFtICBfX0lOU1RBTkNFX18gVVNBUlQgSW5zdGFuY2UKKyAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSByZWFkCisgKiBAcmV0dmFsIFJlZ2lzdGVyIHZhbHVlCisgKi8KKyNkZWZpbmUgTExfVVNBUlRfUmVhZFJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18pIFJFQURfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXykKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VNX0V4cG9ydGVkX01hY3Jvc19IZWxwZXIgRXhwb3J0ZWRfTWFjcm9zX0hlbHBlcgorICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiAgQ29tcHV0ZSBVU0FSVERJViB2YWx1ZSBhY2NvcmRpbmcgdG8gUGVyaXBoZXJhbCBDbG9jayBhbmQKKyAqICAgICAgICAgZXhwZWN0ZWQgQmF1ZCBSYXRlIGluIDggYml0cyBzYW1wbGluZyBtb2RlICgzMiBiaXRzIHZhbHVlIG9mIFVTQVJURElWCisgKiBpcyByZXR1cm5lZCkKKyAqIEBwYXJhbSAgX19QRVJJUEhDTEtfXyBQZXJpcGhlcmFsIENsb2NrIGZyZXF1ZW5jeSB1c2VkIGZvciBVU0FSVCBpbnN0YW5jZQorICogQHBhcmFtICBfX1BSRVNDQUxFUl9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMQorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVY0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWNgorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYxMAorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjEyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMTYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYzMgorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjY0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMTI4CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMjU2CisgKiBAcGFyYW0gIF9fQkFVRFJBVEVfXyBCYXVkIHJhdGUgdmFsdWUgdG8gYWNoaWV2ZQorICogQHJldHZhbCBVU0FSVERJViB2YWx1ZSB0byBiZSB1c2VkIGZvciBCUlIgcmVnaXN0ZXIgZmlsbGluZyBpbiBPdmVyU2FtcGxpbmdfOAorICogY2FzZQorICovCisjZGVmaW5lIF9fTExfVVNBUlRfRElWX1NBTVBMSU5HOChfX1BFUklQSENMS19fLCBfX1BSRVNDQUxFUl9fLCBfX0JBVURSQVRFX18pIFwKKyAgKCgoKChfX1BFUklQSENMS19fKSAvIChVU0FSVF9QUkVTQ0FMRVJfVEFCWyhfX1BSRVNDQUxFUl9fKV0pKSAqIDJVKSArICAgICAgXAorICAgICgoX19CQVVEUkFURV9fKSAvIDJVKSkgLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoX19CQVVEUkFURV9fKSkKKworLyoqCisgKiBAYnJpZWYgIENvbXB1dGUgVVNBUlRESVYgdmFsdWUgYWNjb3JkaW5nIHRvIFBlcmlwaGVyYWwgQ2xvY2sgYW5kCisgKiAgICAgICAgIGV4cGVjdGVkIEJhdWQgUmF0ZSBpbiAxNiBiaXRzIHNhbXBsaW5nIG1vZGUgKDMyIGJpdHMgdmFsdWUgb2YKKyAqIFVTQVJURElWIGlzIHJldHVybmVkKQorICogQHBhcmFtICBfX1BFUklQSENMS19fIFBlcmlwaGVyYWwgQ2xvY2sgZnJlcXVlbmN5IHVzZWQgZm9yIFVTQVJUIGluc3RhbmNlCisgKiBAcGFyYW0gIF9fUFJFU0NBTEVSX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMgorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVY2CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWOAorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjEwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMTIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYxNgorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjMyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWNjQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYxMjgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYyNTYKKyAqIEBwYXJhbSAgX19CQVVEUkFURV9fIEJhdWQgcmF0ZSB2YWx1ZSB0byBhY2hpZXZlCisgKiBAcmV0dmFsIFVTQVJURElWIHZhbHVlIHRvIGJlIHVzZWQgZm9yIEJSUiByZWdpc3RlciBmaWxsaW5nIGluIE92ZXJTYW1wbGluZ18xNgorICogY2FzZQorICovCisjZGVmaW5lIF9fTExfVVNBUlRfRElWX1NBTVBMSU5HMTYoX19QRVJJUEhDTEtfXywgX19QUkVTQ0FMRVJfXywgX19CQVVEUkFURV9fKSBcCisgICgoKChfX1BFUklQSENMS19fKSAvIChVU0FSVF9QUkVTQ0FMRVJfVEFCWyhfX1BSRVNDQUxFUl9fKV0pKSArICAgICAgICAgICAgICBcCisgICAgKChfX0JBVURSQVRFX18pIC8gMlUpKSAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoX19CQVVEUkFURV9fKSkKKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucyBVU0FSVCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAqIEB7CisgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FRl9Db25maWd1cmF0aW9uIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgKiBAeworICovCisKKy8qKgorICogQGJyaWVmICBVU0FSVCBFbmFibGUKKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIFVFICAgICAgICAgICAgTExfVVNBUlRfRW5hYmxlCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgU0VUX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1VFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFVTQVJUIERpc2FibGUgKGFsbCBVU0FSVCBwcmVzY2FsZXJzIGFuZCBvdXRwdXRzIGFyZSBkaXNhYmxlZCkKKyAqIEBub3RlICAgV2hlbiBVU0FSVCBpcyBkaXNhYmxlZCwgVVNBUlQgcHJlc2NhbGVycyBhbmQgb3V0cHV0cyBhcmUgc3RvcHBlZAorICogaW1tZWRpYXRlbHksIGFuZCBjdXJyZW50IG9wZXJhdGlvbnMgYXJlIGRpc2NhcmRlZC4gVGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlCisgKiBVU0FSVCBpcyBrZXB0LCBidXQgYWxsIHRoZSBzdGF0dXMgZmxhZ3MsIGluIHRoZSBVU0FSVHhfSVNSIGFyZSBzZXQgdG8gdGhlaXIKKyAqIGRlZmF1bHQgdmFsdWVzLgorICogQHJtdG9sbCBDUjEgICAgICAgICAgVUUgICAgICAgICAgICBMTF9VU0FSVF9EaXNhYmxlCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1VFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEluZGljYXRlIGlmIFVTQVJUIGlzIGVuYWJsZWQKKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIFVFICAgICAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWQoY29uc3QgVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfVUUpID09IChVU0FSVF9DUjFfVUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBGSUZPIE1vZGUgRW5hYmxlCisgKiBAbm90ZSAgIE1hY3JvIElTX1VBUlRfRklGT19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3IKKyAqIG5vdCBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIEZJRk9FTiAgICAgICAgTExfVVNBUlRfRW5hYmxlRklGTworICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVGSUZPKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICBTRVRfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfRklGT0VOKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEZJRk8gTW9kZSBEaXNhYmxlCisgKiBAbm90ZSAgIE1hY3JvIElTX1VBUlRfRklGT19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3IKKyAqIG5vdCBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIEZJRk9FTiAgICAgICAgTExfVVNBUlRfRGlzYWJsZUZJRk8KKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZUZJRk8oVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX0ZJRk9FTik7Cit9CisKKy8qKgorICogQGJyaWVmICBJbmRpY2F0ZSBpZiBGSUZPIE1vZGUgaXMgZW5hYmxlZAorICogQG5vdGUgICBNYWNybyBJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yCisgKiBub3QgRklGTyBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgKiBAcm10b2xsIENSMSAgICAgICAgICBGSUZPRU4gICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZEZJRk8KKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZEZJRk8oY29uc3QgVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfRklGT0VOKSA9PSAoVVNBUlRfQ1IxX0ZJRk9FTikpCisgICAgICAgICAgICAgID8gMVVMCisgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENvbmZpZ3VyZSBUWCBGSUZPIFRocmVzaG9sZAorICogQG5vdGUgICBNYWNybyBJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yCisgKiBub3QgRklGTyBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgKiBAcm10b2xsIENSMyAgICAgICAgICBUWEZUQ0ZHICAgICAgIExMX1VTQVJUX1NldFRYRklGT1RocmVzaG9sZAorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEBwYXJhbSAgVGhyZXNob2xkIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9GSUZPVEhSRVNIT0xEXzFfOAorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRklGT1RIUkVTSE9MRF8xXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0ZJRk9USFJFU0hPTERfMV8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9GSUZPVEhSRVNIT0xEXzNfNAorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRklGT1RIUkVTSE9MRF83XzgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0ZJRk9USFJFU0hPTERfOF84CisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0VFhGSUZPVGhyZXNob2xkKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaHJlc2hvbGQpIHsKKyAgQVRPTUlDX01PRElGWV9SRUcoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19UWEZUQ0ZHLAorICAgICAgICAgICAgICAgICAgICBUaHJlc2hvbGQgPDwgVVNBUlRfQ1IzX1RYRlRDRkdfUG9zKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFJldHVybiBUWCBGSUZPIFRocmVzaG9sZCBDb25maWd1cmF0aW9uCisgKiBAbm90ZSAgIE1hY3JvIElTX1VBUlRfRklGT19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3IKKyAqIG5vdCBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAqIEBybXRvbGwgQ1IzICAgICAgICAgIFRYRlRDRkcgICAgICAgTExfVVNBUlRfR2V0VFhGSUZPVGhyZXNob2xkCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRklGT1RIUkVTSE9MRF8xXzgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0ZJRk9USFJFU0hPTERfMV80CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9GSUZPVEhSRVNIT0xEXzFfMgorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRklGT1RIUkVTSE9MRF8zXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0ZJRk9USFJFU0hPTERfN184CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9GSUZPVEhSRVNIT0xEXzhfOAorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX1VTQVJUX0dldFRYRklGT1RocmVzaG9sZChjb25zdCBVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19UWEZUQ0ZHKSA+PgorICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjNfVFhGVENGR19Qb3MpOworfQorCisvKioKKyAqIEBicmllZiAgQ29uZmlndXJlIFJYIEZJRk8gVGhyZXNob2xkCisgKiBAbm90ZSAgIE1hY3JvIElTX1VBUlRfRklGT19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3IKKyAqIG5vdCBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAqIEBybXRvbGwgQ1IzICAgICAgICAgIFJYRlRDRkcgICAgICAgTExfVVNBUlRfU2V0UlhGSUZPVGhyZXNob2xkCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHBhcmFtICBUaHJlc2hvbGQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0ZJRk9USFJFU0hPTERfMV84CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9GSUZPVEhSRVNIT0xEXzFfNAorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRklGT1RIUkVTSE9MRF8xXzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0ZJRk9USFJFU0hPTERfM180CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9GSUZPVEhSRVNIT0xEXzdfOAorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRklGT1RIUkVTSE9MRF84XzgKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRSWEZJRk9UaHJlc2hvbGQoVVNBUlRfVHlwZURlZiAqVVNBUlR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRocmVzaG9sZCkgeworICBBVE9NSUNfTU9ESUZZX1JFRyhVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX1JYRlRDRkcsCisgICAgICAgICAgICAgICAgICAgIFRocmVzaG9sZCA8PCBVU0FSVF9DUjNfUlhGVENGR19Qb3MpOworfQorCisvKioKKyAqIEBicmllZiAgUmV0dXJuIFJYIEZJRk8gVGhyZXNob2xkIENvbmZpZ3VyYXRpb24KKyAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9GSUZPX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvcgorICogbm90IEZJRk8gbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICogQHJtdG9sbCBDUjMgICAgICAgICAgUlhGVENGRyAgICAgICBMTF9VU0FSVF9HZXRSWEZJRk9UaHJlc2hvbGQKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9GSUZPVEhSRVNIT0xEXzFfOAorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRklGT1RIUkVTSE9MRF8xXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0ZJRk9USFJFU0hPTERfMV8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9GSUZPVEhSRVNIT0xEXzNfNAorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRklGT1RIUkVTSE9MRF83XzgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0ZJRk9USFJFU0hPTERfOF84CisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfVVNBUlRfR2V0UlhGSUZPVGhyZXNob2xkKGNvbnN0IFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX1JYRlRDRkcpID4+CisgICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSM19SWEZUQ0ZHX1Bvcyk7Cit9CisKKy8qKgorICogQGJyaWVmICBDb25maWd1cmUgVFggYW5kIFJYIEZJRk9zIFRocmVzaG9sZAorICogQG5vdGUgICBNYWNybyBJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yCisgKiBub3QgRklGTyBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgKiBAcm10b2xsIENSMyAgICAgICAgICBUWEZUQ0ZHICAgICAgIExMX1VTQVJUX0NvbmZpZ0ZJRk9zVGhyZXNob2xkXG4KKyAqICAgICAgICAgQ1IzICAgICAgICAgIFJYRlRDRkcgICAgICAgTExfVVNBUlRfQ29uZmlnRklGT3NUaHJlc2hvbGQKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcGFyYW0gIFRYVGhyZXNob2xkIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9GSUZPVEhSRVNIT0xEXzFfOAorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRklGT1RIUkVTSE9MRF8xXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0ZJRk9USFJFU0hPTERfMV8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9GSUZPVEhSRVNIT0xEXzNfNAorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRklGT1RIUkVTSE9MRF83XzgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0ZJRk9USFJFU0hPTERfOF84CisgKiBAcGFyYW0gIFJYVGhyZXNob2xkIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9GSUZPVEhSRVNIT0xEXzFfOAorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRklGT1RIUkVTSE9MRF8xXzQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0ZJRk9USFJFU0hPTERfMV8yCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9GSUZPVEhSRVNIT0xEXzNfNAorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRklGT1RIUkVTSE9MRF83XzgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0ZJRk9USFJFU0hPTERfOF84CisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfQ29uZmlnRklGT3NUaHJlc2hvbGQoVVNBUlRfVHlwZURlZiAqVVNBUlR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVFhUaHJlc2hvbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBSWFRocmVzaG9sZCkgeworICBBVE9NSUNfTU9ESUZZX1JFRyhVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX1RYRlRDRkcgfCBVU0FSVF9DUjNfUlhGVENGRywKKyAgICAgICAgICAgICAgICAgICAgKFRYVGhyZXNob2xkIDw8IFVTQVJUX0NSM19UWEZUQ0ZHX1BvcykgfAorICAgICAgICAgICAgICAgICAgICAgICAgKFJYVGhyZXNob2xkIDw8IFVTQVJUX0NSM19SWEZUQ0ZHX1BvcykpOworfQorCisvKioKKyAqIEBicmllZiAgVVNBUlQgZW5hYmxlZCBpbiBTVE9QIE1vZGUuCisgKiBAbm90ZSAgIFdoZW4gdGhpcyBmdW5jdGlvbiBpcyBlbmFibGVkLCBVU0FSVCBpcyBhYmxlIHRvIHdha2UgdXAgdGhlIE1DVSBmcm9tCisgKiBTdG9wIG1vZGUsIHByb3ZpZGVkIHRoYXQgVVNBUlQgY2xvY2sgc2VsZWN0aW9uIGlzIEhTSSBvciBMU0UgaW4gUkNDLgorICogQG5vdGUgICBNYWNybyBJU19VQVJUX1dBS0VVUF9GUk9NU1RPUF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgKiB3aGV0aGVyIG9yIG5vdCBXYWtlLXVwIGZyb20gU3RvcCBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHgKKyAqIGluc3RhbmNlLgorICogQHJtdG9sbCBDUjEgICAgICAgICAgVUVTTSAgICAgICAgICBMTF9VU0FSVF9FbmFibGVJblN0b3BNb2RlCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZUluU3RvcE1vZGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIEFUT01JQ19TRVRfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfVUVTTSk7Cit9CisKKy8qKgorICogQGJyaWVmICBVU0FSVCBkaXNhYmxlZCBpbiBTVE9QIE1vZGUuCisgKiBAbm90ZSAgIFdoZW4gdGhpcyBmdW5jdGlvbiBpcyBkaXNhYmxlZCwgVVNBUlQgaXMgbm90IGFibGUgdG8gd2FrZSB1cCB0aGUgTUNVCisgKiBmcm9tIFN0b3AgbW9kZQorICogQG5vdGUgICBNYWNybyBJU19VQVJUX1dBS0VVUF9GUk9NU1RPUF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgKiB3aGV0aGVyIG9yIG5vdCBXYWtlLXVwIGZyb20gU3RvcCBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHgKKyAqIGluc3RhbmNlLgorICogQHJtdG9sbCBDUjEgICAgICAgICAgVUVTTSAgICAgICAgICBMTF9VU0FSVF9EaXNhYmxlSW5TdG9wTW9kZQorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlSW5TdG9wTW9kZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgQVRPTUlDX0NMRUFSX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1VFU00pOworfQorCisvKioKKyAqIEBicmllZiAgSW5kaWNhdGUgaWYgVVNBUlQgaXMgZW5hYmxlZCBpbiBTVE9QIE1vZGUgKGFibGUgdG8gd2FrZSB1cCBNQ1UgZnJvbQorICogU3RvcCBtb2RlIG9yIG5vdCkKKyAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9XQUtFVVBfRlJPTVNUT1BfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICogd2hldGhlciBvciBub3QgV2FrZS11cCBmcm9tIFN0b3AgbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4CisgKiBpbnN0YW5jZS4KKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIFVFU00gICAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkSW5TdG9wTW9kZQorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX1VTQVJUX0lzRW5hYmxlZEluU3RvcE1vZGUoY29uc3QgVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfVUVTTSkgPT0gKFVTQVJUX0NSMV9VRVNNKSkgPyAxVUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBSZWNlaXZlciBFbmFibGUgKFJlY2VpdmVyIGlzIGVuYWJsZWQgYW5kIGJlZ2lucyBzZWFyY2hpbmcgZm9yIGEgc3RhcnQKKyAqIGJpdCkKKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIFJFICAgICAgICAgICAgTExfVVNBUlRfRW5hYmxlRGlyZWN0aW9uUngKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlRGlyZWN0aW9uUngoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIEFUT01JQ19TRVRfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUkUpOworfQorCisvKioKKyAqIEBicmllZiAgUmVjZWl2ZXIgRGlzYWJsZQorICogQHJtdG9sbCBDUjEgICAgICAgICAgUkUgICAgICAgICAgICBMTF9VU0FSVF9EaXNhYmxlRGlyZWN0aW9uUngKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZURpcmVjdGlvblJ4KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICBBVE9NSUNfQ0xFQVJfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUkUpOworfQorCisvKioKKyAqIEBicmllZiAgVHJhbnNtaXR0ZXIgRW5hYmxlCisgKiBAcm10b2xsIENSMSAgICAgICAgICBURSAgICAgICAgICAgIExMX1VTQVJUX0VuYWJsZURpcmVjdGlvblR4CisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZURpcmVjdGlvblR4KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICBBVE9NSUNfU0VUX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1RFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFRyYW5zbWl0dGVyIERpc2FibGUKKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIFRFICAgICAgICAgICAgTExfVVNBUlRfRGlzYWJsZURpcmVjdGlvblR4CisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVEaXJlY3Rpb25UeChVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgQVRPTUlDX0NMRUFSX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1RFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENvbmZpZ3VyZSBzaW11bHRhbmVvdXNseSBlbmFibGVkL2Rpc2FibGVkIHN0YXRlcworICogICAgICAgICBvZiBUcmFuc21pdHRlciBhbmQgUmVjZWl2ZXIKKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIFJFICAgICAgICAgICAgTExfVVNBUlRfU2V0VHJhbnNmZXJEaXJlY3Rpb25cbgorICogICAgICAgICBDUjEgICAgICAgICAgVEUgICAgICAgICAgICBMTF9VU0FSVF9TZXRUcmFuc2ZlckRpcmVjdGlvbgorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEBwYXJhbSAgVHJhbnNmZXJEaXJlY3Rpb24gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0RJUkVDVElPTl9OT05FCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9ESVJFQ1RJT05fUlgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0RJUkVDVElPTl9UWAorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRElSRUNUSU9OX1RYX1JYCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0VHJhbnNmZXJEaXJlY3Rpb24oVVNBUlRfVHlwZURlZiAqVVNBUlR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVHJhbnNmZXJEaXJlY3Rpb24pIHsKKyAgQVRPTUlDX01PRElGWV9SRUcoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9SRSB8IFVTQVJUX0NSMV9URSwKKyAgICAgICAgICAgICAgICAgICAgVHJhbnNmZXJEaXJlY3Rpb24pOworfQorCisvKioKKyAqIEBicmllZiAgUmV0dXJuIGVuYWJsZWQvZGlzYWJsZWQgc3RhdGVzIG9mIFRyYW5zbWl0dGVyIGFuZCBSZWNlaXZlcgorICogQHJtdG9sbCBDUjEgICAgICAgICAgUkUgICAgICAgICAgICBMTF9VU0FSVF9HZXRUcmFuc2ZlckRpcmVjdGlvblxuCisgKiAgICAgICAgIENSMSAgICAgICAgICBURSAgICAgICAgICAgIExMX1VTQVJUX0dldFRyYW5zZmVyRGlyZWN0aW9uCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRElSRUNUSU9OX05PTkUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0RJUkVDVElPTl9SWAorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRElSRUNUSU9OX1RYCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9ESVJFQ1RJT05fVFhfUlgKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9VU0FSVF9HZXRUcmFuc2ZlckRpcmVjdGlvbihjb25zdCBVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9SRSB8IFVTQVJUX0NSMV9URSkpOworfQorCisvKioKKyAqIEBicmllZiAgQ29uZmlndXJlIFBhcml0eSAoZW5hYmxlZC9kaXNhYmxlZCBhbmQgcGFyaXR5IG1vZGUgaWYgZW5hYmxlZCkuCisgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gc2VsZWN0cyBpZiBoYXJkd2FyZSBwYXJpdHkgY29udHJvbCAoZ2VuZXJhdGlvbiBhbmQKKyAqIGRldGVjdGlvbikgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4gV2hlbiB0aGUgcGFyaXR5IGNvbnRyb2wgaXMgZW5hYmxlZCAoT2RkIG9yCisgKiBFdmVuKSwgY29tcHV0ZWQgcGFyaXR5IGJpdCBpcyBpbnNlcnRlZCBhdCB0aGUgTVNCIHBvc2l0aW9uICg5dGggb3IgOHRoIGJpdAorICogZGVwZW5kaW5nIG9uIGRhdGEgd2lkdGgpIGFuZCBwYXJpdHkgaXMgY2hlY2tlZCBvbiB0aGUgcmVjZWl2ZWQgZGF0YS4KKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIFBTICAgICAgICAgICAgTExfVVNBUlRfU2V0UGFyaXR5XG4KKyAqICAgICAgICAgQ1IxICAgICAgICAgIFBDRSAgICAgICAgICAgTExfVVNBUlRfU2V0UGFyaXR5CisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHBhcmFtICBQYXJpdHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BBUklUWV9OT05FCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QQVJJVFlfRVZFTgorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUEFSSVRZX09ERAorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldFBhcml0eShVU0FSVF9UeXBlRGVmICpVU0FSVHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUGFyaXR5KSB7CisgIE1PRElGWV9SRUcoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9QUyB8IFVTQVJUX0NSMV9QQ0UsIFBhcml0eSk7Cit9CisKKy8qKgorICogQGJyaWVmICBSZXR1cm4gUGFyaXR5IGNvbmZpZ3VyYXRpb24gKGVuYWJsZWQvZGlzYWJsZWQgYW5kIHBhcml0eSBtb2RlIGlmCisgKiBlbmFibGVkKQorICogQHJtdG9sbCBDUjEgICAgICAgICAgUFMgICAgICAgICAgICBMTF9VU0FSVF9HZXRQYXJpdHlcbgorICogICAgICAgICBDUjEgICAgICAgICAgUENFICAgICAgICAgICBMTF9VU0FSVF9HZXRQYXJpdHkKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QQVJJVFlfTk9ORQorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUEFSSVRZX0VWRU4KKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BBUklUWV9PREQKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldFBhcml0eShjb25zdCBVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9QUyB8IFVTQVJUX0NSMV9QQ0UpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFNldCBSZWNlaXZlciBXYWtlIFVwIG1ldGhvZCBmcm9tIE11dGUgbW9kZS4KKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIFdBS0UgICAgICAgICAgTExfVVNBUlRfU2V0V2FrZVVwTWV0aG9kCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHBhcmFtICBNZXRob2QgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1dBS0VVUF9JRExFTElORQorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfV0FLRVVQX0FERFJFU1NNQVJLCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0V2FrZVVwTWV0aG9kKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBNZXRob2QpIHsKKyAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1dBS0UsIE1ldGhvZCk7Cit9CisKKy8qKgorICogQGJyaWVmICBSZXR1cm4gUmVjZWl2ZXIgV2FrZSBVcCBtZXRob2QgZnJvbSBNdXRlIG1vZGUKKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIFdBS0UgICAgICAgICAgTExfVVNBUlRfR2V0V2FrZVVwTWV0aG9kCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfV0FLRVVQX0lETEVMSU5FCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9XQUtFVVBfQUREUkVTU01BUksKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldFdha2VVcE1ldGhvZChjb25zdCBVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9XQUtFKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBTZXQgV29yZCBsZW5ndGggKGkuZS4gbmIgb2YgZGF0YSBiaXRzLCBleGNsdWRpbmcgc3RhcnQgYW5kIHN0b3AgYml0cykKKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIE0wICAgICAgICAgICAgTExfVVNBUlRfU2V0RGF0YVdpZHRoXG4KKyAqICAgICAgICAgQ1IxICAgICAgICAgIE0xICAgICAgICAgICAgTExfVVNBUlRfU2V0RGF0YVdpZHRoCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHBhcmFtICBEYXRhV2lkdGggVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0RBVEFXSURUSF83QgorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfREFUQVdJRFRIXzhCCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9EQVRBV0lEVEhfOUIKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXREYXRhV2lkdGgoVVNBUlRfVHlwZURlZiAqVVNBUlR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IERhdGFXaWR0aCkgeworICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfTSwgRGF0YVdpZHRoKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFJldHVybiBXb3JkIGxlbmd0aCAoaS5lLiBuYiBvZiBkYXRhIGJpdHMsIGV4Y2x1ZGluZyBzdGFydCBhbmQgc3RvcAorICogYml0cykKKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIE0wICAgICAgICAgICAgTExfVVNBUlRfR2V0RGF0YVdpZHRoXG4KKyAqICAgICAgICAgQ1IxICAgICAgICAgIE0xICAgICAgICAgICAgTExfVVNBUlRfR2V0RGF0YVdpZHRoCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfREFUQVdJRFRIXzdCCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9EQVRBV0lEVEhfOEIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0RBVEFXSURUSF85QgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0RGF0YVdpZHRoKGNvbnN0IFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX00pKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEFsbG93IHN3aXRjaCBiZXR3ZWVuIE11dGUgTW9kZSBhbmQgQWN0aXZlIG1vZGUKKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIE1NRSAgICAgICAgICAgTExfVVNBUlRfRW5hYmxlTXV0ZU1vZGUKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlTXV0ZU1vZGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIEFUT01JQ19TRVRfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfTU1FKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFByZXZlbnQgTXV0ZSBNb2RlIHVzZS4gU2V0IFJlY2VpdmVyIGluIGFjdGl2ZSBtb2RlIHBlcm1hbmVudGx5LgorICogQHJtdG9sbCBDUjEgICAgICAgICAgTU1FICAgICAgICAgICBMTF9VU0FSVF9EaXNhYmxlTXV0ZU1vZGUKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZU11dGVNb2RlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICBBVE9NSUNfQ0xFQVJfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfTU1FKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEluZGljYXRlIGlmIHN3aXRjaCBiZXR3ZWVuIE11dGUgTW9kZSBhbmQgQWN0aXZlIG1vZGUgaXMgYWxsb3dlZAorICogQHJtdG9sbCBDUjEgICAgICAgICAgTU1FICAgICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRNdXRlTW9kZQorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX1VTQVJUX0lzRW5hYmxlZE11dGVNb2RlKGNvbnN0IFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX01NRSkgPT0gKFVTQVJUX0NSMV9NTUUpKSA/IDFVTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBTZXQgT3ZlcnNhbXBsaW5nIHRvIDgtYml0IG9yIDE2LWJpdCBtb2RlCisgKiBAcm10b2xsIENSMSAgICAgICAgICBPVkVSOCAgICAgICAgIExMX1VTQVJUX1NldE92ZXJTYW1wbGluZworICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEBwYXJhbSAgT3ZlclNhbXBsaW5nIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9PVkVSU0FNUExJTkdfMTYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX09WRVJTQU1QTElOR184CisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0T3ZlclNhbXBsaW5nKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBPdmVyU2FtcGxpbmcpIHsKKyAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX09WRVI4LCBPdmVyU2FtcGxpbmcpOworfQorCisvKioKKyAqIEBicmllZiAgUmV0dXJuIE92ZXJzYW1wbGluZyBtb2RlCisgKiBAcm10b2xsIENSMSAgICAgICAgICBPVkVSOCAgICAgICAgIExMX1VTQVJUX0dldE92ZXJTYW1wbGluZworICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX09WRVJTQU1QTElOR18xNgorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfT1ZFUlNBTVBMSU5HXzgKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldE92ZXJTYW1wbGluZyhjb25zdCBVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9PVkVSOCkpOworfQorCisvKioKKyAqIEBicmllZiAgQ29uZmlndXJlIGlmIENsb2NrIHB1bHNlIG9mIHRoZSBsYXN0IGRhdGEgYml0IGlzIG91dHB1dCB0byB0aGUgU0NMSworICogcGluIG9yIG5vdAorICogQG5vdGUgICBNYWNybyBJU19VU0FSVF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgKiAgICAgICAgIFN5bmNocm9ub3VzIG1vZGUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgKiBAcm10b2xsIENSMiAgICAgICAgICBMQkNMICAgICAgICAgIExMX1VTQVJUX1NldExhc3RDbGtQdWxzZU91dHB1dAorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEBwYXJhbSAgTGFzdEJpdENsb2NrUHVsc2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0xBU1RDTEtQVUxTRV9OT19PVVRQVVQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0xBU1RDTEtQVUxTRV9PVVRQVVQKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRMYXN0Q2xrUHVsc2VPdXRwdXQoCisgICAgVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBMYXN0Qml0Q2xvY2tQdWxzZSkgeworICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfTEJDTCwgTGFzdEJpdENsb2NrUHVsc2UpOworfQorCisvKioKKyAqIEBicmllZiAgUmV0cmlldmUgQ2xvY2sgcHVsc2Ugb2YgdGhlIGxhc3QgZGF0YSBiaXQgb3V0cHV0IGNvbmZpZ3VyYXRpb24KKyAqICAgICAgICAgKExhc3QgYml0IENsb2NrIHB1bHNlIG91dHB1dCB0byB0aGUgU0NMSyBwaW4gb3Igbm90KQorICogQG5vdGUgICBNYWNybyBJU19VU0FSVF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgKiAgICAgICAgIFN5bmNocm9ub3VzIG1vZGUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgKiBAcm10b2xsIENSMiAgICAgICAgICBMQkNMICAgICAgICAgIExMX1VTQVJUX0dldExhc3RDbGtQdWxzZU91dHB1dAorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0xBU1RDTEtQVUxTRV9OT19PVVRQVVQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0xBU1RDTEtQVUxTRV9PVVRQVVQKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9VU0FSVF9HZXRMYXN0Q2xrUHVsc2VPdXRwdXQoY29uc3QgVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfTEJDTCkpOworfQorCisvKioKKyAqIEBicmllZiAgU2VsZWN0IHRoZSBwaGFzZSBvZiB0aGUgY2xvY2sgb3V0cHV0IG9uIHRoZSBTQ0xLIHBpbiBpbiBzeW5jaHJvbm91cworICogbW9kZQorICogQG5vdGUgICBNYWNybyBJU19VU0FSVF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgKiAgICAgICAgIFN5bmNocm9ub3VzIG1vZGUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgKiBAcm10b2xsIENSMiAgICAgICAgICBDUEhBICAgICAgICAgIExMX1VTQVJUX1NldENsb2NrUGhhc2UKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcGFyYW0gIENsb2NrUGhhc2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BIQVNFXzFFREdFCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QSEFTRV8yRURHRQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldENsb2NrUGhhc2UoVVNBUlRfVHlwZURlZiAqVVNBUlR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDbG9ja1BoYXNlKSB7CisgIE1PRElGWV9SRUcoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9DUEhBLCBDbG9ja1BoYXNlKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFJldHVybiBwaGFzZSBvZiB0aGUgY2xvY2sgb3V0cHV0IG9uIHRoZSBTQ0xLIHBpbiBpbiBzeW5jaHJvbm91cyBtb2RlCisgKiBAbm90ZSAgIE1hY3JvIElTX1VTQVJUX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAqICAgICAgICAgU3luY2hyb25vdXMgbW9kZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAqIEBybXRvbGwgQ1IyICAgICAgICAgIENQSEEgICAgICAgICAgTExfVVNBUlRfR2V0Q2xvY2tQaGFzZQorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BIQVNFXzFFREdFCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QSEFTRV8yRURHRQorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0Q2xvY2tQaGFzZShjb25zdCBVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9DUEhBKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBTZWxlY3QgdGhlIHBvbGFyaXR5IG9mIHRoZSBjbG9jayBvdXRwdXQgb24gdGhlIFNDTEsgcGluIGluCisgKiBzeW5jaHJvbm91cyBtb2RlCisgKiBAbm90ZSAgIE1hY3JvIElTX1VTQVJUX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAqICAgICAgICAgU3luY2hyb25vdXMgbW9kZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAqIEBybXRvbGwgQ1IyICAgICAgICAgIENQT0wgICAgICAgICAgTExfVVNBUlRfU2V0Q2xvY2tQb2xhcml0eQorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEBwYXJhbSAgQ2xvY2tQb2xhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUE9MQVJJVFlfTE9XCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QT0xBUklUWV9ISUdICisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0Q2xvY2tQb2xhcml0eShVU0FSVF9UeXBlRGVmICpVU0FSVHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENsb2NrUG9sYXJpdHkpIHsKKyAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0NQT0wsIENsb2NrUG9sYXJpdHkpOworfQorCisvKioKKyAqIEBicmllZiAgUmV0dXJuIHBvbGFyaXR5IG9mIHRoZSBjbG9jayBvdXRwdXQgb24gdGhlIFNDTEsgcGluIGluIHN5bmNocm9ub3VzCisgKiBtb2RlCisgKiBAbm90ZSAgIE1hY3JvIElTX1VTQVJUX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAqICAgICAgICAgU3luY2hyb25vdXMgbW9kZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAqIEBybXRvbGwgQ1IyICAgICAgICAgIENQT0wgICAgICAgICAgTExfVVNBUlRfR2V0Q2xvY2tQb2xhcml0eQorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BPTEFSSVRZX0xPVworICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUE9MQVJJVFlfSElHSAorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX1VTQVJUX0dldENsb2NrUG9sYXJpdHkoY29uc3QgVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfQ1BPTCkpOworfQorCisvKioKKyAqIEBicmllZiAgQ29uZmlndXJlIENsb2NrIHNpZ25hbCBmb3JtYXQgKFBoYXNlIFBvbGFyaXR5IGFuZCBjaG9pY2UgYWJvdXQgb3V0cHV0CisgKiBvZiBsYXN0IGJpdCBjbG9jayBwdWxzZSkKKyAqIEBub3RlICAgTWFjcm8gSVNfVVNBUlRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICogICAgICAgICBTeW5jaHJvbm91cyBtb2RlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICogQG5vdGUgICBDYWxsIG9mIHRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byBmb2xsb3dpbmcgZnVuY3Rpb24gY2FsbAorICogc2VxdWVuY2UgOgorICogICAgICAgICAtIENsb2NrIFBoYXNlIGNvbmZpZ3VyYXRpb24gdXNpbmcgQHJlZiBMTF9VU0FSVF9TZXRDbG9ja1BoYXNlKCkKKyAqIGZ1bmN0aW9uCisgKiAgICAgICAgIC0gQ2xvY2sgUG9sYXJpdHkgY29uZmlndXJhdGlvbiB1c2luZyBAcmVmIExMX1VTQVJUX1NldENsb2NrUG9sYXJpdHkoKQorICogZnVuY3Rpb24KKyAqICAgICAgICAgLSBPdXRwdXQgb2YgTGFzdCBiaXQgQ2xvY2sgcHVsc2UgY29uZmlndXJhdGlvbiB1c2luZyBAcmVmCisgKiBMTF9VU0FSVF9TZXRMYXN0Q2xrUHVsc2VPdXRwdXQoKSBmdW5jdGlvbgorICogQHJtdG9sbCBDUjIgICAgICAgICAgQ1BIQSAgICAgICAgICBMTF9VU0FSVF9Db25maWdDbG9ja1xuCisgKiAgICAgICAgIENSMiAgICAgICAgICBDUE9MICAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0Nsb2NrXG4KKyAqICAgICAgICAgQ1IyICAgICAgICAgIExCQ0wgICAgICAgICAgTExfVVNBUlRfQ29uZmlnQ2xvY2sKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcGFyYW0gIFBoYXNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QSEFTRV8xRURHRQorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUEhBU0VfMkVER0UKKyAqIEBwYXJhbSAgUG9sYXJpdHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BPTEFSSVRZX0xPVworICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUE9MQVJJVFlfSElHSAorICogQHBhcmFtICBMQkNQT3V0cHV0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9MQVNUQ0xLUFVMU0VfTk9fT1VUUFVUCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9MQVNUQ0xLUFVMU0VfT1VUUFVUCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfQ29uZmlnQ2xvY2soVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBQaGFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFBvbGFyaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgTEJDUE91dHB1dCkgeworICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfQ1BIQSB8IFVTQVJUX0NSMl9DUE9MIHwgVVNBUlRfQ1IyX0xCQ0wsCisgICAgICAgICAgICAgUGhhc2UgfCBQb2xhcml0eSB8IExCQ1BPdXRwdXQpOworfQorCisvKioKKyAqIEBicmllZiAgQ29uZmlndXJlIENsb2NrIHNvdXJjZSBwcmVzY2FsZXIgZm9yIGJhdWRyYXRlIGdlbmVyYXRvciBhbmQKKyAqIG92ZXJzYW1wbGluZworICogQG5vdGUgICBNYWNybyBJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yCisgKiBub3QgRklGTyBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgKiBAcm10b2xsIFBSRVNDICAgICAgICBQUkVTQ0FMRVIgICAgIExMX1VTQVJUX1NldFByZXNjYWxlcgorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEBwYXJhbSAgUHJlc2NhbGVyVmFsdWUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMgorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVY2CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWOAorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjEwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMTIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYxNgorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjMyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWNjQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYxMjgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYyNTYKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRQcmVzY2FsZXIoVVNBUlRfVHlwZURlZiAqVVNBUlR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFByZXNjYWxlclZhbHVlKSB7CisgIE1PRElGWV9SRUcoVVNBUlR4LT5QUkVTQywgVVNBUlRfUFJFU0NfUFJFU0NBTEVSLCAodWludDE2X3QpUHJlc2NhbGVyVmFsdWUpOworfQorCisvKioKKyAqIEBicmllZiAgUmV0cmlldmUgdGhlIENsb2NrIHNvdXJjZSBwcmVzY2FsZXIgZm9yIGJhdWRyYXRlIGdlbmVyYXRvciBhbmQKKyAqIG92ZXJzYW1wbGluZworICogQG5vdGUgICBNYWNybyBJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yCisgKiBub3QgRklGTyBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgKiBAcm10b2xsIFBSRVNDICAgICAgICBQUkVTQ0FMRVIgICAgIExMX1VTQVJUX0dldFByZXNjYWxlcgorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYxCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMgorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVY2CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWOAorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjEwCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMTIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYxNgorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjMyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWNjQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYxMjgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYyNTYKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldFByZXNjYWxlcihjb25zdCBVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5QUkVTQywgVVNBUlRfUFJFU0NfUFJFU0NBTEVSKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgQ2xvY2sgb3V0cHV0IG9uIFNDTEsgcGluCisgKiBAbm90ZSAgIE1hY3JvIElTX1VTQVJUX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAqICAgICAgICAgU3luY2hyb25vdXMgbW9kZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAqIEBybXRvbGwgQ1IyICAgICAgICAgIENMS0VOICAgICAgICAgTExfVVNBUlRfRW5hYmxlU0NMS091dHB1dAorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVTQ0xLT3V0cHV0KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICBTRVRfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfQ0xLRU4pOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBDbG9jayBvdXRwdXQgb24gU0NMSyBwaW4KKyAqIEBub3RlICAgTWFjcm8gSVNfVVNBUlRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICogICAgICAgICBTeW5jaHJvbm91cyBtb2RlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICogQHJtdG9sbCBDUjIgICAgICAgICAgQ0xLRU4gICAgICAgICBMTF9VU0FSVF9EaXNhYmxlU0NMS091dHB1dAorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlU0NMS091dHB1dChVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfQ0xLRU4pOworfQorCisvKioKKyAqIEBicmllZiAgSW5kaWNhdGUgaWYgQ2xvY2sgb3V0cHV0IG9uIFNDTEsgcGluIGlzIGVuYWJsZWQKKyAqIEBub3RlICAgTWFjcm8gSVNfVVNBUlRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICogICAgICAgICBTeW5jaHJvbm91cyBtb2RlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICogQHJtdG9sbCBDUjIgICAgICAgICAgQ0xLRU4gICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRTQ0xLT3V0cHV0CisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfVVNBUlRfSXNFbmFibGVkU0NMS091dHB1dChjb25zdCBVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9DTEtFTikgPT0gKFVTQVJUX0NSMl9DTEtFTikpID8gMVVMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBTZXQgdGhlIGxlbmd0aCBvZiB0aGUgc3RvcCBiaXRzCisgKiBAcm10b2xsIENSMiAgICAgICAgICBTVE9QICAgICAgICAgIExMX1VTQVJUX1NldFN0b3BCaXRzTGVuZ3RoCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHBhcmFtICBTdG9wQml0cyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfU1RPUEJJVFNfMF81CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9TVE9QQklUU18xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9TVE9QQklUU18xXzUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1NUT1BCSVRTXzIKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRTdG9wQml0c0xlbmd0aChVU0FSVF9UeXBlRGVmICpVU0FSVHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBTdG9wQml0cykgeworICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfU1RPUCwgU3RvcEJpdHMpOworfQorCisvKioKKyAqIEBicmllZiAgUmV0cmlldmUgdGhlIGxlbmd0aCBvZiB0aGUgc3RvcCBiaXRzCisgKiBAcm10b2xsIENSMiAgICAgICAgICBTVE9QICAgICAgICAgIExMX1VTQVJUX0dldFN0b3BCaXRzTGVuZ3RoCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfU1RPUEJJVFNfMF81CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9TVE9QQklUU18xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9TVE9QQklUU18xXzUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1NUT1BCSVRTXzIKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9VU0FSVF9HZXRTdG9wQml0c0xlbmd0aChjb25zdCBVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9TVE9QKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBDb25maWd1cmUgQ2hhcmFjdGVyIGZyYW1lIGZvcm1hdCAoRGF0YXdpZHRoLCBQYXJpdHkgY29udHJvbCwgU3RvcAorICogQml0cykKKyAqIEBub3RlICAgQ2FsbCBvZiB0aGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gZm9sbG93aW5nIGZ1bmN0aW9uIGNhbGwKKyAqIHNlcXVlbmNlIDoKKyAqICAgICAgICAgLSBEYXRhIFdpZHRoIGNvbmZpZ3VyYXRpb24gdXNpbmcgQHJlZiBMTF9VU0FSVF9TZXREYXRhV2lkdGgoKQorICogZnVuY3Rpb24KKyAqICAgICAgICAgLSBQYXJpdHkgQ29udHJvbCBhbmQgbW9kZSBjb25maWd1cmF0aW9uIHVzaW5nIEByZWYKKyAqIExMX1VTQVJUX1NldFBhcml0eSgpIGZ1bmN0aW9uCisgKiAgICAgICAgIC0gU3RvcCBiaXRzIGNvbmZpZ3VyYXRpb24gdXNpbmcgQHJlZiBMTF9VU0FSVF9TZXRTdG9wQml0c0xlbmd0aCgpCisgKiBmdW5jdGlvbgorICogQHJtdG9sbCBDUjEgICAgICAgICAgUFMgICAgICAgICAgICBMTF9VU0FSVF9Db25maWdDaGFyYWN0ZXJcbgorICogICAgICAgICBDUjEgICAgICAgICAgUENFICAgICAgICAgICBMTF9VU0FSVF9Db25maWdDaGFyYWN0ZXJcbgorICogICAgICAgICBDUjEgICAgICAgICAgTTAgICAgICAgICAgICBMTF9VU0FSVF9Db25maWdDaGFyYWN0ZXJcbgorICogICAgICAgICBDUjEgICAgICAgICAgTTEgICAgICAgICAgICBMTF9VU0FSVF9Db25maWdDaGFyYWN0ZXJcbgorICogICAgICAgICBDUjIgICAgICAgICAgU1RPUCAgICAgICAgICBMTF9VU0FSVF9Db25maWdDaGFyYWN0ZXIKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcGFyYW0gIERhdGFXaWR0aCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfREFUQVdJRFRIXzdCCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9EQVRBV0lEVEhfOEIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0RBVEFXSURUSF85QgorICogQHBhcmFtICBQYXJpdHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BBUklUWV9OT05FCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QQVJJVFlfRVZFTgorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUEFSSVRZX09ERAorICogQHBhcmFtICBTdG9wQml0cyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfU1RPUEJJVFNfMF81CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9TVE9QQklUU18xCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9TVE9QQklUU18xXzUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1NUT1BCSVRTXzIKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9Db25maWdDaGFyYWN0ZXIoVVNBUlRfVHlwZURlZiAqVVNBUlR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IERhdGFXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQYXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgU3RvcEJpdHMpIHsKKyAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1BTIHwgVVNBUlRfQ1IxX1BDRSB8IFVTQVJUX0NSMV9NLAorICAgICAgICAgICAgIFBhcml0eSB8IERhdGFXaWR0aCk7CisgIE1PRElGWV9SRUcoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9TVE9QLCBTdG9wQml0cyk7Cit9CisKKy8qKgorICogQGJyaWVmICBDb25maWd1cmUgVFgvUlggcGlucyBzd2FwcGluZyBzZXR0aW5nLgorICogQHJtdG9sbCBDUjIgICAgICAgICAgU1dBUCAgICAgICAgICBMTF9VU0FSVF9TZXRUWFJYU3dhcAorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEBwYXJhbSAgU3dhcENvbmZpZyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfVFhSWF9TVEFOREFSRAorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfVFhSWF9TV0FQUEVECisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0VFhSWFN3YXAoVVNBUlRfVHlwZURlZiAqVVNBUlR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgU3dhcENvbmZpZykgeworICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfU1dBUCwgU3dhcENvbmZpZyk7Cit9CisKKy8qKgorICogQGJyaWVmICBSZXRyaWV2ZSBUWC9SWCBwaW5zIHN3YXBwaW5nIGNvbmZpZ3VyYXRpb24uCisgKiBAcm10b2xsIENSMiAgICAgICAgICBTV0FQICAgICAgICAgIExMX1VTQVJUX0dldFRYUlhTd2FwCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfVFhSWF9TVEFOREFSRAorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfVFhSWF9TV0FQUEVECisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXRUWFJYU3dhcChjb25zdCBVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9TV0FQKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBDb25maWd1cmUgUlggcGluIGFjdGl2ZSBsZXZlbCBsb2dpYworICogQHJtdG9sbCBDUjIgICAgICAgICAgUlhJTlYgICAgICAgICBMTF9VU0FSVF9TZXRSWFBpbkxldmVsCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHBhcmFtICBQaW5JbnZNZXRob2QgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1JYUElOX0xFVkVMX1NUQU5EQVJECisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9SWFBJTl9MRVZFTF9JTlZFUlRFRAorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldFJYUGluTGV2ZWwoVVNBUlRfVHlwZURlZiAqVVNBUlR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQaW5JbnZNZXRob2QpIHsKKyAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX1JYSU5WLCBQaW5JbnZNZXRob2QpOworfQorCisvKioKKyAqIEBicmllZiAgUmV0cmlldmUgUlggcGluIGFjdGl2ZSBsZXZlbCBsb2dpYyBjb25maWd1cmF0aW9uCisgKiBAcm10b2xsIENSMiAgICAgICAgICBSWElOViAgICAgICAgIExMX1VTQVJUX0dldFJYUGluTGV2ZWwKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9SWFBJTl9MRVZFTF9TVEFOREFSRAorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUlhQSU5fTEVWRUxfSU5WRVJURUQKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldFJYUGluTGV2ZWwoY29uc3QgVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfUlhJTlYpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENvbmZpZ3VyZSBUWCBwaW4gYWN0aXZlIGxldmVsIGxvZ2ljCisgKiBAcm10b2xsIENSMiAgICAgICAgICBUWElOViAgICAgICAgIExMX1VTQVJUX1NldFRYUGluTGV2ZWwKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcGFyYW0gIFBpbkludk1ldGhvZCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfVFhQSU5fTEVWRUxfU1RBTkRBUkQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1RYUElOX0xFVkVMX0lOVkVSVEVECisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0VFhQaW5MZXZlbChVU0FSVF9UeXBlRGVmICpVU0FSVHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFBpbkludk1ldGhvZCkgeworICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfVFhJTlYsIFBpbkludk1ldGhvZCk7Cit9CisKKy8qKgorICogQGJyaWVmICBSZXRyaWV2ZSBUWCBwaW4gYWN0aXZlIGxldmVsIGxvZ2ljIGNvbmZpZ3VyYXRpb24KKyAqIEBybXRvbGwgQ1IyICAgICAgICAgIFRYSU5WICAgICAgICAgTExfVVNBUlRfR2V0VFhQaW5MZXZlbAorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1RYUElOX0xFVkVMX1NUQU5EQVJECisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9UWFBJTl9MRVZFTF9JTlZFUlRFRAorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0VFhQaW5MZXZlbChjb25zdCBVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9UWElOVikpOworfQorCisvKioKKyAqIEBicmllZiAgQ29uZmlndXJlIEJpbmFyeSBkYXRhIGxvZ2ljLgorICogQG5vdGUgICBBbGxvdyB0byBkZWZpbmUgaG93IExvZ2ljYWwgZGF0YSBmcm9tIHRoZSBkYXRhIHJlZ2lzdGVyIGFyZQorICogc2VuZC9yZWNlaXZlZCA6IGVpdGhlciBpbiBwb3NpdGl2ZS9kaXJlY3QgbG9naWMgKDE9SCwgMD1MKSBvciBpbgorICogbmVnYXRpdmUvaW52ZXJzZSBsb2dpYyAoMT1MLCAwPUgpCisgKiBAcm10b2xsIENSMiAgICAgICAgICBEQVRBSU5WICAgICAgIExMX1VTQVJUX1NldEJpbmFyeURhdGFMb2dpYworICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEBwYXJhbSAgRGF0YUxvZ2ljIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9CSU5BUllfTE9HSUNfUE9TSVRJVkUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0JJTkFSWV9MT0dJQ19ORUdBVElWRQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldEJpbmFyeURhdGFMb2dpYyhVU0FSVF9UeXBlRGVmICpVU0FSVHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRGF0YUxvZ2ljKSB7CisgIE1PRElGWV9SRUcoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9EQVRBSU5WLCBEYXRhTG9naWMpOworfQorCisvKioKKyAqIEBicmllZiAgUmV0cmlldmUgQmluYXJ5IGRhdGEgY29uZmlndXJhdGlvbgorICogQHJtdG9sbCBDUjIgICAgICAgICAgREFUQUlOViAgICAgICBMTF9VU0FSVF9HZXRCaW5hcnlEYXRhTG9naWMKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9CSU5BUllfTE9HSUNfUE9TSVRJVkUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0JJTkFSWV9MT0dJQ19ORUdBVElWRQorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX1VTQVJUX0dldEJpbmFyeURhdGFMb2dpYyhjb25zdCBVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9EQVRBSU5WKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBDb25maWd1cmUgdHJhbnNmZXIgYml0IG9yZGVyIChlaXRoZXIgTGVzcyBvciBNb3N0IFNpZ25pZmljYW50IEJpdAorICogRmlyc3QpCisgKiBAbm90ZSAgIE1TQiBGaXJzdCBtZWFucyBkYXRhIGlzIHRyYW5zbWl0dGVkL3JlY2VpdmVkIHdpdGggdGhlIE1TQiBmaXJzdCwKKyAqIGZvbGxvd2luZyB0aGUgc3RhcnQgYml0LiBMU0IgRmlyc3QgbWVhbnMgZGF0YSBpcyB0cmFuc21pdHRlZC9yZWNlaXZlZCB3aXRoCisgKiBkYXRhIGJpdCAwIGZpcnN0LCBmb2xsb3dpbmcgdGhlIHN0YXJ0IGJpdC4KKyAqIEBybXRvbGwgQ1IyICAgICAgICAgIE1TQkZJUlNUICAgICAgTExfVVNBUlRfU2V0VHJhbnNmZXJCaXRPcmRlcgorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEBwYXJhbSAgQml0T3JkZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0JJVE9SREVSX0xTQkZJUlNUCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9CSVRPUkRFUl9NU0JGSVJTVAorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldFRyYW5zZmVyQml0T3JkZXIoVVNBUlRfVHlwZURlZiAqVVNBUlR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBCaXRPcmRlcikgeworICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfTVNCRklSU1QsIEJpdE9yZGVyKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFJldHVybiB0cmFuc2ZlciBiaXQgb3JkZXIgKGVpdGhlciBMZXNzIG9yIE1vc3QgU2lnbmlmaWNhbnQgQml0IEZpcnN0KQorICogQG5vdGUgICBNU0IgRmlyc3QgbWVhbnMgZGF0YSBpcyB0cmFuc21pdHRlZC9yZWNlaXZlZCB3aXRoIHRoZSBNU0IgZmlyc3QsCisgKiBmb2xsb3dpbmcgdGhlIHN0YXJ0IGJpdC4gTFNCIEZpcnN0IG1lYW5zIGRhdGEgaXMgdHJhbnNtaXR0ZWQvcmVjZWl2ZWQgd2l0aAorICogZGF0YSBiaXQgMCBmaXJzdCwgZm9sbG93aW5nIHRoZSBzdGFydCBiaXQuCisgKiBAcm10b2xsIENSMiAgICAgICAgICBNU0JGSVJTVCAgICAgIExMX1VTQVJUX0dldFRyYW5zZmVyQml0T3JkZXIKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9CSVRPUkRFUl9MU0JGSVJTVAorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfQklUT1JERVJfTVNCRklSU1QKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9VU0FSVF9HZXRUcmFuc2ZlckJpdE9yZGVyKGNvbnN0IFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX01TQkZJUlNUKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgQXV0byBCYXVkLVJhdGUgRGV0ZWN0aW9uCisgKiBAbm90ZSAgIE1hY3JvIElTX1VTQVJUX0FVVE9CQVVEUkFURV9ERVRFQ1RJT05fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0bworICogY2hlY2sgd2hldGhlciBvciBub3QgQXV0byBCYXVkIFJhdGUgZGV0ZWN0aW9uIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZQorICogVVNBUlR4IGluc3RhbmNlLgorICogQHJtdG9sbCBDUjIgICAgICAgICAgQUJSRU4gICAgICAgICBMTF9VU0FSVF9FbmFibGVBdXRvQmF1ZFJhdGUKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlQXV0b0JhdWRSYXRlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICBTRVRfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfQUJSRU4pOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBBdXRvIEJhdWQtUmF0ZSBEZXRlY3Rpb24KKyAqIEBub3RlICAgTWFjcm8gSVNfVVNBUlRfQVVUT0JBVURSQVRFX0RFVEVDVElPTl9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvCisgKiBjaGVjayB3aGV0aGVyIG9yIG5vdCBBdXRvIEJhdWQgUmF0ZSBkZXRlY3Rpb24gZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlCisgKiBVU0FSVHggaW5zdGFuY2UuCisgKiBAcm10b2xsIENSMiAgICAgICAgICBBQlJFTiAgICAgICAgIExMX1VTQVJUX0Rpc2FibGVBdXRvQmF1ZFJhdGUKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZUF1dG9CYXVkUmF0ZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfQUJSRU4pOworfQorCisvKioKKyAqIEBicmllZiAgSW5kaWNhdGUgaWYgQXV0byBCYXVkLVJhdGUgRGV0ZWN0aW9uIG1lY2hhbmlzbSBpcyBlbmFibGVkCisgKiBAbm90ZSAgIE1hY3JvIElTX1VTQVJUX0FVVE9CQVVEUkFURV9ERVRFQ1RJT05fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0bworICogY2hlY2sgd2hldGhlciBvciBub3QgQXV0byBCYXVkIFJhdGUgZGV0ZWN0aW9uIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZQorICogVVNBUlR4IGluc3RhbmNlLgorICogQHJtdG9sbCBDUjIgICAgICAgICAgQUJSRU4gICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRBdXRvQmF1ZAorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX1VTQVJUX0lzRW5hYmxlZEF1dG9CYXVkKGNvbnN0IFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0FCUkVOKSA9PSAoVVNBUlRfQ1IyX0FCUkVOKSkgPyAxVUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFNldCBBdXRvIEJhdWQtUmF0ZSBtb2RlIGJpdHMKKyAqIEBub3RlICAgTWFjcm8gSVNfVVNBUlRfQVVUT0JBVURSQVRFX0RFVEVDVElPTl9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvCisgKiBjaGVjayB3aGV0aGVyIG9yIG5vdCBBdXRvIEJhdWQgUmF0ZSBkZXRlY3Rpb24gZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlCisgKiBVU0FSVHggaW5zdGFuY2UuCisgKiBAcm10b2xsIENSMiAgICAgICAgICBBQlJNT0RFICAgICAgIExMX1VTQVJUX1NldEF1dG9CYXVkUmF0ZU1vZGUKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcGFyYW0gIEF1dG9CYXVkUmF0ZU1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0FVVE9CQVVEX0RFVEVDVF9PTl9TVEFSVEJJVAorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfQVVUT0JBVURfREVURUNUX09OX0ZBTExJTkdFREdFCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9BVVRPQkFVRF9ERVRFQ1RfT05fN0ZfRlJBTUUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0FVVE9CQVVEX0RFVEVDVF9PTl81NV9GUkFNRQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldEF1dG9CYXVkUmF0ZU1vZGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBBdXRvQmF1ZFJhdGVNb2RlKSB7CisgIE1PRElGWV9SRUcoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9BQlJNT0RFLCBBdXRvQmF1ZFJhdGVNb2RlKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFJldHVybiBBdXRvIEJhdWQtUmF0ZSBtb2RlCisgKiBAbm90ZSAgIE1hY3JvIElTX1VTQVJUX0FVVE9CQVVEUkFURV9ERVRFQ1RJT05fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0bworICogY2hlY2sgd2hldGhlciBvciBub3QgQXV0byBCYXVkIFJhdGUgZGV0ZWN0aW9uIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZQorICogVVNBUlR4IGluc3RhbmNlLgorICogQHJtdG9sbCBDUjIgICAgICAgICAgQUJSTU9ERSAgICAgICBMTF9VU0FSVF9HZXRBdXRvQmF1ZFJhdGVNb2RlCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfQVVUT0JBVURfREVURUNUX09OX1NUQVJUQklUCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9BVVRPQkFVRF9ERVRFQ1RfT05fRkFMTElOR0VER0UKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0FVVE9CQVVEX0RFVEVDVF9PTl83Rl9GUkFNRQorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfQVVUT0JBVURfREVURUNUX09OXzU1X0ZSQU1FCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfVVNBUlRfR2V0QXV0b0JhdWRSYXRlTW9kZShjb25zdCBVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9BQlJNT0RFKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgUmVjZWl2ZXIgVGltZW91dAorICogQHJtdG9sbCBDUjIgICAgICAgICAgUlRPRU4gICAgICAgICBMTF9VU0FSVF9FbmFibGVSeFRpbWVvdXQKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlUnhUaW1lb3V0KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICBTRVRfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfUlRPRU4pOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBSZWNlaXZlciBUaW1lb3V0CisgKiBAcm10b2xsIENSMiAgICAgICAgICBSVE9FTiAgICAgICAgIExMX1VTQVJUX0Rpc2FibGVSeFRpbWVvdXQKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZVJ4VGltZW91dChVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfUlRPRU4pOworfQorCisvKioKKyAqIEBicmllZiAgSW5kaWNhdGUgaWYgUmVjZWl2ZXIgVGltZW91dCBmZWF0dXJlIGlzIGVuYWJsZWQKKyAqIEBybXRvbGwgQ1IyICAgICAgICAgIFJUT0VOICAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkUnhUaW1lb3V0CisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfVVNBUlRfSXNFbmFibGVkUnhUaW1lb3V0KGNvbnN0IFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX1JUT0VOKSA9PSAoVVNBUlRfQ1IyX1JUT0VOKSkgPyAxVUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFNldCBBZGRyZXNzIG9mIHRoZSBVU0FSVCBub2RlLgorICogQG5vdGUgICBUaGlzIGlzIHVzZWQgaW4gbXVsdGlwcm9jZXNzb3IgY29tbXVuaWNhdGlvbiBkdXJpbmcgTXV0ZSBtb2RlIG9yIFN0b3AKKyAqIG1vZGUsIGZvciB3YWtlIHVwIHdpdGggYWRkcmVzcyBtYXJrIGRldGVjdGlvbi4KKyAqIEBub3RlICAgNGJpdHMgYWRkcmVzcyBub2RlIGlzIHVzZWQgd2hlbiA0LWJpdCBBZGRyZXNzIERldGVjdGlvbiBpcyBzZWxlY3RlZAorICogaW4gQURETTcuIChiNy1iNCBzaG91bGQgYmUgc2V0IHRvIDApIDhiaXRzIGFkZHJlc3Mgbm9kZSBpcyB1c2VkIHdoZW4gNy1iaXQKKyAqIEFkZHJlc3MgRGV0ZWN0aW9uIGlzIHNlbGVjdGVkIGluIEFERE03LiAoVGhpcyBpcyB1c2VkIGluIG11bHRpcHJvY2Vzc29yCisgKiBjb21tdW5pY2F0aW9uIGR1cmluZyBNdXRlIG1vZGUgb3IgU3RvcCBtb2RlLCBmb3Igd2FrZSB1cCB3aXRoIDctYml0IGFkZHJlc3MKKyAqIG1hcmsgZGV0ZWN0aW9uLiBUaGUgTVNCIG9mIHRoZSBjaGFyYWN0ZXIgc2VudCBieSB0aGUgdHJhbnNtaXR0ZXIgc2hvdWxkIGJlCisgKiBlcXVhbCB0byAxLiBJdCBtYXkgYWxzbyBiZSB1c2VkIGZvciBjaGFyYWN0ZXIgZGV0ZWN0aW9uIGR1cmluZyBub3JtYWwKKyAqIHJlY2VwdGlvbiwgTXV0ZSBtb2RlIGluYWN0aXZlIChmb3IgZXhhbXBsZSwgZW5kIG9mIGJsb2NrIGRldGVjdGlvbiBpbiBNb2RCdXMKKyAqIHByb3RvY29sKS4gSW4gdGhpcyBjYXNlLCB0aGUgd2hvbGUgcmVjZWl2ZWQgY2hhcmFjdGVyICg4LWJpdCkgaXMgY29tcGFyZWQgdG8KKyAqIHRoZSBBRERbNzowXSB2YWx1ZSBhbmQgQ01GIGZsYWcgaXMgc2V0IG9uIG1hdGNoKQorICogQHJtdG9sbCBDUjIgICAgICAgICAgQUREICAgICAgICAgICBMTF9VU0FSVF9Db25maWdOb2RlQWRkcmVzc1xuCisgKiAgICAgICAgIENSMiAgICAgICAgICBBRERNNyAgICAgICAgIExMX1VTQVJUX0NvbmZpZ05vZGVBZGRyZXNzCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHBhcmFtICBBZGRyZXNzTGVuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9BRERSRVNTX0RFVEVDVF80QgorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfQUREUkVTU19ERVRFQ1RfN0IKKyAqIEBwYXJhbSAgTm9kZUFkZHJlc3MgNCBvciA3IGJpdCBBZGRyZXNzIG9mIHRoZSBVU0FSVCBub2RlLgorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0NvbmZpZ05vZGVBZGRyZXNzKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEFkZHJlc3NMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBOb2RlQWRkcmVzcykgeworICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfQUREIHwgVVNBUlRfQ1IyX0FERE03LAorICAgICAgICAgICAgICh1aW50MzJfdCkoQWRkcmVzc0xlbiB8IChOb2RlQWRkcmVzcyA8PCBVU0FSVF9DUjJfQUREX1BvcykpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFJldHVybiA4IGJpdCBBZGRyZXNzIG9mIHRoZSBVU0FSVCBub2RlIGFzIHNldCBpbiBBREQgZmllbGQgb2YgQ1IyLgorICogQG5vdGUgICBJZiA0LWJpdCBBZGRyZXNzIERldGVjdGlvbiBpcyBzZWxlY3RlZCBpbiBBRERNNywKKyAqICAgICAgICAgb25seSA0Yml0cyAoYjMtYjApIG9mIHJldHVybmVkIHZhbHVlIGFyZSByZWxldmFudCAoYjMxLWI0IGFyZSBub3QKKyAqIHJlbGV2YW50KSBJZiA3LWJpdCBBZGRyZXNzIERldGVjdGlvbiBpcyBzZWxlY3RlZCBpbiBBRERNNywgb25seSA4Yml0cyAoYjctYjApCisgKiBvZiByZXR1cm5lZCB2YWx1ZSBhcmUgcmVsZXZhbnQgKGIzMS1iOCBhcmUgbm90IHJlbGV2YW50KQorICogQHJtdG9sbCBDUjIgICAgICAgICAgQUREICAgICAgICAgICBMTF9VU0FSVF9HZXROb2RlQWRkcmVzcworICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgQWRkcmVzcyBvZiB0aGUgVVNBUlQgbm9kZSAoVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0yNTUpCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXROb2RlQWRkcmVzcyhjb25zdCBVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9BREQpID4+IFVTQVJUX0NSMl9BRERfUG9zKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFJldHVybiBMZW5ndGggb2YgTm9kZSBBZGRyZXNzIHVzZWQgaW4gQWRkcmVzcyBEZXRlY3Rpb24gbW9kZSAoNy1iaXQKKyAqIG9yIDQtYml0KQorICogQHJtdG9sbCBDUjIgICAgICAgICAgQURETTcgICAgICAgICBMTF9VU0FSVF9HZXROb2RlQWRkcmVzc0xlbgorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0FERFJFU1NfREVURUNUXzRCCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9BRERSRVNTX0RFVEVDVF83QgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX1VTQVJUX0dldE5vZGVBZGRyZXNzTGVuKGNvbnN0IFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0FERE03KSk7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgUlRTIEhXIEZsb3cgQ29udHJvbAorICogQG5vdGUgICBNYWNybyBJU19VQVJUX0hXRkxPV19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3IKKyAqIG5vdCBIYXJkd2FyZSBGbG93IGNvbnRyb2wgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAqIEBybXRvbGwgQ1IzICAgICAgICAgIFJUU0UgICAgICAgICAgTExfVVNBUlRfRW5hYmxlUlRTSFdGbG93Q3RybAorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVSVFNIV0Zsb3dDdHJsKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICBTRVRfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfUlRTRSk7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIFJUUyBIVyBGbG93IENvbnRyb2wKKyAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9IV0ZMT1dfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yCisgKiBub3QgSGFyZHdhcmUgRmxvdyBjb250cm9sIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgKiBAcm10b2xsIENSMyAgICAgICAgICBSVFNFICAgICAgICAgIExMX1VTQVJUX0Rpc2FibGVSVFNIV0Zsb3dDdHJsCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVSVFNIV0Zsb3dDdHJsKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19SVFNFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBDVFMgSFcgRmxvdyBDb250cm9sCisgKiBAbm90ZSAgIE1hY3JvIElTX1VBUlRfSFdGTE9XX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvcgorICogbm90IEhhcmR3YXJlIEZsb3cgY29udHJvbCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICogQHJtdG9sbCBDUjMgICAgICAgICAgQ1RTRSAgICAgICAgICBMTF9VU0FSVF9FbmFibGVDVFNIV0Zsb3dDdHJsCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZUNUU0hXRmxvd0N0cmwoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19DVFNFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgQ1RTIEhXIEZsb3cgQ29udHJvbAorICogQG5vdGUgICBNYWNybyBJU19VQVJUX0hXRkxPV19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3IKKyAqIG5vdCBIYXJkd2FyZSBGbG93IGNvbnRyb2wgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAqIEBybXRvbGwgQ1IzICAgICAgICAgIENUU0UgICAgICAgICAgTExfVVNBUlRfRGlzYWJsZUNUU0hXRmxvd0N0cmwKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZUNUU0hXRmxvd0N0cmwoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX0NUU0UpOworfQorCisvKioKKyAqIEBicmllZiAgQ29uZmlndXJlIEhXIEZsb3cgQ29udHJvbCBtb2RlIChib3RoIENUUyBhbmQgUlRTKQorICogQG5vdGUgICBNYWNybyBJU19VQVJUX0hXRkxPV19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3IKKyAqIG5vdCBIYXJkd2FyZSBGbG93IGNvbnRyb2wgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAqIEBybXRvbGwgQ1IzICAgICAgICAgIFJUU0UgICAgICAgICAgTExfVVNBUlRfU2V0SFdGbG93Q3RybFxuCisgKiAgICAgICAgIENSMyAgICAgICAgICBDVFNFICAgICAgICAgIExMX1VTQVJUX1NldEhXRmxvd0N0cmwKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcGFyYW0gIEhhcmR3YXJlRmxvd0NvbnRyb2wgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nCisgKiB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9IV0NPTlRST0xfTk9ORQorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfSFdDT05UUk9MX1JUUworICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfSFdDT05UUk9MX0NUUworICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfSFdDT05UUk9MX1JUU19DVFMKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRIV0Zsb3dDdHJsKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgSGFyZHdhcmVGbG93Q29udHJvbCkgeworICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfUlRTRSB8IFVTQVJUX0NSM19DVFNFLCBIYXJkd2FyZUZsb3dDb250cm9sKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFJldHVybiBIVyBGbG93IENvbnRyb2wgY29uZmlndXJhdGlvbiAoYm90aCBDVFMgYW5kIFJUUykKKyAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9IV0ZMT1dfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yCisgKiBub3QgSGFyZHdhcmUgRmxvdyBjb250cm9sIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgKiBAcm10b2xsIENSMyAgICAgICAgICBSVFNFICAgICAgICAgIExMX1VTQVJUX0dldEhXRmxvd0N0cmxcbgorICogICAgICAgICBDUjMgICAgICAgICAgQ1RTRSAgICAgICAgICBMTF9VU0FSVF9HZXRIV0Zsb3dDdHJsCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfSFdDT05UUk9MX05PTkUKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0hXQ09OVFJPTF9SVFMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0hXQ09OVFJPTF9DVFMKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0hXQ09OVFJPTF9SVFNfQ1RTCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXRIV0Zsb3dDdHJsKGNvbnN0IFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX1JUU0UgfCBVU0FSVF9DUjNfQ1RTRSkpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIE9uZSBiaXQgc2FtcGxpbmcgbWV0aG9kCisgKiBAcm10b2xsIENSMyAgICAgICAgICBPTkVCSVQgICAgICAgIExMX1VTQVJUX0VuYWJsZU9uZUJpdFNhbXAKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlT25lQml0U2FtcChVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgU0VUX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX09ORUJJVCk7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIE9uZSBiaXQgc2FtcGxpbmcgbWV0aG9kCisgKiBAcm10b2xsIENSMyAgICAgICAgICBPTkVCSVQgICAgICAgIExMX1VTQVJUX0Rpc2FibGVPbmVCaXRTYW1wCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVPbmVCaXRTYW1wKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19PTkVCSVQpOworfQorCisvKioKKyAqIEBicmllZiAgSW5kaWNhdGUgaWYgT25lIGJpdCBzYW1wbGluZyBtZXRob2QgaXMgZW5hYmxlZAorICogQHJtdG9sbCBDUjMgICAgICAgICAgT05FQklUICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRPbmVCaXRTYW1wCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfVVNBUlRfSXNFbmFibGVkT25lQml0U2FtcChjb25zdCBVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19PTkVCSVQpID09IChVU0FSVF9DUjNfT05FQklUKSkKKyAgICAgICAgICAgICAgPyAxVUwKKyAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIE92ZXJydW4gZGV0ZWN0aW9uCisgKiBAcm10b2xsIENSMyAgICAgICAgICBPVlJESVMgICAgICAgIExMX1VTQVJUX0VuYWJsZU92ZXJydW5EZXRlY3QKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlT3ZlcnJ1bkRldGVjdChVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfT1ZSRElTKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgT3ZlcnJ1biBkZXRlY3Rpb24KKyAqIEBybXRvbGwgQ1IzICAgICAgICAgIE9WUkRJUyAgICAgICAgTExfVVNBUlRfRGlzYWJsZU92ZXJydW5EZXRlY3QKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZU92ZXJydW5EZXRlY3QoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19PVlJESVMpOworfQorCisvKioKKyAqIEBicmllZiAgSW5kaWNhdGUgaWYgT3ZlcnJ1biBkZXRlY3Rpb24gaXMgZW5hYmxlZAorICogQHJtdG9sbCBDUjMgICAgICAgICAgT1ZSRElTICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRPdmVycnVuRGV0ZWN0CisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfVVNBUlRfSXNFbmFibGVkT3ZlcnJ1bkRldGVjdChjb25zdCBVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19PVlJESVMpICE9IFVTQVJUX0NSM19PVlJESVMpID8gMVVMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBTZWxlY3QgZXZlbnQgdHlwZSBmb3IgV2FrZSBVUCBJbnRlcnJ1cHQgRmxhZyAoV1VTWzE6MF0gYml0cykKKyAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9XQUtFVVBfRlJPTVNUT1BfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICogd2hldGhlciBvciBub3QgV2FrZS11cCBmcm9tIFN0b3AgbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4CisgKiBpbnN0YW5jZS4KKyAqIEBybXRvbGwgQ1IzICAgICAgICAgIFdVUyAgICAgICAgICAgTExfVVNBUlRfU2V0V0tVUFR5cGUKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcGFyYW0gIFR5cGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1dBS0VVUF9PTl9BRERSRVNTCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9XQUtFVVBfT05fU1RBUlRCSVQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1dBS0VVUF9PTl9SWE5FCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0V0tVUFR5cGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVHlwZSkgeworICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfV1VTLCBUeXBlKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFJldHVybiBldmVudCB0eXBlIGZvciBXYWtlIFVQIEludGVycnVwdCBGbGFnIChXVVNbMTowXSBiaXRzKQorICogQG5vdGUgICBNYWNybyBJU19VQVJUX1dBS0VVUF9GUk9NU1RPUF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgKiB3aGV0aGVyIG9yIG5vdCBXYWtlLXVwIGZyb20gU3RvcCBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHgKKyAqIGluc3RhbmNlLgorICogQHJtdG9sbCBDUjMgICAgICAgICAgV1VTICAgICAgICAgICBMTF9VU0FSVF9HZXRXS1VQVHlwZQorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1dBS0VVUF9PTl9BRERSRVNTCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9XQUtFVVBfT05fU1RBUlRCSVQKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1dBS0VVUF9PTl9SWE5FCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXRXS1VQVHlwZShjb25zdCBVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19XVVMpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENvbmZpZ3VyZSBVU0FSVCBCUlIgcmVnaXN0ZXIgZm9yIGFjaGlldmluZyBleHBlY3RlZCBCYXVkIFJhdGUgdmFsdWUuCisgKiBAbm90ZSAgIENvbXB1dGUgYW5kIHNldCBVU0FSVERJViB2YWx1ZSBpbiBCUlIgUmVnaXN0ZXIgKGZ1bGwgQlJSIGNvbnRlbnQpCisgKiAgICAgICAgIGFjY29yZGluZyB0byB1c2VkIFBlcmlwaGVyYWwgQ2xvY2ssIE92ZXJzYW1wbGluZyBtb2RlLCBhbmQgZXhwZWN0ZWQKKyAqIEJhdWQgUmF0ZSB2YWx1ZXMKKyAqIEBub3RlICAgUGVyaXBoZXJhbCBjbG9jayBhbmQgQmF1ZCByYXRlIHZhbHVlcyBwcm92aWRlZCBhcyBmdW5jdGlvbiBwYXJhbWV0ZXJzCisgKiBzaG91bGQgYmUgdmFsaWQgKEJhdWQgcmF0ZSB2YWx1ZSAhPSAwKQorICogQG5vdGUgICBJbiBjYXNlIG9mIG92ZXJzYW1wbGluZyBieSAxNiBhbmQgOCwgQlJSIGNvbnRlbnQgbXVzdCBiZSBncmVhdGVyIHRoYW4KKyAqIG9yIGVxdWFsIHRvIDE2ZC4KKyAqIEBybXRvbGwgQlJSICAgICAgICAgIEJSUiAgICAgICAgICAgTExfVVNBUlRfU2V0QmF1ZFJhdGUKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcGFyYW0gIFBlcmlwaENsayBQZXJpcGhlcmFsIENsb2NrCisgKiBAcGFyYW0gIFByZXNjYWxlclZhbHVlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMQorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVY0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWNgorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYxMAorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjEyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMTYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYzMgorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjY0CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMTI4CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMjU2CisgKiBAcGFyYW0gIE92ZXJTYW1wbGluZyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfT1ZFUlNBTVBMSU5HXzE2CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9PVkVSU0FNUExJTkdfOAorICogQHBhcmFtICBCYXVkUmF0ZSBCYXVkIFJhdGUKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRCYXVkUmF0ZShVU0FSVF9UeXBlRGVmICpVU0FSVHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQZXJpcGhDbGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQcmVzY2FsZXJWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE92ZXJTYW1wbGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEJhdWRSYXRlKSB7CisgIHVpbnQzMl90IHVzYXJ0ZGl2OworICB1aW50MzJfdCBicnJ0ZW1wOworCisgIGlmIChQcmVzY2FsZXJWYWx1ZSA+IExMX1VTQVJUX1BSRVNDQUxFUl9ESVYyNTYpIHsKKyAgICAvKiBEbyBub3Qgb3ZlcnN0ZXAgdGhlIHNpemUgb2YgVVNBUlRfUFJFU0NBTEVSX1RBQiAqLworICB9IGVsc2UgaWYgKEJhdWRSYXRlID09IDBVKSB7CisgICAgLyogQ2FuIE5vdCBkaXZpZGUgcGVyIDAgKi8KKyAgfSBlbHNlIGlmIChPdmVyU2FtcGxpbmcgPT0gTExfVVNBUlRfT1ZFUlNBTVBMSU5HXzgpIHsKKyAgICB1c2FydGRpdiA9ICh1aW50MTZfdCkoX19MTF9VU0FSVF9ESVZfU0FNUExJTkc4KAorICAgICAgICBQZXJpcGhDbGssICh1aW50OF90KVByZXNjYWxlclZhbHVlLCBCYXVkUmF0ZSkpOworICAgIGJycnRlbXAgPSB1c2FydGRpdiAmIDB4RkZGMFU7CisgICAgYnJydGVtcCB8PSAodWludDE2X3QpKCh1c2FydGRpdiAmICh1aW50MTZfdCkweDAwMEZVKSA+PiAxVSk7CisgICAgVVNBUlR4LT5CUlIgPSBicnJ0ZW1wOworICB9IGVsc2UgeworICAgIFVTQVJUeC0+QlJSID0gKHVpbnQxNl90KShfX0xMX1VTQVJUX0RJVl9TQU1QTElORzE2KAorICAgICAgICBQZXJpcGhDbGssICh1aW50OF90KVByZXNjYWxlclZhbHVlLCBCYXVkUmF0ZSkpOworICB9Cit9CisKKy8qKgorICogQGJyaWVmICBSZXR1cm4gY3VycmVudCBCYXVkIFJhdGUgdmFsdWUsIGFjY29yZGluZyB0byBVU0FSVERJViBwcmVzZW50IGluIEJSUgorICogcmVnaXN0ZXIgKGZ1bGwgQlJSIGNvbnRlbnQpLCBhbmQgdG8gdXNlZCBQZXJpcGhlcmFsIENsb2NrIGFuZCBPdmVyc2FtcGxpbmcKKyAqIG1vZGUgdmFsdWVzCisgKiBAbm90ZSAgIEluIGNhc2Ugb2Ygbm9uLWluaXRpYWxpemVkIG9yIGludmFsaWQgdmFsdWUgc3RvcmVkIGluIEJSUiByZWdpc3RlciwKKyAqIHZhbHVlIDAgd2lsbCBiZSByZXR1cm5lZC4KKyAqIEBub3RlICAgSW4gY2FzZSBvZiBvdmVyc2FtcGxpbmcgYnkgMTYgYW5kIDgsIEJSUiBjb250ZW50IG11c3QgYmUgZ3JlYXRlciB0aGFuCisgKiBvciBlcXVhbCB0byAxNmQuCisgKiBAcm10b2xsIEJSUiAgICAgICAgICBCUlIgICAgICAgICAgIExMX1VTQVJUX0dldEJhdWRSYXRlCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHBhcmFtICBQZXJpcGhDbGsgUGVyaXBoZXJhbCBDbG9jaworICogQHBhcmFtICBQcmVzY2FsZXJWYWx1ZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjEKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYyCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWNAorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjYKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVY4CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMTAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYxMgorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjE2CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVY2NAorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjEyOAorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjI1NgorICogQHBhcmFtICBPdmVyU2FtcGxpbmcgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX09WRVJTQU1QTElOR18xNgorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfT1ZFUlNBTVBMSU5HXzgKKyAqIEByZXR2YWwgQmF1ZCBSYXRlCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXRCYXVkUmF0ZShjb25zdCBVU0FSVF9UeXBlRGVmICpVU0FSVHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUGVyaXBoQ2xrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFByZXNjYWxlclZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE92ZXJTYW1wbGluZykgeworICB1aW50MzJfdCB1c2FydGRpdjsKKyAgdWludDMyX3QgYnJycmVzdWx0ID0gMHgwVTsKKyAgdWludDMyX3QgcGVyaXBoY2xrcHJlc2MgPQorICAgICAgKHVpbnQzMl90KShQZXJpcGhDbGsgLyAoVVNBUlRfUFJFU0NBTEVSX1RBQlsodWludDhfdClQcmVzY2FsZXJWYWx1ZV0pKTsKKworICB1c2FydGRpdiA9IFVTQVJUeC0+QlJSOworCisgIGlmICh1c2FydGRpdiA9PSAwVSkgeworICAgIC8qIERvIG5vdCBwZXJmb3JtIGEgZGl2aXNpb24gYnkgMCAqLworICB9IGVsc2UgaWYgKE92ZXJTYW1wbGluZyA9PSBMTF9VU0FSVF9PVkVSU0FNUExJTkdfOCkgeworICAgIHVzYXJ0ZGl2ID0gKHVpbnQxNl90KSgodXNhcnRkaXYgJiAweEZGRjBVKSB8ICgodXNhcnRkaXYgJiAweDAwMDdVKSA8PCAxVSkpOworICAgIGlmICh1c2FydGRpdiAhPSAwVSkgeworICAgICAgYnJycmVzdWx0ID0gKHBlcmlwaGNsa3ByZXNjICogMlUpIC8gdXNhcnRkaXY7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmICgodXNhcnRkaXYgJiAweEZGRkZVKSAhPSAwVSkgeworICAgICAgYnJycmVzdWx0ID0gcGVyaXBoY2xrcHJlc2MgLyB1c2FydGRpdjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIChicnJyZXN1bHQpOworfQorCisvKioKKyAqIEBicmllZiAgU2V0IFJlY2VpdmVyIFRpbWUgT3V0IFZhbHVlIChleHByZXNzZWQgaW4gbmIgb2YgYml0cyBkdXJhdGlvbikKKyAqIEBybXRvbGwgUlRPUiAgICAgICAgIFJUTyAgICAgICAgICAgTExfVVNBUlRfU2V0UnhUaW1lb3V0CisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHBhcmFtICBUaW1lb3V0IFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHgwMEZGRkZGRgorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldFJ4VGltZW91dChVU0FSVF9UeXBlRGVmICpVU0FSVHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZW91dCkgeworICBNT0RJRllfUkVHKFVTQVJUeC0+UlRPUiwgVVNBUlRfUlRPUl9SVE8sIFRpbWVvdXQpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IFJlY2VpdmVyIFRpbWUgT3V0IFZhbHVlIChleHByZXNzZWQgaW4gbmIgb2YgYml0cyBkdXJhdGlvbikKKyAqIEBybXRvbGwgUlRPUiAgICAgICAgIFJUTyAgICAgICAgICAgTExfVVNBUlRfR2V0UnhUaW1lb3V0CisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4MDBGRkZGRkYKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldFJ4VGltZW91dChjb25zdCBVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5SVE9SLCBVU0FSVF9SVE9SX1JUTykpOworfQorCisvKioKKyAqIEBicmllZiAgU2V0IEJsb2NrIExlbmd0aCB2YWx1ZSBpbiByZWNlcHRpb24KKyAqIEBybXRvbGwgUlRPUiAgICAgICAgIEJMRU4gICAgICAgICAgTExfVVNBUlRfU2V0QmxvY2tMZW5ndGgKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcGFyYW0gIEJsb2NrTGVuZ3RoIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRgorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldEJsb2NrTGVuZ3RoKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEJsb2NrTGVuZ3RoKSB7CisgIE1PRElGWV9SRUcoVVNBUlR4LT5SVE9SLCBVU0FSVF9SVE9SX0JMRU4sIEJsb2NrTGVuZ3RoIDw8IFVTQVJUX1JUT1JfQkxFTl9Qb3MpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IEJsb2NrIExlbmd0aCB2YWx1ZSBpbiByZWNlcHRpb24KKyAqIEBybXRvbGwgUlRPUiAgICAgICAgIEJMRU4gICAgICAgICAgTExfVVNBUlRfR2V0QmxvY2tMZW5ndGgKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0QmxvY2tMZW5ndGgoY29uc3QgVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFVTQVJUeC0+UlRPUiwgVVNBUlRfUlRPUl9CTEVOKSA+PgorICAgICAgICAgICAgICAgICAgICBVU0FSVF9SVE9SX0JMRU5fUG9zKTsKK30KKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUZfQ29uZmlndXJhdGlvbl9JUkRBIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zIHJlbGF0ZWQgdG8KKyAqIElyZGEgZmVhdHVyZQorICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiAgRW5hYmxlIElyREEgbW9kZQorICogQG5vdGUgICBNYWNybyBJU19JUkRBX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAqICAgICAgICAgSXJEQSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICogQHJtdG9sbCBDUjMgICAgICAgICAgSVJFTiAgICAgICAgICBMTF9VU0FSVF9FbmFibGVJcmRhCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZUlyZGEoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19JUkVOKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgSXJEQSBtb2RlCisgKiBAbm90ZSAgIE1hY3JvIElTX0lSREFfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICogICAgICAgICBJckRBIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgKiBAcm10b2xsIENSMyAgICAgICAgICBJUkVOICAgICAgICAgIExMX1VTQVJUX0Rpc2FibGVJcmRhCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVJcmRhKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19JUkVOKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEluZGljYXRlIGlmIElyREEgbW9kZSBpcyBlbmFibGVkCisgKiBAbm90ZSAgIE1hY3JvIElTX0lSREFfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICogICAgICAgICBJckRBIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgKiBAcm10b2xsIENSMyAgICAgICAgICBJUkVOICAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZElyZGEKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZElyZGEoY29uc3QgVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfSVJFTikgPT0gKFVTQVJUX0NSM19JUkVOKSkgPyAxVUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDb25maWd1cmUgSXJEQSBQb3dlciBNb2RlIChOb3JtYWwgb3IgTG93IFBvd2VyKQorICogQG5vdGUgICBNYWNybyBJU19JUkRBX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAqICAgICAgICAgSXJEQSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICogQHJtdG9sbCBDUjMgICAgICAgICAgSVJMUCAgICAgICAgICBMTF9VU0FSVF9TZXRJcmRhUG93ZXJNb2RlCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHBhcmFtICBQb3dlck1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0lSREFfUE9XRVJfTk9STUFMCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9JUkRBX1BPV0VSX0xPVworICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldElyZGFQb3dlck1vZGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQb3dlck1vZGUpIHsKKyAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX0lSTFAsIFBvd2VyTW9kZSk7Cit9CisKKy8qKgorICogQGJyaWVmICBSZXRyaWV2ZSBJckRBIFBvd2VyIE1vZGUgY29uZmlndXJhdGlvbiAoTm9ybWFsIG9yIExvdyBQb3dlcikKKyAqIEBub3RlICAgTWFjcm8gSVNfSVJEQV9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgKiAgICAgICAgIElyREEgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAqIEBybXRvbGwgQ1IzICAgICAgICAgIElSTFAgICAgICAgICAgTExfVVNBUlRfR2V0SXJkYVBvd2VyTW9kZQorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0lSREFfUE9XRVJfTk9STUFMCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QSEFTRV8yRURHRQorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX1VTQVJUX0dldElyZGFQb3dlck1vZGUoY29uc3QgVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfSVJMUCkpOworfQorCisvKioKKyAqIEBicmllZiAgU2V0IElyZGEgcHJlc2NhbGVyIHZhbHVlLCB1c2VkIGZvciBkaXZpZGluZyB0aGUgVVNBUlQgY2xvY2sgc291cmNlCisgKiAgICAgICAgIHRvIGFjaGlldmUgdGhlIElyZGEgTG93IFBvd2VyIGZyZXF1ZW5jeSAoOCBiaXRzIHZhbHVlKQorICogQG5vdGUgICBNYWNybyBJU19JUkRBX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAqICAgICAgICAgSXJEQSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICogQHJtdG9sbCBHVFBSICAgICAgICAgUFNDICAgICAgICAgICBMTF9VU0FSVF9TZXRJcmRhUHJlc2NhbGVyCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHBhcmFtICBQcmVzY2FsZXJWYWx1ZSBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkYKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRJcmRhUHJlc2NhbGVyKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUHJlc2NhbGVyVmFsdWUpIHsKKyAgTU9ESUZZX1JFRyhVU0FSVHgtPkdUUFIsIFVTQVJUX0dUUFJfUFNDLCAodWludDE2X3QpUHJlc2NhbGVyVmFsdWUpOworfQorCisvKioKKyAqIEBicmllZiAgUmV0dXJuIElyZGEgcHJlc2NhbGVyIHZhbHVlLCB1c2VkIGZvciBkaXZpZGluZyB0aGUgVVNBUlQgY2xvY2sgc291cmNlCisgKiAgICAgICAgIHRvIGFjaGlldmUgdGhlIElyZGEgTG93IFBvd2VyIGZyZXF1ZW5jeSAoOCBiaXRzIHZhbHVlKQorICogQG5vdGUgICBNYWNybyBJU19JUkRBX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAqICAgICAgICAgSXJEQSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICogQHJtdG9sbCBHVFBSICAgICAgICAgUFNDICAgICAgICAgICBMTF9VU0FSVF9HZXRJcmRhUHJlc2NhbGVyCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBJcmRhIHByZXNjYWxlciB2YWx1ZSAoVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEZGKQorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX1VTQVJUX0dldElyZGFQcmVzY2FsZXIoY29uc3QgVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFVTQVJUeC0+R1RQUiwgVVNBUlRfR1RQUl9QU0MpKTsKK30KKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUZfQ29uZmlndXJhdGlvbl9TbWFydGNhcmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMKKyAqIHJlbGF0ZWQgdG8gU21hcnRjYXJkIGZlYXR1cmUKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBTbWFydGNhcmQgTkFDSyB0cmFuc21pc3Npb24KKyAqIEBub3RlICAgTWFjcm8gSVNfU01BUlRDQVJEX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvcgorICogbm90IFNtYXJ0Y2FyZCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICogQHJtdG9sbCBDUjMgICAgICAgICAgTkFDSyAgICAgICAgICBMTF9VU0FSVF9FbmFibGVTbWFydGNhcmROQUNLCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZVNtYXJ0Y2FyZE5BQ0soVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19OQUNLKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgU21hcnRjYXJkIE5BQ0sgdHJhbnNtaXNzaW9uCisgKiBAbm90ZSAgIE1hY3JvIElTX1NNQVJUQ0FSRF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3IKKyAqIG5vdCBTbWFydGNhcmQgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAqIEBybXRvbGwgQ1IzICAgICAgICAgIE5BQ0sgICAgICAgICAgTExfVVNBUlRfRGlzYWJsZVNtYXJ0Y2FyZE5BQ0sKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZVNtYXJ0Y2FyZE5BQ0soVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX05BQ0spOworfQorCisvKioKKyAqIEBicmllZiAgSW5kaWNhdGUgaWYgU21hcnRjYXJkIE5BQ0sgdHJhbnNtaXNzaW9uIGlzIGVuYWJsZWQKKyAqIEBub3RlICAgTWFjcm8gSVNfU01BUlRDQVJEX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvcgorICogbm90IFNtYXJ0Y2FyZCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICogQHJtdG9sbCBDUjMgICAgICAgICAgTkFDSyAgICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRTbWFydGNhcmROQUNLCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfVVNBUlRfSXNFbmFibGVkU21hcnRjYXJkTkFDSyhjb25zdCBVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19OQUNLKSA9PSAoVVNBUlRfQ1IzX05BQ0spKSA/IDFVTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBTbWFydGNhcmQgbW9kZQorICogQG5vdGUgICBNYWNybyBJU19TTUFSVENBUkRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yCisgKiBub3QgU21hcnRjYXJkIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgKiBAcm10b2xsIENSMyAgICAgICAgICBTQ0VOICAgICAgICAgIExMX1VTQVJUX0VuYWJsZVNtYXJ0Y2FyZAorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVTbWFydGNhcmQoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19TQ0VOKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgU21hcnRjYXJkIG1vZGUKKyAqIEBub3RlICAgTWFjcm8gSVNfU01BUlRDQVJEX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvcgorICogbm90IFNtYXJ0Y2FyZCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICogQHJtdG9sbCBDUjMgICAgICAgICAgU0NFTiAgICAgICAgICBMTF9VU0FSVF9EaXNhYmxlU21hcnRjYXJkCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVTbWFydGNhcmQoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX1NDRU4pOworfQorCisvKioKKyAqIEBicmllZiAgSW5kaWNhdGUgaWYgU21hcnRjYXJkIG1vZGUgaXMgZW5hYmxlZAorICogQG5vdGUgICBNYWNybyBJU19TTUFSVENBUkRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yCisgKiBub3QgU21hcnRjYXJkIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgKiBAcm10b2xsIENSMyAgICAgICAgICBTQ0VOICAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZFNtYXJ0Y2FyZAorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX1VTQVJUX0lzRW5hYmxlZFNtYXJ0Y2FyZChjb25zdCBVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19TQ0VOKSA9PSAoVVNBUlRfQ1IzX1NDRU4pKSA/IDFVTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFNldCBTbWFydGNhcmQgQXV0by1SZXRyeSBDb3VudCB2YWx1ZSAoU0NBUkNOVFsyOjBdIGJpdHMpCisgKiBAbm90ZSAgIE1hY3JvIElTX1NNQVJUQ0FSRF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3IKKyAqIG5vdCBTbWFydGNhcmQgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAqIEBub3RlICAgVGhpcyBiaXQtZmllbGQgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgcmV0cmllcyBpbiB0cmFuc21pdCBhbmQKKyAqIHJlY2VpdmUsIGluIFNtYXJ0Y2FyZCBtb2RlLiBJbiB0cmFuc21pc3Npb24gbW9kZSwgaXQgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YKKyAqIGF1dG9tYXRpYyByZXRyYW5zbWlzc2lvbiByZXRyaWVzLCBiZWZvcmUgZ2VuZXJhdGluZyBhIHRyYW5zbWlzc2lvbiBlcnJvciAoRkUKKyAqIGJpdCBzZXQpLiBJbiByZWNlcHRpb24gbW9kZSwgaXQgc3BlY2lmaWVzIHRoZSBudW1iZXIgb3IgZXJyb25lb3VzIHJlY2VwdGlvbgorICogdHJpYWxzLCBiZWZvcmUgZ2VuZXJhdGluZyBhIHJlY2VwdGlvbiBlcnJvciAoUlhORSBhbmQgUEUgYml0cyBzZXQpCisgKiBAcm10b2xsIENSMyAgICAgICAgICBTQ0FSQ05UICAgICAgIExMX1VTQVJUX1NldFNtYXJ0Y2FyZEF1dG9SZXRyeUNvdW50CisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHBhcmFtICBBdXRvUmV0cnlDb3VudCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTcKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRTbWFydGNhcmRBdXRvUmV0cnlDb3VudCgKKyAgICBVU0FSVF9UeXBlRGVmICpVU0FSVHgsIHVpbnQzMl90IEF1dG9SZXRyeUNvdW50KSB7CisgIE1PRElGWV9SRUcoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19TQ0FSQ05ULAorICAgICAgICAgICAgIEF1dG9SZXRyeUNvdW50IDw8IFVTQVJUX0NSM19TQ0FSQ05UX1Bvcyk7Cit9CisKKy8qKgorICogQGJyaWVmICBSZXR1cm4gU21hcnRjYXJkIEF1dG8tUmV0cnkgQ291bnQgdmFsdWUgKFNDQVJDTlRbMjowXSBiaXRzKQorICogQG5vdGUgICBNYWNybyBJU19TTUFSVENBUkRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yCisgKiBub3QgU21hcnRjYXJkIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgKiBAcm10b2xsIENSMyAgICAgICAgICBTQ0FSQ05UICAgICAgIExMX1VTQVJUX0dldFNtYXJ0Y2FyZEF1dG9SZXRyeUNvdW50CisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBTbWFydGNhcmQgQXV0by1SZXRyeSBDb3VudCB2YWx1ZSAoVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZAorICogTWF4X0RhdGE9NykKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9VU0FSVF9HZXRTbWFydGNhcmRBdXRvUmV0cnlDb3VudChjb25zdCBVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19TQ0FSQ05UKSA+PgorICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjNfU0NBUkNOVF9Qb3MpOworfQorCisvKioKKyAqIEBicmllZiAgU2V0IFNtYXJ0Y2FyZCBwcmVzY2FsZXIgdmFsdWUsIHVzZWQgZm9yIGRpdmlkaW5nIHRoZSBVU0FSVCBjbG9jaworICogICAgICAgICBzb3VyY2UgdG8gcHJvdmlkZSB0aGUgU01BUlRDQVJEIENsb2NrICg1IGJpdHMgdmFsdWUpCisgKiBAbm90ZSAgIE1hY3JvIElTX1NNQVJUQ0FSRF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3IKKyAqIG5vdCBTbWFydGNhcmQgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAqIEBybXRvbGwgR1RQUiAgICAgICAgIFBTQyAgICAgICAgICAgTExfVVNBUlRfU2V0U21hcnRjYXJkUHJlc2NhbGVyCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHBhcmFtICBQcmVzY2FsZXJWYWx1ZSBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTMxCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0U21hcnRjYXJkUHJlc2NhbGVyKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQcmVzY2FsZXJWYWx1ZSkgeworICBNT0RJRllfUkVHKFVTQVJUeC0+R1RQUiwgVVNBUlRfR1RQUl9QU0MsICh1aW50MTZfdClQcmVzY2FsZXJWYWx1ZSk7Cit9CisKKy8qKgorICogQGJyaWVmICBSZXR1cm4gU21hcnRjYXJkIHByZXNjYWxlciB2YWx1ZSwgdXNlZCBmb3IgZGl2aWRpbmcgdGhlIFVTQVJUIGNsb2NrCisgKiAgICAgICAgIHNvdXJjZSB0byBwcm92aWRlIHRoZSBTTUFSVENBUkQgQ2xvY2sgKDUgYml0cyB2YWx1ZSkKKyAqIEBub3RlICAgTWFjcm8gSVNfU01BUlRDQVJEX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvcgorICogbm90IFNtYXJ0Y2FyZCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICogQHJtdG9sbCBHVFBSICAgICAgICAgUFNDICAgICAgICAgICBMTF9VU0FSVF9HZXRTbWFydGNhcmRQcmVzY2FsZXIKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIFNtYXJ0Y2FyZCBwcmVzY2FsZXIgdmFsdWUgKFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MzEpCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfVVNBUlRfR2V0U21hcnRjYXJkUHJlc2NhbGVyKGNvbnN0IFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChVU0FSVHgtPkdUUFIsIFVTQVJUX0dUUFJfUFNDKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBTZXQgU21hcnRjYXJkIEd1YXJkIHRpbWUgdmFsdWUsIGV4cHJlc3NlZCBpbiBuYiBvZiBiYXVkIGNsb2NrcworICogcGVyaW9kcyAoR1RbNzowXSBiaXRzIDogR3VhcmQgdGltZSB2YWx1ZSkKKyAqIEBub3RlICAgTWFjcm8gSVNfU01BUlRDQVJEX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvcgorICogbm90IFNtYXJ0Y2FyZCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICogQHJtdG9sbCBHVFBSICAgICAgICAgR1QgICAgICAgICAgICBMTF9VU0FSVF9TZXRTbWFydGNhcmRHdWFyZFRpbWUKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcGFyYW0gIEd1YXJkVGltZSBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkYKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRTbWFydGNhcmRHdWFyZFRpbWUoVVNBUlRfVHlwZURlZiAqVVNBUlR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEd1YXJkVGltZSkgeworICBNT0RJRllfUkVHKFVTQVJUeC0+R1RQUiwgVVNBUlRfR1RQUl9HVCwKKyAgICAgICAgICAgICAodWludDE2X3QpKEd1YXJkVGltZSA8PCBVU0FSVF9HVFBSX0dUX1BvcykpOworfQorCisvKioKKyAqIEBicmllZiAgUmV0dXJuIFNtYXJ0Y2FyZCBHdWFyZCB0aW1lIHZhbHVlLCBleHByZXNzZWQgaW4gbmIgb2YgYmF1ZCBjbG9ja3MKKyAqIHBlcmlvZHMgKEdUWzc6MF0gYml0cyA6IEd1YXJkIHRpbWUgdmFsdWUpCisgKiBAbm90ZSAgIE1hY3JvIElTX1NNQVJUQ0FSRF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3IKKyAqIG5vdCBTbWFydGNhcmQgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAqIEBybXRvbGwgR1RQUiAgICAgICAgIEdUICAgICAgICAgICAgTExfVVNBUlRfR2V0U21hcnRjYXJkR3VhcmRUaW1lCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBTbWFydGNhcmQgR3VhcmQgdGltZSB2YWx1ZSAoVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZAorICogTWF4X0RhdGE9MHhGRikKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9VU0FSVF9HZXRTbWFydGNhcmRHdWFyZFRpbWUoY29uc3QgVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFVTQVJUeC0+R1RQUiwgVVNBUlRfR1RQUl9HVCkgPj4gVVNBUlRfR1RQUl9HVF9Qb3MpOworfQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FRl9Db25maWd1cmF0aW9uX0hhbGZEdXBsZXggQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMKKyAqIHJlbGF0ZWQgdG8gSGFsZiBEdXBsZXggZmVhdHVyZQorICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiAgRW5hYmxlIFNpbmdsZSBXaXJlIEhhbGYtRHVwbGV4IG1vZGUKKyAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9IQUxGRFVQTEVYX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAqIHdoZXRoZXIgb3Igbm90IEhhbGYtRHVwbGV4IG1vZGUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgKiBAcm10b2xsIENSMyAgICAgICAgICBIRFNFTCAgICAgICAgIExMX1VTQVJUX0VuYWJsZUhhbGZEdXBsZXgKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlSGFsZkR1cGxleChVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgU0VUX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX0hEU0VMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgU2luZ2xlIFdpcmUgSGFsZi1EdXBsZXggbW9kZQorICogQG5vdGUgICBNYWNybyBJU19VQVJUX0hBTEZEVVBMRVhfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICogd2hldGhlciBvciBub3QgSGFsZi1EdXBsZXggbW9kZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAqIEBybXRvbGwgQ1IzICAgICAgICAgIEhEU0VMICAgICAgICAgTExfVVNBUlRfRGlzYWJsZUhhbGZEdXBsZXgKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZUhhbGZEdXBsZXgoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX0hEU0VMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEluZGljYXRlIGlmIFNpbmdsZSBXaXJlIEhhbGYtRHVwbGV4IG1vZGUgaXMgZW5hYmxlZAorICogQG5vdGUgICBNYWNybyBJU19VQVJUX0hBTEZEVVBMRVhfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICogd2hldGhlciBvciBub3QgSGFsZi1EdXBsZXggbW9kZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAqIEBybXRvbGwgQ1IzICAgICAgICAgIEhEU0VMICAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkSGFsZkR1cGxleAorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX1VTQVJUX0lzRW5hYmxlZEhhbGZEdXBsZXgoY29uc3QgVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfSERTRUwpID09IChVU0FSVF9DUjNfSERTRUwpKSA/IDFVTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FRl9Db25maWd1cmF0aW9uX1NQSV9TTEFWRSBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICogcmVsYXRlZCB0byBTUEkgU2xhdmUgZmVhdHVyZQorICogQHsKKyAqLworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBTUEkgU3luY2hyb25vdXMgU2xhdmUgbW9kZQorICogQG5vdGUgICBNYWNybyBJU19VQVJUX1NQSV9TTEFWRV9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIKKyAqIG9yIG5vdCBTUEkgU2xhdmUgbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICogQHJtdG9sbCBDUjIgICAgICAgICAgU0xWRU4gICAgICAgICBMTF9VU0FSVF9FbmFibGVTUElTbGF2ZQorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVTUElTbGF2ZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgU0VUX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX1NMVkVOKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgU1BJIFN5bmNocm9ub3VzIFNsYXZlIG1vZGUKKyAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9TUElfU0xBVkVfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyCisgKiBvciBub3QgU1BJIFNsYXZlIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAqIEBybXRvbGwgQ1IyICAgICAgICAgIFNMVkVOICAgICAgICAgTExfVVNBUlRfRGlzYWJsZVNQSVNsYXZlCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVTUElTbGF2ZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfU0xWRU4pOworfQorCisvKioKKyAqIEBicmllZiAgSW5kaWNhdGUgaWYgIFNQSSBTeW5jaHJvbm91cyBTbGF2ZSBtb2RlIGlzIGVuYWJsZWQKKyAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9TUElfU0xBVkVfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyCisgKiBvciBub3QgU1BJIFNsYXZlIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAqIEBybXRvbGwgQ1IyICAgICAgICAgIFNMVkVOICAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkU1BJU2xhdmUKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9VU0FSVF9Jc0VuYWJsZWRTUElTbGF2ZShjb25zdCBVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9TTFZFTikgPT0gKFVTQVJUX0NSMl9TTFZFTikpID8gMVVMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgU1BJIFNsYXZlIFNlbGVjdGlvbiB1c2luZyBOU1MgaW5wdXQgcGluCisgKiBAbm90ZSAgIE1hY3JvIElTX1VBUlRfU1BJX1NMQVZFX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlcgorICogb3Igbm90IFNQSSBTbGF2ZSBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgKiBAbm90ZSAgIFNQSSBTbGF2ZSBTZWxlY3Rpb24gZGVwZW5kcyBvbiBOU1MgaW5wdXQgcGluCisgKiAgICAgICAgIChUaGUgc2xhdmUgaXMgc2VsZWN0ZWQgd2hlbiBOU1MgaXMgbG93IGFuZCBkZXNlbGVjdGVkIHdoZW4gTlNTIGlzCisgKiBoaWdoKS4KKyAqIEBybXRvbGwgQ1IyICAgICAgICAgIERJU19OU1MgICAgICAgTExfVVNBUlRfRW5hYmxlU1BJU2xhdmVTZWxlY3QKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlU1BJU2xhdmVTZWxlY3QoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0RJU19OU1MpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBTUEkgU2xhdmUgU2VsZWN0aW9uIHVzaW5nIE5TUyBpbnB1dCBwaW4KKyAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9TUElfU0xBVkVfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyCisgKiBvciBub3QgU1BJIFNsYXZlIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAqIEBub3RlICAgU1BJIFNsYXZlIHdpbGwgYmUgYWx3YXlzIHNlbGVjdGVkIGFuZCBOU1MgaW5wdXQgcGluIHdpbGwgYmUgaWdub3JlZC4KKyAqIEBybXRvbGwgQ1IyICAgICAgICAgIERJU19OU1MgICAgICAgTExfVVNBUlRfRGlzYWJsZVNQSVNsYXZlU2VsZWN0CisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVTUElTbGF2ZVNlbGVjdChVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgU0VUX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0RJU19OU1MpOworfQorCisvKioKKyAqIEBicmllZiAgSW5kaWNhdGUgaWYgIFNQSSBTbGF2ZSBTZWxlY3Rpb24gZGVwZW5kcyBvbiBOU1MgaW5wdXQgcGluCisgKiBAbm90ZSAgIE1hY3JvIElTX1VBUlRfU1BJX1NMQVZFX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlcgorICogb3Igbm90IFNQSSBTbGF2ZSBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgKiBAcm10b2xsIENSMiAgICAgICAgICBESVNfTlNTICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZFNQSVNsYXZlU2VsZWN0CisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfVVNBUlRfSXNFbmFibGVkU1BJU2xhdmVTZWxlY3QoY29uc3QgVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfRElTX05TUykgIT0gKFVTQVJUX0NSMl9ESVNfTlNTKSkKKyAgICAgICAgICAgICAgPyAxVUwKKyAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FRl9Db25maWd1cmF0aW9uX0xJTiBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucyByZWxhdGVkIHRvCisgKiBMSU4gZmVhdHVyZQorICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiAgU2V0IExJTiBCcmVhayBEZXRlY3Rpb24gTGVuZ3RoCisgKiBAbm90ZSAgIE1hY3JvIElTX1VBUlRfTElOX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvcgorICogbm90IExJTiBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICogQHJtdG9sbCBDUjIgICAgICAgICAgTEJETCAgICAgICAgICBMTF9VU0FSVF9TZXRMSU5CcmtEZXRlY3Rpb25MZW4KKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcGFyYW0gIExJTkJETGVuZ3RoIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9MSU5CUkVBS19ERVRFQ1RfMTBCCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9MSU5CUkVBS19ERVRFQ1RfMTFCCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0TElOQnJrRGV0ZWN0aW9uTGVuKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBMSU5CRExlbmd0aCkgeworICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfTEJETCwgTElOQkRMZW5ndGgpOworfQorCisvKioKKyAqIEBicmllZiAgUmV0dXJuIExJTiBCcmVhayBEZXRlY3Rpb24gTGVuZ3RoCisgKiBAbm90ZSAgIE1hY3JvIElTX1VBUlRfTElOX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvcgorICogbm90IExJTiBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICogQHJtdG9sbCBDUjIgICAgICAgICAgTEJETCAgICAgICAgICBMTF9VU0FSVF9HZXRMSU5CcmtEZXRlY3Rpb25MZW4KKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9MSU5CUkVBS19ERVRFQ1RfMTBCCisgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9MSU5CUkVBS19ERVRFQ1RfMTFCCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfVVNBUlRfR2V0TElOQnJrRGV0ZWN0aW9uTGVuKGNvbnN0IFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0xCREwpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBMSU4gbW9kZQorICogQG5vdGUgICBNYWNybyBJU19VQVJUX0xJTl9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3IKKyAqIG5vdCBMSU4gZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAqIEBybXRvbGwgQ1IyICAgICAgICAgIExJTkVOICAgICAgICAgTExfVVNBUlRfRW5hYmxlTElOCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZUxJTihVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgU0VUX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0xJTkVOKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgTElOIG1vZGUKKyAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9MSU5fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yCisgKiBub3QgTElOIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgKiBAcm10b2xsIENSMiAgICAgICAgICBMSU5FTiAgICAgICAgIExMX1VTQVJUX0Rpc2FibGVMSU4KKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZUxJTihVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfTElORU4pOworfQorCisvKioKKyAqIEBicmllZiAgSW5kaWNhdGUgaWYgTElOIG1vZGUgaXMgZW5hYmxlZAorICogQG5vdGUgICBNYWNybyBJU19VQVJUX0xJTl9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3IKKyAqIG5vdCBMSU4gZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAqIEBybXRvbGwgQ1IyICAgICAgICAgIExJTkVOICAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkTElOCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRMSU4oY29uc3QgVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfTElORU4pID09IChVU0FSVF9DUjJfTElORU4pKSA/IDFVTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FRl9Db25maWd1cmF0aW9uX0RFIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zIHJlbGF0ZWQgdG8KKyAqIERyaXZlciBFbmFibGUgZmVhdHVyZQorICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiAgU2V0IERFRFQgKERyaXZlciBFbmFibGUgRGUtQXNzZXJ0aW9uIFRpbWUpLCBUaW1lIHZhbHVlIGV4cHJlc3NlZCBvbiA1CisgKiBiaXRzIChbNDowXSBiaXRzKS4KKyAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9EUklWRVJfRU5BQkxFX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAqIHdoZXRoZXIgb3Igbm90IERyaXZlciBFbmFibGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIERFRFQgICAgICAgICAgTExfVVNBUlRfU2V0REVEZWFzc2VydGlvblRpbWUKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcGFyYW0gIFRpbWUgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0zMQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldERFRGVhc3NlcnRpb25UaW1lKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWUpIHsKKyAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX0RFRFQsIFRpbWUgPDwgVVNBUlRfQ1IxX0RFRFRfUG9zKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFJldHVybiBERURUIChEcml2ZXIgRW5hYmxlIERlLUFzc2VydGlvbiBUaW1lKQorICogQG5vdGUgICBNYWNybyBJU19VQVJUX0RSSVZFUl9FTkFCTEVfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICogd2hldGhlciBvciBub3QgRHJpdmVyIEVuYWJsZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICogQHJtdG9sbCBDUjEgICAgICAgICAgREVEVCAgICAgICAgICBMTF9VU0FSVF9HZXRERURlYXNzZXJ0aW9uVGltZQorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgVGltZSB2YWx1ZSBleHByZXNzZWQgb24gNSBiaXRzIChbNDowXSBiaXRzKSA6IFZhbHVlIGJldHdlZW4KKyAqIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTMxCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfVVNBUlRfR2V0REVEZWFzc2VydGlvblRpbWUoY29uc3QgVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfREVEVCkgPj4KKyAgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX0RFRFRfUG9zKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFNldCBERUFUIChEcml2ZXIgRW5hYmxlIEFzc2VydGlvbiBUaW1lKSwgVGltZSB2YWx1ZSBleHByZXNzZWQgb24gNQorICogYml0cyAoWzQ6MF0gYml0cykuCisgKiBAbm90ZSAgIE1hY3JvIElTX1VBUlRfRFJJVkVSX0VOQUJMRV9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgKiB3aGV0aGVyIG9yIG5vdCBEcml2ZXIgRW5hYmxlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgKiBAcm10b2xsIENSMSAgICAgICAgICBERUFUICAgICAgICAgIExMX1VTQVJUX1NldERFQXNzZXJ0aW9uVGltZQorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEBwYXJhbSAgVGltZSBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTMxCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0REVBc3NlcnRpb25UaW1lKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lKSB7CisgIE1PRElGWV9SRUcoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9ERUFULCBUaW1lIDw8IFVTQVJUX0NSMV9ERUFUX1Bvcyk7Cit9CisKKy8qKgorICogQGJyaWVmICBSZXR1cm4gREVBVCAoRHJpdmVyIEVuYWJsZSBBc3NlcnRpb24gVGltZSkKKyAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9EUklWRVJfRU5BQkxFX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAqIHdoZXRoZXIgb3Igbm90IERyaXZlciBFbmFibGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIERFQVQgICAgICAgICAgTExfVVNBUlRfR2V0REVBc3NlcnRpb25UaW1lCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBUaW1lIHZhbHVlIGV4cHJlc3NlZCBvbiA1IGJpdHMgKFs0OjBdIGJpdHMpIDogVmFsdWUgYmV0d2VlbgorICogTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MzEKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9VU0FSVF9HZXRERUFzc2VydGlvblRpbWUoY29uc3QgVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfREVBVCkgPj4KKyAgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX0RFQVRfUG9zKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBEcml2ZXIgRW5hYmxlIChERSkgTW9kZQorICogQG5vdGUgICBNYWNybyBJU19VQVJUX0RSSVZFUl9FTkFCTEVfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICogd2hldGhlciBvciBub3QgRHJpdmVyIEVuYWJsZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICogQHJtdG9sbCBDUjMgICAgICAgICAgREVNICAgICAgICAgICBMTF9VU0FSVF9FbmFibGVERU1vZGUKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlREVNb2RlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICBTRVRfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfREVNKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgRHJpdmVyIEVuYWJsZSAoREUpIE1vZGUKKyAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9EUklWRVJfRU5BQkxFX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAqIHdoZXRoZXIgb3Igbm90IERyaXZlciBFbmFibGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAqIEBybXRvbGwgQ1IzICAgICAgICAgIERFTSAgICAgICAgICAgTExfVVNBUlRfRGlzYWJsZURFTW9kZQorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlREVNb2RlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19ERU0pOworfQorCisvKioKKyAqIEBicmllZiAgSW5kaWNhdGUgaWYgRHJpdmVyIEVuYWJsZSAoREUpIE1vZGUgaXMgZW5hYmxlZAorICogQG5vdGUgICBNYWNybyBJU19VQVJUX0RSSVZFUl9FTkFCTEVfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICogd2hldGhlciBvciBub3QgRHJpdmVyIEVuYWJsZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICogQHJtdG9sbCBDUjMgICAgICAgICAgREVNICAgICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRERU1vZGUKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZERFTW9kZShjb25zdCBVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19ERU0pID09IChVU0FSVF9DUjNfREVNKSkgPyAxVUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgU2VsZWN0IERyaXZlciBFbmFibGUgUG9sYXJpdHkKKyAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9EUklWRVJfRU5BQkxFX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAqIHdoZXRoZXIgb3Igbm90IERyaXZlciBFbmFibGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAqIEBybXRvbGwgQ1IzICAgICAgICAgIERFUCAgICAgICAgICAgTExfVVNBUlRfU2V0REVTaWduYWxQb2xhcml0eQorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEBwYXJhbSAgUG9sYXJpdHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0RFX1BPTEFSSVRZX0hJR0gKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0RFX1BPTEFSSVRZX0xPVworICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldERFU2lnbmFsUG9sYXJpdHkoVVNBUlRfVHlwZURlZiAqVVNBUlR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQb2xhcml0eSkgeworICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfREVQLCBQb2xhcml0eSk7Cit9CisKKy8qKgorICogQGJyaWVmICBSZXR1cm4gRHJpdmVyIEVuYWJsZSBQb2xhcml0eQorICogQG5vdGUgICBNYWNybyBJU19VQVJUX0RSSVZFUl9FTkFCTEVfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICogd2hldGhlciBvciBub3QgRHJpdmVyIEVuYWJsZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICogQHJtdG9sbCBDUjMgICAgICAgICAgREVQICAgICAgICAgICBMTF9VU0FSVF9HZXRERVNpZ25hbFBvbGFyaXR5CisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfREVfUE9MQVJJVFlfSElHSAorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfREVfUE9MQVJJVFlfTE9XCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfVVNBUlRfR2V0REVTaWduYWxQb2xhcml0eShjb25zdCBVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19ERVApKTsKK30KKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUZfQWR2YW5jZWRDb25maWd1cmF0aW9uIEFkdmFuY2VkIENvbmZpZ3VyYXRpb25zIHNlcnZpY2VzCisgKiBAeworICovCisKKy8qKgorICogQGJyaWVmICBQZXJmb3JtIGJhc2ljIGNvbmZpZ3VyYXRpb24gb2YgVVNBUlQgZm9yIGVuYWJsaW5nIHVzZSBpbiBBc3luY2hyb25vdXMKKyAqIE1vZGUgKFVBUlQpCisgKiBAbm90ZSAgIEluIFVBUlQgbW9kZSwgdGhlIGZvbGxvd2luZyBiaXRzIG11c3QgYmUga2VwdCBjbGVhcmVkOgorICogICAgICAgICAgIC0gTElORU4gYml0IGluIHRoZSBVU0FSVF9DUjIgcmVnaXN0ZXIsCisgKiAgICAgICAgICAgLSBDTEtFTiBiaXQgaW4gdGhlIFVTQVJUX0NSMiByZWdpc3RlciwKKyAqICAgICAgICAgICAtIFNDRU4gYml0IGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIsCisgKiAgICAgICAgICAgLSBJUkVOIGJpdCBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLAorICogICAgICAgICAgIC0gSERTRUwgYml0IGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIuCisgKiBAbm90ZSAgIENhbGwgb2YgdGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIGZvbGxvd2luZyBmdW5jdGlvbiBjYWxsCisgKiBzZXF1ZW5jZSA6CisgKiAgICAgICAgIC0gQ2xlYXIgTElORU4gaW4gQ1IyIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZUxJTigpIGZ1bmN0aW9uCisgKiAgICAgICAgIC0gQ2xlYXIgQ0xLRU4gaW4gQ1IyIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZVNDTEtPdXRwdXQoKSBmdW5jdGlvbgorICogICAgICAgICAtIENsZWFyIFNDRU4gaW4gQ1IzIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZVNtYXJ0Y2FyZCgpIGZ1bmN0aW9uCisgKiAgICAgICAgIC0gQ2xlYXIgSVJFTiBpbiBDUjMgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlSXJkYSgpIGZ1bmN0aW9uCisgKiAgICAgICAgIC0gQ2xlYXIgSERTRUwgaW4gQ1IzIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZUhhbGZEdXBsZXgoKSBmdW5jdGlvbgorICogQG5vdGUgICBPdGhlciByZW1haW5pbmcgY29uZmlndXJhdGlvbnMgaXRlbXMgcmVsYXRlZCB0byBBc3luY2hyb25vdXMgTW9kZQorICogICAgICAgICAoYXMgQmF1ZCBSYXRlLCBXb3JkIGxlbmd0aCwgUGFyaXR5LCAuLi4pIHNob3VsZCBiZSBzZXQgdXNpbmcKKyAqICAgICAgICAgZGVkaWNhdGVkIGZ1bmN0aW9ucworICogQHJtdG9sbCBDUjIgICAgICAgICAgTElORU4gICAgICAgICBMTF9VU0FSVF9Db25maWdBc3luY01vZGVcbgorICogICAgICAgICBDUjIgICAgICAgICAgQ0xLRU4gICAgICAgICBMTF9VU0FSVF9Db25maWdBc3luY01vZGVcbgorICogICAgICAgICBDUjMgICAgICAgICAgU0NFTiAgICAgICAgICBMTF9VU0FSVF9Db25maWdBc3luY01vZGVcbgorICogICAgICAgICBDUjMgICAgICAgICAgSVJFTiAgICAgICAgICBMTF9VU0FSVF9Db25maWdBc3luY01vZGVcbgorICogICAgICAgICBDUjMgICAgICAgICAgSERTRUwgICAgICAgICBMTF9VU0FSVF9Db25maWdBc3luY01vZGUKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfQ29uZmlnQXN5bmNNb2RlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICAvKiBJbiBBc3luY2hyb25vdXMgbW9kZSwgdGhlIGZvbGxvd2luZyBiaXRzIG11c3QgYmUga2VwdCBjbGVhcmVkOgorICAtIExJTkVOLCBDTEtFTiBiaXRzIGluIHRoZSBVU0FSVF9DUjIgcmVnaXN0ZXIsCisgIC0gU0NFTiwgSVJFTiBhbmQgSERTRUwgYml0cyBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLgorICAqLworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjIsIChVU0FSVF9DUjJfTElORU4gfCBVU0FSVF9DUjJfQ0xLRU4pKTsKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IzLCAoVVNBUlRfQ1IzX1NDRU4gfCBVU0FSVF9DUjNfSVJFTiB8IFVTQVJUX0NSM19IRFNFTCkpOworfQorCisvKioKKyAqIEBicmllZiAgUGVyZm9ybSBiYXNpYyBjb25maWd1cmF0aW9uIG9mIFVTQVJUIGZvciBlbmFibGluZyB1c2UgaW4gU3luY2hyb25vdXMKKyAqIE1vZGUKKyAqIEBub3RlICAgSW4gU3luY2hyb25vdXMgbW9kZSwgdGhlIGZvbGxvd2luZyBiaXRzIG11c3QgYmUga2VwdCBjbGVhcmVkOgorICogICAgICAgICAgIC0gTElORU4gYml0IGluIHRoZSBVU0FSVF9DUjIgcmVnaXN0ZXIsCisgKiAgICAgICAgICAgLSBTQ0VOIGJpdCBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLAorICogICAgICAgICAgIC0gSVJFTiBiaXQgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3RlciwKKyAqICAgICAgICAgICAtIEhEU0VMIGJpdCBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLgorICogICAgICAgICBUaGlzIGZ1bmN0aW9uIGFsc28gc2V0cyB0aGUgVVNBUlQgaW4gU3luY2hyb25vdXMgbW9kZS4KKyAqIEBub3RlICAgTWFjcm8gSVNfVVNBUlRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICogICAgICAgICBTeW5jaHJvbm91cyBtb2RlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICogQG5vdGUgICBDYWxsIG9mIHRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byBmb2xsb3dpbmcgZnVuY3Rpb24gY2FsbAorICogc2VxdWVuY2UgOgorICogICAgICAgICAtIENsZWFyIExJTkVOIGluIENSMiB1c2luZyBAcmVmIExMX1VTQVJUX0Rpc2FibGVMSU4oKSBmdW5jdGlvbgorICogICAgICAgICAtIENsZWFyIElSRU4gaW4gQ1IzIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZUlyZGEoKSBmdW5jdGlvbgorICogICAgICAgICAtIENsZWFyIFNDRU4gaW4gQ1IzIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZVNtYXJ0Y2FyZCgpIGZ1bmN0aW9uCisgKiAgICAgICAgIC0gQ2xlYXIgSERTRUwgaW4gQ1IzIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZUhhbGZEdXBsZXgoKSBmdW5jdGlvbgorICogICAgICAgICAtIFNldCBDTEtFTiBpbiBDUjIgdXNpbmcgQHJlZiBMTF9VU0FSVF9FbmFibGVTQ0xLT3V0cHV0KCkgZnVuY3Rpb24KKyAqIEBub3RlICAgT3RoZXIgcmVtYWluaW5nIGNvbmZpZ3VyYXRpb25zIGl0ZW1zIHJlbGF0ZWQgdG8gU3luY2hyb25vdXMgTW9kZQorICogICAgICAgICAoYXMgQmF1ZCBSYXRlLCBXb3JkIGxlbmd0aCwgUGFyaXR5LCBDbG9jayBQb2xhcml0eSwgLi4uKSBzaG91bGQgYmUKKyAqIHNldCB1c2luZyBkZWRpY2F0ZWQgZnVuY3Rpb25zCisgKiBAcm10b2xsIENSMiAgICAgICAgICBMSU5FTiAgICAgICAgIExMX1VTQVJUX0NvbmZpZ1N5bmNNb2RlXG4KKyAqICAgICAgICAgQ1IyICAgICAgICAgIENMS0VOICAgICAgICAgTExfVVNBUlRfQ29uZmlnU3luY01vZGVcbgorICogICAgICAgICBDUjMgICAgICAgICAgU0NFTiAgICAgICAgICBMTF9VU0FSVF9Db25maWdTeW5jTW9kZVxuCisgKiAgICAgICAgIENSMyAgICAgICAgICBJUkVOICAgICAgICAgIExMX1VTQVJUX0NvbmZpZ1N5bmNNb2RlXG4KKyAqICAgICAgICAgQ1IzICAgICAgICAgIEhEU0VMICAgICAgICAgTExfVVNBUlRfQ29uZmlnU3luY01vZGUKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfQ29uZmlnU3luY01vZGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIC8qIEluIFN5bmNocm9ub3VzIG1vZGUsIHRoZSBmb2xsb3dpbmcgYml0cyBtdXN0IGJlIGtlcHQgY2xlYXJlZDoKKyAgLSBMSU5FTiBiaXQgaW4gdGhlIFVTQVJUX0NSMiByZWdpc3RlciwKKyAgLSBTQ0VOLCBJUkVOIGFuZCBIRFNFTCBiaXRzIGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIuCisgICovCisgIENMRUFSX0JJVChVU0FSVHgtPkNSMiwgKFVTQVJUX0NSMl9MSU5FTikpOworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjMsIChVU0FSVF9DUjNfU0NFTiB8IFVTQVJUX0NSM19JUkVOIHwgVVNBUlRfQ1IzX0hEU0VMKSk7CisgIC8qIHNldCB0aGUgVUFSVC9VU0FSVCBpbiBTeW5jaHJvbm91cyBtb2RlICovCisgIFNFVF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9DTEtFTik7Cit9CisKKy8qKgorICogQGJyaWVmICBQZXJmb3JtIGJhc2ljIGNvbmZpZ3VyYXRpb24gb2YgVVNBUlQgZm9yIGVuYWJsaW5nIHVzZSBpbiBMSU4gTW9kZQorICogQG5vdGUgICBJbiBMSU4gbW9kZSwgdGhlIGZvbGxvd2luZyBiaXRzIG11c3QgYmUga2VwdCBjbGVhcmVkOgorICogICAgICAgICAgIC0gU1RPUCBhbmQgQ0xLRU4gYml0cyBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLAorICogICAgICAgICAgIC0gU0NFTiBiaXQgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3RlciwKKyAqICAgICAgICAgICAtIElSRU4gYml0IGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIsCisgKiAgICAgICAgICAgLSBIRFNFTCBiaXQgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3Rlci4KKyAqICAgICAgICAgVGhpcyBmdW5jdGlvbiBhbHNvIHNldCB0aGUgVUFSVC9VU0FSVCBpbiBMSU4gbW9kZS4KKyAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9MSU5fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yCisgKiBub3QgTElOIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgKiBAbm90ZSAgIENhbGwgb2YgdGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIGZvbGxvd2luZyBmdW5jdGlvbiBjYWxsCisgKiBzZXF1ZW5jZSA6CisgKiAgICAgICAgIC0gQ2xlYXIgQ0xLRU4gaW4gQ1IyIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZVNDTEtPdXRwdXQoKSBmdW5jdGlvbgorICogICAgICAgICAtIENsZWFyIFNUT1AgaW4gQ1IyIHVzaW5nIEByZWYgTExfVVNBUlRfU2V0U3RvcEJpdHNMZW5ndGgoKSBmdW5jdGlvbgorICogICAgICAgICAtIENsZWFyIFNDRU4gaW4gQ1IzIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZVNtYXJ0Y2FyZCgpIGZ1bmN0aW9uCisgKiAgICAgICAgIC0gQ2xlYXIgSVJFTiBpbiBDUjMgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlSXJkYSgpIGZ1bmN0aW9uCisgKiAgICAgICAgIC0gQ2xlYXIgSERTRUwgaW4gQ1IzIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZUhhbGZEdXBsZXgoKSBmdW5jdGlvbgorICogICAgICAgICAtIFNldCBMSU5FTiBpbiBDUjIgdXNpbmcgQHJlZiBMTF9VU0FSVF9FbmFibGVMSU4oKSBmdW5jdGlvbgorICogQG5vdGUgICBPdGhlciByZW1haW5pbmcgY29uZmlndXJhdGlvbnMgaXRlbXMgcmVsYXRlZCB0byBMSU4gTW9kZQorICogICAgICAgICAoYXMgQmF1ZCBSYXRlLCBXb3JkIGxlbmd0aCwgTElOIEJyZWFrIERldGVjdGlvbiBMZW5ndGgsIC4uLikgc2hvdWxkCisgKiBiZSBzZXQgdXNpbmcgZGVkaWNhdGVkIGZ1bmN0aW9ucworICogQHJtdG9sbCBDUjIgICAgICAgICAgQ0xLRU4gICAgICAgICBMTF9VU0FSVF9Db25maWdMSU5Nb2RlXG4KKyAqICAgICAgICAgQ1IyICAgICAgICAgIFNUT1AgICAgICAgICAgTExfVVNBUlRfQ29uZmlnTElOTW9kZVxuCisgKiAgICAgICAgIENSMiAgICAgICAgICBMSU5FTiAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0xJTk1vZGVcbgorICogICAgICAgICBDUjMgICAgICAgICAgSVJFTiAgICAgICAgICBMTF9VU0FSVF9Db25maWdMSU5Nb2RlXG4KKyAqICAgICAgICAgQ1IzICAgICAgICAgIFNDRU4gICAgICAgICAgTExfVVNBUlRfQ29uZmlnTElOTW9kZVxuCisgKiAgICAgICAgIENSMyAgICAgICAgICBIRFNFTCAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0xJTk1vZGUKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfQ29uZmlnTElOTW9kZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgLyogSW4gTElOIG1vZGUsIHRoZSBmb2xsb3dpbmcgYml0cyBtdXN0IGJlIGtlcHQgY2xlYXJlZDoKKyAgLSBTVE9QIGFuZCBDTEtFTiBiaXRzIGluIHRoZSBVU0FSVF9DUjIgcmVnaXN0ZXIsCisgIC0gSVJFTiwgU0NFTiBhbmQgSERTRUwgYml0cyBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLgorICAqLworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjIsIChVU0FSVF9DUjJfQ0xLRU4gfCBVU0FSVF9DUjJfU1RPUCkpOworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjMsIChVU0FSVF9DUjNfSVJFTiB8IFVTQVJUX0NSM19TQ0VOIHwgVVNBUlRfQ1IzX0hEU0VMKSk7CisgIC8qIFNldCB0aGUgVUFSVC9VU0FSVCBpbiBMSU4gbW9kZSAqLworICBTRVRfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfTElORU4pOworfQorCisvKioKKyAqIEBicmllZiAgUGVyZm9ybSBiYXNpYyBjb25maWd1cmF0aW9uIG9mIFVTQVJUIGZvciBlbmFibGluZyB1c2UgaW4gSGFsZiBEdXBsZXgKKyAqIE1vZGUKKyAqIEBub3RlICAgSW4gSGFsZiBEdXBsZXggbW9kZSwgdGhlIGZvbGxvd2luZyBiaXRzIG11c3QgYmUga2VwdCBjbGVhcmVkOgorICogICAgICAgICAgIC0gTElORU4gYml0IGluIHRoZSBVU0FSVF9DUjIgcmVnaXN0ZXIsCisgKiAgICAgICAgICAgLSBDTEtFTiBiaXQgaW4gdGhlIFVTQVJUX0NSMiByZWdpc3RlciwKKyAqICAgICAgICAgICAtIFNDRU4gYml0IGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIsCisgKiAgICAgICAgICAgLSBJUkVOIGJpdCBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLAorICogICAgICAgICBUaGlzIGZ1bmN0aW9uIGFsc28gc2V0cyB0aGUgVUFSVC9VU0FSVCBpbiBIYWxmIER1cGxleCBtb2RlLgorICogQG5vdGUgICBNYWNybyBJU19VQVJUX0hBTEZEVVBMRVhfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICogd2hldGhlciBvciBub3QgSGFsZi1EdXBsZXggbW9kZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAqIEBub3RlICAgQ2FsbCBvZiB0aGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gZm9sbG93aW5nIGZ1bmN0aW9uIGNhbGwKKyAqIHNlcXVlbmNlIDoKKyAqICAgICAgICAgLSBDbGVhciBMSU5FTiBpbiBDUjIgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlTElOKCkgZnVuY3Rpb24KKyAqICAgICAgICAgLSBDbGVhciBDTEtFTiBpbiBDUjIgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlU0NMS091dHB1dCgpIGZ1bmN0aW9uCisgKiAgICAgICAgIC0gQ2xlYXIgU0NFTiBpbiBDUjMgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlU21hcnRjYXJkKCkgZnVuY3Rpb24KKyAqICAgICAgICAgLSBDbGVhciBJUkVOIGluIENSMyB1c2luZyBAcmVmIExMX1VTQVJUX0Rpc2FibGVJcmRhKCkgZnVuY3Rpb24KKyAqICAgICAgICAgLSBTZXQgSERTRUwgaW4gQ1IzIHVzaW5nIEByZWYgTExfVVNBUlRfRW5hYmxlSGFsZkR1cGxleCgpIGZ1bmN0aW9uCisgKiBAbm90ZSAgIE90aGVyIHJlbWFpbmluZyBjb25maWd1cmF0aW9ucyBpdGVtcyByZWxhdGVkIHRvIEhhbGYgRHVwbGV4IE1vZGUKKyAqICAgICAgICAgKGFzIEJhdWQgUmF0ZSwgV29yZCBsZW5ndGgsIFBhcml0eSwgLi4uKSBzaG91bGQgYmUgc2V0IHVzaW5nCisgKiAgICAgICAgIGRlZGljYXRlZCBmdW5jdGlvbnMKKyAqIEBybXRvbGwgQ1IyICAgICAgICAgIExJTkVOICAgICAgICAgTExfVVNBUlRfQ29uZmlnSGFsZkR1cGxleE1vZGVcbgorICogICAgICAgICBDUjIgICAgICAgICAgQ0xLRU4gICAgICAgICBMTF9VU0FSVF9Db25maWdIYWxmRHVwbGV4TW9kZVxuCisgKiAgICAgICAgIENSMyAgICAgICAgICBIRFNFTCAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0hhbGZEdXBsZXhNb2RlXG4KKyAqICAgICAgICAgQ1IzICAgICAgICAgIFNDRU4gICAgICAgICAgTExfVVNBUlRfQ29uZmlnSGFsZkR1cGxleE1vZGVcbgorICogICAgICAgICBDUjMgICAgICAgICAgSVJFTiAgICAgICAgICBMTF9VU0FSVF9Db25maWdIYWxmRHVwbGV4TW9kZQorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9Db25maWdIYWxmRHVwbGV4TW9kZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgLyogSW4gSGFsZiBEdXBsZXggbW9kZSwgdGhlIGZvbGxvd2luZyBiaXRzIG11c3QgYmUga2VwdCBjbGVhcmVkOgorICAtIExJTkVOIGFuZCBDTEtFTiBiaXRzIGluIHRoZSBVU0FSVF9DUjIgcmVnaXN0ZXIsCisgIC0gU0NFTiBhbmQgSVJFTiBiaXRzIGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIuCisgICovCisgIENMRUFSX0JJVChVU0FSVHgtPkNSMiwgKFVTQVJUX0NSMl9MSU5FTiB8IFVTQVJUX0NSMl9DTEtFTikpOworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjMsIChVU0FSVF9DUjNfU0NFTiB8IFVTQVJUX0NSM19JUkVOKSk7CisgIC8qIHNldCB0aGUgVUFSVC9VU0FSVCBpbiBIYWxmIER1cGxleCBtb2RlICovCisgIFNFVF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19IRFNFTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBQZXJmb3JtIGJhc2ljIGNvbmZpZ3VyYXRpb24gb2YgVVNBUlQgZm9yIGVuYWJsaW5nIHVzZSBpbiBTbWFydGNhcmQKKyAqIE1vZGUKKyAqIEBub3RlICAgSW4gU21hcnRjYXJkIG1vZGUsIHRoZSBmb2xsb3dpbmcgYml0cyBtdXN0IGJlIGtlcHQgY2xlYXJlZDoKKyAqICAgICAgICAgICAtIExJTkVOIGJpdCBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLAorICogICAgICAgICAgIC0gSVJFTiBiaXQgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3RlciwKKyAqICAgICAgICAgICAtIEhEU0VMIGJpdCBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLgorICogICAgICAgICBUaGlzIGZ1bmN0aW9uIGFsc28gY29uZmlndXJlcyBTdG9wIGJpdHMgdG8gMS41IGJpdHMgYW5kCisgKiAgICAgICAgIHNldHMgdGhlIFVTQVJUIGluIFNtYXJ0Y2FyZCBtb2RlIChTQ0VOIGJpdCkuCisgKiAgICAgICAgIENsb2NrIE91dHB1dCBpcyBhbHNvIGVuYWJsZWQgKENMS0VOKS4KKyAqIEBub3RlICAgTWFjcm8gSVNfU01BUlRDQVJEX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvcgorICogbm90IFNtYXJ0Y2FyZCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICogQG5vdGUgICBDYWxsIG9mIHRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byBmb2xsb3dpbmcgZnVuY3Rpb24gY2FsbAorICogc2VxdWVuY2UgOgorICogICAgICAgICAtIENsZWFyIExJTkVOIGluIENSMiB1c2luZyBAcmVmIExMX1VTQVJUX0Rpc2FibGVMSU4oKSBmdW5jdGlvbgorICogICAgICAgICAtIENsZWFyIElSRU4gaW4gQ1IzIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZUlyZGEoKSBmdW5jdGlvbgorICogICAgICAgICAtIENsZWFyIEhEU0VMIGluIENSMyB1c2luZyBAcmVmIExMX1VTQVJUX0Rpc2FibGVIYWxmRHVwbGV4KCkgZnVuY3Rpb24KKyAqICAgICAgICAgLSBDb25maWd1cmUgU1RPUCBpbiBDUjIgdXNpbmcgQHJlZiBMTF9VU0FSVF9TZXRTdG9wQml0c0xlbmd0aCgpCisgKiBmdW5jdGlvbgorICogICAgICAgICAtIFNldCBDTEtFTiBpbiBDUjIgdXNpbmcgQHJlZiBMTF9VU0FSVF9FbmFibGVTQ0xLT3V0cHV0KCkgZnVuY3Rpb24KKyAqICAgICAgICAgLSBTZXQgU0NFTiBpbiBDUjMgdXNpbmcgQHJlZiBMTF9VU0FSVF9FbmFibGVTbWFydGNhcmQoKSBmdW5jdGlvbgorICogQG5vdGUgICBPdGhlciByZW1haW5pbmcgY29uZmlndXJhdGlvbnMgaXRlbXMgcmVsYXRlZCB0byBTbWFydGNhcmQgTW9kZQorICogICAgICAgICAoYXMgQmF1ZCBSYXRlLCBXb3JkIGxlbmd0aCwgUGFyaXR5LCAuLi4pIHNob3VsZCBiZSBzZXQgdXNpbmcKKyAqICAgICAgICAgZGVkaWNhdGVkIGZ1bmN0aW9ucworICogQHJtdG9sbCBDUjIgICAgICAgICAgTElORU4gICAgICAgICBMTF9VU0FSVF9Db25maWdTbWFydGNhcmRNb2RlXG4KKyAqICAgICAgICAgQ1IyICAgICAgICAgIFNUT1AgICAgICAgICAgTExfVVNBUlRfQ29uZmlnU21hcnRjYXJkTW9kZVxuCisgKiAgICAgICAgIENSMiAgICAgICAgICBDTEtFTiAgICAgICAgIExMX1VTQVJUX0NvbmZpZ1NtYXJ0Y2FyZE1vZGVcbgorICogICAgICAgICBDUjMgICAgICAgICAgSERTRUwgICAgICAgICBMTF9VU0FSVF9Db25maWdTbWFydGNhcmRNb2RlXG4KKyAqICAgICAgICAgQ1IzICAgICAgICAgIFNDRU4gICAgICAgICAgTExfVVNBUlRfQ29uZmlnU21hcnRjYXJkTW9kZQorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9Db25maWdTbWFydGNhcmRNb2RlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICAvKiBJbiBTbWFydGNhcmQgbW9kZSwgdGhlIGZvbGxvd2luZyBiaXRzIG11c3QgYmUga2VwdCBjbGVhcmVkOgorICAtIExJTkVOIGJpdCBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLAorICAtIElSRU4gYW5kIEhEU0VMIGJpdHMgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3Rlci4KKyAgKi8KKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IyLCAoVVNBUlRfQ1IyX0xJTkVOKSk7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMywgKFVTQVJUX0NSM19JUkVOIHwgVVNBUlRfQ1IzX0hEU0VMKSk7CisgIC8qIENvbmZpZ3VyZSBTdG9wIGJpdHMgdG8gMS41IGJpdHMgKi8KKyAgLyogU3luY2hyb25vdXMgbW9kZSBpcyBhY3RpdmF0ZWQgYnkgZGVmYXVsdCAqLworICBTRVRfQklUKFVTQVJUeC0+Q1IyLCAoVVNBUlRfQ1IyX1NUT1BfMCB8IFVTQVJUX0NSMl9TVE9QXzEgfCBVU0FSVF9DUjJfQ0xLRU4pKTsKKyAgLyogc2V0IHRoZSBVQVJUL1VTQVJUIGluIFNtYXJ0Y2FyZCBtb2RlICovCisgIFNFVF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19TQ0VOKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFBlcmZvcm0gYmFzaWMgY29uZmlndXJhdGlvbiBvZiBVU0FSVCBmb3IgZW5hYmxpbmcgdXNlIGluIElyZGEgTW9kZQorICogQG5vdGUgICBJbiBJUkRBIG1vZGUsIHRoZSBmb2xsb3dpbmcgYml0cyBtdXN0IGJlIGtlcHQgY2xlYXJlZDoKKyAqICAgICAgICAgICAtIExJTkVOIGJpdCBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLAorICogICAgICAgICAgIC0gU1RPUCBhbmQgQ0xLRU4gYml0cyBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLAorICogICAgICAgICAgIC0gU0NFTiBiaXQgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3RlciwKKyAqICAgICAgICAgICAtIEhEU0VMIGJpdCBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLgorICogICAgICAgICBUaGlzIGZ1bmN0aW9uIGFsc28gc2V0cyB0aGUgVUFSVC9VU0FSVCBpbiBJUkRBIG1vZGUgKElSRU4gYml0KS4KKyAqIEBub3RlICAgTWFjcm8gSVNfSVJEQV9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgKiAgICAgICAgIElyREEgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAqIEBub3RlICAgQ2FsbCBvZiB0aGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gZm9sbG93aW5nIGZ1bmN0aW9uIGNhbGwKKyAqIHNlcXVlbmNlIDoKKyAqICAgICAgICAgLSBDbGVhciBMSU5FTiBpbiBDUjIgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlTElOKCkgZnVuY3Rpb24KKyAqICAgICAgICAgLSBDbGVhciBDTEtFTiBpbiBDUjIgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlU0NMS091dHB1dCgpIGZ1bmN0aW9uCisgKiAgICAgICAgIC0gQ2xlYXIgU0NFTiBpbiBDUjMgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlU21hcnRjYXJkKCkgZnVuY3Rpb24KKyAqICAgICAgICAgLSBDbGVhciBIRFNFTCBpbiBDUjMgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlSGFsZkR1cGxleCgpIGZ1bmN0aW9uCisgKiAgICAgICAgIC0gQ29uZmlndXJlIFNUT1AgaW4gQ1IyIHVzaW5nIEByZWYgTExfVVNBUlRfU2V0U3RvcEJpdHNMZW5ndGgoKQorICogZnVuY3Rpb24KKyAqICAgICAgICAgLSBTZXQgSVJFTiBpbiBDUjMgdXNpbmcgQHJlZiBMTF9VU0FSVF9FbmFibGVJcmRhKCkgZnVuY3Rpb24KKyAqIEBub3RlICAgT3RoZXIgcmVtYWluaW5nIGNvbmZpZ3VyYXRpb25zIGl0ZW1zIHJlbGF0ZWQgdG8gSXJkYSBNb2RlCisgKiAgICAgICAgIChhcyBCYXVkIFJhdGUsIFdvcmQgbGVuZ3RoLCBQb3dlciBtb2RlLCAuLi4pIHNob3VsZCBiZSBzZXQgdXNpbmcKKyAqICAgICAgICAgZGVkaWNhdGVkIGZ1bmN0aW9ucworICogQHJtdG9sbCBDUjIgICAgICAgICAgTElORU4gICAgICAgICBMTF9VU0FSVF9Db25maWdJcmRhTW9kZVxuCisgKiAgICAgICAgIENSMiAgICAgICAgICBDTEtFTiAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0lyZGFNb2RlXG4KKyAqICAgICAgICAgQ1IyICAgICAgICAgIFNUT1AgICAgICAgICAgTExfVVNBUlRfQ29uZmlnSXJkYU1vZGVcbgorICogICAgICAgICBDUjMgICAgICAgICAgU0NFTiAgICAgICAgICBMTF9VU0FSVF9Db25maWdJcmRhTW9kZVxuCisgKiAgICAgICAgIENSMyAgICAgICAgICBIRFNFTCAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0lyZGFNb2RlXG4KKyAqICAgICAgICAgQ1IzICAgICAgICAgIElSRU4gICAgICAgICAgTExfVVNBUlRfQ29uZmlnSXJkYU1vZGUKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfQ29uZmlnSXJkYU1vZGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIC8qIEluIElSREEgbW9kZSwgdGhlIGZvbGxvd2luZyBiaXRzIG11c3QgYmUga2VwdCBjbGVhcmVkOgorICAtIExJTkVOLCBTVE9QIGFuZCBDTEtFTiBiaXRzIGluIHRoZSBVU0FSVF9DUjIgcmVnaXN0ZXIsCisgIC0gU0NFTiBhbmQgSERTRUwgYml0cyBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLgorICAqLworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjIsIChVU0FSVF9DUjJfTElORU4gfCBVU0FSVF9DUjJfQ0xLRU4gfCBVU0FSVF9DUjJfU1RPUCkpOworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjMsIChVU0FSVF9DUjNfU0NFTiB8IFVTQVJUX0NSM19IRFNFTCkpOworICAvKiBzZXQgdGhlIFVBUlQvVVNBUlQgaW4gSVJEQSBtb2RlICovCisgIFNFVF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19JUkVOKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFBlcmZvcm0gYmFzaWMgY29uZmlndXJhdGlvbiBvZiBVU0FSVCBmb3IgZW5hYmxpbmcgdXNlIGluIE11bHRpCisgKiBwcm9jZXNzb3IgTW9kZSAoc2V2ZXJhbCBVU0FSVHMgY29ubmVjdGVkIGluIGEgbmV0d29yaywgb25lIG9mIHRoZSBVU0FSVHMgY2FuCisgKiBiZSB0aGUgbWFzdGVyLCBpdHMgVFggb3V0cHV0IGNvbm5lY3RlZCB0byB0aGUgUlggaW5wdXRzIG9mIHRoZSBvdGhlciBzbGF2ZXMKKyAqIFVTQVJUcykuCisgKiBAbm90ZSAgIEluIE11bHRpUHJvY2Vzc29yIG1vZGUsIHRoZSBmb2xsb3dpbmcgYml0cyBtdXN0IGJlIGtlcHQgY2xlYXJlZDoKKyAqICAgICAgICAgICAtIExJTkVOIGJpdCBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLAorICogICAgICAgICAgIC0gQ0xLRU4gYml0IGluIHRoZSBVU0FSVF9DUjIgcmVnaXN0ZXIsCisgKiAgICAgICAgICAgLSBTQ0VOIGJpdCBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLAorICogICAgICAgICAgIC0gSVJFTiBiaXQgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3RlciwKKyAqICAgICAgICAgICAtIEhEU0VMIGJpdCBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLgorICogQG5vdGUgICBDYWxsIG9mIHRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byBmb2xsb3dpbmcgZnVuY3Rpb24gY2FsbAorICogc2VxdWVuY2UgOgorICogICAgICAgICAtIENsZWFyIExJTkVOIGluIENSMiB1c2luZyBAcmVmIExMX1VTQVJUX0Rpc2FibGVMSU4oKSBmdW5jdGlvbgorICogICAgICAgICAtIENsZWFyIENMS0VOIGluIENSMiB1c2luZyBAcmVmIExMX1VTQVJUX0Rpc2FibGVTQ0xLT3V0cHV0KCkgZnVuY3Rpb24KKyAqICAgICAgICAgLSBDbGVhciBTQ0VOIGluIENSMyB1c2luZyBAcmVmIExMX1VTQVJUX0Rpc2FibGVTbWFydGNhcmQoKSBmdW5jdGlvbgorICogICAgICAgICAtIENsZWFyIElSRU4gaW4gQ1IzIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZUlyZGEoKSBmdW5jdGlvbgorICogICAgICAgICAtIENsZWFyIEhEU0VMIGluIENSMyB1c2luZyBAcmVmIExMX1VTQVJUX0Rpc2FibGVIYWxmRHVwbGV4KCkgZnVuY3Rpb24KKyAqIEBub3RlICAgT3RoZXIgcmVtYWluaW5nIGNvbmZpZ3VyYXRpb25zIGl0ZW1zIHJlbGF0ZWQgdG8gTXVsdGkgcHJvY2Vzc29yIE1vZGUKKyAqICAgICAgICAgKGFzIEJhdWQgUmF0ZSwgV2FrZSBVcCBNZXRob2QsIE5vZGUgYWRkcmVzcywgLi4uKSBzaG91bGQgYmUgc2V0IHVzaW5nCisgKiAgICAgICAgIGRlZGljYXRlZCBmdW5jdGlvbnMKKyAqIEBybXRvbGwgQ1IyICAgICAgICAgIExJTkVOICAgICAgICAgTExfVVNBUlRfQ29uZmlnTXVsdGlQcm9jZXNzTW9kZVxuCisgKiAgICAgICAgIENSMiAgICAgICAgICBDTEtFTiAgICAgICAgIExMX1VTQVJUX0NvbmZpZ011bHRpUHJvY2Vzc01vZGVcbgorICogICAgICAgICBDUjMgICAgICAgICAgU0NFTiAgICAgICAgICBMTF9VU0FSVF9Db25maWdNdWx0aVByb2Nlc3NNb2RlXG4KKyAqICAgICAgICAgQ1IzICAgICAgICAgIEhEU0VMICAgICAgICAgTExfVVNBUlRfQ29uZmlnTXVsdGlQcm9jZXNzTW9kZVxuCisgKiAgICAgICAgIENSMyAgICAgICAgICBJUkVOICAgICAgICAgIExMX1VTQVJUX0NvbmZpZ011bHRpUHJvY2Vzc01vZGUKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfQ29uZmlnTXVsdGlQcm9jZXNzTW9kZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgLyogSW4gTXVsdGkgUHJvY2Vzc29yIG1vZGUsIHRoZSBmb2xsb3dpbmcgYml0cyBtdXN0IGJlIGtlcHQgY2xlYXJlZDoKKyAgLSBMSU5FTiBhbmQgQ0xLRU4gYml0cyBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLAorICAtIElSRU4sIFNDRU4gYW5kIEhEU0VMIGJpdHMgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3Rlci4KKyAgKi8KKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IyLCAoVVNBUlRfQ1IyX0xJTkVOIHwgVVNBUlRfQ1IyX0NMS0VOKSk7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMywgKFVTQVJUX0NSM19TQ0VOIHwgVVNBUlRfQ1IzX0hEU0VMIHwgVVNBUlRfQ1IzX0lSRU4pKTsKK30KKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUZfRkxBR19NYW5hZ2VtZW50IEZMQUdfTWFuYWdlbWVudAorICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIFBhcml0eSBFcnJvciBGbGFnIGlzIHNldCBvciBub3QKKyAqIEBybXRvbGwgSVNSICAgICAgICAgIFBFICAgICAgICAgICAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1BFCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfUEUoY29uc3QgVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+SVNSLCBVU0FSVF9JU1JfUEUpID09IChVU0FSVF9JU1JfUEUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgRnJhbWluZyBFcnJvciBGbGFnIGlzIHNldCBvciBub3QKKyAqIEBybXRvbGwgSVNSICAgICAgICAgIEZFICAgICAgICAgICAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX0ZFCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfRkUoY29uc3QgVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+SVNSLCBVU0FSVF9JU1JfRkUpID09IChVU0FSVF9JU1JfRkUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgTm9pc2UgZXJyb3IgZGV0ZWN0ZWQgRmxhZyBpcyBzZXQgb3Igbm90CisgKiBAcm10b2xsIElTUiAgICAgICAgICBORSAgICAgICAgICAgIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19ORQorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNBY3RpdmVGbGFnX05FKGNvbnN0IFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPklTUiwgVVNBUlRfSVNSX05FKSA9PSAoVVNBUlRfSVNSX05FKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIE92ZXJSdW4gRXJyb3IgRmxhZyBpcyBzZXQgb3Igbm90CisgKiBAcm10b2xsIElTUiAgICAgICAgICBPUkUgICAgICAgICAgIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19PUkUKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfT1JFKGNvbnN0IFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPklTUiwgVVNBUlRfSVNSX09SRSkgPT0gKFVTQVJUX0lTUl9PUkUpKSA/IDFVTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgSURMRSBsaW5lIGRldGVjdGVkIEZsYWcgaXMgc2V0IG9yIG5vdAorICogQHJtdG9sbCBJU1IgICAgICAgICAgSURMRSAgICAgICAgICBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfSURMRQorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX1VTQVJUX0lzQWN0aXZlRmxhZ19JRExFKGNvbnN0IFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPklTUiwgVVNBUlRfSVNSX0lETEUpID09IChVU0FSVF9JU1JfSURMRSkpID8gMVVMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOworfQorCisjZGVmaW5lIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19SWE5FIFwKKyAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1JYTkVfUlhGTkUgLyogUmVkZWZpbml0aW9uIGZvciBsZWdhY3kgcHVycG9zZSAqLworCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIFJlYWQgRGF0YSBSZWdpc3RlciBvciBVU0FSVCBSWCBGSUZPIE5vdCBFbXB0eSBGbGFnCisgKiBpcyBzZXQgb3Igbm90CisgKiBAbm90ZSAgIE1hY3JvIElTX1VBUlRfRklGT19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3IKKyAqIG5vdCBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAqIEBybXRvbGwgSVNSICAgICAgICAgIFJYTkVfUlhGTkUgICAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1JYTkVfUlhGTkUKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfUlhORV9SWEZORShjb25zdCBVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgcmV0dXJuICgKKyAgICAgIChSRUFEX0JJVChVU0FSVHgtPklTUiwgVVNBUlRfSVNSX1JYTkVfUlhGTkUpID09IChVU0FSVF9JU1JfUlhORV9SWEZORSkpCisgICAgICAgICAgPyAxVUwKKyAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgVHJhbnNtaXNzaW9uIENvbXBsZXRlIEZsYWcgaXMgc2V0IG9yIG5vdAorICogQHJtdG9sbCBJU1IgICAgICAgICAgVEMgICAgICAgICAgICBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfVEMKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzQWN0aXZlRmxhZ19UQyhjb25zdCBVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5JU1IsIFVTQVJUX0lTUl9UQykgPT0gKFVTQVJUX0lTUl9UQykpID8gMVVMIDogMFVMKTsKK30KKworI2RlZmluZSBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfVFhFIFwKKyAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1RYRV9UWEZORiAvKiBSZWRlZmluaXRpb24gZm9yIGxlZ2FjeSBwdXJwb3NlICovCisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgVHJhbnNtaXQgRGF0YSBSZWdpc3RlciBFbXB0eSBvciBVU0FSVCBUWCBGSUZPIE5vdAorICogRnVsbCBGbGFnIGlzIHNldCBvciBub3QKKyAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9GSUZPX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvcgorICogbm90IEZJRk8gbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICogQHJtdG9sbCBJU1IgICAgICAgICAgVFhFX1RYRk5GICAgICBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfVFhFX1RYRk5GCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfVVNBUlRfSXNBY3RpdmVGbGFnX1RYRV9UWEZORihjb25zdCBVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5JU1IsIFVTQVJUX0lTUl9UWEVfVFhGTkYpID09IChVU0FSVF9JU1JfVFhFX1RYRk5GKSkKKyAgICAgICAgICAgICAgPyAxVUwKKyAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIExJTiBCcmVhayBEZXRlY3Rpb24gRmxhZyBpcyBzZXQgb3Igbm90CisgKiBAbm90ZSAgIE1hY3JvIElTX1VBUlRfTElOX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvcgorICogbm90IExJTiBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICogQHJtdG9sbCBJU1IgICAgICAgICAgTEJERiAgICAgICAgICBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfTEJECisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfVVNBUlRfSXNBY3RpdmVGbGFnX0xCRChjb25zdCBVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5JU1IsIFVTQVJUX0lTUl9MQkRGKSA9PSAoVVNBUlRfSVNSX0xCREYpKSA/IDFVTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBDVFMgaW50ZXJydXB0IEZsYWcgaXMgc2V0IG9yIG5vdAorICogQG5vdGUgICBNYWNybyBJU19VQVJUX0hXRkxPV19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3IKKyAqIG5vdCBIYXJkd2FyZSBGbG93IGNvbnRyb2wgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAqIEBybXRvbGwgSVNSICAgICAgICAgIENUU0lGICAgICAgICAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX25DVFMKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfbkNUUyhjb25zdCBVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5JU1IsIFVTQVJUX0lTUl9DVFNJRikgPT0gKFVTQVJUX0lTUl9DVFNJRikpID8gMVVMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgQ1RTIEZsYWcgaXMgc2V0IG9yIG5vdAorICogQG5vdGUgICBNYWNybyBJU19VQVJUX0hXRkxPV19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3IKKyAqIG5vdCBIYXJkd2FyZSBGbG93IGNvbnRyb2wgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAqIEBybXRvbGwgSVNSICAgICAgICAgIENUUyAgICAgICAgICAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX0NUUworICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX1VTQVJUX0lzQWN0aXZlRmxhZ19DVFMoY29uc3QgVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+SVNSLCBVU0FSVF9JU1JfQ1RTKSA9PSAoVVNBUlRfSVNSX0NUUykpID8gMVVMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBSZWNlaXZlciBUaW1lIE91dCBGbGFnIGlzIHNldCBvciBub3QKKyAqIEBybXRvbGwgSVNSICAgICAgICAgIFJUT0YgICAgICAgICAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1JUTworICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX1VTQVJUX0lzQWN0aXZlRmxhZ19SVE8oY29uc3QgVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+SVNSLCBVU0FSVF9JU1JfUlRPRikgPT0gKFVTQVJUX0lTUl9SVE9GKSkgPyAxVUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgRW5kIE9mIEJsb2NrIEZsYWcgaXMgc2V0IG9yIG5vdAorICogQG5vdGUgICBNYWNybyBJU19TTUFSVENBUkRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yCisgKiBub3QgU21hcnRjYXJkIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgKiBAcm10b2xsIElTUiAgICAgICAgICBFT0JGICAgICAgICAgIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19FT0IKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfRU9CKGNvbnN0IFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPklTUiwgVVNBUlRfSVNSX0VPQkYpID09IChVU0FSVF9JU1JfRU9CRikpID8gMVVMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFNQSSBTbGF2ZSBVbmRlcnJ1biBlcnJvciBmbGFnIGlzIHNldCBvciBub3QKKyAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9TUElfU0xBVkVfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyCisgKiBvciBub3QgU1BJIFNsYXZlIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAqIEBybXRvbGwgSVNSICAgICAgICAgIFVEUiAgICAgICAgICAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1VEUgorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX1VTQVJUX0lzQWN0aXZlRmxhZ19VRFIoY29uc3QgVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+SVNSLCBVU0FSVF9JU1JfVURSKSA9PSAoVVNBUlRfSVNSX1VEUikpID8gMVVMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBBdXRvLUJhdWQgUmF0ZSBFcnJvciBGbGFnIGlzIHNldCBvciBub3QKKyAqIEBub3RlICAgTWFjcm8gSVNfVVNBUlRfQVVUT0JBVURSQVRFX0RFVEVDVElPTl9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvCisgKiBjaGVjayB3aGV0aGVyIG9yIG5vdCBBdXRvIEJhdWQgUmF0ZSBkZXRlY3Rpb24gZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlCisgKiBVU0FSVHggaW5zdGFuY2UuCisgKiBAcm10b2xsIElTUiAgICAgICAgICBBQlJFICAgICAgICAgIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19BQlJFCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfVVNBUlRfSXNBY3RpdmVGbGFnX0FCUkUoY29uc3QgVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+SVNSLCBVU0FSVF9JU1JfQUJSRSkgPT0gKFVTQVJUX0lTUl9BQlJFKSkgPyAxVUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgQXV0by1CYXVkIFJhdGUgRmxhZyBpcyBzZXQgb3Igbm90CisgKiBAbm90ZSAgIE1hY3JvIElTX1VTQVJUX0FVVE9CQVVEUkFURV9ERVRFQ1RJT05fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0bworICogY2hlY2sgd2hldGhlciBvciBub3QgQXV0byBCYXVkIFJhdGUgZGV0ZWN0aW9uIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZQorICogVVNBUlR4IGluc3RhbmNlLgorICogQHJtdG9sbCBJU1IgICAgICAgICAgQUJSRiAgICAgICAgICBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfQUJSCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfVVNBUlRfSXNBY3RpdmVGbGFnX0FCUihjb25zdCBVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5JU1IsIFVTQVJUX0lTUl9BQlJGKSA9PSAoVVNBUlRfSVNSX0FCUkYpKSA/IDFVTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBCdXN5IEZsYWcgaXMgc2V0IG9yIG5vdAorICogQHJtdG9sbCBJU1IgICAgICAgICAgQlVTWSAgICAgICAgICBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfQlVTWQorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX1VTQVJUX0lzQWN0aXZlRmxhZ19CVVNZKGNvbnN0IFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPklTUiwgVVNBUlRfSVNSX0JVU1kpID09IChVU0FSVF9JU1JfQlVTWSkpID8gMVVMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIENoYXJhY3RlciBNYXRjaCBGbGFnIGlzIHNldCBvciBub3QKKyAqIEBybXRvbGwgSVNSICAgICAgICAgIENNRiAgICAgICAgICAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX0NNCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfQ00oY29uc3QgVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+SVNSLCBVU0FSVF9JU1JfQ01GKSA9PSAoVVNBUlRfSVNSX0NNRikpID8gMVVMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBTZW5kIEJyZWFrIEZsYWcgaXMgc2V0IG9yIG5vdAorICogQHJtdG9sbCBJU1IgICAgICAgICAgU0JLRiAgICAgICAgICBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfU0JLCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfVVNBUlRfSXNBY3RpdmVGbGFnX1NCSyhjb25zdCBVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5JU1IsIFVTQVJUX0lTUl9TQktGKSA9PSAoVVNBUlRfSVNSX1NCS0YpKSA/IDFVTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBSZWNlaXZlIFdha2UgVXAgZnJvbSBtdXRlIG1vZGUgRmxhZyBpcyBzZXQgb3Igbm90CisgKiBAcm10b2xsIElTUiAgICAgICAgICBSV1UgICAgICAgICAgIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19SV1UKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfUldVKGNvbnN0IFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPklTUiwgVVNBUlRfSVNSX1JXVSkgPT0gKFVTQVJUX0lTUl9SV1UpKSA/IDFVTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgV2FrZSBVcCBmcm9tIHN0b3AgbW9kZSBGbGFnIGlzIHNldCBvciBub3QKKyAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9XQUtFVVBfRlJPTVNUT1BfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICogd2hldGhlciBvciBub3QgV2FrZS11cCBmcm9tIFN0b3AgbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4CisgKiBpbnN0YW5jZS4KKyAqIEBybXRvbGwgSVNSICAgICAgICAgIFdVRiAgICAgICAgICAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1dLVVAKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfV0tVUChjb25zdCBVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5JU1IsIFVTQVJUX0lTUl9XVUYpID09IChVU0FSVF9JU1JfV1VGKSkgPyAxVUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIFRyYW5zbWl0IEVuYWJsZSBBY2tub3dsZWRnZSBGbGFnIGlzIHNldCBvciBub3QKKyAqIEBybXRvbGwgSVNSICAgICAgICAgIFRFQUNLICAgICAgICAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1RFQUNLCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfVVNBUlRfSXNBY3RpdmVGbGFnX1RFQUNLKGNvbnN0IFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPklTUiwgVVNBUlRfSVNSX1RFQUNLKSA9PSAoVVNBUlRfSVNSX1RFQUNLKSkgPyAxVUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBSZWNlaXZlIEVuYWJsZSBBY2tub3dsZWRnZSBGbGFnIGlzIHNldCBvciBub3QKKyAqIEBybXRvbGwgSVNSICAgICAgICAgIFJFQUNLICAgICAgICAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1JFQUNLCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfVVNBUlRfSXNBY3RpdmVGbGFnX1JFQUNLKGNvbnN0IFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPklTUiwgVVNBUlRfSVNSX1JFQUNLKSA9PSAoVVNBUlRfSVNSX1JFQUNLKSkgPyAxVUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBUWCBGSUZPIEVtcHR5IEZsYWcgaXMgc2V0IG9yIG5vdAorICogQG5vdGUgICBNYWNybyBJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yCisgKiBub3QgRklGTyBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgKiBAcm10b2xsIElTUiAgICAgICAgICBUWEZFICAgICAgICAgIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19UWEZFCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfVVNBUlRfSXNBY3RpdmVGbGFnX1RYRkUoY29uc3QgVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+SVNSLCBVU0FSVF9JU1JfVFhGRSkgPT0gKFVTQVJUX0lTUl9UWEZFKSkgPyAxVUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgUlggRklGTyBGdWxsIEZsYWcgaXMgc2V0IG9yIG5vdAorICogQG5vdGUgICBNYWNybyBJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yCisgKiBub3QgRklGTyBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgKiBAcm10b2xsIElTUiAgICAgICAgICBSWEZGICAgICAgICAgIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19SWEZGCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfVVNBUlRfSXNBY3RpdmVGbGFnX1JYRkYoY29uc3QgVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+SVNSLCBVU0FSVF9JU1JfUlhGRikgPT0gKFVTQVJUX0lTUl9SWEZGKSkgPyAxVUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiB0aGUgU21hcnRjYXJkIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBCZWZvcmUgR3VhcmQgVGltZSBGbGFnCisgKiBpcyBzZXQgb3Igbm90CisgKiBAcm10b2xsIElTUiAgICAgICAgICBUQ0JHVCAgICAgICAgIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19UQ0JHVAorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX1VTQVJUX0lzQWN0aXZlRmxhZ19UQ0JHVChjb25zdCBVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5JU1IsIFVTQVJUX0lTUl9UQ0JHVCkgPT0gKFVTQVJUX0lTUl9UQ0JHVCkpID8gMVVMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgVFggRklGTyBUaHJlc2hvbGQgRmxhZyBpcyBzZXQgb3Igbm90CisgKiBAbm90ZSAgIE1hY3JvIElTX1VBUlRfRklGT19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3IKKyAqIG5vdCBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAqIEBybXRvbGwgSVNSICAgICAgICAgIFRYRlQgICAgICAgICAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1RYRlQKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfVFhGVChjb25zdCBVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5JU1IsIFVTQVJUX0lTUl9UWEZUKSA9PSAoVVNBUlRfSVNSX1RYRlQpKSA/IDFVTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBSWCBGSUZPIFRocmVzaG9sZCBGbGFnIGlzIHNldCBvciBub3QKKyAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9GSUZPX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvcgorICogbm90IEZJRk8gbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICogQHJtdG9sbCBJU1IgICAgICAgICAgUlhGVCAgICAgICAgICBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfUlhGVAorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX1VTQVJUX0lzQWN0aXZlRmxhZ19SWEZUKGNvbnN0IFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPklTUiwgVVNBUlRfSVNSX1JYRlQpID09IChVU0FSVF9JU1JfUlhGVCkpID8gMVVMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgQ2xlYXIgUGFyaXR5IEVycm9yIEZsYWcKKyAqIEBybXRvbGwgSUNSICAgICAgICAgIFBFQ0YgICAgICAgICAgTExfVVNBUlRfQ2xlYXJGbGFnX1BFCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0NsZWFyRmxhZ19QRShVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgV1JJVEVfUkVHKFVTQVJUeC0+SUNSLCBVU0FSVF9JQ1JfUEVDRik7Cit9CisKKy8qKgorICogQGJyaWVmICBDbGVhciBGcmFtaW5nIEVycm9yIEZsYWcKKyAqIEBybXRvbGwgSUNSICAgICAgICAgIEZFQ0YgICAgICAgICAgTExfVVNBUlRfQ2xlYXJGbGFnX0ZFCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0NsZWFyRmxhZ19GRShVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgV1JJVEVfUkVHKFVTQVJUeC0+SUNSLCBVU0FSVF9JQ1JfRkVDRik7Cit9CisKKy8qKgorICogQGJyaWVmICBDbGVhciBOb2lzZSBFcnJvciBkZXRlY3RlZCBGbGFnCisgKiBAcm10b2xsIElDUiAgICAgICAgICBORUNGICAgICAgICAgIExMX1VTQVJUX0NsZWFyRmxhZ19ORQorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9DbGVhckZsYWdfTkUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIFdSSVRFX1JFRyhVU0FSVHgtPklDUiwgVVNBUlRfSUNSX05FQ0YpOworfQorCisvKioKKyAqIEBicmllZiAgQ2xlYXIgT3ZlclJ1biBFcnJvciBGbGFnCisgKiBAcm10b2xsIElDUiAgICAgICAgICBPUkVDRiAgICAgICAgIExMX1VTQVJUX0NsZWFyRmxhZ19PUkUKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfQ2xlYXJGbGFnX09SRShVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgV1JJVEVfUkVHKFVTQVJUeC0+SUNSLCBVU0FSVF9JQ1JfT1JFQ0YpOworfQorCisvKioKKyAqIEBicmllZiAgQ2xlYXIgSURMRSBsaW5lIGRldGVjdGVkIEZsYWcKKyAqIEBybXRvbGwgSUNSICAgICAgICAgIElETEVDRiAgICAgICAgTExfVVNBUlRfQ2xlYXJGbGFnX0lETEUKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfQ2xlYXJGbGFnX0lETEUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIFdSSVRFX1JFRyhVU0FSVHgtPklDUiwgVVNBUlRfSUNSX0lETEVDRik7Cit9CisKKy8qKgorICogQGJyaWVmICBDbGVhciBUWCBGSUZPIEVtcHR5IEZsYWcKKyAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9GSUZPX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvcgorICogbm90IEZJRk8gbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICogQHJtdG9sbCBJQ1IgICAgICAgICAgVFhGRUNGICAgICAgICBMTF9VU0FSVF9DbGVhckZsYWdfVFhGRQorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9DbGVhckZsYWdfVFhGRShVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgV1JJVEVfUkVHKFVTQVJUeC0+SUNSLCBVU0FSVF9JQ1JfVFhGRUNGKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENsZWFyIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBGbGFnCisgKiBAcm10b2xsIElDUiAgICAgICAgICBUQ0NGICAgICAgICAgIExMX1VTQVJUX0NsZWFyRmxhZ19UQworICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9DbGVhckZsYWdfVEMoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIFdSSVRFX1JFRyhVU0FSVHgtPklDUiwgVVNBUlRfSUNSX1RDQ0YpOworfQorCisvKioKKyAqIEBicmllZiAgQ2xlYXIgU21hcnRjYXJkIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBCZWZvcmUgR3VhcmQgVGltZSBGbGFnCisgKiBAcm10b2xsIElDUiAgICAgICAgICBUQ0JHVENGICAgICAgIExMX1VTQVJUX0NsZWFyRmxhZ19UQ0JHVAorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9DbGVhckZsYWdfVENCR1QoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIFdSSVRFX1JFRyhVU0FSVHgtPklDUiwgVVNBUlRfSUNSX1RDQkdUQ0YpOworfQorCisvKioKKyAqIEBicmllZiAgQ2xlYXIgTElOIEJyZWFrIERldGVjdGlvbiBGbGFnCisgKiBAbm90ZSAgIE1hY3JvIElTX1VBUlRfTElOX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvcgorICogbm90IExJTiBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICogQHJtdG9sbCBJQ1IgICAgICAgICAgTEJEQ0YgICAgICAgICBMTF9VU0FSVF9DbGVhckZsYWdfTEJECisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0NsZWFyRmxhZ19MQkQoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIFdSSVRFX1JFRyhVU0FSVHgtPklDUiwgVVNBUlRfSUNSX0xCRENGKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENsZWFyIENUUyBJbnRlcnJ1cHQgRmxhZworICogQG5vdGUgICBNYWNybyBJU19VQVJUX0hXRkxPV19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3IKKyAqIG5vdCBIYXJkd2FyZSBGbG93IGNvbnRyb2wgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAqIEBybXRvbGwgSUNSICAgICAgICAgIENUU0NGICAgICAgICAgTExfVVNBUlRfQ2xlYXJGbGFnX25DVFMKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfQ2xlYXJGbGFnX25DVFMoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIFdSSVRFX1JFRyhVU0FSVHgtPklDUiwgVVNBUlRfSUNSX0NUU0NGKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENsZWFyIFJlY2VpdmVyIFRpbWUgT3V0IEZsYWcKKyAqIEBybXRvbGwgSUNSICAgICAgICAgIFJUT0NGICAgICAgICAgTExfVVNBUlRfQ2xlYXJGbGFnX1JUTworICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9DbGVhckZsYWdfUlRPKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICBXUklURV9SRUcoVVNBUlR4LT5JQ1IsIFVTQVJUX0lDUl9SVE9DRik7Cit9CisKKy8qKgorICogQGJyaWVmICBDbGVhciBFbmQgT2YgQmxvY2sgRmxhZworICogQG5vdGUgICBNYWNybyBJU19TTUFSVENBUkRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yCisgKiBub3QgU21hcnRjYXJkIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgKiBAcm10b2xsIElDUiAgICAgICAgICBFT0JDRiAgICAgICAgIExMX1VTQVJUX0NsZWFyRmxhZ19FT0IKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfQ2xlYXJGbGFnX0VPQihVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgV1JJVEVfUkVHKFVTQVJUeC0+SUNSLCBVU0FSVF9JQ1JfRU9CQ0YpOworfQorCisvKioKKyAqIEBicmllZiAgQ2xlYXIgU1BJIFNsYXZlIFVuZGVycnVuIEZsYWcKKyAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9TUElfU0xBVkVfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyCisgKiBvciBub3QgU1BJIFNsYXZlIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAqIEBybXRvbGwgSUNSICAgICAgICAgIFVEUkNGICAgICAgICAgTExfVVNBUlRfQ2xlYXJGbGFnX1VEUgorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9DbGVhckZsYWdfVURSKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICBXUklURV9SRUcoVVNBUlR4LT5JQ1IsIFVTQVJUX0lDUl9VRFJDRik7Cit9CisKKy8qKgorICogQGJyaWVmICBDbGVhciBDaGFyYWN0ZXIgTWF0Y2ggRmxhZworICogQHJtdG9sbCBJQ1IgICAgICAgICAgQ01DRiAgICAgICAgICBMTF9VU0FSVF9DbGVhckZsYWdfQ00KKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfQ2xlYXJGbGFnX0NNKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICBXUklURV9SRUcoVVNBUlR4LT5JQ1IsIFVTQVJUX0lDUl9DTUNGKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENsZWFyIFdha2UgVXAgZnJvbSBzdG9wIG1vZGUgRmxhZworICogQG5vdGUgICBNYWNybyBJU19VQVJUX1dBS0VVUF9GUk9NU1RPUF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgKiB3aGV0aGVyIG9yIG5vdCBXYWtlLXVwIGZyb20gU3RvcCBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHgKKyAqIGluc3RhbmNlLgorICogQHJtdG9sbCBJQ1IgICAgICAgICAgV1VDRiAgICAgICAgICBMTF9VU0FSVF9DbGVhckZsYWdfV0tVUAorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9DbGVhckZsYWdfV0tVUChVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgV1JJVEVfUkVHKFVTQVJUeC0+SUNSLCBVU0FSVF9JQ1JfV1VDRik7Cit9CisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VGX0lUX01hbmFnZW1lbnQgSVRfTWFuYWdlbWVudAorICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiAgRW5hYmxlIElETEUgSW50ZXJydXB0CisgKiBAcm10b2xsIENSMSAgICAgICAgICBJRExFSUUgICAgICAgIExMX1VTQVJUX0VuYWJsZUlUX0lETEUKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlSVRfSURMRShVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgQVRPTUlDX1NFVF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9JRExFSUUpOworfQorCisjZGVmaW5lIExMX1VTQVJUX0VuYWJsZUlUX1JYTkUgXAorICBMTF9VU0FSVF9FbmFibGVJVF9SWE5FX1JYRk5FIC8qIFJlZGVmaW5pdGlvbiBmb3IgbGVnYWN5IHB1cnBvc2UgKi8KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBSWCBOb3QgRW1wdHkgYW5kIFJYIEZJRk8gTm90IEVtcHR5IEludGVycnVwdAorICogQG5vdGUgICBNYWNybyBJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yCisgKiBub3QgRklGTyBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgKiBAcm10b2xsIENSMSAgICAgICAgUlhORUlFX1JYRk5FSUUgIExMX1VTQVJUX0VuYWJsZUlUX1JYTkVfUlhGTkUKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlSVRfUlhORV9SWEZORShVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgQVRPTUlDX1NFVF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSk7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgVHJhbnNtaXNzaW9uIENvbXBsZXRlIEludGVycnVwdAorICogQHJtdG9sbCBDUjEgICAgICAgICAgVENJRSAgICAgICAgICBMTF9VU0FSVF9FbmFibGVJVF9UQworICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVJVF9UQyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgQVRPTUlDX1NFVF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9UQ0lFKTsKK30KKworI2RlZmluZSBMTF9VU0FSVF9FbmFibGVJVF9UWEUgXAorICBMTF9VU0FSVF9FbmFibGVJVF9UWEVfVFhGTkYgLyogUmVkZWZpbml0aW9uIGZvciBsZWdhY3kgcHVycG9zZSAqLworCisvKioKKyAqIEBicmllZiAgRW5hYmxlIFRYIEVtcHR5IGFuZCBUWCBGSUZPIE5vdCBGdWxsIEludGVycnVwdAorICogQG5vdGUgICBNYWNybyBJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yCisgKiBub3QgRklGTyBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgKiBAcm10b2xsIENSMSAgICAgICAgIFRYRUlFX1RYRk5GSUUgIExMX1VTQVJUX0VuYWJsZUlUX1RYRV9UWEZORgorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVJVF9UWEVfVFhGTkYoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIEFUT01JQ19TRVRfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfVFhFSUVfVFhGTkZJRSk7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgUGFyaXR5IEVycm9yIEludGVycnVwdAorICogQHJtdG9sbCBDUjEgICAgICAgICAgUEVJRSAgICAgICAgICBMTF9VU0FSVF9FbmFibGVJVF9QRQorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVJVF9QRShVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgQVRPTUlDX1NFVF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9QRUlFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBDaGFyYWN0ZXIgTWF0Y2ggSW50ZXJydXB0CisgKiBAcm10b2xsIENSMSAgICAgICAgICBDTUlFICAgICAgICAgIExMX1VTQVJUX0VuYWJsZUlUX0NNCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZUlUX0NNKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICBBVE9NSUNfU0VUX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX0NNSUUpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIFJlY2VpdmVyIFRpbWVvdXQgSW50ZXJydXB0CisgKiBAcm10b2xsIENSMSAgICAgICAgICBSVE9JRSAgICAgICAgIExMX1VTQVJUX0VuYWJsZUlUX1JUTworICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVJVF9SVE8oVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIEFUT01JQ19TRVRfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUlRPSUUpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIEVuZCBPZiBCbG9jayBJbnRlcnJ1cHQKKyAqIEBub3RlICAgTWFjcm8gSVNfU01BUlRDQVJEX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvcgorICogbm90IFNtYXJ0Y2FyZCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICogQHJtdG9sbCBDUjEgICAgICAgICAgRU9CSUUgICAgICAgICBMTF9VU0FSVF9FbmFibGVJVF9FT0IKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlSVRfRU9CKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICBBVE9NSUNfU0VUX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX0VPQklFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBUWCBGSUZPIEVtcHR5IEludGVycnVwdAorICogQG5vdGUgICBNYWNybyBJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yCisgKiBub3QgRklGTyBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgKiBAcm10b2xsIENSMSAgICAgICAgICBUWEZFSUUgICAgICAgIExMX1VTQVJUX0VuYWJsZUlUX1RYRkUKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlSVRfVFhGRShVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgQVRPTUlDX1NFVF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9UWEZFSUUpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIFJYIEZJRk8gRnVsbCBJbnRlcnJ1cHQKKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIFJYRkZJRSAgICAgICAgTExfVVNBUlRfRW5hYmxlSVRfUlhGRgorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVJVF9SWEZGKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICBBVE9NSUNfU0VUX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1JYRkZJRSk7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgTElOIEJyZWFrIERldGVjdGlvbiBJbnRlcnJ1cHQKKyAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9MSU5fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yCisgKiBub3QgTElOIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgKiBAcm10b2xsIENSMiAgICAgICAgICBMQkRJRSAgICAgICAgIExMX1VTQVJUX0VuYWJsZUlUX0xCRAorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVJVF9MQkQoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9MQkRJRSk7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgRXJyb3IgSW50ZXJydXB0CisgKiBAbm90ZSAgIFdoZW4gc2V0LCBFcnJvciBJbnRlcnJ1cHQgRW5hYmxlIEJpdCBpcyBlbmFibGluZyBpbnRlcnJ1cHQgZ2VuZXJhdGlvbgorICogaW4gY2FzZSBvZiBhIGZyYW1pbmcgZXJyb3IsIG92ZXJydW4gZXJyb3Igb3Igbm9pc2UgZmxhZyAoRkU9MSBvciBPUkU9MSBvcgorICogTkY9MSBpbiB0aGUgVVNBUlR4X0lTUiByZWdpc3RlcikuIDA6IEludGVycnVwdCBpcyBpbmhpYml0ZWQgMTogQW4gaW50ZXJydXB0CisgKiBpcyBnZW5lcmF0ZWQgd2hlbiBGRT0xIG9yIE9SRT0xIG9yIE5GPTEgaW4gdGhlIFVTQVJUeF9JU1IgcmVnaXN0ZXIuCisgKiBAcm10b2xsIENSMyAgICAgICAgICBFSUUgICAgICAgICAgIExMX1VTQVJUX0VuYWJsZUlUX0VSUk9SCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZUlUX0VSUk9SKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICBBVE9NSUNfU0VUX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX0VJRSk7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgQ1RTIEludGVycnVwdAorICogQG5vdGUgICBNYWNybyBJU19VQVJUX0hXRkxPV19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3IKKyAqIG5vdCBIYXJkd2FyZSBGbG93IGNvbnRyb2wgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAqIEBybXRvbGwgQ1IzICAgICAgICAgIENUU0lFICAgICAgICAgTExfVVNBUlRfRW5hYmxlSVRfQ1RTCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZUlUX0NUUyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgQVRPTUlDX1NFVF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19DVFNJRSk7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgV2FrZSBVcCBmcm9tIFN0b3AgTW9kZSBJbnRlcnJ1cHQKKyAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9XQUtFVVBfRlJPTVNUT1BfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICogd2hldGhlciBvciBub3QgV2FrZS11cCBmcm9tIFN0b3AgbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4CisgKiBpbnN0YW5jZS4KKyAqIEBybXRvbGwgQ1IzICAgICAgICAgIFdVRklFICAgICAgICAgTExfVVNBUlRfRW5hYmxlSVRfV0tVUAorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVJVF9XS1VQKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICBBVE9NSUNfU0VUX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX1dVRklFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBUWCBGSUZPIFRocmVzaG9sZCBJbnRlcnJ1cHQKKyAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9GSUZPX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvcgorICogbm90IEZJRk8gbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICogQHJtdG9sbCBDUjMgICAgICAgICAgVFhGVElFICAgICAgICBMTF9VU0FSVF9FbmFibGVJVF9UWEZUCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZUlUX1RYRlQoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIEFUT01JQ19TRVRfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfVFhGVElFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBTbWFydGNhcmQgVHJhbnNtaXNzaW9uIENvbXBsZXRlIEJlZm9yZSBHdWFyZCBUaW1lIEludGVycnVwdAorICogQG5vdGUgICBNYWNybyBJU19TTUFSVENBUkRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yCisgKiBub3QgU21hcnRjYXJkIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgKiBAcm10b2xsIENSMyAgICAgICAgICBUQ0JHVElFICAgICAgIExMX1VTQVJUX0VuYWJsZUlUX1RDQkdUCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZUlUX1RDQkdUKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICBBVE9NSUNfU0VUX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX1RDQkdUSUUpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIFJYIEZJRk8gVGhyZXNob2xkIEludGVycnVwdAorICogQG5vdGUgICBNYWNybyBJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yCisgKiBub3QgRklGTyBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgKiBAcm10b2xsIENSMyAgICAgICAgICBSWEZUSUUgICAgICAgIExMX1VTQVJUX0VuYWJsZUlUX1JYRlQKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlSVRfUlhGVChVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgQVRPTUlDX1NFVF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19SWEZUSUUpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBJRExFIEludGVycnVwdAorICogQHJtdG9sbCBDUjEgICAgICAgICAgSURMRUlFICAgICAgICBMTF9VU0FSVF9EaXNhYmxlSVRfSURMRQorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlSVRfSURMRShVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgQVRPTUlDX0NMRUFSX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX0lETEVJRSk7Cit9CisKKyNkZWZpbmUgTExfVVNBUlRfRGlzYWJsZUlUX1JYTkUgXAorICBMTF9VU0FSVF9EaXNhYmxlSVRfUlhORV9SWEZORSAvKiBSZWRlZmluaXRpb24gZm9yIGxlZ2FjeSBwdXJwb3NlICovCisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIFJYIE5vdCBFbXB0eSBhbmQgUlggRklGTyBOb3QgRW1wdHkgSW50ZXJydXB0CisgKiBAbm90ZSAgIE1hY3JvIElTX1VBUlRfRklGT19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3IKKyAqIG5vdCBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAqIEBybXRvbGwgQ1IxICAgICAgICBSWE5FSUVfUlhGTkVJRSAgTExfVVNBUlRfRGlzYWJsZUlUX1JYTkVfUlhGTkUKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZUlUX1JYTkVfUlhGTkUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIEFUT01JQ19DTEVBUl9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSk7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBJbnRlcnJ1cHQKKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIFRDSUUgICAgICAgICAgTExfVVNBUlRfRGlzYWJsZUlUX1RDCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVJVF9UQyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgQVRPTUlDX0NMRUFSX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1RDSUUpOworfQorCisjZGVmaW5lIExMX1VTQVJUX0Rpc2FibGVJVF9UWEUgXAorICBMTF9VU0FSVF9EaXNhYmxlSVRfVFhFX1RYRk5GIC8qIFJlZGVmaW5pdGlvbiBmb3IgbGVnYWN5IHB1cnBvc2UgKi8KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgVFggRW1wdHkgYW5kIFRYIEZJRk8gTm90IEZ1bGwgSW50ZXJydXB0CisgKiBAbm90ZSAgIE1hY3JvIElTX1VBUlRfRklGT19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3IKKyAqIG5vdCBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAqIEBybXRvbGwgQ1IxICAgICAgICBUWEVJRV9UWEZORklFICBMTF9VU0FSVF9EaXNhYmxlSVRfVFhFX1RYRk5GCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVJVF9UWEVfVFhGTkYoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIEFUT01JQ19DTEVBUl9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9UWEVJRV9UWEZORklFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgUGFyaXR5IEVycm9yIEludGVycnVwdAorICogQHJtdG9sbCBDUjEgICAgICAgICAgUEVJRSAgICAgICAgICBMTF9VU0FSVF9EaXNhYmxlSVRfUEUKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZUlUX1BFKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICBBVE9NSUNfQ0xFQVJfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUEVJRSk7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIENoYXJhY3RlciBNYXRjaCBJbnRlcnJ1cHQKKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIENNSUUgICAgICAgICAgTExfVVNBUlRfRGlzYWJsZUlUX0NNCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVJVF9DTShVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgQVRPTUlDX0NMRUFSX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX0NNSUUpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBSZWNlaXZlciBUaW1lb3V0IEludGVycnVwdAorICogQHJtdG9sbCBDUjEgICAgICAgICAgUlRPSUUgICAgICAgICBMTF9VU0FSVF9EaXNhYmxlSVRfUlRPCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVJVF9SVE8oVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIEFUT01JQ19DTEVBUl9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9SVE9JRSk7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIEVuZCBPZiBCbG9jayBJbnRlcnJ1cHQKKyAqIEBub3RlICAgTWFjcm8gSVNfU01BUlRDQVJEX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvcgorICogbm90IFNtYXJ0Y2FyZCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICogQHJtdG9sbCBDUjEgICAgICAgICAgRU9CSUUgICAgICAgICBMTF9VU0FSVF9EaXNhYmxlSVRfRU9CCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVJVF9FT0IoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIEFUT01JQ19DTEVBUl9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9FT0JJRSk7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIFRYIEZJRk8gRW1wdHkgSW50ZXJydXB0CisgKiBAbm90ZSAgIE1hY3JvIElTX1VBUlRfRklGT19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3IKKyAqIG5vdCBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIFRYRkVJRSAgICAgICAgTExfVVNBUlRfRGlzYWJsZUlUX1RYRkUKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZUlUX1RYRkUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIEFUT01JQ19DTEVBUl9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9UWEZFSUUpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBSWCBGSUZPIEZ1bGwgSW50ZXJydXB0CisgKiBAbm90ZSAgIE1hY3JvIElTX1VBUlRfRklGT19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3IKKyAqIG5vdCBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIFJYRkZJRSAgICAgICAgTExfVVNBUlRfRGlzYWJsZUlUX1JYRkYKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZUlUX1JYRkYoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIEFUT01JQ19DTEVBUl9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9SWEZGSUUpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBMSU4gQnJlYWsgRGV0ZWN0aW9uIEludGVycnVwdAorICogQG5vdGUgICBNYWNybyBJU19VQVJUX0xJTl9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3IKKyAqIG5vdCBMSU4gZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAqIEBybXRvbGwgQ1IyICAgICAgICAgIExCRElFICAgICAgICAgTExfVVNBUlRfRGlzYWJsZUlUX0xCRAorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlSVRfTEJEKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9MQkRJRSk7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIEVycm9yIEludGVycnVwdAorICogQG5vdGUgICBXaGVuIHNldCwgRXJyb3IgSW50ZXJydXB0IEVuYWJsZSBCaXQgaXMgZW5hYmxpbmcgaW50ZXJydXB0IGdlbmVyYXRpb24KKyAqIGluIGNhc2Ugb2YgYSBmcmFtaW5nIGVycm9yLCBvdmVycnVuIGVycm9yIG9yIG5vaXNlIGZsYWcgKEZFPTEgb3IgT1JFPTEgb3IKKyAqIE5GPTEgaW4gdGhlIFVTQVJUeF9JU1IgcmVnaXN0ZXIpLiAwOiBJbnRlcnJ1cHQgaXMgaW5oaWJpdGVkIDE6IEFuIGludGVycnVwdAorICogaXMgZ2VuZXJhdGVkIHdoZW4gRkU9MSBvciBPUkU9MSBvciBORj0xIGluIHRoZSBVU0FSVHhfSVNSIHJlZ2lzdGVyLgorICogQHJtdG9sbCBDUjMgICAgICAgICAgRUlFICAgICAgICAgICBMTF9VU0FSVF9EaXNhYmxlSVRfRVJST1IKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZUlUX0VSUk9SKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICBBVE9NSUNfQ0xFQVJfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgQ1RTIEludGVycnVwdAorICogQG5vdGUgICBNYWNybyBJU19VQVJUX0hXRkxPV19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3IKKyAqIG5vdCBIYXJkd2FyZSBGbG93IGNvbnRyb2wgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAqIEBybXRvbGwgQ1IzICAgICAgICAgIENUU0lFICAgICAgICAgTExfVVNBUlRfRGlzYWJsZUlUX0NUUworICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlSVRfQ1RTKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICBBVE9NSUNfQ0xFQVJfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfQ1RTSUUpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBXYWtlIFVwIGZyb20gU3RvcCBNb2RlIEludGVycnVwdAorICogQG5vdGUgICBNYWNybyBJU19VQVJUX1dBS0VVUF9GUk9NU1RPUF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgKiB3aGV0aGVyIG9yIG5vdCBXYWtlLXVwIGZyb20gU3RvcCBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHgKKyAqIGluc3RhbmNlLgorICogQHJtdG9sbCBDUjMgICAgICAgICAgV1VGSUUgICAgICAgICBMTF9VU0FSVF9EaXNhYmxlSVRfV0tVUAorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlSVRfV0tVUChVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgQVRPTUlDX0NMRUFSX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX1dVRklFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgVFggRklGTyBUaHJlc2hvbGQgSW50ZXJydXB0CisgKiBAbm90ZSAgIE1hY3JvIElTX1VBUlRfRklGT19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3IKKyAqIG5vdCBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAqIEBybXRvbGwgQ1IzICAgICAgICAgIFRYRlRJRSAgICAgICAgTExfVVNBUlRfRGlzYWJsZUlUX1RYRlQKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZUlUX1RYRlQoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIEFUT01JQ19DTEVBUl9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19UWEZUSUUpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBTbWFydGNhcmQgVHJhbnNtaXNzaW9uIENvbXBsZXRlIEJlZm9yZSBHdWFyZCBUaW1lIEludGVycnVwdAorICogQG5vdGUgICBNYWNybyBJU19TTUFSVENBUkRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yCisgKiBub3QgU21hcnRjYXJkIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgKiBAcm10b2xsIENSMyAgICAgICAgICBUQ0JHVElFICAgICAgIExMX1VTQVJUX0Rpc2FibGVJVF9UQ0JHVAorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlSVRfVENCR1QoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIEFUT01JQ19DTEVBUl9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19UQ0JHVElFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgUlggRklGTyBUaHJlc2hvbGQgSW50ZXJydXB0CisgKiBAbm90ZSAgIE1hY3JvIElTX1VBUlRfRklGT19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3IKKyAqIG5vdCBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAqIEBybXRvbGwgQ1IzICAgICAgICAgIFJYRlRJRSAgICAgICAgTExfVVNBUlRfRGlzYWJsZUlUX1JYRlQKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZUlUX1JYRlQoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIEFUT01JQ19DTEVBUl9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19SWEZUSUUpOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIElETEUgSW50ZXJydXB0ICBzb3VyY2UgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIElETEVJRSAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkSVRfSURMRQorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX1VTQVJUX0lzRW5hYmxlZElUX0lETEUoY29uc3QgVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfSURMRUlFKSA9PSAoVVNBUlRfQ1IxX0lETEVJRSkpCisgICAgICAgICAgICAgID8gMVVMCisgICAgICAgICAgICAgIDogMFVMKTsKK30KKworI2RlZmluZSBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9SWE5FIFwKKyAgTExfVVNBUlRfSXNFbmFibGVkSVRfUlhORV9SWEZORSAvKiBSZWRlZmluaXRpb24gZm9yIGxlZ2FjeSBwdXJwb3NlICovCisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgUlggTm90IEVtcHR5IGFuZCBVU0FSVCBSWCBGSUZPIE5vdCBFbXB0eSBJbnRlcnJ1cHQKKyAqIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgKiBAbm90ZSAgIE1hY3JvIElTX1VBUlRfRklGT19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3IKKyAqIG5vdCBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAqIEBybXRvbGwgQ1IxICAgICAgICBSWE5FSUVfUlhGTkVJRSAgTExfVVNBUlRfSXNFbmFibGVkSVRfUlhORV9SWEZORQorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX1VTQVJUX0lzRW5hYmxlZElUX1JYTkVfUlhGTkUoY29uc3QgVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUlhORUlFX1JYRk5FSUUpID09CisgICAgICAgICAgIChVU0FSVF9DUjFfUlhORUlFX1JYRk5FSUUpKQorICAgICAgICAgICAgICA/IDFVTAorICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgVHJhbnNtaXNzaW9uIENvbXBsZXRlIEludGVycnVwdCBpcyBlbmFibGVkIG9yCisgKiBkaXNhYmxlZC4KKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIFRDSUUgICAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkSVRfVEMKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZElUX1RDKGNvbnN0IFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1RDSUUpID09IChVU0FSVF9DUjFfVENJRSkpID8gMVVMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOworfQorCisjZGVmaW5lIExMX1VTQVJUX0lzRW5hYmxlZElUX1RYRSBcCisgIExMX1VTQVJUX0lzRW5hYmxlZElUX1RYRV9UWEZORiAvKiBSZWRlZmluaXRpb24gZm9yIGxlZ2FjeSBwdXJwb3NlICovCisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgVFggRW1wdHkgYW5kIFVTQVJUIFRYIEZJRk8gTm90IEZ1bGwgSW50ZXJydXB0IGlzCisgKiBlbmFibGVkIG9yIGRpc2FibGVkCisgKiBAbm90ZSAgIE1hY3JvIElTX1VBUlRfRklGT19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3IKKyAqIG5vdCBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAqIEBybXRvbGwgQ1IxICAgICAgICAgVFhFSUVfVFhGTkZJRSAgTExfVVNBUlRfSXNFbmFibGVkSVRfVFhFX1RYRk5GCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfVVNBUlRfSXNFbmFibGVkSVRfVFhFX1RYRk5GKGNvbnN0IFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1RYRUlFX1RYRk5GSUUpID09CisgICAgICAgICAgIChVU0FSVF9DUjFfVFhFSUVfVFhGTkZJRSkpCisgICAgICAgICAgICAgID8gMVVMCisgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBQYXJpdHkgRXJyb3IgSW50ZXJydXB0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgKiBAcm10b2xsIENSMSAgICAgICAgICBQRUlFICAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZElUX1BFCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9QRShjb25zdCBVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9QRUlFKSA9PSAoVVNBUlRfQ1IxX1BFSUUpKSA/IDFVTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBDaGFyYWN0ZXIgTWF0Y2ggSW50ZXJydXB0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgKiBAcm10b2xsIENSMSAgICAgICAgICBDTUlFICAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZElUX0NNCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9DTShjb25zdCBVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9DTUlFKSA9PSAoVVNBUlRfQ1IxX0NNSUUpKSA/IDFVTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBSZWNlaXZlciBUaW1lb3V0IEludGVycnVwdCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICogQHJtdG9sbCBDUjEgICAgICAgICAgUlRPSUUgICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9SVE8KKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZElUX1JUTyhjb25zdCBVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9SVE9JRSkgPT0gKFVTQVJUX0NSMV9SVE9JRSkpID8gMVVMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgRW5kIE9mIEJsb2NrIEludGVycnVwdCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICogQG5vdGUgICBNYWNybyBJU19TTUFSVENBUkRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yCisgKiBub3QgU21hcnRjYXJkIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgKiBAcm10b2xsIENSMSAgICAgICAgICBFT0JJRSAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZElUX0VPQgorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkSVRfRU9CKGNvbnN0IFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX0VPQklFKSA9PSAoVVNBUlRfQ1IxX0VPQklFKSkgPyAxVUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBUWCBGSUZPIEVtcHR5IEludGVycnVwdCBpcyBlbmFibGVkIG9yIGRpc2FibGVkCisgKiBAbm90ZSAgIE1hY3JvIElTX1VBUlRfRklGT19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3IKKyAqIG5vdCBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAqIEBybXRvbGwgQ1IxICAgICAgICAgIFRYRkVJRSAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkSVRfVFhGRQorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX1VTQVJUX0lzRW5hYmxlZElUX1RYRkUoY29uc3QgVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfVFhGRUlFKSA9PSAoVVNBUlRfQ1IxX1RYRkVJRSkpCisgICAgICAgICAgICAgID8gMVVMCisgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBSWCBGSUZPIEZ1bGwgSW50ZXJydXB0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQKKyAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9GSUZPX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvcgorICogbm90IEZJRk8gbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICogQHJtdG9sbCBDUjEgICAgICAgICAgUlhGRklFICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9SWEZGCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfVVNBUlRfSXNFbmFibGVkSVRfUlhGRihjb25zdCBVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9SWEZGSUUpID09IChVU0FSVF9DUjFfUlhGRklFKSkKKyAgICAgICAgICAgICAgPyAxVUwKKyAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIExJTiBCcmVhayBEZXRlY3Rpb24gSW50ZXJydXB0IGlzIGVuYWJsZWQgb3IKKyAqIGRpc2FibGVkLgorICogQG5vdGUgICBNYWNybyBJU19VQVJUX0xJTl9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3IKKyAqIG5vdCBMSU4gZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAqIEBybXRvbGwgQ1IyICAgICAgICAgIExCRElFICAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkSVRfTEJECisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9MQkQoY29uc3QgVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfTEJESUUpID09IChVU0FSVF9DUjJfTEJESUUpKSA/IDFVTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIEVycm9yIEludGVycnVwdCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICogQHJtdG9sbCBDUjMgICAgICAgICAgRUlFICAgICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9FUlJPUgorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX1VTQVJUX0lzRW5hYmxlZElUX0VSUk9SKGNvbnN0IFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX0VJRSkgPT0gKFVTQVJUX0NSM19FSUUpKSA/IDFVTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgQ1RTIEludGVycnVwdCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICogQG5vdGUgICBNYWNybyBJU19VQVJUX0hXRkxPV19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3IKKyAqIG5vdCBIYXJkd2FyZSBGbG93IGNvbnRyb2wgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAqIEBybXRvbGwgQ1IzICAgICAgICAgIENUU0lFICAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkSVRfQ1RTCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9DVFMoY29uc3QgVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfQ1RTSUUpID09IChVU0FSVF9DUjNfQ1RTSUUpKSA/IDFVTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIFdha2UgVXAgZnJvbSBTdG9wIE1vZGUgSW50ZXJydXB0IGlzIGVuYWJsZWQgb3IKKyAqIGRpc2FibGVkLgorICogQG5vdGUgICBNYWNybyBJU19VQVJUX1dBS0VVUF9GUk9NU1RPUF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgKiB3aGV0aGVyIG9yIG5vdCBXYWtlLXVwIGZyb20gU3RvcCBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHgKKyAqIGluc3RhbmNlLgorICogQHJtdG9sbCBDUjMgICAgICAgICAgV1VGSUUgICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9XS1VQCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfVVNBUlRfSXNFbmFibGVkSVRfV0tVUChjb25zdCBVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19XVUZJRSkgPT0gKFVTQVJUX0NSM19XVUZJRSkpID8gMVVMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiBVU0FSVCBUWCBGSUZPIFRocmVzaG9sZCBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZAorICogQG5vdGUgICBNYWNybyBJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yCisgKiBub3QgRklGTyBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgKiBAcm10b2xsIENSMyAgICAgICAgICBUWEZUSUUgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZElUX1RYRlQKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9VU0FSVF9Jc0VuYWJsZWRJVF9UWEZUKGNvbnN0IFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX1RYRlRJRSkgPT0gKFVTQVJUX0NSM19UWEZUSUUpKQorICAgICAgICAgICAgICA/IDFVTAorICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiB0aGUgU21hcnRjYXJkIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBCZWZvcmUgR3VhcmQgVGltZQorICogSW50ZXJydXB0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgKiBAbm90ZSAgIE1hY3JvIElTX1NNQVJUQ0FSRF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3IKKyAqIG5vdCBTbWFydGNhcmQgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAqIEBybXRvbGwgQ1IzICAgICAgICAgIFRDQkdUSUUgICAgICAgTExfVVNBUlRfSXNFbmFibGVkSVRfVENCR1QKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9VU0FSVF9Jc0VuYWJsZWRJVF9UQ0JHVChjb25zdCBVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19UQ0JHVElFKSA9PSAoVVNBUlRfQ1IzX1RDQkdUSUUpKQorICAgICAgICAgICAgICA/IDFVTAorICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiBVU0FSVCBSWCBGSUZPIFRocmVzaG9sZCBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZAorICogQG5vdGUgICBNYWNybyBJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yCisgKiBub3QgRklGTyBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgKiBAcm10b2xsIENSMyAgICAgICAgICBSWEZUSUUgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZElUX1JYRlQKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90CitMTF9VU0FSVF9Jc0VuYWJsZWRJVF9SWEZUKGNvbnN0IFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX1JYRlRJRSkgPT0gKFVTQVJUX0NSM19SWEZUSUUpKQorICAgICAgICAgICAgICA/IDFVTAorICAgICAgICAgICAgICA6IDBVTCk7Cit9CisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VGX0RNQV9NYW5hZ2VtZW50IERNQV9NYW5hZ2VtZW50CisgKiBAeworICovCisKKy8qKgorICogQGJyaWVmICBFbmFibGUgRE1BIE1vZGUgZm9yIHJlY2VwdGlvbgorICogQHJtdG9sbCBDUjMgICAgICAgICAgRE1BUiAgICAgICAgICBMTF9VU0FSVF9FbmFibGVETUFSZXFfUlgKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlRE1BUmVxX1JYKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICBBVE9NSUNfU0VUX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBETUEgTW9kZSBmb3IgcmVjZXB0aW9uCisgKiBAcm10b2xsIENSMyAgICAgICAgICBETUFSICAgICAgICAgIExMX1VTQVJUX0Rpc2FibGVETUFSZXFfUlgKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZURNQVJlcV9SWChVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgQVRPTUlDX0NMRUFSX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgRE1BIE1vZGUgaXMgZW5hYmxlZCBmb3IgcmVjZXB0aW9uCisgKiBAcm10b2xsIENSMyAgICAgICAgICBETUFSICAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZERNQVJlcV9SWAorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX1VTQVJUX0lzRW5hYmxlZERNQVJlcV9SWChjb25zdCBVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19ETUFSKSA9PSAoVVNBUlRfQ1IzX0RNQVIpKSA/IDFVTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBETUEgTW9kZSBmb3IgdHJhbnNtaXNzaW9uCisgKiBAcm10b2xsIENSMyAgICAgICAgICBETUFUICAgICAgICAgIExMX1VTQVJUX0VuYWJsZURNQVJlcV9UWAorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVETUFSZXFfVFgoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIEFUT01JQ19TRVRfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfRE1BVCk7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIERNQSBNb2RlIGZvciB0cmFuc21pc3Npb24KKyAqIEBybXRvbGwgQ1IzICAgICAgICAgIERNQVQgICAgICAgICAgTExfVVNBUlRfRGlzYWJsZURNQVJlcV9UWAorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlRE1BUmVxX1RYKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICBBVE9NSUNfQ0xFQVJfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfRE1BVCk7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiBETUEgTW9kZSBpcyBlbmFibGVkIGZvciB0cmFuc21pc3Npb24KKyAqIEBybXRvbGwgQ1IzICAgICAgICAgIERNQVQgICAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkRE1BUmVxX1RYCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdAorTExfVVNBUlRfSXNFbmFibGVkRE1BUmVxX1RYKGNvbnN0IFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX0RNQVQpID09IChVU0FSVF9DUjNfRE1BVCkpID8gMVVMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwVUwpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIERNQSBEaXNhYmxpbmcgb24gUmVjZXB0aW9uIEVycm9yCisgKiBAcm10b2xsIENSMyAgICAgICAgICBERFJFICAgICAgICAgIExMX1VTQVJUX0VuYWJsZURNQURlYWN0T25SeEVycgorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVETUFEZWFjdE9uUnhFcnIoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19ERFJFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgRE1BIERpc2FibGluZyBvbiBSZWNlcHRpb24gRXJyb3IKKyAqIEBybXRvbGwgQ1IzICAgICAgICAgIEREUkUgICAgICAgICAgTExfVVNBUlRfRGlzYWJsZURNQURlYWN0T25SeEVycgorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlRE1BRGVhY3RPblJ4RXJyKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19ERFJFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEluZGljYXRlIGlmIERNQSBEaXNhYmxpbmcgb24gUmVjZXB0aW9uIEVycm9yIGlzIGRpc2FibGVkCisgKiBAcm10b2xsIENSMyAgICAgICAgICBERFJFICAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZERNQURlYWN0T25SeEVycgorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QKK0xMX1VTQVJUX0lzRW5hYmxlZERNQURlYWN0T25SeEVycihjb25zdCBVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19ERFJFKSA9PSAoVVNBUlRfQ1IzX0REUkUpKSA/IDFVTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCB0aGUgZGF0YSByZWdpc3RlciBhZGRyZXNzIHVzZWQgZm9yIERNQSB0cmFuc2ZlcgorICogQHJtdG9sbCBSRFIgICAgICAgICAgUkRSICAgICAgICAgICBMTF9VU0FSVF9ETUFfR2V0UmVnQWRkclxuCisgKiBAcm10b2xsIFREUiAgICAgICAgICBURFIgICAgICAgICAgIExMX1VTQVJUX0RNQV9HZXRSZWdBZGRyCisgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICogQHBhcmFtICBEaXJlY3Rpb24gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0RNQV9SRUdfREFUQV9UUkFOU01JVAorICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRE1BX1JFR19EQVRBX1JFQ0VJVkUKKyAqIEByZXR2YWwgQWRkcmVzcyBvZiBkYXRhIHJlZ2lzdGVyCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9ETUFfR2V0UmVnQWRkcihjb25zdCBVU0FSVF9UeXBlRGVmICpVU0FSVHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRGlyZWN0aW9uKSB7CisgIHVpbnQzMl90IGRhdGFfcmVnX2FkZHI7CisKKyAgaWYgKERpcmVjdGlvbiA9PSBMTF9VU0FSVF9ETUFfUkVHX0RBVEFfVFJBTlNNSVQpIHsKKyAgICAvKiByZXR1cm4gYWRkcmVzcyBvZiBURFIgcmVnaXN0ZXIgKi8KKyAgICBkYXRhX3JlZ19hZGRyID0gKHVpbnQzMl90KSAmIChVU0FSVHgtPlREUik7CisgIH0gZWxzZSB7CisgICAgLyogcmV0dXJuIGFkZHJlc3Mgb2YgUkRSIHJlZ2lzdGVyICovCisgICAgZGF0YV9yZWdfYWRkciA9ICh1aW50MzJfdCkgJiAoVVNBUlR4LT5SRFIpOworICB9CisKKyAgcmV0dXJuIGRhdGFfcmVnX2FkZHI7Cit9CisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VGX0RhdGFfTWFuYWdlbWVudCBEYXRhX01hbmFnZW1lbnQKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgIFJlYWQgUmVjZWl2ZXIgRGF0YSByZWdpc3RlciAoUmVjZWl2ZSBEYXRhIHZhbHVlLCA4IGJpdHMpCisgKiBAcm10b2xsIFJEUiAgICAgICAgICBSRFIgICAgICAgICAgIExMX1VTQVJUX1JlY2VpdmVEYXRhOAorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEZGCisgKi8KK19fU1RBVElDX0lOTElORSB1aW50OF90IExMX1VTQVJUX1JlY2VpdmVEYXRhOChjb25zdCBVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgcmV0dXJuICh1aW50OF90KShSRUFEX0JJVChVU0FSVHgtPlJEUiwgVVNBUlRfUkRSX1JEUikgJiAweEZGVSk7Cit9CisKKy8qKgorICogQGJyaWVmICBSZWFkIFJlY2VpdmVyIERhdGEgcmVnaXN0ZXIgKFJlY2VpdmUgRGF0YSB2YWx1ZSwgOSBiaXRzKQorICogQHJtdG9sbCBSRFIgICAgICAgICAgUkRSICAgICAgICAgICBMTF9VU0FSVF9SZWNlaXZlRGF0YTkKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHgxRkYKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQxNl90IExMX1VTQVJUX1JlY2VpdmVEYXRhOShjb25zdCBVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgcmV0dXJuICh1aW50MTZfdCkoUkVBRF9CSVQoVVNBUlR4LT5SRFIsIFVTQVJUX1JEUl9SRFIpKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFdyaXRlIGluIFRyYW5zbWl0dGVyIERhdGEgUmVnaXN0ZXIgKFRyYW5zbWl0IERhdGEgdmFsdWUsIDggYml0cykKKyAqIEBybXRvbGwgVERSICAgICAgICAgIFREUiAgICAgICAgICAgTExfVVNBUlRfVHJhbnNtaXREYXRhOAorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEBwYXJhbSAgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEZGCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfVHJhbnNtaXREYXRhOChVU0FSVF9UeXBlRGVmICpVU0FSVHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgVmFsdWUpIHsKKyAgVVNBUlR4LT5URFIgPSBWYWx1ZTsKK30KKworLyoqCisgKiBAYnJpZWYgIFdyaXRlIGluIFRyYW5zbWl0dGVyIERhdGEgUmVnaXN0ZXIgKFRyYW5zbWl0IERhdGEgdmFsdWUsIDkgYml0cykKKyAqIEBybXRvbGwgVERSICAgICAgICAgIFREUiAgICAgICAgICAgTExfVVNBUlRfVHJhbnNtaXREYXRhOQorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEBwYXJhbSAgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDFGRgorICogQHJldHZhbCBOb25lCisgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1RyYW5zbWl0RGF0YTkoVVNBUlRfVHlwZURlZiAqVVNBUlR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBWYWx1ZSkgeworICBVU0FSVHgtPlREUiA9ICh1aW50MTZfdCkoVmFsdWUgJiAweDFGRlVMKTsKK30KKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUZfRXhlY3V0aW9uIEV4ZWN1dGlvbgorICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiAgUmVxdWVzdCBhbiBBdXRvbWF0aWMgQmF1ZCBSYXRlIG1lYXN1cmVtZW50IG9uIG5leHQgcmVjZWl2ZWQgZGF0YQorICogZnJhbWUKKyAqIEBub3RlICAgTWFjcm8gSVNfVVNBUlRfQVVUT0JBVURSQVRFX0RFVEVDVElPTl9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvCisgKiBjaGVjayB3aGV0aGVyIG9yIG5vdCBBdXRvIEJhdWQgUmF0ZSBkZXRlY3Rpb24gZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlCisgKiBVU0FSVHggaW5zdGFuY2UuCisgKiBAcm10b2xsIFJRUiAgICAgICAgICBBQlJSUSAgICAgICAgIExMX1VTQVJUX1JlcXVlc3RBdXRvQmF1ZFJhdGUKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfUmVxdWVzdEF1dG9CYXVkUmF0ZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpIHsKKyAgU0VUX0JJVChVU0FSVHgtPlJRUiwgKHVpbnQxNl90KVVTQVJUX1JRUl9BQlJSUSk7Cit9CisKKy8qKgorICogQGJyaWVmICBSZXF1ZXN0IEJyZWFrIHNlbmRpbmcKKyAqIEBybXRvbGwgUlFSICAgICAgICAgIFNCS1JRICAgICAgICAgTExfVVNBUlRfUmVxdWVzdEJyZWFrU2VuZGluZworICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9SZXF1ZXN0QnJlYWtTZW5kaW5nKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICBTRVRfQklUKFVTQVJUeC0+UlFSLCAodWludDE2X3QpVVNBUlRfUlFSX1NCS1JRKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFB1dCBVU0FSVCBpbiBtdXRlIG1vZGUgYW5kIHNldCB0aGUgUldVIGZsYWcKKyAqIEBybXRvbGwgUlFSICAgICAgICAgIE1NUlEgICAgICAgICAgTExfVVNBUlRfUmVxdWVzdEVudGVyTXV0ZU1vZGUKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfUmVxdWVzdEVudGVyTXV0ZU1vZGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIFNFVF9CSVQoVVNBUlR4LT5SUVIsICh1aW50MTZfdClVU0FSVF9SUVJfTU1SUSk7Cit9CisKKy8qKgorICogQGJyaWVmICBSZXF1ZXN0IGEgUmVjZWl2ZSBEYXRhIGFuZCBGSUZPIGZsdXNoCisgKiBAbm90ZSAgIE1hY3JvIElTX1VBUlRfRklGT19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3IKKyAqIG5vdCBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAqIEBub3RlICAgQWxsb3dzIHRvIGRpc2NhcmQgdGhlIHJlY2VpdmVkIGRhdGEgd2l0aG91dCByZWFkaW5nIHRoZW0sIGFuZCBhdm9pZAorICogYW4gb3ZlcnJ1biBjb25kaXRpb24uCisgKiBAcm10b2xsIFJRUiAgICAgICAgICBSWEZSUSAgICAgICAgIExMX1VTQVJUX1JlcXVlc3RSeERhdGFGbHVzaAorICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAqIEByZXR2YWwgTm9uZQorICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9SZXF1ZXN0UnhEYXRhRmx1c2goVVNBUlRfVHlwZURlZiAqVVNBUlR4KSB7CisgIFNFVF9CSVQoVVNBUlR4LT5SUVIsICh1aW50MTZfdClVU0FSVF9SUVJfUlhGUlEpOworfQorCisvKioKKyAqIEBicmllZiAgUmVxdWVzdCBhIFRyYW5zbWl0IGRhdGEgYW5kIEZJRk8gZmx1c2gKKyAqIEBub3RlICAgTWFjcm8gSVNfVUFSVF9GSUZPX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvcgorICogbm90IEZJRk8gbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICogQHJtdG9sbCBSUVIgICAgICAgICAgVFhGUlEgICAgICAgICBMTF9VU0FSVF9SZXF1ZXN0VHhEYXRhRmx1c2gKKyAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfUmVxdWVzdFR4RGF0YUZsdXNoKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkgeworICBTRVRfQklUKFVTQVJUeC0+UlFSLCAodWludDE2X3QpVVNBUlRfUlFSX1RYRlJRKTsKK30KKworLyoqCisgKiBAfQorICovCisKKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUZfSW5pdCBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgKiBAeworICovCitFcnJvclN0YXR1cyBMTF9VU0FSVF9EZUluaXQoY29uc3QgVVNBUlRfVHlwZURlZiAqVVNBUlR4KTsKK0Vycm9yU3RhdHVzIExMX1VTQVJUX0luaXQoVVNBUlRfVHlwZURlZiAqVVNBUlR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMTF9VU0FSVF9Jbml0VHlwZURlZiAqVVNBUlRfSW5pdFN0cnVjdCk7Cit2b2lkIExMX1VTQVJUX1N0cnVjdEluaXQoTExfVVNBUlRfSW5pdFR5cGVEZWYgKlVTQVJUX0luaXRTdHJ1Y3QpOworRXJyb3JTdGF0dXMgTExfVVNBUlRfQ2xvY2tJbml0KAorICAgIFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwKKyAgICBjb25zdCBMTF9VU0FSVF9DbG9ja0luaXRUeXBlRGVmICpVU0FSVF9DbG9ja0luaXRTdHJ1Y3QpOwordm9pZCBMTF9VU0FSVF9DbG9ja1N0cnVjdEluaXQoTExfVVNBUlRfQ2xvY2tJbml0VHlwZURlZiAqVVNBUlRfQ2xvY2tJbml0U3RydWN0KTsKKy8qKgorICogQH0KKyAqLworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCisKKyNlbmRpZiAvKiBVU0FSVDEgfHwgVVNBUlQyIHx8IFVTQVJUMyB8fCBVQVJUNCB8fCBVQVJUNSAqLworCisvKioKKyAqIEB9CisgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyRzR4eF9MTF9VU0FSVF9IICovCmRpZmYgLS1naXQgYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9sbF91c2IuaCBiL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9JbmMvc3RtMzJnNHh4X2xsX3VzYi5oCmluZGV4IDEyZjJlMDYuLmY2MjRhNTcgMTAwNjQ0Ci0tLSBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9JbmMvc3RtMzJnNHh4X2xsX3VzYi5oCisrKyBiL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9JbmMvc3RtMzJnNHh4X2xsX3VzYi5oCkBAIC0xLDI0MiArMSwyNDQgQEAKLS8qKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBAZmlsZSAgICBzdG0zMmc0eHhfbGxfdXNiLmgNCi0gKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQ0KLSAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFVTQiBMb3cgTGF5ZXIgSEFMIG1vZHVsZS4NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQGF0dGVudGlvbg0KLSAqDQotICogQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KLSAqDQotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0ZXJtcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlDQotICogaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc29mdHdhcmUgY29tcG9uZW50Lg0KLSAqIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcyB3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLg0KLSAqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqLw0KLQ0KLS8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotI2lmbmRlZiBTVE0zMkc0eHhfTExfVVNCX0gNCi0jZGVmaW5lIFNUTTMyRzR4eF9MTF9VU0JfSA0KLQ0KLSNpZmRlZiBfX2NwbHVzcGx1cw0KLWV4dGVybiAiQyIgew0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLw0KLQ0KLS8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotI2luY2x1ZGUgInN0bTMyZzR4eF9oYWxfZGVmLmgiDQotDQotI2lmIGRlZmluZWQoVVNCKQ0KLS8qKiBAYWRkdG9ncm91cCBTVE0zMkc0eHhfSEFMX0RyaXZlcg0KLSAqIEB7DQotICovDQotDQotLyoqIEBhZGR0b2dyb3VwIFVTQl9MTA0KLSAqIEB7DQotICovDQotDQotLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFVTQiBNb2RlIGRlZmluaXRpb24NCi0gKi8NCi0NCi10eXBlZGVmIGVudW0geyBVU0JfREVWSUNFX01PREUgPSAwIH0gVVNCX01vZGVUeXBlRGVmOw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgVVNCIEluaXRpYWxpemF0aW9uIFN0cnVjdHVyZSBkZWZpbml0aW9uDQotICovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgdWludDMyX3QgZGV2X2VuZHBvaW50czsgLyohPCBEZXZpY2UgRW5kcG9pbnRzIG51bWJlci4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgZGVwZW5kcyBvbiB0aGUgdXNlZCBVU0IgY29yZS4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEgYW5kIE1heF9EYXRhID0gMTUgKi8NCi0NCi0gIHVpbnQzMl90IHNwZWVkOyAvKiE8IFVTQiBDb3JlIHNwZWVkLg0KLSAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSB2YWx1ZSBvZiBAcmVmDQotICAgICAgICAgICAgICAgICAgICAgUENEX1NwZWVkL0hDRF9TcGVlZCAoSENEX1NQRUVEX3h4eCwgSENEX1NQRUVEX3h4eCkgKi8NCi0NCi0gIHVpbnQzMl90IGVwMF9tcHM7IC8qITwgU2V0IHRoZSBFbmRwb2ludCAwIE1heCBQYWNrZXQgc2l6ZS4gKi8NCi0NCi0gIHVpbnQzMl90IHBoeV9pdGZhY2U7IC8qITwgU2VsZWN0IHRoZSB1c2VkIFBIWSBpbnRlcmZhY2UuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgdmFsdWUgb2YgQHJlZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgUENEX1BIWV9Nb2R1bGUvSENEX1BIWV9Nb2R1bGUgICovDQotDQotICB1aW50MzJfdCBTb2ZfZW5hYmxlOyAvKiE8IEVuYWJsZSBvciBkaXNhYmxlIHRoZSBvdXRwdXQgb2YgdGhlIFNPRiBzaWduYWwuICovDQotDQotICB1aW50MzJfdCBsb3dfcG93ZXJfZW5hYmxlOyAvKiE8IEVuYWJsZSBvciBkaXNhYmxlIExvdyBQb3dlciBtb2RlICovDQotDQotICB1aW50MzJfdCBscG1fZW5hYmxlOyAvKiE8IEVuYWJsZSBvciBkaXNhYmxlIEJhdHRlcnkgY2hhcmdpbmcuICovDQotDQotICB1aW50MzJfdCBiYXR0ZXJ5X2NoYXJnaW5nX2VuYWJsZTsgLyohPCBFbmFibGUgb3IgZGlzYWJsZSBCYXR0ZXJ5IGNoYXJnaW5nLiAqLw0KLX0gVVNCX0NmZ1R5cGVEZWY7DQotDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgdWludDhfdCBudW07IC8qITwgRW5kcG9pbnQgbnVtYmVyDQotICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAxIGFuZA0KLSAgICAgICAgICAgICAgICAgIE1heF9EYXRhID0gMTUgICAgKi8NCi0NCi0gIHVpbnQ4X3QgaXNfaW47IC8qITwgRW5kcG9pbnQgZGlyZWN0aW9uDQotICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kDQotICAgICAgICAgICAgICAgICAgICBNYXhfRGF0YSA9IDEgICAgICovDQotDQotICB1aW50OF90IGlzX3N0YWxsOyAvKiE8IEVuZHBvaW50IHN0YWxsIGNvbmRpdGlvbg0KLSAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAwDQotICAgICAgICAgICAgICAgICAgICAgICBhbmQgTWF4X0RhdGEgPSAxICAgICAqLw0KLQ0KLSAgdWludDhfdCB0eXBlOyAvKiE8IEVuZHBvaW50IHR5cGUNCi0gICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IHZhbHVlIG9mIEByZWYgVVNCX0VQX1R5cGUgKi8NCi0NCi0gIHVpbnQ4X3QgZGF0YV9waWRfc3RhcnQ7IC8qITwgSW5pdGlhbCBkYXRhIFBJRA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGENCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCBhbmQgTWF4X0RhdGEgPSAxICAgICAqLw0KLQ0KLSAgdWludDE2X3QgcG1hYWRyZXNzOyAvKiE8IFBNQSBBZGRyZXNzDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSB2YWx1ZSBiZXR3ZWVuIE1pbl9hZGRyID0gMA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgTWF4X2FkZHIgPSAxSyAgICAqLw0KLQ0KLSAgdWludDE2X3QgcG1hYWRkcjA7IC8qITwgUE1BIEFkZHJlc3MwDQotICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IHZhbHVlIGJldHdlZW4gTWluX2FkZHIgPSAwDQotICAgICAgICAgICAgICAgICAgICAgICAgYW5kIE1heF9hZGRyID0gMUsgICAgKi8NCi0NCi0gIHVpbnQxNl90IHBtYWFkZHIxOyAvKiE8IFBNQSBBZGRyZXNzMQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSB2YWx1ZSBiZXR3ZWVuIE1pbl9hZGRyID0gMA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBNYXhfYWRkciA9IDFLICAgICovDQotDQotICB1aW50OF90IGRvdWJsZWJ1ZmZlcjsgLyohPCBEb3VibGUgYnVmZmVyIGVuYWJsZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIDAgb3IgMSAqLw0KLQ0KLSAgdWludDE2X3QgdHhfZmlmb19udW07IC8qITwgVGhpcyBwYXJhbWV0ZXIgaXMgbm90IHJlcXVpcmVkIGJ5IFVTQiBEZXZpY2UgRlMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJpcGhlcmFsLCBpdCBpcyB1c2VkIG9ubHkgYnkgVVNCIE9URyBGUyBwZXJpcGhlcmFsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBpcyBhZGRlZCB0byBlbnN1cmUgY29tcGF0aWJpbGl0eQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcm9zcyBVU0IgcGVyaXBoZXJhbHMgICAgKi8NCi0NCi0gIHVpbnQzMl90IG1heHBhY2tldDsgLyohPCBFbmRwb2ludCBNYXggcGFja2V0IHNpemUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAwDQotICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBNYXhfRGF0YSA9IDY0S0IgICovDQotDQotICB1aW50OF90ICp4ZmVyX2J1ZmY7IC8qITwgUG9pbnRlciB0byB0cmFuc2ZlciBidWZmZXIgKi8NCi0NCi0gIHVpbnQzMl90IHhmZXJfbGVuOyAvKiE8IEN1cnJlbnQgdHJhbnNmZXIgbGVuZ3RoICovDQotDQotICB1aW50MzJfdCB4ZmVyX2NvdW50OyAvKiE8IFBhcnRpYWwgdHJhbnNmZXIgbGVuZ3RoIGluIGNhc2Ugb2YgbXVsdGkgcGFja2V0DQotICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2ZlciAgICAgICAgICAgICAgICAgICovDQotDQotICB1aW50MzJfdCB4ZmVyX2xlbl9kYjsgLyohPCBkb3VibGUgYnVmZmVyIHRyYW5zZmVyIGxlbmd0aCB1c2VkIHdpdGggYnVsayBkb3VibGUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgaW4gICAgICAgICAgICovDQotDQotICB1aW50OF90IHhmZXJfZmlsbF9kYjsgLyohPCBkb3VibGUgYnVmZmVyIE5lZWQgdG8gRmlsbCBuZXcgYnVmZmVyICB1c2VkIHdpdGgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBidWxrX2luICAgICAgICAgICAgICAgICovDQotDQotfSBVU0JfRVBUeXBlRGVmOw0KLQ0KLS8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotDQotLyoqIEBkZWZncm91cCBQQ0RfRXhwb3J0ZWRfQ29uc3RhbnRzIFBDRCBFeHBvcnRlZCBDb25zdGFudHMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVVNCX0xMX0VQMF9NUFMgVVNCIExvdyBMYXllciBFUDAgTVBTDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIEVQX01QU182NCAwVQ0KLSNkZWZpbmUgRVBfTVBTXzMyIDFVDQotI2RlZmluZSBFUF9NUFNfMTYgMlUNCi0jZGVmaW5lIEVQX01QU184IDNVDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFVTQl9MTF9FUF9UeXBlIFVTQiBMb3cgTGF5ZXIgRVAgVHlwZQ0KLSAqIEB7DQotICovDQotI2RlZmluZSBFUF9UWVBFX0NUUkwgMFUNCi0jZGVmaW5lIEVQX1RZUEVfSVNPQyAxVQ0KLSNkZWZpbmUgRVBfVFlQRV9CVUxLIDJVDQotI2RlZmluZSBFUF9UWVBFX0lOVFIgM1UNCi0jZGVmaW5lIEVQX1RZUEVfTVNLIDNVDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFVTQl9MTCBEZXZpY2UgU3BlZWQNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgVVNCRF9GU19TUEVFRCAyVQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotI2RlZmluZSBCVEFCTEVfQUREUkVTUyAweDAwMFUNCi0jZGVmaW5lIFBNQV9BQ0NFU1MgMVUNCi0NCi0jZGVmaW5lIEVQX0FERFJfTVNLIDB4N1UNCi0NCi0jaWZuZGVmIFVTRV9VU0JfRE9VQkxFX0JVRkZFUg0KLSNkZWZpbmUgVVNFX1VTQl9ET1VCTEVfQlVGRkVSIDFVDQotI2VuZGlmIC8qIFVTRV9VU0JfRE9VQkxFX0JVRkZFUiAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBhZGR0b2dyb3VwIFVTQl9MTF9FeHBvcnRlZF9GdW5jdGlvbnMgVVNCIExvdyBMYXllciBFeHBvcnRlZCBGdW5jdGlvbnMNCi0gKiBAew0KLSAqLw0KLQ0KLUhBTF9TdGF0dXNUeXBlRGVmIFVTQl9Db3JlSW5pdChVU0JfVHlwZURlZiAqVVNCeCwgVVNCX0NmZ1R5cGVEZWYgY2ZnKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBVU0JfRGV2SW5pdChVU0JfVHlwZURlZiAqVVNCeCwgVVNCX0NmZ1R5cGVEZWYgY2ZnKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBVU0JfRW5hYmxlR2xvYmFsSW50KFVTQl9UeXBlRGVmICpVU0J4KTsNCi1IQUxfU3RhdHVzVHlwZURlZiBVU0JfRGlzYWJsZUdsb2JhbEludChVU0JfVHlwZURlZiAqVVNCeCk7DQotSEFMX1N0YXR1c1R5cGVEZWYgVVNCX1NldEN1cnJlbnRNb2RlKFVTQl9UeXBlRGVmICpVU0J4LCBVU0JfTW9kZVR5cGVEZWYgbW9kZSk7DQotDQotI2lmIGRlZmluZWQoSEFMX1BDRF9NT0RVTEVfRU5BQkxFRCkNCi1IQUxfU3RhdHVzVHlwZURlZiBVU0JfQWN0aXZhdGVFbmRwb2ludChVU0JfVHlwZURlZiAqVVNCeCwgVVNCX0VQVHlwZURlZiAqZXApOw0KLUhBTF9TdGF0dXNUeXBlRGVmIFVTQl9EZWFjdGl2YXRlRW5kcG9pbnQoVVNCX1R5cGVEZWYgKlVTQngsIFVTQl9FUFR5cGVEZWYgKmVwKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBVU0JfRVBTdGFydFhmZXIoVVNCX1R5cGVEZWYgKlVTQngsIFVTQl9FUFR5cGVEZWYgKmVwKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBVU0JfRVBTZXRTdGFsbChVU0JfVHlwZURlZiAqVVNCeCwgVVNCX0VQVHlwZURlZiAqZXApOw0KLUhBTF9TdGF0dXNUeXBlRGVmIFVTQl9FUENsZWFyU3RhbGwoVVNCX1R5cGVEZWYgKlVTQngsIFVTQl9FUFR5cGVEZWYgKmVwKTsNCi0jZW5kaWYgLyogZGVmaW5lZCAoSEFMX1BDRF9NT0RVTEVfRU5BQkxFRCkgKi8NCi0NCi1IQUxfU3RhdHVzVHlwZURlZiBVU0JfU2V0RGV2QWRkcmVzcyhVU0JfVHlwZURlZiAqVVNCeCwgdWludDhfdCBhZGRyZXNzKTsNCi1IQUxfU3RhdHVzVHlwZURlZiBVU0JfRGV2Q29ubmVjdChVU0JfVHlwZURlZiAqVVNCeCk7DQotSEFMX1N0YXR1c1R5cGVEZWYgVVNCX0RldkRpc2Nvbm5lY3QoVVNCX1R5cGVEZWYgKlVTQngpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIFVTQl9TdG9wRGV2aWNlKFVTQl9UeXBlRGVmICpVU0J4KTsNCi11aW50MzJfdCBVU0JfUmVhZEludGVycnVwdHMoVVNCX1R5cGVEZWYgKlVTQngpOw0KLUhBTF9TdGF0dXNUeXBlRGVmIFVTQl9BY3RpdmF0ZVJlbW90ZVdha2V1cChVU0JfVHlwZURlZiAqVVNCeCk7DQotSEFMX1N0YXR1c1R5cGVEZWYgVVNCX0RlQWN0aXZhdGVSZW1vdGVXYWtldXAoVVNCX1R5cGVEZWYgKlVTQngpOw0KLQ0KLXZvaWQgVVNCX1dyaXRlUE1BKFVTQl9UeXBlRGVmICpVU0J4LCB1aW50OF90ICpwYlVzckJ1ZiwgdWludDE2X3Qgd1BNQUJ1ZkFkZHIsDQotICAgICAgICAgICAgICAgICAgdWludDE2X3Qgd05CeXRlcyk7DQotDQotdm9pZCBVU0JfUmVhZFBNQShVU0JfVHlwZURlZiAqVVNCeCwgdWludDhfdCAqcGJVc3JCdWYsIHVpbnQxNl90IHdQTUFCdWZBZGRyLA0KLSAgICAgICAgICAgICAgICAgdWludDE2X3Qgd05CeXRlcyk7DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0jZW5kaWYgLyogZGVmaW5lZCAoVVNCKSAqLw0KLQ0KLSNpZmRlZiBfX2NwbHVzcGx1cw0KLX0NCi0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8NCi0NCi0jZW5kaWYgLyogU1RNMzJHNHh4X0xMX1VTQl9IICovDQorLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAZmlsZSAgICBzdG0zMmc0eHhfbGxfdXNiLmgKKyAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBVU0IgTG93IExheWVyIEhBTCBtb2R1bGUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYXR0ZW50aW9uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0ZXJtcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlCisgKiBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb2Z0d2FyZSBjb21wb25lbnQuCisgKiBJZiBubyBMSUNFTlNFIGZpbGUgY29tZXMgd2l0aCB0aGlzIHNvZnR3YXJlLCBpdCBpcyBwcm92aWRlZCBBUy1JUy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJHNHh4X0xMX1VTQl9ICisjZGVmaW5lIFNUTTMyRzR4eF9MTF9VU0JfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnNHh4X2hhbF9kZWYuaCIKKworI2lmIGRlZmluZWQoVVNCKQorLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzR4eF9IQUxfRHJpdmVyCisgKiBAeworICovCisKKy8qKiBAYWRkdG9ncm91cCBVU0JfTEwKKyAqIEB7CisgKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBAYnJpZWYgIFVTQiBNb2RlIGRlZmluaXRpb24KKyAqLworCit0eXBlZGVmIGVudW0geyBVU0JfREVWSUNFX01PREUgPSAwIH0gVVNCX01vZGVUeXBlRGVmOworCisvKioKKyAqIEBicmllZiAgVVNCIEluc3RhbmNlIEluaXRpYWxpemF0aW9uIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDhfdCBkZXZfZW5kcG9pbnRzOyAvKiE8IERldmljZSBFbmRwb2ludHMgbnVtYmVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgZGVwZW5kcyBvbiB0aGUgdXNlZCBVU0IgY29yZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSBhbmQgTWF4X0RhdGEgPSAxNSAqLworCisgIHVpbnQ4X3Qgc3BlZWQ7IC8qITwgVVNCIENvcmUgc3BlZWQuCisgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgIFBDRF9TcGVlZC9IQ0RfU3BlZWQgKEhDRF9TUEVFRF94eHgsIEhDRF9TUEVFRF94eHgpICovCisKKyAgdWludDhfdCBlcDBfbXBzOyAvKiE8IFNldCB0aGUgRW5kcG9pbnQgMCBNYXggUGFja2V0IHNpemUuICovCisKKyAgdWludDhfdCBwaHlfaXRmYWNlOyAvKiE8IFNlbGVjdCB0aGUgdXNlZCBQSFkgaW50ZXJmYWNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSB2YWx1ZSBvZiBAcmVmCisgICAgICAgICAgICAgICAgICAgICAgICAgUENEX1BIWV9Nb2R1bGUvSENEX1BIWV9Nb2R1bGUgICovCisKKyAgdWludDhfdCBTb2ZfZW5hYmxlOyAvKiE8IEVuYWJsZSBvciBkaXNhYmxlIHRoZSBvdXRwdXQgb2YgdGhlIFNPRiBzaWduYWwuICovCisKKyAgdWludDhfdCBsb3dfcG93ZXJfZW5hYmxlOyAvKiE8IEVuYWJsZSBvciBkaXNhYmxlIHRoZSBsb3cgUG93ZXIgTW9kZS4gKi8KKworICB1aW50OF90IGxwbV9lbmFibGU7IC8qITwgRW5hYmxlIG9yIGRpc2FibGUgTGluayBQb3dlciBNYW5hZ2VtZW50LiAqLworCisgIHVpbnQ4X3QgYmF0dGVyeV9jaGFyZ2luZ19lbmFibGU7IC8qITwgRW5hYmxlIG9yIGRpc2FibGUgQmF0dGVyeSBjaGFyZ2luZy4gKi8KK30gVVNCX0NmZ1R5cGVEZWY7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDhfdCBudW07IC8qITwgRW5kcG9pbnQgbnVtYmVyCisgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDEgYW5kCisgICAgICAgICAgICAgICAgICBNYXhfRGF0YSA9IDE1ICAgKi8KKworICB1aW50OF90IGlzX2luOyAvKiE8IEVuZHBvaW50IGRpcmVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kCisgICAgICAgICAgICAgICAgICAgIE1heF9EYXRhID0gMSAgICAqLworCisgIHVpbnQ4X3QgaXNfc3RhbGw7IC8qITwgRW5kcG9pbnQgc3RhbGwgY29uZGl0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMAorICAgICAgICAgICAgICAgICAgICAgICBhbmQgTWF4X0RhdGEgPSAxICAgICovCisKKyAgdWludDhfdCB0eXBlOyAvKiE8IEVuZHBvaW50IHR5cGUKKyAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgdmFsdWUgb2YgQHJlZiBVU0JfTExfRVBfVHlwZSAqLworCisgIHVpbnQ4X3QgZGF0YV9waWRfc3RhcnQ7IC8qITwgSW5pdGlhbCBkYXRhIFBJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAgYW5kIE1heF9EYXRhID0gMSAgICAqLworCisgIHVpbnQxNl90IHBtYWFkcmVzczsgLyohPCBQTUEgQWRkcmVzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSB2YWx1ZSBiZXR3ZWVuIE1pbl9hZGRyID0gMAorICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBNYXhfYWRkciA9IDFLICAgKi8KKworICB1aW50MTZfdCBwbWFhZGRyMDsgLyohPCBQTUEgQWRkcmVzczAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSB2YWx1ZSBiZXR3ZWVuIE1pbl9hZGRyID0gMAorICAgICAgICAgICAgICAgICAgICAgICAgYW5kIE1heF9hZGRyID0gMUsgICAqLworCisgIHVpbnQxNl90IHBtYWFkZHIxOyAvKiE8IFBNQSBBZGRyZXNzMQorICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IHZhbHVlIGJldHdlZW4gTWluX2FkZHIgPSAwCisgICAgICAgICAgICAgICAgICAgICAgICBhbmQgTWF4X2FkZHIgPSAxSyAgICovCisKKyAgdWludDhfdCBkb3VibGVidWZmZXI7IC8qITwgRG91YmxlIGJ1ZmZlciBlbmFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIDAgb3IgMSAqLworCisgIHVpbnQzMl90IG1heHBhY2tldDsgLyohPCBFbmRwb2ludCBNYXggcGFja2V0IHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgTWF4X0RhdGEgPSA2NEtCICovCisKKyAgdWludDhfdCAqeGZlcl9idWZmOyAvKiE8IFBvaW50ZXIgdG8gdHJhbnNmZXIgYnVmZmVyICovCisKKyAgdWludDMyX3QgeGZlcl9sZW47IC8qITwgQ3VycmVudCB0cmFuc2ZlciBsZW5ndGggKi8KKworICB1aW50MzJfdCB4ZmVyX2NvdW50OyAvKiE8IFBhcnRpYWwgdHJhbnNmZXIgbGVuZ3RoIGluIGNhc2Ugb2YgbXVsdGkgcGFja2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyICAgICAgICAgICAgICAgICAqLworCisgIHVpbnQzMl90IHhmZXJfbGVuX2RiOyAvKiE8IGRvdWJsZSBidWZmZXIgdHJhbnNmZXIgbGVuZ3RoIHVzZWQgd2l0aCBidWxrIGRvdWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyIGluICAgICAgICAgICAgKi8KKworICB1aW50OF90IHhmZXJfZmlsbF9kYjsgLyohPCBkb3VibGUgYnVmZmVyIE5lZWQgdG8gRmlsbCBuZXcgYnVmZmVyICB1c2VkIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1bGtfaW4gICAgICAgICAgICAgICAgICovCit9IFVTQl9FUFR5cGVEZWY7CisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgUENEX0V4cG9ydGVkX0NvbnN0YW50cyBQQ0QgRXhwb3J0ZWQgQ29uc3RhbnRzCisgKiBAeworICovCisvKiogQGRlZmdyb3VwIFVTQl9MTF9FUDBfTVBTIFVTQiBMb3cgTGF5ZXIgRVAwIE1QUworICogQHsKKyAqLworI2RlZmluZSBFUF9NUFNfNjQgMFUKKyNkZWZpbmUgRVBfTVBTXzMyIDFVCisjZGVmaW5lIEVQX01QU18xNiAyVQorI2RlZmluZSBFUF9NUFNfOCAzVQorLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVVNCX0xMX0VQX1R5cGUgVVNCIExvdyBMYXllciBFUCBUeXBlCisgKiBAeworICovCisjZGVmaW5lIEVQX1RZUEVfQ1RSTCAwVQorI2RlZmluZSBFUF9UWVBFX0lTT0MgMVUKKyNkZWZpbmUgRVBfVFlQRV9CVUxLIDJVCisjZGVmaW5lIEVQX1RZUEVfSU5UUiAzVQorI2RlZmluZSBFUF9UWVBFX01TSyAzVQorLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVVNCX0xMIERldmljZSBTcGVlZAorICogQHsKKyAqLworI2RlZmluZSBVU0JEX0ZTX1NQRUVEIDJVCisvKioKKyAqIEB9CisgKi8KKworI2RlZmluZSBCVEFCTEVfQUREUkVTUyAweDAwMFUKKyNkZWZpbmUgUE1BX0FDQ0VTUyAxVQorCisjaWZuZGVmIFVTQl9FUF9SWF9TVFJYCisjZGVmaW5lIFVTQl9FUF9SWF9TVFJYICgweDNVIDw8IDEyKQorI2VuZGlmIC8qIFVTQl9FUF9SWF9TVFJYICovCisKKyNkZWZpbmUgRVBfQUREUl9NU0sgMHg3VQorCisjaWZuZGVmIFVTRV9VU0JfRE9VQkxFX0JVRkZFUgorI2RlZmluZSBVU0VfVVNCX0RPVUJMRV9CVUZGRVIgMVUKKyNlbmRpZiAvKiBVU0VfVVNCX0RPVUJMRV9CVUZGRVIgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKioKKyAqIEB9CisgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBVU0JfTExfRXhwb3J0ZWRfRnVuY3Rpb25zIFVTQiBMb3cgTGF5ZXIgRXhwb3J0ZWQgRnVuY3Rpb25zCisgKiBAeworICovCisKK0hBTF9TdGF0dXNUeXBlRGVmIFVTQl9Db3JlSW5pdChVU0JfVHlwZURlZiAqVVNCeCwgVVNCX0NmZ1R5cGVEZWYgY2ZnKTsKK0hBTF9TdGF0dXNUeXBlRGVmIFVTQl9EZXZJbml0KFVTQl9UeXBlRGVmICpVU0J4LCBVU0JfQ2ZnVHlwZURlZiBjZmcpOworSEFMX1N0YXR1c1R5cGVEZWYgVVNCX0VuYWJsZUdsb2JhbEludChVU0JfVHlwZURlZiAqVVNCeCk7CitIQUxfU3RhdHVzVHlwZURlZiBVU0JfRGlzYWJsZUdsb2JhbEludChVU0JfVHlwZURlZiAqVVNCeCk7CitIQUxfU3RhdHVzVHlwZURlZiBVU0JfU2V0Q3VycmVudE1vZGUoVVNCX1R5cGVEZWYgKlVTQngsIFVTQl9Nb2RlVHlwZURlZiBtb2RlKTsKKworSEFMX1N0YXR1c1R5cGVEZWYgVVNCX0ZsdXNoUnhGaWZvKFVTQl9UeXBlRGVmIGNvbnN0ICpVU0J4KTsKK0hBTF9TdGF0dXNUeXBlRGVmIFVTQl9GbHVzaFR4RmlmbyhVU0JfVHlwZURlZiBjb25zdCAqVVNCeCwgdWludDMyX3QgbnVtKTsKKworI2lmIGRlZmluZWQoSEFMX1BDRF9NT0RVTEVfRU5BQkxFRCkKK0hBTF9TdGF0dXNUeXBlRGVmIFVTQl9BY3RpdmF0ZUVuZHBvaW50KFVTQl9UeXBlRGVmICpVU0J4LCBVU0JfRVBUeXBlRGVmICplcCk7CitIQUxfU3RhdHVzVHlwZURlZiBVU0JfRGVhY3RpdmF0ZUVuZHBvaW50KFVTQl9UeXBlRGVmICpVU0J4LCBVU0JfRVBUeXBlRGVmICplcCk7CitIQUxfU3RhdHVzVHlwZURlZiBVU0JfRVBTdGFydFhmZXIoVVNCX1R5cGVEZWYgKlVTQngsIFVTQl9FUFR5cGVEZWYgKmVwKTsKK0hBTF9TdGF0dXNUeXBlRGVmIFVTQl9FUFNldFN0YWxsKFVTQl9UeXBlRGVmICpVU0J4LCBVU0JfRVBUeXBlRGVmICplcCk7CitIQUxfU3RhdHVzVHlwZURlZiBVU0JfRVBDbGVhclN0YWxsKFVTQl9UeXBlRGVmICpVU0J4LCBVU0JfRVBUeXBlRGVmICplcCk7CitIQUxfU3RhdHVzVHlwZURlZiBVU0JfRVBTdG9wWGZlcihVU0JfVHlwZURlZiAqVVNCeCwgVVNCX0VQVHlwZURlZiAqZXApOworI2VuZGlmIC8qIGRlZmluZWQgKEhBTF9QQ0RfTU9EVUxFX0VOQUJMRUQpICovCisKK0hBTF9TdGF0dXNUeXBlRGVmIFVTQl9TZXREZXZBZGRyZXNzKFVTQl9UeXBlRGVmICpVU0J4LCB1aW50OF90IGFkZHJlc3MpOworSEFMX1N0YXR1c1R5cGVEZWYgVVNCX0RldkNvbm5lY3QoVVNCX1R5cGVEZWYgKlVTQngpOworSEFMX1N0YXR1c1R5cGVEZWYgVVNCX0RldkRpc2Nvbm5lY3QoVVNCX1R5cGVEZWYgKlVTQngpOworSEFMX1N0YXR1c1R5cGVEZWYgVVNCX1N0b3BEZXZpY2UoVVNCX1R5cGVEZWYgKlVTQngpOwordWludDMyX3QgVVNCX1JlYWRJbnRlcnJ1cHRzKFVTQl9UeXBlRGVmIGNvbnN0ICpVU0J4KTsKK0hBTF9TdGF0dXNUeXBlRGVmIFVTQl9BY3RpdmF0ZVJlbW90ZVdha2V1cChVU0JfVHlwZURlZiAqVVNCeCk7CitIQUxfU3RhdHVzVHlwZURlZiBVU0JfRGVBY3RpdmF0ZVJlbW90ZVdha2V1cChVU0JfVHlwZURlZiAqVVNCeCk7CisKK3ZvaWQgVVNCX1dyaXRlUE1BKFVTQl9UeXBlRGVmIGNvbnN0ICpVU0J4LCB1aW50OF90ICpwYlVzckJ1ZiwKKyAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHdQTUFCdWZBZGRyLCB1aW50MTZfdCB3TkJ5dGVzKTsKKwordm9pZCBVU0JfUmVhZFBNQShVU0JfVHlwZURlZiBjb25zdCAqVVNCeCwgdWludDhfdCAqcGJVc3JCdWYsCisgICAgICAgICAgICAgICAgIHVpbnQxNl90IHdQTUFCdWZBZGRyLCB1aW50MTZfdCB3TkJ5dGVzKTsKKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCisjZW5kaWYgLyogZGVmaW5lZCAoVVNCKSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYgLyogU1RNMzJHNHh4X0xMX1VTQl9IICovCmRpZmYgLS1naXQgYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9sbF91dGlscy5oIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0luYy9zdG0zMmc0eHhfbGxfdXRpbHMuaAppbmRleCAxYjc5ZWM2Li4zNDNkYTQwIDEwMDY0NAotLS0gYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvSW5jL3N0bTMyZzR4eF9sbF91dGlscy5oCisrKyBiL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9JbmMvc3RtMzJnNHh4X2xsX3V0aWxzLmgKQEAgLTEsMzQyICsxLDM2NCBAQAotLyoqDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICogQGZpbGUgICAgc3RtMzJnNHh4X2xsX3V0aWxzLmgNCi0gICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0NCi0gICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgVVRJTFMgTEwgbW9kdWxlLg0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICAqIEBhdHRlbnRpb24NCi0gICoNCi0gICogQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4NCi0gICogQWxsIHJpZ2h0cyByZXNlcnZlZC4NCi0gICoNCi0gICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0ZXJtcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlDQotICAqIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4NCi0gICogSWYgbm8gTElDRU5TRSBmaWxlIGNvbWVzIHdpdGggdGhpcyBzb2Z0d2FyZSwgaXQgaXMgcHJvdmlkZWQgQVMtSVMuDQotICAqDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gIEB2ZXJiYXRpbQ0KLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIw0KLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgIFsuLl0NCi0gICAgVGhlIExMIFVUSUxTIGRyaXZlciBjb250YWlucyBhIHNldCBvZiBnZW5lcmljIEFQSXMgdGhhdCBjYW4gYmUNCi0gICAgdXNlZCBieSB1c2VyOg0KLSAgICAgICgrKSBEZXZpY2UgZWxlY3Ryb25pYyBzaWduYXR1cmUNCi0gICAgICAoKykgVGltaW5nIGZ1bmN0aW9ucw0KLSAgICAgICgrKSBQTEwgY29uZmlndXJhdGlvbiBmdW5jdGlvbnMNCi0NCi0gIEBlbmR2ZXJiYXRpbQ0KLSAgKi8NCi0NCi0vKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpZm5kZWYgU1RNMzJHNHh4X0xMX1VUSUxTX0gNCi0jZGVmaW5lIFNUTTMyRzR4eF9MTF9VVElMU19IDQotDQotI2lmZGVmIF9fY3BsdXNwbHVzDQotZXh0ZXJuICJDIiB7DQotI2VuZGlmDQotDQotLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaW5jbHVkZSAic3RtMzJnNHh4LmgiDQotDQotLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzR4eF9MTF9Ecml2ZXINCi0gKiBAew0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVVRJTFNfTEwgVVRJTFMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0NCi0vKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgVVRJTFNfTExfUHJpdmF0ZV9Db25zdGFudHMgVVRJTFMgUHJpdmF0ZSBDb25zdGFudHMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qIE1heCBkZWxheSBjYW4gYmUgdXNlZCBpbiBMTF9tRGVsYXkgKi8NCi0jZGVmaW5lIExMX01BWF9ERUxBWSAweEZGRkZGRkZGVQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBVbmlxdWUgZGV2aWNlIElEIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcw0KLSAqLw0KLSNkZWZpbmUgVUlEX0JBU0VfQUREUkVTUyBVSURfQkFTRQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBGbGFzaCBzaXplIGRhdGEgcmVnaXN0ZXIgYmFzZSBhZGRyZXNzDQotICovDQotI2RlZmluZSBGTEFTSFNJWkVfQkFTRV9BRERSRVNTIEZMQVNIU0laRV9CQVNFDQotDQotLyoqDQotICogQGJyaWVmIFBhY2thZ2UgZGF0YSByZWdpc3RlciBiYXNlIGFkZHJlc3MNCi0gKi8NCi0jZGVmaW5lIFBBQ0tBR0VfQkFTRV9BRERSRVNTIFBBQ0tBR0VfQkFTRQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGRlZmdyb3VwIFVUSUxTX0xMX1ByaXZhdGVfTWFjcm9zIFVUSUxTIFByaXZhdGUgTWFjcm9zDQotICogQHsNCi0gKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLS8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBkZWZncm91cCBVVElMU19MTF9FU19JTklUIFVUSUxTIEV4cG9ydGVkIHN0cnVjdHVyZXMNCi0gKiBAew0KLSAqLw0KLS8qKg0KLSAqIEBicmllZiAgVVRJTFMgUExMIHN0cnVjdHVyZSBkZWZpbml0aW9uDQotICovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgdWludDMyX3QNCi0gICAgICBQTExNOyAvKiE8IERpdmlzaW9uIGZhY3RvciBmb3IgUExMIFZDTyBpbnB1dCBjbG9jay4NCi0gICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX0xMX0VDX1BMTE1fRElWDQotDQotICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbg0KLSAgICAgICAgICAgICAgICAgQHJlZiBMTF9SQ0NfUExMX0NvbmZpZ0RvbWFpbl9TWVMoKS4gKi8NCi0NCi0gIHVpbnQzMl90DQotICAgICAgUExMTjsgLyohPCBNdWx0aXBsaWNhdGlvbiBmYWN0b3IgZm9yIFBMTCBWQ08gb3V0cHV0IGNsb2NrLg0KLSAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gOCBhbmQNCi0gICAgICAgICAgICAgICBNYXhfRGF0YSA9IDg2DQotDQotICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbg0KLSAgICAgICAgICAgICAgICAgQHJlZiBMTF9SQ0NfUExMX0NvbmZpZ0RvbWFpbl9TWVMoKS4gKi8NCi0NCi0gIHVpbnQzMl90DQotICAgICAgUExMUjsgLyohPCBEaXZpc2lvbiBmb3IgdGhlIG1haW4gc3lzdGVtIGNsb2NrLg0KLSAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfTExfRUNfUExMUl9ESVYNCi0NCi0gICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uDQotICAgICAgICAgICAgICAgICBAcmVmIExMX1JDQ19QTExfQ29uZmlnRG9tYWluX1NZUygpLiAqLw0KLX0gTExfVVRJTFNfUExMSW5pdFR5cGVEZWY7DQotDQotLyoqDQotICogQGJyaWVmICBVVElMUyBTeXN0ZW0sIEFIQiBhbmQgQVBCIGJ1c2VzIGNsb2NrIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlDQotICogZGVmaW5pdGlvbg0KLSAqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gIHVpbnQzMl90DQotICAgICAgQUhCQ0xLRGl2aWRlcjsgLyohPCBUaGUgQUhCIGNsb2NrIChIQ0xLKSBkaXZpZGVyLiBUaGlzIGNsb2NrIGlzIGRlcml2ZWQNCi0gICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHRoZSBzeXN0ZW0gY2xvY2sgKFNZU0NMSykuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhDQotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgb2YgQHJlZiBSQ0NfTExfRUNfU1lTQ0xLX0RJVg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkNCi0gICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBMTF9SQ0NfU2V0QUhCUHJlc2NhbGVyKCkuICovDQotDQotICB1aW50MzJfdCBBUEIxQ0xLRGl2aWRlcjsgLyohPCBUaGUgQVBCMSBjbG9jayAoUENMSzEpIGRpdmlkZXIuIFRoaXMgY2xvY2sgaXMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXJpdmVkIGZyb20gdGhlIEFIQiBjbG9jayAoSENMSykuIFRoaXMgcGFyYW1ldGVyDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfTExfRUNfQVBCMV9ESVYNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRhcnkgZnVuY3Rpb24NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgTExfUkNDX1NldEFQQjFQcmVzY2FsZXIoKS4gKi8NCi0NCi0gIHVpbnQzMl90IEFQQjJDTEtEaXZpZGVyOyAvKiE8IFRoZSBBUEIyIGNsb2NrIChQQ0xLMikgZGl2aWRlci4gVGhpcyBjbG9jayBpcw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcml2ZWQgZnJvbSB0aGUgQUhCIGNsb2NrIChIQ0xLKS4gVGhpcyBwYXJhbWV0ZXINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ19MTF9FQ19BUEIyX0RJVg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdGFyeSBmdW5jdGlvbg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBMTF9SQ0NfU2V0QVBCMlByZXNjYWxlcigpLiAqLw0KLQ0KLX0gTExfVVRJTFNfQ2xrSW5pdFR5cGVEZWY7DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgVVRJTFNfTExfRXhwb3J0ZWRfQ29uc3RhbnRzIFVUSUxTIEV4cG9ydGVkIENvbnN0YW50cw0KLSAqIEB7DQotICovDQotDQotLyoqIEBkZWZncm91cCBVVElMU19FQ19IU0VfQllQQVNTIEhTRSBCeXBhc3MgYWN0aXZhdGlvbg0KLSAqIEB7DQotICovDQotI2RlZmluZSBMTF9VVElMU19IU0VCWVBBU1NfT0ZGIFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgSFNFIEJ5cGFzcyBpcyBub3QgZW5hYmxlZCAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfVVRJTFNfSFNFQllQQVNTX09OIFwNCi0gIDB4MDAwMDAwMDFVIC8qITwgSFNFIEJ5cGFzcyBpcyBlbmFibGVkICAgICAgICAgICAgICAgICAgICAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBVVElMU19FQ19QQUNLQUdFVFlQRSBQQUNLQUdFIFRZUEUNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgTExfVVRJTFNfUEFDS0FHRVRZUEVfTFFGUDY0IFwNCi0gIDB4MDAwMDAwMDBVIC8qITwgTFFGUDY0IHBhY2thZ2UgdHlwZSAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfVVRJTFNfUEFDS0FHRVRZUEVfTFFGUDEwMCBcDQotICAweDAwMDAwMDAyVSAvKiE8IExRRlAxMDAgcGFja2FnZSB0eXBlICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX1VUSUxTX1BBQ0tBR0VUWVBFX1dMQ1NQODEgXA0KLSAgMHgwMDAwMDAwNVUgLyohPCBXTENTUDgxIHBhY2thZ2UgdHlwZSAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9VVElMU19QQUNLQUdFVFlQRV9MUUZQMTI4IFwNCi0gIDB4MDAwMDAwMDdVIC8qITwgTFFGUDEyOCBwYWNrYWdlIHR5cGUgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfVVRJTFNfUEFDS0FHRVRZUEVfVUZRRlBOMzIgXA0KLSAgMHgwMDAwMDAwOFUgLyohPCBVRlFGUE4zMiBwYWNrYWdlIHR5cGUgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9VVElMU19QQUNLQUdFVFlQRV9MUUZQMzIgXA0KLSAgMHgwMDAwMDAwOVUgLyohPCBMUUZQMzIgcGFja2FnZSB0eXBlICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9VVElMU19QQUNLQUdFVFlQRV9VRlFGUE40OCBcDQotICAweDAwMDAwMDBBVSAvKiE8IFVGUUZQTjQ4IHBhY2thZ2UgdHlwZSAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX1VUSUxTX1BBQ0tBR0VUWVBFX0xRRlA0OCBcDQotICAweDAwMDAwMDBCVSAvKiE8IExRRlA0OCBwYWNrYWdlIHR5cGUgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIExMX1VUSUxTX1BBQ0tBR0VUWVBFX1dMQ1NQNDkgXA0KLSAgMHgwMDAwMDAwQ1UgLyohPCBXTENTUDQ5IHBhY2thZ2UgdHlwZSAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9VVElMU19QQUNLQUdFVFlQRV9VRkJHQTY0IFwNCi0gIDB4MDAwMDAwMERVIC8qITwgVUZCR0E2NCBwYWNrYWdlIHR5cGUgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgTExfVVRJTFNfUEFDS0FHRVRZUEVfVUZCR0ExMDAgXA0KLSAgMHgwMDAwMDAwRVUgLyohPCBVRkJHQTEwMCBwYWNrYWdlIHR5cGUgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBMTF9VVElMU19QQUNLQUdFVFlQRV9MUUZQNDhfRUJJS0UgXA0KLSAgMHgwMDAwMDAxMFUgLyohPCBMUUZQNDggRUJJS0UgcGFja2FnZSB0eXBlICAgICAgICAgICAgICAgICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotDQotLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGRlZmdyb3VwIFVUSUxTX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucyBVVElMUyBFeHBvcnRlZCBGdW5jdGlvbnMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVVRJTFNfRUZfREVWSUNFX0VMRUNUUk9OSUNfU0lHTkFUVVJFIERFVklDRSBFTEVDVFJPTklDIFNJR05BVFVSRQ0KLSAqIEB7DQotICovDQotDQotLyoqDQotICogQGJyaWVmICBHZXQgV29yZDAgb2YgdGhlIHVuaXF1ZSBkZXZpY2UgaWRlbnRpZmllciAoVUlEIGJhc2VkIG9uIDk2IGJpdHMpDQotICogQHJldHZhbCBVSURbMzE6MF06IFggYW5kIFkgY29vcmRpbmF0ZXMgb24gdGhlIHdhZmVyIGV4cHJlc3NlZCBpbiBCQ0QgZm9ybWF0DQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0dldFVJRF9Xb3JkMCh2b2lkKSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX1JFRygqKCh1aW50MzJfdCAqKVVJRF9CQVNFX0FERFJFU1MpKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IFdvcmQxIG9mIHRoZSB1bmlxdWUgZGV2aWNlIGlkZW50aWZpZXIgKFVJRCBiYXNlZCBvbiA5NiBiaXRzKQ0KLSAqIEByZXR2YWwgVUlEWzYzOjMyXTogV2FmZXIgbnVtYmVyIChVSURbMzk6MzJdKSAmIExPVF9OVU1bMjM6MF0gKFVJRFs2Mzo0MF0pDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0dldFVJRF9Xb3JkMSh2b2lkKSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX1JFRygqKCh1aW50MzJfdCAqKShVSURfQkFTRV9BRERSRVNTICsgNFUpKSkpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBXb3JkMiBvZiB0aGUgdW5pcXVlIGRldmljZSBpZGVudGlmaWVyIChVSUQgYmFzZWQgb24gOTYgYml0cykNCi0gKiBAcmV0dmFsIFVJRFs5NTo2NF06IExvdCBudW1iZXIgKEFTQ0lJIGVuY29kZWQpIC0gTE9UX05VTVs1NToyNF0NCi0gKi8NCi1fX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfR2V0VUlEX1dvcmQyKHZvaWQpIHsNCi0gIHJldHVybiAodWludDMyX3QpKFJFQURfUkVHKCooKHVpbnQzMl90ICopKFVJRF9CQVNFX0FERFJFU1MgKyA4VSkpKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IEZsYXNoIG1lbW9yeSBzaXplDQotICogQG5vdGUgICBUaGlzIGJpdGZpZWxkIGluZGljYXRlcyB0aGUgc2l6ZSBvZiB0aGUgZGV2aWNlIEZsYXNoIG1lbW9yeSBleHByZXNzZWQNCi0gKiBpbiBLYnl0ZXMuIEFzIGFuIGV4YW1wbGUsIDB4MDQwIGNvcnJlc3BvbmRzIHRvIDY0IEtieXRlcy4NCi0gKiBAcmV0dmFsIEZMQVNIX1NJWkVbMTU6MF06IEZsYXNoIG1lbW9yeSBzaXplDQotICovDQotX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0dldEZsYXNoU2l6ZSh2b2lkKSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX1JFRygqKCh1aW50MzJfdCAqKUZMQVNIU0laRV9CQVNFX0FERFJFU1MpKSAmDQotICAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGVUwpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBQYWNrYWdlIHR5cGUNCi0gKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIEByZWYgTExfVVRJTFNfUEFDS0FHRVRZUEVfTFFGUDY0DQotICogICAgICAgICBAYXJnIEByZWYgTExfVVRJTFNfUEFDS0FHRVRZUEVfTFFGUDEwMA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VUSUxTX1BBQ0tBR0VUWVBFX1dMQ1NQODENCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VVElMU19QQUNLQUdFVFlQRV9MUUZQMTI4DQotICogICAgICAgICBAYXJnIEByZWYgTExfVVRJTFNfUEFDS0FHRVRZUEVfVUZRRlBOMzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VVElMU19QQUNLQUdFVFlQRV9MUUZQMzINCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VVElMU19QQUNLQUdFVFlQRV9VRlFGUE40OA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VUSUxTX1BBQ0tBR0VUWVBFX0xRRlA0OA0KLSAqICAgICAgICAgQGFyZyBAcmVmIExMX1VUSUxTX1BBQ0tBR0VUWVBFX1dMQ1NQNDkNCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VVElMU19QQUNLQUdFVFlQRV9VRkJHQTY0DQotICogICAgICAgICBAYXJnIEByZWYgTExfVVRJTFNfUEFDS0FHRVRZUEVfVUZCR0ExMDANCi0gKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VVElMU19QQUNLQUdFVFlQRV9MUUZQNDhfRUJJS0UNCi0gKg0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9HZXRQYWNrYWdlVHlwZSh2b2lkKSB7DQotICByZXR1cm4gKHVpbnQzMl90KShSRUFEX1JFRygqKCh1aW50MzJfdCAqKVBBQ0tBR0VfQkFTRV9BRERSRVNTKSkgJiAweDFGVSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBVVElMU19MTF9FRl9ERUxBWSBERUxBWQ0KLSAqIEB7DQotICovDQotDQotLyoqDQotICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGNvbmZpZ3VyZXMgdGhlIENvcnRleC1NIFN5c1RpY2sgc291cmNlIG9mIHRoZSB0aW1lDQotICogYmFzZS4NCi0gKiBAcGFyYW0gIEhDTEtGcmVxdWVuY3kgSENMSyBmcmVxdWVuY3kgaW4gSHogKGNhbiBiZSBjYWxjdWxhdGVkIHRoYW5rcyB0byBSQ0MNCi0gKiBoZWxwZXIgbWFjcm8pDQotICogQG5vdGUgICBXaGVuIGEgUlRPUyBpcyB1c2VkLCBpdCBpcyByZWNvbW1lbmRlZCB0byBhdm9pZCBjaGFuZ2luZyB0aGUgU3lzVGljaw0KLSAqICAgICAgICAgY29uZmlndXJhdGlvbiBieSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24sIGZvciBhIGRlbGF5IHVzZSByYXRoZXINCi0gKiBvc0RlbGF5IFJUT1Mgc2VydmljZS4NCi0gKiBAcGFyYW0gIFRpY2tzIE51bWJlciBvZiB0aWNrcw0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX0luaXRUaWNrKHVpbnQzMl90IEhDTEtGcmVxdWVuY3ksIHVpbnQzMl90IFRpY2tzKSB7DQotICAvKiBDb25maWd1cmUgdGhlIFN5c1RpY2sgdG8gaGF2ZSBpbnRlcnJ1cHQgaW4gMW1zIHRpbWUgYmFzZSAqLw0KLSAgU3lzVGljay0+TE9BRCA9DQotICAgICAgKHVpbnQzMl90KSgoSENMS0ZyZXF1ZW5jeSAvIFRpY2tzKSAtIDFVTCk7IC8qIHNldCByZWxvYWQgcmVnaXN0ZXIgKi8NCi0gIFN5c1RpY2stPlZBTCA9IDBVTDsgLyogTG9hZCB0aGUgU3lzVGljayBDb3VudGVyIFZhbHVlICovDQotICBTeXNUaWNrLT5DVFJMID0gU3lzVGlja19DVFJMX0NMS1NPVVJDRV9Nc2sgfA0KLSAgICAgICAgICAgICAgICAgIFN5c1RpY2tfQ1RSTF9FTkFCTEVfTXNrOyAvKiBFbmFibGUgdGhlIFN5c3RpY2sgVGltZXIgKi8NCi19DQotDQotdm9pZCBMTF9Jbml0MW1zVGljayh1aW50MzJfdCBIQ0xLRnJlcXVlbmN5KTsNCi12b2lkIExMX21EZWxheSh1aW50MzJfdCBEZWxheSk7DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFVUSUxTX0VGX1NZU1RFTSBTWVNURU0NCi0gKiBAew0KLSAqLw0KLQ0KLXZvaWQgTExfU2V0U3lzdGVtQ29yZUNsb2NrKHVpbnQzMl90IEhDTEtGcmVxdWVuY3kpOw0KLUVycm9yU3RhdHVzIExMX1NldEZsYXNoTGF0ZW5jeSh1aW50MzJfdCBIQ0xLRnJlcXVlbmN5KTsNCi1FcnJvclN0YXR1cyBMTF9QTExfQ29uZmlnU3lzdGVtQ2xvY2tfSFNJKA0KLSAgICBMTF9VVElMU19QTExJbml0VHlwZURlZiAqVVRJTFNfUExMSW5pdFN0cnVjdCwNCi0gICAgTExfVVRJTFNfQ2xrSW5pdFR5cGVEZWYgKlVUSUxTX0Nsa0luaXRTdHJ1Y3QpOw0KLUVycm9yU3RhdHVzIExMX1BMTF9Db25maWdTeXN0ZW1DbG9ja19IU0UoDQotICAgIHVpbnQzMl90IEhTRUZyZXF1ZW5jeSwgdWludDMyX3QgSFNFQnlwYXNzLA0KLSAgICBMTF9VVElMU19QTExJbml0VHlwZURlZiAqVVRJTFNfUExMSW5pdFN0cnVjdCwNCi0gICAgTExfVVRJTFNfQ2xrSW5pdFR5cGVEZWYgKlVUSUxTX0Nsa0luaXRTdHJ1Y3QpOw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotI2lmZGVmIF9fY3BsdXNwbHVzDQotfQ0KLSNlbmRpZg0KLQ0KLSNlbmRpZiAvKiBTVE0zMkc0eHhfTExfVVRJTFNfSCAqLw0KKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmc0eHhfbGxfdXRpbHMuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgVVRJTFMgTEwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRlcm1zIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUKKyAgKiBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb2Z0d2FyZSBjb21wb25lbnQuCisgICogSWYgbm8gTElDRU5TRSBmaWxlIGNvbWVzIHdpdGggdGhpcyBzb2Z0d2FyZSwgaXQgaXMgcHJvdmlkZWQgQVMtSVMuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoZSBMTCBVVElMUyBkcml2ZXIgY29udGFpbnMgYSBzZXQgb2YgZ2VuZXJpYyBBUElzIHRoYXQgY2FuIGJlCisgICAgdXNlZCBieSB1c2VyOgorICAgICAgKCspIERldmljZSBlbGVjdHJvbmljIHNpZ25hdHVyZQorICAgICAgKCspIFRpbWluZyBmdW5jdGlvbnMKKyAgICAgICgrKSBQTEwgY29uZmlndXJhdGlvbiBmdW5jdGlvbnMKKworICBAZW5kdmVyYmF0aW0KKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJHNHh4X0xMX1VUSUxTX0gKKyNkZWZpbmUgU1RNMzJHNHh4X0xMX1VUSUxTX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzR4eC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHNHh4X0xMX0RyaXZlcgorICogQHsKKyAqLworCisvKiogQGRlZmdyb3VwIFVUSUxTX0xMIFVUSUxTCisgKiBAeworICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBVVElMU19MTF9Qcml2YXRlX0NvbnN0YW50cyBVVElMUyBQcml2YXRlIENvbnN0YW50cworICogQHsKKyAqLworCisvKiBNYXggZGVsYXkgY2FuIGJlIHVzZWQgaW4gTExfbURlbGF5ICovCisjZGVmaW5lIExMX01BWF9ERUxBWSAweEZGRkZGRkZGVQorCisvKioKKyAqIEBicmllZiBVbmlxdWUgZGV2aWNlIElEIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcworICovCisjZGVmaW5lIFVJRF9CQVNFX0FERFJFU1MgVUlEX0JBU0UKKworLyoqCisgKiBAYnJpZWYgRmxhc2ggc2l6ZSBkYXRhIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcworICovCisjZGVmaW5lIEZMQVNIU0laRV9CQVNFX0FERFJFU1MgRkxBU0hTSVpFX0JBU0UKKworLyoqCisgKiBAYnJpZWYgUGFja2FnZSBkYXRhIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcworICovCisjZGVmaW5lIFBBQ0tBR0VfQkFTRV9BRERSRVNTIFBBQ0tBR0VfQkFTRQorCisvKioKKyAqIEB9CisgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVVRJTFNfTExfUHJpdmF0ZV9NYWNyb3MgVVRJTFMgUHJpdmF0ZSBNYWNyb3MKKyAqIEB7CisgKi8KKy8qKgorICogQH0KKyAqLworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVVRJTFNfTExfRVNfSU5JVCBVVElMUyBFeHBvcnRlZCBzdHJ1Y3R1cmVzCisgKiBAeworICovCisvKioKKyAqIEBicmllZiAgVVRJTFMgUExMIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDMyX3QKKyAgICAgIFBMTE07IC8qITwgRGl2aXNpb24gZmFjdG9yIGZvciBQTEwgVkNPIGlucHV0IGNsb2NrLgorICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ19MTF9FQ19QTExNX0RJVgorCisgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgIEByZWYgTExfUkNDX1BMTF9Db25maWdEb21haW5fU1lTKCkuICovCisKKyAgdWludDMyX3QKKyAgICAgIFBMTE47IC8qITwgTXVsdGlwbGljYXRpb24gZmFjdG9yIGZvciBQTEwgVkNPIG91dHB1dCBjbG9jay4KKyAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gOCBhbmQKKyAgICAgICAgICAgICAgIE1heF9EYXRhID0gODYKKworICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbgorICAgICAgICAgICAgICAgICBAcmVmIExMX1JDQ19QTExfQ29uZmlnRG9tYWluX1NZUygpLiAqLworCisgIHVpbnQzMl90CisgICAgICBQTExSOyAvKiE8IERpdmlzaW9uIGZvciB0aGUgbWFpbiBzeXN0ZW0gY2xvY2suCisgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX0xMX0VDX1BMTFJfRElWCisKKyAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgQHJlZiBMTF9SQ0NfUExMX0NvbmZpZ0RvbWFpbl9TWVMoKS4gKi8KK30gTExfVVRJTFNfUExMSW5pdFR5cGVEZWY7CisKKy8qKgorICogQGJyaWVmICBVVElMUyBTeXN0ZW0sIEFIQiBhbmQgQVBCIGJ1c2VzIGNsb2NrIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlCisgKiBkZWZpbml0aW9uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDMyX3QKKyAgICAgIEFIQkNMS0RpdmlkZXI7IC8qITwgVGhlIEFIQiBjbG9jayAoSENMSykgZGl2aWRlci4gVGhpcyBjbG9jayBpcyBkZXJpdmVkCisgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHRoZSBzeXN0ZW0gY2xvY2sgKFNZU0NMSykuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBvZiBAcmVmIFJDQ19MTF9FQ19TWVNDTEtfRElWCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgTExfUkNDX1NldEFIQlByZXNjYWxlcigpLiAqLworCisgIHVpbnQzMl90IEFQQjFDTEtEaXZpZGVyOyAvKiE8IFRoZSBBUEIxIGNsb2NrIChQQ0xLMSkgZGl2aWRlci4gVGhpcyBjbG9jayBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVyaXZlZCBmcm9tIHRoZSBBSEIgY2xvY2sgKEhDTEspLiBUaGlzIHBhcmFtZXRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfTExfRUNfQVBCMV9ESVYKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRhcnkgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBMTF9SQ0NfU2V0QVBCMVByZXNjYWxlcigpLiAqLworCisgIHVpbnQzMl90IEFQQjJDTEtEaXZpZGVyOyAvKiE8IFRoZSBBUEIyIGNsb2NrIChQQ0xLMikgZGl2aWRlci4gVGhpcyBjbG9jayBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVyaXZlZCBmcm9tIHRoZSBBSEIgY2xvY2sgKEhDTEspLiBUaGlzIHBhcmFtZXRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfTExfRUNfQVBCMl9ESVYKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRhcnkgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBMTF9SQ0NfU2V0QVBCMlByZXNjYWxlcigpLiAqLworCit9IExMX1VUSUxTX0Nsa0luaXRUeXBlRGVmOworCisvKioKKyAqIEB9CisgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVVRJTFNfTExfRXhwb3J0ZWRfQ29uc3RhbnRzIFVUSUxTIEV4cG9ydGVkIENvbnN0YW50cworICogQHsKKyAqLworCisvKiogQGRlZmdyb3VwIFVUSUxTX0VDX0hTRV9CWVBBU1MgSFNFIEJ5cGFzcyBhY3RpdmF0aW9uCisgKiBAeworICovCisjZGVmaW5lIExMX1VUSUxTX0hTRUJZUEFTU19PRkYgXAorICAweDAwMDAwMDAwVSAvKiE8IEhTRSBCeXBhc3MgaXMgbm90IGVuYWJsZWQgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfVVRJTFNfSFNFQllQQVNTX09OIFwKKyAgMHgwMDAwMDAwMVUgLyohPCBIU0UgQnlwYXNzIGlzIGVuYWJsZWQgICAgICAgICAgICAgICAgICAgICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBVVElMU19FQ19QQUNLQUdFVFlQRSBQQUNLQUdFIFRZUEUKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfVVRJTFNfUEFDS0FHRVRZUEVfTFFGUDY0IFwKKyAgMHgwMDAwMDAwMFUgLyohPCBMUUZQNjQgcGFja2FnZSB0eXBlICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX1VUSUxTX1BBQ0tBR0VUWVBFX1dMQ1NQNjQgXAorICAweDAwMDAwMDAxVSAvKiE8IFdMQ1NQNjQgcGFja2FnZSB0eXBlICAgICAgICAgICAgICAgICAgICAgKi8KKyNpZiBkZWZpbmVkKFNUTTMyRzQxMXhCKSB8fCBkZWZpbmVkKFNUTTMyRzQxMXhDKSB8fCBkZWZpbmVkKFNUTTMyRzQzMXh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkc0MTR4eCkgfHwgZGVmaW5lZChTVE0zMkc0NDF4eCkgfHwgZGVmaW5lZChTVE0zMkc0NzF4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJHNDczeHgpIHx8IGRlZmluZWQoU1RNMzJHNDgzeHgpIHx8IGRlZmluZWQoU1RNMzJHNDc0eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRzQ4NHh4KQorI2RlZmluZSBMTF9VVElMU19QQUNLQUdFVFlQRV9MUUZQMTAwX0xRRlA4MCBcCisgIDB4MDAwMDAwMDJVIC8qITwgTFFGUDEwMCBcIExRRlA4MCBwYWNrYWdlIHR5cGUgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfVVRJTFNfUEFDS0FHRVRZUEVfTFFGUDEwMCBcCisgIExMX1VUSUxTX1BBQ0tBR0VUWVBFX0xRRlAxMDBfTFFGUDgwIC8qITwgRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgICovCisjZWxzZQorI2RlZmluZSBMTF9VVElMU19QQUNLQUdFVFlQRV9MUUZQMTAwIFwKKyAgMHgwMDAwMDAwMlUgLyohPCBMUUZQMTAwIHBhY2thZ2UgdHlwZSAgICAgICAgICAgICAgICAgICAgICAqLworI2VuZGlmICAgICAgICAvKiBTVE0zMkc0MTF4QiB8fCBTVE0zMkc0MTF4QyB8fCBTVE0zMkc0MzF4eCB8fCBTVE0zMkc0MTR4eCB8fCBcCisgICAgICAgICAgICAgICAgIFNUTTMyRzQ0MXh4IHx8IFNUTTMyRzQ3MXh4IHx8IFNUTTMyRzQ3M3h4IHx8IFNUTTMyRzQ4M3h4IHx8IFwKKyAgICAgICAgICAgICAgICAgU1RNMzJHNDc0eHggfHwgU1RNMzJHNDg0eHggKi8KKyNkZWZpbmUgTExfVVRJTFNfUEFDS0FHRVRZUEVfV0xDU1A4MSBcCisgIDB4MDAwMDAwMDVVIC8qITwgV0xDU1A4MSBwYWNrYWdlIHR5cGUgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfVVRJTFNfUEFDS0FHRVRZUEVfTFFGUDEyOF9VRkJHQTEyMSBcCisgIDB4MDAwMDAwMDdVIC8qITwgTFFGUDEyOCBcIFVGQkdBMTIxIHBhY2thZ2UgdHlwZSAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfVVRJTFNfUEFDS0FHRVRZUEVfTFFGUDEyOCBcCisgIExMX1VUSUxTX1BBQ0tBR0VUWVBFX0xRRlAxMjhfVUZCR0ExMjEgLyohPCBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLworI2RlZmluZSBMTF9VVElMU19QQUNLQUdFVFlQRV9VRlFGUE4zMiBcCisgIDB4MDAwMDAwMDhVIC8qITwgVUZRRlBOMzIgcGFja2FnZSB0eXBlICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfVVRJTFNfUEFDS0FHRVRZUEVfTFFGUDMyIFwKKyAgMHgwMDAwMDAwOVUgLyohPCBMUUZQMzIgcGFja2FnZSB0eXBlICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9VVElMU19QQUNLQUdFVFlQRV9VRlFGUE40OCBcCisgIDB4MDAwMDAwMEFVIC8qITwgVUZRRlBONDggcGFja2FnZSB0eXBlICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfVVRJTFNfUEFDS0FHRVRZUEVfTFFGUDQ4IFwKKyAgMHgwMDAwMDAwQlUgLyohPCBMUUZQNDggcGFja2FnZSB0eXBlICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9VVElMU19QQUNLQUdFVFlQRV9XTENTUDQ5IFwKKyAgMHgwMDAwMDAwQ1UgLyohPCBXTENTUDQ5IHBhY2thZ2UgdHlwZSAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9VVElMU19QQUNLQUdFVFlQRV9VRkJHQTY0IFwKKyAgMHgwMDAwMDAwRFUgLyohPCBVRkJHQTY0IHBhY2thZ2UgdHlwZSAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9VVElMU19QQUNLQUdFVFlQRV9URkJHQTEwMCBcCisgIDB4MDAwMDAwMEVVIC8qITwgVEZCR0ExMDAgcGFja2FnZSB0eXBlICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfVVRJTFNfUEFDS0FHRVRZUEVfVUZCR0ExMDAgXAorICBMTF9VVElMU19QQUNLQUdFVFlQRV9URkJHQTEwMCAvKiE8IEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICAgICAgICovCisjZGVmaW5lIExMX1VUSUxTX1BBQ0tBR0VUWVBFX0xRRlA0OF9FQklLRSBcCisgIDB4MDAwMDAwMTBVIC8qITwgTFFGUDQ4IEVCSUtFIHBhY2thZ2UgdHlwZSAgICAgICAgICAgICAgICAgKi8KKyNpZiBkZWZpbmVkKFNUTTMyRzQ5MXh4KSB8fCBkZWZpbmVkKFNUTTMyRzRBMXh4KQorI2RlZmluZSBMTF9VVElMU19QQUNLQUdFVFlQRV9MUUZQODAgXAorICAweDAwMDAwMDExVSAvKiE8IExRRlA4MCBwYWNrYWdlIHR5cGUgICAgICAgICAgICAgICAgICAgICAgICovCisjZW5kaWYgICAgICAgIC8qIFNUTTMyRzQ5MXh4IHx8IFNUTTMyRzRBMXh4ICovCisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVVRJTFNfTExfRXhwb3J0ZWRfRnVuY3Rpb25zIFVUSUxTIEV4cG9ydGVkIEZ1bmN0aW9ucworICogQHsKKyAqLworCisvKiogQGRlZmdyb3VwIFVUSUxTX0VGX0RFVklDRV9FTEVDVFJPTklDX1NJR05BVFVSRSBERVZJQ0UgRUxFQ1RST05JQyBTSUdOQVRVUkUKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgIEdldCBXb3JkMCBvZiB0aGUgdW5pcXVlIGRldmljZSBpZGVudGlmaWVyIChVSUQgYmFzZWQgb24gOTYgYml0cykKKyAqIEByZXR2YWwgVUlEWzMxOjBdOiBYIGFuZCBZIGNvb3JkaW5hdGVzIG9uIHRoZSB3YWZlciBleHByZXNzZWQgaW4gQkNEIGZvcm1hdAorICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfR2V0VUlEX1dvcmQwKHZvaWQpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9SRUcoKigodWludDMyX3QgKilVSURfQkFTRV9BRERSRVNTKSkpOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IFdvcmQxIG9mIHRoZSB1bmlxdWUgZGV2aWNlIGlkZW50aWZpZXIgKFVJRCBiYXNlZCBvbiA5NiBiaXRzKQorICogQHJldHZhbCBVSURbNjM6MzJdOiBXYWZlciBudW1iZXIgKFVJRFszOTozMl0pICYgTE9UX05VTVsyMzowXSAoVUlEWzYzOjQwXSkKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0dldFVJRF9Xb3JkMSh2b2lkKSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfUkVHKCooKHVpbnQzMl90ICopKFVJRF9CQVNFX0FERFJFU1MgKyA0VSkpKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgV29yZDIgb2YgdGhlIHVuaXF1ZSBkZXZpY2UgaWRlbnRpZmllciAoVUlEIGJhc2VkIG9uIDk2IGJpdHMpCisgKiBAcmV0dmFsIFVJRFs5NTo2NF06IExvdCBudW1iZXIgKEFTQ0lJIGVuY29kZWQpIC0gTE9UX05VTVs1NToyNF0KKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0dldFVJRF9Xb3JkMih2b2lkKSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfUkVHKCooKHVpbnQzMl90ICopKFVJRF9CQVNFX0FERFJFU1MgKyA4VSkpKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgRmxhc2ggbWVtb3J5IHNpemUKKyAqIEBub3RlICAgVGhpcyBiaXRmaWVsZCBpbmRpY2F0ZXMgdGhlIHNpemUgb2YgdGhlIGRldmljZSBGbGFzaCBtZW1vcnkgZXhwcmVzc2VkCisgKiBpbiBLYnl0ZXMuIEFzIGFuIGV4YW1wbGUsIDB4MDQwIGNvcnJlc3BvbmRzIHRvIDY0IEtieXRlcy4KKyAqIEByZXR2YWwgRkxBU0hfU0laRVsxNTowXTogRmxhc2ggbWVtb3J5IHNpemUKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0dldEZsYXNoU2l6ZSh2b2lkKSB7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfUkVHKCooKHVpbnQzMl90ICopRkxBU0hTSVpFX0JBU0VfQUREUkVTUykpICYKKyAgICAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRlVMKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBQYWNrYWdlIHR5cGUKKyAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VUSUxTX1BBQ0tBR0VUWVBFX0xRRlA2NAorICogICAgICAgICBAYXJnIEByZWYgTExfVVRJTFNfUEFDS0FHRVRZUEVfTFFGUDEwMAorICogICAgICAgICBAYXJnIEByZWYgTExfVVRJTFNfUEFDS0FHRVRZUEVfV0xDU1A4MQorICogICAgICAgICBAYXJnIEByZWYgTExfVVRJTFNfUEFDS0FHRVRZUEVfTFFGUDEyOAorICogICAgICAgICBAYXJnIEByZWYgTExfVVRJTFNfUEFDS0FHRVRZUEVfVUZRRlBOMzIKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VUSUxTX1BBQ0tBR0VUWVBFX0xRRlAzMgorICogICAgICAgICBAYXJnIEByZWYgTExfVVRJTFNfUEFDS0FHRVRZUEVfVUZRRlBONDgKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VUSUxTX1BBQ0tBR0VUWVBFX0xRRlA0OAorICogICAgICAgICBAYXJnIEByZWYgTExfVVRJTFNfUEFDS0FHRVRZUEVfV0xDU1A0OQorICogICAgICAgICBAYXJnIEByZWYgTExfVVRJTFNfUEFDS0FHRVRZUEVfVUZCR0E2NAorICogICAgICAgICBAYXJnIEByZWYgTExfVVRJTFNfUEFDS0FHRVRZUEVfVUZCR0ExMDAKKyAqICAgICAgICAgQGFyZyBAcmVmIExMX1VUSUxTX1BBQ0tBR0VUWVBFX0xRRlA0OF9FQklLRQorICoKKyAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0dldFBhY2thZ2VUeXBlKHZvaWQpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9SRUcoKigodWludDMyX3QgKilQQUNLQUdFX0JBU0VfQUREUkVTUykpICYgMHgxRlUpOworfQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBVVElMU19MTF9FRl9ERUxBWSBERUxBWQorICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBjb25maWd1cmVzIHRoZSBDb3J0ZXgtTSBTeXNUaWNrIHNvdXJjZSBvZiB0aGUgdGltZQorICogYmFzZS4KKyAqIEBwYXJhbSAgSENMS0ZyZXF1ZW5jeSBIQ0xLIGZyZXF1ZW5jeSBpbiBIeiAoY2FuIGJlIGNhbGN1bGF0ZWQgdGhhbmtzIHRvIFJDQworICogaGVscGVyIG1hY3JvKQorICogQG5vdGUgICBXaGVuIGEgUlRPUyBpcyB1c2VkLCBpdCBpcyByZWNvbW1lbmRlZCB0byBhdm9pZCBjaGFuZ2luZyB0aGUgU3lzVGljaworICogICAgICAgICBjb25maWd1cmF0aW9uIGJ5IGNhbGxpbmcgdGhpcyBmdW5jdGlvbiwgZm9yIGEgZGVsYXkgdXNlIHJhdGhlcgorICogb3NEZWxheSBSVE9TIHNlcnZpY2UuCisgKiBAcGFyYW0gIFRpY2tzIEZyZXF1ZW5jeSBvZiBUaWNrcyAoSHopCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSW5pdFRpY2sodWludDMyX3QgSENMS0ZyZXF1ZW5jeSwgdWludDMyX3QgVGlja3MpIHsKKyAgLyogQ29uZmlndXJlIHRoZSBTeXNUaWNrIHRvIGhhdmUgaW50ZXJydXB0IGluIDFtcyB0aW1lIGJhc2UgKi8KKyAgU3lzVGljay0+TE9BRCA9CisgICAgICAodWludDMyX3QpKChIQ0xLRnJlcXVlbmN5IC8gVGlja3MpIC0gMVVMKTsgLyogc2V0IHJlbG9hZCByZWdpc3RlciAqLworICBTeXNUaWNrLT5WQUwgPSAwVUw7IC8qIExvYWQgdGhlIFN5c1RpY2sgQ291bnRlciBWYWx1ZSAqLworICBTeXNUaWNrLT5DVFJMID0gU3lzVGlja19DVFJMX0NMS1NPVVJDRV9Nc2sgfAorICAgICAgICAgICAgICAgICAgU3lzVGlja19DVFJMX0VOQUJMRV9Nc2s7IC8qIEVuYWJsZSB0aGUgU3lzdGljayBUaW1lciAqLworfQorCit2b2lkIExMX0luaXQxbXNUaWNrKHVpbnQzMl90IEhDTEtGcmVxdWVuY3kpOwordm9pZCBMTF9tRGVsYXkodWludDMyX3QgRGVsYXkpOworCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBVVElMU19FRl9TWVNURU0gU1lTVEVNCisgKiBAeworICovCisKK3ZvaWQgTExfU2V0U3lzdGVtQ29yZUNsb2NrKHVpbnQzMl90IEhDTEtGcmVxdWVuY3kpOworRXJyb3JTdGF0dXMgTExfU2V0Rmxhc2hMYXRlbmN5KHVpbnQzMl90IEhDTEtGcmVxdWVuY3kpOworRXJyb3JTdGF0dXMgTExfUExMX0NvbmZpZ1N5c3RlbUNsb2NrX0hTSSgKKyAgICBMTF9VVElMU19QTExJbml0VHlwZURlZiAqVVRJTFNfUExMSW5pdFN0cnVjdCwKKyAgICBMTF9VVElMU19DbGtJbml0VHlwZURlZiAqVVRJTFNfQ2xrSW5pdFN0cnVjdCk7CitFcnJvclN0YXR1cyBMTF9QTExfQ29uZmlnU3lzdGVtQ2xvY2tfSFNFKAorICAgIHVpbnQzMl90IEhTRUZyZXF1ZW5jeSwgdWludDMyX3QgSFNFQnlwYXNzLAorICAgIExMX1VUSUxTX1BMTEluaXRUeXBlRGVmICpVVElMU19QTExJbml0U3RydWN0LAorICAgIExMX1VUSUxTX0Nsa0luaXRUeXBlRGVmICpVVElMU19DbGtJbml0U3RydWN0KTsKKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMkc0eHhfTExfVVRJTFNfSCAqLwpkaWZmIC0tZ2l0IGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0xJQ0VOU0UudHh0IGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL0xJQ0VOU0UudHh0CmluZGV4IGI0MDM2NGMuLjNlZGM0ZDEgMTAwNjQ0Ci0tLSBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9MSUNFTlNFLnR4dAorKysgYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvTElDRU5TRS50eHQKQEAgLTEsNiArMSw2IEBACi1UaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBwcm92aWRlZCB0byB5b3UgYXMgcGFydCBvZiBhIHNvZnR3YXJlIHBhY2thZ2UgYW5kDQotYXBwbGljYWJsZSBsaWNlbnNlIHRlcm1zIGFyZSBpbiB0aGUgIFBhY2thZ2VfbGljZW5zZSBmaWxlLiBJZiB5b3UgcmVjZWl2ZWQgdGhpcw0KLXNvZnR3YXJlIGNvbXBvbmVudCBvdXRzaWRlIG9mIGEgcGFja2FnZSBvciB3aXRob3V0IGFwcGxpY2FibGUgbGljZW5zZSB0ZXJtcywNCi10aGUgdGVybXMgb2YgdGhlIEJTRC0zLUNsYXVzZSBsaWNlbnNlIHNoYWxsIGFwcGx5LiANCi1Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIEJTRC0zLUNsYXVzZSBhdDoNCi1odHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQ0KK1RoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIHByb3ZpZGVkIHRvIHlvdSBhcyBwYXJ0IG9mIGEgc29mdHdhcmUgcGFja2FnZSBhbmQKK2FwcGxpY2FibGUgbGljZW5zZSB0ZXJtcyBhcmUgaW4gdGhlICBQYWNrYWdlX2xpY2Vuc2UgZmlsZS4gSWYgeW91IHJlY2VpdmVkIHRoaXMKK3NvZnR3YXJlIGNvbXBvbmVudCBvdXRzaWRlIG9mIGEgcGFja2FnZSBvciB3aXRob3V0IGFwcGxpY2FibGUgbGljZW5zZSB0ZXJtcywKK3RoZSB0ZXJtcyBvZiB0aGUgQlNELTMtQ2xhdXNlIGxpY2Vuc2Ugc2hhbGwgYXBwbHkuIAorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBCU0QtMy1DbGF1c2UgYXQ6CitodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQpkaWZmIC0tZ2l0IGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsLmMgYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWwuYwppbmRleCBiMDNjYTU0Li5hNjY4ZGMxIDEwMDY0NAotLS0gYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWwuYworKysgYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWwuYwpAQCAtMSw3MjEgKzEsNzQ2IEBACi0vKioNCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgKiBAZmlsZSAgICBzdG0zMmc0eHhfaGFsLmMNCi0gICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0NCi0gICogQGJyaWVmICAgSEFMIG1vZHVsZSBkcml2ZXIuDQotICAqICAgICAgICAgIFRoaXMgaXMgdGhlIGNvbW1vbiBwYXJ0IG9mIHRoZSBIQUwgaW5pdGlhbGl6YXRpb24NCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgKiBAYXR0ZW50aW9uDQotICAqDQotICAqIENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuDQotICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQotICAqDQotICAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGVybXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZQ0KLSAgKiBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb2Z0d2FyZSBjb21wb25lbnQuDQotICAqIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcyB3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLg0KLSAgKg0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICBAdmVyYmF0aW0NCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMNCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICBbLi5dDQotICAgIFRoZSBjb21tb24gSEFMIGRyaXZlciBjb250YWlucyBhIHNldCBvZiBnZW5lcmljIGFuZCBjb21tb24gQVBJcyB0aGF0IGNhbiBiZQ0KLSAgICB1c2VkIGJ5IHRoZSBQUFAgcGVyaXBoZXJhbCBkcml2ZXJzIGFuZCB0aGUgdXNlciB0byBzdGFydCB1c2luZyB0aGUgSEFMLg0KLSAgICBbLi5dDQotICAgIFRoZSBIQUwgY29udGFpbnMgdHdvIEFQSXMnIGNhdGVnb3JpZXM6DQotICAgICAgICAgKCspIENvbW1vbiBIQUwgQVBJcw0KLSAgICAgICAgICgrKSBTZXJ2aWNlcyBIQUwgQVBJcw0KLQ0KLSAgQGVuZHZlcmJhdGltDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICovDQotDQotLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaW5jbHVkZSAic3RtMzJnNHh4X2hhbC5oIg0KLQ0KLS8qKiBAYWRkdG9ncm91cCBTVE0zMkc0eHhfSEFMX0RyaXZlcg0KLSAqIEB7DQotICovDQotDQotLyoqIEBkZWZncm91cCBIQUwgSEFMDQotICogQGJyaWVmIEhBTCBtb2R1bGUgZHJpdmVyDQotICogQHsNCi0gKi8NCi0NCi0jaWZkZWYgSEFMX01PRFVMRV9FTkFCTEVEDQotDQotLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKg0KLSAqIEBicmllZiBTVE0zMkc0eHggSEFMIERyaXZlciB2ZXJzaW9uIG51bWJlciBWMS4yLjINCi0gKi8NCi0jZGVmaW5lIF9fU1RNMzJHNHh4X0hBTF9WRVJTSU9OX01BSU4gKDB4MDFVKSAvKiE8IFszMToyNF0gbWFpbiB2ZXJzaW9uICovDQotI2RlZmluZSBfX1NUTTMyRzR4eF9IQUxfVkVSU0lPTl9TVUIxICgweDAyVSkgLyohPCBbMjM6MTZdIHN1YjEgdmVyc2lvbiAqLw0KLSNkZWZpbmUgX19TVE0zMkc0eHhfSEFMX1ZFUlNJT05fU1VCMiAoMHgwMlUpIC8qITwgWzE1OjhdICBzdWIyIHZlcnNpb24gKi8NCi0jZGVmaW5lIF9fU1RNMzJHNHh4X0hBTF9WRVJTSU9OX1JDICgweDAwVSkgICAvKiE8IFs3OjBdICByZWxlYXNlIGNhbmRpZGF0ZSAqLw0KLSNkZWZpbmUgX19TVE0zMkc0eHhfSEFMX1ZFUlNJT04gICAgICAgICAgICBcDQotICAoKF9fU1RNMzJHNHh4X0hBTF9WRVJTSU9OX01BSU4gPDwgMjRVKSB8IFwNCi0gICAoX19TVE0zMkc0eHhfSEFMX1ZFUlNJT05fU1VCMSA8PCAxNlUpIHwgXA0KLSAgIChfX1NUTTMyRzR4eF9IQUxfVkVSU0lPTl9TVUIyIDw8IDhVKSB8IChfX1NUTTMyRzR4eF9IQUxfVkVSU0lPTl9SQykpDQotDQotI2lmIGRlZmluZWQoVlJFRkJVRikNCi0jZGVmaW5lIFZSRUZCVUZfVElNRU9VVF9WQUxVRSAxMFUgLyogMTAgbXMgKi8NCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVlJFRkJVRiAqLw0KLQ0KLS8qIC0tLS0tLS0tLS0tLSBTWVNDRkcgcmVnaXN0ZXJzIGJpdCBhZGRyZXNzIGluIHRoZSBhbGlhcyByZWdpb24gLS0tLS0tLS0tLS0tICovDQotI2RlZmluZSBTWVNDRkdfT0ZGU0VUIChTWVNDRkdfQkFTRSAtIFBFUklQSF9CQVNFKQ0KLS8qIC0tLSAgTUVNUk1QIFJlZ2lzdGVyIC0tLSovDQotLyogQWxpYXMgd29yZCBhZGRyZXNzIG9mIEZCX01PREUgYml0ICovDQotI2RlZmluZSBNRU1STVBfT0ZGU0VUIFNZU0NGR19PRkZTRVQNCi0jZGVmaW5lIEZCX01PREVfQml0TnVtYmVyICgodWludDhfdCkweDgpDQotI2RlZmluZSBGQl9NT0RFX0JCIFwNCi0gIChQRVJJUEhfQkJfQkFTRSArIChNRU1STVBfT0ZGU0VUICogMzIpICsgKEZCX01PREVfQml0TnVtYmVyICogNCkpDQotDQotLyogLS0tIEdQQyBSZWdpc3RlciAtLS0qLw0KLS8qIEFsaWFzIHdvcmQgYWRkcmVzcyBvZiBDQ01FUiBiaXQgKi8NCi0jZGVmaW5lIFNDU1JfT0ZGU0VUIChTWVNDRkdfT0ZGU0VUICsgMHgxOCkNCi0jZGVmaW5lIENDTUVSX0JpdE51bWJlciAoKHVpbnQ4X3QpMHgwKQ0KLSNkZWZpbmUgU0NTUl9DQ01FUl9CQiBcDQotICAoUEVSSVBIX0JCX0JBU0UgKyAoU0NTUl9PRkZTRVQgKiAzMikgKyAoQ0NNRVJfQml0TnVtYmVyICogNCkpDQotDQotLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiBFeHBvcnRlZCB2YXJpYWJsZXMNCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgSEFMX0V4cG9ydGVkX1ZhcmlhYmxlcyBIQUwgRXhwb3J0ZWQgVmFyaWFibGVzDQotICogQHsNCi0gKi8NCi1fX0lPIHVpbnQzMl90IHV3VGljazsNCi11aW50MzJfdCB1d1RpY2tQcmlvID0gKDFVTCA8PCBfX05WSUNfUFJJT19CSVRTKTsgLyogSW52YWxpZCBQUklPICovDQotdWludDMyX3QgdXdUaWNrRnJlcSA9IEhBTF9USUNLX0ZSRVFfREVGQVVMVDsgICAgIC8qIDFLSHogKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0NCi0vKiogQGRlZmdyb3VwIEhBTF9FeHBvcnRlZF9GdW5jdGlvbnMgSEFMIEV4cG9ydGVkIEZ1bmN0aW9ucw0KLSAqIEB7DQotICovDQotDQotLyoqIEBkZWZncm91cCBIQUxfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24NCi1GdW5jdGlvbnMNCi0gICogIEBicmllZiAgICBIQUwgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucw0KLSAgKg0KLUB2ZXJiYXRpbQ0KLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgICAgICAgICAgICAjIyMjIyBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMNCi0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOg0KLSAgICAgICgrKSBJbml0aWFsaXplIHRoZSBGbGFzaCBpbnRlcmZhY2UgdGhlIE5WSUMgYWxsb2NhdGlvbiBhbmQgaW5pdGlhbCB0aW1lDQotYmFzZSBjbG9jayBjb25maWd1cmF0aW9uLg0KLSAgICAgICgrKSBEZS1Jbml0aWFsaXplIGNvbW1vbiBwYXJ0IG9mIHRoZSBIQUwuDQotICAgICAgKCspIENvbmZpZ3VyZSB0aGUgdGltZSBiYXNlIHNvdXJjZSB0byBoYXZlIDFtcyB0aW1lIGJhc2Ugd2l0aCBhIGRlZGljYXRlZA0KLSAgICAgICAgICBUaWNrIGludGVycnVwdCBwcmlvcml0eS4NCi0gICAgICAgICgrKykgU3lzVGljayB0aW1lciBpcyB1c2VkIGJ5IGRlZmF1bHQgYXMgc291cmNlIG9mIHRpbWUgYmFzZSwgYnV0IHVzZXINCi0gICAgICAgICAgICAgY2FuIGV2ZW50dWFsbHkgaW1wbGVtZW50IGhpcyBwcm9wZXIgdGltZSBiYXNlIHNvdXJjZSAoYSBnZW5lcmFsDQotcHVycG9zZSB0aW1lciBmb3IgZXhhbXBsZSBvciBvdGhlciB0aW1lIHNvdXJjZSksIGtlZXBpbmcgaW4gbWluZCB0aGF0IFRpbWUgYmFzZQ0KLSAgICAgICAgICAgICBkdXJhdGlvbiBzaG91bGQgYmUga2VwdCAxbXMgc2luY2UgUFBQX1RJTUVPVVRfVkFMVUVzIGFyZSBkZWZpbmVkDQotYW5kIGhhbmRsZWQgaW4gbWlsbGlzZWNvbmRzIGJhc2lzLg0KLSAgICAgICAgKCsrKSBUaW1lIGJhc2UgY29uZmlndXJhdGlvbiBmdW5jdGlvbiAoSEFMX0luaXRUaWNrICgpKSBpcyBjYWxsZWQNCi1hdXRvbWF0aWNhbGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHByb2dyYW0gYWZ0ZXIgcmVzZXQgYnkgSEFMX0luaXQoKSBvciBhdA0KLWFueSB0aW1lIHdoZW4gY2xvY2sgaXMgY29uZmlndXJlZCwgYnkgSEFMX1JDQ19DbG9ja0NvbmZpZygpLg0KLSAgICAgICAgKCsrKSBTb3VyY2Ugb2YgdGltZSBiYXNlIGlzIGNvbmZpZ3VyZWQgIHRvIGdlbmVyYXRlIGludGVycnVwdHMgYXQNCi1yZWd1bGFyIHRpbWUgaW50ZXJ2YWxzLiBDYXJlIG11c3QgYmUgdGFrZW4gaWYgSEFMX0RlbGF5KCkgaXMgY2FsbGVkIGZyb20gYQ0KLSAgICAgICAgICAgICBwZXJpcGhlcmFsIElTUiBwcm9jZXNzLCB0aGUgVGljayBpbnRlcnJ1cHQgbGluZSBtdXN0IGhhdmUgaGlnaGVyDQotcHJpb3JpdHkgKG51bWVyaWNhbGx5IGxvd2VyKSB0aGFuIHRoZSBwZXJpcGhlcmFsIGludGVycnVwdC4gT3RoZXJ3aXNlIHRoZSBjYWxsZXINCi0gICAgICAgICAgICBJU1IgcHJvY2VzcyB3aWxsIGJlIGJsb2NrZWQuDQotICAgICAgICgrKykgZnVuY3Rpb25zIGFmZmVjdGluZyB0aW1lIGJhc2UgY29uZmlndXJhdGlvbnMgYXJlIGRlY2xhcmVkIGFzIF9fd2Vhaw0KLSAgICAgICAgICAgICB0byBtYWtlICBvdmVycmlkZSBwb3NzaWJsZSAgaW4gY2FzZSBvZiBvdGhlciAgaW1wbGVtZW50YXRpb25zIGluDQotdXNlciBmaWxlLg0KLUBlbmR2ZXJiYXRpbQ0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIEZsYXNoIHByZWZldGNoLCB0aGUNCi0gKiBJbnN0cnVjdGlvbiBhbmQgRGF0YSBjYWNoZXMsIHRoZSB0aW1lIGJhc2Ugc291cmNlLCBOVklDIGFuZCBhbnkgcmVxdWlyZWQNCi0gKiBnbG9iYWwgbG93IGxldmVsIGhhcmR3YXJlIGJ5IGNhbGxpbmcgdGhlIEhBTF9Nc3BJbml0KCkgY2FsbGJhY2sgZnVuY3Rpb24gdG8NCi0gKiBiZSBvcHRpb25hbGx5IGRlZmluZWQgaW4gdXNlciBmaWxlIHN0bTMyZzR4eF9oYWxfbXNwLmMuDQotICoNCi0gKiBAbm90ZSAgIEhBTF9Jbml0KCkgZnVuY3Rpb24gaXMgY2FsbGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgcHJvZ3JhbSBhZnRlciByZXNldA0KLSAqIGFuZCBiZWZvcmUgdGhlIGNsb2NrIGNvbmZpZ3VyYXRpb24uDQotICoNCi0gKiBAbm90ZSAgIEluIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHRoZSBTeXN0ZW0gVGltZXIgKFN5c3RpY2spIGlzIHVzZWQgYXMNCi0gKiBzb3VyY2Ugb2YgdGltZSBiYXNlLiBUaGUgU3lzdGljayBjb25maWd1cmF0aW9uIGlzIGJhc2VkIG9uIEhTSSBjbG9jaywgYXMgSFNJDQotICogaXMgdGhlIGNsb2NrIHVzZWQgYWZ0ZXIgYSBzeXN0ZW0gUmVzZXQgYW5kIHRoZSBOVklDIGNvbmZpZ3VyYXRpb24gaXMgc2V0IHRvDQotICogUHJpb3JpdHkgZ3JvdXAgNC4gT25jZSBkb25lLCB0aW1lIGJhc2UgdGljayBzdGFydHMgaW5jcmVtZW50aW5nOiB0aGUgdGljaw0KLSAqIHZhcmlhYmxlIGNvdW50ZXIgaXMgaW5jcmVtZW50ZWQgZWFjaCAxbXMgaW4gdGhlIFN5c1RpY2tfSGFuZGxlcigpIGludGVycnVwdA0KLSAqIGhhbmRsZXIuDQotICoNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfSW5pdCh2b2lkKSB7DQotICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7DQotICAvKiBDb25maWd1cmUgRmxhc2ggcHJlZmV0Y2gsIEluc3RydWN0aW9uIGNhY2hlLCBEYXRhIGNhY2hlICovDQotICAvKiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gYXQgcmVzZXQgaXM6ICAgICAgICAgICAgICAgICAgICAgICovDQotICAvKiAtIFByZWZldGNoIGRpc2FibGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAvKiAtIEluc3RydWN0aW9uIGNhY2hlIGVuYWJsZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAvKiAtIERhdGEgY2FjaGUgZW5hYmxlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2lmIChJTlNUUlVDVElPTl9DQUNIRV9FTkFCTEUgPT0gMFUpDQotICBfX0hBTF9GTEFTSF9JTlNUUlVDVElPTl9DQUNIRV9ESVNBQkxFKCk7DQotI2VuZGlmIC8qIElOU1RSVUNUSU9OX0NBQ0hFX0VOQUJMRSAqLw0KLQ0KLSNpZiAoREFUQV9DQUNIRV9FTkFCTEUgPT0gMFUpDQotICBfX0hBTF9GTEFTSF9EQVRBX0NBQ0hFX0RJU0FCTEUoKTsNCi0jZW5kaWYgLyogREFUQV9DQUNIRV9FTkFCTEUgKi8NCi0NCi0jaWYgKFBSRUZFVENIX0VOQUJMRSAhPSAwVSkNCi0gIF9fSEFMX0ZMQVNIX1BSRUZFVENIX0JVRkZFUl9FTkFCTEUoKTsNCi0jZW5kaWYgLyogUFJFRkVUQ0hfRU5BQkxFICovDQotDQotICAvKiBTZXQgSW50ZXJydXB0IEdyb3VwIFByaW9yaXR5ICovDQotICBIQUxfTlZJQ19TZXRQcmlvcml0eUdyb3VwaW5nKE5WSUNfUFJJT1JJVFlHUk9VUF80KTsNCi0NCi0gIC8qIFVzZSBTeXNUaWNrIGFzIHRpbWUgYmFzZSBzb3VyY2UgYW5kIGNvbmZpZ3VyZSAxbXMgdGljayAoZGVmYXVsdCBjbG9jayBhZnRlcg0KLSAgICogUmVzZXQgaXMgSFNJKSAqLw0KLSAgaWYgKEhBTF9Jbml0VGljayhUSUNLX0lOVF9QUklPUklUWSkgIT0gSEFMX09LKSB7DQotICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsNCi0gIH0gZWxzZSB7DQotICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLw0KLSAgICBIQUxfTXNwSW5pdCgpOw0KLSAgfQ0KLQ0KLSAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLw0KLSAgcmV0dXJuIHN0YXR1czsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGRlLWluaXRpYWxpemVzIGNvbW1vbiBwYXJ0IG9mIHRoZSBIQUwgYW5kIHN0b3BzIHRoZQ0KLSAqIHNvdXJjZSBvZiB0aW1lIGJhc2UuDQotICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGlzIG9wdGlvbmFsLg0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9EZUluaXQodm9pZCkgew0KLSAgLyogUmVzZXQgb2YgYWxsIHBlcmlwaGVyYWxzICovDQotICBfX0hBTF9SQ0NfQVBCMV9GT1JDRV9SRVNFVCgpOw0KLSAgX19IQUxfUkNDX0FQQjFfUkVMRUFTRV9SRVNFVCgpOw0KLQ0KLSAgX19IQUxfUkNDX0FQQjJfRk9SQ0VfUkVTRVQoKTsNCi0gIF9fSEFMX1JDQ19BUEIyX1JFTEVBU0VfUkVTRVQoKTsNCi0NCi0gIF9fSEFMX1JDQ19BSEIxX0ZPUkNFX1JFU0VUKCk7DQotICBfX0hBTF9SQ0NfQUhCMV9SRUxFQVNFX1JFU0VUKCk7DQotDQotICBfX0hBTF9SQ0NfQUhCMl9GT1JDRV9SRVNFVCgpOw0KLSAgX19IQUxfUkNDX0FIQjJfUkVMRUFTRV9SRVNFVCgpOw0KLQ0KLSAgX19IQUxfUkNDX0FIQjNfRk9SQ0VfUkVTRVQoKTsNCi0gIF9fSEFMX1JDQ19BSEIzX1JFTEVBU0VfUkVTRVQoKTsNCi0NCi0gIC8qIERlLUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLw0KLSAgSEFMX01zcERlSW5pdCgpOw0KLQ0KLSAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLw0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBNU1AuDQotICogQHJldHZhbCBOb25lDQotICovDQotX193ZWFrIHZvaWQgSEFMX01zcEluaXQodm9pZCkgew0KLSAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLA0KLSAgICAgICAgICAgIHRoZSBIQUxfTXNwSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlDQotICAgKi8NCi19DQotDQotLyoqDQotICogQGJyaWVmICBEZUluaXRpYWxpemVzIHRoZSBNU1AuDQotICogQHJldHZhbCBOb25lDQotICovDQotX193ZWFrIHZvaWQgSEFMX01zcERlSW5pdCh2b2lkKSB7DQotICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsDQotICAgICAgICAgICAgdGhlIEhBTF9Nc3BEZUluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQ0KLSAgICovDQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBUaGlzIGZ1bmN0aW9uIGNvbmZpZ3VyZXMgdGhlIHNvdXJjZSBvZiB0aGUgdGltZSBiYXNlOg0KLSAqICAgICAgICBUaGUgdGltZSBzb3VyY2UgaXMgY29uZmlndXJlZCB0byBoYXZlIDFtcyB0aW1lIGJhc2Ugd2l0aCBhIGRlZGljYXRlZA0KLSAqICAgICAgICBUaWNrIGludGVycnVwdCBwcmlvcml0eS4NCi0gKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCAgYXV0b21hdGljYWxseSBhdCB0aGUgYmVnaW5uaW5nIG9mIHByb2dyYW0NCi0gKiBhZnRlciByZXNldCBieSBIQUxfSW5pdCgpIG9yIGF0IGFueSB0aW1lIHdoZW4gY2xvY2sgaXMgcmVjb25maWd1cmVkICBieQ0KLSAqIEhBTF9SQ0NfQ2xvY2tDb25maWcoKS4NCi0gKiBAbm90ZSBJbiB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiwgU3lzVGljayB0aW1lciBpcyB0aGUgc291cmNlIG9mIHRpbWUNCi0gKiBiYXNlLiBJdCBpcyB1c2VkIHRvIGdlbmVyYXRlIGludGVycnVwdHMgYXQgcmVndWxhciB0aW1lIGludGVydmFscy4gQ2FyZSBtdXN0DQotICogYmUgdGFrZW4gaWYgSEFMX0RlbGF5KCkgaXMgY2FsbGVkIGZyb20gYSBwZXJpcGhlcmFsIElTUiBwcm9jZXNzLCBUaGUgU3lzVGljaw0KLSAqIGludGVycnVwdCBtdXN0IGhhdmUgaGlnaGVyIHByaW9yaXR5IChudW1lcmljYWxseSBsb3dlcikgdGhhbiB0aGUgcGVyaXBoZXJhbA0KLSAqIGludGVycnVwdC4gT3RoZXJ3aXNlIHRoZSBjYWxsZXIgSVNSIHByb2Nlc3Mgd2lsbCBiZSBibG9ja2VkLiBUaGUgZnVuY3Rpb24gaXMNCi0gKiBkZWNsYXJlZCBhcyBfX3dlYWsgIHRvIGJlIG92ZXJ3cml0dGVuICBpbiBjYXNlIG9mIG90aGVyIGltcGxlbWVudGF0aW9uICBpbg0KLSAqIHVzZXIgZmlsZS4NCi0gKiBAcGFyYW0gVGlja1ByaW9yaXR5OiBUaWNrIGludGVycnVwdCBwcmlvcml0eS4NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1fX3dlYWsgSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0luaXRUaWNrKHVpbnQzMl90IFRpY2tQcmlvcml0eSkgew0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOw0KLQ0KLSAgaWYgKHV3VGlja0ZyZXEgIT0gMFUpIHsNCi0gICAgLyogQ29uZmlndXJlIHRoZSBTeXNUaWNrIHRvIGhhdmUgaW50ZXJydXB0IGluIDFtcyB0aW1lIGJhc2lzKi8NCi0gICAgaWYgKEhBTF9TWVNUSUNLX0NvbmZpZyhTeXN0ZW1Db3JlQ2xvY2sgLyAoMTAwMFUgLyB1d1RpY2tGcmVxKSkgPT0gMFUpIHsNCi0gICAgICAvKiBDb25maWd1cmUgdGhlIFN5c1RpY2sgSVJRIHByaW9yaXR5ICovDQotICAgICAgaWYgKFRpY2tQcmlvcml0eSA8ICgxVUwgPDwgX19OVklDX1BSSU9fQklUUykpIHsNCi0gICAgICAgIEhBTF9OVklDX1NldFByaW9yaXR5KFN5c1RpY2tfSVJRbiwgVGlja1ByaW9yaXR5LCAwVSk7DQotICAgICAgICB1d1RpY2tQcmlvID0gVGlja1ByaW9yaXR5Ow0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7DQotICAgICAgfQ0KLSAgICB9IGVsc2Ugew0KLSAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsNCi0gICAgfQ0KLSAgfSBlbHNlIHsNCi0gICAgc3RhdHVzID0gSEFMX0VSUk9SOw0KLSAgfQ0KLQ0KLSAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLw0KLSAgcmV0dXJuIHN0YXR1czsNCi19DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEhBTF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIEhBTCBDb250cm9sIGZ1bmN0aW9ucw0KLSAgKiAgQGJyaWVmICAgIEhBTCBDb250cm9sIGZ1bmN0aW9ucw0KLSAgKg0KLUB2ZXJiYXRpbQ0KLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhBTCBDb250cm9sIGZ1bmN0aW9ucyAjIyMjIw0KLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86DQotICAgICAgKCspIFByb3ZpZGUgYSB0aWNrIHZhbHVlIGluIG1pbGxpc2Vjb25kDQotICAgICAgKCspIFByb3ZpZGUgYSBibG9ja2luZyBkZWxheSBpbiBtaWxsaXNlY29uZA0KLSAgICAgICgrKSBTdXNwZW5kIHRoZSB0aW1lIGJhc2Ugc291cmNlIGludGVycnVwdA0KLSAgICAgICgrKSBSZXN1bWUgdGhlIHRpbWUgYmFzZSBzb3VyY2UgaW50ZXJydXB0DQotICAgICAgKCspIEdldCB0aGUgSEFMIEFQSSBkcml2ZXIgdmVyc2lvbg0KLSAgICAgICgrKSBHZXQgdGhlIGRldmljZSBpZGVudGlmaWVyDQotICAgICAgKCspIEdldCB0aGUgZGV2aWNlIHJldmlzaW9uIGlkZW50aWZpZXINCi0NCi1AZW5kdmVyYmF0aW0NCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICogQGJyaWVmIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGluY3JlbWVudCBhIGdsb2JhbCB2YXJpYWJsZSAidXdUaWNrIg0KLSAqICAgICAgICB1c2VkIGFzIGFwcGxpY2F0aW9uIHRpbWUgYmFzZS4NCi0gKiBAbm90ZSBJbiB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiwgdGhpcyB2YXJpYWJsZSBpcyBpbmNyZW1lbnRlZCBlYWNoIDFtcw0KLSAqICAgICAgIGluIFN5c1RpY2sgSVNSLg0KLSAqIEBub3RlIFRoaXMgZnVuY3Rpb24gaXMgZGVjbGFyZWQgYXMgX193ZWFrIHRvIGJlIG92ZXJ3cml0dGVuIGluIGNhc2Ugb2Ygb3RoZXINCi0gKiAgICAgIGltcGxlbWVudGF0aW9ucyBpbiB1c2VyIGZpbGUuDQotICogQHJldHZhbCBOb25lDQotICovDQotX193ZWFrIHZvaWQgSEFMX0luY1RpY2sodm9pZCkgeyB1d1RpY2sgKz0gdXdUaWNrRnJlcTsgfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBQcm92aWRlcyBhIHRpY2sgdmFsdWUgaW4gbWlsbGlzZWNvbmQuDQotICogQG5vdGUgVGhpcyBmdW5jdGlvbiBpcyBkZWNsYXJlZCBhcyBfX3dlYWsgdG8gYmUgb3ZlcndyaXR0ZW4gaW4gY2FzZSBvZiBvdGhlcg0KLSAqICAgICAgIGltcGxlbWVudGF0aW9ucyBpbiB1c2VyIGZpbGUuDQotICogQHJldHZhbCB0aWNrIHZhbHVlDQotICovDQotX193ZWFrIHVpbnQzMl90IEhBTF9HZXRUaWNrKHZvaWQpIHsgcmV0dXJuIHV3VGljazsgfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSB0aWNrIHByaW9yaXR5Lg0KLSAqIEByZXR2YWwgdGljayBwcmlvcml0eQ0KLSAqLw0KLXVpbnQzMl90IEhBTF9HZXRUaWNrUHJpbyh2b2lkKSB7IHJldHVybiB1d1RpY2tQcmlvOyB9DQotDQotLyoqDQotICogQGJyaWVmIFNldCBuZXcgdGljayBGcmVxLg0KLSAqIEByZXR2YWwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NldFRpY2tGcmVxKHVpbnQzMl90IEZyZXEpIHsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsNCi0gIHVpbnQzMl90IHByZXZUaWNrRnJlcTsNCi0NCi0gIGFzc2VydF9wYXJhbShJU19USUNLRlJFUShGcmVxKSk7DQotDQotICBpZiAodXdUaWNrRnJlcSAhPSBGcmVxKSB7DQotICAgIC8qIEJhY2sgdXAgdXdUaWNrRnJlcSBmcmVxdWVuY3kgKi8NCi0gICAgcHJldlRpY2tGcmVxID0gdXdUaWNrRnJlcTsNCi0NCi0gICAgLyogVXBkYXRlIHV3VGlja0ZyZXEgZ2xvYmFsIHZhcmlhYmxlIHVzZWQgYnkgSEFMX0luaXRUaWNrKCkgKi8NCi0gICAgdXdUaWNrRnJlcSA9IEZyZXE7DQotDQotICAgIC8qIEFwcGx5IHRoZSBuZXcgdGljayBGcmVxICAqLw0KLSAgICBzdGF0dXMgPSBIQUxfSW5pdFRpY2sodXdUaWNrUHJpbyk7DQotDQotICAgIGlmIChzdGF0dXMgIT0gSEFMX09LKSB7DQotICAgICAgLyogUmVzdG9yZSBwcmV2aW91cyB0aWNrIGZyZXF1ZW5jeSAqLw0KLSAgICAgIHV3VGlja0ZyZXEgPSBwcmV2VGlja0ZyZXE7DQotICAgIH0NCi0gIH0NCi0NCi0gIHJldHVybiBzdGF0dXM7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBSZXR1cm5zIHRpY2sgZnJlcXVlbmN5Lg0KLSAqIEByZXR2YWwgdGljayBwZXJpb2QgaW4gSHoNCi0gKi8NCi11aW50MzJfdCBIQUxfR2V0VGlja0ZyZXEodm9pZCkgeyByZXR1cm4gdXdUaWNrRnJlcTsgfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIG1pbmltdW0gZGVsYXkgKGluIG1pbGxpc2Vjb25kcykgYmFzZWQNCi0gKiAgICAgICAgb24gdmFyaWFibGUgaW5jcmVtZW50ZWQuDQotICogQG5vdGUgSW4gdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gLCBTeXNUaWNrIHRpbWVyIGlzIHRoZSBzb3VyY2Ugb2YgdGltZQ0KLSAqIGJhc2UuIEl0IGlzIHVzZWQgdG8gZ2VuZXJhdGUgaW50ZXJydXB0cyBhdCByZWd1bGFyIHRpbWUgaW50ZXJ2YWxzIHdoZXJlDQotICogdXdUaWNrIGlzIGluY3JlbWVudGVkLg0KLSAqIEBub3RlIFRoaXMgZnVuY3Rpb24gaXMgZGVjbGFyZWQgYXMgX193ZWFrIHRvIGJlIG92ZXJ3cml0dGVuIGluIGNhc2Ugb2Ygb3RoZXINCi0gKiAgICAgICBpbXBsZW1lbnRhdGlvbnMgaW4gdXNlciBmaWxlLg0KLSAqIEBwYXJhbSBEZWxheSBzcGVjaWZpZXMgdGhlIGRlbGF5IHRpbWUgbGVuZ3RoLCBpbiBtaWxsaXNlY29uZHMuDQotICogQHJldHZhbCBOb25lDQotICovDQotX193ZWFrIHZvaWQgSEFMX0RlbGF5KHVpbnQzMl90IERlbGF5KSB7DQotICB1aW50MzJfdCB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOw0KLSAgdWludDMyX3Qgd2FpdCA9IERlbGF5Ow0KLQ0KLSAgLyogQWRkIGEgZnJlcSB0byBndWFyYW50ZWUgbWluaW11bSB3YWl0ICovDQotICBpZiAod2FpdCA8IEhBTF9NQVhfREVMQVkpIHsNCi0gICAgd2FpdCArPSAodWludDMyX3QpKHV3VGlja0ZyZXEpOw0KLSAgfQ0KLQ0KLSAgd2hpbGUgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA8IHdhaXQpIHsNCi0gIH0NCi19DQotDQotLyoqDQotICogQGJyaWVmIFN1c3BlbmRzIFRpY2sgaW5jcmVtZW50Lg0KLSAqIEBub3RlIEluIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uICwgU3lzVGljayB0aW1lciBpcyB0aGUgc291cmNlIG9mIHRpbWUNCi0gKiBiYXNlLiBJdCBpcyB1c2VkIHRvIGdlbmVyYXRlIGludGVycnVwdHMgYXQgcmVndWxhciB0aW1lIGludGVydmFscy4gT25jZQ0KLSAqIEhBTF9TdXNwZW5kVGljaygpIGlzIGNhbGxlZCwgdGhlIFN5c1RpY2sgaW50ZXJydXB0IHdpbGwgYmUgZGlzYWJsZWQgYW5kIHNvDQotICogVGljayBpbmNyZW1lbnQgaXMgc3VzcGVuZGVkLg0KLSAqIEBub3RlIFRoaXMgZnVuY3Rpb24gaXMgZGVjbGFyZWQgYXMgX193ZWFrIHRvIGJlIG92ZXJ3cml0dGVuIGluIGNhc2Ugb2Ygb3RoZXINCi0gKiAgICAgICBpbXBsZW1lbnRhdGlvbnMgaW4gdXNlciBmaWxlLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fd2VhayB2b2lkIEhBTF9TdXNwZW5kVGljayh2b2lkKSB7DQotICAvKiBEaXNhYmxlIFN5c1RpY2sgSW50ZXJydXB0ICovDQotICBDTEVBUl9CSVQoU3lzVGljay0+Q1RSTCwgU3lzVGlja19DVFJMX1RJQ0tJTlRfTXNrKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmIFJlc3VtZSBUaWNrIGluY3JlbWVudC4NCi0gKiBAbm90ZSBJbiB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiAsIFN5c1RpY2sgdGltZXIgaXMgdGhlIHNvdXJjZSBvZiB0aW1lDQotICogYmFzZS4gSXQgaXMgdXNlZCB0byBnZW5lcmF0ZSBpbnRlcnJ1cHRzIGF0IHJlZ3VsYXIgdGltZSBpbnRlcnZhbHMuIE9uY2UNCi0gKiBIQUxfUmVzdW1lVGljaygpIGlzIGNhbGxlZCwgdGhlIFN5c1RpY2sgaW50ZXJydXB0IHdpbGwgYmUgZW5hYmxlZCBhbmQgc28gVGljaw0KLSAqIGluY3JlbWVudCBpcyByZXN1bWVkLg0KLSAqIEBub3RlIFRoaXMgZnVuY3Rpb24gaXMgZGVjbGFyZWQgYXMgX193ZWFrIHRvIGJlIG92ZXJ3cml0dGVuIGluIGNhc2Ugb2Ygb3RoZXINCi0gKiAgICAgICBpbXBsZW1lbnRhdGlvbnMgaW4gdXNlciBmaWxlLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fd2VhayB2b2lkIEhBTF9SZXN1bWVUaWNrKHZvaWQpIHsNCi0gIC8qIEVuYWJsZSBTeXNUaWNrIEludGVycnVwdCAqLw0KLSAgU0VUX0JJVChTeXNUaWNrLT5DVFJMLCBTeXNUaWNrX0NUUkxfVElDS0lOVF9Nc2spOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJldHVybnMgdGhlIEhBTCByZXZpc2lvbi4NCi0gKiBAcmV0dmFsIHZlcnNpb24gOiAweFhZWlIgKDhiaXRzIGZvciBlYWNoIGRlY2ltYWwsIFIgZm9yIFJDKQ0KLSAqLw0KLXVpbnQzMl90IEhBTF9HZXRIYWxWZXJzaW9uKHZvaWQpIHsgcmV0dXJuIF9fU1RNMzJHNHh4X0hBTF9WRVJTSU9OOyB9DQotDQotLyoqDQotICogQGJyaWVmICBSZXR1cm5zIHRoZSBkZXZpY2UgcmV2aXNpb24gaWRlbnRpZmllci4NCi0gKiBAcmV0dmFsIERldmljZSByZXZpc2lvbiBpZGVudGlmaWVyDQotICovDQotdWludDMyX3QgSEFMX0dldFJFVklEKHZvaWQpIHsNCi0gIHJldHVybiAoKERCR01DVS0+SURDT0RFICYgREJHTUNVX0lEQ09ERV9SRVZfSUQpID4+IDE2VSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmV0dXJucyB0aGUgZGV2aWNlIGlkZW50aWZpZXIuDQotICogQHJldHZhbCBEZXZpY2UgaWRlbnRpZmllcg0KLSAqLw0KLXVpbnQzMl90IEhBTF9HZXRERVZJRCh2b2lkKSB7IHJldHVybiAoREJHTUNVLT5JRENPREUgJiBEQkdNQ1VfSURDT0RFX0RFVl9JRCk7IH0NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgSEFMX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgSEFMIERlYnVnIGZ1bmN0aW9ucw0KLSAgKiAgQGJyaWVmICAgIEhBTCBEZWJ1ZyBmdW5jdGlvbnMNCi0gICoNCi1AdmVyYmF0aW0NCi0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIQUwgRGVidWcgZnVuY3Rpb25zICMjIyMjDQotID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoNCi0gICAgICAoKykgRW5hYmxlL0Rpc2FibGUgRGVidWcgbW9kdWxlIGR1cmluZyBTTEVFUCBtb2RlDQotICAgICAgKCspIEVuYWJsZS9EaXNhYmxlIERlYnVnIG1vZHVsZSBkdXJpbmcgU1RPUDAvU1RPUDEvU1RPUDIgbW9kZXMNCi0gICAgICAoKykgRW5hYmxlL0Rpc2FibGUgRGVidWcgbW9kdWxlIGR1cmluZyBTVEFOREJZIG1vZGUNCi0NCi1AZW5kdmVyYmF0aW0NCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgdGhlIERlYnVnIE1vZHVsZSBkdXJpbmcgU0xFRVAgbW9kZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi12b2lkIEhBTF9EQkdNQ1VfRW5hYmxlREJHU2xlZXBNb2RlKHZvaWQpIHsNCi0gIFNFVF9CSVQoREJHTUNVLT5DUiwgREJHTUNVX0NSX0RCR19TTEVFUCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSB0aGUgRGVidWcgTW9kdWxlIGR1cmluZyBTTEVFUCBtb2RlLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXZvaWQgSEFMX0RCR01DVV9EaXNhYmxlREJHU2xlZXBNb2RlKHZvaWQpIHsNCi0gIENMRUFSX0JJVChEQkdNQ1UtPkNSLCBEQkdNQ1VfQ1JfREJHX1NMRUVQKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgdGhlIERlYnVnIE1vZHVsZSBkdXJpbmcgU1RPUDAvU1RPUDEvU1RPUDIgbW9kZXMuDQotICogQHJldHZhbCBOb25lDQotICovDQotdm9pZCBIQUxfREJHTUNVX0VuYWJsZURCR1N0b3BNb2RlKHZvaWQpIHsNCi0gIFNFVF9CSVQoREJHTUNVLT5DUiwgREJHTUNVX0NSX0RCR19TVE9QKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIHRoZSBEZWJ1ZyBNb2R1bGUgZHVyaW5nIFNUT1AwL1NUT1AxL1NUT1AyIG1vZGVzLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXZvaWQgSEFMX0RCR01DVV9EaXNhYmxlREJHU3RvcE1vZGUodm9pZCkgew0KLSAgQ0xFQVJfQklUKERCR01DVS0+Q1IsIERCR01DVV9DUl9EQkdfU1RPUCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIHRoZSBEZWJ1ZyBNb2R1bGUgZHVyaW5nIFNUQU5EQlkgbW9kZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi12b2lkIEhBTF9EQkdNQ1VfRW5hYmxlREJHU3RhbmRieU1vZGUodm9pZCkgew0KLSAgU0VUX0JJVChEQkdNQ1UtPkNSLCBEQkdNQ1VfQ1JfREJHX1NUQU5EQlkpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgdGhlIERlYnVnIE1vZHVsZSBkdXJpbmcgU1RBTkRCWSBtb2RlLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXZvaWQgSEFMX0RCR01DVV9EaXNhYmxlREJHU3RhbmRieU1vZGUodm9pZCkgew0KLSAgQ0xFQVJfQklUKERCR01DVS0+Q1IsIERCR01DVV9DUl9EQkdfU1RBTkRCWSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBIQUxfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNCBIQUwgU1lTQ0ZHIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb25zDQotICAqICBAYnJpZWYgICAgSEFMIFNZU0NGRyBjb25maWd1cmF0aW9uIGZ1bmN0aW9ucw0KLSAgKg0KLUB2ZXJiYXRpbQ0KLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhBTCBTWVNDRkcgY29uZmlndXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMNCi0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOg0KLSAgICAgICgrKSBTdGFydCBhIGhhcmR3YXJlIENDTVNSQU0gZXJhc2Ugb3BlcmF0aW9uDQotICAgICAgKCspIEVuYWJsZS9EaXNhYmxlIHRoZSBJbnRlcm5hbCBGTEFTSCBCYW5rIFN3YXBwaW5nDQotICAgICAgKCspIENvbmZpZ3VyZSB0aGUgVm9sdGFnZSByZWZlcmVuY2UgYnVmZmVyDQotICAgICAgKCspIEVuYWJsZS9EaXNhYmxlIHRoZSBWb2x0YWdlIHJlZmVyZW5jZSBidWZmZXINCi0gICAgICAoKykgRW5hYmxlL0Rpc2FibGUgdGhlIEkvTyBhbmFsb2cgc3dpdGNoIHZvbHRhZ2UgYm9vc3Rlcg0KLQ0KLUBlbmR2ZXJiYXRpbQ0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFN0YXJ0IGEgaGFyZHdhcmUgQ0NNU1JBTSBlcmFzZSBvcGVyYXRpb24uDQotICogQG5vdGUgICBBcyBsb25nIGFzIENDTVNSQU0gaXMgbm90IGVyYXNlZCB0aGUgQ0NNRVIgYml0IHdpbGwgYmUgc2V0Lg0KLSAqICAgICAgICAgVGhpcyBiaXQgaXMgYXV0b21hdGljYWxseSByZXNldCBhdCB0aGUgZW5kIG9mIHRoZSBDQ01TUkFNIGVyYXNlDQotICogb3BlcmF0aW9uLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXZvaWQgSEFMX1NZU0NGR19DQ01TUkFNRXJhc2Uodm9pZCkgew0KLSAgLyogdW5sb2NrIHRoZSB3cml0ZSBwcm90ZWN0aW9uIG9mIHRoZSBDQ01FUiBiaXQgKi8NCi0gIFNZU0NGRy0+U0tSID0gMHhDQTsNCi0gIFNZU0NGRy0+U0tSID0gMHg1MzsNCi0gIC8qIFN0YXJ0cyBhIGhhcmR3YXJlIENDTVNSQU0gZXJhc2Ugb3BlcmF0aW9uKi8NCi0gIFNFVF9CSVQoU1lTQ0ZHLT5TQ1NSLCBTWVNDRkdfU0NTUl9DQ01FUik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIHRoZSBJbnRlcm5hbCBGTEFTSCBCYW5rIFN3YXBwaW5nLg0KLSAqDQotICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIG9ubHkgZm9yIFNUTTMyRzR4eCBkZXZpY2VzLg0KLSAqDQotICogQG5vdGUgICBGbGFzaCBCYW5rMiBtYXBwZWQgYXQgMHgwODAwMDAwMCAoYW5kIGFsaWFzZWQgQDB4MDAwMDAwMDApDQotICogICAgICAgICBhbmQgRmxhc2ggQmFuazEgbWFwcGVkIGF0IDB4MDgwNDAwMDAgKGFuZCBhbGlhc2VkIGF0IDB4MDAwNDAwMDApDQotICoNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi12b2lkIEhBTF9TWVNDRkdfRW5hYmxlTWVtb3J5U3dhcHBpbmdCYW5rKHZvaWQpIHsNCi0gIFNFVF9CSVQoU1lTQ0ZHLT5NRU1STVAsIFNZU0NGR19NRU1STVBfRkJfTU9ERSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSB0aGUgSW50ZXJuYWwgRkxBU0ggQmFuayBTd2FwcGluZy4NCi0gKg0KLSAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBvbmx5IGZvciBTVE0zMkc0eHggZGV2aWNlcy4NCi0gKg0KLSAqIEBub3RlICAgVGhlIGRlZmF1bHQgc3RhdGUgOiBGbGFzaCBCYW5rMSBtYXBwZWQgYXQgMHgwODAwMDAwMCAoYW5kIGFsaWFzZWQNCi0gKiBAMHgwMDAwIDAwMDApIGFuZCBGbGFzaCBCYW5rMiBtYXBwZWQgYXQgMHgwODA0MDAwMCAoYW5kIGFsaWFzZWQgYXQNCi0gKiAweDAwMDQwMDAwKQ0KLSAqDQotICogQHJldHZhbCBOb25lDQotICovDQotdm9pZCBIQUxfU1lTQ0ZHX0Rpc2FibGVNZW1vcnlTd2FwcGluZ0Jhbmsodm9pZCkgew0KLSAgQ0xFQVJfQklUKFNZU0NGRy0+TUVNUk1QLCBTWVNDRkdfTUVNUk1QX0ZCX01PREUpOw0KLX0NCi0NCi0jaWYgZGVmaW5lZChWUkVGQlVGKQ0KLS8qKg0KLSAqIEBicmllZiBDb25maWd1cmUgdGhlIGludGVybmFsIHZvbHRhZ2UgcmVmZXJlbmNlIGJ1ZmZlciB2b2x0YWdlIHNjYWxlLg0KLSAqIEBwYXJhbSAgVm9sdGFnZVNjYWxpbmc6IHNwZWNpZmllcyB0aGUgb3V0cHV0IHZvbHRhZ2UgdG8gYWNoaWV2ZQ0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIFNZU0NGR19WUkVGQlVGX1ZPTFRBR0VfU0NBTEUwOiBWUkVGQlVGX09VVCBhcm91bmQgMi4wNDggVi4NCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcmVxdWlyZXMgVkREQSBlcXVhbCB0byBvcg0KLSAqIGhpZ2hlciB0aGFuIDIuNCBWLg0KLSAqICAgICAgICAgICAgQGFyZyBTWVNDRkdfVlJFRkJVRl9WT0xUQUdFX1NDQUxFMTogVlJFRkJVRl9PVVQgYXJvdW5kIDIuNSBWLg0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyByZXF1aXJlcyBWRERBIGVxdWFsIHRvIG9yDQotICogaGlnaGVyIHRoYW4gMi44IFYuDQotICogICAgICAgICAgICBAYXJnIFNZU0NGR19WUkVGQlVGX1ZPTFRBR0VfU0NBTEUyOiBWUkVGQlVGX09VVCBhcm91bmQgMi45IFYuDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHJlcXVpcmVzIFZEREEgZXF1YWwgdG8gb3INCi0gKiBoaWdoZXIgdGhhbiAzLjE1IFYuDQotICogQHJldHZhbCBOb25lDQotICovDQotdm9pZCBIQUxfU1lTQ0ZHX1ZSRUZCVUZfVm9sdGFnZVNjYWxpbmdDb25maWcodWludDMyX3QgVm9sdGFnZVNjYWxpbmcpIHsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfU1lTQ0ZHX1ZSRUZCVUZfVk9MVEFHRV9TQ0FMRShWb2x0YWdlU2NhbGluZykpOw0KLQ0KLSAgTU9ESUZZX1JFRyhWUkVGQlVGLT5DU1IsIFZSRUZCVUZfQ1NSX1ZSUywgVm9sdGFnZVNjYWxpbmcpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgQ29uZmlndXJlIHRoZSBpbnRlcm5hbCB2b2x0YWdlIHJlZmVyZW5jZSBidWZmZXIgaGlnaCBpbXBlZGFuY2UgbW9kZS4NCi0gKiBAcGFyYW0gIE1vZGU6IHNwZWNpZmllcyB0aGUgaGlnaCBpbXBlZGFuY2UgbW9kZQ0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIFNZU0NGR19WUkVGQlVGX0hJR0hfSU1QRURBTkNFX0RJU0FCTEU6IFZSRUYrIHBpbiBpcw0KLSAqIGludGVybmFsbHkgY29ubmVjdCB0byBWUkVGSU5UIG91dHB1dC4NCi0gKiAgICAgICAgICAgIEBhcmcgU1lTQ0ZHX1ZSRUZCVUZfSElHSF9JTVBFREFOQ0VfRU5BQkxFOiBWUkVGKyBwaW4gaXMgaGlnaA0KLSAqIGltcGVkYW5jZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi12b2lkIEhBTF9TWVNDRkdfVlJFRkJVRl9IaWdoSW1wZWRhbmNlQ29uZmlnKHVpbnQzMl90IE1vZGUpIHsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfU1lTQ0ZHX1ZSRUZCVUZfSElHSF9JTVBFREFOQ0UoTW9kZSkpOw0KLQ0KLSAgTU9ESUZZX1JFRyhWUkVGQlVGLT5DU1IsIFZSRUZCVUZfQ1NSX0hJWiwgTW9kZSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBUdW5lIHRoZSBJbnRlcm5hbCBWb2x0YWdlIFJlZmVyZW5jZSBidWZmZXIgKFZSRUZCVUYpLg0KLSAqIEBwYXJhbSBUcmltbWluZ1ZhbHVlIHNwZWNpZmllcyB0cmltbWluZyBjb2RlIGZvciBWUkVGQlVGIGNhbGlicmF0aW9uDQotICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMCBhbmQgTWF4X0RhdGEgPQ0KLSAqIDB4M0YNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi12b2lkIEhBTF9TWVNDRkdfVlJFRkJVRl9UcmltbWluZ0NvbmZpZyh1aW50MzJfdCBUcmltbWluZ1ZhbHVlKSB7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1NZU0NGR19WUkVGQlVGX1RSSU1NSU5HKFRyaW1taW5nVmFsdWUpKTsNCi0NCi0gIE1PRElGWV9SRUcoVlJFRkJVRi0+Q0NSLCBWUkVGQlVGX0NDUl9UUklNLCBUcmltbWluZ1ZhbHVlKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgdGhlIEludGVybmFsIFZvbHRhZ2UgUmVmZXJlbmNlIGJ1ZmZlciAoVlJFRkJVRikuDQotICogQHJldHZhbCBIQUxfT0svSEFMX1RJTUVPVVQNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfU1lTQ0ZHX0VuYWJsZVZSRUZCVUYodm9pZCkgew0KLSAgdWludDMyX3QgdGlja3N0YXJ0Ow0KLQ0KLSAgU0VUX0JJVChWUkVGQlVGLT5DU1IsIFZSRUZCVUZfQ1NSX0VOVlIpOw0KLQ0KLSAgLyogR2V0IFN0YXJ0IFRpY2sqLw0KLSAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsNCi0NCi0gIC8qIFdhaXQgZm9yIFZSUiBiaXQgICovDQotICB3aGlsZSAoUkVBRF9CSVQoVlJFRkJVRi0+Q1NSLCBWUkVGQlVGX0NTUl9WUlIpID09IDB4MDBVKSB7DQotICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBWUkVGQlVGX1RJTUVPVVRfVkFMVUUpIHsNCi0gICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7DQotICAgIH0NCi0gIH0NCi0NCi0gIHJldHVybiBIQUxfT0s7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSB0aGUgSW50ZXJuYWwgVm9sdGFnZSBSZWZlcmVuY2UgYnVmZmVyIChWUkVGQlVGKS4NCi0gKg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXZvaWQgSEFMX1NZU0NGR19EaXNhYmxlVlJFRkJVRih2b2lkKSB7DQotICBDTEVBUl9CSVQoVlJFRkJVRi0+Q1NSLCBWUkVGQlVGX0NTUl9FTlZSKTsNCi19DQotI2VuZGlmIC8qIFZSRUZCVUYgKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSB0aGUgSS9PIGFuYWxvZyBzd2l0Y2ggdm9sdGFnZSBib29zdGVyDQotICoNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi12b2lkIEhBTF9TWVNDRkdfRW5hYmxlSU9Td2l0Y2hCb29zdGVyKHZvaWQpIHsNCi0gIFNFVF9CSVQoU1lTQ0ZHLT5DRkdSMSwgU1lTQ0ZHX0NGR1IxX0JPT1NURU4pOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgdGhlIEkvTyBhbmFsb2cgc3dpdGNoIHZvbHRhZ2UgYm9vc3Rlcg0KLSAqDQotICogQHJldHZhbCBOb25lDQotICovDQotdm9pZCBIQUxfU1lTQ0ZHX0Rpc2FibGVJT1N3aXRjaEJvb3N0ZXIodm9pZCkgew0KLSAgQ0xFQVJfQklUKFNZU0NGRy0+Q0ZHUjEsIFNZU0NGR19DRkdSMV9CT09TVEVOKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgdGhlIEkvTyBhbmFsb2cgc3dpdGNoIHZvbHRhZ2UgYnkgVkREDQotICoNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi12b2lkIEhBTF9TWVNDRkdfRW5hYmxlSU9Td2l0Y2hWREQodm9pZCkgew0KLSAgU0VUX0JJVChTWVNDRkctPkNGR1IxLCBTWVNDRkdfQ0ZHUjFfQU5BU1dWREQpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgdGhlIEkvTyBhbmFsb2cgc3dpdGNoIHZvbHRhZ2UgYnkgVkREDQotICoNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi12b2lkIEhBTF9TWVNDRkdfRGlzYWJsZUlPU3dpdGNoVkREKHZvaWQpIHsNCi0gIENMRUFSX0JJVChTWVNDRkctPkNGR1IxLCBTWVNDRkdfQ0ZHUjFfQU5BU1dWREQpOw0KLX0NCi0NCi0vKiogQGJyaWVmICBDQ01TUkFNIHBhZ2Ugd3JpdGUgcHJvdGVjdGlvbiBlbmFibGUNCi0gKiBAcGFyYW0gUGFnZTogVGhpcyBwYXJhbWV0ZXIgaXMgYSBsb25nIDMyYml0IHZhbHVlIGFuZCBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmDQotICogU1lTQ0ZHX0NDTVNSQU1XUlANCi0gKiBAbm90ZSAgIHdyaXRlIHByb3RlY3Rpb24gY2FuIG9ubHkgYmUgZGlzYWJsZWQgYnkgYSBzeXN0ZW0gcmVzZXQNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi12b2lkIEhBTF9TWVNDRkdfQ0NNU1JBTV9Xcml0ZVByb3RlY3Rpb25FbmFibGUodWludDMyX3QgUGFnZSkgew0KLSAgYXNzZXJ0X3BhcmFtKElTX1NZU0NGR19DQ01TUkFNV1JQX1BBR0UoUGFnZSkpOw0KLQ0KLSAgU0VUX0JJVChTWVNDRkctPlNXUFIsICh1aW50MzJfdCkoUGFnZSkpOw0KLX0NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotI2VuZGlmIC8qIEhBTF9NT0RVTEVfRU5BQkxFRCAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnNHh4X2hhbC5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGlzIHRoZSBjb21tb24gcGFydCBvZiB0aGUgSEFMIGluaXRpYWxpemF0aW9uCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGVybXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZQorICAqIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4KKyAgKiBJZiBubyBMSUNFTlNFIGZpbGUgY29tZXMgd2l0aCB0aGlzIHNvZnR3YXJlLCBpdCBpcyBwcm92aWRlZCBBUy1JUy4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhlIGNvbW1vbiBIQUwgZHJpdmVyIGNvbnRhaW5zIGEgc2V0IG9mIGdlbmVyaWMgYW5kIGNvbW1vbiBBUElzIHRoYXQgY2FuIGJlCisgICAgdXNlZCBieSB0aGUgUFBQIHBlcmlwaGVyYWwgZHJpdmVycyBhbmQgdGhlIHVzZXIgdG8gc3RhcnQgdXNpbmcgdGhlIEhBTC4KKyAgICBbLi5dCisgICAgVGhlIEhBTCBjb250YWlucyB0d28gQVBJcycgY2F0ZWdvcmllczoKKyAgICAgICAgICgrKSBDb21tb24gSEFMIEFQSXMKKyAgICAgICAgICgrKSBTZXJ2aWNlcyBIQUwgQVBJcworCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmc0eHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkc0eHhfSEFMX0RyaXZlcgorICogQHsKKyAqLworCisvKiogQGRlZmdyb3VwIEhBTCBIQUwKKyAqIEBicmllZiBIQUwgbW9kdWxlIGRyaXZlcgorICogQHsKKyAqLworCisjaWZkZWYgSEFMX01PRFVMRV9FTkFCTEVECisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqCisgKiBAYnJpZWYgU1RNMzJHNHh4IEhBTCBEcml2ZXIgdmVyc2lvbiBudW1iZXIgVjEuMi41CisgKi8KKyNkZWZpbmUgX19TVE0zMkc0eHhfSEFMX1ZFUlNJT05fTUFJTiAoMHgwMVUpIC8qITwgWzMxOjI0XSBtYWluIHZlcnNpb24gKi8KKyNkZWZpbmUgX19TVE0zMkc0eHhfSEFMX1ZFUlNJT05fU1VCMSAoMHgwMlUpIC8qITwgWzIzOjE2XSBzdWIxIHZlcnNpb24gKi8KKyNkZWZpbmUgX19TVE0zMkc0eHhfSEFMX1ZFUlNJT05fU1VCMiAoMHgwNVUpIC8qITwgWzE1OjhdICBzdWIyIHZlcnNpb24gKi8KKyNkZWZpbmUgX19TVE0zMkc0eHhfSEFMX1ZFUlNJT05fUkMgKDB4MDBVKSAgIC8qITwgWzc6MF0gIHJlbGVhc2UgY2FuZGlkYXRlICovCisjZGVmaW5lIF9fU1RNMzJHNHh4X0hBTF9WRVJTSU9OICAgICAgICAgICAgXAorICAoKF9fU1RNMzJHNHh4X0hBTF9WRVJTSU9OX01BSU4gPDwgMjRVKSB8IFwKKyAgIChfX1NUTTMyRzR4eF9IQUxfVkVSU0lPTl9TVUIxIDw8IDE2VSkgfCBcCisgICAoX19TVE0zMkc0eHhfSEFMX1ZFUlNJT05fU1VCMiA8PCA4VSkgfCAoX19TVE0zMkc0eHhfSEFMX1ZFUlNJT05fUkMpKQorCisjaWYgZGVmaW5lZChWUkVGQlVGKQorI2RlZmluZSBWUkVGQlVGX1RJTUVPVVRfVkFMVUUgMTBVIC8qIDEwIG1zICovCisjZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVlJFRkJVRiAqLworCisvKiAtLS0tLS0tLS0tLS0gU1lTQ0ZHIHJlZ2lzdGVycyBiaXQgYWRkcmVzcyBpbiB0aGUgYWxpYXMgcmVnaW9uIC0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBTWVNDRkdfT0ZGU0VUIChTWVNDRkdfQkFTRSAtIFBFUklQSF9CQVNFKQorLyogLS0tICBNRU1STVAgUmVnaXN0ZXIgLS0tKi8KKy8qIEFsaWFzIHdvcmQgYWRkcmVzcyBvZiBGQl9NT0RFIGJpdCAqLworI2RlZmluZSBNRU1STVBfT0ZGU0VUIFNZU0NGR19PRkZTRVQKKyNkZWZpbmUgRkJfTU9ERV9CaXROdW1iZXIgKCh1aW50OF90KTB4OCkKKyNkZWZpbmUgRkJfTU9ERV9CQiBcCisgIChQRVJJUEhfQkJfQkFTRSArIChNRU1STVBfT0ZGU0VUICogMzIpICsgKEZCX01PREVfQml0TnVtYmVyICogNCkpCisKKy8qIC0tLSBHUEMgUmVnaXN0ZXIgLS0tKi8KKy8qIEFsaWFzIHdvcmQgYWRkcmVzcyBvZiBDQ01FUiBiaXQgKi8KKyNkZWZpbmUgU0NTUl9PRkZTRVQgKFNZU0NGR19PRkZTRVQgKyAweDE4KQorI2RlZmluZSBDQ01FUl9CaXROdW1iZXIgKCh1aW50OF90KTB4MCkKKyNkZWZpbmUgU0NTUl9DQ01FUl9CQiBcCisgIChQRVJJUEhfQkJfQkFTRSArIChTQ1NSX09GRlNFVCAqIDMyKSArIChDQ01FUl9CaXROdW1iZXIgKiA0KSkKKworLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIHZhcmlhYmxlcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSEFMX0V4cG9ydGVkX1ZhcmlhYmxlcyBIQUwgRXhwb3J0ZWQgVmFyaWFibGVzCisgKiBAeworICovCitfX0lPIHVpbnQzMl90IHV3VGljazsKK3VpbnQzMl90IHV3VGlja1ByaW8gPSAoMVVMIDw8IF9fTlZJQ19QUklPX0JJVFMpOyAvKiBJbnZhbGlkIFBSSU8gKi8KK3VpbnQzMl90IHV3VGlja0ZyZXEgPSBIQUxfVElDS19GUkVRX0RFRkFVTFQ7ICAgICAvKiAxS0h6ICovCisvKioKKyAqIEB9CisgKi8KKworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0V4cG9ydGVkX0Z1bmN0aW9ucyBIQUwgRXhwb3J0ZWQgRnVuY3Rpb25zCisgKiBAeworICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uCitGdW5jdGlvbnMKKyAgKiAgQGJyaWVmICAgIEhBTCBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgICAoKykgSW5pdGlhbGl6ZSB0aGUgRmxhc2ggaW50ZXJmYWNlIHRoZSBOVklDIGFsbG9jYXRpb24gYW5kIGluaXRpYWwgdGltZQorYmFzZSBjbG9jayBjb25maWd1cmF0aW9uLgorICAgICAgKCspIERlLUluaXRpYWxpemUgY29tbW9uIHBhcnQgb2YgdGhlIEhBTC4KKyAgICAgICgrKSBDb25maWd1cmUgdGhlIHRpbWUgYmFzZSBzb3VyY2UgdG8gaGF2ZSAxbXMgdGltZSBiYXNlIHdpdGggYSBkZWRpY2F0ZWQKKyAgICAgICAgICBUaWNrIGludGVycnVwdCBwcmlvcml0eS4KKyAgICAgICAgKCsrKSBTeXNUaWNrIHRpbWVyIGlzIHVzZWQgYnkgZGVmYXVsdCBhcyBzb3VyY2Ugb2YgdGltZSBiYXNlLCBidXQgdXNlcgorICAgICAgICAgICAgIGNhbiBldmVudHVhbGx5IGltcGxlbWVudCBoaXMgcHJvcGVyIHRpbWUgYmFzZSBzb3VyY2UgKGEgZ2VuZXJhbAorcHVycG9zZSB0aW1lciBmb3IgZXhhbXBsZSBvciBvdGhlciB0aW1lIHNvdXJjZSksIGtlZXBpbmcgaW4gbWluZCB0aGF0IFRpbWUgYmFzZQorICAgICAgICAgICAgIGR1cmF0aW9uIHNob3VsZCBiZSBrZXB0IDFtcyBzaW5jZSBQUFBfVElNRU9VVF9WQUxVRXMgYXJlIGRlZmluZWQKK2FuZCBoYW5kbGVkIGluIG1pbGxpc2Vjb25kcyBiYXNpcy4KKyAgICAgICAgKCsrKSBUaW1lIGJhc2UgY29uZmlndXJhdGlvbiBmdW5jdGlvbiAoSEFMX0luaXRUaWNrICgpKSBpcyBjYWxsZWQKK2F1dG9tYXRpY2FsbHkgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcHJvZ3JhbSBhZnRlciByZXNldCBieSBIQUxfSW5pdCgpIG9yIGF0CithbnkgdGltZSB3aGVuIGNsb2NrIGlzIGNvbmZpZ3VyZWQsIGJ5IEhBTF9SQ0NfQ2xvY2tDb25maWcoKS4KKyAgICAgICAgKCsrKSBTb3VyY2Ugb2YgdGltZSBiYXNlIGlzIGNvbmZpZ3VyZWQgIHRvIGdlbmVyYXRlIGludGVycnVwdHMgYXQKK3JlZ3VsYXIgdGltZSBpbnRlcnZhbHMuIENhcmUgbXVzdCBiZSB0YWtlbiBpZiBIQUxfRGVsYXkoKSBpcyBjYWxsZWQgZnJvbSBhCisgICAgICAgICAgICAgcGVyaXBoZXJhbCBJU1IgcHJvY2VzcywgdGhlIFRpY2sgaW50ZXJydXB0IGxpbmUgbXVzdCBoYXZlIGhpZ2hlcgorcHJpb3JpdHkgKG51bWVyaWNhbGx5IGxvd2VyKSB0aGFuIHRoZSBwZXJpcGhlcmFsIGludGVycnVwdC4gT3RoZXJ3aXNlIHRoZSBjYWxsZXIKKyAgICAgICAgICAgIElTUiBwcm9jZXNzIHdpbGwgYmUgYmxvY2tlZC4KKyAgICAgICAoKyspIGZ1bmN0aW9ucyBhZmZlY3RpbmcgdGltZSBiYXNlIGNvbmZpZ3VyYXRpb25zIGFyZSBkZWNsYXJlZCBhcyBfX3dlYWsKKyAgICAgICAgICAgICB0byBtYWtlICBvdmVycmlkZSBwb3NzaWJsZSAgaW4gY2FzZSBvZiBvdGhlciAgaW1wbGVtZW50YXRpb25zIGluCit1c2VyIGZpbGUuCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgRmxhc2ggcHJlZmV0Y2gsIHRoZQorICogSW5zdHJ1Y3Rpb24gYW5kIERhdGEgY2FjaGVzLCB0aGUgdGltZSBiYXNlIHNvdXJjZSwgTlZJQyBhbmQgYW55IHJlcXVpcmVkCisgKiBnbG9iYWwgbG93IGxldmVsIGhhcmR3YXJlIGJ5IGNhbGxpbmcgdGhlIEhBTF9Nc3BJbml0KCkgY2FsbGJhY2sgZnVuY3Rpb24gdG8KKyAqIGJlIG9wdGlvbmFsbHkgZGVmaW5lZCBpbiB1c2VyIGZpbGUgc3RtMzJnNHh4X2hhbF9tc3AuYy4KKyAqCisgKiBAbm90ZSAgIEhBTF9Jbml0KCkgZnVuY3Rpb24gaXMgY2FsbGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgcHJvZ3JhbSBhZnRlciByZXNldAorICogYW5kIGJlZm9yZSB0aGUgY2xvY2sgY29uZmlndXJhdGlvbi4KKyAqCisgKiBAbm90ZSAgIEluIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHRoZSBTeXN0ZW0gVGltZXIgKFN5c3RpY2spIGlzIHVzZWQgYXMKKyAqIHNvdXJjZSBvZiB0aW1lIGJhc2UuIFRoZSBTeXN0aWNrIGNvbmZpZ3VyYXRpb24gaXMgYmFzZWQgb24gSFNJIGNsb2NrLCBhcyBIU0kKKyAqIGlzIHRoZSBjbG9jayB1c2VkIGFmdGVyIGEgc3lzdGVtIFJlc2V0IGFuZCB0aGUgTlZJQyBjb25maWd1cmF0aW9uIGlzIHNldCB0bworICogUHJpb3JpdHkgZ3JvdXAgNC4gT25jZSBkb25lLCB0aW1lIGJhc2UgdGljayBzdGFydHMgaW5jcmVtZW50aW5nOiB0aGUgdGljaworICogdmFyaWFibGUgY291bnRlciBpcyBpbmNyZW1lbnRlZCBlYWNoIDFtcyBpbiB0aGUgU3lzVGlja19IYW5kbGVyKCkgaW50ZXJydXB0CisgKiBoYW5kbGVyLgorICoKKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSW5pdCh2b2lkKSB7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKyAgLyogQ29uZmlndXJlIEZsYXNoIHByZWZldGNoLCBJbnN0cnVjdGlvbiBjYWNoZSwgRGF0YSBjYWNoZSAqLworICAvKiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gYXQgcmVzZXQgaXM6ICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIC0gUHJlZmV0Y2ggZGlzYWJsZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogLSBJbnN0cnVjdGlvbiBjYWNoZSBlbmFibGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAtIERhdGEgY2FjaGUgZW5hYmxlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjaWYgKElOU1RSVUNUSU9OX0NBQ0hFX0VOQUJMRSA9PSAwVSkKKyAgX19IQUxfRkxBU0hfSU5TVFJVQ1RJT05fQ0FDSEVfRElTQUJMRSgpOworI2VuZGlmIC8qIElOU1RSVUNUSU9OX0NBQ0hFX0VOQUJMRSAqLworCisjaWYgKERBVEFfQ0FDSEVfRU5BQkxFID09IDBVKQorICBfX0hBTF9GTEFTSF9EQVRBX0NBQ0hFX0RJU0FCTEUoKTsKKyNlbmRpZiAvKiBEQVRBX0NBQ0hFX0VOQUJMRSAqLworCisjaWYgKFBSRUZFVENIX0VOQUJMRSAhPSAwVSkKKyAgX19IQUxfRkxBU0hfUFJFRkVUQ0hfQlVGRkVSX0VOQUJMRSgpOworI2VuZGlmIC8qIFBSRUZFVENIX0VOQUJMRSAqLworCisgIC8qIFNldCBJbnRlcnJ1cHQgR3JvdXAgUHJpb3JpdHkgKi8KKyAgSEFMX05WSUNfU2V0UHJpb3JpdHlHcm91cGluZyhOVklDX1BSSU9SSVRZR1JPVVBfNCk7CisKKyAgLyogVXNlIFN5c1RpY2sgYXMgdGltZSBiYXNlIHNvdXJjZSBhbmQgY29uZmlndXJlIDFtcyB0aWNrIChkZWZhdWx0IGNsb2NrIGFmdGVyCisgICAqIFJlc2V0IGlzIEhTSSkgKi8KKyAgaWYgKEhBTF9Jbml0VGljayhUSUNLX0lOVF9QUklPUklUWSkgIT0gSEFMX09LKSB7CisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9IGVsc2UgeworICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLworICAgIEhBTF9Nc3BJbml0KCk7CisgIH0KKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGRlLWluaXRpYWxpemVzIGNvbW1vbiBwYXJ0IG9mIHRoZSBIQUwgYW5kIHN0b3BzIHRoZQorICogc291cmNlIG9mIHRpbWUgYmFzZS4KKyAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBpcyBvcHRpb25hbC4KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRGVJbml0KHZvaWQpIHsKKyAgLyogUmVzZXQgb2YgYWxsIHBlcmlwaGVyYWxzICovCisgIF9fSEFMX1JDQ19BUEIxX0ZPUkNFX1JFU0VUKCk7CisgIF9fSEFMX1JDQ19BUEIxX1JFTEVBU0VfUkVTRVQoKTsKKworICBfX0hBTF9SQ0NfQVBCMl9GT1JDRV9SRVNFVCgpOworICBfX0hBTF9SQ0NfQVBCMl9SRUxFQVNFX1JFU0VUKCk7CisKKyAgX19IQUxfUkNDX0FIQjFfRk9SQ0VfUkVTRVQoKTsKKyAgX19IQUxfUkNDX0FIQjFfUkVMRUFTRV9SRVNFVCgpOworCisgIF9fSEFMX1JDQ19BSEIyX0ZPUkNFX1JFU0VUKCk7CisgIF9fSEFMX1JDQ19BSEIyX1JFTEVBU0VfUkVTRVQoKTsKKworICBfX0hBTF9SQ0NfQUhCM19GT1JDRV9SRVNFVCgpOworICBfX0hBTF9SQ0NfQUhCM19SRUxFQVNFX1JFU0VUKCk7CisKKyAgLyogRGUtSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgIEhBTF9Nc3BEZUluaXQoKTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBNU1AuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX193ZWFrIHZvaWQgSEFMX01zcEluaXQodm9pZCkgeworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX01zcEluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZXMgdGhlIE1TUC4KKyAqIEByZXR2YWwgTm9uZQorICovCitfX3dlYWsgdm9pZCBIQUxfTXNwRGVJbml0KHZvaWQpIHsKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9Nc3BEZUluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgKiBAYnJpZWYgVGhpcyBmdW5jdGlvbiBjb25maWd1cmVzIHRoZSBzb3VyY2Ugb2YgdGhlIHRpbWUgYmFzZToKKyAqICAgICAgICBUaGUgdGltZSBzb3VyY2UgaXMgY29uZmlndXJlZCB0byBoYXZlIDFtcyB0aW1lIGJhc2Ugd2l0aCBhIGRlZGljYXRlZAorICogICAgICAgIFRpY2sgaW50ZXJydXB0IHByaW9yaXR5LgorICogQG5vdGUgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgIGF1dG9tYXRpY2FsbHkgYXQgdGhlIGJlZ2lubmluZyBvZiBwcm9ncmFtCisgKiBhZnRlciByZXNldCBieSBIQUxfSW5pdCgpIG9yIGF0IGFueSB0aW1lIHdoZW4gY2xvY2sgaXMgcmVjb25maWd1cmVkICBieQorICogSEFMX1JDQ19DbG9ja0NvbmZpZygpLgorICogQG5vdGUgSW4gdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24sIFN5c1RpY2sgdGltZXIgaXMgdGhlIHNvdXJjZSBvZiB0aW1lCisgKiBiYXNlLiBJdCBpcyB1c2VkIHRvIGdlbmVyYXRlIGludGVycnVwdHMgYXQgcmVndWxhciB0aW1lIGludGVydmFscy4gQ2FyZSBtdXN0CisgKiBiZSB0YWtlbiBpZiBIQUxfRGVsYXkoKSBpcyBjYWxsZWQgZnJvbSBhIHBlcmlwaGVyYWwgSVNSIHByb2Nlc3MsIFRoZSBTeXNUaWNrCisgKiBpbnRlcnJ1cHQgbXVzdCBoYXZlIGhpZ2hlciBwcmlvcml0eSAobnVtZXJpY2FsbHkgbG93ZXIpIHRoYW4gdGhlIHBlcmlwaGVyYWwKKyAqIGludGVycnVwdC4gT3RoZXJ3aXNlIHRoZSBjYWxsZXIgSVNSIHByb2Nlc3Mgd2lsbCBiZSBibG9ja2VkLiBUaGUgZnVuY3Rpb24gaXMKKyAqIGRlY2xhcmVkIGFzIF9fd2VhayAgdG8gYmUgb3ZlcndyaXR0ZW4gIGluIGNhc2Ugb2Ygb3RoZXIgaW1wbGVtZW50YXRpb24gIGluCisgKiB1c2VyIGZpbGUuCisgKiBAcGFyYW0gVGlja1ByaW9yaXR5OiBUaWNrIGludGVycnVwdCBwcmlvcml0eS4KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitfX3dlYWsgSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0luaXRUaWNrKHVpbnQzMl90IFRpY2tQcmlvcml0eSkgeworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgaWYgKHV3VGlja0ZyZXEgIT0gMFUpIHsKKyAgICAvKiBDb25maWd1cmUgdGhlIFN5c1RpY2sgdG8gaGF2ZSBpbnRlcnJ1cHQgaW4gMW1zIHRpbWUgYmFzaXMqLworICAgIGlmIChIQUxfU1lTVElDS19Db25maWcoU3lzdGVtQ29yZUNsb2NrIC8gKDEwMDBVIC8gdXdUaWNrRnJlcSkpID09IDBVKSB7CisgICAgICAvKiBDb25maWd1cmUgdGhlIFN5c1RpY2sgSVJRIHByaW9yaXR5ICovCisgICAgICBpZiAoVGlja1ByaW9yaXR5IDwgKDFVTCA8PCBfX05WSUNfUFJJT19CSVRTKSkgeworICAgICAgICBIQUxfTlZJQ19TZXRQcmlvcml0eShTeXNUaWNrX0lSUW4sIFRpY2tQcmlvcml0eSwgMFUpOworICAgICAgICB1d1RpY2tQcmlvID0gVGlja1ByaW9yaXR5OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgfQorICB9IGVsc2UgeworICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSEFMIENvbnRyb2wgZnVuY3Rpb25zCisgICogIEBicmllZiAgICBIQUwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhBTCBDb250cm9sIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICAgKCspIFByb3ZpZGUgYSB0aWNrIHZhbHVlIGluIG1pbGxpc2Vjb25kCisgICAgICAoKykgUHJvdmlkZSBhIGJsb2NraW5nIGRlbGF5IGluIG1pbGxpc2Vjb25kCisgICAgICAoKykgU3VzcGVuZCB0aGUgdGltZSBiYXNlIHNvdXJjZSBpbnRlcnJ1cHQKKyAgICAgICgrKSBSZXN1bWUgdGhlIHRpbWUgYmFzZSBzb3VyY2UgaW50ZXJydXB0CisgICAgICAoKykgR2V0IHRoZSBIQUwgQVBJIGRyaXZlciB2ZXJzaW9uCisgICAgICAoKykgR2V0IHRoZSBkZXZpY2UgaWRlbnRpZmllcgorICAgICAgKCspIEdldCB0aGUgZGV2aWNlIHJldmlzaW9uIGlkZW50aWZpZXIKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgKiBAYnJpZWYgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gaW5jcmVtZW50IGEgZ2xvYmFsIHZhcmlhYmxlICJ1d1RpY2siCisgKiAgICAgICAgdXNlZCBhcyBhcHBsaWNhdGlvbiB0aW1lIGJhc2UuCisgKiBAbm90ZSBJbiB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiwgdGhpcyB2YXJpYWJsZSBpcyBpbmNyZW1lbnRlZCBlYWNoIDFtcworICogICAgICAgaW4gU3lzVGljayBJU1IuCisgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIGlzIGRlY2xhcmVkIGFzIF9fd2VhayB0byBiZSBvdmVyd3JpdHRlbiBpbiBjYXNlIG9mIG90aGVyCisgKiAgICAgIGltcGxlbWVudGF0aW9ucyBpbiB1c2VyIGZpbGUuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX193ZWFrIHZvaWQgSEFMX0luY1RpY2sodm9pZCkgeyB1d1RpY2sgKz0gdXdUaWNrRnJlcTsgfQorCisvKioKKyAqIEBicmllZiBQcm92aWRlcyBhIHRpY2sgdmFsdWUgaW4gbWlsbGlzZWNvbmQuCisgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIGlzIGRlY2xhcmVkIGFzIF9fd2VhayB0byBiZSBvdmVyd3JpdHRlbiBpbiBjYXNlIG9mIG90aGVyCisgKiAgICAgICBpbXBsZW1lbnRhdGlvbnMgaW4gdXNlciBmaWxlLgorICogQHJldHZhbCB0aWNrIHZhbHVlCisgKi8KK19fd2VhayB1aW50MzJfdCBIQUxfR2V0VGljayh2b2lkKSB7IHJldHVybiB1d1RpY2s7IH0KKworLyoqCisgKiBAYnJpZWYgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgdGljayBwcmlvcml0eS4KKyAqIEByZXR2YWwgdGljayBwcmlvcml0eQorICovCit1aW50MzJfdCBIQUxfR2V0VGlja1ByaW8odm9pZCkgeyByZXR1cm4gdXdUaWNrUHJpbzsgfQorCisvKioKKyAqIEBicmllZiBTZXQgbmV3IHRpY2sgRnJlcS4KKyAqIEByZXR2YWwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TZXRUaWNrRnJlcSh1aW50MzJfdCBGcmVxKSB7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKyAgdWludDMyX3QgcHJldlRpY2tGcmVxOworCisgIGFzc2VydF9wYXJhbShJU19USUNLRlJFUShGcmVxKSk7CisKKyAgaWYgKHV3VGlja0ZyZXEgIT0gRnJlcSkgeworICAgIC8qIEJhY2sgdXAgdXdUaWNrRnJlcSBmcmVxdWVuY3kgKi8KKyAgICBwcmV2VGlja0ZyZXEgPSB1d1RpY2tGcmVxOworCisgICAgLyogVXBkYXRlIHV3VGlja0ZyZXEgZ2xvYmFsIHZhcmlhYmxlIHVzZWQgYnkgSEFMX0luaXRUaWNrKCkgKi8KKyAgICB1d1RpY2tGcmVxID0gRnJlcTsKKworICAgIC8qIEFwcGx5IHRoZSBuZXcgdGljayBGcmVxICAqLworICAgIHN0YXR1cyA9IEhBTF9Jbml0VGljayh1d1RpY2tQcmlvKTsKKworICAgIGlmIChzdGF0dXMgIT0gSEFMX09LKSB7CisgICAgICAvKiBSZXN0b3JlIHByZXZpb3VzIHRpY2sgZnJlcXVlbmN5ICovCisgICAgICB1d1RpY2tGcmVxID0gcHJldlRpY2tGcmVxOworICAgIH0KKyAgfQorCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogQGJyaWVmIFJldHVybnMgdGljayBmcmVxdWVuY3kuCisgKiBAcmV0dmFsIFRpY2sgZnJlcXVlbmN5LgorICogICAgICAgICBWYWx1ZSBvZiBAcmVmIEhBTF9UaWNrRnJlcVR5cGVEZWYuCisgKi8KK3VpbnQzMl90IEhBTF9HZXRUaWNrRnJlcSh2b2lkKSB7IHJldHVybiB1d1RpY2tGcmVxOyB9CisKKy8qKgorICogQGJyaWVmIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgbWluaW11bSBkZWxheSAoaW4gbWlsbGlzZWNvbmRzKSBiYXNlZAorICogICAgICAgIG9uIHZhcmlhYmxlIGluY3JlbWVudGVkLgorICogQG5vdGUgSW4gdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gLCBTeXNUaWNrIHRpbWVyIGlzIHRoZSBzb3VyY2Ugb2YgdGltZQorICogYmFzZS4gSXQgaXMgdXNlZCB0byBnZW5lcmF0ZSBpbnRlcnJ1cHRzIGF0IHJlZ3VsYXIgdGltZSBpbnRlcnZhbHMgd2hlcmUKKyAqIHV3VGljayBpcyBpbmNyZW1lbnRlZC4KKyAqIEBub3RlIFRoaXMgZnVuY3Rpb24gaXMgZGVjbGFyZWQgYXMgX193ZWFrIHRvIGJlIG92ZXJ3cml0dGVuIGluIGNhc2Ugb2Ygb3RoZXIKKyAqICAgICAgIGltcGxlbWVudGF0aW9ucyBpbiB1c2VyIGZpbGUuCisgKiBAcGFyYW0gRGVsYXkgc3BlY2lmaWVzIHRoZSBkZWxheSB0aW1lIGxlbmd0aCwgaW4gbWlsbGlzZWNvbmRzLgorICogQHJldHZhbCBOb25lCisgKi8KK19fd2VhayB2b2lkIEhBTF9EZWxheSh1aW50MzJfdCBEZWxheSkgeworICB1aW50MzJfdCB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworICB1aW50MzJfdCB3YWl0ID0gRGVsYXk7CisKKyAgLyogQWRkIGEgZnJlcSB0byBndWFyYW50ZWUgbWluaW11bSB3YWl0ICovCisgIGlmICh3YWl0IDwgSEFMX01BWF9ERUxBWSkgeworICAgIHdhaXQgKz0gKHVpbnQzMl90KSh1d1RpY2tGcmVxKTsKKyAgfQorCisgIHdoaWxlICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPCB3YWl0KSB7CisgIH0KK30KKworLyoqCisgKiBAYnJpZWYgU3VzcGVuZHMgVGljayBpbmNyZW1lbnQuCisgKiBAbm90ZSBJbiB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiAsIFN5c1RpY2sgdGltZXIgaXMgdGhlIHNvdXJjZSBvZiB0aW1lCisgKiBiYXNlLiBJdCBpcyB1c2VkIHRvIGdlbmVyYXRlIGludGVycnVwdHMgYXQgcmVndWxhciB0aW1lIGludGVydmFscy4gT25jZQorICogSEFMX1N1c3BlbmRUaWNrKCkgaXMgY2FsbGVkLCB0aGUgU3lzVGljayBpbnRlcnJ1cHQgd2lsbCBiZSBkaXNhYmxlZCBhbmQgc28KKyAqIFRpY2sgaW5jcmVtZW50IGlzIHN1c3BlbmRlZC4KKyAqIEBub3RlIFRoaXMgZnVuY3Rpb24gaXMgZGVjbGFyZWQgYXMgX193ZWFrIHRvIGJlIG92ZXJ3cml0dGVuIGluIGNhc2Ugb2Ygb3RoZXIKKyAqICAgICAgIGltcGxlbWVudGF0aW9ucyBpbiB1c2VyIGZpbGUuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX193ZWFrIHZvaWQgSEFMX1N1c3BlbmRUaWNrKHZvaWQpIHsKKyAgLyogRGlzYWJsZSBTeXNUaWNrIEludGVycnVwdCAqLworICBDTEVBUl9CSVQoU3lzVGljay0+Q1RSTCwgU3lzVGlja19DVFJMX1RJQ0tJTlRfTXNrKTsKK30KKworLyoqCisgKiBAYnJpZWYgUmVzdW1lIFRpY2sgaW5jcmVtZW50LgorICogQG5vdGUgSW4gdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gLCBTeXNUaWNrIHRpbWVyIGlzIHRoZSBzb3VyY2Ugb2YgdGltZQorICogYmFzZS4gSXQgaXMgdXNlZCB0byBnZW5lcmF0ZSBpbnRlcnJ1cHRzIGF0IHJlZ3VsYXIgdGltZSBpbnRlcnZhbHMuIE9uY2UKKyAqIEhBTF9SZXN1bWVUaWNrKCkgaXMgY2FsbGVkLCB0aGUgU3lzVGljayBpbnRlcnJ1cHQgd2lsbCBiZSBlbmFibGVkIGFuZCBzbyBUaWNrCisgKiBpbmNyZW1lbnQgaXMgcmVzdW1lZC4KKyAqIEBub3RlIFRoaXMgZnVuY3Rpb24gaXMgZGVjbGFyZWQgYXMgX193ZWFrIHRvIGJlIG92ZXJ3cml0dGVuIGluIGNhc2Ugb2Ygb3RoZXIKKyAqICAgICAgIGltcGxlbWVudGF0aW9ucyBpbiB1c2VyIGZpbGUuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX193ZWFrIHZvaWQgSEFMX1Jlc3VtZVRpY2sodm9pZCkgeworICAvKiBFbmFibGUgU3lzVGljayBJbnRlcnJ1cHQgKi8KKyAgU0VUX0JJVChTeXNUaWNrLT5DVFJMLCBTeXNUaWNrX0NUUkxfVElDS0lOVF9Nc2spOworfQorCisvKioKKyAqIEBicmllZiAgUmV0dXJucyB0aGUgSEFMIHJldmlzaW9uLgorICogQHJldHZhbCB2ZXJzaW9uIDogMHhYWVpSICg4Yml0cyBmb3IgZWFjaCBkZWNpbWFsLCBSIGZvciBSQykKKyAqLwordWludDMyX3QgSEFMX0dldEhhbFZlcnNpb24odm9pZCkgeyByZXR1cm4gX19TVE0zMkc0eHhfSEFMX1ZFUlNJT047IH0KKworLyoqCisgKiBAYnJpZWYgIFJldHVybnMgdGhlIGRldmljZSByZXZpc2lvbiBpZGVudGlmaWVyLgorICogQHJldHZhbCBEZXZpY2UgcmV2aXNpb24gaWRlbnRpZmllcgorICovCit1aW50MzJfdCBIQUxfR2V0UkVWSUQodm9pZCkgeworICByZXR1cm4gKChEQkdNQ1UtPklEQ09ERSAmIERCR01DVV9JRENPREVfUkVWX0lEKSA+PiAxNlUpOworfQorCisvKioKKyAqIEBicmllZiAgUmV0dXJucyB0aGUgZGV2aWNlIGlkZW50aWZpZXIuCisgKiBAcmV0dmFsIERldmljZSBpZGVudGlmaWVyCisgKi8KK3VpbnQzMl90IEhBTF9HZXRERVZJRCh2b2lkKSB7IHJldHVybiAoREJHTUNVLT5JRENPREUgJiBEQkdNQ1VfSURDT0RFX0RFVl9JRCk7IH0KKworLyoqCisgKiBAYnJpZWYgIFJldHVybiB0aGUgZmlyc3Qgd29yZCBvZiB0aGUgdW5pcXVlIGRldmljZSBpZGVudGlmaWVyIChVSUQgYmFzZWQgb24KKyAqIDk2IGJpdHMpCisgKiBAcmV0dmFsIERldmljZSBpZGVudGlmaWVyCisgKi8KK3VpbnQzMl90IEhBTF9HZXRVSUR3MCh2b2lkKSB7IHJldHVybiAoUkVBRF9SRUcoKigodWludDMyX3QgKilVSURfQkFTRSkpKTsgfQorCisvKioKKyAqIEBicmllZiAgUmV0dXJuIHRoZSBzZWNvbmQgd29yZCBvZiB0aGUgdW5pcXVlIGRldmljZSBpZGVudGlmaWVyIChVSUQgYmFzZWQgb24KKyAqIDk2IGJpdHMpCisgKiBAcmV0dmFsIERldmljZSBpZGVudGlmaWVyCisgKi8KK3VpbnQzMl90IEhBTF9HZXRVSUR3MSh2b2lkKSB7CisgIHJldHVybiAoUkVBRF9SRUcoKigodWludDMyX3QgKikoVUlEX0JBU0UgKyA0VSkpKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBSZXR1cm4gdGhlIHRoaXJkIHdvcmQgb2YgdGhlIHVuaXF1ZSBkZXZpY2UgaWRlbnRpZmllciAoVUlEIGJhc2VkIG9uCisgKiA5NiBiaXRzKQorICogQHJldHZhbCBEZXZpY2UgaWRlbnRpZmllcgorICovCit1aW50MzJfdCBIQUxfR2V0VUlEdzIodm9pZCkgeworICByZXR1cm4gKFJFQURfUkVHKCooKHVpbnQzMl90ICopKFVJRF9CQVNFICsgOFUpKSkpOworfQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBIQUxfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBIQUwgRGVidWcgZnVuY3Rpb25zCisgICogIEBicmllZiAgICBIQUwgRGVidWcgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIQUwgRGVidWcgZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgICAoKykgRW5hYmxlL0Rpc2FibGUgRGVidWcgbW9kdWxlIGR1cmluZyBTTEVFUCBtb2RlCisgICAgICAoKykgRW5hYmxlL0Rpc2FibGUgRGVidWcgbW9kdWxlIGR1cmluZyBTVE9QMC9TVE9QMS9TVE9QMiBtb2RlcworICAgICAgKCspIEVuYWJsZS9EaXNhYmxlIERlYnVnIG1vZHVsZSBkdXJpbmcgU1RBTkRCWSBtb2RlCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICogQGJyaWVmICBFbmFibGUgdGhlIERlYnVnIE1vZHVsZSBkdXJpbmcgU0xFRVAgbW9kZS4KKyAqIEByZXR2YWwgTm9uZQorICovCit2b2lkIEhBTF9EQkdNQ1VfRW5hYmxlREJHU2xlZXBNb2RlKHZvaWQpIHsKKyAgU0VUX0JJVChEQkdNQ1UtPkNSLCBEQkdNQ1VfQ1JfREJHX1NMRUVQKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgdGhlIERlYnVnIE1vZHVsZSBkdXJpbmcgU0xFRVAgbW9kZS4KKyAqIEByZXR2YWwgTm9uZQorICovCit2b2lkIEhBTF9EQkdNQ1VfRGlzYWJsZURCR1NsZWVwTW9kZSh2b2lkKSB7CisgIENMRUFSX0JJVChEQkdNQ1UtPkNSLCBEQkdNQ1VfQ1JfREJHX1NMRUVQKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSB0aGUgRGVidWcgTW9kdWxlIGR1cmluZyBTVE9QMC9TVE9QMS9TVE9QMiBtb2Rlcy4KKyAqIEByZXR2YWwgTm9uZQorICovCit2b2lkIEhBTF9EQkdNQ1VfRW5hYmxlREJHU3RvcE1vZGUodm9pZCkgeworICBTRVRfQklUKERCR01DVS0+Q1IsIERCR01DVV9DUl9EQkdfU1RPUCk7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIHRoZSBEZWJ1ZyBNb2R1bGUgZHVyaW5nIFNUT1AwL1NUT1AxL1NUT1AyIG1vZGVzLgorICogQHJldHZhbCBOb25lCisgKi8KK3ZvaWQgSEFMX0RCR01DVV9EaXNhYmxlREJHU3RvcE1vZGUodm9pZCkgeworICBDTEVBUl9CSVQoREJHTUNVLT5DUiwgREJHTUNVX0NSX0RCR19TVE9QKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSB0aGUgRGVidWcgTW9kdWxlIGR1cmluZyBTVEFOREJZIG1vZGUuCisgKiBAcmV0dmFsIE5vbmUKKyAqLwordm9pZCBIQUxfREJHTUNVX0VuYWJsZURCR1N0YW5kYnlNb2RlKHZvaWQpIHsKKyAgU0VUX0JJVChEQkdNQ1UtPkNSLCBEQkdNQ1VfQ1JfREJHX1NUQU5EQlkpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSB0aGUgRGVidWcgTW9kdWxlIGR1cmluZyBTVEFOREJZIG1vZGUuCisgKiBAcmV0dmFsIE5vbmUKKyAqLwordm9pZCBIQUxfREJHTUNVX0Rpc2FibGVEQkdTdGFuZGJ5TW9kZSh2b2lkKSB7CisgIENMRUFSX0JJVChEQkdNQ1UtPkNSLCBEQkdNQ1VfQ1JfREJHX1NUQU5EQlkpOworfQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBIQUxfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNCBIQUwgU1lTQ0ZHIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgICogIEBicmllZiAgICBIQUwgU1lTQ0ZHIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIQUwgU1lTQ0ZHIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgICAoKykgU3RhcnQgYSBoYXJkd2FyZSBDQ01TUkFNIGVyYXNlIG9wZXJhdGlvbgorICAgICAgKCspIEVuYWJsZS9EaXNhYmxlIHRoZSBJbnRlcm5hbCBGTEFTSCBCYW5rIFN3YXBwaW5nCisgICAgICAoKykgQ29uZmlndXJlIHRoZSBWb2x0YWdlIHJlZmVyZW5jZSBidWZmZXIKKyAgICAgICgrKSBFbmFibGUvRGlzYWJsZSB0aGUgVm9sdGFnZSByZWZlcmVuY2UgYnVmZmVyCisgICAgICAoKykgRW5hYmxlL0Rpc2FibGUgdGhlIEkvTyBhbmFsb2cgc3dpdGNoIHZvbHRhZ2UgYm9vc3RlcgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworLyoqCisgKiBAYnJpZWYgIFN0YXJ0IGEgaGFyZHdhcmUgQ0NNU1JBTSBlcmFzZSBvcGVyYXRpb24uCisgKiBAbm90ZSAgIEFzIGxvbmcgYXMgQ0NNU1JBTSBpcyBub3QgZXJhc2VkIHRoZSBDQ01FUiBiaXQgd2lsbCBiZSBzZXQuCisgKiAgICAgICAgIFRoaXMgYml0IGlzIGF1dG9tYXRpY2FsbHkgcmVzZXQgYXQgdGhlIGVuZCBvZiB0aGUgQ0NNU1JBTSBlcmFzZQorICogb3BlcmF0aW9uLgorICogQHJldHZhbCBOb25lCisgKi8KK3ZvaWQgSEFMX1NZU0NGR19DQ01TUkFNRXJhc2Uodm9pZCkgeworICAvKiB1bmxvY2sgdGhlIHdyaXRlIHByb3RlY3Rpb24gb2YgdGhlIENDTUVSIGJpdCAqLworICBTWVNDRkctPlNLUiA9IDB4Q0E7CisgIFNZU0NGRy0+U0tSID0gMHg1MzsKKyAgLyogU3RhcnRzIGEgaGFyZHdhcmUgQ0NNU1JBTSBlcmFzZSBvcGVyYXRpb24qLworICBTRVRfQklUKFNZU0NGRy0+U0NTUiwgU1lTQ0ZHX1NDU1JfQ0NNRVIpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIHRoZSBJbnRlcm5hbCBGTEFTSCBCYW5rIFN3YXBwaW5nLgorICoKKyAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBvbmx5IGZvciBTVE0zMkc0eHggZGV2aWNlcy4KKyAqCisgKiBAbm90ZSAgIEZsYXNoIEJhbmsyIG1hcHBlZCBhdCAweDA4MDAwMDAwIChhbmQgYWxpYXNlZCBAMHgwMDAwMDAwMCkKKyAqICAgICAgICAgYW5kIEZsYXNoIEJhbmsxIG1hcHBlZCBhdCAweDA4MDQwMDAwIChhbmQgYWxpYXNlZCBhdCAweDAwMDQwMDAwKQorICoKKyAqIEByZXR2YWwgTm9uZQorICovCit2b2lkIEhBTF9TWVNDRkdfRW5hYmxlTWVtb3J5U3dhcHBpbmdCYW5rKHZvaWQpIHsKKyAgU0VUX0JJVChTWVNDRkctPk1FTVJNUCwgU1lTQ0ZHX01FTVJNUF9GQl9NT0RFKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgdGhlIEludGVybmFsIEZMQVNIIEJhbmsgU3dhcHBpbmcuCisgKgorICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIG9ubHkgZm9yIFNUTTMyRzR4eCBkZXZpY2VzLgorICoKKyAqIEBub3RlICAgVGhlIGRlZmF1bHQgc3RhdGUgOiBGbGFzaCBCYW5rMSBtYXBwZWQgYXQgMHgwODAwMDAwMCAoYW5kIGFsaWFzZWQKKyAqIEAweDAwMDAgMDAwMCkgYW5kIEZsYXNoIEJhbmsyIG1hcHBlZCBhdCAweDA4MDQwMDAwIChhbmQgYWxpYXNlZCBhdAorICogMHgwMDA0MDAwMCkKKyAqCisgKiBAcmV0dmFsIE5vbmUKKyAqLwordm9pZCBIQUxfU1lTQ0ZHX0Rpc2FibGVNZW1vcnlTd2FwcGluZ0Jhbmsodm9pZCkgeworICBDTEVBUl9CSVQoU1lTQ0ZHLT5NRU1STVAsIFNZU0NGR19NRU1STVBfRkJfTU9ERSk7Cit9CisKKyNpZiBkZWZpbmVkKFZSRUZCVUYpCisvKioKKyAqIEBicmllZiBDb25maWd1cmUgdGhlIGludGVybmFsIHZvbHRhZ2UgcmVmZXJlbmNlIGJ1ZmZlciB2b2x0YWdlIHNjYWxlLgorICogQHBhcmFtICBWb2x0YWdlU2NhbGluZzogc3BlY2lmaWVzIHRoZSBvdXRwdXQgdm9sdGFnZSB0byBhY2hpZXZlCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIFNZU0NGR19WUkVGQlVGX1ZPTFRBR0VfU0NBTEUwOiBWUkVGQlVGX09VVCBhcm91bmQgMi4wNDggVi4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyByZXF1aXJlcyBWRERBIGVxdWFsIHRvIG9yCisgKiBoaWdoZXIgdGhhbiAyLjQgVi4KKyAqICAgICAgICAgICAgQGFyZyBTWVNDRkdfVlJFRkJVRl9WT0xUQUdFX1NDQUxFMTogVlJFRkJVRl9PVVQgYXJvdW5kIDIuNSBWLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHJlcXVpcmVzIFZEREEgZXF1YWwgdG8gb3IKKyAqIGhpZ2hlciB0aGFuIDIuOCBWLgorICogICAgICAgICAgICBAYXJnIFNZU0NGR19WUkVGQlVGX1ZPTFRBR0VfU0NBTEUyOiBWUkVGQlVGX09VVCBhcm91bmQgMi45IFYuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcmVxdWlyZXMgVkREQSBlcXVhbCB0byBvcgorICogaGlnaGVyIHRoYW4gMy4xNSBWLgorICogQHJldHZhbCBOb25lCisgKi8KK3ZvaWQgSEFMX1NZU0NGR19WUkVGQlVGX1ZvbHRhZ2VTY2FsaW5nQ29uZmlnKHVpbnQzMl90IFZvbHRhZ2VTY2FsaW5nKSB7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19TWVNDRkdfVlJFRkJVRl9WT0xUQUdFX1NDQUxFKFZvbHRhZ2VTY2FsaW5nKSk7CisKKyAgTU9ESUZZX1JFRyhWUkVGQlVGLT5DU1IsIFZSRUZCVUZfQ1NSX1ZSUywgVm9sdGFnZVNjYWxpbmcpOworfQorCisvKioKKyAqIEBicmllZiBDb25maWd1cmUgdGhlIGludGVybmFsIHZvbHRhZ2UgcmVmZXJlbmNlIGJ1ZmZlciBoaWdoIGltcGVkYW5jZSBtb2RlLgorICogQHBhcmFtICBNb2RlOiBzcGVjaWZpZXMgdGhlIGhpZ2ggaW1wZWRhbmNlIG1vZGUKKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgU1lTQ0ZHX1ZSRUZCVUZfSElHSF9JTVBFREFOQ0VfRElTQUJMRTogVlJFRisgcGluIGlzCisgKiBpbnRlcm5hbGx5IGNvbm5lY3QgdG8gVlJFRklOVCBvdXRwdXQuCisgKiAgICAgICAgICAgIEBhcmcgU1lTQ0ZHX1ZSRUZCVUZfSElHSF9JTVBFREFOQ0VfRU5BQkxFOiBWUkVGKyBwaW4gaXMgaGlnaAorICogaW1wZWRhbmNlLgorICogQHJldHZhbCBOb25lCisgKi8KK3ZvaWQgSEFMX1NZU0NGR19WUkVGQlVGX0hpZ2hJbXBlZGFuY2VDb25maWcodWludDMyX3QgTW9kZSkgeworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfU1lTQ0ZHX1ZSRUZCVUZfSElHSF9JTVBFREFOQ0UoTW9kZSkpOworCisgIE1PRElGWV9SRUcoVlJFRkJVRi0+Q1NSLCBWUkVGQlVGX0NTUl9ISVosIE1vZGUpOworfQorCisvKioKKyAqIEBicmllZiBUdW5lIHRoZSBJbnRlcm5hbCBWb2x0YWdlIFJlZmVyZW5jZSBidWZmZXIgKFZSRUZCVUYpLgorICogQHBhcmFtIFRyaW1taW5nVmFsdWUgc3BlY2lmaWVzIHRyaW1taW5nIGNvZGUgZm9yIFZSRUZCVUYgY2FsaWJyYXRpb24KKyAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MDAgYW5kIE1heF9EYXRhID0KKyAqIDB4M0YKKyAqIEByZXR2YWwgTm9uZQorICovCit2b2lkIEhBTF9TWVNDRkdfVlJFRkJVRl9UcmltbWluZ0NvbmZpZyh1aW50MzJfdCBUcmltbWluZ1ZhbHVlKSB7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19TWVNDRkdfVlJFRkJVRl9UUklNTUlORyhUcmltbWluZ1ZhbHVlKSk7CisKKyAgTU9ESUZZX1JFRyhWUkVGQlVGLT5DQ1IsIFZSRUZCVUZfQ0NSX1RSSU0sIFRyaW1taW5nVmFsdWUpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIHRoZSBJbnRlcm5hbCBWb2x0YWdlIFJlZmVyZW5jZSBidWZmZXIgKFZSRUZCVUYpLgorICogQHJldHZhbCBIQUxfT0svSEFMX1RJTUVPVVQKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NZU0NGR19FbmFibGVWUkVGQlVGKHZvaWQpIHsKKyAgdWludDMyX3QgdGlja3N0YXJ0OworCisgIFNFVF9CSVQoVlJFRkJVRi0+Q1NSLCBWUkVGQlVGX0NTUl9FTlZSKTsKKworICAvKiBHZXQgU3RhcnQgVGljayovCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgLyogV2FpdCBmb3IgVlJSIGJpdCAgKi8KKyAgd2hpbGUgKFJFQURfQklUKFZSRUZCVUYtPkNTUiwgVlJFRkJVRl9DU1JfVlJSKSA9PSAweDAwVSkgeworICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBWUkVGQlVGX1RJTUVPVVRfVkFMVUUpIHsKKyAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICB9CisgIH0KKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSB0aGUgSW50ZXJuYWwgVm9sdGFnZSBSZWZlcmVuY2UgYnVmZmVyIChWUkVGQlVGKS4KKyAqCisgKiBAcmV0dmFsIE5vbmUKKyAqLwordm9pZCBIQUxfU1lTQ0ZHX0Rpc2FibGVWUkVGQlVGKHZvaWQpIHsKKyAgQ0xFQVJfQklUKFZSRUZCVUYtPkNTUiwgVlJFRkJVRl9DU1JfRU5WUik7Cit9CisjZW5kaWYgLyogVlJFRkJVRiAqLworCisvKioKKyAqIEBicmllZiAgRW5hYmxlIHRoZSBJL08gYW5hbG9nIHN3aXRjaCB2b2x0YWdlIGJvb3N0ZXIKKyAqCisgKiBAcmV0dmFsIE5vbmUKKyAqLwordm9pZCBIQUxfU1lTQ0ZHX0VuYWJsZUlPU3dpdGNoQm9vc3Rlcih2b2lkKSB7CisgIFNFVF9CSVQoU1lTQ0ZHLT5DRkdSMSwgU1lTQ0ZHX0NGR1IxX0JPT1NURU4pOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSB0aGUgSS9PIGFuYWxvZyBzd2l0Y2ggdm9sdGFnZSBib29zdGVyCisgKgorICogQHJldHZhbCBOb25lCisgKi8KK3ZvaWQgSEFMX1NZU0NGR19EaXNhYmxlSU9Td2l0Y2hCb29zdGVyKHZvaWQpIHsKKyAgQ0xFQVJfQklUKFNZU0NGRy0+Q0ZHUjEsIFNZU0NGR19DRkdSMV9CT09TVEVOKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSB0aGUgSS9PIGFuYWxvZyBzd2l0Y2ggdm9sdGFnZSBieSBWREQKKyAqCisgKiBAcmV0dmFsIE5vbmUKKyAqLwordm9pZCBIQUxfU1lTQ0ZHX0VuYWJsZUlPU3dpdGNoVkREKHZvaWQpIHsKKyAgU0VUX0JJVChTWVNDRkctPkNGR1IxLCBTWVNDRkdfQ0ZHUjFfQU5BU1dWREQpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSB0aGUgSS9PIGFuYWxvZyBzd2l0Y2ggdm9sdGFnZSBieSBWREQKKyAqCisgKiBAcmV0dmFsIE5vbmUKKyAqLwordm9pZCBIQUxfU1lTQ0ZHX0Rpc2FibGVJT1N3aXRjaFZERCh2b2lkKSB7CisgIENMRUFSX0JJVChTWVNDRkctPkNGR1IxLCBTWVNDRkdfQ0ZHUjFfQU5BU1dWREQpOworfQorCisvKiogQGJyaWVmICBDQ01TUkFNIHBhZ2Ugd3JpdGUgcHJvdGVjdGlvbiBlbmFibGUKKyAqIEBwYXJhbSBQYWdlOiBUaGlzIHBhcmFtZXRlciBpcyBhIGxvbmcgMzJiaXQgdmFsdWUgYW5kIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYKKyAqIFNZU0NGR19DQ01TUkFNV1JQCisgKiBAbm90ZSAgIHdyaXRlIHByb3RlY3Rpb24gY2FuIG9ubHkgYmUgZGlzYWJsZWQgYnkgYSBzeXN0ZW0gcmVzZXQKKyAqIEByZXR2YWwgTm9uZQorICovCit2b2lkIEhBTF9TWVNDRkdfQ0NNU1JBTV9Xcml0ZVByb3RlY3Rpb25FbmFibGUodWludDMyX3QgUGFnZSkgeworICBhc3NlcnRfcGFyYW0oSVNfU1lTQ0ZHX0NDTVNSQU1XUlBfUEFHRShQYWdlKSk7CisKKyAgU0VUX0JJVChTWVNDRkctPlNXUFIsICh1aW50MzJfdCkoUGFnZSkpOworfQorCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCisKKyNlbmRpZiAvKiBIQUxfTU9EVUxFX0VOQUJMRUQgKi8KKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KZGlmZiAtLWdpdCBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9hZGMuYyBiL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9hZGMuYwppbmRleCBjZjhhZmMwLi4wYTUxYTBlIDEwMDY0NAotLS0gYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfYWRjLmMKKysrIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX2FkYy5jCkBAIC0xLDM1NzEgKzEsMzU5MSBAQAotLyoqDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICogQGZpbGUgICAgc3RtMzJnNHh4X2hhbF9hZGMuYw0KLSAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQ0KLSAgKiBAYnJpZWYgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nDQotICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgQW5hbG9nIHRvIERpZ2l0YWwgQ29udmVydGVyIChBREMpDQotICAqICAgICAgICAgIHBlcmlwaGVyYWw6DQotICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMNCi0gICogICAgICAgICAgICsgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucw0KLSAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucw0KLSAgKiAgICAgICAgICBPdGhlciBmdW5jdGlvbnMgKGV4dGVuZGVkIGZ1bmN0aW9ucykgYXJlIGF2YWlsYWJsZSBpbiBmaWxlDQotICAqICAgICAgICAgICJzdG0zMmc0eHhfaGFsX2FkY19leC5jIi4NCi0gICoNCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgKiBAYXR0ZW50aW9uDQotICAqDQotICAqIENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuDQotICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQotICAqDQotICAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGVybXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZQ0KLSAgKiBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb2Z0d2FyZSBjb21wb25lbnQuDQotICAqIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcyB3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLg0KLSAgKg0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICBAdmVyYmF0aW0NCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICAgICAgICAgICAgICAgICAgICMjIyMjIEFEQyBwZXJpcGhlcmFsIGZlYXR1cmVzICMjIyMjDQotICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gIFsuLl0NCi0gICgrKSAxMi1iaXQsIDEwLWJpdCwgOC1iaXQgb3IgNi1iaXQgY29uZmlndXJhYmxlIHJlc29sdXRpb24uDQotDQotICAoKykgSW50ZXJydXB0IGdlbmVyYXRpb24gYXQgdGhlIGVuZCBvZiByZWd1bGFyIGNvbnZlcnNpb24gYW5kIGluIGNhc2Ugb2YNCi0gICAgICBhbmFsb2cgd2F0Y2hkb2cgb3Igb3ZlcnJ1biBldmVudHMuDQotDQotICAoKykgU2luZ2xlIGFuZCBjb250aW51b3VzIGNvbnZlcnNpb24gbW9kZXMuDQotDQotICAoKykgU2NhbiBtb2RlIGZvciBjb252ZXJzaW9uIG9mIHNldmVyYWwgY2hhbm5lbHMgc2VxdWVudGlhbGx5Lg0KLQ0KLSAgKCspIERhdGEgYWxpZ25tZW50IHdpdGggaW4tYnVpbHQgZGF0YSBjb2hlcmVuY3kuDQotDQotICAoKykgUHJvZ3JhbW1hYmxlIHNhbXBsaW5nIHRpbWUgKGNoYW5uZWwgd2lzZSkNCi0NCi0gICgrKSBFeHRlcm5hbCB0cmlnZ2VyICh0aW1lciBvciBFWFRJKSB3aXRoIGNvbmZpZ3VyYWJsZSBwb2xhcml0eQ0KLQ0KLSAgKCspIERNQSByZXF1ZXN0IGdlbmVyYXRpb24gZm9yIHRyYW5zZmVyIG9mIGNvbnZlcnNpb25zIGRhdGEgb2YgcmVndWxhciBncm91cC4NCi0NCi0gICgrKSBDb25maWd1cmFibGUgZGVsYXkgYmV0d2VlbiBjb252ZXJzaW9ucyBpbiBEdWFsIGludGVybGVhdmVkIG1vZGUuDQotDQotICAoKykgQURDIGNoYW5uZWxzIHNlbGVjdGFibGUgc2luZ2xlL2RpZmZlcmVudGlhbCBpbnB1dC4NCi0NCi0gICgrKSBBREMgb2Zmc2V0IHNoYXJlZCBvbiA0IG9mZnNldCBpbnN0YW5jZXMuDQotICAoKykgQURDIGdhaW4gY29tcGVuc2F0aW9uDQotDQotICAoKykgQURDIGNhbGlicmF0aW9uDQotDQotICAoKykgQURDIGNvbnZlcnNpb24gb2YgcmVndWxhciBncm91cC4NCi0NCi0gICgrKSBBREMgc3VwcGx5IHJlcXVpcmVtZW50czogMS42MiBWIHRvIDMuNiBWLg0KLQ0KLSAgKCspIEFEQyBpbnB1dCByYW5nZTogZnJvbSBWcmVmLSAoY29ubmVjdGVkIHRvIFZzc2EpIHRvIFZyZWYrIChjb25uZWN0ZWQgdG8NCi0gICAgICBWZGRhIG9yIHRvIGFuIGV4dGVybmFsIHZvbHRhZ2UgcmVmZXJlbmNlKS4NCi0NCi0NCi0gICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjDQotICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgWy4uXQ0KLQ0KLSAgICAgKioqIENvbmZpZ3VyYXRpb24gb2YgdG9wIGxldmVsIHBhcmFtZXRlcnMgcmVsYXRlZCB0byBBREMgKioqDQotICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgIFsuLl0NCi0NCi0gICAgKCMpIEVuYWJsZSB0aGUgQURDIGludGVyZmFjZQ0KLSAgICAgICAgKCsrKSBBcyBwcmVyZXF1aXNpdGUsIEFEQyBjbG9jayBtdXN0IGJlIGNvbmZpZ3VyZWQgYXQgUkNDIHRvcCBsZXZlbC4NCi0NCi0gICAgICAgICgrKykgVHdvIGNsb2NrIHNldHRpbmdzIGFyZSBtYW5kYXRvcnk6DQotICAgICAgICAgICAgICgrKyspIEFEQyBjbG9jayAoY29yZSBjbG9jaywgYWxzbyBwb3NzaWJseSBjb252ZXJzaW9uIGNsb2NrKS4NCi0NCi0gICAgICAgICAgICAgKCsrKykgQURDIGNsb2NrIChjb252ZXJzaW9ucyBjbG9jaykuDQotICAgICAgICAgICAgICAgICAgIFR3byBwb3NzaWJsZSBjbG9jayBzb3VyY2VzOiBzeW5jaHJvbm91cyBjbG9jayBkZXJpdmVkIGZyb20NCi0gIEFIQiBjbG9jayBvciBhc3luY2hyb25vdXMgY2xvY2sgZGVyaXZlZCBmcm9tIHN5c3RlbSBjbG9jayBvciBQTEwgKG91dHB1dA0KLSAgZGl2aWRlciBQKSBydW5uaW5nIHVwIHRvIDc1TUh6Lg0KLQ0KLSAgICAgICAgICAgICAoKysrKSBFeGFtcGxlOg0KLSAgICAgICAgICAgICAgICAgICBJbnRvIEhBTF9BRENfTXNwSW5pdCgpIChyZWNvbW1lbmRlZCBjb2RlIGxvY2F0aW9uKSBvciB3aXRoDQotICAgICAgICAgICAgICAgICAgIG90aGVyIGRldmljZSBjbG9jayBwYXJhbWV0ZXJzIGNvbmZpZ3VyYXRpb246DQotICAgICAgICAgICAgICAgKCsrKykgX19IQUxfUkNDX0FEQ19DTEtfRU5BQkxFKCk7ICAgICAgICAgICAgICAgICAgKG1hbmRhdG9yeSkNCi0NCi0gICAgICAgICAgICAgICBSQ0NfQURDQ0xLU09VUkNFX1BMTCBlbmFibGU6ICAgICAgICAgICAgICAgICAgICAgICAob3B0aW9uYWw6IGlmDQotICBhc3luY2hyb25vdXMgY2xvY2sgc2VsZWN0ZWQpDQotICAgICAgICAgICAgICAgKCsrKykgUkNDX1BlcmlwaENsa0luaXRUeXBlRGVmICAgUkNDX1BlcmlwaENsa0luaXQ7DQotICAgICAgICAgICAgICAgKCsrKykgUGVyaXBoQ2xrSW5pdC5QZXJpcGhDbG9ja1NlbGVjdGlvbiA9IFJDQ19QRVJJUEhDTEtfQURDOw0KLSAgICAgICAgICAgICAgICgrKyspIFBlcmlwaENsa0luaXQuQWRjQ2xvY2tTZWxlY3Rpb24gICAgPSBSQ0NfQURDQ0xLU09VUkNFX1BMTDsNCi0gICAgICAgICAgICAgICAoKysrKSBIQUxfUkNDRXhfUGVyaXBoQ0xLQ29uZmlnKCZQZXJpcGhDbGtJbml0KTsNCi0NCi0gICAgICAgICgrKykgQURDIGNsb2NrIHNvdXJjZSBhbmQgY2xvY2sgcHJlc2NhbGVyIGFyZSBjb25maWd1cmVkIGF0IEFEQyBsZXZlbA0KLSAgd2l0aCBwYXJhbWV0ZXIgIkNsb2NrUHJlc2NhbGVyIiB1c2luZyBmdW5jdGlvbiBIQUxfQURDX0luaXQoKS4NCi0NCi0gICAgKCMpIEFEQyBwaW5zIGNvbmZpZ3VyYXRpb24NCi0gICAgICAgICAoKyspIEVuYWJsZSB0aGUgY2xvY2sgZm9yIHRoZSBBREMgR1BJT3MNCi0gICAgICAgICAgICAgIHVzaW5nIG1hY3JvIF9fSEFMX1JDQ19HUElPeF9DTEtfRU5BQkxFKCkNCi0gICAgICAgICAoKyspIENvbmZpZ3VyZSB0aGVzZSBBREMgcGlucyBpbiBhbmFsb2cgbW9kZQ0KLSAgICAgICAgICAgICAgdXNpbmcgZnVuY3Rpb24gSEFMX0dQSU9fSW5pdCgpDQotDQotICAgICgjKSBPcHRpb25hbGx5LCBpbiBjYXNlIG9mIHVzYWdlIG9mIEFEQyB3aXRoIGludGVycnVwdGlvbnM6DQotICAgICAgICAgKCsrKSBDb25maWd1cmUgdGhlIE5WSUMgZm9yIEFEQw0KLSAgICAgICAgICAgICAgdXNpbmcgZnVuY3Rpb24gSEFMX05WSUNfRW5hYmxlSVJRKEFEQ3hfSVJRbikNCi0gICAgICAgICAoKyspIEluc2VydCB0aGUgQURDIGludGVycnVwdGlvbiBoYW5kbGVyIGZ1bmN0aW9uIEhBTF9BRENfSVJRSGFuZGxlcigpDQotICAgICAgICAgICAgICBpbnRvIHRoZSBmdW5jdGlvbiBvZiBjb3JyZXNwb25kaW5nIEFEQyBpbnRlcnJ1cHRpb24gdmVjdG9yDQotICAgICAgICAgICAgICBBREN4X0lSUUhhbmRsZXIoKS4NCi0NCi0gICAgKCMpIE9wdGlvbmFsbHksIGluIGNhc2Ugb2YgdXNhZ2Ugb2YgRE1BOg0KLSAgICAgICAgICgrKykgQ29uZmlndXJlIHRoZSBETUEgKERNQSBjaGFubmVsLCBtb2RlIG5vcm1hbCBvciBjaXJjdWxhciwgLi4uKQ0KLSAgICAgICAgICAgICAgdXNpbmcgZnVuY3Rpb24gSEFMX0RNQV9Jbml0KCkuDQotICAgICAgICAgKCsrKSBDb25maWd1cmUgdGhlIE5WSUMgZm9yIERNQQ0KLSAgICAgICAgICAgICAgdXNpbmcgZnVuY3Rpb24gSEFMX05WSUNfRW5hYmxlSVJRKERNQXhfQ2hhbm5lbHhfSVJRbikNCi0gICAgICAgICAoKyspIEluc2VydCB0aGUgQURDIGludGVycnVwdGlvbiBoYW5kbGVyIGZ1bmN0aW9uIEhBTF9BRENfSVJRSGFuZGxlcigpDQotICAgICAgICAgICAgICBpbnRvIHRoZSBmdW5jdGlvbiBvZiBjb3JyZXNwb25kaW5nIERNQSBpbnRlcnJ1cHRpb24gdmVjdG9yDQotICAgICAgICAgICAgICBETUF4X0NoYW5uZWx4X0lSUUhhbmRsZXIoKS4NCi0NCi0gICAgICoqKiBDb25maWd1cmF0aW9uIG9mIEFEQywgZ3JvdXAgcmVndWxhciwgY2hhbm5lbHMgcGFyYW1ldGVycyAqKioNCi0gICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgIFsuLl0NCi0NCi0gICAgKCMpIENvbmZpZ3VyZSB0aGUgQURDIHBhcmFtZXRlcnMgKHJlc29sdXRpb24sIGRhdGEgYWxpZ25tZW50LCAuLi4pDQotICAgICAgICBhbmQgcmVndWxhciBncm91cCBwYXJhbWV0ZXJzIChjb252ZXJzaW9uIHRyaWdnZXIsIHNlcXVlbmNlciwgLi4uKQ0KLSAgICAgICAgdXNpbmcgZnVuY3Rpb24gSEFMX0FEQ19Jbml0KCkuDQotDQotICAgICgjKSBDb25maWd1cmUgdGhlIGNoYW5uZWxzIGZvciByZWd1bGFyIGdyb3VwIHBhcmFtZXRlcnMgKGNoYW5uZWwgbnVtYmVyLA0KLSAgICAgICAgY2hhbm5lbCByYW5rIGludG8gc2VxdWVuY2VyLCAuLi4sIGludG8gcmVndWxhciBncm91cCkNCi0gICAgICAgIHVzaW5nIGZ1bmN0aW9uIEhBTF9BRENfQ29uZmlnQ2hhbm5lbCgpLg0KLQ0KLSAgICAoIykgT3B0aW9uYWxseSwgY29uZmlndXJlIHRoZSBhbmFsb2cgd2F0Y2hkb2cgcGFyYW1ldGVycyAoY2hhbm5lbHMNCi0gICAgICAgIG1vbml0b3JlZCwgdGhyZXNob2xkcywgLi4uKQ0KLSAgICAgICAgdXNpbmcgZnVuY3Rpb24gSEFMX0FEQ19BbmFsb2dXREdDb25maWcoKS4NCi0NCi0gICAgICoqKiBFeGVjdXRpb24gb2YgQURDIGNvbnZlcnNpb25zICoqKg0KLSAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgICBbLi5dDQotDQotICAgICgjKSBPcHRpb25hbGx5LCBwZXJmb3JtIGFuIGF1dG9tYXRpYyBBREMgY2FsaWJyYXRpb24gdG8gaW1wcm92ZSB0aGUNCi0gICAgICAgIGNvbnZlcnNpb24gYWNjdXJhY3kNCi0gICAgICAgIHVzaW5nIGZ1bmN0aW9uIEhBTF9BRENFeF9DYWxpYnJhdGlvbl9TdGFydCgpLg0KLQ0KLSAgICAoIykgQURDIGRyaXZlciBjYW4gYmUgdXNlZCBhbW9uZyB0aHJlZSBtb2RlczogcG9sbGluZywgaW50ZXJydXB0aW9uLA0KLSAgICAgICAgdHJhbnNmZXIgYnkgRE1BLg0KLQ0KLSAgICAgICAgKCsrKSBBREMgY29udmVyc2lvbiBieSBwb2xsaW5nOg0KLSAgICAgICAgICAoKysrKSBBY3RpdmF0ZSB0aGUgQURDIHBlcmlwaGVyYWwgYW5kIHN0YXJ0IGNvbnZlcnNpb25zDQotICAgICAgICAgICAgICAgIHVzaW5nIGZ1bmN0aW9uIEhBTF9BRENfU3RhcnQoKQ0KLSAgICAgICAgICAoKysrKSBXYWl0IGZvciBBREMgY29udmVyc2lvbiBjb21wbGV0aW9uDQotICAgICAgICAgICAgICAgIHVzaW5nIGZ1bmN0aW9uIEhBTF9BRENfUG9sbEZvckNvbnZlcnNpb24oKQ0KLSAgICAgICAgICAoKysrKSBSZXRyaWV2ZSBjb252ZXJzaW9uIHJlc3VsdHMNCi0gICAgICAgICAgICAgICAgdXNpbmcgZnVuY3Rpb24gSEFMX0FEQ19HZXRWYWx1ZSgpDQotICAgICAgICAgICgrKyspIFN0b3AgY29udmVyc2lvbiBhbmQgZGlzYWJsZSB0aGUgQURDIHBlcmlwaGVyYWwNCi0gICAgICAgICAgICAgICAgdXNpbmcgZnVuY3Rpb24gSEFMX0FEQ19TdG9wKCkNCi0NCi0gICAgICAgICgrKykgQURDIGNvbnZlcnNpb24gYnkgaW50ZXJydXB0aW9uOg0KLSAgICAgICAgICAoKysrKSBBY3RpdmF0ZSB0aGUgQURDIHBlcmlwaGVyYWwgYW5kIHN0YXJ0IGNvbnZlcnNpb25zDQotICAgICAgICAgICAgICAgIHVzaW5nIGZ1bmN0aW9uIEhBTF9BRENfU3RhcnRfSVQoKQ0KLSAgICAgICAgICAoKysrKSBXYWl0IGZvciBBREMgY29udmVyc2lvbiBjb21wbGV0aW9uIGJ5IGNhbGwgb2YgZnVuY3Rpb24NCi0gICAgICAgICAgICAgICAgSEFMX0FEQ19Db252Q3BsdENhbGxiYWNrKCkNCi0gICAgICAgICAgICAgICAgKHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBpbXBsZW1lbnRlZCBpbiB1c2VyIHByb2dyYW0pDQotICAgICAgICAgICgrKyspIFJldHJpZXZlIGNvbnZlcnNpb24gcmVzdWx0cw0KLSAgICAgICAgICAgICAgICB1c2luZyBmdW5jdGlvbiBIQUxfQURDX0dldFZhbHVlKCkNCi0gICAgICAgICAgKCsrKykgU3RvcCBjb252ZXJzaW9uIGFuZCBkaXNhYmxlIHRoZSBBREMgcGVyaXBoZXJhbA0KLSAgICAgICAgICAgICAgICB1c2luZyBmdW5jdGlvbiBIQUxfQURDX1N0b3BfSVQoKQ0KLQ0KLSAgICAgICAgKCsrKSBBREMgY29udmVyc2lvbiB3aXRoIHRyYW5zZmVyIGJ5IERNQToNCi0gICAgICAgICAgKCsrKykgQWN0aXZhdGUgdGhlIEFEQyBwZXJpcGhlcmFsIGFuZCBzdGFydCBjb252ZXJzaW9ucw0KLSAgICAgICAgICAgICAgICB1c2luZyBmdW5jdGlvbiBIQUxfQURDX1N0YXJ0X0RNQSgpDQotICAgICAgICAgICgrKyspIFdhaXQgZm9yIEFEQyBjb252ZXJzaW9uIGNvbXBsZXRpb24gYnkgY2FsbCBvZiBmdW5jdGlvbg0KLSAgICAgICAgICAgICAgICBIQUxfQURDX0NvbnZDcGx0Q2FsbGJhY2soKSBvciBIQUxfQURDX0NvbnZIYWxmQ3BsdENhbGxiYWNrKCkNCi0gICAgICAgICAgICAgICAgKHRoZXNlIGZ1bmN0aW9ucyBtdXN0IGJlIGltcGxlbWVudGVkIGluIHVzZXIgcHJvZ3JhbSkNCi0gICAgICAgICAgKCsrKykgQ29udmVyc2lvbiByZXN1bHRzIGFyZSBhdXRvbWF0aWNhbGx5IHRyYW5zZmVycmVkIGJ5IERNQSBpbnRvDQotICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uIHZhcmlhYmxlIGFkZHJlc3MuDQotICAgICAgICAgICgrKyspIFN0b3AgY29udmVyc2lvbiBhbmQgZGlzYWJsZSB0aGUgQURDIHBlcmlwaGVyYWwNCi0gICAgICAgICAgICAgICAgdXNpbmcgZnVuY3Rpb24gSEFMX0FEQ19TdG9wX0RNQSgpDQotDQotICAgICBbLi5dDQotDQotICAgIChAKSBDYWxsYmFjayBmdW5jdGlvbnMgbXVzdCBiZSBpbXBsZW1lbnRlZCBpbiB1c2VyIHByb2dyYW06DQotICAgICAgKCtAKSBIQUxfQURDX0Vycm9yQ2FsbGJhY2soKQ0KLSAgICAgICgrQCkgSEFMX0FEQ19MZXZlbE91dE9mV2luZG93Q2FsbGJhY2soKSAoY2FsbGJhY2sgb2YgYW5hbG9nIHdhdGNoZG9nKQ0KLSAgICAgICgrQCkgSEFMX0FEQ19Db252Q3BsdENhbGxiYWNrKCkNCi0gICAgICAoK0ApIEhBTF9BRENfQ29udkhhbGZDcGx0Q2FsbGJhY2sNCi0NCi0gICAgICoqKiBEZWluaXRpYWxpemF0aW9uIG9mIEFEQyAqKioNCi0gICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICAgWy4uXQ0KLQ0KLSAgICAoIykgRGlzYWJsZSB0aGUgQURDIGludGVyZmFjZQ0KLSAgICAgICgrKykgQURDIGNsb2NrIGNhbiBiZSBoYXJkIHJlc2V0IGFuZCBkaXNhYmxlZCBhdCBSQ0MgdG9wIGxldmVsLg0KLSAgICAgICAgKCsrKSBIYXJkIHJlc2V0IG9mIEFEQyBwZXJpcGhlcmFscw0KLSAgICAgICAgICAgICB1c2luZyBtYWNybyBfX0FEQ3hfRk9SQ0VfUkVTRVQoKSwgX19BREN4X1JFTEVBU0VfUkVTRVQoKS4NCi0gICAgICAgICgrKykgQURDIGNsb2NrIGRpc2FibGUNCi0gICAgICAgICAgICAgdXNpbmcgdGhlIGVxdWl2YWxlbnQgbWFjcm8vZnVuY3Rpb25zIGFzIGNvbmZpZ3VyYXRpb24gc3RlcC4NCi0gICAgICAgICAgICAgKCsrKykgRXhhbXBsZToNCi0gICAgICAgICAgICAgICAgICAgSW50byBIQUxfQURDX01zcERlSW5pdCgpIChyZWNvbW1lbmRlZCBjb2RlIGxvY2F0aW9uKSBvciB3aXRoDQotICAgICAgICAgICAgICAgICAgIG90aGVyIGRldmljZSBjbG9jayBwYXJhbWV0ZXJzIGNvbmZpZ3VyYXRpb246DQotICAgICAgICAgICAgICAgKCsrKykgUkNDX09zY0luaXRTdHJ1Y3R1cmUuT3NjaWxsYXRvclR5cGUgPQ0KLSAgUkNDX09TQ0lMTEFUT1JUWVBFX0hTSTE0Ow0KLSAgICAgICAgICAgICAgICgrKyspIFJDQ19Pc2NJbml0U3RydWN0dXJlLkhTSTE0U3RhdGUgPSBSQ0NfSFNJMTRfT0ZGOyAoaWYgbm90DQotICB1c2VkIGZvciBzeXN0ZW0gY2xvY2spDQotICAgICAgICAgICAgICAgKCsrKykgSEFMX1JDQ19Pc2NDb25maWcoJlJDQ19Pc2NJbml0U3RydWN0dXJlKTsNCi0NCi0gICAgKCMpIEFEQyBwaW5zIGNvbmZpZ3VyYXRpb24NCi0gICAgICAgICAoKyspIERpc2FibGUgdGhlIGNsb2NrIGZvciB0aGUgQURDIEdQSU9zDQotICAgICAgICAgICAgICB1c2luZyBtYWNybyBfX0hBTF9SQ0NfR1BJT3hfQ0xLX0RJU0FCTEUoKQ0KLQ0KLSAgICAoIykgT3B0aW9uYWxseSwgaW4gY2FzZSBvZiB1c2FnZSBvZiBBREMgd2l0aCBpbnRlcnJ1cHRpb25zOg0KLSAgICAgICAgICgrKykgRGlzYWJsZSB0aGUgTlZJQyBmb3IgQURDDQotICAgICAgICAgICAgICB1c2luZyBmdW5jdGlvbiBIQUxfTlZJQ19FbmFibGVJUlEoQURDeF9JUlFuKQ0KLQ0KLSAgICAoIykgT3B0aW9uYWxseSwgaW4gY2FzZSBvZiB1c2FnZSBvZiBETUE6DQotICAgICAgICAgKCsrKSBEZWluaXRpYWxpemUgdGhlIERNQQ0KLSAgICAgICAgICAgICAgdXNpbmcgZnVuY3Rpb24gSEFMX0RNQV9Jbml0KCkuDQotICAgICAgICAgKCsrKSBEaXNhYmxlIHRoZSBOVklDIGZvciBETUENCi0gICAgICAgICAgICAgIHVzaW5nIGZ1bmN0aW9uIEhBTF9OVklDX0VuYWJsZUlSUShETUF4X0NoYW5uZWx4X0lSUW4pDQotDQotICAgIFsuLl0NCi0NCi0gICAgKioqIENhbGxiYWNrIHJlZ2lzdHJhdGlvbiAqKioNCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgIFsuLl0NCi0NCi0gICAgIFRoZSBjb21waWxhdGlvbiBmbGFnIFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUywgd2hlbiBzZXQgdG8gMSwNCi0gICAgIGFsbG93cyB0aGUgdXNlciB0byBjb25maWd1cmUgZHluYW1pY2FsbHkgdGhlIGRyaXZlciBjYWxsYmFja3MuDQotICAgICBVc2UgRnVuY3Rpb25zIEhBTF9BRENfUmVnaXN0ZXJDYWxsYmFjaygpDQotICAgICB0byByZWdpc3RlciBhbiBpbnRlcnJ1cHQgY2FsbGJhY2suDQotICAgIFsuLl0NCi0NCi0gICAgIEZ1bmN0aW9uIEhBTF9BRENfUmVnaXN0ZXJDYWxsYmFjaygpIGFsbG93cyB0byByZWdpc3RlciBmb2xsb3dpbmcgY2FsbGJhY2tzOg0KLSAgICAgICAoKykgQ29udkNwbHRDYWxsYmFjayAgICAgICAgICAgICAgIDogQURDIGNvbnZlcnNpb24gY29tcGxldGUgY2FsbGJhY2sNCi0gICAgICAgKCspIENvbnZIYWxmQ3BsdENhbGxiYWNrICAgICAgICAgICA6IEFEQyBjb252ZXJzaW9uIERNQSBoYWxmLXRyYW5zZmVyDQotICBjYWxsYmFjaw0KLSAgICAgICAoKykgTGV2ZWxPdXRPZldpbmRvd0NhbGxiYWNrICAgICAgIDogQURDIGFuYWxvZyB3YXRjaGRvZyAxIGNhbGxiYWNrDQotICAgICAgICgrKSBFcnJvckNhbGxiYWNrICAgICAgICAgICAgICAgICAgOiBBREMgZXJyb3IgY2FsbGJhY2sNCi0gICAgICAgKCspIEluamVjdGVkQ29udkNwbHRDYWxsYmFjayAgICAgICA6IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uDQotICBjb21wbGV0ZSBjYWxsYmFjaw0KLSAgICAgICAoKykgSW5qZWN0ZWRRdWV1ZU92ZXJmbG93Q2FsbGJhY2sgIDogQURDIGdyb3VwIGluamVjdGVkIGNvbnRleHQgcXVldWUNCi0gIG92ZXJmbG93IGNhbGxiYWNrDQotICAgICAgICgrKSBMZXZlbE91dE9mV2luZG93MkNhbGxiYWNrICAgICAgOiBBREMgYW5hbG9nIHdhdGNoZG9nIDIgY2FsbGJhY2sNCi0gICAgICAgKCspIExldmVsT3V0T2ZXaW5kb3czQ2FsbGJhY2sgICAgICA6IEFEQyBhbmFsb2cgd2F0Y2hkb2cgMyBjYWxsYmFjaw0KLSAgICAgICAoKykgRW5kT2ZTYW1wbGluZ0NhbGxiYWNrICAgICAgICAgIDogQURDIGVuZCBvZiBzYW1wbGluZyBjYWxsYmFjaw0KLSAgICAgICAoKykgTXNwSW5pdENhbGxiYWNrICAgICAgICAgICAgICAgIDogQURDIE1zcCBJbml0IGNhbGxiYWNrDQotICAgICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgICAgICAgICAgICAgOiBBREMgTXNwIERlSW5pdCBjYWxsYmFjaw0KLSAgICAgVGhpcyBmdW5jdGlvbiB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZSBIQUwgcGVyaXBoZXJhbCBoYW5kbGUsIHRoZSBDYWxsYmFjaw0KLSAgSUQgYW5kIGEgcG9pbnRlciB0byB0aGUgdXNlciBjYWxsYmFjayBmdW5jdGlvbi4NCi0gICAgWy4uXQ0KLQ0KLSAgICAgVXNlIGZ1bmN0aW9uIEhBTF9BRENfVW5SZWdpc3RlckNhbGxiYWNrIHRvIHJlc2V0IGEgY2FsbGJhY2sgdG8gdGhlIGRlZmF1bHQNCi0gICAgIHdlYWsgZnVuY3Rpb24uDQotICAgIFsuLl0NCi0NCi0gICAgIEhBTF9BRENfVW5SZWdpc3RlckNhbGxiYWNrIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSwNCi0gICAgIGFuZCB0aGUgQ2FsbGJhY2sgSUQuDQotICAgICBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0byByZXNldCBmb2xsb3dpbmcgY2FsbGJhY2tzOg0KLSAgICAgICAoKykgQ29udkNwbHRDYWxsYmFjayAgICAgICAgICAgICAgIDogQURDIGNvbnZlcnNpb24gY29tcGxldGUgY2FsbGJhY2sNCi0gICAgICAgKCspIENvbnZIYWxmQ3BsdENhbGxiYWNrICAgICAgICAgICA6IEFEQyBjb252ZXJzaW9uIERNQSBoYWxmLXRyYW5zZmVyDQotICBjYWxsYmFjaw0KLSAgICAgICAoKykgTGV2ZWxPdXRPZldpbmRvd0NhbGxiYWNrICAgICAgIDogQURDIGFuYWxvZyB3YXRjaGRvZyAxIGNhbGxiYWNrDQotICAgICAgICgrKSBFcnJvckNhbGxiYWNrICAgICAgICAgICAgICAgICAgOiBBREMgZXJyb3IgY2FsbGJhY2sNCi0gICAgICAgKCspIEluamVjdGVkQ29udkNwbHRDYWxsYmFjayAgICAgICA6IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uDQotICBjb21wbGV0ZSBjYWxsYmFjaw0KLSAgICAgICAoKykgSW5qZWN0ZWRRdWV1ZU92ZXJmbG93Q2FsbGJhY2sgIDogQURDIGdyb3VwIGluamVjdGVkIGNvbnRleHQgcXVldWUNCi0gIG92ZXJmbG93IGNhbGxiYWNrDQotICAgICAgICgrKSBMZXZlbE91dE9mV2luZG93MkNhbGxiYWNrICAgICAgOiBBREMgYW5hbG9nIHdhdGNoZG9nIDIgY2FsbGJhY2sNCi0gICAgICAgKCspIExldmVsT3V0T2ZXaW5kb3czQ2FsbGJhY2sgICAgICA6IEFEQyBhbmFsb2cgd2F0Y2hkb2cgMyBjYWxsYmFjaw0KLSAgICAgICAoKykgRW5kT2ZTYW1wbGluZ0NhbGxiYWNrICAgICAgICAgIDogQURDIGVuZCBvZiBzYW1wbGluZyBjYWxsYmFjaw0KLSAgICAgICAoKykgTXNwSW5pdENhbGxiYWNrICAgICAgICAgICAgICAgIDogQURDIE1zcCBJbml0IGNhbGxiYWNrDQotICAgICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgICAgICAgICAgICAgOiBBREMgTXNwIERlSW5pdCBjYWxsYmFjaw0KLSAgICAgWy4uXQ0KLQ0KLSAgICAgQnkgZGVmYXVsdCwgYWZ0ZXIgdGhlIEhBTF9BRENfSW5pdCgpIGFuZCB3aGVuIHRoZSBzdGF0ZSBpcw0KLSAgSEFMX0FEQ19TVEFURV9SRVNFVCBhbGwgY2FsbGJhY2tzIGFyZSBzZXQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgd2VhayBmdW5jdGlvbnM6DQotICAgICBleGFtcGxlcyBIQUxfQURDX0NvbnZDcGx0Q2FsbGJhY2soKSwgSEFMX0FEQ19FcnJvckNhbGxiYWNrKCkuDQotICAgICBFeGNlcHRpb24gZG9uZSBmb3IgTXNwSW5pdCBhbmQgTXNwRGVJbml0IGZ1bmN0aW9ucyB0aGF0IGFyZQ0KLSAgICAgcmVzZXQgdG8gdGhlIGxlZ2FjeSB3ZWFrIGZ1bmN0aW9ucyBpbiB0aGUgSEFMX0FEQ19Jbml0KCkvIEhBTF9BRENfRGVJbml0KCkNCi0gIG9ubHkgd2hlbiB0aGVzZSBjYWxsYmFja3MgYXJlIG51bGwgKG5vdCByZWdpc3RlcmVkIGJlZm9yZWhhbmQpLg0KLSAgICBbLi5dDQotDQotICAgICBJZiBNc3BJbml0IG9yIE1zcERlSW5pdCBhcmUgbm90IG51bGwsIHRoZSBIQUxfQURDX0luaXQoKS8gSEFMX0FEQ19EZUluaXQoKQ0KLSAgICAga2VlcCBhbmQgdXNlIHRoZSB1c2VyIE1zcEluaXQvTXNwRGVJbml0IGNhbGxiYWNrcyAocmVnaXN0ZXJlZCBiZWZvcmVoYW5kKQ0KLSAgd2hhdGV2ZXIgdGhlIHN0YXRlLg0KLSAgICAgWy4uXQ0KLQ0KLSAgICAgQ2FsbGJhY2tzIGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZCBpbiBIQUxfQURDX1NUQVRFX1JFQURZIHN0YXRlIG9ubHkuDQotICAgICBFeGNlcHRpb24gZG9uZSBNc3BJbml0L01zcERlSW5pdCBmdW5jdGlvbnMgdGhhdCBjYW4gYmUNCi0gIHJlZ2lzdGVyZWQvdW5yZWdpc3RlcmVkIGluIEhBTF9BRENfU1RBVEVfUkVBRFkgb3IgSEFMX0FEQ19TVEFURV9SRVNFVCBzdGF0ZSwNCi0gICAgIHRodXMgcmVnaXN0ZXJlZCAodXNlcikgTXNwSW5pdC9EZUluaXQgY2FsbGJhY2tzIGNhbiBiZSB1c2VkIGR1cmluZyB0aGUNCi0gIEluaXQvRGVJbml0Lg0KLSAgICBbLi5dDQotDQotICAgICBUaGVuLCB0aGUgdXNlciBmaXJzdCByZWdpc3RlcnMgdGhlIE1zcEluaXQvTXNwRGVJbml0IHVzZXIgY2FsbGJhY2tzDQotICAgICB1c2luZyBIQUxfQURDX1JlZ2lzdGVyQ2FsbGJhY2soKSBiZWZvcmUgY2FsbGluZyBIQUxfQURDX0RlSW5pdCgpDQotICAgICBvciBIQUxfQURDX0luaXQoKSBmdW5jdGlvbi4NCi0gICAgIFsuLl0NCi0NCi0gICAgIFdoZW4gdGhlIGNvbXBpbGF0aW9uIGZsYWcgVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTIGlzIHNldCB0byAwIG9yDQotICAgICBub3QgZGVmaW5lZCwgdGhlIGNhbGxiYWNrIHJlZ2lzdHJhdGlvbiBmZWF0dXJlIGlzIG5vdCBhdmFpbGFibGUgYW5kIGFsbA0KLSAgY2FsbGJhY2tzIGFyZSBzZXQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgd2VhayBmdW5jdGlvbnMuDQotDQotICBAZW5kdmVyYmF0aW0NCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgKi8NCi0NCi0vKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpbmNsdWRlICJzdG0zMmc0eHhfaGFsLmgiDQotDQotLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzR4eF9IQUxfRHJpdmVyDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEFEQyBBREMNCi0gKiBAYnJpZWYgQURDIEhBTCBtb2R1bGUgZHJpdmVyDQotICogQHsNCi0gKi8NCi0NCi0jaWZkZWYgSEFMX0FEQ19NT0RVTEVfRU5BQkxFRA0KLQ0KLS8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0NCi0vKiogQGRlZmdyb3VwIEFEQ19Qcml2YXRlX0NvbnN0YW50cyBBREMgUHJpdmF0ZSBDb25zdGFudHMNCi0gKiBAew0KLSAqLw0KLQ0KLSNkZWZpbmUgQURDX0NGR1JfRklFTERTXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKChBRENfQ0ZHUl9SRVMgfCBBRENfQ0ZHUl9BTElHTiB8IEFEQ19DRkdSX0NPTlQgfCBBRENfQ0ZHUl9PVlJNT0QgfCAgICAgICAgXA0KLSAgICBBRENfQ0ZHUl9ESVNDRU4gfCBBRENfQ0ZHUl9ESVNDTlVNIHwgQURDX0NGR1JfRVhURU4gfCAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBBRENfQ0ZHUl9FWFRTRUwpKSAvKiE8IEFEQ19DRkdSIGZpZWxkcyBvZiBwYXJhbWV0ZXJzIHRoYXQgY2FuIGJlIHVwZGF0ZWQgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIG5vIHJlZ3VsYXIgY29udmVyc2lvbiBpcyBvbi1nb2luZyAqLw0KLQ0KLS8qIFRpbWVvdXQgdmFsdWVzIGZvciBBREMgb3BlcmF0aW9ucyAoZW5hYmxlIHNldHRsaW5nIHRpbWUsICAgICAgICAgICAgICAgICAgICovDQotLyogICBkaXNhYmxlIHNldHRsaW5nIHRpbWUsIC4uLikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0vKiAgIFZhbHVlcyBkZWZpbmVkIHRvIGJlIGhpZ2hlciB0aGFuIHdvcnN0IGNhc2VzOiBsb3cgY2xvY2sgZnJlcXVlbmN5LCAgICAgICAqLw0KLS8qICAgbWF4aW11bSBwcmVzY2FsZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBBRENfRU5BQkxFX1RJTUVPVVQgKDJVTCkgIC8qITwgQURDIGVuYWJsZSB0aW1lLW91dCB2YWx1ZSAgKi8NCi0jZGVmaW5lIEFEQ19ESVNBQkxFX1RJTUVPVVQgKDJVTCkgLyohPCBBREMgZGlzYWJsZSB0aW1lLW91dCB2YWx1ZSAqLw0KLQ0KLS8qIFRpbWVvdXQgdG8gd2FpdCBmb3IgY3VycmVudCBjb252ZXJzaW9uIG9uIGdvaW5nIHRvIGJlIGNvbXBsZXRlZC4gICAgICAgICAgICovDQotLyogVGltZW91dCBmaXhlZCB0byBsb25nZXN0IEFEQyBjb252ZXJzaW9uIHBvc3NpYmxlLCBmb3IgMSBjaGFubmVsOiAgICAgICAgICAgKi8NCi0vKiAgIC0gbWF4aW11bSBzYW1wbGluZyB0aW1lICg2NDAuNSBhZGNfY2xrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLS8qICAgLSBBREMgcmVzb2x1dGlvbiAoVHNhciAxMiBiaXRzPSAxMi41IGFkY19jbGspICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotLyogICAtIFN5c3RlbSBjbG9jayAvIEFEQyBjbG9jayA8PSA0MDk2IChoeXBvdGhlc2lzIG9mIG1heGltdW0gY2xvY2sgcmF0aW8pICAgKi8NCi0vKiAgIC0gQURDIG92ZXJzYW1wbGluZyByYXRpbyAyNTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLS8qICAgQ2FsY3VsYXRpb246IDY1MyAqIDQwOTYgKiAyNTYgQ1BVIGNsb2NrIGN5Y2xlcyBtYXggICAgICAgICAgICAgICAgICAgICAgICovDQotLyogVW5pdDogY3ljbGVzIG9mIENQVSBjbG9jay4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIEFEQ19DT05WRVJTSU9OX1RJTUVfTUFYX0NQVV9DWUNMRVMgXA0KLSAgKDY1M1VMICogNDA5NlVMICogMjU2VUwpIC8qITwgQURDIGNvbnZlcnNpb24gY29tcGxldGlvbiB0aW1lLW91dCB2YWx1ZSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0NCi0vKiogQGRlZmdyb3VwIEFEQ19FeHBvcnRlZF9GdW5jdGlvbnMgQURDIEV4cG9ydGVkIEZ1bmN0aW9ucw0KLSAqIEB7DQotICovDQotDQotLyoqIEBkZWZncm91cCBBRENfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24NCi1mdW5jdGlvbnMNCi0gICogQGJyaWVmICAgIEFEQyBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMNCi0gICoNCi1AdmVyYmF0aW0NCi0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAjIyMjIw0KLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86DQotICAgICAgKCspIEluaXRpYWxpemUgYW5kIGNvbmZpZ3VyZSB0aGUgQURDLg0KLSAgICAgICgrKSBEZS1pbml0aWFsaXplIHRoZSBBREMuDQotQGVuZHZlcmJhdGltDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgQURDIHBlcmlwaGVyYWwgYW5kIHJlZ3VsYXIgZ3JvdXAgYWNjb3JkaW5nIHRvDQotICogICAgICAgICBwYXJhbWV0ZXJzIHNwZWNpZmllZCBpbiBzdHJ1Y3R1cmUgIkFEQ19Jbml0VHlwZURlZiIuDQotICogQG5vdGUgICBBcyBwcmVyZXF1aXNpdGUsIEFEQyBjbG9jayBtdXN0IGJlIGNvbmZpZ3VyZWQgYXQgUkNDIHRvcCBsZXZlbA0KLSAqICAgICAgICAgKHJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIFJDQyBjb25maWd1cmF0aW9uIGZvciBBREMNCi0gKiAgICAgICAgIGluIGhlYWRlciBvZiB0aGlzIGZpbGUpLg0KLSAqIEBub3RlICAgUG9zc2liaWxpdHkgdG8gdXBkYXRlIHBhcmFtZXRlcnMgb24gdGhlIGZseToNCi0gKiAgICAgICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIEFEQyBNU1AgKEhBTF9BRENfTXNwSW5pdCgpKSBvbmx5IHdoZW4NCi0gKiAgICAgICAgIGNvbWluZyBmcm9tIEFEQyBzdGF0ZSByZXNldC4gRm9sbG93aW5nIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24gY2FuDQotICogICAgICAgICBiZSB1c2VkIHRvIHJlY29uZmlndXJlIHNvbWUgcGFyYW1ldGVycyBvZiBBRENfSW5pdFR5cGVEZWYNCi0gKiAgICAgICAgIHN0cnVjdHVyZSBvbiB0aGUgZmx5LCB3aXRob3V0IG1vZGlmeWluZyBNU1AgY29uZmlndXJhdGlvbi4gSWYgQURDDQotICogICAgICAgICBNU1AgaGFzIHRvIGJlIG1vZGlmaWVkIGFnYWluLCBIQUxfQURDX0RlSW5pdCgpIG11c3QgYmUgY2FsbGVkDQotICogICAgICAgICBiZWZvcmUgSEFMX0FEQ19Jbml0KCkuDQotICogICAgICAgICBUaGUgc2V0dGluZyBvZiB0aGVzZSBwYXJhbWV0ZXJzIGlzIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZS4NCi0gKiAgICAgICAgIEZvciBwYXJhbWV0ZXJzIGNvbnN0cmFpbnRzLCBzZWUgY29tbWVudHMgb2Ygc3RydWN0dXJlDQotICogICAgICAgICAiQURDX0luaXRUeXBlRGVmIi4NCi0gKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gY29uZmlndXJlcyB0aGUgQURDIHdpdGhpbiAyIHNjb3Blczogc2NvcGUgb2YgZW50aXJlDQotICogICAgICAgICBBREMgYW5kIHNjb3BlIG9mIHJlZ3VsYXIgZ3JvdXAuIEZvciBwYXJhbWV0ZXJzIGRldGFpbHMsIHNlZSBjb21tZW50cw0KLSAqICAgICAgICAgb2Ygc3RydWN0dXJlICJBRENfSW5pdFR5cGVEZWYiLg0KLSAqIEBub3RlICAgUGFyYW1ldGVycyByZWxhdGVkIHRvIGNvbW1vbiBBREMgcmVnaXN0ZXJzIChBREMgY2xvY2sgbW9kZSkgYXJlIHNldA0KLSAqICAgICAgICAgb25seSBpZiBhbGwgQURDcyBhcmUgZGlzYWJsZWQuDQotICogICAgICAgICBJZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSwgdGhlc2UgY29tbW9uIHBhcmFtZXRlcnMgc2V0dGluZyBhcmUNCi0gKiAgICAgICAgIGJ5cGFzc2VkIHdpdGhvdXQgZXJyb3IgcmVwb3J0aW5nOiBpdCBjYW4gYmUgdGhlIGludGVuZGVkIGJlaGF2aW91ciBpbg0KLSAqICAgICAgICAgY2FzZSBvZiB1cGRhdGUgb2YgYSBwYXJhbWV0ZXIgb2YgQURDX0luaXRUeXBlRGVmIG9uIHRoZSBmbHksDQotICogICAgICAgICB3aXRob3V0ICBkaXNhYmxpbmcgdGhlIG90aGVyIEFEQ3MuDQotICogQHBhcmFtIGhhZGMgQURDIGhhbmRsZQ0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfSW5pdChBRENfSGFuZGxlVHlwZURlZiAqaGFkYykgew0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgdG1wX2hhbF9zdGF0dXMgPSBIQUxfT0s7DQotICB1aW50MzJfdCB0bXBDRkdSOw0KLSAgdWludDMyX3QgdG1wX2FkY19yZWdfaXNfY29udmVyc2lvbl9vbl9nb2luZzsNCi0gIF9fSU8gdWludDMyX3Qgd2FpdF9sb29wX2luZGV4ID0gMFVMOw0KLSAgdWludDMyX3QgdG1wX2FkY19pc19jb252ZXJzaW9uX29uX2dvaW5nX3JlZ3VsYXI7DQotICB1aW50MzJfdCB0bXBfYWRjX2lzX2NvbnZlcnNpb25fb25fZ29pbmdfaW5qZWN0ZWQ7DQotDQotICAvKiBDaGVjayBBREMgaGFuZGxlICovDQotICBpZiAoaGFkYyA9PSBOVUxMKSB7DQotICAgIHJldHVybiBIQUxfRVJST1I7DQotICB9DQotDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsNCi0gIGFzc2VydF9wYXJhbShJU19BRENfQ0xPQ0tQUkVTQ0FMRVIoaGFkYy0+SW5pdC5DbG9ja1ByZXNjYWxlcikpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0FEQ19SRVNPTFVUSU9OKGhhZGMtPkluaXQuUmVzb2x1dGlvbikpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0FEQ19EQVRBX0FMSUdOKGhhZGMtPkluaXQuRGF0YUFsaWduKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfQURDX0dBSU5fQ09NUEVOU0FUSU9OKGhhZGMtPkluaXQuR2FpbkNvbXBlbnNhdGlvbikpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0FEQ19TQ0FOX01PREUoaGFkYy0+SW5pdC5TY2FuQ29udk1vZGUpKTsNCi0gIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKGhhZGMtPkluaXQuQ29udGludW91c0NvbnZNb2RlKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfQURDX0VYVFRSSUdfRURHRShoYWRjLT5Jbml0LkV4dGVybmFsVHJpZ0NvbnZFZGdlKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfQURDX0VYVFRSSUcoaGFkYywgaGFkYy0+SW5pdC5FeHRlcm5hbFRyaWdDb252KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfQURDX1NBTVBMSU5HTU9ERShoYWRjLT5Jbml0LlNhbXBsaW5nTW9kZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoaGFkYy0+SW5pdC5ETUFDb250aW51b3VzUmVxdWVzdHMpKTsNCi0gIGFzc2VydF9wYXJhbShJU19BRENfRU9DX1NFTEVDVElPTihoYWRjLT5Jbml0LkVPQ1NlbGVjdGlvbikpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0FEQ19PVkVSUlVOKGhhZGMtPkluaXQuT3ZlcnJ1bikpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoaGFkYy0+SW5pdC5Mb3dQb3dlckF1dG9XYWl0KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShoYWRjLT5Jbml0Lk92ZXJzYW1wbGluZ01vZGUpKTsNCi0NCi0gIGlmIChoYWRjLT5Jbml0LlNjYW5Db252TW9kZSAhPSBBRENfU0NBTl9ESVNBQkxFKSB7DQotICAgIGFzc2VydF9wYXJhbShJU19BRENfUkVHVUxBUl9OQl9DT05WKGhhZGMtPkluaXQuTmJyT2ZDb252ZXJzaW9uKSk7DQotICAgIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKGhhZGMtPkluaXQuRGlzY29udGludW91c0NvbnZNb2RlKSk7DQotDQotICAgIGlmIChoYWRjLT5Jbml0LkRpc2NvbnRpbnVvdXNDb252TW9kZSA9PSBFTkFCTEUpIHsNCi0gICAgICBhc3NlcnRfcGFyYW0oDQotICAgICAgICAgIElTX0FEQ19SRUdVTEFSX0RJU0NPTlRfTlVNQkVSKGhhZGMtPkluaXQuTmJyT2ZEaXNjQ29udmVyc2lvbikpOw0KLSAgICB9DQotICB9DQotDQotICAvKiBESVNDRU4gYW5kIENPTlQgYml0cyBjYW5ub3QgYmUgc2V0IGF0IHRoZSBzYW1lIHRpbWUgKi8NCi0gIGFzc2VydF9wYXJhbSghKChoYWRjLT5Jbml0LkRpc2NvbnRpbnVvdXNDb252TW9kZSA9PSBFTkFCTEUpICYmDQotICAgICAgICAgICAgICAgICAoaGFkYy0+SW5pdC5Db250aW51b3VzQ29udk1vZGUgPT0gRU5BQkxFKSkpOw0KLQ0KLSAgLyogQWN0aW9ucyBwZXJmb3JtZWQgb25seSBpZiBBREMgaXMgY29taW5nIGZyb20gc3RhdGUgcmVzZXQ6ICAgICAgICAgICAgICAgICovDQotICAvKiAtIEluaXRpYWxpemF0aW9uIG9mIEFEQyBNU1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gIGlmIChoYWRjLT5TdGF0ZSA9PSBIQUxfQURDX1NUQVRFX1JFU0VUKSB7DQotI2lmIChVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkNCi0gICAgLyogSW5pdCB0aGUgQURDIENhbGxiYWNrIHNldHRpbmdzICovDQotICAgIGhhZGMtPkNvbnZDcGx0Q2FsbGJhY2sgPQ0KLSAgICAgICAgSEFMX0FEQ19Db252Q3BsdENhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBjYWxsYmFjayAqLw0KLSAgICBoYWRjLT5Db252SGFsZkNwbHRDYWxsYmFjayA9DQotICAgICAgICBIQUxfQURDX0NvbnZIYWxmQ3BsdENhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBjYWxsYmFjayAqLw0KLSAgICBoYWRjLT5MZXZlbE91dE9mV2luZG93Q2FsbGJhY2sgPQ0KLSAgICAgICAgSEFMX0FEQ19MZXZlbE91dE9mV2luZG93Q2FsbGJhY2s7ICAgICAgICAvKiBMZWdhY3kgd2VhayBjYWxsYmFjayAqLw0KLSAgICBoYWRjLT5FcnJvckNhbGxiYWNrID0gSEFMX0FEQ19FcnJvckNhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBjYWxsYmFjayAqLw0KLSAgICBoYWRjLT5JbmplY3RlZENvbnZDcGx0Q2FsbGJhY2sgPQ0KLSAgICAgICAgSEFMX0FEQ0V4X0luamVjdGVkQ29udkNwbHRDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgY2FsbGJhY2sgKi8NCi0gICAgaGFkYy0+SW5qZWN0ZWRRdWV1ZU92ZXJmbG93Q2FsbGJhY2sgPQ0KLSAgICAgICAgSEFMX0FEQ0V4X0luamVjdGVkUXVldWVPdmVyZmxvd0NhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBjYWxsYmFjayAqLw0KLSAgICBoYWRjLT5MZXZlbE91dE9mV2luZG93MkNhbGxiYWNrID0NCi0gICAgICAgIEhBTF9BRENFeF9MZXZlbE91dE9mV2luZG93MkNhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBjYWxsYmFjayAqLw0KLSAgICBoYWRjLT5MZXZlbE91dE9mV2luZG93M0NhbGxiYWNrID0NCi0gICAgICAgIEhBTF9BRENFeF9MZXZlbE91dE9mV2luZG93M0NhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBjYWxsYmFjayAqLw0KLSAgICBoYWRjLT5FbmRPZlNhbXBsaW5nQ2FsbGJhY2sgPQ0KLSAgICAgICAgSEFMX0FEQ0V4X0VuZE9mU2FtcGxpbmdDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgY2FsbGJhY2sgKi8NCi0NCi0gICAgaWYgKGhhZGMtPk1zcEluaXRDYWxsYmFjayA9PSBOVUxMKSB7DQotICAgICAgaGFkYy0+TXNwSW5pdENhbGxiYWNrID0gSEFMX0FEQ19Nc3BJbml0OyAvKiBMZWdhY3kgd2VhayBNc3BJbml0ICAqLw0KLSAgICB9DQotDQotICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLw0KLSAgICBoYWRjLT5Nc3BJbml0Q2FsbGJhY2soaGFkYyk7DQotI2Vsc2UNCi0gICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovDQotICAgIEhBTF9BRENfTXNwSW5pdChoYWRjKTsNCi0jZW5kaWYgLyogVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotDQotICAgIC8qIFNldCBBREMgZXJyb3IgY29kZSB0byBub25lICovDQotICAgIEFEQ19DTEVBUl9FUlJPUkNPREUoaGFkYyk7DQotDQotICAgIC8qIEluaXRpYWxpemUgTG9jayAqLw0KLSAgICBoYWRjLT5Mb2NrID0gSEFMX1VOTE9DS0VEOw0KLSAgfQ0KLQ0KLSAgLyogLSBFeGl0IGZyb20gZGVlcC1wb3dlci1kb3duIG1vZGUgYW5kIEFEQyB2b2x0YWdlIHJlZ3VsYXRvciBlbmFibGUgICAgICAgICovDQotICBpZiAoTExfQURDX0lzRGVlcFBvd2VyRG93bkVuYWJsZWQoaGFkYy0+SW5zdGFuY2UpICE9IDBVTCkgew0KLSAgICAvKiBEaXNhYmxlIEFEQyBkZWVwIHBvd2VyIGRvd24gbW9kZSAqLw0KLSAgICBMTF9BRENfRGlzYWJsZURlZXBQb3dlckRvd24oaGFkYy0+SW5zdGFuY2UpOw0KLQ0KLSAgICAvKiBTeXN0ZW0gd2FzIGluIGRlZXAgcG93ZXIgZG93biBtb2RlLCBjYWxpYnJhdGlvbiBtdXN0DQotICAgICBiZSByZWxhdW5jaGVkIG9yIGEgcHJldmlvdXNseSBzYXZlZCBjYWxpYnJhdGlvbiBmYWN0b3INCi0gICAgIHJlLWFwcGxpZWQgb25jZSB0aGUgQURDIHZvbHRhZ2UgcmVndWxhdG9yIGlzIGVuYWJsZWQgKi8NCi0gIH0NCi0NCi0gIGlmIChMTF9BRENfSXNJbnRlcm5hbFJlZ3VsYXRvckVuYWJsZWQoaGFkYy0+SW5zdGFuY2UpID09IDBVTCkgew0KLSAgICAvKiBFbmFibGUgQURDIGludGVybmFsIHZvbHRhZ2UgcmVndWxhdG9yICovDQotICAgIExMX0FEQ19FbmFibGVJbnRlcm5hbFJlZ3VsYXRvcihoYWRjLT5JbnN0YW5jZSk7DQotDQotICAgIC8qIE5vdGU6IFZhcmlhYmxlIGRpdmlkZWQgYnkgMiB0byBjb21wZW5zYXRlIHBhcnRpYWxseSAgICAgICAgICAgICAgKi8NCi0gICAgLyogICAgICAgQ1BVIHByb2Nlc3NpbmcgY3ljbGVzLCBzY2FsaW5nIGluIHVzIHNwbGl0IHRvIG5vdCAgICAgICAgICAqLw0KLSAgICAvKiAgICAgICBleGNlZWQgMzIgYml0cyByZWdpc3RlciBjYXBhY2l0eSBhbmQgaGFuZGxlIGxvdyBmcmVxdWVuY3kuICovDQotICAgIHdhaXRfbG9vcF9pbmRleCA9ICgoTExfQURDX0RFTEFZX0lOVEVSTkFMX1JFR1VMX1NUQUJfVVMgLyAxMFVMKSAqDQotICAgICAgICAgICAgICAgICAgICAgICAoKFN5c3RlbUNvcmVDbG9jayAvICgxMDAwMDBVTCAqIDJVTCkpICsgMVVMKSk7DQotICAgIHdoaWxlICh3YWl0X2xvb3BfaW5kZXggIT0gMFVMKSB7DQotICAgICAgd2FpdF9sb29wX2luZGV4LS07DQotICAgIH0NCi0gIH0NCi0NCi0gIC8qIFZlcmlmaWNhdGlvbiB0aGF0IEFEQyB2b2x0YWdlIHJlZ3VsYXRvciBpcyBjb3JyZWN0bHkgZW5hYmxlZCwgd2hldGhlciAgICAqLw0KLSAgLyogb3Igbm90IEFEQyBpcyBjb21pbmcgZnJvbSBzdGF0ZSByZXNldCAoaWYgYW55IHBvdGVudGlhbCBwcm9ibGVtIG9mICAgICAgICovDQotICAvKiBjbG9ja2luZywgdm9sdGFnZSByZWd1bGF0b3Igd291bGQgbm90IGJlIGVuYWJsZWQpLiAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gIGlmIChMTF9BRENfSXNJbnRlcm5hbFJlZ3VsYXRvckVuYWJsZWQoaGFkYy0+SW5zdGFuY2UpID09IDBVTCkgew0KLSAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gZXJyb3IgKi8NCi0gICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9JTlRFUk5BTCk7DQotDQotICAgIC8qIFNldCBBREMgZXJyb3IgY29kZSB0byBBREMgcGVyaXBoZXJhbCBpbnRlcm5hbCBlcnJvciAqLw0KLSAgICBTRVRfQklUKGhhZGMtPkVycm9yQ29kZSwgSEFMX0FEQ19FUlJPUl9JTlRFUk5BTCk7DQotDQotICAgIHRtcF9oYWxfc3RhdHVzID0gSEFMX0VSUk9SOw0KLSAgfQ0KLQ0KLSAgLyogQ29uZmlndXJhdGlvbiBvZiBBREMgcGFyYW1ldGVycyBpZiBwcmV2aW91cyBwcmVsaW1pbmFyeSBhY3Rpb25zIGFyZSAgICAgICovDQotICAvKiBjb3JyZWN0bHkgY29tcGxldGVkIGFuZCBpZiB0aGVyZSBpcyBubyBjb252ZXJzaW9uIG9uIGdvaW5nIG9uIHJlZ3VsYXIgICAgKi8NCi0gIC8qIGdyb3VwIChBREMgbWF5IGFscmVhZHkgYmUgZW5hYmxlZCBhdCB0aGlzIHBvaW50IGlmIEhBTF9BRENfSW5pdCgpIGlzICAgICAqLw0KLSAgLyogY2FsbGVkIHRvIHVwZGF0ZSBhIHBhcmFtZXRlciBvbiB0aGUgZmx5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICB0bXBfYWRjX3JlZ19pc19jb252ZXJzaW9uX29uX2dvaW5nID0NCi0gICAgICBMTF9BRENfUkVHX0lzQ29udmVyc2lvbk9uZ29pbmcoaGFkYy0+SW5zdGFuY2UpOw0KLQ0KLSAgaWYgKCgoaGFkYy0+U3RhdGUgJiBIQUxfQURDX1NUQVRFX0VSUk9SX0lOVEVSTkFMKSA9PSAwVUwpICYmDQotICAgICAgKHRtcF9hZGNfcmVnX2lzX2NvbnZlcnNpb25fb25fZ29pbmcgPT0gMFVMKSkgew0KLSAgICAvKiBTZXQgQURDIHN0YXRlICovDQotICAgIEFEQ19TVEFURV9DTFJfU0VUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX1JFR19CVVNZLA0KLSAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX0JVU1lfSU5URVJOQUwpOw0KLQ0KLSAgICAvKiBDb25maWd1cmF0aW9uIG9mIGNvbW1vbiBBREMgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotDQotICAgIC8qIFBhcmFtZXRlcnMgdXBkYXRlIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgLyogUGFyYW1ldGVycyB0aGF0IGNhbiBiZSB1cGRhdGVkIG9ubHkgd2hlbiBBREMgaXMgZGlzYWJsZWQ6ICAgICAgICAgICAgICAqLw0KLSAgICAvKiAgLSBjbG9jayBjb25maWd1cmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIGlmIChMTF9BRENfSXNFbmFibGVkKGhhZGMtPkluc3RhbmNlKSA9PSAwVUwpIHsNCi0gICAgICBpZiAoX19MTF9BRENfSVNfRU5BQkxFRF9BTExfQ09NTU9OX0lOU1RBTkNFKA0KLSAgICAgICAgICAgICAgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSkgPT0gMFVMKSB7DQotICAgICAgICAvKiBSZXNldCBjb25maWd1cmF0aW9uIG9mIEFEQyBjb21tb24gcmVnaXN0ZXIgQ0NSOiAqLw0KLSAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgICAgIC8qICAgLSBBREMgY2xvY2sgbW9kZSBhbmQgQUNDIHByZXNjYWxlciAoQ0tNT0RFIGFuZCBQUkVTQyBiaXRzKWFyZSBzZXQNCi0gICAgICAgICAqLw0KLSAgICAgICAgLyogICAgIGFjY29yZGluZyB0byBhZGMtPkluaXQuQ2xvY2tQcmVzY2FsZXIuIEl0IHNlbGVjdHMgdGhlIGNsb2NrICovDQotICAgICAgICAvKiAgICBzb3VyY2UgYW5kIHNldHMgdGhlIGNsb2NrIGRpdmlzaW9uIGZhY3Rvci4gKi8NCi0gICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgICAgICAvKiBTb21lIHBhcmFtZXRlcnMgb2YgdGhpcyByZWdpc3RlciBhcmUgbm90IHJlc2V0LCBzaW5jZSB0aGV5IGFyZSBzZXQgKi8NCi0gICAgICAgIC8qIGJ5IG90aGVyIGZ1bmN0aW9ucyBhbmQgbXVzdCBiZSBrZXB0IGluIGNhc2Ugb2YgdXNhZ2Ugb2YgdGhpcyAqLw0KLSAgICAgICAgLyogZnVuY3Rpb24gb24gdGhlIGZseSAodXBkYXRlIG9mIGEgcGFyYW1ldGVyIG9mIEFEQ19Jbml0VHlwZURlZiAqLw0KLSAgICAgICAgLyogd2l0aG91dCBuZWVkaW5nIHRvIHJlY29uZmlndXJlIGFsbCBvdGhlciBBREMgZ3JvdXBzL2NoYW5uZWxzICovDQotICAgICAgICAvKiBwYXJhbWV0ZXJzKTogKi8NCi0gICAgICAgIC8qICAgLSB3aGVuIG11bHRpbW9kZSBmZWF0dXJlIGlzIGF2YWlsYWJsZSwgbXVsdGltb2RlLXJlbGF0ZWQgKi8NCi0gICAgICAgIC8qICAgICBwYXJhbWV0ZXJzOiBNRE1BLCBETUFDRkcsIERFTEFZLCBEVUFMIChzZXQgYnkgQVBJICovDQotICAgICAgICAvKiAgICAgSEFMX0FEQ0V4X011bHRpTW9kZUNvbmZpZ0NoYW5uZWwoKSApICovDQotICAgICAgICAvKiAgIC0gaW50ZXJuYWwgbWVhc3VyZW1lbnQgcGF0aHM6IFZiYXQsIHRlbXBlcmF0dXJlIHNlbnNvciwgVnJlZiAqLw0KLSAgICAgICAgLyogICAgIChzZXQgaW50byBIQUxfQURDX0NvbmZpZ0NoYW5uZWwoKSBvciAqLw0KLSAgICAgICAgLyogICAgIEhBTF9BRENFeF9JbmplY3RlZENvbmZpZ0NoYW5uZWwoKSApICovDQotICAgICAgICBMTF9BRENfU2V0Q29tbW9uQ2xvY2soX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWRjLT5Jbml0LkNsb2NrUHJlc2NhbGVyKTsNCi0gICAgICB9DQotICAgIH0NCi0NCi0gICAgLyogQ29uZmlndXJhdGlvbiBvZiBBREM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICAvKiAgLSByZXNvbHV0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluaXQuUmVzb2x1dGlvbiAgICAgICAgICAgICovDQotICAgIC8qICAtIGRhdGEgYWxpZ25tZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5pdC5EYXRhQWxpZ24gICAgICAgICAgICAgKi8NCi0gICAgLyogIC0gZXh0ZXJuYWwgdHJpZ2dlciB0byBzdGFydCBjb252ZXJzaW9uICAgICBJbml0LkV4dGVybmFsVHJpZ0NvbnYgICAgICAqLw0KLSAgICAvKiAgLSBleHRlcm5hbCB0cmlnZ2VyIHBvbGFyaXR5ICAgICAgICAgICAgICAgIEluaXQuRXh0ZXJuYWxUcmlnQ29udkVkZ2UgICovDQotICAgIC8qICAtIGNvbnRpbnVvdXMgY29udmVyc2lvbiBtb2RlICAgICAgICAgICAgICAgSW5pdC5Db250aW51b3VzQ29udk1vZGUgICAgKi8NCi0gICAgLyogIC0gb3ZlcnJ1biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbml0Lk92ZXJydW4gICAgICAgICAgICAgICAqLw0KLSAgICAvKiAgLSBkaXNjb250aW51b3VzIG1vZGUgICAgICAgICAgICAgICAgICAgICAgIEluaXQuRGlzY29udGludW91c0NvbnZNb2RlICovDQotICAgIC8qICAtIGRpc2NvbnRpbnVvdXMgbW9kZSBjaGFubmVsIGNvdW50ICAgICAgICAgSW5pdC5OYnJPZkRpc2NDb252ZXJzaW9uICAgKi8NCi0gICAgdG1wQ0ZHUiA9DQotICAgICAgICAoQURDX0NGR1JfQ09OVElOVU9VUygodWludDMyX3QpaGFkYy0+SW5pdC5Db250aW51b3VzQ29udk1vZGUpIHwNCi0gICAgICAgICBoYWRjLT5Jbml0Lk92ZXJydW4gfCBoYWRjLT5Jbml0LkRhdGFBbGlnbiB8IGhhZGMtPkluaXQuUmVzb2x1dGlvbiB8DQotICAgICAgICAgQURDX0NGR1JfUkVHX0RJU0NPTlRJTlVPVVMoDQotICAgICAgICAgICAgICh1aW50MzJfdCloYWRjLT5Jbml0LkRpc2NvbnRpbnVvdXNDb252TW9kZSkpOw0KLQ0KLSAgICBpZiAoaGFkYy0+SW5pdC5EaXNjb250aW51b3VzQ29udk1vZGUgPT0gRU5BQkxFKSB7DQotICAgICAgdG1wQ0ZHUiB8PSBBRENfQ0ZHUl9ESVNDT05USU5VT1VTX05VTShoYWRjLT5Jbml0Lk5ick9mRGlzY0NvbnZlcnNpb24pOw0KLSAgICB9DQotDQotICAgIC8qIEVuYWJsZSBleHRlcm5hbCB0cmlnZ2VyIGlmIHRyaWdnZXIgc2VsZWN0aW9uIGlzIGRpZmZlcmVudCBvZiBzb2Z0d2FyZSAgKi8NCi0gICAgLyogc3RhcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICAvKiBOb3RlOiBUaGlzIGNvbmZpZ3VyYXRpb24ga2VlcHMgdGhlIGhhcmR3YXJlIGZlYXR1cmUgb2YgcGFyYW1ldGVyICAgICAgICovDQotICAgIC8qICAgICAgIEV4dGVybmFsVHJpZ0NvbnZFZGdlICJ0cmlnZ2VyIGVkZ2Ugbm9uZSIgZXF1aXZhbGVudCB0byAgICAgICAgICAgKi8NCi0gICAgLyogICAgICAgc29mdHdhcmUgc3RhcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICBpZiAoaGFkYy0+SW5pdC5FeHRlcm5hbFRyaWdDb252ICE9IEFEQ19TT0ZUV0FSRV9TVEFSVCkgew0KLSAgICAgIHRtcENGR1IgfD0gKChoYWRjLT5Jbml0LkV4dGVybmFsVHJpZ0NvbnYgJiBBRENfQ0ZHUl9FWFRTRUwpIHwNCi0gICAgICAgICAgICAgICAgICBoYWRjLT5Jbml0LkV4dGVybmFsVHJpZ0NvbnZFZGdlKTsNCi0gICAgfQ0KLQ0KLSAgICAvKiBVcGRhdGUgQ29uZmlndXJhdGlvbiBSZWdpc3RlciBDRkdSICovDQotICAgIE1PRElGWV9SRUcoaGFkYy0+SW5zdGFuY2UtPkNGR1IsIEFEQ19DRkdSX0ZJRUxEU18xLCB0bXBDRkdSKTsNCi0NCi0gICAgLyogQ29uZmlndXJhdGlvbiBvZiBzYW1wbGluZyBtb2RlICovDQotICAgIE1PRElGWV9SRUcoaGFkYy0+SW5zdGFuY2UtPkNGR1IyLCBBRENfQ0ZHUjJfQlVMQiB8IEFEQ19DRkdSMl9TTVBUUklHLA0KLSAgICAgICAgICAgICAgIGhhZGMtPkluaXQuU2FtcGxpbmdNb2RlKTsNCi0NCi0gICAgLyogUGFyYW1ldGVycyB1cGRhdGUgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICAvKiBQYXJhbWV0ZXJzIHRoYXQgY2FuIGJlIHVwZGF0ZWQgd2hlbiBBREMgaXMgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0ICovDQotICAgIC8qIGNvbnZlcnNpb24gb24gZ29pbmcgb24gcmVndWxhciBhbmQgaW5qZWN0ZWQgZ3JvdXBzOiAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgLyogIC0gR2FpbiBDb21wZW5zYXRpb24gICAgICAgICAgICAgICBJbml0LkdhaW5Db21wZW5zYXRpb24gICAgICAgICAgICAgICAqLw0KLSAgICAvKiAgLSBETUEgY29udGludW91cyByZXF1ZXN0ICAgICAgICAgIEluaXQuRE1BQ29udGludW91c1JlcXVlc3RzICAgICAgICAgICovDQotICAgIC8qICAtIExvd1Bvd2VyQXV0b1dhaXQgZmVhdHVyZSAgICAgICAgSW5pdC5Mb3dQb3dlckF1dG9XYWl0ICAgICAgICAgICAgICAgKi8NCi0gICAgLyogIC0gT3ZlcnNhbXBsaW5nIHBhcmFtZXRlcnMgICAgICAgICBJbml0Lk92ZXJzYW1wbGluZyAgICAgICAgICAgICAgICAgICAqLw0KLSAgICB0bXBfYWRjX2lzX2NvbnZlcnNpb25fb25fZ29pbmdfcmVndWxhciA9DQotICAgICAgICBMTF9BRENfUkVHX0lzQ29udmVyc2lvbk9uZ29pbmcoaGFkYy0+SW5zdGFuY2UpOw0KLSAgICB0bXBfYWRjX2lzX2NvbnZlcnNpb25fb25fZ29pbmdfaW5qZWN0ZWQgPQ0KLSAgICAgICAgTExfQURDX0lOSl9Jc0NvbnZlcnNpb25PbmdvaW5nKGhhZGMtPkluc3RhbmNlKTsNCi0gICAgaWYgKCh0bXBfYWRjX2lzX2NvbnZlcnNpb25fb25fZ29pbmdfcmVndWxhciA9PSAwVUwpICYmDQotICAgICAgICAodG1wX2FkY19pc19jb252ZXJzaW9uX29uX2dvaW5nX2luamVjdGVkID09IDBVTCkpIHsNCi0gICAgICB0bXBDRkdSID0NCi0gICAgICAgICAgKEFEQ19DRkdSX0RGU0RNKGhhZGMpIHwNCi0gICAgICAgICAgIEFEQ19DRkdSX0FVVE9XQUlUKCh1aW50MzJfdCloYWRjLT5Jbml0Lkxvd1Bvd2VyQXV0b1dhaXQpIHwNCi0gICAgICAgICAgIEFEQ19DRkdSX0RNQUNPTlRSRVEoKHVpbnQzMl90KWhhZGMtPkluaXQuRE1BQ29udGludW91c1JlcXVlc3RzKSk7DQotDQotICAgICAgTU9ESUZZX1JFRyhoYWRjLT5JbnN0YW5jZS0+Q0ZHUiwgQURDX0NGR1JfRklFTERTXzIsIHRtcENGR1IpOw0KLQ0KLSAgICAgIGlmIChoYWRjLT5Jbml0LkdhaW5Db21wZW5zYXRpb24gIT0gMFVMKSB7DQotICAgICAgICBTRVRfQklUKGhhZGMtPkluc3RhbmNlLT5DRkdSMiwgQURDX0NGR1IyX0dDT01QKTsNCi0gICAgICAgIE1PRElGWV9SRUcoaGFkYy0+SW5zdGFuY2UtPkdDT01QLCBBRENfR0NPTVBfR0NPTVBDT0VGRiwNCi0gICAgICAgICAgICAgICAgICAgaGFkYy0+SW5pdC5HYWluQ29tcGVuc2F0aW9uKTsNCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgQ0xFQVJfQklUKGhhZGMtPkluc3RhbmNlLT5DRkdSMiwgQURDX0NGR1IyX0dDT01QKTsNCi0gICAgICAgIE1PRElGWV9SRUcoaGFkYy0+SW5zdGFuY2UtPkdDT01QLCBBRENfR0NPTVBfR0NPTVBDT0VGRiwgMFVMKTsNCi0gICAgICB9DQotDQotICAgICAgaWYgKGhhZGMtPkluaXQuT3ZlcnNhbXBsaW5nTW9kZSA9PSBFTkFCTEUpIHsNCi0gICAgICAgIGFzc2VydF9wYXJhbShJU19BRENfT1ZFUlNBTVBMSU5HX1JBVElPKGhhZGMtPkluaXQuT3ZlcnNhbXBsaW5nLlJhdGlvKSk7DQotICAgICAgICBhc3NlcnRfcGFyYW0oDQotICAgICAgICAgICAgSVNfQURDX1JJR0hUX0JJVF9TSElGVChoYWRjLT5Jbml0Lk92ZXJzYW1wbGluZy5SaWdodEJpdFNoaWZ0KSk7DQotICAgICAgICBhc3NlcnRfcGFyYW0oSVNfQURDX1RSSUdHRVJFRF9PVkVSU0FNUExJTkdfTU9ERSgNCi0gICAgICAgICAgICBoYWRjLT5Jbml0Lk92ZXJzYW1wbGluZy5UcmlnZ2VyZWRNb2RlKSk7DQotICAgICAgICBhc3NlcnRfcGFyYW0oSVNfQURDX1JFR09WRVJTQU1QTElOR19NT0RFKA0KLSAgICAgICAgICAgIGhhZGMtPkluaXQuT3ZlcnNhbXBsaW5nLk92ZXJzYW1wbGluZ1N0b3BSZXNldCkpOw0KLQ0KLSAgICAgICAgLyogQ29uZmlndXJhdGlvbiBvZiBPdmVyc2FtcGxlcjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgICAgICAvKiAgLSBPdmVyc2FtcGxpbmcgUmF0aW8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgICAgIC8qICAtIFJpZ2h0IGJpdCBzaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICAgICAgLyogIC0gVHJpZ2dlcmVkIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgICAgICAvKiAgLSBPdmVyc2FtcGxpbmcgbW9kZSAoY29udGludWVkL3Jlc3VtZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgICAgIE1PRElGWV9SRUcoDQotICAgICAgICAgICAgaGFkYy0+SW5zdGFuY2UtPkNGR1IyLA0KLSAgICAgICAgICAgIEFEQ19DRkdSMl9PVlNSIHwgQURDX0NGR1IyX09WU1MgfCBBRENfQ0ZHUjJfVFJPVlMgfCBBRENfQ0ZHUjJfUk9WU00sDQotICAgICAgICAgICAgQURDX0NGR1IyX1JPVlNFIHwgaGFkYy0+SW5pdC5PdmVyc2FtcGxpbmcuUmF0aW8gfA0KLSAgICAgICAgICAgICAgICBoYWRjLT5Jbml0Lk92ZXJzYW1wbGluZy5SaWdodEJpdFNoaWZ0IHwNCi0gICAgICAgICAgICAgICAgaGFkYy0+SW5pdC5PdmVyc2FtcGxpbmcuVHJpZ2dlcmVkTW9kZSB8DQotICAgICAgICAgICAgICAgIGhhZGMtPkluaXQuT3ZlcnNhbXBsaW5nLk92ZXJzYW1wbGluZ1N0b3BSZXNldCk7DQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgIC8qIERpc2FibGUgQURDIG92ZXJzYW1wbGluZyBzY29wZSBvbiBBREMgZ3JvdXAgcmVndWxhciAqLw0KLSAgICAgICAgQ0xFQVJfQklUKGhhZGMtPkluc3RhbmNlLT5DRkdSMiwgQURDX0NGR1IyX1JPVlNFKTsNCi0gICAgICB9DQotICAgIH0NCi0NCi0gICAgLyogQ29uZmlndXJhdGlvbiBvZiByZWd1bGFyIGdyb3VwIHNlcXVlbmNlcjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICAvKiAtIGlmIHNjYW4gbW9kZSBpcyBkaXNhYmxlZCwgcmVndWxhciBjaGFubmVscyBzZXF1ZW5jZSBsZW5ndGggaXMgc2V0IHRvICovDQotICAgIC8qICAgMHgwMDogMSBjaGFubmVsIGNvbnZlcnRlZCAoY2hhbm5lbCBvbiByZWd1bGFyIHJhbmsgMSkgICAgICAgICAgICAgICAgKi8NCi0gICAgLyogICBQYXJhbWV0ZXIgIk5ick9mQ29udmVyc2lvbiIgaXMgZGlzY2FyZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICAvKiAgIE5vdGU6IFNjYW4gbW9kZSBpcyBub3QgcHJlc2VudCBieSBoYXJkd2FyZSBvbiB0aGlzIGRldmljZSwgYnV0ICAgICAgICovDQotICAgIC8qICAgZW11bGF0ZWQgYnkgc29mdHdhcmUgZm9yIGFsaWdubWVudCBvdmVyIGFsbCBTVE0zMiBkZXZpY2VzLiAgICAgICAgICAgKi8NCi0gICAgLyogLSBpZiBzY2FuIG1vZGUgaXMgZW5hYmxlZCwgcmVndWxhciBjaGFubmVscyBzZXF1ZW5jZSBsZW5ndGggaXMgc2V0IHRvICAqLw0KLSAgICAvKiAgIHBhcmFtZXRlciAiTmJyT2ZDb252ZXJzaW9uIi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotDQotICAgIGlmIChoYWRjLT5Jbml0LlNjYW5Db252TW9kZSA9PSBBRENfU0NBTl9FTkFCTEUpIHsNCi0gICAgICAvKiBTZXQgbnVtYmVyIG9mIHJhbmtzIGluIHJlZ3VsYXIgZ3JvdXAgc2VxdWVuY2VyICovDQotICAgICAgTU9ESUZZX1JFRyhoYWRjLT5JbnN0YW5jZS0+U1FSMSwgQURDX1NRUjFfTCwNCi0gICAgICAgICAgICAgICAgIChoYWRjLT5Jbml0Lk5ick9mQ29udmVyc2lvbiAtICh1aW50OF90KTEpKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPlNRUjEsIEFEQ19TUVIxX0wpOw0KLSAgICB9DQotDQotICAgIC8qIEluaXRpYWxpemUgdGhlIEFEQyBzdGF0ZSAqLw0KLSAgICAvKiBDbGVhciBIQUxfQURDX1NUQVRFX0JVU1lfSU5URVJOQUwgYml0LCBzZXQgSEFMX0FEQ19TVEFURV9SRUFEWSBiaXQgKi8NCi0gICAgQURDX1NUQVRFX0NMUl9TRVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfQlVTWV9JTlRFUk5BTCwNCi0gICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUFEWSk7DQotICB9IGVsc2Ugew0KLSAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gZXJyb3IgKi8NCi0gICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9JTlRFUk5BTCk7DQotDQotICAgIHRtcF9oYWxfc3RhdHVzID0gSEFMX0VSUk9SOw0KLSAgfQ0KLQ0KLSAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLw0KLSAgcmV0dXJuIHRtcF9oYWxfc3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERlaW5pdGlhbGl6ZSB0aGUgQURDIHBlcmlwaGVyYWwgcmVnaXN0ZXJzIHRvIHRoZWlyIGRlZmF1bHQgcmVzZXQNCi0gKiAgICAgICAgIHZhbHVlcywgd2l0aCBkZWluaXRpYWxpemF0aW9uIG9mIHRoZSBBREMgTVNQLg0KLSAqIEBub3RlICAgRm9yIGRldmljZXMgd2l0aCBzZXZlcmFsIEFEQ3M6IHJlc2V0IG9mIEFEQyBjb21tb24gcmVnaXN0ZXJzIGlzIGRvbmUNCi0gKiAgICAgICAgIG9ubHkgaWYgYWxsIEFEQ3Mgc2hhcmluZyB0aGUgc2FtZSBjb21tb24gZ3JvdXAgYXJlIGRpc2FibGVkLg0KLSAqICAgICAgICAgKGZ1bmN0aW9uICJIQUxfQURDX01zcERlSW5pdCgpIiBpcyBhbHNvIGNhbGxlZCB1bmRlciB0aGUgc2FtZQ0KLSAqIGNvbmRpdGlvbnM6IGFsbCBBREMgaW5zdGFuY2VzIHVzZSB0aGUgc2FtZSBjb3JlIGNsb2NrIGF0IFJDQyBsZXZlbCwgZGlzYWJsaW5nDQotICogICAgICAgICB0aGUgY29yZSBjbG9jayByZXNldCBhbGwgQURDIGluc3RhbmNlcykuDQotICogICAgICAgICBJZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSwgcmVzZXQgb2YgdGhlc2UgY29tbW9uIHBhcmFtZXRlcnMgcmVzZXQgaXMNCi0gKiAgICAgICAgIGJ5cGFzc2VkIHdpdGhvdXQgZXJyb3IgcmVwb3J0aW5nOiBpdCBjYW4gYmUgdGhlIGludGVuZGVkIGJlaGF2aW9yIGluDQotICogICAgICAgICBjYXNlIG9mIHJlc2V0IG9mIGEgc2luZ2xlIEFEQyB3aGlsZSB0aGUgb3RoZXIgQURDcyBzaGFyaW5nIHRoZSBzYW1lDQotICogICAgICAgICBjb21tb24gZ3JvdXAgaXMgc3RpbGwgcnVubmluZy4NCi0gKiBAbm90ZSAgIEJ5IGRlZmF1bHQsIEhBTF9BRENfRGVJbml0KCkgc2V0IEFEQyBpbiBtb2RlIGRlZXAgcG93ZXItZG93bjoNCi0gKiAgICAgICAgIHRoaXMgc2F2ZXMgbW9yZSBwb3dlciBieSByZWR1Y2luZyBsZWFrYWdlIGN1cnJlbnRzDQotICogICAgICAgICBhbmQgaXMgcGFydGljdWxhcmx5IGludGVyZXN0aW5nIGJlZm9yZSBlbnRlcmluZyBNQ1UgbG93LXBvd2VyIG1vZGVzLg0KLSAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDX0RlSW5pdChBRENfSGFuZGxlVHlwZURlZiAqaGFkYykgew0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgdG1wX2hhbF9zdGF0dXM7DQotDQotICAvKiBDaGVjayBBREMgaGFuZGxlICovDQotICBpZiAoaGFkYyA9PSBOVUxMKSB7DQotICAgIHJldHVybiBIQUxfRVJST1I7DQotICB9DQotDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsNCi0NCi0gIC8qIFNldCBBREMgc3RhdGUgKi8NCi0gIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfQlVTWV9JTlRFUk5BTCk7DQotDQotICAvKiBTdG9wIHBvdGVudGlhbCBjb252ZXJzaW9uIG9uIGdvaW5nICovDQotICB0bXBfaGFsX3N0YXR1cyA9IEFEQ19Db252ZXJzaW9uU3RvcChoYWRjLCBBRENfUkVHVUxBUl9JTkpFQ1RFRF9HUk9VUCk7DQotDQotICAvKiBEaXNhYmxlIEFEQyBwZXJpcGhlcmFsIGlmIGNvbnZlcnNpb25zIGFyZSBlZmZlY3RpdmVseSBzdG9wcGVkICAgICAgICAgICAgKi8NCi0gIC8qIEZsdXNoIHJlZ2lzdGVyIEpTUVI6IHJlc2V0IHRoZSBxdWV1ZSBzZXF1ZW5jZXIgd2hlbiBpbmplY3RlZCAgICAgICAgICAgICAqLw0KLSAgLyogcXVldWUgc2VxdWVuY2VyIGlzIGVuYWJsZWQgYW5kIEFEQyBkaXNhYmxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAvKiBUaGUgc29mdHdhcmUgYW5kIGhhcmR3YXJlIHRyaWdnZXJzIG9mIHRoZSBpbmplY3RlZCBzZXF1ZW5jZSBhcmUgYm90aCAgICAgKi8NCi0gIC8qIGludGVybmFsbHkgZGlzYWJsZWQganVzdCBhZnRlciB0aGUgY29tcGxldGlvbiBvZiB0aGUgbGFzdCB2YWxpZCAgICAgICAgICAqLw0KLSAgLyogaW5qZWN0ZWQgc2VxdWVuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICBTRVRfQklUKGhhZGMtPkluc3RhbmNlLT5DRkdSLCBBRENfQ0ZHUl9KUU0pOw0KLQ0KLSAgLyogRGlzYWJsZSBBREMgcGVyaXBoZXJhbCBpZiBjb252ZXJzaW9ucyBhcmUgZWZmZWN0aXZlbHkgc3RvcHBlZCAqLw0KLSAgaWYgKHRtcF9oYWxfc3RhdHVzID09IEhBTF9PSykgew0KLSAgICAvKiBEaXNhYmxlIHRoZSBBREMgcGVyaXBoZXJhbCAqLw0KLSAgICB0bXBfaGFsX3N0YXR1cyA9IEFEQ19EaXNhYmxlKGhhZGMpOw0KLQ0KLSAgICAvKiBDaGVjayBpZiBBREMgaXMgZWZmZWN0aXZlbHkgZGlzYWJsZWQgKi8NCi0gICAgaWYgKHRtcF9oYWxfc3RhdHVzID09IEhBTF9PSykgew0KLSAgICAgIC8qIENoYW5nZSBBREMgc3RhdGUgKi8NCi0gICAgICBoYWRjLT5TdGF0ZSA9IEhBTF9BRENfU1RBVEVfUkVBRFk7DQotICAgIH0NCi0gIH0NCi0NCi0gIC8qIE5vdGU6IEhBTCBBREMgZGVJbml0IGlzIGRvbmUgaW5kZXBlbmRlbnRseSBvZiBBREMgY29udmVyc2lvbiBzdG9wICAgICAgICAqLw0KLSAgLyogICAgICAgYW5kIGRpc2FibGUgcmV0dXJuIHN0YXR1cy4gSW4gY2FzZSBvZiBzdGF0dXMgZmFpbCwgYXR0ZW1wdCB0byAgICAgICovDQotICAvKiAgICAgICBwZXJmb3JtIGRlaW5pdGlhbGl6YXRpb24gYW55d2F5IGFuZCBpdCBpcyB1cCB1c2VyIGNvZGUgaW4gICAgICAgICAgKi8NCi0gIC8qICAgICAgIGluIEhBTF9BRENfTXNwRGVJbml0KCkgdG8gcmVzZXQgdGhlIEFEQyBwZXJpcGhlcmFsIHVzaW5nICAgICAgICAgICAqLw0KLSAgLyogICAgICAgc3lzdGVtIFJDQyBoYXJkIHJlc2V0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotDQotICAvKiA9PT09PT09PT09IFJlc2V0IEFEQyByZWdpc3RlcnMgPT09PT09PT09PSAqLw0KLSAgLyogUmVzZXQgcmVnaXN0ZXIgSUVSICovDQotICBfX0hBTF9BRENfRElTQUJMRV9JVCgNCi0gICAgICBoYWRjLCAoQURDX0lUX0FXRDMgfCBBRENfSVRfQVdEMiB8IEFEQ19JVF9BV0QxIHwgQURDX0lUX0pRT1ZGIHwNCi0gICAgICAgICAgICAgQURDX0lUX09WUiB8IEFEQ19JVF9KRU9TIHwgQURDX0lUX0pFT0MgfCBBRENfSVRfRU9TIHwgQURDX0lUX0VPQyB8DQotICAgICAgICAgICAgIEFEQ19JVF9FT1NNUCB8IEFEQ19JVF9SRFkpKTsNCi0NCi0gIC8qIFJlc2V0IHJlZ2lzdGVyIElTUiAqLw0KLSAgX19IQUxfQURDX0NMRUFSX0ZMQUcoDQotICAgICAgaGFkYywgKEFEQ19GTEFHX0FXRDMgfCBBRENfRkxBR19BV0QyIHwgQURDX0ZMQUdfQVdEMSB8IEFEQ19GTEFHX0pRT1ZGIHwNCi0gICAgICAgICAgICAgQURDX0ZMQUdfT1ZSIHwgQURDX0ZMQUdfSkVPUyB8IEFEQ19GTEFHX0pFT0MgfCBBRENfRkxBR19FT1MgfA0KLSAgICAgICAgICAgICBBRENfRkxBR19FT0MgfCBBRENfRkxBR19FT1NNUCB8IEFEQ19GTEFHX1JEWSkpOw0KLQ0KLSAgLyogUmVzZXQgcmVnaXN0ZXIgQ1IgKi8NCi0gIC8qIEJpdHMgQURDX0NSX0pBRFNUUCwgQURDX0NSX0FEU1RQLCBBRENfQ1JfSkFEU1RBUlQsIEFEQ19DUl9BRFNUQVJULA0KLSAgICAgQURDX0NSX0FEQ0FMLCBBRENfQ1JfQURESVMgYW5kIEFEQ19DUl9BREVOIGFyZSBpbiBhY2Nlc3MgbW9kZSAicmVhZC1zZXQiOg0KLSAgICAgbm8gZGlyZWN0IHJlc2V0IGFwcGxpY2FibGUuDQotICAgICBVcGRhdGUgQ1IgcmVnaXN0ZXIgdG8gcmVzZXQgdmFsdWUgd2hlcmUgZG9hYmxlIGJ5IHNvZnR3YXJlICovDQotICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPkNSLCBBRENfQ1JfQURWUkVHRU4gfCBBRENfQ1JfQURDQUxESUYpOw0KLSAgU0VUX0JJVChoYWRjLT5JbnN0YW5jZS0+Q1IsIEFEQ19DUl9ERUVQUFdEKTsNCi0NCi0gIC8qIFJlc2V0IHJlZ2lzdGVyIENGR1IgKi8NCi0gIENMRUFSX0JJVChoYWRjLT5JbnN0YW5jZS0+Q0ZHUiwgQURDX0NGR1JfRklFTERTKTsNCi0gIFNFVF9CSVQoaGFkYy0+SW5zdGFuY2UtPkNGR1IsIEFEQ19DRkdSX0pRRElTKTsNCi0NCi0gIC8qIFJlc2V0IHJlZ2lzdGVyIENGR1IyICovDQotICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPkNGR1IyLCBBRENfQ0ZHUjJfUk9WU00gfCBBRENfQ0ZHUjJfVFJPVlMgfA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSMl9PVlNTIHwgQURDX0NGR1IyX09WU1IgfA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSMl9KT1ZTRSB8IEFEQ19DRkdSMl9ST1ZTRSk7DQotDQotICAvKiBSZXNldCByZWdpc3RlciBTTVBSMSAqLw0KLSAgQ0xFQVJfQklUKGhhZGMtPkluc3RhbmNlLT5TTVBSMSwgQURDX1NNUFIxX0ZJRUxEUyk7DQotDQotICAvKiBSZXNldCByZWdpc3RlciBTTVBSMiAqLw0KLSAgQ0xFQVJfQklUKGhhZGMtPkluc3RhbmNlLT5TTVBSMiwNCi0gICAgICAgICAgICBBRENfU01QUjJfU01QMTggfCBBRENfU01QUjJfU01QMTcgfCBBRENfU01QUjJfU01QMTYgfA0KLSAgICAgICAgICAgICAgICBBRENfU01QUjJfU01QMTUgfCBBRENfU01QUjJfU01QMTQgfCBBRENfU01QUjJfU01QMTMgfA0KLSAgICAgICAgICAgICAgICBBRENfU01QUjJfU01QMTIgfCBBRENfU01QUjJfU01QMTEgfCBBRENfU01QUjJfU01QMTApOw0KLQ0KLSAgLyogUmVzZXQgcmVnaXN0ZXIgVFIxICovDQotICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPlRSMSwgQURDX1RSMV9IVDEgfCBBRENfVFIxX0xUMSk7DQotDQotICAvKiBSZXNldCByZWdpc3RlciBUUjIgKi8NCi0gIENMRUFSX0JJVChoYWRjLT5JbnN0YW5jZS0+VFIyLCBBRENfVFIyX0hUMiB8IEFEQ19UUjJfTFQyKTsNCi0NCi0gIC8qIFJlc2V0IHJlZ2lzdGVyIFRSMyAqLw0KLSAgQ0xFQVJfQklUKGhhZGMtPkluc3RhbmNlLT5UUjMsIEFEQ19UUjNfSFQzIHwgQURDX1RSM19MVDMpOw0KLQ0KLSAgLyogUmVzZXQgcmVnaXN0ZXIgU1FSMSAqLw0KLSAgQ0xFQVJfQklUKGhhZGMtPkluc3RhbmNlLT5TUVIxLCBBRENfU1FSMV9TUTQgfCBBRENfU1FSMV9TUTMgfCBBRENfU1FSMV9TUTIgfA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX1NRUjFfU1ExIHwgQURDX1NRUjFfTCk7DQotDQotICAvKiBSZXNldCByZWdpc3RlciBTUVIyICovDQotICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPlNRUjIsIEFEQ19TUVIyX1NROSB8IEFEQ19TUVIyX1NROCB8IEFEQ19TUVIyX1NRNyB8DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfU1FSMl9TUTYgfCBBRENfU1FSMl9TUTUpOw0KLQ0KLSAgLyogUmVzZXQgcmVnaXN0ZXIgU1FSMyAqLw0KLSAgQ0xFQVJfQklUKGhhZGMtPkluc3RhbmNlLT5TUVIzLCBBRENfU1FSM19TUTE0IHwgQURDX1NRUjNfU1ExMyB8DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfU1FSM19TUTEyIHwgQURDX1NRUjNfU1ExMSB8DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfU1FSM19TUTEwKTsNCi0NCi0gIC8qIFJlc2V0IHJlZ2lzdGVyIFNRUjQgKi8NCi0gIENMRUFSX0JJVChoYWRjLT5JbnN0YW5jZS0+U1FSNCwgQURDX1NRUjRfU1ExNiB8IEFEQ19TUVI0X1NRMTUpOw0KLQ0KLSAgLyogUmVnaXN0ZXIgSlNRUiB3YXMgcmVzZXQgd2hlbiB0aGUgQURDIHdhcyBkaXNhYmxlZCAqLw0KLQ0KLSAgLyogUmVzZXQgcmVnaXN0ZXIgRFIgKi8NCi0gIC8qIGJpdHMgaW4gYWNjZXNzIG1vZGUgcmVhZCBvbmx5LCBubyBkaXJlY3QgcmVzZXQgYXBwbGljYWJsZSovDQotDQotICAvKiBSZXNldCByZWdpc3RlciBPRlIxICovDQotICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPk9GUjEsDQotICAgICAgICAgICAgQURDX09GUjFfT0ZGU0VUMV9FTiB8IEFEQ19PRlIxX09GRlNFVDFfQ0ggfCBBRENfT0ZSMV9PRkZTRVQxKTsNCi0gIC8qIFJlc2V0IHJlZ2lzdGVyIE9GUjIgKi8NCi0gIENMRUFSX0JJVChoYWRjLT5JbnN0YW5jZS0+T0ZSMiwNCi0gICAgICAgICAgICBBRENfT0ZSMl9PRkZTRVQyX0VOIHwgQURDX09GUjJfT0ZGU0VUMl9DSCB8IEFEQ19PRlIyX09GRlNFVDIpOw0KLSAgLyogUmVzZXQgcmVnaXN0ZXIgT0ZSMyAqLw0KLSAgQ0xFQVJfQklUKGhhZGMtPkluc3RhbmNlLT5PRlIzLA0KLSAgICAgICAgICAgIEFEQ19PRlIzX09GRlNFVDNfRU4gfCBBRENfT0ZSM19PRkZTRVQzX0NIIHwgQURDX09GUjNfT0ZGU0VUMyk7DQotICAvKiBSZXNldCByZWdpc3RlciBPRlI0ICovDQotICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPk9GUjQsDQotICAgICAgICAgICAgQURDX09GUjRfT0ZGU0VUNF9FTiB8IEFEQ19PRlI0X09GRlNFVDRfQ0ggfCBBRENfT0ZSNF9PRkZTRVQ0KTsNCi0NCi0gIC8qIFJlc2V0IHJlZ2lzdGVycyBKRFIxLCBKRFIyLCBKRFIzLCBKRFI0ICovDQotICAvKiBiaXRzIGluIGFjY2VzcyBtb2RlIHJlYWQgb25seSwgbm8gZGlyZWN0IHJlc2V0IGFwcGxpY2FibGUqLw0KLQ0KLSAgLyogUmVzZXQgcmVnaXN0ZXIgQVdEMkNSICovDQotICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPkFXRDJDUiwgQURDX0FXRDJDUl9BV0QyQ0gpOw0KLQ0KLSAgLyogUmVzZXQgcmVnaXN0ZXIgQVdEM0NSICovDQotICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPkFXRDNDUiwgQURDX0FXRDNDUl9BV0QzQ0gpOw0KLQ0KLSAgLyogUmVzZXQgcmVnaXN0ZXIgRElGU0VMICovDQotICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPkRJRlNFTCwgQURDX0RJRlNFTF9ESUZTRUwpOw0KLQ0KLSAgLyogUmVzZXQgcmVnaXN0ZXIgQ0FMRkFDVCAqLw0KLSAgQ0xFQVJfQklUKGhhZGMtPkluc3RhbmNlLT5DQUxGQUNULA0KLSAgICAgICAgICAgIEFEQ19DQUxGQUNUX0NBTEZBQ1RfRCB8IEFEQ19DQUxGQUNUX0NBTEZBQ1RfUyk7DQotDQotICAvKiA9PT09PT09PT09IFJlc2V0IGNvbW1vbiBBREMgcmVnaXN0ZXJzID09PT09PT09PT0gKi8NCi0NCi0gIC8qIFNvZnR3YXJlIGlzIGFsbG93ZWQgdG8gY2hhbmdlIGNvbW1vbiBwYXJhbWV0ZXJzIG9ubHkgd2hlbiBhbGwgdGhlIG90aGVyDQotICAgICBBRENzIGFyZSBkaXNhYmxlZC4gICAqLw0KLSAgaWYgKF9fTExfQURDX0lTX0VOQUJMRURfQUxMX0NPTU1PTl9JTlNUQU5DRSgNCi0gICAgICAgICAgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSkgPT0gMFVMKSB7DQotICAgIC8qIFJlc2V0IGNvbmZpZ3VyYXRpb24gb2YgQURDIGNvbW1vbiByZWdpc3RlciBDQ1I6DQotICAgICAgLSBjbG9jayBtb2RlOiBDS01PREUsIFBSRVNDRU4NCi0gICAgICAtIG11bHRpbW9kZSByZWxhdGVkIHBhcmFtZXRlcnMgKHdoZW4gdGhpcyBmZWF0dXJlIGlzIGF2YWlsYWJsZSk6IE1ETUEsDQotICAgICAgICBETUFDRkcsIERFTEFZLCBEVUFMIChzZXQgYnkgSEFMX0FEQ0V4X011bHRpTW9kZUNvbmZpZ0NoYW5uZWwoKSBBUEkpDQotICAgICAgLSBpbnRlcm5hbCBtZWFzdXJlbWVudCBwYXRoczogVmJhdCwgdGVtcGVyYXR1cmUgc2Vuc29yLCBWcmVmIChzZXQgaW50bw0KLSAgICAgICAgSEFMX0FEQ19Db25maWdDaGFubmVsKCkgb3IgSEFMX0FEQ0V4X0luamVjdGVkQ29uZmlnQ2hhbm5lbCgpICkNCi0gICAgKi8NCi0gICAgQURDX0NMRUFSX0NPTU1PTl9DT05UUk9MX1JFR0lTVEVSKGhhZGMpOw0KLQ0KLSAgICAvKiA9PT09PT09PT09IEhhcmQgcmVzZXQgQURDIHBlcmlwaGVyYWwgPT09PT09PT09PSAqLw0KLSAgICAvKiBQZXJmb3JtcyBhIGdsb2JhbCByZXNldCBvZiB0aGUgZW50aXJlIEFEQyBwZXJpcGhlcmFscyBpbnN0YW5jZXMgICAgICAgICovDQotICAgIC8qIHNoYXJpbmcgdGhlIHNhbWUgY29tbW9uIEFEQyBpbnN0YW5jZTogQURDIHN0YXRlIGlzIGZvcmNlZCB0byAgICAgICAgICAgKi8NCi0gICAgLyogYSBzaW1pbGFyIHN0YXRlIGFzIGFmdGVyIGRldmljZSBwb3dlci1vbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICAvKiBOb3RlOiBBIHBvc3NpYmxlIGltcGxlbWVudGF0aW9uIGlzIHRvIGFkZCBSQ0MgYnVzIHJlc2V0IG9mIEFEQyAgICAgICAgICovDQotICAgIC8qIChmb3IgZXhhbXBsZSwgdXNpbmcgbWFjcm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgLyogIF9fSEFMX1JDQ19BREMuLi5fRk9SQ0VfUkVTRVQoKS8uLi5fUkVMRUFTRV9SRVNFVCgpLy4uLl9DTEtfRElTQUJMRSgpKSAqLw0KLSAgICAvKiBpbiBmdW5jdGlvbiAidm9pZCBIQUxfQURDX01zcERlSW5pdChBRENfSGFuZGxlVHlwZURlZiAqaGFkYykiOiAgICAgICAgICovDQotI2lmIChVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkNCi0gICAgaWYgKGhhZGMtPk1zcERlSW5pdENhbGxiYWNrID09IE5VTEwpIHsNCi0gICAgICBoYWRjLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9BRENfTXNwRGVJbml0OyAvKiBMZWdhY3kgd2VhayBNc3BEZUluaXQgICovDQotICAgIH0NCi0NCi0gICAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8NCi0gICAgaGFkYy0+TXNwRGVJbml0Q2FsbGJhY2soaGFkYyk7DQotI2Vsc2UNCi0gICAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8NCi0gICAgSEFMX0FEQ19Nc3BEZUluaXQoaGFkYyk7DQotI2VuZGlmIC8qIFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLSAgfQ0KLQ0KLSAgLyogU2V0IEFEQyBlcnJvciBjb2RlIHRvIG5vbmUgKi8NCi0gIEFEQ19DTEVBUl9FUlJPUkNPREUoaGFkYyk7DQotDQotICAvKiBSZXNldCBpbmplY3RlZCBjaGFubmVsIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyAqLw0KLSAgaGFkYy0+SW5qZWN0aW9uQ29uZmlnLkNvbnRleHRRdWV1ZSA9IDA7DQotICBoYWRjLT5JbmplY3Rpb25Db25maWcuQ2hhbm5lbENvdW50ID0gMDsNCi0NCi0gIC8qIFNldCBBREMgc3RhdGUgKi8NCi0gIGhhZGMtPlN0YXRlID0gSEFMX0FEQ19TVEFURV9SRVNFVDsNCi0NCi0gIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8NCi0gIF9fSEFMX1VOTE9DSyhoYWRjKTsNCi0NCi0gIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8NCi0gIHJldHVybiB0bXBfaGFsX3N0YXR1czsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBBREMgTVNQLg0KLSAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX3dlYWsgdm9pZCBIQUxfQURDX01zcEluaXQoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpIHsNCi0gIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8NCi0gIFVOVVNFRChoYWRjKTsNCi0NCi0gIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQuIFdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwNCi0gICAgICAgICAgICBmdW5jdGlvbiBIQUxfQURDX01zcEluaXQgbXVzdCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLg0KLSAgICovDQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGVJbml0aWFsaXplIHRoZSBBREMgTVNQLg0KLSAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUNCi0gKiBAbm90ZSAgIEFsbCBBREMgaW5zdGFuY2VzIHVzZSB0aGUgc2FtZSBjb3JlIGNsb2NrIGF0IFJDQyBsZXZlbCwgZGlzYWJsaW5nDQotICogICAgICAgICB0aGUgY29yZSBjbG9jayByZXNldCBhbGwgQURDIGluc3RhbmNlcykuDQotICogQHJldHZhbCBOb25lDQotICovDQotX193ZWFrIHZvaWQgSEFMX0FEQ19Nc3BEZUluaXQoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpIHsNCi0gIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8NCi0gIFVOVVNFRChoYWRjKTsNCi0NCi0gIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQuIFdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwNCi0gICAgICAgICAgICBmdW5jdGlvbiBIQUxfQURDX01zcERlSW5pdCBtdXN0IGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuDQotICAgKi8NCi19DQotDQotI2lmIChVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkNCi0vKioNCi0gKiBAYnJpZWYgIFJlZ2lzdGVyIGEgVXNlciBBREMgQ2FsbGJhY2sNCi0gKiAgICAgICAgIFRvIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgd2VhayBwcmVkZWZpbmVkIGNhbGxiYWNrDQotICogQHBhcmFtICBoYWRjIFBvaW50ZXIgdG8gYSBBRENfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KLSAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEFEQy4NCi0gKiBAcGFyYW0gIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHJlZ2lzdGVyZWQNCi0gKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9BRENfQ09OVkVSU0lPTl9DT01QTEVURV9DQl9JRCAgICAgIEFEQyBjb252ZXJzaW9uDQotICogY29tcGxldGUgY2FsbGJhY2sgSUQNCi0gKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0FEQ19DT05WRVJTSU9OX0hBTEZfQ0JfSUQgICAgICAgICAgQURDIGNvbnZlcnNpb24gRE1BDQotICogaGFsZi10cmFuc2ZlciBjYWxsYmFjayBJRA0KLSAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQURDX0xFVkVMX09VVF9PRl9XSU5ET1dfMV9DQl9JRCAgICBBREMgYW5hbG9nIHdhdGNoZG9nDQotICogMSBjYWxsYmFjayBJRA0KLSAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQURDX0VSUk9SX0NCX0lEICAgICAgICAgICAgICAgICAgICBBREMgZXJyb3IgY2FsbGJhY2sNCi0gKiBJRA0KLSAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQURDX0lOSl9DT05WRVJTSU9OX0NPTVBMRVRFX0NCX0lEICBBREMgZ3JvdXAgaW5qZWN0ZWQNCi0gKiBjb252ZXJzaW9uIGNvbXBsZXRlIGNhbGxiYWNrIElEDQotICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9BRENfSU5KX1FVRVVFX09WRUZMT1dfQ0JfSUQgICAgICAgIEFEQyBncm91cCBpbmplY3RlZA0KLSAqIGNvbnRleHQgcXVldWUgb3ZlcmZsb3cgY2FsbGJhY2sgSUQNCi0gKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0FEQ19MRVZFTF9PVVRfT0ZfV0lORE9XXzJfQ0JfSUQgICAgQURDIGFuYWxvZyB3YXRjaGRvZw0KLSAqIDIgY2FsbGJhY2sgSUQNCi0gKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0FEQ19MRVZFTF9PVVRfT0ZfV0lORE9XXzNfQ0JfSUQgICAgQURDIGFuYWxvZyB3YXRjaGRvZw0KLSAqIDMgY2FsbGJhY2sgSUQNCi0gKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0FEQ19FTkRfT0ZfU0FNUExJTkdfQ0JfSUQgICAgICAgICAgQURDIGVuZCBvZiBzYW1wbGluZw0KLSAqIGNhbGxiYWNrIElEDQotICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9BRENfTVNQSU5JVF9DQl9JRCAgICAgICAgICAgICAgICAgIEFEQyBNc3AgSW5pdA0KLSAqIGNhbGxiYWNrIElEDQotICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9BRENfTVNQREVJTklUX0NCX0lEICAgICAgICAgICAgICAgIEFEQyBNc3AgRGVJbml0DQotICogY2FsbGJhY2sgSUQNCi0gKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0FEQ19NU1BJTklUX0NCX0lEIE1zcEluaXQgY2FsbGJhY2sgSUQNCi0gKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0FEQ19NU1BERUlOSVRfQ0JfSUQgTXNwRGVJbml0IGNhbGxiYWNrIElEDQotICogQHBhcmFtICBwQ2FsbGJhY2sgcG9pbnRlciB0byB0aGUgQ2FsbGJhY2sgZnVuY3Rpb24NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDX1JlZ2lzdGVyQ2FsbGJhY2soQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFEQ19DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKSB7DQotICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7DQotDQotICBpZiAocENhbGxiYWNrID09IE5VTEwpIHsNCi0gICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovDQotICAgIGhhZGMtPkVycm9yQ29kZSB8PSBIQUxfQURDX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7DQotDQotICAgIHJldHVybiBIQUxfRVJST1I7DQotICB9DQotDQotICBpZiAoKGhhZGMtPlN0YXRlICYgSEFMX0FEQ19TVEFURV9SRUFEWSkgIT0gMFVMKSB7DQotICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkgew0KLSAgICAgIGNhc2UgSEFMX0FEQ19DT05WRVJTSU9OX0NPTVBMRVRFX0NCX0lEOg0KLSAgICAgICAgaGFkYy0+Q29udkNwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgSEFMX0FEQ19DT05WRVJTSU9OX0hBTEZfQ0JfSUQ6DQotICAgICAgICBoYWRjLT5Db252SGFsZkNwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgSEFMX0FEQ19MRVZFTF9PVVRfT0ZfV0lORE9XXzFfQ0JfSUQ6DQotICAgICAgICBoYWRjLT5MZXZlbE91dE9mV2luZG93Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9BRENfRVJST1JfQ0JfSUQ6DQotICAgICAgICBoYWRjLT5FcnJvckNhbGxiYWNrID0gcENhbGxiYWNrOw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfQURDX0lOSl9DT05WRVJTSU9OX0NPTVBMRVRFX0NCX0lEOg0KLSAgICAgICAgaGFkYy0+SW5qZWN0ZWRDb252Q3BsdENhbGxiYWNrID0gcENhbGxiYWNrOw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfQURDX0lOSl9RVUVVRV9PVkVGTE9XX0NCX0lEOg0KLSAgICAgICAgaGFkYy0+SW5qZWN0ZWRRdWV1ZU92ZXJmbG93Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9BRENfTEVWRUxfT1VUX09GX1dJTkRPV18yX0NCX0lEOg0KLSAgICAgICAgaGFkYy0+TGV2ZWxPdXRPZldpbmRvdzJDYWxsYmFjayA9IHBDYWxsYmFjazsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgSEFMX0FEQ19MRVZFTF9PVVRfT0ZfV0lORE9XXzNfQ0JfSUQ6DQotICAgICAgICBoYWRjLT5MZXZlbE91dE9mV2luZG93M0NhbGxiYWNrID0gcENhbGxiYWNrOw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfQURDX0VORF9PRl9TQU1QTElOR19DQl9JRDoNCi0gICAgICAgIGhhZGMtPkVuZE9mU2FtcGxpbmdDYWxsYmFjayA9IHBDYWxsYmFjazsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgSEFMX0FEQ19NU1BJTklUX0NCX0lEOg0KLSAgICAgICAgaGFkYy0+TXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfQURDX01TUERFSU5JVF9DQl9JRDoNCi0gICAgICAgIGhhZGMtPk1zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgZGVmYXVsdDoNCi0gICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLw0KLSAgICAgICAgaGFkYy0+RXJyb3JDb2RlIHw9IEhBTF9BRENfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsNCi0NCi0gICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8NCi0gICAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsNCi0gICAgICAgIGJyZWFrOw0KLSAgICB9DQotICB9IGVsc2UgaWYgKEhBTF9BRENfU1RBVEVfUkVTRVQgPT0gaGFkYy0+U3RhdGUpIHsNCi0gICAgc3dpdGNoIChDYWxsYmFja0lEKSB7DQotICAgICAgY2FzZSBIQUxfQURDX01TUElOSVRfQ0JfSUQ6DQotICAgICAgICBoYWRjLT5Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9BRENfTVNQREVJTklUX0NCX0lEOg0KLSAgICAgICAgaGFkYy0+TXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBkZWZhdWx0Og0KLSAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovDQotICAgICAgICBoYWRjLT5FcnJvckNvZGUgfD0gSEFMX0FEQ19FUlJPUl9JTlZBTElEX0NBTExCQUNLOw0KLQ0KLSAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLw0KLSAgICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOw0KLSAgICAgICAgYnJlYWs7DQotICAgIH0NCi0gIH0gZWxzZSB7DQotICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLw0KLSAgICBoYWRjLT5FcnJvckNvZGUgfD0gSEFMX0FEQ19FUlJPUl9JTlZBTElEX0NBTExCQUNLOw0KLQ0KLSAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovDQotICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsNCi0gIH0NCi0NCi0gIHJldHVybiBzdGF0dXM7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgVW5yZWdpc3RlciBhIEFEQyBDYWxsYmFjaw0KLSAqICAgICAgICAgQURDIGNhbGxiYWNrIGlzIHJlZGlyZWN0ZWQgdG8gdGhlIHdlYWsgcHJlZGVmaW5lZCBjYWxsYmFjaw0KLSAqIEBwYXJhbSAgaGFkYyBQb2ludGVyIHRvIGEgQURDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCi0gKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBBREMuDQotICogQHBhcmFtICBDYWxsYmFja0lEIElEIG9mIHRoZSBjYWxsYmFjayB0byBiZSB1bnJlZ2lzdGVyZWQNCi0gKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9BRENfQ09OVkVSU0lPTl9DT01QTEVURV9DQl9JRCAgICAgIEFEQyBjb252ZXJzaW9uDQotICogY29tcGxldGUgY2FsbGJhY2sgSUQNCi0gKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0FEQ19DT05WRVJTSU9OX0hBTEZfQ0JfSUQgICAgICAgICAgQURDIGNvbnZlcnNpb24gRE1BDQotICogaGFsZi10cmFuc2ZlciBjYWxsYmFjayBJRA0KLSAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQURDX0xFVkVMX09VVF9PRl9XSU5ET1dfMV9DQl9JRCAgICBBREMgYW5hbG9nIHdhdGNoZG9nDQotICogMSBjYWxsYmFjayBJRA0KLSAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQURDX0VSUk9SX0NCX0lEICAgICAgICAgICAgICAgICAgICBBREMgZXJyb3IgY2FsbGJhY2sNCi0gKiBJRA0KLSAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQURDX0lOSl9DT05WRVJTSU9OX0NPTVBMRVRFX0NCX0lEICBBREMgZ3JvdXAgaW5qZWN0ZWQNCi0gKiBjb252ZXJzaW9uIGNvbXBsZXRlIGNhbGxiYWNrIElEDQotICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9BRENfSU5KX1FVRVVFX09WRUZMT1dfQ0JfSUQgICAgICAgIEFEQyBncm91cCBpbmplY3RlZA0KLSAqIGNvbnRleHQgcXVldWUgb3ZlcmZsb3cgY2FsbGJhY2sgSUQNCi0gKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0FEQ19MRVZFTF9PVVRfT0ZfV0lORE9XXzJfQ0JfSUQgICAgQURDIGFuYWxvZyB3YXRjaGRvZw0KLSAqIDIgY2FsbGJhY2sgSUQNCi0gKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0FEQ19MRVZFTF9PVVRfT0ZfV0lORE9XXzNfQ0JfSUQgICAgQURDIGFuYWxvZyB3YXRjaGRvZw0KLSAqIDMgY2FsbGJhY2sgSUQNCi0gKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0FEQ19FTkRfT0ZfU0FNUExJTkdfQ0JfSUQgICAgICAgICAgQURDIGVuZCBvZiBzYW1wbGluZw0KLSAqIGNhbGxiYWNrIElEDQotICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9BRENfTVNQSU5JVF9DQl9JRCAgICAgICAgICAgICAgICAgIEFEQyBNc3AgSW5pdA0KLSAqIGNhbGxiYWNrIElEDQotICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9BRENfTVNQREVJTklUX0NCX0lEICAgICAgICAgICAgICAgIEFEQyBNc3AgRGVJbml0DQotICogY2FsbGJhY2sgSUQNCi0gKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0FEQ19NU1BJTklUX0NCX0lEIE1zcEluaXQgY2FsbGJhY2sgSUQNCi0gKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0FEQ19NU1BERUlOSVRfQ0JfSUQgTXNwRGVJbml0IGNhbGxiYWNrIElEDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ19VblJlZ2lzdGVyQ2FsbGJhY2soDQotICAgIEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjLCBIQUxfQURDX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpIHsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsNCi0NCi0gIGlmICgoaGFkYy0+U3RhdGUgJiBIQUxfQURDX1NUQVRFX1JFQURZKSAhPSAwVUwpIHsNCi0gICAgc3dpdGNoIChDYWxsYmFja0lEKSB7DQotICAgICAgY2FzZSBIQUxfQURDX0NPTlZFUlNJT05fQ09NUExFVEVfQ0JfSUQ6DQotICAgICAgICBoYWRjLT5Db252Q3BsdENhbGxiYWNrID0gSEFMX0FEQ19Db252Q3BsdENhbGxiYWNrOw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfQURDX0NPTlZFUlNJT05fSEFMRl9DQl9JRDoNCi0gICAgICAgIGhhZGMtPkNvbnZIYWxmQ3BsdENhbGxiYWNrID0gSEFMX0FEQ19Db252SGFsZkNwbHRDYWxsYmFjazsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgSEFMX0FEQ19MRVZFTF9PVVRfT0ZfV0lORE9XXzFfQ0JfSUQ6DQotICAgICAgICBoYWRjLT5MZXZlbE91dE9mV2luZG93Q2FsbGJhY2sgPSBIQUxfQURDX0xldmVsT3V0T2ZXaW5kb3dDYWxsYmFjazsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgSEFMX0FEQ19FUlJPUl9DQl9JRDoNCi0gICAgICAgIGhhZGMtPkVycm9yQ2FsbGJhY2sgPSBIQUxfQURDX0Vycm9yQ2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9BRENfSU5KX0NPTlZFUlNJT05fQ09NUExFVEVfQ0JfSUQ6DQotICAgICAgICBoYWRjLT5JbmplY3RlZENvbnZDcGx0Q2FsbGJhY2sgPSBIQUxfQURDRXhfSW5qZWN0ZWRDb252Q3BsdENhbGxiYWNrOw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfQURDX0lOSl9RVUVVRV9PVkVGTE9XX0NCX0lEOg0KLSAgICAgICAgaGFkYy0+SW5qZWN0ZWRRdWV1ZU92ZXJmbG93Q2FsbGJhY2sgPQ0KLSAgICAgICAgICAgIEhBTF9BRENFeF9JbmplY3RlZFF1ZXVlT3ZlcmZsb3dDYWxsYmFjazsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgSEFMX0FEQ19MRVZFTF9PVVRfT0ZfV0lORE9XXzJfQ0JfSUQ6DQotICAgICAgICBoYWRjLT5MZXZlbE91dE9mV2luZG93MkNhbGxiYWNrID0gSEFMX0FEQ0V4X0xldmVsT3V0T2ZXaW5kb3cyQ2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9BRENfTEVWRUxfT1VUX09GX1dJTkRPV18zX0NCX0lEOg0KLSAgICAgICAgaGFkYy0+TGV2ZWxPdXRPZldpbmRvdzNDYWxsYmFjayA9IEhBTF9BRENFeF9MZXZlbE91dE9mV2luZG93M0NhbGxiYWNrOw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfQURDX0VORF9PRl9TQU1QTElOR19DQl9JRDoNCi0gICAgICAgIGhhZGMtPkVuZE9mU2FtcGxpbmdDYWxsYmFjayA9IEhBTF9BRENFeF9FbmRPZlNhbXBsaW5nQ2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9BRENfTVNQSU5JVF9DQl9JRDoNCi0gICAgICAgIGhhZGMtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9BRENfTXNwSW5pdDsgLyogTGVnYWN5IHdlYWsgTXNwSW5pdCAqLw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfQURDX01TUERFSU5JVF9DQl9JRDoNCi0gICAgICAgIGhhZGMtPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX0FEQ19Nc3BEZUluaXQ7IC8qIExlZ2FjeSB3ZWFrIE1zcERlSW5pdCAqLw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgZGVmYXVsdDoNCi0gICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLw0KLSAgICAgICAgaGFkYy0+RXJyb3JDb2RlIHw9IEhBTF9BRENfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsNCi0NCi0gICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8NCi0gICAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsNCi0gICAgICAgIGJyZWFrOw0KLSAgICB9DQotICB9IGVsc2UgaWYgKEhBTF9BRENfU1RBVEVfUkVTRVQgPT0gaGFkYy0+U3RhdGUpIHsNCi0gICAgc3dpdGNoIChDYWxsYmFja0lEKSB7DQotICAgICAgY2FzZSBIQUxfQURDX01TUElOSVRfQ0JfSUQ6DQotICAgICAgICBoYWRjLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfQURDX01zcEluaXQ7IC8qIExlZ2FjeSB3ZWFrIE1zcEluaXQgKi8NCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgSEFMX0FEQ19NU1BERUlOSVRfQ0JfSUQ6DQotICAgICAgICBoYWRjLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9BRENfTXNwRGVJbml0OyAvKiBMZWdhY3kgd2VhayBNc3BEZUluaXQgKi8NCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGRlZmF1bHQ6DQotICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8NCi0gICAgICAgIGhhZGMtPkVycm9yQ29kZSB8PSBIQUxfQURDX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7DQotDQotICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovDQotICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7DQotICAgICAgICBicmVhazsNCi0gICAgfQ0KLSAgfSBlbHNlIHsNCi0gICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovDQotICAgIGhhZGMtPkVycm9yQ29kZSB8PSBIQUxfQURDX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7DQotDQotICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8NCi0gICAgc3RhdHVzID0gSEFMX0VSUk9SOw0KLSAgfQ0KLQ0KLSAgcmV0dXJuIHN0YXR1czsNCi19DQotDQotI2VuZGlmIC8qIFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBBRENfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBBREMgSW5wdXQgYW5kIE91dHB1dCBvcGVyYXRpb24NCi1mdW5jdGlvbnMNCi0gICogQGJyaWVmICAgIEFEQyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zDQotICAqDQotQHZlcmJhdGltDQotID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAjIyMjIw0KLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86DQotICAgICAgKCspIFN0YXJ0IGNvbnZlcnNpb24gb2YgcmVndWxhciBncm91cC4NCi0gICAgICAoKykgU3RvcCBjb252ZXJzaW9uIG9mIHJlZ3VsYXIgZ3JvdXAuDQotICAgICAgKCspIFBvbGwgZm9yIGNvbnZlcnNpb24gY29tcGxldGUgb24gcmVndWxhciBncm91cC4NCi0gICAgICAoKykgUG9sbCBmb3IgY29udmVyc2lvbiBldmVudC4NCi0gICAgICAoKykgR2V0IHJlc3VsdCBvZiByZWd1bGFyIGNoYW5uZWwgY29udmVyc2lvbi4NCi0gICAgICAoKykgU3RhcnQgY29udmVyc2lvbiBvZiByZWd1bGFyIGdyb3VwIGFuZCBlbmFibGUgaW50ZXJydXB0aW9ucy4NCi0gICAgICAoKykgU3RvcCBjb252ZXJzaW9uIG9mIHJlZ3VsYXIgZ3JvdXAgYW5kIGRpc2FibGUgaW50ZXJydXB0aW9ucy4NCi0gICAgICAoKykgSGFuZGxlIEFEQyBpbnRlcnJ1cHQgcmVxdWVzdA0KLSAgICAgICgrKSBTdGFydCBjb252ZXJzaW9uIG9mIHJlZ3VsYXIgZ3JvdXAgYW5kIGVuYWJsZSBETUEgdHJhbnNmZXIuDQotICAgICAgKCspIFN0b3AgY29udmVyc2lvbiBvZiByZWd1bGFyIGdyb3VwIGFuZCBkaXNhYmxlIEFEQyBETUEgdHJhbnNmZXIuDQotQGVuZHZlcmJhdGltDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIEFEQywgc3RhcnQgY29udmVyc2lvbiBvZiByZWd1bGFyIGdyb3VwLg0KLSAqIEBub3RlICAgSW50ZXJydXB0aW9ucyBlbmFibGVkIGluIHRoaXMgZnVuY3Rpb246IE5vbmUuDQotICogQG5vdGUgICBDYXNlIG9mIG11bHRpbW9kZSBlbmFibGVkICh3aGVuIG11bHRpbW9kZSBmZWF0dXJlIGlzIGF2YWlsYWJsZSk6DQotICogICAgICAgICAgIGlmIEFEQyBpcyBTbGF2ZSwgQURDIGlzIGVuYWJsZWQgYnV0IGNvbnZlcnNpb24gaXMgbm90IHN0YXJ0ZWQsDQotICogICAgICAgICAgIGlmIEFEQyBpcyBtYXN0ZXIsIEFEQyBpcyBlbmFibGVkIGFuZCBtdWx0aW1vZGUgY29udmVyc2lvbiBpcw0KLSAqIHN0YXJ0ZWQuDQotICogQHBhcmFtIGhhZGMgQURDIGhhbmRsZQ0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfU3RhcnQoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpIHsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIHRtcF9oYWxfc3RhdHVzOw0KLSNpZiBkZWZpbmVkKEFEQ19NVUxUSU1PREVfU1VQUE9SVCkNCi0gIGNvbnN0IEFEQ19UeXBlRGVmICp0bXBBRENfTWFzdGVyOw0KLSAgdWludDMyX3QgdG1wX211bHRpbW9kZV9jb25maWcgPQ0KLSAgICAgIExMX0FEQ19HZXRNdWx0aW1vZGUoX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7DQotI2VuZGlmDQotDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsNCi0NCi0gIC8qIFBlcmZvcm0gQURDIGVuYWJsZSBhbmQgY29udmVyc2lvbiBzdGFydCBpZiBubyBjb252ZXJzaW9uIGlzIG9uIGdvaW5nICovDQotICBpZiAoTExfQURDX1JFR19Jc0NvbnZlcnNpb25PbmdvaW5nKGhhZGMtPkluc3RhbmNlKSA9PSAwVUwpIHsNCi0gICAgLyogUHJvY2VzcyBsb2NrZWQgKi8NCi0gICAgX19IQUxfTE9DSyhoYWRjKTsNCi0NCi0gICAgLyogRW5hYmxlIHRoZSBBREMgcGVyaXBoZXJhbCAqLw0KLSAgICB0bXBfaGFsX3N0YXR1cyA9IEFEQ19FbmFibGUoaGFkYyk7DQotDQotICAgIC8qIFN0YXJ0IGNvbnZlcnNpb24gaWYgQURDIGlzIGVmZmVjdGl2ZWx5IGVuYWJsZWQgKi8NCi0gICAgaWYgKHRtcF9oYWxfc3RhdHVzID09IEhBTF9PSykgew0KLSAgICAgIC8qIFNldCBBREMgc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgICAgLyogLSBDbGVhciBzdGF0ZSBiaXRmaWVsZCByZWxhdGVkIHRvIHJlZ3VsYXIgZ3JvdXAgY29udmVyc2lvbiByZXN1bHRzICAgKi8NCi0gICAgICAvKiAtIFNldCBzdGF0ZSBiaXRmaWVsZCByZWxhdGVkIHRvIHJlZ3VsYXIgb3BlcmF0aW9uICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICAgIEFEQ19TVEFURV9DTFJfU0VUKGhhZGMtPlN0YXRlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVBRFkgfCBIQUxfQURDX1NUQVRFX1JFR19FT0MgfA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFR19PVlIgfCBIQUxfQURDX1NUQVRFX1JFR19FT1NNUCwNCi0gICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFR19CVVNZKTsNCi0NCi0jaWYgZGVmaW5lZChBRENfTVVMVElNT0RFX1NVUFBPUlQpDQotICAgICAgLyogUmVzZXQgSEFMX0FEQ19TVEFURV9NVUxUSU1PREVfU0xBVkUgYml0DQotICAgICAgICAtIGlmIEFEQyBpbnN0YW5jZSBpcyBtYXN0ZXIgb3IgaWYgbXVsdGltb2RlIGZlYXR1cmUgaXMgbm90IGF2YWlsYWJsZQ0KLSAgICAgICAgLSBpZiBtdWx0aW1vZGUgc2V0dGluZyBpcyBkaXNhYmxlZCAoQURDIGluc3RhbmNlIHNsYXZlIGluIGluZGVwZW5kZW50DQotICAgICAgICBtb2RlKSAqLw0KLSAgICAgIGlmICgoX19MTF9BRENfTVVMVElfSU5TVEFOQ0VfTUFTVEVSKGhhZGMtPkluc3RhbmNlKSA9PSBoYWRjLT5JbnN0YW5jZSkgfHwNCi0gICAgICAgICAgKHRtcF9tdWx0aW1vZGVfY29uZmlnID09IExMX0FEQ19NVUxUSV9JTkRFUEVOREVOVCkpIHsNCi0gICAgICAgIENMRUFSX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9NVUxUSU1PREVfU0xBVkUpOw0KLSAgICAgIH0NCi0jZW5kaWYNCi0NCi0gICAgICAvKiBTZXQgQURDIGVycm9yIGNvZGUgKi8NCi0gICAgICAvKiBDaGVjayBpZiBhIGNvbnZlcnNpb24gaXMgb24gZ29pbmcgb24gQURDIGdyb3VwIGluamVjdGVkICovDQotICAgICAgaWYgKEhBTF9JU19CSVRfU0VUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0lOSl9CVVNZKSkgew0KLSAgICAgICAgLyogUmVzZXQgQURDIGVycm9yIGNvZGUgZmllbGRzIHJlbGF0ZWQgdG8gcmVndWxhciBjb252ZXJzaW9ucyBvbmx5ICovDQotICAgICAgICBDTEVBUl9CSVQoaGFkYy0+RXJyb3JDb2RlLCAoSEFMX0FEQ19FUlJPUl9PVlIgfCBIQUxfQURDX0VSUk9SX0RNQSkpOw0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICAvKiBSZXNldCBhbGwgQURDIGVycm9yIGNvZGUgZmllbGRzICovDQotICAgICAgICBBRENfQ0xFQVJfRVJST1JDT0RFKGhhZGMpOw0KLSAgICAgIH0NCi0NCi0gICAgICAvKiBDbGVhciBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIGZsYWcgYW5kIG92ZXJydW4gZmxhZyAqLw0KLSAgICAgIC8qIChUbyBlbnN1cmUgb2Ygbm8gdW5rbm93biBzdGF0ZSBmcm9tIHBvdGVudGlhbCBwcmV2aW91cyBBREMgb3BlcmF0aW9ucykNCi0gICAgICAgKi8NCi0gICAgICBfX0hBTF9BRENfQ0xFQVJfRkxBRyhoYWRjLCAoQURDX0ZMQUdfRU9DIHwgQURDX0ZMQUdfRU9TIHwgQURDX0ZMQUdfT1ZSKSk7DQotDQotICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLw0KLSAgICAgIC8qIFVubG9jayBiZWZvcmUgc3RhcnRpbmcgQURDIGNvbnZlcnNpb25zOiBpbiBjYXNlIG9mIHBvdGVudGlhbCAgICAgICAgICovDQotICAgICAgLyogaW50ZXJydXB0aW9uLCB0byBsZXQgdGhlIHByb2Nlc3MgdG8gQURDIElSUSBIYW5kbGVyLiAgICAgICAgICAgICAgICAgKi8NCi0gICAgICBfX0hBTF9VTkxPQ0soaGFkYyk7DQotDQotICAgICAgLyogRW5hYmxlIGNvbnZlcnNpb24gb2YgcmVndWxhciBncm91cC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgICAvKiBJZiBzb2Z0d2FyZSBzdGFydCBoYXMgYmVlbiBzZWxlY3RlZCwgY29udmVyc2lvbiBzdGFydHMgaW1tZWRpYXRlbHkuICAqLw0KLSAgICAgIC8qIElmIGV4dGVybmFsIHRyaWdnZXIgaGFzIGJlZW4gc2VsZWN0ZWQsIGNvbnZlcnNpb24gd2lsbCBzdGFydCBhdCBuZXh0ICovDQotICAgICAgLyogdHJpZ2dlciBldmVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgICAvKiBDYXNlIG9mIG11bHRpbW9kZSBlbmFibGVkICh3aGVuIG11bHRpbW9kZSBmZWF0dXJlIGlzIGF2YWlsYWJsZSk6ICAgICAqLw0KLSAgICAgIC8qICAtIGlmIEFEQyBpcyBzbGF2ZSBhbmQgZHVhbCByZWd1bGFyIGNvbnZlcnNpb25zIGFyZSBlbmFibGVkLCBBREMgaXMgICovDQotICAgICAgLyogICAgZW5hYmxlZCBvbmx5IChjb252ZXJzaW9uIGlzIG5vdCBzdGFydGVkKSwgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgICAvKiAgLSBpZiBBREMgaXMgbWFzdGVyLCBBREMgaXMgZW5hYmxlZCBhbmQgY29udmVyc2lvbiBpcyBzdGFydGVkLiAgICAgICAqLw0KLSNpZiBkZWZpbmVkKEFEQ19NVUxUSU1PREVfU1VQUE9SVCkNCi0gICAgICBpZiAoKF9fTExfQURDX01VTFRJX0lOU1RBTkNFX01BU1RFUihoYWRjLT5JbnN0YW5jZSkgPT0gaGFkYy0+SW5zdGFuY2UpIHx8DQotICAgICAgICAgICh0bXBfbXVsdGltb2RlX2NvbmZpZyA9PSBMTF9BRENfTVVMVElfSU5ERVBFTkRFTlQpIHx8DQotICAgICAgICAgICh0bXBfbXVsdGltb2RlX2NvbmZpZyA9PSBMTF9BRENfTVVMVElfRFVBTF9JTkpfU0lNVUxUKSB8fA0KLSAgICAgICAgICAodG1wX211bHRpbW9kZV9jb25maWcgPT0gTExfQURDX01VTFRJX0RVQUxfSU5KX0FMVEVSTikpIHsNCi0gICAgICAgIC8qIEFEQyBpbnN0YW5jZSBpcyBub3QgYSBtdWx0aW1vZGUgc2xhdmUgaW5zdGFuY2Ugd2l0aCBtdWx0aW1vZGUgcmVndWxhcg0KLSAgICAgICAgICogY29udmVyc2lvbnMgZW5hYmxlZCAqLw0KLSAgICAgICAgaWYgKFJFQURfQklUKGhhZGMtPkluc3RhbmNlLT5DRkdSLCBBRENfQ0ZHUl9KQVVUTykgIT0gMFVMKSB7DQotICAgICAgICAgIEFEQ19TVEFURV9DTFJfU0VUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0lOSl9FT0MsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfSU5KX0JVU1kpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyogU3RhcnQgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiAqLw0KLSAgICAgICAgTExfQURDX1JFR19TdGFydENvbnZlcnNpb24oaGFkYy0+SW5zdGFuY2UpOw0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICAvKiBBREMgaW5zdGFuY2UgaXMgYSBtdWx0aW1vZGUgc2xhdmUgaW5zdGFuY2Ugd2l0aCBtdWx0aW1vZGUgcmVndWxhcg0KLSAgICAgICAgICogY29udmVyc2lvbnMgZW5hYmxlZCAqLw0KLSAgICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9NVUxUSU1PREVfU0xBVkUpOw0KLSAgICAgICAgLyogaWYgTWFzdGVyIEFEQyBKQVVUTyBiaXQgaXMgc2V0LCB1cGRhdGUgU2xhdmUgU3RhdGUgaW4gc2V0dGluZw0KLSAgICAgICAgICAgSEFMX0FEQ19TVEFURV9JTkpfQlVTWSBiaXQgYW5kIGluIHJlc2V0dGluZyBIQUxfQURDX1NUQVRFX0lOSl9FT0MgYml0DQotICAgICAgICAgKi8NCi0gICAgICAgIHRtcEFEQ19NYXN0ZXIgPSBfX0xMX0FEQ19NVUxUSV9JTlNUQU5DRV9NQVNURVIoaGFkYy0+SW5zdGFuY2UpOw0KLSAgICAgICAgaWYgKFJFQURfQklUKHRtcEFEQ19NYXN0ZXItPkNGR1IsIEFEQ19DRkdSX0pBVVRPKSAhPSAwVUwpIHsNCi0gICAgICAgICAgQURDX1NUQVRFX0NMUl9TRVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfSU5KX0VPQywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9JTkpfQlVTWSk7DQotICAgICAgICB9DQotICAgICAgfQ0KLSNlbHNlDQotICAgICAgaWYgKFJFQURfQklUKGhhZGMtPkluc3RhbmNlLT5DRkdSLCBBRENfQ0ZHUl9KQVVUTykgIT0gMFVMKSB7DQotICAgICAgICBBRENfU1RBVEVfQ0xSX1NFVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9JTkpfRU9DLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9JTkpfQlVTWSk7DQotICAgICAgfQ0KLQ0KLSAgICAgIC8qIFN0YXJ0IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gKi8NCi0gICAgICBMTF9BRENfUkVHX1N0YXJ0Q29udmVyc2lvbihoYWRjLT5JbnN0YW5jZSk7DQotI2VuZGlmDQotICAgIH0gZWxzZSB7DQotICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLw0KLSAgICAgIF9fSEFMX1VOTE9DSyhoYWRjKTsNCi0gICAgfQ0KLSAgfSBlbHNlIHsNCi0gICAgdG1wX2hhbF9zdGF0dXMgPSBIQUxfQlVTWTsNCi0gIH0NCi0NCi0gIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8NCi0gIHJldHVybiB0bXBfaGFsX3N0YXR1czsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTdG9wIEFEQyBjb252ZXJzaW9uIG9mIHJlZ3VsYXIgZ3JvdXAgKGFuZCBpbmplY3RlZCBjaGFubmVscyBpbg0KLSAqICAgICAgICAgY2FzZSBvZiBhdXRvX2luamVjdGlvbiBtb2RlKSwgZGlzYWJsZSBBREMgcGVyaXBoZXJhbC4NCi0gKiBAbm90ZTogIEFEQyBwZXJpcGhlcmFsIGRpc2FibGUgaXMgZm9yY2luZyBzdG9wIG9mIHBvdGVudGlhbA0KLSAqICAgICAgICAgY29udmVyc2lvbiBvbiBpbmplY3RlZCBncm91cC4gSWYgaW5qZWN0ZWQgZ3JvdXAgaXMgdW5kZXIgdXNlLCBpdA0KLSAqICAgICAgICAgc2hvdWxkIGJlIHByZWxpbWluYXJpbHkgc3RvcHBlZCB1c2luZyBIQUxfQURDRXhfSW5qZWN0ZWRTdG9wDQotICogZnVuY3Rpb24uDQotICogQHBhcmFtIGhhZGMgQURDIGhhbmRsZQ0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cy4NCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDX1N0b3AoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpIHsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIHRtcF9oYWxfc3RhdHVzOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7DQotDQotICAvKiBQcm9jZXNzIGxvY2tlZCAqLw0KLSAgX19IQUxfTE9DSyhoYWRjKTsNCi0NCi0gIC8qIDEuIFN0b3AgcG90ZW50aWFsIGNvbnZlcnNpb24gb24gZ29pbmcsIG9uIEFEQyBncm91cHMgcmVndWxhciBhbmQgaW5qZWN0ZWQNCi0gICAqLw0KLSAgdG1wX2hhbF9zdGF0dXMgPSBBRENfQ29udmVyc2lvblN0b3AoaGFkYywgQURDX1JFR1VMQVJfSU5KRUNURURfR1JPVVApOw0KLQ0KLSAgLyogRGlzYWJsZSBBREMgcGVyaXBoZXJhbCBpZiBjb252ZXJzaW9ucyBhcmUgZWZmZWN0aXZlbHkgc3RvcHBlZCAqLw0KLSAgaWYgKHRtcF9oYWxfc3RhdHVzID09IEhBTF9PSykgew0KLSAgICAvKiAyLiBEaXNhYmxlIHRoZSBBREMgcGVyaXBoZXJhbCAqLw0KLSAgICB0bXBfaGFsX3N0YXR1cyA9IEFEQ19EaXNhYmxlKGhhZGMpOw0KLQ0KLSAgICAvKiBDaGVjayBpZiBBREMgaXMgZWZmZWN0aXZlbHkgZGlzYWJsZWQgKi8NCi0gICAgaWYgKHRtcF9oYWxfc3RhdHVzID09IEhBTF9PSykgew0KLSAgICAgIC8qIFNldCBBREMgc3RhdGUgKi8NCi0gICAgICBBRENfU1RBVEVfQ0xSX1NFVChoYWRjLT5TdGF0ZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFR19CVVNZIHwgSEFMX0FEQ19TVEFURV9JTkpfQlVTWSwNCi0gICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFQURZKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLw0KLSAgX19IQUxfVU5MT0NLKGhhZGMpOw0KLQ0KLSAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLw0KLSAgcmV0dXJuIHRtcF9oYWxfc3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFdhaXQgZm9yIHJlZ3VsYXIgZ3JvdXAgY29udmVyc2lvbiB0byBiZSBjb21wbGV0ZWQuDQotICogQG5vdGUgICBBREMgY29udmVyc2lvbiBmbGFncyBFT1MgKGVuZCBvZiBzZXF1ZW5jZSkgYW5kIEVPQyAoZW5kIG9mDQotICogICAgICAgICBjb252ZXJzaW9uKSBhcmUgY2xlYXJlZCBieSB0aGlzIGZ1bmN0aW9uLCB3aXRoIGFuIGV4Y2VwdGlvbjoNCi0gKiAgICAgICAgIGlmIGxvdyBwb3dlciBmZWF0dXJlICJMb3dQb3dlckF1dG9XYWl0IiBpcyBlbmFibGVkLCBmbGFncyBhcmUNCi0gKiAgICAgICAgIG5vdCBjbGVhcmVkIHRvIG5vdCBpbnRlcmZlcmUgd2l0aCB0aGlzIGZlYXR1cmUgdW50aWwgZGF0YSByZWdpc3Rlcg0KLSAqICAgICAgICAgaXMgcmVhZCB1c2luZyBmdW5jdGlvbiBIQUxfQURDX0dldFZhbHVlKCkuDQotICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSB1c2VkIGluIGEgcGFydGljdWxhciBzZXR1cDogQURDIGNvbmZpZ3VyZWQNCi0gKiAgICAgICAgIGluIERNQSBtb2RlIGFuZCBwb2xsaW5nIGZvciBlbmQgb2YgZWFjaCBjb252ZXJzaW9uIChBREMgaW5pdA0KLSAqICAgICAgICAgcGFyYW1ldGVyICJFT0NTZWxlY3Rpb24iIHNldCB0byBBRENfRU9DX1NJTkdMRV9DT05WKS4NCi0gKiAgICAgICAgIEluIHRoaXMgY2FzZSwgRE1BIHJlc2V0cyB0aGUgZmxhZyBFT0MgYW5kIHBvbGxpbmcgY2Fubm90IGJlDQotICogICAgICAgICBwZXJmb3JtZWQgb24gZWFjaCBjb252ZXJzaW9uLiBOZXZlcnRoZWxlc3MsIHBvbGxpbmcgY2FuIHN0aWxsDQotICogICAgICAgICBiZSBwZXJmb3JtZWQgb24gdGhlIGNvbXBsZXRlIHNlcXVlbmNlIChBREMgaW5pdA0KLSAqICAgICAgICAgcGFyYW1ldGVyICJFT0NTZWxlY3Rpb24iIHNldCB0byBBRENfRU9DX1NFUV9DT05WKS4NCi0gKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlDQotICogQHBhcmFtIFRpbWVvdXQgVGltZW91dCB2YWx1ZSBpbiBtaWxsaXNlY29uZC4NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDX1BvbGxGb3JDb252ZXJzaW9uKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZW91dCkgew0KLSAgdWludDMyX3QgdGlja3N0YXJ0Ow0KLSAgdWludDMyX3QgdG1wX0ZsYWdfRW5kOw0KLSAgdWludDMyX3QgdG1wX2NmZ3I7DQotI2lmIGRlZmluZWQoQURDX01VTFRJTU9ERV9TVVBQT1JUKQ0KLSAgY29uc3QgQURDX1R5cGVEZWYgKnRtcEFEQ19NYXN0ZXI7DQotICB1aW50MzJfdCB0bXBfbXVsdGltb2RlX2NvbmZpZyA9DQotICAgICAgTExfQURDX0dldE11bHRpbW9kZShfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsNCi0jZW5kaWYNCi0NCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOw0KLQ0KLSAgLyogSWYgZW5kIG9mIGNvbnZlcnNpb24gc2VsZWN0ZWQgdG8gZW5kIG9mIHNlcXVlbmNlIGNvbnZlcnNpb25zICovDQotICBpZiAoaGFkYy0+SW5pdC5FT0NTZWxlY3Rpb24gPT0gQURDX0VPQ19TRVFfQ09OVikgew0KLSAgICB0bXBfRmxhZ19FbmQgPSBBRENfRkxBR19FT1M7DQotICB9DQotICAvKiBJZiBlbmQgb2YgY29udmVyc2lvbiBzZWxlY3RlZCB0byBlbmQgb2YgdW5pdGFyeSBjb252ZXJzaW9uICovDQotICBlbHNlIC8qIEFEQ19FT0NfU0lOR0xFX0NPTlYgKi8NCi0gIHsNCi0gICAgLyogVmVyaWZpY2F0aW9uIHRoYXQgQURDIGNvbmZpZ3VyYXRpb24gaXMgY29tcGxpYW50IHdpdGggcG9sbGluZyBmb3IgICAgICAqLw0KLSAgICAvKiBlYWNoIGNvbnZlcnNpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIC8qIFBhcnRpY3VsYXIgY2FzZSBpcyBBREMgY29uZmlndXJlZCBpbiBETUEgbW9kZSBhbmQgQURDIHNlcXVlbmNlciB3aXRoICAgKi8NCi0gICAgLyogc2V2ZXJhbCByYW5rcyBhbmQgcG9sbGluZyBmb3IgZW5kIG9mIGVhY2ggY29udmVyc2lvbi4gICAgICAgICAgICAgICAgICAqLw0KLSAgICAvKiBGb3IgY29kZSBzaW1wbGljaXR5IHNha2UsIHRoaXMgcGFydGljdWxhciBjYXNlIGlzIGdlbmVyYWxpemVkIHRvICAgICAgICovDQotICAgIC8qIEFEQyBjb25maWd1cmVkIGluIERNQSBtb2RlIGFuZCBhbmQgcG9sbGluZyBmb3IgZW5kIG9mIGVhY2ggY29udmVyc2lvbi4gKi8NCi0jaWYgZGVmaW5lZChBRENfTVVMVElNT0RFX1NVUFBPUlQpDQotICAgIGlmICgodG1wX211bHRpbW9kZV9jb25maWcgPT0gTExfQURDX01VTFRJX0lOREVQRU5ERU5UKSB8fA0KLSAgICAgICAgKHRtcF9tdWx0aW1vZGVfY29uZmlnID09IExMX0FEQ19NVUxUSV9EVUFMX0lOSl9TSU1VTFQpIHx8DQotICAgICAgICAodG1wX211bHRpbW9kZV9jb25maWcgPT0gTExfQURDX01VTFRJX0RVQUxfSU5KX0FMVEVSTikpIHsNCi0gICAgICAvKiBDaGVjayBBREMgRE1BIG1vZGUgaW4gaW5kZXBlbmRlbnQgbW9kZSBvbiBBREMgZ3JvdXAgcmVndWxhciAqLw0KLSAgICAgIGlmIChSRUFEX0JJVChoYWRjLT5JbnN0YW5jZS0+Q0ZHUiwgQURDX0NGR1JfRE1BRU4pICE9IDBVTCkgew0KLSAgICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9DT05GSUcpOw0KLSAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgdG1wX0ZsYWdfRW5kID0gKEFEQ19GTEFHX0VPQyk7DQotICAgICAgfQ0KLSAgICB9IGVsc2Ugew0KLSAgICAgIC8qIENoZWNrIEFEQyBETUEgbW9kZSBpbiBtdWx0aW1vZGUgb24gQURDIGdyb3VwIHJlZ3VsYXIgKi8NCi0gICAgICBpZiAoTExfQURDX0dldE11bHRpRE1BVHJhbnNmZXIoX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKA0KLSAgICAgICAgICAgICAgaGFkYy0+SW5zdGFuY2UpKSAhPSBMTF9BRENfTVVMVElfUkVHX0RNQV9FQUNIX0FEQykgew0KLSAgICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9DT05GSUcpOw0KLSAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgdG1wX0ZsYWdfRW5kID0gKEFEQ19GTEFHX0VPQyk7DQotICAgICAgfQ0KLSAgICB9DQotI2Vsc2UNCi0gICAgLyogQ2hlY2sgQURDIERNQSBtb2RlICovDQotICAgIGlmIChSRUFEX0JJVChoYWRjLT5JbnN0YW5jZS0+Q0ZHUiwgQURDX0NGR1JfRE1BRU4pICE9IDBVTCkgew0KLSAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfRVJST1JfQ09ORklHKTsNCi0gICAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgIHRtcF9GbGFnX0VuZCA9IChBRENfRkxBR19FT0MpOw0KLSAgICB9DQotI2VuZGlmDQotICB9DQotDQotICAvKiBHZXQgdGljayBjb3VudCAqLw0KLSAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsNCi0NCi0gIC8qIFdhaXQgdW50aWwgRW5kIG9mIHVuaXRhcnkgY29udmVyc2lvbiBvciBzZXF1ZW5jZSBjb252ZXJzaW9ucyBmbGFnIGlzIHJhaXNlZA0KLSAgICovDQotICB3aGlsZSAoKGhhZGMtPkluc3RhbmNlLT5JU1IgJiB0bXBfRmxhZ19FbmQpID09IDBVTCkgew0KLSAgICAvKiBDaGVjayBpZiB0aW1lb3V0IGlzIGRpc2FibGVkIChzZXQgdG8gaW5maW5pdGUgd2FpdCkgKi8NCi0gICAgaWYgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkgew0KLSAgICAgIGlmICgoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gVGltZW91dCkgfHwgKFRpbWVvdXQgPT0gMFVMKSkgew0KLSAgICAgICAgLyogTmV3IGNoZWNrIHRvIGF2b2lkIGZhbHNlIHRpbWVvdXQgZGV0ZWN0aW9uIGluIGNhc2Ugb2YgcHJlZW1wdGlvbiAqLw0KLSAgICAgICAgaWYgKChoYWRjLT5JbnN0YW5jZS0+SVNSICYgdG1wX0ZsYWdfRW5kKSA9PSAwVUwpIHsNCi0gICAgICAgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lIHRvIHRpbWVvdXQgKi8NCi0gICAgICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9USU1FT1VUKTsNCi0NCi0gICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLw0KLSAgICAgICAgICBfX0hBTF9VTkxPQ0soaGFkYyk7DQotDQotICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsNCi0gICAgICAgIH0NCi0gICAgICB9DQotICAgIH0NCi0gIH0NCi0NCi0gIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSAqLw0KLSAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9SRUdfRU9DKTsNCi0NCi0gIC8qIERldGVybWluZSB3aGV0aGVyIGFueSBmdXJ0aGVyIGNvbnZlcnNpb24gdXBjb21pbmcgb24gZ3JvdXAgcmVndWxhciAgICAgICAqLw0KLSAgLyogYnkgZXh0ZXJuYWwgdHJpZ2dlciwgY29udGludW91cyBtb2RlIG9yIHNjYW4gc2VxdWVuY2Ugb24gZ29pbmcuICAgICAgICAgICovDQotICBpZiAoKExMX0FEQ19SRUdfSXNUcmlnZ2VyU291cmNlU1dTdGFydChoYWRjLT5JbnN0YW5jZSkgIT0gMFVMKSAmJg0KLSAgICAgIChoYWRjLT5Jbml0LkNvbnRpbnVvdXNDb252TW9kZSA9PSBESVNBQkxFKSkgew0KLSAgICAvKiBDaGVjayB3aGV0aGVyIGVuZCBvZiBzZXF1ZW5jZSBpcyByZWFjaGVkICovDQotICAgIGlmIChfX0hBTF9BRENfR0VUX0ZMQUcoaGFkYywgQURDX0ZMQUdfRU9TKSkgew0KLSAgICAgIC8qIFNldCBBREMgc3RhdGUgKi8NCi0gICAgICBDTEVBUl9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfUkVHX0JVU1kpOw0KLQ0KLSAgICAgIGlmICgoaGFkYy0+U3RhdGUgJiBIQUxfQURDX1NUQVRFX0lOSl9CVVNZKSA9PSAwVUwpIHsNCi0gICAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfUkVBRFkpOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgLyogR2V0IHJlbGV2YW50IHJlZ2lzdGVyIENGR1IgaW4gQURDIGluc3RhbmNlIG9mIEFEQyBtYXN0ZXIgb3Igc2xhdmUgICAgICAgICovDQotICAvKiBpbiBmdW5jdGlvbiBvZiBtdWx0aW1vZGUgc3RhdGUgKGZvciBkZXZpY2VzIHdpdGggbXVsdGltb2RlICAgICAgICAgICAgICAgKi8NCi0gIC8qIGF2YWlsYWJsZSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNpZiBkZWZpbmVkKEFEQ19NVUxUSU1PREVfU1VQUE9SVCkNCi0gIGlmICgoX19MTF9BRENfTVVMVElfSU5TVEFOQ0VfTUFTVEVSKGhhZGMtPkluc3RhbmNlKSA9PSBoYWRjLT5JbnN0YW5jZSkgfHwNCi0gICAgICAodG1wX211bHRpbW9kZV9jb25maWcgPT0gTExfQURDX01VTFRJX0lOREVQRU5ERU5UKSB8fA0KLSAgICAgICh0bXBfbXVsdGltb2RlX2NvbmZpZyA9PSBMTF9BRENfTVVMVElfRFVBTF9JTkpfU0lNVUxUKSB8fA0KLSAgICAgICh0bXBfbXVsdGltb2RlX2NvbmZpZyA9PSBMTF9BRENfTVVMVElfRFVBTF9JTkpfQUxURVJOKSkgew0KLSAgICAvKiBSZXRyaWV2ZSBoYW5kbGUgQURDIENGR1IgcmVnaXN0ZXIgKi8NCi0gICAgdG1wX2NmZ3IgPSBSRUFEX1JFRyhoYWRjLT5JbnN0YW5jZS0+Q0ZHUik7DQotICB9IGVsc2Ugew0KLSAgICAvKiBSZXRyaWV2ZSBNYXN0ZXIgQURDIENGR1IgcmVnaXN0ZXIgKi8NCi0gICAgdG1wQURDX01hc3RlciA9IF9fTExfQURDX01VTFRJX0lOU1RBTkNFX01BU1RFUihoYWRjLT5JbnN0YW5jZSk7DQotICAgIHRtcF9jZmdyID0gUkVBRF9SRUcodG1wQURDX01hc3Rlci0+Q0ZHUik7DQotICB9DQotI2Vsc2UNCi0gIC8qIFJldHJpZXZlIGhhbmRsZSBBREMgQ0ZHUiByZWdpc3RlciAqLw0KLSAgdG1wX2NmZ3IgPSBSRUFEX1JFRyhoYWRjLT5JbnN0YW5jZS0+Q0ZHUik7DQotI2VuZGlmDQotDQotICAvKiBDbGVhciBwb2xsZWQgZmxhZyAqLw0KLSAgaWYgKHRtcF9GbGFnX0VuZCA9PSBBRENfRkxBR19FT1MpIHsNCi0gICAgX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgQURDX0ZMQUdfRU9TKTsNCi0gIH0gZWxzZSB7DQotICAgIC8qIENsZWFyIGVuZCBvZiBjb252ZXJzaW9uIEVPQyBmbGFnIG9mIHJlZ3VsYXIgZ3JvdXAgaWYgbG93IHBvd2VyIGZlYXR1cmUgKi8NCi0gICAgLyogIkxvd1Bvd2VyQXV0b1dhaXQgIiBpcyBkaXNhYmxlZCwgdG8gbm90IGludGVyZmVyZSB3aXRoIHRoaXMgZmVhdHVyZSAgICAqLw0KLSAgICAvKiB1bnRpbCBkYXRhIHJlZ2lzdGVyIGlzIHJlYWQgdXNpbmcgZnVuY3Rpb24gSEFMX0FEQ19HZXRWYWx1ZSgpLiAgICAgICAgICovDQotICAgIGlmIChSRUFEX0JJVCh0bXBfY2ZnciwgQURDX0NGR1JfQVVURExZKSA9PSAwVUwpIHsNCi0gICAgICBfX0hBTF9BRENfQ0xFQVJfRkxBRyhoYWRjLCAoQURDX0ZMQUdfRU9DIHwgQURDX0ZMQUdfRU9TKSk7DQotICAgIH0NCi0gIH0NCi0NCi0gIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8NCi0gIHJldHVybiBIQUxfT0s7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUG9sbCBmb3IgQURDIGV2ZW50Lg0KLSAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUNCi0gKiBAcGFyYW0gRXZlbnRUeXBlIHRoZSBBREMgZXZlbnQgdHlwZS4NCi0gKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19FT1NNUF9FVkVOVCAgQURDIEVuZCBvZiBTYW1wbGluZyBldmVudA0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19BV0QxX0VWRU5UICAgQURDIEFuYWxvZyB3YXRjaGRvZyAxIGV2ZW50IChtYWluDQotICogYW5hbG9nIHdhdGNoZG9nLCBwcmVzZW50IG9uIGFsbCBTVE0zMiBkZXZpY2VzKQ0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19BV0QyX0VWRU5UICAgQURDIEFuYWxvZyB3YXRjaGRvZyAyIGV2ZW50IChhZGRpdGlvbmFsDQotICogYW5hbG9nIHdhdGNoZG9nLCBub3QgcHJlc2VudCBvbiBhbGwgU1RNMzIgZmFtaWxpZXMpDQotICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0FXRDNfRVZFTlQgICBBREMgQW5hbG9nIHdhdGNoZG9nIDMgZXZlbnQgKGFkZGl0aW9uYWwNCi0gKiBhbmFsb2cgd2F0Y2hkb2csIG5vdCBwcmVzZW50IG9uIGFsbCBTVE0zMiBmYW1pbGllcykNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfT1ZSX0VWRU5UICAgIEFEQyBPdmVycnVuIGV2ZW50DQotICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0pRT1ZGX0VWRU5UICBBREMgSW5qZWN0ZWQgY29udGV4dCBxdWV1ZSBvdmVyZmxvdw0KLSAqIGV2ZW50DQotICogQHBhcmFtIFRpbWVvdXQgVGltZW91dCB2YWx1ZSBpbiBtaWxsaXNlY29uZC4NCi0gKiBAbm90ZSAgIFRoZSByZWxldmFudCBmbGFnIGlzIGNsZWFyZWQgaWYgZm91bmQgdG8gYmUgc2V0LCBleGNlcHQgZm9yDQotICogQURDX0ZMQUdfT1ZSLiBJbmRlZWQsIHRoZSBsYXR0ZXIgaXMgcmVzZXQgb25seSBpZiBoYWRjLT5Jbml0Lk92ZXJydW4gZmllbGQgaXMNCi0gKiBzZXQgdG8gQURDX09WUl9EQVRBX09WRVJXUklUVEVOLiBPdGhlcndpc2UsIGRhdGEgcmVnaXN0ZXIgbWF5IGJlIHBvdGVudGlhbGx5DQotICogb3ZlcndyaXR0ZW4gYnkgYSBuZXcgY29udmVydGVkIGRhdGEgYXMgc29vbiBhcyBPVlIgaXMgY2xlYXJlZC4gVG8gcmVzZXQgT1ZSDQotICogZmxhZyBvbmNlIHRoZSBwcmVzZXJ2ZWQgZGF0YSBpcyByZXRyaWV2ZWQsIHRoZSB1c2VyIGNhbiByZXNvcnQgdG8gbWFjcm8NCi0gKiBfX0hBTF9BRENfQ0xFQVJfRkxBRyhoYWRjLCBBRENfRkxBR19PVlIpOw0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfUG9sbEZvckV2ZW50KEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEV2ZW50VHlwZSwgdWludDMyX3QgVGltZW91dCkgew0KLSAgdWludDMyX3QgdGlja3N0YXJ0Ow0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfQURDX0VWRU5UX1RZUEUoRXZlbnRUeXBlKSk7DQotDQotICAvKiBHZXQgdGljayBjb3VudCAqLw0KLSAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsNCi0NCi0gIC8qIENoZWNrIHNlbGVjdGVkIGV2ZW50IGZsYWcgKi8NCi0gIHdoaWxlIChfX0hBTF9BRENfR0VUX0ZMQUcoaGFkYywgRXZlbnRUeXBlKSA9PSAwVUwpIHsNCi0gICAgLyogQ2hlY2sgaWYgdGltZW91dCBpcyBkaXNhYmxlZCAoc2V0IHRvIGluZmluaXRlIHdhaXQpICovDQotICAgIGlmIChUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpIHsNCi0gICAgICBpZiAoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFRpbWVvdXQpIHx8IChUaW1lb3V0ID09IDBVTCkpIHsNCi0gICAgICAgIC8qIE5ldyBjaGVjayB0byBhdm9pZCBmYWxzZSB0aW1lb3V0IGRldGVjdGlvbiBpbiBjYXNlIG9mIHByZWVtcHRpb24gKi8NCi0gICAgICAgIGlmIChfX0hBTF9BRENfR0VUX0ZMQUcoaGFkYywgRXZlbnRUeXBlKSA9PSAwVUwpIHsNCi0gICAgICAgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lIHRvIHRpbWVvdXQgKi8NCi0gICAgICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9USU1FT1VUKTsNCi0NCi0gICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLw0KLSAgICAgICAgICBfX0hBTF9VTkxPQ0soaGFkYyk7DQotDQotICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsNCi0gICAgICAgIH0NCi0gICAgICB9DQotICAgIH0NCi0gIH0NCi0NCi0gIHN3aXRjaCAoRXZlbnRUeXBlKSB7DQotICAgIC8qIEVuZCBPZiBTYW1wbGluZyBldmVudCAqLw0KLSAgICBjYXNlIEFEQ19FT1NNUF9FVkVOVDoNCi0gICAgICAvKiBTZXQgQURDIHN0YXRlICovDQotICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9SRUdfRU9TTVApOw0KLQ0KLSAgICAgIC8qIENsZWFyIHRoZSBFbmQgT2YgU2FtcGxpbmcgZmxhZyAqLw0KLSAgICAgIF9fSEFMX0FEQ19DTEVBUl9GTEFHKGhhZGMsIEFEQ19GTEFHX0VPU01QKTsNCi0NCi0gICAgICBicmVhazsNCi0NCi0gICAgLyogQW5hbG9nIHdhdGNoZG9nIChsZXZlbCBvdXQgb2Ygd2luZG93KSBldmVudCAqLw0KLSAgICAvKiBOb3RlOiBJbiBjYXNlIG9mIHNldmVyYWwgYW5hbG9nIHdhdGNoZG9nIGVuYWJsZWQsIGlmIG5lZWRlZCB0byBrbm93ICovDQotICAgIC8qIHdoaWNoIG9uZSB0cmlnZ2VyZWQgYW5kIG9uIHdoaWNoIEFEQ3gsIHRlc3QgQURDIHN0YXRlIG9mIGFuYWxvZyB3YXRjaGRvZw0KLSAgICAgKi8NCi0gICAgLyogZmxhZ3MgSEFMX0FEQ19TVEFURV9BV0QxLzIvMyB1c2luZyBmdW5jdGlvbiAiSEFMX0FEQ19HZXRTdGF0ZSgpIi4gKi8NCi0gICAgLyogRm9yIGV4YW1wbGU6ICovDQotICAgIC8qICAiIGlmICgoSEFMX0FEQ19HZXRTdGF0ZShoYWRjMSkgJiBIQUxfQURDX1NUQVRFX0FXRDEpICE9IDBVTCkgIiAqLw0KLSAgICAvKiAgIiBpZiAoKEhBTF9BRENfR2V0U3RhdGUoaGFkYzEpICYgSEFMX0FEQ19TVEFURV9BV0QyKSAhPSAwVUwpICIgKi8NCi0gICAgLyogICIgaWYgKChIQUxfQURDX0dldFN0YXRlKGhhZGMxKSAmIEhBTF9BRENfU1RBVEVfQVdEMykgIT0gMFVMKSAiICovDQotDQotICAgIC8qIENoZWNrIGFuYWxvZyB3YXRjaGRvZyAxIGZsYWcgKi8NCi0gICAgY2FzZSBBRENfQVdEX0VWRU5UOg0KLSAgICAgIC8qIFNldCBBREMgc3RhdGUgKi8NCi0gICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0FXRDEpOw0KLQ0KLSAgICAgIC8qIENsZWFyIEFEQyBhbmFsb2cgd2F0Y2hkb2cgZmxhZyAqLw0KLSAgICAgIF9fSEFMX0FEQ19DTEVBUl9GTEFHKGhhZGMsIEFEQ19GTEFHX0FXRDEpOw0KLQ0KLSAgICAgIGJyZWFrOw0KLQ0KLSAgICAvKiBDaGVjayBhbmFsb2cgd2F0Y2hkb2cgMiBmbGFnICovDQotICAgIGNhc2UgQURDX0FXRDJfRVZFTlQ6DQotICAgICAgLyogU2V0IEFEQyBzdGF0ZSAqLw0KLSAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfQVdEMik7DQotDQotICAgICAgLyogQ2xlYXIgQURDIGFuYWxvZyB3YXRjaGRvZyBmbGFnICovDQotICAgICAgX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgQURDX0ZMQUdfQVdEMik7DQotDQotICAgICAgYnJlYWs7DQotDQotICAgIC8qIENoZWNrIGFuYWxvZyB3YXRjaGRvZyAzIGZsYWcgKi8NCi0gICAgY2FzZSBBRENfQVdEM19FVkVOVDoNCi0gICAgICAvKiBTZXQgQURDIHN0YXRlICovDQotICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9BV0QzKTsNCi0NCi0gICAgICAvKiBDbGVhciBBREMgYW5hbG9nIHdhdGNoZG9nIGZsYWcgKi8NCi0gICAgICBfX0hBTF9BRENfQ0xFQVJfRkxBRyhoYWRjLCBBRENfRkxBR19BV0QzKTsNCi0NCi0gICAgICBicmVhazsNCi0NCi0gICAgLyogSW5qZWN0ZWQgY29udGV4dCBxdWV1ZSBvdmVyZmxvdyBldmVudCAqLw0KLSAgICBjYXNlIEFEQ19KUU9WRl9FVkVOVDoNCi0gICAgICAvKiBTZXQgQURDIHN0YXRlICovDQotICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9JTkpfSlFPVkYpOw0KLQ0KLSAgICAgIC8qIFNldCBBREMgZXJyb3IgY29kZSB0byBJbmplY3RlZCBjb250ZXh0IHF1ZXVlIG92ZXJmbG93ICovDQotICAgICAgU0VUX0JJVChoYWRjLT5FcnJvckNvZGUsIEhBTF9BRENfRVJST1JfSlFPVkYpOw0KLQ0KLSAgICAgIC8qIENsZWFyIEFEQyBJbmplY3RlZCBjb250ZXh0IHF1ZXVlIG92ZXJmbG93IGZsYWcgKi8NCi0gICAgICBfX0hBTF9BRENfQ0xFQVJfRkxBRyhoYWRjLCBBRENfRkxBR19KUU9WRik7DQotDQotICAgICAgYnJlYWs7DQotDQotICAgIC8qIE92ZXJydW4gZXZlbnQgKi8NCi0gICAgZGVmYXVsdDogLyogQ2FzZSBBRENfT1ZSX0VWRU5UICovDQotICAgICAgLyogSWYgb3ZlcnJ1biBpcyBzZXQgdG8gb3ZlcndyaXRlIHByZXZpb3VzIGRhdGEsIG92ZXJydW4gZXZlbnQgaXMgbm90ICovDQotICAgICAgLyogY29uc2lkZXJlZCBhcyBhbiBlcnJvci4gKi8NCi0gICAgICAvKiAoY2YgcmVmIG1hbnVhbCAiTWFuYWdpbmcgY29udmVyc2lvbnMgd2l0aG91dCB1c2luZyB0aGUgRE1BIGFuZCB3aXRob3V0DQotICAgICAgICovDQotICAgICAgLyogb3ZlcnJ1biAiKSAqLw0KLSAgICAgIGlmIChoYWRjLT5Jbml0Lk92ZXJydW4gPT0gQURDX09WUl9EQVRBX1BSRVNFUlZFRCkgew0KLSAgICAgICAgLyogU2V0IEFEQyBzdGF0ZSAqLw0KLSAgICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9SRUdfT1ZSKTsNCi0NCi0gICAgICAgIC8qIFNldCBBREMgZXJyb3IgY29kZSB0byBvdmVycnVuICovDQotICAgICAgICBTRVRfQklUKGhhZGMtPkVycm9yQ29kZSwgSEFMX0FEQ19FUlJPUl9PVlIpOw0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICAvKiBDbGVhciBBREMgT3ZlcnJ1biBmbGFnIG9ubHkgaWYgT3ZlcnJ1biBpcyBzZXQgdG8NCi0gICAgICAgICAgIEFEQ19PVlJfREFUQV9PVkVSV1JJVFRFTiBvdGhlcndpc2UsIGRhdGEgcmVnaXN0ZXIgaXMgcG90ZW50aWFsbHkNCi0gICAgICAgICAgIG92ZXJ3cml0dGVuIGJ5IG5ldyBjb252ZXJ0ZWQgZGF0YSBhcyBzb29uIGFzIE9WUiBpcyBjbGVhcmVkLiAqLw0KLSAgICAgICAgX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgQURDX0ZMQUdfT1ZSKTsNCi0gICAgICB9DQotICAgICAgYnJlYWs7DQotICB9DQotDQotICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovDQotICByZXR1cm4gSEFMX09LOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSBBREMsIHN0YXJ0IGNvbnZlcnNpb24gb2YgcmVndWxhciBncm91cCB3aXRoIGludGVycnVwdGlvbi4NCi0gKiBAbm90ZSAgIEludGVycnVwdGlvbnMgZW5hYmxlZCBpbiB0aGlzIGZ1bmN0aW9uIGFjY29yZGluZyB0byBpbml0aWFsaXphdGlvbg0KLSAqICAgICAgICAgc2V0dGluZyA6IEVPQyAoZW5kIG9mIGNvbnZlcnNpb24pLCBFT1MgKGVuZCBvZiBzZXF1ZW5jZSksDQotICogICAgICAgICBPVlIgb3ZlcnJ1bi4NCi0gKiAgICAgICAgIEVhY2ggb2YgdGhlc2UgaW50ZXJydXB0aW9ucyBoYXMgaXRzIGRlZGljYXRlZCBjYWxsYmFjayBmdW5jdGlvbi4NCi0gKiBAbm90ZSAgIENhc2Ugb2YgbXVsdGltb2RlIGVuYWJsZWQgKHdoZW4gbXVsdGltb2RlIGZlYXR1cmUgaXMgYXZhaWxhYmxlKToNCi0gKiAgICAgICAgIEhBTF9BRENfU3RhcnRfSVQoKSBtdXN0IGJlIGNhbGxlZCBmb3IgQURDIFNsYXZlIGZpcnN0LCB0aGVuIGZvcg0KLSAqICAgICAgICAgQURDIE1hc3Rlci4NCi0gKiAgICAgICAgIEZvciBBREMgU2xhdmUsIEFEQyBpcyBlbmFibGVkIG9ubHkgKGNvbnZlcnNpb24gaXMgbm90IHN0YXJ0ZWQpLg0KLSAqICAgICAgICAgRm9yIEFEQyBNYXN0ZXIsIEFEQyBpcyBlbmFibGVkIGFuZCBtdWx0aW1vZGUgY29udmVyc2lvbiBpcyBzdGFydGVkLg0KLSAqIEBub3RlICAgVG8gZ3VhcmFudGVlIGEgcHJvcGVyIHJlc2V0IG9mIGFsbCBpbnRlcnJ1cHRpb25zIG9uY2UgYWxsIHRoZSBuZWVkZWQNCi0gKiAgICAgICAgIGNvbnZlcnNpb25zIGFyZSBvYnRhaW5lZCwgSEFMX0FEQ19TdG9wX0lUKCkgbXVzdCBiZSBjYWxsZWQgdG8gZW5zdXJlDQotICogICAgICAgICBhIGNvcnJlY3Qgc3RvcCBvZiB0aGUgSVQtYmFzZWQgY29udmVyc2lvbnMuDQotICogQG5vdGUgICBCeSBkZWZhdWx0LCBIQUxfQURDX1N0YXJ0X0lUKCkgZG9lcyBub3QgZW5hYmxlIHRoZSBFbmQgT2YgU2FtcGxpbmcNCi0gKiAgICAgICAgIGludGVycnVwdGlvbi4gSWYgcmVxdWlyZWQgKGUuZy4gaW4gY2FzZSBvZiBvdmVyc2FtcGxpbmcgd2l0aCB0cmlnZ2VyDQotICogICAgICAgICBtb2RlKSwgdGhlIHVzZXIgbXVzdDoNCi0gKiAgICAgICAgICAxLiBmaXJzdCBjbGVhciB0aGUgRU9TTVAgZmxhZyBpZiBzZXQgd2l0aCBtYWNybw0KLSAqIF9fSEFMX0FEQ19DTEVBUl9GTEFHKGhhZGMsIEFEQ19GTEFHX0VPU01QKQ0KLSAqICAgICAgICAgIDIuIHRoZW4gZW5hYmxlIHRoZSBFT1NNUCBpbnRlcnJ1cHQgd2l0aCBtYWNybw0KLSAqIF9fSEFMX0FEQ19FTkFCTEVfSVQoaGFkYywgQURDX0lUX0VPU01QKSBiZWZvcmUgY2FsbGluZyBIQUxfQURDX1N0YXJ0X0lUKCkuDQotICogQHBhcmFtIGhhZGMgQURDIGhhbmRsZQ0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfU3RhcnRfSVQoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpIHsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIHRtcF9oYWxfc3RhdHVzOw0KLSNpZiBkZWZpbmVkKEFEQ19NVUxUSU1PREVfU1VQUE9SVCkNCi0gIGNvbnN0IEFEQ19UeXBlRGVmICp0bXBBRENfTWFzdGVyOw0KLSAgdWludDMyX3QgdG1wX211bHRpbW9kZV9jb25maWcgPQ0KLSAgICAgIExMX0FEQ19HZXRNdWx0aW1vZGUoX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7DQotI2VuZGlmDQotDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsNCi0NCi0gIC8qIFBlcmZvcm0gQURDIGVuYWJsZSBhbmQgY29udmVyc2lvbiBzdGFydCBpZiBubyBjb252ZXJzaW9uIGlzIG9uIGdvaW5nICovDQotICBpZiAoTExfQURDX1JFR19Jc0NvbnZlcnNpb25PbmdvaW5nKGhhZGMtPkluc3RhbmNlKSA9PSAwVUwpIHsNCi0gICAgLyogUHJvY2VzcyBsb2NrZWQgKi8NCi0gICAgX19IQUxfTE9DSyhoYWRjKTsNCi0NCi0gICAgLyogRW5hYmxlIHRoZSBBREMgcGVyaXBoZXJhbCAqLw0KLSAgICB0bXBfaGFsX3N0YXR1cyA9IEFEQ19FbmFibGUoaGFkYyk7DQotDQotICAgIC8qIFN0YXJ0IGNvbnZlcnNpb24gaWYgQURDIGlzIGVmZmVjdGl2ZWx5IGVuYWJsZWQgKi8NCi0gICAgaWYgKHRtcF9oYWxfc3RhdHVzID09IEhBTF9PSykgew0KLSAgICAgIC8qIFNldCBBREMgc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgICAgLyogLSBDbGVhciBzdGF0ZSBiaXRmaWVsZCByZWxhdGVkIHRvIHJlZ3VsYXIgZ3JvdXAgY29udmVyc2lvbiByZXN1bHRzICAgKi8NCi0gICAgICAvKiAtIFNldCBzdGF0ZSBiaXRmaWVsZCByZWxhdGVkIHRvIHJlZ3VsYXIgb3BlcmF0aW9uICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICAgIEFEQ19TVEFURV9DTFJfU0VUKGhhZGMtPlN0YXRlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVBRFkgfCBIQUxfQURDX1NUQVRFX1JFR19FT0MgfA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFR19PVlIgfCBIQUxfQURDX1NUQVRFX1JFR19FT1NNUCwNCi0gICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFR19CVVNZKTsNCi0NCi0jaWYgZGVmaW5lZChBRENfTVVMVElNT0RFX1NVUFBPUlQpDQotICAgICAgLyogUmVzZXQgSEFMX0FEQ19TVEFURV9NVUxUSU1PREVfU0xBVkUgYml0DQotICAgICAgICAtIGlmIEFEQyBpbnN0YW5jZSBpcyBtYXN0ZXIgb3IgaWYgbXVsdGltb2RlIGZlYXR1cmUgaXMgbm90IGF2YWlsYWJsZQ0KLSAgICAgICAgLSBpZiBtdWx0aW1vZGUgc2V0dGluZyBpcyBkaXNhYmxlZCAoQURDIGluc3RhbmNlIHNsYXZlIGluIGluZGVwZW5kZW50DQotICAgICAgICBtb2RlKSAqLw0KLSAgICAgIGlmICgoX19MTF9BRENfTVVMVElfSU5TVEFOQ0VfTUFTVEVSKGhhZGMtPkluc3RhbmNlKSA9PSBoYWRjLT5JbnN0YW5jZSkgfHwNCi0gICAgICAgICAgKHRtcF9tdWx0aW1vZGVfY29uZmlnID09IExMX0FEQ19NVUxUSV9JTkRFUEVOREVOVCkpIHsNCi0gICAgICAgIENMRUFSX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9NVUxUSU1PREVfU0xBVkUpOw0KLSAgICAgIH0NCi0jZW5kaWYNCi0NCi0gICAgICAvKiBTZXQgQURDIGVycm9yIGNvZGUgKi8NCi0gICAgICAvKiBDaGVjayBpZiBhIGNvbnZlcnNpb24gaXMgb24gZ29pbmcgb24gQURDIGdyb3VwIGluamVjdGVkICovDQotICAgICAgaWYgKChoYWRjLT5TdGF0ZSAmIEhBTF9BRENfU1RBVEVfSU5KX0JVU1kpICE9IDBVTCkgew0KLSAgICAgICAgLyogUmVzZXQgQURDIGVycm9yIGNvZGUgZmllbGRzIHJlbGF0ZWQgdG8gcmVndWxhciBjb252ZXJzaW9ucyBvbmx5ICovDQotICAgICAgICBDTEVBUl9CSVQoaGFkYy0+RXJyb3JDb2RlLCAoSEFMX0FEQ19FUlJPUl9PVlIgfCBIQUxfQURDX0VSUk9SX0RNQSkpOw0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICAvKiBSZXNldCBhbGwgQURDIGVycm9yIGNvZGUgZmllbGRzICovDQotICAgICAgICBBRENfQ0xFQVJfRVJST1JDT0RFKGhhZGMpOw0KLSAgICAgIH0NCi0NCi0gICAgICAvKiBDbGVhciBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIGZsYWcgYW5kIG92ZXJydW4gZmxhZyAqLw0KLSAgICAgIC8qIChUbyBlbnN1cmUgb2Ygbm8gdW5rbm93biBzdGF0ZSBmcm9tIHBvdGVudGlhbCBwcmV2aW91cyBBREMgb3BlcmF0aW9ucykNCi0gICAgICAgKi8NCi0gICAgICBfX0hBTF9BRENfQ0xFQVJfRkxBRyhoYWRjLCAoQURDX0ZMQUdfRU9DIHwgQURDX0ZMQUdfRU9TIHwgQURDX0ZMQUdfT1ZSKSk7DQotDQotICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLw0KLSAgICAgIC8qIFVubG9jayBiZWZvcmUgc3RhcnRpbmcgQURDIGNvbnZlcnNpb25zOiBpbiBjYXNlIG9mIHBvdGVudGlhbCAgICAgICAgICovDQotICAgICAgLyogaW50ZXJydXB0aW9uLCB0byBsZXQgdGhlIHByb2Nlc3MgdG8gQURDIElSUSBIYW5kbGVyLiAgICAgICAgICAgICAgICAgKi8NCi0gICAgICBfX0hBTF9VTkxPQ0soaGFkYyk7DQotDQotICAgICAgLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0aW9ucyBiZWZvcmUgZW5hYmxpbmcgdGhlIGRlc2lyZWQgb25lcyAqLw0KLSAgICAgIF9fSEFMX0FEQ19ESVNBQkxFX0lUKGhhZGMsIChBRENfSVRfRU9DIHwgQURDX0lUX0VPUyB8IEFEQ19JVF9PVlIpKTsNCi0NCi0gICAgICAvKiBFbmFibGUgQURDIGVuZCBvZiBjb252ZXJzaW9uIGludGVycnVwdCAqLw0KLSAgICAgIHN3aXRjaCAoaGFkYy0+SW5pdC5FT0NTZWxlY3Rpb24pIHsNCi0gICAgICAgIGNhc2UgQURDX0VPQ19TRVFfQ09OVjoNCi0gICAgICAgICAgX19IQUxfQURDX0VOQUJMRV9JVChoYWRjLCBBRENfSVRfRU9TKTsNCi0gICAgICAgICAgYnJlYWs7DQotICAgICAgICAvKiBjYXNlIEFEQ19FT0NfU0lOR0xFX0NPTlYgKi8NCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgIF9fSEFMX0FEQ19FTkFCTEVfSVQoaGFkYywgQURDX0lUX0VPQyk7DQotICAgICAgICAgIGJyZWFrOw0KLSAgICAgIH0NCi0NCi0gICAgICAvKiBFbmFibGUgQURDIG92ZXJydW4gaW50ZXJydXB0ICovDQotICAgICAgLyogSWYgaGFkYy0+SW5pdC5PdmVycnVuIGlzIHNldCB0byBBRENfT1ZSX0RBVEFfUFJFU0VSVkVELCBvbmx5IHRoZW4gaXMNCi0gICAgICAgICBBRENfSVRfT1ZSIGVuYWJsZWQ7IG90aGVyd2lzZSBkYXRhIG92ZXJ3cml0ZSBpcyBjb25zaWRlcmVkIGFzIG5vcm1hbA0KLSAgICAgICAgIGJlaGF2aW9yIGFuZCBubyBDUFUgdGltZSBpcyBsb3N0IGZvciBhIG5vbi1wcm9jZXNzZWQgaW50ZXJydXB0aW9uICovDQotICAgICAgaWYgKGhhZGMtPkluaXQuT3ZlcnJ1biA9PSBBRENfT1ZSX0RBVEFfUFJFU0VSVkVEKSB7DQotICAgICAgICBfX0hBTF9BRENfRU5BQkxFX0lUKGhhZGMsIEFEQ19JVF9PVlIpOw0KLSAgICAgIH0NCi0NCi0gICAgICAvKiBFbmFibGUgY29udmVyc2lvbiBvZiByZWd1bGFyIGdyb3VwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICAgIC8qIElmIHNvZnR3YXJlIHN0YXJ0IGhhcyBiZWVuIHNlbGVjdGVkLCBjb252ZXJzaW9uIHN0YXJ0cyBpbW1lZGlhdGVseS4gICovDQotICAgICAgLyogSWYgZXh0ZXJuYWwgdHJpZ2dlciBoYXMgYmVlbiBzZWxlY3RlZCwgY29udmVyc2lvbiB3aWxsIHN0YXJ0IGF0IG5leHQgKi8NCi0gICAgICAvKiB0cmlnZ2VyIGV2ZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICAgIC8qIENhc2Ugb2YgbXVsdGltb2RlIGVuYWJsZWQgKHdoZW4gbXVsdGltb2RlIGZlYXR1cmUgaXMgYXZhaWxhYmxlKTogICAgICovDQotICAgICAgLyogIC0gaWYgQURDIGlzIHNsYXZlIGFuZCBkdWFsIHJlZ3VsYXIgY29udmVyc2lvbnMgYXJlIGVuYWJsZWQsIEFEQyBpcyAgKi8NCi0gICAgICAvKiAgICBlbmFibGVkIG9ubHkgKGNvbnZlcnNpb24gaXMgbm90IHN0YXJ0ZWQpLCAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICAgIC8qICAtIGlmIEFEQyBpcyBtYXN0ZXIsIEFEQyBpcyBlbmFibGVkIGFuZCBjb252ZXJzaW9uIGlzIHN0YXJ0ZWQuICAgICAgICovDQotI2lmIGRlZmluZWQoQURDX01VTFRJTU9ERV9TVVBQT1JUKQ0KLSAgICAgIGlmICgoX19MTF9BRENfTVVMVElfSU5TVEFOQ0VfTUFTVEVSKGhhZGMtPkluc3RhbmNlKSA9PSBoYWRjLT5JbnN0YW5jZSkgfHwNCi0gICAgICAgICAgKHRtcF9tdWx0aW1vZGVfY29uZmlnID09IExMX0FEQ19NVUxUSV9JTkRFUEVOREVOVCkgfHwNCi0gICAgICAgICAgKHRtcF9tdWx0aW1vZGVfY29uZmlnID09IExMX0FEQ19NVUxUSV9EVUFMX0lOSl9TSU1VTFQpIHx8DQotICAgICAgICAgICh0bXBfbXVsdGltb2RlX2NvbmZpZyA9PSBMTF9BRENfTVVMVElfRFVBTF9JTkpfQUxURVJOKSkgew0KLSAgICAgICAgLyogQURDIGluc3RhbmNlIGlzIG5vdCBhIG11bHRpbW9kZSBzbGF2ZSBpbnN0YW5jZSB3aXRoIG11bHRpbW9kZSByZWd1bGFyDQotICAgICAgICAgKiBjb252ZXJzaW9ucyBlbmFibGVkICovDQotICAgICAgICBpZiAoUkVBRF9CSVQoaGFkYy0+SW5zdGFuY2UtPkNGR1IsIEFEQ19DRkdSX0pBVVRPKSAhPSAwVUwpIHsNCi0gICAgICAgICAgQURDX1NUQVRFX0NMUl9TRVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfSU5KX0VPQywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9JTkpfQlVTWSk7DQotDQotICAgICAgICAgIC8qIEVuYWJsZSBhcyB3ZWxsIGluamVjdGVkIGludGVycnVwdGlvbnMgaW4gY2FzZQ0KLSAgICAgICAgICAgSEFMX0FEQ0V4X0luamVjdGVkU3RhcnRfSVQoKSBoYXMgbm90IGJlZW4gY2FsbGVkIGJlZm9yZWhhbmQuIFRoaXMNCi0gICAgICAgICAgIGFsbG93cyB0byBzdGFydCByZWd1bGFyIGFuZCBpbmplY3RlZCBjb252ZXJzaW9ucyB3aGVuIEpBVVRPIGlzDQotICAgICAgICAgICBzZXQgd2l0aCBhIHNpbmdsZSBjYWxsIHRvIEhBTF9BRENfU3RhcnRfSVQoKSAqLw0KLSAgICAgICAgICBzd2l0Y2ggKGhhZGMtPkluaXQuRU9DU2VsZWN0aW9uKSB7DQotICAgICAgICAgICAgY2FzZSBBRENfRU9DX1NFUV9DT05WOg0KLSAgICAgICAgICAgICAgX19IQUxfQURDX0RJU0FCTEVfSVQoaGFkYywgQURDX0lUX0pFT0MpOw0KLSAgICAgICAgICAgICAgX19IQUxfQURDX0VOQUJMRV9JVChoYWRjLCBBRENfSVRfSkVPUyk7DQotICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAvKiBjYXNlIEFEQ19FT0NfU0lOR0xFX0NPTlYgKi8NCi0gICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgX19IQUxfQURDX0RJU0FCTEVfSVQoaGFkYywgQURDX0lUX0pFT1MpOw0KLSAgICAgICAgICAgICAgX19IQUxfQURDX0VOQUJMRV9JVChoYWRjLCBBRENfSVRfSkVPQyk7DQotICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyogU3RhcnQgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiAqLw0KLSAgICAgICAgTExfQURDX1JFR19TdGFydENvbnZlcnNpb24oaGFkYy0+SW5zdGFuY2UpOw0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICAvKiBBREMgaW5zdGFuY2UgaXMgYSBtdWx0aW1vZGUgc2xhdmUgaW5zdGFuY2Ugd2l0aCBtdWx0aW1vZGUgcmVndWxhcg0KLSAgICAgICAgICogY29udmVyc2lvbnMgZW5hYmxlZCAqLw0KLSAgICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9NVUxUSU1PREVfU0xBVkUpOw0KLSAgICAgICAgLyogaWYgTWFzdGVyIEFEQyBKQVVUTyBiaXQgaXMgc2V0LCBTbGF2ZSBpbmplY3RlZCBpbnRlcnJ1cHRpb25zDQotICAgICAgICAgICBhcmUgZW5hYmxlZCBuZXZlcnRoZWxlc3MgKGZvciBzYW1lIHJlYXNvbiBhcyBhYm92ZSkgKi8NCi0gICAgICAgIHRtcEFEQ19NYXN0ZXIgPSBfX0xMX0FEQ19NVUxUSV9JTlNUQU5DRV9NQVNURVIoaGFkYy0+SW5zdGFuY2UpOw0KLSAgICAgICAgaWYgKFJFQURfQklUKHRtcEFEQ19NYXN0ZXItPkNGR1IsIEFEQ19DRkdSX0pBVVRPKSAhPSAwVUwpIHsNCi0gICAgICAgICAgLyogRmlyc3QsIHVwZGF0ZSBTbGF2ZSBTdGF0ZSBpbiBzZXR0aW5nIEhBTF9BRENfU1RBVEVfSU5KX0JVU1kgYml0DQotICAgICAgICAgICAgIGFuZCBpbiByZXNldHRpbmcgSEFMX0FEQ19TVEFURV9JTkpfRU9DIGJpdCAqLw0KLSAgICAgICAgICBBRENfU1RBVEVfQ0xSX1NFVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9JTkpfRU9DLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX0lOSl9CVVNZKTsNCi0gICAgICAgICAgLyogTmV4dCwgc2V0IFNsYXZlIGluamVjdGVkIGludGVycnVwdGlvbnMgKi8NCi0gICAgICAgICAgc3dpdGNoIChoYWRjLT5Jbml0LkVPQ1NlbGVjdGlvbikgew0KLSAgICAgICAgICAgIGNhc2UgQURDX0VPQ19TRVFfQ09OVjoNCi0gICAgICAgICAgICAgIF9fSEFMX0FEQ19ESVNBQkxFX0lUKGhhZGMsIEFEQ19JVF9KRU9DKTsNCi0gICAgICAgICAgICAgIF9fSEFMX0FEQ19FTkFCTEVfSVQoaGFkYywgQURDX0lUX0pFT1MpOw0KLSAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgLyogY2FzZSBBRENfRU9DX1NJTkdMRV9DT05WICovDQotICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgIF9fSEFMX0FEQ19ESVNBQkxFX0lUKGhhZGMsIEFEQ19JVF9KRU9TKTsNCi0gICAgICAgICAgICAgIF9fSEFMX0FEQ19FTkFCTEVfSVQoaGFkYywgQURDX0lUX0pFT0MpOw0KLSAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICB9DQotI2Vsc2UNCi0gICAgICAvKiBBREMgaW5zdGFuY2UgaXMgbm90IGEgbXVsdGltb2RlIHNsYXZlIGluc3RhbmNlIHdpdGggbXVsdGltb2RlIHJlZ3VsYXINCi0gICAgICAgKiBjb252ZXJzaW9ucyBlbmFibGVkICovDQotICAgICAgaWYgKFJFQURfQklUKGhhZGMtPkluc3RhbmNlLT5DRkdSLCBBRENfQ0ZHUl9KQVVUTykgIT0gMFVMKSB7DQotICAgICAgICBBRENfU1RBVEVfQ0xSX1NFVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9JTkpfRU9DLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9JTkpfQlVTWSk7DQotDQotICAgICAgICAvKiBFbmFibGUgYXMgd2VsbCBpbmplY3RlZCBpbnRlcnJ1cHRpb25zIGluIGNhc2UNCi0gICAgICAgICBIQUxfQURDRXhfSW5qZWN0ZWRTdGFydF9JVCgpIGhhcyBub3QgYmVlbiBjYWxsZWQgYmVmb3JlaGFuZC4gVGhpcw0KLSAgICAgICAgIGFsbG93cyB0byBzdGFydCByZWd1bGFyIGFuZCBpbmplY3RlZCBjb252ZXJzaW9ucyB3aGVuIEpBVVRPIGlzDQotICAgICAgICAgc2V0IHdpdGggYSBzaW5nbGUgY2FsbCB0byBIQUxfQURDX1N0YXJ0X0lUKCkgKi8NCi0gICAgICAgIHN3aXRjaCAoaGFkYy0+SW5pdC5FT0NTZWxlY3Rpb24pIHsNCi0gICAgICAgICAgY2FzZSBBRENfRU9DX1NFUV9DT05WOg0KLSAgICAgICAgICAgIF9fSEFMX0FEQ19ESVNBQkxFX0lUKGhhZGMsIEFEQ19JVF9KRU9DKTsNCi0gICAgICAgICAgICBfX0hBTF9BRENfRU5BQkxFX0lUKGhhZGMsIEFEQ19JVF9KRU9TKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgLyogY2FzZSBBRENfRU9DX1NJTkdMRV9DT05WICovDQotICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgX19IQUxfQURDX0RJU0FCTEVfSVQoaGFkYywgQURDX0lUX0pFT1MpOw0KLSAgICAgICAgICAgIF9fSEFMX0FEQ19FTkFCTEVfSVQoaGFkYywgQURDX0lUX0pFT0MpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0NCi0gICAgICAvKiBTdGFydCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uICovDQotICAgICAgTExfQURDX1JFR19TdGFydENvbnZlcnNpb24oaGFkYy0+SW5zdGFuY2UpOw0KLSNlbmRpZg0KLSAgICB9IGVsc2Ugew0KLSAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8NCi0gICAgICBfX0hBTF9VTkxPQ0soaGFkYyk7DQotICAgIH0NCi0NCi0gIH0gZWxzZSB7DQotICAgIHRtcF9oYWxfc3RhdHVzID0gSEFMX0JVU1k7DQotICB9DQotDQotICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovDQotICByZXR1cm4gdG1wX2hhbF9zdGF0dXM7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU3RvcCBBREMgY29udmVyc2lvbiBvZiByZWd1bGFyIGdyb3VwIChhbmQgaW5qZWN0ZWQgZ3JvdXAgaW4NCi0gKiAgICAgICAgIGNhc2Ugb2YgYXV0b19pbmplY3Rpb24gbW9kZSksIGRpc2FibGUgaW50ZXJydXRpb24gb2YNCi0gKiAgICAgICAgIGVuZC1vZi1jb252ZXJzaW9uLCBkaXNhYmxlIEFEQyBwZXJpcGhlcmFsLg0KLSAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMuDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ19TdG9wX0lUKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKSB7DQotICBIQUxfU3RhdHVzVHlwZURlZiB0bXBfaGFsX3N0YXR1czsNCi0NCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOw0KLQ0KLSAgLyogUHJvY2VzcyBsb2NrZWQgKi8NCi0gIF9fSEFMX0xPQ0soaGFkYyk7DQotDQotICAvKiAxLiBTdG9wIHBvdGVudGlhbCBjb252ZXJzaW9uIG9uIGdvaW5nLCBvbiBBREMgZ3JvdXBzIHJlZ3VsYXIgYW5kIGluamVjdGVkDQotICAgKi8NCi0gIHRtcF9oYWxfc3RhdHVzID0gQURDX0NvbnZlcnNpb25TdG9wKGhhZGMsIEFEQ19SRUdVTEFSX0lOSkVDVEVEX0dST1VQKTsNCi0NCi0gIC8qIERpc2FibGUgQURDIHBlcmlwaGVyYWwgaWYgY29udmVyc2lvbnMgYXJlIGVmZmVjdGl2ZWx5IHN0b3BwZWQgKi8NCi0gIGlmICh0bXBfaGFsX3N0YXR1cyA9PSBIQUxfT0spIHsNCi0gICAgLyogRGlzYWJsZSBBREMgZW5kIG9mIGNvbnZlcnNpb24gaW50ZXJydXB0IGZvciByZWd1bGFyIGdyb3VwICovDQotICAgIC8qIERpc2FibGUgQURDIG92ZXJydW4gaW50ZXJydXB0ICovDQotICAgIF9fSEFMX0FEQ19ESVNBQkxFX0lUKGhhZGMsIChBRENfSVRfRU9DIHwgQURDX0lUX0VPUyB8IEFEQ19JVF9PVlIpKTsNCi0NCi0gICAgLyogMi4gRGlzYWJsZSB0aGUgQURDIHBlcmlwaGVyYWwgKi8NCi0gICAgdG1wX2hhbF9zdGF0dXMgPSBBRENfRGlzYWJsZShoYWRjKTsNCi0NCi0gICAgLyogQ2hlY2sgaWYgQURDIGlzIGVmZmVjdGl2ZWx5IGRpc2FibGVkICovDQotICAgIGlmICh0bXBfaGFsX3N0YXR1cyA9PSBIQUxfT0spIHsNCi0gICAgICAvKiBTZXQgQURDIHN0YXRlICovDQotICAgICAgQURDX1NUQVRFX0NMUl9TRVQoaGFkYy0+U3RhdGUsDQotICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSB8IEhBTF9BRENfU1RBVEVfSU5KX0JVU1ksDQotICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUFEWSk7DQotICAgIH0NCi0gIH0NCi0NCi0gIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8NCi0gIF9fSEFMX1VOTE9DSyhoYWRjKTsNCi0NCi0gIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8NCi0gIHJldHVybiB0bXBfaGFsX3N0YXR1czsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgQURDLCBzdGFydCBjb252ZXJzaW9uIG9mIHJlZ3VsYXIgZ3JvdXAgYW5kIHRyYW5zZmVyIHJlc3VsdA0KLSAqIHRocm91Z2ggRE1BLg0KLSAqIEBub3RlICAgSW50ZXJydXB0aW9ucyBlbmFibGVkIGluIHRoaXMgZnVuY3Rpb246DQotICogICAgICAgICBvdmVycnVuIChpZiBhcHBsaWNhYmxlKSwgRE1BIGhhbGYgdHJhbnNmZXIsIERNQSB0cmFuc2ZlciBjb21wbGV0ZS4NCi0gKiAgICAgICAgIEVhY2ggb2YgdGhlc2UgaW50ZXJydXB0aW9ucyBoYXMgaXRzIGRlZGljYXRlZCBjYWxsYmFjayBmdW5jdGlvbi4NCi0gKiBAbm90ZSAgIENhc2Ugb2YgbXVsdGltb2RlIGVuYWJsZWQgKHdoZW4gbXVsdGltb2RlIGZlYXR1cmUgaXMgYXZhaWxhYmxlKToNCi0gKiBIQUxfQURDX1N0YXJ0X0RNQSgpIGlzIGRlc2lnbmVkIGZvciBzaW5nbGUtQURDIG1vZGUgb25seS4gRm9yIG11bHRpbW9kZSwgdGhlDQotICogZGVkaWNhdGVkIEhBTF9BRENFeF9NdWx0aU1vZGVTdGFydF9ETUEoKSBmdW5jdGlvbiBtdXN0IGJlIHVzZWQuDQotICogQHBhcmFtIGhhZGMgQURDIGhhbmRsZQ0KLSAqIEBwYXJhbSBwRGF0YSBEZXN0aW5hdGlvbiBCdWZmZXIgYWRkcmVzcy4NCi0gKiBAcGFyYW0gTGVuZ3RoIE51bWJlciBvZiBkYXRhIHRvIGJlIHRyYW5zZmVycmVkIGZyb20gQURDIHBlcmlwaGVyYWwgdG8gbWVtb3J5DQotICogQHJldHZhbCBIQUwgc3RhdHVzLg0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfU3RhcnRfRE1BKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjLCB1aW50MzJfdCAqcERhdGEsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgTGVuZ3RoKSB7DQotICBIQUxfU3RhdHVzVHlwZURlZiB0bXBfaGFsX3N0YXR1czsNCi0jaWYgZGVmaW5lZChBRENfTVVMVElNT0RFX1NVUFBPUlQpDQotICB1aW50MzJfdCB0bXBfbXVsdGltb2RlX2NvbmZpZyA9DQotICAgICAgTExfQURDX0dldE11bHRpbW9kZShfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsNCi0jZW5kaWYNCi0NCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOw0KLQ0KLSAgLyogUGVyZm9ybSBBREMgZW5hYmxlIGFuZCBjb252ZXJzaW9uIHN0YXJ0IGlmIG5vIGNvbnZlcnNpb24gaXMgb24gZ29pbmcgKi8NCi0gIGlmIChMTF9BRENfUkVHX0lzQ29udmVyc2lvbk9uZ29pbmcoaGFkYy0+SW5zdGFuY2UpID09IDBVTCkgew0KLSAgICAvKiBQcm9jZXNzIGxvY2tlZCAqLw0KLSAgICBfX0hBTF9MT0NLKGhhZGMpOw0KLQ0KLSNpZiBkZWZpbmVkKEFEQ19NVUxUSU1PREVfU1VQUE9SVCkNCi0gICAgLyogRW5zdXJlIHRoYXQgbXVsdGltb2RlIHJlZ3VsYXIgY29udmVyc2lvbnMgYXJlIG5vdCBlbmFibGVkLiAgICovDQotICAgIC8qIE90aGVyd2lzZSwgZGVkaWNhdGVkIEFQSSBIQUxfQURDRXhfTXVsdGlNb2RlU3RhcnRfRE1BKCkgbXVzdCBiZSB1c2VkLiAgKi8NCi0gICAgaWYgKChBRENfSVNfSU5ERVBFTkRFTlQoaGFkYykgIT0gUkVTRVQpIHx8DQotICAgICAgICAodG1wX211bHRpbW9kZV9jb25maWcgPT0gTExfQURDX01VTFRJX0lOREVQRU5ERU5UKSB8fA0KLSAgICAgICAgKHRtcF9tdWx0aW1vZGVfY29uZmlnID09IExMX0FEQ19NVUxUSV9EVUFMX0lOSl9TSU1VTFQpIHx8DQotICAgICAgICAodG1wX211bHRpbW9kZV9jb25maWcgPT0gTExfQURDX01VTFRJX0RVQUxfSU5KX0FMVEVSTikpDQotI2VuZGlmIC8qIEFEQ19NVUxUSU1PREVfU1VQUE9SVCAqLw0KLSAgICB7DQotICAgICAgLyogRW5hYmxlIHRoZSBBREMgcGVyaXBoZXJhbCAqLw0KLSAgICAgIHRtcF9oYWxfc3RhdHVzID0gQURDX0VuYWJsZShoYWRjKTsNCi0NCi0gICAgICAvKiBTdGFydCBjb252ZXJzaW9uIGlmIEFEQyBpcyBlZmZlY3RpdmVseSBlbmFibGVkICovDQotICAgICAgaWYgKHRtcF9oYWxfc3RhdHVzID09IEhBTF9PSykgew0KLSAgICAgICAgLyogU2V0IEFEQyBzdGF0ZSAqLw0KLSAgICAgICAgLyogLSBDbGVhciBzdGF0ZSBiaXRmaWVsZCByZWxhdGVkIHRvIHJlZ3VsYXIgZ3JvdXAgY29udmVyc2lvbiByZXN1bHRzICovDQotICAgICAgICAvKiAtIFNldCBzdGF0ZSBiaXRmaWVsZCByZWxhdGVkIHRvIHJlZ3VsYXIgb3BlcmF0aW9uICovDQotICAgICAgICBBRENfU1RBVEVfQ0xSX1NFVChoYWRjLT5TdGF0ZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVBRFkgfCBIQUxfQURDX1NUQVRFX1JFR19FT0MgfA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVHX09WUiB8IEhBTF9BRENfU1RBVEVfUkVHX0VPU01QLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSk7DQotDQotI2lmIGRlZmluZWQoQURDX01VTFRJTU9ERV9TVVBQT1JUKQ0KLSAgICAgICAgLyogUmVzZXQgSEFMX0FEQ19TVEFURV9NVUxUSU1PREVfU0xBVkUgYml0DQotICAgICAgICAgIC0gaWYgQURDIGluc3RhbmNlIGlzIG1hc3RlciBvciBpZiBtdWx0aW1vZGUgZmVhdHVyZSBpcyBub3QgYXZhaWxhYmxlDQotICAgICAgICAgIC0gaWYgbXVsdGltb2RlIHNldHRpbmcgaXMgZGlzYWJsZWQgKEFEQyBpbnN0YW5jZSBzbGF2ZSBpbiBpbmRlcGVuZGVudA0KLSAgICAgICAgICBtb2RlKSAqLw0KLSAgICAgICAgaWYgKChfX0xMX0FEQ19NVUxUSV9JTlNUQU5DRV9NQVNURVIoaGFkYy0+SW5zdGFuY2UpID09DQotICAgICAgICAgICAgIGhhZGMtPkluc3RhbmNlKSB8fA0KLSAgICAgICAgICAgICh0bXBfbXVsdGltb2RlX2NvbmZpZyA9PSBMTF9BRENfTVVMVElfSU5ERVBFTkRFTlQpKSB7DQotICAgICAgICAgIENMRUFSX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9NVUxUSU1PREVfU0xBVkUpOw0KLSAgICAgICAgfQ0KLSNlbmRpZg0KLQ0KLSAgICAgICAgLyogQ2hlY2sgaWYgYSBjb252ZXJzaW9uIGlzIG9uIGdvaW5nIG9uIEFEQyBncm91cCBpbmplY3RlZCAqLw0KLSAgICAgICAgaWYgKChoYWRjLT5TdGF0ZSAmIEhBTF9BRENfU1RBVEVfSU5KX0JVU1kpICE9IDBVTCkgew0KLSAgICAgICAgICAvKiBSZXNldCBBREMgZXJyb3IgY29kZSBmaWVsZHMgcmVsYXRlZCB0byByZWd1bGFyIGNvbnZlcnNpb25zIG9ubHkgKi8NCi0gICAgICAgICAgQ0xFQVJfQklUKGhhZGMtPkVycm9yQ29kZSwgKEhBTF9BRENfRVJST1JfT1ZSIHwgSEFMX0FEQ19FUlJPUl9ETUEpKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgIC8qIFJlc2V0IGFsbCBBREMgZXJyb3IgY29kZSBmaWVsZHMgKi8NCi0gICAgICAgICAgQURDX0NMRUFSX0VSUk9SQ09ERShoYWRjKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qIFNldCB0aGUgRE1BIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovDQotICAgICAgICBoYWRjLT5ETUFfSGFuZGxlLT5YZmVyQ3BsdENhbGxiYWNrID0gQURDX0RNQUNvbnZDcGx0Ow0KLQ0KLSAgICAgICAgLyogU2V0IHRoZSBETUEgaGFsZiB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLw0KLSAgICAgICAgaGFkYy0+RE1BX0hhbmRsZS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBBRENfRE1BSGFsZkNvbnZDcGx0Ow0KLQ0KLSAgICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8NCi0gICAgICAgIGhhZGMtPkRNQV9IYW5kbGUtPlhmZXJFcnJvckNhbGxiYWNrID0gQURDX0RNQUVycm9yOw0KLQ0KLSAgICAgICAgLyogTWFuYWdlIEFEQyBhbmQgRE1BIHN0YXJ0OiBBREMgb3ZlcnJ1biBpbnRlcnJ1cHRpb24sIERNQSBzdGFydCwgICAgICovDQotICAgICAgICAvKiBBREMgc3RhcnQgKGluIGNhc2Ugb2YgU1cgc3RhcnQpOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0NCi0gICAgICAgIC8qIENsZWFyIHJlZ3VsYXIgZ3JvdXAgY29udmVyc2lvbiBmbGFnIGFuZCBvdmVycnVuIGZsYWcgICAgICAgICAgICAgICAqLw0KLSAgICAgICAgLyogKFRvIGVuc3VyZSBvZiBubyB1bmtub3duIHN0YXRlIGZyb20gcG90ZW50aWFsIHByZXZpb3VzIEFEQyAgICAgICAgICovDQotICAgICAgICAvKiBvcGVyYXRpb25zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgICAgIF9fSEFMX0FEQ19DTEVBUl9GTEFHKGhhZGMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQURDX0ZMQUdfRU9DIHwgQURDX0ZMQUdfRU9TIHwgQURDX0ZMQUdfT1ZSKSk7DQotDQotICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovDQotICAgICAgICAvKiBVbmxvY2sgYmVmb3JlIHN0YXJ0aW5nIEFEQyBjb252ZXJzaW9uczogaW4gY2FzZSBvZiBwb3RlbnRpYWwgKi8NCi0gICAgICAgIC8qIGludGVycnVwdGlvbiwgdG8gbGV0IHRoZSBwcm9jZXNzIHRvIEFEQyBJUlEgSGFuZGxlci4gKi8NCi0gICAgICAgIF9fSEFMX1VOTE9DSyhoYWRjKTsNCi0NCi0gICAgICAgIC8qIFdpdGggRE1BLCBvdmVycnVuIGV2ZW50IGlzIGFsd2F5cyBjb25zaWRlcmVkIGFzIGFuIGVycm9yIGV2ZW4gaWYNCi0gICAgICAgICAgIGhhZGMtPkluaXQuT3ZlcnJ1biBpcyBzZXQgdG8gQURDX09WUl9EQVRBX09WRVJXUklUVEVOLiBUaGVyZWZvcmUsDQotICAgICAgICAgICBBRENfSVRfT1ZSIGlzIGVuYWJsZWQuICovDQotICAgICAgICBfX0hBTF9BRENfRU5BQkxFX0lUKGhhZGMsIEFEQ19JVF9PVlIpOw0KLQ0KLSAgICAgICAgLyogRW5hYmxlIEFEQyBETUEgbW9kZSAqLw0KLSAgICAgICAgU0VUX0JJVChoYWRjLT5JbnN0YW5jZS0+Q0ZHUiwgQURDX0NGR1JfRE1BRU4pOw0KLQ0KLSAgICAgICAgLyogU3RhcnQgdGhlIERNQSBjaGFubmVsICovDQotICAgICAgICB0bXBfaGFsX3N0YXR1cyA9DQotICAgICAgICAgICAgSEFMX0RNQV9TdGFydF9JVChoYWRjLT5ETUFfSGFuZGxlLCAodWludDMyX3QpJmhhZGMtPkluc3RhbmNlLT5EUiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdClwRGF0YSwgTGVuZ3RoKTsNCi0NCi0gICAgICAgIC8qIEVuYWJsZSBjb252ZXJzaW9uIG9mIHJlZ3VsYXIgZ3JvdXAuICovDQotICAgICAgICAvKiBJZiBzb2Z0d2FyZSBzdGFydCBoYXMgYmVlbiBzZWxlY3RlZCwgY29udmVyc2lvbiBzdGFydHMgaW1tZWRpYXRlbHkuDQotICAgICAgICAgKi8NCi0gICAgICAgIC8qIElmIGV4dGVybmFsIHRyaWdnZXIgaGFzIGJlZW4gc2VsZWN0ZWQsIGNvbnZlcnNpb24gd2lsbCBzdGFydCBhdCBuZXh0DQotICAgICAgICAgKi8NCi0gICAgICAgIC8qIHRyaWdnZXIgZXZlbnQuICovDQotICAgICAgICAvKiBTdGFydCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uICovDQotICAgICAgICBMTF9BRENfUkVHX1N0YXJ0Q29udmVyc2lvbihoYWRjLT5JbnN0YW5jZSk7DQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8NCi0gICAgICAgIF9fSEFMX1VOTE9DSyhoYWRjKTsNCi0gICAgICB9DQotDQotICAgIH0NCi0jaWYgZGVmaW5lZChBRENfTVVMVElNT0RFX1NVUFBPUlQpDQotICAgIGVsc2Ugew0KLSAgICAgIHRtcF9oYWxfc3RhdHVzID0gSEFMX0VSUk9SOw0KLSAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8NCi0gICAgICBfX0hBTF9VTkxPQ0soaGFkYyk7DQotICAgIH0NCi0jZW5kaWYNCi0gIH0gZWxzZSB7DQotICAgIHRtcF9oYWxfc3RhdHVzID0gSEFMX0JVU1k7DQotICB9DQotDQotICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovDQotICByZXR1cm4gdG1wX2hhbF9zdGF0dXM7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU3RvcCBBREMgY29udmVyc2lvbiBvZiByZWd1bGFyIGdyb3VwIChhbmQgaW5qZWN0ZWQgZ3JvdXAgaW4NCi0gKiAgICAgICAgIGNhc2Ugb2YgYXV0b19pbmplY3Rpb24gbW9kZSksIGRpc2FibGUgQURDIERNQSB0cmFuc2ZlciwgZGlzYWJsZQ0KLSAqICAgICAgICAgQURDIHBlcmlwaGVyYWwuDQotICogQG5vdGU6ICBBREMgcGVyaXBoZXJhbCBkaXNhYmxlIGlzIGZvcmNpbmcgc3RvcCBvZiBwb3RlbnRpYWwNCi0gKiAgICAgICAgIGNvbnZlcnNpb24gb24gQURDIGdyb3VwIGluamVjdGVkLiBJZiBBREMgZ3JvdXAgaW5qZWN0ZWQgaXMgdW5kZXIgdXNlLA0KLSAqIGl0IHNob3VsZCBiZSBwcmVsaW1pbmFyaWx5IHN0b3BwZWQgdXNpbmcgSEFMX0FEQ0V4X0luamVjdGVkU3RvcCBmdW5jdGlvbi4NCi0gKiBAbm90ZSAgIENhc2Ugb2YgbXVsdGltb2RlIGVuYWJsZWQgKHdoZW4gbXVsdGltb2RlIGZlYXR1cmUgaXMgYXZhaWxhYmxlKToNCi0gKiAgICAgICAgIEhBTF9BRENfU3RvcF9ETUEoKSBmdW5jdGlvbiBpcyBkZWRpY2F0ZWQgdG8gc2luZ2xlLUFEQyBtb2RlIG9ubHkuDQotICogICAgICAgICBGb3IgbXVsdGltb2RlLCB0aGUgZGVkaWNhdGVkIEhBTF9BRENFeF9NdWx0aU1vZGVTdG9wX0RNQSgpIEFQSSBtdXN0DQotICogYmUgdXNlZC4NCi0gKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlDQotICogQHJldHZhbCBIQUwgc3RhdHVzLg0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfU3RvcF9ETUEoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpIHsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIHRtcF9oYWxfc3RhdHVzOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7DQotDQotICAvKiBQcm9jZXNzIGxvY2tlZCAqLw0KLSAgX19IQUxfTE9DSyhoYWRjKTsNCi0NCi0gIC8qIDEuIFN0b3AgcG90ZW50aWFsIEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gb24gZ29pbmcgKi8NCi0gIHRtcF9oYWxfc3RhdHVzID0gQURDX0NvbnZlcnNpb25TdG9wKGhhZGMsIEFEQ19SRUdVTEFSX0lOSkVDVEVEX0dST1VQKTsNCi0NCi0gIC8qIERpc2FibGUgQURDIHBlcmlwaGVyYWwgaWYgY29udmVyc2lvbnMgYXJlIGVmZmVjdGl2ZWx5IHN0b3BwZWQgKi8NCi0gIGlmICh0bXBfaGFsX3N0YXR1cyA9PSBIQUxfT0spIHsNCi0gICAgLyogRGlzYWJsZSBBREMgRE1BIChBREMgRE1BIGNvbmZpZ3VyYXRpb24gb2YgY29udGludW91cyByZXF1ZXN0cyBpcyBrZXB0KSAqLw0KLSAgICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPkNGR1IsIEFEQ19DRkdSX0RNQUVOKTsNCi0NCi0gICAgLyogRGlzYWJsZSB0aGUgRE1BIGNoYW5uZWwgKGluIGNhc2Ugb2YgRE1BIGluIGNpcmN1bGFyIG1vZGUgb3Igc3RvcCAgICAgICAqLw0KLSAgICAvKiB3aGlsZSBETUEgdHJhbnNmZXIgaXMgb24gZ29pbmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIGlmIChoYWRjLT5ETUFfSGFuZGxlLT5TdGF0ZSA9PSBIQUxfRE1BX1NUQVRFX0JVU1kpIHsNCi0gICAgICB0bXBfaGFsX3N0YXR1cyA9IEhBTF9ETUFfQWJvcnQoaGFkYy0+RE1BX0hhbmRsZSk7DQotDQotICAgICAgLyogQ2hlY2sgaWYgRE1BIGNoYW5uZWwgZWZmZWN0aXZlbHkgZGlzYWJsZWQgKi8NCi0gICAgICBpZiAodG1wX2hhbF9zdGF0dXMgIT0gSEFMX09LKSB7DQotICAgICAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gZXJyb3IgKi8NCi0gICAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfRVJST1JfRE1BKTsNCi0gICAgICB9DQotICAgIH0NCi0NCi0gICAgLyogRGlzYWJsZSBBREMgb3ZlcnJ1biBpbnRlcnJ1cHQgKi8NCi0gICAgX19IQUxfQURDX0RJU0FCTEVfSVQoaGFkYywgQURDX0lUX09WUik7DQotDQotICAgIC8qIDIuIERpc2FibGUgdGhlIEFEQyBwZXJpcGhlcmFsICovDQotICAgIC8qIFVwZGF0ZSAidG1wX2hhbF9zdGF0dXMiIG9ubHkgaWYgRE1BIGNoYW5uZWwgZGlzYWJsaW5nIHBhc3NlZCwgICAgICAgICAgKi8NCi0gICAgLyogdG8ga2VlcCBpbiBtZW1vcnkgYSBwb3RlbnRpYWwgZmFpbGluZyBzdGF0dXMuICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICBpZiAodG1wX2hhbF9zdGF0dXMgPT0gSEFMX09LKSB7DQotICAgICAgdG1wX2hhbF9zdGF0dXMgPSBBRENfRGlzYWJsZShoYWRjKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAodm9pZClBRENfRGlzYWJsZShoYWRjKTsNCi0gICAgfQ0KLQ0KLSAgICAvKiBDaGVjayBpZiBBREMgaXMgZWZmZWN0aXZlbHkgZGlzYWJsZWQgKi8NCi0gICAgaWYgKHRtcF9oYWxfc3RhdHVzID09IEhBTF9PSykgew0KLSAgICAgIC8qIFNldCBBREMgc3RhdGUgKi8NCi0gICAgICBBRENfU1RBVEVfQ0xSX1NFVChoYWRjLT5TdGF0ZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFR19CVVNZIHwgSEFMX0FEQ19TVEFURV9JTkpfQlVTWSwNCi0gICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFQURZKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLw0KLSAgX19IQUxfVU5MT0NLKGhhZGMpOw0KLQ0KLSAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLw0KLSAgcmV0dXJuIHRtcF9oYWxfc3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBBREMgcmVndWxhciBncm91cCBjb252ZXJzaW9uIHJlc3VsdC4NCi0gKiBAbm90ZSAgIFJlYWRpbmcgcmVnaXN0ZXIgRFIgYXV0b21hdGljYWxseSBjbGVhcnMgQURDIGZsYWcgRU9DDQotICogICAgICAgICAoQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHVuaXRhcnkgY29udmVyc2lvbikuDQotICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGNsZWFyIEFEQyBmbGFnIEVPUw0KLSAqICAgICAgICAgKEFEQyBncm91cCByZWd1bGFyIGVuZCBvZiBzZXF1ZW5jZSBjb252ZXJzaW9uKS4NCi0gKiAgICAgICAgIE9jY3VycmVuY2Ugb2YgZmxhZyBFT1MgcmlzaW5nOg0KLSAqICAgICAgICAgIC0gSWYgc2VxdWVuY2VyIGlzIGNvbXBvc2VkIG9mIDEgcmFuaywgZmxhZyBFT1MgaXMgZXF1aXZhbGVudA0KLSAqICAgICAgICAgICAgdG8gZmxhZyBFT0MuDQotICogICAgICAgICAgLSBJZiBzZXF1ZW5jZXIgaXMgY29tcG9zZWQgb2Ygc2V2ZXJhbCByYW5rcywgZHVyaW5nIHRoZSBzY2FuDQotICogICAgICAgICAgICBzZXF1ZW5jZSBmbGFnIEVPQyBvbmx5IGlzIHJhaXNlZCwgYXQgdGhlIGVuZCBvZiB0aGUgc2NhbiBzZXF1ZW5jZQ0KLSAqICAgICAgICAgICAgYm90aCBmbGFncyBFT0MgYW5kIEVPUyBhcmUgcmFpc2VkLg0KLSAqICAgICAgICAgVG8gY2xlYXIgdGhpcyBmbGFnLCBlaXRoZXIgdXNlIGZ1bmN0aW9uOg0KLSAqICAgICAgICAgaW4gcHJvZ3JhbW1pbmcgbW9kZWwgSVQ6IEByZWYgSEFMX0FEQ19JUlFIYW5kbGVyKCksIGluIHByb2dyYW1taW5nDQotICogICAgICAgICBtb2RlbCBwb2xsaW5nOiBAcmVmIEhBTF9BRENfUG9sbEZvckNvbnZlcnNpb24oKQ0KLSAqICAgICAgICAgb3IgQHJlZiBfX0hBTF9BRENfQ0xFQVJfRkxBRygmaGFkYywgQURDX0ZMQUdfRU9TKS4NCi0gKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlDQotICogQHJldHZhbCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIGRhdGENCi0gKi8NCi11aW50MzJfdCBIQUxfQURDX0dldFZhbHVlKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKSB7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsNCi0NCi0gIC8qIE5vdGU6IEVPQyBmbGFnIGlzIG5vdCBjbGVhcmVkIGhlcmUgYnkgc29mdHdhcmUgYmVjYXVzZSBhdXRvbWF0aWNhbGx5ICAgICAqLw0KLSAgLyogICAgICAgY2xlYXJlZCBieSBoYXJkd2FyZSB3aGVuIHJlYWRpbmcgcmVnaXN0ZXIgRFIuICAgICAgICAgICAgICAgICAgICAgICovDQotDQotICAvKiBSZXR1cm4gQURDIGNvbnZlcnRlZCB2YWx1ZSAqLw0KLSAgcmV0dXJuIGhhZGMtPkluc3RhbmNlLT5EUjsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTdGFydCBBREMgY29udmVyc2lvbiBzYW1wbGluZyBwaGFzZSBvZiByZWd1bGFyIGdyb3VwDQotICogQG5vdGU6ICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB0byBzdGFydCBzYW1wbGluZyB3aGVuDQotICogICAgICAgICAtIEByZWYgQURDX1NBTVBMSU5HX01PREVfVFJJR0dFUl9DT05UUk9MRUQgc2FtcGxpbmcNCi0gKiAgICAgICAgIG1vZGUgaGFzIGJlZW4gc2VsZWN0ZWQNCi0gKiAgICAgICAgIC0gQHJlZiBBRENfU09GVFdBUkVfU1RBUlQgaGFzIGJlZW4gc2VsZWN0ZWQgYXMgdHJpZ2dlciBzb3VyY2UNCi0gKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlDQotICogQHJldHZhbCBIQUwgc3RhdHVzLg0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfU3RhcnRTYW1wbGluZyhBRENfSGFuZGxlVHlwZURlZiAqaGFkYykgew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7DQotDQotICAvKiBTdGFydCBzYW1wbGluZyAqLw0KLSAgU0VUX0JJVChoYWRjLT5JbnN0YW5jZS0+Q0ZHUjIsIEFEQ19DRkdSMl9TV1RSSUcpOw0KLQ0KLSAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLw0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTdG9wIEFEQyBjb252ZXJzaW9uIHNhbXBsaW5nIHBoYXNlIG9mIHJlZ3VsYXIgZ3JvdXAgYW5kIHN0YXJ0DQotICogY29udmVyc2lvbg0KLSAqIEBub3RlOiAgVGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSBjYWxsZWQgdG8gc3RvcCBzYW1wbGluZyB3aGVuDQotICogICAgICAgICAtIEByZWYgQURDX1NBTVBMSU5HX01PREVfVFJJR0dFUl9DT05UUk9MRUQgc2FtcGxpbmcNCi0gKiAgICAgICAgIG1vZGUgaGFzIGJlZW4gc2VsZWN0ZWQNCi0gKiAgICAgICAgIC0gQHJlZiBBRENfU09GVFdBUkVfU1RBUlQgaGFzIGJlZW4gc2VsZWN0ZWQgYXMgdHJpZ2dlciBzb3VyY2UNCi0gKiAgICAgICAgIC0gYWZ0ZXIgc2FtcGxpbmcgaGFzIGJlZW4gc3RhcnRlZCB1c2luZyBAcmVmIEhBTF9BRENfU3RhcnRTYW1wbGluZy4NCi0gKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlDQotICogQHJldHZhbCBIQUwgc3RhdHVzLg0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfU3RvcFNhbXBsaW5nKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKSB7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsNCi0NCi0gIC8qIFN0YXJ0IHNhbXBsaW5nICovDQotICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPkNGR1IyLCBBRENfQ0ZHUjJfU1dUUklHKTsNCi0NCi0gIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8NCi0gIHJldHVybiBIQUxfT0s7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSGFuZGxlIEFEQyBpbnRlcnJ1cHQgcmVxdWVzdC4NCi0gKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlDQotICogQHJldHZhbCBOb25lDQotICovDQotdm9pZCBIQUxfQURDX0lSUUhhbmRsZXIoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpIHsNCi0gIHVpbnQzMl90IG92ZXJydW5fZXJyb3IgPQ0KLSAgICAgIDBVTDsgLyogZmxhZyBzZXQgaWYgb3ZlcnJ1biBvY2N1cnJlbmNlIGhhcyB0byBiZSBjb25zaWRlcmVkIGFzIGFuIGVycm9yICovDQotICB1aW50MzJfdCB0bXBfaXNyID0gaGFkYy0+SW5zdGFuY2UtPklTUjsNCi0gIHVpbnQzMl90IHRtcF9pZXIgPSBoYWRjLT5JbnN0YW5jZS0+SUVSOw0KLSAgdWludDMyX3QgdG1wX2FkY19pbmpfaXNfdHJpZ2dlcl9zb3VyY2Vfc3dfc3RhcnQ7DQotICB1aW50MzJfdCB0bXBfYWRjX3JlZ19pc190cmlnZ2VyX3NvdXJjZV9zd19zdGFydDsNCi0gIHVpbnQzMl90IHRtcF9jZmdyOw0KLSNpZiBkZWZpbmVkKEFEQ19NVUxUSU1PREVfU1VQUE9SVCkNCi0gIGNvbnN0IEFEQ19UeXBlRGVmICp0bXBBRENfTWFzdGVyOw0KLSAgdWludDMyX3QgdG1wX211bHRpbW9kZV9jb25maWcgPQ0KLSAgICAgIExMX0FEQ19HZXRNdWx0aW1vZGUoX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7DQotI2VuZGlmDQotDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsNCi0gIGFzc2VydF9wYXJhbShJU19BRENfRU9DX1NFTEVDVElPTihoYWRjLT5Jbml0LkVPQ1NlbGVjdGlvbikpOw0KLQ0KLSAgLyogPT09PT09PT09PSBDaGVjayBFbmQgb2YgU2FtcGxpbmcgZmxhZyBmb3IgQURDIGdyb3VwIHJlZ3VsYXIgPT09PT09PT09PSAqLw0KLSAgaWYgKCgodG1wX2lzciAmIEFEQ19GTEFHX0VPU01QKSA9PSBBRENfRkxBR19FT1NNUCkgJiYNCi0gICAgICAoKHRtcF9pZXIgJiBBRENfSVRfRU9TTVApID09IEFEQ19JVF9FT1NNUCkpIHsNCi0gICAgLyogVXBkYXRlIHN0YXRlIG1hY2hpbmUgb24gZW5kIG9mIHNhbXBsaW5nIHN0YXR1cyBpZiBub3QgaW4gZXJyb3Igc3RhdGUgKi8NCi0gICAgaWYgKChoYWRjLT5TdGF0ZSAmIEhBTF9BRENfU1RBVEVfRVJST1JfSU5URVJOQUwpID09IDBVTCkgew0KLSAgICAgIC8qIFNldCBBREMgc3RhdGUgKi8NCi0gICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX1JFR19FT1NNUCk7DQotICAgIH0NCi0NCi0gICAgLyogRW5kIE9mIFNhbXBsaW5nIGNhbGxiYWNrICovDQotI2lmIChVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkNCi0gICAgaGFkYy0+RW5kT2ZTYW1wbGluZ0NhbGxiYWNrKGhhZGMpOw0KLSNlbHNlDQotICAgIEhBTF9BRENFeF9FbmRPZlNhbXBsaW5nQ2FsbGJhY2soaGFkYyk7DQotI2VuZGlmIC8qIFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLQ0KLSAgICAvKiBDbGVhciByZWd1bGFyIGdyb3VwIGNvbnZlcnNpb24gZmxhZyAqLw0KLSAgICBfX0hBTF9BRENfQ0xFQVJfRkxBRyhoYWRjLCBBRENfRkxBR19FT1NNUCk7DQotICB9DQotDQotICAvKiA9PT09PT0gQ2hlY2sgQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHVuaXRhcnkgY29udmVyc2lvbiBzZXF1ZW5jZQ0KLSAgICogY29udmVyc2lvbnMgPT09PT0gKi8NCi0gIGlmICgoKCh0bXBfaXNyICYgQURDX0ZMQUdfRU9DKSA9PSBBRENfRkxBR19FT0MpICYmDQotICAgICAgICgodG1wX2llciAmIEFEQ19JVF9FT0MpID09IEFEQ19JVF9FT0MpKSB8fA0KLSAgICAgICgoKHRtcF9pc3IgJiBBRENfRkxBR19FT1MpID09IEFEQ19GTEFHX0VPUykgJiYNCi0gICAgICAgKCh0bXBfaWVyICYgQURDX0lUX0VPUykgPT0gQURDX0lUX0VPUykpKSB7DQotICAgIC8qIFVwZGF0ZSBzdGF0ZSBtYWNoaW5lIG9uIGNvbnZlcnNpb24gc3RhdHVzIGlmIG5vdCBpbiBlcnJvciBzdGF0ZSAqLw0KLSAgICBpZiAoKGhhZGMtPlN0YXRlICYgSEFMX0FEQ19TVEFURV9FUlJPUl9JTlRFUk5BTCkgPT0gMFVMKSB7DQotICAgICAgLyogU2V0IEFEQyBzdGF0ZSAqLw0KLSAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfUkVHX0VPQyk7DQotICAgIH0NCi0NCi0gICAgLyogRGV0ZXJtaW5lIHdoZXRoZXIgYW55IGZ1cnRoZXIgY29udmVyc2lvbiB1cGNvbWluZyBvbiBncm91cCByZWd1bGFyICAgICAqLw0KLSAgICAvKiBieSBleHRlcm5hbCB0cmlnZ2VyLCBjb250aW51b3VzIG1vZGUgb3Igc2NhbiBzZXF1ZW5jZSBvbiBnb2luZyAgICAgICAgICovDQotICAgIC8qIHRvIGRpc2FibGUgaW50ZXJydXB0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgaWYgKExMX0FEQ19SRUdfSXNUcmlnZ2VyU291cmNlU1dTdGFydChoYWRjLT5JbnN0YW5jZSkgIT0gMFVMKSB7DQotICAgICAgLyogR2V0IHJlbGV2YW50IHJlZ2lzdGVyIENGR1IgaW4gQURDIGluc3RhbmNlIG9mIEFEQyBtYXN0ZXIgb3Igc2xhdmUgICAgKi8NCi0gICAgICAvKiBpbiBmdW5jdGlvbiBvZiBtdWx0aW1vZGUgc3RhdGUgKGZvciBkZXZpY2VzIHdpdGggbXVsdGltb2RlICAgICAgICAgICAqLw0KLSAgICAgIC8qIGF2YWlsYWJsZSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2lmIGRlZmluZWQoQURDX01VTFRJTU9ERV9TVVBQT1JUKQ0KLSAgICAgIGlmICgoX19MTF9BRENfTVVMVElfSU5TVEFOQ0VfTUFTVEVSKGhhZGMtPkluc3RhbmNlKSA9PSBoYWRjLT5JbnN0YW5jZSkgfHwNCi0gICAgICAgICAgKHRtcF9tdWx0aW1vZGVfY29uZmlnID09IExMX0FEQ19NVUxUSV9JTkRFUEVOREVOVCkgfHwNCi0gICAgICAgICAgKHRtcF9tdWx0aW1vZGVfY29uZmlnID09IExMX0FEQ19NVUxUSV9EVUFMX0lOSl9TSU1VTFQpIHx8DQotICAgICAgICAgICh0bXBfbXVsdGltb2RlX2NvbmZpZyA9PSBMTF9BRENfTVVMVElfRFVBTF9JTkpfQUxURVJOKSkgew0KLSAgICAgICAgLyogY2hlY2sgQ09OVCBiaXQgZGlyZWN0bHkgaW4gaGFuZGxlIEFEQyBDRkdSIHJlZ2lzdGVyICovDQotICAgICAgICB0bXBfY2ZnciA9IFJFQURfUkVHKGhhZGMtPkluc3RhbmNlLT5DRkdSKTsNCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgLyogZWxzZSBuZWVkIHRvIGNoZWNrIE1hc3RlciBBREMgQ09OVCBiaXQgKi8NCi0gICAgICAgIHRtcEFEQ19NYXN0ZXIgPSBfX0xMX0FEQ19NVUxUSV9JTlNUQU5DRV9NQVNURVIoaGFkYy0+SW5zdGFuY2UpOw0KLSAgICAgICAgdG1wX2NmZ3IgPSBSRUFEX1JFRyh0bXBBRENfTWFzdGVyLT5DRkdSKTsNCi0gICAgICB9DQotI2Vsc2UNCi0gICAgICB0bXBfY2ZnciA9IFJFQURfUkVHKGhhZGMtPkluc3RhbmNlLT5DRkdSKTsNCi0jZW5kaWYNCi0NCi0gICAgICAvKiBDYXJyeSBvbiBpZiBjb250aW51b3VzIG1vZGUgaXMgZGlzYWJsZWQgKi8NCi0gICAgICBpZiAoUkVBRF9CSVQodG1wX2NmZ3IsIEFEQ19DRkdSX0NPTlQpICE9IEFEQ19DRkdSX0NPTlQpIHsNCi0gICAgICAgIC8qIElmIEVuZCBvZiBTZXF1ZW5jZSBpcyByZWFjaGVkLCBkaXNhYmxlIGludGVycnVwdHMgKi8NCi0gICAgICAgIGlmIChfX0hBTF9BRENfR0VUX0ZMQUcoaGFkYywgQURDX0ZMQUdfRU9TKSkgew0KLSAgICAgICAgICAvKiBBbGxvd2VkIHRvIG1vZGlmeSBiaXRzIEFEQ19JVF9FT0MvQURDX0lUX0VPUyBvbmx5IGlmIGJpdCAgICAgICAgICovDQotICAgICAgICAgIC8qIEFEU1RBUlQ9PTAgKG5vIGNvbnZlcnNpb24gb24gZ29pbmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgICAgICAgaWYgKExMX0FEQ19SRUdfSXNDb252ZXJzaW9uT25nb2luZyhoYWRjLT5JbnN0YW5jZSkgPT0gMFVMKSB7DQotICAgICAgICAgICAgLyogRGlzYWJsZSBBREMgZW5kIG9mIHNlcXVlbmNlIGNvbnZlcnNpb24gaW50ZXJydXB0ICovDQotICAgICAgICAgICAgLyogTm90ZTogT3ZlcnJ1biBpbnRlcnJ1cHQgd2FzIGVuYWJsZWQgd2l0aCBFT0MgaW50ZXJydXB0IGluICAgICAgKi8NCi0gICAgICAgICAgICAvKiBIQUxfU3RhcnRfSVQoKSwgYnV0IGlzIG5vdCBkaXNhYmxlZCBoZXJlIGJlY2F1c2UgY2FuIGJlIHVzZWQgICAqLw0KLSAgICAgICAgICAgIC8qIGJ5IG92ZXJydW4gSVJRIHByb2Nlc3MgYmVsb3cuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgICAgICAgICAgX19IQUxfQURDX0RJU0FCTEVfSVQoaGFkYywgQURDX0lUX0VPQyB8IEFEQ19JVF9FT1MpOw0KLQ0KLSAgICAgICAgICAgIC8qIFNldCBBREMgc3RhdGUgKi8NCi0gICAgICAgICAgICBDTEVBUl9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfUkVHX0JVU1kpOw0KLQ0KLSAgICAgICAgICAgIGlmICgoaGFkYy0+U3RhdGUgJiBIQUxfQURDX1NUQVRFX0lOSl9CVVNZKSA9PSAwVUwpIHsNCi0gICAgICAgICAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfUkVBRFkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAvKiBDaGFuZ2UgQURDIHN0YXRlIHRvIGVycm9yIHN0YXRlICovDQotICAgICAgICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9JTlRFUk5BTCk7DQotDQotICAgICAgICAgICAgLyogU2V0IEFEQyBlcnJvciBjb2RlIHRvIEFEQyBwZXJpcGhlcmFsIGludGVybmFsIGVycm9yICovDQotICAgICAgICAgICAgU0VUX0JJVChoYWRjLT5FcnJvckNvZGUsIEhBTF9BRENfRVJST1JfSU5URVJOQUwpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qIENvbnZlcnNpb24gY29tcGxldGUgY2FsbGJhY2sgKi8NCi0gICAgLyogTm90ZTogSW50byBjYWxsYmFjayBmdW5jdGlvbiAiSEFMX0FEQ19Db252Q3BsdENhbGxiYWNrKCkiLCAgICAgICAgICAgICAqLw0KLSAgICAvKiAgICAgICB0byBkZXRlcm1pbmUgaWYgY29udmVyc2lvbiBoYXMgYmVlbiB0cmlnZ2VyZWQgZnJvbSBFT0Mgb3IgRU9TLCAgICovDQotICAgIC8qICAgICAgIHBvc3NpYmlsaXR5IHRvIHVzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgLyogICAgICAgICIgaWYgKCBfX0hBTF9BRENfR0VUX0ZMQUcoJmhhZGMsIEFEQ19GTEFHX0VPUykpICIgICAgICAgICAgICAgICAqLw0KLSNpZiAoVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpDQotICAgIGhhZGMtPkNvbnZDcGx0Q2FsbGJhY2soaGFkYyk7DQotI2Vsc2UNCi0gICAgSEFMX0FEQ19Db252Q3BsdENhbGxiYWNrKGhhZGMpOw0KLSNlbmRpZiAvKiBVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi0NCi0gICAgLyogQ2xlYXIgcmVndWxhciBncm91cCBjb252ZXJzaW9uIGZsYWcgKi8NCi0gICAgLyogTm90ZTogaW4gY2FzZSBvZiBvdmVycnVuIHNldCB0byBBRENfT1ZSX0RBVEFfUFJFU0VSVkVELCBlbmQgb2YgICAgICAgICAqLw0KLSAgICAvKiAgICAgICBjb252ZXJzaW9uIGZsYWdzIGNsZWFyIGluZHVjZXMgdGhlIHJlbGVhc2Ugb2YgdGhlIHByZXNlcnZlZCBkYXRhLiovDQotICAgIC8qICAgICAgIFRoZXJlZm9yZSwgaWYgdGhlIHByZXNlcnZlZCBkYXRhIHZhbHVlIGlzIG5lZWRlZCwgaXQgbXVzdCBiZSAgICAgKi8NCi0gICAgLyogICAgICAgcmVhZCBwcmVsaW1pbmFyaWx5IGludG8gSEFMX0FEQ19Db252Q3BsdENhbGxiYWNrKCkuICAgICAgICAgICAgICAqLw0KLSAgICBfX0hBTF9BRENfQ0xFQVJfRkxBRyhoYWRjLCAoQURDX0ZMQUdfRU9DIHwgQURDX0ZMQUdfRU9TKSk7DQotICB9DQotDQotICAvKiA9PT09PT0gQ2hlY2sgQURDIGdyb3VwIGluamVjdGVkIGVuZCBvZiB1bml0YXJ5IGNvbnZlcnNpb24gc2VxdWVuY2UNCi0gICAqIGNvbnZlcnNpb25zID09PT09ICovDQotICBpZiAoKCgodG1wX2lzciAmIEFEQ19GTEFHX0pFT0MpID09IEFEQ19GTEFHX0pFT0MpICYmDQotICAgICAgICgodG1wX2llciAmIEFEQ19JVF9KRU9DKSA9PSBBRENfSVRfSkVPQykpIHx8DQotICAgICAgKCgodG1wX2lzciAmIEFEQ19GTEFHX0pFT1MpID09IEFEQ19GTEFHX0pFT1MpICYmDQotICAgICAgICgodG1wX2llciAmIEFEQ19JVF9KRU9TKSA9PSBBRENfSVRfSkVPUykpKSB7DQotICAgIC8qIFVwZGF0ZSBzdGF0ZSBtYWNoaW5lIG9uIGNvbnZlcnNpb24gc3RhdHVzIGlmIG5vdCBpbiBlcnJvciBzdGF0ZSAqLw0KLSAgICBpZiAoKGhhZGMtPlN0YXRlICYgSEFMX0FEQ19TVEFURV9FUlJPUl9JTlRFUk5BTCkgPT0gMFVMKSB7DQotICAgICAgLyogU2V0IEFEQyBzdGF0ZSAqLw0KLSAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfSU5KX0VPQyk7DQotICAgIH0NCi0NCi0gICAgLyogUmV0cmlldmUgQURDIGNvbmZpZ3VyYXRpb24gKi8NCi0gICAgdG1wX2FkY19pbmpfaXNfdHJpZ2dlcl9zb3VyY2Vfc3dfc3RhcnQgPQ0KLSAgICAgICAgTExfQURDX0lOSl9Jc1RyaWdnZXJTb3VyY2VTV1N0YXJ0KGhhZGMtPkluc3RhbmNlKTsNCi0gICAgdG1wX2FkY19yZWdfaXNfdHJpZ2dlcl9zb3VyY2Vfc3dfc3RhcnQgPQ0KLSAgICAgICAgTExfQURDX1JFR19Jc1RyaWdnZXJTb3VyY2VTV1N0YXJ0KGhhZGMtPkluc3RhbmNlKTsNCi0gICAgLyogR2V0IHJlbGV2YW50IHJlZ2lzdGVyIENGR1IgaW4gQURDIGluc3RhbmNlIG9mIEFEQyBtYXN0ZXIgb3Igc2xhdmUgICovDQotICAgIC8qIGluIGZ1bmN0aW9uIG9mIG11bHRpbW9kZSBzdGF0ZSAoZm9yIGRldmljZXMgd2l0aCBtdWx0aW1vZGUgICAgICAgICAqLw0KLSAgICAvKiBhdmFpbGFibGUpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jaWYgZGVmaW5lZChBRENfTVVMVElNT0RFX1NVUFBPUlQpDQotICAgIGlmICgoX19MTF9BRENfTVVMVElfSU5TVEFOQ0VfTUFTVEVSKGhhZGMtPkluc3RhbmNlKSA9PSBoYWRjLT5JbnN0YW5jZSkgfHwNCi0gICAgICAgICh0bXBfbXVsdGltb2RlX2NvbmZpZyA9PSBMTF9BRENfTVVMVElfSU5ERVBFTkRFTlQpIHx8DQotICAgICAgICAodG1wX211bHRpbW9kZV9jb25maWcgPT0gTExfQURDX01VTFRJX0RVQUxfUkVHX1NJTVVMVCkgfHwNCi0gICAgICAgICh0bXBfbXVsdGltb2RlX2NvbmZpZyA9PSBMTF9BRENfTVVMVElfRFVBTF9SRUdfSU5URVJMKSkgew0KLSAgICAgIHRtcF9jZmdyID0gUkVBRF9SRUcoaGFkYy0+SW5zdGFuY2UtPkNGR1IpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgIHRtcEFEQ19NYXN0ZXIgPSBfX0xMX0FEQ19NVUxUSV9JTlNUQU5DRV9NQVNURVIoaGFkYy0+SW5zdGFuY2UpOw0KLSAgICAgIHRtcF9jZmdyID0gUkVBRF9SRUcodG1wQURDX01hc3Rlci0+Q0ZHUik7DQotICAgIH0NCi0jZWxzZQ0KLSAgICB0bXBfY2ZnciA9IFJFQURfUkVHKGhhZGMtPkluc3RhbmNlLT5DRkdSKTsNCi0jZW5kaWYNCi0NCi0gICAgLyogRGlzYWJsZSBpbnRlcnJ1cHRpb24gaWYgbm8gZnVydGhlciBjb252ZXJzaW9uIHVwY29taW5nIGJ5IGluamVjdGVkICAgICAqLw0KLSAgICAvKiBleHRlcm5hbCB0cmlnZ2VyIG9yIGJ5IGF1dG9tYXRpYyBpbmplY3RlZCBjb252ZXJzaW9uIHdpdGggcmVndWxhciAgICAgICovDQotICAgIC8qIGdyb3VwIGhhdmluZyBubyBmdXJ0aGVyIGNvbnZlcnNpb24gdXBjb21pbmcgKHNhbWUgY29uZGl0aW9ucyBhcyAgICAgICAgKi8NCi0gICAgLyogcmVndWxhciBncm91cCBpbnRlcnJ1cHRpb24gZGlzYWJsaW5nIGFib3ZlKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICAvKiBhbmQgaWYgaW5qZWN0ZWQgc2NhbiBzZXF1ZW5jZSBpcyBjb21wbGV0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIGlmICh0bXBfYWRjX2lual9pc190cmlnZ2VyX3NvdXJjZV9zd19zdGFydCAhPSAwVUwpIHsNCi0gICAgICBpZiAoKFJFQURfQklUKHRtcF9jZmdyLCBBRENfQ0ZHUl9KQVVUTykgPT0gMFVMKSB8fA0KLSAgICAgICAgICAoKHRtcF9hZGNfcmVnX2lzX3RyaWdnZXJfc291cmNlX3N3X3N0YXJ0ICE9IDBVTCkgJiYNCi0gICAgICAgICAgIChSRUFEX0JJVCh0bXBfY2ZnciwgQURDX0NGR1JfQ09OVCkgPT0gMFVMKSkpIHsNCi0gICAgICAgIC8qIElmIEVuZCBvZiBTZXF1ZW5jZSBpcyByZWFjaGVkLCBkaXNhYmxlIGludGVycnVwdHMgKi8NCi0gICAgICAgIGlmIChfX0hBTF9BRENfR0VUX0ZMQUcoaGFkYywgQURDX0ZMQUdfSkVPUykpIHsNCi0gICAgICAgICAgLyogUGFydGljdWxhciBjYXNlIGlmIGluamVjdGVkIGNvbnRleHRzIHF1ZXVlIGlzIGVuYWJsZWQ6ICovDQotICAgICAgICAgIC8qIHdoZW4gdGhlIGxhc3QgY29udGV4dCBoYXMgYmVlbiBmdWxseSBwcm9jZXNzZWQsIEpTUVIgaXMgcmVzZXQgKi8NCi0gICAgICAgICAgLyogYnkgdGhlIGhhcmR3YXJlLiBFdmVuIGlmIG5vIGluamVjdGVkIGNvbnZlcnNpb24gaXMgcGxhbm5lZCB0byBjb21lDQotICAgICAgICAgICAqLw0KLSAgICAgICAgICAvKiAocXVldWUgZW1wdHksIHRyaWdnZXJzIGFyZSBpZ25vcmVkKSwgaXQgY2FuIHN0YXJ0IGFnYWluICovDQotICAgICAgICAgIC8qIGltbWVkaWF0ZWx5IGFmdGVyIHNldHRpbmcgYSBuZXcgY29udGV4dCAoSkFEU1RBUlQgaXMgc3RpbGwgc2V0KS4gKi8NCi0gICAgICAgICAgLyogVGhlcmVmb3JlLCBzdGF0ZSBvZiBIQUwgQURDIGluamVjdGVkIGdyb3VwIGlzIGtlcHQgdG8gYnVzeS4gKi8NCi0gICAgICAgICAgaWYgKFJFQURfQklUKHRtcF9jZmdyLCBBRENfQ0ZHUl9KUU0pID09IDBVTCkgew0KLSAgICAgICAgICAgIC8qIEFsbG93ZWQgdG8gbW9kaWZ5IGJpdHMgQURDX0lUX0pFT0MvQURDX0lUX0pFT1Mgb25seSBpZiBiaXQgKi8NCi0gICAgICAgICAgICAvKiBKQURTVEFSVD09MCAobm8gY29udmVyc2lvbiBvbiBnb2luZykgKi8NCi0gICAgICAgICAgICBpZiAoTExfQURDX0lOSl9Jc0NvbnZlcnNpb25PbmdvaW5nKGhhZGMtPkluc3RhbmNlKSA9PSAwVUwpIHsNCi0gICAgICAgICAgICAgIC8qIERpc2FibGUgQURDIGVuZCBvZiBzZXF1ZW5jZSBjb252ZXJzaW9uIGludGVycnVwdCAgKi8NCi0gICAgICAgICAgICAgIF9fSEFMX0FEQ19ESVNBQkxFX0lUKGhhZGMsIEFEQ19JVF9KRU9DIHwgQURDX0lUX0pFT1MpOw0KLQ0KLSAgICAgICAgICAgICAgLyogU2V0IEFEQyBzdGF0ZSAqLw0KLSAgICAgICAgICAgICAgQ0xFQVJfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0lOSl9CVVNZKTsNCi0NCi0gICAgICAgICAgICAgIGlmICgoaGFkYy0+U3RhdGUgJiBIQUxfQURDX1NUQVRFX1JFR19CVVNZKSA9PSAwVUwpIHsNCi0gICAgICAgICAgICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9SRUFEWSk7DQotICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSB0byBlcnJvciAqLw0KLSAgICAgICAgICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9JTlRFUk5BTCk7DQotDQotICAgICAgICAgICAgICAvKiBTZXQgQURDIGVycm9yIGNvZGUgdG8gQURDIHBlcmlwaGVyYWwgaW50ZXJuYWwgZXJyb3IgKi8NCi0gICAgICAgICAgICAgIFNFVF9CSVQoaGFkYy0+RXJyb3JDb2RlLCBIQUxfQURDX0VSUk9SX0lOVEVSTkFMKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICB9DQotICAgIH0NCi0NCi0gICAgLyogSW5qZWN0ZWQgQ29udmVyc2lvbiBjb21wbGV0ZSBjYWxsYmFjayAqLw0KLSAgICAvKiBOb3RlOiAgSEFMX0FEQ0V4X0luamVjdGVkQ29udkNwbHRDYWxsYmFjayBjYW4gcmVzb3J0IHRvDQotICAgICAgICAgICAgICBpZiAoX19IQUxfQURDX0dFVF9GTEFHKCZoYWRjLCBBRENfRkxBR19KRU9TKSkgb3INCi0gICAgICAgICAgICAgIGlmIChfX0hBTF9BRENfR0VUX0ZMQUcoJmhhZGMsIEFEQ19GTEFHX0pFT0MpKSB0byBkZXRlcm1pbmUgd2hldGhlcg0KLSAgICAgICAgICAgICAgaW50ZXJydXB0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZCBieSBlbmQgb2YgY29udmVyc2lvbiBvciBlbmQgb2YNCi0gICAgICAgICAgICAgIHNlcXVlbmNlLiAgICAqLw0KLSNpZiAoVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpDQotICAgIGhhZGMtPkluamVjdGVkQ29udkNwbHRDYWxsYmFjayhoYWRjKTsNCi0jZWxzZQ0KLSAgICBIQUxfQURDRXhfSW5qZWN0ZWRDb252Q3BsdENhbGxiYWNrKGhhZGMpOw0KLSNlbmRpZiAvKiBVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi0NCi0gICAgLyogQ2xlYXIgaW5qZWN0ZWQgZ3JvdXAgY29udmVyc2lvbiBmbGFnICovDQotICAgIF9fSEFMX0FEQ19DTEVBUl9GTEFHKGhhZGMsIEFEQ19GTEFHX0pFT0MgfCBBRENfRkxBR19KRU9TKTsNCi0gIH0NCi0NCi0gIC8qID09PT09PT09PT0gQ2hlY2sgQW5hbG9nIHdhdGNoZG9nIDEgZmxhZyA9PT09PT09PT09ICovDQotICBpZiAoKCh0bXBfaXNyICYgQURDX0ZMQUdfQVdEMSkgPT0gQURDX0ZMQUdfQVdEMSkgJiYNCi0gICAgICAoKHRtcF9pZXIgJiBBRENfSVRfQVdEMSkgPT0gQURDX0lUX0FXRDEpKSB7DQotICAgIC8qIFNldCBBREMgc3RhdGUgKi8NCi0gICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9BV0QxKTsNCi0NCi0gICAgLyogTGV2ZWwgb3V0IG9mIHdpbmRvdyAxIGNhbGxiYWNrICovDQotI2lmIChVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkNCi0gICAgaGFkYy0+TGV2ZWxPdXRPZldpbmRvd0NhbGxiYWNrKGhhZGMpOw0KLSNlbHNlDQotICAgIEhBTF9BRENfTGV2ZWxPdXRPZldpbmRvd0NhbGxiYWNrKGhhZGMpOw0KLSNlbmRpZiAvKiBVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi0NCi0gICAgLyogQ2xlYXIgQURDIGFuYWxvZyB3YXRjaGRvZyBmbGFnICovDQotICAgIF9fSEFMX0FEQ19DTEVBUl9GTEFHKGhhZGMsIEFEQ19GTEFHX0FXRDEpOw0KLSAgfQ0KLQ0KLSAgLyogPT09PT09PT09PSBDaGVjayBhbmFsb2cgd2F0Y2hkb2cgMiBmbGFnID09PT09PT09PT0gKi8NCi0gIGlmICgoKHRtcF9pc3IgJiBBRENfRkxBR19BV0QyKSA9PSBBRENfRkxBR19BV0QyKSAmJg0KLSAgICAgICgodG1wX2llciAmIEFEQ19JVF9BV0QyKSA9PSBBRENfSVRfQVdEMikpIHsNCi0gICAgLyogU2V0IEFEQyBzdGF0ZSAqLw0KLSAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0FXRDIpOw0KLQ0KLSAgICAvKiBMZXZlbCBvdXQgb2Ygd2luZG93IDIgY2FsbGJhY2sgKi8NCi0jaWYgKFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQ0KLSAgICBoYWRjLT5MZXZlbE91dE9mV2luZG93MkNhbGxiYWNrKGhhZGMpOw0KLSNlbHNlDQotICAgIEhBTF9BRENFeF9MZXZlbE91dE9mV2luZG93MkNhbGxiYWNrKGhhZGMpOw0KLSNlbmRpZiAvKiBVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi0NCi0gICAgLyogQ2xlYXIgQURDIGFuYWxvZyB3YXRjaGRvZyBmbGFnICovDQotICAgIF9fSEFMX0FEQ19DTEVBUl9GTEFHKGhhZGMsIEFEQ19GTEFHX0FXRDIpOw0KLSAgfQ0KLQ0KLSAgLyogPT09PT09PT09PSBDaGVjayBhbmFsb2cgd2F0Y2hkb2cgMyBmbGFnID09PT09PT09PT0gKi8NCi0gIGlmICgoKHRtcF9pc3IgJiBBRENfRkxBR19BV0QzKSA9PSBBRENfRkxBR19BV0QzKSAmJg0KLSAgICAgICgodG1wX2llciAmIEFEQ19JVF9BV0QzKSA9PSBBRENfSVRfQVdEMykpIHsNCi0gICAgLyogU2V0IEFEQyBzdGF0ZSAqLw0KLSAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0FXRDMpOw0KLQ0KLSAgICAvKiBMZXZlbCBvdXQgb2Ygd2luZG93IDMgY2FsbGJhY2sgKi8NCi0jaWYgKFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQ0KLSAgICBoYWRjLT5MZXZlbE91dE9mV2luZG93M0NhbGxiYWNrKGhhZGMpOw0KLSNlbHNlDQotICAgIEhBTF9BRENFeF9MZXZlbE91dE9mV2luZG93M0NhbGxiYWNrKGhhZGMpOw0KLSNlbmRpZiAvKiBVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi0NCi0gICAgLyogQ2xlYXIgQURDIGFuYWxvZyB3YXRjaGRvZyBmbGFnICovDQotICAgIF9fSEFMX0FEQ19DTEVBUl9GTEFHKGhhZGMsIEFEQ19GTEFHX0FXRDMpOw0KLSAgfQ0KLQ0KLSAgLyogPT09PT09PT09PSBDaGVjayBPdmVycnVuIGZsYWcgPT09PT09PT09PSAqLw0KLSAgaWYgKCgodG1wX2lzciAmIEFEQ19GTEFHX09WUikgPT0gQURDX0ZMQUdfT1ZSKSAmJg0KLSAgICAgICgodG1wX2llciAmIEFEQ19JVF9PVlIpID09IEFEQ19JVF9PVlIpKSB7DQotICAgIC8qIElmIG92ZXJydW4gaXMgc2V0IHRvIG92ZXJ3cml0ZSBwcmV2aW91cyBkYXRhIChkZWZhdWx0IHNldHRpbmcpLCAgICAgICAgKi8NCi0gICAgLyogb3ZlcnJ1biBldmVudCBpcyBub3QgY29uc2lkZXJlZCBhcyBhbiBlcnJvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICAvKiAoY2YgcmVmIG1hbnVhbCAiTWFuYWdpbmcgY29udmVyc2lvbnMgd2l0aG91dCB1c2luZyB0aGUgRE1BIGFuZCB3aXRob3V0ICovDQotICAgIC8qIG92ZXJydW4gIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgLyogRXhjZXB0aW9uIGZvciB1c2FnZSB3aXRoIERNQSBvdmVycnVuIGV2ZW50IGFsd2F5cyBjb25zaWRlcmVkIGFzIGFuICAgICAqLw0KLSAgICAvKiBlcnJvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIGlmIChoYWRjLT5Jbml0Lk92ZXJydW4gPT0gQURDX09WUl9EQVRBX1BSRVNFUlZFRCkgew0KLSAgICAgIG92ZXJydW5fZXJyb3IgPSAxVUw7DQotICAgIH0gZWxzZSB7DQotICAgICAgLyogQ2hlY2sgRE1BIGNvbmZpZ3VyYXRpb24gKi8NCi0jaWYgZGVmaW5lZChBRENfTVVMVElNT0RFX1NVUFBPUlQpDQotICAgICAgaWYgKHRtcF9tdWx0aW1vZGVfY29uZmlnICE9IExMX0FEQ19NVUxUSV9JTkRFUEVOREVOVCkgew0KLSAgICAgICAgLyogTXVsdGltb2RlICh3aGVuIGZlYXR1cmUgaXMgYXZhaWxhYmxlKSBpcyBlbmFibGVkLA0KLSAgICAgICAgICAgQ29tbW9uIENvbnRyb2wgUmVnaXN0ZXIgTURNQSBiaXRzIG11c3QgYmUgY2hlY2tlZC4gKi8NCi0gICAgICAgIGlmIChMTF9BRENfR2V0TXVsdGlETUFUcmFuc2ZlcihfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoDQotICAgICAgICAgICAgICAgIGhhZGMtPkluc3RhbmNlKSkgIT0gTExfQURDX01VTFRJX1JFR19ETUFfRUFDSF9BREMpIHsNCi0gICAgICAgICAgb3ZlcnJ1bl9lcnJvciA9IDFVTDsNCi0gICAgICAgIH0NCi0gICAgICB9IGVsc2UNCi0jZW5kaWYNCi0gICAgICB7DQotICAgICAgICAvKiBNdWx0aW1vZGUgbm90IHNldCBvciBmZWF0dXJlIG5vdCBhdmFpbGFibGUgb3IgQURDIGluZGVwZW5kZW50ICovDQotICAgICAgICBpZiAoKGhhZGMtPkluc3RhbmNlLT5DRkdSICYgQURDX0NGR1JfRE1BRU4pICE9IDBVTCkgew0KLSAgICAgICAgICBvdmVycnVuX2Vycm9yID0gMVVMOw0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBpZiAob3ZlcnJ1bl9lcnJvciA9PSAxVUwpIHsNCi0gICAgICAvKiBDaGFuZ2UgQURDIHN0YXRlIHRvIGVycm9yIHN0YXRlICovDQotICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9SRUdfT1ZSKTsNCi0NCi0gICAgICAvKiBTZXQgQURDIGVycm9yIGNvZGUgdG8gb3ZlcnJ1biAqLw0KLSAgICAgIFNFVF9CSVQoaGFkYy0+RXJyb3JDb2RlLCBIQUxfQURDX0VSUk9SX09WUik7DQotDQotICAgICAgLyogRXJyb3IgY2FsbGJhY2sgKi8NCi0gICAgICAvKiBOb3RlOiBJbiBjYXNlIG9mIG92ZXJydW4sIEFEQyBjb252ZXJzaW9uIGRhdGEgaXMgcHJlc2VydmVkIHVudGlsICAgICAqLw0KLSAgICAgIC8qICAgICAgIGZsYWcgT1ZSIGlzIHJlc2V0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgICAgLyogICAgICAgVGhlcmVmb3JlLCBvbGQgQURDIGNvbnZlcnNpb24gZGF0YSBjYW4gYmUgcmV0cmlldmVkIGluICAgICAgICAgKi8NCi0gICAgICAvKiAgICAgICBmdW5jdGlvbiAiSEFMX0FEQ19FcnJvckNhbGxiYWNrKCkiLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNpZiAoVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpDQotICAgICAgaGFkYy0+RXJyb3JDYWxsYmFjayhoYWRjKTsNCi0jZWxzZQ0KLSAgICAgIEhBTF9BRENfRXJyb3JDYWxsYmFjayhoYWRjKTsNCi0jZW5kaWYgLyogVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotICAgIH0NCi0NCi0gICAgLyogQ2xlYXIgQURDIG92ZXJydW4gZmxhZyAqLw0KLSAgICBfX0hBTF9BRENfQ0xFQVJfRkxBRyhoYWRjLCBBRENfRkxBR19PVlIpOw0KLSAgfQ0KLQ0KLSAgLyogPT09PT09PT09PSBDaGVjayBJbmplY3RlZCBjb250ZXh0IHF1ZXVlIG92ZXJmbG93IGZsYWcgPT09PT09PT09PSAqLw0KLSAgaWYgKCgodG1wX2lzciAmIEFEQ19GTEFHX0pRT1ZGKSA9PSBBRENfRkxBR19KUU9WRikgJiYNCi0gICAgICAoKHRtcF9pZXIgJiBBRENfSVRfSlFPVkYpID09IEFEQ19JVF9KUU9WRikpIHsNCi0gICAgLyogQ2hhbmdlIEFEQyBzdGF0ZSB0byBvdmVycnVuIHN0YXRlICovDQotICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfSU5KX0pRT1ZGKTsNCi0NCi0gICAgLyogU2V0IEFEQyBlcnJvciBjb2RlIHRvIEluamVjdGVkIGNvbnRleHQgcXVldWUgb3ZlcmZsb3cgKi8NCi0gICAgU0VUX0JJVChoYWRjLT5FcnJvckNvZGUsIEhBTF9BRENfRVJST1JfSlFPVkYpOw0KLQ0KLSAgICAvKiBDbGVhciB0aGUgSW5qZWN0ZWQgY29udGV4dCBxdWV1ZSBvdmVyZmxvdyBmbGFnICovDQotICAgIF9fSEFMX0FEQ19DTEVBUl9GTEFHKGhhZGMsIEFEQ19GTEFHX0pRT1ZGKTsNCi0NCi0gICAgLyogSW5qZWN0ZWQgY29udGV4dCBxdWV1ZSBvdmVyZmxvdyBjYWxsYmFjayAqLw0KLSNpZiAoVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpDQotICAgIGhhZGMtPkluamVjdGVkUXVldWVPdmVyZmxvd0NhbGxiYWNrKGhhZGMpOw0KLSNlbHNlDQotICAgIEhBTF9BRENFeF9JbmplY3RlZFF1ZXVlT3ZlcmZsb3dDYWxsYmFjayhoYWRjKTsNCi0jZW5kaWYgLyogVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotICB9DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ29udmVyc2lvbiBjb21wbGV0ZSBjYWxsYmFjayBpbiBub24tYmxvY2tpbmcgbW9kZS4NCi0gKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlDQotICogQHJldHZhbCBOb25lDQotICovDQotX193ZWFrIHZvaWQgSEFMX0FEQ19Db252Q3BsdENhbGxiYWNrKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKSB7DQotICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovDQotICBVTlVTRUQoaGFkYyk7DQotDQotICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLiBXaGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsDQotICAgICAgICAgICAgZnVuY3Rpb24gSEFMX0FEQ19Db252Q3BsdENhbGxiYWNrIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXINCi0gICAgIGZpbGUuDQotICAgKi8NCi19DQotDQotLyoqDQotICogQGJyaWVmICBDb252ZXJzaW9uIERNQSBoYWxmLXRyYW5zZmVyIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlLg0KLSAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX3dlYWsgdm9pZCBIQUxfQURDX0NvbnZIYWxmQ3BsdENhbGxiYWNrKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKSB7DQotICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovDQotICBVTlVTRUQoaGFkYyk7DQotDQotICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLiBXaGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsDQotICAgICAgICAgICAgZnVuY3Rpb24gSEFMX0FEQ19Db252SGFsZkNwbHRDYWxsYmFjayBtdXN0IGJlIGltcGxlbWVudGVkIGluIHRoZQ0KLSAgICAgdXNlciBmaWxlLg0KLSAgKi8NCi19DQotDQotLyoqDQotICogQGJyaWVmICBBbmFsb2cgd2F0Y2hkb2cgMSBjYWxsYmFjayBpbiBub24tYmxvY2tpbmcgbW9kZS4NCi0gKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlDQotICogQHJldHZhbCBOb25lDQotICovDQotX193ZWFrIHZvaWQgSEFMX0FEQ19MZXZlbE91dE9mV2luZG93Q2FsbGJhY2soQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpIHsNCi0gIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8NCi0gIFVOVVNFRChoYWRjKTsNCi0NCi0gIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQuIFdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwNCi0gICAgICAgICAgICBmdW5jdGlvbiBIQUxfQURDX0xldmVsT3V0T2ZXaW5kb3dDYWxsYmFjayBtdXN0IGJlIGltcGxlbWVudGVkIGluIHRoZQ0KLSAgICAgdXNlciBmaWxlLg0KLSAgKi8NCi19DQotDQotLyoqDQotICogQGJyaWVmICBBREMgZXJyb3IgY2FsbGJhY2sgaW4gbm9uLWJsb2NraW5nIG1vZGUNCi0gKiAgICAgICAgIChBREMgY29udmVyc2lvbiB3aXRoIGludGVycnVwdGlvbiBvciB0cmFuc2ZlciBieSBETUEpLg0KLSAqIEBub3RlICAgSW4gY2FzZSBvZiBlcnJvciBkdWUgdG8gb3ZlcnJ1biB3aGVuIHVzaW5nIEFEQyB3aXRoIERNQSB0cmFuc2Zlcg0KLSAqICAgICAgICAgKEhBTCBBREMgaGFuZGxlIHBhcmFtZXRlciAiRXJyb3JDb2RlIiB0byBzdGF0ZSAiSEFMX0FEQ19FUlJPUl9PVlIiKToNCi0gKiAgICAgICAgIC0gUmVpbml0aWFsaXplIHRoZSBETUEgdXNpbmcgZnVuY3Rpb24gIkhBTF9BRENfU3RvcF9ETUEoKSIuDQotICogICAgICAgICAtIElmIG5lZWRlZCwgcmVzdGFydCBhIG5ldyBBREMgY29udmVyc2lvbiB1c2luZyBmdW5jdGlvbg0KLSAqICAgICAgICAgICAiSEFMX0FEQ19TdGFydF9ETUEoKSINCi0gKiAgICAgICAgICAgKHRoaXMgZnVuY3Rpb24gaXMgYWxzbyBjbGVhcmluZyBvdmVycnVuIGZsYWcpDQotICogQHBhcmFtIGhhZGMgQURDIGhhbmRsZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fd2VhayB2b2lkIEhBTF9BRENfRXJyb3JDYWxsYmFjayhBRENfSGFuZGxlVHlwZURlZiAqaGFkYykgew0KLSAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLw0KLSAgVU5VU0VEKGhhZGMpOw0KLQ0KLSAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZC4gV2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLA0KLSAgICAgICAgICAgIGZ1bmN0aW9uIEhBTF9BRENfRXJyb3JDYWxsYmFjayBtdXN0IGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuDQotICAqLw0KLX0NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQURDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucw0KLSAgKiBAYnJpZWYgICAgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucw0KLSAgKg0KLUB2ZXJiYXRpbQ0KLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgIyMjIyMNCi0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOg0KLSAgICAgICgrKSBDb25maWd1cmUgY2hhbm5lbHMgb24gcmVndWxhciBncm91cA0KLSAgICAgICgrKSBDb25maWd1cmUgdGhlIGFuYWxvZyB3YXRjaGRvZw0KLQ0KLUBlbmR2ZXJiYXRpbQ0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENvbmZpZ3VyZSBhIGNoYW5uZWwgdG8gYmUgYXNzaWduZWQgdG8gQURDIGdyb3VwIHJlZ3VsYXIuDQotICogQG5vdGUgICBJbiBjYXNlIG9mIHVzYWdlIG9mIGludGVybmFsIG1lYXN1cmVtZW50IGNoYW5uZWxzOg0KLSAqICAgICAgICAgVmJhdC9WcmVmSW50L1RlbXBTZW5zb3IuDQotICogICAgICAgICBUaGVzZSBpbnRlcm5hbCBwYXRocyBjYW4gYmUgZGlzYWJsZWQgdXNpbmcgZnVuY3Rpb24NCi0gKiAgICAgICAgIEhBTF9BRENfRGVJbml0KCkuDQotICogQG5vdGUgICBQb3NzaWJpbGl0eSB0byB1cGRhdGUgcGFyYW1ldGVycyBvbiB0aGUgZmx5Og0KLSAqICAgICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyBjaGFubmVsIGludG8gQURDIGdyb3VwIHJlZ3VsYXIsDQotICogICAgICAgICBmb2xsb3dpbmcgY2FsbHMgdG8gdGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byByZWNvbmZpZ3VyZQ0KLSAqICAgICAgICAgc29tZSBwYXJhbWV0ZXJzIG9mIHN0cnVjdHVyZSAiQURDX0NoYW5uZWxDb25mVHlwZURlZiIgb24gdGhlIGZseSwNCi0gKiAgICAgICAgIHdpdGhvdXQgcmVzZXR0aW5nIHRoZSBBREMuDQotICogICAgICAgICBUaGUgc2V0dGluZyBvZiB0aGVzZSBwYXJhbWV0ZXJzIGlzIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZToNCi0gKiAgICAgICAgIFJlZmVyIHRvIGNvbW1lbnRzIG9mIHN0cnVjdHVyZSAiQURDX0NoYW5uZWxDb25mVHlwZURlZiIuDQotICogQHBhcmFtIGhhZGMgQURDIGhhbmRsZQ0KLSAqIEBwYXJhbSBzQ29uZmlnIFN0cnVjdHVyZSBvZiBBREMgY2hhbm5lbCBhc3NpZ25lZCB0byBBREMgZ3JvdXAgcmVndWxhci4NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDX0NvbmZpZ0NoYW5uZWwoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DaGFubmVsQ29uZlR5cGVEZWYgKnNDb25maWcpIHsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIHRtcF9oYWxfc3RhdHVzID0gSEFMX09LOw0KLSAgdWludDMyX3QgdG1wT2Zmc2V0U2hpZnRlZDsNCi0gIHVpbnQzMl90IHRtcF9jb25maWdfaW50ZXJuYWxfY2hhbm5lbDsNCi0gIF9fSU8gdWludDMyX3Qgd2FpdF9sb29wX2luZGV4ID0gMFVMOw0KLSAgdWludDMyX3QgdG1wX2FkY19pc19jb252ZXJzaW9uX29uX2dvaW5nX3JlZ3VsYXI7DQotICB1aW50MzJfdCB0bXBfYWRjX2lzX2NvbnZlcnNpb25fb25fZ29pbmdfaW5qZWN0ZWQ7DQotDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsNCi0gIGFzc2VydF9wYXJhbShJU19BRENfUkVHVUxBUl9SQU5LKHNDb25maWctPlJhbmspKTsNCi0gIGFzc2VydF9wYXJhbShJU19BRENfU0FNUExFX1RJTUUoc0NvbmZpZy0+U2FtcGxpbmdUaW1lKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfQURDX1NJTkdMRV9ESUZGRVJFTlRJQUwoc0NvbmZpZy0+U2luZ2xlRGlmZikpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0FEQ19PRkZTRVRfTlVNQkVSKHNDb25maWctPk9mZnNldE51bWJlcikpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0FEQ19SQU5HRShBRENfR0VUX1JFU09MVVRJT04oaGFkYyksIHNDb25maWctPk9mZnNldCkpOw0KLQ0KLSAgLyogaWYgUk9WU0UgaXMgc2V0LCB0aGUgdmFsdWUgb2YgdGhlIE9GRlNFVHlfRU4gYml0IGluIEFEQ3hfT0ZSeSByZWdpc3RlciBpcw0KLSAgICAgaWdub3JlZCAoY29uc2lkZXJlZCBhcyByZXNldCkgKi8NCi0gIGFzc2VydF9wYXJhbSghKChzQ29uZmlnLT5PZmZzZXROdW1iZXIgIT0gQURDX09GRlNFVF9OT05FKSAmJg0KLSAgICAgICAgICAgICAgICAgKGhhZGMtPkluaXQuT3ZlcnNhbXBsaW5nTW9kZSA9PSBFTkFCTEUpKSk7DQotDQotICAvKiBWZXJpZmljYXRpb24gb2YgY2hhbm5lbCBudW1iZXIgKi8NCi0gIGlmIChzQ29uZmlnLT5TaW5nbGVEaWZmICE9IEFEQ19ESUZGRVJFTlRJQUxfRU5ERUQpIHsNCi0gICAgYXNzZXJ0X3BhcmFtKElTX0FEQ19DSEFOTkVMKGhhZGMsIHNDb25maWctPkNoYW5uZWwpKTsNCi0gIH0gZWxzZSB7DQotICAgIGFzc2VydF9wYXJhbShJU19BRENfRElGRl9DSEFOTkVMKGhhZGMsIHNDb25maWctPkNoYW5uZWwpKTsNCi0gIH0NCi0NCi0gIC8qIFByb2Nlc3MgbG9ja2VkICovDQotICBfX0hBTF9MT0NLKGhhZGMpOw0KLQ0KLSAgLyogUGFyYW1ldGVycyB1cGRhdGUgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAvKiBQYXJhbWV0ZXJzIHRoYXQgY2FuIGJlIHVwZGF0ZWQgd2hlbiBBREMgaXMgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0ICAgKi8NCi0gIC8qIGNvbnZlcnNpb24gb24gZ29pbmcgb24gcmVndWxhciBncm91cDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgLyogIC0gQ2hhbm5lbCBudW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAvKiAgLSBDaGFubmVsIHJhbmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gIGlmIChMTF9BRENfUkVHX0lzQ29udmVyc2lvbk9uZ29pbmcoaGFkYy0+SW5zdGFuY2UpID09IDBVTCkgew0KLSAgICAvKiBTZXQgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2U6IGNoYW5uZWwgb24gdGhlIHNlbGVjdGVkIHNjYW4gc2VxdWVuY2UNCi0gICAgICogcmFuayAqLw0KLSAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlclJhbmtzKGhhZGMtPkluc3RhbmNlLCBzQ29uZmlnLT5SYW5rLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNDb25maWctPkNoYW5uZWwpOw0KLQ0KLSAgICAvKiBQYXJhbWV0ZXJzIHVwZGF0ZSBjb25kaXRpb25lZCB0byBBREMgc3RhdGU6ICovDQotICAgIC8qIFBhcmFtZXRlcnMgdGhhdCBjYW4gYmUgdXBkYXRlZCB3aGVuIEFEQyBpcyBkaXNhYmxlZCBvciBlbmFibGVkIHdpdGhvdXQgKi8NCi0gICAgLyogY29udmVyc2lvbiBvbiBnb2luZyBvbiByZWd1bGFyIGdyb3VwOiAqLw0KLSAgICAvKiAgLSBDaGFubmVsIHNhbXBsaW5nIHRpbWUgKi8NCi0gICAgLyogIC0gQ2hhbm5lbCBvZmZzZXQgKi8NCi0gICAgdG1wX2FkY19pc19jb252ZXJzaW9uX29uX2dvaW5nX3JlZ3VsYXIgPQ0KLSAgICAgICAgTExfQURDX1JFR19Jc0NvbnZlcnNpb25PbmdvaW5nKGhhZGMtPkluc3RhbmNlKTsNCi0gICAgdG1wX2FkY19pc19jb252ZXJzaW9uX29uX2dvaW5nX2luamVjdGVkID0NCi0gICAgICAgIExMX0FEQ19JTkpfSXNDb252ZXJzaW9uT25nb2luZyhoYWRjLT5JbnN0YW5jZSk7DQotICAgIGlmICgodG1wX2FkY19pc19jb252ZXJzaW9uX29uX2dvaW5nX3JlZ3VsYXIgPT0gMFVMKSAmJg0KLSAgICAgICAgKHRtcF9hZGNfaXNfY29udmVyc2lvbl9vbl9nb2luZ19pbmplY3RlZCA9PSAwVUwpKSB7DQotICAgICAgLyogTWFuYWdlIHNwZWNpZmljIGNhc2Ugb2Ygc2FtcGxpbmcgdGltZSAzLjUgY3ljbGVzIHJlcGxhY2luZyAyLjUgY3lsZXMgKi8NCi0gICAgICBpZiAoc0NvbmZpZy0+U2FtcGxpbmdUaW1lID09IEFEQ19TQU1QTEVUSU1FXzNDWUNMRVNfNSkgew0KLSAgICAgICAgLyogU2V0IHNhbXBsaW5nIHRpbWUgb2YgdGhlIHNlbGVjdGVkIEFEQyBjaGFubmVsICovDQotICAgICAgICBMTF9BRENfU2V0Q2hhbm5lbFNhbXBsaW5nVGltZShoYWRjLT5JbnN0YW5jZSwgc0NvbmZpZy0+Q2hhbm5lbCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX0FEQ19TQU1QTElOR1RJTUVfMkNZQ0xFU181KTsNCi0NCi0gICAgICAgIC8qIFNldCBBREMgc2FtcGxpbmcgdGltZSBjb21tb24gY29uZmlndXJhdGlvbiAqLw0KLSAgICAgICAgTExfQURDX1NldFNhbXBsaW5nVGltZUNvbW1vbkNvbmZpZygNCi0gICAgICAgICAgICBoYWRjLT5JbnN0YW5jZSwgTExfQURDX1NBTVBMSU5HVElNRV9DT01NT05fM0M1X1JFUExfMkM1KTsNCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgLyogU2V0IHNhbXBsaW5nIHRpbWUgb2YgdGhlIHNlbGVjdGVkIEFEQyBjaGFubmVsICovDQotICAgICAgICBMTF9BRENfU2V0Q2hhbm5lbFNhbXBsaW5nVGltZShoYWRjLT5JbnN0YW5jZSwgc0NvbmZpZy0+Q2hhbm5lbCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNDb25maWctPlNhbXBsaW5nVGltZSk7DQotDQotICAgICAgICAvKiBTZXQgQURDIHNhbXBsaW5nIHRpbWUgY29tbW9uIGNvbmZpZ3VyYXRpb24gKi8NCi0gICAgICAgIExMX0FEQ19TZXRTYW1wbGluZ1RpbWVDb21tb25Db25maWcoaGFkYy0+SW5zdGFuY2UsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX0FEQ19TQU1QTElOR1RJTUVfQ09NTU9OX0RFRkFVTFQpOw0KLSAgICAgIH0NCi0NCi0gICAgICAvKiBDb25maWd1cmUgdGhlIG9mZnNldDogb2Zmc2V0IGVuYWJsZS9kaXNhYmxlLCBjaGFubmVsLCBvZmZzZXQgdmFsdWUgKi8NCi0NCi0gICAgICAvKiBTaGlmdCB0aGUgb2Zmc2V0IHdpdGggcmVzcGVjdCB0byB0aGUgc2VsZWN0ZWQgQURDIHJlc29sdXRpb24uICovDQotICAgICAgLyogT2Zmc2V0IGhhcyB0byBiZSBsZWZ0LWFsaWduZWQgb24gYml0IDExLCB0aGUgTFNCIChyaWdodCBiaXRzKSBhcmUgc2V0DQotICAgICAgICogdG8gMCAqLw0KLSAgICAgIHRtcE9mZnNldFNoaWZ0ZWQgPQ0KLSAgICAgICAgICBBRENfT0ZGU0VUX1NISUZUX1JFU09MVVRJT04oaGFkYywgKHVpbnQzMl90KXNDb25maWctPk9mZnNldCk7DQotDQotICAgICAgaWYgKHNDb25maWctPk9mZnNldE51bWJlciAhPSBBRENfT0ZGU0VUX05PTkUpIHsNCi0gICAgICAgIC8qIFNldCBBREMgc2VsZWN0ZWQgb2Zmc2V0IG51bWJlciAqLw0KLSAgICAgICAgTExfQURDX1NldE9mZnNldChoYWRjLT5JbnN0YW5jZSwgc0NvbmZpZy0+T2Zmc2V0TnVtYmVyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBzQ29uZmlnLT5DaGFubmVsLCB0bXBPZmZzZXRTaGlmdGVkKTsNCi0NCi0gICAgICAgIGFzc2VydF9wYXJhbShJU19BRENfT0ZGU0VUX1NJR04oc0NvbmZpZy0+T2Zmc2V0U2lnbikpOw0KLSAgICAgICAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoc0NvbmZpZy0+T2Zmc2V0U2F0dXJhdGlvbikpOw0KLSAgICAgICAgLyogU2V0IEFEQyBzZWxlY3RlZCBvZmZzZXQgc2lnbiAmIHNhdHVyYXRpb24gKi8NCi0gICAgICAgIExMX0FEQ19TZXRPZmZzZXRTaWduKGhhZGMtPkluc3RhbmNlLCBzQ29uZmlnLT5PZmZzZXROdW1iZXIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQ29uZmlnLT5PZmZzZXRTaWduKTsNCi0gICAgICAgIExMX0FEQ19TZXRPZmZzZXRTYXR1cmF0aW9uKGhhZGMtPkluc3RhbmNlLCBzQ29uZmlnLT5PZmZzZXROdW1iZXIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc0NvbmZpZy0+T2Zmc2V0U2F0dXJhdGlvbiA9PSBFTkFCTEUpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBMTF9BRENfT0ZGU0VUX1NBVFVSQVRJT05fRU5BQkxFDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBMTF9BRENfT0ZGU0VUX1NBVFVSQVRJT05fRElTQUJMRSk7DQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgIC8qIFNjYW4gZWFjaCBvZmZzZXQgcmVnaXN0ZXIgdG8gY2hlY2sgaWYgdGhlIHNlbGVjdGVkIGNoYW5uZWwgaXMNCi0gICAgICAgICAqIHRhcmdldGVkLiAqLw0KLSAgICAgICAgLyogSWYgdGhpcyBpcyB0aGUgY2FzZSwgdGhlIGNvcnJlc3BvbmRpbmcgb2Zmc2V0IG51bWJlciBpcyBkaXNhYmxlZC4gKi8NCi0gICAgICAgIGlmIChfX0xMX0FEQ19DSEFOTkVMX1RPX0RFQ0lNQUxfTkIoDQotICAgICAgICAgICAgICAgIExMX0FEQ19HZXRPZmZzZXRDaGFubmVsKGhhZGMtPkluc3RhbmNlLCBMTF9BRENfT0ZGU0VUXzEpKSA9PQ0KLSAgICAgICAgICAgIF9fTExfQURDX0NIQU5ORUxfVE9fREVDSU1BTF9OQihzQ29uZmlnLT5DaGFubmVsKSkgew0KLSAgICAgICAgICBMTF9BRENfU2V0T2Zmc2V0U3RhdGUoaGFkYy0+SW5zdGFuY2UsIExMX0FEQ19PRkZTRVRfMSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX0FEQ19PRkZTRVRfRElTQUJMRSk7DQotICAgICAgICB9DQotICAgICAgICBpZiAoX19MTF9BRENfQ0hBTk5FTF9UT19ERUNJTUFMX05CKA0KLSAgICAgICAgICAgICAgICBMTF9BRENfR2V0T2Zmc2V0Q2hhbm5lbChoYWRjLT5JbnN0YW5jZSwgTExfQURDX09GRlNFVF8yKSkgPT0NCi0gICAgICAgICAgICBfX0xMX0FEQ19DSEFOTkVMX1RPX0RFQ0lNQUxfTkIoc0NvbmZpZy0+Q2hhbm5lbCkpIHsNCi0gICAgICAgICAgTExfQURDX1NldE9mZnNldFN0YXRlKGhhZGMtPkluc3RhbmNlLCBMTF9BRENfT0ZGU0VUXzIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTF9BRENfT0ZGU0VUX0RJU0FCTEUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKF9fTExfQURDX0NIQU5ORUxfVE9fREVDSU1BTF9OQigNCi0gICAgICAgICAgICAgICAgTExfQURDX0dldE9mZnNldENoYW5uZWwoaGFkYy0+SW5zdGFuY2UsIExMX0FEQ19PRkZTRVRfMykpID09DQotICAgICAgICAgICAgX19MTF9BRENfQ0hBTk5FTF9UT19ERUNJTUFMX05CKHNDb25maWctPkNoYW5uZWwpKSB7DQotICAgICAgICAgIExMX0FEQ19TZXRPZmZzZXRTdGF0ZShoYWRjLT5JbnN0YW5jZSwgTExfQURDX09GRlNFVF8zLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfQURDX09GRlNFVF9ESVNBQkxFKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChfX0xMX0FEQ19DSEFOTkVMX1RPX0RFQ0lNQUxfTkIoDQotICAgICAgICAgICAgICAgIExMX0FEQ19HZXRPZmZzZXRDaGFubmVsKGhhZGMtPkluc3RhbmNlLCBMTF9BRENfT0ZGU0VUXzQpKSA9PQ0KLSAgICAgICAgICAgIF9fTExfQURDX0NIQU5ORUxfVE9fREVDSU1BTF9OQihzQ29uZmlnLT5DaGFubmVsKSkgew0KLSAgICAgICAgICBMTF9BRENfU2V0T2Zmc2V0U3RhdGUoaGFkYy0+SW5zdGFuY2UsIExMX0FEQ19PRkZTRVRfNCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX0FEQ19PRkZTRVRfRElTQUJMRSk7DQotICAgICAgICB9DQotICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qIFBhcmFtZXRlcnMgdXBkYXRlIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZTogKi8NCi0gICAgLyogUGFyYW1ldGVycyB0aGF0IGNhbiBiZSB1cGRhdGVkIG9ubHkgd2hlbiBBREMgaXMgZGlzYWJsZWQ6ICovDQotICAgIC8qICAtIFNpbmdsZSBvciBkaWZmZXJlbnRpYWwgbW9kZSAqLw0KLSAgICBpZiAoTExfQURDX0lzRW5hYmxlZChoYWRjLT5JbnN0YW5jZSkgPT0gMFVMKSB7DQotICAgICAgLyogU2V0IG1vZGUgc2luZ2xlLWVuZGVkIG9yIGRpZmZlcmVudGlhbCBpbnB1dCBvZiB0aGUgc2VsZWN0ZWQgQURDIGNoYW5uZWwNCi0gICAgICAgKi8NCi0gICAgICBMTF9BRENfU2V0Q2hhbm5lbFNpbmdsZURpZmYoaGFkYy0+SW5zdGFuY2UsIHNDb25maWctPkNoYW5uZWwsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNDb25maWctPlNpbmdsZURpZmYpOw0KLQ0KLSAgICAgIC8qIENvbmZpZ3VyYXRpb24gb2YgZGlmZmVyZW50aWFsIG1vZGUgKi8NCi0gICAgICBpZiAoc0NvbmZpZy0+U2luZ2xlRGlmZiA9PSBBRENfRElGRkVSRU5USUFMX0VOREVEKSB7DQotICAgICAgICAvKiBTZXQgc2FtcGxpbmcgdGltZSBvZiB0aGUgc2VsZWN0ZWQgQURDIGNoYW5uZWwgKi8NCi0gICAgICAgIC8qIE5vdGU6IEFEQyBjaGFubmVsIG51bWJlciBtYXNrZWQgd2l0aCB2YWx1ZSAiMHgxRiIgdG8gZW5zdXJlIHNoaWZ0DQotICAgICAgICAgKiB2YWx1ZSB3aXRoaW4gMzIgYml0cyByYW5nZSAqLw0KLSAgICAgICAgTExfQURDX1NldENoYW5uZWxTYW1wbGluZ1RpbWUoDQotICAgICAgICAgICAgaGFkYy0+SW5zdGFuY2UsDQotICAgICAgICAgICAgKHVpbnQzMl90KShfX0xMX0FEQ19ERUNJTUFMX05CX1RPX0NIQU5ORUwoDQotICAgICAgICAgICAgICAgIChfX0xMX0FEQ19DSEFOTkVMX1RPX0RFQ0lNQUxfTkIoKHVpbnQzMl90KXNDb25maWctPkNoYW5uZWwpICsNCi0gICAgICAgICAgICAgICAgIDFVTCkgJg0KLSAgICAgICAgICAgICAgICAweDFGVUwpKSwNCi0gICAgICAgICAgICBzQ29uZmlnLT5TYW1wbGluZ1RpbWUpOw0KLSAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKiBNYW5hZ2VtZW50IG9mIGludGVybmFsIG1lYXN1cmVtZW50IGNoYW5uZWxzOiBWYmF0L1ZyZWZJbnQvVGVtcFNlbnNvci4gICovDQotICAgIC8qIElmIGludGVybmFsIGNoYW5uZWwgc2VsZWN0ZWQsIGVuYWJsZSBkZWRpY2F0ZWQgaW50ZXJuYWwgYnVmZmVycyBhbmQgICAgKi8NCi0gICAgLyogcGF0aHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICAvKiBOb3RlOiB0aGVzZSBpbnRlcm5hbCBtZWFzdXJlbWVudCBwYXRocyBjYW4gYmUgZGlzYWJsZWQgdXNpbmcgICAgICAgICAgICovDQotICAgIC8qIEhBTF9BRENfRGVJbml0KCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0NCi0gICAgaWYgKF9fTExfQURDX0lTX0NIQU5ORUxfSU5URVJOQUwoc0NvbmZpZy0+Q2hhbm5lbCkpIHsNCi0gICAgICB0bXBfY29uZmlnX2ludGVybmFsX2NoYW5uZWwgPSBMTF9BRENfR2V0Q29tbW9uUGF0aEludGVybmFsQ2goDQotICAgICAgICAgIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOw0KLQ0KLSAgICAgIC8qIElmIHRoZSByZXF1ZXN0ZWQgaW50ZXJuYWwgbWVhc3VyZW1lbnQgcGF0aCBoYXMgYWxyZWFkeSBiZWVuIGVuYWJsZWQsICovDQotICAgICAgLyogYnlwYXNzIHRoZSBjb25maWd1cmF0aW9uIHByb2Nlc3NpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgICBpZiAoKChzQ29uZmlnLT5DaGFubmVsID09IEFEQ19DSEFOTkVMX1RFTVBTRU5TT1JfQURDMSkgfHwNCi0gICAgICAgICAgIChzQ29uZmlnLT5DaGFubmVsID09IEFEQ19DSEFOTkVMX1RFTVBTRU5TT1JfQURDNSkpICYmDQotICAgICAgICAgICgodG1wX2NvbmZpZ19pbnRlcm5hbF9jaGFubmVsICYgTExfQURDX1BBVEhfSU5URVJOQUxfVEVNUFNFTlNPUikgPT0NCi0gICAgICAgICAgIDBVTCkpIHsNCi0gICAgICAgIGlmIChBRENfVEVNUEVSQVRVUkVfU0VOU09SX0lOU1RBTkNFKGhhZGMpKSB7DQotICAgICAgICAgIExMX0FEQ19TZXRDb21tb25QYXRoSW50ZXJuYWxDaCgNCi0gICAgICAgICAgICAgIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSksDQotICAgICAgICAgICAgICBMTF9BRENfUEFUSF9JTlRFUk5BTF9URU1QU0VOU09SIHwgdG1wX2NvbmZpZ19pbnRlcm5hbF9jaGFubmVsKTsNCi0NCi0gICAgICAgICAgLyogRGVsYXkgZm9yIHRlbXBlcmF0dXJlIHNlbnNvciBzdGFiaWxpemF0aW9uIHRpbWUgKi8NCi0gICAgICAgICAgLyogV2FpdCBsb29wIGluaXRpYWxpemF0aW9uIGFuZCBleGVjdXRpb24gKi8NCi0gICAgICAgICAgLyogTm90ZTogVmFyaWFibGUgZGl2aWRlZCBieSAyIHRvIGNvbXBlbnNhdGUgcGFydGlhbGx5ICAgICAgICAgICAgICAqLw0KLSAgICAgICAgICAvKiAgICAgICBDUFUgcHJvY2Vzc2luZyBjeWNsZXMsIHNjYWxpbmcgaW4gdXMgc3BsaXQgdG8gbm90ICAgICAgICAgICovDQotICAgICAgICAgIC8qICAgICAgIGV4Y2VlZCAzMiBiaXRzIHJlZ2lzdGVyIGNhcGFjaXR5IGFuZCBoYW5kbGUgbG93IGZyZXF1ZW5jeS4gKi8NCi0gICAgICAgICAgd2FpdF9sb29wX2luZGV4ID0gKChMTF9BRENfREVMQVlfVEVNUFNFTlNPUl9TVEFCX1VTIC8gMTBVTCkgKg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTeXN0ZW1Db3JlQ2xvY2sgLyAoMTAwMDAwVUwgKiAyVUwpKSArIDFVTCkpOw0KLSAgICAgICAgICB3aGlsZSAod2FpdF9sb29wX2luZGV4ICE9IDBVTCkgew0KLSAgICAgICAgICAgIHdhaXRfbG9vcF9pbmRleC0tOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgfSBlbHNlIGlmICgoc0NvbmZpZy0+Q2hhbm5lbCA9PSBBRENfQ0hBTk5FTF9WQkFUKSAmJg0KLSAgICAgICAgICAgICAgICAgKCh0bXBfY29uZmlnX2ludGVybmFsX2NoYW5uZWwgJiBMTF9BRENfUEFUSF9JTlRFUk5BTF9WQkFUKSA9PQ0KLSAgICAgICAgICAgICAgICAgIDBVTCkpIHsNCi0gICAgICAgIGlmIChBRENfQkFUVEVSWV9WT0xUQUdFX0lOU1RBTkNFKGhhZGMpKSB7DQotICAgICAgICAgIExMX0FEQ19TZXRDb21tb25QYXRoSW50ZXJuYWxDaCgNCi0gICAgICAgICAgICAgIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSksDQotICAgICAgICAgICAgICBMTF9BRENfUEFUSF9JTlRFUk5BTF9WQkFUIHwgdG1wX2NvbmZpZ19pbnRlcm5hbF9jaGFubmVsKTsNCi0gICAgICAgIH0NCi0gICAgICB9IGVsc2UgaWYgKChzQ29uZmlnLT5DaGFubmVsID09IEFEQ19DSEFOTkVMX1ZSRUZJTlQpICYmDQotICAgICAgICAgICAgICAgICAoKHRtcF9jb25maWdfaW50ZXJuYWxfY2hhbm5lbCAmDQotICAgICAgICAgICAgICAgICAgIExMX0FEQ19QQVRIX0lOVEVSTkFMX1ZSRUZJTlQpID09IDBVTCkpIHsNCi0gICAgICAgIGlmIChBRENfVlJFRklOVF9JTlNUQU5DRShoYWRjKSkgew0KLSAgICAgICAgICBMTF9BRENfU2V0Q29tbW9uUGF0aEludGVybmFsQ2goDQotICAgICAgICAgICAgICBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpLA0KLSAgICAgICAgICAgICAgTExfQURDX1BBVEhfSU5URVJOQUxfVlJFRklOVCB8IHRtcF9jb25maWdfaW50ZXJuYWxfY2hhbm5lbCk7DQotICAgICAgICB9DQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8NCi0gICAgICB9DQotICAgIH0NCi0gIH0NCi0NCi0gIC8qIElmIGEgY29udmVyc2lvbiBpcyBvbiBnb2luZyBvbiByZWd1bGFyIGdyb3VwLCBubyB1cGRhdGUgb24gcmVndWxhciAgICAgICAqLw0KLSAgLyogY2hhbm5lbCBjb3VsZCBiZSBkb25lIG9uIG5laXRoZXIgb2YgdGhlIGNoYW5uZWwgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgICovDQotICAvKiBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gIGVsc2Ugew0KLSAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gZXJyb3IgKi8NCi0gICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9DT05GSUcpOw0KLQ0KLSAgICB0bXBfaGFsX3N0YXR1cyA9IEhBTF9FUlJPUjsNCi0gIH0NCi0NCi0gIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8NCi0gIF9fSEFMX1VOTE9DSyhoYWRjKTsNCi0NCi0gIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8NCi0gIHJldHVybiB0bXBfaGFsX3N0YXR1czsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDb25maWd1cmUgdGhlIGFuYWxvZyB3YXRjaGRvZy4NCi0gKiBAbm90ZSAgIFBvc3NpYmlsaXR5IHRvIHVwZGF0ZSBwYXJhbWV0ZXJzIG9uIHRoZSBmbHk6DQotICogICAgICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBzZWxlY3RlZCBhbmFsb2cgd2F0Y2hkb2csIHN1Y2Nlc3NpdmUNCi0gKiAgICAgICAgIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gcmVjb25maWd1cmUgc29tZSBwYXJhbWV0ZXJzDQotICogICAgICAgICBvZiBzdHJ1Y3R1cmUgIkFEQ19BbmFsb2dXREdDb25mVHlwZURlZiIgb24gdGhlIGZseSwgd2l0aG91dCByZXNldHRpbmcNCi0gKiAgICAgICAgIHRoZSBBREMuDQotICogICAgICAgICBUaGUgc2V0dGluZyBvZiB0aGVzZSBwYXJhbWV0ZXJzIGlzIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZS4NCi0gKiAgICAgICAgIEZvciBwYXJhbWV0ZXJzIGNvbnN0cmFpbnRzLCBzZWUgY29tbWVudHMgb2Ygc3RydWN0dXJlDQotICogICAgICAgICAiQURDX0FuYWxvZ1dER0NvbmZUeXBlRGVmIi4NCi0gKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBhbmFsb2cgd2F0Y2hkb2cgdGhyZXNob2xkcyBjYW4gYmUgbW9kaWZpZWQNCi0gKiAgICAgICAgIHdoaWxlIEFEQyBjb252ZXJzaW9uIGlzIG9uIGdvaW5nLg0KLSAqICAgICAgICAgSW4gdGhpcyBjYXNlLCBzb21lIGNvbnN0cmFpbnRzIG11c3QgYmUgdGFrZW4gaW50byBhY2NvdW50Og0KLSAqICAgICAgICAgdGhlIHByb2dyYW1tZWQgdGhyZXNob2xkIHZhbHVlcyBhcmUgZWZmZWN0aXZlIGZyb20gdGhlIG5leHQNCi0gKiAgICAgICAgIEFEQyBFT0MgKGVuZCBvZiB1bml0YXJ5IGNvbnZlcnNpb24pLg0KLSAqICAgICAgICAgQ29uc2lkZXJpbmcgdGhhdCByZWdpc3RlcnMgd3JpdGUgZGVsYXkgbWF5IGhhcHBlbiBkdWUgdG8NCi0gKiAgICAgICAgIGJ1cyBhY3Rpdml0eSwgdGhpcyBtaWdodCBjYXVzZSBhbiB1bmNlcnRhaW50eSBvbiB0aGUNCi0gKiAgICAgICAgIGVmZmVjdGl2ZSB0aW1pbmcgb2YgdGhlIG5ldyBwcm9ncmFtbWVkIHRocmVzaG9sZCB2YWx1ZXMuDQotICogQHBhcmFtIGhhZGMgQURDIGhhbmRsZQ0KLSAqIEBwYXJhbSBBbmFsb2dXREdDb25maWcgU3RydWN0dXJlIG9mIEFEQyBhbmFsb2cgd2F0Y2hkb2cgY29uZmlndXJhdGlvbg0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfQW5hbG9nV0RHQ29uZmlnKA0KLSAgICBBRENfSGFuZGxlVHlwZURlZiAqaGFkYywgQURDX0FuYWxvZ1dER0NvbmZUeXBlRGVmICpBbmFsb2dXREdDb25maWcpIHsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIHRtcF9oYWxfc3RhdHVzID0gSEFMX09LOw0KLSAgdWludDMyX3QgdG1wQVdESGlnaFRocmVzaG9sZFNoaWZ0ZWQ7DQotICB1aW50MzJfdCB0bXBBV0RMb3dUaHJlc2hvbGRTaGlmdGVkOw0KLSAgdWludDMyX3QgdG1wX2FkY19pc19jb252ZXJzaW9uX29uX2dvaW5nX3JlZ3VsYXI7DQotICB1aW50MzJfdCB0bXBfYWRjX2lzX2NvbnZlcnNpb25fb25fZ29pbmdfaW5qZWN0ZWQ7DQotDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsNCi0gIGFzc2VydF9wYXJhbShJU19BRENfQU5BTE9HX1dBVENIRE9HX05VTUJFUihBbmFsb2dXREdDb25maWctPldhdGNoZG9nTnVtYmVyKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfQURDX0FOQUxPR19XQVRDSERPR19NT0RFKEFuYWxvZ1dER0NvbmZpZy0+V2F0Y2hkb2dNb2RlKSk7DQotICBhc3NlcnRfcGFyYW0oDQotICAgICAgSVNfQURDX0FOQUxPR19XQVRDSERPR19GSUxURVJJTkdfTU9ERShBbmFsb2dXREdDb25maWctPkZpbHRlcmluZ0NvbmZpZykpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoQW5hbG9nV0RHQ29uZmlnLT5JVE1vZGUpKTsNCi0NCi0gIGlmICgoQW5hbG9nV0RHQ29uZmlnLT5XYXRjaGRvZ01vZGUgPT0gQURDX0FOQUxPR1dBVENIRE9HX1NJTkdMRV9SRUcpIHx8DQotICAgICAgKEFuYWxvZ1dER0NvbmZpZy0+V2F0Y2hkb2dNb2RlID09IEFEQ19BTkFMT0dXQVRDSERPR19TSU5HTEVfSU5KRUMpIHx8DQotICAgICAgKEFuYWxvZ1dER0NvbmZpZy0+V2F0Y2hkb2dNb2RlID09IEFEQ19BTkFMT0dXQVRDSERPR19TSU5HTEVfUkVHSU5KRUMpKSB7DQotICAgIGFzc2VydF9wYXJhbShJU19BRENfQ0hBTk5FTChoYWRjLCBBbmFsb2dXREdDb25maWctPkNoYW5uZWwpKTsNCi0gIH0NCi0NCi0gIC8qIFZlcmlmeSB0aHJlc2hvbGRzIHJhbmdlICovDQotICBpZiAoaGFkYy0+SW5pdC5PdmVyc2FtcGxpbmdNb2RlID09IEVOQUJMRSkgew0KLSAgICAvKiBDYXNlIG9mIG92ZXJzYW1wbGluZyBlbmFibGVkOiBkZXBlbmRpbmcgb24gcmF0aW8gYW5kIHNoaWZ0IGNvbmZpZ3VyYXRpb24sDQotICAgICAgIGFuYWxvZyB3YXRjaGRvZyB0aHJlc2hvbGRzIGNhbiBiZSBoaWdoZXIgdGhhbiBBREMgcmVzb2x1dGlvbi4NCi0gICAgICAgVmVyaWZ5IGlmIHRocmVzaG9sZHMgYXJlIHdpdGhpbiBtYXhpbXVtIHRocmVzaG9sZHMgcmFuZ2UuICovDQotICAgIGFzc2VydF9wYXJhbSgNCi0gICAgICAgIElTX0FEQ19SQU5HRShBRENfUkVTT0xVVElPTl8xMkIsIEFuYWxvZ1dER0NvbmZpZy0+SGlnaFRocmVzaG9sZCkpOw0KLSAgICBhc3NlcnRfcGFyYW0oDQotICAgICAgICBJU19BRENfUkFOR0UoQURDX1JFU09MVVRJT05fMTJCLCBBbmFsb2dXREdDb25maWctPkxvd1RocmVzaG9sZCkpOw0KLSAgfSBlbHNlIHsNCi0gICAgLyogVmVyaWZ5IGlmIHRocmVzaG9sZHMgYXJlIHdpdGhpbiB0aGUgc2VsZWN0ZWQgQURDIHJlc29sdXRpb24gKi8NCi0gICAgYXNzZXJ0X3BhcmFtKA0KLSAgICAgICAgSVNfQURDX1JBTkdFKEFEQ19HRVRfUkVTT0xVVElPTihoYWRjKSwgQW5hbG9nV0RHQ29uZmlnLT5IaWdoVGhyZXNob2xkKSk7DQotICAgIGFzc2VydF9wYXJhbSgNCi0gICAgICAgIElTX0FEQ19SQU5HRShBRENfR0VUX1JFU09MVVRJT04oaGFkYyksIEFuYWxvZ1dER0NvbmZpZy0+TG93VGhyZXNob2xkKSk7DQotICB9DQotDQotICAvKiBQcm9jZXNzIGxvY2tlZCAqLw0KLSAgX19IQUxfTE9DSyhoYWRjKTsNCi0NCi0gIC8qIFBhcmFtZXRlcnMgdXBkYXRlIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgLyogUGFyYW1ldGVycyB0aGF0IGNhbiBiZSB1cGRhdGVkIHdoZW4gQURDIGlzIGRpc2FibGVkIG9yIGVuYWJsZWQgd2l0aG91dCAgICovDQotICAvKiBjb252ZXJzaW9uIG9uIGdvaW5nIG9uIEFEQyBncm91cHMgcmVndWxhciBhbmQgaW5qZWN0ZWQ6ICAgICAgICAgICAgICAgICAgKi8NCi0gIC8qICAtIEFuYWxvZyB3YXRjaGRvZyBjaGFubmVscyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgdG1wX2FkY19pc19jb252ZXJzaW9uX29uX2dvaW5nX3JlZ3VsYXIgPQ0KLSAgICAgIExMX0FEQ19SRUdfSXNDb252ZXJzaW9uT25nb2luZyhoYWRjLT5JbnN0YW5jZSk7DQotICB0bXBfYWRjX2lzX2NvbnZlcnNpb25fb25fZ29pbmdfaW5qZWN0ZWQgPQ0KLSAgICAgIExMX0FEQ19JTkpfSXNDb252ZXJzaW9uT25nb2luZyhoYWRjLT5JbnN0YW5jZSk7DQotICBpZiAoKHRtcF9hZGNfaXNfY29udmVyc2lvbl9vbl9nb2luZ19yZWd1bGFyID09IDBVTCkgJiYNCi0gICAgICAodG1wX2FkY19pc19jb252ZXJzaW9uX29uX2dvaW5nX2luamVjdGVkID09IDBVTCkpIHsNCi0gICAgLyogQW5hbG9nIHdhdGNoZG9nIGNvbmZpZ3VyYXRpb24gKi8NCi0gICAgaWYgKEFuYWxvZ1dER0NvbmZpZy0+V2F0Y2hkb2dOdW1iZXIgPT0gQURDX0FOQUxPR1dBVENIRE9HXzEpIHsNCi0gICAgICAvKiBDb25maWd1cmF0aW9uIG9mIGFuYWxvZyB3YXRjaGRvZzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICAgIC8qICAtIFNldCB0aGUgYW5hbG9nIHdhdGNoZG9nIGVuYWJsZSBtb2RlOiBvbmUgb3Igb3ZlcmFsbCBncm91cCBvZiAgICAgICovDQotICAgICAgLyogICAgY2hhbm5lbHMsIG9uIGdyb3VwcyByZWd1bGFyIGFuZC1vciBpbmplY3RlZC4gICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgICBzd2l0Y2ggKEFuYWxvZ1dER0NvbmZpZy0+V2F0Y2hkb2dNb2RlKSB7DQotICAgICAgICBjYXNlIEFEQ19BTkFMT0dXQVRDSERPR19TSU5HTEVfUkVHOg0KLSAgICAgICAgICBMTF9BRENfU2V0QW5hbG9nV0RNb25pdENoYW5uZWxzKA0KLSAgICAgICAgICAgICAgaGFkYy0+SW5zdGFuY2UsIExMX0FEQ19BV0QxLA0KLSAgICAgICAgICAgICAgX19MTF9BRENfQU5BTE9HV0RfQ0hBTk5FTF9HUk9VUChBbmFsb2dXREdDb25maWctPkNoYW5uZWwsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX0FEQ19HUk9VUF9SRUdVTEFSKSk7DQotICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgY2FzZSBBRENfQU5BTE9HV0FUQ0hET0dfU0lOR0xFX0lOSkVDOg0KLSAgICAgICAgICBMTF9BRENfU2V0QW5hbG9nV0RNb25pdENoYW5uZWxzKA0KLSAgICAgICAgICAgICAgaGFkYy0+SW5zdGFuY2UsIExMX0FEQ19BV0QxLA0KLSAgICAgICAgICAgICAgX19MTF9BRENfQU5BTE9HV0RfQ0hBTk5FTF9HUk9VUChBbmFsb2dXREdDb25maWctPkNoYW5uZWwsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX0FEQ19HUk9VUF9JTkpFQ1RFRCkpOw0KLSAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgIGNhc2UgQURDX0FOQUxPR1dBVENIRE9HX1NJTkdMRV9SRUdJTkpFQzoNCi0gICAgICAgICAgTExfQURDX1NldEFuYWxvZ1dETW9uaXRDaGFubmVscygNCi0gICAgICAgICAgICAgIGhhZGMtPkluc3RhbmNlLCBMTF9BRENfQVdEMSwNCi0gICAgICAgICAgICAgIF9fTExfQURDX0FOQUxPR1dEX0NIQU5ORUxfR1JPVVAoQW5hbG9nV0RHQ29uZmlnLT5DaGFubmVsLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTF9BRENfR1JPVVBfUkVHVUxBUl9JTkpFQ1RFRCkpOw0KLSAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgIGNhc2UgQURDX0FOQUxPR1dBVENIRE9HX0FMTF9SRUc6DQotICAgICAgICAgIExMX0FEQ19TZXRBbmFsb2dXRE1vbml0Q2hhbm5lbHMoaGFkYy0+SW5zdGFuY2UsIExMX0FEQ19BV0QxLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX0FEQ19BV0RfQUxMX0NIQU5ORUxTX1JFRyk7DQotICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgY2FzZSBBRENfQU5BTE9HV0FUQ0hET0dfQUxMX0lOSkVDOg0KLSAgICAgICAgICBMTF9BRENfU2V0QW5hbG9nV0RNb25pdENoYW5uZWxzKGhhZGMtPkluc3RhbmNlLCBMTF9BRENfQVdEMSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTF9BRENfQVdEX0FMTF9DSEFOTkVMU19JTkopOw0KLSAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgIGNhc2UgQURDX0FOQUxPR1dBVENIRE9HX0FMTF9SRUdJTkpFQzoNCi0gICAgICAgICAgTExfQURDX1NldEFuYWxvZ1dETW9uaXRDaGFubmVscyhoYWRjLT5JbnN0YW5jZSwgTExfQURDX0FXRDEsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfQURDX0FXRF9BTExfQ0hBTk5FTFNfUkVHX0lOSik7DQotICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgZGVmYXVsdDogLyogQURDX0FOQUxPR1dBVENIRE9HX05PTkUgKi8NCi0gICAgICAgICAgTExfQURDX1NldEFuYWxvZ1dETW9uaXRDaGFubmVscyhoYWRjLT5JbnN0YW5jZSwgTExfQURDX0FXRDEsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfQURDX0FXRF9ESVNBQkxFKTsNCi0gICAgICAgICAgYnJlYWs7DQotICAgICAgfQ0KLQ0KLSAgICAgIC8qIFNldCB0aGUgZmlsdGVyaW5nIGNvbmZpZ3VyYXRpb24gKi8NCi0gICAgICBNT0RJRllfUkVHKGhhZGMtPkluc3RhbmNlLT5UUjEsIEFEQ19UUjFfQVdERklMVCwNCi0gICAgICAgICAgICAgICAgIEFuYWxvZ1dER0NvbmZpZy0+RmlsdGVyaW5nQ29uZmlnKTsNCi0NCi0gICAgICAvKiBVcGRhdGUgc3RhdGUsIGNsZWFyIHByZXZpb3VzIHJlc3VsdCByZWxhdGVkIHRvIEFXRDEgKi8NCi0gICAgICBDTEVBUl9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfQVdEMSk7DQotDQotICAgICAgLyogQ2xlYXIgZmxhZyBBREMgYW5hbG9nIHdhdGNoZG9nICovDQotICAgICAgLyogTm90ZTogRmxhZyBjbGVhcmVkIENsZWFyIHRoZSBBREMgQW5hbG9nIHdhdGNoZG9nIGZsYWcgdG8gYmUgcmVhZHkgICovDQotICAgICAgLyogdG8gdXNlIGZvciBIQUxfQURDX0lSUUhhbmRsZXIoKSBvciBIQUxfQURDX1BvbGxGb3JFdmVudCgpICAgICAgICAgICovDQotICAgICAgLyogKGluIGNhc2UgbGVmdCBlbmFibGVkIGJ5IHByZXZpb3VzIEFEQyBvcGVyYXRpb25zKS4gICAgICAgICAgICAgICAgICovDQotICAgICAgTExfQURDX0NsZWFyRmxhZ19BV0QxKGhhZGMtPkluc3RhbmNlKTsNCi0NCi0gICAgICAvKiBDb25maWd1cmUgQURDIGFuYWxvZyB3YXRjaGRvZyBpbnRlcnJ1cHQgKi8NCi0gICAgICBpZiAoQW5hbG9nV0RHQ29uZmlnLT5JVE1vZGUgPT0gRU5BQkxFKSB7DQotICAgICAgICBMTF9BRENfRW5hYmxlSVRfQVdEMShoYWRjLT5JbnN0YW5jZSk7DQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgIExMX0FEQ19EaXNhYmxlSVRfQVdEMShoYWRjLT5JbnN0YW5jZSk7DQotICAgICAgfQ0KLSAgICB9DQotICAgIC8qIENhc2Ugb2YgQURDX0FOQUxPR1dBVENIRE9HXzIgb3IgQURDX0FOQUxPR1dBVENIRE9HXzMgKi8NCi0gICAgZWxzZSB7DQotICAgICAgc3dpdGNoIChBbmFsb2dXREdDb25maWctPldhdGNoZG9nTW9kZSkgew0KLSAgICAgICAgY2FzZSBBRENfQU5BTE9HV0FUQ0hET0dfU0lOR0xFX1JFRzoNCi0gICAgICAgIGNhc2UgQURDX0FOQUxPR1dBVENIRE9HX1NJTkdMRV9JTkpFQzoNCi0gICAgICAgIGNhc2UgQURDX0FOQUxPR1dBVENIRE9HX1NJTkdMRV9SRUdJTkpFQzoNCi0gICAgICAgICAgLyogVXBkYXRlIEFXRCBieSBiaXRmaWVsZCB0byBrZWVwIHRoZSBwb3NzaWJpbGl0eSB0byBtb25pdG9yICAgICAgICAqLw0KLSAgICAgICAgICAvKiBzZXZlcmFsIGNoYW5uZWxzIGJ5IHN1Y2Nlc3NpdmUgY2FsbHMgb2YgdGhpcyBmdW5jdGlvbi4gICAgICAgICAgICovDQotICAgICAgICAgIGlmIChBbmFsb2dXREdDb25maWctPldhdGNoZG9nTnVtYmVyID09IEFEQ19BTkFMT0dXQVRDSERPR18yKSB7DQotICAgICAgICAgICAgU0VUX0JJVChoYWRjLT5JbnN0YW5jZS0+QVdEMkNSLA0KLSAgICAgICAgICAgICAgICAgICAgKDFVTCA8PCAoX19MTF9BRENfQ0hBTk5FTF9UT19ERUNJTUFMX05CKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuYWxvZ1dER0NvbmZpZy0+Q2hhbm5lbCkgJg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxRlVMKSkpOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIFNFVF9CSVQoaGFkYy0+SW5zdGFuY2UtPkFXRDNDUiwNCi0gICAgICAgICAgICAgICAgICAgICgxVUwgPDwgKF9fTExfQURDX0NIQU5ORUxfVE9fREVDSU1BTF9OQigNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmFsb2dXREdDb25maWctPkNoYW5uZWwpICYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUZVTCkpKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgIGNhc2UgQURDX0FOQUxPR1dBVENIRE9HX0FMTF9SRUc6DQotICAgICAgICBjYXNlIEFEQ19BTkFMT0dXQVRDSERPR19BTExfSU5KRUM6DQotICAgICAgICBjYXNlIEFEQ19BTkFMT0dXQVRDSERPR19BTExfUkVHSU5KRUM6DQotICAgICAgICAgIExMX0FEQ19TZXRBbmFsb2dXRE1vbml0Q2hhbm5lbHMoaGFkYy0+SW5zdGFuY2UsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5hbG9nV0RHQ29uZmlnLT5XYXRjaGRvZ051bWJlciwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTF9BRENfQVdEX0FMTF9DSEFOTkVMU19SRUdfSU5KKTsNCi0gICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICBkZWZhdWx0OiAvKiBBRENfQU5BTE9HV0FUQ0hET0dfTk9ORSAqLw0KLSAgICAgICAgICBMTF9BRENfU2V0QW5hbG9nV0RNb25pdENoYW5uZWxzKGhhZGMtPkluc3RhbmNlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuYWxvZ1dER0NvbmZpZy0+V2F0Y2hkb2dOdW1iZXIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfQURDX0FXRF9ESVNBQkxFKTsNCi0gICAgICAgICAgYnJlYWs7DQotICAgICAgfQ0KLQ0KLSAgICAgIGlmIChBbmFsb2dXREdDb25maWctPldhdGNoZG9nTnVtYmVyID09IEFEQ19BTkFMT0dXQVRDSERPR18yKSB7DQotICAgICAgICAvKiBVcGRhdGUgc3RhdGUsIGNsZWFyIHByZXZpb3VzIHJlc3VsdCByZWxhdGVkIHRvIEFXRDIgKi8NCi0gICAgICAgIENMRUFSX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9BV0QyKTsNCi0NCi0gICAgICAgIC8qIENsZWFyIGZsYWcgQURDIGFuYWxvZyB3YXRjaGRvZyAqLw0KLSAgICAgICAgLyogTm90ZTogRmxhZyBjbGVhcmVkIENsZWFyIHRoZSBBREMgQW5hbG9nIHdhdGNoZG9nIGZsYWcgdG8gYmUgcmVhZHkgICovDQotICAgICAgICAvKiB0byB1c2UgZm9yIEhBTF9BRENfSVJRSGFuZGxlcigpIG9yIEhBTF9BRENfUG9sbEZvckV2ZW50KCkgICAgICAgICAgKi8NCi0gICAgICAgIC8qIChpbiBjYXNlIGxlZnQgZW5hYmxlZCBieSBwcmV2aW91cyBBREMgb3BlcmF0aW9ucykuICAgICAgICAgICAgICAgICAqLw0KLSAgICAgICAgTExfQURDX0NsZWFyRmxhZ19BV0QyKGhhZGMtPkluc3RhbmNlKTsNCi0NCi0gICAgICAgIC8qIENvbmZpZ3VyZSBBREMgYW5hbG9nIHdhdGNoZG9nIGludGVycnVwdCAqLw0KLSAgICAgICAgaWYgKEFuYWxvZ1dER0NvbmZpZy0+SVRNb2RlID09IEVOQUJMRSkgew0KLSAgICAgICAgICBMTF9BRENfRW5hYmxlSVRfQVdEMihoYWRjLT5JbnN0YW5jZSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICBMTF9BRENfRGlzYWJsZUlUX0FXRDIoaGFkYy0+SW5zdGFuY2UpOw0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0gICAgICAvKiAoQW5hbG9nV0RHQ29uZmlnLT5XYXRjaGRvZ051bWJlciA9PSBBRENfQU5BTE9HV0FUQ0hET0dfMykgKi8NCi0gICAgICBlbHNlIHsNCi0gICAgICAgIC8qIFVwZGF0ZSBzdGF0ZSwgY2xlYXIgcHJldmlvdXMgcmVzdWx0IHJlbGF0ZWQgdG8gQVdEMyAqLw0KLSAgICAgICAgQ0xFQVJfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0FXRDMpOw0KLQ0KLSAgICAgICAgLyogQ2xlYXIgZmxhZyBBREMgYW5hbG9nIHdhdGNoZG9nICovDQotICAgICAgICAvKiBOb3RlOiBGbGFnIGNsZWFyZWQgQ2xlYXIgdGhlIEFEQyBBbmFsb2cgd2F0Y2hkb2cgZmxhZyB0byBiZSByZWFkeSAgKi8NCi0gICAgICAgIC8qIHRvIHVzZSBmb3IgSEFMX0FEQ19JUlFIYW5kbGVyKCkgb3IgSEFMX0FEQ19Qb2xsRm9yRXZlbnQoKSAgICAgICAgICAqLw0KLSAgICAgICAgLyogKGluIGNhc2UgbGVmdCBlbmFibGVkIGJ5IHByZXZpb3VzIEFEQyBvcGVyYXRpb25zKS4gICAgICAgICAgICAgICAgICovDQotICAgICAgICBMTF9BRENfQ2xlYXJGbGFnX0FXRDMoaGFkYy0+SW5zdGFuY2UpOw0KLQ0KLSAgICAgICAgLyogQ29uZmlndXJlIEFEQyBhbmFsb2cgd2F0Y2hkb2cgaW50ZXJydXB0ICovDQotICAgICAgICBpZiAoQW5hbG9nV0RHQ29uZmlnLT5JVE1vZGUgPT0gRU5BQkxFKSB7DQotICAgICAgICAgIExMX0FEQ19FbmFibGVJVF9BV0QzKGhhZGMtPkluc3RhbmNlKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgIExMX0FEQ19EaXNhYmxlSVRfQVdEMyhoYWRjLT5JbnN0YW5jZSk7DQotICAgICAgICB9DQotICAgICAgfQ0KLSAgICB9DQotICB9DQotDQotICAvKiBBbmFsb2cgd2F0Y2hkb2cgdGhyZXNob2xkcyBjb25maWd1cmF0aW9uICovDQotICBpZiAoQW5hbG9nV0RHQ29uZmlnLT5XYXRjaGRvZ051bWJlciA9PSBBRENfQU5BTE9HV0FUQ0hET0dfMSkgew0KLSAgICAvKiBTaGlmdCB0aGUgb2Zmc2V0IHdpdGggcmVzcGVjdCB0byB0aGUgc2VsZWN0ZWQgQURDIHJlc29sdXRpb246ICAgICAgICAqLw0KLSAgICAvKiBUaHJlc2hvbGRzIGhhdmUgdG8gYmUgbGVmdC1hbGlnbmVkIG9uIGJpdCAxMSwgdGhlIExTQiAocmlnaHQgYml0cykgICAqLw0KLSAgICAvKiBhcmUgc2V0IHRvIDAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICB0bXBBV0RIaWdoVGhyZXNob2xkU2hpZnRlZCA9IEFEQ19BV0QxVEhSRVNIT0xEX1NISUZUX1JFU09MVVRJT04oDQotICAgICAgICBoYWRjLCBBbmFsb2dXREdDb25maWctPkhpZ2hUaHJlc2hvbGQpOw0KLSAgICB0bXBBV0RMb3dUaHJlc2hvbGRTaGlmdGVkID0NCi0gICAgICAgIEFEQ19BV0QxVEhSRVNIT0xEX1NISUZUX1JFU09MVVRJT04oaGFkYywgQW5hbG9nV0RHQ29uZmlnLT5Mb3dUaHJlc2hvbGQpOw0KLSAgfQ0KLSAgLyogQ2FzZSBvZiBBRENfQU5BTE9HV0FUQ0hET0dfMiBhbmQgQURDX0FOQUxPR1dBVENIRE9HXzMgKi8NCi0gIGVsc2Ugew0KLSAgICAvKiBTaGlmdCB0aGUgb2Zmc2V0IHdpdGggcmVzcGVjdCB0byB0aGUgc2VsZWN0ZWQgQURDIHJlc29sdXRpb246ICAgICAgICAqLw0KLSAgICAvKiBUaHJlc2hvbGRzIGhhdmUgdG8gYmUgbGVmdC1hbGlnbmVkIG9uIGJpdCA3LCB0aGUgTFNCIChyaWdodCBiaXRzKSAgICAqLw0KLSAgICAvKiBhcmUgc2V0IHRvIDAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICB0bXBBV0RIaWdoVGhyZXNob2xkU2hpZnRlZCA9IEFEQ19BV0QyM1RIUkVTSE9MRF9TSElGVF9SRVNPTFVUSU9OKA0KLSAgICAgICAgaGFkYywgQW5hbG9nV0RHQ29uZmlnLT5IaWdoVGhyZXNob2xkKTsNCi0gICAgdG1wQVdETG93VGhyZXNob2xkU2hpZnRlZCA9IEFEQ19BV0QyM1RIUkVTSE9MRF9TSElGVF9SRVNPTFVUSU9OKA0KLSAgICAgICAgaGFkYywgQW5hbG9nV0RHQ29uZmlnLT5Mb3dUaHJlc2hvbGQpOw0KLSAgfQ0KLQ0KLSAgLyogU2V0IEFEQyBhbmFsb2cgd2F0Y2hkb2cgdGhyZXNob2xkcyB2YWx1ZSBvZiBib3RoIHRocmVzaG9sZHMgaGlnaCBhbmQgbG93ICovDQotICBMTF9BRENfQ29uZmlnQW5hbG9nV0RUaHJlc2hvbGRzKA0KLSAgICAgIGhhZGMtPkluc3RhbmNlLCBBbmFsb2dXREdDb25maWctPldhdGNoZG9nTnVtYmVyLA0KLSAgICAgIHRtcEFXREhpZ2hUaHJlc2hvbGRTaGlmdGVkLCB0bXBBV0RMb3dUaHJlc2hvbGRTaGlmdGVkKTsNCi0NCi0gIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8NCi0gIF9fSEFMX1VOTE9DSyhoYWRjKTsNCi0NCi0gIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8NCi0gIHJldHVybiB0bXBfaGFsX3N0YXR1czsNCi19DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEFEQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA0IFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zDQotICAqICBAYnJpZWYgICAgQURDIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zDQotICAqDQotQHZlcmJhdGltDQotID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIHN0YXRlIGFuZCBlcnJvcnMgZnVuY3Rpb25zICMjIyMjDQotID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgWy4uXQ0KLSAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGdldCBpbiBydW4tdGltZSB0aGUgc3RhdHVzIG9mIHRoZQ0KLSAgICBwZXJpcGhlcmFsLg0KLSAgICAgICgrKSBDaGVjayB0aGUgQURDIHN0YXRlDQotICAgICAgKCspIENoZWNrIHRoZSBBREMgZXJyb3IgY29kZQ0KLQ0KLUBlbmR2ZXJiYXRpbQ0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJldHVybiB0aGUgQURDIGhhbmRsZSBzdGF0ZS4NCi0gKiBAbm90ZSAgIEFEQyBzdGF0ZSBtYWNoaW5lIGlzIG1hbmFnZWQgYnkgYml0ZmllbGRzLCBBREMgc3RhdHVzIG11c3QgYmUNCi0gKiAgICAgICAgIGNvbXBhcmVkIHdpdGggc3RhdGVzIGJpdHMuDQotICogICAgICAgICBGb3IgZXhhbXBsZToNCi0gKiAgICAgICAgICAgIiBpZiAoKEhBTF9BRENfR2V0U3RhdGUoaGFkYzEpICYgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSkgIT0gMFVMKSAiDQotICogICAgICAgICAgICIgaWYgKChIQUxfQURDX0dldFN0YXRlKGhhZGMxKSAmIEhBTF9BRENfU1RBVEVfQVdEMSkgIT0gMFVMKSAiDQotICogQHBhcmFtIGhhZGMgQURDIGhhbmRsZQ0KLSAqIEByZXR2YWwgQURDIGhhbmRsZSBzdGF0ZSAoYml0ZmllbGQgb24gMzIgYml0cykNCi0gKi8NCi11aW50MzJfdCBIQUxfQURDX0dldFN0YXRlKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKSB7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsNCi0NCi0gIC8qIFJldHVybiBBREMgaGFuZGxlIHN0YXRlICovDQotICByZXR1cm4gaGFkYy0+U3RhdGU7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmV0dXJuIHRoZSBBREMgZXJyb3IgY29kZS4NCi0gKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlDQotICogQHJldHZhbCBBREMgZXJyb3IgY29kZSAoYml0ZmllbGQgb24gMzIgYml0cykNCi0gKi8NCi11aW50MzJfdCBIQUxfQURDX0dldEVycm9yKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKSB7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsNCi0NCi0gIHJldHVybiBoYWRjLT5FcnJvckNvZGU7DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEFEQ19Qcml2YXRlX0Z1bmN0aW9ucyBBREMgUHJpdmF0ZSBGdW5jdGlvbnMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU3RvcCBBREMgY29udmVyc2lvbi4NCi0gKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlDQotICogQHBhcmFtIENvbnZlcnNpb25Hcm91cCBBREMgZ3JvdXAgcmVndWxhciBhbmQvb3IgaW5qZWN0ZWQuDQotICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfUkVHVUxBUl9HUk9VUCAgICAgICAgICAgQURDIHJlZ3VsYXIgY29udmVyc2lvbiB0eXBlLg0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19JTkpFQ1RFRF9HUk9VUCAgICAgICAgICBBREMgaW5qZWN0ZWQgY29udmVyc2lvbg0KLSAqIHR5cGUuDQotICogICAgICAgICAgICBAYXJnIEByZWYgQURDX1JFR1VMQVJfSU5KRUNURURfR1JPVVAgIEFEQyByZWd1bGFyIGFuZCBpbmplY3RlZA0KLSAqIGNvbnZlcnNpb24gdHlwZS4NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMuDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgQURDX0NvbnZlcnNpb25TdG9wKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDb252ZXJzaW9uR3JvdXApIHsNCi0gIHVpbnQzMl90IHRpY2tzdGFydDsNCi0gIHVpbnQzMl90IENvbnZlcnNpb25fVGltZW91dF9DUFVfY3ljbGVzID0gMFVMOw0KLSAgdWludDMyX3QgY29udmVyc2lvbl9ncm91cF9yZWFzc2lnbmVkID0gQ29udmVyc2lvbkdyb3VwOw0KLSAgdWludDMyX3QgdG1wX0FEQ19DUl9BRFNUQVJUX0pBRFNUQVJUOw0KLSAgdWludDMyX3QgdG1wX2FkY19pc19jb252ZXJzaW9uX29uX2dvaW5nX3JlZ3VsYXI7DQotICB1aW50MzJfdCB0bXBfYWRjX2lzX2NvbnZlcnNpb25fb25fZ29pbmdfaW5qZWN0ZWQ7DQotDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsNCi0gIGFzc2VydF9wYXJhbShJU19BRENfQ09OVkVSU0lPTl9HUk9VUChDb252ZXJzaW9uR3JvdXApKTsNCi0NCi0gIC8qIFZlcmlmaWNhdGlvbiBpZiBBREMgaXMgbm90IGFscmVhZHkgc3RvcHBlZCAob24gcmVndWxhciBhbmQgaW5qZWN0ZWQgICAgICAqLw0KLSAgLyogZ3JvdXBzKSB0byBieXBhc3MgdGhpcyBmdW5jdGlvbiBpZiBub3QgbmVlZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICB0bXBfYWRjX2lzX2NvbnZlcnNpb25fb25fZ29pbmdfcmVndWxhciA9DQotICAgICAgTExfQURDX1JFR19Jc0NvbnZlcnNpb25PbmdvaW5nKGhhZGMtPkluc3RhbmNlKTsNCi0gIHRtcF9hZGNfaXNfY29udmVyc2lvbl9vbl9nb2luZ19pbmplY3RlZCA9DQotICAgICAgTExfQURDX0lOSl9Jc0NvbnZlcnNpb25PbmdvaW5nKGhhZGMtPkluc3RhbmNlKTsNCi0gIGlmICgodG1wX2FkY19pc19jb252ZXJzaW9uX29uX2dvaW5nX3JlZ3VsYXIgIT0gMFVMKSB8fA0KLSAgICAgICh0bXBfYWRjX2lzX2NvbnZlcnNpb25fb25fZ29pbmdfaW5qZWN0ZWQgIT0gMFVMKSkgew0KLSAgICAvKiBQYXJ0aWN1bGFyIGNhc2Ugb2YgY29udGludW91cyBhdXRvLWluamVjdGlvbiBtb2RlIGNvbWJpbmVkIHdpdGggICAgICAgICovDQotICAgIC8qIGF1dG8tZGVsYXkgbW9kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgLyogSW4gYXV0by1pbmplY3Rpb24gbW9kZSwgcmVndWxhciBncm91cCBzdG9wIEFEQ19DUl9BRFNUUCBpcyB1c2VkIChub3QgICAqLw0KLSAgICAvKiBpbmplY3RlZCBncm91cCBzdG9wIEFEQ19DUl9KQURTVFApLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIC8qIFByb2NlZHVyZSB0byBiZSBmb2xsb3dlZDogV2FpdCB1bnRpbCBKRU9TPTEsIGNsZWFyIEpFT1MsIHNldCBBRFNUUD0xICAgKi8NCi0gICAgLyogKHNlZSByZWZlcmVuY2UgbWFudWFsKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICBpZiAoKChoYWRjLT5JbnN0YW5jZS0+Q0ZHUiAmIEFEQ19DRkdSX0pBVVRPKSAhPSAwVUwpICYmDQotICAgICAgICAoaGFkYy0+SW5pdC5Db250aW51b3VzQ29udk1vZGUgPT0gRU5BQkxFKSAmJg0KLSAgICAgICAgKGhhZGMtPkluaXQuTG93UG93ZXJBdXRvV2FpdCA9PSBFTkFCTEUpKSB7DQotICAgICAgLyogVXNlIHN0b3Agb2YgcmVndWxhciBncm91cCAqLw0KLSAgICAgIGNvbnZlcnNpb25fZ3JvdXBfcmVhc3NpZ25lZCA9IEFEQ19SRUdVTEFSX0dST1VQOw0KLQ0KLSAgICAgIC8qIFdhaXQgdW50aWwgSkVPUz0xIChtYXhpbXVtIFRpbWVvdXQ6IDQgaW5qZWN0ZWQgY29udmVyc2lvbnMpICovDQotICAgICAgd2hpbGUgKF9fSEFMX0FEQ19HRVRfRkxBRyhoYWRjLCBBRENfRkxBR19KRU9TKSA9PSAwVUwpIHsNCi0gICAgICAgIGlmIChDb252ZXJzaW9uX1RpbWVvdXRfQ1BVX2N5Y2xlcyA+PQ0KLSAgICAgICAgICAgIChBRENfQ09OVkVSU0lPTl9USU1FX01BWF9DUFVfQ1lDTEVTICogNFVMKSkgew0KLSAgICAgICAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gZXJyb3IgKi8NCi0gICAgICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9JTlRFUk5BTCk7DQotDQotICAgICAgICAgIC8qIFNldCBBREMgZXJyb3IgY29kZSB0byBBREMgcGVyaXBoZXJhbCBpbnRlcm5hbCBlcnJvciAqLw0KLSAgICAgICAgICBTRVRfQklUKGhhZGMtPkVycm9yQ29kZSwgSEFMX0FEQ19FUlJPUl9JTlRFUk5BTCk7DQotDQotICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7DQotICAgICAgICB9DQotICAgICAgICBDb252ZXJzaW9uX1RpbWVvdXRfQ1BVX2N5Y2xlcysrOw0KLSAgICAgIH0NCi0NCi0gICAgICAvKiBDbGVhciBKRU9TICovDQotICAgICAgX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgQURDX0ZMQUdfSkVPUyk7DQotICAgIH0NCi0NCi0gICAgLyogU3RvcCBwb3RlbnRpYWwgY29udmVyc2lvbiBvbiBnb2luZyBvbiBBREMgZ3JvdXAgcmVndWxhciAqLw0KLSAgICBpZiAoY29udmVyc2lvbl9ncm91cF9yZWFzc2lnbmVkICE9IEFEQ19JTkpFQ1RFRF9HUk9VUCkgew0KLSAgICAgIC8qIFNvZnR3YXJlIGlzIGFsbG93ZWQgdG8gc2V0IEFEU1RQIG9ubHkgd2hlbiBBRFNUQVJUPTEgYW5kIEFERElTPTAgKi8NCi0gICAgICBpZiAoTExfQURDX1JFR19Jc0NvbnZlcnNpb25PbmdvaW5nKGhhZGMtPkluc3RhbmNlKSAhPSAwVUwpIHsNCi0gICAgICAgIGlmIChMTF9BRENfSXNEaXNhYmxlT25nb2luZyhoYWRjLT5JbnN0YW5jZSkgPT0gMFVMKSB7DQotICAgICAgICAgIC8qIFN0b3AgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiAqLw0KLSAgICAgICAgICBMTF9BRENfUkVHX1N0b3BDb252ZXJzaW9uKGhhZGMtPkluc3RhbmNlKTsNCi0gICAgICAgIH0NCi0gICAgICB9DQotICAgIH0NCi0NCi0gICAgLyogU3RvcCBwb3RlbnRpYWwgY29udmVyc2lvbiBvbiBnb2luZyBvbiBBREMgZ3JvdXAgaW5qZWN0ZWQgKi8NCi0gICAgaWYgKGNvbnZlcnNpb25fZ3JvdXBfcmVhc3NpZ25lZCAhPSBBRENfUkVHVUxBUl9HUk9VUCkgew0KLSAgICAgIC8qIFNvZnR3YXJlIGlzIGFsbG93ZWQgdG8gc2V0IEpBRFNUUCBvbmx5IHdoZW4gSkFEU1RBUlQ9MSBhbmQgQURESVM9MCAqLw0KLSAgICAgIGlmIChMTF9BRENfSU5KX0lzQ29udmVyc2lvbk9uZ29pbmcoaGFkYy0+SW5zdGFuY2UpICE9IDBVTCkgew0KLSAgICAgICAgaWYgKExMX0FEQ19Jc0Rpc2FibGVPbmdvaW5nKGhhZGMtPkluc3RhbmNlKSA9PSAwVUwpIHsNCi0gICAgICAgICAgLyogU3RvcCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiAqLw0KLSAgICAgICAgICBMTF9BRENfSU5KX1N0b3BDb252ZXJzaW9uKGhhZGMtPkluc3RhbmNlKTsNCi0gICAgICAgIH0NCi0gICAgICB9DQotICAgIH0NCi0NCi0gICAgLyogU2VsZWN0aW9uIG9mIHN0YXJ0IGFuZCBzdG9wIGJpdHMgd2l0aCByZXNwZWN0IHRvIHRoZSByZWd1bGFyIG9yIGluamVjdGVkDQotICAgICAqIGdyb3VwICovDQotICAgIHN3aXRjaCAoY29udmVyc2lvbl9ncm91cF9yZWFzc2lnbmVkKSB7DQotICAgICAgY2FzZSBBRENfUkVHVUxBUl9JTkpFQ1RFRF9HUk9VUDoNCi0gICAgICAgIHRtcF9BRENfQ1JfQURTVEFSVF9KQURTVEFSVCA9IChBRENfQ1JfQURTVEFSVCB8IEFEQ19DUl9KQURTVEFSVCk7DQotICAgICAgICBicmVhazsNCi0gICAgICBjYXNlIEFEQ19JTkpFQ1RFRF9HUk9VUDoNCi0gICAgICAgIHRtcF9BRENfQ1JfQURTVEFSVF9KQURTVEFSVCA9IEFEQ19DUl9KQURTVEFSVDsNCi0gICAgICAgIGJyZWFrOw0KLSAgICAgIC8qIENhc2UgQURDX1JFR1VMQVJfR1JPVVAgb25seSovDQotICAgICAgZGVmYXVsdDoNCi0gICAgICAgIHRtcF9BRENfQ1JfQURTVEFSVF9KQURTVEFSVCA9IEFEQ19DUl9BRFNUQVJUOw0KLSAgICAgICAgYnJlYWs7DQotICAgIH0NCi0NCi0gICAgLyogV2FpdCBmb3IgY29udmVyc2lvbiBlZmZlY3RpdmVseSBzdG9wcGVkICovDQotICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7DQotDQotICAgIHdoaWxlICgoaGFkYy0+SW5zdGFuY2UtPkNSICYgdG1wX0FEQ19DUl9BRFNUQVJUX0pBRFNUQVJUKSAhPSAwVUwpIHsNCi0gICAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gQURDX1NUT1BfQ09OVkVSU0lPTl9USU1FT1VUKSB7DQotICAgICAgICAvKiBOZXcgY2hlY2sgdG8gYXZvaWQgZmFsc2UgdGltZW91dCBkZXRlY3Rpb24gaW4gY2FzZSBvZiBwcmVlbXB0aW9uICovDQotICAgICAgICBpZiAoKGhhZGMtPkluc3RhbmNlLT5DUiAmIHRtcF9BRENfQ1JfQURTVEFSVF9KQURTVEFSVCkgIT0gMFVMKSB7DQotICAgICAgICAgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSB0byBlcnJvciAqLw0KLSAgICAgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0VSUk9SX0lOVEVSTkFMKTsNCi0NCi0gICAgICAgICAgLyogU2V0IEFEQyBlcnJvciBjb2RlIHRvIEFEQyBwZXJpcGhlcmFsIGludGVybmFsIGVycm9yICovDQotICAgICAgICAgIFNFVF9CSVQoaGFkYy0+RXJyb3JDb2RlLCBIQUxfQURDX0VSUk9SX0lOVEVSTkFMKTsNCi0NCi0gICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gICAgICAgIH0NCi0gICAgICB9DQotICAgIH0NCi0gIH0NCi0NCi0gIC8qIFJldHVybiBIQUwgc3RhdHVzICovDQotICByZXR1cm4gSEFMX09LOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSB0aGUgc2VsZWN0ZWQgQURDLg0KLSAqIEBub3RlICAgUHJlcmVxdWlzaXRlIGNvbmRpdGlvbiB0byB1c2UgdGhpcyBmdW5jdGlvbjogQURDIG11c3QgYmUgZGlzYWJsZWQNCi0gKiAgICAgICAgIGFuZCB2b2x0YWdlIHJlZ3VsYXRvciBtdXN0IGJlIGVuYWJsZWQgKGRvbmUgaW50byBIQUxfQURDX0luaXQoKSkuDQotICogQHBhcmFtIGhhZGMgQURDIGhhbmRsZQ0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cy4NCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBBRENfRW5hYmxlKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKSB7DQotICB1aW50MzJfdCB0aWNrc3RhcnQ7DQotDQotICAvKiBBREMgZW5hYmxlIGFuZCB3YWl0IGZvciBBREMgcmVhZHkgKGluIGNhc2Ugb2YgQURDIGlzIGRpc2FibGVkIG9yICAgICAgICAgKi8NCi0gIC8qIGVuYWJsaW5nIHBoYXNlIG5vdCB5ZXQgY29tcGxldGVkOiBmbGFnIEFEQyByZWFkeSBub3QgeWV0IHNldCkuICAgICAgICAgICAqLw0KLSAgLyogVGltZW91dCBpbXBsZW1lbnRlZCB0byBub3QgYmUgc3R1Y2sgaWYgQURDIGNhbm5vdCBiZSBlbmFibGVkIChwb3NzaWJsZSAgICovDQotICAvKiBjYXVzZXM6IEFEQyBjbG9jayBub3QgcnVubmluZywgLi4uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gIGlmIChMTF9BRENfSXNFbmFibGVkKGhhZGMtPkluc3RhbmNlKSA9PSAwVUwpIHsNCi0gICAgLyogQ2hlY2sgaWYgY29uZGl0aW9ucyB0byBlbmFibGUgdGhlIEFEQyBhcmUgZnVsZmlsbGVkICovDQotICAgIGlmICgoaGFkYy0+SW5zdGFuY2UtPkNSICYNCi0gICAgICAgICAoQURDX0NSX0FEQ0FMIHwgQURDX0NSX0pBRFNUUCB8IEFEQ19DUl9BRFNUUCB8IEFEQ19DUl9KQURTVEFSVCB8DQotICAgICAgICAgIEFEQ19DUl9BRFNUQVJUIHwgQURDX0NSX0FERElTIHwgQURDX0NSX0FERU4pKSAhPSAwVUwpIHsNCi0gICAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gZXJyb3IgKi8NCi0gICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0VSUk9SX0lOVEVSTkFMKTsNCi0NCi0gICAgICAvKiBTZXQgQURDIGVycm9yIGNvZGUgdG8gQURDIHBlcmlwaGVyYWwgaW50ZXJuYWwgZXJyb3IgKi8NCi0gICAgICBTRVRfQklUKGhhZGMtPkVycm9yQ29kZSwgSEFMX0FEQ19FUlJPUl9JTlRFUk5BTCk7DQotDQotICAgICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gICAgfQ0KLQ0KLSAgICAvKiBFbmFibGUgdGhlIEFEQyBwZXJpcGhlcmFsICovDQotICAgIExMX0FEQ19FbmFibGUoaGFkYy0+SW5zdGFuY2UpOw0KLQ0KLSAgICAvKiBXYWl0IGZvciBBREMgZWZmZWN0aXZlbHkgZW5hYmxlZCAqLw0KLSAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOw0KLQ0KLSAgICB3aGlsZSAoX19IQUxfQURDX0dFVF9GTEFHKGhhZGMsIEFEQ19GTEFHX1JEWSkgPT0gMFVMKSB7DQotICAgICAgLyogIElmIEFERU4gYml0IGlzIHNldCBsZXNzIHRoYW4gNCBBREMgY2xvY2sgY3ljbGVzIGFmdGVyIHRoZSBBRENBTCBiaXQNCi0gICAgICAgICAgaGFzIGJlZW4gY2xlYXJlZCAoYWZ0ZXIgYSBjYWxpYnJhdGlvbiksIEFERU4gYml0IGlzIHJlc2V0IGJ5IHRoZQ0KLSAgICAgICAgICBjYWxpYnJhdGlvbiBsb2dpYy4NCi0gICAgICAgICAgVGhlIHdvcmthcm91bmQgaXMgdG8gY29udGludWUgc2V0dGluZyBBREVOIHVudGlsIEFEUkRZIGlzIGJlY29tZXMgMS4NCi0gICAgICAgICAgQWRkaXRpb25hbGx5LCBBRENfRU5BQkxFX1RJTUVPVVQgaXMgZGVmaW5lZCB0byBlbmNvbXBhc3MgdGhpcw0KLSAgICAgICAgICA0IEFEQyBjbG9jayBjeWNsZSBkdXJhdGlvbiAqLw0KLSAgICAgIC8qIE5vdGU6IFRlc3Qgb2YgQURDIGVuYWJsZWQgcmVxdWlyZWQgZHVlIHRvIGhhcmR3YXJlIGNvbnN0cmFpbnQgdG8gICAgICovDQotICAgICAgLyogICAgICAgbm90IGVuYWJsZSBBREMgaWYgYWxyZWFkeSBlbmFibGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgICBpZiAoTExfQURDX0lzRW5hYmxlZChoYWRjLT5JbnN0YW5jZSkgPT0gMFVMKSB7DQotICAgICAgICBMTF9BRENfRW5hYmxlKGhhZGMtPkluc3RhbmNlKTsNCi0gICAgICB9DQotDQotICAgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IEFEQ19FTkFCTEVfVElNRU9VVCkgew0KLSAgICAgICAgLyogTmV3IGNoZWNrIHRvIGF2b2lkIGZhbHNlIHRpbWVvdXQgZGV0ZWN0aW9uIGluIGNhc2Ugb2YgcHJlZW1wdGlvbiAqLw0KLSAgICAgICAgaWYgKF9fSEFMX0FEQ19HRVRfRkxBRyhoYWRjLCBBRENfRkxBR19SRFkpID09IDBVTCkgew0KLSAgICAgICAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gZXJyb3IgKi8NCi0gICAgICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9JTlRFUk5BTCk7DQotDQotICAgICAgICAgIC8qIFNldCBBREMgZXJyb3IgY29kZSB0byBBREMgcGVyaXBoZXJhbCBpbnRlcm5hbCBlcnJvciAqLw0KLSAgICAgICAgICBTRVRfQklUKGhhZGMtPkVycm9yQ29kZSwgSEFMX0FEQ19FUlJPUl9JTlRFUk5BTCk7DQotDQotICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7DQotICAgICAgICB9DQotICAgICAgfQ0KLSAgICB9DQotICB9DQotDQotICAvKiBSZXR1cm4gSEFMIHN0YXR1cyAqLw0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIHRoZSBzZWxlY3RlZCBBREMuDQotICogQG5vdGUgICBQcmVyZXF1aXNpdGUgY29uZGl0aW9uIHRvIHVzZSB0aGlzIGZ1bmN0aW9uOiBBREMgY29udmVyc2lvbnMgbXVzdCBiZQ0KLSAqICAgICAgICAgc3RvcHBlZC4NCi0gKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlDQotICogQHJldHZhbCBIQUwgc3RhdHVzLg0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEFEQ19EaXNhYmxlKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKSB7DQotICB1aW50MzJfdCB0aWNrc3RhcnQ7DQotICBjb25zdCB1aW50MzJfdCB0bXBfYWRjX2lzX2Rpc2FibGVfb25fZ29pbmcgPQ0KLSAgICAgIExMX0FEQ19Jc0Rpc2FibGVPbmdvaW5nKGhhZGMtPkluc3RhbmNlKTsNCi0NCi0gIC8qIFZlcmlmaWNhdGlvbiBpZiBBREMgaXMgbm90IGFscmVhZHkgZGlzYWJsZWQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgLyogTm90ZTogZm9yYmlkZGVuIHRvIGRpc2FibGUgQURDIChzZXQgYml0IEFEQ19DUl9BRERJUykgaWYgQURDIGlzIGFscmVhZHkgICovDQotICAvKiAgICAgICBkaXNhYmxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gIGlmICgoTExfQURDX0lzRW5hYmxlZChoYWRjLT5JbnN0YW5jZSkgIT0gMFVMKSAmJg0KLSAgICAgICh0bXBfYWRjX2lzX2Rpc2FibGVfb25fZ29pbmcgPT0gMFVMKSkgew0KLSAgICAvKiBDaGVjayBpZiBjb25kaXRpb25zIHRvIGRpc2FibGUgdGhlIEFEQyBhcmUgZnVsZmlsbGVkICovDQotICAgIGlmICgoaGFkYy0+SW5zdGFuY2UtPkNSICYNCi0gICAgICAgICAoQURDX0NSX0pBRFNUQVJUIHwgQURDX0NSX0FEU1RBUlQgfCBBRENfQ1JfQURFTikpID09IEFEQ19DUl9BREVOKSB7DQotICAgICAgLyogRGlzYWJsZSB0aGUgQURDIHBlcmlwaGVyYWwgKi8NCi0gICAgICBMTF9BRENfRGlzYWJsZShoYWRjLT5JbnN0YW5jZSk7DQotICAgICAgX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgKEFEQ19GTEFHX0VPU01QIHwgQURDX0ZMQUdfUkRZKSk7DQotICAgIH0gZWxzZSB7DQotICAgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lIHRvIGVycm9yICovDQotICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9JTlRFUk5BTCk7DQotDQotICAgICAgLyogU2V0IEFEQyBlcnJvciBjb2RlIHRvIEFEQyBwZXJpcGhlcmFsIGludGVybmFsIGVycm9yICovDQotICAgICAgU0VUX0JJVChoYWRjLT5FcnJvckNvZGUsIEhBTF9BRENfRVJST1JfSU5URVJOQUwpOw0KLQ0KLSAgICAgIHJldHVybiBIQUxfRVJST1I7DQotICAgIH0NCi0NCi0gICAgLyogV2FpdCBmb3IgQURDIGVmZmVjdGl2ZWx5IGRpc2FibGVkICovDQotICAgIC8qIEdldCB0aWNrIGNvdW50ICovDQotICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7DQotDQotICAgIHdoaWxlICgoaGFkYy0+SW5zdGFuY2UtPkNSICYgQURDX0NSX0FERU4pICE9IDBVTCkgew0KLSAgICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBBRENfRElTQUJMRV9USU1FT1VUKSB7DQotICAgICAgICAvKiBOZXcgY2hlY2sgdG8gYXZvaWQgZmFsc2UgdGltZW91dCBkZXRlY3Rpb24gaW4gY2FzZSBvZiBwcmVlbXB0aW9uICovDQotICAgICAgICBpZiAoKGhhZGMtPkluc3RhbmNlLT5DUiAmIEFEQ19DUl9BREVOKSAhPSAwVUwpIHsNCi0gICAgICAgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lIHRvIGVycm9yICovDQotICAgICAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfRVJST1JfSU5URVJOQUwpOw0KLQ0KLSAgICAgICAgICAvKiBTZXQgQURDIGVycm9yIGNvZGUgdG8gQURDIHBlcmlwaGVyYWwgaW50ZXJuYWwgZXJyb3IgKi8NCi0gICAgICAgICAgU0VUX0JJVChoYWRjLT5FcnJvckNvZGUsIEhBTF9BRENfRVJST1JfSU5URVJOQUwpOw0KLQ0KLSAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgLyogUmV0dXJuIEhBTCBzdGF0dXMgKi8NCi0gIHJldHVybiBIQUxfT0s7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRE1BIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrLg0KLSAqIEBwYXJhbSBoZG1hIHBvaW50ZXIgdG8gRE1BIGhhbmRsZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi12b2lkIEFEQ19ETUFDb252Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkgew0KLSAgLyogUmV0cmlldmUgQURDIGhhbmRsZSBjb3JyZXNwb25kaW5nIHRvIGN1cnJlbnQgRE1BIGhhbmRsZSAqLw0KLSAgQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMgPQ0KLSAgICAgIChBRENfSGFuZGxlVHlwZURlZiAqKSgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50Ow0KLQ0KLSAgLyogVXBkYXRlIHN0YXRlIG1hY2hpbmUgb24gY29udmVyc2lvbiBzdGF0dXMgaWYgbm90IGluIGVycm9yIHN0YXRlICovDQotICBpZiAoKGhhZGMtPlN0YXRlICYNCi0gICAgICAgKEhBTF9BRENfU1RBVEVfRVJST1JfSU5URVJOQUwgfCBIQUxfQURDX1NUQVRFX0VSUk9SX0RNQSkpID09IDBVTCkgew0KLSAgICAvKiBTZXQgQURDIHN0YXRlICovDQotICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfUkVHX0VPQyk7DQotDQotICAgIC8qIERldGVybWluZSB3aGV0aGVyIGFueSBmdXJ0aGVyIGNvbnZlcnNpb24gdXBjb21pbmcgb24gZ3JvdXAgcmVndWxhciAgICAgKi8NCi0gICAgLyogYnkgZXh0ZXJuYWwgdHJpZ2dlciwgY29udGludW91cyBtb2RlIG9yIHNjYW4gc2VxdWVuY2Ugb24gZ29pbmcgICAgICAgICAqLw0KLSAgICAvKiB0byBkaXNhYmxlIGludGVycnVwdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIC8qIElzIGl0IHRoZSBlbmQgb2YgdGhlIHJlZ3VsYXIgc2VxdWVuY2UgPyAqLw0KLSAgICBpZiAoKGhhZGMtPkluc3RhbmNlLT5JU1IgJiBBRENfRkxBR19FT1MpICE9IDBVTCkgew0KLSAgICAgIC8qIEFyZSBjb252ZXJzaW9ucyBzb2Z0d2FyZS10cmlnZ2VyZWQgPyAqLw0KLSAgICAgIGlmIChMTF9BRENfUkVHX0lzVHJpZ2dlclNvdXJjZVNXU3RhcnQoaGFkYy0+SW5zdGFuY2UpICE9IDBVTCkgew0KLSAgICAgICAgLyogSXMgQ09OVCBiaXQgc2V0ID8gKi8NCi0gICAgICAgIGlmIChSRUFEX0JJVChoYWRjLT5JbnN0YW5jZS0+Q0ZHUiwgQURDX0NGR1JfQ09OVCkgPT0gMFVMKSB7DQotICAgICAgICAgIC8qIENPTlQgYml0IGlzIG5vdCBzZXQsIG5vIG1vcmUgY29udmVyc2lvbnMgZXhwZWN0ZWQgKi8NCi0gICAgICAgICAgQ0xFQVJfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX1JFR19CVVNZKTsNCi0gICAgICAgICAgaWYgKChoYWRjLT5TdGF0ZSAmIEhBTF9BRENfU1RBVEVfSU5KX0JVU1kpID09IDBVTCkgew0KLSAgICAgICAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfUkVBRFkpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgfQ0KLSAgICB9IGVsc2Ugew0KLSAgICAgIC8qIERNQSBFbmQgb2YgVHJhbnNmZXIgaW50ZXJydXB0IHdhcyB0cmlnZ2VyZWQgYnV0IGNvbnZlcnNpb25zIHNlcXVlbmNlDQotICAgICAgICAgaXMgbm90IG92ZXIuIElmIERNQUNGRyBpcyBzZXQgdG8gMCwgY29udmVyc2lvbnMgYXJlIHN0b3BwZWQuICovDQotICAgICAgaWYgKFJFQURfQklUKGhhZGMtPkluc3RhbmNlLT5DRkdSLCBBRENfQ0ZHUl9ETUFDRkcpID09IDBVTCkgew0KLSAgICAgICAgLyogRE1BQ0ZHIGJpdCBpcyBub3Qgc2V0LCBjb252ZXJzaW9ucyBhcmUgc3RvcHBlZC4gKi8NCi0gICAgICAgIENMRUFSX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSk7DQotICAgICAgICBpZiAoKGhhZGMtPlN0YXRlICYgSEFMX0FEQ19TVEFURV9JTkpfQlVTWSkgPT0gMFVMKSB7DQotICAgICAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfUkVBRFkpOw0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKiBDb252ZXJzaW9uIGNvbXBsZXRlIGNhbGxiYWNrICovDQotI2lmIChVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkNCi0gICAgaGFkYy0+Q29udkNwbHRDYWxsYmFjayhoYWRjKTsNCi0jZWxzZQ0KLSAgICBIQUxfQURDX0NvbnZDcGx0Q2FsbGJhY2soaGFkYyk7DQotI2VuZGlmICAgLyogVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotICB9IGVsc2UgLyogRE1BIGFuZC1vciBpbnRlcm5hbCBlcnJvciBvY2N1cnJlZCAqLw0KLSAgew0KLSAgICBpZiAoKGhhZGMtPlN0YXRlICYgSEFMX0FEQ19TVEFURV9FUlJPUl9JTlRFUk5BTCkgIT0gMFVMKSB7DQotICAgICAgLyogQ2FsbCBIQUwgQURDIEVycm9yIENhbGxiYWNrIGZ1bmN0aW9uICovDQotI2lmIChVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkNCi0gICAgICBoYWRjLT5FcnJvckNhbGxiYWNrKGhhZGMpOw0KLSNlbHNlDQotICAgICAgSEFMX0FEQ19FcnJvckNhbGxiYWNrKGhhZGMpOw0KLSNlbmRpZiAvKiBVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi0gICAgfSBlbHNlIHsNCi0gICAgICAvKiBDYWxsIEFEQyBETUEgZXJyb3IgY2FsbGJhY2sgKi8NCi0gICAgICBoYWRjLT5ETUFfSGFuZGxlLT5YZmVyRXJyb3JDYWxsYmFjayhoZG1hKTsNCi0gICAgfQ0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERNQSBoYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrLg0KLSAqIEBwYXJhbSBoZG1hIHBvaW50ZXIgdG8gRE1BIGhhbmRsZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi12b2lkIEFEQ19ETUFIYWxmQ29udkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpIHsNCi0gIC8qIFJldHJpZXZlIEFEQyBoYW5kbGUgY29ycmVzcG9uZGluZyB0byBjdXJyZW50IERNQSBoYW5kbGUgKi8NCi0gIEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjID0NCi0gICAgICAoQURDX0hhbmRsZVR5cGVEZWYgKikoKERNQV9IYW5kbGVUeXBlRGVmICopaGRtYSktPlBhcmVudDsNCi0NCi0gIC8qIEhhbGYgY29udmVyc2lvbiBjYWxsYmFjayAqLw0KLSNpZiAoVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpDQotICBoYWRjLT5Db252SGFsZkNwbHRDYWxsYmFjayhoYWRjKTsNCi0jZWxzZQ0KLSAgSEFMX0FEQ19Db252SGFsZkNwbHRDYWxsYmFjayhoYWRjKTsNCi0jZW5kaWYgLyogVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRE1BIGVycm9yIGNhbGxiYWNrLg0KLSAqIEBwYXJhbSBoZG1hIHBvaW50ZXIgdG8gRE1BIGhhbmRsZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi12b2lkIEFEQ19ETUFFcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkgew0KLSAgLyogUmV0cmlldmUgQURDIGhhbmRsZSBjb3JyZXNwb25kaW5nIHRvIGN1cnJlbnQgRE1BIGhhbmRsZSAqLw0KLSAgQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMgPQ0KLSAgICAgIChBRENfSGFuZGxlVHlwZURlZiAqKSgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50Ow0KLQ0KLSAgLyogU2V0IEFEQyBzdGF0ZSAqLw0KLSAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9ETUEpOw0KLQ0KLSAgLyogU2V0IEFEQyBlcnJvciBjb2RlIHRvIERNQSBlcnJvciAqLw0KLSAgU0VUX0JJVChoYWRjLT5FcnJvckNvZGUsIEhBTF9BRENfRVJST1JfRE1BKTsNCi0NCi0gIC8qIEVycm9yIGNhbGxiYWNrICovDQotI2lmIChVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkNCi0gIGhhZGMtPkVycm9yQ2FsbGJhY2soaGFkYyk7DQotI2Vsc2UNCi0gIEhBTF9BRENfRXJyb3JDYWxsYmFjayhoYWRjKTsNCi0jZW5kaWYgLyogVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotI2VuZGlmIC8qIEhBTF9BRENfTU9EVUxFX0VOQUJMRUQgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZzR4eF9oYWxfYWRjLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcKKyAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIEFuYWxvZyB0byBEaWdpdGFsIENvbnZlcnRlciAoQURDKQorICAqICAgICAgICAgIHBlcmlwaGVyYWw6CisgICogICAgICAgICAgICsgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucworICAqICAgICAgICAgIE90aGVyIGZ1bmN0aW9ucyAoZXh0ZW5kZWQgZnVuY3Rpb25zKSBhcmUgYXZhaWxhYmxlIGluIGZpbGUKKyAgKiAgICAgICAgICAic3RtMzJnNHh4X2hhbF9hZGNfZXguYyIuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0ZXJtcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlCisgICogaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc29mdHdhcmUgY29tcG9uZW50LgorICAqIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcyB3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICBAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAjIyMjIyBBREMgcGVyaXBoZXJhbCBmZWF0dXJlcyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAoKykgMTItYml0LCAxMC1iaXQsIDgtYml0IG9yIDYtYml0IGNvbmZpZ3VyYWJsZSByZXNvbHV0aW9uLgorCisgICgrKSBJbnRlcnJ1cHQgZ2VuZXJhdGlvbiBhdCB0aGUgZW5kIG9mIHJlZ3VsYXIgY29udmVyc2lvbiBhbmQgaW4gY2FzZSBvZgorICAgICAgYW5hbG9nIHdhdGNoZG9nIG9yIG92ZXJydW4gZXZlbnRzLgorCisgICgrKSBTaW5nbGUgYW5kIGNvbnRpbnVvdXMgY29udmVyc2lvbiBtb2Rlcy4KKworICAoKykgU2NhbiBtb2RlIGZvciBjb252ZXJzaW9uIG9mIHNldmVyYWwgY2hhbm5lbHMgc2VxdWVudGlhbGx5LgorCisgICgrKSBEYXRhIGFsaWdubWVudCB3aXRoIGluLWJ1aWx0IGRhdGEgY29oZXJlbmN5LgorCisgICgrKSBQcm9ncmFtbWFibGUgc2FtcGxpbmcgdGltZSAoY2hhbm5lbCB3aXNlKQorCisgICgrKSBFeHRlcm5hbCB0cmlnZ2VyICh0aW1lciBvciBFWFRJKSB3aXRoIGNvbmZpZ3VyYWJsZSBwb2xhcml0eQorCisgICgrKSBETUEgcmVxdWVzdCBnZW5lcmF0aW9uIGZvciB0cmFuc2ZlciBvZiBjb252ZXJzaW9ucyBkYXRhIG9mIHJlZ3VsYXIgZ3JvdXAuCisKKyAgKCspIENvbmZpZ3VyYWJsZSBkZWxheSBiZXR3ZWVuIGNvbnZlcnNpb25zIGluIER1YWwgaW50ZXJsZWF2ZWQgbW9kZS4KKworICAoKykgQURDIGNoYW5uZWxzIHNlbGVjdGFibGUgc2luZ2xlL2RpZmZlcmVudGlhbCBpbnB1dC4KKworICAoKykgQURDIG9mZnNldCBzaGFyZWQgb24gNCBvZmZzZXQgaW5zdGFuY2VzLgorICAoKykgQURDIGdhaW4gY29tcGVuc2F0aW9uCisKKyAgKCspIEFEQyBjYWxpYnJhdGlvbgorCisgICgrKSBBREMgY29udmVyc2lvbiBvZiByZWd1bGFyIGdyb3VwLgorCisgICgrKSBBREMgc3VwcGx5IHJlcXVpcmVtZW50czogMS42MiBWIHRvIDMuNiBWLgorCisgICgrKSBBREMgaW5wdXQgcmFuZ2U6IGZyb20gVnJlZi0gKGNvbm5lY3RlZCB0byBWc3NhKSB0byBWcmVmKyAoY29ubmVjdGVkIHRvCisgICAgICBWZGRhIG9yIHRvIGFuIGV4dGVybmFsIHZvbHRhZ2UgcmVmZXJlbmNlKS4KKworCisgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKworICAgICAqKiogQ29uZmlndXJhdGlvbiBvZiB0b3AgbGV2ZWwgcGFyYW1ldGVycyByZWxhdGVkIHRvIEFEQyAqKioKKyAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIFsuLl0KKworICAgICgjKSBFbmFibGUgdGhlIEFEQyBpbnRlcmZhY2UKKyAgICAgICAgKCsrKSBBcyBwcmVyZXF1aXNpdGUsIEFEQyBjbG9jayBtdXN0IGJlIGNvbmZpZ3VyZWQgYXQgUkNDIHRvcCBsZXZlbC4KKworICAgICAgICAoKyspIFR3byBjbG9jayBzZXR0aW5ncyBhcmUgbWFuZGF0b3J5OgorICAgICAgICAgICAgICgrKyspIEFEQyBjbG9jayAoY29yZSBjbG9jaywgYWxzbyBwb3NzaWJseSBjb252ZXJzaW9uIGNsb2NrKS4KKworICAgICAgICAgICAgICgrKyspIEFEQyBjbG9jayAoY29udmVyc2lvbnMgY2xvY2spLgorICAgICAgICAgICAgICAgICAgIFR3byBwb3NzaWJsZSBjbG9jayBzb3VyY2VzOiBzeW5jaHJvbm91cyBjbG9jayBkZXJpdmVkIGZyb20KKyAgQUhCIGNsb2NrIG9yIGFzeW5jaHJvbm91cyBjbG9jayBkZXJpdmVkIGZyb20gc3lzdGVtIGNsb2NrIG9yIFBMTCAob3V0cHV0CisgIGRpdmlkZXIgUCkgcnVubmluZyB1cCB0byA3NU1Iei4KKworICAgICAgICAgICAgICgrKyspIEV4YW1wbGU6CisgICAgICAgICAgICAgICAgICAgSW50byBIQUxfQURDX01zcEluaXQoKSAocmVjb21tZW5kZWQgY29kZSBsb2NhdGlvbikgb3Igd2l0aAorICAgICAgICAgICAgICAgICAgIG90aGVyIGRldmljZSBjbG9jayBwYXJhbWV0ZXJzIGNvbmZpZ3VyYXRpb246CisgICAgICAgICAgICAgICAoKysrKSBfX0hBTF9SQ0NfQURDX0NMS19FTkFCTEUoKTsgICAgICAgICAgICAgICAgICAobWFuZGF0b3J5KQorCisgICAgICAgICAgICAgICBSQ0NfQURDQ0xLU09VUkNFX1BMTCBlbmFibGU6ICAgICAgICAgICAgICAgICAgICAgICAob3B0aW9uYWw6IGlmCisgIGFzeW5jaHJvbm91cyBjbG9jayBzZWxlY3RlZCkKKyAgICAgICAgICAgICAgICgrKyspIFJDQ19QZXJpcGhDbGtJbml0VHlwZURlZiAgIFJDQ19QZXJpcGhDbGtJbml0OworICAgICAgICAgICAgICAgKCsrKykgUGVyaXBoQ2xrSW5pdC5QZXJpcGhDbG9ja1NlbGVjdGlvbiA9IFJDQ19QRVJJUEhDTEtfQURDOworICAgICAgICAgICAgICAgKCsrKykgUGVyaXBoQ2xrSW5pdC5BZGNDbG9ja1NlbGVjdGlvbiAgICA9IFJDQ19BRENDTEtTT1VSQ0VfUExMOworICAgICAgICAgICAgICAgKCsrKykgSEFMX1JDQ0V4X1BlcmlwaENMS0NvbmZpZygmUGVyaXBoQ2xrSW5pdCk7CisKKyAgICAgICAgKCsrKSBBREMgY2xvY2sgc291cmNlIGFuZCBjbG9jayBwcmVzY2FsZXIgYXJlIGNvbmZpZ3VyZWQgYXQgQURDIGxldmVsCisgIHdpdGggcGFyYW1ldGVyICJDbG9ja1ByZXNjYWxlciIgdXNpbmcgZnVuY3Rpb24gSEFMX0FEQ19Jbml0KCkuCisKKyAgICAoIykgQURDIHBpbnMgY29uZmlndXJhdGlvbgorICAgICAgICAgKCsrKSBFbmFibGUgdGhlIGNsb2NrIGZvciB0aGUgQURDIEdQSU9zCisgICAgICAgICAgICAgIHVzaW5nIG1hY3JvIF9fSEFMX1JDQ19HUElPeF9DTEtfRU5BQkxFKCkKKyAgICAgICAgICgrKykgQ29uZmlndXJlIHRoZXNlIEFEQyBwaW5zIGluIGFuYWxvZyBtb2RlCisgICAgICAgICAgICAgIHVzaW5nIGZ1bmN0aW9uIEhBTF9HUElPX0luaXQoKQorCisgICAgKCMpIE9wdGlvbmFsbHksIGluIGNhc2Ugb2YgdXNhZ2Ugb2YgQURDIHdpdGggaW50ZXJydXB0aW9uczoKKyAgICAgICAgICgrKykgQ29uZmlndXJlIHRoZSBOVklDIGZvciBBREMKKyAgICAgICAgICAgICAgdXNpbmcgZnVuY3Rpb24gSEFMX05WSUNfRW5hYmxlSVJRKEFEQ3hfSVJRbikKKyAgICAgICAgICgrKykgSW5zZXJ0IHRoZSBBREMgaW50ZXJydXB0aW9uIGhhbmRsZXIgZnVuY3Rpb24gSEFMX0FEQ19JUlFIYW5kbGVyKCkKKyAgICAgICAgICAgICAgaW50byB0aGUgZnVuY3Rpb24gb2YgY29ycmVzcG9uZGluZyBBREMgaW50ZXJydXB0aW9uIHZlY3RvcgorICAgICAgICAgICAgICBBREN4X0lSUUhhbmRsZXIoKS4KKworICAgICgjKSBPcHRpb25hbGx5LCBpbiBjYXNlIG9mIHVzYWdlIG9mIERNQToKKyAgICAgICAgICgrKykgQ29uZmlndXJlIHRoZSBETUEgKERNQSBjaGFubmVsLCBtb2RlIG5vcm1hbCBvciBjaXJjdWxhciwgLi4uKQorICAgICAgICAgICAgICB1c2luZyBmdW5jdGlvbiBIQUxfRE1BX0luaXQoKS4KKyAgICAgICAgICgrKykgQ29uZmlndXJlIHRoZSBOVklDIGZvciBETUEKKyAgICAgICAgICAgICAgdXNpbmcgZnVuY3Rpb24gSEFMX05WSUNfRW5hYmxlSVJRKERNQXhfQ2hhbm5lbHhfSVJRbikKKyAgICAgICAgICgrKykgSW5zZXJ0IHRoZSBBREMgaW50ZXJydXB0aW9uIGhhbmRsZXIgZnVuY3Rpb24gSEFMX0FEQ19JUlFIYW5kbGVyKCkKKyAgICAgICAgICAgICAgaW50byB0aGUgZnVuY3Rpb24gb2YgY29ycmVzcG9uZGluZyBETUEgaW50ZXJydXB0aW9uIHZlY3RvcgorICAgICAgICAgICAgICBETUF4X0NoYW5uZWx4X0lSUUhhbmRsZXIoKS4KKworICAgICAqKiogQ29uZmlndXJhdGlvbiBvZiBBREMsIGdyb3VwIHJlZ3VsYXIsIGNoYW5uZWxzIHBhcmFtZXRlcnMgKioqCisgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgWy4uXQorCisgICAgKCMpIENvbmZpZ3VyZSB0aGUgQURDIHBhcmFtZXRlcnMgKHJlc29sdXRpb24sIGRhdGEgYWxpZ25tZW50LCAuLi4pCisgICAgICAgIGFuZCByZWd1bGFyIGdyb3VwIHBhcmFtZXRlcnMgKGNvbnZlcnNpb24gdHJpZ2dlciwgc2VxdWVuY2VyLCAuLi4pCisgICAgICAgIHVzaW5nIGZ1bmN0aW9uIEhBTF9BRENfSW5pdCgpLgorCisgICAgKCMpIENvbmZpZ3VyZSB0aGUgY2hhbm5lbHMgZm9yIHJlZ3VsYXIgZ3JvdXAgcGFyYW1ldGVycyAoY2hhbm5lbCBudW1iZXIsCisgICAgICAgIGNoYW5uZWwgcmFuayBpbnRvIHNlcXVlbmNlciwgLi4uLCBpbnRvIHJlZ3VsYXIgZ3JvdXApCisgICAgICAgIHVzaW5nIGZ1bmN0aW9uIEhBTF9BRENfQ29uZmlnQ2hhbm5lbCgpLgorCisgICAgKCMpIE9wdGlvbmFsbHksIGNvbmZpZ3VyZSB0aGUgYW5hbG9nIHdhdGNoZG9nIHBhcmFtZXRlcnMgKGNoYW5uZWxzCisgICAgICAgIG1vbml0b3JlZCwgdGhyZXNob2xkcywgLi4uKQorICAgICAgICB1c2luZyBmdW5jdGlvbiBIQUxfQURDX0FuYWxvZ1dER0NvbmZpZygpLgorCisgICAgICoqKiBFeGVjdXRpb24gb2YgQURDIGNvbnZlcnNpb25zICoqKgorICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgWy4uXQorCisgICAgKCMpIE9wdGlvbmFsbHksIHBlcmZvcm0gYW4gYXV0b21hdGljIEFEQyBjYWxpYnJhdGlvbiB0byBpbXByb3ZlIHRoZQorICAgICAgICBjb252ZXJzaW9uIGFjY3VyYWN5CisgICAgICAgIHVzaW5nIGZ1bmN0aW9uIEhBTF9BRENFeF9DYWxpYnJhdGlvbl9TdGFydCgpLgorCisgICAgKCMpIEFEQyBkcml2ZXIgY2FuIGJlIHVzZWQgYW1vbmcgdGhyZWUgbW9kZXM6IHBvbGxpbmcsIGludGVycnVwdGlvbiwKKyAgICAgICAgdHJhbnNmZXIgYnkgRE1BLgorCisgICAgICAgICgrKykgQURDIGNvbnZlcnNpb24gYnkgcG9sbGluZzoKKyAgICAgICAgICAoKysrKSBBY3RpdmF0ZSB0aGUgQURDIHBlcmlwaGVyYWwgYW5kIHN0YXJ0IGNvbnZlcnNpb25zCisgICAgICAgICAgICAgICAgdXNpbmcgZnVuY3Rpb24gSEFMX0FEQ19TdGFydCgpCisgICAgICAgICAgKCsrKykgV2FpdCBmb3IgQURDIGNvbnZlcnNpb24gY29tcGxldGlvbgorICAgICAgICAgICAgICAgIHVzaW5nIGZ1bmN0aW9uIEhBTF9BRENfUG9sbEZvckNvbnZlcnNpb24oKQorICAgICAgICAgICgrKyspIFJldHJpZXZlIGNvbnZlcnNpb24gcmVzdWx0cworICAgICAgICAgICAgICAgIHVzaW5nIGZ1bmN0aW9uIEhBTF9BRENfR2V0VmFsdWUoKQorICAgICAgICAgICgrKyspIFN0b3AgY29udmVyc2lvbiBhbmQgZGlzYWJsZSB0aGUgQURDIHBlcmlwaGVyYWwKKyAgICAgICAgICAgICAgICB1c2luZyBmdW5jdGlvbiBIQUxfQURDX1N0b3AoKQorCisgICAgICAgICgrKykgQURDIGNvbnZlcnNpb24gYnkgaW50ZXJydXB0aW9uOgorICAgICAgICAgICgrKyspIEFjdGl2YXRlIHRoZSBBREMgcGVyaXBoZXJhbCBhbmQgc3RhcnQgY29udmVyc2lvbnMKKyAgICAgICAgICAgICAgICB1c2luZyBmdW5jdGlvbiBIQUxfQURDX1N0YXJ0X0lUKCkKKyAgICAgICAgICAoKysrKSBXYWl0IGZvciBBREMgY29udmVyc2lvbiBjb21wbGV0aW9uIGJ5IGNhbGwgb2YgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICBIQUxfQURDX0NvbnZDcGx0Q2FsbGJhY2soKQorICAgICAgICAgICAgICAgICh0aGlzIGZ1bmN0aW9uIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gdXNlciBwcm9ncmFtKQorICAgICAgICAgICgrKyspIFJldHJpZXZlIGNvbnZlcnNpb24gcmVzdWx0cworICAgICAgICAgICAgICAgIHVzaW5nIGZ1bmN0aW9uIEhBTF9BRENfR2V0VmFsdWUoKQorICAgICAgICAgICgrKyspIFN0b3AgY29udmVyc2lvbiBhbmQgZGlzYWJsZSB0aGUgQURDIHBlcmlwaGVyYWwKKyAgICAgICAgICAgICAgICB1c2luZyBmdW5jdGlvbiBIQUxfQURDX1N0b3BfSVQoKQorCisgICAgICAgICgrKykgQURDIGNvbnZlcnNpb24gd2l0aCB0cmFuc2ZlciBieSBETUE6CisgICAgICAgICAgKCsrKykgQWN0aXZhdGUgdGhlIEFEQyBwZXJpcGhlcmFsIGFuZCBzdGFydCBjb252ZXJzaW9ucworICAgICAgICAgICAgICAgIHVzaW5nIGZ1bmN0aW9uIEhBTF9BRENfU3RhcnRfRE1BKCkKKyAgICAgICAgICAoKysrKSBXYWl0IGZvciBBREMgY29udmVyc2lvbiBjb21wbGV0aW9uIGJ5IGNhbGwgb2YgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICBIQUxfQURDX0NvbnZDcGx0Q2FsbGJhY2soKSBvciBIQUxfQURDX0NvbnZIYWxmQ3BsdENhbGxiYWNrKCkKKyAgICAgICAgICAgICAgICAodGhlc2UgZnVuY3Rpb25zIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gdXNlciBwcm9ncmFtKQorICAgICAgICAgICgrKyspIENvbnZlcnNpb24gcmVzdWx0cyBhcmUgYXV0b21hdGljYWxseSB0cmFuc2ZlcnJlZCBieSBETUEgaW50bworICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uIHZhcmlhYmxlIGFkZHJlc3MuCisgICAgICAgICAgKCsrKykgU3RvcCBjb252ZXJzaW9uIGFuZCBkaXNhYmxlIHRoZSBBREMgcGVyaXBoZXJhbAorICAgICAgICAgICAgICAgIHVzaW5nIGZ1bmN0aW9uIEhBTF9BRENfU3RvcF9ETUEoKQorCisgICAgIFsuLl0KKworICAgIChAKSBDYWxsYmFjayBmdW5jdGlvbnMgbXVzdCBiZSBpbXBsZW1lbnRlZCBpbiB1c2VyIHByb2dyYW06CisgICAgICAoK0ApIEhBTF9BRENfRXJyb3JDYWxsYmFjaygpCisgICAgICAoK0ApIEhBTF9BRENfTGV2ZWxPdXRPZldpbmRvd0NhbGxiYWNrKCkgKGNhbGxiYWNrIG9mIGFuYWxvZyB3YXRjaGRvZykKKyAgICAgICgrQCkgSEFMX0FEQ19Db252Q3BsdENhbGxiYWNrKCkKKyAgICAgICgrQCkgSEFMX0FEQ19Db252SGFsZkNwbHRDYWxsYmFjaworCisgICAgICoqKiBEZWluaXRpYWxpemF0aW9uIG9mIEFEQyAqKioKKyAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIFsuLl0KKworICAgICgjKSBEaXNhYmxlIHRoZSBBREMgaW50ZXJmYWNlCisgICAgICAoKyspIEFEQyBjbG9jayBjYW4gYmUgaGFyZCByZXNldCBhbmQgZGlzYWJsZWQgYXQgUkNDIHRvcCBsZXZlbC4KKyAgICAgICAgKCsrKSBIYXJkIHJlc2V0IG9mIEFEQyBwZXJpcGhlcmFscworICAgICAgICAgICAgIHVzaW5nIG1hY3JvIF9fQURDeF9GT1JDRV9SRVNFVCgpLCBfX0FEQ3hfUkVMRUFTRV9SRVNFVCgpLgorICAgICAgICAoKyspIEFEQyBjbG9jayBkaXNhYmxlCisgICAgICAgICAgICAgdXNpbmcgdGhlIGVxdWl2YWxlbnQgbWFjcm8vZnVuY3Rpb25zIGFzIGNvbmZpZ3VyYXRpb24gc3RlcC4KKyAgICAgICAgICAgICAoKysrKSBFeGFtcGxlOgorICAgICAgICAgICAgICAgICAgIEludG8gSEFMX0FEQ19Nc3BEZUluaXQoKSAocmVjb21tZW5kZWQgY29kZSBsb2NhdGlvbikgb3Igd2l0aAorICAgICAgICAgICAgICAgICAgIG90aGVyIGRldmljZSBjbG9jayBwYXJhbWV0ZXJzIGNvbmZpZ3VyYXRpb246CisgICAgICAgICAgICAgICAoKysrKSBSQ0NfT3NjSW5pdFN0cnVjdHVyZS5Pc2NpbGxhdG9yVHlwZSA9CisgIFJDQ19PU0NJTExBVE9SVFlQRV9IU0kxNDsKKyAgICAgICAgICAgICAgICgrKyspIFJDQ19Pc2NJbml0U3RydWN0dXJlLkhTSTE0U3RhdGUgPSBSQ0NfSFNJMTRfT0ZGOyAoaWYgbm90CisgIHVzZWQgZm9yIHN5c3RlbSBjbG9jaykKKyAgICAgICAgICAgICAgICgrKyspIEhBTF9SQ0NfT3NjQ29uZmlnKCZSQ0NfT3NjSW5pdFN0cnVjdHVyZSk7CisKKyAgICAoIykgQURDIHBpbnMgY29uZmlndXJhdGlvbgorICAgICAgICAgKCsrKSBEaXNhYmxlIHRoZSBjbG9jayBmb3IgdGhlIEFEQyBHUElPcworICAgICAgICAgICAgICB1c2luZyBtYWNybyBfX0hBTF9SQ0NfR1BJT3hfQ0xLX0RJU0FCTEUoKQorCisgICAgKCMpIE9wdGlvbmFsbHksIGluIGNhc2Ugb2YgdXNhZ2Ugb2YgQURDIHdpdGggaW50ZXJydXB0aW9uczoKKyAgICAgICAgICgrKykgRGlzYWJsZSB0aGUgTlZJQyBmb3IgQURDCisgICAgICAgICAgICAgIHVzaW5nIGZ1bmN0aW9uIEhBTF9OVklDX0VuYWJsZUlSUShBREN4X0lSUW4pCisKKyAgICAoIykgT3B0aW9uYWxseSwgaW4gY2FzZSBvZiB1c2FnZSBvZiBETUE6CisgICAgICAgICAoKyspIERlaW5pdGlhbGl6ZSB0aGUgRE1BCisgICAgICAgICAgICAgIHVzaW5nIGZ1bmN0aW9uIEhBTF9ETUFfSW5pdCgpLgorICAgICAgICAgKCsrKSBEaXNhYmxlIHRoZSBOVklDIGZvciBETUEKKyAgICAgICAgICAgICAgdXNpbmcgZnVuY3Rpb24gSEFMX05WSUNfRW5hYmxlSVJRKERNQXhfQ2hhbm5lbHhfSVJRbikKKworICAgIFsuLl0KKworICAgICoqKiBDYWxsYmFjayByZWdpc3RyYXRpb24gKioqCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorCisgICAgIFRoZSBjb21waWxhdGlvbiBmbGFnIFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUywgd2hlbiBzZXQgdG8gMSwKKyAgICAgYWxsb3dzIHRoZSB1c2VyIHRvIGNvbmZpZ3VyZSBkeW5hbWljYWxseSB0aGUgZHJpdmVyIGNhbGxiYWNrcy4KKyAgICAgVXNlIEZ1bmN0aW9ucyBAcmVmIEhBTF9BRENfUmVnaXN0ZXJDYWxsYmFjaygpCisgICAgIHRvIHJlZ2lzdGVyIGFuIGludGVycnVwdCBjYWxsYmFjay4KKyAgICBbLi5dCisKKyAgICAgRnVuY3Rpb24gQHJlZiBIQUxfQURDX1JlZ2lzdGVyQ2FsbGJhY2soKSBhbGxvd3MgdG8gcmVnaXN0ZXIgZm9sbG93aW5nCisgIGNhbGxiYWNrczoKKyAgICAgICAoKykgQ29udkNwbHRDYWxsYmFjayAgICAgICAgICAgICAgIDogQURDIGNvbnZlcnNpb24gY29tcGxldGUgY2FsbGJhY2sKKyAgICAgICAoKykgQ29udkhhbGZDcGx0Q2FsbGJhY2sgICAgICAgICAgIDogQURDIGNvbnZlcnNpb24gRE1BIGhhbGYtdHJhbnNmZXIKKyAgY2FsbGJhY2sKKyAgICAgICAoKykgTGV2ZWxPdXRPZldpbmRvd0NhbGxiYWNrICAgICAgIDogQURDIGFuYWxvZyB3YXRjaGRvZyAxIGNhbGxiYWNrCisgICAgICAgKCspIEVycm9yQ2FsbGJhY2sgICAgICAgICAgICAgICAgICA6IEFEQyBlcnJvciBjYWxsYmFjaworICAgICAgICgrKSBJbmplY3RlZENvbnZDcGx0Q2FsbGJhY2sgICAgICAgOiBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbgorICBjb21wbGV0ZSBjYWxsYmFjaworICAgICAgICgrKSBJbmplY3RlZFF1ZXVlT3ZlcmZsb3dDYWxsYmFjayAgOiBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udGV4dCBxdWV1ZQorICBvdmVyZmxvdyBjYWxsYmFjaworICAgICAgICgrKSBMZXZlbE91dE9mV2luZG93MkNhbGxiYWNrICAgICAgOiBBREMgYW5hbG9nIHdhdGNoZG9nIDIgY2FsbGJhY2sKKyAgICAgICAoKykgTGV2ZWxPdXRPZldpbmRvdzNDYWxsYmFjayAgICAgIDogQURDIGFuYWxvZyB3YXRjaGRvZyAzIGNhbGxiYWNrCisgICAgICAgKCspIEVuZE9mU2FtcGxpbmdDYWxsYmFjayAgICAgICAgICA6IEFEQyBlbmQgb2Ygc2FtcGxpbmcgY2FsbGJhY2sKKyAgICAgICAoKykgTXNwSW5pdENhbGxiYWNrICAgICAgICAgICAgICAgIDogQURDIE1zcCBJbml0IGNhbGxiYWNrCisgICAgICAgKCspIE1zcERlSW5pdENhbGxiYWNrICAgICAgICAgICAgICA6IEFEQyBNc3AgRGVJbml0IGNhbGxiYWNrCisgICAgIFRoaXMgZnVuY3Rpb24gdGFrZXMgYXMgcGFyYW1ldGVycyB0aGUgSEFMIHBlcmlwaGVyYWwgaGFuZGxlLCB0aGUgQ2FsbGJhY2sKKyAgSUQgYW5kIGEgcG9pbnRlciB0byB0aGUgdXNlciBjYWxsYmFjayBmdW5jdGlvbi4KKyAgICBbLi5dCisKKyAgICAgVXNlIGZ1bmN0aW9uIEByZWYgSEFMX0FEQ19VblJlZ2lzdGVyQ2FsbGJhY2sgdG8gcmVzZXQgYSBjYWxsYmFjayB0byB0aGUKKyAgZGVmYXVsdCB3ZWFrIGZ1bmN0aW9uLgorICAgIFsuLl0KKworICAgICBAcmVmIEhBTF9BRENfVW5SZWdpc3RlckNhbGxiYWNrIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsCisgIGhhbmRsZSwgYW5kIHRoZSBDYWxsYmFjayBJRC4gVGhpcyBmdW5jdGlvbiBhbGxvd3MgdG8gcmVzZXQgZm9sbG93aW5nCisgIGNhbGxiYWNrczoKKyAgICAgICAoKykgQ29udkNwbHRDYWxsYmFjayAgICAgICAgICAgICAgIDogQURDIGNvbnZlcnNpb24gY29tcGxldGUgY2FsbGJhY2sKKyAgICAgICAoKykgQ29udkhhbGZDcGx0Q2FsbGJhY2sgICAgICAgICAgIDogQURDIGNvbnZlcnNpb24gRE1BIGhhbGYtdHJhbnNmZXIKKyAgY2FsbGJhY2sKKyAgICAgICAoKykgTGV2ZWxPdXRPZldpbmRvd0NhbGxiYWNrICAgICAgIDogQURDIGFuYWxvZyB3YXRjaGRvZyAxIGNhbGxiYWNrCisgICAgICAgKCspIEVycm9yQ2FsbGJhY2sgICAgICAgICAgICAgICAgICA6IEFEQyBlcnJvciBjYWxsYmFjaworICAgICAgICgrKSBJbmplY3RlZENvbnZDcGx0Q2FsbGJhY2sgICAgICAgOiBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbgorICBjb21wbGV0ZSBjYWxsYmFjaworICAgICAgICgrKSBJbmplY3RlZFF1ZXVlT3ZlcmZsb3dDYWxsYmFjayAgOiBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udGV4dCBxdWV1ZQorICBvdmVyZmxvdyBjYWxsYmFjaworICAgICAgICgrKSBMZXZlbE91dE9mV2luZG93MkNhbGxiYWNrICAgICAgOiBBREMgYW5hbG9nIHdhdGNoZG9nIDIgY2FsbGJhY2sKKyAgICAgICAoKykgTGV2ZWxPdXRPZldpbmRvdzNDYWxsYmFjayAgICAgIDogQURDIGFuYWxvZyB3YXRjaGRvZyAzIGNhbGxiYWNrCisgICAgICAgKCspIEVuZE9mU2FtcGxpbmdDYWxsYmFjayAgICAgICAgICA6IEFEQyBlbmQgb2Ygc2FtcGxpbmcgY2FsbGJhY2sKKyAgICAgICAoKykgTXNwSW5pdENhbGxiYWNrICAgICAgICAgICAgICAgIDogQURDIE1zcCBJbml0IGNhbGxiYWNrCisgICAgICAgKCspIE1zcERlSW5pdENhbGxiYWNrICAgICAgICAgICAgICA6IEFEQyBNc3AgRGVJbml0IGNhbGxiYWNrCisgICAgIFsuLl0KKworICAgICBCeSBkZWZhdWx0LCBhZnRlciB0aGUgQHJlZiBIQUxfQURDX0luaXQoKSBhbmQgd2hlbiB0aGUgc3RhdGUgaXMgQHJlZgorICBIQUxfQURDX1NUQVRFX1JFU0VUIGFsbCBjYWxsYmFja3MgYXJlIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyB3ZWFrIGZ1bmN0aW9uczoKKyAgICAgZXhhbXBsZXMgQHJlZiBIQUxfQURDX0NvbnZDcGx0Q2FsbGJhY2soKSwgQHJlZiBIQUxfQURDX0Vycm9yQ2FsbGJhY2soKS4KKyAgICAgRXhjZXB0aW9uIGRvbmUgZm9yIE1zcEluaXQgYW5kIE1zcERlSW5pdCBmdW5jdGlvbnMgdGhhdCBhcmUKKyAgICAgcmVzZXQgdG8gdGhlIGxlZ2FjeSB3ZWFrIGZ1bmN0aW9ucyBpbiB0aGUgQHJlZiBIQUxfQURDX0luaXQoKS8gQHJlZgorICBIQUxfQURDX0RlSW5pdCgpIG9ubHkgd2hlbiB0aGVzZSBjYWxsYmFja3MgYXJlIG51bGwgKG5vdCByZWdpc3RlcmVkCisgIGJlZm9yZWhhbmQpLgorICAgIFsuLl0KKworICAgICBJZiBNc3BJbml0IG9yIE1zcERlSW5pdCBhcmUgbm90IG51bGwsIHRoZSBAcmVmIEhBTF9BRENfSW5pdCgpLyBAcmVmCisgIEhBTF9BRENfRGVJbml0KCkga2VlcCBhbmQgdXNlIHRoZSB1c2VyIE1zcEluaXQvTXNwRGVJbml0IGNhbGxiYWNrcyAocmVnaXN0ZXJlZAorICBiZWZvcmVoYW5kKSB3aGF0ZXZlciB0aGUgc3RhdGUuCisgICAgIFsuLl0KKworICAgICBDYWxsYmFja3MgY2FuIGJlIHJlZ2lzdGVyZWQvdW5yZWdpc3RlcmVkIGluIEByZWYgSEFMX0FEQ19TVEFURV9SRUFEWSBzdGF0ZQorICBvbmx5LiBFeGNlcHRpb24gZG9uZSBNc3BJbml0L01zcERlSW5pdCBmdW5jdGlvbnMgdGhhdCBjYW4gYmUKKyAgcmVnaXN0ZXJlZC91bnJlZ2lzdGVyZWQgaW4gQHJlZiBIQUxfQURDX1NUQVRFX1JFQURZIG9yIEByZWYKKyAgSEFMX0FEQ19TVEFURV9SRVNFVCBzdGF0ZSwgdGh1cyByZWdpc3RlcmVkICh1c2VyKSBNc3BJbml0L0RlSW5pdCBjYWxsYmFja3MgY2FuCisgIGJlIHVzZWQgZHVyaW5nIHRoZSBJbml0L0RlSW5pdC4KKyAgICBbLi5dCisKKyAgICAgVGhlbiwgdGhlIHVzZXIgZmlyc3QgcmVnaXN0ZXJzIHRoZSBNc3BJbml0L01zcERlSW5pdCB1c2VyIGNhbGxiYWNrcworICAgICB1c2luZyBAcmVmIEhBTF9BRENfUmVnaXN0ZXJDYWxsYmFjaygpIGJlZm9yZSBjYWxsaW5nIEByZWYgSEFMX0FEQ19EZUluaXQoKQorICAgICBvciBAcmVmIEhBTF9BRENfSW5pdCgpIGZ1bmN0aW9uLgorICAgICBbLi5dCisKKyAgICAgV2hlbiB0aGUgY29tcGlsYXRpb24gZmxhZyBVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgaXMgc2V0IHRvIDAgb3IKKyAgICAgbm90IGRlZmluZWQsIHRoZSBjYWxsYmFjayByZWdpc3RyYXRpb24gZmVhdHVyZSBpcyBub3QgYXZhaWxhYmxlIGFuZCBhbGwKKyAgY2FsbGJhY2tzIGFyZSBzZXQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgd2VhayBmdW5jdGlvbnMuCisKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzR4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzR4eF9IQUxfRHJpdmVyCisgKiBAeworICovCisKKy8qKiBAZGVmZ3JvdXAgQURDIEFEQworICogQGJyaWVmIEFEQyBIQUwgbW9kdWxlIGRyaXZlcgorICogQHsKKyAqLworCisjaWZkZWYgSEFMX0FEQ19NT0RVTEVfRU5BQkxFRAorCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBBRENfUHJpdmF0ZV9Db25zdGFudHMgQURDIFByaXZhdGUgQ29uc3RhbnRzCisgKiBAeworICovCisKKyNkZWZpbmUgQURDX0NGR1JfRklFTERTXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQ19DRkdSX1JFUyB8IEFEQ19DRkdSX0FMSUdOIHwgQURDX0NGR1JfQ09OVCB8IEFEQ19DRkdSX09WUk1PRCB8IFwKKyAgIEFEQ19DRkdSX0RJU0NFTiB8IEFEQ19DRkdSX0RJU0NOVU0gfCBBRENfQ0ZHUl9FWFRFTiB8ICAgICAgICAgICAgIFwKKyAgIEFEQ19DRkdSX0VYVFNFTCkgLyohPCBBRENfQ0ZHUiBmaWVsZHMgb2YgcGFyYW1ldGVycyB0aGF0IGNhbiAgICAgIFwKK2JlIHVwZGF0ZWQgd2hlbiBubyByZWd1bGFyIGNvbnZlcnNpb24gaXMgb24tZ29pbmcgKi8KKworLyogVGltZW91dCB2YWx1ZXMgZm9yIEFEQyBvcGVyYXRpb25zIChlbmFibGUgc2V0dGxpbmcgdGltZSwgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgZGlzYWJsZSBzZXR0bGluZyB0aW1lLCAuLi4pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFZhbHVlcyBkZWZpbmVkIHRvIGJlIGhpZ2hlciB0aGFuIHdvcnN0IGNhc2VzOiBsb3cgY2xvY2sgZnJlcXVlbmN5LCAgICAgICAqLworLyogICBtYXhpbXVtIHByZXNjYWxlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQURDX0VOQUJMRV9USU1FT1VUICgyVUwpICAvKiE8IEFEQyBlbmFibGUgdGltZS1vdXQgdmFsdWUgICovCisjZGVmaW5lIEFEQ19ESVNBQkxFX1RJTUVPVVQgKDJVTCkgLyohPCBBREMgZGlzYWJsZSB0aW1lLW91dCB2YWx1ZSAqLworCisvKiBUaW1lb3V0IHRvIHdhaXQgZm9yIGN1cnJlbnQgY29udmVyc2lvbiBvbiBnb2luZyB0byBiZSBjb21wbGV0ZWQuICAgICAgICAgICAqLworLyogVGltZW91dCBmaXhlZCB0byBsb25nZXN0IEFEQyBjb252ZXJzaW9uIHBvc3NpYmxlLCBmb3IgMSBjaGFubmVsOiAgICAgICAgICAgKi8KKy8qICAgLSBtYXhpbXVtIHNhbXBsaW5nIHRpbWUgKDY0MC41IGFkY19jbGspICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIC0gQURDIHJlc29sdXRpb24gKFRzYXIgMTIgYml0cz0gMTIuNSBhZGNfY2xrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAtIFN5c3RlbSBjbG9jayAvIEFEQyBjbG9jayA8PSA0MDk2IChoeXBvdGhlc2lzIG9mIG1heGltdW0gY2xvY2sgcmF0aW8pICAgKi8KKy8qICAgLSBBREMgb3ZlcnNhbXBsaW5nIHJhdGlvIDI1NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIENhbGN1bGF0aW9uOiA2NTMgKiA0MDk2ICogMjU2IENQVSBjbG9jayBjeWNsZXMgbWF4ICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVW5pdDogY3ljbGVzIG9mIENQVSBjbG9jay4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQURDX0NPTlZFUlNJT05fVElNRV9NQVhfQ1BVX0NZQ0xFUyBcCisgICg2NTNVTCAqIDQwOTZVTCAqIDI1NlVMKSAvKiE8IEFEQyBjb252ZXJzaW9uIGNvbXBsZXRpb24gdGltZS1vdXQgdmFsdWUgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0V4cG9ydGVkX0Z1bmN0aW9ucyBBREMgRXhwb3J0ZWQgRnVuY3Rpb25zCisgKiBAeworICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uCitmdW5jdGlvbnMKKyAgKiBAYnJpZWYgICAgQURDIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBJbml0aWFsaXplIGFuZCBjb25maWd1cmUgdGhlIEFEQy4KKyAgICAgICgrKSBEZS1pbml0aWFsaXplIHRoZSBBREMuCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgQURDIHBlcmlwaGVyYWwgYW5kIHJlZ3VsYXIgZ3JvdXAgYWNjb3JkaW5nIHRvCisgKiAgICAgICAgIHBhcmFtZXRlcnMgc3BlY2lmaWVkIGluIHN0cnVjdHVyZSAiQURDX0luaXRUeXBlRGVmIi4KKyAqIEBub3RlICAgQXMgcHJlcmVxdWlzaXRlLCBBREMgY2xvY2sgbXVzdCBiZSBjb25maWd1cmVkIGF0IFJDQyB0b3AgbGV2ZWwKKyAqICAgICAgICAgKHJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIFJDQyBjb25maWd1cmF0aW9uIGZvciBBREMKKyAqICAgICAgICAgaW4gaGVhZGVyIG9mIHRoaXMgZmlsZSkuCisgKiBAbm90ZSAgIFBvc3NpYmlsaXR5IHRvIHVwZGF0ZSBwYXJhbWV0ZXJzIG9uIHRoZSBmbHk6CisgKiAgICAgICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIEFEQyBNU1AgKEhBTF9BRENfTXNwSW5pdCgpKSBvbmx5IHdoZW4KKyAqICAgICAgICAgY29taW5nIGZyb20gQURDIHN0YXRlIHJlc2V0LiBGb2xsb3dpbmcgY2FsbHMgdG8gdGhpcyBmdW5jdGlvbiBjYW4KKyAqICAgICAgICAgYmUgdXNlZCB0byByZWNvbmZpZ3VyZSBzb21lIHBhcmFtZXRlcnMgb2YgQURDX0luaXRUeXBlRGVmCisgKiAgICAgICAgIHN0cnVjdHVyZSBvbiB0aGUgZmx5LCB3aXRob3V0IG1vZGlmeWluZyBNU1AgY29uZmlndXJhdGlvbi4gSWYgQURDCisgKiAgICAgICAgIE1TUCBoYXMgdG8gYmUgbW9kaWZpZWQgYWdhaW4sIEhBTF9BRENfRGVJbml0KCkgbXVzdCBiZSBjYWxsZWQKKyAqICAgICAgICAgYmVmb3JlIEhBTF9BRENfSW5pdCgpLgorICogICAgICAgICBUaGUgc2V0dGluZyBvZiB0aGVzZSBwYXJhbWV0ZXJzIGlzIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZS4KKyAqICAgICAgICAgRm9yIHBhcmFtZXRlcnMgY29uc3RyYWludHMsIHNlZSBjb21tZW50cyBvZiBzdHJ1Y3R1cmUKKyAqICAgICAgICAgIkFEQ19Jbml0VHlwZURlZiIuCisgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gY29uZmlndXJlcyB0aGUgQURDIHdpdGhpbiAyIHNjb3Blczogc2NvcGUgb2YgZW50aXJlCisgKiAgICAgICAgIEFEQyBhbmQgc2NvcGUgb2YgcmVndWxhciBncm91cC4gRm9yIHBhcmFtZXRlcnMgZGV0YWlscywgc2VlIGNvbW1lbnRzCisgKiAgICAgICAgIG9mIHN0cnVjdHVyZSAiQURDX0luaXRUeXBlRGVmIi4KKyAqIEBub3RlICAgUGFyYW1ldGVycyByZWxhdGVkIHRvIGNvbW1vbiBBREMgcmVnaXN0ZXJzIChBREMgY2xvY2sgbW9kZSkgYXJlIHNldAorICogICAgICAgICBvbmx5IGlmIGFsbCBBRENzIGFyZSBkaXNhYmxlZC4KKyAqICAgICAgICAgSWYgdGhpcyBpcyBub3QgdGhlIGNhc2UsIHRoZXNlIGNvbW1vbiBwYXJhbWV0ZXJzIHNldHRpbmcgYXJlCisgKiAgICAgICAgIGJ5cGFzc2VkIHdpdGhvdXQgZXJyb3IgcmVwb3J0aW5nOiBpdCBjYW4gYmUgdGhlIGludGVuZGVkIGJlaGF2aW91ciBpbgorICogICAgICAgICBjYXNlIG9mIHVwZGF0ZSBvZiBhIHBhcmFtZXRlciBvZiBBRENfSW5pdFR5cGVEZWYgb24gdGhlIGZseSwKKyAqICAgICAgICAgd2l0aG91dCAgZGlzYWJsaW5nIHRoZSBvdGhlciBBRENzLgorICogQHBhcmFtIGhhZGMgQURDIGhhbmRsZQorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfSW5pdChBRENfSGFuZGxlVHlwZURlZiAqaGFkYykgeworICBIQUxfU3RhdHVzVHlwZURlZiB0bXBfaGFsX3N0YXR1cyA9IEhBTF9PSzsKKyAgdWludDMyX3QgdG1wX2NmZ3I7CisgIHVpbnQzMl90IHRtcF9hZGNfaXNfY29udmVyc2lvbl9vbl9nb2luZ19yZWd1bGFyOworICB1aW50MzJfdCB0bXBfYWRjX2lzX2NvbnZlcnNpb25fb25fZ29pbmdfaW5qZWN0ZWQ7CisgIF9fSU8gdWludDMyX3Qgd2FpdF9sb29wX2luZGV4ID0gMFVMOworCisgIC8qIENoZWNrIEFEQyBoYW5kbGUgKi8KKyAgaWYgKGhhZGMgPT0gTlVMTCkgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfQURDX0NMT0NLUFJFU0NBTEVSKGhhZGMtPkluaXQuQ2xvY2tQcmVzY2FsZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19SRVNPTFVUSU9OKGhhZGMtPkluaXQuUmVzb2x1dGlvbikpOworICBhc3NlcnRfcGFyYW0oSVNfQURDX0RBVEFfQUxJR04oaGFkYy0+SW5pdC5EYXRhQWxpZ24pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19HQUlOX0NPTVBFTlNBVElPTihoYWRjLT5Jbml0LkdhaW5Db21wZW5zYXRpb24pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19TQ0FOX01PREUoaGFkYy0+SW5pdC5TY2FuQ29udk1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoaGFkYy0+SW5pdC5Db250aW51b3VzQ29udk1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19FWFRUUklHX0VER0UoaGFkYy0+SW5pdC5FeHRlcm5hbFRyaWdDb252RWRnZSkpOworICBhc3NlcnRfcGFyYW0oSVNfQURDX0VYVFRSSUcoaGFkYywgaGFkYy0+SW5pdC5FeHRlcm5hbFRyaWdDb252KSk7CisgIGFzc2VydF9wYXJhbShJU19BRENfU0FNUExJTkdNT0RFKGhhZGMtPkluaXQuU2FtcGxpbmdNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKGhhZGMtPkluaXQuRE1BQ29udGludW91c1JlcXVlc3RzKSk7CisgIGFzc2VydF9wYXJhbShJU19BRENfRU9DX1NFTEVDVElPTihoYWRjLT5Jbml0LkVPQ1NlbGVjdGlvbikpOworICBhc3NlcnRfcGFyYW0oSVNfQURDX09WRVJSVU4oaGFkYy0+SW5pdC5PdmVycnVuKSk7CisgIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKGhhZGMtPkluaXQuTG93UG93ZXJBdXRvV2FpdCkpOworICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShoYWRjLT5Jbml0Lk92ZXJzYW1wbGluZ01vZGUpKTsKKworICBpZiAoaGFkYy0+SW5pdC5TY2FuQ29udk1vZGUgIT0gQURDX1NDQU5fRElTQUJMRSkgeworICAgIGFzc2VydF9wYXJhbShJU19BRENfUkVHVUxBUl9OQl9DT05WKGhhZGMtPkluaXQuTmJyT2ZDb252ZXJzaW9uKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoaGFkYy0+SW5pdC5EaXNjb250aW51b3VzQ29udk1vZGUpKTsKKworICAgIGlmIChoYWRjLT5Jbml0LkRpc2NvbnRpbnVvdXNDb252TW9kZSA9PSBFTkFCTEUpIHsKKyAgICAgIGFzc2VydF9wYXJhbSgKKyAgICAgICAgICBJU19BRENfUkVHVUxBUl9ESVNDT05UX05VTUJFUihoYWRjLT5Jbml0Lk5ick9mRGlzY0NvbnZlcnNpb24pKTsKKyAgICB9CisgIH0KKworICAvKiBESVNDRU4gYW5kIENPTlQgYml0cyBjYW5ub3QgYmUgc2V0IGF0IHRoZSBzYW1lIHRpbWUgKi8KKyAgYXNzZXJ0X3BhcmFtKCEoKGhhZGMtPkluaXQuRGlzY29udGludW91c0NvbnZNb2RlID09IEVOQUJMRSkgJiYKKyAgICAgICAgICAgICAgICAgKGhhZGMtPkluaXQuQ29udGludW91c0NvbnZNb2RlID09IEVOQUJMRSkpKTsKKworICAvKiBBY3Rpb25zIHBlcmZvcm1lZCBvbmx5IGlmIEFEQyBpcyBjb21pbmcgZnJvbSBzdGF0ZSByZXNldDogICAgICAgICAgICAgICAgKi8KKyAgLyogLSBJbml0aWFsaXphdGlvbiBvZiBBREMgTVNQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIGlmIChoYWRjLT5TdGF0ZSA9PSBIQUxfQURDX1NUQVRFX1JFU0VUKSB7CisjaWYgKFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIC8qIEluaXQgdGhlIEFEQyBDYWxsYmFjayBzZXR0aW5ncyAqLworICAgIGhhZGMtPkNvbnZDcGx0Q2FsbGJhY2sgPQorICAgICAgICBIQUxfQURDX0NvbnZDcGx0Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIGNhbGxiYWNrICovCisgICAgaGFkYy0+Q29udkhhbGZDcGx0Q2FsbGJhY2sgPQorICAgICAgICBIQUxfQURDX0NvbnZIYWxmQ3BsdENhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBjYWxsYmFjayAqLworICAgIGhhZGMtPkxldmVsT3V0T2ZXaW5kb3dDYWxsYmFjayA9CisgICAgICAgIEhBTF9BRENfTGV2ZWxPdXRPZldpbmRvd0NhbGxiYWNrOyAgICAgICAgLyogTGVnYWN5IHdlYWsgY2FsbGJhY2sgKi8KKyAgICBoYWRjLT5FcnJvckNhbGxiYWNrID0gSEFMX0FEQ19FcnJvckNhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBjYWxsYmFjayAqLworICAgIGhhZGMtPkluamVjdGVkQ29udkNwbHRDYWxsYmFjayA9CisgICAgICAgIEhBTF9BRENFeF9JbmplY3RlZENvbnZDcGx0Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIGNhbGxiYWNrICovCisgICAgaGFkYy0+SW5qZWN0ZWRRdWV1ZU92ZXJmbG93Q2FsbGJhY2sgPQorICAgICAgICBIQUxfQURDRXhfSW5qZWN0ZWRRdWV1ZU92ZXJmbG93Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIGNhbGxiYWNrICovCisgICAgaGFkYy0+TGV2ZWxPdXRPZldpbmRvdzJDYWxsYmFjayA9CisgICAgICAgIEhBTF9BRENFeF9MZXZlbE91dE9mV2luZG93MkNhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBjYWxsYmFjayAqLworICAgIGhhZGMtPkxldmVsT3V0T2ZXaW5kb3czQ2FsbGJhY2sgPQorICAgICAgICBIQUxfQURDRXhfTGV2ZWxPdXRPZldpbmRvdzNDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgY2FsbGJhY2sgKi8KKyAgICBoYWRjLT5FbmRPZlNhbXBsaW5nQ2FsbGJhY2sgPQorICAgICAgICBIQUxfQURDRXhfRW5kT2ZTYW1wbGluZ0NhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBjYWxsYmFjayAqLworCisgICAgaWYgKGhhZGMtPk1zcEluaXRDYWxsYmFjayA9PSBOVUxMKSB7CisgICAgICBoYWRjLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfQURDX01zcEluaXQ7IC8qIExlZ2FjeSB3ZWFrIE1zcEluaXQgICovCisgICAgfQorCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgICAgaGFkYy0+TXNwSW5pdENhbGxiYWNrKGhhZGMpOworI2Vsc2UKKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgICBIQUxfQURDX01zcEluaXQoaGFkYyk7CisjZW5kaWYgLyogVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKyAgICAvKiBTZXQgQURDIGVycm9yIGNvZGUgdG8gbm9uZSAqLworICAgIEFEQ19DTEVBUl9FUlJPUkNPREUoaGFkYyk7CisKKyAgICAvKiBJbml0aWFsaXplIExvY2sgKi8KKyAgICBoYWRjLT5Mb2NrID0gSEFMX1VOTE9DS0VEOworICB9CisKKyAgLyogLSBFeGl0IGZyb20gZGVlcC1wb3dlci1kb3duIG1vZGUgYW5kIEFEQyB2b2x0YWdlIHJlZ3VsYXRvciBlbmFibGUgICAgICAgICovCisgIGlmIChMTF9BRENfSXNEZWVwUG93ZXJEb3duRW5hYmxlZChoYWRjLT5JbnN0YW5jZSkgIT0gMFVMKSB7CisgICAgLyogRGlzYWJsZSBBREMgZGVlcCBwb3dlciBkb3duIG1vZGUgKi8KKyAgICBMTF9BRENfRGlzYWJsZURlZXBQb3dlckRvd24oaGFkYy0+SW5zdGFuY2UpOworCisgICAgLyogU3lzdGVtIHdhcyBpbiBkZWVwIHBvd2VyIGRvd24gbW9kZSwgY2FsaWJyYXRpb24gbXVzdAorICAgICBiZSByZWxhdW5jaGVkIG9yIGEgcHJldmlvdXNseSBzYXZlZCBjYWxpYnJhdGlvbiBmYWN0b3IKKyAgICAgcmUtYXBwbGllZCBvbmNlIHRoZSBBREMgdm9sdGFnZSByZWd1bGF0b3IgaXMgZW5hYmxlZCAqLworICB9CisKKyAgaWYgKExMX0FEQ19Jc0ludGVybmFsUmVndWxhdG9yRW5hYmxlZChoYWRjLT5JbnN0YW5jZSkgPT0gMFVMKSB7CisgICAgLyogRW5hYmxlIEFEQyBpbnRlcm5hbCB2b2x0YWdlIHJlZ3VsYXRvciAqLworICAgIExMX0FEQ19FbmFibGVJbnRlcm5hbFJlZ3VsYXRvcihoYWRjLT5JbnN0YW5jZSk7CisKKyAgICAvKiBOb3RlOiBWYXJpYWJsZSBkaXZpZGVkIGJ5IDIgdG8gY29tcGVuc2F0ZSBwYXJ0aWFsbHkgICAgICAgICAgICAgICovCisgICAgLyogICAgICAgQ1BVIHByb2Nlc3NpbmcgY3ljbGVzLCBzY2FsaW5nIGluIHVzIHNwbGl0IHRvIG5vdCAgICAgICAgICAqLworICAgIC8qICAgICAgIGV4Y2VlZCAzMiBiaXRzIHJlZ2lzdGVyIGNhcGFjaXR5IGFuZCBoYW5kbGUgbG93IGZyZXF1ZW5jeS4gKi8KKyAgICB3YWl0X2xvb3BfaW5kZXggPSAoKExMX0FEQ19ERUxBWV9JTlRFUk5BTF9SRUdVTF9TVEFCX1VTIC8gMTBVTCkgKgorICAgICAgICAgICAgICAgICAgICAgICAoKFN5c3RlbUNvcmVDbG9jayAvICgxMDAwMDBVTCAqIDJVTCkpICsgMVVMKSk7CisgICAgd2hpbGUgKHdhaXRfbG9vcF9pbmRleCAhPSAwVUwpIHsKKyAgICAgIHdhaXRfbG9vcF9pbmRleC0tOworICAgIH0KKyAgfQorCisgIC8qIFZlcmlmaWNhdGlvbiB0aGF0IEFEQyB2b2x0YWdlIHJlZ3VsYXRvciBpcyBjb3JyZWN0bHkgZW5hYmxlZCwgd2hldGhlciAgICAqLworICAvKiBvciBub3QgQURDIGlzIGNvbWluZyBmcm9tIHN0YXRlIHJlc2V0IChpZiBhbnkgcG90ZW50aWFsIHByb2JsZW0gb2YgICAgICAgKi8KKyAgLyogY2xvY2tpbmcsIHZvbHRhZ2UgcmVndWxhdG9yIHdvdWxkIG5vdCBiZSBlbmFibGVkKS4gICAgICAgICAgICAgICAgICAgICAgICovCisgIGlmIChMTF9BRENfSXNJbnRlcm5hbFJlZ3VsYXRvckVuYWJsZWQoaGFkYy0+SW5zdGFuY2UpID09IDBVTCkgeworICAgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSB0byBlcnJvciAqLworICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfRVJST1JfSU5URVJOQUwpOworCisgICAgLyogU2V0IEFEQyBlcnJvciBjb2RlIHRvIEFEQyBwZXJpcGhlcmFsIGludGVybmFsIGVycm9yICovCisgICAgU0VUX0JJVChoYWRjLT5FcnJvckNvZGUsIEhBTF9BRENfRVJST1JfSU5URVJOQUwpOworCisgICAgdG1wX2hhbF9zdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKworICAvKiBDb25maWd1cmF0aW9uIG9mIEFEQyBwYXJhbWV0ZXJzIGlmIHByZXZpb3VzIHByZWxpbWluYXJ5IGFjdGlvbnMgYXJlICAgICAgKi8KKyAgLyogY29ycmVjdGx5IGNvbXBsZXRlZCBhbmQgaWYgdGhlcmUgaXMgbm8gY29udmVyc2lvbiBvbiBnb2luZyBvbiByZWd1bGFyICAgICovCisgIC8qIGdyb3VwIChBREMgbWF5IGFscmVhZHkgYmUgZW5hYmxlZCBhdCB0aGlzIHBvaW50IGlmIEhBTF9BRENfSW5pdCgpIGlzICAgICAqLworICAvKiBjYWxsZWQgdG8gdXBkYXRlIGEgcGFyYW1ldGVyIG9uIHRoZSBmbHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdG1wX2FkY19pc19jb252ZXJzaW9uX29uX2dvaW5nX3JlZ3VsYXIgPQorICAgICAgTExfQURDX1JFR19Jc0NvbnZlcnNpb25PbmdvaW5nKGhhZGMtPkluc3RhbmNlKTsKKworICBpZiAoKChoYWRjLT5TdGF0ZSAmIEhBTF9BRENfU1RBVEVfRVJST1JfSU5URVJOQUwpID09IDBVTCkgJiYKKyAgICAgICh0bXBfYWRjX2lzX2NvbnZlcnNpb25fb25fZ29pbmdfcmVndWxhciA9PSAwVUwpKSB7CisgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgIEFEQ19TVEFURV9DTFJfU0VUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX1JFR19CVVNZLAorICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfQlVTWV9JTlRFUk5BTCk7CisKKyAgICAvKiBDb25maWd1cmF0aW9uIG9mIGNvbW1vbiBBREMgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAvKiBQYXJhbWV0ZXJzIHVwZGF0ZSBjb25kaXRpb25lZCB0byBBREMgc3RhdGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogUGFyYW1ldGVycyB0aGF0IGNhbiBiZSB1cGRhdGVkIG9ubHkgd2hlbiBBREMgaXMgZGlzYWJsZWQ6ICAgICAgICAgICAgICAqLworICAgIC8qICAtIGNsb2NrIGNvbmZpZ3VyYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpZiAoTExfQURDX0lzRW5hYmxlZChoYWRjLT5JbnN0YW5jZSkgPT0gMFVMKSB7CisgICAgICBpZiAoX19MTF9BRENfSVNfRU5BQkxFRF9BTExfQ09NTU9OX0lOU1RBTkNFKAorICAgICAgICAgICAgICBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKSA9PSAwVUwpIHsKKyAgICAgICAgLyogUmVzZXQgY29uZmlndXJhdGlvbiBvZiBBREMgY29tbW9uIHJlZ2lzdGVyIENDUjogKi8KKyAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogICAtIEFEQyBjbG9jayBtb2RlIGFuZCBBQ0MgcHJlc2NhbGVyIChDS01PREUgYW5kIFBSRVNDIGJpdHMpYXJlIHNldAorICAgICAgICAgKi8KKyAgICAgICAgLyogICAgIGFjY29yZGluZyB0byBhZGMtPkluaXQuQ2xvY2tQcmVzY2FsZXIuIEl0IHNlbGVjdHMgdGhlIGNsb2NrICovCisgICAgICAgIC8qICAgIHNvdXJjZSBhbmQgc2V0cyB0aGUgY2xvY2sgZGl2aXNpb24gZmFjdG9yLiAqLworICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAvKiBTb21lIHBhcmFtZXRlcnMgb2YgdGhpcyByZWdpc3RlciBhcmUgbm90IHJlc2V0LCBzaW5jZSB0aGV5IGFyZSBzZXQgKi8KKyAgICAgICAgLyogYnkgb3RoZXIgZnVuY3Rpb25zIGFuZCBtdXN0IGJlIGtlcHQgaW4gY2FzZSBvZiB1c2FnZSBvZiB0aGlzICovCisgICAgICAgIC8qIGZ1bmN0aW9uIG9uIHRoZSBmbHkgKHVwZGF0ZSBvZiBhIHBhcmFtZXRlciBvZiBBRENfSW5pdFR5cGVEZWYgKi8KKyAgICAgICAgLyogd2l0aG91dCBuZWVkaW5nIHRvIHJlY29uZmlndXJlIGFsbCBvdGhlciBBREMgZ3JvdXBzL2NoYW5uZWxzICovCisgICAgICAgIC8qIHBhcmFtZXRlcnMpOiAqLworICAgICAgICAvKiAgIC0gd2hlbiBtdWx0aW1vZGUgZmVhdHVyZSBpcyBhdmFpbGFibGUsIG11bHRpbW9kZS1yZWxhdGVkICovCisgICAgICAgIC8qICAgICBwYXJhbWV0ZXJzOiBNRE1BLCBETUFDRkcsIERFTEFZLCBEVUFMIChzZXQgYnkgQVBJICovCisgICAgICAgIC8qICAgICBIQUxfQURDRXhfTXVsdGlNb2RlQ29uZmlnQ2hhbm5lbCgpICkgKi8KKyAgICAgICAgLyogICAtIGludGVybmFsIG1lYXN1cmVtZW50IHBhdGhzOiBWYmF0LCB0ZW1wZXJhdHVyZSBzZW5zb3IsIFZyZWYgKi8KKyAgICAgICAgLyogICAgIChzZXQgaW50byBIQUxfQURDX0NvbmZpZ0NoYW5uZWwoKSBvciAqLworICAgICAgICAvKiAgICAgSEFMX0FEQ0V4X0luamVjdGVkQ29uZmlnQ2hhbm5lbCgpICkgKi8KKyAgICAgICAgTExfQURDX1NldENvbW1vbkNsb2NrKF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWRjLT5Jbml0LkNsb2NrUHJlc2NhbGVyKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDb25maWd1cmF0aW9uIG9mIEFEQzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogIC0gcmVzb2x1dGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbml0LlJlc29sdXRpb24gICAgICAgICAgICAqLworICAgIC8qICAtIGRhdGEgYWxpZ25tZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5pdC5EYXRhQWxpZ24gICAgICAgICAgICAgKi8KKyAgICAvKiAgLSBleHRlcm5hbCB0cmlnZ2VyIHRvIHN0YXJ0IGNvbnZlcnNpb24gICAgIEluaXQuRXh0ZXJuYWxUcmlnQ29udiAgICAgICovCisgICAgLyogIC0gZXh0ZXJuYWwgdHJpZ2dlciBwb2xhcml0eSAgICAgICAgICAgICAgICBJbml0LkV4dGVybmFsVHJpZ0NvbnZFZGdlICAqLworICAgIC8qICAtIGNvbnRpbnVvdXMgY29udmVyc2lvbiBtb2RlICAgICAgICAgICAgICAgSW5pdC5Db250aW51b3VzQ29udk1vZGUgICAgKi8KKyAgICAvKiAgLSBvdmVycnVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluaXQuT3ZlcnJ1biAgICAgICAgICAgICAgICovCisgICAgLyogIC0gZGlzY29udGludW91cyBtb2RlICAgICAgICAgICAgICAgICAgICAgICBJbml0LkRpc2NvbnRpbnVvdXNDb252TW9kZSAqLworICAgIC8qICAtIGRpc2NvbnRpbnVvdXMgbW9kZSBjaGFubmVsIGNvdW50ICAgICAgICAgSW5pdC5OYnJPZkRpc2NDb252ZXJzaW9uICAgKi8KKyAgICB0bXBfY2ZnciA9CisgICAgICAgIChBRENfQ0ZHUl9DT05USU5VT1VTKCh1aW50MzJfdCloYWRjLT5Jbml0LkNvbnRpbnVvdXNDb252TW9kZSkgfAorICAgICAgICAgaGFkYy0+SW5pdC5PdmVycnVuIHwgaGFkYy0+SW5pdC5EYXRhQWxpZ24gfCBoYWRjLT5Jbml0LlJlc29sdXRpb24gfAorICAgICAgICAgQURDX0NGR1JfUkVHX0RJU0NPTlRJTlVPVVMoCisgICAgICAgICAgICAgKHVpbnQzMl90KWhhZGMtPkluaXQuRGlzY29udGludW91c0NvbnZNb2RlKSk7CisKKyAgICBpZiAoaGFkYy0+SW5pdC5EaXNjb250aW51b3VzQ29udk1vZGUgPT0gRU5BQkxFKSB7CisgICAgICB0bXBfY2ZnciB8PSBBRENfQ0ZHUl9ESVNDT05USU5VT1VTX05VTShoYWRjLT5Jbml0Lk5ick9mRGlzY0NvbnZlcnNpb24pOworICAgIH0KKworICAgIC8qIEVuYWJsZSBleHRlcm5hbCB0cmlnZ2VyIGlmIHRyaWdnZXIgc2VsZWN0aW9uIGlzIGRpZmZlcmVudCBvZiBzb2Z0d2FyZSAgKi8KKyAgICAvKiBzdGFydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogTm90ZTogVGhpcyBjb25maWd1cmF0aW9uIGtlZXBzIHRoZSBoYXJkd2FyZSBmZWF0dXJlIG9mIHBhcmFtZXRlciAgICAgICAqLworICAgIC8qICAgICAgIEV4dGVybmFsVHJpZ0NvbnZFZGdlICJ0cmlnZ2VyIGVkZ2Ugbm9uZSIgZXF1aXZhbGVudCB0byAgICAgICAgICAgKi8KKyAgICAvKiAgICAgICBzb2Z0d2FyZSBzdGFydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYgKGhhZGMtPkluaXQuRXh0ZXJuYWxUcmlnQ29udiAhPSBBRENfU09GVFdBUkVfU1RBUlQpIHsKKyAgICAgIHRtcF9jZmdyIHw9ICgoaGFkYy0+SW5pdC5FeHRlcm5hbFRyaWdDb252ICYgQURDX0NGR1JfRVhUU0VMKSB8CisgICAgICAgICAgICAgICAgICAgaGFkYy0+SW5pdC5FeHRlcm5hbFRyaWdDb252RWRnZSk7CisgICAgfQorCisgICAgLyogVXBkYXRlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgQ0ZHUiAqLworICAgIE1PRElGWV9SRUcoaGFkYy0+SW5zdGFuY2UtPkNGR1IsIEFEQ19DRkdSX0ZJRUxEU18xLCB0bXBfY2Zncik7CisKKyAgICAvKiBDb25maWd1cmF0aW9uIG9mIHNhbXBsaW5nIG1vZGUgKi8KKyAgICBNT0RJRllfUkVHKGhhZGMtPkluc3RhbmNlLT5DRkdSMiwgQURDX0NGR1IyX0JVTEIgfCBBRENfQ0ZHUjJfU01QVFJJRywKKyAgICAgICAgICAgICAgIGhhZGMtPkluaXQuU2FtcGxpbmdNb2RlKTsKKworICAgIC8qIFBhcmFtZXRlcnMgdXBkYXRlIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBQYXJhbWV0ZXJzIHRoYXQgY2FuIGJlIHVwZGF0ZWQgd2hlbiBBREMgaXMgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0ICovCisgICAgLyogY29udmVyc2lvbiBvbiBnb2luZyBvbiByZWd1bGFyIGFuZCBpbmplY3RlZCBncm91cHM6ICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAtIEdhaW4gQ29tcGVuc2F0aW9uICAgICAgICAgICAgICAgSW5pdC5HYWluQ29tcGVuc2F0aW9uICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgLSBETUEgY29udGludW91cyByZXF1ZXN0ICAgICAgICAgIEluaXQuRE1BQ29udGludW91c1JlcXVlc3RzICAgICAgICAgICovCisgICAgLyogIC0gTG93UG93ZXJBdXRvV2FpdCBmZWF0dXJlICAgICAgICBJbml0Lkxvd1Bvd2VyQXV0b1dhaXQgICAgICAgICAgICAgICAqLworICAgIC8qICAtIE92ZXJzYW1wbGluZyBwYXJhbWV0ZXJzICAgICAgICAgSW5pdC5PdmVyc2FtcGxpbmcgICAgICAgICAgICAgICAgICAgKi8KKyAgICB0bXBfYWRjX2lzX2NvbnZlcnNpb25fb25fZ29pbmdfaW5qZWN0ZWQgPQorICAgICAgICBMTF9BRENfSU5KX0lzQ29udmVyc2lvbk9uZ29pbmcoaGFkYy0+SW5zdGFuY2UpOworICAgIGlmICgodG1wX2FkY19pc19jb252ZXJzaW9uX29uX2dvaW5nX3JlZ3VsYXIgPT0gMFVMKSAmJgorICAgICAgICAodG1wX2FkY19pc19jb252ZXJzaW9uX29uX2dvaW5nX2luamVjdGVkID09IDBVTCkpIHsKKyAgICAgIHRtcF9jZmdyID0KKyAgICAgICAgICAoQURDX0NGR1JfREZTRE0oaGFkYykgfAorICAgICAgICAgICBBRENfQ0ZHUl9BVVRPV0FJVCgodWludDMyX3QpaGFkYy0+SW5pdC5Mb3dQb3dlckF1dG9XYWl0KSB8CisgICAgICAgICAgIEFEQ19DRkdSX0RNQUNPTlRSRVEoKHVpbnQzMl90KWhhZGMtPkluaXQuRE1BQ29udGludW91c1JlcXVlc3RzKSk7CisKKyAgICAgIE1PRElGWV9SRUcoaGFkYy0+SW5zdGFuY2UtPkNGR1IsIEFEQ19DRkdSX0ZJRUxEU18yLCB0bXBfY2Zncik7CisKKyAgICAgIGlmIChoYWRjLT5Jbml0LkdhaW5Db21wZW5zYXRpb24gIT0gMFVMKSB7CisgICAgICAgIFNFVF9CSVQoaGFkYy0+SW5zdGFuY2UtPkNGR1IyLCBBRENfQ0ZHUjJfR0NPTVApOworICAgICAgICBNT0RJRllfUkVHKGhhZGMtPkluc3RhbmNlLT5HQ09NUCwgQURDX0dDT01QX0dDT01QQ09FRkYsCisgICAgICAgICAgICAgICAgICAgaGFkYy0+SW5pdC5HYWluQ29tcGVuc2F0aW9uKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIENMRUFSX0JJVChoYWRjLT5JbnN0YW5jZS0+Q0ZHUjIsIEFEQ19DRkdSMl9HQ09NUCk7CisgICAgICAgIE1PRElGWV9SRUcoaGFkYy0+SW5zdGFuY2UtPkdDT01QLCBBRENfR0NPTVBfR0NPTVBDT0VGRiwgMFVMKTsKKyAgICAgIH0KKworICAgICAgaWYgKGhhZGMtPkluaXQuT3ZlcnNhbXBsaW5nTW9kZSA9PSBFTkFCTEUpIHsKKyAgICAgICAgYXNzZXJ0X3BhcmFtKElTX0FEQ19PVkVSU0FNUExJTkdfUkFUSU8oaGFkYy0+SW5pdC5PdmVyc2FtcGxpbmcuUmF0aW8pKTsKKyAgICAgICAgYXNzZXJ0X3BhcmFtKAorICAgICAgICAgICAgSVNfQURDX1JJR0hUX0JJVF9TSElGVChoYWRjLT5Jbml0Lk92ZXJzYW1wbGluZy5SaWdodEJpdFNoaWZ0KSk7CisgICAgICAgIGFzc2VydF9wYXJhbShJU19BRENfVFJJR0dFUkVEX09WRVJTQU1QTElOR19NT0RFKAorICAgICAgICAgICAgaGFkYy0+SW5pdC5PdmVyc2FtcGxpbmcuVHJpZ2dlcmVkTW9kZSkpOworICAgICAgICBhc3NlcnRfcGFyYW0oSVNfQURDX1JFR09WRVJTQU1QTElOR19NT0RFKAorICAgICAgICAgICAgaGFkYy0+SW5pdC5PdmVyc2FtcGxpbmcuT3ZlcnNhbXBsaW5nU3RvcFJlc2V0KSk7CisKKyAgICAgICAgLyogQ29uZmlndXJhdGlvbiBvZiBPdmVyc2FtcGxlcjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIC8qICAtIE92ZXJzYW1wbGluZyBSYXRpbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAvKiAgLSBSaWdodCBiaXQgc2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogIC0gVHJpZ2dlcmVkIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIC8qICAtIE92ZXJzYW1wbGluZyBtb2RlIChjb250aW51ZWQvcmVzdW1lZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICBNT0RJRllfUkVHKAorICAgICAgICAgICAgaGFkYy0+SW5zdGFuY2UtPkNGR1IyLAorICAgICAgICAgICAgQURDX0NGR1IyX09WU1IgfCBBRENfQ0ZHUjJfT1ZTUyB8IEFEQ19DRkdSMl9UUk9WUyB8IEFEQ19DRkdSMl9ST1ZTTSwKKyAgICAgICAgICAgIEFEQ19DRkdSMl9ST1ZTRSB8IGhhZGMtPkluaXQuT3ZlcnNhbXBsaW5nLlJhdGlvIHwKKyAgICAgICAgICAgICAgICBoYWRjLT5Jbml0Lk92ZXJzYW1wbGluZy5SaWdodEJpdFNoaWZ0IHwKKyAgICAgICAgICAgICAgICBoYWRjLT5Jbml0Lk92ZXJzYW1wbGluZy5UcmlnZ2VyZWRNb2RlIHwKKyAgICAgICAgICAgICAgICBoYWRjLT5Jbml0Lk92ZXJzYW1wbGluZy5PdmVyc2FtcGxpbmdTdG9wUmVzZXQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogRGlzYWJsZSBBREMgb3ZlcnNhbXBsaW5nIHNjb3BlIG9uIEFEQyBncm91cCByZWd1bGFyICovCisgICAgICAgIENMRUFSX0JJVChoYWRjLT5JbnN0YW5jZS0+Q0ZHUjIsIEFEQ19DRkdSMl9ST1ZTRSk7CisgICAgICB9CisgICAgfQorCisgICAgLyogQ29uZmlndXJhdGlvbiBvZiByZWd1bGFyIGdyb3VwIHNlcXVlbmNlcjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIC0gaWYgc2NhbiBtb2RlIGlzIGRpc2FibGVkLCByZWd1bGFyIGNoYW5uZWxzIHNlcXVlbmNlIGxlbmd0aCBpcyBzZXQgdG8gKi8KKyAgICAvKiAgIDB4MDA6IDEgY2hhbm5lbCBjb252ZXJ0ZWQgKGNoYW5uZWwgb24gcmVndWxhciByYW5rIDEpICAgICAgICAgICAgICAgICovCisgICAgLyogICBQYXJhbWV0ZXIgIk5ick9mQ29udmVyc2lvbiIgaXMgZGlzY2FyZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgTm90ZTogU2NhbiBtb2RlIGlzIG5vdCBwcmVzZW50IGJ5IGhhcmR3YXJlIG9uIHRoaXMgZGV2aWNlLCBidXQgICAgICAgKi8KKyAgICAvKiAgIGVtdWxhdGVkIGJ5IHNvZnR3YXJlIGZvciBhbGlnbm1lbnQgb3ZlciBhbGwgU1RNMzIgZGV2aWNlcy4gICAgICAgICAgICovCisgICAgLyogLSBpZiBzY2FuIG1vZGUgaXMgZW5hYmxlZCwgcmVndWxhciBjaGFubmVscyBzZXF1ZW5jZSBsZW5ndGggaXMgc2V0IHRvICAqLworICAgIC8qICAgcGFyYW1ldGVyICJOYnJPZkNvbnZlcnNpb24iLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgIGlmIChoYWRjLT5Jbml0LlNjYW5Db252TW9kZSA9PSBBRENfU0NBTl9FTkFCTEUpIHsKKyAgICAgIC8qIFNldCBudW1iZXIgb2YgcmFua3MgaW4gcmVndWxhciBncm91cCBzZXF1ZW5jZXIgKi8KKyAgICAgIE1PRElGWV9SRUcoaGFkYy0+SW5zdGFuY2UtPlNRUjEsIEFEQ19TUVIxX0wsCisgICAgICAgICAgICAgICAgIChoYWRjLT5Jbml0Lk5ick9mQ29udmVyc2lvbiAtICh1aW50OF90KTEpKTsKKyAgICB9IGVsc2UgeworICAgICAgQ0xFQVJfQklUKGhhZGMtPkluc3RhbmNlLT5TUVIxLCBBRENfU1FSMV9MKTsKKyAgICB9CisKKyAgICAvKiBJbml0aWFsaXplIHRoZSBBREMgc3RhdGUgKi8KKyAgICAvKiBDbGVhciBIQUxfQURDX1NUQVRFX0JVU1lfSU5URVJOQUwgYml0LCBzZXQgSEFMX0FEQ19TVEFURV9SRUFEWSBiaXQgKi8KKyAgICBBRENfU1RBVEVfQ0xSX1NFVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9CVVNZX0lOVEVSTkFMLAorICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVBRFkpOworICB9IGVsc2UgeworICAgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSB0byBlcnJvciAqLworICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfRVJST1JfSU5URVJOQUwpOworCisgICAgdG1wX2hhbF9zdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiB0bXBfaGFsX3N0YXR1czsKK30KKworLyoqCisgKiBAYnJpZWYgIERlaW5pdGlhbGl6ZSB0aGUgQURDIHBlcmlwaGVyYWwgcmVnaXN0ZXJzIHRvIHRoZWlyIGRlZmF1bHQgcmVzZXQKKyAqICAgICAgICAgdmFsdWVzLCB3aXRoIGRlaW5pdGlhbGl6YXRpb24gb2YgdGhlIEFEQyBNU1AuCisgKiBAbm90ZSAgIEZvciBkZXZpY2VzIHdpdGggc2V2ZXJhbCBBRENzOiByZXNldCBvZiBBREMgY29tbW9uIHJlZ2lzdGVycyBpcyBkb25lCisgKiAgICAgICAgIG9ubHkgaWYgYWxsIEFEQ3Mgc2hhcmluZyB0aGUgc2FtZSBjb21tb24gZ3JvdXAgYXJlIGRpc2FibGVkLgorICogICAgICAgICAoZnVuY3Rpb24gIkhBTF9BRENfTXNwRGVJbml0KCkiIGlzIGFsc28gY2FsbGVkIHVuZGVyIHRoZSBzYW1lCisgKiBjb25kaXRpb25zOiBhbGwgQURDIGluc3RhbmNlcyB1c2UgdGhlIHNhbWUgY29yZSBjbG9jayBhdCBSQ0MgbGV2ZWwsIGRpc2FibGluZworICogICAgICAgICB0aGUgY29yZSBjbG9jayByZXNldCBhbGwgQURDIGluc3RhbmNlcykuCisgKiAgICAgICAgIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCByZXNldCBvZiB0aGVzZSBjb21tb24gcGFyYW1ldGVycyByZXNldCBpcworICogICAgICAgICBieXBhc3NlZCB3aXRob3V0IGVycm9yIHJlcG9ydGluZzogaXQgY2FuIGJlIHRoZSBpbnRlbmRlZCBiZWhhdmlvciBpbgorICogICAgICAgICBjYXNlIG9mIHJlc2V0IG9mIGEgc2luZ2xlIEFEQyB3aGlsZSB0aGUgb3RoZXIgQURDcyBzaGFyaW5nIHRoZSBzYW1lCisgKiAgICAgICAgIGNvbW1vbiBncm91cCBpcyBzdGlsbCBydW5uaW5nLgorICogQG5vdGUgICBCeSBkZWZhdWx0LCBIQUxfQURDX0RlSW5pdCgpIHNldCBBREMgaW4gbW9kZSBkZWVwIHBvd2VyLWRvd246CisgKiAgICAgICAgIHRoaXMgc2F2ZXMgbW9yZSBwb3dlciBieSByZWR1Y2luZyBsZWFrYWdlIGN1cnJlbnRzCisgKiAgICAgICAgIGFuZCBpcyBwYXJ0aWN1bGFybHkgaW50ZXJlc3RpbmcgYmVmb3JlIGVudGVyaW5nIE1DVSBsb3ctcG93ZXIgbW9kZXMuCisgKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ19EZUluaXQoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpIHsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgdG1wX2hhbF9zdGF0dXM7CisKKyAgLyogQ2hlY2sgQURDIGhhbmRsZSAqLworICBpZiAoaGFkYyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7CisKKyAgLyogU2V0IEFEQyBzdGF0ZSAqLworICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0JVU1lfSU5URVJOQUwpOworCisgIC8qIFN0b3AgcG90ZW50aWFsIGNvbnZlcnNpb24gb24gZ29pbmcgKi8KKyAgdG1wX2hhbF9zdGF0dXMgPSBBRENfQ29udmVyc2lvblN0b3AoaGFkYywgQURDX1JFR1VMQVJfSU5KRUNURURfR1JPVVApOworCisgIC8qIERpc2FibGUgQURDIHBlcmlwaGVyYWwgaWYgY29udmVyc2lvbnMgYXJlIGVmZmVjdGl2ZWx5IHN0b3BwZWQgICAgICAgICAgICAqLworICAvKiBGbHVzaCByZWdpc3RlciBKU1FSOiByZXNldCB0aGUgcXVldWUgc2VxdWVuY2VyIHdoZW4gaW5qZWN0ZWQgICAgICAgICAgICAgKi8KKyAgLyogcXVldWUgc2VxdWVuY2VyIGlzIGVuYWJsZWQgYW5kIEFEQyBkaXNhYmxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFRoZSBzb2Z0d2FyZSBhbmQgaGFyZHdhcmUgdHJpZ2dlcnMgb2YgdGhlIGluamVjdGVkIHNlcXVlbmNlIGFyZSBib3RoICAgICAqLworICAvKiBpbnRlcm5hbGx5IGRpc2FibGVkIGp1c3QgYWZ0ZXIgdGhlIGNvbXBsZXRpb24gb2YgdGhlIGxhc3QgdmFsaWQgICAgICAgICAgKi8KKyAgLyogaW5qZWN0ZWQgc2VxdWVuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFNFVF9CSVQoaGFkYy0+SW5zdGFuY2UtPkNGR1IsIEFEQ19DRkdSX0pRTSk7CisKKyAgLyogRGlzYWJsZSBBREMgcGVyaXBoZXJhbCBpZiBjb252ZXJzaW9ucyBhcmUgZWZmZWN0aXZlbHkgc3RvcHBlZCAqLworICBpZiAodG1wX2hhbF9zdGF0dXMgPT0gSEFMX09LKSB7CisgICAgLyogRGlzYWJsZSB0aGUgQURDIHBlcmlwaGVyYWwgKi8KKyAgICB0bXBfaGFsX3N0YXR1cyA9IEFEQ19EaXNhYmxlKGhhZGMpOworCisgICAgLyogQ2hlY2sgaWYgQURDIGlzIGVmZmVjdGl2ZWx5IGRpc2FibGVkICovCisgICAgaWYgKHRtcF9oYWxfc3RhdHVzID09IEhBTF9PSykgeworICAgICAgLyogQ2hhbmdlIEFEQyBzdGF0ZSAqLworICAgICAgaGFkYy0+U3RhdGUgPSBIQUxfQURDX1NUQVRFX1JFQURZOworICAgIH0KKyAgfQorCisgIC8qIE5vdGU6IEhBTCBBREMgZGVJbml0IGlzIGRvbmUgaW5kZXBlbmRlbnRseSBvZiBBREMgY29udmVyc2lvbiBzdG9wICAgICAgICAqLworICAvKiAgICAgICBhbmQgZGlzYWJsZSByZXR1cm4gc3RhdHVzLiBJbiBjYXNlIG9mIHN0YXR1cyBmYWlsLCBhdHRlbXB0IHRvICAgICAgKi8KKyAgLyogICAgICAgcGVyZm9ybSBkZWluaXRpYWxpemF0aW9uIGFueXdheSBhbmQgaXQgaXMgdXAgdXNlciBjb2RlIGluICAgICAgICAgICovCisgIC8qICAgICAgIGluIEhBTF9BRENfTXNwRGVJbml0KCkgdG8gcmVzZXQgdGhlIEFEQyBwZXJpcGhlcmFsIHVzaW5nICAgICAgICAgICAqLworICAvKiAgICAgICBzeXN0ZW0gUkNDIGhhcmQgcmVzZXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAvKiA9PT09PT09PT09IFJlc2V0IEFEQyByZWdpc3RlcnMgPT09PT09PT09PSAqLworICAvKiBSZXNldCByZWdpc3RlciBJRVIgKi8KKyAgX19IQUxfQURDX0RJU0FCTEVfSVQoCisgICAgICBoYWRjLCAoQURDX0lUX0FXRDMgfCBBRENfSVRfQVdEMiB8IEFEQ19JVF9BV0QxIHwgQURDX0lUX0pRT1ZGIHwKKyAgICAgICAgICAgICBBRENfSVRfT1ZSIHwgQURDX0lUX0pFT1MgfCBBRENfSVRfSkVPQyB8IEFEQ19JVF9FT1MgfCBBRENfSVRfRU9DIHwKKyAgICAgICAgICAgICBBRENfSVRfRU9TTVAgfCBBRENfSVRfUkRZKSk7CisKKyAgLyogUmVzZXQgcmVnaXN0ZXIgSVNSICovCisgIF9fSEFMX0FEQ19DTEVBUl9GTEFHKAorICAgICAgaGFkYywgKEFEQ19GTEFHX0FXRDMgfCBBRENfRkxBR19BV0QyIHwgQURDX0ZMQUdfQVdEMSB8IEFEQ19GTEFHX0pRT1ZGIHwKKyAgICAgICAgICAgICBBRENfRkxBR19PVlIgfCBBRENfRkxBR19KRU9TIHwgQURDX0ZMQUdfSkVPQyB8IEFEQ19GTEFHX0VPUyB8CisgICAgICAgICAgICAgQURDX0ZMQUdfRU9DIHwgQURDX0ZMQUdfRU9TTVAgfCBBRENfRkxBR19SRFkpKTsKKworICAvKiBSZXNldCByZWdpc3RlciBDUiAqLworICAvKiBCaXRzIEFEQ19DUl9KQURTVFAsIEFEQ19DUl9BRFNUUCwgQURDX0NSX0pBRFNUQVJULCBBRENfQ1JfQURTVEFSVCwKKyAgICAgQURDX0NSX0FEQ0FMLCBBRENfQ1JfQURESVMgYW5kIEFEQ19DUl9BREVOIGFyZSBpbiBhY2Nlc3MgbW9kZSAicmVhZC1zZXQiOgorICAgICBubyBkaXJlY3QgcmVzZXQgYXBwbGljYWJsZS4KKyAgICAgVXBkYXRlIENSIHJlZ2lzdGVyIHRvIHJlc2V0IHZhbHVlIHdoZXJlIGRvYWJsZSBieSBzb2Z0d2FyZSAqLworICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPkNSLCBBRENfQ1JfQURWUkVHRU4gfCBBRENfQ1JfQURDQUxESUYpOworICBTRVRfQklUKGhhZGMtPkluc3RhbmNlLT5DUiwgQURDX0NSX0RFRVBQV0QpOworCisgIC8qIFJlc2V0IHJlZ2lzdGVyIENGR1IgKi8KKyAgQ0xFQVJfQklUKGhhZGMtPkluc3RhbmNlLT5DRkdSLCBBRENfQ0ZHUl9GSUVMRFMpOworICBTRVRfQklUKGhhZGMtPkluc3RhbmNlLT5DRkdSLCBBRENfQ0ZHUl9KUURJUyk7CisKKyAgLyogUmVzZXQgcmVnaXN0ZXIgQ0ZHUjIgKi8KKyAgQ0xFQVJfQklUKGhhZGMtPkluc3RhbmNlLT5DRkdSMiwgQURDX0NGR1IyX1JPVlNNIHwgQURDX0NGR1IyX1RST1ZTIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSMl9PVlNTIHwgQURDX0NGR1IyX09WU1IgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NGR1IyX0pPVlNFIHwgQURDX0NGR1IyX1JPVlNFKTsKKworICAvKiBSZXNldCByZWdpc3RlciBTTVBSMSAqLworICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPlNNUFIxLCBBRENfU01QUjFfRklFTERTKTsKKworICAvKiBSZXNldCByZWdpc3RlciBTTVBSMiAqLworICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPlNNUFIyLAorICAgICAgICAgICAgQURDX1NNUFIyX1NNUDE4IHwgQURDX1NNUFIyX1NNUDE3IHwgQURDX1NNUFIyX1NNUDE2IHwKKyAgICAgICAgICAgICAgICBBRENfU01QUjJfU01QMTUgfCBBRENfU01QUjJfU01QMTQgfCBBRENfU01QUjJfU01QMTMgfAorICAgICAgICAgICAgICAgIEFEQ19TTVBSMl9TTVAxMiB8IEFEQ19TTVBSMl9TTVAxMSB8IEFEQ19TTVBSMl9TTVAxMCk7CisKKyAgLyogUmVzZXQgcmVnaXN0ZXIgVFIxICovCisgIENMRUFSX0JJVChoYWRjLT5JbnN0YW5jZS0+VFIxLCBBRENfVFIxX0hUMSB8IEFEQ19UUjFfTFQxKTsKKworICAvKiBSZXNldCByZWdpc3RlciBUUjIgKi8KKyAgQ0xFQVJfQklUKGhhZGMtPkluc3RhbmNlLT5UUjIsIEFEQ19UUjJfSFQyIHwgQURDX1RSMl9MVDIpOworCisgIC8qIFJlc2V0IHJlZ2lzdGVyIFRSMyAqLworICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPlRSMywgQURDX1RSM19IVDMgfCBBRENfVFIzX0xUMyk7CisKKyAgLyogUmVzZXQgcmVnaXN0ZXIgU1FSMSAqLworICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPlNRUjEsIEFEQ19TUVIxX1NRNCB8IEFEQ19TUVIxX1NRMyB8IEFEQ19TUVIxX1NRMiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19TUVIxX1NRMSB8IEFEQ19TUVIxX0wpOworCisgIC8qIFJlc2V0IHJlZ2lzdGVyIFNRUjIgKi8KKyAgQ0xFQVJfQklUKGhhZGMtPkluc3RhbmNlLT5TUVIyLCBBRENfU1FSMl9TUTkgfCBBRENfU1FSMl9TUTggfCBBRENfU1FSMl9TUTcgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfU1FSMl9TUTYgfCBBRENfU1FSMl9TUTUpOworCisgIC8qIFJlc2V0IHJlZ2lzdGVyIFNRUjMgKi8KKyAgQ0xFQVJfQklUKGhhZGMtPkluc3RhbmNlLT5TUVIzLCBBRENfU1FSM19TUTE0IHwgQURDX1NRUjNfU1ExMyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19TUVIzX1NRMTIgfCBBRENfU1FSM19TUTExIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX1NRUjNfU1ExMCk7CisKKyAgLyogUmVzZXQgcmVnaXN0ZXIgU1FSNCAqLworICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPlNRUjQsIEFEQ19TUVI0X1NRMTYgfCBBRENfU1FSNF9TUTE1KTsKKworICAvKiBSZWdpc3RlciBKU1FSIHdhcyByZXNldCB3aGVuIHRoZSBBREMgd2FzIGRpc2FibGVkICovCisKKyAgLyogUmVzZXQgcmVnaXN0ZXIgRFIgKi8KKyAgLyogYml0cyBpbiBhY2Nlc3MgbW9kZSByZWFkIG9ubHksIG5vIGRpcmVjdCByZXNldCBhcHBsaWNhYmxlKi8KKworICAvKiBSZXNldCByZWdpc3RlciBPRlIxICovCisgIENMRUFSX0JJVChoYWRjLT5JbnN0YW5jZS0+T0ZSMSwKKyAgICAgICAgICAgIEFEQ19PRlIxX09GRlNFVDFfRU4gfCBBRENfT0ZSMV9PRkZTRVQxX0NIIHwgQURDX09GUjFfT0ZGU0VUMSk7CisgIC8qIFJlc2V0IHJlZ2lzdGVyIE9GUjIgKi8KKyAgQ0xFQVJfQklUKGhhZGMtPkluc3RhbmNlLT5PRlIyLAorICAgICAgICAgICAgQURDX09GUjJfT0ZGU0VUMl9FTiB8IEFEQ19PRlIyX09GRlNFVDJfQ0ggfCBBRENfT0ZSMl9PRkZTRVQyKTsKKyAgLyogUmVzZXQgcmVnaXN0ZXIgT0ZSMyAqLworICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPk9GUjMsCisgICAgICAgICAgICBBRENfT0ZSM19PRkZTRVQzX0VOIHwgQURDX09GUjNfT0ZGU0VUM19DSCB8IEFEQ19PRlIzX09GRlNFVDMpOworICAvKiBSZXNldCByZWdpc3RlciBPRlI0ICovCisgIENMRUFSX0JJVChoYWRjLT5JbnN0YW5jZS0+T0ZSNCwKKyAgICAgICAgICAgIEFEQ19PRlI0X09GRlNFVDRfRU4gfCBBRENfT0ZSNF9PRkZTRVQ0X0NIIHwgQURDX09GUjRfT0ZGU0VUNCk7CisKKyAgLyogUmVzZXQgcmVnaXN0ZXJzIEpEUjEsIEpEUjIsIEpEUjMsIEpEUjQgKi8KKyAgLyogYml0cyBpbiBhY2Nlc3MgbW9kZSByZWFkIG9ubHksIG5vIGRpcmVjdCByZXNldCBhcHBsaWNhYmxlKi8KKworICAvKiBSZXNldCByZWdpc3RlciBBV0QyQ1IgKi8KKyAgQ0xFQVJfQklUKGhhZGMtPkluc3RhbmNlLT5BV0QyQ1IsIEFEQ19BV0QyQ1JfQVdEMkNIKTsKKworICAvKiBSZXNldCByZWdpc3RlciBBV0QzQ1IgKi8KKyAgQ0xFQVJfQklUKGhhZGMtPkluc3RhbmNlLT5BV0QzQ1IsIEFEQ19BV0QzQ1JfQVdEM0NIKTsKKworICAvKiBSZXNldCByZWdpc3RlciBESUZTRUwgKi8KKyAgQ0xFQVJfQklUKGhhZGMtPkluc3RhbmNlLT5ESUZTRUwsIEFEQ19ESUZTRUxfRElGU0VMKTsKKworICAvKiBSZXNldCByZWdpc3RlciBDQUxGQUNUICovCisgIENMRUFSX0JJVChoYWRjLT5JbnN0YW5jZS0+Q0FMRkFDVCwKKyAgICAgICAgICAgIEFEQ19DQUxGQUNUX0NBTEZBQ1RfRCB8IEFEQ19DQUxGQUNUX0NBTEZBQ1RfUyk7CisKKyAgLyogPT09PT09PT09PSBSZXNldCBjb21tb24gQURDIHJlZ2lzdGVycyA9PT09PT09PT09ICovCisKKyAgLyogU29mdHdhcmUgaXMgYWxsb3dlZCB0byBjaGFuZ2UgY29tbW9uIHBhcmFtZXRlcnMgb25seSB3aGVuIGFsbCB0aGUgb3RoZXIKKyAgICAgQURDcyBhcmUgZGlzYWJsZWQuICAgKi8KKyAgaWYgKF9fTExfQURDX0lTX0VOQUJMRURfQUxMX0NPTU1PTl9JTlNUQU5DRSgKKyAgICAgICAgICBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKSA9PSAwVUwpIHsKKyAgICAvKiBSZXNldCBjb25maWd1cmF0aW9uIG9mIEFEQyBjb21tb24gcmVnaXN0ZXIgQ0NSOgorICAgICAgLSBjbG9jayBtb2RlOiBDS01PREUsIFBSRVNDRU4KKyAgICAgIC0gbXVsdGltb2RlIHJlbGF0ZWQgcGFyYW1ldGVycyAod2hlbiB0aGlzIGZlYXR1cmUgaXMgYXZhaWxhYmxlKTogTURNQSwKKyAgICAgICAgRE1BQ0ZHLCBERUxBWSwgRFVBTCAoc2V0IGJ5IEhBTF9BRENFeF9NdWx0aU1vZGVDb25maWdDaGFubmVsKCkgQVBJKQorICAgICAgLSBpbnRlcm5hbCBtZWFzdXJlbWVudCBwYXRoczogVmJhdCwgdGVtcGVyYXR1cmUgc2Vuc29yLCBWcmVmIChzZXQgaW50bworICAgICAgICBIQUxfQURDX0NvbmZpZ0NoYW5uZWwoKSBvciBIQUxfQURDRXhfSW5qZWN0ZWRDb25maWdDaGFubmVsKCkgKQorICAgICovCisgICAgQURDX0NMRUFSX0NPTU1PTl9DT05UUk9MX1JFR0lTVEVSKGhhZGMpOworCisgICAgLyogPT09PT09PT09PSBIYXJkIHJlc2V0IEFEQyBwZXJpcGhlcmFsID09PT09PT09PT0gKi8KKyAgICAvKiBQZXJmb3JtcyBhIGdsb2JhbCByZXNldCBvZiB0aGUgZW50aXJlIEFEQyBwZXJpcGhlcmFscyBpbnN0YW5jZXMgICAgICAgICovCisgICAgLyogc2hhcmluZyB0aGUgc2FtZSBjb21tb24gQURDIGluc3RhbmNlOiBBREMgc3RhdGUgaXMgZm9yY2VkIHRvICAgICAgICAgICAqLworICAgIC8qIGEgc2ltaWxhciBzdGF0ZSBhcyBhZnRlciBkZXZpY2UgcG93ZXItb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBOb3RlOiBBIHBvc3NpYmxlIGltcGxlbWVudGF0aW9uIGlzIHRvIGFkZCBSQ0MgYnVzIHJlc2V0IG9mIEFEQyAgICAgICAgICovCisgICAgLyogKGZvciBleGFtcGxlLCB1c2luZyBtYWNybyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICBfX0hBTF9SQ0NfQURDLi4uX0ZPUkNFX1JFU0VUKCkvLi4uX1JFTEVBU0VfUkVTRVQoKS8uLi5fQ0xLX0RJU0FCTEUoKSkgKi8KKyAgICAvKiBpbiBmdW5jdGlvbiAidm9pZCBIQUxfQURDX01zcERlSW5pdChBRENfSGFuZGxlVHlwZURlZiAqaGFkYykiOiAgICAgICAgICovCisjaWYgKFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIGlmIChoYWRjLT5Nc3BEZUluaXRDYWxsYmFjayA9PSBOVUxMKSB7CisgICAgICBoYWRjLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9BRENfTXNwRGVJbml0OyAvKiBMZWdhY3kgd2VhayBNc3BEZUluaXQgICovCisgICAgfQorCisgICAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgICBoYWRjLT5Nc3BEZUluaXRDYWxsYmFjayhoYWRjKTsKKyNlbHNlCisgICAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgICBIQUxfQURDX01zcERlSW5pdChoYWRjKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorCisgIC8qIFNldCBBREMgZXJyb3IgY29kZSB0byBub25lICovCisgIEFEQ19DTEVBUl9FUlJPUkNPREUoaGFkYyk7CisKKyAgLyogUmVzZXQgaW5qZWN0ZWQgY2hhbm5lbCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgKi8KKyAgaGFkYy0+SW5qZWN0aW9uQ29uZmlnLkNvbnRleHRRdWV1ZSA9IDA7CisgIGhhZGMtPkluamVjdGlvbkNvbmZpZy5DaGFubmVsQ291bnQgPSAwOworCisgIC8qIFNldCBBREMgc3RhdGUgKi8KKyAgaGFkYy0+U3RhdGUgPSBIQUxfQURDX1NUQVRFX1JFU0VUOworCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhhZGMpOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHRtcF9oYWxfc3RhdHVzOworfQorCisvKioKKyAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgQURDIE1TUC4KKyAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUKKyAqIEByZXR2YWwgTm9uZQorICovCitfX3dlYWsgdm9pZCBIQUxfQURDX01zcEluaXQoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpIHsKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGFkYyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZC4gV2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgZnVuY3Rpb24gSEFMX0FEQ19Nc3BJbml0IG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKy8qKgorICogQGJyaWVmICBEZUluaXRpYWxpemUgdGhlIEFEQyBNU1AuCisgKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlCisgKiBAbm90ZSAgIEFsbCBBREMgaW5zdGFuY2VzIHVzZSB0aGUgc2FtZSBjb3JlIGNsb2NrIGF0IFJDQyBsZXZlbCwgZGlzYWJsaW5nCisgKiAgICAgICAgIHRoZSBjb3JlIGNsb2NrIHJlc2V0IGFsbCBBREMgaW5zdGFuY2VzKS4KKyAqIEByZXR2YWwgTm9uZQorICovCitfX3dlYWsgdm9pZCBIQUxfQURDX01zcERlSW5pdChBRENfSGFuZGxlVHlwZURlZiAqaGFkYykgeworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoYWRjKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLiBXaGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICBmdW5jdGlvbiBIQUxfQURDX01zcERlSW5pdCBtdXN0IGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLworfQorCisjaWYgKFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorLyoqCisgKiBAYnJpZWYgIFJlZ2lzdGVyIGEgVXNlciBBREMgQ2FsbGJhY2sKKyAqICAgICAgICAgVG8gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSB3ZWFrIHByZWRlZmluZWQgY2FsbGJhY2sKKyAqIEBwYXJhbSAgaGFkYyBQb2ludGVyIHRvIGEgQURDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEFEQy4KKyAqIEBwYXJhbSAgQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgcmVnaXN0ZXJlZAorICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9BRENfQ09OVkVSU0lPTl9DT01QTEVURV9DQl9JRCAgICAgIEFEQyBjb252ZXJzaW9uCisgKiBjb21wbGV0ZSBjYWxsYmFjayBJRAorICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9BRENfQ09OVkVSU0lPTl9IQUxGX0NCX0lEICAgICAgICAgIEFEQyBjb252ZXJzaW9uIERNQQorICogaGFsZi10cmFuc2ZlciBjYWxsYmFjayBJRAorICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9BRENfTEVWRUxfT1VUX09GX1dJTkRPV18xX0NCX0lEICAgIEFEQyBhbmFsb2cgd2F0Y2hkb2cKKyAqIDEgY2FsbGJhY2sgSUQKKyAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQURDX0VSUk9SX0NCX0lEICAgICAgICAgICAgICAgICAgICBBREMgZXJyb3IgY2FsbGJhY2sKKyAqIElECisgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0FEQ19JTkpfQ09OVkVSU0lPTl9DT01QTEVURV9DQl9JRCAgQURDIGdyb3VwIGluamVjdGVkCisgKiBjb252ZXJzaW9uIGNvbXBsZXRlIGNhbGxiYWNrIElECisgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0FEQ19JTkpfUVVFVUVfT1ZFRkxPV19DQl9JRCAgICAgICAgQURDIGdyb3VwIGluamVjdGVkCisgKiBjb250ZXh0IHF1ZXVlIG92ZXJmbG93IGNhbGxiYWNrIElECisgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0FEQ19MRVZFTF9PVVRfT0ZfV0lORE9XXzJfQ0JfSUQgICAgQURDIGFuYWxvZyB3YXRjaGRvZworICogMiBjYWxsYmFjayBJRAorICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9BRENfTEVWRUxfT1VUX09GX1dJTkRPV18zX0NCX0lEICAgIEFEQyBhbmFsb2cgd2F0Y2hkb2cKKyAqIDMgY2FsbGJhY2sgSUQKKyAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQURDX0VORF9PRl9TQU1QTElOR19DQl9JRCAgICAgICAgICBBREMgZW5kIG9mIHNhbXBsaW5nCisgKiBjYWxsYmFjayBJRAorICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9BRENfTVNQSU5JVF9DQl9JRCAgICAgICAgICAgICAgICAgIEFEQyBNc3AgSW5pdAorICogY2FsbGJhY2sgSUQKKyAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQURDX01TUERFSU5JVF9DQl9JRCAgICAgICAgICAgICAgICBBREMgTXNwIERlSW5pdAorICogY2FsbGJhY2sgSUQKKyAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQURDX01TUElOSVRfQ0JfSUQgTXNwSW5pdCBjYWxsYmFjayBJRAorICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9BRENfTVNQREVJTklUX0NCX0lEIE1zcERlSW5pdCBjYWxsYmFjayBJRAorICogQHBhcmFtICBwQ2FsbGJhY2sgcG9pbnRlciB0byB0aGUgQ2FsbGJhY2sgZnVuY3Rpb24KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDX1JlZ2lzdGVyQ2FsbGJhY2soQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBRENfQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjaykgeworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgaWYgKHBDYWxsYmFjayA9PSBOVUxMKSB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaGFkYy0+RXJyb3JDb2RlIHw9IEhBTF9BRENfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICBpZiAoKGhhZGMtPlN0YXRlICYgSEFMX0FEQ19TVEFURV9SRUFEWSkgIT0gMFVMKSB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKSB7CisgICAgICBjYXNlIEhBTF9BRENfQ09OVkVSU0lPTl9DT01QTEVURV9DQl9JRDoKKyAgICAgICAgaGFkYy0+Q29udkNwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0FEQ19DT05WRVJTSU9OX0hBTEZfQ0JfSUQ6CisgICAgICAgIGhhZGMtPkNvbnZIYWxmQ3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfQURDX0xFVkVMX09VVF9PRl9XSU5ET1dfMV9DQl9JRDoKKyAgICAgICAgaGFkYy0+TGV2ZWxPdXRPZldpbmRvd0NhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfQURDX0VSUk9SX0NCX0lEOgorICAgICAgICBoYWRjLT5FcnJvckNhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfQURDX0lOSl9DT05WRVJTSU9OX0NPTVBMRVRFX0NCX0lEOgorICAgICAgICBoYWRjLT5JbmplY3RlZENvbnZDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9BRENfSU5KX1FVRVVFX09WRUZMT1dfQ0JfSUQ6CisgICAgICAgIGhhZGMtPkluamVjdGVkUXVldWVPdmVyZmxvd0NhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfQURDX0xFVkVMX09VVF9PRl9XSU5ET1dfMl9DQl9JRDoKKyAgICAgICAgaGFkYy0+TGV2ZWxPdXRPZldpbmRvdzJDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0FEQ19MRVZFTF9PVVRfT0ZfV0lORE9XXzNfQ0JfSUQ6CisgICAgICAgIGhhZGMtPkxldmVsT3V0T2ZXaW5kb3czQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9BRENfRU5EX09GX1NBTVBMSU5HX0NCX0lEOgorICAgICAgICBoYWRjLT5FbmRPZlNhbXBsaW5nQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9BRENfTVNQSU5JVF9DQl9JRDoKKyAgICAgICAgaGFkYy0+TXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfQURDX01TUERFSU5JVF9DQl9JRDoKKyAgICAgICAgaGFkYy0+TXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgaGFkYy0+RXJyb3JDb2RlIHw9IEhBTF9BRENfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9IGVsc2UgaWYgKEhBTF9BRENfU1RBVEVfUkVTRVQgPT0gaGFkYy0+U3RhdGUpIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpIHsKKyAgICAgIGNhc2UgSEFMX0FEQ19NU1BJTklUX0NCX0lEOgorICAgICAgICBoYWRjLT5Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9BRENfTVNQREVJTklUX0NCX0lEOgorICAgICAgICBoYWRjLT5Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBoYWRjLT5FcnJvckNvZGUgfD0gSEFMX0FEQ19FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaGFkYy0+RXJyb3JDb2RlIHw9IEhBTF9BRENfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIEBicmllZiAgVW5yZWdpc3RlciBhIEFEQyBDYWxsYmFjaworICogICAgICAgICBBREMgY2FsbGJhY2sgaXMgcmVkaXJlY3RlZCB0byB0aGUgd2VhayBwcmVkZWZpbmVkIGNhbGxiYWNrCisgKiBAcGFyYW0gIGhhZGMgUG9pbnRlciB0byBhIEFEQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBBREMuCisgKiBAcGFyYW0gIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHVucmVnaXN0ZXJlZAorICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9BRENfQ09OVkVSU0lPTl9DT01QTEVURV9DQl9JRCAgICAgIEFEQyBjb252ZXJzaW9uCisgKiBjb21wbGV0ZSBjYWxsYmFjayBJRAorICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9BRENfQ09OVkVSU0lPTl9IQUxGX0NCX0lEICAgICAgICAgIEFEQyBjb252ZXJzaW9uIERNQQorICogaGFsZi10cmFuc2ZlciBjYWxsYmFjayBJRAorICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9BRENfTEVWRUxfT1VUX09GX1dJTkRPV18xX0NCX0lEICAgIEFEQyBhbmFsb2cgd2F0Y2hkb2cKKyAqIDEgY2FsbGJhY2sgSUQKKyAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQURDX0VSUk9SX0NCX0lEICAgICAgICAgICAgICAgICAgICBBREMgZXJyb3IgY2FsbGJhY2sKKyAqIElECisgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0FEQ19JTkpfQ09OVkVSU0lPTl9DT01QTEVURV9DQl9JRCAgQURDIGdyb3VwIGluamVjdGVkCisgKiBjb252ZXJzaW9uIGNvbXBsZXRlIGNhbGxiYWNrIElECisgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0FEQ19JTkpfUVVFVUVfT1ZFRkxPV19DQl9JRCAgICAgICAgQURDIGdyb3VwIGluamVjdGVkCisgKiBjb250ZXh0IHF1ZXVlIG92ZXJmbG93IGNhbGxiYWNrIElECisgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0FEQ19MRVZFTF9PVVRfT0ZfV0lORE9XXzJfQ0JfSUQgICAgQURDIGFuYWxvZyB3YXRjaGRvZworICogMiBjYWxsYmFjayBJRAorICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9BRENfTEVWRUxfT1VUX09GX1dJTkRPV18zX0NCX0lEICAgIEFEQyBhbmFsb2cgd2F0Y2hkb2cKKyAqIDMgY2FsbGJhY2sgSUQKKyAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQURDX0VORF9PRl9TQU1QTElOR19DQl9JRCAgICAgICAgICBBREMgZW5kIG9mIHNhbXBsaW5nCisgKiBjYWxsYmFjayBJRAorICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9BRENfTVNQSU5JVF9DQl9JRCAgICAgICAgICAgICAgICAgIEFEQyBNc3AgSW5pdAorICogY2FsbGJhY2sgSUQKKyAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQURDX01TUERFSU5JVF9DQl9JRCAgICAgICAgICAgICAgICBBREMgTXNwIERlSW5pdAorICogY2FsbGJhY2sgSUQKKyAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQURDX01TUElOSVRfQ0JfSUQgTXNwSW5pdCBjYWxsYmFjayBJRAorICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9BRENfTVNQREVJTklUX0NCX0lEIE1zcERlSW5pdCBjYWxsYmFjayBJRAorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfVW5SZWdpc3RlckNhbGxiYWNrKAorICAgIEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjLCBIQUxfQURDX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpIHsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIGlmICgoaGFkYy0+U3RhdGUgJiBIQUxfQURDX1NUQVRFX1JFQURZKSAhPSAwVUwpIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpIHsKKyAgICAgIGNhc2UgSEFMX0FEQ19DT05WRVJTSU9OX0NPTVBMRVRFX0NCX0lEOgorICAgICAgICBoYWRjLT5Db252Q3BsdENhbGxiYWNrID0gSEFMX0FEQ19Db252Q3BsdENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfQURDX0NPTlZFUlNJT05fSEFMRl9DQl9JRDoKKyAgICAgICAgaGFkYy0+Q29udkhhbGZDcGx0Q2FsbGJhY2sgPSBIQUxfQURDX0NvbnZIYWxmQ3BsdENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfQURDX0xFVkVMX09VVF9PRl9XSU5ET1dfMV9DQl9JRDoKKyAgICAgICAgaGFkYy0+TGV2ZWxPdXRPZldpbmRvd0NhbGxiYWNrID0gSEFMX0FEQ19MZXZlbE91dE9mV2luZG93Q2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9BRENfRVJST1JfQ0JfSUQ6CisgICAgICAgIGhhZGMtPkVycm9yQ2FsbGJhY2sgPSBIQUxfQURDX0Vycm9yQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9BRENfSU5KX0NPTlZFUlNJT05fQ09NUExFVEVfQ0JfSUQ6CisgICAgICAgIGhhZGMtPkluamVjdGVkQ29udkNwbHRDYWxsYmFjayA9IEhBTF9BRENFeF9JbmplY3RlZENvbnZDcGx0Q2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9BRENfSU5KX1FVRVVFX09WRUZMT1dfQ0JfSUQ6CisgICAgICAgIGhhZGMtPkluamVjdGVkUXVldWVPdmVyZmxvd0NhbGxiYWNrID0KKyAgICAgICAgICAgIEhBTF9BRENFeF9JbmplY3RlZFF1ZXVlT3ZlcmZsb3dDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0FEQ19MRVZFTF9PVVRfT0ZfV0lORE9XXzJfQ0JfSUQ6CisgICAgICAgIGhhZGMtPkxldmVsT3V0T2ZXaW5kb3cyQ2FsbGJhY2sgPSBIQUxfQURDRXhfTGV2ZWxPdXRPZldpbmRvdzJDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0FEQ19MRVZFTF9PVVRfT0ZfV0lORE9XXzNfQ0JfSUQ6CisgICAgICAgIGhhZGMtPkxldmVsT3V0T2ZXaW5kb3czQ2FsbGJhY2sgPSBIQUxfQURDRXhfTGV2ZWxPdXRPZldpbmRvdzNDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0FEQ19FTkRfT0ZfU0FNUExJTkdfQ0JfSUQ6CisgICAgICAgIGhhZGMtPkVuZE9mU2FtcGxpbmdDYWxsYmFjayA9IEhBTF9BRENFeF9FbmRPZlNhbXBsaW5nQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9BRENfTVNQSU5JVF9DQl9JRDoKKyAgICAgICAgaGFkYy0+TXNwSW5pdENhbGxiYWNrID0gSEFMX0FEQ19Nc3BJbml0OyAvKiBMZWdhY3kgd2VhayBNc3BJbml0ICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9BRENfTVNQREVJTklUX0NCX0lEOgorICAgICAgICBoYWRjLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9BRENfTXNwRGVJbml0OyAvKiBMZWdhY3kgd2VhayBNc3BEZUluaXQgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBoYWRjLT5FcnJvckNvZGUgfD0gSEFMX0FEQ19FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0gZWxzZSBpZiAoSEFMX0FEQ19TVEFURV9SRVNFVCA9PSBoYWRjLT5TdGF0ZSkgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkgeworICAgICAgY2FzZSBIQUxfQURDX01TUElOSVRfQ0JfSUQ6CisgICAgICAgIGhhZGMtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9BRENfTXNwSW5pdDsgLyogTGVnYWN5IHdlYWsgTXNwSW5pdCAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfQURDX01TUERFSU5JVF9DQl9JRDoKKyAgICAgICAgaGFkYy0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfQURDX01zcERlSW5pdDsgLyogTGVnYWN5IHdlYWsgTXNwRGVJbml0ICovCisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgaGFkYy0+RXJyb3JDb2RlIHw9IEhBTF9BRENfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9IGVsc2UgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGhhZGMtPkVycm9yQ29kZSB8PSBIQUxfQURDX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworI2VuZGlmIC8qIFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBBRENfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBBREMgSW5wdXQgYW5kIE91dHB1dCBvcGVyYXRpb24KK2Z1bmN0aW9ucworICAqIEBicmllZiAgICBBREMgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICAgKCspIFN0YXJ0IGNvbnZlcnNpb24gb2YgcmVndWxhciBncm91cC4KKyAgICAgICgrKSBTdG9wIGNvbnZlcnNpb24gb2YgcmVndWxhciBncm91cC4KKyAgICAgICgrKSBQb2xsIGZvciBjb252ZXJzaW9uIGNvbXBsZXRlIG9uIHJlZ3VsYXIgZ3JvdXAuCisgICAgICAoKykgUG9sbCBmb3IgY29udmVyc2lvbiBldmVudC4KKyAgICAgICgrKSBHZXQgcmVzdWx0IG9mIHJlZ3VsYXIgY2hhbm5lbCBjb252ZXJzaW9uLgorICAgICAgKCspIFN0YXJ0IGNvbnZlcnNpb24gb2YgcmVndWxhciBncm91cCBhbmQgZW5hYmxlIGludGVycnVwdGlvbnMuCisgICAgICAoKykgU3RvcCBjb252ZXJzaW9uIG9mIHJlZ3VsYXIgZ3JvdXAgYW5kIGRpc2FibGUgaW50ZXJydXB0aW9ucy4KKyAgICAgICgrKSBIYW5kbGUgQURDIGludGVycnVwdCByZXF1ZXN0CisgICAgICAoKykgU3RhcnQgY29udmVyc2lvbiBvZiByZWd1bGFyIGdyb3VwIGFuZCBlbmFibGUgRE1BIHRyYW5zZmVyLgorICAgICAgKCspIFN0b3AgY29udmVyc2lvbiBvZiByZWd1bGFyIGdyb3VwIGFuZCBkaXNhYmxlIEFEQyBETUEgdHJhbnNmZXIuCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAqIEBicmllZiAgRW5hYmxlIEFEQywgc3RhcnQgY29udmVyc2lvbiBvZiByZWd1bGFyIGdyb3VwLgorICogQG5vdGUgICBJbnRlcnJ1cHRpb25zIGVuYWJsZWQgaW4gdGhpcyBmdW5jdGlvbjogTm9uZS4KKyAqIEBub3RlICAgQ2FzZSBvZiBtdWx0aW1vZGUgZW5hYmxlZCAod2hlbiBtdWx0aW1vZGUgZmVhdHVyZSBpcyBhdmFpbGFibGUpOgorICogICAgICAgICAgIGlmIEFEQyBpcyBTbGF2ZSwgQURDIGlzIGVuYWJsZWQgYnV0IGNvbnZlcnNpb24gaXMgbm90IHN0YXJ0ZWQsCisgKiAgICAgICAgICAgaWYgQURDIGlzIG1hc3RlciwgQURDIGlzIGVuYWJsZWQgYW5kIG11bHRpbW9kZSBjb252ZXJzaW9uIGlzCisgKiBzdGFydGVkLgorICogQHBhcmFtIGhhZGMgQURDIGhhbmRsZQorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfU3RhcnQoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpIHsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgdG1wX2hhbF9zdGF0dXM7CisjaWYgZGVmaW5lZChBRENfTVVMVElNT0RFX1NVUFBPUlQpCisgIGNvbnN0IEFEQ19UeXBlRGVmICp0bXBBRENfTWFzdGVyOworICB1aW50MzJfdCB0bXBfbXVsdGltb2RlX2NvbmZpZyA9CisgICAgICBMTF9BRENfR2V0TXVsdGltb2RlKF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworI2VuZGlmIC8qIEFEQ19NVUxUSU1PREVfU1VQUE9SVCAqLworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7CisKKyAgLyogUGVyZm9ybSBBREMgZW5hYmxlIGFuZCBjb252ZXJzaW9uIHN0YXJ0IGlmIG5vIGNvbnZlcnNpb24gaXMgb24gZ29pbmcgKi8KKyAgaWYgKExMX0FEQ19SRUdfSXNDb252ZXJzaW9uT25nb2luZyhoYWRjLT5JbnN0YW5jZSkgPT0gMFVMKSB7CisgICAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhhZGMpOworCisgICAgLyogRW5hYmxlIHRoZSBBREMgcGVyaXBoZXJhbCAqLworICAgIHRtcF9oYWxfc3RhdHVzID0gQURDX0VuYWJsZShoYWRjKTsKKworICAgIC8qIFN0YXJ0IGNvbnZlcnNpb24gaWYgQURDIGlzIGVmZmVjdGl2ZWx5IGVuYWJsZWQgKi8KKyAgICBpZiAodG1wX2hhbF9zdGF0dXMgPT0gSEFMX09LKSB7CisgICAgICAvKiBTZXQgQURDIHN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgLyogLSBDbGVhciBzdGF0ZSBiaXRmaWVsZCByZWxhdGVkIHRvIHJlZ3VsYXIgZ3JvdXAgY29udmVyc2lvbiByZXN1bHRzICAgKi8KKyAgICAgIC8qIC0gU2V0IHN0YXRlIGJpdGZpZWxkIHJlbGF0ZWQgdG8gcmVndWxhciBvcGVyYXRpb24gICAgICAgICAgICAgICAgICAgICovCisgICAgICBBRENfU1RBVEVfQ0xSX1NFVChoYWRjLT5TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVBRFkgfCBIQUxfQURDX1NUQVRFX1JFR19FT0MgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVHX09WUiB8IEhBTF9BRENfU1RBVEVfUkVHX0VPU01QLAorICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSk7CisKKyNpZiBkZWZpbmVkKEFEQ19NVUxUSU1PREVfU1VQUE9SVCkKKyAgICAgIC8qIFJlc2V0IEhBTF9BRENfU1RBVEVfTVVMVElNT0RFX1NMQVZFIGJpdAorICAgICAgICAtIGlmIEFEQyBpbnN0YW5jZSBpcyBtYXN0ZXIgb3IgaWYgbXVsdGltb2RlIGZlYXR1cmUgaXMgbm90IGF2YWlsYWJsZQorICAgICAgICAtIGlmIG11bHRpbW9kZSBzZXR0aW5nIGlzIGRpc2FibGVkIChBREMgaW5zdGFuY2Ugc2xhdmUgaW4gaW5kZXBlbmRlbnQKKyAgICAgICAgbW9kZSkgKi8KKyAgICAgIGlmICgoX19MTF9BRENfTVVMVElfSU5TVEFOQ0VfTUFTVEVSKGhhZGMtPkluc3RhbmNlKSA9PSBoYWRjLT5JbnN0YW5jZSkgfHwKKyAgICAgICAgICAodG1wX211bHRpbW9kZV9jb25maWcgPT0gTExfQURDX01VTFRJX0lOREVQRU5ERU5UKSkgeworICAgICAgICBDTEVBUl9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfTVVMVElNT0RFX1NMQVZFKTsKKyAgICAgIH0KKyNlbmRpZiAvKiBBRENfTVVMVElNT0RFX1NVUFBPUlQgKi8KKworICAgICAgLyogU2V0IEFEQyBlcnJvciBjb2RlICovCisgICAgICAvKiBDaGVjayBpZiBhIGNvbnZlcnNpb24gaXMgb24gZ29pbmcgb24gQURDIGdyb3VwIGluamVjdGVkICovCisgICAgICBpZiAoSEFMX0lTX0JJVF9TRVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfSU5KX0JVU1kpKSB7CisgICAgICAgIC8qIFJlc2V0IEFEQyBlcnJvciBjb2RlIGZpZWxkcyByZWxhdGVkIHRvIHJlZ3VsYXIgY29udmVyc2lvbnMgb25seSAqLworICAgICAgICBDTEVBUl9CSVQoaGFkYy0+RXJyb3JDb2RlLCAoSEFMX0FEQ19FUlJPUl9PVlIgfCBIQUxfQURDX0VSUk9SX0RNQSkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogUmVzZXQgYWxsIEFEQyBlcnJvciBjb2RlIGZpZWxkcyAqLworICAgICAgICBBRENfQ0xFQVJfRVJST1JDT0RFKGhhZGMpOworICAgICAgfQorCisgICAgICAvKiBDbGVhciBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIGZsYWcgYW5kIG92ZXJydW4gZmxhZyAqLworICAgICAgLyogKFRvIGVuc3VyZSBvZiBubyB1bmtub3duIHN0YXRlIGZyb20gcG90ZW50aWFsIHByZXZpb3VzIEFEQyBvcGVyYXRpb25zKQorICAgICAgICovCisgICAgICBfX0hBTF9BRENfQ0xFQVJfRkxBRyhoYWRjLCAoQURDX0ZMQUdfRU9DIHwgQURDX0ZMQUdfRU9TIHwgQURDX0ZMQUdfT1ZSKSk7CisKKyAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgIC8qIFVubG9jayBiZWZvcmUgc3RhcnRpbmcgQURDIGNvbnZlcnNpb25zOiBpbiBjYXNlIG9mIHBvdGVudGlhbCAgICAgICAgICovCisgICAgICAvKiBpbnRlcnJ1cHRpb24sIHRvIGxldCB0aGUgcHJvY2VzcyB0byBBREMgSVJRIEhhbmRsZXIuICAgICAgICAgICAgICAgICAqLworICAgICAgX19IQUxfVU5MT0NLKGhhZGMpOworCisgICAgICAvKiBFbmFibGUgY29udmVyc2lvbiBvZiByZWd1bGFyIGdyb3VwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgLyogSWYgc29mdHdhcmUgc3RhcnQgaGFzIGJlZW4gc2VsZWN0ZWQsIGNvbnZlcnNpb24gc3RhcnRzIGltbWVkaWF0ZWx5LiAgKi8KKyAgICAgIC8qIElmIGV4dGVybmFsIHRyaWdnZXIgaGFzIGJlZW4gc2VsZWN0ZWQsIGNvbnZlcnNpb24gd2lsbCBzdGFydCBhdCBuZXh0ICovCisgICAgICAvKiB0cmlnZ2VyIGV2ZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgLyogQ2FzZSBvZiBtdWx0aW1vZGUgZW5hYmxlZCAod2hlbiBtdWx0aW1vZGUgZmVhdHVyZSBpcyBhdmFpbGFibGUpOiAgICAgKi8KKyAgICAgIC8qICAtIGlmIEFEQyBpcyBzbGF2ZSBhbmQgZHVhbCByZWd1bGFyIGNvbnZlcnNpb25zIGFyZSBlbmFibGVkLCBBREMgaXMgICovCisgICAgICAvKiAgICBlbmFibGVkIG9ubHkgKGNvbnZlcnNpb24gaXMgbm90IHN0YXJ0ZWQpLCAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgLyogIC0gaWYgQURDIGlzIG1hc3RlciwgQURDIGlzIGVuYWJsZWQgYW5kIGNvbnZlcnNpb24gaXMgc3RhcnRlZC4gICAgICAgKi8KKyNpZiBkZWZpbmVkKEFEQ19NVUxUSU1PREVfU1VQUE9SVCkKKyAgICAgIGlmICgoX19MTF9BRENfTVVMVElfSU5TVEFOQ0VfTUFTVEVSKGhhZGMtPkluc3RhbmNlKSA9PSBoYWRjLT5JbnN0YW5jZSkgfHwKKyAgICAgICAgICAodG1wX211bHRpbW9kZV9jb25maWcgPT0gTExfQURDX01VTFRJX0lOREVQRU5ERU5UKSB8fAorICAgICAgICAgICh0bXBfbXVsdGltb2RlX2NvbmZpZyA9PSBMTF9BRENfTVVMVElfRFVBTF9JTkpfU0lNVUxUKSB8fAorICAgICAgICAgICh0bXBfbXVsdGltb2RlX2NvbmZpZyA9PSBMTF9BRENfTVVMVElfRFVBTF9JTkpfQUxURVJOKSkgeworICAgICAgICAvKiBBREMgaW5zdGFuY2UgaXMgbm90IGEgbXVsdGltb2RlIHNsYXZlIGluc3RhbmNlIHdpdGggbXVsdGltb2RlIHJlZ3VsYXIKKyAgICAgICAgICogY29udmVyc2lvbnMgZW5hYmxlZCAqLworICAgICAgICBpZiAoUkVBRF9CSVQoaGFkYy0+SW5zdGFuY2UtPkNGR1IsIEFEQ19DRkdSX0pBVVRPKSAhPSAwVUwpIHsKKyAgICAgICAgICBBRENfU1RBVEVfQ0xSX1NFVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9JTkpfRU9DLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfSU5KX0JVU1kpOworICAgICAgICB9CisKKyAgICAgICAgLyogU3RhcnQgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiAqLworICAgICAgICBMTF9BRENfUkVHX1N0YXJ0Q29udmVyc2lvbihoYWRjLT5JbnN0YW5jZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBBREMgaW5zdGFuY2UgaXMgYSBtdWx0aW1vZGUgc2xhdmUgaW5zdGFuY2Ugd2l0aCBtdWx0aW1vZGUgcmVndWxhcgorICAgICAgICAgKiBjb252ZXJzaW9ucyBlbmFibGVkICovCisgICAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfTVVMVElNT0RFX1NMQVZFKTsKKyAgICAgICAgLyogaWYgTWFzdGVyIEFEQyBKQVVUTyBiaXQgaXMgc2V0LCB1cGRhdGUgU2xhdmUgU3RhdGUgaW4gc2V0dGluZworICAgICAgICAgICBIQUxfQURDX1NUQVRFX0lOSl9CVVNZIGJpdCBhbmQgaW4gcmVzZXR0aW5nIEhBTF9BRENfU1RBVEVfSU5KX0VPQyBiaXQKKyAgICAgICAgICovCisgICAgICAgIHRtcEFEQ19NYXN0ZXIgPSBfX0xMX0FEQ19NVUxUSV9JTlNUQU5DRV9NQVNURVIoaGFkYy0+SW5zdGFuY2UpOworICAgICAgICBpZiAoUkVBRF9CSVQodG1wQURDX01hc3Rlci0+Q0ZHUiwgQURDX0NGR1JfSkFVVE8pICE9IDBVTCkgeworICAgICAgICAgIEFEQ19TVEFURV9DTFJfU0VUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0lOSl9FT0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9JTkpfQlVTWSk7CisgICAgICAgIH0KKyAgICAgIH0KKyNlbHNlCisgICAgICBpZiAoUkVBRF9CSVQoaGFkYy0+SW5zdGFuY2UtPkNGR1IsIEFEQ19DRkdSX0pBVVRPKSAhPSAwVUwpIHsKKyAgICAgICAgQURDX1NUQVRFX0NMUl9TRVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfSU5KX0VPQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9JTkpfQlVTWSk7CisgICAgICB9CisKKyAgICAgIC8qIFN0YXJ0IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gKi8KKyAgICAgIExMX0FEQ19SRUdfU3RhcnRDb252ZXJzaW9uKGhhZGMtPkluc3RhbmNlKTsKKyNlbmRpZiAvKiBBRENfTVVMVElNT0RFX1NVUFBPUlQgKi8KKyAgICB9IGVsc2UgeworICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhhZGMpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICB0bXBfaGFsX3N0YXR1cyA9IEhBTF9CVVNZOworICB9CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gdG1wX2hhbF9zdGF0dXM7Cit9CisKKy8qKgorICogQGJyaWVmICBTdG9wIEFEQyBjb252ZXJzaW9uIG9mIHJlZ3VsYXIgZ3JvdXAgKGFuZCBpbmplY3RlZCBjaGFubmVscyBpbgorICogICAgICAgICBjYXNlIG9mIGF1dG9faW5qZWN0aW9uIG1vZGUpLCBkaXNhYmxlIEFEQyBwZXJpcGhlcmFsLgorICogQG5vdGU6ICBBREMgcGVyaXBoZXJhbCBkaXNhYmxlIGlzIGZvcmNpbmcgc3RvcCBvZiBwb3RlbnRpYWwKKyAqICAgICAgICAgY29udmVyc2lvbiBvbiBpbmplY3RlZCBncm91cC4gSWYgaW5qZWN0ZWQgZ3JvdXAgaXMgdW5kZXIgdXNlLCBpdAorICogICAgICAgICBzaG91bGQgYmUgcHJlbGltaW5hcmlseSBzdG9wcGVkIHVzaW5nIEhBTF9BRENFeF9JbmplY3RlZFN0b3AKKyAqIGZ1bmN0aW9uLgorICogQHBhcmFtIGhhZGMgQURDIGhhbmRsZQorICogQHJldHZhbCBIQUwgc3RhdHVzLgorICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDX1N0b3AoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpIHsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgdG1wX2hhbF9zdGF0dXM7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhhZGMpOworCisgIC8qIDEuIFN0b3AgcG90ZW50aWFsIGNvbnZlcnNpb24gb24gZ29pbmcsIG9uIEFEQyBncm91cHMgcmVndWxhciBhbmQgaW5qZWN0ZWQKKyAgICovCisgIHRtcF9oYWxfc3RhdHVzID0gQURDX0NvbnZlcnNpb25TdG9wKGhhZGMsIEFEQ19SRUdVTEFSX0lOSkVDVEVEX0dST1VQKTsKKworICAvKiBEaXNhYmxlIEFEQyBwZXJpcGhlcmFsIGlmIGNvbnZlcnNpb25zIGFyZSBlZmZlY3RpdmVseSBzdG9wcGVkICovCisgIGlmICh0bXBfaGFsX3N0YXR1cyA9PSBIQUxfT0spIHsKKyAgICAvKiAyLiBEaXNhYmxlIHRoZSBBREMgcGVyaXBoZXJhbCAqLworICAgIHRtcF9oYWxfc3RhdHVzID0gQURDX0Rpc2FibGUoaGFkYyk7CisKKyAgICAvKiBDaGVjayBpZiBBREMgaXMgZWZmZWN0aXZlbHkgZGlzYWJsZWQgKi8KKyAgICBpZiAodG1wX2hhbF9zdGF0dXMgPT0gSEFMX09LKSB7CisgICAgICAvKiBTZXQgQURDIHN0YXRlICovCisgICAgICBBRENfU1RBVEVfQ0xSX1NFVChoYWRjLT5TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVHX0JVU1kgfCBIQUxfQURDX1NUQVRFX0lOSl9CVVNZLAorICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUFEWSk7CisgICAgfQorICB9CisKKyAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGFkYyk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gdG1wX2hhbF9zdGF0dXM7Cit9CisKKy8qKgorICogQGJyaWVmICBXYWl0IGZvciByZWd1bGFyIGdyb3VwIGNvbnZlcnNpb24gdG8gYmUgY29tcGxldGVkLgorICogQG5vdGUgICBBREMgY29udmVyc2lvbiBmbGFncyBFT1MgKGVuZCBvZiBzZXF1ZW5jZSkgYW5kIEVPQyAoZW5kIG9mCisgKiAgICAgICAgIGNvbnZlcnNpb24pIGFyZSBjbGVhcmVkIGJ5IHRoaXMgZnVuY3Rpb24sIHdpdGggYW4gZXhjZXB0aW9uOgorICogICAgICAgICBpZiBsb3cgcG93ZXIgZmVhdHVyZSAiTG93UG93ZXJBdXRvV2FpdCIgaXMgZW5hYmxlZCwgZmxhZ3MgYXJlCisgKiAgICAgICAgIG5vdCBjbGVhcmVkIHRvIG5vdCBpbnRlcmZlcmUgd2l0aCB0aGlzIGZlYXR1cmUgdW50aWwgZGF0YSByZWdpc3RlcgorICogICAgICAgICBpcyByZWFkIHVzaW5nIGZ1bmN0aW9uIEhBTF9BRENfR2V0VmFsdWUoKS4KKyAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgdXNlZCBpbiBhIHBhcnRpY3VsYXIgc2V0dXA6IEFEQyBjb25maWd1cmVkCisgKiAgICAgICAgIGluIERNQSBtb2RlIGFuZCBwb2xsaW5nIGZvciBlbmQgb2YgZWFjaCBjb252ZXJzaW9uIChBREMgaW5pdAorICogICAgICAgICBwYXJhbWV0ZXIgIkVPQ1NlbGVjdGlvbiIgc2V0IHRvIEFEQ19FT0NfU0lOR0xFX0NPTlYpLgorICogICAgICAgICBJbiB0aGlzIGNhc2UsIERNQSByZXNldHMgdGhlIGZsYWcgRU9DIGFuZCBwb2xsaW5nIGNhbm5vdCBiZQorICogICAgICAgICBwZXJmb3JtZWQgb24gZWFjaCBjb252ZXJzaW9uLiBOZXZlcnRoZWxlc3MsIHBvbGxpbmcgY2FuIHN0aWxsCisgKiAgICAgICAgIGJlIHBlcmZvcm1lZCBvbiB0aGUgY29tcGxldGUgc2VxdWVuY2UgKEFEQyBpbml0CisgKiAgICAgICAgIHBhcmFtZXRlciAiRU9DU2VsZWN0aW9uIiBzZXQgdG8gQURDX0VPQ19TRVFfQ09OVikuCisgKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlCisgKiBAcGFyYW0gVGltZW91dCBUaW1lb3V0IHZhbHVlIGluIG1pbGxpc2Vjb25kLgorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfUG9sbEZvckNvbnZlcnNpb24oQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVvdXQpIHsKKyAgdWludDMyX3QgdGlja3N0YXJ0OworICB1aW50MzJfdCB0bXBfRmxhZ19FbmQ7CisgIHVpbnQzMl90IHRtcF9jZmdyOworI2lmIGRlZmluZWQoQURDX01VTFRJTU9ERV9TVVBQT1JUKQorICBjb25zdCBBRENfVHlwZURlZiAqdG1wQURDX01hc3RlcjsKKyAgdWludDMyX3QgdG1wX211bHRpbW9kZV9jb25maWcgPQorICAgICAgTExfQURDX0dldE11bHRpbW9kZShfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKyNlbmRpZiAvKiBBRENfTVVMVElNT0RFX1NVUFBPUlQgKi8KKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworCisgIC8qIElmIGVuZCBvZiBjb252ZXJzaW9uIHNlbGVjdGVkIHRvIGVuZCBvZiBzZXF1ZW5jZSBjb252ZXJzaW9ucyAqLworICBpZiAoaGFkYy0+SW5pdC5FT0NTZWxlY3Rpb24gPT0gQURDX0VPQ19TRVFfQ09OVikgeworICAgIHRtcF9GbGFnX0VuZCA9IEFEQ19GTEFHX0VPUzsKKyAgfQorICAvKiBJZiBlbmQgb2YgY29udmVyc2lvbiBzZWxlY3RlZCB0byBlbmQgb2YgdW5pdGFyeSBjb252ZXJzaW9uICovCisgIGVsc2UgLyogQURDX0VPQ19TSU5HTEVfQ09OViAqLworICB7CisgICAgLyogVmVyaWZpY2F0aW9uIHRoYXQgQURDIGNvbmZpZ3VyYXRpb24gaXMgY29tcGxpYW50IHdpdGggcG9sbGluZyBmb3IgICAgICAqLworICAgIC8qIGVhY2ggY29udmVyc2lvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBQYXJ0aWN1bGFyIGNhc2UgaXMgQURDIGNvbmZpZ3VyZWQgaW4gRE1BIG1vZGUgYW5kIEFEQyBzZXF1ZW5jZXIgd2l0aCAgICovCisgICAgLyogc2V2ZXJhbCByYW5rcyBhbmQgcG9sbGluZyBmb3IgZW5kIG9mIGVhY2ggY29udmVyc2lvbi4gICAgICAgICAgICAgICAgICAqLworICAgIC8qIEZvciBjb2RlIHNpbXBsaWNpdHkgc2FrZSwgdGhpcyBwYXJ0aWN1bGFyIGNhc2UgaXMgZ2VuZXJhbGl6ZWQgdG8gICAgICAgKi8KKyAgICAvKiBBREMgY29uZmlndXJlZCBpbiBETUEgbW9kZSBhbmQgYW5kIHBvbGxpbmcgZm9yIGVuZCBvZiBlYWNoIGNvbnZlcnNpb24uICovCisjaWYgZGVmaW5lZChBRENfTVVMVElNT0RFX1NVUFBPUlQpCisgICAgaWYgKCh0bXBfbXVsdGltb2RlX2NvbmZpZyA9PSBMTF9BRENfTVVMVElfSU5ERVBFTkRFTlQpIHx8CisgICAgICAgICh0bXBfbXVsdGltb2RlX2NvbmZpZyA9PSBMTF9BRENfTVVMVElfRFVBTF9JTkpfU0lNVUxUKSB8fAorICAgICAgICAodG1wX211bHRpbW9kZV9jb25maWcgPT0gTExfQURDX01VTFRJX0RVQUxfSU5KX0FMVEVSTikpIHsKKyAgICAgIC8qIENoZWNrIEFEQyBETUEgbW9kZSBpbiBpbmRlcGVuZGVudCBtb2RlIG9uIEFEQyBncm91cCByZWd1bGFyICovCisgICAgICBpZiAoUkVBRF9CSVQoaGFkYy0+SW5zdGFuY2UtPkNGR1IsIEFEQ19DRkdSX0RNQUVOKSAhPSAwVUwpIHsKKyAgICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9DT05GSUcpOworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdG1wX0ZsYWdfRW5kID0gKEFEQ19GTEFHX0VPQyk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIENoZWNrIEFEQyBETUEgbW9kZSBpbiBtdWx0aW1vZGUgb24gQURDIGdyb3VwIHJlZ3VsYXIgKi8KKyAgICAgIGlmIChMTF9BRENfR2V0TXVsdGlETUFUcmFuc2ZlcihfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoCisgICAgICAgICAgICAgIGhhZGMtPkluc3RhbmNlKSkgIT0gTExfQURDX01VTFRJX1JFR19ETUFfRUFDSF9BREMpIHsKKyAgICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9DT05GSUcpOworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdG1wX0ZsYWdfRW5kID0gKEFEQ19GTEFHX0VPQyk7CisgICAgICB9CisgICAgfQorI2Vsc2UKKyAgICAvKiBDaGVjayBBREMgRE1BIG1vZGUgKi8KKyAgICBpZiAoUkVBRF9CSVQoaGFkYy0+SW5zdGFuY2UtPkNGR1IsIEFEQ19DRkdSX0RNQUVOKSAhPSAwVUwpIHsKKyAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfRVJST1JfQ09ORklHKTsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfSBlbHNlIHsKKyAgICAgIHRtcF9GbGFnX0VuZCA9IChBRENfRkxBR19FT0MpOworICAgIH0KKyNlbmRpZiAvKiBBRENfTVVMVElNT0RFX1NVUFBPUlQgKi8KKyAgfQorCisgIC8qIEdldCB0aWNrIGNvdW50ICovCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgLyogV2FpdCB1bnRpbCBFbmQgb2YgdW5pdGFyeSBjb252ZXJzaW9uIG9yIHNlcXVlbmNlIGNvbnZlcnNpb25zIGZsYWcgaXMgcmFpc2VkCisgICAqLworICB3aGlsZSAoKGhhZGMtPkluc3RhbmNlLT5JU1IgJiB0bXBfRmxhZ19FbmQpID09IDBVTCkgeworICAgIC8qIENoZWNrIGlmIHRpbWVvdXQgaXMgZGlzYWJsZWQgKHNldCB0byBpbmZpbml0ZSB3YWl0KSAqLworICAgIGlmIChUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpIHsKKyAgICAgIGlmICgoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gVGltZW91dCkgfHwgKFRpbWVvdXQgPT0gMFVMKSkgeworICAgICAgICAvKiBOZXcgY2hlY2sgdG8gYXZvaWQgZmFsc2UgdGltZW91dCBkZXRlY3Rpb24gaW4gY2FzZSBvZiBwcmVlbXB0aW9uICovCisgICAgICAgIGlmICgoaGFkYy0+SW5zdGFuY2UtPklTUiAmIHRtcF9GbGFnX0VuZCkgPT0gMFVMKSB7CisgICAgICAgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lIHRvIHRpbWVvdXQgKi8KKyAgICAgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX1RJTUVPVVQpOworCisgICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICAgIF9fSEFMX1VOTE9DSyhoYWRjKTsKKworICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSAqLworICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX1JFR19FT0MpOworCisgIC8qIERldGVybWluZSB3aGV0aGVyIGFueSBmdXJ0aGVyIGNvbnZlcnNpb24gdXBjb21pbmcgb24gZ3JvdXAgcmVndWxhciAgICAgICAqLworICAvKiBieSBleHRlcm5hbCB0cmlnZ2VyLCBjb250aW51b3VzIG1vZGUgb3Igc2NhbiBzZXF1ZW5jZSBvbiBnb2luZy4gICAgICAgICAgKi8KKyAgaWYgKChMTF9BRENfUkVHX0lzVHJpZ2dlclNvdXJjZVNXU3RhcnQoaGFkYy0+SW5zdGFuY2UpICE9IDBVTCkgJiYKKyAgICAgIChoYWRjLT5Jbml0LkNvbnRpbnVvdXNDb252TW9kZSA9PSBESVNBQkxFKSkgeworICAgIC8qIENoZWNrIHdoZXRoZXIgZW5kIG9mIHNlcXVlbmNlIGlzIHJlYWNoZWQgKi8KKyAgICBpZiAoX19IQUxfQURDX0dFVF9GTEFHKGhhZGMsIEFEQ19GTEFHX0VPUykpIHsKKyAgICAgIC8qIFNldCBBREMgc3RhdGUgKi8KKyAgICAgIENMRUFSX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSk7CisKKyAgICAgIGlmICgoaGFkYy0+U3RhdGUgJiBIQUxfQURDX1NUQVRFX0lOSl9CVVNZKSA9PSAwVUwpIHsKKyAgICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9SRUFEWSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogR2V0IHJlbGV2YW50IHJlZ2lzdGVyIENGR1IgaW4gQURDIGluc3RhbmNlIG9mIEFEQyBtYXN0ZXIgb3Igc2xhdmUgICAgICAgICovCisgIC8qIGluIGZ1bmN0aW9uIG9mIG11bHRpbW9kZSBzdGF0ZSAoZm9yIGRldmljZXMgd2l0aCBtdWx0aW1vZGUgICAgICAgICAgICAgICAqLworICAvKiBhdmFpbGFibGUpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNpZiBkZWZpbmVkKEFEQ19NVUxUSU1PREVfU1VQUE9SVCkKKyAgaWYgKChfX0xMX0FEQ19NVUxUSV9JTlNUQU5DRV9NQVNURVIoaGFkYy0+SW5zdGFuY2UpID09IGhhZGMtPkluc3RhbmNlKSB8fAorICAgICAgKHRtcF9tdWx0aW1vZGVfY29uZmlnID09IExMX0FEQ19NVUxUSV9JTkRFUEVOREVOVCkgfHwKKyAgICAgICh0bXBfbXVsdGltb2RlX2NvbmZpZyA9PSBMTF9BRENfTVVMVElfRFVBTF9JTkpfU0lNVUxUKSB8fAorICAgICAgKHRtcF9tdWx0aW1vZGVfY29uZmlnID09IExMX0FEQ19NVUxUSV9EVUFMX0lOSl9BTFRFUk4pKSB7CisgICAgLyogUmV0cmlldmUgaGFuZGxlIEFEQyBDRkdSIHJlZ2lzdGVyICovCisgICAgdG1wX2NmZ3IgPSBSRUFEX1JFRyhoYWRjLT5JbnN0YW5jZS0+Q0ZHUik7CisgIH0gZWxzZSB7CisgICAgLyogUmV0cmlldmUgTWFzdGVyIEFEQyBDRkdSIHJlZ2lzdGVyICovCisgICAgdG1wQURDX01hc3RlciA9IF9fTExfQURDX01VTFRJX0lOU1RBTkNFX01BU1RFUihoYWRjLT5JbnN0YW5jZSk7CisgICAgdG1wX2NmZ3IgPSBSRUFEX1JFRyh0bXBBRENfTWFzdGVyLT5DRkdSKTsKKyAgfQorI2Vsc2UKKyAgLyogUmV0cmlldmUgaGFuZGxlIEFEQyBDRkdSIHJlZ2lzdGVyICovCisgIHRtcF9jZmdyID0gUkVBRF9SRUcoaGFkYy0+SW5zdGFuY2UtPkNGR1IpOworI2VuZGlmIC8qIEFEQ19NVUxUSU1PREVfU1VQUE9SVCAqLworCisgIC8qIENsZWFyIHBvbGxlZCBmbGFnICovCisgIGlmICh0bXBfRmxhZ19FbmQgPT0gQURDX0ZMQUdfRU9TKSB7CisgICAgX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgQURDX0ZMQUdfRU9TKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBDbGVhciBlbmQgb2YgY29udmVyc2lvbiBFT0MgZmxhZyBvZiByZWd1bGFyIGdyb3VwIGlmIGxvdyBwb3dlciBmZWF0dXJlICovCisgICAgLyogIkxvd1Bvd2VyQXV0b1dhaXQgIiBpcyBkaXNhYmxlZCwgdG8gbm90IGludGVyZmVyZSB3aXRoIHRoaXMgZmVhdHVyZSAgICAqLworICAgIC8qIHVudGlsIGRhdGEgcmVnaXN0ZXIgaXMgcmVhZCB1c2luZyBmdW5jdGlvbiBIQUxfQURDX0dldFZhbHVlKCkuICAgICAgICAgKi8KKyAgICBpZiAoUkVBRF9CSVQodG1wX2NmZ3IsIEFEQ19DRkdSX0FVVERMWSkgPT0gMFVMKSB7CisgICAgICBfX0hBTF9BRENfQ0xFQVJfRkxBRyhoYWRjLCAoQURDX0ZMQUdfRU9DIHwgQURDX0ZMQUdfRU9TKSk7CisgICAgfQorICB9CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiAgUG9sbCBmb3IgQURDIGV2ZW50LgorICogQHBhcmFtIGhhZGMgQURDIGhhbmRsZQorICogQHBhcmFtIEV2ZW50VHlwZSB0aGUgQURDIGV2ZW50IHR5cGUuCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0VPU01QX0VWRU5UICBBREMgRW5kIG9mIFNhbXBsaW5nIGV2ZW50CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfQVdEMV9FVkVOVCAgIEFEQyBBbmFsb2cgd2F0Y2hkb2cgMSBldmVudCAobWFpbgorICogYW5hbG9nIHdhdGNoZG9nLCBwcmVzZW50IG9uIGFsbCBTVE0zMiBzZXJpZXMpCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfQVdEMl9FVkVOVCAgIEFEQyBBbmFsb2cgd2F0Y2hkb2cgMiBldmVudCAoYWRkaXRpb25hbAorICogYW5hbG9nIHdhdGNoZG9nLCBub3QgcHJlc2VudCBvbiBhbGwgU1RNMzIgc2VyaWVzKQorICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0FXRDNfRVZFTlQgICBBREMgQW5hbG9nIHdhdGNoZG9nIDMgZXZlbnQgKGFkZGl0aW9uYWwKKyAqIGFuYWxvZyB3YXRjaGRvZywgbm90IHByZXNlbnQgb24gYWxsIFNUTTMyIHNlcmllcykKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19PVlJfRVZFTlQgICAgQURDIE92ZXJydW4gZXZlbnQKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19KUU9WRl9FVkVOVCAgQURDIEluamVjdGVkIGNvbnRleHQgcXVldWUgb3ZlcmZsb3cKKyAqIGV2ZW50CisgKiBAcGFyYW0gVGltZW91dCBUaW1lb3V0IHZhbHVlIGluIG1pbGxpc2Vjb25kLgorICogQG5vdGUgICBUaGUgcmVsZXZhbnQgZmxhZyBpcyBjbGVhcmVkIGlmIGZvdW5kIHRvIGJlIHNldCwgZXhjZXB0IGZvcgorICogQURDX0ZMQUdfT1ZSLiBJbmRlZWQsIHRoZSBsYXR0ZXIgaXMgcmVzZXQgb25seSBpZiBoYWRjLT5Jbml0Lk92ZXJydW4gZmllbGQgaXMKKyAqIHNldCB0byBBRENfT1ZSX0RBVEFfT1ZFUldSSVRURU4uIE90aGVyd2lzZSwgZGF0YSByZWdpc3RlciBtYXkgYmUgcG90ZW50aWFsbHkKKyAqIG92ZXJ3cml0dGVuIGJ5IGEgbmV3IGNvbnZlcnRlZCBkYXRhIGFzIHNvb24gYXMgT1ZSIGlzIGNsZWFyZWQuIFRvIHJlc2V0IE9WUgorICogZmxhZyBvbmNlIHRoZSBwcmVzZXJ2ZWQgZGF0YSBpcyByZXRyaWV2ZWQsIHRoZSB1c2VyIGNhbiByZXNvcnQgdG8gbWFjcm8KKyAqIF9fSEFMX0FEQ19DTEVBUl9GTEFHKGhhZGMsIEFEQ19GTEFHX09WUik7CisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ19Qb2xsRm9yRXZlbnQoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBFdmVudFR5cGUsIHVpbnQzMl90IFRpbWVvdXQpIHsKKyAgdWludDMyX3QgdGlja3N0YXJ0OworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19BRENfRVZFTlRfVFlQRShFdmVudFR5cGUpKTsKKworICAvKiBHZXQgdGljayBjb3VudCAqLworICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgIC8qIENoZWNrIHNlbGVjdGVkIGV2ZW50IGZsYWcgKi8KKyAgd2hpbGUgKF9fSEFMX0FEQ19HRVRfRkxBRyhoYWRjLCBFdmVudFR5cGUpID09IDBVTCkgeworICAgIC8qIENoZWNrIGlmIHRpbWVvdXQgaXMgZGlzYWJsZWQgKHNldCB0byBpbmZpbml0ZSB3YWl0KSAqLworICAgIGlmIChUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpIHsKKyAgICAgIGlmICgoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gVGltZW91dCkgfHwgKFRpbWVvdXQgPT0gMFVMKSkgeworICAgICAgICAvKiBOZXcgY2hlY2sgdG8gYXZvaWQgZmFsc2UgdGltZW91dCBkZXRlY3Rpb24gaW4gY2FzZSBvZiBwcmVlbXB0aW9uICovCisgICAgICAgIGlmIChfX0hBTF9BRENfR0VUX0ZMQUcoaGFkYywgRXZlbnRUeXBlKSA9PSAwVUwpIHsKKyAgICAgICAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gdGltZW91dCAqLworICAgICAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfVElNRU9VVCk7CisKKyAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICAgICAgX19IQUxfVU5MT0NLKGhhZGMpOworCisgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgc3dpdGNoIChFdmVudFR5cGUpIHsKKyAgICAvKiBFbmQgT2YgU2FtcGxpbmcgZXZlbnQgKi8KKyAgICBjYXNlIEFEQ19FT1NNUF9FVkVOVDoKKyAgICAgIC8qIFNldCBBREMgc3RhdGUgKi8KKyAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfUkVHX0VPU01QKTsKKworICAgICAgLyogQ2xlYXIgdGhlIEVuZCBPZiBTYW1wbGluZyBmbGFnICovCisgICAgICBfX0hBTF9BRENfQ0xFQVJfRkxBRyhoYWRjLCBBRENfRkxBR19FT1NNUCk7CisKKyAgICAgIGJyZWFrOworCisgICAgLyogQW5hbG9nIHdhdGNoZG9nIChsZXZlbCBvdXQgb2Ygd2luZG93KSBldmVudCAqLworICAgIC8qIE5vdGU6IEluIGNhc2Ugb2Ygc2V2ZXJhbCBhbmFsb2cgd2F0Y2hkb2cgZW5hYmxlZCwgaWYgbmVlZGVkIHRvIGtub3cgKi8KKyAgICAvKiB3aGljaCBvbmUgdHJpZ2dlcmVkIGFuZCBvbiB3aGljaCBBREN4LCB0ZXN0IEFEQyBzdGF0ZSBvZiBhbmFsb2cgd2F0Y2hkb2cKKyAgICAgKi8KKyAgICAvKiBmbGFncyBIQUxfQURDX1NUQVRFX0FXRDEvMi8zIHVzaW5nIGZ1bmN0aW9uICJIQUxfQURDX0dldFN0YXRlKCkiLiAqLworICAgIC8qIEZvciBleGFtcGxlOiAqLworICAgIC8qICAiIGlmICgoSEFMX0FEQ19HZXRTdGF0ZShoYWRjMSkgJiBIQUxfQURDX1NUQVRFX0FXRDEpICE9IDBVTCkgIiAqLworICAgIC8qICAiIGlmICgoSEFMX0FEQ19HZXRTdGF0ZShoYWRjMSkgJiBIQUxfQURDX1NUQVRFX0FXRDIpICE9IDBVTCkgIiAqLworICAgIC8qICAiIGlmICgoSEFMX0FEQ19HZXRTdGF0ZShoYWRjMSkgJiBIQUxfQURDX1NUQVRFX0FXRDMpICE9IDBVTCkgIiAqLworCisgICAgLyogQ2hlY2sgYW5hbG9nIHdhdGNoZG9nIDEgZmxhZyAqLworICAgIGNhc2UgQURDX0FXRF9FVkVOVDoKKyAgICAgIC8qIFNldCBBREMgc3RhdGUgKi8KKyAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfQVdEMSk7CisKKyAgICAgIC8qIENsZWFyIEFEQyBhbmFsb2cgd2F0Y2hkb2cgZmxhZyAqLworICAgICAgX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgQURDX0ZMQUdfQVdEMSk7CisKKyAgICAgIGJyZWFrOworCisgICAgLyogQ2hlY2sgYW5hbG9nIHdhdGNoZG9nIDIgZmxhZyAqLworICAgIGNhc2UgQURDX0FXRDJfRVZFTlQ6CisgICAgICAvKiBTZXQgQURDIHN0YXRlICovCisgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0FXRDIpOworCisgICAgICAvKiBDbGVhciBBREMgYW5hbG9nIHdhdGNoZG9nIGZsYWcgKi8KKyAgICAgIF9fSEFMX0FEQ19DTEVBUl9GTEFHKGhhZGMsIEFEQ19GTEFHX0FXRDIpOworCisgICAgICBicmVhazsKKworICAgIC8qIENoZWNrIGFuYWxvZyB3YXRjaGRvZyAzIGZsYWcgKi8KKyAgICBjYXNlIEFEQ19BV0QzX0VWRU5UOgorICAgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9BV0QzKTsKKworICAgICAgLyogQ2xlYXIgQURDIGFuYWxvZyB3YXRjaGRvZyBmbGFnICovCisgICAgICBfX0hBTF9BRENfQ0xFQVJfRkxBRyhoYWRjLCBBRENfRkxBR19BV0QzKTsKKworICAgICAgYnJlYWs7CisKKyAgICAvKiBJbmplY3RlZCBjb250ZXh0IHF1ZXVlIG92ZXJmbG93IGV2ZW50ICovCisgICAgY2FzZSBBRENfSlFPVkZfRVZFTlQ6CisgICAgICAvKiBTZXQgQURDIHN0YXRlICovCisgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0lOSl9KUU9WRik7CisKKyAgICAgIC8qIFNldCBBREMgZXJyb3IgY29kZSB0byBJbmplY3RlZCBjb250ZXh0IHF1ZXVlIG92ZXJmbG93ICovCisgICAgICBTRVRfQklUKGhhZGMtPkVycm9yQ29kZSwgSEFMX0FEQ19FUlJPUl9KUU9WRik7CisKKyAgICAgIC8qIENsZWFyIEFEQyBJbmplY3RlZCBjb250ZXh0IHF1ZXVlIG92ZXJmbG93IGZsYWcgKi8KKyAgICAgIF9fSEFMX0FEQ19DTEVBUl9GTEFHKGhhZGMsIEFEQ19GTEFHX0pRT1ZGKTsKKworICAgICAgYnJlYWs7CisKKyAgICAvKiBPdmVycnVuIGV2ZW50ICovCisgICAgZGVmYXVsdDogLyogQ2FzZSBBRENfT1ZSX0VWRU5UICovCisgICAgICAvKiBJZiBvdmVycnVuIGlzIHNldCB0byBvdmVyd3JpdGUgcHJldmlvdXMgZGF0YSwgb3ZlcnJ1biBldmVudCBpcyBub3QgKi8KKyAgICAgIC8qIGNvbnNpZGVyZWQgYXMgYW4gZXJyb3IuICovCisgICAgICAvKiAoY2YgcmVmIG1hbnVhbCAiTWFuYWdpbmcgY29udmVyc2lvbnMgd2l0aG91dCB1c2luZyB0aGUgRE1BIGFuZCB3aXRob3V0CisgICAgICAgKi8KKyAgICAgIC8qIG92ZXJydW4gIikgKi8KKyAgICAgIGlmIChoYWRjLT5Jbml0Lk92ZXJydW4gPT0gQURDX09WUl9EQVRBX1BSRVNFUlZFRCkgeworICAgICAgICAvKiBTZXQgQURDIHN0YXRlICovCisgICAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfUkVHX09WUik7CisKKyAgICAgICAgLyogU2V0IEFEQyBlcnJvciBjb2RlIHRvIG92ZXJydW4gKi8KKyAgICAgICAgU0VUX0JJVChoYWRjLT5FcnJvckNvZGUsIEhBTF9BRENfRVJST1JfT1ZSKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIENsZWFyIEFEQyBPdmVycnVuIGZsYWcgb25seSBpZiBPdmVycnVuIGlzIHNldCB0bworICAgICAgICAgICBBRENfT1ZSX0RBVEFfT1ZFUldSSVRURU4gb3RoZXJ3aXNlLCBkYXRhIHJlZ2lzdGVyIGlzIHBvdGVudGlhbGx5CisgICAgICAgICAgIG92ZXJ3cml0dGVuIGJ5IG5ldyBjb252ZXJ0ZWQgZGF0YSBhcyBzb29uIGFzIE9WUiBpcyBjbGVhcmVkLiAqLworICAgICAgICBfX0hBTF9BRENfQ0xFQVJfRkxBRyhoYWRjLCBBRENfRkxBR19PVlIpOworICAgICAgfQorICAgICAgYnJlYWs7CisgIH0KKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgQURDLCBzdGFydCBjb252ZXJzaW9uIG9mIHJlZ3VsYXIgZ3JvdXAgd2l0aCBpbnRlcnJ1cHRpb24uCisgKiBAbm90ZSAgIEludGVycnVwdGlvbnMgZW5hYmxlZCBpbiB0aGlzIGZ1bmN0aW9uIGFjY29yZGluZyB0byBpbml0aWFsaXphdGlvbgorICogICAgICAgICBzZXR0aW5nIDogRU9DIChlbmQgb2YgY29udmVyc2lvbiksIEVPUyAoZW5kIG9mIHNlcXVlbmNlKSwKKyAqICAgICAgICAgT1ZSIG92ZXJydW4uCisgKiAgICAgICAgIEVhY2ggb2YgdGhlc2UgaW50ZXJydXB0aW9ucyBoYXMgaXRzIGRlZGljYXRlZCBjYWxsYmFjayBmdW5jdGlvbi4KKyAqIEBub3RlICAgQ2FzZSBvZiBtdWx0aW1vZGUgZW5hYmxlZCAod2hlbiBtdWx0aW1vZGUgZmVhdHVyZSBpcyBhdmFpbGFibGUpOgorICogICAgICAgICBIQUxfQURDX1N0YXJ0X0lUKCkgbXVzdCBiZSBjYWxsZWQgZm9yIEFEQyBTbGF2ZSBmaXJzdCwgdGhlbiBmb3IKKyAqICAgICAgICAgQURDIE1hc3Rlci4KKyAqICAgICAgICAgRm9yIEFEQyBTbGF2ZSwgQURDIGlzIGVuYWJsZWQgb25seSAoY29udmVyc2lvbiBpcyBub3Qgc3RhcnRlZCkuCisgKiAgICAgICAgIEZvciBBREMgTWFzdGVyLCBBREMgaXMgZW5hYmxlZCBhbmQgbXVsdGltb2RlIGNvbnZlcnNpb24gaXMgc3RhcnRlZC4KKyAqIEBub3RlICAgVG8gZ3VhcmFudGVlIGEgcHJvcGVyIHJlc2V0IG9mIGFsbCBpbnRlcnJ1cHRpb25zIG9uY2UgYWxsIHRoZSBuZWVkZWQKKyAqICAgICAgICAgY29udmVyc2lvbnMgYXJlIG9idGFpbmVkLCBIQUxfQURDX1N0b3BfSVQoKSBtdXN0IGJlIGNhbGxlZCB0byBlbnN1cmUKKyAqICAgICAgICAgYSBjb3JyZWN0IHN0b3Agb2YgdGhlIElULWJhc2VkIGNvbnZlcnNpb25zLgorICogQG5vdGUgICBCeSBkZWZhdWx0LCBIQUxfQURDX1N0YXJ0X0lUKCkgZG9lcyBub3QgZW5hYmxlIHRoZSBFbmQgT2YgU2FtcGxpbmcKKyAqICAgICAgICAgaW50ZXJydXB0aW9uLiBJZiByZXF1aXJlZCAoZS5nLiBpbiBjYXNlIG9mIG92ZXJzYW1wbGluZyB3aXRoIHRyaWdnZXIKKyAqICAgICAgICAgbW9kZSksIHRoZSB1c2VyIG11c3Q6CisgKiAgICAgICAgICAxLiBmaXJzdCBjbGVhciB0aGUgRU9TTVAgZmxhZyBpZiBzZXQgd2l0aCBtYWNybworICogX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgQURDX0ZMQUdfRU9TTVApCisgKiAgICAgICAgICAyLiB0aGVuIGVuYWJsZSB0aGUgRU9TTVAgaW50ZXJydXB0IHdpdGggbWFjcm8KKyAqIF9fSEFMX0FEQ19FTkFCTEVfSVQoaGFkYywgQURDX0lUX0VPU01QKSBiZWZvcmUgY2FsbGluZyBIQUxfQURDX1N0YXJ0X0lUKCkuCisgKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ19TdGFydF9JVChBRENfSGFuZGxlVHlwZURlZiAqaGFkYykgeworICBIQUxfU3RhdHVzVHlwZURlZiB0bXBfaGFsX3N0YXR1czsKKyNpZiBkZWZpbmVkKEFEQ19NVUxUSU1PREVfU1VQUE9SVCkKKyAgY29uc3QgQURDX1R5cGVEZWYgKnRtcEFEQ19NYXN0ZXI7CisgIHVpbnQzMl90IHRtcF9tdWx0aW1vZGVfY29uZmlnID0KKyAgICAgIExMX0FEQ19HZXRNdWx0aW1vZGUoX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7CisjZW5kaWYgLyogQURDX01VTFRJTU9ERV9TVVBQT1JUICovCisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKworICAvKiBQZXJmb3JtIEFEQyBlbmFibGUgYW5kIGNvbnZlcnNpb24gc3RhcnQgaWYgbm8gY29udmVyc2lvbiBpcyBvbiBnb2luZyAqLworICBpZiAoTExfQURDX1JFR19Jc0NvbnZlcnNpb25PbmdvaW5nKGhhZGMtPkluc3RhbmNlKSA9PSAwVUwpIHsKKyAgICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGFkYyk7CisKKyAgICAvKiBFbmFibGUgdGhlIEFEQyBwZXJpcGhlcmFsICovCisgICAgdG1wX2hhbF9zdGF0dXMgPSBBRENfRW5hYmxlKGhhZGMpOworCisgICAgLyogU3RhcnQgY29udmVyc2lvbiBpZiBBREMgaXMgZWZmZWN0aXZlbHkgZW5hYmxlZCAqLworICAgIGlmICh0bXBfaGFsX3N0YXR1cyA9PSBIQUxfT0spIHsKKyAgICAgIC8qIFNldCBBREMgc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiAtIENsZWFyIHN0YXRlIGJpdGZpZWxkIHJlbGF0ZWQgdG8gcmVndWxhciBncm91cCBjb252ZXJzaW9uIHJlc3VsdHMgICAqLworICAgICAgLyogLSBTZXQgc3RhdGUgYml0ZmllbGQgcmVsYXRlZCB0byByZWd1bGFyIG9wZXJhdGlvbiAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIEFEQ19TVEFURV9DTFJfU0VUKGhhZGMtPlN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUFEWSB8IEhBTF9BRENfU1RBVEVfUkVHX0VPQyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUdfT1ZSIHwgSEFMX0FEQ19TVEFURV9SRUdfRU9TTVAsCisgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFR19CVVNZKTsKKworI2lmIGRlZmluZWQoQURDX01VTFRJTU9ERV9TVVBQT1JUKQorICAgICAgLyogUmVzZXQgSEFMX0FEQ19TVEFURV9NVUxUSU1PREVfU0xBVkUgYml0CisgICAgICAgIC0gaWYgQURDIGluc3RhbmNlIGlzIG1hc3RlciBvciBpZiBtdWx0aW1vZGUgZmVhdHVyZSBpcyBub3QgYXZhaWxhYmxlCisgICAgICAgIC0gaWYgbXVsdGltb2RlIHNldHRpbmcgaXMgZGlzYWJsZWQgKEFEQyBpbnN0YW5jZSBzbGF2ZSBpbiBpbmRlcGVuZGVudAorICAgICAgICBtb2RlKSAqLworICAgICAgaWYgKChfX0xMX0FEQ19NVUxUSV9JTlNUQU5DRV9NQVNURVIoaGFkYy0+SW5zdGFuY2UpID09IGhhZGMtPkluc3RhbmNlKSB8fAorICAgICAgICAgICh0bXBfbXVsdGltb2RlX2NvbmZpZyA9PSBMTF9BRENfTVVMVElfSU5ERVBFTkRFTlQpKSB7CisgICAgICAgIENMRUFSX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9NVUxUSU1PREVfU0xBVkUpOworICAgICAgfQorI2VuZGlmIC8qIEFEQ19NVUxUSU1PREVfU1VQUE9SVCAqLworCisgICAgICAvKiBTZXQgQURDIGVycm9yIGNvZGUgKi8KKyAgICAgIC8qIENoZWNrIGlmIGEgY29udmVyc2lvbiBpcyBvbiBnb2luZyBvbiBBREMgZ3JvdXAgaW5qZWN0ZWQgKi8KKyAgICAgIGlmICgoaGFkYy0+U3RhdGUgJiBIQUxfQURDX1NUQVRFX0lOSl9CVVNZKSAhPSAwVUwpIHsKKyAgICAgICAgLyogUmVzZXQgQURDIGVycm9yIGNvZGUgZmllbGRzIHJlbGF0ZWQgdG8gcmVndWxhciBjb252ZXJzaW9ucyBvbmx5ICovCisgICAgICAgIENMRUFSX0JJVChoYWRjLT5FcnJvckNvZGUsIChIQUxfQURDX0VSUk9SX09WUiB8IEhBTF9BRENfRVJST1JfRE1BKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBSZXNldCBhbGwgQURDIGVycm9yIGNvZGUgZmllbGRzICovCisgICAgICAgIEFEQ19DTEVBUl9FUlJPUkNPREUoaGFkYyk7CisgICAgICB9CisKKyAgICAgIC8qIENsZWFyIEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gZmxhZyBhbmQgb3ZlcnJ1biBmbGFnICovCisgICAgICAvKiAoVG8gZW5zdXJlIG9mIG5vIHVua25vd24gc3RhdGUgZnJvbSBwb3RlbnRpYWwgcHJldmlvdXMgQURDIG9wZXJhdGlvbnMpCisgICAgICAgKi8KKyAgICAgIF9fSEFMX0FEQ19DTEVBUl9GTEFHKGhhZGMsIChBRENfRkxBR19FT0MgfCBBRENfRkxBR19FT1MgfCBBRENfRkxBR19PVlIpKTsKKworICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgLyogVW5sb2NrIGJlZm9yZSBzdGFydGluZyBBREMgY29udmVyc2lvbnM6IGluIGNhc2Ugb2YgcG90ZW50aWFsICAgICAgICAgKi8KKyAgICAgIC8qIGludGVycnVwdGlvbiwgdG8gbGV0IHRoZSBwcm9jZXNzIHRvIEFEQyBJUlEgSGFuZGxlci4gICAgICAgICAgICAgICAgICovCisgICAgICBfX0hBTF9VTkxPQ0soaGFkYyk7CisKKyAgICAgIC8qIERpc2FibGUgYWxsIGludGVycnVwdGlvbnMgYmVmb3JlIGVuYWJsaW5nIHRoZSBkZXNpcmVkIG9uZXMgKi8KKyAgICAgIF9fSEFMX0FEQ19ESVNBQkxFX0lUKGhhZGMsIChBRENfSVRfRU9DIHwgQURDX0lUX0VPUyB8IEFEQ19JVF9PVlIpKTsKKworICAgICAgLyogRW5hYmxlIEFEQyBlbmQgb2YgY29udmVyc2lvbiBpbnRlcnJ1cHQgKi8KKyAgICAgIHN3aXRjaCAoaGFkYy0+SW5pdC5FT0NTZWxlY3Rpb24pIHsKKyAgICAgICAgY2FzZSBBRENfRU9DX1NFUV9DT05WOgorICAgICAgICAgIF9fSEFMX0FEQ19FTkFCTEVfSVQoaGFkYywgQURDX0lUX0VPUyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8qIGNhc2UgQURDX0VPQ19TSU5HTEVfQ09OViAqLworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIF9fSEFMX0FEQ19FTkFCTEVfSVQoaGFkYywgQURDX0lUX0VPQyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8qIEVuYWJsZSBBREMgb3ZlcnJ1biBpbnRlcnJ1cHQgKi8KKyAgICAgIC8qIElmIGhhZGMtPkluaXQuT3ZlcnJ1biBpcyBzZXQgdG8gQURDX09WUl9EQVRBX1BSRVNFUlZFRCwgb25seSB0aGVuIGlzCisgICAgICAgICBBRENfSVRfT1ZSIGVuYWJsZWQ7IG90aGVyd2lzZSBkYXRhIG92ZXJ3cml0ZSBpcyBjb25zaWRlcmVkIGFzIG5vcm1hbAorICAgICAgICAgYmVoYXZpb3IgYW5kIG5vIENQVSB0aW1lIGlzIGxvc3QgZm9yIGEgbm9uLXByb2Nlc3NlZCBpbnRlcnJ1cHRpb24gKi8KKyAgICAgIGlmIChoYWRjLT5Jbml0Lk92ZXJydW4gPT0gQURDX09WUl9EQVRBX1BSRVNFUlZFRCkgeworICAgICAgICBfX0hBTF9BRENfRU5BQkxFX0lUKGhhZGMsIEFEQ19JVF9PVlIpOworICAgICAgfQorCisgICAgICAvKiBFbmFibGUgY29udmVyc2lvbiBvZiByZWd1bGFyIGdyb3VwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgLyogSWYgc29mdHdhcmUgc3RhcnQgaGFzIGJlZW4gc2VsZWN0ZWQsIGNvbnZlcnNpb24gc3RhcnRzIGltbWVkaWF0ZWx5LiAgKi8KKyAgICAgIC8qIElmIGV4dGVybmFsIHRyaWdnZXIgaGFzIGJlZW4gc2VsZWN0ZWQsIGNvbnZlcnNpb24gd2lsbCBzdGFydCBhdCBuZXh0ICovCisgICAgICAvKiB0cmlnZ2VyIGV2ZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgLyogQ2FzZSBvZiBtdWx0aW1vZGUgZW5hYmxlZCAod2hlbiBtdWx0aW1vZGUgZmVhdHVyZSBpcyBhdmFpbGFibGUpOiAgICAgKi8KKyAgICAgIC8qICAtIGlmIEFEQyBpcyBzbGF2ZSBhbmQgZHVhbCByZWd1bGFyIGNvbnZlcnNpb25zIGFyZSBlbmFibGVkLCBBREMgaXMgICovCisgICAgICAvKiAgICBlbmFibGVkIG9ubHkgKGNvbnZlcnNpb24gaXMgbm90IHN0YXJ0ZWQpLCAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgLyogIC0gaWYgQURDIGlzIG1hc3RlciwgQURDIGlzIGVuYWJsZWQgYW5kIGNvbnZlcnNpb24gaXMgc3RhcnRlZC4gICAgICAgKi8KKyNpZiBkZWZpbmVkKEFEQ19NVUxUSU1PREVfU1VQUE9SVCkKKyAgICAgIGlmICgoX19MTF9BRENfTVVMVElfSU5TVEFOQ0VfTUFTVEVSKGhhZGMtPkluc3RhbmNlKSA9PSBoYWRjLT5JbnN0YW5jZSkgfHwKKyAgICAgICAgICAodG1wX211bHRpbW9kZV9jb25maWcgPT0gTExfQURDX01VTFRJX0lOREVQRU5ERU5UKSB8fAorICAgICAgICAgICh0bXBfbXVsdGltb2RlX2NvbmZpZyA9PSBMTF9BRENfTVVMVElfRFVBTF9JTkpfU0lNVUxUKSB8fAorICAgICAgICAgICh0bXBfbXVsdGltb2RlX2NvbmZpZyA9PSBMTF9BRENfTVVMVElfRFVBTF9JTkpfQUxURVJOKSkgeworICAgICAgICAvKiBBREMgaW5zdGFuY2UgaXMgbm90IGEgbXVsdGltb2RlIHNsYXZlIGluc3RhbmNlIHdpdGggbXVsdGltb2RlIHJlZ3VsYXIKKyAgICAgICAgICogY29udmVyc2lvbnMgZW5hYmxlZCAqLworICAgICAgICBpZiAoUkVBRF9CSVQoaGFkYy0+SW5zdGFuY2UtPkNGR1IsIEFEQ19DRkdSX0pBVVRPKSAhPSAwVUwpIHsKKyAgICAgICAgICBBRENfU1RBVEVfQ0xSX1NFVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9JTkpfRU9DLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfSU5KX0JVU1kpOworCisgICAgICAgICAgLyogRW5hYmxlIGFzIHdlbGwgaW5qZWN0ZWQgaW50ZXJydXB0aW9ucyBpbiBjYXNlCisgICAgICAgICAgIEhBTF9BRENFeF9JbmplY3RlZFN0YXJ0X0lUKCkgaGFzIG5vdCBiZWVuIGNhbGxlZCBiZWZvcmVoYW5kLiBUaGlzCisgICAgICAgICAgIGFsbG93cyB0byBzdGFydCByZWd1bGFyIGFuZCBpbmplY3RlZCBjb252ZXJzaW9ucyB3aGVuIEpBVVRPIGlzCisgICAgICAgICAgIHNldCB3aXRoIGEgc2luZ2xlIGNhbGwgdG8gSEFMX0FEQ19TdGFydF9JVCgpICovCisgICAgICAgICAgc3dpdGNoIChoYWRjLT5Jbml0LkVPQ1NlbGVjdGlvbikgeworICAgICAgICAgICAgY2FzZSBBRENfRU9DX1NFUV9DT05WOgorICAgICAgICAgICAgICBfX0hBTF9BRENfRElTQUJMRV9JVChoYWRjLCBBRENfSVRfSkVPQyk7CisgICAgICAgICAgICAgIF9fSEFMX0FEQ19FTkFCTEVfSVQoaGFkYywgQURDX0lUX0pFT1MpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIC8qIGNhc2UgQURDX0VPQ19TSU5HTEVfQ09OViAqLworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgX19IQUxfQURDX0RJU0FCTEVfSVQoaGFkYywgQURDX0lUX0pFT1MpOworICAgICAgICAgICAgICBfX0hBTF9BRENfRU5BQkxFX0lUKGhhZGMsIEFEQ19JVF9KRU9DKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogU3RhcnQgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiAqLworICAgICAgICBMTF9BRENfUkVHX1N0YXJ0Q29udmVyc2lvbihoYWRjLT5JbnN0YW5jZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBBREMgaW5zdGFuY2UgaXMgYSBtdWx0aW1vZGUgc2xhdmUgaW5zdGFuY2Ugd2l0aCBtdWx0aW1vZGUgcmVndWxhcgorICAgICAgICAgKiBjb252ZXJzaW9ucyBlbmFibGVkICovCisgICAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfTVVMVElNT0RFX1NMQVZFKTsKKyAgICAgICAgLyogaWYgTWFzdGVyIEFEQyBKQVVUTyBiaXQgaXMgc2V0LCBTbGF2ZSBpbmplY3RlZCBpbnRlcnJ1cHRpb25zCisgICAgICAgICAgIGFyZSBlbmFibGVkIG5ldmVydGhlbGVzcyAoZm9yIHNhbWUgcmVhc29uIGFzIGFib3ZlKSAqLworICAgICAgICB0bXBBRENfTWFzdGVyID0gX19MTF9BRENfTVVMVElfSU5TVEFOQ0VfTUFTVEVSKGhhZGMtPkluc3RhbmNlKTsKKyAgICAgICAgaWYgKFJFQURfQklUKHRtcEFEQ19NYXN0ZXItPkNGR1IsIEFEQ19DRkdSX0pBVVRPKSAhPSAwVUwpIHsKKyAgICAgICAgICAvKiBGaXJzdCwgdXBkYXRlIFNsYXZlIFN0YXRlIGluIHNldHRpbmcgSEFMX0FEQ19TVEFURV9JTkpfQlVTWSBiaXQKKyAgICAgICAgICAgICBhbmQgaW4gcmVzZXR0aW5nIEhBTF9BRENfU1RBVEVfSU5KX0VPQyBiaXQgKi8KKyAgICAgICAgICBBRENfU1RBVEVfQ0xSX1NFVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9JTkpfRU9DLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfSU5KX0JVU1kpOworICAgICAgICAgIC8qIE5leHQsIHNldCBTbGF2ZSBpbmplY3RlZCBpbnRlcnJ1cHRpb25zICovCisgICAgICAgICAgc3dpdGNoIChoYWRjLT5Jbml0LkVPQ1NlbGVjdGlvbikgeworICAgICAgICAgICAgY2FzZSBBRENfRU9DX1NFUV9DT05WOgorICAgICAgICAgICAgICBfX0hBTF9BRENfRElTQUJMRV9JVChoYWRjLCBBRENfSVRfSkVPQyk7CisgICAgICAgICAgICAgIF9fSEFMX0FEQ19FTkFCTEVfSVQoaGFkYywgQURDX0lUX0pFT1MpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIC8qIGNhc2UgQURDX0VPQ19TSU5HTEVfQ09OViAqLworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgX19IQUxfQURDX0RJU0FCTEVfSVQoaGFkYywgQURDX0lUX0pFT1MpOworICAgICAgICAgICAgICBfX0hBTF9BRENfRU5BQkxFX0lUKGhhZGMsIEFEQ19JVF9KRU9DKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisjZWxzZQorICAgICAgLyogQURDIGluc3RhbmNlIGlzIG5vdCBhIG11bHRpbW9kZSBzbGF2ZSBpbnN0YW5jZSB3aXRoIG11bHRpbW9kZSByZWd1bGFyCisgICAgICAgKiBjb252ZXJzaW9ucyBlbmFibGVkICovCisgICAgICBpZiAoUkVBRF9CSVQoaGFkYy0+SW5zdGFuY2UtPkNGR1IsIEFEQ19DRkdSX0pBVVRPKSAhPSAwVUwpIHsKKyAgICAgICAgQURDX1NUQVRFX0NMUl9TRVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfSU5KX0VPQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9JTkpfQlVTWSk7CisKKyAgICAgICAgLyogRW5hYmxlIGFzIHdlbGwgaW5qZWN0ZWQgaW50ZXJydXB0aW9ucyBpbiBjYXNlCisgICAgICAgICBIQUxfQURDRXhfSW5qZWN0ZWRTdGFydF9JVCgpIGhhcyBub3QgYmVlbiBjYWxsZWQgYmVmb3JlaGFuZC4gVGhpcworICAgICAgICAgYWxsb3dzIHRvIHN0YXJ0IHJlZ3VsYXIgYW5kIGluamVjdGVkIGNvbnZlcnNpb25zIHdoZW4gSkFVVE8gaXMKKyAgICAgICAgIHNldCB3aXRoIGEgc2luZ2xlIGNhbGwgdG8gSEFMX0FEQ19TdGFydF9JVCgpICovCisgICAgICAgIHN3aXRjaCAoaGFkYy0+SW5pdC5FT0NTZWxlY3Rpb24pIHsKKyAgICAgICAgICBjYXNlIEFEQ19FT0NfU0VRX0NPTlY6CisgICAgICAgICAgICBfX0hBTF9BRENfRElTQUJMRV9JVChoYWRjLCBBRENfSVRfSkVPQyk7CisgICAgICAgICAgICBfX0hBTF9BRENfRU5BQkxFX0lUKGhhZGMsIEFEQ19JVF9KRU9TKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIC8qIGNhc2UgQURDX0VPQ19TSU5HTEVfQ09OViAqLworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBfX0hBTF9BRENfRElTQUJMRV9JVChoYWRjLCBBRENfSVRfSkVPUyk7CisgICAgICAgICAgICBfX0hBTF9BRENfRU5BQkxFX0lUKGhhZGMsIEFEQ19JVF9KRU9DKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIFN0YXJ0IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gKi8KKyAgICAgIExMX0FEQ19SRUdfU3RhcnRDb252ZXJzaW9uKGhhZGMtPkluc3RhbmNlKTsKKyNlbmRpZiAvKiBBRENfTVVMVElNT0RFX1NVUFBPUlQgKi8KKyAgICB9IGVsc2UgeworICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhhZGMpOworICAgIH0KKworICB9IGVsc2UgeworICAgIHRtcF9oYWxfc3RhdHVzID0gSEFMX0JVU1k7CisgIH0KKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiB0bXBfaGFsX3N0YXR1czsKK30KKworLyoqCisgKiBAYnJpZWYgIFN0b3AgQURDIGNvbnZlcnNpb24gb2YgcmVndWxhciBncm91cCAoYW5kIGluamVjdGVkIGdyb3VwIGluCisgKiAgICAgICAgIGNhc2Ugb2YgYXV0b19pbmplY3Rpb24gbW9kZSksIGRpc2FibGUgaW50ZXJydXRpb24gb2YKKyAqICAgICAgICAgZW5kLW9mLWNvbnZlcnNpb24sIGRpc2FibGUgQURDIHBlcmlwaGVyYWwuCisgKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMuCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfU3RvcF9JVChBRENfSGFuZGxlVHlwZURlZiAqaGFkYykgeworICBIQUxfU3RhdHVzVHlwZURlZiB0bXBfaGFsX3N0YXR1czsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGFkYyk7CisKKyAgLyogMS4gU3RvcCBwb3RlbnRpYWwgY29udmVyc2lvbiBvbiBnb2luZywgb24gQURDIGdyb3VwcyByZWd1bGFyIGFuZCBpbmplY3RlZAorICAgKi8KKyAgdG1wX2hhbF9zdGF0dXMgPSBBRENfQ29udmVyc2lvblN0b3AoaGFkYywgQURDX1JFR1VMQVJfSU5KRUNURURfR1JPVVApOworCisgIC8qIERpc2FibGUgQURDIHBlcmlwaGVyYWwgaWYgY29udmVyc2lvbnMgYXJlIGVmZmVjdGl2ZWx5IHN0b3BwZWQgKi8KKyAgaWYgKHRtcF9oYWxfc3RhdHVzID09IEhBTF9PSykgeworICAgIC8qIERpc2FibGUgQURDIGVuZCBvZiBjb252ZXJzaW9uIGludGVycnVwdCBmb3IgcmVndWxhciBncm91cCAqLworICAgIC8qIERpc2FibGUgQURDIG92ZXJydW4gaW50ZXJydXB0ICovCisgICAgX19IQUxfQURDX0RJU0FCTEVfSVQoaGFkYywgKEFEQ19JVF9FT0MgfCBBRENfSVRfRU9TIHwgQURDX0lUX09WUikpOworCisgICAgLyogMi4gRGlzYWJsZSB0aGUgQURDIHBlcmlwaGVyYWwgKi8KKyAgICB0bXBfaGFsX3N0YXR1cyA9IEFEQ19EaXNhYmxlKGhhZGMpOworCisgICAgLyogQ2hlY2sgaWYgQURDIGlzIGVmZmVjdGl2ZWx5IGRpc2FibGVkICovCisgICAgaWYgKHRtcF9oYWxfc3RhdHVzID09IEhBTF9PSykgeworICAgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgICAgQURDX1NUQVRFX0NMUl9TRVQoaGFkYy0+U3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFR19CVVNZIHwgSEFMX0FEQ19TVEFURV9JTkpfQlVTWSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVBRFkpOworICAgIH0KKyAgfQorCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhhZGMpOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHRtcF9oYWxfc3RhdHVzOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIEFEQywgc3RhcnQgY29udmVyc2lvbiBvZiByZWd1bGFyIGdyb3VwIGFuZCB0cmFuc2ZlciByZXN1bHQKKyAqIHRocm91Z2ggRE1BLgorICogQG5vdGUgICBJbnRlcnJ1cHRpb25zIGVuYWJsZWQgaW4gdGhpcyBmdW5jdGlvbjoKKyAqICAgICAgICAgb3ZlcnJ1biAoaWYgYXBwbGljYWJsZSksIERNQSBoYWxmIHRyYW5zZmVyLCBETUEgdHJhbnNmZXIgY29tcGxldGUuCisgKiAgICAgICAgIEVhY2ggb2YgdGhlc2UgaW50ZXJydXB0aW9ucyBoYXMgaXRzIGRlZGljYXRlZCBjYWxsYmFjayBmdW5jdGlvbi4KKyAqIEBub3RlICAgQ2FzZSBvZiBtdWx0aW1vZGUgZW5hYmxlZCAod2hlbiBtdWx0aW1vZGUgZmVhdHVyZSBpcyBhdmFpbGFibGUpOgorICogSEFMX0FEQ19TdGFydF9ETUEoKSBpcyBkZXNpZ25lZCBmb3Igc2luZ2xlLUFEQyBtb2RlIG9ubHkuIEZvciBtdWx0aW1vZGUsIHRoZQorICogZGVkaWNhdGVkIEhBTF9BRENFeF9NdWx0aU1vZGVTdGFydF9ETUEoKSBmdW5jdGlvbiBtdXN0IGJlIHVzZWQuCisgKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlCisgKiBAcGFyYW0gcERhdGEgRGVzdGluYXRpb24gQnVmZmVyIGFkZHJlc3MuCisgKiBAcGFyYW0gTGVuZ3RoIE51bWJlciBvZiBkYXRhIHRvIGJlIHRyYW5zZmVycmVkIGZyb20gQURDIHBlcmlwaGVyYWwgdG8gbWVtb3J5CisgKiBAcmV0dmFsIEhBTCBzdGF0dXMuCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfU3RhcnRfRE1BKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjLCB1aW50MzJfdCAqcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBMZW5ndGgpIHsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgdG1wX2hhbF9zdGF0dXM7CisjaWYgZGVmaW5lZChBRENfTVVMVElNT0RFX1NVUFBPUlQpCisgIHVpbnQzMl90IHRtcF9tdWx0aW1vZGVfY29uZmlnID0KKyAgICAgIExMX0FEQ19HZXRNdWx0aW1vZGUoX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7CisjZW5kaWYgLyogQURDX01VTFRJTU9ERV9TVVBQT1JUICovCisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKworICAvKiBQZXJmb3JtIEFEQyBlbmFibGUgYW5kIGNvbnZlcnNpb24gc3RhcnQgaWYgbm8gY29udmVyc2lvbiBpcyBvbiBnb2luZyAqLworICBpZiAoTExfQURDX1JFR19Jc0NvbnZlcnNpb25PbmdvaW5nKGhhZGMtPkluc3RhbmNlKSA9PSAwVUwpIHsKKyAgICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGFkYyk7CisKKyNpZiBkZWZpbmVkKEFEQ19NVUxUSU1PREVfU1VQUE9SVCkKKyAgICAvKiBFbnN1cmUgdGhhdCBtdWx0aW1vZGUgcmVndWxhciBjb252ZXJzaW9ucyBhcmUgbm90IGVuYWJsZWQuICAgKi8KKyAgICAvKiBPdGhlcndpc2UsIGRlZGljYXRlZCBBUEkgSEFMX0FEQ0V4X011bHRpTW9kZVN0YXJ0X0RNQSgpIG11c3QgYmUgdXNlZC4gICovCisgICAgaWYgKChBRENfSVNfSU5ERVBFTkRFTlQoaGFkYykgIT0gUkVTRVQpIHx8CisgICAgICAgICh0bXBfbXVsdGltb2RlX2NvbmZpZyA9PSBMTF9BRENfTVVMVElfSU5ERVBFTkRFTlQpIHx8CisgICAgICAgICh0bXBfbXVsdGltb2RlX2NvbmZpZyA9PSBMTF9BRENfTVVMVElfRFVBTF9JTkpfU0lNVUxUKSB8fAorICAgICAgICAodG1wX211bHRpbW9kZV9jb25maWcgPT0gTExfQURDX01VTFRJX0RVQUxfSU5KX0FMVEVSTikpCisjZW5kaWYgLyogQURDX01VTFRJTU9ERV9TVVBQT1JUICovCisgICAgeworICAgICAgLyogRW5hYmxlIHRoZSBBREMgcGVyaXBoZXJhbCAqLworICAgICAgdG1wX2hhbF9zdGF0dXMgPSBBRENfRW5hYmxlKGhhZGMpOworCisgICAgICAvKiBTdGFydCBjb252ZXJzaW9uIGlmIEFEQyBpcyBlZmZlY3RpdmVseSBlbmFibGVkICovCisgICAgICBpZiAodG1wX2hhbF9zdGF0dXMgPT0gSEFMX09LKSB7CisgICAgICAgIC8qIFNldCBBREMgc3RhdGUgKi8KKyAgICAgICAgLyogLSBDbGVhciBzdGF0ZSBiaXRmaWVsZCByZWxhdGVkIHRvIHJlZ3VsYXIgZ3JvdXAgY29udmVyc2lvbiByZXN1bHRzICovCisgICAgICAgIC8qIC0gU2V0IHN0YXRlIGJpdGZpZWxkIHJlbGF0ZWQgdG8gcmVndWxhciBvcGVyYXRpb24gKi8KKyAgICAgICAgQURDX1NUQVRFX0NMUl9TRVQoaGFkYy0+U3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVBRFkgfCBIQUxfQURDX1NUQVRFX1JFR19FT0MgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUdfT1ZSIHwgSEFMX0FEQ19TVEFURV9SRUdfRU9TTVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVHX0JVU1kpOworCisjaWYgZGVmaW5lZChBRENfTVVMVElNT0RFX1NVUFBPUlQpCisgICAgICAgIC8qIFJlc2V0IEhBTF9BRENfU1RBVEVfTVVMVElNT0RFX1NMQVZFIGJpdAorICAgICAgICAgIC0gaWYgQURDIGluc3RhbmNlIGlzIG1hc3RlciBvciBpZiBtdWx0aW1vZGUgZmVhdHVyZSBpcyBub3QgYXZhaWxhYmxlCisgICAgICAgICAgLSBpZiBtdWx0aW1vZGUgc2V0dGluZyBpcyBkaXNhYmxlZCAoQURDIGluc3RhbmNlIHNsYXZlIGluIGluZGVwZW5kZW50CisgICAgICAgICAgbW9kZSkgKi8KKyAgICAgICAgaWYgKChfX0xMX0FEQ19NVUxUSV9JTlNUQU5DRV9NQVNURVIoaGFkYy0+SW5zdGFuY2UpID09CisgICAgICAgICAgICAgaGFkYy0+SW5zdGFuY2UpIHx8CisgICAgICAgICAgICAodG1wX211bHRpbW9kZV9jb25maWcgPT0gTExfQURDX01VTFRJX0lOREVQRU5ERU5UKSkgeworICAgICAgICAgIENMRUFSX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9NVUxUSU1PREVfU0xBVkUpOworICAgICAgICB9CisjZW5kaWYgLyogQURDX01VTFRJTU9ERV9TVVBQT1JUICovCisKKyAgICAgICAgLyogQ2hlY2sgaWYgYSBjb252ZXJzaW9uIGlzIG9uIGdvaW5nIG9uIEFEQyBncm91cCBpbmplY3RlZCAqLworICAgICAgICBpZiAoKGhhZGMtPlN0YXRlICYgSEFMX0FEQ19TVEFURV9JTkpfQlVTWSkgIT0gMFVMKSB7CisgICAgICAgICAgLyogUmVzZXQgQURDIGVycm9yIGNvZGUgZmllbGRzIHJlbGF0ZWQgdG8gcmVndWxhciBjb252ZXJzaW9ucyBvbmx5ICovCisgICAgICAgICAgQ0xFQVJfQklUKGhhZGMtPkVycm9yQ29kZSwgKEhBTF9BRENfRVJST1JfT1ZSIHwgSEFMX0FEQ19FUlJPUl9ETUEpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvKiBSZXNldCBhbGwgQURDIGVycm9yIGNvZGUgZmllbGRzICovCisgICAgICAgICAgQURDX0NMRUFSX0VSUk9SQ09ERShoYWRjKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFNldCB0aGUgRE1BIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgICAgIGhhZGMtPkRNQV9IYW5kbGUtPlhmZXJDcGx0Q2FsbGJhY2sgPSBBRENfRE1BQ29udkNwbHQ7CisKKyAgICAgICAgLyogU2V0IHRoZSBETUEgaGFsZiB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgICAgICBoYWRjLT5ETUFfSGFuZGxlLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IEFEQ19ETUFIYWxmQ29udkNwbHQ7CisKKyAgICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgICAgaGFkYy0+RE1BX0hhbmRsZS0+WGZlckVycm9yQ2FsbGJhY2sgPSBBRENfRE1BRXJyb3I7CisKKyAgICAgICAgLyogTWFuYWdlIEFEQyBhbmQgRE1BIHN0YXJ0OiBBREMgb3ZlcnJ1biBpbnRlcnJ1cHRpb24sIERNQSBzdGFydCwgICAgICovCisgICAgICAgIC8qIEFEQyBzdGFydCAoaW4gY2FzZSBvZiBTVyBzdGFydCk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgICAgIC8qIENsZWFyIHJlZ3VsYXIgZ3JvdXAgY29udmVyc2lvbiBmbGFnIGFuZCBvdmVycnVuIGZsYWcgICAgICAgICAgICAgICAqLworICAgICAgICAvKiAoVG8gZW5zdXJlIG9mIG5vIHVua25vd24gc3RhdGUgZnJvbSBwb3RlbnRpYWwgcHJldmlvdXMgQURDICAgICAgICAgKi8KKyAgICAgICAgLyogb3BlcmF0aW9ucykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIF9fSEFMX0FEQ19DTEVBUl9GTEFHKGhhZGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBRENfRkxBR19FT0MgfCBBRENfRkxBR19FT1MgfCBBRENfRkxBR19PVlIpKTsKKworICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICAgIC8qIFVubG9jayBiZWZvcmUgc3RhcnRpbmcgQURDIGNvbnZlcnNpb25zOiBpbiBjYXNlIG9mIHBvdGVudGlhbCAqLworICAgICAgICAvKiBpbnRlcnJ1cHRpb24sIHRvIGxldCB0aGUgcHJvY2VzcyB0byBBREMgSVJRIEhhbmRsZXIuICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoYWRjKTsKKworICAgICAgICAvKiBXaXRoIERNQSwgb3ZlcnJ1biBldmVudCBpcyBhbHdheXMgY29uc2lkZXJlZCBhcyBhbiBlcnJvciBldmVuIGlmCisgICAgICAgICAgIGhhZGMtPkluaXQuT3ZlcnJ1biBpcyBzZXQgdG8gQURDX09WUl9EQVRBX09WRVJXUklUVEVOLiBUaGVyZWZvcmUsCisgICAgICAgICAgIEFEQ19JVF9PVlIgaXMgZW5hYmxlZC4gKi8KKyAgICAgICAgX19IQUxfQURDX0VOQUJMRV9JVChoYWRjLCBBRENfSVRfT1ZSKTsKKworICAgICAgICAvKiBFbmFibGUgQURDIERNQSBtb2RlICovCisgICAgICAgIFNFVF9CSVQoaGFkYy0+SW5zdGFuY2UtPkNGR1IsIEFEQ19DRkdSX0RNQUVOKTsKKworICAgICAgICAvKiBTdGFydCB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgICAgdG1wX2hhbF9zdGF0dXMgPQorICAgICAgICAgICAgSEFMX0RNQV9TdGFydF9JVChoYWRjLT5ETUFfSGFuZGxlLCAodWludDMyX3QpJmhhZGMtPkluc3RhbmNlLT5EUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KXBEYXRhLCBMZW5ndGgpOworCisgICAgICAgIC8qIEVuYWJsZSBjb252ZXJzaW9uIG9mIHJlZ3VsYXIgZ3JvdXAuICovCisgICAgICAgIC8qIElmIHNvZnR3YXJlIHN0YXJ0IGhhcyBiZWVuIHNlbGVjdGVkLCBjb252ZXJzaW9uIHN0YXJ0cyBpbW1lZGlhdGVseS4KKyAgICAgICAgICovCisgICAgICAgIC8qIElmIGV4dGVybmFsIHRyaWdnZXIgaGFzIGJlZW4gc2VsZWN0ZWQsIGNvbnZlcnNpb24gd2lsbCBzdGFydCBhdCBuZXh0CisgICAgICAgICAqLworICAgICAgICAvKiB0cmlnZ2VyIGV2ZW50LiAqLworICAgICAgICAvKiBTdGFydCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uICovCisgICAgICAgIExMX0FEQ19SRUdfU3RhcnRDb252ZXJzaW9uKGhhZGMtPkluc3RhbmNlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhhZGMpOworICAgICAgfQorCisgICAgfQorI2lmIGRlZmluZWQoQURDX01VTFRJTU9ERV9TVVBQT1JUKQorICAgIGVsc2UgeworICAgICAgdG1wX2hhbF9zdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGFkYyk7CisgICAgfQorI2VuZGlmIC8qIEFEQ19NVUxUSU1PREVfU1VQUE9SVCAqLworICB9IGVsc2UgeworICAgIHRtcF9oYWxfc3RhdHVzID0gSEFMX0JVU1k7CisgIH0KKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiB0bXBfaGFsX3N0YXR1czsKK30KKworLyoqCisgKiBAYnJpZWYgIFN0b3AgQURDIGNvbnZlcnNpb24gb2YgcmVndWxhciBncm91cCAoYW5kIGluamVjdGVkIGdyb3VwIGluCisgKiAgICAgICAgIGNhc2Ugb2YgYXV0b19pbmplY3Rpb24gbW9kZSksIGRpc2FibGUgQURDIERNQSB0cmFuc2ZlciwgZGlzYWJsZQorICogICAgICAgICBBREMgcGVyaXBoZXJhbC4KKyAqIEBub3RlOiAgQURDIHBlcmlwaGVyYWwgZGlzYWJsZSBpcyBmb3JjaW5nIHN0b3Agb2YgcG90ZW50aWFsCisgKiAgICAgICAgIGNvbnZlcnNpb24gb24gQURDIGdyb3VwIGluamVjdGVkLiBJZiBBREMgZ3JvdXAgaW5qZWN0ZWQgaXMgdW5kZXIgdXNlLAorICogaXQgc2hvdWxkIGJlIHByZWxpbWluYXJpbHkgc3RvcHBlZCB1c2luZyBIQUxfQURDRXhfSW5qZWN0ZWRTdG9wIGZ1bmN0aW9uLgorICogQG5vdGUgICBDYXNlIG9mIG11bHRpbW9kZSBlbmFibGVkICh3aGVuIG11bHRpbW9kZSBmZWF0dXJlIGlzIGF2YWlsYWJsZSk6CisgKiAgICAgICAgIEhBTF9BRENfU3RvcF9ETUEoKSBmdW5jdGlvbiBpcyBkZWRpY2F0ZWQgdG8gc2luZ2xlLUFEQyBtb2RlIG9ubHkuCisgKiAgICAgICAgIEZvciBtdWx0aW1vZGUsIHRoZSBkZWRpY2F0ZWQgSEFMX0FEQ0V4X011bHRpTW9kZVN0b3BfRE1BKCkgQVBJIG11c3QKKyAqIGJlIHVzZWQuCisgKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMuCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfU3RvcF9ETUEoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpIHsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgdG1wX2hhbF9zdGF0dXM7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhhZGMpOworCisgIC8qIDEuIFN0b3AgcG90ZW50aWFsIEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gb24gZ29pbmcgKi8KKyAgdG1wX2hhbF9zdGF0dXMgPSBBRENfQ29udmVyc2lvblN0b3AoaGFkYywgQURDX1JFR1VMQVJfSU5KRUNURURfR1JPVVApOworCisgIC8qIERpc2FibGUgQURDIHBlcmlwaGVyYWwgaWYgY29udmVyc2lvbnMgYXJlIGVmZmVjdGl2ZWx5IHN0b3BwZWQgKi8KKyAgaWYgKHRtcF9oYWxfc3RhdHVzID09IEhBTF9PSykgeworICAgIC8qIERpc2FibGUgQURDIERNQSAoQURDIERNQSBjb25maWd1cmF0aW9uIG9mIGNvbnRpbnVvdXMgcmVxdWVzdHMgaXMga2VwdCkgKi8KKyAgICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPkNGR1IsIEFEQ19DRkdSX0RNQUVOKTsKKworICAgIC8qIERpc2FibGUgdGhlIERNQSBjaGFubmVsIChpbiBjYXNlIG9mIERNQSBpbiBjaXJjdWxhciBtb2RlIG9yIHN0b3AgICAgICAgKi8KKyAgICAvKiB3aGlsZSBETUEgdHJhbnNmZXIgaXMgb24gZ29pbmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYgKGhhZGMtPkRNQV9IYW5kbGUtPlN0YXRlID09IEhBTF9ETUFfU1RBVEVfQlVTWSkgeworICAgICAgdG1wX2hhbF9zdGF0dXMgPSBIQUxfRE1BX0Fib3J0KGhhZGMtPkRNQV9IYW5kbGUpOworCisgICAgICAvKiBDaGVjayBpZiBETUEgY2hhbm5lbCBlZmZlY3RpdmVseSBkaXNhYmxlZCAqLworICAgICAgaWYgKHRtcF9oYWxfc3RhdHVzICE9IEhBTF9PSykgeworICAgICAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gZXJyb3IgKi8KKyAgICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9ETUEpOworICAgICAgfQorICAgIH0KKworICAgIC8qIERpc2FibGUgQURDIG92ZXJydW4gaW50ZXJydXB0ICovCisgICAgX19IQUxfQURDX0RJU0FCTEVfSVQoaGFkYywgQURDX0lUX09WUik7CisKKyAgICAvKiAyLiBEaXNhYmxlIHRoZSBBREMgcGVyaXBoZXJhbCAqLworICAgIC8qIFVwZGF0ZSAidG1wX2hhbF9zdGF0dXMiIG9ubHkgaWYgRE1BIGNoYW5uZWwgZGlzYWJsaW5nIHBhc3NlZCwgICAgICAgICAgKi8KKyAgICAvKiB0byBrZWVwIGluIG1lbW9yeSBhIHBvdGVudGlhbCBmYWlsaW5nIHN0YXR1cy4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYgKHRtcF9oYWxfc3RhdHVzID09IEhBTF9PSykgeworICAgICAgdG1wX2hhbF9zdGF0dXMgPSBBRENfRGlzYWJsZShoYWRjKTsKKyAgICB9IGVsc2UgeworICAgICAgKHZvaWQpQURDX0Rpc2FibGUoaGFkYyk7CisgICAgfQorCisgICAgLyogQ2hlY2sgaWYgQURDIGlzIGVmZmVjdGl2ZWx5IGRpc2FibGVkICovCisgICAgaWYgKHRtcF9oYWxfc3RhdHVzID09IEhBTF9PSykgeworICAgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgICAgQURDX1NUQVRFX0NMUl9TRVQoaGFkYy0+U3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFR19CVVNZIHwgSEFMX0FEQ19TVEFURV9JTkpfQlVTWSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVBRFkpOworICAgIH0KKyAgfQorCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhhZGMpOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHRtcF9oYWxfc3RhdHVzOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IEFEQyByZWd1bGFyIGdyb3VwIGNvbnZlcnNpb24gcmVzdWx0LgorICogQG5vdGUgICBSZWFkaW5nIHJlZ2lzdGVyIERSIGF1dG9tYXRpY2FsbHkgY2xlYXJzIEFEQyBmbGFnIEVPQworICogICAgICAgICAoQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHVuaXRhcnkgY29udmVyc2lvbikuCisgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgY2xlYXIgQURDIGZsYWcgRU9TCisgKiAgICAgICAgIChBREMgZ3JvdXAgcmVndWxhciBlbmQgb2Ygc2VxdWVuY2UgY29udmVyc2lvbikuCisgKiAgICAgICAgIE9jY3VycmVuY2Ugb2YgZmxhZyBFT1MgcmlzaW5nOgorICogICAgICAgICAgLSBJZiBzZXF1ZW5jZXIgaXMgY29tcG9zZWQgb2YgMSByYW5rLCBmbGFnIEVPUyBpcyBlcXVpdmFsZW50CisgKiAgICAgICAgICAgIHRvIGZsYWcgRU9DLgorICogICAgICAgICAgLSBJZiBzZXF1ZW5jZXIgaXMgY29tcG9zZWQgb2Ygc2V2ZXJhbCByYW5rcywgZHVyaW5nIHRoZSBzY2FuCisgKiAgICAgICAgICAgIHNlcXVlbmNlIGZsYWcgRU9DIG9ubHkgaXMgcmFpc2VkLCBhdCB0aGUgZW5kIG9mIHRoZSBzY2FuIHNlcXVlbmNlCisgKiAgICAgICAgICAgIGJvdGggZmxhZ3MgRU9DIGFuZCBFT1MgYXJlIHJhaXNlZC4KKyAqICAgICAgICAgVG8gY2xlYXIgdGhpcyBmbGFnLCBlaXRoZXIgdXNlIGZ1bmN0aW9uOgorICogICAgICAgICBpbiBwcm9ncmFtbWluZyBtb2RlbCBJVDogQHJlZiBIQUxfQURDX0lSUUhhbmRsZXIoKSwgaW4gcHJvZ3JhbW1pbmcKKyAqICAgICAgICAgbW9kZWwgcG9sbGluZzogQHJlZiBIQUxfQURDX1BvbGxGb3JDb252ZXJzaW9uKCkKKyAqICAgICAgICAgb3IgQHJlZiBfX0hBTF9BRENfQ0xFQVJfRkxBRygmaGFkYywgQURDX0ZMQUdfRU9TKS4KKyAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUKKyAqIEByZXR2YWwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBkYXRhCisgKi8KK3VpbnQzMl90IEhBTF9BRENfR2V0VmFsdWUoY29uc3QgQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpIHsKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKworICAvKiBOb3RlOiBFT0MgZmxhZyBpcyBub3QgY2xlYXJlZCBoZXJlIGJ5IHNvZnR3YXJlIGJlY2F1c2UgYXV0b21hdGljYWxseSAgICAgKi8KKyAgLyogICAgICAgY2xlYXJlZCBieSBoYXJkd2FyZSB3aGVuIHJlYWRpbmcgcmVnaXN0ZXIgRFIuICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgLyogUmV0dXJuIEFEQyBjb252ZXJ0ZWQgdmFsdWUgKi8KKyAgcmV0dXJuIGhhZGMtPkluc3RhbmNlLT5EUjsKK30KKworLyoqCisgKiBAYnJpZWYgIFN0YXJ0IEFEQyBjb252ZXJzaW9uIHNhbXBsaW5nIHBoYXNlIG9mIHJlZ3VsYXIgZ3JvdXAKKyAqIEBub3RlOiAgVGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSBjYWxsZWQgdG8gc3RhcnQgc2FtcGxpbmcgd2hlbgorICogICAgICAgICAtIEByZWYgQURDX1NBTVBMSU5HX01PREVfVFJJR0dFUl9DT05UUk9MRUQgc2FtcGxpbmcKKyAqICAgICAgICAgbW9kZSBoYXMgYmVlbiBzZWxlY3RlZAorICogICAgICAgICAtIEByZWYgQURDX1NPRlRXQVJFX1NUQVJUIGhhcyBiZWVuIHNlbGVjdGVkIGFzIHRyaWdnZXIgc291cmNlCisgKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMuCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfU3RhcnRTYW1wbGluZyhBRENfSGFuZGxlVHlwZURlZiAqaGFkYykgeworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworCisgIC8qIFN0YXJ0IHNhbXBsaW5nICovCisgIFNFVF9CSVQoaGFkYy0+SW5zdGFuY2UtPkNGR1IyLCBBRENfQ0ZHUjJfU1dUUklHKTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICogQGJyaWVmICBTdG9wIEFEQyBjb252ZXJzaW9uIHNhbXBsaW5nIHBoYXNlIG9mIHJlZ3VsYXIgZ3JvdXAgYW5kIHN0YXJ0CisgKiBjb252ZXJzaW9uCisgKiBAbm90ZTogIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHRvIHN0b3Agc2FtcGxpbmcgd2hlbgorICogICAgICAgICAtIEByZWYgQURDX1NBTVBMSU5HX01PREVfVFJJR0dFUl9DT05UUk9MRUQgc2FtcGxpbmcKKyAqICAgICAgICAgbW9kZSBoYXMgYmVlbiBzZWxlY3RlZAorICogICAgICAgICAtIEByZWYgQURDX1NPRlRXQVJFX1NUQVJUIGhhcyBiZWVuIHNlbGVjdGVkIGFzIHRyaWdnZXIgc291cmNlCisgKiAgICAgICAgIC0gYWZ0ZXIgc2FtcGxpbmcgaGFzIGJlZW4gc3RhcnRlZCB1c2luZyBAcmVmIEhBTF9BRENfU3RhcnRTYW1wbGluZy4KKyAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUKKyAqIEByZXR2YWwgSEFMIHN0YXR1cy4KKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ19TdG9wU2FtcGxpbmcoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpIHsKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKworICAvKiBTdGFydCBzYW1wbGluZyAqLworICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPkNGR1IyLCBBRENfQ0ZHUjJfU1dUUklHKTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICogQGJyaWVmICBIYW5kbGUgQURDIGludGVycnVwdCByZXF1ZXN0LgorICogQHBhcmFtIGhhZGMgQURDIGhhbmRsZQorICogQHJldHZhbCBOb25lCisgKi8KK3ZvaWQgSEFMX0FEQ19JUlFIYW5kbGVyKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKSB7CisgIHVpbnQzMl90IG92ZXJydW5fZXJyb3IgPQorICAgICAgMFVMOyAvKiBmbGFnIHNldCBpZiBvdmVycnVuIG9jY3VycmVuY2UgaGFzIHRvIGJlIGNvbnNpZGVyZWQgYXMgYW4gZXJyb3IgKi8KKyAgdWludDMyX3QgdG1wX2lzciA9IGhhZGMtPkluc3RhbmNlLT5JU1I7CisgIHVpbnQzMl90IHRtcF9pZXIgPSBoYWRjLT5JbnN0YW5jZS0+SUVSOworICB1aW50MzJfdCB0bXBfYWRjX2lual9pc190cmlnZ2VyX3NvdXJjZV9zd19zdGFydDsKKyAgdWludDMyX3QgdG1wX2FkY19yZWdfaXNfdHJpZ2dlcl9zb3VyY2Vfc3dfc3RhcnQ7CisgIHVpbnQzMl90IHRtcF9jZmdyOworI2lmIGRlZmluZWQoQURDX01VTFRJTU9ERV9TVVBQT1JUKQorICBjb25zdCBBRENfVHlwZURlZiAqdG1wQURDX01hc3RlcjsKKyAgdWludDMyX3QgdG1wX211bHRpbW9kZV9jb25maWcgPQorICAgICAgTExfQURDX0dldE11bHRpbW9kZShfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKyNlbmRpZiAvKiBBRENfTVVMVElNT0RFX1NVUFBPUlQgKi8KKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfQURDX0VPQ19TRUxFQ1RJT04oaGFkYy0+SW5pdC5FT0NTZWxlY3Rpb24pKTsKKworICAvKiA9PT09PT09PT09IENoZWNrIEVuZCBvZiBTYW1wbGluZyBmbGFnIGZvciBBREMgZ3JvdXAgcmVndWxhciA9PT09PT09PT09ICovCisgIGlmICgoKHRtcF9pc3IgJiBBRENfRkxBR19FT1NNUCkgPT0gQURDX0ZMQUdfRU9TTVApICYmCisgICAgICAoKHRtcF9pZXIgJiBBRENfSVRfRU9TTVApID09IEFEQ19JVF9FT1NNUCkpIHsKKyAgICAvKiBVcGRhdGUgc3RhdGUgbWFjaGluZSBvbiBlbmQgb2Ygc2FtcGxpbmcgc3RhdHVzIGlmIG5vdCBpbiBlcnJvciBzdGF0ZSAqLworICAgIGlmICgoaGFkYy0+U3RhdGUgJiBIQUxfQURDX1NUQVRFX0VSUk9SX0lOVEVSTkFMKSA9PSAwVUwpIHsKKyAgICAgIC8qIFNldCBBREMgc3RhdGUgKi8KKyAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfUkVHX0VPU01QKTsKKyAgICB9CisKKyAgICAvKiBFbmQgT2YgU2FtcGxpbmcgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgaGFkYy0+RW5kT2ZTYW1wbGluZ0NhbGxiYWNrKGhhZGMpOworI2Vsc2UKKyAgICBIQUxfQURDRXhfRW5kT2ZTYW1wbGluZ0NhbGxiYWNrKGhhZGMpOworI2VuZGlmIC8qIFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisgICAgLyogQ2xlYXIgcmVndWxhciBncm91cCBjb252ZXJzaW9uIGZsYWcgKi8KKyAgICBfX0hBTF9BRENfQ0xFQVJfRkxBRyhoYWRjLCBBRENfRkxBR19FT1NNUCk7CisgIH0KKworICAvKiA9PT09PT0gQ2hlY2sgQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHVuaXRhcnkgY29udmVyc2lvbiBzZXF1ZW5jZQorICAgKiBjb252ZXJzaW9ucyA9PT09PSAqLworICBpZiAoKCgodG1wX2lzciAmIEFEQ19GTEFHX0VPQykgPT0gQURDX0ZMQUdfRU9DKSAmJgorICAgICAgICgodG1wX2llciAmIEFEQ19JVF9FT0MpID09IEFEQ19JVF9FT0MpKSB8fAorICAgICAgKCgodG1wX2lzciAmIEFEQ19GTEFHX0VPUykgPT0gQURDX0ZMQUdfRU9TKSAmJgorICAgICAgICgodG1wX2llciAmIEFEQ19JVF9FT1MpID09IEFEQ19JVF9FT1MpKSkgeworICAgIC8qIFVwZGF0ZSBzdGF0ZSBtYWNoaW5lIG9uIGNvbnZlcnNpb24gc3RhdHVzIGlmIG5vdCBpbiBlcnJvciBzdGF0ZSAqLworICAgIGlmICgoaGFkYy0+U3RhdGUgJiBIQUxfQURDX1NUQVRFX0VSUk9SX0lOVEVSTkFMKSA9PSAwVUwpIHsKKyAgICAgIC8qIFNldCBBREMgc3RhdGUgKi8KKyAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfUkVHX0VPQyk7CisgICAgfQorCisgICAgLyogRGV0ZXJtaW5lIHdoZXRoZXIgYW55IGZ1cnRoZXIgY29udmVyc2lvbiB1cGNvbWluZyBvbiBncm91cCByZWd1bGFyICAgICAqLworICAgIC8qIGJ5IGV4dGVybmFsIHRyaWdnZXIsIGNvbnRpbnVvdXMgbW9kZSBvciBzY2FuIHNlcXVlbmNlIG9uIGdvaW5nICAgICAgICAgKi8KKyAgICAvKiB0byBkaXNhYmxlIGludGVycnVwdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYgKExMX0FEQ19SRUdfSXNUcmlnZ2VyU291cmNlU1dTdGFydChoYWRjLT5JbnN0YW5jZSkgIT0gMFVMKSB7CisgICAgICAvKiBHZXQgcmVsZXZhbnQgcmVnaXN0ZXIgQ0ZHUiBpbiBBREMgaW5zdGFuY2Ugb2YgQURDIG1hc3RlciBvciBzbGF2ZSAgICAqLworICAgICAgLyogaW4gZnVuY3Rpb24gb2YgbXVsdGltb2RlIHN0YXRlIChmb3IgZGV2aWNlcyB3aXRoIG11bHRpbW9kZSAgICAgICAgICAgKi8KKyAgICAgIC8qIGF2YWlsYWJsZSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjaWYgZGVmaW5lZChBRENfTVVMVElNT0RFX1NVUFBPUlQpCisgICAgICBpZiAoKF9fTExfQURDX01VTFRJX0lOU1RBTkNFX01BU1RFUihoYWRjLT5JbnN0YW5jZSkgPT0gaGFkYy0+SW5zdGFuY2UpIHx8CisgICAgICAgICAgKHRtcF9tdWx0aW1vZGVfY29uZmlnID09IExMX0FEQ19NVUxUSV9JTkRFUEVOREVOVCkgfHwKKyAgICAgICAgICAodG1wX211bHRpbW9kZV9jb25maWcgPT0gTExfQURDX01VTFRJX0RVQUxfSU5KX1NJTVVMVCkgfHwKKyAgICAgICAgICAodG1wX211bHRpbW9kZV9jb25maWcgPT0gTExfQURDX01VTFRJX0RVQUxfSU5KX0FMVEVSTikpIHsKKyAgICAgICAgLyogY2hlY2sgQ09OVCBiaXQgZGlyZWN0bHkgaW4gaGFuZGxlIEFEQyBDRkdSIHJlZ2lzdGVyICovCisgICAgICAgIHRtcF9jZmdyID0gUkVBRF9SRUcoaGFkYy0+SW5zdGFuY2UtPkNGR1IpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogZWxzZSBuZWVkIHRvIGNoZWNrIE1hc3RlciBBREMgQ09OVCBiaXQgKi8KKyAgICAgICAgdG1wQURDX01hc3RlciA9IF9fTExfQURDX01VTFRJX0lOU1RBTkNFX01BU1RFUihoYWRjLT5JbnN0YW5jZSk7CisgICAgICAgIHRtcF9jZmdyID0gUkVBRF9SRUcodG1wQURDX01hc3Rlci0+Q0ZHUik7CisgICAgICB9CisjZWxzZQorICAgICAgdG1wX2NmZ3IgPSBSRUFEX1JFRyhoYWRjLT5JbnN0YW5jZS0+Q0ZHUik7CisjZW5kaWYgLyogQURDX01VTFRJTU9ERV9TVVBQT1JUICovCisKKyAgICAgIC8qIENhcnJ5IG9uIGlmIGNvbnRpbnVvdXMgbW9kZSBpcyBkaXNhYmxlZCAqLworICAgICAgaWYgKFJFQURfQklUKHRtcF9jZmdyLCBBRENfQ0ZHUl9DT05UKSAhPSBBRENfQ0ZHUl9DT05UKSB7CisgICAgICAgIC8qIElmIEVuZCBvZiBTZXF1ZW5jZSBpcyByZWFjaGVkLCBkaXNhYmxlIGludGVycnVwdHMgKi8KKyAgICAgICAgaWYgKF9fSEFMX0FEQ19HRVRfRkxBRyhoYWRjLCBBRENfRkxBR19FT1MpKSB7CisgICAgICAgICAgLyogQWxsb3dlZCB0byBtb2RpZnkgYml0cyBBRENfSVRfRU9DL0FEQ19JVF9FT1Mgb25seSBpZiBiaXQgICAgICAgICAqLworICAgICAgICAgIC8qIEFEU1RBUlQ9PTAgKG5vIGNvbnZlcnNpb24gb24gZ29pbmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICBpZiAoTExfQURDX1JFR19Jc0NvbnZlcnNpb25PbmdvaW5nKGhhZGMtPkluc3RhbmNlKSA9PSAwVUwpIHsKKyAgICAgICAgICAgIC8qIERpc2FibGUgQURDIGVuZCBvZiBzZXF1ZW5jZSBjb252ZXJzaW9uIGludGVycnVwdCAqLworICAgICAgICAgICAgLyogTm90ZTogT3ZlcnJ1biBpbnRlcnJ1cHQgd2FzIGVuYWJsZWQgd2l0aCBFT0MgaW50ZXJydXB0IGluICAgICAgKi8KKyAgICAgICAgICAgIC8qIEhBTF9TdGFydF9JVCgpLCBidXQgaXMgbm90IGRpc2FibGVkIGhlcmUgYmVjYXVzZSBjYW4gYmUgdXNlZCAgICovCisgICAgICAgICAgICAvKiBieSBvdmVycnVuIElSUSBwcm9jZXNzIGJlbG93LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgX19IQUxfQURDX0RJU0FCTEVfSVQoaGFkYywgQURDX0lUX0VPQyB8IEFEQ19JVF9FT1MpOworCisgICAgICAgICAgICAvKiBTZXQgQURDIHN0YXRlICovCisgICAgICAgICAgICBDTEVBUl9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfUkVHX0JVU1kpOworCisgICAgICAgICAgICBpZiAoKGhhZGMtPlN0YXRlICYgSEFMX0FEQ19TVEFURV9JTkpfQlVTWSkgPT0gMFVMKSB7CisgICAgICAgICAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfUkVBRFkpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBDaGFuZ2UgQURDIHN0YXRlIHRvIGVycm9yIHN0YXRlICovCisgICAgICAgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0VSUk9SX0lOVEVSTkFMKTsKKworICAgICAgICAgICAgLyogU2V0IEFEQyBlcnJvciBjb2RlIHRvIEFEQyBwZXJpcGhlcmFsIGludGVybmFsIGVycm9yICovCisgICAgICAgICAgICBTRVRfQklUKGhhZGMtPkVycm9yQ29kZSwgSEFMX0FEQ19FUlJPUl9JTlRFUk5BTCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLyogQ29udmVyc2lvbiBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgIC8qIE5vdGU6IEludG8gY2FsbGJhY2sgZnVuY3Rpb24gIkhBTF9BRENfQ29udkNwbHRDYWxsYmFjaygpIiwgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAgICB0byBkZXRlcm1pbmUgaWYgY29udmVyc2lvbiBoYXMgYmVlbiB0cmlnZ2VyZWQgZnJvbSBFT0Mgb3IgRU9TLCAgICovCisgICAgLyogICAgICAgcG9zc2liaWxpdHkgdG8gdXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgICAgICAiIGlmICggX19IQUxfQURDX0dFVF9GTEFHKCZoYWRjLCBBRENfRkxBR19FT1MpKSAiICAgICAgICAgICAgICAgKi8KKyNpZiAoVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgaGFkYy0+Q29udkNwbHRDYWxsYmFjayhoYWRjKTsKKyNlbHNlCisgICAgSEFMX0FEQ19Db252Q3BsdENhbGxiYWNrKGhhZGMpOworI2VuZGlmIC8qIFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisgICAgLyogQ2xlYXIgcmVndWxhciBncm91cCBjb252ZXJzaW9uIGZsYWcgKi8KKyAgICAvKiBOb3RlOiBpbiBjYXNlIG9mIG92ZXJydW4gc2V0IHRvIEFEQ19PVlJfREFUQV9QUkVTRVJWRUQsIGVuZCBvZiAgICAgICAgICovCisgICAgLyogICAgICAgY29udmVyc2lvbiBmbGFncyBjbGVhciBpbmR1Y2VzIHRoZSByZWxlYXNlIG9mIHRoZSBwcmVzZXJ2ZWQgZGF0YS4qLworICAgIC8qICAgICAgIFRoZXJlZm9yZSwgaWYgdGhlIHByZXNlcnZlZCBkYXRhIHZhbHVlIGlzIG5lZWRlZCwgaXQgbXVzdCBiZSAgICAgKi8KKyAgICAvKiAgICAgICByZWFkIHByZWxpbWluYXJpbHkgaW50byBIQUxfQURDX0NvbnZDcGx0Q2FsbGJhY2soKS4gICAgICAgICAgICAgICovCisgICAgX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgKEFEQ19GTEFHX0VPQyB8IEFEQ19GTEFHX0VPUykpOworICB9CisKKyAgLyogPT09PT09IENoZWNrIEFEQyBncm91cCBpbmplY3RlZCBlbmQgb2YgdW5pdGFyeSBjb252ZXJzaW9uIHNlcXVlbmNlCisgICAqIGNvbnZlcnNpb25zID09PT09ICovCisgIGlmICgoKCh0bXBfaXNyICYgQURDX0ZMQUdfSkVPQykgPT0gQURDX0ZMQUdfSkVPQykgJiYKKyAgICAgICAoKHRtcF9pZXIgJiBBRENfSVRfSkVPQykgPT0gQURDX0lUX0pFT0MpKSB8fAorICAgICAgKCgodG1wX2lzciAmIEFEQ19GTEFHX0pFT1MpID09IEFEQ19GTEFHX0pFT1MpICYmCisgICAgICAgKCh0bXBfaWVyICYgQURDX0lUX0pFT1MpID09IEFEQ19JVF9KRU9TKSkpIHsKKyAgICAvKiBVcGRhdGUgc3RhdGUgbWFjaGluZSBvbiBjb252ZXJzaW9uIHN0YXR1cyBpZiBub3QgaW4gZXJyb3Igc3RhdGUgKi8KKyAgICBpZiAoKGhhZGMtPlN0YXRlICYgSEFMX0FEQ19TVEFURV9FUlJPUl9JTlRFUk5BTCkgPT0gMFVMKSB7CisgICAgICAvKiBTZXQgQURDIHN0YXRlICovCisgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0lOSl9FT0MpOworICAgIH0KKworICAgIC8qIFJldHJpZXZlIEFEQyBjb25maWd1cmF0aW9uICovCisgICAgdG1wX2FkY19pbmpfaXNfdHJpZ2dlcl9zb3VyY2Vfc3dfc3RhcnQgPQorICAgICAgICBMTF9BRENfSU5KX0lzVHJpZ2dlclNvdXJjZVNXU3RhcnQoaGFkYy0+SW5zdGFuY2UpOworICAgIHRtcF9hZGNfcmVnX2lzX3RyaWdnZXJfc291cmNlX3N3X3N0YXJ0ID0KKyAgICAgICAgTExfQURDX1JFR19Jc1RyaWdnZXJTb3VyY2VTV1N0YXJ0KGhhZGMtPkluc3RhbmNlKTsKKyAgICAvKiBHZXQgcmVsZXZhbnQgcmVnaXN0ZXIgQ0ZHUiBpbiBBREMgaW5zdGFuY2Ugb2YgQURDIG1hc3RlciBvciBzbGF2ZSAgKi8KKyAgICAvKiBpbiBmdW5jdGlvbiBvZiBtdWx0aW1vZGUgc3RhdGUgKGZvciBkZXZpY2VzIHdpdGggbXVsdGltb2RlICAgICAgICAgKi8KKyAgICAvKiBhdmFpbGFibGUpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNpZiBkZWZpbmVkKEFEQ19NVUxUSU1PREVfU1VQUE9SVCkKKyAgICBpZiAoKF9fTExfQURDX01VTFRJX0lOU1RBTkNFX01BU1RFUihoYWRjLT5JbnN0YW5jZSkgPT0gaGFkYy0+SW5zdGFuY2UpIHx8CisgICAgICAgICh0bXBfbXVsdGltb2RlX2NvbmZpZyA9PSBMTF9BRENfTVVMVElfSU5ERVBFTkRFTlQpIHx8CisgICAgICAgICh0bXBfbXVsdGltb2RlX2NvbmZpZyA9PSBMTF9BRENfTVVMVElfRFVBTF9SRUdfU0lNVUxUKSB8fAorICAgICAgICAodG1wX211bHRpbW9kZV9jb25maWcgPT0gTExfQURDX01VTFRJX0RVQUxfUkVHX0lOVEVSTCkpIHsKKyAgICAgIHRtcF9jZmdyID0gUkVBRF9SRUcoaGFkYy0+SW5zdGFuY2UtPkNGR1IpOworICAgIH0gZWxzZSB7CisgICAgICB0bXBBRENfTWFzdGVyID0gX19MTF9BRENfTVVMVElfSU5TVEFOQ0VfTUFTVEVSKGhhZGMtPkluc3RhbmNlKTsKKyAgICAgIHRtcF9jZmdyID0gUkVBRF9SRUcodG1wQURDX01hc3Rlci0+Q0ZHUik7CisgICAgfQorI2Vsc2UKKyAgICB0bXBfY2ZnciA9IFJFQURfUkVHKGhhZGMtPkluc3RhbmNlLT5DRkdSKTsKKyNlbmRpZiAvKiBBRENfTVVMVElNT0RFX1NVUFBPUlQgKi8KKworICAgIC8qIERpc2FibGUgaW50ZXJydXB0aW9uIGlmIG5vIGZ1cnRoZXIgY29udmVyc2lvbiB1cGNvbWluZyBieSBpbmplY3RlZCAgICAgKi8KKyAgICAvKiBleHRlcm5hbCB0cmlnZ2VyIG9yIGJ5IGF1dG9tYXRpYyBpbmplY3RlZCBjb252ZXJzaW9uIHdpdGggcmVndWxhciAgICAgICovCisgICAgLyogZ3JvdXAgaGF2aW5nIG5vIGZ1cnRoZXIgY29udmVyc2lvbiB1cGNvbWluZyAoc2FtZSBjb25kaXRpb25zIGFzICAgICAgICAqLworICAgIC8qIHJlZ3VsYXIgZ3JvdXAgaW50ZXJydXB0aW9uIGRpc2FibGluZyBhYm92ZSksICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBhbmQgaWYgaW5qZWN0ZWQgc2NhbiBzZXF1ZW5jZSBpcyBjb21wbGV0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYgKHRtcF9hZGNfaW5qX2lzX3RyaWdnZXJfc291cmNlX3N3X3N0YXJ0ICE9IDBVTCkgeworICAgICAgaWYgKChSRUFEX0JJVCh0bXBfY2ZnciwgQURDX0NGR1JfSkFVVE8pID09IDBVTCkgfHwKKyAgICAgICAgICAoKHRtcF9hZGNfcmVnX2lzX3RyaWdnZXJfc291cmNlX3N3X3N0YXJ0ICE9IDBVTCkgJiYKKyAgICAgICAgICAgKFJFQURfQklUKHRtcF9jZmdyLCBBRENfQ0ZHUl9DT05UKSA9PSAwVUwpKSkgeworICAgICAgICAvKiBJZiBFbmQgb2YgU2VxdWVuY2UgaXMgcmVhY2hlZCwgZGlzYWJsZSBpbnRlcnJ1cHRzICovCisgICAgICAgIGlmIChfX0hBTF9BRENfR0VUX0ZMQUcoaGFkYywgQURDX0ZMQUdfSkVPUykpIHsKKyAgICAgICAgICAvKiBQYXJ0aWN1bGFyIGNhc2UgaWYgaW5qZWN0ZWQgY29udGV4dHMgcXVldWUgaXMgZW5hYmxlZDogKi8KKyAgICAgICAgICAvKiB3aGVuIHRoZSBsYXN0IGNvbnRleHQgaGFzIGJlZW4gZnVsbHkgcHJvY2Vzc2VkLCBKU1FSIGlzIHJlc2V0ICovCisgICAgICAgICAgLyogYnkgdGhlIGhhcmR3YXJlLiBFdmVuIGlmIG5vIGluamVjdGVkIGNvbnZlcnNpb24gaXMgcGxhbm5lZCB0byBjb21lCisgICAgICAgICAgICovCisgICAgICAgICAgLyogKHF1ZXVlIGVtcHR5LCB0cmlnZ2VycyBhcmUgaWdub3JlZCksIGl0IGNhbiBzdGFydCBhZ2FpbiAqLworICAgICAgICAgIC8qIGltbWVkaWF0ZWx5IGFmdGVyIHNldHRpbmcgYSBuZXcgY29udGV4dCAoSkFEU1RBUlQgaXMgc3RpbGwgc2V0KS4gKi8KKyAgICAgICAgICAvKiBUaGVyZWZvcmUsIHN0YXRlIG9mIEhBTCBBREMgaW5qZWN0ZWQgZ3JvdXAgaXMga2VwdCB0byBidXN5LiAqLworICAgICAgICAgIGlmIChSRUFEX0JJVCh0bXBfY2ZnciwgQURDX0NGR1JfSlFNKSA9PSAwVUwpIHsKKyAgICAgICAgICAgIC8qIEFsbG93ZWQgdG8gbW9kaWZ5IGJpdHMgQURDX0lUX0pFT0MvQURDX0lUX0pFT1Mgb25seSBpZiBiaXQgKi8KKyAgICAgICAgICAgIC8qIEpBRFNUQVJUPT0wIChubyBjb252ZXJzaW9uIG9uIGdvaW5nKSAqLworICAgICAgICAgICAgaWYgKExMX0FEQ19JTkpfSXNDb252ZXJzaW9uT25nb2luZyhoYWRjLT5JbnN0YW5jZSkgPT0gMFVMKSB7CisgICAgICAgICAgICAgIC8qIERpc2FibGUgQURDIGVuZCBvZiBzZXF1ZW5jZSBjb252ZXJzaW9uIGludGVycnVwdCAgKi8KKyAgICAgICAgICAgICAgX19IQUxfQURDX0RJU0FCTEVfSVQoaGFkYywgQURDX0lUX0pFT0MgfCBBRENfSVRfSkVPUyk7CisKKyAgICAgICAgICAgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgICAgICAgICAgICBDTEVBUl9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfSU5KX0JVU1kpOworCisgICAgICAgICAgICAgIGlmICgoaGFkYy0+U3RhdGUgJiBIQUxfQURDX1NUQVRFX1JFR19CVVNZKSA9PSAwVUwpIHsKKyAgICAgICAgICAgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX1JFQURZKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lIHRvIGVycm9yICovCisgICAgICAgICAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfRVJST1JfSU5URVJOQUwpOworCisgICAgICAgICAgICAgIC8qIFNldCBBREMgZXJyb3IgY29kZSB0byBBREMgcGVyaXBoZXJhbCBpbnRlcm5hbCBlcnJvciAqLworICAgICAgICAgICAgICBTRVRfQklUKGhhZGMtPkVycm9yQ29kZSwgSEFMX0FEQ19FUlJPUl9JTlRFUk5BTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLyogSW5qZWN0ZWQgQ29udmVyc2lvbiBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgIC8qIE5vdGU6ICBIQUxfQURDRXhfSW5qZWN0ZWRDb252Q3BsdENhbGxiYWNrIGNhbiByZXNvcnQgdG8KKyAgICAgICAgICAgICAgaWYgKF9fSEFMX0FEQ19HRVRfRkxBRygmaGFkYywgQURDX0ZMQUdfSkVPUykpIG9yCisgICAgICAgICAgICAgIGlmIChfX0hBTF9BRENfR0VUX0ZMQUcoJmhhZGMsIEFEQ19GTEFHX0pFT0MpKSB0byBkZXRlcm1pbmUgd2hldGhlcgorICAgICAgICAgICAgICBpbnRlcnJ1cHRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkIGJ5IGVuZCBvZiBjb252ZXJzaW9uIG9yIGVuZCBvZgorICAgICAgICAgICAgICBzZXF1ZW5jZS4gICAgKi8KKyNpZiAoVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgaGFkYy0+SW5qZWN0ZWRDb252Q3BsdENhbGxiYWNrKGhhZGMpOworI2Vsc2UKKyAgICBIQUxfQURDRXhfSW5qZWN0ZWRDb252Q3BsdENhbGxiYWNrKGhhZGMpOworI2VuZGlmIC8qIFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisgICAgLyogQ2xlYXIgaW5qZWN0ZWQgZ3JvdXAgY29udmVyc2lvbiBmbGFnICovCisgICAgX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgQURDX0ZMQUdfSkVPQyB8IEFEQ19GTEFHX0pFT1MpOworICB9CisKKyAgLyogPT09PT09PT09PSBDaGVjayBBbmFsb2cgd2F0Y2hkb2cgMSBmbGFnID09PT09PT09PT0gKi8KKyAgaWYgKCgodG1wX2lzciAmIEFEQ19GTEFHX0FXRDEpID09IEFEQ19GTEFHX0FXRDEpICYmCisgICAgICAoKHRtcF9pZXIgJiBBRENfSVRfQVdEMSkgPT0gQURDX0lUX0FXRDEpKSB7CisgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfQVdEMSk7CisKKyAgICAvKiBMZXZlbCBvdXQgb2Ygd2luZG93IDEgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgaGFkYy0+TGV2ZWxPdXRPZldpbmRvd0NhbGxiYWNrKGhhZGMpOworI2Vsc2UKKyAgICBIQUxfQURDX0xldmVsT3V0T2ZXaW5kb3dDYWxsYmFjayhoYWRjKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworICAgIC8qIENsZWFyIEFEQyBhbmFsb2cgd2F0Y2hkb2cgZmxhZyAqLworICAgIF9fSEFMX0FEQ19DTEVBUl9GTEFHKGhhZGMsIEFEQ19GTEFHX0FXRDEpOworICB9CisKKyAgLyogPT09PT09PT09PSBDaGVjayBhbmFsb2cgd2F0Y2hkb2cgMiBmbGFnID09PT09PT09PT0gKi8KKyAgaWYgKCgodG1wX2lzciAmIEFEQ19GTEFHX0FXRDIpID09IEFEQ19GTEFHX0FXRDIpICYmCisgICAgICAoKHRtcF9pZXIgJiBBRENfSVRfQVdEMikgPT0gQURDX0lUX0FXRDIpKSB7CisgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfQVdEMik7CisKKyAgICAvKiBMZXZlbCBvdXQgb2Ygd2luZG93IDIgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgaGFkYy0+TGV2ZWxPdXRPZldpbmRvdzJDYWxsYmFjayhoYWRjKTsKKyNlbHNlCisgICAgSEFMX0FEQ0V4X0xldmVsT3V0T2ZXaW5kb3cyQ2FsbGJhY2soaGFkYyk7CisjZW5kaWYgLyogVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKyAgICAvKiBDbGVhciBBREMgYW5hbG9nIHdhdGNoZG9nIGZsYWcgKi8KKyAgICBfX0hBTF9BRENfQ0xFQVJfRkxBRyhoYWRjLCBBRENfRkxBR19BV0QyKTsKKyAgfQorCisgIC8qID09PT09PT09PT0gQ2hlY2sgYW5hbG9nIHdhdGNoZG9nIDMgZmxhZyA9PT09PT09PT09ICovCisgIGlmICgoKHRtcF9pc3IgJiBBRENfRkxBR19BV0QzKSA9PSBBRENfRkxBR19BV0QzKSAmJgorICAgICAgKCh0bXBfaWVyICYgQURDX0lUX0FXRDMpID09IEFEQ19JVF9BV0QzKSkgeworICAgIC8qIFNldCBBREMgc3RhdGUgKi8KKyAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0FXRDMpOworCisgICAgLyogTGV2ZWwgb3V0IG9mIHdpbmRvdyAzIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIGhhZGMtPkxldmVsT3V0T2ZXaW5kb3czQ2FsbGJhY2soaGFkYyk7CisjZWxzZQorICAgIEhBTF9BRENFeF9MZXZlbE91dE9mV2luZG93M0NhbGxiYWNrKGhhZGMpOworI2VuZGlmIC8qIFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisgICAgLyogQ2xlYXIgQURDIGFuYWxvZyB3YXRjaGRvZyBmbGFnICovCisgICAgX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgQURDX0ZMQUdfQVdEMyk7CisgIH0KKworICAvKiA9PT09PT09PT09IENoZWNrIE92ZXJydW4gZmxhZyA9PT09PT09PT09ICovCisgIGlmICgoKHRtcF9pc3IgJiBBRENfRkxBR19PVlIpID09IEFEQ19GTEFHX09WUikgJiYKKyAgICAgICgodG1wX2llciAmIEFEQ19JVF9PVlIpID09IEFEQ19JVF9PVlIpKSB7CisgICAgLyogSWYgb3ZlcnJ1biBpcyBzZXQgdG8gb3ZlcndyaXRlIHByZXZpb3VzIGRhdGEgKGRlZmF1bHQgc2V0dGluZyksICAgICAgICAqLworICAgIC8qIG92ZXJydW4gZXZlbnQgaXMgbm90IGNvbnNpZGVyZWQgYXMgYW4gZXJyb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAoY2YgcmVmIG1hbnVhbCAiTWFuYWdpbmcgY29udmVyc2lvbnMgd2l0aG91dCB1c2luZyB0aGUgRE1BIGFuZCB3aXRob3V0ICovCisgICAgLyogb3ZlcnJ1biAiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIEV4Y2VwdGlvbiBmb3IgdXNhZ2Ugd2l0aCBETUEgb3ZlcnJ1biBldmVudCBhbHdheXMgY29uc2lkZXJlZCBhcyBhbiAgICAgKi8KKyAgICAvKiBlcnJvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYgKGhhZGMtPkluaXQuT3ZlcnJ1biA9PSBBRENfT1ZSX0RBVEFfUFJFU0VSVkVEKSB7CisgICAgICBvdmVycnVuX2Vycm9yID0gMVVMOworICAgIH0gZWxzZSB7CisgICAgICAvKiBDaGVjayBETUEgY29uZmlndXJhdGlvbiAqLworI2lmIGRlZmluZWQoQURDX01VTFRJTU9ERV9TVVBQT1JUKQorICAgICAgaWYgKHRtcF9tdWx0aW1vZGVfY29uZmlnICE9IExMX0FEQ19NVUxUSV9JTkRFUEVOREVOVCkgeworICAgICAgICAvKiBNdWx0aW1vZGUgKHdoZW4gZmVhdHVyZSBpcyBhdmFpbGFibGUpIGlzIGVuYWJsZWQsCisgICAgICAgICAgIENvbW1vbiBDb250cm9sIFJlZ2lzdGVyIE1ETUEgYml0cyBtdXN0IGJlIGNoZWNrZWQuICovCisgICAgICAgIGlmIChMTF9BRENfR2V0TXVsdGlETUFUcmFuc2ZlcihfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoCisgICAgICAgICAgICAgICAgaGFkYy0+SW5zdGFuY2UpKSAhPSBMTF9BRENfTVVMVElfUkVHX0RNQV9FQUNIX0FEQykgeworICAgICAgICAgIG92ZXJydW5fZXJyb3IgPSAxVUw7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZQorI2VuZGlmIC8qIEFEQ19NVUxUSU1PREVfU1VQUE9SVCAqLworICAgICAgeworICAgICAgICAvKiBNdWx0aW1vZGUgbm90IHNldCBvciBmZWF0dXJlIG5vdCBhdmFpbGFibGUgb3IgQURDIGluZGVwZW5kZW50ICovCisgICAgICAgIGlmICgoaGFkYy0+SW5zdGFuY2UtPkNGR1IgJiBBRENfQ0ZHUl9ETUFFTikgIT0gMFVMKSB7CisgICAgICAgICAgb3ZlcnJ1bl9lcnJvciA9IDFVTDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGlmIChvdmVycnVuX2Vycm9yID09IDFVTCkgeworICAgICAgLyogQ2hhbmdlIEFEQyBzdGF0ZSB0byBlcnJvciBzdGF0ZSAqLworICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9SRUdfT1ZSKTsKKworICAgICAgLyogU2V0IEFEQyBlcnJvciBjb2RlIHRvIG92ZXJydW4gKi8KKyAgICAgIFNFVF9CSVQoaGFkYy0+RXJyb3JDb2RlLCBIQUxfQURDX0VSUk9SX09WUik7CisKKyAgICAgIC8qIEVycm9yIGNhbGxiYWNrICovCisgICAgICAvKiBOb3RlOiBJbiBjYXNlIG9mIG92ZXJydW4sIEFEQyBjb252ZXJzaW9uIGRhdGEgaXMgcHJlc2VydmVkIHVudGlsICAgICAqLworICAgICAgLyogICAgICAgZmxhZyBPVlIgaXMgcmVzZXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIC8qICAgICAgIFRoZXJlZm9yZSwgb2xkIEFEQyBjb252ZXJzaW9uIGRhdGEgY2FuIGJlIHJldHJpZXZlZCBpbiAgICAgICAgICovCisgICAgICAvKiAgICAgICBmdW5jdGlvbiAiSEFMX0FEQ19FcnJvckNhbGxiYWNrKCkiLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2lmIChVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgIGhhZGMtPkVycm9yQ2FsbGJhY2soaGFkYyk7CisjZWxzZQorICAgICAgSEFMX0FEQ19FcnJvckNhbGxiYWNrKGhhZGMpOworI2VuZGlmIC8qIFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KKworICAgIC8qIENsZWFyIEFEQyBvdmVycnVuIGZsYWcgKi8KKyAgICBfX0hBTF9BRENfQ0xFQVJfRkxBRyhoYWRjLCBBRENfRkxBR19PVlIpOworICB9CisKKyAgLyogPT09PT09PT09PSBDaGVjayBJbmplY3RlZCBjb250ZXh0IHF1ZXVlIG92ZXJmbG93IGZsYWcgPT09PT09PT09PSAqLworICBpZiAoKCh0bXBfaXNyICYgQURDX0ZMQUdfSlFPVkYpID09IEFEQ19GTEFHX0pRT1ZGKSAmJgorICAgICAgKCh0bXBfaWVyICYgQURDX0lUX0pRT1ZGKSA9PSBBRENfSVRfSlFPVkYpKSB7CisgICAgLyogQ2hhbmdlIEFEQyBzdGF0ZSB0byBvdmVycnVuIHN0YXRlICovCisgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9JTkpfSlFPVkYpOworCisgICAgLyogU2V0IEFEQyBlcnJvciBjb2RlIHRvIEluamVjdGVkIGNvbnRleHQgcXVldWUgb3ZlcmZsb3cgKi8KKyAgICBTRVRfQklUKGhhZGMtPkVycm9yQ29kZSwgSEFMX0FEQ19FUlJPUl9KUU9WRik7CisKKyAgICAvKiBDbGVhciB0aGUgSW5qZWN0ZWQgY29udGV4dCBxdWV1ZSBvdmVyZmxvdyBmbGFnICovCisgICAgX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgQURDX0ZMQUdfSlFPVkYpOworCisgICAgLyogSW5qZWN0ZWQgY29udGV4dCBxdWV1ZSBvdmVyZmxvdyBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICBoYWRjLT5JbmplY3RlZFF1ZXVlT3ZlcmZsb3dDYWxsYmFjayhoYWRjKTsKKyNlbHNlCisgICAgSEFMX0FEQ0V4X0luamVjdGVkUXVldWVPdmVyZmxvd0NhbGxiYWNrKGhhZGMpOworI2VuZGlmIC8qIFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9Cit9CisKKy8qKgorICogQGJyaWVmICBDb252ZXJzaW9uIGNvbXBsZXRlIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlLgorICogQHBhcmFtIGhhZGMgQURDIGhhbmRsZQorICogQHJldHZhbCBOb25lCisgKi8KK19fd2VhayB2b2lkIEhBTF9BRENfQ29udkNwbHRDYWxsYmFjayhBRENfSGFuZGxlVHlwZURlZiAqaGFkYykgeworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoYWRjKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLiBXaGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICBmdW5jdGlvbiBIQUxfQURDX0NvbnZDcGx0Q2FsbGJhY2sgbXVzdCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlcgorICAgICBmaWxlLgorICAgKi8KK30KKworLyoqCisgKiBAYnJpZWYgIENvbnZlcnNpb24gRE1BIGhhbGYtdHJhbnNmZXIgY2FsbGJhY2sgaW4gbm9uLWJsb2NraW5nIG1vZGUuCisgKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX193ZWFrIHZvaWQgSEFMX0FEQ19Db252SGFsZkNwbHRDYWxsYmFjayhBRENfSGFuZGxlVHlwZURlZiAqaGFkYykgeworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoYWRjKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLiBXaGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICBmdW5jdGlvbiBIQUxfQURDX0NvbnZIYWxmQ3BsdENhbGxiYWNrIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gdGhlCisgICAgIHVzZXIgZmlsZS4KKyAgKi8KK30KKworLyoqCisgKiBAYnJpZWYgIEFuYWxvZyB3YXRjaGRvZyAxIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlLgorICogQHBhcmFtIGhhZGMgQURDIGhhbmRsZQorICogQHJldHZhbCBOb25lCisgKi8KK19fd2VhayB2b2lkIEhBTF9BRENfTGV2ZWxPdXRPZldpbmRvd0NhbGxiYWNrKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKSB7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhhZGMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQuIFdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIGZ1bmN0aW9uIEhBTF9BRENfTGV2ZWxPdXRPZldpbmRvd0NhbGxiYWNrIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gdGhlCisgICAgIHVzZXIgZmlsZS4KKyAgKi8KK30KKworLyoqCisgKiBAYnJpZWYgIEFEQyBlcnJvciBjYWxsYmFjayBpbiBub24tYmxvY2tpbmcgbW9kZQorICogICAgICAgICAoQURDIGNvbnZlcnNpb24gd2l0aCBpbnRlcnJ1cHRpb24gb3IgdHJhbnNmZXIgYnkgRE1BKS4KKyAqIEBub3RlICAgSW4gY2FzZSBvZiBlcnJvciBkdWUgdG8gb3ZlcnJ1biB3aGVuIHVzaW5nIEFEQyB3aXRoIERNQSB0cmFuc2ZlcgorICogICAgICAgICAoSEFMIEFEQyBoYW5kbGUgcGFyYW1ldGVyICJFcnJvckNvZGUiIHRvIHN0YXRlICJIQUxfQURDX0VSUk9SX09WUiIpOgorICogICAgICAgICAtIFJlaW5pdGlhbGl6ZSB0aGUgRE1BIHVzaW5nIGZ1bmN0aW9uICJIQUxfQURDX1N0b3BfRE1BKCkiLgorICogICAgICAgICAtIElmIG5lZWRlZCwgcmVzdGFydCBhIG5ldyBBREMgY29udmVyc2lvbiB1c2luZyBmdW5jdGlvbgorICogICAgICAgICAgICJIQUxfQURDX1N0YXJ0X0RNQSgpIgorICogICAgICAgICAgICh0aGlzIGZ1bmN0aW9uIGlzIGFsc28gY2xlYXJpbmcgb3ZlcnJ1biBmbGFnKQorICogQHBhcmFtIGhhZGMgQURDIGhhbmRsZQorICogQHJldHZhbCBOb25lCisgKi8KK19fd2VhayB2b2lkIEhBTF9BRENfRXJyb3JDYWxsYmFjayhBRENfSGFuZGxlVHlwZURlZiAqaGFkYykgeworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoYWRjKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLiBXaGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICBmdW5jdGlvbiBIQUxfQURDX0Vycm9yQ2FsbGJhY2sgbXVzdCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAqLworfQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBBRENfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgICogQGJyaWVmICAgIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBDb25maWd1cmUgY2hhbm5lbHMgb24gcmVndWxhciBncm91cAorICAgICAgKCspIENvbmZpZ3VyZSB0aGUgYW5hbG9nIHdhdGNoZG9nCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICogQGJyaWVmICBDb25maWd1cmUgYSBjaGFubmVsIHRvIGJlIGFzc2lnbmVkIHRvIEFEQyBncm91cCByZWd1bGFyLgorICogQG5vdGUgICBJbiBjYXNlIG9mIHVzYWdlIG9mIGludGVybmFsIG1lYXN1cmVtZW50IGNoYW5uZWxzOgorICogICAgICAgICBWYmF0L1ZyZWZJbnQvVGVtcFNlbnNvci4KKyAqICAgICAgICAgVGhlc2UgaW50ZXJuYWwgcGF0aHMgY2FuIGJlIGRpc2FibGVkIHVzaW5nIGZ1bmN0aW9uCisgKiAgICAgICAgIEhBTF9BRENfRGVJbml0KCkuCisgKiBAbm90ZSAgIFBvc3NpYmlsaXR5IHRvIHVwZGF0ZSBwYXJhbWV0ZXJzIG9uIHRoZSBmbHk6CisgKiAgICAgICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgY2hhbm5lbCBpbnRvIEFEQyBncm91cCByZWd1bGFyLAorICogICAgICAgICBmb2xsb3dpbmcgY2FsbHMgdG8gdGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byByZWNvbmZpZ3VyZQorICogICAgICAgICBzb21lIHBhcmFtZXRlcnMgb2Ygc3RydWN0dXJlICJBRENfQ2hhbm5lbENvbmZUeXBlRGVmIiBvbiB0aGUgZmx5LAorICogICAgICAgICB3aXRob3V0IHJlc2V0dGluZyB0aGUgQURDLgorICogICAgICAgICBUaGUgc2V0dGluZyBvZiB0aGVzZSBwYXJhbWV0ZXJzIGlzIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZToKKyAqICAgICAgICAgUmVmZXIgdG8gY29tbWVudHMgb2Ygc3RydWN0dXJlICJBRENfQ2hhbm5lbENvbmZUeXBlRGVmIi4KKyAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUKKyAqIEBwYXJhbSBwQ29uZmlnIFN0cnVjdHVyZSBvZiBBREMgY2hhbm5lbCBhc3NpZ25lZCB0byBBREMgZ3JvdXAgcmVndWxhci4KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDX0NvbmZpZ0NoYW5uZWwoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQURDX0NoYW5uZWxDb25mVHlwZURlZiAqcENvbmZpZykgeworICBIQUxfU3RhdHVzVHlwZURlZiB0bXBfaGFsX3N0YXR1cyA9IEhBTF9PSzsKKyAgdWludDMyX3QgdG1wT2Zmc2V0U2hpZnRlZDsKKyAgdWludDMyX3QgdG1wX2NvbmZpZ19pbnRlcm5hbF9jaGFubmVsOworICBfX0lPIHVpbnQzMl90IHdhaXRfbG9vcF9pbmRleCA9IDBVTDsKKyAgdWludDMyX3QgdG1wX2FkY19pc19jb252ZXJzaW9uX29uX2dvaW5nX3JlZ3VsYXI7CisgIHVpbnQzMl90IHRtcF9hZGNfaXNfY29udmVyc2lvbl9vbl9nb2luZ19pbmplY3RlZDsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfQURDX1JFR1VMQVJfUkFOSyhwQ29uZmlnLT5SYW5rKSk7CisgIGFzc2VydF9wYXJhbShJU19BRENfU0FNUExFX1RJTUUocENvbmZpZy0+U2FtcGxpbmdUaW1lKSk7CisgIGFzc2VydF9wYXJhbShJU19BRENfU0lOR0xFX0RJRkZFUkVOVElBTChwQ29uZmlnLT5TaW5nbGVEaWZmKSk7CisgIGFzc2VydF9wYXJhbShJU19BRENfT0ZGU0VUX05VTUJFUihwQ29uZmlnLT5PZmZzZXROdW1iZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19SQU5HRShBRENfR0VUX1JFU09MVVRJT04oaGFkYyksIHBDb25maWctPk9mZnNldCkpOworCisgIC8qIGlmIFJPVlNFIGlzIHNldCwgdGhlIHZhbHVlIG9mIHRoZSBPRkZTRVR5X0VOIGJpdCBpbiBBREN4X09GUnkgcmVnaXN0ZXIgaXMKKyAgICAgaWdub3JlZCAoY29uc2lkZXJlZCBhcyByZXNldCkgKi8KKyAgYXNzZXJ0X3BhcmFtKCEoKHBDb25maWctPk9mZnNldE51bWJlciAhPSBBRENfT0ZGU0VUX05PTkUpICYmCisgICAgICAgICAgICAgICAgIChoYWRjLT5Jbml0Lk92ZXJzYW1wbGluZ01vZGUgPT0gRU5BQkxFKSkpOworCisgIC8qIFZlcmlmaWNhdGlvbiBvZiBjaGFubmVsIG51bWJlciAqLworICBpZiAocENvbmZpZy0+U2luZ2xlRGlmZiAhPSBBRENfRElGRkVSRU5USUFMX0VOREVEKSB7CisgICAgYXNzZXJ0X3BhcmFtKElTX0FEQ19DSEFOTkVMKGhhZGMsIHBDb25maWctPkNoYW5uZWwpKTsKKyAgfSBlbHNlIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfQURDX0RJRkZfQ0hBTk5FTChoYWRjLCBwQ29uZmlnLT5DaGFubmVsKSk7CisgIH0KKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhhZGMpOworCisgIC8qIFBhcmFtZXRlcnMgdXBkYXRlIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBQYXJhbWV0ZXJzIHRoYXQgY2FuIGJlIHVwZGF0ZWQgd2hlbiBBREMgaXMgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0ICAgKi8KKyAgLyogY29udmVyc2lvbiBvbiBnb2luZyBvbiByZWd1bGFyIGdyb3VwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAtIENoYW5uZWwgbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgLSBDaGFubmVsIHJhbmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaWYgKExMX0FEQ19SRUdfSXNDb252ZXJzaW9uT25nb2luZyhoYWRjLT5JbnN0YW5jZSkgPT0gMFVMKSB7CisgICAgLyogU2V0IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlOiBjaGFubmVsIG9uIHRoZSBzZWxlY3RlZCBzY2FuIHNlcXVlbmNlCisgICAgICogcmFuayAqLworICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyUmFua3MoaGFkYy0+SW5zdGFuY2UsIHBDb25maWctPlJhbmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29uZmlnLT5DaGFubmVsKTsKKworICAgIC8qIFBhcmFtZXRlcnMgdXBkYXRlIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZTogKi8KKyAgICAvKiBQYXJhbWV0ZXJzIHRoYXQgY2FuIGJlIHVwZGF0ZWQgd2hlbiBBREMgaXMgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0ICovCisgICAgLyogY29udmVyc2lvbiBvbiBnb2luZyBvbiByZWd1bGFyIGdyb3VwOiAqLworICAgIC8qICAtIENoYW5uZWwgc2FtcGxpbmcgdGltZSAqLworICAgIC8qICAtIENoYW5uZWwgb2Zmc2V0ICovCisgICAgdG1wX2FkY19pc19jb252ZXJzaW9uX29uX2dvaW5nX3JlZ3VsYXIgPQorICAgICAgICBMTF9BRENfUkVHX0lzQ29udmVyc2lvbk9uZ29pbmcoaGFkYy0+SW5zdGFuY2UpOworICAgIHRtcF9hZGNfaXNfY29udmVyc2lvbl9vbl9nb2luZ19pbmplY3RlZCA9CisgICAgICAgIExMX0FEQ19JTkpfSXNDb252ZXJzaW9uT25nb2luZyhoYWRjLT5JbnN0YW5jZSk7CisgICAgaWYgKCh0bXBfYWRjX2lzX2NvbnZlcnNpb25fb25fZ29pbmdfcmVndWxhciA9PSAwVUwpICYmCisgICAgICAgICh0bXBfYWRjX2lzX2NvbnZlcnNpb25fb25fZ29pbmdfaW5qZWN0ZWQgPT0gMFVMKSkgeworICAgICAgLyogTWFuYWdlIHNwZWNpZmljIGNhc2Ugb2Ygc2FtcGxpbmcgdGltZSAzLjUgY3ljbGVzIHJlcGxhY2luZyAyLjUgY3lsZXMgKi8KKyAgICAgIGlmIChwQ29uZmlnLT5TYW1wbGluZ1RpbWUgPT0gQURDX1NBTVBMRVRJTUVfM0NZQ0xFU181KSB7CisgICAgICAgIC8qIFNldCBzYW1wbGluZyB0aW1lIG9mIHRoZSBzZWxlY3RlZCBBREMgY2hhbm5lbCAqLworICAgICAgICBMTF9BRENfU2V0Q2hhbm5lbFNhbXBsaW5nVGltZShoYWRjLT5JbnN0YW5jZSwgcENvbmZpZy0+Q2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfQURDX1NBTVBMSU5HVElNRV8yQ1lDTEVTXzUpOworCisgICAgICAgIC8qIFNldCBBREMgc2FtcGxpbmcgdGltZSBjb21tb24gY29uZmlndXJhdGlvbiAqLworICAgICAgICBMTF9BRENfU2V0U2FtcGxpbmdUaW1lQ29tbW9uQ29uZmlnKAorICAgICAgICAgICAgaGFkYy0+SW5zdGFuY2UsIExMX0FEQ19TQU1QTElOR1RJTUVfQ09NTU9OXzNDNV9SRVBMXzJDNSk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBTZXQgc2FtcGxpbmcgdGltZSBvZiB0aGUgc2VsZWN0ZWQgQURDIGNoYW5uZWwgKi8KKyAgICAgICAgTExfQURDX1NldENoYW5uZWxTYW1wbGluZ1RpbWUoaGFkYy0+SW5zdGFuY2UsIHBDb25maWctPkNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb25maWctPlNhbXBsaW5nVGltZSk7CisKKyAgICAgICAgLyogU2V0IEFEQyBzYW1wbGluZyB0aW1lIGNvbW1vbiBjb25maWd1cmF0aW9uICovCisgICAgICAgIExMX0FEQ19TZXRTYW1wbGluZ1RpbWVDb21tb25Db25maWcoaGFkYy0+SW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfQURDX1NBTVBMSU5HVElNRV9DT01NT05fREVGQVVMVCk7CisgICAgICB9CisKKyAgICAgIC8qIENvbmZpZ3VyZSB0aGUgb2Zmc2V0OiBvZmZzZXQgZW5hYmxlL2Rpc2FibGUsIGNoYW5uZWwsIG9mZnNldCB2YWx1ZSAqLworCisgICAgICAvKiBTaGlmdCB0aGUgb2Zmc2V0IHdpdGggcmVzcGVjdCB0byB0aGUgc2VsZWN0ZWQgQURDIHJlc29sdXRpb24uICovCisgICAgICAvKiBPZmZzZXQgaGFzIHRvIGJlIGxlZnQtYWxpZ25lZCBvbiBiaXQgMTEsIHRoZSBMU0IgKHJpZ2h0IGJpdHMpIGFyZSBzZXQKKyAgICAgICAqIHRvIDAgKi8KKyAgICAgIHRtcE9mZnNldFNoaWZ0ZWQgPQorICAgICAgICAgIEFEQ19PRkZTRVRfU0hJRlRfUkVTT0xVVElPTihoYWRjLCAodWludDMyX3QpcENvbmZpZy0+T2Zmc2V0KTsKKworICAgICAgaWYgKHBDb25maWctPk9mZnNldE51bWJlciAhPSBBRENfT0ZGU0VUX05PTkUpIHsKKyAgICAgICAgLyogU2V0IEFEQyBzZWxlY3RlZCBvZmZzZXQgbnVtYmVyICovCisgICAgICAgIExMX0FEQ19TZXRPZmZzZXQoaGFkYy0+SW5zdGFuY2UsIHBDb25maWctPk9mZnNldE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwQ29uZmlnLT5DaGFubmVsLCB0bXBPZmZzZXRTaGlmdGVkKTsKKworICAgICAgICBhc3NlcnRfcGFyYW0oSVNfQURDX09GRlNFVF9TSUdOKHBDb25maWctPk9mZnNldFNpZ24pKTsKKyAgICAgICAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUocENvbmZpZy0+T2Zmc2V0U2F0dXJhdGlvbikpOworICAgICAgICAvKiBTZXQgQURDIHNlbGVjdGVkIG9mZnNldCBzaWduICYgc2F0dXJhdGlvbiAqLworICAgICAgICBMTF9BRENfU2V0T2Zmc2V0U2lnbihoYWRjLT5JbnN0YW5jZSwgcENvbmZpZy0+T2Zmc2V0TnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29uZmlnLT5PZmZzZXRTaWduKTsKKyAgICAgICAgTExfQURDX1NldE9mZnNldFNhdHVyYXRpb24oaGFkYy0+SW5zdGFuY2UsIHBDb25maWctPk9mZnNldE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBDb25maWctPk9mZnNldFNhdHVyYXRpb24gPT0gRU5BQkxFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBMTF9BRENfT0ZGU0VUX1NBVFVSQVRJT05fRU5BQkxFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IExMX0FEQ19PRkZTRVRfU0FUVVJBVElPTl9ESVNBQkxFKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFNjYW4gZWFjaCBvZmZzZXQgcmVnaXN0ZXIgdG8gY2hlY2sgaWYgdGhlIHNlbGVjdGVkIGNoYW5uZWwgaXMKKyAgICAgICAgICogdGFyZ2V0ZWQuICovCisgICAgICAgIC8qIElmIHRoaXMgaXMgdGhlIGNhc2UsIHRoZSBjb3JyZXNwb25kaW5nIG9mZnNldCBudW1iZXIgaXMgZGlzYWJsZWQuICovCisgICAgICAgIGlmIChfX0xMX0FEQ19DSEFOTkVMX1RPX0RFQ0lNQUxfTkIoCisgICAgICAgICAgICAgICAgTExfQURDX0dldE9mZnNldENoYW5uZWwoaGFkYy0+SW5zdGFuY2UsIExMX0FEQ19PRkZTRVRfMSkpID09CisgICAgICAgICAgICBfX0xMX0FEQ19DSEFOTkVMX1RPX0RFQ0lNQUxfTkIocENvbmZpZy0+Q2hhbm5lbCkpIHsKKyAgICAgICAgICBMTF9BRENfU2V0T2Zmc2V0U3RhdGUoaGFkYy0+SW5zdGFuY2UsIExMX0FEQ19PRkZTRVRfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfQURDX09GRlNFVF9ESVNBQkxFKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoX19MTF9BRENfQ0hBTk5FTF9UT19ERUNJTUFMX05CKAorICAgICAgICAgICAgICAgIExMX0FEQ19HZXRPZmZzZXRDaGFubmVsKGhhZGMtPkluc3RhbmNlLCBMTF9BRENfT0ZGU0VUXzIpKSA9PQorICAgICAgICAgICAgX19MTF9BRENfQ0hBTk5FTF9UT19ERUNJTUFMX05CKHBDb25maWctPkNoYW5uZWwpKSB7CisgICAgICAgICAgTExfQURDX1NldE9mZnNldFN0YXRlKGhhZGMtPkluc3RhbmNlLCBMTF9BRENfT0ZGU0VUXzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX0FEQ19PRkZTRVRfRElTQUJMRSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKF9fTExfQURDX0NIQU5ORUxfVE9fREVDSU1BTF9OQigKKyAgICAgICAgICAgICAgICBMTF9BRENfR2V0T2Zmc2V0Q2hhbm5lbChoYWRjLT5JbnN0YW5jZSwgTExfQURDX09GRlNFVF8zKSkgPT0KKyAgICAgICAgICAgIF9fTExfQURDX0NIQU5ORUxfVE9fREVDSU1BTF9OQihwQ29uZmlnLT5DaGFubmVsKSkgeworICAgICAgICAgIExMX0FEQ19TZXRPZmZzZXRTdGF0ZShoYWRjLT5JbnN0YW5jZSwgTExfQURDX09GRlNFVF8zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTF9BRENfT0ZGU0VUX0RJU0FCTEUpOworICAgICAgICB9CisgICAgICAgIGlmIChfX0xMX0FEQ19DSEFOTkVMX1RPX0RFQ0lNQUxfTkIoCisgICAgICAgICAgICAgICAgTExfQURDX0dldE9mZnNldENoYW5uZWwoaGFkYy0+SW5zdGFuY2UsIExMX0FEQ19PRkZTRVRfNCkpID09CisgICAgICAgICAgICBfX0xMX0FEQ19DSEFOTkVMX1RPX0RFQ0lNQUxfTkIocENvbmZpZy0+Q2hhbm5lbCkpIHsKKyAgICAgICAgICBMTF9BRENfU2V0T2Zmc2V0U3RhdGUoaGFkYy0+SW5zdGFuY2UsIExMX0FEQ19PRkZTRVRfNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfQURDX09GRlNFVF9ESVNBQkxFKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8qIFBhcmFtZXRlcnMgdXBkYXRlIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZTogKi8KKyAgICAvKiBQYXJhbWV0ZXJzIHRoYXQgY2FuIGJlIHVwZGF0ZWQgb25seSB3aGVuIEFEQyBpcyBkaXNhYmxlZDogKi8KKyAgICAvKiAgLSBTaW5nbGUgb3IgZGlmZmVyZW50aWFsIG1vZGUgKi8KKyAgICBpZiAoTExfQURDX0lzRW5hYmxlZChoYWRjLT5JbnN0YW5jZSkgPT0gMFVMKSB7CisgICAgICAvKiBTZXQgbW9kZSBzaW5nbGUtZW5kZWQgb3IgZGlmZmVyZW50aWFsIGlucHV0IG9mIHRoZSBzZWxlY3RlZCBBREMgY2hhbm5lbAorICAgICAgICovCisgICAgICBMTF9BRENfU2V0Q2hhbm5lbFNpbmdsZURpZmYoaGFkYy0+SW5zdGFuY2UsIHBDb25maWctPkNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbmZpZy0+U2luZ2xlRGlmZik7CisKKyAgICAgIC8qIENvbmZpZ3VyYXRpb24gb2YgZGlmZmVyZW50aWFsIG1vZGUgKi8KKyAgICAgIGlmIChwQ29uZmlnLT5TaW5nbGVEaWZmID09IEFEQ19ESUZGRVJFTlRJQUxfRU5ERUQpIHsKKyAgICAgICAgLyogU2V0IHNhbXBsaW5nIHRpbWUgb2YgdGhlIHNlbGVjdGVkIEFEQyBjaGFubmVsICovCisgICAgICAgIC8qIE5vdGU6IEFEQyBjaGFubmVsIG51bWJlciBtYXNrZWQgd2l0aCB2YWx1ZSAiMHgxRiIgdG8gZW5zdXJlIHNoaWZ0CisgICAgICAgICAqIHZhbHVlIHdpdGhpbiAzMiBiaXRzIHJhbmdlICovCisgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lKAorICAgICAgICAgICAgaGFkYy0+SW5zdGFuY2UsCisgICAgICAgICAgICAodWludDMyX3QpKF9fTExfQURDX0RFQ0lNQUxfTkJfVE9fQ0hBTk5FTCgKKyAgICAgICAgICAgICAgICAoX19MTF9BRENfQ0hBTk5FTF9UT19ERUNJTUFMX05CKCh1aW50MzJfdClwQ29uZmlnLT5DaGFubmVsKSArCisgICAgICAgICAgICAgICAgIDFVTCkgJgorICAgICAgICAgICAgICAgIDB4MUZVTCkpLAorICAgICAgICAgICAgcENvbmZpZy0+U2FtcGxpbmdUaW1lKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBNYW5hZ2VtZW50IG9mIGludGVybmFsIG1lYXN1cmVtZW50IGNoYW5uZWxzOiBWYmF0L1ZyZWZJbnQvVGVtcFNlbnNvci4gICovCisgICAgLyogSWYgaW50ZXJuYWwgY2hhbm5lbCBzZWxlY3RlZCwgZW5hYmxlIGRlZGljYXRlZCBpbnRlcm5hbCBidWZmZXJzIGFuZCAgICAqLworICAgIC8qIHBhdGhzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBOb3RlOiB0aGVzZSBpbnRlcm5hbCBtZWFzdXJlbWVudCBwYXRocyBjYW4gYmUgZGlzYWJsZWQgdXNpbmcgICAgICAgICAgICovCisgICAgLyogSEFMX0FEQ19EZUluaXQoKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgaWYgKF9fTExfQURDX0lTX0NIQU5ORUxfSU5URVJOQUwocENvbmZpZy0+Q2hhbm5lbCkpIHsKKyAgICAgIHRtcF9jb25maWdfaW50ZXJuYWxfY2hhbm5lbCA9IExMX0FEQ19HZXRDb21tb25QYXRoSW50ZXJuYWxDaCgKKyAgICAgICAgICBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKworICAgICAgLyogSWYgdGhlIHJlcXVlc3RlZCBpbnRlcm5hbCBtZWFzdXJlbWVudCBwYXRoIGhhcyBhbHJlYWR5IGJlZW4gZW5hYmxlZCwgKi8KKyAgICAgIC8qIGJ5cGFzcyB0aGUgY29uZmlndXJhdGlvbiBwcm9jZXNzaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICBpZiAoKChwQ29uZmlnLT5DaGFubmVsID09IEFEQ19DSEFOTkVMX1RFTVBTRU5TT1JfQURDMSkgfHwKKyAgICAgICAgICAgKHBDb25maWctPkNoYW5uZWwgPT0gQURDX0NIQU5ORUxfVEVNUFNFTlNPUl9BREM1KSkgJiYKKyAgICAgICAgICAoKHRtcF9jb25maWdfaW50ZXJuYWxfY2hhbm5lbCAmIExMX0FEQ19QQVRIX0lOVEVSTkFMX1RFTVBTRU5TT1IpID09CisgICAgICAgICAgIDBVTCkpIHsKKyAgICAgICAgaWYgKEFEQ19URU1QRVJBVFVSRV9TRU5TT1JfSU5TVEFOQ0UoaGFkYykpIHsKKyAgICAgICAgICBMTF9BRENfU2V0Q29tbW9uUGF0aEludGVybmFsQ2goCisgICAgICAgICAgICAgIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSksCisgICAgICAgICAgICAgIExMX0FEQ19QQVRIX0lOVEVSTkFMX1RFTVBTRU5TT1IgfCB0bXBfY29uZmlnX2ludGVybmFsX2NoYW5uZWwpOworCisgICAgICAgICAgLyogRGVsYXkgZm9yIHRlbXBlcmF0dXJlIHNlbnNvciBzdGFiaWxpemF0aW9uIHRpbWUgKi8KKyAgICAgICAgICAvKiBXYWl0IGxvb3AgaW5pdGlhbGl6YXRpb24gYW5kIGV4ZWN1dGlvbiAqLworICAgICAgICAgIC8qIE5vdGU6IFZhcmlhYmxlIGRpdmlkZWQgYnkgMiB0byBjb21wZW5zYXRlIHBhcnRpYWxseSAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAvKiAgICAgICBDUFUgcHJvY2Vzc2luZyBjeWNsZXMsIHNjYWxpbmcgaW4gdXMgc3BsaXQgdG8gbm90ICAgICAgICAgICovCisgICAgICAgICAgLyogICAgICAgZXhjZWVkIDMyIGJpdHMgcmVnaXN0ZXIgY2FwYWNpdHkgYW5kIGhhbmRsZSBsb3cgZnJlcXVlbmN5LiAqLworICAgICAgICAgIHdhaXRfbG9vcF9pbmRleCA9ICgoTExfQURDX0RFTEFZX1RFTVBTRU5TT1JfU1RBQl9VUyAvIDEwVUwpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTeXN0ZW1Db3JlQ2xvY2sgLyAoMTAwMDAwVUwgKiAyVUwpKSArIDFVTCkpOworICAgICAgICAgIHdoaWxlICh3YWl0X2xvb3BfaW5kZXggIT0gMFVMKSB7CisgICAgICAgICAgICB3YWl0X2xvb3BfaW5kZXgtLTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoKHBDb25maWctPkNoYW5uZWwgPT0gQURDX0NIQU5ORUxfVkJBVCkgJiYKKyAgICAgICAgICAgICAgICAgKCh0bXBfY29uZmlnX2ludGVybmFsX2NoYW5uZWwgJiBMTF9BRENfUEFUSF9JTlRFUk5BTF9WQkFUKSA9PQorICAgICAgICAgICAgICAgICAgMFVMKSkgeworICAgICAgICBpZiAoQURDX0JBVFRFUllfVk9MVEFHRV9JTlNUQU5DRShoYWRjKSkgeworICAgICAgICAgIExMX0FEQ19TZXRDb21tb25QYXRoSW50ZXJuYWxDaCgKKyAgICAgICAgICAgICAgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSwKKyAgICAgICAgICAgICAgTExfQURDX1BBVEhfSU5URVJOQUxfVkJBVCB8IHRtcF9jb25maWdfaW50ZXJuYWxfY2hhbm5lbCk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoKHBDb25maWctPkNoYW5uZWwgPT0gQURDX0NIQU5ORUxfVlJFRklOVCkgJiYKKyAgICAgICAgICAgICAgICAgKCh0bXBfY29uZmlnX2ludGVybmFsX2NoYW5uZWwgJgorICAgICAgICAgICAgICAgICAgIExMX0FEQ19QQVRIX0lOVEVSTkFMX1ZSRUZJTlQpID09IDBVTCkpIHsKKyAgICAgICAgaWYgKEFEQ19WUkVGSU5UX0lOU1RBTkNFKGhhZGMpKSB7CisgICAgICAgICAgTExfQURDX1NldENvbW1vblBhdGhJbnRlcm5hbENoKAorICAgICAgICAgICAgICBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpLAorICAgICAgICAgICAgICBMTF9BRENfUEFUSF9JTlRFUk5BTF9WUkVGSU5UIHwgdG1wX2NvbmZpZ19pbnRlcm5hbF9jaGFubmVsKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogbm90aGluZyB0byBkbyAqLworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIElmIGEgY29udmVyc2lvbiBpcyBvbiBnb2luZyBvbiByZWd1bGFyIGdyb3VwLCBubyB1cGRhdGUgb24gcmVndWxhciAgICAgICAqLworICAvKiBjaGFubmVsIGNvdWxkIGJlIGRvbmUgb24gbmVpdGhlciBvZiB0aGUgY2hhbm5lbCBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSAgKi8KKyAgLyogcGFyYW1ldGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIGVsc2UgeworICAgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSB0byBlcnJvciAqLworICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfRVJST1JfQ09ORklHKTsKKworICAgIHRtcF9oYWxfc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisKKyAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGFkYyk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gdG1wX2hhbF9zdGF0dXM7Cit9CisKKy8qKgorICogQGJyaWVmICBDb25maWd1cmUgdGhlIGFuYWxvZyB3YXRjaGRvZy4KKyAqIEBub3RlICAgUG9zc2liaWxpdHkgdG8gdXBkYXRlIHBhcmFtZXRlcnMgb24gdGhlIGZseToKKyAqICAgICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgc2VsZWN0ZWQgYW5hbG9nIHdhdGNoZG9nLCBzdWNjZXNzaXZlCisgKiAgICAgICAgIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gcmVjb25maWd1cmUgc29tZSBwYXJhbWV0ZXJzCisgKiAgICAgICAgIG9mIHN0cnVjdHVyZSAiQURDX0FuYWxvZ1dER0NvbmZUeXBlRGVmIiBvbiB0aGUgZmx5LCB3aXRob3V0IHJlc2V0dGluZworICogICAgICAgICB0aGUgQURDLgorICogICAgICAgICBUaGUgc2V0dGluZyBvZiB0aGVzZSBwYXJhbWV0ZXJzIGlzIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZS4KKyAqICAgICAgICAgRm9yIHBhcmFtZXRlcnMgY29uc3RyYWludHMsIHNlZSBjb21tZW50cyBvZiBzdHJ1Y3R1cmUKKyAqICAgICAgICAgIkFEQ19BbmFsb2dXREdDb25mVHlwZURlZiIuCisgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBhbmFsb2cgd2F0Y2hkb2cgdGhyZXNob2xkcyBjYW4gYmUgbW9kaWZpZWQKKyAqICAgICAgICAgd2hpbGUgQURDIGNvbnZlcnNpb24gaXMgb24gZ29pbmcuCisgKiAgICAgICAgIEluIHRoaXMgY2FzZSwgc29tZSBjb25zdHJhaW50cyBtdXN0IGJlIHRha2VuIGludG8gYWNjb3VudDoKKyAqICAgICAgICAgdGhlIHByb2dyYW1tZWQgdGhyZXNob2xkIHZhbHVlcyBhcmUgZWZmZWN0aXZlIGZyb20gdGhlIG5leHQKKyAqICAgICAgICAgQURDIEVPQyAoZW5kIG9mIHVuaXRhcnkgY29udmVyc2lvbikuCisgKiAgICAgICAgIENvbnNpZGVyaW5nIHRoYXQgcmVnaXN0ZXJzIHdyaXRlIGRlbGF5IG1heSBoYXBwZW4gZHVlIHRvCisgKiAgICAgICAgIGJ1cyBhY3Rpdml0eSwgdGhpcyBtaWdodCBjYXVzZSBhbiB1bmNlcnRhaW50eSBvbiB0aGUKKyAqICAgICAgICAgZWZmZWN0aXZlIHRpbWluZyBvZiB0aGUgbmV3IHByb2dyYW1tZWQgdGhyZXNob2xkIHZhbHVlcy4KKyAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUKKyAqIEBwYXJhbSBwQW5hbG9nV0RHQ29uZmlnIFN0cnVjdHVyZSBvZiBBREMgYW5hbG9nIHdhdGNoZG9nIGNvbmZpZ3VyYXRpb24KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDX0FuYWxvZ1dER0NvbmZpZygKKyAgICBBRENfSGFuZGxlVHlwZURlZiAqaGFkYywgY29uc3QgQURDX0FuYWxvZ1dER0NvbmZUeXBlRGVmICpwQW5hbG9nV0RHQ29uZmlnKSB7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHRtcF9oYWxfc3RhdHVzID0gSEFMX09LOworICB1aW50MzJfdCB0bXBfYXdkX2hpZ2hfdGhyZXNob2xkX3NoaWZ0ZWQ7CisgIHVpbnQzMl90IHRtcF9hd2RfbG93X3RocmVzaG9sZF9zaGlmdGVkOworICB1aW50MzJfdCB0bXBfYWRjX2lzX2NvbnZlcnNpb25fb25fZ29pbmdfcmVndWxhcjsKKyAgdWludDMyX3QgdG1wX2FkY19pc19jb252ZXJzaW9uX29uX2dvaW5nX2luamVjdGVkOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19BRENfQU5BTE9HX1dBVENIRE9HX05VTUJFUihwQW5hbG9nV0RHQ29uZmlnLT5XYXRjaGRvZ051bWJlcikpOworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FOQUxPR19XQVRDSERPR19NT0RFKHBBbmFsb2dXREdDb25maWctPldhdGNoZG9nTW9kZSkpOworICBhc3NlcnRfcGFyYW0oCisgICAgICBJU19BRENfQU5BTE9HX1dBVENIRE9HX0ZJTFRFUklOR19NT0RFKHBBbmFsb2dXREdDb25maWctPkZpbHRlcmluZ0NvbmZpZykpOworICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShwQW5hbG9nV0RHQ29uZmlnLT5JVE1vZGUpKTsKKworICBpZiAoKHBBbmFsb2dXREdDb25maWctPldhdGNoZG9nTW9kZSA9PSBBRENfQU5BTE9HV0FUQ0hET0dfU0lOR0xFX1JFRykgfHwKKyAgICAgIChwQW5hbG9nV0RHQ29uZmlnLT5XYXRjaGRvZ01vZGUgPT0gQURDX0FOQUxPR1dBVENIRE9HX1NJTkdMRV9JTkpFQykgfHwKKyAgICAgIChwQW5hbG9nV0RHQ29uZmlnLT5XYXRjaGRvZ01vZGUgPT0gQURDX0FOQUxPR1dBVENIRE9HX1NJTkdMRV9SRUdJTkpFQykpIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfQURDX0NIQU5ORUwoaGFkYywgcEFuYWxvZ1dER0NvbmZpZy0+Q2hhbm5lbCkpOworICB9CisKKyAgLyogVmVyaWZ5IHRocmVzaG9sZHMgcmFuZ2UgKi8KKyAgaWYgKGhhZGMtPkluaXQuT3ZlcnNhbXBsaW5nTW9kZSA9PSBFTkFCTEUpIHsKKyAgICAvKiBDYXNlIG9mIG92ZXJzYW1wbGluZyBlbmFibGVkOiBkZXBlbmRpbmcgb24gcmF0aW8gYW5kIHNoaWZ0IGNvbmZpZ3VyYXRpb24sCisgICAgICAgYW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZHMgY2FuIGJlIGhpZ2hlciB0aGFuIEFEQyByZXNvbHV0aW9uLgorICAgICAgIFZlcmlmeSBpZiB0aHJlc2hvbGRzIGFyZSB3aXRoaW4gbWF4aW11bSB0aHJlc2hvbGRzIHJhbmdlLiAqLworICAgIGFzc2VydF9wYXJhbSgKKyAgICAgICAgSVNfQURDX1JBTkdFKEFEQ19SRVNPTFVUSU9OXzEyQiwgcEFuYWxvZ1dER0NvbmZpZy0+SGlnaFRocmVzaG9sZCkpOworICAgIGFzc2VydF9wYXJhbSgKKyAgICAgICAgSVNfQURDX1JBTkdFKEFEQ19SRVNPTFVUSU9OXzEyQiwgcEFuYWxvZ1dER0NvbmZpZy0+TG93VGhyZXNob2xkKSk7CisgIH0gZWxzZSB7CisgICAgLyogVmVyaWZ5IGlmIHRocmVzaG9sZHMgYXJlIHdpdGhpbiB0aGUgc2VsZWN0ZWQgQURDIHJlc29sdXRpb24gKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfQURDX1JBTkdFKEFEQ19HRVRfUkVTT0xVVElPTihoYWRjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBbmFsb2dXREdDb25maWctPkhpZ2hUaHJlc2hvbGQpKTsKKyAgICBhc3NlcnRfcGFyYW0oCisgICAgICAgIElTX0FEQ19SQU5HRShBRENfR0VUX1JFU09MVVRJT04oaGFkYyksIHBBbmFsb2dXREdDb25maWctPkxvd1RocmVzaG9sZCkpOworICB9CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoYWRjKTsKKworICAvKiBQYXJhbWV0ZXJzIHVwZGF0ZSBjb25kaXRpb25lZCB0byBBREMgc3RhdGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogUGFyYW1ldGVycyB0aGF0IGNhbiBiZSB1cGRhdGVkIHdoZW4gQURDIGlzIGRpc2FibGVkIG9yIGVuYWJsZWQgd2l0aG91dCAgICovCisgIC8qIGNvbnZlcnNpb24gb24gZ29pbmcgb24gQURDIGdyb3VwcyByZWd1bGFyIGFuZCBpbmplY3RlZDogICAgICAgICAgICAgICAgICAqLworICAvKiAgLSBBbmFsb2cgd2F0Y2hkb2cgY2hhbm5lbHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdG1wX2FkY19pc19jb252ZXJzaW9uX29uX2dvaW5nX3JlZ3VsYXIgPQorICAgICAgTExfQURDX1JFR19Jc0NvbnZlcnNpb25PbmdvaW5nKGhhZGMtPkluc3RhbmNlKTsKKyAgdG1wX2FkY19pc19jb252ZXJzaW9uX29uX2dvaW5nX2luamVjdGVkID0KKyAgICAgIExMX0FEQ19JTkpfSXNDb252ZXJzaW9uT25nb2luZyhoYWRjLT5JbnN0YW5jZSk7CisgIGlmICgodG1wX2FkY19pc19jb252ZXJzaW9uX29uX2dvaW5nX3JlZ3VsYXIgPT0gMFVMKSAmJgorICAgICAgKHRtcF9hZGNfaXNfY29udmVyc2lvbl9vbl9nb2luZ19pbmplY3RlZCA9PSAwVUwpKSB7CisgICAgLyogQW5hbG9nIHdhdGNoZG9nIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBpZiAocEFuYWxvZ1dER0NvbmZpZy0+V2F0Y2hkb2dOdW1iZXIgPT0gQURDX0FOQUxPR1dBVENIRE9HXzEpIHsKKyAgICAgIC8qIENvbmZpZ3VyYXRpb24gb2YgYW5hbG9nIHdhdGNoZG9nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiAgLSBTZXQgdGhlIGFuYWxvZyB3YXRjaGRvZyBlbmFibGUgbW9kZTogb25lIG9yIG92ZXJhbGwgZ3JvdXAgb2YgICAgICAqLworICAgICAgLyogICAgY2hhbm5lbHMsIG9uIGdyb3VwcyByZWd1bGFyIGFuZC1vciBpbmplY3RlZC4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIHN3aXRjaCAocEFuYWxvZ1dER0NvbmZpZy0+V2F0Y2hkb2dNb2RlKSB7CisgICAgICAgIGNhc2UgQURDX0FOQUxPR1dBVENIRE9HX1NJTkdMRV9SRUc6CisgICAgICAgICAgTExfQURDX1NldEFuYWxvZ1dETW9uaXRDaGFubmVscygKKyAgICAgICAgICAgICAgaGFkYy0+SW5zdGFuY2UsIExMX0FEQ19BV0QxLAorICAgICAgICAgICAgICBfX0xMX0FEQ19BTkFMT0dXRF9DSEFOTkVMX0dST1VQKHBBbmFsb2dXREdDb25maWctPkNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfQURDX0dST1VQX1JFR1VMQVIpKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEFEQ19BTkFMT0dXQVRDSERPR19TSU5HTEVfSU5KRUM6CisgICAgICAgICAgTExfQURDX1NldEFuYWxvZ1dETW9uaXRDaGFubmVscygKKyAgICAgICAgICAgICAgaGFkYy0+SW5zdGFuY2UsIExMX0FEQ19BV0QxLAorICAgICAgICAgICAgICBfX0xMX0FEQ19BTkFMT0dXRF9DSEFOTkVMX0dST1VQKHBBbmFsb2dXREdDb25maWctPkNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfQURDX0dST1VQX0lOSkVDVEVEKSk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBBRENfQU5BTE9HV0FUQ0hET0dfU0lOR0xFX1JFR0lOSkVDOgorICAgICAgICAgIExMX0FEQ19TZXRBbmFsb2dXRE1vbml0Q2hhbm5lbHMoCisgICAgICAgICAgICAgIGhhZGMtPkluc3RhbmNlLCBMTF9BRENfQVdEMSwKKyAgICAgICAgICAgICAgX19MTF9BRENfQU5BTE9HV0RfQ0hBTk5FTF9HUk9VUChwQW5hbG9nV0RHQ29uZmlnLT5DaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX0FEQ19HUk9VUF9SRUdVTEFSX0lOSkVDVEVEKSk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBBRENfQU5BTE9HV0FUQ0hET0dfQUxMX1JFRzoKKyAgICAgICAgICBMTF9BRENfU2V0QW5hbG9nV0RNb25pdENoYW5uZWxzKGhhZGMtPkluc3RhbmNlLCBMTF9BRENfQVdEMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX0FEQ19BV0RfQUxMX0NIQU5ORUxTX1JFRyk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBBRENfQU5BTE9HV0FUQ0hET0dfQUxMX0lOSkVDOgorICAgICAgICAgIExMX0FEQ19TZXRBbmFsb2dXRE1vbml0Q2hhbm5lbHMoaGFkYy0+SW5zdGFuY2UsIExMX0FEQ19BV0QxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfQURDX0FXRF9BTExfQ0hBTk5FTFNfSU5KKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEFEQ19BTkFMT0dXQVRDSERPR19BTExfUkVHSU5KRUM6CisgICAgICAgICAgTExfQURDX1NldEFuYWxvZ1dETW9uaXRDaGFubmVscyhoYWRjLT5JbnN0YW5jZSwgTExfQURDX0FXRDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTF9BRENfQVdEX0FMTF9DSEFOTkVMU19SRUdfSU5KKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OiAvKiBBRENfQU5BTE9HV0FUQ0hET0dfTk9ORSAqLworICAgICAgICAgIExMX0FEQ19TZXRBbmFsb2dXRE1vbml0Q2hhbm5lbHMoaGFkYy0+SW5zdGFuY2UsIExMX0FEQ19BV0QxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfQURDX0FXRF9ESVNBQkxFKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLyogU2V0IHRoZSBmaWx0ZXJpbmcgY29uZmlndXJhdGlvbiAqLworICAgICAgTU9ESUZZX1JFRyhoYWRjLT5JbnN0YW5jZS0+VFIxLCBBRENfVFIxX0FXREZJTFQsCisgICAgICAgICAgICAgICAgIHBBbmFsb2dXREdDb25maWctPkZpbHRlcmluZ0NvbmZpZyk7CisKKyAgICAgIC8qIFVwZGF0ZSBzdGF0ZSwgY2xlYXIgcHJldmlvdXMgcmVzdWx0IHJlbGF0ZWQgdG8gQVdEMSAqLworICAgICAgQ0xFQVJfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0FXRDEpOworCisgICAgICAvKiBDbGVhciBmbGFnIEFEQyBhbmFsb2cgd2F0Y2hkb2cgKi8KKyAgICAgIC8qIE5vdGU6IEZsYWcgY2xlYXJlZCBDbGVhciB0aGUgQURDIEFuYWxvZyB3YXRjaGRvZyBmbGFnIHRvIGJlIHJlYWR5ICAqLworICAgICAgLyogdG8gdXNlIGZvciBIQUxfQURDX0lSUUhhbmRsZXIoKSBvciBIQUxfQURDX1BvbGxGb3JFdmVudCgpICAgICAgICAgICovCisgICAgICAvKiAoaW4gY2FzZSBsZWZ0IGVuYWJsZWQgYnkgcHJldmlvdXMgQURDIG9wZXJhdGlvbnMpLiAgICAgICAgICAgICAgICAgKi8KKyAgICAgIExMX0FEQ19DbGVhckZsYWdfQVdEMShoYWRjLT5JbnN0YW5jZSk7CisKKyAgICAgIC8qIENvbmZpZ3VyZSBBREMgYW5hbG9nIHdhdGNoZG9nIGludGVycnVwdCAqLworICAgICAgaWYgKHBBbmFsb2dXREdDb25maWctPklUTW9kZSA9PSBFTkFCTEUpIHsKKyAgICAgICAgTExfQURDX0VuYWJsZUlUX0FXRDEoaGFkYy0+SW5zdGFuY2UpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgTExfQURDX0Rpc2FibGVJVF9BV0QxKGhhZGMtPkluc3RhbmNlKTsKKyAgICAgIH0KKyAgICB9CisgICAgLyogQ2FzZSBvZiBBRENfQU5BTE9HV0FUQ0hET0dfMiBvciBBRENfQU5BTE9HV0FUQ0hET0dfMyAqLworICAgIGVsc2UgeworICAgICAgc3dpdGNoIChwQW5hbG9nV0RHQ29uZmlnLT5XYXRjaGRvZ01vZGUpIHsKKyAgICAgICAgY2FzZSBBRENfQU5BTE9HV0FUQ0hET0dfU0lOR0xFX1JFRzoKKyAgICAgICAgY2FzZSBBRENfQU5BTE9HV0FUQ0hET0dfU0lOR0xFX0lOSkVDOgorICAgICAgICBjYXNlIEFEQ19BTkFMT0dXQVRDSERPR19TSU5HTEVfUkVHSU5KRUM6CisgICAgICAgICAgLyogVXBkYXRlIEFXRCBieSBiaXRmaWVsZCB0byBrZWVwIHRoZSBwb3NzaWJpbGl0eSB0byBtb25pdG9yICAgICAgICAqLworICAgICAgICAgIC8qIHNldmVyYWwgY2hhbm5lbHMgYnkgc3VjY2Vzc2l2ZSBjYWxscyBvZiB0aGlzIGZ1bmN0aW9uLiAgICAgICAgICAgKi8KKyAgICAgICAgICBpZiAocEFuYWxvZ1dER0NvbmZpZy0+V2F0Y2hkb2dOdW1iZXIgPT0gQURDX0FOQUxPR1dBVENIRE9HXzIpIHsKKyAgICAgICAgICAgIFNFVF9CSVQoaGFkYy0+SW5zdGFuY2UtPkFXRDJDUiwKKyAgICAgICAgICAgICAgICAgICAgKDFVTCA8PCAoX19MTF9BRENfQ0hBTk5FTF9UT19ERUNJTUFMX05CKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFuYWxvZ1dER0NvbmZpZy0+Q2hhbm5lbCkgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFGVUwpKSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFNFVF9CSVQoaGFkYy0+SW5zdGFuY2UtPkFXRDNDUiwKKyAgICAgICAgICAgICAgICAgICAgKDFVTCA8PCAoX19MTF9BRENfQ0hBTk5FTF9UT19ERUNJTUFMX05CKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFuYWxvZ1dER0NvbmZpZy0+Q2hhbm5lbCkgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFGVUwpKSk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQURDX0FOQUxPR1dBVENIRE9HX0FMTF9SRUc6CisgICAgICAgIGNhc2UgQURDX0FOQUxPR1dBVENIRE9HX0FMTF9JTkpFQzoKKyAgICAgICAgY2FzZSBBRENfQU5BTE9HV0FUQ0hET0dfQUxMX1JFR0lOSkVDOgorICAgICAgICAgIExMX0FEQ19TZXRBbmFsb2dXRE1vbml0Q2hhbm5lbHMoaGFkYy0+SW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQW5hbG9nV0RHQ29uZmlnLT5XYXRjaGRvZ051bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX0FEQ19BV0RfQUxMX0NIQU5ORUxTX1JFR19JTkopOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6IC8qIEFEQ19BTkFMT0dXQVRDSERPR19OT05FICovCisgICAgICAgICAgTExfQURDX1NldEFuYWxvZ1dETW9uaXRDaGFubmVscyhoYWRjLT5JbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBbmFsb2dXREdDb25maWctPldhdGNoZG9nTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfQURDX0FXRF9ESVNBQkxFKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgaWYgKHBBbmFsb2dXREdDb25maWctPldhdGNoZG9nTnVtYmVyID09IEFEQ19BTkFMT0dXQVRDSERPR18yKSB7CisgICAgICAgIC8qIFVwZGF0ZSBzdGF0ZSwgY2xlYXIgcHJldmlvdXMgcmVzdWx0IHJlbGF0ZWQgdG8gQVdEMiAqLworICAgICAgICBDTEVBUl9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfQVdEMik7CisKKyAgICAgICAgLyogQ2xlYXIgZmxhZyBBREMgYW5hbG9nIHdhdGNoZG9nICovCisgICAgICAgIC8qIE5vdGU6IEZsYWcgY2xlYXJlZCBDbGVhciB0aGUgQURDIEFuYWxvZyB3YXRjaGRvZyBmbGFnIHRvIGJlIHJlYWR5ICAqLworICAgICAgICAvKiB0byB1c2UgZm9yIEhBTF9BRENfSVJRSGFuZGxlcigpIG9yIEhBTF9BRENfUG9sbEZvckV2ZW50KCkgICAgICAgICAgKi8KKyAgICAgICAgLyogKGluIGNhc2UgbGVmdCBlbmFibGVkIGJ5IHByZXZpb3VzIEFEQyBvcGVyYXRpb25zKS4gICAgICAgICAgICAgICAgICovCisgICAgICAgIExMX0FEQ19DbGVhckZsYWdfQVdEMihoYWRjLT5JbnN0YW5jZSk7CisKKyAgICAgICAgLyogQ29uZmlndXJlIEFEQyBhbmFsb2cgd2F0Y2hkb2cgaW50ZXJydXB0ICovCisgICAgICAgIGlmIChwQW5hbG9nV0RHQ29uZmlnLT5JVE1vZGUgPT0gRU5BQkxFKSB7CisgICAgICAgICAgTExfQURDX0VuYWJsZUlUX0FXRDIoaGFkYy0+SW5zdGFuY2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIExMX0FEQ19EaXNhYmxlSVRfQVdEMihoYWRjLT5JbnN0YW5jZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8qIChwQW5hbG9nV0RHQ29uZmlnLT5XYXRjaGRvZ051bWJlciA9PSBBRENfQU5BTE9HV0FUQ0hET0dfMykgKi8KKyAgICAgIGVsc2UgeworICAgICAgICAvKiBVcGRhdGUgc3RhdGUsIGNsZWFyIHByZXZpb3VzIHJlc3VsdCByZWxhdGVkIHRvIEFXRDMgKi8KKyAgICAgICAgQ0xFQVJfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0FXRDMpOworCisgICAgICAgIC8qIENsZWFyIGZsYWcgQURDIGFuYWxvZyB3YXRjaGRvZyAqLworICAgICAgICAvKiBOb3RlOiBGbGFnIGNsZWFyZWQgQ2xlYXIgdGhlIEFEQyBBbmFsb2cgd2F0Y2hkb2cgZmxhZyB0byBiZSByZWFkeSAgKi8KKyAgICAgICAgLyogdG8gdXNlIGZvciBIQUxfQURDX0lSUUhhbmRsZXIoKSBvciBIQUxfQURDX1BvbGxGb3JFdmVudCgpICAgICAgICAgICovCisgICAgICAgIC8qIChpbiBjYXNlIGxlZnQgZW5hYmxlZCBieSBwcmV2aW91cyBBREMgb3BlcmF0aW9ucykuICAgICAgICAgICAgICAgICAqLworICAgICAgICBMTF9BRENfQ2xlYXJGbGFnX0FXRDMoaGFkYy0+SW5zdGFuY2UpOworCisgICAgICAgIC8qIENvbmZpZ3VyZSBBREMgYW5hbG9nIHdhdGNoZG9nIGludGVycnVwdCAqLworICAgICAgICBpZiAocEFuYWxvZ1dER0NvbmZpZy0+SVRNb2RlID09IEVOQUJMRSkgeworICAgICAgICAgIExMX0FEQ19FbmFibGVJVF9BV0QzKGhhZGMtPkluc3RhbmNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBMTF9BRENfRGlzYWJsZUlUX0FXRDMoaGFkYy0+SW5zdGFuY2UpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogQW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZHMgY29uZmlndXJhdGlvbiAqLworICBpZiAocEFuYWxvZ1dER0NvbmZpZy0+V2F0Y2hkb2dOdW1iZXIgPT0gQURDX0FOQUxPR1dBVENIRE9HXzEpIHsKKyAgICAvKiBTaGlmdCB0aGUgb2Zmc2V0IHdpdGggcmVzcGVjdCB0byB0aGUgc2VsZWN0ZWQgQURDIHJlc29sdXRpb246ICAgICAgICAqLworICAgIC8qIFRocmVzaG9sZHMgaGF2ZSB0byBiZSBsZWZ0LWFsaWduZWQgb24gYml0IDExLCB0aGUgTFNCIChyaWdodCBiaXRzKSAgICovCisgICAgLyogYXJlIHNldCB0byAwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB0bXBfYXdkX2hpZ2hfdGhyZXNob2xkX3NoaWZ0ZWQgPSBBRENfQVdEMVRIUkVTSE9MRF9TSElGVF9SRVNPTFVUSU9OKAorICAgICAgICBoYWRjLCBwQW5hbG9nV0RHQ29uZmlnLT5IaWdoVGhyZXNob2xkKTsKKyAgICB0bXBfYXdkX2xvd190aHJlc2hvbGRfc2hpZnRlZCA9IEFEQ19BV0QxVEhSRVNIT0xEX1NISUZUX1JFU09MVVRJT04oCisgICAgICAgIGhhZGMsIHBBbmFsb2dXREdDb25maWctPkxvd1RocmVzaG9sZCk7CisgIH0KKyAgLyogQ2FzZSBvZiBBRENfQU5BTE9HV0FUQ0hET0dfMiBhbmQgQURDX0FOQUxPR1dBVENIRE9HXzMgKi8KKyAgZWxzZSB7CisgICAgLyogU2hpZnQgdGhlIG9mZnNldCB3aXRoIHJlc3BlY3QgdG8gdGhlIHNlbGVjdGVkIEFEQyByZXNvbHV0aW9uOiAgICAgICAgKi8KKyAgICAvKiBUaHJlc2hvbGRzIGhhdmUgdG8gYmUgbGVmdC1hbGlnbmVkIG9uIGJpdCA3LCB0aGUgTFNCIChyaWdodCBiaXRzKSAgICAqLworICAgIC8qIGFyZSBzZXQgdG8gMC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgdG1wX2F3ZF9oaWdoX3RocmVzaG9sZF9zaGlmdGVkID0gQURDX0FXRDIzVEhSRVNIT0xEX1NISUZUX1JFU09MVVRJT04oCisgICAgICAgIGhhZGMsIHBBbmFsb2dXREdDb25maWctPkhpZ2hUaHJlc2hvbGQpOworICAgIHRtcF9hd2RfbG93X3RocmVzaG9sZF9zaGlmdGVkID0gQURDX0FXRDIzVEhSRVNIT0xEX1NISUZUX1JFU09MVVRJT04oCisgICAgICAgIGhhZGMsIHBBbmFsb2dXREdDb25maWctPkxvd1RocmVzaG9sZCk7CisgIH0KKworICAvKiBTZXQgQURDIGFuYWxvZyB3YXRjaGRvZyB0aHJlc2hvbGRzIHZhbHVlIG9mIGJvdGggdGhyZXNob2xkcyBoaWdoIGFuZCBsb3cgKi8KKyAgTExfQURDX0NvbmZpZ0FuYWxvZ1dEVGhyZXNob2xkcygKKyAgICAgIGhhZGMtPkluc3RhbmNlLCBwQW5hbG9nV0RHQ29uZmlnLT5XYXRjaGRvZ051bWJlciwKKyAgICAgIHRtcF9hd2RfaGlnaF90aHJlc2hvbGRfc2hpZnRlZCwgdG1wX2F3ZF9sb3dfdGhyZXNob2xkX3NoaWZ0ZWQpOworCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhhZGMpOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHRtcF9oYWxfc3RhdHVzOworfQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBBRENfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNCBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucworICAqICBAYnJpZWYgICAgQURDIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgc3RhdGUgYW5kIGVycm9ycyBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgdG8gZ2V0IGluIHJ1bi10aW1lIHRoZSBzdGF0dXMgb2YgdGhlCisgICAgcGVyaXBoZXJhbC4KKyAgICAgICgrKSBDaGVjayB0aGUgQURDIHN0YXRlCisgICAgICAoKykgQ2hlY2sgdGhlIEFEQyBlcnJvciBjb2RlCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICogQGJyaWVmICBSZXR1cm4gdGhlIEFEQyBoYW5kbGUgc3RhdGUuCisgKiBAbm90ZSAgIEFEQyBzdGF0ZSBtYWNoaW5lIGlzIG1hbmFnZWQgYnkgYml0ZmllbGRzLCBBREMgc3RhdHVzIG11c3QgYmUKKyAqICAgICAgICAgY29tcGFyZWQgd2l0aCBzdGF0ZXMgYml0cy4KKyAqICAgICAgICAgRm9yIGV4YW1wbGU6CisgKiAgICAgICAgICAgIiBpZiAoKEhBTF9BRENfR2V0U3RhdGUoaGFkYzEpICYgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSkgIT0gMFVMKSAiCisgKiAgICAgICAgICAgIiBpZiAoKEhBTF9BRENfR2V0U3RhdGUoaGFkYzEpICYgSEFMX0FEQ19TVEFURV9BV0QxKSAhPSAwVUwpICIKKyAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUKKyAqIEByZXR2YWwgQURDIGhhbmRsZSBzdGF0ZSAoYml0ZmllbGQgb24gMzIgYml0cykKKyAqLwordWludDMyX3QgSEFMX0FEQ19HZXRTdGF0ZShjb25zdCBBRENfSGFuZGxlVHlwZURlZiAqaGFkYykgeworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworCisgIC8qIFJldHVybiBBREMgaGFuZGxlIHN0YXRlICovCisgIHJldHVybiBoYWRjLT5TdGF0ZTsKK30KKworLyoqCisgKiBAYnJpZWYgIFJldHVybiB0aGUgQURDIGVycm9yIGNvZGUuCisgKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlCisgKiBAcmV0dmFsIEFEQyBlcnJvciBjb2RlIChiaXRmaWVsZCBvbiAzMiBiaXRzKQorICovCit1aW50MzJfdCBIQUxfQURDX0dldEVycm9yKGNvbnN0IEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKSB7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7CisKKyAgcmV0dXJuIGhhZGMtPkVycm9yQ29kZTsKK30KKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEFEQ19Qcml2YXRlX0Z1bmN0aW9ucyBBREMgUHJpdmF0ZSBGdW5jdGlvbnMKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgIFN0b3AgQURDIGNvbnZlcnNpb24uCisgKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlCisgKiBAcGFyYW0gQ29udmVyc2lvbkdyb3VwIEFEQyBncm91cCByZWd1bGFyIGFuZC9vciBpbmplY3RlZC4KKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfUkVHVUxBUl9HUk9VUCAgICAgICAgICAgQURDIHJlZ3VsYXIgY29udmVyc2lvbiB0eXBlLgorICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0lOSkVDVEVEX0dST1VQICAgICAgICAgIEFEQyBpbmplY3RlZCBjb252ZXJzaW9uCisgKiB0eXBlLgorICogICAgICAgICAgICBAYXJnIEByZWYgQURDX1JFR1VMQVJfSU5KRUNURURfR1JPVVAgIEFEQyByZWd1bGFyIGFuZCBpbmplY3RlZAorICogY29udmVyc2lvbiB0eXBlLgorICogQHJldHZhbCBIQUwgc3RhdHVzLgorICovCitIQUxfU3RhdHVzVHlwZURlZiBBRENfQ29udmVyc2lvblN0b3AoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ29udmVyc2lvbkdyb3VwKSB7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKyAgdWludDMyX3QgQ29udmVyc2lvbl9UaW1lb3V0X0NQVV9jeWNsZXMgPSAwVUw7CisgIHVpbnQzMl90IGNvbnZlcnNpb25fZ3JvdXBfcmVhc3NpZ25lZCA9IENvbnZlcnNpb25Hcm91cDsKKyAgdWludDMyX3QgdG1wX0FEQ19DUl9BRFNUQVJUX0pBRFNUQVJUOworICB1aW50MzJfdCB0bXBfYWRjX2lzX2NvbnZlcnNpb25fb25fZ29pbmdfcmVndWxhcjsKKyAgdWludDMyX3QgdG1wX2FkY19pc19jb252ZXJzaW9uX29uX2dvaW5nX2luamVjdGVkOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19BRENfQ09OVkVSU0lPTl9HUk9VUChDb252ZXJzaW9uR3JvdXApKTsKKworICAvKiBWZXJpZmljYXRpb24gaWYgQURDIGlzIG5vdCBhbHJlYWR5IHN0b3BwZWQgKG9uIHJlZ3VsYXIgYW5kIGluamVjdGVkICAgICAgKi8KKyAgLyogZ3JvdXBzKSB0byBieXBhc3MgdGhpcyBmdW5jdGlvbiBpZiBub3QgbmVlZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHRtcF9hZGNfaXNfY29udmVyc2lvbl9vbl9nb2luZ19yZWd1bGFyID0KKyAgICAgIExMX0FEQ19SRUdfSXNDb252ZXJzaW9uT25nb2luZyhoYWRjLT5JbnN0YW5jZSk7CisgIHRtcF9hZGNfaXNfY29udmVyc2lvbl9vbl9nb2luZ19pbmplY3RlZCA9CisgICAgICBMTF9BRENfSU5KX0lzQ29udmVyc2lvbk9uZ29pbmcoaGFkYy0+SW5zdGFuY2UpOworICBpZiAoKHRtcF9hZGNfaXNfY29udmVyc2lvbl9vbl9nb2luZ19yZWd1bGFyICE9IDBVTCkgfHwKKyAgICAgICh0bXBfYWRjX2lzX2NvbnZlcnNpb25fb25fZ29pbmdfaW5qZWN0ZWQgIT0gMFVMKSkgeworICAgIC8qIFBhcnRpY3VsYXIgY2FzZSBvZiBjb250aW51b3VzIGF1dG8taW5qZWN0aW9uIG1vZGUgY29tYmluZWQgd2l0aCAgICAgICAgKi8KKyAgICAvKiBhdXRvLWRlbGF5IG1vZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogSW4gYXV0by1pbmplY3Rpb24gbW9kZSwgcmVndWxhciBncm91cCBzdG9wIEFEQ19DUl9BRFNUUCBpcyB1c2VkIChub3QgICAqLworICAgIC8qIGluamVjdGVkIGdyb3VwIHN0b3AgQURDX0NSX0pBRFNUUCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBQcm9jZWR1cmUgdG8gYmUgZm9sbG93ZWQ6IFdhaXQgdW50aWwgSkVPUz0xLCBjbGVhciBKRU9TLCBzZXQgQURTVFA9MSAgICovCisgICAgLyogKHNlZSByZWZlcmVuY2UgbWFudWFsKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmICgoKGhhZGMtPkluc3RhbmNlLT5DRkdSICYgQURDX0NGR1JfSkFVVE8pICE9IDBVTCkgJiYKKyAgICAgICAgKGhhZGMtPkluaXQuQ29udGludW91c0NvbnZNb2RlID09IEVOQUJMRSkgJiYKKyAgICAgICAgKGhhZGMtPkluaXQuTG93UG93ZXJBdXRvV2FpdCA9PSBFTkFCTEUpKSB7CisgICAgICAvKiBVc2Ugc3RvcCBvZiByZWd1bGFyIGdyb3VwICovCisgICAgICBjb252ZXJzaW9uX2dyb3VwX3JlYXNzaWduZWQgPSBBRENfUkVHVUxBUl9HUk9VUDsKKworICAgICAgLyogV2FpdCB1bnRpbCBKRU9TPTEgKG1heGltdW0gVGltZW91dDogNCBpbmplY3RlZCBjb252ZXJzaW9ucykgKi8KKyAgICAgIHdoaWxlIChfX0hBTF9BRENfR0VUX0ZMQUcoaGFkYywgQURDX0ZMQUdfSkVPUykgPT0gMFVMKSB7CisgICAgICAgIGlmIChDb252ZXJzaW9uX1RpbWVvdXRfQ1BVX2N5Y2xlcyA+PQorICAgICAgICAgICAgKEFEQ19DT05WRVJTSU9OX1RJTUVfTUFYX0NQVV9DWUNMRVMgKiA0VUwpKSB7CisgICAgICAgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lIHRvIGVycm9yICovCisgICAgICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9JTlRFUk5BTCk7CisKKyAgICAgICAgICAvKiBTZXQgQURDIGVycm9yIGNvZGUgdG8gQURDIHBlcmlwaGVyYWwgaW50ZXJuYWwgZXJyb3IgKi8KKyAgICAgICAgICBTRVRfQklUKGhhZGMtPkVycm9yQ29kZSwgSEFMX0FEQ19FUlJPUl9JTlRFUk5BTCk7CisKKyAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgICB9CisgICAgICAgIENvbnZlcnNpb25fVGltZW91dF9DUFVfY3ljbGVzKys7CisgICAgICB9CisKKyAgICAgIC8qIENsZWFyIEpFT1MgKi8KKyAgICAgIF9fSEFMX0FEQ19DTEVBUl9GTEFHKGhhZGMsIEFEQ19GTEFHX0pFT1MpOworICAgIH0KKworICAgIC8qIFN0b3AgcG90ZW50aWFsIGNvbnZlcnNpb24gb24gZ29pbmcgb24gQURDIGdyb3VwIHJlZ3VsYXIgKi8KKyAgICBpZiAoY29udmVyc2lvbl9ncm91cF9yZWFzc2lnbmVkICE9IEFEQ19JTkpFQ1RFRF9HUk9VUCkgeworICAgICAgLyogU29mdHdhcmUgaXMgYWxsb3dlZCB0byBzZXQgQURTVFAgb25seSB3aGVuIEFEU1RBUlQ9MSBhbmQgQURESVM9MCAqLworICAgICAgaWYgKExMX0FEQ19SRUdfSXNDb252ZXJzaW9uT25nb2luZyhoYWRjLT5JbnN0YW5jZSkgIT0gMFVMKSB7CisgICAgICAgIGlmIChMTF9BRENfSXNEaXNhYmxlT25nb2luZyhoYWRjLT5JbnN0YW5jZSkgPT0gMFVMKSB7CisgICAgICAgICAgLyogU3RvcCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uICovCisgICAgICAgICAgTExfQURDX1JFR19TdG9wQ29udmVyc2lvbihoYWRjLT5JbnN0YW5jZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBTdG9wIHBvdGVudGlhbCBjb252ZXJzaW9uIG9uIGdvaW5nIG9uIEFEQyBncm91cCBpbmplY3RlZCAqLworICAgIGlmIChjb252ZXJzaW9uX2dyb3VwX3JlYXNzaWduZWQgIT0gQURDX1JFR1VMQVJfR1JPVVApIHsKKyAgICAgIC8qIFNvZnR3YXJlIGlzIGFsbG93ZWQgdG8gc2V0IEpBRFNUUCBvbmx5IHdoZW4gSkFEU1RBUlQ9MSBhbmQgQURESVM9MCAqLworICAgICAgaWYgKExMX0FEQ19JTkpfSXNDb252ZXJzaW9uT25nb2luZyhoYWRjLT5JbnN0YW5jZSkgIT0gMFVMKSB7CisgICAgICAgIGlmIChMTF9BRENfSXNEaXNhYmxlT25nb2luZyhoYWRjLT5JbnN0YW5jZSkgPT0gMFVMKSB7CisgICAgICAgICAgLyogU3RvcCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiAqLworICAgICAgICAgIExMX0FEQ19JTkpfU3RvcENvbnZlcnNpb24oaGFkYy0+SW5zdGFuY2UpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLyogU2VsZWN0aW9uIG9mIHN0YXJ0IGFuZCBzdG9wIGJpdHMgd2l0aCByZXNwZWN0IHRvIHRoZSByZWd1bGFyIG9yIGluamVjdGVkCisgICAgICogZ3JvdXAgKi8KKyAgICBzd2l0Y2ggKGNvbnZlcnNpb25fZ3JvdXBfcmVhc3NpZ25lZCkgeworICAgICAgY2FzZSBBRENfUkVHVUxBUl9JTkpFQ1RFRF9HUk9VUDoKKyAgICAgICAgdG1wX0FEQ19DUl9BRFNUQVJUX0pBRFNUQVJUID0gKEFEQ19DUl9BRFNUQVJUIHwgQURDX0NSX0pBRFNUQVJUKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEFEQ19JTkpFQ1RFRF9HUk9VUDoKKyAgICAgICAgdG1wX0FEQ19DUl9BRFNUQVJUX0pBRFNUQVJUID0gQURDX0NSX0pBRFNUQVJUOworICAgICAgICBicmVhazsKKyAgICAgIC8qIENhc2UgQURDX1JFR1VMQVJfR1JPVVAgb25seSovCisgICAgICBkZWZhdWx0OgorICAgICAgICB0bXBfQURDX0NSX0FEU1RBUlRfSkFEU1RBUlQgPSBBRENfQ1JfQURTVEFSVDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogV2FpdCBmb3IgY29udmVyc2lvbiBlZmZlY3RpdmVseSBzdG9wcGVkICovCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgIHdoaWxlICgoaGFkYy0+SW5zdGFuY2UtPkNSICYgdG1wX0FEQ19DUl9BRFNUQVJUX0pBRFNUQVJUKSAhPSAwVUwpIHsKKyAgICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBBRENfU1RPUF9DT05WRVJTSU9OX1RJTUVPVVQpIHsKKyAgICAgICAgLyogTmV3IGNoZWNrIHRvIGF2b2lkIGZhbHNlIHRpbWVvdXQgZGV0ZWN0aW9uIGluIGNhc2Ugb2YgcHJlZW1wdGlvbiAqLworICAgICAgICBpZiAoKGhhZGMtPkluc3RhbmNlLT5DUiAmIHRtcF9BRENfQ1JfQURTVEFSVF9KQURTVEFSVCkgIT0gMFVMKSB7CisgICAgICAgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lIHRvIGVycm9yICovCisgICAgICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9JTlRFUk5BTCk7CisKKyAgICAgICAgICAvKiBTZXQgQURDIGVycm9yIGNvZGUgdG8gQURDIHBlcmlwaGVyYWwgaW50ZXJuYWwgZXJyb3IgKi8KKyAgICAgICAgICBTRVRfQklUKGhhZGMtPkVycm9yQ29kZSwgSEFMX0FEQ19FUlJPUl9JTlRFUk5BTCk7CisKKyAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogUmV0dXJuIEhBTCBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSB0aGUgc2VsZWN0ZWQgQURDLgorICogQG5vdGUgICBQcmVyZXF1aXNpdGUgY29uZGl0aW9uIHRvIHVzZSB0aGlzIGZ1bmN0aW9uOiBBREMgbXVzdCBiZSBkaXNhYmxlZAorICogICAgICAgICBhbmQgdm9sdGFnZSByZWd1bGF0b3IgbXVzdCBiZSBlbmFibGVkIChkb25lIGludG8gSEFMX0FEQ19Jbml0KCkpLgorICogQHBhcmFtIGhhZGMgQURDIGhhbmRsZQorICogQHJldHZhbCBIQUwgc3RhdHVzLgorICovCitIQUxfU3RhdHVzVHlwZURlZiBBRENfRW5hYmxlKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKSB7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKyAgX19JTyB1aW50MzJfdCB3YWl0X2xvb3BfaW5kZXggPSAwVUw7CisKKyAgLyogQURDIGVuYWJsZSBhbmQgd2FpdCBmb3IgQURDIHJlYWR5IChpbiBjYXNlIG9mIEFEQyBpcyBkaXNhYmxlZCBvciAgICAgICAgICovCisgIC8qIGVuYWJsaW5nIHBoYXNlIG5vdCB5ZXQgY29tcGxldGVkOiBmbGFnIEFEQyByZWFkeSBub3QgeWV0IHNldCkuICAgICAgICAgICAqLworICAvKiBUaW1lb3V0IGltcGxlbWVudGVkIHRvIG5vdCBiZSBzdHVjayBpZiBBREMgY2Fubm90IGJlIGVuYWJsZWQgKHBvc3NpYmxlICAgKi8KKyAgLyogY2F1c2VzOiBBREMgY2xvY2sgbm90IHJ1bm5pbmcsIC4uLikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIGlmIChMTF9BRENfSXNFbmFibGVkKGhhZGMtPkluc3RhbmNlKSA9PSAwVUwpIHsKKyAgICAvKiBDaGVjayBpZiBjb25kaXRpb25zIHRvIGVuYWJsZSB0aGUgQURDIGFyZSBmdWxmaWxsZWQgKi8KKyAgICBpZiAoKGhhZGMtPkluc3RhbmNlLT5DUiAmCisgICAgICAgICAoQURDX0NSX0FEQ0FMIHwgQURDX0NSX0pBRFNUUCB8IEFEQ19DUl9BRFNUUCB8IEFEQ19DUl9KQURTVEFSVCB8CisgICAgICAgICAgQURDX0NSX0FEU1RBUlQgfCBBRENfQ1JfQURESVMgfCBBRENfQ1JfQURFTikpICE9IDBVTCkgeworICAgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lIHRvIGVycm9yICovCisgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0VSUk9SX0lOVEVSTkFMKTsKKworICAgICAgLyogU2V0IEFEQyBlcnJvciBjb2RlIHRvIEFEQyBwZXJpcGhlcmFsIGludGVybmFsIGVycm9yICovCisgICAgICBTRVRfQklUKGhhZGMtPkVycm9yQ29kZSwgSEFMX0FEQ19FUlJPUl9JTlRFUk5BTCk7CisKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogRW5hYmxlIHRoZSBBREMgcGVyaXBoZXJhbCAqLworICAgIExMX0FEQ19FbmFibGUoaGFkYy0+SW5zdGFuY2UpOworCisgICAgaWYgKChMTF9BRENfR2V0Q29tbW9uUGF0aEludGVybmFsQ2goCisgICAgICAgICAgICAgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSkgJgorICAgICAgICAgTExfQURDX1BBVEhfSU5URVJOQUxfVEVNUFNFTlNPUikgIT0gMFVMKSB7CisgICAgICAvKiBEZWxheSBmb3IgdGVtcGVyYXR1cmUgc2Vuc29yIGJ1ZmZlciBzdGFiaWxpemF0aW9uIHRpbWUgKi8KKyAgICAgIC8qIE5vdGU6IFZhbHVlIExMX0FEQ19ERUxBWV9URU1QU0VOU09SX1NUQUJfVVMgdXNlZCBpbnN0ZWFkIG9mICAgICAgKi8KKyAgICAgIC8qICAgICAgIExMX0FEQ19ERUxBWV9URU1QU0VOU09SX0JVRkZFUl9TVEFCX1VTIGJlY2F1c2UgbmVlZGVkICAgICAgKi8KKyAgICAgIC8qICAgICAgIGluIGNhc2Ugb2YgQURDIGVuYWJsZSBhZnRlciBhIHN5c3RlbSB3YWtlIHVwICAgICAgICAgICAgICAgKi8KKyAgICAgIC8qICAgICAgIGZyb20gbG93IHBvd2VyIG1vZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgICAgLyogV2FpdCBsb29wIGluaXRpYWxpemF0aW9uIGFuZCBleGVjdXRpb24gKi8KKyAgICAgIC8qIE5vdGU6IFZhcmlhYmxlIGRpdmlkZWQgYnkgMiB0byBjb21wZW5zYXRlIHBhcnRpYWxseSAgICAgICAgICAgICAgKi8KKyAgICAgIC8qICAgICAgIENQVSBwcm9jZXNzaW5nIGN5Y2xlcywgc2NhbGluZyBpbiB1cyBzcGxpdCB0byBub3QgICAgICAgICAgKi8KKyAgICAgIC8qICAgICAgIGV4Y2VlZCAzMiBiaXRzIHJlZ2lzdGVyIGNhcGFjaXR5IGFuZCBoYW5kbGUgbG93IGZyZXF1ZW5jeS4gKi8KKyAgICAgIHdhaXRfbG9vcF9pbmRleCA9ICgoTExfQURDX0RFTEFZX1RFTVBTRU5TT1JfU1RBQl9VUyAvIDEwVUwpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKFN5c3RlbUNvcmVDbG9jayAvICgxMDAwMDBVTCAqIDJVTCkpICsgMVVMKSk7CisgICAgICB3aGlsZSAod2FpdF9sb29wX2luZGV4ICE9IDBVTCkgeworICAgICAgICB3YWl0X2xvb3BfaW5kZXgtLTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBXYWl0IGZvciBBREMgZWZmZWN0aXZlbHkgZW5hYmxlZCAqLworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICB3aGlsZSAoX19IQUxfQURDX0dFVF9GTEFHKGhhZGMsIEFEQ19GTEFHX1JEWSkgPT0gMFVMKSB7CisgICAgICAvKiAgSWYgQURFTiBiaXQgaXMgc2V0IGxlc3MgdGhhbiA0IEFEQyBjbG9jayBjeWNsZXMgYWZ0ZXIgdGhlIEFEQ0FMIGJpdAorICAgICAgICAgIGhhcyBiZWVuIGNsZWFyZWQgKGFmdGVyIGEgY2FsaWJyYXRpb24pLCBBREVOIGJpdCBpcyByZXNldCBieSB0aGUKKyAgICAgICAgICBjYWxpYnJhdGlvbiBsb2dpYy4KKyAgICAgICAgICBUaGUgd29ya2Fyb3VuZCBpcyB0byBjb250aW51ZSBzZXR0aW5nIEFERU4gdW50aWwgQURSRFkgaXMgYmVjb21lcyAxLgorICAgICAgICAgIEFkZGl0aW9uYWxseSwgQURDX0VOQUJMRV9USU1FT1VUIGlzIGRlZmluZWQgdG8gZW5jb21wYXNzIHRoaXMKKyAgICAgICAgICA0IEFEQyBjbG9jayBjeWNsZSBkdXJhdGlvbiAqLworICAgICAgLyogTm90ZTogVGVzdCBvZiBBREMgZW5hYmxlZCByZXF1aXJlZCBkdWUgdG8gaGFyZHdhcmUgY29uc3RyYWludCB0byAgICAgKi8KKyAgICAgIC8qICAgICAgIG5vdCBlbmFibGUgQURDIGlmIGFscmVhZHkgZW5hYmxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICBpZiAoTExfQURDX0lzRW5hYmxlZChoYWRjLT5JbnN0YW5jZSkgPT0gMFVMKSB7CisgICAgICAgIExMX0FEQ19FbmFibGUoaGFkYy0+SW5zdGFuY2UpOworICAgICAgfQorCisgICAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gQURDX0VOQUJMRV9USU1FT1VUKSB7CisgICAgICAgIC8qIE5ldyBjaGVjayB0byBhdm9pZCBmYWxzZSB0aW1lb3V0IGRldGVjdGlvbiBpbiBjYXNlIG9mIHByZWVtcHRpb24gKi8KKyAgICAgICAgaWYgKF9fSEFMX0FEQ19HRVRfRkxBRyhoYWRjLCBBRENfRkxBR19SRFkpID09IDBVTCkgeworICAgICAgICAgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSB0byBlcnJvciAqLworICAgICAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfRVJST1JfSU5URVJOQUwpOworCisgICAgICAgICAgLyogU2V0IEFEQyBlcnJvciBjb2RlIHRvIEFEQyBwZXJpcGhlcmFsIGludGVybmFsIGVycm9yICovCisgICAgICAgICAgU0VUX0JJVChoYWRjLT5FcnJvckNvZGUsIEhBTF9BRENfRVJST1JfSU5URVJOQUwpOworCisgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIFJldHVybiBIQUwgc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIHRoZSBzZWxlY3RlZCBBREMuCisgKiBAbm90ZSAgIFByZXJlcXVpc2l0ZSBjb25kaXRpb24gdG8gdXNlIHRoaXMgZnVuY3Rpb246IEFEQyBjb252ZXJzaW9ucyBtdXN0IGJlCisgKiAgICAgICAgIHN0b3BwZWQuCisgKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMuCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEFEQ19EaXNhYmxlKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKSB7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKyAgY29uc3QgdWludDMyX3QgdG1wX2FkY19pc19kaXNhYmxlX29uX2dvaW5nID0KKyAgICAgIExMX0FEQ19Jc0Rpc2FibGVPbmdvaW5nKGhhZGMtPkluc3RhbmNlKTsKKworICAvKiBWZXJpZmljYXRpb24gaWYgQURDIGlzIG5vdCBhbHJlYWR5IGRpc2FibGVkOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogTm90ZTogZm9yYmlkZGVuIHRvIGRpc2FibGUgQURDIChzZXQgYml0IEFEQ19DUl9BRERJUykgaWYgQURDIGlzIGFscmVhZHkgICovCisgIC8qICAgICAgIGRpc2FibGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpZiAoKExMX0FEQ19Jc0VuYWJsZWQoaGFkYy0+SW5zdGFuY2UpICE9IDBVTCkgJiYKKyAgICAgICh0bXBfYWRjX2lzX2Rpc2FibGVfb25fZ29pbmcgPT0gMFVMKSkgeworICAgIC8qIENoZWNrIGlmIGNvbmRpdGlvbnMgdG8gZGlzYWJsZSB0aGUgQURDIGFyZSBmdWxmaWxsZWQgKi8KKyAgICBpZiAoKGhhZGMtPkluc3RhbmNlLT5DUiAmCisgICAgICAgICAoQURDX0NSX0pBRFNUQVJUIHwgQURDX0NSX0FEU1RBUlQgfCBBRENfQ1JfQURFTikpID09IEFEQ19DUl9BREVOKSB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBBREMgcGVyaXBoZXJhbCAqLworICAgICAgTExfQURDX0Rpc2FibGUoaGFkYy0+SW5zdGFuY2UpOworICAgICAgX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgKEFEQ19GTEFHX0VPU01QIHwgQURDX0ZMQUdfUkRZKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSB0byBlcnJvciAqLworICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9JTlRFUk5BTCk7CisKKyAgICAgIC8qIFNldCBBREMgZXJyb3IgY29kZSB0byBBREMgcGVyaXBoZXJhbCBpbnRlcm5hbCBlcnJvciAqLworICAgICAgU0VUX0JJVChoYWRjLT5FcnJvckNvZGUsIEhBTF9BRENfRVJST1JfSU5URVJOQUwpOworCisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIFdhaXQgZm9yIEFEQyBlZmZlY3RpdmVseSBkaXNhYmxlZCAqLworICAgIC8qIEdldCB0aWNrIGNvdW50ICovCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgIHdoaWxlICgoaGFkYy0+SW5zdGFuY2UtPkNSICYgQURDX0NSX0FERU4pICE9IDBVTCkgeworICAgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IEFEQ19ESVNBQkxFX1RJTUVPVVQpIHsKKyAgICAgICAgLyogTmV3IGNoZWNrIHRvIGF2b2lkIGZhbHNlIHRpbWVvdXQgZGV0ZWN0aW9uIGluIGNhc2Ugb2YgcHJlZW1wdGlvbiAqLworICAgICAgICBpZiAoKGhhZGMtPkluc3RhbmNlLT5DUiAmIEFEQ19DUl9BREVOKSAhPSAwVUwpIHsKKyAgICAgICAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gZXJyb3IgKi8KKyAgICAgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0VSUk9SX0lOVEVSTkFMKTsKKworICAgICAgICAgIC8qIFNldCBBREMgZXJyb3IgY29kZSB0byBBREMgcGVyaXBoZXJhbCBpbnRlcm5hbCBlcnJvciAqLworICAgICAgICAgIFNFVF9CSVQoaGFkYy0+RXJyb3JDb2RlLCBIQUxfQURDX0VSUk9SX0lOVEVSTkFMKTsKKworICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBSZXR1cm4gSEFMIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiAgRE1BIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrLgorICogQHBhcmFtIGhkbWEgcG9pbnRlciB0byBETUEgaGFuZGxlLgorICogQHJldHZhbCBOb25lCisgKi8KK3ZvaWQgQURDX0RNQUNvbnZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKSB7CisgIC8qIFJldHJpZXZlIEFEQyBoYW5kbGUgY29ycmVzcG9uZGluZyB0byBjdXJyZW50IERNQSBoYW5kbGUgKi8KKyAgQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMgPQorICAgICAgKEFEQ19IYW5kbGVUeXBlRGVmICopKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQ7CisKKyAgLyogVXBkYXRlIHN0YXRlIG1hY2hpbmUgb24gY29udmVyc2lvbiBzdGF0dXMgaWYgbm90IGluIGVycm9yIHN0YXRlICovCisgIGlmICgoaGFkYy0+U3RhdGUgJgorICAgICAgIChIQUxfQURDX1NUQVRFX0VSUk9SX0lOVEVSTkFMIHwgSEFMX0FEQ19TVEFURV9FUlJPUl9ETUEpKSA9PSAwVUwpIHsKKyAgICAvKiBTZXQgQURDIHN0YXRlICovCisgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9SRUdfRU9DKTsKKworICAgIC8qIERldGVybWluZSB3aGV0aGVyIGFueSBmdXJ0aGVyIGNvbnZlcnNpb24gdXBjb21pbmcgb24gZ3JvdXAgcmVndWxhciAgICAgKi8KKyAgICAvKiBieSBleHRlcm5hbCB0cmlnZ2VyLCBjb250aW51b3VzIG1vZGUgb3Igc2NhbiBzZXF1ZW5jZSBvbiBnb2luZyAgICAgICAgICovCisgICAgLyogdG8gZGlzYWJsZSBpbnRlcnJ1cHRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIElzIGl0IHRoZSBlbmQgb2YgdGhlIHJlZ3VsYXIgc2VxdWVuY2UgPyAqLworICAgIGlmICgoaGFkYy0+SW5zdGFuY2UtPklTUiAmIEFEQ19GTEFHX0VPUykgIT0gMFVMKSB7CisgICAgICAvKiBBcmUgY29udmVyc2lvbnMgc29mdHdhcmUtdHJpZ2dlcmVkID8gKi8KKyAgICAgIGlmIChMTF9BRENfUkVHX0lzVHJpZ2dlclNvdXJjZVNXU3RhcnQoaGFkYy0+SW5zdGFuY2UpICE9IDBVTCkgeworICAgICAgICAvKiBJcyBDT05UIGJpdCBzZXQgPyAqLworICAgICAgICBpZiAoUkVBRF9CSVQoaGFkYy0+SW5zdGFuY2UtPkNGR1IsIEFEQ19DRkdSX0NPTlQpID09IDBVTCkgeworICAgICAgICAgIC8qIENPTlQgYml0IGlzIG5vdCBzZXQsIG5vIG1vcmUgY29udmVyc2lvbnMgZXhwZWN0ZWQgKi8KKyAgICAgICAgICBDTEVBUl9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfUkVHX0JVU1kpOworICAgICAgICAgIGlmICgoaGFkYy0+U3RhdGUgJiBIQUxfQURDX1NUQVRFX0lOSl9CVVNZKSA9PSAwVUwpIHsKKyAgICAgICAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfUkVBRFkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvKiBETUEgRW5kIG9mIFRyYW5zZmVyIGludGVycnVwdCB3YXMgdHJpZ2dlcmVkIGJ1dCBjb252ZXJzaW9ucyBzZXF1ZW5jZQorICAgICAgICAgaXMgbm90IG92ZXIuIElmIERNQUNGRyBpcyBzZXQgdG8gMCwgY29udmVyc2lvbnMgYXJlIHN0b3BwZWQuICovCisgICAgICBpZiAoUkVBRF9CSVQoaGFkYy0+SW5zdGFuY2UtPkNGR1IsIEFEQ19DRkdSX0RNQUNGRykgPT0gMFVMKSB7CisgICAgICAgIC8qIERNQUNGRyBiaXQgaXMgbm90IHNldCwgY29udmVyc2lvbnMgYXJlIHN0b3BwZWQuICovCisgICAgICAgIENMRUFSX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSk7CisgICAgICAgIGlmICgoaGFkYy0+U3RhdGUgJiBIQUxfQURDX1NUQVRFX0lOSl9CVVNZKSA9PSAwVUwpIHsKKyAgICAgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX1JFQURZKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8qIENvbnZlcnNpb24gY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgaGFkYy0+Q29udkNwbHRDYWxsYmFjayhoYWRjKTsKKyNlbHNlCisgICAgSEFMX0FEQ19Db252Q3BsdENhbGxiYWNrKGhhZGMpOworI2VuZGlmICAgLyogVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0gZWxzZSAvKiBETUEgYW5kLW9yIGludGVybmFsIGVycm9yIG9jY3VycmVkICovCisgIHsKKyAgICBpZiAoKGhhZGMtPlN0YXRlICYgSEFMX0FEQ19TVEFURV9FUlJPUl9JTlRFUk5BTCkgIT0gMFVMKSB7CisgICAgICAvKiBDYWxsIEhBTCBBREMgRXJyb3IgQ2FsbGJhY2sgZnVuY3Rpb24gKi8KKyNpZiAoVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICBoYWRjLT5FcnJvckNhbGxiYWNrKGhhZGMpOworI2Vsc2UKKyAgICAgIEhBTF9BRENfRXJyb3JDYWxsYmFjayhoYWRjKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9IGVsc2UgeworICAgICAgLyogQ2FsbCBBREMgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBoYWRjLT5ETUFfSGFuZGxlLT5YZmVyRXJyb3JDYWxsYmFjayhoZG1hKTsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBAYnJpZWYgIERNQSBoYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrLgorICogQHBhcmFtIGhkbWEgcG9pbnRlciB0byBETUEgaGFuZGxlLgorICogQHJldHZhbCBOb25lCisgKi8KK3ZvaWQgQURDX0RNQUhhbGZDb252Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkgeworICAvKiBSZXRyaWV2ZSBBREMgaGFuZGxlIGNvcnJlc3BvbmRpbmcgdG8gY3VycmVudCBETUEgaGFuZGxlICovCisgIEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjID0KKyAgICAgIChBRENfSGFuZGxlVHlwZURlZiAqKSgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50OworCisgIC8qIEhhbGYgY29udmVyc2lvbiBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgaGFkYy0+Q29udkhhbGZDcGx0Q2FsbGJhY2soaGFkYyk7CisjZWxzZQorICBIQUxfQURDX0NvbnZIYWxmQ3BsdENhbGxiYWNrKGhhZGMpOworI2VuZGlmIC8qIFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfQorCisvKioKKyAqIEBicmllZiAgRE1BIGVycm9yIGNhbGxiYWNrLgorICogQHBhcmFtIGhkbWEgcG9pbnRlciB0byBETUEgaGFuZGxlLgorICogQHJldHZhbCBOb25lCisgKi8KK3ZvaWQgQURDX0RNQUVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKSB7CisgIC8qIFJldHJpZXZlIEFEQyBoYW5kbGUgY29ycmVzcG9uZGluZyB0byBjdXJyZW50IERNQSBoYW5kbGUgKi8KKyAgQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMgPQorICAgICAgKEFEQ19IYW5kbGVUeXBlRGVmICopKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQ7CisKKyAgLyogU2V0IEFEQyBzdGF0ZSAqLworICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0VSUk9SX0RNQSk7CisKKyAgLyogU2V0IEFEQyBlcnJvciBjb2RlIHRvIERNQSBlcnJvciAqLworICBTRVRfQklUKGhhZGMtPkVycm9yQ29kZSwgSEFMX0FEQ19FUlJPUl9ETUEpOworCisgIC8qIEVycm9yIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBoYWRjLT5FcnJvckNhbGxiYWNrKGhhZGMpOworI2Vsc2UKKyAgSEFMX0FEQ19FcnJvckNhbGxiYWNrKGhhZGMpOworI2VuZGlmIC8qIFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfQorCisvKioKKyAqIEB9CisgKi8KKworI2VuZGlmIC8qIEhBTF9BRENfTU9EVUxFX0VOQUJMRUQgKi8KKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KZGlmZiAtLWdpdCBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9hZGNfZXguYyBiL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9hZGNfZXguYwppbmRleCA0NmM2ZWU0Li4wNjk1ZDBhIDEwMDY0NAotLS0gYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfYWRjX2V4LmMKKysrIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX2FkY19leC5jCkBAIC0xLDIyNjUgKzEsMjI2NCBAQAotLyoqDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICogQGZpbGUgICAgc3RtMzJnNHh4X2hhbF9hZGNfZXguYw0KLSAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQ0KLSAgKiBAYnJpZWYgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nDQotICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgQW5hbG9nIHRvIERpZ2l0YWwgQ29udmVydGVyIChBREMpDQotICAqICAgICAgICAgIHBlcmlwaGVyYWw6DQotICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMNCi0gICogICAgICAgICAgT3RoZXIgZnVuY3Rpb25zIChnZW5lcmljIGZ1bmN0aW9ucykgYXJlIGF2YWlsYWJsZSBpbiBmaWxlDQotICAqICAgICAgICAgICJzdG0zMmc0eHhfaGFsX2FkYy5jIi4NCi0gICoNCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgKiBAYXR0ZW50aW9uDQotICAqDQotICAqIENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuDQotICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQotICAqDQotICAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGVybXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZQ0KLSAgKiBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb2Z0d2FyZSBjb21wb25lbnQuDQotICAqIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcyB3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLg0KLSAgKg0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICBAdmVyYmF0aW0NCi0gIFsuLl0NCi0gIChAKSBTZWN0aW9ucyAiQURDIHBlcmlwaGVyYWwgZmVhdHVyZXMiIGFuZCAiSG93IHRvIHVzZSB0aGlzIGRyaXZlciIgYXJlDQotICAgICAgYXZhaWxhYmxlIGluIGZpbGUgb2YgZ2VuZXJpYyBmdW5jdGlvbnMgInN0bTMyZzR4eF9oYWxfYWRjLmMiLg0KLSAgWy4uXQ0KLSAgQGVuZHZlcmJhdGltDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICovDQotDQotLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaW5jbHVkZSAic3RtMzJnNHh4X2hhbC5oIg0KLQ0KLS8qKiBAYWRkdG9ncm91cCBTVE0zMkc0eHhfSEFMX0RyaXZlcg0KLSAqIEB7DQotICovDQotDQotLyoqIEBkZWZncm91cCBBRENFeCBBRENFeA0KLSAqIEBicmllZiBBREMgRXh0ZW5kZWQgSEFMIG1vZHVsZSBkcml2ZXINCi0gKiBAew0KLSAqLw0KLQ0KLSNpZmRlZiBIQUxfQURDX01PRFVMRV9FTkFCTEVEDQotDQotLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQURDRXhfUHJpdmF0ZV9Db25zdGFudHMgQURDIEV4dGVuZGVkIFByaXZhdGUgQ29uc3RhbnRzDQotICogQHsNCi0gKi8NCi0NCi0jZGVmaW5lIEFEQ19KU1FSX0ZJRUxEUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKEFEQ19KU1FSX0pMIHwgQURDX0pTUVJfSkVYVFNFTCB8IEFEQ19KU1FSX0pFWFRFTiB8IEFEQ19KU1FSX0pTUTEgfCAgICAgXA0KLSAgICBBRENfSlNRUl9KU1EyIHwgQURDX0pTUVJfSlNRMyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgQURDX0pTUVJfSlNRNCkpIC8qITwgQURDX0pTUVIgZmllbGRzIG9mIHBhcmFtZXRlcnMgdGhhdCBjYW4gYmUgdXBkYXRlZCBcDQotICAgICAgICAgICAgICAgICAgICAgICBhbnl0aW1lIG9uY2UgdGhlIEFEQyBpcyBlbmFibGVkICovDQotDQotLyogRml4ZWQgdGltZW91dCB2YWx1ZSBmb3IgQURDIGNhbGlicmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0vKiBWYWx1ZXMgZGVmaW5lZCB0byBiZSBoaWdoZXIgdGhhbiB3b3JzdCBjYXNlczogbG93IGNsb2NrIGZyZXF1ZW5jeSwgICAgICAgICAqLw0KLS8qIG1heGltdW0gcHJlc2NhbGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotLyogRXggb2YgcHJvZmlsZSBsb3cgZnJlcXVlbmN5IDogZl9BREMgYXQgZl9DUFUvMzk2OCAobWluaW11bSB2YWx1ZSAgICAgICAgICAgKi8NCi0vKiBjb25zaWRlcmluZyBib3RoIHBvc3NpYmxlIEFEQyBjbG9ja2luZyBzY2hlbWU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLS8qICAgICAgICAtIEFEQyBjbG9jayBmcm9tIHN5bmNocm9ub3VzIGNsb2NrIHdpdGggQUhCIHByZXNjYWxlciA1MTIsICAgICAgICAgICovDQotLyogICAgICAgICAgQURDIHByZXNjYWxlciA0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0vKiAgICAgICAgICAgUmF0aW8gbWF4ID0gNTEyICo0ID0gMjA0OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLS8qICAgICAgICAtIEFEQyBjbG9jayBmcm9tIGFzeW5jaHJvbm91cyBjbG9jayAoUExMUCkgd2l0aCBwcmVzY2FsZXIgMjU2LiAgICAgICovDQotLyogICAgICAgICAgSGlnaGVzdCBDUFUgY2xvY2sgUExMIChQTExSKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0vKiAgICAgICAgICAgUmF0aW8gbWF4ID0gUExMUm1heCAvUFBMUG1pbiAqIDI1NiA9IChWQ08vMikgLyAoVkNPLzMxKSAqIDI1NiAgICAqLw0KLS8qICAgICAgICAgICAgICAgICAgICAgPSAzOTY4ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotLyogQ2FsaWJyYXRpb25fdGltZSBNQVggPSA4MSAvIGZfQURDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0vKiAgICAgICAgICAgICAgICAgICAgICA9IDgxIC8gKGZfQ1BVLzM5MzgpID0gMzE4OTc4IENQVSBjeWNsZXMgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgQURDX0NBTElCUkFUSU9OX1RJTUVPVVQgXA0KLSAgKDMxODk3OFVMKSAvKiE8IEFEQyBjYWxpYnJhdGlvbiB0aW1lLW91dCB2YWx1ZSAodW5pdDogQ1BVIGN5Y2xlcykgKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotDQotLyoqIEBkZWZncm91cCBBRENFeF9FeHBvcnRlZF9GdW5jdGlvbnMgQURDIEV4dGVuZGVkIEV4cG9ydGVkIEZ1bmN0aW9ucw0KLSAqIEB7DQotICovDQotDQotLyoqIEBkZWZncm91cCBBRENFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEV4dGVuZGVkIElucHV0IGFuZCBPdXRwdXQNCi1vcGVyYXRpb24gZnVuY3Rpb25zDQotICAqIEBicmllZiAgICBFeHRlbmRlZCBJTyBvcGVyYXRpb24gZnVuY3Rpb25zDQotICAqDQotQHZlcmJhdGltDQotID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAjIyMjIw0KLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86DQotDQotICAgICAgKCspIFBlcmZvcm0gdGhlIEFEQyBzZWxmLWNhbGlicmF0aW9uIGZvciBzaW5nbGUgb3IgZGlmZmVyZW50aWFsIGVuZGluZy4NCi0gICAgICAoKykgR2V0IGNhbGlicmF0aW9uIGZhY3RvcnMgZm9yIHNpbmdsZSBvciBkaWZmZXJlbnRpYWwgZW5kaW5nLg0KLSAgICAgICgrKSBTZXQgY2FsaWJyYXRpb24gZmFjdG9ycyBmb3Igc2luZ2xlIG9yIGRpZmZlcmVudGlhbCBlbmRpbmcuDQotDQotICAgICAgKCspIFN0YXJ0IGNvbnZlcnNpb24gb2YgQURDIGdyb3VwIGluamVjdGVkLg0KLSAgICAgICgrKSBTdG9wIGNvbnZlcnNpb24gb2YgQURDIGdyb3VwIGluamVjdGVkLg0KLSAgICAgICgrKSBQb2xsIGZvciBjb252ZXJzaW9uIGNvbXBsZXRlIG9uIEFEQyBncm91cCBpbmplY3RlZC4NCi0gICAgICAoKykgR2V0IHJlc3VsdCBvZiBBREMgZ3JvdXAgaW5qZWN0ZWQgY2hhbm5lbCBjb252ZXJzaW9uLg0KLSAgICAgICgrKSBTdGFydCBjb252ZXJzaW9uIG9mIEFEQyBncm91cCBpbmplY3RlZCBhbmQgZW5hYmxlIGludGVycnVwdGlvbnMuDQotICAgICAgKCspIFN0b3AgY29udmVyc2lvbiBvZiBBREMgZ3JvdXAgaW5qZWN0ZWQgYW5kIGRpc2FibGUgaW50ZXJydXB0aW9ucy4NCi0NCi0gICAgICAoKykgV2hlbiBtdWx0aW1vZGUgZmVhdHVyZSBpcyBhdmFpbGFibGUsIHN0YXJ0IG11bHRpbW9kZSBhbmQgZW5hYmxlIERNQQ0KLXRyYW5zZmVyLg0KLSAgICAgICgrKSBTdG9wIG11bHRpbW9kZSBhbmQgZGlzYWJsZSBBREMgRE1BIHRyYW5zZmVyLg0KLSAgICAgICgrKSBHZXQgcmVzdWx0IG9mIG11bHRpbW9kZSBjb252ZXJzaW9uLg0KLQ0KLUBlbmR2ZXJiYXRpbQ0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFBlcmZvcm0gYW4gQURDIGF1dG9tYXRpYyBzZWxmLWNhbGlicmF0aW9uDQotICogICAgICAgICBDYWxpYnJhdGlvbiBwcmVyZXF1aXNpdGU6IEFEQyBtdXN0IGJlIGRpc2FibGVkIChleGVjdXRlIHRoaXMNCi0gKiAgICAgICAgIGZ1bmN0aW9uIGJlZm9yZSBIQUxfQURDX1N0YXJ0KCkgb3IgYWZ0ZXIgSEFMX0FEQ19TdG9wKCkgKS4NCi0gKiBAcGFyYW0gIGhhZGMgICAgICAgQURDIGhhbmRsZQ0KLSAqIEBwYXJhbSAgU2luZ2xlRGlmZiBTZWxlY3Rpb24gb2Ygc2luZ2xlLWVuZGVkIG9yIGRpZmZlcmVudGlhbCBpbnB1dA0KLSAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19TSU5HTEVfRU5ERUQgICAgICAgQ2hhbm5lbCBpbiBtb2RlIGlucHV0IHNpbmdsZSBlbmRlZA0KLSAqICAgICAgICAgICBAYXJnIEByZWYgQURDX0RJRkZFUkVOVElBTF9FTkRFRCBDaGFubmVsIGluIG1vZGUgaW5wdXQgZGlmZmVyZW50aWFsDQotICogZW5kZWQNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDRXhfQ2FsaWJyYXRpb25fU3RhcnQoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFNpbmdsZURpZmYpIHsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIHRtcF9oYWxfc3RhdHVzOw0KLSAgX19JTyB1aW50MzJfdCB3YWl0X2xvb3BfaW5kZXggPSAwVUw7DQotDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsNCi0gIGFzc2VydF9wYXJhbShJU19BRENfU0lOR0xFX0RJRkZFUkVOVElBTChTaW5nbGVEaWZmKSk7DQotDQotICAvKiBQcm9jZXNzIGxvY2tlZCAqLw0KLSAgX19IQUxfTE9DSyhoYWRjKTsNCi0NCi0gIC8qIENhbGlicmF0aW9uIHByZXJlcXVpc2l0ZTogQURDIG11c3QgYmUgZGlzYWJsZWQuICovDQotDQotICAvKiBEaXNhYmxlIHRoZSBBREMgKGlmIG5vdCBhbHJlYWR5IGRpc2FibGVkKSAqLw0KLSAgdG1wX2hhbF9zdGF0dXMgPSBBRENfRGlzYWJsZShoYWRjKTsNCi0NCi0gIC8qIENoZWNrIGlmIEFEQyBpcyBlZmZlY3RpdmVseSBkaXNhYmxlZCAqLw0KLSAgaWYgKHRtcF9oYWxfc3RhdHVzID09IEhBTF9PSykgew0KLSAgICAvKiBTZXQgQURDIHN0YXRlICovDQotICAgIEFEQ19TVEFURV9DTFJfU0VUKGhhZGMtPlN0YXRlLA0KLSAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFR19CVVNZIHwgSEFMX0FEQ19TVEFURV9JTkpfQlVTWSwNCi0gICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9CVVNZX0lOVEVSTkFMKTsNCi0NCi0gICAgLyogU3RhcnQgQURDIGNhbGlicmF0aW9uIGluIG1vZGUgc2luZ2xlLWVuZGVkIG9yIGRpZmZlcmVudGlhbCAqLw0KLSAgICBMTF9BRENfU3RhcnRDYWxpYnJhdGlvbihoYWRjLT5JbnN0YW5jZSwgU2luZ2xlRGlmZik7DQotDQotICAgIC8qIFdhaXQgZm9yIGNhbGlicmF0aW9uIGNvbXBsZXRpb24gKi8NCi0gICAgd2hpbGUgKExMX0FEQ19Jc0NhbGlicmF0aW9uT25Hb2luZyhoYWRjLT5JbnN0YW5jZSkgIT0gMFVMKSB7DQotICAgICAgd2FpdF9sb29wX2luZGV4Kys7DQotICAgICAgaWYgKHdhaXRfbG9vcF9pbmRleCA+PSBBRENfQ0FMSUJSQVRJT05fVElNRU9VVCkgew0KLSAgICAgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lIHRvIGVycm9yICovDQotICAgICAgICBBRENfU1RBVEVfQ0xSX1NFVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9CVVNZX0lOVEVSTkFMLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9FUlJPUl9JTlRFUk5BTCk7DQotDQotICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovDQotICAgICAgICBfX0hBTF9VTkxPQ0soaGFkYyk7DQotDQotICAgICAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKiBTZXQgQURDIHN0YXRlICovDQotICAgIEFEQ19TVEFURV9DTFJfU0VUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0JVU1lfSU5URVJOQUwsDQotICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVBRFkpOw0KLSAgfSBlbHNlIHsNCi0gICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9JTlRFUk5BTCk7DQotDQotICAgIC8qIE5vdGU6IE5vIG5lZWQgdG8gdXBkYXRlIHZhcmlhYmxlICJ0bXBfaGFsX3N0YXR1cyIgaGVyZTogYWxyZWFkeSBzZXQgICAgKi8NCi0gICAgLyogICAgICAgdG8gc3RhdGUgIkhBTF9FUlJPUiIgYnkgZnVuY3Rpb24gZGlzYWJsaW5nIHRoZSBBREMuICAgICAgICAgICAgICAqLw0KLSAgfQ0KLQ0KLSAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLw0KLSAgX19IQUxfVU5MT0NLKGhhZGMpOw0KLQ0KLSAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLw0KLSAgcmV0dXJuIHRtcF9oYWxfc3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCB0aGUgY2FsaWJyYXRpb24gZmFjdG9yLg0KLSAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUuDQotICogQHBhcmFtIFNpbmdsZURpZmYgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9ubHk6DQotICogICAgICAgICAgIEBhcmcgQHJlZiBBRENfU0lOR0xFX0VOREVEICAgICAgIENoYW5uZWwgaW4gbW9kZSBpbnB1dCBzaW5nbGUgZW5kZWQNCi0gKiAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19ESUZGRVJFTlRJQUxfRU5ERUQgQ2hhbm5lbCBpbiBtb2RlIGlucHV0IGRpZmZlcmVudGlhbA0KLSAqIGVuZGVkDQotICogQHJldHZhbCBDYWxpYnJhdGlvbiB2YWx1ZS4NCi0gKi8NCi11aW50MzJfdCBIQUxfQURDRXhfQ2FsaWJyYXRpb25fR2V0VmFsdWUoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFNpbmdsZURpZmYpIHsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0FEQ19TSU5HTEVfRElGRkVSRU5USUFMKFNpbmdsZURpZmYpKTsNCi0NCi0gIC8qIFJldHVybiB0aGUgc2VsZWN0ZWQgQURDIGNhbGlicmF0aW9uIHZhbHVlICovDQotICByZXR1cm4gTExfQURDX0dldENhbGlicmF0aW9uRmFjdG9yKGhhZGMtPkluc3RhbmNlLCBTaW5nbGVEaWZmKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZXQgdGhlIGNhbGlicmF0aW9uIGZhY3RvciB0byBvdmVyd3JpdGUgYXV0b21hdGljIGNvbnZlcnNpb24gcmVzdWx0Lg0KLSAqICAgICAgICAgQURDIG11c3QgYmUgZW5hYmxlZCBhbmQgbm8gY29udmVyc2lvbiBpcyBvbmdvaW5nLg0KLSAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUNCi0gKiBAcGFyYW0gU2luZ2xlRGlmZiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25seToNCi0gKiAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19TSU5HTEVfRU5ERUQgICAgICAgQ2hhbm5lbCBpbiBtb2RlIGlucHV0IHNpbmdsZSBlbmRlZA0KLSAqICAgICAgICAgICBAYXJnIEByZWYgQURDX0RJRkZFUkVOVElBTF9FTkRFRCBDaGFubmVsIGluIG1vZGUgaW5wdXQgZGlmZmVyZW50aWFsDQotICogZW5kZWQNCi0gKiBAcGFyYW0gQ2FsaWJyYXRpb25GYWN0b3IgQ2FsaWJyYXRpb24gZmFjdG9yIChjb2RlZCBvbiA3IGJpdHMgbWF4aW11bSkNCi0gKiBAcmV0dmFsIEhBTCBzdGF0ZQ0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENFeF9DYWxpYnJhdGlvbl9TZXRWYWx1ZShBRENfSGFuZGxlVHlwZURlZiAqaGFkYywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgU2luZ2xlRGlmZiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2FsaWJyYXRpb25GYWN0b3IpIHsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIHRtcF9oYWxfc3RhdHVzID0gSEFMX09LOw0KLSAgdWludDMyX3QgdG1wX2FkY19pc19jb252ZXJzaW9uX29uX2dvaW5nX3JlZ3VsYXI7DQotICB1aW50MzJfdCB0bXBfYWRjX2lzX2NvbnZlcnNpb25fb25fZ29pbmdfaW5qZWN0ZWQ7DQotDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsNCi0gIGFzc2VydF9wYXJhbShJU19BRENfU0lOR0xFX0RJRkZFUkVOVElBTChTaW5nbGVEaWZmKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfQURDX0NBTEZBQ1QoQ2FsaWJyYXRpb25GYWN0b3IpKTsNCi0NCi0gIC8qIFByb2Nlc3MgbG9ja2VkICovDQotICBfX0hBTF9MT0NLKGhhZGMpOw0KLQ0KLSAgLyogVmVyaWZpY2F0aW9uIG9mIGhhcmR3YXJlIGNvbnN0cmFpbnRzIGJlZm9yZSBtb2RpZnlpbmcgdGhlIGNhbGlicmF0aW9uICAgICovDQotICAvKiBmYWN0b3JzIHJlZ2lzdGVyOiBBREMgbXVzdCBiZSBlbmFibGVkLCBubyBjb252ZXJzaW9uIG9uIGdvaW5nLiAgICAgICAgICAgKi8NCi0gIHRtcF9hZGNfaXNfY29udmVyc2lvbl9vbl9nb2luZ19yZWd1bGFyID0NCi0gICAgICBMTF9BRENfUkVHX0lzQ29udmVyc2lvbk9uZ29pbmcoaGFkYy0+SW5zdGFuY2UpOw0KLSAgdG1wX2FkY19pc19jb252ZXJzaW9uX29uX2dvaW5nX2luamVjdGVkID0NCi0gICAgICBMTF9BRENfSU5KX0lzQ29udmVyc2lvbk9uZ29pbmcoaGFkYy0+SW5zdGFuY2UpOw0KLQ0KLSAgaWYgKChMTF9BRENfSXNFbmFibGVkKGhhZGMtPkluc3RhbmNlKSAhPSAwVUwpICYmDQotICAgICAgKHRtcF9hZGNfaXNfY29udmVyc2lvbl9vbl9nb2luZ19yZWd1bGFyID09IDBVTCkgJiYNCi0gICAgICAodG1wX2FkY19pc19jb252ZXJzaW9uX29uX2dvaW5nX2luamVjdGVkID09IDBVTCkpIHsNCi0gICAgLyogU2V0IHRoZSBzZWxlY3RlZCBBREMgY2FsaWJyYXRpb24gdmFsdWUgKi8NCi0gICAgTExfQURDX1NldENhbGlicmF0aW9uRmFjdG9yKGhhZGMtPkluc3RhbmNlLCBTaW5nbGVEaWZmLCBDYWxpYnJhdGlvbkZhY3Rvcik7DQotICB9IGVsc2Ugew0KLSAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgKi8NCi0gICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9DT05GSUcpOw0KLSAgICAvKiBVcGRhdGUgQURDIGVycm9yIGNvZGUgKi8NCi0gICAgU0VUX0JJVChoYWRjLT5FcnJvckNvZGUsIEhBTF9BRENfRVJST1JfSU5URVJOQUwpOw0KLQ0KLSAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gZXJyb3IgKi8NCi0gICAgdG1wX2hhbF9zdGF0dXMgPSBIQUxfRVJST1I7DQotICB9DQotDQotICAvKiBQcm9jZXNzIHVubG9ja2VkICovDQotICBfX0hBTF9VTkxPQ0soaGFkYyk7DQotDQotICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovDQotICByZXR1cm4gdG1wX2hhbF9zdGF0dXM7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIEFEQywgc3RhcnQgY29udmVyc2lvbiBvZiBpbmplY3RlZCBncm91cC4NCi0gKiBAbm90ZSAgIEludGVycnVwdGlvbnMgZW5hYmxlZCBpbiB0aGlzIGZ1bmN0aW9uOiBOb25lLg0KLSAqIEBub3RlICAgQ2FzZSBvZiBtdWx0aW1vZGUgZW5hYmxlZCB3aGVuIG11bHRpbW9kZSBmZWF0dXJlIGlzIGF2YWlsYWJsZToNCi0gKiAgICAgICAgIEhBTF9BRENFeF9JbmplY3RlZFN0YXJ0KCkgQVBJIG11c3QgYmUgY2FsbGVkIGZvciBBREMgc2xhdmUgZmlyc3QsDQotICogICAgICAgICB0aGVuIGZvciBBREMgbWFzdGVyLg0KLSAqICAgICAgICAgRm9yIEFEQyBzbGF2ZSwgQURDIGlzIGVuYWJsZWQgb25seSAoY29udmVyc2lvbiBpcyBub3Qgc3RhcnRlZCkuDQotICogICAgICAgICBGb3IgQURDIG1hc3RlciwgQURDIGlzIGVuYWJsZWQgYW5kIG11bHRpbW9kZSBjb252ZXJzaW9uIGlzIHN0YXJ0ZWQuDQotICogQHBhcmFtIGhhZGMgQURDIGhhbmRsZS4NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDRXhfSW5qZWN0ZWRTdGFydChBRENfSGFuZGxlVHlwZURlZiAqaGFkYykgew0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgdG1wX2hhbF9zdGF0dXM7DQotICB1aW50MzJfdCB0bXBfY29uZmlnX2luamVjdGVkX3F1ZXVlOw0KLSNpZiBkZWZpbmVkKEFEQ19NVUxUSU1PREVfU1VQUE9SVCkNCi0gIHVpbnQzMl90IHRtcF9tdWx0aW1vZGVfY29uZmlnID0NCi0gICAgICBMTF9BRENfR2V0TXVsdGltb2RlKF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOw0KLSNlbmRpZg0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7DQotDQotICBpZiAoTExfQURDX0lOSl9Jc0NvbnZlcnNpb25PbmdvaW5nKGhhZGMtPkluc3RhbmNlKSAhPSAwVUwpIHsNCi0gICAgcmV0dXJuIEhBTF9CVVNZOw0KLSAgfSBlbHNlIHsNCi0gICAgLyogSW4gY2FzZSBvZiBzb2Z0d2FyZSB0cmlnZ2VyIGRldGVjdGlvbiBlbmFibGVkLCBKUURJUyBtdXN0IGJlIHNldA0KLSAgICAgICh3aGljaCBjYW4gYmUgZG9uZSBvbmx5IGlmIEFEU1RBUlQgYW5kIEpBRFNUQVJUIGFyZSBib3RoIGNsZWFyZWQpLg0KLSAgICAgICBJZiBKUURJUyBpcyBub3Qgc2V0IGF0IHRoYXQgcG9pbnQsIHJldHVybnMgYW4gZXJyb3INCi0gICAgICAgLSBzaW5jZSBzb2Z0d2FyZSB0cmlnZ2VyIGRldGVjdGlvbiBpcyBkaXNhYmxlZC4gVXNlciBuZWVkcyB0bw0KLSAgICAgICByZXNvcnQgdG8gSEFMX0FEQ0V4X0Rpc2FibGVJbmplY3RlZFF1ZXVlKCkgQVBJIHRvIHNldCBKUURJUy4NCi0gICAgICAgLSBvciAoaWYgSlFESVMgaXMgaW50ZW50aW9uYWxseSByZXNldCkgc2luY2UgSkVYVEVOID0gMCB3aGljaCBtZWFucw0KLSAgICAgICAgIHRoZSBxdWV1ZSBpcyBlbXB0eSAqLw0KLSAgICB0bXBfY29uZmlnX2luamVjdGVkX3F1ZXVlID0gUkVBRF9CSVQoaGFkYy0+SW5zdGFuY2UtPkNGR1IsIEFEQ19DRkdSX0pRRElTKTsNCi0NCi0gICAgaWYgKChSRUFEX0JJVChoYWRjLT5JbnN0YW5jZS0+SlNRUiwgQURDX0pTUVJfSkVYVEVOKSA9PSAwVUwpICYmDQotICAgICAgICAodG1wX2NvbmZpZ19pbmplY3RlZF9xdWV1ZSA9PSAwVUwpKSB7DQotICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9DT05GSUcpOw0KLSAgICAgIHJldHVybiBIQUxfRVJST1I7DQotICAgIH0NCi0NCi0gICAgLyogUHJvY2VzcyBsb2NrZWQgKi8NCi0gICAgX19IQUxfTE9DSyhoYWRjKTsNCi0NCi0gICAgLyogRW5hYmxlIHRoZSBBREMgcGVyaXBoZXJhbCAqLw0KLSAgICB0bXBfaGFsX3N0YXR1cyA9IEFEQ19FbmFibGUoaGFkYyk7DQotDQotICAgIC8qIFN0YXJ0IGNvbnZlcnNpb24gaWYgQURDIGlzIGVmZmVjdGl2ZWx5IGVuYWJsZWQgKi8NCi0gICAgaWYgKHRtcF9oYWxfc3RhdHVzID09IEhBTF9PSykgew0KLSAgICAgIC8qIENoZWNrIGlmIGEgcmVndWxhciBjb252ZXJzaW9uIGlzIG9uZ29pbmcgKi8NCi0gICAgICBpZiAoKGhhZGMtPlN0YXRlICYgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSkgIT0gMFVMKSB7DQotICAgICAgICAvKiBSZXNldCBBREMgZXJyb3IgY29kZSBmaWVsZCByZWxhdGVkIHRvIGluamVjdGVkIGNvbnZlcnNpb25zIG9ubHkgKi8NCi0gICAgICAgIENMRUFSX0JJVChoYWRjLT5FcnJvckNvZGUsIEhBTF9BRENfRVJST1JfSlFPVkYpOw0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICAvKiBTZXQgQURDIGVycm9yIGNvZGUgdG8gbm9uZSAqLw0KLSAgICAgICAgQURDX0NMRUFSX0VSUk9SQ09ERShoYWRjKTsNCi0gICAgICB9DQotDQotICAgICAgLyogU2V0IEFEQyBzdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgICAvKiAtIENsZWFyIHN0YXRlIGJpdGZpZWxkIHJlbGF0ZWQgdG8gaW5qZWN0ZWQgZ3JvdXAgY29udmVyc2lvbiByZXN1bHRzICAqLw0KLSAgICAgIC8qIC0gU2V0IHN0YXRlIGJpdGZpZWxkIHJlbGF0ZWQgdG8gaW5qZWN0ZWQgb3BlcmF0aW9uICAgICAgICAgICAgICAgICAgICovDQotICAgICAgQURDX1NUQVRFX0NMUl9TRVQoaGFkYy0+U3RhdGUsDQotICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUFEWSB8IEhBTF9BRENfU1RBVEVfSU5KX0VPQywNCi0gICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX0lOSl9CVVNZKTsNCi0NCi0jaWYgZGVmaW5lZChBRENfTVVMVElNT0RFX1NVUFBPUlQpDQotICAgICAgLyogUmVzZXQgSEFMX0FEQ19TVEFURV9NVUxUSU1PREVfU0xBVkUgYml0DQotICAgICAgICAtIGlmIEFEQyBpbnN0YW5jZSBpcyBtYXN0ZXIgb3IgaWYgbXVsdGltb2RlIGZlYXR1cmUgaXMgbm90IGF2YWlsYWJsZQ0KLSAgICAgICAgLSBpZiBtdWx0aW1vZGUgc2V0dGluZyBpcyBkaXNhYmxlZCAoQURDIGluc3RhbmNlIHNsYXZlIGluIGluZGVwZW5kZW50DQotICAgICAgICBtb2RlKSAqLw0KLSAgICAgIGlmICgoX19MTF9BRENfTVVMVElfSU5TVEFOQ0VfTUFTVEVSKGhhZGMtPkluc3RhbmNlKSA9PSBoYWRjLT5JbnN0YW5jZSkgfHwNCi0gICAgICAgICAgKHRtcF9tdWx0aW1vZGVfY29uZmlnID09IExMX0FEQ19NVUxUSV9JTkRFUEVOREVOVCkpIHsNCi0gICAgICAgIENMRUFSX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9NVUxUSU1PREVfU0xBVkUpOw0KLSAgICAgIH0NCi0jZW5kaWYNCi0NCi0gICAgICAvKiBDbGVhciBBREMgZ3JvdXAgaW5qZWN0ZWQgZ3JvdXAgY29udmVyc2lvbiBmbGFnICovDQotICAgICAgLyogKFRvIGVuc3VyZSBvZiBubyB1bmtub3duIHN0YXRlIGZyb20gcG90ZW50aWFsIHByZXZpb3VzIEFEQyBvcGVyYXRpb25zKQ0KLSAgICAgICAqLw0KLSAgICAgIF9fSEFMX0FEQ19DTEVBUl9GTEFHKGhhZGMsIChBRENfRkxBR19KRU9DIHwgQURDX0ZMQUdfSkVPUykpOw0KLQ0KLSAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8NCi0gICAgICAvKiBVbmxvY2sgYmVmb3JlIHN0YXJ0aW5nIEFEQyBjb252ZXJzaW9uczogaW4gY2FzZSBvZiBwb3RlbnRpYWwgICAgICAgICAqLw0KLSAgICAgIC8qIGludGVycnVwdGlvbiwgdG8gbGV0IHRoZSBwcm9jZXNzIHRvIEFEQyBJUlEgSGFuZGxlci4gICAgICAgICAgICAgICAgICovDQotICAgICAgX19IQUxfVU5MT0NLKGhhZGMpOw0KLQ0KLSAgICAgIC8qIEVuYWJsZSBjb252ZXJzaW9uIG9mIGluamVjdGVkIGdyb3VwLCBpZiBhdXRvbWF0aWMgaW5qZWN0ZWQgY29udmVyc2lvbg0KLSAgICAgICAqLw0KLSAgICAgIC8qIGlzIGRpc2FibGVkLiAqLw0KLSAgICAgIC8qIElmIHNvZnR3YXJlIHN0YXJ0IGhhcyBiZWVuIHNlbGVjdGVkLCBjb252ZXJzaW9uIHN0YXJ0cyBpbW1lZGlhdGVseS4gKi8NCi0gICAgICAvKiBJZiBleHRlcm5hbCB0cmlnZ2VyIGhhcyBiZWVuIHNlbGVjdGVkLCBjb252ZXJzaW9uIHdpbGwgc3RhcnQgYXQgbmV4dCAqLw0KLSAgICAgIC8qIHRyaWdnZXIgZXZlbnQuICovDQotICAgICAgLyogQ2FzZSBvZiBtdWx0aW1vZGUgZW5hYmxlZCAod2hlbiBtdWx0aW1vZGUgZmVhdHVyZSBpcyBhdmFpbGFibGUpOiAqLw0KLSAgICAgIC8qIGlmIEFEQyBpcyBzbGF2ZSwgKi8NCi0gICAgICAvKiAgICAtIEFEQyBpcyBlbmFibGVkIG9ubHkgKGNvbnZlcnNpb24gaXMgbm90IHN0YXJ0ZWQpLCAqLw0KLSAgICAgIC8qICAgIC0gaWYgbXVsdGltb2RlIG9ubHkgY29uY2VybnMgcmVndWxhciBjb252ZXJzaW9uLCBBREMgaXMgZW5hYmxlZCAqLw0KLSAgICAgIC8qICAgICBhbmQgY29udmVyc2lvbiBpcyBzdGFydGVkLiAqLw0KLSAgICAgIC8qIElmIEFEQyBpcyBtYXN0ZXIgb3IgaW5kZXBlbmRlbnQsICovDQotICAgICAgLyogICAgLSBBREMgaXMgZW5hYmxlZCBhbmQgY29udmVyc2lvbiBpcyBzdGFydGVkLiAqLw0KLSNpZiBkZWZpbmVkKEFEQ19NVUxUSU1PREVfU1VQUE9SVCkNCi0gICAgICBpZiAoKF9fTExfQURDX01VTFRJX0lOU1RBTkNFX01BU1RFUihoYWRjLT5JbnN0YW5jZSkgPT0gaGFkYy0+SW5zdGFuY2UpIHx8DQotICAgICAgICAgICh0bXBfbXVsdGltb2RlX2NvbmZpZyA9PSBMTF9BRENfTVVMVElfSU5ERVBFTkRFTlQpIHx8DQotICAgICAgICAgICh0bXBfbXVsdGltb2RlX2NvbmZpZyA9PSBMTF9BRENfTVVMVElfRFVBTF9SRUdfU0lNVUxUKSB8fA0KLSAgICAgICAgICAodG1wX211bHRpbW9kZV9jb25maWcgPT0gTExfQURDX01VTFRJX0RVQUxfUkVHX0lOVEVSTCkpIHsNCi0gICAgICAgIC8qIEFEQyBpbnN0YW5jZSBpcyBub3QgYSBtdWx0aW1vZGUgc2xhdmUgaW5zdGFuY2Ugd2l0aCBtdWx0aW1vZGUNCi0gICAgICAgICAqIGluamVjdGVkIGNvbnZlcnNpb25zIGVuYWJsZWQgKi8NCi0gICAgICAgIGlmIChMTF9BRENfSU5KX0dldFRyaWdBdXRvKGhhZGMtPkluc3RhbmNlKSA9PQ0KLSAgICAgICAgICAgIExMX0FEQ19JTkpfVFJJR19JTkRFUEVOREVOVCkgew0KLSAgICAgICAgICBMTF9BRENfSU5KX1N0YXJ0Q29udmVyc2lvbihoYWRjLT5JbnN0YW5jZSk7DQotICAgICAgICB9DQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgIC8qIEFEQyBpbnN0YW5jZSBpcyBub3QgYSBtdWx0aW1vZGUgc2xhdmUgaW5zdGFuY2Ugd2l0aCBtdWx0aW1vZGUNCi0gICAgICAgICAqIGluamVjdGVkIGNvbnZlcnNpb25zIGVuYWJsZWQgKi8NCi0gICAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfTVVMVElNT0RFX1NMQVZFKTsNCi0gICAgICB9DQotI2Vsc2UNCi0gICAgICBpZiAoTExfQURDX0lOSl9HZXRUcmlnQXV0byhoYWRjLT5JbnN0YW5jZSkgPT0NCi0gICAgICAgICAgTExfQURDX0lOSl9UUklHX0lOREVQRU5ERU5UKSB7DQotICAgICAgICAvKiBTdGFydCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiAqLw0KLSAgICAgICAgTExfQURDX0lOSl9TdGFydENvbnZlcnNpb24oaGFkYy0+SW5zdGFuY2UpOw0KLSAgICAgIH0NCi0jZW5kaWYNCi0NCi0gICAgfSBlbHNlIHsNCi0gICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovDQotICAgICAgX19IQUxfVU5MT0NLKGhhZGMpOw0KLSAgICB9DQotDQotICAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8NCi0gICAgcmV0dXJuIHRtcF9oYWxfc3RhdHVzOw0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFN0b3AgY29udmVyc2lvbiBvZiBpbmplY3RlZCBjaGFubmVscy4gRGlzYWJsZSBBREMgcGVyaXBoZXJhbCBpZg0KLSAqICAgICAgICAgbm8gcmVndWxhciBjb252ZXJzaW9uIGlzIG9uIGdvaW5nLg0KLSAqIEBub3RlICAgSWYgQURDIG11c3QgYmUgZGlzYWJsZWQgYW5kIGlmIGNvbnZlcnNpb24gaXMgb24gZ29pbmcgb24NCi0gKiAgICAgICAgIHJlZ3VsYXIgZ3JvdXAsIGZ1bmN0aW9uIEhBTF9BRENfU3RvcCBtdXN0IGJlIHVzZWQgdG8gc3RvcCBib3RoDQotICogICAgICAgICBpbmplY3RlZCBhbmQgcmVndWxhciBncm91cHMsIGFuZCBkaXNhYmxlIHRoZSBBREMuDQotICogQG5vdGUgICBJZiBpbmplY3RlZCBncm91cCBtb2RlIGF1dG8taW5qZWN0aW9uIGlzIGVuYWJsZWQsDQotICogICAgICAgICBmdW5jdGlvbiBIQUxfQURDX1N0b3AgbXVzdCBiZSB1c2VkLg0KLSAqIEBub3RlICAgSW4gY2FzZSBvZiBtdWx0aW1vZGUgZW5hYmxlZCAod2hlbiBtdWx0aW1vZGUgZmVhdHVyZSBpcyBhdmFpbGFibGUpLA0KLSAqICAgICAgICAgSEFMX0FEQ0V4X0luamVjdGVkU3RvcCgpIG11c3QgYmUgY2FsbGVkIGZvciBBREMgbWFzdGVyIGZpcnN0LCB0aGVuDQotICogZm9yIEFEQyBzbGF2ZS4gRm9yIEFEQyBtYXN0ZXIsIGNvbnZlcnNpb24gaXMgc3RvcHBlZCBhbmQgQURDIGlzIGRpc2FibGVkLiBGb3INCi0gKiBBREMgc2xhdmUsIEFEQyBpcyBkaXNhYmxlZCBvbmx5IChjb252ZXJzaW9uIHN0b3Agb2YgQURDIG1hc3RlciBoYXMgYWxyZWFkeQ0KLSAqIHN0b3BwZWQgY29udmVyc2lvbiBvZiBBREMgc2xhdmUpLg0KLSAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUuDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ0V4X0luamVjdGVkU3RvcChBRENfSGFuZGxlVHlwZURlZiAqaGFkYykgew0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgdG1wX2hhbF9zdGF0dXM7DQotDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsNCi0NCi0gIC8qIFByb2Nlc3MgbG9ja2VkICovDQotICBfX0hBTF9MT0NLKGhhZGMpOw0KLQ0KLSAgLyogMS4gU3RvcCBwb3RlbnRpYWwgY29udmVyc2lvbiBvbiBnb2luZyBvbiBpbmplY3RlZCBncm91cCBvbmx5LiAqLw0KLSAgdG1wX2hhbF9zdGF0dXMgPSBBRENfQ29udmVyc2lvblN0b3AoaGFkYywgQURDX0lOSkVDVEVEX0dST1VQKTsNCi0NCi0gIC8qIERpc2FibGUgQURDIHBlcmlwaGVyYWwgaWYgaW5qZWN0ZWQgY29udmVyc2lvbnMgYXJlIGVmZmVjdGl2ZWx5IHN0b3BwZWQgICAqLw0KLSAgLyogYW5kIGlmIG5vIGNvbnZlcnNpb24gb24gcmVndWxhciBncm91cCBpcyBvbi1nb2luZyAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gIGlmICh0bXBfaGFsX3N0YXR1cyA9PSBIQUxfT0spIHsNCi0gICAgaWYgKExMX0FEQ19SRUdfSXNDb252ZXJzaW9uT25nb2luZyhoYWRjLT5JbnN0YW5jZSkgPT0gMFVMKSB7DQotICAgICAgLyogMi4gRGlzYWJsZSB0aGUgQURDIHBlcmlwaGVyYWwgKi8NCi0gICAgICB0bXBfaGFsX3N0YXR1cyA9IEFEQ19EaXNhYmxlKGhhZGMpOw0KLQ0KLSAgICAgIC8qIENoZWNrIGlmIEFEQyBpcyBlZmZlY3RpdmVseSBkaXNhYmxlZCAqLw0KLSAgICAgIGlmICh0bXBfaGFsX3N0YXR1cyA9PSBIQUxfT0spIHsNCi0gICAgICAgIC8qIFNldCBBREMgc3RhdGUgKi8NCi0gICAgICAgIEFEQ19TVEFURV9DTFJfU0VUKGhhZGMtPlN0YXRlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSB8IEhBTF9BRENfU1RBVEVfSU5KX0JVU1ksDQotICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFQURZKTsNCi0gICAgICB9DQotICAgIH0NCi0gICAgLyogQ29udmVyc2lvbiBvbiBpbmplY3RlZCBncm91cCBpcyBzdG9wcGVkLCBidXQgQURDIG5vdCBkaXNhYmxlZCBzaW5jZSAgICAqLw0KLSAgICAvKiBjb252ZXJzaW9uIG9uIHJlZ3VsYXIgZ3JvdXAgaXMgc3RpbGwgcnVubmluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIGVsc2Ugew0KLSAgICAgIC8qIFNldCBBREMgc3RhdGUgKi8NCi0gICAgICBDTEVBUl9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfSU5KX0JVU1kpOw0KLSAgICB9DQotICB9DQotDQotICAvKiBQcm9jZXNzIHVubG9ja2VkICovDQotICBfX0hBTF9VTkxPQ0soaGFkYyk7DQotDQotICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovDQotICByZXR1cm4gdG1wX2hhbF9zdGF0dXM7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgV2FpdCBmb3IgaW5qZWN0ZWQgZ3JvdXAgY29udmVyc2lvbiB0byBiZSBjb21wbGV0ZWQuDQotICogQHBhcmFtIGhhZGMgQURDIGhhbmRsZQ0KLSAqIEBwYXJhbSBUaW1lb3V0IFRpbWVvdXQgdmFsdWUgaW4gbWlsbGlzZWNvbmQuDQotICogQG5vdGUgICBEZXBlbmRpbmcgb24gaGFkYy0+SW5pdC5FT0NTZWxlY3Rpb24sIEpFT1Mgb3IgSkVPQyBpcw0KLSAqICAgICAgICAgY2hlY2tlZCBhbmQgY2xlYXJlZCBkZXBlbmRpbmcgb24gQVVURExZIGJpdCBzdGF0dXMuDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ0V4X0luamVjdGVkUG9sbEZvckNvbnZlcnNpb24oQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZW91dCkgew0KLSAgdWludDMyX3QgdGlja3N0YXJ0Ow0KLSAgdWludDMyX3QgdG1wX0ZsYWdfRW5kOw0KLSAgdWludDMyX3QgdG1wX2FkY19pbmpfaXNfdHJpZ2dlcl9zb3VyY2Vfc3dfc3RhcnQ7DQotICB1aW50MzJfdCB0bXBfYWRjX3JlZ19pc190cmlnZ2VyX3NvdXJjZV9zd19zdGFydDsNCi0gIHVpbnQzMl90IHRtcF9jZmdyOw0KLSNpZiBkZWZpbmVkKEFEQ19NVUxUSU1PREVfU1VQUE9SVCkNCi0gIGNvbnN0IEFEQ19UeXBlRGVmICp0bXBBRENfTWFzdGVyOw0KLSAgdWludDMyX3QgdG1wX211bHRpbW9kZV9jb25maWcgPQ0KLSAgICAgIExMX0FEQ19HZXRNdWx0aW1vZGUoX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7DQotI2VuZGlmDQotDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsNCi0NCi0gIC8qIElmIGVuZCBvZiBzZXF1ZW5jZSBzZWxlY3RlZCAqLw0KLSAgaWYgKGhhZGMtPkluaXQuRU9DU2VsZWN0aW9uID09IEFEQ19FT0NfU0VRX0NPTlYpIHsNCi0gICAgdG1wX0ZsYWdfRW5kID0gQURDX0ZMQUdfSkVPUzsNCi0gIH0gZWxzZSAvKiBlbmQgb2YgY29udmVyc2lvbiBzZWxlY3RlZCAqLw0KLSAgew0KLSAgICB0bXBfRmxhZ19FbmQgPSBBRENfRkxBR19KRU9DOw0KLSAgfQ0KLQ0KLSAgLyogR2V0IHRpbWVvdXQgKi8NCi0gIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7DQotDQotICAvKiBXYWl0IHVudGlsIEVuZCBvZiBDb252ZXJzaW9uIG9yIFNlcXVlbmNlIGZsYWcgaXMgcmFpc2VkICovDQotICB3aGlsZSAoKGhhZGMtPkluc3RhbmNlLT5JU1IgJiB0bXBfRmxhZ19FbmQpID09IDBVTCkgew0KLSAgICAvKiBDaGVjayBpZiB0aW1lb3V0IGlzIGRpc2FibGVkIChzZXQgdG8gaW5maW5pdGUgd2FpdCkgKi8NCi0gICAgaWYgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkgew0KLSAgICAgIGlmICgoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gVGltZW91dCkgfHwgKFRpbWVvdXQgPT0gMFVMKSkgew0KLSAgICAgICAgLyogTmV3IGNoZWNrIHRvIGF2b2lkIGZhbHNlIHRpbWVvdXQgZGV0ZWN0aW9uIGluIGNhc2Ugb2YgcHJlZW1wdGlvbiAqLw0KLSAgICAgICAgaWYgKChoYWRjLT5JbnN0YW5jZS0+SVNSICYgdG1wX0ZsYWdfRW5kKSA9PSAwVUwpIHsNCi0gICAgICAgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lIHRvIHRpbWVvdXQgKi8NCi0gICAgICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9USU1FT1VUKTsNCi0NCi0gICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLw0KLSAgICAgICAgICBfX0hBTF9VTkxPQ0soaGFkYyk7DQotDQotICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsNCi0gICAgICAgIH0NCi0gICAgICB9DQotICAgIH0NCi0gIH0NCi0NCi0gIC8qIFJldHJpZXZlIEFEQyBjb25maWd1cmF0aW9uICovDQotICB0bXBfYWRjX2lual9pc190cmlnZ2VyX3NvdXJjZV9zd19zdGFydCA9DQotICAgICAgTExfQURDX0lOSl9Jc1RyaWdnZXJTb3VyY2VTV1N0YXJ0KGhhZGMtPkluc3RhbmNlKTsNCi0gIHRtcF9hZGNfcmVnX2lzX3RyaWdnZXJfc291cmNlX3N3X3N0YXJ0ID0NCi0gICAgICBMTF9BRENfUkVHX0lzVHJpZ2dlclNvdXJjZVNXU3RhcnQoaGFkYy0+SW5zdGFuY2UpOw0KLSAgLyogR2V0IHJlbGV2YW50IHJlZ2lzdGVyIENGR1IgaW4gQURDIGluc3RhbmNlIG9mIEFEQyBtYXN0ZXIgb3Igc2xhdmUgICovDQotICAvKiBpbiBmdW5jdGlvbiBvZiBtdWx0aW1vZGUgc3RhdGUgKGZvciBkZXZpY2VzIHdpdGggbXVsdGltb2RlICAgICAgICAgKi8NCi0gIC8qIGF2YWlsYWJsZSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNpZiBkZWZpbmVkKEFEQ19NVUxUSU1PREVfU1VQUE9SVCkNCi0gIGlmICgoX19MTF9BRENfTVVMVElfSU5TVEFOQ0VfTUFTVEVSKGhhZGMtPkluc3RhbmNlKSA9PSBoYWRjLT5JbnN0YW5jZSkgfHwNCi0gICAgICAodG1wX211bHRpbW9kZV9jb25maWcgPT0gTExfQURDX01VTFRJX0lOREVQRU5ERU5UKSB8fA0KLSAgICAgICh0bXBfbXVsdGltb2RlX2NvbmZpZyA9PSBMTF9BRENfTVVMVElfRFVBTF9SRUdfU0lNVUxUKSB8fA0KLSAgICAgICh0bXBfbXVsdGltb2RlX2NvbmZpZyA9PSBMTF9BRENfTVVMVElfRFVBTF9SRUdfSU5URVJMKSkgew0KLSAgICB0bXBfY2ZnciA9IFJFQURfUkVHKGhhZGMtPkluc3RhbmNlLT5DRkdSKTsNCi0gIH0gZWxzZSB7DQotICAgIHRtcEFEQ19NYXN0ZXIgPSBfX0xMX0FEQ19NVUxUSV9JTlNUQU5DRV9NQVNURVIoaGFkYy0+SW5zdGFuY2UpOw0KLSAgICB0bXBfY2ZnciA9IFJFQURfUkVHKHRtcEFEQ19NYXN0ZXItPkNGR1IpOw0KLSAgfQ0KLSNlbHNlDQotICB0bXBfY2ZnciA9IFJFQURfUkVHKGhhZGMtPkluc3RhbmNlLT5DRkdSKTsNCi0jZW5kaWYNCi0NCi0gIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSAqLw0KLSAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9JTkpfRU9DKTsNCi0NCi0gIC8qIERldGVybWluZSB3aGV0aGVyIGFueSBmdXJ0aGVyIGNvbnZlcnNpb24gdXBjb21pbmcgb24gZ3JvdXAgaW5qZWN0ZWQgICAgICAqLw0KLSAgLyogYnkgZXh0ZXJuYWwgdHJpZ2dlciBvciBieSBhdXRvbWF0aWMgaW5qZWN0ZWQgY29udmVyc2lvbiAgICAgICAgICAgICAgICAgICovDQotICAvKiBmcm9tIGdyb3VwIHJlZ3VsYXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gIGlmICgodG1wX2FkY19pbmpfaXNfdHJpZ2dlcl9zb3VyY2Vfc3dfc3RhcnQgIT0gMFVMKSB8fA0KLSAgICAgICgoUkVBRF9CSVQodG1wX2NmZ3IsIEFEQ19DRkdSX0pBVVRPKSA9PSAwVUwpICYmDQotICAgICAgICgodG1wX2FkY19yZWdfaXNfdHJpZ2dlcl9zb3VyY2Vfc3dfc3RhcnQgIT0gMFVMKSAmJg0KLSAgICAgICAgKFJFQURfQklUKHRtcF9jZmdyLCBBRENfQ0ZHUl9DT05UKSA9PSAwVUwpKSkpIHsNCi0gICAgLyogQ2hlY2sgd2hldGhlciBlbmQgb2Ygc2VxdWVuY2UgaXMgcmVhY2hlZCAqLw0KLSAgICBpZiAoX19IQUxfQURDX0dFVF9GTEFHKGhhZGMsIEFEQ19GTEFHX0pFT1MpKSB7DQotICAgICAgLyogUGFydGljdWxhciBjYXNlIGlmIGluamVjdGVkIGNvbnRleHRzIHF1ZXVlIGlzIGVuYWJsZWQ6ICAgICAgICAgICAgICovDQotICAgICAgLyogd2hlbiB0aGUgbGFzdCBjb250ZXh0IGhhcyBiZWVuIGZ1bGx5IHByb2Nlc3NlZCwgSlNRUiBpcyByZXNldCAgICAgICovDQotICAgICAgLyogYnkgdGhlIGhhcmR3YXJlLiBFdmVuIGlmIG5vIGluamVjdGVkIGNvbnZlcnNpb24gaXMgcGxhbm5lZCB0byBjb21lICovDQotICAgICAgLyogKHF1ZXVlIGVtcHR5LCB0cmlnZ2VycyBhcmUgaWdub3JlZCksIGl0IGNhbiBzdGFydCBhZ2FpbiAgICAgICAgICAgICovDQotICAgICAgLyogaW1tZWRpYXRlbHkgYWZ0ZXIgc2V0dGluZyBhIG5ldyBjb250ZXh0IChKQURTVEFSVCBpcyBzdGlsbCBzZXQpLiAgICovDQotICAgICAgLyogVGhlcmVmb3JlLCBzdGF0ZSBvZiBIQUwgQURDIGluamVjdGVkIGdyb3VwIGlzIGtlcHQgdG8gYnVzeS4gICAgICAgICovDQotICAgICAgaWYgKFJFQURfQklUKHRtcF9jZmdyLCBBRENfQ0ZHUl9KUU0pID09IDBVTCkgew0KLSAgICAgICAgLyogU2V0IEFEQyBzdGF0ZSAqLw0KLSAgICAgICAgQ0xFQVJfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0lOSl9CVVNZKTsNCi0NCi0gICAgICAgIGlmICgoaGFkYy0+U3RhdGUgJiBIQUxfQURDX1NUQVRFX1JFR19CVVNZKSA9PSAwVUwpIHsNCi0gICAgICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9SRUFEWSk7DQotICAgICAgICB9DQotICAgICAgfQ0KLSAgICB9DQotICB9DQotDQotICAvKiBDbGVhciBwb2xsZWQgZmxhZyAqLw0KLSAgaWYgKHRtcF9GbGFnX0VuZCA9PSBBRENfRkxBR19KRU9TKSB7DQotICAgIC8qIENsZWFyIGVuZCBvZiBzZXF1ZW5jZSBKRU9TIGZsYWcgb2YgaW5qZWN0ZWQgZ3JvdXAgaWYgbG93IHBvd2VyIGZlYXR1cmUgKi8NCi0gICAgLyogIkxvd1Bvd2VyQXV0b1dhaXQgIiBpcyBkaXNhYmxlZCwgdG8gbm90IGludGVyZmVyZSB3aXRoIHRoaXMgZmVhdHVyZS4gICAqLw0KLSAgICAvKiBGb3IgaW5qZWN0ZWQgZ3JvdXBzLCBubyBuZXcgY29udmVyc2lvbiB3aWxsIHN0YXJ0IGJlZm9yZSBKRU9TIGlzICAgICAgICovDQotICAgIC8qIGNsZWFyZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgaWYgKFJFQURfQklUKHRtcF9jZmdyLCBBRENfQ0ZHUl9BVVRETFkpID09IDBVTCkgew0KLSAgICAgIF9fSEFMX0FEQ19DTEVBUl9GTEFHKGhhZGMsIChBRENfRkxBR19KRU9DIHwgQURDX0ZMQUdfSkVPUykpOw0KLSAgICB9DQotICB9IGVsc2Ugew0KLSAgICBfX0hBTF9BRENfQ0xFQVJfRkxBRyhoYWRjLCBBRENfRkxBR19KRU9DKTsNCi0gIH0NCi0NCi0gIC8qIFJldHVybiBBUEkgSEFMIHN0YXR1cyAqLw0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgQURDLCBzdGFydCBjb252ZXJzaW9uIG9mIGluamVjdGVkIGdyb3VwIHdpdGggaW50ZXJydXB0aW9uLg0KLSAqIEBub3RlICAgSW50ZXJydXB0aW9ucyBlbmFibGVkIGluIHRoaXMgZnVuY3Rpb24gYWNjb3JkaW5nIHRvIGluaXRpYWxpemF0aW9uDQotICogICAgICAgICBzZXR0aW5nIDogSkVPQyAoZW5kIG9mIGNvbnZlcnNpb24pIG9yIEpFT1MgKGVuZCBvZiBzZXF1ZW5jZSkNCi0gKiBAbm90ZSAgIENhc2Ugb2YgbXVsdGltb2RlIGVuYWJsZWQgKHdoZW4gbXVsdGltb2RlIGZlYXR1cmUgaXMgZW5hYmxlZCk6DQotICogICAgICAgICBIQUxfQURDRXhfSW5qZWN0ZWRTdGFydF9JVCgpIEFQSSBtdXN0IGJlIGNhbGxlZCBmb3IgQURDIHNsYXZlIGZpcnN0LA0KLSAqICAgICAgICAgdGhlbiBmb3IgQURDIG1hc3Rlci4NCi0gKiAgICAgICAgIEZvciBBREMgc2xhdmUsIEFEQyBpcyBlbmFibGVkIG9ubHkgKGNvbnZlcnNpb24gaXMgbm90IHN0YXJ0ZWQpLg0KLSAqICAgICAgICAgRm9yIEFEQyBtYXN0ZXIsIEFEQyBpcyBlbmFibGVkIGFuZCBtdWx0aW1vZGUgY29udmVyc2lvbiBpcyBzdGFydGVkLg0KLSAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUuDQotICogQHJldHZhbCBIQUwgc3RhdHVzLg0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENFeF9JbmplY3RlZFN0YXJ0X0lUKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKSB7DQotICBIQUxfU3RhdHVzVHlwZURlZiB0bXBfaGFsX3N0YXR1czsNCi0gIHVpbnQzMl90IHRtcF9jb25maWdfaW5qZWN0ZWRfcXVldWU7DQotI2lmIGRlZmluZWQoQURDX01VTFRJTU9ERV9TVVBQT1JUKQ0KLSAgdWludDMyX3QgdG1wX211bHRpbW9kZV9jb25maWcgPQ0KLSAgICAgIExMX0FEQ19HZXRNdWx0aW1vZGUoX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7DQotI2VuZGlmDQotDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsNCi0NCi0gIGlmIChMTF9BRENfSU5KX0lzQ29udmVyc2lvbk9uZ29pbmcoaGFkYy0+SW5zdGFuY2UpICE9IDBVTCkgew0KLSAgICByZXR1cm4gSEFMX0JVU1k7DQotICB9IGVsc2Ugew0KLSAgICAvKiBJbiBjYXNlIG9mIHNvZnR3YXJlIHRyaWdnZXIgZGV0ZWN0aW9uIGVuYWJsZWQsIEpRRElTIG11c3QgYmUgc2V0DQotICAgICAgKHdoaWNoIGNhbiBiZSBkb25lIG9ubHkgaWYgQURTVEFSVCBhbmQgSkFEU1RBUlQgYXJlIGJvdGggY2xlYXJlZCkuDQotICAgICAgIElmIEpRRElTIGlzIG5vdCBzZXQgYXQgdGhhdCBwb2ludCwgcmV0dXJucyBhbiBlcnJvcg0KLSAgICAgICAtIHNpbmNlIHNvZnR3YXJlIHRyaWdnZXIgZGV0ZWN0aW9uIGlzIGRpc2FibGVkLiBVc2VyIG5lZWRzIHRvDQotICAgICAgIHJlc29ydCB0byBIQUxfQURDRXhfRGlzYWJsZUluamVjdGVkUXVldWUoKSBBUEkgdG8gc2V0IEpRRElTLg0KLSAgICAgICAtIG9yIChpZiBKUURJUyBpcyBpbnRlbnRpb25hbGx5IHJlc2V0KSBzaW5jZSBKRVhURU4gPSAwIHdoaWNoIG1lYW5zDQotICAgICAgICAgdGhlIHF1ZXVlIGlzIGVtcHR5ICovDQotICAgIHRtcF9jb25maWdfaW5qZWN0ZWRfcXVldWUgPSBSRUFEX0JJVChoYWRjLT5JbnN0YW5jZS0+Q0ZHUiwgQURDX0NGR1JfSlFESVMpOw0KLQ0KLSAgICBpZiAoKFJFQURfQklUKGhhZGMtPkluc3RhbmNlLT5KU1FSLCBBRENfSlNRUl9KRVhURU4pID09IDBVTCkgJiYNCi0gICAgICAgICh0bXBfY29uZmlnX2luamVjdGVkX3F1ZXVlID09IDBVTCkpIHsNCi0gICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0VSUk9SX0NPTkZJRyk7DQotICAgICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gICAgfQ0KLQ0KLSAgICAvKiBQcm9jZXNzIGxvY2tlZCAqLw0KLSAgICBfX0hBTF9MT0NLKGhhZGMpOw0KLQ0KLSAgICAvKiBFbmFibGUgdGhlIEFEQyBwZXJpcGhlcmFsICovDQotICAgIHRtcF9oYWxfc3RhdHVzID0gQURDX0VuYWJsZShoYWRjKTsNCi0NCi0gICAgLyogU3RhcnQgY29udmVyc2lvbiBpZiBBREMgaXMgZWZmZWN0aXZlbHkgZW5hYmxlZCAqLw0KLSAgICBpZiAodG1wX2hhbF9zdGF0dXMgPT0gSEFMX09LKSB7DQotICAgICAgLyogQ2hlY2sgaWYgYSByZWd1bGFyIGNvbnZlcnNpb24gaXMgb25nb2luZyAqLw0KLSAgICAgIGlmICgoaGFkYy0+U3RhdGUgJiBIQUxfQURDX1NUQVRFX1JFR19CVVNZKSAhPSAwVUwpIHsNCi0gICAgICAgIC8qIFJlc2V0IEFEQyBlcnJvciBjb2RlIGZpZWxkIHJlbGF0ZWQgdG8gaW5qZWN0ZWQgY29udmVyc2lvbnMgb25seSAqLw0KLSAgICAgICAgQ0xFQVJfQklUKGhhZGMtPkVycm9yQ29kZSwgSEFMX0FEQ19FUlJPUl9KUU9WRik7DQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgIC8qIFNldCBBREMgZXJyb3IgY29kZSB0byBub25lICovDQotICAgICAgICBBRENfQ0xFQVJfRVJST1JDT0RFKGhhZGMpOw0KLSAgICAgIH0NCi0NCi0gICAgICAvKiBTZXQgQURDIHN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICAgIC8qIC0gQ2xlYXIgc3RhdGUgYml0ZmllbGQgcmVsYXRlZCB0byBpbmplY3RlZCBncm91cCBjb252ZXJzaW9uIHJlc3VsdHMgICovDQotICAgICAgLyogLSBTZXQgc3RhdGUgYml0ZmllbGQgcmVsYXRlZCB0byBpbmplY3RlZCBvcGVyYXRpb24gICAgICAgICAgICAgICAgICAgKi8NCi0gICAgICBBRENfU1RBVEVfQ0xSX1NFVChoYWRjLT5TdGF0ZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFQURZIHwgSEFMX0FEQ19TVEFURV9JTkpfRU9DLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfSU5KX0JVU1kpOw0KLQ0KLSNpZiBkZWZpbmVkKEFEQ19NVUxUSU1PREVfU1VQUE9SVCkNCi0gICAgICAvKiBSZXNldCBIQUxfQURDX1NUQVRFX01VTFRJTU9ERV9TTEFWRSBiaXQNCi0gICAgICAgIC0gaWYgQURDIGluc3RhbmNlIGlzIG1hc3RlciBvciBpZiBtdWx0aW1vZGUgZmVhdHVyZSBpcyBub3QgYXZhaWxhYmxlDQotICAgICAgICAtIGlmIG11bHRpbW9kZSBzZXR0aW5nIGlzIGRpc2FibGVkIChBREMgaW5zdGFuY2Ugc2xhdmUgaW4gaW5kZXBlbmRlbnQNCi0gICAgICAgIG1vZGUpICovDQotICAgICAgaWYgKChfX0xMX0FEQ19NVUxUSV9JTlNUQU5DRV9NQVNURVIoaGFkYy0+SW5zdGFuY2UpID09IGhhZGMtPkluc3RhbmNlKSB8fA0KLSAgICAgICAgICAodG1wX211bHRpbW9kZV9jb25maWcgPT0gTExfQURDX01VTFRJX0lOREVQRU5ERU5UKSkgew0KLSAgICAgICAgQ0xFQVJfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX01VTFRJTU9ERV9TTEFWRSk7DQotICAgICAgfQ0KLSNlbmRpZg0KLQ0KLSAgICAgIC8qIENsZWFyIEFEQyBncm91cCBpbmplY3RlZCBncm91cCBjb252ZXJzaW9uIGZsYWcgKi8NCi0gICAgICAvKiAoVG8gZW5zdXJlIG9mIG5vIHVua25vd24gc3RhdGUgZnJvbSBwb3RlbnRpYWwgcHJldmlvdXMgQURDIG9wZXJhdGlvbnMpDQotICAgICAgICovDQotICAgICAgX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgKEFEQ19GTEFHX0pFT0MgfCBBRENfRkxBR19KRU9TKSk7DQotDQotICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLw0KLSAgICAgIC8qIFVubG9jayBiZWZvcmUgc3RhcnRpbmcgQURDIGNvbnZlcnNpb25zOiBpbiBjYXNlIG9mIHBvdGVudGlhbCAgICAgICAgICovDQotICAgICAgLyogaW50ZXJydXB0aW9uLCB0byBsZXQgdGhlIHByb2Nlc3MgdG8gQURDIElSUSBIYW5kbGVyLiAgICAgICAgICAgICAgICAgKi8NCi0gICAgICBfX0hBTF9VTkxPQ0soaGFkYyk7DQotDQotICAgICAgLyogRW5hYmxlIEFEQyBJbmplY3RlZCBjb250ZXh0IHF1ZXVlIG92ZXJmbG93IGludGVycnVwdCBpZiB0aGlzIGZlYXR1cmUgKi8NCi0gICAgICAvKiBpcyBlbmFibGVkLiAqLw0KLSAgICAgIGlmICgoaGFkYy0+SW5zdGFuY2UtPkNGR1IgJiBBRENfQ0ZHUl9KUU0pICE9IDBVTCkgew0KLSAgICAgICAgX19IQUxfQURDX0VOQUJMRV9JVChoYWRjLCBBRENfRkxBR19KUU9WRik7DQotICAgICAgfQ0KLQ0KLSAgICAgIC8qIEVuYWJsZSBBREMgZW5kIG9mIGNvbnZlcnNpb24gaW50ZXJydXB0ICovDQotICAgICAgc3dpdGNoIChoYWRjLT5Jbml0LkVPQ1NlbGVjdGlvbikgew0KLSAgICAgICAgY2FzZSBBRENfRU9DX1NFUV9DT05WOg0KLSAgICAgICAgICBfX0hBTF9BRENfRElTQUJMRV9JVChoYWRjLCBBRENfSVRfSkVPQyk7DQotICAgICAgICAgIF9fSEFMX0FEQ19FTkFCTEVfSVQoaGFkYywgQURDX0lUX0pFT1MpOw0KLSAgICAgICAgICBicmVhazsNCi0gICAgICAgIC8qIGNhc2UgQURDX0VPQ19TSU5HTEVfQ09OViAqLw0KLSAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgX19IQUxfQURDX0RJU0FCTEVfSVQoaGFkYywgQURDX0lUX0pFT1MpOw0KLSAgICAgICAgICBfX0hBTF9BRENfRU5BQkxFX0lUKGhhZGMsIEFEQ19JVF9KRU9DKTsNCi0gICAgICAgICAgYnJlYWs7DQotICAgICAgfQ0KLQ0KLSAgICAgICAgLyogRW5hYmxlIGNvbnZlcnNpb24gb2YgaW5qZWN0ZWQgZ3JvdXAsIGlmIGF1dG9tYXRpYyBpbmplY3RlZCBjb252ZXJzaW9uDQotICAgICAgICAgKi8NCi0gICAgICAgIC8qIGlzIGRpc2FibGVkLiAqLw0KLSAgICAgICAgLyogSWYgc29mdHdhcmUgc3RhcnQgaGFzIGJlZW4gc2VsZWN0ZWQsIGNvbnZlcnNpb24gc3RhcnRzIGltbWVkaWF0ZWx5Lg0KLSAgICAgICAgICovDQotICAgICAgICAvKiBJZiBleHRlcm5hbCB0cmlnZ2VyIGhhcyBiZWVuIHNlbGVjdGVkLCBjb252ZXJzaW9uIHdpbGwgc3RhcnQgYXQgbmV4dA0KLSAgICAgICAgICovDQotICAgICAgICAvKiB0cmlnZ2VyIGV2ZW50LiAqLw0KLSAgICAgICAgLyogQ2FzZSBvZiBtdWx0aW1vZGUgZW5hYmxlZCAod2hlbiBtdWx0aW1vZGUgZmVhdHVyZSBpcyBhdmFpbGFibGUpOiAqLw0KLSAgICAgICAgLyogaWYgQURDIGlzIHNsYXZlLCAqLw0KLSAgICAgICAgLyogICAgLSBBREMgaXMgZW5hYmxlZCBvbmx5IChjb252ZXJzaW9uIGlzIG5vdCBzdGFydGVkKSwgKi8NCi0gICAgICAgIC8qICAgIC0gaWYgbXVsdGltb2RlIG9ubHkgY29uY2VybnMgcmVndWxhciBjb252ZXJzaW9uLCBBREMgaXMgZW5hYmxlZCAqLw0KLSAgICAgICAgLyogICAgIGFuZCBjb252ZXJzaW9uIGlzIHN0YXJ0ZWQuICovDQotICAgICAgICAvKiBJZiBBREMgaXMgbWFzdGVyIG9yIGluZGVwZW5kZW50LCAqLw0KLSAgICAgICAgLyogICAgLSBBREMgaXMgZW5hYmxlZCBhbmQgY29udmVyc2lvbiBpcyBzdGFydGVkLiAqLw0KLSNpZiBkZWZpbmVkKEFEQ19NVUxUSU1PREVfU1VQUE9SVCkNCi0gICAgICBpZiAoKF9fTExfQURDX01VTFRJX0lOU1RBTkNFX01BU1RFUihoYWRjLT5JbnN0YW5jZSkgPT0gaGFkYy0+SW5zdGFuY2UpIHx8DQotICAgICAgICAgICh0bXBfbXVsdGltb2RlX2NvbmZpZyA9PSBMTF9BRENfTVVMVElfSU5ERVBFTkRFTlQpIHx8DQotICAgICAgICAgICh0bXBfbXVsdGltb2RlX2NvbmZpZyA9PSBMTF9BRENfTVVMVElfRFVBTF9SRUdfU0lNVUxUKSB8fA0KLSAgICAgICAgICAodG1wX211bHRpbW9kZV9jb25maWcgPT0gTExfQURDX01VTFRJX0RVQUxfUkVHX0lOVEVSTCkpIHsNCi0gICAgICAgIC8qIEFEQyBpbnN0YW5jZSBpcyBub3QgYSBtdWx0aW1vZGUgc2xhdmUgaW5zdGFuY2Ugd2l0aCBtdWx0aW1vZGUNCi0gICAgICAgICAqIGluamVjdGVkIGNvbnZlcnNpb25zIGVuYWJsZWQgKi8NCi0gICAgICAgIGlmIChMTF9BRENfSU5KX0dldFRyaWdBdXRvKGhhZGMtPkluc3RhbmNlKSA9PQ0KLSAgICAgICAgICAgIExMX0FEQ19JTkpfVFJJR19JTkRFUEVOREVOVCkgew0KLSAgICAgICAgICBMTF9BRENfSU5KX1N0YXJ0Q29udmVyc2lvbihoYWRjLT5JbnN0YW5jZSk7DQotICAgICAgICB9DQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgIC8qIEFEQyBpbnN0YW5jZSBpcyBub3QgYSBtdWx0aW1vZGUgc2xhdmUgaW5zdGFuY2Ugd2l0aCBtdWx0aW1vZGUNCi0gICAgICAgICAqIGluamVjdGVkIGNvbnZlcnNpb25zIGVuYWJsZWQgKi8NCi0gICAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfTVVMVElNT0RFX1NMQVZFKTsNCi0gICAgICB9DQotI2Vsc2UNCi0gICAgICBpZiAoTExfQURDX0lOSl9HZXRUcmlnQXV0byhoYWRjLT5JbnN0YW5jZSkgPT0NCi0gICAgICAgICAgTExfQURDX0lOSl9UUklHX0lOREVQRU5ERU5UKSB7DQotICAgICAgICAvKiBTdGFydCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiAqLw0KLSAgICAgICAgTExfQURDX0lOSl9TdGFydENvbnZlcnNpb24oaGFkYy0+SW5zdGFuY2UpOw0KLSAgICAgIH0NCi0jZW5kaWYNCi0NCi0gICAgfSBlbHNlIHsNCi0gICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovDQotICAgICAgX19IQUxfVU5MT0NLKGhhZGMpOw0KLSAgICB9DQotDQotICAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8NCi0gICAgcmV0dXJuIHRtcF9oYWxfc3RhdHVzOw0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFN0b3AgY29udmVyc2lvbiBvZiBpbmplY3RlZCBjaGFubmVscywgZGlzYWJsZSBpbnRlcnJ1cHRpb24gb2YNCi0gKiAgICAgICAgIGVuZC1vZi1jb252ZXJzaW9uLiBEaXNhYmxlIEFEQyBwZXJpcGhlcmFsIGlmIG5vIHJlZ3VsYXIgY29udmVyc2lvbg0KLSAqICAgICAgICAgaXMgb24gZ29pbmcuDQotICogQG5vdGUgICBJZiBBREMgbXVzdCBiZSBkaXNhYmxlZCBhbmQgaWYgY29udmVyc2lvbiBpcyBvbiBnb2luZyBvbg0KLSAqICAgICAgICAgcmVndWxhciBncm91cCwgZnVuY3Rpb24gSEFMX0FEQ19TdG9wIG11c3QgYmUgdXNlZCB0byBzdG9wIGJvdGgNCi0gKiAgICAgICAgIGluamVjdGVkIGFuZCByZWd1bGFyIGdyb3VwcywgYW5kIGRpc2FibGUgdGhlIEFEQy4NCi0gKiBAbm90ZSAgIElmIGluamVjdGVkIGdyb3VwIG1vZGUgYXV0by1pbmplY3Rpb24gaXMgZW5hYmxlZCwNCi0gKiAgICAgICAgIGZ1bmN0aW9uIEhBTF9BRENfU3RvcCBtdXN0IGJlIHVzZWQuDQotICogQG5vdGUgICBDYXNlIG9mIG11bHRpbW9kZSBlbmFibGVkICh3aGVuIG11bHRpbW9kZSBmZWF0dXJlIGlzIGF2YWlsYWJsZSk6DQotICogICAgICAgICBIQUxfQURDRXhfSW5qZWN0ZWRTdG9wX0lUKCkgQVBJIG11c3QgYmUgY2FsbGVkIGZvciBBREMgbWFzdGVyIGZpcnN0LA0KLSAqICAgICAgICAgdGhlbiBmb3IgQURDIHNsYXZlLg0KLSAqICAgICAgICAgRm9yIEFEQyBtYXN0ZXIsIGNvbnZlcnNpb24gaXMgc3RvcHBlZCBhbmQgQURDIGlzIGRpc2FibGVkLg0KLSAqICAgICAgICAgRm9yIEFEQyBzbGF2ZSwgQURDIGlzIGRpc2FibGVkIG9ubHkgKGNvbnZlcnNpb24gc3RvcCBvZiBBREMgbWFzdGVyDQotICogICAgICAgICBoYXMgYWxyZWFkeSBzdG9wcGVkIGNvbnZlcnNpb24gb2YgQURDIHNsYXZlKS4NCi0gKiBAbm90ZSAgIEluIGNhc2Ugb2YgYXV0by1pbmplY3Rpb24gbW9kZSwgSEFMX0FEQ19TdG9wKCkgbXVzdCBiZSB1c2VkLg0KLSAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDRXhfSW5qZWN0ZWRTdG9wX0lUKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKSB7DQotICBIQUxfU3RhdHVzVHlwZURlZiB0bXBfaGFsX3N0YXR1czsNCi0NCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOw0KLQ0KLSAgLyogUHJvY2VzcyBsb2NrZWQgKi8NCi0gIF9fSEFMX0xPQ0soaGFkYyk7DQotDQotICAvKiAxLiBTdG9wIHBvdGVudGlhbCBjb252ZXJzaW9uIG9uIGdvaW5nIG9uIGluamVjdGVkIGdyb3VwIG9ubHkuICovDQotICB0bXBfaGFsX3N0YXR1cyA9IEFEQ19Db252ZXJzaW9uU3RvcChoYWRjLCBBRENfSU5KRUNURURfR1JPVVApOw0KLQ0KLSAgLyogRGlzYWJsZSBBREMgcGVyaXBoZXJhbCBpZiBpbmplY3RlZCBjb252ZXJzaW9ucyBhcmUgZWZmZWN0aXZlbHkgc3RvcHBlZCAgICovDQotICAvKiBhbmQgaWYgbm8gY29udmVyc2lvbiBvbiB0aGUgb3RoZXIgZ3JvdXAgKHJlZ3VsYXIgZ3JvdXApIGlzIGludGVuZGVkIHRvICAgKi8NCi0gIC8qIGNvbnRpbnVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgaWYgKHRtcF9oYWxfc3RhdHVzID09IEhBTF9PSykgew0KLSAgICAvKiBEaXNhYmxlIEFEQyBlbmQgb2YgY29udmVyc2lvbiBpbnRlcnJ1cHQgZm9yIGluamVjdGVkIGNoYW5uZWxzICovDQotICAgIF9fSEFMX0FEQ19ESVNBQkxFX0lUKGhhZGMsIChBRENfSVRfSkVPQyB8IEFEQ19JVF9KRU9TIHwgQURDX0ZMQUdfSlFPVkYpKTsNCi0NCi0gICAgaWYgKExMX0FEQ19SRUdfSXNDb252ZXJzaW9uT25nb2luZyhoYWRjLT5JbnN0YW5jZSkgPT0gMFVMKSB7DQotICAgICAgLyogMi4gRGlzYWJsZSB0aGUgQURDIHBlcmlwaGVyYWwgKi8NCi0gICAgICB0bXBfaGFsX3N0YXR1cyA9IEFEQ19EaXNhYmxlKGhhZGMpOw0KLQ0KLSAgICAgIC8qIENoZWNrIGlmIEFEQyBpcyBlZmZlY3RpdmVseSBkaXNhYmxlZCAqLw0KLSAgICAgIGlmICh0bXBfaGFsX3N0YXR1cyA9PSBIQUxfT0spIHsNCi0gICAgICAgIC8qIFNldCBBREMgc3RhdGUgKi8NCi0gICAgICAgIEFEQ19TVEFURV9DTFJfU0VUKGhhZGMtPlN0YXRlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSB8IEhBTF9BRENfU1RBVEVfSU5KX0JVU1ksDQotICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFQURZKTsNCi0gICAgICB9DQotICAgIH0NCi0gICAgLyogQ29udmVyc2lvbiBvbiBpbmplY3RlZCBncm91cCBpcyBzdG9wcGVkLCBidXQgQURDIG5vdCBkaXNhYmxlZCBzaW5jZSAgICAqLw0KLSAgICAvKiBjb252ZXJzaW9uIG9uIHJlZ3VsYXIgZ3JvdXAgaXMgc3RpbGwgcnVubmluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIGVsc2Ugew0KLSAgICAgIC8qIFNldCBBREMgc3RhdGUgKi8NCi0gICAgICBDTEVBUl9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfSU5KX0JVU1kpOw0KLSAgICB9DQotICB9DQotDQotICAvKiBQcm9jZXNzIHVubG9ja2VkICovDQotICBfX0hBTF9VTkxPQ0soaGFkYyk7DQotDQotICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovDQotICByZXR1cm4gdG1wX2hhbF9zdGF0dXM7DQotfQ0KLQ0KLSNpZiBkZWZpbmVkKEFEQ19NVUxUSU1PREVfU1VQUE9SVCkNCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSBBREMsIHN0YXJ0IE11bHRpTW9kZSBjb252ZXJzaW9uIGFuZCB0cmFuc2ZlciByZWd1bGFyIHJlc3VsdHMNCi0gKiB0aHJvdWdoIERNQS4NCi0gKiBAbm90ZSAgIE11bHRpbW9kZSBtdXN0IGhhdmUgYmVlbiBwcmV2aW91c2x5IGNvbmZpZ3VyZWQgdXNpbmcNCi0gKiAgICAgICAgIEhBTF9BRENFeF9NdWx0aU1vZGVDb25maWdDaGFubmVsKCkgZnVuY3Rpb24uDQotICogICAgICAgICBJbnRlcnJ1cHRpb25zIGVuYWJsZWQgaW4gdGhpcyBmdW5jdGlvbjoNCi0gKiAgICAgICAgICBvdmVycnVuLCBETUEgaGFsZiB0cmFuc2ZlciwgRE1BIHRyYW5zZmVyIGNvbXBsZXRlLg0KLSAqICAgICAgICAgRWFjaCBvZiB0aGVzZSBpbnRlcnJ1cHRpb25zIGhhcyBpdHMgZGVkaWNhdGVkIGNhbGxiYWNrIGZ1bmN0aW9uLg0KLSAqIEBub3RlICAgU3RhdGUgZmllbGQgb2YgU2xhdmUgQURDIGhhbmRsZSBpcyBub3QgdXBkYXRlZCBpbiB0aGlzIGNvbmZpZ3VyYXRpb246DQotICogICAgICAgICAgdXNlciBzaG91bGQgbm90IHJlbHkgb24gaXQgZm9yIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gU2xhdmUgcmVndWxhcg0KLSAqICAgICAgICAgY29udmVyc2lvbnMuDQotICogQHBhcmFtIGhhZGMgQURDIGhhbmRsZSBvZiBBREMgbWFzdGVyIChoYW5kbGUgb2YgQURDIHNsYXZlIG11c3Qgbm90IGJlIHVzZWQpDQotICogQHBhcmFtIHBEYXRhIERlc3RpbmF0aW9uIEJ1ZmZlciBhZGRyZXNzLg0KLSAqIEBwYXJhbSBMZW5ndGggTGVuZ3RoIG9mIGRhdGEgdG8gYmUgdHJhbnNmZXJyZWQgZnJvbSBBREMgcGVyaXBoZXJhbCB0byBtZW1vcnkNCi0gKiAoaW4gYnl0ZXMpLg0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENFeF9NdWx0aU1vZGVTdGFydF9ETUEoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcERhdGEsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBMZW5ndGgpIHsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIHRtcF9oYWxfc3RhdHVzOw0KLSAgQURDX0hhbmRsZVR5cGVEZWYgdG1waGFkY1NsYXZlOw0KLSAgQURDX0NvbW1vbl9UeXBlRGVmICp0bXBBRENfQ29tbW9uOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19BRENfTVVMVElNT0RFX01BU1RFUl9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoaGFkYy0+SW5pdC5Db250aW51b3VzQ29udk1vZGUpKTsNCi0gIGFzc2VydF9wYXJhbShJU19BRENfRVhUVFJJR19FREdFKGhhZGMtPkluaXQuRXh0ZXJuYWxUcmlnQ29udkVkZ2UpKTsNCi0gIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKGhhZGMtPkluaXQuRE1BQ29udGludW91c1JlcXVlc3RzKSk7DQotDQotICBpZiAoTExfQURDX1JFR19Jc0NvbnZlcnNpb25PbmdvaW5nKGhhZGMtPkluc3RhbmNlKSAhPSAwVUwpIHsNCi0gICAgcmV0dXJuIEhBTF9CVVNZOw0KLSAgfSBlbHNlIHsNCi0gICAgLyogUHJvY2VzcyBsb2NrZWQgKi8NCi0gICAgX19IQUxfTE9DSyhoYWRjKTsNCi0NCi0gICAgLyogVGVtcG9yYXJ5IGhhbmRsZSBtaW5pbXVtIGluaXRpYWxpemF0aW9uICovDQotICAgIF9fSEFMX0FEQ19SRVNFVF9IQU5ETEVfU1RBVEUoJnRtcGhhZGNTbGF2ZSk7DQotICAgIEFEQ19DTEVBUl9FUlJPUkNPREUoJnRtcGhhZGNTbGF2ZSk7DQotDQotICAgIC8qIFNldCBhIHRlbXBvcmFyeSBoYW5kbGUgb2YgdGhlIEFEQyBzbGF2ZSBhc3NvY2lhdGVkIHRvIHRoZSBBREMgbWFzdGVyICAgKi8NCi0gICAgQURDX01VTFRJX1NMQVZFKGhhZGMsICZ0bXBoYWRjU2xhdmUpOw0KLQ0KLSAgICBpZiAodG1waGFkY1NsYXZlLkluc3RhbmNlID09IE5VTEwpIHsNCi0gICAgICAvKiBTZXQgQURDIHN0YXRlICovDQotICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9DT05GSUcpOw0KLQ0KLSAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8NCi0gICAgICBfX0hBTF9VTkxPQ0soaGFkYyk7DQotDQotICAgICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gICAgfQ0KLQ0KLSAgICAvKiBFbmFibGUgdGhlIEFEQyBwZXJpcGhlcmFsczogbWFzdGVyIGFuZCBzbGF2ZSAoaW4gY2FzZSBpZiBub3QgYWxyZWFkeSAgICovDQotICAgIC8qIGVuYWJsZWQgcHJldmlvdXNseSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgdG1wX2hhbF9zdGF0dXMgPSBBRENfRW5hYmxlKGhhZGMpOw0KLSAgICBpZiAodG1wX2hhbF9zdGF0dXMgPT0gSEFMX09LKSB7DQotICAgICAgdG1wX2hhbF9zdGF0dXMgPSBBRENfRW5hYmxlKCZ0bXBoYWRjU2xhdmUpOw0KLSAgICB9DQotDQotICAgIC8qIFN0YXJ0IG11bHRpbW9kZSBjb252ZXJzaW9uIG9mIEFEQ3MgcGFpciAqLw0KLSAgICBpZiAodG1wX2hhbF9zdGF0dXMgPT0gSEFMX09LKSB7DQotICAgICAgLyogU2V0IEFEQyBzdGF0ZSAqLw0KLSAgICAgIEFEQ19TVEFURV9DTFJfU0VUKGhhZGMtPlN0YXRlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIChIQUxfQURDX1NUQVRFX1JFQURZIHwgSEFMX0FEQ19TVEFURV9SRUdfRU9DIHwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUdfT1ZSIHwgSEFMX0FEQ19TVEFURV9SRUdfRU9TTVApLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVHX0JVU1kpOw0KLQ0KLSAgICAgIC8qIFNldCBBREMgZXJyb3IgY29kZSB0byBub25lICovDQotICAgICAgQURDX0NMRUFSX0VSUk9SQ09ERShoYWRjKTsNCi0NCi0gICAgICAvKiBTZXQgdGhlIERNQSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLw0KLSAgICAgIGhhZGMtPkRNQV9IYW5kbGUtPlhmZXJDcGx0Q2FsbGJhY2sgPSBBRENfRE1BQ29udkNwbHQ7DQotDQotICAgICAgLyogU2V0IHRoZSBETUEgaGFsZiB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLw0KLSAgICAgIGhhZGMtPkRNQV9IYW5kbGUtPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gQURDX0RNQUhhbGZDb252Q3BsdDsNCi0NCi0gICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLw0KLSAgICAgIGhhZGMtPkRNQV9IYW5kbGUtPlhmZXJFcnJvckNhbGxiYWNrID0gQURDX0RNQUVycm9yOw0KLQ0KLSAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGNvbW1vbiBjb250cm9sIHJlZ2lzdGVyICAqLw0KLSAgICAgIHRtcEFEQ19Db21tb24gPSBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpOw0KLQ0KLSAgICAgIC8qIE1hbmFnZSBBREMgYW5kIERNQSBzdGFydDogQURDIG92ZXJydW4gaW50ZXJydXB0aW9uLCBETUEgc3RhcnQsIEFEQyAqLw0KLSAgICAgIC8qIHN0YXJ0IChpbiBjYXNlIG9mIFNXIHN0YXJ0KTogKi8NCi0NCi0gICAgICAvKiBDbGVhciByZWd1bGFyIGdyb3VwIGNvbnZlcnNpb24gZmxhZyBhbmQgb3ZlcnJ1biBmbGFnICovDQotICAgICAgLyogKFRvIGVuc3VyZSBvZiBubyB1bmtub3duIHN0YXRlIGZyb20gcG90ZW50aWFsIHByZXZpb3VzIEFEQyBvcGVyYXRpb25zKQ0KLSAgICAgICAqLw0KLSAgICAgIF9fSEFMX0FEQ19DTEVBUl9GTEFHKGhhZGMsIChBRENfRkxBR19FT0MgfCBBRENfRkxBR19FT1MgfCBBRENfRkxBR19PVlIpKTsNCi0NCi0gICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovDQotICAgICAgLyogVW5sb2NrIGJlZm9yZSBzdGFydGluZyBBREMgY29udmVyc2lvbnM6IGluIGNhc2Ugb2YgcG90ZW50aWFsICAgICAgICAgKi8NCi0gICAgICAvKiBpbnRlcnJ1cHRpb24sIHRvIGxldCB0aGUgcHJvY2VzcyB0byBBREMgSVJRIEhhbmRsZXIuICAgICAgICAgICAgICAgICAqLw0KLSAgICAgIF9fSEFMX1VOTE9DSyhoYWRjKTsNCi0NCi0gICAgICAvKiBFbmFibGUgQURDIG92ZXJydW4gaW50ZXJydXB0ICovDQotICAgICAgX19IQUxfQURDX0VOQUJMRV9JVChoYWRjLCBBRENfSVRfT1ZSKTsNCi0NCi0gICAgICAvKiBTdGFydCB0aGUgRE1BIGNoYW5uZWwgKi8NCi0gICAgICB0bXBfaGFsX3N0YXR1cyA9DQotICAgICAgICAgIEhBTF9ETUFfU3RhcnRfSVQoaGFkYy0+RE1BX0hhbmRsZSwgKHVpbnQzMl90KSZ0bXBBRENfQ29tbW9uLT5DRFIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KXBEYXRhLCBMZW5ndGgpOw0KLQ0KLSAgICAgIC8qIEVuYWJsZSBjb252ZXJzaW9uIG9mIHJlZ3VsYXIgZ3JvdXAuICovDQotICAgICAgLyogSWYgc29mdHdhcmUgc3RhcnQgaGFzIGJlZW4gc2VsZWN0ZWQsIGNvbnZlcnNpb24gc3RhcnRzIGltbWVkaWF0ZWx5LiAqLw0KLSAgICAgIC8qIElmIGV4dGVybmFsIHRyaWdnZXIgaGFzIGJlZW4gc2VsZWN0ZWQsIGNvbnZlcnNpb24gd2lsbCBzdGFydCBhdCBuZXh0ICovDQotICAgICAgLyogdHJpZ2dlciBldmVudC4gKi8NCi0gICAgICAvKiBTdGFydCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uICovDQotICAgICAgTExfQURDX1JFR19TdGFydENvbnZlcnNpb24oaGFkYy0+SW5zdGFuY2UpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8NCi0gICAgICBfX0hBTF9VTkxPQ0soaGFkYyk7DQotICAgIH0NCi0NCi0gICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLw0KLSAgICByZXR1cm4gdG1wX2hhbF9zdGF0dXM7DQotICB9DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU3RvcCBtdWx0aW1vZGUgQURDIGNvbnZlcnNpb24sIGRpc2FibGUgQURDIERNQSB0cmFuc2ZlciwgZGlzYWJsZSBBREMNCi0gKiBwZXJpcGhlcmFsLg0KLSAqIEBub3RlICAgTXVsdGltb2RlIGlzIGtlcHQgZW5hYmxlZCBhZnRlciB0aGlzIGZ1bmN0aW9uLiBNdWx0aU1vZGUgRE1BIGJpdHMNCi0gKiAgICAgICAgIChNRE1BIGFuZCBETUFDRkcgYml0cyBvZiBjb21tb24gQ0NSIHJlZ2lzdGVyKSBhcmUgbWFpbnRhaW5lZC4gVG8NCi0gKiBkaXNhYmxlIE11bHRpbW9kZSAoc2V0IHdpdGggSEFMX0FEQ0V4X011bHRpTW9kZUNvbmZpZ0NoYW5uZWwoKSksIEFEQyBtdXN0IGJlDQotICogICAgICAgICByZWluaXRpYWxpemVkIHVzaW5nIEhBTF9BRENfSW5pdCgpIG9yIEhBTF9BRENfRGVJbml0KCksIG9yIHRoZSB1c2VyDQotICogY2FuIHJlc29ydCB0byBIQUxfQURDRXhfRGlzYWJsZU11bHRpTW9kZSgpIEFQSS4NCi0gKiBAbm90ZSAgIEluIGNhc2Ugb2YgRE1BIGNvbmZpZ3VyZWQgaW4gY2lyY3VsYXIgbW9kZSwgZnVuY3Rpb24NCi0gKiAgICAgICAgIEhBTF9BRENfU3RvcF9ETUEoKSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGlzIGZ1bmN0aW9uIHdpdGggaGFuZGxlIG9mDQotICogICAgICAgICBBREMgc2xhdmUsIHRvIHByb3Blcmx5IGRpc2FibGUgdGhlIERNQSBjaGFubmVsLg0KLSAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUgb2YgQURDIG1hc3RlciAoaGFuZGxlIG9mIEFEQyBzbGF2ZSBtdXN0IG5vdCBiZSB1c2VkKQ0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENFeF9NdWx0aU1vZGVTdG9wX0RNQShBRENfSGFuZGxlVHlwZURlZiAqaGFkYykgew0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgdG1wX2hhbF9zdGF0dXM7DQotICB1aW50MzJfdCB0aWNrc3RhcnQ7DQotICBBRENfSGFuZGxlVHlwZURlZiB0bXBoYWRjU2xhdmU7DQotICB1aW50MzJfdCB0bXBoYWRjU2xhdmVfY29udmVyc2lvbl9vbl9nb2luZzsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIHRtcGhhZGNTbGF2ZV9kaXNhYmxlX3N0YXR1czsNCi0NCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfQURDX01VTFRJTU9ERV9NQVNURVJfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsNCi0NCi0gIC8qIFByb2Nlc3MgbG9ja2VkICovDQotICBfX0hBTF9MT0NLKGhhZGMpOw0KLQ0KLSAgLyogMS4gU3RvcCBwb3RlbnRpYWwgbXVsdGltb2RlIGNvbnZlcnNpb24gb24gZ29pbmcsIG9uIHJlZ3VsYXIgYW5kIGluamVjdGVkDQotICAgKiBncm91cHMgKi8NCi0gIHRtcF9oYWxfc3RhdHVzID0gQURDX0NvbnZlcnNpb25TdG9wKGhhZGMsIEFEQ19SRUdVTEFSX0lOSkVDVEVEX0dST1VQKTsNCi0NCi0gIC8qIERpc2FibGUgQURDIHBlcmlwaGVyYWwgaWYgY29udmVyc2lvbnMgYXJlIGVmZmVjdGl2ZWx5IHN0b3BwZWQgKi8NCi0gIGlmICh0bXBfaGFsX3N0YXR1cyA9PSBIQUxfT0spIHsNCi0gICAgLyogVGVtcG9yYXJ5IGhhbmRsZSBtaW5pbXVtIGluaXRpYWxpemF0aW9uICovDQotICAgIF9fSEFMX0FEQ19SRVNFVF9IQU5ETEVfU1RBVEUoJnRtcGhhZGNTbGF2ZSk7DQotICAgIEFEQ19DTEVBUl9FUlJPUkNPREUoJnRtcGhhZGNTbGF2ZSk7DQotDQotICAgIC8qIFNldCBhIHRlbXBvcmFyeSBoYW5kbGUgb2YgdGhlIEFEQyBzbGF2ZSBhc3NvY2lhdGVkIHRvIHRoZSBBREMgbWFzdGVyICAgKi8NCi0gICAgQURDX01VTFRJX1NMQVZFKGhhZGMsICZ0bXBoYWRjU2xhdmUpOw0KLQ0KLSAgICBpZiAodG1waGFkY1NsYXZlLkluc3RhbmNlID09IE5VTEwpIHsNCi0gICAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gZXJyb3IgKi8NCi0gICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0VSUk9SX0NPTkZJRyk7DQotDQotICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLw0KLSAgICAgIF9fSEFMX1VOTE9DSyhoYWRjKTsNCi0NCi0gICAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgICB9DQotDQotICAgIC8qIFByb2NlZHVyZSB0byBkaXNhYmxlIHRoZSBBREMgcGVyaXBoZXJhbDogd2FpdCBmb3IgY29udmVyc2lvbnMgICAgICAgICAgKi8NCi0gICAgLyogZWZmZWN0aXZlbHkgc3RvcHBlZCAoQURDIG1hc3RlciBhbmQgQURDIHNsYXZlKSwgdGhlbiBkaXNhYmxlIEFEQyAgICAgICAqLw0KLQ0KLSAgICAvKiAxLiBXYWl0IGZvciBBREMgY29udmVyc2lvbiBjb21wbGV0aW9uIGZvciBBREMgbWFzdGVyIGFuZCBBREMgc2xhdmUgKi8NCi0gICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsNCi0NCi0gICAgdG1waGFkY1NsYXZlX2NvbnZlcnNpb25fb25fZ29pbmcgPQ0KLSAgICAgICAgTExfQURDX1JFR19Jc0NvbnZlcnNpb25PbmdvaW5nKCgmdG1waGFkY1NsYXZlKS0+SW5zdGFuY2UpOw0KLSAgICB3aGlsZSAoKExMX0FEQ19SRUdfSXNDb252ZXJzaW9uT25nb2luZyhoYWRjLT5JbnN0YW5jZSkgPT0gMVVMKSB8fA0KLSAgICAgICAgICAgKHRtcGhhZGNTbGF2ZV9jb252ZXJzaW9uX29uX2dvaW5nID09IDFVTCkpIHsNCi0gICAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gQURDX1NUT1BfQ09OVkVSU0lPTl9USU1FT1VUKSB7DQotICAgICAgICAvKiBOZXcgY2hlY2sgdG8gYXZvaWQgZmFsc2UgdGltZW91dCBkZXRlY3Rpb24gaW4gY2FzZSBvZiBwcmVlbXB0aW9uICovDQotICAgICAgICB0bXBoYWRjU2xhdmVfY29udmVyc2lvbl9vbl9nb2luZyA9DQotICAgICAgICAgICAgTExfQURDX1JFR19Jc0NvbnZlcnNpb25PbmdvaW5nKCgmdG1waGFkY1NsYXZlKS0+SW5zdGFuY2UpOw0KLSAgICAgICAgaWYgKChMTF9BRENfUkVHX0lzQ29udmVyc2lvbk9uZ29pbmcoaGFkYy0+SW5zdGFuY2UpID09IDFVTCkgfHwNCi0gICAgICAgICAgICAodG1waGFkY1NsYXZlX2NvbnZlcnNpb25fb25fZ29pbmcgPT0gMVVMKSkgew0KLSAgICAgICAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gZXJyb3IgKi8NCi0gICAgICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9JTlRFUk5BTCk7DQotDQotICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8NCi0gICAgICAgICAgX19IQUxfVU5MT0NLKGhhZGMpOw0KLQ0KLSAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0NCi0gICAgICB0bXBoYWRjU2xhdmVfY29udmVyc2lvbl9vbl9nb2luZyA9DQotICAgICAgICAgIExMX0FEQ19SRUdfSXNDb252ZXJzaW9uT25nb2luZygoJnRtcGhhZGNTbGF2ZSktPkluc3RhbmNlKTsNCi0gICAgfQ0KLQ0KLSAgICAvKiBEaXNhYmxlIHRoZSBETUEgY2hhbm5lbCAoaW4gY2FzZSBvZiBETUEgaW4gY2lyY3VsYXIgbW9kZSBvciBzdG9wICAgICAgICovDQotICAgIC8qIHdoaWxlIERNQSB0cmFuc2ZlciBpcyBvbiBnb2luZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgLyogTm90ZTogRE1BIGNoYW5uZWwgb2YgQURDIHNsYXZlIHNob3VsZCBiZSBzdG9wcGVkIGFmdGVyIHRoaXMgZnVuY3Rpb24gICAqLw0KLSAgICAvKiAgICAgICB3aXRoIEhBTF9BRENfU3RvcF9ETUEoKSBBUEkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIHRtcF9oYWxfc3RhdHVzID0gSEFMX0RNQV9BYm9ydChoYWRjLT5ETUFfSGFuZGxlKTsNCi0NCi0gICAgLyogQ2hlY2sgaWYgRE1BIGNoYW5uZWwgZWZmZWN0aXZlbHkgZGlzYWJsZWQgKi8NCi0gICAgaWYgKHRtcF9oYWxfc3RhdHVzID09IEhBTF9FUlJPUikgew0KLSAgICAgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSB0byBlcnJvciAqLw0KLSAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfRVJST1JfRE1BKTsNCi0gICAgfQ0KLQ0KLSAgICAvKiBEaXNhYmxlIEFEQyBvdmVycnVuIGludGVycnVwdCAqLw0KLSAgICBfX0hBTF9BRENfRElTQUJMRV9JVChoYWRjLCBBRENfSVRfT1ZSKTsNCi0NCi0gICAgLyogMi4gRGlzYWJsZSB0aGUgQURDIHBlcmlwaGVyYWxzOiBtYXN0ZXIgYW5kIHNsYXZlICovDQotICAgIC8qIFVwZGF0ZSAidG1wX2hhbF9zdGF0dXMiIG9ubHkgaWYgRE1BIGNoYW5uZWwgZGlzYWJsaW5nIHBhc3NlZCwgdG8ga2VlcCBpbg0KLSAgICAgKi8NCi0gICAgLyogbWVtb3J5IGEgcG90ZW50aWFsIGZhaWxpbmcgc3RhdHVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICBpZiAodG1wX2hhbF9zdGF0dXMgPT0gSEFMX09LKSB7DQotICAgICAgdG1waGFkY1NsYXZlX2Rpc2FibGVfc3RhdHVzID0gQURDX0Rpc2FibGUoJnRtcGhhZGNTbGF2ZSk7DQotICAgICAgaWYgKChBRENfRGlzYWJsZShoYWRjKSA9PSBIQUxfT0spICYmDQotICAgICAgICAgICh0bXBoYWRjU2xhdmVfZGlzYWJsZV9zdGF0dXMgPT0gSEFMX09LKSkgew0KLSAgICAgICAgdG1wX2hhbF9zdGF0dXMgPSBIQUxfT0s7DQotICAgICAgfQ0KLSAgICB9IGVsc2Ugew0KLSAgICAgIC8qIEluIGNhc2Ugb2YgZXJyb3IsIGF0dGVtcHQgdG8gZGlzYWJsZSBBREMgbWFzdGVyIGFuZCBzbGF2ZSB3aXRob3V0DQotICAgICAgICogc3RhdHVzIGFzc2VydCAqLw0KLSAgICAgICh2b2lkKUFEQ19EaXNhYmxlKGhhZGMpOw0KLSAgICAgICh2b2lkKUFEQ19EaXNhYmxlKCZ0bXBoYWRjU2xhdmUpOw0KLSAgICB9DQotDQotICAgIC8qIFNldCBBREMgc3RhdGUgKEFEQyBtYXN0ZXIpICovDQotICAgIEFEQ19TVEFURV9DTFJfU0VUKGhhZGMtPlN0YXRlLA0KLSAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFR19CVVNZIHwgSEFMX0FEQ19TVEFURV9JTkpfQlVTWSwNCi0gICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUFEWSk7DQotICB9DQotDQotICAvKiBQcm9jZXNzIHVubG9ja2VkICovDQotICBfX0hBTF9VTkxPQ0soaGFkYyk7DQotDQotICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovDQotICByZXR1cm4gdG1wX2hhbF9zdGF0dXM7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmV0dXJuIHRoZSBsYXN0IEFEQyBNYXN0ZXIgYW5kIFNsYXZlIHJlZ3VsYXIgY29udmVyc2lvbnMgcmVzdWx0cyB3aGVuDQotICogaW4gbXVsdGltb2RlIGNvbmZpZ3VyYXRpb24uDQotICogQHBhcmFtIGhhZGMgQURDIGhhbmRsZSBvZiBBREMgTWFzdGVyIChoYW5kbGUgb2YgQURDIFNsYXZlIG11c3Qgbm90IGJlIHVzZWQpDQotICogQHJldHZhbCBUaGUgY29udmVydGVkIGRhdGEgdmFsdWVzLg0KLSAqLw0KLXVpbnQzMl90IEhBTF9BRENFeF9NdWx0aU1vZGVHZXRWYWx1ZShBRENfSGFuZGxlVHlwZURlZiAqaGFkYykgew0KLSAgY29uc3QgQURDX0NvbW1vbl9UeXBlRGVmICp0bXBBRENfQ29tbW9uOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19BRENfTVVMVElNT0RFX01BU1RFUl9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOw0KLQ0KLSAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyBpZiBubyBhc3NlcnRfcGFyYW0gY2hlY2sgKi8NCi0gIC8qIGFuZCBwb3NzaWJsZSBubyB1c2FnZSBpbiBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoKSBiZWxvdyAgICAgICAgICAgICAgICovDQotICBVTlVTRUQoaGFkYyk7DQotDQotICAvKiBQb2ludGVyIHRvIHRoZSBjb21tb24gY29udHJvbCByZWdpc3RlciAgKi8NCi0gIHRtcEFEQ19Db21tb24gPSBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpOw0KLQ0KLSAgLyogUmV0dXJuIHRoZSBtdWx0aSBtb2RlIGNvbnZlcnNpb24gdmFsdWUgKi8NCi0gIHJldHVybiB0bXBBRENfQ29tbW9uLT5DRFI7DQotfQ0KLSNlbmRpZiAvKiBBRENfTVVMVElNT0RFX1NVUFBPUlQgKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBBREMgaW5qZWN0ZWQgZ3JvdXAgY29udmVyc2lvbiByZXN1bHQuDQotICogQG5vdGUgICBSZWFkaW5nIHJlZ2lzdGVyIEpEUnggYXV0b21hdGljYWxseSBjbGVhcnMgQURDIGZsYWcgSkVPQw0KLSAqICAgICAgICAgKEFEQyBncm91cCBpbmplY3RlZCBlbmQgb2YgdW5pdGFyeSBjb252ZXJzaW9uKS4NCi0gKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgY2xlYXIgQURDIGZsYWcgSkVPUw0KLSAqICAgICAgICAgKEFEQyBncm91cCBpbmplY3RlZCBlbmQgb2Ygc2VxdWVuY2UgY29udmVyc2lvbikNCi0gKiAgICAgICAgIE9jY3VycmVuY2Ugb2YgZmxhZyBKRU9TIHJpc2luZzoNCi0gKiAgICAgICAgICAtIElmIHNlcXVlbmNlciBpcyBjb21wb3NlZCBvZiAxIHJhbmssIGZsYWcgSkVPUyBpcyBlcXVpdmFsZW50DQotICogICAgICAgICAgICB0byBmbGFnIEpFT0MuDQotICogICAgICAgICAgLSBJZiBzZXF1ZW5jZXIgaXMgY29tcG9zZWQgb2Ygc2V2ZXJhbCByYW5rcywgZHVyaW5nIHRoZSBzY2FuDQotICogICAgICAgICAgICBzZXF1ZW5jZSBmbGFnIEpFT0Mgb25seSBpcyByYWlzZWQsIGF0IHRoZSBlbmQgb2YgdGhlIHNjYW4gc2VxdWVuY2UNCi0gKiAgICAgICAgICAgIGJvdGggZmxhZ3MgSkVPQyBhbmQgRU9TIGFyZSByYWlzZWQuDQotICogICAgICAgICBGbGFnIEpFT1MgbXVzdCBub3QgYmUgY2xlYXJlZCBieSB0aGlzIGZ1bmN0aW9uIGJlY2F1c2UNCi0gKiAgICAgICAgIGl0IHdvdWxkIG5vdCBiZSBjb21wbGlhbnQgd2l0aCBsb3cgcG93ZXIgZmVhdHVyZXMNCi0gKiAgICAgICAgIChmZWF0dXJlIGxvdyBwb3dlciBhdXRvLXdhaXQsIG5vdCBhdmFpbGFibGUgb24gYWxsIFNUTTMyIGZhbWlsaWVzKS4NCi0gKiAgICAgICAgIFRvIGNsZWFyIHRoaXMgZmxhZywgZWl0aGVyIHVzZSBmdW5jdGlvbjoNCi0gKiAgICAgICAgIGluIHByb2dyYW1taW5nIG1vZGVsIElUOiBAcmVmIEhBTF9BRENfSVJRSGFuZGxlcigpLCBpbiBwcm9ncmFtbWluZw0KLSAqICAgICAgICAgbW9kZWwgcG9sbGluZzogQHJlZiBIQUxfQURDRXhfSW5qZWN0ZWRQb2xsRm9yQ29udmVyc2lvbigpDQotICogICAgICAgICBvciBAcmVmIF9fSEFMX0FEQ19DTEVBUl9GTEFHKCZoYWRjLCBBRENfRkxBR19KRU9TKS4NCi0gKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlDQotICogQHBhcmFtIEluamVjdGVkUmFuayB0aGUgY29udmVydGVkIEFEQyBpbmplY3RlZCByYW5rLg0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0lOSkVDVEVEX1JBTktfMSBBREMgZ3JvdXAgaW5qZWN0ZWQgcmFuayAxDQotICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0lOSkVDVEVEX1JBTktfMiBBREMgZ3JvdXAgaW5qZWN0ZWQgcmFuayAyDQotICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0lOSkVDVEVEX1JBTktfMyBBREMgZ3JvdXAgaW5qZWN0ZWQgcmFuayAzDQotICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0lOSkVDVEVEX1JBTktfNCBBREMgZ3JvdXAgaW5qZWN0ZWQgcmFuayA0DQotICogQHJldHZhbCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiBkYXRhDQotICovDQotdWludDMyX3QgSEFMX0FEQ0V4X0luamVjdGVkR2V0VmFsdWUoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgSW5qZWN0ZWRSYW5rKSB7DQotICB1aW50MzJfdCB0bXBfamRyOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfQURDX0lOSkVDVEVEX1JBTksoSW5qZWN0ZWRSYW5rKSk7DQotDQotICAvKiBHZXQgQURDIGNvbnZlcnRlZCB2YWx1ZSAqLw0KLSAgc3dpdGNoIChJbmplY3RlZFJhbmspIHsNCi0gICAgY2FzZSBBRENfSU5KRUNURURfUkFOS180Og0KLSAgICAgIHRtcF9qZHIgPSBoYWRjLT5JbnN0YW5jZS0+SkRSNDsNCi0gICAgICBicmVhazsNCi0gICAgY2FzZSBBRENfSU5KRUNURURfUkFOS18zOg0KLSAgICAgIHRtcF9qZHIgPSBoYWRjLT5JbnN0YW5jZS0+SkRSMzsNCi0gICAgICBicmVhazsNCi0gICAgY2FzZSBBRENfSU5KRUNURURfUkFOS18yOg0KLSAgICAgIHRtcF9qZHIgPSBoYWRjLT5JbnN0YW5jZS0+SkRSMjsNCi0gICAgICBicmVhazsNCi0gICAgY2FzZSBBRENfSU5KRUNURURfUkFOS18xOg0KLSAgICBkZWZhdWx0Og0KLSAgICAgIHRtcF9qZHIgPSBoYWRjLT5JbnN0YW5jZS0+SkRSMTsNCi0gICAgICBicmVhazsNCi0gIH0NCi0NCi0gIC8qIFJldHVybiBBREMgY29udmVydGVkIHZhbHVlICovDQotICByZXR1cm4gdG1wX2pkcjsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBJbmplY3RlZCBjb252ZXJzaW9uIGNvbXBsZXRlIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlLg0KLSAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX3dlYWsgdm9pZCBIQUxfQURDRXhfSW5qZWN0ZWRDb252Q3BsdENhbGxiYWNrKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKSB7DQotICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovDQotICBVTlVTRUQoaGFkYyk7DQotDQotICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLiBXaGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsDQotICAgICAgICAgICAgZnVuY3Rpb24gSEFMX0FEQ0V4X0luamVjdGVkQ29udkNwbHRDYWxsYmFjayBtdXN0IGJlIGltcGxlbWVudGVkIGluDQotICAgICB0aGUgdXNlciBmaWxlLg0KLSAgKi8NCi19DQotDQotLyoqDQotICAqIEBicmllZiAgSW5qZWN0ZWQgY29udGV4dCBxdWV1ZSBvdmVyZmxvdyBjYWxsYmFjay4NCi0gICogQG5vdGUgICBUaGlzIGNhbGxiYWNrIGlzIGNhbGxlZCBpZiBpbmplY3RlZCBjb250ZXh0IHF1ZXVlIGlzIGVuYWJsZWQNCi0gICAgICAgICAgICAocGFyYW1ldGVyICJRdWV1ZUluamVjdGVkQ29udGV4dCIgaW4gaW5qZWN0ZWQgY2hhbm5lbCBjb25maWd1cmF0aW9uKQ0KLSAgICAgICAgICAgIGFuZCBpZiBhIG5ldyBpbmplY3RlZCBjb250ZXh0IGlzIHNldCB3aGVuIHF1ZXVlIGlzIGZ1bGwgKG1heGltdW0gMg0KLSAgICAgICAgICAgIGNvbnRleHRzKS4NCi0gICogQHBhcmFtIGhhZGMgQURDIGhhbmRsZQ0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotX193ZWFrIHZvaWQgSEFMX0FEQ0V4X0luamVjdGVkUXVldWVPdmVyZmxvd0NhbGxiYWNrKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKSB7DQotICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovDQotICBVTlVTRUQoaGFkYyk7DQotDQotICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLiBXaGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsDQotICAgICAgICAgICAgZnVuY3Rpb24gSEFMX0FEQ0V4X0luamVjdGVkUXVldWVPdmVyZmxvd0NhbGxiYWNrIG11c3QgYmUgaW1wbGVtZW50ZWQNCi0gICAgIGluIHRoZSB1c2VyIGZpbGUuDQotICAqLw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEFuYWxvZyB3YXRjaGRvZyAyIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlLg0KLSAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX3dlYWsgdm9pZCBIQUxfQURDRXhfTGV2ZWxPdXRPZldpbmRvdzJDYWxsYmFjayhBRENfSGFuZGxlVHlwZURlZiAqaGFkYykgew0KLSAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLw0KLSAgVU5VU0VEKGhhZGMpOw0KLQ0KLSAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZC4gV2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLA0KLSAgICAgICAgICAgIGZ1bmN0aW9uIEhBTF9BRENFeF9MZXZlbE91dE9mV2luZG93MkNhbGxiYWNrIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4NCi0gICAgIHRoZSB1c2VyIGZpbGUuDQotICAqLw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEFuYWxvZyB3YXRjaGRvZyAzIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlLg0KLSAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX3dlYWsgdm9pZCBIQUxfQURDRXhfTGV2ZWxPdXRPZldpbmRvdzNDYWxsYmFjayhBRENfSGFuZGxlVHlwZURlZiAqaGFkYykgew0KLSAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLw0KLSAgVU5VU0VEKGhhZGMpOw0KLQ0KLSAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZC4gV2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLA0KLSAgICAgICAgICAgIGZ1bmN0aW9uIEhBTF9BRENFeF9MZXZlbE91dE9mV2luZG93M0NhbGxiYWNrIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4NCi0gICAgIHRoZSB1c2VyIGZpbGUuDQotICAqLw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuZCBPZiBTYW1wbGluZyBjYWxsYmFjayBpbiBub24tYmxvY2tpbmcgbW9kZS4NCi0gKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlDQotICogQHJldHZhbCBOb25lDQotICovDQotX193ZWFrIHZvaWQgSEFMX0FEQ0V4X0VuZE9mU2FtcGxpbmdDYWxsYmFjayhBRENfSGFuZGxlVHlwZURlZiAqaGFkYykgew0KLSAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLw0KLSAgVU5VU0VEKGhhZGMpOw0KLQ0KLSAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZC4gV2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLA0KLSAgICAgICAgICAgIGZ1bmN0aW9uIEhBTF9BRENFeF9FbmRPZlNhbXBsaW5nQ2FsbGJhY2sgbXVzdCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUNCi0gICAgIHVzZXIgZmlsZS4NCi0gICovDQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU3RvcCBBREMgY29udmVyc2lvbiBvZiByZWd1bGFyIGdyb3VwIChhbmQgaW5qZWN0ZWQgY2hhbm5lbHMgaW4NCi0gKiAgICAgICAgIGNhc2Ugb2YgYXV0b19pbmplY3Rpb24gbW9kZSksIGRpc2FibGUgQURDIHBlcmlwaGVyYWwgaWYgbm8NCi0gKiAgICAgICAgIGNvbnZlcnNpb24gaXMgb24gZ29pbmcgb24gaW5qZWN0ZWQgZ3JvdXAuDQotICogQHBhcmFtIGhhZGMgQURDIGhhbmRsZQ0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cy4NCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDRXhfUmVndWxhclN0b3AoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpIHsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIHRtcF9oYWxfc3RhdHVzOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7DQotDQotICAvKiBQcm9jZXNzIGxvY2tlZCAqLw0KLSAgX19IQUxfTE9DSyhoYWRjKTsNCi0NCi0gIC8qIDEuIFN0b3AgcG90ZW50aWFsIHJlZ3VsYXIgY29udmVyc2lvbiBvbiBnb2luZyAqLw0KLSAgdG1wX2hhbF9zdGF0dXMgPSBBRENfQ29udmVyc2lvblN0b3AoaGFkYywgQURDX1JFR1VMQVJfR1JPVVApOw0KLQ0KLSAgLyogRGlzYWJsZSBBREMgcGVyaXBoZXJhbCBpZiByZWd1bGFyIGNvbnZlcnNpb25zIGFyZSBlZmZlY3RpdmVseSBzdG9wcGVkDQotICAgICBhbmQgaWYgbm8gaW5qZWN0ZWQgY29udmVyc2lvbnMgYXJlIG9uLWdvaW5nICovDQotICBpZiAodG1wX2hhbF9zdGF0dXMgPT0gSEFMX09LKSB7DQotICAgIC8qIENsZWFyIEhBTF9BRENfU1RBVEVfUkVHX0JVU1kgYml0ICovDQotICAgIENMRUFSX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSk7DQotDQotICAgIGlmIChMTF9BRENfSU5KX0lzQ29udmVyc2lvbk9uZ29pbmcoaGFkYy0+SW5zdGFuY2UpID09IDBVTCkgew0KLSAgICAgIC8qIDIuIERpc2FibGUgdGhlIEFEQyBwZXJpcGhlcmFsICovDQotICAgICAgdG1wX2hhbF9zdGF0dXMgPSBBRENfRGlzYWJsZShoYWRjKTsNCi0NCi0gICAgICAvKiBDaGVjayBpZiBBREMgaXMgZWZmZWN0aXZlbHkgZGlzYWJsZWQgKi8NCi0gICAgICBpZiAodG1wX2hhbF9zdGF0dXMgPT0gSEFMX09LKSB7DQotICAgICAgICAvKiBTZXQgQURDIHN0YXRlICovDQotICAgICAgICBBRENfU1RBVEVfQ0xSX1NFVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9JTkpfQlVTWSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVBRFkpOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgICAvKiBDb252ZXJzaW9uIG9uIGluamVjdGVkIGdyb3VwIGlzIHN0b3BwZWQsIGJ1dCBBREMgbm90IGRpc2FibGVkIHNpbmNlICAgICovDQotICAgIC8qIGNvbnZlcnNpb24gb24gcmVndWxhciBncm91cCBpcyBzdGlsbCBydW5uaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgZWxzZSB7DQotICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9JTkpfQlVTWSk7DQotICAgIH0NCi0gIH0NCi0NCi0gIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8NCi0gIF9fSEFMX1VOTE9DSyhoYWRjKTsNCi0NCi0gIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8NCi0gIHJldHVybiB0bXBfaGFsX3N0YXR1czsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTdG9wIEFEQyBjb252ZXJzaW9uIG9mIEFEQyBncm91cHMgcmVndWxhciBhbmQgaW5qZWN0ZWQsDQotICogICAgICAgICBkaXNhYmxlIGludGVycnV0aW9uIG9mIGVuZC1vZi1jb252ZXJzaW9uLA0KLSAqICAgICAgICAgZGlzYWJsZSBBREMgcGVyaXBoZXJhbCBpZiBubyBjb252ZXJzaW9uIGlzIG9uIGdvaW5nDQotICogICAgICAgICBvbiBpbmplY3RlZCBncm91cC4NCi0gKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlDQotICogQHJldHZhbCBIQUwgc3RhdHVzLg0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENFeF9SZWd1bGFyU3RvcF9JVChBRENfSGFuZGxlVHlwZURlZiAqaGFkYykgew0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgdG1wX2hhbF9zdGF0dXM7DQotDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsNCi0NCi0gIC8qIFByb2Nlc3MgbG9ja2VkICovDQotICBfX0hBTF9MT0NLKGhhZGMpOw0KLQ0KLSAgLyogMS4gU3RvcCBwb3RlbnRpYWwgcmVndWxhciBjb252ZXJzaW9uIG9uIGdvaW5nICovDQotICB0bXBfaGFsX3N0YXR1cyA9IEFEQ19Db252ZXJzaW9uU3RvcChoYWRjLCBBRENfUkVHVUxBUl9HUk9VUCk7DQotDQotICAvKiBEaXNhYmxlIEFEQyBwZXJpcGhlcmFsIGlmIGNvbnZlcnNpb25zIGFyZSBlZmZlY3RpdmVseSBzdG9wcGVkDQotICAgIGFuZCBpZiBubyBpbmplY3RlZCBjb252ZXJzaW9uIGlzIG9uLWdvaW5nICovDQotICBpZiAodG1wX2hhbF9zdGF0dXMgPT0gSEFMX09LKSB7DQotICAgIC8qIENsZWFyIEhBTF9BRENfU1RBVEVfUkVHX0JVU1kgYml0ICovDQotICAgIENMRUFSX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSk7DQotDQotICAgIC8qIERpc2FibGUgYWxsIHJlZ3VsYXItcmVsYXRlZCBpbnRlcnJ1cHRzICovDQotICAgIF9fSEFMX0FEQ19ESVNBQkxFX0lUKGhhZGMsIChBRENfSVRfRU9DIHwgQURDX0lUX0VPUyB8IEFEQ19JVF9PVlIpKTsNCi0NCi0gICAgLyogMi4gRGlzYWJsZSBBREMgcGVyaXBoZXJhbCBpZiBubyBpbmplY3RlZCBjb252ZXJzaW9ucyBhcmUgb24tZ29pbmcgKi8NCi0gICAgaWYgKExMX0FEQ19JTkpfSXNDb252ZXJzaW9uT25nb2luZyhoYWRjLT5JbnN0YW5jZSkgPT0gMFVMKSB7DQotICAgICAgdG1wX2hhbF9zdGF0dXMgPSBBRENfRGlzYWJsZShoYWRjKTsNCi0gICAgICAvKiBpZiBubyBpc3N1ZSByZXBvcnRlZCAqLw0KLSAgICAgIGlmICh0bXBfaGFsX3N0YXR1cyA9PSBIQUxfT0spIHsNCi0gICAgICAgIC8qIFNldCBBREMgc3RhdGUgKi8NCi0gICAgICAgIEFEQ19TVEFURV9DTFJfU0VUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0lOSl9CVVNZLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUFEWSk7DQotICAgICAgfQ0KLSAgICB9IGVsc2Ugew0KLSAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfSU5KX0JVU1kpOw0KLSAgICB9DQotICB9DQotDQotICAvKiBQcm9jZXNzIHVubG9ja2VkICovDQotICBfX0hBTF9VTkxPQ0soaGFkYyk7DQotDQotICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovDQotICByZXR1cm4gdG1wX2hhbF9zdGF0dXM7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU3RvcCBBREMgY29udmVyc2lvbiBvZiByZWd1bGFyIGdyb3VwIChhbmQgaW5qZWN0ZWQgZ3JvdXAgaW4NCi0gKiAgICAgICAgIGNhc2Ugb2YgYXV0b19pbmplY3Rpb24gbW9kZSksIGRpc2FibGUgQURDIERNQSB0cmFuc2ZlciwgZGlzYWJsZQ0KLSAqICAgICAgICAgQURDIHBlcmlwaGVyYWwgaWYgbm8gY29udmVyc2lvbiBpcyBvbiBnb2luZw0KLSAqICAgICAgICAgb24gaW5qZWN0ZWQgZ3JvdXAuDQotICogQG5vdGUgICBIQUxfQURDRXhfUmVndWxhclN0b3BfRE1BKCkgZnVuY3Rpb24gaXMgZGVkaWNhdGVkIHRvIHNpbmdsZS1BREMgbW9kZQ0KLSAqIG9ubHkuIEZvciBtdWx0aW1vZGUgKHdoZW4gbXVsdGltb2RlIGZlYXR1cmUgaXMgYXZhaWxhYmxlKSwNCi0gKiAgICAgICAgIEhBTF9BRENFeF9SZWd1bGFyTXVsdGlNb2RlU3RvcF9ETUEoKSBBUEkgbXVzdCBiZSB1c2VkLg0KLSAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMuDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ0V4X1JlZ3VsYXJTdG9wX0RNQShBRENfSGFuZGxlVHlwZURlZiAqaGFkYykgew0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgdG1wX2hhbF9zdGF0dXM7DQotDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsNCi0NCi0gIC8qIFByb2Nlc3MgbG9ja2VkICovDQotICBfX0hBTF9MT0NLKGhhZGMpOw0KLQ0KLSAgLyogMS4gU3RvcCBwb3RlbnRpYWwgcmVndWxhciBjb252ZXJzaW9uIG9uIGdvaW5nICovDQotICB0bXBfaGFsX3N0YXR1cyA9IEFEQ19Db252ZXJzaW9uU3RvcChoYWRjLCBBRENfUkVHVUxBUl9HUk9VUCk7DQotDQotICAvKiBEaXNhYmxlIEFEQyBwZXJpcGhlcmFsIGlmIGNvbnZlcnNpb25zIGFyZSBlZmZlY3RpdmVseSBzdG9wcGVkDQotICAgICBhbmQgaWYgbm8gaW5qZWN0ZWQgY29udmVyc2lvbiBpcyBvbi1nb2luZyAqLw0KLSAgaWYgKHRtcF9oYWxfc3RhdHVzID09IEhBTF9PSykgew0KLSAgICAvKiBDbGVhciBIQUxfQURDX1NUQVRFX1JFR19CVVNZIGJpdCAqLw0KLSAgICBDTEVBUl9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfUkVHX0JVU1kpOw0KLQ0KLSAgICAvKiBEaXNhYmxlIEFEQyBETUEgKEFEQyBETUEgY29uZmlndXJhdGlvbiBBRENfQ0ZHUl9ETUFDRkcgaXMga2VwdCkgKi8NCi0gICAgQ0xFQVJfQklUKGhhZGMtPkluc3RhbmNlLT5DRkdSLCBBRENfQ0ZHUl9ETUFFTik7DQotDQotICAgIC8qIERpc2FibGUgdGhlIERNQSBjaGFubmVsIChpbiBjYXNlIG9mIERNQSBpbiBjaXJjdWxhciBtb2RlIG9yIHN0b3Agd2hpbGUgKi8NCi0gICAgLyogd2hpbGUgRE1BIHRyYW5zZmVyIGlzIG9uIGdvaW5nKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICB0bXBfaGFsX3N0YXR1cyA9IEhBTF9ETUFfQWJvcnQoaGFkYy0+RE1BX0hhbmRsZSk7DQotDQotICAgIC8qIENoZWNrIGlmIERNQSBjaGFubmVsIGVmZmVjdGl2ZWx5IGRpc2FibGVkICovDQotICAgIGlmICh0bXBfaGFsX3N0YXR1cyAhPSBIQUxfT0spIHsNCi0gICAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gZXJyb3IgKi8NCi0gICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0VSUk9SX0RNQSk7DQotICAgIH0NCi0NCi0gICAgLyogRGlzYWJsZSBBREMgb3ZlcnJ1biBpbnRlcnJ1cHQgKi8NCi0gICAgX19IQUxfQURDX0RJU0FCTEVfSVQoaGFkYywgQURDX0lUX09WUik7DQotDQotICAgIC8qIDIuIERpc2FibGUgdGhlIEFEQyBwZXJpcGhlcmFsICovDQotICAgIC8qIFVwZGF0ZSAidG1wX2hhbF9zdGF0dXMiIG9ubHkgaWYgRE1BIGNoYW5uZWwgZGlzYWJsaW5nIHBhc3NlZCwgICAgICAgICAgKi8NCi0gICAgLyogdG8ga2VlcCBpbiBtZW1vcnkgYSBwb3RlbnRpYWwgZmFpbGluZyBzdGF0dXMuICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICBpZiAoTExfQURDX0lOSl9Jc0NvbnZlcnNpb25PbmdvaW5nKGhhZGMtPkluc3RhbmNlKSA9PSAwVUwpIHsNCi0gICAgICBpZiAodG1wX2hhbF9zdGF0dXMgPT0gSEFMX09LKSB7DQotICAgICAgICB0bXBfaGFsX3N0YXR1cyA9IEFEQ19EaXNhYmxlKGhhZGMpOw0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICAodm9pZClBRENfRGlzYWJsZShoYWRjKTsNCi0gICAgICB9DQotDQotICAgICAgLyogQ2hlY2sgaWYgQURDIGlzIGVmZmVjdGl2ZWx5IGRpc2FibGVkICovDQotICAgICAgaWYgKHRtcF9oYWxfc3RhdHVzID09IEhBTF9PSykgew0KLSAgICAgICAgLyogU2V0IEFEQyBzdGF0ZSAqLw0KLSAgICAgICAgQURDX1NUQVRFX0NMUl9TRVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfSU5KX0JVU1ksDQotICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFQURZKTsNCi0gICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9JTkpfQlVTWSk7DQotICAgIH0NCi0gIH0NCi0NCi0gIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8NCi0gIF9fSEFMX1VOTE9DSyhoYWRjKTsNCi0NCi0gIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8NCi0gIHJldHVybiB0bXBfaGFsX3N0YXR1czsNCi19DQotDQotI2lmIGRlZmluZWQoQURDX01VTFRJTU9ERV9TVVBQT1JUKQ0KLS8qKg0KLSAqIEBicmllZiAgU3RvcCBETUEtYmFzZWQgbXVsdGltb2RlIEFEQyBjb252ZXJzaW9uLCBkaXNhYmxlIEFEQyBETUEgdHJhbnNmZXIsDQotICogZGlzYWJsZSBBREMgcGVyaXBoZXJhbCBpZiBubyBpbmplY3RlZCBjb252ZXJzaW9uIGlzIG9uLWdvaW5nLg0KLSAqIEBub3RlICAgTXVsdGltb2RlIGlzIGtlcHQgZW5hYmxlZCBhZnRlciB0aGlzIGZ1bmN0aW9uLiBNdWx0aW1vZGUgRE1BIGJpdHMNCi0gKiAgICAgICAgIChNRE1BIGFuZCBETUFDRkcgYml0cyBvZiBjb21tb24gQ0NSIHJlZ2lzdGVyKSBhcmUgbWFpbnRhaW5lZC4gVG8NCi0gKiBkaXNhYmxlIG11bHRpbW9kZSAoc2V0IHdpdGggSEFMX0FEQ0V4X011bHRpTW9kZUNvbmZpZ0NoYW5uZWwoKSksIEFEQyBtdXN0IGJlDQotICogICAgICAgICByZWluaXRpYWxpemVkIHVzaW5nIEhBTF9BRENfSW5pdCgpIG9yIEhBTF9BRENfRGVJbml0KCksIG9yIHRoZSB1c2VyDQotICogY2FuIHJlc29ydCB0byBIQUxfQURDRXhfRGlzYWJsZU11bHRpTW9kZSgpIEFQSS4NCi0gKiBAbm90ZSAgIEluIGNhc2Ugb2YgRE1BIGNvbmZpZ3VyZWQgaW4gY2lyY3VsYXIgbW9kZSwgZnVuY3Rpb24NCi0gKiAgICAgICAgIEhBTF9BRENFeF9SZWd1bGFyU3RvcF9ETUEoKSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGlzIGZ1bmN0aW9uIHdpdGgNCi0gKiBoYW5kbGUgb2YgQURDIHNsYXZlLCB0byBwcm9wZXJseSBkaXNhYmxlIHRoZSBETUEgY2hhbm5lbC4NCi0gKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlIG9mIEFEQyBtYXN0ZXIgKGhhbmRsZSBvZiBBREMgc2xhdmUgbXVzdCBub3QgYmUgdXNlZCkNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDRXhfUmVndWxhck11bHRpTW9kZVN0b3BfRE1BKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKSB7DQotICBIQUxfU3RhdHVzVHlwZURlZiB0bXBfaGFsX3N0YXR1czsNCi0gIHVpbnQzMl90IHRpY2tzdGFydDsNCi0gIEFEQ19IYW5kbGVUeXBlRGVmIHRtcGhhZGNTbGF2ZTsNCi0gIHVpbnQzMl90IHRtcGhhZGNTbGF2ZV9jb252ZXJzaW9uX29uX2dvaW5nOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19BRENfTVVMVElNT0RFX01BU1RFUl9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOw0KLQ0KLSAgLyogUHJvY2VzcyBsb2NrZWQgKi8NCi0gIF9fSEFMX0xPQ0soaGFkYyk7DQotDQotICAvKiAxLiBTdG9wIHBvdGVudGlhbCBtdWx0aW1vZGUgY29udmVyc2lvbiBvbiBnb2luZywgb24gcmVndWxhciBncm91cHMgKi8NCi0gIHRtcF9oYWxfc3RhdHVzID0gQURDX0NvbnZlcnNpb25TdG9wKGhhZGMsIEFEQ19SRUdVTEFSX0dST1VQKTsNCi0NCi0gIC8qIERpc2FibGUgQURDIHBlcmlwaGVyYWwgaWYgY29udmVyc2lvbnMgYXJlIGVmZmVjdGl2ZWx5IHN0b3BwZWQgKi8NCi0gIGlmICh0bXBfaGFsX3N0YXR1cyA9PSBIQUxfT0spIHsNCi0gICAgLyogQ2xlYXIgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSBiaXQgKi8NCi0gICAgQ0xFQVJfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX1JFR19CVVNZKTsNCi0NCi0gICAgLyogVGVtcG9yYXJ5IGhhbmRsZSBtaW5pbXVtIGluaXRpYWxpemF0aW9uICovDQotICAgIF9fSEFMX0FEQ19SRVNFVF9IQU5ETEVfU1RBVEUoJnRtcGhhZGNTbGF2ZSk7DQotICAgIEFEQ19DTEVBUl9FUlJPUkNPREUoJnRtcGhhZGNTbGF2ZSk7DQotDQotICAgIC8qIFNldCBhIHRlbXBvcmFyeSBoYW5kbGUgb2YgdGhlIEFEQyBzbGF2ZSBhc3NvY2lhdGVkIHRvIHRoZSBBREMgbWFzdGVyICAgKi8NCi0gICAgQURDX01VTFRJX1NMQVZFKGhhZGMsICZ0bXBoYWRjU2xhdmUpOw0KLQ0KLSAgICBpZiAodG1waGFkY1NsYXZlLkluc3RhbmNlID09IE5VTEwpIHsNCi0gICAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gZXJyb3IgKi8NCi0gICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0VSUk9SX0NPTkZJRyk7DQotDQotICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLw0KLSAgICAgIF9fSEFMX1VOTE9DSyhoYWRjKTsNCi0NCi0gICAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgICB9DQotDQotICAgIC8qIFByb2NlZHVyZSB0byBkaXNhYmxlIHRoZSBBREMgcGVyaXBoZXJhbDogd2FpdCBmb3IgY29udmVyc2lvbnMgICAgICAgICAgKi8NCi0gICAgLyogZWZmZWN0aXZlbHkgc3RvcHBlZCAoQURDIG1hc3RlciBhbmQgQURDIHNsYXZlKSwgdGhlbiBkaXNhYmxlIEFEQyAgICAgICAqLw0KLQ0KLSAgICAvKiAxLiBXYWl0IGZvciBBREMgY29udmVyc2lvbiBjb21wbGV0aW9uIGZvciBBREMgbWFzdGVyIGFuZCBBREMgc2xhdmUgKi8NCi0gICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsNCi0NCi0gICAgdG1waGFkY1NsYXZlX2NvbnZlcnNpb25fb25fZ29pbmcgPQ0KLSAgICAgICAgTExfQURDX1JFR19Jc0NvbnZlcnNpb25PbmdvaW5nKCgmdG1waGFkY1NsYXZlKS0+SW5zdGFuY2UpOw0KLSAgICB3aGlsZSAoKExMX0FEQ19SRUdfSXNDb252ZXJzaW9uT25nb2luZyhoYWRjLT5JbnN0YW5jZSkgPT0gMVVMKSB8fA0KLSAgICAgICAgICAgKHRtcGhhZGNTbGF2ZV9jb252ZXJzaW9uX29uX2dvaW5nID09IDFVTCkpIHsNCi0gICAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gQURDX1NUT1BfQ09OVkVSU0lPTl9USU1FT1VUKSB7DQotICAgICAgICAvKiBOZXcgY2hlY2sgdG8gYXZvaWQgZmFsc2UgdGltZW91dCBkZXRlY3Rpb24gaW4gY2FzZSBvZiBwcmVlbXB0aW9uICovDQotICAgICAgICB0bXBoYWRjU2xhdmVfY29udmVyc2lvbl9vbl9nb2luZyA9DQotICAgICAgICAgICAgTExfQURDX1JFR19Jc0NvbnZlcnNpb25PbmdvaW5nKCgmdG1waGFkY1NsYXZlKS0+SW5zdGFuY2UpOw0KLSAgICAgICAgaWYgKChMTF9BRENfUkVHX0lzQ29udmVyc2lvbk9uZ29pbmcoaGFkYy0+SW5zdGFuY2UpID09IDFVTCkgfHwNCi0gICAgICAgICAgICAodG1waGFkY1NsYXZlX2NvbnZlcnNpb25fb25fZ29pbmcgPT0gMVVMKSkgew0KLSAgICAgICAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gZXJyb3IgKi8NCi0gICAgICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9JTlRFUk5BTCk7DQotDQotICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8NCi0gICAgICAgICAgX19IQUxfVU5MT0NLKGhhZGMpOw0KLQ0KLSAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0NCi0gICAgICB0bXBoYWRjU2xhdmVfY29udmVyc2lvbl9vbl9nb2luZyA9DQotICAgICAgICAgIExMX0FEQ19SRUdfSXNDb252ZXJzaW9uT25nb2luZygoJnRtcGhhZGNTbGF2ZSktPkluc3RhbmNlKTsNCi0gICAgfQ0KLQ0KLSAgICAvKiBEaXNhYmxlIHRoZSBETUEgY2hhbm5lbCAoaW4gY2FzZSBvZiBETUEgaW4gY2lyY3VsYXIgbW9kZSBvciBzdG9wICAgICAgICovDQotICAgIC8qIHdoaWxlIERNQSB0cmFuc2ZlciBpcyBvbiBnb2luZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgLyogTm90ZTogRE1BIGNoYW5uZWwgb2YgQURDIHNsYXZlIHNob3VsZCBiZSBzdG9wcGVkIGFmdGVyIHRoaXMgZnVuY3Rpb24gICAqLw0KLSAgICAvKiB3aXRoIEhBTF9BRENFeF9SZWd1bGFyU3RvcF9ETUEoKSBBUEkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIHRtcF9oYWxfc3RhdHVzID0gSEFMX0RNQV9BYm9ydChoYWRjLT5ETUFfSGFuZGxlKTsNCi0NCi0gICAgLyogQ2hlY2sgaWYgRE1BIGNoYW5uZWwgZWZmZWN0aXZlbHkgZGlzYWJsZWQgKi8NCi0gICAgaWYgKHRtcF9oYWxfc3RhdHVzICE9IEhBTF9PSykgew0KLSAgICAgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSB0byBlcnJvciAqLw0KLSAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfRVJST1JfRE1BKTsNCi0gICAgfQ0KLQ0KLSAgICAvKiBEaXNhYmxlIEFEQyBvdmVycnVuIGludGVycnVwdCAqLw0KLSAgICBfX0hBTF9BRENfRElTQUJMRV9JVChoYWRjLCBBRENfSVRfT1ZSKTsNCi0NCi0gICAgLyogMi4gRGlzYWJsZSB0aGUgQURDIHBlcmlwaGVyYWxzOiBtYXN0ZXIgYW5kIHNsYXZlIGlmIG5vIGluamVjdGVkICAgICAgICAqLw0KLSAgICAvKiAgIGNvbnZlcnNpb24gaXMgb24tZ29pbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIC8qIFVwZGF0ZSAidG1wX2hhbF9zdGF0dXMiIG9ubHkgaWYgRE1BIGNoYW5uZWwgZGlzYWJsaW5nIHBhc3NlZCwgdG8ga2VlcCBpbg0KLSAgICAgKi8NCi0gICAgLyogbWVtb3J5IGEgcG90ZW50aWFsIGZhaWxpbmcgc3RhdHVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICBpZiAodG1wX2hhbF9zdGF0dXMgPT0gSEFMX09LKSB7DQotICAgICAgaWYgKExMX0FEQ19JTkpfSXNDb252ZXJzaW9uT25nb2luZyhoYWRjLT5JbnN0YW5jZSkgPT0gMFVMKSB7DQotICAgICAgICB0bXBfaGFsX3N0YXR1cyA9IEFEQ19EaXNhYmxlKGhhZGMpOw0KLSAgICAgICAgaWYgKHRtcF9oYWxfc3RhdHVzID09IEhBTF9PSykgew0KLSAgICAgICAgICBpZiAoTExfQURDX0lOSl9Jc0NvbnZlcnNpb25PbmdvaW5nKCgmdG1waGFkY1NsYXZlKS0+SW5zdGFuY2UpID09DQotICAgICAgICAgICAgICAwVUwpIHsNCi0gICAgICAgICAgICB0bXBfaGFsX3N0YXR1cyA9IEFEQ19EaXNhYmxlKCZ0bXBoYWRjU2xhdmUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgfQ0KLQ0KLSAgICAgIGlmICh0bXBfaGFsX3N0YXR1cyA9PSBIQUxfT0spIHsNCi0gICAgICAgIC8qIEJvdGggTWFzdGVyIGFuZCBTbGF2ZSBBREMncyBjb3VsZCBiZSBkaXNhYmxlZC4gVXBkYXRlIE1hc3RlciBTdGF0ZSAqLw0KLSAgICAgICAgLyogQ2xlYXIgSEFMX0FEQ19TVEFURV9JTkpfQlVTWSBiaXQsIHNldCBIQUxfQURDX1NUQVRFX1JFQURZIGJpdCAqLw0KLSAgICAgICAgQURDX1NUQVRFX0NMUl9TRVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfSU5KX0JVU1ksDQotICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFQURZKTsNCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgLyogaW5qZWN0ZWQgKE1hc3RlciBvciBTbGF2ZSkgY29udmVyc2lvbnMgYXJlIHN0aWxsIG9uLWdvaW5nLA0KLSAgICAgICAgICAgbm8gTWFzdGVyIFN0YXRlIGNoYW5nZSAqLw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLw0KLSAgX19IQUxfVU5MT0NLKGhhZGMpOw0KLQ0KLSAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLw0KLSAgcmV0dXJuIHRtcF9oYWxfc3RhdHVzOw0KLX0NCi0jZW5kaWYgLyogQURDX01VTFRJTU9ERV9TVVBQT1JUICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEFEQ0V4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgQURDIEV4dGVuZGVkIFBlcmlwaGVyYWwgQ29udHJvbA0KLWZ1bmN0aW9ucw0KLSAgKiBAYnJpZWYgICAgQURDIEV4dGVuZGVkIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMNCi0gICoNCi1AdmVyYmF0aW0NCi0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICMjIyMjDQotID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoNCi0gICAgICAoKykgQ29uZmlndXJlIGNoYW5uZWxzIG9uIGluamVjdGVkIGdyb3VwDQotICAgICAgKCspIENvbmZpZ3VyZSBtdWx0aW1vZGUgd2hlbiBtdWx0aW1vZGUgZmVhdHVyZSBpcyBhdmFpbGFibGUNCi0gICAgICAoKykgRW5hYmxlIG9yIERpc2FibGUgSW5qZWN0ZWQgUXVldWUNCi0gICAgICAoKykgRGlzYWJsZSBBREMgdm9sdGFnZSByZWd1bGF0b3INCi0gICAgICAoKykgRW50ZXIgQURDIGRlZXAtcG93ZXItZG93biBtb2RlDQotDQotQGVuZHZlcmJhdGltDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ29uZmlndXJlIGEgY2hhbm5lbCB0byBiZSBhc3NpZ25lZCB0byBBREMgZ3JvdXAgaW5qZWN0ZWQuDQotICogQG5vdGUgICBQb3NzaWJpbGl0eSB0byB1cGRhdGUgcGFyYW1ldGVycyBvbiB0aGUgZmx5Og0KLSAqICAgICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyBpbmplY3RlZCBncm91cCwgZm9sbG93aW5nIGNhbGxzIHRvIHRoaXMNCi0gKiAgICAgICAgIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHJlY29uZmlndXJlIHNvbWUgcGFyYW1ldGVycyBvZiBzdHJ1Y3R1cmUNCi0gKiAgICAgICAgICJBRENfSW5qZWN0aW9uQ29uZlR5cGVEZWYiIG9uIHRoZSBmbHksIHdpdGhvdXQgcmVzZXR0aW5nIHRoZSBBREMuDQotICogICAgICAgICBUaGUgc2V0dGluZyBvZiB0aGVzZSBwYXJhbWV0ZXJzIGlzIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZToNCi0gKiAgICAgICAgIFJlZmVyIHRvIGNvbW1lbnRzIG9mIHN0cnVjdHVyZSAiQURDX0luamVjdGlvbkNvbmZUeXBlRGVmIi4NCi0gKiBAbm90ZSAgIEluIGNhc2Ugb2YgdXNhZ2Ugb2YgaW50ZXJuYWwgbWVhc3VyZW1lbnQgY2hhbm5lbHM6DQotICogICAgICAgICBWYmF0L1ZyZWZJbnQvVGVtcFNlbnNvci4NCi0gKiAgICAgICAgIFRoZXNlIGludGVybmFsIHBhdGhzIGNhbiBiZSBkaXNhYmxlZCB1c2luZyBmdW5jdGlvbg0KLSAqICAgICAgICAgSEFMX0FEQ19EZUluaXQoKS4NCi0gKiBAbm90ZSAgIENhdXRpb246IEZvciBJbmplY3RlZCBDb250ZXh0IFF1ZXVlIHVzZSwgYSBjb250ZXh0IG11c3QgYmUgZnVsbHkNCi0gKiAgICAgICAgIGRlZmluZWQgYmVmb3JlIHN0YXJ0IG9mIGluamVjdGVkIGNvbnZlcnNpb24uIEFsbCBjaGFubmVscyBhcmUNCi0gKiBjb25maWd1cmVkIGNvbnNlY3V0aXZlbHkgZm9yIHRoZSBzYW1lIEFEQyBpbnN0YW5jZS4gVGhlcmVmb3JlLCB0aGUgbnVtYmVyIG9mDQotICogY2FsbHMgdG8gSEFMX0FEQ0V4X0luamVjdGVkQ29uZmlnQ2hhbm5lbCgpIG11c3QgYmUgZXF1YWwgdG8gdGhlIHZhbHVlIG9mDQotICogcGFyYW1ldGVyIEluamVjdGVkTmJyT2ZDb252ZXJzaW9uIGZvciBlYWNoIGNvbnRleHQuDQotICogIC0gRXhhbXBsZSAxOiBJZiAxIGNvbnRleHQgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCAob3IgaWYgdGhlcmUgaXMgbm8gdXNlIG9mDQotICogdGhlIEluamVjdGVkIFF1ZXVlIENvbnRleHQgZmVhdHVyZSkgYW5kIGlmIHRoZSBjb250ZXh0IGNvbnRhaW5zIDMgaW5qZWN0ZWQNCi0gKiByYW5rcyAoSW5qZWN0ZWROYnJPZkNvbnZlcnNpb24gPSAzKSwgSEFMX0FEQ0V4X0luamVjdGVkQ29uZmlnQ2hhbm5lbCgpIG11c3QNCi0gKiBiZSBjYWxsZWQgb25jZSBmb3IgZWFjaCBjaGFubmVsIChpLmUuIDMgdGltZXMpIGJlZm9yZSBzdGFydGluZyBhIGNvbnZlcnNpb24uDQotICogICAgVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBjYWxsZWQgdG8gY29uZmlndXJlIGEgNHRoIGluamVjdGVkIGNoYW5uZWw6DQotICogICAgaXQgd291bGQgc3RhcnQgYSBuZXcgY29udGV4dCBpbnRvIGNvbnRleHQgcXVldWUuDQotICogIC0gRXhhbXBsZSAyOiBJZiAyIGNvbnRleHRzIGFyZSBpbnRlbmRlZCB0byBiZSB1c2VkIGFuZCBlYWNoIG9mIHRoZW0gY29udGFpbnMNCi0gKiAgICAzIGluamVjdGVkIHJhbmtzIChJbmplY3RlZE5ick9mQ29udmVyc2lvbiA9IDMpLA0KLSAqICAgIEhBTF9BRENFeF9JbmplY3RlZENvbmZpZ0NoYW5uZWwoKSBtdXN0IGJlIGNhbGxlZCBvbmNlIGZvciBlYWNoIGNoYW5uZWwgYW5kDQotICogICAgZm9yIGVhY2ggY29udGV4dCAoMyBjaGFubmVscyB4IDIgY29udGV4dHMgPSA2IGNhbGxzKS4gQ29udmVyc2lvbiBjYW4NCi0gKiAgICBzdGFydCBvbmNlIHRoZSAxc3QgY29udGV4dCBpcyBzZXQsIHRoYXQgaXMgYWZ0ZXIgdGhlIGZpcnN0IHRocmVlDQotICogICAgSEFMX0FEQ0V4X0luamVjdGVkQ29uZmlnQ2hhbm5lbCgpIGNhbGxzLiBUaGUgMm5kIGNvbnRleHQgY2FuIGJlIHNldCBvbiB0aGUNCi0gKiBmbHkuDQotICogQHBhcmFtIGhhZGMgQURDIGhhbmRsZQ0KLSAqIEBwYXJhbSBzQ29uZmlnSW5qZWN0ZWQgU3RydWN0dXJlIG9mIEFEQyBpbmplY3RlZCBncm91cCBhbmQgQURDIGNoYW5uZWwgZm9yDQotICogICAgICAgICBpbmplY3RlZCBncm91cC4NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDRXhfSW5qZWN0ZWRDb25maWdDaGFubmVsKA0KLSAgICBBRENfSGFuZGxlVHlwZURlZiAqaGFkYywgQURDX0luamVjdGlvbkNvbmZUeXBlRGVmICpzQ29uZmlnSW5qZWN0ZWQpIHsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIHRtcF9oYWxfc3RhdHVzID0gSEFMX09LOw0KLSAgdWludDMyX3QgdG1wT2Zmc2V0U2hpZnRlZDsNCi0gIHVpbnQzMl90IHRtcF9jb25maWdfaW50ZXJuYWxfY2hhbm5lbDsNCi0gIHVpbnQzMl90IHRtcF9hZGNfaXNfY29udmVyc2lvbl9vbl9nb2luZ19yZWd1bGFyOw0KLSAgdWludDMyX3QgdG1wX2FkY19pc19jb252ZXJzaW9uX29uX2dvaW5nX2luamVjdGVkOw0KLSAgX19JTyB1aW50MzJfdCB3YWl0X2xvb3BfaW5kZXggPSAwOw0KLQ0KLSAgdWludDMyX3QgdG1wX0pTUVJfQ29udGV4dFF1ZXVlQmVpbmdCdWlsdCA9IDBVOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfQURDX1NBTVBMRV9USU1FKHNDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRTYW1wbGluZ1RpbWUpKTsNCi0gIGFzc2VydF9wYXJhbShJU19BRENfU0lOR0xFX0RJRkZFUkVOVElBTChzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkU2luZ2xlRGlmZikpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoc0NvbmZpZ0luamVjdGVkLT5BdXRvSW5qZWN0ZWRDb252KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShzQ29uZmlnSW5qZWN0ZWQtPlF1ZXVlSW5qZWN0ZWRDb250ZXh0KSk7DQotICBhc3NlcnRfcGFyYW0oDQotICAgICAgSVNfQURDX0VYVFRSSUdJTkpFQ19FREdFKHNDb25maWdJbmplY3RlZC0+RXh0ZXJuYWxUcmlnSW5qZWNDb252RWRnZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKA0KLSAgICAgIElTX0FEQ19FWFRUUklHSU5KRUMoaGFkYywgc0NvbmZpZ0luamVjdGVkLT5FeHRlcm5hbFRyaWdJbmplY0NvbnYpKTsNCi0gIGFzc2VydF9wYXJhbShJU19BRENfT0ZGU0VUX05VTUJFUihzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkT2Zmc2V0TnVtYmVyKSk7DQotICBhc3NlcnRfcGFyYW0oDQotICAgICAgSVNfQURDX1JBTkdFKEFEQ19HRVRfUkVTT0xVVElPTihoYWRjKSwgc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZE9mZnNldCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0FEQ19PRkZTRVRfU0lHTihzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkT2Zmc2V0U2lnbikpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZE9mZnNldFNhdHVyYXRpb24pKTsNCi0gIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKHNDb25maWdJbmplY3RlZC0+SW5qZWNPdmVyc2FtcGxpbmdNb2RlKSk7DQotDQotICBpZiAoaGFkYy0+SW5pdC5TY2FuQ29udk1vZGUgIT0gQURDX1NDQU5fRElTQUJMRSkgew0KLSAgICBhc3NlcnRfcGFyYW0oSVNfQURDX0lOSkVDVEVEX1JBTksoc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZFJhbmspKTsNCi0gICAgYXNzZXJ0X3BhcmFtKA0KLSAgICAgICAgSVNfQURDX0lOSkVDVEVEX05CX0NPTlYoc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZE5ick9mQ29udmVyc2lvbikpOw0KLSAgICBhc3NlcnRfcGFyYW0oDQotICAgICAgICBJU19GVU5DVElPTkFMX1NUQVRFKHNDb25maWdJbmplY3RlZC0+SW5qZWN0ZWREaXNjb250aW51b3VzQ29udk1vZGUpKTsNCi0gIH0NCi0NCi0gIC8qIGlmIEpPVlNFIGlzIHNldCwgdGhlIHZhbHVlIG9mIHRoZSBPRkZTRVR5X0VOIGJpdCBpbiBBREN4X09GUnkgcmVnaXN0ZXIgaXMNCi0gICAgIGlnbm9yZWQgKGNvbnNpZGVyZWQgYXMgcmVzZXQpICovDQotICBhc3NlcnRfcGFyYW0oISgoc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZE9mZnNldE51bWJlciAhPSBBRENfT0ZGU0VUX05PTkUpICYmDQotICAgICAgICAgICAgICAgICAoc0NvbmZpZ0luamVjdGVkLT5JbmplY092ZXJzYW1wbGluZ01vZGUgPT0gRU5BQkxFKSkpOw0KLQ0KLSAgLyogSkRJU0NFTiBhbmQgSkFVVE8gYml0cyBjYW4ndCBiZSBzZXQgYXQgdGhlIHNhbWUgdGltZSAgKi8NCi0gIGFzc2VydF9wYXJhbSghKChzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkRGlzY29udGludW91c0NvbnZNb2RlID09IEVOQUJMRSkgJiYNCi0gICAgICAgICAgICAgICAgIChzQ29uZmlnSW5qZWN0ZWQtPkF1dG9JbmplY3RlZENvbnYgPT0gRU5BQkxFKSkpOw0KLQ0KLSAgLyogIERJU0NFTiBhbmQgSkFVVE8gYml0cyBjYW4ndCBiZSBzZXQgYXQgdGhlIHNhbWUgdGltZSAqLw0KLSAgYXNzZXJ0X3BhcmFtKCEoKGhhZGMtPkluaXQuRGlzY29udGludW91c0NvbnZNb2RlID09IEVOQUJMRSkgJiYNCi0gICAgICAgICAgICAgICAgIChzQ29uZmlnSW5qZWN0ZWQtPkF1dG9JbmplY3RlZENvbnYgPT0gRU5BQkxFKSkpOw0KLQ0KLSAgLyogVmVyaWZpY2F0aW9uIG9mIGNoYW5uZWwgbnVtYmVyICovDQotICBpZiAoc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZFNpbmdsZURpZmYgIT0gQURDX0RJRkZFUkVOVElBTF9FTkRFRCkgew0KLSAgICBhc3NlcnRfcGFyYW0oSVNfQURDX0NIQU5ORUwoaGFkYywgc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZENoYW5uZWwpKTsNCi0gIH0gZWxzZSB7DQotICAgIGFzc2VydF9wYXJhbShJU19BRENfRElGRl9DSEFOTkVMKGhhZGMsIHNDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRDaGFubmVsKSk7DQotICB9DQotDQotICAvKiBQcm9jZXNzIGxvY2tlZCAqLw0KLSAgX19IQUxfTE9DSyhoYWRjKTsNCi0NCi0gIC8qIENvbmZpZ3VyYXRpb24gb2YgaW5qZWN0ZWQgZ3JvdXAgc2VxdWVuY2VyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgLyogSGFyZHdhcmUgY29uc3RyYWludDogTXVzdCBmdWxseSBkZWZpbmUgaW5qZWN0ZWQgY29udGV4dCByZWdpc3RlciBKU1FSICAgICovDQotICAvKiBiZWZvcmUgbWFrZSBpdCBlbnRlcmluZyBpbnRvIGluamVjdGVkIHNlcXVlbmNlciBxdWV1ZS4gICAgICAgICAgICAgICAgICAgKi8NCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgLyogLSBpZiBzY2FuIG1vZGUgaXMgZGlzYWJsZWQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAvKiAgICAqIEluamVjdGVkIGNoYW5uZWxzIHNlcXVlbmNlIGxlbmd0aCBpcyBzZXQgdG8gMHgwMDogMSBjaGFubmVsICAgICAgICAgKi8NCi0gIC8qICAgICAgY29udmVydGVkIChjaGFubmVsIG9uIGluamVjdGVkIHJhbmsgMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgLyogICAgICBQYXJhbWV0ZXIgIkluamVjdGVkTmJyT2ZDb252ZXJzaW9uIiBpcyBkaXNjYXJkZWQuICAgICAgICAgICAgICAgICAgICovDQotICAvKiAgICAqIEluamVjdGVkIGNvbnRleHQgcmVnaXN0ZXIgSlNRUiBzZXR0aW5nIGlzIHNpbXBsZTogcmVnaXN0ZXIgaXMgZnVsbHkgKi8NCi0gIC8qICAgICAgZGVmaW5lZCBvbiBvbmUgY2FsbCBvZiB0aGlzIGZ1bmN0aW9uIChmb3IgaW5qZWN0ZWQgcmFuayAxKSBhbmQgY2FuICAqLw0KLSAgLyogICAgICBiZSBlbnRlcmVkIGludG8gcXVldWUgZGlyZWN0bHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAvKiAtIGlmIHNjYW4gbW9kZSBpcyBlbmFibGVkOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gIC8qICAgICogSW5qZWN0ZWQgY2hhbm5lbHMgc2VxdWVuY2UgbGVuZ3RoIGlzIHNldCB0byBwYXJhbWV0ZXIgICAgICAgICAgICAgICAqLw0KLSAgLyogICAgICAiSW5qZWN0ZWROYnJPZkNvbnZlcnNpb24iLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAvKiAgICAqIEluamVjdGVkIGNvbnRleHQgcmVnaXN0ZXIgSlNRUiBzZXR0aW5nIG1vcmUgY29tcGxleDogcmVnaXN0ZXIgaXMgICAgKi8NCi0gIC8qICAgICAgZnVsbHkgZGVmaW5lZCBvdmVyIHN1Y2Nlc3NpdmUgY2FsbHMgb2YgdGhpcyBmdW5jdGlvbiwgZm9yIGVhY2ggICAgICAqLw0KLSAgLyogICAgICBpbmplY3RlZCBjaGFubmVsIHJhbmsuIEl0IGlzIGVudGVyZWQgaW50byBxdWV1ZSBvbmx5IHdoZW4gYWxsICAgICAgICovDQotICAvKiAgICAgIGluamVjdGVkIHJhbmtzIGhhdmUgYmVlbiBzZXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gIC8qICAgTm90ZTogU2NhbiBtb2RlIGlzIG5vdCBwcmVzZW50IGJ5IGhhcmR3YXJlIG9uIHRoaXMgZGV2aWNlLCBidXQgdXNlZCAgICAqLw0KLSAgLyogICBieSBzb2Z0d2FyZSBmb3IgYWxpZ25tZW50IG92ZXIgYWxsIFNUTTMyIGRldmljZXMuICAgICAgICAgICAgICAgICAgICAgICovDQotDQotICBpZiAoKGhhZGMtPkluaXQuU2NhbkNvbnZNb2RlID09IEFEQ19TQ0FOX0RJU0FCTEUpIHx8DQotICAgICAgKHNDb25maWdJbmplY3RlZC0+SW5qZWN0ZWROYnJPZkNvbnZlcnNpb24gPT0gMVUpKSB7DQotICAgIC8qIENvbmZpZ3VyYXRpb24gb2YgY29udGV4dCByZWdpc3RlciBKU1FSOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgLyogIC0gbnVtYmVyIG9mIHJhbmtzIGluIGluamVjdGVkIGdyb3VwIHNlcXVlbmNlcjogZml4ZWQgdG8gMXN0IHJhbmsgICAgICAqLw0KLSAgICAvKiAgICAoc2NhbiBtb2RlIGRpc2FibGVkLCBvbmx5IHJhbmsgMSB1c2VkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIC8qICAtIGV4dGVybmFsIHRyaWdnZXIgdG8gc3RhcnQgY29udmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgLyogIC0gZXh0ZXJuYWwgdHJpZ2dlciBwb2xhcml0eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICAvKiAgLSBjaGFubmVsIHNldCB0byByYW5rIDEgKHNjYW4gbW9kZSBkaXNhYmxlZCwgb25seSByYW5rIDEgY2FuIGJlIHVzZWQpICovDQotDQotICAgIGlmIChzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkUmFuayA9PSBBRENfSU5KRUNURURfUkFOS18xKSB7DQotICAgICAgLyogRW5hYmxlIGV4dGVybmFsIHRyaWdnZXIgaWYgdHJpZ2dlciBzZWxlY3Rpb24gaXMgZGlmZmVyZW50IG9mICAgICAgICAgKi8NCi0gICAgICAvKiBzb2Z0d2FyZSBzdGFydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICAgIC8qIE5vdGU6IFRoaXMgY29uZmlndXJhdGlvbiBrZWVwcyB0aGUgaGFyZHdhcmUgZmVhdHVyZSBvZiBwYXJhbWV0ZXIgICAgICovDQotICAgICAgLyogICAgICAgRXh0ZXJuYWxUcmlnSW5qZWNDb252RWRnZSAidHJpZ2dlciBlZGdlIG5vbmUiIGVxdWl2YWxlbnQgdG8gICAgKi8NCi0gICAgICAvKiAgICAgICBzb2Z0d2FyZSBzdGFydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICAgIGlmIChzQ29uZmlnSW5qZWN0ZWQtPkV4dGVybmFsVHJpZ0luamVjQ29udiAhPQ0KLSAgICAgICAgICBBRENfSU5KRUNURURfU09GVFdBUkVfU1RBUlQpIHsNCi0gICAgICAgIHRtcF9KU1FSX0NvbnRleHRRdWV1ZUJlaW5nQnVpbHQgPQ0KLSAgICAgICAgICAgIChBRENfSlNRUl9SSyhzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkQ2hhbm5lbCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgQURDX0lOSkVDVEVEX1JBTktfMSkgfA0KLSAgICAgICAgICAgICAoc0NvbmZpZ0luamVjdGVkLT5FeHRlcm5hbFRyaWdJbmplY0NvbnYgJiBBRENfSlNRUl9KRVhUU0VMKSB8DQotICAgICAgICAgICAgIHNDb25maWdJbmplY3RlZC0+RXh0ZXJuYWxUcmlnSW5qZWNDb252RWRnZSk7DQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgIHRtcF9KU1FSX0NvbnRleHRRdWV1ZUJlaW5nQnVpbHQgPSAoQURDX0pTUVJfUksoDQotICAgICAgICAgICAgc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZENoYW5uZWwsIEFEQ19JTkpFQ1RFRF9SQU5LXzEpKTsNCi0gICAgICB9DQotDQotICAgICAgTU9ESUZZX1JFRyhoYWRjLT5JbnN0YW5jZS0+SlNRUiwgQURDX0pTUVJfRklFTERTLA0KLSAgICAgICAgICAgICAgICAgdG1wX0pTUVJfQ29udGV4dFF1ZXVlQmVpbmdCdWlsdCk7DQotICAgICAgLyogRm9yIGRlYnVnIGFuZCBpbmZvcm1hdGl2ZSByZWFzb25zLCBoYWRjIGhhbmRsZSBzYXZlcyBKU1FSIHNldHRpbmcgKi8NCi0gICAgICBoYWRjLT5JbmplY3Rpb25Db25maWcuQ29udGV4dFF1ZXVlID0gdG1wX0pTUVJfQ29udGV4dFF1ZXVlQmVpbmdCdWlsdDsNCi0gICAgfQ0KLSAgfSBlbHNlIHsNCi0gICAgLyogQ2FzZSBvZiBzY2FuIG1vZGUgZW5hYmxlZCwgc2V2ZXJhbCBjaGFubmVscyB0byBzZXQgaW50byBpbmplY3RlZCBncm91cCAqLw0KLSAgICAvKiBzZXF1ZW5jZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgLyogUHJvY2VkdXJlIHRvIGRlZmluZSBpbmplY3RlZCBjb250ZXh0IHJlZ2lzdGVyIEpTUVIgb3ZlciBzdWNjZXNzaXZlICAgICAqLw0KLSAgICAvKiBjYWxscyBvZiB0aGlzIGZ1bmN0aW9uLCBmb3IgZWFjaCBpbmplY3RlZCBjaGFubmVsIHJhbms6ICAgICAgICAgICAgICAgICovDQotICAgIC8qIDEuIFN0YXJ0IG5ldyBjb250ZXh0IGFuZCBzZXQgcGFyYW1ldGVycyByZWxhdGVkIHRvIGFsbCBpbmplY3RlZCAgICAgICAgKi8NCi0gICAgLyogICAgY2hhbm5lbHM6IGluamVjdGVkIHNlcXVlbmNlIGxlbmd0aCBhbmQgdHJpZ2dlci4gICAgICAgICAgICAgICAgICAgICAqLw0KLQ0KLSAgICAvKiBpZiBoYWRjLT5JbmplY3Rpb25Db25maWcuQ2hhbm5lbENvdW50IGlzIGVxdWFsIHRvIDAsIHRoaXMgaXMgdGhlIGZpcnN0ICovDQotICAgIC8qICAgY2FsbCBvZiB0aGUgY29udGV4dCB1bmRlciBzZXR0aW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgaWYgKGhhZGMtPkluamVjdGlvbkNvbmZpZy5DaGFubmVsQ291bnQgPT0gMFUpIHsNCi0gICAgICAvKiBJbml0aWFsaXplIG51bWJlciBvZiBjaGFubmVscyB0aGF0IHdpbGwgYmUgY29uZmlndXJlZCBvbiB0aGUgY29udGV4dCAqLw0KLSAgICAgIC8qICBiZWluZyBidWlsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgICAgaGFkYy0+SW5qZWN0aW9uQ29uZmlnLkNoYW5uZWxDb3VudCA9DQotICAgICAgICAgIHNDb25maWdJbmplY3RlZC0+SW5qZWN0ZWROYnJPZkNvbnZlcnNpb247DQotICAgICAgLyogSGFuZGxlIGhhZGMgc2F2ZXMgdGhlIGNvbnRleHQgdW5kZXIgYnVpbGQgdXAgb3ZlciBlYWNoDQotICAgICAgICAgSEFMX0FEQ0V4X0luamVjdGVkQ29uZmlnQ2hhbm5lbCgpIGNhbGwsIHRoaXMgY29udGV4dCB3aWxsIGJlIHdyaXR0ZW4gaW4NCi0gICAgICAgICBKU1FSIHJlZ2lzdGVyIGF0IHRoZSBsYXN0IGNhbGwuIEF0IHRoaXMgcG9pbnQsIHRoZSBjb250ZXh0IGlzIG1lcmVseQ0KLSAgICAgICAgIHJlc2V0ICAqLw0KLSAgICAgIGhhZGMtPkluamVjdGlvbkNvbmZpZy5Db250ZXh0UXVldWUgPSAweDAwMDAwMDAwVTsNCi0NCi0gICAgICAvKiBDb25maWd1cmF0aW9uIG9mIGNvbnRleHQgcmVnaXN0ZXIgSlNRUjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICAgIC8qICAtIG51bWJlciBvZiByYW5rcyBpbiBpbmplY3RlZCBncm91cCBzZXF1ZW5jZXIgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgICAgLyogIC0gZXh0ZXJuYWwgdHJpZ2dlciB0byBzdGFydCBjb252ZXJzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgICAvKiAgLSBleHRlcm5hbCB0cmlnZ2VyIHBvbGFyaXR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLQ0KLSAgICAgIC8qIEVuYWJsZSBleHRlcm5hbCB0cmlnZ2VyIGlmIHRyaWdnZXIgc2VsZWN0aW9uIGlzIGRpZmZlcmVudCBvZiAgICAgICAgICovDQotICAgICAgLyogc29mdHdhcmUgc3RhcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgICAvKiBOb3RlOiBUaGlzIGNvbmZpZ3VyYXRpb24ga2VlcHMgdGhlIGhhcmR3YXJlIGZlYXR1cmUgb2YgcGFyYW1ldGVyICAgICAqLw0KLSAgICAgIC8qICAgICAgIEV4dGVybmFsVHJpZ0luamVjQ29udkVkZ2UgInRyaWdnZXIgZWRnZSBub25lIiBlcXVpdmFsZW50IHRvICAgICovDQotICAgICAgLyogICAgICAgc29mdHdhcmUgc3RhcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgICBpZiAoc0NvbmZpZ0luamVjdGVkLT5FeHRlcm5hbFRyaWdJbmplY0NvbnYgIT0NCi0gICAgICAgICAgQURDX0lOSkVDVEVEX1NPRlRXQVJFX1NUQVJUKSB7DQotICAgICAgICB0bXBfSlNRUl9Db250ZXh0UXVldWVCZWluZ0J1aWx0ID0NCi0gICAgICAgICAgICAoKHNDb25maWdJbmplY3RlZC0+SW5qZWN0ZWROYnJPZkNvbnZlcnNpb24gLSAxVSkgfA0KLSAgICAgICAgICAgICAoc0NvbmZpZ0luamVjdGVkLT5FeHRlcm5hbFRyaWdJbmplY0NvbnYgJiBBRENfSlNRUl9KRVhUU0VMKSB8DQotICAgICAgICAgICAgIHNDb25maWdJbmplY3RlZC0+RXh0ZXJuYWxUcmlnSW5qZWNDb252RWRnZSk7DQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgIHRtcF9KU1FSX0NvbnRleHRRdWV1ZUJlaW5nQnVpbHQgPQ0KLSAgICAgICAgICAgICgoc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZE5ick9mQ29udmVyc2lvbiAtIDFVKSk7DQotICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qIDIuIENvbnRpbnVlIHNldHRpbmcgb2YgY29udGV4dCB1bmRlciBkZWZpbml0aW9uIHdpdGggcGFyYW1ldGVyICAgICAgICovDQotICAgIC8qICAgIHJlbGF0ZWQgdG8gZWFjaCBjaGFubmVsOiBjaGFubmVsIHJhbmsgc2VxdWVuY2UgICAgICAgICAgICAgICAgICAgICovDQotICAgIC8qIENsZWFyIHRoZSBvbGQgSlNReCBiaXRzIGZvciB0aGUgc2VsZWN0ZWQgcmFuayAqLw0KLSAgICB0bXBfSlNRUl9Db250ZXh0UXVldWVCZWluZ0J1aWx0ICY9DQotICAgICAgICB+QURDX0pTUVJfUksoQURDX1NRUjNfU1ExMCwgc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZFJhbmspOw0KLQ0KLSAgICAvKiBTZXQgdGhlIEpTUXggYml0cyBmb3IgdGhlIHNlbGVjdGVkIHJhbmsgKi8NCi0gICAgdG1wX0pTUVJfQ29udGV4dFF1ZXVlQmVpbmdCdWlsdCB8PSBBRENfSlNRUl9SSygNCi0gICAgICAgIHNDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRDaGFubmVsLCBzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkUmFuayk7DQotDQotICAgIC8qIERlY3JlYXNlIGNoYW5uZWwgY291bnQgICovDQotICAgIGhhZGMtPkluamVjdGlvbkNvbmZpZy5DaGFubmVsQ291bnQtLTsNCi0NCi0gICAgLyogMy4gdG1wX0pTUVJfQ29udGV4dFF1ZXVlQmVpbmdCdWlsdCBpcyBmdWxseSBidWlsdCBmb3IgdGhpcw0KLSAgICAgICBIQUxfQURDRXhfSW5qZWN0ZWRDb25maWdDaGFubmVsKCkgY2FsbCwgYWdncmVnYXRlIHRoZSBzZXR0aW5nIHRvIHRob3NlDQotICAgICAgIGFscmVhZHkgYnVpbHQgZHVyaW5nIHRoZSBwcmV2aW91cyBIQUxfQURDRXhfSW5qZWN0ZWRDb25maWdDaGFubmVsKCkgY2FsbHMNCi0gICAgICAgKGZvciB0aGUgc2FtZSBjb250ZXh0IG9mIGNvdXJzZSkgICovDQotICAgIGhhZGMtPkluamVjdGlvbkNvbmZpZy5Db250ZXh0UXVldWUgfD0gdG1wX0pTUVJfQ29udGV4dFF1ZXVlQmVpbmdCdWlsdDsNCi0NCi0gICAgLyogNC4gRW5kIG9mIGNvbnRleHQgc2V0dGluZzogaWYgdGhpcyBpcyB0aGUgbGFzdCBjaGFubmVsIHNldCwgdGhlbiB3cml0ZQ0KLSAgICAgICBjb250ZXh0IGludG8gcmVnaXN0ZXIgSlNRUiBhbmQgbWFrZSBpdCBlbnRlciBpbnRvIHF1ZXVlICovDQotICAgIGlmIChoYWRjLT5JbmplY3Rpb25Db25maWcuQ2hhbm5lbENvdW50ID09IDBVKSB7DQotICAgICAgTU9ESUZZX1JFRyhoYWRjLT5JbnN0YW5jZS0+SlNRUiwgQURDX0pTUVJfRklFTERTLA0KLSAgICAgICAgICAgICAgICAgaGFkYy0+SW5qZWN0aW9uQ29uZmlnLkNvbnRleHRRdWV1ZSk7DQotICAgIH0NCi0gIH0NCi0NCi0gIC8qIFBhcmFtZXRlcnMgdXBkYXRlIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgLyogUGFyYW1ldGVycyB0aGF0IGNhbiBiZSB1cGRhdGVkIHdoZW4gQURDIGlzIGRpc2FibGVkIG9yIGVuYWJsZWQgd2l0aG91dCAgICovDQotICAvKiBjb252ZXJzaW9uIG9uIGdvaW5nIG9uIGluamVjdGVkIGdyb3VwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gIC8qICAtIEluamVjdGVkIGNvbnRleHQgcXVldWU6IFF1ZXVlIGRpc2FibGUgKGFjdGl2ZSBjb250ZXh0IGlzIGtlcHQpIG9yICAgICAqLw0KLSAgLyogICAgZW5hYmxlIChjb250ZXh0IGRlY3JlbWVudGVkLCB1cCB0byAyIGNvbnRleHRzIHF1ZXVlZCkgICAgICAgICAgICAgICAgICovDQotICAvKiAgLSBJbmplY3RlZCBkaXNjb250aW51b3VzIG1vZGU6IGNhbiBiZSBlbmFibGVkIG9ubHkgaWYgYXV0by1pbmplY3RlZCAgICAgKi8NCi0gIC8qICAgIG1vZGUgaXMgZGlzYWJsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgaWYgKExMX0FEQ19JTkpfSXNDb252ZXJzaW9uT25nb2luZyhoYWRjLT5JbnN0YW5jZSkgPT0gMFVMKSB7DQotICAgIC8qIElmIGF1dG8taW5qZWN0ZWQgbW9kZSBpcyBkaXNhYmxlZDogbm8gY29uc3RyYWludCAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgaWYgKHNDb25maWdJbmplY3RlZC0+QXV0b0luamVjdGVkQ29udiA9PSBESVNBQkxFKSB7DQotICAgICAgTU9ESUZZX1JFRygNCi0gICAgICAgICAgaGFkYy0+SW5zdGFuY2UtPkNGR1IsIEFEQ19DRkdSX0pRTSB8IEFEQ19DRkdSX0pESVNDRU4sDQotICAgICAgICAgIEFEQ19DRkdSX0lOSkVDVF9DT05URVhUX1FVRVVFKA0KLSAgICAgICAgICAgICAgKHVpbnQzMl90KXNDb25maWdJbmplY3RlZC0+UXVldWVJbmplY3RlZENvbnRleHQpIHwNCi0gICAgICAgICAgICAgIEFEQ19DRkdSX0lOSkVDVF9ESVNDQ09OVElOVU9VUygNCi0gICAgICAgICAgICAgICAgICAodWludDMyX3Qpc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZERpc2NvbnRpbnVvdXNDb252TW9kZSkpOw0KLSAgICB9DQotICAgIC8qIElmIGF1dG8taW5qZWN0ZWQgbW9kZSBpcyBlbmFibGVkOiBJbmplY3RlZCBkaXNjb250aW51b3VzIHNldHRpbmcgaXMgICAgKi8NCi0gICAgLyogZGlzY2FyZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICBlbHNlIHsNCi0gICAgICBNT0RJRllfUkVHKGhhZGMtPkluc3RhbmNlLT5DRkdSLCBBRENfQ0ZHUl9KUU0gfCBBRENfQ0ZHUl9KRElTQ0VOLA0KLSAgICAgICAgICAgICAgICAgQURDX0NGR1JfSU5KRUNUX0NPTlRFWFRfUVVFVUUoDQotICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KXNDb25maWdJbmplY3RlZC0+UXVldWVJbmplY3RlZENvbnRleHQpKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgLyogUGFyYW1ldGVycyB1cGRhdGUgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAvKiBQYXJhbWV0ZXJzIHRoYXQgY2FuIGJlIHVwZGF0ZWQgd2hlbiBBREMgaXMgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0ICAgKi8NCi0gIC8qIGNvbnZlcnNpb24gb24gZ29pbmcgb24gcmVndWxhciBhbmQgaW5qZWN0ZWQgZ3JvdXBzOiAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgLyogIC0gQXV0b21hdGljIGluamVjdGVkIGNvbnZlcnNpb246IGNhbiBiZSBlbmFibGVkIGlmIGluamVjdGVkIGdyb3VwICAgICAgICovDQotICAvKiAgICBleHRlcm5hbCB0cmlnZ2VycyBhcmUgZGlzYWJsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gIC8qICAtIENoYW5uZWwgc2FtcGxpbmcgdGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgLyogIC0gQ2hhbm5lbCBvZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICB0bXBfYWRjX2lzX2NvbnZlcnNpb25fb25fZ29pbmdfcmVndWxhciA9DQotICAgICAgTExfQURDX1JFR19Jc0NvbnZlcnNpb25PbmdvaW5nKGhhZGMtPkluc3RhbmNlKTsNCi0gIHRtcF9hZGNfaXNfY29udmVyc2lvbl9vbl9nb2luZ19pbmplY3RlZCA9DQotICAgICAgTExfQURDX0lOSl9Jc0NvbnZlcnNpb25PbmdvaW5nKGhhZGMtPkluc3RhbmNlKTsNCi0NCi0gIGlmICgodG1wX2FkY19pc19jb252ZXJzaW9uX29uX2dvaW5nX3JlZ3VsYXIgPT0gMFVMKSAmJg0KLSAgICAgICh0bXBfYWRjX2lzX2NvbnZlcnNpb25fb25fZ29pbmdfaW5qZWN0ZWQgPT0gMFVMKSkgew0KLSAgICAvKiBJZiBpbmplY3RlZCBncm91cCBleHRlcm5hbCB0cmlnZ2VycyBhcmUgZGlzYWJsZWQgKHNldCB0byBpbmplY3RlZCAgICAgICovDQotICAgIC8qIHNvZnR3YXJlIHN0YXJ0KTogbm8gY29uc3RyYWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgaWYgKChzQ29uZmlnSW5qZWN0ZWQtPkV4dGVybmFsVHJpZ0luamVjQ29udiA9PQ0KLSAgICAgICAgIEFEQ19JTkpFQ1RFRF9TT0ZUV0FSRV9TVEFSVCkgfHwNCi0gICAgICAgIChzQ29uZmlnSW5qZWN0ZWQtPkV4dGVybmFsVHJpZ0luamVjQ29udkVkZ2UgPT0NCi0gICAgICAgICBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX0VER0VfTk9ORSkpIHsNCi0gICAgICBpZiAoc0NvbmZpZ0luamVjdGVkLT5BdXRvSW5qZWN0ZWRDb252ID09IEVOQUJMRSkgew0KLSAgICAgICAgU0VUX0JJVChoYWRjLT5JbnN0YW5jZS0+Q0ZHUiwgQURDX0NGR1JfSkFVVE8pOw0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPkNGR1IsIEFEQ19DRkdSX0pBVVRPKTsNCi0gICAgICB9DQotICAgIH0NCi0gICAgLyogSWYgQXV0b21hdGljIGluamVjdGVkIGNvbnZlcnNpb24gd2FzIGludGVuZGVkIHRvIGJlIHNldCBhbmQgY291bGQgbm90ICAqLw0KLSAgICAvKiBkdWUgdG8gaW5qZWN0ZWQgZ3JvdXAgZXh0ZXJuYWwgdHJpZ2dlcnMgZW5hYmxlZCwgZXJyb3IgaXMgcmVwb3J0ZWQuICAgICovDQotICAgIGVsc2Ugew0KLSAgICAgIGlmIChzQ29uZmlnSW5qZWN0ZWQtPkF1dG9JbmplY3RlZENvbnYgPT0gRU5BQkxFKSB7DQotICAgICAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gZXJyb3IgKi8NCi0gICAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfRVJST1JfQ09ORklHKTsNCi0NCi0gICAgICAgIHRtcF9oYWxfc3RhdHVzID0gSEFMX0VSUk9SOw0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPkNGR1IsIEFEQ19DRkdSX0pBVVRPKTsNCi0gICAgICB9DQotICAgIH0NCi0NCi0gICAgaWYgKHNDb25maWdJbmplY3RlZC0+SW5qZWNPdmVyc2FtcGxpbmdNb2RlID09IEVOQUJMRSkgew0KLSAgICAgIGFzc2VydF9wYXJhbSgNCi0gICAgICAgICAgSVNfQURDX09WRVJTQU1QTElOR19SQVRJTyhzQ29uZmlnSW5qZWN0ZWQtPkluamVjT3ZlcnNhbXBsaW5nLlJhdGlvKSk7DQotICAgICAgYXNzZXJ0X3BhcmFtKElTX0FEQ19SSUdIVF9CSVRfU0hJRlQoDQotICAgICAgICAgIHNDb25maWdJbmplY3RlZC0+SW5qZWNPdmVyc2FtcGxpbmcuUmlnaHRCaXRTaGlmdCkpOw0KLQ0KLSAgICAgIC8qICBKT1ZTRSBtdXN0IGJlIHJlc2V0IGluIGNhc2Ugb2YgdHJpZ2dlcmVkIHJlZ3VsYXIgbW9kZSAgKi8NCi0gICAgICBhc3NlcnRfcGFyYW0oISgNCi0gICAgICAgICAgUkVBRF9CSVQoaGFkYy0+SW5zdGFuY2UtPkNGR1IyLCBBRENfQ0ZHUjJfUk9WU0UgfCBBRENfQ0ZHUjJfVFJPVlMpID09DQotICAgICAgICAgIChBRENfQ0ZHUjJfUk9WU0UgfCBBRENfQ0ZHUjJfVFJPVlMpKSk7DQotDQotICAgICAgLyogQ29uZmlndXJhdGlvbiBvZiBJbmplY3RlZCBPdmVyc2FtcGxlcjogKi8NCi0gICAgICAvKiAgLSBPdmVyc2FtcGxpbmcgUmF0aW8gKi8NCi0gICAgICAvKiAgLSBSaWdodCBiaXQgc2hpZnQgKi8NCi0NCi0gICAgICAvKiBFbmFibGUgT3ZlclNhbXBsaW5nIG1vZGUgKi8NCi0gICAgICBNT0RJRllfUkVHKGhhZGMtPkluc3RhbmNlLT5DRkdSMiwNCi0gICAgICAgICAgICAgICAgIEFEQ19DRkdSMl9KT1ZTRSB8IEFEQ19DRkdSMl9PVlNSIHwgQURDX0NGR1IyX09WU1MsDQotICAgICAgICAgICAgICAgICBBRENfQ0ZHUjJfSk9WU0UgfCBzQ29uZmlnSW5qZWN0ZWQtPkluamVjT3ZlcnNhbXBsaW5nLlJhdGlvIHwNCi0gICAgICAgICAgICAgICAgICAgICBzQ29uZmlnSW5qZWN0ZWQtPkluamVjT3ZlcnNhbXBsaW5nLlJpZ2h0Qml0U2hpZnQpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgIC8qIERpc2FibGUgUmVndWxhciBPdmVyU2FtcGxpbmcgKi8NCi0gICAgICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPkNGR1IyLCBBRENfQ0ZHUjJfSk9WU0UpOw0KLSAgICB9DQotDQotICAgIC8qIE1hbmFnZSBzcGVjaWZpYyBjYXNlIG9mIHNhbXBsaW5nIHRpbWUgMy41IGN5Y2xlcyByZXBsYWNpbmcgMi41IGN5bGVzICovDQotICAgIGlmIChzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkU2FtcGxpbmdUaW1lID09IEFEQ19TQU1QTEVUSU1FXzNDWUNMRVNfNSkgew0KLSAgICAgIC8qIFNldCBzYW1wbGluZyB0aW1lIG9mIHRoZSBzZWxlY3RlZCBBREMgY2hhbm5lbCAqLw0KLSAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lKGhhZGMtPkluc3RhbmNlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRDaGFubmVsLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX0FEQ19TQU1QTElOR1RJTUVfMkNZQ0xFU181KTsNCi0NCi0gICAgICAvKiBTZXQgQURDIHNhbXBsaW5nIHRpbWUgY29tbW9uIGNvbmZpZ3VyYXRpb24gKi8NCi0gICAgICBMTF9BRENfU2V0U2FtcGxpbmdUaW1lQ29tbW9uQ29uZmlnKA0KLSAgICAgICAgICBoYWRjLT5JbnN0YW5jZSwgTExfQURDX1NBTVBMSU5HVElNRV9DT01NT05fM0M1X1JFUExfMkM1KTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAvKiBTZXQgc2FtcGxpbmcgdGltZSBvZiB0aGUgc2VsZWN0ZWQgQURDIGNoYW5uZWwgKi8NCi0gICAgICBMTF9BRENfU2V0Q2hhbm5lbFNhbXBsaW5nVGltZShoYWRjLT5JbnN0YW5jZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkQ2hhbm5lbCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkU2FtcGxpbmdUaW1lKTsNCi0NCi0gICAgICAvKiBTZXQgQURDIHNhbXBsaW5nIHRpbWUgY29tbW9uIGNvbmZpZ3VyYXRpb24gKi8NCi0gICAgICBMTF9BRENfU2V0U2FtcGxpbmdUaW1lQ29tbW9uQ29uZmlnKGhhZGMtPkluc3RhbmNlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfQURDX1NBTVBMSU5HVElNRV9DT01NT05fREVGQVVMVCk7DQotICAgIH0NCi0NCi0gICAgLyogQ29uZmlndXJlIHRoZSBvZmZzZXQ6IG9mZnNldCBlbmFibGUvZGlzYWJsZSwgY2hhbm5lbCwgb2Zmc2V0IHZhbHVlICovDQotDQotICAgIC8qIFNoaWZ0IHRoZSBvZmZzZXQgd2l0aCByZXNwZWN0IHRvIHRoZSBzZWxlY3RlZCBBREMgcmVzb2x1dGlvbi4gKi8NCi0gICAgLyogT2Zmc2V0IGhhcyB0byBiZSBsZWZ0LWFsaWduZWQgb24gYml0IDExLCB0aGUgTFNCIChyaWdodCBiaXRzKSBhcmUgc2V0IHRvDQotICAgICAqIDAgKi8NCi0gICAgdG1wT2Zmc2V0U2hpZnRlZCA9DQotICAgICAgICBBRENfT0ZGU0VUX1NISUZUX1JFU09MVVRJT04oaGFkYywgc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZE9mZnNldCk7DQotDQotICAgIGlmIChzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkT2Zmc2V0TnVtYmVyICE9IEFEQ19PRkZTRVRfTk9ORSkgew0KLSAgICAgIC8qIFNldCBBREMgc2VsZWN0ZWQgb2Zmc2V0IG51bWJlciAqLw0KLSAgICAgIExMX0FEQ19TZXRPZmZzZXQoaGFkYy0+SW5zdGFuY2UsIHNDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRPZmZzZXROdW1iZXIsDQotICAgICAgICAgICAgICAgICAgICAgICBzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkQ2hhbm5lbCwgdG1wT2Zmc2V0U2hpZnRlZCk7DQotDQotICAgICAgLyogU2V0IEFEQyBzZWxlY3RlZCBvZmZzZXQgc2lnbiAmIHNhdHVyYXRpb24gKi8NCi0gICAgICBMTF9BRENfU2V0T2Zmc2V0U2lnbihoYWRjLT5JbnN0YW5jZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkT2Zmc2V0TnVtYmVyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRPZmZzZXRTaWduKTsNCi0gICAgICBMTF9BRENfU2V0T2Zmc2V0U2F0dXJhdGlvbigNCi0gICAgICAgICAgaGFkYy0+SW5zdGFuY2UsIHNDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRPZmZzZXROdW1iZXIsDQotICAgICAgICAgIChzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkT2Zmc2V0U2F0dXJhdGlvbiA9PSBFTkFCTEUpDQotICAgICAgICAgICAgICA/IExMX0FEQ19PRkZTRVRfU0FUVVJBVElPTl9FTkFCTEUNCi0gICAgICAgICAgICAgIDogTExfQURDX09GRlNFVF9TQVRVUkFUSU9OX0RJU0FCTEUpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgIC8qIFNjYW4gZWFjaCBvZmZzZXQgcmVnaXN0ZXIgdG8gY2hlY2sgaWYgdGhlIHNlbGVjdGVkIGNoYW5uZWwgaXMgdGFyZ2V0ZWQuDQotICAgICAgICovDQotICAgICAgLyogSWYgdGhpcyBpcyB0aGUgY2FzZSwgdGhlIGNvcnJlc3BvbmRpbmcgb2Zmc2V0IG51bWJlciBpcyBkaXNhYmxlZC4gKi8NCi0gICAgICBpZiAoX19MTF9BRENfQ0hBTk5FTF9UT19ERUNJTUFMX05CKA0KLSAgICAgICAgICAgICAgTExfQURDX0dldE9mZnNldENoYW5uZWwoaGFkYy0+SW5zdGFuY2UsIExMX0FEQ19PRkZTRVRfMSkpID09DQotICAgICAgICAgIF9fTExfQURDX0NIQU5ORUxfVE9fREVDSU1BTF9OQihzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkQ2hhbm5lbCkpIHsNCi0gICAgICAgIExMX0FEQ19TZXRPZmZzZXRTdGF0ZShoYWRjLT5JbnN0YW5jZSwgTExfQURDX09GRlNFVF8xLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX0FEQ19PRkZTRVRfRElTQUJMRSk7DQotICAgICAgfQ0KLSAgICAgIGlmIChfX0xMX0FEQ19DSEFOTkVMX1RPX0RFQ0lNQUxfTkIoDQotICAgICAgICAgICAgICBMTF9BRENfR2V0T2Zmc2V0Q2hhbm5lbChoYWRjLT5JbnN0YW5jZSwgTExfQURDX09GRlNFVF8yKSkgPT0NCi0gICAgICAgICAgX19MTF9BRENfQ0hBTk5FTF9UT19ERUNJTUFMX05CKHNDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRDaGFubmVsKSkgew0KLSAgICAgICAgTExfQURDX1NldE9mZnNldFN0YXRlKGhhZGMtPkluc3RhbmNlLCBMTF9BRENfT0ZGU0VUXzIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfQURDX09GRlNFVF9ESVNBQkxFKTsNCi0gICAgICB9DQotICAgICAgaWYgKF9fTExfQURDX0NIQU5ORUxfVE9fREVDSU1BTF9OQigNCi0gICAgICAgICAgICAgIExMX0FEQ19HZXRPZmZzZXRDaGFubmVsKGhhZGMtPkluc3RhbmNlLCBMTF9BRENfT0ZGU0VUXzMpKSA9PQ0KLSAgICAgICAgICBfX0xMX0FEQ19DSEFOTkVMX1RPX0RFQ0lNQUxfTkIoc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZENoYW5uZWwpKSB7DQotICAgICAgICBMTF9BRENfU2V0T2Zmc2V0U3RhdGUoaGFkYy0+SW5zdGFuY2UsIExMX0FEQ19PRkZTRVRfMywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTF9BRENfT0ZGU0VUX0RJU0FCTEUpOw0KLSAgICAgIH0NCi0gICAgICBpZiAoX19MTF9BRENfQ0hBTk5FTF9UT19ERUNJTUFMX05CKA0KLSAgICAgICAgICAgICAgTExfQURDX0dldE9mZnNldENoYW5uZWwoaGFkYy0+SW5zdGFuY2UsIExMX0FEQ19PRkZTRVRfNCkpID09DQotICAgICAgICAgIF9fTExfQURDX0NIQU5ORUxfVE9fREVDSU1BTF9OQihzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkQ2hhbm5lbCkpIHsNCi0gICAgICAgIExMX0FEQ19TZXRPZmZzZXRTdGF0ZShoYWRjLT5JbnN0YW5jZSwgTExfQURDX09GRlNFVF80LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX0FEQ19PRkZTRVRfRElTQUJMRSk7DQotICAgICAgfQ0KLSAgICB9DQotICB9DQotDQotICAvKiBQYXJhbWV0ZXJzIHVwZGF0ZSBjb25kaXRpb25lZCB0byBBREMgc3RhdGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gIC8qIFBhcmFtZXRlcnMgdGhhdCBjYW4gYmUgdXBkYXRlZCBvbmx5IHdoZW4gQURDIGlzIGRpc2FibGVkOiAgICAgICAgICAgICAgICAqLw0KLSAgLyogIC0gU2luZ2xlIG9yIGRpZmZlcmVudGlhbCBtb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICBpZiAoTExfQURDX0lzRW5hYmxlZChoYWRjLT5JbnN0YW5jZSkgPT0gMFVMKSB7DQotICAgIC8qIFNldCBtb2RlIHNpbmdsZS1lbmRlZCBvciBkaWZmZXJlbnRpYWwgaW5wdXQgb2YgdGhlIHNlbGVjdGVkIEFEQyBjaGFubmVsDQotICAgICAqLw0KLSAgICBMTF9BRENfU2V0Q2hhbm5lbFNpbmdsZURpZmYoaGFkYy0+SW5zdGFuY2UsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkQ2hhbm5lbCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRTaW5nbGVEaWZmKTsNCi0NCi0gICAgLyogQ29uZmlndXJhdGlvbiBvZiBkaWZmZXJlbnRpYWwgbW9kZSAqLw0KLSAgICAvKiBOb3RlOiBBREMgY2hhbm5lbCBudW1iZXIgbWFza2VkIHdpdGggdmFsdWUgIjB4MUYiIHRvIGVuc3VyZSBzaGlmdCB2YWx1ZQ0KLSAgICAgKiB3aXRoaW4gMzIgYml0cyByYW5nZSAqLw0KLSAgICBpZiAoc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZFNpbmdsZURpZmYgPT0gQURDX0RJRkZFUkVOVElBTF9FTkRFRCkgew0KLSAgICAgIC8qIFNldCBzYW1wbGluZyB0aW1lIG9mIHRoZSBzZWxlY3RlZCBBREMgY2hhbm5lbCAqLw0KLSAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lKA0KLSAgICAgICAgICBoYWRjLT5JbnN0YW5jZSwNCi0gICAgICAgICAgKHVpbnQzMl90KShfX0xMX0FEQ19ERUNJTUFMX05CX1RPX0NIQU5ORUwoDQotICAgICAgICAgICAgICAoX19MTF9BRENfQ0hBTk5FTF9UT19ERUNJTUFMX05CKA0KLSAgICAgICAgICAgICAgICAgICAodWludDMyX3Qpc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZENoYW5uZWwpICsNCi0gICAgICAgICAgICAgICAxVUwpICYNCi0gICAgICAgICAgICAgIDB4MUZVTCkpLA0KLSAgICAgICAgICBzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkU2FtcGxpbmdUaW1lKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgLyogTWFuYWdlbWVudCBvZiBpbnRlcm5hbCBtZWFzdXJlbWVudCBjaGFubmVsczogVmJhdC9WcmVmSW50L1RlbXBTZW5zb3IgICAqLw0KLSAgLyogaW50ZXJuYWwgbWVhc3VyZW1lbnQgcGF0aHMgZW5hYmxlOiBJZiBpbnRlcm5hbCBjaGFubmVsIHNlbGVjdGVkLCAgICAgICAqLw0KLSAgLyogZW5hYmxlIGRlZGljYXRlZCBpbnRlcm5hbCBidWZmZXJzIGFuZCBwYXRoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgLyogTm90ZTogdGhlc2UgaW50ZXJuYWwgbWVhc3VyZW1lbnQgcGF0aHMgY2FuIGJlIGRpc2FibGVkIHVzaW5nICAgICAgICAgICAqLw0KLSAgLyogSEFMX0FEQ19EZUluaXQoKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLQ0KLSAgaWYgKF9fTExfQURDX0lTX0NIQU5ORUxfSU5URVJOQUwoc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZENoYW5uZWwpKSB7DQotICAgIHRtcF9jb25maWdfaW50ZXJuYWxfY2hhbm5lbCA9IExMX0FEQ19HZXRDb21tb25QYXRoSW50ZXJuYWxDaCgNCi0gICAgICAgIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOw0KLQ0KLSAgICAvKiBJZiB0aGUgcmVxdWVzdGVkIGludGVybmFsIG1lYXN1cmVtZW50IHBhdGggaGFzIGFscmVhZHkgYmVlbiBlbmFibGVkLCAgICovDQotICAgIC8qIGJ5cGFzcyB0aGUgY29uZmlndXJhdGlvbiBwcm9jZXNzaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgaWYgKCgoc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZENoYW5uZWwgPT0gQURDX0NIQU5ORUxfVEVNUFNFTlNPUl9BREMxKSB8fA0KLSAgICAgICAgIChzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkQ2hhbm5lbCA9PSBBRENfQ0hBTk5FTF9URU1QU0VOU09SX0FEQzUpKSAmJg0KLSAgICAgICAgKCh0bXBfY29uZmlnX2ludGVybmFsX2NoYW5uZWwgJiBMTF9BRENfUEFUSF9JTlRFUk5BTF9URU1QU0VOU09SKSA9PQ0KLSAgICAgICAgIDBVTCkpIHsNCi0gICAgICBpZiAoQURDX1RFTVBFUkFUVVJFX1NFTlNPUl9JTlNUQU5DRShoYWRjKSkgew0KLSAgICAgICAgTExfQURDX1NldENvbW1vblBhdGhJbnRlcm5hbENoKA0KLSAgICAgICAgICAgIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSksDQotICAgICAgICAgICAgTExfQURDX1BBVEhfSU5URVJOQUxfVEVNUFNFTlNPUiB8IHRtcF9jb25maWdfaW50ZXJuYWxfY2hhbm5lbCk7DQotDQotICAgICAgICAvKiBEZWxheSBmb3IgdGVtcGVyYXR1cmUgc2Vuc29yIHN0YWJpbGl6YXRpb24gdGltZSAqLw0KLSAgICAgICAgLyogV2FpdCBsb29wIGluaXRpYWxpemF0aW9uIGFuZCBleGVjdXRpb24gKi8NCi0gICAgICAgIC8qIE5vdGU6IFZhcmlhYmxlIGRpdmlkZWQgYnkgMiB0byBjb21wZW5zYXRlIHBhcnRpYWxseSAgICAgICAgICAgICAgKi8NCi0gICAgICAgIC8qICAgICAgIENQVSBwcm9jZXNzaW5nIGN5Y2xlcywgc2NhbGluZyBpbiB1cyBzcGxpdCB0byBub3QgICAgICAgICAgKi8NCi0gICAgICAgIC8qICAgICAgIGV4Y2VlZCAzMiBiaXRzIHJlZ2lzdGVyIGNhcGFjaXR5IGFuZCBoYW5kbGUgbG93IGZyZXF1ZW5jeS4gKi8NCi0gICAgICAgIHdhaXRfbG9vcF9pbmRleCA9DQotICAgICAgICAgICAgKChMTF9BRENfREVMQVlfVEVNUFNFTlNPUl9TVEFCX1VTIC8gMTBVTCkgKg0KLSAgICAgICAgICAgICAoKChTeXN0ZW1Db3JlQ2xvY2sgLyAoMTAwMDAwVUwgKiAyVUwpKSArIDFVTCkgKyAxVUwpKTsNCi0gICAgICAgIHdoaWxlICh3YWl0X2xvb3BfaW5kZXggIT0gMFVMKSB7DQotICAgICAgICAgIHdhaXRfbG9vcF9pbmRleC0tOw0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0gICAgfSBlbHNlIGlmICgoc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZENoYW5uZWwgPT0gQURDX0NIQU5ORUxfVkJBVCkgJiYNCi0gICAgICAgICAgICAgICAoKHRtcF9jb25maWdfaW50ZXJuYWxfY2hhbm5lbCAmIExMX0FEQ19QQVRIX0lOVEVSTkFMX1ZCQVQpID09DQotICAgICAgICAgICAgICAgIDBVTCkpIHsNCi0gICAgICBpZiAoQURDX0JBVFRFUllfVk9MVEFHRV9JTlNUQU5DRShoYWRjKSkgew0KLSAgICAgICAgTExfQURDX1NldENvbW1vblBhdGhJbnRlcm5hbENoKA0KLSAgICAgICAgICAgIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSksDQotICAgICAgICAgICAgTExfQURDX1BBVEhfSU5URVJOQUxfVkJBVCB8IHRtcF9jb25maWdfaW50ZXJuYWxfY2hhbm5lbCk7DQotICAgICAgfQ0KLSAgICB9IGVsc2UgaWYgKChzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkQ2hhbm5lbCA9PSBBRENfQ0hBTk5FTF9WUkVGSU5UKSAmJg0KLSAgICAgICAgICAgICAgICgodG1wX2NvbmZpZ19pbnRlcm5hbF9jaGFubmVsICYgTExfQURDX1BBVEhfSU5URVJOQUxfVlJFRklOVCkgPT0NCi0gICAgICAgICAgICAgICAgMFVMKSkgew0KLSAgICAgIGlmIChBRENfVlJFRklOVF9JTlNUQU5DRShoYWRjKSkgew0KLSAgICAgICAgTExfQURDX1NldENvbW1vblBhdGhJbnRlcm5hbENoKA0KLSAgICAgICAgICAgIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSksDQotICAgICAgICAgICAgTExfQURDX1BBVEhfSU5URVJOQUxfVlJFRklOVCB8IHRtcF9jb25maWdfaW50ZXJuYWxfY2hhbm5lbCk7DQotICAgICAgfQ0KLSAgICB9IGVsc2Ugew0KLSAgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8NCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLw0KLSAgX19IQUxfVU5MT0NLKGhhZGMpOw0KLQ0KLSAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLw0KLSAgcmV0dXJuIHRtcF9oYWxfc3RhdHVzOw0KLX0NCi0NCi0jaWYgZGVmaW5lZChBRENfTVVMVElNT0RFX1NVUFBPUlQpDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgQURDIG11bHRpbW9kZSBhbmQgY29uZmlndXJlIG11bHRpbW9kZSBwYXJhbWV0ZXJzDQotICogQG5vdGUgICBQb3NzaWJpbGl0eSB0byB1cGRhdGUgcGFyYW1ldGVycyBvbiB0aGUgZmx5Og0KLSAqICAgICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyBtdWx0aW1vZGUgcGFyYW1ldGVycywgZm9sbG93aW5nDQotICogICAgICAgICBjYWxscyB0byB0aGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHJlY29uZmlndXJlIHNvbWUgcGFyYW1ldGVycw0KLSAqICAgICAgICAgb2Ygc3RydWN0dXJlICJBRENfTXVsdGlNb2RlVHlwZURlZiIgb24gdGhlIGZseSwgd2l0aG91dCByZXNldHRpbmcNCi0gKiAgICAgICAgIHRoZSBBRENzLg0KLSAqICAgICAgICAgVGhlIHNldHRpbmcgb2YgdGhlc2UgcGFyYW1ldGVycyBpcyBjb25kaXRpb25lZCB0byBBREMgc3RhdGUuDQotICogICAgICAgICBGb3IgcGFyYW1ldGVycyBjb25zdHJhaW50cywgc2VlIGNvbW1lbnRzIG9mIHN0cnVjdHVyZQ0KLSAqICAgICAgICAgIkFEQ19NdWx0aU1vZGVUeXBlRGVmIi4NCi0gKiBAbm90ZSAgIFRvIG1vdmUgYmFjayBjb25maWd1cmF0aW9uIGZyb20gbXVsdGltb2RlIHRvIHNpbmdsZSBtb2RlLCBBREMgbXVzdA0KLSAqICAgICAgICAgYmUgcmVzZXQgKHVzaW5nIGZ1bmN0aW9uIEhBTF9BRENfSW5pdCgpICkuDQotICogQHBhcmFtIGhhZGMgTWFzdGVyIEFEQyBoYW5kbGUNCi0gKiBAcGFyYW0gbXVsdGltb2RlIFN0cnVjdHVyZSBvZiBBREMgbXVsdGltb2RlIGNvbmZpZ3VyYXRpb24NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDRXhfTXVsdGlNb2RlQ29uZmlnQ2hhbm5lbCgNCi0gICAgQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMsIEFEQ19NdWx0aU1vZGVUeXBlRGVmICptdWx0aW1vZGUpIHsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIHRtcF9oYWxfc3RhdHVzID0gSEFMX09LOw0KLSAgQURDX0NvbW1vbl9UeXBlRGVmICp0bXBBRENfQ29tbW9uOw0KLSAgQURDX0hhbmRsZVR5cGVEZWYgdG1waGFkY1NsYXZlOw0KLSAgdWludDMyX3QgdG1waGFkY1NsYXZlX2NvbnZlcnNpb25fb25fZ29pbmc7DQotDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0FEQ19NVUxUSU1PREVfTUFTVEVSX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfQURDX01VTFRJTU9ERShtdWx0aW1vZGUtPk1vZGUpKTsNCi0gIGlmIChtdWx0aW1vZGUtPk1vZGUgIT0gQURDX01PREVfSU5ERVBFTkRFTlQpIHsNCi0gICAgYXNzZXJ0X3BhcmFtKElTX0FEQ19ETUFfQUNDRVNTX01VTFRJTU9ERShtdWx0aW1vZGUtPkRNQUFjY2Vzc01vZGUpKTsNCi0gICAgYXNzZXJ0X3BhcmFtKElTX0FEQ19TQU1QTElOR19ERUxBWShtdWx0aW1vZGUtPlR3b1NhbXBsaW5nRGVsYXkpKTsNCi0gIH0NCi0NCi0gIC8qIFByb2Nlc3MgbG9ja2VkICovDQotICBfX0hBTF9MT0NLKGhhZGMpOw0KLQ0KLSAgLyogVGVtcG9yYXJ5IGhhbmRsZSBtaW5pbXVtIGluaXRpYWxpemF0aW9uICovDQotICBfX0hBTF9BRENfUkVTRVRfSEFORExFX1NUQVRFKCZ0bXBoYWRjU2xhdmUpOw0KLSAgQURDX0NMRUFSX0VSUk9SQ09ERSgmdG1waGFkY1NsYXZlKTsNCi0NCi0gIEFEQ19NVUxUSV9TTEFWRShoYWRjLCAmdG1waGFkY1NsYXZlKTsNCi0NCi0gIGlmICh0bXBoYWRjU2xhdmUuSW5zdGFuY2UgPT0gTlVMTCkgew0KLSAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gZXJyb3IgKi8NCi0gICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9DT05GSUcpOw0KLQ0KLSAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovDQotICAgIF9fSEFMX1VOTE9DSyhoYWRjKTsNCi0NCi0gICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gIH0NCi0NCi0gIC8qIFBhcmFtZXRlcnMgdXBkYXRlIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgLyogUGFyYW1ldGVycyB0aGF0IGNhbiBiZSB1cGRhdGVkIHdoZW4gQURDIGlzIGRpc2FibGVkIG9yIGVuYWJsZWQgd2l0aG91dCAgICovDQotICAvKiBjb252ZXJzaW9uIG9uIGdvaW5nIG9uIHJlZ3VsYXIgZ3JvdXA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gIC8qICAtIE11bHRpbW9kZSBETUEgY29uZmlndXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgLyogIC0gTXVsdGltb2RlIERNQSBtb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICB0bXBoYWRjU2xhdmVfY29udmVyc2lvbl9vbl9nb2luZyA9DQotICAgICAgTExfQURDX1JFR19Jc0NvbnZlcnNpb25PbmdvaW5nKCgmdG1waGFkY1NsYXZlKS0+SW5zdGFuY2UpOw0KLSAgaWYgKChMTF9BRENfUkVHX0lzQ29udmVyc2lvbk9uZ29pbmcoaGFkYy0+SW5zdGFuY2UpID09IDBVTCkgJiYNCi0gICAgICAodG1waGFkY1NsYXZlX2NvbnZlcnNpb25fb25fZ29pbmcgPT0gMFVMKSkgew0KLSAgICAvKiBQb2ludGVyIHRvIHRoZSBjb21tb24gY29udHJvbCByZWdpc3RlciAqLw0KLSAgICB0bXBBRENfQ29tbW9uID0gX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKTsNCi0NCi0gICAgLyogSWYgbXVsdGltb2RlIGlzIHNlbGVjdGVkLCBjb25maWd1cmUgYWxsIG11bHRpbW9kZSBwYXJhbWV0ZXJzLiAgICAgICAgICAqLw0KLSAgICAvKiBPdGhlcndpc2UsIHJlc2V0IG11bHRpbW9kZSBwYXJhbWV0ZXJzIChjYW4gYmUgdXNlZCBpbiBjYXNlIG9mICAgICAgICAgICovDQotICAgIC8qIHRyYW5zaXRpb24gZnJvbSBtdWx0aW1vZGUgdG8gaW5kZXBlbmRlbnQgbW9kZSkuICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgaWYgKG11bHRpbW9kZS0+TW9kZSAhPSBBRENfTU9ERV9JTkRFUEVOREVOVCkgew0KLSAgICAgIE1PRElGWV9SRUcodG1wQURDX0NvbW1vbi0+Q0NSLCBBRENfQ0NSX01ETUEgfCBBRENfQ0NSX0RNQUNGRywNCi0gICAgICAgICAgICAgICAgIG11bHRpbW9kZS0+RE1BQWNjZXNzTW9kZSB8DQotICAgICAgICAgICAgICAgICAgICAgQURDX0NDUl9NVUxUSV9ETUFDT05UUkVRKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpaGFkYy0+SW5pdC5ETUFDb250aW51b3VzUmVxdWVzdHMpKTsNCi0NCi0gICAgICAvKiBQYXJhbWV0ZXJzIHRoYXQgY2FuIGJlIHVwZGF0ZWQgb25seSB3aGVuIEFEQyBpcyBkaXNhYmxlZDogKi8NCi0gICAgICAvKiAgLSBNdWx0aW1vZGUgbW9kZSBzZWxlY3Rpb24gKi8NCi0gICAgICAvKiAgLSBNdWx0aW1vZGUgZGVsYXkgKi8NCi0gICAgICAvKiAgICBOb3RlOiBEZWxheSByYW5nZSBkZXBlbmRzIG9uIHNlbGVjdGVkIHJlc29sdXRpb246ICovDQotICAgICAgLyogICAgICBmcm9tIDEgdG8gMTIgY2xvY2sgY3ljbGVzIGZvciAxMiBiaXRzICovDQotICAgICAgLyogICAgICBmcm9tIDEgdG8gMTAgY2xvY2sgY3ljbGVzIGZvciAxMCBiaXRzLCAqLw0KLSAgICAgIC8qICAgICAgZnJvbSAxIHRvIDggY2xvY2sgY3ljbGVzIGZvciA4IGJpdHMgKi8NCi0gICAgICAvKiAgICAgIGZyb20gMSB0byA2IGNsb2NrIGN5Y2xlcyBmb3IgNiBiaXRzICovDQotICAgICAgLyogICAgSWYgYSBoaWdoZXIgZGVsYXkgaXMgc2VsZWN0ZWQsIGl0IHdpbGwgYmUgY2xpcHBlZCB0byBtYXhpbXVtIGRlbGF5DQotICAgICAgICovDQotICAgICAgLyogICAgcmFuZ2UgKi8NCi0gICAgICBpZiAoX19MTF9BRENfSVNfRU5BQkxFRF9BTExfQ09NTU9OX0lOU1RBTkNFKA0KLSAgICAgICAgICAgICAgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSkgPT0gMFVMKSB7DQotICAgICAgICBNT0RJRllfUkVHKHRtcEFEQ19Db21tb24tPkNDUiwgQURDX0NDUl9EVUFMIHwgQURDX0NDUl9ERUxBWSwNCi0gICAgICAgICAgICAgICAgICAgbXVsdGltb2RlLT5Nb2RlIHwgbXVsdGltb2RlLT5Ud29TYW1wbGluZ0RlbGF5KTsNCi0gICAgICB9DQotICAgIH0gZWxzZSAvKiBBRENfTU9ERV9JTkRFUEVOREVOVCAqLw0KLSAgICB7DQotICAgICAgQ0xFQVJfQklUKHRtcEFEQ19Db21tb24tPkNDUiwgQURDX0NDUl9NRE1BIHwgQURDX0NDUl9ETUFDRkcpOw0KLQ0KLSAgICAgIC8qIFBhcmFtZXRlcnMgdGhhdCBjYW4gYmUgdXBkYXRlZCBvbmx5IHdoZW4gQURDIGlzIGRpc2FibGVkOiAqLw0KLSAgICAgIC8qICAtIE11bHRpbW9kZSBtb2RlIHNlbGVjdGlvbiAqLw0KLSAgICAgIC8qICAtIE11bHRpbW9kZSBkZWxheSAqLw0KLSAgICAgIGlmIChfX0xMX0FEQ19JU19FTkFCTEVEX0FMTF9DT01NT05fSU5TVEFOQ0UoDQotICAgICAgICAgICAgICBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKSA9PSAwVUwpIHsNCi0gICAgICAgIENMRUFSX0JJVCh0bXBBRENfQ29tbW9uLT5DQ1IsIEFEQ19DQ1JfRFVBTCB8IEFEQ19DQ1JfREVMQVkpOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgfQ0KLSAgLyogSWYgb25lIG9mIHRoZSBBREMgc2hhcmluZyB0aGUgc2FtZSBjb21tb24gZ3JvdXAgaXMgZW5hYmxlZCwgbm8gdXBkYXRlICAgICovDQotICAvKiBjb3VsZCBiZSBkb25lIG9uIG5laXRoZXIgb2YgdGhlIG11bHRpbW9kZSBzdHJ1Y3R1cmUgcGFyYW1ldGVycy4gICAgICAgICAgKi8NCi0gIGVsc2Ugew0KLSAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gZXJyb3IgKi8NCi0gICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9DT05GSUcpOw0KLQ0KLSAgICB0bXBfaGFsX3N0YXR1cyA9IEhBTF9FUlJPUjsNCi0gIH0NCi0NCi0gIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8NCi0gIF9fSEFMX1VOTE9DSyhoYWRjKTsNCi0NCi0gIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8NCi0gIHJldHVybiB0bXBfaGFsX3N0YXR1czsNCi19DQotI2VuZGlmIC8qIEFEQ19NVUxUSU1PREVfU1VQUE9SVCAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIEluamVjdGVkIFF1ZXVlDQotICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIHJlc2V0cyBDRkdSIHJlZ2lzdGVyIEpRRElTIGJpdCBpbiBvcmRlciB0byBlbmFibGUgdGhlDQotICogICAgICAgICBJbmplY3RlZCBRdWV1ZS4gSlFESVMgY2FuIGJlIHdyaXR0ZW4gb25seSB3aGVuIEFEU1RBUlQgYW5kIEpEU1RBUlQNCi0gKiAgICAgICAgIGFyZSBib3RoIGVxdWFsIHRvIDAgdG8gZW5zdXJlIHRoYXQgbm8gcmVndWxhciBub3IgaW5qZWN0ZWQNCi0gKiAgICAgICAgIGNvbnZlcnNpb24gaXMgb25nb2luZy4NCi0gKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ0V4X0VuYWJsZUluamVjdGVkUXVldWUoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpIHsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIHRtcF9oYWxfc3RhdHVzOw0KLSAgdWludDMyX3QgdG1wX2FkY19pc19jb252ZXJzaW9uX29uX2dvaW5nX3JlZ3VsYXI7DQotICB1aW50MzJfdCB0bXBfYWRjX2lzX2NvbnZlcnNpb25fb25fZ29pbmdfaW5qZWN0ZWQ7DQotDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsNCi0NCi0gIHRtcF9hZGNfaXNfY29udmVyc2lvbl9vbl9nb2luZ19yZWd1bGFyID0NCi0gICAgICBMTF9BRENfUkVHX0lzQ29udmVyc2lvbk9uZ29pbmcoaGFkYy0+SW5zdGFuY2UpOw0KLSAgdG1wX2FkY19pc19jb252ZXJzaW9uX29uX2dvaW5nX2luamVjdGVkID0NCi0gICAgICBMTF9BRENfSU5KX0lzQ29udmVyc2lvbk9uZ29pbmcoaGFkYy0+SW5zdGFuY2UpOw0KLQ0KLSAgLyogUGFyYW1ldGVyIGNhbiBiZSBzZXQgb25seSBpZiBubyBjb252ZXJzaW9uIGlzIG9uLWdvaW5nICovDQotICBpZiAoKHRtcF9hZGNfaXNfY29udmVyc2lvbl9vbl9nb2luZ19yZWd1bGFyID09IDBVTCkgJiYNCi0gICAgICAodG1wX2FkY19pc19jb252ZXJzaW9uX29uX2dvaW5nX2luamVjdGVkID09IDBVTCkpIHsNCi0gICAgQ0xFQVJfQklUKGhhZGMtPkluc3RhbmNlLT5DRkdSLCBBRENfQ0ZHUl9KUURJUyk7DQotDQotICAgIC8qIFVwZGF0ZSBzdGF0ZSwgY2xlYXIgcHJldmlvdXMgcmVzdWx0IHJlbGF0ZWQgdG8gaW5qZWN0ZWQgcXVldWUgb3ZlcmZsb3cgKi8NCi0gICAgQ0xFQVJfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0lOSl9KUU9WRik7DQotDQotICAgIHRtcF9oYWxfc3RhdHVzID0gSEFMX09LOw0KLSAgfSBlbHNlIHsNCi0gICAgdG1wX2hhbF9zdGF0dXMgPSBIQUxfRVJST1I7DQotICB9DQotDQotICByZXR1cm4gdG1wX2hhbF9zdGF0dXM7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBJbmplY3RlZCBRdWV1ZQ0KLSAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBzZXRzIENGR1IgcmVnaXN0ZXIgSlFESVMgYml0IGluIG9yZGVyIHRvIGRpc2FibGUgdGhlDQotICogICAgICAgICBJbmplY3RlZCBRdWV1ZS4gSlFESVMgY2FuIGJlIHdyaXR0ZW4gb25seSB3aGVuIEFEU1RBUlQgYW5kIEpEU1RBUlQNCi0gKiAgICAgICAgIGFyZSBib3RoIGVxdWFsIHRvIDAgdG8gZW5zdXJlIHRoYXQgbm8gcmVndWxhciBub3IgaW5qZWN0ZWQNCi0gKiAgICAgICAgIGNvbnZlcnNpb24gaXMgb25nb2luZy4NCi0gKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ0V4X0Rpc2FibGVJbmplY3RlZFF1ZXVlKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKSB7DQotICBIQUxfU3RhdHVzVHlwZURlZiB0bXBfaGFsX3N0YXR1czsNCi0gIHVpbnQzMl90IHRtcF9hZGNfaXNfY29udmVyc2lvbl9vbl9nb2luZ19yZWd1bGFyOw0KLSAgdWludDMyX3QgdG1wX2FkY19pc19jb252ZXJzaW9uX29uX2dvaW5nX2luamVjdGVkOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7DQotDQotICB0bXBfYWRjX2lzX2NvbnZlcnNpb25fb25fZ29pbmdfcmVndWxhciA9DQotICAgICAgTExfQURDX1JFR19Jc0NvbnZlcnNpb25PbmdvaW5nKGhhZGMtPkluc3RhbmNlKTsNCi0gIHRtcF9hZGNfaXNfY29udmVyc2lvbl9vbl9nb2luZ19pbmplY3RlZCA9DQotICAgICAgTExfQURDX0lOSl9Jc0NvbnZlcnNpb25PbmdvaW5nKGhhZGMtPkluc3RhbmNlKTsNCi0NCi0gIC8qIFBhcmFtZXRlciBjYW4gYmUgc2V0IG9ubHkgaWYgbm8gY29udmVyc2lvbiBpcyBvbi1nb2luZyAqLw0KLSAgaWYgKCh0bXBfYWRjX2lzX2NvbnZlcnNpb25fb25fZ29pbmdfcmVndWxhciA9PSAwVUwpICYmDQotICAgICAgKHRtcF9hZGNfaXNfY29udmVyc2lvbl9vbl9nb2luZ19pbmplY3RlZCA9PSAwVUwpKSB7DQotICAgIExMX0FEQ19JTkpfU2V0UXVldWVNb2RlKGhhZGMtPkluc3RhbmNlLCBMTF9BRENfSU5KX1FVRVVFX0RJU0FCTEUpOw0KLSAgICB0bXBfaGFsX3N0YXR1cyA9IEhBTF9PSzsNCi0gIH0gZWxzZSB7DQotICAgIHRtcF9oYWxfc3RhdHVzID0gSEFMX0VSUk9SOw0KLSAgfQ0KLQ0KLSAgcmV0dXJuIHRtcF9oYWxfc3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgQURDIHZvbHRhZ2UgcmVndWxhdG9yLg0KLSAqIEBub3RlICAgRGlzYWJsaW5nIHZvbHRhZ2UgcmVndWxhdG9yIGFsbG93cyB0byBzYXZlIHBvd2VyLiBUaGlzIG9wZXJhdGlvbiBjYW4NCi0gKiAgICAgICAgIGJlIGNhcnJpZWQgb3V0IG9ubHkgd2hlbiBBREMgaXMgZGlzYWJsZWQuDQotICogQG5vdGUgICBUbyBlbmFibGUgYWdhaW4gdGhlIHZvbHRhZ2UgcmVndWxhdG9yLCB0aGUgdXNlciBpcyBleHBlY3RlZCB0bw0KLSAqICAgICAgICAgcmVzb3J0IHRvIEhBTF9BRENfSW5pdCgpIEFQSS4NCi0gKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ0V4X0Rpc2FibGVWb2x0YWdlUmVndWxhdG9yKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKSB7DQotICBIQUxfU3RhdHVzVHlwZURlZiB0bXBfaGFsX3N0YXR1czsNCi0NCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOw0KLQ0KLSAgLyogU2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlOiBBREMgbXVzdCBiZSBBREMNCi0gICAqIGRpc2FibGVkICovDQotICBpZiAoTExfQURDX0lzRW5hYmxlZChoYWRjLT5JbnN0YW5jZSkgPT0gMFVMKSB7DQotICAgIExMX0FEQ19EaXNhYmxlSW50ZXJuYWxSZWd1bGF0b3IoaGFkYy0+SW5zdGFuY2UpOw0KLSAgICB0bXBfaGFsX3N0YXR1cyA9IEhBTF9PSzsNCi0gIH0gZWxzZSB7DQotICAgIHRtcF9oYWxfc3RhdHVzID0gSEFMX0VSUk9SOw0KLSAgfQ0KLQ0KLSAgcmV0dXJuIHRtcF9oYWxfc3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVudGVyIEFEQyBkZWVwLXBvd2VyLWRvd24gbW9kZQ0KLSAqIEBub3RlICAgVGhpcyBtb2RlIGlzIGFjaGlldmVkIGluIHNldHRpbmcgREVFUFBXRCBiaXQgYW5kIGFsbG93cyB0byBzYXZlIHBvd2VyDQotICogICAgICAgICBpbiByZWR1Y2luZyBsZWFrYWdlIGN1cnJlbnRzLiBJdCBpcyBwYXJ0aWN1bGFybHkgaW50ZXJlc3RpbmcgYmVmb3JlDQotICogICAgICAgICBlbnRlcmluZyBzdG9wIG1vZGVzLg0KLSAqIEBub3RlICAgU2V0dGluZyBERUVQUFdEIGF1dG9tYXRpY2FsbHkgY2xlYXJzIEFEVlJFR0VOIGJpdCBhbmQgZGlzYWJsZXMgdGhlDQotICogICAgICAgICBBREMgdm9sdGFnZSByZWd1bGF0b3IuIFRoaXMgbWVhbnMgdGhhdCB0aGlzIEFQSSBlbmNvbXBhc3Nlcw0KLSAqICAgICAgICAgSEFMX0FEQ0V4X0Rpc2FibGVWb2x0YWdlUmVndWxhdG9yKCkuIEFkZGl0aW9uYWxseSwgdGhlIGludGVybmFsDQotICogICAgICAgICBjYWxpYnJhdGlvbiBpcyBsb3N0Lg0KLSAqIEBub3RlICAgVG8gZXhpdCB0aGUgQURDIGRlZXAtcG93ZXItZG93biBtb2RlLCB0aGUgdXNlciBpcyBleHBlY3RlZCB0bw0KLSAqICAgICAgICAgcmVzb3J0IHRvIEhBTF9BRENfSW5pdCgpIEFQSSBhcyB3ZWxsIGFzIHRvIHJlbGF1bmNoIGEgY2FsaWJyYXRpb24NCi0gKiAgICAgICAgIHdpdGggSEFMX0FEQ0V4X0NhbGlicmF0aW9uX1N0YXJ0KCkgQVBJIG9yIHRvIHJlLWFwcGx5IGEgcHJldmlvdXNseQ0KLSAqICAgICAgICAgc2F2ZWQgY2FsaWJyYXRpb24gZmFjdG9yLg0KLSAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDRXhfRW50ZXJBRENEZWVwUG93ZXJEb3duTW9kZShBRENfSGFuZGxlVHlwZURlZiAqaGFkYykgew0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgdG1wX2hhbF9zdGF0dXM7DQotDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsNCi0NCi0gIC8qIFNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZTogQURDIG11c3QgYmUgQURDDQotICAgKiBkaXNhYmxlZCAqLw0KLSAgaWYgKExMX0FEQ19Jc0VuYWJsZWQoaGFkYy0+SW5zdGFuY2UpID09IDBVTCkgew0KLSAgICBMTF9BRENfRW5hYmxlRGVlcFBvd2VyRG93bihoYWRjLT5JbnN0YW5jZSk7DQotICAgIHRtcF9oYWxfc3RhdHVzID0gSEFMX09LOw0KLSAgfSBlbHNlIHsNCi0gICAgdG1wX2hhbF9zdGF0dXMgPSBIQUxfRVJST1I7DQotICB9DQotDQotICByZXR1cm4gdG1wX2hhbF9zdGF0dXM7DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0jZW5kaWYgLyogSEFMX0FEQ19NT0RVTEVfRU5BQkxFRCAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnNHh4X2hhbF9hZGNfZXguYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgQW5hbG9nIHRvIERpZ2l0YWwgQ29udmVydGVyIChBREMpCisgICogICAgICAgICAgcGVyaXBoZXJhbDoKKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgICogICAgICAgICAgT3RoZXIgZnVuY3Rpb25zIChnZW5lcmljIGZ1bmN0aW9ucykgYXJlIGF2YWlsYWJsZSBpbiBmaWxlCisgICogICAgICAgICAgInN0bTMyZzR4eF9oYWxfYWRjLmMiLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGVybXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZQorICAqIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4KKyAgKiBJZiBubyBMSUNFTlNFIGZpbGUgY29tZXMgd2l0aCB0aGlzIHNvZnR3YXJlLCBpdCBpcyBwcm92aWRlZCBBUy1JUy4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgQHZlcmJhdGltCisgIFsuLl0KKyAgKEApIFNlY3Rpb25zICJBREMgcGVyaXBoZXJhbCBmZWF0dXJlcyIgYW5kICJIb3cgdG8gdXNlIHRoaXMgZHJpdmVyIiBhcmUKKyAgICAgIGF2YWlsYWJsZSBpbiBmaWxlIG9mIGdlbmVyaWMgZnVuY3Rpb25zICJzdG0zMmc0eHhfaGFsX2FkYy5jIi4KKyAgWy4uXQorICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnNHh4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHNHh4X0hBTF9Ecml2ZXIKKyAqIEB7CisgKi8KKworLyoqIEBkZWZncm91cCBBRENFeCBBRENFeAorICogQGJyaWVmIEFEQyBFeHRlbmRlZCBIQUwgbW9kdWxlIGRyaXZlcgorICogQHsKKyAqLworCisjaWZkZWYgSEFMX0FEQ19NT0RVTEVfRU5BQkxFRAorCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBBRENFeF9Qcml2YXRlX0NvbnN0YW50cyBBREMgRXh0ZW5kZWQgUHJpdmF0ZSBDb25zdGFudHMKKyAqIEB7CisgKi8KKworI2RlZmluZSBBRENfSlNRUl9GSUVMRFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChBRENfSlNRUl9KTCB8IEFEQ19KU1FSX0pFWFRTRUwgfCBBRENfSlNRUl9KRVhURU4gfCBBRENfSlNRUl9KU1ExIHwgICAgICBcCisgICAgQURDX0pTUVJfSlNRMiB8IEFEQ19KU1FSX0pTUTMgfCBBRENfSlNRUl9KU1E0KSkgLyohPCBBRENfSlNRUiBmaWVsZHMgb2YgXAorICAgICAgIHBhcmFtZXRlcnMgdGhhdCBjYW4gYmUgdXBkYXRlZCBhbnl0aW1lIG9uY2UgdGhlIEFEQyBpcyBlbmFibGVkICovCisKKy8qIEZpeGVkIHRpbWVvdXQgdmFsdWUgZm9yIEFEQyBjYWxpYnJhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBWYWx1ZXMgZGVmaW5lZCB0byBiZSBoaWdoZXIgdGhhbiB3b3JzdCBjYXNlczogbG93IGNsb2NrIGZyZXF1ZW5jeSwgICAgICAgICAqLworLyogbWF4aW11bSBwcmVzY2FsZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEV4IG9mIHByb2ZpbGUgbG93IGZyZXF1ZW5jeSA6IGZfQURDIGF0IGZfQ1BVLzM5NjggKG1pbmltdW0gdmFsdWUgICAgICAgICAgICovCisvKiBjb25zaWRlcmluZyBib3RoIHBvc3NpYmxlIEFEQyBjbG9ja2luZyBzY2hlbWU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgIC0gQURDIGNsb2NrIGZyb20gc3luY2hyb25vdXMgY2xvY2sgd2l0aCBBSEIgcHJlc2NhbGVyIDUxMiwgICAgICAgICAgKi8KKy8qICAgICAgICAgIEFEQyBwcmVzY2FsZXIgNC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgUmF0aW8gbWF4ID0gNTEyICo0ID0gMjA0OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgIC0gQURDIGNsb2NrIGZyb20gYXN5bmNocm9ub3VzIGNsb2NrIChQTExQKSB3aXRoIHByZXNjYWxlciAyNTYuICAgICAgKi8KKy8qICAgICAgICAgIEhpZ2hlc3QgQ1BVIGNsb2NrIFBMTCAoUExMUikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgUmF0aW8gbWF4ID0gUExMUm1heCAvUFBMUG1pbiAqIDI1NiA9IChWQ08vMikgLyAoVkNPLzMxKSAqIDI1NiAgICAqLworLyogICAgICAgICAgICAgICAgICAgICA9IDM5NjggKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIENhbGlicmF0aW9uX3RpbWUgTUFYID0gODEgLyBmX0FEQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICA9IDgxIC8gKGZfQ1BVLzM5MzgpID0gMzE4OTc4IENQVSBjeWNsZXMgICAgICAgICAgICAgICAqLworI2RlZmluZSBBRENfQ0FMSUJSQVRJT05fVElNRU9VVCBcCisgICgzMTg5NzhVTCkgLyohPCBBREMgY2FsaWJyYXRpb24gdGltZS1vdXQgdmFsdWUgKHVuaXQ6IENQVSBjeWNsZXMpICovCisKKy8qKgorICogQH0KKyAqLworCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIEFEQ0V4X0V4cG9ydGVkX0Z1bmN0aW9ucyBBREMgRXh0ZW5kZWQgRXhwb3J0ZWQgRnVuY3Rpb25zCisgKiBAeworICovCisKKy8qKiBAZGVmZ3JvdXAgQURDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBFeHRlbmRlZCBJbnB1dCBhbmQgT3V0cHV0CitvcGVyYXRpb24gZnVuY3Rpb25zCisgICogQGJyaWVmICAgIEV4dGVuZGVkIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKworICAgICAgKCspIFBlcmZvcm0gdGhlIEFEQyBzZWxmLWNhbGlicmF0aW9uIGZvciBzaW5nbGUgb3IgZGlmZmVyZW50aWFsIGVuZGluZy4KKyAgICAgICgrKSBHZXQgY2FsaWJyYXRpb24gZmFjdG9ycyBmb3Igc2luZ2xlIG9yIGRpZmZlcmVudGlhbCBlbmRpbmcuCisgICAgICAoKykgU2V0IGNhbGlicmF0aW9uIGZhY3RvcnMgZm9yIHNpbmdsZSBvciBkaWZmZXJlbnRpYWwgZW5kaW5nLgorCisgICAgICAoKykgU3RhcnQgY29udmVyc2lvbiBvZiBBREMgZ3JvdXAgaW5qZWN0ZWQuCisgICAgICAoKykgU3RvcCBjb252ZXJzaW9uIG9mIEFEQyBncm91cCBpbmplY3RlZC4KKyAgICAgICgrKSBQb2xsIGZvciBjb252ZXJzaW9uIGNvbXBsZXRlIG9uIEFEQyBncm91cCBpbmplY3RlZC4KKyAgICAgICgrKSBHZXQgcmVzdWx0IG9mIEFEQyBncm91cCBpbmplY3RlZCBjaGFubmVsIGNvbnZlcnNpb24uCisgICAgICAoKykgU3RhcnQgY29udmVyc2lvbiBvZiBBREMgZ3JvdXAgaW5qZWN0ZWQgYW5kIGVuYWJsZSBpbnRlcnJ1cHRpb25zLgorICAgICAgKCspIFN0b3AgY29udmVyc2lvbiBvZiBBREMgZ3JvdXAgaW5qZWN0ZWQgYW5kIGRpc2FibGUgaW50ZXJydXB0aW9ucy4KKworICAgICAgKCspIFdoZW4gbXVsdGltb2RlIGZlYXR1cmUgaXMgYXZhaWxhYmxlLCBzdGFydCBtdWx0aW1vZGUgYW5kIGVuYWJsZSBETUEKK3RyYW5zZmVyLgorICAgICAgKCspIFN0b3AgbXVsdGltb2RlIGFuZCBkaXNhYmxlIEFEQyBETUEgdHJhbnNmZXIuCisgICAgICAoKykgR2V0IHJlc3VsdCBvZiBtdWx0aW1vZGUgY29udmVyc2lvbi4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgKiBAYnJpZWYgIFBlcmZvcm0gYW4gQURDIGF1dG9tYXRpYyBzZWxmLWNhbGlicmF0aW9uCisgKiAgICAgICAgIENhbGlicmF0aW9uIHByZXJlcXVpc2l0ZTogQURDIG11c3QgYmUgZGlzYWJsZWQgKGV4ZWN1dGUgdGhpcworICogICAgICAgICBmdW5jdGlvbiBiZWZvcmUgSEFMX0FEQ19TdGFydCgpIG9yIGFmdGVyIEhBTF9BRENfU3RvcCgpICkuCisgKiBAcGFyYW0gIGhhZGMgICAgICAgQURDIGhhbmRsZQorICogQHBhcmFtICBTaW5nbGVEaWZmIFNlbGVjdGlvbiBvZiBzaW5nbGUtZW5kZWQgb3IgZGlmZmVyZW50aWFsIGlucHV0CisgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19TSU5HTEVfRU5ERUQgICAgICAgQ2hhbm5lbCBpbiBtb2RlIGlucHV0IHNpbmdsZSBlbmRlZAorICogICAgICAgICAgIEBhcmcgQHJlZiBBRENfRElGRkVSRU5USUFMX0VOREVEIENoYW5uZWwgaW4gbW9kZSBpbnB1dCBkaWZmZXJlbnRpYWwKKyAqIGVuZGVkCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ0V4X0NhbGlicmF0aW9uX1N0YXJ0KEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFNpbmdsZURpZmYpIHsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgdG1wX2hhbF9zdGF0dXM7CisgIF9fSU8gdWludDMyX3Qgd2FpdF9sb29wX2luZGV4ID0gMFVMOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19BRENfU0lOR0xFX0RJRkZFUkVOVElBTChTaW5nbGVEaWZmKSk7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoYWRjKTsKKworICAvKiBDYWxpYnJhdGlvbiBwcmVyZXF1aXNpdGU6IEFEQyBtdXN0IGJlIGRpc2FibGVkLiAqLworCisgIC8qIERpc2FibGUgdGhlIEFEQyAoaWYgbm90IGFscmVhZHkgZGlzYWJsZWQpICovCisgIHRtcF9oYWxfc3RhdHVzID0gQURDX0Rpc2FibGUoaGFkYyk7CisKKyAgLyogQ2hlY2sgaWYgQURDIGlzIGVmZmVjdGl2ZWx5IGRpc2FibGVkICovCisgIGlmICh0bXBfaGFsX3N0YXR1cyA9PSBIQUxfT0spIHsKKyAgICAvKiBTZXQgQURDIHN0YXRlICovCisgICAgQURDX1NUQVRFX0NMUl9TRVQoaGFkYy0+U3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSB8IEhBTF9BRENfU1RBVEVfSU5KX0JVU1ksCisgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9CVVNZX0lOVEVSTkFMKTsKKworICAgIC8qIFN0YXJ0IEFEQyBjYWxpYnJhdGlvbiBpbiBtb2RlIHNpbmdsZS1lbmRlZCBvciBkaWZmZXJlbnRpYWwgKi8KKyAgICBMTF9BRENfU3RhcnRDYWxpYnJhdGlvbihoYWRjLT5JbnN0YW5jZSwgU2luZ2xlRGlmZik7CisKKyAgICAvKiBXYWl0IGZvciBjYWxpYnJhdGlvbiBjb21wbGV0aW9uICovCisgICAgd2hpbGUgKExMX0FEQ19Jc0NhbGlicmF0aW9uT25Hb2luZyhoYWRjLT5JbnN0YW5jZSkgIT0gMFVMKSB7CisgICAgICB3YWl0X2xvb3BfaW5kZXgrKzsKKyAgICAgIGlmICh3YWl0X2xvb3BfaW5kZXggPj0gQURDX0NBTElCUkFUSU9OX1RJTUVPVVQpIHsKKyAgICAgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lIHRvIGVycm9yICovCisgICAgICAgIEFEQ19TVEFURV9DTFJfU0VUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0JVU1lfSU5URVJOQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfRVJST1JfSU5URVJOQUwpOworCisgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhhZGMpOworCisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorCisgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgIEFEQ19TVEFURV9DTFJfU0VUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0JVU1lfSU5URVJOQUwsCisgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUFEWSk7CisgIH0gZWxzZSB7CisgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9JTlRFUk5BTCk7CisKKyAgICAvKiBOb3RlOiBObyBuZWVkIHRvIHVwZGF0ZSB2YXJpYWJsZSAidG1wX2hhbF9zdGF0dXMiIGhlcmU6IGFscmVhZHkgc2V0ICAgICovCisgICAgLyogICAgICAgdG8gc3RhdGUgIkhBTF9FUlJPUiIgYnkgZnVuY3Rpb24gZGlzYWJsaW5nIHRoZSBBREMuICAgICAgICAgICAgICAqLworICB9CisKKyAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGFkYyk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gdG1wX2hhbF9zdGF0dXM7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgdGhlIGNhbGlicmF0aW9uIGZhY3Rvci4KKyAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUuCisgKiBAcGFyYW0gU2luZ2xlRGlmZiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25seToKKyAqICAgICAgICAgICBAYXJnIEByZWYgQURDX1NJTkdMRV9FTkRFRCAgICAgICBDaGFubmVsIGluIG1vZGUgaW5wdXQgc2luZ2xlIGVuZGVkCisgKiAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19ESUZGRVJFTlRJQUxfRU5ERUQgQ2hhbm5lbCBpbiBtb2RlIGlucHV0IGRpZmZlcmVudGlhbAorICogZW5kZWQKKyAqIEByZXR2YWwgQ2FsaWJyYXRpb24gdmFsdWUuCisgKi8KK3VpbnQzMl90IEhBTF9BRENFeF9DYWxpYnJhdGlvbl9HZXRWYWx1ZShjb25zdCBBRENfSGFuZGxlVHlwZURlZiAqaGFkYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBTaW5nbGVEaWZmKSB7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19BRENfU0lOR0xFX0RJRkZFUkVOVElBTChTaW5nbGVEaWZmKSk7CisKKyAgLyogUmV0dXJuIHRoZSBzZWxlY3RlZCBBREMgY2FsaWJyYXRpb24gdmFsdWUgKi8KKyAgcmV0dXJuIExMX0FEQ19HZXRDYWxpYnJhdGlvbkZhY3RvcihoYWRjLT5JbnN0YW5jZSwgU2luZ2xlRGlmZik7Cit9CisKKy8qKgorICogQGJyaWVmICBTZXQgdGhlIGNhbGlicmF0aW9uIGZhY3RvciB0byBvdmVyd3JpdGUgYXV0b21hdGljIGNvbnZlcnNpb24gcmVzdWx0LgorICogICAgICAgICBBREMgbXVzdCBiZSBlbmFibGVkIGFuZCBubyBjb252ZXJzaW9uIGlzIG9uZ29pbmcuCisgKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlCisgKiBAcGFyYW0gU2luZ2xlRGlmZiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25seToKKyAqICAgICAgICAgICBAYXJnIEByZWYgQURDX1NJTkdMRV9FTkRFRCAgICAgICBDaGFubmVsIGluIG1vZGUgaW5wdXQgc2luZ2xlIGVuZGVkCisgKiAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19ESUZGRVJFTlRJQUxfRU5ERUQgQ2hhbm5lbCBpbiBtb2RlIGlucHV0IGRpZmZlcmVudGlhbAorICogZW5kZWQKKyAqIEBwYXJhbSBDYWxpYnJhdGlvbkZhY3RvciBDYWxpYnJhdGlvbiBmYWN0b3IgKGNvZGVkIG9uIDcgYml0cyBtYXhpbXVtKQorICogQHJldHZhbCBIQUwgc3RhdGUKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ0V4X0NhbGlicmF0aW9uX1NldFZhbHVlKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFNpbmdsZURpZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2FsaWJyYXRpb25GYWN0b3IpIHsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgdG1wX2hhbF9zdGF0dXMgPSBIQUxfT0s7CisgIHVpbnQzMl90IHRtcF9hZGNfaXNfY29udmVyc2lvbl9vbl9nb2luZ19yZWd1bGFyOworICB1aW50MzJfdCB0bXBfYWRjX2lzX2NvbnZlcnNpb25fb25fZ29pbmdfaW5qZWN0ZWQ7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19TSU5HTEVfRElGRkVSRU5USUFMKFNpbmdsZURpZmYpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19DQUxGQUNUKENhbGlicmF0aW9uRmFjdG9yKSk7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoYWRjKTsKKworICAvKiBWZXJpZmljYXRpb24gb2YgaGFyZHdhcmUgY29uc3RyYWludHMgYmVmb3JlIG1vZGlmeWluZyB0aGUgY2FsaWJyYXRpb24gICAgKi8KKyAgLyogZmFjdG9ycyByZWdpc3RlcjogQURDIG11c3QgYmUgZW5hYmxlZCwgbm8gY29udmVyc2lvbiBvbiBnb2luZy4gICAgICAgICAgICovCisgIHRtcF9hZGNfaXNfY29udmVyc2lvbl9vbl9nb2luZ19yZWd1bGFyID0KKyAgICAgIExMX0FEQ19SRUdfSXNDb252ZXJzaW9uT25nb2luZyhoYWRjLT5JbnN0YW5jZSk7CisgIHRtcF9hZGNfaXNfY29udmVyc2lvbl9vbl9nb2luZ19pbmplY3RlZCA9CisgICAgICBMTF9BRENfSU5KX0lzQ29udmVyc2lvbk9uZ29pbmcoaGFkYy0+SW5zdGFuY2UpOworCisgIGlmICgoTExfQURDX0lzRW5hYmxlZChoYWRjLT5JbnN0YW5jZSkgIT0gMFVMKSAmJgorICAgICAgKHRtcF9hZGNfaXNfY29udmVyc2lvbl9vbl9nb2luZ19yZWd1bGFyID09IDBVTCkgJiYKKyAgICAgICh0bXBfYWRjX2lzX2NvbnZlcnNpb25fb25fZ29pbmdfaW5qZWN0ZWQgPT0gMFVMKSkgeworICAgIC8qIFNldCB0aGUgc2VsZWN0ZWQgQURDIGNhbGlicmF0aW9uIHZhbHVlICovCisgICAgTExfQURDX1NldENhbGlicmF0aW9uRmFjdG9yKGhhZGMtPkluc3RhbmNlLCBTaW5nbGVEaWZmLCBDYWxpYnJhdGlvbkZhY3Rvcik7CisgIH0gZWxzZSB7CisgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lICovCisgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9DT05GSUcpOworICAgIC8qIFVwZGF0ZSBBREMgZXJyb3IgY29kZSAqLworICAgIFNFVF9CSVQoaGFkYy0+RXJyb3JDb2RlLCBIQUxfQURDX0VSUk9SX0lOVEVSTkFMKTsKKworICAgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSB0byBlcnJvciAqLworICAgIHRtcF9oYWxfc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisKKyAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGFkYyk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gdG1wX2hhbF9zdGF0dXM7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgQURDLCBzdGFydCBjb252ZXJzaW9uIG9mIGluamVjdGVkIGdyb3VwLgorICogQG5vdGUgICBJbnRlcnJ1cHRpb25zIGVuYWJsZWQgaW4gdGhpcyBmdW5jdGlvbjogTm9uZS4KKyAqIEBub3RlICAgQ2FzZSBvZiBtdWx0aW1vZGUgZW5hYmxlZCB3aGVuIG11bHRpbW9kZSBmZWF0dXJlIGlzIGF2YWlsYWJsZToKKyAqICAgICAgICAgSEFMX0FEQ0V4X0luamVjdGVkU3RhcnQoKSBBUEkgbXVzdCBiZSBjYWxsZWQgZm9yIEFEQyBzbGF2ZSBmaXJzdCwKKyAqICAgICAgICAgdGhlbiBmb3IgQURDIG1hc3Rlci4KKyAqICAgICAgICAgRm9yIEFEQyBzbGF2ZSwgQURDIGlzIGVuYWJsZWQgb25seSAoY29udmVyc2lvbiBpcyBub3Qgc3RhcnRlZCkuCisgKiAgICAgICAgIEZvciBBREMgbWFzdGVyLCBBREMgaXMgZW5hYmxlZCBhbmQgbXVsdGltb2RlIGNvbnZlcnNpb24gaXMgc3RhcnRlZC4KKyAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUuCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ0V4X0luamVjdGVkU3RhcnQoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpIHsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgdG1wX2hhbF9zdGF0dXM7CisgIHVpbnQzMl90IHRtcF9jb25maWdfaW5qZWN0ZWRfcXVldWU7CisjaWYgZGVmaW5lZChBRENfTVVMVElNT0RFX1NVUFBPUlQpCisgIHVpbnQzMl90IHRtcF9tdWx0aW1vZGVfY29uZmlnID0KKyAgICAgIExMX0FEQ19HZXRNdWx0aW1vZGUoX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7CisjZW5kaWYgLyogQURDX01VTFRJTU9ERV9TVVBQT1JUICovCisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKworICBpZiAoTExfQURDX0lOSl9Jc0NvbnZlcnNpb25PbmdvaW5nKGhhZGMtPkluc3RhbmNlKSAhPSAwVUwpIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0gZWxzZSB7CisgICAgLyogSW4gY2FzZSBvZiBzb2Z0d2FyZSB0cmlnZ2VyIGRldGVjdGlvbiBlbmFibGVkLCBKUURJUyBtdXN0IGJlIHNldAorICAgICAgKHdoaWNoIGNhbiBiZSBkb25lIG9ubHkgaWYgQURTVEFSVCBhbmQgSkFEU1RBUlQgYXJlIGJvdGggY2xlYXJlZCkuCisgICAgICAgSWYgSlFESVMgaXMgbm90IHNldCBhdCB0aGF0IHBvaW50LCByZXR1cm5zIGFuIGVycm9yCisgICAgICAgLSBzaW5jZSBzb2Z0d2FyZSB0cmlnZ2VyIGRldGVjdGlvbiBpcyBkaXNhYmxlZC4gVXNlciBuZWVkcyB0bworICAgICAgIHJlc29ydCB0byBIQUxfQURDRXhfRGlzYWJsZUluamVjdGVkUXVldWUoKSBBUEkgdG8gc2V0IEpRRElTLgorICAgICAgIC0gb3IgKGlmIEpRRElTIGlzIGludGVudGlvbmFsbHkgcmVzZXQpIHNpbmNlIEpFWFRFTiA9IDAgd2hpY2ggbWVhbnMKKyAgICAgICAgIHRoZSBxdWV1ZSBpcyBlbXB0eSAqLworICAgIHRtcF9jb25maWdfaW5qZWN0ZWRfcXVldWUgPSBSRUFEX0JJVChoYWRjLT5JbnN0YW5jZS0+Q0ZHUiwgQURDX0NGR1JfSlFESVMpOworCisgICAgaWYgKChSRUFEX0JJVChoYWRjLT5JbnN0YW5jZS0+SlNRUiwgQURDX0pTUVJfSkVYVEVOKSA9PSAwVUwpICYmCisgICAgICAgICh0bXBfY29uZmlnX2luamVjdGVkX3F1ZXVlID09IDBVTCkpIHsKKyAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfRVJST1JfQ09ORklHKTsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhhZGMpOworCisgICAgLyogRW5hYmxlIHRoZSBBREMgcGVyaXBoZXJhbCAqLworICAgIHRtcF9oYWxfc3RhdHVzID0gQURDX0VuYWJsZShoYWRjKTsKKworICAgIC8qIFN0YXJ0IGNvbnZlcnNpb24gaWYgQURDIGlzIGVmZmVjdGl2ZWx5IGVuYWJsZWQgKi8KKyAgICBpZiAodG1wX2hhbF9zdGF0dXMgPT0gSEFMX09LKSB7CisgICAgICAvKiBDaGVjayBpZiBhIHJlZ3VsYXIgY29udmVyc2lvbiBpcyBvbmdvaW5nICovCisgICAgICBpZiAoKGhhZGMtPlN0YXRlICYgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSkgIT0gMFVMKSB7CisgICAgICAgIC8qIFJlc2V0IEFEQyBlcnJvciBjb2RlIGZpZWxkIHJlbGF0ZWQgdG8gaW5qZWN0ZWQgY29udmVyc2lvbnMgb25seSAqLworICAgICAgICBDTEVBUl9CSVQoaGFkYy0+RXJyb3JDb2RlLCBIQUxfQURDX0VSUk9SX0pRT1ZGKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFNldCBBREMgZXJyb3IgY29kZSB0byBub25lICovCisgICAgICAgIEFEQ19DTEVBUl9FUlJPUkNPREUoaGFkYyk7CisgICAgICB9CisKKyAgICAgIC8qIFNldCBBREMgc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiAtIENsZWFyIHN0YXRlIGJpdGZpZWxkIHJlbGF0ZWQgdG8gaW5qZWN0ZWQgZ3JvdXAgY29udmVyc2lvbiByZXN1bHRzICAqLworICAgICAgLyogLSBTZXQgc3RhdGUgYml0ZmllbGQgcmVsYXRlZCB0byBpbmplY3RlZCBvcGVyYXRpb24gICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIEFEQ19TVEFURV9DTFJfU0VUKGhhZGMtPlN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUFEWSB8IEhBTF9BRENfU1RBVEVfSU5KX0VPQywKKyAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfSU5KX0JVU1kpOworCisjaWYgZGVmaW5lZChBRENfTVVMVElNT0RFX1NVUFBPUlQpCisgICAgICAvKiBSZXNldCBIQUxfQURDX1NUQVRFX01VTFRJTU9ERV9TTEFWRSBiaXQKKyAgICAgICAgLSBpZiBBREMgaW5zdGFuY2UgaXMgbWFzdGVyIG9yIGlmIG11bHRpbW9kZSBmZWF0dXJlIGlzIG5vdCBhdmFpbGFibGUKKyAgICAgICAgLSBpZiBtdWx0aW1vZGUgc2V0dGluZyBpcyBkaXNhYmxlZCAoQURDIGluc3RhbmNlIHNsYXZlIGluIGluZGVwZW5kZW50CisgICAgICAgIG1vZGUpICovCisgICAgICBpZiAoKF9fTExfQURDX01VTFRJX0lOU1RBTkNFX01BU1RFUihoYWRjLT5JbnN0YW5jZSkgPT0gaGFkYy0+SW5zdGFuY2UpIHx8CisgICAgICAgICAgKHRtcF9tdWx0aW1vZGVfY29uZmlnID09IExMX0FEQ19NVUxUSV9JTkRFUEVOREVOVCkpIHsKKyAgICAgICAgQ0xFQVJfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX01VTFRJTU9ERV9TTEFWRSk7CisgICAgICB9CisjZW5kaWYgLyogQURDX01VTFRJTU9ERV9TVVBQT1JUICovCisKKyAgICAgIC8qIENsZWFyIEFEQyBncm91cCBpbmplY3RlZCBncm91cCBjb252ZXJzaW9uIGZsYWcgKi8KKyAgICAgIC8qIChUbyBlbnN1cmUgb2Ygbm8gdW5rbm93biBzdGF0ZSBmcm9tIHBvdGVudGlhbCBwcmV2aW91cyBBREMgb3BlcmF0aW9ucykKKyAgICAgICAqLworICAgICAgX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgKEFEQ19GTEFHX0pFT0MgfCBBRENfRkxBR19KRU9TKSk7CisKKyAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgIC8qIFVubG9jayBiZWZvcmUgc3RhcnRpbmcgQURDIGNvbnZlcnNpb25zOiBpbiBjYXNlIG9mIHBvdGVudGlhbCAgICAgICAgICovCisgICAgICAvKiBpbnRlcnJ1cHRpb24sIHRvIGxldCB0aGUgcHJvY2VzcyB0byBBREMgSVJRIEhhbmRsZXIuICAgICAgICAgICAgICAgICAqLworICAgICAgX19IQUxfVU5MT0NLKGhhZGMpOworCisgICAgICAvKiBFbmFibGUgY29udmVyc2lvbiBvZiBpbmplY3RlZCBncm91cCwgaWYgYXV0b21hdGljIGluamVjdGVkIGNvbnZlcnNpb24KKyAgICAgICAqLworICAgICAgLyogaXMgZGlzYWJsZWQuICovCisgICAgICAvKiBJZiBzb2Z0d2FyZSBzdGFydCBoYXMgYmVlbiBzZWxlY3RlZCwgY29udmVyc2lvbiBzdGFydHMgaW1tZWRpYXRlbHkuICovCisgICAgICAvKiBJZiBleHRlcm5hbCB0cmlnZ2VyIGhhcyBiZWVuIHNlbGVjdGVkLCBjb252ZXJzaW9uIHdpbGwgc3RhcnQgYXQgbmV4dCAqLworICAgICAgLyogdHJpZ2dlciBldmVudC4gKi8KKyAgICAgIC8qIENhc2Ugb2YgbXVsdGltb2RlIGVuYWJsZWQgKHdoZW4gbXVsdGltb2RlIGZlYXR1cmUgaXMgYXZhaWxhYmxlKTogKi8KKyAgICAgIC8qIGlmIEFEQyBpcyBzbGF2ZSwgKi8KKyAgICAgIC8qICAgIC0gQURDIGlzIGVuYWJsZWQgb25seSAoY29udmVyc2lvbiBpcyBub3Qgc3RhcnRlZCksICovCisgICAgICAvKiAgICAtIGlmIG11bHRpbW9kZSBvbmx5IGNvbmNlcm5zIHJlZ3VsYXIgY29udmVyc2lvbiwgQURDIGlzIGVuYWJsZWQgKi8KKyAgICAgIC8qICAgICBhbmQgY29udmVyc2lvbiBpcyBzdGFydGVkLiAqLworICAgICAgLyogSWYgQURDIGlzIG1hc3RlciBvciBpbmRlcGVuZGVudCwgKi8KKyAgICAgIC8qICAgIC0gQURDIGlzIGVuYWJsZWQgYW5kIGNvbnZlcnNpb24gaXMgc3RhcnRlZC4gKi8KKyNpZiBkZWZpbmVkKEFEQ19NVUxUSU1PREVfU1VQUE9SVCkKKyAgICAgIGlmICgoX19MTF9BRENfTVVMVElfSU5TVEFOQ0VfTUFTVEVSKGhhZGMtPkluc3RhbmNlKSA9PSBoYWRjLT5JbnN0YW5jZSkgfHwKKyAgICAgICAgICAodG1wX211bHRpbW9kZV9jb25maWcgPT0gTExfQURDX01VTFRJX0lOREVQRU5ERU5UKSB8fAorICAgICAgICAgICh0bXBfbXVsdGltb2RlX2NvbmZpZyA9PSBMTF9BRENfTVVMVElfRFVBTF9SRUdfU0lNVUxUKSB8fAorICAgICAgICAgICh0bXBfbXVsdGltb2RlX2NvbmZpZyA9PSBMTF9BRENfTVVMVElfRFVBTF9SRUdfSU5URVJMKSkgeworICAgICAgICAvKiBBREMgaW5zdGFuY2UgaXMgbm90IGEgbXVsdGltb2RlIHNsYXZlIGluc3RhbmNlIHdpdGggbXVsdGltb2RlCisgICAgICAgICAqIGluamVjdGVkIGNvbnZlcnNpb25zIGVuYWJsZWQgKi8KKyAgICAgICAgaWYgKExMX0FEQ19JTkpfR2V0VHJpZ0F1dG8oaGFkYy0+SW5zdGFuY2UpID09CisgICAgICAgICAgICBMTF9BRENfSU5KX1RSSUdfSU5ERVBFTkRFTlQpIHsKKyAgICAgICAgICBMTF9BRENfSU5KX1N0YXJ0Q29udmVyc2lvbihoYWRjLT5JbnN0YW5jZSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIEFEQyBpbnN0YW5jZSBpcyBub3QgYSBtdWx0aW1vZGUgc2xhdmUgaW5zdGFuY2Ugd2l0aCBtdWx0aW1vZGUKKyAgICAgICAgICogaW5qZWN0ZWQgY29udmVyc2lvbnMgZW5hYmxlZCAqLworICAgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX01VTFRJTU9ERV9TTEFWRSk7CisgICAgICB9CisjZWxzZQorICAgICAgaWYgKExMX0FEQ19JTkpfR2V0VHJpZ0F1dG8oaGFkYy0+SW5zdGFuY2UpID09CisgICAgICAgICAgTExfQURDX0lOSl9UUklHX0lOREVQRU5ERU5UKSB7CisgICAgICAgIC8qIFN0YXJ0IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uICovCisgICAgICAgIExMX0FEQ19JTkpfU3RhcnRDb252ZXJzaW9uKGhhZGMtPkluc3RhbmNlKTsKKyAgICAgIH0KKyNlbmRpZiAvKiBBRENfTVVMVElNT0RFX1NVUFBPUlQgKi8KKworICAgIH0gZWxzZSB7CisgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGFkYyk7CisgICAgfQorCisgICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICAgIHJldHVybiB0bXBfaGFsX3N0YXR1czsKKyAgfQorfQorCisvKioKKyAqIEBicmllZiAgU3RvcCBjb252ZXJzaW9uIG9mIGluamVjdGVkIGNoYW5uZWxzLiBEaXNhYmxlIEFEQyBwZXJpcGhlcmFsIGlmCisgKiAgICAgICAgIG5vIHJlZ3VsYXIgY29udmVyc2lvbiBpcyBvbiBnb2luZy4KKyAqIEBub3RlICAgSWYgQURDIG11c3QgYmUgZGlzYWJsZWQgYW5kIGlmIGNvbnZlcnNpb24gaXMgb24gZ29pbmcgb24KKyAqICAgICAgICAgcmVndWxhciBncm91cCwgZnVuY3Rpb24gSEFMX0FEQ19TdG9wIG11c3QgYmUgdXNlZCB0byBzdG9wIGJvdGgKKyAqICAgICAgICAgaW5qZWN0ZWQgYW5kIHJlZ3VsYXIgZ3JvdXBzLCBhbmQgZGlzYWJsZSB0aGUgQURDLgorICogQG5vdGUgICBJZiBpbmplY3RlZCBncm91cCBtb2RlIGF1dG8taW5qZWN0aW9uIGlzIGVuYWJsZWQsCisgKiAgICAgICAgIGZ1bmN0aW9uIEhBTF9BRENfU3RvcCBtdXN0IGJlIHVzZWQuCisgKiBAbm90ZSAgIEluIGNhc2Ugb2YgbXVsdGltb2RlIGVuYWJsZWQgKHdoZW4gbXVsdGltb2RlIGZlYXR1cmUgaXMgYXZhaWxhYmxlKSwKKyAqICAgICAgICAgSEFMX0FEQ0V4X0luamVjdGVkU3RvcCgpIG11c3QgYmUgY2FsbGVkIGZvciBBREMgbWFzdGVyIGZpcnN0LCB0aGVuCisgKiBmb3IgQURDIHNsYXZlLiBGb3IgQURDIG1hc3RlciwgY29udmVyc2lvbiBpcyBzdG9wcGVkIGFuZCBBREMgaXMgZGlzYWJsZWQuIEZvcgorICogQURDIHNsYXZlLCBBREMgaXMgZGlzYWJsZWQgb25seSAoY29udmVyc2lvbiBzdG9wIG9mIEFEQyBtYXN0ZXIgaGFzIGFscmVhZHkKKyAqIHN0b3BwZWQgY29udmVyc2lvbiBvZiBBREMgc2xhdmUpLgorICogQHBhcmFtIGhhZGMgQURDIGhhbmRsZS4KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDRXhfSW5qZWN0ZWRTdG9wKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKSB7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHRtcF9oYWxfc3RhdHVzOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoYWRjKTsKKworICAvKiAxLiBTdG9wIHBvdGVudGlhbCBjb252ZXJzaW9uIG9uIGdvaW5nIG9uIGluamVjdGVkIGdyb3VwIG9ubHkuICovCisgIHRtcF9oYWxfc3RhdHVzID0gQURDX0NvbnZlcnNpb25TdG9wKGhhZGMsIEFEQ19JTkpFQ1RFRF9HUk9VUCk7CisKKyAgLyogRGlzYWJsZSBBREMgcGVyaXBoZXJhbCBpZiBpbmplY3RlZCBjb252ZXJzaW9ucyBhcmUgZWZmZWN0aXZlbHkgc3RvcHBlZCAgICovCisgIC8qIGFuZCBpZiBubyBjb252ZXJzaW9uIG9uIHJlZ3VsYXIgZ3JvdXAgaXMgb24tZ29pbmcgICAgICAgICAgICAgICAgICAgICAgICovCisgIGlmICh0bXBfaGFsX3N0YXR1cyA9PSBIQUxfT0spIHsKKyAgICBpZiAoTExfQURDX1JFR19Jc0NvbnZlcnNpb25PbmdvaW5nKGhhZGMtPkluc3RhbmNlKSA9PSAwVUwpIHsKKyAgICAgIC8qIDIuIERpc2FibGUgdGhlIEFEQyBwZXJpcGhlcmFsICovCisgICAgICB0bXBfaGFsX3N0YXR1cyA9IEFEQ19EaXNhYmxlKGhhZGMpOworCisgICAgICAvKiBDaGVjayBpZiBBREMgaXMgZWZmZWN0aXZlbHkgZGlzYWJsZWQgKi8KKyAgICAgIGlmICh0bXBfaGFsX3N0YXR1cyA9PSBIQUxfT0spIHsKKyAgICAgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgICAgICBBRENfU1RBVEVfQ0xSX1NFVChoYWRjLT5TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSB8IEhBTF9BRENfU1RBVEVfSU5KX0JVU1ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVBRFkpOworICAgICAgfQorICAgIH0KKyAgICAvKiBDb252ZXJzaW9uIG9uIGluamVjdGVkIGdyb3VwIGlzIHN0b3BwZWQsIGJ1dCBBREMgbm90IGRpc2FibGVkIHNpbmNlICAgICovCisgICAgLyogY29udmVyc2lvbiBvbiByZWd1bGFyIGdyb3VwIGlzIHN0aWxsIHJ1bm5pbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGVsc2UgeworICAgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgICAgQ0xFQVJfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0lOSl9CVVNZKTsKKyAgICB9CisgIH0KKworICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoYWRjKTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiB0bXBfaGFsX3N0YXR1czsKK30KKworLyoqCisgKiBAYnJpZWYgIFdhaXQgZm9yIGluamVjdGVkIGdyb3VwIGNvbnZlcnNpb24gdG8gYmUgY29tcGxldGVkLgorICogQHBhcmFtIGhhZGMgQURDIGhhbmRsZQorICogQHBhcmFtIFRpbWVvdXQgVGltZW91dCB2YWx1ZSBpbiBtaWxsaXNlY29uZC4KKyAqIEBub3RlICAgRGVwZW5kaW5nIG9uIGhhZGMtPkluaXQuRU9DU2VsZWN0aW9uLCBKRU9TIG9yIEpFT0MgaXMKKyAqICAgICAgICAgY2hlY2tlZCBhbmQgY2xlYXJlZCBkZXBlbmRpbmcgb24gQVVURExZIGJpdCBzdGF0dXMuCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ0V4X0luamVjdGVkUG9sbEZvckNvbnZlcnNpb24oQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lb3V0KSB7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKyAgdWludDMyX3QgdG1wX2ZsYWdfZW5kOworICB1aW50MzJfdCB0bXBfYWRjX2lual9pc190cmlnZ2VyX3NvdXJjZV9zd19zdGFydDsKKyAgdWludDMyX3QgdG1wX2FkY19yZWdfaXNfdHJpZ2dlcl9zb3VyY2Vfc3dfc3RhcnQ7CisgIHVpbnQzMl90IHRtcF9jZmdyOworI2lmIGRlZmluZWQoQURDX01VTFRJTU9ERV9TVVBQT1JUKQorICBjb25zdCBBRENfVHlwZURlZiAqdG1wQURDX01hc3RlcjsKKyAgdWludDMyX3QgdG1wX211bHRpbW9kZV9jb25maWcgPQorICAgICAgTExfQURDX0dldE11bHRpbW9kZShfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKyNlbmRpZiAvKiBBRENfTVVMVElNT0RFX1NVUFBPUlQgKi8KKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworCisgIC8qIElmIGVuZCBvZiBzZXF1ZW5jZSBzZWxlY3RlZCAqLworICBpZiAoaGFkYy0+SW5pdC5FT0NTZWxlY3Rpb24gPT0gQURDX0VPQ19TRVFfQ09OVikgeworICAgIHRtcF9mbGFnX2VuZCA9IEFEQ19GTEFHX0pFT1M7CisgIH0gZWxzZSAvKiBlbmQgb2YgY29udmVyc2lvbiBzZWxlY3RlZCAqLworICB7CisgICAgdG1wX2ZsYWdfZW5kID0gQURDX0ZMQUdfSkVPQzsKKyAgfQorCisgIC8qIEdldCB0aW1lb3V0ICovCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgLyogV2FpdCB1bnRpbCBFbmQgb2YgQ29udmVyc2lvbiBvciBTZXF1ZW5jZSBmbGFnIGlzIHJhaXNlZCAqLworICB3aGlsZSAoKGhhZGMtPkluc3RhbmNlLT5JU1IgJiB0bXBfZmxhZ19lbmQpID09IDBVTCkgeworICAgIC8qIENoZWNrIGlmIHRpbWVvdXQgaXMgZGlzYWJsZWQgKHNldCB0byBpbmZpbml0ZSB3YWl0KSAqLworICAgIGlmIChUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpIHsKKyAgICAgIGlmICgoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gVGltZW91dCkgfHwgKFRpbWVvdXQgPT0gMFVMKSkgeworICAgICAgICAvKiBOZXcgY2hlY2sgdG8gYXZvaWQgZmFsc2UgdGltZW91dCBkZXRlY3Rpb24gaW4gY2FzZSBvZiBwcmVlbXB0aW9uICovCisgICAgICAgIGlmICgoaGFkYy0+SW5zdGFuY2UtPklTUiAmIHRtcF9mbGFnX2VuZCkgPT0gMFVMKSB7CisgICAgICAgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lIHRvIHRpbWVvdXQgKi8KKyAgICAgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX1RJTUVPVVQpOworCisgICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICAgIF9fSEFMX1VOTE9DSyhoYWRjKTsKKworICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIFJldHJpZXZlIEFEQyBjb25maWd1cmF0aW9uICovCisgIHRtcF9hZGNfaW5qX2lzX3RyaWdnZXJfc291cmNlX3N3X3N0YXJ0ID0KKyAgICAgIExMX0FEQ19JTkpfSXNUcmlnZ2VyU291cmNlU1dTdGFydChoYWRjLT5JbnN0YW5jZSk7CisgIHRtcF9hZGNfcmVnX2lzX3RyaWdnZXJfc291cmNlX3N3X3N0YXJ0ID0KKyAgICAgIExMX0FEQ19SRUdfSXNUcmlnZ2VyU291cmNlU1dTdGFydChoYWRjLT5JbnN0YW5jZSk7CisgIC8qIEdldCByZWxldmFudCByZWdpc3RlciBDRkdSIGluIEFEQyBpbnN0YW5jZSBvZiBBREMgbWFzdGVyIG9yIHNsYXZlICAqLworICAvKiBpbiBmdW5jdGlvbiBvZiBtdWx0aW1vZGUgc3RhdGUgKGZvciBkZXZpY2VzIHdpdGggbXVsdGltb2RlICAgICAgICAgKi8KKyAgLyogYXZhaWxhYmxlKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjaWYgZGVmaW5lZChBRENfTVVMVElNT0RFX1NVUFBPUlQpCisgIGlmICgoX19MTF9BRENfTVVMVElfSU5TVEFOQ0VfTUFTVEVSKGhhZGMtPkluc3RhbmNlKSA9PSBoYWRjLT5JbnN0YW5jZSkgfHwKKyAgICAgICh0bXBfbXVsdGltb2RlX2NvbmZpZyA9PSBMTF9BRENfTVVMVElfSU5ERVBFTkRFTlQpIHx8CisgICAgICAodG1wX211bHRpbW9kZV9jb25maWcgPT0gTExfQURDX01VTFRJX0RVQUxfUkVHX1NJTVVMVCkgfHwKKyAgICAgICh0bXBfbXVsdGltb2RlX2NvbmZpZyA9PSBMTF9BRENfTVVMVElfRFVBTF9SRUdfSU5URVJMKSkgeworICAgIHRtcF9jZmdyID0gUkVBRF9SRUcoaGFkYy0+SW5zdGFuY2UtPkNGR1IpOworICB9IGVsc2UgeworICAgIHRtcEFEQ19NYXN0ZXIgPSBfX0xMX0FEQ19NVUxUSV9JTlNUQU5DRV9NQVNURVIoaGFkYy0+SW5zdGFuY2UpOworICAgIHRtcF9jZmdyID0gUkVBRF9SRUcodG1wQURDX01hc3Rlci0+Q0ZHUik7CisgIH0KKyNlbHNlCisgIHRtcF9jZmdyID0gUkVBRF9SRUcoaGFkYy0+SW5zdGFuY2UtPkNGR1IpOworI2VuZGlmIC8qIEFEQ19NVUxUSU1PREVfU1VQUE9SVCAqLworCisgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSAqLworICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0lOSl9FT0MpOworCisgIC8qIERldGVybWluZSB3aGV0aGVyIGFueSBmdXJ0aGVyIGNvbnZlcnNpb24gdXBjb21pbmcgb24gZ3JvdXAgaW5qZWN0ZWQgICAgICAqLworICAvKiBieSBleHRlcm5hbCB0cmlnZ2VyIG9yIGJ5IGF1dG9tYXRpYyBpbmplY3RlZCBjb252ZXJzaW9uICAgICAgICAgICAgICAgICAgKi8KKyAgLyogZnJvbSBncm91cCByZWd1bGFyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIGlmICgodG1wX2FkY19pbmpfaXNfdHJpZ2dlcl9zb3VyY2Vfc3dfc3RhcnQgIT0gMFVMKSB8fAorICAgICAgKChSRUFEX0JJVCh0bXBfY2ZnciwgQURDX0NGR1JfSkFVVE8pID09IDBVTCkgJiYKKyAgICAgICAoKHRtcF9hZGNfcmVnX2lzX3RyaWdnZXJfc291cmNlX3N3X3N0YXJ0ICE9IDBVTCkgJiYKKyAgICAgICAgKFJFQURfQklUKHRtcF9jZmdyLCBBRENfQ0ZHUl9DT05UKSA9PSAwVUwpKSkpIHsKKyAgICAvKiBDaGVjayB3aGV0aGVyIGVuZCBvZiBzZXF1ZW5jZSBpcyByZWFjaGVkICovCisgICAgaWYgKF9fSEFMX0FEQ19HRVRfRkxBRyhoYWRjLCBBRENfRkxBR19KRU9TKSkgeworICAgICAgLyogUGFydGljdWxhciBjYXNlIGlmIGluamVjdGVkIGNvbnRleHRzIHF1ZXVlIGlzIGVuYWJsZWQ6ICAgICAgICAgICAgICovCisgICAgICAvKiB3aGVuIHRoZSBsYXN0IGNvbnRleHQgaGFzIGJlZW4gZnVsbHkgcHJvY2Vzc2VkLCBKU1FSIGlzIHJlc2V0ICAgICAgKi8KKyAgICAgIC8qIGJ5IHRoZSBoYXJkd2FyZS4gRXZlbiBpZiBubyBpbmplY3RlZCBjb252ZXJzaW9uIGlzIHBsYW5uZWQgdG8gY29tZSAqLworICAgICAgLyogKHF1ZXVlIGVtcHR5LCB0cmlnZ2VycyBhcmUgaWdub3JlZCksIGl0IGNhbiBzdGFydCBhZ2FpbiAgICAgICAgICAgICovCisgICAgICAvKiBpbW1lZGlhdGVseSBhZnRlciBzZXR0aW5nIGEgbmV3IGNvbnRleHQgKEpBRFNUQVJUIGlzIHN0aWxsIHNldCkuICAgKi8KKyAgICAgIC8qIFRoZXJlZm9yZSwgc3RhdGUgb2YgSEFMIEFEQyBpbmplY3RlZCBncm91cCBpcyBrZXB0IHRvIGJ1c3kuICAgICAgICAqLworICAgICAgaWYgKFJFQURfQklUKHRtcF9jZmdyLCBBRENfQ0ZHUl9KUU0pID09IDBVTCkgeworICAgICAgICAvKiBTZXQgQURDIHN0YXRlICovCisgICAgICAgIENMRUFSX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9JTkpfQlVTWSk7CisKKyAgICAgICAgaWYgKChoYWRjLT5TdGF0ZSAmIEhBTF9BRENfU1RBVEVfUkVHX0JVU1kpID09IDBVTCkgeworICAgICAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfUkVBRFkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogQ2xlYXIgcG9sbGVkIGZsYWcgKi8KKyAgaWYgKHRtcF9mbGFnX2VuZCA9PSBBRENfRkxBR19KRU9TKSB7CisgICAgLyogQ2xlYXIgZW5kIG9mIHNlcXVlbmNlIEpFT1MgZmxhZyBvZiBpbmplY3RlZCBncm91cCBpZiBsb3cgcG93ZXIgZmVhdHVyZSAqLworICAgIC8qICJMb3dQb3dlckF1dG9XYWl0ICIgaXMgZGlzYWJsZWQsIHRvIG5vdCBpbnRlcmZlcmUgd2l0aCB0aGlzIGZlYXR1cmUuICAgKi8KKyAgICAvKiBGb3IgaW5qZWN0ZWQgZ3JvdXBzLCBubyBuZXcgY29udmVyc2lvbiB3aWxsIHN0YXJ0IGJlZm9yZSBKRU9TIGlzICAgICAgICovCisgICAgLyogY2xlYXJlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmIChSRUFEX0JJVCh0bXBfY2ZnciwgQURDX0NGR1JfQVVURExZKSA9PSAwVUwpIHsKKyAgICAgIF9fSEFMX0FEQ19DTEVBUl9GTEFHKGhhZGMsIChBRENfRkxBR19KRU9DIHwgQURDX0ZMQUdfSkVPUykpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBfX0hBTF9BRENfQ0xFQVJfRkxBRyhoYWRjLCBBRENfRkxBR19KRU9DKTsKKyAgfQorCisgIC8qIFJldHVybiBBUEkgSEFMIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIEFEQywgc3RhcnQgY29udmVyc2lvbiBvZiBpbmplY3RlZCBncm91cCB3aXRoIGludGVycnVwdGlvbi4KKyAqIEBub3RlICAgSW50ZXJydXB0aW9ucyBlbmFibGVkIGluIHRoaXMgZnVuY3Rpb24gYWNjb3JkaW5nIHRvIGluaXRpYWxpemF0aW9uCisgKiAgICAgICAgIHNldHRpbmcgOiBKRU9DIChlbmQgb2YgY29udmVyc2lvbikgb3IgSkVPUyAoZW5kIG9mIHNlcXVlbmNlKQorICogQG5vdGUgICBDYXNlIG9mIG11bHRpbW9kZSBlbmFibGVkICh3aGVuIG11bHRpbW9kZSBmZWF0dXJlIGlzIGVuYWJsZWQpOgorICogICAgICAgICBIQUxfQURDRXhfSW5qZWN0ZWRTdGFydF9JVCgpIEFQSSBtdXN0IGJlIGNhbGxlZCBmb3IgQURDIHNsYXZlIGZpcnN0LAorICogICAgICAgICB0aGVuIGZvciBBREMgbWFzdGVyLgorICogICAgICAgICBGb3IgQURDIHNsYXZlLCBBREMgaXMgZW5hYmxlZCBvbmx5IChjb252ZXJzaW9uIGlzIG5vdCBzdGFydGVkKS4KKyAqICAgICAgICAgRm9yIEFEQyBtYXN0ZXIsIEFEQyBpcyBlbmFibGVkIGFuZCBtdWx0aW1vZGUgY29udmVyc2lvbiBpcyBzdGFydGVkLgorICogQHBhcmFtIGhhZGMgQURDIGhhbmRsZS4KKyAqIEByZXR2YWwgSEFMIHN0YXR1cy4KKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ0V4X0luamVjdGVkU3RhcnRfSVQoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpIHsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgdG1wX2hhbF9zdGF0dXM7CisgIHVpbnQzMl90IHRtcF9jb25maWdfaW5qZWN0ZWRfcXVldWU7CisjaWYgZGVmaW5lZChBRENfTVVMVElNT0RFX1NVUFBPUlQpCisgIHVpbnQzMl90IHRtcF9tdWx0aW1vZGVfY29uZmlnID0KKyAgICAgIExMX0FEQ19HZXRNdWx0aW1vZGUoX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7CisjZW5kaWYgLyogQURDX01VTFRJTU9ERV9TVVBQT1JUICovCisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKworICBpZiAoTExfQURDX0lOSl9Jc0NvbnZlcnNpb25PbmdvaW5nKGhhZGMtPkluc3RhbmNlKSAhPSAwVUwpIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0gZWxzZSB7CisgICAgLyogSW4gY2FzZSBvZiBzb2Z0d2FyZSB0cmlnZ2VyIGRldGVjdGlvbiBlbmFibGVkLCBKUURJUyBtdXN0IGJlIHNldAorICAgICAgKHdoaWNoIGNhbiBiZSBkb25lIG9ubHkgaWYgQURTVEFSVCBhbmQgSkFEU1RBUlQgYXJlIGJvdGggY2xlYXJlZCkuCisgICAgICAgSWYgSlFESVMgaXMgbm90IHNldCBhdCB0aGF0IHBvaW50LCByZXR1cm5zIGFuIGVycm9yCisgICAgICAgLSBzaW5jZSBzb2Z0d2FyZSB0cmlnZ2VyIGRldGVjdGlvbiBpcyBkaXNhYmxlZC4gVXNlciBuZWVkcyB0bworICAgICAgIHJlc29ydCB0byBIQUxfQURDRXhfRGlzYWJsZUluamVjdGVkUXVldWUoKSBBUEkgdG8gc2V0IEpRRElTLgorICAgICAgIC0gb3IgKGlmIEpRRElTIGlzIGludGVudGlvbmFsbHkgcmVzZXQpIHNpbmNlIEpFWFRFTiA9IDAgd2hpY2ggbWVhbnMKKyAgICAgICAgIHRoZSBxdWV1ZSBpcyBlbXB0eSAqLworICAgIHRtcF9jb25maWdfaW5qZWN0ZWRfcXVldWUgPSBSRUFEX0JJVChoYWRjLT5JbnN0YW5jZS0+Q0ZHUiwgQURDX0NGR1JfSlFESVMpOworCisgICAgaWYgKChSRUFEX0JJVChoYWRjLT5JbnN0YW5jZS0+SlNRUiwgQURDX0pTUVJfSkVYVEVOKSA9PSAwVUwpICYmCisgICAgICAgICh0bXBfY29uZmlnX2luamVjdGVkX3F1ZXVlID09IDBVTCkpIHsKKyAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfRVJST1JfQ09ORklHKTsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhhZGMpOworCisgICAgLyogRW5hYmxlIHRoZSBBREMgcGVyaXBoZXJhbCAqLworICAgIHRtcF9oYWxfc3RhdHVzID0gQURDX0VuYWJsZShoYWRjKTsKKworICAgIC8qIFN0YXJ0IGNvbnZlcnNpb24gaWYgQURDIGlzIGVmZmVjdGl2ZWx5IGVuYWJsZWQgKi8KKyAgICBpZiAodG1wX2hhbF9zdGF0dXMgPT0gSEFMX09LKSB7CisgICAgICAvKiBDaGVjayBpZiBhIHJlZ3VsYXIgY29udmVyc2lvbiBpcyBvbmdvaW5nICovCisgICAgICBpZiAoKGhhZGMtPlN0YXRlICYgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSkgIT0gMFVMKSB7CisgICAgICAgIC8qIFJlc2V0IEFEQyBlcnJvciBjb2RlIGZpZWxkIHJlbGF0ZWQgdG8gaW5qZWN0ZWQgY29udmVyc2lvbnMgb25seSAqLworICAgICAgICBDTEVBUl9CSVQoaGFkYy0+RXJyb3JDb2RlLCBIQUxfQURDX0VSUk9SX0pRT1ZGKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFNldCBBREMgZXJyb3IgY29kZSB0byBub25lICovCisgICAgICAgIEFEQ19DTEVBUl9FUlJPUkNPREUoaGFkYyk7CisgICAgICB9CisKKyAgICAgIC8qIFNldCBBREMgc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiAtIENsZWFyIHN0YXRlIGJpdGZpZWxkIHJlbGF0ZWQgdG8gaW5qZWN0ZWQgZ3JvdXAgY29udmVyc2lvbiByZXN1bHRzICAqLworICAgICAgLyogLSBTZXQgc3RhdGUgYml0ZmllbGQgcmVsYXRlZCB0byBpbmplY3RlZCBvcGVyYXRpb24gICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIEFEQ19TVEFURV9DTFJfU0VUKGhhZGMtPlN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUFEWSB8IEhBTF9BRENfU1RBVEVfSU5KX0VPQywKKyAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfSU5KX0JVU1kpOworCisjaWYgZGVmaW5lZChBRENfTVVMVElNT0RFX1NVUFBPUlQpCisgICAgICAvKiBSZXNldCBIQUxfQURDX1NUQVRFX01VTFRJTU9ERV9TTEFWRSBiaXQKKyAgICAgICAgLSBpZiBBREMgaW5zdGFuY2UgaXMgbWFzdGVyIG9yIGlmIG11bHRpbW9kZSBmZWF0dXJlIGlzIG5vdCBhdmFpbGFibGUKKyAgICAgICAgLSBpZiBtdWx0aW1vZGUgc2V0dGluZyBpcyBkaXNhYmxlZCAoQURDIGluc3RhbmNlIHNsYXZlIGluIGluZGVwZW5kZW50CisgICAgICAgIG1vZGUpICovCisgICAgICBpZiAoKF9fTExfQURDX01VTFRJX0lOU1RBTkNFX01BU1RFUihoYWRjLT5JbnN0YW5jZSkgPT0gaGFkYy0+SW5zdGFuY2UpIHx8CisgICAgICAgICAgKHRtcF9tdWx0aW1vZGVfY29uZmlnID09IExMX0FEQ19NVUxUSV9JTkRFUEVOREVOVCkpIHsKKyAgICAgICAgQ0xFQVJfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX01VTFRJTU9ERV9TTEFWRSk7CisgICAgICB9CisjZW5kaWYgLyogQURDX01VTFRJTU9ERV9TVVBQT1JUICovCisKKyAgICAgIC8qIENsZWFyIEFEQyBncm91cCBpbmplY3RlZCBncm91cCBjb252ZXJzaW9uIGZsYWcgKi8KKyAgICAgIC8qIChUbyBlbnN1cmUgb2Ygbm8gdW5rbm93biBzdGF0ZSBmcm9tIHBvdGVudGlhbCBwcmV2aW91cyBBREMgb3BlcmF0aW9ucykKKyAgICAgICAqLworICAgICAgX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgKEFEQ19GTEFHX0pFT0MgfCBBRENfRkxBR19KRU9TKSk7CisKKyAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgIC8qIFVubG9jayBiZWZvcmUgc3RhcnRpbmcgQURDIGNvbnZlcnNpb25zOiBpbiBjYXNlIG9mIHBvdGVudGlhbCAgICAgICAgICovCisgICAgICAvKiBpbnRlcnJ1cHRpb24sIHRvIGxldCB0aGUgcHJvY2VzcyB0byBBREMgSVJRIEhhbmRsZXIuICAgICAgICAgICAgICAgICAqLworICAgICAgX19IQUxfVU5MT0NLKGhhZGMpOworCisgICAgICAvKiBFbmFibGUgQURDIEluamVjdGVkIGNvbnRleHQgcXVldWUgb3ZlcmZsb3cgaW50ZXJydXB0IGlmIHRoaXMgZmVhdHVyZSAqLworICAgICAgLyogaXMgZW5hYmxlZC4gKi8KKyAgICAgIGlmICgoaGFkYy0+SW5zdGFuY2UtPkNGR1IgJiBBRENfQ0ZHUl9KUU0pICE9IDBVTCkgeworICAgICAgICBfX0hBTF9BRENfRU5BQkxFX0lUKGhhZGMsIEFEQ19GTEFHX0pRT1ZGKTsKKyAgICAgIH0KKworICAgICAgLyogRW5hYmxlIEFEQyBlbmQgb2YgY29udmVyc2lvbiBpbnRlcnJ1cHQgKi8KKyAgICAgIHN3aXRjaCAoaGFkYy0+SW5pdC5FT0NTZWxlY3Rpb24pIHsKKyAgICAgICAgY2FzZSBBRENfRU9DX1NFUV9DT05WOgorICAgICAgICAgIF9fSEFMX0FEQ19ESVNBQkxFX0lUKGhhZGMsIEFEQ19JVF9KRU9DKTsKKyAgICAgICAgICBfX0hBTF9BRENfRU5BQkxFX0lUKGhhZGMsIEFEQ19JVF9KRU9TKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgLyogY2FzZSBBRENfRU9DX1NJTkdMRV9DT05WICovCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgX19IQUxfQURDX0RJU0FCTEVfSVQoaGFkYywgQURDX0lUX0pFT1MpOworICAgICAgICAgIF9fSEFMX0FEQ19FTkFCTEVfSVQoaGFkYywgQURDX0lUX0pFT0MpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAgIC8qIEVuYWJsZSBjb252ZXJzaW9uIG9mIGluamVjdGVkIGdyb3VwLCBpZiBhdXRvbWF0aWMgaW5qZWN0ZWQgY29udmVyc2lvbgorICAgICAgICAgKi8KKyAgICAgICAgLyogaXMgZGlzYWJsZWQuICovCisgICAgICAgIC8qIElmIHNvZnR3YXJlIHN0YXJ0IGhhcyBiZWVuIHNlbGVjdGVkLCBjb252ZXJzaW9uIHN0YXJ0cyBpbW1lZGlhdGVseS4KKyAgICAgICAgICovCisgICAgICAgIC8qIElmIGV4dGVybmFsIHRyaWdnZXIgaGFzIGJlZW4gc2VsZWN0ZWQsIGNvbnZlcnNpb24gd2lsbCBzdGFydCBhdCBuZXh0CisgICAgICAgICAqLworICAgICAgICAvKiB0cmlnZ2VyIGV2ZW50LiAqLworICAgICAgICAvKiBDYXNlIG9mIG11bHRpbW9kZSBlbmFibGVkICh3aGVuIG11bHRpbW9kZSBmZWF0dXJlIGlzIGF2YWlsYWJsZSk6ICovCisgICAgICAgIC8qIGlmIEFEQyBpcyBzbGF2ZSwgKi8KKyAgICAgICAgLyogICAgLSBBREMgaXMgZW5hYmxlZCBvbmx5IChjb252ZXJzaW9uIGlzIG5vdCBzdGFydGVkKSwgKi8KKyAgICAgICAgLyogICAgLSBpZiBtdWx0aW1vZGUgb25seSBjb25jZXJucyByZWd1bGFyIGNvbnZlcnNpb24sIEFEQyBpcyBlbmFibGVkICovCisgICAgICAgIC8qICAgICBhbmQgY29udmVyc2lvbiBpcyBzdGFydGVkLiAqLworICAgICAgICAvKiBJZiBBREMgaXMgbWFzdGVyIG9yIGluZGVwZW5kZW50LCAqLworICAgICAgICAvKiAgICAtIEFEQyBpcyBlbmFibGVkIGFuZCBjb252ZXJzaW9uIGlzIHN0YXJ0ZWQuICovCisjaWYgZGVmaW5lZChBRENfTVVMVElNT0RFX1NVUFBPUlQpCisgICAgICBpZiAoKF9fTExfQURDX01VTFRJX0lOU1RBTkNFX01BU1RFUihoYWRjLT5JbnN0YW5jZSkgPT0gaGFkYy0+SW5zdGFuY2UpIHx8CisgICAgICAgICAgKHRtcF9tdWx0aW1vZGVfY29uZmlnID09IExMX0FEQ19NVUxUSV9JTkRFUEVOREVOVCkgfHwKKyAgICAgICAgICAodG1wX211bHRpbW9kZV9jb25maWcgPT0gTExfQURDX01VTFRJX0RVQUxfUkVHX1NJTVVMVCkgfHwKKyAgICAgICAgICAodG1wX211bHRpbW9kZV9jb25maWcgPT0gTExfQURDX01VTFRJX0RVQUxfUkVHX0lOVEVSTCkpIHsKKyAgICAgICAgLyogQURDIGluc3RhbmNlIGlzIG5vdCBhIG11bHRpbW9kZSBzbGF2ZSBpbnN0YW5jZSB3aXRoIG11bHRpbW9kZQorICAgICAgICAgKiBpbmplY3RlZCBjb252ZXJzaW9ucyBlbmFibGVkICovCisgICAgICAgIGlmIChMTF9BRENfSU5KX0dldFRyaWdBdXRvKGhhZGMtPkluc3RhbmNlKSA9PQorICAgICAgICAgICAgTExfQURDX0lOSl9UUklHX0lOREVQRU5ERU5UKSB7CisgICAgICAgICAgTExfQURDX0lOSl9TdGFydENvbnZlcnNpb24oaGFkYy0+SW5zdGFuY2UpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBBREMgaW5zdGFuY2UgaXMgbm90IGEgbXVsdGltb2RlIHNsYXZlIGluc3RhbmNlIHdpdGggbXVsdGltb2RlCisgICAgICAgICAqIGluamVjdGVkIGNvbnZlcnNpb25zIGVuYWJsZWQgKi8KKyAgICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9NVUxUSU1PREVfU0xBVkUpOworICAgICAgfQorI2Vsc2UKKyAgICAgIGlmIChMTF9BRENfSU5KX0dldFRyaWdBdXRvKGhhZGMtPkluc3RhbmNlKSA9PQorICAgICAgICAgIExMX0FEQ19JTkpfVFJJR19JTkRFUEVOREVOVCkgeworICAgICAgICAvKiBTdGFydCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiAqLworICAgICAgICBMTF9BRENfSU5KX1N0YXJ0Q29udmVyc2lvbihoYWRjLT5JbnN0YW5jZSk7CisgICAgICB9CisjZW5kaWYgLyogQURDX01VTFRJTU9ERV9TVVBQT1JUICovCisKKyAgICB9IGVsc2UgeworICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhhZGMpOworICAgIH0KKworICAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgICByZXR1cm4gdG1wX2hhbF9zdGF0dXM7CisgIH0KK30KKworLyoqCisgKiBAYnJpZWYgIFN0b3AgY29udmVyc2lvbiBvZiBpbmplY3RlZCBjaGFubmVscywgZGlzYWJsZSBpbnRlcnJ1cHRpb24gb2YKKyAqICAgICAgICAgZW5kLW9mLWNvbnZlcnNpb24uIERpc2FibGUgQURDIHBlcmlwaGVyYWwgaWYgbm8gcmVndWxhciBjb252ZXJzaW9uCisgKiAgICAgICAgIGlzIG9uIGdvaW5nLgorICogQG5vdGUgICBJZiBBREMgbXVzdCBiZSBkaXNhYmxlZCBhbmQgaWYgY29udmVyc2lvbiBpcyBvbiBnb2luZyBvbgorICogICAgICAgICByZWd1bGFyIGdyb3VwLCBmdW5jdGlvbiBIQUxfQURDX1N0b3AgbXVzdCBiZSB1c2VkIHRvIHN0b3AgYm90aAorICogICAgICAgICBpbmplY3RlZCBhbmQgcmVndWxhciBncm91cHMsIGFuZCBkaXNhYmxlIHRoZSBBREMuCisgKiBAbm90ZSAgIElmIGluamVjdGVkIGdyb3VwIG1vZGUgYXV0by1pbmplY3Rpb24gaXMgZW5hYmxlZCwKKyAqICAgICAgICAgZnVuY3Rpb24gSEFMX0FEQ19TdG9wIG11c3QgYmUgdXNlZC4KKyAqIEBub3RlICAgQ2FzZSBvZiBtdWx0aW1vZGUgZW5hYmxlZCAod2hlbiBtdWx0aW1vZGUgZmVhdHVyZSBpcyBhdmFpbGFibGUpOgorICogICAgICAgICBIQUxfQURDRXhfSW5qZWN0ZWRTdG9wX0lUKCkgQVBJIG11c3QgYmUgY2FsbGVkIGZvciBBREMgbWFzdGVyIGZpcnN0LAorICogICAgICAgICB0aGVuIGZvciBBREMgc2xhdmUuCisgKiAgICAgICAgIEZvciBBREMgbWFzdGVyLCBjb252ZXJzaW9uIGlzIHN0b3BwZWQgYW5kIEFEQyBpcyBkaXNhYmxlZC4KKyAqICAgICAgICAgRm9yIEFEQyBzbGF2ZSwgQURDIGlzIGRpc2FibGVkIG9ubHkgKGNvbnZlcnNpb24gc3RvcCBvZiBBREMgbWFzdGVyCisgKiAgICAgICAgIGhhcyBhbHJlYWR5IHN0b3BwZWQgY29udmVyc2lvbiBvZiBBREMgc2xhdmUpLgorICogQG5vdGUgICBJbiBjYXNlIG9mIGF1dG8taW5qZWN0aW9uIG1vZGUsIEhBTF9BRENfU3RvcCgpIG11c3QgYmUgdXNlZC4KKyAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUKKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDRXhfSW5qZWN0ZWRTdG9wX0lUKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKSB7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHRtcF9oYWxfc3RhdHVzOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoYWRjKTsKKworICAvKiAxLiBTdG9wIHBvdGVudGlhbCBjb252ZXJzaW9uIG9uIGdvaW5nIG9uIGluamVjdGVkIGdyb3VwIG9ubHkuICovCisgIHRtcF9oYWxfc3RhdHVzID0gQURDX0NvbnZlcnNpb25TdG9wKGhhZGMsIEFEQ19JTkpFQ1RFRF9HUk9VUCk7CisKKyAgLyogRGlzYWJsZSBBREMgcGVyaXBoZXJhbCBpZiBpbmplY3RlZCBjb252ZXJzaW9ucyBhcmUgZWZmZWN0aXZlbHkgc3RvcHBlZCAgICovCisgIC8qIGFuZCBpZiBubyBjb252ZXJzaW9uIG9uIHRoZSBvdGhlciBncm91cCAocmVndWxhciBncm91cCkgaXMgaW50ZW5kZWQgdG8gICAqLworICAvKiBjb250aW51ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaWYgKHRtcF9oYWxfc3RhdHVzID09IEhBTF9PSykgeworICAgIC8qIERpc2FibGUgQURDIGVuZCBvZiBjb252ZXJzaW9uIGludGVycnVwdCBmb3IgaW5qZWN0ZWQgY2hhbm5lbHMgKi8KKyAgICBfX0hBTF9BRENfRElTQUJMRV9JVChoYWRjLCAoQURDX0lUX0pFT0MgfCBBRENfSVRfSkVPUyB8IEFEQ19GTEFHX0pRT1ZGKSk7CisKKyAgICBpZiAoTExfQURDX1JFR19Jc0NvbnZlcnNpb25PbmdvaW5nKGhhZGMtPkluc3RhbmNlKSA9PSAwVUwpIHsKKyAgICAgIC8qIDIuIERpc2FibGUgdGhlIEFEQyBwZXJpcGhlcmFsICovCisgICAgICB0bXBfaGFsX3N0YXR1cyA9IEFEQ19EaXNhYmxlKGhhZGMpOworCisgICAgICAvKiBDaGVjayBpZiBBREMgaXMgZWZmZWN0aXZlbHkgZGlzYWJsZWQgKi8KKyAgICAgIGlmICh0bXBfaGFsX3N0YXR1cyA9PSBIQUxfT0spIHsKKyAgICAgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgICAgICBBRENfU1RBVEVfQ0xSX1NFVChoYWRjLT5TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSB8IEhBTF9BRENfU1RBVEVfSU5KX0JVU1ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVBRFkpOworICAgICAgfQorICAgIH0KKyAgICAvKiBDb252ZXJzaW9uIG9uIGluamVjdGVkIGdyb3VwIGlzIHN0b3BwZWQsIGJ1dCBBREMgbm90IGRpc2FibGVkIHNpbmNlICAgICovCisgICAgLyogY29udmVyc2lvbiBvbiByZWd1bGFyIGdyb3VwIGlzIHN0aWxsIHJ1bm5pbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGVsc2UgeworICAgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgICAgQ0xFQVJfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0lOSl9CVVNZKTsKKyAgICB9CisgIH0KKworICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoYWRjKTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiB0bXBfaGFsX3N0YXR1czsKK30KKworI2lmIGRlZmluZWQoQURDX01VTFRJTU9ERV9TVVBQT1JUKQorLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBBREMsIHN0YXJ0IE11bHRpTW9kZSBjb252ZXJzaW9uIGFuZCB0cmFuc2ZlciByZWd1bGFyIHJlc3VsdHMKKyAqIHRocm91Z2ggRE1BLgorICogQG5vdGUgICBNdWx0aW1vZGUgbXVzdCBoYXZlIGJlZW4gcHJldmlvdXNseSBjb25maWd1cmVkIHVzaW5nCisgKiAgICAgICAgIEhBTF9BRENFeF9NdWx0aU1vZGVDb25maWdDaGFubmVsKCkgZnVuY3Rpb24uCisgKiAgICAgICAgIEludGVycnVwdGlvbnMgZW5hYmxlZCBpbiB0aGlzIGZ1bmN0aW9uOgorICogICAgICAgICAgb3ZlcnJ1biwgRE1BIGhhbGYgdHJhbnNmZXIsIERNQSB0cmFuc2ZlciBjb21wbGV0ZS4KKyAqICAgICAgICAgRWFjaCBvZiB0aGVzZSBpbnRlcnJ1cHRpb25zIGhhcyBpdHMgZGVkaWNhdGVkIGNhbGxiYWNrIGZ1bmN0aW9uLgorICogQG5vdGUgICBTdGF0ZSBmaWVsZCBvZiBTbGF2ZSBBREMgaGFuZGxlIGlzIG5vdCB1cGRhdGVkIGluIHRoaXMgY29uZmlndXJhdGlvbjoKKyAqICAgICAgICAgIHVzZXIgc2hvdWxkIG5vdCByZWx5IG9uIGl0IGZvciBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIFNsYXZlIHJlZ3VsYXIKKyAqICAgICAgICAgY29udmVyc2lvbnMuCisgKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlIG9mIEFEQyBtYXN0ZXIgKGhhbmRsZSBvZiBBREMgc2xhdmUgbXVzdCBub3QgYmUgdXNlZCkKKyAqIEBwYXJhbSBwRGF0YSBEZXN0aW5hdGlvbiBCdWZmZXIgYWRkcmVzcy4KKyAqIEBwYXJhbSBMZW5ndGggTGVuZ3RoIG9mIGRhdGEgdG8gYmUgdHJhbnNmZXJyZWQgZnJvbSBBREMgcGVyaXBoZXJhbCB0byBtZW1vcnkKKyAqIChpbiBieXRlcykuCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ0V4X011bHRpTW9kZVN0YXJ0X0RNQShBRENfSGFuZGxlVHlwZURlZiAqaGFkYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBMZW5ndGgpIHsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgdG1wX2hhbF9zdGF0dXM7CisgIEFEQ19IYW5kbGVUeXBlRGVmIHRtcF9oYWRjX3NsYXZlOworICBBRENfQ29tbW9uX1R5cGVEZWYgKnRtcEFEQ19Db21tb247CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19NVUxUSU1PREVfTUFTVEVSX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKGhhZGMtPkluaXQuQ29udGludW91c0NvbnZNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19BRENfRVhUVFJJR19FREdFKGhhZGMtPkluaXQuRXh0ZXJuYWxUcmlnQ29udkVkZ2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoaGFkYy0+SW5pdC5ETUFDb250aW51b3VzUmVxdWVzdHMpKTsKKworICBpZiAoTExfQURDX1JFR19Jc0NvbnZlcnNpb25PbmdvaW5nKGhhZGMtPkluc3RhbmNlKSAhPSAwVUwpIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0gZWxzZSB7CisgICAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhhZGMpOworCisgICAgLyogVGVtcG9yYXJ5IGhhbmRsZSBtaW5pbXVtIGluaXRpYWxpemF0aW9uICovCisgICAgX19IQUxfQURDX1JFU0VUX0hBTkRMRV9TVEFURSgmdG1wX2hhZGNfc2xhdmUpOworICAgIEFEQ19DTEVBUl9FUlJPUkNPREUoJnRtcF9oYWRjX3NsYXZlKTsKKworICAgIC8qIFNldCBhIHRlbXBvcmFyeSBoYW5kbGUgb2YgdGhlIEFEQyBzbGF2ZSBhc3NvY2lhdGVkIHRvIHRoZSBBREMgbWFzdGVyICAgKi8KKyAgICBBRENfTVVMVElfU0xBVkUoaGFkYywgJnRtcF9oYWRjX3NsYXZlKTsKKworICAgIGlmICh0bXBfaGFkY19zbGF2ZS5JbnN0YW5jZSA9PSBOVUxMKSB7CisgICAgICAvKiBTZXQgQURDIHN0YXRlICovCisgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0VSUk9SX0NPTkZJRyk7CisKKyAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoYWRjKTsKKworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBFbmFibGUgdGhlIEFEQyBwZXJpcGhlcmFsczogbWFzdGVyIGFuZCBzbGF2ZSAoaW4gY2FzZSBpZiBub3QgYWxyZWFkeSAgICovCisgICAgLyogZW5hYmxlZCBwcmV2aW91c2x5KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHRtcF9oYWxfc3RhdHVzID0gQURDX0VuYWJsZShoYWRjKTsKKyAgICBpZiAodG1wX2hhbF9zdGF0dXMgPT0gSEFMX09LKSB7CisgICAgICB0bXBfaGFsX3N0YXR1cyA9IEFEQ19FbmFibGUoJnRtcF9oYWRjX3NsYXZlKTsKKyAgICB9CisKKyAgICAvKiBTdGFydCBtdWx0aW1vZGUgY29udmVyc2lvbiBvZiBBRENzIHBhaXIgKi8KKyAgICBpZiAodG1wX2hhbF9zdGF0dXMgPT0gSEFMX09LKSB7CisgICAgICAvKiBTZXQgQURDIHN0YXRlICovCisgICAgICBBRENfU1RBVEVfQ0xSX1NFVChoYWRjLT5TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChIQUxfQURDX1NUQVRFX1JFQURZIHwgSEFMX0FEQ19TVEFURV9SRUdfRU9DIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFR19PVlIgfCBIQUxfQURDX1NUQVRFX1JFR19FT1NNUCksCisgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFR19CVVNZKTsKKworICAgICAgLyogU2V0IEFEQyBlcnJvciBjb2RlIHRvIG5vbmUgKi8KKyAgICAgIEFEQ19DTEVBUl9FUlJPUkNPREUoaGFkYyk7CisKKyAgICAgIC8qIFNldCB0aGUgRE1BIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgICBoYWRjLT5ETUFfSGFuZGxlLT5YZmVyQ3BsdENhbGxiYWNrID0gQURDX0RNQUNvbnZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIERNQSBoYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgICBoYWRjLT5ETUFfSGFuZGxlLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IEFEQ19ETUFIYWxmQ29udkNwbHQ7CisKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBoYWRjLT5ETUFfSGFuZGxlLT5YZmVyRXJyb3JDYWxsYmFjayA9IEFEQ19ETUFFcnJvcjsKKworICAgICAgLyogUG9pbnRlciB0byB0aGUgY29tbW9uIGNvbnRyb2wgcmVnaXN0ZXIgICovCisgICAgICB0bXBBRENfQ29tbW9uID0gX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKTsKKworICAgICAgLyogTWFuYWdlIEFEQyBhbmQgRE1BIHN0YXJ0OiBBREMgb3ZlcnJ1biBpbnRlcnJ1cHRpb24sIERNQSBzdGFydCwgQURDICovCisgICAgICAvKiBzdGFydCAoaW4gY2FzZSBvZiBTVyBzdGFydCk6ICovCisKKyAgICAgIC8qIENsZWFyIHJlZ3VsYXIgZ3JvdXAgY29udmVyc2lvbiBmbGFnIGFuZCBvdmVycnVuIGZsYWcgKi8KKyAgICAgIC8qIChUbyBlbnN1cmUgb2Ygbm8gdW5rbm93biBzdGF0ZSBmcm9tIHBvdGVudGlhbCBwcmV2aW91cyBBREMgb3BlcmF0aW9ucykKKyAgICAgICAqLworICAgICAgX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgKEFEQ19GTEFHX0VPQyB8IEFEQ19GTEFHX0VPUyB8IEFEQ19GTEFHX09WUikpOworCisgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICAvKiBVbmxvY2sgYmVmb3JlIHN0YXJ0aW5nIEFEQyBjb252ZXJzaW9uczogaW4gY2FzZSBvZiBwb3RlbnRpYWwgICAgICAgICAqLworICAgICAgLyogaW50ZXJydXB0aW9uLCB0byBsZXQgdGhlIHByb2Nlc3MgdG8gQURDIElSUSBIYW5kbGVyLiAgICAgICAgICAgICAgICAgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoYWRjKTsKKworICAgICAgLyogRW5hYmxlIEFEQyBvdmVycnVuIGludGVycnVwdCAqLworICAgICAgX19IQUxfQURDX0VOQUJMRV9JVChoYWRjLCBBRENfSVRfT1ZSKTsKKworICAgICAgLyogU3RhcnQgdGhlIERNQSBjaGFubmVsICovCisgICAgICB0bXBfaGFsX3N0YXR1cyA9CisgICAgICAgICAgSEFMX0RNQV9TdGFydF9JVChoYWRjLT5ETUFfSGFuZGxlLCAodWludDMyX3QpJnRtcEFEQ19Db21tb24tPkNEUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdClwRGF0YSwgTGVuZ3RoKTsKKworICAgICAgLyogRW5hYmxlIGNvbnZlcnNpb24gb2YgcmVndWxhciBncm91cC4gKi8KKyAgICAgIC8qIElmIHNvZnR3YXJlIHN0YXJ0IGhhcyBiZWVuIHNlbGVjdGVkLCBjb252ZXJzaW9uIHN0YXJ0cyBpbW1lZGlhdGVseS4gKi8KKyAgICAgIC8qIElmIGV4dGVybmFsIHRyaWdnZXIgaGFzIGJlZW4gc2VsZWN0ZWQsIGNvbnZlcnNpb24gd2lsbCBzdGFydCBhdCBuZXh0ICovCisgICAgICAvKiB0cmlnZ2VyIGV2ZW50LiAqLworICAgICAgLyogU3RhcnQgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiAqLworICAgICAgTExfQURDX1JFR19TdGFydENvbnZlcnNpb24oaGFkYy0+SW5zdGFuY2UpOworICAgIH0gZWxzZSB7CisgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGFkYyk7CisgICAgfQorCisgICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICAgIHJldHVybiB0bXBfaGFsX3N0YXR1czsKKyAgfQorfQorCisvKioKKyAqIEBicmllZiAgU3RvcCBtdWx0aW1vZGUgQURDIGNvbnZlcnNpb24sIGRpc2FibGUgQURDIERNQSB0cmFuc2ZlciwgZGlzYWJsZSBBREMKKyAqIHBlcmlwaGVyYWwuCisgKiBAbm90ZSAgIE11bHRpbW9kZSBpcyBrZXB0IGVuYWJsZWQgYWZ0ZXIgdGhpcyBmdW5jdGlvbi4gTXVsdGlNb2RlIERNQSBiaXRzCisgKiAgICAgICAgIChNRE1BIGFuZCBETUFDRkcgYml0cyBvZiBjb21tb24gQ0NSIHJlZ2lzdGVyKSBhcmUgbWFpbnRhaW5lZC4gVG8KKyAqIGRpc2FibGUgTXVsdGltb2RlIChzZXQgd2l0aCBIQUxfQURDRXhfTXVsdGlNb2RlQ29uZmlnQ2hhbm5lbCgpKSwgQURDIG11c3QgYmUKKyAqICAgICAgICAgcmVpbml0aWFsaXplZCB1c2luZyBIQUxfQURDX0luaXQoKSBvciBIQUxfQURDX0RlSW5pdCgpLCBvciB0aGUgdXNlcgorICogY2FuIHJlc29ydCB0byBIQUxfQURDRXhfRGlzYWJsZU11bHRpTW9kZSgpIEFQSS4KKyAqIEBub3RlICAgSW4gY2FzZSBvZiBETUEgY29uZmlndXJlZCBpbiBjaXJjdWxhciBtb2RlLCBmdW5jdGlvbgorICogICAgICAgICBIQUxfQURDX1N0b3BfRE1BKCkgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhpcyBmdW5jdGlvbiB3aXRoIGhhbmRsZSBvZgorICogICAgICAgICBBREMgc2xhdmUsIHRvIHByb3Blcmx5IGRpc2FibGUgdGhlIERNQSBjaGFubmVsLgorICogQHBhcmFtIGhhZGMgQURDIGhhbmRsZSBvZiBBREMgbWFzdGVyIChoYW5kbGUgb2YgQURDIHNsYXZlIG11c3Qgbm90IGJlIHVzZWQpCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ0V4X011bHRpTW9kZVN0b3BfRE1BKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKSB7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHRtcF9oYWxfc3RhdHVzOworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisgIEFEQ19IYW5kbGVUeXBlRGVmIHRtcF9oYWRjX3NsYXZlOworICB1aW50MzJfdCB0bXBfaGFkY19zbGF2ZV9jb252ZXJzaW9uX29uX2dvaW5nOworICBIQUxfU3RhdHVzVHlwZURlZiB0bXBfaGFkY19zbGF2ZV9kaXNhYmxlX3N0YXR1czsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX01VTFRJTU9ERV9NQVNURVJfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhhZGMpOworCisgIC8qIDEuIFN0b3AgcG90ZW50aWFsIG11bHRpbW9kZSBjb252ZXJzaW9uIG9uIGdvaW5nLCBvbiByZWd1bGFyIGFuZCBpbmplY3RlZAorICAgKiBncm91cHMgKi8KKyAgdG1wX2hhbF9zdGF0dXMgPSBBRENfQ29udmVyc2lvblN0b3AoaGFkYywgQURDX1JFR1VMQVJfSU5KRUNURURfR1JPVVApOworCisgIC8qIERpc2FibGUgQURDIHBlcmlwaGVyYWwgaWYgY29udmVyc2lvbnMgYXJlIGVmZmVjdGl2ZWx5IHN0b3BwZWQgKi8KKyAgaWYgKHRtcF9oYWxfc3RhdHVzID09IEhBTF9PSykgeworICAgIC8qIFRlbXBvcmFyeSBoYW5kbGUgbWluaW11bSBpbml0aWFsaXphdGlvbiAqLworICAgIF9fSEFMX0FEQ19SRVNFVF9IQU5ETEVfU1RBVEUoJnRtcF9oYWRjX3NsYXZlKTsKKyAgICBBRENfQ0xFQVJfRVJST1JDT0RFKCZ0bXBfaGFkY19zbGF2ZSk7CisKKyAgICAvKiBTZXQgYSB0ZW1wb3JhcnkgaGFuZGxlIG9mIHRoZSBBREMgc2xhdmUgYXNzb2NpYXRlZCB0byB0aGUgQURDIG1hc3RlciAgICovCisgICAgQURDX01VTFRJX1NMQVZFKGhhZGMsICZ0bXBfaGFkY19zbGF2ZSk7CisKKyAgICBpZiAodG1wX2hhZGNfc2xhdmUuSW5zdGFuY2UgPT0gTlVMTCkgeworICAgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lIHRvIGVycm9yICovCisgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0VSUk9SX0NPTkZJRyk7CisKKyAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoYWRjKTsKKworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBQcm9jZWR1cmUgdG8gZGlzYWJsZSB0aGUgQURDIHBlcmlwaGVyYWw6IHdhaXQgZm9yIGNvbnZlcnNpb25zICAgICAgICAgICovCisgICAgLyogZWZmZWN0aXZlbHkgc3RvcHBlZCAoQURDIG1hc3RlciBhbmQgQURDIHNsYXZlKSwgdGhlbiBkaXNhYmxlIEFEQyAgICAgICAqLworCisgICAgLyogMS4gV2FpdCBmb3IgQURDIGNvbnZlcnNpb24gY29tcGxldGlvbiBmb3IgQURDIG1hc3RlciBhbmQgQURDIHNsYXZlICovCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgIHRtcF9oYWRjX3NsYXZlX2NvbnZlcnNpb25fb25fZ29pbmcgPQorICAgICAgICBMTF9BRENfUkVHX0lzQ29udmVyc2lvbk9uZ29pbmcoKCZ0bXBfaGFkY19zbGF2ZSktPkluc3RhbmNlKTsKKyAgICB3aGlsZSAoKExMX0FEQ19SRUdfSXNDb252ZXJzaW9uT25nb2luZyhoYWRjLT5JbnN0YW5jZSkgPT0gMVVMKSB8fAorICAgICAgICAgICAodG1wX2hhZGNfc2xhdmVfY29udmVyc2lvbl9vbl9nb2luZyA9PSAxVUwpKSB7CisgICAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gQURDX1NUT1BfQ09OVkVSU0lPTl9USU1FT1VUKSB7CisgICAgICAgIC8qIE5ldyBjaGVjayB0byBhdm9pZCBmYWxzZSB0aW1lb3V0IGRldGVjdGlvbiBpbiBjYXNlIG9mIHByZWVtcHRpb24gKi8KKyAgICAgICAgdG1wX2hhZGNfc2xhdmVfY29udmVyc2lvbl9vbl9nb2luZyA9CisgICAgICAgICAgICBMTF9BRENfUkVHX0lzQ29udmVyc2lvbk9uZ29pbmcoKCZ0bXBfaGFkY19zbGF2ZSktPkluc3RhbmNlKTsKKyAgICAgICAgaWYgKChMTF9BRENfUkVHX0lzQ29udmVyc2lvbk9uZ29pbmcoaGFkYy0+SW5zdGFuY2UpID09IDFVTCkgfHwKKyAgICAgICAgICAgICh0bXBfaGFkY19zbGF2ZV9jb252ZXJzaW9uX29uX2dvaW5nID09IDFVTCkpIHsKKyAgICAgICAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gZXJyb3IgKi8KKyAgICAgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0VSUk9SX0lOVEVSTkFMKTsKKworICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgICBfX0hBTF9VTkxPQ0soaGFkYyk7CisKKyAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHRtcF9oYWRjX3NsYXZlX2NvbnZlcnNpb25fb25fZ29pbmcgPQorICAgICAgICAgIExMX0FEQ19SRUdfSXNDb252ZXJzaW9uT25nb2luZygoJnRtcF9oYWRjX3NsYXZlKS0+SW5zdGFuY2UpOworICAgIH0KKworICAgIC8qIERpc2FibGUgdGhlIERNQSBjaGFubmVsIChpbiBjYXNlIG9mIERNQSBpbiBjaXJjdWxhciBtb2RlIG9yIHN0b3AgICAgICAgKi8KKyAgICAvKiB3aGlsZSBETUEgdHJhbnNmZXIgaXMgb24gZ29pbmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogTm90ZTogRE1BIGNoYW5uZWwgb2YgQURDIHNsYXZlIHNob3VsZCBiZSBzdG9wcGVkIGFmdGVyIHRoaXMgZnVuY3Rpb24gICAqLworICAgIC8qICAgICAgIHdpdGggSEFMX0FEQ19TdG9wX0RNQSgpIEFQSS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB0bXBfaGFsX3N0YXR1cyA9IEhBTF9ETUFfQWJvcnQoaGFkYy0+RE1BX0hhbmRsZSk7CisKKyAgICAvKiBDaGVjayBpZiBETUEgY2hhbm5lbCBlZmZlY3RpdmVseSBkaXNhYmxlZCAqLworICAgIGlmICh0bXBfaGFsX3N0YXR1cyA9PSBIQUxfRVJST1IpIHsKKyAgICAgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSB0byBlcnJvciAqLworICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9ETUEpOworICAgIH0KKworICAgIC8qIERpc2FibGUgQURDIG92ZXJydW4gaW50ZXJydXB0ICovCisgICAgX19IQUxfQURDX0RJU0FCTEVfSVQoaGFkYywgQURDX0lUX09WUik7CisKKyAgICAvKiAyLiBEaXNhYmxlIHRoZSBBREMgcGVyaXBoZXJhbHM6IG1hc3RlciBhbmQgc2xhdmUgKi8KKyAgICAvKiBVcGRhdGUgInRtcF9oYWxfc3RhdHVzIiBvbmx5IGlmIERNQSBjaGFubmVsIGRpc2FibGluZyBwYXNzZWQsIHRvIGtlZXAgaW4KKyAgICAgKi8KKyAgICAvKiBtZW1vcnkgYSBwb3RlbnRpYWwgZmFpbGluZyBzdGF0dXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYgKHRtcF9oYWxfc3RhdHVzID09IEhBTF9PSykgeworICAgICAgdG1wX2hhZGNfc2xhdmVfZGlzYWJsZV9zdGF0dXMgPSBBRENfRGlzYWJsZSgmdG1wX2hhZGNfc2xhdmUpOworICAgICAgaWYgKChBRENfRGlzYWJsZShoYWRjKSA9PSBIQUxfT0spICYmCisgICAgICAgICAgKHRtcF9oYWRjX3NsYXZlX2Rpc2FibGVfc3RhdHVzID09IEhBTF9PSykpIHsKKyAgICAgICAgdG1wX2hhbF9zdGF0dXMgPSBIQUxfT0s7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIEluIGNhc2Ugb2YgZXJyb3IsIGF0dGVtcHQgdG8gZGlzYWJsZSBBREMgbWFzdGVyIGFuZCBzbGF2ZSB3aXRob3V0CisgICAgICAgKiBzdGF0dXMgYXNzZXJ0ICovCisgICAgICAodm9pZClBRENfRGlzYWJsZShoYWRjKTsKKyAgICAgICh2b2lkKUFEQ19EaXNhYmxlKCZ0bXBfaGFkY19zbGF2ZSk7CisgICAgfQorCisgICAgLyogU2V0IEFEQyBzdGF0ZSAoQURDIG1hc3RlcikgKi8KKyAgICBBRENfU1RBVEVfQ0xSX1NFVChoYWRjLT5TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFR19CVVNZIHwgSEFMX0FEQ19TVEFURV9JTkpfQlVTWSwKKyAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFQURZKTsKKyAgfQorCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhhZGMpOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHRtcF9oYWxfc3RhdHVzOworfQorCisvKioKKyAqIEBicmllZiAgUmV0dXJuIHRoZSBsYXN0IEFEQyBNYXN0ZXIgYW5kIFNsYXZlIHJlZ3VsYXIgY29udmVyc2lvbnMgcmVzdWx0cyB3aGVuCisgKiBpbiBtdWx0aW1vZGUgY29uZmlndXJhdGlvbi4KKyAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUgb2YgQURDIE1hc3RlciAoaGFuZGxlIG9mIEFEQyBTbGF2ZSBtdXN0IG5vdCBiZSB1c2VkKQorICogQHJldHZhbCBUaGUgY29udmVydGVkIGRhdGEgdmFsdWVzLgorICovCit1aW50MzJfdCBIQUxfQURDRXhfTXVsdGlNb2RlR2V0VmFsdWUoY29uc3QgQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpIHsKKyAgY29uc3QgQURDX0NvbW1vbl9UeXBlRGVmICp0bXBBRENfQ29tbW9uOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfTVVMVElNT0RFX01BU1RFUl9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworCisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgaWYgbm8gYXNzZXJ0X3BhcmFtIGNoZWNrICovCisgIC8qIGFuZCBwb3NzaWJsZSBubyB1c2FnZSBpbiBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoKSBiZWxvdyAgICAgICAgICAgICAgICovCisgIFVOVVNFRChoYWRjKTsKKworICAvKiBQb2ludGVyIHRvIHRoZSBjb21tb24gY29udHJvbCByZWdpc3RlciAgKi8KKyAgdG1wQURDX0NvbW1vbiA9IF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSk7CisKKyAgLyogUmV0dXJuIHRoZSBtdWx0aSBtb2RlIGNvbnZlcnNpb24gdmFsdWUgKi8KKyAgcmV0dXJuIHRtcEFEQ19Db21tb24tPkNEUjsKK30KKyNlbmRpZiAvKiBBRENfTVVMVElNT0RFX1NVUFBPUlQgKi8KKworLyoqCisgKiBAYnJpZWYgIEdldCBBREMgaW5qZWN0ZWQgZ3JvdXAgY29udmVyc2lvbiByZXN1bHQuCisgKiBAbm90ZSAgIFJlYWRpbmcgcmVnaXN0ZXIgSkRSeCBhdXRvbWF0aWNhbGx5IGNsZWFycyBBREMgZmxhZyBKRU9DCisgKiAgICAgICAgIChBREMgZ3JvdXAgaW5qZWN0ZWQgZW5kIG9mIHVuaXRhcnkgY29udmVyc2lvbikuCisgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgY2xlYXIgQURDIGZsYWcgSkVPUworICogICAgICAgICAoQURDIGdyb3VwIGluamVjdGVkIGVuZCBvZiBzZXF1ZW5jZSBjb252ZXJzaW9uKQorICogICAgICAgICBPY2N1cnJlbmNlIG9mIGZsYWcgSkVPUyByaXNpbmc6CisgKiAgICAgICAgICAtIElmIHNlcXVlbmNlciBpcyBjb21wb3NlZCBvZiAxIHJhbmssIGZsYWcgSkVPUyBpcyBlcXVpdmFsZW50CisgKiAgICAgICAgICAgIHRvIGZsYWcgSkVPQy4KKyAqICAgICAgICAgIC0gSWYgc2VxdWVuY2VyIGlzIGNvbXBvc2VkIG9mIHNldmVyYWwgcmFua3MsIGR1cmluZyB0aGUgc2NhbgorICogICAgICAgICAgICBzZXF1ZW5jZSBmbGFnIEpFT0Mgb25seSBpcyByYWlzZWQsIGF0IHRoZSBlbmQgb2YgdGhlIHNjYW4gc2VxdWVuY2UKKyAqICAgICAgICAgICAgYm90aCBmbGFncyBKRU9DIGFuZCBFT1MgYXJlIHJhaXNlZC4KKyAqICAgICAgICAgRmxhZyBKRU9TIG11c3Qgbm90IGJlIGNsZWFyZWQgYnkgdGhpcyBmdW5jdGlvbiBiZWNhdXNlCisgKiAgICAgICAgIGl0IHdvdWxkIG5vdCBiZSBjb21wbGlhbnQgd2l0aCBsb3cgcG93ZXIgZmVhdHVyZXMKKyAqICAgICAgICAgKGZlYXR1cmUgbG93IHBvd2VyIGF1dG8td2FpdCwgbm90IGF2YWlsYWJsZSBvbiBhbGwgU1RNMzIgc2VyaWVzKS4KKyAqICAgICAgICAgVG8gY2xlYXIgdGhpcyBmbGFnLCBlaXRoZXIgdXNlIGZ1bmN0aW9uOgorICogICAgICAgICBpbiBwcm9ncmFtbWluZyBtb2RlbCBJVDogQHJlZiBIQUxfQURDX0lSUUhhbmRsZXIoKSwgaW4gcHJvZ3JhbW1pbmcKKyAqICAgICAgICAgbW9kZWwgcG9sbGluZzogQHJlZiBIQUxfQURDRXhfSW5qZWN0ZWRQb2xsRm9yQ29udmVyc2lvbigpCisgKiAgICAgICAgIG9yIEByZWYgX19IQUxfQURDX0NMRUFSX0ZMQUcoJmhhZGMsIEFEQ19GTEFHX0pFT1MpLgorICogQHBhcmFtIGhhZGMgQURDIGhhbmRsZQorICogQHBhcmFtIEluamVjdGVkUmFuayB0aGUgY29udmVydGVkIEFEQyBpbmplY3RlZCByYW5rLgorICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19JTkpFQ1RFRF9SQU5LXzEgQURDIGdyb3VwIGluamVjdGVkIHJhbmsgMQorICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0lOSkVDVEVEX1JBTktfMiBBREMgZ3JvdXAgaW5qZWN0ZWQgcmFuayAyCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfSU5KRUNURURfUkFOS18zIEFEQyBncm91cCBpbmplY3RlZCByYW5rIDMKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19JTkpFQ1RFRF9SQU5LXzQgQURDIGdyb3VwIGluamVjdGVkIHJhbmsgNAorICogQHJldHZhbCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiBkYXRhCisgKi8KK3VpbnQzMl90IEhBTF9BRENFeF9JbmplY3RlZEdldFZhbHVlKGNvbnN0IEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgSW5qZWN0ZWRSYW5rKSB7CisgIHVpbnQzMl90IHRtcF9qZHI7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19JTkpFQ1RFRF9SQU5LKEluamVjdGVkUmFuaykpOworCisgIC8qIEdldCBBREMgY29udmVydGVkIHZhbHVlICovCisgIHN3aXRjaCAoSW5qZWN0ZWRSYW5rKSB7CisgICAgY2FzZSBBRENfSU5KRUNURURfUkFOS180OgorICAgICAgdG1wX2pkciA9IGhhZGMtPkluc3RhbmNlLT5KRFI0OworICAgICAgYnJlYWs7CisgICAgY2FzZSBBRENfSU5KRUNURURfUkFOS18zOgorICAgICAgdG1wX2pkciA9IGhhZGMtPkluc3RhbmNlLT5KRFIzOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBRENfSU5KRUNURURfUkFOS18yOgorICAgICAgdG1wX2pkciA9IGhhZGMtPkluc3RhbmNlLT5KRFIyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBRENfSU5KRUNURURfUkFOS18xOgorICAgIGRlZmF1bHQ6CisgICAgICB0bXBfamRyID0gaGFkYy0+SW5zdGFuY2UtPkpEUjE7CisgICAgICBicmVhazsKKyAgfQorCisgIC8qIFJldHVybiBBREMgY29udmVydGVkIHZhbHVlICovCisgIHJldHVybiB0bXBfamRyOworfQorCisvKioKKyAqIEBicmllZiAgSW5qZWN0ZWQgY29udmVyc2lvbiBjb21wbGV0ZSBjYWxsYmFjayBpbiBub24tYmxvY2tpbmcgbW9kZS4KKyAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUKKyAqIEByZXR2YWwgTm9uZQorICovCitfX3dlYWsgdm9pZCBIQUxfQURDRXhfSW5qZWN0ZWRDb252Q3BsdENhbGxiYWNrKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKSB7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhhZGMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQuIFdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIGZ1bmN0aW9uIEhBTF9BRENFeF9JbmplY3RlZENvbnZDcGx0Q2FsbGJhY2sgbXVzdCBiZSBpbXBsZW1lbnRlZCBpbgorICAgICB0aGUgdXNlciBmaWxlLgorICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIEluamVjdGVkIGNvbnRleHQgcXVldWUgb3ZlcmZsb3cgY2FsbGJhY2suCisgICogQG5vdGUgICBUaGlzIGNhbGxiYWNrIGlzIGNhbGxlZCBpZiBpbmplY3RlZCBjb250ZXh0IHF1ZXVlIGlzIGVuYWJsZWQKKyAgICAgICAgICAgIChwYXJhbWV0ZXIgIlF1ZXVlSW5qZWN0ZWRDb250ZXh0IiBpbiBpbmplY3RlZCBjaGFubmVsIGNvbmZpZ3VyYXRpb24pCisgICAgICAgICAgICBhbmQgaWYgYSBuZXcgaW5qZWN0ZWQgY29udGV4dCBpcyBzZXQgd2hlbiBxdWV1ZSBpcyBmdWxsIChtYXhpbXVtIDIKKyAgICAgICAgICAgIGNvbnRleHRzKS4KKyAgKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfQURDRXhfSW5qZWN0ZWRRdWV1ZU92ZXJmbG93Q2FsbGJhY2soQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpIHsKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGFkYyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZC4gV2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgZnVuY3Rpb24gSEFMX0FEQ0V4X0luamVjdGVkUXVldWVPdmVyZmxvd0NhbGxiYWNrIG11c3QgYmUgaW1wbGVtZW50ZWQKKyAgICAgaW4gdGhlIHVzZXIgZmlsZS4KKyAgKi8KK30KKworLyoqCisgKiBAYnJpZWYgIEFuYWxvZyB3YXRjaGRvZyAyIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlLgorICogQHBhcmFtIGhhZGMgQURDIGhhbmRsZQorICogQHJldHZhbCBOb25lCisgKi8KK19fd2VhayB2b2lkIEhBTF9BRENFeF9MZXZlbE91dE9mV2luZG93MkNhbGxiYWNrKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKSB7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhhZGMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQuIFdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIGZ1bmN0aW9uIEhBTF9BRENFeF9MZXZlbE91dE9mV2luZG93MkNhbGxiYWNrIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4KKyAgICAgdGhlIHVzZXIgZmlsZS4KKyAgKi8KK30KKworLyoqCisgKiBAYnJpZWYgIEFuYWxvZyB3YXRjaGRvZyAzIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlLgorICogQHBhcmFtIGhhZGMgQURDIGhhbmRsZQorICogQHJldHZhbCBOb25lCisgKi8KK19fd2VhayB2b2lkIEhBTF9BRENFeF9MZXZlbE91dE9mV2luZG93M0NhbGxiYWNrKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKSB7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhhZGMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQuIFdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIGZ1bmN0aW9uIEhBTF9BRENFeF9MZXZlbE91dE9mV2luZG93M0NhbGxiYWNrIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4KKyAgICAgdGhlIHVzZXIgZmlsZS4KKyAgKi8KK30KKworLyoqCisgKiBAYnJpZWYgIEVuZCBPZiBTYW1wbGluZyBjYWxsYmFjayBpbiBub24tYmxvY2tpbmcgbW9kZS4KKyAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUKKyAqIEByZXR2YWwgTm9uZQorICovCitfX3dlYWsgdm9pZCBIQUxfQURDRXhfRW5kT2ZTYW1wbGluZ0NhbGxiYWNrKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKSB7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhhZGMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQuIFdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIGZ1bmN0aW9uIEhBTF9BRENFeF9FbmRPZlNhbXBsaW5nQ2FsbGJhY2sgbXVzdCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUKKyAgICAgdXNlciBmaWxlLgorICAqLworfQorCisvKioKKyAqIEBicmllZiAgU3RvcCBBREMgY29udmVyc2lvbiBvZiByZWd1bGFyIGdyb3VwIChhbmQgaW5qZWN0ZWQgY2hhbm5lbHMgaW4KKyAqICAgICAgICAgY2FzZSBvZiBhdXRvX2luamVjdGlvbiBtb2RlKSwgZGlzYWJsZSBBREMgcGVyaXBoZXJhbCBpZiBubworICogICAgICAgICBjb252ZXJzaW9uIGlzIG9uIGdvaW5nIG9uIGluamVjdGVkIGdyb3VwLgorICogQHBhcmFtIGhhZGMgQURDIGhhbmRsZQorICogQHJldHZhbCBIQUwgc3RhdHVzLgorICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDRXhfUmVndWxhclN0b3AoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpIHsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgdG1wX2hhbF9zdGF0dXM7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhhZGMpOworCisgIC8qIDEuIFN0b3AgcG90ZW50aWFsIHJlZ3VsYXIgY29udmVyc2lvbiBvbiBnb2luZyAqLworICB0bXBfaGFsX3N0YXR1cyA9IEFEQ19Db252ZXJzaW9uU3RvcChoYWRjLCBBRENfUkVHVUxBUl9HUk9VUCk7CisKKyAgLyogRGlzYWJsZSBBREMgcGVyaXBoZXJhbCBpZiByZWd1bGFyIGNvbnZlcnNpb25zIGFyZSBlZmZlY3RpdmVseSBzdG9wcGVkCisgICAgIGFuZCBpZiBubyBpbmplY3RlZCBjb252ZXJzaW9ucyBhcmUgb24tZ29pbmcgKi8KKyAgaWYgKHRtcF9oYWxfc3RhdHVzID09IEhBTF9PSykgeworICAgIC8qIENsZWFyIEhBTF9BRENfU1RBVEVfUkVHX0JVU1kgYml0ICovCisgICAgQ0xFQVJfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX1JFR19CVVNZKTsKKworICAgIGlmIChMTF9BRENfSU5KX0lzQ29udmVyc2lvbk9uZ29pbmcoaGFkYy0+SW5zdGFuY2UpID09IDBVTCkgeworICAgICAgLyogMi4gRGlzYWJsZSB0aGUgQURDIHBlcmlwaGVyYWwgKi8KKyAgICAgIHRtcF9oYWxfc3RhdHVzID0gQURDX0Rpc2FibGUoaGFkYyk7CisKKyAgICAgIC8qIENoZWNrIGlmIEFEQyBpcyBlZmZlY3RpdmVseSBkaXNhYmxlZCAqLworICAgICAgaWYgKHRtcF9oYWxfc3RhdHVzID09IEhBTF9PSykgeworICAgICAgICAvKiBTZXQgQURDIHN0YXRlICovCisgICAgICAgIEFEQ19TVEFURV9DTFJfU0VUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0lOSl9CVVNZLAorICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFQURZKTsKKyAgICAgIH0KKyAgICB9CisgICAgLyogQ29udmVyc2lvbiBvbiBpbmplY3RlZCBncm91cCBpcyBzdG9wcGVkLCBidXQgQURDIG5vdCBkaXNhYmxlZCBzaW5jZSAgICAqLworICAgIC8qIGNvbnZlcnNpb24gb24gcmVndWxhciBncm91cCBpcyBzdGlsbCBydW5uaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBlbHNlIHsKKyAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfSU5KX0JVU1kpOworICAgIH0KKyAgfQorCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhhZGMpOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHRtcF9oYWxfc3RhdHVzOworfQorCisvKioKKyAqIEBicmllZiAgU3RvcCBBREMgY29udmVyc2lvbiBvZiBBREMgZ3JvdXBzIHJlZ3VsYXIgYW5kIGluamVjdGVkLAorICogICAgICAgICBkaXNhYmxlIGludGVycnV0aW9uIG9mIGVuZC1vZi1jb252ZXJzaW9uLAorICogICAgICAgICBkaXNhYmxlIEFEQyBwZXJpcGhlcmFsIGlmIG5vIGNvbnZlcnNpb24gaXMgb24gZ29pbmcKKyAqICAgICAgICAgb24gaW5qZWN0ZWQgZ3JvdXAuCisgKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMuCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENFeF9SZWd1bGFyU3RvcF9JVChBRENfSGFuZGxlVHlwZURlZiAqaGFkYykgeworICBIQUxfU3RhdHVzVHlwZURlZiB0bXBfaGFsX3N0YXR1czsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGFkYyk7CisKKyAgLyogMS4gU3RvcCBwb3RlbnRpYWwgcmVndWxhciBjb252ZXJzaW9uIG9uIGdvaW5nICovCisgIHRtcF9oYWxfc3RhdHVzID0gQURDX0NvbnZlcnNpb25TdG9wKGhhZGMsIEFEQ19SRUdVTEFSX0dST1VQKTsKKworICAvKiBEaXNhYmxlIEFEQyBwZXJpcGhlcmFsIGlmIGNvbnZlcnNpb25zIGFyZSBlZmZlY3RpdmVseSBzdG9wcGVkCisgICAgYW5kIGlmIG5vIGluamVjdGVkIGNvbnZlcnNpb24gaXMgb24tZ29pbmcgKi8KKyAgaWYgKHRtcF9oYWxfc3RhdHVzID09IEhBTF9PSykgeworICAgIC8qIENsZWFyIEhBTF9BRENfU1RBVEVfUkVHX0JVU1kgYml0ICovCisgICAgQ0xFQVJfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX1JFR19CVVNZKTsKKworICAgIC8qIERpc2FibGUgYWxsIHJlZ3VsYXItcmVsYXRlZCBpbnRlcnJ1cHRzICovCisgICAgX19IQUxfQURDX0RJU0FCTEVfSVQoaGFkYywgKEFEQ19JVF9FT0MgfCBBRENfSVRfRU9TIHwgQURDX0lUX09WUikpOworCisgICAgLyogMi4gRGlzYWJsZSBBREMgcGVyaXBoZXJhbCBpZiBubyBpbmplY3RlZCBjb252ZXJzaW9ucyBhcmUgb24tZ29pbmcgKi8KKyAgICBpZiAoTExfQURDX0lOSl9Jc0NvbnZlcnNpb25PbmdvaW5nKGhhZGMtPkluc3RhbmNlKSA9PSAwVUwpIHsKKyAgICAgIHRtcF9oYWxfc3RhdHVzID0gQURDX0Rpc2FibGUoaGFkYyk7CisgICAgICAvKiBpZiBubyBpc3N1ZSByZXBvcnRlZCAqLworICAgICAgaWYgKHRtcF9oYWxfc3RhdHVzID09IEhBTF9PSykgeworICAgICAgICAvKiBTZXQgQURDIHN0YXRlICovCisgICAgICAgIEFEQ19TVEFURV9DTFJfU0VUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0lOSl9CVVNZLAorICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFQURZKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9JTkpfQlVTWSk7CisgICAgfQorICB9CisKKyAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGFkYyk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gdG1wX2hhbF9zdGF0dXM7Cit9CisKKy8qKgorICogQGJyaWVmICBTdG9wIEFEQyBjb252ZXJzaW9uIG9mIHJlZ3VsYXIgZ3JvdXAgKGFuZCBpbmplY3RlZCBncm91cCBpbgorICogICAgICAgICBjYXNlIG9mIGF1dG9faW5qZWN0aW9uIG1vZGUpLCBkaXNhYmxlIEFEQyBETUEgdHJhbnNmZXIsIGRpc2FibGUKKyAqICAgICAgICAgQURDIHBlcmlwaGVyYWwgaWYgbm8gY29udmVyc2lvbiBpcyBvbiBnb2luZworICogICAgICAgICBvbiBpbmplY3RlZCBncm91cC4KKyAqIEBub3RlICAgSEFMX0FEQ0V4X1JlZ3VsYXJTdG9wX0RNQSgpIGZ1bmN0aW9uIGlzIGRlZGljYXRlZCB0byBzaW5nbGUtQURDIG1vZGUKKyAqIG9ubHkuIEZvciBtdWx0aW1vZGUgKHdoZW4gbXVsdGltb2RlIGZlYXR1cmUgaXMgYXZhaWxhYmxlKSwKKyAqICAgICAgICAgSEFMX0FEQ0V4X1JlZ3VsYXJNdWx0aU1vZGVTdG9wX0RNQSgpIEFQSSBtdXN0IGJlIHVzZWQuCisgKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMuCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENFeF9SZWd1bGFyU3RvcF9ETUEoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpIHsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgdG1wX2hhbF9zdGF0dXM7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhhZGMpOworCisgIC8qIDEuIFN0b3AgcG90ZW50aWFsIHJlZ3VsYXIgY29udmVyc2lvbiBvbiBnb2luZyAqLworICB0bXBfaGFsX3N0YXR1cyA9IEFEQ19Db252ZXJzaW9uU3RvcChoYWRjLCBBRENfUkVHVUxBUl9HUk9VUCk7CisKKyAgLyogRGlzYWJsZSBBREMgcGVyaXBoZXJhbCBpZiBjb252ZXJzaW9ucyBhcmUgZWZmZWN0aXZlbHkgc3RvcHBlZAorICAgICBhbmQgaWYgbm8gaW5qZWN0ZWQgY29udmVyc2lvbiBpcyBvbi1nb2luZyAqLworICBpZiAodG1wX2hhbF9zdGF0dXMgPT0gSEFMX09LKSB7CisgICAgLyogQ2xlYXIgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSBiaXQgKi8KKyAgICBDTEVBUl9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfUkVHX0JVU1kpOworCisgICAgLyogRGlzYWJsZSBBREMgRE1BIChBREMgRE1BIGNvbmZpZ3VyYXRpb24gQURDX0NGR1JfRE1BQ0ZHIGlzIGtlcHQpICovCisgICAgQ0xFQVJfQklUKGhhZGMtPkluc3RhbmNlLT5DRkdSLCBBRENfQ0ZHUl9ETUFFTik7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBETUEgY2hhbm5lbCAoaW4gY2FzZSBvZiBETUEgaW4gY2lyY3VsYXIgbW9kZSBvciBzdG9wIHdoaWxlICovCisgICAgLyogd2hpbGUgRE1BIHRyYW5zZmVyIGlzIG9uIGdvaW5nKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHRtcF9oYWxfc3RhdHVzID0gSEFMX0RNQV9BYm9ydChoYWRjLT5ETUFfSGFuZGxlKTsKKworICAgIC8qIENoZWNrIGlmIERNQSBjaGFubmVsIGVmZmVjdGl2ZWx5IGRpc2FibGVkICovCisgICAgaWYgKHRtcF9oYWxfc3RhdHVzICE9IEhBTF9PSykgeworICAgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lIHRvIGVycm9yICovCisgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0VSUk9SX0RNQSk7CisgICAgfQorCisgICAgLyogRGlzYWJsZSBBREMgb3ZlcnJ1biBpbnRlcnJ1cHQgKi8KKyAgICBfX0hBTF9BRENfRElTQUJMRV9JVChoYWRjLCBBRENfSVRfT1ZSKTsKKworICAgIC8qIDIuIERpc2FibGUgdGhlIEFEQyBwZXJpcGhlcmFsICovCisgICAgLyogVXBkYXRlICJ0bXBfaGFsX3N0YXR1cyIgb25seSBpZiBETUEgY2hhbm5lbCBkaXNhYmxpbmcgcGFzc2VkLCAgICAgICAgICAqLworICAgIC8qIHRvIGtlZXAgaW4gbWVtb3J5IGEgcG90ZW50aWFsIGZhaWxpbmcgc3RhdHVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpZiAoTExfQURDX0lOSl9Jc0NvbnZlcnNpb25PbmdvaW5nKGhhZGMtPkluc3RhbmNlKSA9PSAwVUwpIHsKKyAgICAgIGlmICh0bXBfaGFsX3N0YXR1cyA9PSBIQUxfT0spIHsKKyAgICAgICAgdG1wX2hhbF9zdGF0dXMgPSBBRENfRGlzYWJsZShoYWRjKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICh2b2lkKUFEQ19EaXNhYmxlKGhhZGMpOworICAgICAgfQorCisgICAgICAvKiBDaGVjayBpZiBBREMgaXMgZWZmZWN0aXZlbHkgZGlzYWJsZWQgKi8KKyAgICAgIGlmICh0bXBfaGFsX3N0YXR1cyA9PSBIQUxfT0spIHsKKyAgICAgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgICAgICBBRENfU1RBVEVfQ0xSX1NFVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9JTkpfQlVTWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUFEWSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfSU5KX0JVU1kpOworICAgIH0KKyAgfQorCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhhZGMpOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHRtcF9oYWxfc3RhdHVzOworfQorCisjaWYgZGVmaW5lZChBRENfTVVMVElNT0RFX1NVUFBPUlQpCisvKioKKyAqIEBicmllZiAgU3RvcCBETUEtYmFzZWQgbXVsdGltb2RlIEFEQyBjb252ZXJzaW9uLCBkaXNhYmxlIEFEQyBETUEgdHJhbnNmZXIsCisgKiBkaXNhYmxlIEFEQyBwZXJpcGhlcmFsIGlmIG5vIGluamVjdGVkIGNvbnZlcnNpb24gaXMgb24tZ29pbmcuCisgKiBAbm90ZSAgIE11bHRpbW9kZSBpcyBrZXB0IGVuYWJsZWQgYWZ0ZXIgdGhpcyBmdW5jdGlvbi4gTXVsdGltb2RlIERNQSBiaXRzCisgKiAgICAgICAgIChNRE1BIGFuZCBETUFDRkcgYml0cyBvZiBjb21tb24gQ0NSIHJlZ2lzdGVyKSBhcmUgbWFpbnRhaW5lZC4gVG8KKyAqIGRpc2FibGUgbXVsdGltb2RlIChzZXQgd2l0aCBIQUxfQURDRXhfTXVsdGlNb2RlQ29uZmlnQ2hhbm5lbCgpKSwgQURDIG11c3QgYmUKKyAqICAgICAgICAgcmVpbml0aWFsaXplZCB1c2luZyBIQUxfQURDX0luaXQoKSBvciBIQUxfQURDX0RlSW5pdCgpLCBvciB0aGUgdXNlcgorICogY2FuIHJlc29ydCB0byBIQUxfQURDRXhfRGlzYWJsZU11bHRpTW9kZSgpIEFQSS4KKyAqIEBub3RlICAgSW4gY2FzZSBvZiBETUEgY29uZmlndXJlZCBpbiBjaXJjdWxhciBtb2RlLCBmdW5jdGlvbgorICogICAgICAgICBIQUxfQURDRXhfUmVndWxhclN0b3BfRE1BKCkgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhpcyBmdW5jdGlvbiB3aXRoCisgKiBoYW5kbGUgb2YgQURDIHNsYXZlLCB0byBwcm9wZXJseSBkaXNhYmxlIHRoZSBETUEgY2hhbm5lbC4KKyAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUgb2YgQURDIG1hc3RlciAoaGFuZGxlIG9mIEFEQyBzbGF2ZSBtdXN0IG5vdCBiZSB1c2VkKQorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENFeF9SZWd1bGFyTXVsdGlNb2RlU3RvcF9ETUEoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpIHsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgdG1wX2hhbF9zdGF0dXM7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKyAgQURDX0hhbmRsZVR5cGVEZWYgdG1wX2hhZGNfc2xhdmU7CisgIHVpbnQzMl90IHRtcF9oYWRjX3NsYXZlX2NvbnZlcnNpb25fb25fZ29pbmc7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19NVUxUSU1PREVfTUFTVEVSX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoYWRjKTsKKworICAvKiAxLiBTdG9wIHBvdGVudGlhbCBtdWx0aW1vZGUgY29udmVyc2lvbiBvbiBnb2luZywgb24gcmVndWxhciBncm91cHMgKi8KKyAgdG1wX2hhbF9zdGF0dXMgPSBBRENfQ29udmVyc2lvblN0b3AoaGFkYywgQURDX1JFR1VMQVJfR1JPVVApOworCisgIC8qIERpc2FibGUgQURDIHBlcmlwaGVyYWwgaWYgY29udmVyc2lvbnMgYXJlIGVmZmVjdGl2ZWx5IHN0b3BwZWQgKi8KKyAgaWYgKHRtcF9oYWxfc3RhdHVzID09IEhBTF9PSykgeworICAgIC8qIENsZWFyIEhBTF9BRENfU1RBVEVfUkVHX0JVU1kgYml0ICovCisgICAgQ0xFQVJfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX1JFR19CVVNZKTsKKworICAgIC8qIFRlbXBvcmFyeSBoYW5kbGUgbWluaW11bSBpbml0aWFsaXphdGlvbiAqLworICAgIF9fSEFMX0FEQ19SRVNFVF9IQU5ETEVfU1RBVEUoJnRtcF9oYWRjX3NsYXZlKTsKKyAgICBBRENfQ0xFQVJfRVJST1JDT0RFKCZ0bXBfaGFkY19zbGF2ZSk7CisKKyAgICAvKiBTZXQgYSB0ZW1wb3JhcnkgaGFuZGxlIG9mIHRoZSBBREMgc2xhdmUgYXNzb2NpYXRlZCB0byB0aGUgQURDIG1hc3RlciAgICovCisgICAgQURDX01VTFRJX1NMQVZFKGhhZGMsICZ0bXBfaGFkY19zbGF2ZSk7CisKKyAgICBpZiAodG1wX2hhZGNfc2xhdmUuSW5zdGFuY2UgPT0gTlVMTCkgeworICAgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lIHRvIGVycm9yICovCisgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0VSUk9SX0NPTkZJRyk7CisKKyAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoYWRjKTsKKworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBQcm9jZWR1cmUgdG8gZGlzYWJsZSB0aGUgQURDIHBlcmlwaGVyYWw6IHdhaXQgZm9yIGNvbnZlcnNpb25zICAgICAgICAgICovCisgICAgLyogZWZmZWN0aXZlbHkgc3RvcHBlZCAoQURDIG1hc3RlciBhbmQgQURDIHNsYXZlKSwgdGhlbiBkaXNhYmxlIEFEQyAgICAgICAqLworCisgICAgLyogMS4gV2FpdCBmb3IgQURDIGNvbnZlcnNpb24gY29tcGxldGlvbiBmb3IgQURDIG1hc3RlciBhbmQgQURDIHNsYXZlICovCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgIHRtcF9oYWRjX3NsYXZlX2NvbnZlcnNpb25fb25fZ29pbmcgPQorICAgICAgICBMTF9BRENfUkVHX0lzQ29udmVyc2lvbk9uZ29pbmcoKCZ0bXBfaGFkY19zbGF2ZSktPkluc3RhbmNlKTsKKyAgICB3aGlsZSAoKExMX0FEQ19SRUdfSXNDb252ZXJzaW9uT25nb2luZyhoYWRjLT5JbnN0YW5jZSkgPT0gMVVMKSB8fAorICAgICAgICAgICAodG1wX2hhZGNfc2xhdmVfY29udmVyc2lvbl9vbl9nb2luZyA9PSAxVUwpKSB7CisgICAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gQURDX1NUT1BfQ09OVkVSU0lPTl9USU1FT1VUKSB7CisgICAgICAgIC8qIE5ldyBjaGVjayB0byBhdm9pZCBmYWxzZSB0aW1lb3V0IGRldGVjdGlvbiBpbiBjYXNlIG9mIHByZWVtcHRpb24gKi8KKyAgICAgICAgdG1wX2hhZGNfc2xhdmVfY29udmVyc2lvbl9vbl9nb2luZyA9CisgICAgICAgICAgICBMTF9BRENfUkVHX0lzQ29udmVyc2lvbk9uZ29pbmcoKCZ0bXBfaGFkY19zbGF2ZSktPkluc3RhbmNlKTsKKyAgICAgICAgaWYgKChMTF9BRENfUkVHX0lzQ29udmVyc2lvbk9uZ29pbmcoaGFkYy0+SW5zdGFuY2UpID09IDFVTCkgfHwKKyAgICAgICAgICAgICh0bXBfaGFkY19zbGF2ZV9jb252ZXJzaW9uX29uX2dvaW5nID09IDFVTCkpIHsKKyAgICAgICAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gZXJyb3IgKi8KKyAgICAgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0VSUk9SX0lOVEVSTkFMKTsKKworICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgICBfX0hBTF9VTkxPQ0soaGFkYyk7CisKKyAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHRtcF9oYWRjX3NsYXZlX2NvbnZlcnNpb25fb25fZ29pbmcgPQorICAgICAgICAgIExMX0FEQ19SRUdfSXNDb252ZXJzaW9uT25nb2luZygoJnRtcF9oYWRjX3NsYXZlKS0+SW5zdGFuY2UpOworICAgIH0KKworICAgIC8qIERpc2FibGUgdGhlIERNQSBjaGFubmVsIChpbiBjYXNlIG9mIERNQSBpbiBjaXJjdWxhciBtb2RlIG9yIHN0b3AgICAgICAgKi8KKyAgICAvKiB3aGlsZSBETUEgdHJhbnNmZXIgaXMgb24gZ29pbmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogTm90ZTogRE1BIGNoYW5uZWwgb2YgQURDIHNsYXZlIHNob3VsZCBiZSBzdG9wcGVkIGFmdGVyIHRoaXMgZnVuY3Rpb24gICAqLworICAgIC8qIHdpdGggSEFMX0FEQ0V4X1JlZ3VsYXJTdG9wX0RNQSgpIEFQSS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB0bXBfaGFsX3N0YXR1cyA9IEhBTF9ETUFfQWJvcnQoaGFkYy0+RE1BX0hhbmRsZSk7CisKKyAgICAvKiBDaGVjayBpZiBETUEgY2hhbm5lbCBlZmZlY3RpdmVseSBkaXNhYmxlZCAqLworICAgIGlmICh0bXBfaGFsX3N0YXR1cyAhPSBIQUxfT0spIHsKKyAgICAgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSB0byBlcnJvciAqLworICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9ETUEpOworICAgIH0KKworICAgIC8qIERpc2FibGUgQURDIG92ZXJydW4gaW50ZXJydXB0ICovCisgICAgX19IQUxfQURDX0RJU0FCTEVfSVQoaGFkYywgQURDX0lUX09WUik7CisKKyAgICAvKiAyLiBEaXNhYmxlIHRoZSBBREMgcGVyaXBoZXJhbHM6IG1hc3RlciBhbmQgc2xhdmUgaWYgbm8gaW5qZWN0ZWQgICAgICAgICovCisgICAgLyogICBjb252ZXJzaW9uIGlzIG9uLWdvaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIFVwZGF0ZSAidG1wX2hhbF9zdGF0dXMiIG9ubHkgaWYgRE1BIGNoYW5uZWwgZGlzYWJsaW5nIHBhc3NlZCwgdG8ga2VlcCBpbgorICAgICAqLworICAgIC8qIG1lbW9yeSBhIHBvdGVudGlhbCBmYWlsaW5nIHN0YXR1cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpZiAodG1wX2hhbF9zdGF0dXMgPT0gSEFMX09LKSB7CisgICAgICBpZiAoTExfQURDX0lOSl9Jc0NvbnZlcnNpb25PbmdvaW5nKGhhZGMtPkluc3RhbmNlKSA9PSAwVUwpIHsKKyAgICAgICAgdG1wX2hhbF9zdGF0dXMgPSBBRENfRGlzYWJsZShoYWRjKTsKKyAgICAgICAgaWYgKHRtcF9oYWxfc3RhdHVzID09IEhBTF9PSykgeworICAgICAgICAgIGlmIChMTF9BRENfSU5KX0lzQ29udmVyc2lvbk9uZ29pbmcoKCZ0bXBfaGFkY19zbGF2ZSktPkluc3RhbmNlKSA9PQorICAgICAgICAgICAgICAwVUwpIHsKKyAgICAgICAgICAgIHRtcF9oYWxfc3RhdHVzID0gQURDX0Rpc2FibGUoJnRtcF9oYWRjX3NsYXZlKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKHRtcF9oYWxfc3RhdHVzID09IEhBTF9PSykgeworICAgICAgICAvKiBCb3RoIE1hc3RlciBhbmQgU2xhdmUgQURDJ3MgY291bGQgYmUgZGlzYWJsZWQuIFVwZGF0ZSBNYXN0ZXIgU3RhdGUgKi8KKyAgICAgICAgLyogQ2xlYXIgSEFMX0FEQ19TVEFURV9JTkpfQlVTWSBiaXQsIHNldCBIQUxfQURDX1NUQVRFX1JFQURZIGJpdCAqLworICAgICAgICBBRENfU1RBVEVfQ0xSX1NFVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9JTkpfQlVTWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUFEWSk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBpbmplY3RlZCAoTWFzdGVyIG9yIFNsYXZlKSBjb252ZXJzaW9ucyBhcmUgc3RpbGwgb24tZ29pbmcsCisgICAgICAgICAgIG5vIE1hc3RlciBTdGF0ZSBjaGFuZ2UgKi8KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoYWRjKTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiB0bXBfaGFsX3N0YXR1czsKK30KKyNlbmRpZiAvKiBBRENfTVVMVElNT0RFX1NVUFBPUlQgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgQURDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBBREMgRXh0ZW5kZWQgUGVyaXBoZXJhbCBDb250cm9sCitmdW5jdGlvbnMKKyAgKiBAYnJpZWYgICAgQURDIEV4dGVuZGVkIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBDb25maWd1cmUgY2hhbm5lbHMgb24gaW5qZWN0ZWQgZ3JvdXAKKyAgICAgICgrKSBDb25maWd1cmUgbXVsdGltb2RlIHdoZW4gbXVsdGltb2RlIGZlYXR1cmUgaXMgYXZhaWxhYmxlCisgICAgICAoKykgRW5hYmxlIG9yIERpc2FibGUgSW5qZWN0ZWQgUXVldWUKKyAgICAgICgrKSBEaXNhYmxlIEFEQyB2b2x0YWdlIHJlZ3VsYXRvcgorICAgICAgKCspIEVudGVyIEFEQyBkZWVwLXBvd2VyLWRvd24gbW9kZQorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAqIEBicmllZiAgQ29uZmlndXJlIGEgY2hhbm5lbCB0byBiZSBhc3NpZ25lZCB0byBBREMgZ3JvdXAgaW5qZWN0ZWQuCisgKiBAbm90ZSAgIFBvc3NpYmlsaXR5IHRvIHVwZGF0ZSBwYXJhbWV0ZXJzIG9uIHRoZSBmbHk6CisgKiAgICAgICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgaW5qZWN0ZWQgZ3JvdXAsIGZvbGxvd2luZyBjYWxscyB0byB0aGlzCisgKiAgICAgICAgIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHJlY29uZmlndXJlIHNvbWUgcGFyYW1ldGVycyBvZiBzdHJ1Y3R1cmUKKyAqICAgICAgICAgIkFEQ19JbmplY3Rpb25Db25mVHlwZURlZiIgb24gdGhlIGZseSwgd2l0aG91dCByZXNldHRpbmcgdGhlIEFEQy4KKyAqICAgICAgICAgVGhlIHNldHRpbmcgb2YgdGhlc2UgcGFyYW1ldGVycyBpcyBjb25kaXRpb25lZCB0byBBREMgc3RhdGU6CisgKiAgICAgICAgIFJlZmVyIHRvIGNvbW1lbnRzIG9mIHN0cnVjdHVyZSAiQURDX0luamVjdGlvbkNvbmZUeXBlRGVmIi4KKyAqIEBub3RlICAgSW4gY2FzZSBvZiB1c2FnZSBvZiBpbnRlcm5hbCBtZWFzdXJlbWVudCBjaGFubmVsczoKKyAqICAgICAgICAgVmJhdC9WcmVmSW50L1RlbXBTZW5zb3IuCisgKiAgICAgICAgIFRoZXNlIGludGVybmFsIHBhdGhzIGNhbiBiZSBkaXNhYmxlZCB1c2luZyBmdW5jdGlvbgorICogICAgICAgICBIQUxfQURDX0RlSW5pdCgpLgorICogQG5vdGUgICBDYXV0aW9uOiBGb3IgSW5qZWN0ZWQgQ29udGV4dCBRdWV1ZSB1c2UsIGEgY29udGV4dCBtdXN0IGJlIGZ1bGx5CisgKiAgICAgICAgIGRlZmluZWQgYmVmb3JlIHN0YXJ0IG9mIGluamVjdGVkIGNvbnZlcnNpb24uIEFsbCBjaGFubmVscyBhcmUKKyAqIGNvbmZpZ3VyZWQgY29uc2VjdXRpdmVseSBmb3IgdGhlIHNhbWUgQURDIGluc3RhbmNlLiBUaGVyZWZvcmUsIHRoZSBudW1iZXIgb2YKKyAqIGNhbGxzIHRvIEhBTF9BRENFeF9JbmplY3RlZENvbmZpZ0NoYW5uZWwoKSBtdXN0IGJlIGVxdWFsIHRvIHRoZSB2YWx1ZSBvZgorICogcGFyYW1ldGVyIEluamVjdGVkTmJyT2ZDb252ZXJzaW9uIGZvciBlYWNoIGNvbnRleHQuCisgKiAgLSBFeGFtcGxlIDE6IElmIDEgY29udGV4dCBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIChvciBpZiB0aGVyZSBpcyBubyB1c2Ugb2YKKyAqIHRoZSBJbmplY3RlZCBRdWV1ZSBDb250ZXh0IGZlYXR1cmUpIGFuZCBpZiB0aGUgY29udGV4dCBjb250YWlucyAzIGluamVjdGVkCisgKiByYW5rcyAoSW5qZWN0ZWROYnJPZkNvbnZlcnNpb24gPSAzKSwgSEFMX0FEQ0V4X0luamVjdGVkQ29uZmlnQ2hhbm5lbCgpIG11c3QKKyAqIGJlIGNhbGxlZCBvbmNlIGZvciBlYWNoIGNoYW5uZWwgKGkuZS4gMyB0aW1lcykgYmVmb3JlIHN0YXJ0aW5nIGEgY29udmVyc2lvbi4KKyAqICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgY2FsbGVkIHRvIGNvbmZpZ3VyZSBhIDR0aCBpbmplY3RlZCBjaGFubmVsOgorICogICAgaXQgd291bGQgc3RhcnQgYSBuZXcgY29udGV4dCBpbnRvIGNvbnRleHQgcXVldWUuCisgKiAgLSBFeGFtcGxlIDI6IElmIDIgY29udGV4dHMgYXJlIGludGVuZGVkIHRvIGJlIHVzZWQgYW5kIGVhY2ggb2YgdGhlbSBjb250YWlucworICogICAgMyBpbmplY3RlZCByYW5rcyAoSW5qZWN0ZWROYnJPZkNvbnZlcnNpb24gPSAzKSwKKyAqICAgIEhBTF9BRENFeF9JbmplY3RlZENvbmZpZ0NoYW5uZWwoKSBtdXN0IGJlIGNhbGxlZCBvbmNlIGZvciBlYWNoIGNoYW5uZWwgYW5kCisgKiAgICBmb3IgZWFjaCBjb250ZXh0ICgzIGNoYW5uZWxzIHggMiBjb250ZXh0cyA9IDYgY2FsbHMpLiBDb252ZXJzaW9uIGNhbgorICogICAgc3RhcnQgb25jZSB0aGUgMXN0IGNvbnRleHQgaXMgc2V0LCB0aGF0IGlzIGFmdGVyIHRoZSBmaXJzdCB0aHJlZQorICogICAgSEFMX0FEQ0V4X0luamVjdGVkQ29uZmlnQ2hhbm5lbCgpIGNhbGxzLiBUaGUgMm5kIGNvbnRleHQgY2FuIGJlIHNldCBvbiB0aGUKKyAqIGZseS4KKyAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUKKyAqIEBwYXJhbSBwQ29uZmlnSW5qZWN0ZWQgU3RydWN0dXJlIG9mIEFEQyBpbmplY3RlZCBncm91cCBhbmQgQURDIGNoYW5uZWwgZm9yCisgKiAgICAgICAgIGluamVjdGVkIGdyb3VwLgorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENFeF9JbmplY3RlZENvbmZpZ0NoYW5uZWwoCisgICAgQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMsIGNvbnN0IEFEQ19JbmplY3Rpb25Db25mVHlwZURlZiAqcENvbmZpZ0luamVjdGVkKSB7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHRtcF9oYWxfc3RhdHVzID0gSEFMX09LOworICB1aW50MzJfdCB0bXBfb2Zmc2V0X3NoaWZ0ZWQ7CisgIHVpbnQzMl90IHRtcF9jb25maWdfaW50ZXJuYWxfY2hhbm5lbDsKKyAgdWludDMyX3QgdG1wX2FkY19pc19jb252ZXJzaW9uX29uX2dvaW5nX3JlZ3VsYXI7CisgIHVpbnQzMl90IHRtcF9hZGNfaXNfY29udmVyc2lvbl9vbl9nb2luZ19pbmplY3RlZDsKKyAgX19JTyB1aW50MzJfdCB3YWl0X2xvb3BfaW5kZXggPSAwOworCisgIHVpbnQzMl90IHRtcF9qc3FyX2NvbnRleHRfcXVldWVfYmVpbmdfYnVpbHQgPSAwVTsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfQURDX1NBTVBMRV9USU1FKHBDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRTYW1wbGluZ1RpbWUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19TSU5HTEVfRElGRkVSRU5USUFMKHBDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRTaW5nbGVEaWZmKSk7CisgIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKHBDb25maWdJbmplY3RlZC0+QXV0b0luamVjdGVkQ29udikpOworICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShwQ29uZmlnSW5qZWN0ZWQtPlF1ZXVlSW5qZWN0ZWRDb250ZXh0KSk7CisgIGFzc2VydF9wYXJhbSgKKyAgICAgIElTX0FEQ19FWFRUUklHSU5KRUNfRURHRShwQ29uZmlnSW5qZWN0ZWQtPkV4dGVybmFsVHJpZ0luamVjQ29udkVkZ2UpKTsKKyAgYXNzZXJ0X3BhcmFtKAorICAgICAgSVNfQURDX0VYVFRSSUdJTkpFQyhoYWRjLCBwQ29uZmlnSW5qZWN0ZWQtPkV4dGVybmFsVHJpZ0luamVjQ29udikpOworICBhc3NlcnRfcGFyYW0oSVNfQURDX09GRlNFVF9OVU1CRVIocENvbmZpZ0luamVjdGVkLT5JbmplY3RlZE9mZnNldE51bWJlcikpOworICBhc3NlcnRfcGFyYW0oCisgICAgICBJU19BRENfUkFOR0UoQURDX0dFVF9SRVNPTFVUSU9OKGhhZGMpLCBwQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkT2Zmc2V0KSk7CisgIGFzc2VydF9wYXJhbShJU19BRENfT0ZGU0VUX1NJR04ocENvbmZpZ0luamVjdGVkLT5JbmplY3RlZE9mZnNldFNpZ24pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUocENvbmZpZ0luamVjdGVkLT5JbmplY3RlZE9mZnNldFNhdHVyYXRpb24pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUocENvbmZpZ0luamVjdGVkLT5JbmplY092ZXJzYW1wbGluZ01vZGUpKTsKKworICBpZiAoaGFkYy0+SW5pdC5TY2FuQ29udk1vZGUgIT0gQURDX1NDQU5fRElTQUJMRSkgeworICAgIGFzc2VydF9wYXJhbShJU19BRENfSU5KRUNURURfUkFOSyhwQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkUmFuaykpOworICAgIGFzc2VydF9wYXJhbSgKKyAgICAgICAgSVNfQURDX0lOSkVDVEVEX05CX0NPTlYocENvbmZpZ0luamVjdGVkLT5JbmplY3RlZE5ick9mQ29udmVyc2lvbikpOworICAgIGFzc2VydF9wYXJhbSgKKyAgICAgICAgSVNfRlVOQ1RJT05BTF9TVEFURShwQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkRGlzY29udGludW91c0NvbnZNb2RlKSk7CisgIH0KKworICAvKiBpZiBKT1ZTRSBpcyBzZXQsIHRoZSB2YWx1ZSBvZiB0aGUgT0ZGU0VUeV9FTiBiaXQgaW4gQURDeF9PRlJ5IHJlZ2lzdGVyIGlzCisgICAgIGlnbm9yZWQgKGNvbnNpZGVyZWQgYXMgcmVzZXQpICovCisgIGFzc2VydF9wYXJhbSghKChwQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkT2Zmc2V0TnVtYmVyICE9IEFEQ19PRkZTRVRfTk9ORSkgJiYKKyAgICAgICAgICAgICAgICAgKHBDb25maWdJbmplY3RlZC0+SW5qZWNPdmVyc2FtcGxpbmdNb2RlID09IEVOQUJMRSkpKTsKKworICAvKiBKRElTQ0VOIGFuZCBKQVVUTyBiaXRzIGNhbid0IGJlIHNldCBhdCB0aGUgc2FtZSB0aW1lICAqLworICBhc3NlcnRfcGFyYW0oISgocENvbmZpZ0luamVjdGVkLT5JbmplY3RlZERpc2NvbnRpbnVvdXNDb252TW9kZSA9PSBFTkFCTEUpICYmCisgICAgICAgICAgICAgICAgIChwQ29uZmlnSW5qZWN0ZWQtPkF1dG9JbmplY3RlZENvbnYgPT0gRU5BQkxFKSkpOworCisgIC8qICBESVNDRU4gYW5kIEpBVVRPIGJpdHMgY2FuJ3QgYmUgc2V0IGF0IHRoZSBzYW1lIHRpbWUgKi8KKyAgYXNzZXJ0X3BhcmFtKCEoKGhhZGMtPkluaXQuRGlzY29udGludW91c0NvbnZNb2RlID09IEVOQUJMRSkgJiYKKyAgICAgICAgICAgICAgICAgKHBDb25maWdJbmplY3RlZC0+QXV0b0luamVjdGVkQ29udiA9PSBFTkFCTEUpKSk7CisKKyAgLyogVmVyaWZpY2F0aW9uIG9mIGNoYW5uZWwgbnVtYmVyICovCisgIGlmIChwQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkU2luZ2xlRGlmZiAhPSBBRENfRElGRkVSRU5USUFMX0VOREVEKSB7CisgICAgYXNzZXJ0X3BhcmFtKElTX0FEQ19DSEFOTkVMKGhhZGMsIHBDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRDaGFubmVsKSk7CisgIH0gZWxzZSB7CisgICAgYXNzZXJ0X3BhcmFtKElTX0FEQ19ESUZGX0NIQU5ORUwoaGFkYywgcENvbmZpZ0luamVjdGVkLT5JbmplY3RlZENoYW5uZWwpKTsKKyAgfQorCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGFkYyk7CisKKyAgLyogQ29uZmlndXJhdGlvbiBvZiBpbmplY3RlZCBncm91cCBzZXF1ZW5jZXI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEhhcmR3YXJlIGNvbnN0cmFpbnQ6IE11c3QgZnVsbHkgZGVmaW5lIGluamVjdGVkIGNvbnRleHQgcmVnaXN0ZXIgSlNRUiAgICAqLworICAvKiBiZWZvcmUgbWFrZSBpdCBlbnRlcmluZyBpbnRvIGluamVjdGVkIHNlcXVlbmNlciBxdWV1ZS4gICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIC0gaWYgc2NhbiBtb2RlIGlzIGRpc2FibGVkOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAqIEluamVjdGVkIGNoYW5uZWxzIHNlcXVlbmNlIGxlbmd0aCBpcyBzZXQgdG8gMHgwMDogMSBjaGFubmVsICAgICAgICAgKi8KKyAgLyogICAgICBjb252ZXJ0ZWQgKGNoYW5uZWwgb24gaW5qZWN0ZWQgcmFuayAxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgUGFyYW1ldGVyICJJbmplY3RlZE5ick9mQ29udmVyc2lvbiIgaXMgZGlzY2FyZGVkLiAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAqIEluamVjdGVkIGNvbnRleHQgcmVnaXN0ZXIgSlNRUiBzZXR0aW5nIGlzIHNpbXBsZTogcmVnaXN0ZXIgaXMgZnVsbHkgKi8KKyAgLyogICAgICBkZWZpbmVkIG9uIG9uZSBjYWxsIG9mIHRoaXMgZnVuY3Rpb24gKGZvciBpbmplY3RlZCByYW5rIDEpIGFuZCBjYW4gICovCisgIC8qICAgICAgYmUgZW50ZXJlZCBpbnRvIHF1ZXVlIGRpcmVjdGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAtIGlmIHNjYW4gbW9kZSBpcyBlbmFibGVkOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgKiBJbmplY3RlZCBjaGFubmVscyBzZXF1ZW5jZSBsZW5ndGggaXMgc2V0IHRvIHBhcmFtZXRlciAgICAgICAgICAgICAgICovCisgIC8qICAgICAgIkluamVjdGVkTmJyT2ZDb252ZXJzaW9uIi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAqIEluamVjdGVkIGNvbnRleHQgcmVnaXN0ZXIgSlNRUiBzZXR0aW5nIG1vcmUgY29tcGxleDogcmVnaXN0ZXIgaXMgICAgKi8KKyAgLyogICAgICBmdWxseSBkZWZpbmVkIG92ZXIgc3VjY2Vzc2l2ZSBjYWxscyBvZiB0aGlzIGZ1bmN0aW9uLCBmb3IgZWFjaCAgICAgICovCisgIC8qICAgICAgaW5qZWN0ZWQgY2hhbm5lbCByYW5rLiBJdCBpcyBlbnRlcmVkIGludG8gcXVldWUgb25seSB3aGVuIGFsbCAgICAgICAqLworICAvKiAgICAgIGluamVjdGVkIHJhbmtzIGhhdmUgYmVlbiBzZXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBOb3RlOiBTY2FuIG1vZGUgaXMgbm90IHByZXNlbnQgYnkgaGFyZHdhcmUgb24gdGhpcyBkZXZpY2UsIGJ1dCB1c2VkICAgICovCisgIC8qICAgYnkgc29mdHdhcmUgZm9yIGFsaWdubWVudCBvdmVyIGFsbCBTVE0zMiBkZXZpY2VzLiAgICAgICAgICAgICAgICAgICAgICAqLworCisgIGlmICgoaGFkYy0+SW5pdC5TY2FuQ29udk1vZGUgPT0gQURDX1NDQU5fRElTQUJMRSkgfHwKKyAgICAgIChwQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkTmJyT2ZDb252ZXJzaW9uID09IDFVKSkgeworICAgIC8qIENvbmZpZ3VyYXRpb24gb2YgY29udGV4dCByZWdpc3RlciBKU1FSOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgLSBudW1iZXIgb2YgcmFua3MgaW4gaW5qZWN0ZWQgZ3JvdXAgc2VxdWVuY2VyOiBmaXhlZCB0byAxc3QgcmFuayAgICAgICovCisgICAgLyogICAgKHNjYW4gbW9kZSBkaXNhYmxlZCwgb25seSByYW5rIDEgdXNlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAtIGV4dGVybmFsIHRyaWdnZXIgdG8gc3RhcnQgY29udmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgLSBleHRlcm5hbCB0cmlnZ2VyIHBvbGFyaXR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogIC0gY2hhbm5lbCBzZXQgdG8gcmFuayAxIChzY2FuIG1vZGUgZGlzYWJsZWQsIG9ubHkgcmFuayAxIGNhbiBiZSB1c2VkKSAqLworCisgICAgaWYgKHBDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRSYW5rID09IEFEQ19JTkpFQ1RFRF9SQU5LXzEpIHsKKyAgICAgIC8qIEVuYWJsZSBleHRlcm5hbCB0cmlnZ2VyIGlmIHRyaWdnZXIgc2VsZWN0aW9uIGlzIGRpZmZlcmVudCBvZiAgICAgICAgICovCisgICAgICAvKiBzb2Z0d2FyZSBzdGFydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgLyogTm90ZTogVGhpcyBjb25maWd1cmF0aW9uIGtlZXBzIHRoZSBoYXJkd2FyZSBmZWF0dXJlIG9mIHBhcmFtZXRlciAgICAgKi8KKyAgICAgIC8qICAgICAgIEV4dGVybmFsVHJpZ0luamVjQ29udkVkZ2UgInRyaWdnZXIgZWRnZSBub25lIiBlcXVpdmFsZW50IHRvICAgICovCisgICAgICAvKiAgICAgICBzb2Z0d2FyZSBzdGFydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgaWYgKHBDb25maWdJbmplY3RlZC0+RXh0ZXJuYWxUcmlnSW5qZWNDb252ICE9CisgICAgICAgICAgQURDX0lOSkVDVEVEX1NPRlRXQVJFX1NUQVJUKSB7CisgICAgICAgIHRtcF9qc3FyX2NvbnRleHRfcXVldWVfYmVpbmdfYnVpbHQgPQorICAgICAgICAgICAgKEFEQ19KU1FSX1JLKHBDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19JTkpFQ1RFRF9SQU5LXzEpIHwKKyAgICAgICAgICAgICAocENvbmZpZ0luamVjdGVkLT5FeHRlcm5hbFRyaWdJbmplY0NvbnYgJiBBRENfSlNRUl9KRVhUU0VMKSB8CisgICAgICAgICAgICAgcENvbmZpZ0luamVjdGVkLT5FeHRlcm5hbFRyaWdJbmplY0NvbnZFZGdlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRtcF9qc3FyX2NvbnRleHRfcXVldWVfYmVpbmdfYnVpbHQgPSAoQURDX0pTUVJfUksoCisgICAgICAgICAgICBwQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkQ2hhbm5lbCwgQURDX0lOSkVDVEVEX1JBTktfMSkpOworICAgICAgfQorCisgICAgICBNT0RJRllfUkVHKGhhZGMtPkluc3RhbmNlLT5KU1FSLCBBRENfSlNRUl9GSUVMRFMsCisgICAgICAgICAgICAgICAgIHRtcF9qc3FyX2NvbnRleHRfcXVldWVfYmVpbmdfYnVpbHQpOworICAgICAgLyogRm9yIGRlYnVnIGFuZCBpbmZvcm1hdGl2ZSByZWFzb25zLCBoYWRjIGhhbmRsZSBzYXZlcyBKU1FSIHNldHRpbmcgKi8KKyAgICAgIGhhZGMtPkluamVjdGlvbkNvbmZpZy5Db250ZXh0UXVldWUgPSB0bXBfanNxcl9jb250ZXh0X3F1ZXVlX2JlaW5nX2J1aWx0OworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiBDYXNlIG9mIHNjYW4gbW9kZSBlbmFibGVkLCBzZXZlcmFsIGNoYW5uZWxzIHRvIHNldCBpbnRvIGluamVjdGVkIGdyb3VwICovCisgICAgLyogc2VxdWVuY2VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBQcm9jZWR1cmUgdG8gZGVmaW5lIGluamVjdGVkIGNvbnRleHQgcmVnaXN0ZXIgSlNRUiBvdmVyIHN1Y2Nlc3NpdmUgICAgICovCisgICAgLyogY2FsbHMgb2YgdGhpcyBmdW5jdGlvbiwgZm9yIGVhY2ggaW5qZWN0ZWQgY2hhbm5lbCByYW5rOiAgICAgICAgICAgICAgICAqLworICAgIC8qIDEuIFN0YXJ0IG5ldyBjb250ZXh0IGFuZCBzZXQgcGFyYW1ldGVycyByZWxhdGVkIHRvIGFsbCBpbmplY3RlZCAgICAgICAgKi8KKyAgICAvKiAgICBjaGFubmVsczogaW5qZWN0ZWQgc2VxdWVuY2UgbGVuZ3RoIGFuZCB0cmlnZ2VyLiAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAvKiBpZiBoYWRjLT5JbmplY3Rpb25Db25maWcuQ2hhbm5lbENvdW50IGlzIGVxdWFsIHRvIDAsIHRoaXMgaXMgdGhlIGZpcnN0ICovCisgICAgLyogICBjYWxsIG9mIHRoZSBjb250ZXh0IHVuZGVyIHNldHRpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmIChoYWRjLT5JbmplY3Rpb25Db25maWcuQ2hhbm5lbENvdW50ID09IDBVKSB7CisgICAgICAvKiBJbml0aWFsaXplIG51bWJlciBvZiBjaGFubmVscyB0aGF0IHdpbGwgYmUgY29uZmlndXJlZCBvbiB0aGUgY29udGV4dCAqLworICAgICAgLyogIGJlaW5nIGJ1aWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIGhhZGMtPkluamVjdGlvbkNvbmZpZy5DaGFubmVsQ291bnQgPQorICAgICAgICAgIHBDb25maWdJbmplY3RlZC0+SW5qZWN0ZWROYnJPZkNvbnZlcnNpb247CisgICAgICAvKiBIYW5kbGUgaGFkYyBzYXZlcyB0aGUgY29udGV4dCB1bmRlciBidWlsZCB1cCBvdmVyIGVhY2gKKyAgICAgICAgIEhBTF9BRENFeF9JbmplY3RlZENvbmZpZ0NoYW5uZWwoKSBjYWxsLCB0aGlzIGNvbnRleHQgd2lsbCBiZSB3cml0dGVuIGluCisgICAgICAgICBKU1FSIHJlZ2lzdGVyIGF0IHRoZSBsYXN0IGNhbGwuIEF0IHRoaXMgcG9pbnQsIHRoZSBjb250ZXh0IGlzIG1lcmVseQorICAgICAgICAgcmVzZXQgICovCisgICAgICBoYWRjLT5JbmplY3Rpb25Db25maWcuQ29udGV4dFF1ZXVlID0gMHgwMDAwMDAwMFU7CisKKyAgICAgIC8qIENvbmZpZ3VyYXRpb24gb2YgY29udGV4dCByZWdpc3RlciBKU1FSOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiAgLSBudW1iZXIgb2YgcmFua3MgaW4gaW5qZWN0ZWQgZ3JvdXAgc2VxdWVuY2VyICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgLyogIC0gZXh0ZXJuYWwgdHJpZ2dlciB0byBzdGFydCBjb252ZXJzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIC8qICAtIGV4dGVybmFsIHRyaWdnZXIgcG9sYXJpdHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgIC8qIEVuYWJsZSBleHRlcm5hbCB0cmlnZ2VyIGlmIHRyaWdnZXIgc2VsZWN0aW9uIGlzIGRpZmZlcmVudCBvZiAgICAgICAgICovCisgICAgICAvKiBzb2Z0d2FyZSBzdGFydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgLyogTm90ZTogVGhpcyBjb25maWd1cmF0aW9uIGtlZXBzIHRoZSBoYXJkd2FyZSBmZWF0dXJlIG9mIHBhcmFtZXRlciAgICAgKi8KKyAgICAgIC8qICAgICAgIEV4dGVybmFsVHJpZ0luamVjQ29udkVkZ2UgInRyaWdnZXIgZWRnZSBub25lIiBlcXVpdmFsZW50IHRvICAgICovCisgICAgICAvKiAgICAgICBzb2Z0d2FyZSBzdGFydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgaWYgKHBDb25maWdJbmplY3RlZC0+RXh0ZXJuYWxUcmlnSW5qZWNDb252ICE9CisgICAgICAgICAgQURDX0lOSkVDVEVEX1NPRlRXQVJFX1NUQVJUKSB7CisgICAgICAgIHRtcF9qc3FyX2NvbnRleHRfcXVldWVfYmVpbmdfYnVpbHQgPQorICAgICAgICAgICAgKChwQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkTmJyT2ZDb252ZXJzaW9uIC0gMVUpIHwKKyAgICAgICAgICAgICAocENvbmZpZ0luamVjdGVkLT5FeHRlcm5hbFRyaWdJbmplY0NvbnYgJiBBRENfSlNRUl9KRVhUU0VMKSB8CisgICAgICAgICAgICAgcENvbmZpZ0luamVjdGVkLT5FeHRlcm5hbFRyaWdJbmplY0NvbnZFZGdlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRtcF9qc3FyX2NvbnRleHRfcXVldWVfYmVpbmdfYnVpbHQgPQorICAgICAgICAgICAgKChwQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkTmJyT2ZDb252ZXJzaW9uIC0gMVUpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiAyLiBDb250aW51ZSBzZXR0aW5nIG9mIGNvbnRleHQgdW5kZXIgZGVmaW5pdGlvbiB3aXRoIHBhcmFtZXRlciAgICAgICAqLworICAgIC8qICAgIHJlbGF0ZWQgdG8gZWFjaCBjaGFubmVsOiBjaGFubmVsIHJhbmsgc2VxdWVuY2UgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogQ2xlYXIgdGhlIG9sZCBKU1F4IGJpdHMgZm9yIHRoZSBzZWxlY3RlZCByYW5rICovCisgICAgdG1wX2pzcXJfY29udGV4dF9xdWV1ZV9iZWluZ19idWlsdCAmPQorICAgICAgICB+QURDX0pTUVJfUksoQURDX1NRUjNfU1ExMCwgcENvbmZpZ0luamVjdGVkLT5JbmplY3RlZFJhbmspOworCisgICAgLyogU2V0IHRoZSBKU1F4IGJpdHMgZm9yIHRoZSBzZWxlY3RlZCByYW5rICovCisgICAgdG1wX2pzcXJfY29udGV4dF9xdWV1ZV9iZWluZ19idWlsdCB8PSBBRENfSlNRUl9SSygKKyAgICAgICAgcENvbmZpZ0luamVjdGVkLT5JbmplY3RlZENoYW5uZWwsIHBDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRSYW5rKTsKKworICAgIC8qIERlY3JlYXNlIGNoYW5uZWwgY291bnQgICovCisgICAgaGFkYy0+SW5qZWN0aW9uQ29uZmlnLkNoYW5uZWxDb3VudC0tOworCisgICAgLyogMy4gdG1wX2pzcXJfY29udGV4dF9xdWV1ZV9iZWluZ19idWlsdCBpcyBmdWxseSBidWlsdCBmb3IgdGhpcworICAgICAgIEhBTF9BRENFeF9JbmplY3RlZENvbmZpZ0NoYW5uZWwoKSBjYWxsLCBhZ2dyZWdhdGUgdGhlIHNldHRpbmcgdG8gdGhvc2UKKyAgICAgICBhbHJlYWR5IGJ1aWx0IGR1cmluZyB0aGUgcHJldmlvdXMgSEFMX0FEQ0V4X0luamVjdGVkQ29uZmlnQ2hhbm5lbCgpIGNhbGxzCisgICAgICAgKGZvciB0aGUgc2FtZSBjb250ZXh0IG9mIGNvdXJzZSkgICovCisgICAgaGFkYy0+SW5qZWN0aW9uQ29uZmlnLkNvbnRleHRRdWV1ZSB8PSB0bXBfanNxcl9jb250ZXh0X3F1ZXVlX2JlaW5nX2J1aWx0OworCisgICAgLyogNC4gRW5kIG9mIGNvbnRleHQgc2V0dGluZzogaWYgdGhpcyBpcyB0aGUgbGFzdCBjaGFubmVsIHNldCwgdGhlbiB3cml0ZQorICAgICAgIGNvbnRleHQgaW50byByZWdpc3RlciBKU1FSIGFuZCBtYWtlIGl0IGVudGVyIGludG8gcXVldWUgKi8KKyAgICBpZiAoaGFkYy0+SW5qZWN0aW9uQ29uZmlnLkNoYW5uZWxDb3VudCA9PSAwVSkgeworICAgICAgTU9ESUZZX1JFRyhoYWRjLT5JbnN0YW5jZS0+SlNRUiwgQURDX0pTUVJfRklFTERTLAorICAgICAgICAgICAgICAgICBoYWRjLT5JbmplY3Rpb25Db25maWcuQ29udGV4dFF1ZXVlKTsKKyAgICB9CisgIH0KKworICAvKiBQYXJhbWV0ZXJzIHVwZGF0ZSBjb25kaXRpb25lZCB0byBBREMgc3RhdGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogUGFyYW1ldGVycyB0aGF0IGNhbiBiZSB1cGRhdGVkIHdoZW4gQURDIGlzIGRpc2FibGVkIG9yIGVuYWJsZWQgd2l0aG91dCAgICovCisgIC8qIGNvbnZlcnNpb24gb24gZ29pbmcgb24gaW5qZWN0ZWQgZ3JvdXA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgLSBJbmplY3RlZCBjb250ZXh0IHF1ZXVlOiBRdWV1ZSBkaXNhYmxlIChhY3RpdmUgY29udGV4dCBpcyBrZXB0KSBvciAgICAgKi8KKyAgLyogICAgZW5hYmxlIChjb250ZXh0IGRlY3JlbWVudGVkLCB1cCB0byAyIGNvbnRleHRzIHF1ZXVlZCkgICAgICAgICAgICAgICAgICovCisgIC8qICAtIEluamVjdGVkIGRpc2NvbnRpbnVvdXMgbW9kZTogY2FuIGJlIGVuYWJsZWQgb25seSBpZiBhdXRvLWluamVjdGVkICAgICAqLworICAvKiAgICBtb2RlIGlzIGRpc2FibGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaWYgKExMX0FEQ19JTkpfSXNDb252ZXJzaW9uT25nb2luZyhoYWRjLT5JbnN0YW5jZSkgPT0gMFVMKSB7CisgICAgLyogSWYgYXV0by1pbmplY3RlZCBtb2RlIGlzIGRpc2FibGVkOiBubyBjb25zdHJhaW50ICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmIChwQ29uZmlnSW5qZWN0ZWQtPkF1dG9JbmplY3RlZENvbnYgPT0gRElTQUJMRSkgeworICAgICAgTU9ESUZZX1JFRygKKyAgICAgICAgICBoYWRjLT5JbnN0YW5jZS0+Q0ZHUiwgQURDX0NGR1JfSlFNIHwgQURDX0NGR1JfSkRJU0NFTiwKKyAgICAgICAgICBBRENfQ0ZHUl9JTkpFQ1RfQ09OVEVYVF9RVUVVRSgKKyAgICAgICAgICAgICAgKHVpbnQzMl90KXBDb25maWdJbmplY3RlZC0+UXVldWVJbmplY3RlZENvbnRleHQpIHwKKyAgICAgICAgICAgICAgQURDX0NGR1JfSU5KRUNUX0RJU0NDT05USU5VT1VTKAorICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KXBDb25maWdJbmplY3RlZC0+SW5qZWN0ZWREaXNjb250aW51b3VzQ29udk1vZGUpKTsKKyAgICB9CisgICAgLyogSWYgYXV0by1pbmplY3RlZCBtb2RlIGlzIGVuYWJsZWQ6IEluamVjdGVkIGRpc2NvbnRpbnVvdXMgc2V0dGluZyBpcyAgICAqLworICAgIC8qIGRpc2NhcmRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBlbHNlIHsKKyAgICAgIE1PRElGWV9SRUcoaGFkYy0+SW5zdGFuY2UtPkNGR1IsIEFEQ19DRkdSX0pRTSB8IEFEQ19DRkdSX0pESVNDRU4sCisgICAgICAgICAgICAgICAgIEFEQ19DRkdSX0lOSkVDVF9DT05URVhUX1FVRVVFKAorICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KXBDb25maWdJbmplY3RlZC0+UXVldWVJbmplY3RlZENvbnRleHQpKTsKKyAgICB9CisgIH0KKworICAvKiBQYXJhbWV0ZXJzIHVwZGF0ZSBjb25kaXRpb25lZCB0byBBREMgc3RhdGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogUGFyYW1ldGVycyB0aGF0IGNhbiBiZSB1cGRhdGVkIHdoZW4gQURDIGlzIGRpc2FibGVkIG9yIGVuYWJsZWQgd2l0aG91dCAgICovCisgIC8qIGNvbnZlcnNpb24gb24gZ29pbmcgb24gcmVndWxhciBhbmQgaW5qZWN0ZWQgZ3JvdXBzOiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgLSBBdXRvbWF0aWMgaW5qZWN0ZWQgY29udmVyc2lvbjogY2FuIGJlIGVuYWJsZWQgaWYgaW5qZWN0ZWQgZ3JvdXAgICAgICAgKi8KKyAgLyogICAgZXh0ZXJuYWwgdHJpZ2dlcnMgYXJlIGRpc2FibGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAtIENoYW5uZWwgc2FtcGxpbmcgdGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgLSBDaGFubmVsIG9mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdG1wX2FkY19pc19jb252ZXJzaW9uX29uX2dvaW5nX3JlZ3VsYXIgPQorICAgICAgTExfQURDX1JFR19Jc0NvbnZlcnNpb25PbmdvaW5nKGhhZGMtPkluc3RhbmNlKTsKKyAgdG1wX2FkY19pc19jb252ZXJzaW9uX29uX2dvaW5nX2luamVjdGVkID0KKyAgICAgIExMX0FEQ19JTkpfSXNDb252ZXJzaW9uT25nb2luZyhoYWRjLT5JbnN0YW5jZSk7CisKKyAgaWYgKCh0bXBfYWRjX2lzX2NvbnZlcnNpb25fb25fZ29pbmdfcmVndWxhciA9PSAwVUwpICYmCisgICAgICAodG1wX2FkY19pc19jb252ZXJzaW9uX29uX2dvaW5nX2luamVjdGVkID09IDBVTCkpIHsKKyAgICAvKiBJZiBpbmplY3RlZCBncm91cCBleHRlcm5hbCB0cmlnZ2VycyBhcmUgZGlzYWJsZWQgKHNldCB0byBpbmplY3RlZCAgICAgICovCisgICAgLyogc29mdHdhcmUgc3RhcnQpOiBubyBjb25zdHJhaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmICgocENvbmZpZ0luamVjdGVkLT5FeHRlcm5hbFRyaWdJbmplY0NvbnYgPT0KKyAgICAgICAgIEFEQ19JTkpFQ1RFRF9TT0ZUV0FSRV9TVEFSVCkgfHwKKyAgICAgICAgKHBDb25maWdJbmplY3RlZC0+RXh0ZXJuYWxUcmlnSW5qZWNDb252RWRnZSA9PQorICAgICAgICAgQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9FREdFX05PTkUpKSB7CisgICAgICBpZiAocENvbmZpZ0luamVjdGVkLT5BdXRvSW5qZWN0ZWRDb252ID09IEVOQUJMRSkgeworICAgICAgICBTRVRfQklUKGhhZGMtPkluc3RhbmNlLT5DRkdSLCBBRENfQ0ZHUl9KQVVUTyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPkNGR1IsIEFEQ19DRkdSX0pBVVRPKTsKKyAgICAgIH0KKyAgICB9CisgICAgLyogSWYgQXV0b21hdGljIGluamVjdGVkIGNvbnZlcnNpb24gd2FzIGludGVuZGVkIHRvIGJlIHNldCBhbmQgY291bGQgbm90ICAqLworICAgIC8qIGR1ZSB0byBpbmplY3RlZCBncm91cCBleHRlcm5hbCB0cmlnZ2VycyBlbmFibGVkLCBlcnJvciBpcyByZXBvcnRlZC4gICAgKi8KKyAgICBlbHNlIHsKKyAgICAgIGlmIChwQ29uZmlnSW5qZWN0ZWQtPkF1dG9JbmplY3RlZENvbnYgPT0gRU5BQkxFKSB7CisgICAgICAgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSB0byBlcnJvciAqLworICAgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0VSUk9SX0NPTkZJRyk7CisKKyAgICAgICAgdG1wX2hhbF9zdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICB9IGVsc2UgeworICAgICAgICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPkNGR1IsIEFEQ19DRkdSX0pBVVRPKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocENvbmZpZ0luamVjdGVkLT5JbmplY092ZXJzYW1wbGluZ01vZGUgPT0gRU5BQkxFKSB7CisgICAgICBhc3NlcnRfcGFyYW0oCisgICAgICAgICAgSVNfQURDX09WRVJTQU1QTElOR19SQVRJTyhwQ29uZmlnSW5qZWN0ZWQtPkluamVjT3ZlcnNhbXBsaW5nLlJhdGlvKSk7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfQURDX1JJR0hUX0JJVF9TSElGVCgKKyAgICAgICAgICBwQ29uZmlnSW5qZWN0ZWQtPkluamVjT3ZlcnNhbXBsaW5nLlJpZ2h0Qml0U2hpZnQpKTsKKworICAgICAgLyogIEpPVlNFIG11c3QgYmUgcmVzZXQgaW4gY2FzZSBvZiB0cmlnZ2VyZWQgcmVndWxhciBtb2RlICAqLworICAgICAgYXNzZXJ0X3BhcmFtKCEoCisgICAgICAgICAgUkVBRF9CSVQoaGFkYy0+SW5zdGFuY2UtPkNGR1IyLCBBRENfQ0ZHUjJfUk9WU0UgfCBBRENfQ0ZHUjJfVFJPVlMpID09CisgICAgICAgICAgKEFEQ19DRkdSMl9ST1ZTRSB8IEFEQ19DRkdSMl9UUk9WUykpKTsKKworICAgICAgLyogQ29uZmlndXJhdGlvbiBvZiBJbmplY3RlZCBPdmVyc2FtcGxlcjogKi8KKyAgICAgIC8qICAtIE92ZXJzYW1wbGluZyBSYXRpbyAqLworICAgICAgLyogIC0gUmlnaHQgYml0IHNoaWZ0ICovCisKKyAgICAgIC8qIEVuYWJsZSBPdmVyU2FtcGxpbmcgbW9kZSAqLworICAgICAgTU9ESUZZX1JFRyhoYWRjLT5JbnN0YW5jZS0+Q0ZHUjIsCisgICAgICAgICAgICAgICAgIEFEQ19DRkdSMl9KT1ZTRSB8IEFEQ19DRkdSMl9PVlNSIHwgQURDX0NGR1IyX09WU1MsCisgICAgICAgICAgICAgICAgIEFEQ19DRkdSMl9KT1ZTRSB8IHBDb25maWdJbmplY3RlZC0+SW5qZWNPdmVyc2FtcGxpbmcuUmF0aW8gfAorICAgICAgICAgICAgICAgICAgICAgcENvbmZpZ0luamVjdGVkLT5JbmplY092ZXJzYW1wbGluZy5SaWdodEJpdFNoaWZ0KTsKKyAgICB9IGVsc2UgeworICAgICAgLyogRGlzYWJsZSBSZWd1bGFyIE92ZXJTYW1wbGluZyAqLworICAgICAgQ0xFQVJfQklUKGhhZGMtPkluc3RhbmNlLT5DRkdSMiwgQURDX0NGR1IyX0pPVlNFKTsKKyAgICB9CisKKyAgICAvKiBNYW5hZ2Ugc3BlY2lmaWMgY2FzZSBvZiBzYW1wbGluZyB0aW1lIDMuNSBjeWNsZXMgcmVwbGFjaW5nIDIuNSBjeWxlcyAqLworICAgIGlmIChwQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkU2FtcGxpbmdUaW1lID09IEFEQ19TQU1QTEVUSU1FXzNDWUNMRVNfNSkgeworICAgICAgLyogU2V0IHNhbXBsaW5nIHRpbWUgb2YgdGhlIHNlbGVjdGVkIEFEQyBjaGFubmVsICovCisgICAgICBMTF9BRENfU2V0Q2hhbm5lbFNhbXBsaW5nVGltZShoYWRjLT5JbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfQURDX1NBTVBMSU5HVElNRV8yQ1lDTEVTXzUpOworCisgICAgICAvKiBTZXQgQURDIHNhbXBsaW5nIHRpbWUgY29tbW9uIGNvbmZpZ3VyYXRpb24gKi8KKyAgICAgIExMX0FEQ19TZXRTYW1wbGluZ1RpbWVDb21tb25Db25maWcoCisgICAgICAgICAgaGFkYy0+SW5zdGFuY2UsIExMX0FEQ19TQU1QTElOR1RJTUVfQ09NTU9OXzNDNV9SRVBMXzJDNSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIFNldCBzYW1wbGluZyB0aW1lIG9mIHRoZSBzZWxlY3RlZCBBREMgY2hhbm5lbCAqLworICAgICAgTExfQURDX1NldENoYW5uZWxTYW1wbGluZ1RpbWUoaGFkYy0+SW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRTYW1wbGluZ1RpbWUpOworCisgICAgICAvKiBTZXQgQURDIHNhbXBsaW5nIHRpbWUgY29tbW9uIGNvbmZpZ3VyYXRpb24gKi8KKyAgICAgIExMX0FEQ19TZXRTYW1wbGluZ1RpbWVDb21tb25Db25maWcoaGFkYy0+SW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX0FEQ19TQU1QTElOR1RJTUVfQ09NTU9OX0RFRkFVTFQpOworICAgIH0KKworICAgIC8qIENvbmZpZ3VyZSB0aGUgb2Zmc2V0OiBvZmZzZXQgZW5hYmxlL2Rpc2FibGUsIGNoYW5uZWwsIG9mZnNldCB2YWx1ZSAqLworCisgICAgLyogU2hpZnQgdGhlIG9mZnNldCB3aXRoIHJlc3BlY3QgdG8gdGhlIHNlbGVjdGVkIEFEQyByZXNvbHV0aW9uLiAqLworICAgIC8qIE9mZnNldCBoYXMgdG8gYmUgbGVmdC1hbGlnbmVkIG9uIGJpdCAxMSwgdGhlIExTQiAocmlnaHQgYml0cykgYXJlIHNldCB0bworICAgICAqIDAgKi8KKyAgICB0bXBfb2Zmc2V0X3NoaWZ0ZWQgPQorICAgICAgICBBRENfT0ZGU0VUX1NISUZUX1JFU09MVVRJT04oaGFkYywgcENvbmZpZ0luamVjdGVkLT5JbmplY3RlZE9mZnNldCk7CisKKyAgICBpZiAocENvbmZpZ0luamVjdGVkLT5JbmplY3RlZE9mZnNldE51bWJlciAhPSBBRENfT0ZGU0VUX05PTkUpIHsKKyAgICAgIC8qIFNldCBBREMgc2VsZWN0ZWQgb2Zmc2V0IG51bWJlciAqLworICAgICAgTExfQURDX1NldE9mZnNldChoYWRjLT5JbnN0YW5jZSwgcENvbmZpZ0luamVjdGVkLT5JbmplY3RlZE9mZnNldE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgcENvbmZpZ0luamVjdGVkLT5JbmplY3RlZENoYW5uZWwsIHRtcF9vZmZzZXRfc2hpZnRlZCk7CisKKyAgICAgIC8qIFNldCBBREMgc2VsZWN0ZWQgb2Zmc2V0IHNpZ24gJiBzYXR1cmF0aW9uICovCisgICAgICBMTF9BRENfU2V0T2Zmc2V0U2lnbihoYWRjLT5JbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRPZmZzZXROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkT2Zmc2V0U2lnbik7CisgICAgICBMTF9BRENfU2V0T2Zmc2V0U2F0dXJhdGlvbigKKyAgICAgICAgICBoYWRjLT5JbnN0YW5jZSwgcENvbmZpZ0luamVjdGVkLT5JbmplY3RlZE9mZnNldE51bWJlciwKKyAgICAgICAgICAocENvbmZpZ0luamVjdGVkLT5JbmplY3RlZE9mZnNldFNhdHVyYXRpb24gPT0gRU5BQkxFKQorICAgICAgICAgICAgICA/IExMX0FEQ19PRkZTRVRfU0FUVVJBVElPTl9FTkFCTEUKKyAgICAgICAgICAgICAgOiBMTF9BRENfT0ZGU0VUX1NBVFVSQVRJT05fRElTQUJMRSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIFNjYW4gZWFjaCBvZmZzZXQgcmVnaXN0ZXIgdG8gY2hlY2sgaWYgdGhlIHNlbGVjdGVkIGNoYW5uZWwgaXMgdGFyZ2V0ZWQuCisgICAgICAgKi8KKyAgICAgIC8qIElmIHRoaXMgaXMgdGhlIGNhc2UsIHRoZSBjb3JyZXNwb25kaW5nIG9mZnNldCBudW1iZXIgaXMgZGlzYWJsZWQuICovCisgICAgICBpZiAoX19MTF9BRENfQ0hBTk5FTF9UT19ERUNJTUFMX05CKAorICAgICAgICAgICAgICBMTF9BRENfR2V0T2Zmc2V0Q2hhbm5lbChoYWRjLT5JbnN0YW5jZSwgTExfQURDX09GRlNFVF8xKSkgPT0KKyAgICAgICAgICBfX0xMX0FEQ19DSEFOTkVMX1RPX0RFQ0lNQUxfTkIocENvbmZpZ0luamVjdGVkLT5JbmplY3RlZENoYW5uZWwpKSB7CisgICAgICAgIExMX0FEQ19TZXRPZmZzZXRTdGF0ZShoYWRjLT5JbnN0YW5jZSwgTExfQURDX09GRlNFVF8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfQURDX09GRlNFVF9ESVNBQkxFKTsKKyAgICAgIH0KKyAgICAgIGlmIChfX0xMX0FEQ19DSEFOTkVMX1RPX0RFQ0lNQUxfTkIoCisgICAgICAgICAgICAgIExMX0FEQ19HZXRPZmZzZXRDaGFubmVsKGhhZGMtPkluc3RhbmNlLCBMTF9BRENfT0ZGU0VUXzIpKSA9PQorICAgICAgICAgIF9fTExfQURDX0NIQU5ORUxfVE9fREVDSU1BTF9OQihwQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkQ2hhbm5lbCkpIHsKKyAgICAgICAgTExfQURDX1NldE9mZnNldFN0YXRlKGhhZGMtPkluc3RhbmNlLCBMTF9BRENfT0ZGU0VUXzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTF9BRENfT0ZGU0VUX0RJU0FCTEUpOworICAgICAgfQorICAgICAgaWYgKF9fTExfQURDX0NIQU5ORUxfVE9fREVDSU1BTF9OQigKKyAgICAgICAgICAgICAgTExfQURDX0dldE9mZnNldENoYW5uZWwoaGFkYy0+SW5zdGFuY2UsIExMX0FEQ19PRkZTRVRfMykpID09CisgICAgICAgICAgX19MTF9BRENfQ0hBTk5FTF9UT19ERUNJTUFMX05CKHBDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRDaGFubmVsKSkgeworICAgICAgICBMTF9BRENfU2V0T2Zmc2V0U3RhdGUoaGFkYy0+SW5zdGFuY2UsIExMX0FEQ19PRkZTRVRfMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX0FEQ19PRkZTRVRfRElTQUJMRSk7CisgICAgICB9CisgICAgICBpZiAoX19MTF9BRENfQ0hBTk5FTF9UT19ERUNJTUFMX05CKAorICAgICAgICAgICAgICBMTF9BRENfR2V0T2Zmc2V0Q2hhbm5lbChoYWRjLT5JbnN0YW5jZSwgTExfQURDX09GRlNFVF80KSkgPT0KKyAgICAgICAgICBfX0xMX0FEQ19DSEFOTkVMX1RPX0RFQ0lNQUxfTkIocENvbmZpZ0luamVjdGVkLT5JbmplY3RlZENoYW5uZWwpKSB7CisgICAgICAgIExMX0FEQ19TZXRPZmZzZXRTdGF0ZShoYWRjLT5JbnN0YW5jZSwgTExfQURDX09GRlNFVF80LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfQURDX09GRlNFVF9ESVNBQkxFKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBQYXJhbWV0ZXJzIHVwZGF0ZSBjb25kaXRpb25lZCB0byBBREMgc3RhdGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogUGFyYW1ldGVycyB0aGF0IGNhbiBiZSB1cGRhdGVkIG9ubHkgd2hlbiBBREMgaXMgZGlzYWJsZWQ6ICAgICAgICAgICAgICAgICovCisgIC8qICAtIFNpbmdsZSBvciBkaWZmZXJlbnRpYWwgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpZiAoTExfQURDX0lzRW5hYmxlZChoYWRjLT5JbnN0YW5jZSkgPT0gMFVMKSB7CisgICAgLyogU2V0IG1vZGUgc2luZ2xlLWVuZGVkIG9yIGRpZmZlcmVudGlhbCBpbnB1dCBvZiB0aGUgc2VsZWN0ZWQgQURDIGNoYW5uZWwKKyAgICAgKi8KKyAgICBMTF9BRENfU2V0Q2hhbm5lbFNpbmdsZURpZmYoaGFkYy0+SW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkU2luZ2xlRGlmZik7CisKKyAgICAvKiBDb25maWd1cmF0aW9uIG9mIGRpZmZlcmVudGlhbCBtb2RlICovCisgICAgLyogTm90ZTogQURDIGNoYW5uZWwgbnVtYmVyIG1hc2tlZCB3aXRoIHZhbHVlICIweDFGIiB0byBlbnN1cmUgc2hpZnQgdmFsdWUKKyAgICAgKiB3aXRoaW4gMzIgYml0cyByYW5nZSAqLworICAgIGlmIChwQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkU2luZ2xlRGlmZiA9PSBBRENfRElGRkVSRU5USUFMX0VOREVEKSB7CisgICAgICAvKiBTZXQgc2FtcGxpbmcgdGltZSBvZiB0aGUgc2VsZWN0ZWQgQURDIGNoYW5uZWwgKi8KKyAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lKAorICAgICAgICAgIGhhZGMtPkluc3RhbmNlLAorICAgICAgICAgICh1aW50MzJfdCkoX19MTF9BRENfREVDSU1BTF9OQl9UT19DSEFOTkVMKAorICAgICAgICAgICAgICAoX19MTF9BRENfQ0hBTk5FTF9UT19ERUNJTUFMX05CKAorICAgICAgICAgICAgICAgICAgICh1aW50MzJfdClwQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkQ2hhbm5lbCkgKworICAgICAgICAgICAgICAgMVVMKSAmCisgICAgICAgICAgICAgIDB4MUZVTCkpLAorICAgICAgICAgIHBDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRTYW1wbGluZ1RpbWUpOworICAgIH0KKyAgfQorCisgIC8qIE1hbmFnZW1lbnQgb2YgaW50ZXJuYWwgbWVhc3VyZW1lbnQgY2hhbm5lbHM6IFZiYXQvVnJlZkludC9UZW1wU2Vuc29yICAgKi8KKyAgLyogaW50ZXJuYWwgbWVhc3VyZW1lbnQgcGF0aHMgZW5hYmxlOiBJZiBpbnRlcm5hbCBjaGFubmVsIHNlbGVjdGVkLCAgICAgICAqLworICAvKiBlbmFibGUgZGVkaWNhdGVkIGludGVybmFsIGJ1ZmZlcnMgYW5kIHBhdGguICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE5vdGU6IHRoZXNlIGludGVybmFsIG1lYXN1cmVtZW50IHBhdGhzIGNhbiBiZSBkaXNhYmxlZCB1c2luZyAgICAgICAgICAgKi8KKyAgLyogSEFMX0FEQ19EZUluaXQoKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIGlmIChfX0xMX0FEQ19JU19DSEFOTkVMX0lOVEVSTkFMKHBDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRDaGFubmVsKSkgeworICAgIHRtcF9jb25maWdfaW50ZXJuYWxfY2hhbm5lbCA9IExMX0FEQ19HZXRDb21tb25QYXRoSW50ZXJuYWxDaCgKKyAgICAgICAgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7CisKKyAgICAvKiBJZiB0aGUgcmVxdWVzdGVkIGludGVybmFsIG1lYXN1cmVtZW50IHBhdGggaGFzIGFscmVhZHkgYmVlbiBlbmFibGVkLCAgICovCisgICAgLyogYnlwYXNzIHRoZSBjb25maWd1cmF0aW9uIHByb2Nlc3NpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmICgoKHBDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRDaGFubmVsID09IEFEQ19DSEFOTkVMX1RFTVBTRU5TT1JfQURDMSkgfHwKKyAgICAgICAgIChwQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkQ2hhbm5lbCA9PSBBRENfQ0hBTk5FTF9URU1QU0VOU09SX0FEQzUpKSAmJgorICAgICAgICAoKHRtcF9jb25maWdfaW50ZXJuYWxfY2hhbm5lbCAmIExMX0FEQ19QQVRIX0lOVEVSTkFMX1RFTVBTRU5TT1IpID09CisgICAgICAgICAwVUwpKSB7CisgICAgICBpZiAoQURDX1RFTVBFUkFUVVJFX1NFTlNPUl9JTlNUQU5DRShoYWRjKSkgeworICAgICAgICBMTF9BRENfU2V0Q29tbW9uUGF0aEludGVybmFsQ2goCisgICAgICAgICAgICBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpLAorICAgICAgICAgICAgTExfQURDX1BBVEhfSU5URVJOQUxfVEVNUFNFTlNPUiB8IHRtcF9jb25maWdfaW50ZXJuYWxfY2hhbm5lbCk7CisKKyAgICAgICAgLyogRGVsYXkgZm9yIHRlbXBlcmF0dXJlIHNlbnNvciBzdGFiaWxpemF0aW9uIHRpbWUgKi8KKyAgICAgICAgLyogV2FpdCBsb29wIGluaXRpYWxpemF0aW9uIGFuZCBleGVjdXRpb24gKi8KKyAgICAgICAgLyogTm90ZTogVmFyaWFibGUgZGl2aWRlZCBieSAyIHRvIGNvbXBlbnNhdGUgcGFydGlhbGx5ICAgICAgICAgICAgICAqLworICAgICAgICAvKiAgICAgICBDUFUgcHJvY2Vzc2luZyBjeWNsZXMsIHNjYWxpbmcgaW4gdXMgc3BsaXQgdG8gbm90ICAgICAgICAgICovCisgICAgICAgIC8qICAgICAgIGV4Y2VlZCAzMiBiaXRzIHJlZ2lzdGVyIGNhcGFjaXR5IGFuZCBoYW5kbGUgbG93IGZyZXF1ZW5jeS4gKi8KKyAgICAgICAgd2FpdF9sb29wX2luZGV4ID0KKyAgICAgICAgICAgICgoTExfQURDX0RFTEFZX1RFTVBTRU5TT1JfU1RBQl9VUyAvIDEwVUwpICoKKyAgICAgICAgICAgICAoKChTeXN0ZW1Db3JlQ2xvY2sgLyAoMTAwMDAwVUwgKiAyVUwpKSArIDFVTCkgKyAxVUwpKTsKKyAgICAgICAgd2hpbGUgKHdhaXRfbG9vcF9pbmRleCAhPSAwVUwpIHsKKyAgICAgICAgICB3YWl0X2xvb3BfaW5kZXgtLTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSBpZiAoKHBDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRDaGFubmVsID09IEFEQ19DSEFOTkVMX1ZCQVQpICYmCisgICAgICAgICAgICAgICAoKHRtcF9jb25maWdfaW50ZXJuYWxfY2hhbm5lbCAmIExMX0FEQ19QQVRIX0lOVEVSTkFMX1ZCQVQpID09CisgICAgICAgICAgICAgICAgMFVMKSkgeworICAgICAgaWYgKEFEQ19CQVRURVJZX1ZPTFRBR0VfSU5TVEFOQ0UoaGFkYykpIHsKKyAgICAgICAgTExfQURDX1NldENvbW1vblBhdGhJbnRlcm5hbENoKAorICAgICAgICAgICAgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSwKKyAgICAgICAgICAgIExMX0FEQ19QQVRIX0lOVEVSTkFMX1ZCQVQgfCB0bXBfY29uZmlnX2ludGVybmFsX2NoYW5uZWwpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoKHBDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRDaGFubmVsID09IEFEQ19DSEFOTkVMX1ZSRUZJTlQpICYmCisgICAgICAgICAgICAgICAoKHRtcF9jb25maWdfaW50ZXJuYWxfY2hhbm5lbCAmIExMX0FEQ19QQVRIX0lOVEVSTkFMX1ZSRUZJTlQpID09CisgICAgICAgICAgICAgICAgMFVMKSkgeworICAgICAgaWYgKEFEQ19WUkVGSU5UX0lOU1RBTkNFKGhhZGMpKSB7CisgICAgICAgIExMX0FEQ19TZXRDb21tb25QYXRoSW50ZXJuYWxDaCgKKyAgICAgICAgICAgIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSksCisgICAgICAgICAgICBMTF9BRENfUEFUSF9JTlRFUk5BTF9WUkVGSU5UIHwgdG1wX2NvbmZpZ19pbnRlcm5hbF9jaGFubmVsKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLyogbm90aGluZyB0byBkbyAqLworICAgIH0KKyAgfQorCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhhZGMpOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHRtcF9oYWxfc3RhdHVzOworfQorCisjaWYgZGVmaW5lZChBRENfTVVMVElNT0RFX1NVUFBPUlQpCisvKioKKyAqIEBicmllZiAgRW5hYmxlIEFEQyBtdWx0aW1vZGUgYW5kIGNvbmZpZ3VyZSBtdWx0aW1vZGUgcGFyYW1ldGVycworICogQG5vdGUgICBQb3NzaWJpbGl0eSB0byB1cGRhdGUgcGFyYW1ldGVycyBvbiB0aGUgZmx5OgorICogICAgICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIG11bHRpbW9kZSBwYXJhbWV0ZXJzLCBmb2xsb3dpbmcKKyAqICAgICAgICAgY2FsbHMgdG8gdGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byByZWNvbmZpZ3VyZSBzb21lIHBhcmFtZXRlcnMKKyAqICAgICAgICAgb2Ygc3RydWN0dXJlICJBRENfTXVsdGlNb2RlVHlwZURlZiIgb24gdGhlIGZseSwgd2l0aG91dCByZXNldHRpbmcKKyAqICAgICAgICAgdGhlIEFEQ3MuCisgKiAgICAgICAgIFRoZSBzZXR0aW5nIG9mIHRoZXNlIHBhcmFtZXRlcnMgaXMgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlLgorICogICAgICAgICBGb3IgcGFyYW1ldGVycyBjb25zdHJhaW50cywgc2VlIGNvbW1lbnRzIG9mIHN0cnVjdHVyZQorICogICAgICAgICAiQURDX011bHRpTW9kZVR5cGVEZWYiLgorICogQG5vdGUgICBUbyBtb3ZlIGJhY2sgY29uZmlndXJhdGlvbiBmcm9tIG11bHRpbW9kZSB0byBzaW5nbGUgbW9kZSwgQURDIG11c3QKKyAqICAgICAgICAgYmUgcmVzZXQgKHVzaW5nIGZ1bmN0aW9uIEhBTF9BRENfSW5pdCgpICkuCisgKiBAcGFyYW0gaGFkYyBNYXN0ZXIgQURDIGhhbmRsZQorICogQHBhcmFtIHBNdWx0aW1vZGUgU3RydWN0dXJlIG9mIEFEQyBtdWx0aW1vZGUgY29uZmlndXJhdGlvbgorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENFeF9NdWx0aU1vZGVDb25maWdDaGFubmVsKAorICAgIEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjLCBjb25zdCBBRENfTXVsdGlNb2RlVHlwZURlZiAqcE11bHRpbW9kZSkgeworICBIQUxfU3RhdHVzVHlwZURlZiB0bXBfaGFsX3N0YXR1cyA9IEhBTF9PSzsKKyAgQURDX0NvbW1vbl9UeXBlRGVmICp0bXBBRENfQ29tbW9uOworICBBRENfSGFuZGxlVHlwZURlZiB0bXBfaGFkY19zbGF2ZTsKKyAgdWludDMyX3QgdG1wX2hhZGNfc2xhdmVfY29udmVyc2lvbl9vbl9nb2luZzsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX01VTFRJTU9ERV9NQVNURVJfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19NVUxUSU1PREUocE11bHRpbW9kZS0+TW9kZSkpOworICBpZiAocE11bHRpbW9kZS0+TW9kZSAhPSBBRENfTU9ERV9JTkRFUEVOREVOVCkgeworICAgIGFzc2VydF9wYXJhbShJU19BRENfRE1BX0FDQ0VTU19NVUxUSU1PREUocE11bHRpbW9kZS0+RE1BQWNjZXNzTW9kZSkpOworICAgIGFzc2VydF9wYXJhbShJU19BRENfU0FNUExJTkdfREVMQVkocE11bHRpbW9kZS0+VHdvU2FtcGxpbmdEZWxheSkpOworICB9CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoYWRjKTsKKworICAvKiBUZW1wb3JhcnkgaGFuZGxlIG1pbmltdW0gaW5pdGlhbGl6YXRpb24gKi8KKyAgX19IQUxfQURDX1JFU0VUX0hBTkRMRV9TVEFURSgmdG1wX2hhZGNfc2xhdmUpOworICBBRENfQ0xFQVJfRVJST1JDT0RFKCZ0bXBfaGFkY19zbGF2ZSk7CisKKyAgQURDX01VTFRJX1NMQVZFKGhhZGMsICZ0bXBfaGFkY19zbGF2ZSk7CisKKyAgaWYgKHRtcF9oYWRjX3NsYXZlLkluc3RhbmNlID09IE5VTEwpIHsKKyAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gZXJyb3IgKi8KKyAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0VSUk9SX0NPTkZJRyk7CisKKyAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhhZGMpOworCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFBhcmFtZXRlcnMgdXBkYXRlIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBQYXJhbWV0ZXJzIHRoYXQgY2FuIGJlIHVwZGF0ZWQgd2hlbiBBREMgaXMgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0ICAgKi8KKyAgLyogY29udmVyc2lvbiBvbiBnb2luZyBvbiByZWd1bGFyIGdyb3VwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAtIE11bHRpbW9kZSBETUEgY29uZmlndXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgLSBNdWx0aW1vZGUgRE1BIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdG1wX2hhZGNfc2xhdmVfY29udmVyc2lvbl9vbl9nb2luZyA9CisgICAgICBMTF9BRENfUkVHX0lzQ29udmVyc2lvbk9uZ29pbmcoKCZ0bXBfaGFkY19zbGF2ZSktPkluc3RhbmNlKTsKKyAgaWYgKChMTF9BRENfUkVHX0lzQ29udmVyc2lvbk9uZ29pbmcoaGFkYy0+SW5zdGFuY2UpID09IDBVTCkgJiYKKyAgICAgICh0bXBfaGFkY19zbGF2ZV9jb252ZXJzaW9uX29uX2dvaW5nID09IDBVTCkpIHsKKyAgICAvKiBQb2ludGVyIHRvIHRoZSBjb21tb24gY29udHJvbCByZWdpc3RlciAqLworICAgIHRtcEFEQ19Db21tb24gPSBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpOworCisgICAgLyogSWYgbXVsdGltb2RlIGlzIHNlbGVjdGVkLCBjb25maWd1cmUgYWxsIG11bHRpbW9kZSBwYXJhbWV0ZXJzLiAgICAgICAgICAqLworICAgIC8qIE90aGVyd2lzZSwgcmVzZXQgbXVsdGltb2RlIHBhcmFtZXRlcnMgKGNhbiBiZSB1c2VkIGluIGNhc2Ugb2YgICAgICAgICAgKi8KKyAgICAvKiB0cmFuc2l0aW9uIGZyb20gbXVsdGltb2RlIHRvIGluZGVwZW5kZW50IG1vZGUpLiAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYgKHBNdWx0aW1vZGUtPk1vZGUgIT0gQURDX01PREVfSU5ERVBFTkRFTlQpIHsKKyAgICAgIE1PRElGWV9SRUcodG1wQURDX0NvbW1vbi0+Q0NSLCBBRENfQ0NSX01ETUEgfCBBRENfQ0NSX0RNQUNGRywKKyAgICAgICAgICAgICAgICAgcE11bHRpbW9kZS0+RE1BQWNjZXNzTW9kZSB8CisgICAgICAgICAgICAgICAgICAgICBBRENfQ0NSX01VTFRJX0RNQUNPTlRSRVEoCisgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KWhhZGMtPkluaXQuRE1BQ29udGludW91c1JlcXVlc3RzKSk7CisKKyAgICAgIC8qIFBhcmFtZXRlcnMgdGhhdCBjYW4gYmUgdXBkYXRlZCBvbmx5IHdoZW4gQURDIGlzIGRpc2FibGVkOiAqLworICAgICAgLyogIC0gTXVsdGltb2RlIG1vZGUgc2VsZWN0aW9uICovCisgICAgICAvKiAgLSBNdWx0aW1vZGUgZGVsYXkgKi8KKyAgICAgIC8qICAgIE5vdGU6IERlbGF5IHJhbmdlIGRlcGVuZHMgb24gc2VsZWN0ZWQgcmVzb2x1dGlvbjogKi8KKyAgICAgIC8qICAgICAgZnJvbSAxIHRvIDEyIGNsb2NrIGN5Y2xlcyBmb3IgMTIgYml0cyAqLworICAgICAgLyogICAgICBmcm9tIDEgdG8gMTAgY2xvY2sgY3ljbGVzIGZvciAxMCBiaXRzLCAqLworICAgICAgLyogICAgICBmcm9tIDEgdG8gOCBjbG9jayBjeWNsZXMgZm9yIDggYml0cyAqLworICAgICAgLyogICAgICBmcm9tIDEgdG8gNiBjbG9jayBjeWNsZXMgZm9yIDYgYml0cyAqLworICAgICAgLyogICAgSWYgYSBoaWdoZXIgZGVsYXkgaXMgc2VsZWN0ZWQsIGl0IHdpbGwgYmUgY2xpcHBlZCB0byBtYXhpbXVtIGRlbGF5CisgICAgICAgKi8KKyAgICAgIC8qICAgIHJhbmdlICovCisgICAgICBpZiAoX19MTF9BRENfSVNfRU5BQkxFRF9BTExfQ09NTU9OX0lOU1RBTkNFKAorICAgICAgICAgICAgICBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKSA9PSAwVUwpIHsKKyAgICAgICAgTU9ESUZZX1JFRyh0bXBBRENfQ29tbW9uLT5DQ1IsIEFEQ19DQ1JfRFVBTCB8IEFEQ19DQ1JfREVMQVksCisgICAgICAgICAgICAgICAgICAgcE11bHRpbW9kZS0+TW9kZSB8IHBNdWx0aW1vZGUtPlR3b1NhbXBsaW5nRGVsYXkpOworICAgICAgfQorICAgIH0gZWxzZSAvKiBBRENfTU9ERV9JTkRFUEVOREVOVCAqLworICAgIHsKKyAgICAgIENMRUFSX0JJVCh0bXBBRENfQ29tbW9uLT5DQ1IsIEFEQ19DQ1JfTURNQSB8IEFEQ19DQ1JfRE1BQ0ZHKTsKKworICAgICAgLyogUGFyYW1ldGVycyB0aGF0IGNhbiBiZSB1cGRhdGVkIG9ubHkgd2hlbiBBREMgaXMgZGlzYWJsZWQ6ICovCisgICAgICAvKiAgLSBNdWx0aW1vZGUgbW9kZSBzZWxlY3Rpb24gKi8KKyAgICAgIC8qICAtIE11bHRpbW9kZSBkZWxheSAqLworICAgICAgaWYgKF9fTExfQURDX0lTX0VOQUJMRURfQUxMX0NPTU1PTl9JTlNUQU5DRSgKKyAgICAgICAgICAgICAgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSkgPT0gMFVMKSB7CisgICAgICAgIENMRUFSX0JJVCh0bXBBRENfQ29tbW9uLT5DQ1IsIEFEQ19DQ1JfRFVBTCB8IEFEQ19DQ1JfREVMQVkpOworICAgICAgfQorICAgIH0KKyAgfQorICAvKiBJZiBvbmUgb2YgdGhlIEFEQyBzaGFyaW5nIHRoZSBzYW1lIGNvbW1vbiBncm91cCBpcyBlbmFibGVkLCBubyB1cGRhdGUgICAgKi8KKyAgLyogY291bGQgYmUgZG9uZSBvbiBuZWl0aGVyIG9mIHRoZSBtdWx0aW1vZGUgc3RydWN0dXJlIHBhcmFtZXRlcnMuICAgICAgICAgICovCisgIGVsc2UgeworICAgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSB0byBlcnJvciAqLworICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfRVJST1JfQ09ORklHKTsKKworICAgIHRtcF9oYWxfc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisKKyAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGFkYyk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gdG1wX2hhbF9zdGF0dXM7Cit9CisjZW5kaWYgLyogQURDX01VTFRJTU9ERV9TVVBQT1JUICovCisKKy8qKgorICogQGJyaWVmICBFbmFibGUgSW5qZWN0ZWQgUXVldWUKKyAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiByZXNldHMgQ0ZHUiByZWdpc3RlciBKUURJUyBiaXQgaW4gb3JkZXIgdG8gZW5hYmxlIHRoZQorICogICAgICAgICBJbmplY3RlZCBRdWV1ZS4gSlFESVMgY2FuIGJlIHdyaXR0ZW4gb25seSB3aGVuIEFEU1RBUlQgYW5kIEpEU1RBUlQKKyAqICAgICAgICAgYXJlIGJvdGggZXF1YWwgdG8gMCB0byBlbnN1cmUgdGhhdCBubyByZWd1bGFyIG5vciBpbmplY3RlZAorICogICAgICAgICBjb252ZXJzaW9uIGlzIG9uZ29pbmcuCisgKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ0V4X0VuYWJsZUluamVjdGVkUXVldWUoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpIHsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgdG1wX2hhbF9zdGF0dXM7CisgIHVpbnQzMl90IHRtcF9hZGNfaXNfY29udmVyc2lvbl9vbl9nb2luZ19yZWd1bGFyOworICB1aW50MzJfdCB0bXBfYWRjX2lzX2NvbnZlcnNpb25fb25fZ29pbmdfaW5qZWN0ZWQ7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKworICB0bXBfYWRjX2lzX2NvbnZlcnNpb25fb25fZ29pbmdfcmVndWxhciA9CisgICAgICBMTF9BRENfUkVHX0lzQ29udmVyc2lvbk9uZ29pbmcoaGFkYy0+SW5zdGFuY2UpOworICB0bXBfYWRjX2lzX2NvbnZlcnNpb25fb25fZ29pbmdfaW5qZWN0ZWQgPQorICAgICAgTExfQURDX0lOSl9Jc0NvbnZlcnNpb25PbmdvaW5nKGhhZGMtPkluc3RhbmNlKTsKKworICAvKiBQYXJhbWV0ZXIgY2FuIGJlIHNldCBvbmx5IGlmIG5vIGNvbnZlcnNpb24gaXMgb24tZ29pbmcgKi8KKyAgaWYgKCh0bXBfYWRjX2lzX2NvbnZlcnNpb25fb25fZ29pbmdfcmVndWxhciA9PSAwVUwpICYmCisgICAgICAodG1wX2FkY19pc19jb252ZXJzaW9uX29uX2dvaW5nX2luamVjdGVkID09IDBVTCkpIHsKKyAgICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPkNGR1IsIEFEQ19DRkdSX0pRRElTKTsKKworICAgIC8qIFVwZGF0ZSBzdGF0ZSwgY2xlYXIgcHJldmlvdXMgcmVzdWx0IHJlbGF0ZWQgdG8gaW5qZWN0ZWQgcXVldWUgb3ZlcmZsb3cgKi8KKyAgICBDTEVBUl9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfSU5KX0pRT1ZGKTsKKworICAgIHRtcF9oYWxfc3RhdHVzID0gSEFMX09LOworICB9IGVsc2UgeworICAgIHRtcF9oYWxfc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisKKyAgcmV0dXJuIHRtcF9oYWxfc3RhdHVzOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBJbmplY3RlZCBRdWV1ZQorICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIHNldHMgQ0ZHUiByZWdpc3RlciBKUURJUyBiaXQgaW4gb3JkZXIgdG8gZGlzYWJsZSB0aGUKKyAqICAgICAgICAgSW5qZWN0ZWQgUXVldWUuIEpRRElTIGNhbiBiZSB3cml0dGVuIG9ubHkgd2hlbiBBRFNUQVJUIGFuZCBKRFNUQVJUCisgKiAgICAgICAgIGFyZSBib3RoIGVxdWFsIHRvIDAgdG8gZW5zdXJlIHRoYXQgbm8gcmVndWxhciBub3IgaW5qZWN0ZWQKKyAqICAgICAgICAgY29udmVyc2lvbiBpcyBvbmdvaW5nLgorICogQHBhcmFtIGhhZGMgQURDIGhhbmRsZQorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENFeF9EaXNhYmxlSW5qZWN0ZWRRdWV1ZShBRENfSGFuZGxlVHlwZURlZiAqaGFkYykgeworICBIQUxfU3RhdHVzVHlwZURlZiB0bXBfaGFsX3N0YXR1czsKKyAgdWludDMyX3QgdG1wX2FkY19pc19jb252ZXJzaW9uX29uX2dvaW5nX3JlZ3VsYXI7CisgIHVpbnQzMl90IHRtcF9hZGNfaXNfY29udmVyc2lvbl9vbl9nb2luZ19pbmplY3RlZDsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworCisgIHRtcF9hZGNfaXNfY29udmVyc2lvbl9vbl9nb2luZ19yZWd1bGFyID0KKyAgICAgIExMX0FEQ19SRUdfSXNDb252ZXJzaW9uT25nb2luZyhoYWRjLT5JbnN0YW5jZSk7CisgIHRtcF9hZGNfaXNfY29udmVyc2lvbl9vbl9nb2luZ19pbmplY3RlZCA9CisgICAgICBMTF9BRENfSU5KX0lzQ29udmVyc2lvbk9uZ29pbmcoaGFkYy0+SW5zdGFuY2UpOworCisgIC8qIFBhcmFtZXRlciBjYW4gYmUgc2V0IG9ubHkgaWYgbm8gY29udmVyc2lvbiBpcyBvbi1nb2luZyAqLworICBpZiAoKHRtcF9hZGNfaXNfY29udmVyc2lvbl9vbl9nb2luZ19yZWd1bGFyID09IDBVTCkgJiYKKyAgICAgICh0bXBfYWRjX2lzX2NvbnZlcnNpb25fb25fZ29pbmdfaW5qZWN0ZWQgPT0gMFVMKSkgeworICAgIExMX0FEQ19JTkpfU2V0UXVldWVNb2RlKGhhZGMtPkluc3RhbmNlLCBMTF9BRENfSU5KX1FVRVVFX0RJU0FCTEUpOworICAgIHRtcF9oYWxfc3RhdHVzID0gSEFMX09LOworICB9IGVsc2UgeworICAgIHRtcF9oYWxfc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisKKyAgcmV0dXJuIHRtcF9oYWxfc3RhdHVzOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBBREMgdm9sdGFnZSByZWd1bGF0b3IuCisgKiBAbm90ZSAgIERpc2FibGluZyB2b2x0YWdlIHJlZ3VsYXRvciBhbGxvd3MgdG8gc2F2ZSBwb3dlci4gVGhpcyBvcGVyYXRpb24gY2FuCisgKiAgICAgICAgIGJlIGNhcnJpZWQgb3V0IG9ubHkgd2hlbiBBREMgaXMgZGlzYWJsZWQuCisgKiBAbm90ZSAgIFRvIGVuYWJsZSBhZ2FpbiB0aGUgdm9sdGFnZSByZWd1bGF0b3IsIHRoZSB1c2VyIGlzIGV4cGVjdGVkIHRvCisgKiAgICAgICAgIHJlc29ydCB0byBIQUxfQURDX0luaXQoKSBBUEkuCisgKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ0V4X0Rpc2FibGVWb2x0YWdlUmVndWxhdG9yKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKSB7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHRtcF9oYWxfc3RhdHVzOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7CisKKyAgLyogU2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlOiBBREMgbXVzdCBiZSBBREMKKyAgICogZGlzYWJsZWQgKi8KKyAgaWYgKExMX0FEQ19Jc0VuYWJsZWQoaGFkYy0+SW5zdGFuY2UpID09IDBVTCkgeworICAgIExMX0FEQ19EaXNhYmxlSW50ZXJuYWxSZWd1bGF0b3IoaGFkYy0+SW5zdGFuY2UpOworICAgIHRtcF9oYWxfc3RhdHVzID0gSEFMX09LOworICB9IGVsc2UgeworICAgIHRtcF9oYWxfc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisKKyAgcmV0dXJuIHRtcF9oYWxfc3RhdHVzOworfQorCisvKioKKyAqIEBicmllZiAgRW50ZXIgQURDIGRlZXAtcG93ZXItZG93biBtb2RlCisgKiBAbm90ZSAgIFRoaXMgbW9kZSBpcyBhY2hpZXZlZCBpbiBzZXR0aW5nIERFRVBQV0QgYml0IGFuZCBhbGxvd3MgdG8gc2F2ZSBwb3dlcgorICogICAgICAgICBpbiByZWR1Y2luZyBsZWFrYWdlIGN1cnJlbnRzLiBJdCBpcyBwYXJ0aWN1bGFybHkgaW50ZXJlc3RpbmcgYmVmb3JlCisgKiAgICAgICAgIGVudGVyaW5nIHN0b3AgbW9kZXMuCisgKiBAbm90ZSAgIFNldHRpbmcgREVFUFBXRCBhdXRvbWF0aWNhbGx5IGNsZWFycyBBRFZSRUdFTiBiaXQgYW5kIGRpc2FibGVzIHRoZQorICogICAgICAgICBBREMgdm9sdGFnZSByZWd1bGF0b3IuIFRoaXMgbWVhbnMgdGhhdCB0aGlzIEFQSSBlbmNvbXBhc3NlcworICogICAgICAgICBIQUxfQURDRXhfRGlzYWJsZVZvbHRhZ2VSZWd1bGF0b3IoKS4gQWRkaXRpb25hbGx5LCB0aGUgaW50ZXJuYWwKKyAqICAgICAgICAgY2FsaWJyYXRpb24gaXMgbG9zdC4KKyAqIEBub3RlICAgVG8gZXhpdCB0aGUgQURDIGRlZXAtcG93ZXItZG93biBtb2RlLCB0aGUgdXNlciBpcyBleHBlY3RlZCB0bworICogICAgICAgICByZXNvcnQgdG8gSEFMX0FEQ19Jbml0KCkgQVBJIGFzIHdlbGwgYXMgdG8gcmVsYXVuY2ggYSBjYWxpYnJhdGlvbgorICogICAgICAgICB3aXRoIEhBTF9BRENFeF9DYWxpYnJhdGlvbl9TdGFydCgpIEFQSSBvciB0byByZS1hcHBseSBhIHByZXZpb3VzbHkKKyAqICAgICAgICAgc2F2ZWQgY2FsaWJyYXRpb24gZmFjdG9yLgorICogQHBhcmFtIGhhZGMgQURDIGhhbmRsZQorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENFeF9FbnRlckFEQ0RlZXBQb3dlckRvd25Nb2RlKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKSB7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHRtcF9oYWxfc3RhdHVzOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7CisKKyAgLyogU2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlOiBBREMgbXVzdCBiZSBBREMKKyAgICogZGlzYWJsZWQgKi8KKyAgaWYgKExMX0FEQ19Jc0VuYWJsZWQoaGFkYy0+SW5zdGFuY2UpID09IDBVTCkgeworICAgIExMX0FEQ19FbmFibGVEZWVwUG93ZXJEb3duKGhhZGMtPkluc3RhbmNlKTsKKyAgICB0bXBfaGFsX3N0YXR1cyA9IEhBTF9PSzsKKyAgfSBlbHNlIHsKKyAgICB0bXBfaGFsX3N0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorCisgIHJldHVybiB0bXBfaGFsX3N0YXR1czsKK30KKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisjZW5kaWYgLyogSEFMX0FEQ19NT0RVTEVfRU5BQkxFRCAqLworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLwpkaWZmIC0tZ2l0IGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX2NvcnRleC5jIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX2NvcnRleC5jCmluZGV4IGRlNGQzZmYuLmU2ODVkM2YgMTAwNjQ0Ci0tLSBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9jb3J0ZXguYworKysgYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfY29ydGV4LmMKQEAgLTEsNTIwICsxLDU0NSBAQAotLyoqDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICogQGZpbGUgICAgc3RtMzJnNHh4X2hhbF9jb3J0ZXguYw0KLSAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQ0KLSAgKiBAYnJpZWYgICBDT1JURVggSEFMIG1vZHVsZSBkcml2ZXIuDQotICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcNCi0gICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBDT1JURVg6DQotICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucw0KLSAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zDQotICAqDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICogQGF0dGVudGlvbg0KLSAgKg0KLSAgKiBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLg0KLSAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KLSAgKg0KLSAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRlcm1zIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUNCi0gICogaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc29mdHdhcmUgY29tcG9uZW50Lg0KLSAgKiBJZiBubyBMSUNFTlNFIGZpbGUgY29tZXMgd2l0aCB0aGlzIHNvZnR3YXJlLCBpdCBpcyBwcm92aWRlZCBBUy1JUy4NCi0gICoNCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgQHZlcmJhdGltDQotICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjDQotICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi0gICAgWy4uXQ0KLSAgICAqKiogSG93IHRvIGNvbmZpZ3VyZSBJbnRlcnJ1cHRzIHVzaW5nIENPUlRFWCBIQUwgZHJpdmVyICoqKg0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICBbLi5dDQotICAgIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gY29uZmlndXJlIHRoZSBOVklDIGludGVycnVwdHMNCi0gIChJUlEpLiBUaGUgQ29ydGV4LU00IGV4Y2VwdGlvbnMgYXJlIG1hbmFnZWQgYnkgQ01TSVMgZnVuY3Rpb25zLg0KLQ0KLSAgICAoIykgQ29uZmlndXJlIHRoZSBOVklDIFByaW9yaXR5IEdyb3VwaW5nIHVzaW5nDQotICBIQUxfTlZJQ19TZXRQcmlvcml0eUdyb3VwaW5nKCkgZnVuY3Rpb24uDQotICAgICgjKSBDb25maWd1cmUgdGhlIHByaW9yaXR5IG9mIHRoZSBzZWxlY3RlZCBJUlEgQ2hhbm5lbHMgdXNpbmcNCi0gIEhBTF9OVklDX1NldFByaW9yaXR5KCkuDQotICAgICgjKSBFbmFibGUgdGhlIHNlbGVjdGVkIElSUSBDaGFubmVscyB1c2luZyBIQUxfTlZJQ19FbmFibGVJUlEoKS4NCi0NCi0gICAgIC1ALSBXaGVuIHRoZSBOVklDX1BSSU9SSVRZR1JPVVBfMCBpcyBzZWxlY3RlZCwgSVJRIHByZS1lbXB0aW9uIGlzIG5vIG1vcmUNCi0gIHBvc3NpYmxlLiBUaGUgcGVuZGluZyBJUlEgcHJpb3JpdHkgd2lsbCBiZSBtYW5hZ2VkIG9ubHkgYnkgdGhlIHN1YiBwcmlvcml0eS4NCi0NCi0gICAgIC1ALSBJUlEgcHJpb3JpdHkgb3JkZXIgKHNvcnRlZCBieSBoaWdoZXN0IHRvIGxvd2VzdCBwcmlvcml0eSk6DQotICAgICAgICAoK0ApIExvd2VzdCBwcmUtZW1wdGlvbiBwcmlvcml0eQ0KLSAgICAgICAgKCtAKSBMb3dlc3Qgc3ViIHByaW9yaXR5DQotICAgICAgICAoK0ApIExvd2VzdCBoYXJkd2FyZSBwcmlvcml0eSAoSVJRIG51bWJlcikNCi0NCi0gICAgWy4uXQ0KLSAgICAqKiogSG93IHRvIGNvbmZpZ3VyZSBTeXNUaWNrIHVzaW5nIENPUlRFWCBIQUwgZHJpdmVyICoqKg0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICBbLi5dDQotICAgIFNldHVwIFN5c1RpY2sgVGltZXIgZm9yIHRpbWUgYmFzZS4NCi0NCi0gICAoKykgVGhlIEhBTF9TWVNUSUNLX0NvbmZpZygpIGZ1bmN0aW9uIGNhbGxzIHRoZSBTeXNUaWNrX0NvbmZpZygpIGZ1bmN0aW9uDQotICB3aGljaCBpcyBhIENNU0lTIGZ1bmN0aW9uIHRoYXQ6DQotICAgICAgICAoKyspIENvbmZpZ3VyZXMgdGhlIFN5c1RpY2sgUmVsb2FkIHJlZ2lzdGVyIHdpdGggdmFsdWUgcGFzc2VkIGFzDQotICBmdW5jdGlvbiBwYXJhbWV0ZXIuDQotICAgICAgICAoKyspIENvbmZpZ3VyZXMgdGhlIFN5c1RpY2sgSVJRIHByaW9yaXR5IHRvIHRoZSBsb3dlc3QgdmFsdWUgKDB4MEYpLg0KLSAgICAgICAgKCsrKSBSZXNldHMgdGhlIFN5c1RpY2sgQ291bnRlciByZWdpc3Rlci4NCi0gICAgICAgICgrKykgQ29uZmlndXJlcyB0aGUgU3lzVGljayBDb3VudGVyIGNsb2NrIHNvdXJjZSB0byBiZSBDb3JlIENsb2NrIFNvdXJjZQ0KLSAgKEhDTEspLg0KLSAgICAgICAgKCsrKSBFbmFibGVzIHRoZSBTeXNUaWNrIEludGVycnVwdC4NCi0gICAgICAgICgrKykgU3RhcnRzIHRoZSBTeXNUaWNrIENvdW50ZXIuDQotDQotICAgKCspIFlvdSBjYW4gY2hhbmdlIHRoZSBTeXNUaWNrIENsb2NrIHNvdXJjZSB0byBiZSBIQ0xLX0RpdjggYnkgY2FsbGluZyB0aGUNCi0gIG1hY3JvDQotICAgICAgIF9fSEFMX0NPUlRFWF9TWVNUSUNLQ0xLX0NPTkZJRyhTWVNUSUNLX0NMS1NPVVJDRV9IQ0xLX0RJVjgpIGp1c3QgYWZ0ZXINCi0gIHRoZSBIQUxfU1lTVElDS19Db25maWcoKSBmdW5jdGlvbiBjYWxsLiBUaGUgX19IQUxfQ09SVEVYX1NZU1RJQ0tDTEtfQ09ORklHKCkNCi0gIG1hY3JvIGlzIGRlZmluZWQgaW5zaWRlIHRoZSBzdG0zMmc0eHhfaGFsX2NvcnRleC5oIGZpbGUuDQotDQotICAgKCspIFlvdSBjYW4gY2hhbmdlIHRoZSBTeXNUaWNrIElSUSBwcmlvcml0eSBieSBjYWxsaW5nIHRoZQ0KLSAgICAgICBIQUxfTlZJQ19TZXRQcmlvcml0eShTeXNUaWNrX0lSUW4sLi4uKSBmdW5jdGlvbiBqdXN0IGFmdGVyIHRoZQ0KLSAgSEFMX1NZU1RJQ0tfQ29uZmlnKCkgZnVuY3Rpb24gY2FsbC4gVGhlIEhBTF9OVklDX1NldFByaW9yaXR5KCkgY2FsbCB0aGUNCi0gIE5WSUNfU2V0UHJpb3JpdHkoKSBmdW5jdGlvbiB3aGljaCBpcyBhIENNU0lTIGZ1bmN0aW9uLg0KLQ0KLSAgICgrKSBUbyBhZGp1c3QgdGhlIFN5c1RpY2sgdGltZSBiYXNlLCB1c2UgdGhlIGZvbGxvd2luZyBmb3JtdWxhOg0KLQ0KLSAgICAgICBSZWxvYWQgVmFsdWUgPSBTeXNUaWNrIENvdW50ZXIgQ2xvY2sgKEh6KSB4ICBEZXNpcmVkIFRpbWUgYmFzZSAocykNCi0gICAgICAgKCsrKSBSZWxvYWQgVmFsdWUgaXMgdGhlIHBhcmFtZXRlciB0byBiZSBwYXNzZWQgZm9yIEhBTF9TWVNUSUNLX0NvbmZpZygpDQotICBmdW5jdGlvbg0KLSAgICAgICAoKyspIFJlbG9hZCBWYWx1ZSBzaG91bGQgbm90IGV4Y2VlZCAweEZGRkZGRg0KLQ0KLSAgQGVuZHZlcmJhdGltDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0NCi0gIFRoZSB0YWJsZSBiZWxvdyBnaXZlcyB0aGUgYWxsb3dlZCB2YWx1ZXMgb2YgdGhlIHByZS1lbXB0aW9uIHByaW9yaXR5IGFuZA0KLSAgc3VicHJpb3JpdHkgYWNjb3JkaW5nIHRvIHRoZSBQcmlvcml0eSBHcm91cGluZyBjb25maWd1cmF0aW9uIHBlcmZvcm1lZCBieQ0KLSAgSEFMX05WSUNfU2V0UHJpb3JpdHlHcm91cGluZygpIGZ1bmN0aW9uLg0KLQ0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICAgIE5WSUNfUHJpb3JpdHlHcm91cCAgIHwgTlZJQ19JUlFDaGFubmVsUHJlZW1wdGlvblByaW9yaXR5IHwNCi0gIE5WSUNfSVJRQ2hhbm5lbFN1YlByaW9yaXR5ICB8ICAgICAgIERlc2NyaXB0aW9uDQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgICBOVklDX1BSSU9SSVRZR1JPVVBfMCAgfCAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIDAtMTUNCi0gIHwgMCBiaXQgZm9yIHByZS1lbXB0aW9uIHByaW9yaXR5IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCA0DQotICBiaXRzIGZvciBzdWJwcmlvcml0eQ0KLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSAgICAgTlZJQ19QUklPUklUWUdST1VQXzEgIHwgICAgICAgICAgICAgICAgMC0xICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAwLTcNCi0gIHwgMSBiaXQgZm9yIHByZS1lbXB0aW9uIHByaW9yaXR5IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCAzDQotICBiaXRzIGZvciBzdWJwcmlvcml0eQ0KLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSAgICAgTlZJQ19QUklPUklUWUdST1VQXzIgIHwgICAgICAgICAgICAgICAgMC0zICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAwLTMNCi0gIHwgMiBiaXRzIGZvciBwcmUtZW1wdGlvbiBwcmlvcml0eSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgMg0KLSAgYml0cyBmb3Igc3VicHJpb3JpdHkNCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0gICAgIE5WSUNfUFJJT1JJVFlHUk9VUF8zICB8ICAgICAgICAgICAgICAgIDAtNyAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgMC0xDQotICB8IDMgYml0cyBmb3IgcHJlLWVtcHRpb24gcHJpb3JpdHkgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IDENCi0gIGJpdCBmb3Igc3VicHJpb3JpdHkNCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0gICAgIE5WSUNfUFJJT1JJVFlHUk9VUF80ICB8ICAgICAgICAgICAgICAgIDAtMTUgICAgICAgICAgICAgICB8ICAgICAgICAgICAgMCB8DQotICA0IGJpdHMgZm9yIHByZS1lbXB0aW9uIHByaW9yaXR5IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCAwIGJpdA0KLSAgZm9yIHN1YnByaW9yaXR5DQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotICAqLw0KLQ0KLS8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotI2luY2x1ZGUgInN0bTMyZzR4eF9oYWwuaCINCi0NCi0vKiogQGFkZHRvZ3JvdXAgU1RNMzJHNHh4X0hBTF9Ecml2ZXINCi0gKiBAew0KLSAqLw0KLQ0KLS8qKiBAYWRkdG9ncm91cCBDT1JURVgNCi0gKiBAew0KLSAqLw0KLQ0KLSNpZmRlZiBIQUxfQ09SVEVYX01PRFVMRV9FTkFCTEVEDQotDQotLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotDQotLyoqIEBhZGR0b2dyb3VwIENPUlRFWF9FeHBvcnRlZF9GdW5jdGlvbnMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKiBAYWRkdG9ncm91cCBDT1JURVhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMQ0KLSAqICBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zDQotICoNCi1AdmVyYmF0aW0NCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zICMjIyMjDQotICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgWy4uXQ0KLSAgICAgIFRoaXMgc2VjdGlvbiBwcm92aWRlcyB0aGUgQ09SVEVYIEhBTCBkcml2ZXIgZnVuY3Rpb25zIGFsbG93aW5nIHRvDQotY29uZmlndXJlIEludGVycnVwdHMgU3lzVGljayBmdW5jdGlvbmFsaXRpZXMNCi0NCi1AZW5kdmVyYmF0aW0NCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICogQGJyaWVmICBTZXQgdGhlIHByaW9yaXR5IGdyb3VwaW5nIGZpZWxkIChwcmUtZW1wdGlvbiBwcmlvcml0eSBhbmQNCi0gKiBzdWJwcmlvcml0eSkgdXNpbmcgdGhlIHJlcXVpcmVkIHVubG9jayBzZXF1ZW5jZS4NCi0gKiBAcGFyYW0gIFByaW9yaXR5R3JvdXA6IFRoZSBwcmlvcml0eSBncm91cGluZyBiaXRzIGxlbmd0aC4NCi0gKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBAYXJnIE5WSUNfUFJJT1JJVFlHUk9VUF8wOiAwIGJpdCAgZm9yIHByZS1lbXB0aW9uIHByaW9yaXR5LA0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCBiaXRzIGZvciBzdWJwcmlvcml0eQ0KLSAqICAgICAgICAgQGFyZyBOVklDX1BSSU9SSVRZR1JPVVBfMTogMSBiaXQgIGZvciBwcmUtZW1wdGlvbiBwcmlvcml0eSwNCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgYml0cyBmb3Igc3VicHJpb3JpdHkNCi0gKiAgICAgICAgIEBhcmcgTlZJQ19QUklPUklUWUdST1VQXzI6IDIgYml0cyBmb3IgcHJlLWVtcHRpb24gcHJpb3JpdHksDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyIGJpdHMgZm9yIHN1YnByaW9yaXR5DQotICogICAgICAgICBAYXJnIE5WSUNfUFJJT1JJVFlHUk9VUF8zOiAzIGJpdHMgZm9yIHByZS1lbXB0aW9uIHByaW9yaXR5LA0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSBiaXQgIGZvciBzdWJwcmlvcml0eQ0KLSAqICAgICAgICAgQGFyZyBOVklDX1BSSU9SSVRZR1JPVVBfNDogNCBiaXRzIGZvciBwcmUtZW1wdGlvbiBwcmlvcml0eSwNCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgYml0ICBmb3Igc3VicHJpb3JpdHkNCi0gKiBAbm90ZSAgIFdoZW4gdGhlIE5WSUNfUHJpb3JpdHlHcm91cF8wIGlzIHNlbGVjdGVkLCBJUlEgcHJlLWVtcHRpb24gaXMgbm8gbW9yZQ0KLSAqIHBvc3NpYmxlLiBUaGUgcGVuZGluZyBJUlEgcHJpb3JpdHkgd2lsbCBiZSBtYW5hZ2VkIG9ubHkgYnkgdGhlIHN1YnByaW9yaXR5Lg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXZvaWQgSEFMX05WSUNfU2V0UHJpb3JpdHlHcm91cGluZyh1aW50MzJfdCBQcmlvcml0eUdyb3VwKSB7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX05WSUNfUFJJT1JJVFlfR1JPVVAoUHJpb3JpdHlHcm91cCkpOw0KLQ0KLSAgLyogU2V0IHRoZSBQUklHUk9VUFsxMDo4XSBiaXRzIGFjY29yZGluZyB0byB0aGUgUHJpb3JpdHlHcm91cCBwYXJhbWV0ZXIgdmFsdWUNCi0gICAqLw0KLSAgTlZJQ19TZXRQcmlvcml0eUdyb3VwaW5nKFByaW9yaXR5R3JvdXApOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCB0aGUgcHJpb3JpdHkgb2YgYW4gaW50ZXJydXB0Lg0KLSAqIEBwYXJhbSAgSVJRbjogRXh0ZXJuYWwgaW50ZXJydXB0IG51bWJlci4NCi0gKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbiBlbnVtZXJhdG9yIG9mIElSUW5fVHlwZSBlbnVtZXJhdGlvbg0KLSAqICAgICAgICAgKEZvciB0aGUgY29tcGxldGUgU1RNMzIgRGV2aWNlcyBJUlEgQ2hhbm5lbHMgbGlzdCwgcGxlYXNlIHJlZmVyIHRvDQotICogdGhlIGFwcHJvcHJpYXRlIENNU0lTIGRldmljZSBmaWxlIChzdG0zMmc0eHh4eC5oKSkNCi0gKiBAcGFyYW0gIFByZWVtcHRQcmlvcml0eTogVGhlIHByZS1lbXB0aW9uIHByaW9yaXR5IGZvciB0aGUgSVJRbiBjaGFubmVsLg0KLSAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAxNQ0KLSAqICAgICAgICAgQSBsb3dlciBwcmlvcml0eSB2YWx1ZSBpbmRpY2F0ZXMgYSBoaWdoZXIgcHJpb3JpdHkNCi0gKiBAcGFyYW0gIFN1YlByaW9yaXR5OiB0aGUgc3VicHJpb3JpdHkgbGV2ZWwgZm9yIHRoZSBJUlEgY2hhbm5lbC4NCi0gKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMTUNCi0gKiAgICAgICAgIEEgbG93ZXIgcHJpb3JpdHkgdmFsdWUgaW5kaWNhdGVzIGEgaGlnaGVyIHByaW9yaXR5Lg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXZvaWQgSEFMX05WSUNfU2V0UHJpb3JpdHkoSVJRbl9UeXBlIElSUW4sIHVpbnQzMl90IFByZWVtcHRQcmlvcml0eSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFN1YlByaW9yaXR5KSB7DQotICB1aW50MzJfdCBwcmlvcml0eWdyb3VwOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19OVklDX1NVQl9QUklPUklUWShTdWJQcmlvcml0eSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX05WSUNfUFJFRU1QVElPTl9QUklPUklUWShQcmVlbXB0UHJpb3JpdHkpKTsNCi0NCi0gIHByaW9yaXR5Z3JvdXAgPSBOVklDX0dldFByaW9yaXR5R3JvdXBpbmcoKTsNCi0NCi0gIE5WSUNfU2V0UHJpb3JpdHkoDQotICAgICAgSVJRbiwgTlZJQ19FbmNvZGVQcmlvcml0eShwcmlvcml0eWdyb3VwLCBQcmVlbXB0UHJpb3JpdHksIFN1YlByaW9yaXR5KSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIGEgZGV2aWNlIHNwZWNpZmljIGludGVycnVwdCBpbiB0aGUgTlZJQyBpbnRlcnJ1cHQgY29udHJvbGxlci4NCi0gKiBAbm90ZSAgIFRvIGNvbmZpZ3VyZSBpbnRlcnJ1cHRzIHByaW9yaXR5IGNvcnJlY3RseSwgdGhlDQotICogTlZJQ19Qcmlvcml0eUdyb3VwQ29uZmlnKCkgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUuDQotICogQHBhcmFtICBJUlFuIEV4dGVybmFsIGludGVycnVwdCBudW1iZXIuDQotICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW4gZW51bWVyYXRvciBvZiBJUlFuX1R5cGUgZW51bWVyYXRpb24NCi0gKiAgICAgICAgIChGb3IgdGhlIGNvbXBsZXRlIFNUTTMyIERldmljZXMgSVJRIENoYW5uZWxzIGxpc3QsIHBsZWFzZSByZWZlciB0bw0KLSAqIHRoZSBhcHByb3ByaWF0ZSBDTVNJUyBkZXZpY2UgZmlsZSAoc3RtMzJnNHh4eHguaCkpDQotICogQHJldHZhbCBOb25lDQotICovDQotdm9pZCBIQUxfTlZJQ19FbmFibGVJUlEoSVJRbl9UeXBlIElSUW4pIHsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfTlZJQ19ERVZJQ0VfSVJRKElSUW4pKTsNCi0NCi0gIC8qIEVuYWJsZSBpbnRlcnJ1cHQgKi8NCi0gIE5WSUNfRW5hYmxlSVJRKElSUW4pOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgYSBkZXZpY2Ugc3BlY2lmaWMgaW50ZXJydXB0IGluIHRoZSBOVklDIGludGVycnVwdCBjb250cm9sbGVyLg0KLSAqIEBwYXJhbSAgSVJRbiBFeHRlcm5hbCBpbnRlcnJ1cHQgbnVtYmVyLg0KLSAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFuIGVudW1lcmF0b3Igb2YgSVJRbl9UeXBlIGVudW1lcmF0aW9uDQotICogICAgICAgICAoRm9yIHRoZSBjb21wbGV0ZSBTVE0zMiBEZXZpY2VzIElSUSBDaGFubmVscyBsaXN0LCBwbGVhc2UgcmVmZXIgdG8NCi0gKiB0aGUgYXBwcm9wcmlhdGUgQ01TSVMgZGV2aWNlIGZpbGUgKHN0bTMyZzR4eHh4LmgpKQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXZvaWQgSEFMX05WSUNfRGlzYWJsZUlSUShJUlFuX1R5cGUgSVJRbikgew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19OVklDX0RFVklDRV9JUlEoSVJRbikpOw0KLQ0KLSAgLyogRGlzYWJsZSBpbnRlcnJ1cHQgKi8NCi0gIE5WSUNfRGlzYWJsZUlSUShJUlFuKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBJbml0aWF0ZSBhIHN5c3RlbSByZXNldCByZXF1ZXN0IHRvIHJlc2V0IHRoZSBNQ1UuDQotICogQHJldHZhbCBOb25lDQotICovDQotdm9pZCBIQUxfTlZJQ19TeXN0ZW1SZXNldCh2b2lkKSB7DQotICAvKiBTeXN0ZW0gUmVzZXQgKi8NCi0gIE5WSUNfU3lzdGVtUmVzZXQoKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBTeXN0ZW0gVGltZXIgd2l0aCBpbnRlcnJ1cHQgZW5hYmxlZCBhbmQgc3RhcnQgdGhlDQotICogU3lzdGVtIFRpY2sgVGltZXIgKFN5c1RpY2spOiBDb3VudGVyIGlzIGluIGZyZWUgcnVubmluZyBtb2RlIHRvIGdlbmVyYXRlDQotICogcGVyaW9kaWMgaW50ZXJydXB0cy4NCi0gKiBAcGFyYW0gIFRpY2tzTnVtYjogU3BlY2lmaWVzIHRoZSB0aWNrcyBOdW1iZXIgb2YgdGlja3MgYmV0d2VlbiB0d28NCi0gKiBpbnRlcnJ1cHRzLg0KLSAqIEByZXR2YWwgc3RhdHVzOiAgLSAwICBGdW5jdGlvbiBzdWNjZWVkZWQuDQotICogICAgICAgICAgICAgICAgICAtIDEgIEZ1bmN0aW9uIGZhaWxlZC4NCi0gKi8NCi11aW50MzJfdCBIQUxfU1lTVElDS19Db25maWcodWludDMyX3QgVGlja3NOdW1iKSB7DQotICByZXR1cm4gU3lzVGlja19Db25maWcoVGlja3NOdW1iKTsNCi19DQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGFkZHRvZ3JvdXAgQ09SVEVYX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDINCi0gKiAgQGJyaWVmICAgQ29ydGV4IGNvbnRyb2wgZnVuY3Rpb25zDQotICoNCi1AdmVyYmF0aW0NCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICMjIyMjDQotICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgWy4uXQ0KLSAgICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gY29udHJvbCB0aGUgQ09SVEVYDQotICAgICAgKE5WSUMsIFNZU1RJQ0ssIE1QVSkgZnVuY3Rpb25hbGl0aWVzLg0KLQ0KLQ0KLUBlbmR2ZXJiYXRpbQ0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCB0aGUgcHJpb3JpdHkgZ3JvdXBpbmcgZmllbGQgZnJvbSB0aGUgTlZJQyBJbnRlcnJ1cHQgQ29udHJvbGxlci4NCi0gKiBAcmV0dmFsIFByaW9yaXR5IGdyb3VwaW5nIGZpZWxkIChTQ0ItPkFJUkNSIFsxMDo4XSBQUklHUk9VUCBmaWVsZCkNCi0gKi8NCi11aW50MzJfdCBIQUxfTlZJQ19HZXRQcmlvcml0eUdyb3VwaW5nKHZvaWQpIHsNCi0gIC8qIEdldCB0aGUgUFJJR1JPVVBbMTA6OF0gZmllbGQgdmFsdWUgKi8NCi0gIHJldHVybiBOVklDX0dldFByaW9yaXR5R3JvdXBpbmcoKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgdGhlIHByaW9yaXR5IG9mIGFuIGludGVycnVwdC4NCi0gKiBAcGFyYW0gIElSUW46IEV4dGVybmFsIGludGVycnVwdCBudW1iZXIuDQotICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW4gZW51bWVyYXRvciBvZiBJUlFuX1R5cGUgZW51bWVyYXRpb24NCi0gKiAgICAgICAgIChGb3IgdGhlIGNvbXBsZXRlIFNUTTMyIERldmljZXMgSVJRIENoYW5uZWxzIGxpc3QsIHBsZWFzZSByZWZlciB0bw0KLSAqIHRoZSBhcHByb3ByaWF0ZSBDTVNJUyBkZXZpY2UgZmlsZSAoc3RtMzJnNHh4eHguaCkpDQotICogQHBhcmFtICAgUHJpb3JpdHlHcm91cDogdGhlIHByaW9yaXR5IGdyb3VwaW5nIGJpdHMgbGVuZ3RoLg0KLSAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgQGFyZyBOVklDX1BSSU9SSVRZR1JPVVBfMDogMCBiaXQgZm9yIHByZS1lbXB0aW9uIHByaW9yaXR5LA0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0IGJpdHMgZm9yIHN1YnByaW9yaXR5DQotICogICAgICAgICAgIEBhcmcgTlZJQ19QUklPUklUWUdST1VQXzE6IDEgYml0IGZvciBwcmUtZW1wdGlvbiBwcmlvcml0eSwNCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyBiaXRzIGZvciBzdWJwcmlvcml0eQ0KLSAqICAgICAgICAgICBAYXJnIE5WSUNfUFJJT1JJVFlHUk9VUF8yOiAyIGJpdHMgZm9yIHByZS1lbXB0aW9uIHByaW9yaXR5LA0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyIGJpdHMgZm9yIHN1YnByaW9yaXR5DQotICogICAgICAgICAgIEBhcmcgTlZJQ19QUklPUklUWUdST1VQXzM6IDMgYml0cyBmb3IgcHJlLWVtcHRpb24gcHJpb3JpdHksDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgYml0IGZvciBzdWJwcmlvcml0eQ0KLSAqICAgICAgICAgICBAYXJnIE5WSUNfUFJJT1JJVFlHUk9VUF80OiA0IGJpdHMgZm9yIHByZS1lbXB0aW9uIHByaW9yaXR5LA0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIGJpdCBmb3Igc3VicHJpb3JpdHkNCi0gKiBAcGFyYW0gIHBQcmVlbXB0UHJpb3JpdHk6IFBvaW50ZXIgb24gdGhlIFByZWVtcHRpdmUgcHJpb3JpdHkgdmFsdWUgKHN0YXJ0aW5nDQotICogZnJvbSAwKS4NCi0gKiBAcGFyYW0gIHBTdWJQcmlvcml0eTogUG9pbnRlciBvbiB0aGUgU3VicHJpb3JpdHkgdmFsdWUgKHN0YXJ0aW5nIGZyb20gMCkuDQotICogQHJldHZhbCBOb25lDQotICovDQotdm9pZCBIQUxfTlZJQ19HZXRQcmlvcml0eShJUlFuX1R5cGUgSVJRbiwgdWludDMyX3QgUHJpb3JpdHlHcm91cCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwUHJlZW1wdFByaW9yaXR5LCB1aW50MzJfdCAqcFN1YlByaW9yaXR5KSB7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX05WSUNfUFJJT1JJVFlfR1JPVVAoUHJpb3JpdHlHcm91cCkpOw0KLSAgLyogR2V0IHByaW9yaXR5IGZvciBDb3J0ZXgtTSBzeXN0ZW0gb3IgZGV2aWNlIHNwZWNpZmljIGludGVycnVwdHMgKi8NCi0gIE5WSUNfRGVjb2RlUHJpb3JpdHkoTlZJQ19HZXRQcmlvcml0eShJUlFuKSwgUHJpb3JpdHlHcm91cCwgcFByZWVtcHRQcmlvcml0eSwNCi0gICAgICAgICAgICAgICAgICAgICAgcFN1YlByaW9yaXR5KTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZXQgUGVuZGluZyBiaXQgb2YgYW4gZXh0ZXJuYWwgaW50ZXJydXB0Lg0KLSAqIEBwYXJhbSAgSVJRbiBFeHRlcm5hbCBpbnRlcnJ1cHQgbnVtYmVyDQotICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW4gZW51bWVyYXRvciBvZiBJUlFuX1R5cGUgZW51bWVyYXRpb24NCi0gKiAgICAgICAgIChGb3IgdGhlIGNvbXBsZXRlIFNUTTMyIERldmljZXMgSVJRIENoYW5uZWxzIGxpc3QsIHBsZWFzZSByZWZlciB0bw0KLSAqIHRoZSBhcHByb3ByaWF0ZSBDTVNJUyBkZXZpY2UgZmlsZSAoc3RtMzJnNHh4eHguaCkpDQotICogQHJldHZhbCBOb25lDQotICovDQotdm9pZCBIQUxfTlZJQ19TZXRQZW5kaW5nSVJRKElSUW5fVHlwZSBJUlFuKSB7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX05WSUNfREVWSUNFX0lSUShJUlFuKSk7DQotDQotICAvKiBTZXQgaW50ZXJydXB0IHBlbmRpbmcgKi8NCi0gIE5WSUNfU2V0UGVuZGluZ0lSUShJUlFuKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgUGVuZGluZyBJbnRlcnJ1cHQgKHJlYWQgdGhlIHBlbmRpbmcgcmVnaXN0ZXIgaW4gdGhlIE5WSUMNCi0gKiAgICAgICAgIGFuZCByZXR1cm4gdGhlIHBlbmRpbmcgYml0IGZvciB0aGUgc3BlY2lmaWVkIGludGVycnVwdCkuDQotICogQHBhcmFtICBJUlFuIEV4dGVybmFsIGludGVycnVwdCBudW1iZXIuDQotICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFuIGVudW1lcmF0b3Igb2YgSVJRbl9UeXBlIGVudW1lcmF0aW9uDQotICogICAgICAgICAoRm9yIHRoZSBjb21wbGV0ZSBTVE0zMiBEZXZpY2VzIElSUSBDaGFubmVscyBsaXN0LCBwbGVhc2UgcmVmZXIgdG8NCi0gKiB0aGUgYXBwcm9wcmlhdGUgQ01TSVMgZGV2aWNlIGZpbGUgKHN0bTMyZzR4eHh4LmgpKQ0KLSAqIEByZXR2YWwgc3RhdHVzOiAtIDAgIEludGVycnVwdCBzdGF0dXMgaXMgbm90IHBlbmRpbmcuDQotICogICAgICAgICAgICAgICAgIC0gMSAgSW50ZXJydXB0IHN0YXR1cyBpcyBwZW5kaW5nLg0KLSAqLw0KLXVpbnQzMl90IEhBTF9OVklDX0dldFBlbmRpbmdJUlEoSVJRbl9UeXBlIElSUW4pIHsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfTlZJQ19ERVZJQ0VfSVJRKElSUW4pKTsNCi0NCi0gIC8qIFJldHVybiAxIGlmIHBlbmRpbmcgZWxzZSAwICovDQotICByZXR1cm4gTlZJQ19HZXRQZW5kaW5nSVJRKElSUW4pOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENsZWFyIHRoZSBwZW5kaW5nIGJpdCBvZiBhbiBleHRlcm5hbCBpbnRlcnJ1cHQuDQotICogQHBhcmFtICBJUlFuIEV4dGVybmFsIGludGVycnVwdCBudW1iZXIuDQotICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW4gZW51bWVyYXRvciBvZiBJUlFuX1R5cGUgZW51bWVyYXRpb24NCi0gKiAgICAgICAgIChGb3IgdGhlIGNvbXBsZXRlIFNUTTMyIERldmljZXMgSVJRIENoYW5uZWxzIGxpc3QsIHBsZWFzZSByZWZlciB0bw0KLSAqIHRoZSBhcHByb3ByaWF0ZSBDTVNJUyBkZXZpY2UgZmlsZSAoc3RtMzJnNHh4eHguaCkpDQotICogQHJldHZhbCBOb25lDQotICovDQotdm9pZCBIQUxfTlZJQ19DbGVhclBlbmRpbmdJUlEoSVJRbl9UeXBlIElSUW4pIHsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfTlZJQ19ERVZJQ0VfSVJRKElSUW4pKTsNCi0NCi0gIC8qIENsZWFyIHBlbmRpbmcgaW50ZXJydXB0ICovDQotICBOVklDX0NsZWFyUGVuZGluZ0lSUShJUlFuKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmIEdldCBhY3RpdmUgaW50ZXJydXB0IChyZWFkIHRoZSBhY3RpdmUgcmVnaXN0ZXIgaW4gTlZJQyBhbmQgcmV0dXJuIHRoZQ0KLSAqIGFjdGl2ZSBiaXQpLg0KLSAqIEBwYXJhbSBJUlFuIEV4dGVybmFsIGludGVycnVwdCBudW1iZXINCi0gKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbiBlbnVtZXJhdG9yIG9mIElSUW5fVHlwZSBlbnVtZXJhdGlvbg0KLSAqICAgICAgICAgKEZvciB0aGUgY29tcGxldGUgU1RNMzIgRGV2aWNlcyBJUlEgQ2hhbm5lbHMgbGlzdCwgcGxlYXNlIHJlZmVyIHRvDQotICogdGhlIGFwcHJvcHJpYXRlIENNU0lTIGRldmljZSBmaWxlIChzdG0zMmc0eHh4eC5oKSkNCi0gKiBAcmV0dmFsIHN0YXR1czogLSAwICBJbnRlcnJ1cHQgc3RhdHVzIGlzIG5vdCBwZW5kaW5nLg0KLSAqICAgICAgICAgICAgICAgICAtIDEgIEludGVycnVwdCBzdGF0dXMgaXMgcGVuZGluZy4NCi0gKi8NCi11aW50MzJfdCBIQUxfTlZJQ19HZXRBY3RpdmUoSVJRbl9UeXBlIElSUW4pIHsNCi0gIC8qIFJldHVybiAxIGlmIGFjdGl2ZSBlbHNlIDAgKi8NCi0gIHJldHVybiBOVklDX0dldEFjdGl2ZShJUlFuKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDb25maWd1cmUgdGhlIFN5c1RpY2sgY2xvY2sgc291cmNlLg0KLSAqIEBwYXJhbSAgQ0xLU291cmNlOiBzcGVjaWZpZXMgdGhlIFN5c1RpY2sgY2xvY2sgc291cmNlLg0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICAgQGFyZyBTWVNUSUNLX0NMS1NPVVJDRV9IQ0xLX0RJVjg6IEFIQiBjbG9jayBkaXZpZGVkIGJ5IDggc2VsZWN0ZWQNCi0gKiBhcyBTeXNUaWNrIGNsb2NrIHNvdXJjZS4NCi0gKiAgICAgICAgICAgICBAYXJnIFNZU1RJQ0tfQ0xLU09VUkNFX0hDTEs6IEFIQiBjbG9jayBzZWxlY3RlZCBhcyBTeXNUaWNrIGNsb2NrDQotICogc291cmNlLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXZvaWQgSEFMX1NZU1RJQ0tfQ0xLU291cmNlQ29uZmlnKHVpbnQzMl90IENMS1NvdXJjZSkgew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19TWVNUSUNLX0NMS19TT1VSQ0UoQ0xLU291cmNlKSk7DQotICBpZiAoQ0xLU291cmNlID09IFNZU1RJQ0tfQ0xLU09VUkNFX0hDTEspIHsNCi0gICAgU3lzVGljay0+Q1RSTCB8PSBTWVNUSUNLX0NMS1NPVVJDRV9IQ0xLOw0KLSAgfSBlbHNlIHsNCi0gICAgU3lzVGljay0+Q1RSTCAmPSB+U1lTVElDS19DTEtTT1VSQ0VfSENMSzsNCi0gIH0NCi19DQotDQotLyoqDQotICogQGJyaWVmICBIYW5kbGUgU1lTVElDSyBpbnRlcnJ1cHQgcmVxdWVzdC4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi12b2lkIEhBTF9TWVNUSUNLX0lSUUhhbmRsZXIodm9pZCkgeyBIQUxfU1lTVElDS19DYWxsYmFjaygpOyB9DQotDQotLyoqDQotICogQGJyaWVmICBTWVNUSUNLIGNhbGxiYWNrLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fd2VhayB2b2lkIEhBTF9TWVNUSUNLX0NhbGxiYWNrKHZvaWQpIHsNCi0gIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwNCi0gICAgICAgICAgICB0aGUgSEFMX1NZU1RJQ0tfQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQ0KLSAgICovDQotfQ0KLQ0KLSNpZiAoX19NUFVfUFJFU0VOVCA9PSAxKQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIHRoZSBNUFUuDQotICogQHBhcmFtICBNUFVfQ29udHJvbDogU3BlY2lmaWVzIHRoZSBjb250cm9sIG1vZGUgb2YgdGhlIE1QVSBkdXJpbmcgaGFyZCBmYXVsdCwNCi0gKiAgICAgICAgICBOTUksIEZBVUxUTUFTSyBhbmQgcHJpdmlsZWdlZCBhY2Nlc3N0byB0aGUgZGVmYXVsdCBtZW1vcnkNCi0gKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBNUFVfSEZOTUlfUFJJVkRFRl9OT05FDQotICogICAgICAgICAgICBAYXJnIE1QVV9IQVJERkFVTFRfTk1JDQotICogICAgICAgICAgICBAYXJnIE1QVV9QUklWSUxFR0VEX0RFRkFVTFQNCi0gKiAgICAgICAgICAgIEBhcmcgTVBVX0hGTk1JX1BSSVZERUYNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi12b2lkIEhBTF9NUFVfRW5hYmxlKHVpbnQzMl90IE1QVV9Db250cm9sKSB7DQotICAvKiBFbmFibGUgdGhlIE1QVSAqLw0KLSAgTVBVLT5DVFJMID0gKE1QVV9Db250cm9sIHwgTVBVX0NUUkxfRU5BQkxFX01zayk7DQotDQotICAvKiBFbnN1cmUgTVBVIHNldHRpbmcgdGFrZSBlZmZlY3RzICovDQotICBfX0RTQigpOw0KLSAgX19JU0IoKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIHRoZSBNUFUuDQotICogQHJldHZhbCBOb25lDQotICovDQotdm9pZCBIQUxfTVBVX0Rpc2FibGUodm9pZCkgew0KLSAgLyogTWFrZSBzdXJlIG91dHN0YW5kaW5nIHRyYW5zZmVycyBhcmUgZG9uZSAqLw0KLSAgX19ETUIoKTsNCi0NCi0gIC8qIERpc2FibGUgdGhlIE1QVSBhbmQgY2xlYXIgdGhlIGNvbnRyb2wgcmVnaXN0ZXIqLw0KLSAgTVBVLT5DVFJMID0gMDsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBJbml0aWFsaXplIGFuZCBjb25maWd1cmUgdGhlIFJlZ2lvbiBhbmQgdGhlIG1lbW9yeSB0byBiZSBwcm90ZWN0ZWQuDQotICogQHBhcmFtICBNUFVfSW5pdDogUG9pbnRlciB0byBhIE1QVV9SZWdpb25fSW5pdFR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCi0gKiAgICAgICAgICAgICAgICB0aGUgaW5pdGlhbGl6YXRpb24gYW5kIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uDQotICogQHJldHZhbCBOb25lDQotICovDQotdm9pZCBIQUxfTVBVX0NvbmZpZ1JlZ2lvbihNUFVfUmVnaW9uX0luaXRUeXBlRGVmICpNUFVfSW5pdCkgew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19NUFVfUkVHSU9OX05VTUJFUihNUFVfSW5pdC0+TnVtYmVyKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfTVBVX1JFR0lPTl9FTkFCTEUoTVBVX0luaXQtPkVuYWJsZSkpOw0KLQ0KLSAgLyogU2V0IHRoZSBSZWdpb24gbnVtYmVyICovDQotICBNUFUtPlJOUiA9IE1QVV9Jbml0LT5OdW1iZXI7DQotDQotICBpZiAoKE1QVV9Jbml0LT5FbmFibGUpICE9IDBVKSB7DQotICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICAgIGFzc2VydF9wYXJhbShJU19NUFVfSU5TVFJVQ1RJT05fQUNDRVNTKE1QVV9Jbml0LT5EaXNhYmxlRXhlYykpOw0KLSAgICBhc3NlcnRfcGFyYW0oDQotICAgICAgICBJU19NUFVfUkVHSU9OX1BFUk1JU1NJT05fQVRUUklCVVRFKE1QVV9Jbml0LT5BY2Nlc3NQZXJtaXNzaW9uKSk7DQotICAgIGFzc2VydF9wYXJhbShJU19NUFVfVEVYX0xFVkVMKE1QVV9Jbml0LT5UeXBlRXh0RmllbGQpKTsNCi0gICAgYXNzZXJ0X3BhcmFtKElTX01QVV9BQ0NFU1NfU0hBUkVBQkxFKE1QVV9Jbml0LT5Jc1NoYXJlYWJsZSkpOw0KLSAgICBhc3NlcnRfcGFyYW0oSVNfTVBVX0FDQ0VTU19DQUNIRUFCTEUoTVBVX0luaXQtPklzQ2FjaGVhYmxlKSk7DQotICAgIGFzc2VydF9wYXJhbShJU19NUFVfQUNDRVNTX0JVRkZFUkFCTEUoTVBVX0luaXQtPklzQnVmZmVyYWJsZSkpOw0KLSAgICBhc3NlcnRfcGFyYW0oSVNfTVBVX1NVQl9SRUdJT05fRElTQUJMRShNUFVfSW5pdC0+U3ViUmVnaW9uRGlzYWJsZSkpOw0KLSAgICBhc3NlcnRfcGFyYW0oSVNfTVBVX1JFR0lPTl9TSVpFKE1QVV9Jbml0LT5TaXplKSk7DQotDQotICAgIE1QVS0+UkJBUiA9IE1QVV9Jbml0LT5CYXNlQWRkcmVzczsNCi0gICAgTVBVLT5SQVNSID0gKCh1aW50MzJfdClNUFVfSW5pdC0+RGlzYWJsZUV4ZWMgPDwgTVBVX1JBU1JfWE5fUG9zKSB8DQotICAgICAgICAgICAgICAgICgodWludDMyX3QpTVBVX0luaXQtPkFjY2Vzc1Blcm1pc3Npb24gPDwgTVBVX1JBU1JfQVBfUG9zKSB8DQotICAgICAgICAgICAgICAgICgodWludDMyX3QpTVBVX0luaXQtPlR5cGVFeHRGaWVsZCA8PCBNUFVfUkFTUl9URVhfUG9zKSB8DQotICAgICAgICAgICAgICAgICgodWludDMyX3QpTVBVX0luaXQtPklzU2hhcmVhYmxlIDw8IE1QVV9SQVNSX1NfUG9zKSB8DQotICAgICAgICAgICAgICAgICgodWludDMyX3QpTVBVX0luaXQtPklzQ2FjaGVhYmxlIDw8IE1QVV9SQVNSX0NfUG9zKSB8DQotICAgICAgICAgICAgICAgICgodWludDMyX3QpTVBVX0luaXQtPklzQnVmZmVyYWJsZSA8PCBNUFVfUkFTUl9CX1BvcykgfA0KLSAgICAgICAgICAgICAgICAoKHVpbnQzMl90KU1QVV9Jbml0LT5TdWJSZWdpb25EaXNhYmxlIDw8IE1QVV9SQVNSX1NSRF9Qb3MpIHwNCi0gICAgICAgICAgICAgICAgKCh1aW50MzJfdClNUFVfSW5pdC0+U2l6ZSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgfA0KLSAgICAgICAgICAgICAgICAoKHVpbnQzMl90KU1QVV9Jbml0LT5FbmFibGUgPDwgTVBVX1JBU1JfRU5BQkxFX1Bvcyk7DQotICB9IGVsc2Ugew0KLSAgICBNUFUtPlJCQVIgPSAweDAwOw0KLSAgICBNUFUtPlJBU1IgPSAweDAwOw0KLSAgfQ0KLX0NCi0jZW5kaWYgLyogX19NUFVfUFJFU0VOVCAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0jZW5kaWYgLyogSEFMX0NPUlRFWF9NT0RVTEVfRU5BQkxFRCAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnNHh4X2hhbF9jb3J0ZXguYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgQ09SVEVYIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcKKyAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIENPUlRFWDoKKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0ZXJtcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlCisgICogaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc29mdHdhcmUgY29tcG9uZW50LgorICAqIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcyB3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICBAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgWy4uXQorICAgICoqKiBIb3cgdG8gY29uZmlndXJlIEludGVycnVwdHMgdXNpbmcgQ09SVEVYIEhBTCBkcml2ZXIgKioqCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBjb25maWd1cmUgdGhlIE5WSUMgaW50ZXJydXB0cworICAoSVJRKS4gVGhlIENvcnRleC1NNCBleGNlcHRpb25zIGFyZSBtYW5hZ2VkIGJ5IENNU0lTIGZ1bmN0aW9ucy4KKworICAgICgjKSBDb25maWd1cmUgdGhlIE5WSUMgUHJpb3JpdHkgR3JvdXBpbmcgdXNpbmcKKyAgSEFMX05WSUNfU2V0UHJpb3JpdHlHcm91cGluZygpIGZ1bmN0aW9uLgorICAgICgjKSBDb25maWd1cmUgdGhlIHByaW9yaXR5IG9mIHRoZSBzZWxlY3RlZCBJUlEgQ2hhbm5lbHMgdXNpbmcKKyAgSEFMX05WSUNfU2V0UHJpb3JpdHkoKS4KKyAgICAoIykgRW5hYmxlIHRoZSBzZWxlY3RlZCBJUlEgQ2hhbm5lbHMgdXNpbmcgSEFMX05WSUNfRW5hYmxlSVJRKCkuCisKKyAgICAgLUAtIFdoZW4gdGhlIE5WSUNfUFJJT1JJVFlHUk9VUF8wIGlzIHNlbGVjdGVkLCBJUlEgcHJlLWVtcHRpb24gaXMgbm8gbW9yZQorICBwb3NzaWJsZS4gVGhlIHBlbmRpbmcgSVJRIHByaW9yaXR5IHdpbGwgYmUgbWFuYWdlZCBvbmx5IGJ5IHRoZSBzdWIgcHJpb3JpdHkuCisKKyAgICAgLUAtIElSUSBwcmlvcml0eSBvcmRlciAoc29ydGVkIGJ5IGhpZ2hlc3QgdG8gbG93ZXN0IHByaW9yaXR5KToKKyAgICAgICAgKCtAKSBMb3dlc3QgcHJlLWVtcHRpb24gcHJpb3JpdHkKKyAgICAgICAgKCtAKSBMb3dlc3Qgc3ViIHByaW9yaXR5CisgICAgICAgICgrQCkgTG93ZXN0IGhhcmR3YXJlIHByaW9yaXR5IChJUlEgbnVtYmVyKQorCisgICAgWy4uXQorICAgICoqKiBIb3cgdG8gY29uZmlndXJlIFN5c1RpY2sgdXNpbmcgQ09SVEVYIEhBTCBkcml2ZXIgKioqCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgU2V0dXAgU3lzVGljayBUaW1lciBmb3IgdGltZSBiYXNlLgorCisgICAoKykgVGhlIEhBTF9TWVNUSUNLX0NvbmZpZygpIGZ1bmN0aW9uIGNhbGxzIHRoZSBTeXNUaWNrX0NvbmZpZygpIGZ1bmN0aW9uCisgIHdoaWNoIGlzIGEgQ01TSVMgZnVuY3Rpb24gdGhhdDoKKyAgICAgICAgKCsrKSBDb25maWd1cmVzIHRoZSBTeXNUaWNrIFJlbG9hZCByZWdpc3RlciB3aXRoIHZhbHVlIHBhc3NlZCBhcworICBmdW5jdGlvbiBwYXJhbWV0ZXIuCisgICAgICAgICgrKykgQ29uZmlndXJlcyB0aGUgU3lzVGljayBJUlEgcHJpb3JpdHkgdG8gdGhlIGxvd2VzdCB2YWx1ZSAoMHgwRikuCisgICAgICAgICgrKykgUmVzZXRzIHRoZSBTeXNUaWNrIENvdW50ZXIgcmVnaXN0ZXIuCisgICAgICAgICgrKykgQ29uZmlndXJlcyB0aGUgU3lzVGljayBDb3VudGVyIGNsb2NrIHNvdXJjZSB0byBiZSBDb3JlIENsb2NrIFNvdXJjZQorICAoSENMSykuCisgICAgICAgICgrKykgRW5hYmxlcyB0aGUgU3lzVGljayBJbnRlcnJ1cHQuCisgICAgICAgICgrKykgU3RhcnRzIHRoZSBTeXNUaWNrIENvdW50ZXIuCisKKyAgICgrKSBZb3UgY2FuIGNoYW5nZSB0aGUgU3lzVGljayBDbG9jayBzb3VyY2UgdG8gYmUgSENMS19EaXY4IGJ5IGNhbGxpbmcgdGhlCisgIG1hY3JvCisgICAgICAgX19IQUxfQ09SVEVYX1NZU1RJQ0tDTEtfQ09ORklHKFNZU1RJQ0tfQ0xLU09VUkNFX0hDTEtfRElWOCkganVzdCBhZnRlcgorICB0aGUgSEFMX1NZU1RJQ0tfQ29uZmlnKCkgZnVuY3Rpb24gY2FsbC4gVGhlIF9fSEFMX0NPUlRFWF9TWVNUSUNLQ0xLX0NPTkZJRygpCisgIG1hY3JvIGlzIGRlZmluZWQgaW5zaWRlIHRoZSBzdG0zMmc0eHhfaGFsX2NvcnRleC5oIGZpbGUuCisKKyAgICgrKSBZb3UgY2FuIGNoYW5nZSB0aGUgU3lzVGljayBJUlEgcHJpb3JpdHkgYnkgY2FsbGluZyB0aGUKKyAgICAgICBIQUxfTlZJQ19TZXRQcmlvcml0eShTeXNUaWNrX0lSUW4sLi4uKSBmdW5jdGlvbiBqdXN0IGFmdGVyIHRoZQorICBIQUxfU1lTVElDS19Db25maWcoKSBmdW5jdGlvbiBjYWxsLiBUaGUgSEFMX05WSUNfU2V0UHJpb3JpdHkoKSBjYWxsIHRoZQorICBOVklDX1NldFByaW9yaXR5KCkgZnVuY3Rpb24gd2hpY2ggaXMgYSBDTVNJUyBmdW5jdGlvbi4KKworICAgKCspIFRvIGFkanVzdCB0aGUgU3lzVGljayB0aW1lIGJhc2UsIHVzZSB0aGUgZm9sbG93aW5nIGZvcm11bGE6CisKKyAgICAgICBSZWxvYWQgVmFsdWUgPSBTeXNUaWNrIENvdW50ZXIgQ2xvY2sgKEh6KSB4ICBEZXNpcmVkIFRpbWUgYmFzZSAocykKKyAgICAgICAoKyspIFJlbG9hZCBWYWx1ZSBpcyB0aGUgcGFyYW1ldGVyIHRvIGJlIHBhc3NlZCBmb3IgSEFMX1NZU1RJQ0tfQ29uZmlnKCkKKyAgZnVuY3Rpb24KKyAgICAgICAoKyspIFJlbG9hZCBWYWx1ZSBzaG91bGQgbm90IGV4Y2VlZCAweEZGRkZGRgorCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICBUaGUgdGFibGUgYmVsb3cgZ2l2ZXMgdGhlIGFsbG93ZWQgdmFsdWVzIG9mIHRoZSBwcmUtZW1wdGlvbiBwcmlvcml0eSBhbmQKKyAgc3VicHJpb3JpdHkgYWNjb3JkaW5nIHRvIHRoZSBQcmlvcml0eSBHcm91cGluZyBjb25maWd1cmF0aW9uIHBlcmZvcm1lZCBieQorICBIQUxfTlZJQ19TZXRQcmlvcml0eUdyb3VwaW5nKCkgZnVuY3Rpb24uCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgTlZJQ19Qcmlvcml0eUdyb3VwICAgfCBOVklDX0lSUUNoYW5uZWxQcmVlbXB0aW9uUHJpb3JpdHkgfAorICBOVklDX0lSUUNoYW5uZWxTdWJQcmlvcml0eSAgfCAgICAgICBEZXNjcmlwdGlvbgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIE5WSUNfUFJJT1JJVFlHUk9VUF8wICB8ICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgMC0xNQorICB8IDAgYml0IGZvciBwcmUtZW1wdGlvbiBwcmlvcml0eSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgNAorICBiaXRzIGZvciBzdWJwcmlvcml0eQorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIE5WSUNfUFJJT1JJVFlHUk9VUF8xICB8ICAgICAgICAgICAgICAgIDAtMSAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgMC03CisgIHwgMSBiaXQgZm9yIHByZS1lbXB0aW9uIHByaW9yaXR5IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCAzCisgIGJpdHMgZm9yIHN1YnByaW9yaXR5CisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgTlZJQ19QUklPUklUWUdST1VQXzIgIHwgICAgICAgICAgICAgICAgMC0zICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAwLTMKKyAgfCAyIGJpdHMgZm9yIHByZS1lbXB0aW9uIHByaW9yaXR5IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCAyCisgIGJpdHMgZm9yIHN1YnByaW9yaXR5CisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgTlZJQ19QUklPUklUWUdST1VQXzMgIHwgICAgICAgICAgICAgICAgMC03ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAwLTEKKyAgfCAzIGJpdHMgZm9yIHByZS1lbXB0aW9uIHByaW9yaXR5IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCAxCisgIGJpdCBmb3Igc3VicHJpb3JpdHkKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBOVklDX1BSSU9SSVRZR1JPVVBfNCAgfCAgICAgICAgICAgICAgICAwLTE1ICAgICAgICAgICAgICAgfCAgICAgICAgICAgIDAgfAorICA0IGJpdHMgZm9yIHByZS1lbXB0aW9uIHByaW9yaXR5IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCAwIGJpdAorICBmb3Igc3VicHJpb3JpdHkKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnNHh4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHNHh4X0hBTF9Ecml2ZXIKKyAqIEB7CisgKi8KKworLyoqIEBhZGR0b2dyb3VwIENPUlRFWAorICogQHsKKyAqLworCisjaWZkZWYgSEFMX0NPUlRFWF9NT0RVTEVfRU5BQkxFRAorCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAYWRkdG9ncm91cCBDT1JURVhfRXhwb3J0ZWRfRnVuY3Rpb25zCisgKiBAeworICovCisKKy8qKiBAYWRkdG9ncm91cCBDT1JURVhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMQorICogIEBicmllZiAgICBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgdGhlIENPUlRFWCBIQUwgZHJpdmVyIGZ1bmN0aW9ucyBhbGxvd2luZyB0bworY29uZmlndXJlIEludGVycnVwdHMgU3lzVGljayBmdW5jdGlvbmFsaXRpZXMKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgKiBAYnJpZWYgIFNldCB0aGUgcHJpb3JpdHkgZ3JvdXBpbmcgZmllbGQgKHByZS1lbXB0aW9uIHByaW9yaXR5IGFuZAorICogc3VicHJpb3JpdHkpIHVzaW5nIHRoZSByZXF1aXJlZCB1bmxvY2sgc2VxdWVuY2UuCisgKiBAcGFyYW0gIFByaW9yaXR5R3JvdXA6IFRoZSBwcmlvcml0eSBncm91cGluZyBiaXRzIGxlbmd0aC4KKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgQGFyZyBOVklDX1BSSU9SSVRZR1JPVVBfMDogMCBiaXQgIGZvciBwcmUtZW1wdGlvbiBwcmlvcml0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCBiaXRzIGZvciBzdWJwcmlvcml0eQorICogICAgICAgICBAYXJnIE5WSUNfUFJJT1JJVFlHUk9VUF8xOiAxIGJpdCAgZm9yIHByZS1lbXB0aW9uIHByaW9yaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzIGJpdHMgZm9yIHN1YnByaW9yaXR5CisgKiAgICAgICAgIEBhcmcgTlZJQ19QUklPUklUWUdST1VQXzI6IDIgYml0cyBmb3IgcHJlLWVtcHRpb24gcHJpb3JpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgYml0cyBmb3Igc3VicHJpb3JpdHkKKyAqICAgICAgICAgQGFyZyBOVklDX1BSSU9SSVRZR1JPVVBfMzogMyBiaXRzIGZvciBwcmUtZW1wdGlvbiBwcmlvcml0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSBiaXQgIGZvciBzdWJwcmlvcml0eQorICogICAgICAgICBAYXJnIE5WSUNfUFJJT1JJVFlHUk9VUF80OiA0IGJpdHMgZm9yIHByZS1lbXB0aW9uIHByaW9yaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIGJpdCAgZm9yIHN1YnByaW9yaXR5CisgKiBAbm90ZSAgIFdoZW4gdGhlIE5WSUNfUHJpb3JpdHlHcm91cF8wIGlzIHNlbGVjdGVkLCBJUlEgcHJlLWVtcHRpb24gaXMgbm8gbW9yZQorICogcG9zc2libGUuIFRoZSBwZW5kaW5nIElSUSBwcmlvcml0eSB3aWxsIGJlIG1hbmFnZWQgb25seSBieSB0aGUgc3VicHJpb3JpdHkuCisgKiBAcmV0dmFsIE5vbmUKKyAqLwordm9pZCBIQUxfTlZJQ19TZXRQcmlvcml0eUdyb3VwaW5nKHVpbnQzMl90IFByaW9yaXR5R3JvdXApIHsKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX05WSUNfUFJJT1JJVFlfR1JPVVAoUHJpb3JpdHlHcm91cCkpOworCisgIC8qIFNldCB0aGUgUFJJR1JPVVBbMTA6OF0gYml0cyBhY2NvcmRpbmcgdG8gdGhlIFByaW9yaXR5R3JvdXAgcGFyYW1ldGVyIHZhbHVlCisgICAqLworICBOVklDX1NldFByaW9yaXR5R3JvdXBpbmcoUHJpb3JpdHlHcm91cCk7Cit9CisKKy8qKgorICogQGJyaWVmICBTZXQgdGhlIHByaW9yaXR5IG9mIGFuIGludGVycnVwdC4KKyAqIEBwYXJhbSAgSVJRbjogRXh0ZXJuYWwgaW50ZXJydXB0IG51bWJlci4KKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFuIGVudW1lcmF0b3Igb2YgSVJRbl9UeXBlIGVudW1lcmF0aW9uCisgKiAgICAgICAgIChGb3IgdGhlIGNvbXBsZXRlIFNUTTMyIERldmljZXMgSVJRIENoYW5uZWxzIGxpc3QsIHBsZWFzZSByZWZlciB0bworICogdGhlIGFwcHJvcHJpYXRlIENNU0lTIGRldmljZSBmaWxlIChzdG0zMmc0eHh4eC5oKSkKKyAqIEBwYXJhbSAgUHJlZW1wdFByaW9yaXR5OiBUaGUgcHJlLWVtcHRpb24gcHJpb3JpdHkgZm9yIHRoZSBJUlFuIGNoYW5uZWwuCisgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMTUKKyAqICAgICAgICAgQSBsb3dlciBwcmlvcml0eSB2YWx1ZSBpbmRpY2F0ZXMgYSBoaWdoZXIgcHJpb3JpdHkKKyAqIEBwYXJhbSAgU3ViUHJpb3JpdHk6IHRoZSBzdWJwcmlvcml0eSBsZXZlbCBmb3IgdGhlIElSUSBjaGFubmVsLgorICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDE1CisgKiAgICAgICAgIEEgbG93ZXIgcHJpb3JpdHkgdmFsdWUgaW5kaWNhdGVzIGEgaGlnaGVyIHByaW9yaXR5LgorICogQHJldHZhbCBOb25lCisgKi8KK3ZvaWQgSEFMX05WSUNfU2V0UHJpb3JpdHkoSVJRbl9UeXBlIElSUW4sIHVpbnQzMl90IFByZWVtcHRQcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgU3ViUHJpb3JpdHkpIHsKKyAgdWludDMyX3QgcHJpb3JpdHlncm91cDsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfTlZJQ19TVUJfUFJJT1JJVFkoU3ViUHJpb3JpdHkpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX05WSUNfUFJFRU1QVElPTl9QUklPUklUWShQcmVlbXB0UHJpb3JpdHkpKTsKKworICBwcmlvcml0eWdyb3VwID0gTlZJQ19HZXRQcmlvcml0eUdyb3VwaW5nKCk7CisKKyAgTlZJQ19TZXRQcmlvcml0eSgKKyAgICAgIElSUW4sIE5WSUNfRW5jb2RlUHJpb3JpdHkocHJpb3JpdHlncm91cCwgUHJlZW1wdFByaW9yaXR5LCBTdWJQcmlvcml0eSkpOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIGEgZGV2aWNlIHNwZWNpZmljIGludGVycnVwdCBpbiB0aGUgTlZJQyBpbnRlcnJ1cHQgY29udHJvbGxlci4KKyAqIEBub3RlICAgVG8gY29uZmlndXJlIGludGVycnVwdHMgcHJpb3JpdHkgY29ycmVjdGx5LCB0aGUKKyAqIE5WSUNfUHJpb3JpdHlHcm91cENvbmZpZygpIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICogQHBhcmFtICBJUlFuIEV4dGVybmFsIGludGVycnVwdCBudW1iZXIuCisgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbiBlbnVtZXJhdG9yIG9mIElSUW5fVHlwZSBlbnVtZXJhdGlvbgorICogICAgICAgICAoRm9yIHRoZSBjb21wbGV0ZSBTVE0zMiBEZXZpY2VzIElSUSBDaGFubmVscyBsaXN0LCBwbGVhc2UgcmVmZXIgdG8KKyAqIHRoZSBhcHByb3ByaWF0ZSBDTVNJUyBkZXZpY2UgZmlsZSAoc3RtMzJnNHh4eHguaCkpCisgKiBAcmV0dmFsIE5vbmUKKyAqLwordm9pZCBIQUxfTlZJQ19FbmFibGVJUlEoSVJRbl9UeXBlIElSUW4pIHsKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX05WSUNfREVWSUNFX0lSUShJUlFuKSk7CisKKyAgLyogRW5hYmxlIGludGVycnVwdCAqLworICBOVklDX0VuYWJsZUlSUShJUlFuKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgYSBkZXZpY2Ugc3BlY2lmaWMgaW50ZXJydXB0IGluIHRoZSBOVklDIGludGVycnVwdCBjb250cm9sbGVyLgorICogQHBhcmFtICBJUlFuIEV4dGVybmFsIGludGVycnVwdCBudW1iZXIuCisgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbiBlbnVtZXJhdG9yIG9mIElSUW5fVHlwZSBlbnVtZXJhdGlvbgorICogICAgICAgICAoRm9yIHRoZSBjb21wbGV0ZSBTVE0zMiBEZXZpY2VzIElSUSBDaGFubmVscyBsaXN0LCBwbGVhc2UgcmVmZXIgdG8KKyAqIHRoZSBhcHByb3ByaWF0ZSBDTVNJUyBkZXZpY2UgZmlsZSAoc3RtMzJnNHh4eHguaCkpCisgKiBAcmV0dmFsIE5vbmUKKyAqLwordm9pZCBIQUxfTlZJQ19EaXNhYmxlSVJRKElSUW5fVHlwZSBJUlFuKSB7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19OVklDX0RFVklDRV9JUlEoSVJRbikpOworCisgIC8qIERpc2FibGUgaW50ZXJydXB0ICovCisgIE5WSUNfRGlzYWJsZUlSUShJUlFuKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEluaXRpYXRlIGEgc3lzdGVtIHJlc2V0IHJlcXVlc3QgdG8gcmVzZXQgdGhlIE1DVS4KKyAqIEByZXR2YWwgTm9uZQorICovCit2b2lkIEhBTF9OVklDX1N5c3RlbVJlc2V0KHZvaWQpIHsKKyAgLyogU3lzdGVtIFJlc2V0ICovCisgIE5WSUNfU3lzdGVtUmVzZXQoKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIFN5c3RlbSBUaW1lciB3aXRoIGludGVycnVwdCBlbmFibGVkIGFuZCBzdGFydCB0aGUKKyAqIFN5c3RlbSBUaWNrIFRpbWVyIChTeXNUaWNrKTogQ291bnRlciBpcyBpbiBmcmVlIHJ1bm5pbmcgbW9kZSB0byBnZW5lcmF0ZQorICogcGVyaW9kaWMgaW50ZXJydXB0cy4KKyAqIEBwYXJhbSAgVGlja3NOdW1iOiBTcGVjaWZpZXMgdGhlIHRpY2tzIE51bWJlciBvZiB0aWNrcyBiZXR3ZWVuIHR3bworICogaW50ZXJydXB0cy4KKyAqIEByZXR2YWwgc3RhdHVzOiAgLSAwICBGdW5jdGlvbiBzdWNjZWVkZWQuCisgKiAgICAgICAgICAgICAgICAgIC0gMSAgRnVuY3Rpb24gZmFpbGVkLgorICovCit1aW50MzJfdCBIQUxfU1lTVElDS19Db25maWcodWludDMyX3QgVGlja3NOdW1iKSB7CisgIHJldHVybiBTeXNUaWNrX0NvbmZpZyhUaWNrc051bWIpOworfQorLyoqCisgKiBAfQorICovCisKKy8qKiBAYWRkdG9ncm91cCBDT1JURVhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMgorICogIEBicmllZiAgIENvcnRleCBjb250cm9sIGZ1bmN0aW9ucworICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gY29udHJvbCB0aGUgQ09SVEVYCisgICAgICAoTlZJQywgU1lTVElDSywgTVBVKSBmdW5jdGlvbmFsaXRpZXMuCisKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgKiBAYnJpZWYgIEdldCB0aGUgcHJpb3JpdHkgZ3JvdXBpbmcgZmllbGQgZnJvbSB0aGUgTlZJQyBJbnRlcnJ1cHQgQ29udHJvbGxlci4KKyAqIEByZXR2YWwgUHJpb3JpdHkgZ3JvdXBpbmcgZmllbGQgKFNDQi0+QUlSQ1IgWzEwOjhdIFBSSUdST1VQIGZpZWxkKQorICovCit1aW50MzJfdCBIQUxfTlZJQ19HZXRQcmlvcml0eUdyb3VwaW5nKHZvaWQpIHsKKyAgLyogR2V0IHRoZSBQUklHUk9VUFsxMDo4XSBmaWVsZCB2YWx1ZSAqLworICByZXR1cm4gTlZJQ19HZXRQcmlvcml0eUdyb3VwaW5nKCk7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgdGhlIHByaW9yaXR5IG9mIGFuIGludGVycnVwdC4KKyAqIEBwYXJhbSAgSVJRbjogRXh0ZXJuYWwgaW50ZXJydXB0IG51bWJlci4KKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFuIGVudW1lcmF0b3Igb2YgSVJRbl9UeXBlIGVudW1lcmF0aW9uCisgKiAgICAgICAgIChGb3IgdGhlIGNvbXBsZXRlIFNUTTMyIERldmljZXMgSVJRIENoYW5uZWxzIGxpc3QsIHBsZWFzZSByZWZlciB0bworICogdGhlIGFwcHJvcHJpYXRlIENNU0lTIGRldmljZSBmaWxlIChzdG0zMmc0eHh4eC5oKSkKKyAqIEBwYXJhbSAgIFByaW9yaXR5R3JvdXA6IHRoZSBwcmlvcml0eSBncm91cGluZyBiaXRzIGxlbmd0aC4KKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICBAYXJnIE5WSUNfUFJJT1JJVFlHUk9VUF8wOiAwIGJpdCBmb3IgcHJlLWVtcHRpb24gcHJpb3JpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCBiaXRzIGZvciBzdWJwcmlvcml0eQorICogICAgICAgICAgIEBhcmcgTlZJQ19QUklPUklUWUdST1VQXzE6IDEgYml0IGZvciBwcmUtZW1wdGlvbiBwcmlvcml0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzIGJpdHMgZm9yIHN1YnByaW9yaXR5CisgKiAgICAgICAgICAgQGFyZyBOVklDX1BSSU9SSVRZR1JPVVBfMjogMiBiaXRzIGZvciBwcmUtZW1wdGlvbiBwcmlvcml0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyIGJpdHMgZm9yIHN1YnByaW9yaXR5CisgKiAgICAgICAgICAgQGFyZyBOVklDX1BSSU9SSVRZR1JPVVBfMzogMyBiaXRzIGZvciBwcmUtZW1wdGlvbiBwcmlvcml0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIGJpdCBmb3Igc3VicHJpb3JpdHkKKyAqICAgICAgICAgICBAYXJnIE5WSUNfUFJJT1JJVFlHUk9VUF80OiA0IGJpdHMgZm9yIHByZS1lbXB0aW9uIHByaW9yaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgYml0IGZvciBzdWJwcmlvcml0eQorICogQHBhcmFtICBwUHJlZW1wdFByaW9yaXR5OiBQb2ludGVyIG9uIHRoZSBQcmVlbXB0aXZlIHByaW9yaXR5IHZhbHVlIChzdGFydGluZworICogZnJvbSAwKS4KKyAqIEBwYXJhbSAgcFN1YlByaW9yaXR5OiBQb2ludGVyIG9uIHRoZSBTdWJwcmlvcml0eSB2YWx1ZSAoc3RhcnRpbmcgZnJvbSAwKS4KKyAqIEByZXR2YWwgTm9uZQorICovCit2b2lkIEhBTF9OVklDX0dldFByaW9yaXR5KElSUW5fVHlwZSBJUlFuLCB1aW50MzJfdCBQcmlvcml0eUdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFByZWVtcHRQcmlvcml0eSwgdWludDMyX3QgKnBTdWJQcmlvcml0eSkgeworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfTlZJQ19QUklPUklUWV9HUk9VUChQcmlvcml0eUdyb3VwKSk7CisgIC8qIEdldCBwcmlvcml0eSBmb3IgQ29ydGV4LU0gc3lzdGVtIG9yIGRldmljZSBzcGVjaWZpYyBpbnRlcnJ1cHRzICovCisgIE5WSUNfRGVjb2RlUHJpb3JpdHkoTlZJQ19HZXRQcmlvcml0eShJUlFuKSwgUHJpb3JpdHlHcm91cCwgcFByZWVtcHRQcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICBwU3ViUHJpb3JpdHkpOworfQorCisvKioKKyAqIEBicmllZiAgU2V0IFBlbmRpbmcgYml0IG9mIGFuIGV4dGVybmFsIGludGVycnVwdC4KKyAqIEBwYXJhbSAgSVJRbiBFeHRlcm5hbCBpbnRlcnJ1cHQgbnVtYmVyCisgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbiBlbnVtZXJhdG9yIG9mIElSUW5fVHlwZSBlbnVtZXJhdGlvbgorICogICAgICAgICAoRm9yIHRoZSBjb21wbGV0ZSBTVE0zMiBEZXZpY2VzIElSUSBDaGFubmVscyBsaXN0LCBwbGVhc2UgcmVmZXIgdG8KKyAqIHRoZSBhcHByb3ByaWF0ZSBDTVNJUyBkZXZpY2UgZmlsZSAoc3RtMzJnNHh4eHguaCkpCisgKiBAcmV0dmFsIE5vbmUKKyAqLwordm9pZCBIQUxfTlZJQ19TZXRQZW5kaW5nSVJRKElSUW5fVHlwZSBJUlFuKSB7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19OVklDX0RFVklDRV9JUlEoSVJRbikpOworCisgIC8qIFNldCBpbnRlcnJ1cHQgcGVuZGluZyAqLworICBOVklDX1NldFBlbmRpbmdJUlEoSVJRbik7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgUGVuZGluZyBJbnRlcnJ1cHQgKHJlYWQgdGhlIHBlbmRpbmcgcmVnaXN0ZXIgaW4gdGhlIE5WSUMKKyAqICAgICAgICAgYW5kIHJldHVybiB0aGUgcGVuZGluZyBiaXQgZm9yIHRoZSBzcGVjaWZpZWQgaW50ZXJydXB0KS4KKyAqIEBwYXJhbSAgSVJRbiBFeHRlcm5hbCBpbnRlcnJ1cHQgbnVtYmVyLgorICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFuIGVudW1lcmF0b3Igb2YgSVJRbl9UeXBlIGVudW1lcmF0aW9uCisgKiAgICAgICAgIChGb3IgdGhlIGNvbXBsZXRlIFNUTTMyIERldmljZXMgSVJRIENoYW5uZWxzIGxpc3QsIHBsZWFzZSByZWZlciB0bworICogdGhlIGFwcHJvcHJpYXRlIENNU0lTIGRldmljZSBmaWxlIChzdG0zMmc0eHh4eC5oKSkKKyAqIEByZXR2YWwgc3RhdHVzOiAtIDAgIEludGVycnVwdCBzdGF0dXMgaXMgbm90IHBlbmRpbmcuCisgKiAgICAgICAgICAgICAgICAgLSAxICBJbnRlcnJ1cHQgc3RhdHVzIGlzIHBlbmRpbmcuCisgKi8KK3VpbnQzMl90IEhBTF9OVklDX0dldFBlbmRpbmdJUlEoSVJRbl9UeXBlIElSUW4pIHsKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX05WSUNfREVWSUNFX0lSUShJUlFuKSk7CisKKyAgLyogUmV0dXJuIDEgaWYgcGVuZGluZyBlbHNlIDAgKi8KKyAgcmV0dXJuIE5WSUNfR2V0UGVuZGluZ0lSUShJUlFuKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENsZWFyIHRoZSBwZW5kaW5nIGJpdCBvZiBhbiBleHRlcm5hbCBpbnRlcnJ1cHQuCisgKiBAcGFyYW0gIElSUW4gRXh0ZXJuYWwgaW50ZXJydXB0IG51bWJlci4KKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFuIGVudW1lcmF0b3Igb2YgSVJRbl9UeXBlIGVudW1lcmF0aW9uCisgKiAgICAgICAgIChGb3IgdGhlIGNvbXBsZXRlIFNUTTMyIERldmljZXMgSVJRIENoYW5uZWxzIGxpc3QsIHBsZWFzZSByZWZlciB0bworICogdGhlIGFwcHJvcHJpYXRlIENNU0lTIGRldmljZSBmaWxlIChzdG0zMmc0eHh4eC5oKSkKKyAqIEByZXR2YWwgTm9uZQorICovCit2b2lkIEhBTF9OVklDX0NsZWFyUGVuZGluZ0lSUShJUlFuX1R5cGUgSVJRbikgeworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfTlZJQ19ERVZJQ0VfSVJRKElSUW4pKTsKKworICAvKiBDbGVhciBwZW5kaW5nIGludGVycnVwdCAqLworICBOVklDX0NsZWFyUGVuZGluZ0lSUShJUlFuKTsKK30KKworLyoqCisgKiBAYnJpZWYgR2V0IGFjdGl2ZSBpbnRlcnJ1cHQgKHJlYWQgdGhlIGFjdGl2ZSByZWdpc3RlciBpbiBOVklDIGFuZCByZXR1cm4gdGhlCisgKiBhY3RpdmUgYml0KS4KKyAqIEBwYXJhbSBJUlFuIEV4dGVybmFsIGludGVycnVwdCBudW1iZXIKKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFuIGVudW1lcmF0b3Igb2YgSVJRbl9UeXBlIGVudW1lcmF0aW9uCisgKiAgICAgICAgIChGb3IgdGhlIGNvbXBsZXRlIFNUTTMyIERldmljZXMgSVJRIENoYW5uZWxzIGxpc3QsIHBsZWFzZSByZWZlciB0bworICogdGhlIGFwcHJvcHJpYXRlIENNU0lTIGRldmljZSBmaWxlIChzdG0zMmc0eHh4eC5oKSkKKyAqIEByZXR2YWwgc3RhdHVzOiAtIDAgIEludGVycnVwdCBzdGF0dXMgaXMgbm90IHBlbmRpbmcuCisgKiAgICAgICAgICAgICAgICAgLSAxICBJbnRlcnJ1cHQgc3RhdHVzIGlzIHBlbmRpbmcuCisgKi8KK3VpbnQzMl90IEhBTF9OVklDX0dldEFjdGl2ZShJUlFuX1R5cGUgSVJRbikgeworICAvKiBSZXR1cm4gMSBpZiBhY3RpdmUgZWxzZSAwICovCisgIHJldHVybiBOVklDX0dldEFjdGl2ZShJUlFuKTsKK30KKworLyoqCisgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgU3lzVGljayBjbG9jayBzb3VyY2UuCisgKiBAcGFyYW0gIENMS1NvdXJjZTogc3BlY2lmaWVzIHRoZSBTeXNUaWNrIGNsb2NrIHNvdXJjZS4KKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgICBAYXJnIFNZU1RJQ0tfQ0xLU09VUkNFX0hDTEtfRElWODogQUhCIGNsb2NrIGRpdmlkZWQgYnkgOCBzZWxlY3RlZAorICogYXMgU3lzVGljayBjbG9jayBzb3VyY2UuCisgKiAgICAgICAgICAgICBAYXJnIFNZU1RJQ0tfQ0xLU09VUkNFX0hDTEs6IEFIQiBjbG9jayBzZWxlY3RlZCBhcyBTeXNUaWNrIGNsb2NrCisgKiBzb3VyY2UuCisgKiBAcmV0dmFsIE5vbmUKKyAqLwordm9pZCBIQUxfU1lTVElDS19DTEtTb3VyY2VDb25maWcodWludDMyX3QgQ0xLU291cmNlKSB7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19TWVNUSUNLX0NMS19TT1VSQ0UoQ0xLU291cmNlKSk7CisgIGlmIChDTEtTb3VyY2UgPT0gU1lTVElDS19DTEtTT1VSQ0VfSENMSykgeworICAgIFN5c1RpY2stPkNUUkwgfD0gU1lTVElDS19DTEtTT1VSQ0VfSENMSzsKKyAgfSBlbHNlIHsKKyAgICBTeXNUaWNrLT5DVFJMICY9IH5TWVNUSUNLX0NMS1NPVVJDRV9IQ0xLOworICB9Cit9CisKKy8qKgorICogQGJyaWVmICBIYW5kbGUgU1lTVElDSyBpbnRlcnJ1cHQgcmVxdWVzdC4KKyAqIEByZXR2YWwgTm9uZQorICovCit2b2lkIEhBTF9TWVNUSUNLX0lSUUhhbmRsZXIodm9pZCkgeyBIQUxfU1lTVElDS19DYWxsYmFjaygpOyB9CisKKy8qKgorICogQGJyaWVmICBTWVNUSUNLIGNhbGxiYWNrLgorICogQHJldHZhbCBOb25lCisgKi8KK19fd2VhayB2b2lkIEhBTF9TWVNUSUNLX0NhbGxiYWNrKHZvaWQpIHsKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9TWVNUSUNLX0NhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKyNpZiAoX19NUFVfUFJFU0VOVCA9PSAxKQorLyoqCisgKiBAYnJpZWYgIEVuYWJsZSB0aGUgTVBVLgorICogQHBhcmFtICBNUFVfQ29udHJvbDogU3BlY2lmaWVzIHRoZSBjb250cm9sIG1vZGUgb2YgdGhlIE1QVSBkdXJpbmcgaGFyZCBmYXVsdCwKKyAqICAgICAgICAgIE5NSSwgRkFVTFRNQVNLIGFuZCBwcml2aWxlZ2VkIGFjY2Vzc3RvIHRoZSBkZWZhdWx0IG1lbW9yeQorICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBNUFVfSEZOTUlfUFJJVkRFRl9OT05FCisgKiAgICAgICAgICAgIEBhcmcgTVBVX0hBUkRGQVVMVF9OTUkKKyAqICAgICAgICAgICAgQGFyZyBNUFVfUFJJVklMRUdFRF9ERUZBVUxUCisgKiAgICAgICAgICAgIEBhcmcgTVBVX0hGTk1JX1BSSVZERUYKKyAqIEByZXR2YWwgTm9uZQorICovCit2b2lkIEhBTF9NUFVfRW5hYmxlKHVpbnQzMl90IE1QVV9Db250cm9sKSB7CisgIC8qIEVuYWJsZSB0aGUgTVBVICovCisgIE1QVS0+Q1RSTCA9IChNUFVfQ29udHJvbCB8IE1QVV9DVFJMX0VOQUJMRV9Nc2spOworCisgIC8qIEVuc3VyZSBNUFUgc2V0dGluZyB0YWtlIGVmZmVjdHMgKi8KKyAgX19EU0IoKTsKKyAgX19JU0IoKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgdGhlIE1QVS4KKyAqIEByZXR2YWwgTm9uZQorICovCit2b2lkIEhBTF9NUFVfRGlzYWJsZSh2b2lkKSB7CisgIC8qIE1ha2Ugc3VyZSBvdXRzdGFuZGluZyB0cmFuc2ZlcnMgYXJlIGRvbmUgKi8KKyAgX19ETUIoKTsKKworICAvKiBEaXNhYmxlIHRoZSBNUFUgYW5kIGNsZWFyIHRoZSBjb250cm9sIHJlZ2lzdGVyKi8KKyAgTVBVLT5DVFJMID0gMDsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSB0aGUgTVBVIFJlZ2lvbi4KKyAqIEByZXR2YWwgTm9uZQorICovCit2b2lkIEhBTF9NUFVfRW5hYmxlUmVnaW9uKHVpbnQzMl90IFJlZ2lvbk51bWJlcikgeworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfTVBVX1JFR0lPTl9OVU1CRVIoUmVnaW9uTnVtYmVyKSk7CisKKyAgLyogU2V0IHRoZSBSZWdpb24gbnVtYmVyICovCisgIE1QVS0+Uk5SID0gUmVnaW9uTnVtYmVyOworCisgIC8qIEVuYWJsZSB0aGUgUmVnaW9uICovCisgIFNFVF9CSVQoTVBVLT5SQVNSLCBNUFVfUkFTUl9FTkFCTEVfTXNrKTsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgdGhlIE1QVSBSZWdpb24uCisgKiBAcmV0dmFsIE5vbmUKKyAqLwordm9pZCBIQUxfTVBVX0Rpc2FibGVSZWdpb24odWludDMyX3QgUmVnaW9uTnVtYmVyKSB7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19NUFVfUkVHSU9OX05VTUJFUihSZWdpb25OdW1iZXIpKTsKKworICAvKiBTZXQgdGhlIFJlZ2lvbiBudW1iZXIgKi8KKyAgTVBVLT5STlIgPSBSZWdpb25OdW1iZXI7CisKKyAgLyogRGlzYWJsZSB0aGUgUmVnaW9uICovCisgIENMRUFSX0JJVChNUFUtPlJBU1IsIE1QVV9SQVNSX0VOQUJMRV9Nc2spOworfQorCisvKioKKyAqIEBicmllZiAgSW5pdGlhbGl6ZSBhbmQgY29uZmlndXJlIHRoZSBSZWdpb24gYW5kIHRoZSBtZW1vcnkgdG8gYmUgcHJvdGVjdGVkLgorICogQHBhcmFtICBNUFVfSW5pdDogUG9pbnRlciB0byBhIE1QVV9SZWdpb25fSW5pdFR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAqICAgICAgICAgICAgICAgIHRoZSBpbml0aWFsaXphdGlvbiBhbmQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4KKyAqIEByZXR2YWwgTm9uZQorICovCit2b2lkIEhBTF9NUFVfQ29uZmlnUmVnaW9uKE1QVV9SZWdpb25fSW5pdFR5cGVEZWYgKk1QVV9Jbml0KSB7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19NUFVfUkVHSU9OX05VTUJFUihNUFVfSW5pdC0+TnVtYmVyKSk7CisgIGFzc2VydF9wYXJhbShJU19NUFVfUkVHSU9OX0VOQUJMRShNUFVfSW5pdC0+RW5hYmxlKSk7CisgIGFzc2VydF9wYXJhbShJU19NUFVfSU5TVFJVQ1RJT05fQUNDRVNTKE1QVV9Jbml0LT5EaXNhYmxlRXhlYykpOworICBhc3NlcnRfcGFyYW0oSVNfTVBVX1JFR0lPTl9QRVJNSVNTSU9OX0FUVFJJQlVURShNUFVfSW5pdC0+QWNjZXNzUGVybWlzc2lvbikpOworICBhc3NlcnRfcGFyYW0oSVNfTVBVX1RFWF9MRVZFTChNUFVfSW5pdC0+VHlwZUV4dEZpZWxkKSk7CisgIGFzc2VydF9wYXJhbShJU19NUFVfQUNDRVNTX1NIQVJFQUJMRShNUFVfSW5pdC0+SXNTaGFyZWFibGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX01QVV9BQ0NFU1NfQ0FDSEVBQkxFKE1QVV9Jbml0LT5Jc0NhY2hlYWJsZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTVBVX0FDQ0VTU19CVUZGRVJBQkxFKE1QVV9Jbml0LT5Jc0J1ZmZlcmFibGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX01QVV9TVUJfUkVHSU9OX0RJU0FCTEUoTVBVX0luaXQtPlN1YlJlZ2lvbkRpc2FibGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX01QVV9SRUdJT05fU0laRShNUFVfSW5pdC0+U2l6ZSkpOworICAvKiBTZXQgdGhlIFJlZ2lvbiBudW1iZXIgKi8KKyAgTVBVLT5STlIgPSBNUFVfSW5pdC0+TnVtYmVyOworCisgIC8qIERpc2FibGUgdGhlIFJlZ2lvbiAqLworICBDTEVBUl9CSVQoTVBVLT5SQVNSLCBNUFVfUkFTUl9FTkFCTEVfTXNrKTsKKworICAvKiBBcHBseSBjb25maWd1cmF0aW9uICovCisgIE1QVS0+UkJBUiA9IE1QVV9Jbml0LT5CYXNlQWRkcmVzczsKKyAgTVBVLT5SQVNSID0gKCh1aW50MzJfdClNUFVfSW5pdC0+RGlzYWJsZUV4ZWMgPDwgTVBVX1JBU1JfWE5fUG9zKSB8CisgICAgICAgICAgICAgICgodWludDMyX3QpTVBVX0luaXQtPkFjY2Vzc1Blcm1pc3Npb24gPDwgTVBVX1JBU1JfQVBfUG9zKSB8CisgICAgICAgICAgICAgICgodWludDMyX3QpTVBVX0luaXQtPlR5cGVFeHRGaWVsZCA8PCBNUFVfUkFTUl9URVhfUG9zKSB8CisgICAgICAgICAgICAgICgodWludDMyX3QpTVBVX0luaXQtPklzU2hhcmVhYmxlIDw8IE1QVV9SQVNSX1NfUG9zKSB8CisgICAgICAgICAgICAgICgodWludDMyX3QpTVBVX0luaXQtPklzQ2FjaGVhYmxlIDw8IE1QVV9SQVNSX0NfUG9zKSB8CisgICAgICAgICAgICAgICgodWludDMyX3QpTVBVX0luaXQtPklzQnVmZmVyYWJsZSA8PCBNUFVfUkFTUl9CX1BvcykgfAorICAgICAgICAgICAgICAoKHVpbnQzMl90KU1QVV9Jbml0LT5TdWJSZWdpb25EaXNhYmxlIDw8IE1QVV9SQVNSX1NSRF9Qb3MpIHwKKyAgICAgICAgICAgICAgKCh1aW50MzJfdClNUFVfSW5pdC0+U2l6ZSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgfAorICAgICAgICAgICAgICAoKHVpbnQzMl90KU1QVV9Jbml0LT5FbmFibGUgPDwgTVBVX1JBU1JfRU5BQkxFX1Bvcyk7Cit9CisjZW5kaWYgLyogX19NUFVfUFJFU0VOVCAqLworCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCisKKyNlbmRpZiAvKiBIQUxfQ09SVEVYX01PRFVMRV9FTkFCTEVEICovCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCmRpZmYgLS1naXQgYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfZG1hLmMgYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfZG1hLmMKaW5kZXggN2U0YzgzMS4uYWMzYzhmOWQgMTAwNjQ0Ci0tLSBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9kbWEuYworKysgYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfZG1hLmMKQEAgLTEsMTA3NyArMSwxMDc4IEBACi0vKioNCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgKiBAZmlsZSAgICBzdG0zMmc0eHhfaGFsX2RtYS5jDQotICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtDQotICAqIEBicmllZiAgIERNQSBIQUwgbW9kdWxlIGRyaXZlci4NCi0gICogICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nDQotICAqICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBEaXJlY3QgTWVtb3J5IEFjY2VzcyAoRE1BKSBwZXJpcGhlcmFsOg0KLSAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zDQotICAqICAgICAgICAgICArIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMNCi0gICogICAgICAgICAgICsgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgZXJyb3JzIGZ1bmN0aW9ucw0KLSAgKg0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICAqIEBhdHRlbnRpb24NCi0gICoNCi0gICogQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4NCi0gICogQWxsIHJpZ2h0cyByZXNlcnZlZC4NCi0gICoNCi0gICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0ZXJtcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlDQotICAqIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4NCi0gICogSWYgbm8gTElDRU5TRSBmaWxlIGNvbWVzIHdpdGggdGhpcyBzb2Z0d2FyZSwgaXQgaXMgcHJvdmlkZWQgQVMtSVMuDQotICAqDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gIEB2ZXJiYXRpbQ0KLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIw0KLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICBbLi5dDQotICAgKCMpIEVuYWJsZSBhbmQgY29uZmlndXJlIHRoZSBwZXJpcGhlcmFsIHRvIGJlIGNvbm5lY3RlZCB0byB0aGUgRE1BIENoYW5uZWwNCi0gICAgICAgKGV4Y2VwdCBmb3IgaW50ZXJuYWwgU1JBTSAvIEZMQVNIIG1lbW9yaWVzOiBubyBpbml0aWFsaXphdGlvbiBpcw0KLSAgICAgICBuZWNlc3NhcnkpLiBQbGVhc2UgcmVmZXIgdG8gdGhlIFJlZmVyZW5jZSBtYW51YWwgZm9yIGNvbm5lY3Rpb24gYmV0d2Vlbg0KLSAgcGVyaXBoZXJhbHMgYW5kIERNQSByZXF1ZXN0cy4NCi0NCi0gICAoIykgRm9yIGEgZ2l2ZW4gQ2hhbm5lbCwgcHJvZ3JhbSB0aGUgcmVxdWlyZWQgY29uZmlndXJhdGlvbiB0aHJvdWdoIHRoZQ0KLSAgZm9sbG93aW5nIHBhcmFtZXRlcnM6IENoYW5uZWwgcmVxdWVzdCwgVHJhbnNmZXIgRGlyZWN0aW9uLCBTb3VyY2UgYW5kDQotICBEZXN0aW5hdGlvbiBkYXRhIGZvcm1hdHMsIENpcmN1bGFyIG9yIE5vcm1hbCBtb2RlLCBDaGFubmVsIFByaW9yaXR5IGxldmVsLA0KLSAgU291cmNlIGFuZCBEZXN0aW5hdGlvbiBJbmNyZW1lbnQgbW9kZSB1c2luZyBIQUxfRE1BX0luaXQoKSBmdW5jdGlvbi4NCi0NCi0gICAgICAgUHJpb3IgdG8gSEFMX0RNQV9Jbml0IHRoZSBwZXJpcGhlcmFsIGNsb2NrIHNoYWxsIGJlIGVuYWJsZWQgZm9yIGJvdGggRE1BDQotICAmIERNQU1VWCB0aGFua3MgdG86DQotICAgICAgKCMjKSBETUExIG9yIERNQTI6IF9fSEFMX1JDQ19ETUExX0NMS19FTkFCTEUoKSBvcg0KLSAgX19IQUxfUkNDX0RNQTJfQ0xLX0VOQUJMRSgpIDsNCi0gICAgICAoIyMpIERNQU1VWDE6ICAgICAgX19IQUxfUkNDX0RNQU1VWDFfQ0xLX0VOQUJMRSgpOw0KLQ0KLSAgICgjKSBVc2UgSEFMX0RNQV9HZXRTdGF0ZSgpIGZ1bmN0aW9uIHRvIHJldHVybiB0aGUgRE1BIHN0YXRlIGFuZA0KLSAgSEFMX0RNQV9HZXRFcnJvcigpIGluIGNhc2Ugb2YgZXJyb3IgZGV0ZWN0aW9uLg0KLQ0KLSAgICgjKSBVc2UgSEFMX0RNQV9BYm9ydCgpIGZ1bmN0aW9uIHRvIGFib3J0IHRoZSBjdXJyZW50IHRyYW5zZmVyDQotDQotICAgICAtQC0gICBJbiBNZW1vcnktdG8tTWVtb3J5IHRyYW5zZmVyIG1vZGUsIENpcmN1bGFyIG1vZGUgaXMgbm90IGFsbG93ZWQuDQotDQotICAgICAqKiogUG9sbGluZyBtb2RlIElPIG9wZXJhdGlvbiAqKioNCi0gICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICBbLi5dDQotICAgICAgICAgICgrKSBVc2UgSEFMX0RNQV9TdGFydCgpIHRvIHN0YXJ0IERNQSB0cmFuc2ZlciBhZnRlciB0aGUgY29uZmlndXJhdGlvbg0KLSAgb2YgU291cmNlIGFkZHJlc3MgYW5kIGRlc3RpbmF0aW9uIGFkZHJlc3MgYW5kIHRoZSBMZW5ndGggb2YgZGF0YSB0byBiZQ0KLSAgdHJhbnNmZXJyZWQNCi0gICAgICAgICAgKCspIFVzZSBIQUxfRE1BX1BvbGxGb3JUcmFuc2ZlcigpIHRvIHBvbGwgZm9yIHRoZSBlbmQgb2YgY3VycmVudA0KLSAgdHJhbnNmZXIsIGluIHRoaXMgY2FzZSBhIGZpeGVkIFRpbWVvdXQgY2FuIGJlIGNvbmZpZ3VyZWQgYnkgVXNlciBkZXBlbmRpbmcNCi0gIGZyb20gaGlzIGFwcGxpY2F0aW9uLg0KLQ0KLSAgICAgKioqIEludGVycnVwdCBtb2RlIElPIG9wZXJhdGlvbiAqKioNCi0gICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgIFsuLl0NCi0gICAgICAgICAgKCspIENvbmZpZ3VyZSB0aGUgRE1BIGludGVycnVwdCBwcmlvcml0eSB1c2luZyBIQUxfTlZJQ19TZXRQcmlvcml0eSgpDQotICAgICAgICAgICgrKSBFbmFibGUgdGhlIERNQSBJUlEgaGFuZGxlciB1c2luZyBIQUxfTlZJQ19FbmFibGVJUlEoKQ0KLSAgICAgICAgICAoKykgVXNlIEhBTF9ETUFfU3RhcnRfSVQoKSB0byBzdGFydCBETUEgdHJhbnNmZXIgYWZ0ZXIgdGhlDQotICBjb25maWd1cmF0aW9uIG9mIFNvdXJjZSBhZGRyZXNzIGFuZCBkZXN0aW5hdGlvbiBhZGRyZXNzIGFuZCB0aGUgTGVuZ3RoIG9mIGRhdGENCi0gIHRvIGJlIHRyYW5zZmVycmVkLiBJbiB0aGlzIGNhc2UgdGhlIERNQSBpbnRlcnJ1cHQgaXMgY29uZmlndXJlZA0KLSAgICAgICAgICAoKykgVXNlIEhBTF9ETUFfSVJRSGFuZGxlcigpIGNhbGxlZCB1bmRlciBETUFfSVJRSGFuZGxlcigpIEludGVycnVwdA0KLSAgc3Vicm91dGluZQ0KLSAgICAgICAgICAoKykgQXQgdGhlIGVuZCBvZiBkYXRhIHRyYW5zZmVyIEhBTF9ETUFfSVJRSGFuZGxlcigpIGZ1bmN0aW9uIGlzDQotICBleGVjdXRlZCBhbmQgdXNlciBjYW4gYWRkIGhpcyBvd24gZnVuY3Rpb24gdG8gcmVnaXN0ZXIgY2FsbGJhY2tzIHdpdGgNCi0gIEhBTF9ETUFfUmVnaXN0ZXJDYWxsYmFjaygpLg0KLQ0KLSAgICAgKioqIERNQSBIQUwgZHJpdmVyIG1hY3JvcyBsaXN0ICoqKg0KLSAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgICAgWy4uXQ0KLSAgICAgICBCZWxvdyB0aGUgbGlzdCBvZiBtYWNyb3MgaW4gRE1BIEhBTCBkcml2ZXIuDQotDQotICAgICAgICgrKSBfX0hBTF9ETUFfRU5BQkxFOiBFbmFibGUgdGhlIHNwZWNpZmllZCBETUEgQ2hhbm5lbC4NCi0gICAgICAgKCspIF9fSEFMX0RNQV9ESVNBQkxFOiBEaXNhYmxlIHRoZSBzcGVjaWZpZWQgRE1BIENoYW5uZWwuDQotICAgICAgICgrKSBfX0hBTF9ETUFfR0VUX0ZMQUc6IEdldCB0aGUgRE1BIENoYW5uZWwgcGVuZGluZyBmbGFncy4NCi0gICAgICAgKCspIF9fSEFMX0RNQV9DTEVBUl9GTEFHOiBDbGVhciB0aGUgRE1BIENoYW5uZWwgcGVuZGluZyBmbGFncy4NCi0gICAgICAgKCspIF9fSEFMX0RNQV9FTkFCTEVfSVQ6IEVuYWJsZSB0aGUgc3BlY2lmaWVkIERNQSBDaGFubmVsIGludGVycnVwdHMuDQotICAgICAgICgrKSBfX0hBTF9ETUFfRElTQUJMRV9JVDogRGlzYWJsZSB0aGUgc3BlY2lmaWVkIERNQSBDaGFubmVsIGludGVycnVwdHMuDQotICAgICAgICgrKSBfX0hBTF9ETUFfR0VUX0lUX1NPVVJDRTogQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIERNQSBDaGFubmVsDQotICBpbnRlcnJ1cHQgaGFzIG9jY3VycmVkIG9yIG5vdC4NCi0NCi0gICAgIFsuLl0NCi0gICAgICAoQCkgWW91IGNhbiByZWZlciB0byB0aGUgRE1BIEhBTCBkcml2ZXIgaGVhZGVyIGZpbGUgZm9yIG1vcmUgdXNlZnVsIG1hY3Jvcw0KLQ0KLSAgQGVuZHZlcmJhdGltDQotICAqLw0KLQ0KLS8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotI2luY2x1ZGUgInN0bTMyZzR4eF9oYWwuaCINCi0NCi0vKiogQGFkZHRvZ3JvdXAgU1RNMzJHNHh4X0hBTF9Ecml2ZXINCi0gKiBAew0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRE1BIERNQQ0KLSAqIEBicmllZiBETUEgSEFMIG1vZHVsZSBkcml2ZXINCi0gKiBAew0KLSAqLw0KLQ0KLSNpZmRlZiBIQUxfRE1BX01PRFVMRV9FTkFCTEVEDQotDQotLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgRE1BX1ByaXZhdGVfRnVuY3Rpb25zIERNQSBQcml2YXRlIEZ1bmN0aW9ucw0KLSAqIEB7DQotICovDQotc3RhdGljIHZvaWQgRE1BX1NldENvbmZpZyhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSwgdWludDMyX3QgU3JjQWRkcmVzcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IERzdEFkZHJlc3MsIHVpbnQzMl90IERhdGFMZW5ndGgpOw0KLQ0KLXN0YXRpYyB2b2lkIERNQV9DYWxjRE1BTVVYQ2hhbm5lbEJhc2VBbmRNYXNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsNCi1zdGF0aWMgdm9pZCBETUFfQ2FsY0RNQU1VWFJlcXVlc3RHZW5CYXNlQW5kTWFzayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiBFeHBvcnRlZCBmdW5jdGlvbnMNCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRE1BX0V4cG9ydGVkX0Z1bmN0aW9ucyBETUEgRXhwb3J0ZWQgRnVuY3Rpb25zDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIERNQV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbg0KLWZ1bmN0aW9ucw0KLSAgKiAgQGJyaWVmICAgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucw0KLSAgKg0KLUB2ZXJiYXRpbQ0KLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgICAgICAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgICMjIyMjDQotID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgWy4uXQ0KLSAgICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGluaXRpYWxpemUgdGhlIERNQSBDaGFubmVsDQotc291cmNlIGFuZCBkZXN0aW5hdGlvbiBhZGRyZXNzZXMsIGluY3JlbWVudGF0aW9uIGFuZCBkYXRhIHNpemVzLCB0cmFuc2Zlcg0KLWRpcmVjdGlvbiwgY2lyY3VsYXIvbm9ybWFsIG1vZGUgc2VsZWN0aW9uLCBtZW1vcnktdG8tbWVtb3J5IG1vZGUgc2VsZWN0aW9uIGFuZA0KLUNoYW5uZWwgcHJpb3JpdHkgdmFsdWUuDQotICAgIFsuLl0NCi0gICAgVGhlIEhBTF9ETUFfSW5pdCgpIGZ1bmN0aW9uIGZvbGxvd3MgdGhlIERNQSBjb25maWd1cmF0aW9uIHByb2NlZHVyZXMgYXMNCi1kZXNjcmliZWQgaW4gcmVmZXJlbmNlIG1hbnVhbC4NCi0NCi1AZW5kdmVyYmF0aW0NCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBETUEgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQNCi0gKiAgICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIERNQV9Jbml0VHlwZURlZiBhbmQgaW5pdGlhbGl6ZSB0aGUgYXNzb2NpYXRlZA0KLSAqIGhhbmRsZS4NCi0gKiBAcGFyYW0gIGhkbWEgUG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQotICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgQ2hhbm5lbC4NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BX0luaXQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpIHsNCi0gIHVpbnQzMl90IHRtcDsNCi0NCi0gIC8qIENoZWNrIHRoZSBETUEgaGFuZGxlIGFsbG9jYXRpb24gKi8NCi0gIGlmIChoZG1hID09IE5VTEwpIHsNCi0gICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gIH0NCi0NCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfRE1BX0FMTF9JTlNUQU5DRShoZG1hLT5JbnN0YW5jZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0RNQV9ESVJFQ1RJT04oaGRtYS0+SW5pdC5EaXJlY3Rpb24pKTsNCi0gIGFzc2VydF9wYXJhbShJU19ETUFfUEVSSVBIRVJBTF9JTkNfU1RBVEUoaGRtYS0+SW5pdC5QZXJpcGhJbmMpKTsNCi0gIGFzc2VydF9wYXJhbShJU19ETUFfTUVNT1JZX0lOQ19TVEFURShoZG1hLT5Jbml0Lk1lbUluYykpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0RNQV9QRVJJUEhFUkFMX0RBVEFfU0laRShoZG1hLT5Jbml0LlBlcmlwaERhdGFBbGlnbm1lbnQpKTsNCi0gIGFzc2VydF9wYXJhbShJU19ETUFfTUVNT1JZX0RBVEFfU0laRShoZG1hLT5Jbml0Lk1lbURhdGFBbGlnbm1lbnQpKTsNCi0gIGFzc2VydF9wYXJhbShJU19ETUFfTU9ERShoZG1hLT5Jbml0Lk1vZGUpKTsNCi0gIGFzc2VydF9wYXJhbShJU19ETUFfUFJJT1JJVFkoaGRtYS0+SW5pdC5Qcmlvcml0eSkpOw0KLQ0KLSAgYXNzZXJ0X3BhcmFtKElTX0RNQV9BTExfUkVRVUVTVChoZG1hLT5Jbml0LlJlcXVlc3QpKTsNCi0NCi0gIC8qIENvbXB1dGUgdGhlIGNoYW5uZWwgaW5kZXggKi8NCi0gIGlmICgodWludDMyX3QpKGhkbWEtPkluc3RhbmNlKSA8ICh1aW50MzJfdCkoRE1BMl9DaGFubmVsMSkpIHsNCi0gICAgLyogRE1BMSAqLw0KLSAgICBoZG1hLT5DaGFubmVsSW5kZXggPSAoKCh1aW50MzJfdCloZG1hLT5JbnN0YW5jZSAtICh1aW50MzJfdClETUExX0NoYW5uZWwxKSAvDQotICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDIgLSAodWludDMyX3QpRE1BMV9DaGFubmVsMSkpDQotICAgICAgICAgICAgICAgICAgICAgICAgIDw8IDI7DQotICAgIGhkbWEtPkRtYUJhc2VBZGRyZXNzID0gRE1BMTsNCi0gIH0gZWxzZSB7DQotICAgIC8qIERNQTIgKi8NCi0gICAgaGRtYS0+Q2hhbm5lbEluZGV4ID0gKCgodWludDMyX3QpaGRtYS0+SW5zdGFuY2UgLSAodWludDMyX3QpRE1BMl9DaGFubmVsMSkgLw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClETUEyX0NoYW5uZWwyIC0gKHVpbnQzMl90KURNQTJfQ2hhbm5lbDEpKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICA8PCAyOw0KLSAgICBoZG1hLT5EbWFCYXNlQWRkcmVzcyA9IERNQTI7DQotICB9DQotDQotICAvKiBDaGFuZ2UgRE1BIHBlcmlwaGVyYWwgc3RhdGUgKi8NCi0gIGhkbWEtPlN0YXRlID0gSEFMX0RNQV9TVEFURV9CVVNZOw0KLQ0KLSAgLyogR2V0IHRoZSBDUiByZWdpc3RlciB2YWx1ZSAqLw0KLSAgdG1wID0gaGRtYS0+SW5zdGFuY2UtPkNDUjsNCi0NCi0gIC8qIENsZWFyIFBMLCBNU0laRSwgUFNJWkUsIE1JTkMsIFBJTkMsIENJUkMsIERJUiBhbmQgTUVNMk1FTSBiaXRzICovDQotICB0bXAgJj0gKCh1aW50MzJfdCkgfihETUFfQ0NSX1BMIHwgRE1BX0NDUl9NU0laRSB8IERNQV9DQ1JfUFNJWkUgfA0KLSAgICAgICAgICAgICAgICAgICAgICAgRE1BX0NDUl9NSU5DIHwgRE1BX0NDUl9QSU5DIHwgRE1BX0NDUl9DSVJDIHwNCi0gICAgICAgICAgICAgICAgICAgICAgIERNQV9DQ1JfRElSIHwgRE1BX0NDUl9NRU0yTUVNKSk7DQotDQotICAvKiBQcmVwYXJlIHRoZSBETUEgQ2hhbm5lbCBjb25maWd1cmF0aW9uICovDQotICB0bXAgfD0gaGRtYS0+SW5pdC5EaXJlY3Rpb24gfCBoZG1hLT5Jbml0LlBlcmlwaEluYyB8IGhkbWEtPkluaXQuTWVtSW5jIHwNCi0gICAgICAgICBoZG1hLT5Jbml0LlBlcmlwaERhdGFBbGlnbm1lbnQgfCBoZG1hLT5Jbml0Lk1lbURhdGFBbGlnbm1lbnQgfA0KLSAgICAgICAgIGhkbWEtPkluaXQuTW9kZSB8IGhkbWEtPkluaXQuUHJpb3JpdHk7DQotDQotICAvKiBXcml0ZSB0byBETUEgQ2hhbm5lbCBDUiByZWdpc3RlciAqLw0KLSAgaGRtYS0+SW5zdGFuY2UtPkNDUiA9IHRtcDsNCi0NCi0gIC8qIEluaXRpYWxpemUgcGFyYW1ldGVycyBmb3IgRE1BTVVYIGNoYW5uZWwgOg0KLSAgICAgRE1BbXV4Q2hhbm5lbCwgRE1BbXV4Q2hhbm5lbFN0YXR1cyBhbmQgRE1BbXV4Q2hhbm5lbFN0YXR1c01hc2sNCi0gICovDQotICBETUFfQ2FsY0RNQU1VWENoYW5uZWxCYXNlQW5kTWFzayhoZG1hKTsNCi0NCi0gIGlmIChoZG1hLT5Jbml0LkRpcmVjdGlvbiA9PSBETUFfTUVNT1JZX1RPX01FTU9SWSkgew0KLSAgICAvKiBpZiBtZW1vcnkgdG8gbWVtb3J5IGZvcmNlIHRoZSByZXF1ZXN0IHRvIDAqLw0KLSAgICBoZG1hLT5Jbml0LlJlcXVlc3QgPSBETUFfUkVRVUVTVF9NRU0yTUVNOw0KLSAgfQ0KLQ0KLSAgLyogU2V0IHBlcmlwaGVyYWwgcmVxdWVzdCAgdG8gRE1BTVVYIGNoYW5uZWwgKi8NCi0gIGhkbWEtPkRNQW11eENoYW5uZWwtPkNDUiA9IChoZG1hLT5Jbml0LlJlcXVlc3QgJiBETUFNVVhfQ3hDUl9ETUFSRVFfSUQpOw0KLQ0KLSAgLyogQ2xlYXIgdGhlIERNQU1VWCBzeW5jaHJvIG92ZXJydW4gZmxhZyAqLw0KLSAgaGRtYS0+RE1BbXV4Q2hhbm5lbFN0YXR1cy0+Q0ZSID0gaGRtYS0+RE1BbXV4Q2hhbm5lbFN0YXR1c01hc2s7DQotDQotICBpZiAoKChoZG1hLT5Jbml0LlJlcXVlc3QgPiAwVSkgJiYNCi0gICAgICAgKGhkbWEtPkluaXQuUmVxdWVzdCA8PSBETUFfUkVRVUVTVF9HRU5FUkFUT1IzKSkpIHsNCi0gICAgLyogSW5pdGlhbGl6ZSBwYXJhbWV0ZXJzIGZvciBETUFNVVggcmVxdWVzdCBnZW5lcmF0b3IgOg0KLSAgICAgICBETUFtdXhSZXF1ZXN0R2VuLCBETUFtdXhSZXF1ZXN0R2VuU3RhdHVzIGFuZCBETUFtdXhSZXF1ZXN0R2VuU3RhdHVzTWFzaw0KLSAgICAqLw0KLSAgICBETUFfQ2FsY0RNQU1VWFJlcXVlc3RHZW5CYXNlQW5kTWFzayhoZG1hKTsNCi0NCi0gICAgLyogUmVzZXQgdGhlIERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvciByZWdpc3RlciovDQotICAgIGhkbWEtPkRNQW11eFJlcXVlc3RHZW4tPlJHQ1IgPSAwVTsNCi0NCi0gICAgLyogQ2xlYXIgdGhlIERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvciBvdmVycnVuIGZsYWcgKi8NCi0gICAgaGRtYS0+RE1BbXV4UmVxdWVzdEdlblN0YXR1cy0+UkdDRlIgPSBoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuU3RhdHVzTWFzazsNCi0gIH0gZWxzZSB7DQotICAgIGhkbWEtPkRNQW11eFJlcXVlc3RHZW4gPSAwVTsNCi0gICAgaGRtYS0+RE1BbXV4UmVxdWVzdEdlblN0YXR1cyA9IDBVOw0KLSAgICBoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuU3RhdHVzTWFzayA9IDBVOw0KLSAgfQ0KLQ0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgZXJyb3IgY29kZSAqLw0KLSAgaGRtYS0+RXJyb3JDb2RlID0gSEFMX0RNQV9FUlJPUl9OT05FOw0KLQ0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgRE1BIHN0YXRlKi8NCi0gIGhkbWEtPlN0YXRlID0gSEFMX0RNQV9TVEFURV9SRUFEWTsNCi0NCi0gIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8NCi0gIGhkbWEtPkxvY2sgPSBIQUxfVU5MT0NLRUQ7DQotDQotICByZXR1cm4gSEFMX09LOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERlSW5pdGlhbGl6ZSB0aGUgRE1BIHBlcmlwaGVyYWwuDQotICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KLSAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIENoYW5uZWwuDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RNQV9EZUluaXQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpIHsNCi0gIC8qIENoZWNrIHRoZSBETUEgaGFuZGxlIGFsbG9jYXRpb24gKi8NCi0gIGlmIChOVUxMID09IGhkbWEpIHsNCi0gICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gIH0NCi0NCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfRE1BX0FMTF9JTlNUQU5DRShoZG1hLT5JbnN0YW5jZSkpOw0KLQ0KLSAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgRE1BIENoYW5uZWx4ICovDQotICBfX0hBTF9ETUFfRElTQUJMRShoZG1hKTsNCi0NCi0gIC8qIENvbXB1dGUgdGhlIGNoYW5uZWwgaW5kZXggKi8NCi0gIGlmICgodWludDMyX3QpKGhkbWEtPkluc3RhbmNlKSA8ICh1aW50MzJfdCkoRE1BMl9DaGFubmVsMSkpIHsNCi0gICAgLyogRE1BMSAqLw0KLSAgICBoZG1hLT5DaGFubmVsSW5kZXggPSAoKCh1aW50MzJfdCloZG1hLT5JbnN0YW5jZSAtICh1aW50MzJfdClETUExX0NoYW5uZWwxKSAvDQotICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDIgLSAodWludDMyX3QpRE1BMV9DaGFubmVsMSkpDQotICAgICAgICAgICAgICAgICAgICAgICAgIDw8IDI7DQotICAgIGhkbWEtPkRtYUJhc2VBZGRyZXNzID0gRE1BMTsNCi0gIH0gZWxzZSB7DQotICAgIC8qIERNQTIgKi8NCi0gICAgaGRtYS0+Q2hhbm5lbEluZGV4ID0gKCgodWludDMyX3QpaGRtYS0+SW5zdGFuY2UgLSAodWludDMyX3QpRE1BMl9DaGFubmVsMSkgLw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClETUEyX0NoYW5uZWwyIC0gKHVpbnQzMl90KURNQTJfQ2hhbm5lbDEpKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICA8PCAyOw0KLSAgICBoZG1hLT5EbWFCYXNlQWRkcmVzcyA9IERNQTI7DQotICB9DQotDQotICAvKiBSZXNldCBETUEgQ2hhbm5lbCBjb250cm9sIHJlZ2lzdGVyICovDQotICBoZG1hLT5JbnN0YW5jZS0+Q0NSID0gMDsNCi0NCi0gIC8qIENsZWFyIGFsbCBmbGFncyAqLw0KLSAgaGRtYS0+RG1hQmFzZUFkZHJlc3MtPklGQ1IgPSAoRE1BX0lTUl9HSUYxIDw8IChoZG1hLT5DaGFubmVsSW5kZXggJiAweDFGVSkpOw0KLQ0KLSAgLyogSW5pdGlhbGl6ZSBwYXJhbWV0ZXJzIGZvciBETUFNVVggY2hhbm5lbCA6DQotICAgICBETUFtdXhDaGFubmVsLCBETUFtdXhDaGFubmVsU3RhdHVzIGFuZCBETUFtdXhDaGFubmVsU3RhdHVzTWFzayAqLw0KLQ0KLSAgRE1BX0NhbGNETUFNVVhDaGFubmVsQmFzZUFuZE1hc2soaGRtYSk7DQotDQotICAvKiBSZXNldCB0aGUgRE1BTVVYIGNoYW5uZWwgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgRE1BIGNoYW5uZWwgKi8NCi0gIGhkbWEtPkRNQW11eENoYW5uZWwtPkNDUiA9IDA7DQotDQotICAvKiBDbGVhciB0aGUgRE1BTVVYIHN5bmNocm8gb3ZlcnJ1biBmbGFnICovDQotICBoZG1hLT5ETUFtdXhDaGFubmVsU3RhdHVzLT5DRlIgPSBoZG1hLT5ETUFtdXhDaGFubmVsU3RhdHVzTWFzazsNCi0NCi0gIC8qIFJlc2V0IFJlcXVlc3QgZ2VuZXJhdG9yIHBhcmFtZXRlcnMgaWYgYW55ICovDQotICBpZiAoKChoZG1hLT5Jbml0LlJlcXVlc3QgPiAwVSkgJiYNCi0gICAgICAgKGhkbWEtPkluaXQuUmVxdWVzdCA8PSBETUFfUkVRVUVTVF9HRU5FUkFUT1IzKSkpIHsNCi0gICAgLyogSW5pdGlhbGl6ZSBwYXJhbWV0ZXJzIGZvciBETUFNVVggcmVxdWVzdCBnZW5lcmF0b3IgOg0KLSAgICAgICBETUFtdXhSZXF1ZXN0R2VuLCBETUFtdXhSZXF1ZXN0R2VuU3RhdHVzIGFuZCBETUFtdXhSZXF1ZXN0R2VuU3RhdHVzTWFzaw0KLSAgICAqLw0KLSAgICBETUFfQ2FsY0RNQU1VWFJlcXVlc3RHZW5CYXNlQW5kTWFzayhoZG1hKTsNCi0NCi0gICAgLyogUmVzZXQgdGhlIERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvciByZWdpc3RlciovDQotICAgIGhkbWEtPkRNQW11eFJlcXVlc3RHZW4tPlJHQ1IgPSAwVTsNCi0NCi0gICAgLyogQ2xlYXIgdGhlIERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvciBvdmVycnVuIGZsYWcgKi8NCi0gICAgaGRtYS0+RE1BbXV4UmVxdWVzdEdlblN0YXR1cy0+UkdDRlIgPSBoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuU3RhdHVzTWFzazsNCi0gIH0NCi0NCi0gIGhkbWEtPkRNQW11eFJlcXVlc3RHZW4gPSAwVTsNCi0gIGhkbWEtPkRNQW11eFJlcXVlc3RHZW5TdGF0dXMgPSAwVTsNCi0gIGhkbWEtPkRNQW11eFJlcXVlc3RHZW5TdGF0dXNNYXNrID0gMFU7DQotDQotICAvKiBDbGVhbiBjYWxsYmFja3MgKi8NCi0gIGhkbWEtPlhmZXJDcGx0Q2FsbGJhY2sgPSBOVUxMOw0KLSAgaGRtYS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBOVUxMOw0KLSAgaGRtYS0+WGZlckVycm9yQ2FsbGJhY2sgPSBOVUxMOw0KLSAgaGRtYS0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOw0KLQ0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgZXJyb3IgY29kZSAqLw0KLSAgaGRtYS0+RXJyb3JDb2RlID0gSEFMX0RNQV9FUlJPUl9OT05FOw0KLQ0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgRE1BIHN0YXRlICovDQotICBoZG1hLT5TdGF0ZSA9IEhBTF9ETUFfU1RBVEVfUkVTRVQ7DQotDQotICAvKiBSZWxlYXNlIExvY2sgKi8NCi0gIF9fSEFMX1VOTE9DSyhoZG1hKTsNCi0NCi0gIHJldHVybiBIQUxfT0s7DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBETUFfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBJbnB1dCBhbmQgT3V0cHV0IG9wZXJhdGlvbiBmdW5jdGlvbnMNCi0gICogIEBicmllZiAgIElucHV0IGFuZCBPdXRwdXQgb3BlcmF0aW9uIGZ1bmN0aW9ucw0KLSAgKg0KLUB2ZXJiYXRpbQ0KLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgICAgICAgICAgICAgICAgICAgICMjIyMjICBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICAjIyMjIw0KLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86DQotICAgICAgKCspIENvbmZpZ3VyZSB0aGUgc291cmNlLCBkZXN0aW5hdGlvbiBhZGRyZXNzIGFuZCBkYXRhIGxlbmd0aCBhbmQgU3RhcnQNCi1ETUEgdHJhbnNmZXINCi0gICAgICAoKykgQ29uZmlndXJlIHRoZSBzb3VyY2UsIGRlc3RpbmF0aW9uIGFkZHJlc3MgYW5kIGRhdGEgbGVuZ3RoIGFuZA0KLSAgICAgICAgICBTdGFydCBETUEgdHJhbnNmZXIgd2l0aCBpbnRlcnJ1cHQNCi0gICAgICAoKykgQWJvcnQgRE1BIHRyYW5zZmVyDQotICAgICAgKCspIFBvbGwgZm9yIHRyYW5zZmVyIGNvbXBsZXRlDQotICAgICAgKCspIEhhbmRsZSBETUEgaW50ZXJydXB0IHJlcXVlc3QNCi0NCi1AZW5kdmVyYmF0aW0NCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICogQGJyaWVmICBTdGFydCB0aGUgRE1BIFRyYW5zZmVyLg0KLSAqIEBwYXJhbSAgaGRtYSBwb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCi0gKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBDaGFubmVsLg0KLSAqIEBwYXJhbSAgU3JjQWRkcmVzcyBUaGUgc291cmNlIG1lbW9yeSBCdWZmZXIgYWRkcmVzcw0KLSAqIEBwYXJhbSAgRHN0QWRkcmVzcyBUaGUgZGVzdGluYXRpb24gbWVtb3J5IEJ1ZmZlciBhZGRyZXNzDQotICogQHBhcmFtICBEYXRhTGVuZ3RoIFRoZSBsZW5ndGggb2YgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZCBmcm9tIHNvdXJjZSB0bw0KLSAqIGRlc3RpbmF0aW9uICh1cCB0byAyNTZLYnl0ZXMtMSkNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BX1N0YXJ0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hLCB1aW50MzJfdCBTcmNBZGRyZXNzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRHN0QWRkcmVzcywgdWludDMyX3QgRGF0YUxlbmd0aCkgew0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19ETUFfQlVGRkVSX1NJWkUoRGF0YUxlbmd0aCkpOw0KLQ0KLSAgLyogUHJvY2VzcyBsb2NrZWQgKi8NCi0gIF9fSEFMX0xPQ0soaGRtYSk7DQotDQotICBpZiAoSEFMX0RNQV9TVEFURV9SRUFEWSA9PSBoZG1hLT5TdGF0ZSkgew0KLSAgICAvKiBDaGFuZ2UgRE1BIHBlcmlwaGVyYWwgc3RhdGUgKi8NCi0gICAgaGRtYS0+U3RhdGUgPSBIQUxfRE1BX1NUQVRFX0JVU1k7DQotICAgIGhkbWEtPkVycm9yQ29kZSA9IEhBTF9ETUFfRVJST1JfTk9ORTsNCi0NCi0gICAgLyogRGlzYWJsZSB0aGUgcGVyaXBoZXJhbCAqLw0KLSAgICBfX0hBTF9ETUFfRElTQUJMRShoZG1hKTsNCi0NCi0gICAgLyogQ29uZmlndXJlIHRoZSBzb3VyY2UsIGRlc3RpbmF0aW9uIGFkZHJlc3MgYW5kIHRoZSBkYXRhIGxlbmd0aCAmIGNsZWFyDQotICAgICAqIGZsYWdzKi8NCi0gICAgRE1BX1NldENvbmZpZyhoZG1hLCBTcmNBZGRyZXNzLCBEc3RBZGRyZXNzLCBEYXRhTGVuZ3RoKTsNCi0NCi0gICAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovDQotICAgIF9fSEFMX0RNQV9FTkFCTEUoaGRtYSk7DQotICB9IGVsc2Ugew0KLSAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovDQotICAgIF9fSEFMX1VOTE9DSyhoZG1hKTsNCi0gICAgc3RhdHVzID0gSEFMX0JVU1k7DQotICB9DQotICByZXR1cm4gc3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFN0YXJ0IHRoZSBETUEgVHJhbnNmZXIgd2l0aCBpbnRlcnJ1cHQgZW5hYmxlZC4NCi0gKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQotICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgQ2hhbm5lbC4NCi0gKiBAcGFyYW0gIFNyY0FkZHJlc3MgVGhlIHNvdXJjZSBtZW1vcnkgQnVmZmVyIGFkZHJlc3MNCi0gKiBAcGFyYW0gIERzdEFkZHJlc3MgVGhlIGRlc3RpbmF0aW9uIG1lbW9yeSBCdWZmZXIgYWRkcmVzcw0KLSAqIEBwYXJhbSAgRGF0YUxlbmd0aCBUaGUgbGVuZ3RoIG9mIGRhdGEgdG8gYmUgdHJhbnNmZXJyZWQgZnJvbSBzb3VyY2UgdG8NCi0gKiBkZXN0aW5hdGlvbiAodXAgdG8gMjU2S2J5dGVzLTEpDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RNQV9TdGFydF9JVChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSwgdWludDMyX3QgU3JjQWRkcmVzcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IERzdEFkZHJlc3MsIHVpbnQzMl90IERhdGFMZW5ndGgpIHsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsNCi0NCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfRE1BX0JVRkZFUl9TSVpFKERhdGFMZW5ndGgpKTsNCi0NCi0gIC8qIFByb2Nlc3MgbG9ja2VkICovDQotICBfX0hBTF9MT0NLKGhkbWEpOw0KLQ0KLSAgaWYgKEhBTF9ETUFfU1RBVEVfUkVBRFkgPT0gaGRtYS0+U3RhdGUpIHsNCi0gICAgLyogQ2hhbmdlIERNQSBwZXJpcGhlcmFsIHN0YXRlICovDQotICAgIGhkbWEtPlN0YXRlID0gSEFMX0RNQV9TVEFURV9CVVNZOw0KLSAgICBoZG1hLT5FcnJvckNvZGUgPSBIQUxfRE1BX0VSUk9SX05PTkU7DQotDQotICAgIC8qIERpc2FibGUgdGhlIHBlcmlwaGVyYWwgKi8NCi0gICAgX19IQUxfRE1BX0RJU0FCTEUoaGRtYSk7DQotDQotICAgIC8qIENvbmZpZ3VyZSB0aGUgc291cmNlLCBkZXN0aW5hdGlvbiBhZGRyZXNzIGFuZCB0aGUgZGF0YSBsZW5ndGggJiBjbGVhcg0KLSAgICAgKiBmbGFncyovDQotICAgIERNQV9TZXRDb25maWcoaGRtYSwgU3JjQWRkcmVzcywgRHN0QWRkcmVzcywgRGF0YUxlbmd0aCk7DQotDQotICAgIC8qIEVuYWJsZSB0aGUgdHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0ICovDQotICAgIC8qIEVuYWJsZSB0aGUgdHJhbnNmZXIgRXJyb3IgaW50ZXJydXB0ICovDQotICAgIGlmIChOVUxMICE9IGhkbWEtPlhmZXJIYWxmQ3BsdENhbGxiYWNrKSB7DQotICAgICAgLyogRW5hYmxlIHRoZSBIYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdCBhcyB3ZWxsICovDQotICAgICAgX19IQUxfRE1BX0VOQUJMRV9JVChoZG1hLCAoRE1BX0lUX1RDIHwgRE1BX0lUX0hUIHwgRE1BX0lUX1RFKSk7DQotICAgIH0gZWxzZSB7DQotICAgICAgX19IQUxfRE1BX0RJU0FCTEVfSVQoaGRtYSwgRE1BX0lUX0hUKTsNCi0gICAgICBfX0hBTF9ETUFfRU5BQkxFX0lUKGhkbWEsIChETUFfSVRfVEMgfCBETUFfSVRfVEUpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKiBDaGVjayBpZiBETUFNVVggU3luY2hyb25pemF0aW9uIGlzIGVuYWJsZWQqLw0KLSAgICBpZiAoKGhkbWEtPkRNQW11eENoYW5uZWwtPkNDUiAmIERNQU1VWF9DeENSX1NFKSAhPSAwVSkgew0KLSAgICAgIC8qIEVuYWJsZSBETUFNVVggc3luYyBvdmVycnVuIElUKi8NCi0gICAgICBoZG1hLT5ETUFtdXhDaGFubmVsLT5DQ1IgfD0gRE1BTVVYX0N4Q1JfU09JRTsNCi0gICAgfQ0KLQ0KLSAgICBpZiAoaGRtYS0+RE1BbXV4UmVxdWVzdEdlbiAhPSAwVSkgew0KLSAgICAgIC8qIGlmIHVzaW5nIERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvciwgZW5hYmxlIHRoZSBETUFNVVggcmVxdWVzdCBnZW5lcmF0b3INCi0gICAgICAgKiBvdmVycnVuIElUKi8NCi0gICAgICAvKiBlbmFibGUgdGhlIHJlcXVlc3QgZ2VuIG92ZXJydW4gSVQqLw0KLSAgICAgIGhkbWEtPkRNQW11eFJlcXVlc3RHZW4tPlJHQ1IgfD0gRE1BTVVYX1JHeENSX09JRTsNCi0gICAgfQ0KLQ0KLSAgICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8NCi0gICAgX19IQUxfRE1BX0VOQUJMRShoZG1hKTsNCi0gIH0gZWxzZSB7DQotICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8NCi0gICAgX19IQUxfVU5MT0NLKGhkbWEpOw0KLQ0KLSAgICAvKiBSZW1haW4gQlVTWSAqLw0KLSAgICBzdGF0dXMgPSBIQUxfQlVTWTsNCi0gIH0NCi0gIHJldHVybiBzdGF0dXM7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQWJvcnQgdGhlIERNQSBUcmFuc2Zlci4NCi0gKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQotICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgQ2hhbm5lbC4NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BX0Fib3J0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKSB7DQotICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7DQotDQotICBpZiAoaGRtYS0+U3RhdGUgIT0gSEFMX0RNQV9TVEFURV9CVVNZKSB7DQotICAgIC8qIG5vIHRyYW5zZmVyIG9uZ29pbmcgKi8NCi0gICAgaGRtYS0+RXJyb3JDb2RlID0gSEFMX0RNQV9FUlJPUl9OT19YRkVSOw0KLQ0KLSAgICBzdGF0dXMgPSBIQUxfRVJST1I7DQotICB9IGVsc2Ugew0KLSAgICAvKiBEaXNhYmxlIERNQSBJVCAqLw0KLSAgICBfX0hBTF9ETUFfRElTQUJMRV9JVChoZG1hLCAoRE1BX0lUX1RDIHwgRE1BX0lUX0hUIHwgRE1BX0lUX1RFKSk7DQotDQotICAgIC8qIGRpc2FibGUgdGhlIERNQU1VWCBzeW5jIG92ZXJydW4gSVQqLw0KLSAgICBoZG1hLT5ETUFtdXhDaGFubmVsLT5DQ1IgJj0gfkRNQU1VWF9DeENSX1NPSUU7DQotDQotICAgIC8qIERpc2FibGUgdGhlIGNoYW5uZWwgKi8NCi0gICAgX19IQUxfRE1BX0RJU0FCTEUoaGRtYSk7DQotDQotICAgIC8qIENsZWFyIGFsbCBmbGFncyAqLw0KLSAgICBoZG1hLT5EbWFCYXNlQWRkcmVzcy0+SUZDUiA9IChETUFfSVNSX0dJRjEgPDwgKGhkbWEtPkNoYW5uZWxJbmRleCAmIDB4MUZVKSk7DQotDQotICAgIC8qIENsZWFyIHRoZSBETUFNVVggc3luY2hybyBvdmVycnVuIGZsYWcgKi8NCi0gICAgaGRtYS0+RE1BbXV4Q2hhbm5lbFN0YXR1cy0+Q0ZSID0gaGRtYS0+RE1BbXV4Q2hhbm5lbFN0YXR1c01hc2s7DQotDQotICAgIGlmIChoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuICE9IDBVKSB7DQotICAgICAgLyogaWYgdXNpbmcgRE1BTVVYIHJlcXVlc3QgZ2VuZXJhdG9yLCBkaXNhYmxlIHRoZSBETUFNVVggcmVxdWVzdCBnZW5lcmF0b3INCi0gICAgICAgKiBvdmVycnVuIElUKi8NCi0gICAgICAvKiBkaXNhYmxlIHRoZSByZXF1ZXN0IGdlbiBvdmVycnVuIElUKi8NCi0gICAgICBoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuLT5SR0NSICY9IH5ETUFNVVhfUkd4Q1JfT0lFOw0KLQ0KLSAgICAgIC8qIENsZWFyIHRoZSBETUFNVVggcmVxdWVzdCBnZW5lcmF0b3Igb3ZlcnJ1biBmbGFnICovDQotICAgICAgaGRtYS0+RE1BbXV4UmVxdWVzdEdlblN0YXR1cy0+UkdDRlIgPSBoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuU3RhdHVzTWFzazsNCi0gICAgfQ0KLSAgfQ0KLSAgLyogQ2hhbmdlIHRoZSBETUEgc3RhdGUgKi8NCi0gIGhkbWEtPlN0YXRlID0gSEFMX0RNQV9TVEFURV9SRUFEWTsNCi0NCi0gIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8NCi0gIF9fSEFMX1VOTE9DSyhoZG1hKTsNCi0NCi0gIHJldHVybiBzdGF0dXM7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQWJvcnRzIHRoZSBETUEgVHJhbnNmZXIgaW4gSW50ZXJydXB0IG1vZGUuDQotICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KLSAqICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgQ2hhbm5lbC4NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BX0Fib3J0X0lUKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKSB7DQotICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7DQotDQotICBpZiAoSEFMX0RNQV9TVEFURV9CVVNZICE9IGhkbWEtPlN0YXRlKSB7DQotICAgIC8qIG5vIHRyYW5zZmVyIG9uZ29pbmcgKi8NCi0gICAgaGRtYS0+RXJyb3JDb2RlID0gSEFMX0RNQV9FUlJPUl9OT19YRkVSOw0KLQ0KLSAgICAvKiBDaGFuZ2UgdGhlIERNQSBzdGF0ZSAqLw0KLSAgICBoZG1hLT5TdGF0ZSA9IEhBTF9ETUFfU1RBVEVfUkVBRFk7DQotDQotICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8NCi0gICAgX19IQUxfVU5MT0NLKGhkbWEpOw0KLQ0KLSAgICBzdGF0dXMgPSBIQUxfRVJST1I7DQotICB9IGVsc2Ugew0KLSAgICAvKiBEaXNhYmxlIERNQSBJVCAqLw0KLSAgICBfX0hBTF9ETUFfRElTQUJMRV9JVChoZG1hLCAoRE1BX0lUX1RDIHwgRE1BX0lUX0hUIHwgRE1BX0lUX1RFKSk7DQotDQotICAgIC8qIERpc2FibGUgdGhlIGNoYW5uZWwgKi8NCi0gICAgX19IQUxfRE1BX0RJU0FCTEUoaGRtYSk7DQotDQotICAgIC8qIGRpc2FibGUgdGhlIERNQU1VWCBzeW5jIG92ZXJydW4gSVQqLw0KLSAgICBoZG1hLT5ETUFtdXhDaGFubmVsLT5DQ1IgJj0gfkRNQU1VWF9DeENSX1NPSUU7DQotDQotICAgIC8qIENsZWFyIGFsbCBmbGFncyAqLw0KLSAgICBoZG1hLT5EbWFCYXNlQWRkcmVzcy0+SUZDUiA9IChETUFfSVNSX0dJRjEgPDwgKGhkbWEtPkNoYW5uZWxJbmRleCAmIDB4MUZVKSk7DQotDQotICAgIC8qIENsZWFyIHRoZSBETUFNVVggc3luY2hybyBvdmVycnVuIGZsYWcgKi8NCi0gICAgaGRtYS0+RE1BbXV4Q2hhbm5lbFN0YXR1cy0+Q0ZSID0gaGRtYS0+RE1BbXV4Q2hhbm5lbFN0YXR1c01hc2s7DQotDQotICAgIGlmIChoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuICE9IDBVKSB7DQotICAgICAgLyogaWYgdXNpbmcgRE1BTVVYIHJlcXVlc3QgZ2VuZXJhdG9yLCBkaXNhYmxlIHRoZSBETUFNVVggcmVxdWVzdCBnZW5lcmF0b3INCi0gICAgICAgKiBvdmVycnVuIElUKi8NCi0gICAgICAvKiBkaXNhYmxlIHRoZSByZXF1ZXN0IGdlbiBvdmVycnVuIElUKi8NCi0gICAgICBoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuLT5SR0NSICY9IH5ETUFNVVhfUkd4Q1JfT0lFOw0KLQ0KLSAgICAgIC8qIENsZWFyIHRoZSBETUFNVVggcmVxdWVzdCBnZW5lcmF0b3Igb3ZlcnJ1biBmbGFnICovDQotICAgICAgaGRtYS0+RE1BbXV4UmVxdWVzdEdlblN0YXR1cy0+UkdDRlIgPSBoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuU3RhdHVzTWFzazsNCi0gICAgfQ0KLQ0KLSAgICAvKiBDaGFuZ2UgdGhlIERNQSBzdGF0ZSAqLw0KLSAgICBoZG1hLT5TdGF0ZSA9IEhBTF9ETUFfU1RBVEVfUkVBRFk7DQotDQotICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8NCi0gICAgX19IQUxfVU5MT0NLKGhkbWEpOw0KLQ0KLSAgICAvKiBDYWxsIFVzZXIgQWJvcnQgY2FsbGJhY2sgKi8NCi0gICAgaWYgKGhkbWEtPlhmZXJBYm9ydENhbGxiYWNrICE9IE5VTEwpIHsNCi0gICAgICBoZG1hLT5YZmVyQWJvcnRDYWxsYmFjayhoZG1hKTsNCi0gICAgfQ0KLSAgfQ0KLSAgcmV0dXJuIHN0YXR1czsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBQb2xsaW5nIGZvciB0cmFuc2ZlciBjb21wbGV0ZS4NCi0gKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQotICogICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBDaGFubmVsLg0KLSAqIEBwYXJhbSAgQ29tcGxldGVMZXZlbCBTcGVjaWZpZXMgdGhlIERNQSBsZXZlbCBjb21wbGV0ZS4NCi0gKiBAcGFyYW0gIFRpbWVvdXQgICAgICAgVGltZW91dCBkdXJhdGlvbi4NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BX1BvbGxGb3JUcmFuc2ZlcigNCi0gICAgRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEsIEhBTF9ETUFfTGV2ZWxDb21wbGV0ZVR5cGVEZWYgQ29tcGxldGVMZXZlbCwNCi0gICAgdWludDMyX3QgVGltZW91dCkgew0KLSAgdWludDMyX3QgdGVtcDsNCi0gIHVpbnQzMl90IHRpY2tzdGFydDsNCi0NCi0gIGlmIChIQUxfRE1BX1NUQVRFX0JVU1kgIT0gaGRtYS0+U3RhdGUpIHsNCi0gICAgLyogbm8gdHJhbnNmZXIgb25nb2luZyAqLw0KLSAgICBoZG1hLT5FcnJvckNvZGUgPSBIQUxfRE1BX0VSUk9SX05PX1hGRVI7DQotICAgIF9fSEFMX1VOTE9DSyhoZG1hKTsNCi0gICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gIH0NCi0NCi0gIC8qIFBvbGxpbmcgbW9kZSBub3Qgc3VwcG9ydGVkIGluIGNpcmN1bGFyIG1vZGUgKi8NCi0gIGlmICgwVSAhPSAoaGRtYS0+SW5zdGFuY2UtPkNDUiAmIERNQV9DQ1JfQ0lSQykpIHsNCi0gICAgaGRtYS0+RXJyb3JDb2RlID0gSEFMX0RNQV9FUlJPUl9OT1RfU1VQUE9SVEVEOw0KLSAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgfQ0KLQ0KLSAgLyogR2V0IHRoZSBsZXZlbCB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnICovDQotICBpZiAoSEFMX0RNQV9GVUxMX1RSQU5TRkVSID09IENvbXBsZXRlTGV2ZWwpIHsNCi0gICAgLyogVHJhbnNmZXIgQ29tcGxldGUgZmxhZyAqLw0KLQ0KLSAgICB0ZW1wID0gKHVpbnQzMl90KURNQV9GTEFHX1RDMSA8PCAoaGRtYS0+Q2hhbm5lbEluZGV4ICYgMHgxRlUpOw0KLSAgfSBlbHNlIHsNCi0gICAgLyogSGFsZiBUcmFuc2ZlciBDb21wbGV0ZSBmbGFnICovDQotICAgIHRlbXAgPSAodWludDMyX3QpRE1BX0ZMQUdfSFQxIDw8IChoZG1hLT5DaGFubmVsSW5kZXggJiAweDFGVSk7DQotICB9DQotDQotICAvKiBHZXQgdGljayAqLw0KLSAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsNCi0NCi0gIHdoaWxlICgwVSA9PSAoaGRtYS0+RG1hQmFzZUFkZHJlc3MtPklTUiAmIHRlbXApKSB7DQotICAgIGlmICgoMFUgIT0gKGhkbWEtPkRtYUJhc2VBZGRyZXNzLT5JU1IgJg0KLSAgICAgICAgICAgICAgICAoKHVpbnQzMl90KURNQV9GTEFHX1RFMSA8PCAoaGRtYS0+Q2hhbm5lbEluZGV4ICYgMHgxRlUpKSkpKSB7DQotICAgICAgLyogV2hlbiBhIERNQSB0cmFuc2ZlciBlcnJvciBvY2N1cnMgKi8NCi0gICAgICAvKiBBIGhhcmR3YXJlIGNsZWFyIG9mIGl0cyBFTiBiaXRzIGlzIHBlcmZvcm1lZCAqLw0KLSAgICAgIC8qIENsZWFyIGFsbCBmbGFncyAqLw0KLSAgICAgIGhkbWEtPkRtYUJhc2VBZGRyZXNzLT5JRkNSID0NCi0gICAgICAgICAgKCh1aW50MzJfdClETUFfSVNSX0dJRjEgPDwgKGhkbWEtPkNoYW5uZWxJbmRleCAmIDB4MUZVKSk7DQotDQotICAgICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8NCi0gICAgICBoZG1hLT5FcnJvckNvZGUgPSBIQUxfRE1BX0VSUk9SX1RFOw0KLQ0KLSAgICAgIC8qIENoYW5nZSB0aGUgRE1BIHN0YXRlICovDQotICAgICAgaGRtYS0+U3RhdGUgPSBIQUxfRE1BX1NUQVRFX1JFQURZOw0KLQ0KLSAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8NCi0gICAgICBfX0hBTF9VTkxPQ0soaGRtYSk7DQotDQotICAgICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gICAgfQ0KLSAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8NCi0gICAgaWYgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkgew0KLSAgICAgIGlmICgoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gVGltZW91dCkgfHwgKFRpbWVvdXQgPT0gMFUpKSB7DQotICAgICAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLw0KLSAgICAgICAgaGRtYS0+RXJyb3JDb2RlID0gSEFMX0RNQV9FUlJPUl9USU1FT1VUOw0KLQ0KLSAgICAgICAgLyogQ2hhbmdlIHRoZSBETUEgc3RhdGUgKi8NCi0gICAgICAgIGhkbWEtPlN0YXRlID0gSEFMX0RNQV9TVEFURV9SRUFEWTsNCi0NCi0gICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8NCi0gICAgICAgIF9fSEFMX1VOTE9DSyhoZG1hKTsNCi0NCi0gICAgICAgIHJldHVybiBIQUxfRVJST1I7DQotICAgICAgfQ0KLSAgICB9DQotICB9DQotDQotICAvKkNoZWNrIGZvciBETUFNVVggUmVxdWVzdCBnZW5lcmF0b3IgKGlmIHVzZWQpIG92ZXJydW4gc3RhdHVzICovDQotICBpZiAoaGRtYS0+RE1BbXV4UmVxdWVzdEdlbiAhPSAwVSkgew0KLSAgICAvKiBpZiB1c2luZyBETUFNVVggcmVxdWVzdCBnZW5lcmF0b3IgQ2hlY2sgZm9yIERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvcg0KLSAgICAgKiBvdmVycnVuICovDQotICAgIGlmICgoaGRtYS0+RE1BbXV4UmVxdWVzdEdlblN0YXR1cy0+UkdTUiAmDQotICAgICAgICAgaGRtYS0+RE1BbXV4UmVxdWVzdEdlblN0YXR1c01hc2spICE9IDBVKSB7DQotICAgICAgLyogRGlzYWJsZSB0aGUgcmVxdWVzdCBnZW4gb3ZlcnJ1biBpbnRlcnJ1cHQgKi8NCi0gICAgICBoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuLT5SR0NSIHw9IERNQU1VWF9SR3hDUl9PSUU7DQotDQotICAgICAgLyogQ2xlYXIgdGhlIERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvciBvdmVycnVuIGZsYWcgKi8NCi0gICAgICBoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuU3RhdHVzLT5SR0NGUiA9IGhkbWEtPkRNQW11eFJlcXVlc3RHZW5TdGF0dXNNYXNrOw0KLQ0KLSAgICAgIC8qIFVwZGF0ZSBlcnJvciBjb2RlICovDQotICAgICAgaGRtYS0+RXJyb3JDb2RlIHw9IEhBTF9ETUFfRVJST1JfUkVRR0VOOw0KLSAgICB9DQotICB9DQotDQotICAvKiBDaGVjayBmb3IgRE1BTVVYIFN5bmNocm9uaXphdGlvbiBvdmVycnVuICovDQotICBpZiAoKGhkbWEtPkRNQW11eENoYW5uZWxTdGF0dXMtPkNTUiAmIGhkbWEtPkRNQW11eENoYW5uZWxTdGF0dXNNYXNrKSAhPSAwVSkgew0KLSAgICAvKiBDbGVhciB0aGUgRE1BTVVYIHN5bmNocm8gb3ZlcnJ1biBmbGFnICovDQotICAgIGhkbWEtPkRNQW11eENoYW5uZWxTdGF0dXMtPkNGUiA9IGhkbWEtPkRNQW11eENoYW5uZWxTdGF0dXNNYXNrOw0KLQ0KLSAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLw0KLSAgICBoZG1hLT5FcnJvckNvZGUgfD0gSEFMX0RNQV9FUlJPUl9TWU5DOw0KLSAgfQ0KLQ0KLSAgaWYgKEhBTF9ETUFfRlVMTF9UUkFOU0ZFUiA9PSBDb21wbGV0ZUxldmVsKSB7DQotICAgIC8qIENsZWFyIHRoZSB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnICovDQotICAgIGhkbWEtPkRtYUJhc2VBZGRyZXNzLT5JRkNSID0NCi0gICAgICAgICgodWludDMyX3QpRE1BX0ZMQUdfVEMxIDw8IChoZG1hLT5DaGFubmVsSW5kZXggJiAweDFGVSkpOw0KLQ0KLSAgICAvKiBUaGUgc2VsZWN0ZWQgQ2hhbm5lbHggRU4gYml0IGlzIGNsZWFyZWQgKERNQSBpcyBkaXNhYmxlZCBhbmQNCi0gICAgYWxsIHRyYW5zZmVycyBhcmUgY29tcGxldGUpICovDQotICAgIGhkbWEtPlN0YXRlID0gSEFMX0RNQV9TVEFURV9SRUFEWTsNCi0gIH0gZWxzZSB7DQotICAgIC8qIENsZWFyIHRoZSBoYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcgKi8NCi0gICAgaGRtYS0+RG1hQmFzZUFkZHJlc3MtPklGQ1IgPQ0KLSAgICAgICAgKCh1aW50MzJfdClETUFfRkxBR19IVDEgPDwgKGhkbWEtPkNoYW5uZWxJbmRleCAmIDB4MUZVKSk7DQotICB9DQotDQotICAvKiBQcm9jZXNzIHVubG9ja2VkICovDQotICBfX0hBTF9VTkxPQ0soaGRtYSk7DQotDQotICByZXR1cm4gSEFMX09LOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEhhbmRsZSBETUEgaW50ZXJydXB0IHJlcXVlc3QuDQotICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KLSAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIENoYW5uZWwuDQotICogQHJldHZhbCBOb25lDQotICovDQotdm9pZCBIQUxfRE1BX0lSUUhhbmRsZXIoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpIHsNCi0gIHVpbnQzMl90IGZsYWdfaXQgPSBoZG1hLT5EbWFCYXNlQWRkcmVzcy0+SVNSOw0KLSAgdWludDMyX3Qgc291cmNlX2l0ID0gaGRtYS0+SW5zdGFuY2UtPkNDUjsNCi0NCi0gIC8qIEhhbGYgVHJhbnNmZXIgQ29tcGxldGUgSW50ZXJydXB0IG1hbmFnZW1lbnQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLSAgaWYgKCgwVSAhPQ0KLSAgICAgICAoZmxhZ19pdCAmICgodWludDMyX3QpRE1BX0ZMQUdfSFQxIDw8IChoZG1hLT5DaGFubmVsSW5kZXggJiAweDFGVSkpKSkgJiYNCi0gICAgICAoMFUgIT0gKHNvdXJjZV9pdCAmIERNQV9JVF9IVCkpKSB7DQotICAgIC8qIERpc2FibGUgdGhlIGhhbGYgdHJhbnNmZXIgaW50ZXJydXB0IGlmIHRoZSBETUEgbW9kZSBpcyBub3QgQ0lSQ1VMQVIgKi8NCi0gICAgaWYgKChoZG1hLT5JbnN0YW5jZS0+Q0NSICYgRE1BX0NDUl9DSVJDKSA9PSAwVSkgew0KLSAgICAgIC8qIERpc2FibGUgdGhlIGhhbGYgdHJhbnNmZXIgaW50ZXJydXB0ICovDQotICAgICAgX19IQUxfRE1BX0RJU0FCTEVfSVQoaGRtYSwgRE1BX0lUX0hUKTsNCi0gICAgfQ0KLSAgICAvKiBDbGVhciB0aGUgaGFsZiB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnICovDQotICAgIGhkbWEtPkRtYUJhc2VBZGRyZXNzLT5JRkNSID0NCi0gICAgICAgICgodWludDMyX3QpRE1BX0lTUl9IVElGMSA8PCAoaGRtYS0+Q2hhbm5lbEluZGV4ICYgMHgxRlUpKTsNCi0NCi0gICAgLyogRE1BIHBlcmlwaGVyYWwgc3RhdGUgaXMgbm90IHVwZGF0ZWQgaW4gSGFsZiBUcmFuc2ZlciAqLw0KLSAgICAvKiBidXQgaW4gVHJhbnNmZXIgQ29tcGxldGUgY2FzZSAqLw0KLQ0KLSAgICBpZiAoaGRtYS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgIT0gTlVMTCkgew0KLSAgICAgIC8qIEhhbGYgdHJhbnNmZXIgY2FsbGJhY2sgKi8NCi0gICAgICBoZG1hLT5YZmVySGFsZkNwbHRDYWxsYmFjayhoZG1hKTsNCi0gICAgfQ0KLSAgfQ0KLSAgLyogVHJhbnNmZXIgQ29tcGxldGUgSW50ZXJydXB0IG1hbmFnZW1lbnQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotICBlbHNlIGlmICgoMFUgIT0gKGZsYWdfaXQgJg0KLSAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KURNQV9GTEFHX1RDMSA8PCAoaGRtYS0+Q2hhbm5lbEluZGV4ICYgMHgxRlUpKSkpICYmDQotICAgICAgICAgICAoMFUgIT0gKHNvdXJjZV9pdCAmIERNQV9JVF9UQykpKSB7DQotICAgIGlmICgoaGRtYS0+SW5zdGFuY2UtPkNDUiAmIERNQV9DQ1JfQ0lSQykgPT0gMFUpIHsNCi0gICAgICAvKiBEaXNhYmxlIHRoZSB0cmFuc2ZlciBjb21wbGV0ZSBhbmQgZXJyb3IgaW50ZXJydXB0ICovDQotICAgICAgX19IQUxfRE1BX0RJU0FCTEVfSVQoaGRtYSwgRE1BX0lUX1RFIHwgRE1BX0lUX1RDKTsNCi0NCi0gICAgICAvKiBDaGFuZ2UgdGhlIERNQSBzdGF0ZSAqLw0KLSAgICAgIGhkbWEtPlN0YXRlID0gSEFMX0RNQV9TVEFURV9SRUFEWTsNCi0gICAgfQ0KLSAgICAvKiBDbGVhciB0aGUgdHJhbnNmZXIgY29tcGxldGUgZmxhZyAqLw0KLSAgICBoZG1hLT5EbWFCYXNlQWRkcmVzcy0+SUZDUiA9DQotICAgICAgICAoKHVpbnQzMl90KURNQV9JU1JfVENJRjEgPDwgKGhkbWEtPkNoYW5uZWxJbmRleCAmIDB4MUZVKSk7DQotDQotICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8NCi0gICAgX19IQUxfVU5MT0NLKGhkbWEpOw0KLQ0KLSAgICBpZiAoaGRtYS0+WGZlckNwbHRDYWxsYmFjayAhPSBOVUxMKSB7DQotICAgICAgLyogVHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8NCi0gICAgICBoZG1hLT5YZmVyQ3BsdENhbGxiYWNrKGhkbWEpOw0KLSAgICB9DQotICB9DQotICAvKiBUcmFuc2ZlciBFcnJvciBJbnRlcnJ1cHQgbWFuYWdlbWVudCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0gIGVsc2UgaWYgKCgwVSAhPSAoZmxhZ19pdCAmDQotICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpRE1BX0ZMQUdfVEUxIDw8IChoZG1hLT5DaGFubmVsSW5kZXggJiAweDFGVSkpKSkgJiYNCi0gICAgICAgICAgICgwVSAhPSAoc291cmNlX2l0ICYgRE1BX0lUX1RFKSkpIHsNCi0gICAgLyogV2hlbiBhIERNQSB0cmFuc2ZlciBlcnJvciBvY2N1cnMgKi8NCi0gICAgLyogQSBoYXJkd2FyZSBjbGVhciBvZiBpdHMgRU4gYml0cyBpcyBwZXJmb3JtZWQgKi8NCi0gICAgLyogRGlzYWJsZSBBTEwgRE1BIElUICovDQotICAgIF9fSEFMX0RNQV9ESVNBQkxFX0lUKGhkbWEsIChETUFfSVRfVEMgfCBETUFfSVRfSFQgfCBETUFfSVRfVEUpKTsNCi0NCi0gICAgLyogQ2xlYXIgYWxsIGZsYWdzICovDQotICAgIGhkbWEtPkRtYUJhc2VBZGRyZXNzLT5JRkNSID0NCi0gICAgICAgICgodWludDMyX3QpRE1BX0lTUl9HSUYxIDw8IChoZG1hLT5DaGFubmVsSW5kZXggJiAweDFGVSkpOw0KLQ0KLSAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLw0KLSAgICBoZG1hLT5FcnJvckNvZGUgPSBIQUxfRE1BX0VSUk9SX1RFOw0KLQ0KLSAgICAvKiBDaGFuZ2UgdGhlIERNQSBzdGF0ZSAqLw0KLSAgICBoZG1hLT5TdGF0ZSA9IEhBTF9ETUFfU1RBVEVfUkVBRFk7DQotDQotICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8NCi0gICAgX19IQUxfVU5MT0NLKGhkbWEpOw0KLQ0KLSAgICBpZiAoaGRtYS0+WGZlckVycm9yQ2FsbGJhY2sgIT0gTlVMTCkgew0KLSAgICAgIC8qIFRyYW5zZmVyIGVycm9yIGNhbGxiYWNrICovDQotICAgICAgaGRtYS0+WGZlckVycm9yQ2FsbGJhY2soaGRtYSk7DQotICAgIH0NCi0gIH0gZWxzZSB7DQotICAgIC8qIE5vdGhpbmcgVG8gRG8gKi8NCi0gIH0NCi0gIHJldHVybjsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBSZWdpc3RlciBjYWxsYmFja3MNCi0gKiBAcGFyYW0gIGhkbWEgICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdA0KLSAqIGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBDaGFubmVsLg0KLSAqIEBwYXJhbSAgQ2FsbGJhY2tJRCAgICAgICAgICAgVXNlciBDYWxsYmFjayBpZGVudGlmaWVyDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBIQUxfRE1BX0NhbGxiYWNrSURUeXBlRGVmIEVOVU0gYXMgcGFyYW1ldGVyLg0KLSAqIEBwYXJhbSAgcENhbGxiYWNrICAgICAgICAgICAgcG9pbnRlciB0byBwcml2YXRlIGNhbGxiYWNzayBmdW5jdGlvbiB3aGljaCBoYXMNCi0gKiBwb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIGFzIHBhcmFtZXRlci4NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BX1JlZ2lzdGVyQ2FsbGJhY2soDQotICAgIERNQV9IYW5kbGVUeXBlRGVmICpoZG1hLCBIQUxfRE1BX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsDQotICAgIHZvaWQgKCpwQ2FsbGJhY2spKERNQV9IYW5kbGVUeXBlRGVmICpfaGRtYSkpIHsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsNCi0NCi0gIC8qIFByb2Nlc3MgbG9ja2VkICovDQotICBfX0hBTF9MT0NLKGhkbWEpOw0KLQ0KLSAgaWYgKEhBTF9ETUFfU1RBVEVfUkVBRFkgPT0gaGRtYS0+U3RhdGUpIHsNCi0gICAgc3dpdGNoIChDYWxsYmFja0lEKSB7DQotICAgICAgY2FzZSBIQUxfRE1BX1hGRVJfQ1BMVF9DQl9JRDoNCi0gICAgICAgIGhkbWEtPlhmZXJDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9ETUFfWEZFUl9IQUxGQ1BMVF9DQl9JRDoNCi0gICAgICAgIGhkbWEtPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gcENhbGxiYWNrOw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfRE1BX1hGRVJfRVJST1JfQ0JfSUQ6DQotICAgICAgICBoZG1hLT5YZmVyRXJyb3JDYWxsYmFjayA9IHBDYWxsYmFjazsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgSEFMX0RNQV9YRkVSX0FCT1JUX0NCX0lEOg0KLSAgICAgICAgaGRtYS0+WGZlckFib3J0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBkZWZhdWx0Og0KLSAgICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOw0KLSAgICAgICAgYnJlYWs7DQotICAgIH0NCi0gIH0gZWxzZSB7DQotICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsNCi0gIH0NCi0NCi0gIC8qIFJlbGVhc2UgTG9jayAqLw0KLSAgX19IQUxfVU5MT0NLKGhkbWEpOw0KLQ0KLSAgcmV0dXJuIHN0YXR1czsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBVblJlZ2lzdGVyIGNhbGxiYWNrcw0KLSAqIEBwYXJhbSAgaGRtYSAgICAgICAgICAgICAgICAgcG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0DQotICogY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIENoYW5uZWwuDQotICogQHBhcmFtICBDYWxsYmFja0lEICAgICAgICAgICBVc2VyIENhbGxiYWNrIGlkZW50aWZpZXINCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIEhBTF9ETUFfQ2FsbGJhY2tJRFR5cGVEZWYgRU5VTSBhcyBwYXJhbWV0ZXIuDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RNQV9VblJlZ2lzdGVyQ2FsbGJhY2soDQotICAgIERNQV9IYW5kbGVUeXBlRGVmICpoZG1hLCBIQUxfRE1BX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpIHsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsNCi0NCi0gIC8qIFByb2Nlc3MgbG9ja2VkICovDQotICBfX0hBTF9MT0NLKGhkbWEpOw0KLQ0KLSAgaWYgKEhBTF9ETUFfU1RBVEVfUkVBRFkgPT0gaGRtYS0+U3RhdGUpIHsNCi0gICAgc3dpdGNoIChDYWxsYmFja0lEKSB7DQotICAgICAgY2FzZSBIQUxfRE1BX1hGRVJfQ1BMVF9DQl9JRDoNCi0gICAgICAgIGhkbWEtPlhmZXJDcGx0Q2FsbGJhY2sgPSBOVUxMOw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfRE1BX1hGRVJfSEFMRkNQTFRfQ0JfSUQ6DQotICAgICAgICBoZG1hLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IE5VTEw7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9ETUFfWEZFUl9FUlJPUl9DQl9JRDoNCi0gICAgICAgIGhkbWEtPlhmZXJFcnJvckNhbGxiYWNrID0gTlVMTDsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgSEFMX0RNQV9YRkVSX0FCT1JUX0NCX0lEOg0KLSAgICAgICAgaGRtYS0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfRE1BX1hGRVJfQUxMX0NCX0lEOg0KLSAgICAgICAgaGRtYS0+WGZlckNwbHRDYWxsYmFjayA9IE5VTEw7DQotICAgICAgICBoZG1hLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IE5VTEw7DQotICAgICAgICBoZG1hLT5YZmVyRXJyb3JDYWxsYmFjayA9IE5VTEw7DQotICAgICAgICBoZG1hLT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBkZWZhdWx0Og0KLSAgICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOw0KLSAgICAgICAgYnJlYWs7DQotICAgIH0NCi0gIH0gZWxzZSB7DQotICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsNCi0gIH0NCi0NCi0gIC8qIFJlbGVhc2UgTG9jayAqLw0KLSAgX19IQUxfVU5MT0NLKGhkbWEpOw0KLQ0KLSAgcmV0dXJuIHN0YXR1czsNCi19DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIERNQV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9ycw0KLWZ1bmN0aW9ucw0KLSAgKiAgQGJyaWVmICAgIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9ycyBmdW5jdGlvbnMNCi0gICoNCi1AdmVyYmF0aW0NCi0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9ycyBmdW5jdGlvbnMgIyMjIyMNCi0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICBbLi5dDQotICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG8NCi0gICAgICAoKykgQ2hlY2sgdGhlIERNQSBzdGF0ZQ0KLSAgICAgICgrKSBHZXQgZXJyb3IgY29kZQ0KLQ0KLUBlbmR2ZXJiYXRpbQ0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJldHVybiB0aGUgRE1BIGhhbmRlIHN0YXRlLg0KLSAqIEBwYXJhbSAgaGRtYSBwb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCi0gKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBDaGFubmVsLg0KLSAqIEByZXR2YWwgSEFMIHN0YXRlDQotICovDQotSEFMX0RNQV9TdGF0ZVR5cGVEZWYgSEFMX0RNQV9HZXRTdGF0ZShETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkgew0KLSAgLyogUmV0dXJuIERNQSBoYW5kbGUgc3RhdGUgKi8NCi0gIHJldHVybiBoZG1hLT5TdGF0ZTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBSZXR1cm4gdGhlIERNQSBlcnJvciBjb2RlLg0KLSAqIEBwYXJhbSAgaGRtYSA6IHBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KLSAqICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgQ2hhbm5lbC4NCi0gKiBAcmV0dmFsIERNQSBFcnJvciBDb2RlDQotICovDQotdWludDMyX3QgSEFMX0RNQV9HZXRFcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkgeyByZXR1cm4gaGRtYS0+RXJyb3JDb2RlOyB9DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAYWRkdG9ncm91cCBETUFfUHJpdmF0ZV9GdW5jdGlvbnMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0cyB0aGUgRE1BIFRyYW5zZmVyIHBhcmFtZXRlci4NCi0gKiBAcGFyYW0gIGhkbWEgICAgICAgcG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQotICogICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUENCi0gKiBDaGFubmVsLg0KLSAqIEBwYXJhbSAgU3JjQWRkcmVzcyBUaGUgc291cmNlIG1lbW9yeSBCdWZmZXIgYWRkcmVzcw0KLSAqIEBwYXJhbSAgRHN0QWRkcmVzcyBUaGUgZGVzdGluYXRpb24gbWVtb3J5IEJ1ZmZlciBhZGRyZXNzDQotICogQHBhcmFtICBEYXRhTGVuZ3RoIFRoZSBsZW5ndGggb2YgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZCBmcm9tIHNvdXJjZSB0bw0KLSAqIGRlc3RpbmF0aW9uDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotc3RhdGljIHZvaWQgRE1BX1NldENvbmZpZyhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSwgdWludDMyX3QgU3JjQWRkcmVzcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IERzdEFkZHJlc3MsIHVpbnQzMl90IERhdGFMZW5ndGgpIHsNCi0gIC8qIENsZWFyIHRoZSBETUFNVVggc3luY2hybyBvdmVycnVuIGZsYWcgKi8NCi0gIGhkbWEtPkRNQW11eENoYW5uZWxTdGF0dXMtPkNGUiA9IGhkbWEtPkRNQW11eENoYW5uZWxTdGF0dXNNYXNrOw0KLQ0KLSAgaWYgKGhkbWEtPkRNQW11eFJlcXVlc3RHZW4gIT0gMFUpIHsNCi0gICAgLyogQ2xlYXIgdGhlIERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvciBvdmVycnVuIGZsYWcgKi8NCi0gICAgaGRtYS0+RE1BbXV4UmVxdWVzdEdlblN0YXR1cy0+UkdDRlIgPSBoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuU3RhdHVzTWFzazsNCi0gIH0NCi0NCi0gIC8qIENsZWFyIGFsbCBmbGFncyAqLw0KLSAgaGRtYS0+RG1hQmFzZUFkZHJlc3MtPklGQ1IgPSAoRE1BX0lTUl9HSUYxIDw8IChoZG1hLT5DaGFubmVsSW5kZXggJiAweDFGVSkpOw0KLQ0KLSAgLyogQ29uZmlndXJlIERNQSBDaGFubmVsIGRhdGEgbGVuZ3RoICovDQotICBoZG1hLT5JbnN0YW5jZS0+Q05EVFIgPSBEYXRhTGVuZ3RoOw0KLQ0KLSAgLyogTWVtb3J5IHRvIFBlcmlwaGVyYWwgKi8NCi0gIGlmICgoaGRtYS0+SW5pdC5EaXJlY3Rpb24pID09IERNQV9NRU1PUllfVE9fUEVSSVBIKSB7DQotICAgIC8qIENvbmZpZ3VyZSBETUEgQ2hhbm5lbCBkZXN0aW5hdGlvbiBhZGRyZXNzICovDQotICAgIGhkbWEtPkluc3RhbmNlLT5DUEFSID0gRHN0QWRkcmVzczsNCi0NCi0gICAgLyogQ29uZmlndXJlIERNQSBDaGFubmVsIHNvdXJjZSBhZGRyZXNzICovDQotICAgIGhkbWEtPkluc3RhbmNlLT5DTUFSID0gU3JjQWRkcmVzczsNCi0gIH0NCi0gIC8qIFBlcmlwaGVyYWwgdG8gTWVtb3J5ICovDQotICBlbHNlIHsNCi0gICAgLyogQ29uZmlndXJlIERNQSBDaGFubmVsIHNvdXJjZSBhZGRyZXNzICovDQotICAgIGhkbWEtPkluc3RhbmNlLT5DUEFSID0gU3JjQWRkcmVzczsNCi0NCi0gICAgLyogQ29uZmlndXJlIERNQSBDaGFubmVsIGRlc3RpbmF0aW9uIGFkZHJlc3MgKi8NCi0gICAgaGRtYS0+SW5zdGFuY2UtPkNNQVIgPSBEc3RBZGRyZXNzOw0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFVwZGF0ZXMgdGhlIERNQSBoYW5kbGUgd2l0aCB0aGUgRE1BTVVYICBjaGFubmVsIGFuZCBzdGF0dXMgbWFzaw0KLSAqIGRlcGVuZGluZyBvbiBzdHJlYW0gbnVtYmVyDQotICogQHBhcmFtICBoZG1hICAgICAgICBwb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCi0gKiAgICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQQ0KLSAqIFN0cmVhbS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1zdGF0aWMgdm9pZCBETUFfQ2FsY0RNQU1VWENoYW5uZWxCYXNlQW5kTWFzayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkgew0KLSAgdWludDMyX3QgZG1hbXV4X2Jhc2VfYWRkcjsNCi0gIHVpbnQzMl90IGNoYW5uZWxfbnVtYmVyOw0KLSAgRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYMV9DaGFubmVsQmFzZTsNCi0NCi0gIC8qIGNoZWNrIGlmIGluc3RhbmNlIGlzIG5vdCBvdXRzaWRlIHRoZSBETUEgY2hhbm5lbCByYW5nZSAqLw0KLSAgaWYgKCh1aW50MzJfdCloZG1hLT5JbnN0YW5jZSA8ICh1aW50MzJfdClETUEyX0NoYW5uZWwxKSB7DQotICAgIC8qIERNQTEgKi8NCi0gICAgRE1BTVVYMV9DaGFubmVsQmFzZSA9IERNQU1VWDFfQ2hhbm5lbDA7DQotICB9IGVsc2Ugew0KLSAgICAvKiBETUEyICovDQotI2lmIGRlZmluZWQoU1RNMzJHNDcxeHgpIHx8IGRlZmluZWQoU1RNMzJHNDczeHgpIHx8IGRlZmluZWQoU1RNMzJHNDc0eHgpIHx8IFwNCi0gICAgZGVmaW5lZChTVE0zMkc0ODN4eCkgfHwgZGVmaW5lZChTVE0zMkc0ODR4eCkgfHwgZGVmaW5lZChTVE0zMkc0OTF4eCkgfHwgXA0KLSAgICBkZWZpbmVkKFNUTTMyRzRBMXh4KQ0KLSAgICBETUFNVVgxX0NoYW5uZWxCYXNlID0gRE1BTVVYMV9DaGFubmVsODsNCi0jZWxpZiBkZWZpbmVkKFNUTTMyRzQzMXh4KSB8fCBkZWZpbmVkKFNUTTMyRzQ0MXh4KSB8fCBkZWZpbmVkKFNUTTMyR0JLMUNCKQ0KLSAgICBETUFNVVgxX0NoYW5uZWxCYXNlID0gRE1BTVVYMV9DaGFubmVsNjsNCi0jZWxzZQ0KLSAgICBETUFNVVgxX0NoYW5uZWxCYXNlID0gRE1BTVVYMV9DaGFubmVsNzsNCi0jZW5kaWYgLyogU1RNMzJHNHgxeHgpICovDQotICB9DQotICBkbWFtdXhfYmFzZV9hZGRyID0gKHVpbnQzMl90KURNQU1VWDFfQ2hhbm5lbEJhc2U7DQotICBjaGFubmVsX251bWJlciA9ICgoKHVpbnQzMl90KWhkbWEtPkluc3RhbmNlICYgMHhGRlUpIC0gOFUpIC8gMjBVOw0KLSAgaGRtYS0+RE1BbXV4Q2hhbm5lbCA9DQotICAgICAgKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKikodWludDMyX3QpKGRtYW11eF9iYXNlX2FkZHIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGhkbWEtPkNoYW5uZWxJbmRleCA+PiAyVSkgKg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClETUFNVVgxX0NoYW5uZWwxIC0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpRE1BTVVYMV9DaGFubmVsMCkpKTsNCi0gIGhkbWEtPkRNQW11eENoYW5uZWxTdGF0dXMgPSBETUFNVVgxX0NoYW5uZWxTdGF0dXM7DQotICBoZG1hLT5ETUFtdXhDaGFubmVsU3RhdHVzTWFzayA9IDFVTCA8PCAoY2hhbm5lbF9udW1iZXIgJiAweDFGVSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgVXBkYXRlcyB0aGUgRE1BIGhhbmRsZSB3aXRoIHRoZSBETUFNVVggIHJlcXVlc3QgZ2VuZXJhdG9yIHBhcmFtcw0KLSAqIEBwYXJhbSAgaGRtYSAgICAgICAgcG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQotICogICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUENCi0gKiBDaGFubmVsLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLQ0KLXN0YXRpYyB2b2lkIERNQV9DYWxjRE1BTVVYUmVxdWVzdEdlbkJhc2VBbmRNYXNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKSB7DQotICB1aW50MzJfdCByZXF1ZXN0ID0gaGRtYS0+SW5pdC5SZXF1ZXN0ICYgRE1BTVVYX0N4Q1JfRE1BUkVRX0lEOw0KLQ0KLSAgLyogRE1BIENoYW5uZWxzIGFyZSBjb25uZWN0ZWQgdG8gRE1BTVVYMSByZXF1ZXN0IGdlbmVyYXRvciBibG9ja3MqLw0KLSAgaGRtYS0+RE1BbXV4UmVxdWVzdEdlbiA9IChETUFNVVhfUmVxdWVzdEdlbl9UeXBlRGVmICopKCgNCi0gICAgICB1aW50MzJfdCkoKCh1aW50MzJfdClETUFNVVgxX1JlcXVlc3RHZW5lcmF0b3IwKSArICgocmVxdWVzdCAtIDFVKSAqIDRVKSkpOw0KLQ0KLSAgaGRtYS0+RE1BbXV4UmVxdWVzdEdlblN0YXR1cyA9IERNQU1VWDFfUmVxdWVzdEdlblN0YXR1czsNCi0NCi0gIGhkbWEtPkRNQW11eFJlcXVlc3RHZW5TdGF0dXNNYXNrID0gMVVMIDw8ICgocmVxdWVzdCAtIDFVKSAmIDB4MUZVKTsNCi19DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLSNlbmRpZiAvKiBIQUxfRE1BX01PRFVMRV9FTkFCTEVEICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmc0eHhfaGFsX2RtYS5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBETUEgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCisgICogICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIERpcmVjdCBNZW1vcnkgQWNjZXNzIChETUEpIHBlcmlwaGVyYWw6CisgICogICAgICAgICAgICsgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIFN0YXRlIGFuZCBlcnJvcnMgZnVuY3Rpb25zCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0ZXJtcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlCisgICogaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc29mdHdhcmUgY29tcG9uZW50LgorICAqIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcyB3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICBAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAoIykgRW5hYmxlIGFuZCBjb25maWd1cmUgdGhlIHBlcmlwaGVyYWwgdG8gYmUgY29ubmVjdGVkIHRvIHRoZSBETUEgQ2hhbm5lbAorICAgICAgIChleGNlcHQgZm9yIGludGVybmFsIFNSQU0gLyBGTEFTSCBtZW1vcmllczogbm8gaW5pdGlhbGl6YXRpb24gaXMKKyAgICAgICBuZWNlc3NhcnkpLiBQbGVhc2UgcmVmZXIgdG8gdGhlIFJlZmVyZW5jZSBtYW51YWwgZm9yIGNvbm5lY3Rpb24gYmV0d2VlbgorICBwZXJpcGhlcmFscyBhbmQgRE1BIHJlcXVlc3RzLgorCisgICAoIykgRm9yIGEgZ2l2ZW4gQ2hhbm5lbCwgcHJvZ3JhbSB0aGUgcmVxdWlyZWQgY29uZmlndXJhdGlvbiB0aHJvdWdoIHRoZQorICBmb2xsb3dpbmcgcGFyYW1ldGVyczogQ2hhbm5lbCByZXF1ZXN0LCBUcmFuc2ZlciBEaXJlY3Rpb24sIFNvdXJjZSBhbmQKKyAgRGVzdGluYXRpb24gZGF0YSBmb3JtYXRzLCBDaXJjdWxhciBvciBOb3JtYWwgbW9kZSwgQ2hhbm5lbCBQcmlvcml0eSBsZXZlbCwKKyAgU291cmNlIGFuZCBEZXN0aW5hdGlvbiBJbmNyZW1lbnQgbW9kZSB1c2luZyBIQUxfRE1BX0luaXQoKSBmdW5jdGlvbi4KKworICAgICAgIFByaW9yIHRvIEhBTF9ETUFfSW5pdCB0aGUgcGVyaXBoZXJhbCBjbG9jayBzaGFsbCBiZSBlbmFibGVkIGZvciBib3RoIERNQQorICAmIERNQU1VWCB0aGFua3MgdG86CisgICAgICAoIyMpIERNQTEgb3IgRE1BMjogX19IQUxfUkNDX0RNQTFfQ0xLX0VOQUJMRSgpIG9yCisgIF9fSEFMX1JDQ19ETUEyX0NMS19FTkFCTEUoKSA7CisgICAgICAoIyMpIERNQU1VWDE6ICAgICAgX19IQUxfUkNDX0RNQU1VWDFfQ0xLX0VOQUJMRSgpOworCisgICAoIykgVXNlIEhBTF9ETUFfR2V0U3RhdGUoKSBmdW5jdGlvbiB0byByZXR1cm4gdGhlIERNQSBzdGF0ZSBhbmQKKyAgSEFMX0RNQV9HZXRFcnJvcigpIGluIGNhc2Ugb2YgZXJyb3IgZGV0ZWN0aW9uLgorCisgICAoIykgVXNlIEhBTF9ETUFfQWJvcnQoKSBmdW5jdGlvbiB0byBhYm9ydCB0aGUgY3VycmVudCB0cmFuc2ZlcgorCisgICAgIC1ALSAgIEluIE1lbW9yeS10by1NZW1vcnkgdHJhbnNmZXIgbW9kZSwgQ2lyY3VsYXIgbW9kZSBpcyBub3QgYWxsb3dlZC4KKworICAgICAqKiogUG9sbGluZyBtb2RlIElPIG9wZXJhdGlvbiAqKioKKyAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgICAgICgrKSBVc2UgSEFMX0RNQV9TdGFydCgpIHRvIHN0YXJ0IERNQSB0cmFuc2ZlciBhZnRlciB0aGUgY29uZmlndXJhdGlvbgorICBvZiBTb3VyY2UgYWRkcmVzcyBhbmQgZGVzdGluYXRpb24gYWRkcmVzcyBhbmQgdGhlIExlbmd0aCBvZiBkYXRhIHRvIGJlCisgIHRyYW5zZmVycmVkCisgICAgICAgICAgKCspIFVzZSBIQUxfRE1BX1BvbGxGb3JUcmFuc2ZlcigpIHRvIHBvbGwgZm9yIHRoZSBlbmQgb2YgY3VycmVudAorICB0cmFuc2ZlciwgaW4gdGhpcyBjYXNlIGEgZml4ZWQgVGltZW91dCBjYW4gYmUgY29uZmlndXJlZCBieSBVc2VyIGRlcGVuZGluZworICBmcm9tIGhpcyBhcHBsaWNhdGlvbi4KKworICAgICAqKiogSW50ZXJydXB0IG1vZGUgSU8gb3BlcmF0aW9uICoqKgorICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgICAgICAoKykgQ29uZmlndXJlIHRoZSBETUEgaW50ZXJydXB0IHByaW9yaXR5IHVzaW5nIEhBTF9OVklDX1NldFByaW9yaXR5KCkKKyAgICAgICAgICAoKykgRW5hYmxlIHRoZSBETUEgSVJRIGhhbmRsZXIgdXNpbmcgSEFMX05WSUNfRW5hYmxlSVJRKCkKKyAgICAgICAgICAoKykgVXNlIEhBTF9ETUFfU3RhcnRfSVQoKSB0byBzdGFydCBETUEgdHJhbnNmZXIgYWZ0ZXIgdGhlCisgIGNvbmZpZ3VyYXRpb24gb2YgU291cmNlIGFkZHJlc3MgYW5kIGRlc3RpbmF0aW9uIGFkZHJlc3MgYW5kIHRoZSBMZW5ndGggb2YgZGF0YQorICB0byBiZSB0cmFuc2ZlcnJlZC4gSW4gdGhpcyBjYXNlIHRoZSBETUEgaW50ZXJydXB0IGlzIGNvbmZpZ3VyZWQKKyAgICAgICAgICAoKykgVXNlIEhBTF9ETUFfSVJRSGFuZGxlcigpIGNhbGxlZCB1bmRlciBETUFfSVJRSGFuZGxlcigpIEludGVycnVwdAorICBzdWJyb3V0aW5lCisgICAgICAgICAgKCspIEF0IHRoZSBlbmQgb2YgZGF0YSB0cmFuc2ZlciBIQUxfRE1BX0lSUUhhbmRsZXIoKSBmdW5jdGlvbiBpcworICBleGVjdXRlZCBhbmQgdXNlciBjYW4gYWRkIGhpcyBvd24gZnVuY3Rpb24gdG8gcmVnaXN0ZXIgY2FsbGJhY2tzIHdpdGgKKyAgSEFMX0RNQV9SZWdpc3RlckNhbGxiYWNrKCkuCisKKyAgICAgKioqIERNQSBIQUwgZHJpdmVyIG1hY3JvcyBsaXN0ICoqKgorICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIFsuLl0KKyAgICAgICBCZWxvdyB0aGUgbGlzdCBvZiBtYWNyb3MgaW4gRE1BIEhBTCBkcml2ZXIuCisKKyAgICAgICAoKykgX19IQUxfRE1BX0VOQUJMRTogRW5hYmxlIHRoZSBzcGVjaWZpZWQgRE1BIENoYW5uZWwuCisgICAgICAgKCspIF9fSEFMX0RNQV9ESVNBQkxFOiBEaXNhYmxlIHRoZSBzcGVjaWZpZWQgRE1BIENoYW5uZWwuCisgICAgICAgKCspIF9fSEFMX0RNQV9HRVRfRkxBRzogR2V0IHRoZSBETUEgQ2hhbm5lbCBwZW5kaW5nIGZsYWdzLgorICAgICAgICgrKSBfX0hBTF9ETUFfQ0xFQVJfRkxBRzogQ2xlYXIgdGhlIERNQSBDaGFubmVsIHBlbmRpbmcgZmxhZ3MuCisgICAgICAgKCspIF9fSEFMX0RNQV9FTkFCTEVfSVQ6IEVuYWJsZSB0aGUgc3BlY2lmaWVkIERNQSBDaGFubmVsIGludGVycnVwdHMuCisgICAgICAgKCspIF9fSEFMX0RNQV9ESVNBQkxFX0lUOiBEaXNhYmxlIHRoZSBzcGVjaWZpZWQgRE1BIENoYW5uZWwgaW50ZXJydXB0cy4KKyAgICAgICAoKykgX19IQUxfRE1BX0dFVF9JVF9TT1VSQ0U6IENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBETUEgQ2hhbm5lbAorICBpbnRlcnJ1cHQgaGFzIG9jY3VycmVkIG9yIG5vdC4KKworICAgICBbLi5dCisgICAgICAoQCkgWW91IGNhbiByZWZlciB0byB0aGUgRE1BIEhBTCBkcml2ZXIgaGVhZGVyIGZpbGUgZm9yIG1vcmUgdXNlZnVsIG1hY3JvcworCisgIEBlbmR2ZXJiYXRpbQorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzR4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzR4eF9IQUxfRHJpdmVyCisgKiBAeworICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BIERNQQorICogQGJyaWVmIERNQSBIQUwgbW9kdWxlIGRyaXZlcgorICogQHsKKyAqLworCisjaWZkZWYgSEFMX0RNQV9NT0RVTEVfRU5BQkxFRAorCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRE1BX1ByaXZhdGVfRnVuY3Rpb25zIERNQSBQcml2YXRlIEZ1bmN0aW9ucworICogQHsKKyAqLworc3RhdGljIHZvaWQgRE1BX1NldENvbmZpZyhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSwgdWludDMyX3QgU3JjQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRHN0QWRkcmVzcywgdWludDMyX3QgRGF0YUxlbmd0aCk7CisKK3N0YXRpYyB2b2lkIERNQV9DYWxjRE1BTVVYQ2hhbm5lbEJhc2VBbmRNYXNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIERNQV9DYWxjRE1BTVVYUmVxdWVzdEdlbkJhc2VBbmRNYXNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKKworLyoqCisgKiBAfQorICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBETUFfRXhwb3J0ZWRfRnVuY3Rpb25zIERNQSBFeHBvcnRlZCBGdW5jdGlvbnMKKyAqIEB7CisgKi8KKworLyoqIEBkZWZncm91cCBETUFfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24KK2Z1bmN0aW9ucworICAqICBAYnJpZWYgICBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAjIyMjIyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBpbml0aWFsaXplIHRoZSBETUEgQ2hhbm5lbAorc291cmNlIGFuZCBkZXN0aW5hdGlvbiBhZGRyZXNzZXMsIGluY3JlbWVudGF0aW9uIGFuZCBkYXRhIHNpemVzLCB0cmFuc2ZlcgorZGlyZWN0aW9uLCBjaXJjdWxhci9ub3JtYWwgbW9kZSBzZWxlY3Rpb24sIG1lbW9yeS10by1tZW1vcnkgbW9kZSBzZWxlY3Rpb24gYW5kCitDaGFubmVsIHByaW9yaXR5IHZhbHVlLgorICAgIFsuLl0KKyAgICBUaGUgSEFMX0RNQV9Jbml0KCkgZnVuY3Rpb24gZm9sbG93cyB0aGUgRE1BIGNvbmZpZ3VyYXRpb24gcHJvY2VkdXJlcyBhcworZGVzY3JpYmVkIGluIHJlZmVyZW5jZSBtYW51YWwuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBETUEgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQKKyAqICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgRE1BX0luaXRUeXBlRGVmIGFuZCBpbml0aWFsaXplIHRoZSBhc3NvY2lhdGVkCisgKiBoYW5kbGUuCisgKiBAcGFyYW0gIGhkbWEgUG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBDaGFubmVsLgorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9ETUFfSW5pdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkgeworICB1aW50MzJfdCB0bXA7CisKKyAgLyogQ2hlY2sgdGhlIERNQSBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZiAoaGRtYSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19ETUFfQUxMX0lOU1RBTkNFKGhkbWEtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19ETUFfRElSRUNUSU9OKGhkbWEtPkluaXQuRGlyZWN0aW9uKSk7CisgIGFzc2VydF9wYXJhbShJU19ETUFfUEVSSVBIRVJBTF9JTkNfU1RBVEUoaGRtYS0+SW5pdC5QZXJpcGhJbmMpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0RNQV9NRU1PUllfSU5DX1NUQVRFKGhkbWEtPkluaXQuTWVtSW5jKSk7CisgIGFzc2VydF9wYXJhbShJU19ETUFfUEVSSVBIRVJBTF9EQVRBX1NJWkUoaGRtYS0+SW5pdC5QZXJpcGhEYXRhQWxpZ25tZW50KSk7CisgIGFzc2VydF9wYXJhbShJU19ETUFfTUVNT1JZX0RBVEFfU0laRShoZG1hLT5Jbml0Lk1lbURhdGFBbGlnbm1lbnQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0RNQV9NT0RFKGhkbWEtPkluaXQuTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfRE1BX1BSSU9SSVRZKGhkbWEtPkluaXQuUHJpb3JpdHkpKTsKKworICBhc3NlcnRfcGFyYW0oSVNfRE1BX0FMTF9SRVFVRVNUKGhkbWEtPkluaXQuUmVxdWVzdCkpOworCisgIC8qIENvbXB1dGUgdGhlIGNoYW5uZWwgaW5kZXggKi8KKyAgaWYgKCh1aW50MzJfdCkoaGRtYS0+SW5zdGFuY2UpIDwgKHVpbnQzMl90KShETUEyX0NoYW5uZWwxKSkgeworICAgIC8qIERNQTEgKi8KKyAgICBoZG1hLT5DaGFubmVsSW5kZXggPSAoKCh1aW50MzJfdCloZG1hLT5JbnN0YW5jZSAtICh1aW50MzJfdClETUExX0NoYW5uZWwxKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpRE1BMV9DaGFubmVsMiAtICh1aW50MzJfdClETUExX0NoYW5uZWwxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAyOworICAgIGhkbWEtPkRtYUJhc2VBZGRyZXNzID0gRE1BMTsKKyAgfSBlbHNlIHsKKyAgICAvKiBETUEyICovCisgICAgaGRtYS0+Q2hhbm5lbEluZGV4ID0gKCgodWludDMyX3QpaGRtYS0+SW5zdGFuY2UgLSAodWludDMyX3QpRE1BMl9DaGFubmVsMSkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDIgLSAodWludDMyX3QpRE1BMl9DaGFubmVsMSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgMjsKKyAgICBoZG1hLT5EbWFCYXNlQWRkcmVzcyA9IERNQTI7CisgIH0KKworICAvKiBDaGFuZ2UgRE1BIHBlcmlwaGVyYWwgc3RhdGUgKi8KKyAgaGRtYS0+U3RhdGUgPSBIQUxfRE1BX1NUQVRFX0JVU1k7CisKKyAgLyogR2V0IHRoZSBDUiByZWdpc3RlciB2YWx1ZSAqLworICB0bXAgPSBoZG1hLT5JbnN0YW5jZS0+Q0NSOworCisgIC8qIENsZWFyIFBMLCBNU0laRSwgUFNJWkUsIE1JTkMsIFBJTkMsIENJUkMsIERJUiBhbmQgTUVNMk1FTSBiaXRzICovCisgIHRtcCAmPSAoKHVpbnQzMl90KSB+KERNQV9DQ1JfUEwgfCBETUFfQ0NSX01TSVpFIHwgRE1BX0NDUl9QU0laRSB8CisgICAgICAgICAgICAgICAgICAgICAgIERNQV9DQ1JfTUlOQyB8IERNQV9DQ1JfUElOQyB8IERNQV9DQ1JfQ0lSQyB8CisgICAgICAgICAgICAgICAgICAgICAgIERNQV9DQ1JfRElSIHwgRE1BX0NDUl9NRU0yTUVNKSk7CisKKyAgLyogUHJlcGFyZSB0aGUgRE1BIENoYW5uZWwgY29uZmlndXJhdGlvbiAqLworICB0bXAgfD0gaGRtYS0+SW5pdC5EaXJlY3Rpb24gfCBoZG1hLT5Jbml0LlBlcmlwaEluYyB8IGhkbWEtPkluaXQuTWVtSW5jIHwKKyAgICAgICAgIGhkbWEtPkluaXQuUGVyaXBoRGF0YUFsaWdubWVudCB8IGhkbWEtPkluaXQuTWVtRGF0YUFsaWdubWVudCB8CisgICAgICAgICBoZG1hLT5Jbml0Lk1vZGUgfCBoZG1hLT5Jbml0LlByaW9yaXR5OworCisgIC8qIFdyaXRlIHRvIERNQSBDaGFubmVsIENSIHJlZ2lzdGVyICovCisgIGhkbWEtPkluc3RhbmNlLT5DQ1IgPSB0bXA7CisKKyAgLyogSW5pdGlhbGl6ZSBwYXJhbWV0ZXJzIGZvciBETUFNVVggY2hhbm5lbCA6CisgICAgIERNQW11eENoYW5uZWwsIERNQW11eENoYW5uZWxTdGF0dXMgYW5kIERNQW11eENoYW5uZWxTdGF0dXNNYXNrCisgICovCisgIERNQV9DYWxjRE1BTVVYQ2hhbm5lbEJhc2VBbmRNYXNrKGhkbWEpOworCisgIGlmIChoZG1hLT5Jbml0LkRpcmVjdGlvbiA9PSBETUFfTUVNT1JZX1RPX01FTU9SWSkgeworICAgIC8qIGlmIG1lbW9yeSB0byBtZW1vcnkgZm9yY2UgdGhlIHJlcXVlc3QgdG8gMCovCisgICAgaGRtYS0+SW5pdC5SZXF1ZXN0ID0gRE1BX1JFUVVFU1RfTUVNMk1FTTsKKyAgfQorCisgIC8qIFNldCBwZXJpcGhlcmFsIHJlcXVlc3QgIHRvIERNQU1VWCBjaGFubmVsICovCisgIGhkbWEtPkRNQW11eENoYW5uZWwtPkNDUiA9IChoZG1hLT5Jbml0LlJlcXVlc3QgJiBETUFNVVhfQ3hDUl9ETUFSRVFfSUQpOworCisgIC8qIENsZWFyIHRoZSBETUFNVVggc3luY2hybyBvdmVycnVuIGZsYWcgKi8KKyAgaGRtYS0+RE1BbXV4Q2hhbm5lbFN0YXR1cy0+Q0ZSID0gaGRtYS0+RE1BbXV4Q2hhbm5lbFN0YXR1c01hc2s7CisKKyAgaWYgKCgoaGRtYS0+SW5pdC5SZXF1ZXN0ID4gMFUpICYmCisgICAgICAgKGhkbWEtPkluaXQuUmVxdWVzdCA8PSBETUFfUkVRVUVTVF9HRU5FUkFUT1IzKSkpIHsKKyAgICAvKiBJbml0aWFsaXplIHBhcmFtZXRlcnMgZm9yIERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvciA6CisgICAgICAgRE1BbXV4UmVxdWVzdEdlbiwgRE1BbXV4UmVxdWVzdEdlblN0YXR1cyBhbmQgRE1BbXV4UmVxdWVzdEdlblN0YXR1c01hc2sKKyAgICAqLworICAgIERNQV9DYWxjRE1BTVVYUmVxdWVzdEdlbkJhc2VBbmRNYXNrKGhkbWEpOworCisgICAgLyogUmVzZXQgdGhlIERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvciByZWdpc3RlciovCisgICAgaGRtYS0+RE1BbXV4UmVxdWVzdEdlbi0+UkdDUiA9IDBVOworCisgICAgLyogQ2xlYXIgdGhlIERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvciBvdmVycnVuIGZsYWcgKi8KKyAgICBoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuU3RhdHVzLT5SR0NGUiA9IGhkbWEtPkRNQW11eFJlcXVlc3RHZW5TdGF0dXNNYXNrOworICB9IGVsc2UgeworICAgIGhkbWEtPkRNQW11eFJlcXVlc3RHZW4gPSAwVTsKKyAgICBoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuU3RhdHVzID0gMFU7CisgICAgaGRtYS0+RE1BbXV4UmVxdWVzdEdlblN0YXR1c01hc2sgPSAwVTsKKyAgfQorCisgIC8qIEluaXRpYWxpemUgdGhlIGVycm9yIGNvZGUgKi8KKyAgaGRtYS0+RXJyb3JDb2RlID0gSEFMX0RNQV9FUlJPUl9OT05FOworCisgIC8qIEluaXRpYWxpemUgdGhlIERNQSBzdGF0ZSovCisgIGhkbWEtPlN0YXRlID0gSEFMX0RNQV9TVEFURV9SRUFEWTsKKworICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovCisgIGhkbWEtPkxvY2sgPSBIQUxfVU5MT0NLRUQ7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZSB0aGUgRE1BIHBlcmlwaGVyYWwuCisgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBDaGFubmVsLgorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9ETUFfRGVJbml0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKSB7CisgIC8qIENoZWNrIHRoZSBETUEgaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYgKE5VTEwgPT0gaGRtYSkgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfRE1BX0FMTF9JTlNUQU5DRShoZG1hLT5JbnN0YW5jZSkpOworCisgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIERNQSBDaGFubmVseCAqLworICBfX0hBTF9ETUFfRElTQUJMRShoZG1hKTsKKworICAvKiBDb21wdXRlIHRoZSBjaGFubmVsIGluZGV4ICovCisgIGlmICgodWludDMyX3QpKGhkbWEtPkluc3RhbmNlKSA8ICh1aW50MzJfdCkoRE1BMl9DaGFubmVsMSkpIHsKKyAgICAvKiBETUExICovCisgICAgaGRtYS0+Q2hhbm5lbEluZGV4ID0gKCgodWludDMyX3QpaGRtYS0+SW5zdGFuY2UgLSAodWludDMyX3QpRE1BMV9DaGFubmVsMSkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDIgLSAodWludDMyX3QpRE1BMV9DaGFubmVsMSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgMjsKKyAgICBoZG1hLT5EbWFCYXNlQWRkcmVzcyA9IERNQTE7CisgIH0gZWxzZSB7CisgICAgLyogRE1BMiAqLworICAgIGhkbWEtPkNoYW5uZWxJbmRleCA9ICgoKHVpbnQzMl90KWhkbWEtPkluc3RhbmNlIC0gKHVpbnQzMl90KURNQTJfQ2hhbm5lbDEpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClETUEyX0NoYW5uZWwyIC0gKHVpbnQzMl90KURNQTJfQ2hhbm5lbDEpKQorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IDI7CisgICAgaGRtYS0+RG1hQmFzZUFkZHJlc3MgPSBETUEyOworICB9CisKKyAgLyogUmVzZXQgRE1BIENoYW5uZWwgY29udHJvbCByZWdpc3RlciAqLworICBoZG1hLT5JbnN0YW5jZS0+Q0NSID0gMDsKKworICAvKiBDbGVhciBhbGwgZmxhZ3MgKi8KKyAgaGRtYS0+RG1hQmFzZUFkZHJlc3MtPklGQ1IgPSAoRE1BX0lTUl9HSUYxIDw8IChoZG1hLT5DaGFubmVsSW5kZXggJiAweDFGVSkpOworCisgIC8qIEluaXRpYWxpemUgcGFyYW1ldGVycyBmb3IgRE1BTVVYIGNoYW5uZWwgOgorICAgICBETUFtdXhDaGFubmVsLCBETUFtdXhDaGFubmVsU3RhdHVzIGFuZCBETUFtdXhDaGFubmVsU3RhdHVzTWFzayAqLworCisgIERNQV9DYWxjRE1BTVVYQ2hhbm5lbEJhc2VBbmRNYXNrKGhkbWEpOworCisgIC8qIFJlc2V0IHRoZSBETUFNVVggY2hhbm5lbCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBETUEgY2hhbm5lbCAqLworICBoZG1hLT5ETUFtdXhDaGFubmVsLT5DQ1IgPSAwOworCisgIC8qIENsZWFyIHRoZSBETUFNVVggc3luY2hybyBvdmVycnVuIGZsYWcgKi8KKyAgaGRtYS0+RE1BbXV4Q2hhbm5lbFN0YXR1cy0+Q0ZSID0gaGRtYS0+RE1BbXV4Q2hhbm5lbFN0YXR1c01hc2s7CisKKyAgLyogUmVzZXQgUmVxdWVzdCBnZW5lcmF0b3IgcGFyYW1ldGVycyBpZiBhbnkgKi8KKyAgaWYgKCgoaGRtYS0+SW5pdC5SZXF1ZXN0ID4gMFUpICYmCisgICAgICAgKGhkbWEtPkluaXQuUmVxdWVzdCA8PSBETUFfUkVRVUVTVF9HRU5FUkFUT1IzKSkpIHsKKyAgICAvKiBJbml0aWFsaXplIHBhcmFtZXRlcnMgZm9yIERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvciA6CisgICAgICAgRE1BbXV4UmVxdWVzdEdlbiwgRE1BbXV4UmVxdWVzdEdlblN0YXR1cyBhbmQgRE1BbXV4UmVxdWVzdEdlblN0YXR1c01hc2sKKyAgICAqLworICAgIERNQV9DYWxjRE1BTVVYUmVxdWVzdEdlbkJhc2VBbmRNYXNrKGhkbWEpOworCisgICAgLyogUmVzZXQgdGhlIERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvciByZWdpc3RlciovCisgICAgaGRtYS0+RE1BbXV4UmVxdWVzdEdlbi0+UkdDUiA9IDBVOworCisgICAgLyogQ2xlYXIgdGhlIERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvciBvdmVycnVuIGZsYWcgKi8KKyAgICBoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuU3RhdHVzLT5SR0NGUiA9IGhkbWEtPkRNQW11eFJlcXVlc3RHZW5TdGF0dXNNYXNrOworICB9CisKKyAgaGRtYS0+RE1BbXV4UmVxdWVzdEdlbiA9IDBVOworICBoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuU3RhdHVzID0gMFU7CisgIGhkbWEtPkRNQW11eFJlcXVlc3RHZW5TdGF0dXNNYXNrID0gMFU7CisKKyAgLyogQ2xlYW4gY2FsbGJhY2tzICovCisgIGhkbWEtPlhmZXJDcGx0Q2FsbGJhY2sgPSBOVUxMOworICBoZG1hLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IE5VTEw7CisgIGhkbWEtPlhmZXJFcnJvckNhbGxiYWNrID0gTlVMTDsKKyAgaGRtYS0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgIC8qIEluaXRpYWxpemUgdGhlIGVycm9yIGNvZGUgKi8KKyAgaGRtYS0+RXJyb3JDb2RlID0gSEFMX0RNQV9FUlJPUl9OT05FOworCisgIC8qIEluaXRpYWxpemUgdGhlIERNQSBzdGF0ZSAqLworICBoZG1hLT5TdGF0ZSA9IEhBTF9ETUFfU1RBVEVfUkVTRVQ7CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhoZG1hKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBETUFfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBJbnB1dCBhbmQgT3V0cHV0IG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKiAgQGJyaWVmICAgSW5wdXQgYW5kIE91dHB1dCBvcGVyYXRpb24gZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyAgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBDb25maWd1cmUgdGhlIHNvdXJjZSwgZGVzdGluYXRpb24gYWRkcmVzcyBhbmQgZGF0YSBsZW5ndGggYW5kIFN0YXJ0CitETUEgdHJhbnNmZXIKKyAgICAgICgrKSBDb25maWd1cmUgdGhlIHNvdXJjZSwgZGVzdGluYXRpb24gYWRkcmVzcyBhbmQgZGF0YSBsZW5ndGggYW5kCisgICAgICAgICAgU3RhcnQgRE1BIHRyYW5zZmVyIHdpdGggaW50ZXJydXB0CisgICAgICAoKykgQWJvcnQgRE1BIHRyYW5zZmVyCisgICAgICAoKykgUG9sbCBmb3IgdHJhbnNmZXIgY29tcGxldGUKKyAgICAgICgrKSBIYW5kbGUgRE1BIGludGVycnVwdCByZXF1ZXN0CisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICogQGJyaWVmICBTdGFydCB0aGUgRE1BIFRyYW5zZmVyLgorICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgQ2hhbm5lbC4KKyAqIEBwYXJhbSAgU3JjQWRkcmVzcyBUaGUgc291cmNlIG1lbW9yeSBCdWZmZXIgYWRkcmVzcworICogQHBhcmFtICBEc3RBZGRyZXNzIFRoZSBkZXN0aW5hdGlvbiBtZW1vcnkgQnVmZmVyIGFkZHJlc3MKKyAqIEBwYXJhbSAgRGF0YUxlbmd0aCBUaGUgbGVuZ3RoIG9mIGRhdGEgdG8gYmUgdHJhbnNmZXJyZWQgZnJvbSBzb3VyY2UgdG8KKyAqIGRlc3RpbmF0aW9uICh1cCB0byAyNTZLYnl0ZXMtMSkKKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BX1N0YXJ0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hLCB1aW50MzJfdCBTcmNBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBEc3RBZGRyZXNzLCB1aW50MzJfdCBEYXRhTGVuZ3RoKSB7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfRE1BX0JVRkZFUl9TSVpFKERhdGFMZW5ndGgpKTsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhkbWEpOworCisgIGlmIChIQUxfRE1BX1NUQVRFX1JFQURZID09IGhkbWEtPlN0YXRlKSB7CisgICAgLyogQ2hhbmdlIERNQSBwZXJpcGhlcmFsIHN0YXRlICovCisgICAgaGRtYS0+U3RhdGUgPSBIQUxfRE1BX1NUQVRFX0JVU1k7CisgICAgaGRtYS0+RXJyb3JDb2RlID0gSEFMX0RNQV9FUlJPUl9OT05FOworCisgICAgLyogRGlzYWJsZSB0aGUgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX0RNQV9ESVNBQkxFKGhkbWEpOworCisgICAgLyogQ29uZmlndXJlIHRoZSBzb3VyY2UsIGRlc3RpbmF0aW9uIGFkZHJlc3MgYW5kIHRoZSBkYXRhIGxlbmd0aCAmIGNsZWFyCisgICAgICogZmxhZ3MqLworICAgIERNQV9TZXRDb25maWcoaGRtYSwgU3JjQWRkcmVzcywgRHN0QWRkcmVzcywgRGF0YUxlbmd0aCk7CisKKyAgICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgICBfX0hBTF9ETUFfRU5BQkxFKGhkbWEpOworICB9IGVsc2UgeworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGRtYSk7CisgICAgc3RhdHVzID0gSEFMX0JVU1k7CisgIH0KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBAYnJpZWYgIFN0YXJ0IHRoZSBETUEgVHJhbnNmZXIgd2l0aCBpbnRlcnJ1cHQgZW5hYmxlZC4KKyAqIEBwYXJhbSAgaGRtYSBwb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIENoYW5uZWwuCisgKiBAcGFyYW0gIFNyY0FkZHJlc3MgVGhlIHNvdXJjZSBtZW1vcnkgQnVmZmVyIGFkZHJlc3MKKyAqIEBwYXJhbSAgRHN0QWRkcmVzcyBUaGUgZGVzdGluYXRpb24gbWVtb3J5IEJ1ZmZlciBhZGRyZXNzCisgKiBAcGFyYW0gIERhdGFMZW5ndGggVGhlIGxlbmd0aCBvZiBkYXRhIHRvIGJlIHRyYW5zZmVycmVkIGZyb20gc291cmNlIHRvCisgKiBkZXN0aW5hdGlvbiAodXAgdG8gMjU2S2J5dGVzLTEpCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RNQV9TdGFydF9JVChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSwgdWludDMyX3QgU3JjQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRHN0QWRkcmVzcywgdWludDMyX3QgRGF0YUxlbmd0aCkgeworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0RNQV9CVUZGRVJfU0laRShEYXRhTGVuZ3RoKSk7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoZG1hKTsKKworICBpZiAoSEFMX0RNQV9TVEFURV9SRUFEWSA9PSBoZG1hLT5TdGF0ZSkgeworICAgIC8qIENoYW5nZSBETUEgcGVyaXBoZXJhbCBzdGF0ZSAqLworICAgIGhkbWEtPlN0YXRlID0gSEFMX0RNQV9TVEFURV9CVVNZOworICAgIGhkbWEtPkVycm9yQ29kZSA9IEhBTF9ETUFfRVJST1JfTk9ORTsKKworICAgIC8qIERpc2FibGUgdGhlIHBlcmlwaGVyYWwgKi8KKyAgICBfX0hBTF9ETUFfRElTQUJMRShoZG1hKTsKKworICAgIC8qIENvbmZpZ3VyZSB0aGUgc291cmNlLCBkZXN0aW5hdGlvbiBhZGRyZXNzIGFuZCB0aGUgZGF0YSBsZW5ndGggJiBjbGVhcgorICAgICAqIGZsYWdzKi8KKyAgICBETUFfU2V0Q29uZmlnKGhkbWEsIFNyY0FkZHJlc3MsIERzdEFkZHJlc3MsIERhdGFMZW5ndGgpOworCisgICAgLyogRW5hYmxlIHRoZSB0cmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQgKi8KKyAgICAvKiBFbmFibGUgdGhlIHRyYW5zZmVyIEVycm9yIGludGVycnVwdCAqLworICAgIGlmIChOVUxMICE9IGhkbWEtPlhmZXJIYWxmQ3BsdENhbGxiYWNrKSB7CisgICAgICAvKiBFbmFibGUgdGhlIEhhbGYgdHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0IGFzIHdlbGwgKi8KKyAgICAgIF9fSEFMX0RNQV9FTkFCTEVfSVQoaGRtYSwgKERNQV9JVF9UQyB8IERNQV9JVF9IVCB8IERNQV9JVF9URSkpOworICAgIH0gZWxzZSB7CisgICAgICBfX0hBTF9ETUFfRElTQUJMRV9JVChoZG1hLCBETUFfSVRfSFQpOworICAgICAgX19IQUxfRE1BX0VOQUJMRV9JVChoZG1hLCAoRE1BX0lUX1RDIHwgRE1BX0lUX1RFKSk7CisgICAgfQorCisgICAgLyogQ2hlY2sgaWYgRE1BTVVYIFN5bmNocm9uaXphdGlvbiBpcyBlbmFibGVkKi8KKyAgICBpZiAoKGhkbWEtPkRNQW11eENoYW5uZWwtPkNDUiAmIERNQU1VWF9DeENSX1NFKSAhPSAwVSkgeworICAgICAgLyogRW5hYmxlIERNQU1VWCBzeW5jIG92ZXJydW4gSVQqLworICAgICAgaGRtYS0+RE1BbXV4Q2hhbm5lbC0+Q0NSIHw9IERNQU1VWF9DeENSX1NPSUU7CisgICAgfQorCisgICAgaWYgKGhkbWEtPkRNQW11eFJlcXVlc3RHZW4gIT0gMFUpIHsKKyAgICAgIC8qIGlmIHVzaW5nIERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvciwgZW5hYmxlIHRoZSBETUFNVVggcmVxdWVzdCBnZW5lcmF0b3IKKyAgICAgICAqIG92ZXJydW4gSVQqLworICAgICAgLyogZW5hYmxlIHRoZSByZXF1ZXN0IGdlbiBvdmVycnVuIElUKi8KKyAgICAgIGhkbWEtPkRNQW11eFJlcXVlc3RHZW4tPlJHQ1IgfD0gRE1BTVVYX1JHeENSX09JRTsKKyAgICB9CisKKyAgICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgICBfX0hBTF9ETUFfRU5BQkxFKGhkbWEpOworICB9IGVsc2UgeworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGRtYSk7CisKKyAgICAvKiBSZW1haW4gQlVTWSAqLworICAgIHN0YXR1cyA9IEhBTF9CVVNZOworICB9CisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogQGJyaWVmICBBYm9ydCB0aGUgRE1BIFRyYW5zZmVyLgorICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgQ2hhbm5lbC4KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BX0Fib3J0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKSB7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBpZiAoaGRtYS0+U3RhdGUgIT0gSEFMX0RNQV9TVEFURV9CVVNZKSB7CisgICAgLyogbm8gdHJhbnNmZXIgb25nb2luZyAqLworICAgIGhkbWEtPkVycm9yQ29kZSA9IEhBTF9ETUFfRVJST1JfTk9fWEZFUjsKKworICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfSBlbHNlIHsKKyAgICAvKiBEaXNhYmxlIERNQSBJVCAqLworICAgIF9fSEFMX0RNQV9ESVNBQkxFX0lUKGhkbWEsIChETUFfSVRfVEMgfCBETUFfSVRfSFQgfCBETUFfSVRfVEUpKTsKKworICAgIC8qIGRpc2FibGUgdGhlIERNQU1VWCBzeW5jIG92ZXJydW4gSVQqLworICAgIGhkbWEtPkRNQW11eENoYW5uZWwtPkNDUiAmPSB+RE1BTVVYX0N4Q1JfU09JRTsKKworICAgIC8qIERpc2FibGUgdGhlIGNoYW5uZWwgKi8KKyAgICBfX0hBTF9ETUFfRElTQUJMRShoZG1hKTsKKworICAgIC8qIENsZWFyIGFsbCBmbGFncyAqLworICAgIGhkbWEtPkRtYUJhc2VBZGRyZXNzLT5JRkNSID0gKERNQV9JU1JfR0lGMSA8PCAoaGRtYS0+Q2hhbm5lbEluZGV4ICYgMHgxRlUpKTsKKworICAgIC8qIENsZWFyIHRoZSBETUFNVVggc3luY2hybyBvdmVycnVuIGZsYWcgKi8KKyAgICBoZG1hLT5ETUFtdXhDaGFubmVsU3RhdHVzLT5DRlIgPSBoZG1hLT5ETUFtdXhDaGFubmVsU3RhdHVzTWFzazsKKworICAgIGlmIChoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuICE9IDBVKSB7CisgICAgICAvKiBpZiB1c2luZyBETUFNVVggcmVxdWVzdCBnZW5lcmF0b3IsIGRpc2FibGUgdGhlIERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvcgorICAgICAgICogb3ZlcnJ1biBJVCovCisgICAgICAvKiBkaXNhYmxlIHRoZSByZXF1ZXN0IGdlbiBvdmVycnVuIElUKi8KKyAgICAgIGhkbWEtPkRNQW11eFJlcXVlc3RHZW4tPlJHQ1IgJj0gfkRNQU1VWF9SR3hDUl9PSUU7CisKKyAgICAgIC8qIENsZWFyIHRoZSBETUFNVVggcmVxdWVzdCBnZW5lcmF0b3Igb3ZlcnJ1biBmbGFnICovCisgICAgICBoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuU3RhdHVzLT5SR0NGUiA9IGhkbWEtPkRNQW11eFJlcXVlc3RHZW5TdGF0dXNNYXNrOworICAgIH0KKyAgfQorICAvKiBDaGFuZ2UgdGhlIERNQSBzdGF0ZSAqLworICBoZG1hLT5TdGF0ZSA9IEhBTF9ETUFfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGRtYSk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBAYnJpZWYgIEFib3J0cyB0aGUgRE1BIFRyYW5zZmVyIGluIEludGVycnVwdCBtb2RlLgorICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICogICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBDaGFubmVsLgorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9ETUFfQWJvcnRfSVQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpIHsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIGlmIChIQUxfRE1BX1NUQVRFX0JVU1kgIT0gaGRtYS0+U3RhdGUpIHsKKyAgICAvKiBubyB0cmFuc2ZlciBvbmdvaW5nICovCisgICAgaGRtYS0+RXJyb3JDb2RlID0gSEFMX0RNQV9FUlJPUl9OT19YRkVSOworCisgICAgLyogQ2hhbmdlIHRoZSBETUEgc3RhdGUgKi8KKyAgICBoZG1hLT5TdGF0ZSA9IEhBTF9ETUFfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhkbWEpOworCisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9IGVsc2UgeworICAgIC8qIERpc2FibGUgRE1BIElUICovCisgICAgX19IQUxfRE1BX0RJU0FCTEVfSVQoaGRtYSwgKERNQV9JVF9UQyB8IERNQV9JVF9IVCB8IERNQV9JVF9URSkpOworCisgICAgLyogRGlzYWJsZSB0aGUgY2hhbm5lbCAqLworICAgIF9fSEFMX0RNQV9ESVNBQkxFKGhkbWEpOworCisgICAgLyogZGlzYWJsZSB0aGUgRE1BTVVYIHN5bmMgb3ZlcnJ1biBJVCovCisgICAgaGRtYS0+RE1BbXV4Q2hhbm5lbC0+Q0NSICY9IH5ETUFNVVhfQ3hDUl9TT0lFOworCisgICAgLyogQ2xlYXIgYWxsIGZsYWdzICovCisgICAgaGRtYS0+RG1hQmFzZUFkZHJlc3MtPklGQ1IgPSAoRE1BX0lTUl9HSUYxIDw8IChoZG1hLT5DaGFubmVsSW5kZXggJiAweDFGVSkpOworCisgICAgLyogQ2xlYXIgdGhlIERNQU1VWCBzeW5jaHJvIG92ZXJydW4gZmxhZyAqLworICAgIGhkbWEtPkRNQW11eENoYW5uZWxTdGF0dXMtPkNGUiA9IGhkbWEtPkRNQW11eENoYW5uZWxTdGF0dXNNYXNrOworCisgICAgaWYgKGhkbWEtPkRNQW11eFJlcXVlc3RHZW4gIT0gMFUpIHsKKyAgICAgIC8qIGlmIHVzaW5nIERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvciwgZGlzYWJsZSB0aGUgRE1BTVVYIHJlcXVlc3QgZ2VuZXJhdG9yCisgICAgICAgKiBvdmVycnVuIElUKi8KKyAgICAgIC8qIGRpc2FibGUgdGhlIHJlcXVlc3QgZ2VuIG92ZXJydW4gSVQqLworICAgICAgaGRtYS0+RE1BbXV4UmVxdWVzdEdlbi0+UkdDUiAmPSB+RE1BTVVYX1JHeENSX09JRTsKKworICAgICAgLyogQ2xlYXIgdGhlIERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvciBvdmVycnVuIGZsYWcgKi8KKyAgICAgIGhkbWEtPkRNQW11eFJlcXVlc3RHZW5TdGF0dXMtPlJHQ0ZSID0gaGRtYS0+RE1BbXV4UmVxdWVzdEdlblN0YXR1c01hc2s7CisgICAgfQorCisgICAgLyogQ2hhbmdlIHRoZSBETUEgc3RhdGUgKi8KKyAgICBoZG1hLT5TdGF0ZSA9IEhBTF9ETUFfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhkbWEpOworCisgICAgLyogQ2FsbCBVc2VyIEFib3J0IGNhbGxiYWNrICovCisgICAgaWYgKGhkbWEtPlhmZXJBYm9ydENhbGxiYWNrICE9IE5VTEwpIHsKKyAgICAgIGhkbWEtPlhmZXJBYm9ydENhbGxiYWNrKGhkbWEpOworICAgIH0KKyAgfQorICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIEBicmllZiAgUG9sbGluZyBmb3IgdHJhbnNmZXIgY29tcGxldGUuCisgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIENoYW5uZWwuCisgKiBAcGFyYW0gIENvbXBsZXRlTGV2ZWwgU3BlY2lmaWVzIHRoZSBETUEgbGV2ZWwgY29tcGxldGUuCisgKiBAcGFyYW0gIFRpbWVvdXQgICAgICAgVGltZW91dCBkdXJhdGlvbi4KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BX1BvbGxGb3JUcmFuc2ZlcigKKyAgICBETUFfSGFuZGxlVHlwZURlZiAqaGRtYSwgSEFMX0RNQV9MZXZlbENvbXBsZXRlVHlwZURlZiBDb21wbGV0ZUxldmVsLAorICAgIHVpbnQzMl90IFRpbWVvdXQpIHsKKyAgdWludDMyX3QgdGVtcDsKKyAgdWludDMyX3QgdGlja3N0YXJ0OworCisgIGlmIChIQUxfRE1BX1NUQVRFX0JVU1kgIT0gaGRtYS0+U3RhdGUpIHsKKyAgICAvKiBubyB0cmFuc2ZlciBvbmdvaW5nICovCisgICAgaGRtYS0+RXJyb3JDb2RlID0gSEFMX0RNQV9FUlJPUl9OT19YRkVSOworICAgIF9fSEFMX1VOTE9DSyhoZG1hKTsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogUG9sbGluZyBtb2RlIG5vdCBzdXBwb3J0ZWQgaW4gY2lyY3VsYXIgbW9kZSAqLworICBpZiAoMFUgIT0gKGhkbWEtPkluc3RhbmNlLT5DQ1IgJiBETUFfQ0NSX0NJUkMpKSB7CisgICAgaGRtYS0+RXJyb3JDb2RlID0gSEFMX0RNQV9FUlJPUl9OT1RfU1VQUE9SVEVEOworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBHZXQgdGhlIGxldmVsIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcgKi8KKyAgaWYgKEhBTF9ETUFfRlVMTF9UUkFOU0ZFUiA9PSBDb21wbGV0ZUxldmVsKSB7CisgICAgLyogVHJhbnNmZXIgQ29tcGxldGUgZmxhZyAqLworCisgICAgdGVtcCA9ICh1aW50MzJfdClETUFfRkxBR19UQzEgPDwgKGhkbWEtPkNoYW5uZWxJbmRleCAmIDB4MUZVKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBIYWxmIFRyYW5zZmVyIENvbXBsZXRlIGZsYWcgKi8KKyAgICB0ZW1wID0gKHVpbnQzMl90KURNQV9GTEFHX0hUMSA8PCAoaGRtYS0+Q2hhbm5lbEluZGV4ICYgMHgxRlUpOworICB9CisKKyAgLyogR2V0IHRpY2sgKi8KKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICB3aGlsZSAoMFUgPT0gKGhkbWEtPkRtYUJhc2VBZGRyZXNzLT5JU1IgJiB0ZW1wKSkgeworICAgIGlmICgoMFUgIT0gKGhkbWEtPkRtYUJhc2VBZGRyZXNzLT5JU1IgJgorICAgICAgICAgICAgICAgICgodWludDMyX3QpRE1BX0ZMQUdfVEUxIDw8IChoZG1hLT5DaGFubmVsSW5kZXggJiAweDFGVSkpKSkpIHsKKyAgICAgIC8qIFdoZW4gYSBETUEgdHJhbnNmZXIgZXJyb3Igb2NjdXJzICovCisgICAgICAvKiBBIGhhcmR3YXJlIGNsZWFyIG9mIGl0cyBFTiBiaXRzIGlzIHBlcmZvcm1lZCAqLworICAgICAgLyogQ2xlYXIgYWxsIGZsYWdzICovCisgICAgICBoZG1hLT5EbWFCYXNlQWRkcmVzcy0+SUZDUiA9CisgICAgICAgICAgKCh1aW50MzJfdClETUFfSVNSX0dJRjEgPDwgKGhkbWEtPkNoYW5uZWxJbmRleCAmIDB4MUZVKSk7CisKKyAgICAgIC8qIFVwZGF0ZSBlcnJvciBjb2RlICovCisgICAgICBoZG1hLT5FcnJvckNvZGUgPSBIQUxfRE1BX0VSUk9SX1RFOworCisgICAgICAvKiBDaGFuZ2UgdGhlIERNQSBzdGF0ZSAqLworICAgICAgaGRtYS0+U3RhdGUgPSBIQUxfRE1BX1NUQVRFX1JFQURZOworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGRtYSk7CisKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLworICAgIGlmIChUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpIHsKKyAgICAgIGlmICgoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gVGltZW91dCkgfHwgKFRpbWVvdXQgPT0gMFUpKSB7CisgICAgICAgIC8qIFVwZGF0ZSBlcnJvciBjb2RlICovCisgICAgICAgIGhkbWEtPkVycm9yQ29kZSA9IEhBTF9ETUFfRVJST1JfVElNRU9VVDsKKworICAgICAgICAvKiBDaGFuZ2UgdGhlIERNQSBzdGF0ZSAqLworICAgICAgICBoZG1hLT5TdGF0ZSA9IEhBTF9ETUFfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGRtYSk7CisKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKkNoZWNrIGZvciBETUFNVVggUmVxdWVzdCBnZW5lcmF0b3IgKGlmIHVzZWQpIG92ZXJydW4gc3RhdHVzICovCisgIGlmIChoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuICE9IDBVKSB7CisgICAgLyogaWYgdXNpbmcgRE1BTVVYIHJlcXVlc3QgZ2VuZXJhdG9yIENoZWNrIGZvciBETUFNVVggcmVxdWVzdCBnZW5lcmF0b3IKKyAgICAgKiBvdmVycnVuICovCisgICAgaWYgKChoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuU3RhdHVzLT5SR1NSICYKKyAgICAgICAgIGhkbWEtPkRNQW11eFJlcXVlc3RHZW5TdGF0dXNNYXNrKSAhPSAwVSkgeworICAgICAgLyogRGlzYWJsZSB0aGUgcmVxdWVzdCBnZW4gb3ZlcnJ1biBpbnRlcnJ1cHQgKi8KKyAgICAgIGhkbWEtPkRNQW11eFJlcXVlc3RHZW4tPlJHQ1IgfD0gRE1BTVVYX1JHeENSX09JRTsKKworICAgICAgLyogQ2xlYXIgdGhlIERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvciBvdmVycnVuIGZsYWcgKi8KKyAgICAgIGhkbWEtPkRNQW11eFJlcXVlc3RHZW5TdGF0dXMtPlJHQ0ZSID0gaGRtYS0+RE1BbXV4UmVxdWVzdEdlblN0YXR1c01hc2s7CisKKyAgICAgIC8qIFVwZGF0ZSBlcnJvciBjb2RlICovCisgICAgICBoZG1hLT5FcnJvckNvZGUgfD0gSEFMX0RNQV9FUlJPUl9SRVFHRU47CisgICAgfQorICB9CisKKyAgLyogQ2hlY2sgZm9yIERNQU1VWCBTeW5jaHJvbml6YXRpb24gb3ZlcnJ1biAqLworICBpZiAoKGhkbWEtPkRNQW11eENoYW5uZWxTdGF0dXMtPkNTUiAmIGhkbWEtPkRNQW11eENoYW5uZWxTdGF0dXNNYXNrKSAhPSAwVSkgeworICAgIC8qIENsZWFyIHRoZSBETUFNVVggc3luY2hybyBvdmVycnVuIGZsYWcgKi8KKyAgICBoZG1hLT5ETUFtdXhDaGFubmVsU3RhdHVzLT5DRlIgPSBoZG1hLT5ETUFtdXhDaGFubmVsU3RhdHVzTWFzazsKKworICAgIC8qIFVwZGF0ZSBlcnJvciBjb2RlICovCisgICAgaGRtYS0+RXJyb3JDb2RlIHw9IEhBTF9ETUFfRVJST1JfU1lOQzsKKyAgfQorCisgIGlmIChIQUxfRE1BX0ZVTExfVFJBTlNGRVIgPT0gQ29tcGxldGVMZXZlbCkgeworICAgIC8qIENsZWFyIHRoZSB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnICovCisgICAgaGRtYS0+RG1hQmFzZUFkZHJlc3MtPklGQ1IgPQorICAgICAgICAoKHVpbnQzMl90KURNQV9GTEFHX1RDMSA8PCAoaGRtYS0+Q2hhbm5lbEluZGV4ICYgMHgxRlUpKTsKKworICAgIC8qIFRoZSBzZWxlY3RlZCBDaGFubmVseCBFTiBiaXQgaXMgY2xlYXJlZCAoRE1BIGlzIGRpc2FibGVkIGFuZAorICAgIGFsbCB0cmFuc2ZlcnMgYXJlIGNvbXBsZXRlKSAqLworICAgIGhkbWEtPlN0YXRlID0gSEFMX0RNQV9TVEFURV9SRUFEWTsKKyAgfSBlbHNlIHsKKyAgICAvKiBDbGVhciB0aGUgaGFsZiB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnICovCisgICAgaGRtYS0+RG1hQmFzZUFkZHJlc3MtPklGQ1IgPQorICAgICAgICAoKHVpbnQzMl90KURNQV9GTEFHX0hUMSA8PCAoaGRtYS0+Q2hhbm5lbEluZGV4ICYgMHgxRlUpKTsKKyAgfQorCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhkbWEpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICogQGJyaWVmICBIYW5kbGUgRE1BIGludGVycnVwdCByZXF1ZXN0LgorICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgQ2hhbm5lbC4KKyAqIEByZXR2YWwgTm9uZQorICovCit2b2lkIEhBTF9ETUFfSVJRSGFuZGxlcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkgeworICB1aW50MzJfdCBmbGFnX2l0ID0gaGRtYS0+RG1hQmFzZUFkZHJlc3MtPklTUjsKKyAgdWludDMyX3Qgc291cmNlX2l0ID0gaGRtYS0+SW5zdGFuY2UtPkNDUjsKKworICAvKiBIYWxmIFRyYW5zZmVyIENvbXBsZXRlIEludGVycnVwdCBtYW5hZ2VtZW50ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgaWYgKCgwVSAhPQorICAgICAgIChmbGFnX2l0ICYgKCh1aW50MzJfdClETUFfRkxBR19IVDEgPDwgKGhkbWEtPkNoYW5uZWxJbmRleCAmIDB4MUZVKSkpKSAmJgorICAgICAgKDBVICE9IChzb3VyY2VfaXQgJiBETUFfSVRfSFQpKSkgeworICAgIC8qIERpc2FibGUgdGhlIGhhbGYgdHJhbnNmZXIgaW50ZXJydXB0IGlmIHRoZSBETUEgbW9kZSBpcyBub3QgQ0lSQ1VMQVIgKi8KKyAgICBpZiAoKGhkbWEtPkluc3RhbmNlLT5DQ1IgJiBETUFfQ0NSX0NJUkMpID09IDBVKSB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBoYWxmIHRyYW5zZmVyIGludGVycnVwdCAqLworICAgICAgX19IQUxfRE1BX0RJU0FCTEVfSVQoaGRtYSwgRE1BX0lUX0hUKTsKKyAgICB9CisgICAgLyogQ2xlYXIgdGhlIGhhbGYgdHJhbnNmZXIgY29tcGxldGUgZmxhZyAqLworICAgIGhkbWEtPkRtYUJhc2VBZGRyZXNzLT5JRkNSID0KKyAgICAgICAgKCh1aW50MzJfdClETUFfSVNSX0hUSUYxIDw8IChoZG1hLT5DaGFubmVsSW5kZXggJiAweDFGVSkpOworCisgICAgLyogRE1BIHBlcmlwaGVyYWwgc3RhdGUgaXMgbm90IHVwZGF0ZWQgaW4gSGFsZiBUcmFuc2ZlciAqLworICAgIC8qIGJ1dCBpbiBUcmFuc2ZlciBDb21wbGV0ZSBjYXNlICovCisKKyAgICBpZiAoaGRtYS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgIT0gTlVMTCkgeworICAgICAgLyogSGFsZiB0cmFuc2ZlciBjYWxsYmFjayAqLworICAgICAgaGRtYS0+WGZlckhhbGZDcGx0Q2FsbGJhY2soaGRtYSk7CisgICAgfQorICB9CisgIC8qIFRyYW5zZmVyIENvbXBsZXRlIEludGVycnVwdCBtYW5hZ2VtZW50ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICBlbHNlIGlmICgoMFUgIT0gKGZsYWdfaXQgJgorICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpRE1BX0ZMQUdfVEMxIDw8IChoZG1hLT5DaGFubmVsSW5kZXggJiAweDFGVSkpKSkgJiYKKyAgICAgICAgICAgKDBVICE9IChzb3VyY2VfaXQgJiBETUFfSVRfVEMpKSkgeworICAgIGlmICgoaGRtYS0+SW5zdGFuY2UtPkNDUiAmIERNQV9DQ1JfQ0lSQykgPT0gMFUpIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIHRyYW5zZmVyIGNvbXBsZXRlIGFuZCBlcnJvciBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX0RNQV9ESVNBQkxFX0lUKGhkbWEsIERNQV9JVF9URSB8IERNQV9JVF9UQyk7CisKKyAgICAgIC8qIENoYW5nZSB0aGUgRE1BIHN0YXRlICovCisgICAgICBoZG1hLT5TdGF0ZSA9IEhBTF9ETUFfU1RBVEVfUkVBRFk7CisgICAgfQorICAgIC8qIENsZWFyIHRoZSB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnICovCisgICAgaGRtYS0+RG1hQmFzZUFkZHJlc3MtPklGQ1IgPQorICAgICAgICAoKHVpbnQzMl90KURNQV9JU1JfVENJRjEgPDwgKGhkbWEtPkNoYW5uZWxJbmRleCAmIDB4MUZVKSk7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhkbWEpOworCisgICAgaWYgKGhkbWEtPlhmZXJDcGx0Q2FsbGJhY2sgIT0gTlVMTCkgeworICAgICAgLyogVHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICAgIGhkbWEtPlhmZXJDcGx0Q2FsbGJhY2soaGRtYSk7CisgICAgfQorICB9CisgIC8qIFRyYW5zZmVyIEVycm9yIEludGVycnVwdCBtYW5hZ2VtZW50ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICBlbHNlIGlmICgoMFUgIT0gKGZsYWdfaXQgJgorICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpRE1BX0ZMQUdfVEUxIDw8IChoZG1hLT5DaGFubmVsSW5kZXggJiAweDFGVSkpKSkgJiYKKyAgICAgICAgICAgKDBVICE9IChzb3VyY2VfaXQgJiBETUFfSVRfVEUpKSkgeworICAgIC8qIFdoZW4gYSBETUEgdHJhbnNmZXIgZXJyb3Igb2NjdXJzICovCisgICAgLyogQSBoYXJkd2FyZSBjbGVhciBvZiBpdHMgRU4gYml0cyBpcyBwZXJmb3JtZWQgKi8KKyAgICAvKiBEaXNhYmxlIEFMTCBETUEgSVQgKi8KKyAgICBfX0hBTF9ETUFfRElTQUJMRV9JVChoZG1hLCAoRE1BX0lUX1RDIHwgRE1BX0lUX0hUIHwgRE1BX0lUX1RFKSk7CisKKyAgICAvKiBDbGVhciBhbGwgZmxhZ3MgKi8KKyAgICBoZG1hLT5EbWFCYXNlQWRkcmVzcy0+SUZDUiA9CisgICAgICAgICgodWludDMyX3QpRE1BX0lTUl9HSUYxIDw8IChoZG1hLT5DaGFubmVsSW5kZXggJiAweDFGVSkpOworCisgICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8KKyAgICBoZG1hLT5FcnJvckNvZGUgPSBIQUxfRE1BX0VSUk9SX1RFOworCisgICAgLyogQ2hhbmdlIHRoZSBETUEgc3RhdGUgKi8KKyAgICBoZG1hLT5TdGF0ZSA9IEhBTF9ETUFfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhkbWEpOworCisgICAgaWYgKGhkbWEtPlhmZXJFcnJvckNhbGxiYWNrICE9IE5VTEwpIHsKKyAgICAgIC8qIFRyYW5zZmVyIGVycm9yIGNhbGxiYWNrICovCisgICAgICBoZG1hLT5YZmVyRXJyb3JDYWxsYmFjayhoZG1hKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyogTm90aGluZyBUbyBEbyAqLworICB9CisgIHJldHVybjsKK30KKworLyoqCisgKiBAYnJpZWYgIFJlZ2lzdGVyIGNhbGxiYWNrcworICogQHBhcmFtICBoZG1hICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQKKyAqIGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBDaGFubmVsLgorICogQHBhcmFtICBDYWxsYmFja0lEICAgICAgICAgICBVc2VyIENhbGxiYWNrIGlkZW50aWZpZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgSEFMX0RNQV9DYWxsYmFja0lEVHlwZURlZiBFTlVNIGFzIHBhcmFtZXRlci4KKyAqIEBwYXJhbSAgcENhbGxiYWNrICAgICAgICAgICAgcG9pbnRlciB0byBwcml2YXRlIGNhbGxiYWNzayBmdW5jdGlvbiB3aGljaCBoYXMKKyAqIHBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgYXMgcGFyYW1ldGVyLgorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9ETUFfUmVnaXN0ZXJDYWxsYmFjaygKKyAgICBETUFfSGFuZGxlVHlwZURlZiAqaGRtYSwgSEFMX0RNQV9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELAorICAgIHZvaWQgKCpwQ2FsbGJhY2spKERNQV9IYW5kbGVUeXBlRGVmICpfaGRtYSkpIHsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGRtYSk7CisKKyAgaWYgKEhBTF9ETUFfU1RBVEVfUkVBRFkgPT0gaGRtYS0+U3RhdGUpIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpIHsKKyAgICAgIGNhc2UgSEFMX0RNQV9YRkVSX0NQTFRfQ0JfSUQ6CisgICAgICAgIGhkbWEtPlhmZXJDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9ETUFfWEZFUl9IQUxGQ1BMVF9DQl9JRDoKKyAgICAgICAgaGRtYS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9ETUFfWEZFUl9FUlJPUl9DQl9JRDoKKyAgICAgICAgaGRtYS0+WGZlckVycm9yQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9ETUFfWEZFUl9BQk9SVF9DQl9JRDoKKyAgICAgICAgaGRtYS0+WGZlckFib3J0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhkbWEpOworCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogQGJyaWVmICBVblJlZ2lzdGVyIGNhbGxiYWNrcworICogQHBhcmFtICBoZG1hICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQKKyAqIGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBDaGFubmVsLgorICogQHBhcmFtICBDYWxsYmFja0lEICAgICAgICAgICBVc2VyIENhbGxiYWNrIGlkZW50aWZpZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgSEFMX0RNQV9DYWxsYmFja0lEVHlwZURlZiBFTlVNIGFzIHBhcmFtZXRlci4KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BX1VuUmVnaXN0ZXJDYWxsYmFjaygKKyAgICBETUFfSGFuZGxlVHlwZURlZiAqaGRtYSwgSEFMX0RNQV9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKSB7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhkbWEpOworCisgIGlmIChIQUxfRE1BX1NUQVRFX1JFQURZID09IGhkbWEtPlN0YXRlKSB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKSB7CisgICAgICBjYXNlIEhBTF9ETUFfWEZFUl9DUExUX0NCX0lEOgorICAgICAgICBoZG1hLT5YZmVyQ3BsdENhbGxiYWNrID0gTlVMTDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0RNQV9YRkVSX0hBTEZDUExUX0NCX0lEOgorICAgICAgICBoZG1hLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IE5VTEw7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9ETUFfWEZFUl9FUlJPUl9DQl9JRDoKKyAgICAgICAgaGRtYS0+WGZlckVycm9yQ2FsbGJhY2sgPSBOVUxMOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfRE1BX1hGRVJfQUJPUlRfQ0JfSUQ6CisgICAgICAgIGhkbWEtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0RNQV9YRkVSX0FMTF9DQl9JRDoKKyAgICAgICAgaGRtYS0+WGZlckNwbHRDYWxsYmFjayA9IE5VTEw7CisgICAgICAgIGhkbWEtPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gTlVMTDsKKyAgICAgICAgaGRtYS0+WGZlckVycm9yQ2FsbGJhY2sgPSBOVUxMOworICAgICAgICBoZG1hLT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhkbWEpOworCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIERNQV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9ycworZnVuY3Rpb25zCisgICogIEBicmllZiAgICBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvcnMgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9ycyBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG8KKyAgICAgICgrKSBDaGVjayB0aGUgRE1BIHN0YXRlCisgICAgICAoKykgR2V0IGVycm9yIGNvZGUKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgKiBAYnJpZWYgIFJldHVybiB0aGUgRE1BIGhhbmRlIHN0YXRlLgorICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgQ2hhbm5lbC4KKyAqIEByZXR2YWwgSEFMIHN0YXRlCisgKi8KK0hBTF9ETUFfU3RhdGVUeXBlRGVmIEhBTF9ETUFfR2V0U3RhdGUoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpIHsKKyAgLyogUmV0dXJuIERNQSBoYW5kbGUgc3RhdGUgKi8KKyAgcmV0dXJuIGhkbWEtPlN0YXRlOworfQorCisvKioKKyAqIEBicmllZiAgUmV0dXJuIHRoZSBETUEgZXJyb3IgY29kZS4KKyAqIEBwYXJhbSAgaGRtYSA6IHBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICogICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBDaGFubmVsLgorICogQHJldHZhbCBETUEgRXJyb3IgQ29kZQorICovCit1aW50MzJfdCBIQUxfRE1BX0dldEVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKSB7IHJldHVybiBoZG1hLT5FcnJvckNvZGU7IH0KKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisvKiogQGFkZHRvZ3JvdXAgRE1BX1ByaXZhdGVfRnVuY3Rpb25zCisgKiBAeworICovCisKKy8qKgorICogQGJyaWVmICBTZXRzIHRoZSBETUEgVHJhbnNmZXIgcGFyYW1ldGVyLgorICogQHBhcmFtICBoZG1hICAgICAgIHBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICogICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEKKyAqIENoYW5uZWwuCisgKiBAcGFyYW0gIFNyY0FkZHJlc3MgVGhlIHNvdXJjZSBtZW1vcnkgQnVmZmVyIGFkZHJlc3MKKyAqIEBwYXJhbSAgRHN0QWRkcmVzcyBUaGUgZGVzdGluYXRpb24gbWVtb3J5IEJ1ZmZlciBhZGRyZXNzCisgKiBAcGFyYW0gIERhdGFMZW5ndGggVGhlIGxlbmd0aCBvZiBkYXRhIHRvIGJlIHRyYW5zZmVycmVkIGZyb20gc291cmNlIHRvCisgKiBkZXN0aW5hdGlvbgorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK3N0YXRpYyB2b2lkIERNQV9TZXRDb25maWcoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEsIHVpbnQzMl90IFNyY0FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IERzdEFkZHJlc3MsIHVpbnQzMl90IERhdGFMZW5ndGgpIHsKKyAgLyogQ2xlYXIgdGhlIERNQU1VWCBzeW5jaHJvIG92ZXJydW4gZmxhZyAqLworICBoZG1hLT5ETUFtdXhDaGFubmVsU3RhdHVzLT5DRlIgPSBoZG1hLT5ETUFtdXhDaGFubmVsU3RhdHVzTWFzazsKKworICBpZiAoaGRtYS0+RE1BbXV4UmVxdWVzdEdlbiAhPSAwVSkgeworICAgIC8qIENsZWFyIHRoZSBETUFNVVggcmVxdWVzdCBnZW5lcmF0b3Igb3ZlcnJ1biBmbGFnICovCisgICAgaGRtYS0+RE1BbXV4UmVxdWVzdEdlblN0YXR1cy0+UkdDRlIgPSBoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuU3RhdHVzTWFzazsKKyAgfQorCisgIC8qIENsZWFyIGFsbCBmbGFncyAqLworICBoZG1hLT5EbWFCYXNlQWRkcmVzcy0+SUZDUiA9IChETUFfSVNSX0dJRjEgPDwgKGhkbWEtPkNoYW5uZWxJbmRleCAmIDB4MUZVKSk7CisKKyAgLyogQ29uZmlndXJlIERNQSBDaGFubmVsIGRhdGEgbGVuZ3RoICovCisgIGhkbWEtPkluc3RhbmNlLT5DTkRUUiA9IERhdGFMZW5ndGg7CisKKyAgLyogTWVtb3J5IHRvIFBlcmlwaGVyYWwgKi8KKyAgaWYgKChoZG1hLT5Jbml0LkRpcmVjdGlvbikgPT0gRE1BX01FTU9SWV9UT19QRVJJUEgpIHsKKyAgICAvKiBDb25maWd1cmUgRE1BIENoYW5uZWwgZGVzdGluYXRpb24gYWRkcmVzcyAqLworICAgIGhkbWEtPkluc3RhbmNlLT5DUEFSID0gRHN0QWRkcmVzczsKKworICAgIC8qIENvbmZpZ3VyZSBETUEgQ2hhbm5lbCBzb3VyY2UgYWRkcmVzcyAqLworICAgIGhkbWEtPkluc3RhbmNlLT5DTUFSID0gU3JjQWRkcmVzczsKKyAgfQorICAvKiBQZXJpcGhlcmFsIHRvIE1lbW9yeSAqLworICBlbHNlIHsKKyAgICAvKiBDb25maWd1cmUgRE1BIENoYW5uZWwgc291cmNlIGFkZHJlc3MgKi8KKyAgICBoZG1hLT5JbnN0YW5jZS0+Q1BBUiA9IFNyY0FkZHJlc3M7CisKKyAgICAvKiBDb25maWd1cmUgRE1BIENoYW5uZWwgZGVzdGluYXRpb24gYWRkcmVzcyAqLworICAgIGhkbWEtPkluc3RhbmNlLT5DTUFSID0gRHN0QWRkcmVzczsKKyAgfQorfQorCisvKioKKyAqIEBicmllZiAgVXBkYXRlcyB0aGUgRE1BIGhhbmRsZSB3aXRoIHRoZSBETUFNVVggIGNoYW5uZWwgYW5kIHN0YXR1cyBtYXNrCisgKiBkZXBlbmRpbmcgb24gc3RyZWFtIG51bWJlcgorICogQHBhcmFtICBoZG1hICAgICAgICBwb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAqICAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BCisgKiBTdHJlYW0uCisgKiBAcmV0dmFsIE5vbmUKKyAqLworc3RhdGljIHZvaWQgRE1BX0NhbGNETUFNVVhDaGFubmVsQmFzZUFuZE1hc2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpIHsKKyAgdWludDMyX3QgZG1hbXV4X2Jhc2VfYWRkcjsKKyAgdWludDMyX3QgY2hhbm5lbF9udW1iZXI7CisgIERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWDFfQ2hhbm5lbEJhc2U7CisKKyAgLyogY2hlY2sgaWYgaW5zdGFuY2UgaXMgbm90IG91dHNpZGUgdGhlIERNQSBjaGFubmVsIHJhbmdlICovCisgIGlmICgodWludDMyX3QpaGRtYS0+SW5zdGFuY2UgPCAodWludDMyX3QpRE1BMl9DaGFubmVsMSkgeworICAgIC8qIERNQTEgKi8KKyAgICBETUFNVVgxX0NoYW5uZWxCYXNlID0gRE1BTVVYMV9DaGFubmVsMDsKKyAgfSBlbHNlIHsKKyAgICAvKiBETUEyICovCisjaWYgZGVmaW5lZChTVE0zMkc0NzF4eCkgfHwgZGVmaW5lZChTVE0zMkc0NzN4eCkgfHwgZGVmaW5lZChTVE0zMkc0NzR4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJHNDE0eHgpIHx8IGRlZmluZWQoU1RNMzJHNDgzeHgpIHx8IGRlZmluZWQoU1RNMzJHNDg0eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRzQ5MXh4KSB8fCBkZWZpbmVkKFNUTTMyRzRBMXh4KSB8fCBkZWZpbmVkKFNUTTMyRzQxMXhDKQorICAgIERNQU1VWDFfQ2hhbm5lbEJhc2UgPSBETUFNVVgxX0NoYW5uZWw4OworI2VsaWYgZGVmaW5lZChTVE0zMkc0MTF4QikgfHwgZGVmaW5lZChTVE0zMkc0MzF4eCkgfHwgZGVmaW5lZChTVE0zMkc0NDF4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJHQksxQ0IpCisgICAgRE1BTVVYMV9DaGFubmVsQmFzZSA9IERNQU1VWDFfQ2hhbm5lbDY7CisjZWxzZQorICAgIERNQU1VWDFfQ2hhbm5lbEJhc2UgPSBETUFNVVgxX0NoYW5uZWw3OworI2VuZGlmIC8qIFNUTTMyRzR4MXh4KSAqLworICB9CisgIGRtYW11eF9iYXNlX2FkZHIgPSAodWludDMyX3QpRE1BTVVYMV9DaGFubmVsQmFzZTsKKyAgY2hhbm5lbF9udW1iZXIgPSAoKCh1aW50MzJfdCloZG1hLT5JbnN0YW5jZSAmIDB4RkZVKSAtIDhVKSAvIDIwVTsKKyAgaGRtYS0+RE1BbXV4Q2hhbm5lbCA9CisgICAgICAoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqKSh1aW50MzJfdCkoZG1hbXV4X2Jhc2VfYWRkciArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChoZG1hLT5DaGFubmVsSW5kZXggPj4gMlUpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClETUFNVVgxX0NoYW5uZWwxIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdClETUFNVVgxX0NoYW5uZWwwKSkpOworICBoZG1hLT5ETUFtdXhDaGFubmVsU3RhdHVzID0gRE1BTVVYMV9DaGFubmVsU3RhdHVzOworICBoZG1hLT5ETUFtdXhDaGFubmVsU3RhdHVzTWFzayA9IDFVTCA8PCAoY2hhbm5lbF9udW1iZXIgJiAweDFGVSk7Cit9CisKKy8qKgorICogQGJyaWVmICBVcGRhdGVzIHRoZSBETUEgaGFuZGxlIHdpdGggdGhlIERNQU1VWCAgcmVxdWVzdCBnZW5lcmF0b3IgcGFyYW1zCisgKiBAcGFyYW0gIGhkbWEgICAgICAgIHBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICogICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEKKyAqIENoYW5uZWwuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworCitzdGF0aWMgdm9pZCBETUFfQ2FsY0RNQU1VWFJlcXVlc3RHZW5CYXNlQW5kTWFzayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkgeworICB1aW50MzJfdCByZXF1ZXN0ID0gaGRtYS0+SW5pdC5SZXF1ZXN0ICYgRE1BTVVYX0N4Q1JfRE1BUkVRX0lEOworCisgIC8qIERNQSBDaGFubmVscyBhcmUgY29ubmVjdGVkIHRvIERNQU1VWDEgcmVxdWVzdCBnZW5lcmF0b3IgYmxvY2tzKi8KKyAgaGRtYS0+RE1BbXV4UmVxdWVzdEdlbiA9IChETUFNVVhfUmVxdWVzdEdlbl9UeXBlRGVmICopKCgKKyAgICAgIHVpbnQzMl90KSgoKHVpbnQzMl90KURNQU1VWDFfUmVxdWVzdEdlbmVyYXRvcjApICsgKChyZXF1ZXN0IC0gMVUpICogNFUpKSk7CisKKyAgaGRtYS0+RE1BbXV4UmVxdWVzdEdlblN0YXR1cyA9IERNQU1VWDFfUmVxdWVzdEdlblN0YXR1czsKKworICBoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuU3RhdHVzTWFzayA9IDFVTCA8PCAoKHJlcXVlc3QgLSAxVSkgJiAweDFGVSk7Cit9CisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworI2VuZGlmIC8qIEhBTF9ETUFfTU9EVUxFX0VOQUJMRUQgKi8KKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KZGlmZiAtLWdpdCBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9kbWFfZXguYyBiL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9kbWFfZXguYwppbmRleCBlNmFhN2NhLi40NGExYWMwIDEwMDY0NAotLS0gYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfZG1hX2V4LmMKKysrIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX2RtYV9leC5jCkBAIC0xLDMwMCArMSwzMDAgQEAKLS8qKg0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICAqIEBmaWxlICAgIHN0bTMyZzR4eF9oYWxfZG1hX2V4LmMNCi0gICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0NCi0gICogQGJyaWVmICAgRE1BIEV4dGVuc2lvbiBIQUwgbW9kdWxlIGRyaXZlcg0KLSAgKiAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcNCi0gICogICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIERNQSBFeHRlbnNpb24gcGVyaXBoZXJhbDoNCi0gICogICAgICAgICAgICsgRXh0ZW5kZWQgZmVhdHVyZXMgZnVuY3Rpb25zDQotICAqDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICogQGF0dGVudGlvbg0KLSAgKg0KLSAgKiBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLg0KLSAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KLSAgKg0KLSAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRlcm1zIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUNCi0gICogaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc29mdHdhcmUgY29tcG9uZW50Lg0KLSAgKiBJZiBubyBMSUNFTlNFIGZpbGUgY29tZXMgd2l0aCB0aGlzIHNvZnR3YXJlLCBpdCBpcyBwcm92aWRlZCBBUy1JUy4NCi0gICoNCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgQHZlcmJhdGltDQotICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjDQotICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gIFsuLl0NCi0gIFRoZSBETUEgRXh0ZW5zaW9uIEhBTCBkcml2ZXIgY2FuIGJlIHVzZWQgYXMgZm9sbG93czoNCi0NCi0gICAoKykgQ29uZmlndXJlIHRoZSBETUFfTVVYIFN5bmNocm9uaXphdGlvbiBCbG9jayB1c2luZyBIQUxfRE1BRXhfQ29uZmlnTXV4U3luYw0KLSAgZnVuY3Rpb24uDQotICAgKCspIENvbmZpZ3VyZSB0aGUgRE1BX01VWCBSZXF1ZXN0IEdlbmVyYXRvciBCbG9jayB1c2luZw0KLSAgSEFMX0RNQUV4X0NvbmZpZ011eFJlcXVlc3RHZW5lcmF0b3IgZnVuY3Rpb24uIEZ1bmN0aW9ucw0KLSAgSEFMX0RNQUV4X0VuYWJsZU11eFJlcXVlc3RHZW5lcmF0b3IgYW5kIEhBTF9ETUFFeF9EaXNhYmxlTXV4UmVxdWVzdEdlbmVyYXRvcg0KLSAgY2FuIHRoZW4gYmUgdXNlZCB0byByZXNwZWN0aXZlbHkgZW5hYmxlL2Rpc2FibGUgdGhlIHJlcXVlc3QgZ2VuZXJhdG9yLg0KLQ0KLSAgICgrKSBUbyBoYW5kbGUgdGhlIERNQU1VWCBJbnRlcnJ1cHRzLCB0aGUgZnVuY3Rpb24gIEhBTF9ETUFFeF9NVVhfSVJRSGFuZGxlcg0KLSAgc2hvdWxkIGJlIGNhbGxlZCBmcm9tIHRoZSBETUFNVVggSVJRIGhhbmRsZXIgaS5lIERNQU1VWDFfT1ZSX0lSUUhhbmRsZXIuIEFzDQotICBvbmx5IG9uZSBpbnRlcnJ1cHQgbGluZSBpcyBhdmFpbGFibGUgZm9yIGFsbCBETUFNVVggY2hhbm5lbHMgYW5kIHJlcXVlc3QNCi0gIGdlbmVyYXRvcnMgLCBIQUxfRE1BRXhfTVVYX0lSUUhhbmRsZXIgc2hvdWxkIGJlIGNhbGxlZCB3aXRoLCBhcyBwYXJhbWV0ZXIsIHRoZQ0KLSAgYXBwcm9wcmlhdGUgRE1BIGhhbmRsZSBhcyBtYW55IGFzIHVzZWQgRE1BcyBpbiB0aGUgdXNlciBwcm9qZWN0IChleGNlcHRpb24NCi0gIGRvbmUgaWYgYSBnaXZlbiBETUEgaXMgbm90IHVzaW5nIHRoZSBETUFNVVggU1lOQyBibG9jayBuZWl0aGVyIGEgcmVxdWVzdA0KLSAgZ2VuZXJhdG9yKQ0KLQ0KLSAgQGVuZHZlcmJhdGltDQotICAqLw0KLQ0KLS8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotI2luY2x1ZGUgInN0bTMyZzR4eF9oYWwuaCINCi0NCi0vKiogQGFkZHRvZ3JvdXAgU1RNMzJHNHh4X0hBTF9Ecml2ZXINCi0gKiBAew0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRE1BRXggRE1BRXgNCi0gKiBAYnJpZWYgRE1BIEV4dGVuZGVkIEhBTCBtb2R1bGUgZHJpdmVyDQotICogQHsNCi0gKi8NCi0NCi0jaWZkZWYgSEFMX0RNQV9NT0RVTEVfRU5BQkxFRA0KLQ0KLS8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogUHJpdmF0ZSBDb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qIFByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotDQotLyoqIEBkZWZncm91cCBETUFFeF9FeHBvcnRlZF9GdW5jdGlvbnMgRE1BRXggRXhwb3J0ZWQgRnVuY3Rpb25zDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIERNQUV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgRE1BRXggRXh0ZW5kZWQgZmVhdHVyZXMgZnVuY3Rpb25zDQotICAqICBAYnJpZWYgICBFeHRlbmRlZCBmZWF0dXJlcyBmdW5jdGlvbnMNCi0gICoNCi1AdmVyYmF0aW0NCi0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICAgICAgICAgICAgICAjIyMjIyAgRXh0ZW5kZWQgZmVhdHVyZXMgZnVuY3Rpb25zICAjIyMjIw0KLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86DQotDQotICAgICgrKSBDb25maWd1cmUgdGhlIERNQU1VWCBTeW5jaHJvbml6YXRpb24gQmxvY2sgdXNpbmcgSEFMX0RNQUV4X0NvbmZpZ011eFN5bmMNCi1mdW5jdGlvbi4NCi0gICAgKCspIENvbmZpZ3VyZSB0aGUgRE1BTVVYIFJlcXVlc3QgR2VuZXJhdG9yIEJsb2NrIHVzaW5nDQotSEFMX0RNQUV4X0NvbmZpZ011eFJlcXVlc3RHZW5lcmF0b3IgZnVuY3Rpb24uIEZ1bmN0aW9ucw0KLUhBTF9ETUFFeF9FbmFibGVNdXhSZXF1ZXN0R2VuZXJhdG9yIGFuZCBIQUxfRE1BRXhfRGlzYWJsZU11eFJlcXVlc3RHZW5lcmF0b3IgY2FuDQotdGhlbiBiZSB1c2VkIHRvIHJlc3BlY3RpdmVseSBlbmFibGUvZGlzYWJsZSB0aGUgcmVxdWVzdCBnZW5lcmF0b3IuDQotDQotQGVuZHZlcmJhdGltDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBETUFNVVggc3luY2hyb25pemF0aW9uIHBhcmFtZXRlcnMgZm9yIGEgZ2l2ZW4gRE1BDQotICogY2hhbm5lbCAoaW5zdGFuY2UpLg0KLSAqIEBwYXJhbSAgaGRtYTogICAgICAgcG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQotICogICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUENCi0gKiBjaGFubmVsLg0KLSAqIEBwYXJhbSAgcFN5bmNDb25maWcgOiBwb2ludGVyIHRvIEhBTF9ETUFfTXV4U3luY0NvbmZpZ1R5cGVEZWYgOiBjb250YWlucyB0aGUNCi0gKiBETUFNVVggc3luY2hyb25pemF0aW9uIHBhcmFtZXRlcnMNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BRXhfQ29uZmlnTXV4U3luYygNCi0gICAgRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEsIEhBTF9ETUFfTXV4U3luY0NvbmZpZ1R5cGVEZWYgKnBTeW5jQ29uZmlnKSB7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0RNQV9BTExfSU5TVEFOQ0UoaGRtYS0+SW5zdGFuY2UpKTsNCi0NCi0gIGFzc2VydF9wYXJhbShJU19ETUFNVVhfU1lOQ19TSUdOQUxfSUQocFN5bmNDb25maWctPlN5bmNTaWduYWxJRCkpOw0KLQ0KLSAgYXNzZXJ0X3BhcmFtKElTX0RNQU1VWF9TWU5DX1BPTEFSSVRZKHBTeW5jQ29uZmlnLT5TeW5jUG9sYXJpdHkpKTsNCi0gIGFzc2VydF9wYXJhbShJU19ETUFNVVhfU1lOQ19TVEFURShwU3luY0NvbmZpZy0+U3luY0VuYWJsZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0RNQU1VWF9TWU5DX0VWRU5UKHBTeW5jQ29uZmlnLT5FdmVudEVuYWJsZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0RNQU1VWF9TWU5DX1JFUVVFU1RfTlVNQkVSKHBTeW5jQ29uZmlnLT5SZXF1ZXN0TnVtYmVyKSk7DQotDQotICAvKkNoZWNrIGlmIHRoZSBETUEgc3RhdGUgaXMgcmVhZHkgKi8NCi0gIGlmIChoZG1hLT5TdGF0ZSA9PSBIQUxfRE1BX1NUQVRFX1JFQURZKSB7DQotICAgIC8qIFByb2Nlc3MgTG9ja2VkICovDQotICAgIF9fSEFMX0xPQ0soaGRtYSk7DQotDQotICAgIC8qIFNldCB0aGUgbmV3IHN5bmNocm9uaXphdGlvbiBwYXJhbWV0ZXJzIChhbmQga2VlcCB0aGUgcmVxdWVzdCBJRCBmaWxsZWQNCi0gICAgICogZHVyaW5nIHRoZSBJbml0KSovDQotICAgIE1PRElGWV9SRUcoDQotICAgICAgICBoZG1hLT5ETUFtdXhDaGFubmVsLT5DQ1IsICh+RE1BTVVYX0N4Q1JfRE1BUkVRX0lEKSwNCi0gICAgICAgICgocFN5bmNDb25maWctPlN5bmNTaWduYWxJRCkgPDwgRE1BTVVYX0N4Q1JfU1lOQ19JRF9Qb3MpIHwNCi0gICAgICAgICAgICAoKHBTeW5jQ29uZmlnLT5SZXF1ZXN0TnVtYmVyIC0gMVUpIDw8IERNQU1VWF9DeENSX05CUkVRX1BvcykgfA0KLSAgICAgICAgICAgIHBTeW5jQ29uZmlnLT5TeW5jUG9sYXJpdHkgfA0KLSAgICAgICAgICAgICgodWludDMyX3QpcFN5bmNDb25maWctPlN5bmNFbmFibGUgPDwgRE1BTVVYX0N4Q1JfU0VfUG9zKSB8DQotICAgICAgICAgICAgKCh1aW50MzJfdClwU3luY0NvbmZpZy0+RXZlbnRFbmFibGUgPDwgRE1BTVVYX0N4Q1JfRUdFX1BvcykpOw0KLQ0KLSAgICAvKiBQcm9jZXNzIFVuTG9ja2VkICovDQotICAgIF9fSEFMX1VOTE9DSyhoZG1hKTsNCi0NCi0gICAgcmV0dXJuIEhBTF9PSzsNCi0gIH0gZWxzZSB7DQotICAgIC8qRE1BIFN0YXRlIG5vdCBSZWFkeSovDQotICAgIHJldHVybiBIQUxfRVJST1I7DQotICB9DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBETUFNVVggcmVxdWVzdCBnZW5lcmF0b3IgYmxvY2sgdXNlZCBieSB0aGUgZ2l2ZW4gRE1BDQotICogY2hhbm5lbCAoaW5zdGFuY2UpLg0KLSAqIEBwYXJhbSAgaGRtYTogICAgICAgcG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQotICogICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUENCi0gKiBjaGFubmVsLg0KLSAqIEBwYXJhbSAgcFJlcXVlc3RHZW5lcmF0b3JDb25maWcgOiBwb2ludGVyIHRvDQotICogSEFMX0RNQV9NdXhSZXF1ZXN0R2VuZXJhdG9yQ29uZmlnVHlwZURlZiA6IGNvbnRhaW5zIHRoZSByZXF1ZXN0IGdlbmVyYXRvcg0KLSAqIHBhcmFtZXRlcnMuDQotICoNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BRXhfQ29uZmlnTXV4UmVxdWVzdEdlbmVyYXRvcigNCi0gICAgRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEsDQotICAgIEhBTF9ETUFfTXV4UmVxdWVzdEdlbmVyYXRvckNvbmZpZ1R5cGVEZWYgKnBSZXF1ZXN0R2VuZXJhdG9yQ29uZmlnKSB7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0RNQV9BTExfSU5TVEFOQ0UoaGRtYS0+SW5zdGFuY2UpKTsNCi0NCi0gIGFzc2VydF9wYXJhbSgNCi0gICAgICBJU19ETUFNVVhfUkVRVUVTVF9HRU5fU0lHTkFMX0lEKHBSZXF1ZXN0R2VuZXJhdG9yQ29uZmlnLT5TaWduYWxJRCkpOw0KLQ0KLSAgYXNzZXJ0X3BhcmFtKA0KLSAgICAgIElTX0RNQU1VWF9SRVFVRVNUX0dFTl9QT0xBUklUWShwUmVxdWVzdEdlbmVyYXRvckNvbmZpZy0+UG9sYXJpdHkpKTsNCi0gIGFzc2VydF9wYXJhbShJU19ETUFNVVhfUkVRVUVTVF9HRU5fUkVRVUVTVF9OVU1CRVIoDQotICAgICAgcFJlcXVlc3RHZW5lcmF0b3JDb25maWctPlJlcXVlc3ROdW1iZXIpKTsNCi0NCi0gIC8qIGNoZWNrIGlmIHRoZSBETUEgc3RhdGUgaXMgcmVhZHkNCi0gICAgIGFuZCBETUEgaXMgdXNpbmcgYSBETUFNVVggcmVxdWVzdCBnZW5lcmF0b3IgYmxvY2sNCi0gICovDQotICBpZiAoKGhkbWEtPlN0YXRlID09IEhBTF9ETUFfU1RBVEVfUkVBRFkpICYmIChoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuICE9IDBVKSkgew0KLSAgICAvKiBQcm9jZXNzIExvY2tlZCAqLw0KLSAgICBfX0hBTF9MT0NLKGhkbWEpOw0KLQ0KLSAgICAvKiBTZXQgdGhlIHJlcXVlc3QgZ2VuZXJhdG9yIG5ldyBwYXJhbWV0ZXJzICovDQotICAgIGhkbWEtPkRNQW11eFJlcXVlc3RHZW4tPlJHQ1IgPQ0KLSAgICAgICAgcFJlcXVlc3RHZW5lcmF0b3JDb25maWctPlNpZ25hbElEIHwNCi0gICAgICAgICgocFJlcXVlc3RHZW5lcmF0b3JDb25maWctPlJlcXVlc3ROdW1iZXIgLSAxVSkNCi0gICAgICAgICA8PCAoUE9TSVRJT05fVkFMKERNQU1VWF9SR3hDUl9HTkJSRVEpICYgMHgxRlUpKSB8DQotICAgICAgICBwUmVxdWVzdEdlbmVyYXRvckNvbmZpZy0+UG9sYXJpdHk7DQotICAgIC8qIFByb2Nlc3MgVW5Mb2NrZWQgKi8NCi0gICAgX19IQUxfVU5MT0NLKGhkbWEpOw0KLQ0KLSAgICByZXR1cm4gSEFMX09LOw0KLSAgfSBlbHNlIHsNCi0gICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gIH0NCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgdGhlIERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvciBibG9jayB1c2VkIGJ5IHRoZSBnaXZlbiBETUENCi0gKiBjaGFubmVsIChpbnN0YW5jZSkuDQotICogQHBhcmFtICBoZG1hOiAgICAgICBwb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCi0gKiAgICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQQ0KLSAqIGNoYW5uZWwuDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RNQUV4X0VuYWJsZU11eFJlcXVlc3RHZW5lcmF0b3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpIHsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfRE1BX0FMTF9JTlNUQU5DRShoZG1hLT5JbnN0YW5jZSkpOw0KLQ0KLSAgLyogY2hlY2sgaWYgdGhlIERNQSBzdGF0ZSBpcyByZWFkeQ0KLSAgICAgYW5kIERNQSBpcyB1c2luZyBhIERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvciBibG9jaw0KLSAgKi8NCi0gIGlmICgoaGRtYS0+U3RhdGUgIT0gSEFMX0RNQV9TVEFURV9SRVNFVCkgJiYgKGhkbWEtPkRNQW11eFJlcXVlc3RHZW4gIT0gMCkpIHsNCi0gICAgLyogRW5hYmxlIHRoZSByZXF1ZXN0IGdlbmVyYXRvciovDQotICAgIGhkbWEtPkRNQW11eFJlcXVlc3RHZW4tPlJHQ1IgfD0gRE1BTVVYX1JHeENSX0dFOw0KLQ0KLSAgICByZXR1cm4gSEFMX09LOw0KLSAgfSBlbHNlIHsNCi0gICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gIH0NCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIHRoZSBETUFNVVggcmVxdWVzdCBnZW5lcmF0b3IgYmxvY2sgdXNlZCBieSB0aGUgZ2l2ZW4gRE1BDQotICogY2hhbm5lbCAoaW5zdGFuY2UpLg0KLSAqIEBwYXJhbSAgaGRtYTogICAgICAgcG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQotICogICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUENCi0gKiBjaGFubmVsLg0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9ETUFFeF9EaXNhYmxlTXV4UmVxdWVzdEdlbmVyYXRvcigNCi0gICAgRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpIHsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfRE1BX0FMTF9JTlNUQU5DRShoZG1hLT5JbnN0YW5jZSkpOw0KLQ0KLSAgLyogY2hlY2sgaWYgdGhlIERNQSBzdGF0ZSBpcyByZWFkeQ0KLSAgICAgYW5kIERNQSBpcyB1c2luZyBhIERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvciBibG9jaw0KLSAgKi8NCi0gIGlmICgoaGRtYS0+U3RhdGUgIT0gSEFMX0RNQV9TVEFURV9SRVNFVCkgJiYgKGhkbWEtPkRNQW11eFJlcXVlc3RHZW4gIT0gMCkpIHsNCi0gICAgLyogRGlzYWJsZSB0aGUgcmVxdWVzdCBnZW5lcmF0b3IqLw0KLSAgICBoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuLT5SR0NSICY9IH5ETUFNVVhfUkd4Q1JfR0U7DQotDQotICAgIHJldHVybiBIQUxfT0s7DQotICB9IGVsc2Ugew0KLSAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEhhbmRsZXMgRE1BTVVYIGludGVycnVwdCByZXF1ZXN0Lg0KLSAqIEBwYXJhbSAgaGRtYTogcG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQotICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgY2hhbm5lbC4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi12b2lkIEhBTF9ETUFFeF9NVVhfSVJRSGFuZGxlcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkgew0KLSAgLyogQ2hlY2sgZm9yIERNQU1VWCBTeW5jaHJvbml6YXRpb24gb3ZlcnJ1biAqLw0KLSAgaWYgKChoZG1hLT5ETUFtdXhDaGFubmVsU3RhdHVzLT5DU1IgJiBoZG1hLT5ETUFtdXhDaGFubmVsU3RhdHVzTWFzaykgIT0gMFUpIHsNCi0gICAgLyogRGlzYWJsZSB0aGUgc3luY2hybyBvdmVycnVuIGludGVycnVwdCAqLw0KLSAgICBoZG1hLT5ETUFtdXhDaGFubmVsLT5DQ1IgJj0gfkRNQU1VWF9DeENSX1NPSUU7DQotDQotICAgIC8qIENsZWFyIHRoZSBETUFNVVggc3luY2hybyBvdmVycnVuIGZsYWcgKi8NCi0gICAgaGRtYS0+RE1BbXV4Q2hhbm5lbFN0YXR1cy0+Q0ZSID0gaGRtYS0+RE1BbXV4Q2hhbm5lbFN0YXR1c01hc2s7DQotDQotICAgIC8qIFVwZGF0ZSBlcnJvciBjb2RlICovDQotICAgIGhkbWEtPkVycm9yQ29kZSB8PSBIQUxfRE1BX0VSUk9SX1NZTkM7DQotDQotICAgIGlmIChoZG1hLT5YZmVyRXJyb3JDYWxsYmFjayAhPSBOVUxMKSB7DQotICAgICAgLyogVHJhbnNmZXIgZXJyb3IgY2FsbGJhY2sgKi8NCi0gICAgICBoZG1hLT5YZmVyRXJyb3JDYWxsYmFjayhoZG1hKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgaWYgKGhkbWEtPkRNQW11eFJlcXVlc3RHZW4gIT0gMCkgew0KLSAgICAvKiBpZiB1c2luZyBhIERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvciBibG9jayBDaGVjayBmb3IgRE1BTVVYIHJlcXVlc3QNCi0gICAgICogZ2VuZXJhdG9yIG92ZXJydW4gKi8NCi0gICAgaWYgKChoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuU3RhdHVzLT5SR1NSICYNCi0gICAgICAgICBoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuU3RhdHVzTWFzaykgIT0gMFUpIHsNCi0gICAgICAvKiBEaXNhYmxlIHRoZSByZXF1ZXN0IGdlbiBvdmVycnVuIGludGVycnVwdCAqLw0KLSAgICAgIGhkbWEtPkRNQW11eFJlcXVlc3RHZW4tPlJHQ1IgJj0gfkRNQU1VWF9SR3hDUl9PSUU7DQotDQotICAgICAgLyogQ2xlYXIgdGhlIERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvciBvdmVycnVuIGZsYWcgKi8NCi0gICAgICBoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuU3RhdHVzLT5SR0NGUiA9IGhkbWEtPkRNQW11eFJlcXVlc3RHZW5TdGF0dXNNYXNrOw0KLQ0KLSAgICAgIC8qIFVwZGF0ZSBlcnJvciBjb2RlICovDQotICAgICAgaGRtYS0+RXJyb3JDb2RlIHw9IEhBTF9ETUFfRVJST1JfUkVRR0VOOw0KLQ0KLSAgICAgIGlmIChoZG1hLT5YZmVyRXJyb3JDYWxsYmFjayAhPSBOVUxMKSB7DQotICAgICAgICAvKiBUcmFuc2ZlciBlcnJvciBjYWxsYmFjayAqLw0KLSAgICAgICAgaGRtYS0+WGZlckVycm9yQ2FsbGJhY2soaGRtYSk7DQotICAgICAgfQ0KLSAgICB9DQotICB9DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0jZW5kaWYgLyogSEFMX0RNQV9NT0RVTEVfRU5BQkxFRCAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnNHh4X2hhbF9kbWFfZXguYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgRE1BIEV4dGVuc2lvbiBIQUwgbW9kdWxlIGRyaXZlcgorICAqICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBETUEgRXh0ZW5zaW9uIHBlcmlwaGVyYWw6CisgICogICAgICAgICAgICsgRXh0ZW5kZWQgZmVhdHVyZXMgZnVuY3Rpb25zCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0ZXJtcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlCisgICogaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc29mdHdhcmUgY29tcG9uZW50LgorICAqIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcyB3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICBAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgIFRoZSBETUEgRXh0ZW5zaW9uIEhBTCBkcml2ZXIgY2FuIGJlIHVzZWQgYXMgZm9sbG93czoKKworICAgKCspIENvbmZpZ3VyZSB0aGUgRE1BX01VWCBTeW5jaHJvbml6YXRpb24gQmxvY2sgdXNpbmcgSEFMX0RNQUV4X0NvbmZpZ011eFN5bmMKKyAgZnVuY3Rpb24uCisgICAoKykgQ29uZmlndXJlIHRoZSBETUFfTVVYIFJlcXVlc3QgR2VuZXJhdG9yIEJsb2NrIHVzaW5nCisgIEhBTF9ETUFFeF9Db25maWdNdXhSZXF1ZXN0R2VuZXJhdG9yIGZ1bmN0aW9uLiBGdW5jdGlvbnMKKyAgSEFMX0RNQUV4X0VuYWJsZU11eFJlcXVlc3RHZW5lcmF0b3IgYW5kIEhBTF9ETUFFeF9EaXNhYmxlTXV4UmVxdWVzdEdlbmVyYXRvcgorICBjYW4gdGhlbiBiZSB1c2VkIHRvIHJlc3BlY3RpdmVseSBlbmFibGUvZGlzYWJsZSB0aGUgcmVxdWVzdCBnZW5lcmF0b3IuCisKKyAgICgrKSBUbyBoYW5kbGUgdGhlIERNQU1VWCBJbnRlcnJ1cHRzLCB0aGUgZnVuY3Rpb24gIEhBTF9ETUFFeF9NVVhfSVJRSGFuZGxlcgorICBzaG91bGQgYmUgY2FsbGVkIGZyb20gdGhlIERNQU1VWCBJUlEgaGFuZGxlciBpLmUgRE1BTVVYMV9PVlJfSVJRSGFuZGxlci4gQXMKKyAgb25seSBvbmUgaW50ZXJydXB0IGxpbmUgaXMgYXZhaWxhYmxlIGZvciBhbGwgRE1BTVVYIGNoYW5uZWxzIGFuZCByZXF1ZXN0CisgIGdlbmVyYXRvcnMgLCBIQUxfRE1BRXhfTVVYX0lSUUhhbmRsZXIgc2hvdWxkIGJlIGNhbGxlZCB3aXRoLCBhcyBwYXJhbWV0ZXIsIHRoZQorICBhcHByb3ByaWF0ZSBETUEgaGFuZGxlIGFzIG1hbnkgYXMgdXNlZCBETUFzIGluIHRoZSB1c2VyIHByb2plY3QgKGV4Y2VwdGlvbgorICBkb25lIGlmIGEgZ2l2ZW4gRE1BIGlzIG5vdCB1c2luZyB0aGUgRE1BTVVYIFNZTkMgYmxvY2sgbmVpdGhlciBhIHJlcXVlc3QKKyAgZ2VuZXJhdG9yKQorCisgIEBlbmR2ZXJiYXRpbQorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzR4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzR4eF9IQUxfRHJpdmVyCisgKiBAeworICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BRXggRE1BRXgKKyAqIEBicmllZiBETUEgRXh0ZW5kZWQgSEFMIG1vZHVsZSBkcml2ZXIKKyAqIEB7CisgKi8KKworI2lmZGVmIEhBTF9ETUFfTU9EVUxFX0VOQUJMRUQKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgQ29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBETUFFeF9FeHBvcnRlZF9GdW5jdGlvbnMgRE1BRXggRXhwb3J0ZWQgRnVuY3Rpb25zCisgKiBAeworICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBETUFFeCBFeHRlbmRlZCBmZWF0dXJlcyBmdW5jdGlvbnMKKyAgKiAgQGJyaWVmICAgRXh0ZW5kZWQgZmVhdHVyZXMgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAjIyMjIyAgRXh0ZW5kZWQgZmVhdHVyZXMgZnVuY3Rpb25zICAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorCisgICAgKCspIENvbmZpZ3VyZSB0aGUgRE1BTVVYIFN5bmNocm9uaXphdGlvbiBCbG9jayB1c2luZyBIQUxfRE1BRXhfQ29uZmlnTXV4U3luYworZnVuY3Rpb24uCisgICAgKCspIENvbmZpZ3VyZSB0aGUgRE1BTVVYIFJlcXVlc3QgR2VuZXJhdG9yIEJsb2NrIHVzaW5nCitIQUxfRE1BRXhfQ29uZmlnTXV4UmVxdWVzdEdlbmVyYXRvciBmdW5jdGlvbi4gRnVuY3Rpb25zCitIQUxfRE1BRXhfRW5hYmxlTXV4UmVxdWVzdEdlbmVyYXRvciBhbmQgSEFMX0RNQUV4X0Rpc2FibGVNdXhSZXF1ZXN0R2VuZXJhdG9yIGNhbgordGhlbiBiZSB1c2VkIHRvIHJlc3BlY3RpdmVseSBlbmFibGUvZGlzYWJsZSB0aGUgcmVxdWVzdCBnZW5lcmF0b3IuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICogQGJyaWVmICBDb25maWd1cmUgdGhlIERNQU1VWCBzeW5jaHJvbml6YXRpb24gcGFyYW1ldGVycyBmb3IgYSBnaXZlbiBETUEKKyAqIGNoYW5uZWwgKGluc3RhbmNlKS4KKyAqIEBwYXJhbSAgaGRtYTogICAgICAgcG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQQorICogY2hhbm5lbC4KKyAqIEBwYXJhbSAgcFN5bmNDb25maWcgOiBwb2ludGVyIHRvIEhBTF9ETUFfTXV4U3luY0NvbmZpZ1R5cGVEZWYgOiBjb250YWlucyB0aGUKKyAqIERNQU1VWCBzeW5jaHJvbml6YXRpb24gcGFyYW1ldGVycworICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9ETUFFeF9Db25maWdNdXhTeW5jKAorICAgIERNQV9IYW5kbGVUeXBlRGVmICpoZG1hLCBIQUxfRE1BX011eFN5bmNDb25maWdUeXBlRGVmICpwU3luY0NvbmZpZykgeworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfRE1BX0FMTF9JTlNUQU5DRShoZG1hLT5JbnN0YW5jZSkpOworCisgIGFzc2VydF9wYXJhbShJU19ETUFNVVhfU1lOQ19TSUdOQUxfSUQocFN5bmNDb25maWctPlN5bmNTaWduYWxJRCkpOworCisgIGFzc2VydF9wYXJhbShJU19ETUFNVVhfU1lOQ19QT0xBUklUWShwU3luY0NvbmZpZy0+U3luY1BvbGFyaXR5KSk7CisgIGFzc2VydF9wYXJhbShJU19ETUFNVVhfU1lOQ19TVEFURShwU3luY0NvbmZpZy0+U3luY0VuYWJsZSkpOworICBhc3NlcnRfcGFyYW0oSVNfRE1BTVVYX1NZTkNfRVZFTlQocFN5bmNDb25maWctPkV2ZW50RW5hYmxlKSk7CisgIGFzc2VydF9wYXJhbShJU19ETUFNVVhfU1lOQ19SRVFVRVNUX05VTUJFUihwU3luY0NvbmZpZy0+UmVxdWVzdE51bWJlcikpOworCisgIC8qQ2hlY2sgaWYgdGhlIERNQSBzdGF0ZSBpcyByZWFkeSAqLworICBpZiAoaGRtYS0+U3RhdGUgPT0gSEFMX0RNQV9TVEFURV9SRUFEWSkgeworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoZG1hKTsKKworICAgIC8qIFNldCB0aGUgbmV3IHN5bmNocm9uaXphdGlvbiBwYXJhbWV0ZXJzIChhbmQga2VlcCB0aGUgcmVxdWVzdCBJRCBmaWxsZWQKKyAgICAgKiBkdXJpbmcgdGhlIEluaXQpKi8KKyAgICBNT0RJRllfUkVHKAorICAgICAgICBoZG1hLT5ETUFtdXhDaGFubmVsLT5DQ1IsICh+RE1BTVVYX0N4Q1JfRE1BUkVRX0lEKSwKKyAgICAgICAgKChwU3luY0NvbmZpZy0+U3luY1NpZ25hbElEKSA8PCBETUFNVVhfQ3hDUl9TWU5DX0lEX1BvcykgfAorICAgICAgICAgICAgKChwU3luY0NvbmZpZy0+UmVxdWVzdE51bWJlciAtIDFVKSA8PCBETUFNVVhfQ3hDUl9OQlJFUV9Qb3MpIHwKKyAgICAgICAgICAgIHBTeW5jQ29uZmlnLT5TeW5jUG9sYXJpdHkgfAorICAgICAgICAgICAgKCh1aW50MzJfdClwU3luY0NvbmZpZy0+U3luY0VuYWJsZSA8PCBETUFNVVhfQ3hDUl9TRV9Qb3MpIHwKKyAgICAgICAgICAgICgodWludDMyX3QpcFN5bmNDb25maWctPkV2ZW50RW5hYmxlIDw8IERNQU1VWF9DeENSX0VHRV9Qb3MpKTsKKworICAgIC8qIFByb2Nlc3MgVW5Mb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGRtYSk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9IGVsc2UgeworICAgIC8qRE1BIFN0YXRlIG5vdCBSZWFkeSovCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorfQorCisvKioKKyAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBETUFNVVggcmVxdWVzdCBnZW5lcmF0b3IgYmxvY2sgdXNlZCBieSB0aGUgZ2l2ZW4gRE1BCisgKiBjaGFubmVsIChpbnN0YW5jZSkuCisgKiBAcGFyYW0gIGhkbWE6ICAgICAgIHBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICogICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEKKyAqIGNoYW5uZWwuCisgKiBAcGFyYW0gIHBSZXF1ZXN0R2VuZXJhdG9yQ29uZmlnIDogcG9pbnRlciB0bworICogSEFMX0RNQV9NdXhSZXF1ZXN0R2VuZXJhdG9yQ29uZmlnVHlwZURlZiA6IGNvbnRhaW5zIHRoZSByZXF1ZXN0IGdlbmVyYXRvcgorICogcGFyYW1ldGVycy4KKyAqCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RNQUV4X0NvbmZpZ011eFJlcXVlc3RHZW5lcmF0b3IoCisgICAgRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEsCisgICAgSEFMX0RNQV9NdXhSZXF1ZXN0R2VuZXJhdG9yQ29uZmlnVHlwZURlZiAqcFJlcXVlc3RHZW5lcmF0b3JDb25maWcpIHsKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0RNQV9BTExfSU5TVEFOQ0UoaGRtYS0+SW5zdGFuY2UpKTsKKworICBhc3NlcnRfcGFyYW0oCisgICAgICBJU19ETUFNVVhfUkVRVUVTVF9HRU5fU0lHTkFMX0lEKHBSZXF1ZXN0R2VuZXJhdG9yQ29uZmlnLT5TaWduYWxJRCkpOworCisgIGFzc2VydF9wYXJhbSgKKyAgICAgIElTX0RNQU1VWF9SRVFVRVNUX0dFTl9QT0xBUklUWShwUmVxdWVzdEdlbmVyYXRvckNvbmZpZy0+UG9sYXJpdHkpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0RNQU1VWF9SRVFVRVNUX0dFTl9SRVFVRVNUX05VTUJFUigKKyAgICAgIHBSZXF1ZXN0R2VuZXJhdG9yQ29uZmlnLT5SZXF1ZXN0TnVtYmVyKSk7CisKKyAgLyogY2hlY2sgaWYgdGhlIERNQSBzdGF0ZSBpcyByZWFkeQorICAgICBhbmQgRE1BIGlzIHVzaW5nIGEgRE1BTVVYIHJlcXVlc3QgZ2VuZXJhdG9yIGJsb2NrCisgICovCisgIGlmICgoaGRtYS0+U3RhdGUgPT0gSEFMX0RNQV9TVEFURV9SRUFEWSkgJiYgKGhkbWEtPkRNQW11eFJlcXVlc3RHZW4gIT0gMFUpKSB7CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhkbWEpOworCisgICAgLyogU2V0IHRoZSByZXF1ZXN0IGdlbmVyYXRvciBuZXcgcGFyYW1ldGVycyAqLworICAgIGhkbWEtPkRNQW11eFJlcXVlc3RHZW4tPlJHQ1IgPQorICAgICAgICBwUmVxdWVzdEdlbmVyYXRvckNvbmZpZy0+U2lnbmFsSUQgfAorICAgICAgICAoKHBSZXF1ZXN0R2VuZXJhdG9yQ29uZmlnLT5SZXF1ZXN0TnVtYmVyIC0gMVUpCisgICAgICAgICA8PCAoUE9TSVRJT05fVkFMKERNQU1VWF9SR3hDUl9HTkJSRVEpICYgMHgxRlUpKSB8CisgICAgICAgIHBSZXF1ZXN0R2VuZXJhdG9yQ29uZmlnLT5Qb2xhcml0eTsKKyAgICAvKiBQcm9jZXNzIFVuTG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhkbWEpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgdGhlIERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvciBibG9jayB1c2VkIGJ5IHRoZSBnaXZlbiBETUEKKyAqIGNoYW5uZWwgKGluc3RhbmNlKS4KKyAqIEBwYXJhbSAgaGRtYTogICAgICAgcG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQQorICogY2hhbm5lbC4KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BRXhfRW5hYmxlTXV4UmVxdWVzdEdlbmVyYXRvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkgeworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfRE1BX0FMTF9JTlNUQU5DRShoZG1hLT5JbnN0YW5jZSkpOworCisgIC8qIGNoZWNrIGlmIHRoZSBETUEgc3RhdGUgaXMgcmVhZHkKKyAgICAgYW5kIERNQSBpcyB1c2luZyBhIERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvciBibG9jaworICAqLworICBpZiAoKGhkbWEtPlN0YXRlICE9IEhBTF9ETUFfU1RBVEVfUkVTRVQpICYmIChoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuICE9IDApKSB7CisgICAgLyogRW5hYmxlIHRoZSByZXF1ZXN0IGdlbmVyYXRvciovCisgICAgaGRtYS0+RE1BbXV4UmVxdWVzdEdlbi0+UkdDUiB8PSBETUFNVVhfUkd4Q1JfR0U7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9IGVsc2UgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgdGhlIERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvciBibG9jayB1c2VkIGJ5IHRoZSBnaXZlbiBETUEKKyAqIGNoYW5uZWwgKGluc3RhbmNlKS4KKyAqIEBwYXJhbSAgaGRtYTogICAgICAgcG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQQorICogY2hhbm5lbC4KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BRXhfRGlzYWJsZU11eFJlcXVlc3RHZW5lcmF0b3IoCisgICAgRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpIHsKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0RNQV9BTExfSU5TVEFOQ0UoaGRtYS0+SW5zdGFuY2UpKTsKKworICAvKiBjaGVjayBpZiB0aGUgRE1BIHN0YXRlIGlzIHJlYWR5CisgICAgIGFuZCBETUEgaXMgdXNpbmcgYSBETUFNVVggcmVxdWVzdCBnZW5lcmF0b3IgYmxvY2sKKyAgKi8KKyAgaWYgKChoZG1hLT5TdGF0ZSAhPSBIQUxfRE1BX1NUQVRFX1JFU0VUKSAmJiAoaGRtYS0+RE1BbXV4UmVxdWVzdEdlbiAhPSAwKSkgeworICAgIC8qIERpc2FibGUgdGhlIHJlcXVlc3QgZ2VuZXJhdG9yKi8KKyAgICBoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuLT5SR0NSICY9IH5ETUFNVVhfUkd4Q1JfR0U7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9IGVsc2UgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KK30KKworLyoqCisgKiBAYnJpZWYgIEhhbmRsZXMgRE1BTVVYIGludGVycnVwdCByZXF1ZXN0LgorICogQHBhcmFtICBoZG1hOiBwb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIGNoYW5uZWwuCisgKiBAcmV0dmFsIE5vbmUKKyAqLwordm9pZCBIQUxfRE1BRXhfTVVYX0lSUUhhbmRsZXIoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpIHsKKyAgLyogQ2hlY2sgZm9yIERNQU1VWCBTeW5jaHJvbml6YXRpb24gb3ZlcnJ1biAqLworICBpZiAoKGhkbWEtPkRNQW11eENoYW5uZWxTdGF0dXMtPkNTUiAmIGhkbWEtPkRNQW11eENoYW5uZWxTdGF0dXNNYXNrKSAhPSAwVSkgeworICAgIC8qIERpc2FibGUgdGhlIHN5bmNocm8gb3ZlcnJ1biBpbnRlcnJ1cHQgKi8KKyAgICBoZG1hLT5ETUFtdXhDaGFubmVsLT5DQ1IgJj0gfkRNQU1VWF9DeENSX1NPSUU7CisKKyAgICAvKiBDbGVhciB0aGUgRE1BTVVYIHN5bmNocm8gb3ZlcnJ1biBmbGFnICovCisgICAgaGRtYS0+RE1BbXV4Q2hhbm5lbFN0YXR1cy0+Q0ZSID0gaGRtYS0+RE1BbXV4Q2hhbm5lbFN0YXR1c01hc2s7CisKKyAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLworICAgIGhkbWEtPkVycm9yQ29kZSB8PSBIQUxfRE1BX0VSUk9SX1NZTkM7CisKKyAgICBpZiAoaGRtYS0+WGZlckVycm9yQ2FsbGJhY2sgIT0gTlVMTCkgeworICAgICAgLyogVHJhbnNmZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGhkbWEtPlhmZXJFcnJvckNhbGxiYWNrKGhkbWEpOworICAgIH0KKyAgfQorCisgIGlmIChoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuICE9IDApIHsKKyAgICAvKiBpZiB1c2luZyBhIERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvciBibG9jayBDaGVjayBmb3IgRE1BTVVYIHJlcXVlc3QKKyAgICAgKiBnZW5lcmF0b3Igb3ZlcnJ1biAqLworICAgIGlmICgoaGRtYS0+RE1BbXV4UmVxdWVzdEdlblN0YXR1cy0+UkdTUiAmCisgICAgICAgICBoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuU3RhdHVzTWFzaykgIT0gMFUpIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIHJlcXVlc3QgZ2VuIG92ZXJydW4gaW50ZXJydXB0ICovCisgICAgICBoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuLT5SR0NSICY9IH5ETUFNVVhfUkd4Q1JfT0lFOworCisgICAgICAvKiBDbGVhciB0aGUgRE1BTVVYIHJlcXVlc3QgZ2VuZXJhdG9yIG92ZXJydW4gZmxhZyAqLworICAgICAgaGRtYS0+RE1BbXV4UmVxdWVzdEdlblN0YXR1cy0+UkdDRlIgPSBoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuU3RhdHVzTWFzazsKKworICAgICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8KKyAgICAgIGhkbWEtPkVycm9yQ29kZSB8PSBIQUxfRE1BX0VSUk9SX1JFUUdFTjsKKworICAgICAgaWYgKGhkbWEtPlhmZXJFcnJvckNhbGxiYWNrICE9IE5VTEwpIHsKKyAgICAgICAgLyogVHJhbnNmZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgICAgaGRtYS0+WGZlckVycm9yQ2FsbGJhY2soaGRtYSk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworI2VuZGlmIC8qIEhBTF9ETUFfTU9EVUxFX0VOQUJMRUQgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLwpkaWZmIC0tZ2l0IGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX2V4dGkuYyBiL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9leHRpLmMKaW5kZXggNTZlZmMwZC4uZWMyMjg4OSAxMDA2NDQKLS0tIGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX2V4dGkuYworKysgYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfZXh0aS5jCkBAIC0xLDYwNiArMSw2MDcgQEAKLS8qKg0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICAqIEBmaWxlICAgIHN0bTMyZzR4eF9oYWxfZXh0aS5jDQotICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtDQotICAqIEBicmllZiAgIEVYVEkgSEFMIG1vZHVsZSBkcml2ZXIuDQotICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcNCi0gICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBFeHRlbmRlZCBJbnRlcnJ1cHRzIGFuZCBldmVudHMgY29udHJvbGxlcg0KLSAgKEVYVEkpIHBlcmlwaGVyYWw6DQotICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgR2VuZXJhbCBQdXJwb3NlIElucHV0L091dHB1dCAoRVhUSSkNCi0gIHBlcmlwaGVyYWw6DQotICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMNCi0gICogICAgICAgICAgICsgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucw0KLSAgKg0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICAqIEBhdHRlbnRpb24NCi0gICoNCi0gICogQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4NCi0gICogQWxsIHJpZ2h0cyByZXNlcnZlZC4NCi0gICoNCi0gICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0ZXJtcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlDQotICAqIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4NCi0gICogSWYgbm8gTElDRU5TRSBmaWxlIGNvbWVzIHdpdGggdGhpcyBzb2Z0d2FyZSwgaXQgaXMgcHJvdmlkZWQgQVMtSVMuDQotICAqDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gIEB2ZXJiYXRpbQ0KLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgICAgICAgICAgICAgICAgICAjIyMjIyBFWFRJIFBlcmlwaGVyYWwgZmVhdHVyZXMgIyMjIyMNCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgWy4uXQ0KLSAgICAoKykgRWFjaCBFeHRpIGxpbmUgY2FuIGJlIGNvbmZpZ3VyZWQgd2l0aGluIHRoaXMgZHJpdmVyLg0KLQ0KLSAgICAoKykgRXh0aSBsaW5lIGNhbiBiZSBjb25maWd1cmVkIGluIDMgZGlmZmVyZW50IG1vZGVzDQotICAgICAgICAoKyspIEludGVycnVwdA0KLSAgICAgICAgKCsrKSBFdmVudA0KLSAgICAgICAgKCsrKSBCb3RoIG9mIHRoZW0NCi0NCi0gICAgKCspIENvbmZpZ3VyYWJsZSBFeHRpIGxpbmVzIGNhbiBiZSBjb25maWd1cmVkIHdpdGggMyBkaWZmZXJlbnQgdHJpZ2dlcnMNCi0gICAgICAgICgrKykgUmlzaW5nDQotICAgICAgICAoKyspIEZhbGxpbmcNCi0gICAgICAgICgrKykgQm90aCBvZiB0aGVtDQotDQotICAgICgrKSBXaGVuIHNldCBpbiBpbnRlcnJ1cHQgbW9kZSwgY29uZmlndXJhYmxlIEV4dGkgbGluZXMgaGF2ZSB0d28gZGlmZmVyZW50DQotICAgICAgICBpbnRlcnJ1cHQgcGVuZGluZyByZWdpc3RlcnMgd2hpY2ggYWxsb3cgdG8gZGlzdGluZ3Vpc2ggd2hpY2ggdHJhbnNpdGlvbg0KLSAgICAgICAgb2NjdXJzOg0KLSAgICAgICAgKCsrKSBSaXNpbmcgZWRnZSBwZW5kaW5nIGludGVycnVwdA0KLSAgICAgICAgKCsrKSBGYWxsaW5nDQotDQotICAgICgrKSBFeHRpIGxpbmVzIDAgdG8gMTUgYXJlIGxpbmtlZCB0byBncGlvIHBpbiBudW1iZXIgMCB0byAxNS4gR3BpbyBwb3J0IGNhbg0KLSAgICAgICAgYmUgc2VsZWN0ZWQgdGhyb3VnaCBtdWx0aXBsZXhlci4NCi0NCi0gICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjDQotICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gIFsuLl0NCi0NCi0gICAgKCMpIENvbmZpZ3VyZSB0aGUgRVhUSSBsaW5lIHVzaW5nIEhBTF9FWFRJX1NldENvbmZpZ0xpbmUoKS4NCi0gICAgICAgICgrKykgQ2hvb3NlIHRoZSBpbnRlcnJ1cHQgbGluZSBudW1iZXIgYnkgc2V0dGluZyAiTGluZSIgbWVtYmVyIGZyb20NCi0gICAgICAgICAgICAgRVhUSV9Db25maWdUeXBlRGVmIHN0cnVjdHVyZS4NCi0gICAgICAgICgrKykgQ29uZmlndXJlIHRoZSBpbnRlcnJ1cHQgYW5kL29yIGV2ZW50IG1vZGUgdXNpbmcgIk1vZGUiIG1lbWJlciBmcm9tDQotICAgICAgICAgICAgIEVYVElfQ29uZmlnVHlwZURlZiBzdHJ1Y3R1cmUuDQotICAgICAgICAoKyspIEZvciBjb25maWd1cmFibGUgbGluZXMsIGNvbmZpZ3VyZSByaXNpbmcgYW5kL29yIGZhbGxpbmcgdHJpZ2dlcg0KLSAgICAgICAgICAgICAiVHJpZ2dlciIgbWVtYmVyIGZyb20gRVhUSV9Db25maWdUeXBlRGVmIHN0cnVjdHVyZS4NCi0gICAgICAgICgrKykgRm9yIEV4dGkgbGluZXMgbGlua2VkIHRvIGdwaW8sIGNob29zZSBncGlvIHBvcnQgdXNpbmcgIkdQSU9TZWwiDQotICAgICAgICAgICAgIG1lbWJlciBmcm9tIEdQSU9fSW5pdFR5cGVEZWYgc3RydWN0dXJlLg0KLQ0KLSAgICAoIykgR2V0IGN1cnJlbnQgRXh0aSBjb25maWd1cmF0aW9uIG9mIGEgZGVkaWNhdGVkIGxpbmUgdXNpbmcNCi0gICAgICAgIEhBTF9FWFRJX0dldENvbmZpZ0xpbmUoKS4NCi0gICAgICAgICgrKykgUHJvdmlkZSBleGl0aW5nIGhhbmRsZSBhcyBwYXJhbWV0ZXIuDQotICAgICAgICAoKyspIFByb3ZpZGUgcG9pbnRlciBvbiBFWFRJX0NvbmZpZ1R5cGVEZWYgc3RydWN0dXJlIGFzIHNlY29uZA0KLSAgcGFyYW1ldGVyLg0KLQ0KLSAgICAoIykgQ2xlYXIgRXh0aSBjb25maWd1cmF0aW9uIG9mIGEgZGVkaWNhdGVkIGxpbmUgdXNpbmcNCi0gIEhBTF9FWFRJX0dldENvbmZpZ0xpbmUoKS4NCi0gICAgICAgICgrKykgUHJvdmlkZSBleGl0aW5nIGhhbmRsZSBhcyBwYXJhbWV0ZXIuDQotDQotICAgICgjKSBSZWdpc3RlciBjYWxsYmFjayB0byB0cmVhdCBFeHRpIGludGVycnVwdHMgdXNpbmcNCi0gIEhBTF9FWFRJX1JlZ2lzdGVyQ2FsbGJhY2soKS4NCi0gICAgICAgICgrKykgUHJvdmlkZSBleGl0aW5nIGhhbmRsZSBhcyBmaXJzdCBwYXJhbWV0ZXIuDQotICAgICAgICAoKyspIFByb3ZpZGUgd2hpY2ggY2FsbGJhY2sgd2lsbCBiZSByZWdpc3RlcmVkIHVzaW5nIG9uZSB2YWx1ZSBmcm9tDQotICAgICAgICAgICAgIEVYVElfQ2FsbGJhY2tJRFR5cGVEZWYuDQotICAgICAgICAoKyspIFByb3ZpZGUgY2FsbGJhY2sgZnVuY3Rpb24gcG9pbnRlci4NCi0NCi0gICAgKCMpIEdldCBpbnRlcnJ1cHQgcGVuZGluZyBiaXQgdXNpbmcgSEFMX0VYVElfR2V0UGVuZGluZygpLg0KLQ0KLSAgICAoIykgQ2xlYXIgaW50ZXJydXB0IHBlbmRpbmcgYml0IHVzaW5nIEhBTF9FWFRJX0NsZWFyUGVuZGluZygpLg0KLQ0KLSAgICAoIykgR2VuZXJhdGUgc29mdHdhcmUgaW50ZXJydXB0IHVzaW5nIEhBTF9FWFRJX0dlbmVyYXRlU1dJKCkuDQotDQotICBAZW5kdmVyYmF0aW0NCi0gICovDQotDQotLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaW5jbHVkZSAic3RtMzJnNHh4X2hhbC5oIg0KLQ0KLS8qKiBAYWRkdG9ncm91cCBTVE0zMkc0eHhfSEFMX0RyaXZlcg0KLSAqIEB7DQotICovDQotDQotLyoqIEBhZGR0b2dyb3VwIEVYVEkNCi0gKiBAew0KLSAqLw0KLS8qKiBNSVNSQSBDOjIwMTIgZGV2aWF0aW9uIHJ1bGUgaGFzIGJlZW4gZ3JhbnRlZCBmb3IgZm9sbG93aW5nIHJ1bGU6DQotICogUnVsZS0xOC4xX2IgLSBNZWRpdW06IEFycmF5IGBFWFRJQ1InIDFzdCBzdWJzY3JpcHQgaW50ZXJ2YWwgWzAsN10gbWF5IGJlIG91dA0KLSAqIG9mIGJvdW5kcyBbMCwzXSBpbiBmb2xsb3dpbmcgQVBJIDoNCi0gKiBIQUxfRVhUSV9TZXRDb25maWdMaW5lDQotICogSEFMX0VYVElfR2V0Q29uZmlnTGluZQ0KLSAqIEhBTF9FWFRJX0NsZWFyQ29uZmlnTGluZQ0KLSAqLw0KLQ0KLSNpZmRlZiBIQUxfRVhUSV9NT0RVTEVfRU5BQkxFRA0KLQ0KLS8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogUHJpdmF0ZSBkZWZpbmVzDQotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGRlZmdyb3VwIEVYVElfUHJpdmF0ZV9Db25zdGFudHMgRVhUSSBQcml2YXRlIENvbnN0YW50cw0KLSAqIEB7DQotICovDQotI2RlZmluZSBFWFRJX01PREVfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgMHgwOFUgLyogMHgyMDogb2Zmc2V0IGJldHdlZW4gTUNVIElNUi9FTVIgcmVnaXN0ZXJzIFwNCi0gICAgICAgICAqLw0KLSNkZWZpbmUgRVhUSV9DT05GSUdfT0ZGU0VUIFwNCi0gIDB4MDhVIC8qIDB4MjA6IG9mZnNldCBiZXR3ZWVuIE1DVSBSaXNpbmcvRmFsbGluZyBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0NCi0vKiogQGFkZHRvZ3JvdXAgRVhUSV9FeHBvcnRlZF9GdW5jdGlvbnMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKiBAYWRkdG9ncm91cCBFWFRJX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDENCi0gICogIEBicmllZiAgICBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucw0KLSAgKg0KLUB2ZXJiYXRpbQ0KLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgICAgICAgICAgICAjIyMjIyBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucyAjIyMjIw0KLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotQGVuZHZlcmJhdGltDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IGNvbmZpZ3VyYXRpb24gb2YgYSBkZWRpY2F0ZWQgRXh0aSBsaW5lLg0KLSAqIEBwYXJhbSAgaGV4dGkgRXh0aSBoYW5kbGUuDQotICogQHBhcmFtICBwRXh0aUNvbmZpZyBQb2ludGVyIG9uIEVYVEkgY29uZmlndXJhdGlvbiB0byBiZSBzZXQuDQotICogQHJldHZhbCBIQUwgU3RhdHVzLg0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9FWFRJX1NldENvbmZpZ0xpbmUoRVhUSV9IYW5kbGVUeXBlRGVmICpoZXh0aSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVElfQ29uZmlnVHlwZURlZiAqcEV4dGlDb25maWcpIHsNCi0gIF9fSU8gdWludDMyX3QgKnJlZ2FkZHI7DQotICB1aW50MzJfdCByZWd2YWw7DQotICB1aW50MzJfdCBsaW5lcG9zOw0KLSAgdWludDMyX3QgbWFza2xpbmU7DQotICB1aW50MzJfdCBvZmZzZXQ7DQotDQotICAvKiBDaGVjayBudWxsIHBvaW50ZXIgKi8NCi0gIGlmICgoaGV4dGkgPT0gTlVMTCkgfHwgKHBFeHRpQ29uZmlnID09IE5VTEwpKSB7DQotICAgIHJldHVybiBIQUxfRVJST1I7DQotICB9DQotDQotICAvKiBDaGVjayBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfRVhUSV9MSU5FKHBFeHRpQ29uZmlnLT5MaW5lKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfRVhUSV9NT0RFKHBFeHRpQ29uZmlnLT5Nb2RlKSk7DQotDQotICAvKiBBc3NpZ24gbGluZSBudW1iZXIgdG8gaGFuZGxlICovDQotICBoZXh0aS0+TGluZSA9IHBFeHRpQ29uZmlnLT5MaW5lOw0KLQ0KLSAgLyogQ29tcHV0ZSBsaW5lIHJlZ2lzdGVyIG9mZnNldCAqLw0KLSAgb2Zmc2V0ID0gKChwRXh0aUNvbmZpZy0+TGluZSAmIEVYVElfUkVHX01BU0spID4+IEVYVElfUkVHX1NISUZUKTsNCi0gIC8qIENvbXB1dGUgbGluZSBwb3NpdGlvbiAqLw0KLSAgbGluZXBvcyA9IChwRXh0aUNvbmZpZy0+TGluZSAmIEVYVElfUElOX01BU0spOw0KLSAgLyogQ29tcHV0ZSBsaW5lIG1hc2sgKi8NCi0gIG1hc2tsaW5lID0gKDF1TCA8PCBsaW5lcG9zKTsNCi0NCi0gIC8qIENvbmZpZ3VyZSB0cmlnZ2VycyBmb3IgY29uZmlndXJhYmxlIGxpbmVzICovDQotICBpZiAoKHBFeHRpQ29uZmlnLT5MaW5lICYgRVhUSV9DT05GSUcpICE9IDB4MDB1KSB7DQotICAgIGFzc2VydF9wYXJhbShJU19FWFRJX1RSSUdHRVIocEV4dGlDb25maWctPlRyaWdnZXIpKTsNCi0NCi0gICAgLyogQ29uZmlndXJlIHJpc2luZyB0cmlnZ2VyICovDQotICAgIHJlZ2FkZHIgPSAoJkVYVEktPlJUU1IxICsgKEVYVElfQ09ORklHX09GRlNFVCAqIG9mZnNldCkpOw0KLSAgICByZWd2YWwgPSAqcmVnYWRkcjsNCi0NCi0gICAgLyogTWFzayBvciBzZXQgbGluZSAqLw0KLSAgICBpZiAoKHBFeHRpQ29uZmlnLT5UcmlnZ2VyICYgRVhUSV9UUklHR0VSX1JJU0lORykgIT0gMHgwMHUpIHsNCi0gICAgICByZWd2YWwgfD0gbWFza2xpbmU7DQotICAgIH0gZWxzZSB7DQotICAgICAgcmVndmFsICY9IH5tYXNrbGluZTsNCi0gICAgfQ0KLQ0KLSAgICAvKiBTdG9yZSByaXNpbmcgdHJpZ2dlciBtb2RlICovDQotICAgICpyZWdhZGRyID0gcmVndmFsOw0KLQ0KLSAgICAvKiBDb25maWd1cmUgZmFsbGluZyB0cmlnZ2VyICovDQotICAgIHJlZ2FkZHIgPSAoJkVYVEktPkZUU1IxICsgKEVYVElfQ09ORklHX09GRlNFVCAqIG9mZnNldCkpOw0KLSAgICByZWd2YWwgPSAqcmVnYWRkcjsNCi0NCi0gICAgLyogTWFzayBvciBzZXQgbGluZSAqLw0KLSAgICBpZiAoKHBFeHRpQ29uZmlnLT5UcmlnZ2VyICYgRVhUSV9UUklHR0VSX0ZBTExJTkcpICE9IDB4MDB1KSB7DQotICAgICAgcmVndmFsIHw9IG1hc2tsaW5lOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgIHJlZ3ZhbCAmPSB+bWFza2xpbmU7DQotICAgIH0NCi0NCi0gICAgLyogU3RvcmUgZmFsbGluZyB0cmlnZ2VyIG1vZGUgKi8NCi0gICAgKnJlZ2FkZHIgPSByZWd2YWw7DQotDQotICAgIC8qIENvbmZpZ3VyZSBncGlvIHBvcnQgc2VsZWN0aW9uIGluIGNhc2Ugb2YgZ3BpbyBleHRpIGxpbmUgKi8NCi0gICAgaWYgKChwRXh0aUNvbmZpZy0+TGluZSAmIEVYVElfR1BJTykgPT0gRVhUSV9HUElPKSB7DQotICAgICAgYXNzZXJ0X3BhcmFtKElTX0VYVElfR1BJT19QT1JUKHBFeHRpQ29uZmlnLT5HUElPU2VsKSk7DQotICAgICAgYXNzZXJ0X3BhcmFtKElTX0VYVElfR1BJT19QSU4obGluZXBvcykpOw0KLQ0KLSAgICAgIHJlZ3ZhbCA9IFNZU0NGRy0+RVhUSUNSW2xpbmVwb3MgPj4gMnVdOw0KLSAgICAgIHJlZ3ZhbCAmPSB+KFNZU0NGR19FWFRJQ1IxX0VYVEkwDQotICAgICAgICAgICAgICAgICAgPDwgKFNZU0NGR19FWFRJQ1IxX0VYVEkxX1BvcyAqIChsaW5lcG9zICYgMHgwM3UpKSk7DQotICAgICAgcmVndmFsIHw9IChwRXh0aUNvbmZpZy0+R1BJT1NlbA0KLSAgICAgICAgICAgICAgICAgPDwgKFNZU0NGR19FWFRJQ1IxX0VYVEkxX1BvcyAqIChsaW5lcG9zICYgMHgwM3UpKSk7DQotICAgICAgU1lTQ0ZHLT5FWFRJQ1JbbGluZXBvcyA+PiAydV0gPSByZWd2YWw7DQotICAgIH0NCi0gIH0NCi0NCi0gIC8qIENvbmZpZ3VyZSBpbnRlcnJ1cHQgbW9kZSA6IHJlYWQgY3VycmVudCBtb2RlICovDQotICByZWdhZGRyID0gKCZFWFRJLT5JTVIxICsgKEVYVElfTU9ERV9PRkZTRVQgKiBvZmZzZXQpKTsNCi0gIHJlZ3ZhbCA9ICpyZWdhZGRyOw0KLQ0KLSAgLyogTWFzayBvciBzZXQgbGluZSAqLw0KLSAgaWYgKChwRXh0aUNvbmZpZy0+TW9kZSAmIEVYVElfTU9ERV9JTlRFUlJVUFQpICE9IDB4MDB1KSB7DQotICAgIHJlZ3ZhbCB8PSBtYXNrbGluZTsNCi0gIH0gZWxzZSB7DQotICAgIHJlZ3ZhbCAmPSB+bWFza2xpbmU7DQotICB9DQotDQotICAvKiBTdG9yZSBpbnRlcnJ1cHQgbW9kZSAqLw0KLSAgKnJlZ2FkZHIgPSByZWd2YWw7DQotDQotICAvKiBDb25maWd1cmUgZXZlbnQgbW9kZSA6IHJlYWQgY3VycmVudCBtb2RlICovDQotICByZWdhZGRyID0gKCZFWFRJLT5FTVIxICsgKEVYVElfTU9ERV9PRkZTRVQgKiBvZmZzZXQpKTsNCi0gIHJlZ3ZhbCA9ICpyZWdhZGRyOw0KLQ0KLSAgLyogTWFzayBvciBzZXQgbGluZSAqLw0KLSAgaWYgKChwRXh0aUNvbmZpZy0+TW9kZSAmIEVYVElfTU9ERV9FVkVOVCkgIT0gMHgwMHUpIHsNCi0gICAgcmVndmFsIHw9IG1hc2tsaW5lOw0KLSAgfSBlbHNlIHsNCi0gICAgcmVndmFsICY9IH5tYXNrbGluZTsNCi0gIH0NCi0NCi0gIC8qIFN0b3JlIGV2ZW50IG1vZGUgKi8NCi0gICpyZWdhZGRyID0gcmVndmFsOw0KLQ0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgY29uZmlndXJhdGlvbiBvZiBhIGRlZGljYXRlZCBFeHRpIGxpbmUuDQotICogQHBhcmFtICBoZXh0aSBFeHRpIGhhbmRsZS4NCi0gKiBAcGFyYW0gIHBFeHRpQ29uZmlnIFBvaW50ZXIgb24gc3RydWN0dXJlIHRvIHN0b3JlIEV4dGkgY29uZmlndXJhdGlvbi4NCi0gKiBAcmV0dmFsIEhBTCBTdGF0dXMuDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0VYVElfR2V0Q29uZmlnTGluZShFWFRJX0hhbmRsZVR5cGVEZWYgKmhleHRpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUSV9Db25maWdUeXBlRGVmICpwRXh0aUNvbmZpZykgew0KLSAgX19JTyB1aW50MzJfdCAqcmVnYWRkcjsNCi0gIHVpbnQzMl90IHJlZ3ZhbDsNCi0gIHVpbnQzMl90IGxpbmVwb3M7DQotICB1aW50MzJfdCBtYXNrbGluZTsNCi0gIHVpbnQzMl90IG9mZnNldDsNCi0NCi0gIC8qIENoZWNrIG51bGwgcG9pbnRlciAqLw0KLSAgaWYgKChoZXh0aSA9PSBOVUxMKSB8fCAocEV4dGlDb25maWcgPT0gTlVMTCkpIHsNCi0gICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gIH0NCi0NCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXIgKi8NCi0gIGFzc2VydF9wYXJhbShJU19FWFRJX0xJTkUoaGV4dGktPkxpbmUpKTsNCi0NCi0gIC8qIFN0b3JlIGhhbmRsZSBsaW5lIG51bWJlciB0byBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSAqLw0KLSAgcEV4dGlDb25maWctPkxpbmUgPSBoZXh0aS0+TGluZTsNCi0NCi0gIC8qIENvbXB1dGUgbGluZSByZWdpc3RlciBvZmZzZXQgYW5kIGxpbmUgbWFzayAqLw0KLSAgb2Zmc2V0ID0gKChwRXh0aUNvbmZpZy0+TGluZSAmIEVYVElfUkVHX01BU0spID4+IEVYVElfUkVHX1NISUZUKTsNCi0gIC8qIENvbXB1dGUgbGluZSBwb3NpdGlvbiAqLw0KLSAgbGluZXBvcyA9IChwRXh0aUNvbmZpZy0+TGluZSAmIEVYVElfUElOX01BU0spOw0KLSAgLyogQ29tcHV0ZSBtYXNrICovDQotICBtYXNrbGluZSA9ICgxdUwgPDwgbGluZXBvcyk7DQotDQotICAvKiAxXSBHZXQgY29yZSBtb2RlIDogaW50ZXJydXB0ICovDQotICByZWdhZGRyID0gKCZFWFRJLT5JTVIxICsgKEVYVElfTU9ERV9PRkZTRVQgKiBvZmZzZXQpKTsNCi0gIHJlZ3ZhbCA9ICpyZWdhZGRyOw0KLQ0KLSAgLyogQ2hlY2sgaWYgc2VsZWN0ZWQgbGluZSBpcyBlbmFibGUgKi8NCi0gIGlmICgocmVndmFsICYgbWFza2xpbmUpICE9IDB4MDB1KSB7DQotICAgIHBFeHRpQ29uZmlnLT5Nb2RlID0gRVhUSV9NT0RFX0lOVEVSUlVQVDsNCi0gIH0gZWxzZSB7DQotICAgIHBFeHRpQ29uZmlnLT5Nb2RlID0gRVhUSV9NT0RFX05PTkU7DQotICB9DQotDQotICAvKiBHZXQgZXZlbnQgbW9kZSAqLw0KLSAgcmVnYWRkciA9ICgmRVhUSS0+RU1SMSArIChFWFRJX01PREVfT0ZGU0VUICogb2Zmc2V0KSk7DQotICByZWd2YWwgPSAqcmVnYWRkcjsNCi0NCi0gIC8qIENoZWNrIGlmIHNlbGVjdGVkIGxpbmUgaXMgZW5hYmxlICovDQotICBpZiAoKHJlZ3ZhbCAmIG1hc2tsaW5lKSAhPSAweDAwdSkgew0KLSAgICBwRXh0aUNvbmZpZy0+TW9kZSB8PSBFWFRJX01PREVfRVZFTlQ7DQotICB9DQotDQotICAvKiBHZXQgZGVmYXVsdCBUcmlnZ2VyIGFuZCBHUElPU2VsIGNvbmZpZ3VyYXRpb24gKi8NCi0gIHBFeHRpQ29uZmlnLT5UcmlnZ2VyID0gRVhUSV9UUklHR0VSX05PTkU7DQotICBwRXh0aUNvbmZpZy0+R1BJT1NlbCA9IDB4MDB1Ow0KLQ0KLSAgLyogMl0gR2V0IHRyaWdnZXIgZm9yIGNvbmZpZ3VyYWJsZSBsaW5lcyA6IHJpc2luZyAqLw0KLSAgaWYgKChwRXh0aUNvbmZpZy0+TGluZSAmIEVYVElfQ09ORklHKSAhPSAweDAwdSkgew0KLSAgICByZWdhZGRyID0gKCZFWFRJLT5SVFNSMSArIChFWFRJX0NPTkZJR19PRkZTRVQgKiBvZmZzZXQpKTsNCi0gICAgcmVndmFsID0gKnJlZ2FkZHI7DQotDQotICAgIC8qIENoZWNrIGlmIGNvbmZpZ3VyYXRpb24gb2Ygc2VsZWN0ZWQgbGluZSBpcyBlbmFibGUgKi8NCi0gICAgaWYgKChyZWd2YWwgJiBtYXNrbGluZSkgIT0gMHgwMHUpIHsNCi0gICAgICBwRXh0aUNvbmZpZy0+VHJpZ2dlciA9IEVYVElfVFJJR0dFUl9SSVNJTkc7DQotICAgIH0NCi0NCi0gICAgLyogR2V0IGZhbGxpbmcgY29uZmlndXJhdGlvbiAqLw0KLSAgICByZWdhZGRyID0gKCZFWFRJLT5GVFNSMSArIChFWFRJX0NPTkZJR19PRkZTRVQgKiBvZmZzZXQpKTsNCi0gICAgcmVndmFsID0gKnJlZ2FkZHI7DQotDQotICAgIC8qIENoZWNrIGlmIGNvbmZpZ3VyYXRpb24gb2Ygc2VsZWN0ZWQgbGluZSBpcyBlbmFibGUgKi8NCi0gICAgaWYgKChyZWd2YWwgJiBtYXNrbGluZSkgIT0gMHgwMHUpIHsNCi0gICAgICBwRXh0aUNvbmZpZy0+VHJpZ2dlciB8PSBFWFRJX1RSSUdHRVJfRkFMTElORzsNCi0gICAgfQ0KLQ0KLSAgICAvKiBHZXQgR3BpbyBwb3J0IHNlbGVjdGlvbiBmb3IgZ3BpbyBsaW5lcyAqLw0KLSAgICBpZiAoKHBFeHRpQ29uZmlnLT5MaW5lICYgRVhUSV9HUElPKSA9PSBFWFRJX0dQSU8pIHsNCi0gICAgICBhc3NlcnRfcGFyYW0oSVNfRVhUSV9HUElPX1BJTihsaW5lcG9zKSk7DQotDQotICAgICAgcmVndmFsID0gU1lTQ0ZHLT5FWFRJQ1JbbGluZXBvcyA+PiAydV07DQotICAgICAgcEV4dGlDb25maWctPkdQSU9TZWwgPQ0KLSAgICAgICAgICAoKHJlZ3ZhbCA+PiAoU1lTQ0ZHX0VYVElDUjFfRVhUSTFfUG9zICogKChsaW5lcG9zICYgMHgwM3UpKSkpKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDbGVhciB3aG9sZSBjb25maWd1cmF0aW9uIG9mIGEgZGVkaWNhdGVkIEV4dGkgbGluZS4NCi0gKiBAcGFyYW0gIGhleHRpIEV4dGkgaGFuZGxlLg0KLSAqIEByZXR2YWwgSEFMIFN0YXR1cy4NCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfRVhUSV9DbGVhckNvbmZpZ0xpbmUoRVhUSV9IYW5kbGVUeXBlRGVmICpoZXh0aSkgew0KLSAgX19JTyB1aW50MzJfdCAqcmVnYWRkcjsNCi0gIHVpbnQzMl90IHJlZ3ZhbDsNCi0gIHVpbnQzMl90IGxpbmVwb3M7DQotICB1aW50MzJfdCBtYXNrbGluZTsNCi0gIHVpbnQzMl90IG9mZnNldDsNCi0NCi0gIC8qIENoZWNrIG51bGwgcG9pbnRlciAqLw0KLSAgaWYgKGhleHRpID09IE5VTEwpIHsNCi0gICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gIH0NCi0NCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXIgKi8NCi0gIGFzc2VydF9wYXJhbShJU19FWFRJX0xJTkUoaGV4dGktPkxpbmUpKTsNCi0NCi0gIC8qIGNvbXB1dGUgbGluZSByZWdpc3RlciBvZmZzZXQgYW5kIGxpbmUgbWFzayAqLw0KLSAgb2Zmc2V0ID0gKChoZXh0aS0+TGluZSAmIEVYVElfUkVHX01BU0spID4+IEVYVElfUkVHX1NISUZUKTsNCi0gIC8qIGNvbXB1dGUgbGluZSBwb3NpdGlvbiAqLw0KLSAgbGluZXBvcyA9IChoZXh0aS0+TGluZSAmIEVYVElfUElOX01BU0spOw0KLSAgLyogY29tcHV0ZSBsaW5lIG1hc2sgKi8NCi0gIG1hc2tsaW5lID0gKDF1TCA8PCBsaW5lcG9zKTsNCi0NCi0gIC8qIDFdIENsZWFyIGludGVycnVwdCBtb2RlICovDQotICByZWdhZGRyID0gKCZFWFRJLT5JTVIxICsgKEVYVElfTU9ERV9PRkZTRVQgKiBvZmZzZXQpKTsNCi0gIHJlZ3ZhbCA9ICgqcmVnYWRkciAmIH5tYXNrbGluZSk7DQotICAqcmVnYWRkciA9IHJlZ3ZhbDsNCi0NCi0gIC8qIDJdIENsZWFyIGV2ZW50IG1vZGUgKi8NCi0gIHJlZ2FkZHIgPSAoJkVYVEktPkVNUjEgKyAoRVhUSV9NT0RFX09GRlNFVCAqIG9mZnNldCkpOw0KLSAgcmVndmFsID0gKCpyZWdhZGRyICYgfm1hc2tsaW5lKTsNCi0gICpyZWdhZGRyID0gcmVndmFsOw0KLQ0KLSAgLyogM10gQ2xlYXIgdHJpZ2dlcnMgaW4gY2FzZSBvZiBjb25maWd1cmFibGUgbGluZXMgKi8NCi0gIGlmICgoaGV4dGktPkxpbmUgJiBFWFRJX0NPTkZJRykgIT0gMHgwMHUpIHsNCi0gICAgcmVnYWRkciA9ICgmRVhUSS0+UlRTUjEgKyAoRVhUSV9DT05GSUdfT0ZGU0VUICogb2Zmc2V0KSk7DQotICAgIHJlZ3ZhbCA9ICgqcmVnYWRkciAmIH5tYXNrbGluZSk7DQotICAgICpyZWdhZGRyID0gcmVndmFsOw0KLQ0KLSAgICByZWdhZGRyID0gKCZFWFRJLT5GVFNSMSArIChFWFRJX0NPTkZJR19PRkZTRVQgKiBvZmZzZXQpKTsNCi0gICAgcmVndmFsID0gKCpyZWdhZGRyICYgfm1hc2tsaW5lKTsNCi0gICAgKnJlZ2FkZHIgPSByZWd2YWw7DQotDQotICAgIC8qIEdldCBHcGlvIHBvcnQgc2VsZWN0aW9uIGZvciBncGlvIGxpbmVzICovDQotICAgIGlmICgoaGV4dGktPkxpbmUgJiBFWFRJX0dQSU8pID09IEVYVElfR1BJTykgew0KLSAgICAgIGFzc2VydF9wYXJhbShJU19FWFRJX0dQSU9fUElOKGxpbmVwb3MpKTsNCi0NCi0gICAgICByZWd2YWwgPSBTWVNDRkctPkVYVElDUltsaW5lcG9zID4+IDJ1XTsNCi0gICAgICByZWd2YWwgJj0gfihTWVNDRkdfRVhUSUNSMV9FWFRJMA0KLSAgICAgICAgICAgICAgICAgIDw8IChTWVNDRkdfRVhUSUNSMV9FWFRJMV9Qb3MgKiAobGluZXBvcyAmIDB4MDN1KSkpOw0KLSAgICAgIFNZU0NGRy0+RVhUSUNSW2xpbmVwb3MgPj4gMnVdID0gcmVndmFsOw0KLSAgICB9DQotICB9DQotDQotICByZXR1cm4gSEFMX09LOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJlZ2lzdGVyIGNhbGxiYWNrIGZvciBhIGRlZGljYXRlZCBFeHRpIGxpbmUuDQotICogQHBhcmFtICBoZXh0aSBFeHRpIGhhbmRsZS4NCi0gKiBAcGFyYW0gIENhbGxiYWNrSUQgVXNlciBjYWxsYmFjayBpZGVudGlmaWVyLg0KLSAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiBAYXJnIEByZWYgRVhUSV9DYWxsYmFja0lEVHlwZURlZiB2YWx1ZXMuDQotICogQHBhcmFtICBwUGVuZGluZ0NiZm4gZnVuY3Rpb24gcG9pbnRlciB0byBiZSBzdG9yZWQgYXMgY2FsbGJhY2suDQotICogQHJldHZhbCBIQUwgU3RhdHVzLg0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9FWFRJX1JlZ2lzdGVyQ2FsbGJhY2soRVhUSV9IYW5kbGVUeXBlRGVmICpoZXh0aSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVElfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpwUGVuZGluZ0NiZm4pKHZvaWQpKSB7DQotICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7DQotDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0VYVElfQ0IoQ2FsbGJhY2tJRCkpOw0KLQ0KLSAgc3dpdGNoIChDYWxsYmFja0lEKSB7DQotICAgIC8qIHNldCBjb21tb24gY2FsbGJhY2sgKi8NCi0gICAgY2FzZSBIQUxfRVhUSV9DT01NT05fQ0JfSUQ6DQotICAgICAgaGV4dGktPlBlbmRpbmdDYWxsYmFjayA9IHBQZW5kaW5nQ2JmbjsNCi0gICAgICBicmVhazsNCi0NCi0gICAgZGVmYXVsdDoNCi0gICAgICBoZXh0aS0+UGVuZGluZ0NhbGxiYWNrID0gTlVMTDsNCi0gICAgICBzdGF0dXMgPSBIQUxfRVJST1I7DQotICAgICAgYnJlYWs7DQotICB9DQotDQotICByZXR1cm4gc3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFN0b3JlIGxpbmUgbnVtYmVyIGFzIGhhbmRsZSBwcml2YXRlIGZpZWxkLg0KLSAqIEBwYXJhbSAgaGV4dGkgRXh0aSBoYW5kbGUuDQotICogQHBhcmFtICBFeHRpTGluZSBFeHRpIGxpbmUgbnVtYmVyLg0KLSAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGZyb20gMCB0byBAcmVmIEVYVElfTElORV9OQi4NCi0gKiBAcmV0dmFsIEhBTCBTdGF0dXMuDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0VYVElfR2V0SGFuZGxlKEVYVElfSGFuZGxlVHlwZURlZiAqaGV4dGksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEV4dGlMaW5lKSB7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0VYVElfTElORShFeHRpTGluZSkpOw0KLQ0KLSAgLyogQ2hlY2sgbnVsbCBwb2ludGVyICovDQotICBpZiAoaGV4dGkgPT0gTlVMTCkgew0KLSAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgfSBlbHNlIHsNCi0gICAgLyogU3RvcmUgbGluZSBudW1iZXIgYXMgaGFuZGxlIHByaXZhdGUgZmllbGQgKi8NCi0gICAgaGV4dGktPkxpbmUgPSBFeHRpTGluZTsNCi0NCi0gICAgcmV0dXJuIEhBTF9PSzsNCi0gIH0NCi19DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGFkZHRvZ3JvdXAgRVhUSV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyDQotICAqICBAYnJpZWYgRVhUSSBJTyBmdW5jdGlvbnMuDQotICAqDQotQHZlcmJhdGltDQotID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgICAgICAgICAgICAgICAgICAgICMjIyMjIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMNCi0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLUBlbmR2ZXJiYXRpbQ0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEhhbmRsZSBFWFRJIGludGVycnVwdCByZXF1ZXN0Lg0KLSAqIEBwYXJhbSAgaGV4dGkgRXh0aSBoYW5kbGUuDQotICogQHJldHZhbCBub25lLg0KLSAqLw0KLXZvaWQgSEFMX0VYVElfSVJRSGFuZGxlcihFWFRJX0hhbmRsZVR5cGVEZWYgKmhleHRpKSB7DQotICBfX0lPIHVpbnQzMl90ICpyZWdhZGRyOw0KLSAgdWludDMyX3QgcmVndmFsOw0KLSAgdWludDMyX3QgbWFza2xpbmU7DQotICB1aW50MzJfdCBvZmZzZXQ7DQotDQotICAvKiBDb21wdXRlIGxpbmUgcmVnaXN0ZXIgb2Zmc2V0ICovDQotICBvZmZzZXQgPSAoKGhleHRpLT5MaW5lICYgRVhUSV9SRUdfTUFTSykgPj4gRVhUSV9SRUdfU0hJRlQpOw0KLSAgLyogY29tcHV0ZSBsaW5lIG1hc2sgKi8NCi0gIG1hc2tsaW5lID0gKDF1TCA8PCAoaGV4dGktPkxpbmUgJiBFWFRJX1BJTl9NQVNLKSk7DQotDQotICAvKiBHZXQgcGVuZGluZyBiaXQgICovDQotICByZWdhZGRyID0gKCZFWFRJLT5QUjEgKyAoRVhUSV9DT05GSUdfT0ZGU0VUICogb2Zmc2V0KSk7DQotICByZWd2YWwgPSAoKnJlZ2FkZHIgJiBtYXNrbGluZSk7DQotDQotICBpZiAocmVndmFsICE9IDB4MDB1KSB7DQotICAgIC8qIENsZWFyIHBlbmRpbmcgYml0ICovDQotICAgICpyZWdhZGRyID0gbWFza2xpbmU7DQotDQotICAgIC8qIENhbGwgcGVuZGluZyBjYWxsYmFjayAqLw0KLSAgICBpZiAoaGV4dGktPlBlbmRpbmdDYWxsYmFjayAhPSBOVUxMKSB7DQotICAgICAgaGV4dGktPlBlbmRpbmdDYWxsYmFjaygpOw0KLSAgICB9DQotICB9DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IGludGVycnVwdCBwZW5kaW5nIGJpdCBvZiBhIGRlZGljYXRlZCBsaW5lLg0KLSAqIEBwYXJhbSAgaGV4dGkgRXh0aSBoYW5kbGUuDQotICogQHBhcmFtICBFZGdlIHVudXNlZA0KLSAqIEByZXR2YWwgMSBpZiBpbnRlcnJ1cHQgaXMgcGVuZGluZyBlbHNlIDAuDQotICovDQotdWludDMyX3QgSEFMX0VYVElfR2V0UGVuZGluZyhFWFRJX0hhbmRsZVR5cGVEZWYgKmhleHRpLCB1aW50MzJfdCBFZGdlKSB7DQotICBfX0lPIHVpbnQzMl90ICpyZWdhZGRyOw0KLSAgdWludDMyX3QgcmVndmFsOw0KLSAgdWludDMyX3QgbGluZXBvczsNCi0gIHVpbnQzMl90IG1hc2tsaW5lOw0KLSAgdWludDMyX3Qgb2Zmc2V0Ow0KLQ0KLSAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0VYVElfTElORShoZXh0aS0+TGluZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0VYVElfQ09ORklHX0xJTkUoaGV4dGktPkxpbmUpKTsNCi0gIFVOVVNFRChFZGdlKTsNCi0NCi0gIC8qIENvbXB1dGUgbGluZSByZWdpc3RlciBvZmZzZXQgKi8NCi0gIG9mZnNldCA9ICgoaGV4dGktPkxpbmUgJiBFWFRJX1JFR19NQVNLKSA+PiBFWFRJX1JFR19TSElGVCk7DQotICAvKiBDb21wdXRlIGxpbmUgcG9zaXRpb24gKi8NCi0gIGxpbmVwb3MgPSAoaGV4dGktPkxpbmUgJiBFWFRJX1BJTl9NQVNLKTsNCi0gIC8qIENvbXB1dGUgbGluZSBtYXNrICovDQotICBtYXNrbGluZSA9ICgxdUwgPDwgbGluZXBvcyk7DQotDQotICAvKiBHZXQgcGVuZGluZyBiaXQgKi8NCi0gIHJlZ2FkZHIgPSAoJkVYVEktPlBSMSArIChFWFRJX0NPTkZJR19PRkZTRVQgKiBvZmZzZXQpKTsNCi0NCi0gIC8qIHJldHVybiAxIGlmIGJpdCBpcyBzZXQgZWxzZSAwICovDQotICByZWd2YWwgPSAoKCpyZWdhZGRyICYgbWFza2xpbmUpID4+IGxpbmVwb3MpOw0KLSAgcmV0dXJuIHJlZ3ZhbDsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDbGVhciBpbnRlcnJ1cHQgcGVuZGluZyBiaXQgb2YgYSBkZWRpY2F0ZWQgbGluZS4NCi0gKiBAcGFyYW0gIGhleHRpIEV4dGkgaGFuZGxlLg0KLSAqIEBwYXJhbSAgRWRnZSB1bnVzZWQNCi0gKiBAcmV0dmFsIE5vbmUuDQotICovDQotdm9pZCBIQUxfRVhUSV9DbGVhclBlbmRpbmcoRVhUSV9IYW5kbGVUeXBlRGVmICpoZXh0aSwgdWludDMyX3QgRWRnZSkgew0KLSAgX19JTyB1aW50MzJfdCAqcmVnYWRkcjsNCi0gIHVpbnQzMl90IG1hc2tsaW5lOw0KLSAgdWludDMyX3Qgb2Zmc2V0Ow0KLQ0KLSAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0VYVElfTElORShoZXh0aS0+TGluZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0VYVElfQ09ORklHX0xJTkUoaGV4dGktPkxpbmUpKTsNCi0gIFVOVVNFRChFZGdlKTsNCi0NCi0gIC8qIENvbXB1dGUgbGluZSByZWdpc3RlciBvZmZzZXQgKi8NCi0gIG9mZnNldCA9ICgoaGV4dGktPkxpbmUgJiBFWFRJX1JFR19NQVNLKSA+PiBFWFRJX1JFR19TSElGVCk7DQotICAvKiBDb21wdXRlIGxpbmUgbWFzayAqLw0KLSAgbWFza2xpbmUgPSAoMXVMIDw8IChoZXh0aS0+TGluZSAmIEVYVElfUElOX01BU0spKTsNCi0NCi0gIC8qIEdldCBwZW5kaW5nIHJlZ2lzdGVyIGFkZHJlc3MgKi8NCi0gIHJlZ2FkZHIgPSAoJkVYVEktPlBSMSArIChFWFRJX0NPTkZJR19PRkZTRVQgKiBvZmZzZXQpKTsNCi0NCi0gIC8qIENsZWFyIFBlbmRpbmcgYml0ICovDQotICAqcmVnYWRkciA9IG1hc2tsaW5lOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdlbmVyYXRlIGEgc29mdHdhcmUgaW50ZXJydXB0IGZvciBhIGRlZGljYXRlZCBsaW5lLg0KLSAqIEBwYXJhbSAgaGV4dGkgRXh0aSBoYW5kbGUuDQotICogQHJldHZhbCBOb25lLg0KLSAqLw0KLXZvaWQgSEFMX0VYVElfR2VuZXJhdGVTV0koRVhUSV9IYW5kbGVUeXBlRGVmICpoZXh0aSkgew0KLSAgX19JTyB1aW50MzJfdCAqcmVnYWRkcjsNCi0gIHVpbnQzMl90IG1hc2tsaW5lOw0KLSAgdWludDMyX3Qgb2Zmc2V0Ow0KLQ0KLSAgLyogQ2hlY2sgcGFyYW1ldGVyICovDQotICBhc3NlcnRfcGFyYW0oSVNfRVhUSV9MSU5FKGhleHRpLT5MaW5lKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfRVhUSV9DT05GSUdfTElORShoZXh0aS0+TGluZSkpOw0KLQ0KLSAgLyogY29tcHV0ZSBsaW5lIHJlZ2lzdGVyIG9mZnNldCAqLw0KLSAgb2Zmc2V0ID0gKChoZXh0aS0+TGluZSAmIEVYVElfUkVHX01BU0spID4+IEVYVElfUkVHX1NISUZUKTsNCi0gIC8qIGNvbXB1dGUgbGluZSBtYXNrICovDQotICBtYXNrbGluZSA9ICgxdUwgPDwgKGhleHRpLT5MaW5lICYgRVhUSV9QSU5fTUFTSykpOw0KLQ0KLSAgcmVnYWRkciA9ICgmRVhUSS0+U1dJRVIxICsgKEVYVElfQ09ORklHX09GRlNFVCAqIG9mZnNldCkpOw0KLSAgKnJlZ2FkZHIgPSBtYXNrbGluZTsNCi19DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLSNlbmRpZiAvKiBIQUxfRVhUSV9NT0RVTEVfRU5BQkxFRCAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnNHh4X2hhbF9leHRpLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEVYVEkgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgRXh0ZW5kZWQgSW50ZXJydXB0cyBhbmQgZXZlbnRzIGNvbnRyb2xsZXIKKyAgKEVYVEkpIHBlcmlwaGVyYWw6CisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBHZW5lcmFsIFB1cnBvc2UgSW5wdXQvT3V0cHV0IChFWFRJKQorICBwZXJpcGhlcmFsOgorICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0ZXJtcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlCisgICogaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc29mdHdhcmUgY29tcG9uZW50LgorICAqIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcyB3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICBAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICMjIyMjIEVYVEkgUGVyaXBoZXJhbCBmZWF0dXJlcyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgICgrKSBFYWNoIEV4dGkgbGluZSBjYW4gYmUgY29uZmlndXJlZCB3aXRoaW4gdGhpcyBkcml2ZXIuCisKKyAgICAoKykgRXh0aSBsaW5lIGNhbiBiZSBjb25maWd1cmVkIGluIDMgZGlmZmVyZW50IG1vZGVzCisgICAgICAgICgrKykgSW50ZXJydXB0CisgICAgICAgICgrKykgRXZlbnQKKyAgICAgICAgKCsrKSBCb3RoIG9mIHRoZW0KKworICAgICgrKSBDb25maWd1cmFibGUgRXh0aSBsaW5lcyBjYW4gYmUgY29uZmlndXJlZCB3aXRoIDMgZGlmZmVyZW50IHRyaWdnZXJzCisgICAgICAgICgrKykgUmlzaW5nCisgICAgICAgICgrKykgRmFsbGluZworICAgICAgICAoKyspIEJvdGggb2YgdGhlbQorCisgICAgKCspIFdoZW4gc2V0IGluIGludGVycnVwdCBtb2RlLCBjb25maWd1cmFibGUgRXh0aSBsaW5lcyBoYXZlIHR3byBkaWZmZXJlbnQKKyAgICAgICAgaW50ZXJydXB0IHBlbmRpbmcgcmVnaXN0ZXJzIHdoaWNoIGFsbG93IHRvIGRpc3Rpbmd1aXNoIHdoaWNoIHRyYW5zaXRpb24KKyAgICAgICAgb2NjdXJzOgorICAgICAgICAoKyspIFJpc2luZyBlZGdlIHBlbmRpbmcgaW50ZXJydXB0CisgICAgICAgICgrKykgRmFsbGluZworCisgICAgKCspIEV4dGkgbGluZXMgMCB0byAxNSBhcmUgbGlua2VkIHRvIGdwaW8gcGluIG51bWJlciAwIHRvIDE1LiBHcGlvIHBvcnQgY2FuCisgICAgICAgIGJlIHNlbGVjdGVkIHRocm91Z2ggbXVsdGlwbGV4ZXIuCisKKyAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKworICAgICgjKSBDb25maWd1cmUgdGhlIEVYVEkgbGluZSB1c2luZyBIQUxfRVhUSV9TZXRDb25maWdMaW5lKCkuCisgICAgICAgICgrKykgQ2hvb3NlIHRoZSBpbnRlcnJ1cHQgbGluZSBudW1iZXIgYnkgc2V0dGluZyAiTGluZSIgbWVtYmVyIGZyb20KKyAgICAgICAgICAgICBFWFRJX0NvbmZpZ1R5cGVEZWYgc3RydWN0dXJlLgorICAgICAgICAoKyspIENvbmZpZ3VyZSB0aGUgaW50ZXJydXB0IGFuZC9vciBldmVudCBtb2RlIHVzaW5nICJNb2RlIiBtZW1iZXIgZnJvbQorICAgICAgICAgICAgIEVYVElfQ29uZmlnVHlwZURlZiBzdHJ1Y3R1cmUuCisgICAgICAgICgrKykgRm9yIGNvbmZpZ3VyYWJsZSBsaW5lcywgY29uZmlndXJlIHJpc2luZyBhbmQvb3IgZmFsbGluZyB0cmlnZ2VyCisgICAgICAgICAgICAgIlRyaWdnZXIiIG1lbWJlciBmcm9tIEVYVElfQ29uZmlnVHlwZURlZiBzdHJ1Y3R1cmUuCisgICAgICAgICgrKykgRm9yIEV4dGkgbGluZXMgbGlua2VkIHRvIGdwaW8sIGNob29zZSBncGlvIHBvcnQgdXNpbmcgIkdQSU9TZWwiCisgICAgICAgICAgICAgbWVtYmVyIGZyb20gR1BJT19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUuCisKKyAgICAoIykgR2V0IGN1cnJlbnQgRXh0aSBjb25maWd1cmF0aW9uIG9mIGEgZGVkaWNhdGVkIGxpbmUgdXNpbmcKKyAgICAgICAgSEFMX0VYVElfR2V0Q29uZmlnTGluZSgpLgorICAgICAgICAoKyspIFByb3ZpZGUgZXhpdGluZyBoYW5kbGUgYXMgcGFyYW1ldGVyLgorICAgICAgICAoKyspIFByb3ZpZGUgcG9pbnRlciBvbiBFWFRJX0NvbmZpZ1R5cGVEZWYgc3RydWN0dXJlIGFzIHNlY29uZAorICBwYXJhbWV0ZXIuCisKKyAgICAoIykgQ2xlYXIgRXh0aSBjb25maWd1cmF0aW9uIG9mIGEgZGVkaWNhdGVkIGxpbmUgdXNpbmcKKyAgSEFMX0VYVElfQ2xlYXJDb25maWdMaW5lKCkuCisgICAgICAgICgrKykgUHJvdmlkZSBleGl0aW5nIGhhbmRsZSBhcyBwYXJhbWV0ZXIuCisKKyAgICAoIykgUmVnaXN0ZXIgY2FsbGJhY2sgdG8gdHJlYXQgRXh0aSBpbnRlcnJ1cHRzIHVzaW5nCisgIEhBTF9FWFRJX1JlZ2lzdGVyQ2FsbGJhY2soKS4KKyAgICAgICAgKCsrKSBQcm92aWRlIGV4aXRpbmcgaGFuZGxlIGFzIGZpcnN0IHBhcmFtZXRlci4KKyAgICAgICAgKCsrKSBQcm92aWRlIHdoaWNoIGNhbGxiYWNrIHdpbGwgYmUgcmVnaXN0ZXJlZCB1c2luZyBvbmUgdmFsdWUgZnJvbQorICAgICAgICAgICAgIEVYVElfQ2FsbGJhY2tJRFR5cGVEZWYuCisgICAgICAgICgrKykgUHJvdmlkZSBjYWxsYmFjayBmdW5jdGlvbiBwb2ludGVyLgorCisgICAgKCMpIEdldCBpbnRlcnJ1cHQgcGVuZGluZyBiaXQgdXNpbmcgSEFMX0VYVElfR2V0UGVuZGluZygpLgorCisgICAgKCMpIENsZWFyIGludGVycnVwdCBwZW5kaW5nIGJpdCB1c2luZyBIQUxfRVhUSV9DbGVhclBlbmRpbmcoKS4KKworICAgICgjKSBHZW5lcmF0ZSBzb2Z0d2FyZSBpbnRlcnJ1cHQgdXNpbmcgSEFMX0VYVElfR2VuZXJhdGVTV0koKS4KKworICBAZW5kdmVyYmF0aW0KKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmc0eHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkc0eHhfSEFMX0RyaXZlcgorICogQHsKKyAqLworCisvKiogQGFkZHRvZ3JvdXAgRVhUSQorICogQHsKKyAqLworLyoqIE1JU1JBIEM6MjAxMiBkZXZpYXRpb24gcnVsZSBoYXMgYmVlbiBncmFudGVkIGZvciBmb2xsb3dpbmcgcnVsZToKKyAqIFJ1bGUtMTguMV9iIC0gTWVkaXVtOiBBcnJheSBgRVhUSUNSJyAxc3Qgc3Vic2NyaXB0IGludGVydmFsIFswLDddIG1heSBiZSBvdXQKKyAqIG9mIGJvdW5kcyBbMCwzXSBpbiBmb2xsb3dpbmcgQVBJIDoKKyAqIEhBTF9FWFRJX1NldENvbmZpZ0xpbmUKKyAqIEhBTF9FWFRJX0dldENvbmZpZ0xpbmUKKyAqIEhBTF9FWFRJX0NsZWFyQ29uZmlnTGluZQorICovCisKKyNpZmRlZiBIQUxfRVhUSV9NT0RVTEVfRU5BQkxFRAorCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmVzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBFWFRJX1ByaXZhdGVfQ29uc3RhbnRzIEVYVEkgUHJpdmF0ZSBDb25zdGFudHMKKyAqIEB7CisgKi8KKyNkZWZpbmUgRVhUSV9NT0RFX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwOFUgLyogMHgyMDogb2Zmc2V0IGJldHdlZW4gTUNVIElNUi9FTVIgcmVnaXN0ZXJzIFwKKyAgICAgICAgICovCisjZGVmaW5lIEVYVElfQ09ORklHX09GRlNFVCBcCisgIDB4MDhVIC8qIDB4MjA6IG9mZnNldCBiZXR3ZWVuIE1DVSBSaXNpbmcvRmFsbGluZyBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAqLworLyoqCisgKiBAfQorICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAYWRkdG9ncm91cCBFWFRJX0V4cG9ydGVkX0Z1bmN0aW9ucworICogQHsKKyAqLworCisvKiogQGFkZHRvZ3JvdXAgRVhUSV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxCisgICogIEBicmllZiAgICBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICMjIyMjIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAqIEBicmllZiAgU2V0IGNvbmZpZ3VyYXRpb24gb2YgYSBkZWRpY2F0ZWQgRXh0aSBsaW5lLgorICogQHBhcmFtICBoZXh0aSBFeHRpIGhhbmRsZS4KKyAqIEBwYXJhbSAgcEV4dGlDb25maWcgUG9pbnRlciBvbiBFWFRJIGNvbmZpZ3VyYXRpb24gdG8gYmUgc2V0LgorICogQHJldHZhbCBIQUwgU3RhdHVzLgorICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRVhUSV9TZXRDb25maWdMaW5lKEVYVElfSGFuZGxlVHlwZURlZiAqaGV4dGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVElfQ29uZmlnVHlwZURlZiAqcEV4dGlDb25maWcpIHsKKyAgX19JTyB1aW50MzJfdCAqcmVnYWRkcjsKKyAgdWludDMyX3QgcmVndmFsOworICB1aW50MzJfdCBsaW5lcG9zOworICB1aW50MzJfdCBtYXNrbGluZTsKKyAgdWludDMyX3Qgb2Zmc2V0OworCisgIC8qIENoZWNrIG51bGwgcG9pbnRlciAqLworICBpZiAoKGhleHRpID09IE5VTEwpIHx8IChwRXh0aUNvbmZpZyA9PSBOVUxMKSkgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19FWFRJX0xJTkUocEV4dGlDb25maWctPkxpbmUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0VYVElfTU9ERShwRXh0aUNvbmZpZy0+TW9kZSkpOworCisgIC8qIEFzc2lnbiBsaW5lIG51bWJlciB0byBoYW5kbGUgKi8KKyAgaGV4dGktPkxpbmUgPSBwRXh0aUNvbmZpZy0+TGluZTsKKworICAvKiBDb21wdXRlIGxpbmUgcmVnaXN0ZXIgb2Zmc2V0ICovCisgIG9mZnNldCA9ICgocEV4dGlDb25maWctPkxpbmUgJiBFWFRJX1JFR19NQVNLKSA+PiBFWFRJX1JFR19TSElGVCk7CisgIC8qIENvbXB1dGUgbGluZSBwb3NpdGlvbiAqLworICBsaW5lcG9zID0gKHBFeHRpQ29uZmlnLT5MaW5lICYgRVhUSV9QSU5fTUFTSyk7CisgIC8qIENvbXB1dGUgbGluZSBtYXNrICovCisgIG1hc2tsaW5lID0gKDF1TCA8PCBsaW5lcG9zKTsKKworICAvKiBDb25maWd1cmUgdHJpZ2dlcnMgZm9yIGNvbmZpZ3VyYWJsZSBsaW5lcyAqLworICBpZiAoKHBFeHRpQ29uZmlnLT5MaW5lICYgRVhUSV9DT05GSUcpICE9IDB4MDB1KSB7CisgICAgYXNzZXJ0X3BhcmFtKElTX0VYVElfVFJJR0dFUihwRXh0aUNvbmZpZy0+VHJpZ2dlcikpOworCisgICAgLyogQ29uZmlndXJlIHJpc2luZyB0cmlnZ2VyICovCisgICAgcmVnYWRkciA9ICgmRVhUSS0+UlRTUjEgKyAoRVhUSV9DT05GSUdfT0ZGU0VUICogb2Zmc2V0KSk7CisgICAgcmVndmFsID0gKnJlZ2FkZHI7CisKKyAgICAvKiBNYXNrIG9yIHNldCBsaW5lICovCisgICAgaWYgKChwRXh0aUNvbmZpZy0+VHJpZ2dlciAmIEVYVElfVFJJR0dFUl9SSVNJTkcpICE9IDB4MDB1KSB7CisgICAgICByZWd2YWwgfD0gbWFza2xpbmU7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlZ3ZhbCAmPSB+bWFza2xpbmU7CisgICAgfQorCisgICAgLyogU3RvcmUgcmlzaW5nIHRyaWdnZXIgbW9kZSAqLworICAgICpyZWdhZGRyID0gcmVndmFsOworCisgICAgLyogQ29uZmlndXJlIGZhbGxpbmcgdHJpZ2dlciAqLworICAgIHJlZ2FkZHIgPSAoJkVYVEktPkZUU1IxICsgKEVYVElfQ09ORklHX09GRlNFVCAqIG9mZnNldCkpOworICAgIHJlZ3ZhbCA9ICpyZWdhZGRyOworCisgICAgLyogTWFzayBvciBzZXQgbGluZSAqLworICAgIGlmICgocEV4dGlDb25maWctPlRyaWdnZXIgJiBFWFRJX1RSSUdHRVJfRkFMTElORykgIT0gMHgwMHUpIHsKKyAgICAgIHJlZ3ZhbCB8PSBtYXNrbGluZTsKKyAgICB9IGVsc2UgeworICAgICAgcmVndmFsICY9IH5tYXNrbGluZTsKKyAgICB9CisKKyAgICAvKiBTdG9yZSBmYWxsaW5nIHRyaWdnZXIgbW9kZSAqLworICAgICpyZWdhZGRyID0gcmVndmFsOworCisgICAgLyogQ29uZmlndXJlIGdwaW8gcG9ydCBzZWxlY3Rpb24gaW4gY2FzZSBvZiBncGlvIGV4dGkgbGluZSAqLworICAgIGlmICgocEV4dGlDb25maWctPkxpbmUgJiBFWFRJX0dQSU8pID09IEVYVElfR1BJTykgeworICAgICAgYXNzZXJ0X3BhcmFtKElTX0VYVElfR1BJT19QT1JUKHBFeHRpQ29uZmlnLT5HUElPU2VsKSk7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfRVhUSV9HUElPX1BJTihsaW5lcG9zKSk7CisKKyAgICAgIHJlZ3ZhbCA9IFNZU0NGRy0+RVhUSUNSW2xpbmVwb3MgPj4gMnVdOworICAgICAgcmVndmFsICY9IH4oU1lTQ0ZHX0VYVElDUjFfRVhUSTAKKyAgICAgICAgICAgICAgICAgIDw8IChTWVNDRkdfRVhUSUNSMV9FWFRJMV9Qb3MgKiAobGluZXBvcyAmIDB4MDN1KSkpOworICAgICAgcmVndmFsIHw9IChwRXh0aUNvbmZpZy0+R1BJT1NlbAorICAgICAgICAgICAgICAgICA8PCAoU1lTQ0ZHX0VYVElDUjFfRVhUSTFfUG9zICogKGxpbmVwb3MgJiAweDAzdSkpKTsKKyAgICAgIFNZU0NGRy0+RVhUSUNSW2xpbmVwb3MgPj4gMnVdID0gcmVndmFsOworICAgIH0KKyAgfQorCisgIC8qIENvbmZpZ3VyZSBpbnRlcnJ1cHQgbW9kZSA6IHJlYWQgY3VycmVudCBtb2RlICovCisgIHJlZ2FkZHIgPSAoJkVYVEktPklNUjEgKyAoRVhUSV9NT0RFX09GRlNFVCAqIG9mZnNldCkpOworICByZWd2YWwgPSAqcmVnYWRkcjsKKworICAvKiBNYXNrIG9yIHNldCBsaW5lICovCisgIGlmICgocEV4dGlDb25maWctPk1vZGUgJiBFWFRJX01PREVfSU5URVJSVVBUKSAhPSAweDAwdSkgeworICAgIHJlZ3ZhbCB8PSBtYXNrbGluZTsKKyAgfSBlbHNlIHsKKyAgICByZWd2YWwgJj0gfm1hc2tsaW5lOworICB9CisKKyAgLyogU3RvcmUgaW50ZXJydXB0IG1vZGUgKi8KKyAgKnJlZ2FkZHIgPSByZWd2YWw7CisKKyAgLyogQ29uZmlndXJlIGV2ZW50IG1vZGUgOiByZWFkIGN1cnJlbnQgbW9kZSAqLworICByZWdhZGRyID0gKCZFWFRJLT5FTVIxICsgKEVYVElfTU9ERV9PRkZTRVQgKiBvZmZzZXQpKTsKKyAgcmVndmFsID0gKnJlZ2FkZHI7CisKKyAgLyogTWFzayBvciBzZXQgbGluZSAqLworICBpZiAoKHBFeHRpQ29uZmlnLT5Nb2RlICYgRVhUSV9NT0RFX0VWRU5UKSAhPSAweDAwdSkgeworICAgIHJlZ3ZhbCB8PSBtYXNrbGluZTsKKyAgfSBlbHNlIHsKKyAgICByZWd2YWwgJj0gfm1hc2tsaW5lOworICB9CisKKyAgLyogU3RvcmUgZXZlbnQgbW9kZSAqLworICAqcmVnYWRkciA9IHJlZ3ZhbDsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IGNvbmZpZ3VyYXRpb24gb2YgYSBkZWRpY2F0ZWQgRXh0aSBsaW5lLgorICogQHBhcmFtICBoZXh0aSBFeHRpIGhhbmRsZS4KKyAqIEBwYXJhbSAgcEV4dGlDb25maWcgUG9pbnRlciBvbiBzdHJ1Y3R1cmUgdG8gc3RvcmUgRXh0aSBjb25maWd1cmF0aW9uLgorICogQHJldHZhbCBIQUwgU3RhdHVzLgorICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRVhUSV9HZXRDb25maWdMaW5lKEVYVElfSGFuZGxlVHlwZURlZiAqaGV4dGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVElfQ29uZmlnVHlwZURlZiAqcEV4dGlDb25maWcpIHsKKyAgX19JTyB1aW50MzJfdCAqcmVnYWRkcjsKKyAgdWludDMyX3QgcmVndmFsOworICB1aW50MzJfdCBsaW5lcG9zOworICB1aW50MzJfdCBtYXNrbGluZTsKKyAgdWludDMyX3Qgb2Zmc2V0OworCisgIC8qIENoZWNrIG51bGwgcG9pbnRlciAqLworICBpZiAoKGhleHRpID09IE5VTEwpIHx8IChwRXh0aUNvbmZpZyA9PSBOVUxMKSkgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVyICovCisgIGFzc2VydF9wYXJhbShJU19FWFRJX0xJTkUoaGV4dGktPkxpbmUpKTsKKworICAvKiBTdG9yZSBoYW5kbGUgbGluZSBudW1iZXIgdG8gY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgKi8KKyAgcEV4dGlDb25maWctPkxpbmUgPSBoZXh0aS0+TGluZTsKKworICAvKiBDb21wdXRlIGxpbmUgcmVnaXN0ZXIgb2Zmc2V0IGFuZCBsaW5lIG1hc2sgKi8KKyAgb2Zmc2V0ID0gKChwRXh0aUNvbmZpZy0+TGluZSAmIEVYVElfUkVHX01BU0spID4+IEVYVElfUkVHX1NISUZUKTsKKyAgLyogQ29tcHV0ZSBsaW5lIHBvc2l0aW9uICovCisgIGxpbmVwb3MgPSAocEV4dGlDb25maWctPkxpbmUgJiBFWFRJX1BJTl9NQVNLKTsKKyAgLyogQ29tcHV0ZSBtYXNrICovCisgIG1hc2tsaW5lID0gKDF1TCA8PCBsaW5lcG9zKTsKKworICAvKiAxXSBHZXQgY29yZSBtb2RlIDogaW50ZXJydXB0ICovCisgIHJlZ2FkZHIgPSAoJkVYVEktPklNUjEgKyAoRVhUSV9NT0RFX09GRlNFVCAqIG9mZnNldCkpOworICByZWd2YWwgPSAqcmVnYWRkcjsKKworICAvKiBDaGVjayBpZiBzZWxlY3RlZCBsaW5lIGlzIGVuYWJsZSAqLworICBpZiAoKHJlZ3ZhbCAmIG1hc2tsaW5lKSAhPSAweDAwdSkgeworICAgIHBFeHRpQ29uZmlnLT5Nb2RlID0gRVhUSV9NT0RFX0lOVEVSUlVQVDsKKyAgfSBlbHNlIHsKKyAgICBwRXh0aUNvbmZpZy0+TW9kZSA9IEVYVElfTU9ERV9OT05FOworICB9CisKKyAgLyogR2V0IGV2ZW50IG1vZGUgKi8KKyAgcmVnYWRkciA9ICgmRVhUSS0+RU1SMSArIChFWFRJX01PREVfT0ZGU0VUICogb2Zmc2V0KSk7CisgIHJlZ3ZhbCA9ICpyZWdhZGRyOworCisgIC8qIENoZWNrIGlmIHNlbGVjdGVkIGxpbmUgaXMgZW5hYmxlICovCisgIGlmICgocmVndmFsICYgbWFza2xpbmUpICE9IDB4MDB1KSB7CisgICAgcEV4dGlDb25maWctPk1vZGUgfD0gRVhUSV9NT0RFX0VWRU5UOworICB9CisKKyAgLyogR2V0IGRlZmF1bHQgVHJpZ2dlciBhbmQgR1BJT1NlbCBjb25maWd1cmF0aW9uICovCisgIHBFeHRpQ29uZmlnLT5UcmlnZ2VyID0gRVhUSV9UUklHR0VSX05PTkU7CisgIHBFeHRpQ29uZmlnLT5HUElPU2VsID0gMHgwMHU7CisKKyAgLyogMl0gR2V0IHRyaWdnZXIgZm9yIGNvbmZpZ3VyYWJsZSBsaW5lcyA6IHJpc2luZyAqLworICBpZiAoKHBFeHRpQ29uZmlnLT5MaW5lICYgRVhUSV9DT05GSUcpICE9IDB4MDB1KSB7CisgICAgcmVnYWRkciA9ICgmRVhUSS0+UlRTUjEgKyAoRVhUSV9DT05GSUdfT0ZGU0VUICogb2Zmc2V0KSk7CisgICAgcmVndmFsID0gKnJlZ2FkZHI7CisKKyAgICAvKiBDaGVjayBpZiBjb25maWd1cmF0aW9uIG9mIHNlbGVjdGVkIGxpbmUgaXMgZW5hYmxlICovCisgICAgaWYgKChyZWd2YWwgJiBtYXNrbGluZSkgIT0gMHgwMHUpIHsKKyAgICAgIHBFeHRpQ29uZmlnLT5UcmlnZ2VyID0gRVhUSV9UUklHR0VSX1JJU0lORzsKKyAgICB9CisKKyAgICAvKiBHZXQgZmFsbGluZyBjb25maWd1cmF0aW9uICovCisgICAgcmVnYWRkciA9ICgmRVhUSS0+RlRTUjEgKyAoRVhUSV9DT05GSUdfT0ZGU0VUICogb2Zmc2V0KSk7CisgICAgcmVndmFsID0gKnJlZ2FkZHI7CisKKyAgICAvKiBDaGVjayBpZiBjb25maWd1cmF0aW9uIG9mIHNlbGVjdGVkIGxpbmUgaXMgZW5hYmxlICovCisgICAgaWYgKChyZWd2YWwgJiBtYXNrbGluZSkgIT0gMHgwMHUpIHsKKyAgICAgIHBFeHRpQ29uZmlnLT5UcmlnZ2VyIHw9IEVYVElfVFJJR0dFUl9GQUxMSU5HOworICAgIH0KKworICAgIC8qIEdldCBHcGlvIHBvcnQgc2VsZWN0aW9uIGZvciBncGlvIGxpbmVzICovCisgICAgaWYgKChwRXh0aUNvbmZpZy0+TGluZSAmIEVYVElfR1BJTykgPT0gRVhUSV9HUElPKSB7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfRVhUSV9HUElPX1BJTihsaW5lcG9zKSk7CisKKyAgICAgIHJlZ3ZhbCA9IFNZU0NGRy0+RVhUSUNSW2xpbmVwb3MgPj4gMnVdOworICAgICAgcEV4dGlDb25maWctPkdQSU9TZWwgPQorICAgICAgICAgIChyZWd2YWwgPj4gKFNZU0NGR19FWFRJQ1IxX0VYVEkxX1BvcyAqIChsaW5lcG9zICYgMHgwM3UpKSkgJgorICAgICAgICAgIFNZU0NGR19FWFRJQ1IxX0VYVEkwOworICAgIH0KKyAgfQorCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICogQGJyaWVmICBDbGVhciB3aG9sZSBjb25maWd1cmF0aW9uIG9mIGEgZGVkaWNhdGVkIEV4dGkgbGluZS4KKyAqIEBwYXJhbSAgaGV4dGkgRXh0aSBoYW5kbGUuCisgKiBAcmV0dmFsIEhBTCBTdGF0dXMuCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9FWFRJX0NsZWFyQ29uZmlnTGluZShFWFRJX0hhbmRsZVR5cGVEZWYgKmhleHRpKSB7CisgIF9fSU8gdWludDMyX3QgKnJlZ2FkZHI7CisgIHVpbnQzMl90IHJlZ3ZhbDsKKyAgdWludDMyX3QgbGluZXBvczsKKyAgdWludDMyX3QgbWFza2xpbmU7CisgIHVpbnQzMl90IG9mZnNldDsKKworICAvKiBDaGVjayBudWxsIHBvaW50ZXIgKi8KKyAgaWYgKGhleHRpID09IE5VTEwpIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlciAqLworICBhc3NlcnRfcGFyYW0oSVNfRVhUSV9MSU5FKGhleHRpLT5MaW5lKSk7CisKKyAgLyogY29tcHV0ZSBsaW5lIHJlZ2lzdGVyIG9mZnNldCBhbmQgbGluZSBtYXNrICovCisgIG9mZnNldCA9ICgoaGV4dGktPkxpbmUgJiBFWFRJX1JFR19NQVNLKSA+PiBFWFRJX1JFR19TSElGVCk7CisgIC8qIGNvbXB1dGUgbGluZSBwb3NpdGlvbiAqLworICBsaW5lcG9zID0gKGhleHRpLT5MaW5lICYgRVhUSV9QSU5fTUFTSyk7CisgIC8qIGNvbXB1dGUgbGluZSBtYXNrICovCisgIG1hc2tsaW5lID0gKDF1TCA8PCBsaW5lcG9zKTsKKworICAvKiAxXSBDbGVhciBpbnRlcnJ1cHQgbW9kZSAqLworICByZWdhZGRyID0gKCZFWFRJLT5JTVIxICsgKEVYVElfTU9ERV9PRkZTRVQgKiBvZmZzZXQpKTsKKyAgcmVndmFsID0gKCpyZWdhZGRyICYgfm1hc2tsaW5lKTsKKyAgKnJlZ2FkZHIgPSByZWd2YWw7CisKKyAgLyogMl0gQ2xlYXIgZXZlbnQgbW9kZSAqLworICByZWdhZGRyID0gKCZFWFRJLT5FTVIxICsgKEVYVElfTU9ERV9PRkZTRVQgKiBvZmZzZXQpKTsKKyAgcmVndmFsID0gKCpyZWdhZGRyICYgfm1hc2tsaW5lKTsKKyAgKnJlZ2FkZHIgPSByZWd2YWw7CisKKyAgLyogM10gQ2xlYXIgdHJpZ2dlcnMgaW4gY2FzZSBvZiBjb25maWd1cmFibGUgbGluZXMgKi8KKyAgaWYgKChoZXh0aS0+TGluZSAmIEVYVElfQ09ORklHKSAhPSAweDAwdSkgeworICAgIHJlZ2FkZHIgPSAoJkVYVEktPlJUU1IxICsgKEVYVElfQ09ORklHX09GRlNFVCAqIG9mZnNldCkpOworICAgIHJlZ3ZhbCA9ICgqcmVnYWRkciAmIH5tYXNrbGluZSk7CisgICAgKnJlZ2FkZHIgPSByZWd2YWw7CisKKyAgICByZWdhZGRyID0gKCZFWFRJLT5GVFNSMSArIChFWFRJX0NPTkZJR19PRkZTRVQgKiBvZmZzZXQpKTsKKyAgICByZWd2YWwgPSAoKnJlZ2FkZHIgJiB+bWFza2xpbmUpOworICAgICpyZWdhZGRyID0gcmVndmFsOworCisgICAgLyogR2V0IEdwaW8gcG9ydCBzZWxlY3Rpb24gZm9yIGdwaW8gbGluZXMgKi8KKyAgICBpZiAoKGhleHRpLT5MaW5lICYgRVhUSV9HUElPKSA9PSBFWFRJX0dQSU8pIHsKKyAgICAgIGFzc2VydF9wYXJhbShJU19FWFRJX0dQSU9fUElOKGxpbmVwb3MpKTsKKworICAgICAgcmVndmFsID0gU1lTQ0ZHLT5FWFRJQ1JbbGluZXBvcyA+PiAydV07CisgICAgICByZWd2YWwgJj0gfihTWVNDRkdfRVhUSUNSMV9FWFRJMAorICAgICAgICAgICAgICAgICAgPDwgKFNZU0NGR19FWFRJQ1IxX0VYVEkxX1BvcyAqIChsaW5lcG9zICYgMHgwM3UpKSk7CisgICAgICBTWVNDRkctPkVYVElDUltsaW5lcG9zID4+IDJ1XSA9IHJlZ3ZhbDsKKyAgICB9CisgIH0KKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiAgUmVnaXN0ZXIgY2FsbGJhY2sgZm9yIGEgZGVkaWNhdGVkIEV4dGkgbGluZS4KKyAqIEBwYXJhbSAgaGV4dGkgRXh0aSBoYW5kbGUuCisgKiBAcGFyYW0gIENhbGxiYWNrSUQgVXNlciBjYWxsYmFjayBpZGVudGlmaWVyLgorICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIEBhcmcgQHJlZiBFWFRJX0NhbGxiYWNrSURUeXBlRGVmIHZhbHVlcy4KKyAqIEBwYXJhbSAgcFBlbmRpbmdDYmZuIGZ1bmN0aW9uIHBvaW50ZXIgdG8gYmUgc3RvcmVkIGFzIGNhbGxiYWNrLgorICogQHJldHZhbCBIQUwgU3RhdHVzLgorICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRVhUSV9SZWdpc3RlckNhbGxiYWNrKEVYVElfSGFuZGxlVHlwZURlZiAqaGV4dGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVElfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKnBQZW5kaW5nQ2Jmbikodm9pZCkpIHsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19FWFRJX0NCKENhbGxiYWNrSUQpKTsKKworICBzd2l0Y2ggKENhbGxiYWNrSUQpIHsKKyAgICAvKiBzZXQgY29tbW9uIGNhbGxiYWNrICovCisgICAgY2FzZSBIQUxfRVhUSV9DT01NT05fQ0JfSUQ6CisgICAgICBoZXh0aS0+UGVuZGluZ0NhbGxiYWNrID0gcFBlbmRpbmdDYmZuOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgaGV4dGktPlBlbmRpbmdDYWxsYmFjayA9IE5VTEw7CisgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogQGJyaWVmICBTdG9yZSBsaW5lIG51bWJlciBhcyBoYW5kbGUgcHJpdmF0ZSBmaWVsZC4KKyAqIEBwYXJhbSAgaGV4dGkgRXh0aSBoYW5kbGUuCisgKiBAcGFyYW0gIEV4dGlMaW5lIEV4dGkgbGluZSBudW1iZXIuCisgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBmcm9tIDAgdG8gQHJlZiBFWFRJX0xJTkVfTkIuCisgKiBAcmV0dmFsIEhBTCBTdGF0dXMuCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9FWFRJX0dldEhhbmRsZShFWFRJX0hhbmRsZVR5cGVEZWYgKmhleHRpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEV4dGlMaW5lKSB7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19FWFRJX0xJTkUoRXh0aUxpbmUpKTsKKworICAvKiBDaGVjayBudWxsIHBvaW50ZXIgKi8KKyAgaWYgKGhleHRpID09IE5VTEwpIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9IGVsc2UgeworICAgIC8qIFN0b3JlIGxpbmUgbnVtYmVyIGFzIGhhbmRsZSBwcml2YXRlIGZpZWxkICovCisgICAgaGV4dGktPkxpbmUgPSBFeHRpTGluZTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KK30KKworLyoqCisgKiBAfQorICovCisKKy8qKiBAYWRkdG9ncm91cCBFWFRJX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIKKyAgKiAgQGJyaWVmIEVYVEkgSU8gZnVuY3Rpb25zLgorICAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICogQGJyaWVmICBIYW5kbGUgRVhUSSBpbnRlcnJ1cHQgcmVxdWVzdC4KKyAqIEBwYXJhbSAgaGV4dGkgRXh0aSBoYW5kbGUuCisgKiBAcmV0dmFsIG5vbmUuCisgKi8KK3ZvaWQgSEFMX0VYVElfSVJRSGFuZGxlcihFWFRJX0hhbmRsZVR5cGVEZWYgKmhleHRpKSB7CisgIF9fSU8gdWludDMyX3QgKnJlZ2FkZHI7CisgIHVpbnQzMl90IHJlZ3ZhbDsKKyAgdWludDMyX3QgbWFza2xpbmU7CisgIHVpbnQzMl90IG9mZnNldDsKKworICAvKiBDb21wdXRlIGxpbmUgcmVnaXN0ZXIgb2Zmc2V0ICovCisgIG9mZnNldCA9ICgoaGV4dGktPkxpbmUgJiBFWFRJX1JFR19NQVNLKSA+PiBFWFRJX1JFR19TSElGVCk7CisgIC8qIGNvbXB1dGUgbGluZSBtYXNrICovCisgIG1hc2tsaW5lID0gKDF1TCA8PCAoaGV4dGktPkxpbmUgJiBFWFRJX1BJTl9NQVNLKSk7CisKKyAgLyogR2V0IHBlbmRpbmcgYml0ICAqLworICByZWdhZGRyID0gKCZFWFRJLT5QUjEgKyAoRVhUSV9DT05GSUdfT0ZGU0VUICogb2Zmc2V0KSk7CisgIHJlZ3ZhbCA9ICgqcmVnYWRkciAmIG1hc2tsaW5lKTsKKworICBpZiAocmVndmFsICE9IDB4MDB1KSB7CisgICAgLyogQ2xlYXIgcGVuZGluZyBiaXQgKi8KKyAgICAqcmVnYWRkciA9IG1hc2tsaW5lOworCisgICAgLyogQ2FsbCBwZW5kaW5nIGNhbGxiYWNrICovCisgICAgaWYgKGhleHRpLT5QZW5kaW5nQ2FsbGJhY2sgIT0gTlVMTCkgeworICAgICAgaGV4dGktPlBlbmRpbmdDYWxsYmFjaygpOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIEBicmllZiAgR2V0IGludGVycnVwdCBwZW5kaW5nIGJpdCBvZiBhIGRlZGljYXRlZCBsaW5lLgorICogQHBhcmFtICBoZXh0aSBFeHRpIGhhbmRsZS4KKyAqIEBwYXJhbSAgRWRnZSB1bnVzZWQKKyAqIEByZXR2YWwgMSBpZiBpbnRlcnJ1cHQgaXMgcGVuZGluZyBlbHNlIDAuCisgKi8KK3VpbnQzMl90IEhBTF9FWFRJX0dldFBlbmRpbmcoRVhUSV9IYW5kbGVUeXBlRGVmICpoZXh0aSwgdWludDMyX3QgRWRnZSkgeworICBfX0lPIHVpbnQzMl90ICpyZWdhZGRyOworICB1aW50MzJfdCByZWd2YWw7CisgIHVpbnQzMl90IGxpbmVwb3M7CisgIHVpbnQzMl90IG1hc2tsaW5lOworICB1aW50MzJfdCBvZmZzZXQ7CisKKyAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfRVhUSV9MSU5FKGhleHRpLT5MaW5lKSk7CisgIGFzc2VydF9wYXJhbShJU19FWFRJX0NPTkZJR19MSU5FKGhleHRpLT5MaW5lKSk7CisgIFVOVVNFRChFZGdlKTsKKworICAvKiBDb21wdXRlIGxpbmUgcmVnaXN0ZXIgb2Zmc2V0ICovCisgIG9mZnNldCA9ICgoaGV4dGktPkxpbmUgJiBFWFRJX1JFR19NQVNLKSA+PiBFWFRJX1JFR19TSElGVCk7CisgIC8qIENvbXB1dGUgbGluZSBwb3NpdGlvbiAqLworICBsaW5lcG9zID0gKGhleHRpLT5MaW5lICYgRVhUSV9QSU5fTUFTSyk7CisgIC8qIENvbXB1dGUgbGluZSBtYXNrICovCisgIG1hc2tsaW5lID0gKDF1TCA8PCBsaW5lcG9zKTsKKworICAvKiBHZXQgcGVuZGluZyBiaXQgKi8KKyAgcmVnYWRkciA9ICgmRVhUSS0+UFIxICsgKEVYVElfQ09ORklHX09GRlNFVCAqIG9mZnNldCkpOworCisgIC8qIHJldHVybiAxIGlmIGJpdCBpcyBzZXQgZWxzZSAwICovCisgIHJlZ3ZhbCA9ICgoKnJlZ2FkZHIgJiBtYXNrbGluZSkgPj4gbGluZXBvcyk7CisgIHJldHVybiByZWd2YWw7Cit9CisKKy8qKgorICogQGJyaWVmICBDbGVhciBpbnRlcnJ1cHQgcGVuZGluZyBiaXQgb2YgYSBkZWRpY2F0ZWQgbGluZS4KKyAqIEBwYXJhbSAgaGV4dGkgRXh0aSBoYW5kbGUuCisgKiBAcGFyYW0gIEVkZ2UgdW51c2VkCisgKiBAcmV0dmFsIE5vbmUuCisgKi8KK3ZvaWQgSEFMX0VYVElfQ2xlYXJQZW5kaW5nKEVYVElfSGFuZGxlVHlwZURlZiAqaGV4dGksIHVpbnQzMl90IEVkZ2UpIHsKKyAgX19JTyB1aW50MzJfdCAqcmVnYWRkcjsKKyAgdWludDMyX3QgbWFza2xpbmU7CisgIHVpbnQzMl90IG9mZnNldDsKKworICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19FWFRJX0xJTkUoaGV4dGktPkxpbmUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0VYVElfQ09ORklHX0xJTkUoaGV4dGktPkxpbmUpKTsKKyAgVU5VU0VEKEVkZ2UpOworCisgIC8qIENvbXB1dGUgbGluZSByZWdpc3RlciBvZmZzZXQgKi8KKyAgb2Zmc2V0ID0gKChoZXh0aS0+TGluZSAmIEVYVElfUkVHX01BU0spID4+IEVYVElfUkVHX1NISUZUKTsKKyAgLyogQ29tcHV0ZSBsaW5lIG1hc2sgKi8KKyAgbWFza2xpbmUgPSAoMXVMIDw8IChoZXh0aS0+TGluZSAmIEVYVElfUElOX01BU0spKTsKKworICAvKiBHZXQgcGVuZGluZyByZWdpc3RlciBhZGRyZXNzICovCisgIHJlZ2FkZHIgPSAoJkVYVEktPlBSMSArIChFWFRJX0NPTkZJR19PRkZTRVQgKiBvZmZzZXQpKTsKKworICAvKiBDbGVhciBQZW5kaW5nIGJpdCAqLworICAqcmVnYWRkciA9IG1hc2tsaW5lOworfQorCisvKioKKyAqIEBicmllZiAgR2VuZXJhdGUgYSBzb2Z0d2FyZSBpbnRlcnJ1cHQgZm9yIGEgZGVkaWNhdGVkIGxpbmUuCisgKiBAcGFyYW0gIGhleHRpIEV4dGkgaGFuZGxlLgorICogQHJldHZhbCBOb25lLgorICovCit2b2lkIEhBTF9FWFRJX0dlbmVyYXRlU1dJKEVYVElfSGFuZGxlVHlwZURlZiAqaGV4dGkpIHsKKyAgX19JTyB1aW50MzJfdCAqcmVnYWRkcjsKKyAgdWludDMyX3QgbWFza2xpbmU7CisgIHVpbnQzMl90IG9mZnNldDsKKworICAvKiBDaGVjayBwYXJhbWV0ZXIgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0VYVElfTElORShoZXh0aS0+TGluZSkpOworICBhc3NlcnRfcGFyYW0oSVNfRVhUSV9DT05GSUdfTElORShoZXh0aS0+TGluZSkpOworCisgIC8qIGNvbXB1dGUgbGluZSByZWdpc3RlciBvZmZzZXQgKi8KKyAgb2Zmc2V0ID0gKChoZXh0aS0+TGluZSAmIEVYVElfUkVHX01BU0spID4+IEVYVElfUkVHX1NISUZUKTsKKyAgLyogY29tcHV0ZSBsaW5lIG1hc2sgKi8KKyAgbWFza2xpbmUgPSAoMXVMIDw8IChoZXh0aS0+TGluZSAmIEVYVElfUElOX01BU0spKTsKKworICByZWdhZGRyID0gKCZFWFRJLT5TV0lFUjEgKyAoRVhUSV9DT05GSUdfT0ZGU0VUICogb2Zmc2V0KSk7CisgICpyZWdhZGRyID0gbWFza2xpbmU7Cit9CisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworI2VuZGlmIC8qIEhBTF9FWFRJX01PRFVMRV9FTkFCTEVEICovCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCmRpZmYgLS1naXQgYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfZmRjYW4uYyBiL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9mZGNhbi5jCmluZGV4IDgzNWVkYjMuLjU0YTRmOTEgMTAwNjQ0Ci0tLSBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9mZGNhbi5jCisrKyBiL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9mZGNhbi5jCkBAIC0xLDM0MDUgKzEsMzQzNSBAQAotLyoqDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICogQGZpbGUgICAgc3RtMzJnNHh4X2hhbF9mZGNhbi5jDQotICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtDQotICAqIEBicmllZiAgIEZEQ0FOIEhBTCBtb2R1bGUgZHJpdmVyLg0KLSAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nDQotICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgRmxleGlibGUgRGF0YVJhdGUgQ29udHJvbGxlciBBcmVhIE5ldHdvcmsNCi0gICogICAgICAgICAgKEZEQ0FOKSBwZXJpcGhlcmFsOg0KLSAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zDQotICAqICAgICAgICAgICArIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMNCi0gICogICAgICAgICAgICsgUGVyaXBoZXJhbCBDb25maWd1cmF0aW9uIGFuZCBDb250cm9sIGZ1bmN0aW9ucw0KLSAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvciBmdW5jdGlvbnMNCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgKiBAYXR0ZW50aW9uDQotICAqDQotICAqIENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuDQotICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQotICAqDQotICAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGVybXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZQ0KLSAgKiBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb2Z0d2FyZSBjb21wb25lbnQuDQotICAqIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcyB3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLg0KLSAgKg0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICBAdmVyYmF0aW0NCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMNCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICBbLi5dDQotICAgICAgKCMpIEluaXRpYWxpemUgdGhlIEZEQ0FOIHBlcmlwaGVyYWwgdXNpbmcgSEFMX0ZEQ0FOX0luaXQgZnVuY3Rpb24uDQotDQotICAgICAgKCMpIElmIG5lZWRlZCAsIGNvbmZpZ3VyZSB0aGUgcmVjZXB0aW9uIGZpbHRlcnMgYW5kIG9wdGlvbmFsIGZlYXR1cmVzDQotICB1c2luZyB0aGUgZm9sbG93aW5nIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb25zOg0KLSAgICAgICAgICAgICgrKykgSEFMX0ZEQ0FOX0NvbmZpZ0ZpbHRlcg0KLSAgICAgICAgICAgICgrKykgSEFMX0ZEQ0FOX0NvbmZpZ0dsb2JhbEZpbHRlcg0KLSAgICAgICAgICAgICgrKykgSEFMX0ZEQ0FOX0NvbmZpZ0V4dGVuZGVkSWRNYXNrDQotICAgICAgICAgICAgKCsrKSBIQUxfRkRDQU5fQ29uZmlnUnhGaWZvT3ZlcndyaXRlDQotICAgICAgICAgICAgKCsrKSBIQUxfRkRDQU5fQ29uZmlnUmFtV2F0Y2hkb2cNCi0gICAgICAgICAgICAoKyspIEhBTF9GRENBTl9Db25maWdUaW1lc3RhbXBDb3VudGVyDQotICAgICAgICAgICAgKCsrKSBIQUxfRkRDQU5fRW5hYmxlVGltZXN0YW1wQ291bnRlcg0KLSAgICAgICAgICAgICgrKykgSEFMX0ZEQ0FOX0Rpc2FibGVUaW1lc3RhbXBDb3VudGVyDQotICAgICAgICAgICAgKCsrKSBIQUxfRkRDQU5fQ29uZmlnVGltZW91dENvdW50ZXINCi0gICAgICAgICAgICAoKyspIEhBTF9GRENBTl9FbmFibGVUaW1lb3V0Q291bnRlcg0KLSAgICAgICAgICAgICgrKykgSEFMX0ZEQ0FOX0Rpc2FibGVUaW1lb3V0Q291bnRlcg0KLSAgICAgICAgICAgICgrKykgSEFMX0ZEQ0FOX0NvbmZpZ1R4RGVsYXlDb21wZW5zYXRpb24NCi0gICAgICAgICAgICAoKyspIEhBTF9GRENBTl9FbmFibGVUeERlbGF5Q29tcGVuc2F0aW9uDQotICAgICAgICAgICAgKCsrKSBIQUxfRkRDQU5fRGlzYWJsZVR4RGVsYXlDb21wZW5zYXRpb24NCi0gICAgICAgICAgICAoKyspIEhBTF9GRENBTl9FbmFibGVJU09Nb2RlDQotICAgICAgICAgICAgKCsrKSBIQUxfRkRDQU5fRGlzYWJsZUlTT01vZGUNCi0gICAgICAgICAgICAoKyspIEhBTF9GRENBTl9FbmFibGVFZGdlRmlsdGVyaW5nDQotICAgICAgICAgICAgKCsrKSBIQUxfRkRDQU5fRGlzYWJsZUVkZ2VGaWx0ZXJpbmcNCi0NCi0gICAgICAoIykgU3RhcnQgdGhlIEZEQ0FOIG1vZHVsZSB1c2luZyBIQUxfRkRDQU5fU3RhcnQgZnVuY3Rpb24uIEF0IHRoaXMgbGV2ZWwNCi0gICAgICAgICAgdGhlIG5vZGUgaXMgYWN0aXZlIG9uIHRoZSBidXM6IGl0IGNhbiBzZW5kIGFuZCByZWNlaXZlIG1lc3NhZ2VzLg0KLQ0KLSAgICAgICgjKSBUaGUgZm9sbG93aW5nIFR4IGNvbnRyb2wgZnVuY3Rpb25zIGNhbiBvbmx5IGJlIGNhbGxlZCB3aGVuIHRoZSBGRENBTg0KLSAgICAgICAgICBtb2R1bGUgaXMgc3RhcnRlZDoNCi0gICAgICAgICAgICAoKyspIEhBTF9GRENBTl9BZGRNZXNzYWdlVG9UeEZpZm9RDQotICAgICAgICAgICAgKCsrKSBIQUxfRkRDQU5fQWJvcnRUeFJlcXVlc3QNCi0NCi0gICAgICAoIykgQWZ0ZXIgaGF2aW5nIHN1Ym1pdHRlZCBhIFR4IHJlcXVlc3QgaW4gVHggRmlmbyBvciBRdWV1ZSwgaXQgaXMNCi0gIHBvc3NpYmxlIHRvIGdldCBUeCBidWZmZXIgbG9jYXRpb24gdXNlZCB0byBwbGFjZSB0aGUgVHggcmVxdWVzdCB0aGFua3MgdG8NCi0gICAgICAgICAgSEFMX0ZEQ0FOX0dldExhdGVzdFR4Rmlmb1FSZXF1ZXN0QnVmZmVyIEFQSS4NCi0gICAgICAgICAgSXQgaXMgdGhlbiBwb3NzaWJsZSB0byBhYm9ydCBsYXRlciBvbiB0aGUgY29ycmVzcG9uZGluZyBUeCBSZXF1ZXN0DQotICB1c2luZyBIQUxfRkRDQU5fQWJvcnRUeFJlcXVlc3QgQVBJLg0KLQ0KLSAgICAgICgjKSBXaGVuIGEgbWVzc2FnZSBpcyByZWNlaXZlZCBpbnRvIHRoZSBGRENBTiBtZXNzYWdlIFJBTSwgaXQgY2FuIGJlDQotICAgICAgICAgIHJldHJpZXZlZCB1c2luZyB0aGUgSEFMX0ZEQ0FOX0dldFJ4TWVzc2FnZSBmdW5jdGlvbi4NCi0NCi0gICAgICAoIykgQ2FsbGluZyB0aGUgSEFMX0ZEQ0FOX1N0b3AgZnVuY3Rpb24gc3RvcHMgdGhlIEZEQ0FOIG1vZHVsZSBieSBlbnRlcmluZw0KLSAgICAgICAgICBpdCB0byBpbml0aWFsaXphdGlvbiBtb2RlIGFuZCByZS1lbmFibGluZyBhY2Nlc3MgdG8gY29uZmlndXJhdGlvbg0KLSAgICAgICAgICByZWdpc3RlcnMgdGhyb3VnaCB0aGUgY29uZmlndXJhdGlvbiBmdW5jdGlvbnMgbGlzdGVkIGhlcmUgYWJvdmUuDQotDQotICAgICAgKCMpIEFsbCBvdGhlciBjb250cm9sIGZ1bmN0aW9ucyBjYW4gYmUgY2FsbGVkIGFueSB0aW1lIGFmdGVyDQotICBpbml0aWFsaXphdGlvbiBwaGFzZSwgbm8gbWF0dGVyIGlmIHRoZSBGRENBTiBtb2R1bGUgaXMgc3RhcnRlZCBvciBzdG9wcGVkLg0KLQ0KLSAgICAgICoqKiBQb2xsaW5nIG1vZGUgb3BlcmF0aW9uICoqKg0KLSAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICBbLi5dDQotICAgICAgICAoIykgUmVjZXB0aW9uIGFuZCB0cmFuc21pc3Npb24gc3RhdGVzIGNhbiBiZSBtb25pdG9yZWQgdmlhIHRoZSBmb2xsb3dpbmcNCi0gICAgICAgICAgICBmdW5jdGlvbnM6DQotICAgICAgICAgICAgICAoKyspIEhBTF9GRENBTl9Jc1R4QnVmZmVyTWVzc2FnZVBlbmRpbmcNCi0gICAgICAgICAgICAgICgrKykgSEFMX0ZEQ0FOX0dldFJ4Rmlmb0ZpbGxMZXZlbA0KLSAgICAgICAgICAgICAgKCsrKSBIQUxfRkRDQU5fR2V0VHhGaWZvRnJlZUxldmVsDQotDQotICAgICAgKioqIEludGVycnVwdCBtb2RlIG9wZXJhdGlvbiAqKioNCi0gICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICAgIFsuLl0NCi0gICAgICAgICgjKSBUaGVyZSBhcmUgdHdvIGludGVycnVwdCBsaW5lczogbGluZSAwIGFuZCAxLg0KLSAgICAgICAgICAgIEJ5IGRlZmF1bHQsIGFsbCBpbnRlcnJ1cHRzIGFyZSBhc3NpZ25lZCB0byBsaW5lIDAuIEludGVycnVwdCBsaW5lcw0KLSAgICAgICAgICAgIGNhbiBiZSBjb25maWd1cmVkIHVzaW5nIEhBTF9GRENBTl9Db25maWdJbnRlcnJ1cHRMaW5lcyBmdW5jdGlvbi4NCi0NCi0gICAgICAgICgjKSBOb3RpZmljYXRpb25zIGFyZSBhY3RpdmF0ZWQgdXNpbmcgSEFMX0ZEQ0FOX0FjdGl2YXRlTm90aWZpY2F0aW9uDQotICAgICAgICAgICAgZnVuY3Rpb24uIFRoZW4sIHRoZSBwcm9jZXNzIGNhbiBiZSBjb250cm9sbGVkIHRocm91Z2ggb25lIG9mIHRoZQ0KLSAgICAgICAgICAgIGF2YWlsYWJsZSB1c2VyIGNhbGxiYWNrczogSEFMX0ZEQ0FOX3h4eENhbGxiYWNrLg0KLQ0KLSAgKioqIENhbGxiYWNrIHJlZ2lzdHJhdGlvbiAqKioNCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLSAgVGhlIGNvbXBpbGF0aW9uIGRlZmluZSAgVVNFX0hBTF9GRENBTl9SRUdJU1RFUl9DQUxMQkFDS1Mgd2hlbiBzZXQgdG8gMQ0KLSAgYWxsb3dzIHRoZSB1c2VyIHRvIGNvbmZpZ3VyZSBkeW5hbWljYWxseSB0aGUgZHJpdmVyIGNhbGxiYWNrcy4NCi0gIFVzZSBGdW5jdGlvbiBIQUxfRkRDQU5fUmVnaXN0ZXJDYWxsYmFjaygpIG9yIEhBTF9GRENBTl9SZWdpc3RlclhYWENhbGxiYWNrKCkNCi0gIHRvIHJlZ2lzdGVyIGFuIGludGVycnVwdCBjYWxsYmFjay4NCi0NCi0gIEZ1bmN0aW9uIEhBTF9GRENBTl9SZWdpc3RlckNhbGxiYWNrKCkgYWxsb3dzIHRvIHJlZ2lzdGVyIGZvbGxvd2luZyBjYWxsYmFja3M6DQotICAgICgrKSBUeEZpZm9FbXB0eUNhbGxiYWNrICAgICAgICAgIDogVHggRmlmbyBFbXB0eSBDYWxsYmFjay4NCi0gICAgKCspIEhpZ2hQcmlvcml0eU1lc3NhZ2VDYWxsYmFjayAgOiBIaWdoIFByaW9yaXR5IE1lc3NhZ2UgQ2FsbGJhY2suDQotICAgICgrKSBUaW1lc3RhbXBXcmFwYXJvdW5kQ2FsbGJhY2sgIDogVGltZXN0YW1wIFdyYXBhcm91bmQgQ2FsbGJhY2suDQotICAgICgrKSBUaW1lb3V0T2NjdXJyZWRDYWxsYmFjayAgICAgIDogVGltZW91dCBPY2N1cnJlZCBDYWxsYmFjay4NCi0gICAgKCspIEVycm9yQ2FsbGJhY2sgICAgICAgICAgICAgICAgOiBFcnJvciBDYWxsYmFjay4NCi0gICAgKCspIE1zcEluaXRDYWxsYmFjayAgICAgICAgICAgICAgOiBGRENBTiBNc3BJbml0Lg0KLSAgICAoKykgTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgICAgICA6IEZEQ0FOIE1zcERlSW5pdC4NCi0gIFRoaXMgZnVuY3Rpb24gdGFrZXMgYXMgcGFyYW1ldGVycyB0aGUgSEFMIHBlcmlwaGVyYWwgaGFuZGxlLCB0aGUgQ2FsbGJhY2sgSUQNCi0gIGFuZCBhIHBvaW50ZXIgdG8gdGhlIHVzZXIgY2FsbGJhY2sgZnVuY3Rpb24uDQotDQotICBGb3Igc3BlY2lmaWMgY2FsbGJhY2tzIFR4RXZlbnRGaWZvQ2FsbGJhY2ssIFJ4RmlmbzBDYWxsYmFjaywgUnhGaWZvMUNhbGxiYWNrLA0KLSAgVHhCdWZmZXJDb21wbGV0ZUNhbGxiYWNrLCBUeEJ1ZmZlckFib3J0Q2FsbGJhY2sgYW5kIEVycm9yU3RhdHVzQ2FsbGJhY2sgdXNlDQotICBkZWRpY2F0ZWQgcmVnaXN0ZXIgY2FsbGJhY2tzIDogcmVzcGVjdGl2ZWx5DQotICBIQUxfRkRDQU5fUmVnaXN0ZXJUeEV2ZW50Rmlmb0NhbGxiYWNrKCksIEhBTF9GRENBTl9SZWdpc3RlclJ4RmlmbzBDYWxsYmFjaygpLA0KLSAgSEFMX0ZEQ0FOX1JlZ2lzdGVyUnhGaWZvMUNhbGxiYWNrKCksDQotICBIQUxfRkRDQU5fUmVnaXN0ZXJUeEJ1ZmZlckNvbXBsZXRlQ2FsbGJhY2soKSwNCi0gIEhBTF9GRENBTl9SZWdpc3RlclR4QnVmZmVyQWJvcnRDYWxsYmFjaygpIGFuZA0KLSAgSEFMX0ZEQ0FOX1JlZ2lzdGVyRXJyb3JTdGF0dXNDYWxsYmFjaygpLg0KLQ0KLSAgVXNlIGZ1bmN0aW9uIEhBTF9GRENBTl9VblJlZ2lzdGVyQ2FsbGJhY2soKSB0byByZXNldCBhIGNhbGxiYWNrIHRvIHRoZSBkZWZhdWx0DQotICB3ZWFrIGZ1bmN0aW9uLg0KLSAgSEFMX0ZEQ0FOX1VuUmVnaXN0ZXJDYWxsYmFjayB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZSBIQUwgcGVyaXBoZXJhbCBoYW5kbGUsDQotICBhbmQgdGhlIENhbGxiYWNrIElELg0KLSAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgdG8gcmVzZXQgZm9sbG93aW5nIGNhbGxiYWNrczoNCi0gICAgKCspIFR4Rmlmb0VtcHR5Q2FsbGJhY2sgICAgICAgICAgOiBUeCBGaWZvIEVtcHR5IENhbGxiYWNrLg0KLSAgICAoKykgSGlnaFByaW9yaXR5TWVzc2FnZUNhbGxiYWNrICA6IEhpZ2ggUHJpb3JpdHkgTWVzc2FnZSBDYWxsYmFjay4NCi0gICAgKCspIFRpbWVzdGFtcFdyYXBhcm91bmRDYWxsYmFjayAgOiBUaW1lc3RhbXAgV3JhcGFyb3VuZCBDYWxsYmFjay4NCi0gICAgKCspIFRpbWVvdXRPY2N1cnJlZENhbGxiYWNrICAgICAgOiBUaW1lb3V0IE9jY3VycmVkIENhbGxiYWNrLg0KLSAgICAoKykgRXJyb3JDYWxsYmFjayAgICAgICAgICAgICAgICA6IEVycm9yIENhbGxiYWNrLg0KLSAgICAoKykgTXNwSW5pdENhbGxiYWNrICAgICAgICAgICAgICA6IEZEQ0FOIE1zcEluaXQuDQotICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgICAgICAgICAgIDogRkRDQU4gTXNwRGVJbml0Lg0KLQ0KLSAgRm9yIHNwZWNpZmljIGNhbGxiYWNrcyBUeEV2ZW50Rmlmb0NhbGxiYWNrLCBSeEZpZm8wQ2FsbGJhY2ssIFJ4RmlmbzFDYWxsYmFjaywNCi0gIFR4QnVmZmVyQ29tcGxldGVDYWxsYmFjayBhbmQgVHhCdWZmZXJBYm9ydENhbGxiYWNrLCB1c2UgZGVkaWNhdGVkDQotICB1bnJlZ2lzdGVyIGNhbGxiYWNrcyA6IHJlc3BlY3RpdmVseSBIQUxfRkRDQU5fVW5SZWdpc3RlclR4RXZlbnRGaWZvQ2FsbGJhY2soKSwNCi0gIEhBTF9GRENBTl9VblJlZ2lzdGVyUnhGaWZvMENhbGxiYWNrKCksIEhBTF9GRENBTl9VblJlZ2lzdGVyUnhGaWZvMUNhbGxiYWNrKCksDQotICBIQUxfRkRDQU5fVW5SZWdpc3RlclR4QnVmZmVyQ29tcGxldGVDYWxsYmFjaygpLA0KLSAgSEFMX0ZEQ0FOX1VuUmVnaXN0ZXJUeEJ1ZmZlckFib3J0Q2FsbGJhY2soKSBhbmQNCi0gIEhBTF9GRENBTl9VblJlZ2lzdGVyRXJyb3JTdGF0dXNDYWxsYmFjaygpLg0KLQ0KLSAgQnkgZGVmYXVsdCwgYWZ0ZXIgdGhlIEhBTF9GRENBTl9Jbml0KCkgYW5kIHdoZW4gdGhlIHN0YXRlIGlzDQotICBIQUxfRkRDQU5fU1RBVEVfUkVTRVQsIGFsbCBjYWxsYmFja3MgYXJlIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyB3ZWFrDQotICBmdW5jdGlvbnM6IGV4YW1wbGVzIEhBTF9GRENBTl9FcnJvckNhbGxiYWNrKCkuIEV4Y2VwdGlvbiBkb25lIGZvciBNc3BJbml0IGFuZA0KLSAgTXNwRGVJbml0IGZ1bmN0aW9ucyB0aGF0IGFyZSByZXNldCB0byB0aGUgbGVnYWN5IHdlYWsgZnVuY3Rpb24gaW4gdGhlDQotICBIQUxfRkRDQU5fSW5pdCgpLyBIQUxfRkRDQU5fRGVJbml0KCkgb25seSB3aGVuIHRoZXNlIGNhbGxiYWNrcyBhcmUgbnVsbCAobm90DQotICByZWdpc3RlcmVkIGJlZm9yZWhhbmQpLiBpZiBub3QsIE1zcEluaXQgb3IgTXNwRGVJbml0IGFyZSBub3QgbnVsbCwgdGhlDQotICBIQUxfRkRDQU5fSW5pdCgpLyBIQUxfRkRDQU5fRGVJbml0KCkga2VlcCBhbmQgdXNlIHRoZSB1c2VyIE1zcEluaXQvTXNwRGVJbml0DQotICBjYWxsYmFja3MgKHJlZ2lzdGVyZWQgYmVmb3JlaGFuZCkNCi0NCi0gIENhbGxiYWNrcyBjYW4gYmUgcmVnaXN0ZXJlZC91bnJlZ2lzdGVyZWQgaW4gSEFMX0ZEQ0FOX1NUQVRFX1JFQURZIHN0YXRlIG9ubHkuDQotICBFeGNlcHRpb24gZG9uZSBNc3BJbml0L01zcERlSW5pdCB0aGF0IGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZA0KLSAgaW4gSEFMX0ZEQ0FOX1NUQVRFX1JFQURZIG9yIEhBTF9GRENBTl9TVEFURV9SRVNFVCBzdGF0ZSwNCi0gIHRodXMgcmVnaXN0ZXJlZCAodXNlcikgTXNwSW5pdC9EZUluaXQgY2FsbGJhY2tzIGNhbiBiZSB1c2VkIGR1cmluZyB0aGUNCi0gIEluaXQvRGVJbml0LiBJbiB0aGF0IGNhc2UgZmlyc3QgcmVnaXN0ZXIgdGhlIE1zcEluaXQvTXNwRGVJbml0IHVzZXIgY2FsbGJhY2tzDQotICB1c2luZyBIQUxfRkRDQU5fUmVnaXN0ZXJDYWxsYmFjaygpIGJlZm9yZSBjYWxsaW5nIEhBTF9GRENBTl9EZUluaXQoKQ0KLSAgb3IgSEFMX0ZEQ0FOX0luaXQoKSBmdW5jdGlvbi4NCi0NCi0gIFdoZW4gVGhlIGNvbXBpbGF0aW9uIGRlZmluZSBVU0VfSEFMX0ZEQ0FOX1JFR0lTVEVSX0NBTExCQUNLUyBpcyBzZXQgdG8gMCBvcg0KLSAgbm90IGRlZmluZWQsIHRoZSBjYWxsYmFjayByZWdpc3RyYXRpb24gZmVhdHVyZSBpcyBub3QgYXZhaWxhYmxlIGFuZCBhbGwNCi0gIGNhbGxiYWNrcyBhcmUgc2V0IHRvIHRoZSBjb3JyZXNwb25kaW5nIHdlYWsgZnVuY3Rpb25zLg0KLQ0KLSAgQGVuZHZlcmJhdGltDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICovDQotDQotLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaW5jbHVkZSAic3RtMzJnNHh4X2hhbC5oIg0KLQ0KLSNpZiBkZWZpbmVkKEZEQ0FOMSkNCi0NCi0vKiogQGFkZHRvZ3JvdXAgU1RNMzJHNHh4X0hBTF9Ecml2ZXINCi0gKiBAew0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRkRDQU4gRkRDQU4NCi0gKiBAYnJpZWYgRkRDQU4gSEFMIG1vZHVsZSBkcml2ZXINCi0gKiBAew0KLSAqLw0KLQ0KLSNpZmRlZiBIQUxfRkRDQU5fTU9EVUxFX0VOQUJMRUQNCi0NCi0vKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBhZGR0b2dyb3VwIEZEQ0FOX1ByaXZhdGVfQ29uc3RhbnRzDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIEZEQ0FOX1RJTUVPVVRfVkFMVUUgMTBVDQotDQotI2RlZmluZSBGRENBTl9UWF9FVkVOVF9GSUZPX01BU0sgKEZEQ0FOX0lSX1RFRkwgfCBGRENBTl9JUl9URUZGIHwgRkRDQU5fSVJfVEVGTikNCi0jZGVmaW5lIEZEQ0FOX1JYX0ZJRk8wX01BU0sgKEZEQ0FOX0lSX1JGMEwgfCBGRENBTl9JUl9SRjBGIHwgRkRDQU5fSVJfUkYwTikNCi0jZGVmaW5lIEZEQ0FOX1JYX0ZJRk8xX01BU0sgKEZEQ0FOX0lSX1JGMUwgfCBGRENBTl9JUl9SRjFGIHwgRkRDQU5fSVJfUkYxTikNCi0jZGVmaW5lIEZEQ0FOX0VSUk9SX01BU0sgXA0KLSAgKEZEQ0FOX0lSX0VMTyB8IEZEQ0FOX0lSX1dESSB8IEZEQ0FOX0lSX1BFQSB8IEZEQ0FOX0lSX1BFRCB8IEZEQ0FOX0lSX0FSQSkNCi0jZGVmaW5lIEZEQ0FOX0VSUk9SX1NUQVRVU19NQVNLIChGRENBTl9JUl9FUCB8IEZEQ0FOX0lSX0VXIHwgRkRDQU5fSVJfQk8pDQotDQotI2RlZmluZSBGRENBTl9FTEVNRU5UX01BU0tfU1RESUQgXA0KLSAgKCh1aW50MzJfdCkweDFGRkMwMDAwVSkgLyogU3RhbmRhcmQgSWRlbnRpZmllciAgICAgICAgICovDQotI2RlZmluZSBGRENBTl9FTEVNRU5UX01BU0tfRVhUSUQgXA0KLSAgKCh1aW50MzJfdCkweDFGRkZGRkZGVSkgLyogRXh0ZW5kZWQgSWRlbnRpZmllciAgICAgICAgICovDQotI2RlZmluZSBGRENBTl9FTEVNRU5UX01BU0tfUlRSIFwNCi0gICgodWludDMyX3QpMHgyMDAwMDAwMFUpIC8qIFJlbW90ZSBUcmFuc21pc3Npb24gUmVxdWVzdCAqLw0KLSNkZWZpbmUgRkRDQU5fRUxFTUVOVF9NQVNLX1hURCBcDQotICAoKHVpbnQzMl90KTB4NDAwMDAwMDBVKSAvKiBFeHRlbmRlZCBJZGVudGlmaWVyICAgICAgICAgKi8NCi0jZGVmaW5lIEZEQ0FOX0VMRU1FTlRfTUFTS19FU0kgXA0KLSAgKCh1aW50MzJfdCkweDgwMDAwMDAwVSkgLyogRXJyb3IgU3RhdGUgSW5kaWNhdG9yICAgICAgICovDQotI2RlZmluZSBGRENBTl9FTEVNRU5UX01BU0tfVFMgXA0KLSAgKCh1aW50MzJfdCkweDAwMDBGRkZGVSkgLyogVGltZXN0YW1wICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBGRENBTl9FTEVNRU5UX01BU0tfRExDIFwNCi0gICgodWludDMyX3QpMHgwMDBGMDAwMFUpIC8qIERhdGEgTGVuZ3RoIENvZGUgICAgICAgICAgICAqLw0KLSNkZWZpbmUgRkRDQU5fRUxFTUVOVF9NQVNLX0JSUyBcDQotICAoKHVpbnQzMl90KTB4MDAxMDAwMDBVKSAvKiBCaXQgUmF0ZSBTd2l0Y2ggICAgICAgICAgICAgKi8NCi0jZGVmaW5lIEZEQ0FOX0VMRU1FTlRfTUFTS19GREYgXA0KLSAgKCh1aW50MzJfdCkweDAwMjAwMDAwVSkgLyogRkQgRm9ybWF0ICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBGRENBTl9FTEVNRU5UX01BU0tfRUZDIFwNCi0gICgodWludDMyX3QpMHgwMDgwMDAwMFUpIC8qIEV2ZW50IEZJRk8gQ29udHJvbCAgICAgICAgICAqLw0KLSNkZWZpbmUgRkRDQU5fRUxFTUVOVF9NQVNLX01NIFwNCi0gICgodWludDMyX3QpMHhGRjAwMDAwMFUpIC8qIE1lc3NhZ2UgTWFya2VyICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgRkRDQU5fRUxFTUVOVF9NQVNLX0ZJRFggXA0KLSAgKCh1aW50MzJfdCkweDdGMDAwMDAwVSkgLyogRmlsdGVyIEluZGV4ICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBGRENBTl9FTEVNRU5UX01BU0tfQU5NRiBcDQotICAoKHVpbnQzMl90KTB4ODAwMDAwMDBVKSAvKiBBY2NlcHRlZCBOb24tbWF0Y2hpbmcgRnJhbWUgKi8NCi0jZGVmaW5lIEZEQ0FOX0VMRU1FTlRfTUFTS19FVCBcDQotICAoKHVpbnQzMl90KTB4MDBDMDAwMDBVKSAvKiBFdmVudCB0eXBlICAgICAgICAgICAgICAgICAgKi8NCi0NCi0jZGVmaW5lIFNSQU1DQU5fRkxTX05CUiAoMjhVKSAvKiBNYXguIEZpbHRlciBMaXN0IFN0YW5kYXJkIE51bWJlciAgICAgICovDQotI2RlZmluZSBTUkFNQ0FOX0ZMRV9OQlIgKDhVKSAgLyogTWF4LiBGaWx0ZXIgTGlzdCBFeHRlbmRlZCBOdW1iZXIgICAgICAqLw0KLSNkZWZpbmUgU1JBTUNBTl9SRjBfTkJSICgzVSkgIC8qIFJYIEZJRk8gMCBFbGVtZW50cyBOdW1iZXIgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFNSQU1DQU5fUkYxX05CUiAoM1UpICAvKiBSWCBGSUZPIDEgRWxlbWVudHMgTnVtYmVyICAgICAgICAgICAgICovDQotI2RlZmluZSBTUkFNQ0FOX1RFRl9OQlIgKDNVKSAgLyogVFggRXZlbnQgRklGTyBFbGVtZW50cyBOdW1iZXIgICAgICAgICAqLw0KLSNkZWZpbmUgU1JBTUNBTl9URlFfTkJSICgzVSkgIC8qIFRYIEZJRk8vUXVldWUgRWxlbWVudHMgTnVtYmVyICAgICAgICAgKi8NCi0NCi0jZGVmaW5lIFNSQU1DQU5fRkxTX1NJWkUgKDFVICogNFUpICAvKiBGaWx0ZXIgU3RhbmRhcmQgRWxlbWVudCBTaXplIGluIGJ5dGVzICovDQotI2RlZmluZSBTUkFNQ0FOX0ZMRV9TSVpFICgyVSAqIDRVKSAgLyogRmlsdGVyIEV4dGVuZGVkIEVsZW1lbnQgU2l6ZSBpbiBieXRlcyAqLw0KLSNkZWZpbmUgU1JBTUNBTl9SRjBfU0laRSAoMThVICogNFUpIC8qIFJYIEZJRk8gMCBFbGVtZW50cyBTaXplIGluIGJ5dGVzICovDQotI2RlZmluZSBTUkFNQ0FOX1JGMV9TSVpFICgxOFUgKiA0VSkgLyogUlggRklGTyAxIEVsZW1lbnRzIFNpemUgaW4gYnl0ZXMgKi8NCi0jZGVmaW5lIFNSQU1DQU5fVEVGX1NJWkUgKDJVICogNFUpICAvKiBUWCBFdmVudCBGSUZPIEVsZW1lbnRzIFNpemUgaW4gYnl0ZXMgICovDQotI2RlZmluZSBTUkFNQ0FOX1RGUV9TSVpFICgxOFUgKiA0VSkgLyogVFggRklGTy9RdWV1ZSBFbGVtZW50cyBTaXplIGluIGJ5dGVzICovDQotDQotI2RlZmluZSBTUkFNQ0FOX0ZMU1NBICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgodWludDMyX3QpMCkgLyogRmlsdGVyIExpc3QgU3RhbmRhcmQgU3RhcnQgXA0KLSAgICAgICAgICAgICAgICAgICBBZGRyZXNzICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFNSQU1DQU5fRkxFU0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgodWludDMyX3QpKFNSQU1DQU5fRkxTU0EgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgICAgIChTUkFNQ0FOX0ZMU19OQlIgKiBTUkFNQ0FOX0ZMU19TSVpFKSkpIC8qIEZpbHRlciBMaXN0IEV4dGVuZGVkIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0IEFkZHJlc3MgKi8NCi0jZGVmaW5lIFNSQU1DQU5fUkYwU0EgICAgICAgICAgICBcDQotICAoKHVpbnQzMl90KShTUkFNQ0FOX0ZMRVNBICsgICAgXA0KLSAgICAgICAgICAgICAgKFNSQU1DQU5fRkxFX05CUiAqIFwNCi0gICAgICAgICAgICAgICBTUkFNQ0FOX0ZMRV9TSVpFKSkpIC8qIFJ4IEZJRk8gMCBTdGFydCBBZGRyZXNzICAqLw0KLSNkZWZpbmUgU1JBTUNBTl9SRjFTQSAgICAgICAgICAgIFwNCi0gICgodWludDMyX3QpKFNSQU1DQU5fUkYwU0EgKyAgICBcDQotICAgICAgICAgICAgICAoU1JBTUNBTl9SRjBfTkJSICogXA0KLSAgICAgICAgICAgICAgIFNSQU1DQU5fUkYwX1NJWkUpKSkgLyogUnggRklGTyAxIFN0YXJ0IEFkZHJlc3MgICovDQotI2RlZmluZSBTUkFNQ0FOX1RFRlNBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgodWludDMyX3QpKFNSQU1DQU5fUkYxU0EgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAgICAgKFNSQU1DQU5fUkYxX05CUiAqIFNSQU1DQU5fUkYxX1NJWkUpKSkgLyogVHggRXZlbnQgRklGTyBTdGFydCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzICovDQotI2RlZmluZSBTUkFNQ0FOX1RGUVNBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgodWludDMyX3QpKFNSQU1DQU5fVEVGU0EgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAgICAgKFNSQU1DQU5fVEVGX05CUiAqIFNSQU1DQU5fVEVGX1NJWkUpKSkgLyogVHggRklGTy9RdWV1ZSBTdGFydCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzICovDQotI2RlZmluZSBTUkFNQ0FOX1NJWkUgICAgICAgICAgXA0KLSAgKCh1aW50MzJfdCkoU1JBTUNBTl9URlFTQSArIFwNCi0gICAgICAgICAgICAgIChTUkFNQ0FOX1RGUV9OQlIgKiBTUkFNQ0FOX1RGUV9TSVpFKSkpIC8qIE1lc3NhZ2UgUkFNIHNpemUgKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGFkZHRvZ3JvdXAgRkRDQU5fUHJpdmF0ZV9WYXJpYWJsZXMNCi0gKiBAew0KLSAqLw0KLXN0YXRpYyBjb25zdCB1aW50OF90IERMQ3RvQnl0ZXNbXSA9IHswLCAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LCAxMiwgMTYsIDIwLCAyNCwgMzIsIDQ4LCA2NH07DQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLXN0YXRpYyB2b2lkIEZEQ0FOX0NhbGN1bHRhdGVSYW1CbG9ja0FkZHJlc3NlcyhGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pOw0KLXN0YXRpYyB2b2lkIEZEQ0FOX0NvcHlNZXNzYWdlVG9SQU0oRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRDQU5fVHhIZWFkZXJUeXBlRGVmICpwVHhIZWFkZXIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwVHhEYXRhLCB1aW50MzJfdCBCdWZmZXJJbmRleCk7DQotDQotLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGRlZmdyb3VwIEZEQ0FOX0V4cG9ydGVkX0Z1bmN0aW9ucyBGRENBTiBFeHBvcnRlZCBGdW5jdGlvbnMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRkRDQU5fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQNCi1kZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMNCi0gICogIEBicmllZiAgICBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMNCi0gICoNCi1AdmVyYmF0aW0NCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAjIyMjIw0KLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86DQotICAgICAgKCspIEluaXRpYWxpemUgYW5kIGNvbmZpZ3VyZSB0aGUgRkRDQU4uDQotICAgICAgKCspIERlLWluaXRpYWxpemUgdGhlIEZEQ0FOLg0KLSAgICAgICgrKSBFbnRlciBGRENBTiBwZXJpcGhlcmFsIGluIHBvd2VyIGRvd24gbW9kZS4NCi0gICAgICAoKykgRXhpdCBwb3dlciBkb3duIG1vZGUuDQotICAgICAgKCspIFJlZ2lzdGVyIGNhbGxiYWNrcy4NCi0gICAgICAoKykgVW5yZWdpc3RlciBjYWxsYmFja3MuDQotDQotQGVuZHZlcmJhdGltDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIEZEQ0FOIHBlcmlwaGVyYWwgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQNCi0gKiAgICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIEZEQ0FOX0luaXRUeXBlRGVmIHN0cnVjdHVyZS4NCi0gKiBAcGFyYW0gIGhmZGNhbiBwb2ludGVyIHRvIGFuIEZEQ0FOX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCi0gKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZEQ0FOLg0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9Jbml0KEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbikgew0KLSAgdWludDMyX3QgdGlja3N0YXJ0Ow0KLQ0KLSAgLyogQ2hlY2sgRkRDQU4gaGFuZGxlICovDQotICBpZiAoaGZkY2FuID09IE5VTEwpIHsNCi0gICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gIH0NCi0NCi0gIC8qIENoZWNrIGZ1bmN0aW9uIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19GRENBTl9BTExfSU5TVEFOQ0UoaGZkY2FuLT5JbnN0YW5jZSkpOw0KLSAgaWYgKGhmZGNhbi0+SW5zdGFuY2UgPT0gRkRDQU4xKSB7DQotICAgIGFzc2VydF9wYXJhbShJU19GRENBTl9DS0RJVihoZmRjYW4tPkluaXQuQ2xvY2tEaXZpZGVyKSk7DQotICB9DQotICBhc3NlcnRfcGFyYW0oSVNfRkRDQU5fRlJBTUVfRk9STUFUKGhmZGNhbi0+SW5pdC5GcmFtZUZvcm1hdCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZEQ0FOX01PREUoaGZkY2FuLT5Jbml0Lk1vZGUpKTsNCi0gIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKGhmZGNhbi0+SW5pdC5BdXRvUmV0cmFuc21pc3Npb24pKTsNCi0gIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKGhmZGNhbi0+SW5pdC5UcmFuc21pdFBhdXNlKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShoZmRjYW4tPkluaXQuUHJvdG9jb2xFeGNlcHRpb24pKTsNCi0gIGFzc2VydF9wYXJhbShJU19GRENBTl9OT01JTkFMX1BSRVNDQUxFUihoZmRjYW4tPkluaXQuTm9taW5hbFByZXNjYWxlcikpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZEQ0FOX05PTUlOQUxfU0pXKGhmZGNhbi0+SW5pdC5Ob21pbmFsU3luY0p1bXBXaWR0aCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZEQ0FOX05PTUlOQUxfVFNFRzEoaGZkY2FuLT5Jbml0Lk5vbWluYWxUaW1lU2VnMSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZEQ0FOX05PTUlOQUxfVFNFRzIoaGZkY2FuLT5Jbml0Lk5vbWluYWxUaW1lU2VnMikpOw0KLSAgaWYgKGhmZGNhbi0+SW5pdC5GcmFtZUZvcm1hdCA9PSBGRENBTl9GUkFNRV9GRF9CUlMpIHsNCi0gICAgYXNzZXJ0X3BhcmFtKElTX0ZEQ0FOX0RBVEFfUFJFU0NBTEVSKGhmZGNhbi0+SW5pdC5EYXRhUHJlc2NhbGVyKSk7DQotICAgIGFzc2VydF9wYXJhbShJU19GRENBTl9EQVRBX1NKVyhoZmRjYW4tPkluaXQuRGF0YVN5bmNKdW1wV2lkdGgpKTsNCi0gICAgYXNzZXJ0X3BhcmFtKElTX0ZEQ0FOX0RBVEFfVFNFRzEoaGZkY2FuLT5Jbml0LkRhdGFUaW1lU2VnMSkpOw0KLSAgICBhc3NlcnRfcGFyYW0oSVNfRkRDQU5fREFUQV9UU0VHMihoZmRjYW4tPkluaXQuRGF0YVRpbWVTZWcyKSk7DQotICB9DQotICBhc3NlcnRfcGFyYW0oSVNfRkRDQU5fTUFYX1ZBTFVFKGhmZGNhbi0+SW5pdC5TdGRGaWx0ZXJzTmJyLCBTUkFNQ0FOX0ZMU19OQlIpKTsNCi0gIGFzc2VydF9wYXJhbShJU19GRENBTl9NQVhfVkFMVUUoaGZkY2FuLT5Jbml0LkV4dEZpbHRlcnNOYnIsIFNSQU1DQU5fRkxFX05CUikpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZEQ0FOX1RYX0ZJRk9fUVVFVUVfTU9ERShoZmRjYW4tPkluaXQuVHhGaWZvUXVldWVNb2RlKSk7DQotDQotI2lmIFVTRV9IQUxfRkRDQU5fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDENCi0gIGlmIChoZmRjYW4tPlN0YXRlID09IEhBTF9GRENBTl9TVEFURV9SRVNFVCkgew0KLSAgICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovDQotICAgIGhmZGNhbi0+TG9jayA9IEhBTF9VTkxPQ0tFRDsNCi0NCi0gICAgLyogUmVzZXQgY2FsbGJhY2tzIHRvIGxlZ2FjeSBmdW5jdGlvbnMgKi8NCi0gICAgaGZkY2FuLT5UeEV2ZW50Rmlmb0NhbGxiYWNrID0NCi0gICAgICAgIEhBTF9GRENBTl9UeEV2ZW50Rmlmb0NhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBUeEV2ZW50Rmlmb0NhbGxiYWNrICovDQotICAgIGhmZGNhbi0+UnhGaWZvMENhbGxiYWNrID0NCi0gICAgICAgIEhBTF9GRENBTl9SeEZpZm8wQ2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIFJ4RmlmbzBDYWxsYmFjayAgICAgKi8NCi0gICAgaGZkY2FuLT5SeEZpZm8xQ2FsbGJhY2sgPQ0KLSAgICAgICAgSEFMX0ZEQ0FOX1J4RmlmbzFDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgUnhGaWZvMUNhbGxiYWNrICAgICAqLw0KLSAgICBoZmRjYW4tPlR4Rmlmb0VtcHR5Q2FsbGJhY2sgPQ0KLSAgICAgICAgSEFMX0ZEQ0FOX1R4Rmlmb0VtcHR5Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIFR4Rmlmb0VtcHR5Q2FsbGJhY2sgKi8NCi0gICAgaGZkY2FuLT5UeEJ1ZmZlckNvbXBsZXRlQ2FsbGJhY2sgPQ0KLSAgICAgICAgSEFMX0ZEQ0FOX1R4QnVmZmVyQ29tcGxldGVDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR4QnVmZmVyQ29tcGxldGVDYWxsYmFjayAqLw0KLSAgICBoZmRjYW4tPlR4QnVmZmVyQWJvcnRDYWxsYmFjayA9DQotICAgICAgICBIQUxfRkRDQU5fVHhCdWZmZXJBYm9ydENhbGxiYWNrOyAvKiBMZWdhY3kgd2Vhaw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHhCdWZmZXJBYm9ydENhbGxiYWNrICAgICAgICAgICAqLw0KLSAgICBoZmRjYW4tPkhpZ2hQcmlvcml0eU1lc3NhZ2VDYWxsYmFjayA9DQotICAgICAgICBIQUxfRkRDQU5fSGlnaFByaW9yaXR5TWVzc2FnZUNhbGxiYWNrOyAvKiBMZWdhY3kgd2Vhaw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGlnaFByaW9yaXR5TWVzc2FnZUNhbGxiYWNrICovDQotICAgIGhmZGNhbi0+VGltZXN0YW1wV3JhcGFyb3VuZENhbGxiYWNrID0NCi0gICAgICAgIEhBTF9GRENBTl9UaW1lc3RhbXBXcmFwYXJvdW5kQ2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lc3RhbXBXcmFwYXJvdW5kQ2FsbGJhY2sgKi8NCi0gICAgaGZkY2FuLT5UaW1lb3V0T2NjdXJyZWRDYWxsYmFjayA9DQotICAgICAgICBIQUxfRkRDQU5fVGltZW91dE9jY3VycmVkQ2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVvdXRPY2N1cnJlZENhbGxiYWNrICAgICAgICAgKi8NCi0gICAgaGZkY2FuLT5FcnJvckNhbGxiYWNrID0NCi0gICAgICAgIEhBTF9GRENBTl9FcnJvckNhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBFcnJvckNhbGxiYWNrICAgICAgICovDQotICAgIGhmZGNhbi0+RXJyb3JTdGF0dXNDYWxsYmFjayA9DQotICAgICAgICBIQUxfRkRDQU5fRXJyb3JTdGF0dXNDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgRXJyb3JTdGF0dXNDYWxsYmFjayAqLw0KLQ0KLSAgICBpZiAoaGZkY2FuLT5Nc3BJbml0Q2FsbGJhY2sgPT0gTlVMTCkgew0KLSAgICAgIGhmZGNhbi0+TXNwSW5pdENhbGxiYWNrID0gSEFMX0ZEQ0FOX01zcEluaXQ7IC8qIExlZ2FjeSB3ZWFrIE1zcEluaXQgKi8NCi0gICAgfQ0KLQ0KLSAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmU6IENMT0NLLCBOVklDICovDQotICAgIGhmZGNhbi0+TXNwSW5pdENhbGxiYWNrKGhmZGNhbik7DQotICB9DQotI2Vsc2UNCi0gIGlmIChoZmRjYW4tPlN0YXRlID09IEhBTF9GRENBTl9TVEFURV9SRVNFVCkgew0KLSAgICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovDQotICAgIGhmZGNhbi0+TG9jayA9IEhBTF9VTkxPQ0tFRDsNCi0NCi0gICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlOiBDTE9DSywgTlZJQyAqLw0KLSAgICBIQUxfRkRDQU5fTXNwSW5pdChoZmRjYW4pOw0KLSAgfQ0KLSNlbmRpZiAvKiBVU0VfSEFMX0ZEQ0FOX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLQ0KLSAgLyogRXhpdCBmcm9tIFNsZWVwIG1vZGUgKi8NCi0gIENMRUFSX0JJVChoZmRjYW4tPkluc3RhbmNlLT5DQ0NSLCBGRENBTl9DQ0NSX0NTUik7DQotDQotICAvKiBHZXQgdGljayAqLw0KLSAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsNCi0NCi0gIC8qIENoZWNrIFNsZWVwIG1vZGUgYWNrbm93bGVkZ2UgKi8NCi0gIHdoaWxlICgoaGZkY2FuLT5JbnN0YW5jZS0+Q0NDUiAmIEZEQ0FOX0NDQ1JfQ1NBKSA9PSBGRENBTl9DQ0NSX0NTQSkgew0KLSAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gRkRDQU5fVElNRU9VVF9WQUxVRSkgew0KLSAgICAgIC8qIFVwZGF0ZSBlcnJvciBjb2RlICovDQotICAgICAgaGZkY2FuLT5FcnJvckNvZGUgfD0gSEFMX0ZEQ0FOX0VSUk9SX1RJTUVPVVQ7DQotDQotICAgICAgLyogQ2hhbmdlIEZEQ0FOIHN0YXRlICovDQotICAgICAgaGZkY2FuLT5TdGF0ZSA9IEhBTF9GRENBTl9TVEFURV9FUlJPUjsNCi0NCi0gICAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgICB9DQotICB9DQotDQotICAvKiBSZXF1ZXN0IGluaXRpYWxpc2F0aW9uICovDQotICBTRVRfQklUKGhmZGNhbi0+SW5zdGFuY2UtPkNDQ1IsIEZEQ0FOX0NDQ1JfSU5JVCk7DQotDQotICAvKiBHZXQgdGljayAqLw0KLSAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsNCi0NCi0gIC8qIFdhaXQgdW50aWwgdGhlIElOSVQgYml0IGludG8gQ0NDUiByZWdpc3RlciBpcyBzZXQgKi8NCi0gIHdoaWxlICgoaGZkY2FuLT5JbnN0YW5jZS0+Q0NDUiAmIEZEQ0FOX0NDQ1JfSU5JVCkgPT0gMFUpIHsNCi0gICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovDQotICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBGRENBTl9USU1FT1VUX1ZBTFVFKSB7DQotICAgICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8NCi0gICAgICBoZmRjYW4tPkVycm9yQ29kZSB8PSBIQUxfRkRDQU5fRVJST1JfVElNRU9VVDsNCi0NCi0gICAgICAvKiBDaGFuZ2UgRkRDQU4gc3RhdGUgKi8NCi0gICAgICBoZmRjYW4tPlN0YXRlID0gSEFMX0ZEQ0FOX1NUQVRFX0VSUk9SOw0KLQ0KLSAgICAgIHJldHVybiBIQUxfRVJST1I7DQotICAgIH0NCi0gIH0NCi0NCi0gIC8qIEVuYWJsZSBjb25maWd1cmF0aW9uIGNoYW5nZSAqLw0KLSAgU0VUX0JJVChoZmRjYW4tPkluc3RhbmNlLT5DQ0NSLCBGRENBTl9DQ0NSX0NDRSk7DQotDQotICAvKiBDaGVjayBGRENBTiBpbnN0YW5jZSAqLw0KLSAgaWYgKGhmZGNhbi0+SW5zdGFuY2UgPT0gRkRDQU4xKSB7DQotICAgIC8qIENvbmZpZ3VyZSBDbG9jayBkaXZpZGVyICovDQotICAgIEZEQ0FOX0NPTkZJRy0+Q0tESVYgPSBoZmRjYW4tPkluaXQuQ2xvY2tEaXZpZGVyOw0KLSAgfQ0KLQ0KLSAgLyogU2V0IHRoZSBubyBhdXRvbWF0aWMgcmV0cmFuc21pc3Npb24gKi8NCi0gIGlmIChoZmRjYW4tPkluaXQuQXV0b1JldHJhbnNtaXNzaW9uID09IEVOQUJMRSkgew0KLSAgICBDTEVBUl9CSVQoaGZkY2FuLT5JbnN0YW5jZS0+Q0NDUiwgRkRDQU5fQ0NDUl9EQVIpOw0KLSAgfSBlbHNlIHsNCi0gICAgU0VUX0JJVChoZmRjYW4tPkluc3RhbmNlLT5DQ0NSLCBGRENBTl9DQ0NSX0RBUik7DQotICB9DQotDQotICAvKiBTZXQgdGhlIHRyYW5zbWl0IHBhdXNlIGZlYXR1cmUgKi8NCi0gIGlmIChoZmRjYW4tPkluaXQuVHJhbnNtaXRQYXVzZSA9PSBFTkFCTEUpIHsNCi0gICAgU0VUX0JJVChoZmRjYW4tPkluc3RhbmNlLT5DQ0NSLCBGRENBTl9DQ0NSX1RYUCk7DQotICB9IGVsc2Ugew0KLSAgICBDTEVBUl9CSVQoaGZkY2FuLT5JbnN0YW5jZS0+Q0NDUiwgRkRDQU5fQ0NDUl9UWFApOw0KLSAgfQ0KLQ0KLSAgLyogU2V0IHRoZSBQcm90b2NvbCBFeGNlcHRpb24gSGFuZGxpbmcgKi8NCi0gIGlmIChoZmRjYW4tPkluaXQuUHJvdG9jb2xFeGNlcHRpb24gPT0gRU5BQkxFKSB7DQotICAgIENMRUFSX0JJVChoZmRjYW4tPkluc3RhbmNlLT5DQ0NSLCBGRENBTl9DQ0NSX1BYSEQpOw0KLSAgfSBlbHNlIHsNCi0gICAgU0VUX0JJVChoZmRjYW4tPkluc3RhbmNlLT5DQ0NSLCBGRENBTl9DQ0NSX1BYSEQpOw0KLSAgfQ0KLQ0KLSAgLyogU2V0IEZEQ0FOIEZyYW1lIEZvcm1hdCAqLw0KLSAgTU9ESUZZX1JFRyhoZmRjYW4tPkluc3RhbmNlLT5DQ0NSLCBGRENBTl9GUkFNRV9GRF9CUlMsDQotICAgICAgICAgICAgIGhmZGNhbi0+SW5pdC5GcmFtZUZvcm1hdCk7DQotDQotICAvKiBSZXNldCBGRENBTiBPcGVyYXRpb24gTW9kZSAqLw0KLSAgQ0xFQVJfQklUKGhmZGNhbi0+SW5zdGFuY2UtPkNDQ1IsDQotICAgICAgICAgICAgKEZEQ0FOX0NDQ1JfVEVTVCB8IEZEQ0FOX0NDQ1JfTU9OIHwgRkRDQU5fQ0NDUl9BU00pKTsNCi0gIENMRUFSX0JJVChoZmRjYW4tPkluc3RhbmNlLT5URVNULCBGRENBTl9URVNUX0xCQ0spOw0KLQ0KLSAgLyogU2V0IEZEQ0FOIE9wZXJhdGluZyBNb2RlOg0KLSAgICAgICAgICAgICAgIHwgTm9ybWFsIHwgUmVzdHJpY3RlZCB8ICAgIEJ1cyAgICAgfCBJbnRlcm5hbCB8IEV4dGVybmFsDQotICAgICAgICAgICAgICAgfCAgICAgICAgfCBPcGVyYXRpb24gIHwgTW9uaXRvcmluZyB8IExvb3BCYWNrIHwgTG9vcEJhY2sNCi0gICAgIENDQ1IuVEVTVCB8ICAgMCAgICB8ICAgICAwICAgICAgfCAgICAgMCAgICAgIHwgICAgMSAgICAgfCAgICAxDQotICAgICBDQ0NSLk1PTiAgfCAgIDAgICAgfCAgICAgMCAgICAgIHwgICAgIDEgICAgICB8ICAgIDEgICAgIHwgICAgMA0KLSAgICAgVEVTVC5MQkNLIHwgICAwICAgIHwgICAgIDAgICAgICB8ICAgICAwICAgICAgfCAgICAxICAgICB8ICAgIDENCi0gICAgIENDQ1IuQVNNICB8ICAgMCAgICB8ICAgICAxICAgICAgfCAgICAgMCAgICAgIHwgICAgMCAgICAgfCAgICAwDQotICAqLw0KLSAgaWYgKGhmZGNhbi0+SW5pdC5Nb2RlID09IEZEQ0FOX01PREVfUkVTVFJJQ1RFRF9PUEVSQVRJT04pIHsNCi0gICAgLyogRW5hYmxlIFJlc3RyaWN0ZWQgT3BlcmF0aW9uIG1vZGUgKi8NCi0gICAgU0VUX0JJVChoZmRjYW4tPkluc3RhbmNlLT5DQ0NSLCBGRENBTl9DQ0NSX0FTTSk7DQotICB9IGVsc2UgaWYgKGhmZGNhbi0+SW5pdC5Nb2RlICE9IEZEQ0FOX01PREVfTk9STUFMKSB7DQotICAgIGlmIChoZmRjYW4tPkluaXQuTW9kZSAhPSBGRENBTl9NT0RFX0JVU19NT05JVE9SSU5HKSB7DQotICAgICAgLyogRW5hYmxlIHdyaXRlIGFjY2VzcyB0byBURVNUIHJlZ2lzdGVyICovDQotICAgICAgU0VUX0JJVChoZmRjYW4tPkluc3RhbmNlLT5DQ0NSLCBGRENBTl9DQ0NSX1RFU1QpOw0KLQ0KLSAgICAgIC8qIEVuYWJsZSBMb29wQmFjayBtb2RlICovDQotICAgICAgU0VUX0JJVChoZmRjYW4tPkluc3RhbmNlLT5URVNULCBGRENBTl9URVNUX0xCQ0spOw0KLQ0KLSAgICAgIGlmIChoZmRjYW4tPkluaXQuTW9kZSA9PSBGRENBTl9NT0RFX0lOVEVSTkFMX0xPT1BCQUNLKSB7DQotICAgICAgICBTRVRfQklUKGhmZGNhbi0+SW5zdGFuY2UtPkNDQ1IsIEZEQ0FOX0NDQ1JfTU9OKTsNCi0gICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgLyogRW5hYmxlIGJ1cyBtb25pdG9yaW5nIG1vZGUgKi8NCi0gICAgICBTRVRfQklUKGhmZGNhbi0+SW5zdGFuY2UtPkNDQ1IsIEZEQ0FOX0NDQ1JfTU9OKTsNCi0gICAgfQ0KLSAgfSBlbHNlIHsNCi0gICAgLyogTm90aGluZyB0byBkbzogbm9ybWFsIG1vZGUgKi8NCi0gIH0NCi0NCi0gIC8qIFNldCB0aGUgbm9taW5hbCBiaXQgdGltaW5nIHJlZ2lzdGVyICovDQotICBoZmRjYW4tPkluc3RhbmNlLT5OQlRQID0NCi0gICAgICAoKCgodWludDMyX3QpaGZkY2FuLT5Jbml0Lk5vbWluYWxTeW5jSnVtcFdpZHRoIC0gMVUpDQotICAgICAgICA8PCBGRENBTl9OQlRQX05TSldfUG9zKSB8DQotICAgICAgICgoKHVpbnQzMl90KWhmZGNhbi0+SW5pdC5Ob21pbmFsVGltZVNlZzEgLSAxVSkNCi0gICAgICAgIDw8IEZEQ0FOX05CVFBfTlRTRUcxX1BvcykgfA0KLSAgICAgICAoKCh1aW50MzJfdCloZmRjYW4tPkluaXQuTm9taW5hbFRpbWVTZWcyIC0gMVUpDQotICAgICAgICA8PCBGRENBTl9OQlRQX05UU0VHMl9Qb3MpIHwNCi0gICAgICAgKCgodWludDMyX3QpaGZkY2FuLT5Jbml0Lk5vbWluYWxQcmVzY2FsZXIgLSAxVSkgPDwgRkRDQU5fTkJUUF9OQlJQX1BvcykpOw0KLQ0KLSAgLyogSWYgRkQgb3BlcmF0aW9uIHdpdGggQlJTIGlzIHNlbGVjdGVkLCBzZXQgdGhlIGRhdGEgYml0IHRpbWluZyByZWdpc3RlciAqLw0KLSAgaWYgKGhmZGNhbi0+SW5pdC5GcmFtZUZvcm1hdCA9PSBGRENBTl9GUkFNRV9GRF9CUlMpIHsNCi0gICAgaGZkY2FuLT5JbnN0YW5jZS0+REJUUCA9DQotICAgICAgICAoKCgodWludDMyX3QpaGZkY2FuLT5Jbml0LkRhdGFTeW5jSnVtcFdpZHRoIC0gMVUpDQotICAgICAgICAgIDw8IEZEQ0FOX0RCVFBfRFNKV19Qb3MpIHwNCi0gICAgICAgICAoKCh1aW50MzJfdCloZmRjYW4tPkluaXQuRGF0YVRpbWVTZWcxIC0gMVUpIDw8IEZEQ0FOX0RCVFBfRFRTRUcxX1BvcykgfA0KLSAgICAgICAgICgoKHVpbnQzMl90KWhmZGNhbi0+SW5pdC5EYXRhVGltZVNlZzIgLSAxVSkgPDwgRkRDQU5fREJUUF9EVFNFRzJfUG9zKSB8DQotICAgICAgICAgKCgodWludDMyX3QpaGZkY2FuLT5Jbml0LkRhdGFQcmVzY2FsZXIgLSAxVSkgPDwgRkRDQU5fREJUUF9EQlJQX1BvcykpOw0KLSAgfQ0KLQ0KLSAgLyogU2VsZWN0IGJldHdlZW4gVHggRklGTyBhbmQgVHggUXVldWUgb3BlcmF0aW9uIG1vZGVzICovDQotICBTRVRfQklUKGhmZGNhbi0+SW5zdGFuY2UtPlRYQkMsIGhmZGNhbi0+SW5pdC5UeEZpZm9RdWV1ZU1vZGUpOw0KLQ0KLSAgLyogQ2FsY3VsYXRlIGVhY2ggUkFNIGJsb2NrIGFkZHJlc3MgKi8NCi0gIEZEQ0FOX0NhbGN1bHRhdGVSYW1CbG9ja0FkZHJlc3NlcyhoZmRjYW4pOw0KLQ0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgTGF0ZXN0IFR4IHJlcXVlc3QgYnVmZmVyIGluZGV4ICovDQotICBoZmRjYW4tPkxhdGVzdFR4Rmlmb1FSZXF1ZXN0ID0gMFU7DQotDQotICAvKiBJbml0aWFsaXplIHRoZSBlcnJvciBjb2RlICovDQotICBoZmRjYW4tPkVycm9yQ29kZSA9IEhBTF9GRENBTl9FUlJPUl9OT05FOw0KLQ0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgRkRDQU4gc3RhdGUgKi8NCi0gIGhmZGNhbi0+U3RhdGUgPSBIQUxfRkRDQU5fU1RBVEVfUkVBRFk7DQotDQotICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovDQotICByZXR1cm4gSEFMX09LOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERlaW5pdGlhbGl6ZXMgdGhlIEZEQ0FOIHBlcmlwaGVyYWwgcmVnaXN0ZXJzIHRvIHRoZWlyIGRlZmF1bHQgcmVzZXQNCi0gKiB2YWx1ZXMuDQotICogQHBhcmFtICBoZmRjYW4gcG9pbnRlciB0byBhbiBGRENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQotICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBGRENBTi4NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fRGVJbml0KEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbikgew0KLSAgLyogQ2hlY2sgRkRDQU4gaGFuZGxlICovDQotICBpZiAoaGZkY2FuID09IE5VTEwpIHsNCi0gICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gIH0NCi0NCi0gIC8qIENoZWNrIGZ1bmN0aW9uIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19GRENBTl9BTExfSU5TVEFOQ0UoaGZkY2FuLT5JbnN0YW5jZSkpOw0KLQ0KLSAgLyogU3RvcCB0aGUgRkRDQU4gbW9kdWxlOiByZXR1cm4gdmFsdWUgaXMgdm9sdW50YXJ5IGlnbm9yZWQgKi8NCi0gICh2b2lkKUhBTF9GRENBTl9TdG9wKGhmZGNhbik7DQotDQotICAvKiBEaXNhYmxlIEludGVycnVwdCBsaW5lcyAqLw0KLSAgQ0xFQVJfQklUKGhmZGNhbi0+SW5zdGFuY2UtPklMRSwNCi0gICAgICAgICAgICAoRkRDQU5fSU5URVJSVVBUX0xJTkUwIHwgRkRDQU5fSU5URVJSVVBUX0xJTkUxKSk7DQotDQotI2lmIFVTRV9IQUxfRkRDQU5fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDENCi0gIGlmIChoZmRjYW4tPk1zcERlSW5pdENhbGxiYWNrID09IE5VTEwpIHsNCi0gICAgaGZkY2FuLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9GRENBTl9Nc3BEZUluaXQ7IC8qIExlZ2FjeSB3ZWFrIE1zcERlSW5pdCAqLw0KLSAgfQ0KLQ0KLSAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmU6IENMT0NLLCBOVklDICovDQotICBoZmRjYW4tPk1zcERlSW5pdENhbGxiYWNrKGhmZGNhbik7DQotI2Vsc2UNCi0gIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlOiBDTE9DSywgTlZJQyAqLw0KLSAgSEFMX0ZEQ0FOX01zcERlSW5pdChoZmRjYW4pOw0KLSNlbmRpZiAvKiBVU0VfSEFMX0ZEQ0FOX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLQ0KLSAgLyogUmVzZXQgdGhlIEZEQ0FOIEVycm9yQ29kZSAqLw0KLSAgaGZkY2FuLT5FcnJvckNvZGUgPSBIQUxfRkRDQU5fRVJST1JfTk9ORTsNCi0NCi0gIC8qIENoYW5nZSBGRENBTiBzdGF0ZSAqLw0KLSAgaGZkY2FuLT5TdGF0ZSA9IEhBTF9GRENBTl9TVEFURV9SRVNFVDsNCi0NCi0gIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8NCi0gIHJldHVybiBIQUxfT0s7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIEZEQ0FOIE1TUC4NCi0gKiBAcGFyYW0gIGhmZGNhbiBwb2ludGVyIHRvIGFuIEZEQ0FOX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCi0gKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZEQ0FOLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fd2VhayB2b2lkIEhBTF9GRENBTl9Nc3BJbml0KEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbikgew0KLSAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLw0KLSAgVU5VU0VEKGhmZGNhbik7DQotICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsDQotICAgICAgICAgICAgdGhlIEhBTF9GRENBTl9Nc3BJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUNCi0gICAqLw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERlSW5pdGlhbGl6ZXMgdGhlIEZEQ0FOIE1TUC4NCi0gKiBAcGFyYW0gIGhmZGNhbiBwb2ludGVyIHRvIGFuIEZEQ0FOX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCi0gKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZEQ0FOLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fd2VhayB2b2lkIEhBTF9GRENBTl9Nc3BEZUluaXQoRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuKSB7DQotICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovDQotICBVTlVTRUQoaGZkY2FuKTsNCi0gIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwNCi0gICAgICAgICAgICB0aGUgSEFMX0ZEQ0FOX01zcERlSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlDQotICAgKi8NCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbnRlciBGRENBTiBwZXJpcGhlcmFsIGluIHNsZWVwIG1vZGUuDQotICogQHBhcmFtICBoZmRjYW4gcG9pbnRlciB0byBhbiBGRENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQotICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBGRENBTi4NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fRW50ZXJQb3dlckRvd25Nb2RlKEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbikgew0KLSAgdWludDMyX3QgdGlja3N0YXJ0Ow0KLQ0KLSAgLyogUmVxdWVzdCBjbG9jayBzdG9wICovDQotICBTRVRfQklUKGhmZGNhbi0+SW5zdGFuY2UtPkNDQ1IsIEZEQ0FOX0NDQ1JfQ1NSKTsNCi0NCi0gIC8qIEdldCB0aWNrICovDQotICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOw0KLQ0KLSAgLyogV2FpdCB1bnRpbCBGRENBTiBpcyByZWFkeSBmb3IgcG93ZXIgZG93biAqLw0KLSAgd2hpbGUgKChoZmRjYW4tPkluc3RhbmNlLT5DQ0NSICYgRkRDQU5fQ0NDUl9DU0EpID09IDBVKSB7DQotICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBGRENBTl9USU1FT1VUX1ZBTFVFKSB7DQotICAgICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8NCi0gICAgICBoZmRjYW4tPkVycm9yQ29kZSB8PSBIQUxfRkRDQU5fRVJST1JfVElNRU9VVDsNCi0NCi0gICAgICAvKiBDaGFuZ2UgRkRDQU4gc3RhdGUgKi8NCi0gICAgICBoZmRjYW4tPlN0YXRlID0gSEFMX0ZEQ0FOX1NUQVRFX0VSUk9SOw0KLQ0KLSAgICAgIHJldHVybiBIQUxfRVJST1I7DQotICAgIH0NCi0gIH0NCi0NCi0gIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8NCi0gIHJldHVybiBIQUxfT0s7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRXhpdCBwb3dlciBkb3duIG1vZGUuDQotICogQHBhcmFtICBoZmRjYW4gcG9pbnRlciB0byBhbiBGRENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQotICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBGRENBTi4NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fRXhpdFBvd2VyRG93bk1vZGUoRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuKSB7DQotICB1aW50MzJfdCB0aWNrc3RhcnQ7DQotDQotICAvKiBSZXNldCBjbG9jayBzdG9wIHJlcXVlc3QgKi8NCi0gIENMRUFSX0JJVChoZmRjYW4tPkluc3RhbmNlLT5DQ0NSLCBGRENBTl9DQ0NSX0NTUik7DQotDQotICAvKiBHZXQgdGljayAqLw0KLSAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsNCi0NCi0gIC8qIFdhaXQgdW50aWwgRkRDQU4gZXhpdHMgc2xlZXAgbW9kZSAqLw0KLSAgd2hpbGUgKChoZmRjYW4tPkluc3RhbmNlLT5DQ0NSICYgRkRDQU5fQ0NDUl9DU0EpID09IEZEQ0FOX0NDQ1JfQ1NBKSB7DQotICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBGRENBTl9USU1FT1VUX1ZBTFVFKSB7DQotICAgICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8NCi0gICAgICBoZmRjYW4tPkVycm9yQ29kZSB8PSBIQUxfRkRDQU5fRVJST1JfVElNRU9VVDsNCi0NCi0gICAgICAvKiBDaGFuZ2UgRkRDQU4gc3RhdGUgKi8NCi0gICAgICBoZmRjYW4tPlN0YXRlID0gSEFMX0ZEQ0FOX1NUQVRFX0VSUk9SOw0KLQ0KLSAgICAgIHJldHVybiBIQUxfRVJST1I7DQotICAgIH0NCi0gIH0NCi0NCi0gIC8qIEVudGVyIG5vcm1hbCBvcGVyYXRpb24gKi8NCi0gIENMRUFSX0JJVChoZmRjYW4tPkluc3RhbmNlLT5DQ0NSLCBGRENBTl9DQ0NSX0lOSVQpOw0KLQ0KLSAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLw0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotI2lmIFVTRV9IQUxfRkRDQU5fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDENCi0vKioNCi0gKiBAYnJpZWYgIFJlZ2lzdGVyIGEgRkRDQU4gQ2FsbEJhY2suDQotICogICAgICAgICBUbyBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHdlYWsgcHJlZGVmaW5lZCBjYWxsYmFjaw0KLSAqIEBwYXJhbSAgaGZkY2FuIHBvaW50ZXIgdG8gYSBGRENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQotICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgRkRDQU4gbW9kdWxlDQotICogQHBhcmFtICBDYWxsYmFja0lEIElEIG9mIHRoZSBjYWxsYmFjayB0byBiZSByZWdpc3RlcmVkDQotICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX0ZEQ0FOX1RYX0ZJRk9fRU1QVFlfQ0JfSUQgVHggRmlmbyBFbXB0eSBjYWxsYmFjayBJRA0KLSAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX0ZEQ0FOX0hJR0hfUFJJT19NRVNTQUdFX0NCX0lEIEhpZ2ggcHJpb3JpdHkgbWVzc2FnZQ0KLSAqIGNhbGxiYWNrIElEDQotICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfRkRDQU5fVElNRVNUQU1QX1dSQVBBUk9VTkRfQ0JfSUQgVGltZXN0YW1wIHdyYXBhcm91bmQNCi0gKiBjYWxsYmFjayBJRA0KLSAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX0ZEQ0FOX1RJTUVPVVRfT0NDVVJSRURfQ0JfSUQgVGltZW91dCBvY2N1cnJlZA0KLSAqIGNhbGxiYWNrIElEDQotICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfRkRDQU5fRVJST1JfQ0FMTEJBQ0tfQ0JfSUQgRXJyb3IgY2FsbGJhY2sgSUQNCi0gKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9GRENBTl9NU1BJTklUX0NCX0lEIE1zcEluaXQgY2FsbGJhY2sgSUQNCi0gKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9GRENBTl9NU1BERUlOSVRfQ0JfSUQgTXNwRGVJbml0IGNhbGxiYWNrIElEDQotICogQHBhcmFtICBwQ2FsbGJhY2sgcG9pbnRlciB0byB0aGUgQ2FsbGJhY2sgZnVuY3Rpb24NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fUmVnaXN0ZXJDYWxsYmFjaygNCi0gICAgRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLCBIQUxfRkRDQU5fQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwNCi0gICAgdm9pZCAoKnBDYWxsYmFjaykoRkRDQU5fSGFuZGxlVHlwZURlZiAqX2hGRENBTikpIHsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsNCi0NCi0gIGlmIChwQ2FsbGJhY2sgPT0gTlVMTCkgew0KLSAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8NCi0gICAgaGZkY2FuLT5FcnJvckNvZGUgfD0gSEFMX0ZEQ0FOX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7DQotDQotICAgIHJldHVybiBIQUxfRVJST1I7DQotICB9DQotDQotICBpZiAoaGZkY2FuLT5TdGF0ZSA9PSBIQUxfRkRDQU5fU1RBVEVfUkVBRFkpIHsNCi0gICAgc3dpdGNoIChDYWxsYmFja0lEKSB7DQotICAgICAgY2FzZSBIQUxfRkRDQU5fVFhfRklGT19FTVBUWV9DQl9JRDoNCi0gICAgICAgIGhmZGNhbi0+VHhGaWZvRW1wdHlDYWxsYmFjayA9IHBDYWxsYmFjazsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgSEFMX0ZEQ0FOX0hJR0hfUFJJT19NRVNTQUdFX0NCX0lEOg0KLSAgICAgICAgaGZkY2FuLT5IaWdoUHJpb3JpdHlNZXNzYWdlQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9GRENBTl9USU1FU1RBTVBfV1JBUEFST1VORF9DQl9JRDoNCi0gICAgICAgIGhmZGNhbi0+VGltZXN0YW1wV3JhcGFyb3VuZENhbGxiYWNrID0gcENhbGxiYWNrOw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfRkRDQU5fVElNRU9VVF9PQ0NVUlJFRF9DQl9JRDoNCi0gICAgICAgIGhmZGNhbi0+VGltZW91dE9jY3VycmVkQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9GRENBTl9FUlJPUl9DQUxMQkFDS19DQl9JRDoNCi0gICAgICAgIGhmZGNhbi0+RXJyb3JDYWxsYmFjayA9IHBDYWxsYmFjazsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgSEFMX0ZEQ0FOX01TUElOSVRfQ0JfSUQ6DQotICAgICAgICBoZmRjYW4tPk1zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgSEFMX0ZEQ0FOX01TUERFSU5JVF9DQl9JRDoNCi0gICAgICAgIGhmZGNhbi0+TXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBkZWZhdWx0Og0KLSAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovDQotICAgICAgICBoZmRjYW4tPkVycm9yQ29kZSB8PSBIQUxfRkRDQU5fRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsNCi0NCi0gICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8NCi0gICAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsNCi0gICAgICAgIGJyZWFrOw0KLSAgICB9DQotICB9IGVsc2UgaWYgKGhmZGNhbi0+U3RhdGUgPT0gSEFMX0ZEQ0FOX1NUQVRFX1JFU0VUKSB7DQotICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkgew0KLSAgICAgIGNhc2UgSEFMX0ZEQ0FOX01TUElOSVRfQ0JfSUQ6DQotICAgICAgICBoZmRjYW4tPk1zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgSEFMX0ZEQ0FOX01TUERFSU5JVF9DQl9JRDoNCi0gICAgICAgIGhmZGNhbi0+TXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBkZWZhdWx0Og0KLSAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovDQotICAgICAgICBoZmRjYW4tPkVycm9yQ29kZSB8PSBIQUxfRkRDQU5fRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsNCi0NCi0gICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8NCi0gICAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsNCi0gICAgICAgIGJyZWFrOw0KLSAgICB9DQotICB9IGVsc2Ugew0KLSAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8NCi0gICAgaGZkY2FuLT5FcnJvckNvZGUgfD0gSEFMX0ZEQ0FOX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7DQotDQotICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8NCi0gICAgc3RhdHVzID0gSEFMX0VSUk9SOw0KLSAgfQ0KLQ0KLSAgcmV0dXJuIHN0YXR1czsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBVbnJlZ2lzdGVyIGEgRkRDQU4gQ2FsbEJhY2suDQotICogICAgICAgICBGRENBTiBjYWxsYmFjayBpcyByZWRpcmVjdGVkIHRvIHRoZSB3ZWFrIHByZWRlZmluZWQgY2FsbGJhY2sNCi0gKiBAcGFyYW0gIGhmZGNhbiBwb2ludGVyIHRvIGEgRkRDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KLSAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIEZEQ0FOIG1vZHVsZQ0KLSAqIEBwYXJhbSAgQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgdW5yZWdpc3RlcmVkDQotICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX0ZEQ0FOX1RYX0ZJRk9fRU1QVFlfQ0JfSUQgVHggRmlmbyBFbXB0eSBjYWxsYmFjayBJRA0KLSAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX0ZEQ0FOX0hJR0hfUFJJT19NRVNTQUdFX0NCX0lEIEhpZ2ggcHJpb3JpdHkgbWVzc2FnZQ0KLSAqIGNhbGxiYWNrIElEDQotICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfRkRDQU5fVElNRVNUQU1QX1dSQVBBUk9VTkRfQ0JfSUQgVGltZXN0YW1wIHdyYXBhcm91bmQNCi0gKiBjYWxsYmFjayBJRA0KLSAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX0ZEQ0FOX1RJTUVPVVRfT0NDVVJSRURfQ0JfSUQgVGltZW91dCBvY2N1cnJlZA0KLSAqIGNhbGxiYWNrIElEDQotICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfRkRDQU5fRVJST1JfQ0FMTEJBQ0tfQ0JfSUQgRXJyb3IgY2FsbGJhY2sgSUQNCi0gKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9GRENBTl9NU1BJTklUX0NCX0lEIE1zcEluaXQgY2FsbGJhY2sgSUQNCi0gKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9GRENBTl9NU1BERUlOSVRfQ0JfSUQgTXNwRGVJbml0IGNhbGxiYWNrIElEDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX1VuUmVnaXN0ZXJDYWxsYmFjaygNCi0gICAgRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLCBIQUxfRkRDQU5fQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCkgew0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOw0KLQ0KLSAgaWYgKGhmZGNhbi0+U3RhdGUgPT0gSEFMX0ZEQ0FOX1NUQVRFX1JFQURZKSB7DQotICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkgew0KLSAgICAgIGNhc2UgSEFMX0ZEQ0FOX1RYX0ZJRk9fRU1QVFlfQ0JfSUQ6DQotICAgICAgICBoZmRjYW4tPlR4Rmlmb0VtcHR5Q2FsbGJhY2sgPSBIQUxfRkRDQU5fVHhGaWZvRW1wdHlDYWxsYmFjazsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgSEFMX0ZEQ0FOX0hJR0hfUFJJT19NRVNTQUdFX0NCX0lEOg0KLSAgICAgICAgaGZkY2FuLT5IaWdoUHJpb3JpdHlNZXNzYWdlQ2FsbGJhY2sgPQ0KLSAgICAgICAgICAgIEhBTF9GRENBTl9IaWdoUHJpb3JpdHlNZXNzYWdlQ2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9GRENBTl9USU1FU1RBTVBfV1JBUEFST1VORF9DQl9JRDoNCi0gICAgICAgIGhmZGNhbi0+VGltZXN0YW1wV3JhcGFyb3VuZENhbGxiYWNrID0NCi0gICAgICAgICAgICBIQUxfRkRDQU5fVGltZXN0YW1wV3JhcGFyb3VuZENhbGxiYWNrOw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfRkRDQU5fVElNRU9VVF9PQ0NVUlJFRF9DQl9JRDoNCi0gICAgICAgIGhmZGNhbi0+VGltZW91dE9jY3VycmVkQ2FsbGJhY2sgPSBIQUxfRkRDQU5fVGltZW91dE9jY3VycmVkQ2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9GRENBTl9FUlJPUl9DQUxMQkFDS19DQl9JRDoNCi0gICAgICAgIGhmZGNhbi0+RXJyb3JDYWxsYmFjayA9IEhBTF9GRENBTl9FcnJvckNhbGxiYWNrOw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfRkRDQU5fTVNQSU5JVF9DQl9JRDoNCi0gICAgICAgIGhmZGNhbi0+TXNwSW5pdENhbGxiYWNrID0gSEFMX0ZEQ0FOX01zcEluaXQ7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9GRENBTl9NU1BERUlOSVRfQ0JfSUQ6DQotICAgICAgICBoZmRjYW4tPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX0ZEQ0FOX01zcERlSW5pdDsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGRlZmF1bHQ6DQotICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8NCi0gICAgICAgIGhmZGNhbi0+RXJyb3JDb2RlIHw9IEhBTF9GRENBTl9FUlJPUl9JTlZBTElEX0NBTExCQUNLOw0KLQ0KLSAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLw0KLSAgICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOw0KLSAgICAgICAgYnJlYWs7DQotICAgIH0NCi0gIH0gZWxzZSBpZiAoaGZkY2FuLT5TdGF0ZSA9PSBIQUxfRkRDQU5fU1RBVEVfUkVTRVQpIHsNCi0gICAgc3dpdGNoIChDYWxsYmFja0lEKSB7DQotICAgICAgY2FzZSBIQUxfRkRDQU5fTVNQSU5JVF9DQl9JRDoNCi0gICAgICAgIGhmZGNhbi0+TXNwSW5pdENhbGxiYWNrID0gSEFMX0ZEQ0FOX01zcEluaXQ7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9GRENBTl9NU1BERUlOSVRfQ0JfSUQ6DQotICAgICAgICBoZmRjYW4tPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX0ZEQ0FOX01zcERlSW5pdDsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGRlZmF1bHQ6DQotICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8NCi0gICAgICAgIGhmZGNhbi0+RXJyb3JDb2RlIHw9IEhBTF9GRENBTl9FUlJPUl9JTlZBTElEX0NBTExCQUNLOw0KLQ0KLSAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLw0KLSAgICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOw0KLSAgICAgICAgYnJlYWs7DQotICAgIH0NCi0gIH0gZWxzZSB7DQotICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLw0KLSAgICBoZmRjYW4tPkVycm9yQ29kZSB8PSBIQUxfRkRDQU5fRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsNCi0NCi0gICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLw0KLSAgICBzdGF0dXMgPSBIQUxfRVJST1I7DQotICB9DQotDQotICByZXR1cm4gc3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJlZ2lzdGVyIFR4IEV2ZW50IEZpZm8gRkRDQU4gQ2FsbGJhY2sNCi0gKiAgICAgICAgIFRvIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgd2VhayBIQUxfRkRDQU5fVHhFdmVudEZpZm9DYWxsYmFjaygpDQotICogcHJlZGVmaW5lZCBjYWxsYmFjaw0KLSAqIEBwYXJhbSAgaGZkY2FuIEZEQ0FOIGhhbmRsZQ0KLSAqIEBwYXJhbSAgcENhbGxiYWNrIHBvaW50ZXIgdG8gdGhlIFR4IEV2ZW50IEZpZm8gQ2FsbGJhY2sgZnVuY3Rpb24NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fUmVnaXN0ZXJUeEV2ZW50Rmlmb0NhbGxiYWNrKA0KLSAgICBGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4sIHBGRENBTl9UeEV2ZW50Rmlmb0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spIHsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsNCi0NCi0gIGlmIChwQ2FsbGJhY2sgPT0gTlVMTCkgew0KLSAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8NCi0gICAgaGZkY2FuLT5FcnJvckNvZGUgfD0gSEFMX0ZEQ0FOX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7DQotICAgIHJldHVybiBIQUxfRVJST1I7DQotICB9DQotDQotICBpZiAoaGZkY2FuLT5TdGF0ZSA9PSBIQUxfRkRDQU5fU1RBVEVfUkVBRFkpIHsNCi0gICAgaGZkY2FuLT5UeEV2ZW50Rmlmb0NhbGxiYWNrID0gcENhbGxiYWNrOw0KLSAgfSBlbHNlIHsNCi0gICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovDQotICAgIGhmZGNhbi0+RXJyb3JDb2RlIHw9IEhBTF9GRENBTl9FUlJPUl9JTlZBTElEX0NBTExCQUNLOw0KLQ0KLSAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovDQotICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsNCi0gIH0NCi0NCi0gIHJldHVybiBzdGF0dXM7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgVW5SZWdpc3RlciB0aGUgVHggRXZlbnQgRmlmbyBGRENBTiBDYWxsYmFjaw0KLSAqICAgICAgICAgVHggRXZlbnQgRmlmbyBGRENBTiBDYWxsYmFjayBpcyByZWRpcmVjdGVkIHRvIHRoZSB3ZWFrDQotICogSEFMX0ZEQ0FOX1R4RXZlbnRGaWZvQ2FsbGJhY2soKSBwcmVkZWZpbmVkIGNhbGxiYWNrDQotICogQHBhcmFtICBoZmRjYW4gRkRDQU4gaGFuZGxlDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX1VuUmVnaXN0ZXJUeEV2ZW50Rmlmb0NhbGxiYWNrKA0KLSAgICBGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pIHsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsNCi0NCi0gIGlmIChoZmRjYW4tPlN0YXRlID09IEhBTF9GRENBTl9TVEFURV9SRUFEWSkgew0KLSAgICBoZmRjYW4tPlR4RXZlbnRGaWZvQ2FsbGJhY2sgPQ0KLSAgICAgICAgSEFMX0ZEQ0FOX1R4RXZlbnRGaWZvQ2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIFR4RXZlbnRGaWZvQ2FsbGJhY2sgICovDQotICB9IGVsc2Ugew0KLSAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8NCi0gICAgaGZkY2FuLT5FcnJvckNvZGUgfD0gSEFMX0ZEQ0FOX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7DQotDQotICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8NCi0gICAgc3RhdHVzID0gSEFMX0VSUk9SOw0KLSAgfQ0KLQ0KLSAgcmV0dXJuIHN0YXR1czsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBSZWdpc3RlciBSeCBGaWZvIDAgRkRDQU4gQ2FsbGJhY2sNCi0gKiAgICAgICAgIFRvIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgd2VhayBIQUxfRkRDQU5fUnhGaWZvMENhbGxiYWNrKCkgcHJlZGVmaW5lZA0KLSAqIGNhbGxiYWNrDQotICogQHBhcmFtICBoZmRjYW4gRkRDQU4gaGFuZGxlDQotICogQHBhcmFtICBwQ2FsbGJhY2sgcG9pbnRlciB0byB0aGUgUnggRmlmbyAwIENhbGxiYWNrIGZ1bmN0aW9uDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX1JlZ2lzdGVyUnhGaWZvMENhbGxiYWNrKA0KLSAgICBGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4sIHBGRENBTl9SeEZpZm8wQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjaykgew0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOw0KLQ0KLSAgaWYgKHBDYWxsYmFjayA9PSBOVUxMKSB7DQotICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLw0KLSAgICBoZmRjYW4tPkVycm9yQ29kZSB8PSBIQUxfRkRDQU5fRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsNCi0gICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gIH0NCi0NCi0gIGlmIChoZmRjYW4tPlN0YXRlID09IEhBTF9GRENBTl9TVEFURV9SRUFEWSkgew0KLSAgICBoZmRjYW4tPlJ4RmlmbzBDYWxsYmFjayA9IHBDYWxsYmFjazsNCi0gIH0gZWxzZSB7DQotICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLw0KLSAgICBoZmRjYW4tPkVycm9yQ29kZSB8PSBIQUxfRkRDQU5fRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsNCi0NCi0gICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLw0KLSAgICBzdGF0dXMgPSBIQUxfRVJST1I7DQotICB9DQotDQotICByZXR1cm4gc3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFVuUmVnaXN0ZXIgdGhlIFJ4IEZpZm8gMCBGRENBTiBDYWxsYmFjaw0KLSAqICAgICAgICAgUnggRmlmbyAwIEZEQ0FOIENhbGxiYWNrIGlzIHJlZGlyZWN0ZWQgdG8gdGhlIHdlYWsNCi0gKiBIQUxfRkRDQU5fUnhGaWZvMENhbGxiYWNrKCkgcHJlZGVmaW5lZCBjYWxsYmFjaw0KLSAqIEBwYXJhbSAgaGZkY2FuIEZEQ0FOIGhhbmRsZQ0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9VblJlZ2lzdGVyUnhGaWZvMENhbGxiYWNrKA0KLSAgICBGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pIHsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsNCi0NCi0gIGlmIChoZmRjYW4tPlN0YXRlID09IEhBTF9GRENBTl9TVEFURV9SRUFEWSkgew0KLSAgICBoZmRjYW4tPlJ4RmlmbzBDYWxsYmFjayA9DQotICAgICAgICBIQUxfRkRDQU5fUnhGaWZvMENhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBSeEZpZm8wQ2FsbGJhY2sgICovDQotICB9IGVsc2Ugew0KLSAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8NCi0gICAgaGZkY2FuLT5FcnJvckNvZGUgfD0gSEFMX0ZEQ0FOX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7DQotDQotICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8NCi0gICAgc3RhdHVzID0gSEFMX0VSUk9SOw0KLSAgfQ0KLQ0KLSAgcmV0dXJuIHN0YXR1czsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBSZWdpc3RlciBSeCBGaWZvIDEgRkRDQU4gQ2FsbGJhY2sNCi0gKiAgICAgICAgIFRvIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgd2VhayBIQUxfRkRDQU5fUnhGaWZvMUNhbGxiYWNrKCkgcHJlZGVmaW5lZA0KLSAqIGNhbGxiYWNrDQotICogQHBhcmFtICBoZmRjYW4gRkRDQU4gaGFuZGxlDQotICogQHBhcmFtICBwQ2FsbGJhY2sgcG9pbnRlciB0byB0aGUgUnggRmlmbyAxIENhbGxiYWNrIGZ1bmN0aW9uDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX1JlZ2lzdGVyUnhGaWZvMUNhbGxiYWNrKA0KLSAgICBGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4sIHBGRENBTl9SeEZpZm8xQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjaykgew0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOw0KLQ0KLSAgaWYgKHBDYWxsYmFjayA9PSBOVUxMKSB7DQotICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLw0KLSAgICBoZmRjYW4tPkVycm9yQ29kZSB8PSBIQUxfRkRDQU5fRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsNCi0gICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gIH0NCi0NCi0gIGlmIChoZmRjYW4tPlN0YXRlID09IEhBTF9GRENBTl9TVEFURV9SRUFEWSkgew0KLSAgICBoZmRjYW4tPlJ4RmlmbzFDYWxsYmFjayA9IHBDYWxsYmFjazsNCi0gIH0gZWxzZSB7DQotICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLw0KLSAgICBoZmRjYW4tPkVycm9yQ29kZSB8PSBIQUxfRkRDQU5fRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsNCi0NCi0gICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLw0KLSAgICBzdGF0dXMgPSBIQUxfRVJST1I7DQotICB9DQotDQotICByZXR1cm4gc3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFVuUmVnaXN0ZXIgdGhlIFJ4IEZpZm8gMSBGRENBTiBDYWxsYmFjaw0KLSAqICAgICAgICAgUnggRmlmbyAxIEZEQ0FOIENhbGxiYWNrIGlzIHJlZGlyZWN0ZWQgdG8gdGhlIHdlYWsNCi0gKiBIQUxfRkRDQU5fUnhGaWZvMUNhbGxiYWNrKCkgcHJlZGVmaW5lZCBjYWxsYmFjaw0KLSAqIEBwYXJhbSAgaGZkY2FuIEZEQ0FOIGhhbmRsZQ0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9VblJlZ2lzdGVyUnhGaWZvMUNhbGxiYWNrKA0KLSAgICBGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pIHsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsNCi0NCi0gIGlmIChoZmRjYW4tPlN0YXRlID09IEhBTF9GRENBTl9TVEFURV9SRUFEWSkgew0KLSAgICBoZmRjYW4tPlJ4RmlmbzFDYWxsYmFjayA9DQotICAgICAgICBIQUxfRkRDQU5fUnhGaWZvMUNhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBSeEZpZm8xQ2FsbGJhY2sgICovDQotICB9IGVsc2Ugew0KLSAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8NCi0gICAgaGZkY2FuLT5FcnJvckNvZGUgfD0gSEFMX0ZEQ0FOX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7DQotDQotICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8NCi0gICAgc3RhdHVzID0gSEFMX0VSUk9SOw0KLSAgfQ0KLQ0KLSAgcmV0dXJuIHN0YXR1czsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBSZWdpc3RlciBUeCBCdWZmZXIgQ29tcGxldGUgRkRDQU4gQ2FsbGJhY2sNCi0gKiAgICAgICAgIFRvIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgd2VhayBIQUxfRkRDQU5fVHhCdWZmZXJDb21wbGV0ZUNhbGxiYWNrKCkNCi0gKiBwcmVkZWZpbmVkIGNhbGxiYWNrDQotICogQHBhcmFtICBoZmRjYW4gRkRDQU4gaGFuZGxlDQotICogQHBhcmFtICBwQ2FsbGJhY2sgcG9pbnRlciB0byB0aGUgVHggQnVmZmVyIENvbXBsZXRlIENhbGxiYWNrIGZ1bmN0aW9uDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX1JlZ2lzdGVyVHhCdWZmZXJDb21wbGV0ZUNhbGxiYWNrKA0KLSAgICBGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4sDQotICAgIHBGRENBTl9UeEJ1ZmZlckNvbXBsZXRlQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjaykgew0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOw0KLQ0KLSAgaWYgKHBDYWxsYmFjayA9PSBOVUxMKSB7DQotICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLw0KLSAgICBoZmRjYW4tPkVycm9yQ29kZSB8PSBIQUxfRkRDQU5fRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsNCi0gICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gIH0NCi0NCi0gIGlmIChoZmRjYW4tPlN0YXRlID09IEhBTF9GRENBTl9TVEFURV9SRUFEWSkgew0KLSAgICBoZmRjYW4tPlR4QnVmZmVyQ29tcGxldGVDYWxsYmFjayA9IHBDYWxsYmFjazsNCi0gIH0gZWxzZSB7DQotICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLw0KLSAgICBoZmRjYW4tPkVycm9yQ29kZSB8PSBIQUxfRkRDQU5fRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsNCi0NCi0gICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLw0KLSAgICBzdGF0dXMgPSBIQUxfRVJST1I7DQotICB9DQotDQotICByZXR1cm4gc3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFVuUmVnaXN0ZXIgdGhlIFR4IEJ1ZmZlciBDb21wbGV0ZSBGRENBTiBDYWxsYmFjaw0KLSAqICAgICAgICAgVHggQnVmZmVyIENvbXBsZXRlIEZEQ0FOIENhbGxiYWNrIGlzIHJlZGlyZWN0ZWQgdG8NCi0gKiAgICAgICAgIHRoZSB3ZWFrIEhBTF9GRENBTl9UeEJ1ZmZlckNvbXBsZXRlQ2FsbGJhY2soKSBwcmVkZWZpbmVkIGNhbGxiYWNrDQotICogQHBhcmFtICBoZmRjYW4gRkRDQU4gaGFuZGxlDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX1VuUmVnaXN0ZXJUeEJ1ZmZlckNvbXBsZXRlQ2FsbGJhY2soDQotICAgIEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbikgew0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOw0KLQ0KLSAgaWYgKGhmZGNhbi0+U3RhdGUgPT0gSEFMX0ZEQ0FOX1NUQVRFX1JFQURZKSB7DQotICAgIGhmZGNhbi0+VHhCdWZmZXJDb21wbGV0ZUNhbGxiYWNrID0NCi0gICAgICAgIEhBTF9GRENBTl9UeEJ1ZmZlckNvbXBsZXRlQ2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeEJ1ZmZlckNvbXBsZXRlQ2FsbGJhY2sgICovDQotICB9IGVsc2Ugew0KLSAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8NCi0gICAgaGZkY2FuLT5FcnJvckNvZGUgfD0gSEFMX0ZEQ0FOX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7DQotDQotICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8NCi0gICAgc3RhdHVzID0gSEFMX0VSUk9SOw0KLSAgfQ0KLQ0KLSAgcmV0dXJuIHN0YXR1czsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBSZWdpc3RlciBUeCBCdWZmZXIgQWJvcnQgRkRDQU4gQ2FsbGJhY2sNCi0gKiAgICAgICAgIFRvIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgd2VhayBIQUxfRkRDQU5fVHhCdWZmZXJBYm9ydENhbGxiYWNrKCkNCi0gKiBwcmVkZWZpbmVkIGNhbGxiYWNrDQotICogQHBhcmFtICBoZmRjYW4gRkRDQU4gaGFuZGxlDQotICogQHBhcmFtICBwQ2FsbGJhY2sgcG9pbnRlciB0byB0aGUgVHggQnVmZmVyIEFib3J0IENhbGxiYWNrIGZ1bmN0aW9uDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX1JlZ2lzdGVyVHhCdWZmZXJBYm9ydENhbGxiYWNrKA0KLSAgICBGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4sDQotICAgIHBGRENBTl9UeEJ1ZmZlckFib3J0Q2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjaykgew0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOw0KLQ0KLSAgaWYgKHBDYWxsYmFjayA9PSBOVUxMKSB7DQotICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLw0KLSAgICBoZmRjYW4tPkVycm9yQ29kZSB8PSBIQUxfRkRDQU5fRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsNCi0gICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gIH0NCi0NCi0gIGlmIChoZmRjYW4tPlN0YXRlID09IEhBTF9GRENBTl9TVEFURV9SRUFEWSkgew0KLSAgICBoZmRjYW4tPlR4QnVmZmVyQWJvcnRDYWxsYmFjayA9IHBDYWxsYmFjazsNCi0gIH0gZWxzZSB7DQotICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLw0KLSAgICBoZmRjYW4tPkVycm9yQ29kZSB8PSBIQUxfRkRDQU5fRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsNCi0NCi0gICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLw0KLSAgICBzdGF0dXMgPSBIQUxfRVJST1I7DQotICB9DQotDQotICByZXR1cm4gc3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFVuUmVnaXN0ZXIgdGhlIFR4IEJ1ZmZlciBBYm9ydCBGRENBTiBDYWxsYmFjaw0KLSAqICAgICAgICAgVHggQnVmZmVyIEFib3J0IEZEQ0FOIENhbGxiYWNrIGlzIHJlZGlyZWN0ZWQgdG8NCi0gKiAgICAgICAgIHRoZSB3ZWFrIEhBTF9GRENBTl9UeEJ1ZmZlckFib3J0Q2FsbGJhY2soKSBwcmVkZWZpbmVkIGNhbGxiYWNrDQotICogQHBhcmFtICBoZmRjYW4gRkRDQU4gaGFuZGxlDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX1VuUmVnaXN0ZXJUeEJ1ZmZlckFib3J0Q2FsbGJhY2soDQotICAgIEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbikgew0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOw0KLQ0KLSAgaWYgKGhmZGNhbi0+U3RhdGUgPT0gSEFMX0ZEQ0FOX1NUQVRFX1JFQURZKSB7DQotICAgIGhmZGNhbi0+VHhCdWZmZXJBYm9ydENhbGxiYWNrID0NCi0gICAgICAgIEhBTF9GRENBTl9UeEJ1ZmZlckFib3J0Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIFR4QnVmZmVyQWJvcnRDYWxsYmFjayAqLw0KLSAgfSBlbHNlIHsNCi0gICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovDQotICAgIGhmZGNhbi0+RXJyb3JDb2RlIHw9IEhBTF9GRENBTl9FUlJPUl9JTlZBTElEX0NBTExCQUNLOw0KLQ0KLSAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovDQotICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsNCi0gIH0NCi0NCi0gIHJldHVybiBzdGF0dXM7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmVnaXN0ZXIgRXJyb3IgU3RhdHVzIEZEQ0FOIENhbGxiYWNrDQotICogICAgICAgICBUbyBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHdlYWsgSEFMX0ZEQ0FOX0Vycm9yU3RhdHVzQ2FsbGJhY2soKQ0KLSAqIHByZWRlZmluZWQgY2FsbGJhY2sNCi0gKiBAcGFyYW0gIGhmZGNhbiBGRENBTiBoYW5kbGUNCi0gKiBAcGFyYW0gIHBDYWxsYmFjayBwb2ludGVyIHRvIHRoZSBFcnJvciBTdGF0dXMgQ2FsbGJhY2sgZnVuY3Rpb24NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fUmVnaXN0ZXJFcnJvclN0YXR1c0NhbGxiYWNrKA0KLSAgICBGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4sIHBGRENBTl9FcnJvclN0YXR1c0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spIHsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsNCi0NCi0gIGlmIChwQ2FsbGJhY2sgPT0gTlVMTCkgew0KLSAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8NCi0gICAgaGZkY2FuLT5FcnJvckNvZGUgfD0gSEFMX0ZEQ0FOX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7DQotICAgIHJldHVybiBIQUxfRVJST1I7DQotICB9DQotDQotICBpZiAoaGZkY2FuLT5TdGF0ZSA9PSBIQUxfRkRDQU5fU1RBVEVfUkVBRFkpIHsNCi0gICAgaGZkY2FuLT5FcnJvclN0YXR1c0NhbGxiYWNrID0gcENhbGxiYWNrOw0KLSAgfSBlbHNlIHsNCi0gICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovDQotICAgIGhmZGNhbi0+RXJyb3JDb2RlIHw9IEhBTF9GRENBTl9FUlJPUl9JTlZBTElEX0NBTExCQUNLOw0KLQ0KLSAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovDQotICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsNCi0gIH0NCi0NCi0gIHJldHVybiBzdGF0dXM7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgVW5SZWdpc3RlciB0aGUgRXJyb3IgU3RhdHVzIEZEQ0FOIENhbGxiYWNrDQotICogICAgICAgICBFcnJvciBTdGF0dXMgRkRDQU4gQ2FsbGJhY2sgaXMgcmVkaXJlY3RlZCB0byB0aGUgd2Vhaw0KLSAqIEhBTF9GRENBTl9FcnJvclN0YXR1c0NhbGxiYWNrKCkgcHJlZGVmaW5lZCBjYWxsYmFjaw0KLSAqIEBwYXJhbSAgaGZkY2FuIEZEQ0FOIGhhbmRsZQ0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9VblJlZ2lzdGVyRXJyb3JTdGF0dXNDYWxsYmFjaygNCi0gICAgRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuKSB7DQotICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7DQotDQotICBpZiAoaGZkY2FuLT5TdGF0ZSA9PSBIQUxfRkRDQU5fU1RBVEVfUkVBRFkpIHsNCi0gICAgaGZkY2FuLT5FcnJvclN0YXR1c0NhbGxiYWNrID0NCi0gICAgICAgIEhBTF9GRENBTl9FcnJvclN0YXR1c0NhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBFcnJvclN0YXR1c0NhbGxiYWNrICAqLw0KLSAgfSBlbHNlIHsNCi0gICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovDQotICAgIGhmZGNhbi0+RXJyb3JDb2RlIHw9IEhBTF9GRENBTl9FUlJPUl9JTlZBTElEX0NBTExCQUNLOw0KLQ0KLSAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovDQotICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsNCi0gIH0NCi0NCi0gIHJldHVybiBzdGF0dXM7DQotfQ0KLQ0KLSNlbmRpZiAvKiBVU0VfSEFMX0ZEQ0FOX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBGRENBTl9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zDQotICAqICBAYnJpZWYgICAgRkRDQU4gQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMuDQotICAqDQotQHZlcmJhdGltDQotICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgICAgICAgICAgICMjIyMjIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zICMjIyMjDQotICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoNCi0gICAgICAoKykgSEFMX0ZEQ0FOX0NvbmZpZ0ZpbHRlciAgICAgICAgICAgICAgICAgIDogQ29uZmlndXJlIHRoZSBGRENBTg0KLXJlY2VwdGlvbiBmaWx0ZXJzDQotICAgICAgKCspIEhBTF9GRENBTl9Db25maWdHbG9iYWxGaWx0ZXIgICAgICAgICAgICA6IENvbmZpZ3VyZSB0aGUgRkRDQU4gZ2xvYmFsDQotZmlsdGVyDQotICAgICAgKCspIEhBTF9GRENBTl9Db25maWdFeHRlbmRlZElkTWFzayAgICAgICAgICA6IENvbmZpZ3VyZSB0aGUgZXh0ZW5kZWQgSUQNCi1tYXNrDQotICAgICAgKCspIEhBTF9GRENBTl9Db25maWdSeEZpZm9PdmVyd3JpdGUgICAgICAgICA6IENvbmZpZ3VyZSB0aGUgUnggRklGTw0KLW9wZXJhdGlvbiBtb2RlDQotICAgICAgKCspIEhBTF9GRENBTl9Db25maWdSYW1XYXRjaGRvZyAgICAgICAgICAgICA6IENvbmZpZ3VyZSB0aGUgUkFNIHdhdGNoZG9nDQotICAgICAgKCspIEhBTF9GRENBTl9Db25maWdUaW1lc3RhbXBDb3VudGVyICAgICAgICA6IENvbmZpZ3VyZSB0aGUgdGltZXN0YW1wDQotY291bnRlcg0KLSAgICAgICAgKCspIEhBTF9GRENBTl9FbmFibGVUaW1lc3RhbXBDb3VudGVyICAgICAgICA6IEVuYWJsZSB0aGUgdGltZXN0YW1wDQotY291bnRlcg0KLSAgICAgICAgKCspIEhBTF9GRENBTl9EaXNhYmxlVGltZXN0YW1wQ291bnRlciAgICAgICA6IERpc2FibGUgdGhlIHRpbWVzdGFtcA0KLWNvdW50ZXINCi0gICAgICAgICgrKSBIQUxfRkRDQU5fR2V0VGltZXN0YW1wQ291bnRlciAgICAgICAgICAgOiBHZXQgdGhlIHRpbWVzdGFtcCBjb3VudGVyDQotdmFsdWUNCi0gICAgICAgICgrKSBIQUxfRkRDQU5fUmVzZXRUaW1lc3RhbXBDb3VudGVyICAgICAgICAgOiBSZXNldCB0aGUgdGltZXN0YW1wDQotY291bnRlciB0byB6ZXJvDQotICAgICAgKCspIEhBTF9GRENBTl9Db25maWdUaW1lb3V0Q291bnRlciAgICAgICAgICA6IENvbmZpZ3VyZSB0aGUgdGltZW91dA0KLWNvdW50ZXINCi0gICAgICAgICgrKSBIQUxfRkRDQU5fRW5hYmxlVGltZW91dENvdW50ZXIgICAgICAgICAgOiBFbmFibGUgdGhlIHRpbWVvdXQgY291bnRlcg0KLSAgICAgICAgKCspIEhBTF9GRENBTl9EaXNhYmxlVGltZW91dENvdW50ZXIgICAgICAgICA6IERpc2FibGUgdGhlIHRpbWVvdXQNCi1jb3VudGVyDQotICAgICAgICAoKykgSEFMX0ZEQ0FOX0dldFRpbWVvdXRDb3VudGVyICAgICAgICAgICAgIDogR2V0IHRoZSB0aW1lb3V0IGNvdW50ZXINCi12YWx1ZQ0KLSAgICAgICAgKCspIEhBTF9GRENBTl9SZXNldFRpbWVvdXRDb3VudGVyICAgICAgICAgICA6IFJlc2V0IHRoZSB0aW1lb3V0IGNvdW50ZXINCi10byBpdHMgc3RhcnQgdmFsdWUNCi0gICAgICAoKykgSEFMX0ZEQ0FOX0NvbmZpZ1R4RGVsYXlDb21wZW5zYXRpb24gICAgIDogQ29uZmlndXJlIHRoZSB0cmFuc21pdHRlcg0KLWRlbGF5IGNvbXBlbnNhdGlvbg0KLSAgICAgICAgKCspIEhBTF9GRENBTl9FbmFibGVUeERlbGF5Q29tcGVuc2F0aW9uICAgICA6IEVuYWJsZSB0aGUgdHJhbnNtaXR0ZXINCi1kZWxheSBjb21wZW5zYXRpb24NCi0gICAgICAgICgrKSBIQUxfRkRDQU5fRGlzYWJsZVR4RGVsYXlDb21wZW5zYXRpb24gICAgOiBEaXNhYmxlIHRoZSB0cmFuc21pdHRlcg0KLWRlbGF5IGNvbXBlbnNhdGlvbg0KLSAgICAgICgrKSBIQUxfRkRDQU5fRW5hYmxlSVNPTW9kZSAgICAgICAgICAgICAgICAgOiBFbmFibGUgSVNPIDExODk4LTEgcHJvdG9jb2wNCi1tb2RlDQotICAgICAgKCspIEhBTF9GRENBTl9EaXNhYmxlSVNPTW9kZSAgICAgICAgICAgICAgICA6IERpc2FibGUgSVNPIDExODk4LTEgcHJvdG9jb2wNCi1tb2RlDQotICAgICAgKCspIEhBTF9GRENBTl9FbmFibGVFZGdlRmlsdGVyaW5nICAgICAgICAgICA6IEVuYWJsZSBlZGdlIGZpbHRlcmluZyBkdXJpbmcNCi1idXMgaW50ZWdyYXRpb24NCi0gICAgICAoKykgSEFMX0ZEQ0FOX0Rpc2FibGVFZGdlRmlsdGVyaW5nICAgICAgICAgIDogRGlzYWJsZSBlZGdlIGZpbHRlcmluZw0KLWR1cmluZyBidXMgaW50ZWdyYXRpb24NCi0NCi1AZW5kdmVyYmF0aW0NCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICogQGJyaWVmICBDb25maWd1cmUgdGhlIEZEQ0FOIHJlY2VwdGlvbiBmaWx0ZXIgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQNCi0gKiAgICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIEZEQ0FOX0ZpbHRlclR5cGVEZWYgc3RydWN0dXJlLg0KLSAqIEBwYXJhbSAgaGZkY2FuIHBvaW50ZXIgdG8gYW4gRkRDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KLSAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRkRDQU4uDQotICogQHBhcmFtICBzRmlsdGVyQ29uZmlnIHBvaW50ZXIgdG8gYW4gRkRDQU5fRmlsdGVyVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdA0KLSAqICAgICAgICAgY29udGFpbnMgdGhlIGZpbHRlciBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX0NvbmZpZ0ZpbHRlcihGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRENBTl9GaWx0ZXJUeXBlRGVmICpzRmlsdGVyQ29uZmlnKSB7DQotICB1aW50MzJfdCBGaWx0ZXJFbGVtZW50VzE7DQotICB1aW50MzJfdCBGaWx0ZXJFbGVtZW50VzI7DQotICB1aW50MzJfdCAqRmlsdGVyQWRkcmVzczsNCi0gIEhBTF9GRENBTl9TdGF0ZVR5cGVEZWYgc3RhdGUgPSBoZmRjYW4tPlN0YXRlOw0KLQ0KLSAgaWYgKChzdGF0ZSA9PSBIQUxfRkRDQU5fU1RBVEVfUkVBRFkpIHx8IChzdGF0ZSA9PSBIQUxfRkRDQU5fU1RBVEVfQlVTWSkpIHsNCi0gICAgLyogQ2hlY2sgZnVuY3Rpb24gcGFyYW1ldGVycyAqLw0KLSAgICBhc3NlcnRfcGFyYW0oSVNfRkRDQU5fSURfVFlQRShzRmlsdGVyQ29uZmlnLT5JZFR5cGUpKTsNCi0gICAgYXNzZXJ0X3BhcmFtKElTX0ZEQ0FOX0ZJTFRFUl9DRkcoc0ZpbHRlckNvbmZpZy0+RmlsdGVyQ29uZmlnKSk7DQotDQotICAgIGlmIChzRmlsdGVyQ29uZmlnLT5JZFR5cGUgPT0gRkRDQU5fU1RBTkRBUkRfSUQpIHsNCi0gICAgICAvKiBDaGVjayBmdW5jdGlvbiBwYXJhbWV0ZXJzICovDQotICAgICAgYXNzZXJ0X3BhcmFtKElTX0ZEQ0FOX01BWF9WQUxVRShzRmlsdGVyQ29uZmlnLT5GaWx0ZXJJbmRleCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoZmRjYW4tPkluaXQuU3RkRmlsdGVyc05iciAtIDFVKSkpOw0KLSAgICAgIGFzc2VydF9wYXJhbShJU19GRENBTl9NQVhfVkFMVUUoc0ZpbHRlckNvbmZpZy0+RmlsdGVySUQxLCAweDdGRlUpKTsNCi0gICAgICBhc3NlcnRfcGFyYW0oSVNfRkRDQU5fTUFYX1ZBTFVFKHNGaWx0ZXJDb25maWctPkZpbHRlcklEMiwgMHg3RkZVKSk7DQotICAgICAgYXNzZXJ0X3BhcmFtKElTX0ZEQ0FOX1NURF9GSUxURVJfVFlQRShzRmlsdGVyQ29uZmlnLT5GaWx0ZXJUeXBlKSk7DQotDQotICAgICAgLyogQnVpbGQgZmlsdGVyIGVsZW1lbnQgKi8NCi0gICAgICBGaWx0ZXJFbGVtZW50VzEgPQ0KLSAgICAgICAgICAoKHNGaWx0ZXJDb25maWctPkZpbHRlclR5cGUgPDwgMzBVKSB8DQotICAgICAgICAgICAoc0ZpbHRlckNvbmZpZy0+RmlsdGVyQ29uZmlnIDw8IDI3VSkgfA0KLSAgICAgICAgICAgKHNGaWx0ZXJDb25maWctPkZpbHRlcklEMSA8PCAxNlUpIHwgc0ZpbHRlckNvbmZpZy0+RmlsdGVySUQyKTsNCi0NCi0gICAgICAvKiBDYWxjdWxhdGUgZmlsdGVyIGFkZHJlc3MgKi8NCi0gICAgICBGaWx0ZXJBZGRyZXNzID0NCi0gICAgICAgICAgKHVpbnQzMl90ICopKGhmZGNhbi0+bXNnUmFtLlN0YW5kYXJkRmlsdGVyU0EgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgKHNGaWx0ZXJDb25maWctPkZpbHRlckluZGV4ICogU1JBTUNBTl9GTFNfU0laRSkpOw0KLQ0KLSAgICAgIC8qIFdyaXRlIGZpbHRlciBlbGVtZW50IHRvIHRoZSBtZXNzYWdlIFJBTSAqLw0KLSAgICAgICpGaWx0ZXJBZGRyZXNzID0gRmlsdGVyRWxlbWVudFcxOw0KLSAgICB9IGVsc2UgLyogc0ZpbHRlckNvbmZpZy0+SWRUeXBlID09IEZEQ0FOX0VYVEVOREVEX0lEICovDQotICAgIHsNCi0gICAgICAvKiBDaGVjayBmdW5jdGlvbiBwYXJhbWV0ZXJzICovDQotICAgICAgYXNzZXJ0X3BhcmFtKElTX0ZEQ0FOX01BWF9WQUxVRShzRmlsdGVyQ29uZmlnLT5GaWx0ZXJJbmRleCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoZmRjYW4tPkluaXQuRXh0RmlsdGVyc05iciAtIDFVKSkpOw0KLSAgICAgIGFzc2VydF9wYXJhbShJU19GRENBTl9NQVhfVkFMVUUoc0ZpbHRlckNvbmZpZy0+RmlsdGVySUQxLCAweDFGRkZGRkZGVSkpOw0KLSAgICAgIGFzc2VydF9wYXJhbShJU19GRENBTl9NQVhfVkFMVUUoc0ZpbHRlckNvbmZpZy0+RmlsdGVySUQyLCAweDFGRkZGRkZGVSkpOw0KLSAgICAgIGFzc2VydF9wYXJhbShJU19GRENBTl9FWFRfRklMVEVSX1RZUEUoc0ZpbHRlckNvbmZpZy0+RmlsdGVyVHlwZSkpOw0KLQ0KLSAgICAgIC8qIEJ1aWxkIGZpcnN0IHdvcmQgb2YgZmlsdGVyIGVsZW1lbnQgKi8NCi0gICAgICBGaWx0ZXJFbGVtZW50VzEgPQ0KLSAgICAgICAgICAoKHNGaWx0ZXJDb25maWctPkZpbHRlckNvbmZpZyA8PCAyOVUpIHwgc0ZpbHRlckNvbmZpZy0+RmlsdGVySUQxKTsNCi0NCi0gICAgICAvKiBCdWlsZCBzZWNvbmQgd29yZCBvZiBmaWx0ZXIgZWxlbWVudCAqLw0KLSAgICAgIEZpbHRlckVsZW1lbnRXMiA9DQotICAgICAgICAgICgoc0ZpbHRlckNvbmZpZy0+RmlsdGVyVHlwZSA8PCAzMFUpIHwgc0ZpbHRlckNvbmZpZy0+RmlsdGVySUQyKTsNCi0NCi0gICAgICAvKiBDYWxjdWxhdGUgZmlsdGVyIGFkZHJlc3MgKi8NCi0gICAgICBGaWx0ZXJBZGRyZXNzID0NCi0gICAgICAgICAgKHVpbnQzMl90ICopKGhmZGNhbi0+bXNnUmFtLkV4dGVuZGVkRmlsdGVyU0EgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgKHNGaWx0ZXJDb25maWctPkZpbHRlckluZGV4ICogU1JBTUNBTl9GTEVfU0laRSkpOw0KLQ0KLSAgICAgIC8qIFdyaXRlIGZpbHRlciBlbGVtZW50IHRvIHRoZSBtZXNzYWdlIFJBTSAqLw0KLSAgICAgICpGaWx0ZXJBZGRyZXNzID0gRmlsdGVyRWxlbWVudFcxOw0KLSAgICAgIEZpbHRlckFkZHJlc3MrKzsNCi0gICAgICAqRmlsdGVyQWRkcmVzcyA9IEZpbHRlckVsZW1lbnRXMjsNCi0gICAgfQ0KLQ0KLSAgICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovDQotICAgIHJldHVybiBIQUxfT0s7DQotICB9IGVsc2Ugew0KLSAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLw0KLSAgICBoZmRjYW4tPkVycm9yQ29kZSB8PSBIQUxfRkRDQU5fRVJST1JfTk9UX0lOSVRJQUxJWkVEOw0KLQ0KLSAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgRkRDQU4gZ2xvYmFsIGZpbHRlci4NCi0gKiBAcGFyYW0gIGhmZGNhbiBwb2ludGVyIHRvIGFuIEZEQ0FOX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCi0gKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZEQ0FOLg0KLSAqIEBwYXJhbSAgTm9uTWF0Y2hpbmdTdGQgRGVmaW5lcyBob3cgcmVjZWl2ZWQgbWVzc2FnZXMgd2l0aCAxMS1iaXQgSURzIHRoYXQNCi0gKiAgICAgICAgIGRvIG5vdCBtYXRjaCBhbnkgZWxlbWVudCBvZiB0aGUgZmlsdGVyIGxpc3QgYXJlIHRyZWF0ZWQuDQotICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAYXJnIEZEQ0FOX05vbl9NYXRjaGluZ19GcmFtZXMuDQotICogQHBhcmFtICBOb25NYXRjaGluZ0V4dCBEZWZpbmVzIGhvdyByZWNlaXZlZCBtZXNzYWdlcyB3aXRoIDI5LWJpdCBJRHMgdGhhdA0KLSAqICAgICAgICAgZG8gbm90IG1hdGNoIGFueSBlbGVtZW50IG9mIHRoZSBmaWx0ZXIgbGlzdCBhcmUgdHJlYXRlZC4NCi0gKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEBhcmcgRkRDQU5fTm9uX01hdGNoaW5nX0ZyYW1lcy4NCi0gKiBAcGFyYW0gIFJlamVjdFJlbW90ZVN0ZCBGaWx0ZXIgb3IgcmVqZWN0IGFsbCB0aGUgcmVtb3RlIDExLWJpdCBJRHMgZnJhbWVzLg0KLSAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQGFyZyBGRENBTl9SZWplY3RfUmVtb3RlX0ZyYW1lcy4NCi0gKiBAcGFyYW0gIFJlamVjdFJlbW90ZUV4dCBGaWx0ZXIgb3IgcmVqZWN0IGFsbCB0aGUgcmVtb3RlIDI5LWJpdCBJRHMgZnJhbWVzLg0KLSAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQGFyZyBGRENBTl9SZWplY3RfUmVtb3RlX0ZyYW1lcy4NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fQ29uZmlnR2xvYmFsRmlsdGVyKEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE5vbk1hdGNoaW5nU3RkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgTm9uTWF0Y2hpbmdFeHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBSZWplY3RSZW1vdGVTdGQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBSZWplY3RSZW1vdGVFeHQpIHsNCi0gIC8qIENoZWNrIGZ1bmN0aW9uIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19GRENBTl9OT05fTUFUQ0hJTkcoTm9uTWF0Y2hpbmdTdGQpKTsNCi0gIGFzc2VydF9wYXJhbShJU19GRENBTl9OT05fTUFUQ0hJTkcoTm9uTWF0Y2hpbmdFeHQpKTsNCi0gIGFzc2VydF9wYXJhbShJU19GRENBTl9SRUpFQ1RfUkVNT1RFKFJlamVjdFJlbW90ZVN0ZCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZEQ0FOX1JFSkVDVF9SRU1PVEUoUmVqZWN0UmVtb3RlRXh0KSk7DQotDQotICBpZiAoaGZkY2FuLT5TdGF0ZSA9PSBIQUxfRkRDQU5fU1RBVEVfUkVBRFkpIHsNCi0gICAgLyogQ29uZmlndXJlIGdsb2JhbCBmaWx0ZXIgKi8NCi0gICAgTU9ESUZZX1JFRyhoZmRjYW4tPkluc3RhbmNlLT5SWEdGQywNCi0gICAgICAgICAgICAgICAoRkRDQU5fUlhHRkNfQU5GUyB8IEZEQ0FOX1JYR0ZDX0FORkUgfCBGRENBTl9SWEdGQ19SUkZTIHwNCi0gICAgICAgICAgICAgICAgRkRDQU5fUlhHRkNfUlJGRSksDQotICAgICAgICAgICAgICAgKChOb25NYXRjaGluZ1N0ZCA8PCBGRENBTl9SWEdGQ19BTkZTX1BvcykgfA0KLSAgICAgICAgICAgICAgICAoTm9uTWF0Y2hpbmdFeHQgPDwgRkRDQU5fUlhHRkNfQU5GRV9Qb3MpIHwNCi0gICAgICAgICAgICAgICAgKFJlamVjdFJlbW90ZVN0ZCA8PCBGRENBTl9SWEdGQ19SUkZTX1BvcykgfA0KLSAgICAgICAgICAgICAgICAoUmVqZWN0UmVtb3RlRXh0IDw8IEZEQ0FOX1JYR0ZDX1JSRkVfUG9zKSkpOw0KLQ0KLSAgICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovDQotICAgIHJldHVybiBIQUxfT0s7DQotICB9IGVsc2Ugew0KLSAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLw0KLSAgICBoZmRjYW4tPkVycm9yQ29kZSB8PSBIQUxfRkRDQU5fRVJST1JfTk9UX1JFQURZOw0KLQ0KLSAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBDb25maWd1cmUgdGhlIGV4dGVuZGVkIElEIG1hc2suDQotICAqIEBwYXJhbSAgaGZkY2FuIHBvaW50ZXIgdG8gYW4gRkRDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KLSAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZEQ0FOLg0KLSAgKiBAcGFyYW0gIE1hc2sgRXh0ZW5kZWQgSUQgTWFzay4NCi0gICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMHgxRkZGRkZGRg0KLSAgKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX0NvbmZpZ0V4dGVuZGVkSWRNYXNrKEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgTWFzaykgew0KLSAgLyogQ2hlY2sgZnVuY3Rpb24gcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZEQ0FOX01BWF9WQUxVRShNYXNrLCAweDFGRkZGRkZGVSkpOw0KLQ0KLSAgaWYgKGhmZGNhbi0+U3RhdGUgPT0gSEFMX0ZEQ0FOX1NUQVRFX1JFQURZKSB7DQotICAgIC8qIENvbmZpZ3VyZSB0aGUgZXh0ZW5kZWQgSUQgbWFzayAqLw0KLSAgICBoZmRjYW4tPkluc3RhbmNlLT5YSURBTSA9IE1hc2s7DQotDQotICAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8NCi0gICAgcmV0dXJuIEhBTF9PSzsNCi0gIH0gZWxzZSB7DQotICAgIC8qIFVwZGF0ZSBlcnJvciBjb2RlICovDQotICAgIGhmZGNhbi0+RXJyb3JDb2RlIHw9IEhBTF9GRENBTl9FUlJPUl9OT1RfUkVBRFk7DQotDQotICAgIHJldHVybiBIQUxfRVJST1I7DQotICB9DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBSeCBGSUZPIG9wZXJhdGlvbiBtb2RlLg0KLSAqIEBwYXJhbSAgaGZkY2FuIHBvaW50ZXIgdG8gYW4gRkRDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KLSAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRkRDQU4uDQotICogQHBhcmFtICBSeEZpZm8gUnggRklGTy4NCi0gKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgIEBhcmcgRkRDQU5fUlhfRklGTzA6IFJ4IEZJRk8gMA0KLSAqICAgICAgICAgICBAYXJnIEZEQ0FOX1JYX0ZJRk8xOiBSeCBGSUZPIDENCi0gKiBAcGFyYW0gIE9wZXJhdGlvbk1vZGUgb3BlcmF0aW9uIG1vZGUuDQotICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAYXJnIEZEQ0FOX1J4X0ZJRk9fb3BlcmF0aW9uX21vZGUuDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX0NvbmZpZ1J4Rmlmb092ZXJ3cml0ZShGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBSeEZpZm8sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBPcGVyYXRpb25Nb2RlKSB7DQotICAvKiBDaGVjayBmdW5jdGlvbiBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfRkRDQU5fUlhfRklGTyhSeEZpZm8pKTsNCi0gIGFzc2VydF9wYXJhbShJU19GRENBTl9SWF9GSUZPX01PREUoT3BlcmF0aW9uTW9kZSkpOw0KLQ0KLSAgaWYgKGhmZGNhbi0+U3RhdGUgPT0gSEFMX0ZEQ0FOX1NUQVRFX1JFQURZKSB7DQotICAgIGlmIChSeEZpZm8gPT0gRkRDQU5fUlhfRklGTzApIHsNCi0gICAgICAvKiBTZWxlY3QgRklGTyAwIE9wZXJhdGlvbiBNb2RlICovDQotICAgICAgTU9ESUZZX1JFRyhoZmRjYW4tPkluc3RhbmNlLT5SWEdGQywgRkRDQU5fUlhHRkNfRjBPTSwNCi0gICAgICAgICAgICAgICAgIChPcGVyYXRpb25Nb2RlIDw8IEZEQ0FOX1JYR0ZDX0YwT01fUG9zKSk7DQotICAgIH0gZWxzZSAvKiBSeEZpZm8gPT0gRkRDQU5fUlhfRklGTzEgKi8NCi0gICAgew0KLSAgICAgIC8qIFNlbGVjdCBGSUZPIDEgT3BlcmF0aW9uIE1vZGUgKi8NCi0gICAgICBNT0RJRllfUkVHKGhmZGNhbi0+SW5zdGFuY2UtPlJYR0ZDLCBGRENBTl9SWEdGQ19GMU9NLA0KLSAgICAgICAgICAgICAgICAgKE9wZXJhdGlvbk1vZGUgPDwgRkRDQU5fUlhHRkNfRjFPTV9Qb3MpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovDQotICAgIHJldHVybiBIQUxfT0s7DQotICB9IGVsc2Ugew0KLSAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLw0KLSAgICBoZmRjYW4tPkVycm9yQ29kZSB8PSBIQUxfRkRDQU5fRVJST1JfTk9UX1JFQURZOw0KLQ0KLSAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgUkFNIHdhdGNoZG9nLg0KLSAqIEBwYXJhbSAgaGZkY2FuIHBvaW50ZXIgdG8gYW4gRkRDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KLSAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRkRDQU4uDQotICogQHBhcmFtICBDb3VudGVyU3RhcnRWYWx1ZSBTdGFydCB2YWx1ZSBvZiB0aGUgTWVzc2FnZSBSQU0gV2F0Y2hkb2cgQ291bnRlciwNCi0gKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiAweDAwIGFuZCAweEZGLA0KLSAqICAgICAgICAgd2l0aCB0aGUgcmVzZXQgdmFsdWUgb2YgMHgwMCB0aGUgY291bnRlciBpcyBkaXNhYmxlZC4NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fQ29uZmlnUmFtV2F0Y2hkb2coRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDb3VudGVyU3RhcnRWYWx1ZSkgew0KLSAgLyogQ2hlY2sgZnVuY3Rpb24gcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZEQ0FOX01BWF9WQUxVRShDb3VudGVyU3RhcnRWYWx1ZSwgMHhGRlUpKTsNCi0NCi0gIGlmIChoZmRjYW4tPlN0YXRlID09IEhBTF9GRENBTl9TVEFURV9SRUFEWSkgew0KLSAgICAvKiBDb25maWd1cmUgdGhlIFJBTSB3YXRjaGRvZyBjb3VudGVyIHN0YXJ0IHZhbHVlICovDQotICAgIE1PRElGWV9SRUcoaGZkY2FuLT5JbnN0YW5jZS0+UldELCBGRENBTl9SV0RfV0RDLCBDb3VudGVyU3RhcnRWYWx1ZSk7DQotDQotICAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8NCi0gICAgcmV0dXJuIEhBTF9PSzsNCi0gIH0gZWxzZSB7DQotICAgIC8qIFVwZGF0ZSBlcnJvciBjb2RlICovDQotICAgIGhmZGNhbi0+RXJyb3JDb2RlIHw9IEhBTF9GRENBTl9FUlJPUl9OT1RfUkVBRFk7DQotDQotICAgIHJldHVybiBIQUxfRVJST1I7DQotICB9DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ29uZmlndXJlIHRoZSB0aW1lc3RhbXAgY291bnRlci4NCi0gKiBAcGFyYW0gIGhmZGNhbiBwb2ludGVyIHRvIGFuIEZEQ0FOX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCi0gKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZEQ0FOLg0KLSAqIEBwYXJhbSAgVGltZXN0YW1wUHJlc2NhbGVyIFRpbWVzdGFtcCBDb3VudGVyIFByZXNjYWxlci4NCi0gKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEBhcmcgRkRDQU5fVGltZXN0YW1wX1ByZXNjYWxlci4NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fQ29uZmlnVGltZXN0YW1wQ291bnRlcigNCi0gICAgRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLCB1aW50MzJfdCBUaW1lc3RhbXBQcmVzY2FsZXIpIHsNCi0gIC8qIENoZWNrIGZ1bmN0aW9uIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19GRENBTl9USU1FU1RBTVBfUFJFU0NBTEVSKFRpbWVzdGFtcFByZXNjYWxlcikpOw0KLQ0KLSAgaWYgKGhmZGNhbi0+U3RhdGUgPT0gSEFMX0ZEQ0FOX1NUQVRFX1JFQURZKSB7DQotICAgIC8qIENvbmZpZ3VyZSBwcmVzY2FsZXIgKi8NCi0gICAgTU9ESUZZX1JFRyhoZmRjYW4tPkluc3RhbmNlLT5UU0NDLCBGRENBTl9UU0NDX1RDUCwgVGltZXN0YW1wUHJlc2NhbGVyKTsNCi0NCi0gICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLw0KLSAgICByZXR1cm4gSEFMX09LOw0KLSAgfSBlbHNlIHsNCi0gICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8NCi0gICAgaGZkY2FuLT5FcnJvckNvZGUgfD0gSEFMX0ZEQ0FOX0VSUk9SX05PVF9SRUFEWTsNCi0NCi0gICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gIH0NCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgdGhlIHRpbWVzdGFtcCBjb3VudGVyLg0KLSAqIEBwYXJhbSAgaGZkY2FuIHBvaW50ZXIgdG8gYW4gRkRDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KLSAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRkRDQU4uDQotICogQHBhcmFtICBUaW1lc3RhbXBPcGVyYXRpb24gVGltZXN0YW1wIGNvdW50ZXIgb3BlcmF0aW9uLg0KLSAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQGFyZyBGRENBTl9UaW1lc3RhbXAuDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX0VuYWJsZVRpbWVzdGFtcENvdW50ZXIoDQotICAgIEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwgdWludDMyX3QgVGltZXN0YW1wT3BlcmF0aW9uKSB7DQotICAvKiBDaGVjayBmdW5jdGlvbiBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfRkRDQU5fVElNRVNUQU1QKFRpbWVzdGFtcE9wZXJhdGlvbikpOw0KLQ0KLSAgaWYgKGhmZGNhbi0+U3RhdGUgPT0gSEFMX0ZEQ0FOX1NUQVRFX1JFQURZKSB7DQotICAgIC8qIEVuYWJsZSB0aW1lc3RhbXAgY291bnRlciAqLw0KLSAgICBNT0RJRllfUkVHKGhmZGNhbi0+SW5zdGFuY2UtPlRTQ0MsIEZEQ0FOX1RTQ0NfVFNTLCBUaW1lc3RhbXBPcGVyYXRpb24pOw0KLQ0KLSAgICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovDQotICAgIHJldHVybiBIQUxfT0s7DQotICB9IGVsc2Ugew0KLSAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLw0KLSAgICBoZmRjYW4tPkVycm9yQ29kZSB8PSBIQUxfRkRDQU5fRVJST1JfTk9UX1JFQURZOw0KLQ0KLSAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgdGhlIHRpbWVzdGFtcCBjb3VudGVyLg0KLSAqIEBwYXJhbSAgaGZkY2FuIHBvaW50ZXIgdG8gYW4gRkRDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KLSAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRkRDQU4uDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX0Rpc2FibGVUaW1lc3RhbXBDb3VudGVyKA0KLSAgICBGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pIHsNCi0gIGlmIChoZmRjYW4tPlN0YXRlID09IEhBTF9GRENBTl9TVEFURV9SRUFEWSkgew0KLSAgICAvKiBEaXNhYmxlIHRpbWVzdGFtcCBjb3VudGVyICovDQotICAgIENMRUFSX0JJVChoZmRjYW4tPkluc3RhbmNlLT5UU0NDLCBGRENBTl9UU0NDX1RTUyk7DQotDQotICAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8NCi0gICAgcmV0dXJuIEhBTF9PSzsNCi0gIH0gZWxzZSB7DQotICAgIC8qIFVwZGF0ZSBlcnJvciBjb2RlICovDQotICAgIGhmZGNhbi0+RXJyb3JDb2RlIHw9IEhBTF9GRENBTl9FUlJPUl9OT1RfUkVBRFk7DQotDQotICAgIHJldHVybiBIQUxfRVJST1I7DQotICB9DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IHRoZSB0aW1lc3RhbXAgY291bnRlciB2YWx1ZS4NCi0gKiBAcGFyYW0gIGhmZGNhbiBwb2ludGVyIHRvIGFuIEZEQ0FOX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCi0gKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZEQ0FOLg0KLSAqIEByZXR2YWwgVGltZXN0YW1wIGNvdW50ZXIgdmFsdWUNCi0gKi8NCi11aW50MTZfdCBIQUxfRkRDQU5fR2V0VGltZXN0YW1wQ291bnRlcihGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pIHsNCi0gIHJldHVybiAodWludDE2X3QpKGhmZGNhbi0+SW5zdGFuY2UtPlRTQ1YpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJlc2V0IHRoZSB0aW1lc3RhbXAgY291bnRlciB0byB6ZXJvLg0KLSAqIEBwYXJhbSAgaGZkY2FuIHBvaW50ZXIgdG8gYW4gRkRDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KLSAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRkRDQU4uDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX1Jlc2V0VGltZXN0YW1wQ291bnRlcihGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pIHsNCi0gIGlmICgoaGZkY2FuLT5JbnN0YW5jZS0+VFNDQyAmIEZEQ0FOX1RTQ0NfVFNTKSAhPSBGRENBTl9USU1FU1RBTVBfRVhURVJOQUwpIHsNCi0gICAgLyogUmVzZXQgdGltZXN0YW1wIGNvdW50ZXIuDQotICAgICAgIEFjdHVhbGx5IGFueSB3cml0ZSBvcGVyYXRpb24gdG8gVFNDViBjbGVhcnMgdGhlIGNvdW50ZXIgKi8NCi0gICAgQ0xFQVJfUkVHKGhmZGNhbi0+SW5zdGFuY2UtPlRTQ1YpOw0KLSAgfSBlbHNlIHsNCi0gICAgLyogVXBkYXRlIGVycm9yIGNvZGUuDQotICAgICAgIFVuYWJsZSB0byByZXNldCBleHRlcm5hbCBjb3VudGVyICovDQotICAgIGhmZGNhbi0+RXJyb3JDb2RlIHw9IEhBTF9GRENBTl9FUlJPUl9OT1RfU1VQUE9SVEVEOw0KLQ0KLSAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgfQ0KLQ0KLSAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLw0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDb25maWd1cmUgdGhlIHRpbWVvdXQgY291bnRlci4NCi0gKiBAcGFyYW0gIGhmZGNhbiBwb2ludGVyIHRvIGFuIEZEQ0FOX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCi0gKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZEQ0FOLg0KLSAqIEBwYXJhbSAgVGltZW91dE9wZXJhdGlvbiBUaW1lb3V0IGNvdW50ZXIgb3BlcmF0aW9uLg0KLSAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQGFyZyBGRENBTl9UaW1lb3V0X09wZXJhdGlvbi4NCi0gKiBAcGFyYW0gIFRpbWVvdXRQZXJpb2QgU3RhcnQgdmFsdWUgb2YgdGhlIHRpbWVvdXQgZG93bi1jb3VudGVyLg0KLSAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIDB4MDAwMCBhbmQgMHhGRkZGDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX0NvbmZpZ1RpbWVvdXRDb3VudGVyKEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZW91dE9wZXJhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZW91dFBlcmlvZCkgew0KLSAgLyogQ2hlY2sgZnVuY3Rpb24gcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZEQ0FOX1RJTUVPVVQoVGltZW91dE9wZXJhdGlvbikpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZEQ0FOX01BWF9WQUxVRShUaW1lb3V0UGVyaW9kLCAweEZGRkZVKSk7DQotDQotICBpZiAoaGZkY2FuLT5TdGF0ZSA9PSBIQUxfRkRDQU5fU1RBVEVfUkVBRFkpIHsNCi0gICAgLyogU2VsZWN0IHRpbWVvdXQgb3BlcmF0aW9uIGFuZCBjb25maWd1cmUgcGVyaW9kICovDQotICAgIE1PRElGWV9SRUcoaGZkY2FuLT5JbnN0YW5jZS0+VE9DQywgKEZEQ0FOX1RPQ0NfVE9TIHwgRkRDQU5fVE9DQ19UT1ApLA0KLSAgICAgICAgICAgICAgIChUaW1lb3V0T3BlcmF0aW9uIHwgKFRpbWVvdXRQZXJpb2QgPDwgRkRDQU5fVE9DQ19UT1BfUG9zKSkpOw0KLQ0KLSAgICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovDQotICAgIHJldHVybiBIQUxfT0s7DQotICB9IGVsc2Ugew0KLSAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLw0KLSAgICBoZmRjYW4tPkVycm9yQ29kZSB8PSBIQUxfRkRDQU5fRVJST1JfTk9UX1JFQURZOw0KLQ0KLSAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSB0aGUgdGltZW91dCBjb3VudGVyLg0KLSAqIEBwYXJhbSAgaGZkY2FuIHBvaW50ZXIgdG8gYW4gRkRDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KLSAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRkRDQU4uDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX0VuYWJsZVRpbWVvdXRDb3VudGVyKEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbikgew0KLSAgaWYgKGhmZGNhbi0+U3RhdGUgPT0gSEFMX0ZEQ0FOX1NUQVRFX1JFQURZKSB7DQotICAgIC8qIEVuYWJsZSB0aW1lb3V0IGNvdW50ZXIgKi8NCi0gICAgU0VUX0JJVChoZmRjYW4tPkluc3RhbmNlLT5UT0NDLCBGRENBTl9UT0NDX0VUT0MpOw0KLQ0KLSAgICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovDQotICAgIHJldHVybiBIQUxfT0s7DQotICB9IGVsc2Ugew0KLSAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLw0KLSAgICBoZmRjYW4tPkVycm9yQ29kZSB8PSBIQUxfRkRDQU5fRVJST1JfTk9UX1JFQURZOw0KLQ0KLSAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgdGhlIHRpbWVvdXQgY291bnRlci4NCi0gKiBAcGFyYW0gIGhmZGNhbiBwb2ludGVyIHRvIGFuIEZEQ0FOX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCi0gKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZEQ0FOLg0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9EaXNhYmxlVGltZW91dENvdW50ZXIoRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuKSB7DQotICBpZiAoaGZkY2FuLT5TdGF0ZSA9PSBIQUxfRkRDQU5fU1RBVEVfUkVBRFkpIHsNCi0gICAgLyogRGlzYWJsZSB0aW1lb3V0IGNvdW50ZXIgKi8NCi0gICAgQ0xFQVJfQklUKGhmZGNhbi0+SW5zdGFuY2UtPlRPQ0MsIEZEQ0FOX1RPQ0NfRVRPQyk7DQotDQotICAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8NCi0gICAgcmV0dXJuIEhBTF9PSzsNCi0gIH0gZWxzZSB7DQotICAgIC8qIFVwZGF0ZSBlcnJvciBjb2RlICovDQotICAgIGhmZGNhbi0+RXJyb3JDb2RlIHw9IEhBTF9GRENBTl9FUlJPUl9OT1RfUkVBRFk7DQotDQotICAgIHJldHVybiBIQUxfRVJST1I7DQotICB9DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IHRoZSB0aW1lb3V0IGNvdW50ZXIgdmFsdWUuDQotICogQHBhcmFtICBoZmRjYW4gcG9pbnRlciB0byBhbiBGRENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQotICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBGRENBTi4NCi0gKiBAcmV0dmFsIFRpbWVvdXQgY291bnRlciB2YWx1ZQ0KLSAqLw0KLXVpbnQxNl90IEhBTF9GRENBTl9HZXRUaW1lb3V0Q291bnRlcihGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pIHsNCi0gIHJldHVybiAodWludDE2X3QpKGhmZGNhbi0+SW5zdGFuY2UtPlRPQ1YpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJlc2V0IHRoZSB0aW1lb3V0IGNvdW50ZXIgdG8gaXRzIHN0YXJ0IHZhbHVlLg0KLSAqIEBwYXJhbSAgaGZkY2FuIHBvaW50ZXIgdG8gYW4gRkRDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KLSAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRkRDQU4uDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX1Jlc2V0VGltZW91dENvdW50ZXIoRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuKSB7DQotICBpZiAoKGhmZGNhbi0+SW5zdGFuY2UtPlRPQ0MgJiBGRENBTl9UT0NDX1RPUykgPT0gRkRDQU5fVElNRU9VVF9DT05USU5VT1VTKSB7DQotICAgIC8qIFJlc2V0IHRpbWVvdXQgY291bnRlciB0byBzdGFydCB2YWx1ZSAqLw0KLSAgICBDTEVBUl9SRUcoaGZkY2FuLT5JbnN0YW5jZS0+VE9DVik7DQotDQotICAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8NCi0gICAgcmV0dXJuIEhBTF9PSzsNCi0gIH0gZWxzZSB7DQotICAgIC8qIFVwZGF0ZSBlcnJvciBjb2RlLg0KLSAgICAgICBVbmFibGUgdG8gcmVzZXQgY291bnRlcjogY29udHJvbGxlZCBvbmx5IGJ5IEZJRk8gZW1wdHkgc3RhdGUgKi8NCi0gICAgaGZkY2FuLT5FcnJvckNvZGUgfD0gSEFMX0ZEQ0FOX0VSUk9SX05PVF9TVVBQT1JURUQ7DQotDQotICAgIHJldHVybiBIQUxfRVJST1I7DQotICB9DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ29uZmlndXJlIHRoZSB0cmFuc21pdHRlciBkZWxheSBjb21wZW5zYXRpb24uDQotICogQHBhcmFtICBoZmRjYW4gcG9pbnRlciB0byBhbiBGRENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQotICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBGRENBTi4NCi0gKiBAcGFyYW0gIFRkY09mZnNldCBUcmFuc21pdHRlciBEZWxheSBDb21wZW5zYXRpb24gT2Zmc2V0Lg0KLSAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIDB4MDAgYW5kIDB4N0YuDQotICogQHBhcmFtICBUZGNGaWx0ZXIgVHJhbnNtaXR0ZXIgRGVsYXkgQ29tcGVuc2F0aW9uIEZpbHRlciBXaW5kb3cgTGVuZ3RoLg0KLSAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIDB4MDAgYW5kIDB4N0YuDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX0NvbmZpZ1R4RGVsYXlDb21wZW5zYXRpb24oDQotICAgIEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwgdWludDMyX3QgVGRjT2Zmc2V0LCB1aW50MzJfdCBUZGNGaWx0ZXIpIHsNCi0gIC8qIENoZWNrIGZ1bmN0aW9uIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19GRENBTl9NQVhfVkFMVUUoVGRjT2Zmc2V0LCAweDdGVSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZEQ0FOX01BWF9WQUxVRShUZGNGaWx0ZXIsIDB4N0ZVKSk7DQotDQotICBpZiAoaGZkY2FuLT5TdGF0ZSA9PSBIQUxfRkRDQU5fU1RBVEVfUkVBRFkpIHsNCi0gICAgLyogQ29uZmlndXJlIFREQyBvZmZzZXQgYW5kIGZpbHRlciB3aW5kb3cgKi8NCi0gICAgaGZkY2FuLT5JbnN0YW5jZS0+VERDUiA9ICgoVGRjRmlsdGVyIDw8IEZEQ0FOX1REQ1JfVERDRl9Qb3MpIHwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVGRjT2Zmc2V0IDw8IEZEQ0FOX1REQ1JfVERDT19Qb3MpKTsNCi0NCi0gICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLw0KLSAgICByZXR1cm4gSEFMX09LOw0KLSAgfSBlbHNlIHsNCi0gICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8NCi0gICAgaGZkY2FuLT5FcnJvckNvZGUgfD0gSEFMX0ZEQ0FOX0VSUk9SX05PVF9SRUFEWTsNCi0NCi0gICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gIH0NCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgdGhlIHRyYW5zbWl0dGVyIGRlbGF5IGNvbXBlbnNhdGlvbi4NCi0gKiBAcGFyYW0gIGhmZGNhbiBwb2ludGVyIHRvIGFuIEZEQ0FOX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCi0gKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZEQ0FOLg0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9FbmFibGVUeERlbGF5Q29tcGVuc2F0aW9uKA0KLSAgICBGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pIHsNCi0gIGlmIChoZmRjYW4tPlN0YXRlID09IEhBTF9GRENBTl9TVEFURV9SRUFEWSkgew0KLSAgICAvKiBFbmFibGUgdHJhbnNtaXR0ZXIgZGVsYXkgY29tcGVuc2F0aW9uICovDQotICAgIFNFVF9CSVQoaGZkY2FuLT5JbnN0YW5jZS0+REJUUCwgRkRDQU5fREJUUF9UREMpOw0KLQ0KLSAgICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovDQotICAgIHJldHVybiBIQUxfT0s7DQotICB9IGVsc2Ugew0KLSAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLw0KLSAgICBoZmRjYW4tPkVycm9yQ29kZSB8PSBIQUxfRkRDQU5fRVJST1JfTk9UX1JFQURZOw0KLQ0KLSAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgdGhlIHRyYW5zbWl0dGVyIGRlbGF5IGNvbXBlbnNhdGlvbi4NCi0gKiBAcGFyYW0gIGhmZGNhbiBwb2ludGVyIHRvIGFuIEZEQ0FOX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCi0gKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZEQ0FOLg0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9EaXNhYmxlVHhEZWxheUNvbXBlbnNhdGlvbigNCi0gICAgRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuKSB7DQotICBpZiAoaGZkY2FuLT5TdGF0ZSA9PSBIQUxfRkRDQU5fU1RBVEVfUkVBRFkpIHsNCi0gICAgLyogRGlzYWJsZSB0cmFuc21pdHRlciBkZWxheSBjb21wZW5zYXRpb24gKi8NCi0gICAgQ0xFQVJfQklUKGhmZGNhbi0+SW5zdGFuY2UtPkRCVFAsIEZEQ0FOX0RCVFBfVERDKTsNCi0NCi0gICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLw0KLSAgICByZXR1cm4gSEFMX09LOw0KLSAgfSBlbHNlIHsNCi0gICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8NCi0gICAgaGZkY2FuLT5FcnJvckNvZGUgfD0gSEFMX0ZEQ0FOX0VSUk9SX05PVF9SRUFEWTsNCi0NCi0gICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gIH0NCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgSVNPIDExODk4LTEgcHJvdG9jb2wgbW9kZS4NCi0gKiAgICAgICAgIENBTiBGRCBmcmFtZSBmb3JtYXQgaXMgYWNjb3JkaW5nIHRvIElTTyAxMTg5OC0xIHN0YW5kYXJkLg0KLSAqIEBwYXJhbSAgaGZkY2FuIHBvaW50ZXIgdG8gYW4gRkRDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KLSAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRkRDQU4uDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX0VuYWJsZUlTT01vZGUoRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuKSB7DQotICBpZiAoaGZkY2FuLT5TdGF0ZSA9PSBIQUxfRkRDQU5fU1RBVEVfUkVBRFkpIHsNCi0gICAgLyogRGlzYWJsZSBOb24gSVNPIHByb3RvY29sIG1vZGUgKi8NCi0gICAgQ0xFQVJfQklUKGhmZGNhbi0+SW5zdGFuY2UtPkNDQ1IsIEZEQ0FOX0NDQ1JfTklTTyk7DQotDQotICAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8NCi0gICAgcmV0dXJuIEhBTF9PSzsNCi0gIH0gZWxzZSB7DQotICAgIC8qIFVwZGF0ZSBlcnJvciBjb2RlICovDQotICAgIGhmZGNhbi0+RXJyb3JDb2RlIHw9IEhBTF9GRENBTl9FUlJPUl9OT1RfUkVBRFk7DQotDQotICAgIHJldHVybiBIQUxfRVJST1I7DQotICB9DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBJU08gMTE4OTgtMSBwcm90b2NvbCBtb2RlLg0KLSAqICAgICAgICAgQ0FOIEZEIGZyYW1lIGZvcm1hdCBpcyBhY2NvcmRpbmcgdG8gQm9zY2ggQ0FOIEZEIHNwZWNpZmljYXRpb24gVjEuMC4NCi0gKiBAcGFyYW0gIGhmZGNhbiBwb2ludGVyIHRvIGFuIEZEQ0FOX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCi0gKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZEQ0FOLg0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9EaXNhYmxlSVNPTW9kZShGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pIHsNCi0gIGlmIChoZmRjYW4tPlN0YXRlID09IEhBTF9GRENBTl9TVEFURV9SRUFEWSkgew0KLSAgICAvKiBFbmFibGUgTm9uIElTTyBwcm90b2NvbCBtb2RlICovDQotICAgIFNFVF9CSVQoaGZkY2FuLT5JbnN0YW5jZS0+Q0NDUiwgRkRDQU5fQ0NDUl9OSVNPKTsNCi0NCi0gICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLw0KLSAgICByZXR1cm4gSEFMX09LOw0KLSAgfSBlbHNlIHsNCi0gICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8NCi0gICAgaGZkY2FuLT5FcnJvckNvZGUgfD0gSEFMX0ZEQ0FOX0VSUk9SX05PVF9SRUFEWTsNCi0NCi0gICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gIH0NCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgZWRnZSBmaWx0ZXJpbmcgZHVyaW5nIGJ1cyBpbnRlZ3JhdGlvbi4NCi0gKiAgICAgICAgIFR3byBjb25zZWN1dGl2ZSBkb21pbmFudCB0cSBhcmUgcmVxdWlyZWQgdG8gZGV0ZWN0IGFuIGVkZ2UgZm9yIGhhcmQNCi0gKiBzeW5jaHJvbml6YXRpb24uDQotICogQHBhcmFtICBoZmRjYW4gcG9pbnRlciB0byBhbiBGRENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQotICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBGRENBTi4NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fRW5hYmxlRWRnZUZpbHRlcmluZyhGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pIHsNCi0gIGlmIChoZmRjYW4tPlN0YXRlID09IEhBTF9GRENBTl9TVEFURV9SRUFEWSkgew0KLSAgICAvKiBFbmFibGUgZWRnZSBmaWx0ZXJpbmcgKi8NCi0gICAgU0VUX0JJVChoZmRjYW4tPkluc3RhbmNlLT5DQ0NSLCBGRENBTl9DQ0NSX0VGQkkpOw0KLQ0KLSAgICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovDQotICAgIHJldHVybiBIQUxfT0s7DQotICB9IGVsc2Ugew0KLSAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLw0KLSAgICBoZmRjYW4tPkVycm9yQ29kZSB8PSBIQUxfRkRDQU5fRVJST1JfTk9UX1JFQURZOw0KLQ0KLSAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgZWRnZSBmaWx0ZXJpbmcgZHVyaW5nIGJ1cyBpbnRlZ3JhdGlvbi4NCi0gKiAgICAgICAgIE9uZSBkb21pbmFudCB0cSBpcyByZXF1aXJlZCB0byBkZXRlY3QgYW4gZWRnZSBmb3IgaGFyZA0KLSAqIHN5bmNocm9uaXphdGlvbi4NCi0gKiBAcGFyYW0gIGhmZGNhbiBwb2ludGVyIHRvIGFuIEZEQ0FOX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCi0gKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZEQ0FOLg0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9EaXNhYmxlRWRnZUZpbHRlcmluZyhGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pIHsNCi0gIGlmIChoZmRjYW4tPlN0YXRlID09IEhBTF9GRENBTl9TVEFURV9SRUFEWSkgew0KLSAgICAvKiBEaXNhYmxlIGVkZ2UgZmlsdGVyaW5nICovDQotICAgIENMRUFSX0JJVChoZmRjYW4tPkluc3RhbmNlLT5DQ0NSLCBGRENBTl9DQ0NSX0VGQkkpOw0KLQ0KLSAgICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovDQotICAgIHJldHVybiBIQUxfT0s7DQotICB9IGVsc2Ugew0KLSAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLw0KLSAgICBoZmRjYW4tPkVycm9yQ29kZSB8PSBIQUxfRkRDQU5fRVJST1JfTk9UX1JFQURZOw0KLQ0KLSAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRkRDQU5fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBDb250cm9sIGZ1bmN0aW9ucw0KLSAgKiAgQGJyaWVmICAgIENvbnRyb2wgZnVuY3Rpb25zDQotICAqDQotQHZlcmJhdGltDQotICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIENvbnRyb2wgZnVuY3Rpb25zICMjIyMjDQotICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoNCi0gICAgICAoKykgSEFMX0ZEQ0FOX1N0YXJ0ICAgICAgICAgICAgICAgICAgICAgICAgIDogU3RhcnQgdGhlIEZEQ0FOIG1vZHVsZQ0KLSAgICAgICgrKSBIQUxfRkRDQU5fU3RvcCAgICAgICAgICAgICAgICAgICAgICAgICAgOiBTdG9wIHRoZSBGRENBTiBtb2R1bGUgYW5kDQotZW5hYmxlIGFjY2VzcyB0byBjb25maWd1cmF0aW9uIHJlZ2lzdGVycw0KLSAgICAgICgrKSBIQUxfRkRDQU5fQWRkTWVzc2FnZVRvVHhGaWZvUSAgICAgICAgICAgOiBBZGQgYSBtZXNzYWdlIHRvIHRoZSBUeA0KLUZJRk8vUXVldWUgYW5kIGFjdGl2YXRlIHRoZSBjb3JyZXNwb25kaW5nIHRyYW5zbWlzc2lvbiByZXF1ZXN0DQotICAgICAgKCspIEhBTF9GRENBTl9HZXRMYXRlc3RUeEZpZm9RUmVxdWVzdEJ1ZmZlciA6IEdldCBUeCBidWZmZXIgaW5kZXggb2YNCi1sYXRlc3QgVHggRklGTy9RdWV1ZSByZXF1ZXN0DQotICAgICAgKCspIEhBTF9GRENBTl9BYm9ydFR4UmVxdWVzdCAgICAgICAgICAgICAgICA6IEFib3J0IHRyYW5zbWlzc2lvbiByZXF1ZXN0DQotICAgICAgKCspIEhBTF9GRENBTl9HZXRSeE1lc3NhZ2UgICAgICAgICAgICAgICAgICA6IEdldCBhbiBGRENBTiBmcmFtZSBmcm9tIHRoZQ0KLVJ4IEZJRk8gem9uZSBpbnRvIHRoZSBtZXNzYWdlIFJBTQ0KLSAgICAgICgrKSBIQUxfRkRDQU5fR2V0VHhFdmVudCAgICAgICAgICAgICAgICAgICAgOiBHZXQgYW4gRkRDQU4gVHggZXZlbnQgZnJvbQ0KLXRoZSBUeCBFdmVudCBGSUZPIHpvbmUgaW50byB0aGUgbWVzc2FnZSBSQU0NCi0gICAgICAoKykgSEFMX0ZEQ0FOX0dldEhpZ2hQcmlvcml0eU1lc3NhZ2VTdGF0dXMgIDogR2V0IGhpZ2ggcHJpb3JpdHkgbWVzc2FnZQ0KLXN0YXR1cw0KLSAgICAgICgrKSBIQUxfRkRDQU5fR2V0UHJvdG9jb2xTdGF0dXMgICAgICAgICAgICAgOiBHZXQgcHJvdG9jb2wgc3RhdHVzDQotICAgICAgKCspIEhBTF9GRENBTl9HZXRFcnJvckNvdW50ZXJzICAgICAgICAgICAgICA6IEdldCBlcnJvciBjb3VudGVyIHZhbHVlcw0KLSAgICAgICgrKSBIQUxfRkRDQU5fSXNUeEJ1ZmZlck1lc3NhZ2VQZW5kaW5nICAgICAgOiBDaGVjayBpZiBhIHRyYW5zbWlzc2lvbg0KLXJlcXVlc3QgaXMgcGVuZGluZyBvbiB0aGUgc2VsZWN0ZWQgVHggYnVmZmVyDQotICAgICAgKCspIEhBTF9GRENBTl9HZXRSeEZpZm9GaWxsTGV2ZWwgICAgICAgICAgICA6IFJldHVybiBSeCBGSUZPIGZpbGwgbGV2ZWwNCi0gICAgICAoKykgSEFMX0ZEQ0FOX0dldFR4Rmlmb0ZyZWVMZXZlbCAgICAgICAgICAgIDogUmV0dXJuIFR4IEZJRk8gZnJlZSBsZXZlbA0KLSAgICAgICgrKSBIQUxfRkRDQU5fSXNSZXN0cmljdGVkT3BlcmF0aW9uTW9kZSAgICAgOiBDaGVjayBpZiB0aGUgRkRDQU4NCi1wZXJpcGhlcmFsIGVudGVyZWQgUmVzdHJpY3RlZCBPcGVyYXRpb24gTW9kZQ0KLSAgICAgICgrKSBIQUxfRkRDQU5fRXhpdFJlc3RyaWN0ZWRPcGVyYXRpb25Nb2RlICAgOiBFeGl0IFJlc3RyaWN0ZWQgT3BlcmF0aW9uDQotTW9kZQ0KLQ0KLUBlbmR2ZXJiYXRpbQ0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFN0YXJ0IHRoZSBGRENBTiBtb2R1bGUuDQotICogQHBhcmFtICBoZmRjYW4gcG9pbnRlciB0byBhbiBGRENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQotICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBGRENBTi4NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fU3RhcnQoRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuKSB7DQotICBpZiAoaGZkY2FuLT5TdGF0ZSA9PSBIQUxfRkRDQU5fU1RBVEVfUkVBRFkpIHsNCi0gICAgLyogQ2hhbmdlIEZEQ0FOIHBlcmlwaGVyYWwgc3RhdGUgKi8NCi0gICAgaGZkY2FuLT5TdGF0ZSA9IEhBTF9GRENBTl9TVEFURV9CVVNZOw0KLQ0KLSAgICAvKiBSZXF1ZXN0IGxlYXZlIGluaXRpYWxpc2F0aW9uICovDQotICAgIENMRUFSX0JJVChoZmRjYW4tPkluc3RhbmNlLT5DQ0NSLCBGRENBTl9DQ0NSX0lOSVQpOw0KLQ0KLSAgICAvKiBSZXNldCB0aGUgRkRDQU4gRXJyb3JDb2RlICovDQotICAgIGhmZGNhbi0+RXJyb3JDb2RlID0gSEFMX0ZEQ0FOX0VSUk9SX05PTkU7DQotDQotICAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8NCi0gICAgcmV0dXJuIEhBTF9PSzsNCi0gIH0gZWxzZSB7DQotICAgIC8qIFVwZGF0ZSBlcnJvciBjb2RlICovDQotICAgIGhmZGNhbi0+RXJyb3JDb2RlIHw9IEhBTF9GRENBTl9FUlJPUl9OT1RfUkVBRFk7DQotDQotICAgIHJldHVybiBIQUxfRVJST1I7DQotICB9DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU3RvcCB0aGUgRkRDQU4gbW9kdWxlIGFuZCBlbmFibGUgYWNjZXNzIHRvIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzLg0KLSAqIEBwYXJhbSAgaGZkY2FuIHBvaW50ZXIgdG8gYW4gRkRDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KLSAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRkRDQU4uDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX1N0b3AoRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuKSB7DQotICB1aW50MzJfdCBDb3VudGVyID0gMFU7DQotDQotICBpZiAoaGZkY2FuLT5TdGF0ZSA9PSBIQUxfRkRDQU5fU1RBVEVfQlVTWSkgew0KLSAgICAvKiBSZXF1ZXN0IGluaXRpYWxpc2F0aW9uICovDQotICAgIFNFVF9CSVQoaGZkY2FuLT5JbnN0YW5jZS0+Q0NDUiwgRkRDQU5fQ0NDUl9JTklUKTsNCi0NCi0gICAgLyogV2FpdCB1bnRpbCB0aGUgSU5JVCBiaXQgaW50byBDQ0NSIHJlZ2lzdGVyIGlzIHNldCAqLw0KLSAgICB3aGlsZSAoKGhmZGNhbi0+SW5zdGFuY2UtPkNDQ1IgJiBGRENBTl9DQ0NSX0lOSVQpID09IDBVKSB7DQotICAgICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovDQotICAgICAgaWYgKENvdW50ZXIgPiBGRENBTl9USU1FT1VUX1ZBTFVFKSB7DQotICAgICAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLw0KLSAgICAgICAgaGZkY2FuLT5FcnJvckNvZGUgfD0gSEFMX0ZEQ0FOX0VSUk9SX1RJTUVPVVQ7DQotDQotICAgICAgICAvKiBDaGFuZ2UgRkRDQU4gc3RhdGUgKi8NCi0gICAgICAgIGhmZGNhbi0+U3RhdGUgPSBIQUxfRkRDQU5fU1RBVEVfRVJST1I7DQotDQotICAgICAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgICAgIH0NCi0NCi0gICAgICAvKiBJbmNyZW1lbnQgY291bnRlciAqLw0KLSAgICAgIENvdW50ZXIrKzsNCi0gICAgfQ0KLQ0KLSAgICAvKiBSZXNldCBjb3VudGVyICovDQotICAgIENvdW50ZXIgPSAwVTsNCi0NCi0gICAgLyogRXhpdCBmcm9tIFNsZWVwIG1vZGUgKi8NCi0gICAgQ0xFQVJfQklUKGhmZGNhbi0+SW5zdGFuY2UtPkNDQ1IsIEZEQ0FOX0NDQ1JfQ1NSKTsNCi0NCi0gICAgLyogV2FpdCB1bnRpbCBGRENBTiBleGl0cyBzbGVlcCBtb2RlICovDQotICAgIHdoaWxlICgoaGZkY2FuLT5JbnN0YW5jZS0+Q0NDUiAmIEZEQ0FOX0NDQ1JfQ1NBKSA9PSBGRENBTl9DQ0NSX0NTQSkgew0KLSAgICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLw0KLSAgICAgIGlmIChDb3VudGVyID4gRkRDQU5fVElNRU9VVF9WQUxVRSkgew0KLSAgICAgICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8NCi0gICAgICAgIGhmZGNhbi0+RXJyb3JDb2RlIHw9IEhBTF9GRENBTl9FUlJPUl9USU1FT1VUOw0KLQ0KLSAgICAgICAgLyogQ2hhbmdlIEZEQ0FOIHN0YXRlICovDQotICAgICAgICBoZmRjYW4tPlN0YXRlID0gSEFMX0ZEQ0FOX1NUQVRFX0VSUk9SOw0KLQ0KLSAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gICAgICB9DQotDQotICAgICAgLyogSW5jcmVtZW50IGNvdW50ZXIgKi8NCi0gICAgICBDb3VudGVyKys7DQotICAgIH0NCi0NCi0gICAgLyogRW5hYmxlIGNvbmZpZ3VyYXRpb24gY2hhbmdlICovDQotICAgIFNFVF9CSVQoaGZkY2FuLT5JbnN0YW5jZS0+Q0NDUiwgRkRDQU5fQ0NDUl9DQ0UpOw0KLQ0KLSAgICAvKiBSZXNldCBMYXRlc3QgVHggRklGTy9RdWV1ZSBSZXF1ZXN0IEJ1ZmZlciBJbmRleCAqLw0KLSAgICBoZmRjYW4tPkxhdGVzdFR4Rmlmb1FSZXF1ZXN0ID0gMFU7DQotDQotICAgIC8qIENoYW5nZSBGRENBTiBwZXJpcGhlcmFsIHN0YXRlICovDQotICAgIGhmZGNhbi0+U3RhdGUgPSBIQUxfRkRDQU5fU1RBVEVfUkVBRFk7DQotDQotICAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8NCi0gICAgcmV0dXJuIEhBTF9PSzsNCi0gIH0gZWxzZSB7DQotICAgIC8qIFVwZGF0ZSBlcnJvciBjb2RlICovDQotICAgIGhmZGNhbi0+RXJyb3JDb2RlIHw9IEhBTF9GRENBTl9FUlJPUl9OT1RfU1RBUlRFRDsNCi0NCi0gICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gIH0NCi19DQotDQotLyoqDQotICogQGJyaWVmICBBZGQgYSBtZXNzYWdlIHRvIHRoZSBUeCBGSUZPL1F1ZXVlIGFuZCBhY3RpdmF0ZSB0aGUgY29ycmVzcG9uZGluZw0KLSAqIHRyYW5zbWlzc2lvbiByZXF1ZXN0DQotICogQHBhcmFtICBoZmRjYW4gcG9pbnRlciB0byBhbiBGRENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQotICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBGRENBTi4NCi0gKiBAcGFyYW0gIHBUeEhlYWRlciBwb2ludGVyIHRvIGEgRkRDQU5fVHhIZWFkZXJUeXBlRGVmIHN0cnVjdHVyZS4NCi0gKiBAcGFyYW0gIHBUeERhdGEgcG9pbnRlciB0byBhIGJ1ZmZlciBjb250YWluaW5nIHRoZSBwYXlsb2FkIG9mIHRoZSBUeCBmcmFtZS4NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fQWRkTWVzc2FnZVRvVHhGaWZvUSgNCi0gICAgRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLCBGRENBTl9UeEhlYWRlclR5cGVEZWYgKnBUeEhlYWRlciwNCi0gICAgdWludDhfdCAqcFR4RGF0YSkgew0KLSAgdWludDMyX3QgUHV0SW5kZXg7DQotDQotICAvKiBDaGVjayBmdW5jdGlvbiBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfRkRDQU5fSURfVFlQRShwVHhIZWFkZXItPklkVHlwZSkpOw0KLSAgaWYgKHBUeEhlYWRlci0+SWRUeXBlID09IEZEQ0FOX1NUQU5EQVJEX0lEKSB7DQotICAgIGFzc2VydF9wYXJhbShJU19GRENBTl9NQVhfVkFMVUUocFR4SGVhZGVyLT5JZGVudGlmaWVyLCAweDdGRlUpKTsNCi0gIH0gZWxzZSAvKiBwVHhIZWFkZXItPklkVHlwZSA9PSBGRENBTl9FWFRFTkRFRF9JRCAqLw0KLSAgew0KLSAgICBhc3NlcnRfcGFyYW0oSVNfRkRDQU5fTUFYX1ZBTFVFKHBUeEhlYWRlci0+SWRlbnRpZmllciwgMHgxRkZGRkZGRlUpKTsNCi0gIH0NCi0gIGFzc2VydF9wYXJhbShJU19GRENBTl9GUkFNRV9UWVBFKHBUeEhlYWRlci0+VHhGcmFtZVR5cGUpKTsNCi0gIGFzc2VydF9wYXJhbShJU19GRENBTl9ETEMocFR4SGVhZGVyLT5EYXRhTGVuZ3RoKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfRkRDQU5fRVNJKHBUeEhlYWRlci0+RXJyb3JTdGF0ZUluZGljYXRvcikpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZEQ0FOX0JSUyhwVHhIZWFkZXItPkJpdFJhdGVTd2l0Y2gpKTsNCi0gIGFzc2VydF9wYXJhbShJU19GRENBTl9GREYocFR4SGVhZGVyLT5GREZvcm1hdCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZEQ0FOX0VGQyhwVHhIZWFkZXItPlR4RXZlbnRGaWZvQ29udHJvbCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZEQ0FOX01BWF9WQUxVRShwVHhIZWFkZXItPk1lc3NhZ2VNYXJrZXIsIDB4RkZVKSk7DQotDQotICBpZiAoaGZkY2FuLT5TdGF0ZSA9PSBIQUxfRkRDQU5fU1RBVEVfQlVTWSkgew0KLSAgICAvKiBDaGVjayB0aGF0IHRoZSBUeCBGSUZPL1F1ZXVlIGlzIG5vdCBmdWxsICovDQotICAgIGlmICgoaGZkY2FuLT5JbnN0YW5jZS0+VFhGUVMgJiBGRENBTl9UWEZRU19URlFGKSAhPSAwVSkgew0KLSAgICAgIC8qIFVwZGF0ZSBlcnJvciBjb2RlICovDQotICAgICAgaGZkY2FuLT5FcnJvckNvZGUgfD0gSEFMX0ZEQ0FOX0VSUk9SX0ZJRk9fRlVMTDsNCi0NCi0gICAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgIC8qIFJldHJpZXZlIHRoZSBUeCBGSUZPIFB1dEluZGV4ICovDQotICAgICAgUHV0SW5kZXggPSAoKGhmZGNhbi0+SW5zdGFuY2UtPlRYRlFTICYgRkRDQU5fVFhGUVNfVEZRUEkpID4+DQotICAgICAgICAgICAgICAgICAgRkRDQU5fVFhGUVNfVEZRUElfUG9zKTsNCi0NCi0gICAgICAvKiBBZGQgdGhlIG1lc3NhZ2UgdG8gdGhlIFR4IEZJRk8vUXVldWUgKi8NCi0gICAgICBGRENBTl9Db3B5TWVzc2FnZVRvUkFNKGhmZGNhbiwgcFR4SGVhZGVyLCBwVHhEYXRhLCBQdXRJbmRleCk7DQotDQotICAgICAgLyogQWN0aXZhdGUgdGhlIGNvcnJlc3BvbmRpbmcgdHJhbnNtaXNzaW9uIHJlcXVlc3QgKi8NCi0gICAgICBoZmRjYW4tPkluc3RhbmNlLT5UWEJBUiA9ICgodWludDMyX3QpMSA8PCBQdXRJbmRleCk7DQotDQotICAgICAgLyogU3RvcmUgdGhlIExhdGVzdCBUeCBGSUZPL1F1ZXVlIFJlcXVlc3QgQnVmZmVyIEluZGV4ICovDQotICAgICAgaGZkY2FuLT5MYXRlc3RUeEZpZm9RUmVxdWVzdCA9ICgodWludDMyX3QpMSA8PCBQdXRJbmRleCk7DQotICAgIH0NCi0NCi0gICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLw0KLSAgICByZXR1cm4gSEFMX09LOw0KLSAgfSBlbHNlIHsNCi0gICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8NCi0gICAgaGZkY2FuLT5FcnJvckNvZGUgfD0gSEFMX0ZEQ0FOX0VSUk9SX05PVF9TVEFSVEVEOw0KLQ0KLSAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBUeCBidWZmZXIgaW5kZXggb2YgbGF0ZXN0IFR4IEZJRk8vUXVldWUgcmVxdWVzdA0KLSAqIEBwYXJhbSAgaGZkY2FuIHBvaW50ZXIgdG8gYW4gRkRDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KLSAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRkRDQU4uDQotICogQHJldHZhbCBUeCBidWZmZXIgaW5kZXggb2YgbGFzdCBUeCBGSUZPL1F1ZXVlIHJlcXVlc3QNCi0gKiAgICAgICAgICAtIEFueSB2YWx1ZSBvZiBAYXJnIEZEQ0FOX1R4X2xvY2F0aW9uIGlmIFR4IHJlcXVlc3QgaGFzIGJlZW4NCi0gKiBzdWJtaXR0ZWQuDQotICogICAgICAgICAgLSAwIGlmIG5vIFR4IEZJRk8vUXVldWUgcmVxdWVzdCBoYXZlIGJlZW4gc3VibWl0dGVkLg0KLSAqLw0KLXVpbnQzMl90IEhBTF9GRENBTl9HZXRMYXRlc3RUeEZpZm9RUmVxdWVzdEJ1ZmZlcihGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pIHsNCi0gIC8qIFJldHVybiBMYXN0IFR4IEZJRk8vUXVldWUgUmVxdWVzdCBCdWZmZXIgKi8NCi0gIHJldHVybiBoZmRjYW4tPkxhdGVzdFR4Rmlmb1FSZXF1ZXN0Ow0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEFib3J0IHRyYW5zbWlzc2lvbiByZXF1ZXN0DQotICogQHBhcmFtICBoZmRjYW4gcG9pbnRlciB0byBhbiBGRENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQotICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBGRENBTi4NCi0gKiBAcGFyYW0gIEJ1ZmZlckluZGV4IGJ1ZmZlciBpbmRleC4NCi0gKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgQGFyZyBGRENBTl9UeF9sb2NhdGlvbi4NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fQWJvcnRUeFJlcXVlc3QoRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBCdWZmZXJJbmRleCkgew0KLSAgLyogQ2hlY2sgZnVuY3Rpb24gcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZEQ0FOX1RYX0xPQ0FUSU9OX0xJU1QoQnVmZmVySW5kZXgpKTsNCi0NCi0gIGlmIChoZmRjYW4tPlN0YXRlID09IEhBTF9GRENBTl9TVEFURV9CVVNZKSB7DQotICAgIC8qIEFkZCBjYW5jZWxsYXRpb24gcmVxdWVzdCAqLw0KLSAgICBoZmRjYW4tPkluc3RhbmNlLT5UWEJDUiA9IEJ1ZmZlckluZGV4Ow0KLQ0KLSAgICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovDQotICAgIHJldHVybiBIQUxfT0s7DQotICB9IGVsc2Ugew0KLSAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLw0KLSAgICBoZmRjYW4tPkVycm9yQ29kZSB8PSBIQUxfRkRDQU5fRVJST1JfTk9UX1NUQVJURUQ7DQotDQotICAgIHJldHVybiBIQUxfRVJST1I7DQotICB9DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IGFuIEZEQ0FOIGZyYW1lIGZyb20gdGhlIFJ4IEZJRk8gem9uZSBpbnRvIHRoZSBtZXNzYWdlIFJBTS4NCi0gKiBAcGFyYW0gIGhmZGNhbiBwb2ludGVyIHRvIGFuIEZEQ0FOX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCi0gKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZEQ0FOLg0KLSAqIEBwYXJhbSAgUnhMb2NhdGlvbiBMb2NhdGlvbiBvZiB0aGUgcmVjZWl2ZWQgbWVzc2FnZSB0byBiZSByZWFkLg0KLSAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQGFyZyBGRENBTl9SeF9sb2NhdGlvbi4NCi0gKiBAcGFyYW0gIHBSeEhlYWRlciBwb2ludGVyIHRvIGEgRkRDQU5fUnhIZWFkZXJUeXBlRGVmIHN0cnVjdHVyZS4NCi0gKiBAcGFyYW0gIHBSeERhdGEgcG9pbnRlciB0byBhIGJ1ZmZlciB3aGVyZSB0aGUgcGF5bG9hZCBvZiB0aGUgUnggZnJhbWUgd2lsbCBiZQ0KLSAqIHN0b3JlZC4NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fR2V0UnhNZXNzYWdlKEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFJ4TG9jYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRENBTl9SeEhlYWRlclR5cGVEZWYgKnBSeEhlYWRlciwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBSeERhdGEpIHsNCi0gIHVpbnQzMl90ICpSeEFkZHJlc3M7DQotICB1aW50OF90ICpwRGF0YTsNCi0gIHVpbnQzMl90IEJ5dGVDb3VudGVyOw0KLSAgdWludDMyX3QgR2V0SW5kZXg7DQotICBIQUxfRkRDQU5fU3RhdGVUeXBlRGVmIHN0YXRlID0gaGZkY2FuLT5TdGF0ZTsNCi0NCi0gIC8qIENoZWNrIGZ1bmN0aW9uIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19GRENBTl9SWF9GSUZPKFJ4TG9jYXRpb24pKTsNCi0NCi0gIGlmIChzdGF0ZSA9PSBIQUxfRkRDQU5fU1RBVEVfQlVTWSkgew0KLSAgICBpZiAoUnhMb2NhdGlvbiA9PQ0KLSAgICAgICAgRkRDQU5fUlhfRklGTzApIC8qIFJ4IGVsZW1lbnQgaXMgYXNzaWduZWQgdG8gdGhlIFJ4IEZJRk8gMCAqLw0KLSAgICB7DQotICAgICAgLyogQ2hlY2sgdGhhdCB0aGUgUnggRklGTyAwIGlzIG5vdCBlbXB0eSAqLw0KLSAgICAgIGlmICgoaGZkY2FuLT5JbnN0YW5jZS0+UlhGMFMgJiBGRENBTl9SWEYwU19GMEZMKSA9PSAwVSkgew0KLSAgICAgICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8NCi0gICAgICAgIGhmZGNhbi0+RXJyb3JDb2RlIHw9IEhBTF9GRENBTl9FUlJPUl9GSUZPX0VNUFRZOw0KLQ0KLSAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgLyogQ2FsY3VsYXRlIFJ4IEZJRk8gMCBlbGVtZW50IGFkZHJlc3MgKi8NCi0gICAgICAgIEdldEluZGV4ID0gKChoZmRjYW4tPkluc3RhbmNlLT5SWEYwUyAmIEZEQ0FOX1JYRjBTX0YwR0kpID4+DQotICAgICAgICAgICAgICAgICAgICBGRENBTl9SWEYwU19GMEdJX1Bvcyk7DQotICAgICAgICBSeEFkZHJlc3MgPSAodWludDMyX3QgKikoaGZkY2FuLT5tc2dSYW0uUnhGSUZPMFNBICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoR2V0SW5kZXggKiBTUkFNQ0FOX1JGMF9TSVpFKSk7DQotICAgICAgfQ0KLSAgICB9IGVsc2UgLyogUnggZWxlbWVudCBpcyBhc3NpZ25lZCB0byB0aGUgUnggRklGTyAxICovDQotICAgIHsNCi0gICAgICAvKiBDaGVjayB0aGF0IHRoZSBSeCBGSUZPIDEgaXMgbm90IGVtcHR5ICovDQotICAgICAgaWYgKChoZmRjYW4tPkluc3RhbmNlLT5SWEYxUyAmIEZEQ0FOX1JYRjFTX0YxRkwpID09IDBVKSB7DQotICAgICAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLw0KLSAgICAgICAgaGZkY2FuLT5FcnJvckNvZGUgfD0gSEFMX0ZEQ0FOX0VSUk9SX0ZJRk9fRU1QVFk7DQotDQotICAgICAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICAvKiBDYWxjdWxhdGUgUnggRklGTyAxIGVsZW1lbnQgYWRkcmVzcyAqLw0KLSAgICAgICAgR2V0SW5kZXggPSAoKGhmZGNhbi0+SW5zdGFuY2UtPlJYRjFTICYgRkRDQU5fUlhGMVNfRjFHSSkgPj4NCi0gICAgICAgICAgICAgICAgICAgIEZEQ0FOX1JYRjFTX0YxR0lfUG9zKTsNCi0gICAgICAgIFJ4QWRkcmVzcyA9ICh1aW50MzJfdCAqKShoZmRjYW4tPm1zZ1JhbS5SeEZJRk8xU0EgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChHZXRJbmRleCAqIFNSQU1DQU5fUkYxX1NJWkUpKTsNCi0gICAgICB9DQotICAgIH0NCi0NCi0gICAgLyogUmV0cmlldmUgSWRUeXBlICovDQotICAgIHBSeEhlYWRlci0+SWRUeXBlID0gKlJ4QWRkcmVzcyAmIEZEQ0FOX0VMRU1FTlRfTUFTS19YVEQ7DQotDQotICAgIC8qIFJldHJpZXZlIElkZW50aWZpZXIgKi8NCi0gICAgaWYgKHBSeEhlYWRlci0+SWRUeXBlID09IEZEQ0FOX1NUQU5EQVJEX0lEKSAvKiBTdGFuZGFyZCBJRCBlbGVtZW50ICovDQotICAgIHsNCi0gICAgICBwUnhIZWFkZXItPklkZW50aWZpZXIgPSAoKCpSeEFkZHJlc3MgJiBGRENBTl9FTEVNRU5UX01BU0tfU1RESUQpID4+IDE4VSk7DQotICAgIH0gZWxzZSAvKiBFeHRlbmRlZCBJRCBlbGVtZW50ICovDQotICAgIHsNCi0gICAgICBwUnhIZWFkZXItPklkZW50aWZpZXIgPSAoKlJ4QWRkcmVzcyAmIEZEQ0FOX0VMRU1FTlRfTUFTS19FWFRJRCk7DQotICAgIH0NCi0NCi0gICAgLyogUmV0cmlldmUgUnhGcmFtZVR5cGUgKi8NCi0gICAgcFJ4SGVhZGVyLT5SeEZyYW1lVHlwZSA9ICgqUnhBZGRyZXNzICYgRkRDQU5fRUxFTUVOVF9NQVNLX1JUUik7DQotDQotICAgIC8qIFJldHJpZXZlIEVycm9yU3RhdGVJbmRpY2F0b3IgKi8NCi0gICAgcFJ4SGVhZGVyLT5FcnJvclN0YXRlSW5kaWNhdG9yID0gKCpSeEFkZHJlc3MgJiBGRENBTl9FTEVNRU5UX01BU0tfRVNJKTsNCi0NCi0gICAgLyogSW5jcmVtZW50IFJ4QWRkcmVzcyBwb2ludGVyIHRvIHNlY29uZCB3b3JkIG9mIFJ4IEZJRk8gZWxlbWVudCAqLw0KLSAgICBSeEFkZHJlc3MrKzsNCi0NCi0gICAgLyogUmV0cmlldmUgUnhUaW1lc3RhbXAgKi8NCi0gICAgcFJ4SGVhZGVyLT5SeFRpbWVzdGFtcCA9ICgqUnhBZGRyZXNzICYgRkRDQU5fRUxFTUVOVF9NQVNLX1RTKTsNCi0NCi0gICAgLyogUmV0cmlldmUgRGF0YUxlbmd0aCAqLw0KLSAgICBwUnhIZWFkZXItPkRhdGFMZW5ndGggPSAoKlJ4QWRkcmVzcyAmIEZEQ0FOX0VMRU1FTlRfTUFTS19ETEMpOw0KLQ0KLSAgICAvKiBSZXRyaWV2ZSBCaXRSYXRlU3dpdGNoICovDQotICAgIHBSeEhlYWRlci0+Qml0UmF0ZVN3aXRjaCA9ICgqUnhBZGRyZXNzICYgRkRDQU5fRUxFTUVOVF9NQVNLX0JSUyk7DQotDQotICAgIC8qIFJldHJpZXZlIEZERm9ybWF0ICovDQotICAgIHBSeEhlYWRlci0+RkRGb3JtYXQgPSAoKlJ4QWRkcmVzcyAmIEZEQ0FOX0VMRU1FTlRfTUFTS19GREYpOw0KLQ0KLSAgICAvKiBSZXRyaWV2ZSBGaWx0ZXJJbmRleCAqLw0KLSAgICBwUnhIZWFkZXItPkZpbHRlckluZGV4ID0gKCgqUnhBZGRyZXNzICYgRkRDQU5fRUxFTUVOVF9NQVNLX0ZJRFgpID4+IDI0VSk7DQotDQotICAgIC8qIFJldHJpZXZlIE5vbk1hdGNoaW5nRnJhbWUgKi8NCi0gICAgcFJ4SGVhZGVyLT5Jc0ZpbHRlck1hdGNoaW5nRnJhbWUgPQ0KLSAgICAgICAgKCgqUnhBZGRyZXNzICYgRkRDQU5fRUxFTUVOVF9NQVNLX0FOTUYpID4+IDMxVSk7DQotDQotICAgIC8qIEluY3JlbWVudCBSeEFkZHJlc3MgcG9pbnRlciB0byBwYXlsb2FkIG9mIFJ4IEZJRk8gZWxlbWVudCAqLw0KLSAgICBSeEFkZHJlc3MrKzsNCi0NCi0gICAgLyogUmV0cmlldmUgUnggcGF5bG9hZCAqLw0KLSAgICBwRGF0YSA9ICh1aW50OF90ICopUnhBZGRyZXNzOw0KLSAgICBmb3IgKEJ5dGVDb3VudGVyID0gMDsNCi0gICAgICAgICBCeXRlQ291bnRlciA8IERMQ3RvQnl0ZXNbcFJ4SGVhZGVyLT5EYXRhTGVuZ3RoID4+IDE2VV07DQotICAgICAgICAgQnl0ZUNvdW50ZXIrKykgew0KLSAgICAgIHBSeERhdGFbQnl0ZUNvdW50ZXJdID0gcERhdGFbQnl0ZUNvdW50ZXJdOw0KLSAgICB9DQotDQotICAgIGlmIChSeExvY2F0aW9uID09DQotICAgICAgICBGRENBTl9SWF9GSUZPMCkgLyogUnggZWxlbWVudCBpcyBhc3NpZ25lZCB0byB0aGUgUnggRklGTyAwICovDQotICAgIHsNCi0gICAgICAvKiBBY2tub3dsZWRnZSB0aGUgUnggRklGTyAwIHRoYXQgdGhlIG9sZGVzdCBlbGVtZW50IGlzIHJlYWQgc28gdGhhdCBpdA0KLSAgICAgICAqIGluY3JlbWVudHMgdGhlIEdldEluZGV4ICovDQotICAgICAgaGZkY2FuLT5JbnN0YW5jZS0+UlhGMEEgPSBHZXRJbmRleDsNCi0gICAgfSBlbHNlIC8qIFJ4IGVsZW1lbnQgaXMgYXNzaWduZWQgdG8gdGhlIFJ4IEZJRk8gMSAqLw0KLSAgICB7DQotICAgICAgLyogQWNrbm93bGVkZ2UgdGhlIFJ4IEZJRk8gMSB0aGF0IHRoZSBvbGRlc3QgZWxlbWVudCBpcyByZWFkIHNvIHRoYXQgaXQNCi0gICAgICAgKiBpbmNyZW1lbnRzIHRoZSBHZXRJbmRleCAqLw0KLSAgICAgIGhmZGNhbi0+SW5zdGFuY2UtPlJYRjFBID0gR2V0SW5kZXg7DQotICAgIH0NCi0NCi0gICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLw0KLSAgICByZXR1cm4gSEFMX09LOw0KLSAgfSBlbHNlIHsNCi0gICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8NCi0gICAgaGZkY2FuLT5FcnJvckNvZGUgfD0gSEFMX0ZEQ0FOX0VSUk9SX05PVF9TVEFSVEVEOw0KLQ0KLSAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBhbiBGRENBTiBUeCBldmVudCBmcm9tIHRoZSBUeCBFdmVudCBGSUZPIHpvbmUgaW50byB0aGUgbWVzc2FnZQ0KLSAqIFJBTS4NCi0gKiBAcGFyYW0gIGhmZGNhbiBwb2ludGVyIHRvIGFuIEZEQ0FOX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCi0gKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZEQ0FOLg0KLSAqIEBwYXJhbSAgcFR4RXZlbnQgcG9pbnRlciB0byBhIEZEQ0FOX1R4RXZlbnRGaWZvVHlwZURlZiBzdHJ1Y3R1cmUuDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX0dldFR4RXZlbnQoRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZEQ0FOX1R4RXZlbnRGaWZvVHlwZURlZiAqcFR4RXZlbnQpIHsNCi0gIHVpbnQzMl90ICpUeEV2ZW50QWRkcmVzczsNCi0gIHVpbnQzMl90IEdldEluZGV4Ow0KLSAgSEFMX0ZEQ0FOX1N0YXRlVHlwZURlZiBzdGF0ZSA9IGhmZGNhbi0+U3RhdGU7DQotDQotICBpZiAoc3RhdGUgPT0gSEFMX0ZEQ0FOX1NUQVRFX0JVU1kpIHsNCi0gICAgLyogQ2hlY2sgdGhhdCB0aGUgVHggZXZlbnQgRklGTyBpcyBub3QgZW1wdHkgKi8NCi0gICAgaWYgKChoZmRjYW4tPkluc3RhbmNlLT5UWEVGUyAmIEZEQ0FOX1RYRUZTX0VGRkwpID09IDBVKSB7DQotICAgICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8NCi0gICAgICBoZmRjYW4tPkVycm9yQ29kZSB8PSBIQUxfRkRDQU5fRVJST1JfRklGT19FTVBUWTsNCi0NCi0gICAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgICB9DQotDQotICAgIC8qIENhbGN1bGF0ZSBUeCBldmVudCBGSUZPIGVsZW1lbnQgYWRkcmVzcyAqLw0KLSAgICBHZXRJbmRleCA9DQotICAgICAgICAoKGhmZGNhbi0+SW5zdGFuY2UtPlRYRUZTICYgRkRDQU5fVFhFRlNfRUZHSSkgPj4gRkRDQU5fVFhFRlNfRUZHSV9Qb3MpOw0KLSAgICBUeEV2ZW50QWRkcmVzcyA9ICh1aW50MzJfdCAqKShoZmRjYW4tPm1zZ1JhbS5UeEV2ZW50RklGT1NBICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEdldEluZGV4ICogU1JBTUNBTl9URUZfU0laRSkpOw0KLQ0KLSAgICAvKiBSZXRyaWV2ZSBJZFR5cGUgKi8NCi0gICAgcFR4RXZlbnQtPklkVHlwZSA9ICpUeEV2ZW50QWRkcmVzcyAmIEZEQ0FOX0VMRU1FTlRfTUFTS19YVEQ7DQotDQotICAgIC8qIFJldHJpZXZlIElkZW50aWZpZXIgKi8NCi0gICAgaWYgKHBUeEV2ZW50LT5JZFR5cGUgPT0gRkRDQU5fU1RBTkRBUkRfSUQpIC8qIFN0YW5kYXJkIElEIGVsZW1lbnQgKi8NCi0gICAgew0KLSAgICAgIHBUeEV2ZW50LT5JZGVudGlmaWVyID0NCi0gICAgICAgICAgKCgqVHhFdmVudEFkZHJlc3MgJiBGRENBTl9FTEVNRU5UX01BU0tfU1RESUQpID4+IDE4VSk7DQotICAgIH0gZWxzZSAvKiBFeHRlbmRlZCBJRCBlbGVtZW50ICovDQotICAgIHsNCi0gICAgICBwVHhFdmVudC0+SWRlbnRpZmllciA9ICgqVHhFdmVudEFkZHJlc3MgJiBGRENBTl9FTEVNRU5UX01BU0tfRVhUSUQpOw0KLSAgICB9DQotDQotICAgIC8qIFJldHJpZXZlIFR4RnJhbWVUeXBlICovDQotICAgIHBUeEV2ZW50LT5UeEZyYW1lVHlwZSA9ICgqVHhFdmVudEFkZHJlc3MgJiBGRENBTl9FTEVNRU5UX01BU0tfUlRSKTsNCi0NCi0gICAgLyogUmV0cmlldmUgRXJyb3JTdGF0ZUluZGljYXRvciAqLw0KLSAgICBwVHhFdmVudC0+RXJyb3JTdGF0ZUluZGljYXRvciA9ICgqVHhFdmVudEFkZHJlc3MgJiBGRENBTl9FTEVNRU5UX01BU0tfRVNJKTsNCi0NCi0gICAgLyogSW5jcmVtZW50IFR4RXZlbnRBZGRyZXNzIHBvaW50ZXIgdG8gc2Vjb25kIHdvcmQgb2YgVHggRXZlbnQgRklGTyBlbGVtZW50DQotICAgICAqLw0KLSAgICBUeEV2ZW50QWRkcmVzcysrOw0KLQ0KLSAgICAvKiBSZXRyaWV2ZSBUeFRpbWVzdGFtcCAqLw0KLSAgICBwVHhFdmVudC0+VHhUaW1lc3RhbXAgPSAoKlR4RXZlbnRBZGRyZXNzICYgRkRDQU5fRUxFTUVOVF9NQVNLX1RTKTsNCi0NCi0gICAgLyogUmV0cmlldmUgRGF0YUxlbmd0aCAqLw0KLSAgICBwVHhFdmVudC0+RGF0YUxlbmd0aCA9ICgqVHhFdmVudEFkZHJlc3MgJiBGRENBTl9FTEVNRU5UX01BU0tfRExDKTsNCi0NCi0gICAgLyogUmV0cmlldmUgQml0UmF0ZVN3aXRjaCAqLw0KLSAgICBwVHhFdmVudC0+Qml0UmF0ZVN3aXRjaCA9ICgqVHhFdmVudEFkZHJlc3MgJiBGRENBTl9FTEVNRU5UX01BU0tfQlJTKTsNCi0NCi0gICAgLyogUmV0cmlldmUgRkRGb3JtYXQgKi8NCi0gICAgcFR4RXZlbnQtPkZERm9ybWF0ID0gKCpUeEV2ZW50QWRkcmVzcyAmIEZEQ0FOX0VMRU1FTlRfTUFTS19GREYpOw0KLQ0KLSAgICAvKiBSZXRyaWV2ZSBFdmVudFR5cGUgKi8NCi0gICAgcFR4RXZlbnQtPkV2ZW50VHlwZSA9ICgqVHhFdmVudEFkZHJlc3MgJiBGRENBTl9FTEVNRU5UX01BU0tfRVQpOw0KLQ0KLSAgICAvKiBSZXRyaWV2ZSBNZXNzYWdlTWFya2VyICovDQotICAgIHBUeEV2ZW50LT5NZXNzYWdlTWFya2VyID0NCi0gICAgICAgICgoKlR4RXZlbnRBZGRyZXNzICYgRkRDQU5fRUxFTUVOVF9NQVNLX01NKSA+PiAyNFUpOw0KLQ0KLSAgICAvKiBBY2tub3dsZWRnZSB0aGUgVHggRXZlbnQgRklGTyB0aGF0IHRoZSBvbGRlc3QgZWxlbWVudCBpcyByZWFkIHNvIHRoYXQgaXQNCi0gICAgICogaW5jcmVtZW50cyB0aGUgR2V0SW5kZXggKi8NCi0gICAgaGZkY2FuLT5JbnN0YW5jZS0+VFhFRkEgPSBHZXRJbmRleDsNCi0NCi0gICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLw0KLSAgICByZXR1cm4gSEFMX09LOw0KLSAgfSBlbHNlIHsNCi0gICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8NCi0gICAgaGZkY2FuLT5FcnJvckNvZGUgfD0gSEFMX0ZEQ0FOX0VSUk9SX05PVF9TVEFSVEVEOw0KLQ0KLSAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBoaWdoIHByaW9yaXR5IG1lc3NhZ2Ugc3RhdHVzLg0KLSAqIEBwYXJhbSAgaGZkY2FuIHBvaW50ZXIgdG8gYW4gRkRDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KLSAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRkRDQU4uDQotICogQHBhcmFtICBIcE1zZ1N0YXR1cyBwb2ludGVyIHRvIGFuIEZEQ0FOX0hwTXNnU3RhdHVzVHlwZURlZiBzdHJ1Y3R1cmUuDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX0dldEhpZ2hQcmlvcml0eU1lc3NhZ2VTdGF0dXMoDQotICAgIEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwgRkRDQU5fSHBNc2dTdGF0dXNUeXBlRGVmICpIcE1zZ1N0YXR1cykgew0KLSAgSHBNc2dTdGF0dXMtPkZpbHRlckxpc3QgPQ0KLSAgICAgICgoaGZkY2FuLT5JbnN0YW5jZS0+SFBNUyAmIEZEQ0FOX0hQTVNfRkxTVCkgPj4gRkRDQU5fSFBNU19GTFNUX1Bvcyk7DQotICBIcE1zZ1N0YXR1cy0+RmlsdGVySW5kZXggPQ0KLSAgICAgICgoaGZkY2FuLT5JbnN0YW5jZS0+SFBNUyAmIEZEQ0FOX0hQTVNfRklEWCkgPj4gRkRDQU5fSFBNU19GSURYX1Bvcyk7DQotICBIcE1zZ1N0YXR1cy0+TWVzc2FnZVN0b3JhZ2UgPSAoaGZkY2FuLT5JbnN0YW5jZS0+SFBNUyAmIEZEQ0FOX0hQTVNfTVNJKTsNCi0gIEhwTXNnU3RhdHVzLT5NZXNzYWdlSW5kZXggPSAoaGZkY2FuLT5JbnN0YW5jZS0+SFBNUyAmIEZEQ0FOX0hQTVNfQklEWCk7DQotDQotICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovDQotICByZXR1cm4gSEFMX09LOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBwcm90b2NvbCBzdGF0dXMuDQotICogQHBhcmFtICBoZmRjYW4gcG9pbnRlciB0byBhbiBGRENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQotICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBGRENBTi4NCi0gKiBAcGFyYW0gIFByb3RvY29sU3RhdHVzIHBvaW50ZXIgdG8gYW4gRkRDQU5fUHJvdG9jb2xTdGF0dXNUeXBlRGVmIHN0cnVjdHVyZS4NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fR2V0UHJvdG9jb2xTdGF0dXMoDQotICAgIEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwgRkRDQU5fUHJvdG9jb2xTdGF0dXNUeXBlRGVmICpQcm90b2NvbFN0YXR1cykgew0KLSAgdWludDMyX3QgU3RhdHVzUmVnOw0KLQ0KLSAgLyogUmVhZCB0aGUgcHJvdG9jb2wgc3RhdHVzIHJlZ2lzdGVyICovDQotICBTdGF0dXNSZWcgPSBSRUFEX1JFRyhoZmRjYW4tPkluc3RhbmNlLT5QU1IpOw0KLQ0KLSAgLyogRmlsbCB0aGUgcHJvdG9jb2wgc3RhdHVzIHN0cnVjdHVyZSAqLw0KLSAgUHJvdG9jb2xTdGF0dXMtPkxhc3RFcnJvckNvZGUgPSAoU3RhdHVzUmVnICYgRkRDQU5fUFNSX0xFQyk7DQotICBQcm90b2NvbFN0YXR1cy0+RGF0YUxhc3RFcnJvckNvZGUgPQ0KLSAgICAgICgoU3RhdHVzUmVnICYgRkRDQU5fUFNSX0RMRUMpID4+IEZEQ0FOX1BTUl9ETEVDX1Bvcyk7DQotICBQcm90b2NvbFN0YXR1cy0+QWN0aXZpdHkgPSAoU3RhdHVzUmVnICYgRkRDQU5fUFNSX0FDVCk7DQotICBQcm90b2NvbFN0YXR1cy0+RXJyb3JQYXNzaXZlID0NCi0gICAgICAoKFN0YXR1c1JlZyAmIEZEQ0FOX1BTUl9FUCkgPj4gRkRDQU5fUFNSX0VQX1Bvcyk7DQotICBQcm90b2NvbFN0YXR1cy0+V2FybmluZyA9ICgoU3RhdHVzUmVnICYgRkRDQU5fUFNSX0VXKSA+PiBGRENBTl9QU1JfRVdfUG9zKTsNCi0gIFByb3RvY29sU3RhdHVzLT5CdXNPZmYgPSAoKFN0YXR1c1JlZyAmIEZEQ0FOX1BTUl9CTykgPj4gRkRDQU5fUFNSX0JPX1Bvcyk7DQotICBQcm90b2NvbFN0YXR1cy0+UnhFU0lmbGFnID0NCi0gICAgICAoKFN0YXR1c1JlZyAmIEZEQ0FOX1BTUl9SRVNJKSA+PiBGRENBTl9QU1JfUkVTSV9Qb3MpOw0KLSAgUHJvdG9jb2xTdGF0dXMtPlJ4QlJTZmxhZyA9DQotICAgICAgKChTdGF0dXNSZWcgJiBGRENBTl9QU1JfUkJSUykgPj4gRkRDQU5fUFNSX1JCUlNfUG9zKTsNCi0gIFByb3RvY29sU3RhdHVzLT5SeEZERmZsYWcgPQ0KLSAgICAgICgoU3RhdHVzUmVnICYgRkRDQU5fUFNSX1JFREwpID4+IEZEQ0FOX1BTUl9SRURMX1Bvcyk7DQotICBQcm90b2NvbFN0YXR1cy0+UHJvdG9jb2xFeGNlcHRpb24gPQ0KLSAgICAgICgoU3RhdHVzUmVnICYgRkRDQU5fUFNSX1BYRSkgPj4gRkRDQU5fUFNSX1BYRV9Qb3MpOw0KLSAgUHJvdG9jb2xTdGF0dXMtPlREQ3ZhbHVlID0NCi0gICAgICAoKFN0YXR1c1JlZyAmIEZEQ0FOX1BTUl9URENWKSA+PiBGRENBTl9QU1JfVERDVl9Qb3MpOw0KLQ0KLSAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLw0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHZXQgZXJyb3IgY291bnRlciB2YWx1ZXMuDQotICogQHBhcmFtICBoZmRjYW4gcG9pbnRlciB0byBhbiBGRENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQotICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBGRENBTi4NCi0gKiBAcGFyYW0gIEVycm9yQ291bnRlcnMgcG9pbnRlciB0byBhbiBGRENBTl9FcnJvckNvdW50ZXJzVHlwZURlZiBzdHJ1Y3R1cmUuDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX0dldEVycm9yQ291bnRlcnMoDQotICAgIEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwgRkRDQU5fRXJyb3JDb3VudGVyc1R5cGVEZWYgKkVycm9yQ291bnRlcnMpIHsNCi0gIHVpbnQzMl90IENvdW50ZXJzUmVnOw0KLQ0KLSAgLyogUmVhZCB0aGUgZXJyb3IgY291bnRlcnMgcmVnaXN0ZXIgKi8NCi0gIENvdW50ZXJzUmVnID0gUkVBRF9SRUcoaGZkY2FuLT5JbnN0YW5jZS0+RUNSKTsNCi0NCi0gIC8qIEZpbGwgdGhlIGVycm9yIGNvdW50ZXJzIHN0cnVjdHVyZSAqLw0KLSAgRXJyb3JDb3VudGVycy0+VHhFcnJvckNudCA9DQotICAgICAgKChDb3VudGVyc1JlZyAmIEZEQ0FOX0VDUl9URUMpID4+IEZEQ0FOX0VDUl9URUNfUG9zKTsNCi0gIEVycm9yQ291bnRlcnMtPlJ4RXJyb3JDbnQgPQ0KLSAgICAgICgoQ291bnRlcnNSZWcgJiBGRENBTl9FQ1JfUkVDKSA+PiBGRENBTl9FQ1JfUkVDX1Bvcyk7DQotICBFcnJvckNvdW50ZXJzLT5SeEVycm9yUGFzc2l2ZSA9DQotICAgICAgKChDb3VudGVyc1JlZyAmIEZEQ0FOX0VDUl9SUCkgPj4gRkRDQU5fRUNSX1JQX1Bvcyk7DQotICBFcnJvckNvdW50ZXJzLT5FcnJvckxvZ2dpbmcgPQ0KLSAgICAgICgoQ291bnRlcnNSZWcgJiBGRENBTl9FQ1JfQ0VMKSA+PiBGRENBTl9FQ1JfQ0VMX1Bvcyk7DQotDQotICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovDQotICByZXR1cm4gSEFMX09LOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENoZWNrIGlmIGEgdHJhbnNtaXNzaW9uIHJlcXVlc3QgaXMgcGVuZGluZyBvbiB0aGUgc2VsZWN0ZWQgVHggYnVmZmVyLg0KLSAqIEBwYXJhbSAgaGZkY2FuIHBvaW50ZXIgdG8gYW4gRkRDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KLSAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRkRDQU4uDQotICogQHBhcmFtICBUeEJ1ZmZlckluZGV4IFR4IGJ1ZmZlciBpbmRleC4NCi0gKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgQGFyZyBGRENBTl9UeF9sb2NhdGlvbi4NCi0gKiBAcmV0dmFsIFN0YXR1cw0KLSAqICAgICAgICAgIC0gMCA6IE5vIHBlbmRpbmcgdHJhbnNtaXNzaW9uIHJlcXVlc3Qgb24gVHhCdWZmZXJJbmRleCBsaXN0DQotICogICAgICAgICAgLSAxIDogUGVuZGluZyB0cmFuc21pc3Npb24gcmVxdWVzdCBvbiBUeEJ1ZmZlckluZGV4Lg0KLSAqLw0KLXVpbnQzMl90IEhBTF9GRENBTl9Jc1R4QnVmZmVyTWVzc2FnZVBlbmRpbmcoRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVHhCdWZmZXJJbmRleCkgew0KLSAgLyogQ2hlY2sgZnVuY3Rpb24gcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZEQ0FOX1RYX0xPQ0FUSU9OX0xJU1QoVHhCdWZmZXJJbmRleCkpOw0KLQ0KLSAgLyogQ2hlY2sgcGVuZGluZyB0cmFuc21pc3Npb24gcmVxdWVzdCBvbiB0aGUgc2VsZWN0ZWQgYnVmZmVyICovDQotICBpZiAoKGhmZGNhbi0+SW5zdGFuY2UtPlRYQlJQICYgVHhCdWZmZXJJbmRleCkgPT0gMFUpIHsNCi0gICAgcmV0dXJuIDA7DQotICB9DQotICByZXR1cm4gMTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBSZXR1cm4gUnggRklGTyBmaWxsIGxldmVsLg0KLSAqIEBwYXJhbSAgaGZkY2FuIHBvaW50ZXIgdG8gYW4gRkRDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KLSAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRkRDQU4uDQotICogQHBhcmFtICBSeEZpZm8gUnggRklGTy4NCi0gKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgIEBhcmcgRkRDQU5fUlhfRklGTzA6IFJ4IEZJRk8gMA0KLSAqICAgICAgICAgICBAYXJnIEZEQ0FOX1JYX0ZJRk8xOiBSeCBGSUZPIDENCi0gKiBAcmV0dmFsIFJ4IEZJRk8gZmlsbCBsZXZlbC4NCi0gKi8NCi11aW50MzJfdCBIQUxfRkRDQU5fR2V0UnhGaWZvRmlsbExldmVsKEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFJ4Rmlmbykgew0KLSAgdWludDMyX3QgRmlsbExldmVsOw0KLQ0KLSAgLyogQ2hlY2sgZnVuY3Rpb24gcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZEQ0FOX1JYX0ZJRk8oUnhGaWZvKSk7DQotDQotICBpZiAoUnhGaWZvID09IEZEQ0FOX1JYX0ZJRk8wKSB7DQotICAgIEZpbGxMZXZlbCA9IGhmZGNhbi0+SW5zdGFuY2UtPlJYRjBTICYgRkRDQU5fUlhGMFNfRjBGTDsNCi0gIH0gZWxzZSAvKiBSeEZpZm8gPT0gRkRDQU5fUlhfRklGTzEgKi8NCi0gIHsNCi0gICAgRmlsbExldmVsID0gaGZkY2FuLT5JbnN0YW5jZS0+UlhGMVMgJiBGRENBTl9SWEYxU19GMUZMOw0KLSAgfQ0KLQ0KLSAgLyogUmV0dXJuIFJ4IEZJRk8gZmlsbCBsZXZlbCAqLw0KLSAgcmV0dXJuIEZpbGxMZXZlbDsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBSZXR1cm4gVHggRklGTyBmcmVlIGxldmVsOiBudW1iZXIgb2YgY29uc2VjdXRpdmUgZnJlZSBUeCBGSUZPDQotICogICAgICAgICBlbGVtZW50cyBzdGFydGluZyBmcm9tIFR4IEZJRk8gR2V0SW5kZXguDQotICogQHBhcmFtICBoZmRjYW4gcG9pbnRlciB0byBhbiBGRENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQotICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBGRENBTi4NCi0gKiBAcmV0dmFsIFR4IEZJRk8gZnJlZSBsZXZlbC4NCi0gKi8NCi11aW50MzJfdCBIQUxfRkRDQU5fR2V0VHhGaWZvRnJlZUxldmVsKEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbikgew0KLSAgdWludDMyX3QgRnJlZUxldmVsOw0KLQ0KLSAgRnJlZUxldmVsID0gaGZkY2FuLT5JbnN0YW5jZS0+VFhGUVMgJiBGRENBTl9UWEZRU19URkZMOw0KLQ0KLSAgLyogUmV0dXJuIFR4IEZJRk8gZnJlZSBsZXZlbCAqLw0KLSAgcmV0dXJuIEZyZWVMZXZlbDsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDaGVjayBpZiB0aGUgRkRDQU4gcGVyaXBoZXJhbCBlbnRlcmVkIFJlc3RyaWN0ZWQgT3BlcmF0aW9uIE1vZGUuDQotICogQHBhcmFtICBoZmRjYW4gcG9pbnRlciB0byBhbiBGRENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQotICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBGRENBTi4NCi0gKiBAcmV0dmFsIFN0YXR1cw0KLSAqICAgICAgICAgIC0gMCA6IE5vcm1hbCBGRENBTiBvcGVyYXRpb24uDQotICogICAgICAgICAgLSAxIDogUmVzdHJpY3RlZCBPcGVyYXRpb24gTW9kZSBhY3RpdmUuDQotICovDQotdWludDMyX3QgSEFMX0ZEQ0FOX0lzUmVzdHJpY3RlZE9wZXJhdGlvbk1vZGUoRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuKSB7DQotICB1aW50MzJfdCBPcGVyYXRpb25Nb2RlOw0KLQ0KLSAgLyogR2V0IE9wZXJhdGlvbiBNb2RlICovDQotICBPcGVyYXRpb25Nb2RlID0NCi0gICAgICAoKGhmZGNhbi0+SW5zdGFuY2UtPkNDQ1IgJiBGRENBTl9DQ0NSX0FTTSkgPj4gRkRDQU5fQ0NDUl9BU01fUG9zKTsNCi0NCi0gIHJldHVybiBPcGVyYXRpb25Nb2RlOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEV4aXQgUmVzdHJpY3RlZCBPcGVyYXRpb24gTW9kZS4NCi0gKiBAcGFyYW0gIGhmZGNhbiBwb2ludGVyIHRvIGFuIEZEQ0FOX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCi0gKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZEQ0FOLg0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9FeGl0UmVzdHJpY3RlZE9wZXJhdGlvbk1vZGUoDQotICAgIEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbikgew0KLSAgSEFMX0ZEQ0FOX1N0YXRlVHlwZURlZiBzdGF0ZSA9IGhmZGNhbi0+U3RhdGU7DQotDQotICBpZiAoKHN0YXRlID09IEhBTF9GRENBTl9TVEFURV9SRUFEWSkgfHwgKHN0YXRlID09IEhBTF9GRENBTl9TVEFURV9CVVNZKSkgew0KLSAgICAvKiBFeGl0IFJlc3RyaWN0ZWQgT3BlcmF0aW9uIG1vZGUgKi8NCi0gICAgQ0xFQVJfQklUKGhmZGNhbi0+SW5zdGFuY2UtPkNDQ1IsIEZEQ0FOX0NDQ1JfQVNNKTsNCi0NCi0gICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLw0KLSAgICByZXR1cm4gSEFMX09LOw0KLSAgfSBlbHNlIHsNCi0gICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8NCi0gICAgaGZkY2FuLT5FcnJvckNvZGUgfD0gSEFMX0ZEQ0FOX0VSUk9SX05PVF9JTklUSUFMSVpFRDsNCi0NCi0gICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gIH0NCi19DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEZEQ0FOX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQgSW50ZXJydXB0cyBtYW5hZ2VtZW50DQotICAqICBAYnJpZWYgICAgSW50ZXJydXB0cyBtYW5hZ2VtZW50DQotICAqDQotQHZlcmJhdGltDQotICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEludGVycnVwdHMgbWFuYWdlbWVudCAjIyMjIw0KLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86DQotICAgICAgKCspIEhBTF9GRENBTl9Db25maWdJbnRlcnJ1cHRMaW5lcyAgICAgIDogQXNzaWduIGludGVycnVwdHMgdG8gZWl0aGVyDQotSW50ZXJydXB0IGxpbmUgMCBvciAxDQotICAgICAgKCspIEhBTF9GRENBTl9BY3RpdmF0ZU5vdGlmaWNhdGlvbiAgICAgIDogRW5hYmxlIGludGVycnVwdHMNCi0gICAgICAoKykgSEFMX0ZEQ0FOX0RlYWN0aXZhdGVOb3RpZmljYXRpb24gICAgOiBEaXNhYmxlIGludGVycnVwdHMNCi0gICAgICAoKykgSEFMX0ZEQ0FOX0lSUUhhbmRsZXIgICAgICAgICAgICAgICAgOiBIYW5kbGVzIEZEQ0FOIGludGVycnVwdCByZXF1ZXN0DQotDQotQGVuZHZlcmJhdGltDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQXNzaWduIGludGVycnVwdHMgdG8gZWl0aGVyIEludGVycnVwdCBsaW5lIDAgb3IgMS4NCi0gKiBAcGFyYW0gIGhmZGNhbiBwb2ludGVyIHRvIGFuIEZEQ0FOX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCi0gKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZEQ0FOLg0KLSAqIEBwYXJhbSAgSVRMaXN0IGluZGljYXRlcyB3aGljaCBpbnRlcnJ1cHRzIGdyb3VwIHdpbGwgYmUgYXNzaWduZWQgdG8gdGhlDQotICogc2VsZWN0ZWQgaW50ZXJydXB0IGxpbmUuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgQGFyZw0KLSAqIEZEQ0FOX0ludGVycnVwdHNfR3JvdXAuDQotICogQHBhcmFtICBJbnRlcnJ1cHRMaW5lIEludGVycnVwdCBsaW5lLg0KLSAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQGFyZyBGRENBTl9JbnRlcnJ1cHRfTGluZS4NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fQ29uZmlnSW50ZXJydXB0TGluZXMoRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBJVExpc3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEludGVycnVwdExpbmUpIHsNCi0gIEhBTF9GRENBTl9TdGF0ZVR5cGVEZWYgc3RhdGUgPSBoZmRjYW4tPlN0YXRlOw0KLQ0KLSAgLyogQ2hlY2sgZnVuY3Rpb24gcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZEQ0FOX0lUX0dST1VQKElUTGlzdCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZEQ0FOX0lUX0xJTkUoSW50ZXJydXB0TGluZSkpOw0KLQ0KLSAgaWYgKChzdGF0ZSA9PSBIQUxfRkRDQU5fU1RBVEVfUkVBRFkpIHx8IChzdGF0ZSA9PSBIQUxfRkRDQU5fU1RBVEVfQlVTWSkpIHsNCi0gICAgLyogQXNzaWduIGxpc3Qgb2YgaW50ZXJydXB0cyB0byB0aGUgc2VsZWN0ZWQgbGluZSAqLw0KLSAgICBpZiAoSW50ZXJydXB0TGluZSA9PSBGRENBTl9JTlRFUlJVUFRfTElORTApIHsNCi0gICAgICBDTEVBUl9CSVQoaGZkY2FuLT5JbnN0YW5jZS0+SUxTLCBJVExpc3QpOw0KLSAgICB9IGVsc2UgLyogSW50ZXJydXB0TGluZSA9PSBGRENBTl9JTlRFUlJVUFRfTElORTEgKi8NCi0gICAgew0KLSAgICAgIFNFVF9CSVQoaGZkY2FuLT5JbnN0YW5jZS0+SUxTLCBJVExpc3QpOw0KLSAgICB9DQotDQotICAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8NCi0gICAgcmV0dXJuIEhBTF9PSzsNCi0gIH0gZWxzZSB7DQotICAgIC8qIFVwZGF0ZSBlcnJvciBjb2RlICovDQotICAgIGhmZGNhbi0+RXJyb3JDb2RlIHw9IEhBTF9GRENBTl9FUlJPUl9OT1RfSU5JVElBTElaRUQ7DQotDQotICAgIHJldHVybiBIQUxfRVJST1I7DQotICB9DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIGludGVycnVwdHMuDQotICogQHBhcmFtICBoZmRjYW4gcG9pbnRlciB0byBhbiBGRENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQotICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBGRENBTi4NCi0gKiBAcGFyYW0gIEFjdGl2ZUlUcyBpbmRpY2F0ZXMgd2hpY2ggaW50ZXJydXB0cyB3aWxsIGJlIGVuYWJsZWQuDQotICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIEBhcmcgRkRDQU5fSW50ZXJydXB0cy4NCi0gKiBAcGFyYW0gIEJ1ZmZlckluZGV4ZXMgVHggQnVmZmVyIEluZGV4ZXMuDQotICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIEBhcmcgRkRDQU5fVHhfbG9jYXRpb24uDQotICogICAgICAgICBUaGlzIHBhcmFtZXRlciBpcyBpZ25vcmVkIGlmIEFjdGl2ZUlUcyBkb2VzIG5vdCBpbmNsdWRlIG9uZSBvZiB0aGUNCi0gKiBmb2xsb3dpbmc6DQotICogICAgICAgICAgIC0gRkRDQU5fSVRfVFhfQ09NUExFVEUNCi0gKiAgICAgICAgICAgLSBGRENBTl9JVF9UWF9BQk9SVF9DT01QTEVURQ0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9BY3RpdmF0ZU5vdGlmaWNhdGlvbihGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEFjdGl2ZUlUcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQnVmZmVySW5kZXhlcykgew0KLSAgSEFMX0ZEQ0FOX1N0YXRlVHlwZURlZiBzdGF0ZSA9IGhmZGNhbi0+U3RhdGU7DQotICB1aW50MzJfdCBJVHNfbGluZXNfc2VsZWN0aW9uOw0KLQ0KLSAgLyogQ2hlY2sgZnVuY3Rpb24gcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZEQ0FOX0lUKEFjdGl2ZUlUcykpOw0KLSAgaWYgKChBY3RpdmVJVHMgJiAoRkRDQU5fSVRfVFhfQ09NUExFVEUgfCBGRENBTl9JVF9UWF9BQk9SVF9DT01QTEVURSkpICE9IDBVKSB7DQotICAgIGFzc2VydF9wYXJhbShJU19GRENBTl9UWF9MT0NBVElPTl9MSVNUKEJ1ZmZlckluZGV4ZXMpKTsNCi0gIH0NCi0NCi0gIGlmICgoc3RhdGUgPT0gSEFMX0ZEQ0FOX1NUQVRFX1JFQURZKSB8fCAoc3RhdGUgPT0gSEFMX0ZEQ0FOX1NUQVRFX0JVU1kpKSB7DQotICAgIC8qIEdldCBpbnRlcnJ1cHRzIGxpbmUgc2VsZWN0aW9uICovDQotICAgIElUc19saW5lc19zZWxlY3Rpb24gPSBoZmRjYW4tPkluc3RhbmNlLT5JTFM7DQotDQotICAgIC8qIEVuYWJsZSBJbnRlcnJ1cHQgbGluZXMgKi8NCi0gICAgaWYgKCgoKEFjdGl2ZUlUcyAmIEZEQ0FOX0lUX0xJU1RfUlhfRklGTzApICE9IDBVKSAmJg0KLSAgICAgICAgICgoKElUc19saW5lc19zZWxlY3Rpb24pJkZEQ0FOX0lUX0dST1VQX1JYX0ZJRk8wKSA9PSAwVSkpIHx8DQotICAgICAgICAoKChBY3RpdmVJVHMgJiBGRENBTl9JVF9MSVNUX1JYX0ZJRk8xKSAhPSAwVSkgJiYNCi0gICAgICAgICAoKChJVHNfbGluZXNfc2VsZWN0aW9uKSZGRENBTl9JVF9HUk9VUF9SWF9GSUZPMSkgPT0gMFUpKSB8fA0KLSAgICAgICAgKCgoQWN0aXZlSVRzICYgRkRDQU5fSVRfTElTVF9TTVNHKSAhPSAwVSkgJiYNCi0gICAgICAgICAoKChJVHNfbGluZXNfc2VsZWN0aW9uKSZGRENBTl9JVF9HUk9VUF9TTVNHKSA9PSAwVSkpIHx8DQotICAgICAgICAoKChBY3RpdmVJVHMgJiBGRENBTl9JVF9MSVNUX1RYX0ZJRk9fRVJST1IpICE9IDBVKSAmJg0KLSAgICAgICAgICgoKElUc19saW5lc19zZWxlY3Rpb24pJkZEQ0FOX0lUX0dST1VQX1RYX0ZJRk9fRVJST1IpID09IDBVKSkgfHwNCi0gICAgICAgICgoKEFjdGl2ZUlUcyAmIEZEQ0FOX0lUX0xJU1RfTUlTQykgIT0gMFUpICYmDQotICAgICAgICAgKCgoSVRzX2xpbmVzX3NlbGVjdGlvbikmRkRDQU5fSVRfR1JPVVBfTUlTQykgPT0gMFUpKSB8fA0KLSAgICAgICAgKCgoQWN0aXZlSVRzICYgRkRDQU5fSVRfTElTVF9CSVRfTElORV9FUlJPUikgIT0gMFUpICYmDQotICAgICAgICAgKCgoSVRzX2xpbmVzX3NlbGVjdGlvbikmRkRDQU5fSVRfR1JPVVBfQklUX0xJTkVfRVJST1IpID09IDBVKSkgfHwNCi0gICAgICAgICgoKEFjdGl2ZUlUcyAmIEZEQ0FOX0lUX0xJU1RfUFJPVE9DT0xfRVJST1IpICE9IDBVKSAmJg0KLSAgICAgICAgICgoKElUc19saW5lc19zZWxlY3Rpb24pJkZEQ0FOX0lUX0dST1VQX1BST1RPQ09MX0VSUk9SKSA9PSAwVSkpKSB7DQotICAgICAgLyogRW5hYmxlIEludGVycnVwdCBsaW5lIDAgKi8NCi0gICAgICBTRVRfQklUKGhmZGNhbi0+SW5zdGFuY2UtPklMRSwgRkRDQU5fSU5URVJSVVBUX0xJTkUwKTsNCi0gICAgfQ0KLSAgICBpZiAoKCgoQWN0aXZlSVRzICYgRkRDQU5fSVRfTElTVF9SWF9GSUZPMCkgIT0gMFUpICYmDQotICAgICAgICAgKCgoSVRzX2xpbmVzX3NlbGVjdGlvbikmRkRDQU5fSVRfR1JPVVBfUlhfRklGTzApICE9IDBVKSkgfHwNCi0gICAgICAgICgoKEFjdGl2ZUlUcyAmIEZEQ0FOX0lUX0xJU1RfUlhfRklGTzEpICE9IDBVKSAmJg0KLSAgICAgICAgICgoKElUc19saW5lc19zZWxlY3Rpb24pJkZEQ0FOX0lUX0dST1VQX1JYX0ZJRk8xKSAhPSAwVSkpIHx8DQotICAgICAgICAoKChBY3RpdmVJVHMgJiBGRENBTl9JVF9MSVNUX1NNU0cpICE9IDBVKSAmJg0KLSAgICAgICAgICgoKElUc19saW5lc19zZWxlY3Rpb24pJkZEQ0FOX0lUX0dST1VQX1NNU0cpICE9IDBVKSkgfHwNCi0gICAgICAgICgoKEFjdGl2ZUlUcyAmIEZEQ0FOX0lUX0xJU1RfVFhfRklGT19FUlJPUikgIT0gMFUpICYmDQotICAgICAgICAgKCgoSVRzX2xpbmVzX3NlbGVjdGlvbikmRkRDQU5fSVRfR1JPVVBfVFhfRklGT19FUlJPUikgIT0gMFUpKSB8fA0KLSAgICAgICAgKCgoQWN0aXZlSVRzICYgRkRDQU5fSVRfTElTVF9NSVNDKSAhPSAwVSkgJiYNCi0gICAgICAgICAoKChJVHNfbGluZXNfc2VsZWN0aW9uKSZGRENBTl9JVF9HUk9VUF9NSVNDKSAhPSAwVSkpIHx8DQotICAgICAgICAoKChBY3RpdmVJVHMgJiBGRENBTl9JVF9MSVNUX0JJVF9MSU5FX0VSUk9SKSAhPSAwVSkgJiYNCi0gICAgICAgICAoKChJVHNfbGluZXNfc2VsZWN0aW9uKSZGRENBTl9JVF9HUk9VUF9CSVRfTElORV9FUlJPUikgIT0gMFUpKSB8fA0KLSAgICAgICAgKCgoQWN0aXZlSVRzICYgRkRDQU5fSVRfTElTVF9QUk9UT0NPTF9FUlJPUikgIT0gMFUpICYmDQotICAgICAgICAgKCgoSVRzX2xpbmVzX3NlbGVjdGlvbikmRkRDQU5fSVRfR1JPVVBfUFJPVE9DT0xfRVJST1IpICE9IDBVKSkpIHsNCi0gICAgICAvKiBFbmFibGUgSW50ZXJydXB0IGxpbmUgMSAqLw0KLSAgICAgIFNFVF9CSVQoaGZkY2FuLT5JbnN0YW5jZS0+SUxFLCBGRENBTl9JTlRFUlJVUFRfTElORTEpOw0KLSAgICB9DQotDQotICAgIGlmICgoQWN0aXZlSVRzICYgRkRDQU5fSVRfVFhfQ09NUExFVEUpICE9IDBVKSB7DQotICAgICAgLyogRW5hYmxlIFR4IEJ1ZmZlciBUcmFuc21pc3Npb24gSW50ZXJydXB0IHRvIHNldCBUQyBmbGFnIGluIElSIHJlZ2lzdGVyLA0KLSAgICAgICAgIGJ1dCBpbnRlcnJ1cHQgd2lsbCBvbmx5IG9jY3VyIGlmIFRDIGlzIGVuYWJsZWQgaW4gSUUgcmVnaXN0ZXIgKi8NCi0gICAgICBTRVRfQklUKGhmZGNhbi0+SW5zdGFuY2UtPlRYQlRJRSwgQnVmZmVySW5kZXhlcyk7DQotICAgIH0NCi0NCi0gICAgaWYgKChBY3RpdmVJVHMgJiBGRENBTl9JVF9UWF9BQk9SVF9DT01QTEVURSkgIT0gMFUpIHsNCi0gICAgICAvKiBFbmFibGUgVHggQnVmZmVyIENhbmNlbGxhdGlvbiBGaW5pc2hlZCBJbnRlcnJ1cHQgdG8gc2V0IFRDRiBmbGFnIGluIElSDQotICAgICAgICAgcmVnaXN0ZXIsIGJ1dCBpbnRlcnJ1cHQgd2lsbCBvbmx5IG9jY3VyIGlmIFRDRiBpcyBlbmFibGVkIGluIElFDQotICAgICAgICAgcmVnaXN0ZXIgKi8NCi0gICAgICBTRVRfQklUKGhmZGNhbi0+SW5zdGFuY2UtPlRYQkNJRSwgQnVmZmVySW5kZXhlcyk7DQotICAgIH0NCi0NCi0gICAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBpbnRlcnJ1cHRzICovDQotICAgIF9fSEFMX0ZEQ0FOX0VOQUJMRV9JVChoZmRjYW4sIEFjdGl2ZUlUcyk7DQotDQotICAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8NCi0gICAgcmV0dXJuIEhBTF9PSzsNCi0gIH0gZWxzZSB7DQotICAgIC8qIFVwZGF0ZSBlcnJvciBjb2RlICovDQotICAgIGhmZGNhbi0+RXJyb3JDb2RlIHw9IEhBTF9GRENBTl9FUlJPUl9OT1RfSU5JVElBTElaRUQ7DQotDQotICAgIHJldHVybiBIQUxfRVJST1I7DQotICB9DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBpbnRlcnJ1cHRzLg0KLSAqIEBwYXJhbSAgaGZkY2FuIHBvaW50ZXIgdG8gYW4gRkRDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KLSAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRkRDQU4uDQotICogQHBhcmFtICBJbmFjdGl2ZUlUcyBpbmRpY2F0ZXMgd2hpY2ggaW50ZXJydXB0cyB3aWxsIGJlIGRpc2FibGVkLg0KLSAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiBAYXJnIEZEQ0FOX0ludGVycnVwdHMuDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX0RlYWN0aXZhdGVOb3RpZmljYXRpb24oRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEluYWN0aXZlSVRzKSB7DQotICBIQUxfRkRDQU5fU3RhdGVUeXBlRGVmIHN0YXRlID0gaGZkY2FuLT5TdGF0ZTsNCi0gIHVpbnQzMl90IElUc19lbmFibGVkOw0KLSAgdWludDMyX3QgSVRzX2xpbmVzX3NlbGVjdGlvbjsNCi0NCi0gIC8qIENoZWNrIGZ1bmN0aW9uIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19GRENBTl9JVChJbmFjdGl2ZUlUcykpOw0KLQ0KLSAgaWYgKChzdGF0ZSA9PSBIQUxfRkRDQU5fU1RBVEVfUkVBRFkpIHx8IChzdGF0ZSA9PSBIQUxfRkRDQU5fU1RBVEVfQlVTWSkpIHsNCi0gICAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgaW50ZXJydXB0cyAqLw0KLSAgICBfX0hBTF9GRENBTl9ESVNBQkxFX0lUKGhmZGNhbiwgSW5hY3RpdmVJVHMpOw0KLQ0KLSAgICBpZiAoKEluYWN0aXZlSVRzICYgRkRDQU5fSVRfVFhfQ09NUExFVEUpICE9IDBVKSB7DQotICAgICAgLyogRGlzYWJsZSBUeCBCdWZmZXIgVHJhbnNtaXNzaW9uIEludGVycnVwdHMgKi8NCi0gICAgICBDTEVBUl9SRUcoaGZkY2FuLT5JbnN0YW5jZS0+VFhCVElFKTsNCi0gICAgfQ0KLQ0KLSAgICBpZiAoKEluYWN0aXZlSVRzICYgRkRDQU5fSVRfVFhfQUJPUlRfQ09NUExFVEUpICE9IDBVKSB7DQotICAgICAgLyogRGlzYWJsZSBUeCBCdWZmZXIgQ2FuY2VsbGF0aW9uIEZpbmlzaGVkIEludGVycnVwdCAqLw0KLSAgICAgIENMRUFSX1JFRyhoZmRjYW4tPkluc3RhbmNlLT5UWEJDSUUpOw0KLSAgICB9DQotDQotICAgIC8qIEdldCBpbnRlcnJ1cHRzIGVuYWJsZWQgYW5kIGludGVycnVwdHMgbGluZSBzZWxlY3Rpb24gKi8NCi0gICAgSVRzX2VuYWJsZWQgPSBoZmRjYW4tPkluc3RhbmNlLT5JRTsNCi0gICAgSVRzX2xpbmVzX3NlbGVjdGlvbiA9IGhmZGNhbi0+SW5zdGFuY2UtPklMUzsNCi0NCi0gICAgLyogQ2hlY2sgaWYgc29tZSBpbnRlcnJ1cHRzIGFyZSBzdGlsbCBlbmFibGVkIG9uIGludGVycnVwdCBsaW5lIDAgKi8NCi0gICAgaWYgKCgoKElUc19lbmFibGVkICYgRkRDQU5fSVRfTElTVF9SWF9GSUZPMCkgIT0gMFUpICYmDQotICAgICAgICAgKCgoSVRzX2xpbmVzX3NlbGVjdGlvbikmRkRDQU5fSVRfR1JPVVBfUlhfRklGTzApID09IDBVKSkgfHwNCi0gICAgICAgICgoKElUc19lbmFibGVkICYgRkRDQU5fSVRfTElTVF9SWF9GSUZPMSkgIT0gMFUpICYmDQotICAgICAgICAgKCgoSVRzX2xpbmVzX3NlbGVjdGlvbikmRkRDQU5fSVRfR1JPVVBfUlhfRklGTzEpID09IDBVKSkgfHwNCi0gICAgICAgICgoKElUc19lbmFibGVkICYgRkRDQU5fSVRfTElTVF9TTVNHKSAhPSAwVSkgJiYNCi0gICAgICAgICAoKChJVHNfbGluZXNfc2VsZWN0aW9uKSZGRENBTl9JVF9HUk9VUF9TTVNHKSA9PSAwVSkpIHx8DQotICAgICAgICAoKChJVHNfZW5hYmxlZCAmIEZEQ0FOX0lUX0xJU1RfVFhfRklGT19FUlJPUikgIT0gMFUpICYmDQotICAgICAgICAgKCgoSVRzX2xpbmVzX3NlbGVjdGlvbikmRkRDQU5fSVRfR1JPVVBfVFhfRklGT19FUlJPUikgPT0gMFUpKSB8fA0KLSAgICAgICAgKCgoSVRzX2VuYWJsZWQgJiBGRENBTl9JVF9MSVNUX01JU0MpICE9IDBVKSAmJg0KLSAgICAgICAgICgoKElUc19saW5lc19zZWxlY3Rpb24pJkZEQ0FOX0lUX0dST1VQX01JU0MpID09IDBVKSkgfHwNCi0gICAgICAgICgoKElUc19lbmFibGVkICYgRkRDQU5fSVRfTElTVF9CSVRfTElORV9FUlJPUikgIT0gMFUpICYmDQotICAgICAgICAgKCgoSVRzX2xpbmVzX3NlbGVjdGlvbikmRkRDQU5fSVRfR1JPVVBfQklUX0xJTkVfRVJST1IpID09IDBVKSkgfHwNCi0gICAgICAgICgoKElUc19lbmFibGVkICYgRkRDQU5fSVRfTElTVF9QUk9UT0NPTF9FUlJPUikgIT0gMFUpICYmDQotICAgICAgICAgKCgoSVRzX2xpbmVzX3NlbGVjdGlvbikmRkRDQU5fSVRfR1JPVVBfUFJPVE9DT0xfRVJST1IpID09IDBVKSkpIHsNCi0gICAgICAvKiBEbyBub3RoaW5nICovDQotICAgIH0gZWxzZSAvKiBubyBtb3JlIGludGVycnVwdHMgZW5hYmxlZCBvbiBpbnRlcnJ1cHQgbGluZSAwICovDQotICAgIHsNCi0gICAgICAvKiBEaXNhYmxlIGludGVycnVwdCBsaW5lIDAgKi8NCi0gICAgICBDTEVBUl9CSVQoaGZkY2FuLT5JbnN0YW5jZS0+SUxFLCBGRENBTl9JTlRFUlJVUFRfTElORTApOw0KLSAgICB9DQotDQotICAgIC8qIENoZWNrIGlmIHNvbWUgaW50ZXJydXB0cyBhcmUgc3RpbGwgZW5hYmxlZCBvbiBpbnRlcnJ1cHQgbGluZSAxICovDQotICAgIGlmICgoKChJVHNfZW5hYmxlZCAmIEZEQ0FOX0lUX0xJU1RfUlhfRklGTzApICE9IDBVKSAmJg0KLSAgICAgICAgICgoKElUc19saW5lc19zZWxlY3Rpb24pJkZEQ0FOX0lUX0dST1VQX1JYX0ZJRk8wKSAhPSAwVSkpIHx8DQotICAgICAgICAoKChJVHNfZW5hYmxlZCAmIEZEQ0FOX0lUX0xJU1RfUlhfRklGTzEpICE9IDBVKSAmJg0KLSAgICAgICAgICgoKElUc19saW5lc19zZWxlY3Rpb24pJkZEQ0FOX0lUX0dST1VQX1JYX0ZJRk8xKSAhPSAwVSkpIHx8DQotICAgICAgICAoKChJVHNfZW5hYmxlZCAmIEZEQ0FOX0lUX0xJU1RfU01TRykgIT0gMFUpICYmDQotICAgICAgICAgKCgoSVRzX2xpbmVzX3NlbGVjdGlvbikmRkRDQU5fSVRfR1JPVVBfU01TRykgIT0gMFUpKSB8fA0KLSAgICAgICAgKCgoSVRzX2VuYWJsZWQgJiBGRENBTl9JVF9MSVNUX1RYX0ZJRk9fRVJST1IpICE9IDBVKSAmJg0KLSAgICAgICAgICgoKElUc19saW5lc19zZWxlY3Rpb24pJkZEQ0FOX0lUX0dST1VQX1RYX0ZJRk9fRVJST1IpICE9IDBVKSkgfHwNCi0gICAgICAgICgoKElUc19lbmFibGVkICYgRkRDQU5fSVRfTElTVF9NSVNDKSAhPSAwVSkgJiYNCi0gICAgICAgICAoKChJVHNfbGluZXNfc2VsZWN0aW9uKSZGRENBTl9JVF9HUk9VUF9NSVNDKSAhPSAwVSkpIHx8DQotICAgICAgICAoKChJVHNfZW5hYmxlZCAmIEZEQ0FOX0lUX0xJU1RfQklUX0xJTkVfRVJST1IpICE9IDBVKSAmJg0KLSAgICAgICAgICgoKElUc19saW5lc19zZWxlY3Rpb24pJkZEQ0FOX0lUX0dST1VQX0JJVF9MSU5FX0VSUk9SKSAhPSAwVSkpIHx8DQotICAgICAgICAoKChJVHNfZW5hYmxlZCAmIEZEQ0FOX0lUX0xJU1RfUFJPVE9DT0xfRVJST1IpICE9IDBVKSAmJg0KLSAgICAgICAgICgoKElUc19saW5lc19zZWxlY3Rpb24pJkZEQ0FOX0lUX0dST1VQX1BST1RPQ09MX0VSUk9SKSAhPSAwVSkpKSB7DQotICAgICAgLyogRG8gbm90aGluZyAqLw0KLSAgICB9IGVsc2UgLyogbm8gbW9yZSBpbnRlcnJ1cHRzIGVuYWJsZWQgb24gaW50ZXJydXB0IGxpbmUgMSAqLw0KLSAgICB7DQotICAgICAgLyogRGlzYWJsZSBpbnRlcnJ1cHQgbGluZSAxICovDQotICAgICAgQ0xFQVJfQklUKGhmZGNhbi0+SW5zdGFuY2UtPklMRSwgRkRDQU5fSU5URVJSVVBUX0xJTkUxKTsNCi0gICAgfQ0KLQ0KLSAgICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovDQotICAgIHJldHVybiBIQUxfT0s7DQotICB9IGVsc2Ugew0KLSAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLw0KLSAgICBoZmRjYW4tPkVycm9yQ29kZSB8PSBIQUxfRkRDQU5fRVJST1JfTk9UX0lOSVRJQUxJWkVEOw0KLQ0KLSAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEhhbmRsZXMgRkRDQU4gaW50ZXJydXB0IHJlcXVlc3QuDQotICogQHBhcmFtICBoZmRjYW4gcG9pbnRlciB0byBhbiBGRENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQotICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBGRENBTi4NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi12b2lkIEhBTF9GRENBTl9JUlFIYW5kbGVyKEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbikgew0KLSAgdWludDMyX3QgVHhFdmVudEZpZm9JVHM7DQotICB1aW50MzJfdCBSeEZpZm8wSVRzOw0KLSAgdWludDMyX3QgUnhGaWZvMUlUczsNCi0gIHVpbnQzMl90IEVycm9yczsNCi0gIHVpbnQzMl90IEVycm9yU3RhdHVzSVRzOw0KLSAgdWludDMyX3QgVHJhbnNtaXR0ZWRCdWZmZXJzOw0KLSAgdWludDMyX3QgQWJvcnRlZEJ1ZmZlcnM7DQotDQotICBUeEV2ZW50Rmlmb0lUcyA9IGhmZGNhbi0+SW5zdGFuY2UtPklSICYgRkRDQU5fVFhfRVZFTlRfRklGT19NQVNLOw0KLSAgVHhFdmVudEZpZm9JVHMgJj0gaGZkY2FuLT5JbnN0YW5jZS0+SUU7DQotICBSeEZpZm8wSVRzID0gaGZkY2FuLT5JbnN0YW5jZS0+SVIgJiBGRENBTl9SWF9GSUZPMF9NQVNLOw0KLSAgUnhGaWZvMElUcyAmPSBoZmRjYW4tPkluc3RhbmNlLT5JRTsNCi0gIFJ4RmlmbzFJVHMgPSBoZmRjYW4tPkluc3RhbmNlLT5JUiAmIEZEQ0FOX1JYX0ZJRk8xX01BU0s7DQotICBSeEZpZm8xSVRzICY9IGhmZGNhbi0+SW5zdGFuY2UtPklFOw0KLSAgRXJyb3JzID0gaGZkY2FuLT5JbnN0YW5jZS0+SVIgJiBGRENBTl9FUlJPUl9NQVNLOw0KLSAgRXJyb3JzICY9IGhmZGNhbi0+SW5zdGFuY2UtPklFOw0KLSAgRXJyb3JTdGF0dXNJVHMgPSBoZmRjYW4tPkluc3RhbmNlLT5JUiAmIEZEQ0FOX0VSUk9SX1NUQVRVU19NQVNLOw0KLSAgRXJyb3JTdGF0dXNJVHMgJj0gaGZkY2FuLT5JbnN0YW5jZS0+SUU7DQotDQotICAvKiBIaWdoIFByaW9yaXR5IE1lc3NhZ2UgaW50ZXJydXB0IG1hbmFnZW1lbnQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0gIGlmIChfX0hBTF9GRENBTl9HRVRfRkxBRyhoZmRjYW4sIEZEQ0FOX0ZMQUdfUlhfSElHSF9QUklPUklUWV9NU0cpICE9IDBVKSB7DQotICAgIGlmIChfX0hBTF9GRENBTl9HRVRfSVRfU09VUkNFKGhmZGNhbiwgRkRDQU5fSVRfUlhfSElHSF9QUklPUklUWV9NU0cpICE9DQotICAgICAgICAwVSkgew0KLSAgICAgIC8qIENsZWFyIHRoZSBIaWdoIFByaW9yaXR5IE1lc3NhZ2UgZmxhZyAqLw0KLSAgICAgIF9fSEFMX0ZEQ0FOX0NMRUFSX0ZMQUcoaGZkY2FuLCBGRENBTl9GTEFHX1JYX0hJR0hfUFJJT1JJVFlfTVNHKTsNCi0NCi0jaWYgVVNFX0hBTF9GRENBTl9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMQ0KLSAgICAgIC8qIENhbGwgcmVnaXN0ZXJlZCBjYWxsYmFjayovDQotICAgICAgaGZkY2FuLT5IaWdoUHJpb3JpdHlNZXNzYWdlQ2FsbGJhY2soaGZkY2FuKTsNCi0jZWxzZQ0KLSAgICAgIC8qIEhpZ2ggUHJpb3JpdHkgTWVzc2FnZSBDYWxsYmFjayAqLw0KLSAgICAgIEhBTF9GRENBTl9IaWdoUHJpb3JpdHlNZXNzYWdlQ2FsbGJhY2soaGZkY2FuKTsNCi0jZW5kaWYgLyogVVNFX0hBTF9GRENBTl9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgLyogVHJhbnNtaXNzaW9uIEFib3J0IGludGVycnVwdCBtYW5hZ2VtZW50ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotICBpZiAoX19IQUxfRkRDQU5fR0VUX0ZMQUcoaGZkY2FuLCBGRENBTl9GTEFHX1RYX0FCT1JUX0NPTVBMRVRFKSAhPSAwVSkgew0KLSAgICBpZiAoX19IQUxfRkRDQU5fR0VUX0lUX1NPVVJDRShoZmRjYW4sIEZEQ0FOX0lUX1RYX0FCT1JUX0NPTVBMRVRFKSAhPSAwVSkgew0KLSAgICAgIC8qIExpc3Qgb2YgYWJvcnRlZCBtb25pdG9yZWQgYnVmZmVycyAqLw0KLSAgICAgIEFib3J0ZWRCdWZmZXJzID0gaGZkY2FuLT5JbnN0YW5jZS0+VFhCQ0Y7DQotICAgICAgQWJvcnRlZEJ1ZmZlcnMgJj0gaGZkY2FuLT5JbnN0YW5jZS0+VFhCQ0lFOw0KLQ0KLSAgICAgIC8qIENsZWFyIHRoZSBUcmFuc21pc3Npb24gQ2FuY2VsbGF0aW9uIGZsYWcgKi8NCi0gICAgICBfX0hBTF9GRENBTl9DTEVBUl9GTEFHKGhmZGNhbiwgRkRDQU5fRkxBR19UWF9BQk9SVF9DT01QTEVURSk7DQotDQotI2lmIFVTRV9IQUxfRkRDQU5fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDENCi0gICAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgY2FsbGJhY2sqLw0KLSAgICAgIGhmZGNhbi0+VHhCdWZmZXJBYm9ydENhbGxiYWNrKGhmZGNhbiwgQWJvcnRlZEJ1ZmZlcnMpOw0KLSNlbHNlDQotICAgICAgLyogVHJhbnNtaXNzaW9uIENhbmNlbGxhdGlvbiBDYWxsYmFjayAqLw0KLSAgICAgIEhBTF9GRENBTl9UeEJ1ZmZlckFib3J0Q2FsbGJhY2soaGZkY2FuLCBBYm9ydGVkQnVmZmVycyk7DQotI2VuZGlmIC8qIFVTRV9IQUxfRkRDQU5fUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotICAgIH0NCi0gIH0NCi0NCi0gIC8qIFR4IGV2ZW50IEZJRk8gaW50ZXJydXB0cyBtYW5hZ2VtZW50ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLSAgaWYgKFR4RXZlbnRGaWZvSVRzICE9IDBVKSB7DQotICAgIC8qIENsZWFyIHRoZSBUeCBFdmVudCBGSUZPIGZsYWdzICovDQotICAgIF9fSEFMX0ZEQ0FOX0NMRUFSX0ZMQUcoaGZkY2FuLCBUeEV2ZW50Rmlmb0lUcyk7DQotDQotI2lmIFVTRV9IQUxfRkRDQU5fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDENCi0gICAgLyogQ2FsbCByZWdpc3RlcmVkIGNhbGxiYWNrKi8NCi0gICAgaGZkY2FuLT5UeEV2ZW50Rmlmb0NhbGxiYWNrKGhmZGNhbiwgVHhFdmVudEZpZm9JVHMpOw0KLSNlbHNlDQotICAgIC8qIFR4IEV2ZW50IEZJRk8gQ2FsbGJhY2sgKi8NCi0gICAgSEFMX0ZEQ0FOX1R4RXZlbnRGaWZvQ2FsbGJhY2soaGZkY2FuLCBUeEV2ZW50Rmlmb0lUcyk7DQotI2VuZGlmIC8qIFVTRV9IQUxfRkRDQU5fUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotICB9DQotDQotICAvKiBSeCBGSUZPIDAgaW50ZXJydXB0cyBtYW5hZ2VtZW50ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0gIGlmIChSeEZpZm8wSVRzICE9IDBVKSB7DQotICAgIC8qIENsZWFyIHRoZSBSeCBGSUZPIDAgZmxhZ3MgKi8NCi0gICAgX19IQUxfRkRDQU5fQ0xFQVJfRkxBRyhoZmRjYW4sIFJ4RmlmbzBJVHMpOw0KLQ0KLSNpZiBVU0VfSEFMX0ZEQ0FOX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxDQotICAgIC8qIENhbGwgcmVnaXN0ZXJlZCBjYWxsYmFjayovDQotICAgIGhmZGNhbi0+UnhGaWZvMENhbGxiYWNrKGhmZGNhbiwgUnhGaWZvMElUcyk7DQotI2Vsc2UNCi0gICAgLyogUnggRklGTyAwIENhbGxiYWNrICovDQotICAgIEhBTF9GRENBTl9SeEZpZm8wQ2FsbGJhY2soaGZkY2FuLCBSeEZpZm8wSVRzKTsNCi0jZW5kaWYgLyogVVNFX0hBTF9GRENBTl9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi0gIH0NCi0NCi0gIC8qIFJ4IEZJRk8gMSBpbnRlcnJ1cHRzIG1hbmFnZW1lbnQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLSAgaWYgKFJ4RmlmbzFJVHMgIT0gMFUpIHsNCi0gICAgLyogQ2xlYXIgdGhlIFJ4IEZJRk8gMSBmbGFncyAqLw0KLSAgICBfX0hBTF9GRENBTl9DTEVBUl9GTEFHKGhmZGNhbiwgUnhGaWZvMUlUcyk7DQotDQotI2lmIFVTRV9IQUxfRkRDQU5fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDENCi0gICAgLyogQ2FsbCByZWdpc3RlcmVkIGNhbGxiYWNrKi8NCi0gICAgaGZkY2FuLT5SeEZpZm8xQ2FsbGJhY2soaGZkY2FuLCBSeEZpZm8xSVRzKTsNCi0jZWxzZQ0KLSAgICAvKiBSeCBGSUZPIDEgQ2FsbGJhY2sgKi8NCi0gICAgSEFMX0ZEQ0FOX1J4RmlmbzFDYWxsYmFjayhoZmRjYW4sIFJ4RmlmbzFJVHMpOw0KLSNlbmRpZiAvKiBVU0VfSEFMX0ZEQ0FOX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLSAgfQ0KLQ0KLSAgLyogVHggRklGTyBlbXB0eSBpbnRlcnJ1cHQgbWFuYWdlbWVudCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotICBpZiAoX19IQUxfRkRDQU5fR0VUX0ZMQUcoaGZkY2FuLCBGRENBTl9GTEFHX1RYX0ZJRk9fRU1QVFkpICE9IDBVKSB7DQotICAgIGlmIChfX0hBTF9GRENBTl9HRVRfSVRfU09VUkNFKGhmZGNhbiwgRkRDQU5fSVRfVFhfRklGT19FTVBUWSkgIT0gMFUpIHsNCi0gICAgICAvKiBDbGVhciB0aGUgVHggRklGTyBlbXB0eSBmbGFnICovDQotICAgICAgX19IQUxfRkRDQU5fQ0xFQVJfRkxBRyhoZmRjYW4sIEZEQ0FOX0ZMQUdfVFhfRklGT19FTVBUWSk7DQotDQotI2lmIFVTRV9IQUxfRkRDQU5fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDENCi0gICAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgY2FsbGJhY2sqLw0KLSAgICAgIGhmZGNhbi0+VHhGaWZvRW1wdHlDYWxsYmFjayhoZmRjYW4pOw0KLSNlbHNlDQotICAgICAgLyogVHggRklGTyBlbXB0eSBDYWxsYmFjayAqLw0KLSAgICAgIEhBTF9GRENBTl9UeEZpZm9FbXB0eUNhbGxiYWNrKGhmZGNhbik7DQotI2VuZGlmIC8qIFVTRV9IQUxfRkRDQU5fUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotICAgIH0NCi0gIH0NCi0NCi0gIC8qIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBpbnRlcnJ1cHQgbWFuYWdlbWVudCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLSAgaWYgKF9fSEFMX0ZEQ0FOX0dFVF9GTEFHKGhmZGNhbiwgRkRDQU5fRkxBR19UWF9DT01QTEVURSkgIT0gMFUpIHsNCi0gICAgaWYgKF9fSEFMX0ZEQ0FOX0dFVF9JVF9TT1VSQ0UoaGZkY2FuLCBGRENBTl9JVF9UWF9DT01QTEVURSkgIT0gMFUpIHsNCi0gICAgICAvKiBMaXN0IG9mIHRyYW5zbWl0dGVkIG1vbml0b3JlZCBidWZmZXJzICovDQotICAgICAgVHJhbnNtaXR0ZWRCdWZmZXJzID0gaGZkY2FuLT5JbnN0YW5jZS0+VFhCVE87DQotICAgICAgVHJhbnNtaXR0ZWRCdWZmZXJzICY9IGhmZGNhbi0+SW5zdGFuY2UtPlRYQlRJRTsNCi0NCi0gICAgICAvKiBDbGVhciB0aGUgVHJhbnNtaXNzaW9uIENvbXBsZXRlIGZsYWcgKi8NCi0gICAgICBfX0hBTF9GRENBTl9DTEVBUl9GTEFHKGhmZGNhbiwgRkRDQU5fRkxBR19UWF9DT01QTEVURSk7DQotDQotI2lmIFVTRV9IQUxfRkRDQU5fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDENCi0gICAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgY2FsbGJhY2sqLw0KLSAgICAgIGhmZGNhbi0+VHhCdWZmZXJDb21wbGV0ZUNhbGxiYWNrKGhmZGNhbiwgVHJhbnNtaXR0ZWRCdWZmZXJzKTsNCi0jZWxzZQ0KLSAgICAgIC8qIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBDYWxsYmFjayAqLw0KLSAgICAgIEhBTF9GRENBTl9UeEJ1ZmZlckNvbXBsZXRlQ2FsbGJhY2soaGZkY2FuLCBUcmFuc21pdHRlZEJ1ZmZlcnMpOw0KLSNlbmRpZiAvKiBVU0VfSEFMX0ZEQ0FOX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLSAgICB9DQotICB9DQotDQotICAvKiBUaW1lc3RhbXAgV3JhcGFyb3VuZCBpbnRlcnJ1cHQgbWFuYWdlbWVudCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0gIGlmIChfX0hBTF9GRENBTl9HRVRfRkxBRyhoZmRjYW4sIEZEQ0FOX0ZMQUdfVElNRVNUQU1QX1dSQVBBUk9VTkQpICE9IDBVKSB7DQotICAgIGlmIChfX0hBTF9GRENBTl9HRVRfSVRfU09VUkNFKGhmZGNhbiwgRkRDQU5fSVRfVElNRVNUQU1QX1dSQVBBUk9VTkQpICE9DQotICAgICAgICAwVSkgew0KLSAgICAgIC8qIENsZWFyIHRoZSBUaW1lc3RhbXAgV3JhcGFyb3VuZCBmbGFnICovDQotICAgICAgX19IQUxfRkRDQU5fQ0xFQVJfRkxBRyhoZmRjYW4sIEZEQ0FOX0ZMQUdfVElNRVNUQU1QX1dSQVBBUk9VTkQpOw0KLQ0KLSNpZiBVU0VfSEFMX0ZEQ0FOX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxDQotICAgICAgLyogQ2FsbCByZWdpc3RlcmVkIGNhbGxiYWNrKi8NCi0gICAgICBoZmRjYW4tPlRpbWVzdGFtcFdyYXBhcm91bmRDYWxsYmFjayhoZmRjYW4pOw0KLSNlbHNlDQotICAgICAgLyogVGltZXN0YW1wIFdyYXBhcm91bmQgQ2FsbGJhY2sgKi8NCi0gICAgICBIQUxfRkRDQU5fVGltZXN0YW1wV3JhcGFyb3VuZENhbGxiYWNrKGhmZGNhbik7DQotI2VuZGlmIC8qIFVTRV9IQUxfRkRDQU5fUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotICAgIH0NCi0gIH0NCi0NCi0gIC8qIFRpbWVvdXQgT2NjdXJyZWQgaW50ZXJydXB0IG1hbmFnZW1lbnQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLSAgaWYgKF9fSEFMX0ZEQ0FOX0dFVF9GTEFHKGhmZGNhbiwgRkRDQU5fRkxBR19USU1FT1VUX09DQ1VSUkVEKSAhPSAwVSkgew0KLSAgICBpZiAoX19IQUxfRkRDQU5fR0VUX0lUX1NPVVJDRShoZmRjYW4sIEZEQ0FOX0lUX1RJTUVPVVRfT0NDVVJSRUQpICE9IDBVKSB7DQotICAgICAgLyogQ2xlYXIgdGhlIFRpbWVvdXQgT2NjdXJyZWQgZmxhZyAqLw0KLSAgICAgIF9fSEFMX0ZEQ0FOX0NMRUFSX0ZMQUcoaGZkY2FuLCBGRENBTl9GTEFHX1RJTUVPVVRfT0NDVVJSRUQpOw0KLQ0KLSNpZiBVU0VfSEFMX0ZEQ0FOX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxDQotICAgICAgLyogQ2FsbCByZWdpc3RlcmVkIGNhbGxiYWNrKi8NCi0gICAgICBoZmRjYW4tPlRpbWVvdXRPY2N1cnJlZENhbGxiYWNrKGhmZGNhbik7DQotI2Vsc2UNCi0gICAgICAvKiBUaW1lb3V0IE9jY3VycmVkIENhbGxiYWNrICovDQotICAgICAgSEFMX0ZEQ0FOX1RpbWVvdXRPY2N1cnJlZENhbGxiYWNrKGhmZGNhbik7DQotI2VuZGlmIC8qIFVTRV9IQUxfRkRDQU5fUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotICAgIH0NCi0gIH0NCi0NCi0gIC8qIE1lc3NhZ2UgUkFNIGFjY2VzcyBmYWlsdXJlIGludGVycnVwdCBtYW5hZ2VtZW50ICoqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLSAgaWYgKF9fSEFMX0ZEQ0FOX0dFVF9GTEFHKGhmZGNhbiwgRkRDQU5fRkxBR19SQU1fQUNDRVNTX0ZBSUxVUkUpICE9IDBVKSB7DQotICAgIGlmIChfX0hBTF9GRENBTl9HRVRfSVRfU09VUkNFKGhmZGNhbiwgRkRDQU5fSVRfUkFNX0FDQ0VTU19GQUlMVVJFKSAhPSAwVSkgew0KLSAgICAgIC8qIENsZWFyIHRoZSBNZXNzYWdlIFJBTSBhY2Nlc3MgZmFpbHVyZSBmbGFnICovDQotICAgICAgX19IQUxfRkRDQU5fQ0xFQVJfRkxBRyhoZmRjYW4sIEZEQ0FOX0ZMQUdfUkFNX0FDQ0VTU19GQUlMVVJFKTsNCi0NCi0gICAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLw0KLSAgICAgIGhmZGNhbi0+RXJyb3JDb2RlIHw9IEhBTF9GRENBTl9FUlJPUl9SQU1fQUNDRVNTOw0KLSAgICB9DQotICB9DQotDQotICAvKiBFcnJvciBTdGF0dXMgaW50ZXJydXB0cyBtYW5hZ2VtZW50ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0gIGlmIChFcnJvclN0YXR1c0lUcyAhPSAwVSkgew0KLSAgICAvKiBDbGVhciB0aGUgRXJyb3IgZmxhZ3MgKi8NCi0gICAgX19IQUxfRkRDQU5fQ0xFQVJfRkxBRyhoZmRjYW4sIEVycm9yU3RhdHVzSVRzKTsNCi0NCi0jaWYgVVNFX0hBTF9GRENBTl9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMQ0KLSAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgY2FsbGJhY2sqLw0KLSAgICBoZmRjYW4tPkVycm9yU3RhdHVzQ2FsbGJhY2soaGZkY2FuLCBFcnJvclN0YXR1c0lUcyk7DQotI2Vsc2UNCi0gICAgLyogRXJyb3IgU3RhdHVzIENhbGxiYWNrICovDQotICAgIEhBTF9GRENBTl9FcnJvclN0YXR1c0NhbGxiYWNrKGhmZGNhbiwgRXJyb3JTdGF0dXNJVHMpOw0KLSNlbmRpZiAvKiBVU0VfSEFMX0ZEQ0FOX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLSAgfQ0KLQ0KLSAgLyogRXJyb3IgaW50ZXJydXB0cyBtYW5hZ2VtZW50ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotICBpZiAoRXJyb3JzICE9IDBVKSB7DQotICAgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyAqLw0KLSAgICBfX0hBTF9GRENBTl9DTEVBUl9GTEFHKGhmZGNhbiwgRXJyb3JzKTsNCi0NCi0gICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8NCi0gICAgaGZkY2FuLT5FcnJvckNvZGUgfD0gRXJyb3JzOw0KLSAgfQ0KLQ0KLSAgaWYgKGhmZGNhbi0+RXJyb3JDb2RlICE9IEhBTF9GRENBTl9FUlJPUl9OT05FKSB7DQotI2lmIFVTRV9IQUxfRkRDQU5fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDENCi0gICAgLyogQ2FsbCByZWdpc3RlcmVkIGNhbGxiYWNrKi8NCi0gICAgaGZkY2FuLT5FcnJvckNhbGxiYWNrKGhmZGNhbik7DQotI2Vsc2UNCi0gICAgLyogRXJyb3IgQ2FsbGJhY2sgKi8NCi0gICAgSEFMX0ZEQ0FOX0Vycm9yQ2FsbGJhY2soaGZkY2FuKTsNCi0jZW5kaWYgLyogVVNFX0hBTF9GRENBTl9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi0gIH0NCi19DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEZEQ0FOX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDUgQ2FsbGJhY2sgZnVuY3Rpb25zDQotICAqICBAYnJpZWYgICBGRENBTiBDYWxsYmFjayBmdW5jdGlvbnMNCi0gICoNCi1AdmVyYmF0aW0NCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgQ2FsbGJhY2sgZnVuY3Rpb25zICMjIyMjDQotICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgWy4uXQ0KLSAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBjYWxsYmFjayBmdW5jdGlvbnM6DQotICAgICAgKCspIEhBTF9GRENBTl9UeEV2ZW50Rmlmb0NhbGxiYWNrDQotICAgICAgKCspIEhBTF9GRENBTl9SeEZpZm8wQ2FsbGJhY2sNCi0gICAgICAoKykgSEFMX0ZEQ0FOX1J4RmlmbzFDYWxsYmFjaw0KLSAgICAgICgrKSBIQUxfRkRDQU5fVHhGaWZvRW1wdHlDYWxsYmFjaw0KLSAgICAgICgrKSBIQUxfRkRDQU5fVHhCdWZmZXJDb21wbGV0ZUNhbGxiYWNrDQotICAgICAgKCspIEhBTF9GRENBTl9UeEJ1ZmZlckFib3J0Q2FsbGJhY2sNCi0gICAgICAoKykgSEFMX0ZEQ0FOX0hpZ2hQcmlvcml0eU1lc3NhZ2VDYWxsYmFjaw0KLSAgICAgICgrKSBIQUxfRkRDQU5fVGltZXN0YW1wV3JhcGFyb3VuZENhbGxiYWNrDQotICAgICAgKCspIEhBTF9GRENBTl9UaW1lb3V0T2NjdXJyZWRDYWxsYmFjaw0KLSAgICAgICgrKSBIQUxfRkRDQU5fRXJyb3JDYWxsYmFjaw0KLSAgICAgICgrKSBIQUxfRkRDQU5fRXJyb3JTdGF0dXNDYWxsYmFjaw0KLQ0KLUBlbmR2ZXJiYXRpbQ0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFR4IEV2ZW50IGNhbGxiYWNrLg0KLSAqIEBwYXJhbSAgaGZkY2FuIHBvaW50ZXIgdG8gYW4gRkRDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KLSAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRkRDQU4uDQotICogQHBhcmFtICBUeEV2ZW50Rmlmb0lUcyBpbmRpY2F0ZXMgd2hpY2ggVHggRXZlbnQgRklGTyBpbnRlcnJ1cHRzIGFyZQ0KLSAqIHNpZ25hbGxlZC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiBAYXJnDQotICogRkRDQU5fVHhfRXZlbnRfRmlmb19JbnRlcnJ1cHRzLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fd2VhayB2b2lkIEhBTF9GRENBTl9UeEV2ZW50Rmlmb0NhbGxiYWNrKEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUeEV2ZW50Rmlmb0lUcykgew0KLSAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLw0KLSAgVU5VU0VEKGhmZGNhbik7DQotICBVTlVTRUQoVHhFdmVudEZpZm9JVHMpOw0KLQ0KLSAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLA0KLSAgICAgICAgICAgIHRoZSBIQUxfRkRDQU5fVHhFdmVudEZpZm9DYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlcg0KLSAgICAgZmlsZQ0KLSAgICovDQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUnggRklGTyAwIGNhbGxiYWNrLg0KLSAqIEBwYXJhbSAgaGZkY2FuIHBvaW50ZXIgdG8gYW4gRkRDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KLSAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRkRDQU4uDQotICogQHBhcmFtICBSeEZpZm8wSVRzIGluZGljYXRlcyB3aGljaCBSeCBGSUZPIDAgaW50ZXJydXB0cyBhcmUgc2lnbmFsbGVkLg0KLSAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiBAYXJnDQotICogRkRDQU5fUnhfRmlmbzBfSW50ZXJydXB0cy4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX3dlYWsgdm9pZCBIQUxfRkRDQU5fUnhGaWZvMENhbGxiYWNrKEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFJ4RmlmbzBJVHMpIHsNCi0gIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8NCi0gIFVOVVNFRChoZmRjYW4pOw0KLSAgVU5VU0VEKFJ4RmlmbzBJVHMpOw0KLQ0KLSAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLA0KLSAgICAgICAgICAgIHRoZSBIQUxfRkRDQU5fUnhGaWZvMENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUNCi0gICAqLw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJ4IEZJRk8gMSBjYWxsYmFjay4NCi0gKiBAcGFyYW0gIGhmZGNhbiBwb2ludGVyIHRvIGFuIEZEQ0FOX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCi0gKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZEQ0FOLg0KLSAqIEBwYXJhbSAgUnhGaWZvMUlUcyBpbmRpY2F0ZXMgd2hpY2ggUnggRklGTyAxIGludGVycnVwdHMgYXJlIHNpZ25hbGxlZC4NCi0gKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgQGFyZw0KLSAqIEZEQ0FOX1J4X0ZpZm8xX0ludGVycnVwdHMuDQotICogQHJldHZhbCBOb25lDQotICovDQotX193ZWFrIHZvaWQgSEFMX0ZEQ0FOX1J4RmlmbzFDYWxsYmFjayhGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBSeEZpZm8xSVRzKSB7DQotICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovDQotICBVTlVTRUQoaGZkY2FuKTsNCi0gIFVOVVNFRChSeEZpZm8xSVRzKTsNCi0NCi0gIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwNCi0gICAgICAgICAgICB0aGUgSEFMX0ZEQ0FOX1J4RmlmbzFDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlDQotICAgKi8NCi19DQotDQotLyoqDQotICogQGJyaWVmICBUeCBGSUZPIEVtcHR5IGNhbGxiYWNrLg0KLSAqIEBwYXJhbSAgaGZkY2FuIHBvaW50ZXIgdG8gYW4gRkRDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KLSAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRkRDQU4uDQotICogQHJldHZhbCBOb25lDQotICovDQotX193ZWFrIHZvaWQgSEFMX0ZEQ0FOX1R4Rmlmb0VtcHR5Q2FsbGJhY2soRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuKSB7DQotICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovDQotICBVTlVTRUQoaGZkY2FuKTsNCi0NCi0gIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwNCi0gICAgICAgICAgICB0aGUgSEFMX0ZEQ0FOX1R4Rmlmb0VtcHR5Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXINCi0gICAgIGZpbGUNCi0gICAqLw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBjYWxsYmFjay4NCi0gKiBAcGFyYW0gIGhmZGNhbiBwb2ludGVyIHRvIGFuIEZEQ0FOX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCi0gKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZEQ0FOLg0KLSAqIEBwYXJhbSAgQnVmZmVySW5kZXhlcyBJbmRleGVzIG9mIHRoZSB0cmFuc21pdHRlZCBidWZmZXJzLg0KLSAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiBAYXJnIEZEQ0FOX1R4X2xvY2F0aW9uLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fd2VhayB2b2lkIEhBTF9GRENBTl9UeEJ1ZmZlckNvbXBsZXRlQ2FsbGJhY2soRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQnVmZmVySW5kZXhlcykgew0KLSAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLw0KLSAgVU5VU0VEKGhmZGNhbik7DQotICBVTlVTRUQoQnVmZmVySW5kZXhlcyk7DQotDQotICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsDQotICAgICAgICAgICAgdGhlIEhBTF9GRENBTl9UeEJ1ZmZlckNvbXBsZXRlQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlDQotICAgICB1c2VyIGZpbGUNCi0gICAqLw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFRyYW5zbWlzc2lvbiBDYW5jZWxsYXRpb24gY2FsbGJhY2suDQotICogQHBhcmFtICBoZmRjYW4gcG9pbnRlciB0byBhbiBGRENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQotICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBGRENBTi4NCi0gKiBAcGFyYW0gIEJ1ZmZlckluZGV4ZXMgSW5kZXhlcyBvZiB0aGUgYWJvcnRlZCBidWZmZXJzLg0KLSAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiBAYXJnIEZEQ0FOX1R4X2xvY2F0aW9uLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fd2VhayB2b2lkIEhBTF9GRENBTl9UeEJ1ZmZlckFib3J0Q2FsbGJhY2soRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQnVmZmVySW5kZXhlcykgew0KLSAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLw0KLSAgVU5VU0VEKGhmZGNhbik7DQotICBVTlVTRUQoQnVmZmVySW5kZXhlcyk7DQotDQotICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsDQotICAgICAgICAgICAgdGhlIEhBTF9GRENBTl9UeEJ1ZmZlckFib3J0Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXINCi0gICAgIGZpbGUNCi0gICAqLw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFRpbWVzdGFtcCBXcmFwYXJvdW5kIGNhbGxiYWNrLg0KLSAqIEBwYXJhbSAgaGZkY2FuIHBvaW50ZXIgdG8gYW4gRkRDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KLSAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRkRDQU4uDQotICogQHJldHZhbCBOb25lDQotICovDQotX193ZWFrIHZvaWQgSEFMX0ZEQ0FOX1RpbWVzdGFtcFdyYXBhcm91bmRDYWxsYmFjayhGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pIHsNCi0gIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8NCi0gIFVOVVNFRChoZmRjYW4pOw0KLQ0KLSAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLA0KLSAgICAgICAgICAgIHRoZSBIQUxfRkRDQU5fVGltZXN0YW1wV3JhcGFyb3VuZENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluDQotICAgICB0aGUgdXNlciBmaWxlDQotICAgKi8NCi19DQotDQotLyoqDQotICogQGJyaWVmICBUaW1lb3V0IE9jY3VycmVkIGNhbGxiYWNrLg0KLSAqIEBwYXJhbSAgaGZkY2FuIHBvaW50ZXIgdG8gYW4gRkRDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KLSAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRkRDQU4uDQotICogQHJldHZhbCBOb25lDQotICovDQotX193ZWFrIHZvaWQgSEFMX0ZEQ0FOX1RpbWVvdXRPY2N1cnJlZENhbGxiYWNrKEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbikgew0KLSAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLw0KLSAgVU5VU0VEKGhmZGNhbik7DQotDQotICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsDQotICAgICAgICAgICAgdGhlIEhBTF9GRENBTl9UaW1lb3V0T2NjdXJyZWRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUNCi0gICAgIHVzZXIgZmlsZQ0KLSAgICovDQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSGlnaCBQcmlvcml0eSBNZXNzYWdlIGNhbGxiYWNrLg0KLSAqIEBwYXJhbSAgaGZkY2FuIHBvaW50ZXIgdG8gYW4gRkRDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KLSAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRkRDQU4uDQotICogQHJldHZhbCBOb25lDQotICovDQotX193ZWFrIHZvaWQgSEFMX0ZEQ0FOX0hpZ2hQcmlvcml0eU1lc3NhZ2VDYWxsYmFjayhGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pIHsNCi0gIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8NCi0gIFVOVVNFRChoZmRjYW4pOw0KLQ0KLSAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLA0KLSAgICAgICAgICAgIHRoZSBIQUxfRkRDQU5fSGlnaFByaW9yaXR5TWVzc2FnZUNhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluDQotICAgICB0aGUgdXNlciBmaWxlDQotICAgKi8NCi19DQotDQotLyoqDQotICogQGJyaWVmICBFcnJvciBjYWxsYmFjay4NCi0gKiBAcGFyYW0gIGhmZGNhbiBwb2ludGVyIHRvIGFuIEZEQ0FOX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCi0gKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZEQ0FOLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fd2VhayB2b2lkIEhBTF9GRENBTl9FcnJvckNhbGxiYWNrKEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbikgew0KLSAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLw0KLSAgVU5VU0VEKGhmZGNhbik7DQotDQotICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsDQotICAgICAgICAgICAgdGhlIEhBTF9GRENBTl9FcnJvckNhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUNCi0gICAqLw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVycm9yIHN0YXR1cyBjYWxsYmFjay4NCi0gKiBAcGFyYW0gIGhmZGNhbiBwb2ludGVyIHRvIGFuIEZEQ0FOX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCi0gKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZEQ0FOLg0KLSAqIEBwYXJhbSAgRXJyb3JTdGF0dXNJVHMgaW5kaWNhdGVzIHdoaWNoIEVycm9yIFN0YXR1cyBpbnRlcnJ1cHRzIGFyZSBzaWduYWxlZC4NCi0gKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgQGFyZw0KLSAqIEZEQ0FOX0Vycm9yX1N0YXR1c19JbnRlcnJ1cHRzLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fd2VhayB2b2lkIEhBTF9GRENBTl9FcnJvclN0YXR1c0NhbGxiYWNrKEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBFcnJvclN0YXR1c0lUcykgew0KLSAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLw0KLSAgVU5VU0VEKGhmZGNhbik7DQotICBVTlVTRUQoRXJyb3JTdGF0dXNJVHMpOw0KLQ0KLSAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLA0KLSAgICAgICAgICAgIHRoZSBIQUxfRkRDQU5fRXJyb3JTdGF0dXNDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlcg0KLSAgICAgZmlsZQ0KLSAgICovDQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBGRENBTl9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA2IFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zDQotICAqICBAYnJpZWYgICBGRENBTiBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucw0KLSAgKg0KLUB2ZXJiYXRpbQ0KLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zICMjIyMjDQotICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgWy4uXQ0KLSAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvIDoNCi0gICAgICAoKykgSEFMX0ZEQ0FOX0dldFN0YXRlKCkgIDogUmV0dXJuIHRoZSBGRENBTiBzdGF0ZS4NCi0gICAgICAoKykgSEFMX0ZEQ0FOX0dldEVycm9yKCkgIDogUmV0dXJuIHRoZSBGRENBTiBlcnJvciBjb2RlIGlmIGFueS4NCi0NCi1AZW5kdmVyYmF0aW0NCi0gICogQHsNCi0gICovDQotLyoqDQotICogQGJyaWVmICBSZXR1cm4gdGhlIEZEQ0FOIHN0YXRlDQotICogQHBhcmFtICBoZmRjYW4gcG9pbnRlciB0byBhbiBGRENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQotICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBGRENBTi4NCi0gKiBAcmV0dmFsIEhBTCBzdGF0ZQ0KLSAqLw0KLUhBTF9GRENBTl9TdGF0ZVR5cGVEZWYgSEFMX0ZEQ0FOX0dldFN0YXRlKEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbikgew0KLSAgLyogUmV0dXJuIEZEQ0FOIHN0YXRlICovDQotICByZXR1cm4gaGZkY2FuLT5TdGF0ZTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBSZXR1cm4gdGhlIEZEQ0FOIGVycm9yIGNvZGUNCi0gKiBAcGFyYW0gIGhmZGNhbiBwb2ludGVyIHRvIGFuIEZEQ0FOX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCi0gKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZEQ0FOLg0KLSAqIEByZXR2YWwgRkRDQU4gRXJyb3IgQ29kZQ0KLSAqLw0KLXVpbnQzMl90IEhBTF9GRENBTl9HZXRFcnJvcihGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pIHsNCi0gIC8qIFJldHVybiBGRENBTiBlcnJvciBjb2RlICovDQotICByZXR1cm4gaGZkY2FuLT5FcnJvckNvZGU7DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEZEQ0FOX1ByaXZhdGVfRnVuY3Rpb25zIEZEQ0FOIFByaXZhdGUgRnVuY3Rpb25zDQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENhbGN1bGF0ZSBlYWNoIFJBTSBibG9jayBzdGFydCBhZGRyZXNzIGFuZCBzaXplDQotICogQHBhcmFtICBoZmRjYW4gcG9pbnRlciB0byBhbiBGRENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQotICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBGRENBTi4NCi0gKiBAcmV0dmFsIG5vbmUNCi0gKi8NCi1zdGF0aWMgdm9pZCBGRENBTl9DYWxjdWx0YXRlUmFtQmxvY2tBZGRyZXNzZXMoRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuKSB7DQotICB1aW50MzJfdCBSQU1jb3VudGVyOw0KLSAgdWludDMyX3QgU3JhbUNhbkluc3RhbmNlQmFzZSA9IFNSQU1DQU5fQkFTRTsNCi0jaWYgZGVmaW5lZChGRENBTjIpDQotDQotICBpZiAoaGZkY2FuLT5JbnN0YW5jZSA9PSBGRENBTjIpIHsNCi0gICAgU3JhbUNhbkluc3RhbmNlQmFzZSArPSBTUkFNQ0FOX1NJWkU7DQotICB9DQotI2VuZGlmIC8qIEZEQ0FOMiAqLw0KLSNpZiBkZWZpbmVkKEZEQ0FOMykNCi0gIGlmIChoZmRjYW4tPkluc3RhbmNlID09IEZEQ0FOMykgew0KLSAgICBTcmFtQ2FuSW5zdGFuY2VCYXNlICs9IFNSQU1DQU5fU0laRSAqIDJVOw0KLSAgfQ0KLSNlbmRpZiAvKiBGRENBTjMgKi8NCi0NCi0gIC8qIFN0YW5kYXJkIGZpbHRlciBsaXN0IHN0YXJ0IGFkZHJlc3MgKi8NCi0gIGhmZGNhbi0+bXNnUmFtLlN0YW5kYXJkRmlsdGVyU0EgPSBTcmFtQ2FuSW5zdGFuY2VCYXNlICsgU1JBTUNBTl9GTFNTQTsNCi0NCi0gIC8qIFN0YW5kYXJkIGZpbHRlciBlbGVtZW50cyBudW1iZXIgKi8NCi0gIE1PRElGWV9SRUcoaGZkY2FuLT5JbnN0YW5jZS0+UlhHRkMsIEZEQ0FOX1JYR0ZDX0xTUywNCi0gICAgICAgICAgICAgKGhmZGNhbi0+SW5pdC5TdGRGaWx0ZXJzTmJyIDw8IEZEQ0FOX1JYR0ZDX0xTU19Qb3MpKTsNCi0NCi0gIC8qIEV4dGVuZGVkIGZpbHRlciBsaXN0IHN0YXJ0IGFkZHJlc3MgKi8NCi0gIGhmZGNhbi0+bXNnUmFtLkV4dGVuZGVkRmlsdGVyU0EgPSBTcmFtQ2FuSW5zdGFuY2VCYXNlICsgU1JBTUNBTl9GTEVTQTsNCi0NCi0gIC8qIEV4dGVuZGVkIGZpbHRlciBlbGVtZW50cyBudW1iZXIgKi8NCi0gIE1PRElGWV9SRUcoaGZkY2FuLT5JbnN0YW5jZS0+UlhHRkMsIEZEQ0FOX1JYR0ZDX0xTRSwNCi0gICAgICAgICAgICAgKGhmZGNhbi0+SW5pdC5FeHRGaWx0ZXJzTmJyIDw8IEZEQ0FOX1JYR0ZDX0xTRV9Qb3MpKTsNCi0NCi0gIC8qIFJ4IEZJRk8gMCBzdGFydCBhZGRyZXNzICovDQotICBoZmRjYW4tPm1zZ1JhbS5SeEZJRk8wU0EgPSBTcmFtQ2FuSW5zdGFuY2VCYXNlICsgU1JBTUNBTl9SRjBTQTsNCi0NCi0gIC8qIFJ4IEZJRk8gMSBzdGFydCBhZGRyZXNzICovDQotICBoZmRjYW4tPm1zZ1JhbS5SeEZJRk8xU0EgPSBTcmFtQ2FuSW5zdGFuY2VCYXNlICsgU1JBTUNBTl9SRjFTQTsNCi0NCi0gIC8qIFR4IGV2ZW50IEZJRk8gc3RhcnQgYWRkcmVzcyAqLw0KLSAgaGZkY2FuLT5tc2dSYW0uVHhFdmVudEZJRk9TQSA9IFNyYW1DYW5JbnN0YW5jZUJhc2UgKyBTUkFNQ0FOX1RFRlNBOw0KLQ0KLSAgLyogVHggRklGTy9xdWV1ZSBzdGFydCBhZGRyZXNzICovDQotICBoZmRjYW4tPm1zZ1JhbS5UeEZJRk9RU0EgPSBTcmFtQ2FuSW5zdGFuY2VCYXNlICsgU1JBTUNBTl9URlFTQTsNCi0NCi0gIC8qIEZsdXNoIHRoZSBhbGxvY2F0ZWQgTWVzc2FnZSBSQU0gYXJlYSAqLw0KLSAgZm9yIChSQU1jb3VudGVyID0gU3JhbUNhbkluc3RhbmNlQmFzZTsNCi0gICAgICAgUkFNY291bnRlciA8IChTcmFtQ2FuSW5zdGFuY2VCYXNlICsgU1JBTUNBTl9TSVpFKTsgUkFNY291bnRlciArPSA0VSkgew0KLSAgICAqKHVpbnQzMl90ICopKFJBTWNvdW50ZXIpID0gMHgwMDAwMDAwMFU7DQotICB9DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ29weSBUeCBtZXNzYWdlIHRvIHRoZSBtZXNzYWdlIFJBTS4NCi0gKiBAcGFyYW0gIGhmZGNhbiBwb2ludGVyIHRvIGFuIEZEQ0FOX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCi0gKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZEQ0FOLg0KLSAqIEBwYXJhbSAgcFR4SGVhZGVyIHBvaW50ZXIgdG8gYSBGRENBTl9UeEhlYWRlclR5cGVEZWYgc3RydWN0dXJlLg0KLSAqIEBwYXJhbSAgcFR4RGF0YSBwb2ludGVyIHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIHBheWxvYWQgb2YgdGhlIFR4IGZyYW1lLg0KLSAqIEBwYXJhbSAgQnVmZmVySW5kZXggaW5kZXggb2YgdGhlIGJ1ZmZlciB0byBiZSBjb25maWd1cmVkLg0KLSAqIEByZXR2YWwgbm9uZQ0KLSAqLw0KLXN0YXRpYyB2b2lkIEZEQ0FOX0NvcHlNZXNzYWdlVG9SQU0oRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRDQU5fVHhIZWFkZXJUeXBlRGVmICpwVHhIZWFkZXIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwVHhEYXRhLCB1aW50MzJfdCBCdWZmZXJJbmRleCkgew0KLSAgdWludDMyX3QgVHhFbGVtZW50VzE7DQotICB1aW50MzJfdCBUeEVsZW1lbnRXMjsNCi0gIHVpbnQzMl90ICpUeEFkZHJlc3M7DQotICB1aW50MzJfdCBCeXRlQ291bnRlcjsNCi0NCi0gIC8qIEJ1aWxkIGZpcnN0IHdvcmQgb2YgVHggaGVhZGVyIGVsZW1lbnQgKi8NCi0gIGlmIChwVHhIZWFkZXItPklkVHlwZSA9PSBGRENBTl9TVEFOREFSRF9JRCkgew0KLSAgICBUeEVsZW1lbnRXMSA9IChwVHhIZWFkZXItPkVycm9yU3RhdGVJbmRpY2F0b3IgfCBGRENBTl9TVEFOREFSRF9JRCB8DQotICAgICAgICAgICAgICAgICAgIHBUeEhlYWRlci0+VHhGcmFtZVR5cGUgfCAocFR4SGVhZGVyLT5JZGVudGlmaWVyIDw8IDE4VSkpOw0KLSAgfSBlbHNlIC8qIHBUeEhlYWRlci0+SWRUeXBlID09IEZEQ0FOX0VYVEVOREVEX0lEICovDQotICB7DQotICAgIFR4RWxlbWVudFcxID0gKHBUeEhlYWRlci0+RXJyb3JTdGF0ZUluZGljYXRvciB8IEZEQ0FOX0VYVEVOREVEX0lEIHwNCi0gICAgICAgICAgICAgICAgICAgcFR4SGVhZGVyLT5UeEZyYW1lVHlwZSB8IHBUeEhlYWRlci0+SWRlbnRpZmllcik7DQotICB9DQotDQotICAvKiBCdWlsZCBzZWNvbmQgd29yZCBvZiBUeCBoZWFkZXIgZWxlbWVudCAqLw0KLSAgVHhFbGVtZW50VzIgPQ0KLSAgICAgICgocFR4SGVhZGVyLT5NZXNzYWdlTWFya2VyIDw8IDI0VSkgfCBwVHhIZWFkZXItPlR4RXZlbnRGaWZvQ29udHJvbCB8DQotICAgICAgIHBUeEhlYWRlci0+RkRGb3JtYXQgfCBwVHhIZWFkZXItPkJpdFJhdGVTd2l0Y2ggfCBwVHhIZWFkZXItPkRhdGFMZW5ndGgpOw0KLQ0KLSAgLyogQ2FsY3VsYXRlIFR4IGVsZW1lbnQgYWRkcmVzcyAqLw0KLSAgVHhBZGRyZXNzID0NCi0gICAgICAodWludDMyX3QgKikoaGZkY2FuLT5tc2dSYW0uVHhGSUZPUVNBICsgKEJ1ZmZlckluZGV4ICogU1JBTUNBTl9URlFfU0laRSkpOw0KLQ0KLSAgLyogV3JpdGUgVHggZWxlbWVudCBoZWFkZXIgdG8gdGhlIG1lc3NhZ2UgUkFNICovDQotICAqVHhBZGRyZXNzID0gVHhFbGVtZW50VzE7DQotICBUeEFkZHJlc3MrKzsNCi0gICpUeEFkZHJlc3MgPSBUeEVsZW1lbnRXMjsNCi0gIFR4QWRkcmVzcysrOw0KLQ0KLSAgLyogV3JpdGUgVHggcGF5bG9hZCB0byB0aGUgbWVzc2FnZSBSQU0gKi8NCi0gIGZvciAoQnl0ZUNvdW50ZXIgPSAwOyBCeXRlQ291bnRlciA8IERMQ3RvQnl0ZXNbcFR4SGVhZGVyLT5EYXRhTGVuZ3RoID4+IDE2VV07DQotICAgICAgIEJ5dGVDb3VudGVyICs9IDRVKSB7DQotICAgICpUeEFkZHJlc3MgPSAoKCh1aW50MzJfdClwVHhEYXRhW0J5dGVDb3VudGVyICsgM1VdIDw8IDI0VSkgfA0KLSAgICAgICAgICAgICAgICAgICgodWludDMyX3QpcFR4RGF0YVtCeXRlQ291bnRlciArIDJVXSA8PCAxNlUpIHwNCi0gICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KXBUeERhdGFbQnl0ZUNvdW50ZXIgKyAxVV0gPDwgOFUpIHwNCi0gICAgICAgICAgICAgICAgICAodWludDMyX3QpcFR4RGF0YVtCeXRlQ291bnRlcl0pOw0KLSAgICBUeEFkZHJlc3MrKzsNCi0gIH0NCi19DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0jZW5kaWYgLyogSEFMX0ZEQ0FOX01PRFVMRV9FTkFCTEVEICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLSNlbmRpZiAvKiBGRENBTjEgKi8NCisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnNHh4X2hhbF9mZGNhbi5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBGRENBTiBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBGbGV4aWJsZSBEYXRhUmF0ZSBDb250cm9sbGVyIEFyZWEgTmV0d29yaworICAqICAgICAgICAgIChGRENBTikgcGVyaXBoZXJhbDoKKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgQ29uZmlndXJhdGlvbiBhbmQgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvciBmdW5jdGlvbnMKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0ZXJtcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlCisgICogaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc29mdHdhcmUgY29tcG9uZW50LgorICAqIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcyB3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICBAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgICgjKSBJbml0aWFsaXplIHRoZSBGRENBTiBwZXJpcGhlcmFsIHVzaW5nIEhBTF9GRENBTl9Jbml0IGZ1bmN0aW9uLgorCisgICAgICAoIykgSWYgbmVlZGVkICwgY29uZmlndXJlIHRoZSByZWNlcHRpb24gZmlsdGVycyBhbmQgb3B0aW9uYWwgZmVhdHVyZXMKKyAgdXNpbmcgdGhlIGZvbGxvd2luZyBjb25maWd1cmF0aW9uIGZ1bmN0aW9uczoKKyAgICAgICAgICAgICgrKykgSEFMX0ZEQ0FOX0NvbmZpZ0ZpbHRlcgorICAgICAgICAgICAgKCsrKSBIQUxfRkRDQU5fQ29uZmlnR2xvYmFsRmlsdGVyCisgICAgICAgICAgICAoKyspIEhBTF9GRENBTl9Db25maWdFeHRlbmRlZElkTWFzaworICAgICAgICAgICAgKCsrKSBIQUxfRkRDQU5fQ29uZmlnUnhGaWZvT3ZlcndyaXRlCisgICAgICAgICAgICAoKyspIEhBTF9GRENBTl9Db25maWdSYW1XYXRjaGRvZworICAgICAgICAgICAgKCsrKSBIQUxfRkRDQU5fQ29uZmlnVGltZXN0YW1wQ291bnRlcgorICAgICAgICAgICAgKCsrKSBIQUxfRkRDQU5fRW5hYmxlVGltZXN0YW1wQ291bnRlcgorICAgICAgICAgICAgKCsrKSBIQUxfRkRDQU5fRGlzYWJsZVRpbWVzdGFtcENvdW50ZXIKKyAgICAgICAgICAgICgrKykgSEFMX0ZEQ0FOX0NvbmZpZ1RpbWVvdXRDb3VudGVyCisgICAgICAgICAgICAoKyspIEhBTF9GRENBTl9FbmFibGVUaW1lb3V0Q291bnRlcgorICAgICAgICAgICAgKCsrKSBIQUxfRkRDQU5fRGlzYWJsZVRpbWVvdXRDb3VudGVyCisgICAgICAgICAgICAoKyspIEhBTF9GRENBTl9Db25maWdUeERlbGF5Q29tcGVuc2F0aW9uCisgICAgICAgICAgICAoKyspIEhBTF9GRENBTl9FbmFibGVUeERlbGF5Q29tcGVuc2F0aW9uCisgICAgICAgICAgICAoKyspIEhBTF9GRENBTl9EaXNhYmxlVHhEZWxheUNvbXBlbnNhdGlvbgorICAgICAgICAgICAgKCsrKSBIQUxfRkRDQU5fRW5hYmxlSVNPTW9kZQorICAgICAgICAgICAgKCsrKSBIQUxfRkRDQU5fRGlzYWJsZUlTT01vZGUKKyAgICAgICAgICAgICgrKykgSEFMX0ZEQ0FOX0VuYWJsZUVkZ2VGaWx0ZXJpbmcKKyAgICAgICAgICAgICgrKykgSEFMX0ZEQ0FOX0Rpc2FibGVFZGdlRmlsdGVyaW5nCisKKyAgICAgICgjKSBTdGFydCB0aGUgRkRDQU4gbW9kdWxlIHVzaW5nIEhBTF9GRENBTl9TdGFydCBmdW5jdGlvbi4gQXQgdGhpcyBsZXZlbAorICAgICAgICAgIHRoZSBub2RlIGlzIGFjdGl2ZSBvbiB0aGUgYnVzOiBpdCBjYW4gc2VuZCBhbmQgcmVjZWl2ZSBtZXNzYWdlcy4KKworICAgICAgKCMpIFRoZSBmb2xsb3dpbmcgVHggY29udHJvbCBmdW5jdGlvbnMgY2FuIG9ubHkgYmUgY2FsbGVkIHdoZW4gdGhlIEZEQ0FOCisgICAgICAgICAgbW9kdWxlIGlzIHN0YXJ0ZWQ6CisgICAgICAgICAgICAoKyspIEhBTF9GRENBTl9BZGRNZXNzYWdlVG9UeEZpZm9RCisgICAgICAgICAgICAoKyspIEhBTF9GRENBTl9BYm9ydFR4UmVxdWVzdAorCisgICAgICAoIykgQWZ0ZXIgaGF2aW5nIHN1Ym1pdHRlZCBhIFR4IHJlcXVlc3QgaW4gVHggRmlmbyBvciBRdWV1ZSwgaXQgaXMKKyAgcG9zc2libGUgdG8gZ2V0IFR4IGJ1ZmZlciBsb2NhdGlvbiB1c2VkIHRvIHBsYWNlIHRoZSBUeCByZXF1ZXN0IHRoYW5rcyB0bworICAgICAgICAgIEhBTF9GRENBTl9HZXRMYXRlc3RUeEZpZm9RUmVxdWVzdEJ1ZmZlciBBUEkuCisgICAgICAgICAgSXQgaXMgdGhlbiBwb3NzaWJsZSB0byBhYm9ydCBsYXRlciBvbiB0aGUgY29ycmVzcG9uZGluZyBUeCBSZXF1ZXN0CisgIHVzaW5nIEhBTF9GRENBTl9BYm9ydFR4UmVxdWVzdCBBUEkuCisKKyAgICAgICgjKSBXaGVuIGEgbWVzc2FnZSBpcyByZWNlaXZlZCBpbnRvIHRoZSBGRENBTiBtZXNzYWdlIFJBTSwgaXQgY2FuIGJlCisgICAgICAgICAgcmV0cmlldmVkIHVzaW5nIHRoZSBIQUxfRkRDQU5fR2V0UnhNZXNzYWdlIGZ1bmN0aW9uLgorCisgICAgICAoIykgQ2FsbGluZyB0aGUgSEFMX0ZEQ0FOX1N0b3AgZnVuY3Rpb24gc3RvcHMgdGhlIEZEQ0FOIG1vZHVsZSBieSBlbnRlcmluZworICAgICAgICAgIGl0IHRvIGluaXRpYWxpemF0aW9uIG1vZGUgYW5kIHJlLWVuYWJsaW5nIGFjY2VzcyB0byBjb25maWd1cmF0aW9uCisgICAgICAgICAgcmVnaXN0ZXJzIHRocm91Z2ggdGhlIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb25zIGxpc3RlZCBoZXJlIGFib3ZlLgorCisgICAgICAoIykgQWxsIG90aGVyIGNvbnRyb2wgZnVuY3Rpb25zIGNhbiBiZSBjYWxsZWQgYW55IHRpbWUgYWZ0ZXIKKyAgaW5pdGlhbGl6YXRpb24gcGhhc2UsIG5vIG1hdHRlciBpZiB0aGUgRkRDQU4gbW9kdWxlIGlzIHN0YXJ0ZWQgb3Igc3RvcHBlZC4KKworICAgICAgKioqIFBvbGxpbmcgbW9kZSBvcGVyYXRpb24gKioqCisgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICAgICgjKSBSZWNlcHRpb24gYW5kIHRyYW5zbWlzc2lvbiBzdGF0ZXMgY2FuIGJlIG1vbml0b3JlZCB2aWEgdGhlIGZvbGxvd2luZworICAgICAgICAgICAgZnVuY3Rpb25zOgorICAgICAgICAgICAgICAoKyspIEhBTF9GRENBTl9Jc1R4QnVmZmVyTWVzc2FnZVBlbmRpbmcKKyAgICAgICAgICAgICAgKCsrKSBIQUxfRkRDQU5fR2V0UnhGaWZvRmlsbExldmVsCisgICAgICAgICAgICAgICgrKykgSEFMX0ZEQ0FOX0dldFR4Rmlmb0ZyZWVMZXZlbAorCisgICAgICAqKiogSW50ZXJydXB0IG1vZGUgb3BlcmF0aW9uICoqKgorICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIFsuLl0KKyAgICAgICAgKCMpIFRoZXJlIGFyZSB0d28gaW50ZXJydXB0IGxpbmVzOiBsaW5lIDAgYW5kIDEuCisgICAgICAgICAgICBCeSBkZWZhdWx0LCBhbGwgaW50ZXJydXB0cyBhcmUgYXNzaWduZWQgdG8gbGluZSAwLiBJbnRlcnJ1cHQgbGluZXMKKyAgICAgICAgICAgIGNhbiBiZSBjb25maWd1cmVkIHVzaW5nIEhBTF9GRENBTl9Db25maWdJbnRlcnJ1cHRMaW5lcyBmdW5jdGlvbi4KKworICAgICAgICAoIykgTm90aWZpY2F0aW9ucyBhcmUgYWN0aXZhdGVkIHVzaW5nIEhBTF9GRENBTl9BY3RpdmF0ZU5vdGlmaWNhdGlvbgorICAgICAgICAgICAgZnVuY3Rpb24uIFRoZW4sIHRoZSBwcm9jZXNzIGNhbiBiZSBjb250cm9sbGVkIHRocm91Z2ggb25lIG9mIHRoZQorICAgICAgICAgICAgYXZhaWxhYmxlIHVzZXIgY2FsbGJhY2tzOiBIQUxfRkRDQU5feHh4Q2FsbGJhY2suCisKKyAgKioqIENhbGxiYWNrIHJlZ2lzdHJhdGlvbiAqKioKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgVGhlIGNvbXBpbGF0aW9uIGRlZmluZSBVU0VfSEFMX0ZEQ0FOX1JFR0lTVEVSX0NBTExCQUNLUyB3aGVuIHNldCB0byAxCisgIGFsbG93cyB0aGUgdXNlciB0byBjb25maWd1cmUgZHluYW1pY2FsbHkgdGhlIGRyaXZlciBjYWxsYmFja3MuCisgIFVzZSBGdW5jdGlvbiBIQUxfRkRDQU5fUmVnaXN0ZXJDYWxsYmFjaygpIG9yIEhBTF9GRENBTl9SZWdpc3RlclhYWENhbGxiYWNrKCkKKyAgdG8gcmVnaXN0ZXIgYW4gaW50ZXJydXB0IGNhbGxiYWNrLgorCisgIEZ1bmN0aW9uIEhBTF9GRENBTl9SZWdpc3RlckNhbGxiYWNrKCkgYWxsb3dzIHRvIHJlZ2lzdGVyIGZvbGxvd2luZyBjYWxsYmFja3M6CisgICAgKCspIFR4Rmlmb0VtcHR5Q2FsbGJhY2sgICAgICAgICAgOiBUeCBGaWZvIEVtcHR5IENhbGxiYWNrLgorICAgICgrKSBIaWdoUHJpb3JpdHlNZXNzYWdlQ2FsbGJhY2sgIDogSGlnaCBQcmlvcml0eSBNZXNzYWdlIENhbGxiYWNrLgorICAgICgrKSBUaW1lc3RhbXBXcmFwYXJvdW5kQ2FsbGJhY2sgIDogVGltZXN0YW1wIFdyYXBhcm91bmQgQ2FsbGJhY2suCisgICAgKCspIFRpbWVvdXRPY2N1cnJlZENhbGxiYWNrICAgICAgOiBUaW1lb3V0IE9jY3VycmVkIENhbGxiYWNrLgorICAgICgrKSBFcnJvckNhbGxiYWNrICAgICAgICAgICAgICAgIDogRXJyb3IgQ2FsbGJhY2suCisgICAgKCspIE1zcEluaXRDYWxsYmFjayAgICAgICAgICAgICAgOiBGRENBTiBNc3BJbml0LgorICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgICAgICAgICAgIDogRkRDQU4gTXNwRGVJbml0LgorICBUaGlzIGZ1bmN0aW9uIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSwgdGhlIENhbGxiYWNrIElECisgIGFuZCBhIHBvaW50ZXIgdG8gdGhlIHVzZXIgY2FsbGJhY2sgZnVuY3Rpb24uCisKKyAgRm9yIHNwZWNpZmljIGNhbGxiYWNrcyBUeEV2ZW50Rmlmb0NhbGxiYWNrLCBSeEZpZm8wQ2FsbGJhY2ssIFJ4RmlmbzFDYWxsYmFjaywKKyAgVHhCdWZmZXJDb21wbGV0ZUNhbGxiYWNrLCBUeEJ1ZmZlckFib3J0Q2FsbGJhY2sgYW5kIEVycm9yU3RhdHVzQ2FsbGJhY2sgdXNlCisgIGRlZGljYXRlZCByZWdpc3RlciBjYWxsYmFja3M6IHJlc3BlY3RpdmVseQorICBIQUxfRkRDQU5fUmVnaXN0ZXJUeEV2ZW50Rmlmb0NhbGxiYWNrKCksIEhBTF9GRENBTl9SZWdpc3RlclJ4RmlmbzBDYWxsYmFjaygpLAorICBIQUxfRkRDQU5fUmVnaXN0ZXJSeEZpZm8xQ2FsbGJhY2soKSwKKyAgSEFMX0ZEQ0FOX1JlZ2lzdGVyVHhCdWZmZXJDb21wbGV0ZUNhbGxiYWNrKCksCisgIEhBTF9GRENBTl9SZWdpc3RlclR4QnVmZmVyQWJvcnRDYWxsYmFjaygpIGFuZAorICBIQUxfRkRDQU5fUmVnaXN0ZXJFcnJvclN0YXR1c0NhbGxiYWNrKCkuCisKKyAgVXNlIGZ1bmN0aW9uIEhBTF9GRENBTl9VblJlZ2lzdGVyQ2FsbGJhY2soKSB0byByZXNldCBhIGNhbGxiYWNrIHRvIHRoZSBkZWZhdWx0CisgIHdlYWsgZnVuY3Rpb24uCisgIEhBTF9GRENBTl9VblJlZ2lzdGVyQ2FsbGJhY2sgdGFrZXMgYXMgcGFyYW1ldGVycyB0aGUgSEFMIHBlcmlwaGVyYWwgaGFuZGxlLAorICBhbmQgdGhlIENhbGxiYWNrIElELgorICBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0byByZXNldCBmb2xsb3dpbmcgY2FsbGJhY2tzOgorICAgICgrKSBUeEZpZm9FbXB0eUNhbGxiYWNrICAgICAgICAgIDogVHggRmlmbyBFbXB0eSBDYWxsYmFjay4KKyAgICAoKykgSGlnaFByaW9yaXR5TWVzc2FnZUNhbGxiYWNrICA6IEhpZ2ggUHJpb3JpdHkgTWVzc2FnZSBDYWxsYmFjay4KKyAgICAoKykgVGltZXN0YW1wV3JhcGFyb3VuZENhbGxiYWNrICA6IFRpbWVzdGFtcCBXcmFwYXJvdW5kIENhbGxiYWNrLgorICAgICgrKSBUaW1lb3V0T2NjdXJyZWRDYWxsYmFjayAgICAgIDogVGltZW91dCBPY2N1cnJlZCBDYWxsYmFjay4KKyAgICAoKykgRXJyb3JDYWxsYmFjayAgICAgICAgICAgICAgICA6IEVycm9yIENhbGxiYWNrLgorICAgICgrKSBNc3BJbml0Q2FsbGJhY2sgICAgICAgICAgICAgIDogRkRDQU4gTXNwSW5pdC4KKyAgICAoKykgTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgICAgICA6IEZEQ0FOIE1zcERlSW5pdC4KKworICBGb3Igc3BlY2lmaWMgY2FsbGJhY2tzIFR4RXZlbnRGaWZvQ2FsbGJhY2ssIFJ4RmlmbzBDYWxsYmFjaywgUnhGaWZvMUNhbGxiYWNrLAorICBUeEJ1ZmZlckNvbXBsZXRlQ2FsbGJhY2sgYW5kIFR4QnVmZmVyQWJvcnRDYWxsYmFjaywgdXNlIGRlZGljYXRlZAorICB1bnJlZ2lzdGVyIGNhbGxiYWNrczogcmVzcGVjdGl2ZWx5IEhBTF9GRENBTl9VblJlZ2lzdGVyVHhFdmVudEZpZm9DYWxsYmFjaygpLAorICBIQUxfRkRDQU5fVW5SZWdpc3RlclJ4RmlmbzBDYWxsYmFjaygpLCBIQUxfRkRDQU5fVW5SZWdpc3RlclJ4RmlmbzFDYWxsYmFjaygpLAorICBIQUxfRkRDQU5fVW5SZWdpc3RlclR4QnVmZmVyQ29tcGxldGVDYWxsYmFjaygpLAorICBIQUxfRkRDQU5fVW5SZWdpc3RlclR4QnVmZmVyQWJvcnRDYWxsYmFjaygpIGFuZAorICBIQUxfRkRDQU5fVW5SZWdpc3RlckVycm9yU3RhdHVzQ2FsbGJhY2soKS4KKworICBCeSBkZWZhdWx0LCBhZnRlciB0aGUgSEFMX0ZEQ0FOX0luaXQoKSBhbmQgd2hlbiB0aGUgc3RhdGUgaXMKKyAgSEFMX0ZEQ0FOX1NUQVRFX1JFU0VULCBhbGwgY2FsbGJhY2tzIGFyZSBzZXQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgd2VhaworICBmdW5jdGlvbnM6IGV4YW1wbGVzIEhBTF9GRENBTl9FcnJvckNhbGxiYWNrKCkuIEV4Y2VwdGlvbiBkb25lIGZvciBNc3BJbml0IGFuZAorICBNc3BEZUluaXQgZnVuY3Rpb25zIHRoYXQgYXJlIHJlc2V0IHRvIHRoZSBsZWdhY3kgd2VhayBmdW5jdGlvbiBpbiB0aGUKKyAgSEFMX0ZEQ0FOX0luaXQoKS8gSEFMX0ZEQ0FOX0RlSW5pdCgpIG9ubHkgd2hlbiB0aGVzZSBjYWxsYmFja3MgYXJlIG51bGwgKG5vdAorICByZWdpc3RlcmVkIGJlZm9yZWhhbmQpLiBpZiBub3QsIE1zcEluaXQgb3IgTXNwRGVJbml0IGFyZSBub3QgbnVsbCwgdGhlCisgIEhBTF9GRENBTl9Jbml0KCkvIEhBTF9GRENBTl9EZUluaXQoKSBrZWVwIGFuZCB1c2UgdGhlIHVzZXIgTXNwSW5pdC9Nc3BEZUluaXQKKyAgY2FsbGJhY2tzIChyZWdpc3RlcmVkIGJlZm9yZWhhbmQpCisKKyAgQ2FsbGJhY2tzIGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZCBpbiBIQUxfRkRDQU5fU1RBVEVfUkVBRFkgc3RhdGUgb25seS4KKyAgRXhjZXB0aW9uIGRvbmUgTXNwSW5pdC9Nc3BEZUluaXQgdGhhdCBjYW4gYmUgcmVnaXN0ZXJlZC91bnJlZ2lzdGVyZWQKKyAgaW4gSEFMX0ZEQ0FOX1NUQVRFX1JFQURZIG9yIEhBTF9GRENBTl9TVEFURV9SRVNFVCBzdGF0ZSwKKyAgdGh1cyByZWdpc3RlcmVkICh1c2VyKSBNc3BJbml0L0RlSW5pdCBjYWxsYmFja3MgY2FuIGJlIHVzZWQgZHVyaW5nIHRoZQorICBJbml0L0RlSW5pdC4gSW4gdGhhdCBjYXNlIGZpcnN0IHJlZ2lzdGVyIHRoZSBNc3BJbml0L01zcERlSW5pdCB1c2VyIGNhbGxiYWNrcworICB1c2luZyBIQUxfRkRDQU5fUmVnaXN0ZXJDYWxsYmFjaygpIGJlZm9yZSBjYWxsaW5nIEhBTF9GRENBTl9EZUluaXQoKQorICBvciBIQUxfRkRDQU5fSW5pdCgpIGZ1bmN0aW9uLgorCisgIFdoZW4gVGhlIGNvbXBpbGF0aW9uIGRlZmluZSBVU0VfSEFMX0ZEQ0FOX1JFR0lTVEVSX0NBTExCQUNLUyBpcyBzZXQgdG8gMCBvcgorICBub3QgZGVmaW5lZCwgdGhlIGNhbGxiYWNrIHJlZ2lzdHJhdGlvbiBmZWF0dXJlIGlzIG5vdCBhdmFpbGFibGUgYW5kIGFsbAorICBjYWxsYmFja3MgYXJlIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyB3ZWFrIGZ1bmN0aW9ucy4KKworICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnNHh4X2hhbC5oIgorCisjaWYgZGVmaW5lZChGRENBTjEpCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkc0eHhfSEFMX0RyaXZlcgorICogQHsKKyAqLworCisvKiogQGRlZmdyb3VwIEZEQ0FOIEZEQ0FOCisgKiBAYnJpZWYgRkRDQU4gSEFMIG1vZHVsZSBkcml2ZXIKKyAqIEB7CisgKi8KKworI2lmZGVmIEhBTF9GRENBTl9NT0RVTEVfRU5BQkxFRAorCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBGRENBTl9Qcml2YXRlX0NvbnN0YW50cworICogQHsKKyAqLworI2RlZmluZSBGRENBTl9USU1FT1VUX1ZBTFVFIDEwVQorCisjZGVmaW5lIEZEQ0FOX1RYX0VWRU5UX0ZJRk9fTUFTSyAoRkRDQU5fSVJfVEVGTCB8IEZEQ0FOX0lSX1RFRkYgfCBGRENBTl9JUl9URUZOKQorI2RlZmluZSBGRENBTl9SWF9GSUZPMF9NQVNLIChGRENBTl9JUl9SRjBMIHwgRkRDQU5fSVJfUkYwRiB8IEZEQ0FOX0lSX1JGME4pCisjZGVmaW5lIEZEQ0FOX1JYX0ZJRk8xX01BU0sgKEZEQ0FOX0lSX1JGMUwgfCBGRENBTl9JUl9SRjFGIHwgRkRDQU5fSVJfUkYxTikKKyNkZWZpbmUgRkRDQU5fRVJST1JfTUFTSyBcCisgIChGRENBTl9JUl9FTE8gfCBGRENBTl9JUl9XREkgfCBGRENBTl9JUl9QRUEgfCBGRENBTl9JUl9QRUQgfCBGRENBTl9JUl9BUkEpCisjZGVmaW5lIEZEQ0FOX0VSUk9SX1NUQVRVU19NQVNLIChGRENBTl9JUl9FUCB8IEZEQ0FOX0lSX0VXIHwgRkRDQU5fSVJfQk8pCisKKyNkZWZpbmUgRkRDQU5fRUxFTUVOVF9NQVNLX1NURElEIFwKKyAgKCh1aW50MzJfdCkweDFGRkMwMDAwVSkgLyogU3RhbmRhcmQgSWRlbnRpZmllciAgICAgICAgICovCisjZGVmaW5lIEZEQ0FOX0VMRU1FTlRfTUFTS19FWFRJRCBcCisgICgodWludDMyX3QpMHgxRkZGRkZGRlUpIC8qIEV4dGVuZGVkIElkZW50aWZpZXIgICAgICAgICAqLworI2RlZmluZSBGRENBTl9FTEVNRU5UX01BU0tfUlRSIFwKKyAgKCh1aW50MzJfdCkweDIwMDAwMDAwVSkgLyogUmVtb3RlIFRyYW5zbWlzc2lvbiBSZXF1ZXN0ICovCisjZGVmaW5lIEZEQ0FOX0VMRU1FTlRfTUFTS19YVEQgXAorICAoKHVpbnQzMl90KTB4NDAwMDAwMDBVKSAvKiBFeHRlbmRlZCBJZGVudGlmaWVyICAgICAgICAgKi8KKyNkZWZpbmUgRkRDQU5fRUxFTUVOVF9NQVNLX0VTSSBcCisgICgodWludDMyX3QpMHg4MDAwMDAwMFUpIC8qIEVycm9yIFN0YXRlIEluZGljYXRvciAgICAgICAqLworI2RlZmluZSBGRENBTl9FTEVNRU5UX01BU0tfVFMgXAorICAoKHVpbnQzMl90KTB4MDAwMEZGRkZVKSAvKiBUaW1lc3RhbXAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRkRDQU5fRUxFTUVOVF9NQVNLX0RMQyBcCisgICgodWludDMyX3QpMHgwMDBGMDAwMFUpIC8qIERhdGEgTGVuZ3RoIENvZGUgICAgICAgICAgICAqLworI2RlZmluZSBGRENBTl9FTEVNRU5UX01BU0tfQlJTIFwKKyAgKCh1aW50MzJfdCkweDAwMTAwMDAwVSkgLyogQml0IFJhdGUgU3dpdGNoICAgICAgICAgICAgICovCisjZGVmaW5lIEZEQ0FOX0VMRU1FTlRfTUFTS19GREYgXAorICAoKHVpbnQzMl90KTB4MDAyMDAwMDBVKSAvKiBGRCBGb3JtYXQgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRkRDQU5fRUxFTUVOVF9NQVNLX0VGQyBcCisgICgodWludDMyX3QpMHgwMDgwMDAwMFUpIC8qIEV2ZW50IEZJRk8gQ29udHJvbCAgICAgICAgICAqLworI2RlZmluZSBGRENBTl9FTEVNRU5UX01BU0tfTU0gXAorICAoKHVpbnQzMl90KTB4RkYwMDAwMDBVKSAvKiBNZXNzYWdlIE1hcmtlciAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRkRDQU5fRUxFTUVOVF9NQVNLX0ZJRFggXAorICAoKHVpbnQzMl90KTB4N0YwMDAwMDBVKSAvKiBGaWx0ZXIgSW5kZXggICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRkRDQU5fRUxFTUVOVF9NQVNLX0FOTUYgXAorICAoKHVpbnQzMl90KTB4ODAwMDAwMDBVKSAvKiBBY2NlcHRlZCBOb24tbWF0Y2hpbmcgRnJhbWUgKi8KKyNkZWZpbmUgRkRDQU5fRUxFTUVOVF9NQVNLX0VUIFwKKyAgKCh1aW50MzJfdCkweDAwQzAwMDAwVSkgLyogRXZlbnQgdHlwZSAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgU1JBTUNBTl9GTFNfTkJSICgyOFUpIC8qIE1heC4gRmlsdGVyIExpc3QgU3RhbmRhcmQgTnVtYmVyICAgICAgKi8KKyNkZWZpbmUgU1JBTUNBTl9GTEVfTkJSICg4VSkgIC8qIE1heC4gRmlsdGVyIExpc3QgRXh0ZW5kZWQgTnVtYmVyICAgICAgKi8KKyNkZWZpbmUgU1JBTUNBTl9SRjBfTkJSICgzVSkgIC8qIFJYIEZJRk8gMCBFbGVtZW50cyBOdW1iZXIgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU1JBTUNBTl9SRjFfTkJSICgzVSkgIC8qIFJYIEZJRk8gMSBFbGVtZW50cyBOdW1iZXIgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU1JBTUNBTl9URUZfTkJSICgzVSkgIC8qIFRYIEV2ZW50IEZJRk8gRWxlbWVudHMgTnVtYmVyICAgICAgICAgKi8KKyNkZWZpbmUgU1JBTUNBTl9URlFfTkJSICgzVSkgIC8qIFRYIEZJRk8vUXVldWUgRWxlbWVudHMgTnVtYmVyICAgICAgICAgKi8KKworI2RlZmluZSBTUkFNQ0FOX0ZMU19TSVpFICgxVSAqIDRVKSAgLyogRmlsdGVyIFN0YW5kYXJkIEVsZW1lbnQgU2l6ZSBpbiBieXRlcyAqLworI2RlZmluZSBTUkFNQ0FOX0ZMRV9TSVpFICgyVSAqIDRVKSAgLyogRmlsdGVyIEV4dGVuZGVkIEVsZW1lbnQgU2l6ZSBpbiBieXRlcyAqLworI2RlZmluZSBTUkFNQ0FOX1JGMF9TSVpFICgxOFUgKiA0VSkgLyogUlggRklGTyAwIEVsZW1lbnRzIFNpemUgaW4gYnl0ZXMgKi8KKyNkZWZpbmUgU1JBTUNBTl9SRjFfU0laRSAoMThVICogNFUpIC8qIFJYIEZJRk8gMSBFbGVtZW50cyBTaXplIGluIGJ5dGVzICovCisjZGVmaW5lIFNSQU1DQU5fVEVGX1NJWkUgKDJVICogNFUpICAvKiBUWCBFdmVudCBGSUZPIEVsZW1lbnRzIFNpemUgaW4gYnl0ZXMgICovCisjZGVmaW5lIFNSQU1DQU5fVEZRX1NJWkUgKDE4VSAqIDRVKSAvKiBUWCBGSUZPL1F1ZXVlIEVsZW1lbnRzIFNpemUgaW4gYnl0ZXMgKi8KKworI2RlZmluZSBTUkFNQ0FOX0ZMU1NBICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCh1aW50MzJfdCkwKSAvKiBGaWx0ZXIgTGlzdCBTdGFuZGFyZCBTdGFydCBcCisgICAgICAgICAgICAgICAgICAgQWRkcmVzcyAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNSQU1DQU5fRkxFU0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCh1aW50MzJfdCkoU1JBTUNBTl9GTFNTQSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAoU1JBTUNBTl9GTFNfTkJSICogU1JBTUNBTl9GTFNfU0laRSkpKSAvKiBGaWx0ZXIgTGlzdCBFeHRlbmRlZCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0IEFkZHJlc3MgKi8KKyNkZWZpbmUgU1JBTUNBTl9SRjBTQSAgICAgICAgICAgIFwKKyAgKCh1aW50MzJfdCkoU1JBTUNBTl9GTEVTQSArICAgIFwKKyAgICAgICAgICAgICAgKFNSQU1DQU5fRkxFX05CUiAqIFwKKyAgICAgICAgICAgICAgIFNSQU1DQU5fRkxFX1NJWkUpKSkgLyogUnggRklGTyAwIFN0YXJ0IEFkZHJlc3MgICovCisjZGVmaW5lIFNSQU1DQU5fUkYxU0EgICAgICAgICAgICBcCisgICgodWludDMyX3QpKFNSQU1DQU5fUkYwU0EgKyAgICBcCisgICAgICAgICAgICAgIChTUkFNQ0FOX1JGMF9OQlIgKiBcCisgICAgICAgICAgICAgICBTUkFNQ0FOX1JGMF9TSVpFKSkpIC8qIFJ4IEZJRk8gMSBTdGFydCBBZGRyZXNzICAqLworI2RlZmluZSBTUkFNQ0FOX1RFRlNBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCh1aW50MzJfdCkoU1JBTUNBTl9SRjFTQSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIChTUkFNQ0FOX1JGMV9OQlIgKiBTUkFNQ0FOX1JGMV9TSVpFKSkpIC8qIFR4IEV2ZW50IEZJRk8gU3RhcnQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzICovCisjZGVmaW5lIFNSQU1DQU5fVEZRU0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKHVpbnQzMl90KShTUkFNQ0FOX1RFRlNBICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKFNSQU1DQU5fVEVGX05CUiAqIFNSQU1DQU5fVEVGX1NJWkUpKSkgLyogVHggRklGTy9RdWV1ZSBTdGFydCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3MgKi8KKyNkZWZpbmUgU1JBTUNBTl9TSVpFICAgICAgICAgIFwKKyAgKCh1aW50MzJfdCkoU1JBTUNBTl9URlFTQSArIFwKKyAgICAgICAgICAgICAgKFNSQU1DQU5fVEZRX05CUiAqIFNSQU1DQU5fVEZRX1NJWkUpKSkgLyogTWVzc2FnZSBSQU0gc2l6ZSAqLworCisvKioKKyAqIEB9CisgKi8KKworLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgRkRDQU5fUHJpdmF0ZV9WYXJpYWJsZXMKKyAqIEB7CisgKi8KK3N0YXRpYyBjb25zdCB1aW50OF90IERMQ3RvQnl0ZXNbXSA9IHswLCAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsIDEyLCAxNiwgMjAsIDI0LCAzMiwgNDgsIDY0fTsKKy8qKgorICogQH0KKyAqLworCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIEZEQ0FOX1ByaXZhdGVfRnVuY3Rpb25zX1Byb3RvdHlwZXMKKyAqIEB7CisgKi8KK3N0YXRpYyB2b2lkIEZEQ0FOX0NhbGN1bHRhdGVSYW1CbG9ja0FkZHJlc3NlcyhGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pOworc3RhdGljIHZvaWQgRkRDQU5fQ29weU1lc3NhZ2VUb1JBTShjb25zdCBGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZEQ0FOX1R4SGVhZGVyVHlwZURlZiAqcFR4SGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpwVHhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBCdWZmZXJJbmRleCk7CisvKioKKyAqIEB9CisgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRkRDQU5fRXhwb3J0ZWRfRnVuY3Rpb25zIEZEQ0FOIEV4cG9ydGVkIEZ1bmN0aW9ucworICogQHsKKyAqLworCisvKiogQGRlZmdyb3VwIEZEQ0FOX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kCitkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiAgQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBJbml0aWFsaXplIGFuZCBjb25maWd1cmUgdGhlIEZEQ0FOLgorICAgICAgKCspIERlLWluaXRpYWxpemUgdGhlIEZEQ0FOLgorICAgICAgKCspIEVudGVyIEZEQ0FOIHBlcmlwaGVyYWwgaW4gcG93ZXIgZG93biBtb2RlLgorICAgICAgKCspIEV4aXQgcG93ZXIgZG93biBtb2RlLgorICAgICAgKCspIFJlZ2lzdGVyIGNhbGxiYWNrcy4KKyAgICAgICgrKSBVbnJlZ2lzdGVyIGNhbGxiYWNrcy4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBGRENBTiBwZXJpcGhlcmFsIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCisgKiAgICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIEZEQ0FOX0luaXRUeXBlRGVmIHN0cnVjdHVyZS4KKyAqIEBwYXJhbSAgaGZkY2FuIHBvaW50ZXIgdG8gYW4gRkRDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBGRENBTi4KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fSW5pdChGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pIHsKKyAgdWludDMyX3QgdGlja3N0YXJ0OworCisgIC8qIENoZWNrIEZEQ0FOIGhhbmRsZSAqLworICBpZiAoaGZkY2FuID09IE5VTEwpIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgZnVuY3Rpb24gcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfRkRDQU5fQUxMX0lOU1RBTkNFKGhmZGNhbi0+SW5zdGFuY2UpKTsKKyAgaWYgKGhmZGNhbi0+SW5zdGFuY2UgPT0gRkRDQU4xKSB7CisgICAgYXNzZXJ0X3BhcmFtKElTX0ZEQ0FOX0NLRElWKGhmZGNhbi0+SW5pdC5DbG9ja0RpdmlkZXIpKTsKKyAgfQorICBhc3NlcnRfcGFyYW0oSVNfRkRDQU5fRlJBTUVfRk9STUFUKGhmZGNhbi0+SW5pdC5GcmFtZUZvcm1hdCkpOworICBhc3NlcnRfcGFyYW0oSVNfRkRDQU5fTU9ERShoZmRjYW4tPkluaXQuTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShoZmRjYW4tPkluaXQuQXV0b1JldHJhbnNtaXNzaW9uKSk7CisgIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKGhmZGNhbi0+SW5pdC5UcmFuc21pdFBhdXNlKSk7CisgIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKGhmZGNhbi0+SW5pdC5Qcm90b2NvbEV4Y2VwdGlvbikpOworICBhc3NlcnRfcGFyYW0oSVNfRkRDQU5fTk9NSU5BTF9QUkVTQ0FMRVIoaGZkY2FuLT5Jbml0Lk5vbWluYWxQcmVzY2FsZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZEQ0FOX05PTUlOQUxfU0pXKGhmZGNhbi0+SW5pdC5Ob21pbmFsU3luY0p1bXBXaWR0aCkpOworICBhc3NlcnRfcGFyYW0oSVNfRkRDQU5fTk9NSU5BTF9UU0VHMShoZmRjYW4tPkluaXQuTm9taW5hbFRpbWVTZWcxKSk7CisgIGFzc2VydF9wYXJhbShJU19GRENBTl9OT01JTkFMX1RTRUcyKGhmZGNhbi0+SW5pdC5Ob21pbmFsVGltZVNlZzIpKTsKKyAgaWYgKGhmZGNhbi0+SW5pdC5GcmFtZUZvcm1hdCA9PSBGRENBTl9GUkFNRV9GRF9CUlMpIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfRkRDQU5fREFUQV9QUkVTQ0FMRVIoaGZkY2FuLT5Jbml0LkRhdGFQcmVzY2FsZXIpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfRkRDQU5fREFUQV9TSlcoaGZkY2FuLT5Jbml0LkRhdGFTeW5jSnVtcFdpZHRoKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX0ZEQ0FOX0RBVEFfVFNFRzEoaGZkY2FuLT5Jbml0LkRhdGFUaW1lU2VnMSkpOworICAgIGFzc2VydF9wYXJhbShJU19GRENBTl9EQVRBX1RTRUcyKGhmZGNhbi0+SW5pdC5EYXRhVGltZVNlZzIpKTsKKyAgfQorICBhc3NlcnRfcGFyYW0oSVNfRkRDQU5fTUFYX1ZBTFVFKGhmZGNhbi0+SW5pdC5TdGRGaWx0ZXJzTmJyLCBTUkFNQ0FOX0ZMU19OQlIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZEQ0FOX01BWF9WQUxVRShoZmRjYW4tPkluaXQuRXh0RmlsdGVyc05iciwgU1JBTUNBTl9GTEVfTkJSKSk7CisgIGFzc2VydF9wYXJhbShJU19GRENBTl9UWF9GSUZPX1FVRVVFX01PREUoaGZkY2FuLT5Jbml0LlR4Rmlmb1F1ZXVlTW9kZSkpOworCisjaWYgVVNFX0hBTF9GRENBTl9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMQorICBpZiAoaGZkY2FuLT5TdGF0ZSA9PSBIQUxfRkRDQU5fU1RBVEVfUkVTRVQpIHsKKyAgICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovCisgICAgaGZkY2FuLT5Mb2NrID0gSEFMX1VOTE9DS0VEOworCisgICAgLyogUmVzZXQgY2FsbGJhY2tzIHRvIGxlZ2FjeSBmdW5jdGlvbnMgKi8KKyAgICBoZmRjYW4tPlR4RXZlbnRGaWZvQ2FsbGJhY2sgPQorICAgICAgICBIQUxfRkRDQU5fVHhFdmVudEZpZm9DYWxsYmFjazsgLyogVHhFdmVudEZpZm9DYWxsYmFjayAqLworICAgIGhmZGNhbi0+UnhGaWZvMENhbGxiYWNrID0gSEFMX0ZEQ0FOX1J4RmlmbzBDYWxsYmFjazsgLyogUnhGaWZvMENhbGxiYWNrICovCisgICAgaGZkY2FuLT5SeEZpZm8xQ2FsbGJhY2sgPSBIQUxfRkRDQU5fUnhGaWZvMUNhbGxiYWNrOyAvKiBSeEZpZm8xQ2FsbGJhY2sgKi8KKyAgICBoZmRjYW4tPlR4Rmlmb0VtcHR5Q2FsbGJhY2sgPQorICAgICAgICBIQUxfRkRDQU5fVHhGaWZvRW1wdHlDYWxsYmFjazsgLyogVHhGaWZvRW1wdHlDYWxsYmFjayAqLworICAgIGhmZGNhbi0+VHhCdWZmZXJDb21wbGV0ZUNhbGxiYWNrID0KKyAgICAgICAgSEFMX0ZEQ0FOX1R4QnVmZmVyQ29tcGxldGVDYWxsYmFjazsgLyogVHhCdWZmZXJDb21wbGV0ZUNhbGxiYWNrICovCisgICAgaGZkY2FuLT5UeEJ1ZmZlckFib3J0Q2FsbGJhY2sgPQorICAgICAgICBIQUxfRkRDQU5fVHhCdWZmZXJBYm9ydENhbGxiYWNrOyAvKiBUeEJ1ZmZlckFib3J0Q2FsbGJhY2sgICAgICAgICAgICovCisgICAgaGZkY2FuLT5IaWdoUHJpb3JpdHlNZXNzYWdlQ2FsbGJhY2sgPQorICAgICAgICBIQUxfRkRDQU5fSGlnaFByaW9yaXR5TWVzc2FnZUNhbGxiYWNrOyAvKiBIaWdoUHJpb3JpdHlNZXNzYWdlQ2FsbGJhY2sgKi8KKyAgICBoZmRjYW4tPlRpbWVzdGFtcFdyYXBhcm91bmRDYWxsYmFjayA9CisgICAgICAgIEhBTF9GRENBTl9UaW1lc3RhbXBXcmFwYXJvdW5kQ2FsbGJhY2s7IC8qIFRpbWVzdGFtcFdyYXBhcm91bmRDYWxsYmFjayAqLworICAgIGhmZGNhbi0+VGltZW91dE9jY3VycmVkQ2FsbGJhY2sgPQorICAgICAgICBIQUxfRkRDQU5fVGltZW91dE9jY3VycmVkQ2FsbGJhY2s7IC8qIFRpbWVvdXRPY2N1cnJlZENhbGxiYWNrICAgICAgICAgKi8KKyAgICBoZmRjYW4tPkVycm9yQ2FsbGJhY2sgPSBIQUxfRkRDQU5fRXJyb3JDYWxsYmFjazsgLyogRXJyb3JDYWxsYmFjayAgICAgICAqLworICAgIGhmZGNhbi0+RXJyb3JTdGF0dXNDYWxsYmFjayA9CisgICAgICAgIEhBTF9GRENBTl9FcnJvclN0YXR1c0NhbGxiYWNrOyAvKiBFcnJvclN0YXR1c0NhbGxiYWNrICovCisKKyAgICBpZiAoaGZkY2FuLT5Nc3BJbml0Q2FsbGJhY2sgPT0gTlVMTCkgeworICAgICAgaGZkY2FuLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfRkRDQU5fTXNwSW5pdDsgLyogTGVnYWN5IHdlYWsgTXNwSW5pdCAqLworICAgIH0KKworICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZTogQ0xPQ0ssIE5WSUMgKi8KKyAgICBoZmRjYW4tPk1zcEluaXRDYWxsYmFjayhoZmRjYW4pOworICB9CisjZWxzZQorICBpZiAoaGZkY2FuLT5TdGF0ZSA9PSBIQUxfRkRDQU5fU1RBVEVfUkVTRVQpIHsKKyAgICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovCisgICAgaGZkY2FuLT5Mb2NrID0gSEFMX1VOTE9DS0VEOworCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlOiBDTE9DSywgTlZJQyAqLworICAgIEhBTF9GRENBTl9Nc3BJbml0KGhmZGNhbik7CisgIH0KKyNlbmRpZiAvKiBVU0VfSEFMX0ZEQ0FOX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisgIC8qIEV4aXQgZnJvbSBTbGVlcCBtb2RlICovCisgIENMRUFSX0JJVChoZmRjYW4tPkluc3RhbmNlLT5DQ0NSLCBGRENBTl9DQ0NSX0NTUik7CisKKyAgLyogR2V0IHRpY2sgKi8KKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAvKiBDaGVjayBTbGVlcCBtb2RlIGFja25vd2xlZGdlICovCisgIHdoaWxlICgoaGZkY2FuLT5JbnN0YW5jZS0+Q0NDUiAmIEZEQ0FOX0NDQ1JfQ1NBKSA9PSBGRENBTl9DQ0NSX0NTQSkgeworICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBGRENBTl9USU1FT1VUX1ZBTFVFKSB7CisgICAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLworICAgICAgaGZkY2FuLT5FcnJvckNvZGUgfD0gSEFMX0ZEQ0FOX0VSUk9SX1RJTUVPVVQ7CisKKyAgICAgIC8qIENoYW5nZSBGRENBTiBzdGF0ZSAqLworICAgICAgaGZkY2FuLT5TdGF0ZSA9IEhBTF9GRENBTl9TVEFURV9FUlJPUjsKKworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisgIH0KKworICAvKiBSZXF1ZXN0IGluaXRpYWxpc2F0aW9uICovCisgIFNFVF9CSVQoaGZkY2FuLT5JbnN0YW5jZS0+Q0NDUiwgRkRDQU5fQ0NDUl9JTklUKTsKKworICAvKiBHZXQgdGljayAqLworICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgIC8qIFdhaXQgdW50aWwgdGhlIElOSVQgYml0IGludG8gQ0NDUiByZWdpc3RlciBpcyBzZXQgKi8KKyAgd2hpbGUgKChoZmRjYW4tPkluc3RhbmNlLT5DQ0NSICYgRkRDQU5fQ0NDUl9JTklUKSA9PSAwVSkgeworICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLworICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBGRENBTl9USU1FT1VUX1ZBTFVFKSB7CisgICAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLworICAgICAgaGZkY2FuLT5FcnJvckNvZGUgfD0gSEFMX0ZEQ0FOX0VSUk9SX1RJTUVPVVQ7CisKKyAgICAgIC8qIENoYW5nZSBGRENBTiBzdGF0ZSAqLworICAgICAgaGZkY2FuLT5TdGF0ZSA9IEhBTF9GRENBTl9TVEFURV9FUlJPUjsKKworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisgIH0KKworICAvKiBFbmFibGUgY29uZmlndXJhdGlvbiBjaGFuZ2UgKi8KKyAgU0VUX0JJVChoZmRjYW4tPkluc3RhbmNlLT5DQ0NSLCBGRENBTl9DQ0NSX0NDRSk7CisKKyAgLyogQ2hlY2sgRkRDQU4gaW5zdGFuY2UgKi8KKyAgaWYgKGhmZGNhbi0+SW5zdGFuY2UgPT0gRkRDQU4xKSB7CisgICAgLyogQ29uZmlndXJlIENsb2NrIGRpdmlkZXIgKi8KKyAgICBGRENBTl9DT05GSUctPkNLRElWID0gaGZkY2FuLT5Jbml0LkNsb2NrRGl2aWRlcjsKKyAgfQorCisgIC8qIFNldCB0aGUgbm8gYXV0b21hdGljIHJldHJhbnNtaXNzaW9uICovCisgIGlmIChoZmRjYW4tPkluaXQuQXV0b1JldHJhbnNtaXNzaW9uID09IEVOQUJMRSkgeworICAgIENMRUFSX0JJVChoZmRjYW4tPkluc3RhbmNlLT5DQ0NSLCBGRENBTl9DQ0NSX0RBUik7CisgIH0gZWxzZSB7CisgICAgU0VUX0JJVChoZmRjYW4tPkluc3RhbmNlLT5DQ0NSLCBGRENBTl9DQ0NSX0RBUik7CisgIH0KKworICAvKiBTZXQgdGhlIHRyYW5zbWl0IHBhdXNlIGZlYXR1cmUgKi8KKyAgaWYgKGhmZGNhbi0+SW5pdC5UcmFuc21pdFBhdXNlID09IEVOQUJMRSkgeworICAgIFNFVF9CSVQoaGZkY2FuLT5JbnN0YW5jZS0+Q0NDUiwgRkRDQU5fQ0NDUl9UWFApOworICB9IGVsc2UgeworICAgIENMRUFSX0JJVChoZmRjYW4tPkluc3RhbmNlLT5DQ0NSLCBGRENBTl9DQ0NSX1RYUCk7CisgIH0KKworICAvKiBTZXQgdGhlIFByb3RvY29sIEV4Y2VwdGlvbiBIYW5kbGluZyAqLworICBpZiAoaGZkY2FuLT5Jbml0LlByb3RvY29sRXhjZXB0aW9uID09IEVOQUJMRSkgeworICAgIENMRUFSX0JJVChoZmRjYW4tPkluc3RhbmNlLT5DQ0NSLCBGRENBTl9DQ0NSX1BYSEQpOworICB9IGVsc2UgeworICAgIFNFVF9CSVQoaGZkY2FuLT5JbnN0YW5jZS0+Q0NDUiwgRkRDQU5fQ0NDUl9QWEhEKTsKKyAgfQorCisgIC8qIFNldCBGRENBTiBGcmFtZSBGb3JtYXQgKi8KKyAgTU9ESUZZX1JFRyhoZmRjYW4tPkluc3RhbmNlLT5DQ0NSLCBGRENBTl9GUkFNRV9GRF9CUlMsCisgICAgICAgICAgICAgaGZkY2FuLT5Jbml0LkZyYW1lRm9ybWF0KTsKKworICAvKiBSZXNldCBGRENBTiBPcGVyYXRpb24gTW9kZSAqLworICBDTEVBUl9CSVQoaGZkY2FuLT5JbnN0YW5jZS0+Q0NDUiwKKyAgICAgICAgICAgIChGRENBTl9DQ0NSX1RFU1QgfCBGRENBTl9DQ0NSX01PTiB8IEZEQ0FOX0NDQ1JfQVNNKSk7CisgIENMRUFSX0JJVChoZmRjYW4tPkluc3RhbmNlLT5URVNULCBGRENBTl9URVNUX0xCQ0spOworCisgIC8qIFNldCBGRENBTiBPcGVyYXRpbmcgTW9kZToKKyAgICAgICAgICAgICAgIHwgTm9ybWFsIHwgUmVzdHJpY3RlZCB8ICAgIEJ1cyAgICAgfCBJbnRlcm5hbCB8IEV4dGVybmFsCisgICAgICAgICAgICAgICB8ICAgICAgICB8IE9wZXJhdGlvbiAgfCBNb25pdG9yaW5nIHwgTG9vcEJhY2sgfCBMb29wQmFjaworICAgICBDQ0NSLlRFU1QgfCAgIDAgICAgfCAgICAgMCAgICAgIHwgICAgIDAgICAgICB8ICAgIDEgICAgIHwgICAgMQorICAgICBDQ0NSLk1PTiAgfCAgIDAgICAgfCAgICAgMCAgICAgIHwgICAgIDEgICAgICB8ICAgIDEgICAgIHwgICAgMAorICAgICBURVNULkxCQ0sgfCAgIDAgICAgfCAgICAgMCAgICAgIHwgICAgIDAgICAgICB8ICAgIDEgICAgIHwgICAgMQorICAgICBDQ0NSLkFTTSAgfCAgIDAgICAgfCAgICAgMSAgICAgIHwgICAgIDAgICAgICB8ICAgIDAgICAgIHwgICAgMAorICAqLworICBpZiAoaGZkY2FuLT5Jbml0Lk1vZGUgPT0gRkRDQU5fTU9ERV9SRVNUUklDVEVEX09QRVJBVElPTikgeworICAgIC8qIEVuYWJsZSBSZXN0cmljdGVkIE9wZXJhdGlvbiBtb2RlICovCisgICAgU0VUX0JJVChoZmRjYW4tPkluc3RhbmNlLT5DQ0NSLCBGRENBTl9DQ0NSX0FTTSk7CisgIH0gZWxzZSBpZiAoaGZkY2FuLT5Jbml0Lk1vZGUgIT0gRkRDQU5fTU9ERV9OT1JNQUwpIHsKKyAgICBpZiAoaGZkY2FuLT5Jbml0Lk1vZGUgIT0gRkRDQU5fTU9ERV9CVVNfTU9OSVRPUklORykgeworICAgICAgLyogRW5hYmxlIHdyaXRlIGFjY2VzcyB0byBURVNUIHJlZ2lzdGVyICovCisgICAgICBTRVRfQklUKGhmZGNhbi0+SW5zdGFuY2UtPkNDQ1IsIEZEQ0FOX0NDQ1JfVEVTVCk7CisKKyAgICAgIC8qIEVuYWJsZSBMb29wQmFjayBtb2RlICovCisgICAgICBTRVRfQklUKGhmZGNhbi0+SW5zdGFuY2UtPlRFU1QsIEZEQ0FOX1RFU1RfTEJDSyk7CisKKyAgICAgIGlmIChoZmRjYW4tPkluaXQuTW9kZSA9PSBGRENBTl9NT0RFX0lOVEVSTkFMX0xPT1BCQUNLKSB7CisgICAgICAgIFNFVF9CSVQoaGZkY2FuLT5JbnN0YW5jZS0+Q0NDUiwgRkRDQU5fQ0NDUl9NT04pOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvKiBFbmFibGUgYnVzIG1vbml0b3JpbmcgbW9kZSAqLworICAgICAgU0VUX0JJVChoZmRjYW4tPkluc3RhbmNlLT5DQ0NSLCBGRENBTl9DQ0NSX01PTik7CisgICAgfQorICB9IGVsc2UgeworICAgIC8qIE5vdGhpbmcgdG8gZG86IG5vcm1hbCBtb2RlICovCisgIH0KKworICAvKiBTZXQgdGhlIG5vbWluYWwgYml0IHRpbWluZyByZWdpc3RlciAqLworICBoZmRjYW4tPkluc3RhbmNlLT5OQlRQID0KKyAgICAgICgoKCh1aW50MzJfdCloZmRjYW4tPkluaXQuTm9taW5hbFN5bmNKdW1wV2lkdGggLSAxVSkKKyAgICAgICAgPDwgRkRDQU5fTkJUUF9OU0pXX1BvcykgfAorICAgICAgICgoKHVpbnQzMl90KWhmZGNhbi0+SW5pdC5Ob21pbmFsVGltZVNlZzEgLSAxVSkKKyAgICAgICAgPDwgRkRDQU5fTkJUUF9OVFNFRzFfUG9zKSB8CisgICAgICAgKCgodWludDMyX3QpaGZkY2FuLT5Jbml0Lk5vbWluYWxUaW1lU2VnMiAtIDFVKQorICAgICAgICA8PCBGRENBTl9OQlRQX05UU0VHMl9Qb3MpIHwKKyAgICAgICAoKCh1aW50MzJfdCloZmRjYW4tPkluaXQuTm9taW5hbFByZXNjYWxlciAtIDFVKSA8PCBGRENBTl9OQlRQX05CUlBfUG9zKSk7CisKKyAgLyogSWYgRkQgb3BlcmF0aW9uIHdpdGggQlJTIGlzIHNlbGVjdGVkLCBzZXQgdGhlIGRhdGEgYml0IHRpbWluZyByZWdpc3RlciAqLworICBpZiAoaGZkY2FuLT5Jbml0LkZyYW1lRm9ybWF0ID09IEZEQ0FOX0ZSQU1FX0ZEX0JSUykgeworICAgIGhmZGNhbi0+SW5zdGFuY2UtPkRCVFAgPQorICAgICAgICAoKCgodWludDMyX3QpaGZkY2FuLT5Jbml0LkRhdGFTeW5jSnVtcFdpZHRoIC0gMVUpCisgICAgICAgICAgPDwgRkRDQU5fREJUUF9EU0pXX1BvcykgfAorICAgICAgICAgKCgodWludDMyX3QpaGZkY2FuLT5Jbml0LkRhdGFUaW1lU2VnMSAtIDFVKSA8PCBGRENBTl9EQlRQX0RUU0VHMV9Qb3MpIHwKKyAgICAgICAgICgoKHVpbnQzMl90KWhmZGNhbi0+SW5pdC5EYXRhVGltZVNlZzIgLSAxVSkgPDwgRkRDQU5fREJUUF9EVFNFRzJfUG9zKSB8CisgICAgICAgICAoKCh1aW50MzJfdCloZmRjYW4tPkluaXQuRGF0YVByZXNjYWxlciAtIDFVKSA8PCBGRENBTl9EQlRQX0RCUlBfUG9zKSk7CisgIH0KKworICAvKiBTZWxlY3QgYmV0d2VlbiBUeCBGSUZPIGFuZCBUeCBRdWV1ZSBvcGVyYXRpb24gbW9kZXMgKi8KKyAgU0VUX0JJVChoZmRjYW4tPkluc3RhbmNlLT5UWEJDLCBoZmRjYW4tPkluaXQuVHhGaWZvUXVldWVNb2RlKTsKKworICAvKiBDYWxjdWxhdGUgZWFjaCBSQU0gYmxvY2sgYWRkcmVzcyAqLworICBGRENBTl9DYWxjdWx0YXRlUmFtQmxvY2tBZGRyZXNzZXMoaGZkY2FuKTsKKworICAvKiBJbml0aWFsaXplIHRoZSBMYXRlc3QgVHggcmVxdWVzdCBidWZmZXIgaW5kZXggKi8KKyAgaGZkY2FuLT5MYXRlc3RUeEZpZm9RUmVxdWVzdCA9IDBVOworCisgIC8qIEluaXRpYWxpemUgdGhlIGVycm9yIGNvZGUgKi8KKyAgaGZkY2FuLT5FcnJvckNvZGUgPSBIQUxfRkRDQU5fRVJST1JfTk9ORTsKKworICAvKiBJbml0aWFsaXplIHRoZSBGRENBTiBzdGF0ZSAqLworICBoZmRjYW4tPlN0YXRlID0gSEFMX0ZEQ0FOX1NUQVRFX1JFQURZOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgIERlaW5pdGlhbGl6ZXMgdGhlIEZEQ0FOIHBlcmlwaGVyYWwgcmVnaXN0ZXJzIHRvIHRoZWlyIGRlZmF1bHQgcmVzZXQKKyAqIHZhbHVlcy4KKyAqIEBwYXJhbSAgaGZkY2FuIHBvaW50ZXIgdG8gYW4gRkRDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBGRENBTi4KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fRGVJbml0KEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbikgeworICAvKiBDaGVjayBGRENBTiBoYW5kbGUgKi8KKyAgaWYgKGhmZGNhbiA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIGZ1bmN0aW9uIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0ZEQ0FOX0FMTF9JTlNUQU5DRShoZmRjYW4tPkluc3RhbmNlKSk7CisKKyAgLyogU3RvcCB0aGUgRkRDQU4gbW9kdWxlOiByZXR1cm4gdmFsdWUgaXMgdm9sdW50YXJ5IGlnbm9yZWQgKi8KKyAgKHZvaWQpSEFMX0ZEQ0FOX1N0b3AoaGZkY2FuKTsKKworICAvKiBEaXNhYmxlIEludGVycnVwdCBsaW5lcyAqLworICBDTEVBUl9CSVQoaGZkY2FuLT5JbnN0YW5jZS0+SUxFLAorICAgICAgICAgICAgKEZEQ0FOX0lOVEVSUlVQVF9MSU5FMCB8IEZEQ0FOX0lOVEVSUlVQVF9MSU5FMSkpOworCisjaWYgVVNFX0hBTF9GRENBTl9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMQorICBpZiAoaGZkY2FuLT5Nc3BEZUluaXRDYWxsYmFjayA9PSBOVUxMKSB7CisgICAgaGZkY2FuLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9GRENBTl9Nc3BEZUluaXQ7IC8qIExlZ2FjeSB3ZWFrIE1zcERlSW5pdCAqLworICB9CisKKyAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmU6IENMT0NLLCBOVklDICovCisgIGhmZGNhbi0+TXNwRGVJbml0Q2FsbGJhY2soaGZkY2FuKTsKKyNlbHNlCisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlOiBDTE9DSywgTlZJQyAqLworICBIQUxfRkRDQU5fTXNwRGVJbml0KGhmZGNhbik7CisjZW5kaWYgLyogVVNFX0hBTF9GRENBTl9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworICAvKiBSZXNldCB0aGUgRkRDQU4gRXJyb3JDb2RlICovCisgIGhmZGNhbi0+RXJyb3JDb2RlID0gSEFMX0ZEQ0FOX0VSUk9SX05PTkU7CisKKyAgLyogQ2hhbmdlIEZEQ0FOIHN0YXRlICovCisgIGhmZGNhbi0+U3RhdGUgPSBIQUxfRkRDQU5fU1RBVEVfUkVTRVQ7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIEZEQ0FOIE1TUC4KKyAqIEBwYXJhbSAgaGZkY2FuIHBvaW50ZXIgdG8gYW4gRkRDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBGRENBTi4KKyAqIEByZXR2YWwgTm9uZQorICovCitfX3dlYWsgdm9pZCBIQUxfRkRDQU5fTXNwSW5pdChGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pIHsKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGZkY2FuKTsKKyAgLyogTk9URTogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0ZEQ0FOX01zcEluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZXMgdGhlIEZEQ0FOIE1TUC4KKyAqIEBwYXJhbSAgaGZkY2FuIHBvaW50ZXIgdG8gYW4gRkRDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBGRENBTi4KKyAqIEByZXR2YWwgTm9uZQorICovCitfX3dlYWsgdm9pZCBIQUxfRkRDQU5fTXNwRGVJbml0KEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbikgeworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoZmRjYW4pOworICAvKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfRkRDQU5fTXNwRGVJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICogQGJyaWVmICBFbnRlciBGRENBTiBwZXJpcGhlcmFsIGluIHNsZWVwIG1vZGUuCisgKiBAcGFyYW0gIGhmZGNhbiBwb2ludGVyIHRvIGFuIEZEQ0FOX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRkRDQU4uCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX0VudGVyUG93ZXJEb3duTW9kZShGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pIHsKKyAgdWludDMyX3QgdGlja3N0YXJ0OworCisgIC8qIFJlcXVlc3QgY2xvY2sgc3RvcCAqLworICBTRVRfQklUKGhmZGNhbi0+SW5zdGFuY2UtPkNDQ1IsIEZEQ0FOX0NDQ1JfQ1NSKTsKKworICAvKiBHZXQgdGljayAqLworICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgIC8qIFdhaXQgdW50aWwgRkRDQU4gaXMgcmVhZHkgZm9yIHBvd2VyIGRvd24gKi8KKyAgd2hpbGUgKChoZmRjYW4tPkluc3RhbmNlLT5DQ0NSICYgRkRDQU5fQ0NDUl9DU0EpID09IDBVKSB7CisgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IEZEQ0FOX1RJTUVPVVRfVkFMVUUpIHsKKyAgICAgIC8qIFVwZGF0ZSBlcnJvciBjb2RlICovCisgICAgICBoZmRjYW4tPkVycm9yQ29kZSB8PSBIQUxfRkRDQU5fRVJST1JfVElNRU9VVDsKKworICAgICAgLyogQ2hhbmdlIEZEQ0FOIHN0YXRlICovCisgICAgICBoZmRjYW4tPlN0YXRlID0gSEFMX0ZEQ0FOX1NUQVRFX0VSUk9SOworCisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgIEV4aXQgcG93ZXIgZG93biBtb2RlLgorICogQHBhcmFtICBoZmRjYW4gcG9pbnRlciB0byBhbiBGRENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZEQ0FOLgorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9FeGl0UG93ZXJEb3duTW9kZShGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pIHsKKyAgdWludDMyX3QgdGlja3N0YXJ0OworCisgIC8qIFJlc2V0IGNsb2NrIHN0b3AgcmVxdWVzdCAqLworICBDTEVBUl9CSVQoaGZkY2FuLT5JbnN0YW5jZS0+Q0NDUiwgRkRDQU5fQ0NDUl9DU1IpOworCisgIC8qIEdldCB0aWNrICovCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgLyogV2FpdCB1bnRpbCBGRENBTiBleGl0cyBzbGVlcCBtb2RlICovCisgIHdoaWxlICgoaGZkY2FuLT5JbnN0YW5jZS0+Q0NDUiAmIEZEQ0FOX0NDQ1JfQ1NBKSA9PSBGRENBTl9DQ0NSX0NTQSkgeworICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBGRENBTl9USU1FT1VUX1ZBTFVFKSB7CisgICAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLworICAgICAgaGZkY2FuLT5FcnJvckNvZGUgfD0gSEFMX0ZEQ0FOX0VSUk9SX1RJTUVPVVQ7CisKKyAgICAgIC8qIENoYW5nZSBGRENBTiBzdGF0ZSAqLworICAgICAgaGZkY2FuLT5TdGF0ZSA9IEhBTF9GRENBTl9TVEFURV9FUlJPUjsKKworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisgIH0KKworICAvKiBFbnRlciBub3JtYWwgb3BlcmF0aW9uICovCisgIENMRUFSX0JJVChoZmRjYW4tPkluc3RhbmNlLT5DQ0NSLCBGRENBTl9DQ0NSX0lOSVQpOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworI2lmIFVTRV9IQUxfRkRDQU5fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEKKy8qKgorICogQGJyaWVmICBSZWdpc3RlciBhIEZEQ0FOIENhbGxCYWNrLgorICogICAgICAgICBUbyBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHdlYWsgcHJlZGVmaW5lZCBjYWxsYmFjaworICogQHBhcmFtICBoZmRjYW4gcG9pbnRlciB0byBhIEZEQ0FOX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIEZEQ0FOIG1vZHVsZQorICogQHBhcmFtICBDYWxsYmFja0lEIElEIG9mIHRoZSBjYWxsYmFjayB0byBiZSByZWdpc3RlcmVkCisgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9GRENBTl9UWF9GSUZPX0VNUFRZX0NCX0lEIFR4IEZpZm8gRW1wdHkgY2FsbGJhY2sgSUQKKyAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX0ZEQ0FOX0hJR0hfUFJJT19NRVNTQUdFX0NCX0lEIEhpZ2ggcHJpb3JpdHkgbWVzc2FnZQorICogY2FsbGJhY2sgSUQKKyAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX0ZEQ0FOX1RJTUVTVEFNUF9XUkFQQVJPVU5EX0NCX0lEIFRpbWVzdGFtcCB3cmFwYXJvdW5kCisgKiBjYWxsYmFjayBJRAorICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfRkRDQU5fVElNRU9VVF9PQ0NVUlJFRF9DQl9JRCBUaW1lb3V0IG9jY3VycmVkCisgKiBjYWxsYmFjayBJRAorICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfRkRDQU5fRVJST1JfQ0FMTEJBQ0tfQ0JfSUQgRXJyb3IgY2FsbGJhY2sgSUQKKyAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX0ZEQ0FOX01TUElOSVRfQ0JfSUQgTXNwSW5pdCBjYWxsYmFjayBJRAorICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfRkRDQU5fTVNQREVJTklUX0NCX0lEIE1zcERlSW5pdCBjYWxsYmFjayBJRAorICogQHBhcmFtICBwQ2FsbGJhY2sgcG9pbnRlciB0byB0aGUgQ2FsbGJhY2sgZnVuY3Rpb24KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fUmVnaXN0ZXJDYWxsYmFjaygKKyAgICBGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4sIEhBTF9GRENBTl9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELAorICAgIHZvaWQgKCpwQ2FsbGJhY2spKEZEQ0FOX0hhbmRsZVR5cGVEZWYgKl9oRkRDQU4pKSB7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBpZiAocENhbGxiYWNrID09IE5VTEwpIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBoZmRjYW4tPkVycm9yQ29kZSB8PSBIQUxfRkRDQU5fRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICBpZiAoaGZkY2FuLT5TdGF0ZSA9PSBIQUxfRkRDQU5fU1RBVEVfUkVBRFkpIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpIHsKKyAgICAgIGNhc2UgSEFMX0ZEQ0FOX1RYX0ZJRk9fRU1QVFlfQ0JfSUQ6CisgICAgICAgIGhmZGNhbi0+VHhGaWZvRW1wdHlDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0ZEQ0FOX0hJR0hfUFJJT19NRVNTQUdFX0NCX0lEOgorICAgICAgICBoZmRjYW4tPkhpZ2hQcmlvcml0eU1lc3NhZ2VDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0ZEQ0FOX1RJTUVTVEFNUF9XUkFQQVJPVU5EX0NCX0lEOgorICAgICAgICBoZmRjYW4tPlRpbWVzdGFtcFdyYXBhcm91bmRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0ZEQ0FOX1RJTUVPVVRfT0NDVVJSRURfQ0JfSUQ6CisgICAgICAgIGhmZGNhbi0+VGltZW91dE9jY3VycmVkQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9GRENBTl9FUlJPUl9DQUxMQkFDS19DQl9JRDoKKyAgICAgICAgaGZkY2FuLT5FcnJvckNhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfRkRDQU5fTVNQSU5JVF9DQl9JRDoKKyAgICAgICAgaGZkY2FuLT5Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9GRENBTl9NU1BERUlOSVRfQ0JfSUQ6CisgICAgICAgIGhmZGNhbi0+TXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgaGZkY2FuLT5FcnJvckNvZGUgfD0gSEFMX0ZEQ0FOX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfSBlbHNlIGlmIChoZmRjYW4tPlN0YXRlID09IEhBTF9GRENBTl9TVEFURV9SRVNFVCkgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkgeworICAgICAgY2FzZSBIQUxfRkRDQU5fTVNQSU5JVF9DQl9JRDoKKyAgICAgICAgaGZkY2FuLT5Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9GRENBTl9NU1BERUlOSVRfQ0JfSUQ6CisgICAgICAgIGhmZGNhbi0+TXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgaGZkY2FuLT5FcnJvckNvZGUgfD0gSEFMX0ZEQ0FOX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBoZmRjYW4tPkVycm9yQ29kZSB8PSBIQUxfRkRDQU5fRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIEBicmllZiAgVW5yZWdpc3RlciBhIEZEQ0FOIENhbGxCYWNrLgorICogICAgICAgICBGRENBTiBjYWxsYmFjayBpcyByZWRpcmVjdGVkIHRvIHRoZSB3ZWFrIHByZWRlZmluZWQgY2FsbGJhY2sKKyAqIEBwYXJhbSAgaGZkY2FuIHBvaW50ZXIgdG8gYSBGRENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBGRENBTiBtb2R1bGUKKyAqIEBwYXJhbSAgQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgdW5yZWdpc3RlcmVkCisgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9GRENBTl9UWF9GSUZPX0VNUFRZX0NCX0lEIFR4IEZpZm8gRW1wdHkgY2FsbGJhY2sgSUQKKyAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX0ZEQ0FOX0hJR0hfUFJJT19NRVNTQUdFX0NCX0lEIEhpZ2ggcHJpb3JpdHkgbWVzc2FnZQorICogY2FsbGJhY2sgSUQKKyAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX0ZEQ0FOX1RJTUVTVEFNUF9XUkFQQVJPVU5EX0NCX0lEIFRpbWVzdGFtcCB3cmFwYXJvdW5kCisgKiBjYWxsYmFjayBJRAorICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfRkRDQU5fVElNRU9VVF9PQ0NVUlJFRF9DQl9JRCBUaW1lb3V0IG9jY3VycmVkCisgKiBjYWxsYmFjayBJRAorICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfRkRDQU5fRVJST1JfQ0FMTEJBQ0tfQ0JfSUQgRXJyb3IgY2FsbGJhY2sgSUQKKyAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX0ZEQ0FOX01TUElOSVRfQ0JfSUQgTXNwSW5pdCBjYWxsYmFjayBJRAorICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfRkRDQU5fTVNQREVJTklUX0NCX0lEIE1zcERlSW5pdCBjYWxsYmFjayBJRAorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9VblJlZ2lzdGVyQ2FsbGJhY2soCisgICAgRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLCBIQUxfRkRDQU5fQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCkgeworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgaWYgKGhmZGNhbi0+U3RhdGUgPT0gSEFMX0ZEQ0FOX1NUQVRFX1JFQURZKSB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKSB7CisgICAgICBjYXNlIEhBTF9GRENBTl9UWF9GSUZPX0VNUFRZX0NCX0lEOgorICAgICAgICBoZmRjYW4tPlR4Rmlmb0VtcHR5Q2FsbGJhY2sgPSBIQUxfRkRDQU5fVHhGaWZvRW1wdHlDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0ZEQ0FOX0hJR0hfUFJJT19NRVNTQUdFX0NCX0lEOgorICAgICAgICBoZmRjYW4tPkhpZ2hQcmlvcml0eU1lc3NhZ2VDYWxsYmFjayA9CisgICAgICAgICAgICBIQUxfRkRDQU5fSGlnaFByaW9yaXR5TWVzc2FnZUNhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfRkRDQU5fVElNRVNUQU1QX1dSQVBBUk9VTkRfQ0JfSUQ6CisgICAgICAgIGhmZGNhbi0+VGltZXN0YW1wV3JhcGFyb3VuZENhbGxiYWNrID0KKyAgICAgICAgICAgIEhBTF9GRENBTl9UaW1lc3RhbXBXcmFwYXJvdW5kQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9GRENBTl9USU1FT1VUX09DQ1VSUkVEX0NCX0lEOgorICAgICAgICBoZmRjYW4tPlRpbWVvdXRPY2N1cnJlZENhbGxiYWNrID0gSEFMX0ZEQ0FOX1RpbWVvdXRPY2N1cnJlZENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfRkRDQU5fRVJST1JfQ0FMTEJBQ0tfQ0JfSUQ6CisgICAgICAgIGhmZGNhbi0+RXJyb3JDYWxsYmFjayA9IEhBTF9GRENBTl9FcnJvckNhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfRkRDQU5fTVNQSU5JVF9DQl9JRDoKKyAgICAgICAgaGZkY2FuLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfRkRDQU5fTXNwSW5pdDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0ZEQ0FOX01TUERFSU5JVF9DQl9JRDoKKyAgICAgICAgaGZkY2FuLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9GRENBTl9Nc3BEZUluaXQ7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgaGZkY2FuLT5FcnJvckNvZGUgfD0gSEFMX0ZEQ0FOX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfSBlbHNlIGlmIChoZmRjYW4tPlN0YXRlID09IEhBTF9GRENBTl9TVEFURV9SRVNFVCkgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkgeworICAgICAgY2FzZSBIQUxfRkRDQU5fTVNQSU5JVF9DQl9JRDoKKyAgICAgICAgaGZkY2FuLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfRkRDQU5fTXNwSW5pdDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0ZEQ0FOX01TUERFSU5JVF9DQl9JRDoKKyAgICAgICAgaGZkY2FuLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9GRENBTl9Nc3BEZUluaXQ7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgaGZkY2FuLT5FcnJvckNvZGUgfD0gSEFMX0ZEQ0FOX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBoZmRjYW4tPkVycm9yQ29kZSB8PSBIQUxfRkRDQU5fRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIEBicmllZiAgUmVnaXN0ZXIgVHggRXZlbnQgRmlmbyBGRENBTiBDYWxsYmFjaworICogICAgICAgICBUbyBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHdlYWsgSEFMX0ZEQ0FOX1R4RXZlbnRGaWZvQ2FsbGJhY2soKQorICogcHJlZGVmaW5lZCBjYWxsYmFjaworICogQHBhcmFtICBoZmRjYW4gRkRDQU4gaGFuZGxlCisgKiBAcGFyYW0gIHBDYWxsYmFjayBwb2ludGVyIHRvIHRoZSBUeCBFdmVudCBGaWZvIENhbGxiYWNrIGZ1bmN0aW9uCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX1JlZ2lzdGVyVHhFdmVudEZpZm9DYWxsYmFjaygKKyAgICBGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4sIHBGRENBTl9UeEV2ZW50Rmlmb0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spIHsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIGlmIChwQ2FsbGJhY2sgPT0gTlVMTCkgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGhmZGNhbi0+RXJyb3JDb2RlIHw9IEhBTF9GRENBTl9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICBpZiAoaGZkY2FuLT5TdGF0ZSA9PSBIQUxfRkRDQU5fU1RBVEVfUkVBRFkpIHsKKyAgICBoZmRjYW4tPlR4RXZlbnRGaWZvQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgIH0gZWxzZSB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaGZkY2FuLT5FcnJvckNvZGUgfD0gSEFMX0ZEQ0FOX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBAYnJpZWYgIFVuUmVnaXN0ZXIgdGhlIFR4IEV2ZW50IEZpZm8gRkRDQU4gQ2FsbGJhY2sKKyAqICAgICAgICAgVHggRXZlbnQgRmlmbyBGRENBTiBDYWxsYmFjayBpcyByZWRpcmVjdGVkIHRvIHRoZSB3ZWFrCisgKiBIQUxfRkRDQU5fVHhFdmVudEZpZm9DYWxsYmFjaygpIHByZWRlZmluZWQgY2FsbGJhY2sKKyAqIEBwYXJhbSAgaGZkY2FuIEZEQ0FOIGhhbmRsZQorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9VblJlZ2lzdGVyVHhFdmVudEZpZm9DYWxsYmFjaygKKyAgICBGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pIHsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIGlmIChoZmRjYW4tPlN0YXRlID09IEhBTF9GRENBTl9TVEFURV9SRUFEWSkgeworICAgIGhmZGNhbi0+VHhFdmVudEZpZm9DYWxsYmFjayA9CisgICAgICAgIEhBTF9GRENBTl9UeEV2ZW50Rmlmb0NhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBUeEV2ZW50Rmlmb0NhbGxiYWNrICAqLworICB9IGVsc2UgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGhmZGNhbi0+RXJyb3JDb2RlIHw9IEhBTF9GRENBTl9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogQGJyaWVmICBSZWdpc3RlciBSeCBGaWZvIDAgRkRDQU4gQ2FsbGJhY2sKKyAqICAgICAgICAgVG8gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSB3ZWFrIEhBTF9GRENBTl9SeEZpZm8wQ2FsbGJhY2soKSBwcmVkZWZpbmVkCisgKiBjYWxsYmFjaworICogQHBhcmFtICBoZmRjYW4gRkRDQU4gaGFuZGxlCisgKiBAcGFyYW0gIHBDYWxsYmFjayBwb2ludGVyIHRvIHRoZSBSeCBGaWZvIDAgQ2FsbGJhY2sgZnVuY3Rpb24KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fUmVnaXN0ZXJSeEZpZm8wQ2FsbGJhY2soCisgICAgRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLCBwRkRDQU5fUnhGaWZvMENhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spIHsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIGlmIChwQ2FsbGJhY2sgPT0gTlVMTCkgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGhmZGNhbi0+RXJyb3JDb2RlIHw9IEhBTF9GRENBTl9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICBpZiAoaGZkY2FuLT5TdGF0ZSA9PSBIQUxfRkRDQU5fU1RBVEVfUkVBRFkpIHsKKyAgICBoZmRjYW4tPlJ4RmlmbzBDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgfSBlbHNlIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBoZmRjYW4tPkVycm9yQ29kZSB8PSBIQUxfRkRDQU5fRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIEBicmllZiAgVW5SZWdpc3RlciB0aGUgUnggRmlmbyAwIEZEQ0FOIENhbGxiYWNrCisgKiAgICAgICAgIFJ4IEZpZm8gMCBGRENBTiBDYWxsYmFjayBpcyByZWRpcmVjdGVkIHRvIHRoZSB3ZWFrCisgKiBIQUxfRkRDQU5fUnhGaWZvMENhbGxiYWNrKCkgcHJlZGVmaW5lZCBjYWxsYmFjaworICogQHBhcmFtICBoZmRjYW4gRkRDQU4gaGFuZGxlCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX1VuUmVnaXN0ZXJSeEZpZm8wQ2FsbGJhY2soCisgICAgRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuKSB7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBpZiAoaGZkY2FuLT5TdGF0ZSA9PSBIQUxfRkRDQU5fU1RBVEVfUkVBRFkpIHsKKyAgICBoZmRjYW4tPlJ4RmlmbzBDYWxsYmFjayA9CisgICAgICAgIEhBTF9GRENBTl9SeEZpZm8wQ2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIFJ4RmlmbzBDYWxsYmFjayAgKi8KKyAgfSBlbHNlIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBoZmRjYW4tPkVycm9yQ29kZSB8PSBIQUxfRkRDQU5fRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIEBicmllZiAgUmVnaXN0ZXIgUnggRmlmbyAxIEZEQ0FOIENhbGxiYWNrCisgKiAgICAgICAgIFRvIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgd2VhayBIQUxfRkRDQU5fUnhGaWZvMUNhbGxiYWNrKCkgcHJlZGVmaW5lZAorICogY2FsbGJhY2sKKyAqIEBwYXJhbSAgaGZkY2FuIEZEQ0FOIGhhbmRsZQorICogQHBhcmFtICBwQ2FsbGJhY2sgcG9pbnRlciB0byB0aGUgUnggRmlmbyAxIENhbGxiYWNrIGZ1bmN0aW9uCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX1JlZ2lzdGVyUnhGaWZvMUNhbGxiYWNrKAorICAgIEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwgcEZEQ0FOX1J4RmlmbzFDYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKSB7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBpZiAocENhbGxiYWNrID09IE5VTEwpIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBoZmRjYW4tPkVycm9yQ29kZSB8PSBIQUxfRkRDQU5fRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgaWYgKGhmZGNhbi0+U3RhdGUgPT0gSEFMX0ZEQ0FOX1NUQVRFX1JFQURZKSB7CisgICAgaGZkY2FuLT5SeEZpZm8xQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgIH0gZWxzZSB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaGZkY2FuLT5FcnJvckNvZGUgfD0gSEFMX0ZEQ0FOX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBAYnJpZWYgIFVuUmVnaXN0ZXIgdGhlIFJ4IEZpZm8gMSBGRENBTiBDYWxsYmFjaworICogICAgICAgICBSeCBGaWZvIDEgRkRDQU4gQ2FsbGJhY2sgaXMgcmVkaXJlY3RlZCB0byB0aGUgd2VhaworICogSEFMX0ZEQ0FOX1J4RmlmbzFDYWxsYmFjaygpIHByZWRlZmluZWQgY2FsbGJhY2sKKyAqIEBwYXJhbSAgaGZkY2FuIEZEQ0FOIGhhbmRsZQorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9VblJlZ2lzdGVyUnhGaWZvMUNhbGxiYWNrKAorICAgIEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbikgeworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgaWYgKGhmZGNhbi0+U3RhdGUgPT0gSEFMX0ZEQ0FOX1NUQVRFX1JFQURZKSB7CisgICAgaGZkY2FuLT5SeEZpZm8xQ2FsbGJhY2sgPQorICAgICAgICBIQUxfRkRDQU5fUnhGaWZvMUNhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBSeEZpZm8xQ2FsbGJhY2sgICovCisgIH0gZWxzZSB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaGZkY2FuLT5FcnJvckNvZGUgfD0gSEFMX0ZEQ0FOX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBAYnJpZWYgIFJlZ2lzdGVyIFR4IEJ1ZmZlciBDb21wbGV0ZSBGRENBTiBDYWxsYmFjaworICogICAgICAgICBUbyBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHdlYWsgSEFMX0ZEQ0FOX1R4QnVmZmVyQ29tcGxldGVDYWxsYmFjaygpCisgKiBwcmVkZWZpbmVkIGNhbGxiYWNrCisgKiBAcGFyYW0gIGhmZGNhbiBGRENBTiBoYW5kbGUKKyAqIEBwYXJhbSAgcENhbGxiYWNrIHBvaW50ZXIgdG8gdGhlIFR4IEJ1ZmZlciBDb21wbGV0ZSBDYWxsYmFjayBmdW5jdGlvbgorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9SZWdpc3RlclR4QnVmZmVyQ29tcGxldGVDYWxsYmFjaygKKyAgICBGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4sCisgICAgcEZEQ0FOX1R4QnVmZmVyQ29tcGxldGVDYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKSB7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBpZiAocENhbGxiYWNrID09IE5VTEwpIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBoZmRjYW4tPkVycm9yQ29kZSB8PSBIQUxfRkRDQU5fRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgaWYgKGhmZGNhbi0+U3RhdGUgPT0gSEFMX0ZEQ0FOX1NUQVRFX1JFQURZKSB7CisgICAgaGZkY2FuLT5UeEJ1ZmZlckNvbXBsZXRlQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgIH0gZWxzZSB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaGZkY2FuLT5FcnJvckNvZGUgfD0gSEFMX0ZEQ0FOX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBAYnJpZWYgIFVuUmVnaXN0ZXIgdGhlIFR4IEJ1ZmZlciBDb21wbGV0ZSBGRENBTiBDYWxsYmFjaworICogICAgICAgICBUeCBCdWZmZXIgQ29tcGxldGUgRkRDQU4gQ2FsbGJhY2sgaXMgcmVkaXJlY3RlZCB0bworICogICAgICAgICB0aGUgd2VhayBIQUxfRkRDQU5fVHhCdWZmZXJDb21wbGV0ZUNhbGxiYWNrKCkgcHJlZGVmaW5lZCBjYWxsYmFjaworICogQHBhcmFtICBoZmRjYW4gRkRDQU4gaGFuZGxlCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX1VuUmVnaXN0ZXJUeEJ1ZmZlckNvbXBsZXRlQ2FsbGJhY2soCisgICAgRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuKSB7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBpZiAoaGZkY2FuLT5TdGF0ZSA9PSBIQUxfRkRDQU5fU1RBVEVfUkVBRFkpIHsKKyAgICBoZmRjYW4tPlR4QnVmZmVyQ29tcGxldGVDYWxsYmFjayA9CisgICAgICAgIEhBTF9GRENBTl9UeEJ1ZmZlckNvbXBsZXRlQ2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR4QnVmZmVyQ29tcGxldGVDYWxsYmFjayAgKi8KKyAgfSBlbHNlIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBoZmRjYW4tPkVycm9yQ29kZSB8PSBIQUxfRkRDQU5fRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIEBicmllZiAgUmVnaXN0ZXIgVHggQnVmZmVyIEFib3J0IEZEQ0FOIENhbGxiYWNrCisgKiAgICAgICAgIFRvIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgd2VhayBIQUxfRkRDQU5fVHhCdWZmZXJBYm9ydENhbGxiYWNrKCkKKyAqIHByZWRlZmluZWQgY2FsbGJhY2sKKyAqIEBwYXJhbSAgaGZkY2FuIEZEQ0FOIGhhbmRsZQorICogQHBhcmFtICBwQ2FsbGJhY2sgcG9pbnRlciB0byB0aGUgVHggQnVmZmVyIEFib3J0IENhbGxiYWNrIGZ1bmN0aW9uCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX1JlZ2lzdGVyVHhCdWZmZXJBYm9ydENhbGxiYWNrKAorICAgIEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwKKyAgICBwRkRDQU5fVHhCdWZmZXJBYm9ydENhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spIHsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIGlmIChwQ2FsbGJhY2sgPT0gTlVMTCkgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGhmZGNhbi0+RXJyb3JDb2RlIHw9IEhBTF9GRENBTl9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICBpZiAoaGZkY2FuLT5TdGF0ZSA9PSBIQUxfRkRDQU5fU1RBVEVfUkVBRFkpIHsKKyAgICBoZmRjYW4tPlR4QnVmZmVyQWJvcnRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgfSBlbHNlIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBoZmRjYW4tPkVycm9yQ29kZSB8PSBIQUxfRkRDQU5fRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIEBicmllZiAgVW5SZWdpc3RlciB0aGUgVHggQnVmZmVyIEFib3J0IEZEQ0FOIENhbGxiYWNrCisgKiAgICAgICAgIFR4IEJ1ZmZlciBBYm9ydCBGRENBTiBDYWxsYmFjayBpcyByZWRpcmVjdGVkIHRvCisgKiAgICAgICAgIHRoZSB3ZWFrIEhBTF9GRENBTl9UeEJ1ZmZlckFib3J0Q2FsbGJhY2soKSBwcmVkZWZpbmVkIGNhbGxiYWNrCisgKiBAcGFyYW0gIGhmZGNhbiBGRENBTiBoYW5kbGUKKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fVW5SZWdpc3RlclR4QnVmZmVyQWJvcnRDYWxsYmFjaygKKyAgICBGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pIHsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIGlmIChoZmRjYW4tPlN0YXRlID09IEhBTF9GRENBTl9TVEFURV9SRUFEWSkgeworICAgIGhmZGNhbi0+VHhCdWZmZXJBYm9ydENhbGxiYWNrID0KKyAgICAgICAgSEFMX0ZEQ0FOX1R4QnVmZmVyQWJvcnRDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgVHhCdWZmZXJBYm9ydENhbGxiYWNrICovCisgIH0gZWxzZSB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaGZkY2FuLT5FcnJvckNvZGUgfD0gSEFMX0ZEQ0FOX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBAYnJpZWYgIFJlZ2lzdGVyIEVycm9yIFN0YXR1cyBGRENBTiBDYWxsYmFjaworICogICAgICAgICBUbyBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHdlYWsgSEFMX0ZEQ0FOX0Vycm9yU3RhdHVzQ2FsbGJhY2soKQorICogcHJlZGVmaW5lZCBjYWxsYmFjaworICogQHBhcmFtICBoZmRjYW4gRkRDQU4gaGFuZGxlCisgKiBAcGFyYW0gIHBDYWxsYmFjayBwb2ludGVyIHRvIHRoZSBFcnJvciBTdGF0dXMgQ2FsbGJhY2sgZnVuY3Rpb24KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fUmVnaXN0ZXJFcnJvclN0YXR1c0NhbGxiYWNrKAorICAgIEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwgcEZEQ0FOX0Vycm9yU3RhdHVzQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjaykgeworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgaWYgKHBDYWxsYmFjayA9PSBOVUxMKSB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaGZkY2FuLT5FcnJvckNvZGUgfD0gSEFMX0ZEQ0FOX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIGlmIChoZmRjYW4tPlN0YXRlID09IEhBTF9GRENBTl9TVEFURV9SRUFEWSkgeworICAgIGhmZGNhbi0+RXJyb3JTdGF0dXNDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgfSBlbHNlIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBoZmRjYW4tPkVycm9yQ29kZSB8PSBIQUxfRkRDQU5fRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIEBicmllZiAgVW5SZWdpc3RlciB0aGUgRXJyb3IgU3RhdHVzIEZEQ0FOIENhbGxiYWNrCisgKiAgICAgICAgIEVycm9yIFN0YXR1cyBGRENBTiBDYWxsYmFjayBpcyByZWRpcmVjdGVkIHRvIHRoZSB3ZWFrCisgKiBIQUxfRkRDQU5fRXJyb3JTdGF0dXNDYWxsYmFjaygpIHByZWRlZmluZWQgY2FsbGJhY2sKKyAqIEBwYXJhbSAgaGZkY2FuIEZEQ0FOIGhhbmRsZQorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9VblJlZ2lzdGVyRXJyb3JTdGF0dXNDYWxsYmFjaygKKyAgICBGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pIHsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIGlmIChoZmRjYW4tPlN0YXRlID09IEhBTF9GRENBTl9TVEFURV9SRUFEWSkgeworICAgIGhmZGNhbi0+RXJyb3JTdGF0dXNDYWxsYmFjayA9CisgICAgICAgIEhBTF9GRENBTl9FcnJvclN0YXR1c0NhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBFcnJvclN0YXR1c0NhbGxiYWNrICAqLworICB9IGVsc2UgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGhmZGNhbi0+RXJyb3JDb2RlIHw9IEhBTF9GRENBTl9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorCisgIHJldHVybiBzdGF0dXM7Cit9CisKKyNlbmRpZiAvKiBVU0VfSEFMX0ZEQ0FOX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBGRENBTl9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgICogIEBicmllZiAgICBGRENBTiBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucy4KKyAgKgorQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAjIyMjIyBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICAgKCspIEhBTF9GRENBTl9Db25maWdGaWx0ZXIgICAgICAgICAgICAgICAgICA6IENvbmZpZ3VyZSB0aGUgRkRDQU4KK3JlY2VwdGlvbiBmaWx0ZXJzCisgICAgICAoKykgSEFMX0ZEQ0FOX0NvbmZpZ0dsb2JhbEZpbHRlciAgICAgICAgICAgIDogQ29uZmlndXJlIHRoZSBGRENBTiBnbG9iYWwKK2ZpbHRlcgorICAgICAgKCspIEhBTF9GRENBTl9Db25maWdFeHRlbmRlZElkTWFzayAgICAgICAgICA6IENvbmZpZ3VyZSB0aGUgZXh0ZW5kZWQgSUQKK21hc2sKKyAgICAgICgrKSBIQUxfRkRDQU5fQ29uZmlnUnhGaWZvT3ZlcndyaXRlICAgICAgICAgOiBDb25maWd1cmUgdGhlIFJ4IEZJRk8KK29wZXJhdGlvbiBtb2RlCisgICAgICAoKykgSEFMX0ZEQ0FOX0NvbmZpZ1JhbVdhdGNoZG9nICAgICAgICAgICAgIDogQ29uZmlndXJlIHRoZSBSQU0gd2F0Y2hkb2cKKyAgICAgICgrKSBIQUxfRkRDQU5fQ29uZmlnVGltZXN0YW1wQ291bnRlciAgICAgICAgOiBDb25maWd1cmUgdGhlIHRpbWVzdGFtcAorY291bnRlcgorICAgICAgICAoKykgSEFMX0ZEQ0FOX0VuYWJsZVRpbWVzdGFtcENvdW50ZXIgICAgICAgIDogRW5hYmxlIHRoZSB0aW1lc3RhbXAKK2NvdW50ZXIKKyAgICAgICAgKCspIEhBTF9GRENBTl9EaXNhYmxlVGltZXN0YW1wQ291bnRlciAgICAgICA6IERpc2FibGUgdGhlIHRpbWVzdGFtcAorY291bnRlcgorICAgICAgICAoKykgSEFMX0ZEQ0FOX0dldFRpbWVzdGFtcENvdW50ZXIgICAgICAgICAgIDogR2V0IHRoZSB0aW1lc3RhbXAgY291bnRlcgordmFsdWUKKyAgICAgICAgKCspIEhBTF9GRENBTl9SZXNldFRpbWVzdGFtcENvdW50ZXIgICAgICAgICA6IFJlc2V0IHRoZSB0aW1lc3RhbXAKK2NvdW50ZXIgdG8gemVybworICAgICAgKCspIEhBTF9GRENBTl9Db25maWdUaW1lb3V0Q291bnRlciAgICAgICAgICA6IENvbmZpZ3VyZSB0aGUgdGltZW91dAorY291bnRlcgorICAgICAgICAoKykgSEFMX0ZEQ0FOX0VuYWJsZVRpbWVvdXRDb3VudGVyICAgICAgICAgIDogRW5hYmxlIHRoZSB0aW1lb3V0IGNvdW50ZXIKKyAgICAgICAgKCspIEhBTF9GRENBTl9EaXNhYmxlVGltZW91dENvdW50ZXIgICAgICAgICA6IERpc2FibGUgdGhlIHRpbWVvdXQKK2NvdW50ZXIKKyAgICAgICAgKCspIEhBTF9GRENBTl9HZXRUaW1lb3V0Q291bnRlciAgICAgICAgICAgICA6IEdldCB0aGUgdGltZW91dCBjb3VudGVyCit2YWx1ZQorICAgICAgICAoKykgSEFMX0ZEQ0FOX1Jlc2V0VGltZW91dENvdW50ZXIgICAgICAgICAgIDogUmVzZXQgdGhlIHRpbWVvdXQgY291bnRlcgordG8gaXRzIHN0YXJ0IHZhbHVlCisgICAgICAoKykgSEFMX0ZEQ0FOX0NvbmZpZ1R4RGVsYXlDb21wZW5zYXRpb24gICAgIDogQ29uZmlndXJlIHRoZSB0cmFuc21pdHRlcgorZGVsYXkgY29tcGVuc2F0aW9uCisgICAgICAgICgrKSBIQUxfRkRDQU5fRW5hYmxlVHhEZWxheUNvbXBlbnNhdGlvbiAgICAgOiBFbmFibGUgdGhlIHRyYW5zbWl0dGVyCitkZWxheSBjb21wZW5zYXRpb24KKyAgICAgICAgKCspIEhBTF9GRENBTl9EaXNhYmxlVHhEZWxheUNvbXBlbnNhdGlvbiAgICA6IERpc2FibGUgdGhlIHRyYW5zbWl0dGVyCitkZWxheSBjb21wZW5zYXRpb24KKyAgICAgICgrKSBIQUxfRkRDQU5fRW5hYmxlSVNPTW9kZSAgICAgICAgICAgICAgICAgOiBFbmFibGUgSVNPIDExODk4LTEgcHJvdG9jb2wKK21vZGUKKyAgICAgICgrKSBIQUxfRkRDQU5fRGlzYWJsZUlTT01vZGUgICAgICAgICAgICAgICAgOiBEaXNhYmxlIElTTyAxMTg5OC0xIHByb3RvY29sCittb2RlCisgICAgICAoKykgSEFMX0ZEQ0FOX0VuYWJsZUVkZ2VGaWx0ZXJpbmcgICAgICAgICAgIDogRW5hYmxlIGVkZ2UgZmlsdGVyaW5nIGR1cmluZworYnVzIGludGVncmF0aW9uCisgICAgICAoKykgSEFMX0ZEQ0FOX0Rpc2FibGVFZGdlRmlsdGVyaW5nICAgICAgICAgIDogRGlzYWJsZSBlZGdlIGZpbHRlcmluZworZHVyaW5nIGJ1cyBpbnRlZ3JhdGlvbgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBGRENBTiByZWNlcHRpb24gZmlsdGVyIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCisgKiAgICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIEZEQ0FOX0ZpbHRlclR5cGVEZWYgc3RydWN0dXJlLgorICogQHBhcmFtICBoZmRjYW4gcG9pbnRlciB0byBhbiBGRENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZEQ0FOLgorICogQHBhcmFtICBzRmlsdGVyQ29uZmlnIHBvaW50ZXIgdG8gYW4gRkRDQU5fRmlsdGVyVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdAorICogICAgICAgICBjb250YWlucyB0aGUgZmlsdGVyIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fQ29uZmlnRmlsdGVyKAorICAgIEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwgY29uc3QgRkRDQU5fRmlsdGVyVHlwZURlZiAqc0ZpbHRlckNvbmZpZykgeworICB1aW50MzJfdCBGaWx0ZXJFbGVtZW50VzE7CisgIHVpbnQzMl90IEZpbHRlckVsZW1lbnRXMjsKKyAgdWludDMyX3QgKkZpbHRlckFkZHJlc3M7CisgIEhBTF9GRENBTl9TdGF0ZVR5cGVEZWYgc3RhdGUgPSBoZmRjYW4tPlN0YXRlOworCisgIGlmICgoc3RhdGUgPT0gSEFMX0ZEQ0FOX1NUQVRFX1JFQURZKSB8fCAoc3RhdGUgPT0gSEFMX0ZEQ0FOX1NUQVRFX0JVU1kpKSB7CisgICAgLyogQ2hlY2sgZnVuY3Rpb24gcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19GRENBTl9JRF9UWVBFKHNGaWx0ZXJDb25maWctPklkVHlwZSkpOworICAgIGFzc2VydF9wYXJhbShJU19GRENBTl9GSUxURVJfQ0ZHKHNGaWx0ZXJDb25maWctPkZpbHRlckNvbmZpZykpOworCisgICAgaWYgKHNGaWx0ZXJDb25maWctPklkVHlwZSA9PSBGRENBTl9TVEFOREFSRF9JRCkgeworICAgICAgLyogQ2hlY2sgZnVuY3Rpb24gcGFyYW1ldGVycyAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX0ZEQ0FOX01BWF9WQUxVRSgoc0ZpbHRlckNvbmZpZy0+RmlsdGVySW5kZXggKyAxVSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhmZGNhbi0+SW5pdC5TdGRGaWx0ZXJzTmJyKSk7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfRkRDQU5fTUFYX1ZBTFVFKHNGaWx0ZXJDb25maWctPkZpbHRlcklEMSwgMHg3RkZVKSk7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfRkRDQU5fTUFYX1ZBTFVFKHNGaWx0ZXJDb25maWctPkZpbHRlcklEMiwgMHg3RkZVKSk7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfRkRDQU5fU1REX0ZJTFRFUl9UWVBFKHNGaWx0ZXJDb25maWctPkZpbHRlclR5cGUpKTsKKworICAgICAgLyogQnVpbGQgZmlsdGVyIGVsZW1lbnQgKi8KKyAgICAgIEZpbHRlckVsZW1lbnRXMSA9CisgICAgICAgICAgKChzRmlsdGVyQ29uZmlnLT5GaWx0ZXJUeXBlIDw8IDMwVSkgfAorICAgICAgICAgICAoc0ZpbHRlckNvbmZpZy0+RmlsdGVyQ29uZmlnIDw8IDI3VSkgfAorICAgICAgICAgICAoc0ZpbHRlckNvbmZpZy0+RmlsdGVySUQxIDw8IDE2VSkgfCBzRmlsdGVyQ29uZmlnLT5GaWx0ZXJJRDIpOworCisgICAgICAvKiBDYWxjdWxhdGUgZmlsdGVyIGFkZHJlc3MgKi8KKyAgICAgIEZpbHRlckFkZHJlc3MgPQorICAgICAgICAgICh1aW50MzJfdCAqKShoZmRjYW4tPm1zZ1JhbS5TdGFuZGFyZEZpbHRlclNBICsKKyAgICAgICAgICAgICAgICAgICAgICAgKHNGaWx0ZXJDb25maWctPkZpbHRlckluZGV4ICogU1JBTUNBTl9GTFNfU0laRSkpOworCisgICAgICAvKiBXcml0ZSBmaWx0ZXIgZWxlbWVudCB0byB0aGUgbWVzc2FnZSBSQU0gKi8KKyAgICAgICpGaWx0ZXJBZGRyZXNzID0gRmlsdGVyRWxlbWVudFcxOworICAgIH0gZWxzZSAvKiBzRmlsdGVyQ29uZmlnLT5JZFR5cGUgPT0gRkRDQU5fRVhURU5ERURfSUQgKi8KKyAgICB7CisgICAgICAvKiBDaGVjayBmdW5jdGlvbiBwYXJhbWV0ZXJzICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfRkRDQU5fTUFYX1ZBTFVFKChzRmlsdGVyQ29uZmlnLT5GaWx0ZXJJbmRleCArIDFVKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGZkY2FuLT5Jbml0LkV4dEZpbHRlcnNOYnIpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19GRENBTl9NQVhfVkFMVUUoc0ZpbHRlckNvbmZpZy0+RmlsdGVySUQxLCAweDFGRkZGRkZGVSkpOworICAgICAgYXNzZXJ0X3BhcmFtKElTX0ZEQ0FOX01BWF9WQUxVRShzRmlsdGVyQ29uZmlnLT5GaWx0ZXJJRDIsIDB4MUZGRkZGRkZVKSk7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfRkRDQU5fRVhUX0ZJTFRFUl9UWVBFKHNGaWx0ZXJDb25maWctPkZpbHRlclR5cGUpKTsKKworICAgICAgLyogQnVpbGQgZmlyc3Qgd29yZCBvZiBmaWx0ZXIgZWxlbWVudCAqLworICAgICAgRmlsdGVyRWxlbWVudFcxID0KKyAgICAgICAgICAoKHNGaWx0ZXJDb25maWctPkZpbHRlckNvbmZpZyA8PCAyOVUpIHwgc0ZpbHRlckNvbmZpZy0+RmlsdGVySUQxKTsKKworICAgICAgLyogQnVpbGQgc2Vjb25kIHdvcmQgb2YgZmlsdGVyIGVsZW1lbnQgKi8KKyAgICAgIEZpbHRlckVsZW1lbnRXMiA9CisgICAgICAgICAgKChzRmlsdGVyQ29uZmlnLT5GaWx0ZXJUeXBlIDw8IDMwVSkgfCBzRmlsdGVyQ29uZmlnLT5GaWx0ZXJJRDIpOworCisgICAgICAvKiBDYWxjdWxhdGUgZmlsdGVyIGFkZHJlc3MgKi8KKyAgICAgIEZpbHRlckFkZHJlc3MgPQorICAgICAgICAgICh1aW50MzJfdCAqKShoZmRjYW4tPm1zZ1JhbS5FeHRlbmRlZEZpbHRlclNBICsKKyAgICAgICAgICAgICAgICAgICAgICAgKHNGaWx0ZXJDb25maWctPkZpbHRlckluZGV4ICogU1JBTUNBTl9GTEVfU0laRSkpOworCisgICAgICAvKiBXcml0ZSBmaWx0ZXIgZWxlbWVudCB0byB0aGUgbWVzc2FnZSBSQU0gKi8KKyAgICAgICpGaWx0ZXJBZGRyZXNzID0gRmlsdGVyRWxlbWVudFcxOworICAgICAgRmlsdGVyQWRkcmVzcysrOworICAgICAgKkZpbHRlckFkZHJlc3MgPSBGaWx0ZXJFbGVtZW50VzI7CisgICAgfQorCisgICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICAgIHJldHVybiBIQUxfT0s7CisgIH0gZWxzZSB7CisgICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8KKyAgICBoZmRjYW4tPkVycm9yQ29kZSB8PSBIQUxfRkRDQU5fRVJST1JfTk9UX0lOSVRJQUxJWkVEOworCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorfQorCisvKioKKyAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBGRENBTiBnbG9iYWwgZmlsdGVyLgorICogQHBhcmFtICBoZmRjYW4gcG9pbnRlciB0byBhbiBGRENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZEQ0FOLgorICogQHBhcmFtICBOb25NYXRjaGluZ1N0ZCBEZWZpbmVzIGhvdyByZWNlaXZlZCBtZXNzYWdlcyB3aXRoIDExLWJpdCBJRHMgdGhhdAorICogICAgICAgICBkbyBub3QgbWF0Y2ggYW55IGVsZW1lbnQgb2YgdGhlIGZpbHRlciBsaXN0IGFyZSB0cmVhdGVkLgorICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAYXJnIEZEQ0FOX05vbl9NYXRjaGluZ19GcmFtZXMuCisgKiBAcGFyYW0gIE5vbk1hdGNoaW5nRXh0IERlZmluZXMgaG93IHJlY2VpdmVkIG1lc3NhZ2VzIHdpdGggMjktYml0IElEcyB0aGF0CisgKiAgICAgICAgIGRvIG5vdCBtYXRjaCBhbnkgZWxlbWVudCBvZiB0aGUgZmlsdGVyIGxpc3QgYXJlIHRyZWF0ZWQuCisgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEBhcmcgRkRDQU5fTm9uX01hdGNoaW5nX0ZyYW1lcy4KKyAqIEBwYXJhbSAgUmVqZWN0UmVtb3RlU3RkIEZpbHRlciBvciByZWplY3QgYWxsIHRoZSByZW1vdGUgMTEtYml0IElEcyBmcmFtZXMuCisgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEBhcmcgRkRDQU5fUmVqZWN0X1JlbW90ZV9GcmFtZXMuCisgKiBAcGFyYW0gIFJlamVjdFJlbW90ZUV4dCBGaWx0ZXIgb3IgcmVqZWN0IGFsbCB0aGUgcmVtb3RlIDI5LWJpdCBJRHMgZnJhbWVzLgorICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAYXJnIEZEQ0FOX1JlamVjdF9SZW1vdGVfRnJhbWVzLgorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9Db25maWdHbG9iYWxGaWx0ZXIoRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBOb25NYXRjaGluZ1N0ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgTm9uTWF0Y2hpbmdFeHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFJlamVjdFJlbW90ZVN0ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUmVqZWN0UmVtb3RlRXh0KSB7CisgIC8qIENoZWNrIGZ1bmN0aW9uIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0ZEQ0FOX05PTl9NQVRDSElORyhOb25NYXRjaGluZ1N0ZCkpOworICBhc3NlcnRfcGFyYW0oSVNfRkRDQU5fTk9OX01BVENISU5HKE5vbk1hdGNoaW5nRXh0KSk7CisgIGFzc2VydF9wYXJhbShJU19GRENBTl9SRUpFQ1RfUkVNT1RFKFJlamVjdFJlbW90ZVN0ZCkpOworICBhc3NlcnRfcGFyYW0oSVNfRkRDQU5fUkVKRUNUX1JFTU9URShSZWplY3RSZW1vdGVFeHQpKTsKKworICBpZiAoaGZkY2FuLT5TdGF0ZSA9PSBIQUxfRkRDQU5fU1RBVEVfUkVBRFkpIHsKKyAgICAvKiBDb25maWd1cmUgZ2xvYmFsIGZpbHRlciAqLworICAgIE1PRElGWV9SRUcoaGZkY2FuLT5JbnN0YW5jZS0+UlhHRkMsCisgICAgICAgICAgICAgICAoRkRDQU5fUlhHRkNfQU5GUyB8IEZEQ0FOX1JYR0ZDX0FORkUgfCBGRENBTl9SWEdGQ19SUkZTIHwKKyAgICAgICAgICAgICAgICBGRENBTl9SWEdGQ19SUkZFKSwKKyAgICAgICAgICAgICAgICgoTm9uTWF0Y2hpbmdTdGQgPDwgRkRDQU5fUlhHRkNfQU5GU19Qb3MpIHwKKyAgICAgICAgICAgICAgICAoTm9uTWF0Y2hpbmdFeHQgPDwgRkRDQU5fUlhHRkNfQU5GRV9Qb3MpIHwKKyAgICAgICAgICAgICAgICAoUmVqZWN0UmVtb3RlU3RkIDw8IEZEQ0FOX1JYR0ZDX1JSRlNfUG9zKSB8CisgICAgICAgICAgICAgICAgKFJlamVjdFJlbW90ZUV4dCA8PCBGRENBTl9SWEdGQ19SUkZFX1BvcykpKTsKKworICAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgICByZXR1cm4gSEFMX09LOworICB9IGVsc2UgeworICAgIC8qIFVwZGF0ZSBlcnJvciBjb2RlICovCisgICAgaGZkY2FuLT5FcnJvckNvZGUgfD0gSEFMX0ZEQ0FOX0VSUk9SX05PVF9SRUFEWTsKKworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KK30KKworLyoqCisgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgZXh0ZW5kZWQgSUQgbWFzay4KKyAqIEBwYXJhbSAgaGZkY2FuIHBvaW50ZXIgdG8gYW4gRkRDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBGRENBTi4KKyAqIEBwYXJhbSAgTWFzayBFeHRlbmRlZCBJRCBNYXNrLgorICogICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMHgxRkZGRkZGRi4KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fQ29uZmlnRXh0ZW5kZWRJZE1hc2soRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE1hc2spIHsKKyAgLyogQ2hlY2sgZnVuY3Rpb24gcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfRkRDQU5fTUFYX1ZBTFVFKE1hc2ssIDB4MUZGRkZGRkZVKSk7CisKKyAgaWYgKGhmZGNhbi0+U3RhdGUgPT0gSEFMX0ZEQ0FOX1NUQVRFX1JFQURZKSB7CisgICAgLyogQ29uZmlndXJlIHRoZSBleHRlbmRlZCBJRCBtYXNrICovCisgICAgaGZkY2FuLT5JbnN0YW5jZS0+WElEQU0gPSBNYXNrOworCisgICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICAgIHJldHVybiBIQUxfT0s7CisgIH0gZWxzZSB7CisgICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8KKyAgICBoZmRjYW4tPkVycm9yQ29kZSB8PSBIQUxfRkRDQU5fRVJST1JfTk9UX1JFQURZOworCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorfQorCisvKioKKyAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBSeCBGSUZPIG9wZXJhdGlvbiBtb2RlLgorICogQHBhcmFtICBoZmRjYW4gcG9pbnRlciB0byBhbiBGRENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZEQ0FOLgorICogQHBhcmFtICBSeEZpZm8gUnggRklGTy4KKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICBAYXJnIEZEQ0FOX1JYX0ZJRk8wOiBSeCBGSUZPIDAKKyAqICAgICAgICAgICBAYXJnIEZEQ0FOX1JYX0ZJRk8xOiBSeCBGSUZPIDEKKyAqIEBwYXJhbSAgT3BlcmF0aW9uTW9kZSBvcGVyYXRpb24gbW9kZS4KKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQGFyZyBGRENBTl9SeF9GSUZPX29wZXJhdGlvbl9tb2RlLgorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9Db25maWdSeEZpZm9PdmVyd3JpdGUoRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBSeEZpZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE9wZXJhdGlvbk1vZGUpIHsKKyAgLyogQ2hlY2sgZnVuY3Rpb24gcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfRkRDQU5fUlhfRklGTyhSeEZpZm8pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZEQ0FOX1JYX0ZJRk9fTU9ERShPcGVyYXRpb25Nb2RlKSk7CisKKyAgaWYgKGhmZGNhbi0+U3RhdGUgPT0gSEFMX0ZEQ0FOX1NUQVRFX1JFQURZKSB7CisgICAgaWYgKFJ4RmlmbyA9PSBGRENBTl9SWF9GSUZPMCkgeworICAgICAgLyogU2VsZWN0IEZJRk8gMCBPcGVyYXRpb24gTW9kZSAqLworICAgICAgTU9ESUZZX1JFRyhoZmRjYW4tPkluc3RhbmNlLT5SWEdGQywgRkRDQU5fUlhHRkNfRjBPTSwKKyAgICAgICAgICAgICAgICAgKE9wZXJhdGlvbk1vZGUgPDwgRkRDQU5fUlhHRkNfRjBPTV9Qb3MpKTsKKyAgICB9IGVsc2UgLyogUnhGaWZvID09IEZEQ0FOX1JYX0ZJRk8xICovCisgICAgeworICAgICAgLyogU2VsZWN0IEZJRk8gMSBPcGVyYXRpb24gTW9kZSAqLworICAgICAgTU9ESUZZX1JFRyhoZmRjYW4tPkluc3RhbmNlLT5SWEdGQywgRkRDQU5fUlhHRkNfRjFPTSwKKyAgICAgICAgICAgICAgICAgKE9wZXJhdGlvbk1vZGUgPDwgRkRDQU5fUlhHRkNfRjFPTV9Qb3MpKTsKKyAgICB9CisKKyAgICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfSBlbHNlIHsKKyAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLworICAgIGhmZGNhbi0+RXJyb3JDb2RlIHw9IEhBTF9GRENBTl9FUlJPUl9OT1RfUkVBRFk7CisKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9Cit9CisKKy8qKgorICogQGJyaWVmICBDb25maWd1cmUgdGhlIFJBTSB3YXRjaGRvZy4KKyAqIEBwYXJhbSAgaGZkY2FuIHBvaW50ZXIgdG8gYW4gRkRDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBGRENBTi4KKyAqIEBwYXJhbSAgQ291bnRlclN0YXJ0VmFsdWUgU3RhcnQgdmFsdWUgb2YgdGhlIE1lc3NhZ2UgUkFNIFdhdGNoZG9nIENvdW50ZXIsCisgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiAweDAwIGFuZCAweEZGLAorICogICAgICAgICB3aXRoIHRoZSByZXNldCB2YWx1ZSBvZiAweDAwIHRoZSBjb3VudGVyIGlzIGRpc2FibGVkLgorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9Db25maWdSYW1XYXRjaGRvZyhGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ291bnRlclN0YXJ0VmFsdWUpIHsKKyAgLyogQ2hlY2sgZnVuY3Rpb24gcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfRkRDQU5fTUFYX1ZBTFVFKENvdW50ZXJTdGFydFZhbHVlLCAweEZGVSkpOworCisgIGlmIChoZmRjYW4tPlN0YXRlID09IEhBTF9GRENBTl9TVEFURV9SRUFEWSkgeworICAgIC8qIENvbmZpZ3VyZSB0aGUgUkFNIHdhdGNoZG9nIGNvdW50ZXIgc3RhcnQgdmFsdWUgKi8KKyAgICBNT0RJRllfUkVHKGhmZGNhbi0+SW5zdGFuY2UtPlJXRCwgRkRDQU5fUldEX1dEQywgQ291bnRlclN0YXJ0VmFsdWUpOworCisgICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICAgIHJldHVybiBIQUxfT0s7CisgIH0gZWxzZSB7CisgICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8KKyAgICBoZmRjYW4tPkVycm9yQ29kZSB8PSBIQUxfRkRDQU5fRVJST1JfTk9UX1JFQURZOworCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorfQorCisvKioKKyAqIEBicmllZiAgQ29uZmlndXJlIHRoZSB0aW1lc3RhbXAgY291bnRlci4KKyAqIEBwYXJhbSAgaGZkY2FuIHBvaW50ZXIgdG8gYW4gRkRDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBGRENBTi4KKyAqIEBwYXJhbSAgVGltZXN0YW1wUHJlc2NhbGVyIFRpbWVzdGFtcCBDb3VudGVyIFByZXNjYWxlci4KKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQGFyZyBGRENBTl9UaW1lc3RhbXBfUHJlc2NhbGVyLgorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9Db25maWdUaW1lc3RhbXBDb3VudGVyKAorICAgIEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwgdWludDMyX3QgVGltZXN0YW1wUHJlc2NhbGVyKSB7CisgIC8qIENoZWNrIGZ1bmN0aW9uIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0ZEQ0FOX1RJTUVTVEFNUF9QUkVTQ0FMRVIoVGltZXN0YW1wUHJlc2NhbGVyKSk7CisKKyAgaWYgKGhmZGNhbi0+U3RhdGUgPT0gSEFMX0ZEQ0FOX1NUQVRFX1JFQURZKSB7CisgICAgLyogQ29uZmlndXJlIHByZXNjYWxlciAqLworICAgIE1PRElGWV9SRUcoaGZkY2FuLT5JbnN0YW5jZS0+VFNDQywgRkRDQU5fVFNDQ19UQ1AsIFRpbWVzdGFtcFByZXNjYWxlcik7CisKKyAgICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfSBlbHNlIHsKKyAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLworICAgIGhmZGNhbi0+RXJyb3JDb2RlIHw9IEhBTF9GRENBTl9FUlJPUl9OT1RfUkVBRFk7CisKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgdGhlIHRpbWVzdGFtcCBjb3VudGVyLgorICogQHBhcmFtICBoZmRjYW4gcG9pbnRlciB0byBhbiBGRENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZEQ0FOLgorICogQHBhcmFtICBUaW1lc3RhbXBPcGVyYXRpb24gVGltZXN0YW1wIGNvdW50ZXIgb3BlcmF0aW9uLgorICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAYXJnIEZEQ0FOX1RpbWVzdGFtcC4KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fRW5hYmxlVGltZXN0YW1wQ291bnRlcigKKyAgICBGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4sIHVpbnQzMl90IFRpbWVzdGFtcE9wZXJhdGlvbikgeworICAvKiBDaGVjayBmdW5jdGlvbiBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19GRENBTl9USU1FU1RBTVAoVGltZXN0YW1wT3BlcmF0aW9uKSk7CisKKyAgaWYgKGhmZGNhbi0+U3RhdGUgPT0gSEFMX0ZEQ0FOX1NUQVRFX1JFQURZKSB7CisgICAgLyogRW5hYmxlIHRpbWVzdGFtcCBjb3VudGVyICovCisgICAgTU9ESUZZX1JFRyhoZmRjYW4tPkluc3RhbmNlLT5UU0NDLCBGRENBTl9UU0NDX1RTUywgVGltZXN0YW1wT3BlcmF0aW9uKTsKKworICAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgICByZXR1cm4gSEFMX09LOworICB9IGVsc2UgeworICAgIC8qIFVwZGF0ZSBlcnJvciBjb2RlICovCisgICAgaGZkY2FuLT5FcnJvckNvZGUgfD0gSEFMX0ZEQ0FOX0VSUk9SX05PVF9SRUFEWTsKKworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgdGhlIHRpbWVzdGFtcCBjb3VudGVyLgorICogQHBhcmFtICBoZmRjYW4gcG9pbnRlciB0byBhbiBGRENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZEQ0FOLgorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9EaXNhYmxlVGltZXN0YW1wQ291bnRlcigKKyAgICBGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pIHsKKyAgaWYgKGhmZGNhbi0+U3RhdGUgPT0gSEFMX0ZEQ0FOX1NUQVRFX1JFQURZKSB7CisgICAgLyogRGlzYWJsZSB0aW1lc3RhbXAgY291bnRlciAqLworICAgIENMRUFSX0JJVChoZmRjYW4tPkluc3RhbmNlLT5UU0NDLCBGRENBTl9UU0NDX1RTUyk7CisKKyAgICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfSBlbHNlIHsKKyAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLworICAgIGhmZGNhbi0+RXJyb3JDb2RlIHw9IEhBTF9GRENBTl9FUlJPUl9OT1RfUkVBRFk7CisKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgdGhlIHRpbWVzdGFtcCBjb3VudGVyIHZhbHVlLgorICogQHBhcmFtICBoZmRjYW4gcG9pbnRlciB0byBhbiBGRENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZEQ0FOLgorICogQHJldHZhbCBUaW1lc3RhbXAgY291bnRlciB2YWx1ZQorICovCit1aW50MTZfdCBIQUxfRkRDQU5fR2V0VGltZXN0YW1wQ291bnRlcihjb25zdCBGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pIHsKKyAgcmV0dXJuICh1aW50MTZfdCkoaGZkY2FuLT5JbnN0YW5jZS0+VFNDVik7Cit9CisKKy8qKgorICogQGJyaWVmICBSZXNldCB0aGUgdGltZXN0YW1wIGNvdW50ZXIgdG8gemVyby4KKyAqIEBwYXJhbSAgaGZkY2FuIHBvaW50ZXIgdG8gYW4gRkRDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBGRENBTi4KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fUmVzZXRUaW1lc3RhbXBDb3VudGVyKEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbikgeworICBpZiAoKGhmZGNhbi0+SW5zdGFuY2UtPlRTQ0MgJiBGRENBTl9UU0NDX1RTUykgIT0gRkRDQU5fVElNRVNUQU1QX0VYVEVSTkFMKSB7CisgICAgLyogUmVzZXQgdGltZXN0YW1wIGNvdW50ZXIuCisgICAgICAgQWN0dWFsbHkgYW55IHdyaXRlIG9wZXJhdGlvbiB0byBUU0NWIGNsZWFycyB0aGUgY291bnRlciAqLworICAgIENMRUFSX1JFRyhoZmRjYW4tPkluc3RhbmNlLT5UU0NWKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBVcGRhdGUgZXJyb3IgY29kZS4KKyAgICAgICBVbmFibGUgdG8gcmVzZXQgZXh0ZXJuYWwgY291bnRlciAqLworICAgIGhmZGNhbi0+RXJyb3JDb2RlIHw9IEhBTF9GRENBTl9FUlJPUl9OT1RfU1VQUE9SVEVEOworCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgdGltZW91dCBjb3VudGVyLgorICogQHBhcmFtICBoZmRjYW4gcG9pbnRlciB0byBhbiBGRENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZEQ0FOLgorICogQHBhcmFtICBUaW1lb3V0T3BlcmF0aW9uIFRpbWVvdXQgY291bnRlciBvcGVyYXRpb24uCisgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEBhcmcgRkRDQU5fVGltZW91dF9PcGVyYXRpb24uCisgKiBAcGFyYW0gIFRpbWVvdXRQZXJpb2QgU3RhcnQgdmFsdWUgb2YgdGhlIHRpbWVvdXQgZG93bi1jb3VudGVyLgorICogICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gMHgwMDAwIGFuZCAweEZGRkYKKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fQ29uZmlnVGltZW91dENvdW50ZXIoRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVvdXRPcGVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZW91dFBlcmlvZCkgeworICAvKiBDaGVjayBmdW5jdGlvbiBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19GRENBTl9USU1FT1VUKFRpbWVvdXRPcGVyYXRpb24pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZEQ0FOX01BWF9WQUxVRShUaW1lb3V0UGVyaW9kLCAweEZGRkZVKSk7CisKKyAgaWYgKGhmZGNhbi0+U3RhdGUgPT0gSEFMX0ZEQ0FOX1NUQVRFX1JFQURZKSB7CisgICAgLyogU2VsZWN0IHRpbWVvdXQgb3BlcmF0aW9uIGFuZCBjb25maWd1cmUgcGVyaW9kICovCisgICAgTU9ESUZZX1JFRyhoZmRjYW4tPkluc3RhbmNlLT5UT0NDLCAoRkRDQU5fVE9DQ19UT1MgfCBGRENBTl9UT0NDX1RPUCksCisgICAgICAgICAgICAgICAoVGltZW91dE9wZXJhdGlvbiB8IChUaW1lb3V0UGVyaW9kIDw8IEZEQ0FOX1RPQ0NfVE9QX1BvcykpKTsKKworICAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgICByZXR1cm4gSEFMX09LOworICB9IGVsc2UgeworICAgIC8qIFVwZGF0ZSBlcnJvciBjb2RlICovCisgICAgaGZkY2FuLT5FcnJvckNvZGUgfD0gSEFMX0ZEQ0FOX0VSUk9SX05PVF9SRUFEWTsKKworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSB0aGUgdGltZW91dCBjb3VudGVyLgorICogQHBhcmFtICBoZmRjYW4gcG9pbnRlciB0byBhbiBGRENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZEQ0FOLgorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9FbmFibGVUaW1lb3V0Q291bnRlcihGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pIHsKKyAgaWYgKGhmZGNhbi0+U3RhdGUgPT0gSEFMX0ZEQ0FOX1NUQVRFX1JFQURZKSB7CisgICAgLyogRW5hYmxlIHRpbWVvdXQgY291bnRlciAqLworICAgIFNFVF9CSVQoaGZkY2FuLT5JbnN0YW5jZS0+VE9DQywgRkRDQU5fVE9DQ19FVE9DKTsKKworICAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgICByZXR1cm4gSEFMX09LOworICB9IGVsc2UgeworICAgIC8qIFVwZGF0ZSBlcnJvciBjb2RlICovCisgICAgaGZkY2FuLT5FcnJvckNvZGUgfD0gSEFMX0ZEQ0FOX0VSUk9SX05PVF9SRUFEWTsKKworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgdGhlIHRpbWVvdXQgY291bnRlci4KKyAqIEBwYXJhbSAgaGZkY2FuIHBvaW50ZXIgdG8gYW4gRkRDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBGRENBTi4KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fRGlzYWJsZVRpbWVvdXRDb3VudGVyKEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbikgeworICBpZiAoaGZkY2FuLT5TdGF0ZSA9PSBIQUxfRkRDQU5fU1RBVEVfUkVBRFkpIHsKKyAgICAvKiBEaXNhYmxlIHRpbWVvdXQgY291bnRlciAqLworICAgIENMRUFSX0JJVChoZmRjYW4tPkluc3RhbmNlLT5UT0NDLCBGRENBTl9UT0NDX0VUT0MpOworCisgICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICAgIHJldHVybiBIQUxfT0s7CisgIH0gZWxzZSB7CisgICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8KKyAgICBoZmRjYW4tPkVycm9yQ29kZSB8PSBIQUxfRkRDQU5fRVJST1JfTk9UX1JFQURZOworCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorfQorCisvKioKKyAqIEBicmllZiAgR2V0IHRoZSB0aW1lb3V0IGNvdW50ZXIgdmFsdWUuCisgKiBAcGFyYW0gIGhmZGNhbiBwb2ludGVyIHRvIGFuIEZEQ0FOX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRkRDQU4uCisgKiBAcmV0dmFsIFRpbWVvdXQgY291bnRlciB2YWx1ZQorICovCit1aW50MTZfdCBIQUxfRkRDQU5fR2V0VGltZW91dENvdW50ZXIoY29uc3QgRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuKSB7CisgIHJldHVybiAodWludDE2X3QpKGhmZGNhbi0+SW5zdGFuY2UtPlRPQ1YpOworfQorCisvKioKKyAqIEBicmllZiAgUmVzZXQgdGhlIHRpbWVvdXQgY291bnRlciB0byBpdHMgc3RhcnQgdmFsdWUuCisgKiBAcGFyYW0gIGhmZGNhbiBwb2ludGVyIHRvIGFuIEZEQ0FOX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRkRDQU4uCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX1Jlc2V0VGltZW91dENvdW50ZXIoRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuKSB7CisgIGlmICgoaGZkY2FuLT5JbnN0YW5jZS0+VE9DQyAmIEZEQ0FOX1RPQ0NfVE9TKSA9PSBGRENBTl9USU1FT1VUX0NPTlRJTlVPVVMpIHsKKyAgICAvKiBSZXNldCB0aW1lb3V0IGNvdW50ZXIgdG8gc3RhcnQgdmFsdWUgKi8KKyAgICBDTEVBUl9SRUcoaGZkY2FuLT5JbnN0YW5jZS0+VE9DVik7CisKKyAgICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfSBlbHNlIHsKKyAgICAvKiBVcGRhdGUgZXJyb3IgY29kZS4KKyAgICAgICBVbmFibGUgdG8gcmVzZXQgY291bnRlcjogY29udHJvbGxlZCBvbmx5IGJ5IEZJRk8gZW1wdHkgc3RhdGUgKi8KKyAgICBoZmRjYW4tPkVycm9yQ29kZSB8PSBIQUxfRkRDQU5fRVJST1JfTk9UX1NVUFBPUlRFRDsKKworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KK30KKworLyoqCisgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgdHJhbnNtaXR0ZXIgZGVsYXkgY29tcGVuc2F0aW9uLgorICogQHBhcmFtICBoZmRjYW4gcG9pbnRlciB0byBhbiBGRENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZEQ0FOLgorICogQHBhcmFtICBUZGNPZmZzZXQgVHJhbnNtaXR0ZXIgRGVsYXkgQ29tcGVuc2F0aW9uIE9mZnNldC4KKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIDB4MDAgYW5kIDB4N0YuCisgKiBAcGFyYW0gIFRkY0ZpbHRlciBUcmFuc21pdHRlciBEZWxheSBDb21wZW5zYXRpb24gRmlsdGVyIFdpbmRvdyBMZW5ndGguCisgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiAweDAwIGFuZCAweDdGLgorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9Db25maWdUeERlbGF5Q29tcGVuc2F0aW9uKAorICAgIEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwgdWludDMyX3QgVGRjT2Zmc2V0LCB1aW50MzJfdCBUZGNGaWx0ZXIpIHsKKyAgLyogQ2hlY2sgZnVuY3Rpb24gcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfRkRDQU5fTUFYX1ZBTFVFKFRkY09mZnNldCwgMHg3RlUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZEQ0FOX01BWF9WQUxVRShUZGNGaWx0ZXIsIDB4N0ZVKSk7CisKKyAgaWYgKGhmZGNhbi0+U3RhdGUgPT0gSEFMX0ZEQ0FOX1NUQVRFX1JFQURZKSB7CisgICAgLyogQ29uZmlndXJlIFREQyBvZmZzZXQgYW5kIGZpbHRlciB3aW5kb3cgKi8KKyAgICBoZmRjYW4tPkluc3RhbmNlLT5URENSID0gKChUZGNGaWx0ZXIgPDwgRkRDQU5fVERDUl9URENGX1BvcykgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFRkY09mZnNldCA8PCBGRENBTl9URENSX1REQ09fUG9zKSk7CisKKyAgICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfSBlbHNlIHsKKyAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLworICAgIGhmZGNhbi0+RXJyb3JDb2RlIHw9IEhBTF9GRENBTl9FUlJPUl9OT1RfUkVBRFk7CisKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgdGhlIHRyYW5zbWl0dGVyIGRlbGF5IGNvbXBlbnNhdGlvbi4KKyAqIEBwYXJhbSAgaGZkY2FuIHBvaW50ZXIgdG8gYW4gRkRDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBGRENBTi4KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fRW5hYmxlVHhEZWxheUNvbXBlbnNhdGlvbigKKyAgICBGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pIHsKKyAgaWYgKGhmZGNhbi0+U3RhdGUgPT0gSEFMX0ZEQ0FOX1NUQVRFX1JFQURZKSB7CisgICAgLyogRW5hYmxlIHRyYW5zbWl0dGVyIGRlbGF5IGNvbXBlbnNhdGlvbiAqLworICAgIFNFVF9CSVQoaGZkY2FuLT5JbnN0YW5jZS0+REJUUCwgRkRDQU5fREJUUF9UREMpOworCisgICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICAgIHJldHVybiBIQUxfT0s7CisgIH0gZWxzZSB7CisgICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8KKyAgICBoZmRjYW4tPkVycm9yQ29kZSB8PSBIQUxfRkRDQU5fRVJST1JfTk9UX1JFQURZOworCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSB0aGUgdHJhbnNtaXR0ZXIgZGVsYXkgY29tcGVuc2F0aW9uLgorICogQHBhcmFtICBoZmRjYW4gcG9pbnRlciB0byBhbiBGRENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZEQ0FOLgorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9EaXNhYmxlVHhEZWxheUNvbXBlbnNhdGlvbigKKyAgICBGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pIHsKKyAgaWYgKGhmZGNhbi0+U3RhdGUgPT0gSEFMX0ZEQ0FOX1NUQVRFX1JFQURZKSB7CisgICAgLyogRGlzYWJsZSB0cmFuc21pdHRlciBkZWxheSBjb21wZW5zYXRpb24gKi8KKyAgICBDTEVBUl9CSVQoaGZkY2FuLT5JbnN0YW5jZS0+REJUUCwgRkRDQU5fREJUUF9UREMpOworCisgICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICAgIHJldHVybiBIQUxfT0s7CisgIH0gZWxzZSB7CisgICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8KKyAgICBoZmRjYW4tPkVycm9yQ29kZSB8PSBIQUxfRkRDQU5fRVJST1JfTk9UX1JFQURZOworCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIElTTyAxMTg5OC0xIHByb3RvY29sIG1vZGUuCisgKiAgICAgICAgIENBTiBGRCBmcmFtZSBmb3JtYXQgaXMgYWNjb3JkaW5nIHRvIElTTyAxMTg5OC0xIHN0YW5kYXJkLgorICogQHBhcmFtICBoZmRjYW4gcG9pbnRlciB0byBhbiBGRENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZEQ0FOLgorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9FbmFibGVJU09Nb2RlKEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbikgeworICBpZiAoaGZkY2FuLT5TdGF0ZSA9PSBIQUxfRkRDQU5fU1RBVEVfUkVBRFkpIHsKKyAgICAvKiBEaXNhYmxlIE5vbiBJU08gcHJvdG9jb2wgbW9kZSAqLworICAgIENMRUFSX0JJVChoZmRjYW4tPkluc3RhbmNlLT5DQ0NSLCBGRENBTl9DQ0NSX05JU08pOworCisgICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICAgIHJldHVybiBIQUxfT0s7CisgIH0gZWxzZSB7CisgICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8KKyAgICBoZmRjYW4tPkVycm9yQ29kZSB8PSBIQUxfRkRDQU5fRVJST1JfTk9UX1JFQURZOworCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBJU08gMTE4OTgtMSBwcm90b2NvbCBtb2RlLgorICogICAgICAgICBDQU4gRkQgZnJhbWUgZm9ybWF0IGlzIGFjY29yZGluZyB0byBCb3NjaCBDQU4gRkQgc3BlY2lmaWNhdGlvbiBWMS4wLgorICogQHBhcmFtICBoZmRjYW4gcG9pbnRlciB0byBhbiBGRENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZEQ0FOLgorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9EaXNhYmxlSVNPTW9kZShGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pIHsKKyAgaWYgKGhmZGNhbi0+U3RhdGUgPT0gSEFMX0ZEQ0FOX1NUQVRFX1JFQURZKSB7CisgICAgLyogRW5hYmxlIE5vbiBJU08gcHJvdG9jb2wgbW9kZSAqLworICAgIFNFVF9CSVQoaGZkY2FuLT5JbnN0YW5jZS0+Q0NDUiwgRkRDQU5fQ0NDUl9OSVNPKTsKKworICAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgICByZXR1cm4gSEFMX09LOworICB9IGVsc2UgeworICAgIC8qIFVwZGF0ZSBlcnJvciBjb2RlICovCisgICAgaGZkY2FuLT5FcnJvckNvZGUgfD0gSEFMX0ZEQ0FOX0VSUk9SX05PVF9SRUFEWTsKKworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBlZGdlIGZpbHRlcmluZyBkdXJpbmcgYnVzIGludGVncmF0aW9uLgorICogICAgICAgICBUd28gY29uc2VjdXRpdmUgZG9taW5hbnQgdHEgYXJlIHJlcXVpcmVkIHRvIGRldGVjdCBhbiBlZGdlIGZvciBoYXJkCisgKiBzeW5jaHJvbml6YXRpb24uCisgKiBAcGFyYW0gIGhmZGNhbiBwb2ludGVyIHRvIGFuIEZEQ0FOX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRkRDQU4uCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX0VuYWJsZUVkZ2VGaWx0ZXJpbmcoRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuKSB7CisgIGlmIChoZmRjYW4tPlN0YXRlID09IEhBTF9GRENBTl9TVEFURV9SRUFEWSkgeworICAgIC8qIEVuYWJsZSBlZGdlIGZpbHRlcmluZyAqLworICAgIFNFVF9CSVQoaGZkY2FuLT5JbnN0YW5jZS0+Q0NDUiwgRkRDQU5fQ0NDUl9FRkJJKTsKKworICAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgICByZXR1cm4gSEFMX09LOworICB9IGVsc2UgeworICAgIC8qIFVwZGF0ZSBlcnJvciBjb2RlICovCisgICAgaGZkY2FuLT5FcnJvckNvZGUgfD0gSEFMX0ZEQ0FOX0VSUk9SX05PVF9SRUFEWTsKKworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgZWRnZSBmaWx0ZXJpbmcgZHVyaW5nIGJ1cyBpbnRlZ3JhdGlvbi4KKyAqICAgICAgICAgT25lIGRvbWluYW50IHRxIGlzIHJlcXVpcmVkIHRvIGRldGVjdCBhbiBlZGdlIGZvciBoYXJkCisgKiBzeW5jaHJvbml6YXRpb24uCisgKiBAcGFyYW0gIGhmZGNhbiBwb2ludGVyIHRvIGFuIEZEQ0FOX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRkRDQU4uCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX0Rpc2FibGVFZGdlRmlsdGVyaW5nKEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbikgeworICBpZiAoaGZkY2FuLT5TdGF0ZSA9PSBIQUxfRkRDQU5fU1RBVEVfUkVBRFkpIHsKKyAgICAvKiBEaXNhYmxlIGVkZ2UgZmlsdGVyaW5nICovCisgICAgQ0xFQVJfQklUKGhmZGNhbi0+SW5zdGFuY2UtPkNDQ1IsIEZEQ0FOX0NDQ1JfRUZCSSk7CisKKyAgICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfSBlbHNlIHsKKyAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLworICAgIGhmZGNhbi0+RXJyb3JDb2RlIHw9IEhBTF9GRENBTl9FUlJPUl9OT1RfUkVBRFk7CisKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9Cit9CisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEZEQ0FOX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiAgQGJyaWVmICAgIENvbnRyb2wgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgQ29udHJvbCBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBIQUxfRkRDQU5fU3RhcnQgICAgICAgICAgICAgICAgICAgICAgICAgOiBTdGFydCB0aGUgRkRDQU4gbW9kdWxlCisgICAgICAoKykgSEFMX0ZEQ0FOX1N0b3AgICAgICAgICAgICAgICAgICAgICAgICAgIDogU3RvcCB0aGUgRkRDQU4gbW9kdWxlIGFuZAorZW5hYmxlIGFjY2VzcyB0byBjb25maWd1cmF0aW9uIHJlZ2lzdGVycworICAgICAgKCspIEhBTF9GRENBTl9BZGRNZXNzYWdlVG9UeEZpZm9RICAgICAgICAgICA6IEFkZCBhIG1lc3NhZ2UgdG8gdGhlIFR4CitGSUZPL1F1ZXVlIGFuZCBhY3RpdmF0ZSB0aGUgY29ycmVzcG9uZGluZyB0cmFuc21pc3Npb24gcmVxdWVzdAorICAgICAgKCspIEhBTF9GRENBTl9HZXRMYXRlc3RUeEZpZm9RUmVxdWVzdEJ1ZmZlciA6IEdldCBUeCBidWZmZXIgaW5kZXggb2YKK2xhdGVzdCBUeCBGSUZPL1F1ZXVlIHJlcXVlc3QKKyAgICAgICgrKSBIQUxfRkRDQU5fQWJvcnRUeFJlcXVlc3QgICAgICAgICAgICAgICAgOiBBYm9ydCB0cmFuc21pc3Npb24gcmVxdWVzdAorICAgICAgKCspIEhBTF9GRENBTl9HZXRSeE1lc3NhZ2UgICAgICAgICAgICAgICAgICA6IEdldCBhbiBGRENBTiBmcmFtZSBmcm9tIHRoZQorUnggRklGTyB6b25lIGludG8gdGhlIG1lc3NhZ2UgUkFNCisgICAgICAoKykgSEFMX0ZEQ0FOX0dldFR4RXZlbnQgICAgICAgICAgICAgICAgICAgIDogR2V0IGFuIEZEQ0FOIFR4IGV2ZW50IGZyb20KK3RoZSBUeCBFdmVudCBGSUZPIHpvbmUgaW50byB0aGUgbWVzc2FnZSBSQU0KKyAgICAgICgrKSBIQUxfRkRDQU5fR2V0SGlnaFByaW9yaXR5TWVzc2FnZVN0YXR1cyAgOiBHZXQgaGlnaCBwcmlvcml0eSBtZXNzYWdlCitzdGF0dXMKKyAgICAgICgrKSBIQUxfRkRDQU5fR2V0UHJvdG9jb2xTdGF0dXMgICAgICAgICAgICAgOiBHZXQgcHJvdG9jb2wgc3RhdHVzCisgICAgICAoKykgSEFMX0ZEQ0FOX0dldEVycm9yQ291bnRlcnMgICAgICAgICAgICAgIDogR2V0IGVycm9yIGNvdW50ZXIgdmFsdWVzCisgICAgICAoKykgSEFMX0ZEQ0FOX0lzVHhCdWZmZXJNZXNzYWdlUGVuZGluZyAgICAgIDogQ2hlY2sgaWYgYSB0cmFuc21pc3Npb24KK3JlcXVlc3QgaXMgcGVuZGluZyBvbiB0aGUgc2VsZWN0ZWQgVHggYnVmZmVyCisgICAgICAoKykgSEFMX0ZEQ0FOX0dldFJ4Rmlmb0ZpbGxMZXZlbCAgICAgICAgICAgIDogUmV0dXJuIFJ4IEZJRk8gZmlsbCBsZXZlbAorICAgICAgKCspIEhBTF9GRENBTl9HZXRUeEZpZm9GcmVlTGV2ZWwgICAgICAgICAgICA6IFJldHVybiBUeCBGSUZPIGZyZWUgbGV2ZWwKKyAgICAgICgrKSBIQUxfRkRDQU5fSXNSZXN0cmljdGVkT3BlcmF0aW9uTW9kZSAgICAgOiBDaGVjayBpZiB0aGUgRkRDQU4KK3BlcmlwaGVyYWwgZW50ZXJlZCBSZXN0cmljdGVkIE9wZXJhdGlvbiBNb2RlCisgICAgICAoKykgSEFMX0ZEQ0FOX0V4aXRSZXN0cmljdGVkT3BlcmF0aW9uTW9kZSAgIDogRXhpdCBSZXN0cmljdGVkIE9wZXJhdGlvbgorTW9kZQorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAqIEBicmllZiAgU3RhcnQgdGhlIEZEQ0FOIG1vZHVsZS4KKyAqIEBwYXJhbSAgaGZkY2FuIHBvaW50ZXIgdG8gYW4gRkRDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBGRENBTi4KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fU3RhcnQoRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuKSB7CisgIGlmIChoZmRjYW4tPlN0YXRlID09IEhBTF9GRENBTl9TVEFURV9SRUFEWSkgeworICAgIC8qIENoYW5nZSBGRENBTiBwZXJpcGhlcmFsIHN0YXRlICovCisgICAgaGZkY2FuLT5TdGF0ZSA9IEhBTF9GRENBTl9TVEFURV9CVVNZOworCisgICAgLyogUmVxdWVzdCBsZWF2ZSBpbml0aWFsaXNhdGlvbiAqLworICAgIENMRUFSX0JJVChoZmRjYW4tPkluc3RhbmNlLT5DQ0NSLCBGRENBTl9DQ0NSX0lOSVQpOworCisgICAgLyogUmVzZXQgdGhlIEZEQ0FOIEVycm9yQ29kZSAqLworICAgIGhmZGNhbi0+RXJyb3JDb2RlID0gSEFMX0ZEQ0FOX0VSUk9SX05PTkU7CisKKyAgICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfSBlbHNlIHsKKyAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLworICAgIGhmZGNhbi0+RXJyb3JDb2RlIHw9IEhBTF9GRENBTl9FUlJPUl9OT1RfUkVBRFk7CisKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9Cit9CisKKy8qKgorICogQGJyaWVmICBTdG9wIHRoZSBGRENBTiBtb2R1bGUgYW5kIGVuYWJsZSBhY2Nlc3MgdG8gY29uZmlndXJhdGlvbiByZWdpc3RlcnMuCisgKiBAcGFyYW0gIGhmZGNhbiBwb2ludGVyIHRvIGFuIEZEQ0FOX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRkRDQU4uCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX1N0b3AoRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuKSB7CisgIHVpbnQzMl90IENvdW50ZXIgPSAwVTsKKworICBpZiAoaGZkY2FuLT5TdGF0ZSA9PSBIQUxfRkRDQU5fU1RBVEVfQlVTWSkgeworICAgIC8qIFJlcXVlc3QgaW5pdGlhbGlzYXRpb24gKi8KKyAgICBTRVRfQklUKGhmZGNhbi0+SW5zdGFuY2UtPkNDQ1IsIEZEQ0FOX0NDQ1JfSU5JVCk7CisKKyAgICAvKiBXYWl0IHVudGlsIHRoZSBJTklUIGJpdCBpbnRvIENDQ1IgcmVnaXN0ZXIgaXMgc2V0ICovCisgICAgd2hpbGUgKChoZmRjYW4tPkluc3RhbmNlLT5DQ0NSICYgRkRDQU5fQ0NDUl9JTklUKSA9PSAwVSkgeworICAgICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovCisgICAgICBpZiAoQ291bnRlciA+IEZEQ0FOX1RJTUVPVVRfVkFMVUUpIHsKKyAgICAgICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgaGZkY2FuLT5FcnJvckNvZGUgfD0gSEFMX0ZEQ0FOX0VSUk9SX1RJTUVPVVQ7CisKKyAgICAgICAgLyogQ2hhbmdlIEZEQ0FOIHN0YXRlICovCisgICAgICAgIGhmZGNhbi0+U3RhdGUgPSBIQUxfRkRDQU5fU1RBVEVfRVJST1I7CisKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKworICAgICAgLyogSW5jcmVtZW50IGNvdW50ZXIgKi8KKyAgICAgIENvdW50ZXIrKzsKKyAgICB9CisKKyAgICAvKiBSZXNldCBjb3VudGVyICovCisgICAgQ291bnRlciA9IDBVOworCisgICAgLyogRXhpdCBmcm9tIFNsZWVwIG1vZGUgKi8KKyAgICBDTEVBUl9CSVQoaGZkY2FuLT5JbnN0YW5jZS0+Q0NDUiwgRkRDQU5fQ0NDUl9DU1IpOworCisgICAgLyogV2FpdCB1bnRpbCBGRENBTiBleGl0cyBzbGVlcCBtb2RlICovCisgICAgd2hpbGUgKChoZmRjYW4tPkluc3RhbmNlLT5DQ0NSICYgRkRDQU5fQ0NDUl9DU0EpID09IEZEQ0FOX0NDQ1JfQ1NBKSB7CisgICAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8KKyAgICAgIGlmIChDb3VudGVyID4gRkRDQU5fVElNRU9VVF9WQUxVRSkgeworICAgICAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLworICAgICAgICBoZmRjYW4tPkVycm9yQ29kZSB8PSBIQUxfRkRDQU5fRVJST1JfVElNRU9VVDsKKworICAgICAgICAvKiBDaGFuZ2UgRkRDQU4gc3RhdGUgKi8KKyAgICAgICAgaGZkY2FuLT5TdGF0ZSA9IEhBTF9GRENBTl9TVEFURV9FUlJPUjsKKworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorCisgICAgICAvKiBJbmNyZW1lbnQgY291bnRlciAqLworICAgICAgQ291bnRlcisrOworICAgIH0KKworICAgIC8qIEVuYWJsZSBjb25maWd1cmF0aW9uIGNoYW5nZSAqLworICAgIFNFVF9CSVQoaGZkY2FuLT5JbnN0YW5jZS0+Q0NDUiwgRkRDQU5fQ0NDUl9DQ0UpOworCisgICAgLyogUmVzZXQgTGF0ZXN0IFR4IEZJRk8vUXVldWUgUmVxdWVzdCBCdWZmZXIgSW5kZXggKi8KKyAgICBoZmRjYW4tPkxhdGVzdFR4Rmlmb1FSZXF1ZXN0ID0gMFU7CisKKyAgICAvKiBDaGFuZ2UgRkRDQU4gcGVyaXBoZXJhbCBzdGF0ZSAqLworICAgIGhmZGNhbi0+U3RhdGUgPSBIQUxfRkRDQU5fU1RBVEVfUkVBRFk7CisKKyAgICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfSBlbHNlIHsKKyAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLworICAgIGhmZGNhbi0+RXJyb3JDb2RlIHw9IEhBTF9GRENBTl9FUlJPUl9OT1RfU1RBUlRFRDsKKworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KK30KKworLyoqCisgKiBAYnJpZWYgIEFkZCBhIG1lc3NhZ2UgdG8gdGhlIFR4IEZJRk8vUXVldWUgYW5kIGFjdGl2YXRlIHRoZSBjb3JyZXNwb25kaW5nCisgKiB0cmFuc21pc3Npb24gcmVxdWVzdAorICogQHBhcmFtICBoZmRjYW4gcG9pbnRlciB0byBhbiBGRENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZEQ0FOLgorICogQHBhcmFtICBwVHhIZWFkZXIgcG9pbnRlciB0byBhIEZEQ0FOX1R4SGVhZGVyVHlwZURlZiBzdHJ1Y3R1cmUuCisgKiBAcGFyYW0gIHBUeERhdGEgcG9pbnRlciB0byBhIGJ1ZmZlciBjb250YWluaW5nIHRoZSBwYXlsb2FkIG9mIHRoZSBUeCBmcmFtZS4KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fQWRkTWVzc2FnZVRvVHhGaWZvUSgKKyAgICBGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4sIGNvbnN0IEZEQ0FOX1R4SGVhZGVyVHlwZURlZiAqcFR4SGVhZGVyLAorICAgIGNvbnN0IHVpbnQ4X3QgKnBUeERhdGEpIHsKKyAgdWludDMyX3QgUHV0SW5kZXg7CisKKyAgLyogQ2hlY2sgZnVuY3Rpb24gcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfRkRDQU5fSURfVFlQRShwVHhIZWFkZXItPklkVHlwZSkpOworICBpZiAocFR4SGVhZGVyLT5JZFR5cGUgPT0gRkRDQU5fU1RBTkRBUkRfSUQpIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfRkRDQU5fTUFYX1ZBTFVFKHBUeEhlYWRlci0+SWRlbnRpZmllciwgMHg3RkZVKSk7CisgIH0gZWxzZSAvKiBwVHhIZWFkZXItPklkVHlwZSA9PSBGRENBTl9FWFRFTkRFRF9JRCAqLworICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX0ZEQ0FOX01BWF9WQUxVRShwVHhIZWFkZXItPklkZW50aWZpZXIsIDB4MUZGRkZGRkZVKSk7CisgIH0KKyAgYXNzZXJ0X3BhcmFtKElTX0ZEQ0FOX0ZSQU1FX1RZUEUocFR4SGVhZGVyLT5UeEZyYW1lVHlwZSkpOworICBhc3NlcnRfcGFyYW0oSVNfRkRDQU5fRExDKHBUeEhlYWRlci0+RGF0YUxlbmd0aCkpOworICBhc3NlcnRfcGFyYW0oSVNfRkRDQU5fRVNJKHBUeEhlYWRlci0+RXJyb3JTdGF0ZUluZGljYXRvcikpOworICBhc3NlcnRfcGFyYW0oSVNfRkRDQU5fQlJTKHBUeEhlYWRlci0+Qml0UmF0ZVN3aXRjaCkpOworICBhc3NlcnRfcGFyYW0oSVNfRkRDQU5fRkRGKHBUeEhlYWRlci0+RkRGb3JtYXQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZEQ0FOX0VGQyhwVHhIZWFkZXItPlR4RXZlbnRGaWZvQ29udHJvbCkpOworICBhc3NlcnRfcGFyYW0oSVNfRkRDQU5fTUFYX1ZBTFVFKHBUeEhlYWRlci0+TWVzc2FnZU1hcmtlciwgMHhGRlUpKTsKKworICBpZiAoaGZkY2FuLT5TdGF0ZSA9PSBIQUxfRkRDQU5fU1RBVEVfQlVTWSkgeworICAgIC8qIENoZWNrIHRoYXQgdGhlIFR4IEZJRk8vUXVldWUgaXMgbm90IGZ1bGwgKi8KKyAgICBpZiAoKGhmZGNhbi0+SW5zdGFuY2UtPlRYRlFTICYgRkRDQU5fVFhGUVNfVEZRRikgIT0gMFUpIHsKKyAgICAgIC8qIFVwZGF0ZSBlcnJvciBjb2RlICovCisgICAgICBoZmRjYW4tPkVycm9yQ29kZSB8PSBIQUxfRkRDQU5fRVJST1JfRklGT19GVUxMOworCisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0gZWxzZSB7CisgICAgICAvKiBSZXRyaWV2ZSB0aGUgVHggRklGTyBQdXRJbmRleCAqLworICAgICAgUHV0SW5kZXggPSAoKGhmZGNhbi0+SW5zdGFuY2UtPlRYRlFTICYgRkRDQU5fVFhGUVNfVEZRUEkpID4+CisgICAgICAgICAgICAgICAgICBGRENBTl9UWEZRU19URlFQSV9Qb3MpOworCisgICAgICAvKiBBZGQgdGhlIG1lc3NhZ2UgdG8gdGhlIFR4IEZJRk8vUXVldWUgKi8KKyAgICAgIEZEQ0FOX0NvcHlNZXNzYWdlVG9SQU0oaGZkY2FuLCBwVHhIZWFkZXIsIHBUeERhdGEsIFB1dEluZGV4KTsKKworICAgICAgLyogQWN0aXZhdGUgdGhlIGNvcnJlc3BvbmRpbmcgdHJhbnNtaXNzaW9uIHJlcXVlc3QgKi8KKyAgICAgIGhmZGNhbi0+SW5zdGFuY2UtPlRYQkFSID0gKCh1aW50MzJfdCkxIDw8IFB1dEluZGV4KTsKKworICAgICAgLyogU3RvcmUgdGhlIExhdGVzdCBUeCBGSUZPL1F1ZXVlIFJlcXVlc3QgQnVmZmVyIEluZGV4ICovCisgICAgICBoZmRjYW4tPkxhdGVzdFR4Rmlmb1FSZXF1ZXN0ID0gKCh1aW50MzJfdCkxIDw8IFB1dEluZGV4KTsKKyAgICB9CisKKyAgICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfSBlbHNlIHsKKyAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLworICAgIGhmZGNhbi0+RXJyb3JDb2RlIHw9IEhBTF9GRENBTl9FUlJPUl9OT1RfU1RBUlRFRDsKKworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBUeCBidWZmZXIgaW5kZXggb2YgbGF0ZXN0IFR4IEZJRk8vUXVldWUgcmVxdWVzdAorICogQHBhcmFtICBoZmRjYW4gcG9pbnRlciB0byBhbiBGRENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZEQ0FOLgorICogQHJldHZhbCBUeCBidWZmZXIgaW5kZXggb2YgbGFzdCBUeCBGSUZPL1F1ZXVlIHJlcXVlc3QKKyAqICAgICAgICAgIC0gQW55IHZhbHVlIG9mIEBhcmcgRkRDQU5fVHhfbG9jYXRpb24gaWYgVHggcmVxdWVzdCBoYXMgYmVlbgorICogc3VibWl0dGVkLgorICogICAgICAgICAgLSAwIGlmIG5vIFR4IEZJRk8vUXVldWUgcmVxdWVzdCBoYXZlIGJlZW4gc3VibWl0dGVkLgorICovCit1aW50MzJfdCBIQUxfRkRDQU5fR2V0TGF0ZXN0VHhGaWZvUVJlcXVlc3RCdWZmZXIoCisgICAgY29uc3QgRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuKSB7CisgIC8qIFJldHVybiBMYXN0IFR4IEZJRk8vUXVldWUgUmVxdWVzdCBCdWZmZXIgKi8KKyAgcmV0dXJuIGhmZGNhbi0+TGF0ZXN0VHhGaWZvUVJlcXVlc3Q7Cit9CisKKy8qKgorICogQGJyaWVmICBBYm9ydCB0cmFuc21pc3Npb24gcmVxdWVzdAorICogQHBhcmFtICBoZmRjYW4gcG9pbnRlciB0byBhbiBGRENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZEQ0FOLgorICogQHBhcmFtICBCdWZmZXJJbmRleCBidWZmZXIgaW5kZXguCisgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgQGFyZyBGRENBTl9UeF9sb2NhdGlvbi4KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fQWJvcnRUeFJlcXVlc3QoRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEJ1ZmZlckluZGV4KSB7CisgIC8qIENoZWNrIGZ1bmN0aW9uIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0ZEQ0FOX1RYX0xPQ0FUSU9OX0xJU1QoQnVmZmVySW5kZXgpKTsKKworICBpZiAoaGZkY2FuLT5TdGF0ZSA9PSBIQUxfRkRDQU5fU1RBVEVfQlVTWSkgeworICAgIC8qIEFkZCBjYW5jZWxsYXRpb24gcmVxdWVzdCAqLworICAgIGhmZGNhbi0+SW5zdGFuY2UtPlRYQkNSID0gQnVmZmVySW5kZXg7CisKKyAgICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfSBlbHNlIHsKKyAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLworICAgIGhmZGNhbi0+RXJyb3JDb2RlIHw9IEhBTF9GRENBTl9FUlJPUl9OT1RfU1RBUlRFRDsKKworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBhbiBGRENBTiBmcmFtZSBmcm9tIHRoZSBSeCBGSUZPIHpvbmUgaW50byB0aGUgbWVzc2FnZSBSQU0uCisgKiBAcGFyYW0gIGhmZGNhbiBwb2ludGVyIHRvIGFuIEZEQ0FOX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRkRDQU4uCisgKiBAcGFyYW0gIFJ4TG9jYXRpb24gTG9jYXRpb24gb2YgdGhlIHJlY2VpdmVkIG1lc3NhZ2UgdG8gYmUgcmVhZC4KKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQGFyZyBGRENBTl9SeF9sb2NhdGlvbi4KKyAqIEBwYXJhbSAgcFJ4SGVhZGVyIHBvaW50ZXIgdG8gYSBGRENBTl9SeEhlYWRlclR5cGVEZWYgc3RydWN0dXJlLgorICogQHBhcmFtICBwUnhEYXRhIHBvaW50ZXIgdG8gYSBidWZmZXIgd2hlcmUgdGhlIHBheWxvYWQgb2YgdGhlIFJ4IGZyYW1lIHdpbGwgYmUKKyAqIHN0b3JlZC4KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fR2V0UnhNZXNzYWdlKEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUnhMb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRDQU5fUnhIZWFkZXJUeXBlRGVmICpwUnhIZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBSeERhdGEpIHsKKyAgdWludDMyX3QgKlJ4QWRkcmVzczsKKyAgdWludDhfdCAqcERhdGE7CisgIHVpbnQzMl90IEJ5dGVDb3VudGVyOworICB1aW50MzJfdCBHZXRJbmRleCA9IDA7CisgIEhBTF9GRENBTl9TdGF0ZVR5cGVEZWYgc3RhdGUgPSBoZmRjYW4tPlN0YXRlOworCisgIC8qIENoZWNrIGZ1bmN0aW9uIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0ZEQ0FOX1JYX0ZJRk8oUnhMb2NhdGlvbikpOworCisgIGlmIChzdGF0ZSA9PSBIQUxfRkRDQU5fU1RBVEVfQlVTWSkgeworICAgIGlmIChSeExvY2F0aW9uID09CisgICAgICAgIEZEQ0FOX1JYX0ZJRk8wKSAvKiBSeCBlbGVtZW50IGlzIGFzc2lnbmVkIHRvIHRoZSBSeCBGSUZPIDAgKi8KKyAgICB7CisgICAgICAvKiBDaGVjayB0aGF0IHRoZSBSeCBGSUZPIDAgaXMgbm90IGVtcHR5ICovCisgICAgICBpZiAoKGhmZGNhbi0+SW5zdGFuY2UtPlJYRjBTICYgRkRDQU5fUlhGMFNfRjBGTCkgPT0gMFUpIHsKKyAgICAgICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgaGZkY2FuLT5FcnJvckNvZGUgfD0gSEFMX0ZEQ0FOX0VSUk9SX0ZJRk9fRU1QVFk7CisKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIENoZWNrIHRoYXQgdGhlIFJ4IEZJRk8gMCBpcyBmdWxsICYgb3ZlcndyaXRlIG1vZGUgaXMgb24gKi8KKyAgICAgICAgaWYgKCgoaGZkY2FuLT5JbnN0YW5jZS0+UlhGMFMgJiBGRENBTl9SWEYwU19GMEYpID4+CisgICAgICAgICAgICAgRkRDQU5fUlhGMFNfRjBGX1BvcykgPT0gMVUpIHsKKyAgICAgICAgICBpZiAoKChoZmRjYW4tPkluc3RhbmNlLT5SWEdGQyAmIEZEQ0FOX1JYR0ZDX0YwT00pID4+CisgICAgICAgICAgICAgICBGRENBTl9SWEdGQ19GME9NX1BvcykgPT0gRkRDQU5fUlhfRklGT19PVkVSV1JJVEUpIHsKKyAgICAgICAgICAgIC8qIFdoZW4gb3ZlcndyaXRlIHN0YXR1cyBpcyBvbiBkaXNjYXJkIGZpcnN0IG1lc3NhZ2UgaW4gRklGTyAqLworICAgICAgICAgICAgR2V0SW5kZXggPSAxVTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBDYWxjdWxhdGUgUnggRklGTyAwIGVsZW1lbnQgaW5kZXggKi8KKyAgICAgICAgR2V0SW5kZXggKz0gKChoZmRjYW4tPkluc3RhbmNlLT5SWEYwUyAmIEZEQ0FOX1JYRjBTX0YwR0kpID4+CisgICAgICAgICAgICAgICAgICAgICBGRENBTl9SWEYwU19GMEdJX1Bvcyk7CisKKyAgICAgICAgLyogQ2FsY3VsYXRlIFJ4IEZJRk8gMCBlbGVtZW50IGFkZHJlc3MgKi8KKyAgICAgICAgUnhBZGRyZXNzID0gKHVpbnQzMl90ICopKGhmZGNhbi0+bXNnUmFtLlJ4RklGTzBTQSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoR2V0SW5kZXggKiBTUkFNQ0FOX1JGMF9TSVpFKSk7CisgICAgICB9CisgICAgfSBlbHNlIC8qIFJ4IGVsZW1lbnQgaXMgYXNzaWduZWQgdG8gdGhlIFJ4IEZJRk8gMSAqLworICAgIHsKKyAgICAgIC8qIENoZWNrIHRoYXQgdGhlIFJ4IEZJRk8gMSBpcyBub3QgZW1wdHkgKi8KKyAgICAgIGlmICgoaGZkY2FuLT5JbnN0YW5jZS0+UlhGMVMgJiBGRENBTl9SWEYxU19GMUZMKSA9PSAwVSkgeworICAgICAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLworICAgICAgICBoZmRjYW4tPkVycm9yQ29kZSB8PSBIQUxfRkRDQU5fRVJST1JfRklGT19FTVBUWTsKKworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogQ2hlY2sgdGhhdCB0aGUgUnggRklGTyAxIGlzIGZ1bGwgJiBvdmVyd3JpdGUgbW9kZSBpcyBvbiAqLworICAgICAgICBpZiAoKChoZmRjYW4tPkluc3RhbmNlLT5SWEYxUyAmIEZEQ0FOX1JYRjFTX0YxRikgPj4KKyAgICAgICAgICAgICBGRENBTl9SWEYxU19GMUZfUG9zKSA9PSAxVSkgeworICAgICAgICAgIGlmICgoKGhmZGNhbi0+SW5zdGFuY2UtPlJYR0ZDICYgRkRDQU5fUlhHRkNfRjFPTSkgPj4KKyAgICAgICAgICAgICAgIEZEQ0FOX1JYR0ZDX0YxT01fUG9zKSA9PSBGRENBTl9SWF9GSUZPX09WRVJXUklURSkgeworICAgICAgICAgICAgLyogV2hlbiBvdmVyd3JpdGUgc3RhdHVzIGlzIG9uIGRpc2NhcmQgZmlyc3QgbWVzc2FnZSBpbiBGSUZPICovCisgICAgICAgICAgICBHZXRJbmRleCA9IDFVOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIENhbGN1bGF0ZSBSeCBGSUZPIDEgZWxlbWVudCBpbmRleCAqLworICAgICAgICBHZXRJbmRleCArPSAoKGhmZGNhbi0+SW5zdGFuY2UtPlJYRjFTICYgRkRDQU5fUlhGMVNfRjFHSSkgPj4KKyAgICAgICAgICAgICAgICAgICAgIEZEQ0FOX1JYRjFTX0YxR0lfUG9zKTsKKyAgICAgICAgLyogQ2FsY3VsYXRlIFJ4IEZJRk8gMSBlbGVtZW50IGFkZHJlc3MgKi8KKyAgICAgICAgUnhBZGRyZXNzID0gKHVpbnQzMl90ICopKGhmZGNhbi0+bXNnUmFtLlJ4RklGTzFTQSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoR2V0SW5kZXggKiBTUkFNQ0FOX1JGMV9TSVpFKSk7CisgICAgICB9CisgICAgfQorCisgICAgLyogUmV0cmlldmUgSWRUeXBlICovCisgICAgcFJ4SGVhZGVyLT5JZFR5cGUgPSAqUnhBZGRyZXNzICYgRkRDQU5fRUxFTUVOVF9NQVNLX1hURDsKKworICAgIC8qIFJldHJpZXZlIElkZW50aWZpZXIgKi8KKyAgICBpZiAocFJ4SGVhZGVyLT5JZFR5cGUgPT0gRkRDQU5fU1RBTkRBUkRfSUQpIC8qIFN0YW5kYXJkIElEIGVsZW1lbnQgKi8KKyAgICB7CisgICAgICBwUnhIZWFkZXItPklkZW50aWZpZXIgPSAoKCpSeEFkZHJlc3MgJiBGRENBTl9FTEVNRU5UX01BU0tfU1RESUQpID4+IDE4VSk7CisgICAgfSBlbHNlIC8qIEV4dGVuZGVkIElEIGVsZW1lbnQgKi8KKyAgICB7CisgICAgICBwUnhIZWFkZXItPklkZW50aWZpZXIgPSAoKlJ4QWRkcmVzcyAmIEZEQ0FOX0VMRU1FTlRfTUFTS19FWFRJRCk7CisgICAgfQorCisgICAgLyogUmV0cmlldmUgUnhGcmFtZVR5cGUgKi8KKyAgICBwUnhIZWFkZXItPlJ4RnJhbWVUeXBlID0gKCpSeEFkZHJlc3MgJiBGRENBTl9FTEVNRU5UX01BU0tfUlRSKTsKKworICAgIC8qIFJldHJpZXZlIEVycm9yU3RhdGVJbmRpY2F0b3IgKi8KKyAgICBwUnhIZWFkZXItPkVycm9yU3RhdGVJbmRpY2F0b3IgPSAoKlJ4QWRkcmVzcyAmIEZEQ0FOX0VMRU1FTlRfTUFTS19FU0kpOworCisgICAgLyogSW5jcmVtZW50IFJ4QWRkcmVzcyBwb2ludGVyIHRvIHNlY29uZCB3b3JkIG9mIFJ4IEZJRk8gZWxlbWVudCAqLworICAgIFJ4QWRkcmVzcysrOworCisgICAgLyogUmV0cmlldmUgUnhUaW1lc3RhbXAgKi8KKyAgICBwUnhIZWFkZXItPlJ4VGltZXN0YW1wID0gKCpSeEFkZHJlc3MgJiBGRENBTl9FTEVNRU5UX01BU0tfVFMpOworCisgICAgLyogUmV0cmlldmUgRGF0YUxlbmd0aCAqLworICAgIHBSeEhlYWRlci0+RGF0YUxlbmd0aCA9ICgoKlJ4QWRkcmVzcyAmIEZEQ0FOX0VMRU1FTlRfTUFTS19ETEMpID4+IDE2VSk7CisKKyAgICAvKiBSZXRyaWV2ZSBCaXRSYXRlU3dpdGNoICovCisgICAgcFJ4SGVhZGVyLT5CaXRSYXRlU3dpdGNoID0gKCpSeEFkZHJlc3MgJiBGRENBTl9FTEVNRU5UX01BU0tfQlJTKTsKKworICAgIC8qIFJldHJpZXZlIEZERm9ybWF0ICovCisgICAgcFJ4SGVhZGVyLT5GREZvcm1hdCA9ICgqUnhBZGRyZXNzICYgRkRDQU5fRUxFTUVOVF9NQVNLX0ZERik7CisKKyAgICAvKiBSZXRyaWV2ZSBGaWx0ZXJJbmRleCAqLworICAgIHBSeEhlYWRlci0+RmlsdGVySW5kZXggPSAoKCpSeEFkZHJlc3MgJiBGRENBTl9FTEVNRU5UX01BU0tfRklEWCkgPj4gMjRVKTsKKworICAgIC8qIFJldHJpZXZlIE5vbk1hdGNoaW5nRnJhbWUgKi8KKyAgICBwUnhIZWFkZXItPklzRmlsdGVyTWF0Y2hpbmdGcmFtZSA9CisgICAgICAgICgoKlJ4QWRkcmVzcyAmIEZEQ0FOX0VMRU1FTlRfTUFTS19BTk1GKSA+PiAzMVUpOworCisgICAgLyogSW5jcmVtZW50IFJ4QWRkcmVzcyBwb2ludGVyIHRvIHBheWxvYWQgb2YgUnggRklGTyBlbGVtZW50ICovCisgICAgUnhBZGRyZXNzKys7CisKKyAgICAvKiBSZXRyaWV2ZSBSeCBwYXlsb2FkICovCisgICAgcERhdGEgPSAodWludDhfdCAqKVJ4QWRkcmVzczsKKyAgICBmb3IgKEJ5dGVDb3VudGVyID0gMDsgQnl0ZUNvdW50ZXIgPCBETEN0b0J5dGVzW3BSeEhlYWRlci0+RGF0YUxlbmd0aF07CisgICAgICAgICBCeXRlQ291bnRlcisrKSB7CisgICAgICBwUnhEYXRhW0J5dGVDb3VudGVyXSA9IHBEYXRhW0J5dGVDb3VudGVyXTsKKyAgICB9CisKKyAgICBpZiAoUnhMb2NhdGlvbiA9PQorICAgICAgICBGRENBTl9SWF9GSUZPMCkgLyogUnggZWxlbWVudCBpcyBhc3NpZ25lZCB0byB0aGUgUnggRklGTyAwICovCisgICAgeworICAgICAgLyogQWNrbm93bGVkZ2UgdGhlIFJ4IEZJRk8gMCB0aGF0IHRoZSBvbGRlc3QgZWxlbWVudCBpcyByZWFkIHNvIHRoYXQgaXQKKyAgICAgICAqIGluY3JlbWVudHMgdGhlIEdldEluZGV4ICovCisgICAgICBoZmRjYW4tPkluc3RhbmNlLT5SWEYwQSA9IEdldEluZGV4OworICAgIH0gZWxzZSAvKiBSeCBlbGVtZW50IGlzIGFzc2lnbmVkIHRvIHRoZSBSeCBGSUZPIDEgKi8KKyAgICB7CisgICAgICAvKiBBY2tub3dsZWRnZSB0aGUgUnggRklGTyAxIHRoYXQgdGhlIG9sZGVzdCBlbGVtZW50IGlzIHJlYWQgc28gdGhhdCBpdAorICAgICAgICogaW5jcmVtZW50cyB0aGUgR2V0SW5kZXggKi8KKyAgICAgIGhmZGNhbi0+SW5zdGFuY2UtPlJYRjFBID0gR2V0SW5kZXg7CisgICAgfQorCisgICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICAgIHJldHVybiBIQUxfT0s7CisgIH0gZWxzZSB7CisgICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8KKyAgICBoZmRjYW4tPkVycm9yQ29kZSB8PSBIQUxfRkRDQU5fRVJST1JfTk9UX1NUQVJURUQ7CisKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgYW4gRkRDQU4gVHggZXZlbnQgZnJvbSB0aGUgVHggRXZlbnQgRklGTyB6b25lIGludG8gdGhlIG1lc3NhZ2UKKyAqIFJBTS4KKyAqIEBwYXJhbSAgaGZkY2FuIHBvaW50ZXIgdG8gYW4gRkRDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBGRENBTi4KKyAqIEBwYXJhbSAgcFR4RXZlbnQgcG9pbnRlciB0byBhIEZEQ0FOX1R4RXZlbnRGaWZvVHlwZURlZiBzdHJ1Y3R1cmUuCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX0dldFR4RXZlbnQoRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRDQU5fVHhFdmVudEZpZm9UeXBlRGVmICpwVHhFdmVudCkgeworICB1aW50MzJfdCAqVHhFdmVudEFkZHJlc3M7CisgIHVpbnQzMl90IEdldEluZGV4OworICBIQUxfRkRDQU5fU3RhdGVUeXBlRGVmIHN0YXRlID0gaGZkY2FuLT5TdGF0ZTsKKworICBpZiAoc3RhdGUgPT0gSEFMX0ZEQ0FOX1NUQVRFX0JVU1kpIHsKKyAgICAvKiBDaGVjayB0aGF0IHRoZSBUeCBldmVudCBGSUZPIGlzIG5vdCBlbXB0eSAqLworICAgIGlmICgoaGZkY2FuLT5JbnN0YW5jZS0+VFhFRlMgJiBGRENBTl9UWEVGU19FRkZMKSA9PSAwVSkgeworICAgICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8KKyAgICAgIGhmZGNhbi0+RXJyb3JDb2RlIHw9IEhBTF9GRENBTl9FUlJPUl9GSUZPX0VNUFRZOworCisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIENhbGN1bGF0ZSBUeCBldmVudCBGSUZPIGVsZW1lbnQgYWRkcmVzcyAqLworICAgIEdldEluZGV4ID0KKyAgICAgICAgKChoZmRjYW4tPkluc3RhbmNlLT5UWEVGUyAmIEZEQ0FOX1RYRUZTX0VGR0kpID4+IEZEQ0FOX1RYRUZTX0VGR0lfUG9zKTsKKyAgICBUeEV2ZW50QWRkcmVzcyA9ICh1aW50MzJfdCAqKShoZmRjYW4tPm1zZ1JhbS5UeEV2ZW50RklGT1NBICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoR2V0SW5kZXggKiBTUkFNQ0FOX1RFRl9TSVpFKSk7CisKKyAgICAvKiBSZXRyaWV2ZSBJZFR5cGUgKi8KKyAgICBwVHhFdmVudC0+SWRUeXBlID0gKlR4RXZlbnRBZGRyZXNzICYgRkRDQU5fRUxFTUVOVF9NQVNLX1hURDsKKworICAgIC8qIFJldHJpZXZlIElkZW50aWZpZXIgKi8KKyAgICBpZiAocFR4RXZlbnQtPklkVHlwZSA9PSBGRENBTl9TVEFOREFSRF9JRCkgLyogU3RhbmRhcmQgSUQgZWxlbWVudCAqLworICAgIHsKKyAgICAgIHBUeEV2ZW50LT5JZGVudGlmaWVyID0KKyAgICAgICAgICAoKCpUeEV2ZW50QWRkcmVzcyAmIEZEQ0FOX0VMRU1FTlRfTUFTS19TVERJRCkgPj4gMThVKTsKKyAgICB9IGVsc2UgLyogRXh0ZW5kZWQgSUQgZWxlbWVudCAqLworICAgIHsKKyAgICAgIHBUeEV2ZW50LT5JZGVudGlmaWVyID0gKCpUeEV2ZW50QWRkcmVzcyAmIEZEQ0FOX0VMRU1FTlRfTUFTS19FWFRJRCk7CisgICAgfQorCisgICAgLyogUmV0cmlldmUgVHhGcmFtZVR5cGUgKi8KKyAgICBwVHhFdmVudC0+VHhGcmFtZVR5cGUgPSAoKlR4RXZlbnRBZGRyZXNzICYgRkRDQU5fRUxFTUVOVF9NQVNLX1JUUik7CisKKyAgICAvKiBSZXRyaWV2ZSBFcnJvclN0YXRlSW5kaWNhdG9yICovCisgICAgcFR4RXZlbnQtPkVycm9yU3RhdGVJbmRpY2F0b3IgPSAoKlR4RXZlbnRBZGRyZXNzICYgRkRDQU5fRUxFTUVOVF9NQVNLX0VTSSk7CisKKyAgICAvKiBJbmNyZW1lbnQgVHhFdmVudEFkZHJlc3MgcG9pbnRlciB0byBzZWNvbmQgd29yZCBvZiBUeCBFdmVudCBGSUZPIGVsZW1lbnQKKyAgICAgKi8KKyAgICBUeEV2ZW50QWRkcmVzcysrOworCisgICAgLyogUmV0cmlldmUgVHhUaW1lc3RhbXAgKi8KKyAgICBwVHhFdmVudC0+VHhUaW1lc3RhbXAgPSAoKlR4RXZlbnRBZGRyZXNzICYgRkRDQU5fRUxFTUVOVF9NQVNLX1RTKTsKKworICAgIC8qIFJldHJpZXZlIERhdGFMZW5ndGggKi8KKyAgICBwVHhFdmVudC0+RGF0YUxlbmd0aCA9ICgoKlR4RXZlbnRBZGRyZXNzICYgRkRDQU5fRUxFTUVOVF9NQVNLX0RMQykgPj4gMTZVKTsKKworICAgIC8qIFJldHJpZXZlIEJpdFJhdGVTd2l0Y2ggKi8KKyAgICBwVHhFdmVudC0+Qml0UmF0ZVN3aXRjaCA9ICgqVHhFdmVudEFkZHJlc3MgJiBGRENBTl9FTEVNRU5UX01BU0tfQlJTKTsKKworICAgIC8qIFJldHJpZXZlIEZERm9ybWF0ICovCisgICAgcFR4RXZlbnQtPkZERm9ybWF0ID0gKCpUeEV2ZW50QWRkcmVzcyAmIEZEQ0FOX0VMRU1FTlRfTUFTS19GREYpOworCisgICAgLyogUmV0cmlldmUgRXZlbnRUeXBlICovCisgICAgcFR4RXZlbnQtPkV2ZW50VHlwZSA9ICgqVHhFdmVudEFkZHJlc3MgJiBGRENBTl9FTEVNRU5UX01BU0tfRVQpOworCisgICAgLyogUmV0cmlldmUgTWVzc2FnZU1hcmtlciAqLworICAgIHBUeEV2ZW50LT5NZXNzYWdlTWFya2VyID0KKyAgICAgICAgKCgqVHhFdmVudEFkZHJlc3MgJiBGRENBTl9FTEVNRU5UX01BU0tfTU0pID4+IDI0VSk7CisKKyAgICAvKiBBY2tub3dsZWRnZSB0aGUgVHggRXZlbnQgRklGTyB0aGF0IHRoZSBvbGRlc3QgZWxlbWVudCBpcyByZWFkIHNvIHRoYXQgaXQKKyAgICAgKiBpbmNyZW1lbnRzIHRoZSBHZXRJbmRleCAqLworICAgIGhmZGNhbi0+SW5zdGFuY2UtPlRYRUZBID0gR2V0SW5kZXg7CisKKyAgICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfSBlbHNlIHsKKyAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLworICAgIGhmZGNhbi0+RXJyb3JDb2RlIHw9IEhBTF9GRENBTl9FUlJPUl9OT1RfU1RBUlRFRDsKKworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KK30KKworLyoqCisgKiBAYnJpZWYgIEdldCBoaWdoIHByaW9yaXR5IG1lc3NhZ2Ugc3RhdHVzLgorICogQHBhcmFtICBoZmRjYW4gcG9pbnRlciB0byBhbiBGRENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZEQ0FOLgorICogQHBhcmFtICBIcE1zZ1N0YXR1cyBwb2ludGVyIHRvIGFuIEZEQ0FOX0hwTXNnU3RhdHVzVHlwZURlZiBzdHJ1Y3R1cmUuCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX0dldEhpZ2hQcmlvcml0eU1lc3NhZ2VTdGF0dXMoCisgICAgY29uc3QgRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLCBGRENBTl9IcE1zZ1N0YXR1c1R5cGVEZWYgKkhwTXNnU3RhdHVzKSB7CisgIEhwTXNnU3RhdHVzLT5GaWx0ZXJMaXN0ID0KKyAgICAgICgoaGZkY2FuLT5JbnN0YW5jZS0+SFBNUyAmIEZEQ0FOX0hQTVNfRkxTVCkgPj4gRkRDQU5fSFBNU19GTFNUX1Bvcyk7CisgIEhwTXNnU3RhdHVzLT5GaWx0ZXJJbmRleCA9CisgICAgICAoKGhmZGNhbi0+SW5zdGFuY2UtPkhQTVMgJiBGRENBTl9IUE1TX0ZJRFgpID4+IEZEQ0FOX0hQTVNfRklEWF9Qb3MpOworICBIcE1zZ1N0YXR1cy0+TWVzc2FnZVN0b3JhZ2UgPSAoaGZkY2FuLT5JbnN0YW5jZS0+SFBNUyAmIEZEQ0FOX0hQTVNfTVNJKTsKKyAgSHBNc2dTdGF0dXMtPk1lc3NhZ2VJbmRleCA9IChoZmRjYW4tPkluc3RhbmNlLT5IUE1TICYgRkRDQU5fSFBNU19CSURYKTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgcHJvdG9jb2wgc3RhdHVzLgorICogQHBhcmFtICBoZmRjYW4gcG9pbnRlciB0byBhbiBGRENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZEQ0FOLgorICogQHBhcmFtICBQcm90b2NvbFN0YXR1cyBwb2ludGVyIHRvIGFuIEZEQ0FOX1Byb3RvY29sU3RhdHVzVHlwZURlZiBzdHJ1Y3R1cmUuCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX0dldFByb3RvY29sU3RhdHVzKAorICAgIGNvbnN0IEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwKKyAgICBGRENBTl9Qcm90b2NvbFN0YXR1c1R5cGVEZWYgKlByb3RvY29sU3RhdHVzKSB7CisgIHVpbnQzMl90IFN0YXR1c1JlZzsKKworICAvKiBSZWFkIHRoZSBwcm90b2NvbCBzdGF0dXMgcmVnaXN0ZXIgKi8KKyAgU3RhdHVzUmVnID0gUkVBRF9SRUcoaGZkY2FuLT5JbnN0YW5jZS0+UFNSKTsKKworICAvKiBGaWxsIHRoZSBwcm90b2NvbCBzdGF0dXMgc3RydWN0dXJlICovCisgIFByb3RvY29sU3RhdHVzLT5MYXN0RXJyb3JDb2RlID0gKFN0YXR1c1JlZyAmIEZEQ0FOX1BTUl9MRUMpOworICBQcm90b2NvbFN0YXR1cy0+RGF0YUxhc3RFcnJvckNvZGUgPQorICAgICAgKChTdGF0dXNSZWcgJiBGRENBTl9QU1JfRExFQykgPj4gRkRDQU5fUFNSX0RMRUNfUG9zKTsKKyAgUHJvdG9jb2xTdGF0dXMtPkFjdGl2aXR5ID0gKFN0YXR1c1JlZyAmIEZEQ0FOX1BTUl9BQ1QpOworICBQcm90b2NvbFN0YXR1cy0+RXJyb3JQYXNzaXZlID0KKyAgICAgICgoU3RhdHVzUmVnICYgRkRDQU5fUFNSX0VQKSA+PiBGRENBTl9QU1JfRVBfUG9zKTsKKyAgUHJvdG9jb2xTdGF0dXMtPldhcm5pbmcgPSAoKFN0YXR1c1JlZyAmIEZEQ0FOX1BTUl9FVykgPj4gRkRDQU5fUFNSX0VXX1Bvcyk7CisgIFByb3RvY29sU3RhdHVzLT5CdXNPZmYgPSAoKFN0YXR1c1JlZyAmIEZEQ0FOX1BTUl9CTykgPj4gRkRDQU5fUFNSX0JPX1Bvcyk7CisgIFByb3RvY29sU3RhdHVzLT5SeEVTSWZsYWcgPQorICAgICAgKChTdGF0dXNSZWcgJiBGRENBTl9QU1JfUkVTSSkgPj4gRkRDQU5fUFNSX1JFU0lfUG9zKTsKKyAgUHJvdG9jb2xTdGF0dXMtPlJ4QlJTZmxhZyA9CisgICAgICAoKFN0YXR1c1JlZyAmIEZEQ0FOX1BTUl9SQlJTKSA+PiBGRENBTl9QU1JfUkJSU19Qb3MpOworICBQcm90b2NvbFN0YXR1cy0+UnhGREZmbGFnID0KKyAgICAgICgoU3RhdHVzUmVnICYgRkRDQU5fUFNSX1JFREwpID4+IEZEQ0FOX1BTUl9SRURMX1Bvcyk7CisgIFByb3RvY29sU3RhdHVzLT5Qcm90b2NvbEV4Y2VwdGlvbiA9CisgICAgICAoKFN0YXR1c1JlZyAmIEZEQ0FOX1BTUl9QWEUpID4+IEZEQ0FOX1BTUl9QWEVfUG9zKTsKKyAgUHJvdG9jb2xTdGF0dXMtPlREQ3ZhbHVlID0KKyAgICAgICgoU3RhdHVzUmVnICYgRkRDQU5fUFNSX1REQ1YpID4+IEZEQ0FOX1BTUl9URENWX1Bvcyk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IGVycm9yIGNvdW50ZXIgdmFsdWVzLgorICogQHBhcmFtICBoZmRjYW4gcG9pbnRlciB0byBhbiBGRENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZEQ0FOLgorICogQHBhcmFtICBFcnJvckNvdW50ZXJzIHBvaW50ZXIgdG8gYW4gRkRDQU5fRXJyb3JDb3VudGVyc1R5cGVEZWYgc3RydWN0dXJlLgorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GRENBTl9HZXRFcnJvckNvdW50ZXJzKAorICAgIGNvbnN0IEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwKKyAgICBGRENBTl9FcnJvckNvdW50ZXJzVHlwZURlZiAqRXJyb3JDb3VudGVycykgeworICB1aW50MzJfdCBDb3VudGVyc1JlZzsKKworICAvKiBSZWFkIHRoZSBlcnJvciBjb3VudGVycyByZWdpc3RlciAqLworICBDb3VudGVyc1JlZyA9IFJFQURfUkVHKGhmZGNhbi0+SW5zdGFuY2UtPkVDUik7CisKKyAgLyogRmlsbCB0aGUgZXJyb3IgY291bnRlcnMgc3RydWN0dXJlICovCisgIEVycm9yQ291bnRlcnMtPlR4RXJyb3JDbnQgPQorICAgICAgKChDb3VudGVyc1JlZyAmIEZEQ0FOX0VDUl9URUMpID4+IEZEQ0FOX0VDUl9URUNfUG9zKTsKKyAgRXJyb3JDb3VudGVycy0+UnhFcnJvckNudCA9CisgICAgICAoKENvdW50ZXJzUmVnICYgRkRDQU5fRUNSX1JFQykgPj4gRkRDQU5fRUNSX1JFQ19Qb3MpOworICBFcnJvckNvdW50ZXJzLT5SeEVycm9yUGFzc2l2ZSA9CisgICAgICAoKENvdW50ZXJzUmVnICYgRkRDQU5fRUNSX1JQKSA+PiBGRENBTl9FQ1JfUlBfUG9zKTsKKyAgRXJyb3JDb3VudGVycy0+RXJyb3JMb2dnaW5nID0KKyAgICAgICgoQ291bnRlcnNSZWcgJiBGRENBTl9FQ1JfQ0VMKSA+PiBGRENBTl9FQ1JfQ0VMX1Bvcyk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiAgQ2hlY2sgaWYgYSB0cmFuc21pc3Npb24gcmVxdWVzdCBpcyBwZW5kaW5nIG9uIHRoZSBzZWxlY3RlZCBUeCBidWZmZXIuCisgKiBAcGFyYW0gIGhmZGNhbiBwb2ludGVyIHRvIGFuIEZEQ0FOX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRkRDQU4uCisgKiBAcGFyYW0gIFR4QnVmZmVySW5kZXggVHggYnVmZmVyIGluZGV4LgorICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIEBhcmcgRkRDQU5fVHhfbG9jYXRpb24uCisgKiBAcmV0dmFsIFN0YXR1cworICogICAgICAgICAgLSAwIDogTm8gcGVuZGluZyB0cmFuc21pc3Npb24gcmVxdWVzdCBvbiBUeEJ1ZmZlckluZGV4IGxpc3QuCisgKiAgICAgICAgICAtIDEgOiBQZW5kaW5nIHRyYW5zbWlzc2lvbiByZXF1ZXN0IG9uIFR4QnVmZmVySW5kZXguCisgKi8KK3VpbnQzMl90IEhBTF9GRENBTl9Jc1R4QnVmZmVyTWVzc2FnZVBlbmRpbmcoY29uc3QgRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUeEJ1ZmZlckluZGV4KSB7CisgIC8qIENoZWNrIGZ1bmN0aW9uIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0ZEQ0FOX1RYX0xPQ0FUSU9OX0xJU1QoVHhCdWZmZXJJbmRleCkpOworCisgIC8qIENoZWNrIHBlbmRpbmcgdHJhbnNtaXNzaW9uIHJlcXVlc3Qgb24gdGhlIHNlbGVjdGVkIGJ1ZmZlciAqLworICBpZiAoKGhmZGNhbi0+SW5zdGFuY2UtPlRYQlJQICYgVHhCdWZmZXJJbmRleCkgPT0gMFUpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gMTsKK30KKworLyoqCisgKiBAYnJpZWYgIFJldHVybiBSeCBGSUZPIGZpbGwgbGV2ZWwuCisgKiBAcGFyYW0gIGhmZGNhbiBwb2ludGVyIHRvIGFuIEZEQ0FOX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRkRDQU4uCisgKiBAcGFyYW0gIFJ4RmlmbyBSeCBGSUZPLgorICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgIEBhcmcgRkRDQU5fUlhfRklGTzA6IFJ4IEZJRk8gMAorICogICAgICAgICAgIEBhcmcgRkRDQU5fUlhfRklGTzE6IFJ4IEZJRk8gMQorICogQHJldHZhbCBSeCBGSUZPIGZpbGwgbGV2ZWwuCisgKi8KK3VpbnQzMl90IEhBTF9GRENBTl9HZXRSeEZpZm9GaWxsTGV2ZWwoY29uc3QgRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBSeEZpZm8pIHsKKyAgdWludDMyX3QgRmlsbExldmVsOworCisgIC8qIENoZWNrIGZ1bmN0aW9uIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0ZEQ0FOX1JYX0ZJRk8oUnhGaWZvKSk7CisKKyAgaWYgKFJ4RmlmbyA9PSBGRENBTl9SWF9GSUZPMCkgeworICAgIEZpbGxMZXZlbCA9IGhmZGNhbi0+SW5zdGFuY2UtPlJYRjBTICYgRkRDQU5fUlhGMFNfRjBGTDsKKyAgfSBlbHNlIC8qIFJ4RmlmbyA9PSBGRENBTl9SWF9GSUZPMSAqLworICB7CisgICAgRmlsbExldmVsID0gaGZkY2FuLT5JbnN0YW5jZS0+UlhGMVMgJiBGRENBTl9SWEYxU19GMUZMOworICB9CisKKyAgLyogUmV0dXJuIFJ4IEZJRk8gZmlsbCBsZXZlbCAqLworICByZXR1cm4gRmlsbExldmVsOworfQorCisvKioKKyAqIEBicmllZiAgUmV0dXJuIFR4IEZJRk8gZnJlZSBsZXZlbDogbnVtYmVyIG9mIGNvbnNlY3V0aXZlIGZyZWUgVHggRklGTworICogICAgICAgICBlbGVtZW50cyBzdGFydGluZyBmcm9tIFR4IEZJRk8gR2V0SW5kZXguCisgKiBAcGFyYW0gIGhmZGNhbiBwb2ludGVyIHRvIGFuIEZEQ0FOX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRkRDQU4uCisgKiBAcmV0dmFsIFR4IEZJRk8gZnJlZSBsZXZlbC4KKyAqLwordWludDMyX3QgSEFMX0ZEQ0FOX0dldFR4Rmlmb0ZyZWVMZXZlbChjb25zdCBGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pIHsKKyAgdWludDMyX3QgRnJlZUxldmVsOworCisgIEZyZWVMZXZlbCA9IGhmZGNhbi0+SW5zdGFuY2UtPlRYRlFTICYgRkRDQU5fVFhGUVNfVEZGTDsKKworICAvKiBSZXR1cm4gVHggRklGTyBmcmVlIGxldmVsICovCisgIHJldHVybiBGcmVlTGV2ZWw7Cit9CisKKy8qKgorICogQGJyaWVmICBDaGVjayBpZiB0aGUgRkRDQU4gcGVyaXBoZXJhbCBlbnRlcmVkIFJlc3RyaWN0ZWQgT3BlcmF0aW9uIE1vZGUuCisgKiBAcGFyYW0gIGhmZGNhbiBwb2ludGVyIHRvIGFuIEZEQ0FOX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRkRDQU4uCisgKiBAcmV0dmFsIFN0YXR1cworICogICAgICAgICAgLSAwIDogTm9ybWFsIEZEQ0FOIG9wZXJhdGlvbi4KKyAqICAgICAgICAgIC0gMSA6IFJlc3RyaWN0ZWQgT3BlcmF0aW9uIE1vZGUgYWN0aXZlLgorICovCit1aW50MzJfdCBIQUxfRkRDQU5fSXNSZXN0cmljdGVkT3BlcmF0aW9uTW9kZSgKKyAgICBjb25zdCBGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pIHsKKyAgdWludDMyX3QgT3BlcmF0aW9uTW9kZTsKKworICAvKiBHZXQgT3BlcmF0aW9uIE1vZGUgKi8KKyAgT3BlcmF0aW9uTW9kZSA9CisgICAgICAoKGhmZGNhbi0+SW5zdGFuY2UtPkNDQ1IgJiBGRENBTl9DQ0NSX0FTTSkgPj4gRkRDQU5fQ0NDUl9BU01fUG9zKTsKKworICByZXR1cm4gT3BlcmF0aW9uTW9kZTsKK30KKworLyoqCisgKiBAYnJpZWYgIEV4aXQgUmVzdHJpY3RlZCBPcGVyYXRpb24gTW9kZS4KKyAqIEBwYXJhbSAgaGZkY2FuIHBvaW50ZXIgdG8gYW4gRkRDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBGRENBTi4KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fRXhpdFJlc3RyaWN0ZWRPcGVyYXRpb25Nb2RlKAorICAgIEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbikgeworICBIQUxfRkRDQU5fU3RhdGVUeXBlRGVmIHN0YXRlID0gaGZkY2FuLT5TdGF0ZTsKKworICBpZiAoKHN0YXRlID09IEhBTF9GRENBTl9TVEFURV9SRUFEWSkgfHwgKHN0YXRlID09IEhBTF9GRENBTl9TVEFURV9CVVNZKSkgeworICAgIC8qIEV4aXQgUmVzdHJpY3RlZCBPcGVyYXRpb24gbW9kZSAqLworICAgIENMRUFSX0JJVChoZmRjYW4tPkluc3RhbmNlLT5DQ0NSLCBGRENBTl9DQ0NSX0FTTSk7CisKKyAgICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfSBlbHNlIHsKKyAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLworICAgIGhmZGNhbi0+RXJyb3JDb2RlIHw9IEhBTF9GRENBTl9FUlJPUl9OT1RfSU5JVElBTElaRUQ7CisKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9Cit9CisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEZEQ0FOX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQgSW50ZXJydXB0cyBtYW5hZ2VtZW50CisgICogIEBicmllZiAgICBJbnRlcnJ1cHRzIG1hbmFnZW1lbnQKKyAgKgorQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBJbnRlcnJ1cHRzIG1hbmFnZW1lbnQgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBIQUxfRkRDQU5fQ29uZmlnSW50ZXJydXB0TGluZXMgICAgICA6IEFzc2lnbiBpbnRlcnJ1cHRzIHRvIGVpdGhlcgorSW50ZXJydXB0IGxpbmUgMCBvciAxCisgICAgICAoKykgSEFMX0ZEQ0FOX0FjdGl2YXRlTm90aWZpY2F0aW9uICAgICAgOiBFbmFibGUgaW50ZXJydXB0cworICAgICAgKCspIEhBTF9GRENBTl9EZWFjdGl2YXRlTm90aWZpY2F0aW9uICAgIDogRGlzYWJsZSBpbnRlcnJ1cHRzCisgICAgICAoKykgSEFMX0ZEQ0FOX0lSUUhhbmRsZXIgICAgICAgICAgICAgICAgOiBIYW5kbGVzIEZEQ0FOIGludGVycnVwdCByZXF1ZXN0CisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICogQGJyaWVmICBBc3NpZ24gaW50ZXJydXB0cyB0byBlaXRoZXIgSW50ZXJydXB0IGxpbmUgMCBvciAxLgorICogQHBhcmFtICBoZmRjYW4gcG9pbnRlciB0byBhbiBGRENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZEQ0FOLgorICogQHBhcmFtICBJVExpc3QgaW5kaWNhdGVzIHdoaWNoIGludGVycnVwdHMgZ3JvdXAgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUKKyAqIHNlbGVjdGVkIGludGVycnVwdCBsaW5lLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIEBhcmcKKyAqIEZEQ0FOX0ludGVycnVwdHNfR3JvdXAuCisgKiBAcGFyYW0gIEludGVycnVwdExpbmUgSW50ZXJydXB0IGxpbmUuCisgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEBhcmcgRkRDQU5fSW50ZXJydXB0X0xpbmUuCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZEQ0FOX0NvbmZpZ0ludGVycnVwdExpbmVzKEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBJVExpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgSW50ZXJydXB0TGluZSkgeworICBIQUxfRkRDQU5fU3RhdGVUeXBlRGVmIHN0YXRlID0gaGZkY2FuLT5TdGF0ZTsKKworICAvKiBDaGVjayBmdW5jdGlvbiBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19GRENBTl9JVF9HUk9VUChJVExpc3QpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZEQ0FOX0lUX0xJTkUoSW50ZXJydXB0TGluZSkpOworCisgIGlmICgoc3RhdGUgPT0gSEFMX0ZEQ0FOX1NUQVRFX1JFQURZKSB8fCAoc3RhdGUgPT0gSEFMX0ZEQ0FOX1NUQVRFX0JVU1kpKSB7CisgICAgLyogQXNzaWduIGxpc3Qgb2YgaW50ZXJydXB0cyB0byB0aGUgc2VsZWN0ZWQgbGluZSAqLworICAgIGlmIChJbnRlcnJ1cHRMaW5lID09IEZEQ0FOX0lOVEVSUlVQVF9MSU5FMCkgeworICAgICAgQ0xFQVJfQklUKGhmZGNhbi0+SW5zdGFuY2UtPklMUywgSVRMaXN0KTsKKyAgICB9IGVsc2UgLyogSW50ZXJydXB0TGluZSA9PSBGRENBTl9JTlRFUlJVUFRfTElORTEgKi8KKyAgICB7CisgICAgICBTRVRfQklUKGhmZGNhbi0+SW5zdGFuY2UtPklMUywgSVRMaXN0KTsKKyAgICB9CisKKyAgICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfSBlbHNlIHsKKyAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLworICAgIGhmZGNhbi0+RXJyb3JDb2RlIHw9IEhBTF9GRENBTl9FUlJPUl9OT1RfSU5JVElBTElaRUQ7CisKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgaW50ZXJydXB0cy4KKyAqIEBwYXJhbSAgaGZkY2FuIHBvaW50ZXIgdG8gYW4gRkRDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBGRENBTi4KKyAqIEBwYXJhbSAgQWN0aXZlSVRzIGluZGljYXRlcyB3aGljaCBpbnRlcnJ1cHRzIHdpbGwgYmUgZW5hYmxlZC4KKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiBAYXJnIEZEQ0FOX0ludGVycnVwdHMuCisgKiBAcGFyYW0gIEJ1ZmZlckluZGV4ZXMgVHggQnVmZmVyIEluZGV4ZXMuCisgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgQGFyZyBGRENBTl9UeF9sb2NhdGlvbi4KKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgaXMgaWdub3JlZCBpZiBBY3RpdmVJVHMgZG9lcyBub3QgaW5jbHVkZSBvbmUgb2YgdGhlCisgKiBmb2xsb3dpbmc6CisgKiAgICAgICAgICAgLSBGRENBTl9JVF9UWF9DT01QTEVURQorICogICAgICAgICAgIC0gRkRDQU5fSVRfVFhfQUJPUlRfQ09NUExFVEUKKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fQWN0aXZhdGVOb3RpZmljYXRpb24oRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEFjdGl2ZUlUcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBCdWZmZXJJbmRleGVzKSB7CisgIEhBTF9GRENBTl9TdGF0ZVR5cGVEZWYgc3RhdGUgPSBoZmRjYW4tPlN0YXRlOworICB1aW50MzJfdCBJVHNfbGluZXNfc2VsZWN0aW9uOworCisgIC8qIENoZWNrIGZ1bmN0aW9uIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0ZEQ0FOX0lUKEFjdGl2ZUlUcykpOworICBpZiAoKEFjdGl2ZUlUcyAmIChGRENBTl9JVF9UWF9DT01QTEVURSB8IEZEQ0FOX0lUX1RYX0FCT1JUX0NPTVBMRVRFKSkgIT0gMFUpIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfRkRDQU5fVFhfTE9DQVRJT05fTElTVChCdWZmZXJJbmRleGVzKSk7CisgIH0KKworICBpZiAoKHN0YXRlID09IEhBTF9GRENBTl9TVEFURV9SRUFEWSkgfHwgKHN0YXRlID09IEhBTF9GRENBTl9TVEFURV9CVVNZKSkgeworICAgIC8qIEdldCBpbnRlcnJ1cHRzIGxpbmUgc2VsZWN0aW9uICovCisgICAgSVRzX2xpbmVzX3NlbGVjdGlvbiA9IGhmZGNhbi0+SW5zdGFuY2UtPklMUzsKKworICAgIC8qIEVuYWJsZSBJbnRlcnJ1cHQgbGluZXMgKi8KKyAgICBpZiAoKCgoQWN0aXZlSVRzICYgRkRDQU5fSVRfTElTVF9SWF9GSUZPMCkgIT0gMFUpICYmCisgICAgICAgICAoKChJVHNfbGluZXNfc2VsZWN0aW9uKSZGRENBTl9JVF9HUk9VUF9SWF9GSUZPMCkgPT0gMFUpKSB8fAorICAgICAgICAoKChBY3RpdmVJVHMgJiBGRENBTl9JVF9MSVNUX1JYX0ZJRk8xKSAhPSAwVSkgJiYKKyAgICAgICAgICgoKElUc19saW5lc19zZWxlY3Rpb24pJkZEQ0FOX0lUX0dST1VQX1JYX0ZJRk8xKSA9PSAwVSkpIHx8CisgICAgICAgICgoKEFjdGl2ZUlUcyAmIEZEQ0FOX0lUX0xJU1RfU01TRykgIT0gMFUpICYmCisgICAgICAgICAoKChJVHNfbGluZXNfc2VsZWN0aW9uKSZGRENBTl9JVF9HUk9VUF9TTVNHKSA9PSAwVSkpIHx8CisgICAgICAgICgoKEFjdGl2ZUlUcyAmIEZEQ0FOX0lUX0xJU1RfVFhfRklGT19FUlJPUikgIT0gMFUpICYmCisgICAgICAgICAoKChJVHNfbGluZXNfc2VsZWN0aW9uKSZGRENBTl9JVF9HUk9VUF9UWF9GSUZPX0VSUk9SKSA9PSAwVSkpIHx8CisgICAgICAgICgoKEFjdGl2ZUlUcyAmIEZEQ0FOX0lUX0xJU1RfTUlTQykgIT0gMFUpICYmCisgICAgICAgICAoKChJVHNfbGluZXNfc2VsZWN0aW9uKSZGRENBTl9JVF9HUk9VUF9NSVNDKSA9PSAwVSkpIHx8CisgICAgICAgICgoKEFjdGl2ZUlUcyAmIEZEQ0FOX0lUX0xJU1RfQklUX0xJTkVfRVJST1IpICE9IDBVKSAmJgorICAgICAgICAgKCgoSVRzX2xpbmVzX3NlbGVjdGlvbikmRkRDQU5fSVRfR1JPVVBfQklUX0xJTkVfRVJST1IpID09IDBVKSkgfHwKKyAgICAgICAgKCgoQWN0aXZlSVRzICYgRkRDQU5fSVRfTElTVF9QUk9UT0NPTF9FUlJPUikgIT0gMFUpICYmCisgICAgICAgICAoKChJVHNfbGluZXNfc2VsZWN0aW9uKSZGRENBTl9JVF9HUk9VUF9QUk9UT0NPTF9FUlJPUikgPT0gMFUpKSkgeworICAgICAgLyogRW5hYmxlIEludGVycnVwdCBsaW5lIDAgKi8KKyAgICAgIFNFVF9CSVQoaGZkY2FuLT5JbnN0YW5jZS0+SUxFLCBGRENBTl9JTlRFUlJVUFRfTElORTApOworICAgIH0KKyAgICBpZiAoKCgoQWN0aXZlSVRzICYgRkRDQU5fSVRfTElTVF9SWF9GSUZPMCkgIT0gMFUpICYmCisgICAgICAgICAoKChJVHNfbGluZXNfc2VsZWN0aW9uKSZGRENBTl9JVF9HUk9VUF9SWF9GSUZPMCkgIT0gMFUpKSB8fAorICAgICAgICAoKChBY3RpdmVJVHMgJiBGRENBTl9JVF9MSVNUX1JYX0ZJRk8xKSAhPSAwVSkgJiYKKyAgICAgICAgICgoKElUc19saW5lc19zZWxlY3Rpb24pJkZEQ0FOX0lUX0dST1VQX1JYX0ZJRk8xKSAhPSAwVSkpIHx8CisgICAgICAgICgoKEFjdGl2ZUlUcyAmIEZEQ0FOX0lUX0xJU1RfU01TRykgIT0gMFUpICYmCisgICAgICAgICAoKChJVHNfbGluZXNfc2VsZWN0aW9uKSZGRENBTl9JVF9HUk9VUF9TTVNHKSAhPSAwVSkpIHx8CisgICAgICAgICgoKEFjdGl2ZUlUcyAmIEZEQ0FOX0lUX0xJU1RfVFhfRklGT19FUlJPUikgIT0gMFUpICYmCisgICAgICAgICAoKChJVHNfbGluZXNfc2VsZWN0aW9uKSZGRENBTl9JVF9HUk9VUF9UWF9GSUZPX0VSUk9SKSAhPSAwVSkpIHx8CisgICAgICAgICgoKEFjdGl2ZUlUcyAmIEZEQ0FOX0lUX0xJU1RfTUlTQykgIT0gMFUpICYmCisgICAgICAgICAoKChJVHNfbGluZXNfc2VsZWN0aW9uKSZGRENBTl9JVF9HUk9VUF9NSVNDKSAhPSAwVSkpIHx8CisgICAgICAgICgoKEFjdGl2ZUlUcyAmIEZEQ0FOX0lUX0xJU1RfQklUX0xJTkVfRVJST1IpICE9IDBVKSAmJgorICAgICAgICAgKCgoSVRzX2xpbmVzX3NlbGVjdGlvbikmRkRDQU5fSVRfR1JPVVBfQklUX0xJTkVfRVJST1IpICE9IDBVKSkgfHwKKyAgICAgICAgKCgoQWN0aXZlSVRzICYgRkRDQU5fSVRfTElTVF9QUk9UT0NPTF9FUlJPUikgIT0gMFUpICYmCisgICAgICAgICAoKChJVHNfbGluZXNfc2VsZWN0aW9uKSZGRENBTl9JVF9HUk9VUF9QUk9UT0NPTF9FUlJPUikgIT0gMFUpKSkgeworICAgICAgLyogRW5hYmxlIEludGVycnVwdCBsaW5lIDEgKi8KKyAgICAgIFNFVF9CSVQoaGZkY2FuLT5JbnN0YW5jZS0+SUxFLCBGRENBTl9JTlRFUlJVUFRfTElORTEpOworICAgIH0KKworICAgIGlmICgoQWN0aXZlSVRzICYgRkRDQU5fSVRfVFhfQ09NUExFVEUpICE9IDBVKSB7CisgICAgICAvKiBFbmFibGUgVHggQnVmZmVyIFRyYW5zbWlzc2lvbiBJbnRlcnJ1cHQgdG8gc2V0IFRDIGZsYWcgaW4gSVIgcmVnaXN0ZXIsCisgICAgICAgICBidXQgaW50ZXJydXB0IHdpbGwgb25seSBvY2N1ciBpZiBUQyBpcyBlbmFibGVkIGluIElFIHJlZ2lzdGVyICovCisgICAgICBTRVRfQklUKGhmZGNhbi0+SW5zdGFuY2UtPlRYQlRJRSwgQnVmZmVySW5kZXhlcyk7CisgICAgfQorCisgICAgaWYgKChBY3RpdmVJVHMgJiBGRENBTl9JVF9UWF9BQk9SVF9DT01QTEVURSkgIT0gMFUpIHsKKyAgICAgIC8qIEVuYWJsZSBUeCBCdWZmZXIgQ2FuY2VsbGF0aW9uIEZpbmlzaGVkIEludGVycnVwdCB0byBzZXQgVENGIGZsYWcgaW4gSVIKKyAgICAgICAgIHJlZ2lzdGVyLCBidXQgaW50ZXJydXB0IHdpbGwgb25seSBvY2N1ciBpZiBUQ0YgaXMgZW5hYmxlZCBpbiBJRQorICAgICAgICAgcmVnaXN0ZXIgKi8KKyAgICAgIFNFVF9CSVQoaGZkY2FuLT5JbnN0YW5jZS0+VFhCQ0lFLCBCdWZmZXJJbmRleGVzKTsKKyAgICB9CisKKyAgICAvKiBFbmFibGUgdGhlIHNlbGVjdGVkIGludGVycnVwdHMgKi8KKyAgICBfX0hBTF9GRENBTl9FTkFCTEVfSVQoaGZkY2FuLCBBY3RpdmVJVHMpOworCisgICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICAgIHJldHVybiBIQUxfT0s7CisgIH0gZWxzZSB7CisgICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8KKyAgICBoZmRjYW4tPkVycm9yQ29kZSB8PSBIQUxfRkRDQU5fRVJST1JfTk9UX0lOSVRJQUxJWkVEOworCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBpbnRlcnJ1cHRzLgorICogQHBhcmFtICBoZmRjYW4gcG9pbnRlciB0byBhbiBGRENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZEQ0FOLgorICogQHBhcmFtICBJbmFjdGl2ZUlUcyBpbmRpY2F0ZXMgd2hpY2ggaW50ZXJydXB0cyB3aWxsIGJlIGRpc2FibGVkLgorICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIEBhcmcgRkRDQU5fSW50ZXJydXB0cy4KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkRDQU5fRGVhY3RpdmF0ZU5vdGlmaWNhdGlvbihGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBJbmFjdGl2ZUlUcykgeworICBIQUxfRkRDQU5fU3RhdGVUeXBlRGVmIHN0YXRlID0gaGZkY2FuLT5TdGF0ZTsKKyAgdWludDMyX3QgSVRzX2VuYWJsZWQ7CisgIHVpbnQzMl90IElUc19saW5lc19zZWxlY3Rpb247CisKKyAgLyogQ2hlY2sgZnVuY3Rpb24gcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfRkRDQU5fSVQoSW5hY3RpdmVJVHMpKTsKKworICBpZiAoKHN0YXRlID09IEhBTF9GRENBTl9TVEFURV9SRUFEWSkgfHwgKHN0YXRlID09IEhBTF9GRENBTl9TVEFURV9CVVNZKSkgeworICAgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIGludGVycnVwdHMgKi8KKyAgICBfX0hBTF9GRENBTl9ESVNBQkxFX0lUKGhmZGNhbiwgSW5hY3RpdmVJVHMpOworCisgICAgaWYgKChJbmFjdGl2ZUlUcyAmIEZEQ0FOX0lUX1RYX0NPTVBMRVRFKSAhPSAwVSkgeworICAgICAgLyogRGlzYWJsZSBUeCBCdWZmZXIgVHJhbnNtaXNzaW9uIEludGVycnVwdHMgKi8KKyAgICAgIENMRUFSX1JFRyhoZmRjYW4tPkluc3RhbmNlLT5UWEJUSUUpOworICAgIH0KKworICAgIGlmICgoSW5hY3RpdmVJVHMgJiBGRENBTl9JVF9UWF9BQk9SVF9DT01QTEVURSkgIT0gMFUpIHsKKyAgICAgIC8qIERpc2FibGUgVHggQnVmZmVyIENhbmNlbGxhdGlvbiBGaW5pc2hlZCBJbnRlcnJ1cHQgKi8KKyAgICAgIENMRUFSX1JFRyhoZmRjYW4tPkluc3RhbmNlLT5UWEJDSUUpOworICAgIH0KKworICAgIC8qIEdldCBpbnRlcnJ1cHRzIGVuYWJsZWQgYW5kIGludGVycnVwdHMgbGluZSBzZWxlY3Rpb24gKi8KKyAgICBJVHNfZW5hYmxlZCA9IGhmZGNhbi0+SW5zdGFuY2UtPklFOworICAgIElUc19saW5lc19zZWxlY3Rpb24gPSBoZmRjYW4tPkluc3RhbmNlLT5JTFM7CisKKyAgICAvKiBDaGVjayBpZiBzb21lIGludGVycnVwdHMgYXJlIHN0aWxsIGVuYWJsZWQgb24gaW50ZXJydXB0IGxpbmUgMCAqLworICAgIGlmICgoKChJVHNfZW5hYmxlZCAmIEZEQ0FOX0lUX0xJU1RfUlhfRklGTzApICE9IDBVKSAmJgorICAgICAgICAgKCgoSVRzX2xpbmVzX3NlbGVjdGlvbikmRkRDQU5fSVRfR1JPVVBfUlhfRklGTzApID09IDBVKSkgfHwKKyAgICAgICAgKCgoSVRzX2VuYWJsZWQgJiBGRENBTl9JVF9MSVNUX1JYX0ZJRk8xKSAhPSAwVSkgJiYKKyAgICAgICAgICgoKElUc19saW5lc19zZWxlY3Rpb24pJkZEQ0FOX0lUX0dST1VQX1JYX0ZJRk8xKSA9PSAwVSkpIHx8CisgICAgICAgICgoKElUc19lbmFibGVkICYgRkRDQU5fSVRfTElTVF9TTVNHKSAhPSAwVSkgJiYKKyAgICAgICAgICgoKElUc19saW5lc19zZWxlY3Rpb24pJkZEQ0FOX0lUX0dST1VQX1NNU0cpID09IDBVKSkgfHwKKyAgICAgICAgKCgoSVRzX2VuYWJsZWQgJiBGRENBTl9JVF9MSVNUX1RYX0ZJRk9fRVJST1IpICE9IDBVKSAmJgorICAgICAgICAgKCgoSVRzX2xpbmVzX3NlbGVjdGlvbikmRkRDQU5fSVRfR1JPVVBfVFhfRklGT19FUlJPUikgPT0gMFUpKSB8fAorICAgICAgICAoKChJVHNfZW5hYmxlZCAmIEZEQ0FOX0lUX0xJU1RfTUlTQykgIT0gMFUpICYmCisgICAgICAgICAoKChJVHNfbGluZXNfc2VsZWN0aW9uKSZGRENBTl9JVF9HUk9VUF9NSVNDKSA9PSAwVSkpIHx8CisgICAgICAgICgoKElUc19lbmFibGVkICYgRkRDQU5fSVRfTElTVF9CSVRfTElORV9FUlJPUikgIT0gMFUpICYmCisgICAgICAgICAoKChJVHNfbGluZXNfc2VsZWN0aW9uKSZGRENBTl9JVF9HUk9VUF9CSVRfTElORV9FUlJPUikgPT0gMFUpKSB8fAorICAgICAgICAoKChJVHNfZW5hYmxlZCAmIEZEQ0FOX0lUX0xJU1RfUFJPVE9DT0xfRVJST1IpICE9IDBVKSAmJgorICAgICAgICAgKCgoSVRzX2xpbmVzX3NlbGVjdGlvbikmRkRDQU5fSVRfR1JPVVBfUFJPVE9DT0xfRVJST1IpID09IDBVKSkpIHsKKyAgICAgIC8qIERvIG5vdGhpbmcgKi8KKyAgICB9IGVsc2UgLyogbm8gbW9yZSBpbnRlcnJ1cHRzIGVuYWJsZWQgb24gaW50ZXJydXB0IGxpbmUgMCAqLworICAgIHsKKyAgICAgIC8qIERpc2FibGUgaW50ZXJydXB0IGxpbmUgMCAqLworICAgICAgQ0xFQVJfQklUKGhmZGNhbi0+SW5zdGFuY2UtPklMRSwgRkRDQU5fSU5URVJSVVBUX0xJTkUwKTsKKyAgICB9CisKKyAgICAvKiBDaGVjayBpZiBzb21lIGludGVycnVwdHMgYXJlIHN0aWxsIGVuYWJsZWQgb24gaW50ZXJydXB0IGxpbmUgMSAqLworICAgIGlmICgoKChJVHNfZW5hYmxlZCAmIEZEQ0FOX0lUX0xJU1RfUlhfRklGTzApICE9IDBVKSAmJgorICAgICAgICAgKCgoSVRzX2xpbmVzX3NlbGVjdGlvbikmRkRDQU5fSVRfR1JPVVBfUlhfRklGTzApICE9IDBVKSkgfHwKKyAgICAgICAgKCgoSVRzX2VuYWJsZWQgJiBGRENBTl9JVF9MSVNUX1JYX0ZJRk8xKSAhPSAwVSkgJiYKKyAgICAgICAgICgoKElUc19saW5lc19zZWxlY3Rpb24pJkZEQ0FOX0lUX0dST1VQX1JYX0ZJRk8xKSAhPSAwVSkpIHx8CisgICAgICAgICgoKElUc19lbmFibGVkICYgRkRDQU5fSVRfTElTVF9TTVNHKSAhPSAwVSkgJiYKKyAgICAgICAgICgoKElUc19saW5lc19zZWxlY3Rpb24pJkZEQ0FOX0lUX0dST1VQX1NNU0cpICE9IDBVKSkgfHwKKyAgICAgICAgKCgoSVRzX2VuYWJsZWQgJiBGRENBTl9JVF9MSVNUX1RYX0ZJRk9fRVJST1IpICE9IDBVKSAmJgorICAgICAgICAgKCgoSVRzX2xpbmVzX3NlbGVjdGlvbikmRkRDQU5fSVRfR1JPVVBfVFhfRklGT19FUlJPUikgIT0gMFUpKSB8fAorICAgICAgICAoKChJVHNfZW5hYmxlZCAmIEZEQ0FOX0lUX0xJU1RfTUlTQykgIT0gMFUpICYmCisgICAgICAgICAoKChJVHNfbGluZXNfc2VsZWN0aW9uKSZGRENBTl9JVF9HUk9VUF9NSVNDKSAhPSAwVSkpIHx8CisgICAgICAgICgoKElUc19lbmFibGVkICYgRkRDQU5fSVRfTElTVF9CSVRfTElORV9FUlJPUikgIT0gMFUpICYmCisgICAgICAgICAoKChJVHNfbGluZXNfc2VsZWN0aW9uKSZGRENBTl9JVF9HUk9VUF9CSVRfTElORV9FUlJPUikgIT0gMFUpKSB8fAorICAgICAgICAoKChJVHNfZW5hYmxlZCAmIEZEQ0FOX0lUX0xJU1RfUFJPVE9DT0xfRVJST1IpICE9IDBVKSAmJgorICAgICAgICAgKCgoSVRzX2xpbmVzX3NlbGVjdGlvbikmRkRDQU5fSVRfR1JPVVBfUFJPVE9DT0xfRVJST1IpICE9IDBVKSkpIHsKKyAgICAgIC8qIERvIG5vdGhpbmcgKi8KKyAgICB9IGVsc2UgLyogbm8gbW9yZSBpbnRlcnJ1cHRzIGVuYWJsZWQgb24gaW50ZXJydXB0IGxpbmUgMSAqLworICAgIHsKKyAgICAgIC8qIERpc2FibGUgaW50ZXJydXB0IGxpbmUgMSAqLworICAgICAgQ0xFQVJfQklUKGhmZGNhbi0+SW5zdGFuY2UtPklMRSwgRkRDQU5fSU5URVJSVVBUX0xJTkUxKTsKKyAgICB9CisKKyAgICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfSBlbHNlIHsKKyAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLworICAgIGhmZGNhbi0+RXJyb3JDb2RlIHw9IEhBTF9GRENBTl9FUlJPUl9OT1RfSU5JVElBTElaRUQ7CisKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9Cit9CisKKy8qKgorICogQGJyaWVmICBIYW5kbGVzIEZEQ0FOIGludGVycnVwdCByZXF1ZXN0LgorICogQHBhcmFtICBoZmRjYW4gcG9pbnRlciB0byBhbiBGRENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZEQ0FOLgorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK3ZvaWQgSEFMX0ZEQ0FOX0lSUUhhbmRsZXIoRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuKSB7CisgIHVpbnQzMl90IFR4RXZlbnRGaWZvSVRzOworICB1aW50MzJfdCBSeEZpZm8wSVRzOworICB1aW50MzJfdCBSeEZpZm8xSVRzOworICB1aW50MzJfdCBFcnJvcnM7CisgIHVpbnQzMl90IEVycm9yU3RhdHVzSVRzOworICB1aW50MzJfdCBUcmFuc21pdHRlZEJ1ZmZlcnM7CisgIHVpbnQzMl90IEFib3J0ZWRCdWZmZXJzOworICB1aW50MzJfdCBpdHNvdXJjZTsKKyAgdWludDMyX3QgaXRmbGFnOworCisgIFR4RXZlbnRGaWZvSVRzID0gaGZkY2FuLT5JbnN0YW5jZS0+SVIgJiBGRENBTl9UWF9FVkVOVF9GSUZPX01BU0s7CisgIFR4RXZlbnRGaWZvSVRzICY9IGhmZGNhbi0+SW5zdGFuY2UtPklFOworICBSeEZpZm8wSVRzID0gaGZkY2FuLT5JbnN0YW5jZS0+SVIgJiBGRENBTl9SWF9GSUZPMF9NQVNLOworICBSeEZpZm8wSVRzICY9IGhmZGNhbi0+SW5zdGFuY2UtPklFOworICBSeEZpZm8xSVRzID0gaGZkY2FuLT5JbnN0YW5jZS0+SVIgJiBGRENBTl9SWF9GSUZPMV9NQVNLOworICBSeEZpZm8xSVRzICY9IGhmZGNhbi0+SW5zdGFuY2UtPklFOworICBFcnJvcnMgPSBoZmRjYW4tPkluc3RhbmNlLT5JUiAmIEZEQ0FOX0VSUk9SX01BU0s7CisgIEVycm9ycyAmPSBoZmRjYW4tPkluc3RhbmNlLT5JRTsKKyAgRXJyb3JTdGF0dXNJVHMgPSBoZmRjYW4tPkluc3RhbmNlLT5JUiAmIEZEQ0FOX0VSUk9SX1NUQVRVU19NQVNLOworICBFcnJvclN0YXR1c0lUcyAmPSBoZmRjYW4tPkluc3RhbmNlLT5JRTsKKyAgaXRzb3VyY2UgPSBoZmRjYW4tPkluc3RhbmNlLT5JRTsKKyAgaXRmbGFnID0gaGZkY2FuLT5JbnN0YW5jZS0+SVI7CisKKyAgLyogSGlnaCBQcmlvcml0eSBNZXNzYWdlIGludGVycnVwdCBtYW5hZ2VtZW50ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIGlmIChGRENBTl9DSEVDS19GTEFHKGl0ZmxhZywgRkRDQU5fRkxBR19SWF9ISUdIX1BSSU9SSVRZX01TRykgIT0gUkVTRVQpIHsKKyAgICBpZiAoRkRDQU5fQ0hFQ0tfSVRfU09VUkNFKGl0c291cmNlLCBGRENBTl9JVF9SWF9ISUdIX1BSSU9SSVRZX01TRykgIT0KKyAgICAgICAgUkVTRVQpIHsKKyAgICAgIC8qIENsZWFyIHRoZSBIaWdoIFByaW9yaXR5IE1lc3NhZ2UgZmxhZyAqLworICAgICAgX19IQUxfRkRDQU5fQ0xFQVJfRkxBRyhoZmRjYW4sIEZEQ0FOX0ZMQUdfUlhfSElHSF9QUklPUklUWV9NU0cpOworCisjaWYgVVNFX0hBTF9GRENBTl9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMQorICAgICAgLyogQ2FsbCByZWdpc3RlcmVkIGNhbGxiYWNrKi8KKyAgICAgIGhmZGNhbi0+SGlnaFByaW9yaXR5TWVzc2FnZUNhbGxiYWNrKGhmZGNhbik7CisjZWxzZQorICAgICAgLyogSGlnaCBQcmlvcml0eSBNZXNzYWdlIENhbGxiYWNrICovCisgICAgICBIQUxfRkRDQU5fSGlnaFByaW9yaXR5TWVzc2FnZUNhbGxiYWNrKGhmZGNhbik7CisjZW5kaWYgLyogVVNFX0hBTF9GRENBTl9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgIH0KKworICAvKiBUcmFuc21pc3Npb24gQWJvcnQgaW50ZXJydXB0IG1hbmFnZW1lbnQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgaWYgKEZEQ0FOX0NIRUNLX0ZMQUcoaXRmbGFnLCBGRENBTl9GTEFHX1RYX0FCT1JUX0NPTVBMRVRFKSAhPSBSRVNFVCkgeworICAgIGlmIChGRENBTl9DSEVDS19JVF9TT1VSQ0UoaXRzb3VyY2UsIEZEQ0FOX0lUX1RYX0FCT1JUX0NPTVBMRVRFKSAhPSBSRVNFVCkgeworICAgICAgLyogTGlzdCBvZiBhYm9ydGVkIG1vbml0b3JlZCBidWZmZXJzICovCisgICAgICBBYm9ydGVkQnVmZmVycyA9IGhmZGNhbi0+SW5zdGFuY2UtPlRYQkNGOworICAgICAgQWJvcnRlZEJ1ZmZlcnMgJj0gaGZkY2FuLT5JbnN0YW5jZS0+VFhCQ0lFOworCisgICAgICAvKiBDbGVhciB0aGUgVHJhbnNtaXNzaW9uIENhbmNlbGxhdGlvbiBmbGFnICovCisgICAgICBfX0hBTF9GRENBTl9DTEVBUl9GTEFHKGhmZGNhbiwgRkRDQU5fRkxBR19UWF9BQk9SVF9DT01QTEVURSk7CisKKyNpZiBVU0VfSEFMX0ZEQ0FOX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxCisgICAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgY2FsbGJhY2sqLworICAgICAgaGZkY2FuLT5UeEJ1ZmZlckFib3J0Q2FsbGJhY2soaGZkY2FuLCBBYm9ydGVkQnVmZmVycyk7CisjZWxzZQorICAgICAgLyogVHJhbnNtaXNzaW9uIENhbmNlbGxhdGlvbiBDYWxsYmFjayAqLworICAgICAgSEFMX0ZEQ0FOX1R4QnVmZmVyQWJvcnRDYWxsYmFjayhoZmRjYW4sIEFib3J0ZWRCdWZmZXJzKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0ZEQ0FOX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KKyAgfQorCisgIC8qIFR4IGV2ZW50IEZJRk8gaW50ZXJydXB0cyBtYW5hZ2VtZW50ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICBpZiAoVHhFdmVudEZpZm9JVHMgIT0gMFUpIHsKKyAgICAvKiBDbGVhciB0aGUgVHggRXZlbnQgRklGTyBmbGFncyAqLworICAgIF9fSEFMX0ZEQ0FOX0NMRUFSX0ZMQUcoaGZkY2FuLCBUeEV2ZW50Rmlmb0lUcyk7CisKKyNpZiBVU0VfSEFMX0ZEQ0FOX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxCisgICAgLyogQ2FsbCByZWdpc3RlcmVkIGNhbGxiYWNrKi8KKyAgICBoZmRjYW4tPlR4RXZlbnRGaWZvQ2FsbGJhY2soaGZkY2FuLCBUeEV2ZW50Rmlmb0lUcyk7CisjZWxzZQorICAgIC8qIFR4IEV2ZW50IEZJRk8gQ2FsbGJhY2sgKi8KKyAgICBIQUxfRkRDQU5fVHhFdmVudEZpZm9DYWxsYmFjayhoZmRjYW4sIFR4RXZlbnRGaWZvSVRzKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0ZEQ0FOX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisKKyAgLyogUnggRklGTyAwIGludGVycnVwdHMgbWFuYWdlbWVudCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIGlmIChSeEZpZm8wSVRzICE9IDBVKSB7CisgICAgLyogQ2xlYXIgdGhlIFJ4IEZJRk8gMCBmbGFncyAqLworICAgIF9fSEFMX0ZEQ0FOX0NMRUFSX0ZMQUcoaGZkY2FuLCBSeEZpZm8wSVRzKTsKKworI2lmIFVTRV9IQUxfRkRDQU5fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEKKyAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgY2FsbGJhY2sqLworICAgIGhmZGNhbi0+UnhGaWZvMENhbGxiYWNrKGhmZGNhbiwgUnhGaWZvMElUcyk7CisjZWxzZQorICAgIC8qIFJ4IEZJRk8gMCBDYWxsYmFjayAqLworICAgIEhBTF9GRENBTl9SeEZpZm8wQ2FsbGJhY2soaGZkY2FuLCBSeEZpZm8wSVRzKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0ZEQ0FOX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisKKyAgLyogUnggRklGTyAxIGludGVycnVwdHMgbWFuYWdlbWVudCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIGlmIChSeEZpZm8xSVRzICE9IDBVKSB7CisgICAgLyogQ2xlYXIgdGhlIFJ4IEZJRk8gMSBmbGFncyAqLworICAgIF9fSEFMX0ZEQ0FOX0NMRUFSX0ZMQUcoaGZkY2FuLCBSeEZpZm8xSVRzKTsKKworI2lmIFVTRV9IQUxfRkRDQU5fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEKKyAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgY2FsbGJhY2sqLworICAgIGhmZGNhbi0+UnhGaWZvMUNhbGxiYWNrKGhmZGNhbiwgUnhGaWZvMUlUcyk7CisjZWxzZQorICAgIC8qIFJ4IEZJRk8gMSBDYWxsYmFjayAqLworICAgIEhBTF9GRENBTl9SeEZpZm8xQ2FsbGJhY2soaGZkY2FuLCBSeEZpZm8xSVRzKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0ZEQ0FOX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisKKyAgLyogVHggRklGTyBlbXB0eSBpbnRlcnJ1cHQgbWFuYWdlbWVudCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIGlmIChGRENBTl9DSEVDS19GTEFHKGl0ZmxhZywgRkRDQU5fRkxBR19UWF9GSUZPX0VNUFRZKSAhPSBSRVNFVCkgeworICAgIGlmIChGRENBTl9DSEVDS19JVF9TT1VSQ0UoaXRzb3VyY2UsIEZEQ0FOX0lUX1RYX0ZJRk9fRU1QVFkpICE9IFJFU0VUKSB7CisgICAgICAvKiBDbGVhciB0aGUgVHggRklGTyBlbXB0eSBmbGFnICovCisgICAgICBfX0hBTF9GRENBTl9DTEVBUl9GTEFHKGhmZGNhbiwgRkRDQU5fRkxBR19UWF9GSUZPX0VNUFRZKTsKKworI2lmIFVTRV9IQUxfRkRDQU5fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEKKyAgICAgIC8qIENhbGwgcmVnaXN0ZXJlZCBjYWxsYmFjayovCisgICAgICBoZmRjYW4tPlR4Rmlmb0VtcHR5Q2FsbGJhY2soaGZkY2FuKTsKKyNlbHNlCisgICAgICAvKiBUeCBGSUZPIGVtcHR5IENhbGxiYWNrICovCisgICAgICBIQUxfRkRDQU5fVHhGaWZvRW1wdHlDYWxsYmFjayhoZmRjYW4pOworI2VuZGlmIC8qIFVTRV9IQUxfRkRDQU5fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgfQorICB9CisKKyAgLyogVHJhbnNtaXNzaW9uIENvbXBsZXRlIGludGVycnVwdCBtYW5hZ2VtZW50ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIGlmIChGRENBTl9DSEVDS19GTEFHKGl0ZmxhZywgRkRDQU5fRkxBR19UWF9DT01QTEVURSkgIT0gUkVTRVQpIHsKKyAgICBpZiAoRkRDQU5fQ0hFQ0tfSVRfU09VUkNFKGl0c291cmNlLCBGRENBTl9JVF9UWF9DT01QTEVURSkgIT0gUkVTRVQpIHsKKyAgICAgIC8qIExpc3Qgb2YgdHJhbnNtaXR0ZWQgbW9uaXRvcmVkIGJ1ZmZlcnMgKi8KKyAgICAgIFRyYW5zbWl0dGVkQnVmZmVycyA9IGhmZGNhbi0+SW5zdGFuY2UtPlRYQlRPOworICAgICAgVHJhbnNtaXR0ZWRCdWZmZXJzICY9IGhmZGNhbi0+SW5zdGFuY2UtPlRYQlRJRTsKKworICAgICAgLyogQ2xlYXIgdGhlIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBmbGFnICovCisgICAgICBfX0hBTF9GRENBTl9DTEVBUl9GTEFHKGhmZGNhbiwgRkRDQU5fRkxBR19UWF9DT01QTEVURSk7CisKKyNpZiBVU0VfSEFMX0ZEQ0FOX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxCisgICAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgY2FsbGJhY2sqLworICAgICAgaGZkY2FuLT5UeEJ1ZmZlckNvbXBsZXRlQ2FsbGJhY2soaGZkY2FuLCBUcmFuc21pdHRlZEJ1ZmZlcnMpOworI2Vsc2UKKyAgICAgIC8qIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBDYWxsYmFjayAqLworICAgICAgSEFMX0ZEQ0FOX1R4QnVmZmVyQ29tcGxldGVDYWxsYmFjayhoZmRjYW4sIFRyYW5zbWl0dGVkQnVmZmVycyk7CisjZW5kaWYgLyogVVNFX0hBTF9GRENBTl9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgIH0KKworICAvKiBUaW1lc3RhbXAgV3JhcGFyb3VuZCBpbnRlcnJ1cHQgbWFuYWdlbWVudCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgaWYgKEZEQ0FOX0NIRUNLX0ZMQUcoaXRmbGFnLCBGRENBTl9GTEFHX1RJTUVTVEFNUF9XUkFQQVJPVU5EKSAhPSBSRVNFVCkgeworICAgIGlmIChGRENBTl9DSEVDS19JVF9TT1VSQ0UoaXRzb3VyY2UsIEZEQ0FOX0lUX1RJTUVTVEFNUF9XUkFQQVJPVU5EKSAhPQorICAgICAgICBSRVNFVCkgeworICAgICAgLyogQ2xlYXIgdGhlIFRpbWVzdGFtcCBXcmFwYXJvdW5kIGZsYWcgKi8KKyAgICAgIF9fSEFMX0ZEQ0FOX0NMRUFSX0ZMQUcoaGZkY2FuLCBGRENBTl9GTEFHX1RJTUVTVEFNUF9XUkFQQVJPVU5EKTsKKworI2lmIFVTRV9IQUxfRkRDQU5fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEKKyAgICAgIC8qIENhbGwgcmVnaXN0ZXJlZCBjYWxsYmFjayovCisgICAgICBoZmRjYW4tPlRpbWVzdGFtcFdyYXBhcm91bmRDYWxsYmFjayhoZmRjYW4pOworI2Vsc2UKKyAgICAgIC8qIFRpbWVzdGFtcCBXcmFwYXJvdW5kIENhbGxiYWNrICovCisgICAgICBIQUxfRkRDQU5fVGltZXN0YW1wV3JhcGFyb3VuZENhbGxiYWNrKGhmZGNhbik7CisjZW5kaWYgLyogVVNFX0hBTF9GRENBTl9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgIH0KKworICAvKiBUaW1lb3V0IE9jY3VycmVkIGludGVycnVwdCBtYW5hZ2VtZW50ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgaWYgKEZEQ0FOX0NIRUNLX0ZMQUcoaXRmbGFnLCBGRENBTl9GTEFHX1RJTUVPVVRfT0NDVVJSRUQpICE9IFJFU0VUKSB7CisgICAgaWYgKEZEQ0FOX0NIRUNLX0lUX1NPVVJDRShpdHNvdXJjZSwgRkRDQU5fSVRfVElNRU9VVF9PQ0NVUlJFRCkgIT0gUkVTRVQpIHsKKyAgICAgIC8qIENsZWFyIHRoZSBUaW1lb3V0IE9jY3VycmVkIGZsYWcgKi8KKyAgICAgIF9fSEFMX0ZEQ0FOX0NMRUFSX0ZMQUcoaGZkY2FuLCBGRENBTl9GTEFHX1RJTUVPVVRfT0NDVVJSRUQpOworCisjaWYgVVNFX0hBTF9GRENBTl9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMQorICAgICAgLyogQ2FsbCByZWdpc3RlcmVkIGNhbGxiYWNrKi8KKyAgICAgIGhmZGNhbi0+VGltZW91dE9jY3VycmVkQ2FsbGJhY2soaGZkY2FuKTsKKyNlbHNlCisgICAgICAvKiBUaW1lb3V0IE9jY3VycmVkIENhbGxiYWNrICovCisgICAgICBIQUxfRkRDQU5fVGltZW91dE9jY3VycmVkQ2FsbGJhY2soaGZkY2FuKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0ZEQ0FOX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KKyAgfQorCisgIC8qIE1lc3NhZ2UgUkFNIGFjY2VzcyBmYWlsdXJlIGludGVycnVwdCBtYW5hZ2VtZW50ICoqKioqKioqKioqKioqKioqKioqKioqKioqLworICBpZiAoRkRDQU5fQ0hFQ0tfRkxBRyhpdGZsYWcsIEZEQ0FOX0ZMQUdfUkFNX0FDQ0VTU19GQUlMVVJFKSAhPSBSRVNFVCkgeworICAgIGlmIChGRENBTl9DSEVDS19JVF9TT1VSQ0UoaXRzb3VyY2UsIEZEQ0FOX0lUX1JBTV9BQ0NFU1NfRkFJTFVSRSkgIT0gUkVTRVQpIHsKKyAgICAgIC8qIENsZWFyIHRoZSBNZXNzYWdlIFJBTSBhY2Nlc3MgZmFpbHVyZSBmbGFnICovCisgICAgICBfX0hBTF9GRENBTl9DTEVBUl9GTEFHKGhmZGNhbiwgRkRDQU5fRkxBR19SQU1fQUNDRVNTX0ZBSUxVUkUpOworCisgICAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLworICAgICAgaGZkY2FuLT5FcnJvckNvZGUgfD0gSEFMX0ZEQ0FOX0VSUk9SX1JBTV9BQ0NFU1M7CisgICAgfQorICB9CisKKyAgLyogRXJyb3IgU3RhdHVzIGludGVycnVwdHMgbWFuYWdlbWVudCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIGlmIChFcnJvclN0YXR1c0lUcyAhPSAwVSkgeworICAgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyAqLworICAgIF9fSEFMX0ZEQ0FOX0NMRUFSX0ZMQUcoaGZkY2FuLCBFcnJvclN0YXR1c0lUcyk7CisKKyNpZiBVU0VfSEFMX0ZEQ0FOX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxCisgICAgLyogQ2FsbCByZWdpc3RlcmVkIGNhbGxiYWNrKi8KKyAgICBoZmRjYW4tPkVycm9yU3RhdHVzQ2FsbGJhY2soaGZkY2FuLCBFcnJvclN0YXR1c0lUcyk7CisjZWxzZQorICAgIC8qIEVycm9yIFN0YXR1cyBDYWxsYmFjayAqLworICAgIEhBTF9GRENBTl9FcnJvclN0YXR1c0NhbGxiYWNrKGhmZGNhbiwgRXJyb3JTdGF0dXNJVHMpOworI2VuZGlmIC8qIFVTRV9IQUxfRkRDQU5fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KKworICAvKiBFcnJvciBpbnRlcnJ1cHRzIG1hbmFnZW1lbnQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgaWYgKEVycm9ycyAhPSAwVSkgeworICAgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyAqLworICAgIF9fSEFMX0ZEQ0FOX0NMRUFSX0ZMQUcoaGZkY2FuLCBFcnJvcnMpOworCisgICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8KKyAgICBoZmRjYW4tPkVycm9yQ29kZSB8PSBFcnJvcnM7CisgIH0KKworICBpZiAoaGZkY2FuLT5FcnJvckNvZGUgIT0gSEFMX0ZEQ0FOX0VSUk9SX05PTkUpIHsKKyNpZiBVU0VfSEFMX0ZEQ0FOX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxCisgICAgLyogQ2FsbCByZWdpc3RlcmVkIGNhbGxiYWNrKi8KKyAgICBoZmRjYW4tPkVycm9yQ2FsbGJhY2soaGZkY2FuKTsKKyNlbHNlCisgICAgLyogRXJyb3IgQ2FsbGJhY2sgKi8KKyAgICBIQUxfRkRDQU5fRXJyb3JDYWxsYmFjayhoZmRjYW4pOworI2VuZGlmIC8qIFVTRV9IQUxfRkRDQU5fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KK30KKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgRkRDQU5fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNSBDYWxsYmFjayBmdW5jdGlvbnMKKyAgKiAgQGJyaWVmICAgRkRDQU4gQ2FsbGJhY2sgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgQ2FsbGJhY2sgZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBjYWxsYmFjayBmdW5jdGlvbnM6CisgICAgICAoKykgSEFMX0ZEQ0FOX1R4RXZlbnRGaWZvQ2FsbGJhY2sKKyAgICAgICgrKSBIQUxfRkRDQU5fUnhGaWZvMENhbGxiYWNrCisgICAgICAoKykgSEFMX0ZEQ0FOX1J4RmlmbzFDYWxsYmFjaworICAgICAgKCspIEhBTF9GRENBTl9UeEZpZm9FbXB0eUNhbGxiYWNrCisgICAgICAoKykgSEFMX0ZEQ0FOX1R4QnVmZmVyQ29tcGxldGVDYWxsYmFjaworICAgICAgKCspIEhBTF9GRENBTl9UeEJ1ZmZlckFib3J0Q2FsbGJhY2sKKyAgICAgICgrKSBIQUxfRkRDQU5fSGlnaFByaW9yaXR5TWVzc2FnZUNhbGxiYWNrCisgICAgICAoKykgSEFMX0ZEQ0FOX1RpbWVzdGFtcFdyYXBhcm91bmRDYWxsYmFjaworICAgICAgKCspIEhBTF9GRENBTl9UaW1lb3V0T2NjdXJyZWRDYWxsYmFjaworICAgICAgKCspIEhBTF9GRENBTl9FcnJvckNhbGxiYWNrCisgICAgICAoKykgSEFMX0ZEQ0FOX0Vycm9yU3RhdHVzQ2FsbGJhY2sKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgKiBAYnJpZWYgIFR4IEV2ZW50IGNhbGxiYWNrLgorICogQHBhcmFtICBoZmRjYW4gcG9pbnRlciB0byBhbiBGRENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZEQ0FOLgorICogQHBhcmFtICBUeEV2ZW50Rmlmb0lUcyBpbmRpY2F0ZXMgd2hpY2ggVHggRXZlbnQgRklGTyBpbnRlcnJ1cHRzIGFyZSBzaWduYWxlZC4KKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiBAYXJnCisgKiBGRENBTl9UeF9FdmVudF9GaWZvX0ludGVycnVwdHMuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX193ZWFrIHZvaWQgSEFMX0ZEQ0FOX1R4RXZlbnRGaWZvQ2FsbGJhY2soRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVHhFdmVudEZpZm9JVHMpIHsKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGZkY2FuKTsKKyAgVU5VU0VEKFR4RXZlbnRGaWZvSVRzKTsKKworICAvKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfRkRDQU5fVHhFdmVudEZpZm9DYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlcgorICAgICBmaWxlCisgICAqLworfQorCisvKioKKyAqIEBicmllZiAgUnggRklGTyAwIGNhbGxiYWNrLgorICogQHBhcmFtICBoZmRjYW4gcG9pbnRlciB0byBhbiBGRENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZEQ0FOLgorICogQHBhcmFtICBSeEZpZm8wSVRzIGluZGljYXRlcyB3aGljaCBSeCBGSUZPIDAgaW50ZXJydXB0cyBhcmUgc2lnbmFsZWQuCisgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgQGFyZworICogRkRDQU5fUnhfRmlmbzBfSW50ZXJydXB0cy4KKyAqIEByZXR2YWwgTm9uZQorICovCitfX3dlYWsgdm9pZCBIQUxfRkRDQU5fUnhGaWZvMENhbGxiYWNrKEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUnhGaWZvMElUcykgeworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoZmRjYW4pOworICBVTlVTRUQoUnhGaWZvMElUcyk7CisKKyAgLyogTk9URTogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0ZEQ0FOX1J4RmlmbzBDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAqIEBicmllZiAgUnggRklGTyAxIGNhbGxiYWNrLgorICogQHBhcmFtICBoZmRjYW4gcG9pbnRlciB0byBhbiBGRENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZEQ0FOLgorICogQHBhcmFtICBSeEZpZm8xSVRzIGluZGljYXRlcyB3aGljaCBSeCBGSUZPIDEgaW50ZXJydXB0cyBhcmUgc2lnbmFsZWQuCisgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgQGFyZworICogRkRDQU5fUnhfRmlmbzFfSW50ZXJydXB0cy4KKyAqIEByZXR2YWwgTm9uZQorICovCitfX3dlYWsgdm9pZCBIQUxfRkRDQU5fUnhGaWZvMUNhbGxiYWNrKEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUnhGaWZvMUlUcykgeworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoZmRjYW4pOworICBVTlVTRUQoUnhGaWZvMUlUcyk7CisKKyAgLyogTk9URTogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0ZEQ0FOX1J4RmlmbzFDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAqIEBicmllZiAgVHggRklGTyBFbXB0eSBjYWxsYmFjay4KKyAqIEBwYXJhbSAgaGZkY2FuIHBvaW50ZXIgdG8gYW4gRkRDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBGRENBTi4KKyAqIEByZXR2YWwgTm9uZQorICovCitfX3dlYWsgdm9pZCBIQUxfRkRDQU5fVHhGaWZvRW1wdHlDYWxsYmFjayhGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pIHsKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGZkY2FuKTsKKworICAvKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfRkRDQU5fVHhGaWZvRW1wdHlDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlcgorICAgICBmaWxlCisgICAqLworfQorCisvKioKKyAqIEBicmllZiAgVHJhbnNtaXNzaW9uIENvbXBsZXRlIGNhbGxiYWNrLgorICogQHBhcmFtICBoZmRjYW4gcG9pbnRlciB0byBhbiBGRENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZEQ0FOLgorICogQHBhcmFtICBCdWZmZXJJbmRleGVzIEluZGV4ZXMgb2YgdGhlIHRyYW5zbWl0dGVkIGJ1ZmZlcnMuCisgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgQGFyZyBGRENBTl9UeF9sb2NhdGlvbi4KKyAqIEByZXR2YWwgTm9uZQorICovCitfX3dlYWsgdm9pZCBIQUxfRkRDQU5fVHhCdWZmZXJDb21wbGV0ZUNhbGxiYWNrKEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQnVmZmVySW5kZXhlcykgeworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoZmRjYW4pOworICBVTlVTRUQoQnVmZmVySW5kZXhlcyk7CisKKyAgLyogTk9URTogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0ZEQ0FOX1R4QnVmZmVyQ29tcGxldGVDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUKKyAgICAgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAqIEBicmllZiAgVHJhbnNtaXNzaW9uIENhbmNlbGxhdGlvbiBjYWxsYmFjay4KKyAqIEBwYXJhbSAgaGZkY2FuIHBvaW50ZXIgdG8gYW4gRkRDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBGRENBTi4KKyAqIEBwYXJhbSAgQnVmZmVySW5kZXhlcyBJbmRleGVzIG9mIHRoZSBhYm9ydGVkIGJ1ZmZlcnMuCisgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgQGFyZyBGRENBTl9UeF9sb2NhdGlvbi4KKyAqIEByZXR2YWwgTm9uZQorICovCitfX3dlYWsgdm9pZCBIQUxfRkRDQU5fVHhCdWZmZXJBYm9ydENhbGxiYWNrKEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQnVmZmVySW5kZXhlcykgeworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoZmRjYW4pOworICBVTlVTRUQoQnVmZmVySW5kZXhlcyk7CisKKyAgLyogTk9URTogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0ZEQ0FOX1R4QnVmZmVyQWJvcnRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlcgorICAgICBmaWxlCisgICAqLworfQorCisvKioKKyAqIEBicmllZiAgVGltZXN0YW1wIFdyYXBhcm91bmQgY2FsbGJhY2suCisgKiBAcGFyYW0gIGhmZGNhbiBwb2ludGVyIHRvIGFuIEZEQ0FOX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRkRDQU4uCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX193ZWFrIHZvaWQgSEFMX0ZEQ0FOX1RpbWVzdGFtcFdyYXBhcm91bmRDYWxsYmFjayhGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pIHsKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGZkY2FuKTsKKworICAvKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfRkRDQU5fVGltZXN0YW1wV3JhcGFyb3VuZENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluCisgICAgIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICogQGJyaWVmICBUaW1lb3V0IE9jY3VycmVkIGNhbGxiYWNrLgorICogQHBhcmFtICBoZmRjYW4gcG9pbnRlciB0byBhbiBGRENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZEQ0FOLgorICogQHJldHZhbCBOb25lCisgKi8KK19fd2VhayB2b2lkIEhBTF9GRENBTl9UaW1lb3V0T2NjdXJyZWRDYWxsYmFjayhGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pIHsKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGZkY2FuKTsKKworICAvKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfRkRDQU5fVGltZW91dE9jY3VycmVkQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlCisgICAgIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgKiBAYnJpZWYgIEhpZ2ggUHJpb3JpdHkgTWVzc2FnZSBjYWxsYmFjay4KKyAqIEBwYXJhbSAgaGZkY2FuIHBvaW50ZXIgdG8gYW4gRkRDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBGRENBTi4KKyAqIEByZXR2YWwgTm9uZQorICovCitfX3dlYWsgdm9pZCBIQUxfRkRDQU5fSGlnaFByaW9yaXR5TWVzc2FnZUNhbGxiYWNrKEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbikgeworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoZmRjYW4pOworCisgIC8qIE5PVEU6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9GRENBTl9IaWdoUHJpb3JpdHlNZXNzYWdlQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4KKyAgICAgdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgKiBAYnJpZWYgIEVycm9yIGNhbGxiYWNrLgorICogQHBhcmFtICBoZmRjYW4gcG9pbnRlciB0byBhbiBGRENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZEQ0FOLgorICogQHJldHZhbCBOb25lCisgKi8KK19fd2VhayB2b2lkIEhBTF9GRENBTl9FcnJvckNhbGxiYWNrKEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbikgeworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoZmRjYW4pOworCisgIC8qIE5PVEU6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9GRENBTl9FcnJvckNhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICogQGJyaWVmICBFcnJvciBzdGF0dXMgY2FsbGJhY2suCisgKiBAcGFyYW0gIGhmZGNhbiBwb2ludGVyIHRvIGFuIEZEQ0FOX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRkRDQU4uCisgKiBAcGFyYW0gIEVycm9yU3RhdHVzSVRzIGluZGljYXRlcyB3aGljaCBFcnJvciBTdGF0dXMgaW50ZXJydXB0cyBhcmUgc2lnbmFsZWQuCisgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgQGFyZworICogRkRDQU5fRXJyb3JfU3RhdHVzX0ludGVycnVwdHMuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX193ZWFrIHZvaWQgSEFMX0ZEQ0FOX0Vycm9yU3RhdHVzQ2FsbGJhY2soRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRXJyb3JTdGF0dXNJVHMpIHsKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGZkY2FuKTsKKyAgVU5VU0VEKEVycm9yU3RhdHVzSVRzKTsKKworICAvKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfRkRDQU5fRXJyb3JTdGF0dXNDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlcgorICAgICBmaWxlCisgICAqLworfQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBGRENBTl9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA2IFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zCisgICogIEBicmllZiAgIEZEQ0FOIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0byA6CisgICAgICAoKykgSEFMX0ZEQ0FOX0dldFN0YXRlKCkgIDogUmV0dXJuIHRoZSBGRENBTiBzdGF0ZS4KKyAgICAgICgrKSBIQUxfRkRDQU5fR2V0RXJyb3IoKSAgOiBSZXR1cm4gdGhlIEZEQ0FOIGVycm9yIGNvZGUgaWYgYW55LgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworLyoqCisgKiBAYnJpZWYgIFJldHVybiB0aGUgRkRDQU4gc3RhdGUKKyAqIEBwYXJhbSAgaGZkY2FuIHBvaW50ZXIgdG8gYW4gRkRDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBGRENBTi4KKyAqIEByZXR2YWwgSEFMIHN0YXRlCisgKi8KK0hBTF9GRENBTl9TdGF0ZVR5cGVEZWYgSEFMX0ZEQ0FOX0dldFN0YXRlKGNvbnN0IEZEQ0FOX0hhbmRsZVR5cGVEZWYgKmhmZGNhbikgeworICAvKiBSZXR1cm4gRkRDQU4gc3RhdGUgKi8KKyAgcmV0dXJuIGhmZGNhbi0+U3RhdGU7Cit9CisKKy8qKgorICogQGJyaWVmICBSZXR1cm4gdGhlIEZEQ0FOIGVycm9yIGNvZGUKKyAqIEBwYXJhbSAgaGZkY2FuIHBvaW50ZXIgdG8gYW4gRkRDQU5fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBGRENBTi4KKyAqIEByZXR2YWwgRkRDQU4gRXJyb3IgQ29kZQorICovCit1aW50MzJfdCBIQUxfRkRDQU5fR2V0RXJyb3IoY29uc3QgRkRDQU5fSGFuZGxlVHlwZURlZiAqaGZkY2FuKSB7CisgIC8qIFJldHVybiBGRENBTiBlcnJvciBjb2RlICovCisgIHJldHVybiBoZmRjYW4tPkVycm9yQ29kZTsKK30KKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEZEQ0FOX1ByaXZhdGVfRnVuY3Rpb25zIEZEQ0FOIFByaXZhdGUgRnVuY3Rpb25zCisgKiBAeworICovCisKKy8qKgorICogQGJyaWVmICBDYWxjdWxhdGUgZWFjaCBSQU0gYmxvY2sgc3RhcnQgYWRkcmVzcyBhbmQgc2l6ZQorICogQHBhcmFtICBoZmRjYW4gcG9pbnRlciB0byBhbiBGRENBTl9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZEQ0FOLgorICogQHJldHZhbCBub25lCisgKi8KK3N0YXRpYyB2b2lkIEZEQ0FOX0NhbGN1bHRhdGVSYW1CbG9ja0FkZHJlc3NlcyhGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4pIHsKKyAgdWludDMyX3QgUkFNY291bnRlcjsKKyAgdWludDMyX3QgU3JhbUNhbkluc3RhbmNlQmFzZSA9IFNSQU1DQU5fQkFTRTsKKyNpZiBkZWZpbmVkKEZEQ0FOMikKKworICBpZiAoaGZkY2FuLT5JbnN0YW5jZSA9PSBGRENBTjIpIHsKKyAgICBTcmFtQ2FuSW5zdGFuY2VCYXNlICs9IFNSQU1DQU5fU0laRTsKKyAgfQorI2VuZGlmIC8qIEZEQ0FOMiAqLworI2lmIGRlZmluZWQoRkRDQU4zKQorICBpZiAoaGZkY2FuLT5JbnN0YW5jZSA9PSBGRENBTjMpIHsKKyAgICBTcmFtQ2FuSW5zdGFuY2VCYXNlICs9IFNSQU1DQU5fU0laRSAqIDJVOworICB9CisjZW5kaWYgLyogRkRDQU4zICovCisKKyAgLyogU3RhbmRhcmQgZmlsdGVyIGxpc3Qgc3RhcnQgYWRkcmVzcyAqLworICBoZmRjYW4tPm1zZ1JhbS5TdGFuZGFyZEZpbHRlclNBID0gU3JhbUNhbkluc3RhbmNlQmFzZSArIFNSQU1DQU5fRkxTU0E7CisKKyAgLyogU3RhbmRhcmQgZmlsdGVyIGVsZW1lbnRzIG51bWJlciAqLworICBNT0RJRllfUkVHKGhmZGNhbi0+SW5zdGFuY2UtPlJYR0ZDLCBGRENBTl9SWEdGQ19MU1MsCisgICAgICAgICAgICAgKGhmZGNhbi0+SW5pdC5TdGRGaWx0ZXJzTmJyIDw8IEZEQ0FOX1JYR0ZDX0xTU19Qb3MpKTsKKworICAvKiBFeHRlbmRlZCBmaWx0ZXIgbGlzdCBzdGFydCBhZGRyZXNzICovCisgIGhmZGNhbi0+bXNnUmFtLkV4dGVuZGVkRmlsdGVyU0EgPSBTcmFtQ2FuSW5zdGFuY2VCYXNlICsgU1JBTUNBTl9GTEVTQTsKKworICAvKiBFeHRlbmRlZCBmaWx0ZXIgZWxlbWVudHMgbnVtYmVyICovCisgIE1PRElGWV9SRUcoaGZkY2FuLT5JbnN0YW5jZS0+UlhHRkMsIEZEQ0FOX1JYR0ZDX0xTRSwKKyAgICAgICAgICAgICAoaGZkY2FuLT5Jbml0LkV4dEZpbHRlcnNOYnIgPDwgRkRDQU5fUlhHRkNfTFNFX1BvcykpOworCisgIC8qIFJ4IEZJRk8gMCBzdGFydCBhZGRyZXNzICovCisgIGhmZGNhbi0+bXNnUmFtLlJ4RklGTzBTQSA9IFNyYW1DYW5JbnN0YW5jZUJhc2UgKyBTUkFNQ0FOX1JGMFNBOworCisgIC8qIFJ4IEZJRk8gMSBzdGFydCBhZGRyZXNzICovCisgIGhmZGNhbi0+bXNnUmFtLlJ4RklGTzFTQSA9IFNyYW1DYW5JbnN0YW5jZUJhc2UgKyBTUkFNQ0FOX1JGMVNBOworCisgIC8qIFR4IGV2ZW50IEZJRk8gc3RhcnQgYWRkcmVzcyAqLworICBoZmRjYW4tPm1zZ1JhbS5UeEV2ZW50RklGT1NBID0gU3JhbUNhbkluc3RhbmNlQmFzZSArIFNSQU1DQU5fVEVGU0E7CisKKyAgLyogVHggRklGTy9xdWV1ZSBzdGFydCBhZGRyZXNzICovCisgIGhmZGNhbi0+bXNnUmFtLlR4RklGT1FTQSA9IFNyYW1DYW5JbnN0YW5jZUJhc2UgKyBTUkFNQ0FOX1RGUVNBOworCisgIC8qIEZsdXNoIHRoZSBhbGxvY2F0ZWQgTWVzc2FnZSBSQU0gYXJlYSAqLworICBmb3IgKFJBTWNvdW50ZXIgPSBTcmFtQ2FuSW5zdGFuY2VCYXNlOworICAgICAgIFJBTWNvdW50ZXIgPCAoU3JhbUNhbkluc3RhbmNlQmFzZSArIFNSQU1DQU5fU0laRSk7IFJBTWNvdW50ZXIgKz0gNFUpIHsKKyAgICAqKHVpbnQzMl90ICopKFJBTWNvdW50ZXIpID0gMHgwMDAwMDAwMFU7CisgIH0KK30KKworLyoqCisgKiBAYnJpZWYgIENvcHkgVHggbWVzc2FnZSB0byB0aGUgbWVzc2FnZSBSQU0uCisgKiBAcGFyYW0gIGhmZGNhbiBwb2ludGVyIHRvIGFuIEZEQ0FOX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRkRDQU4uCisgKiBAcGFyYW0gIHBUeEhlYWRlciBwb2ludGVyIHRvIGEgRkRDQU5fVHhIZWFkZXJUeXBlRGVmIHN0cnVjdHVyZS4KKyAqIEBwYXJhbSAgcFR4RGF0YSBwb2ludGVyIHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIHBheWxvYWQgb2YgdGhlIFR4IGZyYW1lLgorICogQHBhcmFtICBCdWZmZXJJbmRleCBpbmRleCBvZiB0aGUgYnVmZmVyIHRvIGJlIGNvbmZpZ3VyZWQuCisgKiBAcmV0dmFsIG5vbmUKKyAqLworc3RhdGljIHZvaWQgRkRDQU5fQ29weU1lc3NhZ2VUb1JBTShjb25zdCBGRENBTl9IYW5kbGVUeXBlRGVmICpoZmRjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZEQ0FOX1R4SGVhZGVyVHlwZURlZiAqcFR4SGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpwVHhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBCdWZmZXJJbmRleCkgeworICB1aW50MzJfdCBUeEVsZW1lbnRXMTsKKyAgdWludDMyX3QgVHhFbGVtZW50VzI7CisgIHVpbnQzMl90ICpUeEFkZHJlc3M7CisgIHVpbnQzMl90IEJ5dGVDb3VudGVyOworCisgIC8qIEJ1aWxkIGZpcnN0IHdvcmQgb2YgVHggaGVhZGVyIGVsZW1lbnQgKi8KKyAgaWYgKHBUeEhlYWRlci0+SWRUeXBlID09IEZEQ0FOX1NUQU5EQVJEX0lEKSB7CisgICAgVHhFbGVtZW50VzEgPSAocFR4SGVhZGVyLT5FcnJvclN0YXRlSW5kaWNhdG9yIHwgRkRDQU5fU1RBTkRBUkRfSUQgfAorICAgICAgICAgICAgICAgICAgIHBUeEhlYWRlci0+VHhGcmFtZVR5cGUgfCAocFR4SGVhZGVyLT5JZGVudGlmaWVyIDw8IDE4VSkpOworICB9IGVsc2UgLyogcFR4SGVhZGVyLT5JZFR5cGUgPT0gRkRDQU5fRVhURU5ERURfSUQgKi8KKyAgeworICAgIFR4RWxlbWVudFcxID0gKHBUeEhlYWRlci0+RXJyb3JTdGF0ZUluZGljYXRvciB8IEZEQ0FOX0VYVEVOREVEX0lEIHwKKyAgICAgICAgICAgICAgICAgICBwVHhIZWFkZXItPlR4RnJhbWVUeXBlIHwgcFR4SGVhZGVyLT5JZGVudGlmaWVyKTsKKyAgfQorCisgIC8qIEJ1aWxkIHNlY29uZCB3b3JkIG9mIFR4IGhlYWRlciBlbGVtZW50ICovCisgIFR4RWxlbWVudFcyID0gKChwVHhIZWFkZXItPk1lc3NhZ2VNYXJrZXIgPDwgMjRVKSB8CisgICAgICAgICAgICAgICAgIHBUeEhlYWRlci0+VHhFdmVudEZpZm9Db250cm9sIHwgcFR4SGVhZGVyLT5GREZvcm1hdCB8CisgICAgICAgICAgICAgICAgIHBUeEhlYWRlci0+Qml0UmF0ZVN3aXRjaCB8IChwVHhIZWFkZXItPkRhdGFMZW5ndGggPDwgMTZVKSk7CisKKyAgLyogQ2FsY3VsYXRlIFR4IGVsZW1lbnQgYWRkcmVzcyAqLworICBUeEFkZHJlc3MgPQorICAgICAgKHVpbnQzMl90ICopKGhmZGNhbi0+bXNnUmFtLlR4RklGT1FTQSArIChCdWZmZXJJbmRleCAqIFNSQU1DQU5fVEZRX1NJWkUpKTsKKworICAvKiBXcml0ZSBUeCBlbGVtZW50IGhlYWRlciB0byB0aGUgbWVzc2FnZSBSQU0gKi8KKyAgKlR4QWRkcmVzcyA9IFR4RWxlbWVudFcxOworICBUeEFkZHJlc3MrKzsKKyAgKlR4QWRkcmVzcyA9IFR4RWxlbWVudFcyOworICBUeEFkZHJlc3MrKzsKKworICAvKiBXcml0ZSBUeCBwYXlsb2FkIHRvIHRoZSBtZXNzYWdlIFJBTSAqLworICBmb3IgKEJ5dGVDb3VudGVyID0gMDsgQnl0ZUNvdW50ZXIgPCBETEN0b0J5dGVzW3BUeEhlYWRlci0+RGF0YUxlbmd0aF07CisgICAgICAgQnl0ZUNvdW50ZXIgKz0gNFUpIHsKKyAgICAqVHhBZGRyZXNzID0gKCgodWludDMyX3QpcFR4RGF0YVtCeXRlQ291bnRlciArIDNVXSA8PCAyNFUpIHwKKyAgICAgICAgICAgICAgICAgICgodWludDMyX3QpcFR4RGF0YVtCeXRlQ291bnRlciArIDJVXSA8PCAxNlUpIHwKKyAgICAgICAgICAgICAgICAgICgodWludDMyX3QpcFR4RGF0YVtCeXRlQ291bnRlciArIDFVXSA8PCA4VSkgfAorICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KXBUeERhdGFbQnl0ZUNvdW50ZXJdKTsKKyAgICBUeEFkZHJlc3MrKzsKKyAgfQorfQorCisvKioKKyAqIEB9CisgKi8KKyNlbmRpZiAvKiBIQUxfRkRDQU5fTU9EVUxFX0VOQUJMRUQgKi8KKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworI2VuZGlmIC8qIEZEQ0FOMSAqLwpkaWZmIC0tZ2l0IGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX2ZsYXNoLmMgYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfZmxhc2guYwppbmRleCBjMGFkYTZhLi4xNGJmYzAwIDEwMDY0NAotLS0gYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfZmxhc2guYworKysgYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfZmxhc2guYwpAQCAtMSw3MTYgKzEsNzM4IEBACi0vKioNCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgKiBAZmlsZSAgICBzdG0zMmc0eHhfaGFsX2ZsYXNoLmMNCi0gICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0NCi0gICogQGJyaWVmICAgRkxBU0ggSEFMIG1vZHVsZSBkcml2ZXIuDQotICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcNCi0gICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBpbnRlcm5hbCBGTEFTSCBtZW1vcnk6DQotICAqICAgICAgICAgICArIFByb2dyYW0gb3BlcmF0aW9ucyBmdW5jdGlvbnMNCi0gICogICAgICAgICAgICsgTWVtb3J5IENvbnRyb2wgZnVuY3Rpb25zDQotICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgRXJyb3JzIGZ1bmN0aW9ucw0KLSAgKg0KLSAgQHZlcmJhdGltDQotICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBGTEFTSCBwZXJpcGhlcmFsIGZlYXR1cmVzICMjIyMjDQotICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi0gIFsuLl0gVGhlIEZsYXNoIG1lbW9yeSBpbnRlcmZhY2UgbWFuYWdlcyBDUFUgQUhCIEktQ29kZSBhbmQgRC1Db2RlIGFjY2Vzc2VzDQotICAgICAgIHRvIHRoZSBGbGFzaCBtZW1vcnkuIEl0IGltcGxlbWVudHMgdGhlIGVyYXNlIGFuZCBwcm9ncmFtIEZsYXNoIG1lbW9yeQ0KLSAgb3BlcmF0aW9ucyBhbmQgdGhlIHJlYWQgYW5kIHdyaXRlIHByb3RlY3Rpb24gbWVjaGFuaXNtcy4NCi0NCi0gIFsuLl0gVGhlIEZsYXNoIG1lbW9yeSBpbnRlcmZhY2UgYWNjZWxlcmF0ZXMgY29kZSBleGVjdXRpb24gd2l0aCBhIHN5c3RlbSBvZg0KLSAgaW5zdHJ1Y3Rpb24gcHJlZmV0Y2ggYW5kIGNhY2hlIGxpbmVzLg0KLQ0KLSAgWy4uXSBUaGUgRkxBU0ggbWFpbiBmZWF0dXJlcyBhcmU6DQotICAgICAgKCspIEZsYXNoIG1lbW9yeSByZWFkIG9wZXJhdGlvbnMNCi0gICAgICAoKykgRmxhc2ggbWVtb3J5IHByb2dyYW0vZXJhc2Ugb3BlcmF0aW9ucw0KLSAgICAgICgrKSBSZWFkIC8gd3JpdGUgcHJvdGVjdGlvbnMNCi0gICAgICAoKykgT3B0aW9uIGJ5dGVzIHByb2dyYW1taW5nDQotICAgICAgKCspIFByZWZldGNoIG9uIEktQ29kZQ0KLSAgICAgICgrKSAzMiBjYWNoZSBsaW5lcyBvZiA0KjY0IG9yIDIqMTI4IGJpdHMgb24gSS1Db2RlDQotICAgICAgKCspIDggY2FjaGUgbGluZXMgb2YgNCo2NCBvciAyKjEyOCBiaXRzIG9uIEQtQ29kZQ0KLSAgICAgICgrKSBFcnJvciBjb2RlIGNvcnJlY3Rpb24gKEVDQykgOiBEYXRhIGluIGZsYXNoIGFyZSA3Mi1iaXRzIHdvcmQNCi0gICAgICAgICAgKDggYml0cyBhZGRlZCBwZXIgZG91YmxlIHdvcmQpDQotDQotDQotICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIw0KLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgIFsuLl0NCi0gICAgICBUaGlzIGRyaXZlciBwcm92aWRlcyBmdW5jdGlvbnMgYW5kIG1hY3JvcyB0byBjb25maWd1cmUgYW5kIHByb2dyYW0gdGhlDQotICBGTEFTSCBtZW1vcnkgb2YgYWxsIFNUTTMyRzR4eCBkZXZpY2VzLg0KLQ0KLSAgICAgICgjKSBGbGFzaCBNZW1vcnkgSU8gUHJvZ3JhbW1pbmcgZnVuY3Rpb25zOg0KLSAgICAgICAgICAgKCsrKSBMb2NrIGFuZCBVbmxvY2sgdGhlIEZMQVNIIGludGVyZmFjZSB1c2luZyBIQUxfRkxBU0hfVW5sb2NrKCkgYW5kDQotICAgICAgICAgICAgICAgIEhBTF9GTEFTSF9Mb2NrKCkgZnVuY3Rpb25zDQotICAgICAgICAgICAoKyspIFByb2dyYW0gZnVuY3Rpb25zOiBkb3VibGUgd29yZCBhbmQgZmFzdCBwcm9ncmFtIChmdWxsIHJvdw0KLSAgcHJvZ3JhbW1pbmcpDQotICAgICAgICAgICAoKyspIFRoZXJlIGFyZSB0d28gbW9kZXMgb2YgcHJvZ3JhbW1pbmcgOg0KLSAgICAgICAgICAgICgrKyspIFBvbGxpbmcgbW9kZSB1c2luZyBIQUxfRkxBU0hfUHJvZ3JhbSgpIGZ1bmN0aW9uDQotICAgICAgICAgICAgKCsrKykgSW50ZXJydXB0IG1vZGUgdXNpbmcgSEFMX0ZMQVNIX1Byb2dyYW1fSVQoKSBmdW5jdGlvbg0KLQ0KLSAgICAgICgjKSBJbnRlcnJ1cHRzIGFuZCBmbGFncyBtYW5hZ2VtZW50IGZ1bmN0aW9uczoNCi0gICAgICAgICAgICgrKykgSGFuZGxlIEZMQVNIIGludGVycnVwdHMgYnkgY2FsbGluZyBIQUxfRkxBU0hfSVJRSGFuZGxlcigpDQotICAgICAgICAgICAoKyspIENhbGxiYWNrIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIHdoZW4gdGhlIGZsYXNoIG9wZXJhdGlvbnMgYXJlDQotICBmaW5pc2hlZCA6IEhBTF9GTEFTSF9FbmRPZk9wZXJhdGlvbkNhbGxiYWNrKCkgd2hlbiBldmVyeXRoaW5nIGlzIG9rLCBvdGhlcndpc2UNCi0gICAgICAgICAgICAgICAgSEFMX0ZMQVNIX09wZXJhdGlvbkVycm9yQ2FsbGJhY2soKQ0KLSAgICAgICAgICAgKCsrKSBHZXQgZXJyb3IgZmxhZyBzdGF0dXMgYnkgY2FsbGluZyBIQUxfR2V0RXJyb3IoKQ0KLQ0KLSAgICAgICgjKSBPcHRpb24gYnl0ZXMgbWFuYWdlbWVudCBmdW5jdGlvbnM6DQotICAgICAgICAgICAoKyspIExvY2sgYW5kIFVubG9jayB0aGUgb3B0aW9uIGJ5dGVzIHVzaW5nIEhBTF9GTEFTSF9PQl9VbmxvY2soKSBhbmQNCi0gICAgICAgICAgICAgICAgSEFMX0ZMQVNIX09CX0xvY2soKSBmdW5jdGlvbnMNCi0gICAgICAgICAgICgrKykgTGF1bmNoIHRoZSByZWxvYWQgb2YgdGhlIG9wdGlvbiBieXRlcyB1c2luZyBIQUxfRkxBU0hfTGF1bmNoKCkNCi0gIGZ1bmN0aW9uLiBJbiB0aGlzIGNhc2UsIGEgcmVzZXQgaXMgZ2VuZXJhdGVkDQotDQotICAgIFsuLl0NCi0gICAgICBJbiBhZGRpdGlvbiB0byB0aGVzZSBmdW5jdGlvbnMsIHRoaXMgZHJpdmVyIGluY2x1ZGVzIGEgc2V0IG9mIG1hY3Jvcw0KLSAgYWxsb3dpbmcgdG8gaGFuZGxlIHRoZSBmb2xsb3dpbmcgb3BlcmF0aW9uczoNCi0gICAgICAgKCspIFNldCB0aGUgbGF0ZW5jeQ0KLSAgICAgICAoKykgRW5hYmxlL0Rpc2FibGUgdGhlIHByZWZldGNoIGJ1ZmZlcg0KLSAgICAgICAoKykgRW5hYmxlL0Rpc2FibGUgdGhlIEluc3RydWN0aW9uIGNhY2hlIGFuZCB0aGUgRGF0YSBjYWNoZQ0KLSAgICAgICAoKykgUmVzZXQgdGhlIEluc3RydWN0aW9uIGNhY2hlIGFuZCB0aGUgRGF0YSBjYWNoZQ0KLSAgICAgICAoKykgRW5hYmxlL0Rpc2FibGUgdGhlIEZsYXNoIHBvd2VyLWRvd24gZHVyaW5nIGxvdy1wb3dlciBydW4gYW5kIHNsZWVwDQotICBtb2Rlcw0KLSAgICAgICAoKykgRW5hYmxlL0Rpc2FibGUgdGhlIEZsYXNoIGludGVycnVwdHMNCi0gICAgICAgKCspIE1vbml0b3IgdGhlIEZsYXNoIGZsYWdzIHN0YXR1cw0KLQ0KLSAgQGVuZHZlcmJhdGltDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICogQGF0dGVudGlvbg0KLSAgKg0KLSAgKiBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLg0KLSAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KLSAgKg0KLSAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRlcm1zIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUNCi0gIGluDQotICAqIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4NCi0gICogSWYgbm8gTElDRU5TRSBmaWxlIGNvbWVzIHdpdGggdGhpcyBzb2Z0d2FyZSwgaXQgaXMgcHJvdmlkZWQgQVMtSVMuDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICovDQotDQotLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaW5jbHVkZSAic3RtMzJnNHh4X2hhbC5oIg0KLQ0KLS8qKiBAYWRkdG9ncm91cCBTVE0zMkc0eHhfSEFMX0RyaXZlcg0KLSAqIEB7DQotICovDQotDQotLyoqIEBkZWZncm91cCBGTEFTSCBGTEFTSA0KLSAqIEBicmllZiBGTEFTSCBIQUwgbW9kdWxlIGRyaXZlcg0KLSAqIEB7DQotICovDQotDQotI2lmZGVmIEhBTF9GTEFTSF9NT0RVTEVfRU5BQkxFRA0KLQ0KLS8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogUHJpdmF0ZSBkZWZpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGRlZmdyb3VwIEZMQVNIX1ByaXZhdGVfQ29uc3RhbnRzIEZMQVNIIFByaXZhdGUgQ29uc3RhbnRzDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIEZMQVNIX05CX0RPVUJMRV9XT1JEU19JTl9ST1cgMzINCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGRlZmdyb3VwIEZMQVNIX1ByaXZhdGVfVmFyaWFibGVzIEZMQVNIIFByaXZhdGUgVmFyaWFibGVzDQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFZhcmlhYmxlIHVzZWQgZm9yIFByb2dyYW0vRXJhc2Ugc2VjdG9ycyB1bmRlciBpbnRlcnJ1cHRpb24NCi0gKi8NCi1GTEFTSF9Qcm9jZXNzVHlwZURlZiBwRmxhc2ggPSB7LkxvY2sgPSBIQUxfVU5MT0NLRUQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5FcnJvckNvZGUgPSBIQUxfRkxBU0hfRVJST1JfTk9ORSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlByb2NlZHVyZU9uR29pbmcgPSBGTEFTSF9QUk9DX05PTkUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5BZGRyZXNzID0gMFUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5CYW5rID0gRkxBU0hfQkFOS18xLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuUGFnZSA9IDBVLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuTmJQYWdlc1RvRXJhc2UgPSAwVSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkNhY2hlVG9SZWFjdGl2YXRlID0gRkxBU0hfQ0FDSEVfRElTQUJMRUR9Ow0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGRlZmdyb3VwIEZMQVNIX1ByaXZhdGVfRnVuY3Rpb25zIEZMQVNIIFByaXZhdGUgRnVuY3Rpb25zDQotICogQHsNCi0gKi8NCi1zdGF0aWMgdm9pZCBGTEFTSF9Qcm9ncmFtX0RvdWJsZVdvcmQodWludDMyX3QgQWRkcmVzcywgdWludDY0X3QgRGF0YSk7DQotc3RhdGljIHZvaWQgRkxBU0hfUHJvZ3JhbV9GYXN0KHVpbnQzMl90IEFkZHJlc3MsIHVpbnQzMl90IERhdGFBZGRyZXNzKTsNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBkZWZncm91cCBGTEFTSF9FeHBvcnRlZF9GdW5jdGlvbnMgRkxBU0ggRXhwb3J0ZWQgRnVuY3Rpb25zDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEZMQVNIX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgUHJvZ3JhbW1pbmcgb3BlcmF0aW9uIGZ1bmN0aW9ucw0KLSAgKiAgQGJyaWVmICAgUHJvZ3JhbW1pbmcgb3BlcmF0aW9uIGZ1bmN0aW9ucw0KLSAgKg0KLUB2ZXJiYXRpbQ0KLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgICAgICAgICAgICAgICAgIyMjIyMgUHJvZ3JhbW1pbmcgb3BlcmF0aW9uIGZ1bmN0aW9ucyAjIyMjIw0KLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgIFsuLl0NCi0gICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBtYW5hZ2UgdGhlIEZMQVNIDQotICAgIHByb2dyYW0gb3BlcmF0aW9ucy4NCi0NCi1AZW5kdmVyYmF0aW0NCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICogQGJyaWVmICBQcm9ncmFtIGRvdWJsZSB3b3JkIG9yIGZhc3QgcHJvZ3JhbSBvZiBhIHJvdyBhdCBhIHNwZWNpZmllZCBhZGRyZXNzLg0KLSAqIEBwYXJhbSAgVHlwZVByb2dyYW0gSW5kaWNhdGUgdGhlIHdheSB0byBwcm9ncmFtIGF0IGEgc3BlY2lmaWVkIGFkZHJlc3MuDQotICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEZMQVNIX1R5cGVfUHJvZ3JhbS4NCi0gKiBAcGFyYW0gIEFkZHJlc3Mgc3BlY2lmaWVzIHRoZSBhZGRyZXNzIHRvIGJlIHByb2dyYW1tZWQuDQotICogQHBhcmFtICBEYXRhIHNwZWNpZmllcyB0aGUgZGF0YSB0byBiZSBwcm9ncmFtbWVkLg0KLSAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgaXMgdGhlIGRhdGEgZm9yIHRoZSBkb3VibGUgd29yZCBwcm9ncmFtIGFuZCB0aGUNCi0gKiBhZGRyZXNzIHdoZXJlIGFyZSBzdG9yZWQgdGhlIGRhdGEgZm9yIHRoZSByb3cgZmFzdCBwcm9ncmFtLg0KLSAqDQotICogQHJldHZhbCBIQUxfU3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIX1Byb2dyYW0odWludDMyX3QgVHlwZVByb2dyYW0sIHVpbnQzMl90IEFkZHJlc3MsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgRGF0YSkgew0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzOw0KLSAgdWludDMyX3QgcHJvZ19iaXQgPSAwOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19GTEFTSF9UWVBFUFJPR1JBTShUeXBlUHJvZ3JhbSkpOw0KLQ0KLSAgLyogUHJvY2VzcyBMb2NrZWQgKi8NCi0gIF9fSEFMX0xPQ0soJnBGbGFzaCk7DQotDQotICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8NCi0gIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKCh1aW50MzJfdClGTEFTSF9USU1FT1VUX1ZBTFVFKTsNCi0NCi0gIGlmIChzdGF0dXMgPT0gSEFMX09LKSB7DQotICAgIHBGbGFzaC5FcnJvckNvZGUgPSBIQUxfRkxBU0hfRVJST1JfTk9ORTsNCi0NCi0gICAgaWYgKFR5cGVQcm9ncmFtID09IEZMQVNIX1RZUEVQUk9HUkFNX0RPVUJMRVdPUkQpIHsNCi0gICAgICAvKiBQcm9ncmFtIGRvdWJsZS13b3JkICg2NC1iaXQpIGF0IGEgc3BlY2lmaWVkIGFkZHJlc3MgKi8NCi0gICAgICBGTEFTSF9Qcm9ncmFtX0RvdWJsZVdvcmQoQWRkcmVzcywgRGF0YSk7DQotICAgICAgcHJvZ19iaXQgPSBGTEFTSF9DUl9QRzsNCi0gICAgfSBlbHNlIGlmICgoVHlwZVByb2dyYW0gPT0gRkxBU0hfVFlQRVBST0dSQU1fRkFTVCkgfHwNCi0gICAgICAgICAgICAgICAoVHlwZVByb2dyYW0gPT0gRkxBU0hfVFlQRVBST0dSQU1fRkFTVF9BTkRfTEFTVCkpIHsNCi0gICAgICAvKiBGYXN0IHByb2dyYW0gYSAzMiByb3cgZG91YmxlLXdvcmQgKDY0LWJpdCkgYXQgYSBzcGVjaWZpZWQgYWRkcmVzcyAqLw0KLSAgICAgIEZMQVNIX1Byb2dyYW1fRmFzdChBZGRyZXNzLCAodWludDMyX3QpRGF0YSk7DQotDQotICAgICAgLyogSWYgaXQgaXMgdGhlIGxhc3Qgcm93LCB0aGUgYml0IHdpbGwgYmUgY2xlYXJlZCBhdCB0aGUgZW5kIG9mIHRoZQ0KLSAgICAgICAqIG9wZXJhdGlvbiAqLw0KLSAgICAgIGlmIChUeXBlUHJvZ3JhbSA9PSBGTEFTSF9UWVBFUFJPR1JBTV9GQVNUX0FORF9MQVNUKSB7DQotICAgICAgICBwcm9nX2JpdCA9IEZMQVNIX0NSX0ZTVFBHOw0KLSAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICAvKiBOb3RoaW5nIHRvIGRvICovDQotICAgIH0NCi0NCi0gICAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovDQotICAgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKCh1aW50MzJfdClGTEFTSF9USU1FT1VUX1ZBTFVFKTsNCi0NCi0gICAgLyogSWYgdGhlIHByb2dyYW0gb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCwgZGlzYWJsZSB0aGUgUEcgb3IgRlNUUEcgQml0ICovDQotICAgIGlmIChwcm9nX2JpdCAhPSAwVSkgew0KLSAgICAgIENMRUFSX0JJVChGTEFTSC0+Q1IsIHByb2dfYml0KTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLw0KLSAgX19IQUxfVU5MT0NLKCZwRmxhc2gpOw0KLQ0KLSAgLyogcmV0dXJuIHN0YXR1cyAqLw0KLSAgcmV0dXJuIHN0YXR1czsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBQcm9ncmFtIGRvdWJsZSB3b3JkIG9yIGZhc3QgcHJvZ3JhbSBvZiBhIHJvdyBhdCBhIHNwZWNpZmllZCBhZGRyZXNzDQotICogd2l0aCBpbnRlcnJ1cHQgZW5hYmxlZC4NCi0gKiBAcGFyYW0gIFR5cGVQcm9ncmFtIEluZGljYXRlIHRoZSB3YXkgdG8gcHJvZ3JhbSBhdCBhIHNwZWNpZmllZCBhZGRyZXNzLg0KLSAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBGTEFTSF9UeXBlX1Byb2dyYW0uDQotICogQHBhcmFtICBBZGRyZXNzIHNwZWNpZmllcyB0aGUgYWRkcmVzcyB0byBiZSBwcm9ncmFtbWVkLg0KLSAqIEBwYXJhbSAgRGF0YSBzcGVjaWZpZXMgdGhlIGRhdGEgdG8gYmUgcHJvZ3JhbW1lZC4NCi0gKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGlzIHRoZSBkYXRhIGZvciB0aGUgZG91YmxlIHdvcmQgcHJvZ3JhbSBhbmQgdGhlDQotICogYWRkcmVzcyB3aGVyZSBhcmUgc3RvcmVkIHRoZSBkYXRhIGZvciB0aGUgcm93IGZhc3QgcHJvZ3JhbS4NCi0gKg0KLSAqIEByZXR2YWwgSEFMX1N0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9GTEFTSF9Qcm9ncmFtX0lUKHVpbnQzMl90IFR5cGVQcm9ncmFtLCB1aW50MzJfdCBBZGRyZXNzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IERhdGEpIHsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1czsNCi0NCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfRkxBU0hfVFlQRVBST0dSQU0oVHlwZVByb2dyYW0pKTsNCi0NCi0gIC8qIFByb2Nlc3MgTG9ja2VkICovDQotICBfX0hBTF9MT0NLKCZwRmxhc2gpOw0KLQ0KLSAgLyogUmVzZXQgZXJyb3IgY29kZSAqLw0KLSAgcEZsYXNoLkVycm9yQ29kZSA9IEhBTF9GTEFTSF9FUlJPUl9OT05FOw0KLQ0KLSAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovDQotICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbihGTEFTSF9USU1FT1VUX1ZBTFVFKTsNCi0NCi0gIGlmIChzdGF0dXMgIT0gSEFMX09LKSB7DQotICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8NCi0gICAgX19IQUxfVU5MT0NLKCZwRmxhc2gpOw0KLSAgfSBlbHNlIHsNCi0gICAgLyogU2V0IGludGVybmFsIHZhcmlhYmxlcyB1c2VkIGJ5IHRoZSBJUlEgaGFuZGxlciAqLw0KLSAgICBpZiAoVHlwZVByb2dyYW0gPT0gRkxBU0hfVFlQRVBST0dSQU1fRkFTVF9BTkRfTEFTVCkgew0KLSAgICAgIHBGbGFzaC5Qcm9jZWR1cmVPbkdvaW5nID0gRkxBU0hfUFJPQ19QUk9HUkFNX0xBU1Q7DQotICAgIH0gZWxzZSB7DQotICAgICAgcEZsYXNoLlByb2NlZHVyZU9uR29pbmcgPSBGTEFTSF9QUk9DX1BST0dSQU07DQotICAgIH0NCi0gICAgcEZsYXNoLkFkZHJlc3MgPSBBZGRyZXNzOw0KLQ0KLSAgICAvKiBFbmFibGUgRW5kIG9mIE9wZXJhdGlvbiBhbmQgRXJyb3IgaW50ZXJydXB0cyAqLw0KLSAgICBfX0hBTF9GTEFTSF9FTkFCTEVfSVQoRkxBU0hfSVRfRU9QIHwgRkxBU0hfSVRfT1BFUlIpOw0KLQ0KLSAgICBpZiAoVHlwZVByb2dyYW0gPT0gRkxBU0hfVFlQRVBST0dSQU1fRE9VQkxFV09SRCkgew0KLSAgICAgIC8qIFByb2dyYW0gZG91YmxlLXdvcmQgKDY0LWJpdCkgYXQgYSBzcGVjaWZpZWQgYWRkcmVzcyAqLw0KLSAgICAgIEZMQVNIX1Byb2dyYW1fRG91YmxlV29yZChBZGRyZXNzLCBEYXRhKTsNCi0gICAgfSBlbHNlIGlmICgoVHlwZVByb2dyYW0gPT0gRkxBU0hfVFlQRVBST0dSQU1fRkFTVCkgfHwNCi0gICAgICAgICAgICAgICAoVHlwZVByb2dyYW0gPT0gRkxBU0hfVFlQRVBST0dSQU1fRkFTVF9BTkRfTEFTVCkpIHsNCi0gICAgICAvKiBGYXN0IHByb2dyYW0gYSAzMiByb3cgZG91YmxlLXdvcmQgKDY0LWJpdCkgYXQgYSBzcGVjaWZpZWQgYWRkcmVzcyAqLw0KLSAgICAgIEZMQVNIX1Byb2dyYW1fRmFzdChBZGRyZXNzLCAodWludDMyX3QpRGF0YSk7DQotICAgIH0gZWxzZSB7DQotICAgICAgLyogTm90aGluZyB0byBkbyAqLw0KLSAgICB9DQotICB9DQotDQotICByZXR1cm4gc3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEhhbmRsZSBGTEFTSCBpbnRlcnJ1cHQgcmVxdWVzdC4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi12b2lkIEhBTF9GTEFTSF9JUlFIYW5kbGVyKHZvaWQpIHsNCi0gIHVpbnQzMl90IHRtcF9wYWdlOw0KLSAgdWludDMyX3QgZXJyb3I7DQotICBGTEFTSF9Qcm9jZWR1cmVUeXBlRGVmIHByb2NlZHVyZTsNCi0NCi0gIC8qIElmIHRoZSBvcGVyYXRpb24gaXMgY29tcGxldGVkLCBkaXNhYmxlIHRoZSBQRywgUE5CLCBNRVIxLCBNRVIyIGFuZCBQRVIgQml0DQotICAgKi8NCi0gIENMRUFSX0JJVChGTEFTSC0+Q1IsDQotICAgICAgICAgICAgKEZMQVNIX0NSX1BHIHwgRkxBU0hfQ1JfTUVSMSB8IEZMQVNIX0NSX1BFUiB8IEZMQVNIX0NSX1BOQikpOw0KLSNpZiBkZWZpbmVkKEZMQVNIX09QVFJfREJBTkspDQotICBDTEVBUl9CSVQoRkxBU0gtPkNSLCBGTEFTSF9DUl9NRVIyKTsNCi0jZW5kaWYNCi0NCi0gIC8qIERpc2FibGUgdGhlIEZTVFBHIEJpdCBvbmx5IGlmIGl0IGlzIHRoZSBsYXN0IHJvdyBwcm9ncmFtbWVkICovDQotICBpZiAocEZsYXNoLlByb2NlZHVyZU9uR29pbmcgPT0gRkxBU0hfUFJPQ19QUk9HUkFNX0xBU1QpIHsNCi0gICAgQ0xFQVJfQklUKEZMQVNILT5DUiwgRkxBU0hfQ1JfRlNUUEcpOw0KLSAgfQ0KLQ0KLSAgLyogQ2hlY2sgRkxBU0ggb3BlcmF0aW9uIGVycm9yIGZsYWdzICovDQotICBlcnJvciA9IChGTEFTSC0+U1IgJiBGTEFTSF9GTEFHX1NSX0VSUk9SUyk7DQotDQotICBpZiAoZXJyb3IgIT0gMFUpIHsNCi0gICAgLyogU2F2ZSB0aGUgZXJyb3IgY29kZSAqLw0KLSAgICBwRmxhc2guRXJyb3JDb2RlIHw9IGVycm9yOw0KLQ0KLSAgICAvKiBDbGVhciBlcnJvciBwcm9ncmFtbWluZyBmbGFncyAqLw0KLSAgICBfX0hBTF9GTEFTSF9DTEVBUl9GTEFHKGVycm9yKTsNCi0NCi0gICAgLyogRmx1c2ggdGhlIGNhY2hlcyB0byBiZSBzdXJlIG9mIHRoZSBkYXRhIGNvbnNpc3RlbmN5ICovDQotICAgIEZMQVNIX0ZsdXNoQ2FjaGVzKCk7DQotDQotICAgIC8qIEZMQVNIIGVycm9yIGludGVycnVwdCB1c2VyIGNhbGxiYWNrICovDQotICAgIHByb2NlZHVyZSA9IHBGbGFzaC5Qcm9jZWR1cmVPbkdvaW5nOw0KLSAgICBpZiAocHJvY2VkdXJlID09IEZMQVNIX1BST0NfUEFHRV9FUkFTRSkgew0KLSAgICAgIEhBTF9GTEFTSF9PcGVyYXRpb25FcnJvckNhbGxiYWNrKHBGbGFzaC5QYWdlKTsNCi0gICAgfSBlbHNlIGlmIChwcm9jZWR1cmUgPT0gRkxBU0hfUFJPQ19NQVNTX0VSQVNFKSB7DQotICAgICAgSEFMX0ZMQVNIX09wZXJhdGlvbkVycm9yQ2FsbGJhY2socEZsYXNoLkJhbmspOw0KLSAgICB9IGVsc2UgaWYgKChwcm9jZWR1cmUgPT0gRkxBU0hfUFJPQ19QUk9HUkFNKSB8fA0KLSAgICAgICAgICAgICAgIChwcm9jZWR1cmUgPT0gRkxBU0hfUFJPQ19QUk9HUkFNX0xBU1QpKSB7DQotICAgICAgSEFMX0ZMQVNIX09wZXJhdGlvbkVycm9yQ2FsbGJhY2socEZsYXNoLkFkZHJlc3MpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8NCi0gICAgfQ0KLQ0KLSAgICAvKlN0b3AgdGhlIHByb2NlZHVyZSBvbmdvaW5nKi8NCi0gICAgcEZsYXNoLlByb2NlZHVyZU9uR29pbmcgPSBGTEFTSF9QUk9DX05PTkU7DQotICB9DQotDQotICAvKiBDaGVjayBGTEFTSCBFbmQgb2YgT3BlcmF0aW9uIGZsYWcgICovDQotICBpZiAoX19IQUxfRkxBU0hfR0VUX0ZMQUcoRkxBU0hfRkxBR19FT1ApKSB7DQotICAgIC8qIENsZWFyIEZMQVNIIEVuZCBvZiBPcGVyYXRpb24gcGVuZGluZyBiaXQgKi8NCi0gICAgX19IQUxfRkxBU0hfQ0xFQVJfRkxBRyhGTEFTSF9GTEFHX0VPUCk7DQotDQotICAgIGlmIChwRmxhc2guUHJvY2VkdXJlT25Hb2luZyA9PSBGTEFTSF9QUk9DX1BBR0VfRVJBU0UpIHsNCi0gICAgICAvKiBOYiBvZiBwYWdlcyB0byBlcmFzZWQgY2FuIGJlIGRlY3JlYXNlZCAqLw0KLSAgICAgIHBGbGFzaC5OYlBhZ2VzVG9FcmFzZS0tOw0KLQ0KLSAgICAgIC8qIENoZWNrIGlmIHRoZXJlIGFyZSBzdGlsbCBwYWdlcyB0byBlcmFzZSovDQotICAgICAgaWYgKHBGbGFzaC5OYlBhZ2VzVG9FcmFzZSAhPSAwVSkgew0KLSAgICAgICAgLyogSW5kaWNhdGUgdXNlciB3aGljaCBwYWdlIGhhcyBiZWVuIGVyYXNlZCovDQotICAgICAgICBIQUxfRkxBU0hfRW5kT2ZPcGVyYXRpb25DYWxsYmFjayhwRmxhc2guUGFnZSk7DQotDQotICAgICAgICAvKiBJbmNyZW1lbnQgcGFnZSBudW1iZXIgKi8NCi0gICAgICAgIHBGbGFzaC5QYWdlKys7DQotICAgICAgICB0bXBfcGFnZSA9IHBGbGFzaC5QYWdlOw0KLSAgICAgICAgRkxBU0hfUGFnZUVyYXNlKHRtcF9wYWdlLCBwRmxhc2guQmFuayk7DQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgIC8qIE5vIG1vcmUgcGFnZXMgdG8gRXJhc2UgKi8NCi0gICAgICAgIC8qIFJlc2V0IEFkZHJlc3MgYW5kIHN0b3AgRXJhc2UgcGFnZXMgcHJvY2VkdXJlICovDQotICAgICAgICBwRmxhc2guUGFnZSA9IDB4RkZGRkZGRkZVOw0KLSAgICAgICAgcEZsYXNoLlByb2NlZHVyZU9uR29pbmcgPSBGTEFTSF9QUk9DX05PTkU7DQotDQotICAgICAgICAvKiBGbHVzaCB0aGUgY2FjaGVzIHRvIGJlIHN1cmUgb2YgdGhlIGRhdGEgY29uc2lzdGVuY3kgKi8NCi0gICAgICAgIEZMQVNIX0ZsdXNoQ2FjaGVzKCk7DQotDQotICAgICAgICAvKiBGTEFTSCBFT1AgaW50ZXJydXB0IHVzZXIgY2FsbGJhY2sgKi8NCi0gICAgICAgIEhBTF9GTEFTSF9FbmRPZk9wZXJhdGlvbkNhbGxiYWNrKHBGbGFzaC5QYWdlKTsNCi0gICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgLyogRmx1c2ggdGhlIGNhY2hlcyB0byBiZSBzdXJlIG9mIHRoZSBkYXRhIGNvbnNpc3RlbmN5ICovDQotICAgICAgRkxBU0hfRmx1c2hDYWNoZXMoKTsNCi0NCi0gICAgICBwcm9jZWR1cmUgPSBwRmxhc2guUHJvY2VkdXJlT25Hb2luZzsNCi0gICAgICBpZiAocHJvY2VkdXJlID09IEZMQVNIX1BST0NfTUFTU19FUkFTRSkgew0KLSAgICAgICAgLyogTWFzc0VyYXNlIGVuZGVkLiBSZXR1cm4gdGhlIHNlbGVjdGVkIGJhbmsgKi8NCi0gICAgICAgIC8qIEZMQVNIIEVPUCBpbnRlcnJ1cHQgdXNlciBjYWxsYmFjayAqLw0KLSAgICAgICAgSEFMX0ZMQVNIX0VuZE9mT3BlcmF0aW9uQ2FsbGJhY2socEZsYXNoLkJhbmspOw0KLSAgICAgIH0gZWxzZSBpZiAoKHByb2NlZHVyZSA9PSBGTEFTSF9QUk9DX1BST0dSQU0pIHx8DQotICAgICAgICAgICAgICAgICAocHJvY2VkdXJlID09IEZMQVNIX1BST0NfUFJPR1JBTV9MQVNUKSkgew0KLSAgICAgICAgLyogUHJvZ3JhbSBlbmRlZC4gUmV0dXJuIHRoZSBzZWxlY3RlZCBhZGRyZXNzICovDQotICAgICAgICAvKiBGTEFTSCBFT1AgaW50ZXJydXB0IHVzZXIgY2FsbGJhY2sgKi8NCi0gICAgICAgIEhBTF9GTEFTSF9FbmRPZk9wZXJhdGlvbkNhbGxiYWNrKHBGbGFzaC5BZGRyZXNzKTsNCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgLyogTm90aGluZyB0byBkbyAqLw0KLSAgICAgIH0NCi0NCi0gICAgICAvKkNsZWFyIHRoZSBwcm9jZWR1cmUgb25nb2luZyovDQotICAgICAgcEZsYXNoLlByb2NlZHVyZU9uR29pbmcgPSBGTEFTSF9QUk9DX05PTkU7DQotICAgIH0NCi0gIH0NCi0NCi0gIGlmIChwRmxhc2guUHJvY2VkdXJlT25Hb2luZyA9PSBGTEFTSF9QUk9DX05PTkUpIHsNCi0gICAgLyogRGlzYWJsZSBFbmQgb2YgT3BlcmF0aW9uIGFuZCBFcnJvciBpbnRlcnJ1cHRzICovDQotICAgIF9fSEFMX0ZMQVNIX0RJU0FCTEVfSVQoRkxBU0hfSVRfRU9QIHwgRkxBU0hfSVRfT1BFUlIpOw0KLQ0KLSAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovDQotICAgIF9fSEFMX1VOTE9DSygmcEZsYXNoKTsNCi0gIH0NCi19DQotDQotLyoqDQotICogQGJyaWVmICBGTEFTSCBlbmQgb2Ygb3BlcmF0aW9uIGludGVycnVwdCBjYWxsYmFjay4NCi0gKiBAcGFyYW0gIFJldHVyblZhbHVlIFRoZSB2YWx1ZSBzYXZlZCBpbiB0aGlzIHBhcmFtZXRlciBkZXBlbmRzIG9uIHRoZSBvbmdvaW5nDQotICogcHJvY2VkdXJlOg0KLSAqICAgICAgICAgICBAYXJnIE1hc3MgRXJhc2U6IEJhbmsgbnVtYmVyIHdoaWNoIGhhcyBiZWVuIHJlcXVlc3RlZCB0byBlcmFzZQ0KLSAqICAgICAgICAgICBAYXJnIFBhZ2UgRXJhc2U6IFBhZ2Ugd2hpY2ggaGFzIGJlZW4gZXJhc2VkDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlmIDB4RkZGRkZGRkYsIGl0IG1lYW5zIHRoYXQgYWxsIHRoZSBzZWxlY3RlZA0KLSAqIHBhZ2VzIGhhdmUgYmVlbiBlcmFzZWQpDQotICogICAgICAgICAgIEBhcmcgUHJvZ3JhbTogQWRkcmVzcyB3aGljaCB3YXMgc2VsZWN0ZWQgZm9yIGRhdGEgcHJvZ3JhbQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fd2VhayB2b2lkIEhBTF9GTEFTSF9FbmRPZk9wZXJhdGlvbkNhbGxiYWNrKHVpbnQzMl90IFJldHVyblZhbHVlKSB7DQotICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovDQotICBVTlVTRUQoUmV0dXJuVmFsdWUpOw0KLQ0KLSAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLA0KLSAgICAgICAgICAgIHRoZSBIQUxfRkxBU0hfRW5kT2ZPcGVyYXRpb25DYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUNCi0gICAgIHVzZXIgZmlsZQ0KLSAgICovDQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRkxBU0ggb3BlcmF0aW9uIGVycm9yIGludGVycnVwdCBjYWxsYmFjay4NCi0gKiBAcGFyYW0gIFJldHVyblZhbHVlIFRoZSB2YWx1ZSBzYXZlZCBpbiB0aGlzIHBhcmFtZXRlciBkZXBlbmRzIG9uIHRoZSBvbmdvaW5nDQotICogcHJvY2VkdXJlOg0KLSAqICAgICAgICAgICBAYXJnIE1hc3MgRXJhc2U6IEJhbmsgbnVtYmVyIHdoaWNoIGhhcyBiZWVuIHJlcXVlc3RlZCB0byBlcmFzZQ0KLSAqICAgICAgICAgICBAYXJnIFBhZ2UgRXJhc2U6IFBhZ2UgbnVtYmVyIHdoaWNoIHJldHVybmVkIGFuIGVycm9yDQotICogICAgICAgICAgIEBhcmcgUHJvZ3JhbTogQWRkcmVzcyB3aGljaCB3YXMgc2VsZWN0ZWQgZm9yIGRhdGEgcHJvZ3JhbQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fd2VhayB2b2lkIEhBTF9GTEFTSF9PcGVyYXRpb25FcnJvckNhbGxiYWNrKHVpbnQzMl90IFJldHVyblZhbHVlKSB7DQotICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovDQotICBVTlVTRUQoUmV0dXJuVmFsdWUpOw0KLQ0KLSAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLA0KLSAgICAgICAgICAgIHRoZSBIQUxfRkxBU0hfT3BlcmF0aW9uRXJyb3JDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUNCi0gICAgIHVzZXIgZmlsZQ0KLSAgICovDQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBGTEFTSF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMNCi0gICogQGJyaWVmICAgTWFuYWdlbWVudCBmdW5jdGlvbnMNCi0gICoNCi1AdmVyYmF0aW0NCi0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICMjIyMjDQotID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgWy4uXQ0KLSAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGNvbnRyb2wgdGhlIEZMQVNIDQotICAgIG1lbW9yeSBvcGVyYXRpb25zLg0KLQ0KLUBlbmR2ZXJiYXRpbQ0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFVubG9jayB0aGUgRkxBU0ggY29udHJvbCByZWdpc3RlciBhY2Nlc3MuDQotICogQHJldHZhbCBIQUxfU3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIX1VubG9jayh2b2lkKSB7DQotICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7DQotDQotICBpZiAoUkVBRF9CSVQoRkxBU0gtPkNSLCBGTEFTSF9DUl9MT0NLKSAhPSAwVSkgew0KLSAgICAvKiBBdXRob3JpemUgdGhlIEZMQVNIIFJlZ2lzdGVycyBhY2Nlc3MgKi8NCi0gICAgV1JJVEVfUkVHKEZMQVNILT5LRVlSLCBGTEFTSF9LRVkxKTsNCi0gICAgV1JJVEVfUkVHKEZMQVNILT5LRVlSLCBGTEFTSF9LRVkyKTsNCi0NCi0gICAgLyogdmVyaWZ5IEZsYXNoIGlzIHVubG9ja2VkICovDQotICAgIGlmIChSRUFEX0JJVChGTEFTSC0+Q1IsIEZMQVNIX0NSX0xPQ0spICE9IDBVKSB7DQotICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOw0KLSAgICB9DQotICB9DQotDQotICByZXR1cm4gc3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIExvY2sgdGhlIEZMQVNIIGNvbnRyb2wgcmVnaXN0ZXIgYWNjZXNzLg0KLSAqIEByZXR2YWwgSEFMX1N0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9GTEFTSF9Mb2NrKHZvaWQpIHsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9FUlJPUjsNCi0NCi0gIC8qIFNldCB0aGUgTE9DSyBCaXQgdG8gbG9jayB0aGUgRkxBU0ggUmVnaXN0ZXJzIGFjY2VzcyAqLw0KLSAgU0VUX0JJVChGTEFTSC0+Q1IsIEZMQVNIX0NSX0xPQ0spOw0KLQ0KLSAgLyogdmVyaWZ5IEZsYXNoIGlzIGxvY2tlZCAqLw0KLSAgaWYgKFJFQURfQklUKEZMQVNILT5DUiwgRkxBU0hfQ1JfTE9DSykgIT0gMFUpIHsNCi0gICAgc3RhdHVzID0gSEFMX09LOw0KLSAgfQ0KLQ0KLSAgcmV0dXJuIHN0YXR1czsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBVbmxvY2sgdGhlIEZMQVNIIE9wdGlvbiBCeXRlcyBSZWdpc3RlcnMgYWNjZXNzLg0KLSAqIEByZXR2YWwgSEFMX1N0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9GTEFTSF9PQl9VbmxvY2sodm9pZCkgew0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOw0KLQ0KLSAgaWYgKFJFQURfQklUKEZMQVNILT5DUiwgRkxBU0hfQ1JfT1BUTE9DSykgIT0gMFUpIHsNCi0gICAgLyogQXV0aG9yaXplcyB0aGUgT3B0aW9uIEJ5dGUgcmVnaXN0ZXIgcHJvZ3JhbW1pbmcgKi8NCi0gICAgV1JJVEVfUkVHKEZMQVNILT5PUFRLRVlSLCBGTEFTSF9PUFRLRVkxKTsNCi0gICAgV1JJVEVfUkVHKEZMQVNILT5PUFRLRVlSLCBGTEFTSF9PUFRLRVkyKTsNCi0NCi0gICAgLyogdmVyaWZ5IG9wdGlvbiBieXRlcyBhcmUgdW5sb2NrZWQgKi8NCi0gICAgaWYgKFJFQURfQklUKEZMQVNILT5DUiwgRkxBU0hfQ1JfT1BUTE9DSykgIT0gMFUpIHsNCi0gICAgICBzdGF0dXMgPSBIQUxfRVJST1I7DQotICAgIH0NCi0gIH0NCi0NCi0gIHJldHVybiBzdGF0dXM7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgTG9jayB0aGUgRkxBU0ggT3B0aW9uIEJ5dGVzIFJlZ2lzdGVycyBhY2Nlc3MuDQotICogQHJldHZhbCBIQUxfU3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIX09CX0xvY2sodm9pZCkgew0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX0VSUk9SOw0KLQ0KLSAgLyogU2V0IHRoZSBPUFRMT0NLIEJpdCB0byBsb2NrIHRoZSBGTEFTSCBPcHRpb24gQnl0ZSBSZWdpc3RlcnMgYWNjZXNzICovDQotICBTRVRfQklUKEZMQVNILT5DUiwgRkxBU0hfQ1JfT1BUTE9DSyk7DQotDQotICAvKiBWZXJpZnkgb3B0aW9uIGJ5dGVzIGFyZSBsb2NrZWQgKi8NCi0gIGlmIChSRUFEX0JJVChGTEFTSC0+Q1IsIEZMQVNIX0NSX09QVExPQ0spICE9IDBVKSB7DQotICAgIHN0YXR1cyA9IEhBTF9PSzsNCi0gIH0NCi0NCi0gIHJldHVybiBzdGF0dXM7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgTGF1bmNoIHRoZSBvcHRpb24gYnl0ZSBsb2FkaW5nLg0KLSAqIEByZXR2YWwgSEFMX1N0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9GTEFTSF9PQl9MYXVuY2godm9pZCkgew0KLSAgLyogU2V0IHRoZSBiaXQgdG8gZm9yY2UgdGhlIG9wdGlvbiBieXRlIHJlbG9hZGluZyAqLw0KLSAgU0VUX0JJVChGTEFTSC0+Q1IsIEZMQVNIX0NSX09CTF9MQVVOQ0gpOw0KLQ0KLSAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovDQotICByZXR1cm4gKEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKCh1aW50MzJfdClGTEFTSF9USU1FT1VUX1ZBTFVFKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBGTEFTSF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9ycw0KLWZ1bmN0aW9ucw0KLSAgKiBAYnJpZWYgICBQZXJpcGhlcmFsIEVycm9ycyBmdW5jdGlvbnMNCi0gICoNCi1AdmVyYmF0aW0NCi0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIEVycm9ycyBmdW5jdGlvbnMgIyMjIyMNCi0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICBbLi5dDQotICAgIFRoaXMgc3Vic2VjdGlvbiBwZXJtaXRzIHRvIGdldCBpbiBydW4tdGltZSBFcnJvcnMgb2YgdGhlIEZMQVNIIHBlcmlwaGVyYWwuDQotDQotQGVuZHZlcmJhdGltDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IHRoZSBzcGVjaWZpYyBGTEFTSCBlcnJvciBmbGFnLg0KLSAqIEByZXR2YWwgRkxBU0hfRXJyb3JDb2RlLiBUaGUgcmV0dXJuZWQgdmFsdWUgY2FuIGJlOg0KLSAqICAgICAgICAgICAgQGFyZyBIQUxfRkxBU0hfRVJST1JfUkQ6IEZMQVNIIFJlYWQgUHJvdGVjdGlvbiBlcnJvciBmbGFnIChQQ1JPUCkNCi0gKiAgICAgICAgICAgIEBhcmcgSEFMX0ZMQVNIX0VSUk9SX1BHUzogRkxBU0ggUHJvZ3JhbW1pbmcgU2VxdWVuY2UgZXJyb3IgZmxhZw0KLSAqICAgICAgICAgICAgQGFyZyBIQUxfRkxBU0hfRVJST1JfUEdQOiBGTEFTSCBQcm9ncmFtbWluZyBQYXJhbGxlbGlzbSBlcnJvciBmbGFnDQotICogICAgICAgICAgICBAYXJnIEhBTF9GTEFTSF9FUlJPUl9QR0E6IEZMQVNIIFByb2dyYW1taW5nIEFsaWdubWVudCBlcnJvciBmbGFnDQotICogICAgICAgICAgICBAYXJnIEhBTF9GTEFTSF9FUlJPUl9XUlA6IEZMQVNIIFdyaXRlIHByb3RlY3RlZCBlcnJvciBmbGFnDQotICogICAgICAgICAgICBAYXJnIEhBTF9GTEFTSF9FUlJPUl9PUEVSQVRJT046IEZMQVNIIG9wZXJhdGlvbiBFcnJvciBmbGFnDQotICogICAgICAgICAgICBAYXJnIEhBTF9GTEFTSF9FUlJPUl9OT05FOiBObyBlcnJvciBzZXQNCi0gKiAgICAgICAgICAgIEBhcmcgSEFMX0ZMQVNIX0VSUk9SX09QOiBGTEFTSCBPcGVyYXRpb24gZXJyb3INCi0gKiAgICAgICAgICAgIEBhcmcgSEFMX0ZMQVNIX0VSUk9SX1BST0c6IEZMQVNIIFByb2dyYW1taW5nIGVycm9yDQotICogICAgICAgICAgICBAYXJnIEhBTF9GTEFTSF9FUlJPUl9XUlA6IEZMQVNIIFdyaXRlIHByb3RlY3Rpb24gZXJyb3INCi0gKiAgICAgICAgICAgIEBhcmcgSEFMX0ZMQVNIX0VSUk9SX1BHQTogRkxBU0ggUHJvZ3JhbW1pbmcgYWxpZ25tZW50IGVycm9yDQotICogICAgICAgICAgICBAYXJnIEhBTF9GTEFTSF9FUlJPUl9TSVo6IEZMQVNIIFNpemUgZXJyb3INCi0gKiAgICAgICAgICAgIEBhcmcgSEFMX0ZMQVNIX0VSUk9SX1BHUzogRkxBU0ggUHJvZ3JhbW1pbmcgc2VxdWVuY2UgZXJyb3INCi0gKiAgICAgICAgICAgIEBhcmcgSEFMX0ZMQVNIX0VSUk9SX01JUzogRkxBU0ggRmFzdCBwcm9ncmFtbWluZyBkYXRhIG1pc3MgZXJyb3INCi0gKiAgICAgICAgICAgIEBhcmcgSEFMX0ZMQVNIX0VSUk9SX0ZBU1Q6IEZMQVNIIEZhc3QgcHJvZ3JhbW1pbmcgZXJyb3INCi0gKiAgICAgICAgICAgIEBhcmcgSEFMX0ZMQVNIX0VSUk9SX1JEOiBGTEFTSCBQQ1JPUCByZWFkIGVycm9yDQotICogICAgICAgICAgICBAYXJnIEhBTF9GTEFTSF9FUlJPUl9PUFRWOiBGTEFTSCBPcHRpb24gdmFsaWRpdHkgZXJyb3INCi0gKi8NCi11aW50MzJfdCBIQUxfRkxBU0hfR2V0RXJyb3Iodm9pZCkgeyByZXR1cm4gcEZsYXNoLkVycm9yQ29kZTsgfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLQ0KLS8qKiBAYWRkdG9ncm91cCBGTEFTSF9Qcml2YXRlX0Z1bmN0aW9ucw0KLSAqIEB7DQotICovDQotDQotLyoqDQotICogQGJyaWVmICBXYWl0IGZvciBhIEZMQVNIIG9wZXJhdGlvbiB0byBjb21wbGV0ZS4NCi0gKiBAcGFyYW0gIFRpbWVvdXQgbWF4aW11bSBmbGFzaCBvcGVyYXRpb24gdGltZW91dC4NCi0gKiBAcmV0dmFsIEhBTF9TdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbih1aW50MzJfdCBUaW1lb3V0KSB7DQotICAvKiBXYWl0IGZvciB0aGUgRkxBU0ggb3BlcmF0aW9uIHRvIGNvbXBsZXRlIGJ5IHBvbGxpbmcgb24gQlVTWSBmbGFnIHRvIGJlDQotICAgICByZXNldC4gRXZlbiBpZiB0aGUgRkxBU0ggb3BlcmF0aW9uIGZhaWxzLCB0aGUgQlVTWSBmbGFnIHdpbGwgYmUgcmVzZXQgYW5kDQotICAgICBhbiBlcnJvciBmbGFnIHdpbGwgYmUgc2V0ICovDQotDQotICB1aW50MzJfdCB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOw0KLSAgdWludDMyX3QgZXJyb3I7DQotDQotICB3aGlsZSAoX19IQUxfRkxBU0hfR0VUX0ZMQUcoRkxBU0hfRkxBR19CU1kpKSB7DQotICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBUaW1lb3V0KSB7DQotICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOw0KLSAgICB9DQotICB9DQotDQotICAvKiBDaGVjayBGTEFTSCBvcGVyYXRpb24gZXJyb3IgZmxhZ3MgKi8NCi0gIGVycm9yID0gKEZMQVNILT5TUiAmIEZMQVNIX0ZMQUdfU1JfRVJST1JTKTsNCi0gIGlmIChlcnJvciAhPSAwdSkgew0KLSAgICAvKiBTYXZlIHRoZSBlcnJvciBjb2RlICovDQotICAgIHBGbGFzaC5FcnJvckNvZGUgfD0gZXJyb3I7DQotDQotICAgIC8qIENsZWFyIGVycm9yIHByb2dyYW1taW5nIGZsYWdzICovDQotICAgIF9fSEFMX0ZMQVNIX0NMRUFSX0ZMQUcoZXJyb3IpOw0KLQ0KLSAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgfQ0KLQ0KLSAgLyogQ2hlY2sgRkxBU0ggRW5kIG9mIE9wZXJhdGlvbiBmbGFnICAqLw0KLSAgaWYgKF9fSEFMX0ZMQVNIX0dFVF9GTEFHKEZMQVNIX0ZMQUdfRU9QKSkgew0KLSAgICAvKiBDbGVhciBGTEFTSCBFbmQgb2YgT3BlcmF0aW9uIHBlbmRpbmcgYml0ICovDQotICAgIF9fSEFMX0ZMQVNIX0NMRUFSX0ZMQUcoRkxBU0hfRkxBR19FT1ApOw0KLSAgfQ0KLQ0KLSAgLyogSWYgdGhlcmUgaXMgYW4gZXJyb3IgZmxhZyBzZXQgKi8NCi0gIHJldHVybiBIQUxfT0s7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUHJvZ3JhbSBkb3VibGUtd29yZCAoNjQtYml0KSBhdCBhIHNwZWNpZmllZCBhZGRyZXNzLg0KLSAqIEBwYXJhbSAgQWRkcmVzcyBzcGVjaWZpZXMgdGhlIGFkZHJlc3MgdG8gYmUgcHJvZ3JhbW1lZC4NCi0gKiBAcGFyYW0gIERhdGEgc3BlY2lmaWVzIHRoZSBkYXRhIHRvIGJlIHByb2dyYW1tZWQuDQotICogQHJldHZhbCBOb25lDQotICovDQotc3RhdGljIHZvaWQgRkxBU0hfUHJvZ3JhbV9Eb3VibGVXb3JkKHVpbnQzMl90IEFkZHJlc3MsIHVpbnQ2NF90IERhdGEpIHsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfRkxBU0hfUFJPR1JBTV9BRERSRVNTKEFkZHJlc3MpKTsNCi0NCi0gIC8qIFNldCBQRyBiaXQgKi8NCi0gIFNFVF9CSVQoRkxBU0gtPkNSLCBGTEFTSF9DUl9QRyk7DQotDQotICAvKiBQcm9ncmFtIGZpcnN0IHdvcmQgKi8NCi0gICoodWludDMyX3QgKilBZGRyZXNzID0gKHVpbnQzMl90KURhdGE7DQotDQotICAvKiBCYXJyaWVyIHRvIGVuc3VyZSBwcm9ncmFtbWluZyBpcyBwZXJmb3JtZWQgaW4gMiBzdGVwcywgaW4gcmlnaHQgb3JkZXINCi0gICAgKGluZGVwZW5kZW50bHkgb2YgY29tcGlsZXIgb3B0aW1pemF0aW9uIGJlaGF2aW9yKSAqLw0KLSAgX19JU0IoKTsNCi0NCi0gIC8qIFByb2dyYW0gc2Vjb25kIHdvcmQgKi8NCi0gICoodWludDMyX3QgKikoQWRkcmVzcyArIDRVKSA9ICh1aW50MzJfdCkoRGF0YSA+PiAzMlUpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEZhc3QgcHJvZ3JhbSBhIHJvdyBkb3VibGUtd29yZCAoNjQtYml0KSBhdCBhIHNwZWNpZmllZCBhZGRyZXNzLg0KLSAqIEBwYXJhbSAgQWRkcmVzcyBzcGVjaWZpZXMgdGhlIGFkZHJlc3MgdG8gYmUgcHJvZ3JhbW1lZC4NCi0gKiBAcGFyYW0gIERhdGFBZGRyZXNzIHNwZWNpZmllcyB0aGUgYWRkcmVzcyB3aGVyZSB0aGUgZGF0YSBhcmUgc3RvcmVkLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXN0YXRpYyB2b2lkIEZMQVNIX1Byb2dyYW1fRmFzdCh1aW50MzJfdCBBZGRyZXNzLCB1aW50MzJfdCBEYXRhQWRkcmVzcykgew0KLSAgdWludDhfdCByb3dfaW5kZXggPSAoMiAqIEZMQVNIX05CX0RPVUJMRV9XT1JEU19JTl9ST1cpOw0KLSAgdWludDMyX3QgKmRlc3RfYWRkciA9ICh1aW50MzJfdCAqKUFkZHJlc3M7DQotICB1aW50MzJfdCAqc3JjX2FkZHIgPSAodWludDMyX3QgKilEYXRhQWRkcmVzczsNCi0gIHVpbnQzMl90IHByaW1hc2tfYml0Ow0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19GTEFTSF9NQUlOX01FTV9BRERSRVNTKEFkZHJlc3MpKTsNCi0NCi0gIC8qIFNldCBGU1RQRyBiaXQgKi8NCi0gIFNFVF9CSVQoRkxBU0gtPkNSLCBGTEFTSF9DUl9GU1RQRyk7DQotDQotICAvKiBFbnRlciBjcml0aWNhbCBzZWN0aW9uOiBEaXNhYmxlIGludGVycnVwdHMgdG8gYXZvaWQgYW55IGludGVycnVwdGlvbiBkdXJpbmcNCi0gICAqIHRoZSBsb29wICovDQotICBwcmltYXNrX2JpdCA9IF9fZ2V0X1BSSU1BU0soKTsNCi0gIF9fZGlzYWJsZV9pcnEoKTsNCi0NCi0gIC8qIFByb2dyYW0gdGhlIGRvdWJsZSB3b3JkcyBvZiB0aGUgcm93ICovDQotICBkbyB7DQotICAgICpkZXN0X2FkZHIgPSAqc3JjX2FkZHI7DQotICAgIGRlc3RfYWRkcisrOw0KLSAgICBzcmNfYWRkcisrOw0KLSAgICByb3dfaW5kZXgtLTsNCi0gIH0gd2hpbGUgKHJvd19pbmRleCAhPSAwVSk7DQotDQotICAvKiBFeGl0IGNyaXRpY2FsIHNlY3Rpb246IHJlc3RvcmUgcHJldmlvdXMgcHJpb3JpdHkgbWFzayAqLw0KLSAgX19zZXRfUFJJTUFTSyhwcmltYXNrX2JpdCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotI2VuZGlmIC8qIEhBTF9GTEFTSF9NT0RVTEVfRU5BQkxFRCAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnNHh4X2hhbF9mbGFzaC5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBGTEFTSCBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBpbnRlcm5hbCBGTEFTSCBtZW1vcnk6CisgICogICAgICAgICAgICsgUHJvZ3JhbSBvcGVyYXRpb25zIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIE1lbW9yeSBDb250cm9sIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgRXJyb3JzIGZ1bmN0aW9ucworICAqCisgIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEZMQVNIIHBlcmlwaGVyYWwgZmVhdHVyZXMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgWy4uXSBUaGUgRmxhc2ggbWVtb3J5IGludGVyZmFjZSBtYW5hZ2VzIENQVSBBSEIgSS1Db2RlIGFuZCBELUNvZGUgYWNjZXNzZXMKKyAgICAgICB0byB0aGUgRmxhc2ggbWVtb3J5LiBJdCBpbXBsZW1lbnRzIHRoZSBlcmFzZSBhbmQgcHJvZ3JhbSBGbGFzaCBtZW1vcnkKKyAgb3BlcmF0aW9ucyBhbmQgdGhlIHJlYWQgYW5kIHdyaXRlIHByb3RlY3Rpb24gbWVjaGFuaXNtcy4KKworICBbLi5dIFRoZSBGbGFzaCBtZW1vcnkgaW50ZXJmYWNlIGFjY2VsZXJhdGVzIGNvZGUgZXhlY3V0aW9uIHdpdGggYSBzeXN0ZW0gb2YKKyAgaW5zdHJ1Y3Rpb24gcHJlZmV0Y2ggYW5kIGNhY2hlIGxpbmVzLgorCisgIFsuLl0gVGhlIEZMQVNIIG1haW4gZmVhdHVyZXMgYXJlOgorICAgICAgKCspIEZsYXNoIG1lbW9yeSByZWFkIG9wZXJhdGlvbnMKKyAgICAgICgrKSBGbGFzaCBtZW1vcnkgcHJvZ3JhbS9lcmFzZSBvcGVyYXRpb25zCisgICAgICAoKykgUmVhZCAvIHdyaXRlIHByb3RlY3Rpb25zCisgICAgICAoKykgT3B0aW9uIGJ5dGVzIHByb2dyYW1taW5nCisgICAgICAoKykgUHJlZmV0Y2ggb24gSS1Db2RlCisgICAgICAoKykgMzIgY2FjaGUgbGluZXMgb2YgNCo2NCBvciAyKjEyOCBiaXRzIG9uIEktQ29kZQorICAgICAgKCspIDggY2FjaGUgbGluZXMgb2YgNCo2NCBvciAyKjEyOCBiaXRzIG9uIEQtQ29kZQorICAgICAgKCspIEVycm9yIGNvZGUgY29ycmVjdGlvbiAoRUNDKSA6IERhdGEgaW4gZmxhc2ggYXJlIDcyLWJpdHMgd29yZAorICAgICAgICAgICg4IGJpdHMgYWRkZWQgcGVyIGRvdWJsZSB3b3JkKQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgVGhpcyBkcml2ZXIgcHJvdmlkZXMgZnVuY3Rpb25zIGFuZCBtYWNyb3MgdG8gY29uZmlndXJlIGFuZCBwcm9ncmFtIHRoZQorICBGTEFTSCBtZW1vcnkgb2YgYWxsIFNUTTMyRzR4eCBkZXZpY2VzLgorCisgICAgICAoIykgRmxhc2ggTWVtb3J5IElPIFByb2dyYW1taW5nIGZ1bmN0aW9uczoKKyAgICAgICAgICAgKCsrKSBMb2NrIGFuZCBVbmxvY2sgdGhlIEZMQVNIIGludGVyZmFjZSB1c2luZyBIQUxfRkxBU0hfVW5sb2NrKCkgYW5kCisgICAgICAgICAgICAgICAgSEFMX0ZMQVNIX0xvY2soKSBmdW5jdGlvbnMKKyAgICAgICAgICAgKCsrKSBQcm9ncmFtIGZ1bmN0aW9uczogZG91YmxlIHdvcmQgYW5kIGZhc3QgcHJvZ3JhbSAoZnVsbCByb3cKKyAgcHJvZ3JhbW1pbmcpCisgICAgICAgICAgICgrKykgVGhlcmUgYXJlIHR3byBtb2RlcyBvZiBwcm9ncmFtbWluZyA6CisgICAgICAgICAgICAoKysrKSBQb2xsaW5nIG1vZGUgdXNpbmcgSEFMX0ZMQVNIX1Byb2dyYW0oKSBmdW5jdGlvbgorICAgICAgICAgICAgKCsrKykgSW50ZXJydXB0IG1vZGUgdXNpbmcgSEFMX0ZMQVNIX1Byb2dyYW1fSVQoKSBmdW5jdGlvbgorCisgICAgICAoIykgSW50ZXJydXB0cyBhbmQgZmxhZ3MgbWFuYWdlbWVudCBmdW5jdGlvbnM6CisgICAgICAgICAgICgrKykgSGFuZGxlIEZMQVNIIGludGVycnVwdHMgYnkgY2FsbGluZyBIQUxfRkxBU0hfSVJRSGFuZGxlcigpCisgICAgICAgICAgICgrKykgQ2FsbGJhY2sgZnVuY3Rpb25zIGFyZSBjYWxsZWQgd2hlbiB0aGUgZmxhc2ggb3BlcmF0aW9ucyBhcmUKKyAgZmluaXNoZWQgOiBIQUxfRkxBU0hfRW5kT2ZPcGVyYXRpb25DYWxsYmFjaygpIHdoZW4gZXZlcnl0aGluZyBpcyBvaywgb3RoZXJ3aXNlCisgICAgICAgICAgICAgICAgSEFMX0ZMQVNIX09wZXJhdGlvbkVycm9yQ2FsbGJhY2soKQorICAgICAgICAgICAoKyspIEdldCBlcnJvciBmbGFnIHN0YXR1cyBieSBjYWxsaW5nIEhBTF9HZXRFcnJvcigpCisKKyAgICAgICgjKSBPcHRpb24gYnl0ZXMgbWFuYWdlbWVudCBmdW5jdGlvbnM6CisgICAgICAgICAgICgrKykgTG9jayBhbmQgVW5sb2NrIHRoZSBvcHRpb24gYnl0ZXMgdXNpbmcgSEFMX0ZMQVNIX09CX1VubG9jaygpIGFuZAorICAgICAgICAgICAgICAgIEhBTF9GTEFTSF9PQl9Mb2NrKCkgZnVuY3Rpb25zCisgICAgICAgICAgICgrKykgTGF1bmNoIHRoZSByZWxvYWQgb2YgdGhlIG9wdGlvbiBieXRlcyB1c2luZyBIQUxfRkxBU0hfTGF1bmNoKCkKKyAgZnVuY3Rpb24uIEluIHRoaXMgY2FzZSwgYSByZXNldCBpcyBnZW5lcmF0ZWQKKworICAgIFsuLl0KKyAgICAgIEluIGFkZGl0aW9uIHRvIHRoZXNlIGZ1bmN0aW9ucywgdGhpcyBkcml2ZXIgaW5jbHVkZXMgYSBzZXQgb2YgbWFjcm9zCisgIGFsbG93aW5nIHRvIGhhbmRsZSB0aGUgZm9sbG93aW5nIG9wZXJhdGlvbnM6CisgICAgICAgKCspIFNldCB0aGUgbGF0ZW5jeQorICAgICAgICgrKSBFbmFibGUvRGlzYWJsZSB0aGUgcHJlZmV0Y2ggYnVmZmVyCisgICAgICAgKCspIEVuYWJsZS9EaXNhYmxlIHRoZSBJbnN0cnVjdGlvbiBjYWNoZSBhbmQgdGhlIERhdGEgY2FjaGUKKyAgICAgICAoKykgUmVzZXQgdGhlIEluc3RydWN0aW9uIGNhY2hlIGFuZCB0aGUgRGF0YSBjYWNoZQorICAgICAgICgrKSBFbmFibGUvRGlzYWJsZSB0aGUgRmxhc2ggcG93ZXItZG93biBkdXJpbmcgbG93LXBvd2VyIHJ1biBhbmQgc2xlZXAKKyAgbW9kZXMKKyAgICAgICAoKykgRW5hYmxlL0Rpc2FibGUgdGhlIEZsYXNoIGludGVycnVwdHMKKyAgICAgICAoKykgTW9uaXRvciB0aGUgRmxhc2ggZmxhZ3Mgc3RhdHVzCisKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGVybXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZQorICBpbgorICAqIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4KKyAgKiBJZiBubyBMSUNFTlNFIGZpbGUgY29tZXMgd2l0aCB0aGlzIHNvZnR3YXJlLCBpdCBpcyBwcm92aWRlZCBBUy1JUy4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnNHh4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHNHh4X0hBTF9Ecml2ZXIKKyAqIEB7CisgKi8KKworLyoqIEBkZWZncm91cCBGTEFTSCBGTEFTSAorICogQGJyaWVmIEZMQVNIIEhBTCBtb2R1bGUgZHJpdmVyCisgKiBAeworICovCisKKyNpZmRlZiBIQUxfRkxBU0hfTU9EVUxFX0VOQUJMRUQKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEZMQVNIX1ByaXZhdGVfQ29uc3RhbnRzIEZMQVNIIFByaXZhdGUgQ29uc3RhbnRzCisgKiBAeworICovCisjZGVmaW5lIEZMQVNIX05CX0RPVUJMRV9XT1JEU19JTl9ST1cgMzIKKy8qKgorICogQH0KKyAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRkxBU0hfUHJpdmF0ZV9WYXJpYWJsZXMgRkxBU0ggUHJpdmF0ZSBWYXJpYWJsZXMKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgIFZhcmlhYmxlIHVzZWQgZm9yIFByb2dyYW0vRXJhc2Ugc2VjdG9ycyB1bmRlciBpbnRlcnJ1cHRpb24KKyAqLworRkxBU0hfUHJvY2Vzc1R5cGVEZWYgcEZsYXNoID0gey5Mb2NrID0gSEFMX1VOTE9DS0VELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5FcnJvckNvZGUgPSBIQUxfRkxBU0hfRVJST1JfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuUHJvY2VkdXJlT25Hb2luZyA9IEZMQVNIX1BST0NfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQWRkcmVzcyA9IDBVLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5CYW5rID0gRkxBU0hfQkFOS18xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5QYWdlID0gMFUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLk5iUGFnZXNUb0VyYXNlID0gMFUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkNhY2hlVG9SZWFjdGl2YXRlID0gRkxBU0hfQ0FDSEVfRElTQUJMRUR9OworLyoqCisgKiBAfQorICovCisKKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEZMQVNIX1ByaXZhdGVfRnVuY3Rpb25zIEZMQVNIIFByaXZhdGUgRnVuY3Rpb25zCisgKiBAeworICovCitzdGF0aWMgdm9pZCBGTEFTSF9Qcm9ncmFtX0RvdWJsZVdvcmQodWludDMyX3QgQWRkcmVzcywgdWludDY0X3QgRGF0YSk7CitzdGF0aWMgdm9pZCBGTEFTSF9Qcm9ncmFtX0Zhc3QodWludDMyX3QgQWRkcmVzcywgdWludDMyX3QgRGF0YUFkZHJlc3MpOworLyoqCisgKiBAfQorICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEZMQVNIX0V4cG9ydGVkX0Z1bmN0aW9ucyBGTEFTSCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAqIEB7CisgKi8KKworLyoqIEBkZWZncm91cCBGTEFTSF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIFByb2dyYW1taW5nIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKiAgQGJyaWVmICAgUHJvZ3JhbW1pbmcgb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAjIyMjIyBQcm9ncmFtbWluZyBvcGVyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIG1hbmFnZSB0aGUgRkxBU0gKKyAgICBwcm9ncmFtIG9wZXJhdGlvbnMuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICogQGJyaWVmICBQcm9ncmFtIGRvdWJsZSB3b3JkIG9yIGZhc3QgcHJvZ3JhbSBvZiBhIHJvdyBhdCBhIHNwZWNpZmllZCBhZGRyZXNzLgorICogQHBhcmFtICBUeXBlUHJvZ3JhbSBJbmRpY2F0ZSB0aGUgd2F5IHRvIHByb2dyYW0gYXQgYSBzcGVjaWZpZWQgYWRkcmVzcy4KKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBGTEFTSF9UeXBlX1Byb2dyYW0uCisgKiBAcGFyYW0gIEFkZHJlc3Mgc3BlY2lmaWVzIHRoZSBhZGRyZXNzIHRvIGJlIHByb2dyYW1tZWQuCisgKiBAcGFyYW0gIERhdGEgc3BlY2lmaWVzIHRoZSBkYXRhIHRvIGJlIHByb2dyYW1tZWQuCisgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGlzIHRoZSBkYXRhIGZvciB0aGUgZG91YmxlIHdvcmQgcHJvZ3JhbSBhbmQgdGhlCisgKiBhZGRyZXNzIHdoZXJlIGFyZSBzdG9yZWQgdGhlIGRhdGEgZm9yIHRoZSByb3cgZmFzdCBwcm9ncmFtLgorICoKKyAqIEByZXR2YWwgSEFMX1N0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkxBU0hfUHJvZ3JhbSh1aW50MzJfdCBUeXBlUHJvZ3JhbSwgdWludDMyX3QgQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IERhdGEpIHsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzOworICB1aW50MzJfdCBwcm9nX2JpdCA9IDA7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0ZMQVNIX1RZUEVQUk9HUkFNKFR5cGVQcm9ncmFtKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSygmcEZsYXNoKTsKKworICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8KKyAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oKHVpbnQzMl90KUZMQVNIX1RJTUVPVVRfVkFMVUUpOworCisgIGlmIChzdGF0dXMgPT0gSEFMX09LKSB7CisgICAgcEZsYXNoLkVycm9yQ29kZSA9IEhBTF9GTEFTSF9FUlJPUl9OT05FOworCisgICAgLyogRGVhY3RpdmF0ZSB0aGUgZGF0YSBjYWNoZSBpZiB0aGV5IGFyZSBhY3RpdmF0ZWQgdG8gYXZvaWQgZGF0YSBtaXNiZWhhdmlvcgorICAgICAqLworICAgIGlmIChSRUFEX0JJVChGTEFTSC0+QUNSLCBGTEFTSF9BQ1JfRENFTikgIT0gMFUpIHsKKyAgICAgIC8qIERpc2FibGUgZGF0YSBjYWNoZSAgKi8KKyAgICAgIF9fSEFMX0ZMQVNIX0RBVEFfQ0FDSEVfRElTQUJMRSgpOworICAgICAgcEZsYXNoLkNhY2hlVG9SZWFjdGl2YXRlID0gRkxBU0hfQ0FDSEVfRENBQ0hFX0VOQUJMRUQ7CisgICAgfSBlbHNlIHsKKyAgICAgIHBGbGFzaC5DYWNoZVRvUmVhY3RpdmF0ZSA9IEZMQVNIX0NBQ0hFX0RJU0FCTEVEOworICAgIH0KKyAgICBpZiAoVHlwZVByb2dyYW0gPT0gRkxBU0hfVFlQRVBST0dSQU1fRE9VQkxFV09SRCkgeworICAgICAgLyogUHJvZ3JhbSBkb3VibGUtd29yZCAoNjQtYml0KSBhdCBhIHNwZWNpZmllZCBhZGRyZXNzICovCisgICAgICBGTEFTSF9Qcm9ncmFtX0RvdWJsZVdvcmQoQWRkcmVzcywgRGF0YSk7CisgICAgICBwcm9nX2JpdCA9IEZMQVNIX0NSX1BHOworICAgIH0gZWxzZSBpZiAoKFR5cGVQcm9ncmFtID09IEZMQVNIX1RZUEVQUk9HUkFNX0ZBU1QpIHx8CisgICAgICAgICAgICAgICAoVHlwZVByb2dyYW0gPT0gRkxBU0hfVFlQRVBST0dSQU1fRkFTVF9BTkRfTEFTVCkpIHsKKyAgICAgIC8qIEZhc3QgcHJvZ3JhbSBhIDMyIHJvdyBkb3VibGUtd29yZCAoNjQtYml0KSBhdCBhIHNwZWNpZmllZCBhZGRyZXNzICovCisgICAgICBGTEFTSF9Qcm9ncmFtX0Zhc3QoQWRkcmVzcywgKHVpbnQzMl90KURhdGEpOworCisgICAgICAvKiBJZiBpdCBpcyB0aGUgbGFzdCByb3csIHRoZSBiaXQgd2lsbCBiZSBjbGVhcmVkIGF0IHRoZSBlbmQgb2YgdGhlCisgICAgICAgKiBvcGVyYXRpb24gKi8KKyAgICAgIGlmIChUeXBlUHJvZ3JhbSA9PSBGTEFTSF9UWVBFUFJPR1JBTV9GQVNUX0FORF9MQVNUKSB7CisgICAgICAgIHByb2dfYml0ID0gRkxBU0hfQ1JfRlNUUEc7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgICB9CisKKyAgICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8KKyAgICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbigodWludDMyX3QpRkxBU0hfVElNRU9VVF9WQUxVRSk7CisKKyAgICAvKiBJZiB0aGUgcHJvZ3JhbSBvcGVyYXRpb24gaXMgY29tcGxldGVkLCBkaXNhYmxlIHRoZSBQRyBvciBGU1RQRyBCaXQgKi8KKyAgICBpZiAocHJvZ19iaXQgIT0gMFUpIHsKKyAgICAgIENMRUFSX0JJVChGTEFTSC0+Q1IsIHByb2dfYml0KTsKKyAgICB9CisKKyAgICAvKiBGbHVzaCB0aGUgY2FjaGVzIHRvIGJlIHN1cmUgb2YgdGhlIGRhdGEgY29uc2lzdGVuY3kgKi8KKyAgICBGTEFTSF9GbHVzaENhY2hlcygpOworICB9CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soJnBGbGFzaCk7CisKKyAgLyogcmV0dXJuIHN0YXR1cyAqLworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIEBicmllZiAgUHJvZ3JhbSBkb3VibGUgd29yZCBvciBmYXN0IHByb2dyYW0gb2YgYSByb3cgYXQgYSBzcGVjaWZpZWQgYWRkcmVzcworICogd2l0aCBpbnRlcnJ1cHQgZW5hYmxlZC4KKyAqIEBwYXJhbSAgVHlwZVByb2dyYW0gSW5kaWNhdGUgdGhlIHdheSB0byBwcm9ncmFtIGF0IGEgc3BlY2lmaWVkIGFkZHJlc3MuCisgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRkxBU0hfVHlwZV9Qcm9ncmFtLgorICogQHBhcmFtICBBZGRyZXNzIHNwZWNpZmllcyB0aGUgYWRkcmVzcyB0byBiZSBwcm9ncmFtbWVkLgorICogQHBhcmFtICBEYXRhIHNwZWNpZmllcyB0aGUgZGF0YSB0byBiZSBwcm9ncmFtbWVkLgorICogICAgICAgICBUaGlzIHBhcmFtZXRlciBpcyB0aGUgZGF0YSBmb3IgdGhlIGRvdWJsZSB3b3JkIHByb2dyYW0gYW5kIHRoZQorICogYWRkcmVzcyB3aGVyZSBhcmUgc3RvcmVkIHRoZSBkYXRhIGZvciB0aGUgcm93IGZhc3QgcHJvZ3JhbS4KKyAqCisgKiBAcmV0dmFsIEhBTF9TdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIX1Byb2dyYW1fSVQodWludDMyX3QgVHlwZVByb2dyYW0sIHVpbnQzMl90IEFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBEYXRhKSB7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1czsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfRkxBU0hfVFlQRVBST0dSQU0oVHlwZVByb2dyYW0pKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKCZwRmxhc2gpOworCisgIC8qIFJlc2V0IGVycm9yIGNvZGUgKi8KKyAgcEZsYXNoLkVycm9yQ29kZSA9IEhBTF9GTEFTSF9FUlJPUl9OT05FOworCisgIC8qIERlYWN0aXZhdGUgdGhlIGRhdGEgY2FjaGUgaWYgdGhleSBhcmUgYWN0aXZhdGVkIHRvIGF2b2lkIGRhdGEgbWlzYmVoYXZpb3IKKyAgICovCisgIGlmIChSRUFEX0JJVChGTEFTSC0+QUNSLCBGTEFTSF9BQ1JfRENFTikgIT0gMFUpIHsKKyAgICAvKiBEaXNhYmxlIGRhdGEgY2FjaGUgICovCisgICAgX19IQUxfRkxBU0hfREFUQV9DQUNIRV9ESVNBQkxFKCk7CisgICAgcEZsYXNoLkNhY2hlVG9SZWFjdGl2YXRlID0gRkxBU0hfQ0FDSEVfRENBQ0hFX0VOQUJMRUQ7CisgIH0gZWxzZSB7CisgICAgcEZsYXNoLkNhY2hlVG9SZWFjdGl2YXRlID0gRkxBU0hfQ0FDSEVfRElTQUJMRUQ7CisgIH0KKworICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8KKyAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oRkxBU0hfVElNRU9VVF9WQUxVRSk7CisKKyAgaWYgKHN0YXR1cyAhPSBIQUxfT0spIHsKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKCZwRmxhc2gpOworICB9IGVsc2UgeworICAgIC8qIFNldCBpbnRlcm5hbCB2YXJpYWJsZXMgdXNlZCBieSB0aGUgSVJRIGhhbmRsZXIgKi8KKyAgICBpZiAoVHlwZVByb2dyYW0gPT0gRkxBU0hfVFlQRVBST0dSQU1fRkFTVF9BTkRfTEFTVCkgeworICAgICAgcEZsYXNoLlByb2NlZHVyZU9uR29pbmcgPSBGTEFTSF9QUk9DX1BST0dSQU1fTEFTVDsKKyAgICB9IGVsc2UgeworICAgICAgcEZsYXNoLlByb2NlZHVyZU9uR29pbmcgPSBGTEFTSF9QUk9DX1BST0dSQU07CisgICAgfQorICAgIHBGbGFzaC5BZGRyZXNzID0gQWRkcmVzczsKKworICAgIC8qIEVuYWJsZSBFbmQgb2YgT3BlcmF0aW9uIGFuZCBFcnJvciBpbnRlcnJ1cHRzICovCisgICAgX19IQUxfRkxBU0hfRU5BQkxFX0lUKEZMQVNIX0lUX0VPUCB8IEZMQVNIX0lUX09QRVJSKTsKKworICAgIGlmIChUeXBlUHJvZ3JhbSA9PSBGTEFTSF9UWVBFUFJPR1JBTV9ET1VCTEVXT1JEKSB7CisgICAgICAvKiBQcm9ncmFtIGRvdWJsZS13b3JkICg2NC1iaXQpIGF0IGEgc3BlY2lmaWVkIGFkZHJlc3MgKi8KKyAgICAgIEZMQVNIX1Byb2dyYW1fRG91YmxlV29yZChBZGRyZXNzLCBEYXRhKTsKKyAgICB9IGVsc2UgaWYgKChUeXBlUHJvZ3JhbSA9PSBGTEFTSF9UWVBFUFJPR1JBTV9GQVNUKSB8fAorICAgICAgICAgICAgICAgKFR5cGVQcm9ncmFtID09IEZMQVNIX1RZUEVQUk9HUkFNX0ZBU1RfQU5EX0xBU1QpKSB7CisgICAgICAvKiBGYXN0IHByb2dyYW0gYSAzMiByb3cgZG91YmxlLXdvcmQgKDY0LWJpdCkgYXQgYSBzcGVjaWZpZWQgYWRkcmVzcyAqLworICAgICAgRkxBU0hfUHJvZ3JhbV9GYXN0KEFkZHJlc3MsICh1aW50MzJfdClEYXRhKTsKKyAgICB9IGVsc2UgeworICAgICAgLyogTm90aGluZyB0byBkbyAqLworICAgIH0KKyAgfQorCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogQGJyaWVmICBIYW5kbGUgRkxBU0ggaW50ZXJydXB0IHJlcXVlc3QuCisgKiBAcmV0dmFsIE5vbmUKKyAqLwordm9pZCBIQUxfRkxBU0hfSVJRSGFuZGxlcih2b2lkKSB7CisgIHVpbnQzMl90IHRtcF9wYWdlOworICB1aW50MzJfdCBlcnJvcjsKKyAgRkxBU0hfUHJvY2VkdXJlVHlwZURlZiBwcm9jZWR1cmU7CisKKyAgLyogSWYgdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQsIGRpc2FibGUgdGhlIFBHLCBQTkIsIE1FUjEsIE1FUjIgYW5kIFBFUiBCaXQKKyAgICovCisgIENMRUFSX0JJVChGTEFTSC0+Q1IsCisgICAgICAgICAgICAoRkxBU0hfQ1JfUEcgfCBGTEFTSF9DUl9NRVIxIHwgRkxBU0hfQ1JfUEVSIHwgRkxBU0hfQ1JfUE5CKSk7CisjaWYgZGVmaW5lZChGTEFTSF9PUFRSX0RCQU5LKQorICBDTEVBUl9CSVQoRkxBU0gtPkNSLCBGTEFTSF9DUl9NRVIyKTsKKyNlbmRpZgorCisgIC8qIERpc2FibGUgdGhlIEZTVFBHIEJpdCBvbmx5IGlmIGl0IGlzIHRoZSBsYXN0IHJvdyBwcm9ncmFtbWVkICovCisgIGlmIChwRmxhc2guUHJvY2VkdXJlT25Hb2luZyA9PSBGTEFTSF9QUk9DX1BST0dSQU1fTEFTVCkgeworICAgIENMRUFSX0JJVChGTEFTSC0+Q1IsIEZMQVNIX0NSX0ZTVFBHKTsKKyAgfQorCisgIC8qIENoZWNrIEZMQVNIIG9wZXJhdGlvbiBlcnJvciBmbGFncyAqLworICBlcnJvciA9IChGTEFTSC0+U1IgJiBGTEFTSF9GTEFHX1NSX0VSUk9SUyk7CisKKyAgaWYgKGVycm9yICE9IDBVKSB7CisgICAgLyogU2F2ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIHBGbGFzaC5FcnJvckNvZGUgfD0gZXJyb3I7CisKKyAgICAvKiBDbGVhciBlcnJvciBwcm9ncmFtbWluZyBmbGFncyAqLworICAgIF9fSEFMX0ZMQVNIX0NMRUFSX0ZMQUcoZXJyb3IpOworCisgICAgLyogRmx1c2ggdGhlIGNhY2hlcyB0byBiZSBzdXJlIG9mIHRoZSBkYXRhIGNvbnNpc3RlbmN5ICovCisgICAgRkxBU0hfRmx1c2hDYWNoZXMoKTsKKworICAgIC8qIEZMQVNIIGVycm9yIGludGVycnVwdCB1c2VyIGNhbGxiYWNrICovCisgICAgcHJvY2VkdXJlID0gcEZsYXNoLlByb2NlZHVyZU9uR29pbmc7CisgICAgaWYgKHByb2NlZHVyZSA9PSBGTEFTSF9QUk9DX1BBR0VfRVJBU0UpIHsKKyAgICAgIEhBTF9GTEFTSF9PcGVyYXRpb25FcnJvckNhbGxiYWNrKHBGbGFzaC5QYWdlKTsKKyAgICB9IGVsc2UgaWYgKHByb2NlZHVyZSA9PSBGTEFTSF9QUk9DX01BU1NfRVJBU0UpIHsKKyAgICAgIEhBTF9GTEFTSF9PcGVyYXRpb25FcnJvckNhbGxiYWNrKHBGbGFzaC5CYW5rKTsKKyAgICB9IGVsc2UgaWYgKChwcm9jZWR1cmUgPT0gRkxBU0hfUFJPQ19QUk9HUkFNKSB8fAorICAgICAgICAgICAgICAgKHByb2NlZHVyZSA9PSBGTEFTSF9QUk9DX1BST0dSQU1fTEFTVCkpIHsKKyAgICAgIEhBTF9GTEFTSF9PcGVyYXRpb25FcnJvckNhbGxiYWNrKHBGbGFzaC5BZGRyZXNzKTsKKyAgICB9IGVsc2UgeworICAgICAgLyogTm90aGluZyB0byBkbyAqLworICAgIH0KKworICAgIC8qU3RvcCB0aGUgcHJvY2VkdXJlIG9uZ29pbmcqLworICAgIHBGbGFzaC5Qcm9jZWR1cmVPbkdvaW5nID0gRkxBU0hfUFJPQ19OT05FOworICB9CisKKyAgLyogQ2hlY2sgRkxBU0ggRW5kIG9mIE9wZXJhdGlvbiBmbGFnICAqLworICBpZiAoX19IQUxfRkxBU0hfR0VUX0ZMQUcoRkxBU0hfRkxBR19FT1ApKSB7CisgICAgLyogQ2xlYXIgRkxBU0ggRW5kIG9mIE9wZXJhdGlvbiBwZW5kaW5nIGJpdCAqLworICAgIF9fSEFMX0ZMQVNIX0NMRUFSX0ZMQUcoRkxBU0hfRkxBR19FT1ApOworCisgICAgaWYgKHBGbGFzaC5Qcm9jZWR1cmVPbkdvaW5nID09IEZMQVNIX1BST0NfUEFHRV9FUkFTRSkgeworICAgICAgLyogTmIgb2YgcGFnZXMgdG8gZXJhc2VkIGNhbiBiZSBkZWNyZWFzZWQgKi8KKyAgICAgIHBGbGFzaC5OYlBhZ2VzVG9FcmFzZS0tOworCisgICAgICAvKiBDaGVjayBpZiB0aGVyZSBhcmUgc3RpbGwgcGFnZXMgdG8gZXJhc2UqLworICAgICAgaWYgKHBGbGFzaC5OYlBhZ2VzVG9FcmFzZSAhPSAwVSkgeworICAgICAgICAvKiBJbmRpY2F0ZSB1c2VyIHdoaWNoIHBhZ2UgaGFzIGJlZW4gZXJhc2VkKi8KKyAgICAgICAgSEFMX0ZMQVNIX0VuZE9mT3BlcmF0aW9uQ2FsbGJhY2socEZsYXNoLlBhZ2UpOworCisgICAgICAgIC8qIEluY3JlbWVudCBwYWdlIG51bWJlciAqLworICAgICAgICBwRmxhc2guUGFnZSsrOworICAgICAgICB0bXBfcGFnZSA9IHBGbGFzaC5QYWdlOworICAgICAgICBGTEFTSF9QYWdlRXJhc2UodG1wX3BhZ2UsIHBGbGFzaC5CYW5rKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIE5vIG1vcmUgcGFnZXMgdG8gRXJhc2UgKi8KKyAgICAgICAgLyogUmVzZXQgQWRkcmVzcyBhbmQgc3RvcCBFcmFzZSBwYWdlcyBwcm9jZWR1cmUgKi8KKyAgICAgICAgcEZsYXNoLlBhZ2UgPSAweEZGRkZGRkZGVTsKKyAgICAgICAgcEZsYXNoLlByb2NlZHVyZU9uR29pbmcgPSBGTEFTSF9QUk9DX05PTkU7CisKKyAgICAgICAgLyogRmx1c2ggdGhlIGNhY2hlcyB0byBiZSBzdXJlIG9mIHRoZSBkYXRhIGNvbnNpc3RlbmN5ICovCisgICAgICAgIEZMQVNIX0ZsdXNoQ2FjaGVzKCk7CisKKyAgICAgICAgLyogRkxBU0ggRU9QIGludGVycnVwdCB1c2VyIGNhbGxiYWNrICovCisgICAgICAgIEhBTF9GTEFTSF9FbmRPZk9wZXJhdGlvbkNhbGxiYWNrKHBGbGFzaC5QYWdlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLyogRmx1c2ggdGhlIGNhY2hlcyB0byBiZSBzdXJlIG9mIHRoZSBkYXRhIGNvbnNpc3RlbmN5ICovCisgICAgICBGTEFTSF9GbHVzaENhY2hlcygpOworCisgICAgICBwcm9jZWR1cmUgPSBwRmxhc2guUHJvY2VkdXJlT25Hb2luZzsKKyAgICAgIGlmIChwcm9jZWR1cmUgPT0gRkxBU0hfUFJPQ19NQVNTX0VSQVNFKSB7CisgICAgICAgIC8qIE1hc3NFcmFzZSBlbmRlZC4gUmV0dXJuIHRoZSBzZWxlY3RlZCBiYW5rICovCisgICAgICAgIC8qIEZMQVNIIEVPUCBpbnRlcnJ1cHQgdXNlciBjYWxsYmFjayAqLworICAgICAgICBIQUxfRkxBU0hfRW5kT2ZPcGVyYXRpb25DYWxsYmFjayhwRmxhc2guQmFuayk7CisgICAgICB9IGVsc2UgaWYgKChwcm9jZWR1cmUgPT0gRkxBU0hfUFJPQ19QUk9HUkFNKSB8fAorICAgICAgICAgICAgICAgICAocHJvY2VkdXJlID09IEZMQVNIX1BST0NfUFJPR1JBTV9MQVNUKSkgeworICAgICAgICAvKiBQcm9ncmFtIGVuZGVkLiBSZXR1cm4gdGhlIHNlbGVjdGVkIGFkZHJlc3MgKi8KKyAgICAgICAgLyogRkxBU0ggRU9QIGludGVycnVwdCB1c2VyIGNhbGxiYWNrICovCisgICAgICAgIEhBTF9GTEFTSF9FbmRPZk9wZXJhdGlvbkNhbGxiYWNrKHBGbGFzaC5BZGRyZXNzKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgICAgIH0KKworICAgICAgLypDbGVhciB0aGUgcHJvY2VkdXJlIG9uZ29pbmcqLworICAgICAgcEZsYXNoLlByb2NlZHVyZU9uR29pbmcgPSBGTEFTSF9QUk9DX05PTkU7CisgICAgfQorICB9CisKKyAgaWYgKHBGbGFzaC5Qcm9jZWR1cmVPbkdvaW5nID09IEZMQVNIX1BST0NfTk9ORSkgeworICAgIC8qIERpc2FibGUgRW5kIG9mIE9wZXJhdGlvbiBhbmQgRXJyb3IgaW50ZXJydXB0cyAqLworICAgIF9fSEFMX0ZMQVNIX0RJU0FCTEVfSVQoRkxBU0hfSVRfRU9QIHwgRkxBU0hfSVRfT1BFUlIpOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSygmcEZsYXNoKTsKKyAgfQorfQorCisvKioKKyAqIEBicmllZiAgRkxBU0ggZW5kIG9mIG9wZXJhdGlvbiBpbnRlcnJ1cHQgY2FsbGJhY2suCisgKiBAcGFyYW0gIFJldHVyblZhbHVlIFRoZSB2YWx1ZSBzYXZlZCBpbiB0aGlzIHBhcmFtZXRlciBkZXBlbmRzIG9uIHRoZSBvbmdvaW5nCisgKiBwcm9jZWR1cmU6CisgKiAgICAgICAgICAgQGFyZyBNYXNzIEVyYXNlOiBCYW5rIG51bWJlciB3aGljaCBoYXMgYmVlbiByZXF1ZXN0ZWQgdG8gZXJhc2UKKyAqICAgICAgICAgICBAYXJnIFBhZ2UgRXJhc2U6IFBhZ2Ugd2hpY2ggaGFzIGJlZW4gZXJhc2VkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaWYgMHhGRkZGRkZGRiwgaXQgbWVhbnMgdGhhdCBhbGwgdGhlIHNlbGVjdGVkCisgKiBwYWdlcyBoYXZlIGJlZW4gZXJhc2VkKQorICogICAgICAgICAgIEBhcmcgUHJvZ3JhbTogQWRkcmVzcyB3aGljaCB3YXMgc2VsZWN0ZWQgZm9yIGRhdGEgcHJvZ3JhbQorICogQHJldHZhbCBOb25lCisgKi8KK19fd2VhayB2b2lkIEhBTF9GTEFTSF9FbmRPZk9wZXJhdGlvbkNhbGxiYWNrKHVpbnQzMl90IFJldHVyblZhbHVlKSB7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKFJldHVyblZhbHVlKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0ZMQVNIX0VuZE9mT3BlcmF0aW9uQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlCisgICAgIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgKiBAYnJpZWYgIEZMQVNIIG9wZXJhdGlvbiBlcnJvciBpbnRlcnJ1cHQgY2FsbGJhY2suCisgKiBAcGFyYW0gIFJldHVyblZhbHVlIFRoZSB2YWx1ZSBzYXZlZCBpbiB0aGlzIHBhcmFtZXRlciBkZXBlbmRzIG9uIHRoZSBvbmdvaW5nCisgKiBwcm9jZWR1cmU6CisgKiAgICAgICAgICAgQGFyZyBNYXNzIEVyYXNlOiBCYW5rIG51bWJlciB3aGljaCBoYXMgYmVlbiByZXF1ZXN0ZWQgdG8gZXJhc2UKKyAqICAgICAgICAgICBAYXJnIFBhZ2UgRXJhc2U6IFBhZ2UgbnVtYmVyIHdoaWNoIHJldHVybmVkIGFuIGVycm9yCisgKiAgICAgICAgICAgQGFyZyBQcm9ncmFtOiBBZGRyZXNzIHdoaWNoIHdhcyBzZWxlY3RlZCBmb3IgZGF0YSBwcm9ncmFtCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX193ZWFrIHZvaWQgSEFMX0ZMQVNIX09wZXJhdGlvbkVycm9yQ2FsbGJhY2sodWludDMyX3QgUmV0dXJuVmFsdWUpIHsKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoUmV0dXJuVmFsdWUpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfRkxBU0hfT3BlcmF0aW9uRXJyb3JDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUKKyAgICAgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBGTEFTSF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiBAYnJpZWYgICBNYW5hZ2VtZW50IGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBjb250cm9sIHRoZSBGTEFTSAorICAgIG1lbW9yeSBvcGVyYXRpb25zLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAqIEBicmllZiAgVW5sb2NrIHRoZSBGTEFTSCBjb250cm9sIHJlZ2lzdGVyIGFjY2Vzcy4KKyAqIEByZXR2YWwgSEFMX1N0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkxBU0hfVW5sb2NrKHZvaWQpIHsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIGlmIChSRUFEX0JJVChGTEFTSC0+Q1IsIEZMQVNIX0NSX0xPQ0spICE9IDBVKSB7CisgICAgLyogQXV0aG9yaXplIHRoZSBGTEFTSCBSZWdpc3RlcnMgYWNjZXNzICovCisgICAgV1JJVEVfUkVHKEZMQVNILT5LRVlSLCBGTEFTSF9LRVkxKTsKKyAgICBXUklURV9SRUcoRkxBU0gtPktFWVIsIEZMQVNIX0tFWTIpOworCisgICAgLyogdmVyaWZ5IEZsYXNoIGlzIHVubG9ja2VkICovCisgICAgaWYgKFJFQURfQklUKEZMQVNILT5DUiwgRkxBU0hfQ1JfTE9DSykgIT0gMFUpIHsKKyAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICB9CisgIH0KKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIEBicmllZiAgTG9jayB0aGUgRkxBU0ggY29udHJvbCByZWdpc3RlciBhY2Nlc3MuCisgKiBAcmV0dmFsIEhBTF9TdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIX0xvY2sodm9pZCkgeworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfRVJST1I7CisKKyAgLyogU2V0IHRoZSBMT0NLIEJpdCB0byBsb2NrIHRoZSBGTEFTSCBSZWdpc3RlcnMgYWNjZXNzICovCisgIFNFVF9CSVQoRkxBU0gtPkNSLCBGTEFTSF9DUl9MT0NLKTsKKworICAvKiB2ZXJpZnkgRmxhc2ggaXMgbG9ja2VkICovCisgIGlmIChSRUFEX0JJVChGTEFTSC0+Q1IsIEZMQVNIX0NSX0xPQ0spICE9IDBVKSB7CisgICAgc3RhdHVzID0gSEFMX09LOworICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBAYnJpZWYgIFVubG9jayB0aGUgRkxBU0ggT3B0aW9uIEJ5dGVzIFJlZ2lzdGVycyBhY2Nlc3MuCisgKiBAcmV0dmFsIEhBTF9TdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIX09CX1VubG9jayh2b2lkKSB7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBpZiAoUkVBRF9CSVQoRkxBU0gtPkNSLCBGTEFTSF9DUl9PUFRMT0NLKSAhPSAwVSkgeworICAgIC8qIEF1dGhvcml6ZXMgdGhlIE9wdGlvbiBCeXRlIHJlZ2lzdGVyIHByb2dyYW1taW5nICovCisgICAgV1JJVEVfUkVHKEZMQVNILT5PUFRLRVlSLCBGTEFTSF9PUFRLRVkxKTsKKyAgICBXUklURV9SRUcoRkxBU0gtPk9QVEtFWVIsIEZMQVNIX09QVEtFWTIpOworCisgICAgLyogdmVyaWZ5IG9wdGlvbiBieXRlcyBhcmUgdW5sb2NrZWQgKi8KKyAgICBpZiAoUkVBRF9CSVQoRkxBU0gtPkNSLCBGTEFTSF9DUl9PUFRMT0NLKSAhPSAwVSkgeworICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgIH0KKyAgfQorCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogQGJyaWVmICBMb2NrIHRoZSBGTEFTSCBPcHRpb24gQnl0ZXMgUmVnaXN0ZXJzIGFjY2Vzcy4KKyAqIEByZXR2YWwgSEFMX1N0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkxBU0hfT0JfTG9jayh2b2lkKSB7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9FUlJPUjsKKworICAvKiBTZXQgdGhlIE9QVExPQ0sgQml0IHRvIGxvY2sgdGhlIEZMQVNIIE9wdGlvbiBCeXRlIFJlZ2lzdGVycyBhY2Nlc3MgKi8KKyAgU0VUX0JJVChGTEFTSC0+Q1IsIEZMQVNIX0NSX09QVExPQ0spOworCisgIC8qIFZlcmlmeSBvcHRpb24gYnl0ZXMgYXJlIGxvY2tlZCAqLworICBpZiAoUkVBRF9CSVQoRkxBU0gtPkNSLCBGTEFTSF9DUl9PUFRMT0NLKSAhPSAwVSkgeworICAgIHN0YXR1cyA9IEhBTF9PSzsKKyAgfQorCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogQGJyaWVmICBMYXVuY2ggdGhlIG9wdGlvbiBieXRlIGxvYWRpbmcuCisgKiBAcmV0dmFsIEhBTF9TdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIX09CX0xhdW5jaCh2b2lkKSB7CisgIC8qIFNldCB0aGUgYml0IHRvIGZvcmNlIHRoZSBvcHRpb24gYnl0ZSByZWxvYWRpbmcgKi8KKyAgU0VUX0JJVChGTEFTSC0+Q1IsIEZMQVNIX0NSX09CTF9MQVVOQ0gpOworCisgIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLworICByZXR1cm4gKEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKCh1aW50MzJfdClGTEFTSF9USU1FT1VUX1ZBTFVFKSk7Cit9CisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIEZMQVNIX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3JzCitmdW5jdGlvbnMKKyAgKiBAYnJpZWYgICBQZXJpcGhlcmFsIEVycm9ycyBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgRXJyb3JzIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHBlcm1pdHMgdG8gZ2V0IGluIHJ1bi10aW1lIEVycm9ycyBvZiB0aGUgRkxBU0ggcGVyaXBoZXJhbC4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgKiBAYnJpZWYgIEdldCB0aGUgc3BlY2lmaWMgRkxBU0ggZXJyb3IgZmxhZy4KKyAqIEByZXR2YWwgRkxBU0hfRXJyb3JDb2RlLiBUaGUgcmV0dXJuZWQgdmFsdWUgY2FuIGJlOgorICogICAgICAgICAgICBAYXJnIEhBTF9GTEFTSF9FUlJPUl9SRDogRkxBU0ggUmVhZCBQcm90ZWN0aW9uIGVycm9yIGZsYWcgKFBDUk9QKQorICogICAgICAgICAgICBAYXJnIEhBTF9GTEFTSF9FUlJPUl9QR1M6IEZMQVNIIFByb2dyYW1taW5nIFNlcXVlbmNlIGVycm9yIGZsYWcKKyAqICAgICAgICAgICAgQGFyZyBIQUxfRkxBU0hfRVJST1JfUEdQOiBGTEFTSCBQcm9ncmFtbWluZyBQYXJhbGxlbGlzbSBlcnJvciBmbGFnCisgKiAgICAgICAgICAgIEBhcmcgSEFMX0ZMQVNIX0VSUk9SX1BHQTogRkxBU0ggUHJvZ3JhbW1pbmcgQWxpZ25tZW50IGVycm9yIGZsYWcKKyAqICAgICAgICAgICAgQGFyZyBIQUxfRkxBU0hfRVJST1JfV1JQOiBGTEFTSCBXcml0ZSBwcm90ZWN0ZWQgZXJyb3IgZmxhZworICogICAgICAgICAgICBAYXJnIEhBTF9GTEFTSF9FUlJPUl9PUEVSQVRJT046IEZMQVNIIG9wZXJhdGlvbiBFcnJvciBmbGFnCisgKiAgICAgICAgICAgIEBhcmcgSEFMX0ZMQVNIX0VSUk9SX05PTkU6IE5vIGVycm9yIHNldAorICogICAgICAgICAgICBAYXJnIEhBTF9GTEFTSF9FUlJPUl9PUDogRkxBU0ggT3BlcmF0aW9uIGVycm9yCisgKiAgICAgICAgICAgIEBhcmcgSEFMX0ZMQVNIX0VSUk9SX1BST0c6IEZMQVNIIFByb2dyYW1taW5nIGVycm9yCisgKiAgICAgICAgICAgIEBhcmcgSEFMX0ZMQVNIX0VSUk9SX1dSUDogRkxBU0ggV3JpdGUgcHJvdGVjdGlvbiBlcnJvcgorICogICAgICAgICAgICBAYXJnIEhBTF9GTEFTSF9FUlJPUl9QR0E6IEZMQVNIIFByb2dyYW1taW5nIGFsaWdubWVudCBlcnJvcgorICogICAgICAgICAgICBAYXJnIEhBTF9GTEFTSF9FUlJPUl9TSVo6IEZMQVNIIFNpemUgZXJyb3IKKyAqICAgICAgICAgICAgQGFyZyBIQUxfRkxBU0hfRVJST1JfUEdTOiBGTEFTSCBQcm9ncmFtbWluZyBzZXF1ZW5jZSBlcnJvcgorICogICAgICAgICAgICBAYXJnIEhBTF9GTEFTSF9FUlJPUl9NSVM6IEZMQVNIIEZhc3QgcHJvZ3JhbW1pbmcgZGF0YSBtaXNzIGVycm9yCisgKiAgICAgICAgICAgIEBhcmcgSEFMX0ZMQVNIX0VSUk9SX0ZBU1Q6IEZMQVNIIEZhc3QgcHJvZ3JhbW1pbmcgZXJyb3IKKyAqICAgICAgICAgICAgQGFyZyBIQUxfRkxBU0hfRVJST1JfUkQ6IEZMQVNIIFBDUk9QIHJlYWQgZXJyb3IKKyAqICAgICAgICAgICAgQGFyZyBIQUxfRkxBU0hfRVJST1JfT1BUVjogRkxBU0ggT3B0aW9uIHZhbGlkaXR5IGVycm9yCisgKi8KK3VpbnQzMl90IEhBTF9GTEFTSF9HZXRFcnJvcih2b2lkKSB7IHJldHVybiBwRmxhc2guRXJyb3JDb2RlOyB9CisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBhZGR0b2dyb3VwIEZMQVNIX1ByaXZhdGVfRnVuY3Rpb25zCisgKiBAeworICovCisKKy8qKgorICogQGJyaWVmICBXYWl0IGZvciBhIEZMQVNIIG9wZXJhdGlvbiB0byBjb21wbGV0ZS4KKyAqIEBwYXJhbSAgVGltZW91dCBtYXhpbXVtIGZsYXNoIG9wZXJhdGlvbiB0aW1lb3V0LgorICogQHJldHZhbCBIQUxfU3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKHVpbnQzMl90IFRpbWVvdXQpIHsKKyAgLyogV2FpdCBmb3IgdGhlIEZMQVNIIG9wZXJhdGlvbiB0byBjb21wbGV0ZSBieSBwb2xsaW5nIG9uIEJVU1kgZmxhZyB0byBiZQorICAgICByZXNldC4gRXZlbiBpZiB0aGUgRkxBU0ggb3BlcmF0aW9uIGZhaWxzLCB0aGUgQlVTWSBmbGFnIHdpbGwgYmUgcmVzZXQgYW5kCisgICAgIGFuIGVycm9yIGZsYWcgd2lsbCBiZSBzZXQgKi8KKworICB1aW50MzJfdCB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworICB1aW50MzJfdCBlcnJvcjsKKworICB3aGlsZSAoX19IQUxfRkxBU0hfR0VUX0ZMQUcoRkxBU0hfRkxBR19CU1kpKSB7CisgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFRpbWVvdXQpIHsKKyAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICB9CisgIH0KKworICAvKiBDaGVjayBGTEFTSCBvcGVyYXRpb24gZXJyb3IgZmxhZ3MgKi8KKyAgZXJyb3IgPSAoRkxBU0gtPlNSICYgRkxBU0hfRkxBR19TUl9FUlJPUlMpOworICBpZiAoZXJyb3IgIT0gMHUpIHsKKyAgICAvKiBTYXZlIHRoZSBlcnJvciBjb2RlICovCisgICAgcEZsYXNoLkVycm9yQ29kZSB8PSBlcnJvcjsKKworICAgIC8qIENsZWFyIGVycm9yIHByb2dyYW1taW5nIGZsYWdzICovCisgICAgX19IQUxfRkxBU0hfQ0xFQVJfRkxBRyhlcnJvcik7CisKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgRkxBU0ggRW5kIG9mIE9wZXJhdGlvbiBmbGFnICAqLworICBpZiAoX19IQUxfRkxBU0hfR0VUX0ZMQUcoRkxBU0hfRkxBR19FT1ApKSB7CisgICAgLyogQ2xlYXIgRkxBU0ggRW5kIG9mIE9wZXJhdGlvbiBwZW5kaW5nIGJpdCAqLworICAgIF9fSEFMX0ZMQVNIX0NMRUFSX0ZMQUcoRkxBU0hfRkxBR19FT1ApOworICB9CisKKyAgLyogSWYgdGhlcmUgaXMgYW4gZXJyb3IgZmxhZyBzZXQgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgIFByb2dyYW0gZG91YmxlLXdvcmQgKDY0LWJpdCkgYXQgYSBzcGVjaWZpZWQgYWRkcmVzcy4KKyAqIEBwYXJhbSAgQWRkcmVzcyBzcGVjaWZpZXMgdGhlIGFkZHJlc3MgdG8gYmUgcHJvZ3JhbW1lZC4KKyAqIEBwYXJhbSAgRGF0YSBzcGVjaWZpZXMgdGhlIGRhdGEgdG8gYmUgcHJvZ3JhbW1lZC4KKyAqIEByZXR2YWwgTm9uZQorICovCitzdGF0aWMgdm9pZCBGTEFTSF9Qcm9ncmFtX0RvdWJsZVdvcmQodWludDMyX3QgQWRkcmVzcywgdWludDY0X3QgRGF0YSkgeworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfRkxBU0hfUFJPR1JBTV9BRERSRVNTKEFkZHJlc3MpKTsKKworICAvKiBTZXQgUEcgYml0ICovCisgIFNFVF9CSVQoRkxBU0gtPkNSLCBGTEFTSF9DUl9QRyk7CisKKyAgLyogUHJvZ3JhbSBmaXJzdCB3b3JkICovCisgICoodWludDMyX3QgKilBZGRyZXNzID0gKHVpbnQzMl90KURhdGE7CisKKyAgLyogQmFycmllciB0byBlbnN1cmUgcHJvZ3JhbW1pbmcgaXMgcGVyZm9ybWVkIGluIDIgc3RlcHMsIGluIHJpZ2h0IG9yZGVyCisgICAgKGluZGVwZW5kZW50bHkgb2YgY29tcGlsZXIgb3B0aW1pemF0aW9uIGJlaGF2aW9yKSAqLworICBfX0lTQigpOworCisgIC8qIFByb2dyYW0gc2Vjb25kIHdvcmQgKi8KKyAgKih1aW50MzJfdCAqKShBZGRyZXNzICsgNFUpID0gKHVpbnQzMl90KShEYXRhID4+IDMyVSk7Cit9CisKKy8qKgorICogQGJyaWVmICBGYXN0IHByb2dyYW0gYSByb3cgZG91YmxlLXdvcmQgKDY0LWJpdCkgYXQgYSBzcGVjaWZpZWQgYWRkcmVzcy4KKyAqIEBwYXJhbSAgQWRkcmVzcyBzcGVjaWZpZXMgdGhlIGFkZHJlc3MgdG8gYmUgcHJvZ3JhbW1lZC4KKyAqIEBwYXJhbSAgRGF0YUFkZHJlc3Mgc3BlY2lmaWVzIHRoZSBhZGRyZXNzIHdoZXJlIHRoZSBkYXRhIGFyZSBzdG9yZWQuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworc3RhdGljIHZvaWQgRkxBU0hfUHJvZ3JhbV9GYXN0KHVpbnQzMl90IEFkZHJlc3MsIHVpbnQzMl90IERhdGFBZGRyZXNzKSB7CisgIHVpbnQ4X3Qgcm93X2luZGV4ID0gKDIgKiBGTEFTSF9OQl9ET1VCTEVfV09SRFNfSU5fUk9XKTsKKyAgdWludDMyX3QgKmRlc3RfYWRkciA9ICh1aW50MzJfdCAqKUFkZHJlc3M7CisgIHVpbnQzMl90ICpzcmNfYWRkciA9ICh1aW50MzJfdCAqKURhdGFBZGRyZXNzOworICB1aW50MzJfdCBwcmltYXNrX2JpdDsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfRkxBU0hfTUFJTl9NRU1fQUREUkVTUyhBZGRyZXNzKSk7CisKKyAgLyogU2V0IEZTVFBHIGJpdCAqLworICBTRVRfQklUKEZMQVNILT5DUiwgRkxBU0hfQ1JfRlNUUEcpOworCisgIC8qIEVudGVyIGNyaXRpY2FsIHNlY3Rpb246IERpc2FibGUgaW50ZXJydXB0cyB0byBhdm9pZCBhbnkgaW50ZXJydXB0aW9uIGR1cmluZworICAgKiB0aGUgbG9vcCAqLworICBwcmltYXNrX2JpdCA9IF9fZ2V0X1BSSU1BU0soKTsKKyAgX19kaXNhYmxlX2lycSgpOworCisgIC8qIFByb2dyYW0gdGhlIGRvdWJsZSB3b3JkcyBvZiB0aGUgcm93ICovCisgIGRvIHsKKyAgICAqZGVzdF9hZGRyID0gKnNyY19hZGRyOworICAgIGRlc3RfYWRkcisrOworICAgIHNyY19hZGRyKys7CisgICAgcm93X2luZGV4LS07CisgIH0gd2hpbGUgKHJvd19pbmRleCAhPSAwVSk7CisKKyAgLyogRXhpdCBjcml0aWNhbCBzZWN0aW9uOiByZXN0b3JlIHByZXZpb3VzIHByaW9yaXR5IG1hc2sgKi8KKyAgX19zZXRfUFJJTUFTSyhwcmltYXNrX2JpdCk7Cit9CisKKy8qKgorICogQH0KKyAqLworCisjZW5kaWYgLyogSEFMX0ZMQVNIX01PRFVMRV9FTkFCTEVEICovCisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KZGlmZiAtLWdpdCBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9mbGFzaF9leC5jIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX2ZsYXNoX2V4LmMKaW5kZXggNDRiOGVmZS4uYTY0Nzc0NCAxMDA2NDQKLS0tIGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX2ZsYXNoX2V4LmMKKysrIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX2ZsYXNoX2V4LmMKQEAgLTEsMTMzMSArMSwxMzQ2IEBACi0vKioNCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgKiBAZmlsZSAgICBzdG0zMmc0eHhfaGFsX2ZsYXNoX2V4LmMNCi0gICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0NCi0gICogQGJyaWVmICAgRXh0ZW5kZWQgRkxBU0ggSEFMIG1vZHVsZSBkcml2ZXIuDQotICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcNCi0gICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBGTEFTSCBleHRlbmRlZCBwZXJpcGhlcmFsOg0KLSAgKiAgICAgICAgICAgKyBFeHRlbmRlZCBwcm9ncmFtbWluZyBvcGVyYXRpb25zIGZ1bmN0aW9ucw0KLSAgKg0KLSAgQHZlcmJhdGltDQotICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgICAgICAgICAgICAgICAgIyMjIyMgRmxhc2ggRXh0ZW5kZWQgZmVhdHVyZXMgIyMjIyMNCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLSAgWy4uXSBDb21wYXJpbmcgdG8gb3RoZXIgcHJldmlvdXMgZGV2aWNlcywgdGhlIEZMQVNIIGludGVyZmFjZSBmb3IgU1RNMzJHNHh4DQotICAgICAgIGRldmljZXMgY29udGFpbnMgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIGZlYXR1cmVzDQotDQotICAgICAgICgrKSBDYXBhY2l0eSB1cCB0byA1MTIgS2J5dGVzIHdpdGggZHVhbCBiYW5rIGFyY2hpdGVjdHVyZSBzdXBwb3J0aW5nDQotICByZWFkLXdoaWxlLXdyaXRlIGNhcGFiaWxpdHkgKFJXVykNCi0gICAgICAgKCspIER1YWwgYmFuayA2NC1iaXRzIG1lbW9yeSBvcmdhbml6YXRpb24gd2l0aCBwb3NzaWJpbGl0eSBvZiBzaW5nbGUgYmFuaw0KLSAgMTI4LWJpdHMNCi0gICAgICAgKCspIFByb3RlY3RlZCBhcmVhcyBpbmNsdWRpbmcgV1JQLCBQQ1JPUCBhbmQgU2VjdXJhYmxlIG1lbW9yeQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMNCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgWy4uXSBUaGlzIGRyaXZlciBwcm92aWRlcyBmdW5jdGlvbnMgdG8gY29uZmlndXJlIGFuZCBwcm9ncmFtIHRoZSBGTEFTSCBtZW1vcnkNCi0gICAgICAgb2YgYWxsIFNUTTMyRzR4eCBkZXZpY2VzLiBJdCBpbmNsdWRlcw0KLSAgICAgICgjKSBGbGFzaCBNZW1vcnkgRXJhc2UgZnVuY3Rpb25zOg0KLSAgICAgICAgICAgKCsrKSBMb2NrIGFuZCBVbmxvY2sgdGhlIEZMQVNIIGludGVyZmFjZSB1c2luZyBIQUxfRkxBU0hfVW5sb2NrKCkgYW5kDQotICAgICAgICAgICAgICAgIEhBTF9GTEFTSF9Mb2NrKCkgZnVuY3Rpb25zDQotICAgICAgICAgICAoKyspIEVyYXNlIGZ1bmN0aW9uOiBFcmFzZSBwYWdlcywgb3IgbWFzcyBlcmFzZSBiYW5rcw0KLSAgICAgICAgICAgKCsrKSBUaGVyZSBhcmUgdHdvIG1vZGVzIG9mIGVyYXNlIDoNCi0gICAgICAgICAgICAgKCsrKykgUG9sbGluZyBNb2RlIHVzaW5nIEhBTF9GTEFTSEV4X0VyYXNlKCkNCi0gICAgICAgICAgICAgKCsrKykgSW50ZXJydXB0IE1vZGUgdXNpbmcgSEFMX0ZMQVNIRXhfRXJhc2VfSVQoKQ0KLQ0KLSAgICAgICgjKSBPcHRpb24gQnl0ZXMgUHJvZ3JhbW1pbmcgZnVuY3Rpb246IFVzZSBIQUxfRkxBU0hFeF9PQlByb2dyYW0oKSB0bzoNCi0gICAgICAgICgrKykgQ29uZmlndXJlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGFyZWFzIChXUlApDQotICAgICAgICAoKyspIFNldCB0aGUgUmVhZCBwcm90ZWN0aW9uIExldmVsIChSRFApDQotICAgICAgICAoKyspIFByb2dyYW0gdGhlIHVzZXIgT3B0aW9uIEJ5dGVzDQotICAgICAgICAoKyspIENvbmZpZ3VyZSB0aGUgUHJvcHJpZXRhcnkgQ29kZSBSZWFkT3V0IHByb3RlY3Rpb24gYXJlYXMgKFBDUk9QKQ0KLSAgICAgICAgKCsrKSBDb25maWd1cmUgdGhlIFNlY3VyYWJsZSBtZW1vcnkgYXJlYXMNCi0gICAgICAgICgrKykgQ29uZmlndXJlIHRoZSBCb290IExvY2sNCi0NCi0gICAgICAoIykgR2V0IE9wdGlvbiBCeXRlcyBDb25maWd1cmF0aW9uIGZ1bmN0aW9uOiBVc2UgSEFMX0ZMQVNIRXhfT0JHZXRDb25maWcoKQ0KLSAgdG86DQotICAgICAgICAoKyspIEdldCB0aGUgY29uZmlndXJhdGlvbiBvZiB3cml0ZSBwcm90ZWN0aW9uIGFyZWFzIChXUlApDQotICAgICAgICAoKyspIEdldCB0aGUgbGV2ZWwgb2YgcmVhZCBwcm90ZWN0aW9uIChSRFApDQotICAgICAgICAoKyspIEdldCB0aGUgdmFsdWUgb2YgdGhlIHVzZXIgT3B0aW9uIEJ5dGVzDQotICAgICAgICAoKyspIEdldCB0aGUgY29uZmlndXJhdGlvbiBvZiBQcm9wcmlldGFyeSBDb2RlIFJlYWRPdXQgUHJvdGVjdGlvbiBhcmVhcw0KLSAgKFBDUk9QKQ0KLSAgICAgICAgKCsrKSBHZXQgdGhlIGNvbmZpZ3VyYXRpb24gb2YgU2VjdXJhYmxlIG1lbW9yeSBhcmVhcw0KLSAgICAgICAgKCsrKSBHZXQgdGhlIHN0YXR1cyBvZiBCb290IExvY2sNCi0NCi0gICAgICAoIykgQWN0aXZhdGlvbiBvZiBTZWN1cmFibGUgbWVtb3J5IGFyZWE6IFVzZQ0KLSAgSEFMX0ZMQVNIRXhfRW5hYmxlU2VjTWVtUHJvdGVjdGlvbigpDQotICAgICAgICAoKyspIERlbnkgdGhlIGFjY2VzcyB0byBzZWN1cmFibGUgbWVtb3J5IGFyZWENCi0NCi0gICAgICAoIykgRW5hYmxlIG9yIGRpc2FibGUgZGVidWdnZXI6IFVzZSBIQUxfRkxBU0hFeF9FbmFibGVEZWJ1Z2dlcigpIG9yDQotICAgICAgICAgIEhBTF9GTEFTSEV4X0Rpc2FibGVEZWJ1Z2dlcigpDQotDQotICBAZW5kdmVyYmF0aW0NCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgKiBAYXR0ZW50aW9uDQotICAqDQotICAqIENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuDQotICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQotICAqDQotICAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGVybXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZQ0KLSAgaW4NCi0gICogdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc29mdHdhcmUgY29tcG9uZW50Lg0KLSAgKiBJZiBubyBMSUNFTlNFIGZpbGUgY29tZXMgd2l0aCB0aGlzIHNvZnR3YXJlLCBpdCBpcyBwcm92aWRlZCBBUy1JUy4NCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgKi8NCi0NCi0vKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpbmNsdWRlICJzdG0zMmc0eHhfaGFsLmgiDQotDQotLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzR4eF9IQUxfRHJpdmVyDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEZMQVNIRXggRkxBU0hFeA0KLSAqIEBicmllZiBGTEFTSCBFeHRlbmRlZCBIQUwgbW9kdWxlIGRyaXZlcg0KLSAqIEB7DQotICovDQotDQotI2lmZGVmIEhBTF9GTEFTSF9NT0RVTEVfRU5BQkxFRA0KLQ0KLS8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGRlZmdyb3VwIEZMQVNIRXhfUHJpdmF0ZV9GdW5jdGlvbnMgRkxBU0hFeCBQcml2YXRlIEZ1bmN0aW9ucw0KLSAqIEB7DQotICovDQotc3RhdGljIHZvaWQgRkxBU0hfTWFzc0VyYXNlKHVpbnQzMl90IEJhbmtzKTsNCi1zdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgRkxBU0hfT0JfV1JQQ29uZmlnKHVpbnQzMl90IFdSUEFyZWEsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBXUlBTdGFydE9mZnNldCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFdSRFBFbmRPZmZzZXQpOw0KLXN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBGTEFTSF9PQl9SRFBDb25maWcodWludDMyX3QgUkRQTGV2ZWwpOw0KLXN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBGTEFTSF9PQl9Vc2VyQ29uZmlnKHVpbnQzMl90IFVzZXJUeXBlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFVzZXJDb25maWcpOw0KLXN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBGTEFTSF9PQl9QQ1JPUENvbmZpZyh1aW50MzJfdCBQQ1JPUENvbmZpZywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUENST1BTdGFydEFkZHIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFBDUk9QRW5kQWRkcik7DQotc3RhdGljIHZvaWQgRkxBU0hfT0JfR2V0V1JQKHVpbnQzMl90IFdSUEFyZWEsIHVpbnQzMl90ICpXUlBTdGFydE9mZnNldCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKldSRFBFbmRPZmZzZXQpOw0KLXN0YXRpYyB1aW50MzJfdCBGTEFTSF9PQl9HZXRSRFAodm9pZCk7DQotc3RhdGljIHVpbnQzMl90IEZMQVNIX09CX0dldFVzZXIodm9pZCk7DQotc3RhdGljIHZvaWQgRkxBU0hfT0JfR2V0UENST1AodWludDMyX3QgKlBDUk9QQ29uZmlnLCB1aW50MzJfdCAqUENST1BTdGFydEFkZHIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKlBDUk9QRW5kQWRkcik7DQotc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIEZMQVNIX09CX1NlY01lbUNvbmZpZyh1aW50MzJfdCBTZWNNZW1CYW5rLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgU2VjTWVtU2l6ZSk7DQotc3RhdGljIHZvaWQgRkxBU0hfT0JfR2V0U2VjTWVtKHVpbnQzMl90IFNlY01lbUJhbmssIHVpbnQzMl90ICpTZWNNZW1TaXplKTsNCi1zdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgRkxBU0hfT0JfQm9vdExvY2tDb25maWcodWludDMyX3QgQm9vdExvY2tDb25maWcpOw0KLXN0YXRpYyB1aW50MzJfdCBGTEFTSF9PQl9HZXRCb290TG9jayh2b2lkKTsNCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGRlZmdyb3VwIEZMQVNIRXhfRXhwb3J0ZWRfRnVuY3Rpb25zIEZMQVNIRXggRXhwb3J0ZWQgRnVuY3Rpb25zDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEZMQVNIRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBFeHRlbmRlZCBJTyBvcGVyYXRpb24gZnVuY3Rpb25zDQotICAqIEBicmllZiAgIEV4dGVuZGVkIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMNCi0gICoNCi1AdmVyYmF0aW0NCi0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICAgICAgICAgICAgICAjIyMjIyBFeHRlbmRlZCBwcm9ncmFtbWluZyBvcGVyYXRpb24gZnVuY3Rpb25zICMjIyMjDQotID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgWy4uXQ0KLSAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIG1hbmFnZSB0aGUgRXh0ZW5kZWQNCi1GTEFTSCBwcm9ncmFtbWluZyBvcGVyYXRpb25zIE9wZXJhdGlvbnMuDQotDQotQGVuZHZlcmJhdGltDQotICAqIEB7DQotICAqLw0KLS8qKg0KLSAqIEBicmllZiAgUGVyZm9ybSBhIG1hc3MgZXJhc2Ugb3IgZXJhc2UgdGhlIHNwZWNpZmllZCBGTEFTSCBtZW1vcnkgcGFnZXMuDQotICogQHBhcmFtW2luXSAgcEVyYXNlSW5pdCBwb2ludGVyIHRvIGFuIEZMQVNIX0VyYXNlSW5pdFR5cGVEZWYgc3RydWN0dXJlIHRoYXQNCi0gKiAgICAgICAgIGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgZXJhc2luZy4NCi0gKiBAcGFyYW1bb3V0XSAgUGFnZUVycm9yIHBvaW50ZXIgdG8gdmFyaWFibGUgdGhhdCBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbg0KLSAqICAgICAgICAgaW5mb3JtYXRpb24gb24gZmF1bHR5IHBhZ2UgaW4gY2FzZSBvZiBlcnJvciAoMHhGRkZGRkZGRiBtZWFucyB0aGF0DQotICogYWxsIHRoZSBwYWdlcyBoYXZlIGJlZW4gY29ycmVjdGx5IGVyYXNlZCkuDQotICogQHJldHZhbCBIQUxfU3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIRXhfRXJhc2UoRkxBU0hfRXJhc2VJbml0VHlwZURlZiAqcEVyYXNlSW5pdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqUGFnZUVycm9yKSB7DQotICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXM7DQotICB1aW50MzJfdCBwYWdlX2luZGV4Ow0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19GTEFTSF9UWVBFRVJBU0UocEVyYXNlSW5pdC0+VHlwZUVyYXNlKSk7DQotDQotICAvKiBQcm9jZXNzIExvY2tlZCAqLw0KLSAgX19IQUxfTE9DSygmcEZsYXNoKTsNCi0NCi0gIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLw0KLSAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oKHVpbnQzMl90KUZMQVNIX1RJTUVPVVRfVkFMVUUpOw0KLQ0KLSAgaWYgKHN0YXR1cyA9PSBIQUxfT0spIHsNCi0gICAgcEZsYXNoLkVycm9yQ29kZSA9IEhBTF9GTEFTSF9FUlJPUl9OT05FOw0KLQ0KLSAgICAvKiBEZWFjdGl2YXRlIHRoZSBjYWNoZSBpZiB0aGV5IGFyZSBhY3RpdmF0ZWQgdG8gYXZvaWQgZGF0YSBtaXNiZWhhdmlvciAqLw0KLSAgICBpZiAoUkVBRF9CSVQoRkxBU0gtPkFDUiwgRkxBU0hfQUNSX0lDRU4pICE9IDBVKSB7DQotICAgICAgaWYgKFJFQURfQklUKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9EQ0VOKSAhPSAwVSkgew0KLSAgICAgICAgLyogRGlzYWJsZSBkYXRhIGNhY2hlICAqLw0KLSAgICAgICAgX19IQUxfRkxBU0hfREFUQV9DQUNIRV9ESVNBQkxFKCk7DQotICAgICAgICBwRmxhc2guQ2FjaGVUb1JlYWN0aXZhdGUgPSBGTEFTSF9DQUNIRV9JQ0FDSEVfRENBQ0hFX0VOQUJMRUQ7DQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgIHBGbGFzaC5DYWNoZVRvUmVhY3RpdmF0ZSA9IEZMQVNIX0NBQ0hFX0lDQUNIRV9FTkFCTEVEOw0KLSAgICAgIH0NCi0gICAgfSBlbHNlIGlmIChSRUFEX0JJVChGTEFTSC0+QUNSLCBGTEFTSF9BQ1JfRENFTikgIT0gMFUpIHsNCi0gICAgICAvKiBEaXNhYmxlIGRhdGEgY2FjaGUgICovDQotICAgICAgX19IQUxfRkxBU0hfREFUQV9DQUNIRV9ESVNBQkxFKCk7DQotICAgICAgcEZsYXNoLkNhY2hlVG9SZWFjdGl2YXRlID0gRkxBU0hfQ0FDSEVfRENBQ0hFX0VOQUJMRUQ7DQotICAgIH0gZWxzZSB7DQotICAgICAgcEZsYXNoLkNhY2hlVG9SZWFjdGl2YXRlID0gRkxBU0hfQ0FDSEVfRElTQUJMRUQ7DQotICAgIH0NCi0NCi0gICAgaWYgKHBFcmFzZUluaXQtPlR5cGVFcmFzZSA9PSBGTEFTSF9UWVBFRVJBU0VfTUFTU0VSQVNFKSB7DQotICAgICAgLyogTWFzcyBlcmFzZSB0byBiZSBkb25lICovDQotICAgICAgRkxBU0hfTWFzc0VyYXNlKHBFcmFzZUluaXQtPkJhbmtzKTsNCi0NCi0gICAgICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8NCi0gICAgICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbigodWludDMyX3QpRkxBU0hfVElNRU9VVF9WQUxVRSk7DQotDQotI2lmIGRlZmluZWQoRkxBU0hfT1BUUl9EQkFOSykNCi0gICAgICAvKiBJZiB0aGUgZXJhc2Ugb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCwgZGlzYWJsZSB0aGUgTUVSMSBhbmQgTUVSMiBCaXRzICovDQotICAgICAgQ0xFQVJfQklUKEZMQVNILT5DUiwgKEZMQVNIX0NSX01FUjEgfCBGTEFTSF9DUl9NRVIyKSk7DQotI2Vsc2UNCi0gICAgICAvKiBJZiB0aGUgZXJhc2Ugb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCwgZGlzYWJsZSB0aGUgTUVSMSBCaXQgKi8NCi0gICAgICBDTEVBUl9CSVQoRkxBU0gtPkNSLCAoRkxBU0hfQ1JfTUVSMSkpOw0KLSNlbmRpZg0KLSAgICB9IGVsc2Ugew0KLSAgICAgIC8qSW5pdGlhbGl6YXRpb24gb2YgUGFnZUVycm9yIHZhcmlhYmxlKi8NCi0gICAgICAqUGFnZUVycm9yID0gMHhGRkZGRkZGRlU7DQotDQotICAgICAgZm9yIChwYWdlX2luZGV4ID0gcEVyYXNlSW5pdC0+UGFnZTsNCi0gICAgICAgICAgIHBhZ2VfaW5kZXggPCAocEVyYXNlSW5pdC0+UGFnZSArIHBFcmFzZUluaXQtPk5iUGFnZXMpOw0KLSAgICAgICAgICAgcGFnZV9pbmRleCsrKSB7DQotICAgICAgICBGTEFTSF9QYWdlRXJhc2UocGFnZV9pbmRleCwgcEVyYXNlSW5pdC0+QmFua3MpOw0KLQ0KLSAgICAgICAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovDQotICAgICAgICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbigodWludDMyX3QpRkxBU0hfVElNRU9VVF9WQUxVRSk7DQotDQotICAgICAgICAvKiBJZiB0aGUgZXJhc2Ugb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCwgZGlzYWJsZSB0aGUgUEVSIEJpdCAqLw0KLSAgICAgICAgQ0xFQVJfQklUKEZMQVNILT5DUiwgKEZMQVNIX0NSX1BFUiB8IEZMQVNIX0NSX1BOQikpOw0KLQ0KLSAgICAgICAgaWYgKHN0YXR1cyAhPSBIQUxfT0spIHsNCi0gICAgICAgICAgLyogSW4gY2FzZSBvZiBlcnJvciwgc3RvcCBlcmFzZSBwcm9jZWR1cmUgYW5kIHJldHVybiB0aGUgZmF1bHR5IHBhZ2UNCi0gICAgICAgICAgICovDQotICAgICAgICAgICpQYWdlRXJyb3IgPSBwYWdlX2luZGV4Ow0KLSAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgICB9DQotICAgIH0NCi0NCi0gICAgLyogRmx1c2ggdGhlIGNhY2hlcyB0byBiZSBzdXJlIG9mIHRoZSBkYXRhIGNvbnNpc3RlbmN5ICovDQotICAgIEZMQVNIX0ZsdXNoQ2FjaGVzKCk7DQotICB9DQotDQotICAvKiBQcm9jZXNzIFVubG9ja2VkICovDQotICBfX0hBTF9VTkxPQ0soJnBGbGFzaCk7DQotDQotICByZXR1cm4gc3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFBlcmZvcm0gYSBtYXNzIGVyYXNlIG9yIGVyYXNlIHRoZSBzcGVjaWZpZWQgRkxBU0ggbWVtb3J5IHBhZ2VzIHdpdGgNCi0gKiBpbnRlcnJ1cHQgZW5hYmxlZC4NCi0gKiBAcGFyYW0gIHBFcmFzZUluaXQgcG9pbnRlciB0byBhbiBGTEFTSF9FcmFzZUluaXRUeXBlRGVmIHN0cnVjdHVyZSB0aGF0DQotICogICAgICAgICBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGVyYXNpbmcuDQotICogQHJldHZhbCBIQUxfU3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIRXhfRXJhc2VfSVQoRkxBU0hfRXJhc2VJbml0VHlwZURlZiAqcEVyYXNlSW5pdCkgew0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOw0KLQ0KLSAgLyogUHJvY2VzcyBMb2NrZWQgKi8NCi0gIF9fSEFMX0xPQ0soJnBGbGFzaCk7DQotDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZMQVNIX1RZUEVFUkFTRShwRXJhc2VJbml0LT5UeXBlRXJhc2UpKTsNCi0NCi0gIHBGbGFzaC5FcnJvckNvZGUgPSBIQUxfRkxBU0hfRVJST1JfTk9ORTsNCi0NCi0gIC8qIERlYWN0aXZhdGUgdGhlIGNhY2hlIGlmIHRoZXkgYXJlIGFjdGl2YXRlZCB0byBhdm9pZCBkYXRhIG1pc2JlaGF2aW9yICovDQotICBpZiAoUkVBRF9CSVQoRkxBU0gtPkFDUiwgRkxBU0hfQUNSX0lDRU4pICE9IDBVKSB7DQotICAgIGlmIChSRUFEX0JJVChGTEFTSC0+QUNSLCBGTEFTSF9BQ1JfRENFTikgIT0gMFUpIHsNCi0gICAgICAvKiBEaXNhYmxlIGRhdGEgY2FjaGUgICovDQotICAgICAgX19IQUxfRkxBU0hfREFUQV9DQUNIRV9ESVNBQkxFKCk7DQotICAgICAgcEZsYXNoLkNhY2hlVG9SZWFjdGl2YXRlID0gRkxBU0hfQ0FDSEVfSUNBQ0hFX0RDQUNIRV9FTkFCTEVEOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgIHBGbGFzaC5DYWNoZVRvUmVhY3RpdmF0ZSA9IEZMQVNIX0NBQ0hFX0lDQUNIRV9FTkFCTEVEOw0KLSAgICB9DQotICB9IGVsc2UgaWYgKFJFQURfQklUKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9EQ0VOKSAhPSAwVSkgew0KLSAgICAvKiBEaXNhYmxlIGRhdGEgY2FjaGUgICovDQotICAgIF9fSEFMX0ZMQVNIX0RBVEFfQ0FDSEVfRElTQUJMRSgpOw0KLSAgICBwRmxhc2guQ2FjaGVUb1JlYWN0aXZhdGUgPSBGTEFTSF9DQUNIRV9EQ0FDSEVfRU5BQkxFRDsNCi0gIH0gZWxzZSB7DQotICAgIHBGbGFzaC5DYWNoZVRvUmVhY3RpdmF0ZSA9IEZMQVNIX0NBQ0hFX0RJU0FCTEVEOw0KLSAgfQ0KLQ0KLSAgLyogRW5hYmxlIEVuZCBvZiBPcGVyYXRpb24gYW5kIEVycm9yIGludGVycnVwdHMgKi8NCi0gIF9fSEFMX0ZMQVNIX0VOQUJMRV9JVChGTEFTSF9JVF9FT1AgfCBGTEFTSF9JVF9PUEVSUik7DQotDQotICBwRmxhc2guQmFuayA9IHBFcmFzZUluaXQtPkJhbmtzOw0KLQ0KLSAgaWYgKHBFcmFzZUluaXQtPlR5cGVFcmFzZSA9PSBGTEFTSF9UWVBFRVJBU0VfTUFTU0VSQVNFKSB7DQotICAgIC8qIE1hc3MgZXJhc2UgdG8gYmUgZG9uZSAqLw0KLSAgICBwRmxhc2guUHJvY2VkdXJlT25Hb2luZyA9IEZMQVNIX1BST0NfTUFTU19FUkFTRTsNCi0gICAgRkxBU0hfTWFzc0VyYXNlKHBFcmFzZUluaXQtPkJhbmtzKTsNCi0gIH0gZWxzZSB7DQotICAgIC8qIEVyYXNlIGJ5IHBhZ2UgdG8gYmUgZG9uZSAqLw0KLSAgICBwRmxhc2guUHJvY2VkdXJlT25Hb2luZyA9IEZMQVNIX1BST0NfUEFHRV9FUkFTRTsNCi0gICAgcEZsYXNoLk5iUGFnZXNUb0VyYXNlID0gcEVyYXNlSW5pdC0+TmJQYWdlczsNCi0gICAgcEZsYXNoLlBhZ2UgPSBwRXJhc2VJbml0LT5QYWdlOw0KLQ0KLSAgICAvKkVyYXNlIDFzdCBwYWdlIGFuZCB3YWl0IGZvciBJVCAqLw0KLSAgICBGTEFTSF9QYWdlRXJhc2UocEVyYXNlSW5pdC0+UGFnZSwgcEVyYXNlSW5pdC0+QmFua3MpOw0KLSAgfQ0KLQ0KLSAgcmV0dXJuIHN0YXR1czsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBQcm9ncmFtIE9wdGlvbiBieXRlcy4NCi0gKiBAcGFyYW0gIHBPQkluaXQgcG9pbnRlciB0byBhbiBGTEFTSF9PQkluaXRTdHJ1Y3Qgc3RydWN0dXJlIHRoYXQNCi0gKiAgICAgICAgIGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgcHJvZ3JhbW1pbmcuDQotICogQG5vdGUgICBUbyBjb25maWd1cmUgYW55IG9wdGlvbiBieXRlcywgdGhlIG9wdGlvbiBsb2NrIGJpdCBPUFRMT0NLIG11c3QgYmUNCi0gKiAgICAgICAgIGNsZWFyZWQgd2l0aCB0aGUgY2FsbCBvZiBIQUxfRkxBU0hfT0JfVW5sb2NrKCkgZnVuY3Rpb24uDQotICogQG5vdGUgICBOZXcgb3B0aW9uIGJ5dGVzIGNvbmZpZ3VyYXRpb24gd2lsbCBiZSB0YWtlbiBpbnRvIGFjY291bnQgaW4gdHdvDQotICogY2FzZXM6DQotICogICAgICAgICAtIGFmdGVyIGFuIG9wdGlvbiBieXRlcyBsYXVuY2ggdGhyb3VnaCB0aGUgY2FsbCBvZg0KLSAqIEhBTF9GTEFTSF9PQl9MYXVuY2goKQ0KLSAqICAgICAgICAgLSBhZnRlciBhIHBvd2VyIHJlc2V0IChCT1IgcmVzZXQgb3IgZXhpdCBmcm9tIFN0YW5kYnkvU2h1dGRvd24gbW9kZXMpDQotICogQHJldHZhbCBIQUxfU3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIRXhfT0JQcm9ncmFtKEZMQVNIX09CUHJvZ3JhbUluaXRUeXBlRGVmICpwT0JJbml0KSB7DQotICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7DQotDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX09QVElPTkJZVEUocE9CSW5pdC0+T3B0aW9uVHlwZSkpOw0KLQ0KLSAgLyogUHJvY2VzcyBMb2NrZWQgKi8NCi0gIF9fSEFMX0xPQ0soJnBGbGFzaCk7DQotDQotICBwRmxhc2guRXJyb3JDb2RlID0gSEFMX0ZMQVNIX0VSUk9SX05PTkU7DQotDQotICAvKiBXcml0ZSBwcm90ZWN0aW9uIGNvbmZpZ3VyYXRpb24gKi8NCi0gIGlmICgocE9CSW5pdC0+T3B0aW9uVHlwZSAmIE9QVElPTkJZVEVfV1JQKSAhPSAwVSkgew0KLSAgICAvKiBDb25maWd1cmUgb2YgV3JpdGUgcHJvdGVjdGlvbiBvbiB0aGUgc2VsZWN0ZWQgYXJlYSAqLw0KLSAgICBpZiAoRkxBU0hfT0JfV1JQQ29uZmlnKHBPQkluaXQtPldSUEFyZWEsIHBPQkluaXQtPldSUFN0YXJ0T2Zmc2V0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPQkluaXQtPldSUEVuZE9mZnNldCkgIT0gSEFMX09LKSB7DQotICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOw0KLSAgICB9DQotICB9DQotDQotICAvKiBSZWFkIHByb3RlY3Rpb24gY29uZmlndXJhdGlvbiAqLw0KLSAgaWYgKChwT0JJbml0LT5PcHRpb25UeXBlICYgT1BUSU9OQllURV9SRFApICE9IDBVKSB7DQotICAgIC8qIENvbmZpZ3VyZSB0aGUgUmVhZCBwcm90ZWN0aW9uIGxldmVsICovDQotICAgIGlmIChGTEFTSF9PQl9SRFBDb25maWcocE9CSW5pdC0+UkRQTGV2ZWwpICE9IEhBTF9PSykgew0KLSAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgLyogVXNlciBDb25maWd1cmF0aW9uICovDQotICBpZiAoKHBPQkluaXQtPk9wdGlvblR5cGUgJiBPUFRJT05CWVRFX1VTRVIpICE9IDBVKSB7DQotICAgIC8qIENvbmZpZ3VyZSB0aGUgdXNlciBvcHRpb24gYnl0ZXMgKi8NCi0gICAgaWYgKEZMQVNIX09CX1VzZXJDb25maWcocE9CSW5pdC0+VVNFUlR5cGUsIHBPQkluaXQtPlVTRVJDb25maWcpICE9IEhBTF9PSykgew0KLSAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgLyogUENST1AgQ29uZmlndXJhdGlvbiAqLw0KLSAgaWYgKChwT0JJbml0LT5PcHRpb25UeXBlICYgT1BUSU9OQllURV9QQ1JPUCkgIT0gMFUpIHsNCi0gICAgaWYgKHBPQkluaXQtPlBDUk9QU3RhcnRBZGRyICE9IHBPQkluaXQtPlBDUk9QRW5kQWRkcikgew0KLSAgICAgIC8qIENvbmZpZ3VyZSB0aGUgUHJvcHJpZXRhcnkgY29kZSByZWFkb3V0IHByb3RlY3Rpb24gKi8NCi0gICAgICBpZiAoRkxBU0hfT0JfUENST1BDb25maWcocE9CSW5pdC0+UENST1BDb25maWcsIHBPQkluaXQtPlBDUk9QU3RhcnRBZGRyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT0JJbml0LT5QQ1JPUEVuZEFkZHIpICE9IEhBTF9PSykgew0KLSAgICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgLyogU2VjdXJhYmxlIG1lbW9yeSBDb25maWd1cmF0aW9uICovDQotICBpZiAoKHBPQkluaXQtPk9wdGlvblR5cGUgJiBPUFRJT05CWVRFX1NFQykgIT0gMFUpIHsNCi0gICAgLyogQ29uZmlndXJlIHRoZSBzZWN1cmFibGUgbWVtb3J5IGFyZWEgKi8NCi0gICAgaWYgKEZMQVNIX09CX1NlY01lbUNvbmZpZyhwT0JJbml0LT5TZWNCYW5rLCBwT0JJbml0LT5TZWNTaXplKSAhPSBIQUxfT0spIHsNCi0gICAgICBzdGF0dXMgPSBIQUxfRVJST1I7DQotICAgIH0NCi0gIH0NCi0NCi0gIC8qIEJvb3QgRW50cnkgUG9pbnQgQ29uZmlndXJhdGlvbiAqLw0KLSAgaWYgKChwT0JJbml0LT5PcHRpb25UeXBlICYgT1BUSU9OQllURV9CT09UX0xPQ0spICE9IDBVKSB7DQotICAgIC8qIENvbmZpZ3VyZSB0aGUgYm9vdCB1bmlxdWUgZW50cnkgcG9pbnQgb3B0aW9uICovDQotICAgIGlmIChGTEFTSF9PQl9Cb290TG9ja0NvbmZpZyhwT0JJbml0LT5Cb290RW50cnlQb2ludCkgIT0gSEFMX09LKSB7DQotICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOw0KLSAgICB9DQotICB9DQotDQotICAvKiBQcm9jZXNzIFVubG9ja2VkICovDQotICBfX0hBTF9VTkxPQ0soJnBGbGFzaCk7DQotDQotICByZXR1cm4gc3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCB0aGUgT3B0aW9uIGJ5dGVzIGNvbmZpZ3VyYXRpb24uDQotICogQHBhcmFtICBwT0JJbml0IHBvaW50ZXIgdG8gYW4gRkxBU0hfT0JJbml0U3RydWN0IHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoZQ0KLSAqICAgICAgICAgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4NCi0gKiBAbm90ZSAgIFRoZSBmaWVsZHMgcE9CSW5pdC0+V1JQQXJlYSBhbmQgcE9CSW5pdC0+UENST1BDb25maWcgc2hvdWxkIGluZGljYXRlDQotICogICAgICAgICB3aGljaCBhcmVhIGlzIHJlcXVlc3RlZCBmb3IgdGhlIFdSUCBhbmQgUENST1AsIGVsc2Ugbm8gaW5mb3JtYXRpb24NCi0gKiB3aWxsIGJlIHJldHVybmVkLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXZvaWQgSEFMX0ZMQVNIRXhfT0JHZXRDb25maWcoRkxBU0hfT0JQcm9ncmFtSW5pdFR5cGVEZWYgKnBPQkluaXQpIHsNCi0gIHBPQkluaXQtPk9wdGlvblR5cGUgPSAoT1BUSU9OQllURV9SRFAgfCBPUFRJT05CWVRFX1VTRVIpOw0KLQ0KLSNpZiBkZWZpbmVkKEZMQVNIX09QVFJfREJBTkspDQotICBpZiAoKHBPQkluaXQtPldSUEFyZWEgPT0gT0JfV1JQQVJFQV9CQU5LMV9BUkVBQSkgfHwNCi0gICAgICAocE9CSW5pdC0+V1JQQXJlYSA9PSBPQl9XUlBBUkVBX0JBTksxX0FSRUFCKSB8fA0KLSAgICAgIChwT0JJbml0LT5XUlBBcmVhID09IE9CX1dSUEFSRUFfQkFOSzJfQVJFQUEpIHx8DQotICAgICAgKHBPQkluaXQtPldSUEFyZWEgPT0gT0JfV1JQQVJFQV9CQU5LMl9BUkVBQikpDQotI2Vsc2UNCi0gIGlmICgocE9CSW5pdC0+V1JQQXJlYSA9PSBPQl9XUlBBUkVBX0JBTksxX0FSRUFBKSB8fA0KLSAgICAgIChwT0JJbml0LT5XUlBBcmVhID09IE9CX1dSUEFSRUFfQkFOSzFfQVJFQUIpKQ0KLSNlbmRpZg0KLSAgew0KLSAgICBwT0JJbml0LT5PcHRpb25UeXBlIHw9IE9QVElPTkJZVEVfV1JQOw0KLSAgICAvKiBHZXQgd3JpdGUgcHJvdGVjdGlvbiBvbiB0aGUgc2VsZWN0ZWQgYXJlYSAqLw0KLSAgICBGTEFTSF9PQl9HZXRXUlAocE9CSW5pdC0+V1JQQXJlYSwgJihwT0JJbml0LT5XUlBTdGFydE9mZnNldCksDQotICAgICAgICAgICAgICAgICAgICAmKHBPQkluaXQtPldSUEVuZE9mZnNldCkpOw0KLSAgfQ0KLQ0KLSAgLyogR2V0IFJlYWQgcHJvdGVjdGlvbiBsZXZlbCAqLw0KLSAgcE9CSW5pdC0+UkRQTGV2ZWwgPSBGTEFTSF9PQl9HZXRSRFAoKTsNCi0NCi0gIC8qIEdldCB0aGUgdXNlciBvcHRpb24gYnl0ZXMgKi8NCi0gIHBPQkluaXQtPlVTRVJDb25maWcgPSBGTEFTSF9PQl9HZXRVc2VyKCk7DQotDQotI2lmIGRlZmluZWQoRkxBU0hfT1BUUl9EQkFOSykNCi0gIGlmICgocE9CSW5pdC0+UENST1BDb25maWcgPT0gRkxBU0hfQkFOS18xKSB8fA0KLSAgICAgIChwT0JJbml0LT5QQ1JPUENvbmZpZyA9PSBGTEFTSF9CQU5LXzIpKQ0KLSNlbHNlDQotICBpZiAocE9CSW5pdC0+UENST1BDb25maWcgPT0gRkxBU0hfQkFOS18xKQ0KLSNlbmRpZg0KLSAgew0KLSAgICBwT0JJbml0LT5PcHRpb25UeXBlIHw9IE9QVElPTkJZVEVfUENST1A7DQotICAgIC8qIEdldCB0aGUgUHJvcHJpZXRhcnkgY29kZSByZWFkb3V0IHByb3RlY3Rpb24gKi8NCi0gICAgRkxBU0hfT0JfR2V0UENST1AoJihwT0JJbml0LT5QQ1JPUENvbmZpZyksICYocE9CSW5pdC0+UENST1BTdGFydEFkZHIpLA0KLSAgICAgICAgICAgICAgICAgICAgICAmKHBPQkluaXQtPlBDUk9QRW5kQWRkcikpOw0KLSAgfQ0KLQ0KLSAgcE9CSW5pdC0+T3B0aW9uVHlwZSB8PSBPUFRJT05CWVRFX0JPT1RfTE9DSzsNCi0NCi0gIC8qIEdldCB0aGUgYm9vdCBlbnRyeSBwb2ludCAqLw0KLSAgcE9CSW5pdC0+Qm9vdEVudHJ5UG9pbnQgPSBGTEFTSF9PQl9HZXRCb290TG9jaygpOw0KLQ0KLSAgLyogR2V0IHRoZSBzZWN1cmFibGUgbWVtb3J5IGFyZWEgY29uZmlndXJhdGlvbiAqLw0KLSNpZiBkZWZpbmVkKEZMQVNIX09QVFJfREJBTkspDQotICBpZiAoKHBPQkluaXQtPlNlY0JhbmsgPT0gRkxBU0hfQkFOS18xKSB8fCAocE9CSW5pdC0+U2VjQmFuayA9PSBGTEFTSF9CQU5LXzIpKQ0KLSNlbHNlDQotICBpZiAocE9CSW5pdC0+U2VjQmFuayA9PSBGTEFTSF9CQU5LXzEpDQotI2VuZGlmDQotICB7DQotICAgIHBPQkluaXQtPk9wdGlvblR5cGUgfD0gT1BUSU9OQllURV9TRUM7DQotICAgIEZMQVNIX09CX0dldFNlY01lbShwT0JJbml0LT5TZWNCYW5rLCAmKHBPQkluaXQtPlNlY1NpemUpKTsNCi0gIH0NCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgdGhlIEZMQVNIIFNlY3VyYWJsZSBNZW1vcnkgcHJvdGVjdGlvbi4NCi0gKiBAcGFyYW0gIEJhbms6IEJhbmsgdG8gYmUgcHJvdGVjdGVkDQotICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgRkxBU0hfQkFOS18xOiBCYW5rMSB0byBiZSBwcm90ZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgRkxBU0hfQkFOS18yOiBCYW5rMiB0byBiZSBwcm90ZWN0ZWQgKCopDQotICogICAgICAgICAgICBAYXJnIEZMQVNIX0JBTktfQk9USDogQmFuazEgYW5kIEJhbmsyIHRvIGJlIHByb3RlY3RlZCAoKikNCi0gKiBAbm90ZSAgICgqKSBhdmFpbGFiaWxpdHkgZGVwZW5kcyBvbiBkZXZpY2VzDQotICogQHJldHZhbCBIQUwgU3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIRXhfRW5hYmxlU2VjTWVtUHJvdGVjdGlvbih1aW50MzJfdCBCYW5rKSB7DQotI2lmIGRlZmluZWQoRkxBU0hfT1BUUl9EQkFOSykNCi0gIGlmIChSRUFEX0JJVChGTEFTSC0+T1BUUiwgRkxBU0hfT1BUUl9EQkFOSykgIT0gMFUpIHsNCi0gICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gICAgYXNzZXJ0X3BhcmFtKElTX0ZMQVNIX0JBTksoQmFuaykpOw0KLQ0KLSAgICAvKiBFbmFibGUgdGhlIFNlY3VyYWJsZSBNZW1vcnkgUHJvdGVjdGlvbiBCaXQgZm9yIHRoZSBiYW5rIDEgaWYgcmVxdWVzdGVkICovDQotICAgIGlmICgoQmFuayAmIEZMQVNIX0JBTktfMSkgIT0gMFUpIHsNCi0gICAgICBTRVRfQklUKEZMQVNILT5DUiwgRkxBU0hfQ1JfU0VDX1BST1QxKTsNCi0gICAgfQ0KLQ0KLSAgICAvKiBFbmFibGUgdGhlIFNlY3VyYWJsZSBNZW1vcnkgUHJvdGVjdGlvbiBCaXQgZm9yIHRoZSBiYW5rIDIgaWYgcmVxdWVzdGVkICovDQotICAgIGlmICgoQmFuayAmIEZMQVNIX0JBTktfMikgIT0gMFUpIHsNCi0gICAgICBTRVRfQklUKEZMQVNILT5DUiwgRkxBU0hfQ1JfU0VDX1BST1QyKTsNCi0gICAgfQ0KLSAgfSBlbHNlDQotI2VuZGlmDQotICB7DQotICAgIFNFVF9CSVQoRkxBU0gtPkNSLCBGTEFTSF9DUl9TRUNfUFJPVDEpOw0KLSAgfQ0KLQ0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgRGVidWdnZXIuDQotICogQG5vdGUgICBBZnRlciBjYWxsaW5nIHRoaXMgQVBJLCBmbGFzaCBpbnRlcmZhY2UgYWxsb3cgZGVidWdnZXIgaW50cnVzaW9uLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXZvaWQgSEFMX0ZMQVNIRXhfRW5hYmxlRGVidWdnZXIodm9pZCkgeyBGTEFTSC0+QUNSIHw9IEZMQVNIX0FDUl9EQkdfU1dFTjsgfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBEZWJ1Z2dlci4NCi0gKiBAbm90ZSAgIEFmdGVyIGNhbGxpbmcgdGhpcyBBUEksIERlYnVnZ2VyIGlzIGRpc2FibGVkOiBpdCdzIG5vIG1vcmUgcG9zc2libGUNCi0gKiB0byBicmVhaywgc2VlIENQVSByZWdpc3RlciwgZXRjLi4uDQotICogQHJldHZhbCBOb25lDQotICovDQotdm9pZCBIQUxfRkxBU0hFeF9EaXNhYmxlRGVidWdnZXIodm9pZCkgeyBGTEFTSC0+QUNSICY9IH5GTEFTSF9BQ1JfREJHX1NXRU47IH0NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0NCi0vKiogQGFkZHRvZ3JvdXAgRkxBU0hFeF9Qcml2YXRlX0Z1bmN0aW9ucw0KLSAqIEB7DQotICovDQotLyoqDQotICogQGJyaWVmICBNYXNzIGVyYXNlIG9mIEZMQVNIIG1lbW9yeS4NCi0gKiBAcGFyYW0gIEJhbmtzIEJhbmtzIHRvIGJlIGVyYXNlZC4NCi0gKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIEZMQVNIX0JBTktfMTogQmFuazEgdG8gYmUgZXJhc2VkDQotICogICAgICAgICAgICBAYXJnIEZMQVNIX0JBTktfMjogQmFuazIgdG8gYmUgZXJhc2VkICgqKQ0KLSAqICAgICAgICAgICAgQGFyZyBGTEFTSF9CQU5LX0JPVEg6IEJhbmsxIGFuZCBCYW5rMiB0byBiZSBlcmFzZWQgKCopDQotICogQG5vdGUgICAoKikgYXZhaWxhYmlsaXR5IGRlcGVuZHMgb24gZGV2aWNlcw0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXN0YXRpYyB2b2lkIEZMQVNIX01hc3NFcmFzZSh1aW50MzJfdCBCYW5rcykgew0KLSNpZiBkZWZpbmVkKEZMQVNIX09QVFJfREJBTkspDQotICBpZiAoUkVBRF9CSVQoRkxBU0gtPk9QVFIsIEZMQVNIX09QVFJfREJBTkspICE9IDBVKQ0KLSNlbmRpZg0KLSAgew0KLSAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgICBhc3NlcnRfcGFyYW0oSVNfRkxBU0hfQkFOSyhCYW5rcykpOw0KLQ0KLSAgICAvKiBTZXQgdGhlIE1hc3MgRXJhc2UgQml0IGZvciB0aGUgYmFuayAxIGlmIHJlcXVlc3RlZCAqLw0KLSAgICBpZiAoKEJhbmtzICYgRkxBU0hfQkFOS18xKSAhPSAwVSkgew0KLSAgICAgIFNFVF9CSVQoRkxBU0gtPkNSLCBGTEFTSF9DUl9NRVIxKTsNCi0gICAgfQ0KLQ0KLSNpZiBkZWZpbmVkKEZMQVNIX09QVFJfREJBTkspDQotICAgIC8qIFNldCB0aGUgTWFzcyBFcmFzZSBCaXQgZm9yIHRoZSBiYW5rIDIgaWYgcmVxdWVzdGVkICovDQotICAgIGlmICgoQmFua3MgJiBGTEFTSF9CQU5LXzIpICE9IDBVKSB7DQotICAgICAgU0VUX0JJVChGTEFTSC0+Q1IsIEZMQVNIX0NSX01FUjIpOw0KLSAgICB9DQotI2VuZGlmDQotICB9DQotI2lmIGRlZmluZWQoRkxBU0hfT1BUUl9EQkFOSykNCi0gIGVsc2Ugew0KLSAgICBTRVRfQklUKEZMQVNILT5DUiwgKEZMQVNIX0NSX01FUjEgfCBGTEFTSF9DUl9NRVIyKSk7DQotICB9DQotI2VuZGlmDQotDQotICAvKiBQcm9jZWVkIHRvIGVyYXNlIGFsbCBzZWN0b3JzICovDQotICBTRVRfQklUKEZMQVNILT5DUiwgRkxBU0hfQ1JfU1RSVCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRXJhc2UgdGhlIHNwZWNpZmllZCBGTEFTSCBtZW1vcnkgcGFnZS4NCi0gKiBAcGFyYW0gIFBhZ2UgRkxBU0ggcGFnZSB0byBlcmFzZS4NCi0gKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIChtYXggbnVtYmVyIG9mIHBhZ2VzIGluDQotICogdGhlIGJhbmsgLSAxKS4NCi0gKiBAcGFyYW0gIEJhbmtzIEJhbmsgd2hlcmUgdGhlIHBhZ2Ugd2lsbCBiZSBlcmFzZWQuDQotICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBGTEFTSF9CQU5LXzE6IFBhZ2UgaW4gYmFuayAxIHRvIGJlIGVyYXNlZA0KLSAqICAgICAgICAgICAgQGFyZyBGTEFTSF9CQU5LXzI6IFBhZ2UgaW4gYmFuayAyIHRvIGJlIGVyYXNlZCAoKikNCi0gKiBAbm90ZSAgICgqKSBhdmFpbGFiaWxpdHkgZGVwZW5kcyBvbiBkZXZpY2VzDQotICogQHJldHZhbCBOb25lDQotICovDQotdm9pZCBGTEFTSF9QYWdlRXJhc2UodWludDMyX3QgUGFnZSwgdWludDMyX3QgQmFua3MpIHsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfRkxBU0hfUEFHRShQYWdlKSk7DQotDQotI2lmIGRlZmluZWQoRkxBU0hfT1BUUl9EQkFOSykNCi0gIGlmIChSRUFEX0JJVChGTEFTSC0+T1BUUiwgRkxBU0hfT1BUUl9EQkFOSykgPT0gMFUpIHsNCi0gICAgQ0xFQVJfQklUKEZMQVNILT5DUiwgRkxBU0hfQ1JfQktFUik7DQotICB9IGVsc2Ugew0KLSAgICBhc3NlcnRfcGFyYW0oSVNfRkxBU0hfQkFOS19FWENMVVNJVkUoQmFua3MpKTsNCi0NCi0gICAgaWYgKChCYW5rcyAmIEZMQVNIX0JBTktfMSkgIT0gMFUpIHsNCi0gICAgICBDTEVBUl9CSVQoRkxBU0gtPkNSLCBGTEFTSF9DUl9CS0VSKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICBTRVRfQklUKEZMQVNILT5DUiwgRkxBU0hfQ1JfQktFUik7DQotICAgIH0NCi0gIH0NCi0jZW5kaWYNCi0NCi0gIC8qIFByb2NlZWQgdG8gZXJhc2UgdGhlIHBhZ2UgKi8NCi0gIE1PRElGWV9SRUcoRkxBU0gtPkNSLCBGTEFTSF9DUl9QTkIsICgoUGFnZSAmIDB4RkZVKSA8PCBGTEFTSF9DUl9QTkJfUG9zKSk7DQotICBTRVRfQklUKEZMQVNILT5DUiwgRkxBU0hfQ1JfUEVSKTsNCi0gIFNFVF9CSVQoRkxBU0gtPkNSLCBGTEFTSF9DUl9TVFJUKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBGbHVzaCB0aGUgaW5zdHJ1Y3Rpb24gYW5kIGRhdGEgY2FjaGVzLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXZvaWQgRkxBU0hfRmx1c2hDYWNoZXModm9pZCkgew0KLSAgRkxBU0hfQ2FjaGVUeXBlRGVmIGNhY2hlID0gcEZsYXNoLkNhY2hlVG9SZWFjdGl2YXRlOw0KLQ0KLSAgLyogRmx1c2ggaW5zdHJ1Y3Rpb24gY2FjaGUgICovDQotICBpZiAoKGNhY2hlID09IEZMQVNIX0NBQ0hFX0lDQUNIRV9FTkFCTEVEKSB8fA0KLSAgICAgIChjYWNoZSA9PSBGTEFTSF9DQUNIRV9JQ0FDSEVfRENBQ0hFX0VOQUJMRUQpKSB7DQotICAgIC8qIERpc2FibGUgaW5zdHJ1Y3Rpb24gY2FjaGUgKi8NCi0gICAgX19IQUxfRkxBU0hfSU5TVFJVQ1RJT05fQ0FDSEVfRElTQUJMRSgpOw0KLSAgICAvKiBSZXNldCBpbnN0cnVjdGlvbiBjYWNoZSAqLw0KLSAgICBfX0hBTF9GTEFTSF9JTlNUUlVDVElPTl9DQUNIRV9SRVNFVCgpOw0KLSAgICAvKiBFbmFibGUgaW5zdHJ1Y3Rpb24gY2FjaGUgKi8NCi0gICAgX19IQUxfRkxBU0hfSU5TVFJVQ1RJT05fQ0FDSEVfRU5BQkxFKCk7DQotICB9DQotDQotICAvKiBGbHVzaCBkYXRhIGNhY2hlICovDQotICBpZiAoKGNhY2hlID09IEZMQVNIX0NBQ0hFX0RDQUNIRV9FTkFCTEVEKSB8fA0KLSAgICAgIChjYWNoZSA9PSBGTEFTSF9DQUNIRV9JQ0FDSEVfRENBQ0hFX0VOQUJMRUQpKSB7DQotICAgIC8qIFJlc2V0IGRhdGEgY2FjaGUgKi8NCi0gICAgX19IQUxfRkxBU0hfREFUQV9DQUNIRV9SRVNFVCgpOw0KLSAgICAvKiBFbmFibGUgZGF0YSBjYWNoZSAqLw0KLSAgICBfX0hBTF9GTEFTSF9EQVRBX0NBQ0hFX0VOQUJMRSgpOw0KLSAgfQ0KLQ0KLSAgLyogUmVzZXQgaW50ZXJuYWwgdmFyaWFibGUgKi8NCi0gIHBGbGFzaC5DYWNoZVRvUmVhY3RpdmF0ZSA9IEZMQVNIX0NBQ0hFX0RJU0FCTEVEOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBhcmVhIGludG8gT3B0aW9uIEJ5dGVzLg0KLSAqIEBub3RlICAgV2hlbiB0aGUgbWVtb3J5IHJlYWQgcHJvdGVjdGlvbiBsZXZlbCBpcyBzZWxlY3RlZCAoUkRQIGxldmVsID0gMSksDQotICogICAgICAgICBpdCBpcyBub3QgcG9zc2libGUgdG8gcHJvZ3JhbSBvciBlcmFzZSBGbGFzaCBtZW1vcnkgaWYgdGhlIENQVSBkZWJ1Zw0KLSAqICAgICAgICAgZmVhdHVyZXMgYXJlIGNvbm5lY3RlZCAoSlRBRyBvciBzaW5nbGUgd2lyZSkgb3IgYm9vdCBjb2RlIGlzIGJlaW5nDQotICogICAgICAgICBleGVjdXRlZCBmcm9tIFJBTSBvciBTeXN0ZW0gZmxhc2gsIGV2ZW4gaWYgV1JQIGlzIG5vdCBhY3RpdmF0ZWQuDQotICogQG5vdGUgICBUbyBjb25maWd1cmUgYW55IG9wdGlvbiBieXRlcywgdGhlIG9wdGlvbiBsb2NrIGJpdCBPUFRMT0NLIG11c3QgYmUNCi0gKiAgICAgICAgIGNsZWFyZWQgd2l0aCB0aGUgY2FsbCBvZiBIQUxfRkxBU0hfT0JfVW5sb2NrKCkgZnVuY3Rpb24uDQotICogQG5vdGUgICBOZXcgb3B0aW9uIGJ5dGVzIGNvbmZpZ3VyYXRpb24gd2lsbCBiZSB0YWtlbiBpbnRvIGFjY291bnQgaW4gdHdvDQotICogY2FzZXM6DQotICogICAgICAgICAtIGFmdGVyIGFuIG9wdGlvbiBieXRlcyBsYXVuY2ggdGhyb3VnaCB0aGUgY2FsbCBvZg0KLSAqIEhBTF9GTEFTSF9PQl9MYXVuY2goKQ0KLSAqICAgICAgICAgLSBhZnRlciBhIHBvd2VyIHJlc2V0IChCT1IgcmVzZXQgb3IgZXhpdCBmcm9tIFN0YW5kYnkvU2h1dGRvd24gbW9kZXMpDQotICogQHBhcmFtICBXUlBBcmVhIHNwZWNpZmllcyB0aGUgYXJlYSB0byBiZSBjb25maWd1cmVkLg0KLSAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgT0JfV1JQQVJFQV9CQU5LMV9BUkVBQTogRmxhc2ggQmFuayAxIEFyZWEgQQ0KLSAqICAgICAgICAgICAgQGFyZyBPQl9XUlBBUkVBX0JBTksxX0FSRUFCOiBGbGFzaCBCYW5rIDEgQXJlYSBCDQotICogICAgICAgICAgICBAYXJnIE9CX1dSUEFSRUFfQkFOSzJfQVJFQUE6IEZsYXNoIEJhbmsgMiBBcmVhIEEgKCopDQotICogICAgICAgICAgICBAYXJnIE9CX1dSUEFSRUFfQkFOSzJfQVJFQUI6IEZsYXNoIEJhbmsgMiBBcmVhIEIgKCopDQotICogQG5vdGUgICAoKikgYXZhaWxhYmlsaXR5IGRlcGVuZHMgb24gZGV2aWNlcw0KLSAqIEBwYXJhbSAgV1JQU3RhcnRPZmZzZXQgc3BlY2lmaWVzIHRoZSBzdGFydCBwYWdlIG9mIHRoZSB3cml0ZSBwcm90ZWN0ZWQgYXJlYS4NCi0gKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBwYWdlIG51bWJlciBiZXR3ZWVuIDAgYW5kIChtYXggbnVtYmVyIG9mIHBhZ2VzDQotICogaW4gdGhlIGJhbmsgLSAxKS4NCi0gKiBAcGFyYW0gIFdSRFBFbmRPZmZzZXQgc3BlY2lmaWVzIHRoZSBlbmQgcGFnZSBvZiB0aGUgd3JpdGUgcHJvdGVjdGVkIGFyZWEuDQotICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgcGFnZSBudW1iZXIgYmV0d2VlbiBXUlBTdGFydE9mZnNldCBhbmQgKG1heA0KLSAqIG51bWJlciBvZiBwYWdlcyBpbiB0aGUgYmFuayAtIDEpLg0KLSAqIEByZXR2YWwgSEFMX1N0YXR1cw0KLSAqLw0KLXN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBGTEFTSF9PQl9XUlBDb25maWcodWludDMyX3QgV1JQQXJlYSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFdSUFN0YXJ0T2Zmc2V0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgV1JEUEVuZE9mZnNldCkgew0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19PQl9XUlBBUkVBKFdSUEFyZWEpKTsNCi0gIGFzc2VydF9wYXJhbShJU19GTEFTSF9QQUdFKFdSUFN0YXJ0T2Zmc2V0KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfRkxBU0hfUEFHRShXUkRQRW5kT2Zmc2V0KSk7DQotDQotICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8NCi0gIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKCh1aW50MzJfdClGTEFTSF9USU1FT1VUX1ZBTFVFKTsNCi0NCi0gIGlmIChzdGF0dXMgPT0gSEFMX09LKSB7DQotICAgIC8qIENvbmZpZ3VyZSB0aGUgd3JpdGUgcHJvdGVjdGVkIGFyZWEgKi8NCi0gICAgaWYgKFdSUEFyZWEgPT0gT0JfV1JQQVJFQV9CQU5LMV9BUkVBQSkgew0KLSAgICAgIEZMQVNILT5XUlAxQVIgPQ0KLSAgICAgICAgICAoKFdSRFBFbmRPZmZzZXQgPDwgRkxBU0hfV1JQMUFSX1dSUDFBX0VORF9Qb3MpIHwgV1JQU3RhcnRPZmZzZXQpOw0KLSAgICB9IGVsc2UgaWYgKFdSUEFyZWEgPT0gT0JfV1JQQVJFQV9CQU5LMV9BUkVBQikgew0KLSAgICAgIEZMQVNILT5XUlAxQlIgPQ0KLSAgICAgICAgICAoKFdSRFBFbmRPZmZzZXQgPDwgRkxBU0hfV1JQMUJSX1dSUDFCX0VORF9Qb3MpIHwgV1JQU3RhcnRPZmZzZXQpOw0KLSAgICB9DQotI2lmIGRlZmluZWQoRkxBU0hfT1BUUl9EQkFOSykNCi0gICAgZWxzZSBpZiAoV1JQQXJlYSA9PSBPQl9XUlBBUkVBX0JBTksyX0FSRUFBKSB7DQotICAgICAgRkxBU0gtPldSUDJBUiA9DQotICAgICAgICAgICgoV1JEUEVuZE9mZnNldCA8PCBGTEFTSF9XUlAyQVJfV1JQMkFfRU5EX1BvcykgfCBXUlBTdGFydE9mZnNldCk7DQotICAgIH0gZWxzZSBpZiAoV1JQQXJlYSA9PSBPQl9XUlBBUkVBX0JBTksyX0FSRUFCKSB7DQotICAgICAgRkxBU0gtPldSUDJCUiA9DQotICAgICAgICAgICgoV1JEUEVuZE9mZnNldCA8PCBGTEFTSF9XUlAyQlJfV1JQMkJfRU5EX1BvcykgfCBXUlBTdGFydE9mZnNldCk7DQotICAgIH0NCi0jZW5kaWYNCi0gICAgZWxzZSB7DQotICAgICAgLyogTm90aGluZyB0byBkbyAqLw0KLSAgICB9DQotDQotICAgIC8qIFNldCBPUFRTVFJUIEJpdCAqLw0KLSAgICBTRVRfQklUKEZMQVNILT5DUiwgRkxBU0hfQ1JfT1BUU1RSVCk7DQotDQotICAgIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLw0KLSAgICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbigodWludDMyX3QpRkxBU0hfVElNRU9VVF9WQUxVRSk7DQotICB9DQotDQotICByZXR1cm4gc3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCB0aGUgcmVhZCBwcm90ZWN0aW9uIGxldmVsIGludG8gT3B0aW9uIEJ5dGVzLg0KLSAqIEBub3RlICAgVG8gY29uZmlndXJlIGFueSBvcHRpb24gYnl0ZXMsIHRoZSBvcHRpb24gbG9jayBiaXQgT1BUTE9DSyBtdXN0IGJlDQotICogICAgICAgICBjbGVhcmVkIHdpdGggdGhlIGNhbGwgb2YgSEFMX0ZMQVNIX09CX1VubG9jaygpIGZ1bmN0aW9uLg0KLSAqIEBub3RlICAgTmV3IG9wdGlvbiBieXRlcyBjb25maWd1cmF0aW9uIHdpbGwgYmUgdGFrZW4gaW50byBhY2NvdW50IGluIHR3bw0KLSAqIGNhc2VzOg0KLSAqICAgICAgICAgLSBhZnRlciBhbiBvcHRpb24gYnl0ZXMgbGF1bmNoIHRocm91Z2ggdGhlIGNhbGwgb2YNCi0gKiBIQUxfRkxBU0hfT0JfTGF1bmNoKCkNCi0gKiAgICAgICAgIC0gYWZ0ZXIgYSBwb3dlciByZXNldCAoQk9SIHJlc2V0IG9yIGV4aXQgZnJvbSBTdGFuZGJ5L1NodXRkb3duIG1vZGVzKQ0KLSAqIEBub3RlICAgISEhIFdhcm5pbmcgOiBXaGVuIGVuYWJsaW5nIE9CX1JEUCBsZXZlbCAyIGl0J3Mgbm8gbW9yZSBwb3NzaWJsZQ0KLSAqICAgICAgICAgdG8gZ28gYmFjayB0byBsZXZlbCAxIG9yIDAgISEhDQotICogQHBhcmFtICBSRFBMZXZlbCBzcGVjaWZpZXMgdGhlIHJlYWQgcHJvdGVjdGlvbiBsZXZlbC4NCi0gKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIE9CX1JEUF9MRVZFTF8wOiBObyBwcm90ZWN0aW9uDQotICogICAgICAgICAgICBAYXJnIE9CX1JEUF9MRVZFTF8xOiBNZW1vcnkgUmVhZCBwcm90ZWN0aW9uDQotICogICAgICAgICAgICBAYXJnIE9CX1JEUF9MRVZFTF8yOiBGdWxsIGNoaXAgcHJvdGVjdGlvbg0KLSAqDQotICogQHJldHZhbCBIQUxfU3RhdHVzDQotICovDQotc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIEZMQVNIX09CX1JEUENvbmZpZyh1aW50MzJfdCBSRFBMZXZlbCkgew0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19PQl9SRFBfTEVWRUwoUkRQTGV2ZWwpKTsNCi0NCi0gIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLw0KLSAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oKHVpbnQzMl90KUZMQVNIX1RJTUVPVVRfVkFMVUUpOw0KLQ0KLSAgaWYgKHN0YXR1cyA9PSBIQUxfT0spIHsNCi0gICAgLyogQ29uZmlndXJlIHRoZSBSRFAgbGV2ZWwgaW4gdGhlIG9wdGlvbiBieXRlcyByZWdpc3RlciAqLw0KLSAgICBNT0RJRllfUkVHKEZMQVNILT5PUFRSLCBGTEFTSF9PUFRSX1JEUCwgUkRQTGV2ZWwpOw0KLQ0KLSAgICAvKiBTZXQgT1BUU1RSVCBCaXQgKi8NCi0gICAgU0VUX0JJVChGTEFTSC0+Q1IsIEZMQVNIX0NSX09QVFNUUlQpOw0KLQ0KLSAgICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8NCi0gICAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oKHVpbnQzMl90KUZMQVNIX1RJTUVPVVRfVkFMVUUpOw0KLSAgfQ0KLQ0KLSAgcmV0dXJuIHN0YXR1czsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBQcm9ncmFtIHRoZSBGTEFTSCBVc2VyIE9wdGlvbiBCeXRlcy4NCi0gKiBAbm90ZSAgIFRvIGNvbmZpZ3VyZSBhbnkgb3B0aW9uIGJ5dGVzLCB0aGUgb3B0aW9uIGxvY2sgYml0IE9QVExPQ0sgbXVzdCBiZQ0KLSAqICAgICAgICAgY2xlYXJlZCB3aXRoIHRoZSBjYWxsIG9mIEhBTF9GTEFTSF9PQl9VbmxvY2soKSBmdW5jdGlvbi4NCi0gKiBAbm90ZSAgIE5ldyBvcHRpb24gYnl0ZXMgY29uZmlndXJhdGlvbiB3aWxsIGJlIHRha2VuIGludG8gYWNjb3VudCBpbiB0d28NCi0gKiBjYXNlczoNCi0gKiAgICAgICAgIC0gYWZ0ZXIgYW4gb3B0aW9uIGJ5dGVzIGxhdW5jaCB0aHJvdWdoIHRoZSBjYWxsIG9mDQotICogSEFMX0ZMQVNIX09CX0xhdW5jaCgpDQotICogICAgICAgICAtIGFmdGVyIGEgcG93ZXIgcmVzZXQgKEJPUiByZXNldCBvciBleGl0IGZyb20gU3RhbmRieS9TaHV0ZG93biBtb2RlcykNCi0gKiBAcGFyYW0gIFVzZXJUeXBlIFRoZSBGTEFTSCBVc2VyIE9wdGlvbiBCeXRlcyB0byBiZSBtb2RpZmllZC4NCi0gKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIEByZWYgRkxBU0hfT0JfVVNFUl9UeXBlLg0KLSAqIEBwYXJhbSAgVXNlckNvbmZpZyBUaGUgc2VsZWN0ZWQgVXNlciBPcHRpb24gQnl0ZXMgdmFsdWVzOg0KLSAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgQHJlZiBGTEFTSF9PQl9VU0VSX0JPUl9MRVZFTCwNCi0gKiAgICAgICAgIEByZWYgRkxBU0hfT0JfVVNFUl9uUlNUX1NUT1AsIEByZWYgRkxBU0hfT0JfVVNFUl9uUlNUX1NUQU5EQlkgLA0KLSAqICAgICAgICAgQHJlZiBGTEFTSF9PQl9VU0VSX25SU1RfU0hVVERPV04sIEByZWYgRkxBU0hfT0JfVVNFUl9JV0RHX1NXLA0KLSAqICAgICAgICAgQHJlZiBGTEFTSF9PQl9VU0VSX0lXREdfU1RPUCwgQHJlZiBGTEFTSF9PQl9VU0VSX0lXREdfU1RBTkRCWSwNCi0gKiAgICAgICAgIEByZWYgRkxBU0hfT0JfVVNFUl9XV0RHX1NXLCBAcmVmIEZMQVNIX09CX1VTRVJfV1dER19TVywNCi0gKiAgICAgICAgIEByZWYgRkxBU0hfT0JfVVNFUl9CRkIyICgqKSwgQHJlZiBGTEFTSF9PQl9VU0VSX25CT09UMSwNCi0gKiAgICAgICAgIEByZWYgRkxBU0hfT0JfVVNFUl9TUkFNX1BFLCBAcmVmIEZMQVNIX09CX1VTRVJfQ0NNU1JBTV9SU1QsDQotICogICAgICAgICBAcmVmIEZMQVNIX09CX1VTRVJfblNXQk9PVDAsIEByZWYgRkxBU0hfT0JfVVNFUl9uQk9PVDAsDQotICogICAgICAgICBAcmVmIEZMQVNIX09CX1VTRVJfTlJTVF9NT0RFLCBAcmVmDQotICogRkxBU0hfT0JfVVNFUl9JTlRFUk5BTF9SRVNFVF9IT0xERVINCi0gKiBAbm90ZSAgICgqKSBhdmFpbGFiaWxpdHkgZGVwZW5kcyBvbiBkZXZpY2VzDQotICogQHJldHZhbCBIQUxfU3RhdHVzDQotICovDQotc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIEZMQVNIX09CX1VzZXJDb25maWcodWludDMyX3QgVXNlclR5cGUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVXNlckNvbmZpZykgew0KLSAgdWludDMyX3Qgb3B0cl9yZWdfdmFsID0gMDsNCi0gIHVpbnQzMl90IG9wdHJfcmVnX21hc2sgPSAwOw0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19PQl9VU0VSX1RZUEUoVXNlclR5cGUpKTsNCi0NCi0gIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLw0KLSAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oKHVpbnQzMl90KUZMQVNIX1RJTUVPVVRfVkFMVUUpOw0KLQ0KLSAgaWYgKHN0YXR1cyA9PSBIQUxfT0spIHsNCi0gICAgaWYgKChVc2VyVHlwZSAmIE9CX1VTRVJfQk9SX0xFVikgIT0gMFUpIHsNCi0gICAgICAvKiBCT1IgbGV2ZWwgb3B0aW9uIGJ5dGUgc2hvdWxkIGJlIG1vZGlmaWVkICovDQotICAgICAgYXNzZXJ0X3BhcmFtKElTX09CX1VTRVJfQk9SX0xFVkVMKFVzZXJDb25maWcgJiBGTEFTSF9PUFRSX0JPUl9MRVYpKTsNCi0NCi0gICAgICAvKiBTZXQgdmFsdWUgYW5kIG1hc2sgZm9yIEJPUiBsZXZlbCBvcHRpb24gYnl0ZSAqLw0KLSAgICAgIG9wdHJfcmVnX3ZhbCB8PSAoVXNlckNvbmZpZyAmIEZMQVNIX09QVFJfQk9SX0xFVik7DQotICAgICAgb3B0cl9yZWdfbWFzayB8PSBGTEFTSF9PUFRSX0JPUl9MRVY7DQotICAgIH0NCi0NCi0gICAgaWYgKChVc2VyVHlwZSAmIE9CX1VTRVJfblJTVF9TVE9QKSAhPSAwVSkgew0KLSAgICAgIC8qIG5SU1RfU1RPUCBvcHRpb24gYnl0ZSBzaG91bGQgYmUgbW9kaWZpZWQgKi8NCi0gICAgICBhc3NlcnRfcGFyYW0oSVNfT0JfVVNFUl9TVE9QKFVzZXJDb25maWcgJiBGTEFTSF9PUFRSX25SU1RfU1RPUCkpOw0KLQ0KLSAgICAgIC8qIFNldCB2YWx1ZSBhbmQgbWFzayBmb3IgblJTVF9TVE9QIG9wdGlvbiBieXRlICovDQotICAgICAgb3B0cl9yZWdfdmFsIHw9IChVc2VyQ29uZmlnICYgRkxBU0hfT1BUUl9uUlNUX1NUT1ApOw0KLSAgICAgIG9wdHJfcmVnX21hc2sgfD0gRkxBU0hfT1BUUl9uUlNUX1NUT1A7DQotICAgIH0NCi0NCi0gICAgaWYgKChVc2VyVHlwZSAmIE9CX1VTRVJfblJTVF9TVERCWSkgIT0gMFUpIHsNCi0gICAgICAvKiBuUlNUX1NUREJZIG9wdGlvbiBieXRlIHNob3VsZCBiZSBtb2RpZmllZCAqLw0KLSAgICAgIGFzc2VydF9wYXJhbShJU19PQl9VU0VSX1NUQU5EQlkoVXNlckNvbmZpZyAmIEZMQVNIX09QVFJfblJTVF9TVERCWSkpOw0KLQ0KLSAgICAgIC8qIFNldCB2YWx1ZSBhbmQgbWFzayBmb3IgblJTVF9TVERCWSBvcHRpb24gYnl0ZSAqLw0KLSAgICAgIG9wdHJfcmVnX3ZhbCB8PSAoVXNlckNvbmZpZyAmIEZMQVNIX09QVFJfblJTVF9TVERCWSk7DQotICAgICAgb3B0cl9yZWdfbWFzayB8PSBGTEFTSF9PUFRSX25SU1RfU1REQlk7DQotICAgIH0NCi0NCi0gICAgaWYgKChVc2VyVHlwZSAmIE9CX1VTRVJfblJTVF9TSERXKSAhPSAwVSkgew0KLSAgICAgIC8qIG5SU1RfU0hEVyBvcHRpb24gYnl0ZSBzaG91bGQgYmUgbW9kaWZpZWQgKi8NCi0gICAgICBhc3NlcnRfcGFyYW0oSVNfT0JfVVNFUl9TSFVURE9XTihVc2VyQ29uZmlnICYgRkxBU0hfT1BUUl9uUlNUX1NIRFcpKTsNCi0NCi0gICAgICAvKiBTZXQgdmFsdWUgYW5kIG1hc2sgZm9yIG5SU1RfU0hEVyBvcHRpb24gYnl0ZSAqLw0KLSAgICAgIG9wdHJfcmVnX3ZhbCB8PSAoVXNlckNvbmZpZyAmIEZMQVNIX09QVFJfblJTVF9TSERXKTsNCi0gICAgICBvcHRyX3JlZ19tYXNrIHw9IEZMQVNIX09QVFJfblJTVF9TSERXOw0KLSAgICB9DQotDQotICAgIGlmICgoVXNlclR5cGUgJiBPQl9VU0VSX0lXREdfU1cpICE9IDBVKSB7DQotICAgICAgLyogSVdER19TVyBvcHRpb24gYnl0ZSBzaG91bGQgYmUgbW9kaWZpZWQgKi8NCi0gICAgICBhc3NlcnRfcGFyYW0oSVNfT0JfVVNFUl9JV0RHKFVzZXJDb25maWcgJiBGTEFTSF9PUFRSX0lXREdfU1cpKTsNCi0NCi0gICAgICAvKiBTZXQgdmFsdWUgYW5kIG1hc2sgZm9yIElXREdfU1cgb3B0aW9uIGJ5dGUgKi8NCi0gICAgICBvcHRyX3JlZ192YWwgfD0gKFVzZXJDb25maWcgJiBGTEFTSF9PUFRSX0lXREdfU1cpOw0KLSAgICAgIG9wdHJfcmVnX21hc2sgfD0gRkxBU0hfT1BUUl9JV0RHX1NXOw0KLSAgICB9DQotDQotICAgIGlmICgoVXNlclR5cGUgJiBPQl9VU0VSX0lXREdfU1RPUCkgIT0gMFUpIHsNCi0gICAgICAvKiBJV0RHX1NUT1Agb3B0aW9uIGJ5dGUgc2hvdWxkIGJlIG1vZGlmaWVkICovDQotICAgICAgYXNzZXJ0X3BhcmFtKElTX09CX1VTRVJfSVdER19TVE9QKFVzZXJDb25maWcgJiBGTEFTSF9PUFRSX0lXREdfU1RPUCkpOw0KLQ0KLSAgICAgIC8qIFNldCB2YWx1ZSBhbmQgbWFzayBmb3IgSVdER19TVE9QIG9wdGlvbiBieXRlICovDQotICAgICAgb3B0cl9yZWdfdmFsIHw9IChVc2VyQ29uZmlnICYgRkxBU0hfT1BUUl9JV0RHX1NUT1ApOw0KLSAgICAgIG9wdHJfcmVnX21hc2sgfD0gRkxBU0hfT1BUUl9JV0RHX1NUT1A7DQotICAgIH0NCi0NCi0gICAgaWYgKChVc2VyVHlwZSAmIE9CX1VTRVJfSVdER19TVERCWSkgIT0gMFUpIHsNCi0gICAgICAvKiBJV0RHX1NUREJZIG9wdGlvbiBieXRlIHNob3VsZCBiZSBtb2RpZmllZCAqLw0KLSAgICAgIGFzc2VydF9wYXJhbShJU19PQl9VU0VSX0lXREdfU1REQlkoVXNlckNvbmZpZyAmIEZMQVNIX09QVFJfSVdER19TVERCWSkpOw0KLQ0KLSAgICAgIC8qIFNldCB2YWx1ZSBhbmQgbWFzayBmb3IgSVdER19TVERCWSBvcHRpb24gYnl0ZSAqLw0KLSAgICAgIG9wdHJfcmVnX3ZhbCB8PSAoVXNlckNvbmZpZyAmIEZMQVNIX09QVFJfSVdER19TVERCWSk7DQotICAgICAgb3B0cl9yZWdfbWFzayB8PSBGTEFTSF9PUFRSX0lXREdfU1REQlk7DQotICAgIH0NCi0NCi0gICAgaWYgKChVc2VyVHlwZSAmIE9CX1VTRVJfV1dER19TVykgIT0gMFUpIHsNCi0gICAgICAvKiBXV0RHX1NXIG9wdGlvbiBieXRlIHNob3VsZCBiZSBtb2RpZmllZCAqLw0KLSAgICAgIGFzc2VydF9wYXJhbShJU19PQl9VU0VSX1dXREcoVXNlckNvbmZpZyAmIEZMQVNIX09QVFJfV1dER19TVykpOw0KLQ0KLSAgICAgIC8qIFNldCB2YWx1ZSBhbmQgbWFzayBmb3IgV1dER19TVyBvcHRpb24gYnl0ZSAqLw0KLSAgICAgIG9wdHJfcmVnX3ZhbCB8PSAoVXNlckNvbmZpZyAmIEZMQVNIX09QVFJfV1dER19TVyk7DQotICAgICAgb3B0cl9yZWdfbWFzayB8PSBGTEFTSF9PUFRSX1dXREdfU1c7DQotICAgIH0NCi0NCi0jaWYgZGVmaW5lZChGTEFTSF9PUFRSX0JGQjIpDQotICAgIGlmICgoVXNlclR5cGUgJiBPQl9VU0VSX0JGQjIpICE9IDBVKSB7DQotICAgICAgLyogQkZCMiBvcHRpb24gYnl0ZSBzaG91bGQgYmUgbW9kaWZpZWQgKi8NCi0gICAgICBhc3NlcnRfcGFyYW0oSVNfT0JfVVNFUl9CRkIyKFVzZXJDb25maWcgJiBGTEFTSF9PUFRSX0JGQjIpKTsNCi0NCi0gICAgICAvKiBTZXQgdmFsdWUgYW5kIG1hc2sgZm9yIEJGQjIgb3B0aW9uIGJ5dGUgKi8NCi0gICAgICBvcHRyX3JlZ192YWwgfD0gKFVzZXJDb25maWcgJiBGTEFTSF9PUFRSX0JGQjIpOw0KLSAgICAgIG9wdHJfcmVnX21hc2sgfD0gRkxBU0hfT1BUUl9CRkIyOw0KLSAgICB9DQotI2VuZGlmDQotDQotICAgIGlmICgoVXNlclR5cGUgJiBPQl9VU0VSX25CT09UMSkgIT0gMFUpIHsNCi0gICAgICAvKiBuQk9PVDEgb3B0aW9uIGJ5dGUgc2hvdWxkIGJlIG1vZGlmaWVkICovDQotICAgICAgYXNzZXJ0X3BhcmFtKElTX09CX1VTRVJfQk9PVDEoVXNlckNvbmZpZyAmIEZMQVNIX09QVFJfbkJPT1QxKSk7DQotDQotICAgICAgLyogU2V0IHZhbHVlIGFuZCBtYXNrIGZvciBuQk9PVDEgb3B0aW9uIGJ5dGUgKi8NCi0gICAgICBvcHRyX3JlZ192YWwgfD0gKFVzZXJDb25maWcgJiBGTEFTSF9PUFRSX25CT09UMSk7DQotICAgICAgb3B0cl9yZWdfbWFzayB8PSBGTEFTSF9PUFRSX25CT09UMTsNCi0gICAgfQ0KLQ0KLSAgICBpZiAoKFVzZXJUeXBlICYgT0JfVVNFUl9TUkFNX1BFKSAhPSAwVSkgew0KLSAgICAgIC8qIFNSQU1fUEUgb3B0aW9uIGJ5dGUgc2hvdWxkIGJlIG1vZGlmaWVkICovDQotICAgICAgYXNzZXJ0X3BhcmFtKElTX09CX1VTRVJfU1JBTV9QQVJJVFkoVXNlckNvbmZpZyAmIEZMQVNIX09QVFJfU1JBTV9QRSkpOw0KLQ0KLSAgICAgIC8qIFNldCB2YWx1ZSBhbmQgbWFzayBmb3IgU1JBTV9QRSBvcHRpb24gYnl0ZSAqLw0KLSAgICAgIG9wdHJfcmVnX3ZhbCB8PSAoVXNlckNvbmZpZyAmIEZMQVNIX09QVFJfU1JBTV9QRSk7DQotICAgICAgb3B0cl9yZWdfbWFzayB8PSBGTEFTSF9PUFRSX1NSQU1fUEU7DQotICAgIH0NCi0NCi0gICAgaWYgKChVc2VyVHlwZSAmIE9CX1VTRVJfQ0NNU1JBTV9SU1QpICE9IDBVKSB7DQotICAgICAgLyogQ0NNU1JBTV9SU1Qgb3B0aW9uIGJ5dGUgc2hvdWxkIGJlIG1vZGlmaWVkICovDQotICAgICAgYXNzZXJ0X3BhcmFtKElTX09CX1VTRVJfQ0NNU1JBTV9SU1QoVXNlckNvbmZpZyAmIEZMQVNIX09QVFJfQ0NNU1JBTV9SU1QpKTsNCi0NCi0gICAgICAvKiBTZXQgdmFsdWUgYW5kIG1hc2sgZm9yIENDTVNSQU1fUlNUIG9wdGlvbiBieXRlICovDQotICAgICAgb3B0cl9yZWdfdmFsIHw9IChVc2VyQ29uZmlnICYgRkxBU0hfT1BUUl9DQ01TUkFNX1JTVCk7DQotICAgICAgb3B0cl9yZWdfbWFzayB8PSBGTEFTSF9PUFRSX0NDTVNSQU1fUlNUOw0KLSAgICB9DQotDQotICAgIGlmICgoVXNlclR5cGUgJiBPQl9VU0VSX25TV0JPT1QwKSAhPSAwVSkgew0KLSAgICAgIC8qIG5TV0JPT1QwIG9wdGlvbiBieXRlIHNob3VsZCBiZSBtb2RpZmllZCAqLw0KLSAgICAgIGFzc2VydF9wYXJhbShJU19PQl9VU0VSX1NXQk9PVDAoVXNlckNvbmZpZyAmIEZMQVNIX09QVFJfblNXQk9PVDApKTsNCi0NCi0gICAgICAvKiBTZXQgdmFsdWUgYW5kIG1hc2sgZm9yIG5TV0JPT1QwIG9wdGlvbiBieXRlICovDQotICAgICAgb3B0cl9yZWdfdmFsIHw9IChVc2VyQ29uZmlnICYgRkxBU0hfT1BUUl9uU1dCT09UMCk7DQotICAgICAgb3B0cl9yZWdfbWFzayB8PSBGTEFTSF9PUFRSX25TV0JPT1QwOw0KLSAgICB9DQotDQotICAgIGlmICgoVXNlclR5cGUgJiBPQl9VU0VSX25CT09UMCkgIT0gMFUpIHsNCi0gICAgICAvKiBuQk9PVDAgb3B0aW9uIGJ5dGUgc2hvdWxkIGJlIG1vZGlmaWVkICovDQotICAgICAgYXNzZXJ0X3BhcmFtKElTX09CX1VTRVJfQk9PVDAoVXNlckNvbmZpZyAmIEZMQVNIX09QVFJfbkJPT1QwKSk7DQotDQotICAgICAgLyogU2V0IHZhbHVlIGFuZCBtYXNrIGZvciBuQk9PVDAgb3B0aW9uIGJ5dGUgKi8NCi0gICAgICBvcHRyX3JlZ192YWwgfD0gKFVzZXJDb25maWcgJiBGTEFTSF9PUFRSX25CT09UMCk7DQotICAgICAgb3B0cl9yZWdfbWFzayB8PSBGTEFTSF9PUFRSX25CT09UMDsNCi0gICAgfQ0KLQ0KLSAgICBpZiAoKFVzZXJUeXBlICYgT0JfVVNFUl9OUlNUX01PREUpICE9IDBVKSB7DQotICAgICAgLyogUmVzZXQgQ29uZmlndXJhdGlvbiBvcHRpb24gYnl0ZSBzaG91bGQgYmUgbW9kaWZpZWQgKi8NCi0gICAgICBhc3NlcnRfcGFyYW0oSVNfT0JfVVNFUl9OUlNUX01PREUoVXNlckNvbmZpZyAmIEZMQVNIX09QVFJfTlJTVF9NT0RFKSk7DQotDQotICAgICAgLyogU2V0IHZhbHVlIGFuZCBtYXNrIGZvciBSZXNldCBDb25maWd1cmF0aW9uIG9wdGlvbiBieXRlICovDQotICAgICAgb3B0cl9yZWdfdmFsIHw9IChVc2VyQ29uZmlnICYgRkxBU0hfT1BUUl9OUlNUX01PREUpOw0KLSAgICAgIG9wdHJfcmVnX21hc2sgfD0gRkxBU0hfT1BUUl9OUlNUX01PREU7DQotICAgIH0NCi0NCi0gICAgaWYgKChVc2VyVHlwZSAmIE9CX1VTRVJfSVJIRU4pICE9IDBVKSB7DQotICAgICAgLyogSVJIIG9wdGlvbiBieXRlIHNob3VsZCBiZSBtb2RpZmllZCAqLw0KLSAgICAgIGFzc2VydF9wYXJhbShJU19PQl9VU0VSX0lSSEVOKFVzZXJDb25maWcgJiBGTEFTSF9PUFRSX0lSSEVOKSk7DQotDQotICAgICAgLyogU2V0IHZhbHVlIGFuZCBtYXNrIGZvciBJUkggb3B0aW9uIGJ5dGUgKi8NCi0gICAgICBvcHRyX3JlZ192YWwgfD0gKFVzZXJDb25maWcgJiBGTEFTSF9PUFRSX0lSSEVOKTsNCi0gICAgICBvcHRyX3JlZ19tYXNrIHw9IEZMQVNIX09QVFJfSVJIRU47DQotICAgIH0NCi0NCi0gICAgLyogQ29uZmlndXJlIHRoZSBvcHRpb24gYnl0ZXMgcmVnaXN0ZXIgKi8NCi0gICAgTU9ESUZZX1JFRyhGTEFTSC0+T1BUUiwgb3B0cl9yZWdfbWFzaywgb3B0cl9yZWdfdmFsKTsNCi0NCi0gICAgLyogU2V0IE9QVFNUUlQgQml0ICovDQotICAgIFNFVF9CSVQoRkxBU0gtPkNSLCBGTEFTSF9DUl9PUFRTVFJUKTsNCi0NCi0gICAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovDQotICAgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKCh1aW50MzJfdClGTEFTSF9USU1FT1VUX1ZBTFVFKTsNCi0gIH0NCi0NCi0gIHJldHVybiBzdGF0dXM7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBQcm9wcmlldGFyeSBjb2RlIHJlYWRvdXQgcHJvdGVjdGlvbiBhcmVhIGludG8gT3B0aW9uDQotICogQnl0ZXMuDQotICogQG5vdGUgICBUbyBjb25maWd1cmUgYW55IG9wdGlvbiBieXRlcywgdGhlIG9wdGlvbiBsb2NrIGJpdCBPUFRMT0NLIG11c3QgYmUNCi0gKiAgICAgICAgIGNsZWFyZWQgd2l0aCB0aGUgY2FsbCBvZiBIQUxfRkxBU0hfT0JfVW5sb2NrKCkgZnVuY3Rpb24uDQotICogQG5vdGUgICBOZXcgb3B0aW9uIGJ5dGVzIGNvbmZpZ3VyYXRpb24gd2lsbCBiZSB0YWtlbiBpbnRvIGFjY291bnQgaW4gdHdvDQotICogY2FzZXM6DQotICogICAgICAgICAtIGFmdGVyIGFuIG9wdGlvbiBieXRlcyBsYXVuY2ggdGhyb3VnaCB0aGUgY2FsbCBvZg0KLSAqIEhBTF9GTEFTSF9PQl9MYXVuY2goKQ0KLSAqICAgICAgICAgLSBhZnRlciBhIHBvd2VyIHJlc2V0IChCT1IgcmVzZXQgb3IgZXhpdCBmcm9tIFN0YW5kYnkvU2h1dGRvd24gbW9kZXMpDQotICogQHBhcmFtICBQQ1JPUENvbmZpZyBzcGVjaWZpZXMgdGhlIGNvbmZpZ3VyYXRpb24gKEJhbmsgdG8gYmUgY29uZmlndXJlZCBhbmQNCi0gKiBQQ1JPUF9SRFAgb3B0aW9uKS4gVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIGNvbWJpbmF0aW9uIG9mIEZMQVNIX0JBTktfMSBvcg0KLSAqIEZMQVNIX0JBTktfMiAoKikgd2l0aCBPQl9QQ1JPUF9SRFBfTk9UX0VSQVNFIG9yIE9CX1BDUk9QX1JEUF9FUkFTRS4NCi0gKiBAbm90ZSAgICgqKSBhdmFpbGFiaWxpdHkgZGVwZW5kcyBvbiBkZXZpY2VzDQotICogQHBhcmFtICBQQ1JPUFN0YXJ0QWRkciBzcGVjaWZpZXMgdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIFByb3ByaWV0YXJ5IGNvZGUNCi0gKiByZWFkb3V0IHByb3RlY3Rpb24uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbiBhZGRyZXNzIGJldHdlZW4gYmVnaW4gYW5kIGVuZCBvZg0KLSAqIHRoZSBiYW5rLg0KLSAqIEBwYXJhbSAgUENST1BFbmRBZGRyIHNwZWNpZmllcyB0aGUgZW5kIGFkZHJlc3Mgb2YgdGhlIFByb3ByaWV0YXJ5IGNvZGUNCi0gKiByZWFkb3V0IHByb3RlY3Rpb24uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbiBhZGRyZXNzIGJldHdlZW4gUENST1BTdGFydEFkZHINCi0gKiBhbmQgZW5kIG9mIHRoZSBiYW5rLg0KLSAqIEByZXR2YWwgSEFMX1N0YXR1cw0KLSAqLw0KLXN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBGTEFTSF9PQl9QQ1JPUENvbmZpZyh1aW50MzJfdCBQQ1JPUENvbmZpZywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUENST1BTdGFydEFkZHIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFBDUk9QRW5kQWRkcikgew0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzOw0KLSAgdWludDMyX3QgcmVnX3ZhbHVlOw0KLSAgdWludDMyX3QgYmFuazFfYWRkcjsNCi0jaWYgZGVmaW5lZChGTEFTSF9PUFRSX0RCQU5LKQ0KLSAgdWludDMyX3QgYmFuazJfYWRkcjsNCi0jZW5kaWYNCi0NCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfRkxBU0hfQkFOS19FWENMVVNJVkUoUENST1BDb25maWcgJiBGTEFTSF9CQU5LX0JPVEgpKTsNCi0gIGFzc2VydF9wYXJhbShJU19PQl9QQ1JPUF9SRFAoUENST1BDb25maWcgJiBGTEFTSF9QQ1JPUDFFUl9QQ1JPUF9SRFApKTsNCi0gIGFzc2VydF9wYXJhbShJU19GTEFTSF9NQUlOX01FTV9BRERSRVNTKFBDUk9QU3RhcnRBZGRyKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfRkxBU0hfTUFJTl9NRU1fQUREUkVTUyhQQ1JPUEVuZEFkZHIpKTsNCi0NCi0gIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLw0KLSAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oKHVpbnQzMl90KUZMQVNIX1RJTUVPVVRfVkFMVUUpOw0KLQ0KLSAgaWYgKHN0YXR1cyA9PSBIQUxfT0spIHsNCi0jaWYgZGVmaW5lZChGTEFTSF9PUFRSX0RCQU5LKQ0KLSAgICAvKiBHZXQgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBiYW5rIHN3YXBwaW5nICovDQotICAgIGlmIChSRUFEX0JJVChTWVNDRkctPk1FTVJNUCwgU1lTQ0ZHX01FTVJNUF9GQl9NT0RFKSA9PSAwVSkgew0KLSAgICAgIGJhbmsxX2FkZHIgPSBGTEFTSF9CQVNFOw0KLSAgICAgIGJhbmsyX2FkZHIgPSBGTEFTSF9CQVNFICsgRkxBU0hfQkFOS19TSVpFOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgIGJhbmsxX2FkZHIgPSBGTEFTSF9CQVNFICsgRkxBU0hfQkFOS19TSVpFOw0KLSAgICAgIGJhbmsyX2FkZHIgPSBGTEFTSF9CQVNFOw0KLSAgICB9DQotI2Vsc2UNCi0gICAgYmFuazFfYWRkciA9IEZMQVNIX0JBU0U7DQotI2VuZGlmDQotDQotI2lmIGRlZmluZWQoRkxBU0hfT1BUUl9EQkFOSykNCi0gICAgaWYgKFJFQURfQklUKEZMQVNILT5PUFRSLCBGTEFTSF9PUFRSX0RCQU5LKSA9PSAwVSkgew0KLSAgICAgIC8qIENvbmZpZ3VyZSB0aGUgUHJvcHJpZXRhcnkgY29kZSByZWFkb3V0IHByb3RlY3Rpb24gKi8NCi0gICAgICBpZiAoKFBDUk9QQ29uZmlnICYgRkxBU0hfQkFOS19CT1RIKSA9PSBGTEFTSF9CQU5LXzEpIHsNCi0gICAgICAgIHJlZ192YWx1ZSA9ICgoUENST1BTdGFydEFkZHIgLSBGTEFTSF9CQVNFKSA+PiA0KTsNCi0gICAgICAgIE1PRElGWV9SRUcoRkxBU0gtPlBDUk9QMVNSLCBGTEFTSF9QQ1JPUDFTUl9QQ1JPUDFfU1RSVCwgcmVnX3ZhbHVlKTsNCi0NCi0gICAgICAgIHJlZ192YWx1ZSA9ICgoUENST1BFbmRBZGRyIC0gRkxBU0hfQkFTRSkgPj4gNCk7DQotICAgICAgICBNT0RJRllfUkVHKEZMQVNILT5QQ1JPUDFFUiwgRkxBU0hfUENST1AxRVJfUENST1AxX0VORCwgcmVnX3ZhbHVlKTsNCi0gICAgICB9IGVsc2UgaWYgKChQQ1JPUENvbmZpZyAmIEZMQVNIX0JBTktfQk9USCkgPT0gRkxBU0hfQkFOS18yKSB7DQotICAgICAgICByZWdfdmFsdWUgPSAoKFBDUk9QU3RhcnRBZGRyIC0gRkxBU0hfQkFTRSkgPj4gNCk7DQotICAgICAgICBNT0RJRllfUkVHKEZMQVNILT5QQ1JPUDJTUiwgRkxBU0hfUENST1AyU1JfUENST1AyX1NUUlQsIHJlZ192YWx1ZSk7DQotDQotICAgICAgICByZWdfdmFsdWUgPSAoKFBDUk9QRW5kQWRkciAtIEZMQVNIX0JBU0UpID4+IDQpOw0KLSAgICAgICAgTU9ESUZZX1JFRyhGTEFTSC0+UENST1AyRVIsIEZMQVNIX1BDUk9QMkVSX1BDUk9QMl9FTkQsIHJlZ192YWx1ZSk7DQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8NCi0gICAgICB9DQotICAgIH0gZWxzZQ0KLSNlbmRpZg0KLSAgICB7DQotICAgICAgLyogQ29uZmlndXJlIHRoZSBQcm9wcmlldGFyeSBjb2RlIHJlYWRvdXQgcHJvdGVjdGlvbiAqLw0KLSAgICAgIGlmICgoUENST1BDb25maWcgJiBGTEFTSF9CQU5LX0JPVEgpID09IEZMQVNIX0JBTktfMSkgew0KLSAgICAgICAgcmVnX3ZhbHVlID0gKChQQ1JPUFN0YXJ0QWRkciAtIGJhbmsxX2FkZHIpID4+IDMpOw0KLSAgICAgICAgTU9ESUZZX1JFRyhGTEFTSC0+UENST1AxU1IsIEZMQVNIX1BDUk9QMVNSX1BDUk9QMV9TVFJULCByZWdfdmFsdWUpOw0KLQ0KLSAgICAgICAgcmVnX3ZhbHVlID0gKChQQ1JPUEVuZEFkZHIgLSBiYW5rMV9hZGRyKSA+PiAzKTsNCi0gICAgICAgIE1PRElGWV9SRUcoRkxBU0gtPlBDUk9QMUVSLCBGTEFTSF9QQ1JPUDFFUl9QQ1JPUDFfRU5ELCByZWdfdmFsdWUpOw0KLSAgICAgIH0NCi0jaWYgZGVmaW5lZChGTEFTSF9PUFRSX0RCQU5LKQ0KLSAgICAgIGVsc2UgaWYgKChQQ1JPUENvbmZpZyAmIEZMQVNIX0JBTktfQk9USCkgPT0gRkxBU0hfQkFOS18yKSB7DQotICAgICAgICByZWdfdmFsdWUgPSAoKFBDUk9QU3RhcnRBZGRyIC0gYmFuazJfYWRkcikgPj4gMyk7DQotICAgICAgICBNT0RJRllfUkVHKEZMQVNILT5QQ1JPUDJTUiwgRkxBU0hfUENST1AyU1JfUENST1AyX1NUUlQsIHJlZ192YWx1ZSk7DQotDQotICAgICAgICByZWdfdmFsdWUgPSAoKFBDUk9QRW5kQWRkciAtIGJhbmsyX2FkZHIpID4+IDMpOw0KLSAgICAgICAgTU9ESUZZX1JFRyhGTEFTSC0+UENST1AyRVIsIEZMQVNIX1BDUk9QMkVSX1BDUk9QMl9FTkQsIHJlZ192YWx1ZSk7DQotICAgICAgfQ0KLSNlbmRpZg0KLSAgICAgIGVsc2Ugew0KLSAgICAgICAgLyogTm90aGluZyB0byBkbyAqLw0KLSAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBNT0RJRllfUkVHKEZMQVNILT5QQ1JPUDFFUiwgRkxBU0hfUENST1AxRVJfUENST1BfUkRQLA0KLSAgICAgICAgICAgICAgIChQQ1JPUENvbmZpZyAmIEZMQVNIX1BDUk9QMUVSX1BDUk9QX1JEUCkpOw0KLQ0KLSAgICAvKiBTZXQgT1BUU1RSVCBCaXQgKi8NCi0gICAgU0VUX0JJVChGTEFTSC0+Q1IsIEZMQVNIX0NSX09QVFNUUlQpOw0KLQ0KLSAgICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8NCi0gICAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oKHVpbnQzMl90KUZMQVNIX1RJTUVPVVRfVkFMVUUpOw0KLSAgfQ0KLQ0KLSAgcmV0dXJuIHN0YXR1czsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDb25maWd1cmUgdGhlIFNlY3VyYWJsZSBtZW1vcnkgYXJlYSBpbnRvIE9wdGlvbiBCeXRlcy4NCi0gKiBAbm90ZSAgIFRvIGNvbmZpZ3VyZSBhbnkgb3B0aW9uIGJ5dGVzLCB0aGUgb3B0aW9uIGxvY2sgYml0IE9QVExPQ0sgbXVzdCBiZQ0KLSAqICAgICAgICAgY2xlYXJlZCB3aXRoIHRoZSBjYWxsIG9mIEhBTF9GTEFTSF9PQl9VbmxvY2soKSBmdW5jdGlvbi4NCi0gKiBAbm90ZSAgIE5ldyBvcHRpb24gYnl0ZXMgY29uZmlndXJhdGlvbiB3aWxsIGJlIHRha2VuIGludG8gYWNjb3VudCBpbiB0d28NCi0gKiBjYXNlczoNCi0gKiAgICAgICAgIC0gYWZ0ZXIgYW4gb3B0aW9uIGJ5dGVzIGxhdW5jaCB0aHJvdWdoIHRoZSBjYWxsIG9mDQotICogSEFMX0ZMQVNIX09CX0xhdW5jaCgpDQotICogICAgICAgICAtIGFmdGVyIGEgcG93ZXIgcmVzZXQgKEJPUiByZXNldCBvciBleGl0IGZyb20gU3RhbmRieS9TaHV0ZG93biBtb2RlcykNCi0gKiBAcGFyYW0gIFNlY0Jhbmsgc3BlY2lmaWVzIGJhbmsgb2Ygc2VjdXJhYmxlIG1lbW9yeSBhcmVhIHRvIGJlIGNvbmZpZ3VyZWQuDQotICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgRkxBU0hfQkFOS18xOiBTZWN1cmFibGUgbWVtb3J5IGluIEJhbmsxIHRvIGJlIGNvbmZpZ3VyZWQNCi0gKiAgICAgICAgICAgIEBhcmcgRkxBU0hfQkFOS18yOiBTZWN1cmFibGUgbWVtb3J5IGluIEJhbmsyIHRvIGJlIGNvbmZpZ3VyZWQgKCopDQotICogQG5vdGUgICAoKikgYXZhaWxhYmlsaXR5IGRlcGVuZHMgb24gZGV2aWNlcw0KLSAqIEBwYXJhbSAgU2VjU2l6ZSBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBwYWdlcyBvZiB0aGUgU2VjdXJhYmxlIG1lbW9yeSBhcmVhLA0KLSAqICAgICAgICAgc3RhcnRpbmcgZnJvbSBmaXJzdCBwYWdlIG9mIHRoZSBiYW5rLg0KLSAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHBhZ2UgbnVtYmVyIGJldHdlZW4gMCBhbmQgKG1heCBudW1iZXIgb2YgcGFnZXMNCi0gKiBpbiB0aGUgYmFuayAtIDEpDQotICogQHJldHZhbCBIQUwgU3RhdHVzDQotICovDQotc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIEZMQVNIX09CX1NlY01lbUNvbmZpZyh1aW50MzJfdCBTZWNCYW5rLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgU2VjU2l6ZSkgew0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19GTEFTSF9CQU5LX0VYQ0xVU0lWRShTZWNCYW5rKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfT0JfU0VDTUVNX1NJWkUoU2VjU2l6ZSkpOw0KLQ0KLSAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovDQotICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbigodWludDMyX3QpRkxBU0hfVElNRU9VVF9WQUxVRSk7DQotDQotICBpZiAoc3RhdHVzID09IEhBTF9PSykgew0KLSAgICAvKiBDb25maWd1cmUgdGhlIHdyaXRlIHByb3RlY3RlZCBhcmVhICovDQotICAgIGlmIChTZWNCYW5rID09IEZMQVNIX0JBTktfMSkgew0KLSAgICAgIE1PRElGWV9SRUcoRkxBU0gtPlNFQzFSLCBGTEFTSF9TRUMxUl9TRUNfU0laRTEsIFNlY1NpemUpOw0KLSAgICB9DQotI2lmIGRlZmluZWQoRkxBU0hfT1BUUl9EQkFOSykNCi0gICAgZWxzZSBpZiAoU2VjQmFuayA9PSBGTEFTSF9CQU5LXzIpIHsNCi0gICAgICBNT0RJRllfUkVHKEZMQVNILT5TRUMyUiwgRkxBU0hfU0VDMlJfU0VDX1NJWkUyLCBTZWNTaXplKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAvKiBOb3RoaW5nIHRvIGRvICovDQotICAgIH0NCi0jZW5kaWYNCi0NCi0gICAgLyogU2V0IE9QVFNUUlQgQml0ICovDQotICAgIFNFVF9CSVQoRkxBU0gtPkNSLCBGTEFTSF9DUl9PUFRTVFJUKTsNCi0NCi0gICAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovDQotICAgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKCh1aW50MzJfdClGTEFTSF9USU1FT1VUX1ZBTFVFKTsNCi0gIH0NCi0NCi0gIHJldHVybiBzdGF0dXM7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBCb290IExvY2sgaW50byBPcHRpb24gQnl0ZXMuDQotICogQG5vdGUgICBUbyBjb25maWd1cmUgYW55IG9wdGlvbiBieXRlcywgdGhlIG9wdGlvbiBsb2NrIGJpdCBPUFRMT0NLIG11c3QgYmUNCi0gKiAgICAgICAgIGNsZWFyZWQgd2l0aCB0aGUgY2FsbCBvZiBIQUxfRkxBU0hfT0JfVW5sb2NrKCkgZnVuY3Rpb24uDQotICogQG5vdGUgICBOZXcgb3B0aW9uIGJ5dGVzIGNvbmZpZ3VyYXRpb24gd2lsbCBiZSB0YWtlbiBpbnRvIGFjY291bnQgaW4gdHdvDQotICogY2FzZXM6DQotICogICAgICAgICAtIGFmdGVyIGFuIG9wdGlvbiBieXRlcyBsYXVuY2ggdGhyb3VnaCB0aGUgY2FsbCBvZg0KLSAqIEhBTF9GTEFTSF9PQl9MYXVuY2goKQ0KLSAqICAgICAgICAgLSBhZnRlciBhIHBvd2VyIHJlc2V0IChCT1IgcmVzZXQgb3IgZXhpdCBmcm9tIFN0YW5kYnkvU2h1dGRvd24gbW9kZXMpDQotICogQHBhcmFtICBCb290TG9ja0NvbmZpZyBzcGVjaWZpZXMgdGhlIGJvb3QgbG9jayBjb25maWd1cmF0aW9uLg0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIE9CX0JPT1RfTE9DS19FTkFCTEU6IEVuYWJsZSBCb290IExvY2sNCi0gKiAgICAgICAgICAgIEBhcmcgT0JfQk9PVF9MT0NLX0RJU0FCTEU6IERpc2FibGUgQm9vdCBMb2NrDQotICoNCi0gKiBAcmV0dmFsIEhBTF9TdGF0dXMNCi0gKi8NCi1zdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgRkxBU0hfT0JfQm9vdExvY2tDb25maWcodWludDMyX3QgQm9vdExvY2tDb25maWcpIHsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1czsNCi0NCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfT0JfQk9PVF9MT0NLKEJvb3RMb2NrQ29uZmlnKSk7DQotDQotICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8NCi0gIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKCh1aW50MzJfdClGTEFTSF9USU1FT1VUX1ZBTFVFKTsNCi0NCi0gIGlmIChzdGF0dXMgPT0gSEFMX09LKSB7DQotICAgIE1PRElGWV9SRUcoRkxBU0gtPlNFQzFSLCBGTEFTSF9TRUMxUl9CT09UX0xPQ0ssIEJvb3RMb2NrQ29uZmlnKTsNCi0NCi0gICAgLyogU2V0IE9QVFNUUlQgQml0ICovDQotICAgIFNFVF9CSVQoRkxBU0gtPkNSLCBGTEFTSF9DUl9PUFRTVFJUKTsNCi0NCi0gICAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovDQotICAgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKCh1aW50MzJfdClGTEFTSF9USU1FT1VUX1ZBTFVFKTsNCi0gIH0NCi0NCi0gIHJldHVybiBzdGF0dXM7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIFJldHVybiB0aGUgU2VjdXJhYmxlIG1lbW9yeSBhcmVhIGNvbmZpZ3VyYXRpb24gaW50byBPcHRpb24gQnl0ZXMuDQotICAqIEBwYXJhbVtpbl0gIFNlY0Jhbmsgc3BlY2lmaWVzIHRoZSBiYW5rIHdoZXJlIHNlY3VyYWJsZSBtZW1vcnkgYXJlYSBpcw0KLSAgbG9jYXRlZC4NCi0gICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgICAgICAgICBAYXJnIEZMQVNIX0JBTktfMTogU2VjdXJhYmxlIG1lbW9yeSBpbiBCYW5rMQ0KLSAgKiAgICAgICAgICAgIEBhcmcgRkxBU0hfQkFOS18yOiBTZWN1cmFibGUgbWVtb3J5IGluIEJhbmsyICgqKQ0KLSAgKiBAbm90ZSAgICgqKSBhdmFpbGFiaWxpdHkgZGVwZW5kcyBvbiBkZXZpY2VzDQotICAqIEBwYXJhbVtvdXRdICBTZWNTaXplIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHBhZ2VzIHVzZWQgaW4gdGhlIHNlY3VyYWJsZQ0KLSAgICAgICAgICAgICAgICAgbWVtb3J5IGFyZWEgb2YgdGhlIGJhbmsuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi1zdGF0aWMgdm9pZCBGTEFTSF9PQl9HZXRTZWNNZW0odWludDMyX3QgU2VjQmFuaywgdWludDMyX3QgKlNlY1NpemUpIHsNCi0gIC8qIEdldCB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgc2VjdXJhYmxlIG1lbW9yeSBhcmVhICovDQotICBpZiAoU2VjQmFuayA9PSBGTEFTSF9CQU5LXzEpIHsNCi0gICAgKlNlY1NpemUgPSBSRUFEX0JJVChGTEFTSC0+U0VDMVIsIEZMQVNIX1NFQzFSX1NFQ19TSVpFMSk7DQotICB9DQotI2lmIGRlZmluZWQoRkxBU0hfT1BUUl9EQkFOSykNCi0gIGVsc2UgaWYgKFNlY0JhbmsgPT0gRkxBU0hfQkFOS18yKSB7DQotICAgICpTZWNTaXplID0gUkVBRF9CSVQoRkxBU0gtPlNFQzJSLCBGTEFTSF9TRUMyUl9TRUNfU0laRTIpOw0KLSAgfSBlbHNlIHsNCi0gICAgLyogTm90aGluZyB0byBkbyAqLw0KLSAgfQ0KLSNlbmRpZg0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJldHVybiB0aGUgQm9vdCBMb2NrIGNvbmZpZ3VyYXRpb24gaW50byBPcHRpb24gQnl0ZS4NCi0gKiBAcmV0dmFsIEJvb3RMb2NrQ29uZmlnLg0KLSAqICAgICAgICAgVGhpcyByZXR1cm4gdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgT0JfQk9PVF9MT0NLX0VOQUJMRTogQm9vdCBsb2NrIGVuYWJsZWQNCi0gKiAgICAgICAgICAgIEBhcmcgT0JfQk9PVF9MT0NLX0RJU0FCTEU6IEJvb3QgbG9jayBkaXNhYmxlZA0KLSAqLw0KLXN0YXRpYyB1aW50MzJfdCBGTEFTSF9PQl9HZXRCb290TG9jayh2b2lkKSB7DQotICByZXR1cm4gKFJFQURfUkVHKEZMQVNILT5TRUMxUikgJiBGTEFTSF9TRUMxUl9CT09UX0xPQ0spOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJldHVybiB0aGUgV3JpdGUgUHJvdGVjdGlvbiBjb25maWd1cmF0aW9uIGludG8gT3B0aW9uIEJ5dGVzLg0KLSAqIEBwYXJhbVtpbl0gIFdSUEFyZWEgc3BlY2lmaWVzIHRoZSBhcmVhIHRvIGJlIHJldHVybmVkLg0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIE9CX1dSUEFSRUFfQkFOSzFfQVJFQUE6IEZsYXNoIEJhbmsgMSBBcmVhIEENCi0gKiAgICAgICAgICAgIEBhcmcgT0JfV1JQQVJFQV9CQU5LMV9BUkVBQjogRmxhc2ggQmFuayAxIEFyZWEgQg0KLSAqICAgICAgICAgICAgQGFyZyBPQl9XUlBBUkVBX0JBTksyX0FSRUFBOiBGbGFzaCBCYW5rIDIgQXJlYSBBIChkb24ndCBhcHBseSB0bw0KLSAqIFNUTTMyRzQzeC9TVE0zMkc0NHggZGV2aWNlcykNCi0gKiAgICAgICAgICAgIEBhcmcgT0JfV1JQQVJFQV9CQU5LMl9BUkVBQjogRmxhc2ggQmFuayAyIEFyZWEgQiAoZG9uJ3QgYXBwbHkgdG8NCi0gKiBTVE0zMkc0M3gvU1RNMzJHNDR4IGRldmljZXMpDQotICogQHBhcmFtW291dF0gIFdSUFN0YXJ0T2Zmc2V0IHNwZWNpZmllcyB0aGUgYWRkcmVzcyB3aGVyZSB0byBjb3BpZWQgdGhlIHN0YXJ0DQotICogcGFnZSBvZiB0aGUgd3JpdGUgcHJvdGVjdGVkIGFyZWEuDQotICogQHBhcmFtW291dF0gIFdSRFBFbmRPZmZzZXQgc3BlY2lmaWVzIHRoZSBhZGRyZXNzIHdoZXJlIHRvIGNvcGllZCB0aGUgZW5kIHBhZ2UNCi0gKiBvZiB0aGUgd3JpdGUgcHJvdGVjdGVkIGFyZWEuDQotICogQHJldHZhbCBOb25lDQotICovDQotc3RhdGljIHZvaWQgRkxBU0hfT0JfR2V0V1JQKHVpbnQzMl90IFdSUEFyZWEsIHVpbnQzMl90ICpXUlBTdGFydE9mZnNldCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKldSRFBFbmRPZmZzZXQpIHsNCi0gIC8qIEdldCB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgd3JpdGUgcHJvdGVjdGVkIGFyZWEgKi8NCi0gIGlmIChXUlBBcmVhID09IE9CX1dSUEFSRUFfQkFOSzFfQVJFQUEpIHsNCi0gICAgKldSUFN0YXJ0T2Zmc2V0ID0gUkVBRF9CSVQoRkxBU0gtPldSUDFBUiwgRkxBU0hfV1JQMUFSX1dSUDFBX1NUUlQpOw0KLSAgICAqV1JEUEVuZE9mZnNldCA9IChSRUFEX0JJVChGTEFTSC0+V1JQMUFSLCBGTEFTSF9XUlAxQVJfV1JQMUFfRU5EKSA+Pg0KLSAgICAgICAgICAgICAgICAgICAgICBGTEFTSF9XUlAxQVJfV1JQMUFfRU5EX1Bvcyk7DQotICB9IGVsc2UgaWYgKFdSUEFyZWEgPT0gT0JfV1JQQVJFQV9CQU5LMV9BUkVBQikgew0KLSAgICAqV1JQU3RhcnRPZmZzZXQgPSBSRUFEX0JJVChGTEFTSC0+V1JQMUJSLCBGTEFTSF9XUlAxQlJfV1JQMUJfU1RSVCk7DQotICAgICpXUkRQRW5kT2Zmc2V0ID0gKFJFQURfQklUKEZMQVNILT5XUlAxQlIsIEZMQVNIX1dSUDFCUl9XUlAxQl9FTkQpID4+DQotICAgICAgICAgICAgICAgICAgICAgIEZMQVNIX1dSUDFCUl9XUlAxQl9FTkRfUG9zKTsNCi0gIH0NCi0jaWYgZGVmaW5lZChGTEFTSF9PUFRSX0RCQU5LKQ0KLSAgZWxzZSBpZiAoV1JQQXJlYSA9PSBPQl9XUlBBUkVBX0JBTksyX0FSRUFBKSB7DQotICAgICpXUlBTdGFydE9mZnNldCA9IFJFQURfQklUKEZMQVNILT5XUlAyQVIsIEZMQVNIX1dSUDJBUl9XUlAyQV9TVFJUKTsNCi0gICAgKldSRFBFbmRPZmZzZXQgPSAoUkVBRF9CSVQoRkxBU0gtPldSUDJBUiwgRkxBU0hfV1JQMkFSX1dSUDJBX0VORCkgPj4NCi0gICAgICAgICAgICAgICAgICAgICAgRkxBU0hfV1JQMkFSX1dSUDJBX0VORF9Qb3MpOw0KLSAgfSBlbHNlIGlmIChXUlBBcmVhID09IE9CX1dSUEFSRUFfQkFOSzJfQVJFQUIpIHsNCi0gICAgKldSUFN0YXJ0T2Zmc2V0ID0gUkVBRF9CSVQoRkxBU0gtPldSUDJCUiwgRkxBU0hfV1JQMkJSX1dSUDJCX1NUUlQpOw0KLSAgICAqV1JEUEVuZE9mZnNldCA9IChSRUFEX0JJVChGTEFTSC0+V1JQMkJSLCBGTEFTSF9XUlAyQlJfV1JQMkJfRU5EKSA+Pg0KLSAgICAgICAgICAgICAgICAgICAgICBGTEFTSF9XUlAyQlJfV1JQMkJfRU5EX1Bvcyk7DQotICB9DQotI2VuZGlmDQotICBlbHNlIHsNCi0gICAgLyogTm90aGluZyB0byBkbyAqLw0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJldHVybiB0aGUgRkxBU0ggUmVhZCBQcm90ZWN0aW9uIGxldmVsIGludG8gT3B0aW9uIEJ5dGVzLg0KLSAqIEByZXR2YWwgUkRQX0xldmVsDQotICogICAgICAgICBUaGlzIHJldHVybiB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBPQl9SRFBfTEVWRUxfMDogTm8gcHJvdGVjdGlvbg0KLSAqICAgICAgICAgICAgQGFyZyBPQl9SRFBfTEVWRUxfMTogUmVhZCBwcm90ZWN0aW9uIG9mIHRoZSBtZW1vcnkNCi0gKiAgICAgICAgICAgIEBhcmcgT0JfUkRQX0xFVkVMXzI6IEZ1bGwgY2hpcCBwcm90ZWN0aW9uDQotICovDQotc3RhdGljIHVpbnQzMl90IEZMQVNIX09CX0dldFJEUCh2b2lkKSB7DQotICB1aW50MzJfdCByZHBfbGV2ZWwgPSBSRUFEX0JJVChGTEFTSC0+T1BUUiwgRkxBU0hfT1BUUl9SRFApOw0KLQ0KLSAgaWYgKChyZHBfbGV2ZWwgIT0gT0JfUkRQX0xFVkVMXzApICYmIChyZHBfbGV2ZWwgIT0gT0JfUkRQX0xFVkVMXzIpKSB7DQotICAgIHJldHVybiAoT0JfUkRQX0xFVkVMXzEpOw0KLSAgfSBlbHNlIHsNCi0gICAgcmV0dXJuIHJkcF9sZXZlbDsNCi0gIH0NCi19DQotDQotLyoqDQotICogQGJyaWVmICBSZXR1cm4gdGhlIEZMQVNIIFVzZXIgT3B0aW9uIEJ5dGUgdmFsdWUuDQotICogQHJldHZhbCBPQl91c2VyX2NvbmZpZw0KLSAqICAgICAgICAgVGhpcyByZXR1cm4gdmFsdWUgaXMgYSBjb21iaW5hdGlvbiBvZiBAcmVmIEZMQVNIX09CX1VTRVJfQk9SX0xFVkVMLA0KLSAqICAgICAgICAgQHJlZiBGTEFTSF9PQl9VU0VSX25SU1RfU1RPUCwgQHJlZiBGTEFTSF9PQl9VU0VSX25SU1RfU1RBTkRCWSwNCi0gKiAgICAgICAgIEByZWYgRkxBU0hfT0JfVVNFUl9uUlNUX1NIVVRET1dOLCBAcmVmIEZMQVNIX09CX1VTRVJfSVdER19TVywNCi0gKiAgICAgICAgIEByZWYgRkxBU0hfT0JfVVNFUl9JV0RHX1NUT1AsIEByZWYgRkxBU0hfT0JfVVNFUl9JV0RHX1NUQU5EQlksDQotICogICAgICAgICBAcmVmIEZMQVNIX09CX1VTRVJfV1dER19TVywgQHJlZiBGTEFTSF9PQl9VU0VSX1dXREdfU1csDQotICogICAgICAgICBAcmVmIEZMQVNIX09CX1VTRVJfQkZCMiAoKiksIEByZWYgRkxBU0hfT0JfVVNFUl9EQkFOSyAoKiksDQotICogICAgICAgICBAcmVmIEZMQVNIX09CX1VTRVJfbkJPT1QxLCBAcmVmIEZMQVNIX09CX1VTRVJfU1JBTV9QRSwNCi0gKiAgICAgICAgIEByZWYgRkxBU0hfT0JfVVNFUl9DQ01TUkFNX1JTVCwgQHJlZiBPQl9VU0VSX25TV0JPT1QwLEByZWYNCi0gKiBGTEFTSF9PQl9VU0VSX25CT09UMCwNCi0gKiAgICAgICAgIEByZWYgRkxBU0hfT0JfVVNFUl9OUlNUX01PREUsIEByZWYNCi0gKiBGTEFTSF9PQl9VU0VSX0lOVEVSTkFMX1JFU0VUX0hPTERFUg0KLSAqIEBub3RlICAoKikgYXZhaWxhYmlsaXR5IGRlcGVuZHMgb24gZGV2aWNlcw0KLSAqLw0KLXN0YXRpYyB1aW50MzJfdCBGTEFTSF9PQl9HZXRVc2VyKHZvaWQpIHsNCi0gIHVpbnQzMl90IHVzZXJfY29uZmlnID0gUkVBRF9SRUcoRkxBU0gtPk9QVFIpOw0KLSAgQ0xFQVJfQklUKHVzZXJfY29uZmlnLCBGTEFTSF9PUFRSX1JEUCk7DQotDQotICByZXR1cm4gdXNlcl9jb25maWc7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmV0dXJuIHRoZSBGTEFTSCBQQ1JPUCBjb25maWd1cmF0aW9uIGludG8gT3B0aW9uIEJ5dGVzLg0KLSAqIEBwYXJhbVtpbixvdXRdIFBDUk9QQ29uZmlnIHNwZWNpZmllcyB0aGUgY29uZmlndXJhdGlvbiAoQmFuayB0byBiZSBjb25maWd1cmVkDQotICogYW5kIFBDUk9QX1JEUCBvcHRpb24pLiBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgY29tYmluYXRpb24gb2YgRkxBU0hfQkFOS18xDQotICogb3IgRkxBU0hfQkFOS18yIHdpdGggT0JfUENST1BfUkRQX05PVF9FUkFTRSBvciBPQl9QQ1JPUF9SRFBfRVJBU0UuDQotICogQHBhcmFtW291dF0gUENST1BTdGFydEFkZHIgc3BlY2lmaWVzIHRoZSBhZGRyZXNzIHdoZXJlIHRvIGNvcGllZCB0aGUgc3RhcnQNCi0gKiBhZGRyZXNzIG9mIHRoZSBQcm9wcmlldGFyeSBjb2RlIHJlYWRvdXQgcHJvdGVjdGlvbi4NCi0gKiBAcGFyYW1bb3V0XSBQQ1JPUEVuZEFkZHIgc3BlY2lmaWVzIHRoZSBhZGRyZXNzIHdoZXJlIHRvIGNvcGllZCB0aGUgZW5kDQotICogYWRkcmVzcyBvZiB0aGUgUHJvcHJpZXRhcnkgY29kZSByZWFkb3V0IHByb3RlY3Rpb24uDQotICogQHJldHZhbCBOb25lDQotICovDQotc3RhdGljIHZvaWQgRkxBU0hfT0JfR2V0UENST1AodWludDMyX3QgKlBDUk9QQ29uZmlnLCB1aW50MzJfdCAqUENST1BTdGFydEFkZHIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKlBDUk9QRW5kQWRkcikgew0KLSAgdWludDMyX3QgcmVnX3ZhbHVlOw0KLSAgdWludDMyX3QgYmFuazFfYWRkcjsNCi0jaWYgZGVmaW5lZChGTEFTSF9PUFRSX0RCQU5LKQ0KLSAgdWludDMyX3QgYmFuazJfYWRkcjsNCi0NCi0gIC8qIEdldCB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGJhbmsgc3dhcHBpbmcgKi8NCi0gIGlmIChSRUFEX0JJVChTWVNDRkctPk1FTVJNUCwgU1lTQ0ZHX01FTVJNUF9GQl9NT0RFKSA9PSAwVSkgew0KLSAgICBiYW5rMV9hZGRyID0gRkxBU0hfQkFTRTsNCi0gICAgYmFuazJfYWRkciA9IEZMQVNIX0JBU0UgKyBGTEFTSF9CQU5LX1NJWkU7DQotICB9IGVsc2Ugew0KLSAgICBiYW5rMV9hZGRyID0gRkxBU0hfQkFTRSArIEZMQVNIX0JBTktfU0laRTsNCi0gICAgYmFuazJfYWRkciA9IEZMQVNIX0JBU0U7DQotICB9DQotI2Vsc2UNCi0gIGJhbmsxX2FkZHIgPSBGTEFTSF9CQVNFOw0KLSNlbmRpZg0KLQ0KLSNpZiBkZWZpbmVkKEZMQVNIX09QVFJfREJBTkspDQotICBpZiAoUkVBRF9CSVQoRkxBU0gtPk9QVFIsIEZMQVNIX09QVFJfREJBTkspID09IDBVKSB7DQotICAgIGlmICgoKCpQQ1JPUENvbmZpZykgJiBGTEFTSF9CQU5LX0JPVEgpID09IEZMQVNIX0JBTktfMSkgew0KLSAgICAgIHJlZ192YWx1ZSA9IChSRUFEX1JFRyhGTEFTSC0+UENST1AxU1IpICYgRkxBU0hfUENST1AxU1JfUENST1AxX1NUUlQpOw0KLSAgICAgICpQQ1JPUFN0YXJ0QWRkciA9IChyZWdfdmFsdWUgPDwgNCkgKyBGTEFTSF9CQVNFOw0KLQ0KLSAgICAgIHJlZ192YWx1ZSA9IChSRUFEX1JFRyhGTEFTSC0+UENST1AxRVIpICYgRkxBU0hfUENST1AxRVJfUENST1AxX0VORCk7DQotICAgICAgKlBDUk9QRW5kQWRkciA9IChyZWdfdmFsdWUgPDwgNCkgKyBGTEFTSF9CQVNFOw0KLSAgICB9IGVsc2UgaWYgKCgoKlBDUk9QQ29uZmlnKSAmIEZMQVNIX0JBTktfQk9USCkgPT0gRkxBU0hfQkFOS18yKSB7DQotICAgICAgcmVnX3ZhbHVlID0gKFJFQURfUkVHKEZMQVNILT5QQ1JPUDJTUikgJiBGTEFTSF9QQ1JPUDJTUl9QQ1JPUDJfU1RSVCk7DQotICAgICAgKlBDUk9QU3RhcnRBZGRyID0gKHJlZ192YWx1ZSA8PCA0KSArIEZMQVNIX0JBU0U7DQotDQotICAgICAgcmVnX3ZhbHVlID0gKFJFQURfUkVHKEZMQVNILT5QQ1JPUDJFUikgJiBGTEFTSF9QQ1JPUDJFUl9QQ1JPUDJfRU5EKTsNCi0gICAgICAqUENST1BFbmRBZGRyID0gKHJlZ192YWx1ZSA8PCA0KSArIEZMQVNIX0JBU0U7DQotICAgIH0gZWxzZSB7DQotICAgICAgLyogTm90aGluZyB0byBkbyAqLw0KLSAgICB9DQotICB9IGVsc2UNCi0jZW5kaWYNCi0gIHsNCi0gICAgaWYgKCgoKlBDUk9QQ29uZmlnKSAmIEZMQVNIX0JBTktfQk9USCkgPT0gRkxBU0hfQkFOS18xKSB7DQotICAgICAgcmVnX3ZhbHVlID0gKFJFQURfUkVHKEZMQVNILT5QQ1JPUDFTUikgJiBGTEFTSF9QQ1JPUDFTUl9QQ1JPUDFfU1RSVCk7DQotICAgICAgKlBDUk9QU3RhcnRBZGRyID0gKHJlZ192YWx1ZSA8PCAzKSArIGJhbmsxX2FkZHI7DQotDQotICAgICAgcmVnX3ZhbHVlID0gKFJFQURfUkVHKEZMQVNILT5QQ1JPUDFFUikgJiBGTEFTSF9QQ1JPUDFFUl9QQ1JPUDFfRU5EKTsNCi0gICAgICAqUENST1BFbmRBZGRyID0gKHJlZ192YWx1ZSA8PCAzKSArIGJhbmsxX2FkZHI7DQotICAgIH0NCi0jaWYgZGVmaW5lZChGTEFTSF9PUFRSX0RCQU5LKQ0KLSAgICBlbHNlIGlmICgoKCpQQ1JPUENvbmZpZykgJiBGTEFTSF9CQU5LX0JPVEgpID09IEZMQVNIX0JBTktfMikgew0KLSAgICAgIHJlZ192YWx1ZSA9IChSRUFEX1JFRyhGTEFTSC0+UENST1AyU1IpICYgRkxBU0hfUENST1AyU1JfUENST1AyX1NUUlQpOw0KLSAgICAgICpQQ1JPUFN0YXJ0QWRkciA9IChyZWdfdmFsdWUgPDwgMykgKyBiYW5rMl9hZGRyOw0KLQ0KLSAgICAgIHJlZ192YWx1ZSA9IChSRUFEX1JFRyhGTEFTSC0+UENST1AyRVIpICYgRkxBU0hfUENST1AyRVJfUENST1AyX0VORCk7DQotICAgICAgKlBDUk9QRW5kQWRkciA9IChyZWdfdmFsdWUgPDwgMykgKyBiYW5rMl9hZGRyOw0KLSAgICB9DQotI2VuZGlmDQotICAgIGVsc2Ugew0KLSAgICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8NCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgKlBDUk9QQ29uZmlnIHw9IChSRUFEX1JFRyhGTEFTSC0+UENST1AxRVIpICYgRkxBU0hfUENST1AxRVJfUENST1BfUkRQKTsNCi19DQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLSNlbmRpZiAvKiBIQUxfRkxBU0hfTU9EVUxFX0VOQUJMRUQgKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZzR4eF9oYWxfZmxhc2hfZXguYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgRXh0ZW5kZWQgRkxBU0ggSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgRkxBU0ggZXh0ZW5kZWQgcGVyaXBoZXJhbDoKKyAgKiAgICAgICAgICAgKyBFeHRlbmRlZCBwcm9ncmFtbWluZyBvcGVyYXRpb25zIGZ1bmN0aW9ucworICAqCisgIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAjIyMjIyBGbGFzaCBFeHRlbmRlZCBmZWF0dXJlcyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBbLi5dIENvbXBhcmluZyB0byBvdGhlciBwcmV2aW91cyBkZXZpY2VzLCB0aGUgRkxBU0ggaW50ZXJmYWNlIGZvciBTVE0zMkc0eHgKKyAgICAgICBkZXZpY2VzIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBmZWF0dXJlcworCisgICAgICAgKCspIENhcGFjaXR5IHVwIHRvIDUxMiBLYnl0ZXMgd2l0aCBkdWFsIGJhbmsgYXJjaGl0ZWN0dXJlIHN1cHBvcnRpbmcKKyAgcmVhZC13aGlsZS13cml0ZSBjYXBhYmlsaXR5IChSV1cpCisgICAgICAgKCspIER1YWwgYmFuayA2NC1iaXRzIG1lbW9yeSBvcmdhbml6YXRpb24gd2l0aCBwb3NzaWJpbGl0eSBvZiBzaW5nbGUgYmFuaworICAxMjgtYml0cworICAgICAgICgrKSBQcm90ZWN0ZWQgYXJlYXMgaW5jbHVkaW5nIFdSUCwgUENST1AgYW5kIFNlY3VyYWJsZSBtZW1vcnkKKworICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXSBUaGlzIGRyaXZlciBwcm92aWRlcyBmdW5jdGlvbnMgdG8gY29uZmlndXJlIGFuZCBwcm9ncmFtIHRoZSBGTEFTSCBtZW1vcnkKKyAgICAgICBvZiBhbGwgU1RNMzJHNHh4IGRldmljZXMuIEl0IGluY2x1ZGVzCisgICAgICAoIykgRmxhc2ggTWVtb3J5IEVyYXNlIGZ1bmN0aW9uczoKKyAgICAgICAgICAgKCsrKSBMb2NrIGFuZCBVbmxvY2sgdGhlIEZMQVNIIGludGVyZmFjZSB1c2luZyBIQUxfRkxBU0hfVW5sb2NrKCkgYW5kCisgICAgICAgICAgICAgICAgSEFMX0ZMQVNIX0xvY2soKSBmdW5jdGlvbnMKKyAgICAgICAgICAgKCsrKSBFcmFzZSBmdW5jdGlvbjogRXJhc2UgcGFnZXMsIG9yIG1hc3MgZXJhc2UgYmFua3MKKyAgICAgICAgICAgKCsrKSBUaGVyZSBhcmUgdHdvIG1vZGVzIG9mIGVyYXNlIDoKKyAgICAgICAgICAgICAoKysrKSBQb2xsaW5nIE1vZGUgdXNpbmcgSEFMX0ZMQVNIRXhfRXJhc2UoKQorICAgICAgICAgICAgICgrKyspIEludGVycnVwdCBNb2RlIHVzaW5nIEhBTF9GTEFTSEV4X0VyYXNlX0lUKCkKKworICAgICAgKCMpIE9wdGlvbiBCeXRlcyBQcm9ncmFtbWluZyBmdW5jdGlvbjogVXNlIEhBTF9GTEFTSEV4X09CUHJvZ3JhbSgpIHRvOgorICAgICAgICAoKyspIENvbmZpZ3VyZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBhcmVhcyAoV1JQKQorICAgICAgICAoKyspIFNldCB0aGUgUmVhZCBwcm90ZWN0aW9uIExldmVsIChSRFApCisgICAgICAgICgrKykgUHJvZ3JhbSB0aGUgdXNlciBPcHRpb24gQnl0ZXMKKyAgICAgICAgKCsrKSBDb25maWd1cmUgdGhlIFByb3ByaWV0YXJ5IENvZGUgUmVhZE91dCBwcm90ZWN0aW9uIGFyZWFzIChQQ1JPUCkKKyAgICAgICAgKCsrKSBDb25maWd1cmUgdGhlIFNlY3VyYWJsZSBtZW1vcnkgYXJlYXMKKyAgICAgICAgKCsrKSBDb25maWd1cmUgdGhlIEJvb3QgTG9jaworCisgICAgICAoIykgR2V0IE9wdGlvbiBCeXRlcyBDb25maWd1cmF0aW9uIGZ1bmN0aW9uOiBVc2UgSEFMX0ZMQVNIRXhfT0JHZXRDb25maWcoKQorICB0bzoKKyAgICAgICAgKCsrKSBHZXQgdGhlIGNvbmZpZ3VyYXRpb24gb2Ygd3JpdGUgcHJvdGVjdGlvbiBhcmVhcyAoV1JQKQorICAgICAgICAoKyspIEdldCB0aGUgbGV2ZWwgb2YgcmVhZCBwcm90ZWN0aW9uIChSRFApCisgICAgICAgICgrKykgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgdXNlciBPcHRpb24gQnl0ZXMKKyAgICAgICAgKCsrKSBHZXQgdGhlIGNvbmZpZ3VyYXRpb24gb2YgUHJvcHJpZXRhcnkgQ29kZSBSZWFkT3V0IFByb3RlY3Rpb24gYXJlYXMKKyAgKFBDUk9QKQorICAgICAgICAoKyspIEdldCB0aGUgY29uZmlndXJhdGlvbiBvZiBTZWN1cmFibGUgbWVtb3J5IGFyZWFzCisgICAgICAgICgrKykgR2V0IHRoZSBzdGF0dXMgb2YgQm9vdCBMb2NrCisKKyAgICAgICgjKSBBY3RpdmF0aW9uIG9mIFNlY3VyYWJsZSBtZW1vcnkgYXJlYTogVXNlCisgIEhBTF9GTEFTSEV4X0VuYWJsZVNlY01lbVByb3RlY3Rpb24oKQorICAgICAgICAoKyspIERlbnkgdGhlIGFjY2VzcyB0byBzZWN1cmFibGUgbWVtb3J5IGFyZWEKKworICAgICAgKCMpIEVuYWJsZSBvciBkaXNhYmxlIGRlYnVnZ2VyOiBVc2UgSEFMX0ZMQVNIRXhfRW5hYmxlRGVidWdnZXIoKSBvcgorICAgICAgICAgIEhBTF9GTEFTSEV4X0Rpc2FibGVEZWJ1Z2dlcigpCisKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGVybXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZQorICBpbgorICAqIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4KKyAgKiBJZiBubyBMSUNFTlNFIGZpbGUgY29tZXMgd2l0aCB0aGlzIHNvZnR3YXJlLCBpdCBpcyBwcm92aWRlZCBBUy1JUy4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnNHh4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHNHh4X0hBTF9Ecml2ZXIKKyAqIEB7CisgKi8KKworLyoqIEBkZWZncm91cCBGTEFTSEV4IEZMQVNIRXgKKyAqIEBicmllZiBGTEFTSCBFeHRlbmRlZCBIQUwgbW9kdWxlIGRyaXZlcgorICogQHsKKyAqLworCisjaWZkZWYgSEFMX0ZMQVNIX01PRFVMRV9FTkFCTEVECisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBGTEFTSEV4X1ByaXZhdGVfRnVuY3Rpb25zIEZMQVNIRXggUHJpdmF0ZSBGdW5jdGlvbnMKKyAqIEB7CisgKi8KK3N0YXRpYyB2b2lkIEZMQVNIX01hc3NFcmFzZSh1aW50MzJfdCBCYW5rcyk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgRkxBU0hfT0JfV1JQQ29uZmlnKHVpbnQzMl90IFdSUEFyZWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFdSUFN0YXJ0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBXUkRQRW5kT2Zmc2V0KTsKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBGTEFTSF9PQl9SRFBDb25maWcodWludDMyX3QgUkRQTGV2ZWwpOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIEZMQVNIX09CX1VzZXJDb25maWcodWludDMyX3QgVXNlclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBVc2VyQ29uZmlnKTsKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBGTEFTSF9PQl9QQ1JPUENvbmZpZyh1aW50MzJfdCBQQ1JPUENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQQ1JPUFN0YXJ0QWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQQ1JPUEVuZEFkZHIpOworc3RhdGljIHZvaWQgRkxBU0hfT0JfR2V0V1JQKHVpbnQzMl90IFdSUEFyZWEsIHVpbnQzMl90ICpXUlBTdGFydE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqV1JEUEVuZE9mZnNldCk7CitzdGF0aWMgdWludDMyX3QgRkxBU0hfT0JfR2V0UkRQKHZvaWQpOworc3RhdGljIHVpbnQzMl90IEZMQVNIX09CX0dldFVzZXIodm9pZCk7CitzdGF0aWMgdm9pZCBGTEFTSF9PQl9HZXRQQ1JPUCh1aW50MzJfdCAqUENST1BDb25maWcsIHVpbnQzMl90ICpQQ1JPUFN0YXJ0QWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpQQ1JPUEVuZEFkZHIpOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIEZMQVNIX09CX1NlY01lbUNvbmZpZyh1aW50MzJfdCBTZWNNZW1CYW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBTZWNNZW1TaXplKTsKK3N0YXRpYyB2b2lkIEZMQVNIX09CX0dldFNlY01lbSh1aW50MzJfdCBTZWNNZW1CYW5rLCB1aW50MzJfdCAqU2VjTWVtU2l6ZSk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgRkxBU0hfT0JfQm9vdExvY2tDb25maWcodWludDMyX3QgQm9vdExvY2tDb25maWcpOworc3RhdGljIHVpbnQzMl90IEZMQVNIX09CX0dldEJvb3RMb2NrKHZvaWQpOworCisvKioKKyAqIEB9CisgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBGTEFTSEV4X0V4cG9ydGVkX0Z1bmN0aW9ucyBGTEFTSEV4IEV4cG9ydGVkIEZ1bmN0aW9ucworICogQHsKKyAqLworCisvKiogQGRlZmdyb3VwIEZMQVNIRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBFeHRlbmRlZCBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCisgICogQGJyaWVmICAgRXh0ZW5kZWQgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgIyMjIyMgRXh0ZW5kZWQgcHJvZ3JhbW1pbmcgb3BlcmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBtYW5hZ2UgdGhlIEV4dGVuZGVkCitGTEFTSCBwcm9ncmFtbWluZyBvcGVyYXRpb25zIE9wZXJhdGlvbnMuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisvKioKKyAqIEBicmllZiAgUGVyZm9ybSBhIG1hc3MgZXJhc2Ugb3IgZXJhc2UgdGhlIHNwZWNpZmllZCBGTEFTSCBtZW1vcnkgcGFnZXMuCisgKiBAcGFyYW1baW5dICBwRXJhc2VJbml0IHBvaW50ZXIgdG8gYW4gRkxBU0hfRXJhc2VJbml0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdAorICogICAgICAgICBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGVyYXNpbmcuCisgKiBAcGFyYW1bb3V0XSAgUGFnZUVycm9yIHBvaW50ZXIgdG8gdmFyaWFibGUgdGhhdCBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbgorICogICAgICAgICBpbmZvcm1hdGlvbiBvbiBmYXVsdHkgcGFnZSBpbiBjYXNlIG9mIGVycm9yICgweEZGRkZGRkZGIG1lYW5zIHRoYXQKKyAqIGFsbCB0aGUgcGFnZXMgaGF2ZSBiZWVuIGNvcnJlY3RseSBlcmFzZWQpLgorICogQHJldHZhbCBIQUxfU3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GTEFTSEV4X0VyYXNlKEZMQVNIX0VyYXNlSW5pdFR5cGVEZWYgKnBFcmFzZUluaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqUGFnZUVycm9yKSB7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1czsKKyAgdWludDMyX3QgcGFnZV9pbmRleDsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfRkxBU0hfVFlQRUVSQVNFKHBFcmFzZUluaXQtPlR5cGVFcmFzZSkpOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soJnBGbGFzaCk7CisKKyAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovCisgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKCh1aW50MzJfdClGTEFTSF9USU1FT1VUX1ZBTFVFKTsKKworICBpZiAoc3RhdHVzID09IEhBTF9PSykgeworICAgIHBGbGFzaC5FcnJvckNvZGUgPSBIQUxfRkxBU0hfRVJST1JfTk9ORTsKKworICAgIC8qIERlYWN0aXZhdGUgdGhlIGNhY2hlIGlmIHRoZXkgYXJlIGFjdGl2YXRlZCB0byBhdm9pZCBkYXRhIG1pc2JlaGF2aW9yICovCisgICAgaWYgKFJFQURfQklUKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9JQ0VOKSAhPSAwVSkgeworICAgICAgaWYgKFJFQURfQklUKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9EQ0VOKSAhPSAwVSkgeworICAgICAgICAvKiBEaXNhYmxlIGRhdGEgY2FjaGUgICovCisgICAgICAgIF9fSEFMX0ZMQVNIX0RBVEFfQ0FDSEVfRElTQUJMRSgpOworICAgICAgICBwRmxhc2guQ2FjaGVUb1JlYWN0aXZhdGUgPSBGTEFTSF9DQUNIRV9JQ0FDSEVfRENBQ0hFX0VOQUJMRUQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBwRmxhc2guQ2FjaGVUb1JlYWN0aXZhdGUgPSBGTEFTSF9DQUNIRV9JQ0FDSEVfRU5BQkxFRDsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKFJFQURfQklUKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9EQ0VOKSAhPSAwVSkgeworICAgICAgLyogRGlzYWJsZSBkYXRhIGNhY2hlICAqLworICAgICAgX19IQUxfRkxBU0hfREFUQV9DQUNIRV9ESVNBQkxFKCk7CisgICAgICBwRmxhc2guQ2FjaGVUb1JlYWN0aXZhdGUgPSBGTEFTSF9DQUNIRV9EQ0FDSEVfRU5BQkxFRDsKKyAgICB9IGVsc2UgeworICAgICAgcEZsYXNoLkNhY2hlVG9SZWFjdGl2YXRlID0gRkxBU0hfQ0FDSEVfRElTQUJMRUQ7CisgICAgfQorCisgICAgaWYgKHBFcmFzZUluaXQtPlR5cGVFcmFzZSA9PSBGTEFTSF9UWVBFRVJBU0VfTUFTU0VSQVNFKSB7CisgICAgICAvKiBNYXNzIGVyYXNlIHRvIGJlIGRvbmUgKi8KKyAgICAgIEZMQVNIX01hc3NFcmFzZShwRXJhc2VJbml0LT5CYW5rcyk7CisKKyAgICAgIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLworICAgICAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oKHVpbnQzMl90KUZMQVNIX1RJTUVPVVRfVkFMVUUpOworCisjaWYgZGVmaW5lZChGTEFTSF9PUFRSX0RCQU5LKQorICAgICAgLyogSWYgdGhlIGVyYXNlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQsIGRpc2FibGUgdGhlIE1FUjEgYW5kIE1FUjIgQml0cyAqLworICAgICAgQ0xFQVJfQklUKEZMQVNILT5DUiwgKEZMQVNIX0NSX01FUjEgfCBGTEFTSF9DUl9NRVIyKSk7CisjZWxzZQorICAgICAgLyogSWYgdGhlIGVyYXNlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQsIGRpc2FibGUgdGhlIE1FUjEgQml0ICovCisgICAgICBDTEVBUl9CSVQoRkxBU0gtPkNSLCAoRkxBU0hfQ1JfTUVSMSkpOworI2VuZGlmCisgICAgfSBlbHNlIHsKKyAgICAgIC8qSW5pdGlhbGl6YXRpb24gb2YgUGFnZUVycm9yIHZhcmlhYmxlKi8KKyAgICAgICpQYWdlRXJyb3IgPSAweEZGRkZGRkZGVTsKKworICAgICAgZm9yIChwYWdlX2luZGV4ID0gcEVyYXNlSW5pdC0+UGFnZTsKKyAgICAgICAgICAgcGFnZV9pbmRleCA8IChwRXJhc2VJbml0LT5QYWdlICsgcEVyYXNlSW5pdC0+TmJQYWdlcyk7CisgICAgICAgICAgIHBhZ2VfaW5kZXgrKykgeworICAgICAgICBGTEFTSF9QYWdlRXJhc2UocGFnZV9pbmRleCwgcEVyYXNlSW5pdC0+QmFua3MpOworCisgICAgICAgIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLworICAgICAgICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbigodWludDMyX3QpRkxBU0hfVElNRU9VVF9WQUxVRSk7CisKKyAgICAgICAgLyogSWYgdGhlIGVyYXNlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQsIGRpc2FibGUgdGhlIFBFUiBCaXQgKi8KKyAgICAgICAgQ0xFQVJfQklUKEZMQVNILT5DUiwgKEZMQVNIX0NSX1BFUiB8IEZMQVNIX0NSX1BOQikpOworCisgICAgICAgIGlmIChzdGF0dXMgIT0gSEFMX09LKSB7CisgICAgICAgICAgLyogSW4gY2FzZSBvZiBlcnJvciwgc3RvcCBlcmFzZSBwcm9jZWR1cmUgYW5kIHJldHVybiB0aGUgZmF1bHR5IHBhZ2UKKyAgICAgICAgICAgKi8KKyAgICAgICAgICAqUGFnZUVycm9yID0gcGFnZV9pbmRleDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8qIEZsdXNoIHRoZSBjYWNoZXMgdG8gYmUgc3VyZSBvZiB0aGUgZGF0YSBjb25zaXN0ZW5jeSAqLworICAgIEZMQVNIX0ZsdXNoQ2FjaGVzKCk7CisgIH0KKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSygmcEZsYXNoKTsKKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIEBicmllZiAgUGVyZm9ybSBhIG1hc3MgZXJhc2Ugb3IgZXJhc2UgdGhlIHNwZWNpZmllZCBGTEFTSCBtZW1vcnkgcGFnZXMgd2l0aAorICogaW50ZXJydXB0IGVuYWJsZWQuCisgKiBAcGFyYW0gIHBFcmFzZUluaXQgcG9pbnRlciB0byBhbiBGTEFTSF9FcmFzZUluaXRUeXBlRGVmIHN0cnVjdHVyZSB0aGF0CisgKiAgICAgICAgIGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgZXJhc2luZy4KKyAqIEByZXR2YWwgSEFMX1N0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkxBU0hFeF9FcmFzZV9JVChGTEFTSF9FcmFzZUluaXRUeXBlRGVmICpwRXJhc2VJbml0KSB7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKCZwRmxhc2gpOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19GTEFTSF9UWVBFRVJBU0UocEVyYXNlSW5pdC0+VHlwZUVyYXNlKSk7CisKKyAgcEZsYXNoLkVycm9yQ29kZSA9IEhBTF9GTEFTSF9FUlJPUl9OT05FOworCisgIC8qIERlYWN0aXZhdGUgdGhlIGNhY2hlIGlmIHRoZXkgYXJlIGFjdGl2YXRlZCB0byBhdm9pZCBkYXRhIG1pc2JlaGF2aW9yICovCisgIGlmIChSRUFEX0JJVChGTEFTSC0+QUNSLCBGTEFTSF9BQ1JfSUNFTikgIT0gMFUpIHsKKyAgICBpZiAoUkVBRF9CSVQoRkxBU0gtPkFDUiwgRkxBU0hfQUNSX0RDRU4pICE9IDBVKSB7CisgICAgICAvKiBEaXNhYmxlIGRhdGEgY2FjaGUgICovCisgICAgICBfX0hBTF9GTEFTSF9EQVRBX0NBQ0hFX0RJU0FCTEUoKTsKKyAgICAgIHBGbGFzaC5DYWNoZVRvUmVhY3RpdmF0ZSA9IEZMQVNIX0NBQ0hFX0lDQUNIRV9EQ0FDSEVfRU5BQkxFRDsKKyAgICB9IGVsc2UgeworICAgICAgcEZsYXNoLkNhY2hlVG9SZWFjdGl2YXRlID0gRkxBU0hfQ0FDSEVfSUNBQ0hFX0VOQUJMRUQ7CisgICAgfQorICB9IGVsc2UgaWYgKFJFQURfQklUKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9EQ0VOKSAhPSAwVSkgeworICAgIC8qIERpc2FibGUgZGF0YSBjYWNoZSAgKi8KKyAgICBfX0hBTF9GTEFTSF9EQVRBX0NBQ0hFX0RJU0FCTEUoKTsKKyAgICBwRmxhc2guQ2FjaGVUb1JlYWN0aXZhdGUgPSBGTEFTSF9DQUNIRV9EQ0FDSEVfRU5BQkxFRDsKKyAgfSBlbHNlIHsKKyAgICBwRmxhc2guQ2FjaGVUb1JlYWN0aXZhdGUgPSBGTEFTSF9DQUNIRV9ESVNBQkxFRDsKKyAgfQorCisgIC8qIEVuYWJsZSBFbmQgb2YgT3BlcmF0aW9uIGFuZCBFcnJvciBpbnRlcnJ1cHRzICovCisgIF9fSEFMX0ZMQVNIX0VOQUJMRV9JVChGTEFTSF9JVF9FT1AgfCBGTEFTSF9JVF9PUEVSUik7CisKKyAgcEZsYXNoLkJhbmsgPSBwRXJhc2VJbml0LT5CYW5rczsKKworICBpZiAocEVyYXNlSW5pdC0+VHlwZUVyYXNlID09IEZMQVNIX1RZUEVFUkFTRV9NQVNTRVJBU0UpIHsKKyAgICAvKiBNYXNzIGVyYXNlIHRvIGJlIGRvbmUgKi8KKyAgICBwRmxhc2guUHJvY2VkdXJlT25Hb2luZyA9IEZMQVNIX1BST0NfTUFTU19FUkFTRTsKKyAgICBGTEFTSF9NYXNzRXJhc2UocEVyYXNlSW5pdC0+QmFua3MpOworICB9IGVsc2UgeworICAgIC8qIEVyYXNlIGJ5IHBhZ2UgdG8gYmUgZG9uZSAqLworICAgIHBGbGFzaC5Qcm9jZWR1cmVPbkdvaW5nID0gRkxBU0hfUFJPQ19QQUdFX0VSQVNFOworICAgIHBGbGFzaC5OYlBhZ2VzVG9FcmFzZSA9IHBFcmFzZUluaXQtPk5iUGFnZXM7CisgICAgcEZsYXNoLlBhZ2UgPSBwRXJhc2VJbml0LT5QYWdlOworCisgICAgLypFcmFzZSAxc3QgcGFnZSBhbmQgd2FpdCBmb3IgSVQgKi8KKyAgICBGTEFTSF9QYWdlRXJhc2UocEVyYXNlSW5pdC0+UGFnZSwgcEVyYXNlSW5pdC0+QmFua3MpOworICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBAYnJpZWYgIFByb2dyYW0gT3B0aW9uIGJ5dGVzLgorICogQHBhcmFtICBwT0JJbml0IHBvaW50ZXIgdG8gYW4gRkxBU0hfT0JJbml0U3RydWN0IHN0cnVjdHVyZSB0aGF0CisgKiAgICAgICAgIGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgcHJvZ3JhbW1pbmcuCisgKiBAbm90ZSAgIFRvIGNvbmZpZ3VyZSBhbnkgb3B0aW9uIGJ5dGVzLCB0aGUgb3B0aW9uIGxvY2sgYml0IE9QVExPQ0sgbXVzdCBiZQorICogICAgICAgICBjbGVhcmVkIHdpdGggdGhlIGNhbGwgb2YgSEFMX0ZMQVNIX09CX1VubG9jaygpIGZ1bmN0aW9uLgorICogQG5vdGUgICBOZXcgb3B0aW9uIGJ5dGVzIGNvbmZpZ3VyYXRpb24gd2lsbCBiZSB0YWtlbiBpbnRvIGFjY291bnQgaW4gdHdvCisgKiBjYXNlczoKKyAqICAgICAgICAgLSBhZnRlciBhbiBvcHRpb24gYnl0ZXMgbGF1bmNoIHRocm91Z2ggdGhlIGNhbGwgb2YKKyAqIEhBTF9GTEFTSF9PQl9MYXVuY2goKQorICogICAgICAgICAtIGFmdGVyIGEgcG93ZXIgcmVzZXQgKEJPUiByZXNldCBvciBleGl0IGZyb20gU3RhbmRieS9TaHV0ZG93biBtb2RlcykKKyAqIEByZXR2YWwgSEFMX1N0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkxBU0hFeF9PQlByb2dyYW0oRkxBU0hfT0JQcm9ncmFtSW5pdFR5cGVEZWYgKnBPQkluaXQpIHsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19PUFRJT05CWVRFKHBPQkluaXQtPk9wdGlvblR5cGUpKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKCZwRmxhc2gpOworCisgIHBGbGFzaC5FcnJvckNvZGUgPSBIQUxfRkxBU0hfRVJST1JfTk9ORTsKKworICAvKiBXcml0ZSBwcm90ZWN0aW9uIGNvbmZpZ3VyYXRpb24gKi8KKyAgaWYgKChwT0JJbml0LT5PcHRpb25UeXBlICYgT1BUSU9OQllURV9XUlApICE9IDBVKSB7CisgICAgLyogQ29uZmlndXJlIG9mIFdyaXRlIHByb3RlY3Rpb24gb24gdGhlIHNlbGVjdGVkIGFyZWEgKi8KKyAgICBpZiAoRkxBU0hfT0JfV1JQQ29uZmlnKHBPQkluaXQtPldSUEFyZWEsIHBPQkluaXQtPldSUFN0YXJ0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcE9CSW5pdC0+V1JQRW5kT2Zmc2V0KSAhPSBIQUxfT0spIHsKKyAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICB9CisgIH0KKworICAvKiBSZWFkIHByb3RlY3Rpb24gY29uZmlndXJhdGlvbiAqLworICBpZiAoKHBPQkluaXQtPk9wdGlvblR5cGUgJiBPUFRJT05CWVRFX1JEUCkgIT0gMFUpIHsKKyAgICAvKiBDb25maWd1cmUgdGhlIFJlYWQgcHJvdGVjdGlvbiBsZXZlbCAqLworICAgIGlmIChGTEFTSF9PQl9SRFBDb25maWcocE9CSW5pdC0+UkRQTGV2ZWwpICE9IEhBTF9PSykgeworICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgIH0KKyAgfQorCisgIC8qIFVzZXIgQ29uZmlndXJhdGlvbiAqLworICBpZiAoKHBPQkluaXQtPk9wdGlvblR5cGUgJiBPUFRJT05CWVRFX1VTRVIpICE9IDBVKSB7CisgICAgLyogQ29uZmlndXJlIHRoZSB1c2VyIG9wdGlvbiBieXRlcyAqLworICAgIGlmIChGTEFTSF9PQl9Vc2VyQ29uZmlnKHBPQkluaXQtPlVTRVJUeXBlLCBwT0JJbml0LT5VU0VSQ29uZmlnKSAhPSBIQUxfT0spIHsKKyAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICB9CisgIH0KKworICAvKiBQQ1JPUCBDb25maWd1cmF0aW9uICovCisgIGlmICgocE9CSW5pdC0+T3B0aW9uVHlwZSAmIE9QVElPTkJZVEVfUENST1ApICE9IDBVKSB7CisgICAgaWYgKHBPQkluaXQtPlBDUk9QU3RhcnRBZGRyICE9IHBPQkluaXQtPlBDUk9QRW5kQWRkcikgeworICAgICAgLyogQ29uZmlndXJlIHRoZSBQcm9wcmlldGFyeSBjb2RlIHJlYWRvdXQgcHJvdGVjdGlvbiAqLworICAgICAgaWYgKEZMQVNIX09CX1BDUk9QQ29uZmlnKHBPQkluaXQtPlBDUk9QQ29uZmlnLCBwT0JJbml0LT5QQ1JPUFN0YXJ0QWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT0JJbml0LT5QQ1JPUEVuZEFkZHIpICE9IEhBTF9PSykgeworICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogU2VjdXJhYmxlIG1lbW9yeSBDb25maWd1cmF0aW9uICovCisgIGlmICgocE9CSW5pdC0+T3B0aW9uVHlwZSAmIE9QVElPTkJZVEVfU0VDKSAhPSAwVSkgeworICAgIC8qIENvbmZpZ3VyZSB0aGUgc2VjdXJhYmxlIG1lbW9yeSBhcmVhICovCisgICAgaWYgKEZMQVNIX09CX1NlY01lbUNvbmZpZyhwT0JJbml0LT5TZWNCYW5rLCBwT0JJbml0LT5TZWNTaXplKSAhPSBIQUxfT0spIHsKKyAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICB9CisgIH0KKworICAvKiBCb290IEVudHJ5IFBvaW50IENvbmZpZ3VyYXRpb24gKi8KKyAgaWYgKChwT0JJbml0LT5PcHRpb25UeXBlICYgT1BUSU9OQllURV9CT09UX0xPQ0spICE9IDBVKSB7CisgICAgLyogQ29uZmlndXJlIHRoZSBib290IHVuaXF1ZSBlbnRyeSBwb2ludCBvcHRpb24gKi8KKyAgICBpZiAoRkxBU0hfT0JfQm9vdExvY2tDb25maWcocE9CSW5pdC0+Qm9vdEVudHJ5UG9pbnQpICE9IEhBTF9PSykgeworICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgIH0KKyAgfQorCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKCZwRmxhc2gpOworCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgdGhlIE9wdGlvbiBieXRlcyBjb25maWd1cmF0aW9uLgorICogQHBhcmFtICBwT0JJbml0IHBvaW50ZXIgdG8gYW4gRkxBU0hfT0JJbml0U3RydWN0IHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoZQorICogICAgICAgICBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLgorICogQG5vdGUgICBUaGUgZmllbGRzIHBPQkluaXQtPldSUEFyZWEgYW5kIHBPQkluaXQtPlBDUk9QQ29uZmlnIHNob3VsZCBpbmRpY2F0ZQorICogICAgICAgICB3aGljaCBhcmVhIGlzIHJlcXVlc3RlZCBmb3IgdGhlIFdSUCBhbmQgUENST1AsIGVsc2Ugbm8gaW5mb3JtYXRpb24KKyAqIHdpbGwgYmUgcmV0dXJuZWQuCisgKiBAcmV0dmFsIE5vbmUKKyAqLwordm9pZCBIQUxfRkxBU0hFeF9PQkdldENvbmZpZyhGTEFTSF9PQlByb2dyYW1Jbml0VHlwZURlZiAqcE9CSW5pdCkgeworICBwT0JJbml0LT5PcHRpb25UeXBlID0gKE9QVElPTkJZVEVfUkRQIHwgT1BUSU9OQllURV9VU0VSKTsKKworI2lmIGRlZmluZWQoRkxBU0hfT1BUUl9EQkFOSykKKyAgaWYgKChwT0JJbml0LT5XUlBBcmVhID09IE9CX1dSUEFSRUFfQkFOSzFfQVJFQUEpIHx8CisgICAgICAocE9CSW5pdC0+V1JQQXJlYSA9PSBPQl9XUlBBUkVBX0JBTksxX0FSRUFCKSB8fAorICAgICAgKHBPQkluaXQtPldSUEFyZWEgPT0gT0JfV1JQQVJFQV9CQU5LMl9BUkVBQSkgfHwKKyAgICAgIChwT0JJbml0LT5XUlBBcmVhID09IE9CX1dSUEFSRUFfQkFOSzJfQVJFQUIpKQorI2Vsc2UKKyAgaWYgKChwT0JJbml0LT5XUlBBcmVhID09IE9CX1dSUEFSRUFfQkFOSzFfQVJFQUEpIHx8CisgICAgICAocE9CSW5pdC0+V1JQQXJlYSA9PSBPQl9XUlBBUkVBX0JBTksxX0FSRUFCKSkKKyNlbmRpZgorICB7CisgICAgcE9CSW5pdC0+T3B0aW9uVHlwZSB8PSBPUFRJT05CWVRFX1dSUDsKKyAgICAvKiBHZXQgd3JpdGUgcHJvdGVjdGlvbiBvbiB0aGUgc2VsZWN0ZWQgYXJlYSAqLworICAgIEZMQVNIX09CX0dldFdSUChwT0JJbml0LT5XUlBBcmVhLCAmKHBPQkluaXQtPldSUFN0YXJ0T2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgICAgJihwT0JJbml0LT5XUlBFbmRPZmZzZXQpKTsKKyAgfQorCisgIC8qIEdldCBSZWFkIHByb3RlY3Rpb24gbGV2ZWwgKi8KKyAgcE9CSW5pdC0+UkRQTGV2ZWwgPSBGTEFTSF9PQl9HZXRSRFAoKTsKKworICAvKiBHZXQgdGhlIHVzZXIgb3B0aW9uIGJ5dGVzICovCisgIHBPQkluaXQtPlVTRVJDb25maWcgPSBGTEFTSF9PQl9HZXRVc2VyKCk7CisKKyNpZiBkZWZpbmVkKEZMQVNIX09QVFJfREJBTkspCisgIGlmICgocE9CSW5pdC0+UENST1BDb25maWcgPT0gRkxBU0hfQkFOS18xKSB8fAorICAgICAgKHBPQkluaXQtPlBDUk9QQ29uZmlnID09IEZMQVNIX0JBTktfMikpCisjZWxzZQorICBpZiAocE9CSW5pdC0+UENST1BDb25maWcgPT0gRkxBU0hfQkFOS18xKQorI2VuZGlmCisgIHsKKyAgICBwT0JJbml0LT5PcHRpb25UeXBlIHw9IE9QVElPTkJZVEVfUENST1A7CisgICAgLyogR2V0IHRoZSBQcm9wcmlldGFyeSBjb2RlIHJlYWRvdXQgcHJvdGVjdGlvbiAqLworICAgIEZMQVNIX09CX0dldFBDUk9QKCYocE9CSW5pdC0+UENST1BDb25maWcpLCAmKHBPQkluaXQtPlBDUk9QU3RhcnRBZGRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAmKHBPQkluaXQtPlBDUk9QRW5kQWRkcikpOworICB9CisKKyAgcE9CSW5pdC0+T3B0aW9uVHlwZSB8PSBPUFRJT05CWVRFX0JPT1RfTE9DSzsKKworICAvKiBHZXQgdGhlIGJvb3QgZW50cnkgcG9pbnQgKi8KKyAgcE9CSW5pdC0+Qm9vdEVudHJ5UG9pbnQgPSBGTEFTSF9PQl9HZXRCb290TG9jaygpOworCisgIC8qIEdldCB0aGUgc2VjdXJhYmxlIG1lbW9yeSBhcmVhIGNvbmZpZ3VyYXRpb24gKi8KKyNpZiBkZWZpbmVkKEZMQVNIX09QVFJfREJBTkspCisgIGlmICgocE9CSW5pdC0+U2VjQmFuayA9PSBGTEFTSF9CQU5LXzEpIHx8IChwT0JJbml0LT5TZWNCYW5rID09IEZMQVNIX0JBTktfMikpCisjZWxzZQorICBpZiAocE9CSW5pdC0+U2VjQmFuayA9PSBGTEFTSF9CQU5LXzEpCisjZW5kaWYKKyAgeworICAgIHBPQkluaXQtPk9wdGlvblR5cGUgfD0gT1BUSU9OQllURV9TRUM7CisgICAgRkxBU0hfT0JfR2V0U2VjTWVtKHBPQkluaXQtPlNlY0JhbmssICYocE9CSW5pdC0+U2VjU2l6ZSkpOworICB9Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgdGhlIEZMQVNIIFNlY3VyYWJsZSBNZW1vcnkgcHJvdGVjdGlvbi4KKyAqIEBwYXJhbSAgQmFuazogQmFuayB0byBiZSBwcm90ZWN0ZWQKKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgRkxBU0hfQkFOS18xOiBCYW5rMSB0byBiZSBwcm90ZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBGTEFTSF9CQU5LXzI6IEJhbmsyIHRvIGJlIHByb3RlY3RlZCAoKikKKyAqICAgICAgICAgICAgQGFyZyBGTEFTSF9CQU5LX0JPVEg6IEJhbmsxIGFuZCBCYW5rMiB0byBiZSBwcm90ZWN0ZWQgKCopCisgKiBAbm90ZSAgICgqKSBhdmFpbGFiaWxpdHkgZGVwZW5kcyBvbiBkZXZpY2VzCisgKiBAcmV0dmFsIEhBTCBTdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIRXhfRW5hYmxlU2VjTWVtUHJvdGVjdGlvbih1aW50MzJfdCBCYW5rKSB7CisjaWYgZGVmaW5lZChGTEFTSF9PUFRSX0RCQU5LKQorICBpZiAoUkVBRF9CSVQoRkxBU0gtPk9QVFIsIEZMQVNIX09QVFJfREJBTkspICE9IDBVKSB7CisgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfRkxBU0hfQkFOSyhCYW5rKSk7CisKKyAgICAvKiBFbmFibGUgdGhlIFNlY3VyYWJsZSBNZW1vcnkgUHJvdGVjdGlvbiBCaXQgZm9yIHRoZSBiYW5rIDEgaWYgcmVxdWVzdGVkICovCisgICAgaWYgKChCYW5rICYgRkxBU0hfQkFOS18xKSAhPSAwVSkgeworICAgICAgU0VUX0JJVChGTEFTSC0+Q1IsIEZMQVNIX0NSX1NFQ19QUk9UMSk7CisgICAgfQorCisgICAgLyogRW5hYmxlIHRoZSBTZWN1cmFibGUgTWVtb3J5IFByb3RlY3Rpb24gQml0IGZvciB0aGUgYmFuayAyIGlmIHJlcXVlc3RlZCAqLworICAgIGlmICgoQmFuayAmIEZMQVNIX0JBTktfMikgIT0gMFUpIHsKKyAgICAgIFNFVF9CSVQoRkxBU0gtPkNSLCBGTEFTSF9DUl9TRUNfUFJPVDIpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBTRVRfQklUKEZMQVNILT5DUiwgRkxBU0hfQ1JfU0VDX1BST1QxKTsKKyAgfQorI2Vsc2UKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoQmFuayk7CisgIFNFVF9CSVQoRkxBU0gtPkNSLCBGTEFTSF9DUl9TRUNfUFJPVDEpOworI2VuZGlmIC8qIEZMQVNIX09QVFJfREJBTksgKi8KKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIERlYnVnZ2VyLgorICogQG5vdGUgICBBZnRlciBjYWxsaW5nIHRoaXMgQVBJLCBmbGFzaCBpbnRlcmZhY2UgYWxsb3cgZGVidWdnZXIgaW50cnVzaW9uLgorICogQHJldHZhbCBOb25lCisgKi8KK3ZvaWQgSEFMX0ZMQVNIRXhfRW5hYmxlRGVidWdnZXIodm9pZCkgeyBGTEFTSC0+QUNSIHw9IEZMQVNIX0FDUl9EQkdfU1dFTjsgfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBEZWJ1Z2dlci4KKyAqIEBub3RlICAgQWZ0ZXIgY2FsbGluZyB0aGlzIEFQSSwgRGVidWdnZXIgaXMgZGlzYWJsZWQ6IGl0J3Mgbm8gbW9yZSBwb3NzaWJsZQorICogdG8gYnJlYWssIHNlZSBDUFUgcmVnaXN0ZXIsIGV0Yy4uLgorICogQHJldHZhbCBOb25lCisgKi8KK3ZvaWQgSEFMX0ZMQVNIRXhfRGlzYWJsZURlYnVnZ2VyKHZvaWQpIHsgRkxBU0gtPkFDUiAmPSB+RkxBU0hfQUNSX0RCR19TV0VOOyB9CisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBhZGR0b2dyb3VwIEZMQVNIRXhfUHJpdmF0ZV9GdW5jdGlvbnMKKyAqIEB7CisgKi8KKy8qKgorICogQGJyaWVmICBNYXNzIGVyYXNlIG9mIEZMQVNIIG1lbW9yeS4KKyAqIEBwYXJhbSAgQmFua3MgQmFua3MgdG8gYmUgZXJhc2VkLgorICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIEZMQVNIX0JBTktfMTogQmFuazEgdG8gYmUgZXJhc2VkCisgKiAgICAgICAgICAgIEBhcmcgRkxBU0hfQkFOS18yOiBCYW5rMiB0byBiZSBlcmFzZWQgKCopCisgKiAgICAgICAgICAgIEBhcmcgRkxBU0hfQkFOS19CT1RIOiBCYW5rMSBhbmQgQmFuazIgdG8gYmUgZXJhc2VkICgqKQorICogQG5vdGUgICAoKikgYXZhaWxhYmlsaXR5IGRlcGVuZHMgb24gZGV2aWNlcworICogQHJldHZhbCBOb25lCisgKi8KK3N0YXRpYyB2b2lkIEZMQVNIX01hc3NFcmFzZSh1aW50MzJfdCBCYW5rcykgeworI2lmIGRlZmluZWQoRkxBU0hfT1BUUl9EQkFOSykKKyAgaWYgKFJFQURfQklUKEZMQVNILT5PUFRSLCBGTEFTSF9PUFRSX0RCQU5LKSAhPSAwVSkKKyNlbmRpZgorICB7CisgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfRkxBU0hfQkFOSyhCYW5rcykpOworCisgICAgLyogU2V0IHRoZSBNYXNzIEVyYXNlIEJpdCBmb3IgdGhlIGJhbmsgMSBpZiByZXF1ZXN0ZWQgKi8KKyAgICBpZiAoKEJhbmtzICYgRkxBU0hfQkFOS18xKSAhPSAwVSkgeworICAgICAgU0VUX0JJVChGTEFTSC0+Q1IsIEZMQVNIX0NSX01FUjEpOworICAgIH0KKworI2lmIGRlZmluZWQoRkxBU0hfT1BUUl9EQkFOSykKKyAgICAvKiBTZXQgdGhlIE1hc3MgRXJhc2UgQml0IGZvciB0aGUgYmFuayAyIGlmIHJlcXVlc3RlZCAqLworICAgIGlmICgoQmFua3MgJiBGTEFTSF9CQU5LXzIpICE9IDBVKSB7CisgICAgICBTRVRfQklUKEZMQVNILT5DUiwgRkxBU0hfQ1JfTUVSMik7CisgICAgfQorI2VuZGlmCisgIH0KKyNpZiBkZWZpbmVkKEZMQVNIX09QVFJfREJBTkspCisgIGVsc2UgeworICAgIFNFVF9CSVQoRkxBU0gtPkNSLCAoRkxBU0hfQ1JfTUVSMSB8IEZMQVNIX0NSX01FUjIpKTsKKyAgfQorI2VuZGlmCisKKyAgLyogUHJvY2VlZCB0byBlcmFzZSBhbGwgc2VjdG9ycyAqLworICBTRVRfQklUKEZMQVNILT5DUiwgRkxBU0hfQ1JfU1RSVCk7Cit9CisKKy8qKgorICogQGJyaWVmICBFcmFzZSB0aGUgc3BlY2lmaWVkIEZMQVNIIG1lbW9yeSBwYWdlLgorICogQHBhcmFtICBQYWdlIEZMQVNIIHBhZ2UgdG8gZXJhc2UuCisgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIChtYXggbnVtYmVyIG9mIHBhZ2VzIGluCisgKiB0aGUgYmFuayAtIDEpLgorICogQHBhcmFtICBCYW5rcyBCYW5rIHdoZXJlIHRoZSBwYWdlIHdpbGwgYmUgZXJhc2VkLgorICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIEZMQVNIX0JBTktfMTogUGFnZSBpbiBiYW5rIDEgdG8gYmUgZXJhc2VkCisgKiAgICAgICAgICAgIEBhcmcgRkxBU0hfQkFOS18yOiBQYWdlIGluIGJhbmsgMiB0byBiZSBlcmFzZWQgKCopCisgKiBAbm90ZSAgICgqKSBhdmFpbGFiaWxpdHkgZGVwZW5kcyBvbiBkZXZpY2VzCisgKiBAcmV0dmFsIE5vbmUKKyAqLwordm9pZCBGTEFTSF9QYWdlRXJhc2UodWludDMyX3QgUGFnZSwgdWludDMyX3QgQmFua3MpIHsKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0ZMQVNIX1BBR0UoUGFnZSkpOworCisjaWYgZGVmaW5lZChGTEFTSF9PUFRSX0RCQU5LKQorICBpZiAoUkVBRF9CSVQoRkxBU0gtPk9QVFIsIEZMQVNIX09QVFJfREJBTkspID09IDBVKSB7CisgICAgQ0xFQVJfQklUKEZMQVNILT5DUiwgRkxBU0hfQ1JfQktFUik7CisgIH0gZWxzZSB7CisgICAgYXNzZXJ0X3BhcmFtKElTX0ZMQVNIX0JBTktfRVhDTFVTSVZFKEJhbmtzKSk7CisKKyAgICBpZiAoKEJhbmtzICYgRkxBU0hfQkFOS18xKSAhPSAwVSkgeworICAgICAgQ0xFQVJfQklUKEZMQVNILT5DUiwgRkxBU0hfQ1JfQktFUik7CisgICAgfSBlbHNlIHsKKyAgICAgIFNFVF9CSVQoRkxBU0gtPkNSLCBGTEFTSF9DUl9CS0VSKTsKKyAgICB9CisgIH0KKyNlbHNlCisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKEJhbmtzKTsKKyNlbmRpZiAvKiBGTEFTSF9PUFRSX0RCQU5LICovCisKKyAgLyogUHJvY2VlZCB0byBlcmFzZSB0aGUgcGFnZSAqLworICBNT0RJRllfUkVHKEZMQVNILT5DUiwgRkxBU0hfQ1JfUE5CLCAoKFBhZ2UgJiAweEZGVSkgPDwgRkxBU0hfQ1JfUE5CX1BvcykpOworICBTRVRfQklUKEZMQVNILT5DUiwgRkxBU0hfQ1JfUEVSKTsKKyAgU0VUX0JJVChGTEFTSC0+Q1IsIEZMQVNIX0NSX1NUUlQpOworfQorCisvKioKKyAqIEBicmllZiAgRmx1c2ggdGhlIGluc3RydWN0aW9uIGFuZCBkYXRhIGNhY2hlcy4KKyAqIEByZXR2YWwgTm9uZQorICovCit2b2lkIEZMQVNIX0ZsdXNoQ2FjaGVzKHZvaWQpIHsKKyAgRkxBU0hfQ2FjaGVUeXBlRGVmIGNhY2hlID0gcEZsYXNoLkNhY2hlVG9SZWFjdGl2YXRlOworCisgIC8qIEZsdXNoIGluc3RydWN0aW9uIGNhY2hlICAqLworICBpZiAoKGNhY2hlID09IEZMQVNIX0NBQ0hFX0lDQUNIRV9FTkFCTEVEKSB8fAorICAgICAgKGNhY2hlID09IEZMQVNIX0NBQ0hFX0lDQUNIRV9EQ0FDSEVfRU5BQkxFRCkpIHsKKyAgICAvKiBEaXNhYmxlIGluc3RydWN0aW9uIGNhY2hlICovCisgICAgX19IQUxfRkxBU0hfSU5TVFJVQ1RJT05fQ0FDSEVfRElTQUJMRSgpOworICAgIC8qIFJlc2V0IGluc3RydWN0aW9uIGNhY2hlICovCisgICAgX19IQUxfRkxBU0hfSU5TVFJVQ1RJT05fQ0FDSEVfUkVTRVQoKTsKKyAgICAvKiBFbmFibGUgaW5zdHJ1Y3Rpb24gY2FjaGUgKi8KKyAgICBfX0hBTF9GTEFTSF9JTlNUUlVDVElPTl9DQUNIRV9FTkFCTEUoKTsKKyAgfQorCisgIC8qIEZsdXNoIGRhdGEgY2FjaGUgKi8KKyAgaWYgKChjYWNoZSA9PSBGTEFTSF9DQUNIRV9EQ0FDSEVfRU5BQkxFRCkgfHwKKyAgICAgIChjYWNoZSA9PSBGTEFTSF9DQUNIRV9JQ0FDSEVfRENBQ0hFX0VOQUJMRUQpKSB7CisgICAgLyogUmVzZXQgZGF0YSBjYWNoZSAqLworICAgIF9fSEFMX0ZMQVNIX0RBVEFfQ0FDSEVfUkVTRVQoKTsKKyAgICAvKiBFbmFibGUgZGF0YSBjYWNoZSAqLworICAgIF9fSEFMX0ZMQVNIX0RBVEFfQ0FDSEVfRU5BQkxFKCk7CisgIH0KKworICAvKiBSZXNldCBpbnRlcm5hbCB2YXJpYWJsZSAqLworICBwRmxhc2guQ2FjaGVUb1JlYWN0aXZhdGUgPSBGTEFTSF9DQUNIRV9ESVNBQkxFRDsKK30KKworLyoqCisgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBhcmVhIGludG8gT3B0aW9uIEJ5dGVzLgorICogQG5vdGUgICBXaGVuIHRoZSBtZW1vcnkgcmVhZCBwcm90ZWN0aW9uIGxldmVsIGlzIHNlbGVjdGVkIChSRFAgbGV2ZWwgPSAxKSwKKyAqICAgICAgICAgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHByb2dyYW0gb3IgZXJhc2UgRmxhc2ggbWVtb3J5IGlmIHRoZSBDUFUgZGVidWcKKyAqICAgICAgICAgZmVhdHVyZXMgYXJlIGNvbm5lY3RlZCAoSlRBRyBvciBzaW5nbGUgd2lyZSkgb3IgYm9vdCBjb2RlIGlzIGJlaW5nCisgKiAgICAgICAgIGV4ZWN1dGVkIGZyb20gUkFNIG9yIFN5c3RlbSBmbGFzaCwgZXZlbiBpZiBXUlAgaXMgbm90IGFjdGl2YXRlZC4KKyAqIEBub3RlICAgVG8gY29uZmlndXJlIGFueSBvcHRpb24gYnl0ZXMsIHRoZSBvcHRpb24gbG9jayBiaXQgT1BUTE9DSyBtdXN0IGJlCisgKiAgICAgICAgIGNsZWFyZWQgd2l0aCB0aGUgY2FsbCBvZiBIQUxfRkxBU0hfT0JfVW5sb2NrKCkgZnVuY3Rpb24uCisgKiBAbm90ZSAgIE5ldyBvcHRpb24gYnl0ZXMgY29uZmlndXJhdGlvbiB3aWxsIGJlIHRha2VuIGludG8gYWNjb3VudCBpbiB0d28KKyAqIGNhc2VzOgorICogICAgICAgICAtIGFmdGVyIGFuIG9wdGlvbiBieXRlcyBsYXVuY2ggdGhyb3VnaCB0aGUgY2FsbCBvZgorICogSEFMX0ZMQVNIX09CX0xhdW5jaCgpCisgKiAgICAgICAgIC0gYWZ0ZXIgYSBwb3dlciByZXNldCAoQk9SIHJlc2V0IG9yIGV4aXQgZnJvbSBTdGFuZGJ5L1NodXRkb3duIG1vZGVzKQorICogQHBhcmFtICBXUlBBcmVhIHNwZWNpZmllcyB0aGUgYXJlYSB0byBiZSBjb25maWd1cmVkLgorICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIE9CX1dSUEFSRUFfQkFOSzFfQVJFQUE6IEZsYXNoIEJhbmsgMSBBcmVhIEEKKyAqICAgICAgICAgICAgQGFyZyBPQl9XUlBBUkVBX0JBTksxX0FSRUFCOiBGbGFzaCBCYW5rIDEgQXJlYSBCCisgKiAgICAgICAgICAgIEBhcmcgT0JfV1JQQVJFQV9CQU5LMl9BUkVBQTogRmxhc2ggQmFuayAyIEFyZWEgQSAoKikKKyAqICAgICAgICAgICAgQGFyZyBPQl9XUlBBUkVBX0JBTksyX0FSRUFCOiBGbGFzaCBCYW5rIDIgQXJlYSBCICgqKQorICogQG5vdGUgICAoKikgYXZhaWxhYmlsaXR5IGRlcGVuZHMgb24gZGV2aWNlcworICogQHBhcmFtICBXUlBTdGFydE9mZnNldCBzcGVjaWZpZXMgdGhlIHN0YXJ0IHBhZ2Ugb2YgdGhlIHdyaXRlIHByb3RlY3RlZCBhcmVhLgorICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgcGFnZSBudW1iZXIgYmV0d2VlbiAwIGFuZCAobWF4IG51bWJlciBvZiBwYWdlcworICogaW4gdGhlIGJhbmsgLSAxKS4KKyAqIEBwYXJhbSAgV1JEUEVuZE9mZnNldCBzcGVjaWZpZXMgdGhlIGVuZCBwYWdlIG9mIHRoZSB3cml0ZSBwcm90ZWN0ZWQgYXJlYS4KKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHBhZ2UgbnVtYmVyIGJldHdlZW4gV1JQU3RhcnRPZmZzZXQgYW5kIChtYXgKKyAqIG51bWJlciBvZiBwYWdlcyBpbiB0aGUgYmFuayAtIDEpLgorICogQHJldHZhbCBIQUxfU3RhdHVzCisgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBGTEFTSF9PQl9XUlBDb25maWcodWludDMyX3QgV1JQQXJlYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgV1JQU3RhcnRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFdSRFBFbmRPZmZzZXQpIHsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19PQl9XUlBBUkVBKFdSUEFyZWEpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZMQVNIX1BBR0UoV1JQU3RhcnRPZmZzZXQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZMQVNIX1BBR0UoV1JEUEVuZE9mZnNldCkpOworCisgIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLworICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbigodWludDMyX3QpRkxBU0hfVElNRU9VVF9WQUxVRSk7CisKKyAgaWYgKHN0YXR1cyA9PSBIQUxfT0spIHsKKyAgICAvKiBDb25maWd1cmUgdGhlIHdyaXRlIHByb3RlY3RlZCBhcmVhICovCisgICAgaWYgKFdSUEFyZWEgPT0gT0JfV1JQQVJFQV9CQU5LMV9BUkVBQSkgeworICAgICAgRkxBU0gtPldSUDFBUiA9CisgICAgICAgICAgKChXUkRQRW5kT2Zmc2V0IDw8IEZMQVNIX1dSUDFBUl9XUlAxQV9FTkRfUG9zKSB8IFdSUFN0YXJ0T2Zmc2V0KTsKKyAgICB9IGVsc2UgaWYgKFdSUEFyZWEgPT0gT0JfV1JQQVJFQV9CQU5LMV9BUkVBQikgeworICAgICAgRkxBU0gtPldSUDFCUiA9CisgICAgICAgICAgKChXUkRQRW5kT2Zmc2V0IDw8IEZMQVNIX1dSUDFCUl9XUlAxQl9FTkRfUG9zKSB8IFdSUFN0YXJ0T2Zmc2V0KTsKKyAgICB9CisjaWYgZGVmaW5lZChGTEFTSF9PUFRSX0RCQU5LKQorICAgIGVsc2UgaWYgKFdSUEFyZWEgPT0gT0JfV1JQQVJFQV9CQU5LMl9BUkVBQSkgeworICAgICAgRkxBU0gtPldSUDJBUiA9CisgICAgICAgICAgKChXUkRQRW5kT2Zmc2V0IDw8IEZMQVNIX1dSUDJBUl9XUlAyQV9FTkRfUG9zKSB8IFdSUFN0YXJ0T2Zmc2V0KTsKKyAgICB9IGVsc2UgaWYgKFdSUEFyZWEgPT0gT0JfV1JQQVJFQV9CQU5LMl9BUkVBQikgeworICAgICAgRkxBU0gtPldSUDJCUiA9CisgICAgICAgICAgKChXUkRQRW5kT2Zmc2V0IDw8IEZMQVNIX1dSUDJCUl9XUlAyQl9FTkRfUG9zKSB8IFdSUFN0YXJ0T2Zmc2V0KTsKKyAgICB9CisjZW5kaWYKKyAgICBlbHNlIHsKKyAgICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgICB9CisKKyAgICAvKiBTZXQgT1BUU1RSVCBCaXQgKi8KKyAgICBTRVRfQklUKEZMQVNILT5DUiwgRkxBU0hfQ1JfT1BUU1RSVCk7CisKKyAgICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8KKyAgICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbigodWludDMyX3QpRkxBU0hfVElNRU9VVF9WQUxVRSk7CisgIH0KKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIEBicmllZiAgU2V0IHRoZSByZWFkIHByb3RlY3Rpb24gbGV2ZWwgaW50byBPcHRpb24gQnl0ZXMuCisgKiBAbm90ZSAgIFRvIGNvbmZpZ3VyZSBhbnkgb3B0aW9uIGJ5dGVzLCB0aGUgb3B0aW9uIGxvY2sgYml0IE9QVExPQ0sgbXVzdCBiZQorICogICAgICAgICBjbGVhcmVkIHdpdGggdGhlIGNhbGwgb2YgSEFMX0ZMQVNIX09CX1VubG9jaygpIGZ1bmN0aW9uLgorICogQG5vdGUgICBOZXcgb3B0aW9uIGJ5dGVzIGNvbmZpZ3VyYXRpb24gd2lsbCBiZSB0YWtlbiBpbnRvIGFjY291bnQgaW4gdHdvCisgKiBjYXNlczoKKyAqICAgICAgICAgLSBhZnRlciBhbiBvcHRpb24gYnl0ZXMgbGF1bmNoIHRocm91Z2ggdGhlIGNhbGwgb2YKKyAqIEhBTF9GTEFTSF9PQl9MYXVuY2goKQorICogICAgICAgICAtIGFmdGVyIGEgcG93ZXIgcmVzZXQgKEJPUiByZXNldCBvciBleGl0IGZyb20gU3RhbmRieS9TaHV0ZG93biBtb2RlcykKKyAqIEBub3RlICAgISEhIFdhcm5pbmcgOiBXaGVuIGVuYWJsaW5nIE9CX1JEUCBsZXZlbCAyIGl0J3Mgbm8gbW9yZSBwb3NzaWJsZQorICogICAgICAgICB0byBnbyBiYWNrIHRvIGxldmVsIDEgb3IgMCAhISEKKyAqIEBwYXJhbSAgUkRQTGV2ZWwgc3BlY2lmaWVzIHRoZSByZWFkIHByb3RlY3Rpb24gbGV2ZWwuCisgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgT0JfUkRQX0xFVkVMXzA6IE5vIHByb3RlY3Rpb24KKyAqICAgICAgICAgICAgQGFyZyBPQl9SRFBfTEVWRUxfMTogTWVtb3J5IFJlYWQgcHJvdGVjdGlvbgorICogICAgICAgICAgICBAYXJnIE9CX1JEUF9MRVZFTF8yOiBGdWxsIGNoaXAgcHJvdGVjdGlvbgorICoKKyAqIEByZXR2YWwgSEFMX1N0YXR1cworICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgRkxBU0hfT0JfUkRQQ29uZmlnKHVpbnQzMl90IFJEUExldmVsKSB7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1czsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfT0JfUkRQX0xFVkVMKFJEUExldmVsKSk7CisKKyAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovCisgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKCh1aW50MzJfdClGTEFTSF9USU1FT1VUX1ZBTFVFKTsKKworICBpZiAoc3RhdHVzID09IEhBTF9PSykgeworICAgIC8qIENvbmZpZ3VyZSB0aGUgUkRQIGxldmVsIGluIHRoZSBvcHRpb24gYnl0ZXMgcmVnaXN0ZXIgKi8KKyAgICBNT0RJRllfUkVHKEZMQVNILT5PUFRSLCBGTEFTSF9PUFRSX1JEUCwgUkRQTGV2ZWwpOworCisgICAgLyogU2V0IE9QVFNUUlQgQml0ICovCisgICAgU0VUX0JJVChGTEFTSC0+Q1IsIEZMQVNIX0NSX09QVFNUUlQpOworCisgICAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovCisgICAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oKHVpbnQzMl90KUZMQVNIX1RJTUVPVVRfVkFMVUUpOworICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBAYnJpZWYgIFByb2dyYW0gdGhlIEZMQVNIIFVzZXIgT3B0aW9uIEJ5dGVzLgorICogQG5vdGUgICBUbyBjb25maWd1cmUgYW55IG9wdGlvbiBieXRlcywgdGhlIG9wdGlvbiBsb2NrIGJpdCBPUFRMT0NLIG11c3QgYmUKKyAqICAgICAgICAgY2xlYXJlZCB3aXRoIHRoZSBjYWxsIG9mIEhBTF9GTEFTSF9PQl9VbmxvY2soKSBmdW5jdGlvbi4KKyAqIEBub3RlICAgTmV3IG9wdGlvbiBieXRlcyBjb25maWd1cmF0aW9uIHdpbGwgYmUgdGFrZW4gaW50byBhY2NvdW50IGluIHR3bworICogY2FzZXM6CisgKiAgICAgICAgIC0gYWZ0ZXIgYW4gb3B0aW9uIGJ5dGVzIGxhdW5jaCB0aHJvdWdoIHRoZSBjYWxsIG9mCisgKiBIQUxfRkxBU0hfT0JfTGF1bmNoKCkKKyAqICAgICAgICAgLSBhZnRlciBhIHBvd2VyIHJlc2V0IChCT1IgcmVzZXQgb3IgZXhpdCBmcm9tIFN0YW5kYnkvU2h1dGRvd24gbW9kZXMpCisgKiBAcGFyYW0gIFVzZXJUeXBlIFRoZSBGTEFTSCBVc2VyIE9wdGlvbiBCeXRlcyB0byBiZSBtb2RpZmllZC4KKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgQHJlZiBGTEFTSF9PQl9VU0VSX1R5cGUuCisgKiBAcGFyYW0gIFVzZXJDb25maWcgVGhlIHNlbGVjdGVkIFVzZXIgT3B0aW9uIEJ5dGVzIHZhbHVlczoKKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgQHJlZiBGTEFTSF9PQl9VU0VSX0JPUl9MRVZFTCwKKyAqICAgICAgICAgQHJlZiBGTEFTSF9PQl9VU0VSX25SU1RfU1RPUCwgQHJlZiBGTEFTSF9PQl9VU0VSX25SU1RfU1RBTkRCWSAsCisgKiAgICAgICAgIEByZWYgRkxBU0hfT0JfVVNFUl9uUlNUX1NIVVRET1dOLCBAcmVmIEZMQVNIX09CX1VTRVJfSVdER19TVywKKyAqICAgICAgICAgQHJlZiBGTEFTSF9PQl9VU0VSX0lXREdfU1RPUCwgQHJlZiBGTEFTSF9PQl9VU0VSX0lXREdfU1RBTkRCWSwKKyAqICAgICAgICAgQHJlZiBGTEFTSF9PQl9VU0VSX1dXREdfU1csIEByZWYgRkxBU0hfT0JfVVNFUl9XV0RHX1NXLAorICogICAgICAgICBAcmVmIEZMQVNIX09CX1VTRVJfQkZCMiAoKiksIEByZWYgRkxBU0hfT0JfVVNFUl9uQk9PVDEsCisgKiAgICAgICAgIEByZWYgRkxBU0hfT0JfVVNFUl9TUkFNX1BFLCBAcmVmIEZMQVNIX09CX1VTRVJfQ0NNU1JBTV9SU1QsCisgKiAgICAgICAgIEByZWYgRkxBU0hfT0JfVVNFUl9uU1dCT09UMCwgQHJlZiBGTEFTSF9PQl9VU0VSX25CT09UMCwKKyAqICAgICAgICAgQHJlZiBGTEFTSF9PQl9VU0VSX05SU1RfTU9ERSwgQHJlZgorICogRkxBU0hfT0JfVVNFUl9JTlRFUk5BTF9SRVNFVF9IT0xERVIKKyAqIEBub3RlICAgKCopIGF2YWlsYWJpbGl0eSBkZXBlbmRzIG9uIGRldmljZXMKKyAqIEByZXR2YWwgSEFMX1N0YXR1cworICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgRkxBU0hfT0JfVXNlckNvbmZpZyh1aW50MzJfdCBVc2VyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFVzZXJDb25maWcpIHsKKyAgdWludDMyX3Qgb3B0cl9yZWdfdmFsID0gMDsKKyAgdWludDMyX3Qgb3B0cl9yZWdfbWFzayA9IDA7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1czsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfT0JfVVNFUl9UWVBFKFVzZXJUeXBlKSk7CisKKyAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovCisgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKCh1aW50MzJfdClGTEFTSF9USU1FT1VUX1ZBTFVFKTsKKworICBpZiAoc3RhdHVzID09IEhBTF9PSykgeworI2lmIGRlZmluZWQoRkxBU0hfT1BUUl9QQjRfUFVQRU4pCisgICAgaWYgKChVc2VyVHlwZSAmIE9CX1VTRVJfUEI0X1BVUEVOKSAhPSAwVSkgeworICAgICAgLyogUEI0X1BVUEVOIG9wdGlvbiBieXRlIHNob3VsZCBiZSBtb2RpZmllZCAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX09CX1VTRVJfUEI0X1BVUEVOKFVzZXJDb25maWcgJiBGTEFTSF9PUFRSX1BCNF9QVVBFTikpOworCisgICAgICAvKiBTZXQgdmFsdWUgYW5kIG1hc2sgZm9yIFBCNF9QVVBFTiBvcHRpb24gYnl0ZSAqLworICAgICAgb3B0cl9yZWdfdmFsIHw9IChVc2VyQ29uZmlnICYgRkxBU0hfT1BUUl9QQjRfUFVQRU4pOworICAgICAgb3B0cl9yZWdfbWFzayB8PSBGTEFTSF9PUFRSX1BCNF9QVVBFTjsKKyAgICB9CisjZW5kaWYgLyogRkxBU0hfT1BUUl9QQjRfUFVQRU4gKi8KKworICAgIGlmICgoVXNlclR5cGUgJiBPQl9VU0VSX0JPUl9MRVYpICE9IDBVKSB7CisgICAgICAvKiBCT1IgbGV2ZWwgb3B0aW9uIGJ5dGUgc2hvdWxkIGJlIG1vZGlmaWVkICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfT0JfVVNFUl9CT1JfTEVWRUwoVXNlckNvbmZpZyAmIEZMQVNIX09QVFJfQk9SX0xFVikpOworCisgICAgICAvKiBTZXQgdmFsdWUgYW5kIG1hc2sgZm9yIEJPUiBsZXZlbCBvcHRpb24gYnl0ZSAqLworICAgICAgb3B0cl9yZWdfdmFsIHw9IChVc2VyQ29uZmlnICYgRkxBU0hfT1BUUl9CT1JfTEVWKTsKKyAgICAgIG9wdHJfcmVnX21hc2sgfD0gRkxBU0hfT1BUUl9CT1JfTEVWOworICAgIH0KKworICAgIGlmICgoVXNlclR5cGUgJiBPQl9VU0VSX25SU1RfU1RPUCkgIT0gMFUpIHsKKyAgICAgIC8qIG5SU1RfU1RPUCBvcHRpb24gYnl0ZSBzaG91bGQgYmUgbW9kaWZpZWQgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19PQl9VU0VSX1NUT1AoVXNlckNvbmZpZyAmIEZMQVNIX09QVFJfblJTVF9TVE9QKSk7CisKKyAgICAgIC8qIFNldCB2YWx1ZSBhbmQgbWFzayBmb3IgblJTVF9TVE9QIG9wdGlvbiBieXRlICovCisgICAgICBvcHRyX3JlZ192YWwgfD0gKFVzZXJDb25maWcgJiBGTEFTSF9PUFRSX25SU1RfU1RPUCk7CisgICAgICBvcHRyX3JlZ19tYXNrIHw9IEZMQVNIX09QVFJfblJTVF9TVE9QOworICAgIH0KKworICAgIGlmICgoVXNlclR5cGUgJiBPQl9VU0VSX25SU1RfU1REQlkpICE9IDBVKSB7CisgICAgICAvKiBuUlNUX1NUREJZIG9wdGlvbiBieXRlIHNob3VsZCBiZSBtb2RpZmllZCAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX09CX1VTRVJfU1RBTkRCWShVc2VyQ29uZmlnICYgRkxBU0hfT1BUUl9uUlNUX1NUREJZKSk7CisKKyAgICAgIC8qIFNldCB2YWx1ZSBhbmQgbWFzayBmb3IgblJTVF9TVERCWSBvcHRpb24gYnl0ZSAqLworICAgICAgb3B0cl9yZWdfdmFsIHw9IChVc2VyQ29uZmlnICYgRkxBU0hfT1BUUl9uUlNUX1NUREJZKTsKKyAgICAgIG9wdHJfcmVnX21hc2sgfD0gRkxBU0hfT1BUUl9uUlNUX1NUREJZOworICAgIH0KKworICAgIGlmICgoVXNlclR5cGUgJiBPQl9VU0VSX25SU1RfU0hEVykgIT0gMFUpIHsKKyAgICAgIC8qIG5SU1RfU0hEVyBvcHRpb24gYnl0ZSBzaG91bGQgYmUgbW9kaWZpZWQgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19PQl9VU0VSX1NIVVRET1dOKFVzZXJDb25maWcgJiBGTEFTSF9PUFRSX25SU1RfU0hEVykpOworCisgICAgICAvKiBTZXQgdmFsdWUgYW5kIG1hc2sgZm9yIG5SU1RfU0hEVyBvcHRpb24gYnl0ZSAqLworICAgICAgb3B0cl9yZWdfdmFsIHw9IChVc2VyQ29uZmlnICYgRkxBU0hfT1BUUl9uUlNUX1NIRFcpOworICAgICAgb3B0cl9yZWdfbWFzayB8PSBGTEFTSF9PUFRSX25SU1RfU0hEVzsKKyAgICB9CisKKyAgICBpZiAoKFVzZXJUeXBlICYgT0JfVVNFUl9JV0RHX1NXKSAhPSAwVSkgeworICAgICAgLyogSVdER19TVyBvcHRpb24gYnl0ZSBzaG91bGQgYmUgbW9kaWZpZWQgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19PQl9VU0VSX0lXREcoVXNlckNvbmZpZyAmIEZMQVNIX09QVFJfSVdER19TVykpOworCisgICAgICAvKiBTZXQgdmFsdWUgYW5kIG1hc2sgZm9yIElXREdfU1cgb3B0aW9uIGJ5dGUgKi8KKyAgICAgIG9wdHJfcmVnX3ZhbCB8PSAoVXNlckNvbmZpZyAmIEZMQVNIX09QVFJfSVdER19TVyk7CisgICAgICBvcHRyX3JlZ19tYXNrIHw9IEZMQVNIX09QVFJfSVdER19TVzsKKyAgICB9CisKKyAgICBpZiAoKFVzZXJUeXBlICYgT0JfVVNFUl9JV0RHX1NUT1ApICE9IDBVKSB7CisgICAgICAvKiBJV0RHX1NUT1Agb3B0aW9uIGJ5dGUgc2hvdWxkIGJlIG1vZGlmaWVkICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfT0JfVVNFUl9JV0RHX1NUT1AoVXNlckNvbmZpZyAmIEZMQVNIX09QVFJfSVdER19TVE9QKSk7CisKKyAgICAgIC8qIFNldCB2YWx1ZSBhbmQgbWFzayBmb3IgSVdER19TVE9QIG9wdGlvbiBieXRlICovCisgICAgICBvcHRyX3JlZ192YWwgfD0gKFVzZXJDb25maWcgJiBGTEFTSF9PUFRSX0lXREdfU1RPUCk7CisgICAgICBvcHRyX3JlZ19tYXNrIHw9IEZMQVNIX09QVFJfSVdER19TVE9QOworICAgIH0KKworICAgIGlmICgoVXNlclR5cGUgJiBPQl9VU0VSX0lXREdfU1REQlkpICE9IDBVKSB7CisgICAgICAvKiBJV0RHX1NUREJZIG9wdGlvbiBieXRlIHNob3VsZCBiZSBtb2RpZmllZCAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX09CX1VTRVJfSVdER19TVERCWShVc2VyQ29uZmlnICYgRkxBU0hfT1BUUl9JV0RHX1NUREJZKSk7CisKKyAgICAgIC8qIFNldCB2YWx1ZSBhbmQgbWFzayBmb3IgSVdER19TVERCWSBvcHRpb24gYnl0ZSAqLworICAgICAgb3B0cl9yZWdfdmFsIHw9IChVc2VyQ29uZmlnICYgRkxBU0hfT1BUUl9JV0RHX1NUREJZKTsKKyAgICAgIG9wdHJfcmVnX21hc2sgfD0gRkxBU0hfT1BUUl9JV0RHX1NUREJZOworICAgIH0KKworICAgIGlmICgoVXNlclR5cGUgJiBPQl9VU0VSX1dXREdfU1cpICE9IDBVKSB7CisgICAgICAvKiBXV0RHX1NXIG9wdGlvbiBieXRlIHNob3VsZCBiZSBtb2RpZmllZCAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX09CX1VTRVJfV1dERyhVc2VyQ29uZmlnICYgRkxBU0hfT1BUUl9XV0RHX1NXKSk7CisKKyAgICAgIC8qIFNldCB2YWx1ZSBhbmQgbWFzayBmb3IgV1dER19TVyBvcHRpb24gYnl0ZSAqLworICAgICAgb3B0cl9yZWdfdmFsIHw9IChVc2VyQ29uZmlnICYgRkxBU0hfT1BUUl9XV0RHX1NXKTsKKyAgICAgIG9wdHJfcmVnX21hc2sgfD0gRkxBU0hfT1BUUl9XV0RHX1NXOworICAgIH0KKworI2lmIGRlZmluZWQoRkxBU0hfT1BUUl9CRkIyKQorICAgIGlmICgoVXNlclR5cGUgJiBPQl9VU0VSX0JGQjIpICE9IDBVKSB7CisgICAgICAvKiBCRkIyIG9wdGlvbiBieXRlIHNob3VsZCBiZSBtb2RpZmllZCAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX09CX1VTRVJfQkZCMihVc2VyQ29uZmlnICYgRkxBU0hfT1BUUl9CRkIyKSk7CisKKyAgICAgIC8qIFNldCB2YWx1ZSBhbmQgbWFzayBmb3IgQkZCMiBvcHRpb24gYnl0ZSAqLworICAgICAgb3B0cl9yZWdfdmFsIHw9IChVc2VyQ29uZmlnICYgRkxBU0hfT1BUUl9CRkIyKTsKKyAgICAgIG9wdHJfcmVnX21hc2sgfD0gRkxBU0hfT1BUUl9CRkIyOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKChVc2VyVHlwZSAmIE9CX1VTRVJfbkJPT1QxKSAhPSAwVSkgeworICAgICAgLyogbkJPT1QxIG9wdGlvbiBieXRlIHNob3VsZCBiZSBtb2RpZmllZCAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX09CX1VTRVJfQk9PVDEoVXNlckNvbmZpZyAmIEZMQVNIX09QVFJfbkJPT1QxKSk7CisKKyAgICAgIC8qIFNldCB2YWx1ZSBhbmQgbWFzayBmb3IgbkJPT1QxIG9wdGlvbiBieXRlICovCisgICAgICBvcHRyX3JlZ192YWwgfD0gKFVzZXJDb25maWcgJiBGTEFTSF9PUFRSX25CT09UMSk7CisgICAgICBvcHRyX3JlZ19tYXNrIHw9IEZMQVNIX09QVFJfbkJPT1QxOworICAgIH0KKworICAgIGlmICgoVXNlclR5cGUgJiBPQl9VU0VSX1NSQU1fUEUpICE9IDBVKSB7CisgICAgICAvKiBTUkFNX1BFIG9wdGlvbiBieXRlIHNob3VsZCBiZSBtb2RpZmllZCAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX09CX1VTRVJfU1JBTV9QQVJJVFkoVXNlckNvbmZpZyAmIEZMQVNIX09QVFJfU1JBTV9QRSkpOworCisgICAgICAvKiBTZXQgdmFsdWUgYW5kIG1hc2sgZm9yIFNSQU1fUEUgb3B0aW9uIGJ5dGUgKi8KKyAgICAgIG9wdHJfcmVnX3ZhbCB8PSAoVXNlckNvbmZpZyAmIEZMQVNIX09QVFJfU1JBTV9QRSk7CisgICAgICBvcHRyX3JlZ19tYXNrIHw9IEZMQVNIX09QVFJfU1JBTV9QRTsKKyAgICB9CisgICAgaWYgKChVc2VyVHlwZSAmIE9CX1VTRVJfQ0NNU1JBTV9SU1QpICE9IDBVKSB7CisgICAgICAvKiBDQ01TUkFNX1JTVCBvcHRpb24gYnl0ZSBzaG91bGQgYmUgbW9kaWZpZWQgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19PQl9VU0VSX0NDTVNSQU1fUlNUKFVzZXJDb25maWcgJiBGTEFTSF9PUFRSX0NDTVNSQU1fUlNUKSk7CisKKyAgICAgIC8qIFNldCB2YWx1ZSBhbmQgbWFzayBmb3IgQ0NNU1JBTV9SU1Qgb3B0aW9uIGJ5dGUgKi8KKyAgICAgIG9wdHJfcmVnX3ZhbCB8PSAoVXNlckNvbmZpZyAmIEZMQVNIX09QVFJfQ0NNU1JBTV9SU1QpOworICAgICAgb3B0cl9yZWdfbWFzayB8PSBGTEFTSF9PUFRSX0NDTVNSQU1fUlNUOworICAgIH0KKyAgICBpZiAoKFVzZXJUeXBlICYgT0JfVVNFUl9uU1dCT09UMCkgIT0gMFUpIHsKKyAgICAgIC8qIG5TV0JPT1QwIG9wdGlvbiBieXRlIHNob3VsZCBiZSBtb2RpZmllZCAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX09CX1VTRVJfU1dCT09UMChVc2VyQ29uZmlnICYgRkxBU0hfT1BUUl9uU1dCT09UMCkpOworCisgICAgICAvKiBTZXQgdmFsdWUgYW5kIG1hc2sgZm9yIG5TV0JPT1QwIG9wdGlvbiBieXRlICovCisgICAgICBvcHRyX3JlZ192YWwgfD0gKFVzZXJDb25maWcgJiBGTEFTSF9PUFRSX25TV0JPT1QwKTsKKyAgICAgIG9wdHJfcmVnX21hc2sgfD0gRkxBU0hfT1BUUl9uU1dCT09UMDsKKyAgICB9CisKKyAgICBpZiAoKFVzZXJUeXBlICYgT0JfVVNFUl9uQk9PVDApICE9IDBVKSB7CisgICAgICAvKiBuQk9PVDAgb3B0aW9uIGJ5dGUgc2hvdWxkIGJlIG1vZGlmaWVkICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfT0JfVVNFUl9CT09UMChVc2VyQ29uZmlnICYgRkxBU0hfT1BUUl9uQk9PVDApKTsKKworICAgICAgLyogU2V0IHZhbHVlIGFuZCBtYXNrIGZvciBuQk9PVDAgb3B0aW9uIGJ5dGUgKi8KKyAgICAgIG9wdHJfcmVnX3ZhbCB8PSAoVXNlckNvbmZpZyAmIEZMQVNIX09QVFJfbkJPT1QwKTsKKyAgICAgIG9wdHJfcmVnX21hc2sgfD0gRkxBU0hfT1BUUl9uQk9PVDA7CisgICAgfQorCisgICAgaWYgKChVc2VyVHlwZSAmIE9CX1VTRVJfTlJTVF9NT0RFKSAhPSAwVSkgeworICAgICAgLyogUmVzZXQgQ29uZmlndXJhdGlvbiBvcHRpb24gYnl0ZSBzaG91bGQgYmUgbW9kaWZpZWQgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19PQl9VU0VSX05SU1RfTU9ERShVc2VyQ29uZmlnICYgRkxBU0hfT1BUUl9OUlNUX01PREUpKTsKKworICAgICAgLyogU2V0IHZhbHVlIGFuZCBtYXNrIGZvciBSZXNldCBDb25maWd1cmF0aW9uIG9wdGlvbiBieXRlICovCisgICAgICBvcHRyX3JlZ192YWwgfD0gKFVzZXJDb25maWcgJiBGTEFTSF9PUFRSX05SU1RfTU9ERSk7CisgICAgICBvcHRyX3JlZ19tYXNrIHw9IEZMQVNIX09QVFJfTlJTVF9NT0RFOworICAgIH0KKworICAgIGlmICgoVXNlclR5cGUgJiBPQl9VU0VSX0lSSEVOKSAhPSAwVSkgeworICAgICAgLyogSVJIIG9wdGlvbiBieXRlIHNob3VsZCBiZSBtb2RpZmllZCAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX09CX1VTRVJfSVJIRU4oVXNlckNvbmZpZyAmIEZMQVNIX09QVFJfSVJIRU4pKTsKKworICAgICAgLyogU2V0IHZhbHVlIGFuZCBtYXNrIGZvciBJUkggb3B0aW9uIGJ5dGUgKi8KKyAgICAgIG9wdHJfcmVnX3ZhbCB8PSAoVXNlckNvbmZpZyAmIEZMQVNIX09QVFJfSVJIRU4pOworICAgICAgb3B0cl9yZWdfbWFzayB8PSBGTEFTSF9PUFRSX0lSSEVOOworICAgIH0KKworICAgIC8qIENvbmZpZ3VyZSB0aGUgb3B0aW9uIGJ5dGVzIHJlZ2lzdGVyICovCisgICAgTU9ESUZZX1JFRyhGTEFTSC0+T1BUUiwgb3B0cl9yZWdfbWFzaywgb3B0cl9yZWdfdmFsKTsKKworICAgIC8qIFNldCBPUFRTVFJUIEJpdCAqLworICAgIFNFVF9CSVQoRkxBU0gtPkNSLCBGTEFTSF9DUl9PUFRTVFJUKTsKKworICAgIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLworICAgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKCh1aW50MzJfdClGTEFTSF9USU1FT1VUX1ZBTFVFKTsKKyAgfQorCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogQGJyaWVmICBDb25maWd1cmUgdGhlIFByb3ByaWV0YXJ5IGNvZGUgcmVhZG91dCBwcm90ZWN0aW9uIGFyZWEgaW50byBPcHRpb24KKyAqIEJ5dGVzLgorICogQG5vdGUgICBUbyBjb25maWd1cmUgYW55IG9wdGlvbiBieXRlcywgdGhlIG9wdGlvbiBsb2NrIGJpdCBPUFRMT0NLIG11c3QgYmUKKyAqICAgICAgICAgY2xlYXJlZCB3aXRoIHRoZSBjYWxsIG9mIEhBTF9GTEFTSF9PQl9VbmxvY2soKSBmdW5jdGlvbi4KKyAqIEBub3RlICAgTmV3IG9wdGlvbiBieXRlcyBjb25maWd1cmF0aW9uIHdpbGwgYmUgdGFrZW4gaW50byBhY2NvdW50IGluIHR3bworICogY2FzZXM6CisgKiAgICAgICAgIC0gYWZ0ZXIgYW4gb3B0aW9uIGJ5dGVzIGxhdW5jaCB0aHJvdWdoIHRoZSBjYWxsIG9mCisgKiBIQUxfRkxBU0hfT0JfTGF1bmNoKCkKKyAqICAgICAgICAgLSBhZnRlciBhIHBvd2VyIHJlc2V0IChCT1IgcmVzZXQgb3IgZXhpdCBmcm9tIFN0YW5kYnkvU2h1dGRvd24gbW9kZXMpCisgKiBAcGFyYW0gIFBDUk9QQ29uZmlnIHNwZWNpZmllcyB0aGUgY29uZmlndXJhdGlvbiAoQmFuayB0byBiZSBjb25maWd1cmVkIGFuZAorICogUENST1BfUkRQIG9wdGlvbikuIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBjb21iaW5hdGlvbiBvZiBGTEFTSF9CQU5LXzEgb3IKKyAqIEZMQVNIX0JBTktfMiAoKikgd2l0aCBPQl9QQ1JPUF9SRFBfTk9UX0VSQVNFIG9yIE9CX1BDUk9QX1JEUF9FUkFTRS4KKyAqIEBub3RlICAgKCopIGF2YWlsYWJpbGl0eSBkZXBlbmRzIG9uIGRldmljZXMKKyAqIEBwYXJhbSAgUENST1BTdGFydEFkZHIgc3BlY2lmaWVzIHRoZSBzdGFydCBhZGRyZXNzIG9mIHRoZSBQcm9wcmlldGFyeSBjb2RlCisgKiByZWFkb3V0IHByb3RlY3Rpb24uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbiBhZGRyZXNzIGJldHdlZW4gYmVnaW4gYW5kIGVuZCBvZgorICogdGhlIGJhbmsuCisgKiBAcGFyYW0gIFBDUk9QRW5kQWRkciBzcGVjaWZpZXMgdGhlIGVuZCBhZGRyZXNzIG9mIHRoZSBQcm9wcmlldGFyeSBjb2RlCisgKiByZWFkb3V0IHByb3RlY3Rpb24uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbiBhZGRyZXNzIGJldHdlZW4gUENST1BTdGFydEFkZHIKKyAqIGFuZCBlbmQgb2YgdGhlIGJhbmsuCisgKiBAcmV0dmFsIEhBTF9TdGF0dXMKKyAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIEZMQVNIX09CX1BDUk9QQ29uZmlnKHVpbnQzMl90IFBDUk9QQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFBDUk9QU3RhcnRBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFBDUk9QRW5kQWRkcikgeworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXM7CisgIHVpbnQzMl90IHJlZ192YWx1ZTsKKyAgdWludDMyX3QgYmFuazFfYWRkcjsKKyNpZiBkZWZpbmVkKEZMQVNIX09QVFJfREJBTkspCisgIHVpbnQzMl90IGJhbmsyX2FkZHI7CisjZW5kaWYKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfRkxBU0hfQkFOS19FWENMVVNJVkUoUENST1BDb25maWcgJiBGTEFTSF9CQU5LX0JPVEgpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX09CX1BDUk9QX1JEUChQQ1JPUENvbmZpZyAmIEZMQVNIX1BDUk9QMUVSX1BDUk9QX1JEUCkpOworICBhc3NlcnRfcGFyYW0oSVNfRkxBU0hfTUFJTl9NRU1fQUREUkVTUyhQQ1JPUFN0YXJ0QWRkcikpOworICBhc3NlcnRfcGFyYW0oSVNfRkxBU0hfTUFJTl9NRU1fQUREUkVTUyhQQ1JPUEVuZEFkZHIpKTsKKworICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8KKyAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oKHVpbnQzMl90KUZMQVNIX1RJTUVPVVRfVkFMVUUpOworCisgIGlmIChzdGF0dXMgPT0gSEFMX09LKSB7CisjaWYgZGVmaW5lZChGTEFTSF9PUFRSX0RCQU5LKQorICAgIC8qIEdldCB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGJhbmsgc3dhcHBpbmcgKi8KKyAgICBpZiAoUkVBRF9CSVQoU1lTQ0ZHLT5NRU1STVAsIFNZU0NGR19NRU1STVBfRkJfTU9ERSkgPT0gMFUpIHsKKyAgICAgIGJhbmsxX2FkZHIgPSBGTEFTSF9CQVNFOworICAgICAgYmFuazJfYWRkciA9IEZMQVNIX0JBU0UgKyBGTEFTSF9CQU5LX1NJWkU7CisgICAgfSBlbHNlIHsKKyAgICAgIGJhbmsxX2FkZHIgPSBGTEFTSF9CQVNFICsgRkxBU0hfQkFOS19TSVpFOworICAgICAgYmFuazJfYWRkciA9IEZMQVNIX0JBU0U7CisgICAgfQorI2Vsc2UKKyAgICBiYW5rMV9hZGRyID0gRkxBU0hfQkFTRTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChGTEFTSF9PUFRSX0RCQU5LKQorICAgIGlmIChSRUFEX0JJVChGTEFTSC0+T1BUUiwgRkxBU0hfT1BUUl9EQkFOSykgPT0gMFUpIHsKKyAgICAgIC8qIENvbmZpZ3VyZSB0aGUgUHJvcHJpZXRhcnkgY29kZSByZWFkb3V0IHByb3RlY3Rpb24gKi8KKyAgICAgIGlmICgoUENST1BDb25maWcgJiBGTEFTSF9CQU5LX0JPVEgpID09IEZMQVNIX0JBTktfMSkgeworICAgICAgICByZWdfdmFsdWUgPSAoKFBDUk9QU3RhcnRBZGRyIC0gRkxBU0hfQkFTRSkgPj4gNCk7CisgICAgICAgIE1PRElGWV9SRUcoRkxBU0gtPlBDUk9QMVNSLCBGTEFTSF9QQ1JPUDFTUl9QQ1JPUDFfU1RSVCwgcmVnX3ZhbHVlKTsKKworICAgICAgICByZWdfdmFsdWUgPSAoKFBDUk9QRW5kQWRkciAtIEZMQVNIX0JBU0UpID4+IDQpOworICAgICAgICBNT0RJRllfUkVHKEZMQVNILT5QQ1JPUDFFUiwgRkxBU0hfUENST1AxRVJfUENST1AxX0VORCwgcmVnX3ZhbHVlKTsKKyAgICAgIH0gZWxzZSBpZiAoKFBDUk9QQ29uZmlnICYgRkxBU0hfQkFOS19CT1RIKSA9PSBGTEFTSF9CQU5LXzIpIHsKKyAgICAgICAgcmVnX3ZhbHVlID0gKChQQ1JPUFN0YXJ0QWRkciAtIEZMQVNIX0JBU0UpID4+IDQpOworICAgICAgICBNT0RJRllfUkVHKEZMQVNILT5QQ1JPUDJTUiwgRkxBU0hfUENST1AyU1JfUENST1AyX1NUUlQsIHJlZ192YWx1ZSk7CisKKyAgICAgICAgcmVnX3ZhbHVlID0gKChQQ1JPUEVuZEFkZHIgLSBGTEFTSF9CQVNFKSA+PiA0KTsKKyAgICAgICAgTU9ESUZZX1JFRyhGTEFTSC0+UENST1AyRVIsIEZMQVNIX1BDUk9QMkVSX1BDUk9QMl9FTkQsIHJlZ192YWx1ZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgICAgICB9CisgICAgfSBlbHNlCisjZW5kaWYKKyAgICB7CisgICAgICAvKiBDb25maWd1cmUgdGhlIFByb3ByaWV0YXJ5IGNvZGUgcmVhZG91dCBwcm90ZWN0aW9uICovCisgICAgICBpZiAoKFBDUk9QQ29uZmlnICYgRkxBU0hfQkFOS19CT1RIKSA9PSBGTEFTSF9CQU5LXzEpIHsKKyAgICAgICAgcmVnX3ZhbHVlID0gKChQQ1JPUFN0YXJ0QWRkciAtIGJhbmsxX2FkZHIpID4+IDMpOworICAgICAgICBNT0RJRllfUkVHKEZMQVNILT5QQ1JPUDFTUiwgRkxBU0hfUENST1AxU1JfUENST1AxX1NUUlQsIHJlZ192YWx1ZSk7CisKKyAgICAgICAgcmVnX3ZhbHVlID0gKChQQ1JPUEVuZEFkZHIgLSBiYW5rMV9hZGRyKSA+PiAzKTsKKyAgICAgICAgTU9ESUZZX1JFRyhGTEFTSC0+UENST1AxRVIsIEZMQVNIX1BDUk9QMUVSX1BDUk9QMV9FTkQsIHJlZ192YWx1ZSk7CisgICAgICB9CisjaWYgZGVmaW5lZChGTEFTSF9PUFRSX0RCQU5LKQorICAgICAgZWxzZSBpZiAoKFBDUk9QQ29uZmlnICYgRkxBU0hfQkFOS19CT1RIKSA9PSBGTEFTSF9CQU5LXzIpIHsKKyAgICAgICAgcmVnX3ZhbHVlID0gKChQQ1JPUFN0YXJ0QWRkciAtIGJhbmsyX2FkZHIpID4+IDMpOworICAgICAgICBNT0RJRllfUkVHKEZMQVNILT5QQ1JPUDJTUiwgRkxBU0hfUENST1AyU1JfUENST1AyX1NUUlQsIHJlZ192YWx1ZSk7CisKKyAgICAgICAgcmVnX3ZhbHVlID0gKChQQ1JPUEVuZEFkZHIgLSBiYW5rMl9hZGRyKSA+PiAzKTsKKyAgICAgICAgTU9ESUZZX1JFRyhGTEFTSC0+UENST1AyRVIsIEZMQVNIX1BDUk9QMkVSX1BDUk9QMl9FTkQsIHJlZ192YWx1ZSk7CisgICAgICB9CisjZW5kaWYKKyAgICAgIGVsc2UgeworICAgICAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgICAgICB9CisgICAgfQorCisgICAgTU9ESUZZX1JFRyhGTEFTSC0+UENST1AxRVIsIEZMQVNIX1BDUk9QMUVSX1BDUk9QX1JEUCwKKyAgICAgICAgICAgICAgIChQQ1JPUENvbmZpZyAmIEZMQVNIX1BDUk9QMUVSX1BDUk9QX1JEUCkpOworCisgICAgLyogU2V0IE9QVFNUUlQgQml0ICovCisgICAgU0VUX0JJVChGTEFTSC0+Q1IsIEZMQVNIX0NSX09QVFNUUlQpOworCisgICAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovCisgICAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oKHVpbnQzMl90KUZMQVNIX1RJTUVPVVRfVkFMVUUpOworICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgU2VjdXJhYmxlIG1lbW9yeSBhcmVhIGludG8gT3B0aW9uIEJ5dGVzLgorICogQG5vdGUgICBUbyBjb25maWd1cmUgYW55IG9wdGlvbiBieXRlcywgdGhlIG9wdGlvbiBsb2NrIGJpdCBPUFRMT0NLIG11c3QgYmUKKyAqICAgICAgICAgY2xlYXJlZCB3aXRoIHRoZSBjYWxsIG9mIEhBTF9GTEFTSF9PQl9VbmxvY2soKSBmdW5jdGlvbi4KKyAqIEBub3RlICAgTmV3IG9wdGlvbiBieXRlcyBjb25maWd1cmF0aW9uIHdpbGwgYmUgdGFrZW4gaW50byBhY2NvdW50IGluIHR3bworICogY2FzZXM6CisgKiAgICAgICAgIC0gYWZ0ZXIgYW4gb3B0aW9uIGJ5dGVzIGxhdW5jaCB0aHJvdWdoIHRoZSBjYWxsIG9mCisgKiBIQUxfRkxBU0hfT0JfTGF1bmNoKCkKKyAqICAgICAgICAgLSBhZnRlciBhIHBvd2VyIHJlc2V0IChCT1IgcmVzZXQgb3IgZXhpdCBmcm9tIFN0YW5kYnkvU2h1dGRvd24gbW9kZXMpCisgKiBAcGFyYW0gIFNlY0Jhbmsgc3BlY2lmaWVzIGJhbmsgb2Ygc2VjdXJhYmxlIG1lbW9yeSBhcmVhIHRvIGJlIGNvbmZpZ3VyZWQuCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIEZMQVNIX0JBTktfMTogU2VjdXJhYmxlIG1lbW9yeSBpbiBCYW5rMSB0byBiZSBjb25maWd1cmVkCisgKiAgICAgICAgICAgIEBhcmcgRkxBU0hfQkFOS18yOiBTZWN1cmFibGUgbWVtb3J5IGluIEJhbmsyIHRvIGJlIGNvbmZpZ3VyZWQgKCopCisgKiBAbm90ZSAgICgqKSBhdmFpbGFiaWxpdHkgZGVwZW5kcyBvbiBkZXZpY2VzCisgKiBAcGFyYW0gIFNlY1NpemUgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgcGFnZXMgb2YgdGhlIFNlY3VyYWJsZSBtZW1vcnkgYXJlYSwKKyAqICAgICAgICAgc3RhcnRpbmcgZnJvbSBmaXJzdCBwYWdlIG9mIHRoZSBiYW5rLgorICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgcGFnZSBudW1iZXIgYmV0d2VlbiAwIGFuZCAobWF4IG51bWJlciBvZiBwYWdlcworICogaW4gdGhlIGJhbmsgLSAxKQorICogQHJldHZhbCBIQUwgU3RhdHVzCisgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBGTEFTSF9PQl9TZWNNZW1Db25maWcodWludDMyX3QgU2VjQmFuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgU2VjU2l6ZSkgeworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXM7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0ZMQVNIX0JBTktfRVhDTFVTSVZFKFNlY0JhbmspKTsKKyAgYXNzZXJ0X3BhcmFtKElTX09CX1NFQ01FTV9TSVpFKFNlY1NpemUpKTsKKworICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8KKyAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oKHVpbnQzMl90KUZMQVNIX1RJTUVPVVRfVkFMVUUpOworCisgIGlmIChzdGF0dXMgPT0gSEFMX09LKSB7CisgICAgLyogQ29uZmlndXJlIHRoZSB3cml0ZSBwcm90ZWN0ZWQgYXJlYSAqLworICAgIGlmIChTZWNCYW5rID09IEZMQVNIX0JBTktfMSkgeworICAgICAgTU9ESUZZX1JFRyhGTEFTSC0+U0VDMVIsIEZMQVNIX1NFQzFSX1NFQ19TSVpFMSwgU2VjU2l6ZSk7CisgICAgfQorI2lmIGRlZmluZWQoRkxBU0hfT1BUUl9EQkFOSykKKyAgICBlbHNlIGlmIChTZWNCYW5rID09IEZMQVNIX0JBTktfMikgeworICAgICAgTU9ESUZZX1JFRyhGTEFTSC0+U0VDMlIsIEZMQVNIX1NFQzJSX1NFQ19TSVpFMiwgU2VjU2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgICB9CisjZW5kaWYKKworICAgIC8qIFNldCBPUFRTVFJUIEJpdCAqLworICAgIFNFVF9CSVQoRkxBU0gtPkNSLCBGTEFTSF9DUl9PUFRTVFJUKTsKKworICAgIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLworICAgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKCh1aW50MzJfdClGTEFTSF9USU1FT1VUX1ZBTFVFKTsKKyAgfQorCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogQGJyaWVmICBDb25maWd1cmUgdGhlIEJvb3QgTG9jayBpbnRvIE9wdGlvbiBCeXRlcy4KKyAqIEBub3RlICAgVG8gY29uZmlndXJlIGFueSBvcHRpb24gYnl0ZXMsIHRoZSBvcHRpb24gbG9jayBiaXQgT1BUTE9DSyBtdXN0IGJlCisgKiAgICAgICAgIGNsZWFyZWQgd2l0aCB0aGUgY2FsbCBvZiBIQUxfRkxBU0hfT0JfVW5sb2NrKCkgZnVuY3Rpb24uCisgKiBAbm90ZSAgIE5ldyBvcHRpb24gYnl0ZXMgY29uZmlndXJhdGlvbiB3aWxsIGJlIHRha2VuIGludG8gYWNjb3VudCBpbiB0d28KKyAqIGNhc2VzOgorICogICAgICAgICAtIGFmdGVyIGFuIG9wdGlvbiBieXRlcyBsYXVuY2ggdGhyb3VnaCB0aGUgY2FsbCBvZgorICogSEFMX0ZMQVNIX09CX0xhdW5jaCgpCisgKiAgICAgICAgIC0gYWZ0ZXIgYSBwb3dlciByZXNldCAoQk9SIHJlc2V0IG9yIGV4aXQgZnJvbSBTdGFuZGJ5L1NodXRkb3duIG1vZGVzKQorICogQHBhcmFtICBCb290TG9ja0NvbmZpZyBzcGVjaWZpZXMgdGhlIGJvb3QgbG9jayBjb25maWd1cmF0aW9uLgorICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBPQl9CT09UX0xPQ0tfRU5BQkxFOiBFbmFibGUgQm9vdCBMb2NrCisgKiAgICAgICAgICAgIEBhcmcgT0JfQk9PVF9MT0NLX0RJU0FCTEU6IERpc2FibGUgQm9vdCBMb2NrCisgKgorICogQHJldHZhbCBIQUxfU3RhdHVzCisgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBGTEFTSF9PQl9Cb290TG9ja0NvbmZpZyh1aW50MzJfdCBCb290TG9ja0NvbmZpZykgeworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXM7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX09CX0JPT1RfTE9DSyhCb290TG9ja0NvbmZpZykpOworCisgIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLworICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbigodWludDMyX3QpRkxBU0hfVElNRU9VVF9WQUxVRSk7CisKKyAgaWYgKHN0YXR1cyA9PSBIQUxfT0spIHsKKyAgICBNT0RJRllfUkVHKEZMQVNILT5TRUMxUiwgRkxBU0hfU0VDMVJfQk9PVF9MT0NLLCBCb290TG9ja0NvbmZpZyk7CisKKyAgICAvKiBTZXQgT1BUU1RSVCBCaXQgKi8KKyAgICBTRVRfQklUKEZMQVNILT5DUiwgRkxBU0hfQ1JfT1BUU1RSVCk7CisKKyAgICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8KKyAgICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbigodWludDMyX3QpRkxBU0hfVElNRU9VVF9WQUxVRSk7CisgIH0KKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgU2VjdXJhYmxlIG1lbW9yeSBhcmVhIGNvbmZpZ3VyYXRpb24gaW50byBPcHRpb24gQnl0ZXMuCisgICogQHBhcmFtW2luXSAgU2VjQmFuayBzcGVjaWZpZXMgdGhlIGJhbmsgd2hlcmUgc2VjdXJhYmxlIG1lbW9yeSBhcmVhIGlzCisgIGxvY2F0ZWQuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgRkxBU0hfQkFOS18xOiBTZWN1cmFibGUgbWVtb3J5IGluIEJhbmsxCisgICogICAgICAgICAgICBAYXJnIEZMQVNIX0JBTktfMjogU2VjdXJhYmxlIG1lbW9yeSBpbiBCYW5rMiAoKikKKyAgKiBAbm90ZSAgICgqKSBhdmFpbGFiaWxpdHkgZGVwZW5kcyBvbiBkZXZpY2VzCisgICogQHBhcmFtW291dF0gIFNlY1NpemUgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgcGFnZXMgdXNlZCBpbiB0aGUgc2VjdXJhYmxlCisgICAgICAgICAgICAgICAgIG1lbW9yeSBhcmVhIG9mIHRoZSBiYW5rLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgRkxBU0hfT0JfR2V0U2VjTWVtKHVpbnQzMl90IFNlY0JhbmssIHVpbnQzMl90ICpTZWNTaXplKSB7CisgIC8qIEdldCB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgc2VjdXJhYmxlIG1lbW9yeSBhcmVhICovCisgIGlmIChTZWNCYW5rID09IEZMQVNIX0JBTktfMSkgeworICAgICpTZWNTaXplID0gUkVBRF9CSVQoRkxBU0gtPlNFQzFSLCBGTEFTSF9TRUMxUl9TRUNfU0laRTEpOworICB9CisjaWYgZGVmaW5lZChGTEFTSF9PUFRSX0RCQU5LKQorICBlbHNlIGlmIChTZWNCYW5rID09IEZMQVNIX0JBTktfMikgeworICAgICpTZWNTaXplID0gUkVBRF9CSVQoRkxBU0gtPlNFQzJSLCBGTEFTSF9TRUMyUl9TRUNfU0laRTIpOworICB9IGVsc2UgeworICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgfQorI2VuZGlmCit9CisKKy8qKgorICogQGJyaWVmICBSZXR1cm4gdGhlIEJvb3QgTG9jayBjb25maWd1cmF0aW9uIGludG8gT3B0aW9uIEJ5dGUuCisgKiBAcmV0dmFsIEJvb3RMb2NrQ29uZmlnLgorICogICAgICAgICBUaGlzIHJldHVybiB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIE9CX0JPT1RfTE9DS19FTkFCTEU6IEJvb3QgbG9jayBlbmFibGVkCisgKiAgICAgICAgICAgIEBhcmcgT0JfQk9PVF9MT0NLX0RJU0FCTEU6IEJvb3QgbG9jayBkaXNhYmxlZAorICovCitzdGF0aWMgdWludDMyX3QgRkxBU0hfT0JfR2V0Qm9vdExvY2sodm9pZCkgeworICByZXR1cm4gKFJFQURfUkVHKEZMQVNILT5TRUMxUikgJiBGTEFTSF9TRUMxUl9CT09UX0xPQ0spOworfQorCisvKioKKyAqIEBicmllZiAgUmV0dXJuIHRoZSBXcml0ZSBQcm90ZWN0aW9uIGNvbmZpZ3VyYXRpb24gaW50byBPcHRpb24gQnl0ZXMuCisgKiBAcGFyYW1baW5dICBXUlBBcmVhIHNwZWNpZmllcyB0aGUgYXJlYSB0byBiZSByZXR1cm5lZC4KKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgT0JfV1JQQVJFQV9CQU5LMV9BUkVBQTogRmxhc2ggQmFuayAxIEFyZWEgQQorICogICAgICAgICAgICBAYXJnIE9CX1dSUEFSRUFfQkFOSzFfQVJFQUI6IEZsYXNoIEJhbmsgMSBBcmVhIEIKKyAqICAgICAgICAgICAgQGFyZyBPQl9XUlBBUkVBX0JBTksyX0FSRUFBOiBGbGFzaCBCYW5rIDIgQXJlYSBBIChkb24ndCBhcHBseSB0bworICogU1RNMzJHNDN4L1NUTTMyRzQ0eCBkZXZpY2VzKQorICogICAgICAgICAgICBAYXJnIE9CX1dSUEFSRUFfQkFOSzJfQVJFQUI6IEZsYXNoIEJhbmsgMiBBcmVhIEIgKGRvbid0IGFwcGx5IHRvCisgKiBTVE0zMkc0M3gvU1RNMzJHNDR4IGRldmljZXMpCisgKiBAcGFyYW1bb3V0XSAgV1JQU3RhcnRPZmZzZXQgc3BlY2lmaWVzIHRoZSBhZGRyZXNzIHdoZXJlIHRvIGNvcGllZCB0aGUgc3RhcnQKKyAqIHBhZ2Ugb2YgdGhlIHdyaXRlIHByb3RlY3RlZCBhcmVhLgorICogQHBhcmFtW291dF0gIFdSRFBFbmRPZmZzZXQgc3BlY2lmaWVzIHRoZSBhZGRyZXNzIHdoZXJlIHRvIGNvcGllZCB0aGUgZW5kIHBhZ2UKKyAqIG9mIHRoZSB3cml0ZSBwcm90ZWN0ZWQgYXJlYS4KKyAqIEByZXR2YWwgTm9uZQorICovCitzdGF0aWMgdm9pZCBGTEFTSF9PQl9HZXRXUlAodWludDMyX3QgV1JQQXJlYSwgdWludDMyX3QgKldSUFN0YXJ0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpXUkRQRW5kT2Zmc2V0KSB7CisgIC8qIEdldCB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgd3JpdGUgcHJvdGVjdGVkIGFyZWEgKi8KKyAgaWYgKFdSUEFyZWEgPT0gT0JfV1JQQVJFQV9CQU5LMV9BUkVBQSkgeworICAgICpXUlBTdGFydE9mZnNldCA9IFJFQURfQklUKEZMQVNILT5XUlAxQVIsIEZMQVNIX1dSUDFBUl9XUlAxQV9TVFJUKTsKKyAgICAqV1JEUEVuZE9mZnNldCA9IChSRUFEX0JJVChGTEFTSC0+V1JQMUFSLCBGTEFTSF9XUlAxQVJfV1JQMUFfRU5EKSA+PgorICAgICAgICAgICAgICAgICAgICAgIEZMQVNIX1dSUDFBUl9XUlAxQV9FTkRfUG9zKTsKKyAgfSBlbHNlIGlmIChXUlBBcmVhID09IE9CX1dSUEFSRUFfQkFOSzFfQVJFQUIpIHsKKyAgICAqV1JQU3RhcnRPZmZzZXQgPSBSRUFEX0JJVChGTEFTSC0+V1JQMUJSLCBGTEFTSF9XUlAxQlJfV1JQMUJfU1RSVCk7CisgICAgKldSRFBFbmRPZmZzZXQgPSAoUkVBRF9CSVQoRkxBU0gtPldSUDFCUiwgRkxBU0hfV1JQMUJSX1dSUDFCX0VORCkgPj4KKyAgICAgICAgICAgICAgICAgICAgICBGTEFTSF9XUlAxQlJfV1JQMUJfRU5EX1Bvcyk7CisgIH0KKyNpZiBkZWZpbmVkKEZMQVNIX09QVFJfREJBTkspCisgIGVsc2UgaWYgKFdSUEFyZWEgPT0gT0JfV1JQQVJFQV9CQU5LMl9BUkVBQSkgeworICAgICpXUlBTdGFydE9mZnNldCA9IFJFQURfQklUKEZMQVNILT5XUlAyQVIsIEZMQVNIX1dSUDJBUl9XUlAyQV9TVFJUKTsKKyAgICAqV1JEUEVuZE9mZnNldCA9IChSRUFEX0JJVChGTEFTSC0+V1JQMkFSLCBGTEFTSF9XUlAyQVJfV1JQMkFfRU5EKSA+PgorICAgICAgICAgICAgICAgICAgICAgIEZMQVNIX1dSUDJBUl9XUlAyQV9FTkRfUG9zKTsKKyAgfSBlbHNlIGlmIChXUlBBcmVhID09IE9CX1dSUEFSRUFfQkFOSzJfQVJFQUIpIHsKKyAgICAqV1JQU3RhcnRPZmZzZXQgPSBSRUFEX0JJVChGTEFTSC0+V1JQMkJSLCBGTEFTSF9XUlAyQlJfV1JQMkJfU1RSVCk7CisgICAgKldSRFBFbmRPZmZzZXQgPSAoUkVBRF9CSVQoRkxBU0gtPldSUDJCUiwgRkxBU0hfV1JQMkJSX1dSUDJCX0VORCkgPj4KKyAgICAgICAgICAgICAgICAgICAgICBGTEFTSF9XUlAyQlJfV1JQMkJfRU5EX1Bvcyk7CisgIH0KKyNlbmRpZgorICBlbHNlIHsKKyAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgIH0KK30KKworLyoqCisgKiBAYnJpZWYgIFJldHVybiB0aGUgRkxBU0ggUmVhZCBQcm90ZWN0aW9uIGxldmVsIGludG8gT3B0aW9uIEJ5dGVzLgorICogQHJldHZhbCBSRFBfTGV2ZWwKKyAqICAgICAgICAgVGhpcyByZXR1cm4gdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBPQl9SRFBfTEVWRUxfMDogTm8gcHJvdGVjdGlvbgorICogICAgICAgICAgICBAYXJnIE9CX1JEUF9MRVZFTF8xOiBSZWFkIHByb3RlY3Rpb24gb2YgdGhlIG1lbW9yeQorICogICAgICAgICAgICBAYXJnIE9CX1JEUF9MRVZFTF8yOiBGdWxsIGNoaXAgcHJvdGVjdGlvbgorICovCitzdGF0aWMgdWludDMyX3QgRkxBU0hfT0JfR2V0UkRQKHZvaWQpIHsKKyAgdWludDMyX3QgcmRwX2xldmVsID0gUkVBRF9CSVQoRkxBU0gtPk9QVFIsIEZMQVNIX09QVFJfUkRQKTsKKworICBpZiAoKHJkcF9sZXZlbCAhPSBPQl9SRFBfTEVWRUxfMCkgJiYgKHJkcF9sZXZlbCAhPSBPQl9SRFBfTEVWRUxfMikpIHsKKyAgICByZXR1cm4gKE9CX1JEUF9MRVZFTF8xKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gcmRwX2xldmVsOworICB9Cit9CisKKy8qKgorICogQGJyaWVmICBSZXR1cm4gdGhlIEZMQVNIIFVzZXIgT3B0aW9uIEJ5dGUgdmFsdWUuCisgKiBAcmV0dmFsIE9CX3VzZXJfY29uZmlnCisgKiAgICAgICAgIFRoaXMgcmV0dXJuIHZhbHVlIGlzIGEgY29tYmluYXRpb24gb2YgQHJlZiBGTEFTSF9PQl9VU0VSX0JPUl9MRVZFTCwKKyAqICAgICAgICAgQHJlZiBGTEFTSF9PQl9VU0VSX25SU1RfU1RPUCwgQHJlZiBGTEFTSF9PQl9VU0VSX25SU1RfU1RBTkRCWSwKKyAqICAgICAgICAgQHJlZiBGTEFTSF9PQl9VU0VSX25SU1RfU0hVVERPV04sIEByZWYgRkxBU0hfT0JfVVNFUl9JV0RHX1NXLAorICogICAgICAgICBAcmVmIEZMQVNIX09CX1VTRVJfSVdER19TVE9QLCBAcmVmIEZMQVNIX09CX1VTRVJfSVdER19TVEFOREJZLAorICogICAgICAgICBAcmVmIEZMQVNIX09CX1VTRVJfV1dER19TVywgQHJlZiBGTEFTSF9PQl9VU0VSX1dXREdfU1csCisgKiAgICAgICAgIEByZWYgRkxBU0hfT0JfVVNFUl9CRkIyICgqKSwgQHJlZiBGTEFTSF9PQl9VU0VSX0RCQU5LICgqKSwKKyAqICAgICAgICAgQHJlZiBGTEFTSF9PQl9VU0VSX25CT09UMSwgQHJlZiBGTEFTSF9PQl9VU0VSX1NSQU1fUEUsCisgKiAgICAgICAgIEByZWYgRkxBU0hfT0JfVVNFUl9DQ01TUkFNX1JTVCwgQHJlZiBPQl9VU0VSX25TV0JPT1QwLEByZWYKKyAqIEZMQVNIX09CX1VTRVJfbkJPT1QwLAorICogICAgICAgICBAcmVmIEZMQVNIX09CX1VTRVJfTlJTVF9NT0RFLCBAcmVmCisgKiBGTEFTSF9PQl9VU0VSX0lOVEVSTkFMX1JFU0VUX0hPTERFUgorICogQG5vdGUgICgqKSBhdmFpbGFiaWxpdHkgZGVwZW5kcyBvbiBkZXZpY2VzCisgKi8KK3N0YXRpYyB1aW50MzJfdCBGTEFTSF9PQl9HZXRVc2VyKHZvaWQpIHsKKyAgdWludDMyX3QgdXNlcl9jb25maWcgPSBSRUFEX1JFRyhGTEFTSC0+T1BUUik7CisgIENMRUFSX0JJVCh1c2VyX2NvbmZpZywgRkxBU0hfT1BUUl9SRFApOworCisgIHJldHVybiB1c2VyX2NvbmZpZzsKK30KKworLyoqCisgKiBAYnJpZWYgIFJldHVybiB0aGUgRkxBU0ggUENST1AgY29uZmlndXJhdGlvbiBpbnRvIE9wdGlvbiBCeXRlcy4KKyAqIEBwYXJhbVtpbixvdXRdIFBDUk9QQ29uZmlnIHNwZWNpZmllcyB0aGUgY29uZmlndXJhdGlvbiAoQmFuayB0byBiZSBjb25maWd1cmVkCisgKiBhbmQgUENST1BfUkRQIG9wdGlvbikuIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBjb21iaW5hdGlvbiBvZiBGTEFTSF9CQU5LXzEKKyAqIG9yIEZMQVNIX0JBTktfMiB3aXRoIE9CX1BDUk9QX1JEUF9OT1RfRVJBU0Ugb3IgT0JfUENST1BfUkRQX0VSQVNFLgorICogQHBhcmFtW291dF0gUENST1BTdGFydEFkZHIgc3BlY2lmaWVzIHRoZSBhZGRyZXNzIHdoZXJlIHRvIGNvcGllZCB0aGUgc3RhcnQKKyAqIGFkZHJlc3Mgb2YgdGhlIFByb3ByaWV0YXJ5IGNvZGUgcmVhZG91dCBwcm90ZWN0aW9uLgorICogQHBhcmFtW291dF0gUENST1BFbmRBZGRyIHNwZWNpZmllcyB0aGUgYWRkcmVzcyB3aGVyZSB0byBjb3BpZWQgdGhlIGVuZAorICogYWRkcmVzcyBvZiB0aGUgUHJvcHJpZXRhcnkgY29kZSByZWFkb3V0IHByb3RlY3Rpb24uCisgKiBAcmV0dmFsIE5vbmUKKyAqLworc3RhdGljIHZvaWQgRkxBU0hfT0JfR2V0UENST1AodWludDMyX3QgKlBDUk9QQ29uZmlnLCB1aW50MzJfdCAqUENST1BTdGFydEFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqUENST1BFbmRBZGRyKSB7CisgIHVpbnQzMl90IHJlZ192YWx1ZTsKKyAgdWludDMyX3QgYmFuazFfYWRkcjsKKyNpZiBkZWZpbmVkKEZMQVNIX09QVFJfREJBTkspCisgIHVpbnQzMl90IGJhbmsyX2FkZHI7CisKKyAgLyogR2V0IHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYmFuayBzd2FwcGluZyAqLworICBpZiAoUkVBRF9CSVQoU1lTQ0ZHLT5NRU1STVAsIFNZU0NGR19NRU1STVBfRkJfTU9ERSkgPT0gMFUpIHsKKyAgICBiYW5rMV9hZGRyID0gRkxBU0hfQkFTRTsKKyAgICBiYW5rMl9hZGRyID0gRkxBU0hfQkFTRSArIEZMQVNIX0JBTktfU0laRTsKKyAgfSBlbHNlIHsKKyAgICBiYW5rMV9hZGRyID0gRkxBU0hfQkFTRSArIEZMQVNIX0JBTktfU0laRTsKKyAgICBiYW5rMl9hZGRyID0gRkxBU0hfQkFTRTsKKyAgfQorI2Vsc2UKKyAgYmFuazFfYWRkciA9IEZMQVNIX0JBU0U7CisjZW5kaWYKKworI2lmIGRlZmluZWQoRkxBU0hfT1BUUl9EQkFOSykKKyAgaWYgKFJFQURfQklUKEZMQVNILT5PUFRSLCBGTEFTSF9PUFRSX0RCQU5LKSA9PSAwVSkgeworICAgIGlmICgoKCpQQ1JPUENvbmZpZykgJiBGTEFTSF9CQU5LX0JPVEgpID09IEZMQVNIX0JBTktfMSkgeworICAgICAgcmVnX3ZhbHVlID0gKFJFQURfUkVHKEZMQVNILT5QQ1JPUDFTUikgJiBGTEFTSF9QQ1JPUDFTUl9QQ1JPUDFfU1RSVCk7CisgICAgICAqUENST1BTdGFydEFkZHIgPSAocmVnX3ZhbHVlIDw8IDQpICsgRkxBU0hfQkFTRTsKKworICAgICAgcmVnX3ZhbHVlID0gKFJFQURfUkVHKEZMQVNILT5QQ1JPUDFFUikgJiBGTEFTSF9QQ1JPUDFFUl9QQ1JPUDFfRU5EKTsKKyAgICAgICpQQ1JPUEVuZEFkZHIgPSAocmVnX3ZhbHVlIDw8IDQpICsgRkxBU0hfQkFTRTsKKyAgICB9IGVsc2UgaWYgKCgoKlBDUk9QQ29uZmlnKSAmIEZMQVNIX0JBTktfQk9USCkgPT0gRkxBU0hfQkFOS18yKSB7CisgICAgICByZWdfdmFsdWUgPSAoUkVBRF9SRUcoRkxBU0gtPlBDUk9QMlNSKSAmIEZMQVNIX1BDUk9QMlNSX1BDUk9QMl9TVFJUKTsKKyAgICAgICpQQ1JPUFN0YXJ0QWRkciA9IChyZWdfdmFsdWUgPDwgNCkgKyBGTEFTSF9CQVNFOworCisgICAgICByZWdfdmFsdWUgPSAoUkVBRF9SRUcoRkxBU0gtPlBDUk9QMkVSKSAmIEZMQVNIX1BDUk9QMkVSX1BDUk9QMl9FTkQpOworICAgICAgKlBDUk9QRW5kQWRkciA9IChyZWdfdmFsdWUgPDwgNCkgKyBGTEFTSF9CQVNFOworICAgIH0gZWxzZSB7CisgICAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgICAgfQorICB9IGVsc2UKKyNlbmRpZgorICB7CisgICAgaWYgKCgoKlBDUk9QQ29uZmlnKSAmIEZMQVNIX0JBTktfQk9USCkgPT0gRkxBU0hfQkFOS18xKSB7CisgICAgICByZWdfdmFsdWUgPSAoUkVBRF9SRUcoRkxBU0gtPlBDUk9QMVNSKSAmIEZMQVNIX1BDUk9QMVNSX1BDUk9QMV9TVFJUKTsKKyAgICAgICpQQ1JPUFN0YXJ0QWRkciA9IChyZWdfdmFsdWUgPDwgMykgKyBiYW5rMV9hZGRyOworCisgICAgICByZWdfdmFsdWUgPSAoUkVBRF9SRUcoRkxBU0gtPlBDUk9QMUVSKSAmIEZMQVNIX1BDUk9QMUVSX1BDUk9QMV9FTkQpOworICAgICAgKlBDUk9QRW5kQWRkciA9IChyZWdfdmFsdWUgPDwgMykgKyBiYW5rMV9hZGRyOworICAgIH0KKyNpZiBkZWZpbmVkKEZMQVNIX09QVFJfREJBTkspCisgICAgZWxzZSBpZiAoKCgqUENST1BDb25maWcpICYgRkxBU0hfQkFOS19CT1RIKSA9PSBGTEFTSF9CQU5LXzIpIHsKKyAgICAgIHJlZ192YWx1ZSA9IChSRUFEX1JFRyhGTEFTSC0+UENST1AyU1IpICYgRkxBU0hfUENST1AyU1JfUENST1AyX1NUUlQpOworICAgICAgKlBDUk9QU3RhcnRBZGRyID0gKHJlZ192YWx1ZSA8PCAzKSArIGJhbmsyX2FkZHI7CisKKyAgICAgIHJlZ192YWx1ZSA9IChSRUFEX1JFRyhGTEFTSC0+UENST1AyRVIpICYgRkxBU0hfUENST1AyRVJfUENST1AyX0VORCk7CisgICAgICAqUENST1BFbmRBZGRyID0gKHJlZ192YWx1ZSA8PCAzKSArIGJhbmsyX2FkZHI7CisgICAgfQorI2VuZGlmCisgICAgZWxzZSB7CisgICAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgICAgfQorICB9CisKKyAgKlBDUk9QQ29uZmlnIHw9IChSRUFEX1JFRyhGTEFTSC0+UENST1AxRVIpICYgRkxBU0hfUENST1AxRVJfUENST1BfUkRQKTsKK30KKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworI2VuZGlmIC8qIEhBTF9GTEFTSF9NT0RVTEVfRU5BQkxFRCAqLworCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCmRpZmYgLS1naXQgYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfZmxhc2hfcmFtZnVuYy5jIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX2ZsYXNoX3JhbWZ1bmMuYwppbmRleCA2ZGM5OGUyLi5iOTJkM2RiIDEwMDY0NAotLS0gYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfZmxhc2hfcmFtZnVuYy5jCisrKyBiL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9mbGFzaF9yYW1mdW5jLmMKQEAgLTEsMjQ2ICsxLDI0NiBAQAotLyoqDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICogQGZpbGUgICAgc3RtMzJnNHh4X2hhbF9mbGFzaF9yYW1mdW5jLmMNCi0gICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0NCi0gICogQGJyaWVmICAgRkxBU0ggUkFNRlVOQyBkcml2ZXIuDQotICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBhIEZsYXNoIGZpcm13YXJlIGZ1bmN0aW9ucyB3aGljaCBzaG91bGQgYmUNCi0gICogICAgICAgICAgZXhlY3V0ZWQgZnJvbSBpbnRlcm5hbCBTUkFNDQotICAqICAgICAgICAgICAgKyBGTEFTSCBQb3dlciBEb3duIGluIFJ1biBtb2RlDQotICAqICAgICAgICAgICAgKyBGTEFTSCBEQkFOSyBVc2VyIE9wdGlvbiBCeXRlDQotICAqDQotICAqDQotICBAdmVyYmF0aW0NCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICAgICAgICAgICAgICAgICAjIyMjIyBGbGFzaCBSQU0gZnVuY3Rpb25zICMjIyMjDQotICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi0gICAgKioqIEFSTSBDb21waWxlciAqKioNCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0gICAgWy4uXSBSQU0gZnVuY3Rpb25zIGFyZSBkZWZpbmVkIHVzaW5nIHRoZSB0b29sY2hhaW4gb3B0aW9ucy4NCi0gICAgICAgICBGdW5jdGlvbnMgdGhhdCBhcmUgZXhlY3V0ZWQgaW4gUkFNIHNob3VsZCByZXNpZGUgaW4gYSBzZXBhcmF0ZQ0KLSAgICAgICAgIHNvdXJjZSBtb2R1bGUuIFVzaW5nIHRoZSAnT3B0aW9ucyBmb3IgRmlsZScgZGlhbG9nIHlvdSBjYW4gc2ltcGx5DQotICBjaGFuZ2UgdGhlICdDb2RlIC8gQ29uc3QnIGFyZWEgb2YgYSBtb2R1bGUgdG8gYSBtZW1vcnkgc3BhY2UgaW4gcGh5c2ljYWwgUkFNLg0KLSAgICAgICAgIEF2YWlsYWJsZSBtZW1vcnkgYXJlYXMgYXJlIGRlY2xhcmVkIGluIHRoZSAnVGFyZ2V0JyB0YWIgb2YgdGhlDQotICAgICAgICAgT3B0aW9ucyBmb3IgVGFyZ2V0JyBkaWFsb2cuDQotDQotICAgICoqKiBJQ0NBUk0gQ29tcGlsZXIgKioqDQotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotICAgIFsuLl0gUkFNIGZ1bmN0aW9ucyBhcmUgZGVmaW5lZCB1c2luZyBhIHNwZWNpZmljIHRvb2xjaGFpbiBrZXl3b3JkDQotICAiX19yYW1mdW5jIi4NCi0NCi0gICAgKioqIEdOVSBDb21waWxlciAqKioNCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0gICAgWy4uXSBSQU0gZnVuY3Rpb25zIGFyZSBkZWZpbmVkIHVzaW5nIGEgc3BlY2lmaWMgdG9vbGNoYWluIGF0dHJpYnV0ZQ0KLSAgICAgICAgICJfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKCIuUmFtRnVuYyIpKSkiLg0KLQ0KLSAgQGVuZHZlcmJhdGltDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICogQGF0dGVudGlvbg0KLSAgKg0KLSAgKiBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLg0KLSAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KLSAgKg0KLSAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRlcm1zIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUNCi0gIGluDQotICAqIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4NCi0gICogSWYgbm8gTElDRU5TRSBmaWxlIGNvbWVzIHdpdGggdGhpcyBzb2Z0d2FyZSwgaXQgaXMgcHJvdmlkZWQgQVMtSVMuDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICovDQotDQotLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaW5jbHVkZSAic3RtMzJnNHh4X2hhbC5oIg0KLQ0KLS8qKiBAYWRkdG9ncm91cCBTVE0zMkc0eHhfSEFMX0RyaXZlcg0KLSAqIEB7DQotICovDQotDQotLyoqIEBkZWZncm91cCBGTEFTSF9SQU1GVU5DIEZMQVNIX1JBTUZVTkMNCi0gKiBAYnJpZWYgRkxBU0ggZnVuY3Rpb25zIGV4ZWN1dGVkIGZyb20gUkFNDQotICogQHsNCi0gKi8NCi0NCi0jaWZkZWYgSEFMX0ZMQVNIX01PRFVMRV9FTkFCTEVEDQotDQotLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0NCi0vKiogQGRlZmdyb3VwIEZMQVNIX1JBTUZVTkNfRXhwb3J0ZWRfRnVuY3Rpb25zIEZMQVNIX1JBTUZVTkMgRXhwb3J0ZWQgRnVuY3Rpb25zDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIEZMQVNIX1JBTUZVTkNfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBQZXJpcGhlcmFsIGZlYXR1cmVzDQotZnVuY3Rpb25zDQotICogIEBicmllZiAgIERhdGEgdHJhbnNmZXJzIGZ1bmN0aW9ucw0KLSAqDQotQHZlcmJhdGltDQotID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgICAgICAgICAgICAgICAgICAgIyMjIyMgcmFtZnVuYyBmdW5jdGlvbnMgIyMjIyMNCi0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICBbLi5dDQotICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgZXhlY3V0ZWQgZnJvbQ0KLVJBTS4NCi0NCi1AZW5kdmVyYmF0aW0NCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgdGhlIFBvd2VyIGRvd24gaW4gUnVuIE1vZGUNCi0gKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBhbmQgZXhlY3V0ZWQgZnJvbSBTUkFNIG1lbW9yeS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX1JBTV9GVU5DIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9GTEFTSEV4X0VuYWJsZVJ1blBvd2VyRG93bih2b2lkKSB7DQotICAvKiBFbmFibGUgdGhlIFBvd2VyIERvd24gaW4gUnVuIG1vZGUqLw0KLSAgX19IQUxfRkxBU0hfUE9XRVJfRE9XTl9FTkFCTEUoKTsNCi0NCi0gIHJldHVybiBIQUxfT0s7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSB0aGUgUG93ZXIgZG93biBpbiBSdW4gTW9kZQ0KLSAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGFuZCBleGVjdXRlZCBmcm9tIFNSQU0gbWVtb3J5Lg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fUkFNX0ZVTkMgSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIRXhfRGlzYWJsZVJ1blBvd2VyRG93bih2b2lkKSB7DQotICAvKiBEaXNhYmxlIHRoZSBQb3dlciBEb3duIGluIFJ1biBtb2RlKi8NCi0gIF9fSEFMX0ZMQVNIX1BPV0VSX0RPV05fRElTQUJMRSgpOw0KLQ0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotI2lmIGRlZmluZWQoRkxBU0hfT1BUUl9EQkFOSykNCi0vKioNCi0gKiBAYnJpZWYgIFByb2dyYW0gdGhlIEZMQVNIIERCQU5LIFVzZXIgT3B0aW9uIEJ5dGUuDQotICoNCi0gKiBAbm90ZSAgIFRvIGNvbmZpZ3VyZSB0aGUgdXNlciBvcHRpb24gYnl0ZXMsIHRoZSBvcHRpb24gbG9jayBiaXQgT1BUTE9DSyBtdXN0DQotICogICAgICAgICBiZSBjbGVhcmVkIHdpdGggdGhlIGNhbGwgb2YgdGhlIEhBTF9GTEFTSF9PQl9VbmxvY2soKSBmdW5jdGlvbi4NCi0gKiBAbm90ZSAgIFRvIG1vZGlmeSB0aGUgREJBTksgb3B0aW9uIGJ5dGUsIG5vIFBDUk9QIHJlZ2lvbiBzaG91bGQgYmUgZGVmaW5lZC4NCi0gKiAgICAgICAgIFRvIGRlYWN0aXZhdGUgUENST1AsIHVzZXIgc2hvdWxkIHBlcmZvcm0gUkRQIGNoYW5naW5nLg0KLSAqDQotICogQHBhcmFtICBEQmFua0NvbmZpZyBUaGUgRkxBU0ggREJBTksgVXNlciBPcHRpb24gQnl0ZSB2YWx1ZS4NCi0gKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyICBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBPQl9EQkFOS18xMjhfQklUUzogU2luZ2xlLWJhbmsgd2l0aCAxMjgtYml0cyBkYXRhDQotICogICAgICAgICAgICBAYXJnIE9CX0RCQU5LXzY0X0JJVFM6IER1YWwtYmFuayB3aXRoIDY0LWJpdHMgZGF0YQ0KLSAqDQotICogQHJldHZhbCBIQUxfU3RhdHVzDQotICovDQotX19SQU1fRlVOQyBIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkxBU0hFeF9PQl9EQmFua0NvbmZpZyh1aW50MzJfdCBEQmFua0NvbmZpZykgew0KLSAgdWludDMyX3QgY291bnQsIHJlZzsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9FUlJPUjsNCi0NCi0gIC8qIFByb2Nlc3MgTG9ja2VkICovDQotICBfX0hBTF9MT0NLKCZwRmxhc2gpOw0KLQ0KLSAgLyogQ2hlY2sgaWYgdGhlIFBDUk9QIGlzIGRpc2FibGVkICovDQotICByZWcgPSBGTEFTSC0+UENST1AxU1I7DQotICBpZiAocmVnID4gRkxBU0gtPlBDUk9QMUVSKSB7DQotICAgIHJlZyA9IEZMQVNILT5QQ1JPUDJTUjsNCi0gICAgaWYgKHJlZyA+IEZMQVNILT5QQ1JPUDJFUikgew0KLSAgICAgIC8qIERpc2FibGUgRmxhc2ggcHJlZmV0Y2ggKi8NCi0gICAgICBfX0hBTF9GTEFTSF9QUkVGRVRDSF9CVUZGRVJfRElTQUJMRSgpOw0KLQ0KLSAgICAgIGlmIChSRUFEX0JJVChGTEFTSC0+QUNSLCBGTEFTSF9BQ1JfSUNFTikgIT0gMFUpIHsNCi0gICAgICAgIC8qIERpc2FibGUgRmxhc2ggaW5zdHJ1Y3Rpb24gY2FjaGUgKi8NCi0gICAgICAgIF9fSEFMX0ZMQVNIX0lOU1RSVUNUSU9OX0NBQ0hFX0RJU0FCTEUoKTsNCi0NCi0gICAgICAgIC8qIEZsdXNoIEZsYXNoIGluc3RydWN0aW9uIGNhY2hlICovDQotICAgICAgICBfX0hBTF9GTEFTSF9JTlNUUlVDVElPTl9DQUNIRV9SRVNFVCgpOw0KLSAgICAgIH0NCi0NCi0gICAgICBpZiAoUkVBRF9CSVQoRkxBU0gtPkFDUiwgRkxBU0hfQUNSX0RDRU4pICE9IDBVKSB7DQotICAgICAgICAvKiBEaXNhYmxlIEZsYXNoIGRhdGEgY2FjaGUgKi8NCi0gICAgICAgIF9fSEFMX0ZMQVNIX0RBVEFfQ0FDSEVfRElTQUJMRSgpOw0KLQ0KLSAgICAgICAgLyogRmx1c2ggRmxhc2ggZGF0YSBjYWNoZSAqLw0KLSAgICAgICAgX19IQUxfRkxBU0hfREFUQV9DQUNIRV9SRVNFVCgpOw0KLSAgICAgIH0NCi0NCi0gICAgICAvKiBEaXNhYmxlIFdSUCB6b25lIEEgb2YgMXN0IGJhbmsgaWYgbmVlZGVkICovDQotICAgICAgcmVnID0gRkxBU0gtPldSUDFBUjsNCi0gICAgICBpZiAoKChyZWcgJiBGTEFTSF9XUlAxQVJfV1JQMUFfU1RSVCkgPj4gRkxBU0hfV1JQMUFSX1dSUDFBX1NUUlRfUG9zKSA8PQ0KLSAgICAgICAgICAoKHJlZyAmIEZMQVNIX1dSUDFBUl9XUlAxQV9FTkQpID4+IEZMQVNIX1dSUDFBUl9XUlAxQV9FTkRfUG9zKSkgew0KLSAgICAgICAgTU9ESUZZX1JFRyhGTEFTSC0+V1JQMUFSLA0KLSAgICAgICAgICAgICAgICAgICAoRkxBU0hfV1JQMUFSX1dSUDFBX1NUUlQgfCBGTEFTSF9XUlAxQVJfV1JQMUFfRU5EKSwNCi0gICAgICAgICAgICAgICAgICAgRkxBU0hfV1JQMUFSX1dSUDFBX1NUUlQpOw0KLSAgICAgIH0NCi0NCi0gICAgICAvKiBEaXNhYmxlIFdSUCB6b25lIEIgb2YgMXN0IGJhbmsgaWYgbmVlZGVkICovDQotICAgICAgcmVnID0gRkxBU0gtPldSUDFCUjsNCi0gICAgICBpZiAoKChyZWcgJiBGTEFTSF9XUlAxQlJfV1JQMUJfU1RSVCkgPj4gRkxBU0hfV1JQMUJSX1dSUDFCX1NUUlRfUG9zKSA8PQ0KLSAgICAgICAgICAoKHJlZyAmIEZMQVNIX1dSUDFCUl9XUlAxQl9FTkQpID4+IEZMQVNIX1dSUDFCUl9XUlAxQl9FTkRfUG9zKSkgew0KLSAgICAgICAgTU9ESUZZX1JFRyhGTEFTSC0+V1JQMUJSLA0KLSAgICAgICAgICAgICAgICAgICAoRkxBU0hfV1JQMUJSX1dSUDFCX1NUUlQgfCBGTEFTSF9XUlAxQlJfV1JQMUJfRU5EKSwNCi0gICAgICAgICAgICAgICAgICAgRkxBU0hfV1JQMUJSX1dSUDFCX1NUUlQpOw0KLSAgICAgIH0NCi0NCi0gICAgICAvKiBEaXNhYmxlIFdSUCB6b25lIEEgb2YgMm5kIGJhbmsgaWYgbmVlZGVkICovDQotICAgICAgcmVnID0gRkxBU0gtPldSUDJBUjsNCi0gICAgICBpZiAoKChyZWcgJiBGTEFTSF9XUlAyQVJfV1JQMkFfU1RSVCkgPj4gRkxBU0hfV1JQMkFSX1dSUDJBX1NUUlRfUG9zKSA8PQ0KLSAgICAgICAgICAoKHJlZyAmIEZMQVNIX1dSUDJBUl9XUlAyQV9FTkQpID4+IEZMQVNIX1dSUDJBUl9XUlAyQV9FTkRfUG9zKSkgew0KLSAgICAgICAgTU9ESUZZX1JFRyhGTEFTSC0+V1JQMkFSLA0KLSAgICAgICAgICAgICAgICAgICAoRkxBU0hfV1JQMkFSX1dSUDJBX1NUUlQgfCBGTEFTSF9XUlAyQVJfV1JQMkFfRU5EKSwNCi0gICAgICAgICAgICAgICAgICAgRkxBU0hfV1JQMkFSX1dSUDJBX1NUUlQpOw0KLSAgICAgIH0NCi0NCi0gICAgICAvKiBEaXNhYmxlIFdSUCB6b25lIEIgb2YgMm5kIGJhbmsgaWYgbmVlZGVkICovDQotICAgICAgcmVnID0gRkxBU0gtPldSUDJCUjsNCi0gICAgICBpZiAoKChyZWcgJiBGTEFTSF9XUlAyQlJfV1JQMkJfU1RSVCkgPj4gRkxBU0hfV1JQMkJSX1dSUDJCX1NUUlRfUG9zKSA8PQ0KLSAgICAgICAgICAoKHJlZyAmIEZMQVNIX1dSUDJCUl9XUlAyQl9FTkQpID4+IEZMQVNIX1dSUDJCUl9XUlAyQl9FTkRfUG9zKSkgew0KLSAgICAgICAgTU9ESUZZX1JFRyhGTEFTSC0+V1JQMkJSLA0KLSAgICAgICAgICAgICAgICAgICAoRkxBU0hfV1JQMkJSX1dSUDJCX1NUUlQgfCBGTEFTSF9XUlAyQlJfV1JQMkJfRU5EKSwNCi0gICAgICAgICAgICAgICAgICAgRkxBU0hfV1JQMkJSX1dSUDJCX1NUUlQpOw0KLSAgICAgIH0NCi0NCi0gICAgICAvKiBNb2RpZnkgdGhlIERCQU5LIHVzZXIgb3B0aW9uIGJ5dGUgKi8NCi0gICAgICBNT0RJRllfUkVHKEZMQVNILT5PUFRSLCBGTEFTSF9PUFRSX0RCQU5LLCBEQmFua0NvbmZpZyk7DQotDQotICAgICAgLyogU2V0IE9QVFNUUlQgQml0ICovDQotICAgICAgU0VUX0JJVChGTEFTSC0+Q1IsIEZMQVNIX0NSX09QVFNUUlQpOw0KLQ0KLSAgICAgIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLw0KLSAgICAgIC8qIDggaXMgdGhlIG51bWJlciBvZiByZXF1aXJlZCBpbnN0cnVjdGlvbiBjeWNsZXMgZm9yIHRoZSBiZWxvdyBsb29wDQotICAgICAgICogc3RhdGVtZW50ICh0aW1lb3V0IGV4cHJlc3NlZCBpbiBtcykgKi8NCi0gICAgICBjb3VudCA9IEZMQVNIX1RJTUVPVVRfVkFMVUUgKiAoU3lzdGVtQ29yZUNsb2NrIC8gOFUgLyAxMDAwVSk7DQotICAgICAgZG8gew0KLSAgICAgICAgaWYgKGNvdW50ID09IDBVKSB7DQotICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY291bnQtLTsNCi0gICAgICB9IHdoaWxlIChfX0hBTF9GTEFTSF9HRVRfRkxBRyhGTEFTSF9GTEFHX0JTWSkgIT0gUkVTRVQpOw0KLQ0KLSAgICAgIC8qIElmIHRoZSBvcHRpb24gYnl0ZSBwcm9ncmFtIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQsIGRpc2FibGUgdGhlIE9QVFNUUlQNCi0gICAgICAgKiBCaXQgKi8NCi0gICAgICBDTEVBUl9CSVQoRkxBU0gtPkNSLCBGTEFTSF9DUl9PUFRTVFJUKTsNCi0NCi0gICAgICAvKiBTZXQgdGhlIGJpdCB0byBmb3JjZSB0aGUgb3B0aW9uIGJ5dGUgcmVsb2FkaW5nICovDQotICAgICAgU0VUX0JJVChGTEFTSC0+Q1IsIEZMQVNIX0NSX09CTF9MQVVOQ0gpOw0KLSAgICB9DQotICB9DQotDQotICAvKiBQcm9jZXNzIFVubG9ja2VkICovDQotICBfX0hBTF9VTkxPQ0soJnBGbGFzaCk7DQotDQotICByZXR1cm4gc3RhdHVzOw0KLX0NCi0jZW5kaWYNCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotI2VuZGlmIC8qIEhBTF9GTEFTSF9NT0RVTEVfRU5BQkxFRCAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnNHh4X2hhbF9mbGFzaF9yYW1mdW5jLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEZMQVNIIFJBTUZVTkMgZHJpdmVyLgorICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBhIEZsYXNoIGZpcm13YXJlIGZ1bmN0aW9ucyB3aGljaCBzaG91bGQgYmUKKyAgKiAgICAgICAgICBleGVjdXRlZCBmcm9tIGludGVybmFsIFNSQU0KKyAgKiAgICAgICAgICAgICsgRkxBU0ggUG93ZXIgRG93biBpbiBSdW4gbW9kZQorICAqICAgICAgICAgICAgKyBGTEFTSCBEQkFOSyBVc2VyIE9wdGlvbiBCeXRlCisgICoKKyAgKgorICBAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgIyMjIyMgRmxhc2ggUkFNIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICoqKiBBUk0gQ29tcGlsZXIgKioqCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBbLi5dIFJBTSBmdW5jdGlvbnMgYXJlIGRlZmluZWQgdXNpbmcgdGhlIHRvb2xjaGFpbiBvcHRpb25zLgorICAgICAgICAgRnVuY3Rpb25zIHRoYXQgYXJlIGV4ZWN1dGVkIGluIFJBTSBzaG91bGQgcmVzaWRlIGluIGEgc2VwYXJhdGUKKyAgICAgICAgIHNvdXJjZSBtb2R1bGUuIFVzaW5nIHRoZSAnT3B0aW9ucyBmb3IgRmlsZScgZGlhbG9nIHlvdSBjYW4gc2ltcGx5CisgIGNoYW5nZSB0aGUgJ0NvZGUgLyBDb25zdCcgYXJlYSBvZiBhIG1vZHVsZSB0byBhIG1lbW9yeSBzcGFjZSBpbiBwaHlzaWNhbCBSQU0uCisgICAgICAgICBBdmFpbGFibGUgbWVtb3J5IGFyZWFzIGFyZSBkZWNsYXJlZCBpbiB0aGUgJ1RhcmdldCcgdGFiIG9mIHRoZQorICAgICAgICAgT3B0aW9ucyBmb3IgVGFyZ2V0JyBkaWFsb2cuCisKKyAgICAqKiogSUNDQVJNIENvbXBpbGVyICoqKgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgWy4uXSBSQU0gZnVuY3Rpb25zIGFyZSBkZWZpbmVkIHVzaW5nIGEgc3BlY2lmaWMgdG9vbGNoYWluIGtleXdvcmQKKyAgIl9fcmFtZnVuYyIuCisKKyAgICAqKiogR05VIENvbXBpbGVyICoqKgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgWy4uXSBSQU0gZnVuY3Rpb25zIGFyZSBkZWZpbmVkIHVzaW5nIGEgc3BlY2lmaWMgdG9vbGNoYWluIGF0dHJpYnV0ZQorICAgICAgICAgIl9fYXR0cmlidXRlX18oKHNlY3Rpb24oIi5SYW1GdW5jIikpKSIuCisKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGVybXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZQorICBpbgorICAqIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4KKyAgKiBJZiBubyBMSUNFTlNFIGZpbGUgY29tZXMgd2l0aCB0aGlzIHNvZnR3YXJlLCBpdCBpcyBwcm92aWRlZCBBUy1JUy4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnNHh4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHNHh4X0hBTF9Ecml2ZXIKKyAqIEB7CisgKi8KKworLyoqIEBkZWZncm91cCBGTEFTSF9SQU1GVU5DIEZMQVNIX1JBTUZVTkMKKyAqIEBicmllZiBGTEFTSCBmdW5jdGlvbnMgZXhlY3V0ZWQgZnJvbSBSQU0KKyAqIEB7CisgKi8KKworI2lmZGVmIEhBTF9GTEFTSF9NT0RVTEVfRU5BQkxFRAorCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBGTEFTSF9SQU1GVU5DX0V4cG9ydGVkX0Z1bmN0aW9ucyBGTEFTSF9SQU1GVU5DIEV4cG9ydGVkIEZ1bmN0aW9ucworICogQHsKKyAqLworCisvKiogQGRlZmdyb3VwIEZMQVNIX1JBTUZVTkNfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBQZXJpcGhlcmFsIGZlYXR1cmVzCitmdW5jdGlvbnMKKyAqICBAYnJpZWYgICBEYXRhIHRyYW5zZmVycyBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgcmFtZnVuYyBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgZXhlY3V0ZWQgZnJvbQorUkFNLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAqIEBicmllZiAgRW5hYmxlIHRoZSBQb3dlciBkb3duIGluIFJ1biBNb2RlCisgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBhbmQgZXhlY3V0ZWQgZnJvbSBTUkFNIG1lbW9yeS4KKyAqIEByZXR2YWwgTm9uZQorICovCitfX1JBTV9GVU5DIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9GTEFTSEV4X0VuYWJsZVJ1blBvd2VyRG93bih2b2lkKSB7CisgIC8qIEVuYWJsZSB0aGUgUG93ZXIgRG93biBpbiBSdW4gbW9kZSovCisgIF9fSEFMX0ZMQVNIX1BPV0VSX0RPV05fRU5BQkxFKCk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgdGhlIFBvd2VyIGRvd24gaW4gUnVuIE1vZGUKKyAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGFuZCBleGVjdXRlZCBmcm9tIFNSQU0gbWVtb3J5LgorICogQHJldHZhbCBOb25lCisgKi8KK19fUkFNX0ZVTkMgSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIRXhfRGlzYWJsZVJ1blBvd2VyRG93bih2b2lkKSB7CisgIC8qIERpc2FibGUgdGhlIFBvd2VyIERvd24gaW4gUnVuIG1vZGUqLworICBfX0hBTF9GTEFTSF9QT1dFUl9ET1dOX0RJU0FCTEUoKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisjaWYgZGVmaW5lZChGTEFTSF9PUFRSX0RCQU5LKQorLyoqCisgKiBAYnJpZWYgIFByb2dyYW0gdGhlIEZMQVNIIERCQU5LIFVzZXIgT3B0aW9uIEJ5dGUuCisgKgorICogQG5vdGUgICBUbyBjb25maWd1cmUgdGhlIHVzZXIgb3B0aW9uIGJ5dGVzLCB0aGUgb3B0aW9uIGxvY2sgYml0IE9QVExPQ0sgbXVzdAorICogICAgICAgICBiZSBjbGVhcmVkIHdpdGggdGhlIGNhbGwgb2YgdGhlIEhBTF9GTEFTSF9PQl9VbmxvY2soKSBmdW5jdGlvbi4KKyAqIEBub3RlICAgVG8gbW9kaWZ5IHRoZSBEQkFOSyBvcHRpb24gYnl0ZSwgbm8gUENST1AgcmVnaW9uIHNob3VsZCBiZSBkZWZpbmVkLgorICogICAgICAgICBUbyBkZWFjdGl2YXRlIFBDUk9QLCB1c2VyIHNob3VsZCBwZXJmb3JtIFJEUCBjaGFuZ2luZy4KKyAqCisgKiBAcGFyYW0gIERCYW5rQ29uZmlnIFRoZSBGTEFTSCBEQkFOSyBVc2VyIE9wdGlvbiBCeXRlIHZhbHVlLgorICogICAgICAgICBUaGlzIHBhcmFtZXRlciAgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBPQl9EQkFOS18xMjhfQklUUzogU2luZ2xlLWJhbmsgd2l0aCAxMjgtYml0cyBkYXRhCisgKiAgICAgICAgICAgIEBhcmcgT0JfREJBTktfNjRfQklUUzogRHVhbC1iYW5rIHdpdGggNjQtYml0cyBkYXRhCisgKgorICogQHJldHZhbCBIQUxfU3RhdHVzCisgKi8KK19fUkFNX0ZVTkMgSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIRXhfT0JfREJhbmtDb25maWcodWludDMyX3QgREJhbmtDb25maWcpIHsKKyAgdWludDMyX3QgY291bnQsIHJlZzsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX0VSUk9SOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soJnBGbGFzaCk7CisKKyAgLyogQ2hlY2sgaWYgdGhlIFBDUk9QIGlzIGRpc2FibGVkICovCisgIHJlZyA9IEZMQVNILT5QQ1JPUDFTUjsKKyAgaWYgKHJlZyA+IEZMQVNILT5QQ1JPUDFFUikgeworICAgIHJlZyA9IEZMQVNILT5QQ1JPUDJTUjsKKyAgICBpZiAocmVnID4gRkxBU0gtPlBDUk9QMkVSKSB7CisgICAgICAvKiBEaXNhYmxlIEZsYXNoIHByZWZldGNoICovCisgICAgICBfX0hBTF9GTEFTSF9QUkVGRVRDSF9CVUZGRVJfRElTQUJMRSgpOworCisgICAgICBpZiAoUkVBRF9CSVQoRkxBU0gtPkFDUiwgRkxBU0hfQUNSX0lDRU4pICE9IDBVKSB7CisgICAgICAgIC8qIERpc2FibGUgRmxhc2ggaW5zdHJ1Y3Rpb24gY2FjaGUgKi8KKyAgICAgICAgX19IQUxfRkxBU0hfSU5TVFJVQ1RJT05fQ0FDSEVfRElTQUJMRSgpOworCisgICAgICAgIC8qIEZsdXNoIEZsYXNoIGluc3RydWN0aW9uIGNhY2hlICovCisgICAgICAgIF9fSEFMX0ZMQVNIX0lOU1RSVUNUSU9OX0NBQ0hFX1JFU0VUKCk7CisgICAgICB9CisKKyAgICAgIGlmIChSRUFEX0JJVChGTEFTSC0+QUNSLCBGTEFTSF9BQ1JfRENFTikgIT0gMFUpIHsKKyAgICAgICAgLyogRGlzYWJsZSBGbGFzaCBkYXRhIGNhY2hlICovCisgICAgICAgIF9fSEFMX0ZMQVNIX0RBVEFfQ0FDSEVfRElTQUJMRSgpOworCisgICAgICAgIC8qIEZsdXNoIEZsYXNoIGRhdGEgY2FjaGUgKi8KKyAgICAgICAgX19IQUxfRkxBU0hfREFUQV9DQUNIRV9SRVNFVCgpOworICAgICAgfQorCisgICAgICAvKiBEaXNhYmxlIFdSUCB6b25lIEEgb2YgMXN0IGJhbmsgaWYgbmVlZGVkICovCisgICAgICByZWcgPSBGTEFTSC0+V1JQMUFSOworICAgICAgaWYgKCgocmVnICYgRkxBU0hfV1JQMUFSX1dSUDFBX1NUUlQpID4+IEZMQVNIX1dSUDFBUl9XUlAxQV9TVFJUX1BvcykgPD0KKyAgICAgICAgICAoKHJlZyAmIEZMQVNIX1dSUDFBUl9XUlAxQV9FTkQpID4+IEZMQVNIX1dSUDFBUl9XUlAxQV9FTkRfUG9zKSkgeworICAgICAgICBNT0RJRllfUkVHKEZMQVNILT5XUlAxQVIsCisgICAgICAgICAgICAgICAgICAgKEZMQVNIX1dSUDFBUl9XUlAxQV9TVFJUIHwgRkxBU0hfV1JQMUFSX1dSUDFBX0VORCksCisgICAgICAgICAgICAgICAgICAgRkxBU0hfV1JQMUFSX1dSUDFBX1NUUlQpOworICAgICAgfQorCisgICAgICAvKiBEaXNhYmxlIFdSUCB6b25lIEIgb2YgMXN0IGJhbmsgaWYgbmVlZGVkICovCisgICAgICByZWcgPSBGTEFTSC0+V1JQMUJSOworICAgICAgaWYgKCgocmVnICYgRkxBU0hfV1JQMUJSX1dSUDFCX1NUUlQpID4+IEZMQVNIX1dSUDFCUl9XUlAxQl9TVFJUX1BvcykgPD0KKyAgICAgICAgICAoKHJlZyAmIEZMQVNIX1dSUDFCUl9XUlAxQl9FTkQpID4+IEZMQVNIX1dSUDFCUl9XUlAxQl9FTkRfUG9zKSkgeworICAgICAgICBNT0RJRllfUkVHKEZMQVNILT5XUlAxQlIsCisgICAgICAgICAgICAgICAgICAgKEZMQVNIX1dSUDFCUl9XUlAxQl9TVFJUIHwgRkxBU0hfV1JQMUJSX1dSUDFCX0VORCksCisgICAgICAgICAgICAgICAgICAgRkxBU0hfV1JQMUJSX1dSUDFCX1NUUlQpOworICAgICAgfQorCisgICAgICAvKiBEaXNhYmxlIFdSUCB6b25lIEEgb2YgMm5kIGJhbmsgaWYgbmVlZGVkICovCisgICAgICByZWcgPSBGTEFTSC0+V1JQMkFSOworICAgICAgaWYgKCgocmVnICYgRkxBU0hfV1JQMkFSX1dSUDJBX1NUUlQpID4+IEZMQVNIX1dSUDJBUl9XUlAyQV9TVFJUX1BvcykgPD0KKyAgICAgICAgICAoKHJlZyAmIEZMQVNIX1dSUDJBUl9XUlAyQV9FTkQpID4+IEZMQVNIX1dSUDJBUl9XUlAyQV9FTkRfUG9zKSkgeworICAgICAgICBNT0RJRllfUkVHKEZMQVNILT5XUlAyQVIsCisgICAgICAgICAgICAgICAgICAgKEZMQVNIX1dSUDJBUl9XUlAyQV9TVFJUIHwgRkxBU0hfV1JQMkFSX1dSUDJBX0VORCksCisgICAgICAgICAgICAgICAgICAgRkxBU0hfV1JQMkFSX1dSUDJBX1NUUlQpOworICAgICAgfQorCisgICAgICAvKiBEaXNhYmxlIFdSUCB6b25lIEIgb2YgMm5kIGJhbmsgaWYgbmVlZGVkICovCisgICAgICByZWcgPSBGTEFTSC0+V1JQMkJSOworICAgICAgaWYgKCgocmVnICYgRkxBU0hfV1JQMkJSX1dSUDJCX1NUUlQpID4+IEZMQVNIX1dSUDJCUl9XUlAyQl9TVFJUX1BvcykgPD0KKyAgICAgICAgICAoKHJlZyAmIEZMQVNIX1dSUDJCUl9XUlAyQl9FTkQpID4+IEZMQVNIX1dSUDJCUl9XUlAyQl9FTkRfUG9zKSkgeworICAgICAgICBNT0RJRllfUkVHKEZMQVNILT5XUlAyQlIsCisgICAgICAgICAgICAgICAgICAgKEZMQVNIX1dSUDJCUl9XUlAyQl9TVFJUIHwgRkxBU0hfV1JQMkJSX1dSUDJCX0VORCksCisgICAgICAgICAgICAgICAgICAgRkxBU0hfV1JQMkJSX1dSUDJCX1NUUlQpOworICAgICAgfQorCisgICAgICAvKiBNb2RpZnkgdGhlIERCQU5LIHVzZXIgb3B0aW9uIGJ5dGUgKi8KKyAgICAgIE1PRElGWV9SRUcoRkxBU0gtPk9QVFIsIEZMQVNIX09QVFJfREJBTkssIERCYW5rQ29uZmlnKTsKKworICAgICAgLyogU2V0IE9QVFNUUlQgQml0ICovCisgICAgICBTRVRfQklUKEZMQVNILT5DUiwgRkxBU0hfQ1JfT1BUU1RSVCk7CisKKyAgICAgIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLworICAgICAgLyogOCBpcyB0aGUgbnVtYmVyIG9mIHJlcXVpcmVkIGluc3RydWN0aW9uIGN5Y2xlcyBmb3IgdGhlIGJlbG93IGxvb3AKKyAgICAgICAqIHN0YXRlbWVudCAodGltZW91dCBleHByZXNzZWQgaW4gbXMpICovCisgICAgICBjb3VudCA9IEZMQVNIX1RJTUVPVVRfVkFMVUUgKiAoU3lzdGVtQ29yZUNsb2NrIC8gOFUgLyAxMDAwVSk7CisgICAgICBkbyB7CisgICAgICAgIGlmIChjb3VudCA9PSAwVSkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNvdW50LS07CisgICAgICB9IHdoaWxlIChfX0hBTF9GTEFTSF9HRVRfRkxBRyhGTEFTSF9GTEFHX0JTWSkgIT0gUkVTRVQpOworCisgICAgICAvKiBJZiB0aGUgb3B0aW9uIGJ5dGUgcHJvZ3JhbSBvcGVyYXRpb24gaXMgY29tcGxldGVkLCBkaXNhYmxlIHRoZSBPUFRTVFJUCisgICAgICAgKiBCaXQgKi8KKyAgICAgIENMRUFSX0JJVChGTEFTSC0+Q1IsIEZMQVNIX0NSX09QVFNUUlQpOworCisgICAgICAvKiBTZXQgdGhlIGJpdCB0byBmb3JjZSB0aGUgb3B0aW9uIGJ5dGUgcmVsb2FkaW5nICovCisgICAgICBTRVRfQklUKEZMQVNILT5DUiwgRkxBU0hfQ1JfT0JMX0xBVU5DSCk7CisgICAgfQorICB9CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soJnBGbGFzaCk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKyNlbmRpZgorCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCisjZW5kaWYgLyogSEFMX0ZMQVNIX01PRFVMRV9FTkFCTEVEICovCisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KZGlmZiAtLWdpdCBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9ncGlvLmMgYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfZ3Bpby5jCmluZGV4IDk5MTliMzUuLjUxNTdjNTAgMTAwNjQ0Ci0tLSBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9ncGlvLmMKKysrIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX2dwaW8uYwpAQCAtMSw1MjMgKzEsNTIzIEBACi0vKioNCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgKiBAZmlsZSAgICBzdG0zMmc0eHhfaGFsX2dwaW8uYw0KLSAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQ0KLSAgKiBAYnJpZWYgICBHUElPIEhBTCBtb2R1bGUgZHJpdmVyLg0KLSAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nDQotICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgR2VuZXJhbCBQdXJwb3NlIElucHV0L091dHB1dCAoR1BJTykNCi0gIHBlcmlwaGVyYWw6DQotICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMNCi0gICogICAgICAgICAgICsgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucw0KLSAgKg0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICAqIEBhdHRlbnRpb24NCi0gICoNCi0gICogQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4NCi0gICogQWxsIHJpZ2h0cyByZXNlcnZlZC4NCi0gICoNCi0gICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0ZXJtcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlDQotICAqIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4NCi0gICogSWYgbm8gTElDRU5TRSBmaWxlIGNvbWVzIHdpdGggdGhpcyBzb2Z0d2FyZSwgaXQgaXMgcHJvdmlkZWQgQVMtSVMuDQotICAqDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gIEB2ZXJiYXRpbQ0KLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgICAgICAgICAgICAgICAgICAjIyMjIyBHUElPIFBlcmlwaGVyYWwgZmVhdHVyZXMgIyMjIyMNCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgWy4uXQ0KLSAgICAoKykgRWFjaCBwb3J0IGJpdCBvZiB0aGUgZ2VuZXJhbC1wdXJwb3NlIEkvTyAoR1BJTykgcG9ydHMgY2FuIGJlDQotICBpbmRpdmlkdWFsbHkgY29uZmlndXJlZCBieSBzb2Z0d2FyZSBpbiBzZXZlcmFsIG1vZGVzOg0KLSAgICAgICAgKCsrKSBJbnB1dCBtb2RlDQotICAgICAgICAoKyspIEFuYWxvZyBtb2RlDQotICAgICAgICAoKyspIE91dHB1dCBtb2RlDQotICAgICAgICAoKyspIEFsdGVybmF0ZSBmdW5jdGlvbiBtb2RlDQotICAgICAgICAoKyspIEV4dGVybmFsIGludGVycnVwdC9ldmVudCBsaW5lcw0KLQ0KLSAgICAoKykgRHVyaW5nIGFuZCBqdXN0IGFmdGVyIHJlc2V0LCB0aGUgYWx0ZXJuYXRlIGZ1bmN0aW9ucyBhbmQgZXh0ZXJuYWwNCi0gIGludGVycnVwdCBsaW5lcyBhcmUgbm90IGFjdGl2ZSBhbmQgdGhlIEkvTyBwb3J0cyBhcmUgY29uZmlndXJlZCBpbiBpbnB1dA0KLSAgZmxvYXRpbmcgbW9kZS4NCi0NCi0gICAgKCspIEFsbCBHUElPIHBpbnMgaGF2ZSB3ZWFrIGludGVybmFsIHB1bGwtdXAgYW5kIHB1bGwtZG93biByZXNpc3RvcnMsIHdoaWNoDQotICBjYW4gYmUgYWN0aXZhdGVkIG9yIG5vdC4NCi0NCi0gICAgKCspIEluIE91dHB1dCBvciBBbHRlcm5hdGUgbW9kZSwgZWFjaCBJTyBjYW4gYmUgY29uZmlndXJlZCBvbiBvcGVuLWRyYWluIG9yDQotICBwdXNoLXB1bGwgdHlwZSBhbmQgdGhlIElPIHNwZWVkIGNhbiBiZSBzZWxlY3RlZCBkZXBlbmRpbmcgb24gdGhlIFZERCB2YWx1ZS4NCi0NCi0gICAgKCspIFRoZSBtaWNyb2NvbnRyb2xsZXIgSU8gcGlucyBhcmUgY29ubmVjdGVkIHRvIG9uYm9hcmQgcGVyaXBoZXJhbHMvbW9kdWxlcw0KLSAgdGhyb3VnaCBhIG11bHRpcGxleGVyIHRoYXQgYWxsb3dzIG9ubHkgb25lIHBlcmlwaGVyYWwgYWx0ZXJuYXRlIGZ1bmN0aW9uIChBRikNCi0gIGNvbm5lY3RlZCB0byBhbiBJTyBwaW4gYXQgYSB0aW1lLiBJbiB0aGlzIHdheSwgdGhlcmUgY2FuIGJlIG5vIGNvbmZsaWN0DQotICBiZXR3ZWVuIHBlcmlwaGVyYWxzIHNoYXJpbmcgdGhlIHNhbWUgSU8gcGluLg0KLQ0KLSAgICAoKykgQWxsIHBvcnRzIGhhdmUgZXh0ZXJuYWwgaW50ZXJydXB0L2V2ZW50IGNhcGFiaWxpdHkuIFRvIHVzZSBleHRlcm5hbA0KLSAgaW50ZXJydXB0IGxpbmVzLCB0aGUgcG9ydCBtdXN0IGJlIGNvbmZpZ3VyZWQgaW4gaW5wdXQgbW9kZS4gQWxsIGF2YWlsYWJsZSBHUElPDQotICBwaW5zIGFyZSBjb25uZWN0ZWQgdG8gdGhlIDE2IGV4dGVybmFsIGludGVycnVwdC9ldmVudCBsaW5lcyBmcm9tIEVYVEkwIHRvDQotICBFWFRJMTUuDQotDQotICAgICgrKSBUaGUgZXh0ZXJuYWwgaW50ZXJydXB0L2V2ZW50IGNvbnRyb2xsZXIgY29uc2lzdHMgb2YgdXAgdG8gNDQgZWRnZQ0KLSAgZGV0ZWN0b3JzICgxNiBsaW5lcyBhcmUgY29ubmVjdGVkIHRvIEdQSU8pIGZvciBnZW5lcmF0aW5nIGV2ZW50L2ludGVycnVwdA0KLSAgcmVxdWVzdHMgKGVhY2ggaW5wdXQgbGluZSBjYW4gYmUgaW5kZXBlbmRlbnRseSBjb25maWd1cmVkIHRvIHNlbGVjdCB0aGUgdHlwZQ0KLSAgKGludGVycnVwdCBvciBldmVudCkgYW5kIHRoZSBjb3JyZXNwb25kaW5nIHRyaWdnZXIgZXZlbnQgKHJpc2luZyBvciBmYWxsaW5nIG9yDQotICBib3RoKS4gRWFjaCBsaW5lIGNhbiBhbHNvIGJlIG1hc2tlZCBpbmRlcGVuZGVudGx5Lg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMNCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgWy4uXQ0KLSAgICAoIykgRW5hYmxlIHRoZSBHUElPIEFIQiBjbG9jayB1c2luZyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uOg0KLSAgX19IQUxfUkNDX0dQSU94X0NMS19FTkFCTEUoKS4NCi0NCi0gICAgKCMpIENvbmZpZ3VyZSB0aGUgR1BJTyBwaW4ocykgdXNpbmcgSEFMX0dQSU9fSW5pdCgpLg0KLSAgICAgICAgKCsrKSBDb25maWd1cmUgdGhlIElPIG1vZGUgdXNpbmcgIk1vZGUiIG1lbWJlciBmcm9tIEdQSU9fSW5pdFR5cGVEZWYNCi0gIHN0cnVjdHVyZQ0KLSAgICAgICAgKCsrKSBBY3RpdmF0ZSBQdWxsLXVwLCBQdWxsLWRvd24gcmVzaXN0b3IgdXNpbmcgIlB1bGwiIG1lbWJlciBmcm9tDQotICBHUElPX0luaXRUeXBlRGVmIHN0cnVjdHVyZS4NCi0gICAgICAgICgrKykgSW4gY2FzZSBvZiBPdXRwdXQgb3IgYWx0ZXJuYXRlIGZ1bmN0aW9uIG1vZGUgc2VsZWN0aW9uOiB0aGUgc3BlZWQNCi0gIGlzIGNvbmZpZ3VyZWQgdGhyb3VnaCAiU3BlZWQiIG1lbWJlciBmcm9tIEdQSU9fSW5pdFR5cGVEZWYgc3RydWN0dXJlLg0KLSAgICAgICAgKCsrKSBJbiBhbHRlcm5hdGUgbW9kZSBpcyBzZWxlY3Rpb24sIHRoZSBhbHRlcm5hdGUgZnVuY3Rpb24gY29ubmVjdGVkIHRvDQotICB0aGUgSU8gaXMgY29uZmlndXJlZCB0aHJvdWdoICJBbHRlcm5hdGUiIG1lbWJlciBmcm9tIEdQSU9fSW5pdFR5cGVEZWYNCi0gIHN0cnVjdHVyZS4NCi0gICAgICAgICgrKykgQW5hbG9nIG1vZGUgaXMgcmVxdWlyZWQgd2hlbiBhIHBpbiBpcyB0byBiZSB1c2VkIGFzIEFEQyBjaGFubmVsDQotICAgICAgICAgICAgIG9yIERBQyBvdXRwdXQuDQotICAgICAgICAoKyspIEluIGNhc2Ugb2YgZXh0ZXJuYWwgaW50ZXJydXB0L2V2ZW50IHNlbGVjdGlvbiB0aGUgIk1vZGUiIG1lbWJlcg0KLSAgZnJvbSBHUElPX0luaXRUeXBlRGVmIHN0cnVjdHVyZSBzZWxlY3QgdGhlIHR5cGUgKGludGVycnVwdCBvciBldmVudCkgYW5kIHRoZQ0KLSAgY29ycmVzcG9uZGluZyB0cmlnZ2VyIGV2ZW50IChyaXNpbmcgb3IgZmFsbGluZyBvciBib3RoKS4NCi0NCi0gICAgKCMpIEluIGNhc2Ugb2YgZXh0ZXJuYWwgaW50ZXJydXB0L2V2ZW50IG1vZGUgc2VsZWN0aW9uLCBjb25maWd1cmUgTlZJQyBJUlENCi0gIHByaW9yaXR5IG1hcHBlZCB0byB0aGUgRVhUSSBsaW5lIHVzaW5nIEhBTF9OVklDX1NldFByaW9yaXR5KCkgYW5kIGVuYWJsZSBpdA0KLSAgdXNpbmcgSEFMX05WSUNfRW5hYmxlSVJRKCkuDQotDQotICAgICgjKSBUbyBnZXQgdGhlIGxldmVsIG9mIGEgcGluIGNvbmZpZ3VyZWQgaW4gaW5wdXQgbW9kZSB1c2UNCi0gIEhBTF9HUElPX1JlYWRQaW4oKS4NCi0NCi0gICAgKCMpIFRvIHNldC9yZXNldCB0aGUgbGV2ZWwgb2YgYSBwaW4gY29uZmlndXJlZCBpbiBvdXRwdXQgbW9kZSB1c2UNCi0gICAgICAgIEhBTF9HUElPX1dyaXRlUGluKCkvSEFMX0dQSU9fVG9nZ2xlUGluKCkuDQotDQotICAgKCMpIFRvIGxvY2sgcGluIGNvbmZpZ3VyYXRpb24gdW50aWwgbmV4dCByZXNldCB1c2UgSEFMX0dQSU9fTG9ja1BpbigpLg0KLQ0KLSAgICAoIykgRHVyaW5nIGFuZCBqdXN0IGFmdGVyIHJlc2V0LCB0aGUgYWx0ZXJuYXRlIGZ1bmN0aW9ucyBhcmUgbm90DQotICAgICAgICBhY3RpdmUgYW5kIHRoZSBHUElPIHBpbnMgYXJlIGNvbmZpZ3VyZWQgaW4gaW5wdXQgZmxvYXRpbmcgbW9kZSAoZXhjZXB0DQotICBKVEFHIHBpbnMpLg0KLQ0KLSAgICAoIykgVGhlIExTRSBvc2NpbGxhdG9yIHBpbnMgT1NDMzJfSU4gYW5kIE9TQzMyX09VVCBjYW4gYmUgdXNlZCBhcyBnZW5lcmFsDQotICBwdXJwb3NlIChQQzE0IGFuZCBQQzE1LCByZXNwZWN0aXZlbHkpIHdoZW4gdGhlIExTRSBvc2NpbGxhdG9yIGlzIG9mZi4gVGhlIExTRQ0KLSAgaGFzIHByaW9yaXR5IG92ZXIgdGhlIEdQSU8gZnVuY3Rpb24uDQotDQotICAgICgjKSBUaGUgSFNFIG9zY2lsbGF0b3IgcGlucyBPU0NfSU4vT1NDX09VVCBjYW4gYmUgdXNlZCBhcw0KLSAgICAgICAgZ2VuZXJhbCBwdXJwb3NlIFBGMCBhbmQgUEYxLCByZXNwZWN0aXZlbHksIHdoZW4gdGhlIEhTRSBvc2NpbGxhdG9yIGlzDQotICBvZmYuIFRoZSBIU0UgaGFzIHByaW9yaXR5IG92ZXIgdGhlIEdQSU8gZnVuY3Rpb24uDQotDQotICBAZW5kdmVyYmF0aW0NCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgKi8NCi0NCi0vKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpbmNsdWRlICJzdG0zMmc0eHhfaGFsLmgiDQotDQotLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzR4eF9IQUxfRHJpdmVyDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGFkZHRvZ3JvdXAgR1BJTw0KLSAqIEB7DQotICovDQotLyoqIE1JU1JBIEM6MjAxMiBkZXZpYXRpb24gcnVsZSBoYXMgYmVlbiBncmFudGVkIGZvciBmb2xsb3dpbmcgcnVsZXM6DQotICogUnVsZS0xMi4yIC0gTWVkaXVtOiBSSFMgYXJndW1lbnQgaXMgaW4gaW50ZXJ2YWwgWzAsSU5GXSB3aGljaCBpcyBvdXQgb2YNCi0gKiByYW5nZSBvZiB0aGUgc2hpZnQgb3BlcmF0b3IgaW4gZm9sbG93aW5nIEFQSSA6DQotICogSEFMX0dQSU9fSW5pdA0KLSAqIEhBTF9HUElPX0RlSW5pdA0KLSAqLw0KLQ0KLSNpZmRlZiBIQUxfR1BJT19NT0RVTEVfRU5BQkxFRA0KLQ0KLS8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogUHJpdmF0ZSBkZWZpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGFkZHRvZ3JvdXAgR1BJT19Qcml2YXRlX0NvbnN0YW50cyBHUElPIFByaXZhdGUgQ29uc3RhbnRzDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIEdQSU9fTlVNQkVSICgxNlUpDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLQ0KLS8qKiBAYWRkdG9ncm91cCBHUElPX0V4cG9ydGVkX0Z1bmN0aW9ucw0KLSAqIEB7DQotICovDQotDQotLyoqIEBkZWZncm91cCBHUElPX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24vZGUtaW5pdGlhbGl6YXRpb24NCi1mdW5jdGlvbnMNCi0gICogIEBicmllZiAgICBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMNCi0gICoNCi1AdmVyYmF0aW0NCi0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAjIyMjIw0KLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotQGVuZHZlcmJhdGltDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgR1BJT3ggcGVyaXBoZXJhbCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzDQotICogaW4gdGhlIEdQSU9fSW5pdC4NCi0gKiBAcGFyYW0gIEdQSU94IHdoZXJlIHggY2FuIGJlIChBLi5HKSB0byBzZWxlY3QgdGhlIEdQSU8gcGVyaXBoZXJhbCBmb3INCi0gKiBTVE0zMkc0eHggZmFtaWx5DQotICogQHBhcmFtICBHUElPX0luaXQgcG9pbnRlciB0byBhIEdQSU9fSW5pdFR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCi0gKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEdQSU8gcGVyaXBoZXJhbC4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi12b2lkIEhBTF9HUElPX0luaXQoR1BJT19UeXBlRGVmICpHUElPeCwgR1BJT19Jbml0VHlwZURlZiAqR1BJT19Jbml0KSB7DQotICB1aW50MzJfdCBwb3NpdGlvbiA9IDB4MDBVOw0KLSAgdWludDMyX3QgaW9jdXJyZW50Ow0KLSAgdWludDMyX3QgdGVtcDsNCi0NCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfR1BJT19BTExfSU5TVEFOQ0UoR1BJT3gpKTsNCi0gIGFzc2VydF9wYXJhbShJU19HUElPX1BJTihHUElPX0luaXQtPlBpbikpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0dQSU9fTU9ERShHUElPX0luaXQtPk1vZGUpKTsNCi0NCi0gIC8qIENvbmZpZ3VyZSB0aGUgcG9ydCBwaW5zICovDQotICB3aGlsZSAoKChHUElPX0luaXQtPlBpbikgPj4gcG9zaXRpb24pICE9IDBVKSB7DQotICAgIC8qIEdldCBjdXJyZW50IGlvIHBvc2l0aW9uICovDQotICAgIGlvY3VycmVudCA9IChHUElPX0luaXQtPlBpbikgJiAoMVVMIDw8IHBvc2l0aW9uKTsNCi0NCi0gICAgaWYgKGlvY3VycmVudCAhPSAweDAwdSkgew0KLSAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdQSU8gTW9kZSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotICAgICAgLyogSW4gY2FzZSBvZiBPdXRwdXQgb3IgQWx0ZXJuYXRlIGZ1bmN0aW9uIG1vZGUgc2VsZWN0aW9uICovDQotICAgICAgaWYgKCgoR1BJT19Jbml0LT5Nb2RlICYgR1BJT19NT0RFKSA9PSBNT0RFX09VVFBVVCkgfHwNCi0gICAgICAgICAgKChHUElPX0luaXQtPk1vZGUgJiBHUElPX01PREUpID09IE1PREVfQUYpKSB7DQotICAgICAgICAvKiBDaGVjayB0aGUgU3BlZWQgcGFyYW1ldGVyICovDQotICAgICAgICBhc3NlcnRfcGFyYW0oSVNfR1BJT19TUEVFRChHUElPX0luaXQtPlNwZWVkKSk7DQotICAgICAgICAvKiBDb25maWd1cmUgdGhlIElPIFNwZWVkICovDQotICAgICAgICB0ZW1wID0gR1BJT3gtPk9TUEVFRFI7DQotICAgICAgICB0ZW1wICY9IH4oR1BJT19PU1BFRURSX09TUEVFRDAgPDwgKHBvc2l0aW9uICogMlUpKTsNCi0gICAgICAgIHRlbXAgfD0gKEdQSU9fSW5pdC0+U3BlZWQgPDwgKHBvc2l0aW9uICogMlUpKTsNCi0gICAgICAgIEdQSU94LT5PU1BFRURSID0gdGVtcDsNCi0NCi0gICAgICAgIC8qIENvbmZpZ3VyZSB0aGUgSU8gT3V0cHV0IFR5cGUgKi8NCi0gICAgICAgIHRlbXAgPSBHUElPeC0+T1RZUEVSOw0KLSAgICAgICAgdGVtcCAmPSB+KEdQSU9fT1RZUEVSX09UMCA8PCBwb3NpdGlvbik7DQotICAgICAgICB0ZW1wIHw9DQotICAgICAgICAgICAgKCgoR1BJT19Jbml0LT5Nb2RlICYgT1VUUFVUX1RZUEUpID4+IE9VVFBVVF9UWVBFX1BvcykgPDwgcG9zaXRpb24pOw0KLSAgICAgICAgR1BJT3gtPk9UWVBFUiA9IHRlbXA7DQotICAgICAgfQ0KLQ0KLSAgICAgIGlmICgoR1BJT19Jbml0LT5Nb2RlICYgR1BJT19NT0RFKSAhPSBNT0RFX0FOQUxPRykgew0KLSAgICAgICAgLyogQ2hlY2sgdGhlIFB1bGwgcGFyYW1ldGVyICovDQotICAgICAgICBhc3NlcnRfcGFyYW0oSVNfR1BJT19QVUxMKEdQSU9fSW5pdC0+UHVsbCkpOw0KLQ0KLSAgICAgICAgLyogQWN0aXZhdGUgdGhlIFB1bGwtdXAgb3IgUHVsbCBkb3duIHJlc2lzdG9yIGZvciB0aGUgY3VycmVudCBJTyAqLw0KLSAgICAgICAgdGVtcCA9IEdQSU94LT5QVVBEUjsNCi0gICAgICAgIHRlbXAgJj0gfihHUElPX1BVUERSX1BVUEQwIDw8IChwb3NpdGlvbiAqIDJVKSk7DQotICAgICAgICB0ZW1wIHw9ICgoR1BJT19Jbml0LT5QdWxsKSA8PCAocG9zaXRpb24gKiAyVSkpOw0KLSAgICAgICAgR1BJT3gtPlBVUERSID0gdGVtcDsNCi0gICAgICB9DQotDQotICAgICAgLyogSW4gY2FzZSBvZiBBbHRlcm5hdGUgZnVuY3Rpb24gbW9kZSBzZWxlY3Rpb24gKi8NCi0gICAgICBpZiAoKEdQSU9fSW5pdC0+TW9kZSAmIEdQSU9fTU9ERSkgPT0gTU9ERV9BRikgew0KLSAgICAgICAgLyogQ2hlY2sgdGhlIEFsdGVybmF0ZSBmdW5jdGlvbiBwYXJhbWV0ZXJzICovDQotICAgICAgICBhc3NlcnRfcGFyYW0oSVNfR1BJT19BRl9JTlNUQU5DRShHUElPeCkpOw0KLSAgICAgICAgYXNzZXJ0X3BhcmFtKElTX0dQSU9fQUYoR1BJT19Jbml0LT5BbHRlcm5hdGUpKTsNCi0NCi0gICAgICAgIC8qIENvbmZpZ3VyZSBBbHRlcm5hdGUgZnVuY3Rpb24gbWFwcGVkIHdpdGggdGhlIGN1cnJlbnQgSU8gKi8NCi0gICAgICAgIHRlbXAgPSBHUElPeC0+QUZSW3Bvc2l0aW9uID4+IDNVXTsNCi0gICAgICAgIHRlbXAgJj0gfigweEZVIDw8ICgocG9zaXRpb24gJiAweDA3VSkgKiA0VSkpOw0KLSAgICAgICAgdGVtcCB8PSAoKEdQSU9fSW5pdC0+QWx0ZXJuYXRlKSA8PCAoKHBvc2l0aW9uICYgMHgwN1UpICogNFUpKTsNCi0gICAgICAgIEdQSU94LT5BRlJbcG9zaXRpb24gPj4gM1VdID0gdGVtcDsNCi0gICAgICB9DQotDQotICAgICAgLyogQ29uZmlndXJlIElPIERpcmVjdGlvbiBtb2RlIChJbnB1dCwgT3V0cHV0LCBBbHRlcm5hdGUgb3IgQW5hbG9nKSAqLw0KLSAgICAgIHRlbXAgPSBHUElPeC0+TU9ERVI7DQotICAgICAgdGVtcCAmPSB+KEdQSU9fTU9ERVJfTU9ERTAgPDwgKHBvc2l0aW9uICogMlUpKTsNCi0gICAgICB0ZW1wIHw9ICgoR1BJT19Jbml0LT5Nb2RlICYgR1BJT19NT0RFKSA8PCAocG9zaXRpb24gKiAyVSkpOw0KLSAgICAgIEdQSU94LT5NT0RFUiA9IHRlbXA7DQotDQotICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gRVhUSSBNb2RlIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0gICAgICAvKiBDb25maWd1cmUgdGhlIEV4dGVybmFsIEludGVycnVwdCBvciBldmVudCBmb3IgdGhlIGN1cnJlbnQgSU8gKi8NCi0gICAgICBpZiAoKEdQSU9fSW5pdC0+TW9kZSAmIEVYVElfTU9ERSkgIT0gMHgwMHUpIHsNCi0gICAgICAgIC8qIEVuYWJsZSBTWVNDRkcgQ2xvY2sgKi8NCi0gICAgICAgIF9fSEFMX1JDQ19TWVNDRkdfQ0xLX0VOQUJMRSgpOw0KLQ0KLSAgICAgICAgdGVtcCA9IFNZU0NGRy0+RVhUSUNSW3Bvc2l0aW9uID4+IDJVXTsNCi0gICAgICAgIHRlbXAgJj0gfigweDBGVUwgPDwgKDRVICogKHBvc2l0aW9uICYgMHgwM1UpKSk7DQotICAgICAgICB0ZW1wIHw9IChHUElPX0dFVF9JTkRFWChHUElPeCkgPDwgKDRVICogKHBvc2l0aW9uICYgMHgwM1UpKSk7DQotICAgICAgICBTWVNDRkctPkVYVElDUltwb3NpdGlvbiA+PiAyVV0gPSB0ZW1wOw0KLQ0KLSAgICAgICAgLyogQ2xlYXIgUmlzaW5nIEZhbGxpbmcgZWRnZSBjb25maWd1cmF0aW9uICovDQotICAgICAgICB0ZW1wID0gRVhUSS0+UlRTUjE7DQotICAgICAgICB0ZW1wICY9IH4oaW9jdXJyZW50KTsNCi0gICAgICAgIGlmICgoR1BJT19Jbml0LT5Nb2RlICYgVFJJR0dFUl9SSVNJTkcpICE9IDB4MDBVKSB7DQotICAgICAgICAgIHRlbXAgfD0gaW9jdXJyZW50Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgRVhUSS0+UlRTUjEgPSB0ZW1wOw0KLQ0KLSAgICAgICAgdGVtcCA9IEVYVEktPkZUU1IxOw0KLSAgICAgICAgdGVtcCAmPSB+KGlvY3VycmVudCk7DQotICAgICAgICBpZiAoKEdQSU9fSW5pdC0+TW9kZSAmIFRSSUdHRVJfRkFMTElORykgIT0gMHgwMFUpIHsNCi0gICAgICAgICAgdGVtcCB8PSBpb2N1cnJlbnQ7DQotICAgICAgICB9DQotICAgICAgICBFWFRJLT5GVFNSMSA9IHRlbXA7DQotDQotICAgICAgICB0ZW1wID0gRVhUSS0+RU1SMTsNCi0gICAgICAgIHRlbXAgJj0gfihpb2N1cnJlbnQpOw0KLSAgICAgICAgaWYgKChHUElPX0luaXQtPk1vZGUgJiBFWFRJX0VWVCkgIT0gMHgwMFUpIHsNCi0gICAgICAgICAgdGVtcCB8PSBpb2N1cnJlbnQ7DQotICAgICAgICB9DQotICAgICAgICBFWFRJLT5FTVIxID0gdGVtcDsNCi0NCi0gICAgICAgIC8qIENsZWFyIEVYVEkgbGluZSBjb25maWd1cmF0aW9uICovDQotICAgICAgICB0ZW1wID0gRVhUSS0+SU1SMTsNCi0gICAgICAgIHRlbXAgJj0gfihpb2N1cnJlbnQpOw0KLSAgICAgICAgaWYgKChHUElPX0luaXQtPk1vZGUgJiBFWFRJX0lUKSAhPSAweDAwVSkgew0KLSAgICAgICAgICB0ZW1wIHw9IGlvY3VycmVudDsNCi0gICAgICAgIH0NCi0gICAgICAgIEVYVEktPklNUjEgPSB0ZW1wOw0KLSAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwb3NpdGlvbisrOw0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERlLWluaXRpYWxpemUgdGhlIEdQSU94IHBlcmlwaGVyYWwgcmVnaXN0ZXJzIHRvIHRoZWlyIGRlZmF1bHQgcmVzZXQNCi0gKiB2YWx1ZXMuDQotICogQHBhcmFtICBHUElPeCB3aGVyZSB4IGNhbiBiZSAoQS4uRykgdG8gc2VsZWN0IHRoZSBHUElPIHBlcmlwaGVyYWwgZm9yDQotICogU1RNMzJHNHh4IGZhbWlseQ0KLSAqIEBwYXJhbSAgR1BJT19QaW4gc3BlY2lmaWVzIHRoZSBwb3J0IGJpdCB0byBiZSB3cml0dGVuLg0KLSAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiBHUElPX1BJTl94IHdoZXJlIHggY2FuIGJlDQotICogKDAuLjE1KS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi12b2lkIEhBTF9HUElPX0RlSW5pdChHUElPX1R5cGVEZWYgKkdQSU94LCB1aW50MzJfdCBHUElPX1Bpbikgew0KLSAgdWludDMyX3QgcG9zaXRpb24gPSAweDAwVTsNCi0gIHVpbnQzMl90IGlvY3VycmVudDsNCi0gIHVpbnQzMl90IHRtcDsNCi0NCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfR1BJT19BTExfSU5TVEFOQ0UoR1BJT3gpKTsNCi0gIGFzc2VydF9wYXJhbShJU19HUElPX1BJTihHUElPX1BpbikpOw0KLQ0KLSAgLyogQ29uZmlndXJlIHRoZSBwb3J0IHBpbnMgKi8NCi0gIHdoaWxlICgoR1BJT19QaW4gPj4gcG9zaXRpb24pICE9IDBVKSB7DQotICAgIC8qIEdldCBjdXJyZW50IGlvIHBvc2l0aW9uICovDQotICAgIGlvY3VycmVudCA9IChHUElPX1BpbikgJiAoMVVMIDw8IHBvc2l0aW9uKTsNCi0NCi0gICAgaWYgKGlvY3VycmVudCAhPSAweDAwdSkgew0KLSAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFWFRJIE1vZGUgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotICAgICAgLyogQ2xlYXIgdGhlIEV4dGVybmFsIEludGVycnVwdCBvciBFdmVudCBmb3IgdGhlIGN1cnJlbnQgSU8gKi8NCi0NCi0gICAgICB0bXAgPSBTWVNDRkctPkVYVElDUltwb3NpdGlvbiA+PiAyVV07DQotICAgICAgdG1wICY9ICgweDBGVUwgPDwgKDRVICogKHBvc2l0aW9uICYgMHgwM1UpKSk7DQotICAgICAgaWYgKHRtcCA9PSAoR1BJT19HRVRfSU5ERVgoR1BJT3gpIDw8ICg0VSAqIChwb3NpdGlvbiAmIDB4MDNVKSkpKSB7DQotICAgICAgICAvKiBDbGVhciBFWFRJIGxpbmUgY29uZmlndXJhdGlvbiAqLw0KLSAgICAgICAgRVhUSS0+SU1SMSAmPSB+KGlvY3VycmVudCk7DQotICAgICAgICBFWFRJLT5FTVIxICY9IH4oaW9jdXJyZW50KTsNCi0NCi0gICAgICAgIC8qIENsZWFyIFJpc2luZyBGYWxsaW5nIGVkZ2UgY29uZmlndXJhdGlvbiAqLw0KLSAgICAgICAgRVhUSS0+RlRTUjEgJj0gfihpb2N1cnJlbnQpOw0KLSAgICAgICAgRVhUSS0+UlRTUjEgJj0gfihpb2N1cnJlbnQpOw0KLQ0KLSAgICAgICAgdG1wID0gMHgwRlVMIDw8ICg0VSAqIChwb3NpdGlvbiAmIDB4MDNVKSk7DQotICAgICAgICBTWVNDRkctPkVYVElDUltwb3NpdGlvbiA+PiAyVV0gJj0gfnRtcDsNCi0gICAgICB9DQotDQotICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdQSU8gTW9kZSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0gICAgICAvKiBDb25maWd1cmUgSU8gaW4gQW5hbG9nIE1vZGUgKi8NCi0gICAgICBHUElPeC0+TU9ERVIgfD0gKEdQSU9fTU9ERVJfTU9ERTAgPDwgKHBvc2l0aW9uICogMnUpKTsNCi0NCi0gICAgICAvKiBDb25maWd1cmUgdGhlIGRlZmF1bHQgQWx0ZXJuYXRlIEZ1bmN0aW9uIGluIGN1cnJlbnQgSU8gKi8NCi0gICAgICBHUElPeC0+QUZSW3Bvc2l0aW9uID4+IDN1XSAmPSB+KDB4RnUgPDwgKChwb3NpdGlvbiAmIDB4MDd1KSAqIDR1KSk7DQotDQotICAgICAgLyogRGVhY3RpdmF0ZSB0aGUgUHVsbC11cCBhbmQgUHVsbC1kb3duIHJlc2lzdG9yIGZvciB0aGUgY3VycmVudCBJTyAqLw0KLSAgICAgIEdQSU94LT5QVVBEUiAmPSB+KEdQSU9fUFVQRFJfUFVQRDAgPDwgKHBvc2l0aW9uICogMnUpKTsNCi0NCi0gICAgICAvKiBDb25maWd1cmUgdGhlIGRlZmF1bHQgdmFsdWUgSU8gT3V0cHV0IFR5cGUgKi8NCi0gICAgICBHUElPeC0+T1RZUEVSICY9IH4oR1BJT19PVFlQRVJfT1QwIDw8IHBvc2l0aW9uKTsNCi0NCi0gICAgICAvKiBDb25maWd1cmUgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIElPIFNwZWVkICovDQotICAgICAgR1BJT3gtPk9TUEVFRFIgJj0gfihHUElPX09TUEVFRFJfT1NQRUVEMCA8PCAocG9zaXRpb24gKiAydSkpOw0KLSAgICB9DQotDQotICAgIHBvc2l0aW9uKys7DQotICB9DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBhZGR0b2dyb3VwIEdQSU9fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMg0KLSAgKiAgQGJyaWVmIEdQSU8gUmVhZCwgV3JpdGUsIFRvZ2dsZSwgTG9jayBhbmQgRVhUSSBtYW5hZ2VtZW50IGZ1bmN0aW9ucy4NCi0gICoNCi1AdmVyYmF0aW0NCi0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAjIyMjIw0KLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotQGVuZHZlcmJhdGltDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmVhZCB0aGUgc3BlY2lmaWVkIGlucHV0IHBvcnQgcGluLg0KLSAqIEBwYXJhbSAgR1BJT3ggd2hlcmUgeCBjYW4gYmUgKEEuLkcpIHRvIHNlbGVjdCB0aGUgR1BJTyBwZXJpcGhlcmFsIGZvcg0KLSAqIFNUTTMyRzR4eCBmYW1pbHkNCi0gKiBAcGFyYW0gIEdQSU9fUGluIHNwZWNpZmllcyB0aGUgcG9ydCBiaXQgdG8gcmVhZC4NCi0gKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgR1BJT19QSU5feCB3aGVyZSB4IGNhbiBiZQ0KLSAqICgwLi4xNSkuDQotICogQHJldHZhbCBUaGUgaW5wdXQgcG9ydCBwaW4gdmFsdWUuDQotICovDQotR1BJT19QaW5TdGF0ZSBIQUxfR1BJT19SZWFkUGluKEdQSU9fVHlwZURlZiAqR1BJT3gsIHVpbnQxNl90IEdQSU9fUGluKSB7DQotICBHUElPX1BpblN0YXRlIGJpdHN0YXR1czsNCi0NCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfR1BJT19QSU4oR1BJT19QaW4pKTsNCi0NCi0gIGlmICgoR1BJT3gtPklEUiAmIEdQSU9fUGluKSAhPSAweDAwVSkgew0KLSAgICBiaXRzdGF0dXMgPSBHUElPX1BJTl9TRVQ7DQotICB9IGVsc2Ugew0KLSAgICBiaXRzdGF0dXMgPSBHUElPX1BJTl9SRVNFVDsNCi0gIH0NCi0gIHJldHVybiBiaXRzdGF0dXM7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IG9yIGNsZWFyIHRoZSBzZWxlY3RlZCBkYXRhIHBvcnQgYml0Lg0KLSAqDQotICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIHVzZXMgR1BJT3hfQlNSUiBhbmQgR1BJT3hfQlJSIHJlZ2lzdGVycyB0byBhbGxvdyBhdG9taWMNCi0gKiByZWFkL21vZGlmeSBhY2Nlc3Nlcy4gSW4gdGhpcyB3YXksIHRoZXJlIGlzIG5vIHJpc2sgb2YgYW4gSVJRIG9jY3VycmluZw0KLSAqIGJldHdlZW4gdGhlIHJlYWQgYW5kIHRoZSBtb2RpZnkgYWNjZXNzLg0KLSAqDQotICogQHBhcmFtICBHUElPeCB3aGVyZSB4IGNhbiBiZSAoQS4uRykgdG8gc2VsZWN0IHRoZSBHUElPIHBlcmlwaGVyYWwgZm9yDQotICogU1RNMzJHNHh4IGZhbWlseQ0KLSAqIEBwYXJhbSAgR1BJT19QaW4gc3BlY2lmaWVzIHRoZSBwb3J0IGJpdCB0byBiZSB3cml0dGVuLg0KLSAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiBHUElPX1BJTl94IHdoZXJlIHggY2FuIGJlDQotICogKDAuLjE1KS4NCi0gKiBAcGFyYW0gIFBpblN0YXRlIHNwZWNpZmllcyB0aGUgdmFsdWUgdG8gYmUgd3JpdHRlbiB0byB0aGUgc2VsZWN0ZWQgYml0Lg0KLSAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgR1BJT19QaW5TdGF0ZSBlbnVtIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgR1BJT19QSU5fUkVTRVQ6IHRvIGNsZWFyIHRoZSBwb3J0IHBpbg0KLSAqICAgICAgICAgICAgQGFyZyBHUElPX1BJTl9TRVQ6IHRvIHNldCB0aGUgcG9ydCBwaW4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi12b2lkIEhBTF9HUElPX1dyaXRlUGluKEdQSU9fVHlwZURlZiAqR1BJT3gsIHVpbnQxNl90IEdQSU9fUGluLA0KLSAgICAgICAgICAgICAgICAgICAgICAgR1BJT19QaW5TdGF0ZSBQaW5TdGF0ZSkgew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19HUElPX1BJTihHUElPX1BpbikpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0dQSU9fUElOX0FDVElPTihQaW5TdGF0ZSkpOw0KLQ0KLSAgaWYgKFBpblN0YXRlICE9IEdQSU9fUElOX1JFU0VUKSB7DQotICAgIEdQSU94LT5CU1JSID0gKHVpbnQzMl90KUdQSU9fUGluOw0KLSAgfSBlbHNlIHsNCi0gICAgR1BJT3gtPkJSUiA9ICh1aW50MzJfdClHUElPX1BpbjsNCi0gIH0NCi19DQotDQotLyoqDQotICogQGJyaWVmICBUb2dnbGUgdGhlIHNwZWNpZmllZCBHUElPIHBpbi4NCi0gKiBAcGFyYW0gIEdQSU94IHdoZXJlIHggY2FuIGJlIChBLi5HKSB0byBzZWxlY3QgdGhlIEdQSU8gcGVyaXBoZXJhbCBmb3INCi0gKiBTVE0zMkc0eHggZmFtaWx5DQotICogQHBhcmFtICBHUElPX1BpbiBzcGVjaWZpZXMgdGhlIHBpbiB0byBiZSB0b2dnbGVkLg0KLSAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiBHUElPX1BJTl94IHdoZXJlIHggY2FuIGJlDQotICogKDAuLjE1KS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi12b2lkIEhBTF9HUElPX1RvZ2dsZVBpbihHUElPX1R5cGVEZWYgKkdQSU94LCB1aW50MTZfdCBHUElPX1Bpbikgew0KLSAgdWludDMyX3Qgb2RyOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19HUElPX1BJTihHUElPX1BpbikpOw0KLQ0KLSAgLyogZ2V0IGN1cnJlbnQgT3V0cHV0IERhdGEgUmVnaXN0ZXIgdmFsdWUgKi8NCi0gIG9kciA9IEdQSU94LT5PRFI7DQotDQotICAvKiBTZXQgc2VsZWN0ZWQgcGlucyB0aGF0IHdlcmUgYXQgbG93IGxldmVsLCBhbmQgcmVzZXQgb25lcyB0aGF0IHdlcmUgaGlnaCAqLw0KLSAgR1BJT3gtPkJTUlIgPSAoKG9kciAmIEdQSU9fUGluKSA8PCBHUElPX05VTUJFUikgfCAofm9kciAmIEdQSU9fUGluKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBMb2NrIEdQSU8gUGlucyBjb25maWd1cmF0aW9uIHJlZ2lzdGVycy4NCi0gKiBAbm90ZSAgIFRoZSBsb2NrZWQgcmVnaXN0ZXJzIGFyZSBHUElPeF9NT0RFUiwgR1BJT3hfT1RZUEVSLCBHUElPeF9PU1BFRURSLA0KLSAqICAgICAgICAgR1BJT3hfUFVQRFIsIEdQSU94X0FGUkwgYW5kIEdQSU94X0FGUkguDQotICogQG5vdGUgICBUaGUgY29uZmlndXJhdGlvbiBvZiB0aGUgbG9ja2VkIEdQSU8gcGlucyBjYW4gbm8gbG9uZ2VyIGJlIG1vZGlmaWVkDQotICogICAgICAgICB1bnRpbCB0aGUgbmV4dCByZXNldC4NCi0gKiBAcGFyYW0gIEdQSU94IHdoZXJlIHggY2FuIGJlIChBLi5HKSB0byBzZWxlY3QgdGhlIEdQSU8gcGVyaXBoZXJhbCBmb3INCi0gKiBTVE0zMkc0eHggZmFtaWx5DQotICogQHBhcmFtICBHUElPX1BpbiBzcGVjaWZpZXMgdGhlIHBvcnQgYml0cyB0byBiZSBsb2NrZWQuDQotICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIEdQSU9fUGluX3ggd2hlcmUgeCBjYW4gYmUNCi0gKiAoMC4uMTUpLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9HUElPX0xvY2tQaW4oR1BJT19UeXBlRGVmICpHUElPeCwgdWludDE2X3QgR1BJT19QaW4pIHsNCi0gIF9fSU8gdWludDMyX3QgdG1wID0gR1BJT19MQ0tSX0xDS0s7DQotDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0dQSU9fTE9DS19JTlNUQU5DRShHUElPeCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0dQSU9fUElOKEdQSU9fUGluKSk7DQotDQotICAvKiBBcHBseSBsb2NrIGtleSB3cml0ZSBzZXF1ZW5jZSAqLw0KLSAgdG1wIHw9IEdQSU9fUGluOw0KLSAgLyogU2V0IExDS3ggYml0KHMpOiBMQ0tLPScxJyArIExDS1sxNS0wXSAqLw0KLSAgR1BJT3gtPkxDS1IgPSB0bXA7DQotICAvKiBSZXNldCBMQ0t4IGJpdChzKTogTENLSz0nMCcgKyBMQ0tbMTUtMF0gKi8NCi0gIEdQSU94LT5MQ0tSID0gR1BJT19QaW47DQotICAvKiBTZXQgTENLeCBiaXQocyk6IExDS0s9JzEnICsgTENLWzE1LTBdICovDQotICBHUElPeC0+TENLUiA9IHRtcDsNCi0gIC8qIFJlYWQgTENLSyByZWdpc3Rlci4gVGhpcyByZWFkIGlzIG1hbmRhdG9yeSB0byBjb21wbGV0ZSBrZXkgbG9jayBzZXF1ZW5jZSAqLw0KLSAgdG1wID0gR1BJT3gtPkxDS1I7DQotDQotICAvKiByZWFkIGFnYWluIGluIG9yZGVyIHRvIGNvbmZpcm0gbG9jayBpcyBhY3RpdmUgKi8NCi0gIGlmICgoR1BJT3gtPkxDS1IgJiBHUElPX0xDS1JfTENLSykgIT0gMHgwMHUpIHsNCi0gICAgcmV0dXJuIEhBTF9PSzsNCi0gIH0gZWxzZSB7DQotICAgIHJldHVybiBIQUxfRVJST1I7DQotICB9DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSGFuZGxlIEVYVEkgaW50ZXJydXB0IHJlcXVlc3QuDQotICogQHBhcmFtICBHUElPX1BpbiBTcGVjaWZpZXMgdGhlIHBvcnQgcGluIGNvbm5lY3RlZCB0byBjb3JyZXNwb25kaW5nIEVYVEkgbGluZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi12b2lkIEhBTF9HUElPX0VYVElfSVJRSGFuZGxlcih1aW50MTZfdCBHUElPX1Bpbikgew0KLSAgLyogRVhUSSBsaW5lIGludGVycnVwdCBkZXRlY3RlZCAqLw0KLSAgaWYgKF9fSEFMX0dQSU9fRVhUSV9HRVRfSVQoR1BJT19QaW4pICE9IDB4MDB1KSB7DQotICAgIF9fSEFMX0dQSU9fRVhUSV9DTEVBUl9JVChHUElPX1Bpbik7DQotICAgIEhBTF9HUElPX0VYVElfQ2FsbGJhY2soR1BJT19QaW4pOw0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVYVEkgbGluZSBkZXRlY3Rpb24gY2FsbGJhY2suDQotICogQHBhcmFtICBHUElPX1BpbjogU3BlY2lmaWVzIHRoZSBwb3J0IHBpbiBjb25uZWN0ZWQgdG8gY29ycmVzcG9uZGluZyBFWFRJDQotICogbGluZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX3dlYWsgdm9pZCBIQUxfR1BJT19FWFRJX0NhbGxiYWNrKHVpbnQxNl90IEdQSU9fUGluKSB7DQotICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovDQotICBVTlVTRUQoR1BJT19QaW4pOw0KLQ0KLSAgLyogTk9URTogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsDQotICAgICAgICAgICB0aGUgSEFMX0dQSU9fRVhUSV9DYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlDQotICAgKi8NCi19DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLSNlbmRpZiAvKiBIQUxfR1BJT19NT0RVTEVfRU5BQkxFRCAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnNHh4X2hhbF9ncGlvLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEdQSU8gSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgR2VuZXJhbCBQdXJwb3NlIElucHV0L091dHB1dCAoR1BJTykKKyAgcGVyaXBoZXJhbDoKKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGVybXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZQorICAqIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4KKyAgKiBJZiBubyBMSUNFTlNFIGZpbGUgY29tZXMgd2l0aCB0aGlzIHNvZnR3YXJlLCBpdCBpcyBwcm92aWRlZCBBUy1JUy4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAjIyMjIyBHUElPIFBlcmlwaGVyYWwgZmVhdHVyZXMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgICAoKykgRWFjaCBwb3J0IGJpdCBvZiB0aGUgZ2VuZXJhbC1wdXJwb3NlIEkvTyAoR1BJTykgcG9ydHMgY2FuIGJlCisgIGluZGl2aWR1YWxseSBjb25maWd1cmVkIGJ5IHNvZnR3YXJlIGluIHNldmVyYWwgbW9kZXM6CisgICAgICAgICgrKykgSW5wdXQgbW9kZQorICAgICAgICAoKyspIEFuYWxvZyBtb2RlCisgICAgICAgICgrKykgT3V0cHV0IG1vZGUKKyAgICAgICAgKCsrKSBBbHRlcm5hdGUgZnVuY3Rpb24gbW9kZQorICAgICAgICAoKyspIEV4dGVybmFsIGludGVycnVwdC9ldmVudCBsaW5lcworCisgICAgKCspIER1cmluZyBhbmQganVzdCBhZnRlciByZXNldCwgdGhlIGFsdGVybmF0ZSBmdW5jdGlvbnMgYW5kIGV4dGVybmFsCisgIGludGVycnVwdCBsaW5lcyBhcmUgbm90IGFjdGl2ZSBhbmQgdGhlIEkvTyBwb3J0cyBhcmUgY29uZmlndXJlZCBpbiBpbnB1dAorICBmbG9hdGluZyBtb2RlLgorCisgICAgKCspIEFsbCBHUElPIHBpbnMgaGF2ZSB3ZWFrIGludGVybmFsIHB1bGwtdXAgYW5kIHB1bGwtZG93biByZXNpc3RvcnMsIHdoaWNoCisgIGNhbiBiZSBhY3RpdmF0ZWQgb3Igbm90LgorCisgICAgKCspIEluIE91dHB1dCBvciBBbHRlcm5hdGUgbW9kZSwgZWFjaCBJTyBjYW4gYmUgY29uZmlndXJlZCBvbiBvcGVuLWRyYWluIG9yCisgIHB1c2gtcHVsbCB0eXBlIGFuZCB0aGUgSU8gc3BlZWQgY2FuIGJlIHNlbGVjdGVkIGRlcGVuZGluZyBvbiB0aGUgVkREIHZhbHVlLgorCisgICAgKCspIFRoZSBtaWNyb2NvbnRyb2xsZXIgSU8gcGlucyBhcmUgY29ubmVjdGVkIHRvIG9uYm9hcmQgcGVyaXBoZXJhbHMvbW9kdWxlcworICB0aHJvdWdoIGEgbXVsdGlwbGV4ZXIgdGhhdCBhbGxvd3Mgb25seSBvbmUgcGVyaXBoZXJhbCBhbHRlcm5hdGUgZnVuY3Rpb24gKEFGKQorICBjb25uZWN0ZWQgdG8gYW4gSU8gcGluIGF0IGEgdGltZS4gSW4gdGhpcyB3YXksIHRoZXJlIGNhbiBiZSBubyBjb25mbGljdAorICBiZXR3ZWVuIHBlcmlwaGVyYWxzIHNoYXJpbmcgdGhlIHNhbWUgSU8gcGluLgorCisgICAgKCspIEFsbCBwb3J0cyBoYXZlIGV4dGVybmFsIGludGVycnVwdC9ldmVudCBjYXBhYmlsaXR5LiBUbyB1c2UgZXh0ZXJuYWwKKyAgaW50ZXJydXB0IGxpbmVzLCB0aGUgcG9ydCBtdXN0IGJlIGNvbmZpZ3VyZWQgaW4gaW5wdXQgbW9kZS4gQWxsIGF2YWlsYWJsZSBHUElPCisgIHBpbnMgYXJlIGNvbm5lY3RlZCB0byB0aGUgMTYgZXh0ZXJuYWwgaW50ZXJydXB0L2V2ZW50IGxpbmVzIGZyb20gRVhUSTAgdG8KKyAgRVhUSTE1LgorCisgICAgKCspIFRoZSBleHRlcm5hbCBpbnRlcnJ1cHQvZXZlbnQgY29udHJvbGxlciBjb25zaXN0cyBvZiB1cCB0byA0NCBlZGdlCisgIGRldGVjdG9ycyAoMTYgbGluZXMgYXJlIGNvbm5lY3RlZCB0byBHUElPKSBmb3IgZ2VuZXJhdGluZyBldmVudC9pbnRlcnJ1cHQKKyAgcmVxdWVzdHMgKGVhY2ggaW5wdXQgbGluZSBjYW4gYmUgaW5kZXBlbmRlbnRseSBjb25maWd1cmVkIHRvIHNlbGVjdCB0aGUgdHlwZQorICAoaW50ZXJydXB0IG9yIGV2ZW50KSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgdHJpZ2dlciBldmVudCAocmlzaW5nIG9yIGZhbGxpbmcgb3IKKyAgYm90aCkuIEVhY2ggbGluZSBjYW4gYWxzbyBiZSBtYXNrZWQgaW5kZXBlbmRlbnRseS4KKworICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgICgjKSBFbmFibGUgdGhlIEdQSU8gQUhCIGNsb2NrIHVzaW5nIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb246CisgIF9fSEFMX1JDQ19HUElPeF9DTEtfRU5BQkxFKCkuCisKKyAgICAoIykgQ29uZmlndXJlIHRoZSBHUElPIHBpbihzKSB1c2luZyBIQUxfR1BJT19Jbml0KCkuCisgICAgICAgICgrKykgQ29uZmlndXJlIHRoZSBJTyBtb2RlIHVzaW5nICJNb2RlIiBtZW1iZXIgZnJvbSBHUElPX0luaXRUeXBlRGVmCisgIHN0cnVjdHVyZQorICAgICAgICAoKyspIEFjdGl2YXRlIFB1bGwtdXAsIFB1bGwtZG93biByZXNpc3RvciB1c2luZyAiUHVsbCIgbWVtYmVyIGZyb20KKyAgR1BJT19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUuCisgICAgICAgICgrKykgSW4gY2FzZSBvZiBPdXRwdXQgb3IgYWx0ZXJuYXRlIGZ1bmN0aW9uIG1vZGUgc2VsZWN0aW9uOiB0aGUgc3BlZWQKKyAgaXMgY29uZmlndXJlZCB0aHJvdWdoICJTcGVlZCIgbWVtYmVyIGZyb20gR1BJT19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUuCisgICAgICAgICgrKykgSW4gYWx0ZXJuYXRlIG1vZGUgaXMgc2VsZWN0aW9uLCB0aGUgYWx0ZXJuYXRlIGZ1bmN0aW9uIGNvbm5lY3RlZCB0bworICB0aGUgSU8gaXMgY29uZmlndXJlZCB0aHJvdWdoICJBbHRlcm5hdGUiIG1lbWJlciBmcm9tIEdQSU9fSW5pdFR5cGVEZWYKKyAgc3RydWN0dXJlLgorICAgICAgICAoKyspIEFuYWxvZyBtb2RlIGlzIHJlcXVpcmVkIHdoZW4gYSBwaW4gaXMgdG8gYmUgdXNlZCBhcyBBREMgY2hhbm5lbAorICAgICAgICAgICAgIG9yIERBQyBvdXRwdXQuCisgICAgICAgICgrKykgSW4gY2FzZSBvZiBleHRlcm5hbCBpbnRlcnJ1cHQvZXZlbnQgc2VsZWN0aW9uIHRoZSAiTW9kZSIgbWVtYmVyCisgIGZyb20gR1BJT19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUgc2VsZWN0IHRoZSB0eXBlIChpbnRlcnJ1cHQgb3IgZXZlbnQpIGFuZCB0aGUKKyAgY29ycmVzcG9uZGluZyB0cmlnZ2VyIGV2ZW50IChyaXNpbmcgb3IgZmFsbGluZyBvciBib3RoKS4KKworICAgICgjKSBJbiBjYXNlIG9mIGV4dGVybmFsIGludGVycnVwdC9ldmVudCBtb2RlIHNlbGVjdGlvbiwgY29uZmlndXJlIE5WSUMgSVJRCisgIHByaW9yaXR5IG1hcHBlZCB0byB0aGUgRVhUSSBsaW5lIHVzaW5nIEhBTF9OVklDX1NldFByaW9yaXR5KCkgYW5kIGVuYWJsZSBpdAorICB1c2luZyBIQUxfTlZJQ19FbmFibGVJUlEoKS4KKworICAgICgjKSBUbyBnZXQgdGhlIGxldmVsIG9mIGEgcGluIGNvbmZpZ3VyZWQgaW4gaW5wdXQgbW9kZSB1c2UKKyAgSEFMX0dQSU9fUmVhZFBpbigpLgorCisgICAgKCMpIFRvIHNldC9yZXNldCB0aGUgbGV2ZWwgb2YgYSBwaW4gY29uZmlndXJlZCBpbiBvdXRwdXQgbW9kZSB1c2UKKyAgICAgICAgSEFMX0dQSU9fV3JpdGVQaW4oKS9IQUxfR1BJT19Ub2dnbGVQaW4oKS4KKworICAgKCMpIFRvIGxvY2sgcGluIGNvbmZpZ3VyYXRpb24gdW50aWwgbmV4dCByZXNldCB1c2UgSEFMX0dQSU9fTG9ja1BpbigpLgorCisgICAgKCMpIER1cmluZyBhbmQganVzdCBhZnRlciByZXNldCwgdGhlIGFsdGVybmF0ZSBmdW5jdGlvbnMgYXJlIG5vdAorICAgICAgICBhY3RpdmUgYW5kIHRoZSBHUElPIHBpbnMgYXJlIGNvbmZpZ3VyZWQgaW4gaW5wdXQgZmxvYXRpbmcgbW9kZSAoZXhjZXB0CisgIEpUQUcgcGlucykuCisKKyAgICAoIykgVGhlIExTRSBvc2NpbGxhdG9yIHBpbnMgT1NDMzJfSU4gYW5kIE9TQzMyX09VVCBjYW4gYmUgdXNlZCBhcyBnZW5lcmFsCisgIHB1cnBvc2UgKFBDMTQgYW5kIFBDMTUsIHJlc3BlY3RpdmVseSkgd2hlbiB0aGUgTFNFIG9zY2lsbGF0b3IgaXMgb2ZmLiBUaGUgTFNFCisgIGhhcyBwcmlvcml0eSBvdmVyIHRoZSBHUElPIGZ1bmN0aW9uLgorCisgICAgKCMpIFRoZSBIU0Ugb3NjaWxsYXRvciBwaW5zIE9TQ19JTi9PU0NfT1VUIGNhbiBiZSB1c2VkIGFzCisgICAgICAgIGdlbmVyYWwgcHVycG9zZSBQRjAgYW5kIFBGMSwgcmVzcGVjdGl2ZWx5LCB3aGVuIHRoZSBIU0Ugb3NjaWxsYXRvciBpcworICBvZmYuIFRoZSBIU0UgaGFzIHByaW9yaXR5IG92ZXIgdGhlIEdQSU8gZnVuY3Rpb24uCisKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzR4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzR4eF9IQUxfRHJpdmVyCisgKiBAeworICovCisKKy8qKiBAYWRkdG9ncm91cCBHUElPCisgKiBAeworICovCisvKiogTUlTUkEgQzoyMDEyIGRldmlhdGlvbiBydWxlIGhhcyBiZWVuIGdyYW50ZWQgZm9yIGZvbGxvd2luZyBydWxlczoKKyAqIFJ1bGUtMTIuMiAtIE1lZGl1bTogUkhTIGFyZ3VtZW50IGlzIGluIGludGVydmFsIFswLElORl0gd2hpY2ggaXMgb3V0IG9mCisgKiByYW5nZSBvZiB0aGUgc2hpZnQgb3BlcmF0b3IgaW4gZm9sbG93aW5nIEFQSSA6CisgKiBIQUxfR1BJT19Jbml0CisgKiBIQUxfR1BJT19EZUluaXQKKyAqLworCisjaWZkZWYgSEFMX0dQSU9fTU9EVUxFX0VOQUJMRUQKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgR1BJT19Qcml2YXRlX0NvbnN0YW50cyBHUElPIFByaXZhdGUgQ29uc3RhbnRzCisgKiBAeworICovCisjZGVmaW5lIEdQSU9fTlVNQkVSICgxNlUpCisvKioKKyAqIEB9CisgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBhZGR0b2dyb3VwIEdQSU9fRXhwb3J0ZWRfRnVuY3Rpb25zCisgKiBAeworICovCisKKy8qKiBAZGVmZ3JvdXAgR1BJT19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uL2RlLWluaXRpYWxpemF0aW9uCitmdW5jdGlvbnMKKyAgKiAgQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBHUElPeCBwZXJpcGhlcmFsIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMKKyAqIGluIHRoZSBHUElPX0luaXQuCisgKiBAcGFyYW0gIEdQSU94IHdoZXJlIHggY2FuIGJlIChBLi5HKSB0byBzZWxlY3QgdGhlIEdQSU8gcGVyaXBoZXJhbCBmb3IKKyAqIFNUTTMyRzR4eCBmYW1pbHkKKyAqIEBwYXJhbSAgR1BJT19Jbml0IHBvaW50ZXIgdG8gYSBHUElPX0luaXRUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEdQSU8gcGVyaXBoZXJhbC4KKyAqIEByZXR2YWwgTm9uZQorICovCit2b2lkIEhBTF9HUElPX0luaXQoR1BJT19UeXBlRGVmICpHUElPeCwgR1BJT19Jbml0VHlwZURlZiAqR1BJT19Jbml0KSB7CisgIHVpbnQzMl90IHBvc2l0aW9uID0gMHgwMFU7CisgIHVpbnQzMl90IGlvY3VycmVudDsKKyAgdWludDMyX3QgdGVtcDsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfR1BJT19BTExfSU5TVEFOQ0UoR1BJT3gpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0dQSU9fUElOKEdQSU9fSW5pdC0+UGluKSk7CisgIGFzc2VydF9wYXJhbShJU19HUElPX01PREUoR1BJT19Jbml0LT5Nb2RlKSk7CisKKyAgLyogQ29uZmlndXJlIHRoZSBwb3J0IHBpbnMgKi8KKyAgd2hpbGUgKCgoR1BJT19Jbml0LT5QaW4pID4+IHBvc2l0aW9uKSAhPSAwVSkgeworICAgIC8qIEdldCBjdXJyZW50IGlvIHBvc2l0aW9uICovCisgICAgaW9jdXJyZW50ID0gKEdQSU9fSW5pdC0+UGluKSAmICgxVUwgPDwgcG9zaXRpb24pOworCisgICAgaWYgKGlvY3VycmVudCAhPSAweDAwdSkgeworICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gR1BJTyBNb2RlIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAgIC8qIEluIGNhc2Ugb2YgT3V0cHV0IG9yIEFsdGVybmF0ZSBmdW5jdGlvbiBtb2RlIHNlbGVjdGlvbiAqLworICAgICAgaWYgKCgoR1BJT19Jbml0LT5Nb2RlICYgR1BJT19NT0RFKSA9PSBNT0RFX09VVFBVVCkgfHwKKyAgICAgICAgICAoKEdQSU9fSW5pdC0+TW9kZSAmIEdQSU9fTU9ERSkgPT0gTU9ERV9BRikpIHsKKyAgICAgICAgLyogQ2hlY2sgdGhlIFNwZWVkIHBhcmFtZXRlciAqLworICAgICAgICBhc3NlcnRfcGFyYW0oSVNfR1BJT19TUEVFRChHUElPX0luaXQtPlNwZWVkKSk7CisgICAgICAgIC8qIENvbmZpZ3VyZSB0aGUgSU8gU3BlZWQgKi8KKyAgICAgICAgdGVtcCA9IEdQSU94LT5PU1BFRURSOworICAgICAgICB0ZW1wICY9IH4oR1BJT19PU1BFRURSX09TUEVFRDAgPDwgKHBvc2l0aW9uICogMlUpKTsKKyAgICAgICAgdGVtcCB8PSAoR1BJT19Jbml0LT5TcGVlZCA8PCAocG9zaXRpb24gKiAyVSkpOworICAgICAgICBHUElPeC0+T1NQRUVEUiA9IHRlbXA7CisKKyAgICAgICAgLyogQ29uZmlndXJlIHRoZSBJTyBPdXRwdXQgVHlwZSAqLworICAgICAgICB0ZW1wID0gR1BJT3gtPk9UWVBFUjsKKyAgICAgICAgdGVtcCAmPSB+KEdQSU9fT1RZUEVSX09UMCA8PCBwb3NpdGlvbik7CisgICAgICAgIHRlbXAgfD0KKyAgICAgICAgICAgICgoKEdQSU9fSW5pdC0+TW9kZSAmIE9VVFBVVF9UWVBFKSA+PiBPVVRQVVRfVFlQRV9Qb3MpIDw8IHBvc2l0aW9uKTsKKyAgICAgICAgR1BJT3gtPk9UWVBFUiA9IHRlbXA7CisgICAgICB9CisKKyAgICAgIGlmICgoR1BJT19Jbml0LT5Nb2RlICYgR1BJT19NT0RFKSAhPSBNT0RFX0FOQUxPRykgeworICAgICAgICAvKiBDaGVjayB0aGUgUHVsbCBwYXJhbWV0ZXIgKi8KKyAgICAgICAgYXNzZXJ0X3BhcmFtKElTX0dQSU9fUFVMTChHUElPX0luaXQtPlB1bGwpKTsKKworICAgICAgICAvKiBBY3RpdmF0ZSB0aGUgUHVsbC11cCBvciBQdWxsIGRvd24gcmVzaXN0b3IgZm9yIHRoZSBjdXJyZW50IElPICovCisgICAgICAgIHRlbXAgPSBHUElPeC0+UFVQRFI7CisgICAgICAgIHRlbXAgJj0gfihHUElPX1BVUERSX1BVUEQwIDw8IChwb3NpdGlvbiAqIDJVKSk7CisgICAgICAgIHRlbXAgfD0gKChHUElPX0luaXQtPlB1bGwpIDw8IChwb3NpdGlvbiAqIDJVKSk7CisgICAgICAgIEdQSU94LT5QVVBEUiA9IHRlbXA7CisgICAgICB9CisKKyAgICAgIC8qIEluIGNhc2Ugb2YgQWx0ZXJuYXRlIGZ1bmN0aW9uIG1vZGUgc2VsZWN0aW9uICovCisgICAgICBpZiAoKEdQSU9fSW5pdC0+TW9kZSAmIEdQSU9fTU9ERSkgPT0gTU9ERV9BRikgeworICAgICAgICAvKiBDaGVjayB0aGUgQWx0ZXJuYXRlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgYXNzZXJ0X3BhcmFtKElTX0dQSU9fQUZfSU5TVEFOQ0UoR1BJT3gpKTsKKyAgICAgICAgYXNzZXJ0X3BhcmFtKElTX0dQSU9fQUYoR1BJT19Jbml0LT5BbHRlcm5hdGUpKTsKKworICAgICAgICAvKiBDb25maWd1cmUgQWx0ZXJuYXRlIGZ1bmN0aW9uIG1hcHBlZCB3aXRoIHRoZSBjdXJyZW50IElPICovCisgICAgICAgIHRlbXAgPSBHUElPeC0+QUZSW3Bvc2l0aW9uID4+IDNVXTsKKyAgICAgICAgdGVtcCAmPSB+KDB4RlUgPDwgKChwb3NpdGlvbiAmIDB4MDdVKSAqIDRVKSk7CisgICAgICAgIHRlbXAgfD0gKChHUElPX0luaXQtPkFsdGVybmF0ZSkgPDwgKChwb3NpdGlvbiAmIDB4MDdVKSAqIDRVKSk7CisgICAgICAgIEdQSU94LT5BRlJbcG9zaXRpb24gPj4gM1VdID0gdGVtcDsKKyAgICAgIH0KKworICAgICAgLyogQ29uZmlndXJlIElPIERpcmVjdGlvbiBtb2RlIChJbnB1dCwgT3V0cHV0LCBBbHRlcm5hdGUgb3IgQW5hbG9nKSAqLworICAgICAgdGVtcCA9IEdQSU94LT5NT0RFUjsKKyAgICAgIHRlbXAgJj0gfihHUElPX01PREVSX01PREUwIDw8IChwb3NpdGlvbiAqIDJVKSk7CisgICAgICB0ZW1wIHw9ICgoR1BJT19Jbml0LT5Nb2RlICYgR1BJT19NT0RFKSA8PCAocG9zaXRpb24gKiAyVSkpOworICAgICAgR1BJT3gtPk1PREVSID0gdGVtcDsKKworICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gRVhUSSBNb2RlIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAgIC8qIENvbmZpZ3VyZSB0aGUgRXh0ZXJuYWwgSW50ZXJydXB0IG9yIGV2ZW50IGZvciB0aGUgY3VycmVudCBJTyAqLworICAgICAgaWYgKChHUElPX0luaXQtPk1vZGUgJiBFWFRJX01PREUpICE9IDB4MDB1KSB7CisgICAgICAgIC8qIEVuYWJsZSBTWVNDRkcgQ2xvY2sgKi8KKyAgICAgICAgX19IQUxfUkNDX1NZU0NGR19DTEtfRU5BQkxFKCk7CisKKyAgICAgICAgdGVtcCA9IFNZU0NGRy0+RVhUSUNSW3Bvc2l0aW9uID4+IDJVXTsKKyAgICAgICAgdGVtcCAmPSB+KDB4MEZVTCA8PCAoNFUgKiAocG9zaXRpb24gJiAweDAzVSkpKTsKKyAgICAgICAgdGVtcCB8PSAoR1BJT19HRVRfSU5ERVgoR1BJT3gpIDw8ICg0VSAqIChwb3NpdGlvbiAmIDB4MDNVKSkpOworICAgICAgICBTWVNDRkctPkVYVElDUltwb3NpdGlvbiA+PiAyVV0gPSB0ZW1wOworCisgICAgICAgIC8qIENsZWFyIFJpc2luZyBGYWxsaW5nIGVkZ2UgY29uZmlndXJhdGlvbiAqLworICAgICAgICB0ZW1wID0gRVhUSS0+UlRTUjE7CisgICAgICAgIHRlbXAgJj0gfihpb2N1cnJlbnQpOworICAgICAgICBpZiAoKEdQSU9fSW5pdC0+TW9kZSAmIFRSSUdHRVJfUklTSU5HKSAhPSAweDAwVSkgeworICAgICAgICAgIHRlbXAgfD0gaW9jdXJyZW50OworICAgICAgICB9CisgICAgICAgIEVYVEktPlJUU1IxID0gdGVtcDsKKworICAgICAgICB0ZW1wID0gRVhUSS0+RlRTUjE7CisgICAgICAgIHRlbXAgJj0gfihpb2N1cnJlbnQpOworICAgICAgICBpZiAoKEdQSU9fSW5pdC0+TW9kZSAmIFRSSUdHRVJfRkFMTElORykgIT0gMHgwMFUpIHsKKyAgICAgICAgICB0ZW1wIHw9IGlvY3VycmVudDsKKyAgICAgICAgfQorICAgICAgICBFWFRJLT5GVFNSMSA9IHRlbXA7CisKKyAgICAgICAgdGVtcCA9IEVYVEktPkVNUjE7CisgICAgICAgIHRlbXAgJj0gfihpb2N1cnJlbnQpOworICAgICAgICBpZiAoKEdQSU9fSW5pdC0+TW9kZSAmIEVYVElfRVZUKSAhPSAweDAwVSkgeworICAgICAgICAgIHRlbXAgfD0gaW9jdXJyZW50OworICAgICAgICB9CisgICAgICAgIEVYVEktPkVNUjEgPSB0ZW1wOworCisgICAgICAgIC8qIENsZWFyIEVYVEkgbGluZSBjb25maWd1cmF0aW9uICovCisgICAgICAgIHRlbXAgPSBFWFRJLT5JTVIxOworICAgICAgICB0ZW1wICY9IH4oaW9jdXJyZW50KTsKKyAgICAgICAgaWYgKChHUElPX0luaXQtPk1vZGUgJiBFWFRJX0lUKSAhPSAweDAwVSkgeworICAgICAgICAgIHRlbXAgfD0gaW9jdXJyZW50OworICAgICAgICB9CisgICAgICAgIEVYVEktPklNUjEgPSB0ZW1wOworICAgICAgfQorICAgIH0KKworICAgIHBvc2l0aW9uKys7CisgIH0KK30KKworLyoqCisgKiBAYnJpZWYgIERlLWluaXRpYWxpemUgdGhlIEdQSU94IHBlcmlwaGVyYWwgcmVnaXN0ZXJzIHRvIHRoZWlyIGRlZmF1bHQgcmVzZXQKKyAqIHZhbHVlcy4KKyAqIEBwYXJhbSAgR1BJT3ggd2hlcmUgeCBjYW4gYmUgKEEuLkcpIHRvIHNlbGVjdCB0aGUgR1BJTyBwZXJpcGhlcmFsIGZvcgorICogU1RNMzJHNHh4IGZhbWlseQorICogQHBhcmFtICBHUElPX1BpbiBzcGVjaWZpZXMgdGhlIHBvcnQgYml0IHRvIGJlIHdyaXR0ZW4uCisgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgR1BJT19QSU5feCB3aGVyZSB4IGNhbiBiZQorICogKDAuLjE1KS4KKyAqIEByZXR2YWwgTm9uZQorICovCit2b2lkIEhBTF9HUElPX0RlSW5pdChHUElPX1R5cGVEZWYgKkdQSU94LCB1aW50MzJfdCBHUElPX1BpbikgeworICB1aW50MzJfdCBwb3NpdGlvbiA9IDB4MDBVOworICB1aW50MzJfdCBpb2N1cnJlbnQ7CisgIHVpbnQzMl90IHRtcDsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfR1BJT19BTExfSU5TVEFOQ0UoR1BJT3gpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0dQSU9fUElOKEdQSU9fUGluKSk7CisKKyAgLyogQ29uZmlndXJlIHRoZSBwb3J0IHBpbnMgKi8KKyAgd2hpbGUgKChHUElPX1BpbiA+PiBwb3NpdGlvbikgIT0gMFUpIHsKKyAgICAvKiBHZXQgY3VycmVudCBpbyBwb3NpdGlvbiAqLworICAgIGlvY3VycmVudCA9IChHUElPX1BpbikgJiAoMVVMIDw8IHBvc2l0aW9uKTsKKworICAgIGlmIChpb2N1cnJlbnQgIT0gMHgwMHUpIHsKKyAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFWFRJIE1vZGUgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgICAvKiBDbGVhciB0aGUgRXh0ZXJuYWwgSW50ZXJydXB0IG9yIEV2ZW50IGZvciB0aGUgY3VycmVudCBJTyAqLworCisgICAgICB0bXAgPSBTWVNDRkctPkVYVElDUltwb3NpdGlvbiA+PiAyVV07CisgICAgICB0bXAgJj0gKDB4MEZVTCA8PCAoNFUgKiAocG9zaXRpb24gJiAweDAzVSkpKTsKKyAgICAgIGlmICh0bXAgPT0gKEdQSU9fR0VUX0lOREVYKEdQSU94KSA8PCAoNFUgKiAocG9zaXRpb24gJiAweDAzVSkpKSkgeworICAgICAgICAvKiBDbGVhciBFWFRJIGxpbmUgY29uZmlndXJhdGlvbiAqLworICAgICAgICBFWFRJLT5JTVIxICY9IH4oaW9jdXJyZW50KTsKKyAgICAgICAgRVhUSS0+RU1SMSAmPSB+KGlvY3VycmVudCk7CisKKyAgICAgICAgLyogQ2xlYXIgUmlzaW5nIEZhbGxpbmcgZWRnZSBjb25maWd1cmF0aW9uICovCisgICAgICAgIEVYVEktPkZUU1IxICY9IH4oaW9jdXJyZW50KTsKKyAgICAgICAgRVhUSS0+UlRTUjEgJj0gfihpb2N1cnJlbnQpOworCisgICAgICAgIHRtcCA9IDB4MEZVTCA8PCAoNFUgKiAocG9zaXRpb24gJiAweDAzVSkpOworICAgICAgICBTWVNDRkctPkVYVElDUltwb3NpdGlvbiA+PiAyVV0gJj0gfnRtcDsKKyAgICAgIH0KKworICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdQSU8gTW9kZSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAgIC8qIENvbmZpZ3VyZSBJTyBpbiBBbmFsb2cgTW9kZSAqLworICAgICAgR1BJT3gtPk1PREVSIHw9IChHUElPX01PREVSX01PREUwIDw8IChwb3NpdGlvbiAqIDJ1KSk7CisKKyAgICAgIC8qIENvbmZpZ3VyZSB0aGUgZGVmYXVsdCBBbHRlcm5hdGUgRnVuY3Rpb24gaW4gY3VycmVudCBJTyAqLworICAgICAgR1BJT3gtPkFGUltwb3NpdGlvbiA+PiAzdV0gJj0gfigweEZ1IDw8ICgocG9zaXRpb24gJiAweDA3dSkgKiA0dSkpOworCisgICAgICAvKiBEZWFjdGl2YXRlIHRoZSBQdWxsLXVwIGFuZCBQdWxsLWRvd24gcmVzaXN0b3IgZm9yIHRoZSBjdXJyZW50IElPICovCisgICAgICBHUElPeC0+UFVQRFIgJj0gfihHUElPX1BVUERSX1BVUEQwIDw8IChwb3NpdGlvbiAqIDJ1KSk7CisKKyAgICAgIC8qIENvbmZpZ3VyZSB0aGUgZGVmYXVsdCB2YWx1ZSBJTyBPdXRwdXQgVHlwZSAqLworICAgICAgR1BJT3gtPk9UWVBFUiAmPSB+KEdQSU9fT1RZUEVSX09UMCA8PCBwb3NpdGlvbik7CisKKyAgICAgIC8qIENvbmZpZ3VyZSB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgSU8gU3BlZWQgKi8KKyAgICAgIEdQSU94LT5PU1BFRURSICY9IH4oR1BJT19PU1BFRURSX09TUEVFRDAgPDwgKHBvc2l0aW9uICogMnUpKTsKKyAgICB9CisKKyAgICBwb3NpdGlvbisrOworICB9Cit9CisKKy8qKgorICogQH0KKyAqLworCisvKiogQGFkZHRvZ3JvdXAgR1BJT19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyCisgICogIEBicmllZiBHUElPIFJlYWQsIFdyaXRlLCBUb2dnbGUsIExvY2sgYW5kIEVYVEkgbWFuYWdlbWVudCBmdW5jdGlvbnMuCisgICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgKiBAYnJpZWYgIFJlYWQgdGhlIHNwZWNpZmllZCBpbnB1dCBwb3J0IHBpbi4KKyAqIEBwYXJhbSAgR1BJT3ggd2hlcmUgeCBjYW4gYmUgKEEuLkcpIHRvIHNlbGVjdCB0aGUgR1BJTyBwZXJpcGhlcmFsIGZvcgorICogU1RNMzJHNHh4IGZhbWlseQorICogQHBhcmFtICBHUElPX1BpbiBzcGVjaWZpZXMgdGhlIHBvcnQgYml0IHRvIHJlYWQuCisgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgR1BJT19QSU5feCB3aGVyZSB4IGNhbiBiZQorICogKDAuLjE1KS4KKyAqIEByZXR2YWwgVGhlIGlucHV0IHBvcnQgcGluIHZhbHVlLgorICovCitHUElPX1BpblN0YXRlIEhBTF9HUElPX1JlYWRQaW4oR1BJT19UeXBlRGVmICpHUElPeCwgdWludDE2X3QgR1BJT19QaW4pIHsKKyAgR1BJT19QaW5TdGF0ZSBiaXRzdGF0dXM7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0dQSU9fUElOKEdQSU9fUGluKSk7CisKKyAgaWYgKChHUElPeC0+SURSICYgR1BJT19QaW4pICE9IDB4MDBVKSB7CisgICAgYml0c3RhdHVzID0gR1BJT19QSU5fU0VUOworICB9IGVsc2UgeworICAgIGJpdHN0YXR1cyA9IEdQSU9fUElOX1JFU0VUOworICB9CisgIHJldHVybiBiaXRzdGF0dXM7Cit9CisKKy8qKgorICogQGJyaWVmICBTZXQgb3IgY2xlYXIgdGhlIHNlbGVjdGVkIGRhdGEgcG9ydCBiaXQuCisgKgorICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIHVzZXMgR1BJT3hfQlNSUiBhbmQgR1BJT3hfQlJSIHJlZ2lzdGVycyB0byBhbGxvdyBhdG9taWMKKyAqIHJlYWQvbW9kaWZ5IGFjY2Vzc2VzLiBJbiB0aGlzIHdheSwgdGhlcmUgaXMgbm8gcmlzayBvZiBhbiBJUlEgb2NjdXJyaW5nCisgKiBiZXR3ZWVuIHRoZSByZWFkIGFuZCB0aGUgbW9kaWZ5IGFjY2Vzcy4KKyAqCisgKiBAcGFyYW0gIEdQSU94IHdoZXJlIHggY2FuIGJlIChBLi5HKSB0byBzZWxlY3QgdGhlIEdQSU8gcGVyaXBoZXJhbCBmb3IKKyAqIFNUTTMyRzR4eCBmYW1pbHkKKyAqIEBwYXJhbSAgR1BJT19QaW4gc3BlY2lmaWVzIHRoZSBwb3J0IGJpdCB0byBiZSB3cml0dGVuLgorICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIEdQSU9fUElOX3ggd2hlcmUgeCBjYW4gYmUKKyAqICgwLi4xNSkuCisgKiBAcGFyYW0gIFBpblN0YXRlIHNwZWNpZmllcyB0aGUgdmFsdWUgdG8gYmUgd3JpdHRlbiB0byB0aGUgc2VsZWN0ZWQgYml0LgorICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBHUElPX1BpblN0YXRlIGVudW0gdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIEdQSU9fUElOX1JFU0VUOiB0byBjbGVhciB0aGUgcG9ydCBwaW4KKyAqICAgICAgICAgICAgQGFyZyBHUElPX1BJTl9TRVQ6IHRvIHNldCB0aGUgcG9ydCBwaW4KKyAqIEByZXR2YWwgTm9uZQorICovCit2b2lkIEhBTF9HUElPX1dyaXRlUGluKEdQSU9fVHlwZURlZiAqR1BJT3gsIHVpbnQxNl90IEdQSU9fUGluLAorICAgICAgICAgICAgICAgICAgICAgICBHUElPX1BpblN0YXRlIFBpblN0YXRlKSB7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19HUElPX1BJTihHUElPX1BpbikpOworICBhc3NlcnRfcGFyYW0oSVNfR1BJT19QSU5fQUNUSU9OKFBpblN0YXRlKSk7CisKKyAgaWYgKFBpblN0YXRlICE9IEdQSU9fUElOX1JFU0VUKSB7CisgICAgR1BJT3gtPkJTUlIgPSAodWludDMyX3QpR1BJT19QaW47CisgIH0gZWxzZSB7CisgICAgR1BJT3gtPkJSUiA9ICh1aW50MzJfdClHUElPX1BpbjsKKyAgfQorfQorCisvKioKKyAqIEBicmllZiAgVG9nZ2xlIHRoZSBzcGVjaWZpZWQgR1BJTyBwaW4uCisgKiBAcGFyYW0gIEdQSU94IHdoZXJlIHggY2FuIGJlIChBLi5HKSB0byBzZWxlY3QgdGhlIEdQSU8gcGVyaXBoZXJhbCBmb3IKKyAqIFNUTTMyRzR4eCBmYW1pbHkKKyAqIEBwYXJhbSAgR1BJT19QaW4gc3BlY2lmaWVzIHRoZSBwaW4gdG8gYmUgdG9nZ2xlZC4KKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiBHUElPX1BJTl94IHdoZXJlIHggY2FuIGJlCisgKiAoMC4uMTUpLgorICogQHJldHZhbCBOb25lCisgKi8KK3ZvaWQgSEFMX0dQSU9fVG9nZ2xlUGluKEdQSU9fVHlwZURlZiAqR1BJT3gsIHVpbnQxNl90IEdQSU9fUGluKSB7CisgIHVpbnQzMl90IG9kcjsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfR1BJT19QSU4oR1BJT19QaW4pKTsKKworICAvKiBnZXQgY3VycmVudCBPdXRwdXQgRGF0YSBSZWdpc3RlciB2YWx1ZSAqLworICBvZHIgPSBHUElPeC0+T0RSOworCisgIC8qIFNldCBzZWxlY3RlZCBwaW5zIHRoYXQgd2VyZSBhdCBsb3cgbGV2ZWwsIGFuZCByZXNldCBvbmVzIHRoYXQgd2VyZSBoaWdoICovCisgIEdQSU94LT5CU1JSID0gKChvZHIgJiBHUElPX1BpbikgPDwgR1BJT19OVU1CRVIpIHwgKH5vZHIgJiBHUElPX1Bpbik7Cit9CisKKy8qKgorICogQGJyaWVmICBMb2NrIEdQSU8gUGlucyBjb25maWd1cmF0aW9uIHJlZ2lzdGVycy4KKyAqIEBub3RlICAgVGhlIGxvY2tlZCByZWdpc3RlcnMgYXJlIEdQSU94X01PREVSLCBHUElPeF9PVFlQRVIsIEdQSU94X09TUEVFRFIsCisgKiAgICAgICAgIEdQSU94X1BVUERSLCBHUElPeF9BRlJMIGFuZCBHUElPeF9BRlJILgorICogQG5vdGUgICBUaGUgY29uZmlndXJhdGlvbiBvZiB0aGUgbG9ja2VkIEdQSU8gcGlucyBjYW4gbm8gbG9uZ2VyIGJlIG1vZGlmaWVkCisgKiAgICAgICAgIHVudGlsIHRoZSBuZXh0IHJlc2V0LgorICogQHBhcmFtICBHUElPeCB3aGVyZSB4IGNhbiBiZSAoQS4uRykgdG8gc2VsZWN0IHRoZSBHUElPIHBlcmlwaGVyYWwgZm9yCisgKiBTVE0zMkc0eHggZmFtaWx5CisgKiBAcGFyYW0gIEdQSU9fUGluIHNwZWNpZmllcyB0aGUgcG9ydCBiaXRzIHRvIGJlIGxvY2tlZC4KKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiBHUElPX1BJTl94IHdoZXJlIHggY2FuIGJlCisgKiAoMC4uMTUpLgorICogQHJldHZhbCBOb25lCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9HUElPX0xvY2tQaW4oR1BJT19UeXBlRGVmICpHUElPeCwgdWludDE2X3QgR1BJT19QaW4pIHsKKyAgX19JTyB1aW50MzJfdCB0bXAgPSBHUElPX0xDS1JfTENLSzsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfR1BJT19MT0NLX0lOU1RBTkNFKEdQSU94KSk7CisgIGFzc2VydF9wYXJhbShJU19HUElPX1BJTihHUElPX1BpbikpOworCisgIC8qIEFwcGx5IGxvY2sga2V5IHdyaXRlIHNlcXVlbmNlICovCisgIHRtcCB8PSBHUElPX1BpbjsKKyAgLyogU2V0IExDS3ggYml0KHMpOiBMQ0tLPScxJyArIExDS1sxNS0wXSAqLworICBHUElPeC0+TENLUiA9IHRtcDsKKyAgLyogUmVzZXQgTENLeCBiaXQocyk6IExDS0s9JzAnICsgTENLWzE1LTBdICovCisgIEdQSU94LT5MQ0tSID0gR1BJT19QaW47CisgIC8qIFNldCBMQ0t4IGJpdChzKTogTENLSz0nMScgKyBMQ0tbMTUtMF0gKi8KKyAgR1BJT3gtPkxDS1IgPSB0bXA7CisgIC8qIFJlYWQgTENLSyByZWdpc3Rlci4gVGhpcyByZWFkIGlzIG1hbmRhdG9yeSB0byBjb21wbGV0ZSBrZXkgbG9jayBzZXF1ZW5jZSAqLworICB0bXAgPSBHUElPeC0+TENLUjsKKworICAvKiByZWFkIGFnYWluIGluIG9yZGVyIHRvIGNvbmZpcm0gbG9jayBpcyBhY3RpdmUgKi8KKyAgaWYgKChHUElPeC0+TENLUiAmIEdQSU9fTENLUl9MQ0tLKSAhPSAweDAwdSkgeworICAgIHJldHVybiBIQUxfT0s7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorfQorCisvKioKKyAqIEBicmllZiAgSGFuZGxlIEVYVEkgaW50ZXJydXB0IHJlcXVlc3QuCisgKiBAcGFyYW0gIEdQSU9fUGluIFNwZWNpZmllcyB0aGUgcG9ydCBwaW4gY29ubmVjdGVkIHRvIGNvcnJlc3BvbmRpbmcgRVhUSSBsaW5lLgorICogQHJldHZhbCBOb25lCisgKi8KK3ZvaWQgSEFMX0dQSU9fRVhUSV9JUlFIYW5kbGVyKHVpbnQxNl90IEdQSU9fUGluKSB7CisgIC8qIEVYVEkgbGluZSBpbnRlcnJ1cHQgZGV0ZWN0ZWQgKi8KKyAgaWYgKF9fSEFMX0dQSU9fRVhUSV9HRVRfSVQoR1BJT19QaW4pICE9IDB4MDB1KSB7CisgICAgX19IQUxfR1BJT19FWFRJX0NMRUFSX0lUKEdQSU9fUGluKTsKKyAgICBIQUxfR1BJT19FWFRJX0NhbGxiYWNrKEdQSU9fUGluKTsKKyAgfQorfQorCisvKioKKyAqIEBicmllZiAgRVhUSSBsaW5lIGRldGVjdGlvbiBjYWxsYmFjay4KKyAqIEBwYXJhbSAgR1BJT19QaW46IFNwZWNpZmllcyB0aGUgcG9ydCBwaW4gY29ubmVjdGVkIHRvIGNvcnJlc3BvbmRpbmcgRVhUSQorICogbGluZS4KKyAqIEByZXR2YWwgTm9uZQorICovCitfX3dlYWsgdm9pZCBIQUxfR1BJT19FWFRJX0NhbGxiYWNrKHVpbnQxNl90IEdQSU9fUGluKSB7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKEdQSU9fUGluKTsKKworICAvKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgdGhlIEhBTF9HUElPX0VYVElfQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisjZW5kaWYgLyogSEFMX0dQSU9fTU9EVUxFX0VOQUJMRUQgKi8KKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KZGlmZiAtLWdpdCBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9pd2RnLmMgYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfaXdkZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1NTczMjUKLS0tIC9kZXYvbnVsbAorKysgYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfaXdkZy5jCkBAIC0wLDAgKzEsMjcxIEBACisvKioNCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAgKiBAZmlsZSAgICBzdG0zMmc0eHhfaGFsX2l3ZGcuYw0KKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQ0KKyAgKiBAYnJpZWYgICBJV0RHIEhBTCBtb2R1bGUgZHJpdmVyLg0KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nDQorICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgSW5kZXBlbmRlbnQgV2F0Y2hkb2cgKElXREcpIHBlcmlwaGVyYWw6DQorICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uIGFuZCBTdGFydCBmdW5jdGlvbnMNCisgICogICAgICAgICAgICsgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucw0KKyAgKg0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICAqIEBhdHRlbnRpb24NCisgICoNCisgICogQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4NCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisgICoNCisgICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0ZXJtcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlDQorICAqIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4NCisgICogSWYgbm8gTElDRU5TRSBmaWxlIGNvbWVzIHdpdGggdGhpcyBzb2Z0d2FyZSwgaXQgaXMgcHJvdmlkZWQgQVMtSVMuDQorICAqDQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgIEB2ZXJiYXRpbQ0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorICAgICAgICAgICAgICAgICAgICAjIyMjIyBJV0RHIEdlbmVyaWMgZmVhdHVyZXMgIyMjIyMNCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKyAgWy4uXQ0KKyAgICAoKykgVGhlIElXREcgY2FuIGJlIHN0YXJ0ZWQgYnkgZWl0aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlIChjb25maWd1cmFibGUNCisgICAgICAgIHRocm91Z2ggb3B0aW9uIGJ5dGUpLg0KKw0KKyAgICAoKykgVGhlIElXREcgaXMgY2xvY2tlZCBieSB0aGUgTG93LVNwZWVkIEludGVybmFsIGNsb2NrIChMU0kpIGFuZCB0aHVzIHN0YXlzDQorICAgICAgICBhY3RpdmUgZXZlbiBpZiB0aGUgbWFpbiBjbG9jayBmYWlscy4NCisNCisgICAgKCspIE9uY2UgdGhlIElXREcgaXMgc3RhcnRlZCwgdGhlIExTSSBpcyBmb3JjZWQgT04gYW5kIGJvdGggY2Fubm90IGJlDQorICAgICAgICBkaXNhYmxlZC4gVGhlIGNvdW50ZXIgc3RhcnRzIGNvdW50aW5nIGRvd24gZnJvbSB0aGUgcmVzZXQgdmFsdWUgKDB4RkZGKS4NCisgICAgICAgIFdoZW4gaXQgcmVhY2hlcyB0aGUgZW5kIG9mIGNvdW50IHZhbHVlICgweDAwMCkgYSByZXNldCBzaWduYWwgaXMNCisgICAgICAgIGdlbmVyYXRlZCAoSVdERyByZXNldCkuDQorDQorICAgICgrKSBXaGVuZXZlciB0aGUga2V5IHZhbHVlIDB4MDAwMCBBQUFBIGlzIHdyaXR0ZW4gaW4gdGhlIElXREdfS1IgcmVnaXN0ZXIsDQorICAgICAgICB0aGUgSVdER19STFIgdmFsdWUgaXMgcmVsb2FkZWQgaW50byB0aGUgY291bnRlciBhbmQgdGhlIHdhdGNoZG9nIHJlc2V0DQorICAgICAgICBpcyBwcmV2ZW50ZWQuDQorDQorICAgICgrKSBUaGUgSVdERyBpcyBpbXBsZW1lbnRlZCBpbiB0aGUgVkREIHZvbHRhZ2UgZG9tYWluIHRoYXQgaXMgc3RpbGwNCisgIGZ1bmN0aW9uYWwgaW4gU1RPUCBhbmQgU1RBTkRCWSBtb2RlIChJV0RHIHJlc2V0IGNhbiB3YWtlIHVwIHRoZSBDUFUgZnJvbQ0KKyAgU1RBTkRCWSkuIElXREdSU1QgZmxhZyBpbiBSQ0NfQ1NSIHJlZ2lzdGVyIGNhbiBiZSB1c2VkIHRvIGluZm9ybSB3aGVuIGFuIElXREcNCisgICAgICAgIHJlc2V0IG9jY3Vycy4NCisNCisgICAgKCspIERlYnVnIG1vZGU6IFdoZW4gdGhlIG1pY3JvY29udHJvbGxlciBlbnRlcnMgZGVidWcgbW9kZSAoY29yZSBoYWx0ZWQpLA0KKyAgICAgICAgdGhlIElXREcgY291bnRlciBlaXRoZXIgY29udGludWVzIHRvIHdvcmsgbm9ybWFsbHkgb3Igc3RvcHMsIGRlcGVuZGluZw0KKyAgICAgICAgb24gREJHX0lXREdfU1RPUCBjb25maWd1cmF0aW9uIGJpdCBpbiBEQkcgbW9kdWxlLCBhY2Nlc3NpYmxlIHRocm91Z2gNCisgICAgICAgIF9fSEFMX0RCR01DVV9GUkVFWkVfSVdERygpIGFuZCBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfSVdERygpIG1hY3Jvcy4NCisNCisgICAgWy4uXSBNaW4tbWF4IHRpbWVvdXQgdmFsdWUgQDMyS0h6IChMU0kpOiB+MTI1dXMgLyB+MzIuN3MNCisgICAgICAgICBUaGUgSVdERyB0aW1lb3V0IG1heSB2YXJ5IGR1ZSB0byBMU0kgY2xvY2sgZnJlcXVlbmN5IGRpc3BlcnNpb24uDQorICAgICAgICAgU1RNMzJHNHh4IGRldmljZXMgcHJvdmlkZSB0aGUgY2FwYWJpbGl0eSB0byBtZWFzdXJlIHRoZSBMU0kgY2xvY2sNCisgICAgICAgICBmcmVxdWVuY3kgKExTSSBjbG9jayBpcyBpbnRlcm5hbGx5IGNvbm5lY3RlZCB0byBUSU0xNiBDSDEgaW5wdXQNCisgIGNhcHR1cmUpLiBUaGUgbWVhc3VyZWQgdmFsdWUgY2FuIGJlIHVzZWQgdG8gaGF2ZSBhbiBJV0RHIHRpbWVvdXQgd2l0aCBhbg0KKyAgICAgICAgIGFjY2VwdGFibGUgYWNjdXJhY3kuDQorDQorICAgIFsuLl0gRGVmYXVsdCB0aW1lb3V0IHZhbHVlIChuZWNlc3NhcnkgZm9yIElXREdfU1Igc3RhdHVzIHJlZ2lzdGVyIHVwZGF0ZSk6DQorICAgICAgICAgQ29uc3RhbnQgTFNJX1ZBTFVFIGlzIGRlZmluZWQgYmFzZWQgb24gdGhlIG5vbWluYWwgTFNJIGNsb2NrIGZyZXF1ZW5jeS4NCisgICAgICAgICBUaGlzIGZyZXF1ZW5jeSBiZWluZyBzdWJqZWN0IHRvIHZhcmlhdGlvbnMgYXMgbWVudGlvbmVkIGFib3ZlLCB0aGUNCisgICAgICAgICBkZWZhdWx0IHRpbWVvdXQgdmFsdWUgKGRlZmluZWQgdGhyb3VnaCBjb25zdGFudA0KKyAgSEFMX0lXREdfREVGQVVMVF9USU1FT1VUIGJlbG93KSBtYXkgYmVjb21lIHRvbyBzaG9ydCBvciB0b28gbG9uZy4gSW4gc3VjaA0KKyAgY2FzZXMsIHRoaXMgZGVmYXVsdCB0aW1lb3V0IHZhbHVlIGNhbiBiZSB0dW5lZCBieSByZWRlZmluaW5nIHRoZSBjb25zdGFudA0KKyAgTFNJX1ZBTFVFIGF0IHVzZXItYXBwbGljYXRpb24gbGV2ZWwgKGJhc2VkLCBmb3IgaW5zdGFuY2UsIG9uIHRoZSBtZWFzdXJlZCBMU0kNCisgIGNsb2NrIGZyZXF1ZW5jeSBhcyBleHBsYWluZWQgYWJvdmUpLg0KKw0KKyAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMNCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKyAgWy4uXQ0KKyAgICAoIykgVXNlIElXREcgdXNpbmcgSEFMX0lXREdfSW5pdCgpIGZ1bmN0aW9uIHRvIDoNCisgICAgICAoKyspIEVuYWJsZSBpbnN0YW5jZSBieSB3cml0aW5nIFN0YXJ0IGtleXdvcmQgaW4gSVdER19LRVkgcmVnaXN0ZXIuIExTSQ0KKyAgICAgICAgICAgY2xvY2sgaXMgZm9yY2VkIE9OIGFuZCBJV0RHIGNvdW50ZXIgc3RhcnRzIGNvdW50aW5nIGRvd24uDQorICAgICAgKCsrKSBFbmFibGUgd3JpdGUgYWNjZXNzIHRvIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzOg0KKyAgICAgICAgICBJV0RHX1BSLCBJV0RHX1JMUiBhbmQgSVdER19XSU5SLg0KKyAgICAgICgrKykgQ29uZmlndXJlIHRoZSBJV0RHIHByZXNjYWxlciBhbmQgY291bnRlciByZWxvYWQgdmFsdWUuIFRoaXMgcmVsb2FkDQorICAgICAgICAgICB2YWx1ZSB3aWxsIGJlIGxvYWRlZCBpbiB0aGUgSVdERyBjb3VudGVyIGVhY2ggdGltZSB0aGUgd2F0Y2hkb2cgaXMNCisgICAgICAgICAgIHJlbG9hZGVkLCB0aGVuIHRoZSBJV0RHIHdpbGwgc3RhcnQgY291bnRpbmcgZG93biBmcm9tIHRoaXMgdmFsdWUuDQorICAgICAgKCsrKSBEZXBlbmRpbmcgb24gd2luZG93IHBhcmFtZXRlcjoNCisgICAgICAgICgrKyspIElmIFdpbmRvdyBJbml0IHBhcmFtZXRlciBpcyBzYW1lIGFzIFdpbmRvdyByZWdpc3RlciB2YWx1ZSwNCisgICAgICAgICAgICAgbm90aGluZyBtb3JlIGlzIGRvbmUgYnV0IHJlbG9hZCBjb3VudGVyIHZhbHVlIGluIG9yZGVyIHRvIGV4aXQNCisgICAgICAgICAgICAgZnVuY3Rpb24gd2l0aCBleGFjdCB0aW1lIGJhc2UuDQorICAgICAgICAoKysrKSBFbHNlIG1vZGlmeSBXaW5kb3cgcmVnaXN0ZXIuIFRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5IHJlbG9hZA0KKyAgICAgICAgICAgICB3YXRjaGRvZyBjb3VudGVyLg0KKyAgICAgICgrKykgV2FpdCBmb3Igc3RhdHVzIGZsYWdzIHRvIGJlIHJlc2V0Lg0KKw0KKyAgICAoIykgVGhlbiB0aGUgYXBwbGljYXRpb24gcHJvZ3JhbSBtdXN0IHJlZnJlc2ggdGhlIElXREcgY291bnRlciBhdCByZWd1bGFyDQorICAgICAgICBpbnRlcnZhbHMgZHVyaW5nIG5vcm1hbCBvcGVyYXRpb24gdG8gcHJldmVudCBhbiBNQ1UgcmVzZXQsIHVzaW5nDQorICAgICAgICBIQUxfSVdER19SZWZyZXNoKCkgZnVuY3Rpb24uDQorDQorICAgICAqKiogSVdERyBIQUwgZHJpdmVyIG1hY3JvcyBsaXN0ICoqKg0KKyAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorICAgICBbLi5dDQorICAgICAgIEJlbG93IHRoZSBsaXN0IG9mIG1vc3QgdXNlZCBtYWNyb3MgaW4gSVdERyBIQUwgZHJpdmVyOg0KKyAgICAgICgrKSBfX0hBTF9JV0RHX1NUQVJUOiBFbmFibGUgdGhlIElXREcgcGVyaXBoZXJhbA0KKyAgICAgICgrKSBfX0hBTF9JV0RHX1JFTE9BRF9DT1VOVEVSOiBSZWxvYWRzIElXREcgY291bnRlciB3aXRoIHZhbHVlIGRlZmluZWQgaW4NCisgICAgICAgICAgdGhlIHJlbG9hZCByZWdpc3Rlcg0KKw0KKyAgQGVuZHZlcmJhdGltDQorICAqLw0KKw0KKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorI2luY2x1ZGUgInN0bTMyZzR4eF9oYWwuaCINCisNCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHNHh4X0hBTF9Ecml2ZXINCisgKiBAew0KKyAqLw0KKw0KKyNpZmRlZiBIQUxfSVdER19NT0RVTEVfRU5BQkxFRA0KKy8qKiBAYWRkdG9ncm91cCBJV0RHDQorICogQGJyaWVmIElXREcgSEFMIG1vZHVsZSBkcml2ZXIuDQorICogQHsNCisgKi8NCisNCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorLyoqIEBkZWZncm91cCBJV0RHX1ByaXZhdGVfRGVmaW5lcyBJV0RHIFByaXZhdGUgRGVmaW5lcw0KKyAqIEB7DQorICovDQorLyogU3RhdHVzIHJlZ2lzdGVyIG5lZWRzIHVwIHRvIDUgTFNJIGNsb2NrIHBlcmlvZHMgZGl2aWRlZCBieSB0aGUgY2xvY2sNCisgICBwcmVzY2FsZXIgdG8gYmUgdXBkYXRlZC4gVGhlIG51bWJlciBvZiBMU0kgY2xvY2sgcGVyaW9kcyBpcyB1cHBlci1yb3VuZGVkIHRvDQorICAgNiBmb3IgdGhlIHRpbWVvdXQgdmFsdWUgY2FsY3VsYXRpb24uDQorICAgVGhlIHRpbWVvdXQgdmFsdWUgaXMgY2FsY3VsYXRlZCB1c2luZyB0aGUgaGlnaGVzdCBwcmVzY2FsZXIgKDI1NikgYW5kDQorICAgdGhlIExTSV9WQUxVRSBjb25zdGFudC4gVGhlIHZhbHVlIG9mIHRoaXMgY29uc3RhbnQgY2FuIGJlIGNoYW5nZWQgYnkgdGhlIHVzZXINCisgICB0byB0YWtlIGludG8gYWNjb3VudCBwb3NzaWJsZSBMU0kgY2xvY2sgcGVyaW9kIHZhcmlhdGlvbnMuDQorICAgVGhlIHRpbWVvdXQgdmFsdWUgaXMgbXVsdGlwbGllZCBieSAxMDAwIHRvIGJlIGNvbnZlcnRlZCBpbiBtaWxsaXNlY29uZHMuDQorICAgTFNJIHN0YXJ0dXAgdGltZSBpcyBhbHNvIGNvbnNpZGVyZWQgaGVyZSBieSBhZGRpbmcgTFNJX1NUQVJUVVBfVElNRQ0KKyAgIGNvbnZlcnRlZCBpbiBtaWxsaXNlY29uZHMuICovDQorI2RlZmluZSBIQUxfSVdER19ERUZBVUxUX1RJTUVPVVQgXA0KKyAgKCgoNlVMICogMjU2VUwgKiAxMDAwVUwpIC8gTFNJX1ZBTFVFKSArICgoTFNJX1NUQVJUVVBfVElNRSAvIDEwMDBVTCkgKyAxVUwpKQ0KKyNkZWZpbmUgSVdER19LRVJORUxfVVBEQVRFX0ZMQUdTIChJV0RHX1NSX1dWVSB8IElXREdfU1JfUlZVIHwgSVdER19TUl9QVlUpDQorLyoqDQorICogQH0NCisgKi8NCisNCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KKy8qKiBAYWRkdG9ncm91cCBJV0RHX0V4cG9ydGVkX0Z1bmN0aW9ucw0KKyAqIEB7DQorICovDQorDQorLyoqIEBhZGR0b2dyb3VwIElXREdfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMQ0KKyAgKiAgQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBTdGFydCBmdW5jdGlvbnMuDQorICAqDQorQHZlcmJhdGltDQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIFN0YXJ0IGZ1bmN0aW9ucyAjIyMjIw0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86DQorICAgICAgKCspIEluaXRpYWxpemUgdGhlIElXREcgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycyBpbiB0aGUNCisgICAgICAgICAgSVdER19Jbml0VHlwZURlZiBvZiBhc3NvY2lhdGVkIGhhbmRsZS4NCisgICAgICAoKykgTWFuYWdlIFdpbmRvdyBvcHRpb24uDQorICAgICAgKCspIE9uY2UgaW5pdGlhbGl6YXRpb24gaXMgcGVyZm9ybWVkIGluIEhBTF9JV0RHX0luaXQgZnVuY3Rpb24sIFdhdGNoZG9nDQorICAgICAgICAgIGlzIHJlbG9hZGVkIGluIG9yZGVyIHRvIGV4aXQgZnVuY3Rpb24gd2l0aCBjb3JyZWN0IHRpbWUgYmFzZS4NCisNCitAZW5kdmVyYmF0aW0NCisgICogQHsNCisgICovDQorDQorLyoqDQorICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBJV0RHIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMgaW4gdGhlDQorICogICAgICAgICBJV0RHX0luaXRUeXBlRGVmIGFuZCBzdGFydCB3YXRjaGRvZy4gQmVmb3JlIGV4aXRpbmcgZnVuY3Rpb24sDQorICogICAgICAgICB3YXRjaGRvZyBpcyByZWZyZXNoZWQgaW4gb3JkZXIgdG8gaGF2ZSBjb3JyZWN0IHRpbWUgYmFzZS4NCisgKiBAcGFyYW0gIGhpd2RnICBwb2ludGVyIHRvIGEgSVdER19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQorICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSVdERyBtb2R1bGUuDQorICogQHJldHZhbCBIQUwgc3RhdHVzDQorICovDQorSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lXREdfSW5pdChJV0RHX0hhbmRsZVR5cGVEZWYgKmhpd2RnKSB7DQorICB1aW50MzJfdCB0aWNrc3RhcnQ7DQorDQorICAvKiBDaGVjayB0aGUgSVdERyBoYW5kbGUgYWxsb2NhdGlvbiAqLw0KKyAgaWYgKGhpd2RnID09IE5VTEwpIHsNCisgICAgcmV0dXJuIEhBTF9FUlJPUjsNCisgIH0NCisNCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQorICBhc3NlcnRfcGFyYW0oSVNfSVdER19BTExfSU5TVEFOQ0UoaGl3ZGctPkluc3RhbmNlKSk7DQorICBhc3NlcnRfcGFyYW0oSVNfSVdER19QUkVTQ0FMRVIoaGl3ZGctPkluaXQuUHJlc2NhbGVyKSk7DQorICBhc3NlcnRfcGFyYW0oSVNfSVdER19SRUxPQUQoaGl3ZGctPkluaXQuUmVsb2FkKSk7DQorICBhc3NlcnRfcGFyYW0oSVNfSVdER19XSU5ET1coaGl3ZGctPkluaXQuV2luZG93KSk7DQorDQorICAvKiBFbmFibGUgSVdERy4gTFNJIGlzIHR1cm5lZCBvbiBhdXRvbWF0aWNhbGx5ICovDQorICBfX0hBTF9JV0RHX1NUQVJUKGhpd2RnKTsNCisNCisgIC8qIEVuYWJsZSB3cml0ZSBhY2Nlc3MgdG8gSVdER19QUiwgSVdER19STFIgYW5kIElXREdfV0lOUiByZWdpc3RlcnMgYnkgd3JpdGluZw0KKyAgMHg1NTU1IGluIEtSICovDQorICBJV0RHX0VOQUJMRV9XUklURV9BQ0NFU1MoaGl3ZGcpOw0KKw0KKyAgLyogV3JpdGUgdG8gSVdERyByZWdpc3RlcnMgdGhlIFByZXNjYWxlciAmIFJlbG9hZCB2YWx1ZXMgdG8gd29yayB3aXRoICovDQorICBoaXdkZy0+SW5zdGFuY2UtPlBSID0gaGl3ZGctPkluaXQuUHJlc2NhbGVyOw0KKyAgaGl3ZGctPkluc3RhbmNlLT5STFIgPSBoaXdkZy0+SW5pdC5SZWxvYWQ7DQorDQorICAvKiBDaGVjayBwZW5kaW5nIGZsYWcsIGlmIHByZXZpb3VzIHVwZGF0ZSBub3QgZG9uZSwgcmV0dXJuIHRpbWVvdXQgKi8NCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7DQorDQorICAvKiBXYWl0IGZvciByZWdpc3RlciB0byBiZSB1cGRhdGVkICovDQorICB3aGlsZSAoKGhpd2RnLT5JbnN0YW5jZS0+U1IgJiBJV0RHX0tFUk5FTF9VUERBVEVfRkxBR1MpICE9IDB4MDB1KSB7DQorICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBIQUxfSVdER19ERUZBVUxUX1RJTUVPVVQpIHsNCisgICAgICBpZiAoKGhpd2RnLT5JbnN0YW5jZS0+U1IgJiBJV0RHX0tFUk5FTF9VUERBVEVfRkxBR1MpICE9IDB4MDB1KSB7DQorICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorDQorICAvKiBJZiB3aW5kb3cgcGFyYW1ldGVyIGlzIGRpZmZlcmVudCB0aGFuIGN1cnJlbnQgdmFsdWUsIG1vZGlmeSB3aW5kb3cNCisgIHJlZ2lzdGVyICovDQorICBpZiAoaGl3ZGctPkluc3RhbmNlLT5XSU5SICE9IGhpd2RnLT5Jbml0LldpbmRvdykgew0KKyAgICAvKiBXcml0ZSB0byBJV0RHIFdJTlIgdGhlIElXREdfV2luZG93IHZhbHVlIHRvIGNvbXBhcmUgd2l0aC4gSW4gYW55IGNhc2UsDQorICAgIGV2ZW4gaWYgd2luZG93IGZlYXR1cmUgaXMgZGlzYWJsZWQsIFdhdGNoZG9nIHdpbGwgYmUgcmVsb2FkZWQgYnkgd3JpdGluZw0KKyAgICB3aW5kb3dzIHJlZ2lzdGVyICovDQorICAgIGhpd2RnLT5JbnN0YW5jZS0+V0lOUiA9IGhpd2RnLT5Jbml0LldpbmRvdzsNCisgIH0gZWxzZSB7DQorICAgIC8qIFJlbG9hZCBJV0RHIGNvdW50ZXIgd2l0aCB2YWx1ZSBkZWZpbmVkIGluIHRoZSByZWxvYWQgcmVnaXN0ZXIgKi8NCisgICAgX19IQUxfSVdER19SRUxPQURfQ09VTlRFUihoaXdkZyk7DQorICB9DQorDQorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovDQorICByZXR1cm4gSEFMX09LOw0KK30NCisNCisvKioNCisgKiBAfQ0KKyAqLw0KKw0KKy8qKiBAYWRkdG9ncm91cCBJV0RHX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDINCisgICogIEBicmllZiAgIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMNCisgICoNCitAdmVyYmF0aW0NCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICMjIyMjDQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoNCisgICAgICAoKykgUmVmcmVzaCB0aGUgSVdERy4NCisNCitAZW5kdmVyYmF0aW0NCisgICogQHsNCisgICovDQorDQorLyoqDQorICogQGJyaWVmICBSZWZyZXNoIHRoZSBJV0RHLg0KKyAqIEBwYXJhbSAgaGl3ZGcgIHBvaW50ZXIgdG8gYSBJV0RHX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCisgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJV0RHIG1vZHVsZS4NCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMNCisgKi8NCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVdER19SZWZyZXNoKElXREdfSGFuZGxlVHlwZURlZiAqaGl3ZGcpIHsNCisgIC8qIFJlbG9hZCBJV0RHIGNvdW50ZXIgd2l0aCB2YWx1ZSBkZWZpbmVkIGluIHRoZSByZWxvYWQgcmVnaXN0ZXIgKi8NCisgIF9fSEFMX0lXREdfUkVMT0FEX0NPVU5URVIoaGl3ZGcpOw0KKw0KKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLw0KKyAgcmV0dXJuIEhBTF9PSzsNCit9DQorDQorLyoqDQorICogQH0NCisgKi8NCisNCisvKioNCisgKiBAfQ0KKyAqLw0KKw0KKyNlbmRpZiAvKiBIQUxfSVdER19NT0RVTEVfRU5BQkxFRCAqLw0KKy8qKg0KKyAqIEB9DQorICovDQorDQorLyoqDQorICogQH0NCisgKi8NCmRpZmYgLS1naXQgYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfcGNkLmMgYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfcGNkLmMKaW5kZXggMjc0M2U4NC4uNDYzNDllYiAxMDA2NDQKLS0tIGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3BjZC5jCisrKyBiL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9wY2QuYwpAQCAtMSwyMDI5ICsxLDIwNjEgQEAKLS8qKg0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICAqIEBmaWxlICAgIHN0bTMyZzR4eF9oYWxfcGNkLmMNCi0gICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0NCi0gICogQGJyaWVmICAgUENEIEhBTCBtb2R1bGUgZHJpdmVyLg0KLSAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nDQotICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgVVNCIFBlcmlwaGVyYWwgQ29udHJvbGxlcjoNCi0gICogICAgICAgICAgICsgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucw0KLSAgKiAgICAgICAgICAgKyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zDQotICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMNCi0gICogICAgICAgICAgICsgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMNCi0gICoNCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgKiBAYXR0ZW50aW9uDQotICAqDQotICAqIENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuDQotICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQotICAqDQotICAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGVybXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZQ0KLSAgKiBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb2Z0d2FyZSBjb21wb25lbnQuDQotICAqIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcyB3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLg0KLSAgKg0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICBAdmVyYmF0aW0NCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIw0KLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgIFsuLl0NCi0gICAgICBUaGUgUENEIEhBTCBkcml2ZXIgY2FuIGJlIHVzZWQgYXMgZm9sbG93czoNCi0NCi0gICAgICgjKSBEZWNsYXJlIGEgUENEX0hhbmRsZVR5cGVEZWYgaGFuZGxlIHN0cnVjdHVyZSwgZm9yIGV4YW1wbGU6DQotICAgICAgICAgUENEX0hhbmRsZVR5cGVEZWYgIGhwY2Q7DQotDQotICAgICAoIykgRmlsbCBwYXJhbWV0ZXJzIG9mIEluaXQgc3RydWN0dXJlIGluIEhDRCBoYW5kbGUNCi0NCi0gICAgICgjKSBDYWxsIEhBTF9QQ0RfSW5pdCgpIEFQSSB0byBpbml0aWFsaXplIHRoZSBQQ0QgcGVyaXBoZXJhbCAoQ29yZSwgRGV2aWNlDQotICBjb3JlLCAuLi4pDQotDQotICAgICAoIykgSW5pdGlhbGl6ZSB0aGUgUENEIGxvdyBsZXZlbCByZXNvdXJjZXMgdGhyb3VnaCB0aGUgSEFMX1BDRF9Nc3BJbml0KCkNCi0gIEFQSToNCi0gICAgICAgICAoIyMpIEVuYWJsZSB0aGUgUENEL1VTQiBMb3cgTGV2ZWwgaW50ZXJmYWNlIGNsb2NrIHVzaW5nDQotICAgICAgICAgICAgICAoKysrKSBfX0hBTF9SQ0NfVVNCX0NMS19FTkFCTEUoKTsgRm9yIFVTQiBEZXZpY2Ugb25seSBGUw0KLSAgcGVyaXBoZXJhbA0KLQ0KLSAgICAgICAgICgjIykgSW5pdGlhbGl6ZSB0aGUgcmVsYXRlZCBHUElPIGNsb2Nrcw0KLSAgICAgICAgICgjIykgQ29uZmlndXJlIFBDRCBwaW4tb3V0DQotICAgICAgICAgKCMjKSBDb25maWd1cmUgUENEIE5WSUMgaW50ZXJydXB0DQotDQotICAgICAoIylBc3NvY2lhdGUgdGhlIFVwcGVyIFVTQiBkZXZpY2Ugc3RhY2sgdG8gdGhlIEhBTCBQQ0QgRHJpdmVyOg0KLSAgICAgICAgICgjIykgaHBjZC5wRGF0YSA9IHBkZXY7DQotDQotICAgICAoIylFbmFibGUgUENEIHRyYW5zbWlzc2lvbiBhbmQgcmVjZXB0aW9uOg0KLSAgICAgICAgICgjIykgSEFMX1BDRF9TdGFydCgpOw0KLQ0KLSAgQGVuZHZlcmJhdGltDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICovDQotDQotLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaW5jbHVkZSAic3RtMzJnNHh4X2hhbC5oIg0KLQ0KLS8qKiBAYWRkdG9ncm91cCBTVE0zMkc0eHhfSEFMX0RyaXZlcg0KLSAqIEB7DQotICovDQotDQotLyoqIEBkZWZncm91cCBQQ0QgUENEDQotICogQGJyaWVmIFBDRCBIQUwgbW9kdWxlIGRyaXZlcg0KLSAqIEB7DQotICovDQotDQotI2lmZGVmIEhBTF9QQ0RfTU9EVUxFX0VOQUJMRUQNCi0NCi0jaWYgZGVmaW5lZChVU0IpDQotDQotLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGRlZmdyb3VwIFBDRF9Qcml2YXRlX01hY3JvcyBQQ0QgUHJpdmF0ZSBNYWNyb3MNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgUENEX01JTihhLCBiKSAoKChhKSA8IChiKSkgPyAoYSkgOiAoYikpDQotI2RlZmluZSBQQ0RfTUFYKGEsIGIpICgoKGEpID4gKGIpKSA/IChhKSA6IChiKSkNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIFByaXZhdGUgZnVuY3Rpb25zIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBkZWZncm91cCBQQ0RfUHJpdmF0ZV9GdW5jdGlvbnMgUENEIFByaXZhdGUgRnVuY3Rpb25zDQotICogQHsNCi0gKi8NCi0NCi1zdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgUENEX0VQX0lTUl9IYW5kbGVyKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsNCi0jaWYgKFVTRV9VU0JfRE9VQkxFX0JVRkZFUiA9PSAxVSkNCi1zdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9FUF9EQl9UcmFuc21pdChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0RfRVBUeXBlRGVmICplcCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB3RVBWYWwpOw0KLXN0YXRpYyB1aW50MTZfdCBIQUxfUENEX0VQX0RCX1JlY2VpdmUoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0RfRVBUeXBlRGVmICplcCwgdWludDE2X3Qgd0VQVmFsKTsNCi0jZW5kaWYgLyogKFVTRV9VU0JfRE9VQkxFX0JVRkZFUiA9PSAxVSkgKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBkZWZncm91cCBQQ0RfRXhwb3J0ZWRfRnVuY3Rpb25zIFBDRCBFeHBvcnRlZCBGdW5jdGlvbnMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUENEX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uDQotZnVuY3Rpb25zDQotICAqICBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zDQotICAqDQotQHZlcmJhdGltDQotID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgICAgICAgICAjIyMjIyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICMjIyMjDQotID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoNCi0NCi1AZW5kdmVyYmF0aW0NCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgUENEIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkDQotICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBQQ0RfSW5pdFR5cGVEZWYgYW5kIGluaXRpYWxpemUgdGhlIGFzc29jaWF0ZWQNCi0gKiBoYW5kbGUuDQotICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX0luaXQoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpIHsNCi0gIHVpbnQ4X3QgaTsNCi0NCi0gIC8qIENoZWNrIHRoZSBQQ0QgaGFuZGxlIGFsbG9jYXRpb24gKi8NCi0gIGlmIChocGNkID09IE5VTEwpIHsNCi0gICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gIH0NCi0NCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfUENEX0FMTF9JTlNUQU5DRShocGNkLT5JbnN0YW5jZSkpOw0KLQ0KLSAgaWYgKGhwY2QtPlN0YXRlID09IEhBTF9QQ0RfU1RBVEVfUkVTRVQpIHsNCi0gICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLw0KLSAgICBocGNkLT5Mb2NrID0gSEFMX1VOTE9DS0VEOw0KLQ0KLSNpZiAoVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQ0KLSAgICBocGNkLT5TT0ZDYWxsYmFjayA9IEhBTF9QQ0RfU09GQ2FsbGJhY2s7DQotICAgIGhwY2QtPlNldHVwU3RhZ2VDYWxsYmFjayA9IEhBTF9QQ0RfU2V0dXBTdGFnZUNhbGxiYWNrOw0KLSAgICBocGNkLT5SZXNldENhbGxiYWNrID0gSEFMX1BDRF9SZXNldENhbGxiYWNrOw0KLSAgICBocGNkLT5TdXNwZW5kQ2FsbGJhY2sgPSBIQUxfUENEX1N1c3BlbmRDYWxsYmFjazsNCi0gICAgaHBjZC0+UmVzdW1lQ2FsbGJhY2sgPSBIQUxfUENEX1Jlc3VtZUNhbGxiYWNrOw0KLSAgICBocGNkLT5Db25uZWN0Q2FsbGJhY2sgPSBIQUxfUENEX0Nvbm5lY3RDYWxsYmFjazsNCi0gICAgaHBjZC0+RGlzY29ubmVjdENhbGxiYWNrID0gSEFMX1BDRF9EaXNjb25uZWN0Q2FsbGJhY2s7DQotICAgIGhwY2QtPkRhdGFPdXRTdGFnZUNhbGxiYWNrID0gSEFMX1BDRF9EYXRhT3V0U3RhZ2VDYWxsYmFjazsNCi0gICAgaHBjZC0+RGF0YUluU3RhZ2VDYWxsYmFjayA9IEhBTF9QQ0RfRGF0YUluU3RhZ2VDYWxsYmFjazsNCi0gICAgaHBjZC0+SVNPT1VUSW5jb21wbGV0ZUNhbGxiYWNrID0gSEFMX1BDRF9JU09PVVRJbmNvbXBsZXRlQ2FsbGJhY2s7DQotICAgIGhwY2QtPklTT0lOSW5jb21wbGV0ZUNhbGxiYWNrID0gSEFMX1BDRF9JU09JTkluY29tcGxldGVDYWxsYmFjazsNCi0gICAgaHBjZC0+TFBNQ2FsbGJhY2sgPSBIQUxfUENERXhfTFBNX0NhbGxiYWNrOw0KLSAgICBocGNkLT5CQ0RDYWxsYmFjayA9IEhBTF9QQ0RFeF9CQ0RfQ2FsbGJhY2s7DQotDQotICAgIGlmIChocGNkLT5Nc3BJbml0Q2FsbGJhY2sgPT0gTlVMTCkgew0KLSAgICAgIGhwY2QtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9QQ0RfTXNwSW5pdDsNCi0gICAgfQ0KLQ0KLSAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8NCi0gICAgaHBjZC0+TXNwSW5pdENhbGxiYWNrKGhwY2QpOw0KLSNlbHNlDQotICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLLCBOVklDLi4uICovDQotICAgIEhBTF9QQ0RfTXNwSW5pdChocGNkKTsNCi0jZW5kaWYgLyogKFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUykgKi8NCi0gIH0NCi0NCi0gIGhwY2QtPlN0YXRlID0gSEFMX1BDRF9TVEFURV9CVVNZOw0KLQ0KLSAgLyogRGlzYWJsZSB0aGUgSW50ZXJydXB0cyAqLw0KLSAgX19IQUxfUENEX0RJU0FCTEUoaHBjZCk7DQotDQotICAvKiBJbml0IGVuZHBvaW50cyBzdHJ1Y3R1cmVzICovDQotICBmb3IgKGkgPSAwVTsgaSA8IGhwY2QtPkluaXQuZGV2X2VuZHBvaW50czsgaSsrKSB7DQotICAgIC8qIEluaXQgZXAgc3RydWN0dXJlICovDQotICAgIGhwY2QtPklOX2VwW2ldLmlzX2luID0gMVU7DQotICAgIGhwY2QtPklOX2VwW2ldLm51bSA9IGk7DQotICAgIGhwY2QtPklOX2VwW2ldLnR4X2ZpZm9fbnVtID0gaTsNCi0gICAgLyogQ29udHJvbCB1bnRpbCBlcCBpcyBhY3RpdmF0ZWQgKi8NCi0gICAgaHBjZC0+SU5fZXBbaV0udHlwZSA9IEVQX1RZUEVfQ1RSTDsNCi0gICAgaHBjZC0+SU5fZXBbaV0ubWF4cGFja2V0ID0gMFU7DQotICAgIGhwY2QtPklOX2VwW2ldLnhmZXJfYnVmZiA9IDBVOw0KLSAgICBocGNkLT5JTl9lcFtpXS54ZmVyX2xlbiA9IDBVOw0KLSAgfQ0KLQ0KLSAgZm9yIChpID0gMFU7IGkgPCBocGNkLT5Jbml0LmRldl9lbmRwb2ludHM7IGkrKykgew0KLSAgICBocGNkLT5PVVRfZXBbaV0uaXNfaW4gPSAwVTsNCi0gICAgaHBjZC0+T1VUX2VwW2ldLm51bSA9IGk7DQotICAgIC8qIENvbnRyb2wgdW50aWwgZXAgaXMgYWN0aXZhdGVkICovDQotICAgIGhwY2QtPk9VVF9lcFtpXS50eXBlID0gRVBfVFlQRV9DVFJMOw0KLSAgICBocGNkLT5PVVRfZXBbaV0ubWF4cGFja2V0ID0gMFU7DQotICAgIGhwY2QtPk9VVF9lcFtpXS54ZmVyX2J1ZmYgPSAwVTsNCi0gICAgaHBjZC0+T1VUX2VwW2ldLnhmZXJfbGVuID0gMFU7DQotICB9DQotDQotICAvKiBJbml0IERldmljZSAqLw0KLSAgKHZvaWQpVVNCX0RldkluaXQoaHBjZC0+SW5zdGFuY2UsIGhwY2QtPkluaXQpOw0KLQ0KLSAgaHBjZC0+VVNCX0FkZHJlc3MgPSAwVTsNCi0gIGhwY2QtPlN0YXRlID0gSEFMX1BDRF9TVEFURV9SRUFEWTsNCi0NCi0gIC8qIEFjdGl2YXRlIExQTSAqLw0KLSAgaWYgKGhwY2QtPkluaXQubHBtX2VuYWJsZSA9PSAxVSkgew0KLSAgICAodm9pZClIQUxfUENERXhfQWN0aXZhdGVMUE0oaHBjZCk7DQotICB9DQotDQotICByZXR1cm4gSEFMX09LOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERlSW5pdGlhbGl6ZXMgdGhlIFBDRCBwZXJpcGhlcmFsLg0KLSAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9EZUluaXQoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpIHsNCi0gIC8qIENoZWNrIHRoZSBQQ0QgaGFuZGxlIGFsbG9jYXRpb24gKi8NCi0gIGlmIChocGNkID09IE5VTEwpIHsNCi0gICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gIH0NCi0NCi0gIGhwY2QtPlN0YXRlID0gSEFMX1BDRF9TVEFURV9CVVNZOw0KLQ0KLSAgLyogU3RvcCBEZXZpY2UgKi8NCi0gIGlmIChVU0JfU3RvcERldmljZShocGNkLT5JbnN0YW5jZSkgIT0gSEFMX09LKSB7DQotICAgIHJldHVybiBIQUxfRVJST1I7DQotICB9DQotDQotI2lmIChVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpDQotICBpZiAoaHBjZC0+TXNwRGVJbml0Q2FsbGJhY2sgPT0gTlVMTCkgew0KLSAgICBocGNkLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9QQ0RfTXNwRGVJbml0OyAvKiBMZWdhY3kgd2VhayBNc3BEZUluaXQgICovDQotICB9DQotDQotICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLw0KLSAgaHBjZC0+TXNwRGVJbml0Q2FsbGJhY2soaHBjZCk7DQotI2Vsc2UNCi0gIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlOiBDTE9DSywgTlZJQy4qLw0KLSAgSEFMX1BDRF9Nc3BEZUluaXQoaHBjZCk7DQotI2VuZGlmIC8qIFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLQ0KLSAgaHBjZC0+U3RhdGUgPSBIQUxfUENEX1NUQVRFX1JFU0VUOw0KLQ0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgUENEIE1TUC4NCi0gKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fd2VhayB2b2lkIEhBTF9QQ0RfTXNwSW5pdChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCkgew0KLSAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLw0KLSAgVU5VU0VEKGhwY2QpOw0KLQ0KLSAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLA0KLSAgICAgICAgICAgIHRoZSBIQUxfUENEX01zcEluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQ0KLSAgICovDQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGVJbml0aWFsaXplcyBQQ0QgTVNQLg0KLSAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlDQotICogQHJldHZhbCBOb25lDQotICovDQotX193ZWFrIHZvaWQgSEFMX1BDRF9Nc3BEZUluaXQoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpIHsNCi0gIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8NCi0gIFVOVVNFRChocGNkKTsNCi0NCi0gIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwNCi0gICAgICAgICAgICB0aGUgSEFMX1BDRF9Nc3BEZUluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQ0KLSAgICovDQotfQ0KLQ0KLSNpZiAoVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQ0KLS8qKg0KLSAqIEBicmllZiAgUmVnaXN0ZXIgYSBVc2VyIFVTQiBQQ0QgQ2FsbGJhY2sNCi0gKiAgICAgICAgIFRvIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgd2VhayBwcmVkZWZpbmVkIGNhbGxiYWNrDQotICogQHBhcmFtICBocGNkIFVTQiBQQ0QgaGFuZGxlDQotICogQHBhcmFtICBDYWxsYmFja0lEIElEIG9mIHRoZSBjYWxsYmFjayB0byBiZSByZWdpc3RlcmVkDQotICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfUENEX1NPRl9DQl9JRCBVU0IgUENEIFNPRiBjYWxsYmFjayBJRA0KLSAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfUENEX1NFVFVQU1RBR0VfQ0JfSUQgVVNCIFBDRCBTZXR1cCBjYWxsYmFjayBJRA0KLSAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfUENEX1JFU0VUX0NCX0lEIFVTQiBQQ0QgUmVzZXQgY2FsbGJhY2sgSUQNCi0gKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1BDRF9TVVNQRU5EX0NCX0lEIFVTQiBQQ0QgU3VzcGVuZCBjYWxsYmFjayBJRA0KLSAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfUENEX1JFU1VNRV9DQl9JRCBVU0IgUENEIFJlc3VtZSBjYWxsYmFjayBJRA0KLSAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfUENEX0NPTk5FQ1RfQ0JfSUQgVVNCIFBDRCBDb25uZWN0IGNhbGxiYWNrIElEDQotICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9QQ0RfRElTQ09OTkVDVF9DQl9JRCBPVEcgUENEIERpc2Nvbm5lY3QgY2FsbGJhY2sgSUQNCi0gKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1BDRF9NU1BJTklUX0NCX0lEIE1zcERlSW5pdCBjYWxsYmFjayBJRA0KLSAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfUENEX01TUERFSU5JVF9DQl9JRCBNc3BEZUluaXQgY2FsbGJhY2sgSUQNCi0gKiBAcGFyYW0gIHBDYWxsYmFjayBwb2ludGVyIHRvIHRoZSBDYWxsYmFjayBmdW5jdGlvbg0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfUmVnaXN0ZXJDYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1BDRF9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUENEX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spIHsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsNCi0NCi0gIGlmIChwQ2FsbGJhY2sgPT0gTlVMTCkgew0KLSAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8NCi0gICAgaHBjZC0+RXJyb3JDb2RlIHw9IEhBTF9QQ0RfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsNCi0gICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gIH0NCi0gIC8qIFByb2Nlc3MgbG9ja2VkICovDQotICBfX0hBTF9MT0NLKGhwY2QpOw0KLQ0KLSAgaWYgKGhwY2QtPlN0YXRlID09IEhBTF9QQ0RfU1RBVEVfUkVBRFkpIHsNCi0gICAgc3dpdGNoIChDYWxsYmFja0lEKSB7DQotICAgICAgY2FzZSBIQUxfUENEX1NPRl9DQl9JRDoNCi0gICAgICAgIGhwY2QtPlNPRkNhbGxiYWNrID0gcENhbGxiYWNrOw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfUENEX1NFVFVQU1RBR0VfQ0JfSUQ6DQotICAgICAgICBocGNkLT5TZXR1cFN0YWdlQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9QQ0RfUkVTRVRfQ0JfSUQ6DQotICAgICAgICBocGNkLT5SZXNldENhbGxiYWNrID0gcENhbGxiYWNrOw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfUENEX1NVU1BFTkRfQ0JfSUQ6DQotICAgICAgICBocGNkLT5TdXNwZW5kQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9QQ0RfUkVTVU1FX0NCX0lEOg0KLSAgICAgICAgaHBjZC0+UmVzdW1lQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9QQ0RfQ09OTkVDVF9DQl9JRDoNCi0gICAgICAgIGhwY2QtPkNvbm5lY3RDYWxsYmFjayA9IHBDYWxsYmFjazsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgSEFMX1BDRF9ESVNDT05ORUNUX0NCX0lEOg0KLSAgICAgICAgaHBjZC0+RGlzY29ubmVjdENhbGxiYWNrID0gcENhbGxiYWNrOw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfUENEX01TUElOSVRfQ0JfSUQ6DQotICAgICAgICBocGNkLT5Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9QQ0RfTVNQREVJTklUX0NCX0lEOg0KLSAgICAgICAgaHBjZC0+TXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBkZWZhdWx0Og0KLSAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovDQotICAgICAgICBocGNkLT5FcnJvckNvZGUgfD0gSEFMX1BDRF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOw0KLSAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLw0KLSAgICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOw0KLSAgICAgICAgYnJlYWs7DQotICAgIH0NCi0gIH0gZWxzZSBpZiAoaHBjZC0+U3RhdGUgPT0gSEFMX1BDRF9TVEFURV9SRVNFVCkgew0KLSAgICBzd2l0Y2ggKENhbGxiYWNrSUQpIHsNCi0gICAgICBjYXNlIEhBTF9QQ0RfTVNQSU5JVF9DQl9JRDoNCi0gICAgICAgIGhwY2QtPk1zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgSEFMX1BDRF9NU1BERUlOSVRfQ0JfSUQ6DQotICAgICAgICBocGNkLT5Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGRlZmF1bHQ6DQotICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8NCi0gICAgICAgIGhwY2QtPkVycm9yQ29kZSB8PSBIQUxfUENEX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7DQotICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovDQotICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7DQotICAgICAgICBicmVhazsNCi0gICAgfQ0KLSAgfSBlbHNlIHsNCi0gICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovDQotICAgIGhwY2QtPkVycm9yQ29kZSB8PSBIQUxfUENEX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7DQotICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8NCi0gICAgc3RhdHVzID0gSEFMX0VSUk9SOw0KLSAgfQ0KLQ0KLSAgLyogUmVsZWFzZSBMb2NrICovDQotICBfX0hBTF9VTkxPQ0soaHBjZCk7DQotICByZXR1cm4gc3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFVucmVnaXN0ZXIgYW4gVVNCIFBDRCBDYWxsYmFjaw0KLSAqICAgICAgICAgVVNCIFBDRCBjYWxsYWJjayBpcyByZWRpcmVjdGVkIHRvIHRoZSB3ZWFrIHByZWRlZmluZWQgY2FsbGJhY2sNCi0gKiBAcGFyYW0gIGhwY2QgVVNCIFBDRCBoYW5kbGUNCi0gKiBAcGFyYW0gIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHVucmVnaXN0ZXJlZA0KLSAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1BDRF9TT0ZfQ0JfSUQgVVNCIFBDRCBTT0YgY2FsbGJhY2sgSUQNCi0gKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1BDRF9TRVRVUFNUQUdFX0NCX0lEIFVTQiBQQ0QgU2V0dXAgY2FsbGJhY2sgSUQNCi0gKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1BDRF9SRVNFVF9DQl9JRCBVU0IgUENEIFJlc2V0IGNhbGxiYWNrIElEDQotICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9QQ0RfU1VTUEVORF9DQl9JRCBVU0IgUENEIFN1c3BlbmQgY2FsbGJhY2sgSUQNCi0gKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1BDRF9SRVNVTUVfQ0JfSUQgVVNCIFBDRCBSZXN1bWUgY2FsbGJhY2sgSUQNCi0gKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1BDRF9DT05ORUNUX0NCX0lEIFVTQiBQQ0QgQ29ubmVjdCBjYWxsYmFjayBJRA0KLSAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfUENEX0RJU0NPTk5FQ1RfQ0JfSUQgT1RHIFBDRCBEaXNjb25uZWN0IGNhbGxiYWNrIElEDQotICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9QQ0RfTVNQSU5JVF9DQl9JRCBNc3BEZUluaXQgY2FsbGJhY2sgSUQNCi0gKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1BDRF9NU1BERUlOSVRfQ0JfSUQgTXNwRGVJbml0IGNhbGxiYWNrIElEDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9VblJlZ2lzdGVyQ2FsbGJhY2soDQotICAgIFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCBIQUxfUENEX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpIHsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsNCi0NCi0gIC8qIFByb2Nlc3MgbG9ja2VkICovDQotICBfX0hBTF9MT0NLKGhwY2QpOw0KLQ0KLSAgLyogU2V0dXAgTGVnYWN5IHdlYWsgQ2FsbGJhY2tzICAqLw0KLSAgaWYgKGhwY2QtPlN0YXRlID09IEhBTF9QQ0RfU1RBVEVfUkVBRFkpIHsNCi0gICAgc3dpdGNoIChDYWxsYmFja0lEKSB7DQotICAgICAgY2FzZSBIQUxfUENEX1NPRl9DQl9JRDoNCi0gICAgICAgIGhwY2QtPlNPRkNhbGxiYWNrID0gSEFMX1BDRF9TT0ZDYWxsYmFjazsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgSEFMX1BDRF9TRVRVUFNUQUdFX0NCX0lEOg0KLSAgICAgICAgaHBjZC0+U2V0dXBTdGFnZUNhbGxiYWNrID0gSEFMX1BDRF9TZXR1cFN0YWdlQ2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9QQ0RfUkVTRVRfQ0JfSUQ6DQotICAgICAgICBocGNkLT5SZXNldENhbGxiYWNrID0gSEFMX1BDRF9SZXNldENhbGxiYWNrOw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfUENEX1NVU1BFTkRfQ0JfSUQ6DQotICAgICAgICBocGNkLT5TdXNwZW5kQ2FsbGJhY2sgPSBIQUxfUENEX1N1c3BlbmRDYWxsYmFjazsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgSEFMX1BDRF9SRVNVTUVfQ0JfSUQ6DQotICAgICAgICBocGNkLT5SZXN1bWVDYWxsYmFjayA9IEhBTF9QQ0RfUmVzdW1lQ2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9QQ0RfQ09OTkVDVF9DQl9JRDoNCi0gICAgICAgIGhwY2QtPkNvbm5lY3RDYWxsYmFjayA9IEhBTF9QQ0RfQ29ubmVjdENhbGxiYWNrOw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfUENEX0RJU0NPTk5FQ1RfQ0JfSUQ6DQotICAgICAgICBocGNkLT5EaXNjb25uZWN0Q2FsbGJhY2sgPSBIQUxfUENEX0Rpc2Nvbm5lY3RDYWxsYmFjazsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgSEFMX1BDRF9NU1BJTklUX0NCX0lEOg0KLSAgICAgICAgaHBjZC0+TXNwSW5pdENhbGxiYWNrID0gSEFMX1BDRF9Nc3BJbml0Ow0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfUENEX01TUERFSU5JVF9DQl9JRDoNCi0gICAgICAgIGhwY2QtPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX1BDRF9Nc3BEZUluaXQ7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBkZWZhdWx0Og0KLSAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovDQotICAgICAgICBocGNkLT5FcnJvckNvZGUgfD0gSEFMX1BDRF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOw0KLQ0KLSAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLw0KLSAgICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOw0KLSAgICAgICAgYnJlYWs7DQotICAgIH0NCi0gIH0gZWxzZSBpZiAoaHBjZC0+U3RhdGUgPT0gSEFMX1BDRF9TVEFURV9SRVNFVCkgew0KLSAgICBzd2l0Y2ggKENhbGxiYWNrSUQpIHsNCi0gICAgICBjYXNlIEhBTF9QQ0RfTVNQSU5JVF9DQl9JRDoNCi0gICAgICAgIGhwY2QtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9QQ0RfTXNwSW5pdDsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgSEFMX1BDRF9NU1BERUlOSVRfQ0JfSUQ6DQotICAgICAgICBocGNkLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9QQ0RfTXNwRGVJbml0Ow0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgZGVmYXVsdDoNCi0gICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLw0KLSAgICAgICAgaHBjZC0+RXJyb3JDb2RlIHw9IEhBTF9QQ0RfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsNCi0NCi0gICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8NCi0gICAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsNCi0gICAgICAgIGJyZWFrOw0KLSAgICB9DQotICB9IGVsc2Ugew0KLSAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8NCi0gICAgaHBjZC0+RXJyb3JDb2RlIHw9IEhBTF9QQ0RfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsNCi0NCi0gICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLw0KLSAgICBzdGF0dXMgPSBIQUxfRVJST1I7DQotICB9DQotDQotICAvKiBSZWxlYXNlIExvY2sgKi8NCi0gIF9fSEFMX1VOTE9DSyhocGNkKTsNCi0gIHJldHVybiBzdGF0dXM7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmVnaXN0ZXIgVVNCIFBDRCBEYXRhIE9VVCBTdGFnZSBDYWxsYmFjaw0KLSAqICAgICAgICAgVG8gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSB3ZWFrIEhBTF9QQ0RfRGF0YU91dFN0YWdlQ2FsbGJhY2soKQ0KLSAqIHByZWRlZmluZWQgY2FsbGJhY2sNCi0gKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQ0KLSAqIEBwYXJhbSAgcENhbGxiYWNrIHBvaW50ZXIgdG8gdGhlIFVTQiBQQ0QgRGF0YSBPVVQgU3RhZ2UgQ2FsbGJhY2sgZnVuY3Rpb24NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1JlZ2lzdGVyRGF0YU91dFN0YWdlQ2FsbGJhY2soDQotICAgIFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCBwUENEX0RhdGFPdXRTdGFnZUNhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spIHsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsNCi0NCi0gIGlmIChwQ2FsbGJhY2sgPT0gTlVMTCkgew0KLSAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8NCi0gICAgaHBjZC0+RXJyb3JDb2RlIHw9IEhBTF9QQ0RfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsNCi0NCi0gICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gIH0NCi0NCi0gIC8qIFByb2Nlc3MgbG9ja2VkICovDQotICBfX0hBTF9MT0NLKGhwY2QpOw0KLQ0KLSAgaWYgKGhwY2QtPlN0YXRlID09IEhBTF9QQ0RfU1RBVEVfUkVBRFkpIHsNCi0gICAgaHBjZC0+RGF0YU91dFN0YWdlQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7DQotICB9IGVsc2Ugew0KLSAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8NCi0gICAgaHBjZC0+RXJyb3JDb2RlIHw9IEhBTF9QQ0RfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsNCi0NCi0gICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLw0KLSAgICBzdGF0dXMgPSBIQUxfRVJST1I7DQotICB9DQotDQotICAvKiBSZWxlYXNlIExvY2sgKi8NCi0gIF9fSEFMX1VOTE9DSyhocGNkKTsNCi0NCi0gIHJldHVybiBzdGF0dXM7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgVW5yZWdpc3RlciB0aGUgVVNCIFBDRCBEYXRhIE9VVCBTdGFnZSBDYWxsYmFjaw0KLSAqICAgICAgICAgVVNCIFBDRCBEYXRhIE9VVCBTdGFnZSBDYWxsYmFjayBpcyByZWRpcmVjdGVkIHRvIHRoZSB3ZWFrDQotICogSEFMX1BDRF9EYXRhT3V0U3RhZ2VDYWxsYmFjaygpIHByZWRlZmluZWQgY2FsbGJhY2sNCi0gKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQ0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfVW5SZWdpc3RlckRhdGFPdXRTdGFnZUNhbGxiYWNrKA0KLSAgICBQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCkgew0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOw0KLQ0KLSAgLyogUHJvY2VzcyBsb2NrZWQgKi8NCi0gIF9fSEFMX0xPQ0soaHBjZCk7DQotDQotICBpZiAoaHBjZC0+U3RhdGUgPT0gSEFMX1BDRF9TVEFURV9SRUFEWSkgew0KLSAgICBocGNkLT5EYXRhT3V0U3RhZ2VDYWxsYmFjayA9DQotICAgICAgICBIQUxfUENEX0RhdGFPdXRTdGFnZUNhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBEYXRhT3V0U3RhZ2VDYWxsYmFjayAgKi8NCi0gIH0gZWxzZSB7DQotICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLw0KLSAgICBocGNkLT5FcnJvckNvZGUgfD0gSEFMX1BDRF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOw0KLQ0KLSAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovDQotICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsNCi0gIH0NCi0NCi0gIC8qIFJlbGVhc2UgTG9jayAqLw0KLSAgX19IQUxfVU5MT0NLKGhwY2QpOw0KLQ0KLSAgcmV0dXJuIHN0YXR1czsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBSZWdpc3RlciBVU0IgUENEIERhdGEgSU4gU3RhZ2UgQ2FsbGJhY2sNCi0gKiAgICAgICAgIFRvIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgd2VhayBIQUxfUENEX0RhdGFJblN0YWdlQ2FsbGJhY2soKQ0KLSAqIHByZWRlZmluZWQgY2FsbGJhY2sNCi0gKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQ0KLSAqIEBwYXJhbSAgcENhbGxiYWNrIHBvaW50ZXIgdG8gdGhlIFVTQiBQQ0QgRGF0YSBJTiBTdGFnZSBDYWxsYmFjayBmdW5jdGlvbg0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfUmVnaXN0ZXJEYXRhSW5TdGFnZUNhbGxiYWNrKA0KLSAgICBQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgcFBDRF9EYXRhSW5TdGFnZUNhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spIHsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsNCi0NCi0gIGlmIChwQ2FsbGJhY2sgPT0gTlVMTCkgew0KLSAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8NCi0gICAgaHBjZC0+RXJyb3JDb2RlIHw9IEhBTF9QQ0RfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsNCi0NCi0gICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gIH0NCi0NCi0gIC8qIFByb2Nlc3MgbG9ja2VkICovDQotICBfX0hBTF9MT0NLKGhwY2QpOw0KLQ0KLSAgaWYgKGhwY2QtPlN0YXRlID09IEhBTF9QQ0RfU1RBVEVfUkVBRFkpIHsNCi0gICAgaHBjZC0+RGF0YUluU3RhZ2VDYWxsYmFjayA9IHBDYWxsYmFjazsNCi0gIH0gZWxzZSB7DQotICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLw0KLSAgICBocGNkLT5FcnJvckNvZGUgfD0gSEFMX1BDRF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOw0KLQ0KLSAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovDQotICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsNCi0gIH0NCi0NCi0gIC8qIFJlbGVhc2UgTG9jayAqLw0KLSAgX19IQUxfVU5MT0NLKGhwY2QpOw0KLQ0KLSAgcmV0dXJuIHN0YXR1czsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBVbnJlZ2lzdGVyIHRoZSBVU0IgUENEIERhdGEgSU4gU3RhZ2UgQ2FsbGJhY2sNCi0gKiAgICAgICAgIFVTQiBQQ0QgRGF0YSBPVVQgU3RhZ2UgQ2FsbGJhY2sgaXMgcmVkaXJlY3RlZCB0byB0aGUgd2Vhaw0KLSAqIEhBTF9QQ0RfRGF0YUluU3RhZ2VDYWxsYmFjaygpIHByZWRlZmluZWQgY2FsbGJhY2sNCi0gKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQ0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfVW5SZWdpc3RlckRhdGFJblN0YWdlQ2FsbGJhY2soDQotICAgIFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKSB7DQotICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7DQotDQotICAvKiBQcm9jZXNzIGxvY2tlZCAqLw0KLSAgX19IQUxfTE9DSyhocGNkKTsNCi0NCi0gIGlmIChocGNkLT5TdGF0ZSA9PSBIQUxfUENEX1NUQVRFX1JFQURZKSB7DQotICAgIGhwY2QtPkRhdGFJblN0YWdlQ2FsbGJhY2sgPQ0KLSAgICAgICAgSEFMX1BDRF9EYXRhSW5TdGFnZUNhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBEYXRhSW5TdGFnZUNhbGxiYWNrICAqLw0KLSAgfSBlbHNlIHsNCi0gICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovDQotICAgIGhwY2QtPkVycm9yQ29kZSB8PSBIQUxfUENEX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7DQotDQotICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8NCi0gICAgc3RhdHVzID0gSEFMX0VSUk9SOw0KLSAgfQ0KLQ0KLSAgLyogUmVsZWFzZSBMb2NrICovDQotICBfX0hBTF9VTkxPQ0soaHBjZCk7DQotDQotICByZXR1cm4gc3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJlZ2lzdGVyIFVTQiBQQ0QgSXNvIE9VVCBpbmNvbXBsZXRlIENhbGxiYWNrDQotICogICAgICAgICBUbyBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHdlYWsgSEFMX1BDRF9JU09PVVRJbmNvbXBsZXRlQ2FsbGJhY2soKQ0KLSAqIHByZWRlZmluZWQgY2FsbGJhY2sNCi0gKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQ0KLSAqIEBwYXJhbSAgcENhbGxiYWNrIHBvaW50ZXIgdG8gdGhlIFVTQiBQQ0QgSXNvIE9VVCBpbmNvbXBsZXRlIENhbGxiYWNrIGZ1bmN0aW9uDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9SZWdpc3Rlcklzb091dEluY3BsdENhbGxiYWNrKA0KLSAgICBQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgcFBDRF9Jc29PdXRJbmNwbHRDYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKSB7DQotICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7DQotDQotICBpZiAocENhbGxiYWNrID09IE5VTEwpIHsNCi0gICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovDQotICAgIGhwY2QtPkVycm9yQ29kZSB8PSBIQUxfUENEX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7DQotDQotICAgIHJldHVybiBIQUxfRVJST1I7DQotICB9DQotDQotICAvKiBQcm9jZXNzIGxvY2tlZCAqLw0KLSAgX19IQUxfTE9DSyhocGNkKTsNCi0NCi0gIGlmIChocGNkLT5TdGF0ZSA9PSBIQUxfUENEX1NUQVRFX1JFQURZKSB7DQotICAgIGhwY2QtPklTT09VVEluY29tcGxldGVDYWxsYmFjayA9IHBDYWxsYmFjazsNCi0gIH0gZWxzZSB7DQotICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLw0KLSAgICBocGNkLT5FcnJvckNvZGUgfD0gSEFMX1BDRF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOw0KLQ0KLSAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovDQotICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsNCi0gIH0NCi0NCi0gIC8qIFJlbGVhc2UgTG9jayAqLw0KLSAgX19IQUxfVU5MT0NLKGhwY2QpOw0KLQ0KLSAgcmV0dXJuIHN0YXR1czsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBVbnJlZ2lzdGVyIHRoZSBVU0IgUENEIElzbyBPVVQgaW5jb21wbGV0ZSBDYWxsYmFjaw0KLSAqICAgICAgICAgVVNCIFBDRCBJc28gT1VUIGluY29tcGxldGUgQ2FsbGJhY2sgaXMgcmVkaXJlY3RlZA0KLSAqICAgICAgICAgdG8gdGhlIHdlYWsgSEFMX1BDRF9JU09PVVRJbmNvbXBsZXRlQ2FsbGJhY2soKSBwcmVkZWZpbmVkIGNhbGxiYWNrDQotICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1VuUmVnaXN0ZXJJc29PdXRJbmNwbHRDYWxsYmFjaygNCi0gICAgUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpIHsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsNCi0NCi0gIC8qIFByb2Nlc3MgbG9ja2VkICovDQotICBfX0hBTF9MT0NLKGhwY2QpOw0KLQ0KLSAgaWYgKGhwY2QtPlN0YXRlID09IEhBTF9QQ0RfU1RBVEVfUkVBRFkpIHsNCi0gICAgaHBjZC0+SVNPT1VUSW5jb21wbGV0ZUNhbGxiYWNrID0NCi0gICAgICAgIEhBTF9QQ0RfSVNPT1VUSW5jb21wbGV0ZUNhbGxiYWNrOyAvKiBMZWdhY3kgd2Vhaw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTT09VVEluY29tcGxldGVDYWxsYmFjayAgKi8NCi0gIH0gZWxzZSB7DQotICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLw0KLSAgICBocGNkLT5FcnJvckNvZGUgfD0gSEFMX1BDRF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOw0KLQ0KLSAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovDQotICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsNCi0gIH0NCi0NCi0gIC8qIFJlbGVhc2UgTG9jayAqLw0KLSAgX19IQUxfVU5MT0NLKGhwY2QpOw0KLQ0KLSAgcmV0dXJuIHN0YXR1czsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBSZWdpc3RlciBVU0IgUENEIElzbyBJTiBpbmNvbXBsZXRlIENhbGxiYWNrDQotICogICAgICAgICBUbyBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHdlYWsgSEFMX1BDRF9JU09JTkluY29tcGxldGVDYWxsYmFjaygpDQotICogcHJlZGVmaW5lZCBjYWxsYmFjaw0KLSAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlDQotICogQHBhcmFtICBwQ2FsbGJhY2sgcG9pbnRlciB0byB0aGUgVVNCIFBDRCBJc28gSU4gaW5jb21wbGV0ZSBDYWxsYmFjayBmdW5jdGlvbg0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfUmVnaXN0ZXJJc29JbkluY3BsdENhbGxiYWNrKA0KLSAgICBQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgcFBDRF9Jc29JbkluY3BsdENhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spIHsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsNCi0NCi0gIGlmIChwQ2FsbGJhY2sgPT0gTlVMTCkgew0KLSAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8NCi0gICAgaHBjZC0+RXJyb3JDb2RlIHw9IEhBTF9QQ0RfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsNCi0NCi0gICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gIH0NCi0NCi0gIC8qIFByb2Nlc3MgbG9ja2VkICovDQotICBfX0hBTF9MT0NLKGhwY2QpOw0KLQ0KLSAgaWYgKGhwY2QtPlN0YXRlID09IEhBTF9QQ0RfU1RBVEVfUkVBRFkpIHsNCi0gICAgaHBjZC0+SVNPSU5JbmNvbXBsZXRlQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7DQotICB9IGVsc2Ugew0KLSAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8NCi0gICAgaHBjZC0+RXJyb3JDb2RlIHw9IEhBTF9QQ0RfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsNCi0NCi0gICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLw0KLSAgICBzdGF0dXMgPSBIQUxfRVJST1I7DQotICB9DQotDQotICAvKiBSZWxlYXNlIExvY2sgKi8NCi0gIF9fSEFMX1VOTE9DSyhocGNkKTsNCi0NCi0gIHJldHVybiBzdGF0dXM7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgVW5yZWdpc3RlciB0aGUgVVNCIFBDRCBJc28gSU4gaW5jb21wbGV0ZSBDYWxsYmFjaw0KLSAqICAgICAgICAgVVNCIFBDRCBJc28gSU4gaW5jb21wbGV0ZSBDYWxsYmFjayBpcyByZWRpcmVjdGVkDQotICogICAgICAgICB0byB0aGUgd2VhayBIQUxfUENEX0lTT0lOSW5jb21wbGV0ZUNhbGxiYWNrKCkgcHJlZGVmaW5lZCBjYWxsYmFjaw0KLSAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9VblJlZ2lzdGVySXNvSW5JbmNwbHRDYWxsYmFjaygNCi0gICAgUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpIHsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsNCi0NCi0gIC8qIFByb2Nlc3MgbG9ja2VkICovDQotICBfX0hBTF9MT0NLKGhwY2QpOw0KLQ0KLSAgaWYgKGhwY2QtPlN0YXRlID09IEhBTF9QQ0RfU1RBVEVfUkVBRFkpIHsNCi0gICAgaHBjZC0+SVNPSU5JbmNvbXBsZXRlQ2FsbGJhY2sgPQ0KLSAgICAgICAgSEFMX1BDRF9JU09JTkluY29tcGxldGVDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgSVNPSU5JbmNvbXBsZXRlQ2FsbGJhY2sNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgfSBlbHNlIHsNCi0gICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovDQotICAgIGhwY2QtPkVycm9yQ29kZSB8PSBIQUxfUENEX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7DQotDQotICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8NCi0gICAgc3RhdHVzID0gSEFMX0VSUk9SOw0KLSAgfQ0KLQ0KLSAgLyogUmVsZWFzZSBMb2NrICovDQotICBfX0hBTF9VTkxPQ0soaHBjZCk7DQotDQotICByZXR1cm4gc3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJlZ2lzdGVyIFVTQiBQQ0QgQkNEIENhbGxiYWNrDQotICogICAgICAgICBUbyBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHdlYWsgSEFMX1BDREV4X0JDRF9DYWxsYmFjaygpIHByZWRlZmluZWQNCi0gKiBjYWxsYmFjaw0KLSAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlDQotICogQHBhcmFtICBwQ2FsbGJhY2sgcG9pbnRlciB0byB0aGUgVVNCIFBDRCBCQ0QgQ2FsbGJhY2sgZnVuY3Rpb24NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1JlZ2lzdGVyQmNkQ2FsbGJhY2soDQotICAgIFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCBwUENEX0JjZENhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spIHsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsNCi0NCi0gIGlmIChwQ2FsbGJhY2sgPT0gTlVMTCkgew0KLSAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8NCi0gICAgaHBjZC0+RXJyb3JDb2RlIHw9IEhBTF9QQ0RfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsNCi0NCi0gICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gIH0NCi0NCi0gIC8qIFByb2Nlc3MgbG9ja2VkICovDQotICBfX0hBTF9MT0NLKGhwY2QpOw0KLQ0KLSAgaWYgKGhwY2QtPlN0YXRlID09IEhBTF9QQ0RfU1RBVEVfUkVBRFkpIHsNCi0gICAgaHBjZC0+QkNEQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7DQotICB9IGVsc2Ugew0KLSAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8NCi0gICAgaHBjZC0+RXJyb3JDb2RlIHw9IEhBTF9QQ0RfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsNCi0NCi0gICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLw0KLSAgICBzdGF0dXMgPSBIQUxfRVJST1I7DQotICB9DQotDQotICAvKiBSZWxlYXNlIExvY2sgKi8NCi0gIF9fSEFMX1VOTE9DSyhocGNkKTsNCi0NCi0gIHJldHVybiBzdGF0dXM7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgVW5yZWdpc3RlciB0aGUgVVNCIFBDRCBCQ0QgQ2FsbGJhY2sNCi0gKiAgICAgICAgIFVTQiBCQ0QgQ2FsbGJhY2sgaXMgcmVkaXJlY3RlZCB0byB0aGUgd2VhayBIQUxfUENERXhfQkNEX0NhbGxiYWNrKCkNCi0gKiBwcmVkZWZpbmVkIGNhbGxiYWNrDQotICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1VuUmVnaXN0ZXJCY2RDYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCkgew0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOw0KLQ0KLSAgLyogUHJvY2VzcyBsb2NrZWQgKi8NCi0gIF9fSEFMX0xPQ0soaHBjZCk7DQotDQotICBpZiAoaHBjZC0+U3RhdGUgPT0gSEFMX1BDRF9TVEFURV9SRUFEWSkgew0KLSAgICBocGNkLT5CQ0RDYWxsYmFjayA9DQotICAgICAgICBIQUxfUENERXhfQkNEX0NhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBIQUxfUENERXhfQkNEX0NhbGxiYWNrICAqLw0KLSAgfSBlbHNlIHsNCi0gICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovDQotICAgIGhwY2QtPkVycm9yQ29kZSB8PSBIQUxfUENEX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7DQotDQotICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8NCi0gICAgc3RhdHVzID0gSEFMX0VSUk9SOw0KLSAgfQ0KLQ0KLSAgLyogUmVsZWFzZSBMb2NrICovDQotICBfX0hBTF9VTkxPQ0soaHBjZCk7DQotDQotICByZXR1cm4gc3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJlZ2lzdGVyIFVTQiBQQ0QgTFBNIENhbGxiYWNrDQotICogICAgICAgICBUbyBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHdlYWsgSEFMX1BDREV4X0xQTV9DYWxsYmFjaygpIHByZWRlZmluZWQNCi0gKiBjYWxsYmFjaw0KLSAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlDQotICogQHBhcmFtICBwQ2FsbGJhY2sgcG9pbnRlciB0byB0aGUgVVNCIFBDRCBMUE0gQ2FsbGJhY2sgZnVuY3Rpb24NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1JlZ2lzdGVyTHBtQ2FsbGJhY2soDQotICAgIFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCBwUENEX0xwbUNhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spIHsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsNCi0NCi0gIGlmIChwQ2FsbGJhY2sgPT0gTlVMTCkgew0KLSAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8NCi0gICAgaHBjZC0+RXJyb3JDb2RlIHw9IEhBTF9QQ0RfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsNCi0NCi0gICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gIH0NCi0NCi0gIC8qIFByb2Nlc3MgbG9ja2VkICovDQotICBfX0hBTF9MT0NLKGhwY2QpOw0KLQ0KLSAgaWYgKGhwY2QtPlN0YXRlID09IEhBTF9QQ0RfU1RBVEVfUkVBRFkpIHsNCi0gICAgaHBjZC0+TFBNQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7DQotICB9IGVsc2Ugew0KLSAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8NCi0gICAgaHBjZC0+RXJyb3JDb2RlIHw9IEhBTF9QQ0RfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsNCi0NCi0gICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLw0KLSAgICBzdGF0dXMgPSBIQUxfRVJST1I7DQotICB9DQotDQotICAvKiBSZWxlYXNlIExvY2sgKi8NCi0gIF9fSEFMX1VOTE9DSyhocGNkKTsNCi0NCi0gIHJldHVybiBzdGF0dXM7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgVW5yZWdpc3RlciB0aGUgVVNCIFBDRCBMUE0gQ2FsbGJhY2sNCi0gKiAgICAgICAgIFVTQiBMUE0gQ2FsbGJhY2sgaXMgcmVkaXJlY3RlZCB0byB0aGUgd2VhayBIQUxfUENERXhfTFBNX0NhbGxiYWNrKCkNCi0gKiBwcmVkZWZpbmVkIGNhbGxiYWNrDQotICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1VuUmVnaXN0ZXJMcG1DYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCkgew0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOw0KLQ0KLSAgLyogUHJvY2VzcyBsb2NrZWQgKi8NCi0gIF9fSEFMX0xPQ0soaHBjZCk7DQotDQotICBpZiAoaHBjZC0+U3RhdGUgPT0gSEFMX1BDRF9TVEFURV9SRUFEWSkgew0KLSAgICBocGNkLT5MUE1DYWxsYmFjayA9DQotICAgICAgICBIQUxfUENERXhfTFBNX0NhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBIQUxfUENERXhfTFBNX0NhbGxiYWNrICAqLw0KLSAgfSBlbHNlIHsNCi0gICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovDQotICAgIGhwY2QtPkVycm9yQ29kZSB8PSBIQUxfUENEX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7DQotDQotICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8NCi0gICAgc3RhdHVzID0gSEFMX0VSUk9SOw0KLSAgfQ0KLQ0KLSAgLyogUmVsZWFzZSBMb2NrICovDQotICBfX0hBTF9VTkxPQ0soaHBjZCk7DQotDQotICByZXR1cm4gc3RhdHVzOw0KLX0NCi0jZW5kaWYgLyogVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFBDRF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIElucHV0IGFuZCBPdXRwdXQgb3BlcmF0aW9uIGZ1bmN0aW9ucw0KLSAgKiAgQGJyaWVmICAgRGF0YSB0cmFuc2ZlcnMgZnVuY3Rpb25zDQotICAqDQotQHZlcmJhdGltDQotID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAjIyMjIw0KLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgIFsuLl0NCi0gICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBtYW5hZ2UgdGhlIFBDRCBkYXRhDQotICAgIHRyYW5zZmVycy4NCi0NCi1AZW5kdmVyYmF0aW0NCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICogQGJyaWVmICBTdGFydCB0aGUgVVNCIGRldmljZQ0KLSAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9TdGFydChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCkgew0KLSAgX19IQUxfTE9DSyhocGNkKTsNCi0gIF9fSEFMX1BDRF9FTkFCTEUoaHBjZCk7DQotICAodm9pZClVU0JfRGV2Q29ubmVjdChocGNkLT5JbnN0YW5jZSk7DQotICBfX0hBTF9VTkxPQ0soaHBjZCk7DQotDQotICByZXR1cm4gSEFMX09LOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFN0b3AgdGhlIFVTQiBkZXZpY2UuDQotICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1N0b3AoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpIHsNCi0gIF9fSEFMX0xPQ0soaHBjZCk7DQotICBfX0hBTF9QQ0RfRElTQUJMRShocGNkKTsNCi0gICh2b2lkKVVTQl9EZXZEaXNjb25uZWN0KGhwY2QtPkluc3RhbmNlKTsNCi0gIF9fSEFMX1VOTE9DSyhocGNkKTsNCi0NCi0gIHJldHVybiBIQUxfT0s7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIFBDRCBpbnRlcnJ1cHQgcmVxdWVzdC4NCi0gKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQ0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLXZvaWQgSEFMX1BDRF9JUlFIYW5kbGVyKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKSB7DQotICB1aW50MzJfdCB3SXN0ciA9IFVTQl9SZWFkSW50ZXJydXB0cyhocGNkLT5JbnN0YW5jZSk7DQotDQotICBpZiAoKHdJc3RyICYgVVNCX0lTVFJfQ1RSKSA9PSBVU0JfSVNUUl9DVFIpIHsNCi0gICAgLyogc2VydmljaW5nIG9mIHRoZSBlbmRwb2ludCBjb3JyZWN0IHRyYW5zZmVyIGludGVycnVwdCAqLw0KLSAgICAvKiBjbGVhciBvZiB0aGUgQ1RSIGZsYWcgaW50byB0aGUgc3ViICovDQotICAgICh2b2lkKVBDRF9FUF9JU1JfSGFuZGxlcihocGNkKTsNCi0NCi0gICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLSAgaWYgKCh3SXN0ciAmIFVTQl9JU1RSX1JFU0VUKSA9PSBVU0JfSVNUUl9SRVNFVCkgew0KLSAgICBfX0hBTF9QQ0RfQ0xFQVJfRkxBRyhocGNkLCBVU0JfSVNUUl9SRVNFVCk7DQotDQotI2lmIChVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpDQotICAgIGhwY2QtPlJlc2V0Q2FsbGJhY2soaHBjZCk7DQotI2Vsc2UNCi0gICAgSEFMX1BDRF9SZXNldENhbGxiYWNrKGhwY2QpOw0KLSNlbmRpZiAvKiBVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi0NCi0gICAgKHZvaWQpSEFMX1BDRF9TZXRBZGRyZXNzKGhwY2QsIDBVKTsNCi0NCi0gICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLSAgaWYgKCh3SXN0ciAmIFVTQl9JU1RSX1BNQU9WUikgPT0gVVNCX0lTVFJfUE1BT1ZSKSB7DQotICAgIF9fSEFMX1BDRF9DTEVBUl9GTEFHKGhwY2QsIFVTQl9JU1RSX1BNQU9WUik7DQotDQotICAgIHJldHVybjsNCi0gIH0NCi0NCi0gIGlmICgod0lzdHIgJiBVU0JfSVNUUl9FUlIpID09IFVTQl9JU1RSX0VSUikgew0KLSAgICBfX0hBTF9QQ0RfQ0xFQVJfRkxBRyhocGNkLCBVU0JfSVNUUl9FUlIpOw0KLQ0KLSAgICByZXR1cm47DQotICB9DQotDQotICBpZiAoKHdJc3RyICYgVVNCX0lTVFJfV0tVUCkgPT0gVVNCX0lTVFJfV0tVUCkgew0KLSAgICBocGNkLT5JbnN0YW5jZS0+Q05UUiAmPSAodWludDE2X3QpIH4oVVNCX0NOVFJfTFBNT0RFKTsNCi0gICAgaHBjZC0+SW5zdGFuY2UtPkNOVFIgJj0gKHVpbnQxNl90KSB+KFVTQl9DTlRSX0ZTVVNQKTsNCi0NCi0gICAgaWYgKGhwY2QtPkxQTV9TdGF0ZSA9PSBMUE1fTDEpIHsNCi0gICAgICBocGNkLT5MUE1fU3RhdGUgPSBMUE1fTDA7DQotI2lmIChVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpDQotICAgICAgaHBjZC0+TFBNQ2FsbGJhY2soaHBjZCwgUENEX0xQTV9MMF9BQ1RJVkUpOw0KLSNlbHNlDQotICAgICAgSEFMX1BDREV4X0xQTV9DYWxsYmFjayhocGNkLCBQQ0RfTFBNX0wwX0FDVElWRSk7DQotI2VuZGlmIC8qIFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLSAgICB9DQotDQotI2lmIChVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpDQotICAgIGhwY2QtPlJlc3VtZUNhbGxiYWNrKGhwY2QpOw0KLSNlbHNlDQotICAgIEhBTF9QQ0RfUmVzdW1lQ2FsbGJhY2soaHBjZCk7DQotI2VuZGlmIC8qIFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLQ0KLSAgICBfX0hBTF9QQ0RfQ0xFQVJfRkxBRyhocGNkLCBVU0JfSVNUUl9XS1VQKTsNCi0NCi0gICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLSAgaWYgKCh3SXN0ciAmIFVTQl9JU1RSX1NVU1ApID09IFVTQl9JU1RSX1NVU1ApIHsNCi0gICAgLyogRm9yY2UgbG93LXBvd2VyIG1vZGUgaW4gdGhlIG1hY3JvY2VsbCAqLw0KLSAgICBocGNkLT5JbnN0YW5jZS0+Q05UUiB8PSAodWludDE2X3QpVVNCX0NOVFJfRlNVU1A7DQotDQotICAgIC8qIGNsZWFyIG9mIHRoZSBJU1RSIGJpdCBtdXN0IGJlIGRvbmUgYWZ0ZXIgc2V0dGluZyBvZiBDTlRSX0ZTVVNQICovDQotICAgIF9fSEFMX1BDRF9DTEVBUl9GTEFHKGhwY2QsIFVTQl9JU1RSX1NVU1ApOw0KLQ0KLSAgICBocGNkLT5JbnN0YW5jZS0+Q05UUiB8PSAodWludDE2X3QpVVNCX0NOVFJfTFBNT0RFOw0KLQ0KLSNpZiAoVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQ0KLSAgICBocGNkLT5TdXNwZW5kQ2FsbGJhY2soaHBjZCk7DQotI2Vsc2UNCi0gICAgSEFMX1BDRF9TdXNwZW5kQ2FsbGJhY2soaHBjZCk7DQotI2VuZGlmIC8qIFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLQ0KLSAgICByZXR1cm47DQotICB9DQotDQotICAvKiBIYW5kbGUgTFBNIEludGVycnVwdCAqLw0KLSAgaWYgKCh3SXN0ciAmIFVTQl9JU1RSX0wxUkVRKSA9PSBVU0JfSVNUUl9MMVJFUSkgew0KLSAgICBfX0hBTF9QQ0RfQ0xFQVJfRkxBRyhocGNkLCBVU0JfSVNUUl9MMVJFUSk7DQotICAgIGlmIChocGNkLT5MUE1fU3RhdGUgPT0gTFBNX0wwKSB7DQotICAgICAgLyogRm9yY2Ugc3VzcGVuZCBhbmQgbG93LXBvd2VyIG1vZGUgYmVmb3JlIGdvaW5nIHRvIEwxIHN0YXRlKi8NCi0gICAgICBocGNkLT5JbnN0YW5jZS0+Q05UUiB8PSAodWludDE2X3QpVVNCX0NOVFJfTFBNT0RFOw0KLSAgICAgIGhwY2QtPkluc3RhbmNlLT5DTlRSIHw9ICh1aW50MTZfdClVU0JfQ05UUl9GU1VTUDsNCi0NCi0gICAgICBocGNkLT5MUE1fU3RhdGUgPSBMUE1fTDE7DQotICAgICAgaHBjZC0+QkVTTCA9ICgodWludDMyX3QpaHBjZC0+SW5zdGFuY2UtPkxQTUNTUiAmIFVTQl9MUE1DU1JfQkVTTCkgPj4gMjsNCi0jaWYgKFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkNCi0gICAgICBocGNkLT5MUE1DYWxsYmFjayhocGNkLCBQQ0RfTFBNX0wxX0FDVElWRSk7DQotI2Vsc2UNCi0gICAgICBIQUxfUENERXhfTFBNX0NhbGxiYWNrKGhwY2QsIFBDRF9MUE1fTDFfQUNUSVZFKTsNCi0jZW5kaWYgLyogVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotICAgIH0gZWxzZSB7DQotI2lmIChVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpDQotICAgICAgaHBjZC0+U3VzcGVuZENhbGxiYWNrKGhwY2QpOw0KLSNlbHNlDQotICAgICAgSEFMX1BDRF9TdXNwZW5kQ2FsbGJhY2soaHBjZCk7DQotI2VuZGlmIC8qIFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLSAgICB9DQotDQotICAgIHJldHVybjsNCi0gIH0NCi0NCi0gIGlmICgod0lzdHIgJiBVU0JfSVNUUl9TT0YpID09IFVTQl9JU1RSX1NPRikgew0KLSAgICBfX0hBTF9QQ0RfQ0xFQVJfRkxBRyhocGNkLCBVU0JfSVNUUl9TT0YpOw0KLQ0KLSNpZiAoVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQ0KLSAgICBocGNkLT5TT0ZDYWxsYmFjayhocGNkKTsNCi0jZWxzZQ0KLSAgICBIQUxfUENEX1NPRkNhbGxiYWNrKGhwY2QpOw0KLSNlbmRpZiAvKiBVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi0NCi0gICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLSAgaWYgKCh3SXN0ciAmIFVTQl9JU1RSX0VTT0YpID09IFVTQl9JU1RSX0VTT0YpIHsNCi0gICAgLyogY2xlYXIgRVNPRiBmbGFnIGluIElTVFIgKi8NCi0gICAgX19IQUxfUENEX0NMRUFSX0ZMQUcoaHBjZCwgVVNCX0lTVFJfRVNPRik7DQotDQotICAgIHJldHVybjsNCi0gIH0NCi19DQotDQotLyoqDQotICogQGJyaWVmICBEYXRhIE9VVCBzdGFnZSBjYWxsYmFjay4NCi0gKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQ0KLSAqIEBwYXJhbSAgZXBudW0gZW5kcG9pbnQgbnVtYmVyDQotICogQHJldHZhbCBOb25lDQotICovDQotX193ZWFrIHZvaWQgSEFMX1BDRF9EYXRhT3V0U3RhZ2VDYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZXBudW0pIHsNCi0gIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8NCi0gIFVOVVNFRChocGNkKTsNCi0gIFVOVVNFRChlcG51bSk7DQotDQotICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsDQotICAgICAgICAgICAgdGhlIEhBTF9QQ0RfRGF0YU91dFN0YWdlQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXINCi0gICAgIGZpbGUNCi0gICAqLw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERhdGEgSU4gc3RhZ2UgY2FsbGJhY2sNCi0gKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQ0KLSAqIEBwYXJhbSAgZXBudW0gZW5kcG9pbnQgbnVtYmVyDQotICogQHJldHZhbCBOb25lDQotICovDQotX193ZWFrIHZvaWQgSEFMX1BDRF9EYXRhSW5TdGFnZUNhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGVwbnVtKSB7DQotICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovDQotICBVTlVTRUQoaHBjZCk7DQotICBVTlVTRUQoZXBudW0pOw0KLQ0KLSAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLA0KLSAgICAgICAgICAgIHRoZSBIQUxfUENEX0RhdGFJblN0YWdlQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXINCi0gICAgIGZpbGUNCi0gICAqLw0KLX0NCi0vKioNCi0gKiBAYnJpZWYgIFNldHVwIHN0YWdlIGNhbGxiYWNrDQotICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX3dlYWsgdm9pZCBIQUxfUENEX1NldHVwU3RhZ2VDYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCkgew0KLSAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLw0KLSAgVU5VU0VEKGhwY2QpOw0KLQ0KLSAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLA0KLSAgICAgICAgICAgIHRoZSBIQUxfUENEX1NldHVwU3RhZ2VDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlDQotICAgKi8NCi19DQotDQotLyoqDQotICogQGJyaWVmICBVU0IgU3RhcnQgT2YgRnJhbWUgY2FsbGJhY2suDQotICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX3dlYWsgdm9pZCBIQUxfUENEX1NPRkNhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKSB7DQotICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovDQotICBVTlVTRUQoaHBjZCk7DQotDQotICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsDQotICAgICAgICAgICAgdGhlIEhBTF9QQ0RfU09GQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQ0KLSAgICovDQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgVVNCIFJlc2V0IGNhbGxiYWNrLg0KLSAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlDQotICogQHJldHZhbCBOb25lDQotICovDQotX193ZWFrIHZvaWQgSEFMX1BDRF9SZXNldENhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKSB7DQotICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovDQotICBVTlVTRUQoaHBjZCk7DQotDQotICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsDQotICAgICAgICAgICAgdGhlIEhBTF9QQ0RfUmVzZXRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlDQotICAgKi8NCi19DQotDQotLyoqDQotICogQGJyaWVmICBTdXNwZW5kIGV2ZW50IGNhbGxiYWNrLg0KLSAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlDQotICogQHJldHZhbCBOb25lDQotICovDQotX193ZWFrIHZvaWQgSEFMX1BDRF9TdXNwZW5kQ2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpIHsNCi0gIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8NCi0gIFVOVVNFRChocGNkKTsNCi0NCi0gIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwNCi0gICAgICAgICAgICB0aGUgSEFMX1BDRF9TdXNwZW5kQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQ0KLSAgICovDQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmVzdW1lIGV2ZW50IGNhbGxiYWNrLg0KLSAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlDQotICogQHJldHZhbCBOb25lDQotICovDQotX193ZWFrIHZvaWQgSEFMX1BDRF9SZXN1bWVDYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCkgew0KLSAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLw0KLSAgVU5VU0VEKGhwY2QpOw0KLQ0KLSAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLA0KLSAgICAgICAgICAgIHRoZSBIQUxfUENEX1Jlc3VtZUNhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUNCi0gICAqLw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEluY29tcGxldGUgSVNPIE9VVCBjYWxsYmFjay4NCi0gKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQ0KLSAqIEBwYXJhbSAgZXBudW0gZW5kcG9pbnQgbnVtYmVyDQotICogQHJldHZhbCBOb25lDQotICovDQotX193ZWFrIHZvaWQgSEFMX1BDRF9JU09PVVRJbmNvbXBsZXRlQ2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBlcG51bSkgew0KLSAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLw0KLSAgVU5VU0VEKGhwY2QpOw0KLSAgVU5VU0VEKGVwbnVtKTsNCi0NCi0gIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwNCi0gICAgICAgICAgICB0aGUgSEFMX1BDRF9JU09PVVRJbmNvbXBsZXRlQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlDQotICAgICB1c2VyIGZpbGUNCi0gICAqLw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEluY29tcGxldGUgSVNPIElOIGNhbGxiYWNrLg0KLSAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlDQotICogQHBhcmFtICBlcG51bSBlbmRwb2ludCBudW1iZXINCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX3dlYWsgdm9pZCBIQUxfUENEX0lTT0lOSW5jb21wbGV0ZUNhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBlcG51bSkgew0KLSAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLw0KLSAgVU5VU0VEKGhwY2QpOw0KLSAgVU5VU0VEKGVwbnVtKTsNCi0NCi0gIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwNCi0gICAgICAgICAgICB0aGUgSEFMX1BDRF9JU09JTkluY29tcGxldGVDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlcg0KLSAgICAgZmlsZQ0KLSAgICovDQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ29ubmVjdGlvbiBldmVudCBjYWxsYmFjay4NCi0gKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fd2VhayB2b2lkIEhBTF9QQ0RfQ29ubmVjdENhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKSB7DQotICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovDQotICBVTlVTRUQoaHBjZCk7DQotDQotICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsDQotICAgICAgICAgICAgdGhlIEhBTF9QQ0RfQ29ubmVjdENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUNCi0gICAqLw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2Nvbm5lY3Rpb24gZXZlbnQgY2FsbGJhY2suDQotICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX3dlYWsgdm9pZCBIQUxfUENEX0Rpc2Nvbm5lY3RDYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCkgew0KLSAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLw0KLSAgVU5VU0VEKGhwY2QpOw0KLQ0KLSAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLA0KLSAgICAgICAgICAgIHRoZSBIQUxfUENEX0Rpc2Nvbm5lY3RDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlDQotICAgKi8NCi19DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFBDRF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMNCi0gICogIEBicmllZiAgIG1hbmFnZW1lbnQgZnVuY3Rpb25zDQotICAqDQotQHZlcmJhdGltDQotID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgICAgICAgICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAjIyMjIw0KLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgIFsuLl0NCi0gICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBjb250cm9sIHRoZSBQQ0QgZGF0YQ0KLSAgICB0cmFuc2ZlcnMuDQotDQotQGVuZHZlcmJhdGltDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ29ubmVjdCB0aGUgVVNCIGRldmljZQ0KLSAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9EZXZDb25uZWN0KFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKSB7DQotICBfX0hBTF9MT0NLKGhwY2QpOw0KLSAgKHZvaWQpVVNCX0RldkNvbm5lY3QoaHBjZC0+SW5zdGFuY2UpOw0KLSAgX19IQUxfVU5MT0NLKGhwY2QpOw0KLQ0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNjb25uZWN0IHRoZSBVU0IgZGV2aWNlLg0KLSAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9EZXZEaXNjb25uZWN0KFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKSB7DQotICBfX0hBTF9MT0NLKGhwY2QpOw0KLSAgKHZvaWQpVVNCX0RldkRpc2Nvbm5lY3QoaHBjZC0+SW5zdGFuY2UpOw0KLSAgX19IQUxfVU5MT0NLKGhwY2QpOw0KLQ0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZXQgdGhlIFVTQiBEZXZpY2UgYWRkcmVzcy4NCi0gKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQ0KLSAqIEBwYXJhbSAgYWRkcmVzcyBuZXcgZGV2aWNlIGFkZHJlc3MNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1NldEFkZHJlc3MoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHVpbnQ4X3QgYWRkcmVzcykgew0KLSAgX19IQUxfTE9DSyhocGNkKTsNCi0gIGhwY2QtPlVTQl9BZGRyZXNzID0gYWRkcmVzczsNCi0gICh2b2lkKVVTQl9TZXREZXZBZGRyZXNzKGhwY2QtPkluc3RhbmNlLCBhZGRyZXNzKTsNCi0gIF9fSEFMX1VOTE9DSyhocGNkKTsNCi0NCi0gIHJldHVybiBIQUxfT0s7DQotfQ0KLS8qKg0KLSAqIEBicmllZiAgT3BlbiBhbmQgY29uZmlndXJlIGFuIGVuZHBvaW50Lg0KLSAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlDQotICogQHBhcmFtICBlcF9hZGRyIGVuZHBvaW50IGFkZHJlc3MNCi0gKiBAcGFyYW0gIGVwX21wcyBlbmRwb2ludCBtYXggcGFja2V0IHNpemUNCi0gKiBAcGFyYW0gIGVwX3R5cGUgZW5kcG9pbnQgdHlwZQ0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfRVBfT3BlbihQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDhfdCBlcF9hZGRyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBlcF9tcHMsIHVpbnQ4X3QgZXBfdHlwZSkgew0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgcmV0ID0gSEFMX09LOw0KLSAgUENEX0VQVHlwZURlZiAqZXA7DQotDQotICBpZiAoKGVwX2FkZHIgJiAweDgwVSkgPT0gMHg4MFUpIHsNCi0gICAgZXAgPSAmaHBjZC0+SU5fZXBbZXBfYWRkciAmIEVQX0FERFJfTVNLXTsNCi0gICAgZXAtPmlzX2luID0gMVU7DQotICB9IGVsc2Ugew0KLSAgICBlcCA9ICZocGNkLT5PVVRfZXBbZXBfYWRkciAmIEVQX0FERFJfTVNLXTsNCi0gICAgZXAtPmlzX2luID0gMFU7DQotICB9DQotDQotICBlcC0+bnVtID0gZXBfYWRkciAmIEVQX0FERFJfTVNLOw0KLSAgZXAtPm1heHBhY2tldCA9IGVwX21wczsNCi0gIGVwLT50eXBlID0gZXBfdHlwZTsNCi0NCi0gIGlmIChlcC0+aXNfaW4gIT0gMFUpIHsNCi0gICAgLyogQXNzaWduIGEgVHggRklGTyAqLw0KLSAgICBlcC0+dHhfZmlmb19udW0gPSBlcC0+bnVtOw0KLSAgfQ0KLSAgLyogU2V0IGluaXRpYWwgZGF0YSBQSUQuICovDQotICBpZiAoZXBfdHlwZSA9PSBFUF9UWVBFX0JVTEspIHsNCi0gICAgZXAtPmRhdGFfcGlkX3N0YXJ0ID0gMFU7DQotICB9DQotDQotICBfX0hBTF9MT0NLKGhwY2QpOw0KLSAgKHZvaWQpVVNCX0FjdGl2YXRlRW5kcG9pbnQoaHBjZC0+SW5zdGFuY2UsIGVwKTsNCi0gIF9fSEFMX1VOTE9DSyhocGNkKTsNCi0NCi0gIHJldHVybiByZXQ7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGVhY3RpdmF0ZSBhbiBlbmRwb2ludC4NCi0gKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQ0KLSAqIEBwYXJhbSAgZXBfYWRkciBlbmRwb2ludCBhZGRyZXNzDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9FUF9DbG9zZShQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDhfdCBlcF9hZGRyKSB7DQotICBQQ0RfRVBUeXBlRGVmICplcDsNCi0NCi0gIGlmICgoZXBfYWRkciAmIDB4ODBVKSA9PSAweDgwVSkgew0KLSAgICBlcCA9ICZocGNkLT5JTl9lcFtlcF9hZGRyICYgRVBfQUREUl9NU0tdOw0KLSAgICBlcC0+aXNfaW4gPSAxVTsNCi0gIH0gZWxzZSB7DQotICAgIGVwID0gJmhwY2QtPk9VVF9lcFtlcF9hZGRyICYgRVBfQUREUl9NU0tdOw0KLSAgICBlcC0+aXNfaW4gPSAwVTsNCi0gIH0NCi0gIGVwLT5udW0gPSBlcF9hZGRyICYgRVBfQUREUl9NU0s7DQotDQotICBfX0hBTF9MT0NLKGhwY2QpOw0KLSAgKHZvaWQpVVNCX0RlYWN0aXZhdGVFbmRwb2ludChocGNkLT5JbnN0YW5jZSwgZXApOw0KLSAgX19IQUxfVU5MT0NLKGhwY2QpOw0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhLg0KLSAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlDQotICogQHBhcmFtICBlcF9hZGRyIGVuZHBvaW50IGFkZHJlc3MNCi0gKiBAcGFyYW0gIHBCdWYgcG9pbnRlciB0byB0aGUgcmVjZXB0aW9uIGJ1ZmZlcg0KLSAqIEBwYXJhbSAgbGVuIGFtb3VudCBvZiBkYXRhIHRvIGJlIHJlY2VpdmVkDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9FUF9SZWNlaXZlKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCB1aW50OF90IGVwX2FkZHIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IGxlbikgew0KLSAgUENEX0VQVHlwZURlZiAqZXA7DQotDQotICBlcCA9ICZocGNkLT5PVVRfZXBbZXBfYWRkciAmIEVQX0FERFJfTVNLXTsNCi0NCi0gIC8qc2V0dXAgYW5kIHN0YXJ0IHRoZSBYZmVyICovDQotICBlcC0+eGZlcl9idWZmID0gcEJ1ZjsNCi0gIGVwLT54ZmVyX2xlbiA9IGxlbjsNCi0gIGVwLT54ZmVyX2NvdW50ID0gMFU7DQotICBlcC0+aXNfaW4gPSAwVTsNCi0gIGVwLT5udW0gPSBlcF9hZGRyICYgRVBfQUREUl9NU0s7DQotDQotICBpZiAoKGVwX2FkZHIgJiBFUF9BRERSX01TSykgPT0gMFUpIHsNCi0gICAgKHZvaWQpVVNCX0VQMFN0YXJ0WGZlcihocGNkLT5JbnN0YW5jZSwgZXApOw0KLSAgfSBlbHNlIHsNCi0gICAgKHZvaWQpVVNCX0VQU3RhcnRYZmVyKGhwY2QtPkluc3RhbmNlLCBlcCk7DQotICB9DQotDQotICByZXR1cm4gSEFMX09LOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdldCBSZWNlaXZlZCBEYXRhIFNpemUNCi0gKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQ0KLSAqIEBwYXJhbSAgZXBfYWRkciBlbmRwb2ludCBhZGRyZXNzDQotICogQHJldHZhbCBEYXRhIFNpemUNCi0gKi8NCi11aW50MzJfdCBIQUxfUENEX0VQX0dldFJ4Q291bnQoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHVpbnQ4X3QgZXBfYWRkcikgew0KLSAgcmV0dXJuIGhwY2QtPk9VVF9lcFtlcF9hZGRyICYgRVBfQUREUl9NU0tdLnhmZXJfY291bnQ7DQotfQ0KLS8qKg0KLSAqIEBicmllZiAgU2VuZCBhbiBhbW91bnQgb2YgZGF0YQ0KLSAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlDQotICogQHBhcmFtICBlcF9hZGRyIGVuZHBvaW50IGFkZHJlc3MNCi0gKiBAcGFyYW0gIHBCdWYgcG9pbnRlciB0byB0aGUgdHJhbnNtaXNzaW9uIGJ1ZmZlcg0KLSAqIEBwYXJhbSAgbGVuIGFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX0VQX1RyYW5zbWl0KFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCB1aW50OF90IGVwX2FkZHIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwQnVmLCB1aW50MzJfdCBsZW4pIHsNCi0gIFBDRF9FUFR5cGVEZWYgKmVwOw0KLQ0KLSAgZXAgPSAmaHBjZC0+SU5fZXBbZXBfYWRkciAmIEVQX0FERFJfTVNLXTsNCi0NCi0gIC8qc2V0dXAgYW5kIHN0YXJ0IHRoZSBYZmVyICovDQotICBlcC0+eGZlcl9idWZmID0gcEJ1ZjsNCi0gIGVwLT54ZmVyX2xlbiA9IGxlbjsNCi0gIGVwLT54ZmVyX2ZpbGxfZGIgPSAxVTsNCi0gIGVwLT54ZmVyX2xlbl9kYiA9IGxlbjsNCi0gIGVwLT54ZmVyX2NvdW50ID0gMFU7DQotICBlcC0+aXNfaW4gPSAxVTsNCi0gIGVwLT5udW0gPSBlcF9hZGRyICYgRVBfQUREUl9NU0s7DQotDQotICBpZiAoKGVwX2FkZHIgJiBFUF9BRERSX01TSykgPT0gMFUpIHsNCi0gICAgKHZvaWQpVVNCX0VQMFN0YXJ0WGZlcihocGNkLT5JbnN0YW5jZSwgZXApOw0KLSAgfSBlbHNlIHsNCi0gICAgKHZvaWQpVVNCX0VQU3RhcnRYZmVyKGhwY2QtPkluc3RhbmNlLCBlcCk7DQotICB9DQotDQotICByZXR1cm4gSEFMX09LOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCBhIFNUQUxMIGNvbmRpdGlvbiBvdmVyIGFuIGVuZHBvaW50DQotICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUNCi0gKiBAcGFyYW0gIGVwX2FkZHIgZW5kcG9pbnQgYWRkcmVzcw0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfRVBfU2V0U3RhbGwoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGVwX2FkZHIpIHsNCi0gIFBDRF9FUFR5cGVEZWYgKmVwOw0KLQ0KLSAgaWYgKCgodWludDMyX3QpZXBfYWRkciAmIEVQX0FERFJfTVNLKSA+IGhwY2QtPkluaXQuZGV2X2VuZHBvaW50cykgew0KLSAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgfQ0KLQ0KLSAgaWYgKCgweDgwVSAmIGVwX2FkZHIpID09IDB4ODBVKSB7DQotICAgIGVwID0gJmhwY2QtPklOX2VwW2VwX2FkZHIgJiBFUF9BRERSX01TS107DQotICAgIGVwLT5pc19pbiA9IDFVOw0KLSAgfSBlbHNlIHsNCi0gICAgZXAgPSAmaHBjZC0+T1VUX2VwW2VwX2FkZHJdOw0KLSAgICBlcC0+aXNfaW4gPSAwVTsNCi0gIH0NCi0NCi0gIGVwLT5pc19zdGFsbCA9IDFVOw0KLSAgZXAtPm51bSA9IGVwX2FkZHIgJiBFUF9BRERSX01TSzsNCi0NCi0gIF9fSEFMX0xPQ0soaHBjZCk7DQotDQotICAodm9pZClVU0JfRVBTZXRTdGFsbChocGNkLT5JbnN0YW5jZSwgZXApOw0KLQ0KLSAgX19IQUxfVU5MT0NLKGhwY2QpOw0KLQ0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDbGVhciBhIFNUQUxMIGNvbmRpdGlvbiBvdmVyIGluIGFuIGVuZHBvaW50DQotICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUNCi0gKiBAcGFyYW0gIGVwX2FkZHIgZW5kcG9pbnQgYWRkcmVzcw0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfRVBfQ2xyU3RhbGwoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGVwX2FkZHIpIHsNCi0gIFBDRF9FUFR5cGVEZWYgKmVwOw0KLQ0KLSAgaWYgKCgodWludDMyX3QpZXBfYWRkciAmIDB4MEZVKSA+IGhwY2QtPkluaXQuZGV2X2VuZHBvaW50cykgew0KLSAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgfQ0KLQ0KLSAgaWYgKCgweDgwVSAmIGVwX2FkZHIpID09IDB4ODBVKSB7DQotICAgIGVwID0gJmhwY2QtPklOX2VwW2VwX2FkZHIgJiBFUF9BRERSX01TS107DQotICAgIGVwLT5pc19pbiA9IDFVOw0KLSAgfSBlbHNlIHsNCi0gICAgZXAgPSAmaHBjZC0+T1VUX2VwW2VwX2FkZHIgJiBFUF9BRERSX01TS107DQotICAgIGVwLT5pc19pbiA9IDBVOw0KLSAgfQ0KLQ0KLSAgZXAtPmlzX3N0YWxsID0gMFU7DQotICBlcC0+bnVtID0gZXBfYWRkciAmIEVQX0FERFJfTVNLOw0KLQ0KLSAgX19IQUxfTE9DSyhocGNkKTsNCi0gICh2b2lkKVVTQl9FUENsZWFyU3RhbGwoaHBjZC0+SW5zdGFuY2UsIGVwKTsNCi0gIF9fSEFMX1VOTE9DSyhocGNkKTsNCi0NCi0gIHJldHVybiBIQUxfT0s7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRmx1c2ggYW4gZW5kcG9pbnQNCi0gKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQ0KLSAqIEBwYXJhbSAgZXBfYWRkciBlbmRwb2ludCBhZGRyZXNzDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9FUF9GbHVzaChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDhfdCBlcF9hZGRyKSB7DQotICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovDQotICBVTlVTRUQoaHBjZCk7DQotICBVTlVTRUQoZXBfYWRkcik7DQotDQotICByZXR1cm4gSEFMX09LOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEFjdGl2YXRlIHJlbW90ZSB3YWtldXAgc2lnbmFsbGluZw0KLSAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9BY3RpdmF0ZVJlbW90ZVdha2V1cChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCkgew0KLSAgcmV0dXJuIChVU0JfQWN0aXZhdGVSZW1vdGVXYWtldXAoaHBjZC0+SW5zdGFuY2UpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEZS1hY3RpdmF0ZSByZW1vdGUgd2FrZXVwIHNpZ25hbGxpbmcuDQotICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX0RlQWN0aXZhdGVSZW1vdGVXYWtldXAoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpIHsNCi0gIHJldHVybiAoVVNCX0RlQWN0aXZhdGVSZW1vdGVXYWtldXAoaHBjZC0+SW5zdGFuY2UpKTsNCi19DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFBDRF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA0IFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zDQotICAqICBAYnJpZWYgICBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucw0KLSAgKg0KLUB2ZXJiYXRpbQ0KLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zICMjIyMjDQotID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgWy4uXQ0KLSAgICBUaGlzIHN1YnNlY3Rpb24gcGVybWl0cyB0byBnZXQgaW4gcnVuLXRpbWUgdGhlIHN0YXR1cyBvZiB0aGUgcGVyaXBoZXJhbA0KLSAgICBhbmQgdGhlIGRhdGEgZmxvdy4NCi0NCi1AZW5kdmVyYmF0aW0NCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICogQGJyaWVmICBSZXR1cm4gdGhlIFBDRCBoYW5kbGUgc3RhdGUuDQotICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUNCi0gKiBAcmV0dmFsIEhBTCBzdGF0ZQ0KLSAqLw0KLVBDRF9TdGF0ZVR5cGVEZWYgSEFMX1BDRF9HZXRTdGF0ZShQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCkgew0KLSAgcmV0dXJuIGhwY2QtPlN0YXRlOw0KLX0NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGFkZHRvZ3JvdXAgUENEX1ByaXZhdGVfRnVuY3Rpb25zDQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBQQ0QgRW5kcG9pbnQgaW50ZXJydXB0IHJlcXVlc3QuDQotICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1zdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgUENEX0VQX0lTUl9IYW5kbGVyKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKSB7DQotICBQQ0RfRVBUeXBlRGVmICplcDsNCi0gIHVpbnQxNl90IGNvdW50Ow0KLSAgdWludDE2X3Qgd0lzdHI7DQotICB1aW50MTZfdCB3RVBWYWw7DQotICB1aW50MTZfdCBUeFBjdFNpemU7DQotICB1aW50OF90IGVwaW5kZXg7DQotDQotICAvKiBzdGF5IGluIGxvb3Agd2hpbGUgcGVuZGluZyBpbnRlcnJ1cHRzICovDQotICB3aGlsZSAoKGhwY2QtPkluc3RhbmNlLT5JU1RSICYgVVNCX0lTVFJfQ1RSKSAhPSAwVSkgew0KLSAgICB3SXN0ciA9IGhwY2QtPkluc3RhbmNlLT5JU1RSOw0KLQ0KLSAgICAvKiBleHRyYWN0IGhpZ2hlc3QgcHJpb3JpdHkgZW5kcG9pbnQgbnVtYmVyICovDQotICAgIGVwaW5kZXggPSAodWludDhfdCkod0lzdHIgJiBVU0JfSVNUUl9FUF9JRCk7DQotDQotICAgIGlmIChlcGluZGV4ID09IDBVKSB7DQotICAgICAgLyogRGVjb2RlIGFuZCBzZXJ2aWNlIGNvbnRyb2wgZW5kcG9pbnQgaW50ZXJydXB0ICovDQotDQotICAgICAgLyogRElSIGJpdCA9IG9yaWdpbiBvZiB0aGUgaW50ZXJydXB0ICovDQotICAgICAgaWYgKCh3SXN0ciAmIFVTQl9JU1RSX0RJUikgPT0gMFUpIHsNCi0gICAgICAgIC8qIERJUiA9IDAgKi8NCi0NCi0gICAgICAgIC8qIERJUiA9IDAgPT4gSU4gIGludCAqLw0KLSAgICAgICAgLyogRElSID0gMCBpbXBsaWVzIHRoYXQgKEVQX0NUUl9UWCA9IDEpIGFsd2F5cyAqLw0KLSAgICAgICAgUENEX0NMRUFSX1RYX0VQX0NUUihocGNkLT5JbnN0YW5jZSwgUENEX0VORFAwKTsNCi0gICAgICAgIGVwID0gJmhwY2QtPklOX2VwWzBdOw0KLQ0KLSAgICAgICAgZXAtPnhmZXJfY291bnQgPSBQQ0RfR0VUX0VQX1RYX0NOVChocGNkLT5JbnN0YW5jZSwgZXAtPm51bSk7DQotICAgICAgICBlcC0+eGZlcl9idWZmICs9IGVwLT54ZmVyX2NvdW50Ow0KLQ0KLSAgICAgICAgLyogVFggQ09NUExFVEUgKi8NCi0jaWYgKFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkNCi0gICAgICAgIGhwY2QtPkRhdGFJblN0YWdlQ2FsbGJhY2soaHBjZCwgMFUpOw0KLSNlbHNlDQotICAgICAgICBIQUxfUENEX0RhdGFJblN0YWdlQ2FsbGJhY2soaHBjZCwgMFUpOw0KLSNlbmRpZiAvKiBVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi0NCi0gICAgICAgIGlmICgoaHBjZC0+VVNCX0FkZHJlc3MgPiAwVSkgJiYgKGVwLT54ZmVyX2xlbiA9PSAwVSkpIHsNCi0gICAgICAgICAgaHBjZC0+SW5zdGFuY2UtPkRBRERSID0gKCh1aW50MTZfdClocGNkLT5VU0JfQWRkcmVzcyB8IFVTQl9EQUREUl9FRik7DQotICAgICAgICAgIGhwY2QtPlVTQl9BZGRyZXNzID0gMFU7DQotICAgICAgICB9DQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgIC8qIERJUiA9IDEgKi8NCi0NCi0gICAgICAgIC8qIERJUiA9IDEgJiBDVFJfUlggPT4gU0VUVVAgb3IgT1VUIGludCAqLw0KLSAgICAgICAgLyogRElSID0gMSAmIChDVFJfVFggfCBDVFJfUlgpID0+IDIgaW50IHBlbmRpbmcgKi8NCi0gICAgICAgIGVwID0gJmhwY2QtPk9VVF9lcFswXTsNCi0gICAgICAgIHdFUFZhbCA9IFBDRF9HRVRfRU5EUE9JTlQoaHBjZC0+SW5zdGFuY2UsIFBDRF9FTkRQMCk7DQotDQotICAgICAgICBpZiAoKHdFUFZhbCAmIFVTQl9FUF9TRVRVUCkgIT0gMFUpIHsNCi0gICAgICAgICAgLyogR2V0IFNFVFVQIFBhY2tldCAqLw0KLSAgICAgICAgICBlcC0+eGZlcl9jb3VudCA9IFBDRF9HRVRfRVBfUlhfQ05UKGhwY2QtPkluc3RhbmNlLCBlcC0+bnVtKTsNCi0NCi0gICAgICAgICAgVVNCX1JlYWRQTUEoaHBjZC0+SW5zdGFuY2UsICh1aW50OF90ICopaHBjZC0+U2V0dXAsIGVwLT5wbWFhZHJlc3MsDQotICAgICAgICAgICAgICAgICAgICAgICh1aW50MTZfdCllcC0+eGZlcl9jb3VudCk7DQotDQotICAgICAgICAgIC8qIFNFVFVQIGJpdCBrZXB0IGZyb3plbiB3aGlsZSBDVFJfUlggPSAxICovDQotICAgICAgICAgIFBDRF9DTEVBUl9SWF9FUF9DVFIoaHBjZC0+SW5zdGFuY2UsIFBDRF9FTkRQMCk7DQotDQotICAgICAgICAgIC8qIFByb2Nlc3MgU0VUVVAgUGFja2V0Ki8NCi0jaWYgKFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkNCi0gICAgICAgICAgaHBjZC0+U2V0dXBTdGFnZUNhbGxiYWNrKGhwY2QpOw0KLSNlbHNlDQotICAgICAgICAgIEhBTF9QQ0RfU2V0dXBTdGFnZUNhbGxiYWNrKGhwY2QpOw0KLSNlbmRpZiAvKiBVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi0gICAgICAgIH0gZWxzZSBpZiAoKHdFUFZhbCAmIFVTQl9FUF9DVFJfUlgpICE9IDBVKSB7DQotICAgICAgICAgIFBDRF9DTEVBUl9SWF9FUF9DVFIoaHBjZC0+SW5zdGFuY2UsIFBDRF9FTkRQMCk7DQotDQotICAgICAgICAgIC8qIEdldCBDb250cm9sIERhdGEgT1VUIFBhY2tldCAqLw0KLSAgICAgICAgICBlcC0+eGZlcl9jb3VudCA9IFBDRF9HRVRfRVBfUlhfQ05UKGhwY2QtPkluc3RhbmNlLCBlcC0+bnVtKTsNCi0NCi0gICAgICAgICAgaWYgKChlcC0+eGZlcl9jb3VudCAhPSAwVSkgJiYgKGVwLT54ZmVyX2J1ZmYgIT0gMFUpKSB7DQotICAgICAgICAgICAgVVNCX1JlYWRQTUEoaHBjZC0+SW5zdGFuY2UsIGVwLT54ZmVyX2J1ZmYsIGVwLT5wbWFhZHJlc3MsDQotICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQxNl90KWVwLT54ZmVyX2NvdW50KTsNCi0NCi0gICAgICAgICAgICBlcC0+eGZlcl9idWZmICs9IGVwLT54ZmVyX2NvdW50Ow0KLQ0KLSAgICAgICAgICAgIC8qIFByb2Nlc3MgQ29udHJvbCBEYXRhIE9VVCBQYWNrZXQgKi8NCi0jaWYgKFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkNCi0gICAgICAgICAgICBocGNkLT5EYXRhT3V0U3RhZ2VDYWxsYmFjayhocGNkLCAwVSk7DQotI2Vsc2UNCi0gICAgICAgICAgICBIQUxfUENEX0RhdGFPdXRTdGFnZUNhbGxiYWNrKGhwY2QsIDBVKTsNCi0jZW5kaWYgLyogVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgaWYgKChQQ0RfR0VUX0VORFBPSU5UKGhwY2QtPkluc3RhbmNlLCBQQ0RfRU5EUDApICYgVVNCX0VQX1NFVFVQKSA9PQ0KLSAgICAgICAgICAgICAgMFUpIHsNCi0gICAgICAgICAgICBQQ0RfU0VUX0VQX1JYX0NOVChocGNkLT5JbnN0YW5jZSwgUENEX0VORFAwLCBlcC0+bWF4cGFja2V0KTsNCi0gICAgICAgICAgICBQQ0RfU0VUX0VQX1JYX1NUQVRVUyhocGNkLT5JbnN0YW5jZSwgUENEX0VORFAwLCBVU0JfRVBfUlhfVkFMSUQpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgfQ0KLSAgICB9IGVsc2Ugew0KLSAgICAgIC8qIERlY29kZSBhbmQgc2VydmljZSBub24gY29udHJvbCBlbmRwb2ludHMgaW50ZXJydXB0ICovDQotICAgICAgLyogcHJvY2VzcyByZWxhdGVkIGVuZHBvaW50IHJlZ2lzdGVyICovDQotICAgICAgd0VQVmFsID0gUENEX0dFVF9FTkRQT0lOVChocGNkLT5JbnN0YW5jZSwgZXBpbmRleCk7DQotDQotICAgICAgaWYgKCh3RVBWYWwgJiBVU0JfRVBfQ1RSX1JYKSAhPSAwVSkgew0KLSAgICAgICAgLyogY2xlYXIgaW50IGZsYWcgKi8NCi0gICAgICAgIFBDRF9DTEVBUl9SWF9FUF9DVFIoaHBjZC0+SW5zdGFuY2UsIGVwaW5kZXgpOw0KLSAgICAgICAgZXAgPSAmaHBjZC0+T1VUX2VwW2VwaW5kZXhdOw0KLQ0KLSAgICAgICAgLyogT1VUIFNpbmdsZSBCdWZmZXJpbmcgKi8NCi0gICAgICAgIGlmIChlcC0+ZG91YmxlYnVmZmVyID09IDBVKSB7DQotICAgICAgICAgIGNvdW50ID0gKHVpbnQxNl90KVBDRF9HRVRfRVBfUlhfQ05UKGhwY2QtPkluc3RhbmNlLCBlcC0+bnVtKTsNCi0NCi0gICAgICAgICAgaWYgKGNvdW50ICE9IDBVKSB7DQotICAgICAgICAgICAgVVNCX1JlYWRQTUEoaHBjZC0+SW5zdGFuY2UsIGVwLT54ZmVyX2J1ZmYsIGVwLT5wbWFhZHJlc3MsIGNvdW50KTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSNpZiAoVVNFX1VTQl9ET1VCTEVfQlVGRkVSID09IDFVKQ0KLSAgICAgICAgZWxzZSB7DQotICAgICAgICAgIC8qIG1hbmFnZSBkb3VibGUgYnVmZmVyIGJ1bGsgb3V0ICovDQotICAgICAgICAgIGlmIChlcC0+dHlwZSA9PSBFUF9UWVBFX0JVTEspIHsNCi0gICAgICAgICAgICBjb3VudCA9IEhBTF9QQ0RfRVBfREJfUmVjZWl2ZShocGNkLCBlcCwgd0VQVmFsKTsNCi0gICAgICAgICAgfSBlbHNlIC8qIG1hbmFnZSBkb3VibGUgYnVmZmVyIGlzbyBvdXQgKi8NCi0gICAgICAgICAgew0KLSAgICAgICAgICAgIC8qIGZyZWUgRVAgT1VUIEJ1ZmZlciAqLw0KLSAgICAgICAgICAgIFBDRF9GUkVFX1VTRVJfQlVGRkVSKGhwY2QtPkluc3RhbmNlLCBlcC0+bnVtLCAwVSk7DQotDQotICAgICAgICAgICAgaWYgKChQQ0RfR0VUX0VORFBPSU5UKGhwY2QtPkluc3RhbmNlLCBlcC0+bnVtKSAmIFVTQl9FUF9EVE9HX1JYKSAhPQ0KLSAgICAgICAgICAgICAgICAwVSkgew0KLSAgICAgICAgICAgICAgLyogcmVhZCBmcm9tIGVuZHBvaW50IEJVRjBBZGRyIGJ1ZmZlciAqLw0KLSAgICAgICAgICAgICAgY291bnQgPSAodWludDE2X3QpUENEX0dFVF9FUF9EQlVGMF9DTlQoaHBjZC0+SW5zdGFuY2UsIGVwLT5udW0pOw0KLQ0KLSAgICAgICAgICAgICAgaWYgKGNvdW50ICE9IDBVKSB7DQotICAgICAgICAgICAgICAgIFVTQl9SZWFkUE1BKGhwY2QtPkluc3RhbmNlLCBlcC0+eGZlcl9idWZmLCBlcC0+cG1hYWRkcjAsIGNvdW50KTsNCi0gICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgLyogcmVhZCBmcm9tIGVuZHBvaW50IEJVRjFBZGRyIGJ1ZmZlciAqLw0KLSAgICAgICAgICAgICAgY291bnQgPSAodWludDE2X3QpUENEX0dFVF9FUF9EQlVGMV9DTlQoaHBjZC0+SW5zdGFuY2UsIGVwLT5udW0pOw0KLQ0KLSAgICAgICAgICAgICAgaWYgKGNvdW50ICE9IDBVKSB7DQotICAgICAgICAgICAgICAgIFVTQl9SZWFkUE1BKGhwY2QtPkluc3RhbmNlLCBlcC0+eGZlcl9idWZmLCBlcC0+cG1hYWRkcjEsIGNvdW50KTsNCi0gICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0jZW5kaWYgLyogKFVTRV9VU0JfRE9VQkxFX0JVRkZFUiA9PSAxVSkgKi8NCi0NCi0gICAgICAgIC8qIG11bHRpLXBhY2tldCBvbiB0aGUgTk9OIGNvbnRyb2wgT1VUIGVuZHBvaW50ICovDQotICAgICAgICBlcC0+eGZlcl9jb3VudCArPSBjb3VudDsNCi0gICAgICAgIGVwLT54ZmVyX2J1ZmYgKz0gY291bnQ7DQotDQotICAgICAgICBpZiAoKGVwLT54ZmVyX2xlbiA9PSAwVSkgfHwgKGNvdW50IDwgZXAtPm1heHBhY2tldCkpIHsNCi0gICAgICAgICAgLyogUlggQ09NUExFVEUgKi8NCi0jaWYgKFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkNCi0gICAgICAgICAgaHBjZC0+RGF0YU91dFN0YWdlQ2FsbGJhY2soaHBjZCwgZXAtPm51bSk7DQotI2Vsc2UNCi0gICAgICAgICAgSEFMX1BDRF9EYXRhT3V0U3RhZ2VDYWxsYmFjayhocGNkLCBlcC0+bnVtKTsNCi0jZW5kaWYgLyogVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAodm9pZClVU0JfRVBTdGFydFhmZXIoaHBjZC0+SW5zdGFuY2UsIGVwKTsNCi0gICAgICAgIH0NCi0gICAgICB9DQotDQotICAgICAgaWYgKCh3RVBWYWwgJiBVU0JfRVBfQ1RSX1RYKSAhPSAwVSkgew0KLSAgICAgICAgZXAgPSAmaHBjZC0+SU5fZXBbZXBpbmRleF07DQotDQotICAgICAgICAvKiBjbGVhciBpbnQgZmxhZyAqLw0KLSAgICAgICAgUENEX0NMRUFSX1RYX0VQX0NUUihocGNkLT5JbnN0YW5jZSwgZXBpbmRleCk7DQotDQotICAgICAgICBpZiAoZXAtPnR5cGUgIT0gRVBfVFlQRV9CVUxLKSB7DQotICAgICAgICAgIGVwLT54ZmVyX2xlbiA9IDBVOw0KLQ0KLSNpZiAoVVNFX1VTQl9ET1VCTEVfQlVGRkVSID09IDFVKQ0KLSAgICAgICAgICBpZiAoZXAtPmRvdWJsZWJ1ZmZlciAhPSAwVSkgew0KLSAgICAgICAgICAgIGlmICgod0VQVmFsICYgVVNCX0VQX0RUT0dfVFgpICE9IDBVKSB7DQotICAgICAgICAgICAgICBQQ0RfU0VUX0VQX0RCVUYwX0NOVChocGNkLT5JbnN0YW5jZSwgZXAtPm51bSwgZXAtPmlzX2luLCAwVSk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgIFBDRF9TRVRfRVBfREJVRjFfQ05UKGhwY2QtPkluc3RhbmNlLCBlcC0+bnVtLCBlcC0+aXNfaW4sIDBVKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgIH0NCi0jZW5kaWYgLyogKFVTRV9VU0JfRE9VQkxFX0JVRkZFUiA9PSAxVSkgKi8NCi0NCi0gICAgICAgICAgLyogVFggQ09NUExFVEUgKi8NCi0jaWYgKFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkNCi0gICAgICAgICAgaHBjZC0+RGF0YUluU3RhZ2VDYWxsYmFjayhocGNkLCBlcC0+bnVtKTsNCi0jZWxzZQ0KLSAgICAgICAgICBIQUxfUENEX0RhdGFJblN0YWdlQ2FsbGJhY2soaHBjZCwgZXAtPm51bSk7DQotI2VuZGlmIC8qIFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgLyogTWFuYWdlIEJ1bGsgU2luZ2xlIEJ1ZmZlciBUcmFuc2FjdGlvbiAqLw0KLSAgICAgICAgICBpZiAoKHdFUFZhbCAmIFVTQl9FUF9LSU5EKSA9PSAwVSkgew0KLSAgICAgICAgICAgIC8qIG11bHRpLXBhY2tldCBvbiB0aGUgTk9OIGNvbnRyb2wgSU4gZW5kcG9pbnQgKi8NCi0gICAgICAgICAgICBUeFBjdFNpemUgPSAodWludDE2X3QpUENEX0dFVF9FUF9UWF9DTlQoaHBjZC0+SW5zdGFuY2UsIGVwLT5udW0pOw0KLQ0KLSAgICAgICAgICAgIGlmIChlcC0+eGZlcl9sZW4gPiBUeFBjdFNpemUpIHsNCi0gICAgICAgICAgICAgIGVwLT54ZmVyX2xlbiAtPSBUeFBjdFNpemU7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgIGVwLT54ZmVyX2xlbiA9IDBVOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAvKiBaZXJvIExlbmd0aCBQYWNrZXQ/ICovDQotICAgICAgICAgICAgaWYgKGVwLT54ZmVyX2xlbiA9PSAwVSkgew0KLSAgICAgICAgICAgICAgLyogVFggQ09NUExFVEUgKi8NCi0jaWYgKFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkNCi0gICAgICAgICAgICAgIGhwY2QtPkRhdGFJblN0YWdlQ2FsbGJhY2soaHBjZCwgZXAtPm51bSk7DQotI2Vsc2UNCi0gICAgICAgICAgICAgIEhBTF9QQ0RfRGF0YUluU3RhZ2VDYWxsYmFjayhocGNkLCBlcC0+bnVtKTsNCi0jZW5kaWYgLyogVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgIC8qIFRyYW5zZmVyIGlzIG5vdCB5ZXQgRG9uZSAqLw0KLSAgICAgICAgICAgICAgZXAtPnhmZXJfYnVmZiArPSBUeFBjdFNpemU7DQotICAgICAgICAgICAgICBlcC0+eGZlcl9jb3VudCArPSBUeFBjdFNpemU7DQotICAgICAgICAgICAgICAodm9pZClVU0JfRVBTdGFydFhmZXIoaHBjZC0+SW5zdGFuY2UsIGVwKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgIH0NCi0jaWYgKFVTRV9VU0JfRE9VQkxFX0JVRkZFUiA9PSAxVSkNCi0gICAgICAgICAgLyogRG91YmxlIEJ1ZmZlciBidWxrIElOIChidWxrIHRyYW5zZmVyIExlbiA+IEVwX01wcykgKi8NCi0gICAgICAgICAgZWxzZSB7DQotICAgICAgICAgICAgKHZvaWQpSEFMX1BDRF9FUF9EQl9UcmFuc21pdChocGNkLCBlcCwgd0VQVmFsKTsNCi0gICAgICAgICAgfQ0KLSNlbmRpZiAvKiAoVVNFX1VTQl9ET1VCTEVfQlVGRkVSID09IDFVKSAqLw0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotI2lmIChVU0VfVVNCX0RPVUJMRV9CVUZGRVIgPT0gMVUpDQotLyoqDQotICogQGJyaWVmICBNYW5hZ2UgZG91YmxlIGJ1ZmZlciBidWxrIG91dCB0cmFuc2FjdGlvbiBmcm9tIElTUg0KLSAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlDQotICogQHBhcmFtICBlcCBjdXJyZW50IGVuZHBvaW50IGhhbmRsZQ0KLSAqIEBwYXJhbSAgd0VQVmFsIExhc3Qgc25hcHNob3Qgb2YgRVBSeCByZWdpc3RlciB2YWx1ZSB0YWtlbiBpbiBJU1INCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1zdGF0aWMgdWludDE2X3QgSEFMX1BDRF9FUF9EQl9SZWNlaXZlKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENEX0VQVHlwZURlZiAqZXAsIHVpbnQxNl90IHdFUFZhbCkgew0KLSAgdWludDE2X3QgY291bnQ7DQotDQotICAvKiBNYW5hZ2UgQnVmZmVyMCBPVVQgKi8NCi0gIGlmICgod0VQVmFsICYgVVNCX0VQX0RUT0dfUlgpICE9IDBVKSB7DQotICAgIC8qIEdldCBjb3VudCBvZiByZWNlaXZlZCBEYXRhIG9uIGJ1ZmZlcjAgKi8NCi0gICAgY291bnQgPSAodWludDE2X3QpUENEX0dFVF9FUF9EQlVGMF9DTlQoaHBjZC0+SW5zdGFuY2UsIGVwLT5udW0pOw0KLQ0KLSAgICBpZiAoZXAtPnhmZXJfbGVuID49IGNvdW50KSB7DQotICAgICAgZXAtPnhmZXJfbGVuIC09IGNvdW50Ow0KLSAgICB9IGVsc2Ugew0KLSAgICAgIGVwLT54ZmVyX2xlbiA9IDBVOw0KLSAgICB9DQotDQotICAgIGlmIChlcC0+eGZlcl9sZW4gPT0gMFUpIHsNCi0gICAgICAvKiBzZXQgTkFLIHRvIE9VVCBlbmRwb2ludCBzaW5jZSBkb3VibGUgYnVmZmVyIGlzIGVuYWJsZWQgKi8NCi0gICAgICBQQ0RfU0VUX0VQX1JYX1NUQVRVUyhocGNkLT5JbnN0YW5jZSwgZXAtPm51bSwgVVNCX0VQX1JYX05BSyk7DQotICAgIH0NCi0NCi0gICAgLyogQ2hlY2sgaWYgQnVmZmVyMSBpcyBpbiBibG9ja2VkIHN0YXRlIHdoaWNoIHJlcXVpcmVzIHRvIHRvZ2dsZSAqLw0KLSAgICBpZiAoKHdFUFZhbCAmIFVTQl9FUF9EVE9HX1RYKSAhPSAwVSkgew0KLSAgICAgIFBDRF9GUkVFX1VTRVJfQlVGRkVSKGhwY2QtPkluc3RhbmNlLCBlcC0+bnVtLCAwVSk7DQotICAgIH0NCi0NCi0gICAgaWYgKGNvdW50ICE9IDBVKSB7DQotICAgICAgVVNCX1JlYWRQTUEoaHBjZC0+SW5zdGFuY2UsIGVwLT54ZmVyX2J1ZmYsIGVwLT5wbWFhZGRyMCwgY291bnQpOw0KLSAgICB9DQotICB9DQotICAvKiBNYW5hZ2UgQnVmZmVyIDEgRFRPR19SWD0wICovDQotICBlbHNlIHsNCi0gICAgLyogR2V0IGNvdW50IG9mIHJlY2VpdmVkIGRhdGEgKi8NCi0gICAgY291bnQgPSAodWludDE2X3QpUENEX0dFVF9FUF9EQlVGMV9DTlQoaHBjZC0+SW5zdGFuY2UsIGVwLT5udW0pOw0KLQ0KLSAgICBpZiAoZXAtPnhmZXJfbGVuID49IGNvdW50KSB7DQotICAgICAgZXAtPnhmZXJfbGVuIC09IGNvdW50Ow0KLSAgICB9IGVsc2Ugew0KLSAgICAgIGVwLT54ZmVyX2xlbiA9IDBVOw0KLSAgICB9DQotDQotICAgIGlmIChlcC0+eGZlcl9sZW4gPT0gMFUpIHsNCi0gICAgICAvKiBzZXQgTkFLIG9uIHRoZSBjdXJyZW50IGVuZHBvaW50ICovDQotICAgICAgUENEX1NFVF9FUF9SWF9TVEFUVVMoaHBjZC0+SW5zdGFuY2UsIGVwLT5udW0sIFVTQl9FUF9SWF9OQUspOw0KLSAgICB9DQotDQotICAgIC8qTmVlZCB0byBGcmVlVXNlciBCdWZmZXIqLw0KLSAgICBpZiAoKHdFUFZhbCAmIFVTQl9FUF9EVE9HX1RYKSA9PSAwVSkgew0KLSAgICAgIFBDRF9GUkVFX1VTRVJfQlVGRkVSKGhwY2QtPkluc3RhbmNlLCBlcC0+bnVtLCAwVSk7DQotICAgIH0NCi0NCi0gICAgaWYgKGNvdW50ICE9IDBVKSB7DQotICAgICAgVVNCX1JlYWRQTUEoaHBjZC0+SW5zdGFuY2UsIGVwLT54ZmVyX2J1ZmYsIGVwLT5wbWFhZGRyMSwgY291bnQpOw0KLSAgICB9DQotICB9DQotDQotICByZXR1cm4gY291bnQ7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgTWFuYWdlIGRvdWJsZSBidWZmZXIgYnVsayBJTiB0cmFuc2FjdGlvbiBmcm9tIElTUg0KLSAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlDQotICogQHBhcmFtICBlcCBjdXJyZW50IGVuZHBvaW50IGhhbmRsZQ0KLSAqIEBwYXJhbSAgd0VQVmFsIExhc3Qgc25hcHNob3Qgb2YgRVBSeCByZWdpc3RlciB2YWx1ZSB0YWtlbiBpbiBJU1INCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1zdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9FUF9EQl9UcmFuc21pdChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0RfRVBUeXBlRGVmICplcCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB3RVBWYWwpIHsNCi0gIHVpbnQzMl90IGxlbjsNCi0gIHVpbnQxNl90IFR4UGN0U2l6ZTsNCi0NCi0gIC8qIERhdGEgQnVmZmVyMCBBQ0sgcmVjZWl2ZWQgKi8NCi0gIGlmICgod0VQVmFsICYgVVNCX0VQX0RUT0dfVFgpICE9IDBVKSB7DQotICAgIC8qIG11bHRpLXBhY2tldCBvbiB0aGUgTk9OIGNvbnRyb2wgSU4gZW5kcG9pbnQgKi8NCi0gICAgVHhQY3RTaXplID0gKHVpbnQxNl90KVBDRF9HRVRfRVBfREJVRjBfQ05UKGhwY2QtPkluc3RhbmNlLCBlcC0+bnVtKTsNCi0NCi0gICAgaWYgKGVwLT54ZmVyX2xlbiA+IFR4UGN0U2l6ZSkgew0KLSAgICAgIGVwLT54ZmVyX2xlbiAtPSBUeFBjdFNpemU7DQotICAgIH0gZWxzZSB7DQotICAgICAgZXAtPnhmZXJfbGVuID0gMFU7DQotICAgIH0NCi0NCi0gICAgLyogVHJhbnNmZXIgaXMgY29tcGxldGVkICovDQotICAgIGlmIChlcC0+eGZlcl9sZW4gPT0gMFUpIHsNCi0gICAgICBQQ0RfU0VUX0VQX0RCVUYwX0NOVChocGNkLT5JbnN0YW5jZSwgZXAtPm51bSwgZXAtPmlzX2luLCAwVSk7DQotICAgICAgUENEX1NFVF9FUF9EQlVGMV9DTlQoaHBjZC0+SW5zdGFuY2UsIGVwLT5udW0sIGVwLT5pc19pbiwgMFUpOw0KLQ0KLSAgICAgIC8qIFRYIENPTVBMRVRFICovDQotI2lmIChVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpDQotICAgICAgaHBjZC0+RGF0YUluU3RhZ2VDYWxsYmFjayhocGNkLCBlcC0+bnVtKTsNCi0jZWxzZQ0KLSAgICAgIEhBTF9QQ0RfRGF0YUluU3RhZ2VDYWxsYmFjayhocGNkLCBlcC0+bnVtKTsNCi0jZW5kaWYgLyogVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotDQotICAgICAgaWYgKCh3RVBWYWwgJiBVU0JfRVBfRFRPR19SWCkgIT0gMFUpIHsNCi0gICAgICAgIFBDRF9GUkVFX1VTRVJfQlVGRkVSKGhwY2QtPkluc3RhbmNlLCBlcC0+bnVtLCAxVSk7DQotICAgICAgfQ0KLSAgICB9IGVsc2UgLyogVHJhbnNmZXIgaXMgbm90IHlldCBEb25lICovDQotICAgIHsNCi0gICAgICAvKiBuZWVkIHRvIEZyZWUgVVNCIEJ1ZmYgKi8NCi0gICAgICBpZiAoKHdFUFZhbCAmIFVTQl9FUF9EVE9HX1JYKSAhPSAwVSkgew0KLSAgICAgICAgUENEX0ZSRUVfVVNFUl9CVUZGRVIoaHBjZC0+SW5zdGFuY2UsIGVwLT5udW0sIDFVKTsNCi0gICAgICB9DQotDQotICAgICAgLyogU3RpbGwgdGhlcmUgaXMgZGF0YSB0byBGaWxsIGluIHRoZSBuZXh0IEJ1ZmZlciAqLw0KLSAgICAgIGlmIChlcC0+eGZlcl9maWxsX2RiID09IDFVKSB7DQotICAgICAgICBlcC0+eGZlcl9idWZmICs9IFR4UGN0U2l6ZTsNCi0gICAgICAgIGVwLT54ZmVyX2NvdW50ICs9IFR4UGN0U2l6ZTsNCi0NCi0gICAgICAgIC8qIENhbGN1bGF0ZSB0aGUgbGVuIG9mIHRoZSBuZXcgYnVmZmVyIHRvIGZpbGwgKi8NCi0gICAgICAgIGlmIChlcC0+eGZlcl9sZW5fZGIgPj0gZXAtPm1heHBhY2tldCkgew0KLSAgICAgICAgICBsZW4gPSBlcC0+bWF4cGFja2V0Ow0KLSAgICAgICAgICBlcC0+eGZlcl9sZW5fZGIgLT0gbGVuOw0KLSAgICAgICAgfSBlbHNlIGlmIChlcC0+eGZlcl9sZW5fZGIgPT0gMFUpIHsNCi0gICAgICAgICAgbGVuID0gVHhQY3RTaXplOw0KLSAgICAgICAgICBlcC0+eGZlcl9maWxsX2RiID0gMFU7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICBlcC0+eGZlcl9maWxsX2RiID0gMFU7DQotICAgICAgICAgIGxlbiA9IGVwLT54ZmVyX2xlbl9kYjsNCi0gICAgICAgICAgZXAtPnhmZXJfbGVuX2RiID0gMFU7DQotICAgICAgICB9DQotDQotICAgICAgICAvKiBXcml0ZSByZW1haW5pbmcgRGF0YSB0byBCdWZmZXIgKi8NCi0gICAgICAgIC8qIFNldCB0aGUgRG91YmxlIGJ1ZmZlciBjb3VudGVyIGZvciBwbWEgYnVmZmVyMSAqLw0KLSAgICAgICAgUENEX1NFVF9FUF9EQlVGMF9DTlQoaHBjZC0+SW5zdGFuY2UsIGVwLT5udW0sIGVwLT5pc19pbiwgbGVuKTsNCi0NCi0gICAgICAgIC8qIENvcHkgdXNlciBidWZmZXIgdG8gVVNCIFBNQSAqLw0KLSAgICAgICAgVVNCX1dyaXRlUE1BKGhwY2QtPkluc3RhbmNlLCBlcC0+eGZlcl9idWZmLCBlcC0+cG1hYWRkcjAsDQotICAgICAgICAgICAgICAgICAgICAgKHVpbnQxNl90KWxlbik7DQotICAgICAgfQ0KLSAgICB9DQotICB9IGVsc2UgLyogRGF0YSBCdWZmZXIxIEFDSyByZWNlaXZlZCAqLw0KLSAgew0KLSAgICAvKiBtdWx0aS1wYWNrZXQgb24gdGhlIE5PTiBjb250cm9sIElOIGVuZHBvaW50ICovDQotICAgIFR4UGN0U2l6ZSA9ICh1aW50MTZfdClQQ0RfR0VUX0VQX0RCVUYxX0NOVChocGNkLT5JbnN0YW5jZSwgZXAtPm51bSk7DQotDQotICAgIGlmIChlcC0+eGZlcl9sZW4gPj0gVHhQY3RTaXplKSB7DQotICAgICAgZXAtPnhmZXJfbGVuIC09IFR4UGN0U2l6ZTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICBlcC0+eGZlcl9sZW4gPSAwVTsNCi0gICAgfQ0KLQ0KLSAgICAvKiBUcmFuc2ZlciBpcyBjb21wbGV0ZWQgKi8NCi0gICAgaWYgKGVwLT54ZmVyX2xlbiA9PSAwVSkgew0KLSAgICAgIFBDRF9TRVRfRVBfREJVRjBfQ05UKGhwY2QtPkluc3RhbmNlLCBlcC0+bnVtLCBlcC0+aXNfaW4sIDBVKTsNCi0gICAgICBQQ0RfU0VUX0VQX0RCVUYxX0NOVChocGNkLT5JbnN0YW5jZSwgZXAtPm51bSwgZXAtPmlzX2luLCAwVSk7DQotDQotICAgICAgLyogVFggQ09NUExFVEUgKi8NCi0jaWYgKFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkNCi0gICAgICBocGNkLT5EYXRhSW5TdGFnZUNhbGxiYWNrKGhwY2QsIGVwLT5udW0pOw0KLSNlbHNlDQotICAgICAgSEFMX1BDRF9EYXRhSW5TdGFnZUNhbGxiYWNrKGhwY2QsIGVwLT5udW0pOw0KLSNlbmRpZiAvKiBVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi0NCi0gICAgICAvKiBuZWVkIHRvIEZyZWUgVVNCIEJ1ZmYgKi8NCi0gICAgICBpZiAoKHdFUFZhbCAmIFVTQl9FUF9EVE9HX1JYKSA9PSAwVSkgew0KLSAgICAgICAgUENEX0ZSRUVfVVNFUl9CVUZGRVIoaHBjZC0+SW5zdGFuY2UsIGVwLT5udW0sIDFVKTsNCi0gICAgICB9DQotICAgIH0gZWxzZSAvKiBUcmFuc2ZlciBpcyBub3QgeWV0IERvbmUgKi8NCi0gICAgew0KLSAgICAgIC8qIG5lZWQgdG8gRnJlZSBVU0IgQnVmZiAqLw0KLSAgICAgIGlmICgod0VQVmFsICYgVVNCX0VQX0RUT0dfUlgpID09IDBVKSB7DQotICAgICAgICBQQ0RfRlJFRV9VU0VSX0JVRkZFUihocGNkLT5JbnN0YW5jZSwgZXAtPm51bSwgMVUpOw0KLSAgICAgIH0NCi0NCi0gICAgICAvKiBTdGlsbCB0aGVyZSBpcyBkYXRhIHRvIEZpbGwgaW4gdGhlIG5leHQgQnVmZmVyICovDQotICAgICAgaWYgKGVwLT54ZmVyX2ZpbGxfZGIgPT0gMVUpIHsNCi0gICAgICAgIGVwLT54ZmVyX2J1ZmYgKz0gVHhQY3RTaXplOw0KLSAgICAgICAgZXAtPnhmZXJfY291bnQgKz0gVHhQY3RTaXplOw0KLQ0KLSAgICAgICAgLyogQ2FsY3VsYXRlIHRoZSBsZW4gb2YgdGhlIG5ldyBidWZmZXIgdG8gZmlsbCAqLw0KLSAgICAgICAgaWYgKGVwLT54ZmVyX2xlbl9kYiA+PSBlcC0+bWF4cGFja2V0KSB7DQotICAgICAgICAgIGxlbiA9IGVwLT5tYXhwYWNrZXQ7DQotICAgICAgICAgIGVwLT54ZmVyX2xlbl9kYiAtPSBsZW47DQotICAgICAgICB9IGVsc2UgaWYgKGVwLT54ZmVyX2xlbl9kYiA9PSAwVSkgew0KLSAgICAgICAgICBsZW4gPSBUeFBjdFNpemU7DQotICAgICAgICAgIGVwLT54ZmVyX2ZpbGxfZGIgPSAwVTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgIGxlbiA9IGVwLT54ZmVyX2xlbl9kYjsNCi0gICAgICAgICAgZXAtPnhmZXJfbGVuX2RiID0gMFU7DQotICAgICAgICAgIGVwLT54ZmVyX2ZpbGxfZGIgPSAwOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyogU2V0IHRoZSBEb3VibGUgYnVmZmVyIGNvdW50ZXIgZm9yIHBtYWJ1ZmZlcjEgKi8NCi0gICAgICAgIFBDRF9TRVRfRVBfREJVRjFfQ05UKGhwY2QtPkluc3RhbmNlLCBlcC0+bnVtLCBlcC0+aXNfaW4sIGxlbik7DQotDQotICAgICAgICAvKiBDb3B5IHRoZSB1c2VyIGJ1ZmZlciB0byBVU0IgUE1BICovDQotICAgICAgICBVU0JfV3JpdGVQTUEoaHBjZC0+SW5zdGFuY2UsIGVwLT54ZmVyX2J1ZmYsIGVwLT5wbWFhZGRyMSwNCi0gICAgICAgICAgICAgICAgICAgICAodWludDE2X3QpbGVuKTsNCi0gICAgICB9DQotICAgIH0NCi0gIH0NCi0NCi0gIC8qZW5hYmxlIGVuZHBvaW50IElOKi8NCi0gIFBDRF9TRVRfRVBfVFhfU1RBVFVTKGhwY2QtPkluc3RhbmNlLCBlcC0+bnVtLCBVU0JfRVBfVFhfVkFMSUQpOw0KLQ0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotI2VuZGlmIC8qIChVU0VfVVNCX0RPVUJMRV9CVUZGRVIgPT0gMVUpICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0jZW5kaWYgLyogZGVmaW5lZCAoVVNCKSAqLw0KLSNlbmRpZiAvKiBIQUxfUENEX01PRFVMRV9FTkFCTEVEICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmc0eHhfaGFsX3BjZC5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBQQ0QgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgVVNCIFBlcmlwaGVyYWwgQ29udHJvbGxlcjoKKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucworICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGVybXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZQorICAqIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4KKyAgKiBJZiBubyBMSUNFTlNFIGZpbGUgY29tZXMgd2l0aCB0aGlzIHNvZnR3YXJlLCBpdCBpcyBwcm92aWRlZCBBUy1JUy4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgIFRoZSBQQ0QgSEFMIGRyaXZlciBjYW4gYmUgdXNlZCBhcyBmb2xsb3dzOgorCisgICAgICgjKSBEZWNsYXJlIGEgUENEX0hhbmRsZVR5cGVEZWYgaGFuZGxlIHN0cnVjdHVyZSwgZm9yIGV4YW1wbGU6CisgICAgICAgICBQQ0RfSGFuZGxlVHlwZURlZiAgaHBjZDsKKworICAgICAoIykgRmlsbCBwYXJhbWV0ZXJzIG9mIEluaXQgc3RydWN0dXJlIGluIEhDRCBoYW5kbGUKKworICAgICAoIykgQ2FsbCBIQUxfUENEX0luaXQoKSBBUEkgdG8gaW5pdGlhbGl6ZSB0aGUgUENEIHBlcmlwaGVyYWwgKENvcmUsIERldmljZQorICBjb3JlLCAuLi4pCisKKyAgICAgKCMpIEluaXRpYWxpemUgdGhlIFBDRCBsb3cgbGV2ZWwgcmVzb3VyY2VzIHRocm91Z2ggdGhlIEhBTF9QQ0RfTXNwSW5pdCgpCisgIEFQSToKKyAgICAgICAgICgjIykgRW5hYmxlIHRoZSBQQ0QvVVNCIExvdyBMZXZlbCBpbnRlcmZhY2UgY2xvY2sgdXNpbmcKKyAgICAgICAgICAgICAgKCsrKykgX19IQUxfUkNDX1VTQl9DTEtfRU5BQkxFKCk7IEZvciBVU0IgRGV2aWNlIEZTIHBlcmlwaGVyYWwKKworICAgICAgICAgKCMjKSBJbml0aWFsaXplIHRoZSByZWxhdGVkIEdQSU8gY2xvY2tzCisgICAgICAgICAoIyMpIENvbmZpZ3VyZSBQQ0QgcGluLW91dAorICAgICAgICAgKCMjKSBDb25maWd1cmUgUENEIE5WSUMgaW50ZXJydXB0CisKKyAgICAgKCMpQXNzb2NpYXRlIHRoZSBVcHBlciBVU0IgZGV2aWNlIHN0YWNrIHRvIHRoZSBIQUwgUENEIERyaXZlcjoKKyAgICAgICAgICgjIykgaHBjZC5wRGF0YSA9IHBkZXY7CisKKyAgICAgKCMpRW5hYmxlIFBDRCB0cmFuc21pc3Npb24gYW5kIHJlY2VwdGlvbjoKKyAgICAgICAgICgjIykgSEFMX1BDRF9TdGFydCgpOworCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmc0eHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkc0eHhfSEFMX0RyaXZlcgorICogQHsKKyAqLworCisvKiogQGRlZmdyb3VwIFBDRCBQQ0QKKyAqIEBicmllZiBQQ0QgSEFMIG1vZHVsZSBkcml2ZXIKKyAqIEB7CisgKi8KKworI2lmZGVmIEhBTF9QQ0RfTU9EVUxFX0VOQUJMRUQKKworI2lmIGRlZmluZWQoVVNCKQorCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBQQ0RfUHJpdmF0ZV9NYWNyb3MgUENEIFByaXZhdGUgTWFjcm9zCisgKiBAeworICovCisjZGVmaW5lIFBDRF9NSU4oYSwgYikgKCgoYSkgPCAoYikpID8gKGEpIDogKGIpKQorI2RlZmluZSBQQ0RfTUFYKGEsIGIpICgoKGEpID4gKGIpKSA/IChhKSA6IChiKSkKKy8qKgorICogQH0KKyAqLworCisvKiBQcml2YXRlIGZ1bmN0aW9ucyBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBQQ0RfUHJpdmF0ZV9GdW5jdGlvbnMgUENEIFByaXZhdGUgRnVuY3Rpb25zCisgKiBAeworICovCisKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBQQ0RfRVBfSVNSX0hhbmRsZXIoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOworI2lmIChVU0VfVVNCX0RPVUJMRV9CVUZGRVIgPT0gMVUpCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9FUF9EQl9UcmFuc21pdChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDRF9FUFR5cGVEZWYgKmVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgd0VQVmFsKTsKK3N0YXRpYyB1aW50MTZfdCBIQUxfUENEX0VQX0RCX1JlY2VpdmUoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDRF9FUFR5cGVEZWYgKmVwLCB1aW50MTZfdCB3RVBWYWwpOworI2VuZGlmIC8qIChVU0VfVVNCX0RPVUJMRV9CVUZGRVIgPT0gMVUpICovCisKKy8qKgorICogQH0KKyAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBQQ0RfRXhwb3J0ZWRfRnVuY3Rpb25zIFBDRCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAqIEB7CisgKi8KKworLyoqIEBkZWZncm91cCBQQ0RfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24KK2Z1bmN0aW9ucworICAqICBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBQQ0QgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQKKyAqICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgUENEX0luaXRUeXBlRGVmIGFuZCBpbml0aWFsaXplIHRoZSBhc3NvY2lhdGVkCisgKiBoYW5kbGUuCisgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfSW5pdChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCkgeworICB1aW50OF90IGk7CisKKyAgLyogQ2hlY2sgdGhlIFBDRCBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZiAoaHBjZCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19QQ0RfQUxMX0lOU1RBTkNFKGhwY2QtPkluc3RhbmNlKSk7CisKKyAgaWYgKGhwY2QtPlN0YXRlID09IEhBTF9QQ0RfU1RBVEVfUkVTRVQpIHsKKyAgICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovCisgICAgaHBjZC0+TG9jayA9IEhBTF9VTkxPQ0tFRDsKKworI2lmIChVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgaHBjZC0+U09GQ2FsbGJhY2sgPSBIQUxfUENEX1NPRkNhbGxiYWNrOworICAgIGhwY2QtPlNldHVwU3RhZ2VDYWxsYmFjayA9IEhBTF9QQ0RfU2V0dXBTdGFnZUNhbGxiYWNrOworICAgIGhwY2QtPlJlc2V0Q2FsbGJhY2sgPSBIQUxfUENEX1Jlc2V0Q2FsbGJhY2s7CisgICAgaHBjZC0+U3VzcGVuZENhbGxiYWNrID0gSEFMX1BDRF9TdXNwZW5kQ2FsbGJhY2s7CisgICAgaHBjZC0+UmVzdW1lQ2FsbGJhY2sgPSBIQUxfUENEX1Jlc3VtZUNhbGxiYWNrOworICAgIGhwY2QtPkNvbm5lY3RDYWxsYmFjayA9IEhBTF9QQ0RfQ29ubmVjdENhbGxiYWNrOworICAgIGhwY2QtPkRpc2Nvbm5lY3RDYWxsYmFjayA9IEhBTF9QQ0RfRGlzY29ubmVjdENhbGxiYWNrOworICAgIGhwY2QtPkRhdGFPdXRTdGFnZUNhbGxiYWNrID0gSEFMX1BDRF9EYXRhT3V0U3RhZ2VDYWxsYmFjazsKKyAgICBocGNkLT5EYXRhSW5TdGFnZUNhbGxiYWNrID0gSEFMX1BDRF9EYXRhSW5TdGFnZUNhbGxiYWNrOworICAgIGhwY2QtPklTT09VVEluY29tcGxldGVDYWxsYmFjayA9IEhBTF9QQ0RfSVNPT1VUSW5jb21wbGV0ZUNhbGxiYWNrOworICAgIGhwY2QtPklTT0lOSW5jb21wbGV0ZUNhbGxiYWNrID0gSEFMX1BDRF9JU09JTkluY29tcGxldGVDYWxsYmFjazsKKyAgICBocGNkLT5MUE1DYWxsYmFjayA9IEhBTF9QQ0RFeF9MUE1fQ2FsbGJhY2s7CisgICAgaHBjZC0+QkNEQ2FsbGJhY2sgPSBIQUxfUENERXhfQkNEX0NhbGxiYWNrOworCisgICAgaWYgKGhwY2QtPk1zcEluaXRDYWxsYmFjayA9PSBOVUxMKSB7CisgICAgICBocGNkLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfUENEX01zcEluaXQ7CisgICAgfQorCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgICAgaHBjZC0+TXNwSW5pdENhbGxiYWNrKGhwY2QpOworI2Vsc2UKKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgOiBHUElPLCBDTE9DSywgTlZJQy4uLiAqLworICAgIEhBTF9QQ0RfTXNwSW5pdChocGNkKTsKKyNlbmRpZiAvKiAoVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTKSAqLworICB9CisKKyAgaHBjZC0+U3RhdGUgPSBIQUxfUENEX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgSW50ZXJydXB0cyAqLworICBfX0hBTF9QQ0RfRElTQUJMRShocGNkKTsKKworICAvKiBJbml0IGVuZHBvaW50cyBzdHJ1Y3R1cmVzICovCisgIGZvciAoaSA9IDBVOyBpIDwgaHBjZC0+SW5pdC5kZXZfZW5kcG9pbnRzOyBpKyspIHsKKyAgICAvKiBJbml0IGVwIHN0cnVjdHVyZSAqLworICAgIGhwY2QtPklOX2VwW2ldLmlzX2luID0gMVU7CisgICAgaHBjZC0+SU5fZXBbaV0ubnVtID0gaTsKKyAgICAvKiBDb250cm9sIHVudGlsIGVwIGlzIGFjdGl2YXRlZCAqLworICAgIGhwY2QtPklOX2VwW2ldLnR5cGUgPSBFUF9UWVBFX0NUUkw7CisgICAgaHBjZC0+SU5fZXBbaV0ubWF4cGFja2V0ID0gMFU7CisgICAgaHBjZC0+SU5fZXBbaV0ueGZlcl9idWZmID0gMFU7CisgICAgaHBjZC0+SU5fZXBbaV0ueGZlcl9sZW4gPSAwVTsKKyAgfQorCisgIGZvciAoaSA9IDBVOyBpIDwgaHBjZC0+SW5pdC5kZXZfZW5kcG9pbnRzOyBpKyspIHsKKyAgICBocGNkLT5PVVRfZXBbaV0uaXNfaW4gPSAwVTsKKyAgICBocGNkLT5PVVRfZXBbaV0ubnVtID0gaTsKKyAgICAvKiBDb250cm9sIHVudGlsIGVwIGlzIGFjdGl2YXRlZCAqLworICAgIGhwY2QtPk9VVF9lcFtpXS50eXBlID0gRVBfVFlQRV9DVFJMOworICAgIGhwY2QtPk9VVF9lcFtpXS5tYXhwYWNrZXQgPSAwVTsKKyAgICBocGNkLT5PVVRfZXBbaV0ueGZlcl9idWZmID0gMFU7CisgICAgaHBjZC0+T1VUX2VwW2ldLnhmZXJfbGVuID0gMFU7CisgIH0KKworICAvKiBJbml0IERldmljZSAqLworICAodm9pZClVU0JfRGV2SW5pdChocGNkLT5JbnN0YW5jZSwgaHBjZC0+SW5pdCk7CisKKyAgaHBjZC0+VVNCX0FkZHJlc3MgPSAwVTsKKyAgaHBjZC0+U3RhdGUgPSBIQUxfUENEX1NUQVRFX1JFQURZOworCisgIC8qIEFjdGl2YXRlIExQTSAqLworICBpZiAoaHBjZC0+SW5pdC5scG1fZW5hYmxlID09IDFVKSB7CisgICAgKHZvaWQpSEFMX1BDREV4X0FjdGl2YXRlTFBNKGhwY2QpOworICB9CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZXMgdGhlIFBDRCBwZXJpcGhlcmFsLgorICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX0RlSW5pdChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCkgeworICAvKiBDaGVjayB0aGUgUENEIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmIChocGNkID09IE5VTEwpIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgaHBjZC0+U3RhdGUgPSBIQUxfUENEX1NUQVRFX0JVU1k7CisKKyAgLyogU3RvcCBEZXZpY2UgKi8KKyAgaWYgKFVTQl9TdG9wRGV2aWNlKGhwY2QtPkluc3RhbmNlKSAhPSBIQUxfT0spIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyNpZiAoVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICBpZiAoaHBjZC0+TXNwRGVJbml0Q2FsbGJhY2sgPT0gTlVMTCkgeworICAgIGhwY2QtPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX1BDRF9Nc3BEZUluaXQ7IC8qIExlZ2FjeSB3ZWFrIE1zcERlSW5pdCAgKi8KKyAgfQorCisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgIGhwY2QtPk1zcERlSW5pdENhbGxiYWNrKGhwY2QpOworI2Vsc2UKKyAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmU6IENMT0NLLCBOVklDLiovCisgIEhBTF9QQ0RfTXNwRGVJbml0KGhwY2QpOworI2VuZGlmIC8qIFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisgIGhwY2QtPlN0YXRlID0gSEFMX1BDRF9TVEFURV9SRVNFVDsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFBDRCBNU1AuCisgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICogQHJldHZhbCBOb25lCisgKi8KK19fd2VhayB2b2lkIEhBTF9QQ0RfTXNwSW5pdChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCkgeworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChocGNkKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1BDRF9Nc3BJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICogQGJyaWVmICBEZUluaXRpYWxpemVzIFBDRCBNU1AuCisgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICogQHJldHZhbCBOb25lCisgKi8KK19fd2VhayB2b2lkIEhBTF9QQ0RfTXNwRGVJbml0KFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKSB7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhwY2QpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfUENEX01zcERlSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisjaWYgKFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKy8qKgorICogQGJyaWVmICBSZWdpc3RlciBhIFVzZXIgVVNCIFBDRCBDYWxsYmFjaworICogICAgICAgICBUbyBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHdlYWsgcHJlZGVmaW5lZCBjYWxsYmFjaworICogQHBhcmFtICBocGNkIFVTQiBQQ0QgaGFuZGxlCisgKiBAcGFyYW0gIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHJlZ2lzdGVyZWQKKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfUENEX1NPRl9DQl9JRCBVU0IgUENEIFNPRiBjYWxsYmFjayBJRAorICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9QQ0RfU0VUVVBTVEFHRV9DQl9JRCBVU0IgUENEIFNldHVwIGNhbGxiYWNrIElECisgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1BDRF9SRVNFVF9DQl9JRCBVU0IgUENEIFJlc2V0IGNhbGxiYWNrIElECisgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1BDRF9TVVNQRU5EX0NCX0lEIFVTQiBQQ0QgU3VzcGVuZCBjYWxsYmFjayBJRAorICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9QQ0RfUkVTVU1FX0NCX0lEIFVTQiBQQ0QgUmVzdW1lIGNhbGxiYWNrIElECisgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1BDRF9DT05ORUNUX0NCX0lEIFVTQiBQQ0QgQ29ubmVjdCBjYWxsYmFjayBJRAorICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9QQ0RfRElTQ09OTkVDVF9DQl9JRCBVU0IgUENEIERpc2Nvbm5lY3QgY2FsbGJhY2sgSUQKKyAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfUENEX01TUElOSVRfQ0JfSUQgTXNwRGVJbml0IGNhbGxiYWNrIElECisgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1BDRF9NU1BERUlOSVRfQ0JfSUQgTXNwRGVJbml0IGNhbGxiYWNrIElECisgKiBAcGFyYW0gIHBDYWxsYmFjayBwb2ludGVyIHRvIHRoZSBDYWxsYmFjayBmdW5jdGlvbgorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfUmVnaXN0ZXJDYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfUENEX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBDRF9DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKSB7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBpZiAocENhbGxiYWNrID09IE5VTEwpIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBocGNkLT5FcnJvckNvZGUgfD0gSEFMX1BDRF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhocGNkKTsKKworICBpZiAoaHBjZC0+U3RhdGUgPT0gSEFMX1BDRF9TVEFURV9SRUFEWSkgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkgeworICAgICAgY2FzZSBIQUxfUENEX1NPRl9DQl9JRDoKKyAgICAgICAgaHBjZC0+U09GQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9QQ0RfU0VUVVBTVEFHRV9DQl9JRDoKKyAgICAgICAgaHBjZC0+U2V0dXBTdGFnZUNhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfUENEX1JFU0VUX0NCX0lEOgorICAgICAgICBocGNkLT5SZXNldENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfUENEX1NVU1BFTkRfQ0JfSUQ6CisgICAgICAgIGhwY2QtPlN1c3BlbmRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1BDRF9SRVNVTUVfQ0JfSUQ6CisgICAgICAgIGhwY2QtPlJlc3VtZUNhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfUENEX0NPTk5FQ1RfQ0JfSUQ6CisgICAgICAgIGhwY2QtPkNvbm5lY3RDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1BDRF9ESVNDT05ORUNUX0NCX0lEOgorICAgICAgICBocGNkLT5EaXNjb25uZWN0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9QQ0RfTVNQSU5JVF9DQl9JRDoKKyAgICAgICAgaHBjZC0+TXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfUENEX01TUERFSU5JVF9DQl9JRDoKKyAgICAgICAgaHBjZC0+TXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgaHBjZC0+RXJyb3JDb2RlIHw9IEhBTF9QQ0RfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfSBlbHNlIGlmIChocGNkLT5TdGF0ZSA9PSBIQUxfUENEX1NUQVRFX1JFU0VUKSB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKSB7CisgICAgICBjYXNlIEhBTF9QQ0RfTVNQSU5JVF9DQl9JRDoKKyAgICAgICAgaHBjZC0+TXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfUENEX01TUERFSU5JVF9DQl9JRDoKKyAgICAgICAgaHBjZC0+TXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgaHBjZC0+RXJyb3JDb2RlIHw9IEhBTF9QQ0RfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBocGNkLT5FcnJvckNvZGUgfD0gSEFMX1BDRF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhwY2QpOworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIEBicmllZiAgVW5yZWdpc3RlciBhbiBVU0IgUENEIENhbGxiYWNrCisgKiAgICAgICAgIFVTQiBQQ0QgY2FsbGJhY2sgaXMgcmVkaXJlY3RlZCB0byB0aGUgd2VhayBwcmVkZWZpbmVkIGNhbGxiYWNrCisgKiBAcGFyYW0gIGhwY2QgVVNCIFBDRCBoYW5kbGUKKyAqIEBwYXJhbSAgQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgdW5yZWdpc3RlcmVkCisgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1BDRF9TT0ZfQ0JfSUQgVVNCIFBDRCBTT0YgY2FsbGJhY2sgSUQKKyAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfUENEX1NFVFVQU1RBR0VfQ0JfSUQgVVNCIFBDRCBTZXR1cCBjYWxsYmFjayBJRAorICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9QQ0RfUkVTRVRfQ0JfSUQgVVNCIFBDRCBSZXNldCBjYWxsYmFjayBJRAorICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9QQ0RfU1VTUEVORF9DQl9JRCBVU0IgUENEIFN1c3BlbmQgY2FsbGJhY2sgSUQKKyAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfUENEX1JFU1VNRV9DQl9JRCBVU0IgUENEIFJlc3VtZSBjYWxsYmFjayBJRAorICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9QQ0RfQ09OTkVDVF9DQl9JRCBVU0IgUENEIENvbm5lY3QgY2FsbGJhY2sgSUQKKyAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfUENEX0RJU0NPTk5FQ1RfQ0JfSUQgVVNCIFBDRCBEaXNjb25uZWN0IGNhbGxiYWNrIElECisgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1BDRF9NU1BJTklUX0NCX0lEIE1zcERlSW5pdCBjYWxsYmFjayBJRAorICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9QQ0RfTVNQREVJTklUX0NCX0lEIE1zcERlSW5pdCBjYWxsYmFjayBJRAorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfVW5SZWdpc3RlckNhbGxiYWNrKAorICAgIFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCBIQUxfUENEX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpIHsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHBjZCk7CisKKyAgLyogU2V0dXAgTGVnYWN5IHdlYWsgQ2FsbGJhY2tzICAqLworICBpZiAoaHBjZC0+U3RhdGUgPT0gSEFMX1BDRF9TVEFURV9SRUFEWSkgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkgeworICAgICAgY2FzZSBIQUxfUENEX1NPRl9DQl9JRDoKKyAgICAgICAgaHBjZC0+U09GQ2FsbGJhY2sgPSBIQUxfUENEX1NPRkNhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfUENEX1NFVFVQU1RBR0VfQ0JfSUQ6CisgICAgICAgIGhwY2QtPlNldHVwU3RhZ2VDYWxsYmFjayA9IEhBTF9QQ0RfU2V0dXBTdGFnZUNhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfUENEX1JFU0VUX0NCX0lEOgorICAgICAgICBocGNkLT5SZXNldENhbGxiYWNrID0gSEFMX1BDRF9SZXNldENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfUENEX1NVU1BFTkRfQ0JfSUQ6CisgICAgICAgIGhwY2QtPlN1c3BlbmRDYWxsYmFjayA9IEhBTF9QQ0RfU3VzcGVuZENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfUENEX1JFU1VNRV9DQl9JRDoKKyAgICAgICAgaHBjZC0+UmVzdW1lQ2FsbGJhY2sgPSBIQUxfUENEX1Jlc3VtZUNhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfUENEX0NPTk5FQ1RfQ0JfSUQ6CisgICAgICAgIGhwY2QtPkNvbm5lY3RDYWxsYmFjayA9IEhBTF9QQ0RfQ29ubmVjdENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfUENEX0RJU0NPTk5FQ1RfQ0JfSUQ6CisgICAgICAgIGhwY2QtPkRpc2Nvbm5lY3RDYWxsYmFjayA9IEhBTF9QQ0RfRGlzY29ubmVjdENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfUENEX01TUElOSVRfQ0JfSUQ6CisgICAgICAgIGhwY2QtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9QQ0RfTXNwSW5pdDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1BDRF9NU1BERUlOSVRfQ0JfSUQ6CisgICAgICAgIGhwY2QtPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX1BDRF9Nc3BEZUluaXQ7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgaHBjZC0+RXJyb3JDb2RlIHw9IEhBTF9QQ0RfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9IGVsc2UgaWYgKGhwY2QtPlN0YXRlID09IEhBTF9QQ0RfU1RBVEVfUkVTRVQpIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpIHsKKyAgICAgIGNhc2UgSEFMX1BDRF9NU1BJTklUX0NCX0lEOgorICAgICAgICBocGNkLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfUENEX01zcEluaXQ7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9QQ0RfTVNQREVJTklUX0NCX0lEOgorICAgICAgICBocGNkLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9QQ0RfTXNwRGVJbml0OworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIGhwY2QtPkVycm9yQ29kZSB8PSBIQUxfUENEX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBocGNkLT5FcnJvckNvZGUgfD0gSEFMX1BDRF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHBjZCk7CisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogQGJyaWVmICBSZWdpc3RlciBVU0IgUENEIERhdGEgT1VUIFN0YWdlIENhbGxiYWNrCisgKiAgICAgICAgIFRvIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgd2VhayBIQUxfUENEX0RhdGFPdXRTdGFnZUNhbGxiYWNrKCkKKyAqIHByZWRlZmluZWQgY2FsbGJhY2sKKyAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgKiBAcGFyYW0gIHBDYWxsYmFjayBwb2ludGVyIHRvIHRoZSBVU0IgUENEIERhdGEgT1VUIFN0YWdlIENhbGxiYWNrIGZ1bmN0aW9uCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9SZWdpc3RlckRhdGFPdXRTdGFnZUNhbGxiYWNrKAorICAgIFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCBwUENEX0RhdGFPdXRTdGFnZUNhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spIHsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIGlmIChwQ2FsbGJhY2sgPT0gTlVMTCkgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGhwY2QtPkVycm9yQ29kZSB8PSBIQUxfUENEX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhocGNkKTsKKworICBpZiAoaHBjZC0+U3RhdGUgPT0gSEFMX1BDRF9TVEFURV9SRUFEWSkgeworICAgIGhwY2QtPkRhdGFPdXRTdGFnZUNhbGxiYWNrID0gcENhbGxiYWNrOworICB9IGVsc2UgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGhwY2QtPkVycm9yQ29kZSB8PSBIQUxfUENEX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhocGNkKTsKKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIEBicmllZiAgVW5yZWdpc3RlciB0aGUgVVNCIFBDRCBEYXRhIE9VVCBTdGFnZSBDYWxsYmFjaworICogICAgICAgICBVU0IgUENEIERhdGEgT1VUIFN0YWdlIENhbGxiYWNrIGlzIHJlZGlyZWN0ZWQgdG8gdGhlIHdlYWsKKyAqIEhBTF9QQ0RfRGF0YU91dFN0YWdlQ2FsbGJhY2soKSBwcmVkZWZpbmVkIGNhbGxiYWNrCisgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfVW5SZWdpc3RlckRhdGFPdXRTdGFnZUNhbGxiYWNrKAorICAgIFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKSB7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhwY2QpOworCisgIGlmIChocGNkLT5TdGF0ZSA9PSBIQUxfUENEX1NUQVRFX1JFQURZKSB7CisgICAgaHBjZC0+RGF0YU91dFN0YWdlQ2FsbGJhY2sgPQorICAgICAgICBIQUxfUENEX0RhdGFPdXRTdGFnZUNhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBEYXRhT3V0U3RhZ2VDYWxsYmFjayAgKi8KKyAgfSBlbHNlIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBocGNkLT5FcnJvckNvZGUgfD0gSEFMX1BDRF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHBjZCk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBAYnJpZWYgIFJlZ2lzdGVyIFVTQiBQQ0QgRGF0YSBJTiBTdGFnZSBDYWxsYmFjaworICogICAgICAgICBUbyBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHdlYWsgSEFMX1BDRF9EYXRhSW5TdGFnZUNhbGxiYWNrKCkKKyAqIHByZWRlZmluZWQgY2FsbGJhY2sKKyAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgKiBAcGFyYW0gIHBDYWxsYmFjayBwb2ludGVyIHRvIHRoZSBVU0IgUENEIERhdGEgSU4gU3RhZ2UgQ2FsbGJhY2sgZnVuY3Rpb24KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1JlZ2lzdGVyRGF0YUluU3RhZ2VDYWxsYmFjaygKKyAgICBQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgcFBDRF9EYXRhSW5TdGFnZUNhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spIHsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIGlmIChwQ2FsbGJhY2sgPT0gTlVMTCkgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGhwY2QtPkVycm9yQ29kZSB8PSBIQUxfUENEX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhocGNkKTsKKworICBpZiAoaHBjZC0+U3RhdGUgPT0gSEFMX1BDRF9TVEFURV9SRUFEWSkgeworICAgIGhwY2QtPkRhdGFJblN0YWdlQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgIH0gZWxzZSB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaHBjZC0+RXJyb3JDb2RlIHw9IEhBTF9QQ0RfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhwY2QpOworCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogQGJyaWVmICBVbnJlZ2lzdGVyIHRoZSBVU0IgUENEIERhdGEgSU4gU3RhZ2UgQ2FsbGJhY2sKKyAqICAgICAgICAgVVNCIFBDRCBEYXRhIE9VVCBTdGFnZSBDYWxsYmFjayBpcyByZWRpcmVjdGVkIHRvIHRoZSB3ZWFrCisgKiBIQUxfUENEX0RhdGFJblN0YWdlQ2FsbGJhY2soKSBwcmVkZWZpbmVkIGNhbGxiYWNrCisgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfVW5SZWdpc3RlckRhdGFJblN0YWdlQ2FsbGJhY2soCisgICAgUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpIHsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHBjZCk7CisKKyAgaWYgKGhwY2QtPlN0YXRlID09IEhBTF9QQ0RfU1RBVEVfUkVBRFkpIHsKKyAgICBocGNkLT5EYXRhSW5TdGFnZUNhbGxiYWNrID0KKyAgICAgICAgSEFMX1BDRF9EYXRhSW5TdGFnZUNhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBEYXRhSW5TdGFnZUNhbGxiYWNrICAqLworICB9IGVsc2UgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGhwY2QtPkVycm9yQ29kZSB8PSBIQUxfUENEX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhocGNkKTsKKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIEBicmllZiAgUmVnaXN0ZXIgVVNCIFBDRCBJc28gT1VUIGluY29tcGxldGUgQ2FsbGJhY2sKKyAqICAgICAgICAgVG8gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSB3ZWFrIEhBTF9QQ0RfSVNPT1VUSW5jb21wbGV0ZUNhbGxiYWNrKCkKKyAqIHByZWRlZmluZWQgY2FsbGJhY2sKKyAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgKiBAcGFyYW0gIHBDYWxsYmFjayBwb2ludGVyIHRvIHRoZSBVU0IgUENEIElzbyBPVVQgaW5jb21wbGV0ZSBDYWxsYmFjayBmdW5jdGlvbgorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfUmVnaXN0ZXJJc29PdXRJbmNwbHRDYWxsYmFjaygKKyAgICBQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgcFBDRF9Jc29PdXRJbmNwbHRDYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKSB7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBpZiAocENhbGxiYWNrID09IE5VTEwpIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBocGNkLT5FcnJvckNvZGUgfD0gSEFMX1BDRF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHBjZCk7CisKKyAgaWYgKGhwY2QtPlN0YXRlID09IEhBTF9QQ0RfU1RBVEVfUkVBRFkpIHsKKyAgICBocGNkLT5JU09PVVRJbmNvbXBsZXRlQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgIH0gZWxzZSB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaHBjZC0+RXJyb3JDb2RlIHw9IEhBTF9QQ0RfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhwY2QpOworCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogQGJyaWVmICBVbnJlZ2lzdGVyIHRoZSBVU0IgUENEIElzbyBPVVQgaW5jb21wbGV0ZSBDYWxsYmFjaworICogICAgICAgICBVU0IgUENEIElzbyBPVVQgaW5jb21wbGV0ZSBDYWxsYmFjayBpcyByZWRpcmVjdGVkCisgKiAgICAgICAgIHRvIHRoZSB3ZWFrIEhBTF9QQ0RfSVNPT1VUSW5jb21wbGV0ZUNhbGxiYWNrKCkgcHJlZGVmaW5lZCBjYWxsYmFjaworICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1VuUmVnaXN0ZXJJc29PdXRJbmNwbHRDYWxsYmFjaygKKyAgICBQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCkgeworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhocGNkKTsKKworICBpZiAoaHBjZC0+U3RhdGUgPT0gSEFMX1BDRF9TVEFURV9SRUFEWSkgeworICAgIGhwY2QtPklTT09VVEluY29tcGxldGVDYWxsYmFjayA9CisgICAgICAgIEhBTF9QQ0RfSVNPT1VUSW5jb21wbGV0ZUNhbGxiYWNrOyAvKiBMZWdhY3kgd2VhaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNPT1VUSW5jb21wbGV0ZUNhbGxiYWNrICAqLworICB9IGVsc2UgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGhwY2QtPkVycm9yQ29kZSB8PSBIQUxfUENEX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhocGNkKTsKKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIEBicmllZiAgUmVnaXN0ZXIgVVNCIFBDRCBJc28gSU4gaW5jb21wbGV0ZSBDYWxsYmFjaworICogICAgICAgICBUbyBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHdlYWsgSEFMX1BDRF9JU09JTkluY29tcGxldGVDYWxsYmFjaygpCisgKiBwcmVkZWZpbmVkIGNhbGxiYWNrCisgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICogQHBhcmFtICBwQ2FsbGJhY2sgcG9pbnRlciB0byB0aGUgVVNCIFBDRCBJc28gSU4gaW5jb21wbGV0ZSBDYWxsYmFjayBmdW5jdGlvbgorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfUmVnaXN0ZXJJc29JbkluY3BsdENhbGxiYWNrKAorICAgIFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCBwUENEX0lzb0luSW5jcGx0Q2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjaykgeworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgaWYgKHBDYWxsYmFjayA9PSBOVUxMKSB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaHBjZC0+RXJyb3JDb2RlIHw9IEhBTF9QQ0RfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhwY2QpOworCisgIGlmIChocGNkLT5TdGF0ZSA9PSBIQUxfUENEX1NUQVRFX1JFQURZKSB7CisgICAgaHBjZC0+SVNPSU5JbmNvbXBsZXRlQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgIH0gZWxzZSB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaHBjZC0+RXJyb3JDb2RlIHw9IEhBTF9QQ0RfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhwY2QpOworCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogQGJyaWVmICBVbnJlZ2lzdGVyIHRoZSBVU0IgUENEIElzbyBJTiBpbmNvbXBsZXRlIENhbGxiYWNrCisgKiAgICAgICAgIFVTQiBQQ0QgSXNvIElOIGluY29tcGxldGUgQ2FsbGJhY2sgaXMgcmVkaXJlY3RlZAorICogICAgICAgICB0byB0aGUgd2VhayBIQUxfUENEX0lTT0lOSW5jb21wbGV0ZUNhbGxiYWNrKCkgcHJlZGVmaW5lZCBjYWxsYmFjaworICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1VuUmVnaXN0ZXJJc29JbkluY3BsdENhbGxiYWNrKAorICAgIFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKSB7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhwY2QpOworCisgIGlmIChocGNkLT5TdGF0ZSA9PSBIQUxfUENEX1NUQVRFX1JFQURZKSB7CisgICAgaHBjZC0+SVNPSU5JbmNvbXBsZXRlQ2FsbGJhY2sgPQorICAgICAgICBIQUxfUENEX0lTT0lOSW5jb21wbGV0ZUNhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBJU09JTkluY29tcGxldGVDYWxsYmFjaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgfSBlbHNlIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBocGNkLT5FcnJvckNvZGUgfD0gSEFMX1BDRF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHBjZCk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBAYnJpZWYgIFJlZ2lzdGVyIFVTQiBQQ0QgQkNEIENhbGxiYWNrCisgKiAgICAgICAgIFRvIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgd2VhayBIQUxfUENERXhfQkNEX0NhbGxiYWNrKCkgcHJlZGVmaW5lZAorICogY2FsbGJhY2sKKyAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgKiBAcGFyYW0gIHBDYWxsYmFjayBwb2ludGVyIHRvIHRoZSBVU0IgUENEIEJDRCBDYWxsYmFjayBmdW5jdGlvbgorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfUmVnaXN0ZXJCY2RDYWxsYmFjaygKKyAgICBQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgcFBDRF9CY2RDYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKSB7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBpZiAocENhbGxiYWNrID09IE5VTEwpIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBocGNkLT5FcnJvckNvZGUgfD0gSEFMX1BDRF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHBjZCk7CisKKyAgaWYgKGhwY2QtPlN0YXRlID09IEhBTF9QQ0RfU1RBVEVfUkVBRFkpIHsKKyAgICBocGNkLT5CQ0RDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgfSBlbHNlIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBocGNkLT5FcnJvckNvZGUgfD0gSEFMX1BDRF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHBjZCk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBAYnJpZWYgIFVucmVnaXN0ZXIgdGhlIFVTQiBQQ0QgQkNEIENhbGxiYWNrCisgKiAgICAgICAgIFVTQiBCQ0QgQ2FsbGJhY2sgaXMgcmVkaXJlY3RlZCB0byB0aGUgd2VhayBIQUxfUENERXhfQkNEX0NhbGxiYWNrKCkKKyAqIHByZWRlZmluZWQgY2FsbGJhY2sKKyAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9VblJlZ2lzdGVyQmNkQ2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpIHsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHBjZCk7CisKKyAgaWYgKGhwY2QtPlN0YXRlID09IEhBTF9QQ0RfU1RBVEVfUkVBRFkpIHsKKyAgICBocGNkLT5CQ0RDYWxsYmFjayA9CisgICAgICAgIEhBTF9QQ0RFeF9CQ0RfQ2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIEhBTF9QQ0RFeF9CQ0RfQ2FsbGJhY2sgICovCisgIH0gZWxzZSB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaHBjZC0+RXJyb3JDb2RlIHw9IEhBTF9QQ0RfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhwY2QpOworCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogQGJyaWVmICBSZWdpc3RlciBVU0IgUENEIExQTSBDYWxsYmFjaworICogICAgICAgICBUbyBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHdlYWsgSEFMX1BDREV4X0xQTV9DYWxsYmFjaygpIHByZWRlZmluZWQKKyAqIGNhbGxiYWNrCisgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICogQHBhcmFtICBwQ2FsbGJhY2sgcG9pbnRlciB0byB0aGUgVVNCIFBDRCBMUE0gQ2FsbGJhY2sgZnVuY3Rpb24KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1JlZ2lzdGVyTHBtQ2FsbGJhY2soCisgICAgUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHBQQ0RfTHBtQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjaykgeworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgaWYgKHBDYWxsYmFjayA9PSBOVUxMKSB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaHBjZC0+RXJyb3JDb2RlIHw9IEhBTF9QQ0RfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhwY2QpOworCisgIGlmIChocGNkLT5TdGF0ZSA9PSBIQUxfUENEX1NUQVRFX1JFQURZKSB7CisgICAgaHBjZC0+TFBNQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgIH0gZWxzZSB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaHBjZC0+RXJyb3JDb2RlIHw9IEhBTF9QQ0RfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhwY2QpOworCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogQGJyaWVmICBVbnJlZ2lzdGVyIHRoZSBVU0IgUENEIExQTSBDYWxsYmFjaworICogICAgICAgICBVU0IgTFBNIENhbGxiYWNrIGlzIHJlZGlyZWN0ZWQgdG8gdGhlIHdlYWsgSEFMX1BDREV4X0xQTV9DYWxsYmFjaygpCisgKiBwcmVkZWZpbmVkIGNhbGxiYWNrCisgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfVW5SZWdpc3RlckxwbUNhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKSB7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhwY2QpOworCisgIGlmIChocGNkLT5TdGF0ZSA9PSBIQUxfUENEX1NUQVRFX1JFQURZKSB7CisgICAgaHBjZC0+TFBNQ2FsbGJhY2sgPQorICAgICAgICBIQUxfUENERXhfTFBNX0NhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBIQUxfUENERXhfTFBNX0NhbGxiYWNrICAqLworICB9IGVsc2UgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGhwY2QtPkVycm9yQ29kZSB8PSBIQUxfUENEX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhocGNkKTsKKworICByZXR1cm4gc3RhdHVzOworfQorI2VuZGlmIC8qIFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBQQ0RfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBJbnB1dCBhbmQgT3V0cHV0IG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKiAgQGJyaWVmICAgRGF0YSB0cmFuc2ZlcnMgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIG1hbmFnZSB0aGUgUENEIGRhdGEKKyAgICB0cmFuc2ZlcnMuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICogQGJyaWVmICBTdGFydCB0aGUgVVNCIGRldmljZQorICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1N0YXJ0KFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKSB7CisgIF9fSEFMX0xPQ0soaHBjZCk7CisgIF9fSEFMX1BDRF9FTkFCTEUoaHBjZCk7CisgICh2b2lkKVVTQl9EZXZDb25uZWN0KGhwY2QtPkluc3RhbmNlKTsKKyAgX19IQUxfVU5MT0NLKGhwY2QpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICogQGJyaWVmICBTdG9wIHRoZSBVU0IgZGV2aWNlLgorICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1N0b3AoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpIHsKKyAgX19IQUxfTE9DSyhocGNkKTsKKyAgX19IQUxfUENEX0RJU0FCTEUoaHBjZCk7CisgICh2b2lkKVVTQl9EZXZEaXNjb25uZWN0KGhwY2QtPkluc3RhbmNlKTsKKyAgX19IQUxfVU5MT0NLKGhwY2QpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgUENEIGludGVycnVwdCByZXF1ZXN0LgorICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCit2b2lkIEhBTF9QQ0RfSVJRSGFuZGxlcihQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCkgeworICB1aW50MzJfdCB3SXN0ciA9IFVTQl9SZWFkSW50ZXJydXB0cyhocGNkLT5JbnN0YW5jZSk7CisKKyAgaWYgKCh3SXN0ciAmIFVTQl9JU1RSX0NUUikgPT0gVVNCX0lTVFJfQ1RSKSB7CisgICAgLyogc2VydmljaW5nIG9mIHRoZSBlbmRwb2ludCBjb3JyZWN0IHRyYW5zZmVyIGludGVycnVwdCAqLworICAgIC8qIGNsZWFyIG9mIHRoZSBDVFIgZmxhZyBpbnRvIHRoZSBzdWIgKi8KKyAgICAodm9pZClQQ0RfRVBfSVNSX0hhbmRsZXIoaHBjZCk7CisKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoKHdJc3RyICYgVVNCX0lTVFJfUkVTRVQpID09IFVTQl9JU1RSX1JFU0VUKSB7CisgICAgX19IQUxfUENEX0NMRUFSX0ZMQUcoaHBjZCwgVVNCX0lTVFJfUkVTRVQpOworCisjaWYgKFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICBocGNkLT5SZXNldENhbGxiYWNrKGhwY2QpOworI2Vsc2UKKyAgICBIQUxfUENEX1Jlc2V0Q2FsbGJhY2soaHBjZCk7CisjZW5kaWYgLyogVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKyAgICAodm9pZClIQUxfUENEX1NldEFkZHJlc3MoaHBjZCwgMFUpOworCisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKCh3SXN0ciAmIFVTQl9JU1RSX1BNQU9WUikgPT0gVVNCX0lTVFJfUE1BT1ZSKSB7CisgICAgX19IQUxfUENEX0NMRUFSX0ZMQUcoaHBjZCwgVVNCX0lTVFJfUE1BT1ZSKTsKKworICAgIHJldHVybjsKKyAgfQorCisgIGlmICgod0lzdHIgJiBVU0JfSVNUUl9FUlIpID09IFVTQl9JU1RSX0VSUikgeworICAgIF9fSEFMX1BDRF9DTEVBUl9GTEFHKGhwY2QsIFVTQl9JU1RSX0VSUik7CisKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoKHdJc3RyICYgVVNCX0lTVFJfV0tVUCkgPT0gVVNCX0lTVFJfV0tVUCkgeworICAgIGhwY2QtPkluc3RhbmNlLT5DTlRSICY9ICh1aW50MTZfdCkgfihVU0JfQ05UUl9MUE1PREUpOworICAgIGhwY2QtPkluc3RhbmNlLT5DTlRSICY9ICh1aW50MTZfdCkgfihVU0JfQ05UUl9GU1VTUCk7CisKKyAgICBpZiAoaHBjZC0+TFBNX1N0YXRlID09IExQTV9MMSkgeworICAgICAgaHBjZC0+TFBNX1N0YXRlID0gTFBNX0wwOworI2lmIChVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgICBocGNkLT5MUE1DYWxsYmFjayhocGNkLCBQQ0RfTFBNX0wwX0FDVElWRSk7CisjZWxzZQorICAgICAgSEFMX1BDREV4X0xQTV9DYWxsYmFjayhocGNkLCBQQ0RfTFBNX0wwX0FDVElWRSk7CisjZW5kaWYgLyogVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgfQorCisjaWYgKFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICBocGNkLT5SZXN1bWVDYWxsYmFjayhocGNkKTsKKyNlbHNlCisgICAgSEFMX1BDRF9SZXN1bWVDYWxsYmFjayhocGNkKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworICAgIF9fSEFMX1BDRF9DTEVBUl9GTEFHKGhwY2QsIFVTQl9JU1RSX1dLVVApOworCisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKCh3SXN0ciAmIFVTQl9JU1RSX1NVU1ApID09IFVTQl9JU1RSX1NVU1ApIHsKKyAgICAvKiBGb3JjZSBsb3ctcG93ZXIgbW9kZSBpbiB0aGUgbWFjcm9jZWxsICovCisgICAgaHBjZC0+SW5zdGFuY2UtPkNOVFIgfD0gKHVpbnQxNl90KVVTQl9DTlRSX0ZTVVNQOworCisgICAgLyogY2xlYXIgb2YgdGhlIElTVFIgYml0IG11c3QgYmUgZG9uZSBhZnRlciBzZXR0aW5nIG9mIENOVFJfRlNVU1AgKi8KKyAgICBfX0hBTF9QQ0RfQ0xFQVJfRkxBRyhocGNkLCBVU0JfSVNUUl9TVVNQKTsKKworICAgIGhwY2QtPkluc3RhbmNlLT5DTlRSIHw9ICh1aW50MTZfdClVU0JfQ05UUl9MUE1PREU7CisKKyNpZiAoVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgIGhwY2QtPlN1c3BlbmRDYWxsYmFjayhocGNkKTsKKyNlbHNlCisgICAgSEFMX1BDRF9TdXNwZW5kQ2FsbGJhY2soaHBjZCk7CisjZW5kaWYgLyogVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKyAgICByZXR1cm47CisgIH0KKworICAvKiBIYW5kbGUgTFBNIEludGVycnVwdCAqLworICBpZiAoKHdJc3RyICYgVVNCX0lTVFJfTDFSRVEpID09IFVTQl9JU1RSX0wxUkVRKSB7CisgICAgX19IQUxfUENEX0NMRUFSX0ZMQUcoaHBjZCwgVVNCX0lTVFJfTDFSRVEpOworICAgIGlmIChocGNkLT5MUE1fU3RhdGUgPT0gTFBNX0wwKSB7CisgICAgICAvKiBGb3JjZSBzdXNwZW5kIGFuZCBsb3ctcG93ZXIgbW9kZSBiZWZvcmUgZ29pbmcgdG8gTDEgc3RhdGUqLworICAgICAgaHBjZC0+SW5zdGFuY2UtPkNOVFIgfD0gKHVpbnQxNl90KVVTQl9DTlRSX0xQTU9ERTsKKyAgICAgIGhwY2QtPkluc3RhbmNlLT5DTlRSIHw9ICh1aW50MTZfdClVU0JfQ05UUl9GU1VTUDsKKworICAgICAgaHBjZC0+TFBNX1N0YXRlID0gTFBNX0wxOworICAgICAgaHBjZC0+QkVTTCA9ICgodWludDMyX3QpaHBjZC0+SW5zdGFuY2UtPkxQTUNTUiAmIFVTQl9MUE1DU1JfQkVTTCkgPj4gMjsKKyNpZiAoVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgICAgaHBjZC0+TFBNQ2FsbGJhY2soaHBjZCwgUENEX0xQTV9MMV9BQ1RJVkUpOworI2Vsc2UKKyAgICAgIEhBTF9QQ0RFeF9MUE1fQ2FsbGJhY2soaHBjZCwgUENEX0xQTV9MMV9BQ1RJVkUpOworI2VuZGlmIC8qIFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0gZWxzZSB7CisjaWYgKFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICAgIGhwY2QtPlN1c3BlbmRDYWxsYmFjayhocGNkKTsKKyNlbHNlCisgICAgICBIQUxfUENEX1N1c3BlbmRDYWxsYmFjayhocGNkKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoKHdJc3RyICYgVVNCX0lTVFJfU09GKSA9PSBVU0JfSVNUUl9TT0YpIHsKKyAgICBfX0hBTF9QQ0RfQ0xFQVJfRkxBRyhocGNkLCBVU0JfSVNUUl9TT0YpOworCisjaWYgKFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICBocGNkLT5TT0ZDYWxsYmFjayhocGNkKTsKKyNlbHNlCisgICAgSEFMX1BDRF9TT0ZDYWxsYmFjayhocGNkKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworICAgIHJldHVybjsKKyAgfQorCisgIGlmICgod0lzdHIgJiBVU0JfSVNUUl9FU09GKSA9PSBVU0JfSVNUUl9FU09GKSB7CisgICAgLyogY2xlYXIgRVNPRiBmbGFnIGluIElTVFIgKi8KKyAgICBfX0hBTF9QQ0RfQ0xFQVJfRkxBRyhocGNkLCBVU0JfSVNUUl9FU09GKTsKKworICAgIHJldHVybjsKKyAgfQorfQorCisvKioKKyAqIEBicmllZiAgRGF0YSBPVVQgc3RhZ2UgY2FsbGJhY2suCisgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICogQHBhcmFtICBlcG51bSBlbmRwb2ludCBudW1iZXIKKyAqIEByZXR2YWwgTm9uZQorICovCitfX3dlYWsgdm9pZCBIQUxfUENEX0RhdGFPdXRTdGFnZUNhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGVwbnVtKSB7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhwY2QpOworICBVTlVTRUQoZXBudW0pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfUENEX0RhdGFPdXRTdGFnZUNhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyCisgICAgIGZpbGUKKyAgICovCit9CisKKy8qKgorICogQGJyaWVmICBEYXRhIElOIHN0YWdlIGNhbGxiYWNrCisgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICogQHBhcmFtICBlcG51bSBlbmRwb2ludCBudW1iZXIKKyAqIEByZXR2YWwgTm9uZQorICovCitfX3dlYWsgdm9pZCBIQUxfUENEX0RhdGFJblN0YWdlQ2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBlcG51bSkgeworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChocGNkKTsKKyAgVU5VU0VEKGVwbnVtKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1BDRF9EYXRhSW5TdGFnZUNhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyCisgICAgIGZpbGUKKyAgICovCit9CisvKioKKyAqIEBicmllZiAgU2V0dXAgc3RhZ2UgY2FsbGJhY2sKKyAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX193ZWFrIHZvaWQgSEFMX1BDRF9TZXR1cFN0YWdlQ2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpIHsKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHBjZCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9QQ0RfU2V0dXBTdGFnZUNhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICogQGJyaWVmICBVU0IgU3RhcnQgT2YgRnJhbWUgY2FsbGJhY2suCisgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICogQHJldHZhbCBOb25lCisgKi8KK19fd2VhayB2b2lkIEhBTF9QQ0RfU09GQ2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpIHsKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHBjZCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9QQ0RfU09GQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgKiBAYnJpZWYgIFVTQiBSZXNldCBjYWxsYmFjay4KKyAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX193ZWFrIHZvaWQgSEFMX1BDRF9SZXNldENhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKSB7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhwY2QpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfUENEX1Jlc2V0Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgKiBAYnJpZWYgIFN1c3BlbmQgZXZlbnQgY2FsbGJhY2suCisgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICogQHJldHZhbCBOb25lCisgKi8KK19fd2VhayB2b2lkIEhBTF9QQ0RfU3VzcGVuZENhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKSB7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhwY2QpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfUENEX1N1c3BlbmRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAqIEBicmllZiAgUmVzdW1lIGV2ZW50IGNhbGxiYWNrLgorICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAqIEByZXR2YWwgTm9uZQorICovCitfX3dlYWsgdm9pZCBIQUxfUENEX1Jlc3VtZUNhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKSB7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhwY2QpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfUENEX1Jlc3VtZUNhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICogQGJyaWVmICBJbmNvbXBsZXRlIElTTyBPVVQgY2FsbGJhY2suCisgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICogQHBhcmFtICBlcG51bSBlbmRwb2ludCBudW1iZXIKKyAqIEByZXR2YWwgTm9uZQorICovCitfX3dlYWsgdm9pZCBIQUxfUENEX0lTT09VVEluY29tcGxldGVDYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZXBudW0pIHsKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHBjZCk7CisgIFVOVVNFRChlcG51bSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9QQ0RfSVNPT1VUSW5jb21wbGV0ZUNhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZQorICAgICB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICogQGJyaWVmICBJbmNvbXBsZXRlIElTTyBJTiBjYWxsYmFjay4KKyAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgKiBAcGFyYW0gIGVwbnVtIGVuZHBvaW50IG51bWJlcgorICogQHJldHZhbCBOb25lCisgKi8KK19fd2VhayB2b2lkIEhBTF9QQ0RfSVNPSU5JbmNvbXBsZXRlQ2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZXBudW0pIHsKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHBjZCk7CisgIFVOVVNFRChlcG51bSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9QQ0RfSVNPSU5JbmNvbXBsZXRlQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIKKyAgICAgZmlsZQorICAgKi8KK30KKworLyoqCisgKiBAYnJpZWYgIENvbm5lY3Rpb24gZXZlbnQgY2FsbGJhY2suCisgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICogQHJldHZhbCBOb25lCisgKi8KK19fd2VhayB2b2lkIEhBTF9QQ0RfQ29ubmVjdENhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKSB7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhwY2QpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfUENEX0Nvbm5lY3RDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAqIEBicmllZiAgRGlzY29ubmVjdGlvbiBldmVudCBjYWxsYmFjay4KKyAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX193ZWFrIHZvaWQgSEFMX1BDRF9EaXNjb25uZWN0Q2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpIHsKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHBjZCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9QQ0RfRGlzY29ubmVjdENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFBDRF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiAgQGJyaWVmICAgbWFuYWdlbWVudCBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gY29udHJvbCB0aGUgUENEIGRhdGEKKyAgICB0cmFuc2ZlcnMuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICogQGJyaWVmICBDb25uZWN0IHRoZSBVU0IgZGV2aWNlCisgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfRGV2Q29ubmVjdChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCkgeworICBfX0hBTF9MT0NLKGhwY2QpOworICAodm9pZClVU0JfRGV2Q29ubmVjdChocGNkLT5JbnN0YW5jZSk7CisgIF9fSEFMX1VOTE9DSyhocGNkKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiAgRGlzY29ubmVjdCB0aGUgVVNCIGRldmljZS4KKyAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9EZXZEaXNjb25uZWN0KFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKSB7CisgIF9fSEFMX0xPQ0soaHBjZCk7CisgICh2b2lkKVVTQl9EZXZEaXNjb25uZWN0KGhwY2QtPkluc3RhbmNlKTsKKyAgX19IQUxfVU5MT0NLKGhwY2QpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICogQGJyaWVmICBTZXQgdGhlIFVTQiBEZXZpY2UgYWRkcmVzcy4KKyAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgKiBAcGFyYW0gIGFkZHJlc3MgbmV3IGRldmljZSBhZGRyZXNzCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9TZXRBZGRyZXNzKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCB1aW50OF90IGFkZHJlc3MpIHsKKyAgX19IQUxfTE9DSyhocGNkKTsKKyAgaHBjZC0+VVNCX0FkZHJlc3MgPSBhZGRyZXNzOworICAodm9pZClVU0JfU2V0RGV2QWRkcmVzcyhocGNkLT5JbnN0YW5jZSwgYWRkcmVzcyk7CisgIF9fSEFMX1VOTE9DSyhocGNkKTsKKworICByZXR1cm4gSEFMX09LOworfQorLyoqCisgKiBAYnJpZWYgIE9wZW4gYW5kIGNvbmZpZ3VyZSBhbiBlbmRwb2ludC4KKyAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgKiBAcGFyYW0gIGVwX2FkZHIgZW5kcG9pbnQgYWRkcmVzcworICogQHBhcmFtICBlcF9tcHMgZW5kcG9pbnQgbWF4IHBhY2tldCBzaXplCisgKiBAcGFyYW0gIGVwX3R5cGUgZW5kcG9pbnQgdHlwZQorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfRVBfT3BlbihQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDhfdCBlcF9hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGVwX21wcywgdWludDhfdCBlcF90eXBlKSB7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHJldCA9IEhBTF9PSzsKKyAgUENEX0VQVHlwZURlZiAqZXA7CisKKyAgaWYgKChlcF9hZGRyICYgMHg4MFUpID09IDB4ODBVKSB7CisgICAgZXAgPSAmaHBjZC0+SU5fZXBbZXBfYWRkciAmIEVQX0FERFJfTVNLXTsKKyAgICBlcC0+aXNfaW4gPSAxVTsKKyAgfSBlbHNlIHsKKyAgICBlcCA9ICZocGNkLT5PVVRfZXBbZXBfYWRkciAmIEVQX0FERFJfTVNLXTsKKyAgICBlcC0+aXNfaW4gPSAwVTsKKyAgfQorCisgIGVwLT5udW0gPSBlcF9hZGRyICYgRVBfQUREUl9NU0s7CisgIGVwLT5tYXhwYWNrZXQgPSAodWludDMyX3QpZXBfbXBzICYgMHg3RkZVOworICBlcC0+dHlwZSA9IGVwX3R5cGU7CisKKyAgLyogU2V0IGluaXRpYWwgZGF0YSBQSUQuICovCisgIGlmIChlcF90eXBlID09IEVQX1RZUEVfQlVMSykgeworICAgIGVwLT5kYXRhX3BpZF9zdGFydCA9IDBVOworICB9CisKKyAgX19IQUxfTE9DSyhocGNkKTsKKyAgKHZvaWQpVVNCX0FjdGl2YXRlRW5kcG9pbnQoaHBjZC0+SW5zdGFuY2UsIGVwKTsKKyAgX19IQUxfVU5MT0NLKGhwY2QpOworCisgIHJldHVybiByZXQ7Cit9CisKKy8qKgorICogQGJyaWVmICBEZWFjdGl2YXRlIGFuIGVuZHBvaW50LgorICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAqIEBwYXJhbSAgZXBfYWRkciBlbmRwb2ludCBhZGRyZXNzCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9FUF9DbG9zZShQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDhfdCBlcF9hZGRyKSB7CisgIFBDRF9FUFR5cGVEZWYgKmVwOworCisgIGlmICgoZXBfYWRkciAmIDB4ODBVKSA9PSAweDgwVSkgeworICAgIGVwID0gJmhwY2QtPklOX2VwW2VwX2FkZHIgJiBFUF9BRERSX01TS107CisgICAgZXAtPmlzX2luID0gMVU7CisgIH0gZWxzZSB7CisgICAgZXAgPSAmaHBjZC0+T1VUX2VwW2VwX2FkZHIgJiBFUF9BRERSX01TS107CisgICAgZXAtPmlzX2luID0gMFU7CisgIH0KKyAgZXAtPm51bSA9IGVwX2FkZHIgJiBFUF9BRERSX01TSzsKKworICBfX0hBTF9MT0NLKGhwY2QpOworICAodm9pZClVU0JfRGVhY3RpdmF0ZUVuZHBvaW50KGhwY2QtPkluc3RhbmNlLCBlcCk7CisgIF9fSEFMX1VOTE9DSyhocGNkKTsKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEuCisgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICogQHBhcmFtICBlcF9hZGRyIGVuZHBvaW50IGFkZHJlc3MKKyAqIEBwYXJhbSAgcEJ1ZiBwb2ludGVyIHRvIHRoZSByZWNlcHRpb24gYnVmZmVyCisgKiBAcGFyYW0gIGxlbiBhbW91bnQgb2YgZGF0YSB0byBiZSByZWNlaXZlZAorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfRVBfUmVjZWl2ZShQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDhfdCBlcF9hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IGxlbikgeworICBQQ0RfRVBUeXBlRGVmICplcDsKKworICBlcCA9ICZocGNkLT5PVVRfZXBbZXBfYWRkciAmIEVQX0FERFJfTVNLXTsKKworICAvKnNldHVwIGFuZCBzdGFydCB0aGUgWGZlciAqLworICBlcC0+eGZlcl9idWZmID0gcEJ1ZjsKKyAgZXAtPnhmZXJfbGVuID0gbGVuOworICBlcC0+eGZlcl9jb3VudCA9IDBVOworICBlcC0+aXNfaW4gPSAwVTsKKyAgZXAtPm51bSA9IGVwX2FkZHIgJiBFUF9BRERSX01TSzsKKworICAodm9pZClVU0JfRVBTdGFydFhmZXIoaHBjZC0+SW5zdGFuY2UsIGVwKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiAgR2V0IFJlY2VpdmVkIERhdGEgU2l6ZQorICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAqIEBwYXJhbSAgZXBfYWRkciBlbmRwb2ludCBhZGRyZXNzCisgKiBAcmV0dmFsIERhdGEgU2l6ZQorICovCit1aW50MzJfdCBIQUxfUENEX0VQX0dldFJ4Q291bnQoUENEX0hhbmRsZVR5cGVEZWYgY29uc3QgKmhwY2QsIHVpbnQ4X3QgZXBfYWRkcikgeworICByZXR1cm4gaHBjZC0+T1VUX2VwW2VwX2FkZHIgJiBFUF9BRERSX01TS10ueGZlcl9jb3VudDsKK30KKy8qKgorICogQGJyaWVmICBTZW5kIGFuIGFtb3VudCBvZiBkYXRhCisgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICogQHBhcmFtICBlcF9hZGRyIGVuZHBvaW50IGFkZHJlc3MKKyAqIEBwYXJhbSAgcEJ1ZiBwb2ludGVyIHRvIHRoZSB0cmFuc21pc3Npb24gYnVmZmVyCisgKiBAcGFyYW0gIGxlbiBhbW91bnQgb2YgZGF0YSB0byBiZSBzZW50CisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9FUF9UcmFuc21pdChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDhfdCBlcF9hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwQnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgUENEX0VQVHlwZURlZiAqZXA7CisKKyAgZXAgPSAmaHBjZC0+SU5fZXBbZXBfYWRkciAmIEVQX0FERFJfTVNLXTsKKworICAvKnNldHVwIGFuZCBzdGFydCB0aGUgWGZlciAqLworICBlcC0+eGZlcl9idWZmID0gcEJ1ZjsKKyAgZXAtPnhmZXJfbGVuID0gbGVuOworICBlcC0+eGZlcl9maWxsX2RiID0gMVU7CisgIGVwLT54ZmVyX2xlbl9kYiA9IGxlbjsKKyAgZXAtPnhmZXJfY291bnQgPSAwVTsKKyAgZXAtPmlzX2luID0gMVU7CisgIGVwLT5udW0gPSBlcF9hZGRyICYgRVBfQUREUl9NU0s7CisKKyAgKHZvaWQpVVNCX0VQU3RhcnRYZmVyKGhwY2QtPkluc3RhbmNlLCBlcCk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgIFNldCBhIFNUQUxMIGNvbmRpdGlvbiBvdmVyIGFuIGVuZHBvaW50CisgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICogQHBhcmFtICBlcF9hZGRyIGVuZHBvaW50IGFkZHJlc3MKKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX0VQX1NldFN0YWxsKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGVwX2FkZHIpIHsKKyAgUENEX0VQVHlwZURlZiAqZXA7CisKKyAgaWYgKCgodWludDMyX3QpZXBfYWRkciAmIEVQX0FERFJfTVNLKSA+IGhwY2QtPkluaXQuZGV2X2VuZHBvaW50cykgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICBpZiAoKDB4ODBVICYgZXBfYWRkcikgPT0gMHg4MFUpIHsKKyAgICBlcCA9ICZocGNkLT5JTl9lcFtlcF9hZGRyICYgRVBfQUREUl9NU0tdOworICAgIGVwLT5pc19pbiA9IDFVOworICB9IGVsc2UgeworICAgIGVwID0gJmhwY2QtPk9VVF9lcFtlcF9hZGRyXTsKKyAgICBlcC0+aXNfaW4gPSAwVTsKKyAgfQorCisgIGVwLT5pc19zdGFsbCA9IDFVOworICBlcC0+bnVtID0gZXBfYWRkciAmIEVQX0FERFJfTVNLOworCisgIF9fSEFMX0xPQ0soaHBjZCk7CisKKyAgKHZvaWQpVVNCX0VQU2V0U3RhbGwoaHBjZC0+SW5zdGFuY2UsIGVwKTsKKworICBfX0hBTF9VTkxPQ0soaHBjZCk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgIENsZWFyIGEgU1RBTEwgY29uZGl0aW9uIG92ZXIgaW4gYW4gZW5kcG9pbnQKKyAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgKiBAcGFyYW0gIGVwX2FkZHIgZW5kcG9pbnQgYWRkcmVzcworICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfRVBfQ2xyU3RhbGwoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZXBfYWRkcikgeworICBQQ0RfRVBUeXBlRGVmICplcDsKKworICBpZiAoKCh1aW50MzJfdCllcF9hZGRyICYgMHgwRlUpID4gaHBjZC0+SW5pdC5kZXZfZW5kcG9pbnRzKSB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIGlmICgoMHg4MFUgJiBlcF9hZGRyKSA9PSAweDgwVSkgeworICAgIGVwID0gJmhwY2QtPklOX2VwW2VwX2FkZHIgJiBFUF9BRERSX01TS107CisgICAgZXAtPmlzX2luID0gMVU7CisgIH0gZWxzZSB7CisgICAgZXAgPSAmaHBjZC0+T1VUX2VwW2VwX2FkZHIgJiBFUF9BRERSX01TS107CisgICAgZXAtPmlzX2luID0gMFU7CisgIH0KKworICBlcC0+aXNfc3RhbGwgPSAwVTsKKyAgZXAtPm51bSA9IGVwX2FkZHIgJiBFUF9BRERSX01TSzsKKworICBfX0hBTF9MT0NLKGhwY2QpOworICAodm9pZClVU0JfRVBDbGVhclN0YWxsKGhwY2QtPkluc3RhbmNlLCBlcCk7CisgIF9fSEFMX1VOTE9DSyhocGNkKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiAgQWJvcnQgYW4gVVNCIEVQIHRyYW5zYWN0aW9uLgorICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAqIEBwYXJhbSAgZXBfYWRkciBlbmRwb2ludCBhZGRyZXNzCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9FUF9BYm9ydChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDhfdCBlcF9hZGRyKSB7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHJldDsKKyAgUENEX0VQVHlwZURlZiAqZXA7CisKKyAgaWYgKCgweDgwVSAmIGVwX2FkZHIpID09IDB4ODBVKSB7CisgICAgZXAgPSAmaHBjZC0+SU5fZXBbZXBfYWRkciAmIEVQX0FERFJfTVNLXTsKKyAgfSBlbHNlIHsKKyAgICBlcCA9ICZocGNkLT5PVVRfZXBbZXBfYWRkciAmIEVQX0FERFJfTVNLXTsKKyAgfQorCisgIC8qIFN0b3AgWGZlciAqLworICByZXQgPSBVU0JfRVBTdG9wWGZlcihocGNkLT5JbnN0YW5jZSwgZXApOworCisgIHJldHVybiByZXQ7Cit9CisKKy8qKgorICogQGJyaWVmICBGbHVzaCBhbiBlbmRwb2ludAorICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAqIEBwYXJhbSAgZXBfYWRkciBlbmRwb2ludCBhZGRyZXNzCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9FUF9GbHVzaChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDhfdCBlcF9hZGRyKSB7CisgIF9fSEFMX0xPQ0soaHBjZCk7CisKKyAgaWYgKChlcF9hZGRyICYgMHg4MFUpID09IDB4ODBVKSB7CisgICAgKHZvaWQpVVNCX0ZsdXNoVHhGaWZvKGhwY2QtPkluc3RhbmNlLCAodWludDMyX3QpZXBfYWRkciAmIEVQX0FERFJfTVNLKTsKKyAgfSBlbHNlIHsKKyAgICAodm9pZClVU0JfRmx1c2hSeEZpZm8oaHBjZC0+SW5zdGFuY2UpOworICB9CisKKyAgX19IQUxfVU5MT0NLKGhwY2QpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICogQGJyaWVmICBBY3RpdmF0ZSByZW1vdGUgd2FrZXVwIHNpZ25hbGxpbmcKKyAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9BY3RpdmF0ZVJlbW90ZVdha2V1cChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCkgeworICByZXR1cm4gKFVTQl9BY3RpdmF0ZVJlbW90ZVdha2V1cChocGNkLT5JbnN0YW5jZSkpOworfQorCisvKioKKyAqIEBicmllZiAgRGUtYWN0aXZhdGUgcmVtb3RlIHdha2V1cCBzaWduYWxsaW5nLgorICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX0RlQWN0aXZhdGVSZW1vdGVXYWtldXAoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpIHsKKyAgcmV0dXJuIChVU0JfRGVBY3RpdmF0ZVJlbW90ZVdha2V1cChocGNkLT5JbnN0YW5jZSkpOworfQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBQQ0RfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNCBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucworICAqICBAYnJpZWYgICBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwZXJtaXRzIHRvIGdldCBpbiBydW4tdGltZSB0aGUgc3RhdHVzIG9mIHRoZSBwZXJpcGhlcmFsCisgICAgYW5kIHRoZSBkYXRhIGZsb3cuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICogQGJyaWVmICBSZXR1cm4gdGhlIFBDRCBoYW5kbGUgc3RhdGUuCisgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICogQHJldHZhbCBIQUwgc3RhdGUKKyAqLworUENEX1N0YXRlVHlwZURlZiBIQUxfUENEX0dldFN0YXRlKFBDRF9IYW5kbGVUeXBlRGVmIGNvbnN0ICpocGNkKSB7CisgIHJldHVybiBocGNkLT5TdGF0ZTsKK30KKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisvKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFBDRF9Qcml2YXRlX0Z1bmN0aW9ucworICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIFBDRCBFbmRwb2ludCBpbnRlcnJ1cHQgcmVxdWVzdC4KKyAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFBDRF9FUF9JU1JfSGFuZGxlcihQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCkgeworICBQQ0RfRVBUeXBlRGVmICplcDsKKyAgdWludDE2X3QgY291bnQ7CisgIHVpbnQxNl90IHdJc3RyOworICB1aW50MTZfdCB3RVBWYWw7CisgIHVpbnQxNl90IFR4UGN0U2l6ZTsKKyAgdWludDhfdCBlcGluZGV4OworCisjaWYgKFVTRV9VU0JfRE9VQkxFX0JVRkZFUiAhPSAxVSkKKyAgY291bnQgPSAwVTsKKyNlbmRpZiAvKiBVU0VfVVNCX0RPVUJMRV9CVUZGRVIgKi8KKworICAvKiBzdGF5IGluIGxvb3Agd2hpbGUgcGVuZGluZyBpbnRlcnJ1cHRzICovCisgIHdoaWxlICgoaHBjZC0+SW5zdGFuY2UtPklTVFIgJiBVU0JfSVNUUl9DVFIpICE9IDBVKSB7CisgICAgd0lzdHIgPSBocGNkLT5JbnN0YW5jZS0+SVNUUjsKKworICAgIC8qIGV4dHJhY3QgaGlnaGVzdCBwcmlvcml0eSBlbmRwb2ludCBudW1iZXIgKi8KKyAgICBlcGluZGV4ID0gKHVpbnQ4X3QpKHdJc3RyICYgVVNCX0lTVFJfRVBfSUQpOworCisgICAgaWYgKGVwaW5kZXggPT0gMFUpIHsKKyAgICAgIC8qIERlY29kZSBhbmQgc2VydmljZSBjb250cm9sIGVuZHBvaW50IGludGVycnVwdCAqLworCisgICAgICAvKiBESVIgYml0ID0gb3JpZ2luIG9mIHRoZSBpbnRlcnJ1cHQgKi8KKyAgICAgIGlmICgod0lzdHIgJiBVU0JfSVNUUl9ESVIpID09IDBVKSB7CisgICAgICAgIC8qIERJUiA9IDAgKi8KKworICAgICAgICAvKiBESVIgPSAwID0+IElOICBpbnQgKi8KKyAgICAgICAgLyogRElSID0gMCBpbXBsaWVzIHRoYXQgKEVQX0NUUl9UWCA9IDEpIGFsd2F5cyAqLworICAgICAgICBQQ0RfQ0xFQVJfVFhfRVBfQ1RSKGhwY2QtPkluc3RhbmNlLCBQQ0RfRU5EUDApOworICAgICAgICBlcCA9ICZocGNkLT5JTl9lcFswXTsKKworICAgICAgICBlcC0+eGZlcl9jb3VudCA9IFBDRF9HRVRfRVBfVFhfQ05UKGhwY2QtPkluc3RhbmNlLCBlcC0+bnVtKTsKKyAgICAgICAgZXAtPnhmZXJfYnVmZiArPSBlcC0+eGZlcl9jb3VudDsKKworICAgICAgICAvKiBUWCBDT01QTEVURSAqLworI2lmIChVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgICAgIGhwY2QtPkRhdGFJblN0YWdlQ2FsbGJhY2soaHBjZCwgMFUpOworI2Vsc2UKKyAgICAgICAgSEFMX1BDRF9EYXRhSW5TdGFnZUNhbGxiYWNrKGhwY2QsIDBVKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworICAgICAgICBpZiAoKGhwY2QtPlVTQl9BZGRyZXNzID4gMFUpICYmIChlcC0+eGZlcl9sZW4gPT0gMFUpKSB7CisgICAgICAgICAgaHBjZC0+SW5zdGFuY2UtPkRBRERSID0gKCh1aW50MTZfdClocGNkLT5VU0JfQWRkcmVzcyB8IFVTQl9EQUREUl9FRik7CisgICAgICAgICAgaHBjZC0+VVNCX0FkZHJlc3MgPSAwVTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogRElSID0gMSAqLworCisgICAgICAgIC8qIERJUiA9IDEgJiBDVFJfUlggPT4gU0VUVVAgb3IgT1VUIGludCAqLworICAgICAgICAvKiBESVIgPSAxICYgKENUUl9UWCB8IENUUl9SWCkgPT4gMiBpbnQgcGVuZGluZyAqLworICAgICAgICBlcCA9ICZocGNkLT5PVVRfZXBbMF07CisgICAgICAgIHdFUFZhbCA9IFBDRF9HRVRfRU5EUE9JTlQoaHBjZC0+SW5zdGFuY2UsIFBDRF9FTkRQMCk7CisKKyAgICAgICAgaWYgKCh3RVBWYWwgJiBVU0JfRVBfU0VUVVApICE9IDBVKSB7CisgICAgICAgICAgLyogR2V0IFNFVFVQIFBhY2tldCAqLworICAgICAgICAgIGVwLT54ZmVyX2NvdW50ID0gUENEX0dFVF9FUF9SWF9DTlQoaHBjZC0+SW5zdGFuY2UsIGVwLT5udW0pOworCisgICAgICAgICAgVVNCX1JlYWRQTUEoaHBjZC0+SW5zdGFuY2UsICh1aW50OF90ICopaHBjZC0+U2V0dXAsIGVwLT5wbWFhZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgKHVpbnQxNl90KWVwLT54ZmVyX2NvdW50KTsKKworICAgICAgICAgIC8qIFNFVFVQIGJpdCBrZXB0IGZyb3plbiB3aGlsZSBDVFJfUlggPSAxICovCisgICAgICAgICAgUENEX0NMRUFSX1JYX0VQX0NUUihocGNkLT5JbnN0YW5jZSwgUENEX0VORFAwKTsKKworICAgICAgICAgIC8qIFByb2Nlc3MgU0VUVVAgUGFja2V0Ki8KKyNpZiAoVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgICAgICAgIGhwY2QtPlNldHVwU3RhZ2VDYWxsYmFjayhocGNkKTsKKyNlbHNlCisgICAgICAgICAgSEFMX1BDRF9TZXR1cFN0YWdlQ2FsbGJhY2soaHBjZCk7CisjZW5kaWYgLyogVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgICAgIH0gZWxzZSBpZiAoKHdFUFZhbCAmIFVTQl9FUF9DVFJfUlgpICE9IDBVKSB7CisgICAgICAgICAgUENEX0NMRUFSX1JYX0VQX0NUUihocGNkLT5JbnN0YW5jZSwgUENEX0VORFAwKTsKKworICAgICAgICAgIC8qIEdldCBDb250cm9sIERhdGEgT1VUIFBhY2tldCAqLworICAgICAgICAgIGVwLT54ZmVyX2NvdW50ID0gUENEX0dFVF9FUF9SWF9DTlQoaHBjZC0+SW5zdGFuY2UsIGVwLT5udW0pOworCisgICAgICAgICAgaWYgKChlcC0+eGZlcl9jb3VudCAhPSAwVSkgJiYgKGVwLT54ZmVyX2J1ZmYgIT0gMFUpKSB7CisgICAgICAgICAgICBVU0JfUmVhZFBNQShocGNkLT5JbnN0YW5jZSwgZXAtPnhmZXJfYnVmZiwgZXAtPnBtYWFkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MTZfdCllcC0+eGZlcl9jb3VudCk7CisKKyAgICAgICAgICAgIGVwLT54ZmVyX2J1ZmYgKz0gZXAtPnhmZXJfY291bnQ7CisKKyAgICAgICAgICAgIC8qIFByb2Nlc3MgQ29udHJvbCBEYXRhIE9VVCBQYWNrZXQgKi8KKyNpZiAoVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgICAgICAgICAgaHBjZC0+RGF0YU91dFN0YWdlQ2FsbGJhY2soaHBjZCwgMFUpOworI2Vsc2UKKyAgICAgICAgICAgIEhBTF9QQ0RfRGF0YU91dFN0YWdlQ2FsbGJhY2soaHBjZCwgMFUpOworI2VuZGlmIC8qIFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgICAgIH0KKworICAgICAgICAgIHdFUFZhbCA9ICh1aW50MTZfdClQQ0RfR0VUX0VORFBPSU5UKGhwY2QtPkluc3RhbmNlLCBQQ0RfRU5EUDApOworCisgICAgICAgICAgaWYgKCgod0VQVmFsICYgVVNCX0VQX1NFVFVQKSA9PSAwVSkgJiYKKyAgICAgICAgICAgICAgKCh3RVBWYWwgJiBVU0JfRVBfUlhfU1RSWCkgIT0gVVNCX0VQX1JYX1ZBTElEKSkgeworICAgICAgICAgICAgUENEX1NFVF9FUF9SWF9TVEFUVVMoaHBjZC0+SW5zdGFuY2UsIFBDRF9FTkRQMCwgVVNCX0VQX1JYX1ZBTElEKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLyogRGVjb2RlIGFuZCBzZXJ2aWNlIG5vbiBjb250cm9sIGVuZHBvaW50cyBpbnRlcnJ1cHQgKi8KKyAgICAgIC8qIHByb2Nlc3MgcmVsYXRlZCBlbmRwb2ludCByZWdpc3RlciAqLworICAgICAgd0VQVmFsID0gUENEX0dFVF9FTkRQT0lOVChocGNkLT5JbnN0YW5jZSwgZXBpbmRleCk7CisKKyAgICAgIGlmICgod0VQVmFsICYgVVNCX0VQX0NUUl9SWCkgIT0gMFUpIHsKKyAgICAgICAgLyogY2xlYXIgaW50IGZsYWcgKi8KKyAgICAgICAgUENEX0NMRUFSX1JYX0VQX0NUUihocGNkLT5JbnN0YW5jZSwgZXBpbmRleCk7CisgICAgICAgIGVwID0gJmhwY2QtPk9VVF9lcFtlcGluZGV4XTsKKworICAgICAgICAvKiBPVVQgU2luZ2xlIEJ1ZmZlcmluZyAqLworICAgICAgICBpZiAoZXAtPmRvdWJsZWJ1ZmZlciA9PSAwVSkgeworICAgICAgICAgIGNvdW50ID0gKHVpbnQxNl90KVBDRF9HRVRfRVBfUlhfQ05UKGhwY2QtPkluc3RhbmNlLCBlcC0+bnVtKTsKKworICAgICAgICAgIGlmIChjb3VudCAhPSAwVSkgeworICAgICAgICAgICAgVVNCX1JlYWRQTUEoaHBjZC0+SW5zdGFuY2UsIGVwLT54ZmVyX2J1ZmYsIGVwLT5wbWFhZHJlc3MsIGNvdW50KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyNpZiAoVVNFX1VTQl9ET1VCTEVfQlVGRkVSID09IDFVKQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAvKiBtYW5hZ2UgZG91YmxlIGJ1ZmZlciBidWxrIG91dCAqLworICAgICAgICAgIGlmIChlcC0+dHlwZSA9PSBFUF9UWVBFX0JVTEspIHsKKyAgICAgICAgICAgIGNvdW50ID0gSEFMX1BDRF9FUF9EQl9SZWNlaXZlKGhwY2QsIGVwLCB3RVBWYWwpOworICAgICAgICAgIH0gZWxzZSAvKiBtYW5hZ2UgZG91YmxlIGJ1ZmZlciBpc28gb3V0ICovCisgICAgICAgICAgeworICAgICAgICAgICAgLyogZnJlZSBFUCBPVVQgQnVmZmVyICovCisgICAgICAgICAgICBQQ0RfRlJFRV9VU0VSX0JVRkZFUihocGNkLT5JbnN0YW5jZSwgZXAtPm51bSwgMFUpOworCisgICAgICAgICAgICBpZiAoKFBDRF9HRVRfRU5EUE9JTlQoaHBjZC0+SW5zdGFuY2UsIGVwLT5udW0pICYgVVNCX0VQX0RUT0dfUlgpICE9CisgICAgICAgICAgICAgICAgMFUpIHsKKyAgICAgICAgICAgICAgLyogcmVhZCBmcm9tIGVuZHBvaW50IEJVRjBBZGRyIGJ1ZmZlciAqLworICAgICAgICAgICAgICBjb3VudCA9ICh1aW50MTZfdClQQ0RfR0VUX0VQX0RCVUYwX0NOVChocGNkLT5JbnN0YW5jZSwgZXAtPm51bSk7CisKKyAgICAgICAgICAgICAgaWYgKGNvdW50ICE9IDBVKSB7CisgICAgICAgICAgICAgICAgVVNCX1JlYWRQTUEoaHBjZC0+SW5zdGFuY2UsIGVwLT54ZmVyX2J1ZmYsIGVwLT5wbWFhZGRyMCwgY291bnQpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAvKiByZWFkIGZyb20gZW5kcG9pbnQgQlVGMUFkZHIgYnVmZmVyICovCisgICAgICAgICAgICAgIGNvdW50ID0gKHVpbnQxNl90KVBDRF9HRVRfRVBfREJVRjFfQ05UKGhwY2QtPkluc3RhbmNlLCBlcC0+bnVtKTsKKworICAgICAgICAgICAgICBpZiAoY291bnQgIT0gMFUpIHsKKyAgICAgICAgICAgICAgICBVU0JfUmVhZFBNQShocGNkLT5JbnN0YW5jZSwgZXAtPnhmZXJfYnVmZiwgZXAtPnBtYWFkZHIxLCBjb3VudCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZiAvKiAoVVNFX1VTQl9ET1VCTEVfQlVGRkVSID09IDFVKSAqLworCisgICAgICAgIC8qIG11bHRpLXBhY2tldCBvbiB0aGUgTk9OIGNvbnRyb2wgT1VUIGVuZHBvaW50ICovCisgICAgICAgIGVwLT54ZmVyX2NvdW50ICs9IGNvdW50OworICAgICAgICBlcC0+eGZlcl9idWZmICs9IGNvdW50OworCisgICAgICAgIGlmICgoZXAtPnhmZXJfbGVuID09IDBVKSB8fCAoY291bnQgPCBlcC0+bWF4cGFja2V0KSkgeworICAgICAgICAgIC8qIFJYIENPTVBMRVRFICovCisjaWYgKFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICAgICAgICBocGNkLT5EYXRhT3V0U3RhZ2VDYWxsYmFjayhocGNkLCBlcC0+bnVtKTsKKyNlbHNlCisgICAgICAgICAgSEFMX1BDRF9EYXRhT3V0U3RhZ2VDYWxsYmFjayhocGNkLCBlcC0+bnVtKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAodm9pZClVU0JfRVBTdGFydFhmZXIoaHBjZC0+SW5zdGFuY2UsIGVwKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoKHdFUFZhbCAmIFVTQl9FUF9DVFJfVFgpICE9IDBVKSB7CisgICAgICAgIGVwID0gJmhwY2QtPklOX2VwW2VwaW5kZXhdOworCisgICAgICAgIC8qIGNsZWFyIGludCBmbGFnICovCisgICAgICAgIFBDRF9DTEVBUl9UWF9FUF9DVFIoaHBjZC0+SW5zdGFuY2UsIGVwaW5kZXgpOworCisgICAgICAgIGlmIChlcC0+dHlwZSA9PSBFUF9UWVBFX0lTT0MpIHsKKyAgICAgICAgICBlcC0+eGZlcl9sZW4gPSAwVTsKKworI2lmIChVU0VfVVNCX0RPVUJMRV9CVUZGRVIgPT0gMVUpCisgICAgICAgICAgaWYgKGVwLT5kb3VibGVidWZmZXIgIT0gMFUpIHsKKyAgICAgICAgICAgIGlmICgod0VQVmFsICYgVVNCX0VQX0RUT0dfVFgpICE9IDBVKSB7CisgICAgICAgICAgICAgIFBDRF9TRVRfRVBfREJVRjBfQ05UKGhwY2QtPkluc3RhbmNlLCBlcC0+bnVtLCBlcC0+aXNfaW4sIDBVKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIFBDRF9TRVRfRVBfREJVRjFfQ05UKGhwY2QtPkluc3RhbmNlLCBlcC0+bnVtLCBlcC0+aXNfaW4sIDBVKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisjZW5kaWYgLyogKFVTRV9VU0JfRE9VQkxFX0JVRkZFUiA9PSAxVSkgKi8KKworICAgICAgICAgIC8qIFRYIENPTVBMRVRFICovCisjaWYgKFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICAgICAgICBocGNkLT5EYXRhSW5TdGFnZUNhbGxiYWNrKGhwY2QsIGVwLT5udW0pOworI2Vsc2UKKyAgICAgICAgICBIQUxfUENEX0RhdGFJblN0YWdlQ2FsbGJhY2soaHBjZCwgZXAtPm51bSk7CisjZW5kaWYgLyogVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLyogTWFuYWdlIFNpbmdsZSBCdWZmZXIgVHJhbnNhY3Rpb24gKi8KKyAgICAgICAgICBpZiAoKHdFUFZhbCAmIFVTQl9FUF9LSU5EKSA9PSAwVSkgeworICAgICAgICAgICAgLyogTXVsdGktcGFja2V0IG9uIHRoZSBOT04gY29udHJvbCBJTiBlbmRwb2ludCAqLworICAgICAgICAgICAgVHhQY3RTaXplID0gKHVpbnQxNl90KVBDRF9HRVRfRVBfVFhfQ05UKGhwY2QtPkluc3RhbmNlLCBlcC0+bnVtKTsKKworICAgICAgICAgICAgaWYgKGVwLT54ZmVyX2xlbiA+IFR4UGN0U2l6ZSkgeworICAgICAgICAgICAgICBlcC0+eGZlcl9sZW4gLT0gVHhQY3RTaXplOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgZXAtPnhmZXJfbGVuID0gMFU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFplcm8gTGVuZ3RoIFBhY2tldD8gKi8KKyAgICAgICAgICAgIGlmIChlcC0+eGZlcl9sZW4gPT0gMFUpIHsKKyAgICAgICAgICAgICAgLyogVFggQ09NUExFVEUgKi8KKyNpZiAoVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgICAgICAgICAgICBocGNkLT5EYXRhSW5TdGFnZUNhbGxiYWNrKGhwY2QsIGVwLT5udW0pOworI2Vsc2UKKyAgICAgICAgICAgICAgSEFMX1BDRF9EYXRhSW5TdGFnZUNhbGxiYWNrKGhwY2QsIGVwLT5udW0pOworI2VuZGlmIC8qIFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgLyogVHJhbnNmZXIgaXMgbm90IHlldCBEb25lICovCisgICAgICAgICAgICAgIGVwLT54ZmVyX2J1ZmYgKz0gVHhQY3RTaXplOworICAgICAgICAgICAgICBlcC0+eGZlcl9jb3VudCArPSBUeFBjdFNpemU7CisgICAgICAgICAgICAgICh2b2lkKVVTQl9FUFN0YXJ0WGZlcihocGNkLT5JbnN0YW5jZSwgZXApOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyNpZiAoVVNFX1VTQl9ET1VCTEVfQlVGRkVSID09IDFVKQorICAgICAgICAgIC8qIERvdWJsZSBCdWZmZXIgYnVsayBJTiAoYnVsayB0cmFuc2ZlciBMZW4gPiBFcF9NcHMpICovCisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAodm9pZClIQUxfUENEX0VQX0RCX1RyYW5zbWl0KGhwY2QsIGVwLCB3RVBWYWwpOworICAgICAgICAgIH0KKyNlbmRpZiAvKiAoVVNFX1VTQl9ET1VCTEVfQlVGRkVSID09IDFVKSAqLworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworI2lmIChVU0VfVVNCX0RPVUJMRV9CVUZGRVIgPT0gMVUpCisvKioKKyAqIEBicmllZiAgTWFuYWdlIGRvdWJsZSBidWZmZXIgYnVsayBvdXQgdHJhbnNhY3Rpb24gZnJvbSBJU1IKKyAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgKiBAcGFyYW0gIGVwIGN1cnJlbnQgZW5kcG9pbnQgaGFuZGxlCisgKiBAcGFyYW0gIHdFUFZhbCBMYXN0IHNuYXBzaG90IG9mIEVQUnggcmVnaXN0ZXIgdmFsdWUgdGFrZW4gaW4gSVNSCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworc3RhdGljIHVpbnQxNl90IEhBTF9QQ0RfRVBfREJfUmVjZWl2ZShQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENEX0VQVHlwZURlZiAqZXAsIHVpbnQxNl90IHdFUFZhbCkgeworICB1aW50MTZfdCBjb3VudDsKKworICAvKiBNYW5hZ2UgQnVmZmVyMCBPVVQgKi8KKyAgaWYgKCh3RVBWYWwgJiBVU0JfRVBfRFRPR19SWCkgIT0gMFUpIHsKKyAgICAvKiBHZXQgY291bnQgb2YgcmVjZWl2ZWQgRGF0YSBvbiBidWZmZXIwICovCisgICAgY291bnQgPSAodWludDE2X3QpUENEX0dFVF9FUF9EQlVGMF9DTlQoaHBjZC0+SW5zdGFuY2UsIGVwLT5udW0pOworCisgICAgaWYgKGVwLT54ZmVyX2xlbiA+PSBjb3VudCkgeworICAgICAgZXAtPnhmZXJfbGVuIC09IGNvdW50OworICAgIH0gZWxzZSB7CisgICAgICBlcC0+eGZlcl9sZW4gPSAwVTsKKyAgICB9CisKKyAgICBpZiAoZXAtPnhmZXJfbGVuID09IDBVKSB7CisgICAgICAvKiBTZXQgTkFLIHRvIE9VVCBlbmRwb2ludCBzaW5jZSBkb3VibGUgYnVmZmVyIGlzIGVuYWJsZWQgKi8KKyAgICAgIFBDRF9TRVRfRVBfUlhfU1RBVFVTKGhwY2QtPkluc3RhbmNlLCBlcC0+bnVtLCBVU0JfRVBfUlhfTkFLKTsKKyAgICB9CisKKyAgICAvKiBDaGVjayBpZiBCdWZmZXIxIGlzIGluIGJsb2NrZWQgc3RhdGUgd2hpY2ggcmVxdWlyZXMgdG8gdG9nZ2xlICovCisgICAgaWYgKCh3RVBWYWwgJiBVU0JfRVBfRFRPR19UWCkgIT0gMFUpIHsKKyAgICAgIFBDRF9GUkVFX1VTRVJfQlVGRkVSKGhwY2QtPkluc3RhbmNlLCBlcC0+bnVtLCAwVSk7CisgICAgfQorCisgICAgaWYgKGNvdW50ICE9IDBVKSB7CisgICAgICBVU0JfUmVhZFBNQShocGNkLT5JbnN0YW5jZSwgZXAtPnhmZXJfYnVmZiwgZXAtPnBtYWFkZHIwLCBjb3VudCk7CisgICAgfQorICB9CisgIC8qIE1hbmFnZSBCdWZmZXIgMSBEVE9HX1JYPTAgKi8KKyAgZWxzZSB7CisgICAgLyogR2V0IGNvdW50IG9mIHJlY2VpdmVkIGRhdGEgKi8KKyAgICBjb3VudCA9ICh1aW50MTZfdClQQ0RfR0VUX0VQX0RCVUYxX0NOVChocGNkLT5JbnN0YW5jZSwgZXAtPm51bSk7CisKKyAgICBpZiAoZXAtPnhmZXJfbGVuID49IGNvdW50KSB7CisgICAgICBlcC0+eGZlcl9sZW4gLT0gY291bnQ7CisgICAgfSBlbHNlIHsKKyAgICAgIGVwLT54ZmVyX2xlbiA9IDBVOworICAgIH0KKworICAgIGlmIChlcC0+eGZlcl9sZW4gPT0gMFUpIHsKKyAgICAgIC8qIFNldCBOQUsgb24gdGhlIGN1cnJlbnQgZW5kcG9pbnQgKi8KKyAgICAgIFBDRF9TRVRfRVBfUlhfU1RBVFVTKGhwY2QtPkluc3RhbmNlLCBlcC0+bnVtLCBVU0JfRVBfUlhfTkFLKTsKKyAgICB9CisKKyAgICAvKiBOZWVkIHRvIEZyZWVVc2VyIEJ1ZmZlciAqLworICAgIGlmICgod0VQVmFsICYgVVNCX0VQX0RUT0dfVFgpID09IDBVKSB7CisgICAgICBQQ0RfRlJFRV9VU0VSX0JVRkZFUihocGNkLT5JbnN0YW5jZSwgZXAtPm51bSwgMFUpOworICAgIH0KKworICAgIGlmIChjb3VudCAhPSAwVSkgeworICAgICAgVVNCX1JlYWRQTUEoaHBjZC0+SW5zdGFuY2UsIGVwLT54ZmVyX2J1ZmYsIGVwLT5wbWFhZGRyMSwgY291bnQpOworICAgIH0KKyAgfQorCisgIHJldHVybiBjb3VudDsKK30KKworLyoqCisgKiBAYnJpZWYgIE1hbmFnZSBkb3VibGUgYnVmZmVyIGJ1bGsgSU4gdHJhbnNhY3Rpb24gZnJvbSBJU1IKKyAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgKiBAcGFyYW0gIGVwIGN1cnJlbnQgZW5kcG9pbnQgaGFuZGxlCisgKiBAcGFyYW0gIHdFUFZhbCBMYXN0IHNuYXBzaG90IG9mIEVQUnggcmVnaXN0ZXIgdmFsdWUgdGFrZW4gaW4gSVNSCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfRVBfREJfVHJhbnNtaXQoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0RfRVBUeXBlRGVmICplcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHdFUFZhbCkgeworICB1aW50MzJfdCBsZW47CisgIHVpbnQxNl90IFR4UGN0U2l6ZTsKKworICAvKiBEYXRhIEJ1ZmZlcjAgQUNLIHJlY2VpdmVkICovCisgIGlmICgod0VQVmFsICYgVVNCX0VQX0RUT0dfVFgpICE9IDBVKSB7CisgICAgLyogbXVsdGktcGFja2V0IG9uIHRoZSBOT04gY29udHJvbCBJTiBlbmRwb2ludCAqLworICAgIFR4UGN0U2l6ZSA9ICh1aW50MTZfdClQQ0RfR0VUX0VQX0RCVUYwX0NOVChocGNkLT5JbnN0YW5jZSwgZXAtPm51bSk7CisKKyAgICBpZiAoZXAtPnhmZXJfbGVuID4gVHhQY3RTaXplKSB7CisgICAgICBlcC0+eGZlcl9sZW4gLT0gVHhQY3RTaXplOworICAgIH0gZWxzZSB7CisgICAgICBlcC0+eGZlcl9sZW4gPSAwVTsKKyAgICB9CisKKyAgICAvKiBUcmFuc2ZlciBpcyBjb21wbGV0ZWQgKi8KKyAgICBpZiAoZXAtPnhmZXJfbGVuID09IDBVKSB7CisgICAgICBQQ0RfU0VUX0VQX0RCVUYwX0NOVChocGNkLT5JbnN0YW5jZSwgZXAtPm51bSwgZXAtPmlzX2luLCAwVSk7CisgICAgICBQQ0RfU0VUX0VQX0RCVUYxX0NOVChocGNkLT5JbnN0YW5jZSwgZXAtPm51bSwgZXAtPmlzX2luLCAwVSk7CisKKyAgICAgIGlmIChlcC0+dHlwZSA9PSBFUF9UWVBFX0JVTEspIHsKKyAgICAgICAgLyogU2V0IEJ1bGsgZW5kcG9pbnQgaW4gTkFLIHN0YXRlICovCisgICAgICAgIFBDRF9TRVRfRVBfVFhfU1RBVFVTKGhwY2QtPkluc3RhbmNlLCBlcC0+bnVtLCBVU0JfRVBfVFhfTkFLKTsKKyAgICAgIH0KKworICAgICAgLyogVFggQ09NUExFVEUgKi8KKyNpZiAoVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgICAgaHBjZC0+RGF0YUluU3RhZ2VDYWxsYmFjayhocGNkLCBlcC0+bnVtKTsKKyNlbHNlCisgICAgICBIQUxfUENEX0RhdGFJblN0YWdlQ2FsbGJhY2soaHBjZCwgZXAtPm51bSk7CisjZW5kaWYgLyogVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKyAgICAgIGlmICgod0VQVmFsICYgVVNCX0VQX0RUT0dfUlgpICE9IDBVKSB7CisgICAgICAgIFBDRF9GUkVFX1VTRVJfQlVGRkVSKGhwY2QtPkluc3RhbmNlLCBlcC0+bnVtLCAxVSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBIQUxfT0s7CisgICAgfSBlbHNlIC8qIFRyYW5zZmVyIGlzIG5vdCB5ZXQgRG9uZSAqLworICAgIHsKKyAgICAgIC8qIE5lZWQgdG8gRnJlZSBVU0IgQnVmZmVyICovCisgICAgICBpZiAoKHdFUFZhbCAmIFVTQl9FUF9EVE9HX1JYKSAhPSAwVSkgeworICAgICAgICBQQ0RfRlJFRV9VU0VSX0JVRkZFUihocGNkLT5JbnN0YW5jZSwgZXAtPm51bSwgMVUpOworICAgICAgfQorCisgICAgICAvKiBTdGlsbCB0aGVyZSBpcyBkYXRhIHRvIEZpbGwgaW4gdGhlIG5leHQgQnVmZmVyICovCisgICAgICBpZiAoZXAtPnhmZXJfZmlsbF9kYiA9PSAxVSkgeworICAgICAgICBlcC0+eGZlcl9idWZmICs9IFR4UGN0U2l6ZTsKKyAgICAgICAgZXAtPnhmZXJfY291bnQgKz0gVHhQY3RTaXplOworCisgICAgICAgIC8qIENhbGN1bGF0ZSB0aGUgbGVuIG9mIHRoZSBuZXcgYnVmZmVyIHRvIGZpbGwgKi8KKyAgICAgICAgaWYgKGVwLT54ZmVyX2xlbl9kYiA+PSBlcC0+bWF4cGFja2V0KSB7CisgICAgICAgICAgbGVuID0gZXAtPm1heHBhY2tldDsKKyAgICAgICAgICBlcC0+eGZlcl9sZW5fZGIgLT0gbGVuOworICAgICAgICB9IGVsc2UgaWYgKGVwLT54ZmVyX2xlbl9kYiA9PSAwVSkgeworICAgICAgICAgIGxlbiA9IFR4UGN0U2l6ZTsKKyAgICAgICAgICBlcC0+eGZlcl9maWxsX2RiID0gMFU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZXAtPnhmZXJfZmlsbF9kYiA9IDBVOworICAgICAgICAgIGxlbiA9IGVwLT54ZmVyX2xlbl9kYjsKKyAgICAgICAgICBlcC0+eGZlcl9sZW5fZGIgPSAwVTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFdyaXRlIHJlbWFpbmluZyBEYXRhIHRvIEJ1ZmZlciAqLworICAgICAgICAvKiBTZXQgdGhlIERvdWJsZSBidWZmZXIgY291bnRlciBmb3IgcG1hIGJ1ZmZlcjAgKi8KKyAgICAgICAgUENEX1NFVF9FUF9EQlVGMF9DTlQoaHBjZC0+SW5zdGFuY2UsIGVwLT5udW0sIGVwLT5pc19pbiwgbGVuKTsKKworICAgICAgICAvKiBDb3B5IHVzZXIgYnVmZmVyIHRvIFVTQiBQTUEgKi8KKyAgICAgICAgVVNCX1dyaXRlUE1BKGhwY2QtPkluc3RhbmNlLCBlcC0+eGZlcl9idWZmLCBlcC0+cG1hYWRkcjAsCisgICAgICAgICAgICAgICAgICAgICAodWludDE2X3QpbGVuKTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSAvKiBEYXRhIEJ1ZmZlcjEgQUNLIHJlY2VpdmVkICovCisgIHsKKyAgICAvKiBtdWx0aS1wYWNrZXQgb24gdGhlIE5PTiBjb250cm9sIElOIGVuZHBvaW50ICovCisgICAgVHhQY3RTaXplID0gKHVpbnQxNl90KVBDRF9HRVRfRVBfREJVRjFfQ05UKGhwY2QtPkluc3RhbmNlLCBlcC0+bnVtKTsKKworICAgIGlmIChlcC0+eGZlcl9sZW4gPj0gVHhQY3RTaXplKSB7CisgICAgICBlcC0+eGZlcl9sZW4gLT0gVHhQY3RTaXplOworICAgIH0gZWxzZSB7CisgICAgICBlcC0+eGZlcl9sZW4gPSAwVTsKKyAgICB9CisKKyAgICAvKiBUcmFuc2ZlciBpcyBjb21wbGV0ZWQgKi8KKyAgICBpZiAoZXAtPnhmZXJfbGVuID09IDBVKSB7CisgICAgICBQQ0RfU0VUX0VQX0RCVUYwX0NOVChocGNkLT5JbnN0YW5jZSwgZXAtPm51bSwgZXAtPmlzX2luLCAwVSk7CisgICAgICBQQ0RfU0VUX0VQX0RCVUYxX0NOVChocGNkLT5JbnN0YW5jZSwgZXAtPm51bSwgZXAtPmlzX2luLCAwVSk7CisKKyAgICAgIGlmIChlcC0+dHlwZSA9PSBFUF9UWVBFX0JVTEspIHsKKyAgICAgICAgLyogU2V0IEJ1bGsgZW5kcG9pbnQgaW4gTkFLIHN0YXRlICovCisgICAgICAgIFBDRF9TRVRfRVBfVFhfU1RBVFVTKGhwY2QtPkluc3RhbmNlLCBlcC0+bnVtLCBVU0JfRVBfVFhfTkFLKTsKKyAgICAgIH0KKworICAgICAgLyogVFggQ09NUExFVEUgKi8KKyNpZiAoVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgICAgaHBjZC0+RGF0YUluU3RhZ2VDYWxsYmFjayhocGNkLCBlcC0+bnVtKTsKKyNlbHNlCisgICAgICBIQUxfUENEX0RhdGFJblN0YWdlQ2FsbGJhY2soaHBjZCwgZXAtPm51bSk7CisjZW5kaWYgLyogVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKyAgICAgIC8qIG5lZWQgdG8gRnJlZSBVU0IgQnVmZiAqLworICAgICAgaWYgKCh3RVBWYWwgJiBVU0JfRVBfRFRPR19SWCkgPT0gMFUpIHsKKyAgICAgICAgUENEX0ZSRUVfVVNFUl9CVUZGRVIoaHBjZC0+SW5zdGFuY2UsIGVwLT5udW0sIDFVKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIEhBTF9PSzsKKyAgICB9IGVsc2UgLyogVHJhbnNmZXIgaXMgbm90IHlldCBEb25lICovCisgICAgeworICAgICAgLyogTmVlZCB0byBGcmVlIFVTQiBCdWZmZXIgKi8KKyAgICAgIGlmICgod0VQVmFsICYgVVNCX0VQX0RUT0dfUlgpID09IDBVKSB7CisgICAgICAgIFBDRF9GUkVFX1VTRVJfQlVGRkVSKGhwY2QtPkluc3RhbmNlLCBlcC0+bnVtLCAxVSk7CisgICAgICB9CisKKyAgICAgIC8qIFN0aWxsIHRoZXJlIGlzIGRhdGEgdG8gRmlsbCBpbiB0aGUgbmV4dCBCdWZmZXIgKi8KKyAgICAgIGlmIChlcC0+eGZlcl9maWxsX2RiID09IDFVKSB7CisgICAgICAgIGVwLT54ZmVyX2J1ZmYgKz0gVHhQY3RTaXplOworICAgICAgICBlcC0+eGZlcl9jb3VudCArPSBUeFBjdFNpemU7CisKKyAgICAgICAgLyogQ2FsY3VsYXRlIHRoZSBsZW4gb2YgdGhlIG5ldyBidWZmZXIgdG8gZmlsbCAqLworICAgICAgICBpZiAoZXAtPnhmZXJfbGVuX2RiID49IGVwLT5tYXhwYWNrZXQpIHsKKyAgICAgICAgICBsZW4gPSBlcC0+bWF4cGFja2V0OworICAgICAgICAgIGVwLT54ZmVyX2xlbl9kYiAtPSBsZW47CisgICAgICAgIH0gZWxzZSBpZiAoZXAtPnhmZXJfbGVuX2RiID09IDBVKSB7CisgICAgICAgICAgbGVuID0gVHhQY3RTaXplOworICAgICAgICAgIGVwLT54ZmVyX2ZpbGxfZGIgPSAwVTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBsZW4gPSBlcC0+eGZlcl9sZW5fZGI7CisgICAgICAgICAgZXAtPnhmZXJfbGVuX2RiID0gMFU7CisgICAgICAgICAgZXAtPnhmZXJfZmlsbF9kYiA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvKiBTZXQgdGhlIERvdWJsZSBidWZmZXIgY291bnRlciBmb3IgcG1hIGJ1ZmZlcjEgKi8KKyAgICAgICAgUENEX1NFVF9FUF9EQlVGMV9DTlQoaHBjZC0+SW5zdGFuY2UsIGVwLT5udW0sIGVwLT5pc19pbiwgbGVuKTsKKworICAgICAgICAvKiBDb3B5IHRoZSB1c2VyIGJ1ZmZlciB0byBVU0IgUE1BICovCisgICAgICAgIFVTQl9Xcml0ZVBNQShocGNkLT5JbnN0YW5jZSwgZXAtPnhmZXJfYnVmZiwgZXAtPnBtYWFkZHIxLAorICAgICAgICAgICAgICAgICAgICAgKHVpbnQxNl90KWxlbik7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogRW5hYmxlIGVuZHBvaW50IElOICovCisgIFBDRF9TRVRfRVBfVFhfU1RBVFVTKGhwY2QtPkluc3RhbmNlLCBlcC0+bnVtLCBVU0JfRVBfVFhfVkFMSUQpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisjZW5kaWYgLyogKFVTRV9VU0JfRE9VQkxFX0JVRkZFUiA9PSAxVSkgKi8KKworLyoqCisgKiBAfQorICovCisjZW5kaWYgLyogZGVmaW5lZCAoVVNCKSAqLworI2VuZGlmIC8qIEhBTF9QQ0RfTU9EVUxFX0VOQUJMRUQgKi8KKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KZGlmZiAtLWdpdCBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9wY2RfZXguYyBiL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9wY2RfZXguYwppbmRleCBmZWM0MGQzLi5mZjZkZDM5IDEwMDY0NAotLS0gYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfcGNkX2V4LmMKKysrIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3BjZF9leC5jCkBAIC0xLDMxMyArMSwzMTAgQEAKLS8qKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBAZmlsZSAgICBzdG0zMmc0eHhfaGFsX3BjZF9leC5jDQotICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0NCi0gKiBAYnJpZWYgICBQQ0QgRXh0ZW5kZWQgSEFMIG1vZHVsZSBkcml2ZXIuDQotICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZw0KLSAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgVVNCIFBlcmlwaGVyYWwgQ29udHJvbGxlcjoNCi0gKiAgICAgICAgICAgKyBFeHRlbmRlZCBmZWF0dXJlcyBmdW5jdGlvbnMNCi0gKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBAYXR0ZW50aW9uDQotICoNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQotICoNCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRlcm1zIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUNCi0gKiBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb2Z0d2FyZSBjb21wb25lbnQuDQotICogSWYgbm8gTElDRU5TRSBmaWxlIGNvbWVzIHdpdGggdGhpcyBzb2Z0d2FyZSwgaXQgaXMgcHJvdmlkZWQgQVMtSVMuDQotICoNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICovDQotDQotLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaW5jbHVkZSAic3RtMzJnNHh4X2hhbC5oIg0KLQ0KLS8qKiBAYWRkdG9ncm91cCBTVE0zMkc0eHhfSEFMX0RyaXZlcg0KLSAqIEB7DQotICovDQotDQotLyoqIEBkZWZncm91cCBQQ0RFeCBQQ0RFeA0KLSAqIEBicmllZiBQQ0QgRXh0ZW5kZWQgSEFMIG1vZHVsZSBkcml2ZXINCi0gKiBAew0KLSAqLw0KLQ0KLSNpZmRlZiBIQUxfUENEX01PRFVMRV9FTkFCTEVEDQotDQotI2lmIGRlZmluZWQoVVNCKQ0KLS8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUENERXhfRXhwb3J0ZWRfRnVuY3Rpb25zIFBDREV4IEV4cG9ydGVkIEZ1bmN0aW9ucw0KLSAqIEB7DQotICovDQotDQotLyoqIEBkZWZncm91cCBQQ0RFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMNCi0gICogQGJyaWVmICAgIFBDREV4IGNvbnRyb2wgZnVuY3Rpb25zDQotICAqDQotQHZlcmJhdGltDQotID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgICAgICAgICAgICAgICMjIyMjIEV4dGVuZGVkIGZlYXR1cmVzIGZ1bmN0aW9ucyAjIyMjIw0KLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86DQotICAgICAgKCspIFVwZGF0ZSBGSUZPIGNvbmZpZ3VyYXRpb24NCi0NCi1AZW5kdmVyYmF0aW0NCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICogQGJyaWVmICBDb25maWd1cmUgUE1BIGZvciBFUA0KLSAqIEBwYXJhbSAgaHBjZCAgRGV2aWNlIGluc3RhbmNlDQotICogQHBhcmFtICBlcF9hZGRyIGVuZHBvaW50IGFkZHJlc3MNCi0gKiBAcGFyYW0gIGVwX2tpbmQgZW5kcG9pbnQgS2luZA0KLSAqICAgICAgICAgICAgICAgICAgVVNCX1NOR19CVUY6IFNpbmdsZSBCdWZmZXIgdXNlZA0KLSAqICAgICAgICAgICAgICAgICAgVVNCX0RCTF9CVUY6IERvdWJsZSBCdWZmZXIgdXNlZA0KLSAqIEBwYXJhbSAgcG1hYWRyZXNzOiBFUCBhZGRyZXNzIGluIFRoZSBQTUE6IEluIGNhc2Ugb2Ygc2luZ2xlIGJ1ZmZlciBlbmRwb2ludA0KLSAqICAgICAgICAgICAgICAgICAgIHRoaXMgcGFyYW1ldGVyIGlzIDE2LWJpdCB2YWx1ZSBwcm92aWRpbmcgdGhlIGFkZHJlc3MNCi0gKiAgICAgICAgICAgICAgICAgICBpbiBQTUEgYWxsb2NhdGVkIHRvIGVuZHBvaW50Lg0KLSAqICAgICAgICAgICAgICAgICAgIEluIGNhc2Ugb2YgZG91YmxlIGJ1ZmZlciBlbmRwb2ludCB0aGlzIHBhcmFtZXRlcg0KLSAqICAgICAgICAgICAgICAgICAgIGlzIGEgMzItYml0IHZhbHVlIHByb3ZpZGluZyB0aGUgZW5kcG9pbnQgYnVmZmVyIDAgYWRkcmVzcw0KLSAqICAgICAgICAgICAgICAgICAgIGluIHRoZSBMU0IgcGFydCBvZiAzMi1iaXQgdmFsdWUgYW5kIGVuZHBvaW50IGJ1ZmZlciAxDQotICogYWRkcmVzcyBpbiB0aGUgTVNCIHBhcnQgb2YgMzItYml0IHZhbHVlLg0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLQ0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RFeF9QTUFDb25maWcoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHVpbnQxNl90IGVwX2FkZHIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBlcF9raW5kLCB1aW50MzJfdCBwbWFhZHJlc3MpIHsNCi0gIFBDRF9FUFR5cGVEZWYgKmVwOw0KLQ0KLSAgLyogaW5pdGlhbGl6ZSBlcCBzdHJ1Y3R1cmUqLw0KLSAgaWYgKCgweDgwVSAmIGVwX2FkZHIpID09IDB4ODBVKSB7DQotICAgIGVwID0gJmhwY2QtPklOX2VwW2VwX2FkZHIgJiBFUF9BRERSX01TS107DQotICB9IGVsc2Ugew0KLSAgICBlcCA9ICZocGNkLT5PVVRfZXBbZXBfYWRkcl07DQotICB9DQotDQotICAvKiBIZXJlIHdlIGNoZWNrIGlmIHRoZSBlbmRwb2ludCBpcyBzaW5nbGUgb3IgZG91YmxlIEJ1ZmZlciovDQotICBpZiAoZXBfa2luZCA9PSBQQ0RfU05HX0JVRikgew0KLSAgICAvKiBTaW5nbGUgQnVmZmVyICovDQotICAgIGVwLT5kb3VibGVidWZmZXIgPSAwVTsNCi0gICAgLyogQ29uZmlndXJlIHRoZSBQTUEgKi8NCi0gICAgZXAtPnBtYWFkcmVzcyA9ICh1aW50MTZfdClwbWFhZHJlc3M7DQotICB9DQotI2lmIChVU0VfVVNCX0RPVUJMRV9CVUZGRVIgPT0gMVUpDQotICBlbHNlIC8qIFVTQl9EQkxfQlVGICovDQotICB7DQotICAgIC8qIERvdWJsZSBCdWZmZXIgRW5kcG9pbnQgKi8NCi0gICAgZXAtPmRvdWJsZWJ1ZmZlciA9IDFVOw0KLSAgICAvKiBDb25maWd1cmUgdGhlIFBNQSAqLw0KLSAgICBlcC0+cG1hYWRkcjAgPSAodWludDE2X3QpKHBtYWFkcmVzcyAmIDB4RkZGRlUpOw0KLSAgICBlcC0+cG1hYWRkcjEgPSAodWludDE2X3QpKChwbWFhZHJlc3MgJiAweEZGRkYwMDAwVSkgPj4gMTYpOw0KLSAgfQ0KLSNlbmRpZiAvKiAoVVNFX1VTQl9ET1VCTEVfQlVGRkVSID09IDFVKSAqLw0KLQ0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBBY3RpdmF0ZSBCYXR0ZXJ5Q2hhcmdpbmcgZmVhdHVyZS4NCi0gKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQ0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RFeF9BY3RpdmF0ZUJDRChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCkgew0KLSAgVVNCX1R5cGVEZWYgKlVTQnggPSBocGNkLT5JbnN0YW5jZTsNCi0gIGhwY2QtPmJhdHRlcnlfY2hhcmdpbmdfYWN0aXZlID0gMVU7DQotDQotICAvKiBFbmFibGUgQkNEIGZlYXR1cmUgKi8NCi0gIFVTQngtPkJDRFIgfD0gVVNCX0JDRFJfQkNERU47DQotDQotICAvKiBFbmFibGUgRENEIDogRGF0YSBDb250YWN0IERldGVjdCAqLw0KLSAgVVNCeC0+QkNEUiAmPSB+KFVTQl9CQ0RSX1BERU4pOw0KLSAgVVNCeC0+QkNEUiAmPSB+KFVTQl9CQ0RSX1NERU4pOw0KLSAgVVNCeC0+QkNEUiB8PSBVU0JfQkNEUl9EQ0RFTjsNCi0NCi0gIHJldHVybiBIQUxfT0s7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGVhY3RpdmF0ZSBCYXR0ZXJ5Q2hhcmdpbmcgZmVhdHVyZS4NCi0gKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQ0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RFeF9EZUFjdGl2YXRlQkNEKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKSB7DQotICBVU0JfVHlwZURlZiAqVVNCeCA9IGhwY2QtPkluc3RhbmNlOw0KLSAgaHBjZC0+YmF0dGVyeV9jaGFyZ2luZ19hY3RpdmUgPSAwVTsNCi0NCi0gIC8qIERpc2FibGUgQkNEIGZlYXR1cmUgKi8NCi0gIFVTQngtPkJDRFIgJj0gfihVU0JfQkNEUl9CQ0RFTik7DQotDQotICByZXR1cm4gSEFMX09LOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEhhbmRsZSBCYXR0ZXJ5Q2hhcmdpbmcgUHJvY2Vzcy4NCi0gKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQ0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLXZvaWQgSEFMX1BDREV4X0JDRF9WQlVTRGV0ZWN0KFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKSB7DQotICBVU0JfVHlwZURlZiAqVVNCeCA9IGhwY2QtPkluc3RhbmNlOw0KLSAgdWludDMyX3QgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsNCi0NCi0gIC8qIFdhaXQgRGV0ZWN0IGZsYWcgb3IgYSB0aW1lb3V0IGlzIGhhcHBlbiAqLw0KLSAgd2hpbGUgKChVU0J4LT5CQ0RSICYgVVNCX0JDRFJfRENERVQpID09IDBVKSB7DQotICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLw0KLSAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gMTAwMFUpIHsNCi0jaWYgKFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkNCi0gICAgICBocGNkLT5CQ0RDYWxsYmFjayhocGNkLCBQQ0RfQkNEX0VSUk9SKTsNCi0jZWxzZQ0KLSAgICAgIEhBTF9QQ0RFeF9CQ0RfQ2FsbGJhY2soaHBjZCwgUENEX0JDRF9FUlJPUik7DQotI2VuZGlmIC8qIFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLQ0KLSAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgSEFMX0RlbGF5KDIwMFUpOw0KLQ0KLSAgLyogRGF0YSBQaW4gQ29udGFjdCA/IENoZWNrIERldGVjdCBmbGFnICovDQotICBpZiAoKFVTQngtPkJDRFIgJiBVU0JfQkNEUl9EQ0RFVCkgPT0gVVNCX0JDRFJfRENERVQpIHsNCi0jaWYgKFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkNCi0gICAgaHBjZC0+QkNEQ2FsbGJhY2soaHBjZCwgUENEX0JDRF9DT05UQUNUX0RFVEVDVElPTik7DQotI2Vsc2UNCi0gICAgSEFMX1BDREV4X0JDRF9DYWxsYmFjayhocGNkLCBQQ0RfQkNEX0NPTlRBQ1RfREVURUNUSU9OKTsNCi0jZW5kaWYgLyogVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotICB9DQotICAvKiBQcmltYXJ5IGRldGVjdGlvbjogY2hlY2tzIGlmIGNvbm5lY3RlZCB0byBTdGFuZGFyZCBEb3duc3RyZWFtIFBvcnQNCi0gICh3aXRob3V0IGNoYXJnaW5nIGNhcGFiaWxpdHkpICovDQotICBVU0J4LT5CQ0RSICY9IH4oVVNCX0JDRFJfRENERU4pOw0KLSAgSEFMX0RlbGF5KDUwVSk7DQotICBVU0J4LT5CQ0RSIHw9IChVU0JfQkNEUl9QREVOKTsNCi0gIEhBTF9EZWxheSg1MFUpOw0KLQ0KLSAgLyogSWYgQ2hhcmdlciBkZXRlY3QgPyAqLw0KLSAgaWYgKChVU0J4LT5CQ0RSICYgVVNCX0JDRFJfUERFVCkgPT0gVVNCX0JDRFJfUERFVCkgew0KLSAgICAvKiBTdGFydCBzZWNvbmRhcnkgZGV0ZWN0aW9uIHRvIGNoZWNrIGNvbm5lY3Rpb24gdG8gQ2hhcmdpbmcgRG93bnN0cmVhbQ0KLSAgICBQb3J0IG9yIERlZGljYXRlZCBDaGFyZ2luZyBQb3J0ICovDQotICAgIFVTQngtPkJDRFIgJj0gfihVU0JfQkNEUl9QREVOKTsNCi0gICAgSEFMX0RlbGF5KDUwVSk7DQotICAgIFVTQngtPkJDRFIgfD0gKFVTQl9CQ0RSX1NERU4pOw0KLSAgICBIQUxfRGVsYXkoNTBVKTsNCi0NCi0gICAgLyogSWYgQ0RQID8gKi8NCi0gICAgaWYgKChVU0J4LT5CQ0RSICYgVVNCX0JDRFJfU0RFVCkgPT0gVVNCX0JDRFJfU0RFVCkgew0KLSAgICAgIC8qIERlZGljYXRlZCBEb3duc3RyZWFtIFBvcnQgRENQICovDQotI2lmIChVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpDQotICAgICAgaHBjZC0+QkNEQ2FsbGJhY2soaHBjZCwgUENEX0JDRF9ERURJQ0FURURfQ0hBUkdJTkdfUE9SVCk7DQotI2Vsc2UNCi0gICAgICBIQUxfUENERXhfQkNEX0NhbGxiYWNrKGhwY2QsIFBDRF9CQ0RfREVESUNBVEVEX0NIQVJHSU5HX1BPUlQpOw0KLSNlbmRpZiAvKiBVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi0gICAgfSBlbHNlIHsNCi0gICAgICAvKiBDaGFyZ2luZyBEb3duc3RyZWFtIFBvcnQgQ0RQICovDQotI2lmIChVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpDQotICAgICAgaHBjZC0+QkNEQ2FsbGJhY2soaHBjZCwgUENEX0JDRF9DSEFSR0lOR19ET1dOU1RSRUFNX1BPUlQpOw0KLSNlbHNlDQotICAgICAgSEFMX1BDREV4X0JDRF9DYWxsYmFjayhocGNkLCBQQ0RfQkNEX0NIQVJHSU5HX0RPV05TVFJFQU1fUE9SVCk7DQotI2VuZGlmIC8qIFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLSAgICB9DQotICB9IGVsc2UgLyogTk8gKi8NCi0gIHsNCi0gICAgLyogU3RhbmRhcmQgRG93bnN0cmVhbSBQb3J0ICovDQotI2lmIChVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpDQotICAgIGhwY2QtPkJDRENhbGxiYWNrKGhwY2QsIFBDRF9CQ0RfU1REX0RPV05TVFJFQU1fUE9SVCk7DQotI2Vsc2UNCi0gICAgSEFMX1BDREV4X0JDRF9DYWxsYmFjayhocGNkLCBQQ0RfQkNEX1NURF9ET1dOU1RSRUFNX1BPUlQpOw0KLSNlbmRpZiAvKiBVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi0gIH0NCi0NCi0gIC8qIEJhdHRlcnkgQ2hhcmdpbmcgY2FwYWJpbGl0eSBkaXNjb3ZlcnkgZmluaXNoZWQgU3RhcnQgRW51bWVyYXRpb24gKi8NCi0gICh2b2lkKUhBTF9QQ0RFeF9EZUFjdGl2YXRlQkNEKGhwY2QpOw0KLSNpZiAoVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQ0KLSAgaHBjZC0+QkNEQ2FsbGJhY2soaHBjZCwgUENEX0JDRF9ESVNDT1ZFUllfQ09NUExFVEVEKTsNCi0jZWxzZQ0KLSAgSEFMX1BDREV4X0JDRF9DYWxsYmFjayhocGNkLCBQQ0RfQkNEX0RJU0NPVkVSWV9DT01QTEVURUQpOw0KLSNlbmRpZiAvKiBVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi19DQotDQotLyoqDQotICogQGJyaWVmICBBY3RpdmF0ZSBMUE0gZmVhdHVyZS4NCi0gKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQ0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RFeF9BY3RpdmF0ZUxQTShQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCkgew0KLSAgVVNCX1R5cGVEZWYgKlVTQnggPSBocGNkLT5JbnN0YW5jZTsNCi0gIGhwY2QtPmxwbV9hY3RpdmUgPSAxVTsNCi0gIGhwY2QtPkxQTV9TdGF0ZSA9IExQTV9MMDsNCi0NCi0gIFVTQngtPkxQTUNTUiB8PSBVU0JfTFBNQ1NSX0xNUEVOOw0KLSAgVVNCeC0+TFBNQ1NSIHw9IFVTQl9MUE1DU1JfTFBNQUNLOw0KLQ0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEZWFjdGl2YXRlIExQTSBmZWF0dXJlLg0KLSAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDREV4X0RlQWN0aXZhdGVMUE0oUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpIHsNCi0gIFVTQl9UeXBlRGVmICpVU0J4ID0gaHBjZC0+SW5zdGFuY2U7DQotDQotICBocGNkLT5scG1fYWN0aXZlID0gMFU7DQotDQotICBVU0J4LT5MUE1DU1IgJj0gfihVU0JfTFBNQ1NSX0xNUEVOKTsNCi0gIFVTQngtPkxQTUNTUiAmPSB+KFVTQl9MUE1DU1JfTFBNQUNLKTsNCi0NCi0gIHJldHVybiBIQUxfT0s7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2VuZCBMUE0gbWVzc2FnZSB0byB1c2VyIGxheWVyIGNhbGxiYWNrLg0KLSAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlDQotICogQHBhcmFtICBtc2cgTFBNIG1lc3NhZ2UNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1fX3dlYWsgdm9pZCBIQUxfUENERXhfTFBNX0NhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENEX0xQTV9Nc2dUeXBlRGVmIG1zZykgew0KLSAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLw0KLSAgVU5VU0VEKGhwY2QpOw0KLSAgVU5VU0VEKG1zZyk7DQotDQotICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsDQotICAgICAgICAgICAgdGhlIEhBTF9QQ0RFeF9MUE1fQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQ0KLSAgICovDQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2VuZCBCYXR0ZXJ5Q2hhcmdpbmcgbWVzc2FnZSB0byB1c2VyIGxheWVyIGNhbGxiYWNrLg0KLSAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlDQotICogQHBhcmFtICBtc2cgTFBNIG1lc3NhZ2UNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1fX3dlYWsgdm9pZCBIQUxfUENERXhfQkNEX0NhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENEX0JDRF9Nc2dUeXBlRGVmIG1zZykgew0KLSAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLw0KLSAgVU5VU0VEKGhwY2QpOw0KLSAgVU5VU0VEKG1zZyk7DQotDQotICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsDQotICAgICAgICAgICAgdGhlIEhBTF9QQ0RFeF9CQ0RfQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQ0KLSAgICovDQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0jZW5kaWYgLyogZGVmaW5lZCAoVVNCKSAqLw0KLSNlbmRpZiAvKiBIQUxfUENEX01PRFVMRV9FTkFCTEVEICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGZpbGUgICAgc3RtMzJnNHh4X2hhbF9wY2RfZXguYworICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAqIEBicmllZiAgIFBDRCBFeHRlbmRlZCBIQUwgbW9kdWxlIGRyaXZlci4KKyAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgVVNCIFBlcmlwaGVyYWwgQ29udHJvbGxlcjoKKyAqICAgICAgICAgICArIEV4dGVuZGVkIGZlYXR1cmVzIGZ1bmN0aW9ucworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBhdHRlbnRpb24KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRlcm1zIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUKKyAqIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4KKyAqIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcyB3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzR4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzR4eF9IQUxfRHJpdmVyCisgKiBAeworICovCisKKy8qKiBAZGVmZ3JvdXAgUENERXggUENERXgKKyAqIEBicmllZiBQQ0QgRXh0ZW5kZWQgSEFMIG1vZHVsZSBkcml2ZXIKKyAqIEB7CisgKi8KKworI2lmZGVmIEhBTF9QQ0RfTU9EVUxFX0VOQUJMRUQKKworI2lmIGRlZmluZWQoVVNCKQorLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIFBDREV4X0V4cG9ydGVkX0Z1bmN0aW9ucyBQQ0RFeCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAqIEB7CisgKi8KKworLyoqIEBkZWZncm91cCBQQ0RFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiBAYnJpZWYgICAgUENERXggY29udHJvbCBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAjIyMjIyBFeHRlbmRlZCBmZWF0dXJlcyBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBVcGRhdGUgRklGTyBjb25maWd1cmF0aW9uCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICogQGJyaWVmICBDb25maWd1cmUgUE1BIGZvciBFUAorICogQHBhcmFtICBocGNkICBEZXZpY2UgaW5zdGFuY2UKKyAqIEBwYXJhbSAgZXBfYWRkciBlbmRwb2ludCBhZGRyZXNzCisgKiBAcGFyYW0gIGVwX2tpbmQgZW5kcG9pbnQgS2luZAorICogICAgICAgICAgICAgICAgICBVU0JfU05HX0JVRjogU2luZ2xlIEJ1ZmZlciB1c2VkCisgKiAgICAgICAgICAgICAgICAgIFVTQl9EQkxfQlVGOiBEb3VibGUgQnVmZmVyIHVzZWQKKyAqIEBwYXJhbSAgcG1hYWRyZXNzOiBFUCBhZGRyZXNzIGluIFRoZSBQTUE6IEluIGNhc2Ugb2Ygc2luZ2xlIGJ1ZmZlciBlbmRwb2ludAorICogICAgICAgICAgICAgICAgICAgdGhpcyBwYXJhbWV0ZXIgaXMgMTYtYml0IHZhbHVlIHByb3ZpZGluZyB0aGUgYWRkcmVzcworICogICAgICAgICAgICAgICAgICAgaW4gUE1BIGFsbG9jYXRlZCB0byBlbmRwb2ludC4KKyAqICAgICAgICAgICAgICAgICAgIEluIGNhc2Ugb2YgZG91YmxlIGJ1ZmZlciBlbmRwb2ludCB0aGlzIHBhcmFtZXRlcgorICogICAgICAgICAgICAgICAgICAgaXMgYSAzMi1iaXQgdmFsdWUgcHJvdmlkaW5nIHRoZSBlbmRwb2ludCBidWZmZXIgMCBhZGRyZXNzCisgKiAgICAgICAgICAgICAgICAgICBpbiB0aGUgTFNCIHBhcnQgb2YgMzItYml0IHZhbHVlIGFuZCBlbmRwb2ludCBidWZmZXIgMQorICogYWRkcmVzcyBpbiB0aGUgTVNCIHBhcnQgb2YgMzItYml0IHZhbHVlLgorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDREV4X1BNQUNvbmZpZyhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDE2X3QgZXBfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgZXBfa2luZCwgdWludDMyX3QgcG1hYWRyZXNzKSB7CisgIFBDRF9FUFR5cGVEZWYgKmVwOworCisgIC8qIGluaXRpYWxpemUgZXAgc3RydWN0dXJlKi8KKyAgaWYgKCgweDgwVSAmIGVwX2FkZHIpID09IDB4ODBVKSB7CisgICAgZXAgPSAmaHBjZC0+SU5fZXBbZXBfYWRkciAmIEVQX0FERFJfTVNLXTsKKyAgfSBlbHNlIHsKKyAgICBlcCA9ICZocGNkLT5PVVRfZXBbZXBfYWRkcl07CisgIH0KKworICAvKiBIZXJlIHdlIGNoZWNrIGlmIHRoZSBlbmRwb2ludCBpcyBzaW5nbGUgb3IgZG91YmxlIEJ1ZmZlciovCisgIGlmIChlcF9raW5kID09IFBDRF9TTkdfQlVGKSB7CisgICAgLyogU2luZ2xlIEJ1ZmZlciAqLworICAgIGVwLT5kb3VibGVidWZmZXIgPSAwVTsKKyAgICAvKiBDb25maWd1cmUgdGhlIFBNQSAqLworICAgIGVwLT5wbWFhZHJlc3MgPSAodWludDE2X3QpcG1hYWRyZXNzOworICB9CisjaWYgKFVTRV9VU0JfRE9VQkxFX0JVRkZFUiA9PSAxVSkKKyAgZWxzZSAvKiBVU0JfREJMX0JVRiAqLworICB7CisgICAgLyogRG91YmxlIEJ1ZmZlciBFbmRwb2ludCAqLworICAgIGVwLT5kb3VibGVidWZmZXIgPSAxVTsKKyAgICAvKiBDb25maWd1cmUgdGhlIFBNQSAqLworICAgIGVwLT5wbWFhZGRyMCA9ICh1aW50MTZfdCkocG1hYWRyZXNzICYgMHhGRkZGVSk7CisgICAgZXAtPnBtYWFkZHIxID0gKHVpbnQxNl90KSgocG1hYWRyZXNzICYgMHhGRkZGMDAwMFUpID4+IDE2KTsKKyAgfQorI2VuZGlmIC8qIChVU0VfVVNCX0RPVUJMRV9CVUZGRVIgPT0gMVUpICovCisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgIEFjdGl2YXRlIEJhdHRlcnlDaGFyZ2luZyBmZWF0dXJlLgorICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENERXhfQWN0aXZhdGVCQ0QoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpIHsKKyAgVVNCX1R5cGVEZWYgKlVTQnggPSBocGNkLT5JbnN0YW5jZTsKKyAgaHBjZC0+YmF0dGVyeV9jaGFyZ2luZ19hY3RpdmUgPSAxVTsKKworICAvKiBFbmFibGUgQkNEIGZlYXR1cmUgKi8KKyAgVVNCeC0+QkNEUiB8PSBVU0JfQkNEUl9CQ0RFTjsKKworICAvKiBFbmFibGUgRENEIDogRGF0YSBDb250YWN0IERldGVjdCAqLworICBVU0J4LT5CQ0RSICY9IH4oVVNCX0JDRFJfUERFTik7CisgIFVTQngtPkJDRFIgJj0gfihVU0JfQkNEUl9TREVOKTsKKyAgVVNCeC0+QkNEUiB8PSBVU0JfQkNEUl9EQ0RFTjsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiAgRGVhY3RpdmF0ZSBCYXR0ZXJ5Q2hhcmdpbmcgZmVhdHVyZS4KKyAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDREV4X0RlQWN0aXZhdGVCQ0QoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpIHsKKyAgVVNCX1R5cGVEZWYgKlVTQnggPSBocGNkLT5JbnN0YW5jZTsKKyAgaHBjZC0+YmF0dGVyeV9jaGFyZ2luZ19hY3RpdmUgPSAwVTsKKworICAvKiBEaXNhYmxlIEJDRCBmZWF0dXJlICovCisgIFVTQngtPkJDRFIgJj0gfihVU0JfQkNEUl9CQ0RFTik7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgIEhhbmRsZSBCYXR0ZXJ5Q2hhcmdpbmcgUHJvY2Vzcy4KKyAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLwordm9pZCBIQUxfUENERXhfQkNEX1ZCVVNEZXRlY3QoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpIHsKKyAgVVNCX1R5cGVEZWYgKlVTQnggPSBocGNkLT5JbnN0YW5jZTsKKyAgdWludDMyX3QgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAvKiBXYWl0IGZvciBNaW4gRENEIFRpbWVvdXQgKi8KKyAgSEFMX0RlbGF5KDMwMFUpOworCisgIC8qIERhdGEgUGluIENvbnRhY3QgPyBDaGVjayBEZXRlY3QgZmxhZyAqLworICBpZiAoKFVTQngtPkJDRFIgJiBVU0JfQkNEUl9EQ0RFVCkgPT0gVVNCX0JDRFJfRENERVQpIHsKKyNpZiAoVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgIGhwY2QtPkJDRENhbGxiYWNrKGhwY2QsIFBDRF9CQ0RfQ09OVEFDVF9ERVRFQ1RJT04pOworI2Vsc2UKKyAgICBIQUxfUENERXhfQkNEX0NhbGxiYWNrKGhwY2QsIFBDRF9CQ0RfQ09OVEFDVF9ERVRFQ1RJT04pOworI2VuZGlmIC8qIFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisgIC8qIFByaW1hcnkgZGV0ZWN0aW9uOiBjaGVja3MgaWYgY29ubmVjdGVkIHRvIFN0YW5kYXJkIERvd25zdHJlYW0gUG9ydAorICAod2l0aG91dCBjaGFyZ2luZyBjYXBhYmlsaXR5KSAqLworICBVU0J4LT5CQ0RSICY9IH4oVVNCX0JDRFJfRENERU4pOworICBIQUxfRGVsYXkoNTBVKTsKKyAgVVNCeC0+QkNEUiB8PSAoVVNCX0JDRFJfUERFTik7CisgIEhBTF9EZWxheSg1MFUpOworCisgIC8qIElmIENoYXJnZXIgZGV0ZWN0ID8gKi8KKyAgaWYgKChVU0J4LT5CQ0RSICYgVVNCX0JDRFJfUERFVCkgPT0gVVNCX0JDRFJfUERFVCkgeworICAgIC8qIFN0YXJ0IHNlY29uZGFyeSBkZXRlY3Rpb24gdG8gY2hlY2sgY29ubmVjdGlvbiB0byBDaGFyZ2luZyBEb3duc3RyZWFtCisgICAgUG9ydCBvciBEZWRpY2F0ZWQgQ2hhcmdpbmcgUG9ydCAqLworICAgIFVTQngtPkJDRFIgJj0gfihVU0JfQkNEUl9QREVOKTsKKyAgICBIQUxfRGVsYXkoNTBVKTsKKyAgICBVU0J4LT5CQ0RSIHw9IChVU0JfQkNEUl9TREVOKTsKKyAgICBIQUxfRGVsYXkoNTBVKTsKKworICAgIC8qIElmIENEUCA/ICovCisgICAgaWYgKChVU0J4LT5CQ0RSICYgVVNCX0JDRFJfU0RFVCkgPT0gVVNCX0JDRFJfU0RFVCkgeworICAgICAgLyogRGVkaWNhdGVkIERvd25zdHJlYW0gUG9ydCBEQ1AgKi8KKyNpZiAoVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgICAgaHBjZC0+QkNEQ2FsbGJhY2soaHBjZCwgUENEX0JDRF9ERURJQ0FURURfQ0hBUkdJTkdfUE9SVCk7CisjZWxzZQorICAgICAgSEFMX1BDREV4X0JDRF9DYWxsYmFjayhocGNkLCBQQ0RfQkNEX0RFRElDQVRFRF9DSEFSR0lOR19QT1JUKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9IGVsc2UgeworICAgICAgLyogQ2hhcmdpbmcgRG93bnN0cmVhbSBQb3J0IENEUCAqLworI2lmIChVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgICBocGNkLT5CQ0RDYWxsYmFjayhocGNkLCBQQ0RfQkNEX0NIQVJHSU5HX0RPV05TVFJFQU1fUE9SVCk7CisjZWxzZQorICAgICAgSEFMX1BDREV4X0JDRF9DYWxsYmFjayhocGNkLCBQQ0RfQkNEX0NIQVJHSU5HX0RPV05TVFJFQU1fUE9SVCk7CisjZW5kaWYgLyogVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgfQorICB9IGVsc2UgLyogTk8gKi8KKyAgeworICAgIC8qIFN0YW5kYXJkIERvd25zdHJlYW0gUG9ydCAqLworI2lmIChVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgaHBjZC0+QkNEQ2FsbGJhY2soaHBjZCwgUENEX0JDRF9TVERfRE9XTlNUUkVBTV9QT1JUKTsKKyNlbHNlCisgICAgSEFMX1BDREV4X0JDRF9DYWxsYmFjayhocGNkLCBQQ0RfQkNEX1NURF9ET1dOU1RSRUFNX1BPUlQpOworI2VuZGlmIC8qIFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisKKyAgLyogQmF0dGVyeSBDaGFyZ2luZyBjYXBhYmlsaXR5IGRpc2NvdmVyeSBmaW5pc2hlZCBTdGFydCBFbnVtZXJhdGlvbiAqLworICAodm9pZClIQUxfUENERXhfRGVBY3RpdmF0ZUJDRChocGNkKTsKKworICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQsIGVsc2Ugc3RhcnQgVVNCIERldmljZSAqLworICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gMTAwMFUpIHsKKyNpZiAoVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgIGhwY2QtPkJDRENhbGxiYWNrKGhwY2QsIFBDRF9CQ0RfRVJST1IpOworI2Vsc2UKKyAgICBIQUxfUENERXhfQkNEX0NhbGxiYWNrKGhwY2QsIFBDRF9CQ0RfRVJST1IpOworI2VuZGlmIC8qIFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9IGVsc2UgeworI2lmIChVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgaHBjZC0+QkNEQ2FsbGJhY2soaHBjZCwgUENEX0JDRF9ESVNDT1ZFUllfQ09NUExFVEVEKTsKKyNlbHNlCisgICAgSEFMX1BDREV4X0JDRF9DYWxsYmFjayhocGNkLCBQQ0RfQkNEX0RJU0NPVkVSWV9DT01QTEVURUQpOworI2VuZGlmIC8qIFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9Cit9CisKKy8qKgorICogQGJyaWVmICBBY3RpdmF0ZSBMUE0gZmVhdHVyZS4KKyAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDREV4X0FjdGl2YXRlTFBNKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKSB7CisgIFVTQl9UeXBlRGVmICpVU0J4ID0gaHBjZC0+SW5zdGFuY2U7CisgIGhwY2QtPmxwbV9hY3RpdmUgPSAxVTsKKyAgaHBjZC0+TFBNX1N0YXRlID0gTFBNX0wwOworCisgIFVTQngtPkxQTUNTUiB8PSBVU0JfTFBNQ1NSX0xNUEVOOworICBVU0J4LT5MUE1DU1IgfD0gVVNCX0xQTUNTUl9MUE1BQ0s7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgIERlYWN0aXZhdGUgTFBNIGZlYXR1cmUuCisgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RFeF9EZUFjdGl2YXRlTFBNKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKSB7CisgIFVTQl9UeXBlRGVmICpVU0J4ID0gaHBjZC0+SW5zdGFuY2U7CisKKyAgaHBjZC0+bHBtX2FjdGl2ZSA9IDBVOworCisgIFVTQngtPkxQTUNTUiAmPSB+KFVTQl9MUE1DU1JfTE1QRU4pOworICBVU0J4LT5MUE1DU1IgJj0gfihVU0JfTFBNQ1NSX0xQTUFDSyk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgIFNlbmQgTFBNIG1lc3NhZ2UgdG8gdXNlciBsYXllciBjYWxsYmFjay4KKyAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgKiBAcGFyYW0gIG1zZyBMUE0gbWVzc2FnZQorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK19fd2VhayB2b2lkIEhBTF9QQ0RFeF9MUE1fQ2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDRF9MUE1fTXNnVHlwZURlZiBtc2cpIHsKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHBjZCk7CisgIFVOVVNFRChtc2cpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfUENERXhfTFBNX0NhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICogQGJyaWVmICBTZW5kIEJhdHRlcnlDaGFyZ2luZyBtZXNzYWdlIHRvIHVzZXIgbGF5ZXIgY2FsbGJhY2suCisgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICogQHBhcmFtICBtc2cgTFBNIG1lc3NhZ2UKKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitfX3dlYWsgdm9pZCBIQUxfUENERXhfQkNEX0NhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0RfQkNEX01zZ1R5cGVEZWYgbXNnKSB7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhwY2QpOworICBVTlVTRUQobXNnKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1BDREV4X0JDRF9DYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCisjZW5kaWYgLyogZGVmaW5lZCAoVVNCKSAqLworI2VuZGlmIC8qIEhBTF9QQ0RfTU9EVUxFX0VOQUJMRUQgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLwpkaWZmIC0tZ2l0IGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3B3ci5jIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3B3ci5jCmluZGV4IGU2ZTdlMGQuLjlkZmFmOGEgMTAwNjQ0Ci0tLSBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9wd3IuYworKysgYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfcHdyLmMKQEAgLTEsNjM2ICsxLDYzNiBAQAotLyoqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEBmaWxlICAgIHN0bTMyZzR4eF9oYWxfcHdyLmMNCi0gKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQ0KLSAqIEBicmllZiAgIFBXUiBIQUwgbW9kdWxlIGRyaXZlci4NCi0gKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nDQotICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBQb3dlciBDb250cm9sbGVyIChQV1IpIHBlcmlwaGVyYWw6DQotICogICAgICAgICAgICsgSW5pdGlhbGl6YXRpb24vZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zDQotICogICAgICAgICAgICsgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucw0KLSAqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEBhdHRlbnRpb24NCi0gKg0KLSAqIENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4NCi0gKg0KLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGVybXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZQ0KLSAqIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4NCi0gKiBJZiBubyBMSUNFTlNFIGZpbGUgY29tZXMgd2l0aCB0aGlzIHNvZnR3YXJlLCBpdCBpcyBwcm92aWRlZCBBUy1JUy4NCi0gKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKi8NCi0NCi0vKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpbmNsdWRlICJzdG0zMmc0eHhfaGFsLmgiDQotDQotLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzR4eF9IQUxfRHJpdmVyDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFBXUiBQV1INCi0gKiBAYnJpZWYgUFdSIEhBTCBtb2R1bGUgZHJpdmVyDQotICogQHsNCi0gKi8NCi0NCi0jaWZkZWYgSEFMX1BXUl9NT0RVTEVfRU5BQkxFRA0KLQ0KLS8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0NCi0vKiogQGRlZmdyb3VwIFBXUl9Qcml2YXRlX0RlZmluZXMgUFdSIFByaXZhdGUgRGVmaW5lcw0KLSAqIEB7DQotICovDQotDQotLyoqIEBkZWZncm91cCBQV1JfUFZEX01vZGVfTWFzayBQV1IgUFZEIE1vZGUgTWFzaw0KLSAqIEB7DQotICovDQotI2RlZmluZSBQVkRfTU9ERV9JVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAoKHVpbnQzMl90KTB4MDAwMTAwMDApIC8qITwgTWFzayBmb3IgaW50ZXJydXB0aW9uIHlpZWxkZWQgYnkgUFZEIHRocmVzaG9sZCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyb3NzaW5nICovDQotI2RlZmluZSBQVkRfTU9ERV9FVlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgodWludDMyX3QpMHgwMDAyMDAwMCkgLyohPCBNYXNrIGZvciBldmVudCB5aWVsZGVkIGJ5IFBWRCB0aHJlc2hvbGQgY3Jvc3NpbmcgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFBWRF9SSVNJTkdfRURHRSBcDQotICAoKHVpbnQzMl90KTB4MDAwMDAwMDEpIC8qITwgTWFzayBmb3IgcmlzaW5nIGVkZ2Ugc2V0IGFzIFBWRCB0cmlnZ2VyICovDQotI2RlZmluZSBQVkRfRkFMTElOR19FREdFIFwNCi0gICgodWludDMyX3QpMHgwMDAwMDAwMikgLyohPCBNYXNrIGZvciBmYWxsaW5nIGVkZ2Ugc2V0IGFzIFBWRCB0cmlnZ2VyICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotDQotLyoqIEBkZWZncm91cCBQV1JfRXhwb3J0ZWRfRnVuY3Rpb25zIFBXUiBFeHBvcnRlZCBGdW5jdGlvbnMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUFdSX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uDQotZnVuY3Rpb25zDQotICAqICBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucw0KLSAgKg0KLUB2ZXJiYXRpbQ0KLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgICAgICAgICAgICAjIyMjIyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICMjIyMjDQotID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgWy4uXQ0KLQ0KLUBlbmR2ZXJiYXRpbQ0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgRGVpbml0aWFsaXplIHRoZSBIQUwgUFdSIHBlcmlwaGVyYWwgcmVnaXN0ZXJzIHRvIHRoZWlyIGRlZmF1bHQgcmVzZXQNCi0gKiB2YWx1ZXMuDQotICogQHJldHZhbCBOb25lDQotICovDQotdm9pZCBIQUxfUFdSX0RlSW5pdCh2b2lkKSB7DQotICBfX0hBTF9SQ0NfUFdSX0ZPUkNFX1JFU0VUKCk7DQotICBfX0hBTF9SQ0NfUFdSX1JFTEVBU0VfUkVTRVQoKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmIEVuYWJsZSBhY2Nlc3MgdG8gdGhlIGJhY2t1cCBkb21haW4NCi0gKiAgICAgICAgKFJUQyByZWdpc3RlcnMsIFJUQyBiYWNrdXAgZGF0YSByZWdpc3RlcnMpLg0KLSAqIEBub3RlICBBZnRlciByZXNldCwgdGhlIGJhY2t1cCBkb21haW4gaXMgcHJvdGVjdGVkIGFnYWluc3QNCi0gKiAgICAgICAgcG9zc2libGUgdW53YW50ZWQgd3JpdGUgYWNjZXNzZXMuDQotICogQG5vdGUgIFJUQ1NFTCB0aGF0IHNldHMgdGhlIFJUQyBjbG9jayBzb3VyY2Ugc2VsZWN0aW9uIGlzIGluIHRoZSBSVEMgYmFjay11cA0KLSAqIGRvbWFpbi4gSW4gb3JkZXIgdG8gc2V0IG9yIG1vZGlmeSB0aGUgUlRDIGNsb2NrLCB0aGUgYmFja3VwIGRvbWFpbiBhY2Nlc3MNCi0gKiBtdXN0IGJlIGRpc2FibGVkLg0KLSAqIEBub3RlICBMU0VPTiBiaXQgdGhhdCBzd2l0Y2hlcyBvbiBhbmQgb2ZmIHRoZSBMU0UgY3J5c3RhbCBiZWxvbmdzIGFzIHdlbGwgdG8NCi0gKiB0aGUgYmFjay11cCBkb21haW4uDQotICogQHJldHZhbCBOb25lDQotICovDQotdm9pZCBIQUxfUFdSX0VuYWJsZUJrVXBBY2Nlc3Modm9pZCkgeyBTRVRfQklUKFBXUi0+Q1IxLCBQV1JfQ1IxX0RCUCk7IH0NCi0NCi0vKioNCi0gKiBAYnJpZWYgRGlzYWJsZSBhY2Nlc3MgdG8gdGhlIGJhY2t1cCBkb21haW4NCi0gKiAgICAgICAgKFJUQyByZWdpc3RlcnMsIFJUQyBiYWNrdXAgZGF0YSByZWdpc3RlcnMpLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXZvaWQgSEFMX1BXUl9EaXNhYmxlQmtVcEFjY2Vzcyh2b2lkKSB7IENMRUFSX0JJVChQV1ItPkNSMSwgUFdSX0NSMV9EQlApOyB9DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFBXUl9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMNCi0gICogIEBicmllZiBMb3cgUG93ZXIgbW9kZXMgY29uZmlndXJhdGlvbiBmdW5jdGlvbnMNCi0gICoNCi1AdmVyYmF0aW0NCi0NCi0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICAgICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAjIyMjIw0KLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotICAgICBbLi5dDQotICAgICAqKiogUFZEIGNvbmZpZ3VyYXRpb24gKioqDQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgWy4uXQ0KLSAgICAgICgrKSBUaGUgUFZEIGlzIHVzZWQgdG8gbW9uaXRvciB0aGUgVkREIHBvd2VyIHN1cHBseSBieSBjb21wYXJpbmcgaXQgdG8gYQ0KLSAgICAgICAgICB0aHJlc2hvbGQgc2VsZWN0ZWQgYnkgdGhlIFBWRCBMZXZlbCAoUExTWzI6MF0gYml0cyBpbiBQV1JfQ1IyDQotcmVnaXN0ZXIpLg0KLQ0KLSAgICAgICgrKSBQVkRPIGZsYWcgaXMgYXZhaWxhYmxlIHRvIGluZGljYXRlIGlmIFZERC9WRERBIGlzIGhpZ2hlciBvciBsb3dlcg0KLSAgICAgICAgICB0aGFuIHRoZSBQVkQgdGhyZXNob2xkLiBUaGlzIGV2ZW50IGlzIGludGVybmFsbHkgY29ubmVjdGVkIHRvIHRoZSBFWFRJDQotICAgICAgICAgIGxpbmUxNiBhbmQgY2FuIGdlbmVyYXRlIGFuIGludGVycnVwdCBpZiBlbmFibGVkLiBUaGlzIGlzIGRvbmUgdGhyb3VnaA0KLSAgICAgICAgICBfX0hBTF9QVkRfRVhUSV9FTkFCTEVfSVQoKSBtYWNyby4NCi0gICAgICAoKykgVGhlIFBWRCBpcyBzdG9wcGVkIGluIFN0YW5kYnkgbW9kZS4NCi0NCi0NCi0gICAgKioqIFdha2VVcCBwaW4gY29uZmlndXJhdGlvbiAqKioNCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgWy4uXQ0KLSAgICAgICgrKSBXYWtlVXAgcGlucyBhcmUgdXNlZCB0byB3YWtldXAgdGhlIHN5c3RlbSBmcm9tIFN0YW5kYnkgbW9kZSBvcg0KLVNodXRkb3duIG1vZGUuIFRoZSBwb2xhcml0eSBvZiB0aGVzZSBwaW5zIGNhbiBiZSBzZXQgdG8gY29uZmlndXJlIGV2ZW50DQotZGV0ZWN0aW9uIG9uIGhpZ2ggbGV2ZWwgKHJpc2luZyBlZGdlKSBvciBsb3cgbGV2ZWwgKGZhbGxpbmcgZWRnZSkuDQotDQotDQotDQotICAgICoqKiBMb3cgUG93ZXIgbW9kZXMgY29uZmlndXJhdGlvbiAqKioNCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICBbLi5dDQotICAgICAgVGhlIGRldmljZXMgZmVhdHVyZSA4IGxvdy1wb3dlciBtb2RlczoNCi0gICAgICAoKykgTG93LXBvd2VyIFJ1biBtb2RlOiBjb3JlIGFuZCBwZXJpcGhlcmFscyBhcmUgcnVubmluZywgbWFpbiByZWd1bGF0b3INCi1vZmYsIGxvdyBwb3dlciByZWd1bGF0b3Igb24uDQotICAgICAgKCspIFNsZWVwIG1vZGU6IENvcnRleC1NNCBjb3JlIHN0b3BwZWQsIHBlcmlwaGVyYWxzIGtlcHQgcnVubmluZywgbWFpbiBhbmQNCi1sb3cgcG93ZXIgcmVndWxhdG9ycyBvbi4NCi0gICAgICAoKykgTG93LXBvd2VyIFNsZWVwIG1vZGU6IENvcnRleC1NNCBjb3JlIHN0b3BwZWQsIHBlcmlwaGVyYWxzIGtlcHQNCi1ydW5uaW5nLCBtYWluIHJlZ3VsYXRvciBvZmYsIGxvdyBwb3dlciByZWd1bGF0b3Igb24uDQotICAgICAgKCspIFN0b3AgMCBtb2RlOiBhbGwgY2xvY2tzIGFyZSBzdG9wcGVkIGV4Y2VwdCBMU0kgYW5kIExTRSwgbWFpbiBhbmQgbG93DQotcG93ZXIgcmVndWxhdG9ycyBvbi4NCi0gICAgICAoKykgU3RvcCAxIG1vZGU6IGFsbCBjbG9ja3MgYXJlIHN0b3BwZWQgZXhjZXB0IExTSSBhbmQgTFNFLCBtYWluIHJlZ3VsYXRvcg0KLW9mZiwgbG93IHBvd2VyIHJlZ3VsYXRvciBvbi4NCi0gICAgICAoKykgU3RhbmRieSBtb2RlIHdpdGggU1JBTTI6IGFsbCBjbG9ja3MgYXJlIHN0b3BwZWQgZXhjZXB0IExTSSBhbmQgTFNFLA0KLVNSQU0yIGNvbnRlbnQgcHJlc2VydmVkLCBtYWluIHJlZ3VsYXRvciBvZmYsIGxvdyBwb3dlciByZWd1bGF0b3Igb24uDQotICAgICAgKCspIFN0YW5kYnkgbW9kZSB3aXRob3V0IFNSQU0yOiBhbGwgY2xvY2tzIGFyZSBzdG9wcGVkIGV4Y2VwdCBMU0kgYW5kIExTRSwNCi1tYWluIGFuZCBsb3cgcG93ZXIgcmVndWxhdG9ycyBvZmYuDQotICAgICAgKCspIFNodXRkb3duIG1vZGU6IGFsbCBjbG9ja3MgYXJlIHN0b3BwZWQgZXhjZXB0IExTRSwgbWFpbiBhbmQgbG93IHBvd2VyDQotcmVndWxhdG9ycyBvZmYuDQotDQotDQotICAgKioqIExvdy1wb3dlciBydW4gbW9kZSAqKioNCi0gICA9PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICBbLi5dDQotICAgICAgKCspIEVudHJ5OiAoZnJvbSBtYWluIHJ1biBtb2RlKQ0KLSAgICAgICAgKCsrKSBzZXQgTFBSIGJpdCB3aXRoIEhBTF9QV1JFeF9FbmFibGVMb3dQb3dlclJ1bk1vZGUoKSBBUEkgYWZ0ZXIgaGF2aW5nDQotZGVjcmVhc2VkIHRoZSBzeXN0ZW0gY2xvY2sgYmVsb3cgMiBNSHouDQotDQotICAgICAgKCspIEV4aXQ6DQotICAgICAgICAoKyspIGNsZWFyIExQUiBiaXQgdGhlbiB3YWl0IGZvciBSRUdMUCBiaXQgdG8gYmUgcmVzZXQgd2l0aA0KLUhBTF9QV1JFeF9EaXNhYmxlTG93UG93ZXJSdW5Nb2RlKCkgQVBJLiBPbmx5IHRoZW4gY2FuIHRoZSBzeXN0ZW0gY2xvY2sgZnJlcXVlbmN5DQotYmUgaW5jcmVhc2VkIGFib3ZlIDIgTUh6Lg0KLQ0KLQ0KLSAgICoqKiBTbGVlcCBtb2RlIC8gTG93LXBvd2VyIHNsZWVwIG1vZGUgKioqDQotICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgWy4uXQ0KLSAgICAgICgrKSBFbnRyeToNCi0gICAgICAgICAgVGhlIFNsZWVwIG1vZGUgLyBMb3ctcG93ZXIgU2xlZXAgbW9kZSBpcyBlbnRlcmVkIHRocm91Z2gNCi1IQUxfUFdSX0VudGVyU0xFRVBNb2RlKCkgQVBJIGluIHNwZWNpZnlpbmcgd2hldGhlciBvciBub3QgdGhlIHJlZ3VsYXRvciBpcw0KLWZvcmNlZCB0byBsb3ctcG93ZXIgbW9kZSBhbmQgaWYgZXhpdCBpcyBpbnRlcnJ1cHQgb3IgZXZlbnQtdHJpZ2dlcmVkLg0KLSAgICAgICAgICAoKyspIFBXUl9NQUlOUkVHVUxBVE9SX09OOiBTbGVlcCBtb2RlIChyZWd1bGF0b3IgaW4gbWFpbiBtb2RlKS4NCi0gICAgICAgICAgKCsrKSBQV1JfTE9XUE9XRVJSRUdVTEFUT1JfT046IExvdy1wb3dlciBzbGVlcCAocmVndWxhdG9yIGluIGxvdyBwb3dlcg0KLW1vZGUpLiBJbiB0aGUgbGF0dGVyIGNhc2UsIHRoZSBzeXN0ZW0gY2xvY2sgZnJlcXVlbmN5IG11c3QgaGF2ZSBiZWVuIGRlY3JlYXNlZA0KLWJlbG93IDIgTUh6IGJlZm9yZWhhbmQuDQotICAgICAgICAgICgrKykgUFdSX1NMRUVQRU5UUllfV0ZJOiBlbnRlciBTTEVFUCBtb2RlIHdpdGggV0ZJIGluc3RydWN0aW9uDQotICAgICAgICAgICgrKykgUFdSX1NMRUVQRU5UUllfV0ZFOiBlbnRlciBTTEVFUCBtb2RlIHdpdGggV0ZFIGluc3RydWN0aW9uDQotDQotICAgICAgKCspIFdGSSBFeGl0Og0KLSAgICAgICAgKCsrKSBBbnkgcGVyaXBoZXJhbCBpbnRlcnJ1cHQgYWNrbm93bGVkZ2VkIGJ5IHRoZSBuZXN0ZWQgdmVjdG9yZWQNCi1pbnRlcnJ1cHQgY29udHJvbGxlciAoTlZJQykgb3IgYW55IHdha2UtdXAgZXZlbnQuDQotDQotICAgICAgKCspIFdGRSBFeGl0Og0KLSAgICAgICAgKCsrKSBBbnkgd2FrZS11cCBldmVudCBzdWNoIGFzIGFuIEVYVEkgbGluZSBjb25maWd1cmVkIGluIGV2ZW50IG1vZGUuDQotDQotICAgICAgICAgWy4uXSBXaGVuIGV4aXRpbmcgdGhlIExvdy1wb3dlciBzbGVlcCBtb2RlIGJ5IGlzc3VpbmcgYW4gaW50ZXJydXB0IG9yIGENCi13YWtldXAgZXZlbnQsIHRoZSBNQ1UgaXMgaW4gTG93LXBvd2VyIFJ1biBtb2RlLg0KLQ0KLSAgICoqKiBTdG9wIDAsIFN0b3AgMSBtb2RlcyAqKioNCi0gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgIFsuLl0NCi0gICAgICAoKykgRW50cnk6DQotICAgICAgICAgIFRoZSBTdG9wIDAsIFN0b3AgMSBtb2RlcyBhcmUgZW50ZXJlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgQVBJJ3M6DQotICAgICAgICAgICgrKykgSEFMX1BXUkV4X0VudGVyU1RPUDBNb2RlKCkgZm9yIG1vZGUgMCBvcg0KLUhBTF9QV1JFeF9FbnRlclNUT1AxTW9kZSgpIGZvciBtb2RlIDEgb3IgZm9yIHBvcnRpbmcgcmVhc29ucw0KLUhBTF9QV1JfRW50ZXJTVE9QTW9kZSgpLg0KLSAgICAgICgrKSBSZWd1bGF0b3Igc2V0dGluZyAoYXBwbGljYWJsZSB0byBIQUxfUFdSX0VudGVyU1RPUE1vZGUoKSBvbmx5KToNCi0gICAgICAgICAgKCsrKSBQV1JfTUFJTlJFR1VMQVRPUl9PTg0KLSAgICAgICAgICAoKyspIFBXUl9MT1dQT1dFUlJFR1VMQVRPUl9PTg0KLSAgICAgICgrKSBFeGl0IChpbnRlcnJ1cHQgb3IgZXZlbnQtdHJpZ2dlcmVkLCBzcGVjaWZpZWQgd2hlbiBlbnRlcmluZyBTVE9QDQotbW9kZSk6DQotICAgICAgICAgICgrKykgUFdSX1NUT1BFTlRSWV9XRkk6IGVudGVyIFN0b3AgbW9kZSB3aXRoIFdGSSBpbnN0cnVjdGlvbg0KLSAgICAgICAgICAoKyspIFBXUl9TVE9QRU5UUllfV0ZFOiBlbnRlciBTdG9wIG1vZGUgd2l0aCBXRkUgaW5zdHJ1Y3Rpb24NCi0NCi0gICAgICAoKykgV0ZJIEV4aXQ6DQotICAgICAgICAgICgrKykgQW55IEVYVEkgTGluZSAoSW50ZXJuYWwgb3IgRXh0ZXJuYWwpIGNvbmZpZ3VyZWQgaW4gSW50ZXJydXB0DQotbW9kZS4NCi0gICAgICAgICAgKCsrKSBTb21lIHNwZWNpZmljIGNvbW11bmljYXRpb24gcGVyaXBoZXJhbHMgKFVTQVJULCBMUFVBUlQsIEkyQykNCi1pbnRlcnJ1cHRzIHdoZW4gcHJvZ3JhbW1lZCBpbiB3YWtldXAgbW9kZS4NCi0gICAgICAoKykgV0ZFIEV4aXQ6DQotICAgICAgICAgICgrKykgQW55IEVYVEkgTGluZSAoSW50ZXJuYWwgb3IgRXh0ZXJuYWwpIGNvbmZpZ3VyZWQgaW4gRXZlbnQgbW9kZS4NCi0NCi0gICAgICAgWy4uXQ0KLSAgICAgICAgICBXaGVuIGV4aXRpbmcgU3RvcCAwIGFuZCBTdG9wIDEgbW9kZXMsIHRoZSBNQ1UgaXMgZWl0aGVyIGluIFJ1biBtb2RlIG9yDQotaW4gTG93LXBvd2VyIFJ1biBtb2RlIGRlcGVuZGluZyBvbiB0aGUgTFBSIGJpdCBzZXR0aW5nLg0KLQ0KLSAgICoqKiBTdGFuZGJ5IG1vZGUgKioqDQotICAgPT09PT09PT09PT09PT09PT09PT0NCi0gICAgIFsuLl0NCi0gICAgICBUaGUgU3RhbmRieSBtb2RlIG9mZmVycyB0d28gb3B0aW9uczoNCi0gICAgICAoKykgb3B0aW9uIGEpIGFsbCBjbG9ja3Mgb2ZmIGV4Y2VwdCBMU0kgYW5kIExTRSwgUlJTIGJpdCBzZXQgKGtlZXBzDQotdm9sdGFnZSByZWd1bGF0b3IgaW4gbG93IHBvd2VyIG1vZGUpLiBTUkFNIGFuZCByZWdpc3RlcnMgY29udGVudHMgYXJlIGxvc3QNCi1leGNlcHQgZm9yIHRoZSBTUkFNMiBjb250ZW50LCB0aGUgUlRDIHJlZ2lzdGVycywgUlRDIGJhY2t1cCByZWdpc3RlcnMgYW5kDQotU3RhbmRieSBjaXJjdWl0cnkuDQotICAgICAgKCspIG9wdGlvbiBiKSBhbGwgY2xvY2tzIG9mZiBleGNlcHQgTFNJIGFuZCBMU0UsIFJSUyBiaXQgY2xlYXJlZCAodm9sdGFnZQ0KLXJlZ3VsYXRvciB0aGVuIGRpc2FibGVkKS4gU1JBTSBhbmQgcmVnaXN0ZXIgY29udGVudHMgYXJlIGxvc3QgZXhjZXB0IGZvciB0aGUgUlRDDQotcmVnaXN0ZXJzLCBSVEMgYmFja3VwIHJlZ2lzdGVycyBhbmQgU3RhbmRieSBjaXJjdWl0cnkuDQotDQotICAgICAgKCsrKSBFbnRyeToNCi0gICAgICAgICAgKCsrKykgVGhlIFN0YW5kYnkgbW9kZSBpcyBlbnRlcmVkIHRocm91Z2ggSEFMX1BXUl9FbnRlclNUQU5EQllNb2RlKCkNCi1BUEkuIFNSQU0xIGFuZCByZWdpc3RlciBjb250ZW50cyBhcmUgbG9zdCBleGNlcHQgZm9yIHJlZ2lzdGVycyBpbiB0aGUgQmFja3VwDQotZG9tYWluIGFuZCBTdGFuZGJ5IGNpcmN1aXRyeS4gU1JBTTIgY29udGVudCBjYW4gYmUgcHJlc2VydmVkIGlmIHRoZSBiaXQgUlJTIGlzDQotc2V0IGluIFBXUl9DUjMgcmVnaXN0ZXIuIFRvIGVuYWJsZSB0aGlzIGZlYXR1cmUsIHRoZSB1c2VyIGNhbiByZXNvcnQgdG8NCi1IQUxfUFdSRXhfRW5hYmxlU1JBTTJDb250ZW50UmV0ZW50aW9uKCkgQVBJIHRvIHNldCBSUlMgYml0Lg0KLQ0KLSAgICAgICgrKykgRXhpdDoNCi0gICAgICAgICAgKCsrKykgV0tVUCBwaW4gcmlzaW5nIGVkZ2UsIFJUQyBhbGFybSBvciB3YWtldXAsIHRhbXBlciBldmVudCwNCi10aW1lLXN0YW1wIGV2ZW50LCBleHRlcm5hbCByZXNldCBpbiBOUlNUIHBpbiwgSVdERyByZXNldC4NCi0NCi0gICAgICBbLi5dICAgIEFmdGVyIHdha2luZyB1cCBmcm9tIFN0YW5kYnkgbW9kZSwgcHJvZ3JhbSBleGVjdXRpb24gcmVzdGFydHMgaW4NCi10aGUgc2FtZSB3YXkgYXMgYWZ0ZXIgYSBSZXNldC4NCi0NCi0NCi0gICAgKioqIFNodXRkb3duIG1vZGUgKioqDQotICAgPT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICAgWy4uXQ0KLSAgICAgIEluIFNodXRkb3duIG1vZGUsDQotICAgICAgICB2b2x0YWdlIHJlZ3VsYXRvciBpcyBkaXNhYmxlZCwgYWxsIGNsb2NrcyBhcmUgb2ZmIGV4Y2VwdCBMU0UsIFJSUyBiaXQgaXMNCi1jbGVhcmVkLiBTUkFNIGFuZCByZWdpc3RlcnMgY29udGVudHMgYXJlIGxvc3QgZXhjZXB0IGZvciBiYWNrdXAgZG9tYWluDQotcmVnaXN0ZXJzLg0KLQ0KLSAgICAgICgrKSBFbnRyeToNCi0gICAgICAgICAgVGhlIFNodXRkb3duIG1vZGUgaXMgZW50ZXJlZCB0aHJvdWdoIEhBTF9QV1JFeF9FbnRlclNIVVRET1dOTW9kZSgpDQotQVBJLg0KLQ0KLSAgICAgICgrKSBFeGl0Og0KLSAgICAgICAgICAoKyspIFdLVVAgcGluIHJpc2luZyBlZGdlLCBSVEMgYWxhcm0gb3Igd2FrZXVwLCB0YW1wZXIgZXZlbnQsDQotdGltZS1zdGFtcCBldmVudCwgZXh0ZXJuYWwgcmVzZXQgaW4gTlJTVCBwaW4uDQotDQotICAgICAgICAgWy4uXSBBZnRlciB3YWtpbmcgdXAgZnJvbSBTaHV0ZG93biBtb2RlLCBwcm9ncmFtIGV4ZWN1dGlvbiByZXN0YXJ0cyBpbg0KLXRoZSBzYW1lIHdheSBhcyBhZnRlciBhIFJlc2V0Lg0KLQ0KLQ0KLSAgICoqKiBBdXRvLXdha2V1cCAoQVdVKSBmcm9tIGxvdy1wb3dlciBtb2RlICoqKg0KLSAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICBbLi5dDQotICAgICAgVGhlIE1DVSBjYW4gYmUgd29rZW4gdXAgZnJvbSBsb3ctcG93ZXIgbW9kZSBieSBhbiBSVEMgQWxhcm0gZXZlbnQsIGFuIFJUQw0KLSAgICAgIFdha2V1cCBldmVudCwgYSB0YW1wZXIgZXZlbnQgb3IgYSB0aW1lLXN0YW1wIGV2ZW50LCB3aXRob3V0IGRlcGVuZGluZyBvbg0KLSAgICAgIGFuIGV4dGVybmFsIGludGVycnVwdCAoQXV0by13YWtldXAgbW9kZSkuDQotDQotICAgICAgKCspIFJUQyBhdXRvLXdha2V1cCAoQVdVKSBmcm9tIHRoZSBTdG9wLCBTdGFuZGJ5IGFuZCBTaHV0ZG93biBtb2Rlcw0KLQ0KLQ0KLSAgICAgICAgKCsrKSBUbyB3YWtlIHVwIGZyb20gdGhlIFN0b3AgbW9kZSB3aXRoIGFuIFJUQyBhbGFybSBldmVudCwgaXQgaXMNCi1uZWNlc3NhcnkgdG8gY29uZmlndXJlIHRoZSBSVEMgdG8gZ2VuZXJhdGUgdGhlIFJUQyBhbGFybSB1c2luZyB0aGUNCi1IQUxfUlRDX1NldEFsYXJtX0lUKCkgZnVuY3Rpb24uDQotDQotICAgICAgICAoKyspIFRvIHdha2UgdXAgZnJvbSB0aGUgU3RvcCBtb2RlIHdpdGggYW4gUlRDIFRhbXBlciBvciB0aW1lIHN0YW1wDQotZXZlbnQsIGl0IGlzIG5lY2Vzc2FyeSB0byBjb25maWd1cmUgdGhlIFJUQyB0byBkZXRlY3QgdGhlIHRhbXBlciBvciB0aW1lIHN0YW1wDQotZXZlbnQgdXNpbmcgdGhlIEhBTF9SVENFeF9TZXRUaW1lU3RhbXBfSVQoKSBvciBIQUxfUlRDRXhfU2V0VGFtcGVyX0lUKCkNCi1mdW5jdGlvbnMuDQotDQotICAgICAgICAoKyspIFRvIHdha2UgdXAgZnJvbSB0aGUgU3RvcCBtb2RlIHdpdGggYW4gUlRDIFdha2VVcCBldmVudCwgaXQgaXMNCi1uZWNlc3NhcnkgdG8gY29uZmlndXJlIHRoZSBSVEMgdG8gZ2VuZXJhdGUgdGhlIFJUQyBXYWtlVXAgZXZlbnQgdXNpbmcgdGhlDQotSEFMX1JUQ0V4X1NldFdha2VVcFRpbWVyX0lUKCkgZnVuY3Rpb24uDQotDQotQGVuZHZlcmJhdGltDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiBDb25maWd1cmUgdGhlIHZvbHRhZ2UgdGhyZXNob2xkIGRldGVjdGVkIGJ5IHRoZSBQb3dlciBWb2x0YWdlIERldGVjdG9yDQotICogKFBWRCkuDQotICogQHBhcmFtIHNDb25maWdQVkQ6IHBvaW50ZXIgdG8gYSBQV1JfUFZEVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGUNCi0gKiBQVkQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4NCi0gKiBAbm90ZSBSZWZlciB0byB0aGUgZWxlY3RyaWNhbCBjaGFyYWN0ZXJpc3RpY3Mgb2YgeW91ciBkZXZpY2UgZGF0YXNoZWV0IGZvcg0KLSAqICAgICAgICAgbW9yZSBkZXRhaWxzIGFib3V0IHRoZSB2b2x0YWdlIHRocmVzaG9sZHMgY29ycmVzcG9uZGluZyB0byBlYWNoDQotICogICAgICAgICBkZXRlY3Rpb24gbGV2ZWwuDQotICogQHJldHZhbCBOb25lDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BXUl9Db25maWdQVkQoUFdSX1BWRFR5cGVEZWYgKnNDb25maWdQVkQpIHsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfUFdSX1BWRF9MRVZFTChzQ29uZmlnUFZELT5QVkRMZXZlbCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1BXUl9QVkRfTU9ERShzQ29uZmlnUFZELT5Nb2RlKSk7DQotDQotICAvKiBTZXQgUExTIGJpdHMgYWNjb3JkaW5nIHRvIFBWRExldmVsIHZhbHVlICovDQotICBNT0RJRllfUkVHKFBXUi0+Q1IyLCBQV1JfQ1IyX1BMUywgc0NvbmZpZ1BWRC0+UFZETGV2ZWwpOw0KLQ0KLSAgLyogQ2xlYXIgYW55IHByZXZpb3VzIGNvbmZpZy4gS2VlcCBpdCBjbGVhciBpZiBubyBldmVudCBvciBJVCBtb2RlIGlzIHNlbGVjdGVkDQotICAgKi8NCi0gIF9fSEFMX1BXUl9QVkRfRVhUSV9ESVNBQkxFX0VWRU5UKCk7DQotICBfX0hBTF9QV1JfUFZEX0VYVElfRElTQUJMRV9JVCgpOw0KLSAgX19IQUxfUFdSX1BWRF9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCk7DQotICBfX0hBTF9QV1JfUFZEX0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpOw0KLQ0KLSAgLyogQ29uZmlndXJlIGludGVycnVwdCBtb2RlICovDQotICBpZiAoKHNDb25maWdQVkQtPk1vZGUgJiBQVkRfTU9ERV9JVCkgPT0gUFZEX01PREVfSVQpIHsNCi0gICAgX19IQUxfUFdSX1BWRF9FWFRJX0VOQUJMRV9JVCgpOw0KLSAgfQ0KLQ0KLSAgLyogQ29uZmlndXJlIGV2ZW50IG1vZGUgKi8NCi0gIGlmICgoc0NvbmZpZ1BWRC0+TW9kZSAmIFBWRF9NT0RFX0VWVCkgPT0gUFZEX01PREVfRVZUKSB7DQotICAgIF9fSEFMX1BXUl9QVkRfRVhUSV9FTkFCTEVfRVZFTlQoKTsNCi0gIH0NCi0NCi0gIC8qIENvbmZpZ3VyZSB0aGUgZWRnZSAqLw0KLSAgaWYgKChzQ29uZmlnUFZELT5Nb2RlICYgUFZEX1JJU0lOR19FREdFKSA9PSBQVkRfUklTSU5HX0VER0UpIHsNCi0gICAgX19IQUxfUFdSX1BWRF9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpOw0KLSAgfQ0KLQ0KLSAgaWYgKChzQ29uZmlnUFZELT5Nb2RlICYgUFZEX0ZBTExJTkdfRURHRSkgPT0gUFZEX0ZBTExJTkdfRURHRSkgew0KLSAgICBfX0hBTF9QV1JfUFZEX0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRSgpOw0KLSAgfQ0KLQ0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmIEVuYWJsZSB0aGUgUG93ZXIgVm9sdGFnZSBEZXRlY3RvciAoUFZEKS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi12b2lkIEhBTF9QV1JfRW5hYmxlUFZEKHZvaWQpIHsgU0VUX0JJVChQV1ItPkNSMiwgUFdSX0NSMl9QVkRFKTsgfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBEaXNhYmxlIHRoZSBQb3dlciBWb2x0YWdlIERldGVjdG9yIChQVkQpLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXZvaWQgSEFMX1BXUl9EaXNhYmxlUFZEKHZvaWQpIHsgQ0xFQVJfQklUKFBXUi0+Q1IyLCBQV1JfQ1IyX1BWREUpOyB9DQotDQotLyoqDQotICogQGJyaWVmIEVuYWJsZSB0aGUgV2FrZVVwIFBJTnggZnVuY3Rpb25hbGl0eS4NCi0gKiBAcGFyYW0gV2FrZVVwUGluUG9sYXJpdHk6IFNwZWNpZmllcyB3aGljaCBXYWtlLVVwIHBpbiB0byBlbmFibGUuDQotICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGVnYWN5IHZhbHVlcyB3aGljaCBzZXQNCi0gKiB0aGUgZGVmYXVsdCBwb2xhcml0eSBpLmUuIGRldGVjdGlvbiBvbiBoaWdoIGxldmVsIChyaXNpbmcgZWRnZSk6DQotICogICAgICAgICAgIEBhcmcgQHJlZiBQV1JfV0FLRVVQX1BJTjEsIFBXUl9XQUtFVVBfUElOMiwgUFdSX1dBS0VVUF9QSU4zLA0KLSAqIFBXUl9XQUtFVVBfUElONCwgUFdSX1dBS0VVUF9QSU41DQotICoNCi0gKiAgICAgICAgIG9yIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlIHdoZXJlIHRoZSB1c2VyIGNhbiBleHBsaWNpdGx5IHNwZWNpZnkNCi0gKiB0aGUgZW5hYmxlZCBwaW4gYW5kIHRoZSBjaG9zZW4gcG9sYXJpdHk6DQotICogICAgICAgICAgIEBhcmcgQHJlZiBQV1JfV0FLRVVQX1BJTjFfSElHSCBvciBQV1JfV0FLRVVQX1BJTjFfTE9XDQotICogICAgICAgICAgIEBhcmcgQHJlZiBQV1JfV0FLRVVQX1BJTjJfSElHSCBvciBQV1JfV0FLRVVQX1BJTjJfTE9XDQotICogICAgICAgICAgIEBhcmcgQHJlZiBQV1JfV0FLRVVQX1BJTjNfSElHSCBvciBQV1JfV0FLRVVQX1BJTjNfTE9XDQotICogICAgICAgICAgIEBhcmcgQHJlZiBQV1JfV0FLRVVQX1BJTjRfSElHSCBvciBQV1JfV0FLRVVQX1BJTjRfTE9XDQotICogICAgICAgICAgIEBhcmcgQHJlZiBQV1JfV0FLRVVQX1BJTjVfSElHSCBvciBQV1JfV0FLRVVQX1BJTjVfTE9XDQotICogQG5vdGUgIFBXUl9XQUtFVVBfUElOeCBhbmQgUFdSX1dBS0VVUF9QSU54X0hJR0ggYXJlIGVxdWl2YWxlbnQuDQotICogQHJldHZhbCBOb25lDQotICovDQotdm9pZCBIQUxfUFdSX0VuYWJsZVdha2VVcFBpbih1aW50MzJfdCBXYWtlVXBQaW5Qb2xhcml0eSkgew0KLSAgYXNzZXJ0X3BhcmFtKElTX1BXUl9XQUtFVVBfUElOKFdha2VVcFBpblBvbGFyaXR5KSk7DQotDQotICAvKiBTcGVjaWZpZXMgdGhlIFdha2UtVXAgcGluIHBvbGFyaXR5IGZvciB0aGUgZXZlbnQgZGV0ZWN0aW9uDQotICAgIChyaXNpbmcgb3IgZmFsbGluZyBlZGdlKSAqLw0KLSAgTU9ESUZZX1JFRyhQV1ItPkNSNCwgKFBXUl9DUjNfRVdVUCAmIFdha2VVcFBpblBvbGFyaXR5KSwNCi0gICAgICAgICAgICAgKFdha2VVcFBpblBvbGFyaXR5ID4+IFBXUl9XVVBfUE9MQVJJVFlfU0hJRlQpKTsNCi0NCi0gIC8qIEVuYWJsZSB3YWtlLXVwIHBpbiAqLw0KLSAgU0VUX0JJVChQV1ItPkNSMywgKFBXUl9DUjNfRVdVUCAmIFdha2VVcFBpblBvbGFyaXR5KSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBEaXNhYmxlIHRoZSBXYWtlVXAgUElOeCBmdW5jdGlvbmFsaXR5Lg0KLSAqIEBwYXJhbSBXYWtlVXBQaW54OiBTcGVjaWZpZXMgdGhlIFBvd2VyIFdha2UtVXAgcGluIHRvIGRpc2FibGUuDQotICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICBAYXJnIEByZWYgUFdSX1dBS0VVUF9QSU4xLCBQV1JfV0FLRVVQX1BJTjIsIFBXUl9XQUtFVVBfUElOMywNCi0gKiBQV1JfV0FLRVVQX1BJTjQsIFBXUl9XQUtFVVBfUElONQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXZvaWQgSEFMX1BXUl9EaXNhYmxlV2FrZVVwUGluKHVpbnQzMl90IFdha2VVcFBpbngpIHsNCi0gIGFzc2VydF9wYXJhbShJU19QV1JfV0FLRVVQX1BJTihXYWtlVXBQaW54KSk7DQotDQotICBDTEVBUl9CSVQoUFdSLT5DUjMsIChQV1JfQ1IzX0VXVVAgJiBXYWtlVXBQaW54KSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBFbnRlciBTbGVlcCBvciBMb3ctcG93ZXIgU2xlZXAgbW9kZS4NCi0gKiBAbm90ZSAgSW4gU2xlZXAvTG93LXBvd2VyIFNsZWVwIG1vZGUsIGFsbCBJL08gcGlucyBrZWVwIHRoZSBzYW1lIHN0YXRlIGFzIGluDQotICogUnVuIG1vZGUuDQotICogQHBhcmFtIFJlZ3VsYXRvcjogU3BlY2lmaWVzIHRoZSByZWd1bGF0b3Igc3RhdGUgaW4gU2xlZXAvTG93LXBvd2VyIFNsZWVwDQotICogbW9kZS4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfTUFJTlJFR1VMQVRPUl9PTiBTbGVlcCBtb2RlIChyZWd1bGF0b3IgaW4gbWFpbiBtb2RlKQ0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFBXUl9MT1dQT1dFUlJFR1VMQVRPUl9PTiBMb3ctcG93ZXIgU2xlZXAgbW9kZSAocmVndWxhdG9yDQotICogaW4gbG93LXBvd2VyIG1vZGUpDQotICogQG5vdGUgIExvdy1wb3dlciBTbGVlcCBtb2RlIGlzIGVudGVyZWQgZnJvbSBMb3ctcG93ZXIgUnVuIG1vZGUuIFRoZXJlZm9yZSwgaWYNCi0gKiBub3QgeWV0IGluIExvdy1wb3dlciBSdW4gbW9kZSBiZWZvcmUgY2FsbGluZyBIQUxfUFdSX0VudGVyU0xFRVBNb2RlKCkgd2l0aA0KLSAqIFJlZ3VsYXRvciBzZXQgdG8gUFdSX0xPV1BPV0VSUkVHVUxBVE9SX09OLCB0aGUgdXNlciBjYW4gb3B0aW9uYWxseSBjb25maWd1cmUNCi0gKiB0aGUgRmxhc2ggaW4gcG93ZXItZG93biBtb25kZSBpbiBzZXR0aW5nIHRoZSBTTEVFUF9QRCBiaXQgaW4gRkxBU0hfQUNSDQotICogcmVnaXN0ZXIuIEFkZGl0aW9uYWxseSwgdGhlIGNsb2NrIGZyZXF1ZW5jeSBtdXN0IGJlIHJlZHVjZWQgYmVsb3cgMiBNSHouDQotICogICAgICAgIFNldHRpbmcgU0xFRVBfUEQgaW4gRkxBU0hfQUNSIHRoZW4gYXBwcm9wcmlhdGVseSByZWR1Y2luZyB0aGUgY2xvY2sNCi0gKiBmcmVxdWVuY3kgbXVzdCBiZSBkb25lIGJlZm9yZSBjYWxsaW5nIEhBTF9QV1JfRW50ZXJTTEVFUE1vZGUoKSBBUEkuDQotICogQG5vdGUgIFdoZW4gZXhpdGluZyBMb3ctcG93ZXIgU2xlZXAgbW9kZSwgdGhlIE1DVSBpcyBpbiBMb3ctcG93ZXIgUnVuIG1vZGUuDQotICogVG8gbW92ZSBpbiBSdW4gbW9kZSwgdGhlIHVzZXIgbXVzdCByZXNvcnQgdG8NCi0gKiBIQUxfUFdSRXhfRGlzYWJsZUxvd1Bvd2VyUnVuTW9kZSgpIEFQSS4NCi0gKiBAcGFyYW0gU0xFRVBFbnRyeTogU3BlY2lmaWVzIGlmIFNsZWVwIG1vZGUgaXMgZW50ZXJlZCB3aXRoIFdGSSBvciBXRkUNCi0gKiBpbnN0cnVjdGlvbi4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfU0xFRVBFTlRSWV9XRkkgZW50ZXIgU2xlZXAgb3IgTG93LXBvd2VyIFNsZWVwIG1vZGUNCi0gKiB3aXRoIFdGSSBpbnN0cnVjdGlvbg0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFBXUl9TTEVFUEVOVFJZX1dGRSBlbnRlciBTbGVlcCBvciBMb3ctcG93ZXIgU2xlZXAgbW9kZQ0KLSAqIHdpdGggV0ZFIGluc3RydWN0aW9uDQotICogQG5vdGUgIFdoZW4gV0ZJIGVudHJ5IGlzIHVzZWQsIHRpY2sgaW50ZXJydXB0IGhhdmUgdG8gYmUgZGlzYWJsZWQgaWYgbm90DQotICogZGVzaXJlZCBhcyB0aGUgaW50ZXJydXB0IHdha2UgdXAgc291cmNlLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXZvaWQgSEFMX1BXUl9FbnRlclNMRUVQTW9kZSh1aW50MzJfdCBSZWd1bGF0b3IsIHVpbnQ4X3QgU0xFRVBFbnRyeSkgew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19QV1JfUkVHVUxBVE9SKFJlZ3VsYXRvcikpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1BXUl9TTEVFUF9FTlRSWShTTEVFUEVudHJ5KSk7DQotDQotICAvKiBTZXQgUmVndWxhdG9yIHBhcmFtZXRlciAqLw0KLSAgaWYgKFJlZ3VsYXRvciA9PSBQV1JfTUFJTlJFR1VMQVRPUl9PTikgew0KLSAgICAvKiBJZiBpbiBsb3ctcG93ZXIgcnVuIG1vZGUgYXQgdGhpcyBwb2ludCwgZXhpdCBpdCAqLw0KLSAgICBpZiAoSEFMX0lTX0JJVF9TRVQoUFdSLT5TUjIsIFBXUl9TUjJfUkVHTFBGKSkgew0KLSAgICAgICh2b2lkKUhBTF9QV1JFeF9EaXNhYmxlTG93UG93ZXJSdW5Nb2RlKCk7DQotICAgIH0NCi0gICAgLyogUmVndWxhdG9yIG5vdyBpbiBtYWluIG1vZGUuICovDQotICB9IGVsc2Ugew0KLSAgICAvKiBJZiBpbiBydW4gbW9kZSwgZmlyc3QgbW92ZSB0byBsb3ctcG93ZXIgcnVuIG1vZGUuDQotICAgICAgIFRoZSBzeXN0ZW0gY2xvY2sgZnJlcXVlbmN5IG11c3QgYmUgYmVsb3cgMiBNSHogYXQgdGhpcyBwb2ludC4gKi8NCi0gICAgaWYgKEhBTF9JU19CSVRfU0VUKFBXUi0+U1IyLCBQV1JfU1IyX1JFR0xQRikgPT0gMFUpIHsNCi0gICAgICBIQUxfUFdSRXhfRW5hYmxlTG93UG93ZXJSdW5Nb2RlKCk7DQotICAgIH0NCi0gIH0NCi0NCi0gIC8qIENsZWFyIFNMRUVQREVFUCBiaXQgb2YgQ29ydGV4IFN5c3RlbSBDb250cm9sIFJlZ2lzdGVyICovDQotICBDTEVBUl9CSVQoU0NCLT5TQ1IsICgodWludDMyX3QpU0NCX1NDUl9TTEVFUERFRVBfTXNrKSk7DQotDQotICAvKiBTZWxlY3QgU0xFRVAgbW9kZSBlbnRyeSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0gIGlmIChTTEVFUEVudHJ5ID09IFBXUl9TTEVFUEVOVFJZX1dGSSkgew0KLSAgICAvKiBSZXF1ZXN0IFdhaXQgRm9yIEludGVycnVwdCAqLw0KLSAgICBfX1dGSSgpOw0KLSAgfSBlbHNlIHsNCi0gICAgLyogUmVxdWVzdCBXYWl0IEZvciBFdmVudCAqLw0KLSAgICBfX1NFVigpOw0KLSAgICBfX1dGRSgpOw0KLSAgICBfX1dGRSgpOw0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgRW50ZXIgU3RvcCBtb2RlDQotICogQG5vdGUgIFRoaXMgQVBJIGlzIG5hbWVkIEhBTF9QV1JfRW50ZXJTVE9QTW9kZSB0byBlbnN1cmUgY29tcGF0aWJpbGl0eSB3aXRoDQotICogbGVnYWN5IGNvZGUgcnVubmluZyBvbiBkZXZpY2VzIHdoZXJlIG9ubHkgIlN0b3AgbW9kZSIgaXMgbWVudGlvbmVkIHdpdGggbWFpbg0KLSAqIG9yIGxvdyBwb3dlciByZWd1bGF0b3IgT04uDQotICogQG5vdGUgIEluIFN0b3AgbW9kZSwgYWxsIEkvTyBwaW5zIGtlZXAgdGhlIHNhbWUgc3RhdGUgYXMgaW4gUnVuIG1vZGUuDQotICogQG5vdGUgIEFsbCBjbG9ja3MgaW4gdGhlIFZDT1JFIGRvbWFpbiBhcmUgc3RvcHBlZDsgdGhlIFBMTCwNCi0gKiAgICAgICAgdGhlIEhTSSBhbmQgdGhlIEhTRSBvc2NpbGxhdG9ycyBhcmUgZGlzYWJsZWQuIFNvbWUgcGVyaXBoZXJhbHMgd2l0aA0KLSAqIHRoZSB3YWtldXAgY2FwYWJpbGl0eSAoSTJDeCwgVVNBUlR4IGFuZCBMUFVBUlQpIGNhbiBzd2l0Y2ggb24gdGhlIEhTSSB0bw0KLSAqIHJlY2VpdmUgYSBmcmFtZSwgYW5kIHN3aXRjaCBvZmYgdGhlIEhTSSBhZnRlciByZWNlaXZpbmcgdGhlIGZyYW1lIGlmIGl0IGlzDQotICogbm90IGEgd2FrZXVwIGZyYW1lLiBJbiB0aGlzIGNhc2UsIHRoZSBIU0kgY2xvY2sgaXMgcHJvcGFnYXRlZCBvbmx5IHRvIHRoZQ0KLSAqIHBlcmlwaGVyYWwgcmVxdWVzdGluZyBpdC4gU1JBTTEsIFNSQU0yIGFuZCByZWdpc3RlciBjb250ZW50cyBhcmUgcHJlc2VydmVkLg0KLSAqICAgICAgICBUaGUgQk9SIGlzIGF2YWlsYWJsZS4NCi0gKiAgICAgICAgVGhlIHZvbHRhZ2UgcmVndWxhdG9yIGNhbiBiZSBjb25maWd1cmVkIGVpdGhlciBpbiBub3JtYWwgKFN0b3AgMCkgb3INCi0gKiBsb3ctcG93ZXIgbW9kZSAoU3RvcCAxKS4NCi0gKiBAbm90ZSAgV2hlbiBleGl0aW5nIFN0b3AgMCBvciBTdG9wIDEgbW9kZSBieSBpc3N1aW5nIGFuIGludGVycnVwdCBvciBhIHdha2V1cA0KLSAqIGV2ZW50LCB0aGUgSFNJIFJDIG9zY2lsbGF0b3IgaXMgc2VsZWN0ZWQgYXMgc3lzdGVtIGNsb2NrLg0KLSAqIEBub3RlICBXaGVuIHRoZSB2b2x0YWdlIHJlZ3VsYXRvciBvcGVyYXRlcyBpbiBsb3cgcG93ZXIgbW9kZSAoU3RvcCAxKSwgYW4NCi0gKiBhZGRpdGlvbmFsIHN0YXJ0dXAgZGVsYXkgaXMgaW5jdXJyZWQgd2hlbiB3YWtpbmcgdXAuIEJ5IGtlZXBpbmcgdGhlIGludGVybmFsDQotICogcmVndWxhdG9yIE9OIGR1cmluZyBTdG9wIG1vZGUgKFN0b3AgMCksIHRoZSBjb25zdW1wdGlvbiBpcyBoaWdoZXIgYWx0aG91Z2gNCi0gKiB0aGUgc3RhcnR1cCB0aW1lIGlzIHJlZHVjZWQuDQotICogQHBhcmFtIFJlZ3VsYXRvcjogU3BlY2lmaWVzIHRoZSByZWd1bGF0b3Igc3RhdGUgaW4gU3RvcCBtb2RlLg0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIEByZWYgUFdSX01BSU5SRUdVTEFUT1JfT04gIFN0b3AgMCBtb2RlIChtYWluIHJlZ3VsYXRvciBPTikNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfTE9XUE9XRVJSRUdVTEFUT1JfT04gIFN0b3AgMSBtb2RlIChsb3cgcG93ZXINCi0gKiByZWd1bGF0b3IgT04pDQotICogQHBhcmFtIFNUT1BFbnRyeTogU3BlY2lmaWVzIFN0b3AgMCBvciBTdG9wIDEgbW9kZSBpcyBlbnRlcmVkIHdpdGggV0ZJIG9yIFdGRQ0KLSAqIGluc3RydWN0aW9uLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFBXUl9TVE9QRU5UUllfV0ZJICBFbnRlciBTdG9wIDAgb3IgU3RvcCAxIG1vZGUgd2l0aCBXRkkNCi0gKiBpbnN0cnVjdGlvbi4NCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfU1RPUEVOVFJZX1dGRSAgRW50ZXIgU3RvcCAwIG9yIFN0b3AgMSBtb2RlIHdpdGggV0ZFDQotICogaW5zdHJ1Y3Rpb24uDQotICogQHJldHZhbCBOb25lDQotICovDQotdm9pZCBIQUxfUFdSX0VudGVyU1RPUE1vZGUodWludDMyX3QgUmVndWxhdG9yLCB1aW50OF90IFNUT1BFbnRyeSkgew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19QV1JfUkVHVUxBVE9SKFJlZ3VsYXRvcikpOw0KLQ0KLSAgaWYgKFJlZ3VsYXRvciA9PSBQV1JfTE9XUE9XRVJSRUdVTEFUT1JfT04pIHsNCi0gICAgSEFMX1BXUkV4X0VudGVyU1RPUDFNb2RlKFNUT1BFbnRyeSk7DQotICB9IGVsc2Ugew0KLSAgICBIQUxfUFdSRXhfRW50ZXJTVE9QME1vZGUoU1RPUEVudHJ5KTsNCi0gIH0NCi19DQotDQotLyoqDQotICogQGJyaWVmIEVudGVyIFN0YW5kYnkgbW9kZS4NCi0gKiBAbm90ZSAgSW4gU3RhbmRieSBtb2RlLCB0aGUgUExMLCB0aGUgSFNJIGFuZCB0aGUgSFNFIG9zY2lsbGF0b3JzIGFyZSBzd2l0Y2hlZA0KLSAqICAgICAgICBvZmYuIFRoZSB2b2x0YWdlIHJlZ3VsYXRvciBpcyBkaXNhYmxlZCwgZXhjZXB0IHdoZW4gU1JBTTIgY29udGVudCBpcw0KLSAqIHByZXNlcnZlZCBpbiB3aGljaCBjYXNlIHRoZSByZWd1bGF0b3IgaXMgaW4gbG93LXBvd2VyIG1vZGUuIFNSQU0xIGFuZA0KLSAqIHJlZ2lzdGVyIGNvbnRlbnRzIGFyZSBsb3N0IGV4Y2VwdCBmb3IgcmVnaXN0ZXJzIGluIHRoZSBCYWNrdXAgZG9tYWluIGFuZA0KLSAqICAgICAgICBTdGFuZGJ5IGNpcmN1aXRyeS4gU1JBTTIgY29udGVudCBjYW4gYmUgcHJlc2VydmVkIGlmIHRoZSBiaXQgUlJTIGlzDQotICogc2V0IGluIFBXUl9DUjMgcmVnaXN0ZXIuIFRvIGVuYWJsZSB0aGlzIGZlYXR1cmUsIHRoZSB1c2VyIGNhbiByZXNvcnQgdG8NCi0gKiBIQUxfUFdSRXhfRW5hYmxlU1JBTTJDb250ZW50UmV0ZW50aW9uKCkgQVBJIHRvIHNldCBSUlMgYml0LiBUaGUgQk9SIGlzDQotICogYXZhaWxhYmxlLg0KLSAqIEBub3RlICBUaGUgSS9PcyBjYW4gYmUgY29uZmlndXJlZCBlaXRoZXIgd2l0aCBhIHB1bGwtdXAgb3IgcHVsbC1kb3duIG9yIGNhbg0KLSAqIGJlIGtlcHQgaW4gYW5hbG9nIHN0YXRlLiBIQUxfUFdSRXhfRW5hYmxlR1BJT1B1bGxVcCgpIGFuZA0KLSAqIEhBTF9QV1JFeF9FbmFibGVHUElPUHVsbERvd24oKSByZXNwZWN0aXZlbHkgZW5hYmxlIFB1bGwgVXAgYW5kIFB1bGwgRG93bg0KLSAqIHN0YXRlLCBIQUxfUFdSRXhfRGlzYWJsZUdQSU9QdWxsVXAoKSBhbmQgSEFMX1BXUkV4X0Rpc2FibGVHUElPUHVsbERvd24oKQ0KLSAqIGRpc2FibGUgdGhlIHNhbWUuIFRoZXNlIHN0YXRlcyBhcmUgZWZmZWN0aXZlIGluIFN0YW5kYnkgbW9kZSBvbmx5IGlmIEFQQyBiaXQNCi0gKiBpcyBzZXQgdGhyb3VnaCBIQUxfUFdSRXhfRW5hYmxlUHVsbFVwUHVsbERvd25Db25maWcoKSBBUEkuDQotICogQHJldHZhbCBOb25lDQotICovDQotdm9pZCBIQUxfUFdSX0VudGVyU1RBTkRCWU1vZGUodm9pZCkgew0KLSAgLyogU2V0IFN0YW5kLWJ5IG1vZGUgKi8NCi0gIE1PRElGWV9SRUcoUFdSLT5DUjEsIFBXUl9DUjFfTFBNUywgUFdSX0NSMV9MUE1TX1NUQU5EQlkpOw0KLQ0KLSAgLyogU2V0IFNMRUVQREVFUCBiaXQgb2YgQ29ydGV4IFN5c3RlbSBDb250cm9sIFJlZ2lzdGVyICovDQotICBTRVRfQklUKFNDQi0+U0NSLCAoKHVpbnQzMl90KVNDQl9TQ1JfU0xFRVBERUVQX01zaykpOw0KLQ0KLS8qIFRoaXMgb3B0aW9uIGlzIHVzZWQgdG8gZW5zdXJlIHRoYXQgc3RvcmUgb3BlcmF0aW9ucyBhcmUgY29tcGxldGVkICovDQotI2lmIGRlZmluZWQoX19DQ19BUk0pDQotICBfX2ZvcmNlX3N0b3JlcygpOw0KLSNlbmRpZg0KLSAgLyogUmVxdWVzdCBXYWl0IEZvciBJbnRlcnJ1cHQgKi8NCi0gIF9fV0ZJKCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBJbmRpY2F0ZSBTbGVlcC1Pbi1FeGl0IHdoZW4gcmV0dXJuaW5nIGZyb20gSGFuZGxlciBtb2RlIHRvIFRocmVhZA0KLSAqIG1vZGUuDQotICogQG5vdGUgU2V0IFNMRUVQT05FWElUIGJpdCBvZiBTQ1IgcmVnaXN0ZXIuIFdoZW4gdGhpcyBiaXQgaXMgc2V0LCB0aGUNCi0gKiBwcm9jZXNzb3IgcmUtZW50ZXJzIFNMRUVQIG1vZGUgd2hlbiBhbiBpbnRlcnJ1cHRpb24gaGFuZGxpbmcgaXMgb3Zlci4gU2V0dGluZw0KLSAqIHRoaXMgYml0IGlzIHVzZWZ1bCB3aGVuIHRoZSBwcm9jZXNzb3IgaXMgZXhwZWN0ZWQgdG8gcnVuIG9ubHkgb24NCi0gKiAgICAgICBpbnRlcnJ1cHRpb25zIGhhbmRsaW5nLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXZvaWQgSEFMX1BXUl9FbmFibGVTbGVlcE9uRXhpdCh2b2lkKSB7DQotICAvKiBTZXQgU0xFRVBPTkVYSVQgYml0IG9mIENvcnRleCBTeXN0ZW0gQ29udHJvbCBSZWdpc3RlciAqLw0KLSAgU0VUX0JJVChTQ0ItPlNDUiwgKCh1aW50MzJfdClTQ0JfU0NSX1NMRUVQT05FWElUX01zaykpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgRGlzYWJsZSBTbGVlcC1Pbi1FeGl0IGZlYXR1cmUgd2hlbiByZXR1cm5pbmcgZnJvbSBIYW5kbGVyIG1vZGUgdG8NCi0gKiBUaHJlYWQgbW9kZS4NCi0gKiBAbm90ZSBDbGVhciBTTEVFUE9ORVhJVCBiaXQgb2YgU0NSIHJlZ2lzdGVyLiBXaGVuIHRoaXMgYml0IGlzIHNldCwgdGhlDQotICogcHJvY2Vzc29yIHJlLWVudGVycyBTTEVFUCBtb2RlIHdoZW4gYW4gaW50ZXJydXB0aW9uIGhhbmRsaW5nIGlzIG92ZXIuDQotICogQHJldHZhbCBOb25lDQotICovDQotdm9pZCBIQUxfUFdSX0Rpc2FibGVTbGVlcE9uRXhpdCh2b2lkKSB7DQotICAvKiBDbGVhciBTTEVFUE9ORVhJVCBiaXQgb2YgQ29ydGV4IFN5c3RlbSBDb250cm9sIFJlZ2lzdGVyICovDQotICBDTEVBUl9CSVQoU0NCLT5TQ1IsICgodWludDMyX3QpU0NCX1NDUl9TTEVFUE9ORVhJVF9Nc2spKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmIEVuYWJsZSBDT1JURVggTTQgU0VWT05QRU5EIGJpdC4NCi0gKiBAbm90ZSBTZXQgU0VWT05QRU5EIGJpdCBvZiBTQ1IgcmVnaXN0ZXIuIFdoZW4gdGhpcyBiaXQgaXMgc2V0LCB0aGlzIGNhdXNlcw0KLSAqICAgICAgIFdGRSB0byB3YWtlIHVwIHdoZW4gYW4gaW50ZXJydXB0IG1vdmVzIGZyb20gaW5hY3RpdmUgdG8gcGVuZGVkLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXZvaWQgSEFMX1BXUl9FbmFibGVTRVZPblBlbmQodm9pZCkgew0KLSAgLyogU2V0IFNFVk9OUEVORCBiaXQgb2YgQ29ydGV4IFN5c3RlbSBDb250cm9sIFJlZ2lzdGVyICovDQotICBTRVRfQklUKFNDQi0+U0NSLCAoKHVpbnQzMl90KVNDQl9TQ1JfU0VWT05QRU5EX01zaykpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgRGlzYWJsZSBDT1JURVggTTQgU0VWT05QRU5EIGJpdC4NCi0gKiBAbm90ZSBDbGVhciBTRVZPTlBFTkQgYml0IG9mIFNDUiByZWdpc3Rlci4gV2hlbiB0aGlzIGJpdCBpcyBzZXQsIHRoaXMgY2F1c2VzDQotICogICAgICAgV0ZFIHRvIHdha2UgdXAgd2hlbiBhbiBpbnRlcnJ1cHQgbW92ZXMgZnJvbSBpbmFjdGl2ZSB0byBwZW5kZWQuDQotICogQHJldHZhbCBOb25lDQotICovDQotdm9pZCBIQUxfUFdSX0Rpc2FibGVTRVZPblBlbmQodm9pZCkgew0KLSAgLyogQ2xlYXIgU0VWT05QRU5EIGJpdCBvZiBDb3J0ZXggU3lzdGVtIENvbnRyb2wgUmVnaXN0ZXIgKi8NCi0gIENMRUFSX0JJVChTQ0ItPlNDUiwgKCh1aW50MzJfdClTQ0JfU0NSX1NFVk9OUEVORF9Nc2spKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmIFBXUiBQVkQgaW50ZXJydXB0IGNhbGxiYWNrDQotICogQHJldHZhbCBOb25lDQotICovDQotX193ZWFrIHZvaWQgSEFMX1BXUl9QVkRDYWxsYmFjayh2b2lkKSB7DQotICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkOyB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsDQotICAgICAgICAgICAgdGhlIEhBTF9QV1JfUFZEQ2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUNCi0gICAqLw0KLX0NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotI2VuZGlmIC8qIEhBTF9QV1JfTU9EVUxFX0VOQUJMRUQgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQorLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAZmlsZSAgICBzdG0zMmc0eHhfaGFsX3B3ci5jCisgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICogQGJyaWVmICAgUFdSIEhBTCBtb2R1bGUgZHJpdmVyLgorICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBQb3dlciBDb250cm9sbGVyIChQV1IpIHBlcmlwaGVyYWw6CisgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbi9kZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAqICAgICAgICAgICArIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYXR0ZW50aW9uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0ZXJtcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlCisgKiBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb2Z0d2FyZSBjb21wb25lbnQuCisgKiBJZiBubyBMSUNFTlNFIGZpbGUgY29tZXMgd2l0aCB0aGlzIHNvZnR3YXJlLCBpdCBpcyBwcm92aWRlZCBBUy1JUy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmc0eHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkc0eHhfSEFMX0RyaXZlcgorICogQHsKKyAqLworCisvKiogQGRlZmdyb3VwIFBXUiBQV1IKKyAqIEBicmllZiBQV1IgSEFMIG1vZHVsZSBkcml2ZXIKKyAqIEB7CisgKi8KKworI2lmZGVmIEhBTF9QV1JfTU9EVUxFX0VOQUJMRUQKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgUFdSX1ByaXZhdGVfRGVmaW5lcyBQV1IgUHJpdmF0ZSBEZWZpbmVzCisgKiBAeworICovCisKKy8qKiBAZGVmZ3JvdXAgUFdSX1BWRF9Nb2RlX01hc2sgUFdSIFBWRCBNb2RlIE1hc2sKKyAqIEB7CisgKi8KKyNkZWZpbmUgUFZEX01PREVfSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKHVpbnQzMl90KTB4MDAwMTAwMDApIC8qITwgTWFzayBmb3IgaW50ZXJydXB0aW9uIHlpZWxkZWQgYnkgUFZEIHRocmVzaG9sZCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Jvc3NpbmcgKi8KKyNkZWZpbmUgUFZEX01PREVfRVZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgodWludDMyX3QpMHgwMDAyMDAwMCkgLyohPCBNYXNrIGZvciBldmVudCB5aWVsZGVkIGJ5IFBWRCB0aHJlc2hvbGQgY3Jvc3NpbmcgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBQVkRfUklTSU5HX0VER0UgXAorICAoKHVpbnQzMl90KTB4MDAwMDAwMDEpIC8qITwgTWFzayBmb3IgcmlzaW5nIGVkZ2Ugc2V0IGFzIFBWRCB0cmlnZ2VyICovCisjZGVmaW5lIFBWRF9GQUxMSU5HX0VER0UgXAorICAoKHVpbnQzMl90KTB4MDAwMDAwMDIpIC8qITwgTWFzayBmb3IgZmFsbGluZyBlZGdlIHNldCBhcyBQVkQgdHJpZ2dlciAqLworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIFBXUl9FeHBvcnRlZF9GdW5jdGlvbnMgUFdSIEV4cG9ydGVkIEZ1bmN0aW9ucworICogQHsKKyAqLworCisvKiogQGRlZmdyb3VwIFBXUl9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbgorZnVuY3Rpb25zCisgICogIEBicmllZiAgICBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICogQGJyaWVmIERlaW5pdGlhbGl6ZSB0aGUgSEFMIFBXUiBwZXJpcGhlcmFsIHJlZ2lzdGVycyB0byB0aGVpciBkZWZhdWx0IHJlc2V0CisgKiB2YWx1ZXMuCisgKiBAcmV0dmFsIE5vbmUKKyAqLwordm9pZCBIQUxfUFdSX0RlSW5pdCh2b2lkKSB7CisgIF9fSEFMX1JDQ19QV1JfRk9SQ0VfUkVTRVQoKTsKKyAgX19IQUxfUkNDX1BXUl9SRUxFQVNFX1JFU0VUKCk7Cit9CisKKy8qKgorICogQGJyaWVmIEVuYWJsZSBhY2Nlc3MgdG8gdGhlIGJhY2t1cCBkb21haW4KKyAqICAgICAgICAoUlRDIHJlZ2lzdGVycywgUlRDIGJhY2t1cCBkYXRhIHJlZ2lzdGVycykuCisgKiBAbm90ZSAgQWZ0ZXIgcmVzZXQsIHRoZSBiYWNrdXAgZG9tYWluIGlzIHByb3RlY3RlZCBhZ2FpbnN0CisgKiAgICAgICAgcG9zc2libGUgdW53YW50ZWQgd3JpdGUgYWNjZXNzZXMuCisgKiBAbm90ZSAgUlRDU0VMIHRoYXQgc2V0cyB0aGUgUlRDIGNsb2NrIHNvdXJjZSBzZWxlY3Rpb24gaXMgaW4gdGhlIFJUQyBiYWNrLXVwCisgKiBkb21haW4uIEluIG9yZGVyIHRvIHNldCBvciBtb2RpZnkgdGhlIFJUQyBjbG9jaywgdGhlIGJhY2t1cCBkb21haW4gYWNjZXNzCisgKiBtdXN0IGJlIGRpc2FibGVkLgorICogQG5vdGUgIExTRU9OIGJpdCB0aGF0IHN3aXRjaGVzIG9uIGFuZCBvZmYgdGhlIExTRSBjcnlzdGFsIGJlbG9uZ3MgYXMgd2VsbCB0bworICogdGhlIGJhY2stdXAgZG9tYWluLgorICogQHJldHZhbCBOb25lCisgKi8KK3ZvaWQgSEFMX1BXUl9FbmFibGVCa1VwQWNjZXNzKHZvaWQpIHsgU0VUX0JJVChQV1ItPkNSMSwgUFdSX0NSMV9EQlApOyB9CisKKy8qKgorICogQGJyaWVmIERpc2FibGUgYWNjZXNzIHRvIHRoZSBiYWNrdXAgZG9tYWluCisgKiAgICAgICAgKFJUQyByZWdpc3RlcnMsIFJUQyBiYWNrdXAgZGF0YSByZWdpc3RlcnMpLgorICogQHJldHZhbCBOb25lCisgKi8KK3ZvaWQgSEFMX1BXUl9EaXNhYmxlQmtVcEFjY2Vzcyh2b2lkKSB7IENMRUFSX0JJVChQV1ItPkNSMSwgUFdSX0NSMV9EQlApOyB9CisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFBXUl9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiAgQGJyaWVmIExvdyBQb3dlciBtb2RlcyBjb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICBbLi5dCisgICAgICoqKiBQVkQgY29uZmlndXJhdGlvbiAqKioKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgKCspIFRoZSBQVkQgaXMgdXNlZCB0byBtb25pdG9yIHRoZSBWREQgcG93ZXIgc3VwcGx5IGJ5IGNvbXBhcmluZyBpdCB0byBhCisgICAgICAgICAgdGhyZXNob2xkIHNlbGVjdGVkIGJ5IHRoZSBQVkQgTGV2ZWwgKFBMU1syOjBdIGJpdHMgaW4gUFdSX0NSMgorcmVnaXN0ZXIpLgorCisgICAgICAoKykgUFZETyBmbGFnIGlzIGF2YWlsYWJsZSB0byBpbmRpY2F0ZSBpZiBWREQvVkREQSBpcyBoaWdoZXIgb3IgbG93ZXIKKyAgICAgICAgICB0aGFuIHRoZSBQVkQgdGhyZXNob2xkLiBUaGlzIGV2ZW50IGlzIGludGVybmFsbHkgY29ubmVjdGVkIHRvIHRoZSBFWFRJCisgICAgICAgICAgbGluZTE2IGFuZCBjYW4gZ2VuZXJhdGUgYW4gaW50ZXJydXB0IGlmIGVuYWJsZWQuIFRoaXMgaXMgZG9uZSB0aHJvdWdoCisgICAgICAgICAgX19IQUxfUFZEX0VYVElfRU5BQkxFX0lUKCkgbWFjcm8uCisgICAgICAoKykgVGhlIFBWRCBpcyBzdG9wcGVkIGluIFN0YW5kYnkgbW9kZS4KKworCisgICAgKioqIFdha2VVcCBwaW4gY29uZmlndXJhdGlvbiAqKioKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgICgrKSBXYWtlVXAgcGlucyBhcmUgdXNlZCB0byB3YWtldXAgdGhlIHN5c3RlbSBmcm9tIFN0YW5kYnkgbW9kZSBvcgorU2h1dGRvd24gbW9kZS4gVGhlIHBvbGFyaXR5IG9mIHRoZXNlIHBpbnMgY2FuIGJlIHNldCB0byBjb25maWd1cmUgZXZlbnQKK2RldGVjdGlvbiBvbiBoaWdoIGxldmVsIChyaXNpbmcgZWRnZSkgb3IgbG93IGxldmVsIChmYWxsaW5nIGVkZ2UpLgorCisKKworICAgICoqKiBMb3cgUG93ZXIgbW9kZXMgY29uZmlndXJhdGlvbiAqKioKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgVGhlIGRldmljZXMgZmVhdHVyZSA4IGxvdy1wb3dlciBtb2RlczoKKyAgICAgICgrKSBMb3ctcG93ZXIgUnVuIG1vZGU6IGNvcmUgYW5kIHBlcmlwaGVyYWxzIGFyZSBydW5uaW5nLCBtYWluIHJlZ3VsYXRvcgorb2ZmLCBsb3cgcG93ZXIgcmVndWxhdG9yIG9uLgorICAgICAgKCspIFNsZWVwIG1vZGU6IENvcnRleC1NNCBjb3JlIHN0b3BwZWQsIHBlcmlwaGVyYWxzIGtlcHQgcnVubmluZywgbWFpbiBhbmQKK2xvdyBwb3dlciByZWd1bGF0b3JzIG9uLgorICAgICAgKCspIExvdy1wb3dlciBTbGVlcCBtb2RlOiBDb3J0ZXgtTTQgY29yZSBzdG9wcGVkLCBwZXJpcGhlcmFscyBrZXB0CitydW5uaW5nLCBtYWluIHJlZ3VsYXRvciBvZmYsIGxvdyBwb3dlciByZWd1bGF0b3Igb24uCisgICAgICAoKykgU3RvcCAwIG1vZGU6IGFsbCBjbG9ja3MgYXJlIHN0b3BwZWQgZXhjZXB0IExTSSBhbmQgTFNFLCBtYWluIGFuZCBsb3cKK3Bvd2VyIHJlZ3VsYXRvcnMgb24uCisgICAgICAoKykgU3RvcCAxIG1vZGU6IGFsbCBjbG9ja3MgYXJlIHN0b3BwZWQgZXhjZXB0IExTSSBhbmQgTFNFLCBtYWluIHJlZ3VsYXRvcgorb2ZmLCBsb3cgcG93ZXIgcmVndWxhdG9yIG9uLgorICAgICAgKCspIFN0YW5kYnkgbW9kZSB3aXRoIFNSQU0yOiBhbGwgY2xvY2tzIGFyZSBzdG9wcGVkIGV4Y2VwdCBMU0kgYW5kIExTRSwKK1NSQU0yIGNvbnRlbnQgcHJlc2VydmVkLCBtYWluIHJlZ3VsYXRvciBvZmYsIGxvdyBwb3dlciByZWd1bGF0b3Igb24uCisgICAgICAoKykgU3RhbmRieSBtb2RlIHdpdGhvdXQgU1JBTTI6IGFsbCBjbG9ja3MgYXJlIHN0b3BwZWQgZXhjZXB0IExTSSBhbmQgTFNFLAorbWFpbiBhbmQgbG93IHBvd2VyIHJlZ3VsYXRvcnMgb2ZmLgorICAgICAgKCspIFNodXRkb3duIG1vZGU6IGFsbCBjbG9ja3MgYXJlIHN0b3BwZWQgZXhjZXB0IExTRSwgbWFpbiBhbmQgbG93IHBvd2VyCityZWd1bGF0b3JzIG9mZi4KKworCisgICAqKiogTG93LXBvd2VyIHJ1biBtb2RlICoqKgorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICAoKykgRW50cnk6IChmcm9tIG1haW4gcnVuIG1vZGUpCisgICAgICAgICgrKykgc2V0IExQUiBiaXQgd2l0aCBIQUxfUFdSRXhfRW5hYmxlTG93UG93ZXJSdW5Nb2RlKCkgQVBJIGFmdGVyIGhhdmluZworZGVjcmVhc2VkIHRoZSBzeXN0ZW0gY2xvY2sgYmVsb3cgMiBNSHouCisKKyAgICAgICgrKSBFeGl0OgorICAgICAgICAoKyspIGNsZWFyIExQUiBiaXQgdGhlbiB3YWl0IGZvciBSRUdMUCBiaXQgdG8gYmUgcmVzZXQgd2l0aAorSEFMX1BXUkV4X0Rpc2FibGVMb3dQb3dlclJ1bk1vZGUoKSBBUEkuIE9ubHkgdGhlbiBjYW4gdGhlIHN5c3RlbSBjbG9jayBmcmVxdWVuY3kKK2JlIGluY3JlYXNlZCBhYm92ZSAyIE1Iei4KKworCisgICAqKiogU2xlZXAgbW9kZSAvIExvdy1wb3dlciBzbGVlcCBtb2RlICoqKgorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICAoKykgRW50cnk6CisgICAgICAgICAgVGhlIFNsZWVwIG1vZGUgLyBMb3ctcG93ZXIgU2xlZXAgbW9kZSBpcyBlbnRlcmVkIHRocm91Z2gKK0hBTF9QV1JfRW50ZXJTTEVFUE1vZGUoKSBBUEkgaW4gc3BlY2lmeWluZyB3aGV0aGVyIG9yIG5vdCB0aGUgcmVndWxhdG9yIGlzCitmb3JjZWQgdG8gbG93LXBvd2VyIG1vZGUgYW5kIGlmIGV4aXQgaXMgaW50ZXJydXB0IG9yIGV2ZW50LXRyaWdnZXJlZC4KKyAgICAgICAgICAoKyspIFBXUl9NQUlOUkVHVUxBVE9SX09OOiBTbGVlcCBtb2RlIChyZWd1bGF0b3IgaW4gbWFpbiBtb2RlKS4KKyAgICAgICAgICAoKyspIFBXUl9MT1dQT1dFUlJFR1VMQVRPUl9PTjogTG93LXBvd2VyIHNsZWVwIChyZWd1bGF0b3IgaW4gbG93IHBvd2VyCittb2RlKS4gSW4gdGhlIGxhdHRlciBjYXNlLCB0aGUgc3lzdGVtIGNsb2NrIGZyZXF1ZW5jeSBtdXN0IGhhdmUgYmVlbiBkZWNyZWFzZWQKK2JlbG93IDIgTUh6IGJlZm9yZWhhbmQuCisgICAgICAgICAgKCsrKSBQV1JfU0xFRVBFTlRSWV9XRkk6IGVudGVyIFNMRUVQIG1vZGUgd2l0aCBXRkkgaW5zdHJ1Y3Rpb24KKyAgICAgICAgICAoKyspIFBXUl9TTEVFUEVOVFJZX1dGRTogZW50ZXIgU0xFRVAgbW9kZSB3aXRoIFdGRSBpbnN0cnVjdGlvbgorCisgICAgICAoKykgV0ZJIEV4aXQ6CisgICAgICAgICgrKykgQW55IHBlcmlwaGVyYWwgaW50ZXJydXB0IGFja25vd2xlZGdlZCBieSB0aGUgbmVzdGVkIHZlY3RvcmVkCitpbnRlcnJ1cHQgY29udHJvbGxlciAoTlZJQykgb3IgYW55IHdha2UtdXAgZXZlbnQuCisKKyAgICAgICgrKSBXRkUgRXhpdDoKKyAgICAgICAgKCsrKSBBbnkgd2FrZS11cCBldmVudCBzdWNoIGFzIGFuIEVYVEkgbGluZSBjb25maWd1cmVkIGluIGV2ZW50IG1vZGUuCisKKyAgICAgICAgIFsuLl0gV2hlbiBleGl0aW5nIHRoZSBMb3ctcG93ZXIgc2xlZXAgbW9kZSBieSBpc3N1aW5nIGFuIGludGVycnVwdCBvciBhCit3YWtldXAgZXZlbnQsIHRoZSBNQ1UgaXMgaW4gTG93LXBvd2VyIFJ1biBtb2RlLgorCisgICAqKiogU3RvcCAwLCBTdG9wIDEgbW9kZXMgKioqCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgKCspIEVudHJ5OgorICAgICAgICAgIFRoZSBTdG9wIDAsIFN0b3AgMSBtb2RlcyBhcmUgZW50ZXJlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgQVBJJ3M6CisgICAgICAgICAgKCsrKSBIQUxfUFdSRXhfRW50ZXJTVE9QME1vZGUoKSBmb3IgbW9kZSAwIG9yCitIQUxfUFdSRXhfRW50ZXJTVE9QMU1vZGUoKSBmb3IgbW9kZSAxIG9yIGZvciBwb3J0aW5nIHJlYXNvbnMKK0hBTF9QV1JfRW50ZXJTVE9QTW9kZSgpLgorICAgICAgKCspIFJlZ3VsYXRvciBzZXR0aW5nIChhcHBsaWNhYmxlIHRvIEhBTF9QV1JfRW50ZXJTVE9QTW9kZSgpIG9ubHkpOgorICAgICAgICAgICgrKykgUFdSX01BSU5SRUdVTEFUT1JfT04KKyAgICAgICAgICAoKyspIFBXUl9MT1dQT1dFUlJFR1VMQVRPUl9PTgorICAgICAgKCspIEV4aXQgKGludGVycnVwdCBvciBldmVudC10cmlnZ2VyZWQsIHNwZWNpZmllZCB3aGVuIGVudGVyaW5nIFNUT1AKK21vZGUpOgorICAgICAgICAgICgrKykgUFdSX1NUT1BFTlRSWV9XRkk6IGVudGVyIFN0b3AgbW9kZSB3aXRoIFdGSSBpbnN0cnVjdGlvbgorICAgICAgICAgICgrKykgUFdSX1NUT1BFTlRSWV9XRkU6IGVudGVyIFN0b3AgbW9kZSB3aXRoIFdGRSBpbnN0cnVjdGlvbgorCisgICAgICAoKykgV0ZJIEV4aXQ6CisgICAgICAgICAgKCsrKSBBbnkgRVhUSSBMaW5lIChJbnRlcm5hbCBvciBFeHRlcm5hbCkgY29uZmlndXJlZCBpbiBJbnRlcnJ1cHQKK21vZGUuCisgICAgICAgICAgKCsrKSBTb21lIHNwZWNpZmljIGNvbW11bmljYXRpb24gcGVyaXBoZXJhbHMgKFVTQVJULCBMUFVBUlQsIEkyQykKK2ludGVycnVwdHMgd2hlbiBwcm9ncmFtbWVkIGluIHdha2V1cCBtb2RlLgorICAgICAgKCspIFdGRSBFeGl0OgorICAgICAgICAgICgrKykgQW55IEVYVEkgTGluZSAoSW50ZXJuYWwgb3IgRXh0ZXJuYWwpIGNvbmZpZ3VyZWQgaW4gRXZlbnQgbW9kZS4KKworICAgICAgIFsuLl0KKyAgICAgICAgICBXaGVuIGV4aXRpbmcgU3RvcCAwIGFuZCBTdG9wIDEgbW9kZXMsIHRoZSBNQ1UgaXMgZWl0aGVyIGluIFJ1biBtb2RlIG9yCitpbiBMb3ctcG93ZXIgUnVuIG1vZGUgZGVwZW5kaW5nIG9uIHRoZSBMUFIgYml0IHNldHRpbmcuCisKKyAgICoqKiBTdGFuZGJ5IG1vZGUgKioqCisgICA9PT09PT09PT09PT09PT09PT09PQorICAgICBbLi5dCisgICAgICBUaGUgU3RhbmRieSBtb2RlIG9mZmVycyB0d28gb3B0aW9uczoKKyAgICAgICgrKSBvcHRpb24gYSkgYWxsIGNsb2NrcyBvZmYgZXhjZXB0IExTSSBhbmQgTFNFLCBSUlMgYml0IHNldCAoa2VlcHMKK3ZvbHRhZ2UgcmVndWxhdG9yIGluIGxvdyBwb3dlciBtb2RlKS4gU1JBTSBhbmQgcmVnaXN0ZXJzIGNvbnRlbnRzIGFyZSBsb3N0CitleGNlcHQgZm9yIHRoZSBTUkFNMiBjb250ZW50LCB0aGUgUlRDIHJlZ2lzdGVycywgUlRDIGJhY2t1cCByZWdpc3RlcnMgYW5kCitTdGFuZGJ5IGNpcmN1aXRyeS4KKyAgICAgICgrKSBvcHRpb24gYikgYWxsIGNsb2NrcyBvZmYgZXhjZXB0IExTSSBhbmQgTFNFLCBSUlMgYml0IGNsZWFyZWQgKHZvbHRhZ2UKK3JlZ3VsYXRvciB0aGVuIGRpc2FibGVkKS4gU1JBTSBhbmQgcmVnaXN0ZXIgY29udGVudHMgYXJlIGxvc3QgZXhjZXB0IGZvciB0aGUgUlRDCityZWdpc3RlcnMsIFJUQyBiYWNrdXAgcmVnaXN0ZXJzIGFuZCBTdGFuZGJ5IGNpcmN1aXRyeS4KKworICAgICAgKCsrKSBFbnRyeToKKyAgICAgICAgICAoKysrKSBUaGUgU3RhbmRieSBtb2RlIGlzIGVudGVyZWQgdGhyb3VnaCBIQUxfUFdSX0VudGVyU1RBTkRCWU1vZGUoKQorQVBJLiBTUkFNMSBhbmQgcmVnaXN0ZXIgY29udGVudHMgYXJlIGxvc3QgZXhjZXB0IGZvciByZWdpc3RlcnMgaW4gdGhlIEJhY2t1cAorZG9tYWluIGFuZCBTdGFuZGJ5IGNpcmN1aXRyeS4gU1JBTTIgY29udGVudCBjYW4gYmUgcHJlc2VydmVkIGlmIHRoZSBiaXQgUlJTIGlzCitzZXQgaW4gUFdSX0NSMyByZWdpc3Rlci4gVG8gZW5hYmxlIHRoaXMgZmVhdHVyZSwgdGhlIHVzZXIgY2FuIHJlc29ydCB0bworSEFMX1BXUkV4X0VuYWJsZVNSQU0yQ29udGVudFJldGVudGlvbigpIEFQSSB0byBzZXQgUlJTIGJpdC4KKworICAgICAgKCsrKSBFeGl0OgorICAgICAgICAgICgrKyspIFdLVVAgcGluIHJpc2luZyBlZGdlLCBSVEMgYWxhcm0gb3Igd2FrZXVwLCB0YW1wZXIgZXZlbnQsCit0aW1lLXN0YW1wIGV2ZW50LCBleHRlcm5hbCByZXNldCBpbiBOUlNUIHBpbiwgSVdERyByZXNldC4KKworICAgICAgWy4uXSAgICBBZnRlciB3YWtpbmcgdXAgZnJvbSBTdGFuZGJ5IG1vZGUsIHByb2dyYW0gZXhlY3V0aW9uIHJlc3RhcnRzIGluCit0aGUgc2FtZSB3YXkgYXMgYWZ0ZXIgYSBSZXNldC4KKworCisgICAgKioqIFNodXRkb3duIG1vZGUgKioqCisgICA9PT09PT09PT09PT09PT09PT09PT09CisgICAgIFsuLl0KKyAgICAgIEluIFNodXRkb3duIG1vZGUsCisgICAgICAgIHZvbHRhZ2UgcmVndWxhdG9yIGlzIGRpc2FibGVkLCBhbGwgY2xvY2tzIGFyZSBvZmYgZXhjZXB0IExTRSwgUlJTIGJpdCBpcworY2xlYXJlZC4gU1JBTSBhbmQgcmVnaXN0ZXJzIGNvbnRlbnRzIGFyZSBsb3N0IGV4Y2VwdCBmb3IgYmFja3VwIGRvbWFpbgorcmVnaXN0ZXJzLgorCisgICAgICAoKykgRW50cnk6CisgICAgICAgICAgVGhlIFNodXRkb3duIG1vZGUgaXMgZW50ZXJlZCB0aHJvdWdoIEhBTF9QV1JFeF9FbnRlclNIVVRET1dOTW9kZSgpCitBUEkuCisKKyAgICAgICgrKSBFeGl0OgorICAgICAgICAgICgrKykgV0tVUCBwaW4gcmlzaW5nIGVkZ2UsIFJUQyBhbGFybSBvciB3YWtldXAsIHRhbXBlciBldmVudCwKK3RpbWUtc3RhbXAgZXZlbnQsIGV4dGVybmFsIHJlc2V0IGluIE5SU1QgcGluLgorCisgICAgICAgICBbLi5dIEFmdGVyIHdha2luZyB1cCBmcm9tIFNodXRkb3duIG1vZGUsIHByb2dyYW0gZXhlY3V0aW9uIHJlc3RhcnRzIGluCit0aGUgc2FtZSB3YXkgYXMgYWZ0ZXIgYSBSZXNldC4KKworCisgICAqKiogQXV0by13YWtldXAgKEFXVSkgZnJvbSBsb3ctcG93ZXIgbW9kZSAqKioKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgIFRoZSBNQ1UgY2FuIGJlIHdva2VuIHVwIGZyb20gbG93LXBvd2VyIG1vZGUgYnkgYW4gUlRDIEFsYXJtIGV2ZW50LCBhbiBSVEMKKyAgICAgIFdha2V1cCBldmVudCwgYSB0YW1wZXIgZXZlbnQgb3IgYSB0aW1lLXN0YW1wIGV2ZW50LCB3aXRob3V0IGRlcGVuZGluZyBvbgorICAgICAgYW4gZXh0ZXJuYWwgaW50ZXJydXB0IChBdXRvLXdha2V1cCBtb2RlKS4KKworICAgICAgKCspIFJUQyBhdXRvLXdha2V1cCAoQVdVKSBmcm9tIHRoZSBTdG9wLCBTdGFuZGJ5IGFuZCBTaHV0ZG93biBtb2RlcworCisKKyAgICAgICAgKCsrKSBUbyB3YWtlIHVwIGZyb20gdGhlIFN0b3AgbW9kZSB3aXRoIGFuIFJUQyBhbGFybSBldmVudCwgaXQgaXMKK25lY2Vzc2FyeSB0byBjb25maWd1cmUgdGhlIFJUQyB0byBnZW5lcmF0ZSB0aGUgUlRDIGFsYXJtIHVzaW5nIHRoZQorSEFMX1JUQ19TZXRBbGFybV9JVCgpIGZ1bmN0aW9uLgorCisgICAgICAgICgrKykgVG8gd2FrZSB1cCBmcm9tIHRoZSBTdG9wIG1vZGUgd2l0aCBhbiBSVEMgVGFtcGVyIG9yIHRpbWUgc3RhbXAKK2V2ZW50LCBpdCBpcyBuZWNlc3NhcnkgdG8gY29uZmlndXJlIHRoZSBSVEMgdG8gZGV0ZWN0IHRoZSB0YW1wZXIgb3IgdGltZSBzdGFtcAorZXZlbnQgdXNpbmcgdGhlIEhBTF9SVENFeF9TZXRUaW1lU3RhbXBfSVQoKSBvciBIQUxfUlRDRXhfU2V0VGFtcGVyX0lUKCkKK2Z1bmN0aW9ucy4KKworICAgICAgICAoKyspIFRvIHdha2UgdXAgZnJvbSB0aGUgU3RvcCBtb2RlIHdpdGggYW4gUlRDIFdha2VVcCBldmVudCwgaXQgaXMKK25lY2Vzc2FyeSB0byBjb25maWd1cmUgdGhlIFJUQyB0byBnZW5lcmF0ZSB0aGUgUlRDIFdha2VVcCBldmVudCB1c2luZyB0aGUKK0hBTF9SVENFeF9TZXRXYWtlVXBUaW1lcl9JVCgpIGZ1bmN0aW9uLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAqIEBicmllZiBDb25maWd1cmUgdGhlIHZvbHRhZ2UgdGhyZXNob2xkIGRldGVjdGVkIGJ5IHRoZSBQb3dlciBWb2x0YWdlIERldGVjdG9yCisgKiAoUFZEKS4KKyAqIEBwYXJhbSBzQ29uZmlnUFZEOiBwb2ludGVyIHRvIGEgUFdSX1BWRFR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhlCisgKiBQVkQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4KKyAqIEBub3RlIFJlZmVyIHRvIHRoZSBlbGVjdHJpY2FsIGNoYXJhY3RlcmlzdGljcyBvZiB5b3VyIGRldmljZSBkYXRhc2hlZXQgZm9yCisgKiAgICAgICAgIG1vcmUgZGV0YWlscyBhYm91dCB0aGUgdm9sdGFnZSB0aHJlc2hvbGRzIGNvcnJlc3BvbmRpbmcgdG8gZWFjaAorICogICAgICAgICBkZXRlY3Rpb24gbGV2ZWwuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BXUl9Db25maWdQVkQoUFdSX1BWRFR5cGVEZWYgKnNDb25maWdQVkQpIHsKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1BXUl9QVkRfTEVWRUwoc0NvbmZpZ1BWRC0+UFZETGV2ZWwpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1BXUl9QVkRfTU9ERShzQ29uZmlnUFZELT5Nb2RlKSk7CisKKyAgLyogU2V0IFBMUyBiaXRzIGFjY29yZGluZyB0byBQVkRMZXZlbCB2YWx1ZSAqLworICBNT0RJRllfUkVHKFBXUi0+Q1IyLCBQV1JfQ1IyX1BMUywgc0NvbmZpZ1BWRC0+UFZETGV2ZWwpOworCisgIC8qIENsZWFyIGFueSBwcmV2aW91cyBjb25maWcuIEtlZXAgaXQgY2xlYXIgaWYgbm8gZXZlbnQgb3IgSVQgbW9kZSBpcyBzZWxlY3RlZAorICAgKi8KKyAgX19IQUxfUFdSX1BWRF9FWFRJX0RJU0FCTEVfRVZFTlQoKTsKKyAgX19IQUxfUFdSX1BWRF9FWFRJX0RJU0FCTEVfSVQoKTsKKyAgX19IQUxfUFdSX1BWRF9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCk7CisgIF9fSEFMX1BXUl9QVkRfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCk7CisKKyAgLyogQ29uZmlndXJlIGludGVycnVwdCBtb2RlICovCisgIGlmICgoc0NvbmZpZ1BWRC0+TW9kZSAmIFBWRF9NT0RFX0lUKSA9PSBQVkRfTU9ERV9JVCkgeworICAgIF9fSEFMX1BXUl9QVkRfRVhUSV9FTkFCTEVfSVQoKTsKKyAgfQorCisgIC8qIENvbmZpZ3VyZSBldmVudCBtb2RlICovCisgIGlmICgoc0NvbmZpZ1BWRC0+TW9kZSAmIFBWRF9NT0RFX0VWVCkgPT0gUFZEX01PREVfRVZUKSB7CisgICAgX19IQUxfUFdSX1BWRF9FWFRJX0VOQUJMRV9FVkVOVCgpOworICB9CisKKyAgLyogQ29uZmlndXJlIHRoZSBlZGdlICovCisgIGlmICgoc0NvbmZpZ1BWRC0+TW9kZSAmIFBWRF9SSVNJTkdfRURHRSkgPT0gUFZEX1JJU0lOR19FREdFKSB7CisgICAgX19IQUxfUFdSX1BWRF9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpOworICB9CisKKyAgaWYgKChzQ29uZmlnUFZELT5Nb2RlICYgUFZEX0ZBTExJTkdfRURHRSkgPT0gUFZEX0ZBTExJTkdfRURHRSkgeworICAgIF9fSEFMX1BXUl9QVkRfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCk7CisgIH0KKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiBFbmFibGUgdGhlIFBvd2VyIFZvbHRhZ2UgRGV0ZWN0b3IgKFBWRCkuCisgKiBAcmV0dmFsIE5vbmUKKyAqLwordm9pZCBIQUxfUFdSX0VuYWJsZVBWRCh2b2lkKSB7IFNFVF9CSVQoUFdSLT5DUjIsIFBXUl9DUjJfUFZERSk7IH0KKworLyoqCisgKiBAYnJpZWYgRGlzYWJsZSB0aGUgUG93ZXIgVm9sdGFnZSBEZXRlY3RvciAoUFZEKS4KKyAqIEByZXR2YWwgTm9uZQorICovCit2b2lkIEhBTF9QV1JfRGlzYWJsZVBWRCh2b2lkKSB7IENMRUFSX0JJVChQV1ItPkNSMiwgUFdSX0NSMl9QVkRFKTsgfQorCisvKioKKyAqIEBicmllZiBFbmFibGUgdGhlIFdha2VVcCBQSU54IGZ1bmN0aW9uYWxpdHkuCisgKiBAcGFyYW0gV2FrZVVwUGluUG9sYXJpdHk6IFNwZWNpZmllcyB3aGljaCBXYWtlLVVwIHBpbiB0byBlbmFibGUuCisgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBsZWdhY3kgdmFsdWVzIHdoaWNoIHNldAorICogdGhlIGRlZmF1bHQgcG9sYXJpdHkgaS5lLiBkZXRlY3Rpb24gb24gaGlnaCBsZXZlbCAocmlzaW5nIGVkZ2UpOgorICogICAgICAgICAgIEBhcmcgQHJlZiBQV1JfV0FLRVVQX1BJTjEsIFBXUl9XQUtFVVBfUElOMiwgUFdSX1dBS0VVUF9QSU4zLAorICogUFdSX1dBS0VVUF9QSU40LCBQV1JfV0FLRVVQX1BJTjUKKyAqCisgKiAgICAgICAgIG9yIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlIHdoZXJlIHRoZSB1c2VyIGNhbiBleHBsaWNpdGx5IHNwZWNpZnkKKyAqIHRoZSBlbmFibGVkIHBpbiBhbmQgdGhlIGNob3NlbiBwb2xhcml0eToKKyAqICAgICAgICAgICBAYXJnIEByZWYgUFdSX1dBS0VVUF9QSU4xX0hJR0ggb3IgUFdSX1dBS0VVUF9QSU4xX0xPVworICogICAgICAgICAgIEBhcmcgQHJlZiBQV1JfV0FLRVVQX1BJTjJfSElHSCBvciBQV1JfV0FLRVVQX1BJTjJfTE9XCisgKiAgICAgICAgICAgQGFyZyBAcmVmIFBXUl9XQUtFVVBfUElOM19ISUdIIG9yIFBXUl9XQUtFVVBfUElOM19MT1cKKyAqICAgICAgICAgICBAYXJnIEByZWYgUFdSX1dBS0VVUF9QSU40X0hJR0ggb3IgUFdSX1dBS0VVUF9QSU40X0xPVworICogICAgICAgICAgIEBhcmcgQHJlZiBQV1JfV0FLRVVQX1BJTjVfSElHSCBvciBQV1JfV0FLRVVQX1BJTjVfTE9XCisgKiBAbm90ZSAgUFdSX1dBS0VVUF9QSU54IGFuZCBQV1JfV0FLRVVQX1BJTnhfSElHSCBhcmUgZXF1aXZhbGVudC4KKyAqIEByZXR2YWwgTm9uZQorICovCit2b2lkIEhBTF9QV1JfRW5hYmxlV2FrZVVwUGluKHVpbnQzMl90IFdha2VVcFBpblBvbGFyaXR5KSB7CisgIGFzc2VydF9wYXJhbShJU19QV1JfV0FLRVVQX1BJTihXYWtlVXBQaW5Qb2xhcml0eSkpOworCisgIC8qIFNwZWNpZmllcyB0aGUgV2FrZS1VcCBwaW4gcG9sYXJpdHkgZm9yIHRoZSBldmVudCBkZXRlY3Rpb24KKyAgICAocmlzaW5nIG9yIGZhbGxpbmcgZWRnZSkgKi8KKyAgTU9ESUZZX1JFRyhQV1ItPkNSNCwgKFBXUl9DUjNfRVdVUCAmIFdha2VVcFBpblBvbGFyaXR5KSwKKyAgICAgICAgICAgICAoV2FrZVVwUGluUG9sYXJpdHkgPj4gUFdSX1dVUF9QT0xBUklUWV9TSElGVCkpOworCisgIC8qIEVuYWJsZSB3YWtlLXVwIHBpbiAqLworICBTRVRfQklUKFBXUi0+Q1IzLCAoUFdSX0NSM19FV1VQICYgV2FrZVVwUGluUG9sYXJpdHkpKTsKK30KKworLyoqCisgKiBAYnJpZWYgRGlzYWJsZSB0aGUgV2FrZVVwIFBJTnggZnVuY3Rpb25hbGl0eS4KKyAqIEBwYXJhbSBXYWtlVXBQaW54OiBTcGVjaWZpZXMgdGhlIFBvd2VyIFdha2UtVXAgcGluIHRvIGRpc2FibGUuCisgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgQGFyZyBAcmVmIFBXUl9XQUtFVVBfUElOMSwgUFdSX1dBS0VVUF9QSU4yLCBQV1JfV0FLRVVQX1BJTjMsCisgKiBQV1JfV0FLRVVQX1BJTjQsIFBXUl9XQUtFVVBfUElONQorICogQHJldHZhbCBOb25lCisgKi8KK3ZvaWQgSEFMX1BXUl9EaXNhYmxlV2FrZVVwUGluKHVpbnQzMl90IFdha2VVcFBpbngpIHsKKyAgYXNzZXJ0X3BhcmFtKElTX1BXUl9XQUtFVVBfUElOKFdha2VVcFBpbngpKTsKKworICBDTEVBUl9CSVQoUFdSLT5DUjMsIChQV1JfQ1IzX0VXVVAgJiBXYWtlVXBQaW54KSk7Cit9CisKKy8qKgorICogQGJyaWVmIEVudGVyIFNsZWVwIG9yIExvdy1wb3dlciBTbGVlcCBtb2RlLgorICogQG5vdGUgIEluIFNsZWVwL0xvdy1wb3dlciBTbGVlcCBtb2RlLCBhbGwgSS9PIHBpbnMga2VlcCB0aGUgc2FtZSBzdGF0ZSBhcyBpbgorICogUnVuIG1vZGUuCisgKiBAcGFyYW0gUmVndWxhdG9yOiBTcGVjaWZpZXMgdGhlIHJlZ3VsYXRvciBzdGF0ZSBpbiBTbGVlcC9Mb3ctcG93ZXIgU2xlZXAKKyAqIG1vZGUuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfTUFJTlJFR1VMQVRPUl9PTiBTbGVlcCBtb2RlIChyZWd1bGF0b3IgaW4gbWFpbiBtb2RlKQorICogICAgICAgICAgICBAYXJnIEByZWYgUFdSX0xPV1BPV0VSUkVHVUxBVE9SX09OIExvdy1wb3dlciBTbGVlcCBtb2RlIChyZWd1bGF0b3IKKyAqIGluIGxvdy1wb3dlciBtb2RlKQorICogQG5vdGUgIExvdy1wb3dlciBTbGVlcCBtb2RlIGlzIGVudGVyZWQgZnJvbSBMb3ctcG93ZXIgUnVuIG1vZGUuIFRoZXJlZm9yZSwgaWYKKyAqIG5vdCB5ZXQgaW4gTG93LXBvd2VyIFJ1biBtb2RlIGJlZm9yZSBjYWxsaW5nIEhBTF9QV1JfRW50ZXJTTEVFUE1vZGUoKSB3aXRoCisgKiBSZWd1bGF0b3Igc2V0IHRvIFBXUl9MT1dQT1dFUlJFR1VMQVRPUl9PTiwgdGhlIHVzZXIgY2FuIG9wdGlvbmFsbHkgY29uZmlndXJlCisgKiB0aGUgRmxhc2ggaW4gcG93ZXItZG93biBtb25kZSBpbiBzZXR0aW5nIHRoZSBTTEVFUF9QRCBiaXQgaW4gRkxBU0hfQUNSCisgKiByZWdpc3Rlci4gQWRkaXRpb25hbGx5LCB0aGUgY2xvY2sgZnJlcXVlbmN5IG11c3QgYmUgcmVkdWNlZCBiZWxvdyAyIE1Iei4KKyAqICAgICAgICBTZXR0aW5nIFNMRUVQX1BEIGluIEZMQVNIX0FDUiB0aGVuIGFwcHJvcHJpYXRlbHkgcmVkdWNpbmcgdGhlIGNsb2NrCisgKiBmcmVxdWVuY3kgbXVzdCBiZSBkb25lIGJlZm9yZSBjYWxsaW5nIEhBTF9QV1JfRW50ZXJTTEVFUE1vZGUoKSBBUEkuCisgKiBAbm90ZSAgV2hlbiBleGl0aW5nIExvdy1wb3dlciBTbGVlcCBtb2RlLCB0aGUgTUNVIGlzIGluIExvdy1wb3dlciBSdW4gbW9kZS4KKyAqIFRvIG1vdmUgaW4gUnVuIG1vZGUsIHRoZSB1c2VyIG11c3QgcmVzb3J0IHRvCisgKiBIQUxfUFdSRXhfRGlzYWJsZUxvd1Bvd2VyUnVuTW9kZSgpIEFQSS4KKyAqIEBwYXJhbSBTTEVFUEVudHJ5OiBTcGVjaWZpZXMgaWYgU2xlZXAgbW9kZSBpcyBlbnRlcmVkIHdpdGggV0ZJIG9yIFdGRQorICogaW5zdHJ1Y3Rpb24uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfU0xFRVBFTlRSWV9XRkkgZW50ZXIgU2xlZXAgb3IgTG93LXBvd2VyIFNsZWVwIG1vZGUKKyAqIHdpdGggV0ZJIGluc3RydWN0aW9uCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfU0xFRVBFTlRSWV9XRkUgZW50ZXIgU2xlZXAgb3IgTG93LXBvd2VyIFNsZWVwIG1vZGUKKyAqIHdpdGggV0ZFIGluc3RydWN0aW9uCisgKiBAbm90ZSAgV2hlbiBXRkkgZW50cnkgaXMgdXNlZCwgdGljayBpbnRlcnJ1cHQgaGF2ZSB0byBiZSBkaXNhYmxlZCBpZiBub3QKKyAqIGRlc2lyZWQgYXMgdGhlIGludGVycnVwdCB3YWtlIHVwIHNvdXJjZS4KKyAqIEByZXR2YWwgTm9uZQorICovCit2b2lkIEhBTF9QV1JfRW50ZXJTTEVFUE1vZGUodWludDMyX3QgUmVndWxhdG9yLCB1aW50OF90IFNMRUVQRW50cnkpIHsKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1BXUl9SRUdVTEFUT1IoUmVndWxhdG9yKSk7CisgIGFzc2VydF9wYXJhbShJU19QV1JfU0xFRVBfRU5UUlkoU0xFRVBFbnRyeSkpOworCisgIC8qIFNldCBSZWd1bGF0b3IgcGFyYW1ldGVyICovCisgIGlmIChSZWd1bGF0b3IgPT0gUFdSX01BSU5SRUdVTEFUT1JfT04pIHsKKyAgICAvKiBJZiBpbiBsb3ctcG93ZXIgcnVuIG1vZGUgYXQgdGhpcyBwb2ludCwgZXhpdCBpdCAqLworICAgIGlmIChIQUxfSVNfQklUX1NFVChQV1ItPlNSMiwgUFdSX1NSMl9SRUdMUEYpKSB7CisgICAgICAodm9pZClIQUxfUFdSRXhfRGlzYWJsZUxvd1Bvd2VyUnVuTW9kZSgpOworICAgIH0KKyAgICAvKiBSZWd1bGF0b3Igbm93IGluIG1haW4gbW9kZS4gKi8KKyAgfSBlbHNlIHsKKyAgICAvKiBJZiBpbiBydW4gbW9kZSwgZmlyc3QgbW92ZSB0byBsb3ctcG93ZXIgcnVuIG1vZGUuCisgICAgICAgVGhlIHN5c3RlbSBjbG9jayBmcmVxdWVuY3kgbXVzdCBiZSBiZWxvdyAyIE1IeiBhdCB0aGlzIHBvaW50LiAqLworICAgIGlmIChIQUxfSVNfQklUX1NFVChQV1ItPlNSMiwgUFdSX1NSMl9SRUdMUEYpID09IDBVKSB7CisgICAgICBIQUxfUFdSRXhfRW5hYmxlTG93UG93ZXJSdW5Nb2RlKCk7CisgICAgfQorICB9CisKKyAgLyogQ2xlYXIgU0xFRVBERUVQIGJpdCBvZiBDb3J0ZXggU3lzdGVtIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyAgQ0xFQVJfQklUKFNDQi0+U0NSLCAoKHVpbnQzMl90KVNDQl9TQ1JfU0xFRVBERUVQX01zaykpOworCisgIC8qIFNlbGVjdCBTTEVFUCBtb2RlIGVudHJ5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoU0xFRVBFbnRyeSA9PSBQV1JfU0xFRVBFTlRSWV9XRkkpIHsKKyAgICAvKiBSZXF1ZXN0IFdhaXQgRm9yIEludGVycnVwdCAqLworICAgIF9fV0ZJKCk7CisgIH0gZWxzZSB7CisgICAgLyogUmVxdWVzdCBXYWl0IEZvciBFdmVudCAqLworICAgIF9fU0VWKCk7CisgICAgX19XRkUoKTsKKyAgICBfX1dGRSgpOworICB9Cit9CisKKy8qKgorICogQGJyaWVmIEVudGVyIFN0b3AgbW9kZQorICogQG5vdGUgIFRoaXMgQVBJIGlzIG5hbWVkIEhBTF9QV1JfRW50ZXJTVE9QTW9kZSB0byBlbnN1cmUgY29tcGF0aWJpbGl0eSB3aXRoCisgKiBsZWdhY3kgY29kZSBydW5uaW5nIG9uIGRldmljZXMgd2hlcmUgb25seSAiU3RvcCBtb2RlIiBpcyBtZW50aW9uZWQgd2l0aCBtYWluCisgKiBvciBsb3cgcG93ZXIgcmVndWxhdG9yIE9OLgorICogQG5vdGUgIEluIFN0b3AgbW9kZSwgYWxsIEkvTyBwaW5zIGtlZXAgdGhlIHNhbWUgc3RhdGUgYXMgaW4gUnVuIG1vZGUuCisgKiBAbm90ZSAgQWxsIGNsb2NrcyBpbiB0aGUgVkNPUkUgZG9tYWluIGFyZSBzdG9wcGVkOyB0aGUgUExMLAorICogICAgICAgIHRoZSBIU0kgYW5kIHRoZSBIU0Ugb3NjaWxsYXRvcnMgYXJlIGRpc2FibGVkLiBTb21lIHBlcmlwaGVyYWxzIHdpdGgKKyAqIHRoZSB3YWtldXAgY2FwYWJpbGl0eSAoSTJDeCwgVVNBUlR4IGFuZCBMUFVBUlQpIGNhbiBzd2l0Y2ggb24gdGhlIEhTSSB0bworICogcmVjZWl2ZSBhIGZyYW1lLCBhbmQgc3dpdGNoIG9mZiB0aGUgSFNJIGFmdGVyIHJlY2VpdmluZyB0aGUgZnJhbWUgaWYgaXQgaXMKKyAqIG5vdCBhIHdha2V1cCBmcmFtZS4gSW4gdGhpcyBjYXNlLCB0aGUgSFNJIGNsb2NrIGlzIHByb3BhZ2F0ZWQgb25seSB0byB0aGUKKyAqIHBlcmlwaGVyYWwgcmVxdWVzdGluZyBpdC4gU1JBTTEsIFNSQU0yIGFuZCByZWdpc3RlciBjb250ZW50cyBhcmUgcHJlc2VydmVkLgorICogICAgICAgIFRoZSBCT1IgaXMgYXZhaWxhYmxlLgorICogICAgICAgIFRoZSB2b2x0YWdlIHJlZ3VsYXRvciBjYW4gYmUgY29uZmlndXJlZCBlaXRoZXIgaW4gbm9ybWFsIChTdG9wIDApIG9yCisgKiBsb3ctcG93ZXIgbW9kZSAoU3RvcCAxKS4KKyAqIEBub3RlICBXaGVuIGV4aXRpbmcgU3RvcCAwIG9yIFN0b3AgMSBtb2RlIGJ5IGlzc3VpbmcgYW4gaW50ZXJydXB0IG9yIGEgd2FrZXVwCisgKiBldmVudCwgdGhlIEhTSSBSQyBvc2NpbGxhdG9yIGlzIHNlbGVjdGVkIGFzIHN5c3RlbSBjbG9jay4KKyAqIEBub3RlICBXaGVuIHRoZSB2b2x0YWdlIHJlZ3VsYXRvciBvcGVyYXRlcyBpbiBsb3cgcG93ZXIgbW9kZSAoU3RvcCAxKSwgYW4KKyAqIGFkZGl0aW9uYWwgc3RhcnR1cCBkZWxheSBpcyBpbmN1cnJlZCB3aGVuIHdha2luZyB1cC4gQnkga2VlcGluZyB0aGUgaW50ZXJuYWwKKyAqIHJlZ3VsYXRvciBPTiBkdXJpbmcgU3RvcCBtb2RlIChTdG9wIDApLCB0aGUgY29uc3VtcHRpb24gaXMgaGlnaGVyIGFsdGhvdWdoCisgKiB0aGUgc3RhcnR1cCB0aW1lIGlzIHJlZHVjZWQuCisgKiBAcGFyYW0gUmVndWxhdG9yOiBTcGVjaWZpZXMgdGhlIHJlZ3VsYXRvciBzdGF0ZSBpbiBTdG9wIG1vZGUuCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIEByZWYgUFdSX01BSU5SRUdVTEFUT1JfT04gIFN0b3AgMCBtb2RlIChtYWluIHJlZ3VsYXRvciBPTikKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFBXUl9MT1dQT1dFUlJFR1VMQVRPUl9PTiAgU3RvcCAxIG1vZGUgKGxvdyBwb3dlcgorICogcmVndWxhdG9yIE9OKQorICogQHBhcmFtIFNUT1BFbnRyeTogU3BlY2lmaWVzIFN0b3AgMCBvciBTdG9wIDEgbW9kZSBpcyBlbnRlcmVkIHdpdGggV0ZJIG9yIFdGRQorICogaW5zdHJ1Y3Rpb24uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfU1RPUEVOVFJZX1dGSSAgRW50ZXIgU3RvcCAwIG9yIFN0b3AgMSBtb2RlIHdpdGggV0ZJCisgKiBpbnN0cnVjdGlvbi4KKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFBXUl9TVE9QRU5UUllfV0ZFICBFbnRlciBTdG9wIDAgb3IgU3RvcCAxIG1vZGUgd2l0aCBXRkUKKyAqIGluc3RydWN0aW9uLgorICogQHJldHZhbCBOb25lCisgKi8KK3ZvaWQgSEFMX1BXUl9FbnRlclNUT1BNb2RlKHVpbnQzMl90IFJlZ3VsYXRvciwgdWludDhfdCBTVE9QRW50cnkpIHsKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1BXUl9SRUdVTEFUT1IoUmVndWxhdG9yKSk7CisKKyAgaWYgKFJlZ3VsYXRvciA9PSBQV1JfTE9XUE9XRVJSRUdVTEFUT1JfT04pIHsKKyAgICBIQUxfUFdSRXhfRW50ZXJTVE9QMU1vZGUoU1RPUEVudHJ5KTsKKyAgfSBlbHNlIHsKKyAgICBIQUxfUFdSRXhfRW50ZXJTVE9QME1vZGUoU1RPUEVudHJ5KTsKKyAgfQorfQorCisvKioKKyAqIEBicmllZiBFbnRlciBTdGFuZGJ5IG1vZGUuCisgKiBAbm90ZSAgSW4gU3RhbmRieSBtb2RlLCB0aGUgUExMLCB0aGUgSFNJIGFuZCB0aGUgSFNFIG9zY2lsbGF0b3JzIGFyZSBzd2l0Y2hlZAorICogICAgICAgIG9mZi4gVGhlIHZvbHRhZ2UgcmVndWxhdG9yIGlzIGRpc2FibGVkLCBleGNlcHQgd2hlbiBTUkFNMiBjb250ZW50IGlzCisgKiBwcmVzZXJ2ZWQgaW4gd2hpY2ggY2FzZSB0aGUgcmVndWxhdG9yIGlzIGluIGxvdy1wb3dlciBtb2RlLiBTUkFNMSBhbmQKKyAqIHJlZ2lzdGVyIGNvbnRlbnRzIGFyZSBsb3N0IGV4Y2VwdCBmb3IgcmVnaXN0ZXJzIGluIHRoZSBCYWNrdXAgZG9tYWluIGFuZAorICogICAgICAgIFN0YW5kYnkgY2lyY3VpdHJ5LiBTUkFNMiBjb250ZW50IGNhbiBiZSBwcmVzZXJ2ZWQgaWYgdGhlIGJpdCBSUlMgaXMKKyAqIHNldCBpbiBQV1JfQ1IzIHJlZ2lzdGVyLiBUbyBlbmFibGUgdGhpcyBmZWF0dXJlLCB0aGUgdXNlciBjYW4gcmVzb3J0IHRvCisgKiBIQUxfUFdSRXhfRW5hYmxlU1JBTTJDb250ZW50UmV0ZW50aW9uKCkgQVBJIHRvIHNldCBSUlMgYml0LiBUaGUgQk9SIGlzCisgKiBhdmFpbGFibGUuCisgKiBAbm90ZSAgVGhlIEkvT3MgY2FuIGJlIGNvbmZpZ3VyZWQgZWl0aGVyIHdpdGggYSBwdWxsLXVwIG9yIHB1bGwtZG93biBvciBjYW4KKyAqIGJlIGtlcHQgaW4gYW5hbG9nIHN0YXRlLiBIQUxfUFdSRXhfRW5hYmxlR1BJT1B1bGxVcCgpIGFuZAorICogSEFMX1BXUkV4X0VuYWJsZUdQSU9QdWxsRG93bigpIHJlc3BlY3RpdmVseSBlbmFibGUgUHVsbCBVcCBhbmQgUHVsbCBEb3duCisgKiBzdGF0ZSwgSEFMX1BXUkV4X0Rpc2FibGVHUElPUHVsbFVwKCkgYW5kIEhBTF9QV1JFeF9EaXNhYmxlR1BJT1B1bGxEb3duKCkKKyAqIGRpc2FibGUgdGhlIHNhbWUuIFRoZXNlIHN0YXRlcyBhcmUgZWZmZWN0aXZlIGluIFN0YW5kYnkgbW9kZSBvbmx5IGlmIEFQQyBiaXQKKyAqIGlzIHNldCB0aHJvdWdoIEhBTF9QV1JFeF9FbmFibGVQdWxsVXBQdWxsRG93bkNvbmZpZygpIEFQSS4KKyAqIEByZXR2YWwgTm9uZQorICovCit2b2lkIEhBTF9QV1JfRW50ZXJTVEFOREJZTW9kZSh2b2lkKSB7CisgIC8qIFNldCBTdGFuZC1ieSBtb2RlICovCisgIE1PRElGWV9SRUcoUFdSLT5DUjEsIFBXUl9DUjFfTFBNUywgUFdSX0NSMV9MUE1TX1NUQU5EQlkpOworCisgIC8qIFNldCBTTEVFUERFRVAgYml0IG9mIENvcnRleCBTeXN0ZW0gQ29udHJvbCBSZWdpc3RlciAqLworICBTRVRfQklUKFNDQi0+U0NSLCAoKHVpbnQzMl90KVNDQl9TQ1JfU0xFRVBERUVQX01zaykpOworCisvKiBUaGlzIG9wdGlvbiBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IHN0b3JlIG9wZXJhdGlvbnMgYXJlIGNvbXBsZXRlZCAqLworI2lmIGRlZmluZWQoX19DQ19BUk0pCisgIF9fZm9yY2Vfc3RvcmVzKCk7CisjZW5kaWYKKyAgLyogUmVxdWVzdCBXYWl0IEZvciBJbnRlcnJ1cHQgKi8KKyAgX19XRkkoKTsKK30KKworLyoqCisgKiBAYnJpZWYgSW5kaWNhdGUgU2xlZXAtT24tRXhpdCB3aGVuIHJldHVybmluZyBmcm9tIEhhbmRsZXIgbW9kZSB0byBUaHJlYWQKKyAqIG1vZGUuCisgKiBAbm90ZSBTZXQgU0xFRVBPTkVYSVQgYml0IG9mIFNDUiByZWdpc3Rlci4gV2hlbiB0aGlzIGJpdCBpcyBzZXQsIHRoZQorICogcHJvY2Vzc29yIHJlLWVudGVycyBTTEVFUCBtb2RlIHdoZW4gYW4gaW50ZXJydXB0aW9uIGhhbmRsaW5nIGlzIG92ZXIuIFNldHRpbmcKKyAqIHRoaXMgYml0IGlzIHVzZWZ1bCB3aGVuIHRoZSBwcm9jZXNzb3IgaXMgZXhwZWN0ZWQgdG8gcnVuIG9ubHkgb24KKyAqICAgICAgIGludGVycnVwdGlvbnMgaGFuZGxpbmcuCisgKiBAcmV0dmFsIE5vbmUKKyAqLwordm9pZCBIQUxfUFdSX0VuYWJsZVNsZWVwT25FeGl0KHZvaWQpIHsKKyAgLyogU2V0IFNMRUVQT05FWElUIGJpdCBvZiBDb3J0ZXggU3lzdGVtIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyAgU0VUX0JJVChTQ0ItPlNDUiwgKCh1aW50MzJfdClTQ0JfU0NSX1NMRUVQT05FWElUX01zaykpOworfQorCisvKioKKyAqIEBicmllZiBEaXNhYmxlIFNsZWVwLU9uLUV4aXQgZmVhdHVyZSB3aGVuIHJldHVybmluZyBmcm9tIEhhbmRsZXIgbW9kZSB0bworICogVGhyZWFkIG1vZGUuCisgKiBAbm90ZSBDbGVhciBTTEVFUE9ORVhJVCBiaXQgb2YgU0NSIHJlZ2lzdGVyLiBXaGVuIHRoaXMgYml0IGlzIHNldCwgdGhlCisgKiBwcm9jZXNzb3IgcmUtZW50ZXJzIFNMRUVQIG1vZGUgd2hlbiBhbiBpbnRlcnJ1cHRpb24gaGFuZGxpbmcgaXMgb3Zlci4KKyAqIEByZXR2YWwgTm9uZQorICovCit2b2lkIEhBTF9QV1JfRGlzYWJsZVNsZWVwT25FeGl0KHZvaWQpIHsKKyAgLyogQ2xlYXIgU0xFRVBPTkVYSVQgYml0IG9mIENvcnRleCBTeXN0ZW0gQ29udHJvbCBSZWdpc3RlciAqLworICBDTEVBUl9CSVQoU0NCLT5TQ1IsICgodWludDMyX3QpU0NCX1NDUl9TTEVFUE9ORVhJVF9Nc2spKTsKK30KKworLyoqCisgKiBAYnJpZWYgRW5hYmxlIENPUlRFWCBNNCBTRVZPTlBFTkQgYml0LgorICogQG5vdGUgU2V0IFNFVk9OUEVORCBiaXQgb2YgU0NSIHJlZ2lzdGVyLiBXaGVuIHRoaXMgYml0IGlzIHNldCwgdGhpcyBjYXVzZXMKKyAqICAgICAgIFdGRSB0byB3YWtlIHVwIHdoZW4gYW4gaW50ZXJydXB0IG1vdmVzIGZyb20gaW5hY3RpdmUgdG8gcGVuZGVkLgorICogQHJldHZhbCBOb25lCisgKi8KK3ZvaWQgSEFMX1BXUl9FbmFibGVTRVZPblBlbmQodm9pZCkgeworICAvKiBTZXQgU0VWT05QRU5EIGJpdCBvZiBDb3J0ZXggU3lzdGVtIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyAgU0VUX0JJVChTQ0ItPlNDUiwgKCh1aW50MzJfdClTQ0JfU0NSX1NFVk9OUEVORF9Nc2spKTsKK30KKworLyoqCisgKiBAYnJpZWYgRGlzYWJsZSBDT1JURVggTTQgU0VWT05QRU5EIGJpdC4KKyAqIEBub3RlIENsZWFyIFNFVk9OUEVORCBiaXQgb2YgU0NSIHJlZ2lzdGVyLiBXaGVuIHRoaXMgYml0IGlzIHNldCwgdGhpcyBjYXVzZXMKKyAqICAgICAgIFdGRSB0byB3YWtlIHVwIHdoZW4gYW4gaW50ZXJydXB0IG1vdmVzIGZyb20gaW5hY3RpdmUgdG8gcGVuZGVkLgorICogQHJldHZhbCBOb25lCisgKi8KK3ZvaWQgSEFMX1BXUl9EaXNhYmxlU0VWT25QZW5kKHZvaWQpIHsKKyAgLyogQ2xlYXIgU0VWT05QRU5EIGJpdCBvZiBDb3J0ZXggU3lzdGVtIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyAgQ0xFQVJfQklUKFNDQi0+U0NSLCAoKHVpbnQzMl90KVNDQl9TQ1JfU0VWT05QRU5EX01zaykpOworfQorCisvKioKKyAqIEBicmllZiBQV1IgUFZEIGludGVycnVwdCBjYWxsYmFjaworICogQHJldHZhbCBOb25lCisgKi8KK19fd2VhayB2b2lkIEhBTF9QV1JfUFZEQ2FsbGJhY2sodm9pZCkgeworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkOyB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1BXUl9QVkRDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisjZW5kaWYgLyogSEFMX1BXUl9NT0RVTEVfRU5BQkxFRCAqLworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLwpkaWZmIC0tZ2l0IGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3B3cl9leC5jIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3B3cl9leC5jCmluZGV4IDg4NjUzODEuLjA4MDYxYzggMTAwNjQ0Ci0tLSBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9wd3JfZXguYworKysgYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfcHdyX2V4LmMKQEAgLTEsMTA3OCArMSwxMDgyIEBACi0vKioNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQGZpbGUgICAgc3RtMzJnNHh4X2hhbF9wd3JfZXguYw0KLSAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtDQotICogQGJyaWVmICAgRXh0ZW5kZWQgUFdSIEhBTCBtb2R1bGUgZHJpdmVyLg0KLSAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcNCi0gKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIFBvd2VyIENvbnRyb2xsZXIgKFBXUikgcGVyaXBoZXJhbDoNCi0gKiAgICAgICAgICAgKyBFeHRlbmRlZCBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zDQotICogICAgICAgICAgICsgRXh0ZW5kZWQgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucw0KLSAqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEBhdHRlbnRpb24NCi0gKg0KLSAqIENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4NCi0gKg0KLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGVybXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZQ0KLSAqIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4NCi0gKiBJZiBubyBMSUNFTlNFIGZpbGUgY29tZXMgd2l0aCB0aGlzIHNvZnR3YXJlLCBpdCBpcyBwcm92aWRlZCBBUy1JUy4NCi0gKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKi8NCi0NCi0vKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpbmNsdWRlICJzdG0zMmc0eHhfaGFsLmgiDQotDQotLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzR4eF9IQUxfRHJpdmVyDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFBXUkV4IFBXUkV4DQotICogQGJyaWVmIFBXUiBFeHRlbmRlZCBIQUwgbW9kdWxlIGRyaXZlcg0KLSAqIEB7DQotICovDQotDQotI2lmZGVmIEhBTF9QV1JfTU9EVUxFX0VOQUJMRUQNCi0NCi0vKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotDQotI2lmIGRlZmluZWQoU1RNMzJHNDcxeHgpIHx8IGRlZmluZWQoU1RNMzJHNDczeHgpIHx8IGRlZmluZWQoU1RNMzJHNDc0eHgpIHx8IFwNCi0gICAgZGVmaW5lZChTVE0zMkc0ODN4eCkgfHwgZGVmaW5lZChTVE0zMkc0ODR4eCkNCi0jZGVmaW5lIFBXUl9QT1JURl9BVkFJTEFCTEVfUElOUyAweDAwMDBGRkZGVSAvKiBQRjAuLlBGMTUgKi8NCi0jZGVmaW5lIFBXUl9QT1JUR19BVkFJTEFCTEVfUElOUyAweDAwMDAwN0ZGVSAvKiBQRzAuLlBHMTAgKi8NCi0jZWxpZiBkZWZpbmVkKFNUTTMyRzQzMXh4KSB8fCBkZWZpbmVkKFNUTTMyRzQ0MXh4KSB8fCBkZWZpbmVkKFNUTTMyR0JLMUNCKSB8fCBcDQotICAgIGRlZmluZWQoU1RNMzJHNDkxeHgpIHx8IGRlZmluZWQoU1RNMzJHNEExeHgpDQotI2RlZmluZSBQV1JfUE9SVEZfQVZBSUxBQkxFX1BJTlMgMHgwMDAwMDYwN1UgLyogUEYwLi5QRjIgYW5kIFBGOSBhbmQgUEYxMCAqLw0KLSNkZWZpbmUgUFdSX1BPUlRHX0FWQUlMQUJMRV9QSU5TIDB4MDAwMDA0MDBVIC8qIFBHMTAgKi8NCi0jZW5kaWYNCi0NCi0vKiogQGRlZmdyb3VwIFBXUl9FeHRlbmRlZF9Qcml2YXRlX0RlZmluZXMgUFdSIEV4dGVuZGVkIFByaXZhdGUgRGVmaW5lcw0KLSAqIEB7DQotICovDQotDQotLyoqIEBkZWZncm91cCBQV1JFeF9QVk1fTW9kZV9NYXNrIFBXUiBQVk0gTW9kZSBNYXNrDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFBWTV9NT0RFX0lUIFwNCi0gIDB4MDAwMTAwMDBVIC8qITwgTWFzayBmb3IgaW50ZXJydXB0aW9uIHlpZWxkZWQgYnkgUFZNIHRocmVzaG9sZCBjcm9zc2luZyAqLw0KLSNkZWZpbmUgUFZNX01PREVfRVZUIFwNCi0gIDB4MDAwMjAwMDBVIC8qITwgTWFzayBmb3IgZXZlbnQgeWllbGRlZCBieSBQVk0gdGhyZXNob2xkIGNyb3NzaW5nICAgICAgICAqLw0KLSNkZWZpbmUgUFZNX1JJU0lOR19FREdFIFwNCi0gIDB4MDAwMDAwMDFVIC8qITwgTWFzayBmb3IgcmlzaW5nIGVkZ2Ugc2V0IGFzIFBWTSB0cmlnZ2VyICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgUFZNX0ZBTExJTkdfRURHRSBcDQotICAweDAwMDAwMDAyVSAvKiE8IE1hc2sgZm9yIGZhbGxpbmcgZWRnZSBzZXQgYXMgUFZNIHRyaWdnZXIgICAgICAgICAgICAgICAgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUFdSRXhfVGltZU91dF9WYWx1ZSBQV1IgRXh0ZW5kZWQgRmxhZyBTZXR0aW5nIFRpbWUgT3V0IFZhbHVlDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFBXUl9GTEFHX1NFVFRJTkdfREVMQVlfVVMgXA0KLSAgNTBVTCAvKiE8IFRpbWUgb3V0IHZhbHVlIGZvciBSRUdMUEYgYW5kIFZPU0YgZmxhZ3Mgc2V0dGluZyAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUFdSRXhfRXhwb3J0ZWRfRnVuY3Rpb25zIFBXUiBFeHRlbmRlZCBFeHBvcnRlZCBGdW5jdGlvbnMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUFdSRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBFeHRlbmRlZCBQZXJpcGhlcmFsIENvbnRyb2wNCi1mdW5jdGlvbnMNCi0gICogIEBicmllZiAgIEV4dGVuZGVkIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMNCi0gICoNCi1AdmVyYmF0aW0NCi0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICAgICAgICAgICAgIyMjIyMgRXh0ZW5kZWQgUGVyaXBoZXJhbCBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24NCi1mdW5jdGlvbnMgIyMjIyMNCi0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICBbLi5dDQotDQotQGVuZHZlcmJhdGltDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiBSZXR1cm4gVm9sdGFnZSBTY2FsaW5nIFJhbmdlLg0KLSAqIEByZXR2YWwgVk9TIGJpdCBmaWVsZCAoUFdSX1JFR1VMQVRPUl9WT0xUQUdFX1NDQUxFMSBvcg0KLSAqIFBXUl9SRUdVTEFUT1JfVk9MVEFHRV9TQ0FMRTIgb3IgUFdSX1JFR1VMQVRPUl9WT0xUQUdFX1NDQUxFMV9CT09TVCB3aGVuDQotICogYXBwbGljYWJsZSkNCi0gKi8NCi11aW50MzJfdCBIQUxfUFdSRXhfR2V0Vm9sdGFnZVJhbmdlKHZvaWQpIHsNCi0gIGlmIChSRUFEX0JJVChQV1ItPkNSMSwgUFdSX0NSMV9WT1MpID09IFBXUl9SRUdVTEFUT1JfVk9MVEFHRV9TQ0FMRTIpIHsNCi0gICAgcmV0dXJuIFBXUl9SRUdVTEFUT1JfVk9MVEFHRV9TQ0FMRTI7DQotICB9IGVsc2UgaWYgKFJFQURfQklUKFBXUi0+Q1I1LCBQV1JfQ1I1X1IxTU9ERSkgPT0gUFdSX0NSNV9SMU1PREUpIHsNCi0gICAgLyogUFdSX0NSNV9SMU1PREUgYml0IHNldCBtZWFucyB0aGF0IFJhbmdlIDEgQm9vc3QgaXMgZGlzYWJsZWQgKi8NCi0gICAgcmV0dXJuIFBXUl9SRUdVTEFUT1JfVk9MVEFHRV9TQ0FMRTE7DQotICB9IGVsc2Ugew0KLSAgICByZXR1cm4gUFdSX1JFR1VMQVRPUl9WT0xUQUdFX1NDQUxFMV9CT09TVDsNCi0gIH0NCi19DQotDQotLyoqDQotICogQGJyaWVmIENvbmZpZ3VyZSB0aGUgbWFpbiBpbnRlcm5hbCByZWd1bGF0b3Igb3V0cHV0IHZvbHRhZ2UuDQotICogQHBhcmFtICBWb2x0YWdlU2NhbGluZzogc3BlY2lmaWVzIHRoZSByZWd1bGF0b3Igb3V0cHV0IHZvbHRhZ2UgdG8gYWNoaWV2ZQ0KLSAqICAgICAgICAgYSB0cmFkZW9mZiBiZXR3ZWVuIHBlcmZvcm1hbmNlIGFuZCBwb3dlciBjb25zdW1wdGlvbi4NCi0gKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFBXUl9SRUdVTEFUT1JfVk9MVEFHRV9TQ0FMRTFfQk9PU1Qgd2hlbiBhdmFpbGFibGUsDQotICogUmVndWxhdG9yIHZvbHRhZ2Ugb3V0cHV0IHJhbmdlIDEgYm9vc3QgbW9kZSwgdHlwaWNhbCBvdXRwdXQgdm9sdGFnZSBhdCAxLjI4DQotICogViwgc3lzdGVtIGZyZXF1ZW5jeSB1cCB0byAxNzAgTUh6Lg0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFBXUl9SRUdVTEFUT1JfVk9MVEFHRV9TQ0FMRTEgUmVndWxhdG9yIHZvbHRhZ2Ugb3V0cHV0DQotICogcmFuZ2UgMSBtb2RlLCB0eXBpY2FsIG91dHB1dCB2b2x0YWdlIGF0IDEuMiBWLCBzeXN0ZW0gZnJlcXVlbmN5IHVwIHRvIDE1MA0KLSAqIE1Iei4NCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfUkVHVUxBVE9SX1ZPTFRBR0VfU0NBTEUyIFJlZ3VsYXRvciB2b2x0YWdlIG91dHB1dA0KLSAqIHJhbmdlIDIgbW9kZSwgdHlwaWNhbCBvdXRwdXQgdm9sdGFnZSBhdCAxLjAgViwgc3lzdGVtIGZyZXF1ZW5jeSB1cCB0byAyNiBNSHouDQotICogQG5vdGUgIFdoZW4gbW92aW5nIGZyb20gUmFuZ2UgMSB0byBSYW5nZSAyLCB0aGUgc3lzdGVtIGZyZXF1ZW5jeSBtdXN0IGJlDQotICogZGVjcmVhc2VkIHRvIGEgdmFsdWUgYmVsb3cgMjYgTUh6IGJlZm9yZSBjYWxsaW5nDQotICogSEFMX1BXUkV4X0NvbnRyb2xWb2x0YWdlU2NhbGluZygpIEFQSS4gV2hlbiBtb3ZpbmcgZnJvbSBSYW5nZSAyIHRvIFJhbmdlIDEsDQotICogdGhlIHN5c3RlbSBmcmVxdWVuY3kgY2FuIGJlIGluY3JlYXNlZCB0byBhIHZhbHVlIHVwIHRvIDE1MCBNSHogYWZ0ZXIgY2FsbGluZw0KLSAqIEhBTF9QV1JFeF9Db250cm9sVm9sdGFnZVNjYWxpbmcoKSBBUEkuIFdoZW4gbW92aW5nIGZyb20gUmFuZ2UgMSB0byBCb29zdCBNb2RlDQotICogUmFuZ2UgMSwgdGhlIHN5c3RlbSBmcmVxdWVuY3kgY2FuIGJlIGluY3JlYXNlZCB0byBhIHZhbHVlIHVwIHRvIDE3MCBNSHogYWZ0ZXINCi0gKiBjYWxsaW5nIEhBTF9QV1JFeF9Db250cm9sVm9sdGFnZVNjYWxpbmcoKSBBUEkuDQotICogQG5vdGUgIFdoZW4gbW92aW5nIGZyb20gUmFuZ2UgMiB0byBSYW5nZSAxLCB0aGUgQVBJIHdhaXRzIGZvciBWT1NGIGZsYWcgdG8gYmUNCi0gKiAgICAgICAgY2xlYXJlZCBiZWZvcmUgcmV0dXJuaW5nIHRoZSBzdGF0dXMuIElmIHRoZSBmbGFnIGlzIG5vdCBjbGVhcmVkIHdpdGhpbg0KLSAqICAgICAgICA1MCBtaWNyb3NlY29uZHMsIEhBTF9USU1FT1VUIHN0YXR1cyBpcyByZXBvcnRlZC4NCi0gKiBAcmV0dmFsIEhBTCBTdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfUFdSRXhfQ29udHJvbFZvbHRhZ2VTY2FsaW5nKHVpbnQzMl90IFZvbHRhZ2VTY2FsaW5nKSB7DQotICB1aW50MzJfdCB3YWl0X2xvb3BfaW5kZXg7DQotDQotICBhc3NlcnRfcGFyYW0oSVNfUFdSX1ZPTFRBR0VfU0NBTElOR19SQU5HRShWb2x0YWdlU2NhbGluZykpOw0KLQ0KLSAgaWYgKFZvbHRhZ2VTY2FsaW5nID09IFBXUl9SRUdVTEFUT1JfVk9MVEFHRV9TQ0FMRTFfQk9PU1QpIHsNCi0gICAgLyogSWYgY3VycmVudCByYW5nZSBpcyByYW5nZSAyICovDQotICAgIGlmIChSRUFEX0JJVChQV1ItPkNSMSwgUFdSX0NSMV9WT1MpID09IFBXUl9SRUdVTEFUT1JfVk9MVEFHRV9TQ0FMRTIpIHsNCi0gICAgICAvKiBNYWtlIHN1cmUgUmFuZ2UgMSBCb29zdCBpcyBlbmFibGVkICovDQotICAgICAgQ0xFQVJfQklUKFBXUi0+Q1I1LCBQV1JfQ1I1X1IxTU9ERSk7DQotDQotICAgICAgLyogU2V0IFJhbmdlIDEgKi8NCi0gICAgICBNT0RJRllfUkVHKFBXUi0+Q1IxLCBQV1JfQ1IxX1ZPUywgUFdSX1JFR1VMQVRPUl9WT0xUQUdFX1NDQUxFMSk7DQotDQotICAgICAgLyogV2FpdCB1bnRpbCBWT1NGIGlzIGNsZWFyZWQgKi8NCi0gICAgICB3YWl0X2xvb3BfaW5kZXggPQ0KLSAgICAgICAgICAoKFBXUl9GTEFHX1NFVFRJTkdfREVMQVlfVVMgKiBTeXN0ZW1Db3JlQ2xvY2spIC8gMTAwMDAwMFUpICsgMVU7DQotICAgICAgd2hpbGUgKChIQUxfSVNfQklUX1NFVChQV1ItPlNSMiwgUFdSX1NSMl9WT1NGKSkgJiYNCi0gICAgICAgICAgICAgKHdhaXRfbG9vcF9pbmRleCAhPSAwVSkpIHsNCi0gICAgICAgIHdhaXRfbG9vcF9pbmRleC0tOw0KLSAgICAgIH0NCi0gICAgICBpZiAoSEFMX0lTX0JJVF9TRVQoUFdSLT5TUjIsIFBXUl9TUjJfVk9TRikpIHsNCi0gICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsNCi0gICAgICB9DQotICAgIH0NCi0gICAgLyogSWYgY3VycmVudCByYW5nZSBpcyByYW5nZSAxIG5vcm1hbCBvciBib29zdCBtb2RlICovDQotICAgIGVsc2Ugew0KLSAgICAgIC8qIEVuYWJsZSBSYW5nZSAxIEJvb3N0IChubyBpc3N1ZSBpZiBiaXQgYWxyZWFkeSByZXNldCkgKi8NCi0gICAgICBDTEVBUl9CSVQoUFdSLT5DUjUsIFBXUl9DUjVfUjFNT0RFKTsNCi0gICAgfQ0KLSAgfSBlbHNlIGlmIChWb2x0YWdlU2NhbGluZyA9PSBQV1JfUkVHVUxBVE9SX1ZPTFRBR0VfU0NBTEUxKSB7DQotICAgIC8qIElmIGN1cnJlbnQgcmFuZ2UgaXMgcmFuZ2UgMiAqLw0KLSAgICBpZiAoUkVBRF9CSVQoUFdSLT5DUjEsIFBXUl9DUjFfVk9TKSA9PSBQV1JfUkVHVUxBVE9SX1ZPTFRBR0VfU0NBTEUyKSB7DQotICAgICAgLyogTWFrZSBzdXJlIFJhbmdlIDEgQm9vc3QgaXMgZGlzYWJsZWQgKi8NCi0gICAgICBTRVRfQklUKFBXUi0+Q1I1LCBQV1JfQ1I1X1IxTU9ERSk7DQotDQotICAgICAgLyogU2V0IFJhbmdlIDEgKi8NCi0gICAgICBNT0RJRllfUkVHKFBXUi0+Q1IxLCBQV1JfQ1IxX1ZPUywgUFdSX1JFR1VMQVRPUl9WT0xUQUdFX1NDQUxFMSk7DQotDQotICAgICAgLyogV2FpdCB1bnRpbCBWT1NGIGlzIGNsZWFyZWQgKi8NCi0gICAgICB3YWl0X2xvb3BfaW5kZXggPQ0KLSAgICAgICAgICAoKFBXUl9GTEFHX1NFVFRJTkdfREVMQVlfVVMgKiBTeXN0ZW1Db3JlQ2xvY2spIC8gMTAwMDAwMFUpICsgMVU7DQotICAgICAgd2hpbGUgKChIQUxfSVNfQklUX1NFVChQV1ItPlNSMiwgUFdSX1NSMl9WT1NGKSkgJiYNCi0gICAgICAgICAgICAgKHdhaXRfbG9vcF9pbmRleCAhPSAwVSkpIHsNCi0gICAgICAgIHdhaXRfbG9vcF9pbmRleC0tOw0KLSAgICAgIH0NCi0gICAgICBpZiAoSEFMX0lTX0JJVF9TRVQoUFdSLT5TUjIsIFBXUl9TUjJfVk9TRikpIHsNCi0gICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsNCi0gICAgICB9DQotICAgIH0NCi0gICAgLyogSWYgY3VycmVudCByYW5nZSBpcyByYW5nZSAxIG5vcm1hbCBvciBib29zdCBtb2RlICovDQotICAgIGVsc2Ugew0KLSAgICAgIC8qIERpc2FibGUgUmFuZ2UgMSBCb29zdCAobm8gaXNzdWUgaWYgYml0IGFscmVhZHkgc2V0KSAqLw0KLSAgICAgIFNFVF9CSVQoUFdSLT5DUjUsIFBXUl9DUjVfUjFNT0RFKTsNCi0gICAgfQ0KLSAgfSBlbHNlIHsNCi0gICAgLyogU2V0IFJhbmdlIDIgKi8NCi0gICAgTU9ESUZZX1JFRyhQV1ItPkNSMSwgUFdSX0NSMV9WT1MsIFBXUl9SRUdVTEFUT1JfVk9MVEFHRV9TQ0FMRTIpOw0KLSAgICAvKiBObyBuZWVkIHRvIHdhaXQgZm9yIFZPU0YgdG8gYmUgY2xlYXJlZCBmb3IgdGhpcyB0cmFuc2l0aW9uICovDQotICAgIC8qIFBXUl9DUjVfUjFNT0RFIGJpdCBzZXR0aW5nIGhhcyBubyBlZmZlY3QgaW4gUmFuZ2UgMiAgICAgICAgKi8NCi0gIH0NCi0NCi0gIHJldHVybiBIQUxfT0s7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBFbmFibGUgYmF0dGVyeSBjaGFyZ2luZy4NCi0gKiAgICAgICAgV2hlbiBWREQgaXMgcHJlc2VudCwgY2hhcmdlIHRoZSBleHRlcm5hbCBiYXR0ZXJ5IG9uIFZCQVQgdGhyb3VnaCBhbg0KLSAqIGludGVybmFsIHJlc2lzdG9yLg0KLSAqIEBwYXJhbSAgUmVzaXN0b3JTZWxlY3Rpb246IHNwZWNpZmllcyB0aGUgcmVzaXN0b3IgaW1wZWRhbmNlLg0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIEByZWYgUFdSX0JBVFRFUllfQ0hBUkdJTkdfUkVTSVNUT1JfNSAgICAgNSBrT2htcyByZXNpc3Rvcg0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFBXUl9CQVRURVJZX0NIQVJHSU5HX1JFU0lTVE9SXzFfNSAxLjUga09obXMgcmVzaXN0b3INCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi12b2lkIEhBTF9QV1JFeF9FbmFibGVCYXR0ZXJ5Q2hhcmdpbmcodWludDMyX3QgUmVzaXN0b3JTZWxlY3Rpb24pIHsNCi0gIGFzc2VydF9wYXJhbShJU19QV1JfQkFUVEVSWV9SRVNJU1RPUl9TRUxFQ1QoUmVzaXN0b3JTZWxlY3Rpb24pKTsNCi0NCi0gIC8qIFNwZWNpZnkgcmVzaXN0b3Igc2VsZWN0aW9uICovDQotICBNT0RJRllfUkVHKFBXUi0+Q1I0LCBQV1JfQ1I0X1ZCUlMsIFJlc2lzdG9yU2VsZWN0aW9uKTsNCi0NCi0gIC8qIEVuYWJsZSBiYXR0ZXJ5IGNoYXJnaW5nICovDQotICBTRVRfQklUKFBXUi0+Q1I0LCBQV1JfQ1I0X1ZCRSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBEaXNhYmxlIGJhdHRlcnkgY2hhcmdpbmcuDQotICogQHJldHZhbCBOb25lDQotICovDQotdm9pZCBIQUxfUFdSRXhfRGlzYWJsZUJhdHRlcnlDaGFyZ2luZyh2b2lkKSB7DQotICBDTEVBUl9CSVQoUFdSLT5DUjQsIFBXUl9DUjRfVkJFKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmIEVuYWJsZSBJbnRlcm5hbCBXYWtlLXVwIExpbmUuDQotICogQHJldHZhbCBOb25lDQotICovDQotdm9pZCBIQUxfUFdSRXhfRW5hYmxlSW50ZXJuYWxXYWtlVXBMaW5lKHZvaWQpIHsNCi0gIFNFVF9CSVQoUFdSLT5DUjMsIFBXUl9DUjNfRUlXRik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBEaXNhYmxlIEludGVybmFsIFdha2UtdXAgTGluZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi12b2lkIEhBTF9QV1JFeF9EaXNhYmxlSW50ZXJuYWxXYWtlVXBMaW5lKHZvaWQpIHsNCi0gIENMRUFSX0JJVChQV1ItPkNSMywgUFdSX0NSM19FSVdGKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmIEVuYWJsZSBHUElPIHB1bGwtdXAgc3RhdGUgaW4gU3RhbmRieSBhbmQgU2h1dGRvd24gbW9kZXMuDQotICogQG5vdGUgIFNldCB0aGUgcmVsZXZhbnQgUFV5IGJpdHMgb2YgUFdSX1BVQ1J4IHJlZ2lzdGVyIHRvIGNvbmZpZ3VyZSB0aGUgSS9PDQotICogaW4gcHVsbC11cCBzdGF0ZSBpbiBTdGFuZGJ5IGFuZCBTaHV0ZG93biBtb2Rlcy4NCi0gKiBAbm90ZSAgVGhpcyBzdGF0ZSBpcyBlZmZlY3RpdmUgaW4gU3RhbmRieSBhbmQgU2h1dGRvd24gbW9kZXMgb25seSBpZiBBUEMgYml0DQotICogICAgICAgIGlzIHNldCB0aHJvdWdoIEhBTF9QV1JFeF9FbmFibGVQdWxsVXBQdWxsRG93bkNvbmZpZygpIEFQSS4NCi0gKiBAbm90ZSAgVGhlIGNvbmZpZ3VyYXRpb24gaXMgbG9zdCB3aGVuIGV4aXRpbmcgdGhlIFNodXRkb3duIG1vZGUgZHVlIHRvIHRoZQ0KLSAqICAgICAgICBwb3dlci1vbiByZXNldCwgbWFpbnRhaW5lZCB3aGVuIGV4aXRpbmcgdGhlIFN0YW5kYnkgbW9kZS4NCi0gKiBAbm90ZSAgVG8gYXZvaWQgYW55IGNvbmZsaWN0IGF0IFN0YW5kYnkgYW5kIFNodXRkb3duIG1vZGVzIGV4aXRzLCB0aGUNCi0gKiBjb3JyZXNwb25kaW5nIFBEeSBiaXQgb2YgUFdSX1BEQ1J4IHJlZ2lzdGVyIGlzIGNsZWFyZWQgdW5sZXNzIGl0IGlzIHJlc2VydmVkLg0KLSAqIEBub3RlICBFdmVuIGlmIGEgUFV5IGJpdCB0byBzZXQgaXMgcmVzZXJ2ZWQsIHRoZSBvdGhlciBQVXkgYml0cyBlbnRlcmVkIGFzDQotICogaW5wdXQgcGFyYW1ldGVyIGF0IHRoZSBzYW1lIHRpbWUgYXJlIHNldC4NCi0gKiBAcGFyYW0gIEdQSU86IFNwZWNpZnkgdGhlIElPIHBvcnQuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBQV1JfR1BJT19BLCAuLi4sDQotICogUFdSX0dQSU9fRyAob3IgUFdSX0dQSU9fSSBkZXBlbmRpbmcgb24gdGhlIGRldmljZXMpIHRvIHNlbGVjdCB0aGUgR1BJTw0KLSAqIHBlcmlwaGVyYWwuDQotICogQHBhcmFtICBHUElPTnVtYmVyOiBTcGVjaWZ5IHRoZSBJL08gcGlucyBudW1iZXJzLg0KLSAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIFBXUl9HUElPX0JJVF8wLCAuLi4sIFBXUl9HUElPX0JJVF8xNSAoZXhjZXB0IGZvciB0aGUgcG9ydCB3aGVyZSBsZXNzDQotICogICAgICAgICBJL08gcGlucyBhcmUgYXZhaWxhYmxlKSBvciB0aGUgbG9naWNhbCBPUiBvZiBzZXZlcmFsIG9mIHRoZW0gdG8gc2V0DQotICogICAgICAgICBzZXZlcmFsIGJpdHMgZm9yIGEgZ2l2ZW4gcG9ydCBpbiBhIHNpbmdsZSBBUEkgY2FsbC4NCi0gKiBAcmV0dmFsIEhBTCBTdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfUFdSRXhfRW5hYmxlR1BJT1B1bGxVcCh1aW50MzJfdCBHUElPLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEdQSU9OdW1iZXIpIHsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsNCi0NCi0gIGFzc2VydF9wYXJhbShJU19QV1JfR1BJTyhHUElPKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfUFdSX0dQSU9fQklUX05VTUJFUihHUElPTnVtYmVyKSk7DQotDQotICBzd2l0Y2ggKEdQSU8pIHsNCi0gICAgY2FzZSBQV1JfR1BJT19BOg0KLSAgICAgIFNFVF9CSVQoUFdSLT5QVUNSQSwgKEdQSU9OdW1iZXIgJiAofihQV1JfR1BJT19CSVRfMTQpKSkpOw0KLSAgICAgIENMRUFSX0JJVChQV1ItPlBEQ1JBLA0KLSAgICAgICAgICAgICAgICAoR1BJT051bWJlciAmICh+KFBXUl9HUElPX0JJVF8xMyB8IFBXUl9HUElPX0JJVF8xNSkpKSk7DQotICAgICAgYnJlYWs7DQotICAgIGNhc2UgUFdSX0dQSU9fQjoNCi0gICAgICBTRVRfQklUKFBXUi0+UFVDUkIsIEdQSU9OdW1iZXIpOw0KLSAgICAgIENMRUFSX0JJVChQV1ItPlBEQ1JCLCAoR1BJT051bWJlciAmICh+KFBXUl9HUElPX0JJVF80KSkpKTsNCi0gICAgICBicmVhazsNCi0gICAgY2FzZSBQV1JfR1BJT19DOg0KLSAgICAgIFNFVF9CSVQoUFdSLT5QVUNSQywgR1BJT051bWJlcik7DQotICAgICAgQ0xFQVJfQklUKFBXUi0+UERDUkMsIEdQSU9OdW1iZXIpOw0KLSAgICAgIGJyZWFrOw0KLSAgICBjYXNlIFBXUl9HUElPX0Q6DQotICAgICAgU0VUX0JJVChQV1ItPlBVQ1JELCBHUElPTnVtYmVyKTsNCi0gICAgICBDTEVBUl9CSVQoUFdSLT5QRENSRCwgR1BJT051bWJlcik7DQotICAgICAgYnJlYWs7DQotICAgIGNhc2UgUFdSX0dQSU9fRToNCi0gICAgICBTRVRfQklUKFBXUi0+UFVDUkUsIEdQSU9OdW1iZXIpOw0KLSAgICAgIENMRUFSX0JJVChQV1ItPlBEQ1JFLCBHUElPTnVtYmVyKTsNCi0gICAgICBicmVhazsNCi0gICAgY2FzZSBQV1JfR1BJT19GOg0KLSAgICAgIFNFVF9CSVQoUFdSLT5QVUNSRiwgKEdQSU9OdW1iZXIgJiBQV1JfUE9SVEZfQVZBSUxBQkxFX1BJTlMpKTsNCi0gICAgICBDTEVBUl9CSVQoUFdSLT5QRENSRiwgKEdQSU9OdW1iZXIgJiBQV1JfUE9SVEZfQVZBSUxBQkxFX1BJTlMpKTsNCi0gICAgICBicmVhazsNCi0gICAgY2FzZSBQV1JfR1BJT19HOg0KLSAgICAgIFNFVF9CSVQoUFdSLT5QVUNSRywgKEdQSU9OdW1iZXIgJiBQV1JfUE9SVEdfQVZBSUxBQkxFX1BJTlMpKTsNCi0gICAgICBDTEVBUl9CSVQoUFdSLT5QRENSRywgKChHUElPTnVtYmVyICYgUFdSX1BPUlRHX0FWQUlMQUJMRV9QSU5TKSAmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAofihQV1JfR1BJT19CSVRfMTApKSkpOw0KLSAgICAgIGJyZWFrOw0KLSAgICBkZWZhdWx0Og0KLSAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsNCi0gICAgICBicmVhazsNCi0gIH0NCi0NCi0gIHJldHVybiBzdGF0dXM7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBEaXNhYmxlIEdQSU8gcHVsbC11cCBzdGF0ZSBpbiBTdGFuZGJ5IG1vZGUgYW5kIFNodXRkb3duIG1vZGVzLg0KLSAqIEBub3RlICBSZXNldCB0aGUgcmVsZXZhbnQgUFV5IGJpdHMgb2YgUFdSX1BVQ1J4IHJlZ2lzdGVyIHVzZWQgdG8gY29uZmlndXJlDQotICogdGhlIEkvTyBpbiBwdWxsLXVwIHN0YXRlIGluIFN0YW5kYnkgYW5kIFNodXRkb3duIG1vZGVzLg0KLSAqIEBub3RlICBFdmVuIGlmIGEgUFV5IGJpdCB0byByZXNldCBpcyByZXNlcnZlZCwgdGhlIG90aGVyIFBVeSBiaXRzIGVudGVyZWQgYXMNCi0gKiBpbnB1dCBwYXJhbWV0ZXIgYXQgdGhlIHNhbWUgdGltZSBhcmUgcmVzZXQuDQotICogQHBhcmFtICBHUElPOiBTcGVjaWZpZXMgdGhlIElPIHBvcnQuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBQV1JfR1BJT19BLCAuLi4sDQotICogUFdSX0dQSU9fRyAob3IgUFdSX0dQSU9fSSBkZXBlbmRpbmcgb24gdGhlIGRldmljZXMpIHRvIHNlbGVjdCB0aGUgR1BJTw0KLSAqIHBlcmlwaGVyYWwuDQotICogQHBhcmFtICBHUElPTnVtYmVyOiBTcGVjaWZ5IHRoZSBJL08gcGlucyBudW1iZXJzLg0KLSAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIFBXUl9HUElPX0JJVF8wLCAuLi4sIFBXUl9HUElPX0JJVF8xNSAoZXhjZXB0IGZvciB0aGUgcG9ydCB3aGVyZSBsZXNzDQotICogICAgICAgICBJL08gcGlucyBhcmUgYXZhaWxhYmxlKSBvciB0aGUgbG9naWNhbCBPUiBvZiBzZXZlcmFsIG9mIHRoZW0gdG8gcmVzZXQNCi0gKiAgICAgICAgIHNldmVyYWwgYml0cyBmb3IgYSBnaXZlbiBwb3J0IGluIGEgc2luZ2xlIEFQSSBjYWxsLg0KLSAqIEByZXR2YWwgSEFMIFN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9QV1JFeF9EaXNhYmxlR1BJT1B1bGxVcCh1aW50MzJfdCBHUElPLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBHUElPTnVtYmVyKSB7DQotICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7DQotDQotICBhc3NlcnRfcGFyYW0oSVNfUFdSX0dQSU8oR1BJTykpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1BXUl9HUElPX0JJVF9OVU1CRVIoR1BJT051bWJlcikpOw0KLQ0KLSAgc3dpdGNoIChHUElPKSB7DQotICAgIGNhc2UgUFdSX0dQSU9fQToNCi0gICAgICBDTEVBUl9CSVQoUFdSLT5QVUNSQSwgKEdQSU9OdW1iZXIgJiAofihQV1JfR1BJT19CSVRfMTQpKSkpOw0KLSAgICAgIGJyZWFrOw0KLSAgICBjYXNlIFBXUl9HUElPX0I6DQotICAgICAgQ0xFQVJfQklUKFBXUi0+UFVDUkIsIEdQSU9OdW1iZXIpOw0KLSAgICAgIGJyZWFrOw0KLSAgICBjYXNlIFBXUl9HUElPX0M6DQotICAgICAgQ0xFQVJfQklUKFBXUi0+UFVDUkMsIEdQSU9OdW1iZXIpOw0KLSAgICAgIGJyZWFrOw0KLSAgICBjYXNlIFBXUl9HUElPX0Q6DQotICAgICAgQ0xFQVJfQklUKFBXUi0+UFVDUkQsIEdQSU9OdW1iZXIpOw0KLSAgICAgIGJyZWFrOw0KLSAgICBjYXNlIFBXUl9HUElPX0U6DQotICAgICAgQ0xFQVJfQklUKFBXUi0+UFVDUkUsIEdQSU9OdW1iZXIpOw0KLSAgICAgIGJyZWFrOw0KLSAgICBjYXNlIFBXUl9HUElPX0Y6DQotICAgICAgQ0xFQVJfQklUKFBXUi0+UFVDUkYsIChHUElPTnVtYmVyICYgUFdSX1BPUlRGX0FWQUlMQUJMRV9QSU5TKSk7DQotICAgICAgYnJlYWs7DQotICAgIGNhc2UgUFdSX0dQSU9fRzoNCi0gICAgICBDTEVBUl9CSVQoUFdSLT5QVUNSRywgKEdQSU9OdW1iZXIgJiBQV1JfUE9SVEdfQVZBSUxBQkxFX1BJTlMpKTsNCi0gICAgICBicmVhazsNCi0gICAgZGVmYXVsdDoNCi0gICAgICBzdGF0dXMgPSBIQUxfRVJST1I7DQotICAgICAgYnJlYWs7DQotICB9DQotDQotICByZXR1cm4gc3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgRW5hYmxlIEdQSU8gcHVsbC1kb3duIHN0YXRlIGluIFN0YW5kYnkgYW5kIFNodXRkb3duIG1vZGVzLg0KLSAqIEBub3RlICBTZXQgdGhlIHJlbGV2YW50IFBEeSBiaXRzIG9mIFBXUl9QRENSeCByZWdpc3RlciB0byBjb25maWd1cmUgdGhlIEkvTw0KLSAqIGluIHB1bGwtZG93biBzdGF0ZSBpbiBTdGFuZGJ5IGFuZCBTaHV0ZG93biBtb2Rlcy4NCi0gKiBAbm90ZSAgVGhpcyBzdGF0ZSBpcyBlZmZlY3RpdmUgaW4gU3RhbmRieSBhbmQgU2h1dGRvd24gbW9kZXMgb25seSBpZiBBUEMgYml0DQotICogICAgICAgIGlzIHNldCB0aHJvdWdoIEhBTF9QV1JFeF9FbmFibGVQdWxsVXBQdWxsRG93bkNvbmZpZygpIEFQSS4NCi0gKiBAbm90ZSAgVGhlIGNvbmZpZ3VyYXRpb24gaXMgbG9zdCB3aGVuIGV4aXRpbmcgdGhlIFNodXRkb3duIG1vZGUgZHVlIHRvIHRoZQ0KLSAqICAgICAgICBwb3dlci1vbiByZXNldCwgbWFpbnRhaW5lZCB3aGVuIGV4aXRpbmcgdGhlIFN0YW5kYnkgbW9kZS4NCi0gKiBAbm90ZSAgVG8gYXZvaWQgYW55IGNvbmZsaWN0IGF0IFN0YW5kYnkgYW5kIFNodXRkb3duIG1vZGVzIGV4aXRzLCB0aGUNCi0gKiBjb3JyZXNwb25kaW5nIFBVeSBiaXQgb2YgUFdSX1BVQ1J4IHJlZ2lzdGVyIGlzIGNsZWFyZWQgdW5sZXNzIGl0IGlzIHJlc2VydmVkLg0KLSAqIEBub3RlICBFdmVuIGlmIGEgUER5IGJpdCB0byBzZXQgaXMgcmVzZXJ2ZWQsIHRoZSBvdGhlciBQRHkgYml0cyBlbnRlcmVkIGFzDQotICogaW5wdXQgcGFyYW1ldGVyIGF0IHRoZSBzYW1lIHRpbWUgYXJlIHNldC4NCi0gKiBAcGFyYW0gIEdQSU86IFNwZWNpZnkgdGhlIElPIHBvcnQuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZQ0KLSAqIFBXUl9HUElPX0EuLlBXUl9HUElPX0cgKG9yIFBXUl9HUElPX0kgZGVwZW5kaW5nIG9uIHRoZSBkZXZpY2VzKSB0byBzZWxlY3QgdGhlDQotICogR1BJTyBwZXJpcGhlcmFsLg0KLSAqIEBwYXJhbSAgR1BJT051bWJlcjogU3BlY2lmeSB0aGUgSS9PIHBpbnMgbnVtYmVycy4NCi0gKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBQV1JfR1BJT19CSVRfMCwgLi4uLCBQV1JfR1BJT19CSVRfMTUgKGV4Y2VwdCBmb3IgdGhlIHBvcnQgd2hlcmUgbGVzcw0KLSAqICAgICAgICAgSS9PIHBpbnMgYXJlIGF2YWlsYWJsZSkgb3IgdGhlIGxvZ2ljYWwgT1Igb2Ygc2V2ZXJhbCBvZiB0aGVtIHRvIHNldA0KLSAqICAgICAgICAgc2V2ZXJhbCBiaXRzIGZvciBhIGdpdmVuIHBvcnQgaW4gYSBzaW5nbGUgQVBJIGNhbGwuDQotICogQHJldHZhbCBIQUwgU3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BXUkV4X0VuYWJsZUdQSU9QdWxsRG93bih1aW50MzJfdCBHUElPLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgR1BJT051bWJlcikgew0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOw0KLQ0KLSAgYXNzZXJ0X3BhcmFtKElTX1BXUl9HUElPKEdQSU8pKTsNCi0gIGFzc2VydF9wYXJhbShJU19QV1JfR1BJT19CSVRfTlVNQkVSKEdQSU9OdW1iZXIpKTsNCi0NCi0gIHN3aXRjaCAoR1BJTykgew0KLSAgICBjYXNlIFBXUl9HUElPX0E6DQotICAgICAgU0VUX0JJVChQV1ItPlBEQ1JBLA0KLSAgICAgICAgICAgICAgKEdQSU9OdW1iZXIgJiAofihQV1JfR1BJT19CSVRfMTMgfCBQV1JfR1BJT19CSVRfMTUpKSkpOw0KLSAgICAgIENMRUFSX0JJVChQV1ItPlBVQ1JBLCAoR1BJT051bWJlciAmICh+KFBXUl9HUElPX0JJVF8xNCkpKSk7DQotICAgICAgYnJlYWs7DQotICAgIGNhc2UgUFdSX0dQSU9fQjoNCi0gICAgICBTRVRfQklUKFBXUi0+UERDUkIsIChHUElPTnVtYmVyICYgKH4oUFdSX0dQSU9fQklUXzQpKSkpOw0KLSAgICAgIENMRUFSX0JJVChQV1ItPlBVQ1JCLCBHUElPTnVtYmVyKTsNCi0gICAgICBicmVhazsNCi0gICAgY2FzZSBQV1JfR1BJT19DOg0KLSAgICAgIFNFVF9CSVQoUFdSLT5QRENSQywgR1BJT051bWJlcik7DQotICAgICAgQ0xFQVJfQklUKFBXUi0+UFVDUkMsIEdQSU9OdW1iZXIpOw0KLSAgICAgIGJyZWFrOw0KLSAgICBjYXNlIFBXUl9HUElPX0Q6DQotICAgICAgU0VUX0JJVChQV1ItPlBEQ1JELCBHUElPTnVtYmVyKTsNCi0gICAgICBDTEVBUl9CSVQoUFdSLT5QVUNSRCwgR1BJT051bWJlcik7DQotICAgICAgYnJlYWs7DQotICAgIGNhc2UgUFdSX0dQSU9fRToNCi0gICAgICBTRVRfQklUKFBXUi0+UERDUkUsIEdQSU9OdW1iZXIpOw0KLSAgICAgIENMRUFSX0JJVChQV1ItPlBVQ1JFLCBHUElPTnVtYmVyKTsNCi0gICAgICBicmVhazsNCi0gICAgY2FzZSBQV1JfR1BJT19GOg0KLSAgICAgIFNFVF9CSVQoUFdSLT5QRENSRiwgKEdQSU9OdW1iZXIgJiBQV1JfUE9SVEZfQVZBSUxBQkxFX1BJTlMpKTsNCi0gICAgICBDTEVBUl9CSVQoUFdSLT5QVUNSRiwgKEdQSU9OdW1iZXIgJiBQV1JfUE9SVEZfQVZBSUxBQkxFX1BJTlMpKTsNCi0gICAgICBicmVhazsNCi0gICAgY2FzZSBQV1JfR1BJT19HOg0KLSAgICAgIFNFVF9CSVQoUFdSLT5QRENSRywNCi0gICAgICAgICAgICAgICgoR1BJT051bWJlciAmIFBXUl9QT1JUR19BVkFJTEFCTEVfUElOUykgJiAofihQV1JfR1BJT19CSVRfMTApKSkpOw0KLSAgICAgIENMRUFSX0JJVChQV1ItPlBVQ1JHLCAoR1BJT051bWJlciAmIFBXUl9QT1JUR19BVkFJTEFCTEVfUElOUykpOw0KLSAgICAgIGJyZWFrOw0KLSAgICBkZWZhdWx0Og0KLSAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsNCi0gICAgICBicmVhazsNCi0gIH0NCi0NCi0gIHJldHVybiBzdGF0dXM7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBEaXNhYmxlIEdQSU8gcHVsbC1kb3duIHN0YXRlIGluIFN0YW5kYnkgYW5kIFNodXRkb3duIG1vZGVzLg0KLSAqIEBub3RlICBSZXNldCB0aGUgcmVsZXZhbnQgUER5IGJpdHMgb2YgUFdSX1BEQ1J4IHJlZ2lzdGVyIHVzZWQgdG8gY29uZmlndXJlDQotICogdGhlIEkvTyBpbiBwdWxsLWRvd24gc3RhdGUgaW4gU3RhbmRieSBhbmQgU2h1dGRvd24gbW9kZXMuDQotICogQG5vdGUgIEV2ZW4gaWYgYSBQRHkgYml0IHRvIHJlc2V0IGlzIHJlc2VydmVkLCB0aGUgb3RoZXIgUER5IGJpdHMgZW50ZXJlZCBhcw0KLSAqIGlucHV0IHBhcmFtZXRlciBhdCB0aGUgc2FtZSB0aW1lIGFyZSByZXNldC4NCi0gKiBAcGFyYW0gIEdQSU86IFNwZWNpZmllcyB0aGUgSU8gcG9ydC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlDQotICogUFdSX0dQSU9fQS4uUFdSX0dQSU9fRyAob3IgUFdSX0dQSU9fSSBkZXBlbmRpbmcgb24gdGhlIGRldmljZXMpIHRvIHNlbGVjdCB0aGUNCi0gKiBHUElPIHBlcmlwaGVyYWwuDQotICogQHBhcmFtICBHUElPTnVtYmVyOiBTcGVjaWZ5IHRoZSBJL08gcGlucyBudW1iZXJzLg0KLSAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgIFBXUl9HUElPX0JJVF8wLCAuLi4sIFBXUl9HUElPX0JJVF8xNSAoZXhjZXB0IGZvciB0aGUgcG9ydCB3aGVyZSBsZXNzDQotICogICAgICAgICBJL08gcGlucyBhcmUgYXZhaWxhYmxlKSBvciB0aGUgbG9naWNhbCBPUiBvZiBzZXZlcmFsIG9mIHRoZW0gdG8gcmVzZXQNCi0gKiAgICAgICAgIHNldmVyYWwgYml0cyBmb3IgYSBnaXZlbiBwb3J0IGluIGEgc2luZ2xlIEFQSSBjYWxsLg0KLSAqIEByZXR2YWwgSEFMIFN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9QV1JFeF9EaXNhYmxlR1BJT1B1bGxEb3duKHVpbnQzMl90IEdQSU8sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgR1BJT051bWJlcikgew0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOw0KLQ0KLSAgYXNzZXJ0X3BhcmFtKElTX1BXUl9HUElPKEdQSU8pKTsNCi0gIGFzc2VydF9wYXJhbShJU19QV1JfR1BJT19CSVRfTlVNQkVSKEdQSU9OdW1iZXIpKTsNCi0NCi0gIHN3aXRjaCAoR1BJTykgew0KLSAgICBjYXNlIFBXUl9HUElPX0E6DQotICAgICAgQ0xFQVJfQklUKFBXUi0+UERDUkEsDQotICAgICAgICAgICAgICAgIChHUElPTnVtYmVyICYgKH4oUFdSX0dQSU9fQklUXzEzIHwgUFdSX0dQSU9fQklUXzE1KSkpKTsNCi0gICAgICBicmVhazsNCi0gICAgY2FzZSBQV1JfR1BJT19COg0KLSAgICAgIENMRUFSX0JJVChQV1ItPlBEQ1JCLCAoR1BJT051bWJlciAmICh+KFBXUl9HUElPX0JJVF80KSkpKTsNCi0gICAgICBicmVhazsNCi0gICAgY2FzZSBQV1JfR1BJT19DOg0KLSAgICAgIENMRUFSX0JJVChQV1ItPlBEQ1JDLCBHUElPTnVtYmVyKTsNCi0gICAgICBicmVhazsNCi0gICAgY2FzZSBQV1JfR1BJT19EOg0KLSAgICAgIENMRUFSX0JJVChQV1ItPlBEQ1JELCBHUElPTnVtYmVyKTsNCi0gICAgICBicmVhazsNCi0gICAgY2FzZSBQV1JfR1BJT19FOg0KLSAgICAgIENMRUFSX0JJVChQV1ItPlBEQ1JFLCBHUElPTnVtYmVyKTsNCi0gICAgICBicmVhazsNCi0gICAgY2FzZSBQV1JfR1BJT19GOg0KLSAgICAgIENMRUFSX0JJVChQV1ItPlBEQ1JGLCAoR1BJT051bWJlciAmIFBXUl9QT1JURl9BVkFJTEFCTEVfUElOUykpOw0KLSAgICAgIGJyZWFrOw0KLSAgICBjYXNlIFBXUl9HUElPX0c6DQotICAgICAgQ0xFQVJfQklUKFBXUi0+UERDUkcsICgoR1BJT051bWJlciAmIFBXUl9QT1JUR19BVkFJTEFCTEVfUElOUykgJg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKH4oUFdSX0dQSU9fQklUXzEwKSkpKTsNCi0gICAgICBicmVhazsNCi0gICAgZGVmYXVsdDoNCi0gICAgICBzdGF0dXMgPSBIQUxfRVJST1I7DQotICAgICAgYnJlYWs7DQotICB9DQotDQotICByZXR1cm4gc3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgRW5hYmxlIHB1bGwtdXAgYW5kIHB1bGwtZG93biBjb25maWd1cmF0aW9uLg0KLSAqIEBub3RlICBXaGVuIEFQQyBiaXQgaXMgc2V0LCB0aGUgSS9PIHB1bGwtdXAgYW5kIHB1bGwtZG93biBjb25maWd1cmF0aW9ucw0KLSAqIGRlZmluZWQgaW4gUFdSX1BVQ1J4IGFuZCBQV1JfUERDUnggcmVnaXN0ZXJzIGFyZSBhcHBsaWVkIGluIFN0YW5kYnkgYW5kDQotICogU2h1dGRvd24gbW9kZXMuDQotICogQG5vdGUgIFB1bGwtdXAgc2V0IGJ5IFBVeSBiaXQgb2YgUFdSX1BVQ1J4IHJlZ2lzdGVyIGlzIG5vdCBhY3RpdmF0ZWQgaWYgdGhlDQotICogY29ycmVzcG9uZGluZyBQRHkgYml0IG9mIFBXUl9QRENSeCByZWdpc3RlciBpcyBhbHNvIHNldCAocHVsbC1kb3duDQotICogY29uZmlndXJhdGlvbiBwcmlvcml0eSBpcyBoaWdoZXIpLiBIQUxfUFdSRXhfRW5hYmxlR1BJT1B1bGxVcCgpIGFuZA0KLSAqIEhBTF9QV1JFeF9FbmFibGVHUElPUHVsbERvd24oKSBBUEkncyBlbnN1cmUgdGhlcmUgaXMgbm8gY29uZmxpY3Qgd2hlbiBzZXR0aW5nDQotICogUFV5IG9yIFBEeSBiaXQuDQotICogQHJldHZhbCBOb25lDQotICovDQotdm9pZCBIQUxfUFdSRXhfRW5hYmxlUHVsbFVwUHVsbERvd25Db25maWcodm9pZCkgew0KLSAgU0VUX0JJVChQV1ItPkNSMywgUFdSX0NSM19BUEMpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgRGlzYWJsZSBwdWxsLXVwIGFuZCBwdWxsLWRvd24gY29uZmlndXJhdGlvbi4NCi0gKiBAbm90ZSAgV2hlbiBBUEMgYml0IGlzIGNsZWFyZWQsIHRoZSBJL08gcHVsbC11cCBhbmQgcHVsbC1kb3duIGNvbmZpZ3VyYXRpb25zDQotICogZGVmaW5lZCBpbiBQV1JfUFVDUnggYW5kIFBXUl9QRENSeCByZWdpc3RlcnMgYXJlIG5vdCBhcHBsaWVkIGluIFN0YW5kYnkgYW5kDQotICogU2h1dGRvd24gbW9kZXMuDQotICogQHJldHZhbCBOb25lDQotICovDQotdm9pZCBIQUxfUFdSRXhfRGlzYWJsZVB1bGxVcFB1bGxEb3duQ29uZmlnKHZvaWQpIHsNCi0gIENMRUFSX0JJVChQV1ItPkNSMywgUFdSX0NSM19BUEMpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgRW5hYmxlIFNSQU0yIGNvbnRlbnQgcmV0ZW50aW9uIGluIFN0YW5kYnkgbW9kZS4NCi0gKiBAbm90ZSAgV2hlbiBSUlMgYml0IGlzIHNldCwgU1JBTTIgaXMgcG93ZXJlZCBieSB0aGUgbG93LXBvd2VyIHJlZ3VsYXRvciBpbg0KLSAqICAgICAgICAgU3RhbmRieSBtb2RlIGFuZCBpdHMgY29udGVudCBpcyBrZXB0Lg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXZvaWQgSEFMX1BXUkV4X0VuYWJsZVNSQU0yQ29udGVudFJldGVudGlvbih2b2lkKSB7DQotICBTRVRfQklUKFBXUi0+Q1IzLCBQV1JfQ1IzX1JSUyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBEaXNhYmxlIFNSQU0yIGNvbnRlbnQgcmV0ZW50aW9uIGluIFN0YW5kYnkgbW9kZS4NCi0gKiBAbm90ZSAgV2hlbiBSUlMgYml0IGlzIHJlc2V0LCBTUkFNMiBpcyBwb3dlcmVkIG9mZiBpbiBTdGFuZGJ5IG1vZGUNCi0gKiAgICAgICAgYW5kIGl0cyBjb250ZW50IGlzIGxvc3QuDQotICogQHJldHZhbCBOb25lDQotICovDQotdm9pZCBIQUxfUFdSRXhfRGlzYWJsZVNSQU0yQ29udGVudFJldGVudGlvbih2b2lkKSB7DQotICBDTEVBUl9CSVQoUFdSLT5DUjMsIFBXUl9DUjNfUlJTKTsNCi19DQotDQotI2lmIGRlZmluZWQoUFdSX0NSMl9QVk1FMSkNCi0vKioNCi0gKiBAYnJpZWYgRW5hYmxlIHRoZSBQb3dlciBWb2x0YWdlIE1vbml0b3JpbmcgMTogVkREQSB2ZXJzdXMgRkFTVENPTVAgbWluaW11bQ0KLSAqIHZvbHRhZ2UuDQotICogQHJldHZhbCBOb25lDQotICovDQotdm9pZCBIQUxfUFdSRXhfRW5hYmxlUFZNMSh2b2lkKSB7IFNFVF9CSVQoUFdSLT5DUjIsIFBXUl9QVk1fMSk7IH0NCi0NCi0vKioNCi0gKiBAYnJpZWYgRGlzYWJsZSB0aGUgUG93ZXIgVm9sdGFnZSBNb25pdG9yaW5nIDE6IFZEREEgdmVyc3VzIEZBU1RDT01QIG1pbmltdW0NCi0gKiB2b2x0YWdlLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXZvaWQgSEFMX1BXUkV4X0Rpc2FibGVQVk0xKHZvaWQpIHsgQ0xFQVJfQklUKFBXUi0+Q1IyLCBQV1JfUFZNXzEpOyB9DQotI2VuZGlmIC8qIFBXUl9DUjJfUFZNRTEgKi8NCi0NCi0jaWYgZGVmaW5lZChQV1JfQ1IyX1BWTUUyKQ0KLS8qKg0KLSAqIEBicmllZiBFbmFibGUgdGhlIFBvd2VyIFZvbHRhZ2UgTW9uaXRvcmluZyAyOiBWRERBIHZlcnN1cyBGQVNUREFDIG1pbmltdW0NCi0gKiB2b2x0YWdlLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXZvaWQgSEFMX1BXUkV4X0VuYWJsZVBWTTIodm9pZCkgeyBTRVRfQklUKFBXUi0+Q1IyLCBQV1JfUFZNXzIpOyB9DQotDQotLyoqDQotICogQGJyaWVmIERpc2FibGUgdGhlIFBvd2VyIFZvbHRhZ2UgTW9uaXRvcmluZyAyOiBWRERBIHZlcnN1cyBGQVNUREFDIG1pbmltdW0NCi0gKiB2b2x0YWdlLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXZvaWQgSEFMX1BXUkV4X0Rpc2FibGVQVk0yKHZvaWQpIHsgQ0xFQVJfQklUKFBXUi0+Q1IyLCBQV1JfUFZNXzIpOyB9DQotI2VuZGlmIC8qIFBXUl9DUjJfUFZNRTIgKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgRW5hYmxlIHRoZSBQb3dlciBWb2x0YWdlIE1vbml0b3JpbmcgMzogVkREQSB2ZXJzdXMgQURDIG1pbmltdW0NCi0gKiB2b2x0YWdlIDEuNjJWLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXZvaWQgSEFMX1BXUkV4X0VuYWJsZVBWTTModm9pZCkgeyBTRVRfQklUKFBXUi0+Q1IyLCBQV1JfUFZNXzMpOyB9DQotDQotLyoqDQotICogQGJyaWVmIERpc2FibGUgdGhlIFBvd2VyIFZvbHRhZ2UgTW9uaXRvcmluZyAzOiBWRERBIHZlcnN1cyBBREMgbWluaW11bQ0KLSAqIHZvbHRhZ2UgMS42MlYuDQotICogQHJldHZhbCBOb25lDQotICovDQotdm9pZCBIQUxfUFdSRXhfRGlzYWJsZVBWTTModm9pZCkgeyBDTEVBUl9CSVQoUFdSLT5DUjIsIFBXUl9QVk1fMyk7IH0NCi0NCi0vKioNCi0gKiBAYnJpZWYgRW5hYmxlIHRoZSBQb3dlciBWb2x0YWdlIE1vbml0b3JpbmcgNDogVkREQSB2ZXJzdXMgT1BBTVAvREFDIG1pbmltdW0NCi0gKiB2b2x0YWdlIDEuOFYuDQotICogQHJldHZhbCBOb25lDQotICovDQotdm9pZCBIQUxfUFdSRXhfRW5hYmxlUFZNNCh2b2lkKSB7IFNFVF9CSVQoUFdSLT5DUjIsIFBXUl9QVk1fNCk7IH0NCi0NCi0vKioNCi0gKiBAYnJpZWYgRGlzYWJsZSB0aGUgUG93ZXIgVm9sdGFnZSBNb25pdG9yaW5nIDQ6IFZEREEgdmVyc3VzIE9QQU1QL0RBQyBtaW5pbXVtDQotICogdm9sdGFnZSAxLjhWLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXZvaWQgSEFMX1BXUkV4X0Rpc2FibGVQVk00KHZvaWQpIHsgQ0xFQVJfQklUKFBXUi0+Q1IyLCBQV1JfUFZNXzQpOyB9DQotDQotLyoqDQotICogQGJyaWVmIENvbmZpZ3VyZSB0aGUgUGVyaXBoZXJhbCBWb2x0YWdlIE1vbml0b3JpbmcgKFBWTSkuDQotICogQHBhcmFtIHNDb25maWdQVk06IHBvaW50ZXIgdG8gYSBQV1JfUFZNVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGUNCi0gKiAgICAgICAgUFZNIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uDQotICogQG5vdGUgVGhlIEFQSSBjb25maWd1cmVzIGEgc2luZ2xlIFBWTSBhY2NvcmRpbmcgdG8gdGhlIGluZm9ybWF0aW9uIGNvbnRhaW5lZA0KLSAqICAgICAgIGluIHRoZSBpbnB1dCBzdHJ1Y3R1cmUuIFRvIGNvbmZpZ3VyZSBzZXZlcmFsIFBWTXMsIHRoZSBBUEkgbXVzdCBiZQ0KLSAqIHNpbmdseSBjYWxsZWQgZm9yIGVhY2ggUFZNIHVzZWQuDQotICogQG5vdGUgUmVmZXIgdG8gdGhlIGVsZWN0cmljYWwgY2hhcmFjdGVyaXN0aWNzIG9mIHlvdXIgZGV2aWNlIGRhdGFzaGVldCBmb3INCi0gKiAgICAgICAgIG1vcmUgZGV0YWlscyBhYm91dCB0aGUgdm9sdGFnZSB0aHJlc2hvbGRzIGNvcnJlc3BvbmRpbmcgdG8gZWFjaA0KLSAqICAgICAgICAgZGV0ZWN0aW9uIGxldmVsIGFuZCB0byBlYWNoIG1vbml0b3JlZCBzdXBwbHkuDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BXUkV4X0NvbmZpZ1BWTShQV1JfUFZNVHlwZURlZiAqc0NvbmZpZ1BWTSkgew0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19QV1JfUFZNX1RZUEUoc0NvbmZpZ1BWTS0+UFZNVHlwZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1BXUl9QVk1fTU9ERShzQ29uZmlnUFZNLT5Nb2RlKSk7DQotDQotICAvKiBDb25maWd1cmUgRVhUSSAzNSB0byAzOCBpbnRlcnJ1cHRzIGlmIHNvIHJlcXVpcmVkOg0KLSAgICAgc2NhbiB0aHJvdWdoIFBWTVR5cGUgdG8gZGV0ZWN0IHdoaWNoIFBWTXggaXMgc2V0IGFuZA0KLSAgICAgY29uZmlndXJlIHRoZSBjb3JyZXNwb25kaW5nIEVYVEkgbGluZSBhY2NvcmRpbmdseS4gKi8NCi0gIHN3aXRjaCAoc0NvbmZpZ1BWTS0+UFZNVHlwZSkgew0KLSNpZiBkZWZpbmVkKFBXUl9DUjJfUFZNRTEpDQotICAgIGNhc2UgUFdSX1BWTV8xOg0KLSAgICAgIC8qIENsZWFyIGFueSBwcmV2aW91cyBjb25maWcuIEtlZXAgaXQgY2xlYXIgaWYgbm8gZXZlbnQgb3IgSVQgbW9kZSBpcw0KLSAgICAgICAqIHNlbGVjdGVkICovDQotICAgICAgX19IQUxfUFdSX1BWTTFfRVhUSV9ESVNBQkxFX0VWRU5UKCk7DQotICAgICAgX19IQUxfUFdSX1BWTTFfRVhUSV9ESVNBQkxFX0lUKCk7DQotICAgICAgX19IQUxfUFdSX1BWTTFfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpOw0KLSAgICAgIF9fSEFMX1BXUl9QVk0xX0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpOw0KLQ0KLSAgICAgIC8qIENvbmZpZ3VyZSBpbnRlcnJ1cHQgbW9kZSAqLw0KLSAgICAgIGlmICgoc0NvbmZpZ1BWTS0+TW9kZSAmIFBWTV9NT0RFX0lUKSA9PSBQVk1fTU9ERV9JVCkgew0KLSAgICAgICAgX19IQUxfUFdSX1BWTTFfRVhUSV9FTkFCTEVfSVQoKTsNCi0gICAgICB9DQotDQotICAgICAgLyogQ29uZmlndXJlIGV2ZW50IG1vZGUgKi8NCi0gICAgICBpZiAoKHNDb25maWdQVk0tPk1vZGUgJiBQVk1fTU9ERV9FVlQpID09IFBWTV9NT0RFX0VWVCkgew0KLSAgICAgICAgX19IQUxfUFdSX1BWTTFfRVhUSV9FTkFCTEVfRVZFTlQoKTsNCi0gICAgICB9DQotDQotICAgICAgLyogQ29uZmlndXJlIHRoZSBlZGdlICovDQotICAgICAgaWYgKChzQ29uZmlnUFZNLT5Nb2RlICYgUFZNX1JJU0lOR19FREdFKSA9PSBQVk1fUklTSU5HX0VER0UpIHsNCi0gICAgICAgIF9fSEFMX1BXUl9QVk0xX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCk7DQotICAgICAgfQ0KLQ0KLSAgICAgIGlmICgoc0NvbmZpZ1BWTS0+TW9kZSAmIFBWTV9GQUxMSU5HX0VER0UpID09IFBWTV9GQUxMSU5HX0VER0UpIHsNCi0gICAgICAgIF9fSEFMX1BXUl9QVk0xX0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRSgpOw0KLSAgICAgIH0NCi0gICAgICBicmVhazsNCi0jZW5kaWYgLyogUFdSX0NSMl9QVk1FMSAqLw0KLQ0KLSNpZiBkZWZpbmVkKFBXUl9DUjJfUFZNRTIpDQotICAgIGNhc2UgUFdSX1BWTV8yOg0KLSAgICAgIC8qIENsZWFyIGFueSBwcmV2aW91cyBjb25maWcuIEtlZXAgaXQgY2xlYXIgaWYgbm8gZXZlbnQgb3IgSVQgbW9kZSBpcw0KLSAgICAgICAqIHNlbGVjdGVkICovDQotICAgICAgX19IQUxfUFdSX1BWTTJfRVhUSV9ESVNBQkxFX0VWRU5UKCk7DQotICAgICAgX19IQUxfUFdSX1BWTTJfRVhUSV9ESVNBQkxFX0lUKCk7DQotICAgICAgX19IQUxfUFdSX1BWTTJfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpOw0KLSAgICAgIF9fSEFMX1BXUl9QVk0yX0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpOw0KLQ0KLSAgICAgIC8qIENvbmZpZ3VyZSBpbnRlcnJ1cHQgbW9kZSAqLw0KLSAgICAgIGlmICgoc0NvbmZpZ1BWTS0+TW9kZSAmIFBWTV9NT0RFX0lUKSA9PSBQVk1fTU9ERV9JVCkgew0KLSAgICAgICAgX19IQUxfUFdSX1BWTTJfRVhUSV9FTkFCTEVfSVQoKTsNCi0gICAgICB9DQotDQotICAgICAgLyogQ29uZmlndXJlIGV2ZW50IG1vZGUgKi8NCi0gICAgICBpZiAoKHNDb25maWdQVk0tPk1vZGUgJiBQVk1fTU9ERV9FVlQpID09IFBWTV9NT0RFX0VWVCkgew0KLSAgICAgICAgX19IQUxfUFdSX1BWTTJfRVhUSV9FTkFCTEVfRVZFTlQoKTsNCi0gICAgICB9DQotDQotICAgICAgLyogQ29uZmlndXJlIHRoZSBlZGdlICovDQotICAgICAgaWYgKChzQ29uZmlnUFZNLT5Nb2RlICYgUFZNX1JJU0lOR19FREdFKSA9PSBQVk1fUklTSU5HX0VER0UpIHsNCi0gICAgICAgIF9fSEFMX1BXUl9QVk0yX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCk7DQotICAgICAgfQ0KLQ0KLSAgICAgIGlmICgoc0NvbmZpZ1BWTS0+TW9kZSAmIFBWTV9GQUxMSU5HX0VER0UpID09IFBWTV9GQUxMSU5HX0VER0UpIHsNCi0gICAgICAgIF9fSEFMX1BXUl9QVk0yX0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRSgpOw0KLSAgICAgIH0NCi0gICAgICBicmVhazsNCi0jZW5kaWYgLyogUFdSX0NSMl9QVk1FMiAqLw0KLQ0KLSAgICBjYXNlIFBXUl9QVk1fMzoNCi0gICAgICAvKiBDbGVhciBhbnkgcHJldmlvdXMgY29uZmlnLiBLZWVwIGl0IGNsZWFyIGlmIG5vIGV2ZW50IG9yIElUIG1vZGUgaXMNCi0gICAgICAgKiBzZWxlY3RlZCAqLw0KLSAgICAgIF9fSEFMX1BXUl9QVk0zX0VYVElfRElTQUJMRV9FVkVOVCgpOw0KLSAgICAgIF9fSEFMX1BXUl9QVk0zX0VYVElfRElTQUJMRV9JVCgpOw0KLSAgICAgIF9fSEFMX1BXUl9QVk0zX0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKTsNCi0gICAgICBfX0hBTF9QV1JfUFZNM19FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKTsNCi0NCi0gICAgICAvKiBDb25maWd1cmUgaW50ZXJydXB0IG1vZGUgKi8NCi0gICAgICBpZiAoKHNDb25maWdQVk0tPk1vZGUgJiBQVk1fTU9ERV9JVCkgPT0gUFZNX01PREVfSVQpIHsNCi0gICAgICAgIF9fSEFMX1BXUl9QVk0zX0VYVElfRU5BQkxFX0lUKCk7DQotICAgICAgfQ0KLQ0KLSAgICAgIC8qIENvbmZpZ3VyZSBldmVudCBtb2RlICovDQotICAgICAgaWYgKChzQ29uZmlnUFZNLT5Nb2RlICYgUFZNX01PREVfRVZUKSA9PSBQVk1fTU9ERV9FVlQpIHsNCi0gICAgICAgIF9fSEFMX1BXUl9QVk0zX0VYVElfRU5BQkxFX0VWRU5UKCk7DQotICAgICAgfQ0KLQ0KLSAgICAgIC8qIENvbmZpZ3VyZSB0aGUgZWRnZSAqLw0KLSAgICAgIGlmICgoc0NvbmZpZ1BWTS0+TW9kZSAmIFBWTV9SSVNJTkdfRURHRSkgPT0gUFZNX1JJU0lOR19FREdFKSB7DQotICAgICAgICBfX0hBTF9QV1JfUFZNM19FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpOw0KLSAgICAgIH0NCi0NCi0gICAgICBpZiAoKHNDb25maWdQVk0tPk1vZGUgJiBQVk1fRkFMTElOR19FREdFKSA9PSBQVk1fRkFMTElOR19FREdFKSB7DQotICAgICAgICBfX0hBTF9QV1JfUFZNM19FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKTsNCi0gICAgICB9DQotICAgICAgYnJlYWs7DQotDQotICAgIGNhc2UgUFdSX1BWTV80Og0KLSAgICAgIC8qIENsZWFyIGFueSBwcmV2aW91cyBjb25maWcuIEtlZXAgaXQgY2xlYXIgaWYgbm8gZXZlbnQgb3IgSVQgbW9kZSBpcw0KLSAgICAgICAqIHNlbGVjdGVkICovDQotICAgICAgX19IQUxfUFdSX1BWTTRfRVhUSV9ESVNBQkxFX0VWRU5UKCk7DQotICAgICAgX19IQUxfUFdSX1BWTTRfRVhUSV9ESVNBQkxFX0lUKCk7DQotICAgICAgX19IQUxfUFdSX1BWTTRfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpOw0KLSAgICAgIF9fSEFMX1BXUl9QVk00X0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpOw0KLQ0KLSAgICAgIC8qIENvbmZpZ3VyZSBpbnRlcnJ1cHQgbW9kZSAqLw0KLSAgICAgIGlmICgoc0NvbmZpZ1BWTS0+TW9kZSAmIFBWTV9NT0RFX0lUKSA9PSBQVk1fTU9ERV9JVCkgew0KLSAgICAgICAgX19IQUxfUFdSX1BWTTRfRVhUSV9FTkFCTEVfSVQoKTsNCi0gICAgICB9DQotDQotICAgICAgLyogQ29uZmlndXJlIGV2ZW50IG1vZGUgKi8NCi0gICAgICBpZiAoKHNDb25maWdQVk0tPk1vZGUgJiBQVk1fTU9ERV9FVlQpID09IFBWTV9NT0RFX0VWVCkgew0KLSAgICAgICAgX19IQUxfUFdSX1BWTTRfRVhUSV9FTkFCTEVfRVZFTlQoKTsNCi0gICAgICB9DQotDQotICAgICAgLyogQ29uZmlndXJlIHRoZSBlZGdlICovDQotICAgICAgaWYgKChzQ29uZmlnUFZNLT5Nb2RlICYgUFZNX1JJU0lOR19FREdFKSA9PSBQVk1fUklTSU5HX0VER0UpIHsNCi0gICAgICAgIF9fSEFMX1BXUl9QVk00X0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCk7DQotICAgICAgfQ0KLQ0KLSAgICAgIGlmICgoc0NvbmZpZ1BWTS0+TW9kZSAmIFBWTV9GQUxMSU5HX0VER0UpID09IFBWTV9GQUxMSU5HX0VER0UpIHsNCi0gICAgICAgIF9fSEFMX1BXUl9QVk00X0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRSgpOw0KLSAgICAgIH0NCi0gICAgICBicmVhazsNCi0NCi0gICAgZGVmYXVsdDoNCi0gICAgICBzdGF0dXMgPSBIQUxfRVJST1I7DQotICAgICAgYnJlYWs7DQotICB9DQotDQotICByZXR1cm4gc3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgRW50ZXIgTG93LXBvd2VyIFJ1biBtb2RlDQotICogQG5vdGUgIEluIExvdy1wb3dlciBSdW4gbW9kZSwgYWxsIEkvTyBwaW5zIGtlZXAgdGhlIHNhbWUgc3RhdGUgYXMgaW4gUnVuDQotICogbW9kZS4NCi0gKiBAbm90ZSAgV2hlbiBSZWd1bGF0b3IgaXMgc2V0IHRvIFBXUl9MT1dQT1dFUlJFR1VMQVRPUl9PTiwgdGhlIHVzZXIgY2FuDQotICogb3B0aW9uYWxseSBjb25maWd1cmUgdGhlIEZsYXNoIGluIHBvd2VyLWRvd24gbW9uZGUgaW4gc2V0dGluZyB0aGUgUlVOX1BEIGJpdA0KLSAqIGluIEZMQVNIX0FDUiByZWdpc3Rlci4gQWRkaXRpb25hbGx5LCB0aGUgY2xvY2sgZnJlcXVlbmN5IG11c3QgYmUgcmVkdWNlZA0KLSAqIGJlbG93IDIgTUh6LiBTZXR0aW5nIFJVTl9QRCBpbiBGTEFTSF9BQ1IgdGhlbiBhcHByb3ByaWF0ZWx5IHJlZHVjaW5nIHRoZQ0KLSAqIGNsb2NrIGZyZXF1ZW5jeSBtdXN0IGJlIGRvbmUgYmVmb3JlIGNhbGxpbmcgSEFMX1BXUkV4X0VuYWJsZUxvd1Bvd2VyUnVuTW9kZSgpDQotICogQVBJLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXZvaWQgSEFMX1BXUkV4X0VuYWJsZUxvd1Bvd2VyUnVuTW9kZSh2b2lkKSB7DQotICAvKiBTZXQgUmVndWxhdG9yIHBhcmFtZXRlciAqLw0KLSAgU0VUX0JJVChQV1ItPkNSMSwgUFdSX0NSMV9MUFIpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgRXhpdCBMb3ctcG93ZXIgUnVuIG1vZGUuDQotICogQG5vdGUgIEJlZm9yZSBIQUxfUFdSRXhfRGlzYWJsZUxvd1Bvd2VyUnVuTW9kZSgpIGNvbXBsZXRpb24sIHRoZSBmdW5jdGlvbg0KLSAqIGNoZWNrcyB0aGF0IFJFR0xQRiBoYXMgYmVlbiBwcm9wZXJseSByZXNldCAob3RoZXJ3aXNlLA0KLSAqIEhBTF9QV1JFeF9EaXNhYmxlTG93UG93ZXJSdW5Nb2RlIHJldHVybnMgSEFMX1RJTUVPVVQgc3RhdHVzKS4gVGhlIHN5c3RlbQ0KLSAqIGNsb2NrIGZyZXF1ZW5jeSBjYW4gdGhlbiBiZSBpbmNyZWFzZWQgYWJvdmUgMiBNSHouDQotICogQHJldHZhbCBIQUwgU3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BXUkV4X0Rpc2FibGVMb3dQb3dlclJ1bk1vZGUodm9pZCkgew0KLSAgdWludDMyX3Qgd2FpdF9sb29wX2luZGV4Ow0KLQ0KLSAgLyogQ2xlYXIgTFBSIGJpdCAqLw0KLSAgQ0xFQVJfQklUKFBXUi0+Q1IxLCBQV1JfQ1IxX0xQUik7DQotDQotICAvKiBXYWl0IHVudGlsIFJFR0xQRiBpcyByZXNldCAqLw0KLSAgd2FpdF9sb29wX2luZGV4ID0gKFBXUl9GTEFHX1NFVFRJTkdfREVMQVlfVVMgKiAoU3lzdGVtQ29yZUNsb2NrIC8gMTAwMDAwMFUpKTsNCi0gIHdoaWxlICgoSEFMX0lTX0JJVF9TRVQoUFdSLT5TUjIsIFBXUl9TUjJfUkVHTFBGKSkgJiYNCi0gICAgICAgICAod2FpdF9sb29wX2luZGV4ICE9IDBVKSkgew0KLSAgICB3YWl0X2xvb3BfaW5kZXgtLTsNCi0gIH0NCi0gIGlmIChIQUxfSVNfQklUX1NFVChQV1ItPlNSMiwgUFdSX1NSMl9SRUdMUEYpKSB7DQotICAgIHJldHVybiBIQUxfVElNRU9VVDsNCi0gIH0NCi0NCi0gIHJldHVybiBIQUxfT0s7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBFbnRlciBTdG9wIDAgbW9kZS4NCi0gKiBAbm90ZSAgSW4gU3RvcCAwIG1vZGUsIG1haW4gYW5kIGxvdyB2b2x0YWdlIHJlZ3VsYXRvcnMgYXJlIE9OLg0KLSAqIEBub3RlICBJbiBTdG9wIDAgbW9kZSwgYWxsIEkvTyBwaW5zIGtlZXAgdGhlIHNhbWUgc3RhdGUgYXMgaW4gUnVuIG1vZGUuDQotICogQG5vdGUgIEFsbCBjbG9ja3MgaW4gdGhlIFZDT1JFIGRvbWFpbiBhcmUgc3RvcHBlZDsgdGhlIFBMTCwgdGhlIEhTSQ0KLSAqICAgICAgICBhbmQgdGhlIEhTRSBvc2NpbGxhdG9ycyBhcmUgZGlzYWJsZWQuIFNvbWUgcGVyaXBoZXJhbHMgd2l0aCB0aGUgd2FrZXVwDQotICogY2FwYWJpbGl0eSAoSTJDeCwgVVNBUlR4IGFuZCBMUFVBUlQpIGNhbiBzd2l0Y2ggb24gdGhlIEhTSSB0byByZWNlaXZlIGENCi0gKiBmcmFtZSwgYW5kIHN3aXRjaCBvZmYgdGhlIEhTSSBhZnRlciByZWNlaXZpbmcgdGhlIGZyYW1lIGlmIGl0IGlzIG5vdCBhIHdha2V1cA0KLSAqIGZyYW1lLiBJbiB0aGlzIGNhc2UsIHRoZSBIU0kgY2xvY2sgaXMgcHJvcGFnYXRlZCBvbmx5IHRvIHRoZSBwZXJpcGhlcmFsDQotICogcmVxdWVzdGluZyBpdC4gU1JBTTEsIFNSQU0yIGFuZCByZWdpc3RlciBjb250ZW50cyBhcmUgcHJlc2VydmVkLiBUaGUgQk9SIGlzDQotICogYXZhaWxhYmxlLg0KLSAqIEBub3RlICBXaGVuIGV4aXRpbmcgU3RvcCAwIG1vZGUgYnkgaXNzdWluZyBhbiBpbnRlcnJ1cHQgb3IgYSB3YWtldXAgZXZlbnQsDQotICogICAgICAgICB0aGUgSFNJIFJDIG9zY2lsbGF0b3IgaXMgc2VsZWN0ZWQgYXMgc3lzdGVtIGNsb2NrIGlmIFNUT1BXVUNLIGJpdCBpbg0KLSAqIFJDQ19DRkdSIHJlZ2lzdGVyIGlzIHNldDsgdGhlIEhTSSBvc2NpbGxhdG9yIGlzIHNlbGVjdGVkIGlmIFNUT1BXVUNLIGlzDQotICogY2xlYXJlZC4NCi0gKiBAbm90ZSAgQnkga2VlcGluZyB0aGUgaW50ZXJuYWwgcmVndWxhdG9yIE9OIGR1cmluZyBTdG9wIDAgbW9kZSwgdGhlDQotICogY29uc3VtcHRpb24gaXMgaGlnaGVyIGFsdGhvdWdoIHRoZSBzdGFydHVwIHRpbWUgaXMgcmVkdWNlZC4NCi0gKiBAcGFyYW0gU1RPUEVudHJ5ICBzcGVjaWZpZXMgaWYgU3RvcCBtb2RlIGluIGVudGVyZWQgd2l0aCBXRkkgb3IgV0ZFDQotICogaW5zdHJ1Y3Rpb24uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIEByZWYgUFdSX1NUT1BFTlRSWV9XRkkgIEVudGVyIFN0b3AgbW9kZSB3aXRoIFdGSSBpbnN0cnVjdGlvbg0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFBXUl9TVE9QRU5UUllfV0ZFICBFbnRlciBTdG9wIG1vZGUgd2l0aCBXRkUgaW5zdHJ1Y3Rpb24NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi12b2lkIEhBTF9QV1JFeF9FbnRlclNUT1AwTW9kZSh1aW50OF90IFNUT1BFbnRyeSkgew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19QV1JfU1RPUF9FTlRSWShTVE9QRW50cnkpKTsNCi0NCi0gIC8qIFN0b3AgMCBtb2RlIHdpdGggTWFpbiBSZWd1bGF0b3IgKi8NCi0gIE1PRElGWV9SRUcoUFdSLT5DUjEsIFBXUl9DUjFfTFBNUywgUFdSX0NSMV9MUE1TX1NUT1AwKTsNCi0NCi0gIC8qIFNldCBTTEVFUERFRVAgYml0IG9mIENvcnRleCBTeXN0ZW0gQ29udHJvbCBSZWdpc3RlciAqLw0KLSAgU0VUX0JJVChTQ0ItPlNDUiwgKCh1aW50MzJfdClTQ0JfU0NSX1NMRUVQREVFUF9Nc2spKTsNCi0NCi0gIC8qIFNlbGVjdCBTdG9wIG1vZGUgZW50cnkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSAgaWYgKFNUT1BFbnRyeSA9PSBQV1JfU1RPUEVOVFJZX1dGSSkgew0KLSAgICAvKiBSZXF1ZXN0IFdhaXQgRm9yIEludGVycnVwdCAqLw0KLSAgICBfX1dGSSgpOw0KLSAgfSBlbHNlIHsNCi0gICAgLyogUmVxdWVzdCBXYWl0IEZvciBFdmVudCAqLw0KLSAgICBfX1NFVigpOw0KLSAgICBfX1dGRSgpOw0KLSAgICBfX1dGRSgpOw0KLSAgfQ0KLQ0KLSAgLyogUmVzZXQgU0xFRVBERUVQIGJpdCBvZiBDb3J0ZXggU3lzdGVtIENvbnRyb2wgUmVnaXN0ZXIgKi8NCi0gIENMRUFSX0JJVChTQ0ItPlNDUiwgKCh1aW50MzJfdClTQ0JfU0NSX1NMRUVQREVFUF9Nc2spKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmIEVudGVyIFN0b3AgMSBtb2RlLg0KLSAqIEBub3RlICBJbiBTdG9wIDEgbW9kZSwgb25seSBsb3cgcG93ZXIgdm9sdGFnZSByZWd1bGF0b3IgaXMgT04uDQotICogQG5vdGUgIEluIFN0b3AgMSBtb2RlLCBhbGwgSS9PIHBpbnMga2VlcCB0aGUgc2FtZSBzdGF0ZSBhcyBpbiBSdW4gbW9kZS4NCi0gKiBAbm90ZSAgQWxsIGNsb2NrcyBpbiB0aGUgVkNPUkUgZG9tYWluIGFyZSBzdG9wcGVkOyB0aGUgUExMLCB0aGUgSFNJDQotICogICAgICAgIGFuZCB0aGUgSFNFIG9zY2lsbGF0b3JzIGFyZSBkaXNhYmxlZC4gU29tZSBwZXJpcGhlcmFscyB3aXRoIHRoZSB3YWtldXANCi0gKiBjYXBhYmlsaXR5IChJMkN4LCBVU0FSVHggYW5kIExQVUFSVCkgY2FuIHN3aXRjaCBvbiB0aGUgSFNJIHRvIHJlY2VpdmUgYQ0KLSAqIGZyYW1lLCBhbmQgc3dpdGNoIG9mZiB0aGUgSFNJIGFmdGVyIHJlY2VpdmluZyB0aGUgZnJhbWUgaWYgaXQgaXMgbm90IGEgd2FrZXVwDQotICogZnJhbWUuIEluIHRoaXMgY2FzZSwgdGhlIEhTSSBjbG9jayBpcyBwcm9wYWdhdGVkIG9ubHkgdG8gdGhlIHBlcmlwaGVyYWwNCi0gKiByZXF1ZXN0aW5nIGl0LiBTUkFNMSwgU1JBTTIgYW5kIHJlZ2lzdGVyIGNvbnRlbnRzIGFyZSBwcmVzZXJ2ZWQuIFRoZSBCT1IgaXMNCi0gKiBhdmFpbGFibGUuDQotICogQG5vdGUgIFdoZW4gZXhpdGluZyBTdG9wIDEgbW9kZSBieSBpc3N1aW5nIGFuIGludGVycnVwdCBvciBhIHdha2V1cCBldmVudCwNCi0gKiAgICAgICAgIHRoZSBIU0kgUkMgb3NjaWxsYXRvciBpcyBzZWxlY3RlZCBhcyBzeXN0ZW0gY2xvY2sgaWYgU1RPUFdVQ0sgYml0IGluDQotICogUkNDX0NGR1IgcmVnaXN0ZXIgaXMgc2V0Lg0KLSAqIEBub3RlICBEdWUgdG8gbG93IHBvd2VyIG1vZGUsIGFuIGFkZGl0aW9uYWwgc3RhcnR1cCBkZWxheSBpcyBpbmN1cnJlZCB3aGVuDQotICogd2FraW5nIHVwIGZyb20gU3RvcCAxIG1vZGUuDQotICogQHBhcmFtIFNUT1BFbnRyeSAgc3BlY2lmaWVzIGlmIFN0b3AgbW9kZSBpbiBlbnRlcmVkIHdpdGggV0ZJIG9yIFdGRQ0KLSAqIGluc3RydWN0aW9uLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFBXUl9TVE9QRU5UUllfV0ZJICBFbnRlciBTdG9wIG1vZGUgd2l0aCBXRkkgaW5zdHJ1Y3Rpb24NCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfU1RPUEVOVFJZX1dGRSAgRW50ZXIgU3RvcCBtb2RlIHdpdGggV0ZFIGluc3RydWN0aW9uDQotICogQHJldHZhbCBOb25lDQotICovDQotdm9pZCBIQUxfUFdSRXhfRW50ZXJTVE9QMU1vZGUodWludDhfdCBTVE9QRW50cnkpIHsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfUFdSX1NUT1BfRU5UUlkoU1RPUEVudHJ5KSk7DQotDQotICAvKiBTdG9wIDEgbW9kZSB3aXRoIExvdy1Qb3dlciBSZWd1bGF0b3IgKi8NCi0gIE1PRElGWV9SRUcoUFdSLT5DUjEsIFBXUl9DUjFfTFBNUywgUFdSX0NSMV9MUE1TX1NUT1AxKTsNCi0NCi0gIC8qIFNldCBTTEVFUERFRVAgYml0IG9mIENvcnRleCBTeXN0ZW0gQ29udHJvbCBSZWdpc3RlciAqLw0KLSAgU0VUX0JJVChTQ0ItPlNDUiwgKCh1aW50MzJfdClTQ0JfU0NSX1NMRUVQREVFUF9Nc2spKTsNCi0NCi0gIC8qIFNlbGVjdCBTdG9wIG1vZGUgZW50cnkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSAgaWYgKFNUT1BFbnRyeSA9PSBQV1JfU1RPUEVOVFJZX1dGSSkgew0KLSAgICAvKiBSZXF1ZXN0IFdhaXQgRm9yIEludGVycnVwdCAqLw0KLSAgICBfX1dGSSgpOw0KLSAgfSBlbHNlIHsNCi0gICAgLyogUmVxdWVzdCBXYWl0IEZvciBFdmVudCAqLw0KLSAgICBfX1NFVigpOw0KLSAgICBfX1dGRSgpOw0KLSAgICBfX1dGRSgpOw0KLSAgfQ0KLQ0KLSAgLyogUmVzZXQgU0xFRVBERUVQIGJpdCBvZiBDb3J0ZXggU3lzdGVtIENvbnRyb2wgUmVnaXN0ZXIgKi8NCi0gIENMRUFSX0JJVChTQ0ItPlNDUiwgKCh1aW50MzJfdClTQ0JfU0NSX1NMRUVQREVFUF9Nc2spKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmIEVudGVyIFNodXRkb3duIG1vZGUuDQotICogQG5vdGUgIEluIFNodXRkb3duIG1vZGUsIHRoZSBQTEwsIHRoZSBIU0ksIHRoZSBMU0kgYW5kIHRoZSBIU0Ugb3NjaWxsYXRvcnMNCi0gKiBhcmUgc3dpdGNoZWQgb2ZmLiBUaGUgdm9sdGFnZSByZWd1bGF0b3IgaXMgZGlzYWJsZWQgYW5kIFZjb3JlIGRvbWFpbiBpcw0KLSAqIHBvd2VyZWQgb2ZmLiBTUkFNMSwgU1JBTTIgYW5kIHJlZ2lzdGVycyBjb250ZW50cyBhcmUgbG9zdCBleGNlcHQgZm9yDQotICogcmVnaXN0ZXJzIGluIHRoZSBCYWNrdXAgZG9tYWluLiBUaGUgQk9SIGlzIG5vdCBhdmFpbGFibGUuDQotICogQG5vdGUgIFRoZSBJL09zIGNhbiBiZSBjb25maWd1cmVkIGVpdGhlciB3aXRoIGEgcHVsbC11cCBvciBwdWxsLWRvd24gb3IgY2FuDQotICogYmUga2VwdCBpbiBhbmFsb2cgc3RhdGUuDQotICogQHJldHZhbCBOb25lDQotICovDQotdm9pZCBIQUxfUFdSRXhfRW50ZXJTSFVURE9XTk1vZGUodm9pZCkgew0KLSAgLyogU2V0IFNodXRkb3duIG1vZGUgKi8NCi0gIE1PRElGWV9SRUcoUFdSLT5DUjEsIFBXUl9DUjFfTFBNUywgUFdSX0NSMV9MUE1TX1NIVVRET1dOKTsNCi0NCi0gIC8qIFNldCBTTEVFUERFRVAgYml0IG9mIENvcnRleCBTeXN0ZW0gQ29udHJvbCBSZWdpc3RlciAqLw0KLSAgU0VUX0JJVChTQ0ItPlNDUiwgKCh1aW50MzJfdClTQ0JfU0NSX1NMRUVQREVFUF9Nc2spKTsNCi0NCi0vKiBUaGlzIG9wdGlvbiBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IHN0b3JlIG9wZXJhdGlvbnMgYXJlIGNvbXBsZXRlZCAqLw0KLSNpZiBkZWZpbmVkKF9fQ0NfQVJNKQ0KLSAgX19mb3JjZV9zdG9yZXMoKTsNCi0jZW5kaWYNCi0gIC8qIFJlcXVlc3QgV2FpdCBGb3IgSW50ZXJydXB0ICovDQotICBfX1dGSSgpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBQV1IgUFZEL1BWTXggaW50ZXJydXB0IHJlcXVlc3QuDQotICogQG5vdGUgVGhpcyBBUEkgc2hvdWxkIGJlIGNhbGxlZCB1bmRlciB0aGUgUFZEX1BWTV9JUlFIYW5kbGVyKCkuDQotICogQHJldHZhbCBOb25lDQotICovDQotdm9pZCBIQUxfUFdSRXhfUFZEX1BWTV9JUlFIYW5kbGVyKHZvaWQpIHsNCi0gIC8qIENoZWNrIFBXUiBleHRpIGZsYWcgKi8NCi0gIGlmIChfX0hBTF9QV1JfUFZEX0VYVElfR0VUX0ZMQUcoKSAhPSAwVSkgew0KLSAgICAvKiBQV1IgUFZEIGludGVycnVwdCB1c2VyIGNhbGxiYWNrICovDQotICAgIEhBTF9QV1JfUFZEQ2FsbGJhY2soKTsNCi0NCi0gICAgLyogQ2xlYXIgUFZEIGV4dGkgcGVuZGluZyBiaXQgKi8NCi0gICAgX19IQUxfUFdSX1BWRF9FWFRJX0NMRUFSX0ZMQUcoKTsNCi0gIH0NCi0gIC8qIE5leHQsIHN1Y2Nlc3NpdmVseSBjaGVjayBQVk14IGV4dGkgZmxhZ3MgKi8NCi0jaWYgZGVmaW5lZChQV1JfQ1IyX1BWTUUxKQ0KLSAgaWYgKF9fSEFMX1BXUl9QVk0xX0VYVElfR0VUX0ZMQUcoKSAhPSAwVSkgew0KLSAgICAvKiBQV1IgUFZNMSBpbnRlcnJ1cHQgdXNlciBjYWxsYmFjayAqLw0KLSAgICBIQUxfUFdSRXhfUFZNMUNhbGxiYWNrKCk7DQotDQotICAgIC8qIENsZWFyIFBWTTEgZXh0aSBwZW5kaW5nIGJpdCAqLw0KLSAgICBfX0hBTF9QV1JfUFZNMV9FWFRJX0NMRUFSX0ZMQUcoKTsNCi0gIH0NCi0jZW5kaWYgLyogUFdSX0NSMl9QVk1FMSAqLw0KLSNpZiBkZWZpbmVkKFBXUl9DUjJfUFZNRTIpDQotICBpZiAoX19IQUxfUFdSX1BWTTJfRVhUSV9HRVRfRkxBRygpICE9IDBVKSB7DQotICAgIC8qIFBXUiBQVk0yIGludGVycnVwdCB1c2VyIGNhbGxiYWNrICovDQotICAgIEhBTF9QV1JFeF9QVk0yQ2FsbGJhY2soKTsNCi0NCi0gICAgLyogQ2xlYXIgUFZNMiBleHRpIHBlbmRpbmcgYml0ICovDQotICAgIF9fSEFMX1BXUl9QVk0yX0VYVElfQ0xFQVJfRkxBRygpOw0KLSAgfQ0KLSNlbmRpZiAvKiBQV1JfQ1IyX1BWTUUyICovDQotICBpZiAoX19IQUxfUFdSX1BWTTNfRVhUSV9HRVRfRkxBRygpICE9IDBVKSB7DQotICAgIC8qIFBXUiBQVk0zIGludGVycnVwdCB1c2VyIGNhbGxiYWNrICovDQotICAgIEhBTF9QV1JFeF9QVk0zQ2FsbGJhY2soKTsNCi0NCi0gICAgLyogQ2xlYXIgUFZNMyBleHRpIHBlbmRpbmcgYml0ICovDQotICAgIF9fSEFMX1BXUl9QVk0zX0VYVElfQ0xFQVJfRkxBRygpOw0KLSAgfQ0KLSAgaWYgKF9fSEFMX1BXUl9QVk00X0VYVElfR0VUX0ZMQUcoKSAhPSAwVSkgew0KLSAgICAvKiBQV1IgUFZNNCBpbnRlcnJ1cHQgdXNlciBjYWxsYmFjayAqLw0KLSAgICBIQUxfUFdSRXhfUFZNNENhbGxiYWNrKCk7DQotDQotICAgIC8qIENsZWFyIFBWTTQgZXh0aSBwZW5kaW5nIGJpdCAqLw0KLSAgICBfX0hBTF9QV1JfUFZNNF9FWFRJX0NMRUFSX0ZMQUcoKTsNCi0gIH0NCi19DQotDQotI2lmIGRlZmluZWQoUFdSX0NSMl9QVk1FMSkNCi0vKioNCi0gKiBAYnJpZWYgUFdSIFBWTTEgaW50ZXJydXB0IGNhbGxiYWNrDQotICogQHJldHZhbCBOb25lDQotICovDQotX193ZWFrIHZvaWQgSEFMX1BXUkV4X1BWTTFDYWxsYmFjayh2b2lkKSB7DQotICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkOyB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsDQotICAgICAgICAgICAgSEFMX1BXUkV4X1BWTTFDYWxsYmFjaygpIEFQSSBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQ0KLSAgICovDQotfQ0KLSNlbmRpZiAvKiBQV1JfQ1IyX1BWTUUxICovDQotDQotI2lmIGRlZmluZWQoUFdSX0NSMl9QVk1FMikNCi0vKioNCi0gKiBAYnJpZWYgUFdSIFBWTTIgaW50ZXJydXB0IGNhbGxiYWNrDQotICogQHJldHZhbCBOb25lDQotICovDQotX193ZWFrIHZvaWQgSEFMX1BXUkV4X1BWTTJDYWxsYmFjayh2b2lkKSB7DQotICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkOyB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsDQotICAgICAgICAgICAgSEFMX1BXUkV4X1BWTTJDYWxsYmFjaygpIEFQSSBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQ0KLSAgICovDQotfQ0KLSNlbmRpZiAvKiBQV1JfQ1IyX1BWTUUyICovDQotDQotLyoqDQotICogQGJyaWVmIFBXUiBQVk0zIGludGVycnVwdCBjYWxsYmFjaw0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fd2VhayB2b2lkIEhBTF9QV1JFeF9QVk0zQ2FsbGJhY2sodm9pZCkgew0KLSAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZDsgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLA0KLSAgICAgICAgICAgIEhBTF9QV1JFeF9QVk0zQ2FsbGJhY2soKSBBUEkgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUNCi0gICAqLw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgUFdSIFBWTTQgaW50ZXJydXB0IGNhbGxiYWNrDQotICogQHJldHZhbCBOb25lDQotICovDQotX193ZWFrIHZvaWQgSEFMX1BXUkV4X1BWTTRDYWxsYmFjayh2b2lkKSB7DQotICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkOyB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsDQotICAgICAgICAgICAgSEFMX1BXUkV4X1BWTTRDYWxsYmFjaygpIEFQSSBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQ0KLSAgICovDQotfQ0KLQ0KLSNpZiBkZWZpbmVkKFBXUl9DUjNfVUNQRF9TVERCWSkNCi0vKioNCi0gKiBAYnJpZWYgRW5hYmxlIFVDUEQgY29uZmlndXJhdGlvbiBtZW1vcml6YXRpb24gaW4gU3RhbmRieS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi12b2lkIEhBTF9QV1JFeF9FbmFibGVVQ1BEU3RhbmRieU1vZGUodm9pZCkgew0KLSAgLyogTWVtb3JpemUgVUNQRCBjb25maWd1cmF0aW9uIHdoZW4gZW50ZXJpbmcgc3RhbmRieSBtb2RlICovDQotICBTRVRfQklUKFBXUi0+Q1IzLCBQV1JfQ1IzX1VDUERfU1REQlkpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgRGlzYWJsZSBVQ1BEIGNvbmZpZ3VyYXRpb24gbWVtb3JpemF0aW9uIGluIFN0YW5kYnkuDQotICogQG5vdGUgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgb24gZXhpdGluZyB0aGUgU3RhbmRieSBtb2RlIGFuZCBiZWZvcmUNCi0gKiBhbnkgVUNQRCBjb25maWd1cmF0aW9uIHVwZGF0ZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi12b2lkIEhBTF9QV1JFeF9EaXNhYmxlVUNQRFN0YW5kYnlNb2RlKHZvaWQpIHsNCi0gIC8qIFdyaXRlIDAgaW1tZWRpYXRlbHkgYWZ0ZXIgU3RhbmRieSBleGl0IHdoZW4gdXNpbmcgVUNQRCwNCi0gICAgIGFuZCBiZWZvcmUgd3JpdGluZyBhbnkgVUNQRCByZWdpc3RlcnMgKi8NCi0gIENMRUFSX0JJVChQV1ItPkNSMywgUFdSX0NSM19VQ1BEX1NUREJZKTsNCi19DQotI2VuZGlmIC8qIFBXUl9DUjNfVUNQRF9TVERCWSAqLw0KLQ0KLSNpZiBkZWZpbmVkKFBXUl9DUjNfVUNQRF9EQkRJUykNCi0vKioNCi0gKiBAYnJpZWYgRW5hYmxlIHRoZSBVU0IgVHlwZS1DIGRlYWQgYmF0dGVyeSBwdWxsLWRvd24gYmVoYXZpb3INCi0gKiAgICAgICAgb24gVUNQRHhfQ0MxIGFuZCBVQ1BEeF9DQzIgcGlucw0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXZvaWQgSEFMX1BXUkV4X0VuYWJsZVVDUEREZWFkQmF0dGVyeSh2b2lkKSB7DQotICAvKiBXcml0ZSAwIHRvIGVuYWJsZSB0aGUgVVNCIFR5cGUtQyBkZWFkIGJhdHRlcnkgcHVsbC1kb3duIGJlaGF2aW9yICovDQotICBDTEVBUl9CSVQoUFdSLT5DUjMsIFBXUl9DUjNfVUNQRF9EQkRJUyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBEaXNhYmxlIHRoZSBVU0IgVHlwZS1DIGRlYWQgYmF0dGVyeSBwdWxsLWRvd24gYmVoYXZpb3INCi0gKiAgICAgICAgb24gVUNQRHhfQ0MxIGFuZCBVQ1BEeF9DQzIgcGlucw0KLSAqIEBub3RlIEFmdGVyIGV4aXRpbmcgcmVzZXQsIHRoZSBVU0IgVHlwZS1DIGRlYWQgYmF0dGVyeSBiZWhhdmlvciB3aWxsIGJlDQotICogZW5hYmxlZCwgd2hpY2ggbWF5IGhhdmUgYSBwdWxsLWRvd24gZWZmZWN0IG9uIENDMSBhbmQgQ0MyIHBpbnMuIEl0IGlzDQotICogcmVjb21tZW5kZWQgdG8gZGlzYWJsZSBpdCBpbiBhbGwgY2FzZXMsIGVpdGhlciB0byBzdG9wIHRoaXMgcHVsbC1kb3duIG9yIHRvDQotICogaGFuZCBvdmVyIGNvbnRyb2wgdG8gdGhlIFVDUEQgKHdoaWNoIHNob3VsZCB0aGVyZWZvcmUgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlDQotICogZG9pbmcgdGhlIGRpc2FibGUpLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXZvaWQgSEFMX1BXUkV4X0Rpc2FibGVVQ1BERGVhZEJhdHRlcnkodm9pZCkgew0KLSAgLyogV3JpdGUgMSB0byBkaXNhYmxlIHRoZSBVU0IgVHlwZS1DIGRlYWQgYmF0dGVyeSBwdWxsLWRvd24gYmVoYXZpb3IgKi8NCi0gIFNFVF9CSVQoUFdSLT5DUjMsIFBXUl9DUjNfVUNQRF9EQkRJUyk7DQotfQ0KLSNlbmRpZiAvKiBQV1JfQ1IzX1VDUERfREJESVMgKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotI2VuZGlmIC8qIEhBTF9QV1JfTU9EVUxFX0VOQUJMRUQgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQorLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAZmlsZSAgICBzdG0zMmc0eHhfaGFsX3B3cl9leC5jCisgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICogQGJyaWVmICAgRXh0ZW5kZWQgUFdSIEhBTCBtb2R1bGUgZHJpdmVyLgorICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBQb3dlciBDb250cm9sbGVyIChQV1IpIHBlcmlwaGVyYWw6CisgKiAgICAgICAgICAgKyBFeHRlbmRlZCBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgKiAgICAgICAgICAgKyBFeHRlbmRlZCBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGF0dGVudGlvbgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGVybXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZQorICogaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc29mdHdhcmUgY29tcG9uZW50LgorICogSWYgbm8gTElDRU5TRSBmaWxlIGNvbWVzIHdpdGggdGhpcyBzb2Z0d2FyZSwgaXQgaXMgcHJvdmlkZWQgQVMtSVMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnNHh4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHNHh4X0hBTF9Ecml2ZXIKKyAqIEB7CisgKi8KKworLyoqIEBkZWZncm91cCBQV1JFeCBQV1JFeAorICogQGJyaWVmIFBXUiBFeHRlbmRlZCBIQUwgbW9kdWxlIGRyaXZlcgorICogQHsKKyAqLworCisjaWZkZWYgSEFMX1BXUl9NT0RVTEVfRU5BQkxFRAorCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmIGRlZmluZWQoU1RNMzJHNDcxeHgpIHx8IGRlZmluZWQoU1RNMzJHNDczeHgpIHx8IGRlZmluZWQoU1RNMzJHNDE0eHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRzQ3NHh4KSB8fCBkZWZpbmVkKFNUTTMyRzQ4M3h4KSB8fCBkZWZpbmVkKFNUTTMyRzQ4NHh4KQorI2RlZmluZSBQV1JfUE9SVEZfQVZBSUxBQkxFX1BJTlMgMHgwMDAwRkZGRlUgLyogUEYwLi5QRjE1ICovCisjZGVmaW5lIFBXUl9QT1JUR19BVkFJTEFCTEVfUElOUyAweDAwMDAwN0ZGVSAvKiBQRzAuLlBHMTAgKi8KKyNlbGlmIGRlZmluZWQoU1RNMzJHNDExeEIpIHx8IGRlZmluZWQoU1RNMzJHNDExeEMpIHx8IGRlZmluZWQoU1RNMzJHNDMxeHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyRzQ0MXh4KSB8fCBkZWZpbmVkKFNUTTMyR0JLMUNCKSB8fCBkZWZpbmVkKFNUTTMyRzQ5MXh4KSB8fCAgIFwKKyAgICBkZWZpbmVkKFNUTTMyRzRBMXh4KQorI2RlZmluZSBQV1JfUE9SVEZfQVZBSUxBQkxFX1BJTlMgMHgwMDAwMDYwN1UgLyogUEYwLi5QRjIgYW5kIFBGOSBhbmQgUEYxMCAqLworI2RlZmluZSBQV1JfUE9SVEdfQVZBSUxBQkxFX1BJTlMgMHgwMDAwMDQwMFUgLyogUEcxMCAqLworI2VuZGlmIC8qIFNUTTMyRzQ3MXh4IHx8IFNUTTMyRzQ3M3h4IHx8IFNUTTMyRzQxNHh4IHx8IFNUTTMyRzQ3NHh4IHx8IFwKKyAgICAgICAgICBTVE0zMkc0ODN4eCB8fCBTVE0zMkc0ODR4eCAqLworCisvKiogQGRlZmdyb3VwIFBXUl9FeHRlbmRlZF9Qcml2YXRlX0RlZmluZXMgUFdSIEV4dGVuZGVkIFByaXZhdGUgRGVmaW5lcworICogQHsKKyAqLworCisvKiogQGRlZmdyb3VwIFBXUkV4X1BWTV9Nb2RlX01hc2sgUFdSIFBWTSBNb2RlIE1hc2sKKyAqIEB7CisgKi8KKyNkZWZpbmUgUFZNX01PREVfSVQgXAorICAweDAwMDEwMDAwVSAvKiE8IE1hc2sgZm9yIGludGVycnVwdGlvbiB5aWVsZGVkIGJ5IFBWTSB0aHJlc2hvbGQgY3Jvc3NpbmcgKi8KKyNkZWZpbmUgUFZNX01PREVfRVZUIFwKKyAgMHgwMDAyMDAwMFUgLyohPCBNYXNrIGZvciBldmVudCB5aWVsZGVkIGJ5IFBWTSB0aHJlc2hvbGQgY3Jvc3NpbmcgICAgICAgICovCisjZGVmaW5lIFBWTV9SSVNJTkdfRURHRSBcCisgIDB4MDAwMDAwMDFVIC8qITwgTWFzayBmb3IgcmlzaW5nIGVkZ2Ugc2V0IGFzIFBWTSB0cmlnZ2VyICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBQVk1fRkFMTElOR19FREdFIFwKKyAgMHgwMDAwMDAwMlUgLyohPCBNYXNrIGZvciBmYWxsaW5nIGVkZ2Ugc2V0IGFzIFBWTSB0cmlnZ2VyICAgICAgICAgICAgICAgICovCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBQV1JFeF9UaW1lT3V0X1ZhbHVlIFBXUiBFeHRlbmRlZCBGbGFnIFNldHRpbmcgVGltZSBPdXQgVmFsdWUKKyAqIEB7CisgKi8KKyNkZWZpbmUgUFdSX0ZMQUdfU0VUVElOR19ERUxBWV9VUyBcCisgIDUwVUwgLyohPCBUaW1lIG91dCB2YWx1ZSBmb3IgUkVHTFBGIGFuZCBWT1NGIGZsYWdzIHNldHRpbmcgKi8KKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBQV1JFeF9FeHBvcnRlZF9GdW5jdGlvbnMgUFdSIEV4dGVuZGVkIEV4cG9ydGVkIEZ1bmN0aW9ucworICogQHsKKyAqLworCisvKiogQGRlZmdyb3VwIFBXUkV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgRXh0ZW5kZWQgUGVyaXBoZXJhbCBDb250cm9sCitmdW5jdGlvbnMKKyAgKiAgQGJyaWVmICAgRXh0ZW5kZWQgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICMjIyMjIEV4dGVuZGVkIFBlcmlwaGVyYWwgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uCitmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAqIEBicmllZiBSZXR1cm4gVm9sdGFnZSBTY2FsaW5nIFJhbmdlLgorICogQHJldHZhbCBWT1MgYml0IGZpZWxkIChQV1JfUkVHVUxBVE9SX1ZPTFRBR0VfU0NBTEUxIG9yCisgKiBQV1JfUkVHVUxBVE9SX1ZPTFRBR0VfU0NBTEUyIG9yIFBXUl9SRUdVTEFUT1JfVk9MVEFHRV9TQ0FMRTFfQk9PU1Qgd2hlbgorICogYXBwbGljYWJsZSkKKyAqLwordWludDMyX3QgSEFMX1BXUkV4X0dldFZvbHRhZ2VSYW5nZSh2b2lkKSB7CisgIGlmIChSRUFEX0JJVChQV1ItPkNSMSwgUFdSX0NSMV9WT1MpID09IFBXUl9SRUdVTEFUT1JfVk9MVEFHRV9TQ0FMRTIpIHsKKyAgICByZXR1cm4gUFdSX1JFR1VMQVRPUl9WT0xUQUdFX1NDQUxFMjsKKyAgfSBlbHNlIGlmIChSRUFEX0JJVChQV1ItPkNSNSwgUFdSX0NSNV9SMU1PREUpID09IFBXUl9DUjVfUjFNT0RFKSB7CisgICAgLyogUFdSX0NSNV9SMU1PREUgYml0IHNldCBtZWFucyB0aGF0IFJhbmdlIDEgQm9vc3QgaXMgZGlzYWJsZWQgKi8KKyAgICByZXR1cm4gUFdSX1JFR1VMQVRPUl9WT0xUQUdFX1NDQUxFMTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gUFdSX1JFR1VMQVRPUl9WT0xUQUdFX1NDQUxFMV9CT09TVDsKKyAgfQorfQorCisvKioKKyAqIEBicmllZiBDb25maWd1cmUgdGhlIG1haW4gaW50ZXJuYWwgcmVndWxhdG9yIG91dHB1dCB2b2x0YWdlLgorICogQHBhcmFtICBWb2x0YWdlU2NhbGluZzogc3BlY2lmaWVzIHRoZSByZWd1bGF0b3Igb3V0cHV0IHZvbHRhZ2UgdG8gYWNoaWV2ZQorICogICAgICAgICBhIHRyYWRlb2ZmIGJldHdlZW4gcGVyZm9ybWFuY2UgYW5kIHBvd2VyIGNvbnN1bXB0aW9uLgorICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFBXUl9SRUdVTEFUT1JfVk9MVEFHRV9TQ0FMRTFfQk9PU1Qgd2hlbiBhdmFpbGFibGUsCisgKiBSZWd1bGF0b3Igdm9sdGFnZSBvdXRwdXQgcmFuZ2UgMSBib29zdCBtb2RlLCB0eXBpY2FsIG91dHB1dCB2b2x0YWdlIGF0IDEuMjgKKyAqIFYsIHN5c3RlbSBmcmVxdWVuY3kgdXAgdG8gMTcwIE1Iei4KKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFBXUl9SRUdVTEFUT1JfVk9MVEFHRV9TQ0FMRTEgUmVndWxhdG9yIHZvbHRhZ2Ugb3V0cHV0CisgKiByYW5nZSAxIG1vZGUsIHR5cGljYWwgb3V0cHV0IHZvbHRhZ2UgYXQgMS4yIFYsIHN5c3RlbSBmcmVxdWVuY3kgdXAgdG8gMTUwCisgKiBNSHouCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfUkVHVUxBVE9SX1ZPTFRBR0VfU0NBTEUyIFJlZ3VsYXRvciB2b2x0YWdlIG91dHB1dAorICogcmFuZ2UgMiBtb2RlLCB0eXBpY2FsIG91dHB1dCB2b2x0YWdlIGF0IDEuMCBWLCBzeXN0ZW0gZnJlcXVlbmN5IHVwIHRvIDI2IE1Iei4KKyAqIEBub3RlICBXaGVuIG1vdmluZyBmcm9tIFJhbmdlIDEgdG8gUmFuZ2UgMiwgdGhlIHN5c3RlbSBmcmVxdWVuY3kgbXVzdCBiZQorICogZGVjcmVhc2VkIHRvIGEgdmFsdWUgYmVsb3cgMjYgTUh6IGJlZm9yZSBjYWxsaW5nCisgKiBIQUxfUFdSRXhfQ29udHJvbFZvbHRhZ2VTY2FsaW5nKCkgQVBJLiBXaGVuIG1vdmluZyBmcm9tIFJhbmdlIDIgdG8gUmFuZ2UgMSwKKyAqIHRoZSBzeXN0ZW0gZnJlcXVlbmN5IGNhbiBiZSBpbmNyZWFzZWQgdG8gYSB2YWx1ZSB1cCB0byAxNTAgTUh6IGFmdGVyIGNhbGxpbmcKKyAqIEhBTF9QV1JFeF9Db250cm9sVm9sdGFnZVNjYWxpbmcoKSBBUEkuIFdoZW4gbW92aW5nIGZyb20gUmFuZ2UgMSB0byBCb29zdCBNb2RlCisgKiBSYW5nZSAxLCB0aGUgc3lzdGVtIGZyZXF1ZW5jeSBjYW4gYmUgaW5jcmVhc2VkIHRvIGEgdmFsdWUgdXAgdG8gMTcwIE1IeiBhZnRlcgorICogY2FsbGluZyBIQUxfUFdSRXhfQ29udHJvbFZvbHRhZ2VTY2FsaW5nKCkgQVBJLgorICogQG5vdGUgIFdoZW4gbW92aW5nIGZyb20gUmFuZ2UgMiB0byBSYW5nZSAxLCB0aGUgQVBJIHdhaXRzIGZvciBWT1NGIGZsYWcgdG8gYmUKKyAqICAgICAgICBjbGVhcmVkIGJlZm9yZSByZXR1cm5pbmcgdGhlIHN0YXR1cy4gSWYgdGhlIGZsYWcgaXMgbm90IGNsZWFyZWQgd2l0aGluCisgKiAgICAgICAgNTAgbWljcm9zZWNvbmRzLCBIQUxfVElNRU9VVCBzdGF0dXMgaXMgcmVwb3J0ZWQuCisgKiBAcmV0dmFsIEhBTCBTdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BXUkV4X0NvbnRyb2xWb2x0YWdlU2NhbGluZyh1aW50MzJfdCBWb2x0YWdlU2NhbGluZykgeworICB1aW50MzJfdCB3YWl0X2xvb3BfaW5kZXg7CisKKyAgYXNzZXJ0X3BhcmFtKElTX1BXUl9WT0xUQUdFX1NDQUxJTkdfUkFOR0UoVm9sdGFnZVNjYWxpbmcpKTsKKworICBpZiAoVm9sdGFnZVNjYWxpbmcgPT0gUFdSX1JFR1VMQVRPUl9WT0xUQUdFX1NDQUxFMV9CT09TVCkgeworICAgIC8qIElmIGN1cnJlbnQgcmFuZ2UgaXMgcmFuZ2UgMiAqLworICAgIGlmIChSRUFEX0JJVChQV1ItPkNSMSwgUFdSX0NSMV9WT1MpID09IFBXUl9SRUdVTEFUT1JfVk9MVEFHRV9TQ0FMRTIpIHsKKyAgICAgIC8qIE1ha2Ugc3VyZSBSYW5nZSAxIEJvb3N0IGlzIGVuYWJsZWQgKi8KKyAgICAgIENMRUFSX0JJVChQV1ItPkNSNSwgUFdSX0NSNV9SMU1PREUpOworCisgICAgICAvKiBTZXQgUmFuZ2UgMSAqLworICAgICAgTU9ESUZZX1JFRyhQV1ItPkNSMSwgUFdSX0NSMV9WT1MsIFBXUl9SRUdVTEFUT1JfVk9MVEFHRV9TQ0FMRTEpOworCisgICAgICAvKiBXYWl0IHVudGlsIFZPU0YgaXMgY2xlYXJlZCAqLworICAgICAgd2FpdF9sb29wX2luZGV4ID0KKyAgICAgICAgICAoKFBXUl9GTEFHX1NFVFRJTkdfREVMQVlfVVMgKiBTeXN0ZW1Db3JlQ2xvY2spIC8gMTAwMDAwMFUpICsgMVU7CisgICAgICB3aGlsZSAoKEhBTF9JU19CSVRfU0VUKFBXUi0+U1IyLCBQV1JfU1IyX1ZPU0YpKSAmJgorICAgICAgICAgICAgICh3YWl0X2xvb3BfaW5kZXggIT0gMFUpKSB7CisgICAgICAgIHdhaXRfbG9vcF9pbmRleC0tOworICAgICAgfQorICAgICAgaWYgKEhBTF9JU19CSVRfU0VUKFBXUi0+U1IyLCBQV1JfU1IyX1ZPU0YpKSB7CisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICB9CisgICAgLyogSWYgY3VycmVudCByYW5nZSBpcyByYW5nZSAxIG5vcm1hbCBvciBib29zdCBtb2RlICovCisgICAgZWxzZSB7CisgICAgICAvKiBFbmFibGUgUmFuZ2UgMSBCb29zdCAobm8gaXNzdWUgaWYgYml0IGFscmVhZHkgcmVzZXQpICovCisgICAgICBDTEVBUl9CSVQoUFdSLT5DUjUsIFBXUl9DUjVfUjFNT0RFKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoVm9sdGFnZVNjYWxpbmcgPT0gUFdSX1JFR1VMQVRPUl9WT0xUQUdFX1NDQUxFMSkgeworICAgIC8qIElmIGN1cnJlbnQgcmFuZ2UgaXMgcmFuZ2UgMiAqLworICAgIGlmIChSRUFEX0JJVChQV1ItPkNSMSwgUFdSX0NSMV9WT1MpID09IFBXUl9SRUdVTEFUT1JfVk9MVEFHRV9TQ0FMRTIpIHsKKyAgICAgIC8qIE1ha2Ugc3VyZSBSYW5nZSAxIEJvb3N0IGlzIGRpc2FibGVkICovCisgICAgICBTRVRfQklUKFBXUi0+Q1I1LCBQV1JfQ1I1X1IxTU9ERSk7CisKKyAgICAgIC8qIFNldCBSYW5nZSAxICovCisgICAgICBNT0RJRllfUkVHKFBXUi0+Q1IxLCBQV1JfQ1IxX1ZPUywgUFdSX1JFR1VMQVRPUl9WT0xUQUdFX1NDQUxFMSk7CisKKyAgICAgIC8qIFdhaXQgdW50aWwgVk9TRiBpcyBjbGVhcmVkICovCisgICAgICB3YWl0X2xvb3BfaW5kZXggPQorICAgICAgICAgICgoUFdSX0ZMQUdfU0VUVElOR19ERUxBWV9VUyAqIFN5c3RlbUNvcmVDbG9jaykgLyAxMDAwMDAwVSkgKyAxVTsKKyAgICAgIHdoaWxlICgoSEFMX0lTX0JJVF9TRVQoUFdSLT5TUjIsIFBXUl9TUjJfVk9TRikpICYmCisgICAgICAgICAgICAgKHdhaXRfbG9vcF9pbmRleCAhPSAwVSkpIHsKKyAgICAgICAgd2FpdF9sb29wX2luZGV4LS07CisgICAgICB9CisgICAgICBpZiAoSEFMX0lTX0JJVF9TRVQoUFdSLT5TUjIsIFBXUl9TUjJfVk9TRikpIHsKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgIH0KKyAgICAvKiBJZiBjdXJyZW50IHJhbmdlIGlzIHJhbmdlIDEgbm9ybWFsIG9yIGJvb3N0IG1vZGUgKi8KKyAgICBlbHNlIHsKKyAgICAgIC8qIERpc2FibGUgUmFuZ2UgMSBCb29zdCAobm8gaXNzdWUgaWYgYml0IGFscmVhZHkgc2V0KSAqLworICAgICAgU0VUX0JJVChQV1ItPkNSNSwgUFdSX0NSNV9SMU1PREUpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiBTZXQgUmFuZ2UgMiAqLworICAgIE1PRElGWV9SRUcoUFdSLT5DUjEsIFBXUl9DUjFfVk9TLCBQV1JfUkVHVUxBVE9SX1ZPTFRBR0VfU0NBTEUyKTsKKyAgICAvKiBObyBuZWVkIHRvIHdhaXQgZm9yIFZPU0YgdG8gYmUgY2xlYXJlZCBmb3IgdGhpcyB0cmFuc2l0aW9uICovCisgICAgLyogUFdSX0NSNV9SMU1PREUgYml0IHNldHRpbmcgaGFzIG5vIGVmZmVjdCBpbiBSYW5nZSAyICAgICAgICAqLworICB9CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgRW5hYmxlIGJhdHRlcnkgY2hhcmdpbmcuCisgKiAgICAgICAgV2hlbiBWREQgaXMgcHJlc2VudCwgY2hhcmdlIHRoZSBleHRlcm5hbCBiYXR0ZXJ5IG9uIFZCQVQgdGhyb3VnaCBhbgorICogaW50ZXJuYWwgcmVzaXN0b3IuCisgKiBAcGFyYW0gIFJlc2lzdG9yU2VsZWN0aW9uOiBzcGVjaWZpZXMgdGhlIHJlc2lzdG9yIGltcGVkYW5jZS4KKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfQkFUVEVSWV9DSEFSR0lOR19SRVNJU1RPUl81ICAgICA1IGtPaG1zIHJlc2lzdG9yCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfQkFUVEVSWV9DSEFSR0lOR19SRVNJU1RPUl8xXzUgMS41IGtPaG1zIHJlc2lzdG9yCisgKiBAcmV0dmFsIE5vbmUKKyAqLwordm9pZCBIQUxfUFdSRXhfRW5hYmxlQmF0dGVyeUNoYXJnaW5nKHVpbnQzMl90IFJlc2lzdG9yU2VsZWN0aW9uKSB7CisgIGFzc2VydF9wYXJhbShJU19QV1JfQkFUVEVSWV9SRVNJU1RPUl9TRUxFQ1QoUmVzaXN0b3JTZWxlY3Rpb24pKTsKKworICAvKiBTcGVjaWZ5IHJlc2lzdG9yIHNlbGVjdGlvbiAqLworICBNT0RJRllfUkVHKFBXUi0+Q1I0LCBQV1JfQ1I0X1ZCUlMsIFJlc2lzdG9yU2VsZWN0aW9uKTsKKworICAvKiBFbmFibGUgYmF0dGVyeSBjaGFyZ2luZyAqLworICBTRVRfQklUKFBXUi0+Q1I0LCBQV1JfQ1I0X1ZCRSk7Cit9CisKKy8qKgorICogQGJyaWVmIERpc2FibGUgYmF0dGVyeSBjaGFyZ2luZy4KKyAqIEByZXR2YWwgTm9uZQorICovCit2b2lkIEhBTF9QV1JFeF9EaXNhYmxlQmF0dGVyeUNoYXJnaW5nKHZvaWQpIHsKKyAgQ0xFQVJfQklUKFBXUi0+Q1I0LCBQV1JfQ1I0X1ZCRSk7Cit9CisKKy8qKgorICogQGJyaWVmIEVuYWJsZSBJbnRlcm5hbCBXYWtlLXVwIExpbmUuCisgKiBAcmV0dmFsIE5vbmUKKyAqLwordm9pZCBIQUxfUFdSRXhfRW5hYmxlSW50ZXJuYWxXYWtlVXBMaW5lKHZvaWQpIHsKKyAgU0VUX0JJVChQV1ItPkNSMywgUFdSX0NSM19FSVdGKTsKK30KKworLyoqCisgKiBAYnJpZWYgRGlzYWJsZSBJbnRlcm5hbCBXYWtlLXVwIExpbmUuCisgKiBAcmV0dmFsIE5vbmUKKyAqLwordm9pZCBIQUxfUFdSRXhfRGlzYWJsZUludGVybmFsV2FrZVVwTGluZSh2b2lkKSB7CisgIENMRUFSX0JJVChQV1ItPkNSMywgUFdSX0NSM19FSVdGKTsKK30KKworLyoqCisgKiBAYnJpZWYgRW5hYmxlIEdQSU8gcHVsbC11cCBzdGF0ZSBpbiBTdGFuZGJ5IGFuZCBTaHV0ZG93biBtb2Rlcy4KKyAqIEBub3RlICBTZXQgdGhlIHJlbGV2YW50IFBVeSBiaXRzIG9mIFBXUl9QVUNSeCByZWdpc3RlciB0byBjb25maWd1cmUgdGhlIEkvTworICogaW4gcHVsbC11cCBzdGF0ZSBpbiBTdGFuZGJ5IGFuZCBTaHV0ZG93biBtb2Rlcy4KKyAqIEBub3RlICBUaGlzIHN0YXRlIGlzIGVmZmVjdGl2ZSBpbiBTdGFuZGJ5IGFuZCBTaHV0ZG93biBtb2RlcyBvbmx5IGlmIEFQQyBiaXQKKyAqICAgICAgICBpcyBzZXQgdGhyb3VnaCBIQUxfUFdSRXhfRW5hYmxlUHVsbFVwUHVsbERvd25Db25maWcoKSBBUEkuCisgKiBAbm90ZSAgVGhlIGNvbmZpZ3VyYXRpb24gaXMgbG9zdCB3aGVuIGV4aXRpbmcgdGhlIFNodXRkb3duIG1vZGUgZHVlIHRvIHRoZQorICogICAgICAgIHBvd2VyLW9uIHJlc2V0LCBtYWludGFpbmVkIHdoZW4gZXhpdGluZyB0aGUgU3RhbmRieSBtb2RlLgorICogQG5vdGUgIFRvIGF2b2lkIGFueSBjb25mbGljdCBhdCBTdGFuZGJ5IGFuZCBTaHV0ZG93biBtb2RlcyBleGl0cywgdGhlCisgKiBjb3JyZXNwb25kaW5nIFBEeSBiaXQgb2YgUFdSX1BEQ1J4IHJlZ2lzdGVyIGlzIGNsZWFyZWQgdW5sZXNzIGl0IGlzIHJlc2VydmVkLgorICogQG5vdGUgIEV2ZW4gaWYgYSBQVXkgYml0IHRvIHNldCBpcyByZXNlcnZlZCwgdGhlIG90aGVyIFBVeSBiaXRzIGVudGVyZWQgYXMKKyAqIGlucHV0IHBhcmFtZXRlciBhdCB0aGUgc2FtZSB0aW1lIGFyZSBzZXQuCisgKiBAcGFyYW0gIEdQSU86IFNwZWNpZnkgdGhlIElPIHBvcnQuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBQV1JfR1BJT19BLCAuLi4sCisgKiBQV1JfR1BJT19HIChvciBQV1JfR1BJT19JIGRlcGVuZGluZyBvbiB0aGUgZGV2aWNlcykgdG8gc2VsZWN0IHRoZSBHUElPCisgKiBwZXJpcGhlcmFsLgorICogQHBhcmFtICBHUElPTnVtYmVyOiBTcGVjaWZ5IHRoZSBJL08gcGlucyBudW1iZXJzLgorICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBQV1JfR1BJT19CSVRfMCwgLi4uLCBQV1JfR1BJT19CSVRfMTUgKGV4Y2VwdCBmb3IgdGhlIHBvcnQgd2hlcmUgbGVzcworICogICAgICAgICBJL08gcGlucyBhcmUgYXZhaWxhYmxlKSBvciB0aGUgbG9naWNhbCBPUiBvZiBzZXZlcmFsIG9mIHRoZW0gdG8gc2V0CisgKiAgICAgICAgIHNldmVyYWwgYml0cyBmb3IgYSBnaXZlbiBwb3J0IGluIGEgc2luZ2xlIEFQSSBjYWxsLgorICogQHJldHZhbCBIQUwgU3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QV1JFeF9FbmFibGVHUElPUHVsbFVwKHVpbnQzMl90IEdQSU8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBHUElPTnVtYmVyKSB7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBhc3NlcnRfcGFyYW0oSVNfUFdSX0dQSU8oR1BJTykpOworICBhc3NlcnRfcGFyYW0oSVNfUFdSX0dQSU9fQklUX05VTUJFUihHUElPTnVtYmVyKSk7CisKKyAgc3dpdGNoIChHUElPKSB7CisgICAgY2FzZSBQV1JfR1BJT19BOgorICAgICAgU0VUX0JJVChQV1ItPlBVQ1JBLCAoR1BJT051bWJlciAmICh+KFBXUl9HUElPX0JJVF8xNCkpKSk7CisgICAgICBDTEVBUl9CSVQoUFdSLT5QRENSQSwKKyAgICAgICAgICAgICAgICAoR1BJT051bWJlciAmICh+KFBXUl9HUElPX0JJVF8xMyB8IFBXUl9HUElPX0JJVF8xNSkpKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBXUl9HUElPX0I6CisgICAgICBTRVRfQklUKFBXUi0+UFVDUkIsIEdQSU9OdW1iZXIpOworICAgICAgQ0xFQVJfQklUKFBXUi0+UERDUkIsIChHUElPTnVtYmVyICYgKH4oUFdSX0dQSU9fQklUXzQpKSkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQV1JfR1BJT19DOgorICAgICAgU0VUX0JJVChQV1ItPlBVQ1JDLCBHUElPTnVtYmVyKTsKKyAgICAgIENMRUFSX0JJVChQV1ItPlBEQ1JDLCBHUElPTnVtYmVyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFdSX0dQSU9fRDoKKyAgICAgIFNFVF9CSVQoUFdSLT5QVUNSRCwgR1BJT051bWJlcik7CisgICAgICBDTEVBUl9CSVQoUFdSLT5QRENSRCwgR1BJT051bWJlcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBXUl9HUElPX0U6CisgICAgICBTRVRfQklUKFBXUi0+UFVDUkUsIEdQSU9OdW1iZXIpOworICAgICAgQ0xFQVJfQklUKFBXUi0+UERDUkUsIEdQSU9OdW1iZXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQV1JfR1BJT19GOgorICAgICAgU0VUX0JJVChQV1ItPlBVQ1JGLCAoR1BJT051bWJlciAmIFBXUl9QT1JURl9BVkFJTEFCTEVfUElOUykpOworICAgICAgQ0xFQVJfQklUKFBXUi0+UERDUkYsIChHUElPTnVtYmVyICYgUFdSX1BPUlRGX0FWQUlMQUJMRV9QSU5TKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBXUl9HUElPX0c6CisgICAgICBTRVRfQklUKFBXUi0+UFVDUkcsIChHUElPTnVtYmVyICYgUFdSX1BPUlRHX0FWQUlMQUJMRV9QSU5TKSk7CisgICAgICBDTEVBUl9CSVQoUFdSLT5QRENSRywgKChHUElPTnVtYmVyICYgUFdSX1BPUlRHX0FWQUlMQUJMRV9QSU5TKSAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh+KFBXUl9HUElPX0JJVF8xMCkpKSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIEBicmllZiBEaXNhYmxlIEdQSU8gcHVsbC11cCBzdGF0ZSBpbiBTdGFuZGJ5IG1vZGUgYW5kIFNodXRkb3duIG1vZGVzLgorICogQG5vdGUgIFJlc2V0IHRoZSByZWxldmFudCBQVXkgYml0cyBvZiBQV1JfUFVDUnggcmVnaXN0ZXIgdXNlZCB0byBjb25maWd1cmUKKyAqIHRoZSBJL08gaW4gcHVsbC11cCBzdGF0ZSBpbiBTdGFuZGJ5IGFuZCBTaHV0ZG93biBtb2Rlcy4KKyAqIEBub3RlICBFdmVuIGlmIGEgUFV5IGJpdCB0byByZXNldCBpcyByZXNlcnZlZCwgdGhlIG90aGVyIFBVeSBiaXRzIGVudGVyZWQgYXMKKyAqIGlucHV0IHBhcmFtZXRlciBhdCB0aGUgc2FtZSB0aW1lIGFyZSByZXNldC4KKyAqIEBwYXJhbSAgR1BJTzogU3BlY2lmaWVzIHRoZSBJTyBwb3J0LiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgUFdSX0dQSU9fQSwgLi4uLAorICogUFdSX0dQSU9fRyAob3IgUFdSX0dQSU9fSSBkZXBlbmRpbmcgb24gdGhlIGRldmljZXMpIHRvIHNlbGVjdCB0aGUgR1BJTworICogcGVyaXBoZXJhbC4KKyAqIEBwYXJhbSAgR1BJT051bWJlcjogU3BlY2lmeSB0aGUgSS9PIHBpbnMgbnVtYmVycy4KKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgUFdSX0dQSU9fQklUXzAsIC4uLiwgUFdSX0dQSU9fQklUXzE1IChleGNlcHQgZm9yIHRoZSBwb3J0IHdoZXJlIGxlc3MKKyAqICAgICAgICAgSS9PIHBpbnMgYXJlIGF2YWlsYWJsZSkgb3IgdGhlIGxvZ2ljYWwgT1Igb2Ygc2V2ZXJhbCBvZiB0aGVtIHRvIHJlc2V0CisgKiAgICAgICAgIHNldmVyYWwgYml0cyBmb3IgYSBnaXZlbiBwb3J0IGluIGEgc2luZ2xlIEFQSSBjYWxsLgorICogQHJldHZhbCBIQUwgU3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QV1JFeF9EaXNhYmxlR1BJT1B1bGxVcCh1aW50MzJfdCBHUElPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEdQSU9OdW1iZXIpIHsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIGFzc2VydF9wYXJhbShJU19QV1JfR1BJTyhHUElPKSk7CisgIGFzc2VydF9wYXJhbShJU19QV1JfR1BJT19CSVRfTlVNQkVSKEdQSU9OdW1iZXIpKTsKKworICBzd2l0Y2ggKEdQSU8pIHsKKyAgICBjYXNlIFBXUl9HUElPX0E6CisgICAgICBDTEVBUl9CSVQoUFdSLT5QVUNSQSwgKEdQSU9OdW1iZXIgJiAofihQV1JfR1BJT19CSVRfMTQpKSkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQV1JfR1BJT19COgorICAgICAgQ0xFQVJfQklUKFBXUi0+UFVDUkIsIEdQSU9OdW1iZXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQV1JfR1BJT19DOgorICAgICAgQ0xFQVJfQklUKFBXUi0+UFVDUkMsIEdQSU9OdW1iZXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQV1JfR1BJT19EOgorICAgICAgQ0xFQVJfQklUKFBXUi0+UFVDUkQsIEdQSU9OdW1iZXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQV1JfR1BJT19FOgorICAgICAgQ0xFQVJfQklUKFBXUi0+UFVDUkUsIEdQSU9OdW1iZXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQV1JfR1BJT19GOgorICAgICAgQ0xFQVJfQklUKFBXUi0+UFVDUkYsIChHUElPTnVtYmVyICYgUFdSX1BPUlRGX0FWQUlMQUJMRV9QSU5TKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBXUl9HUElPX0c6CisgICAgICBDTEVBUl9CSVQoUFdSLT5QVUNSRywgKEdQSU9OdW1iZXIgJiBQV1JfUE9SVEdfQVZBSUxBQkxFX1BJTlMpKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogQGJyaWVmIEVuYWJsZSBHUElPIHB1bGwtZG93biBzdGF0ZSBpbiBTdGFuZGJ5IGFuZCBTaHV0ZG93biBtb2Rlcy4KKyAqIEBub3RlICBTZXQgdGhlIHJlbGV2YW50IFBEeSBiaXRzIG9mIFBXUl9QRENSeCByZWdpc3RlciB0byBjb25maWd1cmUgdGhlIEkvTworICogaW4gcHVsbC1kb3duIHN0YXRlIGluIFN0YW5kYnkgYW5kIFNodXRkb3duIG1vZGVzLgorICogQG5vdGUgIFRoaXMgc3RhdGUgaXMgZWZmZWN0aXZlIGluIFN0YW5kYnkgYW5kIFNodXRkb3duIG1vZGVzIG9ubHkgaWYgQVBDIGJpdAorICogICAgICAgIGlzIHNldCB0aHJvdWdoIEhBTF9QV1JFeF9FbmFibGVQdWxsVXBQdWxsRG93bkNvbmZpZygpIEFQSS4KKyAqIEBub3RlICBUaGUgY29uZmlndXJhdGlvbiBpcyBsb3N0IHdoZW4gZXhpdGluZyB0aGUgU2h1dGRvd24gbW9kZSBkdWUgdG8gdGhlCisgKiAgICAgICAgcG93ZXItb24gcmVzZXQsIG1haW50YWluZWQgd2hlbiBleGl0aW5nIHRoZSBTdGFuZGJ5IG1vZGUuCisgKiBAbm90ZSAgVG8gYXZvaWQgYW55IGNvbmZsaWN0IGF0IFN0YW5kYnkgYW5kIFNodXRkb3duIG1vZGVzIGV4aXRzLCB0aGUKKyAqIGNvcnJlc3BvbmRpbmcgUFV5IGJpdCBvZiBQV1JfUFVDUnggcmVnaXN0ZXIgaXMgY2xlYXJlZCB1bmxlc3MgaXQgaXMgcmVzZXJ2ZWQuCisgKiBAbm90ZSAgRXZlbiBpZiBhIFBEeSBiaXQgdG8gc2V0IGlzIHJlc2VydmVkLCB0aGUgb3RoZXIgUER5IGJpdHMgZW50ZXJlZCBhcworICogaW5wdXQgcGFyYW1ldGVyIGF0IHRoZSBzYW1lIHRpbWUgYXJlIHNldC4KKyAqIEBwYXJhbSAgR1BJTzogU3BlY2lmeSB0aGUgSU8gcG9ydC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlCisgKiBQV1JfR1BJT19BLi5QV1JfR1BJT19HIChvciBQV1JfR1BJT19JIGRlcGVuZGluZyBvbiB0aGUgZGV2aWNlcykgdG8gc2VsZWN0IHRoZQorICogR1BJTyBwZXJpcGhlcmFsLgorICogQHBhcmFtICBHUElPTnVtYmVyOiBTcGVjaWZ5IHRoZSBJL08gcGlucyBudW1iZXJzLgorICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBQV1JfR1BJT19CSVRfMCwgLi4uLCBQV1JfR1BJT19CSVRfMTUgKGV4Y2VwdCBmb3IgdGhlIHBvcnQgd2hlcmUgbGVzcworICogICAgICAgICBJL08gcGlucyBhcmUgYXZhaWxhYmxlKSBvciB0aGUgbG9naWNhbCBPUiBvZiBzZXZlcmFsIG9mIHRoZW0gdG8gc2V0CisgKiAgICAgICAgIHNldmVyYWwgYml0cyBmb3IgYSBnaXZlbiBwb3J0IGluIGEgc2luZ2xlIEFQSSBjYWxsLgorICogQHJldHZhbCBIQUwgU3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QV1JFeF9FbmFibGVHUElPUHVsbERvd24odWludDMyX3QgR1BJTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgR1BJT051bWJlcikgeworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgYXNzZXJ0X3BhcmFtKElTX1BXUl9HUElPKEdQSU8pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1BXUl9HUElPX0JJVF9OVU1CRVIoR1BJT051bWJlcikpOworCisgIHN3aXRjaCAoR1BJTykgeworICAgIGNhc2UgUFdSX0dQSU9fQToKKyAgICAgIFNFVF9CSVQoUFdSLT5QRENSQSwKKyAgICAgICAgICAgICAgKEdQSU9OdW1iZXIgJiAofihQV1JfR1BJT19CSVRfMTMgfCBQV1JfR1BJT19CSVRfMTUpKSkpOworICAgICAgQ0xFQVJfQklUKFBXUi0+UFVDUkEsIChHUElPTnVtYmVyICYgKH4oUFdSX0dQSU9fQklUXzE0KSkpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFdSX0dQSU9fQjoKKyAgICAgIFNFVF9CSVQoUFdSLT5QRENSQiwgKEdQSU9OdW1iZXIgJiAofihQV1JfR1BJT19CSVRfNCkpKSk7CisgICAgICBDTEVBUl9CSVQoUFdSLT5QVUNSQiwgR1BJT051bWJlcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBXUl9HUElPX0M6CisgICAgICBTRVRfQklUKFBXUi0+UERDUkMsIEdQSU9OdW1iZXIpOworICAgICAgQ0xFQVJfQklUKFBXUi0+UFVDUkMsIEdQSU9OdW1iZXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQV1JfR1BJT19EOgorICAgICAgU0VUX0JJVChQV1ItPlBEQ1JELCBHUElPTnVtYmVyKTsKKyAgICAgIENMRUFSX0JJVChQV1ItPlBVQ1JELCBHUElPTnVtYmVyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFdSX0dQSU9fRToKKyAgICAgIFNFVF9CSVQoUFdSLT5QRENSRSwgR1BJT051bWJlcik7CisgICAgICBDTEVBUl9CSVQoUFdSLT5QVUNSRSwgR1BJT051bWJlcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBXUl9HUElPX0Y6CisgICAgICBTRVRfQklUKFBXUi0+UERDUkYsIChHUElPTnVtYmVyICYgUFdSX1BPUlRGX0FWQUlMQUJMRV9QSU5TKSk7CisgICAgICBDTEVBUl9CSVQoUFdSLT5QVUNSRiwgKEdQSU9OdW1iZXIgJiBQV1JfUE9SVEZfQVZBSUxBQkxFX1BJTlMpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFdSX0dQSU9fRzoKKyAgICAgIFNFVF9CSVQoUFdSLT5QRENSRywKKyAgICAgICAgICAgICAgKChHUElPTnVtYmVyICYgUFdSX1BPUlRHX0FWQUlMQUJMRV9QSU5TKSAmICh+KFBXUl9HUElPX0JJVF8xMCkpKSk7CisgICAgICBDTEVBUl9CSVQoUFdSLT5QVUNSRywgKEdQSU9OdW1iZXIgJiBQV1JfUE9SVEdfQVZBSUxBQkxFX1BJTlMpKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogQGJyaWVmIERpc2FibGUgR1BJTyBwdWxsLWRvd24gc3RhdGUgaW4gU3RhbmRieSBhbmQgU2h1dGRvd24gbW9kZXMuCisgKiBAbm90ZSAgUmVzZXQgdGhlIHJlbGV2YW50IFBEeSBiaXRzIG9mIFBXUl9QRENSeCByZWdpc3RlciB1c2VkIHRvIGNvbmZpZ3VyZQorICogdGhlIEkvTyBpbiBwdWxsLWRvd24gc3RhdGUgaW4gU3RhbmRieSBhbmQgU2h1dGRvd24gbW9kZXMuCisgKiBAbm90ZSAgRXZlbiBpZiBhIFBEeSBiaXQgdG8gcmVzZXQgaXMgcmVzZXJ2ZWQsIHRoZSBvdGhlciBQRHkgYml0cyBlbnRlcmVkIGFzCisgKiBpbnB1dCBwYXJhbWV0ZXIgYXQgdGhlIHNhbWUgdGltZSBhcmUgcmVzZXQuCisgKiBAcGFyYW0gIEdQSU86IFNwZWNpZmllcyB0aGUgSU8gcG9ydC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlCisgKiBQV1JfR1BJT19BLi5QV1JfR1BJT19HIChvciBQV1JfR1BJT19JIGRlcGVuZGluZyBvbiB0aGUgZGV2aWNlcykgdG8gc2VsZWN0IHRoZQorICogR1BJTyBwZXJpcGhlcmFsLgorICogQHBhcmFtICBHUElPTnVtYmVyOiBTcGVjaWZ5IHRoZSBJL08gcGlucyBudW1iZXJzLgorICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICBQV1JfR1BJT19CSVRfMCwgLi4uLCBQV1JfR1BJT19CSVRfMTUgKGV4Y2VwdCBmb3IgdGhlIHBvcnQgd2hlcmUgbGVzcworICogICAgICAgICBJL08gcGlucyBhcmUgYXZhaWxhYmxlKSBvciB0aGUgbG9naWNhbCBPUiBvZiBzZXZlcmFsIG9mIHRoZW0gdG8gcmVzZXQKKyAqICAgICAgICAgc2V2ZXJhbCBiaXRzIGZvciBhIGdpdmVuIHBvcnQgaW4gYSBzaW5nbGUgQVBJIGNhbGwuCisgKiBAcmV0dmFsIEhBTCBTdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BXUkV4X0Rpc2FibGVHUElPUHVsbERvd24odWludDMyX3QgR1BJTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEdQSU9OdW1iZXIpIHsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIGFzc2VydF9wYXJhbShJU19QV1JfR1BJTyhHUElPKSk7CisgIGFzc2VydF9wYXJhbShJU19QV1JfR1BJT19CSVRfTlVNQkVSKEdQSU9OdW1iZXIpKTsKKworICBzd2l0Y2ggKEdQSU8pIHsKKyAgICBjYXNlIFBXUl9HUElPX0E6CisgICAgICBDTEVBUl9CSVQoUFdSLT5QRENSQSwKKyAgICAgICAgICAgICAgICAoR1BJT051bWJlciAmICh+KFBXUl9HUElPX0JJVF8xMyB8IFBXUl9HUElPX0JJVF8xNSkpKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBXUl9HUElPX0I6CisgICAgICBDTEVBUl9CSVQoUFdSLT5QRENSQiwgKEdQSU9OdW1iZXIgJiAofihQV1JfR1BJT19CSVRfNCkpKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBXUl9HUElPX0M6CisgICAgICBDTEVBUl9CSVQoUFdSLT5QRENSQywgR1BJT051bWJlcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBXUl9HUElPX0Q6CisgICAgICBDTEVBUl9CSVQoUFdSLT5QRENSRCwgR1BJT051bWJlcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBXUl9HUElPX0U6CisgICAgICBDTEVBUl9CSVQoUFdSLT5QRENSRSwgR1BJT051bWJlcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBXUl9HUElPX0Y6CisgICAgICBDTEVBUl9CSVQoUFdSLT5QRENSRiwgKEdQSU9OdW1iZXIgJiBQV1JfUE9SVEZfQVZBSUxBQkxFX1BJTlMpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFdSX0dQSU9fRzoKKyAgICAgIENMRUFSX0JJVChQV1ItPlBEQ1JHLCAoKEdQSU9OdW1iZXIgJiBQV1JfUE9SVEdfQVZBSUxBQkxFX1BJTlMpICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKH4oUFdSX0dQSU9fQklUXzEwKSkpKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogQGJyaWVmIEVuYWJsZSBwdWxsLXVwIGFuZCBwdWxsLWRvd24gY29uZmlndXJhdGlvbi4KKyAqIEBub3RlICBXaGVuIEFQQyBiaXQgaXMgc2V0LCB0aGUgSS9PIHB1bGwtdXAgYW5kIHB1bGwtZG93biBjb25maWd1cmF0aW9ucworICogZGVmaW5lZCBpbiBQV1JfUFVDUnggYW5kIFBXUl9QRENSeCByZWdpc3RlcnMgYXJlIGFwcGxpZWQgaW4gU3RhbmRieSBhbmQKKyAqIFNodXRkb3duIG1vZGVzLgorICogQG5vdGUgIFB1bGwtdXAgc2V0IGJ5IFBVeSBiaXQgb2YgUFdSX1BVQ1J4IHJlZ2lzdGVyIGlzIG5vdCBhY3RpdmF0ZWQgaWYgdGhlCisgKiBjb3JyZXNwb25kaW5nIFBEeSBiaXQgb2YgUFdSX1BEQ1J4IHJlZ2lzdGVyIGlzIGFsc28gc2V0IChwdWxsLWRvd24KKyAqIGNvbmZpZ3VyYXRpb24gcHJpb3JpdHkgaXMgaGlnaGVyKS4gSEFMX1BXUkV4X0VuYWJsZUdQSU9QdWxsVXAoKSBhbmQKKyAqIEhBTF9QV1JFeF9FbmFibGVHUElPUHVsbERvd24oKSBBUEkncyBlbnN1cmUgdGhlcmUgaXMgbm8gY29uZmxpY3Qgd2hlbiBzZXR0aW5nCisgKiBQVXkgb3IgUER5IGJpdC4KKyAqIEByZXR2YWwgTm9uZQorICovCit2b2lkIEhBTF9QV1JFeF9FbmFibGVQdWxsVXBQdWxsRG93bkNvbmZpZyh2b2lkKSB7CisgIFNFVF9CSVQoUFdSLT5DUjMsIFBXUl9DUjNfQVBDKTsKK30KKworLyoqCisgKiBAYnJpZWYgRGlzYWJsZSBwdWxsLXVwIGFuZCBwdWxsLWRvd24gY29uZmlndXJhdGlvbi4KKyAqIEBub3RlICBXaGVuIEFQQyBiaXQgaXMgY2xlYXJlZCwgdGhlIEkvTyBwdWxsLXVwIGFuZCBwdWxsLWRvd24gY29uZmlndXJhdGlvbnMKKyAqIGRlZmluZWQgaW4gUFdSX1BVQ1J4IGFuZCBQV1JfUERDUnggcmVnaXN0ZXJzIGFyZSBub3QgYXBwbGllZCBpbiBTdGFuZGJ5IGFuZAorICogU2h1dGRvd24gbW9kZXMuCisgKiBAcmV0dmFsIE5vbmUKKyAqLwordm9pZCBIQUxfUFdSRXhfRGlzYWJsZVB1bGxVcFB1bGxEb3duQ29uZmlnKHZvaWQpIHsKKyAgQ0xFQVJfQklUKFBXUi0+Q1IzLCBQV1JfQ1IzX0FQQyk7Cit9CisKKyNpZiBkZWZpbmVkKFNSQU0yX0JBU0UpCisvKioKKyAqIEBicmllZiBFbmFibGUgU1JBTTIgY29udGVudCByZXRlbnRpb24gaW4gU3RhbmRieSBtb2RlLgorICogQG5vdGUgIFdoZW4gUlJTIGJpdCBpcyBzZXQsIFNSQU0yIGlzIHBvd2VyZWQgYnkgdGhlIGxvdy1wb3dlciByZWd1bGF0b3IgaW4KKyAqICAgICAgICAgU3RhbmRieSBtb2RlIGFuZCBpdHMgY29udGVudCBpcyBrZXB0LgorICogQHJldHZhbCBOb25lCisgKi8KK3ZvaWQgSEFMX1BXUkV4X0VuYWJsZVNSQU0yQ29udGVudFJldGVudGlvbih2b2lkKSB7CisgIFNFVF9CSVQoUFdSLT5DUjMsIFBXUl9DUjNfUlJTKTsKK30KKworLyoqCisgKiBAYnJpZWYgRGlzYWJsZSBTUkFNMiBjb250ZW50IHJldGVudGlvbiBpbiBTdGFuZGJ5IG1vZGUuCisgKiBAbm90ZSAgV2hlbiBSUlMgYml0IGlzIHJlc2V0LCBTUkFNMiBpcyBwb3dlcmVkIG9mZiBpbiBTdGFuZGJ5IG1vZGUKKyAqICAgICAgICBhbmQgaXRzIGNvbnRlbnQgaXMgbG9zdC4KKyAqIEByZXR2YWwgTm9uZQorICovCit2b2lkIEhBTF9QV1JFeF9EaXNhYmxlU1JBTTJDb250ZW50UmV0ZW50aW9uKHZvaWQpIHsKKyAgQ0xFQVJfQklUKFBXUi0+Q1IzLCBQV1JfQ1IzX1JSUyk7Cit9CisjZW5kaWYgLyogU1JBTTJfQkFTRSAqLworCisjaWYgZGVmaW5lZChQV1JfQ1IyX1BWTUUxKQorLyoqCisgKiBAYnJpZWYgRW5hYmxlIHRoZSBQb3dlciBWb2x0YWdlIE1vbml0b3JpbmcgMTogVkREQSB2ZXJzdXMgRkFTVENPTVAgbWluaW11bQorICogdm9sdGFnZS4KKyAqIEByZXR2YWwgTm9uZQorICovCit2b2lkIEhBTF9QV1JFeF9FbmFibGVQVk0xKHZvaWQpIHsgU0VUX0JJVChQV1ItPkNSMiwgUFdSX1BWTV8xKTsgfQorCisvKioKKyAqIEBicmllZiBEaXNhYmxlIHRoZSBQb3dlciBWb2x0YWdlIE1vbml0b3JpbmcgMTogVkREQSB2ZXJzdXMgRkFTVENPTVAgbWluaW11bQorICogdm9sdGFnZS4KKyAqIEByZXR2YWwgTm9uZQorICovCit2b2lkIEhBTF9QV1JFeF9EaXNhYmxlUFZNMSh2b2lkKSB7IENMRUFSX0JJVChQV1ItPkNSMiwgUFdSX1BWTV8xKTsgfQorI2VuZGlmIC8qIFBXUl9DUjJfUFZNRTEgKi8KKworI2lmIGRlZmluZWQoUFdSX0NSMl9QVk1FMikKKy8qKgorICogQGJyaWVmIEVuYWJsZSB0aGUgUG93ZXIgVm9sdGFnZSBNb25pdG9yaW5nIDI6IFZEREEgdmVyc3VzIEZBU1REQUMgbWluaW11bQorICogdm9sdGFnZS4KKyAqIEByZXR2YWwgTm9uZQorICovCit2b2lkIEhBTF9QV1JFeF9FbmFibGVQVk0yKHZvaWQpIHsgU0VUX0JJVChQV1ItPkNSMiwgUFdSX1BWTV8yKTsgfQorCisvKioKKyAqIEBicmllZiBEaXNhYmxlIHRoZSBQb3dlciBWb2x0YWdlIE1vbml0b3JpbmcgMjogVkREQSB2ZXJzdXMgRkFTVERBQyBtaW5pbXVtCisgKiB2b2x0YWdlLgorICogQHJldHZhbCBOb25lCisgKi8KK3ZvaWQgSEFMX1BXUkV4X0Rpc2FibGVQVk0yKHZvaWQpIHsgQ0xFQVJfQklUKFBXUi0+Q1IyLCBQV1JfUFZNXzIpOyB9CisjZW5kaWYgLyogUFdSX0NSMl9QVk1FMiAqLworCisvKioKKyAqIEBicmllZiBFbmFibGUgdGhlIFBvd2VyIFZvbHRhZ2UgTW9uaXRvcmluZyAzOiBWRERBIHZlcnN1cyBBREMgbWluaW11bQorICogdm9sdGFnZSAxLjYyVi4KKyAqIEByZXR2YWwgTm9uZQorICovCit2b2lkIEhBTF9QV1JFeF9FbmFibGVQVk0zKHZvaWQpIHsgU0VUX0JJVChQV1ItPkNSMiwgUFdSX1BWTV8zKTsgfQorCisvKioKKyAqIEBicmllZiBEaXNhYmxlIHRoZSBQb3dlciBWb2x0YWdlIE1vbml0b3JpbmcgMzogVkREQSB2ZXJzdXMgQURDIG1pbmltdW0KKyAqIHZvbHRhZ2UgMS42MlYuCisgKiBAcmV0dmFsIE5vbmUKKyAqLwordm9pZCBIQUxfUFdSRXhfRGlzYWJsZVBWTTModm9pZCkgeyBDTEVBUl9CSVQoUFdSLT5DUjIsIFBXUl9QVk1fMyk7IH0KKworLyoqCisgKiBAYnJpZWYgRW5hYmxlIHRoZSBQb3dlciBWb2x0YWdlIE1vbml0b3JpbmcgNDogVkREQSB2ZXJzdXMgT1BBTVAvREFDIG1pbmltdW0KKyAqIHZvbHRhZ2UgMS44Vi4KKyAqIEByZXR2YWwgTm9uZQorICovCit2b2lkIEhBTF9QV1JFeF9FbmFibGVQVk00KHZvaWQpIHsgU0VUX0JJVChQV1ItPkNSMiwgUFdSX1BWTV80KTsgfQorCisvKioKKyAqIEBicmllZiBEaXNhYmxlIHRoZSBQb3dlciBWb2x0YWdlIE1vbml0b3JpbmcgNDogVkREQSB2ZXJzdXMgT1BBTVAvREFDIG1pbmltdW0KKyAqIHZvbHRhZ2UgMS44Vi4KKyAqIEByZXR2YWwgTm9uZQorICovCit2b2lkIEhBTF9QV1JFeF9EaXNhYmxlUFZNNCh2b2lkKSB7IENMRUFSX0JJVChQV1ItPkNSMiwgUFdSX1BWTV80KTsgfQorCisvKioKKyAqIEBicmllZiBDb25maWd1cmUgdGhlIFBlcmlwaGVyYWwgVm9sdGFnZSBNb25pdG9yaW5nIChQVk0pLgorICogQHBhcmFtIHNDb25maWdQVk06IHBvaW50ZXIgdG8gYSBQV1JfUFZNVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGUKKyAqICAgICAgICBQVk0gY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4KKyAqIEBub3RlIFRoZSBBUEkgY29uZmlndXJlcyBhIHNpbmdsZSBQVk0gYWNjb3JkaW5nIHRvIHRoZSBpbmZvcm1hdGlvbiBjb250YWluZWQKKyAqICAgICAgIGluIHRoZSBpbnB1dCBzdHJ1Y3R1cmUuIFRvIGNvbmZpZ3VyZSBzZXZlcmFsIFBWTXMsIHRoZSBBUEkgbXVzdCBiZQorICogc2luZ2x5IGNhbGxlZCBmb3IgZWFjaCBQVk0gdXNlZC4KKyAqIEBub3RlIFJlZmVyIHRvIHRoZSBlbGVjdHJpY2FsIGNoYXJhY3RlcmlzdGljcyBvZiB5b3VyIGRldmljZSBkYXRhc2hlZXQgZm9yCisgKiAgICAgICAgIG1vcmUgZGV0YWlscyBhYm91dCB0aGUgdm9sdGFnZSB0aHJlc2hvbGRzIGNvcnJlc3BvbmRpbmcgdG8gZWFjaAorICogICAgICAgICBkZXRlY3Rpb24gbGV2ZWwgYW5kIHRvIGVhY2ggbW9uaXRvcmVkIHN1cHBseS4KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUFdSRXhfQ29uZmlnUFZNKFBXUl9QVk1UeXBlRGVmICpzQ29uZmlnUFZNKSB7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUFdSX1BWTV9UWVBFKHNDb25maWdQVk0tPlBWTVR5cGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1BXUl9QVk1fTU9ERShzQ29uZmlnUFZNLT5Nb2RlKSk7CisKKyAgLyogQ29uZmlndXJlIEVYVEkgMzUgdG8gMzggaW50ZXJydXB0cyBpZiBzbyByZXF1aXJlZDoKKyAgICAgc2NhbiB0aHJvdWdoIFBWTVR5cGUgdG8gZGV0ZWN0IHdoaWNoIFBWTXggaXMgc2V0IGFuZAorICAgICBjb25maWd1cmUgdGhlIGNvcnJlc3BvbmRpbmcgRVhUSSBsaW5lIGFjY29yZGluZ2x5LiAqLworICBzd2l0Y2ggKHNDb25maWdQVk0tPlBWTVR5cGUpIHsKKyNpZiBkZWZpbmVkKFBXUl9DUjJfUFZNRTEpCisgICAgY2FzZSBQV1JfUFZNXzE6CisgICAgICAvKiBDbGVhciBhbnkgcHJldmlvdXMgY29uZmlnLiBLZWVwIGl0IGNsZWFyIGlmIG5vIGV2ZW50IG9yIElUIG1vZGUgaXMKKyAgICAgICAqIHNlbGVjdGVkICovCisgICAgICBfX0hBTF9QV1JfUFZNMV9FWFRJX0RJU0FCTEVfRVZFTlQoKTsKKyAgICAgIF9fSEFMX1BXUl9QVk0xX0VYVElfRElTQUJMRV9JVCgpOworICAgICAgX19IQUxfUFdSX1BWTTFfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpOworICAgICAgX19IQUxfUFdSX1BWTTFfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCk7CisKKyAgICAgIC8qIENvbmZpZ3VyZSBpbnRlcnJ1cHQgbW9kZSAqLworICAgICAgaWYgKChzQ29uZmlnUFZNLT5Nb2RlICYgUFZNX01PREVfSVQpID09IFBWTV9NT0RFX0lUKSB7CisgICAgICAgIF9fSEFMX1BXUl9QVk0xX0VYVElfRU5BQkxFX0lUKCk7CisgICAgICB9CisKKyAgICAgIC8qIENvbmZpZ3VyZSBldmVudCBtb2RlICovCisgICAgICBpZiAoKHNDb25maWdQVk0tPk1vZGUgJiBQVk1fTU9ERV9FVlQpID09IFBWTV9NT0RFX0VWVCkgeworICAgICAgICBfX0hBTF9QV1JfUFZNMV9FWFRJX0VOQUJMRV9FVkVOVCgpOworICAgICAgfQorCisgICAgICAvKiBDb25maWd1cmUgdGhlIGVkZ2UgKi8KKyAgICAgIGlmICgoc0NvbmZpZ1BWTS0+TW9kZSAmIFBWTV9SSVNJTkdfRURHRSkgPT0gUFZNX1JJU0lOR19FREdFKSB7CisgICAgICAgIF9fSEFMX1BXUl9QVk0xX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCk7CisgICAgICB9CisKKyAgICAgIGlmICgoc0NvbmZpZ1BWTS0+TW9kZSAmIFBWTV9GQUxMSU5HX0VER0UpID09IFBWTV9GQUxMSU5HX0VER0UpIHsKKyAgICAgICAgX19IQUxfUFdSX1BWTTFfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCk7CisgICAgICB9CisgICAgICBicmVhazsKKyNlbmRpZiAvKiBQV1JfQ1IyX1BWTUUxICovCisKKyNpZiBkZWZpbmVkKFBXUl9DUjJfUFZNRTIpCisgICAgY2FzZSBQV1JfUFZNXzI6CisgICAgICAvKiBDbGVhciBhbnkgcHJldmlvdXMgY29uZmlnLiBLZWVwIGl0IGNsZWFyIGlmIG5vIGV2ZW50IG9yIElUIG1vZGUgaXMKKyAgICAgICAqIHNlbGVjdGVkICovCisgICAgICBfX0hBTF9QV1JfUFZNMl9FWFRJX0RJU0FCTEVfRVZFTlQoKTsKKyAgICAgIF9fSEFMX1BXUl9QVk0yX0VYVElfRElTQUJMRV9JVCgpOworICAgICAgX19IQUxfUFdSX1BWTTJfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpOworICAgICAgX19IQUxfUFdSX1BWTTJfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCk7CisKKyAgICAgIC8qIENvbmZpZ3VyZSBpbnRlcnJ1cHQgbW9kZSAqLworICAgICAgaWYgKChzQ29uZmlnUFZNLT5Nb2RlICYgUFZNX01PREVfSVQpID09IFBWTV9NT0RFX0lUKSB7CisgICAgICAgIF9fSEFMX1BXUl9QVk0yX0VYVElfRU5BQkxFX0lUKCk7CisgICAgICB9CisKKyAgICAgIC8qIENvbmZpZ3VyZSBldmVudCBtb2RlICovCisgICAgICBpZiAoKHNDb25maWdQVk0tPk1vZGUgJiBQVk1fTU9ERV9FVlQpID09IFBWTV9NT0RFX0VWVCkgeworICAgICAgICBfX0hBTF9QV1JfUFZNMl9FWFRJX0VOQUJMRV9FVkVOVCgpOworICAgICAgfQorCisgICAgICAvKiBDb25maWd1cmUgdGhlIGVkZ2UgKi8KKyAgICAgIGlmICgoc0NvbmZpZ1BWTS0+TW9kZSAmIFBWTV9SSVNJTkdfRURHRSkgPT0gUFZNX1JJU0lOR19FREdFKSB7CisgICAgICAgIF9fSEFMX1BXUl9QVk0yX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCk7CisgICAgICB9CisKKyAgICAgIGlmICgoc0NvbmZpZ1BWTS0+TW9kZSAmIFBWTV9GQUxMSU5HX0VER0UpID09IFBWTV9GQUxMSU5HX0VER0UpIHsKKyAgICAgICAgX19IQUxfUFdSX1BWTTJfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCk7CisgICAgICB9CisgICAgICBicmVhazsKKyNlbmRpZiAvKiBQV1JfQ1IyX1BWTUUyICovCisKKyAgICBjYXNlIFBXUl9QVk1fMzoKKyAgICAgIC8qIENsZWFyIGFueSBwcmV2aW91cyBjb25maWcuIEtlZXAgaXQgY2xlYXIgaWYgbm8gZXZlbnQgb3IgSVQgbW9kZSBpcworICAgICAgICogc2VsZWN0ZWQgKi8KKyAgICAgIF9fSEFMX1BXUl9QVk0zX0VYVElfRElTQUJMRV9FVkVOVCgpOworICAgICAgX19IQUxfUFdSX1BWTTNfRVhUSV9ESVNBQkxFX0lUKCk7CisgICAgICBfX0hBTF9QV1JfUFZNM19FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCk7CisgICAgICBfX0hBTF9QV1JfUFZNM19FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKTsKKworICAgICAgLyogQ29uZmlndXJlIGludGVycnVwdCBtb2RlICovCisgICAgICBpZiAoKHNDb25maWdQVk0tPk1vZGUgJiBQVk1fTU9ERV9JVCkgPT0gUFZNX01PREVfSVQpIHsKKyAgICAgICAgX19IQUxfUFdSX1BWTTNfRVhUSV9FTkFCTEVfSVQoKTsKKyAgICAgIH0KKworICAgICAgLyogQ29uZmlndXJlIGV2ZW50IG1vZGUgKi8KKyAgICAgIGlmICgoc0NvbmZpZ1BWTS0+TW9kZSAmIFBWTV9NT0RFX0VWVCkgPT0gUFZNX01PREVfRVZUKSB7CisgICAgICAgIF9fSEFMX1BXUl9QVk0zX0VYVElfRU5BQkxFX0VWRU5UKCk7CisgICAgICB9CisKKyAgICAgIC8qIENvbmZpZ3VyZSB0aGUgZWRnZSAqLworICAgICAgaWYgKChzQ29uZmlnUFZNLT5Nb2RlICYgUFZNX1JJU0lOR19FREdFKSA9PSBQVk1fUklTSU5HX0VER0UpIHsKKyAgICAgICAgX19IQUxfUFdSX1BWTTNfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKTsKKyAgICAgIH0KKworICAgICAgaWYgKChzQ29uZmlnUFZNLT5Nb2RlICYgUFZNX0ZBTExJTkdfRURHRSkgPT0gUFZNX0ZBTExJTkdfRURHRSkgeworICAgICAgICBfX0hBTF9QV1JfUFZNM19FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBQV1JfUFZNXzQ6CisgICAgICAvKiBDbGVhciBhbnkgcHJldmlvdXMgY29uZmlnLiBLZWVwIGl0IGNsZWFyIGlmIG5vIGV2ZW50IG9yIElUIG1vZGUgaXMKKyAgICAgICAqIHNlbGVjdGVkICovCisgICAgICBfX0hBTF9QV1JfUFZNNF9FWFRJX0RJU0FCTEVfRVZFTlQoKTsKKyAgICAgIF9fSEFMX1BXUl9QVk00X0VYVElfRElTQUJMRV9JVCgpOworICAgICAgX19IQUxfUFdSX1BWTTRfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpOworICAgICAgX19IQUxfUFdSX1BWTTRfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCk7CisKKyAgICAgIC8qIENvbmZpZ3VyZSBpbnRlcnJ1cHQgbW9kZSAqLworICAgICAgaWYgKChzQ29uZmlnUFZNLT5Nb2RlICYgUFZNX01PREVfSVQpID09IFBWTV9NT0RFX0lUKSB7CisgICAgICAgIF9fSEFMX1BXUl9QVk00X0VYVElfRU5BQkxFX0lUKCk7CisgICAgICB9CisKKyAgICAgIC8qIENvbmZpZ3VyZSBldmVudCBtb2RlICovCisgICAgICBpZiAoKHNDb25maWdQVk0tPk1vZGUgJiBQVk1fTU9ERV9FVlQpID09IFBWTV9NT0RFX0VWVCkgeworICAgICAgICBfX0hBTF9QV1JfUFZNNF9FWFRJX0VOQUJMRV9FVkVOVCgpOworICAgICAgfQorCisgICAgICAvKiBDb25maWd1cmUgdGhlIGVkZ2UgKi8KKyAgICAgIGlmICgoc0NvbmZpZ1BWTS0+TW9kZSAmIFBWTV9SSVNJTkdfRURHRSkgPT0gUFZNX1JJU0lOR19FREdFKSB7CisgICAgICAgIF9fSEFMX1BXUl9QVk00X0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCk7CisgICAgICB9CisKKyAgICAgIGlmICgoc0NvbmZpZ1BWTS0+TW9kZSAmIFBWTV9GQUxMSU5HX0VER0UpID09IFBWTV9GQUxMSU5HX0VER0UpIHsKKyAgICAgICAgX19IQUxfUFdSX1BWTTRfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogQGJyaWVmIEVudGVyIExvdy1wb3dlciBSdW4gbW9kZQorICogQG5vdGUgIEluIExvdy1wb3dlciBSdW4gbW9kZSwgYWxsIEkvTyBwaW5zIGtlZXAgdGhlIHNhbWUgc3RhdGUgYXMgaW4gUnVuCisgKiBtb2RlLgorICogQG5vdGUgIFdoZW4gUmVndWxhdG9yIGlzIHNldCB0byBQV1JfTE9XUE9XRVJSRUdVTEFUT1JfT04sIHRoZSB1c2VyIGNhbgorICogb3B0aW9uYWxseSBjb25maWd1cmUgdGhlIEZsYXNoIGluIHBvd2VyLWRvd24gbW9uZGUgaW4gc2V0dGluZyB0aGUgUlVOX1BEIGJpdAorICogaW4gRkxBU0hfQUNSIHJlZ2lzdGVyLiBBZGRpdGlvbmFsbHksIHRoZSBjbG9jayBmcmVxdWVuY3kgbXVzdCBiZSByZWR1Y2VkCisgKiBiZWxvdyAyIE1Iei4gU2V0dGluZyBSVU5fUEQgaW4gRkxBU0hfQUNSIHRoZW4gYXBwcm9wcmlhdGVseSByZWR1Y2luZyB0aGUKKyAqIGNsb2NrIGZyZXF1ZW5jeSBtdXN0IGJlIGRvbmUgYmVmb3JlIGNhbGxpbmcgSEFMX1BXUkV4X0VuYWJsZUxvd1Bvd2VyUnVuTW9kZSgpCisgKiBBUEkuCisgKiBAcmV0dmFsIE5vbmUKKyAqLwordm9pZCBIQUxfUFdSRXhfRW5hYmxlTG93UG93ZXJSdW5Nb2RlKHZvaWQpIHsKKyAgLyogU2V0IFJlZ3VsYXRvciBwYXJhbWV0ZXIgKi8KKyAgU0VUX0JJVChQV1ItPkNSMSwgUFdSX0NSMV9MUFIpOworfQorCisvKioKKyAqIEBicmllZiBFeGl0IExvdy1wb3dlciBSdW4gbW9kZS4KKyAqIEBub3RlICBCZWZvcmUgSEFMX1BXUkV4X0Rpc2FibGVMb3dQb3dlclJ1bk1vZGUoKSBjb21wbGV0aW9uLCB0aGUgZnVuY3Rpb24KKyAqIGNoZWNrcyB0aGF0IFJFR0xQRiBoYXMgYmVlbiBwcm9wZXJseSByZXNldCAob3RoZXJ3aXNlLAorICogSEFMX1BXUkV4X0Rpc2FibGVMb3dQb3dlclJ1bk1vZGUgcmV0dXJucyBIQUxfVElNRU9VVCBzdGF0dXMpLiBUaGUgc3lzdGVtCisgKiBjbG9jayBmcmVxdWVuY3kgY2FuIHRoZW4gYmUgaW5jcmVhc2VkIGFib3ZlIDIgTUh6LgorICogQHJldHZhbCBIQUwgU3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QV1JFeF9EaXNhYmxlTG93UG93ZXJSdW5Nb2RlKHZvaWQpIHsKKyAgdWludDMyX3Qgd2FpdF9sb29wX2luZGV4OworCisgIC8qIENsZWFyIExQUiBiaXQgKi8KKyAgQ0xFQVJfQklUKFBXUi0+Q1IxLCBQV1JfQ1IxX0xQUik7CisKKyAgLyogV2FpdCB1bnRpbCBSRUdMUEYgaXMgcmVzZXQgKi8KKyAgd2FpdF9sb29wX2luZGV4ID0gKFBXUl9GTEFHX1NFVFRJTkdfREVMQVlfVVMgKiAoU3lzdGVtQ29yZUNsb2NrIC8gMTAwMDAwMFUpKTsKKyAgd2hpbGUgKChIQUxfSVNfQklUX1NFVChQV1ItPlNSMiwgUFdSX1NSMl9SRUdMUEYpKSAmJgorICAgICAgICAgKHdhaXRfbG9vcF9pbmRleCAhPSAwVSkpIHsKKyAgICB3YWl0X2xvb3BfaW5kZXgtLTsKKyAgfQorICBpZiAoSEFMX0lTX0JJVF9TRVQoUFdSLT5TUjIsIFBXUl9TUjJfUkVHTFBGKSkgeworICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgfQorCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICogQGJyaWVmIEVudGVyIFN0b3AgMCBtb2RlLgorICogQG5vdGUgIEluIFN0b3AgMCBtb2RlLCBtYWluIGFuZCBsb3cgdm9sdGFnZSByZWd1bGF0b3JzIGFyZSBPTi4KKyAqIEBub3RlICBJbiBTdG9wIDAgbW9kZSwgYWxsIEkvTyBwaW5zIGtlZXAgdGhlIHNhbWUgc3RhdGUgYXMgaW4gUnVuIG1vZGUuCisgKiBAbm90ZSAgQWxsIGNsb2NrcyBpbiB0aGUgVkNPUkUgZG9tYWluIGFyZSBzdG9wcGVkOyB0aGUgUExMLCB0aGUgSFNJCisgKiAgICAgICAgYW5kIHRoZSBIU0Ugb3NjaWxsYXRvcnMgYXJlIGRpc2FibGVkLiBTb21lIHBlcmlwaGVyYWxzIHdpdGggdGhlIHdha2V1cAorICogY2FwYWJpbGl0eSAoSTJDeCwgVVNBUlR4IGFuZCBMUFVBUlQpIGNhbiBzd2l0Y2ggb24gdGhlIEhTSSB0byByZWNlaXZlIGEKKyAqIGZyYW1lLCBhbmQgc3dpdGNoIG9mZiB0aGUgSFNJIGFmdGVyIHJlY2VpdmluZyB0aGUgZnJhbWUgaWYgaXQgaXMgbm90IGEgd2FrZXVwCisgKiBmcmFtZS4gSW4gdGhpcyBjYXNlLCB0aGUgSFNJIGNsb2NrIGlzIHByb3BhZ2F0ZWQgb25seSB0byB0aGUgcGVyaXBoZXJhbAorICogcmVxdWVzdGluZyBpdC4gU1JBTTEsIFNSQU0yIGFuZCByZWdpc3RlciBjb250ZW50cyBhcmUgcHJlc2VydmVkLiBUaGUgQk9SIGlzCisgKiBhdmFpbGFibGUuCisgKiBAbm90ZSAgV2hlbiBleGl0aW5nIFN0b3AgMCBtb2RlIGJ5IGlzc3VpbmcgYW4gaW50ZXJydXB0IG9yIGEgd2FrZXVwIGV2ZW50LAorICogICAgICAgICB0aGUgSFNJIFJDIG9zY2lsbGF0b3IgaXMgc2VsZWN0ZWQgYXMgc3lzdGVtIGNsb2NrIGlmIFNUT1BXVUNLIGJpdCBpbgorICogUkNDX0NGR1IgcmVnaXN0ZXIgaXMgc2V0OyB0aGUgSFNJIG9zY2lsbGF0b3IgaXMgc2VsZWN0ZWQgaWYgU1RPUFdVQ0sgaXMKKyAqIGNsZWFyZWQuCisgKiBAbm90ZSAgQnkga2VlcGluZyB0aGUgaW50ZXJuYWwgcmVndWxhdG9yIE9OIGR1cmluZyBTdG9wIDAgbW9kZSwgdGhlCisgKiBjb25zdW1wdGlvbiBpcyBoaWdoZXIgYWx0aG91Z2ggdGhlIHN0YXJ0dXAgdGltZSBpcyByZWR1Y2VkLgorICogQHBhcmFtIFNUT1BFbnRyeSAgc3BlY2lmaWVzIGlmIFN0b3AgbW9kZSBpbiBlbnRlcmVkIHdpdGggV0ZJIG9yIFdGRQorICogaW5zdHJ1Y3Rpb24uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfU1RPUEVOVFJZX1dGSSAgRW50ZXIgU3RvcCBtb2RlIHdpdGggV0ZJIGluc3RydWN0aW9uCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfU1RPUEVOVFJZX1dGRSAgRW50ZXIgU3RvcCBtb2RlIHdpdGggV0ZFIGluc3RydWN0aW9uCisgKiBAcmV0dmFsIE5vbmUKKyAqLwordm9pZCBIQUxfUFdSRXhfRW50ZXJTVE9QME1vZGUodWludDhfdCBTVE9QRW50cnkpIHsKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1BXUl9TVE9QX0VOVFJZKFNUT1BFbnRyeSkpOworCisgIC8qIFN0b3AgMCBtb2RlIHdpdGggTWFpbiBSZWd1bGF0b3IgKi8KKyAgTU9ESUZZX1JFRyhQV1ItPkNSMSwgUFdSX0NSMV9MUE1TLCBQV1JfQ1IxX0xQTVNfU1RPUDApOworCisgIC8qIFNldCBTTEVFUERFRVAgYml0IG9mIENvcnRleCBTeXN0ZW0gQ29udHJvbCBSZWdpc3RlciAqLworICBTRVRfQklUKFNDQi0+U0NSLCAoKHVpbnQzMl90KVNDQl9TQ1JfU0xFRVBERUVQX01zaykpOworCisgIC8qIFNlbGVjdCBTdG9wIG1vZGUgZW50cnkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoU1RPUEVudHJ5ID09IFBXUl9TVE9QRU5UUllfV0ZJKSB7CisgICAgLyogUmVxdWVzdCBXYWl0IEZvciBJbnRlcnJ1cHQgKi8KKyAgICBfX1dGSSgpOworICB9IGVsc2UgeworICAgIC8qIFJlcXVlc3QgV2FpdCBGb3IgRXZlbnQgKi8KKyAgICBfX1NFVigpOworICAgIF9fV0ZFKCk7CisgICAgX19XRkUoKTsKKyAgfQorCisgIC8qIFJlc2V0IFNMRUVQREVFUCBiaXQgb2YgQ29ydGV4IFN5c3RlbSBDb250cm9sIFJlZ2lzdGVyICovCisgIENMRUFSX0JJVChTQ0ItPlNDUiwgKCh1aW50MzJfdClTQ0JfU0NSX1NMRUVQREVFUF9Nc2spKTsKK30KKworLyoqCisgKiBAYnJpZWYgRW50ZXIgU3RvcCAxIG1vZGUuCisgKiBAbm90ZSAgSW4gU3RvcCAxIG1vZGUsIG9ubHkgbG93IHBvd2VyIHZvbHRhZ2UgcmVndWxhdG9yIGlzIE9OLgorICogQG5vdGUgIEluIFN0b3AgMSBtb2RlLCBhbGwgSS9PIHBpbnMga2VlcCB0aGUgc2FtZSBzdGF0ZSBhcyBpbiBSdW4gbW9kZS4KKyAqIEBub3RlICBBbGwgY2xvY2tzIGluIHRoZSBWQ09SRSBkb21haW4gYXJlIHN0b3BwZWQ7IHRoZSBQTEwsIHRoZSBIU0kKKyAqICAgICAgICBhbmQgdGhlIEhTRSBvc2NpbGxhdG9ycyBhcmUgZGlzYWJsZWQuIFNvbWUgcGVyaXBoZXJhbHMgd2l0aCB0aGUgd2FrZXVwCisgKiBjYXBhYmlsaXR5IChJMkN4LCBVU0FSVHggYW5kIExQVUFSVCkgY2FuIHN3aXRjaCBvbiB0aGUgSFNJIHRvIHJlY2VpdmUgYQorICogZnJhbWUsIGFuZCBzd2l0Y2ggb2ZmIHRoZSBIU0kgYWZ0ZXIgcmVjZWl2aW5nIHRoZSBmcmFtZSBpZiBpdCBpcyBub3QgYSB3YWtldXAKKyAqIGZyYW1lLiBJbiB0aGlzIGNhc2UsIHRoZSBIU0kgY2xvY2sgaXMgcHJvcGFnYXRlZCBvbmx5IHRvIHRoZSBwZXJpcGhlcmFsCisgKiByZXF1ZXN0aW5nIGl0LiBTUkFNMSwgU1JBTTIgYW5kIHJlZ2lzdGVyIGNvbnRlbnRzIGFyZSBwcmVzZXJ2ZWQuIFRoZSBCT1IgaXMKKyAqIGF2YWlsYWJsZS4KKyAqIEBub3RlICBXaGVuIGV4aXRpbmcgU3RvcCAxIG1vZGUgYnkgaXNzdWluZyBhbiBpbnRlcnJ1cHQgb3IgYSB3YWtldXAgZXZlbnQsCisgKiAgICAgICAgIHRoZSBIU0kgUkMgb3NjaWxsYXRvciBpcyBzZWxlY3RlZCBhcyBzeXN0ZW0gY2xvY2sgaWYgU1RPUFdVQ0sgYml0IGluCisgKiBSQ0NfQ0ZHUiByZWdpc3RlciBpcyBzZXQuCisgKiBAbm90ZSAgRHVlIHRvIGxvdyBwb3dlciBtb2RlLCBhbiBhZGRpdGlvbmFsIHN0YXJ0dXAgZGVsYXkgaXMgaW5jdXJyZWQgd2hlbgorICogd2FraW5nIHVwIGZyb20gU3RvcCAxIG1vZGUuCisgKiBAcGFyYW0gU1RPUEVudHJ5ICBzcGVjaWZpZXMgaWYgU3RvcCBtb2RlIGluIGVudGVyZWQgd2l0aCBXRkkgb3IgV0ZFCisgKiBpbnN0cnVjdGlvbi4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFBXUl9TVE9QRU5UUllfV0ZJICBFbnRlciBTdG9wIG1vZGUgd2l0aCBXRkkgaW5zdHJ1Y3Rpb24KKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFBXUl9TVE9QRU5UUllfV0ZFICBFbnRlciBTdG9wIG1vZGUgd2l0aCBXRkUgaW5zdHJ1Y3Rpb24KKyAqIEByZXR2YWwgTm9uZQorICovCit2b2lkIEhBTF9QV1JFeF9FbnRlclNUT1AxTW9kZSh1aW50OF90IFNUT1BFbnRyeSkgeworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUFdSX1NUT1BfRU5UUlkoU1RPUEVudHJ5KSk7CisKKyAgLyogU3RvcCAxIG1vZGUgd2l0aCBMb3ctUG93ZXIgUmVndWxhdG9yICovCisgIE1PRElGWV9SRUcoUFdSLT5DUjEsIFBXUl9DUjFfTFBNUywgUFdSX0NSMV9MUE1TX1NUT1AxKTsKKworICAvKiBTZXQgU0xFRVBERUVQIGJpdCBvZiBDb3J0ZXggU3lzdGVtIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyAgU0VUX0JJVChTQ0ItPlNDUiwgKCh1aW50MzJfdClTQ0JfU0NSX1NMRUVQREVFUF9Nc2spKTsKKworICAvKiBTZWxlY3QgU3RvcCBtb2RlIGVudHJ5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKFNUT1BFbnRyeSA9PSBQV1JfU1RPUEVOVFJZX1dGSSkgeworICAgIC8qIFJlcXVlc3QgV2FpdCBGb3IgSW50ZXJydXB0ICovCisgICAgX19XRkkoKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBSZXF1ZXN0IFdhaXQgRm9yIEV2ZW50ICovCisgICAgX19TRVYoKTsKKyAgICBfX1dGRSgpOworICAgIF9fV0ZFKCk7CisgIH0KKworICAvKiBSZXNldCBTTEVFUERFRVAgYml0IG9mIENvcnRleCBTeXN0ZW0gQ29udHJvbCBSZWdpc3RlciAqLworICBDTEVBUl9CSVQoU0NCLT5TQ1IsICgodWludDMyX3QpU0NCX1NDUl9TTEVFUERFRVBfTXNrKSk7Cit9CisKKy8qKgorICogQGJyaWVmIEVudGVyIFNodXRkb3duIG1vZGUuCisgKiBAbm90ZSAgSW4gU2h1dGRvd24gbW9kZSwgdGhlIFBMTCwgdGhlIEhTSSwgdGhlIExTSSBhbmQgdGhlIEhTRSBvc2NpbGxhdG9ycworICogYXJlIHN3aXRjaGVkIG9mZi4gVGhlIHZvbHRhZ2UgcmVndWxhdG9yIGlzIGRpc2FibGVkIGFuZCBWY29yZSBkb21haW4gaXMKKyAqIHBvd2VyZWQgb2ZmLiBTUkFNMSwgU1JBTTIgYW5kIHJlZ2lzdGVycyBjb250ZW50cyBhcmUgbG9zdCBleGNlcHQgZm9yCisgKiByZWdpc3RlcnMgaW4gdGhlIEJhY2t1cCBkb21haW4uIFRoZSBCT1IgaXMgbm90IGF2YWlsYWJsZS4KKyAqIEBub3RlICBUaGUgSS9PcyBjYW4gYmUgY29uZmlndXJlZCBlaXRoZXIgd2l0aCBhIHB1bGwtdXAgb3IgcHVsbC1kb3duIG9yIGNhbgorICogYmUga2VwdCBpbiBhbmFsb2cgc3RhdGUuCisgKiBAcmV0dmFsIE5vbmUKKyAqLwordm9pZCBIQUxfUFdSRXhfRW50ZXJTSFVURE9XTk1vZGUodm9pZCkgeworICAvKiBTZXQgU2h1dGRvd24gbW9kZSAqLworICBNT0RJRllfUkVHKFBXUi0+Q1IxLCBQV1JfQ1IxX0xQTVMsIFBXUl9DUjFfTFBNU19TSFVURE9XTik7CisKKyAgLyogU2V0IFNMRUVQREVFUCBiaXQgb2YgQ29ydGV4IFN5c3RlbSBDb250cm9sIFJlZ2lzdGVyICovCisgIFNFVF9CSVQoU0NCLT5TQ1IsICgodWludDMyX3QpU0NCX1NDUl9TTEVFUERFRVBfTXNrKSk7CisKKy8qIFRoaXMgb3B0aW9uIGlzIHVzZWQgdG8gZW5zdXJlIHRoYXQgc3RvcmUgb3BlcmF0aW9ucyBhcmUgY29tcGxldGVkICovCisjaWYgZGVmaW5lZChfX0NDX0FSTSkKKyAgX19mb3JjZV9zdG9yZXMoKTsKKyNlbmRpZgorICAvKiBSZXF1ZXN0IFdhaXQgRm9yIEludGVycnVwdCAqLworICBfX1dGSSgpOworfQorCisvKioKKyAqIEBicmllZiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIFBXUiBQVkQvUFZNeCBpbnRlcnJ1cHQgcmVxdWVzdC4KKyAqIEBub3RlIFRoaXMgQVBJIHNob3VsZCBiZSBjYWxsZWQgdW5kZXIgdGhlIFBWRF9QVk1fSVJRSGFuZGxlcigpLgorICogQHJldHZhbCBOb25lCisgKi8KK3ZvaWQgSEFMX1BXUkV4X1BWRF9QVk1fSVJRSGFuZGxlcih2b2lkKSB7CisgIC8qIENoZWNrIFBXUiBleHRpIGZsYWcgKi8KKyAgaWYgKF9fSEFMX1BXUl9QVkRfRVhUSV9HRVRfRkxBRygpICE9IDBVKSB7CisgICAgLyogUFdSIFBWRCBpbnRlcnJ1cHQgdXNlciBjYWxsYmFjayAqLworICAgIEhBTF9QV1JfUFZEQ2FsbGJhY2soKTsKKworICAgIC8qIENsZWFyIFBWRCBleHRpIHBlbmRpbmcgYml0ICovCisgICAgX19IQUxfUFdSX1BWRF9FWFRJX0NMRUFSX0ZMQUcoKTsKKyAgfQorICAvKiBOZXh0LCBzdWNjZXNzaXZlbHkgY2hlY2sgUFZNeCBleHRpIGZsYWdzICovCisjaWYgZGVmaW5lZChQV1JfQ1IyX1BWTUUxKQorICBpZiAoX19IQUxfUFdSX1BWTTFfRVhUSV9HRVRfRkxBRygpICE9IDBVKSB7CisgICAgLyogUFdSIFBWTTEgaW50ZXJydXB0IHVzZXIgY2FsbGJhY2sgKi8KKyAgICBIQUxfUFdSRXhfUFZNMUNhbGxiYWNrKCk7CisKKyAgICAvKiBDbGVhciBQVk0xIGV4dGkgcGVuZGluZyBiaXQgKi8KKyAgICBfX0hBTF9QV1JfUFZNMV9FWFRJX0NMRUFSX0ZMQUcoKTsKKyAgfQorI2VuZGlmIC8qIFBXUl9DUjJfUFZNRTEgKi8KKyNpZiBkZWZpbmVkKFBXUl9DUjJfUFZNRTIpCisgIGlmIChfX0hBTF9QV1JfUFZNMl9FWFRJX0dFVF9GTEFHKCkgIT0gMFUpIHsKKyAgICAvKiBQV1IgUFZNMiBpbnRlcnJ1cHQgdXNlciBjYWxsYmFjayAqLworICAgIEhBTF9QV1JFeF9QVk0yQ2FsbGJhY2soKTsKKworICAgIC8qIENsZWFyIFBWTTIgZXh0aSBwZW5kaW5nIGJpdCAqLworICAgIF9fSEFMX1BXUl9QVk0yX0VYVElfQ0xFQVJfRkxBRygpOworICB9CisjZW5kaWYgLyogUFdSX0NSMl9QVk1FMiAqLworICBpZiAoX19IQUxfUFdSX1BWTTNfRVhUSV9HRVRfRkxBRygpICE9IDBVKSB7CisgICAgLyogUFdSIFBWTTMgaW50ZXJydXB0IHVzZXIgY2FsbGJhY2sgKi8KKyAgICBIQUxfUFdSRXhfUFZNM0NhbGxiYWNrKCk7CisKKyAgICAvKiBDbGVhciBQVk0zIGV4dGkgcGVuZGluZyBiaXQgKi8KKyAgICBfX0hBTF9QV1JfUFZNM19FWFRJX0NMRUFSX0ZMQUcoKTsKKyAgfQorICBpZiAoX19IQUxfUFdSX1BWTTRfRVhUSV9HRVRfRkxBRygpICE9IDBVKSB7CisgICAgLyogUFdSIFBWTTQgaW50ZXJydXB0IHVzZXIgY2FsbGJhY2sgKi8KKyAgICBIQUxfUFdSRXhfUFZNNENhbGxiYWNrKCk7CisKKyAgICAvKiBDbGVhciBQVk00IGV4dGkgcGVuZGluZyBiaXQgKi8KKyAgICBfX0hBTF9QV1JfUFZNNF9FWFRJX0NMRUFSX0ZMQUcoKTsKKyAgfQorfQorCisjaWYgZGVmaW5lZChQV1JfQ1IyX1BWTUUxKQorLyoqCisgKiBAYnJpZWYgUFdSIFBWTTEgaW50ZXJydXB0IGNhbGxiYWNrCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX193ZWFrIHZvaWQgSEFMX1BXUkV4X1BWTTFDYWxsYmFjayh2b2lkKSB7CisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQ7IHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIEhBTF9QV1JFeF9QVk0xQ2FsbGJhY2soKSBBUEkgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisjZW5kaWYgLyogUFdSX0NSMl9QVk1FMSAqLworCisjaWYgZGVmaW5lZChQV1JfQ1IyX1BWTUUyKQorLyoqCisgKiBAYnJpZWYgUFdSIFBWTTIgaW50ZXJydXB0IGNhbGxiYWNrCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX193ZWFrIHZvaWQgSEFMX1BXUkV4X1BWTTJDYWxsYmFjayh2b2lkKSB7CisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQ7IHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIEhBTF9QV1JFeF9QVk0yQ2FsbGJhY2soKSBBUEkgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisjZW5kaWYgLyogUFdSX0NSMl9QVk1FMiAqLworCisvKioKKyAqIEBicmllZiBQV1IgUFZNMyBpbnRlcnJ1cHQgY2FsbGJhY2sKKyAqIEByZXR2YWwgTm9uZQorICovCitfX3dlYWsgdm9pZCBIQUxfUFdSRXhfUFZNM0NhbGxiYWNrKHZvaWQpIHsKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZDsgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgSEFMX1BXUkV4X1BWTTNDYWxsYmFjaygpIEFQSSBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgKiBAYnJpZWYgUFdSIFBWTTQgaW50ZXJydXB0IGNhbGxiYWNrCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX193ZWFrIHZvaWQgSEFMX1BXUkV4X1BWTTRDYWxsYmFjayh2b2lkKSB7CisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQ7IHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIEhBTF9QV1JFeF9QVk00Q2FsbGJhY2soKSBBUEkgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKyNpZiBkZWZpbmVkKFBXUl9DUjNfVUNQRF9TVERCWSkKKy8qKgorICogQGJyaWVmIEVuYWJsZSBVQ1BEIGNvbmZpZ3VyYXRpb24gbWVtb3JpemF0aW9uIGluIFN0YW5kYnkuCisgKiBAcmV0dmFsIE5vbmUKKyAqLwordm9pZCBIQUxfUFdSRXhfRW5hYmxlVUNQRFN0YW5kYnlNb2RlKHZvaWQpIHsKKyAgLyogTWVtb3JpemUgVUNQRCBjb25maWd1cmF0aW9uIHdoZW4gZW50ZXJpbmcgc3RhbmRieSBtb2RlICovCisgIFNFVF9CSVQoUFdSLT5DUjMsIFBXUl9DUjNfVUNQRF9TVERCWSk7Cit9CisKKy8qKgorICogQGJyaWVmIERpc2FibGUgVUNQRCBjb25maWd1cmF0aW9uIG1lbW9yaXphdGlvbiBpbiBTdGFuZGJ5LgorICogQG5vdGUgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgb24gZXhpdGluZyB0aGUgU3RhbmRieSBtb2RlIGFuZCBiZWZvcmUKKyAqIGFueSBVQ1BEIGNvbmZpZ3VyYXRpb24gdXBkYXRlLgorICogQHJldHZhbCBOb25lCisgKi8KK3ZvaWQgSEFMX1BXUkV4X0Rpc2FibGVVQ1BEU3RhbmRieU1vZGUodm9pZCkgeworICAvKiBXcml0ZSAwIGltbWVkaWF0ZWx5IGFmdGVyIFN0YW5kYnkgZXhpdCB3aGVuIHVzaW5nIFVDUEQsCisgICAgIGFuZCBiZWZvcmUgd3JpdGluZyBhbnkgVUNQRCByZWdpc3RlcnMgKi8KKyAgQ0xFQVJfQklUKFBXUi0+Q1IzLCBQV1JfQ1IzX1VDUERfU1REQlkpOworfQorI2VuZGlmIC8qIFBXUl9DUjNfVUNQRF9TVERCWSAqLworCisjaWYgZGVmaW5lZChQV1JfQ1IzX1VDUERfREJESVMpCisvKioKKyAqIEBicmllZiBFbmFibGUgdGhlIFVTQiBUeXBlLUMgZGVhZCBiYXR0ZXJ5IHB1bGwtZG93biBiZWhhdmlvcgorICogICAgICAgIG9uIFVDUER4X0NDMSBhbmQgVUNQRHhfQ0MyIHBpbnMKKyAqIEByZXR2YWwgTm9uZQorICovCit2b2lkIEhBTF9QV1JFeF9FbmFibGVVQ1BERGVhZEJhdHRlcnkodm9pZCkgeworICAvKiBXcml0ZSAwIHRvIGVuYWJsZSB0aGUgVVNCIFR5cGUtQyBkZWFkIGJhdHRlcnkgcHVsbC1kb3duIGJlaGF2aW9yICovCisgIENMRUFSX0JJVChQV1ItPkNSMywgUFdSX0NSM19VQ1BEX0RCRElTKTsKK30KKworLyoqCisgKiBAYnJpZWYgRGlzYWJsZSB0aGUgVVNCIFR5cGUtQyBkZWFkIGJhdHRlcnkgcHVsbC1kb3duIGJlaGF2aW9yCisgKiAgICAgICAgb24gVUNQRHhfQ0MxIGFuZCBVQ1BEeF9DQzIgcGlucworICogQG5vdGUgQWZ0ZXIgZXhpdGluZyByZXNldCwgdGhlIFVTQiBUeXBlLUMgZGVhZCBiYXR0ZXJ5IGJlaGF2aW9yIHdpbGwgYmUKKyAqIGVuYWJsZWQsIHdoaWNoIG1heSBoYXZlIGEgcHVsbC1kb3duIGVmZmVjdCBvbiBDQzEgYW5kIENDMiBwaW5zLiBJdCBpcworICogcmVjb21tZW5kZWQgdG8gZGlzYWJsZSBpdCBpbiBhbGwgY2FzZXMsIGVpdGhlciB0byBzdG9wIHRoaXMgcHVsbC1kb3duIG9yIHRvCisgKiBoYW5kIG92ZXIgY29udHJvbCB0byB0aGUgVUNQRCAod2hpY2ggc2hvdWxkIHRoZXJlZm9yZSBiZSBpbml0aWFsaXplZCBiZWZvcmUKKyAqIGRvaW5nIHRoZSBkaXNhYmxlKS4KKyAqIEByZXR2YWwgTm9uZQorICovCit2b2lkIEhBTF9QV1JFeF9EaXNhYmxlVUNQRERlYWRCYXR0ZXJ5KHZvaWQpIHsKKyAgLyogV3JpdGUgMSB0byBkaXNhYmxlIHRoZSBVU0IgVHlwZS1DIGRlYWQgYmF0dGVyeSBwdWxsLWRvd24gYmVoYXZpb3IgKi8KKyAgU0VUX0JJVChQV1ItPkNSMywgUFdSX0NSM19VQ1BEX0RCRElTKTsKK30KKyNlbmRpZiAvKiBQV1JfQ1IzX1VDUERfREJESVMgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisjZW5kaWYgLyogSEFMX1BXUl9NT0RVTEVfRU5BQkxFRCAqLworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLwpkaWZmIC0tZ2l0IGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3JjYy5jIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3JjYy5jCmluZGV4IDZhNGRmNDEuLmQ3OWRiMDcgMTAwNjQ0Ci0tLSBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9yY2MuYworKysgYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfcmNjLmMKQEAgLTEsMTM0NiArMSwxMzQ1IEBACi0vKioNCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgKiBAZmlsZSAgICBzdG0zMmc0eHhfaGFsX3JjYy5jDQotICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtDQotICAqIEBicmllZiAgIFJDQyBIQUwgbW9kdWxlIGRyaXZlci4NCi0gICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZw0KLSAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIFJlc2V0IGFuZCBDbG9jayBDb250cm9sIChSQ0MpIHBlcmlwaGVyYWw6DQotICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMNCi0gICogICAgICAgICAgICsgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucw0KLSAgKg0KLSAgQHZlcmJhdGltDQotICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgICAgICAgICAgICAgICAgICAgIyMjIyMgUkNDIHNwZWNpZmljIGZlYXR1cmVzICMjIyMjDQotICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgWy4uXQ0KLSAgICAgIEFmdGVyIHJlc2V0IHRoZSBkZXZpY2UgaXMgcnVubmluZyBmcm9tIEhpZ2ggU3BlZWQgSW50ZXJuYWwgb3NjaWxsYXRvcg0KLSAgICAgICgxNiBNSHopIHdpdGggRmxhc2ggMCB3YWl0IHN0YXRlLiBGbGFzaCBwcmVmZXRjaCBidWZmZXIsIEQtQ2FjaGUNCi0gICAgICBhbmQgSS1DYWNoZSBhcmUgZGlzYWJsZWQsIGFuZCBhbGwgcGVyaXBoZXJhbHMgYXJlIG9mZiBleGNlcHQgaW50ZXJuYWwNCi0gICAgICBTUkFNLCBGbGFzaCBhbmQgSlRBRy4NCi0NCi0gICAgICAoKykgVGhlcmUgaXMgbm8gcHJlc2NhbGVyIG9uIEhpZ2ggc3BlZWQgKEFIQnMpIGFuZCBMb3cgc3BlZWQgKEFQQnMpIGJ1c2VzOg0KLSAgICAgICAgICBhbGwgcGVyaXBoZXJhbHMgbWFwcGVkIG9uIHRoZXNlIGJ1c2VzIGFyZSBydW5uaW5nIGF0IEhTSSBzcGVlZC4NCi0gICAgICAoKykgVGhlIGNsb2NrIGZvciBhbGwgcGVyaXBoZXJhbHMgaXMgc3dpdGNoZWQgb2ZmLCBleGNlcHQgdGhlIFNSQU0gYW5kDQotICBGTEFTSC4NCi0gICAgICAoKykgQWxsIEdQSU9zIGFyZSBpbiBhbmFsb2cgbW9kZSwgZXhjZXB0IHRoZSBKVEFHIHBpbnMgd2hpY2gNCi0gICAgICAgICAgYXJlIGFzc2lnbmVkIHRvIGJlIHVzZWQgZm9yIGRlYnVnIHB1cnBvc2UuDQotDQotICAgIFsuLl0NCi0gICAgICBPbmNlIHRoZSBkZXZpY2Ugc3RhcnRlZCBmcm9tIHJlc2V0LCB0aGUgdXNlciBhcHBsaWNhdGlvbiBoYXMgdG86DQotICAgICAgKCspIENvbmZpZ3VyZSB0aGUgY2xvY2sgc291cmNlIHRvIGJlIHVzZWQgdG8gZHJpdmUgdGhlIFN5c3RlbSBjbG9jaw0KLSAgICAgICAgICAoaWYgdGhlIGFwcGxpY2F0aW9uIG5lZWRzIGhpZ2hlciBmcmVxdWVuY3kvcGVyZm9ybWFuY2UpDQotICAgICAgKCspIENvbmZpZ3VyZSB0aGUgU3lzdGVtIGNsb2NrIGZyZXF1ZW5jeSBhbmQgRmxhc2ggc2V0dGluZ3MNCi0gICAgICAoKykgQ29uZmlndXJlIHRoZSBBSEIgYW5kIEFQQiBidXNlcyBwcmVzY2FsZXJzDQotICAgICAgKCspIEVuYWJsZSB0aGUgY2xvY2sgZm9yIHRoZSBwZXJpcGhlcmFsKHMpIHRvIGJlIHVzZWQNCi0gICAgICAoKykgQ29uZmlndXJlIHRoZSBjbG9jayBzb3VyY2UocykgZm9yIHBlcmlwaGVyYWxzIHdoaWNoIGNsb2NrcyBhcmUgbm90DQotICAgICAgICAgIGRlcml2ZWQgZnJvbSB0aGUgU3lzdGVtIGNsb2NrIChVU0IsIFJORywgVVNBUlQsIExQVUFSVCwgRkRDQU4sIHNvbWUNCi0gIFRJTUVScywgVUNQRCwgSTJTLCBJMkMsIExQVElNLCBBREMsIFFTUEkpDQotDQotICBAZW5kdmVyYmF0aW0NCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgKiBAYXR0ZW50aW9uDQotICAqDQotICAqIENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuDQotICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQotICAqDQotICAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGVybXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZQ0KLSAgaW4NCi0gICogdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc29mdHdhcmUgY29tcG9uZW50Lg0KLSAgKiBJZiBubyBMSUNFTlNFIGZpbGUgY29tZXMgd2l0aCB0aGlzIHNvZnR3YXJlLCBpdCBpcyBwcm92aWRlZCBBUy1JUy4NCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgKi8NCi0NCi0vKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpbmNsdWRlICJzdG0zMmc0eHhfaGFsLmgiDQotDQotLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzR4eF9IQUxfRHJpdmVyDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFJDQyBSQ0MNCi0gKiBAYnJpZWYgUkNDIEhBTCBtb2R1bGUgZHJpdmVyDQotICogQHsNCi0gKi8NCi0NCi0jaWZkZWYgSEFMX1JDQ19NT0RVTEVfRU5BQkxFRA0KLQ0KLS8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGRlZmdyb3VwIFJDQ19Qcml2YXRlX0NvbnN0YW50cyBSQ0MgUHJpdmF0ZSBDb25zdGFudHMNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgSFNFX1RJTUVPVVRfVkFMVUUgSFNFX1NUQVJUVVBfVElNRU9VVA0KLSNkZWZpbmUgSFNJX1RJTUVPVVRfVkFMVUUgMlUgICAgICAgICAgICAvKiAyIG1zIChtaW5pbXVtIFRpY2sgKyAxKSAqLw0KLSNkZWZpbmUgTFNJX1RJTUVPVVRfVkFMVUUgMlUgICAgICAgICAgICAvKiAyIG1zIChtaW5pbXVtIFRpY2sgKyAxKSAqLw0KLSNkZWZpbmUgSFNJNDhfVElNRU9VVF9WQUxVRSAyVSAgICAgICAgICAvKiAyIG1zIChtaW5pbXVtIFRpY2sgKyAxKSAqLw0KLSNkZWZpbmUgUExMX1RJTUVPVVRfVkFMVUUgMlUgICAgICAgICAgICAvKiAyIG1zIChtaW5pbXVtIFRpY2sgKyAxKSAqLw0KLSNkZWZpbmUgQ0xPQ0tTV0lUQ0hfVElNRU9VVF9WQUxVRSA1MDAwVSAvKiA1IHMgICAgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBkZWZncm91cCBSQ0NfUHJpdmF0ZV9NYWNyb3MgUkNDIFByaXZhdGUgTWFjcm9zDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFJDQ19HRVRfTUNPX0dQSU9fUElOKF9fUkNDX01DT3hfXykgKChfX1JDQ19NQ094X18pICYgR1BJT19QSU5fTUFTSykNCi0NCi0jZGVmaW5lIFJDQ19HRVRfTUNPX0dQSU9fQUYoX19SQ0NfTUNPeF9fKSBcDQotICAoKChfX1JDQ19NQ094X18pICYgUkNDX01DT19HUElPQUZfTUFTSykgPj4gUkNDX01DT19HUElPQUZfUE9TKQ0KLQ0KLSNkZWZpbmUgUkNDX0dFVF9NQ09fR1BJT19JTkRFWChfX1JDQ19NQ094X18pIFwNCi0gICgoKF9fUkNDX01DT3hfXykgJiBSQ0NfTUNPX0dQSU9QT1JUX01BU0spID4+IFJDQ19NQ09fR1BJT1BPUlRfUE9TKQ0KLQ0KLSNkZWZpbmUgUkNDX0dFVF9NQ09fR1BJT19QT1JUKF9fUkNDX01DT3hfXykgXA0KLSAgKEFIQjJQRVJJUEhfQkFTRSArICgoMHgwMDAwMDQwMFVMKSAqIFJDQ19HRVRfTUNPX0dQSU9fSU5ERVgoX19SQ0NfTUNPeF9fKSkpDQotDQotI2RlZmluZSBSQ0NfUExMX09TQ1NPVVJDRV9DT05GSUcoX19IQUxfUkNDX1BMTFNPVVJDRV9fKSBcDQotICAoTU9ESUZZX1JFRyhSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTFNSQywgKF9fSEFMX1JDQ19QTExTT1VSQ0VfXykpKQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0NCi0vKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgUkNDX1ByaXZhdGVfRnVuY3Rpb25zIFJDQyBQcml2YXRlIEZ1bmN0aW9ucw0KLSAqIEB7DQotICovDQotc3RhdGljIHVpbnQzMl90IFJDQ19HZXRTeXNDbG9ja0ZyZXFGcm9tUExMU291cmNlKHZvaWQpOw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0NCi0vKiogQGRlZmdyb3VwIFJDQ19FeHBvcnRlZF9GdW5jdGlvbnMgUkNDIEV4cG9ydGVkIEZ1bmN0aW9ucw0KLSAqIEB7DQotICovDQotDQotLyoqIEBkZWZncm91cCBSQ0NfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24NCi0gZnVuY3Rpb25zDQotICAqICBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zDQotICAqDQotICBAdmVyYmF0aW0NCi0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAjIyMjIw0KLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgIFsuLl0NCi0gICAgICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGNvbmZpZ3VyZSB0aGUgaW50ZXJuYWwgYW5kDQotIGV4dGVybmFsIG9zY2lsbGF0b3JzIChIU0UsIEhTSSwgTFNFLCBMU0ksIFBMTCwgQ1NTIGFuZCBNQ08pIGFuZCB0aGUgU3lzdGVtDQotIGJ1c2VzIGNsb2NrcyAoU1lTQ0xLLCBBSEIsIEFQQjEgYW5kIEFQQjIpLg0KLQ0KLSAgICBbLi5dIEludGVybmFsL2V4dGVybmFsIGNsb2NrIGFuZCBQTEwgY29uZmlndXJhdGlvbg0KLSAgICAgICAgICgrKSBIU0kgKGhpZ2gtc3BlZWQgaW50ZXJuYWwpOiAxNiBNSHogZmFjdG9yeS10cmltbWVkIFJDIHVzZWQgZGlyZWN0bHkNCi0gb3IgdGhyb3VnaCB0aGUgUExMIGFzIFN5c3RlbSBjbG9jayBzb3VyY2UuDQotDQotICAgICAgICAgKCspIExTSSAobG93LXNwZWVkIGludGVybmFsKTogMzIgS0h6IGxvdyBjb25zdW1wdGlvbiBSQyB1c2VkIGFzIElXREcNCi0gYW5kL29yIFJUQyBjbG9jayBzb3VyY2UuDQotDQotICAgICAgICAgKCspIEhTRSAoaGlnaC1zcGVlZCBleHRlcm5hbCk6IDQgdG8gNDggTUh6IGNyeXN0YWwgb3NjaWxsYXRvciB1c2VkDQotIGRpcmVjdGx5IG9yIHRocm91Z2ggdGhlIFBMTCBhcyBTeXN0ZW0gY2xvY2sgc291cmNlLiBDYW4gYmUgdXNlZCBhbHNvIG9wdGlvbmFsbHkNCi0gYXMgUlRDIGNsb2NrIHNvdXJjZS4NCi0NCi0gICAgICAgICAoKykgTFNFIChsb3ctc3BlZWQgZXh0ZXJuYWwpOiAzMi43NjggS0h6IG9zY2lsbGF0b3IgdXNlZCBvcHRpb25hbGx5IGFzDQotIFJUQyBjbG9jayBzb3VyY2UuDQotDQotICAgICAgICAgKCspIFBMTCAoY2xvY2tlZCBieSBIU0ksIEhTRSkgcHJvdmlkaW5nIHVwIHRvIHRocmVlIGluZGVwZW5kZW50IG91dHB1dA0KLSBjbG9ja3M6DQotICAgICAgICAgICAoKyspIFRoZSBmaXJzdCBvdXRwdXQgaXMgdXNlZCB0byBnZW5lcmF0ZSB0aGUgaGlnaCBzcGVlZCBzeXN0ZW0gY2xvY2sNCi0gKHVwIHRvIDE3MCBNSHopLg0KLSAgICAgICAgICAgKCsrKSBUaGUgc2Vjb25kIG91dHB1dCBpcyB1c2VkIHRvIGdlbmVyYXRlIHRoZSBjbG9jayBmb3IgdGhlIFVTQiAoNDgNCi0gTUh6KSwgdGhlIFFTUEkgKDw9IDQ4IE1IeiksIHRoZSBGRENBTiwgdGhlIFNBSSBhbmQgdGhlIEkyUy4NCi0gICAgICAgICAgICgrKykgVGhlIHRoaXJkIG91dHB1dCBpcyB1c2VkIHRvIGdlbmVyYXRlIGEgY2xvY2sgZm9yIEFEQw0KLQ0KLSAgICAgICAgICgrKSBDU1MgKENsb2NrIHNlY3VyaXR5IHN5c3RlbSk6IG9uY2UgZW5hYmxlZCwgaWYgYSBIU0UgY2xvY2sgZmFpbHVyZQ0KLSBvY2N1cnMgKEhTRSB1c2VkIGRpcmVjdGx5IG9yIHRocm91Z2ggUExMIGFzIFN5c3RlbSBjbG9jayBzb3VyY2UpLCB0aGUgU3lzdGVtDQotIGNsb2NrIGlzIGF1dG9tYXRpY2FsbHkgc3dpdGNoZWQgdG8gSFNJIGFuZCBhbiBpbnRlcnJ1cHQgaXMgZ2VuZXJhdGVkIGlmDQotIGVuYWJsZWQuIFRoZSBpbnRlcnJ1cHQgaXMgbGlua2VkIHRvIHRoZSBDb3J0ZXgtTTQgTk1JIChOb24tTWFza2FibGUgSW50ZXJydXB0KQ0KLSAgICAgICAgICAgICBleGNlcHRpb24gdmVjdG9yLg0KLQ0KLSAgICAgICAgICgrKSBNQ08gKG1pY3JvY29udHJvbGxlciBjbG9jayBvdXRwdXQpOiB1c2VkIHRvIG91dHB1dCBMU0ksIEhTSSwgTFNFLA0KLSBIU0UsIG1haW4gUExMIGNsb2NrLCBzeXN0ZW0gY2xvY2sgb3IgUkM0OCBjbG9jayAodGhyb3VnaCBhIGNvbmZpZ3VyYWJsZQ0KLSBwcmVzY2FsZXIpIG9uIFBBOCBwaW4uDQotDQotICAgIFsuLl0gU3lzdGVtLCBBSEIgYW5kIEFQQiBidXNlcyBjbG9ja3MgY29uZmlndXJhdGlvbg0KLSAgICAgICAgICgrKSBTZXZlcmFsIGNsb2NrIHNvdXJjZXMgY2FuIGJlIHVzZWQgdG8gZHJpdmUgdGhlIFN5c3RlbSBjbG9jaw0KLSAoU1lTQ0xLKTogSFNJLCBIU0UgYW5kIG1haW4gUExMLiBUaGUgQUhCIGNsb2NrIChIQ0xLKSBpcyBkZXJpdmVkIGZyb20gU3lzdGVtDQotIGNsb2NrIHRocm91Z2ggY29uZmlndXJhYmxlIHByZXNjYWxlciBhbmQgdXNlZCB0byBjbG9jayB0aGUgQ1BVLCBtZW1vcnkgYW5kDQotIHBlcmlwaGVyYWxzIG1hcHBlZCBvbiBBSEIgYnVzIChETUEsIEdQSU8uLi4pLiBBUEIxIChQQ0xLMSkgYW5kIEFQQjIgKFBDTEsyKQ0KLSBjbG9ja3MgYXJlIGRlcml2ZWQgZnJvbSBBSEIgY2xvY2sgdGhyb3VnaCBjb25maWd1cmFibGUgcHJlc2NhbGVycyBhbmQgdXNlZCB0bw0KLSBjbG9jayB0aGUgcGVyaXBoZXJhbHMgbWFwcGVkIG9uIHRoZXNlIGJ1c2VzLiBZb3UgY2FuIHVzZQ0KLSAgICAgICAgICAgICAiSEFMX1JDQ19HZXRTeXNDbG9ja0ZyZXEoKSIgZnVuY3Rpb24gdG8gcmV0cmlldmUgdGhlIGZyZXF1ZW5jaWVzIG9mDQotIHRoZXNlIGNsb2Nrcy4NCi0NCi0gICAgICAgICAtQC0gQWxsIHRoZSBwZXJpcGhlcmFsIGNsb2NrcyBhcmUgZGVyaXZlZCBmcm9tIHRoZSBTeXN0ZW0gY2xvY2sNCi0gKFNZU0NMSykgZXhjZXB0Og0KLQ0KLSAgICAgICAgICAgKCtAKSBSVEM6IHRoZSBSVEMgY2xvY2sgY2FuIGJlIGRlcml2ZWQgZWl0aGVyIGZyb20gdGhlIExTSSwgTFNFIG9yDQotIEhTRSBjbG9jayBkaXZpZGVkIGJ5IDIgdG8gMzEuIFlvdSBoYXZlIHRvIHVzZSBfX0hBTF9SQ0NfUlRDX0VOQUJMRSgpIGFuZA0KLSBIQUxfUkNDRXhfUGVyaXBoQ0xLQ29uZmlnKCkgZnVuY3Rpb24gdG8gY29uZmlndXJlIHRoaXMgY2xvY2suDQotICAgICAgICAgICAoK0ApIFVTQiBGUyBhbmQgUk5HOiBVU0IgRlMgcmVxdWlyZXMgYSBmcmVxdWVuY3kgZXF1YWwgdG8gNDggTUh6DQotICAgICAgICAgICAgICAgIHRvIHdvcmsgY29ycmVjdGx5LCB3aGlsZSB0aGUgUk5HIHBlcmlwaGVyYWwgcmVxdWlyZXMgYSBmcmVxdWVuY3kNCi0gICAgICAgICAgICAgICAgZXF1YWwgb3IgbG93ZXIgdGhhbiB0byA0OCBNSHouIFRoaXMgY2xvY2sgaXMgZGVyaXZlZCBvZiB0aGUgbWFpbg0KLSBQTEwgdGhyb3VnaCBQTExRIGRpdmlkZXIuIFlvdSBoYXZlIHRvIGVuYWJsZSB0aGUgcGVyaXBoZXJhbCBjbG9jayBhbmQgdXNlDQotICAgICAgICAgICAgICAgIEhBTF9SQ0NFeF9QZXJpcGhDTEtDb25maWcoKSBmdW5jdGlvbiB0byBjb25maWd1cmUgdGhpcyBjbG9jay4NCi0gICAgICAgICAgICgrQCkgSVdERyBjbG9jayB3aGljaCBpcyBhbHdheXMgdGhlIExTSSBjbG9jay4NCi0NCi0NCi0gICAgICAgICAoKykgVGhlIG1heGltdW0gZnJlcXVlbmN5IG9mIHRoZSBTWVNDTEssIEhDTEssIFBDTEsxIGFuZCBQQ0xLMiBpcyAxNzANCi0gTUh6LiBUaGUgY2xvY2sgc291cmNlIGZyZXF1ZW5jeSBzaG91bGQgYmUgYWRhcHRlZCBkZXBlbmRpbmcgb24gdGhlIGRldmljZQ0KLSB2b2x0YWdlIHJhbmdlIGFzIGxpc3RlZCBpbiB0aGUgUmVmZXJlbmNlIE1hbnVhbCAiQ2xvY2sgc291cmNlIGZyZXF1ZW5jeSB2ZXJzdXMNCi0gdm9sdGFnZSBzY2FsaW5nIiBjaGFwdGVyLg0KLQ0KLSAgQGVuZHZlcmJhdGltDQotDQotICAgICAgICAgICBUYWJsZSAxLiBIQ0xLIGNsb2NrIGZyZXF1ZW5jeSBmb3IgU1RNMzJHNHh4IGRldmljZXMNCi0gICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KLSAgICAgICAgICAgfCBMYXRlbmN5ICAgICAgICAgfCAgICAgICAgICAgIEhDTEsgY2xvY2sgZnJlcXVlbmN5IChNSHopIHwgfA0KLSB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgfCB8ICB2b2x0YWdlIHJhbmdlDQotIDEgIHwgIHZvbHRhZ2UgcmFuZ2UgMSAgfCB2b2x0YWdlIHJhbmdlIDIgIHwgfCAgICAgICAgICAgICAgICAgfCBib29zdCBtb2RlIDEuMjgNCi0gViB8IG5vcm1hbCBtb2RlIDEuMiBWIHwgICAgIDEuMCBWICAgICAgICB8DQotICAgICAgICAgICB8LS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLXwNCi0gICAgICAgICAgIHwwV1MoMSBDUFUgY3ljbGVzKXwgICAgSENMSyA8PSAzNCAgICAgfCAgICBIQ0xLIDw9IDMwICAgICB8ICAgIEhDTEsNCi0gPD0gMTMgICAgfA0KLSAgICAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS18DQotICAgICAgICAgICB8MVdTKDIgQ1BVIGN5Y2xlcyl8ICAgIEhDTEsgPD0gNjggICAgIHwgICAgSENMSyA8PSA2MCAgICAgfCAgICBIQ0xLDQotIDw9IDI2ICAgIHwNCi0gICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tfA0KLSAgICAgICAgICAgfDJXUygzIENQVSBjeWNsZXMpfCAgICBIQ0xLIDw9IDEwMiAgICB8ICAgIEhDTEsgPD0gOTAgICAgIHwgICAgICAgIC0NCi0gfA0KLSAgICAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS18DQotICAgICAgICAgICB8M1dTKDQgQ1BVIGN5Y2xlcyl8ICAgIEhDTEsgPD0gMTM2ICAgIHwgICAgSENMSyA8PSAxMjAgICAgfCAgICAgICAgLQ0KLSB8DQotICAgICAgICAgICB8LS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLXwNCi0gICAgICAgICAgIHw0V1MoNSBDUFUgY3ljbGVzKXwgICAgSENMSyA8PSAxNzAgICAgfCAgICBIQ0xLIDw9IDE1MCAgICB8ICAgICAgICAtDQotIHwNCi0gICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KLQ0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJlc2V0IHRoZSBSQ0MgY2xvY2sgY29uZmlndXJhdGlvbiB0byB0aGUgZGVmYXVsdCByZXNldCBzdGF0ZS4NCi0gKiBAbm90ZSAgIFRoZSBkZWZhdWx0IHJlc2V0IHN0YXRlIG9mIHRoZSBjbG9jayBjb25maWd1cmF0aW9uIGlzIGdpdmVuIGJlbG93Og0KLSAqICAgICAgICAgICAgLSBIU0kgT04gYW5kIHVzZWQgYXMgc3lzdGVtIGNsb2NrIHNvdXJjZQ0KLSAqICAgICAgICAgICAgLSBIU0UsIFBMTCBPRkYNCi0gKiAgICAgICAgICAgIC0gQUhCLCBBUEIxIGFuZCBBUEIyIHByZXNjYWxlciBzZXQgdG8gMS4NCi0gKiAgICAgICAgICAgIC0gQ1NTLCBNQ08xIE9GRg0KLSAqICAgICAgICAgICAgLSBBbGwgaW50ZXJydXB0cyBkaXNhYmxlZA0KLSAqICAgICAgICAgICAgLSBBbGwgaW50ZXJydXB0IGFuZCByZXNldCBmbGFncyBjbGVhcmVkDQotICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgbW9kaWZ5IHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZQ0KLSAqICAgICAgICAgICAgLSBQZXJpcGhlcmFsIGNsb2Nrcw0KLSAqICAgICAgICAgICAgLSBMU0ksIExTRSBhbmQgUlRDIGNsb2Nrcw0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9SQ0NfRGVJbml0KHZvaWQpIHsNCi0gIHVpbnQzMl90IHRpY2tzdGFydDsNCi0NCi0gIC8qIEdldCBTdGFydCBUaWNrKi8NCi0gIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7DQotDQotICAvKiBTZXQgSFNJT04gYml0IHRvIHRoZSByZXNldCB2YWx1ZSAqLw0KLSAgU0VUX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJT04pOw0KLQ0KLSAgLyogV2FpdCB0aWxsIEhTSSBpcyByZWFkeSAqLw0KLSAgd2hpbGUgKFJFQURfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0lSRFkpID09IDBVKSB7DQotICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBIU0lfVElNRU9VVF9WQUxVRSkgew0KLSAgICAgIHJldHVybiBIQUxfVElNRU9VVDsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgLyogU2V0IEhTSVRSSU1bNjowXSBiaXRzIHRvIHRoZSByZXNldCB2YWx1ZSAqLw0KLSAgU0VUX0JJVChSQ0MtPklDU0NSLCBSQ0NfSFNJQ0FMSUJSQVRJT05fREVGQVVMVCA8PCBSQ0NfSUNTQ1JfSFNJVFJJTV9Qb3MpOw0KLQ0KLSAgLyogR2V0IFN0YXJ0IFRpY2sqLw0KLSAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsNCi0NCi0gIC8qIFJlc2V0IENGR1IgcmVnaXN0ZXIgKEhTSSBpcyBzZWxlY3RlZCBhcyBzeXN0ZW0gY2xvY2sgc291cmNlKSAqLw0KLSAgUkNDLT5DRkdSID0gMHgwMDAwMDAwMXU7DQotDQotICAvKiBXYWl0IHRpbGwgSFNJIGlzIHJlYWR5ICovDQotICB3aGlsZSAoUkVBRF9CSVQoUkNDLT5DRkdSLCBSQ0NfQ0ZHUl9TV1MpICE9IFJDQ19DRkdSX1NXU19IU0kpIHsNCi0gICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IENMT0NLU1dJVENIX1RJTUVPVVRfVkFMVUUpIHsNCi0gICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7DQotICAgIH0NCi0gIH0NCi0NCi0gIC8qIFVwZGF0ZSB0aGUgU3lzdGVtQ29yZUNsb2NrIGdsb2JhbCB2YXJpYWJsZSAqLw0KLSAgU3lzdGVtQ29yZUNsb2NrID0gSFNJX1ZBTFVFOw0KLQ0KLSAgLyogQWRhcHQgU3lzdGljayBpbnRlcnJ1cHQgcGVyaW9kICovDQotICBpZiAoSEFMX0luaXRUaWNrKHV3VGlja1ByaW8pICE9IEhBTF9PSykgew0KLSAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgfQ0KLQ0KLSAgLyogQ2xlYXIgQ1IgcmVnaXN0ZXIgaW4gMiBzdGVwczogZmlyc3QgdG8gY2xlYXIgSFNFT04gaW4gY2FzZSBieXBhc3Mgd2FzDQotICAgKiBlbmFibGVkICovDQotICBSQ0MtPkNSID0gUkNDX0NSX0hTSU9OOw0KLQ0KLSAgLyogVGhlbiBhZ2FpbiB0byBIU0VCWVAgaW4gY2FzZSBieXBhc3Mgd2FzIGVuYWJsZWQgKi8NCi0gIFJDQy0+Q1IgPSBSQ0NfQ1JfSFNJT047DQotDQotICAvKiBHZXQgU3RhcnQgVGljayovDQotICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOw0KLQ0KLSAgLyogV2FpdCB0aWxsIFBMTCBpcyBPRkYgKi8NCi0gIHdoaWxlIChSRUFEX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfUExMUkRZKSAhPSAwVSkgew0KLSAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gUExMX1RJTUVPVVRfVkFMVUUpIHsNCi0gICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7DQotICAgIH0NCi0gIH0NCi0NCi0gIC8qIG9uY2UgUExMIGlzIE9GRiwgcmVzZXQgUExMQ0ZHUiByZWdpc3RlciB0byBkZWZhdWx0IHZhbHVlICovDQotICBSQ0MtPlBMTENGR1IgPSBSQ0NfUExMQ0ZHUl9QTExOXzQ7DQotDQotICAvKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovDQotICBDTEVBUl9SRUcoUkNDLT5DSUVSKTsNCi0NCi0gIC8qIENsZWFyIGFsbCBpbnRlcnJ1cHQgZmxhZ3MgKi8NCi0gIFdSSVRFX1JFRyhSQ0MtPkNJQ1IsIDB4RkZGRkZGRkZVKTsNCi0NCi0gIC8qIENsZWFyIGFsbCByZXNldCBmbGFncyAqLw0KLSAgU0VUX0JJVChSQ0MtPkNTUiwgUkNDX0NTUl9STVZGKTsNCi0NCi0gIHJldHVybiBIQUxfT0s7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgUkNDIE9zY2lsbGF0b3JzIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMNCi0gKiBpbiB0aGUgUkNDX09zY0luaXRUeXBlRGVmLg0KLSAqIEBwYXJhbSAgUkNDX09zY0luaXRTdHJ1Y3QgIHBvaW50ZXIgdG8gYW4gUkNDX09zY0luaXRUeXBlRGVmIHN0cnVjdHVyZSB0aGF0DQotICogICAgICAgICBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIFJDQyBPc2NpbGxhdG9ycy4NCi0gKiBAbm90ZSAgIFRoZSBQTEwgaXMgbm90IGRpc2FibGVkIHdoZW4gdXNlZCBhcyBzeXN0ZW0gY2xvY2suDQotICogQG5vdGUgICBUcmFuc2l0aW9ucyBMU0UgQnlwYXNzIHRvIExTRSBPbiBhbmQgTFNFIE9uIHRvIExTRSBCeXBhc3MgYXJlIG5vdA0KLSAqICAgICAgICAgc3VwcG9ydGVkIGJ5IHRoaXMgbWFjcm8uIFVzZXIgc2hvdWxkIHJlcXVlc3QgYSB0cmFuc2l0aW9uIHRvIExTRSBPZmYNCi0gKiAgICAgICAgIGZpcnN0IGFuZCB0aGVuIExTRSBPbiBvciBMU0UgQnlwYXNzLg0KLSAqIEBub3RlICAgVHJhbnNpdGlvbiBIU0UgQnlwYXNzIHRvIEhTRSBPbiBhbmQgSFNFIE9uIHRvIEhTRSBCeXBhc3MgYXJlIG5vdA0KLSAqICAgICAgICAgc3VwcG9ydGVkIGJ5IHRoaXMgbWFjcm8uIFVzZXIgc2hvdWxkIHJlcXVlc3QgYSB0cmFuc2l0aW9uIHRvIEhTRSBPZmYNCi0gKiAgICAgICAgIGZpcnN0IGFuZCB0aGVuIEhTRSBPbiBvciBIU0UgQnlwYXNzLg0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9SQ0NfT3NjQ29uZmlnKFJDQ19Pc2NJbml0VHlwZURlZiAqUkNDX09zY0luaXRTdHJ1Y3QpIHsNCi0gIHVpbnQzMl90IHRpY2tzdGFydDsNCi0gIHVpbnQzMl90IHRlbXBfc3lzY2xrc3JjOw0KLSAgdWludDMyX3QgdGVtcF9wbGxja2NmZzsNCi0NCi0gIC8qIENoZWNrIE51bGwgcG9pbnRlciAqLw0KLSAgaWYgKFJDQ19Pc2NJbml0U3RydWN0ID09IE5VTEwpIHsNCi0gICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gIH0NCi0NCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfUkNDX09TQ0lMTEFUT1JUWVBFKFJDQ19Pc2NJbml0U3RydWN0LT5Pc2NpbGxhdG9yVHlwZSkpOw0KLQ0KLSAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEhTRSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotICBpZiAoKChSQ0NfT3NjSW5pdFN0cnVjdC0+T3NjaWxsYXRvclR5cGUpICYgUkNDX09TQ0lMTEFUT1JUWVBFX0hTRSkgPT0NCi0gICAgICBSQ0NfT1NDSUxMQVRPUlRZUEVfSFNFKSB7DQotICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICAgIGFzc2VydF9wYXJhbShJU19SQ0NfSFNFKFJDQ19Pc2NJbml0U3RydWN0LT5IU0VTdGF0ZSkpOw0KLQ0KLSAgICB0ZW1wX3N5c2Nsa3NyYyA9IF9fSEFMX1JDQ19HRVRfU1lTQ0xLX1NPVVJDRSgpOw0KLSAgICB0ZW1wX3BsbGNrY2ZnID0gX19IQUxfUkNDX0dFVF9QTExfT1NDU09VUkNFKCk7DQotDQotICAgIC8qIFdoZW4gdGhlIEhTRSBpcyB1c2VkIGFzIHN5c3RlbSBjbG9jayBvciBjbG9jayBzb3VyY2UgZm9yIFBMTCBpbiB0aGVzZQ0KLSAgICAgKiBjYXNlcyBpdCBpcyBub3QgYWxsb3dlZCB0byBiZSBkaXNhYmxlZCAqLw0KLSAgICBpZiAoKCh0ZW1wX3N5c2Nsa3NyYyA9PSBSQ0NfQ0ZHUl9TV1NfUExMKSAmJg0KLSAgICAgICAgICh0ZW1wX3BsbGNrY2ZnID09IFJDQ19QTExTT1VSQ0VfSFNFKSkgfHwNCi0gICAgICAgICh0ZW1wX3N5c2Nsa3NyYyA9PSBSQ0NfQ0ZHUl9TV1NfSFNFKSkgew0KLSAgICAgIGlmICgoUkVBRF9CSVQoUkNDLT5DUiwgUkNDX0NSX0hTRVJEWSkgIT0gMFUpICYmDQotICAgICAgICAgIChSQ0NfT3NjSW5pdFN0cnVjdC0+SFNFU3RhdGUgPT0gUkNDX0hTRV9PRkYpKSB7DQotICAgICAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICAvKiBTZXQgdGhlIG5ldyBIU0UgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSAgICAgIF9fSEFMX1JDQ19IU0VfQ09ORklHKFJDQ19Pc2NJbml0U3RydWN0LT5IU0VTdGF0ZSk7DQotDQotICAgICAgLyogQ2hlY2sgdGhlIEhTRSBTdGF0ZSAqLw0KLSAgICAgIGlmIChSQ0NfT3NjSW5pdFN0cnVjdC0+SFNFU3RhdGUgIT0gUkNDX0hTRV9PRkYpIHsNCi0gICAgICAgIC8qIEdldCBTdGFydCBUaWNrKi8NCi0gICAgICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7DQotDQotICAgICAgICAvKiBXYWl0IHRpbGwgSFNFIGlzIHJlYWR5ICovDQotICAgICAgICB3aGlsZSAoUkVBRF9CSVQoUkNDLT5DUiwgUkNDX0NSX0hTRVJEWSkgPT0gMFUpIHsNCi0gICAgICAgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IEhTRV9USU1FT1VUX1ZBTFVFKSB7DQotICAgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgIC8qIEdldCBTdGFydCBUaWNrKi8NCi0gICAgICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7DQotDQotICAgICAgICAvKiBXYWl0IHRpbGwgSFNFIGlzIGRpc2FibGVkICovDQotICAgICAgICB3aGlsZSAoUkVBRF9CSVQoUkNDLT5DUiwgUkNDX0NSX0hTRVJEWSkgIT0gMFUpIHsNCi0gICAgICAgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IEhTRV9USU1FT1VUX1ZBTFVFKSB7DQotICAgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgfQ0KLSAgICB9DQotICB9DQotICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEhTSSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0gIGlmICgoKFJDQ19Pc2NJbml0U3RydWN0LT5Pc2NpbGxhdG9yVHlwZSkgJiBSQ0NfT1NDSUxMQVRPUlRZUEVfSFNJKSA9PQ0KLSAgICAgIFJDQ19PU0NJTExBVE9SVFlQRV9IU0kpIHsNCi0gICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19IU0koUkNDX09zY0luaXRTdHJ1Y3QtPkhTSVN0YXRlKSk7DQotICAgIGFzc2VydF9wYXJhbSgNCi0gICAgICAgIElTX1JDQ19IU0lfQ0FMSUJSQVRJT05fVkFMVUUoUkNDX09zY0luaXRTdHJ1Y3QtPkhTSUNhbGlicmF0aW9uVmFsdWUpKTsNCi0NCi0gICAgLyogQ2hlY2sgaWYgSFNJIGlzIHVzZWQgYXMgc3lzdGVtIGNsb2NrIG9yIGFzIFBMTCBzb3VyY2Ugd2hlbiBQTEwgaXMNCi0gICAgICogc2VsZWN0ZWQgYXMgc3lzdGVtIGNsb2NrICovDQotICAgIHRlbXBfc3lzY2xrc3JjID0gX19IQUxfUkNDX0dFVF9TWVNDTEtfU09VUkNFKCk7DQotICAgIHRlbXBfcGxsY2tjZmcgPSBfX0hBTF9SQ0NfR0VUX1BMTF9PU0NTT1VSQ0UoKTsNCi0gICAgaWYgKCgodGVtcF9zeXNjbGtzcmMgPT0gUkNDX0NGR1JfU1dTX1BMTCkgJiYNCi0gICAgICAgICAodGVtcF9wbGxja2NmZyA9PSBSQ0NfUExMU09VUkNFX0hTSSkpIHx8DQotICAgICAgICAodGVtcF9zeXNjbGtzcmMgPT0gUkNDX0NGR1JfU1dTX0hTSSkpIHsNCi0gICAgICAvKiBXaGVuIEhTSSBpcyB1c2VkIGFzIHN5c3RlbSBjbG9jayBpdCB3aWxsIG5vdCBiZSBkaXNhYmxlZCAqLw0KLSAgICAgIGlmICgoUkVBRF9CSVQoUkNDLT5DUiwgUkNDX0NSX0hTSVJEWSkgIT0gMFUpICYmDQotICAgICAgICAgIChSQ0NfT3NjSW5pdFN0cnVjdC0+SFNJU3RhdGUgPT0gUkNDX0hTSV9PRkYpKSB7DQotICAgICAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgICAgIH0NCi0gICAgICAvKiBPdGhlcndpc2UsIGp1c3QgdGhlIGNhbGlicmF0aW9uIGlzIGFsbG93ZWQgKi8NCi0gICAgICBlbHNlIHsNCi0gICAgICAgIC8qIEFkanVzdHMgdGhlIEludGVybmFsIEhpZ2ggU3BlZWQgb3NjaWxsYXRvciAoSFNJKSBjYWxpYnJhdGlvbiB2YWx1ZS4qLw0KLSAgICAgICAgX19IQUxfUkNDX0hTSV9DQUxJQlJBVElPTlZBTFVFX0FESlVTVCgNCi0gICAgICAgICAgICBSQ0NfT3NjSW5pdFN0cnVjdC0+SFNJQ2FsaWJyYXRpb25WYWx1ZSk7DQotDQotICAgICAgICAvKiBBZGFwdCBTeXN0aWNrIGludGVycnVwdCBwZXJpb2QgKi8NCi0gICAgICAgIGlmIChIQUxfSW5pdFRpY2sodXdUaWNrUHJpbykgIT0gSEFMX09LKSB7DQotICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7DQotICAgICAgICB9DQotICAgICAgfQ0KLSAgICB9IGVsc2Ugew0KLSAgICAgIC8qIENoZWNrIHRoZSBIU0kgU3RhdGUgKi8NCi0gICAgICBpZiAoUkNDX09zY0luaXRTdHJ1Y3QtPkhTSVN0YXRlICE9IFJDQ19IU0lfT0ZGKSB7DQotICAgICAgICAvKiBFbmFibGUgdGhlIEludGVybmFsIEhpZ2ggU3BlZWQgb3NjaWxsYXRvciAoSFNJKS4gKi8NCi0gICAgICAgIF9fSEFMX1JDQ19IU0lfRU5BQkxFKCk7DQotDQotICAgICAgICAvKiBHZXQgU3RhcnQgVGljayovDQotICAgICAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOw0KLQ0KLSAgICAgICAgLyogV2FpdCB0aWxsIEhTSSBpcyByZWFkeSAqLw0KLSAgICAgICAgd2hpbGUgKFJFQURfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0lSRFkpID09IDBVKSB7DQotICAgICAgICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBIU0lfVElNRU9VVF9WQUxVRSkgew0KLSAgICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyogQWRqdXN0cyB0aGUgSW50ZXJuYWwgSGlnaCBTcGVlZCBvc2NpbGxhdG9yIChIU0kpIGNhbGlicmF0aW9uIHZhbHVlLiovDQotICAgICAgICBfX0hBTF9SQ0NfSFNJX0NBTElCUkFUSU9OVkFMVUVfQURKVVNUKA0KLSAgICAgICAgICAgIFJDQ19Pc2NJbml0U3RydWN0LT5IU0lDYWxpYnJhdGlvblZhbHVlKTsNCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgLyogRGlzYWJsZSB0aGUgSW50ZXJuYWwgSGlnaCBTcGVlZCBvc2NpbGxhdG9yIChIU0kpLiAqLw0KLSAgICAgICAgX19IQUxfUkNDX0hTSV9ESVNBQkxFKCk7DQotDQotICAgICAgICAvKiBHZXQgU3RhcnQgVGljayovDQotICAgICAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOw0KLQ0KLSAgICAgICAgLyogV2FpdCB0aWxsIEhTSSBpcyBkaXNhYmxlZCAqLw0KLSAgICAgICAgd2hpbGUgKFJFQURfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0lSRFkpICE9IDBVKSB7DQotICAgICAgICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBIU0lfVElNRU9VVF9WQUxVRSkgew0KLSAgICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0gICAgfQ0KLSAgfQ0KLSAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTFNJIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotICBpZiAoKChSQ0NfT3NjSW5pdFN0cnVjdC0+T3NjaWxsYXRvclR5cGUpICYgUkNDX09TQ0lMTEFUT1JUWVBFX0xTSSkgPT0NCi0gICAgICBSQ0NfT1NDSUxMQVRPUlRZUEVfTFNJKSB7DQotICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICAgIGFzc2VydF9wYXJhbShJU19SQ0NfTFNJKFJDQ19Pc2NJbml0U3RydWN0LT5MU0lTdGF0ZSkpOw0KLQ0KLSAgICAvKiBDaGVjayB0aGUgTFNJIFN0YXRlICovDQotICAgIGlmIChSQ0NfT3NjSW5pdFN0cnVjdC0+TFNJU3RhdGUgIT0gUkNDX0xTSV9PRkYpIHsNCi0gICAgICAvKiBFbmFibGUgdGhlIEludGVybmFsIExvdyBTcGVlZCBvc2NpbGxhdG9yIChMU0kpLiAqLw0KLSAgICAgIF9fSEFMX1JDQ19MU0lfRU5BQkxFKCk7DQotDQotICAgICAgLyogR2V0IFN0YXJ0IFRpY2sqLw0KLSAgICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7DQotDQotICAgICAgLyogV2FpdCB0aWxsIExTSSBpcyByZWFkeSAqLw0KLSAgICAgIHdoaWxlIChSRUFEX0JJVChSQ0MtPkNTUiwgUkNDX0NTUl9MU0lSRFkpID09IDBVKSB7DQotICAgICAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gTFNJX1RJTUVPVVRfVkFMVUUpIHsNCi0gICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOw0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICAvKiBEaXNhYmxlIHRoZSBJbnRlcm5hbCBMb3cgU3BlZWQgb3NjaWxsYXRvciAoTFNJKS4gKi8NCi0gICAgICBfX0hBTF9SQ0NfTFNJX0RJU0FCTEUoKTsNCi0NCi0gICAgICAvKiBHZXQgU3RhcnQgVGljayovDQotICAgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsNCi0NCi0gICAgICAvKiBXYWl0IHRpbGwgTFNJIGlzIGRpc2FibGVkICovDQotICAgICAgd2hpbGUgKFJFQURfQklUKFJDQy0+Q1NSLCBSQ0NfQ1NSX0xTSVJEWSkgIT0gMFUpIHsNCi0gICAgICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBMU0lfVElNRU9VVF9WQUxVRSkgew0KLSAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7DQotICAgICAgICB9DQotICAgICAgfQ0KLSAgICB9DQotICB9DQotICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBMU0UgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0gIGlmICgoKFJDQ19Pc2NJbml0U3RydWN0LT5Pc2NpbGxhdG9yVHlwZSkgJiBSQ0NfT1NDSUxMQVRPUlRZUEVfTFNFKSA9PQ0KLSAgICAgIFJDQ19PU0NJTExBVE9SVFlQRV9MU0UpIHsNCi0gICAgRmxhZ1N0YXR1cyBwd3JjbGtjaGFuZ2VkID0gUkVTRVQ7DQotDQotICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICAgIGFzc2VydF9wYXJhbShJU19SQ0NfTFNFKFJDQ19Pc2NJbml0U3RydWN0LT5MU0VTdGF0ZSkpOw0KLQ0KLSAgICAvKiBVcGRhdGUgTFNFIGNvbmZpZ3VyYXRpb24gaW4gQmFja3VwIERvbWFpbiBjb250cm9sIHJlZ2lzdGVyICAgICovDQotICAgIC8qIFJlcXVpcmVzIHRvIGVuYWJsZSB3cml0ZSBhY2Nlc3MgdG8gQmFja3VwIERvbWFpbiBpZiBuZWNlc3NhcnkgKi8NCi0gICAgaWYgKF9fSEFMX1JDQ19QV1JfSVNfQ0xLX0RJU0FCTEVEKCkgIT0gMFUpIHsNCi0gICAgICBfX0hBTF9SQ0NfUFdSX0NMS19FTkFCTEUoKTsNCi0gICAgICBwd3JjbGtjaGFuZ2VkID0gU0VUOw0KLSAgICB9DQotDQotICAgIGlmIChIQUxfSVNfQklUX0NMUihQV1ItPkNSMSwgUFdSX0NSMV9EQlApKSB7DQotICAgICAgLyogRW5hYmxlIHdyaXRlIGFjY2VzcyB0byBCYWNrdXAgZG9tYWluICovDQotICAgICAgU0VUX0JJVChQV1ItPkNSMSwgUFdSX0NSMV9EQlApOw0KLQ0KLSAgICAgIC8qIFdhaXQgZm9yIEJhY2t1cCBkb21haW4gV3JpdGUgcHJvdGVjdGlvbiBkaXNhYmxlICovDQotICAgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsNCi0NCi0gICAgICB3aGlsZSAoSEFMX0lTX0JJVF9DTFIoUFdSLT5DUjEsIFBXUl9DUjFfREJQKSkgew0KLSAgICAgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFJDQ19EQlBfVElNRU9VVF9WQUxVRSkgew0KLSAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7DQotICAgICAgICB9DQotICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qIFNldCB0aGUgbmV3IExTRSBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0gICAgX19IQUxfUkNDX0xTRV9DT05GSUcoUkNDX09zY0luaXRTdHJ1Y3QtPkxTRVN0YXRlKTsNCi0NCi0gICAgLyogQ2hlY2sgdGhlIExTRSBTdGF0ZSAqLw0KLSAgICBpZiAoUkNDX09zY0luaXRTdHJ1Y3QtPkxTRVN0YXRlICE9IFJDQ19MU0VfT0ZGKSB7DQotICAgICAgLyogR2V0IFN0YXJ0IFRpY2sqLw0KLSAgICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7DQotDQotICAgICAgLyogV2FpdCB0aWxsIExTRSBpcyByZWFkeSAqLw0KLSAgICAgIHdoaWxlIChSRUFEX0JJVChSQ0MtPkJEQ1IsIFJDQ19CRENSX0xTRVJEWSkgPT0gMFUpIHsNCi0gICAgICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBSQ0NfTFNFX1RJTUVPVVRfVkFMVUUpIHsNCi0gICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOw0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICAvKiBHZXQgU3RhcnQgVGljayovDQotICAgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsNCi0NCi0gICAgICAvKiBXYWl0IHRpbGwgTFNFIGlzIGRpc2FibGVkICovDQotICAgICAgd2hpbGUgKFJFQURfQklUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfTFNFUkRZKSAhPSAwVSkgew0KLSAgICAgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFJDQ19MU0VfVElNRU9VVF9WQUxVRSkgew0KLSAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7DQotICAgICAgICB9DQotICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qIFJlc3RvcmUgY2xvY2sgY29uZmlndXJhdGlvbiBpZiBjaGFuZ2VkICovDQotICAgIGlmIChwd3JjbGtjaGFuZ2VkID09IFNFVCkgew0KLSAgICAgIF9fSEFMX1JDQ19QV1JfQ0xLX0RJU0FCTEUoKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSFNJNDggQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotICBpZiAoKChSQ0NfT3NjSW5pdFN0cnVjdC0+T3NjaWxsYXRvclR5cGUpICYgUkNDX09TQ0lMTEFUT1JUWVBFX0hTSTQ4KSA9PQ0KLSAgICAgIFJDQ19PU0NJTExBVE9SVFlQRV9IU0k0OCkgew0KLSAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX0hTSTQ4KFJDQ19Pc2NJbml0U3RydWN0LT5IU0k0OFN0YXRlKSk7DQotDQotICAgIC8qIENoZWNrIHRoZSBIU0k0OCBTdGF0ZSAqLw0KLSAgICBpZiAoUkNDX09zY0luaXRTdHJ1Y3QtPkhTSTQ4U3RhdGUgIT0gUkNDX0hTSTQ4X09GRikgew0KLSAgICAgIC8qIEVuYWJsZSB0aGUgSW50ZXJuYWwgTG93IFNwZWVkIG9zY2lsbGF0b3IgKEhTSTQ4KS4gKi8NCi0gICAgICBfX0hBTF9SQ0NfSFNJNDhfRU5BQkxFKCk7DQotDQotICAgICAgLyogR2V0IFN0YXJ0IFRpY2sqLw0KLSAgICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7DQotDQotICAgICAgLyogV2FpdCB0aWxsIEhTSTQ4IGlzIHJlYWR5ICovDQotICAgICAgd2hpbGUgKFJFQURfQklUKFJDQy0+Q1JSQ1IsIFJDQ19DUlJDUl9IU0k0OFJEWSkgPT0gMFUpIHsNCi0gICAgICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBIU0k0OF9USU1FT1VUX1ZBTFVFKSB7DQotICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsNCi0gICAgICAgIH0NCi0gICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgLyogRGlzYWJsZSB0aGUgSW50ZXJuYWwgTG93IFNwZWVkIG9zY2lsbGF0b3IgKEhTSTQ4KS4gKi8NCi0gICAgICBfX0hBTF9SQ0NfSFNJNDhfRElTQUJMRSgpOw0KLQ0KLSAgICAgIC8qIEdldCBTdGFydCBUaWNrKi8NCi0gICAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOw0KLQ0KLSAgICAgIC8qIFdhaXQgdGlsbCBIU0k0OCBpcyBkaXNhYmxlZCAqLw0KLSAgICAgIHdoaWxlIChSRUFEX0JJVChSQ0MtPkNSUkNSLCBSQ0NfQ1JSQ1JfSFNJNDhSRFkpICE9IDBVKSB7DQotICAgICAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gSFNJNDhfVElNRU9VVF9WQUxVRSkgew0KLSAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7DQotICAgICAgICB9DQotICAgICAgfQ0KLSAgICB9DQotICB9DQotDQotICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBMTCBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfUkNDX1BMTChSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTFN0YXRlKSk7DQotDQotICBpZiAoUkNDX09zY0luaXRTdHJ1Y3QtPlBMTC5QTExTdGF0ZSAhPSBSQ0NfUExMX05PTkUpIHsNCi0gICAgLyogQ2hlY2sgaWYgdGhlIFBMTCBpcyB1c2VkIGFzIHN5c3RlbSBjbG9jayBvciBub3QgKi8NCi0gICAgaWYgKF9fSEFMX1JDQ19HRVRfU1lTQ0xLX1NPVVJDRSgpICE9IFJDQ19DRkdSX1NXU19QTEwpIHsNCi0gICAgICBpZiAoUkNDX09zY0luaXRTdHJ1Y3QtPlBMTC5QTExTdGF0ZSA9PSBSQ0NfUExMX09OKSB7DQotICAgICAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgICAgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19QTExTT1VSQ0UoUkNDX09zY0luaXRTdHJ1Y3QtPlBMTC5QTExTb3VyY2UpKTsNCi0gICAgICAgIGFzc2VydF9wYXJhbShJU19SQ0NfUExMTV9WQUxVRShSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTE0pKTsNCi0gICAgICAgIGFzc2VydF9wYXJhbShJU19SQ0NfUExMTl9WQUxVRShSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTE4pKTsNCi0gICAgICAgIGFzc2VydF9wYXJhbShJU19SQ0NfUExMUF9WQUxVRShSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTFApKTsNCi0gICAgICAgIGFzc2VydF9wYXJhbShJU19SQ0NfUExMUV9WQUxVRShSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTFEpKTsNCi0gICAgICAgIGFzc2VydF9wYXJhbShJU19SQ0NfUExMUl9WQUxVRShSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTFIpKTsNCi0NCi0gICAgICAgIC8qIERpc2FibGUgdGhlIG1haW4gUExMLiAqLw0KLSAgICAgICAgX19IQUxfUkNDX1BMTF9ESVNBQkxFKCk7DQotDQotICAgICAgICAvKiBHZXQgU3RhcnQgVGljayovDQotICAgICAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOw0KLQ0KLSAgICAgICAgLyogV2FpdCB0aWxsIFBMTCBpcyByZWFkeSAqLw0KLSAgICAgICAgd2hpbGUgKFJFQURfQklUKFJDQy0+Q1IsIFJDQ19DUl9QTExSRFkpICE9IDBVKSB7DQotICAgICAgICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBQTExfVElNRU9VVF9WQUxVRSkgew0KLSAgICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyogQ29uZmlndXJlIHRoZSBtYWluIFBMTCBjbG9jayBzb3VyY2UsIG11bHRpcGxpY2F0aW9uIGFuZCBkaXZpc2lvbg0KLSAgICAgICAgICogZmFjdG9ycy4gKi8NCi0gICAgICAgIF9fSEFMX1JDQ19QTExfQ09ORklHKA0KLSAgICAgICAgICAgIFJDQ19Pc2NJbml0U3RydWN0LT5QTEwuUExMU291cmNlLCBSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTE0sDQotICAgICAgICAgICAgUkNDX09zY0luaXRTdHJ1Y3QtPlBMTC5QTExOLCBSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTFAsDQotICAgICAgICAgICAgUkNDX09zY0luaXRTdHJ1Y3QtPlBMTC5QTExRLCBSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTFIpOw0KLQ0KLSAgICAgICAgLyogRW5hYmxlIHRoZSBtYWluIFBMTC4gKi8NCi0gICAgICAgIF9fSEFMX1JDQ19QTExfRU5BQkxFKCk7DQotDQotICAgICAgICAvKiBFbmFibGUgUExMIFN5c3RlbSBDbG9jayBvdXRwdXQuICovDQotICAgICAgICBfX0hBTF9SQ0NfUExMQ0xLT1VUX0VOQUJMRShSQ0NfUExMX1NZU0NMSyk7DQotDQotICAgICAgICAvKiBHZXQgU3RhcnQgVGljayovDQotICAgICAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOw0KLQ0KLSAgICAgICAgLyogV2FpdCB0aWxsIFBMTCBpcyByZWFkeSAqLw0KLSAgICAgICAgd2hpbGUgKFJFQURfQklUKFJDQy0+Q1IsIFJDQ19DUl9QTExSRFkpID09IDBVKSB7DQotICAgICAgICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBQTExfVElNRU9VVF9WQUxVRSkgew0KLSAgICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICAvKiBEaXNhYmxlIHRoZSBtYWluIFBMTC4gKi8NCi0gICAgICAgIF9fSEFMX1JDQ19QTExfRElTQUJMRSgpOw0KLQ0KLSAgICAgICAgLyogRGlzYWJsZSBhbGwgUExMIG91dHB1dHMgdG8gc2F2ZSBwb3dlciBpZiBubyBQTExzIG9uICovDQotICAgICAgICBNT0RJRllfUkVHKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMU1JDLCBSQ0NfUExMU09VUkNFX05PTkUpOw0KLSAgICAgICAgX19IQUxfUkNDX1BMTENMS09VVF9ESVNBQkxFKFJDQ19QTExfU1lTQ0xLIHwgUkNDX1BMTF80OE0xQ0xLIHwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NfUExMX0FEQ0NMSyk7DQotDQotICAgICAgICAvKiBHZXQgU3RhcnQgVGljayovDQotICAgICAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOw0KLQ0KLSAgICAgICAgLyogV2FpdCB0aWxsIFBMTCBpcyBkaXNhYmxlZCAqLw0KLSAgICAgICAgd2hpbGUgKFJFQURfQklUKFJDQy0+Q1IsIFJDQ19DUl9QTExSRFkpICE9IDBVKSB7DQotICAgICAgICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBQTExfVElNRU9VVF9WQUxVRSkgew0KLSAgICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICAvKiBDaGVjayBpZiB0aGVyZSBpcyBhIHJlcXVlc3QgdG8gZGlzYWJsZSB0aGUgUExMIHVzZWQgYXMgU3lzdGVtIGNsb2NrDQotICAgICAgICogc291cmNlICovDQotICAgICAgaWYgKChSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTFN0YXRlKSA9PSBSQ0NfUExMX09GRikgew0KLSAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgLyogRG8gbm90IHJldHVybiBIQUxfRVJST1IgaWYgcmVxdWVzdCByZXBlYXRzIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24NCi0gICAgICAgICAqLw0KLSAgICAgICAgdGVtcF9wbGxja2NmZyA9IFJDQy0+UExMQ0ZHUjsNCi0gICAgICAgIGlmICgoUkVBRF9CSVQodGVtcF9wbGxja2NmZywgUkNDX1BMTENGR1JfUExMU1JDKSAhPQ0KLSAgICAgICAgICAgICBSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTFNvdXJjZSkgfHwNCi0gICAgICAgICAgICAoUkVBRF9CSVQodGVtcF9wbGxja2NmZywgUkNDX1BMTENGR1JfUExMTSkgIT0NCi0gICAgICAgICAgICAgKCgoUkNDX09zY0luaXRTdHJ1Y3QtPlBMTC5QTExNKSAtIDFVKSA8PCBSQ0NfUExMQ0ZHUl9QTExNX1BvcykpIHx8DQotICAgICAgICAgICAgKFJFQURfQklUKHRlbXBfcGxsY2tjZmcsIFJDQ19QTExDRkdSX1BMTE4pICE9DQotICAgICAgICAgICAgICgoUkNDX09zY0luaXRTdHJ1Y3QtPlBMTC5QTExOKSA8PCBSQ0NfUExMQ0ZHUl9QTExOX1BvcykpIHx8DQotICAgICAgICAgICAgKFJFQURfQklUKHRlbXBfcGxsY2tjZmcsIFJDQ19QTExDRkdSX1BMTFBESVYpICE9DQotICAgICAgICAgICAgICgoUkNDX09zY0luaXRTdHJ1Y3QtPlBMTC5QTExQKSA8PCBSQ0NfUExMQ0ZHUl9QTExQRElWX1BvcykpIHx8DQotICAgICAgICAgICAgKFJFQURfQklUKHRlbXBfcGxsY2tjZmcsIFJDQ19QTExDRkdSX1BMTFEpICE9DQotICAgICAgICAgICAgICgoKChSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTFEpID4+IDFVKSAtIDFVKQ0KLSAgICAgICAgICAgICAgPDwgUkNDX1BMTENGR1JfUExMUV9Qb3MpKSB8fA0KLSAgICAgICAgICAgIChSRUFEX0JJVCh0ZW1wX3BsbGNrY2ZnLCBSQ0NfUExMQ0ZHUl9QTExSKSAhPQ0KLSAgICAgICAgICAgICAoKCgoUkNDX09zY0luaXRTdHJ1Y3QtPlBMTC5QTExSKSA+PiAxVSkgLSAxVSkNCi0gICAgICAgICAgICAgIDw8IFJDQ19QTExDRkdSX1BMTFJfUG9zKSkpIHsNCi0gICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gICAgICAgIH0NCi0gICAgICB9DQotICAgIH0NCi0gIH0NCi0NCi0gIHJldHVybiBIQUxfT0s7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgQ1BVLCBBSEIgYW5kIEFQQiBidXNlcyBjbG9ja3MgYWNjb3JkaW5nIHRvIHRoZQ0KLSAqIHNwZWNpZmllZCBwYXJhbWV0ZXJzIGluIHRoZSBSQ0NfQ2xrSW5pdFN0cnVjdC4NCi0gKiBAcGFyYW0gIFJDQ19DbGtJbml0U3RydWN0ICBwb2ludGVyIHRvIGFuIFJDQ19Pc2NJbml0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdA0KLSAqICAgICAgICAgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBSQ0MgcGVyaXBoZXJhbC4NCi0gKiBAcGFyYW0gIEZMYXRlbmN5ICBGTEFTSCBMYXRlbmN5DQotICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgRkxBU0hfTEFURU5DWV8wICAgRkxBU0ggMCBMYXRlbmN5IGN5Y2xlDQotICogICAgICAgICAgICBAYXJnIEZMQVNIX0xBVEVOQ1lfMSAgIEZMQVNIIDEgTGF0ZW5jeSBjeWNsZQ0KLSAqICAgICAgICAgICAgQGFyZyBGTEFTSF9MQVRFTkNZXzIgICBGTEFTSCAyIExhdGVuY3kgY3ljbGVzDQotICogICAgICAgICAgICBAYXJnIEZMQVNIX0xBVEVOQ1lfMyAgIEZMQVNIIDMgTGF0ZW5jeSBjeWNsZXMNCi0gKiAgICAgICAgICAgIEBhcmcgRkxBU0hfTEFURU5DWV80ICAgRkxBU0ggNCBMYXRlbmN5IGN5Y2xlcw0KLSAqICAgICAgICAgICAgQGFyZyBGTEFTSF9MQVRFTkNZXzUgICBGTEFTSCA1IExhdGVuY3kgY3ljbGVzDQotICogICAgICAgICAgICBAYXJnIEZMQVNIX0xBVEVOQ1lfNiAgIEZMQVNIIDYgTGF0ZW5jeSBjeWNsZXMNCi0gKiAgICAgICAgICAgIEBhcmcgRkxBU0hfTEFURU5DWV83ICAgRkxBU0ggNyBMYXRlbmN5IGN5Y2xlcw0KLSAqICAgICAgICAgICAgQGFyZyBGTEFTSF9MQVRFTkNZXzggICBGTEFTSCA4IExhdGVuY3kgY3ljbGVzDQotICogICAgICAgICAgICBAYXJnIEZMQVNIX0xBVEVOQ1lfOSAgIEZMQVNIIDkgTGF0ZW5jeSBjeWNsZXMNCi0gKiAgICAgICAgICAgIEBhcmcgRkxBU0hfTEFURU5DWV8xMCAgRkxBU0ggMTAgTGF0ZW5jeSBjeWNsZXMNCi0gKiAgICAgICAgICAgIEBhcmcgRkxBU0hfTEFURU5DWV8xMSAgRkxBU0ggMTEgTGF0ZW5jeSBjeWNsZXMNCi0gKiAgICAgICAgICAgIEBhcmcgRkxBU0hfTEFURU5DWV8xMiAgRkxBU0ggMTIgTGF0ZW5jeSBjeWNsZXMNCi0gKiAgICAgICAgICAgIEBhcmcgRkxBU0hfTEFURU5DWV8xMyAgRkxBU0ggMTMgTGF0ZW5jeSBjeWNsZXMNCi0gKiAgICAgICAgICAgIEBhcmcgRkxBU0hfTEFURU5DWV8xNCAgRkxBU0ggMTQgTGF0ZW5jeSBjeWNsZXMNCi0gKiAgICAgICAgICAgIEBhcmcgRkxBU0hfTEFURU5DWV8xNSAgRkxBU0ggMTUgTGF0ZW5jeSBjeWNsZXMNCi0gKg0KLSAqIEBub3RlICAgVGhlIFN5c3RlbUNvcmVDbG9jayBDTVNJUyB2YXJpYWJsZSBpcyB1c2VkIHRvIHN0b3JlIFN5c3RlbSBDbG9jaw0KLSAqIEZyZXF1ZW5jeSBhbmQgdXBkYXRlZCBieSBIQUxfUkNDX0dldEhDTEtGcmVxKCkgZnVuY3Rpb24gY2FsbGVkIHdpdGhpbiB0aGlzDQotICogZnVuY3Rpb24NCi0gKg0KLSAqIEBub3RlICAgVGhlIEhTSSBpcyB1c2VkIGJ5IGRlZmF1bHQgYXMgc3lzdGVtIGNsb2NrIHNvdXJjZSBhZnRlcg0KLSAqICAgICAgICAgc3RhcnR1cCBmcm9tIFJlc2V0LCB3YWtlLXVwIGZyb20gU1RBTkRCWSBtb2RlLiBBZnRlciByZXN0YXJ0IGZyb20NCi0gKiBSZXNldCwgdGhlIEhTSSBmcmVxdWVuY3kgaXMgc2V0IHRvIGl0cyBkZWZhdWx0IHZhbHVlIDE2IE1Iei4NCi0gKg0KLSAqIEBub3RlICAgVGhlIEhTSSBjYW4gYmUgc2VsZWN0ZWQgYXMgc3lzdGVtIGNsb2NrIHNvdXJjZSBhZnRlcg0KLSAqICAgICAgICAgZnJvbSBTVE9QIG1vZGVzIG9yIGluIGNhc2Ugb2YgZmFpbHVyZSBvZiB0aGUgSFNFIHVzZWQgZGlyZWN0bHkgb3INCi0gKiBpbmRpcmVjdGx5IGFzIHN5c3RlbSBjbG9jayAoaWYgdGhlIENsb2NrIFNlY3VyaXR5IFN5c3RlbSBDU1MgaXMgZW5hYmxlZCkuDQotICoNCi0gKiBAbm90ZSAgIEEgc3dpdGNoIGZyb20gb25lIGNsb2NrIHNvdXJjZSB0byBhbm90aGVyIG9jY3VycyBvbmx5IGlmIHRoZSB0YXJnZXQNCi0gKiAgICAgICAgIGNsb2NrIHNvdXJjZSBpcyByZWFkeSAoY2xvY2sgc3RhYmxlIGFmdGVyIHN0YXJ0dXAgZGVsYXkgb3IgUExMDQotICogbG9ja2VkKS4gSWYgYSBjbG9jayBzb3VyY2Ugd2hpY2ggaXMgbm90IHlldCByZWFkeSBpcyBzZWxlY3RlZCwgdGhlIHN3aXRjaA0KLSAqIHdpbGwgb2NjdXIgd2hlbiB0aGUgY2xvY2sgc291cmNlIGlzIHJlYWR5Lg0KLSAqDQotICogQG5vdGUgICBZb3UgY2FuIHVzZSBIQUxfUkNDX0dldENsb2NrQ29uZmlnKCkgZnVuY3Rpb24gdG8ga25vdyB3aGljaCBjbG9jayBpcw0KLSAqICAgICAgICAgY3VycmVudGx5IHVzZWQgYXMgc3lzdGVtIGNsb2NrIHNvdXJjZS4NCi0gKg0KLSAqIEBub3RlICAgRGVwZW5kaW5nIG9uIHRoZSBkZXZpY2Ugdm9sdGFnZSByYW5nZSwgdGhlIHNvZnR3YXJlIGhhcyB0byBzZXQNCi0gKiBjb3JyZWN0bHkgSFBSRVszOjBdIGJpdHMgdG8gZW5zdXJlIHRoYXQgSENMSyBub3QgZXhjZWVkIHRoZSBtYXhpbXVtIGFsbG93ZWQNCi0gKiBmcmVxdWVuY3kgKGZvciBtb3JlIGRldGFpbHMgcmVmZXIgdG8gc2VjdGlvbiBhYm92ZQ0KLSAqICJJbml0aWFsaXphdGlvbi9kZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMiKQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9SQ0NfQ2xvY2tDb25maWcoUkNDX0Nsa0luaXRUeXBlRGVmICpSQ0NfQ2xrSW5pdFN0cnVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEZMYXRlbmN5KSB7DQotICB1aW50MzJfdCB0aWNrc3RhcnQ7DQotICB1aW50MzJfdCBwbGxmcmVxOw0KLSAgdWludDMyX3QgaHByZSA9IFJDQ19TWVNDTEtfRElWMTsNCi0NCi0gIC8qIENoZWNrIE51bGwgcG9pbnRlciAqLw0KLSAgaWYgKFJDQ19DbGtJbml0U3RydWN0ID09IE5VTEwpIHsNCi0gICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gIH0NCi0NCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfUkNDX0NMT0NLVFlQRShSQ0NfQ2xrSW5pdFN0cnVjdC0+Q2xvY2tUeXBlKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfRkxBU0hfTEFURU5DWShGTGF0ZW5jeSkpOw0KLQ0KLSAgLyogVG8gY29ycmVjdGx5IHJlYWQgZGF0YSBmcm9tIEZMQVNIIG1lbW9yeSwgdGhlIG51bWJlciBvZiB3YWl0IHN0YXRlcw0KLSAgICAoTEFURU5DWSkgbXVzdCBiZSBjb3JyZWN0bHkgcHJvZ3JhbW1lZCBhY2NvcmRpbmcgdG8gdGhlIGZyZXF1ZW5jeSBvZiB0aGUgQ1BVDQotICAgIGNsb2NrIChIQ0xLKSBhbmQgdGhlIHN1cHBseSB2b2x0YWdlIG9mIHRoZSBkZXZpY2UuICovDQotDQotICAvKiBJbmNyZWFzaW5nIHRoZSBudW1iZXIgb2Ygd2FpdCBzdGF0ZXMgYmVjYXVzZSBvZiBoaWdoZXIgQ1BVIGZyZXF1ZW5jeSAqLw0KLSAgaWYgKEZMYXRlbmN5ID4gX19IQUxfRkxBU0hfR0VUX0xBVEVOQ1koKSkgew0KLSAgICAvKiBQcm9ncmFtIHRoZSBuZXcgbnVtYmVyIG9mIHdhaXQgc3RhdGVzIHRvIHRoZSBMQVRFTkNZIGJpdHMgaW4gdGhlDQotICAgICAqIEZMQVNIX0FDUiByZWdpc3RlciAqLw0KLSAgICBfX0hBTF9GTEFTSF9TRVRfTEFURU5DWShGTGF0ZW5jeSk7DQotDQotICAgIC8qIENoZWNrIHRoYXQgdGhlIG5ldyBudW1iZXIgb2Ygd2FpdCBzdGF0ZXMgaXMgdGFrZW4gaW50byBhY2NvdW50IHRvIGFjY2Vzcw0KLSAgICB0aGUgRmxhc2ggbWVtb3J5IGJ5IHJlYWRpbmcgdGhlIEZMQVNIX0FDUiByZWdpc3RlciAqLw0KLSAgICBpZiAoX19IQUxfRkxBU0hfR0VUX0xBVEVOQ1koKSAhPSBGTGF0ZW5jeSkgew0KLSAgICAgIHJldHVybiBIQUxfRVJST1I7DQotICAgIH0NCi0gIH0NCi0NCi0gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTWVNDTEsgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSAgaWYgKCgoUkNDX0Nsa0luaXRTdHJ1Y3QtPkNsb2NrVHlwZSkgJiBSQ0NfQ0xPQ0tUWVBFX1NZU0NMSykgPT0NCi0gICAgICBSQ0NfQ0xPQ0tUWVBFX1NZU0NMSykgew0KLSAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX1NZU0NMS1NPVVJDRShSQ0NfQ2xrSW5pdFN0cnVjdC0+U1lTQ0xLU291cmNlKSk7DQotDQotICAgIC8qIFBMTCBpcyBzZWxlY3RlZCBhcyBTeXN0ZW0gQ2xvY2sgU291cmNlICovDQotICAgIGlmIChSQ0NfQ2xrSW5pdFN0cnVjdC0+U1lTQ0xLU291cmNlID09IFJDQ19TWVNDTEtTT1VSQ0VfUExMQ0xLKSB7DQotICAgICAgLyogQ2hlY2sgdGhlIFBMTCByZWFkeSBmbGFnICovDQotICAgICAgaWYgKFJFQURfQklUKFJDQy0+Q1IsIFJDQ19DUl9QTExSRFkpID09IDBVKSB7DQotICAgICAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgICAgIH0NCi0gICAgICAvKiBVbmRlcnNob290IG1hbmFnZW1lbnQgd2hlbiBzZWxlY3Rpb24gUExMIGFzIFNZU0NMSyBzb3VyY2UgYW5kIGZyZXF1ZW5jeQ0KLSAgICAgICAqIGFib3ZlIDgwTWh6ICovDQotICAgICAgLyogQ29tcHV0ZSB0YXJnZXQgUExMIG91dHB1dCBmcmVxdWVuY3kgKi8NCi0gICAgICBwbGxmcmVxID0gUkNDX0dldFN5c0Nsb2NrRnJlcUZyb21QTExTb3VyY2UoKTsNCi0NCi0gICAgICAvKiBJbnRlcm1lZGlhdGUgc3RlcCB3aXRoIEhDTEsgcHJlc2NhbGVyIDIgbmVjZXNzYXJ5IGJlZm9yZSB0byBnbyBvdmVyDQotICAgICAgICogODBNaHogKi8NCi0gICAgICBpZiAocGxsZnJlcSA+IDgwMDAwMDAwVSkgew0KLSAgICAgICAgaWYgKCgoUkVBRF9CSVQoUkNDLT5DRkdSLCBSQ0NfQ0ZHUl9IUFJFKSA9PSBSQ0NfU1lTQ0xLX0RJVjEpKSB8fA0KLSAgICAgICAgICAgICgoKCgoUkNDX0Nsa0luaXRTdHJ1Y3QtPkNsb2NrVHlwZSkgJiBSQ0NfQ0xPQ0tUWVBFX0hDTEspID09DQotICAgICAgICAgICAgICAgUkNDX0NMT0NLVFlQRV9IQ0xLKSAmJg0KLSAgICAgICAgICAgICAgKFJDQ19DbGtJbml0U3RydWN0LT5BSEJDTEtEaXZpZGVyID09IFJDQ19TWVNDTEtfRElWMSkpKSkgew0KLSAgICAgICAgICBNT0RJRllfUkVHKFJDQy0+Q0ZHUiwgUkNDX0NGR1JfSFBSRSwgUkNDX1NZU0NMS19ESVYyKTsNCi0gICAgICAgICAgaHByZSA9IFJDQ19TWVNDTEtfRElWMjsNCi0gICAgICAgIH0NCi0gICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgLyogSFNFIGlzIHNlbGVjdGVkIGFzIFN5c3RlbSBDbG9jayBTb3VyY2UgKi8NCi0gICAgICBpZiAoUkNDX0Nsa0luaXRTdHJ1Y3QtPlNZU0NMS1NvdXJjZSA9PSBSQ0NfU1lTQ0xLU09VUkNFX0hTRSkgew0KLSAgICAgICAgLyogQ2hlY2sgdGhlIEhTRSByZWFkeSBmbGFnICovDQotICAgICAgICBpZiAoUkVBRF9CSVQoUkNDLT5DUiwgUkNDX0NSX0hTRVJEWSkgPT0gMFUpIHsNCi0gICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gICAgICAgIH0NCi0gICAgICB9DQotICAgICAgLyogSFNJIGlzIHNlbGVjdGVkIGFzIFN5c3RlbSBDbG9jayBTb3VyY2UgKi8NCi0gICAgICBlbHNlIHsNCi0gICAgICAgIC8qIENoZWNrIHRoZSBIU0kgcmVhZHkgZmxhZyAqLw0KLSAgICAgICAgaWYgKFJFQURfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0lSRFkpID09IDBVKSB7DQotICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7DQotICAgICAgICB9DQotICAgICAgfQ0KLSAgICAgIC8qIE92ZXJzaG9vdCBtYW5hZ2VtZW50IHdoZW4gZ29pbmcgZG93biBmcm9tIFBMTCBhcyBTWVNDTEsgc291cmNlIGFuZA0KLSAgICAgICAqIGZyZXF1ZW5jeSBhYm92ZSA4ME1oeiAqLw0KLSAgICAgIHBsbGZyZXEgPSBIQUxfUkNDX0dldFN5c0Nsb2NrRnJlcSgpOw0KLQ0KLSAgICAgIC8qIEludGVybWVkaWF0ZSBzdGVwIHdpdGggSENMSyBwcmVzY2FsZXIgMiBuZWNlc3NhcnkgYmVmb3JlIHRvIGdvIHVuZGVyDQotICAgICAgICogODBNaHogKi8NCi0gICAgICBpZiAocGxsZnJlcSA+IDgwMDAwMDAwVSkgew0KLSAgICAgICAgTU9ESUZZX1JFRyhSQ0MtPkNGR1IsIFJDQ19DRkdSX0hQUkUsIFJDQ19TWVNDTEtfRElWMik7DQotICAgICAgICBocHJlID0gUkNDX1NZU0NMS19ESVYyOw0KLSAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBNT0RJRllfUkVHKFJDQy0+Q0ZHUiwgUkNDX0NGR1JfU1csIFJDQ19DbGtJbml0U3RydWN0LT5TWVNDTEtTb3VyY2UpOw0KLQ0KLSAgICAvKiBHZXQgU3RhcnQgVGljayovDQotICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7DQotDQotICAgIHdoaWxlIChfX0hBTF9SQ0NfR0VUX1NZU0NMS19TT1VSQ0UoKSAhPQ0KLSAgICAgICAgICAgKFJDQ19DbGtJbml0U3RydWN0LT5TWVNDTEtTb3VyY2UgPDwgUkNDX0NGR1JfU1dTX1BvcykpIHsNCi0gICAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gQ0xPQ0tTV0lUQ0hfVElNRU9VVF9WQUxVRSkgew0KLSAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBIQ0xLIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSAgaWYgKCgoUkNDX0Nsa0luaXRTdHJ1Y3QtPkNsb2NrVHlwZSkgJiBSQ0NfQ0xPQ0tUWVBFX0hDTEspID09DQotICAgICAgUkNDX0NMT0NLVFlQRV9IQ0xLKSB7DQotICAgIC8qIFNldCB0aGUgaGlnaGVzdCBBUEIgZGl2aWRlciBpbiBvcmRlciB0byBlbnN1cmUgdGhhdCB3ZSBkbyBub3QgZ28gdGhyb3VnaA0KLSAgICAgICBhIG5vbi1zcGVjIHBoYXNlIHdoYXRldmVyIHdlIGRlY3JlYXNlIG9yIGluY3JlYXNlIEhDTEsuICovDQotICAgIGlmICgoKFJDQ19DbGtJbml0U3RydWN0LT5DbG9ja1R5cGUpICYgUkNDX0NMT0NLVFlQRV9QQ0xLMSkgPT0NCi0gICAgICAgIFJDQ19DTE9DS1RZUEVfUENMSzEpIHsNCi0gICAgICBNT0RJRllfUkVHKFJDQy0+Q0ZHUiwgUkNDX0NGR1JfUFBSRTEsIFJDQ19IQ0xLX0RJVjE2KTsNCi0gICAgfQ0KLSAgICBpZiAoKChSQ0NfQ2xrSW5pdFN0cnVjdC0+Q2xvY2tUeXBlKSAmIFJDQ19DTE9DS1RZUEVfUENMSzIpID09DQotICAgICAgICBSQ0NfQ0xPQ0tUWVBFX1BDTEsyKSB7DQotICAgICAgTU9ESUZZX1JFRyhSQ0MtPkNGR1IsIFJDQ19DRkdSX1BQUkUyLCBSQ0NfSENMS19ESVYxNik7DQotICAgIH0NCi0NCi0gICAgLyogU2V0IHRoZSBuZXcgSENMSyBjbG9jayBkaXZpZGVyICovDQotICAgIGFzc2VydF9wYXJhbShJU19SQ0NfSENMSyhSQ0NfQ2xrSW5pdFN0cnVjdC0+QUhCQ0xLRGl2aWRlcikpOw0KLSAgICBNT0RJRllfUkVHKFJDQy0+Q0ZHUiwgUkNDX0NGR1JfSFBSRSwgUkNDX0Nsa0luaXRTdHJ1Y3QtPkFIQkNMS0RpdmlkZXIpOw0KLSAgfSBlbHNlIHsNCi0gICAgLyogSXMgaW50ZXJtZWRpYXRlIEhDTEsgcHJlc2NhbGVyIDIgYXBwbGllZCBpbnRlcm5hbGx5LCBjb21wbGV0ZSB3aXRoIEhDTEsNCi0gICAgICogcHJlc2NhbGVyIDEgKi8NCi0gICAgaWYgKGhwcmUgPT0gUkNDX1NZU0NMS19ESVYyKSB7DQotICAgICAgTU9ESUZZX1JFRyhSQ0MtPkNGR1IsIFJDQ19DRkdSX0hQUkUsIFJDQ19TWVNDTEtfRElWMSk7DQotICAgIH0NCi0gIH0NCi0NCi0gIC8qIERlY3JlYXNpbmcgdGhlIG51bWJlciBvZiB3YWl0IHN0YXRlcyBiZWNhdXNlIG9mIGxvd2VyIENQVSBmcmVxdWVuY3kgKi8NCi0gIGlmIChGTGF0ZW5jeSA8IF9fSEFMX0ZMQVNIX0dFVF9MQVRFTkNZKCkpIHsNCi0gICAgLyogUHJvZ3JhbSB0aGUgbmV3IG51bWJlciBvZiB3YWl0IHN0YXRlcyB0byB0aGUgTEFURU5DWSBiaXRzIGluIHRoZQ0KLSAgICAgKiBGTEFTSF9BQ1IgcmVnaXN0ZXIgKi8NCi0gICAgX19IQUxfRkxBU0hfU0VUX0xBVEVOQ1koRkxhdGVuY3kpOw0KLQ0KLSAgICAvKiBDaGVjayB0aGF0IHRoZSBuZXcgbnVtYmVyIG9mIHdhaXQgc3RhdGVzIGlzIHRha2VuIGludG8gYWNjb3VudCB0byBhY2Nlc3MNCi0gICAgdGhlIEZsYXNoIG1lbW9yeSBieSBwb2xsaW5nIHRoZSBGTEFTSF9BQ1IgcmVnaXN0ZXIgKi8NCi0gICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsNCi0NCi0gICAgd2hpbGUgKF9fSEFMX0ZMQVNIX0dFVF9MQVRFTkNZKCkgIT0gRkxhdGVuY3kpIHsNCi0gICAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gQ0xPQ0tTV0lUQ0hfVElNRU9VVF9WQUxVRSkgew0KLSAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQQ0xLMSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotICBpZiAoKChSQ0NfQ2xrSW5pdFN0cnVjdC0+Q2xvY2tUeXBlKSAmIFJDQ19DTE9DS1RZUEVfUENMSzEpID09DQotICAgICAgUkNDX0NMT0NLVFlQRV9QQ0xLMSkgew0KLSAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX1BDTEsoUkNDX0Nsa0luaXRTdHJ1Y3QtPkFQQjFDTEtEaXZpZGVyKSk7DQotICAgIE1PRElGWV9SRUcoUkNDLT5DRkdSLCBSQ0NfQ0ZHUl9QUFJFMSwgUkNDX0Nsa0luaXRTdHJ1Y3QtPkFQQjFDTEtEaXZpZGVyKTsNCi0gIH0NCi0NCi0gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUENMSzIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSAgaWYgKCgoUkNDX0Nsa0luaXRTdHJ1Y3QtPkNsb2NrVHlwZSkgJiBSQ0NfQ0xPQ0tUWVBFX1BDTEsyKSA9PQ0KLSAgICAgIFJDQ19DTE9DS1RZUEVfUENMSzIpIHsNCi0gICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19QQ0xLKFJDQ19DbGtJbml0U3RydWN0LT5BUEIyQ0xLRGl2aWRlcikpOw0KLSAgICBNT0RJRllfUkVHKFJDQy0+Q0ZHUiwgUkNDX0NGR1JfUFBSRTIsDQotICAgICAgICAgICAgICAgKChSQ0NfQ2xrSW5pdFN0cnVjdC0+QVBCMkNMS0RpdmlkZXIpIDw8IDNVKSk7DQotICB9DQotDQotICAvKiBVcGRhdGUgdGhlIFN5c3RlbUNvcmVDbG9jayBnbG9iYWwgdmFyaWFibGUgKi8NCi0gIFN5c3RlbUNvcmVDbG9jayA9DQotICAgICAgSEFMX1JDQ19HZXRTeXNDbG9ja0ZyZXEoKSA+Pg0KLSAgICAgIChBSEJQcmVzY1RhYmxlW1JFQURfQklUKFJDQy0+Q0ZHUiwgUkNDX0NGR1JfSFBSRSkgPj4gUkNDX0NGR1JfSFBSRV9Qb3NdICYNCi0gICAgICAgMHgxRlUpOw0KLQ0KLSAgLyogQ29uZmlndXJlIHRoZSBzb3VyY2Ugb2YgdGltZSBiYXNlIGNvbnNpZGVyaW5nIG5ldyBzeXN0ZW0gY2xvY2tzIHNldHRpbmdzKi8NCi0gIHJldHVybiBIQUxfSW5pdFRpY2sodXdUaWNrUHJpbyk7DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBSQ0NfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zDQotICogIEBicmllZiAgIFJDQyBjbG9ja3MgY29udHJvbCBmdW5jdGlvbnMNCi0gKg0KLUB2ZXJiYXRpbQ0KLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgIyMjIyMNCi0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICBbLi5dDQotICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG86DQotDQotICAgICgrKSBPdXRwdXQgY2xvY2sgdG8gTUNPIHBpbi4NCi0gICAgKCspIFJldHJpZXZlIGN1cnJlbnQgY2xvY2sgZnJlcXVlbmNpZXMuDQotICAgICgrKSBFbmFibGUgdGhlIENsb2NrIFNlY3VyaXR5IFN5c3RlbS4NCi0NCi1AZW5kdmVyYmF0aW0NCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICogQGJyaWVmICBTZWxlY3QgdGhlIGNsb2NrIHNvdXJjZSB0byBvdXRwdXQgb24gTUNPIHBpbihQQTgvUEcxMCkuDQotICogQG5vdGUgICBQQTgvUEcxMCBzaG91bGQgYmUgY29uZmlndXJlZCBpbiBhbHRlcm5hdGUgZnVuY3Rpb24gbW9kZS4NCi0gKiBAbm90ZSAgIFRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gb2YgdGhlIEdQSU9HIHBpbiAxMCAoUEcxMCkgaXMgc2V0IHRvIHJlc2V0DQotICogbW9kZSAoTlJTVCBwaW4pIGFuZCB1c2VyIHNoYWxsIHNldCB0aGUgTlJTVF9NT0RFIEJpdCBpbiB0aGUgRkxBU0ggT1BUUg0KLSAqIHJlZ2lzdGVyIHRvIGJlIGFibGUgdG8gdXNlIGl0IGFzIGFuIE1DTyBwaW4uIFRoZSBAcmVmIEhBTF9GTEFTSEV4X09CUHJvZ3JhbSgpDQotICogQVBJIGNhbiBiZSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgTlJTVF9NT0RFIEJpdCB2YWx1ZS4NCi0gKiBAcGFyYW0gIFJDQ19NQ094ICBzcGVjaWZpZXMgdGhlIG91dHB1dCBkaXJlY3Rpb24gZm9yIHRoZSBjbG9jayBzb3VyY2UuDQotICogICAgICAgICAgRm9yIFNUTTMyRzR4eCBmYW1pbHkgdGhpcyBwYXJhbWV0ZXIgY2FuIGhhdmUgb25seSBvbmUgdmFsdWU6DQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DT19QQTggIENsb2NrIHNvdXJjZSB0byBvdXRwdXQgb24gTUNPMSBwaW4oUEE4KS4NCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPX1BHMTAgIENsb2NrIHNvdXJjZSB0byBvdXRwdXQgb24gTUNPMSBwaW4oUEcxMCkuDQotICogQHBhcmFtICBSQ0NfTUNPU291cmNlICBzcGVjaWZpZXMgdGhlIGNsb2NrIHNvdXJjZSB0byBvdXRwdXQuDQotICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPMVNPVVJDRV9OT0NMT0NLICBNQ08gb3V0cHV0IGRpc2FibGVkLCBubyBjbG9jayBvbg0KLSAqIE1DTw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ08xU09VUkNFX1NZU0NMSyAgc3lzdGVtICBjbG9jayBzZWxlY3RlZCBhcyBNQ08NCi0gKiBzb3VyY2UNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPMVNPVVJDRV9IU0kgIEhTSSBjbG9jayBzZWxlY3RlZCBhcyBNQ08gc291cmNlDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DTzFTT1VSQ0VfSFNFICBIU0UgY2xvY2sgc2VsZWN0ZWQgYXMgTUNPIHNvdXJjZWUNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPMVNPVVJDRV9QTExDTEsgIG1haW4gUExMIGNsb2NrIHNlbGVjdGVkIGFzIE1DTw0KLSAqIHNvdXJjZQ0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ08xU09VUkNFX0xTSSAgTFNJIGNsb2NrIHNlbGVjdGVkIGFzIE1DTyBzb3VyY2UNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPMVNPVVJDRV9MU0UgIExTRSBjbG9jayBzZWxlY3RlZCBhcyBNQ08gc291cmNlDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DTzFTT1VSQ0VfSFNJNDggIEhTSTQ4IGNsb2NrIHNlbGVjdGVkIGFzIE1DTyBzb3VyY2UNCi0gKiBmb3IgZGV2aWNlcyB3aXRoIEhTSTQ4DQotICogQHBhcmFtICBSQ0NfTUNPRGl2ICBzcGVjaWZpZXMgdGhlIE1DTyBwcmVzY2FsZXIuDQotICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPRElWXzEgIG5vIGRpdmlzaW9uIGFwcGxpZWQgdG8gTUNPIGNsb2NrDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DT0RJVl8yICBkaXZpc2lvbiBieSAyIGFwcGxpZWQgdG8gTUNPIGNsb2NrDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DT0RJVl80ICBkaXZpc2lvbiBieSA0IGFwcGxpZWQgdG8gTUNPIGNsb2NrDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DT0RJVl84ICBkaXZpc2lvbiBieSA4IGFwcGxpZWQgdG8gTUNPIGNsb2NrDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DT0RJVl8xNiAgZGl2aXNpb24gYnkgMTYgYXBwbGllZCB0byBNQ08gY2xvY2sNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi12b2lkIEhBTF9SQ0NfTUNPQ29uZmlnKHVpbnQzMl90IFJDQ19NQ094LCB1aW50MzJfdCBSQ0NfTUNPU291cmNlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUkNDX01DT0Rpdikgew0KLSAgR1BJT19Jbml0VHlwZURlZiBncGlvX2luaXRzdHJ1Y3Q7DQotICB1aW50MzJfdCBtY29pbmRleDsNCi0gIHVpbnQzMl90IG1jb19ncGlvX2luZGV4Ow0KLSAgR1BJT19UeXBlRGVmICptY29fZ3Bpb19wb3J0Ow0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19SQ0NfTUNPKFJDQ19NQ094KSk7DQotDQotICAvKiBDb21tb24gR1BJTyBpbml0IHBhcmFtZXRlcnMgKi8NCi0gIGdwaW9faW5pdHN0cnVjdC5Nb2RlID0gR1BJT19NT0RFX0FGX1BQOw0KLSAgZ3Bpb19pbml0c3RydWN0LlNwZWVkID0gR1BJT19TUEVFRF9GUkVRX1ZFUllfSElHSDsNCi0gIGdwaW9faW5pdHN0cnVjdC5QdWxsID0gR1BJT19OT1BVTEw7DQotDQotICAvKiBHZXQgTUNPeCBzZWxlY3Rpb24gKi8NCi0gIG1jb2luZGV4ID0gUkNDX01DT3ggJiBSQ0NfTUNPX0lOREVYX01BU0s7DQotDQotICAvKiBHZXQgTUNPeCBHUElPIFBvcnQgKi8NCi0gIG1jb19ncGlvX3BvcnQgPSAoR1BJT19UeXBlRGVmICopUkNDX0dFVF9NQ09fR1BJT19QT1JUKFJDQ19NQ094KTsNCi0NCi0gIC8qIE1DT3ggQ2xvY2sgRW5hYmxlICovDQotICBtY29fZ3Bpb19pbmRleCA9IFJDQ19HRVRfTUNPX0dQSU9fSU5ERVgoUkNDX01DT3gpOw0KLSAgU0VUX0JJVChSQ0MtPkFIQjJFTlIsICgxVUwgPDwgbWNvX2dwaW9faW5kZXgpKTsNCi0NCi0gIC8qIENvbmZpZ3VyZSB0aGUgTUNPeCBwaW4gaW4gYWx0ZXJuYXRlIGZ1bmN0aW9uIG1vZGUgKi8NCi0gIGdwaW9faW5pdHN0cnVjdC5QaW4gPSBSQ0NfR0VUX01DT19HUElPX1BJTihSQ0NfTUNPeCk7DQotICBncGlvX2luaXRzdHJ1Y3QuQWx0ZXJuYXRlID0gUkNDX0dFVF9NQ09fR1BJT19BRihSQ0NfTUNPeCk7DQotICBIQUxfR1BJT19Jbml0KG1jb19ncGlvX3BvcnQsICZncGlvX2luaXRzdHJ1Y3QpOw0KLQ0KLSAgaWYgKG1jb2luZGV4ID09IFJDQ19NQ08xX0lOREVYKSB7DQotICAgIGFzc2VydF9wYXJhbShJU19SQ0NfTUNPRElWKFJDQ19NQ09EaXYpKTsNCi0gICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19NQ08xU09VUkNFKFJDQ19NQ09Tb3VyY2UpKTsNCi0gICAgLyogTWFzayBNQ09TRUxbXSBhbmQgTUNPUFJFW10gYml0cyB0aGVuIHNldCBNQ08gY2xvY2sgc291cmNlIGFuZCBwcmVzY2FsZXINCi0gICAgICovDQotICAgIE1PRElGWV9SRUcoUkNDLT5DRkdSLCAoUkNDX0NGR1JfTUNPU0VMIHwgUkNDX0NGR1JfTUNPUFJFKSwNCi0gICAgICAgICAgICAgICAoUkNDX01DT1NvdXJjZSB8IFJDQ19NQ09EaXYpKTsNCi0gIH0NCi19DQotDQotLyoqDQotICogQGJyaWVmICBSZXR1cm4gdGhlIFNZU0NMSyBmcmVxdWVuY3kuDQotICoNCi0gKiBAbm90ZSAgIFRoZSBzeXN0ZW0gZnJlcXVlbmN5IGNvbXB1dGVkIGJ5IHRoaXMgZnVuY3Rpb24gaXMgbm90IHRoZSByZWFsDQotICogICAgICAgICBmcmVxdWVuY3kgaW4gdGhlIGNoaXAuIEl0IGlzIGNhbGN1bGF0ZWQgYmFzZWQgb24gdGhlIHByZWRlZmluZWQNCi0gKiAgICAgICAgIGNvbnN0YW50IGFuZCB0aGUgc2VsZWN0ZWQgY2xvY2sgc291cmNlOg0KLSAqIEBub3RlICAgICBJZiBTWVNDTEsgc291cmNlIGlzIEhTSSwgZnVuY3Rpb24gcmV0dXJucyB2YWx1ZXMgYmFzZWQgb24NCi0gKiBIU0lfVkFMVUUoKikNCi0gKiBAbm90ZSAgICAgSWYgU1lTQ0xLIHNvdXJjZSBpcyBIU0UsIGZ1bmN0aW9uIHJldHVybnMgdmFsdWVzIGJhc2VkIG9uDQotICogSFNFX1ZBTFVFKCoqKQ0KLSAqIEBub3RlICAgICBJZiBTWVNDTEsgc291cmNlIGlzIFBMTCwgZnVuY3Rpb24gcmV0dXJucyB2YWx1ZXMgYmFzZWQgb24NCi0gKiBIU0VfVkFMVUUoKiopLCBIU0lfVkFMVUUoKikgVmFsdWUgbXVsdGlwbGllZC9kaXZpZGVkIGJ5IHRoZSBQTEwgZmFjdG9ycy4NCi0gKiBAbm90ZSAgICAgKCopIEhTSV9WQUxVRSBpcyBhIGNvbnN0YW50IGRlZmluZWQgaW4gc3RtMzJnNHh4X2hhbF9jb25mLmggZmlsZQ0KLSAqIChkZWZhdWx0IHZhbHVlIDE2IE1IeikgYnV0IHRoZSByZWFsIHZhbHVlIG1heSB2YXJ5IGRlcGVuZGluZyBvbiB0aGUNCi0gKiB2YXJpYXRpb25zIGluIHZvbHRhZ2UgYW5kIHRlbXBlcmF0dXJlLg0KLSAqIEBub3RlICAgICAoKiopIEhTRV9WQUxVRSBpcyBhIGNvbnN0YW50IGRlZmluZWQgaW4gc3RtMzJnNHh4X2hhbF9jb25mLmggZmlsZQ0KLSAqIChkZWZhdWx0IHZhbHVlIDggTUh6KSwgdXNlciBoYXMgdG8gZW5zdXJlIHRoYXQgSFNFX1ZBTFVFIGlzIHNhbWUgYXMgdGhlIHJlYWwNCi0gKiAgICAgICAgICAgICAgICBmcmVxdWVuY3kgb2YgdGhlIGNyeXN0YWwgdXNlZC4gT3RoZXJ3aXNlLCB0aGlzIGZ1bmN0aW9uIG1heQ0KLSAqICAgICAgICAgICAgICAgIGhhdmUgd3JvbmcgcmVzdWx0Lg0KLSAqDQotICogQG5vdGUgICBUaGUgcmVzdWx0IG9mIHRoaXMgZnVuY3Rpb24gY291bGQgYmUgbm90IGNvcnJlY3Qgd2hlbiB1c2luZw0KLSAqIGZyYWN0aW9uYWwgdmFsdWUgZm9yIEhTRSBjcnlzdGFsLg0KLSAqDQotICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGJ5IHRoZSB1c2VyIGFwcGxpY2F0aW9uIHRvIGNvbXB1dGUgdGhlDQotICogICAgICAgICBiYXVkcmF0ZSBmb3IgdGhlIGNvbW11bmljYXRpb24gcGVyaXBoZXJhbHMgb3IgY29uZmlndXJlIG90aGVyDQotICogcGFyYW1ldGVycy4NCi0gKg0KLSAqIEBub3RlICAgRWFjaCB0aW1lIFNZU0NMSyBjaGFuZ2VzLCB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHRvIHVwZGF0ZSB0aGUNCi0gKiAgICAgICAgIHJpZ2h0IFNZU0NMSyB2YWx1ZS4gT3RoZXJ3aXNlLCBhbnkgY29uZmlndXJhdGlvbiBiYXNlZCBvbiB0aGlzDQotICogZnVuY3Rpb24gd2lsbCBiZSBpbmNvcnJlY3QuDQotICoNCi0gKg0KLSAqIEByZXR2YWwgU1lTQ0xLIGZyZXF1ZW5jeQ0KLSAqLw0KLXVpbnQzMl90IEhBTF9SQ0NfR2V0U3lzQ2xvY2tGcmVxKHZvaWQpIHsNCi0gIHVpbnQzMl90IHBsbHZjbywgcGxsc291cmNlLCBwbGxyLCBwbGxtOw0KLSAgdWludDMyX3Qgc3lzY2xvY2tmcmVxOw0KLQ0KLSAgaWYgKF9fSEFMX1JDQ19HRVRfU1lTQ0xLX1NPVVJDRSgpID09IFJDQ19DRkdSX1NXU19IU0kpIHsNCi0gICAgLyogSFNJIHVzZWQgYXMgc3lzdGVtIGNsb2NrIHNvdXJjZSAqLw0KLSAgICBzeXNjbG9ja2ZyZXEgPSBIU0lfVkFMVUU7DQotICB9IGVsc2UgaWYgKF9fSEFMX1JDQ19HRVRfU1lTQ0xLX1NPVVJDRSgpID09IFJDQ19DRkdSX1NXU19IU0UpIHsNCi0gICAgLyogSFNFIHVzZWQgYXMgc3lzdGVtIGNsb2NrIHNvdXJjZSAqLw0KLSAgICBzeXNjbG9ja2ZyZXEgPSBIU0VfVkFMVUU7DQotICB9IGVsc2UgaWYgKF9fSEFMX1JDQ19HRVRfU1lTQ0xLX1NPVVJDRSgpID09IFJDQ19DRkdSX1NXU19QTEwpIHsNCi0gICAgLyogUExMIHVzZWQgYXMgc3lzdGVtIGNsb2NrICBzb3VyY2UgKi8NCi0NCi0gICAgLyogUExMX1ZDTyA9ICgoSFNFX1ZBTFVFIG9yIEhTSV9WQUxVRSkvIFBMTE0pICogUExMTg0KLSAgICBTWVNDTEsgPSBQTExfVkNPIC8gUExMUg0KLSAgICAqLw0KLSAgICBwbGxzb3VyY2UgPSBSRUFEX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTFNSQyk7DQotICAgIHBsbG0gPQ0KLSAgICAgICAgKFJFQURfQklUKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMTSkgPj4gUkNDX1BMTENGR1JfUExMTV9Qb3MpICsgMVU7DQotDQotICAgIHN3aXRjaCAocGxsc291cmNlKSB7DQotICAgICAgY2FzZSBSQ0NfUExMU09VUkNFX0hTRTogLyogSFNFIHVzZWQgYXMgUExMIGNsb2NrIHNvdXJjZSAqLw0KLSAgICAgICAgcGxsdmNvID0NCi0gICAgICAgICAgICAoSFNFX1ZBTFVFIC8gcGxsbSkgKg0KLSAgICAgICAgICAgIChSRUFEX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTE4pID4+IFJDQ19QTExDRkdSX1BMTE5fUG9zKTsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgUkNDX1BMTFNPVVJDRV9IU0k6IC8qIEhTSSB1c2VkIGFzIFBMTCBjbG9jayBzb3VyY2UgKi8NCi0gICAgICBkZWZhdWx0Og0KLSAgICAgICAgcGxsdmNvID0NCi0gICAgICAgICAgICAoSFNJX1ZBTFVFIC8gcGxsbSkgKg0KLSAgICAgICAgICAgIChSRUFEX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTE4pID4+IFJDQ19QTExDRkdSX1BMTE5fUG9zKTsNCi0gICAgICAgIGJyZWFrOw0KLSAgICB9DQotICAgIHBsbHIgPSAoKFJFQURfQklUKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMUikgPj4gUkNDX1BMTENGR1JfUExMUl9Qb3MpICsNCi0gICAgICAgICAgICAxVSkgKg0KLSAgICAgICAgICAgMlU7DQotICAgIHN5c2Nsb2NrZnJlcSA9IHBsbHZjbyAvIHBsbHI7DQotICB9IGVsc2Ugew0KLSAgICBzeXNjbG9ja2ZyZXEgPSAwVTsNCi0gIH0NCi0NCi0gIHJldHVybiBzeXNjbG9ja2ZyZXE7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmV0dXJuIHRoZSBIQ0xLIGZyZXF1ZW5jeS4NCi0gKiBAbm90ZSAgIEVhY2ggdGltZSBIQ0xLIGNoYW5nZXMsIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgdG8gdXBkYXRlIHRoZQ0KLSAqICAgICAgICAgcmlnaHQgSENMSyB2YWx1ZS4gT3RoZXJ3aXNlLCBhbnkgY29uZmlndXJhdGlvbiBiYXNlZCBvbiB0aGlzIGZ1bmN0aW9uDQotICogd2lsbCBiZSBpbmNvcnJlY3QuDQotICoNCi0gKiBAbm90ZSAgIFRoZSBTeXN0ZW1Db3JlQ2xvY2sgQ01TSVMgdmFyaWFibGUgaXMgdXNlZCB0byBzdG9yZSBTeXN0ZW0gQ2xvY2sNCi0gKiBGcmVxdWVuY3kuDQotICogQHJldHZhbCBIQ0xLIGZyZXF1ZW5jeSBpbiBIeg0KLSAqLw0KLXVpbnQzMl90IEhBTF9SQ0NfR2V0SENMS0ZyZXEodm9pZCkgeyByZXR1cm4gU3lzdGVtQ29yZUNsb2NrOyB9DQotDQotLyoqDQotICogQGJyaWVmICBSZXR1cm4gdGhlIFBDTEsxIGZyZXF1ZW5jeS4NCi0gKiBAbm90ZSAgIEVhY2ggdGltZSBQQ0xLMSBjaGFuZ2VzLCB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHRvIHVwZGF0ZSB0aGUNCi0gKiAgICAgICAgIHJpZ2h0IFBDTEsxIHZhbHVlLiBPdGhlcndpc2UsIGFueSBjb25maWd1cmF0aW9uIGJhc2VkIG9uIHRoaXMNCi0gKiBmdW5jdGlvbiB3aWxsIGJlIGluY29ycmVjdC4NCi0gKiBAcmV0dmFsIFBDTEsxIGZyZXF1ZW5jeSBpbiBIeg0KLSAqLw0KLXVpbnQzMl90IEhBTF9SQ0NfR2V0UENMSzFGcmVxKHZvaWQpIHsNCi0gIC8qIEdldCBIQ0xLIHNvdXJjZSBhbmQgQ29tcHV0ZSBQQ0xLMSBmcmVxdWVuY3kgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0gIHJldHVybiAoSEFMX1JDQ19HZXRIQ0xLRnJlcSgpID4+DQotICAgICAgICAgIChBUEJQcmVzY1RhYmxlW1JFQURfQklUKFJDQy0+Q0ZHUiwgUkNDX0NGR1JfUFBSRTEpID4+DQotICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19DRkdSX1BQUkUxX1Bvc10gJg0KLSAgICAgICAgICAgMHgxRlUpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBSZXR1cm4gdGhlIFBDTEsyIGZyZXF1ZW5jeS4NCi0gKiBAbm90ZSAgIEVhY2ggdGltZSBQQ0xLMiBjaGFuZ2VzLCB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHRvIHVwZGF0ZSB0aGUNCi0gKiAgICAgICAgIHJpZ2h0IFBDTEsyIHZhbHVlLiBPdGhlcndpc2UsIGFueSBjb25maWd1cmF0aW9uIGJhc2VkIG9uIHRoaXMNCi0gKiBmdW5jdGlvbiB3aWxsIGJlIGluY29ycmVjdC4NCi0gKiBAcmV0dmFsIFBDTEsyIGZyZXF1ZW5jeSBpbiBIeg0KLSAqLw0KLXVpbnQzMl90IEhBTF9SQ0NfR2V0UENMSzJGcmVxKHZvaWQpIHsNCi0gIC8qIEdldCBIQ0xLIHNvdXJjZSBhbmQgQ29tcHV0ZSBQQ0xLMiBmcmVxdWVuY3kgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0gIHJldHVybiAoSEFMX1JDQ19HZXRIQ0xLRnJlcSgpID4+DQotICAgICAgICAgIChBUEJQcmVzY1RhYmxlW1JFQURfQklUKFJDQy0+Q0ZHUiwgUkNDX0NGR1JfUFBSRTIpID4+DQotICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19DRkdSX1BQUkUyX1Bvc10gJg0KLSAgICAgICAgICAgMHgxRlUpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDb25maWd1cmUgdGhlIFJDQ19Pc2NJbml0U3RydWN0IGFjY29yZGluZyB0byB0aGUgaW50ZXJuYWwNCi0gKiAgICAgICAgIFJDQyBjb25maWd1cmF0aW9uIHJlZ2lzdGVycy4NCi0gKiBAcGFyYW0gIFJDQ19Pc2NJbml0U3RydWN0ICBwb2ludGVyIHRvIGFuIFJDQ19Pc2NJbml0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdA0KLSAqICAgICAgICAgd2lsbCBiZSBjb25maWd1cmVkLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXZvaWQgSEFMX1JDQ19HZXRPc2NDb25maWcoUkNDX09zY0luaXRUeXBlRGVmICpSQ0NfT3NjSW5pdFN0cnVjdCkgew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShSQ0NfT3NjSW5pdFN0cnVjdCAhPSAodm9pZCAqKU5VTEwpOw0KLQ0KLSAgLyogU2V0IGFsbCBwb3NzaWJsZSB2YWx1ZXMgZm9yIHRoZSBPc2NpbGxhdG9yIHR5cGUgcGFyYW1ldGVyIC0tLS0tLS0tLS0tLS0tLSovDQotICBSQ0NfT3NjSW5pdFN0cnVjdC0+T3NjaWxsYXRvclR5cGUgPQ0KLSAgICAgIFJDQ19PU0NJTExBVE9SVFlQRV9IU0UgfCBSQ0NfT1NDSUxMQVRPUlRZUEVfSFNJIHwgUkNDX09TQ0lMTEFUT1JUWVBFX0xTRSB8DQotICAgICAgUkNDX09TQ0lMTEFUT1JUWVBFX0xTSSB8IFJDQ19PU0NJTExBVE9SVFlQRV9IU0k0ODsNCi0NCi0gIC8qIEdldCB0aGUgSFNFIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSAgaWYgKFJFQURfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0VCWVApID09IFJDQ19DUl9IU0VCWVApIHsNCi0gICAgUkNDX09zY0luaXRTdHJ1Y3QtPkhTRVN0YXRlID0gUkNDX0hTRV9CWVBBU1M7DQotICB9IGVsc2UgaWYgKFJFQURfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0VPTikgPT0gUkNDX0NSX0hTRU9OKSB7DQotICAgIFJDQ19Pc2NJbml0U3RydWN0LT5IU0VTdGF0ZSA9IFJDQ19IU0VfT047DQotICB9IGVsc2Ugew0KLSAgICBSQ0NfT3NjSW5pdFN0cnVjdC0+SFNFU3RhdGUgPSBSQ0NfSFNFX09GRjsNCi0gIH0NCi0NCi0gIC8qIEdldCB0aGUgSFNJIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSAgaWYgKFJFQURfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0lPTikgPT0gUkNDX0NSX0hTSU9OKSB7DQotICAgIFJDQ19Pc2NJbml0U3RydWN0LT5IU0lTdGF0ZSA9IFJDQ19IU0lfT047DQotICB9IGVsc2Ugew0KLSAgICBSQ0NfT3NjSW5pdFN0cnVjdC0+SFNJU3RhdGUgPSBSQ0NfSFNJX09GRjsNCi0gIH0NCi0NCi0gIFJDQ19Pc2NJbml0U3RydWN0LT5IU0lDYWxpYnJhdGlvblZhbHVlID0NCi0gICAgICBSRUFEX0JJVChSQ0MtPklDU0NSLCBSQ0NfSUNTQ1JfSFNJVFJJTSkgPj4gUkNDX0lDU0NSX0hTSVRSSU1fUG9zOw0KLQ0KLSAgLyogR2V0IHRoZSBMU0UgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotICBpZiAoUkVBRF9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9MU0VCWVApID09IFJDQ19CRENSX0xTRUJZUCkgew0KLSAgICBSQ0NfT3NjSW5pdFN0cnVjdC0+TFNFU3RhdGUgPSBSQ0NfTFNFX0JZUEFTUzsNCi0gIH0gZWxzZSBpZiAoUkVBRF9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9MU0VPTikgPT0gUkNDX0JEQ1JfTFNFT04pIHsNCi0gICAgUkNDX09zY0luaXRTdHJ1Y3QtPkxTRVN0YXRlID0gUkNDX0xTRV9PTjsNCi0gIH0gZWxzZSB7DQotICAgIFJDQ19Pc2NJbml0U3RydWN0LT5MU0VTdGF0ZSA9IFJDQ19MU0VfT0ZGOw0KLSAgfQ0KLQ0KLSAgLyogR2V0IHRoZSBMU0kgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotICBpZiAoUkVBRF9CSVQoUkNDLT5DU1IsIFJDQ19DU1JfTFNJT04pID09IFJDQ19DU1JfTFNJT04pIHsNCi0gICAgUkNDX09zY0luaXRTdHJ1Y3QtPkxTSVN0YXRlID0gUkNDX0xTSV9PTjsNCi0gIH0gZWxzZSB7DQotICAgIFJDQ19Pc2NJbml0U3RydWN0LT5MU0lTdGF0ZSA9IFJDQ19MU0lfT0ZGOw0KLSAgfQ0KLQ0KLSAgLyogR2V0IHRoZSBIU0k0OCBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotICBpZiAoUkVBRF9CSVQoUkNDLT5DUlJDUiwgUkNDX0NSUkNSX0hTSTQ4T04pID09IFJDQ19DUlJDUl9IU0k0OE9OKSB7DQotICAgIFJDQ19Pc2NJbml0U3RydWN0LT5IU0k0OFN0YXRlID0gUkNDX0hTSTQ4X09OOw0KLSAgfSBlbHNlIHsNCi0gICAgUkNDX09zY0luaXRTdHJ1Y3QtPkhTSTQ4U3RhdGUgPSBSQ0NfSFNJNDhfT0ZGOw0KLSAgfQ0KLQ0KLSAgLyogR2V0IHRoZSBQTEwgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotICBpZiAoUkVBRF9CSVQoUkNDLT5DUiwgUkNDX0NSX1BMTE9OKSA9PSBSQ0NfQ1JfUExMT04pIHsNCi0gICAgUkNDX09zY0luaXRTdHJ1Y3QtPlBMTC5QTExTdGF0ZSA9IFJDQ19QTExfT047DQotICB9IGVsc2Ugew0KLSAgICBSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTFN0YXRlID0gUkNDX1BMTF9PRkY7DQotICB9DQotICBSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTFNvdXJjZSA9IFJFQURfQklUKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMU1JDKTsNCi0gIFJDQ19Pc2NJbml0U3RydWN0LT5QTEwuUExMTSA9DQotICAgICAgKFJFQURfQklUKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMTSkgPj4gUkNDX1BMTENGR1JfUExMTV9Qb3MpICsgMVU7DQotICBSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTE4gPQ0KLSAgICAgIFJFQURfQklUKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMTikgPj4gUkNDX1BMTENGR1JfUExMTl9Qb3M7DQotICBSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTFEgPQ0KLSAgICAgICgoKFJFQURfQklUKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMUSkgPj4gUkNDX1BMTENGR1JfUExMUV9Qb3MpICsgMVUpDQotICAgICAgIDw8IDFVKTsNCi0gIFJDQ19Pc2NJbml0U3RydWN0LT5QTEwuUExMUiA9DQotICAgICAgKCgoUkVBRF9CSVQoUkNDLT5QTExDRkdSLCBSQ0NfUExMQ0ZHUl9QTExSKSA+PiBSQ0NfUExMQ0ZHUl9QTExSX1BvcykgKyAxVSkNCi0gICAgICAgPDwgMVUpOw0KLSAgUkNDX09zY0luaXRTdHJ1Y3QtPlBMTC5QTExQID0NCi0gICAgICBSRUFEX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTFBESVYpID4+IFJDQ19QTExDRkdSX1BMTFBESVZfUG9zOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgUkNDX0Nsa0luaXRTdHJ1Y3QgYWNjb3JkaW5nIHRvIHRoZSBpbnRlcm5hbA0KLSAqICAgICAgICAgUkNDIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzLg0KLSAqIEBwYXJhbSAgUkNDX0Nsa0luaXRTdHJ1Y3QgIHBvaW50ZXIgdG8gYW4gUkNDX0Nsa0luaXRUeXBlRGVmIHN0cnVjdHVyZSB0aGF0DQotICogICAgICAgICB3aWxsIGJlIGNvbmZpZ3VyZWQuDQotICogQHBhcmFtICBwRkxhdGVuY3kgIFBvaW50ZXIgb24gdGhlIEZsYXNoIExhdGVuY3kuDQotICogQHJldHZhbCBOb25lDQotICovDQotdm9pZCBIQUxfUkNDX0dldENsb2NrQ29uZmlnKFJDQ19DbGtJbml0VHlwZURlZiAqUkNDX0Nsa0luaXRTdHJ1Y3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwRkxhdGVuY3kpIHsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oUkNDX0Nsa0luaXRTdHJ1Y3QgIT0gKHZvaWQgKilOVUxMKTsNCi0gIGFzc2VydF9wYXJhbShwRkxhdGVuY3kgIT0gKHZvaWQgKilOVUxMKTsNCi0NCi0gIC8qIFNldCBhbGwgcG9zc2libGUgdmFsdWVzIGZvciB0aGUgQ2xvY2sgdHlwZSBwYXJhbWV0ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSAgUkNDX0Nsa0luaXRTdHJ1Y3QtPkNsb2NrVHlwZSA9IFJDQ19DTE9DS1RZUEVfU1lTQ0xLIHwgUkNDX0NMT0NLVFlQRV9IQ0xLIHwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NfQ0xPQ0tUWVBFX1BDTEsxIHwgUkNDX0NMT0NLVFlQRV9QQ0xLMjsNCi0NCi0gIC8qIEdldCB0aGUgU1lTQ0xLIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSAgUkNDX0Nsa0luaXRTdHJ1Y3QtPlNZU0NMS1NvdXJjZSA9IFJFQURfQklUKFJDQy0+Q0ZHUiwgUkNDX0NGR1JfU1cpOw0KLQ0KLSAgLyogR2V0IHRoZSBIQ0xLIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotICBSQ0NfQ2xrSW5pdFN0cnVjdC0+QUhCQ0xLRGl2aWRlciA9IFJFQURfQklUKFJDQy0+Q0ZHUiwgUkNDX0NGR1JfSFBSRSk7DQotDQotICAvKiBHZXQgdGhlIEFQQjEgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0gIFJDQ19DbGtJbml0U3RydWN0LT5BUEIxQ0xLRGl2aWRlciA9IFJFQURfQklUKFJDQy0+Q0ZHUiwgUkNDX0NGR1JfUFBSRTEpOw0KLQ0KLSAgLyogR2V0IHRoZSBBUEIyIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotICBSQ0NfQ2xrSW5pdFN0cnVjdC0+QVBCMkNMS0RpdmlkZXIgPQ0KLSAgICAgIChSRUFEX0JJVChSQ0MtPkNGR1IsIFJDQ19DRkdSX1BQUkUyKSA+PiAzVSk7DQotDQotICAvKiBHZXQgdGhlIEZsYXNoIFdhaXQgU3RhdGUgKExhdGVuY3kpIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0gICpwRkxhdGVuY3kgPSBfX0hBTF9GTEFTSF9HRVRfTEFURU5DWSgpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSB0aGUgQ2xvY2sgU2VjdXJpdHkgU3lzdGVtLg0KLSAqIEBub3RlICAgSWYgYSBmYWlsdXJlIGlzIGRldGVjdGVkIG9uIHRoZSBIU0Ugb3NjaWxsYXRvciBjbG9jaywgdGhpcyBvc2NpbGxhdG9yDQotICogICAgICAgICBpcyBhdXRvbWF0aWNhbGx5IGRpc2FibGVkIGFuZCBhbiBpbnRlcnJ1cHQgaXMgZ2VuZXJhdGVkIHRvIGluZm9ybSB0aGUNCi0gKiAgICAgICAgIHNvZnR3YXJlIGFib3V0IHRoZSBmYWlsdXJlIChDbG9jayBTZWN1cml0eSBTeXN0ZW0gSW50ZXJydXB0LCBDU1NJKSwNCi0gKiAgICAgICAgIGFsbG93aW5nIHRoZSBNQ1UgdG8gcGVyZm9ybSByZXNjdWUgb3BlcmF0aW9ucy4gVGhlIENTU0kgaXMgbGlua2VkIHRvDQotICogICAgICAgICB0aGUgQ29ydGV4LU00IE5NSSAoTm9uLU1hc2thYmxlIEludGVycnVwdCkgZXhjZXB0aW9uIHZlY3Rvci4NCi0gKiBAbm90ZSAgIFRoZSBDbG9jayBTZWN1cml0eSBTeXN0ZW0gY2FuIG9ubHkgYmUgY2xlYXJlZCBieSByZXNldC4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi12b2lkIEhBTF9SQ0NfRW5hYmxlQ1NTKHZvaWQpIHsgU0VUX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfQ1NTT04pOyB9DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgdGhlIExTRSBDbG9jayBTZWN1cml0eSBTeXN0ZW0uDQotICogQG5vdGUgICBJZiBhIGZhaWx1cmUgaXMgZGV0ZWN0ZWQgb24gdGhlIGV4dGVybmFsIDMyIGtIeiBvc2NpbGxhdG9yLA0KLSAqICAgICAgICAgdGhlIExTRSBjbG9jayBpcyBubyBsb25nZXIgc3VwcGxpZWQgdG8gdGhlIFJUQyBidXQgbm8gaGFyZHdhcmUgYWN0aW9uDQotICogICAgICAgICBpcyBtYWRlIHRvIHRoZSByZWdpc3RlcnMuIElmIGVuYWJsZWQsIGFuIGludGVycnVwdCB3aWxsIGJlIGdlbmVyYXRlZA0KLSAqICAgICAgICAgYW5kIGhhbmRsZSB0aHJvdWdoIEByZWYgUkNDRXhfRVhUSV9MSU5FX0xTRUNTUw0KLSAqIEBub3RlICAgVGhlIENsb2NrIFNlY3VyaXR5IFN5c3RlbSBjYW4gb25seSBiZSBjbGVhcmVkIGJ5IHJlc2V0IG9yIGFmdGVyIGEgTFNFDQotICogZmFpbHVyZSBkZXRlY3Rpb24uDQotICogQHJldHZhbCBOb25lDQotICovDQotdm9pZCBIQUxfUkNDX0VuYWJsZUxTRUNTUyh2b2lkKSB7IFNFVF9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9MU0VDU1NPTik7IH0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgdGhlIExTRSBDbG9jayBTZWN1cml0eSBTeXN0ZW0uDQotICogQG5vdGUgICBBZnRlciBMU0UgZmFpbHVyZSBkZXRlY3Rpb24sIHRoZSBzb2Z0d2FyZSBtdXN0IGRpc2FibGUgTFNFQ1NTT04NCi0gKiBAbm90ZSAgIFRoZSBDbG9jayBTZWN1cml0eSBTeXN0ZW0gY2FuIG9ubHkgYmUgY2xlYXJlZCBieSByZXNldCBvdGhlcndpc2UuDQotICogQHJldHZhbCBOb25lDQotICovDQotdm9pZCBIQUxfUkNDX0Rpc2FibGVMU0VDU1Modm9pZCkgeyBDTEVBUl9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9MU0VDU1NPTik7IH0NCi0NCi0vKioNCi0gKiBAYnJpZWYgSGFuZGxlIHRoZSBSQ0MgQ2xvY2sgU2VjdXJpdHkgU3lzdGVtIGludGVycnVwdCByZXF1ZXN0Lg0KLSAqIEBub3RlIFRoaXMgQVBJIHNob3VsZCBiZSBjYWxsZWQgdW5kZXIgdGhlIE5NSV9IYW5kbGVyKCkuDQotICogQHJldHZhbCBOb25lDQotICovDQotdm9pZCBIQUxfUkNDX05NSV9JUlFIYW5kbGVyKHZvaWQpIHsNCi0gIC8qIENoZWNrIFJDQyBDU1NGIGludGVycnVwdCBmbGFnICAqLw0KLSAgaWYgKF9fSEFMX1JDQ19HRVRfSVQoUkNDX0lUX0NTUykpIHsNCi0gICAgLyogUkNDIENsb2NrIFNlY3VyaXR5IFN5c3RlbSBpbnRlcnJ1cHQgdXNlciBjYWxsYmFjayAqLw0KLSAgICBIQUxfUkNDX0NTU0NhbGxiYWNrKCk7DQotDQotICAgIC8qIENsZWFyIFJDQyBDU1MgcGVuZGluZyBiaXQgKi8NCi0gICAgX19IQUxfUkNDX0NMRUFSX0lUKFJDQ19JVF9DU1MpOw0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJDQyBDbG9jayBTZWN1cml0eSBTeXN0ZW0gaW50ZXJydXB0IGNhbGxiYWNrLg0KLSAqIEByZXR2YWwgbm9uZQ0KLSAqLw0KLV9fd2VhayB2b2lkIEhBTF9SQ0NfQ1NTQ2FsbGJhY2sodm9pZCkgew0KLSAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLA0KLSAgICAgICAgICAgIHRoZSBIQUxfUkNDX0NTU0NhbGxiYWNrIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlDQotICAgKi8NCi19DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBhZGR0b2dyb3VwIFJDQ19Qcml2YXRlX0Z1bmN0aW9ucw0KLSAqIEB7DQotICovDQotDQotLyoqDQotICogQGJyaWVmICBDb21wdXRlIFNZU0NMSyBmcmVxdWVuY3kgYmFzZWQgb24gUExMIFNZU0NMSyBzb3VyY2UuDQotICogQHJldHZhbCBTWVNDTEsgZnJlcXVlbmN5DQotICovDQotc3RhdGljIHVpbnQzMl90IFJDQ19HZXRTeXNDbG9ja0ZyZXFGcm9tUExMU291cmNlKHZvaWQpIHsNCi0gIHVpbnQzMl90IHBsbHZjbywgcGxsc291cmNlLCBwbGxyLCBwbGxtOw0KLSAgdWludDMyX3Qgc3lzY2xvY2tmcmVxOw0KLQ0KLSAgLyogUExMX1ZDTyA9IChIU0VfVkFMVUUgb3IgSFNJX1ZBTFVFLyBQTExNKSAqIFBMTE4NCi0gICAgIFNZU0NMSyA9IFBMTF9WQ08gLyBQTExSDQotICAgKi8NCi0gIHBsbHNvdXJjZSA9IFJFQURfQklUKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMU1JDKTsNCi0gIHBsbG0gPQ0KLSAgICAgIChSRUFEX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTE0pID4+IFJDQ19QTExDRkdSX1BMTE1fUG9zKSArIDFVOw0KLQ0KLSAgc3dpdGNoIChwbGxzb3VyY2UpIHsNCi0gICAgY2FzZSBSQ0NfUExMU09VUkNFX0hTRTogLyogSFNFIHVzZWQgYXMgUExMIGNsb2NrIHNvdXJjZSAqLw0KLSAgICAgIHBsbHZjbyA9IChIU0VfVkFMVUUgLyBwbGxtKSAqIChSRUFEX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTE4pID4+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19QTExDRkdSX1BMTE5fUG9zKTsNCi0gICAgICBicmVhazsNCi0NCi0gICAgY2FzZSBSQ0NfUExMU09VUkNFX0hTSTogLyogSFNJIHVzZWQgYXMgUExMIGNsb2NrIHNvdXJjZSAqLw0KLSAgICBkZWZhdWx0Og0KLSAgICAgIHBsbHZjbyA9IChIU0lfVkFMVUUgLyBwbGxtKSAqIChSRUFEX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTE4pID4+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19QTExDRkdSX1BMTE5fUG9zKTsNCi0gICAgICBicmVhazsNCi0gIH0NCi0NCi0gIHBsbHIgPSAoKFJFQURfQklUKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMUikgPj4gUkNDX1BMTENGR1JfUExMUl9Qb3MpICsNCi0gICAgICAgICAgMVUpICoNCi0gICAgICAgICAyVTsNCi0gIHN5c2Nsb2NrZnJlcSA9IHBsbHZjbyAvIHBsbHI7DQotDQotICByZXR1cm4gc3lzY2xvY2tmcmVxOw0KLX0NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLSNlbmRpZiAvKiBIQUxfUkNDX01PRFVMRV9FTkFCTEVEICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmc0eHhfaGFsX3JjYy5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBSQ0MgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgUmVzZXQgYW5kIENsb2NrIENvbnRyb2wgKFJDQykgcGVyaXBoZXJhbDoKKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqCisgIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBSQ0Mgc3BlY2lmaWMgZmVhdHVyZXMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgQWZ0ZXIgcmVzZXQgdGhlIGRldmljZSBpcyBydW5uaW5nIGZyb20gSGlnaCBTcGVlZCBJbnRlcm5hbCBvc2NpbGxhdG9yCisgICAgICAoMTYgTUh6KSB3aXRoIEZsYXNoIDAgd2FpdCBzdGF0ZS4gRmxhc2ggcHJlZmV0Y2ggYnVmZmVyLCBELUNhY2hlCisgICAgICBhbmQgSS1DYWNoZSBhcmUgZGlzYWJsZWQsIGFuZCBhbGwgcGVyaXBoZXJhbHMgYXJlIG9mZiBleGNlcHQgaW50ZXJuYWwKKyAgICAgIFNSQU0sIEZsYXNoIGFuZCBKVEFHLgorCisgICAgICAoKykgVGhlcmUgaXMgbm8gcHJlc2NhbGVyIG9uIEhpZ2ggc3BlZWQgKEFIQnMpIGFuZCBMb3cgc3BlZWQgKEFQQnMpIGJ1c2VzOgorICAgICAgICAgIGFsbCBwZXJpcGhlcmFscyBtYXBwZWQgb24gdGhlc2UgYnVzZXMgYXJlIHJ1bm5pbmcgYXQgSFNJIHNwZWVkLgorICAgICAgKCspIFRoZSBjbG9jayBmb3IgYWxsIHBlcmlwaGVyYWxzIGlzIHN3aXRjaGVkIG9mZiwgZXhjZXB0IHRoZSBTUkFNIGFuZAorICBGTEFTSC4KKyAgICAgICgrKSBBbGwgR1BJT3MgYXJlIGluIGFuYWxvZyBtb2RlLCBleGNlcHQgdGhlIEpUQUcgcGlucyB3aGljaAorICAgICAgICAgIGFyZSBhc3NpZ25lZCB0byBiZSB1c2VkIGZvciBkZWJ1ZyBwdXJwb3NlLgorCisgICAgWy4uXQorICAgICAgT25jZSB0aGUgZGV2aWNlIHN0YXJ0ZWQgZnJvbSByZXNldCwgdGhlIHVzZXIgYXBwbGljYXRpb24gaGFzIHRvOgorICAgICAgKCspIENvbmZpZ3VyZSB0aGUgY2xvY2sgc291cmNlIHRvIGJlIHVzZWQgdG8gZHJpdmUgdGhlIFN5c3RlbSBjbG9jaworICAgICAgICAgIChpZiB0aGUgYXBwbGljYXRpb24gbmVlZHMgaGlnaGVyIGZyZXF1ZW5jeS9wZXJmb3JtYW5jZSkKKyAgICAgICgrKSBDb25maWd1cmUgdGhlIFN5c3RlbSBjbG9jayBmcmVxdWVuY3kgYW5kIEZsYXNoIHNldHRpbmdzCisgICAgICAoKykgQ29uZmlndXJlIHRoZSBBSEIgYW5kIEFQQiBidXNlcyBwcmVzY2FsZXJzCisgICAgICAoKykgRW5hYmxlIHRoZSBjbG9jayBmb3IgdGhlIHBlcmlwaGVyYWwocykgdG8gYmUgdXNlZAorICAgICAgKCspIENvbmZpZ3VyZSB0aGUgY2xvY2sgc291cmNlKHMpIGZvciBwZXJpcGhlcmFscyB3aGljaCBjbG9ja3MgYXJlIG5vdAorICAgICAgICAgIGRlcml2ZWQgZnJvbSB0aGUgU3lzdGVtIGNsb2NrIChVU0IsIFJORywgVVNBUlQsIExQVUFSVCwgRkRDQU4sIHNvbWUKKyAgVElNRVJzLCBVQ1BELCBJMlMsIEkyQywgTFBUSU0sIEFEQywgUVNQSSkKKworICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0ZXJtcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlCisgIGluCisgICogdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc29mdHdhcmUgY29tcG9uZW50LgorICAqIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcyB3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmc0eHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkc0eHhfSEFMX0RyaXZlcgorICogQHsKKyAqLworCisvKiogQGRlZmdyb3VwIFJDQyBSQ0MKKyAqIEBicmllZiBSQ0MgSEFMIG1vZHVsZSBkcml2ZXIKKyAqIEB7CisgKi8KKworI2lmZGVmIEhBTF9SQ0NfTU9EVUxFX0VOQUJMRUQKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJDQ19Qcml2YXRlX0NvbnN0YW50cyBSQ0MgUHJpdmF0ZSBDb25zdGFudHMKKyAqIEB7CisgKi8KKyNkZWZpbmUgSFNFX1RJTUVPVVRfVkFMVUUgSFNFX1NUQVJUVVBfVElNRU9VVAorI2RlZmluZSBIU0lfVElNRU9VVF9WQUxVRSAyVSAgICAgICAgICAgIC8qIDIgbXMgKG1pbmltdW0gVGljayArIDEpICovCisjZGVmaW5lIExTSV9USU1FT1VUX1ZBTFVFIDJVICAgICAgICAgICAgLyogMiBtcyAobWluaW11bSBUaWNrICsgMSkgKi8KKyNkZWZpbmUgSFNJNDhfVElNRU9VVF9WQUxVRSAyVSAgICAgICAgICAvKiAyIG1zIChtaW5pbXVtIFRpY2sgKyAxKSAqLworI2RlZmluZSBQTExfVElNRU9VVF9WQUxVRSAyVSAgICAgICAgICAgIC8qIDIgbXMgKG1pbmltdW0gVGljayArIDEpICovCisjZGVmaW5lIENMT0NLU1dJVENIX1RJTUVPVVRfVkFMVUUgNTAwMFUgLyogNSBzICAgICovCisvKioKKyAqIEB9CisgKi8KKworLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUkNDX1ByaXZhdGVfTWFjcm9zIFJDQyBQcml2YXRlIE1hY3JvcworICogQHsKKyAqLworI2RlZmluZSBSQ0NfR0VUX01DT19HUElPX1BJTihfX1JDQ19NQ094X18pICgoX19SQ0NfTUNPeF9fKSAmIEdQSU9fUElOX01BU0spCisKKyNkZWZpbmUgUkNDX0dFVF9NQ09fR1BJT19BRihfX1JDQ19NQ094X18pIFwKKyAgKCgoX19SQ0NfTUNPeF9fKSAmIFJDQ19NQ09fR1BJT0FGX01BU0spID4+IFJDQ19NQ09fR1BJT0FGX1BPUykKKworI2RlZmluZSBSQ0NfR0VUX01DT19HUElPX0lOREVYKF9fUkNDX01DT3hfXykgXAorICAoKChfX1JDQ19NQ094X18pICYgUkNDX01DT19HUElPUE9SVF9NQVNLKSA+PiBSQ0NfTUNPX0dQSU9QT1JUX1BPUykKKworI2RlZmluZSBSQ0NfR0VUX01DT19HUElPX1BPUlQoX19SQ0NfTUNPeF9fKSBcCisgIChBSEIyUEVSSVBIX0JBU0UgKyAoKDB4MDAwMDA0MDBVTCkgKiBSQ0NfR0VUX01DT19HUElPX0lOREVYKF9fUkNDX01DT3hfXykpKQorCisjZGVmaW5lIFJDQ19QTExfT1NDU09VUkNFX0NPTkZJRyhfX0hBTF9SQ0NfUExMU09VUkNFX18pIFwKKyAgKE1PRElGWV9SRUcoUkNDLT5QTExDRkdSLCBSQ0NfUExMQ0ZHUl9QTExTUkMsIChfX0hBTF9SQ0NfUExMU09VUkNFX18pKSkKKy8qKgorICogQH0KKyAqLworCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBSQ0NfUHJpdmF0ZV9GdW5jdGlvbnMgUkNDIFByaXZhdGUgRnVuY3Rpb25zCisgKiBAeworICovCitzdGF0aWMgdWludDMyX3QgUkNDX0dldFN5c0Nsb2NrRnJlcUZyb21QTExTb3VyY2Uodm9pZCk7CisvKioKKyAqIEB9CisgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBSQ0NfRXhwb3J0ZWRfRnVuY3Rpb25zIFJDQyBFeHBvcnRlZCBGdW5jdGlvbnMKKyAqIEB7CisgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24KKyBmdW5jdGlvbnMKKyAgKiAgQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICAqCisgIEB2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGNvbmZpZ3VyZSB0aGUgaW50ZXJuYWwgYW5kCisgZXh0ZXJuYWwgb3NjaWxsYXRvcnMgKEhTRSwgSFNJLCBMU0UsIExTSSwgUExMLCBDU1MgYW5kIE1DTykgYW5kIHRoZSBTeXN0ZW0KKyBidXNlcyBjbG9ja3MgKFNZU0NMSywgQUhCLCBBUEIxIGFuZCBBUEIyKS4KKworICAgIFsuLl0gSW50ZXJuYWwvZXh0ZXJuYWwgY2xvY2sgYW5kIFBMTCBjb25maWd1cmF0aW9uCisgICAgICAgICAoKykgSFNJIChoaWdoLXNwZWVkIGludGVybmFsKTogMTYgTUh6IGZhY3RvcnktdHJpbW1lZCBSQyB1c2VkIGRpcmVjdGx5Cisgb3IgdGhyb3VnaCB0aGUgUExMIGFzIFN5c3RlbSBjbG9jayBzb3VyY2UuCisKKyAgICAgICAgICgrKSBMU0kgKGxvdy1zcGVlZCBpbnRlcm5hbCk6IDMyIEtIeiBsb3cgY29uc3VtcHRpb24gUkMgdXNlZCBhcyBJV0RHCisgYW5kL29yIFJUQyBjbG9jayBzb3VyY2UuCisKKyAgICAgICAgICgrKSBIU0UgKGhpZ2gtc3BlZWQgZXh0ZXJuYWwpOiA0IHRvIDQ4IE1IeiBjcnlzdGFsIG9zY2lsbGF0b3IgdXNlZAorIGRpcmVjdGx5IG9yIHRocm91Z2ggdGhlIFBMTCBhcyBTeXN0ZW0gY2xvY2sgc291cmNlLiBDYW4gYmUgdXNlZCBhbHNvIG9wdGlvbmFsbHkKKyBhcyBSVEMgY2xvY2sgc291cmNlLgorCisgICAgICAgICAoKykgTFNFIChsb3ctc3BlZWQgZXh0ZXJuYWwpOiAzMi43NjggS0h6IG9zY2lsbGF0b3IgdXNlZCBvcHRpb25hbGx5IGFzCisgUlRDIGNsb2NrIHNvdXJjZS4KKworICAgICAgICAgKCspIFBMTCAoY2xvY2tlZCBieSBIU0ksIEhTRSkgcHJvdmlkaW5nIHVwIHRvIHRocmVlIGluZGVwZW5kZW50IG91dHB1dAorIGNsb2NrczoKKyAgICAgICAgICAgKCsrKSBUaGUgZmlyc3Qgb3V0cHV0IGlzIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGhpZ2ggc3BlZWQgc3lzdGVtIGNsb2NrCisgKHVwIHRvIDE3MCBNSHopLgorICAgICAgICAgICAoKyspIFRoZSBzZWNvbmQgb3V0cHV0IGlzIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGNsb2NrIGZvciB0aGUgVVNCICg0OAorIE1IeiksIHRoZSBRU1BJICg8PSA0OCBNSHopLCB0aGUgRkRDQU4sIHRoZSBTQUkgYW5kIHRoZSBJMlMuCisgICAgICAgICAgICgrKykgVGhlIHRoaXJkIG91dHB1dCBpcyB1c2VkIHRvIGdlbmVyYXRlIGEgY2xvY2sgZm9yIEFEQworCisgICAgICAgICAoKykgQ1NTIChDbG9jayBzZWN1cml0eSBzeXN0ZW0pOiBvbmNlIGVuYWJsZWQsIGlmIGEgSFNFIGNsb2NrIGZhaWx1cmUKKyBvY2N1cnMgKEhTRSB1c2VkIGRpcmVjdGx5IG9yIHRocm91Z2ggUExMIGFzIFN5c3RlbSBjbG9jayBzb3VyY2UpLCB0aGUgU3lzdGVtCisgY2xvY2sgaXMgYXV0b21hdGljYWxseSBzd2l0Y2hlZCB0byBIU0kgYW5kIGFuIGludGVycnVwdCBpcyBnZW5lcmF0ZWQgaWYKKyBlbmFibGVkLiBUaGUgaW50ZXJydXB0IGlzIGxpbmtlZCB0byB0aGUgQ29ydGV4LU00IE5NSSAoTm9uLU1hc2thYmxlIEludGVycnVwdCkKKyAgICAgICAgICAgICBleGNlcHRpb24gdmVjdG9yLgorCisgICAgICAgICAoKykgTUNPIChtaWNyb2NvbnRyb2xsZXIgY2xvY2sgb3V0cHV0KTogdXNlZCB0byBvdXRwdXQgTFNJLCBIU0ksIExTRSwKKyBIU0UsIG1haW4gUExMIGNsb2NrLCBzeXN0ZW0gY2xvY2sgb3IgUkM0OCBjbG9jayAodGhyb3VnaCBhIGNvbmZpZ3VyYWJsZQorIHByZXNjYWxlcikgb24gUEE4IHBpbi4KKworICAgIFsuLl0gU3lzdGVtLCBBSEIgYW5kIEFQQiBidXNlcyBjbG9ja3MgY29uZmlndXJhdGlvbgorICAgICAgICAgKCspIFNldmVyYWwgY2xvY2sgc291cmNlcyBjYW4gYmUgdXNlZCB0byBkcml2ZSB0aGUgU3lzdGVtIGNsb2NrCisgKFNZU0NMSyk6IEhTSSwgSFNFIGFuZCBtYWluIFBMTC4gVGhlIEFIQiBjbG9jayAoSENMSykgaXMgZGVyaXZlZCBmcm9tIFN5c3RlbQorIGNsb2NrIHRocm91Z2ggY29uZmlndXJhYmxlIHByZXNjYWxlciBhbmQgdXNlZCB0byBjbG9jayB0aGUgQ1BVLCBtZW1vcnkgYW5kCisgcGVyaXBoZXJhbHMgbWFwcGVkIG9uIEFIQiBidXMgKERNQSwgR1BJTy4uLikuIEFQQjEgKFBDTEsxKSBhbmQgQVBCMiAoUENMSzIpCisgY2xvY2tzIGFyZSBkZXJpdmVkIGZyb20gQUhCIGNsb2NrIHRocm91Z2ggY29uZmlndXJhYmxlIHByZXNjYWxlcnMgYW5kIHVzZWQgdG8KKyBjbG9jayB0aGUgcGVyaXBoZXJhbHMgbWFwcGVkIG9uIHRoZXNlIGJ1c2VzLiBZb3UgY2FuIHVzZQorICAgICAgICAgICAgICJIQUxfUkNDX0dldFN5c0Nsb2NrRnJlcSgpIiBmdW5jdGlvbiB0byByZXRyaWV2ZSB0aGUgZnJlcXVlbmNpZXMgb2YKKyB0aGVzZSBjbG9ja3MuCisKKyAgICAgICAgIC1ALSBBbGwgdGhlIHBlcmlwaGVyYWwgY2xvY2tzIGFyZSBkZXJpdmVkIGZyb20gdGhlIFN5c3RlbSBjbG9jaworIChTWVNDTEspIGV4Y2VwdDoKKworICAgICAgICAgICAoK0ApIFJUQzogdGhlIFJUQyBjbG9jayBjYW4gYmUgZGVyaXZlZCBlaXRoZXIgZnJvbSB0aGUgTFNJLCBMU0Ugb3IKKyBIU0UgY2xvY2sgZGl2aWRlZCBieSAyIHRvIDMxLiBZb3UgaGF2ZSB0byB1c2UgX19IQUxfUkNDX1JUQ19FTkFCTEUoKSBhbmQKKyBIQUxfUkNDRXhfUGVyaXBoQ0xLQ29uZmlnKCkgZnVuY3Rpb24gdG8gY29uZmlndXJlIHRoaXMgY2xvY2suCisgICAgICAgICAgICgrQCkgVVNCIEZTIGFuZCBSTkc6IFVTQiBGUyByZXF1aXJlcyBhIGZyZXF1ZW5jeSBlcXVhbCB0byA0OCBNSHoKKyAgICAgICAgICAgICAgICB0byB3b3JrIGNvcnJlY3RseSwgd2hpbGUgdGhlIFJORyBwZXJpcGhlcmFsIHJlcXVpcmVzIGEgZnJlcXVlbmN5CisgICAgICAgICAgICAgICAgZXF1YWwgb3IgbG93ZXIgdGhhbiB0byA0OCBNSHouIFRoaXMgY2xvY2sgaXMgZGVyaXZlZCBvZiB0aGUgbWFpbgorIFBMTCB0aHJvdWdoIFBMTFEgZGl2aWRlci4gWW91IGhhdmUgdG8gZW5hYmxlIHRoZSBwZXJpcGhlcmFsIGNsb2NrIGFuZCB1c2UKKyAgICAgICAgICAgICAgICBIQUxfUkNDRXhfUGVyaXBoQ0xLQ29uZmlnKCkgZnVuY3Rpb24gdG8gY29uZmlndXJlIHRoaXMgY2xvY2suCisgICAgICAgICAgICgrQCkgSVdERyBjbG9jayB3aGljaCBpcyBhbHdheXMgdGhlIExTSSBjbG9jay4KKworCisgICAgICAgICAoKykgVGhlIG1heGltdW0gZnJlcXVlbmN5IG9mIHRoZSBTWVNDTEssIEhDTEssIFBDTEsxIGFuZCBQQ0xLMiBpcyAxNzAKKyBNSHouIFRoZSBjbG9jayBzb3VyY2UgZnJlcXVlbmN5IHNob3VsZCBiZSBhZGFwdGVkIGRlcGVuZGluZyBvbiB0aGUgZGV2aWNlCisgdm9sdGFnZSByYW5nZSBhcyBsaXN0ZWQgaW4gdGhlIFJlZmVyZW5jZSBNYW51YWwgIkNsb2NrIHNvdXJjZSBmcmVxdWVuY3kgdmVyc3VzCisgdm9sdGFnZSBzY2FsaW5nIiBjaGFwdGVyLgorCisgIEBlbmR2ZXJiYXRpbQorCisgICAgICAgICAgIFRhYmxlIDEuIEhDTEsgY2xvY2sgZnJlcXVlbmN5IGZvciBTVE0zMkc0eHggZGV2aWNlcworICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAgICAgfCBMYXRlbmN5ICAgICAgICAgfCAgICAgICAgICAgIEhDTEsgY2xvY2sgZnJlcXVlbmN5IChNSHopIHwgfAorIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCB8IHwgIHZvbHRhZ2UgcmFuZ2UKKyAxICB8ICB2b2x0YWdlIHJhbmdlIDEgIHwgdm9sdGFnZSByYW5nZSAyICB8IHwgICAgICAgICAgICAgICAgIHwgYm9vc3QgbW9kZSAxLjI4CisgViB8IG5vcm1hbCBtb2RlIDEuMiBWIHwgICAgIDEuMCBWICAgICAgICB8CisgICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tfAorICAgICAgICAgICB8MFdTKDEgQ1BVIGN5Y2xlcyl8ICAgIEhDTEsgPD0gMzQgICAgIHwgICAgSENMSyA8PSAzMCAgICAgfCAgICBIQ0xLCisgPD0gMTMgICAgfAorICAgICAgICAgICB8LS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICAgICAgICAgfDFXUygyIENQVSBjeWNsZXMpfCAgICBIQ0xLIDw9IDY4ICAgICB8ICAgIEhDTEsgPD0gNjAgICAgIHwgICAgSENMSworIDw9IDI2ICAgIHwKKyAgICAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS18CisgICAgICAgICAgIHwyV1MoMyBDUFUgY3ljbGVzKXwgICAgSENMSyA8PSAxMDIgICAgfCAgICBIQ0xLIDw9IDkwICAgICB8ICAgICAgICAtCisgfAorICAgICAgICAgICB8LS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICAgICAgICAgfDNXUyg0IENQVSBjeWNsZXMpfCAgICBIQ0xLIDw9IDEzNiAgICB8ICAgIEhDTEsgPD0gMTIwICAgIHwgICAgICAgIC0KKyB8CisgICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tfAorICAgICAgICAgICB8NFdTKDUgQ1BVIGN5Y2xlcyl8ICAgIEhDTEsgPD0gMTcwICAgIHwgICAgSENMSyA8PSAxNTAgICAgfCAgICAgICAgLQorIHwKKyAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisKKyAgKiBAeworICAqLworCisvKioKKyAqIEBicmllZiAgUmVzZXQgdGhlIFJDQyBjbG9jayBjb25maWd1cmF0aW9uIHRvIHRoZSBkZWZhdWx0IHJlc2V0IHN0YXRlLgorICogQG5vdGUgICBUaGUgZGVmYXVsdCByZXNldCBzdGF0ZSBvZiB0aGUgY2xvY2sgY29uZmlndXJhdGlvbiBpcyBnaXZlbiBiZWxvdzoKKyAqICAgICAgICAgICAgLSBIU0kgT04gYW5kIHVzZWQgYXMgc3lzdGVtIGNsb2NrIHNvdXJjZQorICogICAgICAgICAgICAtIEhTRSwgUExMIE9GRgorICogICAgICAgICAgICAtIEFIQiwgQVBCMSBhbmQgQVBCMiBwcmVzY2FsZXIgc2V0IHRvIDEuCisgKiAgICAgICAgICAgIC0gQ1NTLCBNQ08xIE9GRgorICogICAgICAgICAgICAtIEFsbCBpbnRlcnJ1cHRzIGRpc2FibGVkCisgKiAgICAgICAgICAgIC0gQWxsIGludGVycnVwdCBhbmQgcmVzZXQgZmxhZ3MgY2xlYXJlZAorICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgbW9kaWZ5IHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZQorICogICAgICAgICAgICAtIFBlcmlwaGVyYWwgY2xvY2tzCisgKiAgICAgICAgICAgIC0gTFNJLCBMU0UgYW5kIFJUQyBjbG9ja3MKKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUkNDX0RlSW5pdCh2b2lkKSB7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKworICAvKiBHZXQgU3RhcnQgVGljayovCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgLyogU2V0IEhTSU9OIGJpdCB0byB0aGUgcmVzZXQgdmFsdWUgKi8KKyAgU0VUX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJT04pOworCisgIC8qIFdhaXQgdGlsbCBIU0kgaXMgcmVhZHkgKi8KKyAgd2hpbGUgKFJFQURfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0lSRFkpID09IDBVKSB7CisgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IEhTSV9USU1FT1VUX1ZBTFVFKSB7CisgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgfQorICB9CisKKyAgLyogU2V0IEhTSVRSSU1bNjowXSBiaXRzIHRvIHRoZSByZXNldCB2YWx1ZSAqLworICBTRVRfQklUKFJDQy0+SUNTQ1IsIFJDQ19IU0lDQUxJQlJBVElPTl9ERUZBVUxUIDw8IFJDQ19JQ1NDUl9IU0lUUklNX1Bvcyk7CisKKyAgLyogR2V0IFN0YXJ0IFRpY2sqLworICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgIC8qIFJlc2V0IENGR1IgcmVnaXN0ZXIgKEhTSSBpcyBzZWxlY3RlZCBhcyBzeXN0ZW0gY2xvY2sgc291cmNlKSAqLworICBSQ0MtPkNGR1IgPSAweDAwMDAwMDAxdTsKKworICAvKiBXYWl0IHRpbGwgSFNJIGlzIHJlYWR5ICovCisgIHdoaWxlIChSRUFEX0JJVChSQ0MtPkNGR1IsIFJDQ19DRkdSX1NXUykgIT0gUkNDX0NGR1JfU1dTX0hTSSkgeworICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBDTE9DS1NXSVRDSF9USU1FT1VUX1ZBTFVFKSB7CisgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgfQorICB9CisKKyAgLyogVXBkYXRlIHRoZSBTeXN0ZW1Db3JlQ2xvY2sgZ2xvYmFsIHZhcmlhYmxlICovCisgIFN5c3RlbUNvcmVDbG9jayA9IEhTSV9WQUxVRTsKKworICAvKiBBZGFwdCBTeXN0aWNrIGludGVycnVwdCBwZXJpb2QgKi8KKyAgaWYgKEhBTF9Jbml0VGljayh1d1RpY2tQcmlvKSAhPSBIQUxfT0spIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2xlYXIgQ1IgcmVnaXN0ZXIgaW4gMiBzdGVwczogZmlyc3QgdG8gY2xlYXIgSFNFT04gaW4gY2FzZSBieXBhc3Mgd2FzCisgICAqIGVuYWJsZWQgKi8KKyAgUkNDLT5DUiA9IFJDQ19DUl9IU0lPTjsKKworICAvKiBUaGVuIGFnYWluIHRvIEhTRUJZUCBpbiBjYXNlIGJ5cGFzcyB3YXMgZW5hYmxlZCAqLworICBSQ0MtPkNSID0gUkNDX0NSX0hTSU9OOworCisgIC8qIEdldCBTdGFydCBUaWNrKi8KKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAvKiBXYWl0IHRpbGwgUExMIGlzIE9GRiAqLworICB3aGlsZSAoUkVBRF9CSVQoUkNDLT5DUiwgUkNDX0NSX1BMTFJEWSkgIT0gMFUpIHsKKyAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gUExMX1RJTUVPVVRfVkFMVUUpIHsKKyAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICB9CisgIH0KKworICAvKiBvbmNlIFBMTCBpcyBPRkYsIHJlc2V0IFBMTENGR1IgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZSAqLworICBSQ0MtPlBMTENGR1IgPSBSQ0NfUExMQ0ZHUl9QTExOXzQ7CisKKyAgLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLworICBDTEVBUl9SRUcoUkNDLT5DSUVSKTsKKworICAvKiBDbGVhciBhbGwgaW50ZXJydXB0IGZsYWdzICovCisgIFdSSVRFX1JFRyhSQ0MtPkNJQ1IsIDB4RkZGRkZGRkZVKTsKKworICAvKiBDbGVhciBhbGwgcmVzZXQgZmxhZ3MgKi8KKyAgU0VUX0JJVChSQ0MtPkNTUiwgUkNDX0NTUl9STVZGKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgUkNDIE9zY2lsbGF0b3JzIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMKKyAqIGluIHRoZSBSQ0NfT3NjSW5pdFR5cGVEZWYuCisgKiBAcGFyYW0gIFJDQ19Pc2NJbml0U3RydWN0ICBwb2ludGVyIHRvIGFuIFJDQ19Pc2NJbml0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdAorICogICAgICAgICBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIFJDQyBPc2NpbGxhdG9ycy4KKyAqIEBub3RlICAgVGhlIFBMTCBpcyBub3QgZGlzYWJsZWQgd2hlbiB1c2VkIGFzIHN5c3RlbSBjbG9jay4KKyAqIEBub3RlICAgVHJhbnNpdGlvbnMgTFNFIEJ5cGFzcyB0byBMU0UgT24gYW5kIExTRSBPbiB0byBMU0UgQnlwYXNzIGFyZSBub3QKKyAqICAgICAgICAgc3VwcG9ydGVkIGJ5IHRoaXMgbWFjcm8uIFVzZXIgc2hvdWxkIHJlcXVlc3QgYSB0cmFuc2l0aW9uIHRvIExTRSBPZmYKKyAqICAgICAgICAgZmlyc3QgYW5kIHRoZW4gTFNFIE9uIG9yIExTRSBCeXBhc3MuCisgKiBAbm90ZSAgIFRyYW5zaXRpb24gSFNFIEJ5cGFzcyB0byBIU0UgT24gYW5kIEhTRSBPbiB0byBIU0UgQnlwYXNzIGFyZSBub3QKKyAqICAgICAgICAgc3VwcG9ydGVkIGJ5IHRoaXMgbWFjcm8uIFVzZXIgc2hvdWxkIHJlcXVlc3QgYSB0cmFuc2l0aW9uIHRvIEhTRSBPZmYKKyAqICAgICAgICAgZmlyc3QgYW5kIHRoZW4gSFNFIE9uIG9yIEhTRSBCeXBhc3MuCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JDQ19Pc2NDb25maWcoUkNDX09zY0luaXRUeXBlRGVmICpSQ0NfT3NjSW5pdFN0cnVjdCkgeworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisgIHVpbnQzMl90IHRlbXBfc3lzY2xrc3JjOworICB1aW50MzJfdCB0ZW1wX3BsbGNrY2ZnOworCisgIC8qIENoZWNrIE51bGwgcG9pbnRlciAqLworICBpZiAoUkNDX09zY0luaXRTdHJ1Y3QgPT0gTlVMTCkgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUkNDX09TQ0lMTEFUT1JUWVBFKFJDQ19Pc2NJbml0U3RydWN0LT5Pc2NpbGxhdG9yVHlwZSkpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBIU0UgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKChSQ0NfT3NjSW5pdFN0cnVjdC0+T3NjaWxsYXRvclR5cGUpICYgUkNDX09TQ0lMTEFUT1JUWVBFX0hTRSkgPT0KKyAgICAgIFJDQ19PU0NJTExBVE9SVFlQRV9IU0UpIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19SQ0NfSFNFKFJDQ19Pc2NJbml0U3RydWN0LT5IU0VTdGF0ZSkpOworCisgICAgdGVtcF9zeXNjbGtzcmMgPSBfX0hBTF9SQ0NfR0VUX1NZU0NMS19TT1VSQ0UoKTsKKyAgICB0ZW1wX3BsbGNrY2ZnID0gX19IQUxfUkNDX0dFVF9QTExfT1NDU09VUkNFKCk7CisKKyAgICAvKiBXaGVuIHRoZSBIU0UgaXMgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgb3IgY2xvY2sgc291cmNlIGZvciBQTEwgaW4gdGhlc2UKKyAgICAgKiBjYXNlcyBpdCBpcyBub3QgYWxsb3dlZCB0byBiZSBkaXNhYmxlZCAqLworICAgIGlmICgoKHRlbXBfc3lzY2xrc3JjID09IFJDQ19DRkdSX1NXU19QTEwpICYmCisgICAgICAgICAodGVtcF9wbGxja2NmZyA9PSBSQ0NfUExMU09VUkNFX0hTRSkpIHx8CisgICAgICAgICh0ZW1wX3N5c2Nsa3NyYyA9PSBSQ0NfQ0ZHUl9TV1NfSFNFKSkgeworICAgICAgaWYgKChSRUFEX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNFUkRZKSAhPSAwVSkgJiYKKyAgICAgICAgICAoUkNDX09zY0luaXRTdHJ1Y3QtPkhTRVN0YXRlID09IFJDQ19IU0VfT0ZGKSkgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvKiBTZXQgdGhlIG5ldyBIU0UgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgICAgX19IQUxfUkNDX0hTRV9DT05GSUcoUkNDX09zY0luaXRTdHJ1Y3QtPkhTRVN0YXRlKTsKKworICAgICAgLyogQ2hlY2sgdGhlIEhTRSBTdGF0ZSAqLworICAgICAgaWYgKFJDQ19Pc2NJbml0U3RydWN0LT5IU0VTdGF0ZSAhPSBSQ0NfSFNFX09GRikgeworICAgICAgICAvKiBHZXQgU3RhcnQgVGljayovCisgICAgICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICAgICAgLyogV2FpdCB0aWxsIEhTRSBpcyByZWFkeSAqLworICAgICAgICB3aGlsZSAoUkVBRF9CSVQoUkNDLT5DUiwgUkNDX0NSX0hTRVJEWSkgPT0gMFUpIHsKKyAgICAgICAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gSFNFX1RJTUVPVVRfVkFMVUUpIHsKKyAgICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIEdldCBTdGFydCBUaWNrKi8KKyAgICAgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgICAgICAvKiBXYWl0IHRpbGwgSFNFIGlzIGRpc2FibGVkICovCisgICAgICAgIHdoaWxlIChSRUFEX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNFUkRZKSAhPSAwVSkgeworICAgICAgICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBIU0VfVElNRU9VVF9WQUxVRSkgeworICAgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEhTSSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCgoUkNDX09zY0luaXRTdHJ1Y3QtPk9zY2lsbGF0b3JUeXBlKSAmIFJDQ19PU0NJTExBVE9SVFlQRV9IU0kpID09CisgICAgICBSQ0NfT1NDSUxMQVRPUlRZUEVfSFNJKSB7CisgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX0hTSShSQ0NfT3NjSW5pdFN0cnVjdC0+SFNJU3RhdGUpKTsKKyAgICBhc3NlcnRfcGFyYW0oCisgICAgICAgIElTX1JDQ19IU0lfQ0FMSUJSQVRJT05fVkFMVUUoUkNDX09zY0luaXRTdHJ1Y3QtPkhTSUNhbGlicmF0aW9uVmFsdWUpKTsKKworICAgIC8qIENoZWNrIGlmIEhTSSBpcyB1c2VkIGFzIHN5c3RlbSBjbG9jayBvciBhcyBQTEwgc291cmNlIHdoZW4gUExMIGlzCisgICAgICogc2VsZWN0ZWQgYXMgc3lzdGVtIGNsb2NrICovCisgICAgdGVtcF9zeXNjbGtzcmMgPSBfX0hBTF9SQ0NfR0VUX1NZU0NMS19TT1VSQ0UoKTsKKyAgICB0ZW1wX3BsbGNrY2ZnID0gX19IQUxfUkNDX0dFVF9QTExfT1NDU09VUkNFKCk7CisgICAgaWYgKCgodGVtcF9zeXNjbGtzcmMgPT0gUkNDX0NGR1JfU1dTX1BMTCkgJiYKKyAgICAgICAgICh0ZW1wX3BsbGNrY2ZnID09IFJDQ19QTExTT1VSQ0VfSFNJKSkgfHwKKyAgICAgICAgKHRlbXBfc3lzY2xrc3JjID09IFJDQ19DRkdSX1NXU19IU0kpKSB7CisgICAgICAvKiBXaGVuIEhTSSBpcyB1c2VkIGFzIHN5c3RlbSBjbG9jayBpdCB3aWxsIG5vdCBiZSBkaXNhYmxlZCAqLworICAgICAgaWYgKChSRUFEX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJUkRZKSAhPSAwVSkgJiYKKyAgICAgICAgICAoUkNDX09zY0luaXRTdHJ1Y3QtPkhTSVN0YXRlID09IFJDQ19IU0lfT0ZGKSkgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgLyogT3RoZXJ3aXNlLCBqdXN0IHRoZSBjYWxpYnJhdGlvbiBpcyBhbGxvd2VkICovCisgICAgICBlbHNlIHsKKyAgICAgICAgLyogQWRqdXN0cyB0aGUgSW50ZXJuYWwgSGlnaCBTcGVlZCBvc2NpbGxhdG9yIChIU0kpIGNhbGlicmF0aW9uIHZhbHVlLiovCisgICAgICAgIF9fSEFMX1JDQ19IU0lfQ0FMSUJSQVRJT05WQUxVRV9BREpVU1QoCisgICAgICAgICAgICBSQ0NfT3NjSW5pdFN0cnVjdC0+SFNJQ2FsaWJyYXRpb25WYWx1ZSk7CisKKyAgICAgICAgLyogQWRhcHQgU3lzdGljayBpbnRlcnJ1cHQgcGVyaW9kICovCisgICAgICAgIGlmIChIQUxfSW5pdFRpY2sodXdUaWNrUHJpbykgIT0gSEFMX09LKSB7CisgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvKiBDaGVjayB0aGUgSFNJIFN0YXRlICovCisgICAgICBpZiAoUkNDX09zY0luaXRTdHJ1Y3QtPkhTSVN0YXRlICE9IFJDQ19IU0lfT0ZGKSB7CisgICAgICAgIC8qIEVuYWJsZSB0aGUgSW50ZXJuYWwgSGlnaCBTcGVlZCBvc2NpbGxhdG9yIChIU0kpLiAqLworICAgICAgICBfX0hBTF9SQ0NfSFNJX0VOQUJMRSgpOworCisgICAgICAgIC8qIEdldCBTdGFydCBUaWNrKi8KKyAgICAgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgICAgICAvKiBXYWl0IHRpbGwgSFNJIGlzIHJlYWR5ICovCisgICAgICAgIHdoaWxlIChSRUFEX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJUkRZKSA9PSAwVSkgeworICAgICAgICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBIU0lfVElNRU9VVF9WQUxVRSkgeworICAgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIEFkanVzdHMgdGhlIEludGVybmFsIEhpZ2ggU3BlZWQgb3NjaWxsYXRvciAoSFNJKSBjYWxpYnJhdGlvbiB2YWx1ZS4qLworICAgICAgICBfX0hBTF9SQ0NfSFNJX0NBTElCUkFUSU9OVkFMVUVfQURKVVNUKAorICAgICAgICAgICAgUkNDX09zY0luaXRTdHJ1Y3QtPkhTSUNhbGlicmF0aW9uVmFsdWUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogRGlzYWJsZSB0aGUgSW50ZXJuYWwgSGlnaCBTcGVlZCBvc2NpbGxhdG9yIChIU0kpLiAqLworICAgICAgICBfX0hBTF9SQ0NfSFNJX0RJU0FCTEUoKTsKKworICAgICAgICAvKiBHZXQgU3RhcnQgVGljayovCisgICAgICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICAgICAgLyogV2FpdCB0aWxsIEhTSSBpcyBkaXNhYmxlZCAqLworICAgICAgICB3aGlsZSAoUkVBRF9CSVQoUkNDLT5DUiwgUkNDX0NSX0hTSVJEWSkgIT0gMFUpIHsKKyAgICAgICAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gSFNJX1RJTUVPVVRfVkFMVUUpIHsKKyAgICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTFNJIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKFJDQ19Pc2NJbml0U3RydWN0LT5Pc2NpbGxhdG9yVHlwZSkgJiBSQ0NfT1NDSUxMQVRPUlRZUEVfTFNJKSA9PQorICAgICAgUkNDX09TQ0lMTEFUT1JUWVBFX0xTSSkgeworICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19MU0koUkNDX09zY0luaXRTdHJ1Y3QtPkxTSVN0YXRlKSk7CisKKyAgICAvKiBDaGVjayB0aGUgTFNJIFN0YXRlICovCisgICAgaWYgKFJDQ19Pc2NJbml0U3RydWN0LT5MU0lTdGF0ZSAhPSBSQ0NfTFNJX09GRikgeworICAgICAgLyogRW5hYmxlIHRoZSBJbnRlcm5hbCBMb3cgU3BlZWQgb3NjaWxsYXRvciAoTFNJKS4gKi8KKyAgICAgIF9fSEFMX1JDQ19MU0lfRU5BQkxFKCk7CisKKyAgICAgIC8qIEdldCBTdGFydCBUaWNrKi8KKyAgICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICAgIC8qIFdhaXQgdGlsbCBMU0kgaXMgcmVhZHkgKi8KKyAgICAgIHdoaWxlIChSRUFEX0JJVChSQ0MtPkNTUiwgUkNDX0NTUl9MU0lSRFkpID09IDBVKSB7CisgICAgICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBMU0lfVElNRU9VVF9WQUxVRSkgeworICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBJbnRlcm5hbCBMb3cgU3BlZWQgb3NjaWxsYXRvciAoTFNJKS4gKi8KKyAgICAgIF9fSEFMX1JDQ19MU0lfRElTQUJMRSgpOworCisgICAgICAvKiBHZXQgU3RhcnQgVGljayovCisgICAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgICAgICAvKiBXYWl0IHRpbGwgTFNJIGlzIGRpc2FibGVkICovCisgICAgICB3aGlsZSAoUkVBRF9CSVQoUkNDLT5DU1IsIFJDQ19DU1JfTFNJUkRZKSAhPSAwVSkgeworICAgICAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gTFNJX1RJTUVPVVRfVkFMVUUpIHsKKyAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTFNFIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKFJDQ19Pc2NJbml0U3RydWN0LT5Pc2NpbGxhdG9yVHlwZSkgJiBSQ0NfT1NDSUxMQVRPUlRZUEVfTFNFKSA9PQorICAgICAgUkNDX09TQ0lMTEFUT1JUWVBFX0xTRSkgeworICAgIEZsYWdTdGF0dXMgcHdyY2xrY2hhbmdlZCA9IFJFU0VUOworCisgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX0xTRShSQ0NfT3NjSW5pdFN0cnVjdC0+TFNFU3RhdGUpKTsKKworICAgIC8qIFVwZGF0ZSBMU0UgY29uZmlndXJhdGlvbiBpbiBCYWNrdXAgRG9tYWluIGNvbnRyb2wgcmVnaXN0ZXIgICAgKi8KKyAgICAvKiBSZXF1aXJlcyB0byBlbmFibGUgd3JpdGUgYWNjZXNzIHRvIEJhY2t1cCBEb21haW4gaWYgbmVjZXNzYXJ5ICovCisgICAgaWYgKF9fSEFMX1JDQ19QV1JfSVNfQ0xLX0RJU0FCTEVEKCkgIT0gMFUpIHsKKyAgICAgIF9fSEFMX1JDQ19QV1JfQ0xLX0VOQUJMRSgpOworICAgICAgcHdyY2xrY2hhbmdlZCA9IFNFVDsKKyAgICB9CisKKyAgICBpZiAoSEFMX0lTX0JJVF9DTFIoUFdSLT5DUjEsIFBXUl9DUjFfREJQKSkgeworICAgICAgLyogRW5hYmxlIHdyaXRlIGFjY2VzcyB0byBCYWNrdXAgZG9tYWluICovCisgICAgICBTRVRfQklUKFBXUi0+Q1IxLCBQV1JfQ1IxX0RCUCk7CisKKyAgICAgIC8qIFdhaXQgZm9yIEJhY2t1cCBkb21haW4gV3JpdGUgcHJvdGVjdGlvbiBkaXNhYmxlICovCisgICAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgICAgICB3aGlsZSAoSEFMX0lTX0JJVF9DTFIoUFdSLT5DUjEsIFBXUl9DUjFfREJQKSkgeworICAgICAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gUkNDX0RCUF9USU1FT1VUX1ZBTFVFKSB7CisgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLyogU2V0IHRoZSBuZXcgTFNFIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIF9fSEFMX1JDQ19MU0VfQ09ORklHKFJDQ19Pc2NJbml0U3RydWN0LT5MU0VTdGF0ZSk7CisKKyAgICAvKiBDaGVjayB0aGUgTFNFIFN0YXRlICovCisgICAgaWYgKFJDQ19Pc2NJbml0U3RydWN0LT5MU0VTdGF0ZSAhPSBSQ0NfTFNFX09GRikgeworICAgICAgLyogR2V0IFN0YXJ0IFRpY2sqLworICAgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgICAgLyogV2FpdCB0aWxsIExTRSBpcyByZWFkeSAqLworICAgICAgd2hpbGUgKFJFQURfQklUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfTFNFUkRZKSA9PSAwVSkgeworICAgICAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gUkNDX0xTRV9USU1FT1VUX1ZBTFVFKSB7CisgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIEdldCBTdGFydCBUaWNrKi8KKyAgICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICAgIC8qIFdhaXQgdGlsbCBMU0UgaXMgZGlzYWJsZWQgKi8KKyAgICAgIHdoaWxlIChSRUFEX0JJVChSQ0MtPkJEQ1IsIFJDQ19CRENSX0xTRVJEWSkgIT0gMFUpIHsKKyAgICAgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFJDQ19MU0VfVElNRU9VVF9WQUxVRSkgeworICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8qIFJlc3RvcmUgY2xvY2sgY29uZmlndXJhdGlvbiBpZiBjaGFuZ2VkICovCisgICAgaWYgKHB3cmNsa2NoYW5nZWQgPT0gU0VUKSB7CisgICAgICBfX0hBTF9SQ0NfUFdSX0NMS19ESVNBQkxFKCk7CisgICAgfQorICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSFNJNDggQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKFJDQ19Pc2NJbml0U3RydWN0LT5Pc2NpbGxhdG9yVHlwZSkgJiBSQ0NfT1NDSUxMQVRPUlRZUEVfSFNJNDgpID09CisgICAgICBSQ0NfT1NDSUxMQVRPUlRZUEVfSFNJNDgpIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19SQ0NfSFNJNDgoUkNDX09zY0luaXRTdHJ1Y3QtPkhTSTQ4U3RhdGUpKTsKKworICAgIC8qIENoZWNrIHRoZSBIU0k0OCBTdGF0ZSAqLworICAgIGlmIChSQ0NfT3NjSW5pdFN0cnVjdC0+SFNJNDhTdGF0ZSAhPSBSQ0NfSFNJNDhfT0ZGKSB7CisgICAgICAvKiBFbmFibGUgdGhlIEludGVybmFsIExvdyBTcGVlZCBvc2NpbGxhdG9yIChIU0k0OCkuICovCisgICAgICBfX0hBTF9SQ0NfSFNJNDhfRU5BQkxFKCk7CisKKyAgICAgIC8qIEdldCBTdGFydCBUaWNrKi8KKyAgICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICAgIC8qIFdhaXQgdGlsbCBIU0k0OCBpcyByZWFkeSAqLworICAgICAgd2hpbGUgKFJFQURfQklUKFJDQy0+Q1JSQ1IsIFJDQ19DUlJDUl9IU0k0OFJEWSkgPT0gMFUpIHsKKyAgICAgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IEhTSTQ4X1RJTUVPVVRfVkFMVUUpIHsKKyAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLyogRGlzYWJsZSB0aGUgSW50ZXJuYWwgTG93IFNwZWVkIG9zY2lsbGF0b3IgKEhTSTQ4KS4gKi8KKyAgICAgIF9fSEFMX1JDQ19IU0k0OF9ESVNBQkxFKCk7CisKKyAgICAgIC8qIEdldCBTdGFydCBUaWNrKi8KKyAgICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICAgIC8qIFdhaXQgdGlsbCBIU0k0OCBpcyBkaXNhYmxlZCAqLworICAgICAgd2hpbGUgKFJFQURfQklUKFJDQy0+Q1JSQ1IsIFJDQ19DUlJDUl9IU0k0OFJEWSkgIT0gMFUpIHsKKyAgICAgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IEhTSTQ4X1RJTUVPVVRfVkFMVUUpIHsKKyAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBMTCBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1JDQ19QTEwoUkNDX09zY0luaXRTdHJ1Y3QtPlBMTC5QTExTdGF0ZSkpOworCisgIGlmIChSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTFN0YXRlICE9IFJDQ19QTExfTk9ORSkgeworICAgIC8qIENoZWNrIGlmIHRoZSBQTEwgaXMgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgb3Igbm90ICovCisgICAgaWYgKF9fSEFMX1JDQ19HRVRfU1lTQ0xLX1NPVVJDRSgpICE9IFJDQ19DRkdSX1NXU19QTEwpIHsKKyAgICAgIGlmIChSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTFN0YXRlID09IFJDQ19QTExfT04pIHsKKyAgICAgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19QTExTT1VSQ0UoUkNDX09zY0luaXRTdHJ1Y3QtPlBMTC5QTExTb3VyY2UpKTsKKyAgICAgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19QTExNX1ZBTFVFKFJDQ19Pc2NJbml0U3RydWN0LT5QTEwuUExMTSkpOworICAgICAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX1BMTE5fVkFMVUUoUkNDX09zY0luaXRTdHJ1Y3QtPlBMTC5QTExOKSk7CisgICAgICAgIGFzc2VydF9wYXJhbShJU19SQ0NfUExMUF9WQUxVRShSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTFApKTsKKyAgICAgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19QTExRX1ZBTFVFKFJDQ19Pc2NJbml0U3RydWN0LT5QTEwuUExMUSkpOworICAgICAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX1BMTFJfVkFMVUUoUkNDX09zY0luaXRTdHJ1Y3QtPlBMTC5QTExSKSk7CisKKyAgICAgICAgLyogRGlzYWJsZSB0aGUgbWFpbiBQTEwuICovCisgICAgICAgIF9fSEFMX1JDQ19QTExfRElTQUJMRSgpOworCisgICAgICAgIC8qIEdldCBTdGFydCBUaWNrKi8KKyAgICAgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgICAgICAvKiBXYWl0IHRpbGwgUExMIGlzIGRpc2FibGVkICovCisgICAgICAgIHdoaWxlIChSRUFEX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfUExMUkRZKSAhPSAwVSkgeworICAgICAgICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBQTExfVElNRU9VVF9WQUxVRSkgeworICAgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIENvbmZpZ3VyZSB0aGUgbWFpbiBQTEwgY2xvY2sgc291cmNlLCBtdWx0aXBsaWNhdGlvbiBhbmQgZGl2aXNpb24KKyAgICAgICAgICogZmFjdG9ycy4gKi8KKyAgICAgICAgX19IQUxfUkNDX1BMTF9DT05GSUcoCisgICAgICAgICAgICBSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTFNvdXJjZSwgUkNDX09zY0luaXRTdHJ1Y3QtPlBMTC5QTExNLAorICAgICAgICAgICAgUkNDX09zY0luaXRTdHJ1Y3QtPlBMTC5QTExOLCBSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTFAsCisgICAgICAgICAgICBSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTFEsIFJDQ19Pc2NJbml0U3RydWN0LT5QTEwuUExMUik7CisKKyAgICAgICAgLyogRW5hYmxlIHRoZSBtYWluIFBMTC4gKi8KKyAgICAgICAgX19IQUxfUkNDX1BMTF9FTkFCTEUoKTsKKworICAgICAgICAvKiBFbmFibGUgUExMIFN5c3RlbSBDbG9jayBvdXRwdXQuICovCisgICAgICAgIF9fSEFMX1JDQ19QTExDTEtPVVRfRU5BQkxFKFJDQ19QTExfU1lTQ0xLKTsKKworICAgICAgICAvKiBHZXQgU3RhcnQgVGljayovCisgICAgICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICAgICAgLyogV2FpdCB0aWxsIFBMTCBpcyByZWFkeSAqLworICAgICAgICB3aGlsZSAoUkVBRF9CSVQoUkNDLT5DUiwgUkNDX0NSX1BMTFJEWSkgPT0gMFUpIHsKKyAgICAgICAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gUExMX1RJTUVPVVRfVkFMVUUpIHsKKyAgICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIERpc2FibGUgdGhlIG1haW4gUExMLiAqLworICAgICAgICBfX0hBTF9SQ0NfUExMX0RJU0FCTEUoKTsKKworICAgICAgICAvKiBHZXQgU3RhcnQgVGljayovCisgICAgICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICAgICAgLyogV2FpdCB0aWxsIFBMTCBpcyBkaXNhYmxlZCAqLworICAgICAgICB3aGlsZSAoUkVBRF9CSVQoUkNDLT5DUiwgUkNDX0NSX1BMTFJEWSkgIT0gMFUpIHsKKyAgICAgICAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gUExMX1RJTUVPVVRfVkFMVUUpIHsKKyAgICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBVbnNlbGVjdCBQTEwgY2xvY2sgc291cmNlIGFuZCBkaXNhYmxlIG91dHB1dHMgdG8gc2F2ZSBwb3dlciAqLworICAgICAgICBSQ0MtPlBMTENGR1IgJj0gfihSQ0NfUExMQ0ZHUl9QTExTUkMgfCBSQ0NfUExMX1NZU0NMSyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19QTExfNDhNMUNMSyB8IFJDQ19QTExfQURDQ0xLKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLyogQ2hlY2sgaWYgdGhlcmUgaXMgYSByZXF1ZXN0IHRvIGRpc2FibGUgdGhlIFBMTCB1c2VkIGFzIFN5c3RlbSBjbG9jaworICAgICAgICogc291cmNlICovCisgICAgICBpZiAoKFJDQ19Pc2NJbml0U3RydWN0LT5QTEwuUExMU3RhdGUpID09IFJDQ19QTExfT0ZGKSB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBEbyBub3QgcmV0dXJuIEhBTF9FUlJPUiBpZiByZXF1ZXN0IHJlcGVhdHMgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbgorICAgICAgICAgKi8KKyAgICAgICAgdGVtcF9wbGxja2NmZyA9IFJDQy0+UExMQ0ZHUjsKKyAgICAgICAgaWYgKChSRUFEX0JJVCh0ZW1wX3BsbGNrY2ZnLCBSQ0NfUExMQ0ZHUl9QTExTUkMpICE9CisgICAgICAgICAgICAgUkNDX09zY0luaXRTdHJ1Y3QtPlBMTC5QTExTb3VyY2UpIHx8CisgICAgICAgICAgICAoUkVBRF9CSVQodGVtcF9wbGxja2NmZywgUkNDX1BMTENGR1JfUExMTSkgIT0KKyAgICAgICAgICAgICAoKChSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTE0pIC0gMVUpIDw8IFJDQ19QTExDRkdSX1BMTE1fUG9zKSkgfHwKKyAgICAgICAgICAgIChSRUFEX0JJVCh0ZW1wX3BsbGNrY2ZnLCBSQ0NfUExMQ0ZHUl9QTExOKSAhPQorICAgICAgICAgICAgICgoUkNDX09zY0luaXRTdHJ1Y3QtPlBMTC5QTExOKSA8PCBSQ0NfUExMQ0ZHUl9QTExOX1BvcykpIHx8CisgICAgICAgICAgICAoUkVBRF9CSVQodGVtcF9wbGxja2NmZywgUkNDX1BMTENGR1JfUExMUERJVikgIT0KKyAgICAgICAgICAgICAoKFJDQ19Pc2NJbml0U3RydWN0LT5QTEwuUExMUCkgPDwgUkNDX1BMTENGR1JfUExMUERJVl9Qb3MpKSB8fAorICAgICAgICAgICAgKFJFQURfQklUKHRlbXBfcGxsY2tjZmcsIFJDQ19QTExDRkdSX1BMTFEpICE9CisgICAgICAgICAgICAgKCgoKFJDQ19Pc2NJbml0U3RydWN0LT5QTEwuUExMUSkgPj4gMVUpIC0gMVUpCisgICAgICAgICAgICAgIDw8IFJDQ19QTExDRkdSX1BMTFFfUG9zKSkgfHwKKyAgICAgICAgICAgIChSRUFEX0JJVCh0ZW1wX3BsbGNrY2ZnLCBSQ0NfUExMQ0ZHUl9QTExSKSAhPQorICAgICAgICAgICAgICgoKChSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTFIpID4+IDFVKSAtIDFVKQorICAgICAgICAgICAgICA8PCBSQ0NfUExMQ0ZHUl9QTExSX1BvcykpKSB7CisgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBDUFUsIEFIQiBhbmQgQVBCIGJ1c2VzIGNsb2NrcyBhY2NvcmRpbmcgdG8gdGhlCisgKiBzcGVjaWZpZWQgcGFyYW1ldGVycyBpbiB0aGUgUkNDX0Nsa0luaXRTdHJ1Y3QuCisgKiBAcGFyYW0gIFJDQ19DbGtJbml0U3RydWN0ICBwb2ludGVyIHRvIGFuIFJDQ19Pc2NJbml0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdAorICogICAgICAgICBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIFJDQyBwZXJpcGhlcmFsLgorICogQHBhcmFtICBGTGF0ZW5jeSAgRkxBU0ggTGF0ZW5jeQorICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBGTEFTSF9MQVRFTkNZXzAgICBGTEFTSCAwIExhdGVuY3kgY3ljbGUKKyAqICAgICAgICAgICAgQGFyZyBGTEFTSF9MQVRFTkNZXzEgICBGTEFTSCAxIExhdGVuY3kgY3ljbGUKKyAqICAgICAgICAgICAgQGFyZyBGTEFTSF9MQVRFTkNZXzIgICBGTEFTSCAyIExhdGVuY3kgY3ljbGVzCisgKiAgICAgICAgICAgIEBhcmcgRkxBU0hfTEFURU5DWV8zICAgRkxBU0ggMyBMYXRlbmN5IGN5Y2xlcworICogICAgICAgICAgICBAYXJnIEZMQVNIX0xBVEVOQ1lfNCAgIEZMQVNIIDQgTGF0ZW5jeSBjeWNsZXMKKyAqICAgICAgICAgICAgQGFyZyBGTEFTSF9MQVRFTkNZXzUgICBGTEFTSCA1IExhdGVuY3kgY3ljbGVzCisgKiAgICAgICAgICAgIEBhcmcgRkxBU0hfTEFURU5DWV82ICAgRkxBU0ggNiBMYXRlbmN5IGN5Y2xlcworICogICAgICAgICAgICBAYXJnIEZMQVNIX0xBVEVOQ1lfNyAgIEZMQVNIIDcgTGF0ZW5jeSBjeWNsZXMKKyAqICAgICAgICAgICAgQGFyZyBGTEFTSF9MQVRFTkNZXzggICBGTEFTSCA4IExhdGVuY3kgY3ljbGVzCisgKiAgICAgICAgICAgIEBhcmcgRkxBU0hfTEFURU5DWV85ICAgRkxBU0ggOSBMYXRlbmN5IGN5Y2xlcworICogICAgICAgICAgICBAYXJnIEZMQVNIX0xBVEVOQ1lfMTAgIEZMQVNIIDEwIExhdGVuY3kgY3ljbGVzCisgKiAgICAgICAgICAgIEBhcmcgRkxBU0hfTEFURU5DWV8xMSAgRkxBU0ggMTEgTGF0ZW5jeSBjeWNsZXMKKyAqICAgICAgICAgICAgQGFyZyBGTEFTSF9MQVRFTkNZXzEyICBGTEFTSCAxMiBMYXRlbmN5IGN5Y2xlcworICogICAgICAgICAgICBAYXJnIEZMQVNIX0xBVEVOQ1lfMTMgIEZMQVNIIDEzIExhdGVuY3kgY3ljbGVzCisgKiAgICAgICAgICAgIEBhcmcgRkxBU0hfTEFURU5DWV8xNCAgRkxBU0ggMTQgTGF0ZW5jeSBjeWNsZXMKKyAqICAgICAgICAgICAgQGFyZyBGTEFTSF9MQVRFTkNZXzE1ICBGTEFTSCAxNSBMYXRlbmN5IGN5Y2xlcworICoKKyAqIEBub3RlICAgVGhlIFN5c3RlbUNvcmVDbG9jayBDTVNJUyB2YXJpYWJsZSBpcyB1c2VkIHRvIHN0b3JlIFN5c3RlbSBDbG9jaworICogRnJlcXVlbmN5IGFuZCB1cGRhdGVkIGJ5IEhBTF9SQ0NfR2V0SENMS0ZyZXEoKSBmdW5jdGlvbiBjYWxsZWQgd2l0aGluIHRoaXMKKyAqIGZ1bmN0aW9uCisgKgorICogQG5vdGUgICBUaGUgSFNJIGlzIHVzZWQgYnkgZGVmYXVsdCBhcyBzeXN0ZW0gY2xvY2sgc291cmNlIGFmdGVyCisgKiAgICAgICAgIHN0YXJ0dXAgZnJvbSBSZXNldCwgd2FrZS11cCBmcm9tIFNUQU5EQlkgbW9kZS4gQWZ0ZXIgcmVzdGFydCBmcm9tCisgKiBSZXNldCwgdGhlIEhTSSBmcmVxdWVuY3kgaXMgc2V0IHRvIGl0cyBkZWZhdWx0IHZhbHVlIDE2IE1Iei4KKyAqCisgKiBAbm90ZSAgIFRoZSBIU0kgY2FuIGJlIHNlbGVjdGVkIGFzIHN5c3RlbSBjbG9jayBzb3VyY2UgYWZ0ZXIKKyAqICAgICAgICAgZnJvbSBTVE9QIG1vZGVzIG9yIGluIGNhc2Ugb2YgZmFpbHVyZSBvZiB0aGUgSFNFIHVzZWQgZGlyZWN0bHkgb3IKKyAqIGluZGlyZWN0bHkgYXMgc3lzdGVtIGNsb2NrIChpZiB0aGUgQ2xvY2sgU2VjdXJpdHkgU3lzdGVtIENTUyBpcyBlbmFibGVkKS4KKyAqCisgKiBAbm90ZSAgIEEgc3dpdGNoIGZyb20gb25lIGNsb2NrIHNvdXJjZSB0byBhbm90aGVyIG9jY3VycyBvbmx5IGlmIHRoZSB0YXJnZXQKKyAqICAgICAgICAgY2xvY2sgc291cmNlIGlzIHJlYWR5IChjbG9jayBzdGFibGUgYWZ0ZXIgc3RhcnR1cCBkZWxheSBvciBQTEwKKyAqIGxvY2tlZCkuIElmIGEgY2xvY2sgc291cmNlIHdoaWNoIGlzIG5vdCB5ZXQgcmVhZHkgaXMgc2VsZWN0ZWQsIHRoZSBzd2l0Y2gKKyAqIHdpbGwgb2NjdXIgd2hlbiB0aGUgY2xvY2sgc291cmNlIGlzIHJlYWR5LgorICoKKyAqIEBub3RlICAgWW91IGNhbiB1c2UgSEFMX1JDQ19HZXRDbG9ja0NvbmZpZygpIGZ1bmN0aW9uIHRvIGtub3cgd2hpY2ggY2xvY2sgaXMKKyAqICAgICAgICAgY3VycmVudGx5IHVzZWQgYXMgc3lzdGVtIGNsb2NrIHNvdXJjZS4KKyAqCisgKiBAbm90ZSAgIERlcGVuZGluZyBvbiB0aGUgZGV2aWNlIHZvbHRhZ2UgcmFuZ2UsIHRoZSBzb2Z0d2FyZSBoYXMgdG8gc2V0CisgKiBjb3JyZWN0bHkgSFBSRVszOjBdIGJpdHMgdG8gZW5zdXJlIHRoYXQgSENMSyBub3QgZXhjZWVkIHRoZSBtYXhpbXVtIGFsbG93ZWQKKyAqIGZyZXF1ZW5jeSAoZm9yIG1vcmUgZGV0YWlscyByZWZlciB0byBzZWN0aW9uIGFib3ZlCisgKiAiSW5pdGlhbGl6YXRpb24vZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zIikKKyAqIEByZXR2YWwgTm9uZQorICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUkNDX0Nsb2NrQ29uZmlnKFJDQ19DbGtJbml0VHlwZURlZiAqUkNDX0Nsa0luaXRTdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEZMYXRlbmN5KSB7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKyAgdWludDMyX3QgcGxsZnJlcTsKKyAgdWludDMyX3QgaHByZSA9IFJDQ19TWVNDTEtfRElWMTsKKworICAvKiBDaGVjayBOdWxsIHBvaW50ZXIgKi8KKyAgaWYgKFJDQ19DbGtJbml0U3RydWN0ID09IE5VTEwpIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1JDQ19DTE9DS1RZUEUoUkNDX0Nsa0luaXRTdHJ1Y3QtPkNsb2NrVHlwZSkpOworICBhc3NlcnRfcGFyYW0oSVNfRkxBU0hfTEFURU5DWShGTGF0ZW5jeSkpOworCisgIC8qIFRvIGNvcnJlY3RseSByZWFkIGRhdGEgZnJvbSBGTEFTSCBtZW1vcnksIHRoZSBudW1iZXIgb2Ygd2FpdCBzdGF0ZXMKKyAgICAoTEFURU5DWSkgbXVzdCBiZSBjb3JyZWN0bHkgcHJvZ3JhbW1lZCBhY2NvcmRpbmcgdG8gdGhlIGZyZXF1ZW5jeSBvZiB0aGUgQ1BVCisgICAgY2xvY2sgKEhDTEspIGFuZCB0aGUgc3VwcGx5IHZvbHRhZ2Ugb2YgdGhlIGRldmljZS4gKi8KKworICAvKiBJbmNyZWFzaW5nIHRoZSBudW1iZXIgb2Ygd2FpdCBzdGF0ZXMgYmVjYXVzZSBvZiBoaWdoZXIgQ1BVIGZyZXF1ZW5jeSAqLworICBpZiAoRkxhdGVuY3kgPiBfX0hBTF9GTEFTSF9HRVRfTEFURU5DWSgpKSB7CisgICAgLyogUHJvZ3JhbSB0aGUgbmV3IG51bWJlciBvZiB3YWl0IHN0YXRlcyB0byB0aGUgTEFURU5DWSBiaXRzIGluIHRoZQorICAgICAqIEZMQVNIX0FDUiByZWdpc3RlciAqLworICAgIF9fSEFMX0ZMQVNIX1NFVF9MQVRFTkNZKEZMYXRlbmN5KTsKKworICAgIC8qIENoZWNrIHRoYXQgdGhlIG5ldyBudW1iZXIgb2Ygd2FpdCBzdGF0ZXMgaXMgdGFrZW4gaW50byBhY2NvdW50IHRvIGFjY2VzcworICAgIHRoZSBGbGFzaCBtZW1vcnkgYnkgcmVhZGluZyB0aGUgRkxBU0hfQUNSIHJlZ2lzdGVyICovCisgICAgaWYgKF9fSEFMX0ZMQVNIX0dFVF9MQVRFTkNZKCkgIT0gRkxhdGVuY3kpIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNZU0NMSyBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKFJDQ19DbGtJbml0U3RydWN0LT5DbG9ja1R5cGUpICYgUkNDX0NMT0NLVFlQRV9TWVNDTEspID09CisgICAgICBSQ0NfQ0xPQ0tUWVBFX1NZU0NMSykgeworICAgIGFzc2VydF9wYXJhbShJU19SQ0NfU1lTQ0xLU09VUkNFKFJDQ19DbGtJbml0U3RydWN0LT5TWVNDTEtTb3VyY2UpKTsKKworICAgIC8qIFBMTCBpcyBzZWxlY3RlZCBhcyBTeXN0ZW0gQ2xvY2sgU291cmNlICovCisgICAgaWYgKFJDQ19DbGtJbml0U3RydWN0LT5TWVNDTEtTb3VyY2UgPT0gUkNDX1NZU0NMS1NPVVJDRV9QTExDTEspIHsKKyAgICAgIC8qIENoZWNrIHRoZSBQTEwgcmVhZHkgZmxhZyAqLworICAgICAgaWYgKFJFQURfQklUKFJDQy0+Q1IsIFJDQ19DUl9QTExSRFkpID09IDBVKSB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgICAvKiBVbmRlcnNob290IG1hbmFnZW1lbnQgd2hlbiBzZWxlY3Rpb24gUExMIGFzIFNZU0NMSyBzb3VyY2UgYW5kIGZyZXF1ZW5jeQorICAgICAgICogYWJvdmUgODBNaHogKi8KKyAgICAgIC8qIENvbXB1dGUgdGFyZ2V0IFBMTCBvdXRwdXQgZnJlcXVlbmN5ICovCisgICAgICBwbGxmcmVxID0gUkNDX0dldFN5c0Nsb2NrRnJlcUZyb21QTExTb3VyY2UoKTsKKworICAgICAgLyogSW50ZXJtZWRpYXRlIHN0ZXAgd2l0aCBIQ0xLIHByZXNjYWxlciAyIG5lY2Vzc2FyeSBiZWZvcmUgdG8gZ28gb3ZlcgorICAgICAgICogODBNaHogKi8KKyAgICAgIGlmIChwbGxmcmVxID4gODAwMDAwMDBVKSB7CisgICAgICAgIGlmICgoKFJFQURfQklUKFJDQy0+Q0ZHUiwgUkNDX0NGR1JfSFBSRSkgPT0gUkNDX1NZU0NMS19ESVYxKSkgfHwKKyAgICAgICAgICAgICgoKCgoUkNDX0Nsa0luaXRTdHJ1Y3QtPkNsb2NrVHlwZSkgJiBSQ0NfQ0xPQ0tUWVBFX0hDTEspID09CisgICAgICAgICAgICAgICBSQ0NfQ0xPQ0tUWVBFX0hDTEspICYmCisgICAgICAgICAgICAgIChSQ0NfQ2xrSW5pdFN0cnVjdC0+QUhCQ0xLRGl2aWRlciA9PSBSQ0NfU1lTQ0xLX0RJVjEpKSkpIHsKKyAgICAgICAgICBNT0RJRllfUkVHKFJDQy0+Q0ZHUiwgUkNDX0NGR1JfSFBSRSwgUkNDX1NZU0NMS19ESVYyKTsKKyAgICAgICAgICBocHJlID0gUkNDX1NZU0NMS19ESVYyOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIEhTRSBpcyBzZWxlY3RlZCBhcyBTeXN0ZW0gQ2xvY2sgU291cmNlICovCisgICAgICBpZiAoUkNDX0Nsa0luaXRTdHJ1Y3QtPlNZU0NMS1NvdXJjZSA9PSBSQ0NfU1lTQ0xLU09VUkNFX0hTRSkgeworICAgICAgICAvKiBDaGVjayB0aGUgSFNFIHJlYWR5IGZsYWcgKi8KKyAgICAgICAgaWYgKFJFQURfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0VSRFkpID09IDBVKSB7CisgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLyogSFNJIGlzIHNlbGVjdGVkIGFzIFN5c3RlbSBDbG9jayBTb3VyY2UgKi8KKyAgICAgIGVsc2UgeworICAgICAgICAvKiBDaGVjayB0aGUgSFNJIHJlYWR5IGZsYWcgKi8KKyAgICAgICAgaWYgKFJFQURfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0lSRFkpID09IDBVKSB7CisgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLyogT3ZlcnNob290IG1hbmFnZW1lbnQgd2hlbiBnb2luZyBkb3duIGZyb20gUExMIGFzIFNZU0NMSyBzb3VyY2UgYW5kCisgICAgICAgKiBmcmVxdWVuY3kgYWJvdmUgODBNaHogKi8KKyAgICAgIHBsbGZyZXEgPSBIQUxfUkNDX0dldFN5c0Nsb2NrRnJlcSgpOworCisgICAgICAvKiBJbnRlcm1lZGlhdGUgc3RlcCB3aXRoIEhDTEsgcHJlc2NhbGVyIDIgbmVjZXNzYXJ5IGJlZm9yZSB0byBnbyB1bmRlcgorICAgICAgICogODBNaHogKi8KKyAgICAgIGlmIChwbGxmcmVxID4gODAwMDAwMDBVKSB7CisgICAgICAgIE1PRElGWV9SRUcoUkNDLT5DRkdSLCBSQ0NfQ0ZHUl9IUFJFLCBSQ0NfU1lTQ0xLX0RJVjIpOworICAgICAgICBocHJlID0gUkNDX1NZU0NMS19ESVYyOworICAgICAgfQorICAgIH0KKworICAgIE1PRElGWV9SRUcoUkNDLT5DRkdSLCBSQ0NfQ0ZHUl9TVywgUkNDX0Nsa0luaXRTdHJ1Y3QtPlNZU0NMS1NvdXJjZSk7CisKKyAgICAvKiBHZXQgU3RhcnQgVGljayovCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgIHdoaWxlIChfX0hBTF9SQ0NfR0VUX1NZU0NMS19TT1VSQ0UoKSAhPQorICAgICAgICAgICAoUkNDX0Nsa0luaXRTdHJ1Y3QtPlNZU0NMS1NvdXJjZSA8PCBSQ0NfQ0ZHUl9TV1NfUG9zKSkgeworICAgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IENMT0NLU1dJVENIX1RJTUVPVVRfVkFMVUUpIHsKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSENMSyBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCgoUkNDX0Nsa0luaXRTdHJ1Y3QtPkNsb2NrVHlwZSkgJiBSQ0NfQ0xPQ0tUWVBFX0hDTEspID09CisgICAgICBSQ0NfQ0xPQ0tUWVBFX0hDTEspIHsKKyAgICAvKiBTZXQgdGhlIGhpZ2hlc3QgQVBCIGRpdmlkZXIgaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgd2UgZG8gbm90IGdvIHRocm91Z2gKKyAgICAgICBhIG5vbi1zcGVjIHBoYXNlIHdoYXRldmVyIHdlIGRlY3JlYXNlIG9yIGluY3JlYXNlIEhDTEsuICovCisgICAgaWYgKCgoUkNDX0Nsa0luaXRTdHJ1Y3QtPkNsb2NrVHlwZSkgJiBSQ0NfQ0xPQ0tUWVBFX1BDTEsxKSA9PQorICAgICAgICBSQ0NfQ0xPQ0tUWVBFX1BDTEsxKSB7CisgICAgICBNT0RJRllfUkVHKFJDQy0+Q0ZHUiwgUkNDX0NGR1JfUFBSRTEsIFJDQ19IQ0xLX0RJVjE2KTsKKyAgICB9CisgICAgaWYgKCgoUkNDX0Nsa0luaXRTdHJ1Y3QtPkNsb2NrVHlwZSkgJiBSQ0NfQ0xPQ0tUWVBFX1BDTEsyKSA9PQorICAgICAgICBSQ0NfQ0xPQ0tUWVBFX1BDTEsyKSB7CisgICAgICBNT0RJRllfUkVHKFJDQy0+Q0ZHUiwgUkNDX0NGR1JfUFBSRTIsIFJDQ19IQ0xLX0RJVjE2KTsKKyAgICB9CisKKyAgICAvKiBTZXQgdGhlIG5ldyBIQ0xLIGNsb2NrIGRpdmlkZXIgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX0hDTEsoUkNDX0Nsa0luaXRTdHJ1Y3QtPkFIQkNMS0RpdmlkZXIpKTsKKyAgICBNT0RJRllfUkVHKFJDQy0+Q0ZHUiwgUkNDX0NGR1JfSFBSRSwgUkNDX0Nsa0luaXRTdHJ1Y3QtPkFIQkNMS0RpdmlkZXIpOworICB9IGVsc2UgeworICAgIC8qIElzIGludGVybWVkaWF0ZSBIQ0xLIHByZXNjYWxlciAyIGFwcGxpZWQgaW50ZXJuYWxseSwgY29tcGxldGUgd2l0aCBIQ0xLCisgICAgICogcHJlc2NhbGVyIDEgKi8KKyAgICBpZiAoaHByZSA9PSBSQ0NfU1lTQ0xLX0RJVjIpIHsKKyAgICAgIE1PRElGWV9SRUcoUkNDLT5DRkdSLCBSQ0NfQ0ZHUl9IUFJFLCBSQ0NfU1lTQ0xLX0RJVjEpOworICAgIH0KKyAgfQorCisgIC8qIERlY3JlYXNpbmcgdGhlIG51bWJlciBvZiB3YWl0IHN0YXRlcyBiZWNhdXNlIG9mIGxvd2VyIENQVSBmcmVxdWVuY3kgKi8KKyAgaWYgKEZMYXRlbmN5IDwgX19IQUxfRkxBU0hfR0VUX0xBVEVOQ1koKSkgeworICAgIC8qIFByb2dyYW0gdGhlIG5ldyBudW1iZXIgb2Ygd2FpdCBzdGF0ZXMgdG8gdGhlIExBVEVOQ1kgYml0cyBpbiB0aGUKKyAgICAgKiBGTEFTSF9BQ1IgcmVnaXN0ZXIgKi8KKyAgICBfX0hBTF9GTEFTSF9TRVRfTEFURU5DWShGTGF0ZW5jeSk7CisKKyAgICAvKiBDaGVjayB0aGF0IHRoZSBuZXcgbnVtYmVyIG9mIHdhaXQgc3RhdGVzIGlzIHRha2VuIGludG8gYWNjb3VudCB0byBhY2Nlc3MKKyAgICB0aGUgRmxhc2ggbWVtb3J5IGJ5IHBvbGxpbmcgdGhlIEZMQVNIX0FDUiByZWdpc3RlciAqLworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICB3aGlsZSAoX19IQUxfRkxBU0hfR0VUX0xBVEVOQ1koKSAhPSBGTGF0ZW5jeSkgeworICAgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IENMT0NLU1dJVENIX1RJTUVPVVRfVkFMVUUpIHsKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUENMSzEgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKChSQ0NfQ2xrSW5pdFN0cnVjdC0+Q2xvY2tUeXBlKSAmIFJDQ19DTE9DS1RZUEVfUENMSzEpID09CisgICAgICBSQ0NfQ0xPQ0tUWVBFX1BDTEsxKSB7CisgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19QQ0xLKFJDQ19DbGtJbml0U3RydWN0LT5BUEIxQ0xLRGl2aWRlcikpOworICAgIE1PRElGWV9SRUcoUkNDLT5DRkdSLCBSQ0NfQ0ZHUl9QUFJFMSwgUkNDX0Nsa0luaXRTdHJ1Y3QtPkFQQjFDTEtEaXZpZGVyKTsKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUENMSzIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKChSQ0NfQ2xrSW5pdFN0cnVjdC0+Q2xvY2tUeXBlKSAmIFJDQ19DTE9DS1RZUEVfUENMSzIpID09CisgICAgICBSQ0NfQ0xPQ0tUWVBFX1BDTEsyKSB7CisgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19QQ0xLKFJDQ19DbGtJbml0U3RydWN0LT5BUEIyQ0xLRGl2aWRlcikpOworICAgIE1PRElGWV9SRUcoUkNDLT5DRkdSLCBSQ0NfQ0ZHUl9QUFJFMiwKKyAgICAgICAgICAgICAgICgoUkNDX0Nsa0luaXRTdHJ1Y3QtPkFQQjJDTEtEaXZpZGVyKSA8PCAzVSkpOworICB9CisKKyAgLyogVXBkYXRlIHRoZSBTeXN0ZW1Db3JlQ2xvY2sgZ2xvYmFsIHZhcmlhYmxlICovCisgIFN5c3RlbUNvcmVDbG9jayA9CisgICAgICBIQUxfUkNDX0dldFN5c0Nsb2NrRnJlcSgpID4+CisgICAgICAoQUhCUHJlc2NUYWJsZVtSRUFEX0JJVChSQ0MtPkNGR1IsIFJDQ19DRkdSX0hQUkUpID4+IFJDQ19DRkdSX0hQUkVfUG9zXSAmCisgICAgICAgMHgxRlUpOworCisgIC8qIENvbmZpZ3VyZSB0aGUgc291cmNlIG9mIHRpbWUgYmFzZSBjb25zaWRlcmluZyBuZXcgc3lzdGVtIGNsb2NrcyBzZXR0aW5ncyovCisgIHJldHVybiBIQUxfSW5pdFRpY2sodXdUaWNrUHJpbyk7Cit9CisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFJDQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICBSQ0MgY2xvY2tzIGNvbnRyb2wgZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisKKyAgICAoKykgT3V0cHV0IGNsb2NrIHRvIE1DTyBwaW4uCisgICAgKCspIFJldHJpZXZlIGN1cnJlbnQgY2xvY2sgZnJlcXVlbmNpZXMuCisgICAgKCspIEVuYWJsZSB0aGUgQ2xvY2sgU2VjdXJpdHkgU3lzdGVtLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAqIEBicmllZiAgU2VsZWN0IHRoZSBjbG9jayBzb3VyY2UgdG8gb3V0cHV0IG9uIE1DTyBwaW4oUEE4L1BHMTApLgorICogQG5vdGUgICBQQTgvUEcxMCBzaG91bGQgYmUgY29uZmlndXJlZCBpbiBhbHRlcm5hdGUgZnVuY3Rpb24gbW9kZS4KKyAqIEBub3RlICAgVGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBvZiB0aGUgR1BJT0cgcGluIDEwIChQRzEwKSBpcyBzZXQgdG8gcmVzZXQKKyAqIG1vZGUgKE5SU1QgcGluKSBhbmQgdXNlciBzaGFsbCBzZXQgdGhlIE5SU1RfTU9ERSBCaXQgaW4gdGhlIEZMQVNIIE9QVFIKKyAqIHJlZ2lzdGVyIHRvIGJlIGFibGUgdG8gdXNlIGl0IGFzIGFuIE1DTyBwaW4uIFRoZSBAcmVmIEhBTF9GTEFTSEV4X09CUHJvZ3JhbSgpCisgKiBBUEkgY2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIHRoZSBOUlNUX01PREUgQml0IHZhbHVlLgorICogQHBhcmFtICBSQ0NfTUNPeCAgc3BlY2lmaWVzIHRoZSBvdXRwdXQgZGlyZWN0aW9uIGZvciB0aGUgY2xvY2sgc291cmNlLgorICogICAgICAgICAgRm9yIFNUTTMyRzR4eCBmYW1pbHkgdGhpcyBwYXJhbWV0ZXIgY2FuIGhhdmUgb25seSBvbmUgdmFsdWU6CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPX1BBOCAgQ2xvY2sgc291cmNlIHRvIG91dHB1dCBvbiBNQ08xIHBpbihQQTgpLgorICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DT19QRzEwICBDbG9jayBzb3VyY2UgdG8gb3V0cHV0IG9uIE1DTzEgcGluKFBHMTApLgorICogQHBhcmFtICBSQ0NfTUNPU291cmNlICBzcGVjaWZpZXMgdGhlIGNsb2NrIHNvdXJjZSB0byBvdXRwdXQuCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DTzFTT1VSQ0VfTk9DTE9DSyAgTUNPIG91dHB1dCBkaXNhYmxlZCwgbm8gY2xvY2sgb24KKyAqIE1DTworICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DTzFTT1VSQ0VfU1lTQ0xLICBzeXN0ZW0gIGNsb2NrIHNlbGVjdGVkIGFzIE1DTworICogc291cmNlCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPMVNPVVJDRV9IU0kgIEhTSSBjbG9jayBzZWxlY3RlZCBhcyBNQ08gc291cmNlCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPMVNPVVJDRV9IU0UgIEhTRSBjbG9jayBzZWxlY3RlZCBhcyBNQ08gc291cmNlCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPMVNPVVJDRV9QTExDTEsgIG1haW4gUExMIGNsb2NrIHNlbGVjdGVkIGFzIE1DTworICogc291cmNlCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPMVNPVVJDRV9MU0kgIExTSSBjbG9jayBzZWxlY3RlZCBhcyBNQ08gc291cmNlCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPMVNPVVJDRV9MU0UgIExTRSBjbG9jayBzZWxlY3RlZCBhcyBNQ08gc291cmNlCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPMVNPVVJDRV9IU0k0OCAgSFNJNDggY2xvY2sgc2VsZWN0ZWQgYXMgTUNPIHNvdXJjZQorICogZm9yIGRldmljZXMgd2l0aCBIU0k0OAorICogQHBhcmFtICBSQ0NfTUNPRGl2ICBzcGVjaWZpZXMgdGhlIE1DTyBwcmVzY2FsZXIuCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DT0RJVl8xICBubyBkaXZpc2lvbiBhcHBsaWVkIHRvIE1DTyBjbG9jaworICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DT0RJVl8yICBkaXZpc2lvbiBieSAyIGFwcGxpZWQgdG8gTUNPIGNsb2NrCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPRElWXzQgIGRpdmlzaW9uIGJ5IDQgYXBwbGllZCB0byBNQ08gY2xvY2sKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ09ESVZfOCAgZGl2aXNpb24gYnkgOCBhcHBsaWVkIHRvIE1DTyBjbG9jaworICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DT0RJVl8xNiAgZGl2aXNpb24gYnkgMTYgYXBwbGllZCB0byBNQ08gY2xvY2sKKyAqIEByZXR2YWwgTm9uZQorICovCit2b2lkIEhBTF9SQ0NfTUNPQ29uZmlnKHVpbnQzMl90IFJDQ19NQ094LCB1aW50MzJfdCBSQ0NfTUNPU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBSQ0NfTUNPRGl2KSB7CisgIEdQSU9fSW5pdFR5cGVEZWYgZ3Bpb19pbml0c3RydWN0OworICB1aW50MzJfdCBtY29pbmRleDsKKyAgdWludDMyX3QgbWNvX2dwaW9faW5kZXg7CisgIEdQSU9fVHlwZURlZiAqbWNvX2dwaW9fcG9ydDsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUkNDX01DTyhSQ0NfTUNPeCkpOworCisgIC8qIENvbW1vbiBHUElPIGluaXQgcGFyYW1ldGVycyAqLworICBncGlvX2luaXRzdHJ1Y3QuTW9kZSA9IEdQSU9fTU9ERV9BRl9QUDsKKyAgZ3Bpb19pbml0c3RydWN0LlNwZWVkID0gR1BJT19TUEVFRF9GUkVRX1ZFUllfSElHSDsKKyAgZ3Bpb19pbml0c3RydWN0LlB1bGwgPSBHUElPX05PUFVMTDsKKworICAvKiBHZXQgTUNPeCBzZWxlY3Rpb24gKi8KKyAgbWNvaW5kZXggPSBSQ0NfTUNPeCAmIFJDQ19NQ09fSU5ERVhfTUFTSzsKKworICAvKiBHZXQgTUNPeCBHUElPIFBvcnQgKi8KKyAgbWNvX2dwaW9fcG9ydCA9IChHUElPX1R5cGVEZWYgKilSQ0NfR0VUX01DT19HUElPX1BPUlQoUkNDX01DT3gpOworCisgIC8qIE1DT3ggQ2xvY2sgRW5hYmxlICovCisgIG1jb19ncGlvX2luZGV4ID0gUkNDX0dFVF9NQ09fR1BJT19JTkRFWChSQ0NfTUNPeCk7CisgIFNFVF9CSVQoUkNDLT5BSEIyRU5SLCAoMVVMIDw8IG1jb19ncGlvX2luZGV4KSk7CisKKyAgLyogQ29uZmlndXJlIHRoZSBNQ094IHBpbiBpbiBhbHRlcm5hdGUgZnVuY3Rpb24gbW9kZSAqLworICBncGlvX2luaXRzdHJ1Y3QuUGluID0gUkNDX0dFVF9NQ09fR1BJT19QSU4oUkNDX01DT3gpOworICBncGlvX2luaXRzdHJ1Y3QuQWx0ZXJuYXRlID0gUkNDX0dFVF9NQ09fR1BJT19BRihSQ0NfTUNPeCk7CisgIEhBTF9HUElPX0luaXQobWNvX2dwaW9fcG9ydCwgJmdwaW9faW5pdHN0cnVjdCk7CisKKyAgaWYgKG1jb2luZGV4ID09IFJDQ19NQ08xX0lOREVYKSB7CisgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19NQ09ESVYoUkNDX01DT0RpdikpOworICAgIGFzc2VydF9wYXJhbShJU19SQ0NfTUNPMVNPVVJDRShSQ0NfTUNPU291cmNlKSk7CisgICAgLyogTWFzayBNQ09TRUxbXSBhbmQgTUNPUFJFW10gYml0cyB0aGVuIHNldCBNQ08gY2xvY2sgc291cmNlIGFuZCBwcmVzY2FsZXIKKyAgICAgKi8KKyAgICBNT0RJRllfUkVHKFJDQy0+Q0ZHUiwgKFJDQ19DRkdSX01DT1NFTCB8IFJDQ19DRkdSX01DT1BSRSksCisgICAgICAgICAgICAgICAoUkNDX01DT1NvdXJjZSB8IFJDQ19NQ09EaXYpKTsKKyAgfQorfQorCisvKioKKyAqIEBicmllZiAgUmV0dXJuIHRoZSBTWVNDTEsgZnJlcXVlbmN5LgorICoKKyAqIEBub3RlICAgVGhlIHN5c3RlbSBmcmVxdWVuY3kgY29tcHV0ZWQgYnkgdGhpcyBmdW5jdGlvbiBpcyBub3QgdGhlIHJlYWwKKyAqICAgICAgICAgZnJlcXVlbmN5IGluIHRoZSBjaGlwLiBJdCBpcyBjYWxjdWxhdGVkIGJhc2VkIG9uIHRoZSBwcmVkZWZpbmVkCisgKiAgICAgICAgIGNvbnN0YW50IGFuZCB0aGUgc2VsZWN0ZWQgY2xvY2sgc291cmNlOgorICogQG5vdGUgICAgIElmIFNZU0NMSyBzb3VyY2UgaXMgSFNJLCBmdW5jdGlvbiByZXR1cm5zIHZhbHVlcyBiYXNlZCBvbgorICogSFNJX1ZBTFVFKCopCisgKiBAbm90ZSAgICAgSWYgU1lTQ0xLIHNvdXJjZSBpcyBIU0UsIGZ1bmN0aW9uIHJldHVybnMgdmFsdWVzIGJhc2VkIG9uCisgKiBIU0VfVkFMVUUoKiopCisgKiBAbm90ZSAgICAgSWYgU1lTQ0xLIHNvdXJjZSBpcyBQTEwsIGZ1bmN0aW9uIHJldHVybnMgdmFsdWVzIGJhc2VkIG9uCisgKiBIU0VfVkFMVUUoKiopLCBIU0lfVkFMVUUoKikgVmFsdWUgbXVsdGlwbGllZC9kaXZpZGVkIGJ5IHRoZSBQTEwgZmFjdG9ycy4KKyAqIEBub3RlICAgICAoKikgSFNJX1ZBTFVFIGlzIGEgY29uc3RhbnQgZGVmaW5lZCBpbiBzdG0zMmc0eHhfaGFsX2NvbmYuaCBmaWxlCisgKiAoZGVmYXVsdCB2YWx1ZSAxNiBNSHopIGJ1dCB0aGUgcmVhbCB2YWx1ZSBtYXkgdmFyeSBkZXBlbmRpbmcgb24gdGhlCisgKiB2YXJpYXRpb25zIGluIHZvbHRhZ2UgYW5kIHRlbXBlcmF0dXJlLgorICogQG5vdGUgICAgICgqKikgSFNFX1ZBTFVFIGlzIGEgY29uc3RhbnQgZGVmaW5lZCBpbiBzdG0zMmc0eHhfaGFsX2NvbmYuaCBmaWxlCisgKiAoZGVmYXVsdCB2YWx1ZSA4IE1IeiksIHVzZXIgaGFzIHRvIGVuc3VyZSB0aGF0IEhTRV9WQUxVRSBpcyBzYW1lIGFzIHRoZSByZWFsCisgKiAgICAgICAgICAgICAgICBmcmVxdWVuY3kgb2YgdGhlIGNyeXN0YWwgdXNlZC4gT3RoZXJ3aXNlLCB0aGlzIGZ1bmN0aW9uIG1heQorICogICAgICAgICAgICAgICAgaGF2ZSB3cm9uZyByZXN1bHQuCisgKgorICogQG5vdGUgICBUaGUgcmVzdWx0IG9mIHRoaXMgZnVuY3Rpb24gY291bGQgYmUgbm90IGNvcnJlY3Qgd2hlbiB1c2luZworICogZnJhY3Rpb25hbCB2YWx1ZSBmb3IgSFNFIGNyeXN0YWwuCisgKgorICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGJ5IHRoZSB1c2VyIGFwcGxpY2F0aW9uIHRvIGNvbXB1dGUgdGhlCisgKiAgICAgICAgIGJhdWRyYXRlIGZvciB0aGUgY29tbXVuaWNhdGlvbiBwZXJpcGhlcmFscyBvciBjb25maWd1cmUgb3RoZXIKKyAqIHBhcmFtZXRlcnMuCisgKgorICogQG5vdGUgICBFYWNoIHRpbWUgU1lTQ0xLIGNoYW5nZXMsIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgdG8gdXBkYXRlIHRoZQorICogICAgICAgICByaWdodCBTWVNDTEsgdmFsdWUuIE90aGVyd2lzZSwgYW55IGNvbmZpZ3VyYXRpb24gYmFzZWQgb24gdGhpcworICogZnVuY3Rpb24gd2lsbCBiZSBpbmNvcnJlY3QuCisgKgorICoKKyAqIEByZXR2YWwgU1lTQ0xLIGZyZXF1ZW5jeQorICovCit1aW50MzJfdCBIQUxfUkNDX0dldFN5c0Nsb2NrRnJlcSh2b2lkKSB7CisgIHVpbnQzMl90IHBsbHZjbywgcGxsc291cmNlLCBwbGxyLCBwbGxtOworICB1aW50MzJfdCBzeXNjbG9ja2ZyZXE7CisKKyAgaWYgKF9fSEFMX1JDQ19HRVRfU1lTQ0xLX1NPVVJDRSgpID09IFJDQ19DRkdSX1NXU19IU0kpIHsKKyAgICAvKiBIU0kgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgc291cmNlICovCisgICAgc3lzY2xvY2tmcmVxID0gSFNJX1ZBTFVFOworICB9IGVsc2UgaWYgKF9fSEFMX1JDQ19HRVRfU1lTQ0xLX1NPVVJDRSgpID09IFJDQ19DRkdSX1NXU19IU0UpIHsKKyAgICAvKiBIU0UgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgc291cmNlICovCisgICAgc3lzY2xvY2tmcmVxID0gSFNFX1ZBTFVFOworICB9IGVsc2UgaWYgKF9fSEFMX1JDQ19HRVRfU1lTQ0xLX1NPVVJDRSgpID09IFJDQ19DRkdSX1NXU19QTEwpIHsKKyAgICAvKiBQTEwgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgIHNvdXJjZSAqLworCisgICAgLyogUExMX1ZDTyA9ICgoSFNFX1ZBTFVFIG9yIEhTSV9WQUxVRSkvIFBMTE0pICogUExMTgorICAgIFNZU0NMSyA9IFBMTF9WQ08gLyBQTExSCisgICAgKi8KKyAgICBwbGxzb3VyY2UgPSBSRUFEX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTFNSQyk7CisgICAgcGxsbSA9CisgICAgICAgIChSRUFEX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTE0pID4+IFJDQ19QTExDRkdSX1BMTE1fUG9zKSArIDFVOworCisgICAgc3dpdGNoIChwbGxzb3VyY2UpIHsKKyAgICAgIGNhc2UgUkNDX1BMTFNPVVJDRV9IU0U6IC8qIEhTRSB1c2VkIGFzIFBMTCBjbG9jayBzb3VyY2UgKi8KKyAgICAgICAgcGxsdmNvID0KKyAgICAgICAgICAgIChIU0VfVkFMVUUgLyBwbGxtKSAqCisgICAgICAgICAgICAoUkVBRF9CSVQoUkNDLT5QTExDRkdSLCBSQ0NfUExMQ0ZHUl9QTExOKSA+PiBSQ0NfUExMQ0ZHUl9QTExOX1Bvcyk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFJDQ19QTExTT1VSQ0VfSFNJOiAvKiBIU0kgdXNlZCBhcyBQTEwgY2xvY2sgc291cmNlICovCisgICAgICBkZWZhdWx0OgorICAgICAgICBwbGx2Y28gPQorICAgICAgICAgICAgKEhTSV9WQUxVRSAvIHBsbG0pICoKKyAgICAgICAgICAgIChSRUFEX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTE4pID4+IFJDQ19QTExDRkdSX1BMTE5fUG9zKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHBsbHIgPSAoKFJFQURfQklUKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMUikgPj4gUkNDX1BMTENGR1JfUExMUl9Qb3MpICsKKyAgICAgICAgICAgIDFVKSAqCisgICAgICAgICAgIDJVOworICAgIHN5c2Nsb2NrZnJlcSA9IHBsbHZjbyAvIHBsbHI7CisgIH0gZWxzZSB7CisgICAgc3lzY2xvY2tmcmVxID0gMFU7CisgIH0KKworICByZXR1cm4gc3lzY2xvY2tmcmVxOworfQorCisvKioKKyAqIEBicmllZiAgUmV0dXJuIHRoZSBIQ0xLIGZyZXF1ZW5jeS4KKyAqIEBub3RlICAgRWFjaCB0aW1lIEhDTEsgY2hhbmdlcywgdGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB0byB1cGRhdGUgdGhlCisgKiAgICAgICAgIHJpZ2h0IEhDTEsgdmFsdWUuIE90aGVyd2lzZSwgYW55IGNvbmZpZ3VyYXRpb24gYmFzZWQgb24gdGhpcyBmdW5jdGlvbgorICogd2lsbCBiZSBpbmNvcnJlY3QuCisgKgorICogQG5vdGUgICBUaGUgU3lzdGVtQ29yZUNsb2NrIENNU0lTIHZhcmlhYmxlIGlzIHVzZWQgdG8gc3RvcmUgU3lzdGVtIENsb2NrCisgKiBGcmVxdWVuY3kuCisgKiBAcmV0dmFsIEhDTEsgZnJlcXVlbmN5IGluIEh6CisgKi8KK3VpbnQzMl90IEhBTF9SQ0NfR2V0SENMS0ZyZXEodm9pZCkgeyByZXR1cm4gU3lzdGVtQ29yZUNsb2NrOyB9CisKKy8qKgorICogQGJyaWVmICBSZXR1cm4gdGhlIFBDTEsxIGZyZXF1ZW5jeS4KKyAqIEBub3RlICAgRWFjaCB0aW1lIFBDTEsxIGNoYW5nZXMsIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgdG8gdXBkYXRlIHRoZQorICogICAgICAgICByaWdodCBQQ0xLMSB2YWx1ZS4gT3RoZXJ3aXNlLCBhbnkgY29uZmlndXJhdGlvbiBiYXNlZCBvbiB0aGlzCisgKiBmdW5jdGlvbiB3aWxsIGJlIGluY29ycmVjdC4KKyAqIEByZXR2YWwgUENMSzEgZnJlcXVlbmN5IGluIEh6CisgKi8KK3VpbnQzMl90IEhBTF9SQ0NfR2V0UENMSzFGcmVxKHZvaWQpIHsKKyAgLyogR2V0IEhDTEsgc291cmNlIGFuZCBDb21wdXRlIFBDTEsxIGZyZXF1ZW5jeSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICByZXR1cm4gKEhBTF9SQ0NfR2V0SENMS0ZyZXEoKSA+PgorICAgICAgICAgIChBUEJQcmVzY1RhYmxlW1JFQURfQklUKFJDQy0+Q0ZHUiwgUkNDX0NGR1JfUFBSRTEpID4+CisgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX0NGR1JfUFBSRTFfUG9zXSAmCisgICAgICAgICAgIDB4MUZVKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBSZXR1cm4gdGhlIFBDTEsyIGZyZXF1ZW5jeS4KKyAqIEBub3RlICAgRWFjaCB0aW1lIFBDTEsyIGNoYW5nZXMsIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgdG8gdXBkYXRlIHRoZQorICogICAgICAgICByaWdodCBQQ0xLMiB2YWx1ZS4gT3RoZXJ3aXNlLCBhbnkgY29uZmlndXJhdGlvbiBiYXNlZCBvbiB0aGlzCisgKiBmdW5jdGlvbiB3aWxsIGJlIGluY29ycmVjdC4KKyAqIEByZXR2YWwgUENMSzIgZnJlcXVlbmN5IGluIEh6CisgKi8KK3VpbnQzMl90IEhBTF9SQ0NfR2V0UENMSzJGcmVxKHZvaWQpIHsKKyAgLyogR2V0IEhDTEsgc291cmNlIGFuZCBDb21wdXRlIFBDTEsyIGZyZXF1ZW5jeSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICByZXR1cm4gKEhBTF9SQ0NfR2V0SENMS0ZyZXEoKSA+PgorICAgICAgICAgIChBUEJQcmVzY1RhYmxlW1JFQURfQklUKFJDQy0+Q0ZHUiwgUkNDX0NGR1JfUFBSRTIpID4+CisgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX0NGR1JfUFBSRTJfUG9zXSAmCisgICAgICAgICAgIDB4MUZVKSk7Cit9CisKKy8qKgorICogQGJyaWVmICBDb25maWd1cmUgdGhlIFJDQ19Pc2NJbml0U3RydWN0IGFjY29yZGluZyB0byB0aGUgaW50ZXJuYWwKKyAqICAgICAgICAgUkNDIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzLgorICogQHBhcmFtICBSQ0NfT3NjSW5pdFN0cnVjdCAgcG9pbnRlciB0byBhbiBSQ0NfT3NjSW5pdFR5cGVEZWYgc3RydWN0dXJlIHRoYXQKKyAqICAgICAgICAgd2lsbCBiZSBjb25maWd1cmVkLgorICogQHJldHZhbCBOb25lCisgKi8KK3ZvaWQgSEFMX1JDQ19HZXRPc2NDb25maWcoUkNDX09zY0luaXRUeXBlRGVmICpSQ0NfT3NjSW5pdFN0cnVjdCkgeworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oUkNDX09zY0luaXRTdHJ1Y3QgIT0gKHZvaWQgKilOVUxMKTsKKworICAvKiBTZXQgYWxsIHBvc3NpYmxlIHZhbHVlcyBmb3IgdGhlIE9zY2lsbGF0b3IgdHlwZSBwYXJhbWV0ZXIgLS0tLS0tLS0tLS0tLS0tKi8KKyAgUkNDX09zY0luaXRTdHJ1Y3QtPk9zY2lsbGF0b3JUeXBlID0KKyAgICAgIFJDQ19PU0NJTExBVE9SVFlQRV9IU0UgfCBSQ0NfT1NDSUxMQVRPUlRZUEVfSFNJIHwgUkNDX09TQ0lMTEFUT1JUWVBFX0xTRSB8CisgICAgICBSQ0NfT1NDSUxMQVRPUlRZUEVfTFNJIHwgUkNDX09TQ0lMTEFUT1JUWVBFX0hTSTQ4OworCisgIC8qIEdldCB0aGUgSFNFIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoUkVBRF9CSVQoUkNDLT5DUiwgUkNDX0NSX0hTRUJZUCkgPT0gUkNDX0NSX0hTRUJZUCkgeworICAgIFJDQ19Pc2NJbml0U3RydWN0LT5IU0VTdGF0ZSA9IFJDQ19IU0VfQllQQVNTOworICB9IGVsc2UgaWYgKFJFQURfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0VPTikgPT0gUkNDX0NSX0hTRU9OKSB7CisgICAgUkNDX09zY0luaXRTdHJ1Y3QtPkhTRVN0YXRlID0gUkNDX0hTRV9PTjsKKyAgfSBlbHNlIHsKKyAgICBSQ0NfT3NjSW5pdFN0cnVjdC0+SFNFU3RhdGUgPSBSQ0NfSFNFX09GRjsKKyAgfQorCisgIC8qIEdldCB0aGUgSFNJIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoUkVBRF9CSVQoUkNDLT5DUiwgUkNDX0NSX0hTSU9OKSA9PSBSQ0NfQ1JfSFNJT04pIHsKKyAgICBSQ0NfT3NjSW5pdFN0cnVjdC0+SFNJU3RhdGUgPSBSQ0NfSFNJX09OOworICB9IGVsc2UgeworICAgIFJDQ19Pc2NJbml0U3RydWN0LT5IU0lTdGF0ZSA9IFJDQ19IU0lfT0ZGOworICB9CisKKyAgUkNDX09zY0luaXRTdHJ1Y3QtPkhTSUNhbGlicmF0aW9uVmFsdWUgPQorICAgICAgUkVBRF9CSVQoUkNDLT5JQ1NDUiwgUkNDX0lDU0NSX0hTSVRSSU0pID4+IFJDQ19JQ1NDUl9IU0lUUklNX1BvczsKKworICAvKiBHZXQgdGhlIExTRSBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKFJFQURfQklUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfTFNFQllQKSA9PSBSQ0NfQkRDUl9MU0VCWVApIHsKKyAgICBSQ0NfT3NjSW5pdFN0cnVjdC0+TFNFU3RhdGUgPSBSQ0NfTFNFX0JZUEFTUzsKKyAgfSBlbHNlIGlmIChSRUFEX0JJVChSQ0MtPkJEQ1IsIFJDQ19CRENSX0xTRU9OKSA9PSBSQ0NfQkRDUl9MU0VPTikgeworICAgIFJDQ19Pc2NJbml0U3RydWN0LT5MU0VTdGF0ZSA9IFJDQ19MU0VfT047CisgIH0gZWxzZSB7CisgICAgUkNDX09zY0luaXRTdHJ1Y3QtPkxTRVN0YXRlID0gUkNDX0xTRV9PRkY7CisgIH0KKworICAvKiBHZXQgdGhlIExTSSBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKFJFQURfQklUKFJDQy0+Q1NSLCBSQ0NfQ1NSX0xTSU9OKSA9PSBSQ0NfQ1NSX0xTSU9OKSB7CisgICAgUkNDX09zY0luaXRTdHJ1Y3QtPkxTSVN0YXRlID0gUkNDX0xTSV9PTjsKKyAgfSBlbHNlIHsKKyAgICBSQ0NfT3NjSW5pdFN0cnVjdC0+TFNJU3RhdGUgPSBSQ0NfTFNJX09GRjsKKyAgfQorCisgIC8qIEdldCB0aGUgSFNJNDggY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoUkVBRF9CSVQoUkNDLT5DUlJDUiwgUkNDX0NSUkNSX0hTSTQ4T04pID09IFJDQ19DUlJDUl9IU0k0OE9OKSB7CisgICAgUkNDX09zY0luaXRTdHJ1Y3QtPkhTSTQ4U3RhdGUgPSBSQ0NfSFNJNDhfT047CisgIH0gZWxzZSB7CisgICAgUkNDX09zY0luaXRTdHJ1Y3QtPkhTSTQ4U3RhdGUgPSBSQ0NfSFNJNDhfT0ZGOworICB9CisKKyAgLyogR2V0IHRoZSBQTEwgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmIChSRUFEX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfUExMT04pID09IFJDQ19DUl9QTExPTikgeworICAgIFJDQ19Pc2NJbml0U3RydWN0LT5QTEwuUExMU3RhdGUgPSBSQ0NfUExMX09OOworICB9IGVsc2UgeworICAgIFJDQ19Pc2NJbml0U3RydWN0LT5QTEwuUExMU3RhdGUgPSBSQ0NfUExMX09GRjsKKyAgfQorICBSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTFNvdXJjZSA9IFJFQURfQklUKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMU1JDKTsKKyAgUkNDX09zY0luaXRTdHJ1Y3QtPlBMTC5QTExNID0KKyAgICAgIChSRUFEX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTE0pID4+IFJDQ19QTExDRkdSX1BMTE1fUG9zKSArIDFVOworICBSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTE4gPQorICAgICAgUkVBRF9CSVQoUkNDLT5QTExDRkdSLCBSQ0NfUExMQ0ZHUl9QTExOKSA+PiBSQ0NfUExMQ0ZHUl9QTExOX1BvczsKKyAgUkNDX09zY0luaXRTdHJ1Y3QtPlBMTC5QTExRID0KKyAgICAgICgoKFJFQURfQklUKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMUSkgPj4gUkNDX1BMTENGR1JfUExMUV9Qb3MpICsgMVUpCisgICAgICAgPDwgMVUpOworICBSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTFIgPQorICAgICAgKCgoUkVBRF9CSVQoUkNDLT5QTExDRkdSLCBSQ0NfUExMQ0ZHUl9QTExSKSA+PiBSQ0NfUExMQ0ZHUl9QTExSX1BvcykgKyAxVSkKKyAgICAgICA8PCAxVSk7CisgIFJDQ19Pc2NJbml0U3RydWN0LT5QTEwuUExMUCA9CisgICAgICBSRUFEX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTFBESVYpID4+IFJDQ19QTExDRkdSX1BMTFBESVZfUG9zOworfQorCisvKioKKyAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBSQ0NfQ2xrSW5pdFN0cnVjdCBhY2NvcmRpbmcgdG8gdGhlIGludGVybmFsCisgKiAgICAgICAgIFJDQyBjb25maWd1cmF0aW9uIHJlZ2lzdGVycy4KKyAqIEBwYXJhbSAgUkNDX0Nsa0luaXRTdHJ1Y3QgIHBvaW50ZXIgdG8gYW4gUkNDX0Nsa0luaXRUeXBlRGVmIHN0cnVjdHVyZSB0aGF0CisgKiAgICAgICAgIHdpbGwgYmUgY29uZmlndXJlZC4KKyAqIEBwYXJhbSAgcEZMYXRlbmN5ICBQb2ludGVyIG9uIHRoZSBGbGFzaCBMYXRlbmN5LgorICogQHJldHZhbCBOb25lCisgKi8KK3ZvaWQgSEFMX1JDQ19HZXRDbG9ja0NvbmZpZyhSQ0NfQ2xrSW5pdFR5cGVEZWYgKlJDQ19DbGtJbml0U3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwRkxhdGVuY3kpIHsKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKFJDQ19DbGtJbml0U3RydWN0ICE9ICh2b2lkICopTlVMTCk7CisgIGFzc2VydF9wYXJhbShwRkxhdGVuY3kgIT0gKHZvaWQgKilOVUxMKTsKKworICAvKiBTZXQgYWxsIHBvc3NpYmxlIHZhbHVlcyBmb3IgdGhlIENsb2NrIHR5cGUgcGFyYW1ldGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgUkNDX0Nsa0luaXRTdHJ1Y3QtPkNsb2NrVHlwZSA9IFJDQ19DTE9DS1RZUEVfU1lTQ0xLIHwgUkNDX0NMT0NLVFlQRV9IQ0xLIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19DTE9DS1RZUEVfUENMSzEgfCBSQ0NfQ0xPQ0tUWVBFX1BDTEsyOworCisgIC8qIEdldCB0aGUgU1lTQ0xLIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBSQ0NfQ2xrSW5pdFN0cnVjdC0+U1lTQ0xLU291cmNlID0gUkVBRF9CSVQoUkNDLT5DRkdSLCBSQ0NfQ0ZHUl9TVyk7CisKKyAgLyogR2V0IHRoZSBIQ0xLIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFJDQ19DbGtJbml0U3RydWN0LT5BSEJDTEtEaXZpZGVyID0gUkVBRF9CSVQoUkNDLT5DRkdSLCBSQ0NfQ0ZHUl9IUFJFKTsKKworICAvKiBHZXQgdGhlIEFQQjEgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgUkNDX0Nsa0luaXRTdHJ1Y3QtPkFQQjFDTEtEaXZpZGVyID0gUkVBRF9CSVQoUkNDLT5DRkdSLCBSQ0NfQ0ZHUl9QUFJFMSk7CisKKyAgLyogR2V0IHRoZSBBUEIyIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFJDQ19DbGtJbml0U3RydWN0LT5BUEIyQ0xLRGl2aWRlciA9CisgICAgICAoUkVBRF9CSVQoUkNDLT5DRkdSLCBSQ0NfQ0ZHUl9QUFJFMikgPj4gM1UpOworCisgIC8qIEdldCB0aGUgRmxhc2ggV2FpdCBTdGF0ZSAoTGF0ZW5jeSkgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAqcEZMYXRlbmN5ID0gX19IQUxfRkxBU0hfR0VUX0xBVEVOQ1koKTsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSB0aGUgQ2xvY2sgU2VjdXJpdHkgU3lzdGVtLgorICogQG5vdGUgICBJZiBhIGZhaWx1cmUgaXMgZGV0ZWN0ZWQgb24gdGhlIEhTRSBvc2NpbGxhdG9yIGNsb2NrLCB0aGlzIG9zY2lsbGF0b3IKKyAqICAgICAgICAgaXMgYXV0b21hdGljYWxseSBkaXNhYmxlZCBhbmQgYW4gaW50ZXJydXB0IGlzIGdlbmVyYXRlZCB0byBpbmZvcm0gdGhlCisgKiAgICAgICAgIHNvZnR3YXJlIGFib3V0IHRoZSBmYWlsdXJlIChDbG9jayBTZWN1cml0eSBTeXN0ZW0gSW50ZXJydXB0LCBDU1NJKSwKKyAqICAgICAgICAgYWxsb3dpbmcgdGhlIE1DVSB0byBwZXJmb3JtIHJlc2N1ZSBvcGVyYXRpb25zLiBUaGUgQ1NTSSBpcyBsaW5rZWQgdG8KKyAqICAgICAgICAgdGhlIENvcnRleC1NNCBOTUkgKE5vbi1NYXNrYWJsZSBJbnRlcnJ1cHQpIGV4Y2VwdGlvbiB2ZWN0b3IuCisgKiBAbm90ZSAgIFRoZSBDbG9jayBTZWN1cml0eSBTeXN0ZW0gY2FuIG9ubHkgYmUgY2xlYXJlZCBieSByZXNldC4KKyAqIEByZXR2YWwgTm9uZQorICovCit2b2lkIEhBTF9SQ0NfRW5hYmxlQ1NTKHZvaWQpIHsgU0VUX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfQ1NTT04pOyB9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgdGhlIExTRSBDbG9jayBTZWN1cml0eSBTeXN0ZW0uCisgKiBAbm90ZSAgIElmIGEgZmFpbHVyZSBpcyBkZXRlY3RlZCBvbiB0aGUgZXh0ZXJuYWwgMzIga0h6IG9zY2lsbGF0b3IsCisgKiAgICAgICAgIHRoZSBMU0UgY2xvY2sgaXMgbm8gbG9uZ2VyIHN1cHBsaWVkIHRvIHRoZSBSVEMgYnV0IG5vIGhhcmR3YXJlIGFjdGlvbgorICogICAgICAgICBpcyBtYWRlIHRvIHRoZSByZWdpc3RlcnMuIElmIGVuYWJsZWQsIGFuIGludGVycnVwdCB3aWxsIGJlIGdlbmVyYXRlZAorICogICAgICAgICBhbmQgaGFuZGxlIHRocm91Z2ggQHJlZiBSQ0NFeF9FWFRJX0xJTkVfTFNFQ1NTCisgKiBAbm90ZSAgIFRoZSBDbG9jayBTZWN1cml0eSBTeXN0ZW0gY2FuIG9ubHkgYmUgY2xlYXJlZCBieSByZXNldCBvciBhZnRlciBhIExTRQorICogZmFpbHVyZSBkZXRlY3Rpb24uCisgKiBAcmV0dmFsIE5vbmUKKyAqLwordm9pZCBIQUxfUkNDX0VuYWJsZUxTRUNTUyh2b2lkKSB7IFNFVF9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9MU0VDU1NPTik7IH0KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgdGhlIExTRSBDbG9jayBTZWN1cml0eSBTeXN0ZW0uCisgKiBAbm90ZSAgIEFmdGVyIExTRSBmYWlsdXJlIGRldGVjdGlvbiwgdGhlIHNvZnR3YXJlIG11c3QgZGlzYWJsZSBMU0VDU1NPTgorICogQG5vdGUgICBUaGUgQ2xvY2sgU2VjdXJpdHkgU3lzdGVtIGNhbiBvbmx5IGJlIGNsZWFyZWQgYnkgcmVzZXQgb3RoZXJ3aXNlLgorICogQHJldHZhbCBOb25lCisgKi8KK3ZvaWQgSEFMX1JDQ19EaXNhYmxlTFNFQ1NTKHZvaWQpIHsgQ0xFQVJfQklUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfTFNFQ1NTT04pOyB9CisKKy8qKgorICogQGJyaWVmIEhhbmRsZSB0aGUgUkNDIENsb2NrIFNlY3VyaXR5IFN5c3RlbSBpbnRlcnJ1cHQgcmVxdWVzdC4KKyAqIEBub3RlIFRoaXMgQVBJIHNob3VsZCBiZSBjYWxsZWQgdW5kZXIgdGhlIE5NSV9IYW5kbGVyKCkuCisgKiBAcmV0dmFsIE5vbmUKKyAqLwordm9pZCBIQUxfUkNDX05NSV9JUlFIYW5kbGVyKHZvaWQpIHsKKyAgLyogQ2hlY2sgUkNDIENTU0YgaW50ZXJydXB0IGZsYWcgICovCisgIGlmIChfX0hBTF9SQ0NfR0VUX0lUKFJDQ19JVF9DU1MpKSB7CisgICAgLyogUkNDIENsb2NrIFNlY3VyaXR5IFN5c3RlbSBpbnRlcnJ1cHQgdXNlciBjYWxsYmFjayAqLworICAgIEhBTF9SQ0NfQ1NTQ2FsbGJhY2soKTsKKworICAgIC8qIENsZWFyIFJDQyBDU1MgcGVuZGluZyBiaXQgKi8KKyAgICBfX0hBTF9SQ0NfQ0xFQVJfSVQoUkNDX0lUX0NTUyk7CisgIH0KK30KKworLyoqCisgKiBAYnJpZWYgIFJDQyBDbG9jayBTZWN1cml0eSBTeXN0ZW0gaW50ZXJydXB0IGNhbGxiYWNrLgorICogQHJldHZhbCBub25lCisgKi8KK19fd2VhayB2b2lkIEhBTF9SQ0NfQ1NTQ2FsbGJhY2sodm9pZCkgeworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1JDQ19DU1NDYWxsYmFjayBzaG91bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFJDQ19Qcml2YXRlX0Z1bmN0aW9ucworICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiAgQ29tcHV0ZSBTWVNDTEsgZnJlcXVlbmN5IGJhc2VkIG9uIFBMTCBTWVNDTEsgc291cmNlLgorICogQHJldHZhbCBTWVNDTEsgZnJlcXVlbmN5CisgKi8KK3N0YXRpYyB1aW50MzJfdCBSQ0NfR2V0U3lzQ2xvY2tGcmVxRnJvbVBMTFNvdXJjZSh2b2lkKSB7CisgIHVpbnQzMl90IHBsbHZjbywgcGxsc291cmNlLCBwbGxyLCBwbGxtOworICB1aW50MzJfdCBzeXNjbG9ja2ZyZXE7CisKKyAgLyogUExMX1ZDTyA9IChIU0VfVkFMVUUgb3IgSFNJX1ZBTFVFLyBQTExNKSAqIFBMTE4KKyAgICAgU1lTQ0xLID0gUExMX1ZDTyAvIFBMTFIKKyAgICovCisgIHBsbHNvdXJjZSA9IFJFQURfQklUKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMU1JDKTsKKyAgcGxsbSA9CisgICAgICAoUkVBRF9CSVQoUkNDLT5QTExDRkdSLCBSQ0NfUExMQ0ZHUl9QTExNKSA+PiBSQ0NfUExMQ0ZHUl9QTExNX1BvcykgKyAxVTsKKworICBzd2l0Y2ggKHBsbHNvdXJjZSkgeworICAgIGNhc2UgUkNDX1BMTFNPVVJDRV9IU0U6IC8qIEhTRSB1c2VkIGFzIFBMTCBjbG9jayBzb3VyY2UgKi8KKyAgICAgIHBsbHZjbyA9IChIU0VfVkFMVUUgLyBwbGxtKSAqIChSRUFEX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTE4pID4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BMTENGR1JfUExMTl9Qb3MpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFJDQ19QTExTT1VSQ0VfSFNJOiAvKiBIU0kgdXNlZCBhcyBQTEwgY2xvY2sgc291cmNlICovCisgICAgZGVmYXVsdDoKKyAgICAgIHBsbHZjbyA9IChIU0lfVkFMVUUgLyBwbGxtKSAqIChSRUFEX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTE4pID4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BMTENGR1JfUExMTl9Qb3MpOworICAgICAgYnJlYWs7CisgIH0KKworICBwbGxyID0gKChSRUFEX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTFIpID4+IFJDQ19QTExDRkdSX1BMTFJfUG9zKSArCisgICAgICAgICAgMVUpICoKKyAgICAgICAgIDJVOworICBzeXNjbG9ja2ZyZXEgPSBwbGx2Y28gLyBwbGxyOworCisgIHJldHVybiBzeXNjbG9ja2ZyZXE7Cit9CisKKy8qKgorICogQH0KKyAqLworCisjZW5kaWYgLyogSEFMX1JDQ19NT0RVTEVfRU5BQkxFRCAqLworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLwpkaWZmIC0tZ2l0IGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3JjY19leC5jIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3JjY19leC5jCmluZGV4IGNiMzg3ZDguLmRjYjI0MzAgMTAwNjQ0Ci0tLSBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9yY2NfZXguYworKysgYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfcmNjX2V4LmMKQEAgLTEsMTc0MiArMSwxNzkzIEBACi0vKioNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQGZpbGUgICAgc3RtMzJnNHh4X2hhbF9yY2NfZXguYw0KLSAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtDQotICogQGJyaWVmICAgRXh0ZW5kZWQgUkNDIEhBTCBtb2R1bGUgZHJpdmVyLg0KLSAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcNCi0gKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgUkNDIGV4dGVuZGVkIHBlcmlwaGVyYWw6DQotICogICAgICAgICAgICsgRXh0ZW5kZWQgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucw0KLSAqICAgICAgICAgICArIEV4dGVuZGVkIENsb2NrIG1hbmFnZW1lbnQgZnVuY3Rpb25zDQotICogICAgICAgICAgICsgRXh0ZW5kZWQgQ2xvY2sgUmVjb3ZlcnkgU3lzdGVtIENvbnRyb2wgZnVuY3Rpb25zDQotICoNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQGF0dGVudGlvbg0KLSAqDQotICogQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KLSAqDQotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0ZXJtcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlDQotICppbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb2Z0d2FyZSBjb21wb25lbnQuIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcw0KLSAqd2l0aCB0aGlzIHNvZnR3YXJlLCBpdCBpcyBwcm92aWRlZCBBUy1JUy4NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICovDQotDQotLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaW5jbHVkZSAic3RtMzJnNHh4X2hhbC5oIg0KLQ0KLS8qKiBAYWRkdG9ncm91cCBTVE0zMkc0eHhfSEFMX0RyaXZlcg0KLSAqIEB7DQotICovDQotDQotLyoqIEBkZWZncm91cCBSQ0NFeCBSQ0NFeA0KLSAqIEBicmllZiBSQ0MgRXh0ZW5kZWQgSEFMIG1vZHVsZSBkcml2ZXINCi0gKiBAew0KLSAqLw0KLQ0KLSNpZmRlZiBIQUxfUkNDX01PRFVMRV9FTkFCTEVEDQotDQotLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiBQcml2YXRlIGRlZmluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgUkNDRXhfUHJpdmF0ZV9Db25zdGFudHMgUkNDRXggUHJpdmF0ZSBDb25zdGFudHMNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgUExMX1RJTUVPVVRfVkFMVUUgMlUgLyogMiBtcyAobWluaW11bSBUaWNrICsgMSkgKi8NCi0NCi0jZGVmaW5lIERJVklERVJfUF9VUERBVEUgMFUNCi0jZGVmaW5lIERJVklERVJfUV9VUERBVEUgMVUNCi0jZGVmaW5lIERJVklERVJfUl9VUERBVEUgMlUNCi0NCi0jZGVmaW5lIF9fTFNDT19DTEtfRU5BQkxFKCkgX19IQUxfUkNDX0dQSU9BX0NMS19FTkFCTEUoKQ0KLSNkZWZpbmUgTFNDT19HUElPX1BPUlQgR1BJT0ENCi0jZGVmaW5lIExTQ09fUElOIEdQSU9fUElOXzINCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgUkNDRXhfUHJpdmF0ZV9GdW5jdGlvbnMgUkNDRXggUHJpdmF0ZSBGdW5jdGlvbnMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0NCi0vKiogQGRlZmdyb3VwIFJDQ0V4X0V4cG9ydGVkX0Z1bmN0aW9ucyBSQ0NFeCBFeHBvcnRlZCBGdW5jdGlvbnMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBFeHRlbmRlZCBQZXJpcGhlcmFsIENvbnRyb2wNCi1mdW5jdGlvbnMNCi0gKiAgQGJyaWVmICBFeHRlbmRlZCBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zDQotICoNCi1AdmVyYmF0aW0NCi0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICAgICAgICAgICAgICAjIyMjIyBFeHRlbmRlZCBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICAjIyMjIw0KLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgIFsuLl0NCi0gICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBjb250cm9sIHRoZSBSQ0MNCi1DbG9ja3MgZnJlcXVlbmNpZXMuDQotICAgIFsuLl0NCi0gICAgKEApIEltcG9ydGFudCBub3RlOiBDYXJlIG11c3QgYmUgdGFrZW4gd2hlbiBIQUxfUkNDRXhfUGVyaXBoQ0xLQ29uZmlnKCkgaXMNCi11c2VkIHRvIHNlbGVjdCB0aGUgUlRDIGNsb2NrIHNvdXJjZTsgaW4gdGhpcyBjYXNlIHRoZSBCYWNrdXAgZG9tYWluIHdpbGwgYmUNCi1yZXNldCBpbiBvcmRlciB0byBtb2RpZnkgdGhlIFJUQyBDbG9jayBzb3VyY2UsIGFzIGNvbnNlcXVlbmNlIFJUQyByZWdpc3RlcnMNCi0oaW5jbHVkaW5nIHRoZSBiYWNrdXAgcmVnaXN0ZXJzKSBhcmUgc2V0IHRvIHRoZWlyIHJlc2V0IHZhbHVlcy4NCi0NCi1AZW5kdmVyYmF0aW0NCi0gICogQHsNCi0gICovDQotLyoqDQotICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBSQ0MgZXh0ZW5kZWQgcGVyaXBoZXJhbHMgY2xvY2tzIGFjY29yZGluZyB0byB0aGUNCi0gKiBzcGVjaWZpZWQgcGFyYW1ldGVycyBpbiB0aGUgUkNDX1BlcmlwaENMS0luaXRUeXBlRGVmLg0KLSAqIEBwYXJhbSAgUGVyaXBoQ2xrSW5pdCAgcG9pbnRlciB0byBhbiBSQ0NfUGVyaXBoQ0xLSW5pdFR5cGVEZWYgc3RydWN0dXJlIHRoYXQNCi0gKiAgICAgICAgIGNvbnRhaW5zIGEgZmllbGQgUGVyaXBoQ2xvY2tTZWxlY3Rpb24gd2hpY2ggY2FuIGJlIGEgY29tYmluYXRpb24gb2YNCi0gKiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX1JUQyAgUlRDIHBlcmlwaGVyYWwgY2xvY2sNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX1VTQVJUMSAgVVNBUlQxIHBlcmlwaGVyYWwgY2xvY2sNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX1VTQVJUMiAgVVNBUlQyIHBlcmlwaGVyYWwgY2xvY2sNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX1VTQVJUMyAgVVNBUlQzIHBlcmlwaGVyYWwgY2xvY2sNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX1VBUlQ0ICBVQVJUNCBwZXJpcGhlcmFsIGNsb2NrIChvbmx5IGZvcg0KLSAqIGRldmljZXMgd2l0aCBVQVJUNCkNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX1VBUlQ1ICBVQVJUNSBwZXJpcGhlcmFsIGNsb2NrIChvbmx5IGZvcg0KLSAqIGRldmljZXMgd2l0aCBVQVJUNSkNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX0xQVUFSVDEgIExQVUFSVDEgcGVyaXBoZXJhbCBjbG9jaw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfSTJDMSAgSTJDMSBwZXJpcGhlcmFsIGNsb2NrDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19JMkMyICBJMkMyIHBlcmlwaGVyYWwgY2xvY2sNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX0kyQzMgIEkyQzMgcGVyaXBoZXJhbCBjbG9jaw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfSTJDNCAgSTJDNCBwZXJpcGhlcmFsIGNsb2NrIChvbmx5IGZvcg0KLSAqIGRldmljZXMgd2l0aCBJMkM0KQ0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfTFBUSU0xICBMUFRJTTEgcGVyaXBoZXJhbCBjbG9jaw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfU0FJMSAgU0FJMSBwZXJpcGhlcmFsIGNsb2NrDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19JMlMgIEkyUyBwZXJpcGhlcmFsIGNsb2NrDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19GRENBTiAgRkRDQU4gcGVyaXBoZXJhbCBjbG9jayAob25seSBmb3INCi0gKiBkZXZpY2VzIHdpdGggRkRDQU4pDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19STkcgIFJORyBwZXJpcGhlcmFsIGNsb2NrDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19VU0IgIFVTQiBwZXJpcGhlcmFsIGNsb2NrIChvbmx5IGZvcg0KLSAqIGRldmljZXMgd2l0aCBVU0IpDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19BREMxMiAgQURDMSBhbmQgQURDMiBwZXJpcGhlcmFsIGNsb2NrDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19BREMzNDUgIEFEQzMsIEFEQzQgYW5kIEFEQzUgcGVyaXBoZXJhbA0KLSAqIGNsb2NrIChvbmx5IGZvciBkZXZpY2VzIHdpdGggQURDMywgQURDNCwgQURDNSkNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX1FTUEkgIFF1YWRTUEkgcGVyaXBoZXJhbCBjbG9jayAob25seSBmb3INCi0gKiBkZXZpY2VzIHdpdGggUXVhZFNQSSkNCi0gKg0KLSAqIEBub3RlICAgQ2FyZSBtdXN0IGJlIHRha2VuIHdoZW4gSEFMX1JDQ0V4X1BlcmlwaENMS0NvbmZpZygpIGlzIHVzZWQgdG8gc2VsZWN0DQotICogICAgICAgICB0aGUgUlRDIGNsb2NrIHNvdXJjZTogaW4gdGhpcyBjYXNlIHRoZSBhY2Nlc3MgdG8gQmFja3VwIGRvbWFpbiBpcw0KLSAqIGVuYWJsZWQuDQotICoNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfUkNDRXhfUGVyaXBoQ0xLQ29uZmlnKA0KLSAgICBSQ0NfUGVyaXBoQ0xLSW5pdFR5cGVEZWYgKlBlcmlwaENsa0luaXQpIHsNCi0gIHVpbnQzMl90IHRtcHJlZ2lzdGVyOw0KLSAgdWludDMyX3QgdGlja3N0YXJ0Ow0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgcmV0ID0gSEFMX09LOyAgICAvKiBJbnRlcm1lZGlhdGUgc3RhdHVzICovDQotICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7IC8qIEZpbmFsIHN0YXR1cyAqLw0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19SQ0NfUEVSSVBIQ0xPQ0soUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24pKTsNCi0NCi0gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUlRDIGNsb2NrIHNvdXJjZSBjb25maWd1cmF0aW9uDQotICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0gIGlmICgoUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24gJiBSQ0NfUEVSSVBIQ0xLX1JUQykgPT0NCi0gICAgICBSQ0NfUEVSSVBIQ0xLX1JUQykgew0KLSAgICBGbGFnU3RhdHVzIHB3cmNsa2NoYW5nZWQgPSBSRVNFVDsNCi0NCi0gICAgLyogQ2hlY2sgZm9yIFJUQyBQYXJhbWV0ZXJzIHVzZWQgdG8gb3V0cHV0IFJUQ0NMSyAqLw0KLSAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX1JUQ0NMS1NPVVJDRShQZXJpcGhDbGtJbml0LT5SVENDbG9ja1NlbGVjdGlvbikpOw0KLQ0KLSAgICAvKiBFbmFibGUgUG93ZXIgQ2xvY2sgKi8NCi0gICAgaWYgKF9fSEFMX1JDQ19QV1JfSVNfQ0xLX0RJU0FCTEVEKCkpIHsNCi0gICAgICBfX0hBTF9SQ0NfUFdSX0NMS19FTkFCTEUoKTsNCi0gICAgICBwd3JjbGtjaGFuZ2VkID0gU0VUOw0KLSAgICB9DQotDQotICAgIC8qIEVuYWJsZSB3cml0ZSBhY2Nlc3MgdG8gQmFja3VwIGRvbWFpbiAqLw0KLSAgICBTRVRfQklUKFBXUi0+Q1IxLCBQV1JfQ1IxX0RCUCk7DQotDQotICAgIC8qIFdhaXQgZm9yIEJhY2t1cCBkb21haW4gV3JpdGUgcHJvdGVjdGlvbiBkaXNhYmxlICovDQotICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7DQotDQotICAgIHdoaWxlICgoUFdSLT5DUjEgJiBQV1JfQ1IxX0RCUCkgPT0gMFUpIHsNCi0gICAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gUkNDX0RCUF9USU1FT1VUX1ZBTFVFKSB7DQotICAgICAgICByZXQgPSBIQUxfVElNRU9VVDsNCi0gICAgICAgIGJyZWFrOw0KLSAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBpZiAocmV0ID09IEhBTF9PSykgew0KLSAgICAgIC8qIFJlc2V0IHRoZSBCYWNrdXAgZG9tYWluIG9ubHkgaWYgdGhlIFJUQyBDbG9jayBzb3VyY2Ugc2VsZWN0aW9uIGlzDQotICAgICAgICogbW9kaWZpZWQgZnJvbSBkZWZhdWx0ICovDQotICAgICAgdG1wcmVnaXN0ZXIgPSBSRUFEX0JJVChSQ0MtPkJEQ1IsIFJDQ19CRENSX1JUQ1NFTCk7DQotDQotICAgICAgaWYgKCh0bXByZWdpc3RlciAhPSBSQ0NfUlRDQ0xLU09VUkNFX05PTkUpICYmDQotICAgICAgICAgICh0bXByZWdpc3RlciAhPSBQZXJpcGhDbGtJbml0LT5SVENDbG9ja1NlbGVjdGlvbikpIHsNCi0gICAgICAgIC8qIFN0b3JlIHRoZSBjb250ZW50IG9mIEJEQ1IgcmVnaXN0ZXIgYmVmb3JlIHRoZSByZXNldCBvZiBCYWNrdXAgRG9tYWluDQotICAgICAgICAgKi8NCi0gICAgICAgIHRtcHJlZ2lzdGVyID0gUkVBRF9CSVQoUkNDLT5CRENSLCB+KFJDQ19CRENSX1JUQ1NFTCkpOw0KLSAgICAgICAgLyogUlRDIENsb2NrIHNlbGVjdGlvbiBjYW4gYmUgY2hhbmdlZCBvbmx5IGlmIHRoZSBCYWNrdXAgRG9tYWluIGlzIHJlc2V0DQotICAgICAgICAgKi8NCi0gICAgICAgIF9fSEFMX1JDQ19CQUNLVVBSRVNFVF9GT1JDRSgpOw0KLSAgICAgICAgX19IQUxfUkNDX0JBQ0tVUFJFU0VUX1JFTEVBU0UoKTsNCi0gICAgICAgIC8qIFJlc3RvcmUgdGhlIENvbnRlbnQgb2YgQkRDUiByZWdpc3RlciAqLw0KLSAgICAgICAgUkNDLT5CRENSID0gdG1wcmVnaXN0ZXI7DQotICAgICAgfQ0KLQ0KLSAgICAgIC8qIFdhaXQgZm9yIExTRSByZWFjdGl2YXRpb24gaWYgTFNFIHdhcyBlbmFibGUgcHJpb3IgdG8gQmFja3VwIERvbWFpbg0KLSAgICAgICAqIHJlc2V0ICovDQotICAgICAgaWYgKEhBTF9JU19CSVRfU0VUKHRtcHJlZ2lzdGVyLCBSQ0NfQkRDUl9MU0VPTikpIHsNCi0gICAgICAgIC8qIEdldCBTdGFydCBUaWNrKi8NCi0gICAgICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7DQotDQotICAgICAgICAvKiBXYWl0IHRpbGwgTFNFIGlzIHJlYWR5ICovDQotICAgICAgICB3aGlsZSAoUkVBRF9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9MU0VSRFkpID09IDBVKSB7DQotICAgICAgICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBSQ0NfTFNFX1RJTUVPVVRfVkFMVUUpIHsNCi0gICAgICAgICAgICByZXQgPSBIQUxfVElNRU9VVDsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0NCi0gICAgICBpZiAocmV0ID09IEhBTF9PSykgew0KLSAgICAgICAgLyogQXBwbHkgbmV3IFJUQyBjbG9jayBzb3VyY2Ugc2VsZWN0aW9uICovDQotICAgICAgICBfX0hBTF9SQ0NfUlRDX0NPTkZJRyhQZXJpcGhDbGtJbml0LT5SVENDbG9ja1NlbGVjdGlvbik7DQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgIC8qIHNldCBvdmVyYWxsIHJldHVybiB2YWx1ZSAqLw0KLSAgICAgICAgc3RhdHVzID0gcmV0Ow0KLSAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICAvKiBzZXQgb3ZlcmFsbCByZXR1cm4gdmFsdWUgKi8NCi0gICAgICBzdGF0dXMgPSByZXQ7DQotICAgIH0NCi0NCi0gICAgLyogUmVzdG9yZSBjbG9jayBjb25maWd1cmF0aW9uIGlmIGNoYW5nZWQgKi8NCi0gICAgaWYgKHB3cmNsa2NoYW5nZWQgPT0gU0VUKSB7DQotICAgICAgX19IQUxfUkNDX1BXUl9DTEtfRElTQUJMRSgpOw0KLSAgICB9DQotICB9DQotDQotICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQVJUMSBjbG9jayBzb3VyY2UgY29uZmlndXJhdGlvbg0KLSAgICogLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotICBpZiAoKChQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbikgJiBSQ0NfUEVSSVBIQ0xLX1VTQVJUMSkgPT0NCi0gICAgICBSQ0NfUEVSSVBIQ0xLX1VTQVJUMSkgew0KLSAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX1VTQVJUMUNMS1NPVVJDRShQZXJpcGhDbGtJbml0LT5Vc2FydDFDbG9ja1NlbGVjdGlvbikpOw0KLQ0KLSAgICAvKiBDb25maWd1cmUgdGhlIFVTQVJUMSBjbG9jayBzb3VyY2UgKi8NCi0gICAgX19IQUxfUkNDX1VTQVJUMV9DT05GSUcoUGVyaXBoQ2xrSW5pdC0+VXNhcnQxQ2xvY2tTZWxlY3Rpb24pOw0KLSAgfQ0KLQ0KLSAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVU0FSVDIgY2xvY2sgc291cmNlIGNvbmZpZ3VyYXRpb24NCi0gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSAgaWYgKCgoUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24pICYgUkNDX1BFUklQSENMS19VU0FSVDIpID09DQotICAgICAgUkNDX1BFUklQSENMS19VU0FSVDIpIHsNCi0gICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19VU0FSVDJDTEtTT1VSQ0UoUGVyaXBoQ2xrSW5pdC0+VXNhcnQyQ2xvY2tTZWxlY3Rpb24pKTsNCi0NCi0gICAgLyogQ29uZmlndXJlIHRoZSBVU0FSVDIgY2xvY2sgc291cmNlICovDQotICAgIF9fSEFMX1JDQ19VU0FSVDJfQ09ORklHKFBlcmlwaENsa0luaXQtPlVzYXJ0MkNsb2NrU2VsZWN0aW9uKTsNCi0gIH0NCi0NCi0gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQzIGNsb2NrIHNvdXJjZSBjb25maWd1cmF0aW9uDQotICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0gIGlmICgoKFBlcmlwaENsa0luaXQtPlBlcmlwaENsb2NrU2VsZWN0aW9uKSAmIFJDQ19QRVJJUEhDTEtfVVNBUlQzKSA9PQ0KLSAgICAgIFJDQ19QRVJJUEhDTEtfVVNBUlQzKSB7DQotICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICAgIGFzc2VydF9wYXJhbShJU19SQ0NfVVNBUlQzQ0xLU09VUkNFKFBlcmlwaENsa0luaXQtPlVzYXJ0M0Nsb2NrU2VsZWN0aW9uKSk7DQotDQotICAgIC8qIENvbmZpZ3VyZSB0aGUgVVNBUlQzIGNsb2NrIHNvdXJjZSAqLw0KLSAgICBfX0hBTF9SQ0NfVVNBUlQzX0NPTkZJRyhQZXJpcGhDbGtJbml0LT5Vc2FydDNDbG9ja1NlbGVjdGlvbik7DQotICB9DQotDQotI2lmIGRlZmluZWQoVUFSVDQpDQotICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVBUlQ0IGNsb2NrIHNvdXJjZSBjb25maWd1cmF0aW9uDQotICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotICBpZiAoKChQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbikgJiBSQ0NfUEVSSVBIQ0xLX1VBUlQ0KSA9PQ0KLSAgICAgIFJDQ19QRVJJUEhDTEtfVUFSVDQpIHsNCi0gICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19VQVJUNENMS1NPVVJDRShQZXJpcGhDbGtJbml0LT5VYXJ0NENsb2NrU2VsZWN0aW9uKSk7DQotDQotICAgIC8qIENvbmZpZ3VyZSB0aGUgVUFSVDQgY2xvY2sgc291cmNlICovDQotICAgIF9fSEFMX1JDQ19VQVJUNF9DT05GSUcoUGVyaXBoQ2xrSW5pdC0+VWFydDRDbG9ja1NlbGVjdGlvbik7DQotICB9DQotI2VuZGlmIC8qIFVBUlQ0ICovDQotDQotI2lmIGRlZmluZWQoVUFSVDUpDQotDQotICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVBUlQ1IGNsb2NrIHNvdXJjZSBjb25maWd1cmF0aW9uDQotICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotICBpZiAoKChQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbikgJiBSQ0NfUEVSSVBIQ0xLX1VBUlQ1KSA9PQ0KLSAgICAgIFJDQ19QRVJJUEhDTEtfVUFSVDUpIHsNCi0gICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19VQVJUNUNMS1NPVVJDRShQZXJpcGhDbGtJbml0LT5VYXJ0NUNsb2NrU2VsZWN0aW9uKSk7DQotDQotICAgIC8qIENvbmZpZ3VyZSB0aGUgVUFSVDUgY2xvY2sgc291cmNlICovDQotICAgIF9fSEFMX1JDQ19VQVJUNV9DT05GSUcoUGVyaXBoQ2xrSW5pdC0+VWFydDVDbG9ja1NlbGVjdGlvbik7DQotICB9DQotDQotI2VuZGlmIC8qIFVBUlQ1ICovDQotDQotICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExQVUFSVDEgY2xvY2sgc291cmNlIGNvbmZpZ3VyYXRpb24NCi0gICAqIC0tLS0tLS0tLS0tLS0tLS0tLSovDQotICBpZiAoKChQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbikgJiBSQ0NfUEVSSVBIQ0xLX0xQVUFSVDEpID09DQotICAgICAgUkNDX1BFUklQSENMS19MUFVBUlQxKSB7DQotICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICAgIGFzc2VydF9wYXJhbShJU19SQ0NfTFBVQVJUMUNMS1NPVVJDRShQZXJpcGhDbGtJbml0LT5McHVhcnQxQ2xvY2tTZWxlY3Rpb24pKTsNCi0NCi0gICAgLyogQ29uZmlndXJlIHRoZSBMUFVBUjEgY2xvY2sgc291cmNlICovDQotICAgIF9fSEFMX1JDQ19MUFVBUlQxX0NPTkZJRyhQZXJpcGhDbGtJbml0LT5McHVhcnQxQ2xvY2tTZWxlY3Rpb24pOw0KLSAgfQ0KLQ0KLSAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJMkMxIGNsb2NrIHNvdXJjZSBjb25maWd1cmF0aW9uDQotICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSAgaWYgKCgoUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24pICYgUkNDX1BFUklQSENMS19JMkMxKSA9PQ0KLSAgICAgIFJDQ19QRVJJUEhDTEtfSTJDMSkgew0KLSAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX0kyQzFDTEtTT1VSQ0UoUGVyaXBoQ2xrSW5pdC0+STJjMUNsb2NrU2VsZWN0aW9uKSk7DQotDQotICAgIC8qIENvbmZpZ3VyZSB0aGUgSTJDMSBjbG9jayBzb3VyY2UgKi8NCi0gICAgX19IQUxfUkNDX0kyQzFfQ09ORklHKFBlcmlwaENsa0luaXQtPkkyYzFDbG9ja1NlbGVjdGlvbik7DQotICB9DQotDQotICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEkyQzIgY2xvY2sgc291cmNlIGNvbmZpZ3VyYXRpb24NCi0gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotICBpZiAoKChQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbikgJiBSQ0NfUEVSSVBIQ0xLX0kyQzIpID09DQotICAgICAgUkNDX1BFUklQSENMS19JMkMyKSB7DQotICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICAgIGFzc2VydF9wYXJhbShJU19SQ0NfSTJDMkNMS1NPVVJDRShQZXJpcGhDbGtJbml0LT5JMmMyQ2xvY2tTZWxlY3Rpb24pKTsNCi0NCi0gICAgLyogQ29uZmlndXJlIHRoZSBJMkMyIGNsb2NrIHNvdXJjZSAqLw0KLSAgICBfX0hBTF9SQ0NfSTJDMl9DT05GSUcoUGVyaXBoQ2xrSW5pdC0+STJjMkNsb2NrU2VsZWN0aW9uKTsNCi0gIH0NCi0NCi0gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSTJDMyBjbG9jayBzb3VyY2UgY29uZmlndXJhdGlvbg0KLSAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0gIGlmICgoKFBlcmlwaENsa0luaXQtPlBlcmlwaENsb2NrU2VsZWN0aW9uKSAmIFJDQ19QRVJJUEhDTEtfSTJDMykgPT0NCi0gICAgICBSQ0NfUEVSSVBIQ0xLX0kyQzMpIHsNCi0gICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19JMkMzQ0xLU09VUkNFKFBlcmlwaENsa0luaXQtPkkyYzNDbG9ja1NlbGVjdGlvbikpOw0KLQ0KLSAgICAvKiBDb25maWd1cmUgdGhlIEkyQzMgY2xvY2sgc291cmNlICovDQotICAgIF9fSEFMX1JDQ19JMkMzX0NPTkZJRyhQZXJpcGhDbGtJbml0LT5JMmMzQ2xvY2tTZWxlY3Rpb24pOw0KLSAgfQ0KLQ0KLSNpZiBkZWZpbmVkKEkyQzQpDQotDQotICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEkyQzQgY2xvY2sgc291cmNlIGNvbmZpZ3VyYXRpb24NCi0gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotICBpZiAoKChQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbikgJiBSQ0NfUEVSSVBIQ0xLX0kyQzQpID09DQotICAgICAgUkNDX1BFUklQSENMS19JMkM0KSB7DQotICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICAgIGFzc2VydF9wYXJhbShJU19SQ0NfSTJDNENMS1NPVVJDRShQZXJpcGhDbGtJbml0LT5JMmM0Q2xvY2tTZWxlY3Rpb24pKTsNCi0NCi0gICAgLyogQ29uZmlndXJlIHRoZSBJMkM0IGNsb2NrIHNvdXJjZSAqLw0KLSAgICBfX0hBTF9SQ0NfSTJDNF9DT05GSUcoUGVyaXBoQ2xrSW5pdC0+STJjNENsb2NrU2VsZWN0aW9uKTsNCi0gIH0NCi0NCi0jZW5kaWYgLyogSTJDNCAqLw0KLQ0KLSAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBMUFRJTTEgY2xvY2sgc291cmNlIGNvbmZpZ3VyYXRpb24NCi0gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotICBpZiAoKChQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbikgJiBSQ0NfUEVSSVBIQ0xLX0xQVElNMSkgPT0NCi0gICAgICBSQ0NfUEVSSVBIQ0xLX0xQVElNMSkgew0KLSAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX0xQVElNMUNMS1NPVVJDRShQZXJpcGhDbGtJbml0LT5McHRpbTFDbG9ja1NlbGVjdGlvbikpOw0KLQ0KLSAgICAvKiBDb25maWd1cmUgdGhlIExQVElNMSBjbG9jayBzb3VyY2UgKi8NCi0gICAgX19IQUxfUkNDX0xQVElNMV9DT05GSUcoUGVyaXBoQ2xrSW5pdC0+THB0aW0xQ2xvY2tTZWxlY3Rpb24pOw0KLSAgfQ0KLQ0KLSAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTQUkxIGNsb2NrIHNvdXJjZSBjb25maWd1cmF0aW9uDQotICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSAgaWYgKCgoUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24pICYgUkNDX1BFUklQSENMS19TQUkxKSA9PQ0KLSAgICAgIFJDQ19QRVJJUEhDTEtfU0FJMSkgew0KLSAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX1NBSTFDTEtTT1VSQ0UoUGVyaXBoQ2xrSW5pdC0+U2FpMUNsb2NrU2VsZWN0aW9uKSk7DQotDQotICAgIC8qIENvbmZpZ3VyZSB0aGUgU0FJMSBpbnRlcmZhY2UgY2xvY2sgc291cmNlICovDQotICAgIF9fSEFMX1JDQ19TQUkxX0NPTkZJRyhQZXJpcGhDbGtJbml0LT5TYWkxQ2xvY2tTZWxlY3Rpb24pOw0KLQ0KLSAgICBpZiAoUGVyaXBoQ2xrSW5pdC0+U2FpMUNsb2NrU2VsZWN0aW9uID09IFJDQ19TQUkxQ0xLU09VUkNFX1BMTCkgew0KLSAgICAgIC8qIEVuYWJsZSBQTEw0OE0xQ0xLIG91dHB1dCAqLw0KLSAgICAgIF9fSEFMX1JDQ19QTExDTEtPVVRfRU5BQkxFKFJDQ19QTExfNDhNMUNMSyk7DQotICAgIH0NCi0gIH0NCi0NCi0gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSTJTIGNsb2NrIHNvdXJjZSBjb25maWd1cmF0aW9uDQotICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSAgaWYgKCgoUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24pICYgUkNDX1BFUklQSENMS19JMlMpID09DQotICAgICAgUkNDX1BFUklQSENMS19JMlMpIHsNCi0gICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19JMlNDTEtTT1VSQ0UoUGVyaXBoQ2xrSW5pdC0+STJzQ2xvY2tTZWxlY3Rpb24pKTsNCi0NCi0gICAgLyogQ29uZmlndXJlIHRoZSBJMlMgaW50ZXJmYWNlIGNsb2NrIHNvdXJjZSAqLw0KLSAgICBfX0hBTF9SQ0NfSTJTX0NPTkZJRyhQZXJpcGhDbGtJbml0LT5JMnNDbG9ja1NlbGVjdGlvbik7DQotDQotICAgIGlmIChQZXJpcGhDbGtJbml0LT5JMnNDbG9ja1NlbGVjdGlvbiA9PSBSQ0NfSTJTQ0xLU09VUkNFX1BMTCkgew0KLSAgICAgIC8qIEVuYWJsZSBQTEw0OE0xQ0xLIG91dHB1dCAqLw0KLSAgICAgIF9fSEFMX1JDQ19QTExDTEtPVVRfRU5BQkxFKFJDQ19QTExfNDhNMUNMSyk7DQotICAgIH0NCi0gIH0NCi0NCi0jaWYgZGVmaW5lZChGRENBTjEpDQotICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZEQ0FOIGNsb2NrIHNvdXJjZSBjb25maWd1cmF0aW9uDQotICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSAgaWYgKCgoUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24pICYgUkNDX1BFUklQSENMS19GRENBTikgPT0NCi0gICAgICBSQ0NfUEVSSVBIQ0xLX0ZEQ0FOKSB7DQotICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICAgIGFzc2VydF9wYXJhbShJU19SQ0NfRkRDQU5DTEtTT1VSQ0UoUGVyaXBoQ2xrSW5pdC0+RmRjYW5DbG9ja1NlbGVjdGlvbikpOw0KLQ0KLSAgICAvKiBDb25maWd1cmUgdGhlIEZEQ0FOIGludGVyZmFjZSBjbG9jayBzb3VyY2UgKi8NCi0gICAgX19IQUxfUkNDX0ZEQ0FOX0NPTkZJRyhQZXJpcGhDbGtJbml0LT5GZGNhbkNsb2NrU2VsZWN0aW9uKTsNCi0NCi0gICAgaWYgKFBlcmlwaENsa0luaXQtPkZkY2FuQ2xvY2tTZWxlY3Rpb24gPT0gUkNDX0ZEQ0FOQ0xLU09VUkNFX1BMTCkgew0KLSAgICAgIC8qIEVuYWJsZSBQTEw0OE0xQ0xLIG91dHB1dCAqLw0KLSAgICAgIF9fSEFMX1JDQ19QTExDTEtPVVRfRU5BQkxFKFJDQ19QTExfNDhNMUNMSyk7DQotICAgIH0NCi0gIH0NCi0jZW5kaWYgLyogRkRDQU4xICovDQotDQotI2lmIGRlZmluZWQoVVNCKQ0KLQ0KLSAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVU0IgY2xvY2sgc291cmNlIGNvbmZpZ3VyYXRpb24NCi0gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSAgaWYgKCgoUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24pICYgUkNDX1BFUklQSENMS19VU0IpID09DQotICAgICAgKFJDQ19QRVJJUEhDTEtfVVNCKSkgew0KLSAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX1VTQkNMS1NPVVJDRShQZXJpcGhDbGtJbml0LT5Vc2JDbG9ja1NlbGVjdGlvbikpOw0KLSAgICBfX0hBTF9SQ0NfVVNCX0NPTkZJRyhQZXJpcGhDbGtJbml0LT5Vc2JDbG9ja1NlbGVjdGlvbik7DQotDQotICAgIGlmIChQZXJpcGhDbGtJbml0LT5Vc2JDbG9ja1NlbGVjdGlvbiA9PSBSQ0NfVVNCQ0xLU09VUkNFX1BMTCkgew0KLSAgICAgIC8qIEVuYWJsZSBQTEw0OE0xQ0xLIG91dHB1dCAqLw0KLSAgICAgIF9fSEFMX1JDQ19QTExDTEtPVVRfRU5BQkxFKFJDQ19QTExfNDhNMUNMSyk7DQotICAgIH0NCi0gIH0NCi0NCi0jZW5kaWYgLyogVVNCICovDQotDQotICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFJORyBjbG9jayBzb3VyY2UgY29uZmlndXJhdGlvbg0KLSAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotICBpZiAoKChQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbikgJiBSQ0NfUEVSSVBIQ0xLX1JORykgPT0NCi0gICAgICAoUkNDX1BFUklQSENMS19STkcpKSB7DQotICAgIGFzc2VydF9wYXJhbShJU19SQ0NfUk5HQ0xLU09VUkNFKFBlcmlwaENsa0luaXQtPlJuZ0Nsb2NrU2VsZWN0aW9uKSk7DQotICAgIF9fSEFMX1JDQ19STkdfQ09ORklHKFBlcmlwaENsa0luaXQtPlJuZ0Nsb2NrU2VsZWN0aW9uKTsNCi0NCi0gICAgaWYgKFBlcmlwaENsa0luaXQtPlJuZ0Nsb2NrU2VsZWN0aW9uID09IFJDQ19STkdDTEtTT1VSQ0VfUExMKSB7DQotICAgICAgLyogRW5hYmxlIFBMTDQ4TTFDTEsgb3V0cHV0ICovDQotICAgICAgX19IQUxfUkNDX1BMTENMS09VVF9FTkFCTEUoUkNDX1BMTF80OE0xQ0xLKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBREMxMiBjbG9jayBzb3VyY2UgY29uZmlndXJhdGlvbg0KLSAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotICBpZiAoKChQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbikgJiBSQ0NfUEVSSVBIQ0xLX0FEQzEyKSA9PQ0KLSAgICAgIFJDQ19QRVJJUEhDTEtfQURDMTIpIHsNCi0gICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19BREMxMkNMS1NPVVJDRShQZXJpcGhDbGtJbml0LT5BZGMxMkNsb2NrU2VsZWN0aW9uKSk7DQotDQotICAgIC8qIENvbmZpZ3VyZSB0aGUgQURDMTIgaW50ZXJmYWNlIGNsb2NrIHNvdXJjZSAqLw0KLSAgICBfX0hBTF9SQ0NfQURDMTJfQ09ORklHKFBlcmlwaENsa0luaXQtPkFkYzEyQ2xvY2tTZWxlY3Rpb24pOw0KLQ0KLSAgICBpZiAoUGVyaXBoQ2xrSW5pdC0+QWRjMTJDbG9ja1NlbGVjdGlvbiA9PSBSQ0NfQURDMTJDTEtTT1VSQ0VfUExMKSB7DQotICAgICAgLyogRW5hYmxlIFBMTEFEQ0NMSyBvdXRwdXQgKi8NCi0gICAgICBfX0hBTF9SQ0NfUExMQ0xLT1VUX0VOQUJMRShSQ0NfUExMX0FEQ0NMSyk7DQotICAgIH0NCi0gIH0NCi0NCi0jaWYgZGVmaW5lZChBREMzNDVfQ09NTU9OKQ0KLSAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBREMzNDUgY2xvY2sgc291cmNlIGNvbmZpZ3VyYXRpb24NCi0gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSAgaWYgKCgoUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24pICYgUkNDX1BFUklQSENMS19BREMzNDUpID09DQotICAgICAgUkNDX1BFUklQSENMS19BREMzNDUpIHsNCi0gICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19BREMzNDVDTEtTT1VSQ0UoUGVyaXBoQ2xrSW5pdC0+QWRjMzQ1Q2xvY2tTZWxlY3Rpb24pKTsNCi0NCi0gICAgLyogQ29uZmlndXJlIHRoZSBBREMzNDUgaW50ZXJmYWNlIGNsb2NrIHNvdXJjZSAqLw0KLSAgICBfX0hBTF9SQ0NfQURDMzQ1X0NPTkZJRyhQZXJpcGhDbGtJbml0LT5BZGMzNDVDbG9ja1NlbGVjdGlvbik7DQotDQotICAgIGlmIChQZXJpcGhDbGtJbml0LT5BZGMzNDVDbG9ja1NlbGVjdGlvbiA9PSBSQ0NfQURDMzQ1Q0xLU09VUkNFX1BMTCkgew0KLSAgICAgIC8qIEVuYWJsZSBQTExBRENDTEsgb3V0cHV0ICovDQotICAgICAgX19IQUxfUkNDX1BMTENMS09VVF9FTkFCTEUoUkNDX1BMTF9BRENDTEspOw0KLSAgICB9DQotICB9DQotI2VuZGlmIC8qIEFEQzM0NV9DT01NT04gKi8NCi0NCi0jaWYgZGVmaW5lZChRVUFEU1BJKQ0KLQ0KLSAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBRdWFkU1BJeCBjbG9jayBzb3VyY2UgY29uZmlndXJhdGlvbg0KLSAgICogLS0tLS0tLS0tLS0tLS0tLSovDQotICBpZiAoKChQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbikgJiBSQ0NfUEVSSVBIQ0xLX1FTUEkpID09DQotICAgICAgUkNDX1BFUklQSENMS19RU1BJKSB7DQotICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICAgIGFzc2VydF9wYXJhbShJU19SQ0NfUVNQSUNMS1NPVVJDRShQZXJpcGhDbGtJbml0LT5Rc3BpQ2xvY2tTZWxlY3Rpb24pKTsNCi0NCi0gICAgLyogQ29uZmlndXJlIHRoZSBRdWFkU1BJIGNsb2NrIHNvdXJjZSAqLw0KLSAgICBfX0hBTF9SQ0NfUVNQSV9DT05GSUcoUGVyaXBoQ2xrSW5pdC0+UXNwaUNsb2NrU2VsZWN0aW9uKTsNCi0NCi0gICAgaWYgKFBlcmlwaENsa0luaXQtPlFzcGlDbG9ja1NlbGVjdGlvbiA9PSBSQ0NfUVNQSUNMS1NPVVJDRV9QTEwpIHsNCi0gICAgICAvKiBFbmFibGUgUExMNDhNMUNMSyBvdXRwdXQgKi8NCi0gICAgICBfX0hBTF9SQ0NfUExMQ0xLT1VUX0VOQUJMRShSQ0NfUExMXzQ4TTFDTEspOw0KLSAgICB9DQotICB9DQotDQotI2VuZGlmIC8qIFFVQURTUEkgKi8NCi0NCi0gIHJldHVybiBzdGF0dXM7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2V0IHRoZSBSQ0NfQ2xrSW5pdFN0cnVjdCBhY2NvcmRpbmcgdG8gdGhlIGludGVybmFsIFJDQyBjb25maWd1cmF0aW9uDQotICogcmVnaXN0ZXJzLg0KLSAqIEBwYXJhbSAgUGVyaXBoQ2xrSW5pdCAgcG9pbnRlciB0byBhbiBSQ0NfUGVyaXBoQ0xLSW5pdFR5cGVEZWYgc3RydWN0dXJlIHRoYXQNCi0gKiAgICAgICAgIHJldHVybnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBFeHRlbmRlZCBQZXJpcGhlcmFscw0KLSAqICAgICAgICAgY2xvY2tzKFVTQVJUMSwgVVNBUlQyLCBVU0FSVDMsIFVBUlQ0LCBVQVJUNSwgTFBVQVJUMSwgSTJDMSwgSTJDMiwNCi0gKiBJMkMzLCBJMkM0LCBMUFRJTTEsIFNBSTEsIEkyU3gsIEZEQ0FOeCwgVVNCLCBSTkcsIEFEQ3gsIFJUQywgUVNQSSkuDQotICogQHJldHZhbCBOb25lDQotICovDQotdm9pZCBIQUxfUkNDRXhfR2V0UGVyaXBoQ0xLQ29uZmlnKFJDQ19QZXJpcGhDTEtJbml0VHlwZURlZiAqUGVyaXBoQ2xrSW5pdCkgew0KLSAgLyogU2V0IGFsbCBwb3NzaWJsZSB2YWx1ZXMgZm9yIHRoZSBleHRlbmRlZCBjbG9jayB0eXBlIHBhcmFtZXRlci0tLS0tLS0tLS0tLSovDQotDQotI2lmIGRlZmluZWQoU1RNMzJHNDc0eHgpIHx8IGRlZmluZWQoU1RNMzJHNDg0eHgpDQotDQotICBQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbiA9DQotICAgICAgUkNDX1BFUklQSENMS19VU0FSVDEgfCBSQ0NfUEVSSVBIQ0xLX1VTQVJUMiB8IFJDQ19QRVJJUEhDTEtfVVNBUlQzIHwNCi0gICAgICBSQ0NfUEVSSVBIQ0xLX1VBUlQ0IHwgUkNDX1BFUklQSENMS19VQVJUNSB8IFJDQ19QRVJJUEhDTEtfTFBVQVJUMSB8DQotICAgICAgUkNDX1BFUklQSENMS19JMkMxIHwgUkNDX1BFUklQSENMS19JMkMyIHwgUkNDX1BFUklQSENMS19JMkMzIHwNCi0gICAgICBSQ0NfUEVSSVBIQ0xLX0kyQzQgfCBSQ0NfUEVSSVBIQ0xLX0xQVElNMSB8IFJDQ19QRVJJUEhDTEtfU0FJMSB8DQotICAgICAgUkNDX1BFUklQSENMS19JMlMgfCBSQ0NfUEVSSVBIQ0xLX0ZEQ0FOIHwgUkNDX1BFUklQSENMS19STkcgfA0KLSAgICAgIFJDQ19QRVJJUEhDTEtfVVNCIHwgUkNDX1BFUklQSENMS19BREMxMiB8IFJDQ19QRVJJUEhDTEtfQURDMzQ1IHwNCi0gICAgICBSQ0NfUEVSSVBIQ0xLX1FTUEkgfCBSQ0NfUEVSSVBIQ0xLX1JUQzsNCi0jZWxpZiBkZWZpbmVkKFNUTTMyRzQ5MXh4KSB8fCBkZWZpbmVkKFNUTTMyRzRBMXh4KQ0KLQ0KLSAgUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24gPQ0KLSAgICAgIFJDQ19QRVJJUEhDTEtfVVNBUlQxIHwgUkNDX1BFUklQSENMS19VU0FSVDIgfCBSQ0NfUEVSSVBIQ0xLX1VTQVJUMyB8DQotICAgICAgUkNDX1BFUklQSENMS19VQVJUNCB8IFJDQ19QRVJJUEhDTEtfVUFSVDUgfCBSQ0NfUEVSSVBIQ0xLX0xQVUFSVDEgfA0KLSAgICAgIFJDQ19QRVJJUEhDTEtfSTJDMSB8IFJDQ19QRVJJUEhDTEtfSTJDMiB8IFJDQ19QRVJJUEhDTEtfSTJDMyB8DQotICAgICAgUkNDX1BFUklQSENMS19MUFRJTTEgfCBSQ0NfUEVSSVBIQ0xLX1NBSTEgfCBSQ0NfUEVSSVBIQ0xLX0kyUyB8DQotICAgICAgUkNDX1BFUklQSENMS19GRENBTiB8IFJDQ19QRVJJUEhDTEtfUk5HIHwgUkNDX1BFUklQSENMS19VU0IgfA0KLSAgICAgIFJDQ19QRVJJUEhDTEtfQURDMTIgfCBSQ0NfUEVSSVBIQ0xLX0FEQzM0NSB8IFJDQ19QRVJJUEhDTEtfUVNQSSB8DQotICAgICAgUkNDX1BFUklQSENMS19SVEM7DQotDQotI2VsaWYgZGVmaW5lZChTVE0zMkc0NzN4eCkgfHwgZGVmaW5lZChTVE0zMkc0ODN4eCkNCi0NCi0gIFBlcmlwaENsa0luaXQtPlBlcmlwaENsb2NrU2VsZWN0aW9uID0NCi0gICAgICBSQ0NfUEVSSVBIQ0xLX1VTQVJUMSB8IFJDQ19QRVJJUEhDTEtfVVNBUlQyIHwgUkNDX1BFUklQSENMS19VU0FSVDMgfA0KLSAgICAgIFJDQ19QRVJJUEhDTEtfVUFSVDQgfCBSQ0NfUEVSSVBIQ0xLX1VBUlQ1IHwgUkNDX1BFUklQSENMS19MUFVBUlQxIHwNCi0gICAgICBSQ0NfUEVSSVBIQ0xLX0kyQzEgfCBSQ0NfUEVSSVBIQ0xLX0kyQzIgfCBSQ0NfUEVSSVBIQ0xLX0kyQzMgfA0KLSAgICAgIFJDQ19QRVJJUEhDTEtfSTJDNCB8IFJDQ19QRVJJUEhDTEtfTFBUSU0xIHwgUkNDX1BFUklQSENMS19TQUkxIHwNCi0gICAgICBSQ0NfUEVSSVBIQ0xLX0kyUyB8IFJDQ19QRVJJUEhDTEtfUk5HIHwgUkNDX1BFUklQSENMS19VU0IgfA0KLSAgICAgIFJDQ19QRVJJUEhDTEtfQURDMTIgfCBSQ0NfUEVSSVBIQ0xLX0FEQzM0NSB8IFJDQ19QRVJJUEhDTEtfUVNQSSB8DQotICAgICAgUkNDX1BFUklQSENMS19SVEM7DQotDQotI2VsaWYgZGVmaW5lZChTVE0zMkc0NzF4eCkNCi0NCi0gIFBlcmlwaENsa0luaXQtPlBlcmlwaENsb2NrU2VsZWN0aW9uID0NCi0gICAgICBSQ0NfUEVSSVBIQ0xLX1VTQVJUMSB8IFJDQ19QRVJJUEhDTEtfVVNBUlQyIHwgUkNDX1BFUklQSENMS19VU0FSVDMgfA0KLSAgICAgIFJDQ19QRVJJUEhDTEtfVUFSVDQgfCBSQ0NfUEVSSVBIQ0xLX1VBUlQ1IHwgUkNDX1BFUklQSENMS19MUFVBUlQxIHwNCi0gICAgICBSQ0NfUEVSSVBIQ0xLX0kyQzEgfCBSQ0NfUEVSSVBIQ0xLX0kyQzIgfCBSQ0NfUEVSSVBIQ0xLX0kyQzMgfA0KLSAgICAgIFJDQ19QRVJJUEhDTEtfSTJDNCB8IFJDQ19QRVJJUEhDTEtfTFBUSU0xIHwgUkNDX1BFUklQSENMS19TQUkxIHwNCi0gICAgICBSQ0NfUEVSSVBIQ0xLX0kyUyB8IFJDQ19QRVJJUEhDTEtfUk5HIHwgUkNDX1BFUklQSENMS19VU0IgfA0KLSAgICAgIFJDQ19QRVJJUEhDTEtfQURDMTIgfCBSQ0NfUEVSSVBIQ0xLX1JUQzsNCi0jZWxpZiBkZWZpbmVkKFNUTTMyRzQzMXh4KSB8fCBkZWZpbmVkKFNUTTMyRzQ0MXh4KQ0KLQ0KLSAgUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24gPQ0KLSAgICAgIFJDQ19QRVJJUEhDTEtfVVNBUlQxIHwgUkNDX1BFUklQSENMS19VU0FSVDIgfCBSQ0NfUEVSSVBIQ0xLX1VTQVJUMyB8DQotICAgICAgUkNDX1BFUklQSENMS19VQVJUNCB8IFJDQ19QRVJJUEhDTEtfTFBVQVJUMSB8IFJDQ19QRVJJUEhDTEtfSTJDMSB8DQotICAgICAgUkNDX1BFUklQSENMS19JMkMyIHwgUkNDX1BFUklQSENMS19JMkMzIHwgUkNDX1BFUklQSENMS19MUFRJTTEgfA0KLSAgICAgIFJDQ19QRVJJUEhDTEtfU0FJMSB8IFJDQ19QRVJJUEhDTEtfSTJTIHwgUkNDX1BFUklQSENMS19GRENBTiB8DQotICAgICAgUkNDX1BFUklQSENMS19STkcgfCBSQ0NfUEVSSVBIQ0xLX1VTQiB8IFJDQ19QRVJJUEhDTEtfQURDMTIgfA0KLSAgICAgIFJDQ19QRVJJUEhDTEtfUlRDOw0KLSNlbGlmIGRlZmluZWQoU1RNMzJHQksxQ0IpDQotDQotICBQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbiA9DQotICAgICAgUkNDX1BFUklQSENMS19VU0FSVDEgfCBSQ0NfUEVSSVBIQ0xLX1VTQVJUMiB8IFJDQ19QRVJJUEhDTEtfVVNBUlQzIHwNCi0gICAgICBSQ0NfUEVSSVBIQ0xLX0xQVUFSVDEgfCBSQ0NfUEVSSVBIQ0xLX0kyQzEgfCBSQ0NfUEVSSVBIQ0xLX0kyQzIgfA0KLSAgICAgIFJDQ19QRVJJUEhDTEtfSTJDMyB8IFJDQ19QRVJJUEhDTEtfTFBUSU0xIHwgUkNDX1BFUklQSENMS19TQUkxIHwNCi0gICAgICBSQ0NfUEVSSVBIQ0xLX0kyUyB8IFJDQ19QRVJJUEhDTEtfRkRDQU4gfCBSQ0NfUEVSSVBIQ0xLX1JORyB8DQotICAgICAgUkNDX1BFUklQSENMS19VU0IgfCBSQ0NfUEVSSVBIQ0xLX0FEQzEyIHwgUkNDX1BFUklQSENMS19SVEM7DQotDQotI2VuZGlmIC8qIFNUTTMyRzQzMXh4ICovDQotDQotICAvKiBHZXQgdGhlIFVTQVJUMSBjbG9jayBzb3VyY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0gIFBlcmlwaENsa0luaXQtPlVzYXJ0MUNsb2NrU2VsZWN0aW9uID0gX19IQUxfUkNDX0dFVF9VU0FSVDFfU09VUkNFKCk7DQotICAvKiBHZXQgdGhlIFVTQVJUMiBjbG9jayBzb3VyY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0gIFBlcmlwaENsa0luaXQtPlVzYXJ0MkNsb2NrU2VsZWN0aW9uID0gX19IQUxfUkNDX0dFVF9VU0FSVDJfU09VUkNFKCk7DQotICAvKiBHZXQgdGhlIFVTQVJUMyBjbG9jayBzb3VyY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0gIFBlcmlwaENsa0luaXQtPlVzYXJ0M0Nsb2NrU2VsZWN0aW9uID0gX19IQUxfUkNDX0dFVF9VU0FSVDNfU09VUkNFKCk7DQotDQotI2lmIGRlZmluZWQoVUFSVDQpDQotICAvKiBHZXQgdGhlIFVBUlQ0IGNsb2NrIHNvdXJjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0gIFBlcmlwaENsa0luaXQtPlVhcnQ0Q2xvY2tTZWxlY3Rpb24gPSBfX0hBTF9SQ0NfR0VUX1VBUlQ0X1NPVVJDRSgpOw0KLSNlbmRpZiAvKiBVQVJUNCAqLw0KLQ0KLSNpZiBkZWZpbmVkKFVBUlQ1KQ0KLSAgLyogR2V0IHRoZSBVQVJUNSBjbG9jayBzb3VyY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotICBQZXJpcGhDbGtJbml0LT5VYXJ0NUNsb2NrU2VsZWN0aW9uID0gX19IQUxfUkNDX0dFVF9VQVJUNV9TT1VSQ0UoKTsNCi0jZW5kaWYgLyogVUFSVDUgKi8NCi0NCi0gIC8qIEdldCB0aGUgTFBVQVJUMSBjbG9jayBzb3VyY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSAgUGVyaXBoQ2xrSW5pdC0+THB1YXJ0MUNsb2NrU2VsZWN0aW9uID0gX19IQUxfUkNDX0dFVF9MUFVBUlQxX1NPVVJDRSgpOw0KLQ0KLSAgLyogR2V0IHRoZSBJMkMxIGNsb2NrIHNvdXJjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotICBQZXJpcGhDbGtJbml0LT5JMmMxQ2xvY2tTZWxlY3Rpb24gPSBfX0hBTF9SQ0NfR0VUX0kyQzFfU09VUkNFKCk7DQotDQotICAvKiBHZXQgdGhlIEkyQzIgY2xvY2sgc291cmNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSAgUGVyaXBoQ2xrSW5pdC0+STJjMkNsb2NrU2VsZWN0aW9uID0gX19IQUxfUkNDX0dFVF9JMkMyX1NPVVJDRSgpOw0KLQ0KLSAgLyogR2V0IHRoZSBJMkMzIGNsb2NrIHNvdXJjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotICBQZXJpcGhDbGtJbml0LT5JMmMzQ2xvY2tTZWxlY3Rpb24gPSBfX0hBTF9SQ0NfR0VUX0kyQzNfU09VUkNFKCk7DQotDQotI2lmIGRlZmluZWQoSTJDNCkNCi0gIC8qIEdldCB0aGUgSTJDNCBjbG9jayBzb3VyY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSAgUGVyaXBoQ2xrSW5pdC0+STJjNENsb2NrU2VsZWN0aW9uID0gX19IQUxfUkNDX0dFVF9JMkM0X1NPVVJDRSgpOw0KLSNlbmRpZiAvKiBJMkM0ICovDQotDQotICAvKiBHZXQgdGhlIExQVElNMSBjbG9jayBzb3VyY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0gIFBlcmlwaENsa0luaXQtPkxwdGltMUNsb2NrU2VsZWN0aW9uID0gX19IQUxfUkNDX0dFVF9MUFRJTTFfU09VUkNFKCk7DQotDQotICAvKiBHZXQgdGhlIFNBSTEgY2xvY2sgc291cmNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0gIFBlcmlwaENsa0luaXQtPlNhaTFDbG9ja1NlbGVjdGlvbiA9IF9fSEFMX1JDQ19HRVRfU0FJMV9TT1VSQ0UoKTsNCi0NCi0gIC8qIEdldCB0aGUgSTJTIGNsb2NrIHNvdXJjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotICBQZXJpcGhDbGtJbml0LT5JMnNDbG9ja1NlbGVjdGlvbiA9IF9fSEFMX1JDQ19HRVRfSTJTX1NPVVJDRSgpOw0KLQ0KLSNpZiBkZWZpbmVkKEZEQ0FOMSkNCi0gIC8qIEdldCB0aGUgRkRDQU4gY2xvY2sgc291cmNlDQotICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotICBQZXJpcGhDbGtJbml0LT5GZGNhbkNsb2NrU2VsZWN0aW9uID0gX19IQUxfUkNDX0dFVF9GRENBTl9TT1VSQ0UoKTsNCi0jZW5kaWYgLyogRkRDQU4xICovDQotDQotI2lmIGRlZmluZWQoVVNCKQ0KLSAgLyogR2V0IHRoZSBVU0IgY2xvY2sgc291cmNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotICBQZXJpcGhDbGtJbml0LT5Vc2JDbG9ja1NlbGVjdGlvbiA9IF9fSEFMX1JDQ19HRVRfVVNCX1NPVVJDRSgpOw0KLSNlbmRpZiAvKiBVU0IgKi8NCi0NCi0gIC8qIEdldCB0aGUgUk5HIGNsb2NrIHNvdXJjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSAgUGVyaXBoQ2xrSW5pdC0+Um5nQ2xvY2tTZWxlY3Rpb24gPSBfX0hBTF9SQ0NfR0VUX1JOR19TT1VSQ0UoKTsNCi0NCi0gIC8qIEdldCB0aGUgQURDMTIgY2xvY2sgc291cmNlDQotICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotICBQZXJpcGhDbGtJbml0LT5BZGMxMkNsb2NrU2VsZWN0aW9uID0gX19IQUxfUkNDX0dFVF9BREMxMl9TT1VSQ0UoKTsNCi0NCi0jaWYgZGVmaW5lZChBREMzNDVfQ09NTU9OKQ0KLSAgLyogR2V0IHRoZSBBREMzNDUgY2xvY2sgc291cmNlDQotICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0gIFBlcmlwaENsa0luaXQtPkFkYzM0NUNsb2NrU2VsZWN0aW9uID0gX19IQUxfUkNDX0dFVF9BREMzNDVfU09VUkNFKCk7DQotI2VuZGlmIC8qIEFEQzM0NV9DT01NT04gKi8NCi0NCi0jaWYgZGVmaW5lZChRVUFEU1BJKQ0KLSAgLyogR2V0IHRoZSBRdWFkU1BJY2xvY2sgc291cmNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0gIFBlcmlwaENsa0luaXQtPlFzcGlDbG9ja1NlbGVjdGlvbiA9IF9fSEFMX1JDQ19HRVRfUVNQSV9TT1VSQ0UoKTsNCi0jZW5kaWYgLyogUVVBRFNQSSAqLw0KLQ0KLSAgLyogR2V0IHRoZSBSVEMgY2xvY2sgc291cmNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotICBQZXJpcGhDbGtJbml0LT5SVENDbG9ja1NlbGVjdGlvbiA9IF9fSEFMX1JDQ19HRVRfUlRDX1NPVVJDRSgpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJldHVybiB0aGUgcGVyaXBoZXJhbCBjbG9jayBmcmVxdWVuY3kgZm9yIHBlcmlwaGVyYWxzIHdpdGggY2xvY2sNCi0gKiBzb3VyY2UgZnJvbSBQTEwNCi0gKiBAbm90ZSAgIFJldHVybiAwIGlmIHBlcmlwaGVyYWwgY2xvY2sgaWRlbnRpZmllciBub3QgbWFuYWdlZCBieSB0aGlzIEFQSQ0KLSAqIEBwYXJhbSAgUGVyaXBoQ2xrICBQZXJpcGhlcmFsIGNsb2NrIGlkZW50aWZpZXINCi0gKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19VU0FSVDEgIFVTQVJUMSBwZXJpcGhlcmFsIGNsb2NrDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19VU0FSVDIgIFVTQVJUMiBwZXJpcGhlcmFsIGNsb2NrDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19VU0FSVDMgIFVTQVJUMyBwZXJpcGhlcmFsIGNsb2NrDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19VQVJUNCAgVUFSVDQgcGVyaXBoZXJhbCBjbG9jayAob25seSBmb3INCi0gKiBkZXZpY2VzIHdpdGggVUFSVDQpDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19VQVJUNSAgVUFSVDUgcGVyaXBoZXJhbCBjbG9jayAob25seSBmb3INCi0gKiBkZXZpY2VzIHdpdGggVUFSVDUpDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19MUFVBUlQxICBMUFVBUlQxIHBlcmlwaGVyYWwgY2xvY2sNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX0kyQzEgIEkyQzEgcGVyaXBoZXJhbCBjbG9jaw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfSTJDMiAgSTJDMiBwZXJpcGhlcmFsIGNsb2NrDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19JMkMzICBJMkMzIHBlcmlwaGVyYWwgY2xvY2sNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX0kyQzQgIEkyQzQgcGVyaXBoZXJhbCBjbG9jayAob25seSBmb3INCi0gKiBkZXZpY2VzIHdpdGggSTJDNCkNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX0xQVElNMSAgTFBUSU0xIHBlcmlwaGVyYWwgY2xvY2sNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX1NBSTEgIFNBSTEgcGVyaXBoZXJhbCBjbG9jaw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfSTJTICBTUEkgcGVyaXBoZXJhbCBjbG9jaw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfRkRDQU4gIEZEQ0FOIHBlcmlwaGVyYWwgY2xvY2sgKG9ubHkgZm9yDQotICogZGV2aWNlcyB3aXRoIEZEQ0FOKQ0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfUk5HICBSTkcgcGVyaXBoZXJhbCBjbG9jaw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfVVNCICBVU0IgcGVyaXBoZXJhbCBjbG9jayAob25seSBmb3INCi0gKiBkZXZpY2VzIHdpdGggVVNCKQ0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfQURDMTIgIEFEQzEgYW5kIEFEQzIgcGVyaXBoZXJhbCBjbG9jaw0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfQURDMzQ1ICBBREMzLCBBREM0IGFuZCBBREM1IHBlcmlwaGVyYWwNCi0gKiBjbG9jayAob25seSBmb3IgZGV2aWNlcyB3aXRoIEFEQzMsIEFEQzQsIEFEQzUpDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19RU1BJICBRU1BJIHBlcmlwaGVyYWwgY2xvY2sgKG9ubHkgZm9yDQotICogZGV2aWNlcyB3aXRoIFFTUEkpDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19SVEMgIFJUQyBwZXJpcGhlcmFsIGNsb2NrDQotICogQHJldHZhbCBGcmVxdWVuY3kgaW4gSHoNCi0gKi8NCi11aW50MzJfdCBIQUxfUkNDRXhfR2V0UGVyaXBoQ0xLRnJlcSh1aW50MzJfdCBQZXJpcGhDbGspIHsNCi0gIHVpbnQzMl90IGZyZXF1ZW5jeSA9IDBVOw0KLSAgdWludDMyX3Qgc3JjY2xrOw0KLSAgdWludDMyX3QgcGxsdmNvLCBwbGxuLCBwbGxwOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19SQ0NfUEVSSVBIQ0xPQ0soUGVyaXBoQ2xrKSk7DQotDQotICBpZiAoUGVyaXBoQ2xrID09IFJDQ19QRVJJUEhDTEtfUlRDKSB7DQotICAgIC8qIEdldCB0aGUgY3VycmVudCBSVEMgc291cmNlICovDQotICAgIHNyY2NsayA9IF9fSEFMX1JDQ19HRVRfUlRDX1NPVVJDRSgpOw0KLQ0KLSAgICAvKiBDaGVjayBpZiBMU0UgaXMgcmVhZHkgYW5kIGlmIFJUQyBjbG9jayBzZWxlY3Rpb24gaXMgTFNFICovDQotICAgIGlmICgoSEFMX0lTX0JJVF9TRVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9MU0VSRFkpKSAmJg0KLSAgICAgICAgKHNyY2NsayA9PSBSQ0NfUlRDQ0xLU09VUkNFX0xTRSkpIHsNCi0gICAgICBmcmVxdWVuY3kgPSBMU0VfVkFMVUU7DQotICAgIH0NCi0gICAgLyogQ2hlY2sgaWYgTFNJIGlzIHJlYWR5IGFuZCBpZiBSVEMgY2xvY2sgc2VsZWN0aW9uIGlzIExTSSAqLw0KLSAgICBlbHNlIGlmICgoSEFMX0lTX0JJVF9TRVQoUkNDLT5DU1IsIFJDQ19DU1JfTFNJUkRZKSkgJiYNCi0gICAgICAgICAgICAgKHNyY2NsayA9PSBSQ0NfUlRDQ0xLU09VUkNFX0xTSSkpIHsNCi0gICAgICBmcmVxdWVuY3kgPSBMU0lfVkFMVUU7DQotICAgIH0NCi0gICAgLyogQ2hlY2sgaWYgSFNFIGlzIHJlYWR5ICBhbmQgaWYgUlRDIGNsb2NrIHNlbGVjdGlvbiBpcyBIU0lfRElWMzIqLw0KLSAgICBlbHNlIGlmICgoSEFMX0lTX0JJVF9TRVQoUkNDLT5DUiwgUkNDX0NSX0hTRVJEWSkpICYmDQotICAgICAgICAgICAgIChzcmNjbGsgPT0gUkNDX1JUQ0NMS1NPVVJDRV9IU0VfRElWMzIpKSB7DQotICAgICAgZnJlcXVlbmN5ID0gSFNFX1ZBTFVFIC8gMzJVOw0KLSAgICB9DQotICAgIC8qIENsb2NrIG5vdCBlbmFibGVkIGZvciBSVEMqLw0KLSAgICBlbHNlIHsNCi0gICAgICAvKiBub3RoaW5nIHRvIGRvOiBmcmVxdWVuY3kgYWxyZWFkeSBpbml0aWFsaXplZCB0byAwICovDQotICAgIH0NCi0gIH0gZWxzZSB7DQotICAgIC8qIE90aGVyIGV4dGVybmFsIHBlcmlwaGVyYWwgY2xvY2sgc291cmNlIHRoYW4gUlRDICovDQotDQotICAgIC8qIENvbXB1dGUgUExMIGNsb2NrIGlucHV0ICovDQotICAgIGlmIChfX0hBTF9SQ0NfR0VUX1BMTF9PU0NTT1VSQ0UoKSA9PSBSQ0NfUExMU09VUkNFX0hTSSkgLyogSFNJID8gKi8NCi0gICAgew0KLSAgICAgIGlmIChIQUxfSVNfQklUX1NFVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJUkRZKSkgew0KLSAgICAgICAgcGxsdmNvID0gSFNJX1ZBTFVFOw0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICBwbGx2Y28gPSAwVTsNCi0gICAgICB9DQotICAgIH0gZWxzZSBpZiAoX19IQUxfUkNDX0dFVF9QTExfT1NDU09VUkNFKCkgPT0gUkNDX1BMTFNPVVJDRV9IU0UpIC8qIEhTRSA/ICovDQotICAgIHsNCi0gICAgICBpZiAoSEFMX0lTX0JJVF9TRVQoUkNDLT5DUiwgUkNDX0NSX0hTRVJEWSkpIHsNCi0gICAgICAgIHBsbHZjbyA9IEhTRV9WQUxVRTsNCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgcGxsdmNvID0gMFU7DQotICAgICAgfQ0KLSAgICB9IGVsc2UgLyogTm8gc291cmNlICovDQotICAgIHsNCi0gICAgICBwbGx2Y28gPSAwVTsNCi0gICAgfQ0KLQ0KLSAgICAvKiBmKFBMTCBTb3VyY2UpIC8gUExMTSAqLw0KLSAgICBwbGx2Y28gPSAocGxsdmNvIC8gKChSRUFEX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTE0pID4+DQotICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19QTExDRkdSX1BMTE1fUG9zKSArDQotICAgICAgICAgICAgICAgICAgICAgICAgMVUpKTsNCi0NCi0gICAgc3dpdGNoIChQZXJpcGhDbGspIHsNCi0gICAgICBjYXNlIFJDQ19QRVJJUEhDTEtfVVNBUlQxOg0KLSAgICAgICAgLyogR2V0IHRoZSBjdXJyZW50IFVTQVJUMSBzb3VyY2UgKi8NCi0gICAgICAgIHNyY2NsayA9IF9fSEFMX1JDQ19HRVRfVVNBUlQxX1NPVVJDRSgpOw0KLQ0KLSAgICAgICAgaWYgKHNyY2NsayA9PSBSQ0NfVVNBUlQxQ0xLU09VUkNFX1BDTEsyKSB7DQotICAgICAgICAgIGZyZXF1ZW5jeSA9IEhBTF9SQ0NfR2V0UENMSzJGcmVxKCk7DQotICAgICAgICB9IGVsc2UgaWYgKHNyY2NsayA9PSBSQ0NfVVNBUlQxQ0xLU09VUkNFX1NZU0NMSykgew0KLSAgICAgICAgICBmcmVxdWVuY3kgPSBIQUxfUkNDX0dldFN5c0Nsb2NrRnJlcSgpOw0KLSAgICAgICAgfSBlbHNlIGlmICgoSEFMX0lTX0JJVF9TRVQoUkNDLT5DUiwgUkNDX0NSX0hTSVJEWSkpICYmDQotICAgICAgICAgICAgICAgICAgIChzcmNjbGsgPT0gUkNDX1VTQVJUMUNMS1NPVVJDRV9IU0kpKSB7DQotICAgICAgICAgIGZyZXF1ZW5jeSA9IEhTSV9WQUxVRTsNCi0gICAgICAgIH0gZWxzZSBpZiAoKEhBTF9JU19CSVRfU0VUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfTFNFUkRZKSkgJiYNCi0gICAgICAgICAgICAgICAgICAgKHNyY2NsayA9PSBSQ0NfVVNBUlQxQ0xLU09VUkNFX0xTRSkpIHsNCi0gICAgICAgICAgZnJlcXVlbmN5ID0gTFNFX1ZBTFVFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgLyogQ2xvY2sgbm90IGVuYWJsZWQgZm9yIFVTQVJUMSAqLw0KLSAgICAgICAgZWxzZSB7DQotICAgICAgICAgIC8qIG5vdGhpbmcgdG8gZG86IGZyZXF1ZW5jeSBhbHJlYWR5IGluaXRpYWxpemVkIHRvIDAgKi8NCi0gICAgICAgIH0NCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgUkNDX1BFUklQSENMS19VU0FSVDI6DQotICAgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgVVNBUlQyIHNvdXJjZSAqLw0KLSAgICAgICAgc3JjY2xrID0gX19IQUxfUkNDX0dFVF9VU0FSVDJfU09VUkNFKCk7DQotDQotICAgICAgICBpZiAoc3JjY2xrID09IFJDQ19VU0FSVDJDTEtTT1VSQ0VfUENMSzEpIHsNCi0gICAgICAgICAgZnJlcXVlbmN5ID0gSEFMX1JDQ19HZXRQQ0xLMUZyZXEoKTsNCi0gICAgICAgIH0gZWxzZSBpZiAoc3JjY2xrID09IFJDQ19VU0FSVDJDTEtTT1VSQ0VfU1lTQ0xLKSB7DQotICAgICAgICAgIGZyZXF1ZW5jeSA9IEhBTF9SQ0NfR2V0U3lzQ2xvY2tGcmVxKCk7DQotICAgICAgICB9IGVsc2UgaWYgKChIQUxfSVNfQklUX1NFVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJUkRZKSkgJiYNCi0gICAgICAgICAgICAgICAgICAgKHNyY2NsayA9PSBSQ0NfVVNBUlQyQ0xLU09VUkNFX0hTSSkpIHsNCi0gICAgICAgICAgZnJlcXVlbmN5ID0gSFNJX1ZBTFVFOw0KLSAgICAgICAgfSBlbHNlIGlmICgoSEFMX0lTX0JJVF9TRVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9MU0VSRFkpKSAmJg0KLSAgICAgICAgICAgICAgICAgICAoc3JjY2xrID09IFJDQ19VU0FSVDJDTEtTT1VSQ0VfTFNFKSkgew0KLSAgICAgICAgICBmcmVxdWVuY3kgPSBMU0VfVkFMVUU7DQotICAgICAgICB9DQotICAgICAgICAvKiBDbG9jayBub3QgZW5hYmxlZCBmb3IgVVNBUlQyICovDQotICAgICAgICBlbHNlIHsNCi0gICAgICAgICAgLyogbm90aGluZyB0byBkbzogZnJlcXVlbmN5IGFscmVhZHkgaW5pdGlhbGl6ZWQgdG8gMCAqLw0KLSAgICAgICAgfQ0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBSQ0NfUEVSSVBIQ0xLX1VTQVJUMzoNCi0gICAgICAgIC8qIEdldCB0aGUgY3VycmVudCBVU0FSVDMgc291cmNlICovDQotICAgICAgICBzcmNjbGsgPSBfX0hBTF9SQ0NfR0VUX1VTQVJUM19TT1VSQ0UoKTsNCi0NCi0gICAgICAgIGlmIChzcmNjbGsgPT0gUkNDX1VTQVJUM0NMS1NPVVJDRV9QQ0xLMSkgew0KLSAgICAgICAgICBmcmVxdWVuY3kgPSBIQUxfUkNDX0dldFBDTEsxRnJlcSgpOw0KLSAgICAgICAgfSBlbHNlIGlmIChzcmNjbGsgPT0gUkNDX1VTQVJUM0NMS1NPVVJDRV9TWVNDTEspIHsNCi0gICAgICAgICAgZnJlcXVlbmN5ID0gSEFMX1JDQ19HZXRTeXNDbG9ja0ZyZXEoKTsNCi0gICAgICAgIH0gZWxzZSBpZiAoKEhBTF9JU19CSVRfU0VUKFJDQy0+Q1IsIFJDQ19DUl9IU0lSRFkpKSAmJg0KLSAgICAgICAgICAgICAgICAgICAoc3JjY2xrID09IFJDQ19VU0FSVDNDTEtTT1VSQ0VfSFNJKSkgew0KLSAgICAgICAgICBmcmVxdWVuY3kgPSBIU0lfVkFMVUU7DQotICAgICAgICB9IGVsc2UgaWYgKChIQUxfSVNfQklUX1NFVChSQ0MtPkJEQ1IsIFJDQ19CRENSX0xTRVJEWSkpICYmDQotICAgICAgICAgICAgICAgICAgIChzcmNjbGsgPT0gUkNDX1VTQVJUM0NMS1NPVVJDRV9MU0UpKSB7DQotICAgICAgICAgIGZyZXF1ZW5jeSA9IExTRV9WQUxVRTsNCi0gICAgICAgIH0NCi0gICAgICAgIC8qIENsb2NrIG5vdCBlbmFibGVkIGZvciBVU0FSVDMgKi8NCi0gICAgICAgIGVsc2Ugew0KLSAgICAgICAgICAvKiBub3RoaW5nIHRvIGRvOiBmcmVxdWVuY3kgYWxyZWFkeSBpbml0aWFsaXplZCB0byAwICovDQotICAgICAgICB9DQotICAgICAgICBicmVhazsNCi0NCi0jaWYgZGVmaW5lZChVQVJUNCkNCi0gICAgICBjYXNlIFJDQ19QRVJJUEhDTEtfVUFSVDQ6DQotICAgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgVUFSVDQgc291cmNlICovDQotICAgICAgICBzcmNjbGsgPSBfX0hBTF9SQ0NfR0VUX1VBUlQ0X1NPVVJDRSgpOw0KLQ0KLSAgICAgICAgaWYgKHNyY2NsayA9PSBSQ0NfVUFSVDRDTEtTT1VSQ0VfUENMSzEpIHsNCi0gICAgICAgICAgZnJlcXVlbmN5ID0gSEFMX1JDQ19HZXRQQ0xLMUZyZXEoKTsNCi0gICAgICAgIH0gZWxzZSBpZiAoc3JjY2xrID09IFJDQ19VQVJUNENMS1NPVVJDRV9TWVNDTEspIHsNCi0gICAgICAgICAgZnJlcXVlbmN5ID0gSEFMX1JDQ19HZXRTeXNDbG9ja0ZyZXEoKTsNCi0gICAgICAgIH0gZWxzZSBpZiAoKEhBTF9JU19CSVRfU0VUKFJDQy0+Q1IsIFJDQ19DUl9IU0lSRFkpKSAmJg0KLSAgICAgICAgICAgICAgICAgICAoc3JjY2xrID09IFJDQ19VQVJUNENMS1NPVVJDRV9IU0kpKSB7DQotICAgICAgICAgIGZyZXF1ZW5jeSA9IEhTSV9WQUxVRTsNCi0gICAgICAgIH0gZWxzZSBpZiAoKEhBTF9JU19CSVRfU0VUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfTFNFUkRZKSkgJiYNCi0gICAgICAgICAgICAgICAgICAgKHNyY2NsayA9PSBSQ0NfVUFSVDRDTEtTT1VSQ0VfTFNFKSkgew0KLSAgICAgICAgICBmcmVxdWVuY3kgPSBMU0VfVkFMVUU7DQotICAgICAgICB9DQotICAgICAgICAvKiBDbG9jayBub3QgZW5hYmxlZCBmb3IgVUFSVDQgKi8NCi0gICAgICAgIGVsc2Ugew0KLSAgICAgICAgICAvKiBub3RoaW5nIHRvIGRvOiBmcmVxdWVuY3kgYWxyZWFkeSBpbml0aWFsaXplZCB0byAwICovDQotICAgICAgICB9DQotICAgICAgICBicmVhazsNCi0jZW5kaWYgLyogVUFSVDQgKi8NCi0NCi0jaWYgZGVmaW5lZChVQVJUNSkNCi0gICAgICBjYXNlIFJDQ19QRVJJUEhDTEtfVUFSVDU6DQotICAgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgVUFSVDUgc291cmNlICovDQotICAgICAgICBzcmNjbGsgPSBfX0hBTF9SQ0NfR0VUX1VBUlQ1X1NPVVJDRSgpOw0KLQ0KLSAgICAgICAgaWYgKHNyY2NsayA9PSBSQ0NfVUFSVDVDTEtTT1VSQ0VfUENMSzEpIHsNCi0gICAgICAgICAgZnJlcXVlbmN5ID0gSEFMX1JDQ19HZXRQQ0xLMUZyZXEoKTsNCi0gICAgICAgIH0gZWxzZSBpZiAoc3JjY2xrID09IFJDQ19VQVJUNUNMS1NPVVJDRV9TWVNDTEspIHsNCi0gICAgICAgICAgZnJlcXVlbmN5ID0gSEFMX1JDQ19HZXRTeXNDbG9ja0ZyZXEoKTsNCi0gICAgICAgIH0gZWxzZSBpZiAoKEhBTF9JU19CSVRfU0VUKFJDQy0+Q1IsIFJDQ19DUl9IU0lSRFkpKSAmJg0KLSAgICAgICAgICAgICAgICAgICAoc3JjY2xrID09IFJDQ19VQVJUNUNMS1NPVVJDRV9IU0kpKSB7DQotICAgICAgICAgIGZyZXF1ZW5jeSA9IEhTSV9WQUxVRTsNCi0gICAgICAgIH0gZWxzZSBpZiAoKEhBTF9JU19CSVRfU0VUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfTFNFUkRZKSkgJiYNCi0gICAgICAgICAgICAgICAgICAgKHNyY2NsayA9PSBSQ0NfVUFSVDVDTEtTT1VSQ0VfTFNFKSkgew0KLSAgICAgICAgICBmcmVxdWVuY3kgPSBMU0VfVkFMVUU7DQotICAgICAgICB9DQotICAgICAgICAvKiBDbG9jayBub3QgZW5hYmxlZCBmb3IgVUFSVDUgKi8NCi0gICAgICAgIGVsc2Ugew0KLSAgICAgICAgICAvKiBub3RoaW5nIHRvIGRvOiBmcmVxdWVuY3kgYWxyZWFkeSBpbml0aWFsaXplZCB0byAwICovDQotICAgICAgICB9DQotICAgICAgICBicmVhazsNCi0jZW5kaWYgLyogVUFSVDUgKi8NCi0NCi0gICAgICBjYXNlIFJDQ19QRVJJUEhDTEtfTFBVQVJUMToNCi0gICAgICAgIC8qIEdldCB0aGUgY3VycmVudCBMUFVBUlQxIHNvdXJjZSAqLw0KLSAgICAgICAgc3JjY2xrID0gX19IQUxfUkNDX0dFVF9MUFVBUlQxX1NPVVJDRSgpOw0KLQ0KLSAgICAgICAgaWYgKHNyY2NsayA9PSBSQ0NfTFBVQVJUMUNMS1NPVVJDRV9QQ0xLMSkgew0KLSAgICAgICAgICBmcmVxdWVuY3kgPSBIQUxfUkNDX0dldFBDTEsxRnJlcSgpOw0KLSAgICAgICAgfSBlbHNlIGlmIChzcmNjbGsgPT0gUkNDX0xQVUFSVDFDTEtTT1VSQ0VfU1lTQ0xLKSB7DQotICAgICAgICAgIGZyZXF1ZW5jeSA9IEhBTF9SQ0NfR2V0U3lzQ2xvY2tGcmVxKCk7DQotICAgICAgICB9IGVsc2UgaWYgKChIQUxfSVNfQklUX1NFVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJUkRZKSkgJiYNCi0gICAgICAgICAgICAgICAgICAgKHNyY2NsayA9PSBSQ0NfTFBVQVJUMUNMS1NPVVJDRV9IU0kpKSB7DQotICAgICAgICAgIGZyZXF1ZW5jeSA9IEhTSV9WQUxVRTsNCi0gICAgICAgIH0gZWxzZSBpZiAoKEhBTF9JU19CSVRfU0VUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfTFNFUkRZKSkgJiYNCi0gICAgICAgICAgICAgICAgICAgKHNyY2NsayA9PSBSQ0NfTFBVQVJUMUNMS1NPVVJDRV9MU0UpKSB7DQotICAgICAgICAgIGZyZXF1ZW5jeSA9IExTRV9WQUxVRTsNCi0gICAgICAgIH0NCi0gICAgICAgIC8qIENsb2NrIG5vdCBlbmFibGVkIGZvciBMUFVBUlQxICovDQotICAgICAgICBlbHNlIHsNCi0gICAgICAgICAgLyogbm90aGluZyB0byBkbzogZnJlcXVlbmN5IGFscmVhZHkgaW5pdGlhbGl6ZWQgdG8gMCAqLw0KLSAgICAgICAgfQ0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBSQ0NfUEVSSVBIQ0xLX0kyQzE6DQotICAgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgSTJDMSBzb3VyY2UgKi8NCi0gICAgICAgIHNyY2NsayA9IF9fSEFMX1JDQ19HRVRfSTJDMV9TT1VSQ0UoKTsNCi0NCi0gICAgICAgIGlmIChzcmNjbGsgPT0gUkNDX0kyQzFDTEtTT1VSQ0VfUENMSzEpIHsNCi0gICAgICAgICAgZnJlcXVlbmN5ID0gSEFMX1JDQ19HZXRQQ0xLMUZyZXEoKTsNCi0gICAgICAgIH0gZWxzZSBpZiAoc3JjY2xrID09IFJDQ19JMkMxQ0xLU09VUkNFX1NZU0NMSykgew0KLSAgICAgICAgICBmcmVxdWVuY3kgPSBIQUxfUkNDX0dldFN5c0Nsb2NrRnJlcSgpOw0KLSAgICAgICAgfSBlbHNlIGlmICgoSEFMX0lTX0JJVF9TRVQoUkNDLT5DUiwgUkNDX0NSX0hTSVJEWSkpICYmDQotICAgICAgICAgICAgICAgICAgIChzcmNjbGsgPT0gUkNDX0kyQzFDTEtTT1VSQ0VfSFNJKSkgew0KLSAgICAgICAgICBmcmVxdWVuY3kgPSBIU0lfVkFMVUU7DQotICAgICAgICB9DQotICAgICAgICAvKiBDbG9jayBub3QgZW5hYmxlZCBmb3IgSTJDMSAqLw0KLSAgICAgICAgZWxzZSB7DQotICAgICAgICAgIC8qIG5vdGhpbmcgdG8gZG86IGZyZXF1ZW5jeSBhbHJlYWR5IGluaXRpYWxpemVkIHRvIDAgKi8NCi0gICAgICAgIH0NCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgUkNDX1BFUklQSENMS19JMkMyOg0KLSAgICAgICAgLyogR2V0IHRoZSBjdXJyZW50IEkyQzIgc291cmNlICovDQotICAgICAgICBzcmNjbGsgPSBfX0hBTF9SQ0NfR0VUX0kyQzJfU09VUkNFKCk7DQotDQotICAgICAgICBpZiAoc3JjY2xrID09IFJDQ19JMkMyQ0xLU09VUkNFX1BDTEsxKSB7DQotICAgICAgICAgIGZyZXF1ZW5jeSA9IEhBTF9SQ0NfR2V0UENMSzFGcmVxKCk7DQotICAgICAgICB9IGVsc2UgaWYgKHNyY2NsayA9PSBSQ0NfSTJDMkNMS1NPVVJDRV9TWVNDTEspIHsNCi0gICAgICAgICAgZnJlcXVlbmN5ID0gSEFMX1JDQ19HZXRTeXNDbG9ja0ZyZXEoKTsNCi0gICAgICAgIH0gZWxzZSBpZiAoKEhBTF9JU19CSVRfU0VUKFJDQy0+Q1IsIFJDQ19DUl9IU0lSRFkpKSAmJg0KLSAgICAgICAgICAgICAgICAgICAoc3JjY2xrID09IFJDQ19JMkMyQ0xLU09VUkNFX0hTSSkpIHsNCi0gICAgICAgICAgZnJlcXVlbmN5ID0gSFNJX1ZBTFVFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgLyogQ2xvY2sgbm90IGVuYWJsZWQgZm9yIEkyQzIgKi8NCi0gICAgICAgIGVsc2Ugew0KLSAgICAgICAgICAvKiBub3RoaW5nIHRvIGRvOiBmcmVxdWVuY3kgYWxyZWFkeSBpbml0aWFsaXplZCB0byAwICovDQotICAgICAgICB9DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIFJDQ19QRVJJUEhDTEtfSTJDMzoNCi0gICAgICAgIC8qIEdldCB0aGUgY3VycmVudCBJMkMzIHNvdXJjZSAqLw0KLSAgICAgICAgc3JjY2xrID0gX19IQUxfUkNDX0dFVF9JMkMzX1NPVVJDRSgpOw0KLQ0KLSAgICAgICAgaWYgKHNyY2NsayA9PSBSQ0NfSTJDM0NMS1NPVVJDRV9QQ0xLMSkgew0KLSAgICAgICAgICBmcmVxdWVuY3kgPSBIQUxfUkNDX0dldFBDTEsxRnJlcSgpOw0KLSAgICAgICAgfSBlbHNlIGlmIChzcmNjbGsgPT0gUkNDX0kyQzNDTEtTT1VSQ0VfU1lTQ0xLKSB7DQotICAgICAgICAgIGZyZXF1ZW5jeSA9IEhBTF9SQ0NfR2V0U3lzQ2xvY2tGcmVxKCk7DQotICAgICAgICB9IGVsc2UgaWYgKChIQUxfSVNfQklUX1NFVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJUkRZKSkgJiYNCi0gICAgICAgICAgICAgICAgICAgKHNyY2NsayA9PSBSQ0NfSTJDM0NMS1NPVVJDRV9IU0kpKSB7DQotICAgICAgICAgIGZyZXF1ZW5jeSA9IEhTSV9WQUxVRTsNCi0gICAgICAgIH0NCi0gICAgICAgIC8qIENsb2NrIG5vdCBlbmFibGVkIGZvciBJMkMzICovDQotICAgICAgICBlbHNlIHsNCi0gICAgICAgICAgLyogbm90aGluZyB0byBkbzogZnJlcXVlbmN5IGFscmVhZHkgaW5pdGlhbGl6ZWQgdG8gMCAqLw0KLSAgICAgICAgfQ0KLSAgICAgICAgYnJlYWs7DQotDQotI2lmIGRlZmluZWQoSTJDNCkNCi0NCi0gICAgICBjYXNlIFJDQ19QRVJJUEhDTEtfSTJDNDoNCi0gICAgICAgIC8qIEdldCB0aGUgY3VycmVudCBJMkM0IHNvdXJjZSAqLw0KLSAgICAgICAgc3JjY2xrID0gX19IQUxfUkNDX0dFVF9JMkM0X1NPVVJDRSgpOw0KLQ0KLSAgICAgICAgaWYgKHNyY2NsayA9PSBSQ0NfSTJDNENMS1NPVVJDRV9QQ0xLMSkgew0KLSAgICAgICAgICBmcmVxdWVuY3kgPSBIQUxfUkNDX0dldFBDTEsxRnJlcSgpOw0KLSAgICAgICAgfSBlbHNlIGlmIChzcmNjbGsgPT0gUkNDX0kyQzRDTEtTT1VSQ0VfU1lTQ0xLKSB7DQotICAgICAgICAgIGZyZXF1ZW5jeSA9IEhBTF9SQ0NfR2V0U3lzQ2xvY2tGcmVxKCk7DQotICAgICAgICB9IGVsc2UgaWYgKChIQUxfSVNfQklUX1NFVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJUkRZKSkgJiYNCi0gICAgICAgICAgICAgICAgICAgKHNyY2NsayA9PSBSQ0NfSTJDNENMS1NPVVJDRV9IU0kpKSB7DQotICAgICAgICAgIGZyZXF1ZW5jeSA9IEhTSV9WQUxVRTsNCi0gICAgICAgIH0NCi0gICAgICAgIC8qIENsb2NrIG5vdCBlbmFibGVkIGZvciBJMkM0ICovDQotICAgICAgICBlbHNlIHsNCi0gICAgICAgICAgLyogbm90aGluZyB0byBkbzogZnJlcXVlbmN5IGFscmVhZHkgaW5pdGlhbGl6ZWQgdG8gMCAqLw0KLSAgICAgICAgfQ0KLSAgICAgICAgYnJlYWs7DQotDQotI2VuZGlmIC8qIEkyQzQgKi8NCi0NCi0gICAgICBjYXNlIFJDQ19QRVJJUEhDTEtfTFBUSU0xOg0KLSAgICAgICAgLyogR2V0IHRoZSBjdXJyZW50IExQVElNMSBzb3VyY2UgKi8NCi0gICAgICAgIHNyY2NsayA9IF9fSEFMX1JDQ19HRVRfTFBUSU0xX1NPVVJDRSgpOw0KLQ0KLSAgICAgICAgaWYgKHNyY2NsayA9PSBSQ0NfTFBUSU0xQ0xLU09VUkNFX1BDTEsxKSB7DQotICAgICAgICAgIGZyZXF1ZW5jeSA9IEhBTF9SQ0NfR2V0UENMSzFGcmVxKCk7DQotICAgICAgICB9IGVsc2UgaWYgKChIQUxfSVNfQklUX1NFVChSQ0MtPkNTUiwgUkNDX0NTUl9MU0lSRFkpKSAmJg0KLSAgICAgICAgICAgICAgICAgICAoc3JjY2xrID09IFJDQ19MUFRJTTFDTEtTT1VSQ0VfTFNJKSkgew0KLSAgICAgICAgICBmcmVxdWVuY3kgPSBMU0lfVkFMVUU7DQotICAgICAgICB9IGVsc2UgaWYgKChIQUxfSVNfQklUX1NFVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJUkRZKSkgJiYNCi0gICAgICAgICAgICAgICAgICAgKHNyY2NsayA9PSBSQ0NfTFBUSU0xQ0xLU09VUkNFX0hTSSkpIHsNCi0gICAgICAgICAgZnJlcXVlbmN5ID0gSFNJX1ZBTFVFOw0KLSAgICAgICAgfSBlbHNlIGlmICgoSEFMX0lTX0JJVF9TRVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9MU0VSRFkpKSAmJg0KLSAgICAgICAgICAgICAgICAgICAoc3JjY2xrID09IFJDQ19MUFRJTTFDTEtTT1VSQ0VfTFNFKSkgew0KLSAgICAgICAgICBmcmVxdWVuY3kgPSBMU0VfVkFMVUU7DQotICAgICAgICB9DQotICAgICAgICAvKiBDbG9jayBub3QgZW5hYmxlZCBmb3IgTFBUSU0xICovDQotICAgICAgICBlbHNlIHsNCi0gICAgICAgICAgLyogbm90aGluZyB0byBkbzogZnJlcXVlbmN5IGFscmVhZHkgaW5pdGlhbGl6ZWQgdG8gMCAqLw0KLSAgICAgICAgfQ0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBSQ0NfUEVSSVBIQ0xLX1NBSTE6DQotICAgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgU0FJMSBzb3VyY2UgKi8NCi0gICAgICAgIHNyY2NsayA9IF9fSEFMX1JDQ19HRVRfU0FJMV9TT1VSQ0UoKTsNCi0NCi0gICAgICAgIGlmIChzcmNjbGsgPT0gUkNDX1NBSTFDTEtTT1VSQ0VfU1lTQ0xLKSB7DQotICAgICAgICAgIGZyZXF1ZW5jeSA9IEhBTF9SQ0NfR2V0U3lzQ2xvY2tGcmVxKCk7DQotICAgICAgICB9IGVsc2UgaWYgKHNyY2NsayA9PSBSQ0NfU0FJMUNMS1NPVVJDRV9QTEwpIHsNCi0gICAgICAgICAgaWYgKF9fSEFMX1JDQ19HRVRfUExMQ0xLT1VUX0NPTkZJRyhSQ0NfUExMXzQ4TTFDTEspICE9IDBVKSB7DQotICAgICAgICAgICAgLyogZihQTExRKSA9IGYoVkNPIGlucHV0KSAqIFBMTE4gLyBQTExRICovDQotICAgICAgICAgICAgcGxsbiA9IFJFQURfQklUKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMTikgPj4NCi0gICAgICAgICAgICAgICAgICAgUkNDX1BMTENGR1JfUExMTl9Qb3M7DQotICAgICAgICAgICAgZnJlcXVlbmN5ID0NCi0gICAgICAgICAgICAgICAgKHBsbHZjbyAqIHBsbG4pIC8gKCgoUkVBRF9CSVQoUkNDLT5QTExDRkdSLCBSQ0NfUExMQ0ZHUl9QTExRKSA+Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NfUExMQ0ZHUl9QTExRX1BvcykgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDFVKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgMVUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9IGVsc2UgaWYgKHNyY2NsayA9PSBSQ0NfU0FJMUNMS1NPVVJDRV9FWFQpIHsNCi0gICAgICAgICAgLyogRXh0ZXJuYWwgY2xvY2sgdXNlZC4qLw0KLSAgICAgICAgICBmcmVxdWVuY3kgPSBFWFRFUk5BTF9DTE9DS19WQUxVRTsNCi0gICAgICAgIH0gZWxzZSBpZiAoKEhBTF9JU19CSVRfU0VUKFJDQy0+Q1IsIFJDQ19DUl9IU0lSRFkpKSAmJg0KLSAgICAgICAgICAgICAgICAgICAoc3JjY2xrID09IFJDQ19TQUkxQ0xLU09VUkNFX0hTSSkpIHsNCi0gICAgICAgICAgZnJlcXVlbmN5ID0gSFNJX1ZBTFVFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgLyogQ2xvY2sgbm90IGVuYWJsZWQgZm9yIFNBSTEgKi8NCi0gICAgICAgIGVsc2Ugew0KLSAgICAgICAgICAvKiBub3RoaW5nIHRvIGRvOiBmcmVxdWVuY3kgYWxyZWFkeSBpbml0aWFsaXplZCB0byAwICovDQotICAgICAgICB9DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIFJDQ19QRVJJUEhDTEtfSTJTOg0KLSAgICAgICAgLyogR2V0IHRoZSBjdXJyZW50IEkyU3ggc291cmNlICovDQotICAgICAgICBzcmNjbGsgPSBfX0hBTF9SQ0NfR0VUX0kyU19TT1VSQ0UoKTsNCi0NCi0gICAgICAgIGlmIChzcmNjbGsgPT0gUkNDX0kyU0NMS1NPVVJDRV9TWVNDTEspIHsNCi0gICAgICAgICAgZnJlcXVlbmN5ID0gSEFMX1JDQ19HZXRTeXNDbG9ja0ZyZXEoKTsNCi0gICAgICAgIH0gZWxzZSBpZiAoc3JjY2xrID09IFJDQ19JMlNDTEtTT1VSQ0VfUExMKSB7DQotICAgICAgICAgIGlmIChfX0hBTF9SQ0NfR0VUX1BMTENMS09VVF9DT05GSUcoUkNDX1BMTF80OE0xQ0xLKSAhPSAwVSkgew0KLSAgICAgICAgICAgIC8qIGYoUExMUSkgPSBmKFZDTyBpbnB1dCkgKiBQTExOIC8gUExMUSAqLw0KLSAgICAgICAgICAgIHBsbG4gPSBSRUFEX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTE4pID4+DQotICAgICAgICAgICAgICAgICAgIFJDQ19QTExDRkdSX1BMTE5fUG9zOw0KLSAgICAgICAgICAgIGZyZXF1ZW5jeSA9DQotICAgICAgICAgICAgICAgIChwbGx2Y28gKiBwbGxuKSAvICgoKFJFQURfQklUKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMUSkgPj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BMTENGR1JfUExMUV9Qb3MpICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxVSkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IDFVKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIGlmIChzcmNjbGsgPT0gUkNDX0kyU0NMS1NPVVJDRV9FWFQpIHsNCi0gICAgICAgICAgLyogRXh0ZXJuYWwgY2xvY2sgdXNlZC4qLw0KLSAgICAgICAgICBmcmVxdWVuY3kgPSBFWFRFUk5BTF9DTE9DS19WQUxVRTsNCi0gICAgICAgIH0gZWxzZSBpZiAoKEhBTF9JU19CSVRfU0VUKFJDQy0+Q1IsIFJDQ19DUl9IU0lSRFkpKSAmJg0KLSAgICAgICAgICAgICAgICAgICAoc3JjY2xrID09IFJDQ19JMlNDTEtTT1VSQ0VfSFNJKSkgew0KLSAgICAgICAgICBmcmVxdWVuY3kgPSBIU0lfVkFMVUU7DQotICAgICAgICB9DQotICAgICAgICAvKiBDbG9jayBub3QgZW5hYmxlZCBmb3IgSTJTICovDQotICAgICAgICBlbHNlIHsNCi0gICAgICAgICAgLyogbm90aGluZyB0byBkbzogZnJlcXVlbmN5IGFscmVhZHkgaW5pdGlhbGl6ZWQgdG8gMCAqLw0KLSAgICAgICAgfQ0KLSAgICAgICAgYnJlYWs7DQotDQotI2lmIGRlZmluZWQoRkRDQU4xKQ0KLSAgICAgIGNhc2UgUkNDX1BFUklQSENMS19GRENBTjoNCi0gICAgICAgIC8qIEdldCB0aGUgY3VycmVudCBGRENBTnggc291cmNlICovDQotICAgICAgICBzcmNjbGsgPSBfX0hBTF9SQ0NfR0VUX0ZEQ0FOX1NPVVJDRSgpOw0KLQ0KLSAgICAgICAgaWYgKHNyY2NsayA9PSBSQ0NfRkRDQU5DTEtTT1VSQ0VfUENMSzEpIHsNCi0gICAgICAgICAgZnJlcXVlbmN5ID0gSEFMX1JDQ19HZXRQQ0xLMUZyZXEoKTsNCi0gICAgICAgIH0gZWxzZSBpZiAoc3JjY2xrID09IFJDQ19GRENBTkNMS1NPVVJDRV9IU0UpIHsNCi0gICAgICAgICAgZnJlcXVlbmN5ID0gSFNFX1ZBTFVFOw0KLSAgICAgICAgfSBlbHNlIGlmIChzcmNjbGsgPT0gUkNDX0ZEQ0FOQ0xLU09VUkNFX1BMTCkgew0KLSAgICAgICAgICBpZiAoX19IQUxfUkNDX0dFVF9QTExDTEtPVVRfQ09ORklHKFJDQ19QTExfNDhNMUNMSykgIT0gMFUpIHsNCi0gICAgICAgICAgICAvKiBmKFBMTFEpID0gZihWQ08gaW5wdXQpICogUExMTiAvIFBMTFEgKi8NCi0gICAgICAgICAgICBwbGxuID0gUkVBRF9CSVQoUkNDLT5QTExDRkdSLCBSQ0NfUExMQ0ZHUl9QTExOKSA+Pg0KLSAgICAgICAgICAgICAgICAgICBSQ0NfUExMQ0ZHUl9QTExOX1BvczsNCi0gICAgICAgICAgICBmcmVxdWVuY3kgPQ0KLSAgICAgICAgICAgICAgICAocGxsdmNvICogcGxsbikgLyAoKChSRUFEX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTFEpID4+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19QTExDRkdSX1BMTFFfUG9zKSArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMVUpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAxVSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIC8qIENsb2NrIG5vdCBlbmFibGVkIGZvciBGRENBTiAqLw0KLSAgICAgICAgZWxzZSB7DQotICAgICAgICAgIC8qIG5vdGhpbmcgdG8gZG86IGZyZXF1ZW5jeSBhbHJlYWR5IGluaXRpYWxpemVkIHRvIDAgKi8NCi0gICAgICAgIH0NCi0gICAgICAgIGJyZWFrOw0KLSNlbmRpZiAvKiBGRENBTjEgKi8NCi0NCi0jaWYgZGVmaW5lZChVU0IpDQotDQotICAgICAgY2FzZSBSQ0NfUEVSSVBIQ0xLX1VTQjoNCi0gICAgICAgIC8qIEdldCB0aGUgY3VycmVudCBVU0Igc291cmNlICovDQotICAgICAgICBzcmNjbGsgPSBfX0hBTF9SQ0NfR0VUX1VTQl9TT1VSQ0UoKTsNCi0NCi0gICAgICAgIGlmIChzcmNjbGsgPT0gUkNDX1VTQkNMS1NPVVJDRV9QTEwpIC8qIFBMTCA/ICovDQotICAgICAgICB7DQotICAgICAgICAgIC8qIGYoUExMUSkgPSBmKFZDTyBpbnB1dCkgKiBQTExOIC8gUExMUSAqLw0KLSAgICAgICAgICBwbGxuID0NCi0gICAgICAgICAgICAgIFJFQURfQklUKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMTikgPj4gUkNDX1BMTENGR1JfUExMTl9Qb3M7DQotICAgICAgICAgIGZyZXF1ZW5jeSA9DQotICAgICAgICAgICAgICAocGxsdmNvICogcGxsbikgLyAoKChSRUFEX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTFEpID4+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NfUExMQ0ZHUl9QTExRX1BvcykgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxVSkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAxVSk7DQotICAgICAgICB9IGVsc2UgaWYgKChIQUxfSVNfQklUX1NFVChSQ0MtPkNSUkNSLCBSQ0NfQ1JSQ1JfSFNJNDhSRFkpKSAmJg0KLSAgICAgICAgICAgICAgICAgICAoc3JjY2xrID09IFJDQ19VU0JDTEtTT1VSQ0VfSFNJNDgpKSAvKiBIU0k0OCA/ICovDQotICAgICAgICB7DQotICAgICAgICAgIGZyZXF1ZW5jeSA9IEhTSTQ4X1ZBTFVFOw0KLSAgICAgICAgfSBlbHNlIC8qIE5vIGNsb2NrIHNvdXJjZSAqLw0KLSAgICAgICAgew0KLSAgICAgICAgICAvKiBub3RoaW5nIHRvIGRvOiBmcmVxdWVuY3kgYWxyZWFkeSBpbml0aWFsaXplZCB0byAwICovDQotICAgICAgICB9DQotICAgICAgICBicmVhazsNCi0NCi0jZW5kaWYgLyogVVNCICovDQotDQotICAgICAgY2FzZSBSQ0NfUEVSSVBIQ0xLX1JORzoNCi0gICAgICAgIC8qIEdldCB0aGUgY3VycmVudCBSTkcgc291cmNlICovDQotICAgICAgICBzcmNjbGsgPSBfX0hBTF9SQ0NfR0VUX1JOR19TT1VSQ0UoKTsNCi0NCi0gICAgICAgIGlmIChzcmNjbGsgPT0gUkNDX1JOR0NMS1NPVVJDRV9QTEwpIC8qIFBMTCA/ICovDQotICAgICAgICB7DQotICAgICAgICAgIC8qIGYoUExMUSkgPSBmKFZDTyBpbnB1dCkgKiBQTExOIC8gUExMUSAqLw0KLSAgICAgICAgICBwbGxuID0NCi0gICAgICAgICAgICAgIFJFQURfQklUKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMTikgPj4gUkNDX1BMTENGR1JfUExMTl9Qb3M7DQotICAgICAgICAgIGZyZXF1ZW5jeSA9DQotICAgICAgICAgICAgICAocGxsdmNvICogcGxsbikgLyAoKChSRUFEX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTFEpID4+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NfUExMQ0ZHUl9QTExRX1BvcykgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxVSkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAxVSk7DQotICAgICAgICB9IGVsc2UgaWYgKChIQUxfSVNfQklUX1NFVChSQ0MtPkNSUkNSLCBSQ0NfQ1JSQ1JfSFNJNDhSRFkpKSAmJg0KLSAgICAgICAgICAgICAgICAgICAoc3JjY2xrID09IFJDQ19STkdDTEtTT1VSQ0VfSFNJNDgpKSAvKiBIU0k0OCA/ICovDQotICAgICAgICB7DQotICAgICAgICAgIGZyZXF1ZW5jeSA9IEhTSTQ4X1ZBTFVFOw0KLSAgICAgICAgfSBlbHNlIC8qIE5vIGNsb2NrIHNvdXJjZSAqLw0KLSAgICAgICAgew0KLSAgICAgICAgICAvKiBub3RoaW5nIHRvIGRvOiBmcmVxdWVuY3kgYWxyZWFkeSBpbml0aWFsaXplZCB0byAwICovDQotICAgICAgICB9DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIFJDQ19QRVJJUEhDTEtfQURDMTI6DQotICAgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgQURDMTIgc291cmNlICovDQotICAgICAgICBzcmNjbGsgPSBfX0hBTF9SQ0NfR0VUX0FEQzEyX1NPVVJDRSgpOw0KLQ0KLSAgICAgICAgaWYgKHNyY2NsayA9PSBSQ0NfQURDMTJDTEtTT1VSQ0VfUExMKSB7DQotICAgICAgICAgIGlmIChfX0hBTF9SQ0NfR0VUX1BMTENMS09VVF9DT05GSUcoUkNDX1BMTF9BRENDTEspICE9IDBVKSB7DQotICAgICAgICAgICAgLyogZihQTExQKSA9IGYoVkNPIGlucHV0KSAqIFBMTE4gLyBQTExQICovDQotICAgICAgICAgICAgcGxsbiA9IFJFQURfQklUKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMTikgPj4NCi0gICAgICAgICAgICAgICAgICAgUkNDX1BMTENGR1JfUExMTl9Qb3M7DQotICAgICAgICAgICAgcGxscCA9IFJFQURfQklUKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMUERJVikgPj4NCi0gICAgICAgICAgICAgICAgICAgUkNDX1BMTENGR1JfUExMUERJVl9Qb3M7DQotICAgICAgICAgICAgaWYgKHBsbHAgPT0gMFUpIHsNCi0gICAgICAgICAgICAgIGlmIChSRUFEX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTFApICE9IDBVKSB7DQotICAgICAgICAgICAgICAgIHBsbHAgPSAxN1U7DQotICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBwbGxwID0gN1U7DQotICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGZyZXF1ZW5jeSA9IChwbGx2Y28gKiBwbGxuKSAvIHBsbHA7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSBpZiAoc3JjY2xrID09IFJDQ19BREMxMkNMS1NPVVJDRV9TWVNDTEspIHsNCi0gICAgICAgICAgZnJlcXVlbmN5ID0gSEFMX1JDQ19HZXRTeXNDbG9ja0ZyZXEoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIC8qIENsb2NrIG5vdCBlbmFibGVkIGZvciBBREMxMiAqLw0KLSAgICAgICAgZWxzZSB7DQotICAgICAgICAgIC8qIG5vdGhpbmcgdG8gZG86IGZyZXF1ZW5jeSBhbHJlYWR5IGluaXRpYWxpemVkIHRvIDAgKi8NCi0gICAgICAgIH0NCi0gICAgICAgIGJyZWFrOw0KLQ0KLSNpZiBkZWZpbmVkKEFEQzM0NV9DT01NT04pDQotICAgICAgY2FzZSBSQ0NfUEVSSVBIQ0xLX0FEQzM0NToNCi0gICAgICAgIC8qIEdldCB0aGUgY3VycmVudCBBREMzNDUgc291cmNlICovDQotICAgICAgICBzcmNjbGsgPSBfX0hBTF9SQ0NfR0VUX0FEQzM0NV9TT1VSQ0UoKTsNCi0NCi0gICAgICAgIGlmIChzcmNjbGsgPT0gUkNDX0FEQzM0NUNMS1NPVVJDRV9QTEwpIHsNCi0gICAgICAgICAgaWYgKF9fSEFMX1JDQ19HRVRfUExMQ0xLT1VUX0NPTkZJRyhSQ0NfUExMX0FEQ0NMSykgIT0gMFUpIHsNCi0gICAgICAgICAgICAvKiBmKFBMTFApID0gZihWQ08gaW5wdXQpICogUExMTiAvIFBMTFAgKi8NCi0gICAgICAgICAgICBwbGxuID0gUkVBRF9CSVQoUkNDLT5QTExDRkdSLCBSQ0NfUExMQ0ZHUl9QTExOKSA+Pg0KLSAgICAgICAgICAgICAgICAgICBSQ0NfUExMQ0ZHUl9QTExOX1BvczsNCi0gICAgICAgICAgICBwbGxwID0gUkVBRF9CSVQoUkNDLT5QTExDRkdSLCBSQ0NfUExMQ0ZHUl9QTExQRElWKSA+Pg0KLSAgICAgICAgICAgICAgICAgICBSQ0NfUExMQ0ZHUl9QTExQRElWX1BvczsNCi0gICAgICAgICAgICBpZiAocGxscCA9PSAwVSkgew0KLSAgICAgICAgICAgICAgaWYgKFJFQURfQklUKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMUCkgIT0gMFUpIHsNCi0gICAgICAgICAgICAgICAgcGxscCA9IDE3VTsNCi0gICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIHBsbHAgPSA3VTsNCi0gICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZnJlcXVlbmN5ID0gKHBsbHZjbyAqIHBsbG4pIC8gcGxscDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIGlmIChzcmNjbGsgPT0gUkNDX0FEQzM0NUNMS1NPVVJDRV9TWVNDTEspIHsNCi0gICAgICAgICAgZnJlcXVlbmN5ID0gSEFMX1JDQ19HZXRTeXNDbG9ja0ZyZXEoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIC8qIENsb2NrIG5vdCBlbmFibGVkIGZvciBBREMzNDUgKi8NCi0gICAgICAgIGVsc2Ugew0KLSAgICAgICAgICAvKiBub3RoaW5nIHRvIGRvOiBmcmVxdWVuY3kgYWxyZWFkeSBpbml0aWFsaXplZCB0byAwICovDQotICAgICAgICB9DQotICAgICAgICBicmVhazsNCi0jZW5kaWYgLyogQURDMzQ1X0NPTU1PTiAqLw0KLQ0KLSNpZiBkZWZpbmVkKFFVQURTUEkpDQotDQotICAgICAgY2FzZSBSQ0NfUEVSSVBIQ0xLX1FTUEk6DQotICAgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgUVNQSSBzb3VyY2UgKi8NCi0gICAgICAgIHNyY2NsayA9IF9fSEFMX1JDQ19HRVRfUVNQSV9TT1VSQ0UoKTsNCi0NCi0gICAgICAgIGlmIChzcmNjbGsgPT0gUkNDX1FTUElDTEtTT1VSQ0VfUExMKSAvKiBQTEwgPyAqLw0KLSAgICAgICAgew0KLSAgICAgICAgICAvKiBmKFBMTFEpID0gZihWQ08gaW5wdXQpICogUExMTiAvIFBMTFEgKi8NCi0gICAgICAgICAgcGxsbiA9DQotICAgICAgICAgICAgICBSRUFEX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTE4pID4+IFJDQ19QTExDRkdSX1BMTE5fUG9zOw0KLSAgICAgICAgICBmcmVxdWVuY3kgPQ0KLSAgICAgICAgICAgICAgKHBsbHZjbyAqIHBsbG4pIC8gKCgoUkVBRF9CSVQoUkNDLT5QTExDRkdSLCBSQ0NfUExMQ0ZHUl9QTExRKSA+Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BMTENGR1JfUExMUV9Qb3MpICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMVUpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgMVUpOw0KLSAgICAgICAgfSBlbHNlIGlmIChzcmNjbGsgPT0gUkNDX1FTUElDTEtTT1VSQ0VfSFNJKSB7DQotICAgICAgICAgIGZyZXF1ZW5jeSA9IEhTSV9WQUxVRTsNCi0gICAgICAgIH0gZWxzZSBpZiAoc3JjY2xrID09IFJDQ19RU1BJQ0xLU09VUkNFX1NZU0NMSykgew0KLSAgICAgICAgICBmcmVxdWVuY3kgPSBIQUxfUkNDX0dldFN5c0Nsb2NrRnJlcSgpOw0KLSAgICAgICAgfSBlbHNlIC8qIE5vIGNsb2NrIHNvdXJjZSAqLw0KLSAgICAgICAgew0KLSAgICAgICAgICAvKiBub3RoaW5nIHRvIGRvOiBmcmVxdWVuY3kgYWxyZWFkeSBpbml0aWFsaXplZCB0byAwICovDQotICAgICAgICB9DQotICAgICAgICBicmVhazsNCi0NCi0jZW5kaWYgLyogUVVBRFNQSSAqLw0KLQ0KLSAgICAgIGRlZmF1bHQ6DQotICAgICAgICBicmVhazsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgcmV0dXJuIChmcmVxdWVuY3kpOw0KLX0NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUkNDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBFeHRlbmRlZCBDbG9jayBtYW5hZ2VtZW50DQotZnVuY3Rpb25zDQotICogIEBicmllZiAgRXh0ZW5kZWQgQ2xvY2sgbWFuYWdlbWVudCBmdW5jdGlvbnMNCi0gKg0KLUB2ZXJiYXRpbQ0KLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgICAgICAgICAgICAgICMjIyMjIEV4dGVuZGVkIGNsb2NrIG1hbmFnZW1lbnQgZnVuY3Rpb25zICAjIyMjIw0KLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgIFsuLl0NCi0gICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBjb250cm9sIHRoZQ0KLSAgICBhY3RpdmF0aW9uIG9yIGRlYWN0aXZhdGlvbiBvZiBMU0UgQ1NTLA0KLSAgICBMb3cgc3BlZWQgY2xvY2sgb3V0cHV0IGFuZCBjbG9jayBhZnRlciB3YWtlLXVwIGZyb20gU1RPUCBtb2RlLg0KLUBlbmR2ZXJiYXRpbQ0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSB0aGUgTFNFIENsb2NrIFNlY3VyaXR5IFN5c3RlbS4NCi0gKiBAbm90ZSAgIFByaW9yIHRvIGVuYWJsZSB0aGUgTFNFIENsb2NrIFNlY3VyaXR5IFN5c3RlbSwgTFNFIG9zY2lsbGF0b3IgaXMgdG8NCi0gKiBiZSBlbmFibGVkIHdpdGggSEFMX1JDQ19Pc2NDb25maWcoKSBhbmQgdGhlIExTRSBvc2NpbGxhdG9yIGNsb2NrIGlzIHRvIGJlDQotICogc2VsZWN0ZWQgYXMgUlRDIGNsb2NrIHdpdGggSEFMX1JDQ0V4X1BlcmlwaENMS0NvbmZpZygpLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXZvaWQgSEFMX1JDQ0V4X0VuYWJsZUxTRUNTUyh2b2lkKSB7IFNFVF9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9MU0VDU1NPTik7IH0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgdGhlIExTRSBDbG9jayBTZWN1cml0eSBTeXN0ZW0uDQotICogQG5vdGUgICBMU0UgQ2xvY2sgU2VjdXJpdHkgU3lzdGVtIGNhbiBvbmx5IGJlIGRpc2FibGVkIGFmdGVyIGEgTFNFIGZhaWx1cmUNCi0gKiBkZXRlY3Rpb24uDQotICogQHJldHZhbCBOb25lDQotICovDQotdm9pZCBIQUxfUkNDRXhfRGlzYWJsZUxTRUNTUyh2b2lkKSB7DQotICBDTEVBUl9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9MU0VDU1NPTik7DQotDQotICAvKiBEaXNhYmxlIExTRSBDU1MgSVQgaWYgYW55ICovDQotICBfX0hBTF9SQ0NfRElTQUJMRV9JVChSQ0NfSVRfTFNFQ1NTKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgdGhlIExTRSBDbG9jayBTZWN1cml0eSBTeXN0ZW0gSW50ZXJydXB0ICYgY29ycmVzcG9uZGluZyBFWFRJDQotICogbGluZS4NCi0gKiBAbm90ZSAgIExTRSBDbG9jayBTZWN1cml0eSBTeXN0ZW0gSW50ZXJydXB0IGlzIG1hcHBlZCBvbiBSVEMgRVhUSSBsaW5lIDE5DQotICogQHJldHZhbCBOb25lDQotICovDQotdm9pZCBIQUxfUkNDRXhfRW5hYmxlTFNFQ1NTX0lUKHZvaWQpIHsNCi0gIC8qIEVuYWJsZSBMU0UgQ1NTICovDQotICBTRVRfQklUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfTFNFQ1NTT04pOw0KLQ0KLSAgLyogRW5hYmxlIExTRSBDU1MgSVQgKi8NCi0gIF9fSEFMX1JDQ19FTkFCTEVfSVQoUkNDX0lUX0xTRUNTUyk7DQotDQotICAvKiBFbmFibGUgSVQgb24gRVhUSSBMaW5lIDE5ICovDQotICBfX0hBTF9SQ0NfTFNFQ1NTX0VYVElfRU5BQkxFX0lUKCk7DQotICBfX0hBTF9SQ0NfTFNFQ1NTX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBIYW5kbGUgdGhlIFJDQyBMU0UgQ2xvY2sgU2VjdXJpdHkgU3lzdGVtIGludGVycnVwdCByZXF1ZXN0Lg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXZvaWQgSEFMX1JDQ0V4X0xTRUNTU19JUlFIYW5kbGVyKHZvaWQpIHsNCi0gIC8qIENoZWNrIFJDQyBMU0UgQ1NTRiBmbGFnICAqLw0KLSAgaWYgKF9fSEFMX1JDQ19HRVRfSVQoUkNDX0lUX0xTRUNTUykpIHsNCi0gICAgLyogUkNDIExTRSBDbG9jayBTZWN1cml0eSBTeXN0ZW0gaW50ZXJydXB0IHVzZXIgY2FsbGJhY2sgKi8NCi0gICAgSEFMX1JDQ0V4X0xTRUNTU19DYWxsYmFjaygpOw0KLQ0KLSAgICAvKiBDbGVhciBSQ0MgTFNFIENTUyBwZW5kaW5nIGJpdCAqLw0KLSAgICBfX0hBTF9SQ0NfQ0xFQVJfSVQoUkNDX0lUX0xTRUNTUyk7DQotICB9DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUkNDRXggTFNFIENsb2NrIFNlY3VyaXR5IFN5c3RlbSBpbnRlcnJ1cHQgY2FsbGJhY2suDQotICogQHJldHZhbCBub25lDQotICovDQotX193ZWFrIHZvaWQgSEFMX1JDQ0V4X0xTRUNTU19DYWxsYmFjayh2b2lkKSB7DQotICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsDQotICAgICAgICAgICAgdGhlIEByZWYgSEFMX1JDQ0V4X0xTRUNTU19DYWxsYmFjayBzaG91bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXINCi0gICAgIGZpbGUNCi0gICAqLw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNlbGVjdCB0aGUgTG93IFNwZWVkIGNsb2NrIHNvdXJjZSB0byBvdXRwdXQgb24gTFNDTyBwaW4gKFBBMikuDQotICogQHBhcmFtICBMU0NPU291cmNlICBzcGVjaWZpZXMgdGhlIExvdyBTcGVlZCBjbG9jayBzb3VyY2UgdG8gb3V0cHV0Lg0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0xTQ09TT1VSQ0VfTFNJICBMU0kgY2xvY2sgc2VsZWN0ZWQgYXMgTFNDTyBzb3VyY2UNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFNDT1NPVVJDRV9MU0UgIExTRSBjbG9jayBzZWxlY3RlZCBhcyBMU0NPIHNvdXJjZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXZvaWQgSEFMX1JDQ0V4X0VuYWJsZUxTQ08odWludDMyX3QgTFNDT1NvdXJjZSkgew0KLSAgR1BJT19Jbml0VHlwZURlZiBHUElPX0luaXRTdHJ1Y3Q7DQotICBGbGFnU3RhdHVzIHB3cmNsa2NoYW5nZWQgPSBSRVNFVDsNCi0gIEZsYWdTdGF0dXMgYmFja3VwY2hhbmdlZCA9IFJFU0VUOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19SQ0NfTFNDT1NPVVJDRShMU0NPU291cmNlKSk7DQotDQotICAvKiBMU0NPIFBpbiBDbG9jayBFbmFibGUgKi8NCi0gIF9fTFNDT19DTEtfRU5BQkxFKCk7DQotDQotICAvKiBDb25maWd1cmUgdGhlIExTQ08gcGluIGluIGFuYWxvZyBtb2RlICovDQotICBHUElPX0luaXRTdHJ1Y3QuUGluID0gTFNDT19QSU47DQotICBHUElPX0luaXRTdHJ1Y3QuTW9kZSA9IEdQSU9fTU9ERV9BTkFMT0c7DQotICBHUElPX0luaXRTdHJ1Y3QuU3BlZWQgPSBHUElPX1NQRUVEX0ZSRVFfSElHSDsNCi0gIEdQSU9fSW5pdFN0cnVjdC5QdWxsID0gR1BJT19OT1BVTEw7DQotICBIQUxfR1BJT19Jbml0KExTQ09fR1BJT19QT1JULCAmR1BJT19Jbml0U3RydWN0KTsNCi0NCi0gIC8qIFVwZGF0ZSBMU0NPU0VMIGNsb2NrIHNvdXJjZSBpbiBCYWNrdXAgRG9tYWluIGNvbnRyb2wgcmVnaXN0ZXIgKi8NCi0gIGlmIChfX0hBTF9SQ0NfUFdSX0lTX0NMS19ESVNBQkxFRCgpKSB7DQotICAgIF9fSEFMX1JDQ19QV1JfQ0xLX0VOQUJMRSgpOw0KLSAgICBwd3JjbGtjaGFuZ2VkID0gU0VUOw0KLSAgfQ0KLSAgaWYgKEhBTF9JU19CSVRfQ0xSKFBXUi0+Q1IxLCBQV1JfQ1IxX0RCUCkpIHsNCi0gICAgSEFMX1BXUl9FbmFibGVCa1VwQWNjZXNzKCk7DQotICAgIGJhY2t1cGNoYW5nZWQgPSBTRVQ7DQotICB9DQotDQotICBNT0RJRllfUkVHKFJDQy0+QkRDUiwgUkNDX0JEQ1JfTFNDT1NFTCB8IFJDQ19CRENSX0xTQ09FTiwNCi0gICAgICAgICAgICAgTFNDT1NvdXJjZSB8IFJDQ19CRENSX0xTQ09FTik7DQotDQotICBpZiAoYmFja3VwY2hhbmdlZCA9PSBTRVQpIHsNCi0gICAgSEFMX1BXUl9EaXNhYmxlQmtVcEFjY2VzcygpOw0KLSAgfQ0KLSAgaWYgKHB3cmNsa2NoYW5nZWQgPT0gU0VUKSB7DQotICAgIF9fSEFMX1JDQ19QV1JfQ0xLX0RJU0FCTEUoKTsNCi0gIH0NCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIHRoZSBMb3cgU3BlZWQgY2xvY2sgb3V0cHV0Lg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXZvaWQgSEFMX1JDQ0V4X0Rpc2FibGVMU0NPKHZvaWQpIHsNCi0gIEZsYWdTdGF0dXMgcHdyY2xrY2hhbmdlZCA9IFJFU0VUOw0KLSAgRmxhZ1N0YXR1cyBiYWNrdXBjaGFuZ2VkID0gUkVTRVQ7DQotDQotICAvKiBVcGRhdGUgTFNDT0VOIGJpdCBpbiBCYWNrdXAgRG9tYWluIGNvbnRyb2wgcmVnaXN0ZXIgKi8NCi0gIGlmIChfX0hBTF9SQ0NfUFdSX0lTX0NMS19ESVNBQkxFRCgpKSB7DQotICAgIF9fSEFMX1JDQ19QV1JfQ0xLX0VOQUJMRSgpOw0KLSAgICBwd3JjbGtjaGFuZ2VkID0gU0VUOw0KLSAgfQ0KLSAgaWYgKEhBTF9JU19CSVRfQ0xSKFBXUi0+Q1IxLCBQV1JfQ1IxX0RCUCkpIHsNCi0gICAgLyogRW5hYmxlIGFjY2VzcyB0byB0aGUgYmFja3VwIGRvbWFpbiAqLw0KLSAgICBIQUxfUFdSX0VuYWJsZUJrVXBBY2Nlc3MoKTsNCi0gICAgYmFja3VwY2hhbmdlZCA9IFNFVDsNCi0gIH0NCi0NCi0gIENMRUFSX0JJVChSQ0MtPkJEQ1IsIFJDQ19CRENSX0xTQ09FTik7DQotDQotICAvKiBSZXN0b3JlIHByZXZpb3VzIGNvbmZpZ3VyYXRpb24gKi8NCi0gIGlmIChiYWNrdXBjaGFuZ2VkID09IFNFVCkgew0KLSAgICAvKiBEaXNhYmxlIGFjY2VzcyB0byB0aGUgYmFja3VwIGRvbWFpbiAqLw0KLSAgICBIQUxfUFdSX0Rpc2FibGVCa1VwQWNjZXNzKCk7DQotICB9DQotICBpZiAocHdyY2xrY2hhbmdlZCA9PSBTRVQpIHsNCi0gICAgX19IQUxfUkNDX1BXUl9DTEtfRElTQUJMRSgpOw0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLSNpZiBkZWZpbmVkKENSUykNCi0NCi0vKiogQGRlZmdyb3VwIFJDQ0V4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgRXh0ZW5kZWQgQ2xvY2sgUmVjb3ZlcnkgU3lzdGVtDQotQ29udHJvbCBmdW5jdGlvbnMNCi0gKiAgQGJyaWVmICBFeHRlbmRlZCBDbG9jayBSZWNvdmVyeSBTeXN0ZW0gQ29udHJvbCBmdW5jdGlvbnMNCi0gKg0KLUB2ZXJiYXRpbQ0KLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgICAgICAgICAgICAgICMjIyMjIEV4dGVuZGVkIENsb2NrIFJlY292ZXJ5IFN5c3RlbSBDb250cm9sIGZ1bmN0aW9ucyAgIyMjIyMNCi0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICBbLi5dDQotICAgICAgRm9yIGRldmljZXMgd2l0aCBDbG9jayBSZWNvdmVyeSBTeXN0ZW0gZmVhdHVyZSAoQ1JTKSwgUkNDIEV4dGVuc2lvbiBIQUwNCi1kcml2ZXIgY2FuIGJlIHVzZWQgYXMgZm9sbG93czoNCi0NCi0gICAgICAoIykgSW4gU3lzdGVtIGNsb2NrIGNvbmZpZywgSFNJNDggbmVlZHMgdG8gYmUgZW5hYmxlZA0KLQ0KLSAgICAgICgjKSBFbmFibGUgQ1JTIGNsb2NrIGluIElQIE1TUCBpbml0IHdoaWNoIHdpbGwgdXNlIENSUyBmdW5jdGlvbnMNCi0NCi0gICAgICAoIykgQ2FsbCBDUlMgZnVuY3Rpb25zIGFzIGZvbGxvd3M6DQotICAgICAgICAgICgjIykgUHJlcGFyZSBzeW5jaHJvbml6YXRpb24gY29uZmlndXJhdGlvbiBuZWNlc3NhcnkgZm9yIEhTSTQ4DQotY2FsaWJyYXRpb24NCi0gICAgICAgICAgICAgICgrKyspIERlZmF1bHQgdmFsdWVzIGNhbiBiZSBzZXQgZm9yIGZyZXF1ZW5jeSBFcnJvciBNZWFzdXJlbWVudA0KLShyZWxvYWQgYW5kIGVycm9yIGxpbWl0KSBhbmQgYWxzbyBIU0k0OCBvc2NpbGxhdG9yIHNtb290aCB0cmltbWluZy4NCi0gICAgICAgICAgICAgICgrKyspIE1hY3JvIF9fSEFMX1JDQ19DUlNfUkVMT0FEVkFMVUVfQ0FMQ1VMQVRFIGNhbiBiZSBhbHNvIHVzZWQNCi10byBjYWxjdWxhdGUgZGlyZWN0bHkgcmVsb2FkIHZhbHVlIHdpdGggdGFyZ2V0IGFuZCBzeWNocm9uaXphdGlvbiBmcmVxdWVuY2llcw0KLXZhbHVlcw0KLSAgICAgICAgICAoIyMpIENhbGwgZnVuY3Rpb24gSEFMX1JDQ0V4X0NSU0NvbmZpZyB3aGljaA0KLSAgICAgICAgICAgICAgKCsrKykgUmVzZXRzIENSUyByZWdpc3RlcnMgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuDQotICAgICAgICAgICAgICAoKysrKSBDb25maWd1cmVzIENSUyByZWdpc3RlcnMgd2l0aCBzeW5jaHJvbml6YXRpb24gY29uZmlndXJhdGlvbg0KLSAgICAgICAgICAgICAgKCsrKykgRW5hYmxlcyBhdXRvbWF0aWMgY2FsaWJyYXRpb24gYW5kIGZyZXF1ZW5jeSBlcnJvciBjb3VudGVyDQotZmVhdHVyZSBOb3RlOiBXaGVuIHVzaW5nIFVTQiBMUE0gKExpbmsgUG93ZXIgTWFuYWdlbWVudCkgYW5kIHRoZSBkZXZpY2UgaXMgaW4NCi1TbGVlcCBtb2RlLCB0aGUgcGVyaW9kaWMgVVNCIFNPRiB3aWxsIG5vdCBiZSBnZW5lcmF0ZWQgYnkgdGhlIGhvc3QuIE5vIFNZTkMNCi1zaWduYWwgd2lsbCB0aGVyZWZvcmUgYmUgcHJvdmlkZWQgdG8gdGhlIENSUyB0byBjYWxpYnJhdGUgdGhlIEhTSTQ4IG9uIHRoZSBydW4uDQotVG8gZ3VhcmFudGVlIHRoZSByZXF1aXJlZCBjbG9jayBwcmVjaXNpb24gYWZ0ZXIgd2FraW5nIHVwIGZyb20gU2xlZXAgbW9kZSwgdGhlDQotTFNFIG9yIHJlZmVyZW5jZSBjbG9jayBvbiB0aGUgR1BJT3Mgc2hvdWxkIGJlIHVzZWQgYXMgU1lOQyBzaWduYWwuDQotDQotICAgICAgICAgICgjIykgQSBwb2xsaW5nIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIHRvIHdhaXQgZm9yIGNvbXBsZXRlDQotc3luY2hyb25pemF0aW9uDQotICAgICAgICAgICAgICAoKysrKSBDYWxsIGZ1bmN0aW9uIEhBTF9SQ0NFeF9DUlNXYWl0U3luY2hyb25pemF0aW9uKCkNCi0gICAgICAgICAgICAgICgrKyspIEFjY29yZGluZyB0byBDUlMgc3RhdHVzLCB1c2VyIGNhbiBkZWNpZGUgdG8gYWRqdXN0IGFnYWluIHRoZQ0KLWNhbGlicmF0aW9uIG9yIGNvbnRpbnVlIGFwcGxpY2F0aW9uIGlmIHN5bmNocm9uaXphdGlvbiBpcyBPSw0KLQ0KLSAgICAgICgjKSBVc2VyIGNhbiByZXRyaWV2ZSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHN5bmNocm9uaXphdGlvbiBpbiBjYWxsaW5nDQotZnVuY3Rpb24gSEFMX1JDQ0V4X0NSU0dldFN5bmNocm9uaXphdGlvbkluZm8oKQ0KLQ0KLSAgICAgICgjKSBSZWdhcmRpbmcgc3luY2hyb25pemF0aW9uIHN0YXR1cyBhbmQgc3luY2hyb25pemF0aW9uIGluZm9ybWF0aW9uLCB1c2VyDQotY2FuIHRyeSBhIG5ldyBjYWxpYnJhdGlvbiBpbiBjaGFuZ2luZyBzeW5jaHJvbml6YXRpb24gY29uZmlndXJhdGlvbiBhbmQgY2FsbA0KLWFnYWluIEhBTF9SQ0NFeF9DUlNDb25maWcuIE5vdGU6IFdoZW4gdGhlIFNZTkMgZXZlbnQgaXMgZGV0ZWN0ZWQgZHVyaW5nIHRoZQ0KLWRvd25jb3VudGluZyBwaGFzZSAoYmVmb3JlIHJlYWNoaW5nIHRoZSB6ZXJvIHZhbHVlKSwgaXQgbWVhbnMgdGhhdCB0aGUgYWN0dWFsDQotZnJlcXVlbmN5IGlzIGxvd2VyIHRoYW4gdGhlIHRhcmdldCAoYW5kIHNvLCB0aGF0IHRoZSBUUklNIHZhbHVlIHNob3VsZCBiZQ0KLSAgICAgICAgICAgaW5jcmVtZW50ZWQpLCB3aGlsZSB3aGVuIGl0IGlzIGRldGVjdGVkIGR1cmluZyB0aGUgdXBjb3VudGluZyBwaGFzZQ0KLWl0IG1lYW5zIHRoYXQgdGhlIGFjdHVhbCBmcmVxdWVuY3kgaXMgaGlnaGVyIChhbmQgdGhhdCB0aGUgVFJJTSB2YWx1ZSBzaG91bGQgYmUNCi1kZWNyZW1lbnRlZCkuDQotDQotICAgICAgKCMpIEluIGludGVycnVwdCBtb2RlLCB1c2VyIGNhbiByZXNvcnQgdG8gdGhlIGF2YWlsYWJsZSBtYWNyb3MNCi0oX19IQUxfUkNDX0NSU19YWFhfSVQpLiBJbnRlcnJ1cHRzIHdpbGwgZ28gdGhyb3VnaCBDUlMgSGFuZGxlcg0KLShDUlNfSVJRbi9DUlNfSVJRSGFuZGxlcikNCi0gICAgICAgICAgICAgICgrKykgQ2FsbCBmdW5jdGlvbiBIQUxfUkNDRXhfQ1JTQ29uZmlnKCkNCi0gICAgICAgICAgICAgICgrKykgRW5hYmxlIENSU19JUlFuICh0aGFua3MgdG8gTlZJQyBmdW5jdGlvbnMpDQotICAgICAgICAgICAgICAoKyspIEVuYWJsZSBDUlMgaW50ZXJydXB0IChfX0hBTF9SQ0NfQ1JTX0VOQUJMRV9JVCkNCi0gICAgICAgICAgICAgICgrKykgSW1wbGVtZW50IENSUyBzdGF0dXMgbWFuYWdlbWVudCBpbiB0aGUgZm9sbG93aW5nIHVzZXINCi1jYWxsYmFja3MgY2FsbGVkIGZyb20gSEFMX1JDQ0V4X0NSU19JUlFIYW5kbGVyKCk6DQotICAgICAgICAgICAgICAgICAgICgrKyspIEhBTF9SQ0NFeF9DUlNfU3luY09rQ2FsbGJhY2soKQ0KLSAgICAgICAgICAgICAgICAgICAoKysrKSBIQUxfUkNDRXhfQ1JTX1N5bmNXYXJuQ2FsbGJhY2soKQ0KLSAgICAgICAgICAgICAgICAgICAoKysrKSBIQUxfUkNDRXhfQ1JTX0V4cGVjdGVkU3luY0NhbGxiYWNrKCkNCi0gICAgICAgICAgICAgICAgICAgKCsrKykgSEFMX1JDQ0V4X0NSU19FcnJvckNhbGxiYWNrKCkNCi0NCi0gICAgICAoIykgVG8gZm9yY2UgYSBTWU5DIEVWRU5ULCB1c2VyIGNhbiB1c2UgdGhlIGZ1bmN0aW9uDQotSEFMX1JDQ0V4X0NSU1NvZnR3YXJlU3luY2hyb25pemF0aW9uR2VuZXJhdGUoKS4gVGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkDQotYmVmb3JlIGNhbGxpbmcgSEFMX1JDQ0V4X0NSU0NvbmZpZyAoZm9yIGluc3RhbmNlIGluIFN5c3RpY2sgaGFuZGxlcikNCi0NCi1AZW5kdmVyYmF0aW0NCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU3RhcnQgYXV0b21hdGljIHN5bmNocm9uaXphdGlvbiBmb3IgcG9sbGluZyBtb2RlDQotICogQHBhcmFtICBwSW5pdCBQb2ludGVyIG9uIFJDQ19DUlNJbml0VHlwZURlZiBzdHJ1Y3R1cmUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi12b2lkIEhBTF9SQ0NFeF9DUlNDb25maWcoUkNDX0NSU0luaXRUeXBlRGVmICpwSW5pdCkgew0KLSAgdWludDMyX3QgdmFsdWU7DQotDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1JDQ19DUlNfU1lOQ19ESVYocEluaXQtPlByZXNjYWxlcikpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1JDQ19DUlNfU1lOQ19TT1VSQ0UocEluaXQtPlNvdXJjZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1JDQ19DUlNfU1lOQ19QT0xBUklUWShwSW5pdC0+UG9sYXJpdHkpKTsNCi0gIGFzc2VydF9wYXJhbShJU19SQ0NfQ1JTX1JFTE9BRFZBTFVFKHBJbml0LT5SZWxvYWRWYWx1ZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1JDQ19DUlNfRVJST1JMSU1JVChwSW5pdC0+RXJyb3JMaW1pdFZhbHVlKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfUkNDX0NSU19IU0k0OENBTElCUkFUSU9OKHBJbml0LT5IU0k0OENhbGlicmF0aW9uVmFsdWUpKTsNCi0NCi0gIC8qIENPTkZJR1VSQVRJT04gKi8NCi0NCi0gIC8qIEJlZm9yZSBjb25maWd1cmF0aW9uLCByZXNldCBDUlMgcmVnaXN0ZXJzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzKi8NCi0gIF9fSEFMX1JDQ19DUlNfRk9SQ0VfUkVTRVQoKTsNCi0gIF9fSEFMX1JDQ19DUlNfUkVMRUFTRV9SRVNFVCgpOw0KLQ0KLSAgLyogU2V0IHRoZSBTWU5DRElWWzI6MF0gYml0cyBhY2NvcmRpbmcgdG8gUHJlc2NhbGVyIHZhbHVlICovDQotICAvKiBTZXQgdGhlIFNZTkNTUkNbMTowXSBiaXRzIGFjY29yZGluZyB0byBTb3VyY2UgdmFsdWUgKi8NCi0gIC8qIFNldCB0aGUgU1lOQ1NQT0wgYml0IGFjY29yZGluZyB0byBQb2xhcml0eSB2YWx1ZSAqLw0KLSAgdmFsdWUgPSAocEluaXQtPlByZXNjYWxlciB8IHBJbml0LT5Tb3VyY2UgfCBwSW5pdC0+UG9sYXJpdHkpOw0KLSAgLyogU2V0IHRoZSBSRUxPQURbMTU6MF0gYml0cyBhY2NvcmRpbmcgdG8gUmVsb2FkVmFsdWUgdmFsdWUgKi8NCi0gIHZhbHVlIHw9IHBJbml0LT5SZWxvYWRWYWx1ZTsNCi0gIC8qIFNldCB0aGUgRkVMSU1bNzowXSBiaXRzIGFjY29yZGluZyB0byBFcnJvckxpbWl0VmFsdWUgdmFsdWUgKi8NCi0gIHZhbHVlIHw9IChwSW5pdC0+RXJyb3JMaW1pdFZhbHVlIDw8IENSU19DRkdSX0ZFTElNX1Bvcyk7DQotICBXUklURV9SRUcoQ1JTLT5DRkdSLCB2YWx1ZSk7DQotDQotICAvKiBBZGp1c3QgSFNJNDggb3NjaWxsYXRvciBzbW9vdGggdHJpbW1pbmcgKi8NCi0gIC8qIFNldCB0aGUgVFJJTVs2OjBdIGJpdHMgYWNjb3JkaW5nIHRvIFJDQ19DUlNfSFNJNDhDYWxpYnJhdGlvblZhbHVlIHZhbHVlICovDQotICBNT0RJRllfUkVHKENSUy0+Q1IsIENSU19DUl9UUklNLA0KLSAgICAgICAgICAgICAocEluaXQtPkhTSTQ4Q2FsaWJyYXRpb25WYWx1ZSA8PCBDUlNfQ1JfVFJJTV9Qb3MpKTsNCi0NCi0gIC8qIFNUQVJUIEFVVE9NQVRJQyBTWU5DSFJPTklaQVRJT04qLw0KLQ0KLSAgLyogRW5hYmxlIEF1dG9tYXRpYyB0cmltbWluZyAmIEZyZXF1ZW5jeSBlcnJvciBjb3VudGVyICovDQotICBTRVRfQklUKENSUy0+Q1IsIENSU19DUl9BVVRPVFJJTUVOIHwgQ1JTX0NSX0NFTik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgR2VuZXJhdGUgdGhlIHNvZnR3YXJlIHN5bmNocm9uaXphdGlvbiBldmVudA0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXZvaWQgSEFMX1JDQ0V4X0NSU1NvZnR3YXJlU3luY2hyb25pemF0aW9uR2VuZXJhdGUodm9pZCkgew0KLSAgU0VUX0JJVChDUlMtPkNSLCBDUlNfQ1JfU1dTWU5DKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBSZXR1cm4gc3luY2hyb25pemF0aW9uIGluZm8NCi0gKiBAcGFyYW0gIHBTeW5jaHJvSW5mbyBQb2ludGVyIG9uIFJDQ19DUlNTeW5jaHJvSW5mb1R5cGVEZWYgc3RydWN0dXJlDQotICogQHJldHZhbCBOb25lDQotICovDQotdm9pZCBIQUxfUkNDRXhfQ1JTR2V0U3luY2hyb25pemF0aW9uSW5mbygNCi0gICAgUkNDX0NSU1N5bmNocm9JbmZvVHlwZURlZiAqcFN5bmNocm9JbmZvKSB7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVyICovDQotICBhc3NlcnRfcGFyYW0ocFN5bmNocm9JbmZvICE9ICh2b2lkICopTlVMTCk7DQotDQotICAvKiBHZXQgdGhlIHJlbG9hZCB2YWx1ZSAqLw0KLSAgcFN5bmNocm9JbmZvLT5SZWxvYWRWYWx1ZSA9IChSRUFEX0JJVChDUlMtPkNGR1IsIENSU19DRkdSX1JFTE9BRCkpOw0KLQ0KLSAgLyogR2V0IEhTSTQ4IG9zY2lsbGF0b3Igc21vb3RoIHRyaW1taW5nICovDQotICBwU3luY2hyb0luZm8tPkhTSTQ4Q2FsaWJyYXRpb25WYWx1ZSA9DQotICAgICAgKFJFQURfQklUKENSUy0+Q1IsIENSU19DUl9UUklNKSA+PiBDUlNfQ1JfVFJJTV9Qb3MpOw0KLQ0KLSAgLyogR2V0IEZyZXF1ZW5jeSBlcnJvciBjYXB0dXJlICovDQotICBwU3luY2hyb0luZm8tPkZyZXFFcnJvckNhcHR1cmUgPQ0KLSAgICAgIChSRUFEX0JJVChDUlMtPklTUiwgQ1JTX0lTUl9GRUNBUCkgPj4gQ1JTX0lTUl9GRUNBUF9Qb3MpOw0KLQ0KLSAgLyogR2V0IEZyZXF1ZW5jeSBlcnJvciBkaXJlY3Rpb24gKi8NCi0gIHBTeW5jaHJvSW5mby0+RnJlcUVycm9yRGlyZWN0aW9uID0gKFJFQURfQklUKENSUy0+SVNSLCBDUlNfSVNSX0ZFRElSKSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBXYWl0IGZvciBDUlMgU3luY2hyb25pemF0aW9uIHN0YXR1cy4NCi0gKiBAcGFyYW0gVGltZW91dCAgRHVyYXRpb24gb2YgdGhlIHRpbWVvdXQNCi0gKiBAbm90ZSAgVGltZW91dCBpcyBiYXNlZCBvbiB0aGUgbWF4aW11bSB0aW1lIHRvIHJlY2VpdmUgYSBTWU5DIGV2ZW50IGJhc2VkIG9uDQotICogc3luY2hyb25pemF0aW9uIGZyZXF1ZW5jeS4NCi0gKiBAbm90ZSAgICBJZiBUaW1lb3V0IHNldCB0byBIQUxfTUFYX0RFTEFZLCBIQUxfVElNRU9VVCB3aWxsIGJlIG5ldmVyIHJldHVybmVkLg0KLSAqIEByZXR2YWwgQ29tYmluYXRpb24gb2YgU3luY2hyb25pemF0aW9uIHN0YXR1cw0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfVElNRU9VVA0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfU1lOQ09LDQotICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19TWU5DV0FSTg0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfU1lOQ0VSUg0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfU1lOQ01JU1MNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQ1JTX1RSSU1PVkYNCi0gKi8NCi11aW50MzJfdCBIQUxfUkNDRXhfQ1JTV2FpdFN5bmNocm9uaXphdGlvbih1aW50MzJfdCBUaW1lb3V0KSB7DQotICB1aW50MzJfdCBjcnNzdGF0dXMgPSBSQ0NfQ1JTX05PTkU7DQotICB1aW50MzJfdCB0aWNrc3RhcnQ7DQotDQotICAvKiBHZXQgdGltZW91dCAqLw0KLSAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsNCi0NCi0gIC8qIFdhaXQgZm9yIENSUyBmbGFnIG9yIHRpbWVvdXQgZGV0ZWN0aW9uICovDQotICBkbyB7DQotICAgIGlmIChUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpIHsNCi0gICAgICBpZiAoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFRpbWVvdXQpIHx8IChUaW1lb3V0ID09IDBVKSkgew0KLSAgICAgICAgY3Jzc3RhdHVzID0gUkNDX0NSU19USU1FT1VUOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgICAvKiBDaGVjayBDUlMgU1lOQ09LIGZsYWcgICovDQotICAgIGlmIChfX0hBTF9SQ0NfQ1JTX0dFVF9GTEFHKFJDQ19DUlNfRkxBR19TWU5DT0spKSB7DQotICAgICAgLyogQ1JTIFNZTkMgZXZlbnQgT0sgKi8NCi0gICAgICBjcnNzdGF0dXMgfD0gUkNDX0NSU19TWU5DT0s7DQotDQotICAgICAgLyogQ2xlYXIgQ1JTIFNZTkMgZXZlbnQgT0sgYml0ICovDQotICAgICAgX19IQUxfUkNDX0NSU19DTEVBUl9GTEFHKFJDQ19DUlNfRkxBR19TWU5DT0spOw0KLSAgICB9DQotDQotICAgIC8qIENoZWNrIENSUyBTWU5DV0FSTiBmbGFnICAqLw0KLSAgICBpZiAoX19IQUxfUkNDX0NSU19HRVRfRkxBRyhSQ0NfQ1JTX0ZMQUdfU1lOQ1dBUk4pKSB7DQotICAgICAgLyogQ1JTIFNZTkMgd2FybmluZyAqLw0KLSAgICAgIGNyc3N0YXR1cyB8PSBSQ0NfQ1JTX1NZTkNXQVJOOw0KLQ0KLSAgICAgIC8qIENsZWFyIENSUyBTWU5DV0FSTiBiaXQgKi8NCi0gICAgICBfX0hBTF9SQ0NfQ1JTX0NMRUFSX0ZMQUcoUkNDX0NSU19GTEFHX1NZTkNXQVJOKTsNCi0gICAgfQ0KLQ0KLSAgICAvKiBDaGVjayBDUlMgVFJJTSBvdmVyZmxvdyBmbGFnICAqLw0KLSAgICBpZiAoX19IQUxfUkNDX0NSU19HRVRfRkxBRyhSQ0NfQ1JTX0ZMQUdfVFJJTU9WRikpIHsNCi0gICAgICAvKiBDUlMgU1lOQyBFcnJvciAqLw0KLSAgICAgIGNyc3N0YXR1cyB8PSBSQ0NfQ1JTX1RSSU1PVkY7DQotDQotICAgICAgLyogQ2xlYXIgQ1JTIEVycm9yIGJpdCAqLw0KLSAgICAgIF9fSEFMX1JDQ19DUlNfQ0xFQVJfRkxBRyhSQ0NfQ1JTX0ZMQUdfVFJJTU9WRik7DQotICAgIH0NCi0NCi0gICAgLyogQ2hlY2sgQ1JTIEVycm9yIGZsYWcgICovDQotICAgIGlmIChfX0hBTF9SQ0NfQ1JTX0dFVF9GTEFHKFJDQ19DUlNfRkxBR19TWU5DRVJSKSkgew0KLSAgICAgIC8qIENSUyBTWU5DIEVycm9yICovDQotICAgICAgY3Jzc3RhdHVzIHw9IFJDQ19DUlNfU1lOQ0VSUjsNCi0NCi0gICAgICAvKiBDbGVhciBDUlMgRXJyb3IgYml0ICovDQotICAgICAgX19IQUxfUkNDX0NSU19DTEVBUl9GTEFHKFJDQ19DUlNfRkxBR19TWU5DRVJSKTsNCi0gICAgfQ0KLQ0KLSAgICAvKiBDaGVjayBDUlMgU1lOQyBNaXNzZWQgZmxhZyAgKi8NCi0gICAgaWYgKF9fSEFMX1JDQ19DUlNfR0VUX0ZMQUcoUkNDX0NSU19GTEFHX1NZTkNNSVNTKSkgew0KLSAgICAgIC8qIENSUyBTWU5DIE1pc3NlZCAqLw0KLSAgICAgIGNyc3N0YXR1cyB8PSBSQ0NfQ1JTX1NZTkNNSVNTOw0KLQ0KLSAgICAgIC8qIENsZWFyIENSUyBTWU5DIE1pc3NlZCBiaXQgKi8NCi0gICAgICBfX0hBTF9SQ0NfQ1JTX0NMRUFSX0ZMQUcoUkNDX0NSU19GTEFHX1NZTkNNSVNTKTsNCi0gICAgfQ0KLQ0KLSAgICAvKiBDaGVjayBDUlMgRXhwZWN0ZWQgU1lOQyBmbGFnICAqLw0KLSAgICBpZiAoX19IQUxfUkNDX0NSU19HRVRfRkxBRyhSQ0NfQ1JTX0ZMQUdfRVNZTkMpKSB7DQotICAgICAgLyogZnJlcXVlbmN5IGVycm9yIGNvdW50ZXIgcmVhY2hlZCBhIHplcm8gdmFsdWUgKi8NCi0gICAgICBfX0hBTF9SQ0NfQ1JTX0NMRUFSX0ZMQUcoUkNDX0NSU19GTEFHX0VTWU5DKTsNCi0gICAgfQ0KLSAgfSB3aGlsZSAoUkNDX0NSU19OT05FID09IGNyc3N0YXR1cyk7DQotDQotICByZXR1cm4gY3Jzc3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgSGFuZGxlIHRoZSBDbG9jayBSZWNvdmVyeSBTeXN0ZW0gaW50ZXJydXB0IHJlcXVlc3QuDQotICogQHJldHZhbCBOb25lDQotICovDQotdm9pZCBIQUxfUkNDRXhfQ1JTX0lSUUhhbmRsZXIodm9pZCkgew0KLSAgdWludDMyX3QgY3JzZXJyb3IgPSBSQ0NfQ1JTX05PTkU7DQotICAvKiBHZXQgY3VycmVudCBJVCBmbGFncyBhbmQgSVQgc291cmNlcyB2YWx1ZXMgKi8NCi0gIHVpbnQzMl90IGl0ZmxhZ3MgPSBSRUFEX1JFRyhDUlMtPklTUik7DQotICB1aW50MzJfdCBpdHNvdXJjZXMgPSBSRUFEX1JFRyhDUlMtPkNSKTsNCi0NCi0gIC8qIENoZWNrIENSUyBTWU5DT0sgZmxhZyAgKi8NCi0gIGlmICgoKGl0ZmxhZ3MgJiBSQ0NfQ1JTX0ZMQUdfU1lOQ09LKSAhPSAwVSkgJiYNCi0gICAgICAoKGl0c291cmNlcyAmIFJDQ19DUlNfSVRfU1lOQ09LKSAhPSAwVSkpIHsNCi0gICAgLyogQ2xlYXIgQ1JTIFNZTkMgZXZlbnQgT0sgZmxhZyAqLw0KLSAgICBXUklURV9SRUcoQ1JTLT5JQ1IsIENSU19JQ1JfU1lOQ09LQyk7DQotDQotICAgIC8qIHVzZXIgY2FsbGJhY2sgKi8NCi0gICAgSEFMX1JDQ0V4X0NSU19TeW5jT2tDYWxsYmFjaygpOw0KLSAgfQ0KLSAgLyogQ2hlY2sgQ1JTIFNZTkNXQVJOIGZsYWcgICovDQotICBlbHNlIGlmICgoKGl0ZmxhZ3MgJiBSQ0NfQ1JTX0ZMQUdfU1lOQ1dBUk4pICE9IDBVKSAmJg0KLSAgICAgICAgICAgKChpdHNvdXJjZXMgJiBSQ0NfQ1JTX0lUX1NZTkNXQVJOKSAhPSAwVSkpIHsNCi0gICAgLyogQ2xlYXIgQ1JTIFNZTkNXQVJOIGZsYWcgKi8NCi0gICAgV1JJVEVfUkVHKENSUy0+SUNSLCBDUlNfSUNSX1NZTkNXQVJOQyk7DQotDQotICAgIC8qIHVzZXIgY2FsbGJhY2sgKi8NCi0gICAgSEFMX1JDQ0V4X0NSU19TeW5jV2FybkNhbGxiYWNrKCk7DQotICB9DQotICAvKiBDaGVjayBDUlMgRXhwZWN0ZWQgU1lOQyBmbGFnICAqLw0KLSAgZWxzZSBpZiAoKChpdGZsYWdzICYgUkNDX0NSU19GTEFHX0VTWU5DKSAhPSAwVSkgJiYNCi0gICAgICAgICAgICgoaXRzb3VyY2VzICYgUkNDX0NSU19JVF9FU1lOQykgIT0gMFUpKSB7DQotICAgIC8qIGZyZXF1ZW5jeSBlcnJvciBjb3VudGVyIHJlYWNoZWQgYSB6ZXJvIHZhbHVlICovDQotICAgIFdSSVRFX1JFRyhDUlMtPklDUiwgQ1JTX0lDUl9FU1lOQ0MpOw0KLQ0KLSAgICAvKiB1c2VyIGNhbGxiYWNrICovDQotICAgIEhBTF9SQ0NFeF9DUlNfRXhwZWN0ZWRTeW5jQ2FsbGJhY2soKTsNCi0gIH0NCi0gIC8qIENoZWNrIENSUyBFcnJvciBmbGFncyAgKi8NCi0gIGVsc2Ugew0KLSAgICBpZiAoKChpdGZsYWdzICYgUkNDX0NSU19GTEFHX0VSUikgIT0gMFUpICYmDQotICAgICAgICAoKGl0c291cmNlcyAmIFJDQ19DUlNfSVRfRVJSKSAhPSAwVSkpIHsNCi0gICAgICBpZiAoKGl0ZmxhZ3MgJiBSQ0NfQ1JTX0ZMQUdfU1lOQ0VSUikgIT0gMFUpIHsNCi0gICAgICAgIGNyc2Vycm9yIHw9IFJDQ19DUlNfU1lOQ0VSUjsNCi0gICAgICB9DQotICAgICAgaWYgKChpdGZsYWdzICYgUkNDX0NSU19GTEFHX1NZTkNNSVNTKSAhPSAwVSkgew0KLSAgICAgICAgY3JzZXJyb3IgfD0gUkNDX0NSU19TWU5DTUlTUzsNCi0gICAgICB9DQotICAgICAgaWYgKChpdGZsYWdzICYgUkNDX0NSU19GTEFHX1RSSU1PVkYpICE9IDBVKSB7DQotICAgICAgICBjcnNlcnJvciB8PSBSQ0NfQ1JTX1RSSU1PVkY7DQotICAgICAgfQ0KLQ0KLSAgICAgIC8qIENsZWFyIENSUyBFcnJvciBmbGFncyAqLw0KLSAgICAgIFdSSVRFX1JFRyhDUlMtPklDUiwgQ1JTX0lDUl9FUlJDKTsNCi0NCi0gICAgICAvKiB1c2VyIGVycm9yIGNhbGxiYWNrICovDQotICAgICAgSEFMX1JDQ0V4X0NSU19FcnJvckNhbGxiYWNrKGNyc2Vycm9yKTsNCi0gICAgfQ0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJDQ0V4IENsb2NrIFJlY292ZXJ5IFN5c3RlbSBTWU5DT0sgaW50ZXJydXB0IGNhbGxiYWNrLg0KLSAqIEByZXR2YWwgbm9uZQ0KLSAqLw0KLV9fd2VhayB2b2lkIEhBTF9SQ0NFeF9DUlNfU3luY09rQ2FsbGJhY2sodm9pZCkgew0KLSAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLA0KLSAgICAgICAgICAgIHRoZSBAcmVmIEhBTF9SQ0NFeF9DUlNfU3luY09rQ2FsbGJhY2sgc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZQ0KLSAgICAgdXNlciBmaWxlDQotICAgKi8NCi19DQotDQotLyoqDQotICogQGJyaWVmICBSQ0NFeCBDbG9jayBSZWNvdmVyeSBTeXN0ZW0gU1lOQ1dBUk4gaW50ZXJydXB0IGNhbGxiYWNrLg0KLSAqIEByZXR2YWwgbm9uZQ0KLSAqLw0KLV9fd2VhayB2b2lkIEhBTF9SQ0NFeF9DUlNfU3luY1dhcm5DYWxsYmFjayh2b2lkKSB7DQotICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsDQotICAgICAgICAgICAgdGhlIEByZWYgSEFMX1JDQ0V4X0NSU19TeW5jV2FybkNhbGxiYWNrIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUNCi0gICAgIHVzZXIgZmlsZQ0KLSAgICovDQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUkNDRXggQ2xvY2sgUmVjb3ZlcnkgU3lzdGVtIEV4cGVjdGVkIFNZTkMgaW50ZXJydXB0IGNhbGxiYWNrLg0KLSAqIEByZXR2YWwgbm9uZQ0KLSAqLw0KLV9fd2VhayB2b2lkIEhBTF9SQ0NFeF9DUlNfRXhwZWN0ZWRTeW5jQ2FsbGJhY2sodm9pZCkgew0KLSAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLA0KLSAgICAgICAgICAgIHRoZSBAcmVmIEhBTF9SQ0NFeF9DUlNfRXhwZWN0ZWRTeW5jQ2FsbGJhY2sgc2hvdWxkIGJlIGltcGxlbWVudGVkIGluDQotICAgICB0aGUgdXNlciBmaWxlDQotICAgKi8NCi19DQotDQotLyoqDQotICogQGJyaWVmICBSQ0NFeCBDbG9jayBSZWNvdmVyeSBTeXN0ZW0gRXJyb3IgaW50ZXJydXB0IGNhbGxiYWNrLg0KLSAqIEBwYXJhbSAgRXJyb3IgQ29tYmluYXRpb24gb2YgRXJyb3Igc3RhdHVzLg0KLSAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQ1JTX1NZTkNFUlINCi0gKiAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfU1lOQ01JU1MNCi0gKiAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfVFJJTU9WRg0KLSAqIEByZXR2YWwgbm9uZQ0KLSAqLw0KLV9fd2VhayB2b2lkIEhBTF9SQ0NFeF9DUlNfRXJyb3JDYWxsYmFjayh1aW50MzJfdCBFcnJvcikgew0KLSAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLw0KLSAgVU5VU0VEKEVycm9yKTsNCi0NCi0gIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwNCi0gICAgICAgICAgICB0aGUgQHJlZiBIQUxfUkNDRXhfQ1JTX0Vycm9yQ2FsbGJhY2sgc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZQ0KLSAgICAgdXNlciBmaWxlDQotICAgKi8NCi19DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0jZW5kaWYgLyogQ1JTICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGFkZHRvZ3JvdXAgUkNDRXhfUHJpdmF0ZV9GdW5jdGlvbnMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0jZW5kaWYgLyogSEFMX1JDQ19NT0RVTEVfRU5BQkxFRCAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBmaWxlICAgIHN0bTMyZzR4eF9oYWxfcmNjX2V4LmMKKyAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgKiBAYnJpZWYgICBFeHRlbmRlZCBSQ0MgSEFMIG1vZHVsZSBkcml2ZXIuCisgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgUkNDIGV4dGVuZGVkIHBlcmlwaGVyYWw6CisgKiAgICAgICAgICAgKyBFeHRlbmRlZCBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgKiAgICAgICAgICAgKyBFeHRlbmRlZCBDbG9jayBtYW5hZ2VtZW50IGZ1bmN0aW9ucworICogICAgICAgICAgICsgRXh0ZW5kZWQgQ2xvY2sgUmVjb3ZlcnkgU3lzdGVtIENvbnRyb2wgZnVuY3Rpb25zCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGF0dGVudGlvbgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGVybXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZQorICppbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb2Z0d2FyZSBjb21wb25lbnQuIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcworICp3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnNHh4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHNHh4X0hBTF9Ecml2ZXIKKyAqIEB7CisgKi8KKworLyoqIEBkZWZncm91cCBSQ0NFeCBSQ0NFeAorICogQGJyaWVmIFJDQyBFeHRlbmRlZCBIQUwgbW9kdWxlIGRyaXZlcgorICogQHsKKyAqLworCisjaWZkZWYgSEFMX1JDQ19NT0RVTEVfRU5BQkxFRAorCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUkNDRXhfUHJpdmF0ZV9Db25zdGFudHMgUkNDRXggUHJpdmF0ZSBDb25zdGFudHMKKyAqIEB7CisgKi8KKyNkZWZpbmUgUExMX1RJTUVPVVRfVkFMVUUgMlUgLyogMiBtcyAobWluaW11bSBUaWNrICsgMSkgKi8KKworI2RlZmluZSBESVZJREVSX1BfVVBEQVRFIDBVCisjZGVmaW5lIERJVklERVJfUV9VUERBVEUgMVUKKyNkZWZpbmUgRElWSURFUl9SX1VQREFURSAyVQorCisjZGVmaW5lIF9fTFNDT19DTEtfRU5BQkxFKCkgX19IQUxfUkNDX0dQSU9BX0NMS19FTkFCTEUoKQorI2RlZmluZSBMU0NPX0dQSU9fUE9SVCBHUElPQQorI2RlZmluZSBMU0NPX1BJTiBHUElPX1BJTl8yCisvKioKKyAqIEB9CisgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBSQ0NFeF9Qcml2YXRlX0Z1bmN0aW9ucyBSQ0NFeCBQcml2YXRlIEZ1bmN0aW9ucworICogQHsKKyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBSQ0NFeF9FeHBvcnRlZF9GdW5jdGlvbnMgUkNDRXggRXhwb3J0ZWQgRnVuY3Rpb25zCisgKiBAeworICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBFeHRlbmRlZCBQZXJpcGhlcmFsIENvbnRyb2wKK2Z1bmN0aW9ucworICogIEBicmllZiAgRXh0ZW5kZWQgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAjIyMjIyBFeHRlbmRlZCBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBjb250cm9sIHRoZSBSQ0MKK0Nsb2NrcyBmcmVxdWVuY2llcy4KKyAgICBbLi5dCisgICAgKEApIEltcG9ydGFudCBub3RlOiBDYXJlIG11c3QgYmUgdGFrZW4gd2hlbiBIQUxfUkNDRXhfUGVyaXBoQ0xLQ29uZmlnKCkgaXMKK3VzZWQgdG8gc2VsZWN0IHRoZSBSVEMgY2xvY2sgc291cmNlOyBpbiB0aGlzIGNhc2UgdGhlIEJhY2t1cCBkb21haW4gd2lsbCBiZQorcmVzZXQgaW4gb3JkZXIgdG8gbW9kaWZ5IHRoZSBSVEMgQ2xvY2sgc291cmNlLCBhcyBjb25zZXF1ZW5jZSBSVEMgcmVnaXN0ZXJzCisoaW5jbHVkaW5nIHRoZSBiYWNrdXAgcmVnaXN0ZXJzKSBhcmUgc2V0IHRvIHRoZWlyIHJlc2V0IHZhbHVlcy4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKy8qKgorICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBSQ0MgZXh0ZW5kZWQgcGVyaXBoZXJhbHMgY2xvY2tzIGFjY29yZGluZyB0byB0aGUKKyAqIHNwZWNpZmllZCBwYXJhbWV0ZXJzIGluIHRoZSBSQ0NfUGVyaXBoQ0xLSW5pdFR5cGVEZWYuCisgKiBAcGFyYW0gIFBlcmlwaENsa0luaXQgIHBvaW50ZXIgdG8gYW4gUkNDX1BlcmlwaENMS0luaXRUeXBlRGVmIHN0cnVjdHVyZSB0aGF0CisgKiAgICAgICAgIGNvbnRhaW5zIGEgZmllbGQgUGVyaXBoQ2xvY2tTZWxlY3Rpb24gd2hpY2ggY2FuIGJlIGEgY29tYmluYXRpb24gb2YKKyAqIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19SVEMgIFJUQyBwZXJpcGhlcmFsIGNsb2NrCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX1VTQVJUMSAgVVNBUlQxIHBlcmlwaGVyYWwgY2xvY2sKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfVVNBUlQyICBVU0FSVDIgcGVyaXBoZXJhbCBjbG9jaworICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19VU0FSVDMgIFVTQVJUMyBwZXJpcGhlcmFsIGNsb2NrCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX1VBUlQ0ICBVQVJUNCBwZXJpcGhlcmFsIGNsb2NrIChvbmx5IGZvcgorICogZGV2aWNlcyB3aXRoIFVBUlQ0KQorICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19VQVJUNSAgVUFSVDUgcGVyaXBoZXJhbCBjbG9jayAob25seSBmb3IKKyAqIGRldmljZXMgd2l0aCBVQVJUNSkKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfTFBVQVJUMSAgTFBVQVJUMSBwZXJpcGhlcmFsIGNsb2NrCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX0kyQzEgIEkyQzEgcGVyaXBoZXJhbCBjbG9jaworICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19JMkMyICBJMkMyIHBlcmlwaGVyYWwgY2xvY2sKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfSTJDMyAgSTJDMyBwZXJpcGhlcmFsIGNsb2NrCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX0kyQzQgIEkyQzQgcGVyaXBoZXJhbCBjbG9jayAob25seSBmb3IKKyAqIGRldmljZXMgd2l0aCBJMkM0KQorICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19MUFRJTTEgIExQVElNMSBwZXJpcGhlcmFsIGNsb2NrCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX1NBSTEgIFNBSTEgcGVyaXBoZXJhbCBjbG9jaworICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19JMlMgIEkyUyBwZXJpcGhlcmFsIGNsb2NrCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX0ZEQ0FOICBGRENBTiBwZXJpcGhlcmFsIGNsb2NrIChvbmx5IGZvcgorICogZGV2aWNlcyB3aXRoIEZEQ0FOKQorICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19STkcgIFJORyBwZXJpcGhlcmFsIGNsb2NrCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX1VTQiAgVVNCIHBlcmlwaGVyYWwgY2xvY2sgKG9ubHkgZm9yCisgKiBkZXZpY2VzIHdpdGggVVNCKQorICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19BREMxMiAgQURDMSBhbmQgQURDMiBwZXJpcGhlcmFsIGNsb2NrCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX0FEQzM0NSAgQURDMywgQURDNCBhbmQgQURDNSBwZXJpcGhlcmFsCisgKiBjbG9jayAob25seSBmb3IgZGV2aWNlcyB3aXRoIEFEQzMsIEFEQzQsIEFEQzUpCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX1FTUEkgIFF1YWRTUEkgcGVyaXBoZXJhbCBjbG9jayAob25seSBmb3IKKyAqIGRldmljZXMgd2l0aCBRdWFkU1BJKQorICoKKyAqIEBub3RlICAgQ2FyZSBtdXN0IGJlIHRha2VuIHdoZW4gSEFMX1JDQ0V4X1BlcmlwaENMS0NvbmZpZygpIGlzIHVzZWQgdG8gc2VsZWN0CisgKiAgICAgICAgIHRoZSBSVEMgY2xvY2sgc291cmNlOiBpbiB0aGlzIGNhc2UgdGhlIGFjY2VzcyB0byBCYWNrdXAgZG9tYWluIGlzCisgKiBlbmFibGVkLgorICoKKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUkNDRXhfUGVyaXBoQ0xLQ29uZmlnKAorICAgIFJDQ19QZXJpcGhDTEtJbml0VHlwZURlZiAqUGVyaXBoQ2xrSW5pdCkgeworICB1aW50MzJfdCB0bXByZWdpc3RlcjsKKyAgdWludDMyX3QgdGlja3N0YXJ0OworICBIQUxfU3RhdHVzVHlwZURlZiByZXQgPSBIQUxfT0s7ICAgIC8qIEludGVybWVkaWF0ZSBzdGF0dXMgKi8KKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOyAvKiBGaW5hbCBzdGF0dXMgKi8KKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUkNDX1BFUklQSENMT0NLKFBlcmlwaENsa0luaXQtPlBlcmlwaENsb2NrU2VsZWN0aW9uKSk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSVEMgY2xvY2sgc291cmNlIGNvbmZpZ3VyYXRpb24KKyAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24gJiBSQ0NfUEVSSVBIQ0xLX1JUQykgPT0KKyAgICAgIFJDQ19QRVJJUEhDTEtfUlRDKSB7CisgICAgRmxhZ1N0YXR1cyBwd3JjbGtjaGFuZ2VkID0gUkVTRVQ7CisKKyAgICAvKiBDaGVjayBmb3IgUlRDIFBhcmFtZXRlcnMgdXNlZCB0byBvdXRwdXQgUlRDQ0xLICovCisgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19SVENDTEtTT1VSQ0UoUGVyaXBoQ2xrSW5pdC0+UlRDQ2xvY2tTZWxlY3Rpb24pKTsKKworICAgIC8qIEVuYWJsZSBQb3dlciBDbG9jayAqLworICAgIGlmIChfX0hBTF9SQ0NfUFdSX0lTX0NMS19ESVNBQkxFRCgpKSB7CisgICAgICBfX0hBTF9SQ0NfUFdSX0NMS19FTkFCTEUoKTsKKyAgICAgIHB3cmNsa2NoYW5nZWQgPSBTRVQ7CisgICAgfQorCisgICAgLyogRW5hYmxlIHdyaXRlIGFjY2VzcyB0byBCYWNrdXAgZG9tYWluICovCisgICAgU0VUX0JJVChQV1ItPkNSMSwgUFdSX0NSMV9EQlApOworCisgICAgLyogV2FpdCBmb3IgQmFja3VwIGRvbWFpbiBXcml0ZSBwcm90ZWN0aW9uIGRpc2FibGUgKi8KKyAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgICAgd2hpbGUgKChQV1ItPkNSMSAmIFBXUl9DUjFfREJQKSA9PSAwVSkgeworICAgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFJDQ19EQlBfVElNRU9VVF9WQUxVRSkgeworICAgICAgICByZXQgPSBIQUxfVElNRU9VVDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHJldCA9PSBIQUxfT0spIHsKKyAgICAgIC8qIFJlc2V0IHRoZSBCYWNrdXAgZG9tYWluIG9ubHkgaWYgdGhlIFJUQyBDbG9jayBzb3VyY2Ugc2VsZWN0aW9uIGlzCisgICAgICAgKiBtb2RpZmllZCBmcm9tIGRlZmF1bHQgKi8KKyAgICAgIHRtcHJlZ2lzdGVyID0gUkVBRF9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9SVENTRUwpOworCisgICAgICBpZiAoKHRtcHJlZ2lzdGVyICE9IFJDQ19SVENDTEtTT1VSQ0VfTk9ORSkgJiYKKyAgICAgICAgICAodG1wcmVnaXN0ZXIgIT0gUGVyaXBoQ2xrSW5pdC0+UlRDQ2xvY2tTZWxlY3Rpb24pKSB7CisgICAgICAgIC8qIFN0b3JlIHRoZSBjb250ZW50IG9mIEJEQ1IgcmVnaXN0ZXIgYmVmb3JlIHRoZSByZXNldCBvZiBCYWNrdXAgRG9tYWluCisgICAgICAgICAqLworICAgICAgICB0bXByZWdpc3RlciA9IFJFQURfQklUKFJDQy0+QkRDUiwgfihSQ0NfQkRDUl9SVENTRUwpKTsKKyAgICAgICAgLyogUlRDIENsb2NrIHNlbGVjdGlvbiBjYW4gYmUgY2hhbmdlZCBvbmx5IGlmIHRoZSBCYWNrdXAgRG9tYWluIGlzIHJlc2V0CisgICAgICAgICAqLworICAgICAgICBfX0hBTF9SQ0NfQkFDS1VQUkVTRVRfRk9SQ0UoKTsKKyAgICAgICAgX19IQUxfUkNDX0JBQ0tVUFJFU0VUX1JFTEVBU0UoKTsKKyAgICAgICAgLyogUmVzdG9yZSB0aGUgQ29udGVudCBvZiBCRENSIHJlZ2lzdGVyICovCisgICAgICAgIFJDQy0+QkRDUiA9IHRtcHJlZ2lzdGVyOworICAgICAgfQorCisgICAgICAvKiBXYWl0IGZvciBMU0UgcmVhY3RpdmF0aW9uIGlmIExTRSB3YXMgZW5hYmxlIHByaW9yIHRvIEJhY2t1cCBEb21haW4KKyAgICAgICAqIHJlc2V0ICovCisgICAgICBpZiAoSEFMX0lTX0JJVF9TRVQodG1wcmVnaXN0ZXIsIFJDQ19CRENSX0xTRU9OKSkgeworICAgICAgICAvKiBHZXQgU3RhcnQgVGljayovCisgICAgICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICAgICAgLyogV2FpdCB0aWxsIExTRSBpcyByZWFkeSAqLworICAgICAgICB3aGlsZSAoUkVBRF9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9MU0VSRFkpID09IDBVKSB7CisgICAgICAgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFJDQ19MU0VfVElNRU9VVF9WQUxVRSkgeworICAgICAgICAgICAgcmV0ID0gSEFMX1RJTUVPVVQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKHJldCA9PSBIQUxfT0spIHsKKyAgICAgICAgLyogQXBwbHkgbmV3IFJUQyBjbG9jayBzb3VyY2Ugc2VsZWN0aW9uICovCisgICAgICAgIF9fSEFMX1JDQ19SVENfQ09ORklHKFBlcmlwaENsa0luaXQtPlJUQ0Nsb2NrU2VsZWN0aW9uKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIHNldCBvdmVyYWxsIHJldHVybiB2YWx1ZSAqLworICAgICAgICBzdGF0dXMgPSByZXQ7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIHNldCBvdmVyYWxsIHJldHVybiB2YWx1ZSAqLworICAgICAgc3RhdHVzID0gcmV0OworICAgIH0KKworICAgIC8qIFJlc3RvcmUgY2xvY2sgY29uZmlndXJhdGlvbiBpZiBjaGFuZ2VkICovCisgICAgaWYgKHB3cmNsa2NoYW5nZWQgPT0gU0VUKSB7CisgICAgICBfX0hBTF9SQ0NfUFdSX0NMS19ESVNBQkxFKCk7CisgICAgfQorICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVU0FSVDEgY2xvY2sgc291cmNlIGNvbmZpZ3VyYXRpb24KKyAgICogLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKFBlcmlwaENsa0luaXQtPlBlcmlwaENsb2NrU2VsZWN0aW9uKSAmIFJDQ19QRVJJUEhDTEtfVVNBUlQxKSA9PQorICAgICAgUkNDX1BFUklQSENMS19VU0FSVDEpIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19SQ0NfVVNBUlQxQ0xLU09VUkNFKFBlcmlwaENsa0luaXQtPlVzYXJ0MUNsb2NrU2VsZWN0aW9uKSk7CisKKyAgICAvKiBDb25maWd1cmUgdGhlIFVTQVJUMSBjbG9jayBzb3VyY2UgKi8KKyAgICBfX0hBTF9SQ0NfVVNBUlQxX0NPTkZJRyhQZXJpcGhDbGtJbml0LT5Vc2FydDFDbG9ja1NlbGVjdGlvbik7CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQVJUMiBjbG9jayBzb3VyY2UgY29uZmlndXJhdGlvbgorICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCgoUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24pICYgUkNDX1BFUklQSENMS19VU0FSVDIpID09CisgICAgICBSQ0NfUEVSSVBIQ0xLX1VTQVJUMikgeworICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19VU0FSVDJDTEtTT1VSQ0UoUGVyaXBoQ2xrSW5pdC0+VXNhcnQyQ2xvY2tTZWxlY3Rpb24pKTsKKworICAgIC8qIENvbmZpZ3VyZSB0aGUgVVNBUlQyIGNsb2NrIHNvdXJjZSAqLworICAgIF9fSEFMX1JDQ19VU0FSVDJfQ09ORklHKFBlcmlwaENsa0luaXQtPlVzYXJ0MkNsb2NrU2VsZWN0aW9uKTsKKyAgfQorCisjaWYgZGVmaW5lZChVU0FSVDMpCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVU0FSVDMgY2xvY2sgc291cmNlIGNvbmZpZ3VyYXRpb24KKyAgICogLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKFBlcmlwaENsa0luaXQtPlBlcmlwaENsb2NrU2VsZWN0aW9uKSAmIFJDQ19QRVJJUEhDTEtfVVNBUlQzKSA9PQorICAgICAgUkNDX1BFUklQSENMS19VU0FSVDMpIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19SQ0NfVVNBUlQzQ0xLU09VUkNFKFBlcmlwaENsa0luaXQtPlVzYXJ0M0Nsb2NrU2VsZWN0aW9uKSk7CisKKyAgICAvKiBDb25maWd1cmUgdGhlIFVTQVJUMyBjbG9jayBzb3VyY2UgKi8KKyAgICBfX0hBTF9SQ0NfVVNBUlQzX0NPTkZJRyhQZXJpcGhDbGtJbml0LT5Vc2FydDNDbG9ja1NlbGVjdGlvbik7CisgIH0KKworI2VuZGlmIC8qIFVTQVJUMyAqLworCisjaWYgZGVmaW5lZChVQVJUNCkKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVQVJUNCBjbG9jayBzb3VyY2UgY29uZmlndXJhdGlvbgorICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKFBlcmlwaENsa0luaXQtPlBlcmlwaENsb2NrU2VsZWN0aW9uKSAmIFJDQ19QRVJJUEhDTEtfVUFSVDQpID09CisgICAgICBSQ0NfUEVSSVBIQ0xLX1VBUlQ0KSB7CisgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX1VBUlQ0Q0xLU09VUkNFKFBlcmlwaENsa0luaXQtPlVhcnQ0Q2xvY2tTZWxlY3Rpb24pKTsKKworICAgIC8qIENvbmZpZ3VyZSB0aGUgVUFSVDQgY2xvY2sgc291cmNlICovCisgICAgX19IQUxfUkNDX1VBUlQ0X0NPTkZJRyhQZXJpcGhDbGtJbml0LT5VYXJ0NENsb2NrU2VsZWN0aW9uKTsKKyAgfQorI2VuZGlmIC8qIFVBUlQ0ICovCisKKyNpZiBkZWZpbmVkKFVBUlQ1KQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVUFSVDUgY2xvY2sgc291cmNlIGNvbmZpZ3VyYXRpb24KKyAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKChQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbikgJiBSQ0NfUEVSSVBIQ0xLX1VBUlQ1KSA9PQorICAgICAgUkNDX1BFUklQSENMS19VQVJUNSkgeworICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19VQVJUNUNMS1NPVVJDRShQZXJpcGhDbGtJbml0LT5VYXJ0NUNsb2NrU2VsZWN0aW9uKSk7CisKKyAgICAvKiBDb25maWd1cmUgdGhlIFVBUlQ1IGNsb2NrIHNvdXJjZSAqLworICAgIF9fSEFMX1JDQ19VQVJUNV9DT05GSUcoUGVyaXBoQ2xrSW5pdC0+VWFydDVDbG9ja1NlbGVjdGlvbik7CisgIH0KKworI2VuZGlmIC8qIFVBUlQ1ICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBMUFVBUlQxIGNsb2NrIHNvdXJjZSBjb25maWd1cmF0aW9uCisgICAqIC0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKFBlcmlwaENsa0luaXQtPlBlcmlwaENsb2NrU2VsZWN0aW9uKSAmIFJDQ19QRVJJUEhDTEtfTFBVQVJUMSkgPT0KKyAgICAgIFJDQ19QRVJJUEhDTEtfTFBVQVJUMSkgeworICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19MUFVBUlQxQ0xLU09VUkNFKFBlcmlwaENsa0luaXQtPkxwdWFydDFDbG9ja1NlbGVjdGlvbikpOworCisgICAgLyogQ29uZmlndXJlIHRoZSBMUFVBUjEgY2xvY2sgc291cmNlICovCisgICAgX19IQUxfUkNDX0xQVUFSVDFfQ09ORklHKFBlcmlwaENsa0luaXQtPkxwdWFydDFDbG9ja1NlbGVjdGlvbik7CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEkyQzEgY2xvY2sgc291cmNlIGNvbmZpZ3VyYXRpb24KKyAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCgoUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24pICYgUkNDX1BFUklQSENMS19JMkMxKSA9PQorICAgICAgUkNDX1BFUklQSENMS19JMkMxKSB7CisgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX0kyQzFDTEtTT1VSQ0UoUGVyaXBoQ2xrSW5pdC0+STJjMUNsb2NrU2VsZWN0aW9uKSk7CisKKyAgICAvKiBDb25maWd1cmUgdGhlIEkyQzEgY2xvY2sgc291cmNlICovCisgICAgX19IQUxfUkNDX0kyQzFfQ09ORklHKFBlcmlwaENsa0luaXQtPkkyYzFDbG9ja1NlbGVjdGlvbik7CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEkyQzIgY2xvY2sgc291cmNlIGNvbmZpZ3VyYXRpb24KKyAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCgoUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24pICYgUkNDX1BFUklQSENMS19JMkMyKSA9PQorICAgICAgUkNDX1BFUklQSENMS19JMkMyKSB7CisgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX0kyQzJDTEtTT1VSQ0UoUGVyaXBoQ2xrSW5pdC0+STJjMkNsb2NrU2VsZWN0aW9uKSk7CisKKyAgICAvKiBDb25maWd1cmUgdGhlIEkyQzIgY2xvY2sgc291cmNlICovCisgICAgX19IQUxfUkNDX0kyQzJfQ09ORklHKFBlcmlwaENsa0luaXQtPkkyYzJDbG9ja1NlbGVjdGlvbik7CisgIH0KKyNpZiBkZWZpbmVkKEkyQzMpCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJMkMzIGNsb2NrIHNvdXJjZSBjb25maWd1cmF0aW9uCisgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKFBlcmlwaENsa0luaXQtPlBlcmlwaENsb2NrU2VsZWN0aW9uKSAmIFJDQ19QRVJJUEhDTEtfSTJDMykgPT0KKyAgICAgIFJDQ19QRVJJUEhDTEtfSTJDMykgeworICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19JMkMzQ0xLU09VUkNFKFBlcmlwaENsa0luaXQtPkkyYzNDbG9ja1NlbGVjdGlvbikpOworCisgICAgLyogQ29uZmlndXJlIHRoZSBJMkMzIGNsb2NrIHNvdXJjZSAqLworICAgIF9fSEFMX1JDQ19JMkMzX0NPTkZJRyhQZXJpcGhDbGtJbml0LT5JMmMzQ2xvY2tTZWxlY3Rpb24pOworICB9CisKKyNlbmRpZiAvKiBJMkMzICovCisjaWYgZGVmaW5lZChJMkM0KQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSTJDNCBjbG9jayBzb3VyY2UgY29uZmlndXJhdGlvbgorICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKChQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbikgJiBSQ0NfUEVSSVBIQ0xLX0kyQzQpID09CisgICAgICBSQ0NfUEVSSVBIQ0xLX0kyQzQpIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19SQ0NfSTJDNENMS1NPVVJDRShQZXJpcGhDbGtJbml0LT5JMmM0Q2xvY2tTZWxlY3Rpb24pKTsKKworICAgIC8qIENvbmZpZ3VyZSB0aGUgSTJDNCBjbG9jayBzb3VyY2UgKi8KKyAgICBfX0hBTF9SQ0NfSTJDNF9DT05GSUcoUGVyaXBoQ2xrSW5pdC0+STJjNENsb2NrU2VsZWN0aW9uKTsKKyAgfQorCisjZW5kaWYgLyogSTJDNCAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTFBUSU0xIGNsb2NrIHNvdXJjZSBjb25maWd1cmF0aW9uCisgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKFBlcmlwaENsa0luaXQtPlBlcmlwaENsb2NrU2VsZWN0aW9uKSAmIFJDQ19QRVJJUEhDTEtfTFBUSU0xKSA9PQorICAgICAgUkNDX1BFUklQSENMS19MUFRJTTEpIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19SQ0NfTFBUSU0xQ0xLU09VUkNFKFBlcmlwaENsa0luaXQtPkxwdGltMUNsb2NrU2VsZWN0aW9uKSk7CisKKyAgICAvKiBDb25maWd1cmUgdGhlIExQVElNMSBjbG9jayBzb3VyY2UgKi8KKyAgICBfX0hBTF9SQ0NfTFBUSU0xX0NPTkZJRyhQZXJpcGhDbGtJbml0LT5McHRpbTFDbG9ja1NlbGVjdGlvbik7CisgIH0KKworI2lmIGRlZmluZWQoU0FJMSkKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTQUkxIGNsb2NrIHNvdXJjZSBjb25maWd1cmF0aW9uCisgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKFBlcmlwaENsa0luaXQtPlBlcmlwaENsb2NrU2VsZWN0aW9uKSAmIFJDQ19QRVJJUEhDTEtfU0FJMSkgPT0KKyAgICAgIFJDQ19QRVJJUEhDTEtfU0FJMSkgeworICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19TQUkxQ0xLU09VUkNFKFBlcmlwaENsa0luaXQtPlNhaTFDbG9ja1NlbGVjdGlvbikpOworCisgICAgLyogQ29uZmlndXJlIHRoZSBTQUkxIGludGVyZmFjZSBjbG9jayBzb3VyY2UgKi8KKyAgICBfX0hBTF9SQ0NfU0FJMV9DT05GSUcoUGVyaXBoQ2xrSW5pdC0+U2FpMUNsb2NrU2VsZWN0aW9uKTsKKworICAgIGlmIChQZXJpcGhDbGtJbml0LT5TYWkxQ2xvY2tTZWxlY3Rpb24gPT0gUkNDX1NBSTFDTEtTT1VSQ0VfUExMKSB7CisgICAgICAvKiBFbmFibGUgUExMNDhNMUNMSyBvdXRwdXQgKi8KKyAgICAgIF9fSEFMX1JDQ19QTExDTEtPVVRfRU5BQkxFKFJDQ19QTExfNDhNMUNMSyk7CisgICAgfQorICB9CisKKyNlbmRpZiAvKiBTQUkxICovCisKKyNpZiBkZWZpbmVkKFNQSV9JMlNfU1VQUE9SVCkKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJMlMgY2xvY2sgc291cmNlIGNvbmZpZ3VyYXRpb24KKyAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCgoUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24pICYgUkNDX1BFUklQSENMS19JMlMpID09CisgICAgICBSQ0NfUEVSSVBIQ0xLX0kyUykgeworICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19JMlNDTEtTT1VSQ0UoUGVyaXBoQ2xrSW5pdC0+STJzQ2xvY2tTZWxlY3Rpb24pKTsKKworICAgIC8qIENvbmZpZ3VyZSB0aGUgSTJTIGludGVyZmFjZSBjbG9jayBzb3VyY2UgKi8KKyAgICBfX0hBTF9SQ0NfSTJTX0NPTkZJRyhQZXJpcGhDbGtJbml0LT5JMnNDbG9ja1NlbGVjdGlvbik7CisKKyAgICBpZiAoUGVyaXBoQ2xrSW5pdC0+STJzQ2xvY2tTZWxlY3Rpb24gPT0gUkNDX0kyU0NMS1NPVVJDRV9QTEwpIHsKKyAgICAgIC8qIEVuYWJsZSBQTEw0OE0xQ0xLIG91dHB1dCAqLworICAgICAgX19IQUxfUkNDX1BMTENMS09VVF9FTkFCTEUoUkNDX1BMTF80OE0xQ0xLKTsKKyAgICB9CisgIH0KKworI2VuZGlmIC8qIFNQSV9JMlNfU1VQUE9SVCAqLworCisjaWYgZGVmaW5lZChGRENBTjEpCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRkRDQU4gY2xvY2sgc291cmNlIGNvbmZpZ3VyYXRpb24KKyAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCgoUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24pICYgUkNDX1BFUklQSENMS19GRENBTikgPT0KKyAgICAgIFJDQ19QRVJJUEhDTEtfRkRDQU4pIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19SQ0NfRkRDQU5DTEtTT1VSQ0UoUGVyaXBoQ2xrSW5pdC0+RmRjYW5DbG9ja1NlbGVjdGlvbikpOworCisgICAgLyogQ29uZmlndXJlIHRoZSBGRENBTiBpbnRlcmZhY2UgY2xvY2sgc291cmNlICovCisgICAgX19IQUxfUkNDX0ZEQ0FOX0NPTkZJRyhQZXJpcGhDbGtJbml0LT5GZGNhbkNsb2NrU2VsZWN0aW9uKTsKKworICAgIGlmIChQZXJpcGhDbGtJbml0LT5GZGNhbkNsb2NrU2VsZWN0aW9uID09IFJDQ19GRENBTkNMS1NPVVJDRV9QTEwpIHsKKyAgICAgIC8qIEVuYWJsZSBQTEw0OE0xQ0xLIG91dHB1dCAqLworICAgICAgX19IQUxfUkNDX1BMTENMS09VVF9FTkFCTEUoUkNDX1BMTF80OE0xQ0xLKTsKKyAgICB9CisgIH0KKyNlbmRpZiAvKiBGRENBTjEgKi8KKworI2lmIGRlZmluZWQoVVNCKQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNCIGNsb2NrIHNvdXJjZSBjb25maWd1cmF0aW9uCisgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKChQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbikgJiBSQ0NfUEVSSVBIQ0xLX1VTQikgPT0KKyAgICAgIChSQ0NfUEVSSVBIQ0xLX1VTQikpIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX1VTQkNMS1NPVVJDRShQZXJpcGhDbGtJbml0LT5Vc2JDbG9ja1NlbGVjdGlvbikpOworICAgIF9fSEFMX1JDQ19VU0JfQ09ORklHKFBlcmlwaENsa0luaXQtPlVzYkNsb2NrU2VsZWN0aW9uKTsKKworICAgIGlmIChQZXJpcGhDbGtJbml0LT5Vc2JDbG9ja1NlbGVjdGlvbiA9PSBSQ0NfVVNCQ0xLU09VUkNFX1BMTCkgeworICAgICAgLyogRW5hYmxlIFBMTDQ4TTFDTEsgb3V0cHV0ICovCisgICAgICBfX0hBTF9SQ0NfUExMQ0xLT1VUX0VOQUJMRShSQ0NfUExMXzQ4TTFDTEspOworICAgIH0KKyAgfQorCisjZW5kaWYgLyogVVNCICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSTkcgY2xvY2sgc291cmNlIGNvbmZpZ3VyYXRpb24KKyAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKFBlcmlwaENsa0luaXQtPlBlcmlwaENsb2NrU2VsZWN0aW9uKSAmIFJDQ19QRVJJUEhDTEtfUk5HKSA9PQorICAgICAgKFJDQ19QRVJJUEhDTEtfUk5HKSkgeworICAgIGFzc2VydF9wYXJhbShJU19SQ0NfUk5HQ0xLU09VUkNFKFBlcmlwaENsa0luaXQtPlJuZ0Nsb2NrU2VsZWN0aW9uKSk7CisgICAgX19IQUxfUkNDX1JOR19DT05GSUcoUGVyaXBoQ2xrSW5pdC0+Um5nQ2xvY2tTZWxlY3Rpb24pOworCisgICAgaWYgKFBlcmlwaENsa0luaXQtPlJuZ0Nsb2NrU2VsZWN0aW9uID09IFJDQ19STkdDTEtTT1VSQ0VfUExMKSB7CisgICAgICAvKiBFbmFibGUgUExMNDhNMUNMSyBvdXRwdXQgKi8KKyAgICAgIF9fSEFMX1JDQ19QTExDTEtPVVRfRU5BQkxFKFJDQ19QTExfNDhNMUNMSyk7CisgICAgfQorICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBREMxMiBjbG9jayBzb3VyY2UgY29uZmlndXJhdGlvbgorICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCgoUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24pICYgUkNDX1BFUklQSENMS19BREMxMikgPT0KKyAgICAgIFJDQ19QRVJJUEhDTEtfQURDMTIpIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19SQ0NfQURDMTJDTEtTT1VSQ0UoUGVyaXBoQ2xrSW5pdC0+QWRjMTJDbG9ja1NlbGVjdGlvbikpOworCisgICAgLyogQ29uZmlndXJlIHRoZSBBREMxMiBpbnRlcmZhY2UgY2xvY2sgc291cmNlICovCisgICAgX19IQUxfUkNDX0FEQzEyX0NPTkZJRyhQZXJpcGhDbGtJbml0LT5BZGMxMkNsb2NrU2VsZWN0aW9uKTsKKworICAgIGlmIChQZXJpcGhDbGtJbml0LT5BZGMxMkNsb2NrU2VsZWN0aW9uID09IFJDQ19BREMxMkNMS1NPVVJDRV9QTEwpIHsKKyAgICAgIC8qIEVuYWJsZSBQTExBRENDTEsgb3V0cHV0ICovCisgICAgICBfX0hBTF9SQ0NfUExMQ0xLT1VUX0VOQUJMRShSQ0NfUExMX0FEQ0NMSyk7CisgICAgfQorICB9CisKKyNpZiBkZWZpbmVkKEFEQzM0NV9DT01NT04pCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQURDMzQ1IGNsb2NrIHNvdXJjZSBjb25maWd1cmF0aW9uCisgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKChQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbikgJiBSQ0NfUEVSSVBIQ0xLX0FEQzM0NSkgPT0KKyAgICAgIFJDQ19QRVJJUEhDTEtfQURDMzQ1KSB7CisgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX0FEQzM0NUNMS1NPVVJDRShQZXJpcGhDbGtJbml0LT5BZGMzNDVDbG9ja1NlbGVjdGlvbikpOworCisgICAgLyogQ29uZmlndXJlIHRoZSBBREMzNDUgaW50ZXJmYWNlIGNsb2NrIHNvdXJjZSAqLworICAgIF9fSEFMX1JDQ19BREMzNDVfQ09ORklHKFBlcmlwaENsa0luaXQtPkFkYzM0NUNsb2NrU2VsZWN0aW9uKTsKKworICAgIGlmIChQZXJpcGhDbGtJbml0LT5BZGMzNDVDbG9ja1NlbGVjdGlvbiA9PSBSQ0NfQURDMzQ1Q0xLU09VUkNFX1BMTCkgeworICAgICAgLyogRW5hYmxlIFBMTEFEQ0NMSyBvdXRwdXQgKi8KKyAgICAgIF9fSEFMX1JDQ19QTExDTEtPVVRfRU5BQkxFKFJDQ19QTExfQURDQ0xLKTsKKyAgICB9CisgIH0KKyNlbmRpZiAvKiBBREMzNDVfQ09NTU9OICovCisKKyNpZiBkZWZpbmVkKFFVQURTUEkpCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBRdWFkU1BJeCBjbG9jayBzb3VyY2UgY29uZmlndXJhdGlvbgorICAgKiAtLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCgoUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24pICYgUkNDX1BFUklQSENMS19RU1BJKSA9PQorICAgICAgUkNDX1BFUklQSENMS19RU1BJKSB7CisgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX1FTUElDTEtTT1VSQ0UoUGVyaXBoQ2xrSW5pdC0+UXNwaUNsb2NrU2VsZWN0aW9uKSk7CisKKyAgICAvKiBDb25maWd1cmUgdGhlIFF1YWRTUEkgY2xvY2sgc291cmNlICovCisgICAgX19IQUxfUkNDX1FTUElfQ09ORklHKFBlcmlwaENsa0luaXQtPlFzcGlDbG9ja1NlbGVjdGlvbik7CisKKyAgICBpZiAoUGVyaXBoQ2xrSW5pdC0+UXNwaUNsb2NrU2VsZWN0aW9uID09IFJDQ19RU1BJQ0xLU09VUkNFX1BMTCkgeworICAgICAgLyogRW5hYmxlIFBMTDQ4TTFDTEsgb3V0cHV0ICovCisgICAgICBfX0hBTF9SQ0NfUExMQ0xLT1VUX0VOQUJMRShSQ0NfUExMXzQ4TTFDTEspOworICAgIH0KKyAgfQorCisjZW5kaWYgLyogUVVBRFNQSSAqLworCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogQGJyaWVmICBHZXQgdGhlIFJDQ19DbGtJbml0U3RydWN0IGFjY29yZGluZyB0byB0aGUgaW50ZXJuYWwgUkNDIGNvbmZpZ3VyYXRpb24KKyAqIHJlZ2lzdGVycy4KKyAqIEBwYXJhbSAgUGVyaXBoQ2xrSW5pdCAgcG9pbnRlciB0byBhbiBSQ0NfUGVyaXBoQ0xLSW5pdFR5cGVEZWYgc3RydWN0dXJlIHRoYXQKKyAqICAgICAgICAgcmV0dXJucyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIEV4dGVuZGVkIFBlcmlwaGVyYWxzCisgKiAgICAgICAgIGNsb2NrcyhVU0FSVDEsIFVTQVJUMiwgVVNBUlQzLCBVQVJUNCwgVUFSVDUsIExQVUFSVDEsIEkyQzEsIEkyQzIsCisgKiBJMkMzLCBJMkM0LCBMUFRJTTEsIFNBSTEsIEkyU3gsIEZEQ0FOeCwgVVNCLCBSTkcsIEFEQ3gsIFJUQywgUVNQSSkuCisgKiBAcmV0dmFsIE5vbmUKKyAqLwordm9pZCBIQUxfUkNDRXhfR2V0UGVyaXBoQ0xLQ29uZmlnKFJDQ19QZXJpcGhDTEtJbml0VHlwZURlZiAqUGVyaXBoQ2xrSW5pdCkgeworICAvKiBTZXQgYWxsIHBvc3NpYmxlIHZhbHVlcyBmb3IgdGhlIGV4dGVuZGVkIGNsb2NrIHR5cGUgcGFyYW1ldGVyLS0tLS0tLS0tLS0tKi8KKworI2lmIGRlZmluZWQoU1RNMzJHNDc0eHgpIHx8IGRlZmluZWQoU1RNMzJHNDg0eHgpCisKKyAgUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24gPQorICAgICAgUkNDX1BFUklQSENMS19VU0FSVDEgfCBSQ0NfUEVSSVBIQ0xLX1VTQVJUMiB8IFJDQ19QRVJJUEhDTEtfVVNBUlQzIHwKKyAgICAgIFJDQ19QRVJJUEhDTEtfVUFSVDQgfCBSQ0NfUEVSSVBIQ0xLX1VBUlQ1IHwgUkNDX1BFUklQSENMS19MUFVBUlQxIHwKKyAgICAgIFJDQ19QRVJJUEhDTEtfSTJDMSB8IFJDQ19QRVJJUEhDTEtfSTJDMiB8IFJDQ19QRVJJUEhDTEtfSTJDMyB8CisgICAgICBSQ0NfUEVSSVBIQ0xLX0kyQzQgfCBSQ0NfUEVSSVBIQ0xLX0xQVElNMSB8IFJDQ19QRVJJUEhDTEtfU0FJMSB8CisgICAgICBSQ0NfUEVSSVBIQ0xLX0kyUyB8IFJDQ19QRVJJUEhDTEtfRkRDQU4gfCBSQ0NfUEVSSVBIQ0xLX1JORyB8CisgICAgICBSQ0NfUEVSSVBIQ0xLX1VTQiB8IFJDQ19QRVJJUEhDTEtfQURDMTIgfCBSQ0NfUEVSSVBIQ0xLX0FEQzM0NSB8CisgICAgICBSQ0NfUEVSSVBIQ0xLX1FTUEkgfCBSQ0NfUEVSSVBIQ0xLX1JUQzsKKworI2VsaWYgZGVmaW5lZChTVE0zMkc0MTR4eCkKKworICBQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbiA9CisgICAgICBSQ0NfUEVSSVBIQ0xLX1VTQVJUMSB8IFJDQ19QRVJJUEhDTEtfVVNBUlQyIHwgUkNDX1BFUklQSENMS19VQVJUNCB8CisgICAgICBSQ0NfUEVSSVBIQ0xLX1VBUlQ1IHwgUkNDX1BFUklQSENMS19MUFRJTTEgfCBSQ0NfUEVSSVBIQ0xLX0kyUyB8CisgICAgICBSQ0NfUEVSSVBIQ0xLX0ZEQ0FOIHwgUkNDX1BFUklQSENMS19STkcgfCBSQ0NfUEVSSVBIQ0xLX0FEQzEyIHwKKyAgICAgIFJDQ19QRVJJUEhDTEtfUlRDOworCisjZWxpZiBkZWZpbmVkKFNUTTMyRzQ5MXh4KSB8fCBkZWZpbmVkKFNUTTMyRzRBMXh4KQorCisgIFBlcmlwaENsa0luaXQtPlBlcmlwaENsb2NrU2VsZWN0aW9uID0KKyAgICAgIFJDQ19QRVJJUEhDTEtfVVNBUlQxIHwgUkNDX1BFUklQSENMS19VU0FSVDIgfCBSQ0NfUEVSSVBIQ0xLX1VTQVJUMyB8CisgICAgICBSQ0NfUEVSSVBIQ0xLX1VBUlQ0IHwgUkNDX1BFUklQSENMS19VQVJUNSB8IFJDQ19QRVJJUEhDTEtfTFBVQVJUMSB8CisgICAgICBSQ0NfUEVSSVBIQ0xLX0kyQzEgfCBSQ0NfUEVSSVBIQ0xLX0kyQzIgfCBSQ0NfUEVSSVBIQ0xLX0kyQzMgfAorICAgICAgUkNDX1BFUklQSENMS19MUFRJTTEgfCBSQ0NfUEVSSVBIQ0xLX1NBSTEgfCBSQ0NfUEVSSVBIQ0xLX0kyUyB8CisgICAgICBSQ0NfUEVSSVBIQ0xLX0ZEQ0FOIHwgUkNDX1BFUklQSENMS19STkcgfCBSQ0NfUEVSSVBIQ0xLX1VTQiB8CisgICAgICBSQ0NfUEVSSVBIQ0xLX0FEQzEyIHwgUkNDX1BFUklQSENMS19BREMzNDUgfCBSQ0NfUEVSSVBIQ0xLX1FTUEkgfAorICAgICAgUkNDX1BFUklQSENMS19SVEM7CisKKyNlbGlmIGRlZmluZWQoU1RNMzJHNDczeHgpIHx8IGRlZmluZWQoU1RNMzJHNDgzeHgpCisKKyAgUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24gPQorICAgICAgUkNDX1BFUklQSENMS19VU0FSVDEgfCBSQ0NfUEVSSVBIQ0xLX1VTQVJUMiB8IFJDQ19QRVJJUEhDTEtfVVNBUlQzIHwKKyAgICAgIFJDQ19QRVJJUEhDTEtfVUFSVDQgfCBSQ0NfUEVSSVBIQ0xLX1VBUlQ1IHwgUkNDX1BFUklQSENMS19MUFVBUlQxIHwKKyAgICAgIFJDQ19QRVJJUEhDTEtfSTJDMSB8IFJDQ19QRVJJUEhDTEtfSTJDMiB8IFJDQ19QRVJJUEhDTEtfSTJDMyB8CisgICAgICBSQ0NfUEVSSVBIQ0xLX0kyQzQgfCBSQ0NfUEVSSVBIQ0xLX0xQVElNMSB8IFJDQ19QRVJJUEhDTEtfU0FJMSB8CisgICAgICBSQ0NfUEVSSVBIQ0xLX0kyUyB8IFJDQ19QRVJJUEhDTEtfUk5HIHwgUkNDX1BFUklQSENMS19VU0IgfAorICAgICAgUkNDX1BFUklQSENMS19BREMxMiB8IFJDQ19QRVJJUEhDTEtfQURDMzQ1IHwgUkNDX1BFUklQSENMS19RU1BJIHwKKyAgICAgIFJDQ19QRVJJUEhDTEtfUlRDOworCisjZWxpZiBkZWZpbmVkKFNUTTMyRzQ3MXh4KQorCisgIFBlcmlwaENsa0luaXQtPlBlcmlwaENsb2NrU2VsZWN0aW9uID0KKyAgICAgIFJDQ19QRVJJUEhDTEtfVVNBUlQxIHwgUkNDX1BFUklQSENMS19VU0FSVDIgfCBSQ0NfUEVSSVBIQ0xLX1VTQVJUMyB8CisgICAgICBSQ0NfUEVSSVBIQ0xLX1VBUlQ0IHwgUkNDX1BFUklQSENMS19VQVJUNSB8IFJDQ19QRVJJUEhDTEtfTFBVQVJUMSB8CisgICAgICBSQ0NfUEVSSVBIQ0xLX0kyQzEgfCBSQ0NfUEVSSVBIQ0xLX0kyQzIgfCBSQ0NfUEVSSVBIQ0xLX0kyQzMgfAorICAgICAgUkNDX1BFUklQSENMS19JMkM0IHwgUkNDX1BFUklQSENMS19MUFRJTTEgfCBSQ0NfUEVSSVBIQ0xLX1NBSTEgfAorICAgICAgUkNDX1BFUklQSENMS19JMlMgfCBSQ0NfUEVSSVBIQ0xLX1JORyB8IFJDQ19QRVJJUEhDTEtfVVNCIHwKKyAgICAgIFJDQ19QRVJJUEhDTEtfQURDMTIgfCBSQ0NfUEVSSVBIQ0xLX1JUQzsKKworI2VsaWYgZGVmaW5lZChTVE0zMkc0MzF4eCkgfHwgZGVmaW5lZChTVE0zMkc0NDF4eCkKKworICBQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbiA9CisgICAgICBSQ0NfUEVSSVBIQ0xLX1VTQVJUMSB8IFJDQ19QRVJJUEhDTEtfVVNBUlQyIHwgUkNDX1BFUklQSENMS19VU0FSVDMgfAorICAgICAgUkNDX1BFUklQSENMS19VQVJUNCB8IFJDQ19QRVJJUEhDTEtfTFBVQVJUMSB8IFJDQ19QRVJJUEhDTEtfSTJDMSB8CisgICAgICBSQ0NfUEVSSVBIQ0xLX0kyQzIgfCBSQ0NfUEVSSVBIQ0xLX0kyQzMgfCBSQ0NfUEVSSVBIQ0xLX0xQVElNMSB8CisgICAgICBSQ0NfUEVSSVBIQ0xLX1NBSTEgfCBSQ0NfUEVSSVBIQ0xLX0kyUyB8IFJDQ19QRVJJUEhDTEtfRkRDQU4gfAorICAgICAgUkNDX1BFUklQSENMS19STkcgfCBSQ0NfUEVSSVBIQ0xLX1VTQiB8IFJDQ19QRVJJUEhDTEtfQURDMTIgfAorICAgICAgUkNDX1BFUklQSENMS19SVEM7CisjZWxpZiBkZWZpbmVkKFNUTTMyRzQxMXhCKSB8fCBkZWZpbmVkKFNUTTMyRzQxMXhDKQorCisgIFBlcmlwaENsa0luaXQtPlBlcmlwaENsb2NrU2VsZWN0aW9uID0KKyAgICAgIFJDQ19QRVJJUEhDTEtfVVNBUlQxIHwgUkNDX1BFUklQSENMS19VU0FSVDIgfCBSQ0NfUEVSSVBIQ0xLX1VBUlQ0IHwKKyAgICAgIFJDQ19QRVJJUEhDTEtfTFBVQVJUMSB8IFJDQ19QRVJJUEhDTEtfSTJDMSB8IFJDQ19QRVJJUEhDTEtfSTJDMiB8CisgICAgICBSQ0NfUEVSSVBIQ0xLX0xQVElNMSB8IFJDQ19QRVJJUEhDTEtfSTJTIHwgUkNDX1BFUklQSENMS19GRENBTiB8CisgICAgICBSQ0NfUEVSSVBIQ0xLX1JORyB8IFJDQ19QRVJJUEhDTEtfQURDMTIgfCBSQ0NfUEVSSVBIQ0xLX1JUQzsKKworI2VsaWYgZGVmaW5lZChTVE0zMkdCSzFDQikKKworICBQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbiA9CisgICAgICBSQ0NfUEVSSVBIQ0xLX1VTQVJUMSB8IFJDQ19QRVJJUEhDTEtfVVNBUlQyIHwgUkNDX1BFUklQSENMS19VU0FSVDMgfAorICAgICAgUkNDX1BFUklQSENMS19MUFVBUlQxIHwgUkNDX1BFUklQSENMS19JMkMxIHwgUkNDX1BFUklQSENMS19JMkMyIHwKKyAgICAgIFJDQ19QRVJJUEhDTEtfSTJDMyB8IFJDQ19QRVJJUEhDTEtfTFBUSU0xIHwgUkNDX1BFUklQSENMS19TQUkxIHwKKyAgICAgIFJDQ19QRVJJUEhDTEtfSTJTIHwgUkNDX1BFUklQSENMS19GRENBTiB8IFJDQ19QRVJJUEhDTEtfUk5HIHwKKyAgICAgIFJDQ19QRVJJUEhDTEtfVVNCIHwgUkNDX1BFUklQSENMS19BREMxMiB8IFJDQ19QRVJJUEhDTEtfUlRDOworCisjZW5kaWYgLyogU1RNMzJHNDc0eHggfHwgU1RNMzJHNDg0eHggKi8KKworICAvKiBHZXQgdGhlIFVTQVJUMSBjbG9jayBzb3VyY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgUGVyaXBoQ2xrSW5pdC0+VXNhcnQxQ2xvY2tTZWxlY3Rpb24gPSBfX0hBTF9SQ0NfR0VUX1VTQVJUMV9TT1VSQ0UoKTsKKyAgLyogR2V0IHRoZSBVU0FSVDIgY2xvY2sgc291cmNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFBlcmlwaENsa0luaXQtPlVzYXJ0MkNsb2NrU2VsZWN0aW9uID0gX19IQUxfUkNDX0dFVF9VU0FSVDJfU09VUkNFKCk7CisKKyNpZiBkZWZpbmVkKFVTQVJUMykKKyAgLyogR2V0IHRoZSBVU0FSVDMgY2xvY2sgc291cmNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFBlcmlwaENsa0luaXQtPlVzYXJ0M0Nsb2NrU2VsZWN0aW9uID0gX19IQUxfUkNDX0dFVF9VU0FSVDNfU09VUkNFKCk7CisjZW5kaWYgLyogVVNBUlQzICovCisKKyNpZiBkZWZpbmVkKFVBUlQ0KQorICAvKiBHZXQgdGhlIFVBUlQ0IGNsb2NrIHNvdXJjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgUGVyaXBoQ2xrSW5pdC0+VWFydDRDbG9ja1NlbGVjdGlvbiA9IF9fSEFMX1JDQ19HRVRfVUFSVDRfU09VUkNFKCk7CisjZW5kaWYgLyogVUFSVDQgKi8KKworI2lmIGRlZmluZWQoVUFSVDUpCisgIC8qIEdldCB0aGUgVUFSVDUgY2xvY2sgc291cmNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBQZXJpcGhDbGtJbml0LT5VYXJ0NUNsb2NrU2VsZWN0aW9uID0gX19IQUxfUkNDX0dFVF9VQVJUNV9TT1VSQ0UoKTsKKyNlbmRpZiAvKiBVQVJUNSAqLworCisgIC8qIEdldCB0aGUgTFBVQVJUMSBjbG9jayBzb3VyY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBQZXJpcGhDbGtJbml0LT5McHVhcnQxQ2xvY2tTZWxlY3Rpb24gPSBfX0hBTF9SQ0NfR0VUX0xQVUFSVDFfU09VUkNFKCk7CisKKyAgLyogR2V0IHRoZSBJMkMxIGNsb2NrIHNvdXJjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFBlcmlwaENsa0luaXQtPkkyYzFDbG9ja1NlbGVjdGlvbiA9IF9fSEFMX1JDQ19HRVRfSTJDMV9TT1VSQ0UoKTsKKworICAvKiBHZXQgdGhlIEkyQzIgY2xvY2sgc291cmNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBQZXJpcGhDbGtJbml0LT5JMmMyQ2xvY2tTZWxlY3Rpb24gPSBfX0hBTF9SQ0NfR0VUX0kyQzJfU09VUkNFKCk7CisKKyNpZiBkZWZpbmVkKEkyQzMpCisgIC8qIEdldCB0aGUgSTJDMyBjbG9jayBzb3VyY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBQZXJpcGhDbGtJbml0LT5JMmMzQ2xvY2tTZWxlY3Rpb24gPSBfX0hBTF9SQ0NfR0VUX0kyQzNfU09VUkNFKCk7CisjZW5kaWYgLyogSTJDMyAqLworCisjaWYgZGVmaW5lZChJMkM0KQorICAvKiBHZXQgdGhlIEkyQzQgY2xvY2sgc291cmNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgUGVyaXBoQ2xrSW5pdC0+STJjNENsb2NrU2VsZWN0aW9uID0gX19IQUxfUkNDX0dFVF9JMkM0X1NPVVJDRSgpOworI2VuZGlmIC8qIEkyQzQgKi8KKworICAvKiBHZXQgdGhlIExQVElNMSBjbG9jayBzb3VyY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgUGVyaXBoQ2xrSW5pdC0+THB0aW0xQ2xvY2tTZWxlY3Rpb24gPSBfX0hBTF9SQ0NfR0VUX0xQVElNMV9TT1VSQ0UoKTsKKworI2lmIGRlZmluZWQoU0FJMSkKKyAgLyogR2V0IHRoZSBTQUkxIGNsb2NrIHNvdXJjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFBlcmlwaENsa0luaXQtPlNhaTFDbG9ja1NlbGVjdGlvbiA9IF9fSEFMX1JDQ19HRVRfU0FJMV9TT1VSQ0UoKTsKKyNlbmRpZiAvKiBTQUkxICovCisKKyNpZiBkZWZpbmVkKFNQSV9JMlNfU1VQUE9SVCkKKyAgLyogR2V0IHRoZSBJMlMgY2xvY2sgc291cmNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgUGVyaXBoQ2xrSW5pdC0+STJzQ2xvY2tTZWxlY3Rpb24gPSBfX0hBTF9SQ0NfR0VUX0kyU19TT1VSQ0UoKTsKKyNlbmRpZiAvKiBTUElfSTJTX1NVUFBPUlQgKi8KKworI2lmIGRlZmluZWQoRkRDQU4xKQorICAvKiBHZXQgdGhlIEZEQ0FOIGNsb2NrIHNvdXJjZQorICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFBlcmlwaENsa0luaXQtPkZkY2FuQ2xvY2tTZWxlY3Rpb24gPSBfX0hBTF9SQ0NfR0VUX0ZEQ0FOX1NPVVJDRSgpOworI2VuZGlmIC8qIEZEQ0FOMSAqLworCisjaWYgZGVmaW5lZChVU0IpCisgIC8qIEdldCB0aGUgVVNCIGNsb2NrIHNvdXJjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBQZXJpcGhDbGtJbml0LT5Vc2JDbG9ja1NlbGVjdGlvbiA9IF9fSEFMX1JDQ19HRVRfVVNCX1NPVVJDRSgpOworI2VuZGlmIC8qIFVTQiAqLworCisgIC8qIEdldCB0aGUgUk5HIGNsb2NrIHNvdXJjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBQZXJpcGhDbGtJbml0LT5SbmdDbG9ja1NlbGVjdGlvbiA9IF9fSEFMX1JDQ19HRVRfUk5HX1NPVVJDRSgpOworCisgIC8qIEdldCB0aGUgQURDMTIgY2xvY2sgc291cmNlCisgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgUGVyaXBoQ2xrSW5pdC0+QWRjMTJDbG9ja1NlbGVjdGlvbiA9IF9fSEFMX1JDQ19HRVRfQURDMTJfU09VUkNFKCk7CisKKyNpZiBkZWZpbmVkKEFEQzM0NV9DT01NT04pCisgIC8qIEdldCB0aGUgQURDMzQ1IGNsb2NrIHNvdXJjZQorICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgUGVyaXBoQ2xrSW5pdC0+QWRjMzQ1Q2xvY2tTZWxlY3Rpb24gPSBfX0hBTF9SQ0NfR0VUX0FEQzM0NV9TT1VSQ0UoKTsKKyNlbmRpZiAvKiBBREMzNDVfQ09NTU9OICovCisKKyNpZiBkZWZpbmVkKFFVQURTUEkpCisgIC8qIEdldCB0aGUgUXVhZFNQSWNsb2NrIHNvdXJjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFBlcmlwaENsa0luaXQtPlFzcGlDbG9ja1NlbGVjdGlvbiA9IF9fSEFMX1JDQ19HRVRfUVNQSV9TT1VSQ0UoKTsKKyNlbmRpZiAvKiBRVUFEU1BJICovCisKKyAgLyogR2V0IHRoZSBSVEMgY2xvY2sgc291cmNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFBlcmlwaENsa0luaXQtPlJUQ0Nsb2NrU2VsZWN0aW9uID0gX19IQUxfUkNDX0dFVF9SVENfU09VUkNFKCk7Cit9CisKKy8qKgorICogQGJyaWVmICBSZXR1cm4gdGhlIHBlcmlwaGVyYWwgY2xvY2sgZnJlcXVlbmN5IGZvciBwZXJpcGhlcmFscyB3aXRoIGNsb2NrCisgKiBzb3VyY2UgZnJvbSBQTEwKKyAqIEBub3RlICAgUmV0dXJuIDAgaWYgcGVyaXBoZXJhbCBjbG9jayBpZGVudGlmaWVyIG5vdCBtYW5hZ2VkIGJ5IHRoaXMgQVBJCisgKiBAcGFyYW0gIFBlcmlwaENsayAgUGVyaXBoZXJhbCBjbG9jayBpZGVudGlmaWVyCisgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX1VTQVJUMSAgVVNBUlQxIHBlcmlwaGVyYWwgY2xvY2sKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfVVNBUlQyICBVU0FSVDIgcGVyaXBoZXJhbCBjbG9jaworICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19VU0FSVDMgIFVTQVJUMyBwZXJpcGhlcmFsIGNsb2NrCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX1VBUlQ0ICBVQVJUNCBwZXJpcGhlcmFsIGNsb2NrIChvbmx5IGZvcgorICogZGV2aWNlcyB3aXRoIFVBUlQ0KQorICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19VQVJUNSAgVUFSVDUgcGVyaXBoZXJhbCBjbG9jayAob25seSBmb3IKKyAqIGRldmljZXMgd2l0aCBVQVJUNSkKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfTFBVQVJUMSAgTFBVQVJUMSBwZXJpcGhlcmFsIGNsb2NrCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX0kyQzEgIEkyQzEgcGVyaXBoZXJhbCBjbG9jaworICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19JMkMyICBJMkMyIHBlcmlwaGVyYWwgY2xvY2sKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfSTJDMyAgSTJDMyBwZXJpcGhlcmFsIGNsb2NrCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX0kyQzQgIEkyQzQgcGVyaXBoZXJhbCBjbG9jayAob25seSBmb3IKKyAqIGRldmljZXMgd2l0aCBJMkM0KQorICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19MUFRJTTEgIExQVElNMSBwZXJpcGhlcmFsIGNsb2NrCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX1NBSTEgIFNBSTEgcGVyaXBoZXJhbCBjbG9jaworICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19JMlMgIFNQSSBwZXJpcGhlcmFsIGNsb2NrCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX0ZEQ0FOICBGRENBTiBwZXJpcGhlcmFsIGNsb2NrIChvbmx5IGZvcgorICogZGV2aWNlcyB3aXRoIEZEQ0FOKQorICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19STkcgIFJORyBwZXJpcGhlcmFsIGNsb2NrCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX1VTQiAgVVNCIHBlcmlwaGVyYWwgY2xvY2sgKG9ubHkgZm9yCisgKiBkZXZpY2VzIHdpdGggVVNCKQorICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19BREMxMiAgQURDMSBhbmQgQURDMiBwZXJpcGhlcmFsIGNsb2NrCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX0FEQzM0NSAgQURDMywgQURDNCBhbmQgQURDNSBwZXJpcGhlcmFsCisgKiBjbG9jayAob25seSBmb3IgZGV2aWNlcyB3aXRoIEFEQzMsIEFEQzQsIEFEQzUpCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX1FTUEkgIFFTUEkgcGVyaXBoZXJhbCBjbG9jayAob25seSBmb3IKKyAqIGRldmljZXMgd2l0aCBRU1BJKQorICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19SVEMgIFJUQyBwZXJpcGhlcmFsIGNsb2NrCisgKiBAcmV0dmFsIEZyZXF1ZW5jeSBpbiBIegorICovCit1aW50MzJfdCBIQUxfUkNDRXhfR2V0UGVyaXBoQ0xLRnJlcSh1aW50MzJfdCBQZXJpcGhDbGspIHsKKyAgdWludDMyX3QgZnJlcXVlbmN5ID0gMFU7CisgIHVpbnQzMl90IHNyY2NsazsKKyAgdWludDMyX3QgcGxsdmNvLCBwbGxuLCBwbGxwOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19SQ0NfUEVSSVBIQ0xPQ0soUGVyaXBoQ2xrKSk7CisKKyAgaWYgKFBlcmlwaENsayA9PSBSQ0NfUEVSSVBIQ0xLX1JUQykgeworICAgIC8qIEdldCB0aGUgY3VycmVudCBSVEMgc291cmNlICovCisgICAgc3JjY2xrID0gX19IQUxfUkNDX0dFVF9SVENfU09VUkNFKCk7CisKKyAgICAvKiBDaGVjayBpZiBMU0UgaXMgcmVhZHkgYW5kIGlmIFJUQyBjbG9jayBzZWxlY3Rpb24gaXMgTFNFICovCisgICAgaWYgKChIQUxfSVNfQklUX1NFVChSQ0MtPkJEQ1IsIFJDQ19CRENSX0xTRVJEWSkpICYmCisgICAgICAgIChzcmNjbGsgPT0gUkNDX1JUQ0NMS1NPVVJDRV9MU0UpKSB7CisgICAgICBmcmVxdWVuY3kgPSBMU0VfVkFMVUU7CisgICAgfQorICAgIC8qIENoZWNrIGlmIExTSSBpcyByZWFkeSBhbmQgaWYgUlRDIGNsb2NrIHNlbGVjdGlvbiBpcyBMU0kgKi8KKyAgICBlbHNlIGlmICgoSEFMX0lTX0JJVF9TRVQoUkNDLT5DU1IsIFJDQ19DU1JfTFNJUkRZKSkgJiYKKyAgICAgICAgICAgICAoc3JjY2xrID09IFJDQ19SVENDTEtTT1VSQ0VfTFNJKSkgeworICAgICAgZnJlcXVlbmN5ID0gTFNJX1ZBTFVFOworICAgIH0KKyAgICAvKiBDaGVjayBpZiBIU0UgaXMgcmVhZHkgIGFuZCBpZiBSVEMgY2xvY2sgc2VsZWN0aW9uIGlzIEhTSV9ESVYzMiovCisgICAgZWxzZSBpZiAoKEhBTF9JU19CSVRfU0VUKFJDQy0+Q1IsIFJDQ19DUl9IU0VSRFkpKSAmJgorICAgICAgICAgICAgIChzcmNjbGsgPT0gUkNDX1JUQ0NMS1NPVVJDRV9IU0VfRElWMzIpKSB7CisgICAgICBmcmVxdWVuY3kgPSBIU0VfVkFMVUUgLyAzMlU7CisgICAgfQorICAgIC8qIENsb2NrIG5vdCBlbmFibGVkIGZvciBSVEMqLworICAgIGVsc2UgeworICAgICAgLyogbm90aGluZyB0byBkbzogZnJlcXVlbmN5IGFscmVhZHkgaW5pdGlhbGl6ZWQgdG8gMCAqLworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiBPdGhlciBleHRlcm5hbCBwZXJpcGhlcmFsIGNsb2NrIHNvdXJjZSB0aGFuIFJUQyAqLworCisgICAgLyogQ29tcHV0ZSBQTEwgY2xvY2sgaW5wdXQgKi8KKyAgICBpZiAoX19IQUxfUkNDX0dFVF9QTExfT1NDU09VUkNFKCkgPT0gUkNDX1BMTFNPVVJDRV9IU0kpIC8qIEhTSSA/ICovCisgICAgeworICAgICAgaWYgKEhBTF9JU19CSVRfU0VUKFJDQy0+Q1IsIFJDQ19DUl9IU0lSRFkpKSB7CisgICAgICAgIHBsbHZjbyA9IEhTSV9WQUxVRTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBsbHZjbyA9IDBVOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoX19IQUxfUkNDX0dFVF9QTExfT1NDU09VUkNFKCkgPT0gUkNDX1BMTFNPVVJDRV9IU0UpIC8qIEhTRSA/ICovCisgICAgeworICAgICAgaWYgKEhBTF9JU19CSVRfU0VUKFJDQy0+Q1IsIFJDQ19DUl9IU0VSRFkpKSB7CisgICAgICAgIHBsbHZjbyA9IEhTRV9WQUxVRTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBsbHZjbyA9IDBVOworICAgICAgfQorICAgIH0gZWxzZSAvKiBObyBzb3VyY2UgKi8KKyAgICB7CisgICAgICBwbGx2Y28gPSAwVTsKKyAgICB9CisKKyAgICAvKiBmKFBMTCBTb3VyY2UpIC8gUExMTSAqLworICAgIHBsbHZjbyA9IChwbGx2Y28gLyAoKFJFQURfQklUKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMTSkgPj4KKyAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NfUExMQ0ZHUl9QTExNX1BvcykgKworICAgICAgICAgICAgICAgICAgICAgICAgMVUpKTsKKworICAgIHN3aXRjaCAoUGVyaXBoQ2xrKSB7CisgICAgICBjYXNlIFJDQ19QRVJJUEhDTEtfVVNBUlQxOgorICAgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgVVNBUlQxIHNvdXJjZSAqLworICAgICAgICBzcmNjbGsgPSBfX0hBTF9SQ0NfR0VUX1VTQVJUMV9TT1VSQ0UoKTsKKworICAgICAgICBpZiAoc3JjY2xrID09IFJDQ19VU0FSVDFDTEtTT1VSQ0VfUENMSzIpIHsKKyAgICAgICAgICBmcmVxdWVuY3kgPSBIQUxfUkNDX0dldFBDTEsyRnJlcSgpOworICAgICAgICB9IGVsc2UgaWYgKHNyY2NsayA9PSBSQ0NfVVNBUlQxQ0xLU09VUkNFX1NZU0NMSykgeworICAgICAgICAgIGZyZXF1ZW5jeSA9IEhBTF9SQ0NfR2V0U3lzQ2xvY2tGcmVxKCk7CisgICAgICAgIH0gZWxzZSBpZiAoKEhBTF9JU19CSVRfU0VUKFJDQy0+Q1IsIFJDQ19DUl9IU0lSRFkpKSAmJgorICAgICAgICAgICAgICAgICAgIChzcmNjbGsgPT0gUkNDX1VTQVJUMUNMS1NPVVJDRV9IU0kpKSB7CisgICAgICAgICAgZnJlcXVlbmN5ID0gSFNJX1ZBTFVFOworICAgICAgICB9IGVsc2UgaWYgKChIQUxfSVNfQklUX1NFVChSQ0MtPkJEQ1IsIFJDQ19CRENSX0xTRVJEWSkpICYmCisgICAgICAgICAgICAgICAgICAgKHNyY2NsayA9PSBSQ0NfVVNBUlQxQ0xLU09VUkNFX0xTRSkpIHsKKyAgICAgICAgICBmcmVxdWVuY3kgPSBMU0VfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgLyogQ2xvY2sgbm90IGVuYWJsZWQgZm9yIFVTQVJUMSAqLworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAvKiBub3RoaW5nIHRvIGRvOiBmcmVxdWVuY3kgYWxyZWFkeSBpbml0aWFsaXplZCB0byAwICovCisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgUkNDX1BFUklQSENMS19VU0FSVDI6CisgICAgICAgIC8qIEdldCB0aGUgY3VycmVudCBVU0FSVDIgc291cmNlICovCisgICAgICAgIHNyY2NsayA9IF9fSEFMX1JDQ19HRVRfVVNBUlQyX1NPVVJDRSgpOworCisgICAgICAgIGlmIChzcmNjbGsgPT0gUkNDX1VTQVJUMkNMS1NPVVJDRV9QQ0xLMSkgeworICAgICAgICAgIGZyZXF1ZW5jeSA9IEhBTF9SQ0NfR2V0UENMSzFGcmVxKCk7CisgICAgICAgIH0gZWxzZSBpZiAoc3JjY2xrID09IFJDQ19VU0FSVDJDTEtTT1VSQ0VfU1lTQ0xLKSB7CisgICAgICAgICAgZnJlcXVlbmN5ID0gSEFMX1JDQ19HZXRTeXNDbG9ja0ZyZXEoKTsKKyAgICAgICAgfSBlbHNlIGlmICgoSEFMX0lTX0JJVF9TRVQoUkNDLT5DUiwgUkNDX0NSX0hTSVJEWSkpICYmCisgICAgICAgICAgICAgICAgICAgKHNyY2NsayA9PSBSQ0NfVVNBUlQyQ0xLU09VUkNFX0hTSSkpIHsKKyAgICAgICAgICBmcmVxdWVuY3kgPSBIU0lfVkFMVUU7CisgICAgICAgIH0gZWxzZSBpZiAoKEhBTF9JU19CSVRfU0VUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfTFNFUkRZKSkgJiYKKyAgICAgICAgICAgICAgICAgICAoc3JjY2xrID09IFJDQ19VU0FSVDJDTEtTT1VSQ0VfTFNFKSkgeworICAgICAgICAgIGZyZXF1ZW5jeSA9IExTRV9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICAvKiBDbG9jayBub3QgZW5hYmxlZCBmb3IgVVNBUlQyICovCisgICAgICAgIGVsc2UgeworICAgICAgICAgIC8qIG5vdGhpbmcgdG8gZG86IGZyZXF1ZW5jeSBhbHJlYWR5IGluaXRpYWxpemVkIHRvIDAgKi8KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworI2lmIGRlZmluZWQoVVNBUlQzKQorICAgICAgY2FzZSBSQ0NfUEVSSVBIQ0xLX1VTQVJUMzoKKyAgICAgICAgLyogR2V0IHRoZSBjdXJyZW50IFVTQVJUMyBzb3VyY2UgKi8KKyAgICAgICAgc3JjY2xrID0gX19IQUxfUkNDX0dFVF9VU0FSVDNfU09VUkNFKCk7CisKKyAgICAgICAgaWYgKHNyY2NsayA9PSBSQ0NfVVNBUlQzQ0xLU09VUkNFX1BDTEsxKSB7CisgICAgICAgICAgZnJlcXVlbmN5ID0gSEFMX1JDQ19HZXRQQ0xLMUZyZXEoKTsKKyAgICAgICAgfSBlbHNlIGlmIChzcmNjbGsgPT0gUkNDX1VTQVJUM0NMS1NPVVJDRV9TWVNDTEspIHsKKyAgICAgICAgICBmcmVxdWVuY3kgPSBIQUxfUkNDX0dldFN5c0Nsb2NrRnJlcSgpOworICAgICAgICB9IGVsc2UgaWYgKChIQUxfSVNfQklUX1NFVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJUkRZKSkgJiYKKyAgICAgICAgICAgICAgICAgICAoc3JjY2xrID09IFJDQ19VU0FSVDNDTEtTT1VSQ0VfSFNJKSkgeworICAgICAgICAgIGZyZXF1ZW5jeSA9IEhTSV9WQUxVRTsKKyAgICAgICAgfSBlbHNlIGlmICgoSEFMX0lTX0JJVF9TRVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9MU0VSRFkpKSAmJgorICAgICAgICAgICAgICAgICAgIChzcmNjbGsgPT0gUkNDX1VTQVJUM0NMS1NPVVJDRV9MU0UpKSB7CisgICAgICAgICAgZnJlcXVlbmN5ID0gTFNFX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIC8qIENsb2NrIG5vdCBlbmFibGVkIGZvciBVU0FSVDMgKi8KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgLyogbm90aGluZyB0byBkbzogZnJlcXVlbmN5IGFscmVhZHkgaW5pdGlhbGl6ZWQgdG8gMCAqLworICAgICAgICB9CisgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIFVTQVJUMyAqLworCisjaWYgZGVmaW5lZChVQVJUNCkKKyAgICAgIGNhc2UgUkNDX1BFUklQSENMS19VQVJUNDoKKyAgICAgICAgLyogR2V0IHRoZSBjdXJyZW50IFVBUlQ0IHNvdXJjZSAqLworICAgICAgICBzcmNjbGsgPSBfX0hBTF9SQ0NfR0VUX1VBUlQ0X1NPVVJDRSgpOworCisgICAgICAgIGlmIChzcmNjbGsgPT0gUkNDX1VBUlQ0Q0xLU09VUkNFX1BDTEsxKSB7CisgICAgICAgICAgZnJlcXVlbmN5ID0gSEFMX1JDQ19HZXRQQ0xLMUZyZXEoKTsKKyAgICAgICAgfSBlbHNlIGlmIChzcmNjbGsgPT0gUkNDX1VBUlQ0Q0xLU09VUkNFX1NZU0NMSykgeworICAgICAgICAgIGZyZXF1ZW5jeSA9IEhBTF9SQ0NfR2V0U3lzQ2xvY2tGcmVxKCk7CisgICAgICAgIH0gZWxzZSBpZiAoKEhBTF9JU19CSVRfU0VUKFJDQy0+Q1IsIFJDQ19DUl9IU0lSRFkpKSAmJgorICAgICAgICAgICAgICAgICAgIChzcmNjbGsgPT0gUkNDX1VBUlQ0Q0xLU09VUkNFX0hTSSkpIHsKKyAgICAgICAgICBmcmVxdWVuY3kgPSBIU0lfVkFMVUU7CisgICAgICAgIH0gZWxzZSBpZiAoKEhBTF9JU19CSVRfU0VUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfTFNFUkRZKSkgJiYKKyAgICAgICAgICAgICAgICAgICAoc3JjY2xrID09IFJDQ19VQVJUNENMS1NPVVJDRV9MU0UpKSB7CisgICAgICAgICAgZnJlcXVlbmN5ID0gTFNFX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIC8qIENsb2NrIG5vdCBlbmFibGVkIGZvciBVQVJUNCAqLworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAvKiBub3RoaW5nIHRvIGRvOiBmcmVxdWVuY3kgYWxyZWFkeSBpbml0aWFsaXplZCB0byAwICovCisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogVUFSVDQgKi8KKworI2lmIGRlZmluZWQoVUFSVDUpCisgICAgICBjYXNlIFJDQ19QRVJJUEhDTEtfVUFSVDU6CisgICAgICAgIC8qIEdldCB0aGUgY3VycmVudCBVQVJUNSBzb3VyY2UgKi8KKyAgICAgICAgc3JjY2xrID0gX19IQUxfUkNDX0dFVF9VQVJUNV9TT1VSQ0UoKTsKKworICAgICAgICBpZiAoc3JjY2xrID09IFJDQ19VQVJUNUNMS1NPVVJDRV9QQ0xLMSkgeworICAgICAgICAgIGZyZXF1ZW5jeSA9IEhBTF9SQ0NfR2V0UENMSzFGcmVxKCk7CisgICAgICAgIH0gZWxzZSBpZiAoc3JjY2xrID09IFJDQ19VQVJUNUNMS1NPVVJDRV9TWVNDTEspIHsKKyAgICAgICAgICBmcmVxdWVuY3kgPSBIQUxfUkNDX0dldFN5c0Nsb2NrRnJlcSgpOworICAgICAgICB9IGVsc2UgaWYgKChIQUxfSVNfQklUX1NFVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJUkRZKSkgJiYKKyAgICAgICAgICAgICAgICAgICAoc3JjY2xrID09IFJDQ19VQVJUNUNMS1NPVVJDRV9IU0kpKSB7CisgICAgICAgICAgZnJlcXVlbmN5ID0gSFNJX1ZBTFVFOworICAgICAgICB9IGVsc2UgaWYgKChIQUxfSVNfQklUX1NFVChSQ0MtPkJEQ1IsIFJDQ19CRENSX0xTRVJEWSkpICYmCisgICAgICAgICAgICAgICAgICAgKHNyY2NsayA9PSBSQ0NfVUFSVDVDTEtTT1VSQ0VfTFNFKSkgeworICAgICAgICAgIGZyZXF1ZW5jeSA9IExTRV9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICAvKiBDbG9jayBub3QgZW5hYmxlZCBmb3IgVUFSVDUgKi8KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgLyogbm90aGluZyB0byBkbzogZnJlcXVlbmN5IGFscmVhZHkgaW5pdGlhbGl6ZWQgdG8gMCAqLworICAgICAgICB9CisgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIFVBUlQ1ICovCisKKyAgICAgIGNhc2UgUkNDX1BFUklQSENMS19MUFVBUlQxOgorICAgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgTFBVQVJUMSBzb3VyY2UgKi8KKyAgICAgICAgc3JjY2xrID0gX19IQUxfUkNDX0dFVF9MUFVBUlQxX1NPVVJDRSgpOworCisgICAgICAgIGlmIChzcmNjbGsgPT0gUkNDX0xQVUFSVDFDTEtTT1VSQ0VfUENMSzEpIHsKKyAgICAgICAgICBmcmVxdWVuY3kgPSBIQUxfUkNDX0dldFBDTEsxRnJlcSgpOworICAgICAgICB9IGVsc2UgaWYgKHNyY2NsayA9PSBSQ0NfTFBVQVJUMUNMS1NPVVJDRV9TWVNDTEspIHsKKyAgICAgICAgICBmcmVxdWVuY3kgPSBIQUxfUkNDX0dldFN5c0Nsb2NrRnJlcSgpOworICAgICAgICB9IGVsc2UgaWYgKChIQUxfSVNfQklUX1NFVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJUkRZKSkgJiYKKyAgICAgICAgICAgICAgICAgICAoc3JjY2xrID09IFJDQ19MUFVBUlQxQ0xLU09VUkNFX0hTSSkpIHsKKyAgICAgICAgICBmcmVxdWVuY3kgPSBIU0lfVkFMVUU7CisgICAgICAgIH0gZWxzZSBpZiAoKEhBTF9JU19CSVRfU0VUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfTFNFUkRZKSkgJiYKKyAgICAgICAgICAgICAgICAgICAoc3JjY2xrID09IFJDQ19MUFVBUlQxQ0xLU09VUkNFX0xTRSkpIHsKKyAgICAgICAgICBmcmVxdWVuY3kgPSBMU0VfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgLyogQ2xvY2sgbm90IGVuYWJsZWQgZm9yIExQVUFSVDEgKi8KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgLyogbm90aGluZyB0byBkbzogZnJlcXVlbmN5IGFscmVhZHkgaW5pdGlhbGl6ZWQgdG8gMCAqLworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFJDQ19QRVJJUEhDTEtfSTJDMToKKyAgICAgICAgLyogR2V0IHRoZSBjdXJyZW50IEkyQzEgc291cmNlICovCisgICAgICAgIHNyY2NsayA9IF9fSEFMX1JDQ19HRVRfSTJDMV9TT1VSQ0UoKTsKKworICAgICAgICBpZiAoc3JjY2xrID09IFJDQ19JMkMxQ0xLU09VUkNFX1BDTEsxKSB7CisgICAgICAgICAgZnJlcXVlbmN5ID0gSEFMX1JDQ19HZXRQQ0xLMUZyZXEoKTsKKyAgICAgICAgfSBlbHNlIGlmIChzcmNjbGsgPT0gUkNDX0kyQzFDTEtTT1VSQ0VfU1lTQ0xLKSB7CisgICAgICAgICAgZnJlcXVlbmN5ID0gSEFMX1JDQ19HZXRTeXNDbG9ja0ZyZXEoKTsKKyAgICAgICAgfSBlbHNlIGlmICgoSEFMX0lTX0JJVF9TRVQoUkNDLT5DUiwgUkNDX0NSX0hTSVJEWSkpICYmCisgICAgICAgICAgICAgICAgICAgKHNyY2NsayA9PSBSQ0NfSTJDMUNMS1NPVVJDRV9IU0kpKSB7CisgICAgICAgICAgZnJlcXVlbmN5ID0gSFNJX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIC8qIENsb2NrIG5vdCBlbmFibGVkIGZvciBJMkMxICovCisgICAgICAgIGVsc2UgeworICAgICAgICAgIC8qIG5vdGhpbmcgdG8gZG86IGZyZXF1ZW5jeSBhbHJlYWR5IGluaXRpYWxpemVkIHRvIDAgKi8KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBSQ0NfUEVSSVBIQ0xLX0kyQzI6CisgICAgICAgIC8qIEdldCB0aGUgY3VycmVudCBJMkMyIHNvdXJjZSAqLworICAgICAgICBzcmNjbGsgPSBfX0hBTF9SQ0NfR0VUX0kyQzJfU09VUkNFKCk7CisKKyAgICAgICAgaWYgKHNyY2NsayA9PSBSQ0NfSTJDMkNMS1NPVVJDRV9QQ0xLMSkgeworICAgICAgICAgIGZyZXF1ZW5jeSA9IEhBTF9SQ0NfR2V0UENMSzFGcmVxKCk7CisgICAgICAgIH0gZWxzZSBpZiAoc3JjY2xrID09IFJDQ19JMkMyQ0xLU09VUkNFX1NZU0NMSykgeworICAgICAgICAgIGZyZXF1ZW5jeSA9IEhBTF9SQ0NfR2V0U3lzQ2xvY2tGcmVxKCk7CisgICAgICAgIH0gZWxzZSBpZiAoKEhBTF9JU19CSVRfU0VUKFJDQy0+Q1IsIFJDQ19DUl9IU0lSRFkpKSAmJgorICAgICAgICAgICAgICAgICAgIChzcmNjbGsgPT0gUkNDX0kyQzJDTEtTT1VSQ0VfSFNJKSkgeworICAgICAgICAgIGZyZXF1ZW5jeSA9IEhTSV9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICAvKiBDbG9jayBub3QgZW5hYmxlZCBmb3IgSTJDMiAqLworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAvKiBub3RoaW5nIHRvIGRvOiBmcmVxdWVuY3kgYWxyZWFkeSBpbml0aWFsaXplZCB0byAwICovCisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyNpZiBkZWZpbmVkKEkyQzMpCisKKyAgICAgIGNhc2UgUkNDX1BFUklQSENMS19JMkMzOgorICAgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgSTJDMyBzb3VyY2UgKi8KKyAgICAgICAgc3JjY2xrID0gX19IQUxfUkNDX0dFVF9JMkMzX1NPVVJDRSgpOworCisgICAgICAgIGlmIChzcmNjbGsgPT0gUkNDX0kyQzNDTEtTT1VSQ0VfUENMSzEpIHsKKyAgICAgICAgICBmcmVxdWVuY3kgPSBIQUxfUkNDX0dldFBDTEsxRnJlcSgpOworICAgICAgICB9IGVsc2UgaWYgKHNyY2NsayA9PSBSQ0NfSTJDM0NMS1NPVVJDRV9TWVNDTEspIHsKKyAgICAgICAgICBmcmVxdWVuY3kgPSBIQUxfUkNDX0dldFN5c0Nsb2NrRnJlcSgpOworICAgICAgICB9IGVsc2UgaWYgKChIQUxfSVNfQklUX1NFVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJUkRZKSkgJiYKKyAgICAgICAgICAgICAgICAgICAoc3JjY2xrID09IFJDQ19JMkMzQ0xLU09VUkNFX0hTSSkpIHsKKyAgICAgICAgICBmcmVxdWVuY3kgPSBIU0lfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgLyogQ2xvY2sgbm90IGVuYWJsZWQgZm9yIEkyQzMgKi8KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgLyogbm90aGluZyB0byBkbzogZnJlcXVlbmN5IGFscmVhZHkgaW5pdGlhbGl6ZWQgdG8gMCAqLworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisjZW5kaWYgLyogSTJDMyAqLworCisjaWYgZGVmaW5lZChJMkM0KQorCisgICAgICBjYXNlIFJDQ19QRVJJUEhDTEtfSTJDNDoKKyAgICAgICAgLyogR2V0IHRoZSBjdXJyZW50IEkyQzQgc291cmNlICovCisgICAgICAgIHNyY2NsayA9IF9fSEFMX1JDQ19HRVRfSTJDNF9TT1VSQ0UoKTsKKworICAgICAgICBpZiAoc3JjY2xrID09IFJDQ19JMkM0Q0xLU09VUkNFX1BDTEsxKSB7CisgICAgICAgICAgZnJlcXVlbmN5ID0gSEFMX1JDQ19HZXRQQ0xLMUZyZXEoKTsKKyAgICAgICAgfSBlbHNlIGlmIChzcmNjbGsgPT0gUkNDX0kyQzRDTEtTT1VSQ0VfU1lTQ0xLKSB7CisgICAgICAgICAgZnJlcXVlbmN5ID0gSEFMX1JDQ19HZXRTeXNDbG9ja0ZyZXEoKTsKKyAgICAgICAgfSBlbHNlIGlmICgoSEFMX0lTX0JJVF9TRVQoUkNDLT5DUiwgUkNDX0NSX0hTSVJEWSkpICYmCisgICAgICAgICAgICAgICAgICAgKHNyY2NsayA9PSBSQ0NfSTJDNENMS1NPVVJDRV9IU0kpKSB7CisgICAgICAgICAgZnJlcXVlbmN5ID0gSFNJX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIC8qIENsb2NrIG5vdCBlbmFibGVkIGZvciBJMkM0ICovCisgICAgICAgIGVsc2UgeworICAgICAgICAgIC8qIG5vdGhpbmcgdG8gZG86IGZyZXF1ZW5jeSBhbHJlYWR5IGluaXRpYWxpemVkIHRvIDAgKi8KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworI2VuZGlmIC8qIEkyQzQgKi8KKworICAgICAgY2FzZSBSQ0NfUEVSSVBIQ0xLX0xQVElNMToKKyAgICAgICAgLyogR2V0IHRoZSBjdXJyZW50IExQVElNMSBzb3VyY2UgKi8KKyAgICAgICAgc3JjY2xrID0gX19IQUxfUkNDX0dFVF9MUFRJTTFfU09VUkNFKCk7CisKKyAgICAgICAgaWYgKHNyY2NsayA9PSBSQ0NfTFBUSU0xQ0xLU09VUkNFX1BDTEsxKSB7CisgICAgICAgICAgZnJlcXVlbmN5ID0gSEFMX1JDQ19HZXRQQ0xLMUZyZXEoKTsKKyAgICAgICAgfSBlbHNlIGlmICgoSEFMX0lTX0JJVF9TRVQoUkNDLT5DU1IsIFJDQ19DU1JfTFNJUkRZKSkgJiYKKyAgICAgICAgICAgICAgICAgICAoc3JjY2xrID09IFJDQ19MUFRJTTFDTEtTT1VSQ0VfTFNJKSkgeworICAgICAgICAgIGZyZXF1ZW5jeSA9IExTSV9WQUxVRTsKKyAgICAgICAgfSBlbHNlIGlmICgoSEFMX0lTX0JJVF9TRVQoUkNDLT5DUiwgUkNDX0NSX0hTSVJEWSkpICYmCisgICAgICAgICAgICAgICAgICAgKHNyY2NsayA9PSBSQ0NfTFBUSU0xQ0xLU09VUkNFX0hTSSkpIHsKKyAgICAgICAgICBmcmVxdWVuY3kgPSBIU0lfVkFMVUU7CisgICAgICAgIH0gZWxzZSBpZiAoKEhBTF9JU19CSVRfU0VUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfTFNFUkRZKSkgJiYKKyAgICAgICAgICAgICAgICAgICAoc3JjY2xrID09IFJDQ19MUFRJTTFDTEtTT1VSQ0VfTFNFKSkgeworICAgICAgICAgIGZyZXF1ZW5jeSA9IExTRV9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICAvKiBDbG9jayBub3QgZW5hYmxlZCBmb3IgTFBUSU0xICovCisgICAgICAgIGVsc2UgeworICAgICAgICAgIC8qIG5vdGhpbmcgdG8gZG86IGZyZXF1ZW5jeSBhbHJlYWR5IGluaXRpYWxpemVkIHRvIDAgKi8KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworI2lmIGRlZmluZWQoU0FJMSkKKworICAgICAgY2FzZSBSQ0NfUEVSSVBIQ0xLX1NBSTE6CisgICAgICAgIC8qIEdldCB0aGUgY3VycmVudCBTQUkxIHNvdXJjZSAqLworICAgICAgICBzcmNjbGsgPSBfX0hBTF9SQ0NfR0VUX1NBSTFfU09VUkNFKCk7CisKKyAgICAgICAgaWYgKHNyY2NsayA9PSBSQ0NfU0FJMUNMS1NPVVJDRV9TWVNDTEspIHsKKyAgICAgICAgICBmcmVxdWVuY3kgPSBIQUxfUkNDX0dldFN5c0Nsb2NrRnJlcSgpOworICAgICAgICB9IGVsc2UgaWYgKHNyY2NsayA9PSBSQ0NfU0FJMUNMS1NPVVJDRV9QTEwpIHsKKyAgICAgICAgICBpZiAoX19IQUxfUkNDX0dFVF9QTExDTEtPVVRfQ09ORklHKFJDQ19QTExfNDhNMUNMSykgIT0gMFUpIHsKKyAgICAgICAgICAgIC8qIGYoUExMUSkgPSBmKFZDTyBpbnB1dCkgKiBQTExOIC8gUExMUSAqLworICAgICAgICAgICAgcGxsbiA9IFJFQURfQklUKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMTikgPj4KKyAgICAgICAgICAgICAgICAgICBSQ0NfUExMQ0ZHUl9QTExOX1BvczsKKyAgICAgICAgICAgIGZyZXF1ZW5jeSA9CisgICAgICAgICAgICAgICAgKHBsbHZjbyAqIHBsbG4pIC8gKCgoUkVBRF9CSVQoUkNDLT5QTExDRkdSLCBSQ0NfUExMQ0ZHUl9QTExRKSA+PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19QTExDRkdSX1BMTFFfUG9zKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxVSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgMVUpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChzcmNjbGsgPT0gUkNDX1NBSTFDTEtTT1VSQ0VfRVhUKSB7CisgICAgICAgICAgLyogRXh0ZXJuYWwgY2xvY2sgdXNlZC4qLworICAgICAgICAgIGZyZXF1ZW5jeSA9IEVYVEVSTkFMX0NMT0NLX1ZBTFVFOworICAgICAgICB9IGVsc2UgaWYgKChIQUxfSVNfQklUX1NFVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJUkRZKSkgJiYKKyAgICAgICAgICAgICAgICAgICAoc3JjY2xrID09IFJDQ19TQUkxQ0xLU09VUkNFX0hTSSkpIHsKKyAgICAgICAgICBmcmVxdWVuY3kgPSBIU0lfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgLyogQ2xvY2sgbm90IGVuYWJsZWQgZm9yIFNBSTEgKi8KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgLyogbm90aGluZyB0byBkbzogZnJlcXVlbmN5IGFscmVhZHkgaW5pdGlhbGl6ZWQgdG8gMCAqLworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisjZW5kaWYgLyogU0FJMSAqLworCisjaWYgZGVmaW5lZChTUElfSTJTX1NVUFBPUlQpCisgICAgICBjYXNlIFJDQ19QRVJJUEhDTEtfSTJTOgorICAgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgSTJTeCBzb3VyY2UgKi8KKyAgICAgICAgc3JjY2xrID0gX19IQUxfUkNDX0dFVF9JMlNfU09VUkNFKCk7CisKKyAgICAgICAgaWYgKHNyY2NsayA9PSBSQ0NfSTJTQ0xLU09VUkNFX1NZU0NMSykgeworICAgICAgICAgIGZyZXF1ZW5jeSA9IEhBTF9SQ0NfR2V0U3lzQ2xvY2tGcmVxKCk7CisgICAgICAgIH0gZWxzZSBpZiAoc3JjY2xrID09IFJDQ19JMlNDTEtTT1VSQ0VfUExMKSB7CisgICAgICAgICAgaWYgKF9fSEFMX1JDQ19HRVRfUExMQ0xLT1VUX0NPTkZJRyhSQ0NfUExMXzQ4TTFDTEspICE9IDBVKSB7CisgICAgICAgICAgICAvKiBmKFBMTFEpID0gZihWQ08gaW5wdXQpICogUExMTiAvIFBMTFEgKi8KKyAgICAgICAgICAgIHBsbG4gPSBSRUFEX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTE4pID4+CisgICAgICAgICAgICAgICAgICAgUkNDX1BMTENGR1JfUExMTl9Qb3M7CisgICAgICAgICAgICBmcmVxdWVuY3kgPQorICAgICAgICAgICAgICAgIChwbGx2Y28gKiBwbGxuKSAvICgoKFJFQURfQklUKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMUSkgPj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NfUExMQ0ZHUl9QTExRX1BvcykgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMVUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IDFVKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoc3JjY2xrID09IFJDQ19JMlNDTEtTT1VSQ0VfRVhUKSB7CisgICAgICAgICAgLyogRXh0ZXJuYWwgY2xvY2sgdXNlZC4qLworICAgICAgICAgIGZyZXF1ZW5jeSA9IEVYVEVSTkFMX0NMT0NLX1ZBTFVFOworICAgICAgICB9IGVsc2UgaWYgKChIQUxfSVNfQklUX1NFVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJUkRZKSkgJiYKKyAgICAgICAgICAgICAgICAgICAoc3JjY2xrID09IFJDQ19JMlNDTEtTT1VSQ0VfSFNJKSkgeworICAgICAgICAgIGZyZXF1ZW5jeSA9IEhTSV9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICAvKiBDbG9jayBub3QgZW5hYmxlZCBmb3IgSTJTICovCisgICAgICAgIGVsc2UgeworICAgICAgICAgIC8qIG5vdGhpbmcgdG8gZG86IGZyZXF1ZW5jeSBhbHJlYWR5IGluaXRpYWxpemVkIHRvIDAgKi8KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBTUElfSTJTX1NVUFBPUlQgKi8KKworI2lmIGRlZmluZWQoRkRDQU4xKQorICAgICAgY2FzZSBSQ0NfUEVSSVBIQ0xLX0ZEQ0FOOgorICAgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgRkRDQU54IHNvdXJjZSAqLworICAgICAgICBzcmNjbGsgPSBfX0hBTF9SQ0NfR0VUX0ZEQ0FOX1NPVVJDRSgpOworCisgICAgICAgIGlmIChzcmNjbGsgPT0gUkNDX0ZEQ0FOQ0xLU09VUkNFX1BDTEsxKSB7CisgICAgICAgICAgZnJlcXVlbmN5ID0gSEFMX1JDQ19HZXRQQ0xLMUZyZXEoKTsKKyAgICAgICAgfSBlbHNlIGlmIChzcmNjbGsgPT0gUkNDX0ZEQ0FOQ0xLU09VUkNFX0hTRSkgeworICAgICAgICAgIGZyZXF1ZW5jeSA9IEhTRV9WQUxVRTsKKyAgICAgICAgfSBlbHNlIGlmIChzcmNjbGsgPT0gUkNDX0ZEQ0FOQ0xLU09VUkNFX1BMTCkgeworICAgICAgICAgIGlmIChfX0hBTF9SQ0NfR0VUX1BMTENMS09VVF9DT05GSUcoUkNDX1BMTF80OE0xQ0xLKSAhPSAwVSkgeworICAgICAgICAgICAgLyogZihQTExRKSA9IGYoVkNPIGlucHV0KSAqIFBMTE4gLyBQTExRICovCisgICAgICAgICAgICBwbGxuID0gUkVBRF9CSVQoUkNDLT5QTExDRkdSLCBSQ0NfUExMQ0ZHUl9QTExOKSA+PgorICAgICAgICAgICAgICAgICAgIFJDQ19QTExDRkdSX1BMTE5fUG9zOworICAgICAgICAgICAgZnJlcXVlbmN5ID0KKyAgICAgICAgICAgICAgICAocGxsdmNvICogcGxsbikgLyAoKChSRUFEX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTFEpID4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BMTENGR1JfUExMUV9Qb3MpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDFVKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAxVSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIENsb2NrIG5vdCBlbmFibGVkIGZvciBGRENBTiAqLworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAvKiBub3RoaW5nIHRvIGRvOiBmcmVxdWVuY3kgYWxyZWFkeSBpbml0aWFsaXplZCB0byAwICovCisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogRkRDQU4xICovCisKKyNpZiBkZWZpbmVkKFVTQikKKworICAgICAgY2FzZSBSQ0NfUEVSSVBIQ0xLX1VTQjoKKyAgICAgICAgLyogR2V0IHRoZSBjdXJyZW50IFVTQiBzb3VyY2UgKi8KKyAgICAgICAgc3JjY2xrID0gX19IQUxfUkNDX0dFVF9VU0JfU09VUkNFKCk7CisKKyAgICAgICAgaWYgKHNyY2NsayA9PSBSQ0NfVVNCQ0xLU09VUkNFX1BMTCkgLyogUExMID8gKi8KKyAgICAgICAgeworICAgICAgICAgIC8qIGYoUExMUSkgPSBmKFZDTyBpbnB1dCkgKiBQTExOIC8gUExMUSAqLworICAgICAgICAgIHBsbG4gPQorICAgICAgICAgICAgICBSRUFEX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTE4pID4+IFJDQ19QTExDRkdSX1BMTE5fUG9zOworICAgICAgICAgIGZyZXF1ZW5jeSA9CisgICAgICAgICAgICAgIChwbGx2Y28gKiBwbGxuKSAvICgoKFJFQURfQklUKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMUSkgPj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BMTENGR1JfUExMUV9Qb3MpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxVSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IDFVKTsKKyAgICAgICAgfSBlbHNlIGlmICgoSEFMX0lTX0JJVF9TRVQoUkNDLT5DUlJDUiwgUkNDX0NSUkNSX0hTSTQ4UkRZKSkgJiYKKyAgICAgICAgICAgICAgICAgICAoc3JjY2xrID09IFJDQ19VU0JDTEtTT1VSQ0VfSFNJNDgpKSAvKiBIU0k0OCA/ICovCisgICAgICAgIHsKKyAgICAgICAgICBmcmVxdWVuY3kgPSBIU0k0OF9WQUxVRTsKKyAgICAgICAgfSBlbHNlIC8qIE5vIGNsb2NrIHNvdXJjZSAqLworICAgICAgICB7CisgICAgICAgICAgLyogbm90aGluZyB0byBkbzogZnJlcXVlbmN5IGFscmVhZHkgaW5pdGlhbGl6ZWQgdG8gMCAqLworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisjZW5kaWYgLyogVVNCICovCisKKyAgICAgIGNhc2UgUkNDX1BFUklQSENMS19STkc6CisgICAgICAgIC8qIEdldCB0aGUgY3VycmVudCBSTkcgc291cmNlICovCisgICAgICAgIHNyY2NsayA9IF9fSEFMX1JDQ19HRVRfUk5HX1NPVVJDRSgpOworCisgICAgICAgIGlmIChzcmNjbGsgPT0gUkNDX1JOR0NMS1NPVVJDRV9QTEwpIC8qIFBMTCA/ICovCisgICAgICAgIHsKKyAgICAgICAgICAvKiBmKFBMTFEpID0gZihWQ08gaW5wdXQpICogUExMTiAvIFBMTFEgKi8KKyAgICAgICAgICBwbGxuID0KKyAgICAgICAgICAgICAgUkVBRF9CSVQoUkNDLT5QTExDRkdSLCBSQ0NfUExMQ0ZHUl9QTExOKSA+PiBSQ0NfUExMQ0ZHUl9QTExOX1BvczsKKyAgICAgICAgICBmcmVxdWVuY3kgPQorICAgICAgICAgICAgICAocGxsdmNvICogcGxsbikgLyAoKChSRUFEX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTFEpID4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19QTExDRkdSX1BMTFFfUG9zKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMVUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAxVSk7CisgICAgICAgIH0gZWxzZSBpZiAoKEhBTF9JU19CSVRfU0VUKFJDQy0+Q1JSQ1IsIFJDQ19DUlJDUl9IU0k0OFJEWSkpICYmCisgICAgICAgICAgICAgICAgICAgKHNyY2NsayA9PSBSQ0NfUk5HQ0xLU09VUkNFX0hTSTQ4KSkgLyogSFNJNDggPyAqLworICAgICAgICB7CisgICAgICAgICAgZnJlcXVlbmN5ID0gSFNJNDhfVkFMVUU7CisgICAgICAgIH0gZWxzZSAvKiBObyBjbG9jayBzb3VyY2UgKi8KKyAgICAgICAgeworICAgICAgICAgIC8qIG5vdGhpbmcgdG8gZG86IGZyZXF1ZW5jeSBhbHJlYWR5IGluaXRpYWxpemVkIHRvIDAgKi8KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBSQ0NfUEVSSVBIQ0xLX0FEQzEyOgorICAgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgQURDMTIgc291cmNlICovCisgICAgICAgIHNyY2NsayA9IF9fSEFMX1JDQ19HRVRfQURDMTJfU09VUkNFKCk7CisKKyAgICAgICAgaWYgKHNyY2NsayA9PSBSQ0NfQURDMTJDTEtTT1VSQ0VfUExMKSB7CisgICAgICAgICAgaWYgKF9fSEFMX1JDQ19HRVRfUExMQ0xLT1VUX0NPTkZJRyhSQ0NfUExMX0FEQ0NMSykgIT0gMFUpIHsKKyAgICAgICAgICAgIC8qIGYoUExMUCkgPSBmKFZDTyBpbnB1dCkgKiBQTExOIC8gUExMUCAqLworICAgICAgICAgICAgcGxsbiA9IFJFQURfQklUKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMTikgPj4KKyAgICAgICAgICAgICAgICAgICBSQ0NfUExMQ0ZHUl9QTExOX1BvczsKKyAgICAgICAgICAgIHBsbHAgPSBSRUFEX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTFBESVYpID4+CisgICAgICAgICAgICAgICAgICAgUkNDX1BMTENGR1JfUExMUERJVl9Qb3M7CisgICAgICAgICAgICBpZiAocGxscCA9PSAwVSkgeworICAgICAgICAgICAgICBpZiAoUkVBRF9CSVQoUkNDLT5QTExDRkdSLCBSQ0NfUExMQ0ZHUl9QTExQKSAhPSAwVSkgeworICAgICAgICAgICAgICAgIHBsbHAgPSAxN1U7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcGxscCA9IDdVOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcmVxdWVuY3kgPSAocGxsdmNvICogcGxsbikgLyBwbGxwOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChzcmNjbGsgPT0gUkNDX0FEQzEyQ0xLU09VUkNFX1NZU0NMSykgeworICAgICAgICAgIGZyZXF1ZW5jeSA9IEhBTF9SQ0NfR2V0U3lzQ2xvY2tGcmVxKCk7CisgICAgICAgIH0KKyAgICAgICAgLyogQ2xvY2sgbm90IGVuYWJsZWQgZm9yIEFEQzEyICovCisgICAgICAgIGVsc2UgeworICAgICAgICAgIC8qIG5vdGhpbmcgdG8gZG86IGZyZXF1ZW5jeSBhbHJlYWR5IGluaXRpYWxpemVkIHRvIDAgKi8KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworI2lmIGRlZmluZWQoQURDMzQ1X0NPTU1PTikKKyAgICAgIGNhc2UgUkNDX1BFUklQSENMS19BREMzNDU6CisgICAgICAgIC8qIEdldCB0aGUgY3VycmVudCBBREMzNDUgc291cmNlICovCisgICAgICAgIHNyY2NsayA9IF9fSEFMX1JDQ19HRVRfQURDMzQ1X1NPVVJDRSgpOworCisgICAgICAgIGlmIChzcmNjbGsgPT0gUkNDX0FEQzM0NUNMS1NPVVJDRV9QTEwpIHsKKyAgICAgICAgICBpZiAoX19IQUxfUkNDX0dFVF9QTExDTEtPVVRfQ09ORklHKFJDQ19QTExfQURDQ0xLKSAhPSAwVSkgeworICAgICAgICAgICAgLyogZihQTExQKSA9IGYoVkNPIGlucHV0KSAqIFBMTE4gLyBQTExQICovCisgICAgICAgICAgICBwbGxuID0gUkVBRF9CSVQoUkNDLT5QTExDRkdSLCBSQ0NfUExMQ0ZHUl9QTExOKSA+PgorICAgICAgICAgICAgICAgICAgIFJDQ19QTExDRkdSX1BMTE5fUG9zOworICAgICAgICAgICAgcGxscCA9IFJFQURfQklUKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMUERJVikgPj4KKyAgICAgICAgICAgICAgICAgICBSQ0NfUExMQ0ZHUl9QTExQRElWX1BvczsKKyAgICAgICAgICAgIGlmIChwbGxwID09IDBVKSB7CisgICAgICAgICAgICAgIGlmIChSRUFEX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTFApICE9IDBVKSB7CisgICAgICAgICAgICAgICAgcGxscCA9IDE3VTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwbGxwID0gN1U7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyZXF1ZW5jeSA9IChwbGx2Y28gKiBwbGxuKSAvIHBsbHA7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHNyY2NsayA9PSBSQ0NfQURDMzQ1Q0xLU09VUkNFX1NZU0NMSykgeworICAgICAgICAgIGZyZXF1ZW5jeSA9IEhBTF9SQ0NfR2V0U3lzQ2xvY2tGcmVxKCk7CisgICAgICAgIH0KKyAgICAgICAgLyogQ2xvY2sgbm90IGVuYWJsZWQgZm9yIEFEQzM0NSAqLworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAvKiBub3RoaW5nIHRvIGRvOiBmcmVxdWVuY3kgYWxyZWFkeSBpbml0aWFsaXplZCB0byAwICovCisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogQURDMzQ1X0NPTU1PTiAqLworCisjaWYgZGVmaW5lZChRVUFEU1BJKQorCisgICAgICBjYXNlIFJDQ19QRVJJUEhDTEtfUVNQSToKKyAgICAgICAgLyogR2V0IHRoZSBjdXJyZW50IFFTUEkgc291cmNlICovCisgICAgICAgIHNyY2NsayA9IF9fSEFMX1JDQ19HRVRfUVNQSV9TT1VSQ0UoKTsKKworICAgICAgICBpZiAoc3JjY2xrID09IFJDQ19RU1BJQ0xLU09VUkNFX1BMTCkgLyogUExMID8gKi8KKyAgICAgICAgeworICAgICAgICAgIC8qIGYoUExMUSkgPSBmKFZDTyBpbnB1dCkgKiBQTExOIC8gUExMUSAqLworICAgICAgICAgIHBsbG4gPQorICAgICAgICAgICAgICBSRUFEX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTE4pID4+IFJDQ19QTExDRkdSX1BMTE5fUG9zOworICAgICAgICAgIGZyZXF1ZW5jeSA9CisgICAgICAgICAgICAgIChwbGx2Y28gKiBwbGxuKSAvICgoKFJFQURfQklUKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMUSkgPj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BMTENGR1JfUExMUV9Qb3MpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxVSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IDFVKTsKKyAgICAgICAgfSBlbHNlIGlmIChzcmNjbGsgPT0gUkNDX1FTUElDTEtTT1VSQ0VfSFNJKSB7CisgICAgICAgICAgZnJlcXVlbmN5ID0gSFNJX1ZBTFVFOworICAgICAgICB9IGVsc2UgaWYgKHNyY2NsayA9PSBSQ0NfUVNQSUNMS1NPVVJDRV9TWVNDTEspIHsKKyAgICAgICAgICBmcmVxdWVuY3kgPSBIQUxfUkNDX0dldFN5c0Nsb2NrRnJlcSgpOworICAgICAgICB9IGVsc2UgLyogTm8gY2xvY2sgc291cmNlICovCisgICAgICAgIHsKKyAgICAgICAgICAvKiBub3RoaW5nIHRvIGRvOiBmcmVxdWVuY3kgYWxyZWFkeSBpbml0aWFsaXplZCB0byAwICovCisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyNlbmRpZiAvKiBRVUFEU1BJICovCisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIHJldHVybiAoZnJlcXVlbmN5KTsKK30KKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBFeHRlbmRlZCBDbG9jayBtYW5hZ2VtZW50CitmdW5jdGlvbnMKKyAqICBAYnJpZWYgIEV4dGVuZGVkIENsb2NrIG1hbmFnZW1lbnQgZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICMjIyMjIEV4dGVuZGVkIGNsb2NrIG1hbmFnZW1lbnQgZnVuY3Rpb25zICAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBjb250cm9sIHRoZQorICAgIGFjdGl2YXRpb24gb3IgZGVhY3RpdmF0aW9uIG9mIExTRSBDU1MsCisgICAgTG93IHNwZWVkIGNsb2NrIG91dHB1dCBhbmQgY2xvY2sgYWZ0ZXIgd2FrZS11cCBmcm9tIFNUT1AgbW9kZS4KK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICogQGJyaWVmICBFbmFibGUgdGhlIExTRSBDbG9jayBTZWN1cml0eSBTeXN0ZW0uCisgKiBAbm90ZSAgIFByaW9yIHRvIGVuYWJsZSB0aGUgTFNFIENsb2NrIFNlY3VyaXR5IFN5c3RlbSwgTFNFIG9zY2lsbGF0b3IgaXMgdG8KKyAqIGJlIGVuYWJsZWQgd2l0aCBIQUxfUkNDX09zY0NvbmZpZygpIGFuZCB0aGUgTFNFIG9zY2lsbGF0b3IgY2xvY2sgaXMgdG8gYmUKKyAqIHNlbGVjdGVkIGFzIFJUQyBjbG9jayB3aXRoIEhBTF9SQ0NFeF9QZXJpcGhDTEtDb25maWcoKS4KKyAqIEByZXR2YWwgTm9uZQorICovCit2b2lkIEhBTF9SQ0NFeF9FbmFibGVMU0VDU1Modm9pZCkgeyBTRVRfQklUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfTFNFQ1NTT04pOyB9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIHRoZSBMU0UgQ2xvY2sgU2VjdXJpdHkgU3lzdGVtLgorICogQG5vdGUgICBMU0UgQ2xvY2sgU2VjdXJpdHkgU3lzdGVtIGNhbiBvbmx5IGJlIGRpc2FibGVkIGFmdGVyIGEgTFNFIGZhaWx1cmUKKyAqIGRldGVjdGlvbi4KKyAqIEByZXR2YWwgTm9uZQorICovCit2b2lkIEhBTF9SQ0NFeF9EaXNhYmxlTFNFQ1NTKHZvaWQpIHsKKyAgQ0xFQVJfQklUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfTFNFQ1NTT04pOworCisgIC8qIERpc2FibGUgTFNFIENTUyBJVCBpZiBhbnkgKi8KKyAgX19IQUxfUkNDX0RJU0FCTEVfSVQoUkNDX0lUX0xTRUNTUyk7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgdGhlIExTRSBDbG9jayBTZWN1cml0eSBTeXN0ZW0gSW50ZXJydXB0ICYgY29ycmVzcG9uZGluZyBFWFRJCisgKiBsaW5lLgorICogQG5vdGUgICBMU0UgQ2xvY2sgU2VjdXJpdHkgU3lzdGVtIEludGVycnVwdCBpcyBtYXBwZWQgb24gUlRDIEVYVEkgbGluZSAxOQorICogQHJldHZhbCBOb25lCisgKi8KK3ZvaWQgSEFMX1JDQ0V4X0VuYWJsZUxTRUNTU19JVCh2b2lkKSB7CisgIC8qIEVuYWJsZSBMU0UgQ1NTICovCisgIFNFVF9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9MU0VDU1NPTik7CisKKyAgLyogRW5hYmxlIExTRSBDU1MgSVQgKi8KKyAgX19IQUxfUkNDX0VOQUJMRV9JVChSQ0NfSVRfTFNFQ1NTKTsKKworICAvKiBFbmFibGUgSVQgb24gRVhUSSBMaW5lIDE5ICovCisgIF9fSEFMX1JDQ19MU0VDU1NfRVhUSV9FTkFCTEVfSVQoKTsKKyAgX19IQUxfUkNDX0xTRUNTU19FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpOworfQorCisvKioKKyAqIEBicmllZiBIYW5kbGUgdGhlIFJDQyBMU0UgQ2xvY2sgU2VjdXJpdHkgU3lzdGVtIGludGVycnVwdCByZXF1ZXN0LgorICogQHJldHZhbCBOb25lCisgKi8KK3ZvaWQgSEFMX1JDQ0V4X0xTRUNTU19JUlFIYW5kbGVyKHZvaWQpIHsKKyAgLyogQ2hlY2sgUkNDIExTRSBDU1NGIGZsYWcgICovCisgIGlmIChfX0hBTF9SQ0NfR0VUX0lUKFJDQ19JVF9MU0VDU1MpKSB7CisgICAgLyogUkNDIExTRSBDbG9jayBTZWN1cml0eSBTeXN0ZW0gaW50ZXJydXB0IHVzZXIgY2FsbGJhY2sgKi8KKyAgICBIQUxfUkNDRXhfTFNFQ1NTX0NhbGxiYWNrKCk7CisKKyAgICAvKiBDbGVhciBSQ0MgTFNFIENTUyBwZW5kaW5nIGJpdCAqLworICAgIF9fSEFMX1JDQ19DTEVBUl9JVChSQ0NfSVRfTFNFQ1NTKTsKKyAgfQorfQorCisvKioKKyAqIEBicmllZiAgUkNDRXggTFNFIENsb2NrIFNlY3VyaXR5IFN5c3RlbSBpbnRlcnJ1cHQgY2FsbGJhY2suCisgKiBAcmV0dmFsIG5vbmUKKyAqLworX193ZWFrIHZvaWQgSEFMX1JDQ0V4X0xTRUNTU19DYWxsYmFjayh2b2lkKSB7CisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBAcmVmIEhBTF9SQ0NFeF9MU0VDU1NfQ2FsbGJhY2sgc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyCisgICAgIGZpbGUKKyAgICovCit9CisKKy8qKgorICogQGJyaWVmICBTZWxlY3QgdGhlIExvdyBTcGVlZCBjbG9jayBzb3VyY2UgdG8gb3V0cHV0IG9uIExTQ08gcGluIChQQTIpLgorICogQHBhcmFtICBMU0NPU291cmNlICBzcGVjaWZpZXMgdGhlIExvdyBTcGVlZCBjbG9jayBzb3VyY2UgdG8gb3V0cHV0LgorICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19MU0NPU09VUkNFX0xTSSAgTFNJIGNsb2NrIHNlbGVjdGVkIGFzIExTQ08gc291cmNlCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFNDT1NPVVJDRV9MU0UgIExTRSBjbG9jayBzZWxlY3RlZCBhcyBMU0NPIHNvdXJjZQorICogQHJldHZhbCBOb25lCisgKi8KK3ZvaWQgSEFMX1JDQ0V4X0VuYWJsZUxTQ08odWludDMyX3QgTFNDT1NvdXJjZSkgeworICBHUElPX0luaXRUeXBlRGVmIEdQSU9fSW5pdFN0cnVjdDsKKyAgRmxhZ1N0YXR1cyBwd3JjbGtjaGFuZ2VkID0gUkVTRVQ7CisgIEZsYWdTdGF0dXMgYmFja3VwY2hhbmdlZCA9IFJFU0VUOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19SQ0NfTFNDT1NPVVJDRShMU0NPU291cmNlKSk7CisKKyAgLyogTFNDTyBQaW4gQ2xvY2sgRW5hYmxlICovCisgIF9fTFNDT19DTEtfRU5BQkxFKCk7CisKKyAgLyogQ29uZmlndXJlIHRoZSBMU0NPIHBpbiBpbiBhbmFsb2cgbW9kZSAqLworICBHUElPX0luaXRTdHJ1Y3QuUGluID0gTFNDT19QSU47CisgIEdQSU9fSW5pdFN0cnVjdC5Nb2RlID0gR1BJT19NT0RFX0FOQUxPRzsKKyAgR1BJT19Jbml0U3RydWN0LlNwZWVkID0gR1BJT19TUEVFRF9GUkVRX0hJR0g7CisgIEdQSU9fSW5pdFN0cnVjdC5QdWxsID0gR1BJT19OT1BVTEw7CisgIEhBTF9HUElPX0luaXQoTFNDT19HUElPX1BPUlQsICZHUElPX0luaXRTdHJ1Y3QpOworCisgIC8qIFVwZGF0ZSBMU0NPU0VMIGNsb2NrIHNvdXJjZSBpbiBCYWNrdXAgRG9tYWluIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyAgaWYgKF9fSEFMX1JDQ19QV1JfSVNfQ0xLX0RJU0FCTEVEKCkpIHsKKyAgICBfX0hBTF9SQ0NfUFdSX0NMS19FTkFCTEUoKTsKKyAgICBwd3JjbGtjaGFuZ2VkID0gU0VUOworICB9CisgIGlmIChIQUxfSVNfQklUX0NMUihQV1ItPkNSMSwgUFdSX0NSMV9EQlApKSB7CisgICAgSEFMX1BXUl9FbmFibGVCa1VwQWNjZXNzKCk7CisgICAgYmFja3VwY2hhbmdlZCA9IFNFVDsKKyAgfQorCisgIE1PRElGWV9SRUcoUkNDLT5CRENSLCBSQ0NfQkRDUl9MU0NPU0VMIHwgUkNDX0JEQ1JfTFNDT0VOLAorICAgICAgICAgICAgIExTQ09Tb3VyY2UgfCBSQ0NfQkRDUl9MU0NPRU4pOworCisgIGlmIChiYWNrdXBjaGFuZ2VkID09IFNFVCkgeworICAgIEhBTF9QV1JfRGlzYWJsZUJrVXBBY2Nlc3MoKTsKKyAgfQorICBpZiAocHdyY2xrY2hhbmdlZCA9PSBTRVQpIHsKKyAgICBfX0hBTF9SQ0NfUFdSX0NMS19ESVNBQkxFKCk7CisgIH0KK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgdGhlIExvdyBTcGVlZCBjbG9jayBvdXRwdXQuCisgKiBAcmV0dmFsIE5vbmUKKyAqLwordm9pZCBIQUxfUkNDRXhfRGlzYWJsZUxTQ08odm9pZCkgeworICBGbGFnU3RhdHVzIHB3cmNsa2NoYW5nZWQgPSBSRVNFVDsKKyAgRmxhZ1N0YXR1cyBiYWNrdXBjaGFuZ2VkID0gUkVTRVQ7CisKKyAgLyogVXBkYXRlIExTQ09FTiBiaXQgaW4gQmFja3VwIERvbWFpbiBjb250cm9sIHJlZ2lzdGVyICovCisgIGlmIChfX0hBTF9SQ0NfUFdSX0lTX0NMS19ESVNBQkxFRCgpKSB7CisgICAgX19IQUxfUkNDX1BXUl9DTEtfRU5BQkxFKCk7CisgICAgcHdyY2xrY2hhbmdlZCA9IFNFVDsKKyAgfQorICBpZiAoSEFMX0lTX0JJVF9DTFIoUFdSLT5DUjEsIFBXUl9DUjFfREJQKSkgeworICAgIC8qIEVuYWJsZSBhY2Nlc3MgdG8gdGhlIGJhY2t1cCBkb21haW4gKi8KKyAgICBIQUxfUFdSX0VuYWJsZUJrVXBBY2Nlc3MoKTsKKyAgICBiYWNrdXBjaGFuZ2VkID0gU0VUOworICB9CisKKyAgQ0xFQVJfQklUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfTFNDT0VOKTsKKworICAvKiBSZXN0b3JlIHByZXZpb3VzIGNvbmZpZ3VyYXRpb24gKi8KKyAgaWYgKGJhY2t1cGNoYW5nZWQgPT0gU0VUKSB7CisgICAgLyogRGlzYWJsZSBhY2Nlc3MgdG8gdGhlIGJhY2t1cCBkb21haW4gKi8KKyAgICBIQUxfUFdSX0Rpc2FibGVCa1VwQWNjZXNzKCk7CisgIH0KKyAgaWYgKHB3cmNsa2NoYW5nZWQgPT0gU0VUKSB7CisgICAgX19IQUxfUkNDX1BXUl9DTEtfRElTQUJMRSgpOworICB9Cit9CisKKy8qKgorICogQH0KKyAqLworCisjaWYgZGVmaW5lZChDUlMpCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBFeHRlbmRlZCBDbG9jayBSZWNvdmVyeSBTeXN0ZW0KK0NvbnRyb2wgZnVuY3Rpb25zCisgKiAgQGJyaWVmICBFeHRlbmRlZCBDbG9jayBSZWNvdmVyeSBTeXN0ZW0gQ29udHJvbCBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgIyMjIyMgRXh0ZW5kZWQgQ2xvY2sgUmVjb3ZlcnkgU3lzdGVtIENvbnRyb2wgZnVuY3Rpb25zICAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICBGb3IgZGV2aWNlcyB3aXRoIENsb2NrIFJlY292ZXJ5IFN5c3RlbSBmZWF0dXJlIChDUlMpLCBSQ0MgRXh0ZW5zaW9uIEhBTAorZHJpdmVyIGNhbiBiZSB1c2VkIGFzIGZvbGxvd3M6CisKKyAgICAgICgjKSBJbiBTeXN0ZW0gY2xvY2sgY29uZmlnLCBIU0k0OCBuZWVkcyB0byBiZSBlbmFibGVkCisKKyAgICAgICgjKSBFbmFibGUgQ1JTIGNsb2NrIGluIElQIE1TUCBpbml0IHdoaWNoIHdpbGwgdXNlIENSUyBmdW5jdGlvbnMKKworICAgICAgKCMpIENhbGwgQ1JTIGZ1bmN0aW9ucyBhcyBmb2xsb3dzOgorICAgICAgICAgICgjIykgUHJlcGFyZSBzeW5jaHJvbml6YXRpb24gY29uZmlndXJhdGlvbiBuZWNlc3NhcnkgZm9yIEhTSTQ4CitjYWxpYnJhdGlvbgorICAgICAgICAgICAgICAoKysrKSBEZWZhdWx0IHZhbHVlcyBjYW4gYmUgc2V0IGZvciBmcmVxdWVuY3kgRXJyb3IgTWVhc3VyZW1lbnQKKyhyZWxvYWQgYW5kIGVycm9yIGxpbWl0KSBhbmQgYWxzbyBIU0k0OCBvc2NpbGxhdG9yIHNtb290aCB0cmltbWluZy4KKyAgICAgICAgICAgICAgKCsrKykgTWFjcm8gX19IQUxfUkNDX0NSU19SRUxPQURWQUxVRV9DQUxDVUxBVEUgY2FuIGJlIGFsc28gdXNlZAordG8gY2FsY3VsYXRlIGRpcmVjdGx5IHJlbG9hZCB2YWx1ZSB3aXRoIHRhcmdldCBhbmQgc3ljaHJvbml6YXRpb24gZnJlcXVlbmNpZXMKK3ZhbHVlcworICAgICAgICAgICgjIykgQ2FsbCBmdW5jdGlvbiBIQUxfUkNDRXhfQ1JTQ29uZmlnIHdoaWNoCisgICAgICAgICAgICAgICgrKyspIFJlc2V0cyBDUlMgcmVnaXN0ZXJzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgorICAgICAgICAgICAgICAoKysrKSBDb25maWd1cmVzIENSUyByZWdpc3RlcnMgd2l0aCBzeW5jaHJvbml6YXRpb24gY29uZmlndXJhdGlvbgorICAgICAgICAgICAgICAoKysrKSBFbmFibGVzIGF1dG9tYXRpYyBjYWxpYnJhdGlvbiBhbmQgZnJlcXVlbmN5IGVycm9yIGNvdW50ZXIKK2ZlYXR1cmUgTm90ZTogV2hlbiB1c2luZyBVU0IgTFBNIChMaW5rIFBvd2VyIE1hbmFnZW1lbnQpIGFuZCB0aGUgZGV2aWNlIGlzIGluCitTbGVlcCBtb2RlLCB0aGUgcGVyaW9kaWMgVVNCIFNPRiB3aWxsIG5vdCBiZSBnZW5lcmF0ZWQgYnkgdGhlIGhvc3QuIE5vIFNZTkMKK3NpZ25hbCB3aWxsIHRoZXJlZm9yZSBiZSBwcm92aWRlZCB0byB0aGUgQ1JTIHRvIGNhbGlicmF0ZSB0aGUgSFNJNDggb24gdGhlIHJ1bi4KK1RvIGd1YXJhbnRlZSB0aGUgcmVxdWlyZWQgY2xvY2sgcHJlY2lzaW9uIGFmdGVyIHdha2luZyB1cCBmcm9tIFNsZWVwIG1vZGUsIHRoZQorTFNFIG9yIHJlZmVyZW5jZSBjbG9jayBvbiB0aGUgR1BJT3Mgc2hvdWxkIGJlIHVzZWQgYXMgU1lOQyBzaWduYWwuCisKKyAgICAgICAgICAoIyMpIEEgcG9sbGluZyBmdW5jdGlvbiBpcyBwcm92aWRlZCB0byB3YWl0IGZvciBjb21wbGV0ZQorc3luY2hyb25pemF0aW9uCisgICAgICAgICAgICAgICgrKyspIENhbGwgZnVuY3Rpb24gSEFMX1JDQ0V4X0NSU1dhaXRTeW5jaHJvbml6YXRpb24oKQorICAgICAgICAgICAgICAoKysrKSBBY2NvcmRpbmcgdG8gQ1JTIHN0YXR1cywgdXNlciBjYW4gZGVjaWRlIHRvIGFkanVzdCBhZ2FpbiB0aGUKK2NhbGlicmF0aW9uIG9yIGNvbnRpbnVlIGFwcGxpY2F0aW9uIGlmIHN5bmNocm9uaXphdGlvbiBpcyBPSworCisgICAgICAoIykgVXNlciBjYW4gcmV0cmlldmUgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBzeW5jaHJvbml6YXRpb24gaW4gY2FsbGluZworZnVuY3Rpb24gSEFMX1JDQ0V4X0NSU0dldFN5bmNocm9uaXphdGlvbkluZm8oKQorCisgICAgICAoIykgUmVnYXJkaW5nIHN5bmNocm9uaXphdGlvbiBzdGF0dXMgYW5kIHN5bmNocm9uaXphdGlvbiBpbmZvcm1hdGlvbiwgdXNlcgorY2FuIHRyeSBhIG5ldyBjYWxpYnJhdGlvbiBpbiBjaGFuZ2luZyBzeW5jaHJvbml6YXRpb24gY29uZmlndXJhdGlvbiBhbmQgY2FsbAorYWdhaW4gSEFMX1JDQ0V4X0NSU0NvbmZpZy4gTm90ZTogV2hlbiB0aGUgU1lOQyBldmVudCBpcyBkZXRlY3RlZCBkdXJpbmcgdGhlCitkb3duY291bnRpbmcgcGhhc2UgKGJlZm9yZSByZWFjaGluZyB0aGUgemVybyB2YWx1ZSksIGl0IG1lYW5zIHRoYXQgdGhlIGFjdHVhbAorZnJlcXVlbmN5IGlzIGxvd2VyIHRoYW4gdGhlIHRhcmdldCAoYW5kIHNvLCB0aGF0IHRoZSBUUklNIHZhbHVlIHNob3VsZCBiZQorICAgICAgICAgICBpbmNyZW1lbnRlZCksIHdoaWxlIHdoZW4gaXQgaXMgZGV0ZWN0ZWQgZHVyaW5nIHRoZSB1cGNvdW50aW5nIHBoYXNlCitpdCBtZWFucyB0aGF0IHRoZSBhY3R1YWwgZnJlcXVlbmN5IGlzIGhpZ2hlciAoYW5kIHRoYXQgdGhlIFRSSU0gdmFsdWUgc2hvdWxkIGJlCitkZWNyZW1lbnRlZCkuCisKKyAgICAgICgjKSBJbiBpbnRlcnJ1cHQgbW9kZSwgdXNlciBjYW4gcmVzb3J0IHRvIHRoZSBhdmFpbGFibGUgbWFjcm9zCisoX19IQUxfUkNDX0NSU19YWFhfSVQpLiBJbnRlcnJ1cHRzIHdpbGwgZ28gdGhyb3VnaCBDUlMgSGFuZGxlcgorKENSU19JUlFuL0NSU19JUlFIYW5kbGVyKQorICAgICAgICAgICAgICAoKyspIENhbGwgZnVuY3Rpb24gSEFMX1JDQ0V4X0NSU0NvbmZpZygpCisgICAgICAgICAgICAgICgrKykgRW5hYmxlIENSU19JUlFuICh0aGFua3MgdG8gTlZJQyBmdW5jdGlvbnMpCisgICAgICAgICAgICAgICgrKykgRW5hYmxlIENSUyBpbnRlcnJ1cHQgKF9fSEFMX1JDQ19DUlNfRU5BQkxFX0lUKQorICAgICAgICAgICAgICAoKyspIEltcGxlbWVudCBDUlMgc3RhdHVzIG1hbmFnZW1lbnQgaW4gdGhlIGZvbGxvd2luZyB1c2VyCitjYWxsYmFja3MgY2FsbGVkIGZyb20gSEFMX1JDQ0V4X0NSU19JUlFIYW5kbGVyKCk6CisgICAgICAgICAgICAgICAgICAgKCsrKykgSEFMX1JDQ0V4X0NSU19TeW5jT2tDYWxsYmFjaygpCisgICAgICAgICAgICAgICAgICAgKCsrKykgSEFMX1JDQ0V4X0NSU19TeW5jV2FybkNhbGxiYWNrKCkKKyAgICAgICAgICAgICAgICAgICAoKysrKSBIQUxfUkNDRXhfQ1JTX0V4cGVjdGVkU3luY0NhbGxiYWNrKCkKKyAgICAgICAgICAgICAgICAgICAoKysrKSBIQUxfUkNDRXhfQ1JTX0Vycm9yQ2FsbGJhY2soKQorCisgICAgICAoIykgVG8gZm9yY2UgYSBTWU5DIEVWRU5ULCB1c2VyIGNhbiB1c2UgdGhlIGZ1bmN0aW9uCitIQUxfUkNDRXhfQ1JTU29mdHdhcmVTeW5jaHJvbml6YXRpb25HZW5lcmF0ZSgpLiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQKK2JlZm9yZSBjYWxsaW5nIEhBTF9SQ0NFeF9DUlNDb25maWcgKGZvciBpbnN0YW5jZSBpbiBTeXN0aWNrIGhhbmRsZXIpCisKK0BlbmR2ZXJiYXRpbQorICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiAgU3RhcnQgYXV0b21hdGljIHN5bmNocm9uaXphdGlvbiBmb3IgcG9sbGluZyBtb2RlCisgKiBAcGFyYW0gIHBJbml0IFBvaW50ZXIgb24gUkNDX0NSU0luaXRUeXBlRGVmIHN0cnVjdHVyZQorICogQHJldHZhbCBOb25lCisgKi8KK3ZvaWQgSEFMX1JDQ0V4X0NSU0NvbmZpZyhSQ0NfQ1JTSW5pdFR5cGVEZWYgKnBJbml0KSB7CisgIHVpbnQzMl90IHZhbHVlOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19SQ0NfQ1JTX1NZTkNfRElWKHBJbml0LT5QcmVzY2FsZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JDQ19DUlNfU1lOQ19TT1VSQ0UocEluaXQtPlNvdXJjZSkpOworICBhc3NlcnRfcGFyYW0oSVNfUkNDX0NSU19TWU5DX1BPTEFSSVRZKHBJbml0LT5Qb2xhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfUkNDX0NSU19SRUxPQURWQUxVRShwSW5pdC0+UmVsb2FkVmFsdWUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JDQ19DUlNfRVJST1JMSU1JVChwSW5pdC0+RXJyb3JMaW1pdFZhbHVlKSk7CisgIGFzc2VydF9wYXJhbShJU19SQ0NfQ1JTX0hTSTQ4Q0FMSUJSQVRJT04ocEluaXQtPkhTSTQ4Q2FsaWJyYXRpb25WYWx1ZSkpOworCisgIC8qIENPTkZJR1VSQVRJT04gKi8KKworICAvKiBCZWZvcmUgY29uZmlndXJhdGlvbiwgcmVzZXQgQ1JTIHJlZ2lzdGVycyB0byB0aGVpciBkZWZhdWx0IHZhbHVlcyovCisgIF9fSEFMX1JDQ19DUlNfRk9SQ0VfUkVTRVQoKTsKKyAgX19IQUxfUkNDX0NSU19SRUxFQVNFX1JFU0VUKCk7CisKKyAgLyogU2V0IHRoZSBTWU5DRElWWzI6MF0gYml0cyBhY2NvcmRpbmcgdG8gUHJlc2NhbGVyIHZhbHVlICovCisgIC8qIFNldCB0aGUgU1lOQ1NSQ1sxOjBdIGJpdHMgYWNjb3JkaW5nIHRvIFNvdXJjZSB2YWx1ZSAqLworICAvKiBTZXQgdGhlIFNZTkNTUE9MIGJpdCBhY2NvcmRpbmcgdG8gUG9sYXJpdHkgdmFsdWUgKi8KKyAgdmFsdWUgPSAocEluaXQtPlByZXNjYWxlciB8IHBJbml0LT5Tb3VyY2UgfCBwSW5pdC0+UG9sYXJpdHkpOworICAvKiBTZXQgdGhlIFJFTE9BRFsxNTowXSBiaXRzIGFjY29yZGluZyB0byBSZWxvYWRWYWx1ZSB2YWx1ZSAqLworICB2YWx1ZSB8PSBwSW5pdC0+UmVsb2FkVmFsdWU7CisgIC8qIFNldCB0aGUgRkVMSU1bNzowXSBiaXRzIGFjY29yZGluZyB0byBFcnJvckxpbWl0VmFsdWUgdmFsdWUgKi8KKyAgdmFsdWUgfD0gKHBJbml0LT5FcnJvckxpbWl0VmFsdWUgPDwgQ1JTX0NGR1JfRkVMSU1fUG9zKTsKKyAgV1JJVEVfUkVHKENSUy0+Q0ZHUiwgdmFsdWUpOworCisgIC8qIEFkanVzdCBIU0k0OCBvc2NpbGxhdG9yIHNtb290aCB0cmltbWluZyAqLworICAvKiBTZXQgdGhlIFRSSU1bNjowXSBiaXRzIGFjY29yZGluZyB0byBSQ0NfQ1JTX0hTSTQ4Q2FsaWJyYXRpb25WYWx1ZSB2YWx1ZSAqLworICBNT0RJRllfUkVHKENSUy0+Q1IsIENSU19DUl9UUklNLAorICAgICAgICAgICAgIChwSW5pdC0+SFNJNDhDYWxpYnJhdGlvblZhbHVlIDw8IENSU19DUl9UUklNX1BvcykpOworCisgIC8qIFNUQVJUIEFVVE9NQVRJQyBTWU5DSFJPTklaQVRJT04qLworCisgIC8qIEVuYWJsZSBBdXRvbWF0aWMgdHJpbW1pbmcgJiBGcmVxdWVuY3kgZXJyb3IgY291bnRlciAqLworICBTRVRfQklUKENSUy0+Q1IsIENSU19DUl9BVVRPVFJJTUVOIHwgQ1JTX0NSX0NFTik7Cit9CisKKy8qKgorICogQGJyaWVmICBHZW5lcmF0ZSB0aGUgc29mdHdhcmUgc3luY2hyb25pemF0aW9uIGV2ZW50CisgKiBAcmV0dmFsIE5vbmUKKyAqLwordm9pZCBIQUxfUkNDRXhfQ1JTU29mdHdhcmVTeW5jaHJvbml6YXRpb25HZW5lcmF0ZSh2b2lkKSB7CisgIFNFVF9CSVQoQ1JTLT5DUiwgQ1JTX0NSX1NXU1lOQyk7Cit9CisKKy8qKgorICogQGJyaWVmICBSZXR1cm4gc3luY2hyb25pemF0aW9uIGluZm8KKyAqIEBwYXJhbSAgcFN5bmNocm9JbmZvIFBvaW50ZXIgb24gUkNDX0NSU1N5bmNocm9JbmZvVHlwZURlZiBzdHJ1Y3R1cmUKKyAqIEByZXR2YWwgTm9uZQorICovCit2b2lkIEhBTF9SQ0NFeF9DUlNHZXRTeW5jaHJvbml6YXRpb25JbmZvKAorICAgIFJDQ19DUlNTeW5jaHJvSW5mb1R5cGVEZWYgKnBTeW5jaHJvSW5mbykgeworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVyICovCisgIGFzc2VydF9wYXJhbShwU3luY2hyb0luZm8gIT0gKHZvaWQgKilOVUxMKTsKKworICAvKiBHZXQgdGhlIHJlbG9hZCB2YWx1ZSAqLworICBwU3luY2hyb0luZm8tPlJlbG9hZFZhbHVlID0gKFJFQURfQklUKENSUy0+Q0ZHUiwgQ1JTX0NGR1JfUkVMT0FEKSk7CisKKyAgLyogR2V0IEhTSTQ4IG9zY2lsbGF0b3Igc21vb3RoIHRyaW1taW5nICovCisgIHBTeW5jaHJvSW5mby0+SFNJNDhDYWxpYnJhdGlvblZhbHVlID0KKyAgICAgIChSRUFEX0JJVChDUlMtPkNSLCBDUlNfQ1JfVFJJTSkgPj4gQ1JTX0NSX1RSSU1fUG9zKTsKKworICAvKiBHZXQgRnJlcXVlbmN5IGVycm9yIGNhcHR1cmUgKi8KKyAgcFN5bmNocm9JbmZvLT5GcmVxRXJyb3JDYXB0dXJlID0KKyAgICAgIChSRUFEX0JJVChDUlMtPklTUiwgQ1JTX0lTUl9GRUNBUCkgPj4gQ1JTX0lTUl9GRUNBUF9Qb3MpOworCisgIC8qIEdldCBGcmVxdWVuY3kgZXJyb3IgZGlyZWN0aW9uICovCisgIHBTeW5jaHJvSW5mby0+RnJlcUVycm9yRGlyZWN0aW9uID0gKFJFQURfQklUKENSUy0+SVNSLCBDUlNfSVNSX0ZFRElSKSk7Cit9CisKKy8qKgorICogQGJyaWVmIFdhaXQgZm9yIENSUyBTeW5jaHJvbml6YXRpb24gc3RhdHVzLgorICogQHBhcmFtIFRpbWVvdXQgIER1cmF0aW9uIG9mIHRoZSB0aW1lb3V0CisgKiBAbm90ZSAgVGltZW91dCBpcyBiYXNlZCBvbiB0aGUgbWF4aW11bSB0aW1lIHRvIHJlY2VpdmUgYSBTWU5DIGV2ZW50IGJhc2VkIG9uCisgKiBzeW5jaHJvbml6YXRpb24gZnJlcXVlbmN5LgorICogQG5vdGUgICAgSWYgVGltZW91dCBzZXQgdG8gSEFMX01BWF9ERUxBWSwgSEFMX1RJTUVPVVQgd2lsbCBiZSBuZXZlciByZXR1cm5lZC4KKyAqIEByZXR2YWwgQ29tYmluYXRpb24gb2YgU3luY2hyb25pemF0aW9uIHN0YXR1cworICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQ1JTX1RJTUVPVVQKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfU1lOQ09LCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQ1JTX1NZTkNXQVJOCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQ1JTX1NZTkNFUlIKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfU1lOQ01JU1MKKyAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfVFJJTU9WRgorICovCit1aW50MzJfdCBIQUxfUkNDRXhfQ1JTV2FpdFN5bmNocm9uaXphdGlvbih1aW50MzJfdCBUaW1lb3V0KSB7CisgIHVpbnQzMl90IGNyc3N0YXR1cyA9IFJDQ19DUlNfTk9ORTsKKyAgdWludDMyX3QgdGlja3N0YXJ0OworCisgIC8qIEdldCB0aW1lb3V0ICovCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgLyogV2FpdCBmb3IgQ1JTIGZsYWcgb3IgdGltZW91dCBkZXRlY3Rpb24gKi8KKyAgZG8geworICAgIGlmIChUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpIHsKKyAgICAgIGlmICgoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gVGltZW91dCkgfHwgKFRpbWVvdXQgPT0gMFUpKSB7CisgICAgICAgIGNyc3N0YXR1cyA9IFJDQ19DUlNfVElNRU9VVDsKKyAgICAgIH0KKyAgICB9CisgICAgLyogQ2hlY2sgQ1JTIFNZTkNPSyBmbGFnICAqLworICAgIGlmIChfX0hBTF9SQ0NfQ1JTX0dFVF9GTEFHKFJDQ19DUlNfRkxBR19TWU5DT0spKSB7CisgICAgICAvKiBDUlMgU1lOQyBldmVudCBPSyAqLworICAgICAgY3Jzc3RhdHVzIHw9IFJDQ19DUlNfU1lOQ09LOworCisgICAgICAvKiBDbGVhciBDUlMgU1lOQyBldmVudCBPSyBiaXQgKi8KKyAgICAgIF9fSEFMX1JDQ19DUlNfQ0xFQVJfRkxBRyhSQ0NfQ1JTX0ZMQUdfU1lOQ09LKTsKKyAgICB9CisKKyAgICAvKiBDaGVjayBDUlMgU1lOQ1dBUk4gZmxhZyAgKi8KKyAgICBpZiAoX19IQUxfUkNDX0NSU19HRVRfRkxBRyhSQ0NfQ1JTX0ZMQUdfU1lOQ1dBUk4pKSB7CisgICAgICAvKiBDUlMgU1lOQyB3YXJuaW5nICovCisgICAgICBjcnNzdGF0dXMgfD0gUkNDX0NSU19TWU5DV0FSTjsKKworICAgICAgLyogQ2xlYXIgQ1JTIFNZTkNXQVJOIGJpdCAqLworICAgICAgX19IQUxfUkNDX0NSU19DTEVBUl9GTEFHKFJDQ19DUlNfRkxBR19TWU5DV0FSTik7CisgICAgfQorCisgICAgLyogQ2hlY2sgQ1JTIFRSSU0gb3ZlcmZsb3cgZmxhZyAgKi8KKyAgICBpZiAoX19IQUxfUkNDX0NSU19HRVRfRkxBRyhSQ0NfQ1JTX0ZMQUdfVFJJTU9WRikpIHsKKyAgICAgIC8qIENSUyBTWU5DIEVycm9yICovCisgICAgICBjcnNzdGF0dXMgfD0gUkNDX0NSU19UUklNT1ZGOworCisgICAgICAvKiBDbGVhciBDUlMgRXJyb3IgYml0ICovCisgICAgICBfX0hBTF9SQ0NfQ1JTX0NMRUFSX0ZMQUcoUkNDX0NSU19GTEFHX1RSSU1PVkYpOworICAgIH0KKworICAgIC8qIENoZWNrIENSUyBFcnJvciBmbGFnICAqLworICAgIGlmIChfX0hBTF9SQ0NfQ1JTX0dFVF9GTEFHKFJDQ19DUlNfRkxBR19TWU5DRVJSKSkgeworICAgICAgLyogQ1JTIFNZTkMgRXJyb3IgKi8KKyAgICAgIGNyc3N0YXR1cyB8PSBSQ0NfQ1JTX1NZTkNFUlI7CisKKyAgICAgIC8qIENsZWFyIENSUyBFcnJvciBiaXQgKi8KKyAgICAgIF9fSEFMX1JDQ19DUlNfQ0xFQVJfRkxBRyhSQ0NfQ1JTX0ZMQUdfU1lOQ0VSUik7CisgICAgfQorCisgICAgLyogQ2hlY2sgQ1JTIFNZTkMgTWlzc2VkIGZsYWcgICovCisgICAgaWYgKF9fSEFMX1JDQ19DUlNfR0VUX0ZMQUcoUkNDX0NSU19GTEFHX1NZTkNNSVNTKSkgeworICAgICAgLyogQ1JTIFNZTkMgTWlzc2VkICovCisgICAgICBjcnNzdGF0dXMgfD0gUkNDX0NSU19TWU5DTUlTUzsKKworICAgICAgLyogQ2xlYXIgQ1JTIFNZTkMgTWlzc2VkIGJpdCAqLworICAgICAgX19IQUxfUkNDX0NSU19DTEVBUl9GTEFHKFJDQ19DUlNfRkxBR19TWU5DTUlTUyk7CisgICAgfQorCisgICAgLyogQ2hlY2sgQ1JTIEV4cGVjdGVkIFNZTkMgZmxhZyAgKi8KKyAgICBpZiAoX19IQUxfUkNDX0NSU19HRVRfRkxBRyhSQ0NfQ1JTX0ZMQUdfRVNZTkMpKSB7CisgICAgICAvKiBmcmVxdWVuY3kgZXJyb3IgY291bnRlciByZWFjaGVkIGEgemVybyB2YWx1ZSAqLworICAgICAgX19IQUxfUkNDX0NSU19DTEVBUl9GTEFHKFJDQ19DUlNfRkxBR19FU1lOQyk7CisgICAgfQorICB9IHdoaWxlIChSQ0NfQ1JTX05PTkUgPT0gY3Jzc3RhdHVzKTsKKworICByZXR1cm4gY3Jzc3RhdHVzOworfQorCisvKioKKyAqIEBicmllZiBIYW5kbGUgdGhlIENsb2NrIFJlY292ZXJ5IFN5c3RlbSBpbnRlcnJ1cHQgcmVxdWVzdC4KKyAqIEByZXR2YWwgTm9uZQorICovCit2b2lkIEhBTF9SQ0NFeF9DUlNfSVJRSGFuZGxlcih2b2lkKSB7CisgIHVpbnQzMl90IGNyc2Vycm9yID0gUkNDX0NSU19OT05FOworICAvKiBHZXQgY3VycmVudCBJVCBmbGFncyBhbmQgSVQgc291cmNlcyB2YWx1ZXMgKi8KKyAgdWludDMyX3QgaXRmbGFncyA9IFJFQURfUkVHKENSUy0+SVNSKTsKKyAgdWludDMyX3QgaXRzb3VyY2VzID0gUkVBRF9SRUcoQ1JTLT5DUik7CisKKyAgLyogQ2hlY2sgQ1JTIFNZTkNPSyBmbGFnICAqLworICBpZiAoKChpdGZsYWdzICYgUkNDX0NSU19GTEFHX1NZTkNPSykgIT0gMFUpICYmCisgICAgICAoKGl0c291cmNlcyAmIFJDQ19DUlNfSVRfU1lOQ09LKSAhPSAwVSkpIHsKKyAgICAvKiBDbGVhciBDUlMgU1lOQyBldmVudCBPSyBmbGFnICovCisgICAgV1JJVEVfUkVHKENSUy0+SUNSLCBDUlNfSUNSX1NZTkNPS0MpOworCisgICAgLyogdXNlciBjYWxsYmFjayAqLworICAgIEhBTF9SQ0NFeF9DUlNfU3luY09rQ2FsbGJhY2soKTsKKyAgfQorICAvKiBDaGVjayBDUlMgU1lOQ1dBUk4gZmxhZyAgKi8KKyAgZWxzZSBpZiAoKChpdGZsYWdzICYgUkNDX0NSU19GTEFHX1NZTkNXQVJOKSAhPSAwVSkgJiYKKyAgICAgICAgICAgKChpdHNvdXJjZXMgJiBSQ0NfQ1JTX0lUX1NZTkNXQVJOKSAhPSAwVSkpIHsKKyAgICAvKiBDbGVhciBDUlMgU1lOQ1dBUk4gZmxhZyAqLworICAgIFdSSVRFX1JFRyhDUlMtPklDUiwgQ1JTX0lDUl9TWU5DV0FSTkMpOworCisgICAgLyogdXNlciBjYWxsYmFjayAqLworICAgIEhBTF9SQ0NFeF9DUlNfU3luY1dhcm5DYWxsYmFjaygpOworICB9CisgIC8qIENoZWNrIENSUyBFeHBlY3RlZCBTWU5DIGZsYWcgICovCisgIGVsc2UgaWYgKCgoaXRmbGFncyAmIFJDQ19DUlNfRkxBR19FU1lOQykgIT0gMFUpICYmCisgICAgICAgICAgICgoaXRzb3VyY2VzICYgUkNDX0NSU19JVF9FU1lOQykgIT0gMFUpKSB7CisgICAgLyogZnJlcXVlbmN5IGVycm9yIGNvdW50ZXIgcmVhY2hlZCBhIHplcm8gdmFsdWUgKi8KKyAgICBXUklURV9SRUcoQ1JTLT5JQ1IsIENSU19JQ1JfRVNZTkNDKTsKKworICAgIC8qIHVzZXIgY2FsbGJhY2sgKi8KKyAgICBIQUxfUkNDRXhfQ1JTX0V4cGVjdGVkU3luY0NhbGxiYWNrKCk7CisgIH0KKyAgLyogQ2hlY2sgQ1JTIEVycm9yIGZsYWdzICAqLworICBlbHNlIHsKKyAgICBpZiAoKChpdGZsYWdzICYgUkNDX0NSU19GTEFHX0VSUikgIT0gMFUpICYmCisgICAgICAgICgoaXRzb3VyY2VzICYgUkNDX0NSU19JVF9FUlIpICE9IDBVKSkgeworICAgICAgaWYgKChpdGZsYWdzICYgUkNDX0NSU19GTEFHX1NZTkNFUlIpICE9IDBVKSB7CisgICAgICAgIGNyc2Vycm9yIHw9IFJDQ19DUlNfU1lOQ0VSUjsKKyAgICAgIH0KKyAgICAgIGlmICgoaXRmbGFncyAmIFJDQ19DUlNfRkxBR19TWU5DTUlTUykgIT0gMFUpIHsKKyAgICAgICAgY3JzZXJyb3IgfD0gUkNDX0NSU19TWU5DTUlTUzsKKyAgICAgIH0KKyAgICAgIGlmICgoaXRmbGFncyAmIFJDQ19DUlNfRkxBR19UUklNT1ZGKSAhPSAwVSkgeworICAgICAgICBjcnNlcnJvciB8PSBSQ0NfQ1JTX1RSSU1PVkY7CisgICAgICB9CisKKyAgICAgIC8qIENsZWFyIENSUyBFcnJvciBmbGFncyAqLworICAgICAgV1JJVEVfUkVHKENSUy0+SUNSLCBDUlNfSUNSX0VSUkMpOworCisgICAgICAvKiB1c2VyIGVycm9yIGNhbGxiYWNrICovCisgICAgICBIQUxfUkNDRXhfQ1JTX0Vycm9yQ2FsbGJhY2soY3JzZXJyb3IpOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIEBicmllZiAgUkNDRXggQ2xvY2sgUmVjb3ZlcnkgU3lzdGVtIFNZTkNPSyBpbnRlcnJ1cHQgY2FsbGJhY2suCisgKiBAcmV0dmFsIG5vbmUKKyAqLworX193ZWFrIHZvaWQgSEFMX1JDQ0V4X0NSU19TeW5jT2tDYWxsYmFjayh2b2lkKSB7CisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBAcmVmIEhBTF9SQ0NFeF9DUlNfU3luY09rQ2FsbGJhY2sgc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZQorICAgICB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICogQGJyaWVmICBSQ0NFeCBDbG9jayBSZWNvdmVyeSBTeXN0ZW0gU1lOQ1dBUk4gaW50ZXJydXB0IGNhbGxiYWNrLgorICogQHJldHZhbCBub25lCisgKi8KK19fd2VhayB2b2lkIEhBTF9SQ0NFeF9DUlNfU3luY1dhcm5DYWxsYmFjayh2b2lkKSB7CisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBAcmVmIEhBTF9SQ0NFeF9DUlNfU3luY1dhcm5DYWxsYmFjayBzaG91bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlCisgICAgIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgKiBAYnJpZWYgIFJDQ0V4IENsb2NrIFJlY292ZXJ5IFN5c3RlbSBFeHBlY3RlZCBTWU5DIGludGVycnVwdCBjYWxsYmFjay4KKyAqIEByZXR2YWwgbm9uZQorICovCitfX3dlYWsgdm9pZCBIQUxfUkNDRXhfQ1JTX0V4cGVjdGVkU3luY0NhbGxiYWNrKHZvaWQpIHsKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEByZWYgSEFMX1JDQ0V4X0NSU19FeHBlY3RlZFN5bmNDYWxsYmFjayBzaG91bGQgYmUgaW1wbGVtZW50ZWQgaW4KKyAgICAgdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgKiBAYnJpZWYgIFJDQ0V4IENsb2NrIFJlY292ZXJ5IFN5c3RlbSBFcnJvciBpbnRlcnJ1cHQgY2FsbGJhY2suCisgKiBAcGFyYW0gIEVycm9yIENvbWJpbmF0aW9uIG9mIEVycm9yIHN0YXR1cy4KKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfU1lOQ0VSUgorICogICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQ1JTX1NZTkNNSVNTCisgKiAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfVFJJTU9WRgorICogQHJldHZhbCBub25lCisgKi8KK19fd2VhayB2b2lkIEhBTF9SQ0NFeF9DUlNfRXJyb3JDYWxsYmFjayh1aW50MzJfdCBFcnJvcikgeworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChFcnJvcik7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEByZWYgSEFMX1JDQ0V4X0NSU19FcnJvckNhbGxiYWNrIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUKKyAgICAgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAqIEB9CisgKi8KKworI2VuZGlmIC8qIENSUyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBhZGR0b2dyb3VwIFJDQ0V4X1ByaXZhdGVfRnVuY3Rpb25zCisgKiBAeworICovCisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworI2VuZGlmIC8qIEhBTF9SQ0NfTU9EVUxFX0VOQUJMRUQgKi8KKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KZGlmZiAtLWdpdCBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9zcGkuYyBiL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9zcGkuYwppbmRleCBhMDA1YmYzLi5jMjg0NGQzIDEwMDY0NAotLS0gYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfc3BpLmMKKysrIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3NwaS5jCkBAIC0xLDQyMTMgKzEsNDIxNyBAQAotLyoqDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICogQGZpbGUgICAgc3RtMzJnNHh4X2hhbF9zcGkuYw0KLSAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQ0KLSAgKiBAYnJpZWYgICBTUEkgSEFMIG1vZHVsZSBkcml2ZXIuDQotICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcNCi0gICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBTZXJpYWwgUGVyaXBoZXJhbCBJbnRlcmZhY2UgKFNQSSkNCi0gIHBlcmlwaGVyYWw6DQotICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMNCi0gICogICAgICAgICAgICsgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucw0KLSAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zDQotICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICogQGF0dGVudGlvbg0KLSAgKg0KLSAgKiBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLg0KLSAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KLSAgKg0KLSAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRlcm1zIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUNCi0gICogaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc29mdHdhcmUgY29tcG9uZW50Lg0KLSAgKiBJZiBubyBMSUNFTlNFIGZpbGUgY29tZXMgd2l0aCB0aGlzIHNvZnR3YXJlLCBpdCBpcyBwcm92aWRlZCBBUy1JUy4NCi0gICoNCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgQHZlcmJhdGltDQotICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjDQotICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgWy4uXQ0KLSAgICAgIFRoZSBTUEkgSEFMIGRyaXZlciBjYW4gYmUgdXNlZCBhcyBmb2xsb3dzOg0KLQ0KLSAgICAgICgjKSBEZWNsYXJlIGEgU1BJX0hhbmRsZVR5cGVEZWYgaGFuZGxlIHN0cnVjdHVyZSwgZm9yIGV4YW1wbGU6DQotICAgICAgICAgIFNQSV9IYW5kbGVUeXBlRGVmICBoc3BpOw0KLQ0KLSAgICAgICgjKUluaXRpYWxpemUgdGhlIFNQSSBsb3cgbGV2ZWwgcmVzb3VyY2VzIGJ5IGltcGxlbWVudGluZyB0aGUNCi0gIEhBTF9TUElfTXNwSW5pdCgpIEFQSToNCi0gICAgICAgICAgKCMjKSBFbmFibGUgdGhlIFNQSXggaW50ZXJmYWNlIGNsb2NrDQotICAgICAgICAgICgjIykgU1BJIHBpbnMgY29uZmlndXJhdGlvbg0KLSAgICAgICAgICAgICAgKCsrKykgRW5hYmxlIHRoZSBjbG9jayBmb3IgdGhlIFNQSSBHUElPcw0KLSAgICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZXNlIFNQSSBwaW5zIGFzIGFsdGVybmF0ZSBmdW5jdGlvbiBwdXNoLXB1bGwNCi0gICAgICAgICAgKCMjKSBOVklDIGNvbmZpZ3VyYXRpb24gaWYgeW91IG5lZWQgdG8gdXNlIGludGVycnVwdCBwcm9jZXNzDQotICAgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIFNQSXggaW50ZXJydXB0IHByaW9yaXR5DQotICAgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIE5WSUMgU1BJIElSUSBoYW5kbGUNCi0gICAgICAgICAgKCMjKSBETUEgQ29uZmlndXJhdGlvbiBpZiB5b3UgbmVlZCB0byB1c2UgRE1BIHByb2Nlc3MNCi0gICAgICAgICAgICAgICgrKyspIERlY2xhcmUgYSBETUFfSGFuZGxlVHlwZURlZiBoYW5kbGUgc3RydWN0dXJlIGZvciB0aGUNCi0gIHRyYW5zbWl0IG9yIHJlY2VpdmUgU3RyZWFtL0NoYW5uZWwNCi0gICAgICAgICAgICAgICgrKyspIEVuYWJsZSB0aGUgRE1BeCBjbG9jaw0KLSAgICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZSBETUEgaGFuZGxlIHBhcmFtZXRlcnMNCi0gICAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgRE1BIFR4IG9yIFJ4IFN0cmVhbS9DaGFubmVsDQotICAgICAgICAgICAgICAoKysrKSBBc3NvY2lhdGUgdGhlIGluaXRpYWxpemVkIGhkbWFfdHgob3IgX3J4KSAgaGFuZGxlIHRvIHRoZQ0KLSAgaHNwaSBETUEgVHggb3IgUnggaGFuZGxlDQotICAgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIHByaW9yaXR5IGFuZCBlbmFibGUgdGhlIE5WSUMgZm9yIHRoZSB0cmFuc2Zlcg0KLSAgY29tcGxldGUgaW50ZXJydXB0IG9uIHRoZSBETUEgVHggb3IgUnggU3RyZWFtL0NoYW5uZWwNCi0NCi0gICAgICAoIykgUHJvZ3JhbSB0aGUgTW9kZSwgQmlkaXJlY3Rpb25hbE1vZGUgLCBEYXRhIHNpemUsIEJhdWRyYXRlIFByZXNjYWxlciwNCi0gIE5TUyBtYW5hZ2VtZW50LCBDbG9jayBwb2xhcml0eSBhbmQgcGhhc2UsIEZpcnN0Qml0IGFuZCBDUkMgY29uZmlndXJhdGlvbiBpbg0KLSAgdGhlIGhzcGkgSW5pdCBzdHJ1Y3R1cmUuDQotDQotICAgICAgKCMpIEluaXRpYWxpemUgdGhlIFNQSSByZWdpc3RlcnMgYnkgY2FsbGluZyB0aGUgSEFMX1NQSV9Jbml0KCkgQVBJOg0KLSAgICAgICAgICAoKyspIFRoaXMgQVBJIGNvbmZpZ3VyZXMgYWxzbyB0aGUgbG93IGxldmVsIEhhcmR3YXJlIEdQSU8sIENMT0NLLA0KLSAgQ09SVEVYLi4uZXRjKSBieSBjYWxsaW5nIHRoZSBjdXN0b21pemVkIEhBTF9TUElfTXNwSW5pdCgpIEFQSS4NCi0gICAgIFsuLl0NCi0gICAgICAgQ2lyY3VsYXIgbW9kZSByZXN0cmljdGlvbjoNCi0gICAgICAoIykgVGhlIERNQSBjaXJjdWxhciBtb2RlIGNhbm5vdCBiZSB1c2VkIHdoZW4gdGhlIFNQSSBpcyBjb25maWd1cmVkIGluDQotICB0aGVzZSBtb2RlczoNCi0gICAgICAgICAgKCMjKSBNYXN0ZXIgMkxpbmVzIFJ4T25seQ0KLSAgICAgICAgICAoIyMpIE1hc3RlciAxTGluZSBSeA0KLSAgICAgICgjKSBUaGUgQ1JDIGZlYXR1cmUgaXMgbm90IG1hbmFnZWQgd2hlbiB0aGUgRE1BIGNpcmN1bGFyIG1vZGUgaXMgZW5hYmxlZA0KLSAgICAgICgjKSBXaGVuIHRoZSBTUEkgRE1BIFBhdXNlL1N0b3AgZmVhdHVyZXMgYXJlIHVzZWQsIHdlIG11c3QgdXNlIHRoZQ0KLSAgZm9sbG93aW5nIEFQSXMgdGhlIEhBTF9TUElfRE1BUGF1c2UoKS8gSEFMX1NQSV9ETUFTdG9wKCkgb25seSB1bmRlciB0aGUgU1BJDQotICBjYWxsYmFja3MNCi0gICAgIFsuLl0NCi0gICAgICAgTWFzdGVyIFJlY2VpdmUgbW9kZSByZXN0cmljdGlvbjoNCi0gICAgICAoIykgSW4gTWFzdGVyIHVuaWRpcmVjdGlvbmFsIHJlY2VpdmUtb25seSBtb2RlIChNU1RSID0xLCBCSURJTU9ERT0wLA0KLSAgUlhPTkxZPTEpIG9yIGJpZGlyZWN0aW9uYWwgcmVjZWl2ZSBtb2RlIChNU1RSPTEsIEJJRElNT0RFPTEsIEJJRElPRT0wKSwgdG8NCi0gIGVuc3VyZSB0aGF0IHRoZSBTUEkgZG9lcyBub3QgaW5pdGlhdGUgYSBuZXcgdHJhbnNmZXIgdGhlIGZvbGxvd2luZyBwcm9jZWR1cmUNCi0gIGhhcyB0byBiZSByZXNwZWN0ZWQ6DQotICAgICAgICAgICgjIykgSEFMX1NQSV9EZUluaXQoKQ0KLSAgICAgICAgICAoIyMpIEhBTF9TUElfSW5pdCgpDQotICAgICBbLi5dDQotICAgICAgIENhbGxiYWNrIHJlZ2lzdHJhdGlvbjoNCi0NCi0gICAgICAoIykgVGhlIGNvbXBpbGF0aW9uIGZsYWcgVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTIHdoZW4gc2V0IHRvIDFVDQotICAgICAgICAgIGFsbG93cyB0aGUgdXNlciB0byBjb25maWd1cmUgZHluYW1pY2FsbHkgdGhlIGRyaXZlciBjYWxsYmFja3MuDQotICAgICAgICAgIFVzZSBGdW5jdGlvbnMgSEFMX1NQSV9SZWdpc3RlckNhbGxiYWNrKCkgdG8gcmVnaXN0ZXIgYW4gaW50ZXJydXB0DQotICBjYWxsYmFjay4NCi0NCi0gICAgICAgICAgRnVuY3Rpb24gSEFMX1NQSV9SZWdpc3RlckNhbGxiYWNrKCkgYWxsb3dzIHRvIHJlZ2lzdGVyIGZvbGxvd2luZw0KLSAgY2FsbGJhY2tzOg0KLSAgICAgICAgICAgICgrKykgVHhDcGx0Q2FsbGJhY2sgICAgICAgIDogU1BJIFR4IENvbXBsZXRlZCBjYWxsYmFjaw0KLSAgICAgICAgICAgICgrKykgUnhDcGx0Q2FsbGJhY2sgICAgICAgIDogU1BJIFJ4IENvbXBsZXRlZCBjYWxsYmFjaw0KLSAgICAgICAgICAgICgrKykgVHhSeENwbHRDYWxsYmFjayAgICAgIDogU1BJIFR4UnggQ29tcGxldGVkIGNhbGxiYWNrDQotICAgICAgICAgICAgKCsrKSBUeEhhbGZDcGx0Q2FsbGJhY2sgICAgOiBTUEkgVHggSGFsZiBDb21wbGV0ZWQgY2FsbGJhY2sNCi0gICAgICAgICAgICAoKyspIFJ4SGFsZkNwbHRDYWxsYmFjayAgICA6IFNQSSBSeCBIYWxmIENvbXBsZXRlZCBjYWxsYmFjaw0KLSAgICAgICAgICAgICgrKykgVHhSeEhhbGZDcGx0Q2FsbGJhY2sgIDogU1BJIFR4UnggSGFsZiBDb21wbGV0ZWQgY2FsbGJhY2sNCi0gICAgICAgICAgICAoKyspIEVycm9yQ2FsbGJhY2sgICAgICAgICA6IFNQSSBFcnJvciBjYWxsYmFjaw0KLSAgICAgICAgICAgICgrKykgQWJvcnRDcGx0Q2FsbGJhY2sgICAgIDogU1BJIEFib3J0IGNhbGxiYWNrDQotICAgICAgICAgICAgKCsrKSBNc3BJbml0Q2FsbGJhY2sgICAgICAgOiBTUEkgTXNwIEluaXQgY2FsbGJhY2sNCi0gICAgICAgICAgICAoKyspIE1zcERlSW5pdENhbGxiYWNrICAgICA6IFNQSSBNc3AgRGVJbml0IGNhbGxiYWNrDQotICAgICAgICAgIFRoaXMgZnVuY3Rpb24gdGFrZXMgYXMgcGFyYW1ldGVycyB0aGUgSEFMIHBlcmlwaGVyYWwgaGFuZGxlLCB0aGUNCi0gIENhbGxiYWNrIElEIGFuZCBhIHBvaW50ZXIgdG8gdGhlIHVzZXIgY2FsbGJhY2sgZnVuY3Rpb24uDQotDQotDQotICAgICAgKCMpIFVzZSBmdW5jdGlvbiBIQUxfU1BJX1VuUmVnaXN0ZXJDYWxsYmFjayB0byByZXNldCBhIGNhbGxiYWNrIHRvIHRoZQ0KLSAgZGVmYXVsdCB3ZWFrIGZ1bmN0aW9uLiBIQUxfU1BJX1VuUmVnaXN0ZXJDYWxsYmFjayB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZSBIQUwNCi0gIHBlcmlwaGVyYWwgaGFuZGxlLCBhbmQgdGhlIENhbGxiYWNrIElELiBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0byByZXNldA0KLSAgZm9sbG93aW5nIGNhbGxiYWNrczoNCi0gICAgICAgICAgICAoKyspIFR4Q3BsdENhbGxiYWNrICAgICAgICA6IFNQSSBUeCBDb21wbGV0ZWQgY2FsbGJhY2sNCi0gICAgICAgICAgICAoKyspIFJ4Q3BsdENhbGxiYWNrICAgICAgICA6IFNQSSBSeCBDb21wbGV0ZWQgY2FsbGJhY2sNCi0gICAgICAgICAgICAoKyspIFR4UnhDcGx0Q2FsbGJhY2sgICAgICA6IFNQSSBUeFJ4IENvbXBsZXRlZCBjYWxsYmFjaw0KLSAgICAgICAgICAgICgrKykgVHhIYWxmQ3BsdENhbGxiYWNrICAgIDogU1BJIFR4IEhhbGYgQ29tcGxldGVkIGNhbGxiYWNrDQotICAgICAgICAgICAgKCsrKSBSeEhhbGZDcGx0Q2FsbGJhY2sgICAgOiBTUEkgUnggSGFsZiBDb21wbGV0ZWQgY2FsbGJhY2sNCi0gICAgICAgICAgICAoKyspIFR4UnhIYWxmQ3BsdENhbGxiYWNrICA6IFNQSSBUeFJ4IEhhbGYgQ29tcGxldGVkIGNhbGxiYWNrDQotICAgICAgICAgICAgKCsrKSBFcnJvckNhbGxiYWNrICAgICAgICAgOiBTUEkgRXJyb3IgY2FsbGJhY2sNCi0gICAgICAgICAgICAoKyspIEFib3J0Q3BsdENhbGxiYWNrICAgICA6IFNQSSBBYm9ydCBjYWxsYmFjaw0KLSAgICAgICAgICAgICgrKykgTXNwSW5pdENhbGxiYWNrICAgICAgIDogU1BJIE1zcCBJbml0IGNhbGxiYWNrDQotICAgICAgICAgICAgKCsrKSBNc3BEZUluaXRDYWxsYmFjayAgICAgOiBTUEkgTXNwIERlSW5pdCBjYWxsYmFjaw0KLQ0KLSAgICAgICBbLi5dDQotICAgICAgIEJ5IGRlZmF1bHQsIGFmdGVyIHRoZSBIQUxfU1BJX0luaXQoKSBhbmQgd2hlbiB0aGUgc3RhdGUgaXMNCi0gIEhBTF9TUElfU1RBVEVfUkVTRVQgYWxsIGNhbGxiYWNrcyBhcmUgc2V0IHRvIHRoZSBjb3JyZXNwb25kaW5nIHdlYWsgZnVuY3Rpb25zOg0KLSAgICAgICBleGFtcGxlcyBIQUxfU1BJX01hc3RlclR4Q3BsdENhbGxiYWNrKCksIEhBTF9TUElfTWFzdGVyUnhDcGx0Q2FsbGJhY2soKS4NCi0gICAgICAgRXhjZXB0aW9uIGRvbmUgZm9yIE1zcEluaXQgYW5kIE1zcERlSW5pdCBmdW5jdGlvbnMgdGhhdCBhcmUNCi0gICAgICAgcmVzZXQgdG8gdGhlIGxlZ2FjeSB3ZWFrIGZ1bmN0aW9ucyBpbiB0aGUgSEFMX1NQSV9Jbml0KCkvDQotICBIQUxfU1BJX0RlSW5pdCgpIG9ubHkgd2hlbiB0aGVzZSBjYWxsYmFja3MgYXJlIG51bGwgKG5vdCByZWdpc3RlcmVkDQotICBiZWZvcmVoYW5kKS4gSWYgTXNwSW5pdCBvciBNc3BEZUluaXQgYXJlIG5vdCBudWxsLCB0aGUgSEFMX1NQSV9Jbml0KCkvDQotICBIQUxfU1BJX0RlSW5pdCgpIGtlZXAgYW5kIHVzZSB0aGUgdXNlciBNc3BJbml0L01zcERlSW5pdCBjYWxsYmFja3MgKHJlZ2lzdGVyZWQNCi0gIGJlZm9yZWhhbmQpIHdoYXRldmVyIHRoZSBzdGF0ZS4NCi0NCi0gICAgICAgWy4uXQ0KLSAgICAgICBDYWxsYmFja3MgY2FuIGJlIHJlZ2lzdGVyZWQvdW5yZWdpc3RlcmVkIGluIEhBTF9TUElfU1RBVEVfUkVBRFkgc3RhdGUNCi0gIG9ubHkuIEV4Y2VwdGlvbiBkb25lIE1zcEluaXQvTXNwRGVJbml0IGZ1bmN0aW9ucyB0aGF0IGNhbiBiZQ0KLSAgcmVnaXN0ZXJlZC91bnJlZ2lzdGVyZWQgaW4gSEFMX1NQSV9TVEFURV9SRUFEWSBvciBIQUxfU1BJX1NUQVRFX1JFU0VUIHN0YXRlLA0KLSAgICAgICB0aHVzIHJlZ2lzdGVyZWQgKHVzZXIpIE1zcEluaXQvRGVJbml0IGNhbGxiYWNrcyBjYW4gYmUgdXNlZCBkdXJpbmcgdGhlDQotICBJbml0L0RlSW5pdC4gVGhlbiwgdGhlIHVzZXIgZmlyc3QgcmVnaXN0ZXJzIHRoZSBNc3BJbml0L01zcERlSW5pdCB1c2VyDQotICBjYWxsYmFja3MgdXNpbmcgSEFMX1NQSV9SZWdpc3RlckNhbGxiYWNrKCkgYmVmb3JlIGNhbGxpbmcgSEFMX1NQSV9EZUluaXQoKSBvcg0KLSAgSEFMX1NQSV9Jbml0KCkgZnVuY3Rpb24uDQotDQotICAgICAgIFsuLl0NCi0gICAgICAgV2hlbiB0aGUgY29tcGlsYXRpb24gZGVmaW5lIFVTRV9IQUxfUFBQX1JFR0lTVEVSX0NBTExCQUNLUyBpcyBzZXQgdG8gMCBvcg0KLSAgICAgICBub3QgZGVmaW5lZCwgdGhlIGNhbGxiYWNrIHJlZ2lzdGVyaW5nIGZlYXR1cmUgaXMgbm90IGF2YWlsYWJsZQ0KLSAgICAgICBhbmQgd2VhayAoc3VyY2hhcmdlZCkgY2FsbGJhY2tzIGFyZSB1c2VkLg0KLQ0KLSAgICAgWy4uXQ0KLSAgICAgICBVc2luZyB0aGUgSEFMIGl0IGlzIG5vdCBwb3NzaWJsZSB0byByZWFjaCBhbGwgc3VwcG9ydGVkIFNQSSBmcmVxdWVuY3kNCi0gIHdpdGggdGhlIGRpZmZlcmVudCBTUEkgTW9kZXMsIHRoZSBmb2xsb3dpbmcgdGFibGUgcmVzdW1lIHRoZSBtYXggU1BJIGZyZXF1ZW5jeQ0KLSAgcmVhY2hlZCB3aXRoIGRhdGEgc2l6ZSA4Yml0cy8xNmJpdHMsIGFjY29yZGluZyB0byBmcmVxdWVuY3kgb2YgdGhlIEFQQngNCi0gIFBlcmlwaGVyYWwgQ2xvY2sgKGZQQ0xLKSB1c2VkIGJ5IHRoZSBTUEkgaW5zdGFuY2UuDQotDQotICBAZW5kdmVyYmF0aW0NCi0NCi0gIEFkZGl0aW9uYWwgdGFibGUgOg0KLQ0KLSAgICAgICBEYXRhU2l6ZSA9IFNQSV9EQVRBU0laRV84QklUOg0KLSAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCi0gICAgICAgfCAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAyTGluZXMgRnVsbGR1cGxleCAgIHwgICAgIDJMaW5lcyBSeE9ubHkgICAgfA0KLSAgMUxpbmUgICAgICAgIHwgfCBQcm9jZXNzIHwgVHJhbnNmZXIgbW9kZQ0KLSAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IHwgfCB8DQotICBNYXN0ZXIgIHwgIFNsYXZlICAgfCAgTWFzdGVyICAgfCAgU2xhdmUgICB8ICBNYXN0ZXIgICB8ICBTbGF2ZSAgIHwNCi0gICAgICAgfD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT18DQotICAgICAgIHwgICAgVCAgICB8ICAgICBQb2xsaW5nICAgIHwgRnBjbGsvNCAgfCBGcGNsay84ICB8ICAgIE5BICAgICB8ICAgIE5BICAgIHwNCi0gIE5BICAgICB8ICAgTkEgICAgIHwgfCAgICBYDQotICB8LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfA0KLSAgICAgICB8ICAgIC8gICAgfCAgICAgSW50ZXJydXB0ICB8IEZwY2xrLzQgIHwgRnBjbGsvMTYgfCAgICBOQSAgICAgfCAgICBOQSAgICB8DQotICBOQSAgICAgfCAgIE5BICAgICB8IHwgICAgUg0KLSAgfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLXwNCi0gICAgICAgfCAgICBYICAgIHwgICAgICAgRE1BICAgICAgfCBGcGNsay8yICB8IEZwY2xrLzIgIHwgICAgTkEgICAgIHwgICAgTkEgICAgfA0KLSAgTkEgICAgIHwgICBOQSAgICAgfA0KLSAgICAgICB8PT09PT09PT09fD09PT09PT09PT09PT09PT18PT09PT09PT09PXw9PT09PT09PT09fD09PT09PT09PT09fD09PT09PT09PT18PT09PT09PT09PT18PT09PT09PT09PXwNCi0gICAgICAgfCAgICAgICAgIHwgICAgIFBvbGxpbmcgICAgfCBGcGNsay80ICB8IEZwY2xrLzggIHwgRnBjbGsvMTYgIHwgRnBjbGsvOCAgfA0KLSAgRnBjbGsvOCAgIHwgRnBjbGsvOCAgfCB8DQotICB8LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfA0KLSAgICAgICB8ICAgIFIgICAgfCAgICAgSW50ZXJydXB0ICB8IEZwY2xrLzggIHwgRnBjbGsvMTYgfCBGcGNsay84ICAgfCBGcGNsay84ICB8DQotICBGcGNsay84ICAgfCBGcGNsay80ICB8IHwgICAgWA0KLSAgfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLXwNCi0gICAgICAgfCAgICAgICAgIHwgICAgICAgRE1BICAgICAgfCBGcGNsay80ICB8IEZwY2xrLzIgIHwgRnBjbGsvMiAgIHwgRnBjbGsvMTYgfA0KLSAgRnBjbGsvMiAgIHwgRnBjbGsvMTYgfA0KLSAgICAgICB8PT09PT09PT09fD09PT09PT09PT09PT09PT18PT09PT09PT09PXw9PT09PT09PT09fD09PT09PT09PT09fD09PT09PT09PT18PT09PT09PT09PT18PT09PT09PT09PXwNCi0gICAgICAgfCAgICAgICAgIHwgICAgIFBvbGxpbmcgICAgfCBGcGNsay84ICB8IEZwY2xrLzIgIHwgICAgIE5BICAgIHwgICAgTkEgICAgfA0KLSAgRnBjbGsvOCAgIHwgRnBjbGsvOCAgfCB8DQotICB8LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfA0KLSAgICAgICB8ICAgIFQgICAgfCAgICAgSW50ZXJydXB0ICB8IEZwY2xrLzIgIHwgRnBjbGsvNCAgfCAgICAgTkEgICAgfCAgICBOQSAgICB8DQotICBGcGNsay8xNiAgfCBGcGNsay84ICB8IHwgICAgWA0KLSAgfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLXwNCi0gICAgICAgfCAgICAgICAgIHwgICAgICAgRE1BICAgICAgfCBGcGNsay8yICB8IEZwY2xrLzIgIHwgICAgIE5BICAgIHwgICAgTkEgICAgfA0KLSAgRnBjbGsvOCAgIHwgRnBjbGsvMTYgfA0KLSAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCi0NCi0gICAgICAgRGF0YVNpemUgPSBTUElfREFUQVNJWkVfMTZCSVQ6DQotICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KLSAgICAgICB8ICAgICAgICAgfCAgICAgICAgICAgICAgICB8IDJMaW5lcyBGdWxsZHVwbGV4ICAgfCAgICAgMkxpbmVzIFJ4T25seSAgICB8DQotICAxTGluZSAgICAgICAgfCB8IFByb2Nlc3MgfCBUcmFuc2ZlciBtb2RlDQotICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgfCB8IHwNCi0gIE1hc3RlciAgfCAgU2xhdmUgICB8ICBNYXN0ZXIgICB8ICBTbGF2ZSAgIHwgIE1hc3RlciAgIHwgIFNsYXZlICAgfA0KLSAgICAgICB8PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PXwNCi0gICAgICAgfCAgICBUICAgIHwgICAgIFBvbGxpbmcgICAgfCBGcGNsay80ICB8IEZwY2xrLzggIHwgICAgTkEgICAgIHwgICAgTkEgICAgfA0KLSAgTkEgICAgIHwgICBOQSAgICAgfCB8ICAgIFgNCi0gIHwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS18DQotICAgICAgIHwgICAgLyAgICB8ICAgICBJbnRlcnJ1cHQgIHwgRnBjbGsvNCAgfCBGcGNsay8xNiB8ICAgIE5BICAgICB8ICAgIE5BICAgIHwNCi0gIE5BICAgICB8ICAgTkEgICAgIHwgfCAgICBSDQotICB8LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfA0KLSAgICAgICB8ICAgIFggICAgfCAgICAgICBETUEgICAgICB8IEZwY2xrLzIgIHwgRnBjbGsvMiAgfCAgICBOQSAgICAgfCAgICBOQSAgICB8DQotICBOQSAgICAgfCAgIE5BICAgICB8DQotICAgICAgIHw9PT09PT09PT18PT09PT09PT09PT09PT09PXw9PT09PT09PT09fD09PT09PT09PT18PT09PT09PT09PT18PT09PT09PT09PXw9PT09PT09PT09PXw9PT09PT09PT09fA0KLSAgICAgICB8ICAgICAgICAgfCAgICAgUG9sbGluZyAgICB8IEZwY2xrLzQgIHwgRnBjbGsvOCAgfCBGcGNsay8xNiAgfCBGcGNsay84ICB8DQotICBGcGNsay84ICAgfCBGcGNsay84ICB8IHwNCi0gIHwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS18DQotICAgICAgIHwgICAgUiAgICB8ICAgICBJbnRlcnJ1cHQgIHwgRnBjbGsvOCAgfCBGcGNsay8xNiB8IEZwY2xrLzggICB8IEZwY2xrLzggIHwNCi0gIEZwY2xrLzggICB8IEZwY2xrLzQgIHwgfCAgICBYDQotICB8LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfA0KLSAgICAgICB8ICAgICAgICAgfCAgICAgICBETUEgICAgICB8IEZwY2xrLzQgIHwgRnBjbGsvMiAgfCBGcGNsay8yICAgfCBGcGNsay8xNiB8DQotICBGcGNsay8yICAgfCBGcGNsay8xNiB8DQotICAgICAgIHw9PT09PT09PT18PT09PT09PT09PT09PT09PXw9PT09PT09PT09fD09PT09PT09PT18PT09PT09PT09PT18PT09PT09PT09PXw9PT09PT09PT09PXw9PT09PT09PT09fA0KLSAgICAgICB8ICAgICAgICAgfCAgICAgUG9sbGluZyAgICB8IEZwY2xrLzggIHwgRnBjbGsvMiAgfCAgICAgTkEgICAgfCAgICBOQSAgICB8DQotICBGcGNsay84ICAgfCBGcGNsay84ICB8IHwNCi0gIHwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS18DQotICAgICAgIHwgICAgVCAgICB8ICAgICBJbnRlcnJ1cHQgIHwgRnBjbGsvMiAgfCBGcGNsay80ICB8ICAgICBOQSAgICB8ICAgIE5BICAgIHwNCi0gIEZwY2xrLzE2ICB8IEZwY2xrLzggIHwgfCAgICBYDQotICB8LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfA0KLSAgICAgICB8ICAgICAgICAgfCAgICAgICBETUEgICAgICB8IEZwY2xrLzIgIHwgRnBjbGsvMiAgfCAgICAgTkEgICAgfCAgICBOQSAgICB8DQotICBGcGNsay84ICAgfCBGcGNsay8xNiB8DQotICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KLSAgICAgICBAbm90ZSBUaGUgbWF4IFNQSSBmcmVxdWVuY3kgZGVwZW5kIG9uIFNQSSBkYXRhIHNpemUgKDRiaXRzLCA1Yml0cywuLi4sDQotICA4Yml0cywuLi4xNWJpdHMsIDE2Yml0cyksIFNQSSBtb2RlKDIgTGluZXMgZnVsbGR1cGxleCwgMiBsaW5lcyBSeE9ubHksIDEgbGluZQ0KLSAgVFgvUlgpIGFuZCBQcm9jZXNzIG1vZGUgKFBvbGxpbmcsIElULCBETUEpLg0KLSAgICAgICBAbm90ZQ0KLSAgICAgICAgICAgICgjKSBUWC9SWCBwcm9jZXNzZXMgYXJlIEhBTF9TUElfVHJhbnNtaXRSZWNlaXZlKCksDQotICBIQUxfU1BJX1RyYW5zbWl0UmVjZWl2ZV9JVCgpIGFuZCBIQUxfU1BJX1RyYW5zbWl0UmVjZWl2ZV9ETUEoKQ0KLSAgICAgICAgICAgICgjKSBSWCBwcm9jZXNzZXMgYXJlIEhBTF9TUElfUmVjZWl2ZSgpLCBIQUxfU1BJX1JlY2VpdmVfSVQoKSBhbmQNCi0gIEhBTF9TUElfUmVjZWl2ZV9ETUEoKQ0KLSAgICAgICAgICAgICgjKSBUWCBwcm9jZXNzZXMgYXJlIEhBTF9TUElfVHJhbnNtaXQoKSwgSEFMX1NQSV9UcmFuc21pdF9JVCgpIGFuZA0KLSAgSEFMX1NQSV9UcmFuc21pdF9ETUEoKQ0KLQ0KLSAgKi8NCi0NCi0vKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpbmNsdWRlICJzdG0zMmc0eHhfaGFsLmgiDQotDQotLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzR4eF9IQUxfRHJpdmVyDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFNQSSBTUEkNCi0gKiBAYnJpZWYgU1BJIEhBTCBtb2R1bGUgZHJpdmVyDQotICogQHsNCi0gKi8NCi0jaWZkZWYgSEFMX1NQSV9NT0RVTEVfRU5BQkxFRA0KLQ0KLS8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogUHJpdmF0ZSBkZWZpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGRlZmdyb3VwIFNQSV9Qcml2YXRlX0NvbnN0YW50cyBTUEkgUHJpdmF0ZSBDb25zdGFudHMNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgU1BJX0RFRkFVTFRfVElNRU9VVCAxMDBVDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGRlZmdyb3VwIFNQSV9Qcml2YXRlX0Z1bmN0aW9ucyBTUEkgUHJpdmF0ZSBGdW5jdGlvbnMNCi0gKiBAew0KLSAqLw0KLXN0YXRpYyB2b2lkIFNQSV9ETUFUcmFuc21pdENwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOw0KLXN0YXRpYyB2b2lkIFNQSV9ETUFSZWNlaXZlQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7DQotc3RhdGljIHZvaWQgU1BJX0RNQVRyYW5zbWl0UmVjZWl2ZUNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOw0KLXN0YXRpYyB2b2lkIFNQSV9ETUFIYWxmVHJhbnNtaXRDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsNCi1zdGF0aWMgdm9pZCBTUElfRE1BSGFsZlJlY2VpdmVDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsNCi1zdGF0aWMgdm9pZCBTUElfRE1BSGFsZlRyYW5zbWl0UmVjZWl2ZUNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOw0KLXN0YXRpYyB2b2lkIFNQSV9ETUFFcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7DQotc3RhdGljIHZvaWQgU1BJX0RNQUFib3J0T25FcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7DQotc3RhdGljIHZvaWQgU1BJX0RNQVR4QWJvcnRDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7DQotc3RhdGljIHZvaWQgU1BJX0RNQVJ4QWJvcnRDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7DQotc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNQSV9XYWl0RmxhZ1N0YXRlVW50aWxUaW1lb3V0KFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBGbGFnLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbGFnU3RhdHVzIFN0YXRlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lb3V0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaWNrc3RhcnQpOw0KLXN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBTUElfV2FpdEZpZm9TdGF0ZVVudGlsVGltZW91dChTUElfSGFuZGxlVHlwZURlZiAqaHNwaSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRmlmbywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgU3RhdGUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVvdXQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpY2tzdGFydCk7DQotc3RhdGljIHZvaWQgU1BJX1R4SVNSXzhCSVQoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOw0KLXN0YXRpYyB2b2lkIFNQSV9UeElTUl8xNkJJVChzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7DQotc3RhdGljIHZvaWQgU1BJX1J4SVNSXzhCSVQoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOw0KLXN0YXRpYyB2b2lkIFNQSV9SeElTUl8xNkJJVChzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7DQotc3RhdGljIHZvaWQgU1BJXzJsaW5lc1J4SVNSXzhCSVQoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOw0KLXN0YXRpYyB2b2lkIFNQSV8ybGluZXNUeElTUl84QklUKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsNCi1zdGF0aWMgdm9pZCBTUElfMmxpbmVzVHhJU1JfMTZCSVQoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOw0KLXN0YXRpYyB2b2lkIFNQSV8ybGluZXNSeElTUl8xNkJJVChzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7DQotI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkNCi1zdGF0aWMgdm9pZCBTUElfUnhJU1JfOEJJVENSQyhzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7DQotc3RhdGljIHZvaWQgU1BJX1J4SVNSXzE2QklUQ1JDKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsNCi1zdGF0aWMgdm9pZCBTUElfMmxpbmVzUnhJU1JfOEJJVENSQyhzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7DQotc3RhdGljIHZvaWQgU1BJXzJsaW5lc1J4SVNSXzE2QklUQ1JDKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsNCi0jZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8NCi1zdGF0aWMgdm9pZCBTUElfQWJvcnRSeF9JU1IoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOw0KLXN0YXRpYyB2b2lkIFNQSV9BYm9ydFR4X0lTUihTUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7DQotc3RhdGljIHZvaWQgU1BJX0Nsb3NlUnhUeF9JU1IoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOw0KLXN0YXRpYyB2b2lkIFNQSV9DbG9zZVJ4X0lTUihTUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7DQotc3RhdGljIHZvaWQgU1BJX0Nsb3NlVHhfSVNSKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsNCi1zdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU1BJX0VuZFJ4VHJhbnNhY3Rpb24oU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVvdXQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpY2tzdGFydCk7DQotc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNQSV9FbmRSeFR4VHJhbnNhY3Rpb24oU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZW91dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaWNrc3RhcnQpOw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGRlZmdyb3VwIFNQSV9FeHBvcnRlZF9GdW5jdGlvbnMgU1BJIEV4cG9ydGVkIEZ1bmN0aW9ucw0KLSAqIEB7DQotICovDQotDQotLyoqIEBkZWZncm91cCBTUElfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24NCi1mdW5jdGlvbnMNCi0gICogIEBicmllZiAgICBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMNCi0gICoNCi1AdmVyYmF0aW0NCi0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAjIyMjIw0KLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgIFsuLl0gIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gaW5pdGlhbGl6ZSBhbmQNCi0gICAgICAgICAgZGUtaW5pdGlhbGl6ZSB0aGUgU1BJeCBwZXJpcGhlcmFsOg0KLQ0KLSAgICAgICgrKSBVc2VyIG11c3QgaW1wbGVtZW50IEhBTF9TUElfTXNwSW5pdCgpIGZ1bmN0aW9uIGluIHdoaWNoIGhlIGNvbmZpZ3VyZXMNCi0gICAgICAgICAgYWxsIHJlbGF0ZWQgcGVyaXBoZXJhbHMgcmVzb3VyY2VzIChDTE9DSywgR1BJTywgRE1BLCBJVCBhbmQgTlZJQyApLg0KLQ0KLSAgICAgICgrKSBDYWxsIHRoZSBmdW5jdGlvbiBIQUxfU1BJX0luaXQoKSB0byBjb25maWd1cmUgdGhlIHNlbGVjdGVkIGRldmljZSB3aXRoDQotICAgICAgICAgIHRoZSBzZWxlY3RlZCBjb25maWd1cmF0aW9uOg0KLSAgICAgICAgKCsrKSBNb2RlDQotICAgICAgICAoKyspIERpcmVjdGlvbg0KLSAgICAgICAgKCsrKSBEYXRhIFNpemUNCi0gICAgICAgICgrKykgQ2xvY2sgUG9sYXJpdHkgYW5kIFBoYXNlDQotICAgICAgICAoKyspIE5TUyBNYW5hZ2VtZW50DQotICAgICAgICAoKyspIEJhdWRSYXRlIFByZXNjYWxlcg0KLSAgICAgICAgKCsrKSBGaXJzdEJpdA0KLSAgICAgICAgKCsrKSBUSU1vZGUNCi0gICAgICAgICgrKykgQ1JDIENhbGN1bGF0aW9uDQotICAgICAgICAoKyspIENSQyBQb2x5bm9taWFsIGlmIENSQyBlbmFibGVkDQotICAgICAgICAoKyspIENSQyBMZW5ndGgsIHVzZWQgb25seSB3aXRoIERhdGE4IGFuZCBEYXRhMTYNCi0gICAgICAgICgrKykgRklGTyByZWNlcHRpb24gdGhyZXNob2xkDQotDQotICAgICAgKCspIENhbGwgdGhlIGZ1bmN0aW9uIEhBTF9TUElfRGVJbml0KCkgdG8gcmVzdG9yZSB0aGUgZGVmYXVsdA0KLWNvbmZpZ3VyYXRpb24gb2YgdGhlIHNlbGVjdGVkIFNQSXggcGVyaXBoZXJhbC4NCi0NCi1AZW5kdmVyYmF0aW0NCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBTUEkgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycw0KLSAqICAgICAgICAgaW4gdGhlIFNQSV9Jbml0VHlwZURlZiBhbmQgaW5pdGlhbGl6ZSB0aGUgYXNzb2NpYXRlZCBoYW5kbGUuDQotICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KLSAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9Jbml0KFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKSB7DQotICB1aW50MzJfdCBmcnh0aDsNCi0NCi0gIC8qIENoZWNrIHRoZSBTUEkgaGFuZGxlIGFsbG9jYXRpb24gKi8NCi0gIGlmIChoc3BpID09IE5VTEwpIHsNCi0gICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gIH0NCi0NCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfU1BJX0FMTF9JTlNUQU5DRShoc3BpLT5JbnN0YW5jZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1NQSV9NT0RFKGhzcGktPkluaXQuTW9kZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1NQSV9ESVJFQ1RJT04oaHNwaS0+SW5pdC5EaXJlY3Rpb24pKTsNCi0gIGFzc2VydF9wYXJhbShJU19TUElfREFUQVNJWkUoaHNwaS0+SW5pdC5EYXRhU2l6ZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1NQSV9OU1MoaHNwaS0+SW5pdC5OU1MpKTsNCi0gIGFzc2VydF9wYXJhbShJU19TUElfTlNTUChoc3BpLT5Jbml0Lk5TU1BNb2RlKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfU1BJX0JBVURSQVRFX1BSRVNDQUxFUihoc3BpLT5Jbml0LkJhdWRSYXRlUHJlc2NhbGVyKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfU1BJX0ZJUlNUX0JJVChoc3BpLT5Jbml0LkZpcnN0Qml0KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfU1BJX1RJTU9ERShoc3BpLT5Jbml0LlRJTW9kZSkpOw0KLSAgaWYgKGhzcGktPkluaXQuVElNb2RlID09IFNQSV9USU1PREVfRElTQUJMRSkgew0KLSAgICBhc3NlcnRfcGFyYW0oSVNfU1BJX0NQT0woaHNwaS0+SW5pdC5DTEtQb2xhcml0eSkpOw0KLSAgICBhc3NlcnRfcGFyYW0oSVNfU1BJX0NQSEEoaHNwaS0+SW5pdC5DTEtQaGFzZSkpOw0KLQ0KLSAgICBpZiAoaHNwaS0+SW5pdC5Nb2RlID09IFNQSV9NT0RFX01BU1RFUikgew0KLSAgICAgIGFzc2VydF9wYXJhbShJU19TUElfQkFVRFJBVEVfUFJFU0NBTEVSKGhzcGktPkluaXQuQmF1ZFJhdGVQcmVzY2FsZXIpKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAvKiBCYXVkcmF0ZSBwcmVzY2FsZXIgbm90IHVzZSBpbiBNb3RvcmFvbGEgU2xhdmUgbW9kZS4gZm9yY2UgdG8gZGVmYXVsdA0KLSAgICAgICAqIHZhbHVlICovDQotICAgICAgaHNwaS0+SW5pdC5CYXVkUmF0ZVByZXNjYWxlciA9IFNQSV9CQVVEUkFURVBSRVNDQUxFUl8yOw0KLSAgICB9DQotICB9IGVsc2Ugew0KLSAgICBhc3NlcnRfcGFyYW0oSVNfU1BJX0JBVURSQVRFX1BSRVNDQUxFUihoc3BpLT5Jbml0LkJhdWRSYXRlUHJlc2NhbGVyKSk7DQotDQotICAgIC8qIEZvcmNlIHBvbGFyaXR5IGFuZCBwaGFzZSB0byBUSSBwcm90b2Nhb2wgcmVxdWlyZW1lbnRzICovDQotICAgIGhzcGktPkluaXQuQ0xLUG9sYXJpdHkgPSBTUElfUE9MQVJJVFlfTE9XOw0KLSAgICBoc3BpLT5Jbml0LkNMS1BoYXNlID0gU1BJX1BIQVNFXzFFREdFOw0KLSAgfQ0KLSNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpDQotICBhc3NlcnRfcGFyYW0oSVNfU1BJX0NSQ19DQUxDVUxBVElPTihoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uKSk7DQotICBpZiAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKSB7DQotICAgIGFzc2VydF9wYXJhbShJU19TUElfQ1JDX1BPTFlOT01JQUwoaHNwaS0+SW5pdC5DUkNQb2x5bm9taWFsKSk7DQotICAgIGFzc2VydF9wYXJhbShJU19TUElfQ1JDX0xFTkdUSChoc3BpLT5Jbml0LkNSQ0xlbmd0aCkpOw0KLSAgfQ0KLSNlbHNlDQotICBoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID0gU1BJX0NSQ0NBTENVTEFUSU9OX0RJU0FCTEU7DQotI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovDQotDQotICBpZiAoaHNwaS0+U3RhdGUgPT0gSEFMX1NQSV9TVEFURV9SRVNFVCkgew0KLSAgICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovDQotICAgIGhzcGktPkxvY2sgPSBIQUxfVU5MT0NLRUQ7DQotDQotI2lmIChVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpDQotICAgIC8qIEluaXQgdGhlIFNQSSBDYWxsYmFjayBzZXR0aW5ncyAqLw0KLSAgICBoc3BpLT5UeENwbHRDYWxsYmFjayA9DQotICAgICAgICBIQUxfU1BJX1R4Q3BsdENhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBUeENwbHRDYWxsYmFjayAgICAgICAqLw0KLSAgICBoc3BpLT5SeENwbHRDYWxsYmFjayA9DQotICAgICAgICBIQUxfU1BJX1J4Q3BsdENhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBSeENwbHRDYWxsYmFjayAgICAgICAqLw0KLSAgICBoc3BpLT5UeFJ4Q3BsdENhbGxiYWNrID0NCi0gICAgICAgIEhBTF9TUElfVHhSeENwbHRDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgVHhSeENwbHRDYWxsYmFjayAgICAgKi8NCi0gICAgaHNwaS0+VHhIYWxmQ3BsdENhbGxiYWNrID0NCi0gICAgICAgIEhBTF9TUElfVHhIYWxmQ3BsdENhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBUeEhhbGZDcGx0Q2FsbGJhY2sgICAqLw0KLSAgICBoc3BpLT5SeEhhbGZDcGx0Q2FsbGJhY2sgPQ0KLSAgICAgICAgSEFMX1NQSV9SeEhhbGZDcGx0Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIFJ4SGFsZkNwbHRDYWxsYmFjayAgICovDQotICAgIGhzcGktPlR4UnhIYWxmQ3BsdENhbGxiYWNrID0NCi0gICAgICAgIEhBTF9TUElfVHhSeEhhbGZDcGx0Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIFR4UnhIYWxmQ3BsdENhbGxiYWNrICovDQotICAgIGhzcGktPkVycm9yQ2FsbGJhY2sgPSBIQUxfU1BJX0Vycm9yQ2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIEVycm9yQ2FsbGJhY2sgKi8NCi0gICAgaHNwaS0+QWJvcnRDcGx0Q2FsbGJhY2sgPQ0KLSAgICAgICAgSEFMX1NQSV9BYm9ydENwbHRDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgQWJvcnRDcGx0Q2FsbGJhY2sgICAgKi8NCi0NCi0gICAgaWYgKGhzcGktPk1zcEluaXRDYWxsYmFjayA9PSBOVUxMKSB7DQotICAgICAgaHNwaS0+TXNwSW5pdENhbGxiYWNrID0gSEFMX1NQSV9Nc3BJbml0OyAvKiBMZWdhY3kgd2VhayBNc3BJbml0ICAqLw0KLSAgICB9DQotDQotICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLLCBOVklDLi4uICovDQotICAgIGhzcGktPk1zcEluaXRDYWxsYmFjayhoc3BpKTsNCi0jZWxzZQ0KLSAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgOiBHUElPLCBDTE9DSywgTlZJQy4uLiAqLw0KLSAgICBIQUxfU1BJX01zcEluaXQoaHNwaSk7DQotI2VuZGlmIC8qIFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLSAgfQ0KLQ0KLSAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX0JVU1k7DQotDQotICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBTUEkgcGVyaXBoZXJhbCAqLw0KLSAgX19IQUxfU1BJX0RJU0FCTEUoaHNwaSk7DQotDQotICAvKiBBbGlnbiBieSBkZWZhdWx0IHRoZSBycyBmaWZvIHRocmVzaG9sZCBvbiB0aGUgZGF0YSBzaXplICovDQotICBpZiAoaHNwaS0+SW5pdC5EYXRhU2l6ZSA+IFNQSV9EQVRBU0laRV84QklUKSB7DQotICAgIGZyeHRoID0gU1BJX1JYRklGT19USFJFU0hPTERfSEY7DQotICB9IGVsc2Ugew0KLSAgICBmcnh0aCA9IFNQSV9SWEZJRk9fVEhSRVNIT0xEX1FGOw0KLSAgfQ0KLQ0KLSAgLyogQ1JDIGNhbGN1bGF0aW9uIGlzIHZhbGlkIG9ubHkgZm9yIDE2Qml0IGFuZCA4IEJpdCAqLw0KLSAgaWYgKChoc3BpLT5Jbml0LkRhdGFTaXplICE9IFNQSV9EQVRBU0laRV8xNkJJVCkgJiYNCi0gICAgICAoaHNwaS0+SW5pdC5EYXRhU2l6ZSAhPSBTUElfREFUQVNJWkVfOEJJVCkpIHsNCi0gICAgLyogQ1JDIG11c3QgYmUgZGlzYWJsZWQgKi8NCi0gICAgaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9IFNQSV9DUkNDQUxDVUxBVElPTl9ESVNBQkxFOw0KLSAgfQ0KLQ0KLSAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTUEl4IENSMSAmIENSMiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotICAvKiBDb25maWd1cmUgOiBTUEkgTW9kZSwgQ29tbXVuaWNhdGlvbiBNb2RlLCBDbG9jayBwb2xhcml0eSBhbmQgcGhhc2UsIE5TUw0KLSAgbWFuYWdlbWVudCwgQ29tbXVuaWNhdGlvbiBzcGVlZCwgRmlyc3QgYml0IGFuZCBDUkMgY2FsY3VsYXRpb24gc3RhdGUgKi8NCi0gIFdSSVRFX1JFRygNCi0gICAgICBoc3BpLT5JbnN0YW5jZS0+Q1IxLA0KLSAgICAgICgoaHNwaS0+SW5pdC5Nb2RlICYgKFNQSV9DUjFfTVNUUiB8IFNQSV9DUjFfU1NJKSkgfA0KLSAgICAgICAoaHNwaS0+SW5pdC5EaXJlY3Rpb24gJiAoU1BJX0NSMV9SWE9OTFkgfCBTUElfQ1IxX0JJRElNT0RFKSkgfA0KLSAgICAgICAoaHNwaS0+SW5pdC5DTEtQb2xhcml0eSAmIFNQSV9DUjFfQ1BPTCkgfA0KLSAgICAgICAoaHNwaS0+SW5pdC5DTEtQaGFzZSAmIFNQSV9DUjFfQ1BIQSkgfCAoaHNwaS0+SW5pdC5OU1MgJiBTUElfQ1IxX1NTTSkgfA0KLSAgICAgICAoaHNwaS0+SW5pdC5CYXVkUmF0ZVByZXNjYWxlciAmIFNQSV9DUjFfQlJfTXNrKSB8DQotICAgICAgIChoc3BpLT5Jbml0LkZpcnN0Qml0ICYgU1BJX0NSMV9MU0JGSVJTVCkgfA0KLSAgICAgICAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiAmIFNQSV9DUjFfQ1JDRU4pKSk7DQotI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkNCi0gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTUEl4IENSQ0wgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0gIGlmIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpIHsNCi0gICAgLyogQWxpZ24gdGhlIENSQyBMZW5ndGggb24gdGhlIGRhdGEgc2l6ZSAqLw0KLSAgICBpZiAoaHNwaS0+SW5pdC5DUkNMZW5ndGggPT0gU1BJX0NSQ19MRU5HVEhfREFUQVNJWkUpIHsNCi0gICAgICAvKiBDUkMgTGVuZ3RoIGFsaWduZWQgb24gdGhlIGRhdGEgc2l6ZSA6IHZhbHVlIHNldCBieSBkZWZhdWx0ICovDQotICAgICAgaWYgKGhzcGktPkluaXQuRGF0YVNpemUgPiBTUElfREFUQVNJWkVfOEJJVCkgew0KLSAgICAgICAgaHNwaS0+SW5pdC5DUkNMZW5ndGggPSBTUElfQ1JDX0xFTkdUSF8xNkJJVDsNCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgaHNwaS0+SW5pdC5DUkNMZW5ndGggPSBTUElfQ1JDX0xFTkdUSF84QklUOw0KLSAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKiBDb25maWd1cmUgOiBDUkMgTGVuZ3RoICovDQotICAgIGlmIChoc3BpLT5Jbml0LkNSQ0xlbmd0aCA9PSBTUElfQ1JDX0xFTkdUSF8xNkJJVCkgew0KLSAgICAgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMSwgU1BJX0NSMV9DUkNMKTsNCi0gICAgfQ0KLSAgfQ0KLSNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLw0KLQ0KLSAgLyogQ29uZmlndXJlIDogTlNTIG1hbmFnZW1lbnQsIFRJIE1vZGUsIE5TUyBQdWxzZSwgRGF0YSBzaXplIGFuZCBSeCBGaWZvDQotICAgKiB0aHJlc2hvbGQgKi8NCi0gIFdSSVRFX1JFRyhoc3BpLT5JbnN0YW5jZS0+Q1IyLA0KLSAgICAgICAgICAgICgoKGhzcGktPkluaXQuTlNTID4+IDE2VSkgJiBTUElfQ1IyX1NTT0UpIHwNCi0gICAgICAgICAgICAgKGhzcGktPkluaXQuVElNb2RlICYgU1BJX0NSMl9GUkYpIHwNCi0gICAgICAgICAgICAgKGhzcGktPkluaXQuTlNTUE1vZGUgJiBTUElfQ1IyX05TU1ApIHwNCi0gICAgICAgICAgICAgKGhzcGktPkluaXQuRGF0YVNpemUgJiBTUElfQ1IyX0RTX01zaykgfCAoZnJ4dGggJiBTUElfQ1IyX0ZSWFRIKSkpOw0KLQ0KLSNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpDQotICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU1BJeCBDUkNQT0xZIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0gIC8qIENvbmZpZ3VyZSA6IENSQyBQb2x5bm9taWFsICovDQotICBpZiAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKSB7DQotICAgIFdSSVRFX1JFRyhoc3BpLT5JbnN0YW5jZS0+Q1JDUFIsDQotICAgICAgICAgICAgICAoaHNwaS0+SW5pdC5DUkNQb2x5bm9taWFsICYgU1BJX0NSQ1BSX0NSQ1BPTFlfTXNrKSk7DQotICB9DQotI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovDQotDQotI2lmIGRlZmluZWQoU1BJX0kyU0NGR1JfSTJTTU9EKQ0KLSAgLyogQWN0aXZhdGUgdGhlIFNQSSBtb2RlIChNYWtlIHN1cmUgdGhhdCBJMlNNT0QgYml0IGluIEkyU0NGR1IgcmVnaXN0ZXIgaXMNCi0gICAqIHJlc2V0KSAqLw0KLSAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5JMlNDRkdSLCBTUElfSTJTQ0ZHUl9JMlNNT0QpOw0KLSNlbmRpZiAvKiBTUElfSTJTQ0ZHUl9JMlNNT0QgKi8NCi0NCi0gIGhzcGktPkVycm9yQ29kZSA9IEhBTF9TUElfRVJST1JfTk9ORTsNCi0gIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9SRUFEWTsNCi0NCi0gIHJldHVybiBIQUxfT0s7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGUtSW5pdGlhbGl6ZSB0aGUgU1BJIHBlcmlwaGVyYWwuDQotICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KLSAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9EZUluaXQoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpIHsNCi0gIC8qIENoZWNrIHRoZSBTUEkgaGFuZGxlIGFsbG9jYXRpb24gKi8NCi0gIGlmIChoc3BpID09IE5VTEwpIHsNCi0gICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gIH0NCi0NCi0gIC8qIENoZWNrIFNQSSBJbnN0YW5jZSBwYXJhbWV0ZXIgKi8NCi0gIGFzc2VydF9wYXJhbShJU19TUElfQUxMX0lOU1RBTkNFKGhzcGktPkluc3RhbmNlKSk7DQotDQotICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfQlVTWTsNCi0NCi0gIC8qIERpc2FibGUgdGhlIFNQSSBQZXJpcGhlcmFsIENsb2NrICovDQotICBfX0hBTF9TUElfRElTQUJMRShoc3BpKTsNCi0NCi0jaWYgKFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkNCi0gIGlmIChoc3BpLT5Nc3BEZUluaXRDYWxsYmFjayA9PSBOVUxMKSB7DQotICAgIGhzcGktPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX1NQSV9Nc3BEZUluaXQ7IC8qIExlZ2FjeSB3ZWFrIE1zcERlSW5pdCAgKi8NCi0gIH0NCi0NCi0gIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlOiBHUElPLCBDTE9DSywgTlZJQy4uLiAqLw0KLSAgaHNwaS0+TXNwRGVJbml0Q2FsbGJhY2soaHNwaSk7DQotI2Vsc2UNCi0gIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlOiBHUElPLCBDTE9DSywgTlZJQy4uLiAqLw0KLSAgSEFMX1NQSV9Nc3BEZUluaXQoaHNwaSk7DQotI2VuZGlmIC8qIFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLQ0KLSAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9OT05FOw0KLSAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX1JFU0VUOw0KLQ0KLSAgLyogUmVsZWFzZSBMb2NrICovDQotICBfX0hBTF9VTkxPQ0soaHNwaSk7DQotDQotICByZXR1cm4gSEFMX09LOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIFNQSSBNU1AuDQotICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KLSAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuDQotICogQHJldHZhbCBOb25lDQotICovDQotX193ZWFrIHZvaWQgSEFMX1NQSV9Nc3BJbml0KFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKSB7DQotICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovDQotICBVTlVTRUQoaHNwaSk7DQotDQotICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsDQotICAgICAgICAgICAgdGhlIEhBTF9TUElfTXNwSW5pdCBzaG91bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQ0KLSAgICovDQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGUtSW5pdGlhbGl6ZSB0aGUgU1BJIE1TUC4NCi0gKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQotICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX3dlYWsgdm9pZCBIQUxfU1BJX01zcERlSW5pdChTUElfSGFuZGxlVHlwZURlZiAqaHNwaSkgew0KLSAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLw0KLSAgVU5VU0VEKGhzcGkpOw0KLQ0KLSAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLA0KLSAgICAgICAgICAgIHRoZSBIQUxfU1BJX01zcERlSW5pdCBzaG91bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQ0KLSAgICovDQotfQ0KLQ0KLSNpZiAoVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQ0KLS8qKg0KLSAqIEBicmllZiAgUmVnaXN0ZXIgYSBVc2VyIFNQSSBDYWxsYmFjaw0KLSAqICAgICAgICAgVG8gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSB3ZWFrIHByZWRlZmluZWQgY2FsbGJhY2sNCi0gKiBAcGFyYW0gIGhzcGkgUG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQotICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU1BJLg0KLSAqIEBwYXJhbSAgQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgcmVnaXN0ZXJlZA0KLSAqIEBwYXJhbSAgcENhbGxiYWNrIHBvaW50ZXIgdG8gdGhlIENhbGxiYWNrIGZ1bmN0aW9uDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9SZWdpc3RlckNhbGxiYWNrKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfU1BJX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTUElfQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjaykgew0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOw0KLQ0KLSAgaWYgKHBDYWxsYmFjayA9PSBOVUxMKSB7DQotICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLw0KLSAgICBoc3BpLT5FcnJvckNvZGUgfD0gSEFMX1NQSV9FUlJPUl9JTlZBTElEX0NBTExCQUNLOw0KLQ0KLSAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgfQ0KLSAgLyogUHJvY2VzcyBsb2NrZWQgKi8NCi0gIF9fSEFMX0xPQ0soaHNwaSk7DQotDQotICBpZiAoSEFMX1NQSV9TVEFURV9SRUFEWSA9PSBoc3BpLT5TdGF0ZSkgew0KLSAgICBzd2l0Y2ggKENhbGxiYWNrSUQpIHsNCi0gICAgICBjYXNlIEhBTF9TUElfVFhfQ09NUExFVEVfQ0JfSUQ6DQotICAgICAgICBoc3BpLT5UeENwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgSEFMX1NQSV9SWF9DT01QTEVURV9DQl9JRDoNCi0gICAgICAgIGhzcGktPlJ4Q3BsdENhbGxiYWNrID0gcENhbGxiYWNrOw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfU1BJX1RYX1JYX0NPTVBMRVRFX0NCX0lEOg0KLSAgICAgICAgaHNwaS0+VHhSeENwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgSEFMX1NQSV9UWF9IQUxGX0NPTVBMRVRFX0NCX0lEOg0KLSAgICAgICAgaHNwaS0+VHhIYWxmQ3BsdENhbGxiYWNrID0gcENhbGxiYWNrOw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfU1BJX1JYX0hBTEZfQ09NUExFVEVfQ0JfSUQ6DQotICAgICAgICBoc3BpLT5SeEhhbGZDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9TUElfVFhfUlhfSEFMRl9DT01QTEVURV9DQl9JRDoNCi0gICAgICAgIGhzcGktPlR4UnhIYWxmQ3BsdENhbGxiYWNrID0gcENhbGxiYWNrOw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfU1BJX0VSUk9SX0NCX0lEOg0KLSAgICAgICAgaHNwaS0+RXJyb3JDYWxsYmFjayA9IHBDYWxsYmFjazsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgSEFMX1NQSV9BQk9SVF9DQl9JRDoNCi0gICAgICAgIGhzcGktPkFib3J0Q3BsdENhbGxiYWNrID0gcENhbGxiYWNrOw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfU1BJX01TUElOSVRfQ0JfSUQ6DQotICAgICAgICBoc3BpLT5Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9TUElfTVNQREVJTklUX0NCX0lEOg0KLSAgICAgICAgaHNwaS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBkZWZhdWx0Og0KLSAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovDQotICAgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9JTlZBTElEX0NBTExCQUNLKTsNCi0NCi0gICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8NCi0gICAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsNCi0gICAgICAgIGJyZWFrOw0KLSAgICB9DQotICB9IGVsc2UgaWYgKEhBTF9TUElfU1RBVEVfUkVTRVQgPT0gaHNwaS0+U3RhdGUpIHsNCi0gICAgc3dpdGNoIChDYWxsYmFja0lEKSB7DQotICAgICAgY2FzZSBIQUxfU1BJX01TUElOSVRfQ0JfSUQ6DQotICAgICAgICBoc3BpLT5Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9TUElfTVNQREVJTklUX0NCX0lEOg0KLSAgICAgICAgaHNwaS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBkZWZhdWx0Og0KLSAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovDQotICAgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9JTlZBTElEX0NBTExCQUNLKTsNCi0NCi0gICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8NCi0gICAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsNCi0gICAgICAgIGJyZWFrOw0KLSAgICB9DQotICB9IGVsc2Ugew0KLSAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8NCi0gICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfSU5WQUxJRF9DQUxMQkFDSyk7DQotDQotICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8NCi0gICAgc3RhdHVzID0gSEFMX0VSUk9SOw0KLSAgfQ0KLQ0KLSAgLyogUmVsZWFzZSBMb2NrICovDQotICBfX0hBTF9VTkxPQ0soaHNwaSk7DQotICByZXR1cm4gc3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFVucmVnaXN0ZXIgYW4gU1BJIENhbGxiYWNrDQotICogICAgICAgICBTUEkgY2FsbGJhY2sgaXMgcmVkaXJlY3RlZCB0byB0aGUgd2VhayBwcmVkZWZpbmVkIGNhbGxiYWNrDQotICogQHBhcmFtICBoc3BpIFBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KLSAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNQSS4NCi0gKiBAcGFyYW0gIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHVucmVnaXN0ZXJlZA0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfVW5SZWdpc3RlckNhbGxiYWNrKA0KLSAgICBTUElfSGFuZGxlVHlwZURlZiAqaHNwaSwgSEFMX1NQSV9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKSB7DQotICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7DQotDQotICAvKiBQcm9jZXNzIGxvY2tlZCAqLw0KLSAgX19IQUxfTE9DSyhoc3BpKTsNCi0NCi0gIGlmIChIQUxfU1BJX1NUQVRFX1JFQURZID09IGhzcGktPlN0YXRlKSB7DQotICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkgew0KLSAgICAgIGNhc2UgSEFMX1NQSV9UWF9DT01QTEVURV9DQl9JRDoNCi0gICAgICAgIGhzcGktPlR4Q3BsdENhbGxiYWNrID0NCi0gICAgICAgICAgICBIQUxfU1BJX1R4Q3BsdENhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBUeENwbHRDYWxsYmFjayAgICAgICAqLw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfU1BJX1JYX0NPTVBMRVRFX0NCX0lEOg0KLSAgICAgICAgaHNwaS0+UnhDcGx0Q2FsbGJhY2sgPQ0KLSAgICAgICAgICAgIEhBTF9TUElfUnhDcGx0Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIFJ4Q3BsdENhbGxiYWNrICAgICAgICovDQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9TUElfVFhfUlhfQ09NUExFVEVfQ0JfSUQ6DQotICAgICAgICBoc3BpLT5UeFJ4Q3BsdENhbGxiYWNrID0NCi0gICAgICAgICAgICBIQUxfU1BJX1R4UnhDcGx0Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIFR4UnhDcGx0Q2FsbGJhY2sgICAgICovDQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9TUElfVFhfSEFMRl9DT01QTEVURV9DQl9JRDoNCi0gICAgICAgIGhzcGktPlR4SGFsZkNwbHRDYWxsYmFjayA9DQotICAgICAgICAgICAgSEFMX1NQSV9UeEhhbGZDcGx0Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIFR4SGFsZkNwbHRDYWxsYmFjayAgICovDQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9TUElfUlhfSEFMRl9DT01QTEVURV9DQl9JRDoNCi0gICAgICAgIGhzcGktPlJ4SGFsZkNwbHRDYWxsYmFjayA9DQotICAgICAgICAgICAgSEFMX1NQSV9SeEhhbGZDcGx0Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIFJ4SGFsZkNwbHRDYWxsYmFjayAgICovDQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9TUElfVFhfUlhfSEFMRl9DT01QTEVURV9DQl9JRDoNCi0gICAgICAgIGhzcGktPlR4UnhIYWxmQ3BsdENhbGxiYWNrID0NCi0gICAgICAgICAgICBIQUxfU1BJX1R4UnhIYWxmQ3BsdENhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBUeFJ4SGFsZkNwbHRDYWxsYmFjayAqLw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfU1BJX0VSUk9SX0NCX0lEOg0KLSAgICAgICAgaHNwaS0+RXJyb3JDYWxsYmFjayA9DQotICAgICAgICAgICAgSEFMX1NQSV9FcnJvckNhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBFcnJvckNhbGxiYWNrICAgICAgICAqLw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfU1BJX0FCT1JUX0NCX0lEOg0KLSAgICAgICAgaHNwaS0+QWJvcnRDcGx0Q2FsbGJhY2sgPQ0KLSAgICAgICAgICAgIEhBTF9TUElfQWJvcnRDcGx0Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIEFib3J0Q3BsdENhbGxiYWNrICAgICovDQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9TUElfTVNQSU5JVF9DQl9JRDoNCi0gICAgICAgIGhzcGktPk1zcEluaXRDYWxsYmFjayA9IEhBTF9TUElfTXNwSW5pdDsgLyogTGVnYWN5IHdlYWsgTXNwSW5pdCAqLw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfU1BJX01TUERFSU5JVF9DQl9JRDoNCi0gICAgICAgIGhzcGktPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX1NQSV9Nc3BEZUluaXQ7IC8qIExlZ2FjeSB3ZWFrIE1zcERlSW5pdCAqLw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgZGVmYXVsdDoNCi0gICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLw0KLSAgICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfSU5WQUxJRF9DQUxMQkFDSyk7DQotDQotICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovDQotICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7DQotICAgICAgICBicmVhazsNCi0gICAgfQ0KLSAgfSBlbHNlIGlmIChIQUxfU1BJX1NUQVRFX1JFU0VUID09IGhzcGktPlN0YXRlKSB7DQotICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkgew0KLSAgICAgIGNhc2UgSEFMX1NQSV9NU1BJTklUX0NCX0lEOg0KLSAgICAgICAgaHNwaS0+TXNwSW5pdENhbGxiYWNrID0gSEFMX1NQSV9Nc3BJbml0OyAvKiBMZWdhY3kgd2VhayBNc3BJbml0ICovDQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9TUElfTVNQREVJTklUX0NCX0lEOg0KLSAgICAgICAgaHNwaS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfU1BJX01zcERlSW5pdDsgLyogTGVnYWN5IHdlYWsgTXNwRGVJbml0ICovDQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBkZWZhdWx0Og0KLSAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovDQotICAgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9JTlZBTElEX0NBTExCQUNLKTsNCi0NCi0gICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8NCi0gICAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsNCi0gICAgICAgIGJyZWFrOw0KLSAgICB9DQotICB9IGVsc2Ugew0KLSAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8NCi0gICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfSU5WQUxJRF9DQUxMQkFDSyk7DQotDQotICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8NCi0gICAgc3RhdHVzID0gSEFMX0VSUk9SOw0KLSAgfQ0KLQ0KLSAgLyogUmVsZWFzZSBMb2NrICovDQotICBfX0hBTF9VTkxPQ0soaHNwaSk7DQotICByZXR1cm4gc3RhdHVzOw0KLX0NCi0jZW5kaWYgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFNQSV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMNCi0gICogIEBicmllZiAgIERhdGEgdHJhbnNmZXJzIGZ1bmN0aW9ucw0KLSAgKg0KLUB2ZXJiYXRpbQ0KLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgICAgICAgICAgICAgICAgICAgICMjIyMjIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMNCi0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSBbLi5dDQotICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gbWFuYWdlIHRoZSBTUEkNCi0gICAgZGF0YSB0cmFuc2ZlcnMuDQotDQotICAgIFsuLl0gVGhlIFNQSSBzdXBwb3J0cyBtYXN0ZXIgYW5kIHNsYXZlIG1vZGUgOg0KLQ0KLSAgICAoIykgVGhlcmUgYXJlIHR3byBtb2RlcyBvZiB0cmFuc2ZlcjoNCi0gICAgICAgKCsrKSBCbG9ja2luZyBtb2RlOiBUaGUgY29tbXVuaWNhdGlvbiBpcyBwZXJmb3JtZWQgaW4gcG9sbGluZyBtb2RlLg0KLSAgICAgICAgICAgIFRoZSBIQUwgc3RhdHVzIG9mIGFsbCBkYXRhIHByb2Nlc3NpbmcgaXMgcmV0dXJuZWQgYnkgdGhlIHNhbWUNCi1mdW5jdGlvbiBhZnRlciBmaW5pc2hpbmcgdHJhbnNmZXIuDQotICAgICAgICgrKykgTm8tQmxvY2tpbmcgbW9kZTogVGhlIGNvbW11bmljYXRpb24gaXMgcGVyZm9ybWVkIHVzaW5nIEludGVycnVwdHMNCi0gICAgICAgICAgICBvciBETUEsIFRoZXNlIEFQSXMgcmV0dXJuIHRoZSBIQUwgc3RhdHVzLg0KLSAgICAgICAgICAgIFRoZSBlbmQgb2YgdGhlIGRhdGEgcHJvY2Vzc2luZyB3aWxsIGJlIGluZGljYXRlZCB0aHJvdWdoIHRoZQ0KLSAgICAgICAgICAgIGRlZGljYXRlZCBTUEkgSVJRIHdoZW4gdXNpbmcgSW50ZXJydXB0IG1vZGUgb3IgdGhlIERNQSBJUlEgd2hlbg0KLSAgICAgICAgICAgIHVzaW5nIERNQSBtb2RlLg0KLSAgICAgICAgICAgIFRoZSBIQUxfU1BJX1R4Q3BsdENhbGxiYWNrKCksIEhBTF9TUElfUnhDcGx0Q2FsbGJhY2soKSBhbmQNCi1IQUxfU1BJX1R4UnhDcGx0Q2FsbGJhY2soKSB1c2VyIGNhbGxiYWNrcyB3aWxsIGJlIGV4ZWN1dGVkIHJlc3BlY3RpdmVseSBhdCB0aGUNCi1lbmQgb2YgdGhlIHRyYW5zbWl0IG9yIFJlY2VpdmUgcHJvY2VzcyBUaGUgSEFMX1NQSV9FcnJvckNhbGxiYWNrKCl1c2VyIGNhbGxiYWNrDQotd2lsbCBiZSBleGVjdXRlZCB3aGVuIGEgY29tbXVuaWNhdGlvbiBlcnJvciBpcyBkZXRlY3RlZA0KLQ0KLSAgICAoIykgQVBJcyBwcm92aWRlZCBmb3IgdGhlc2UgMiB0cmFuc2ZlciBtb2RlcyAoQmxvY2tpbmcgbW9kZSBvciBOb24gYmxvY2tpbmcNCi1tb2RlIHVzaW5nIGVpdGhlciBJbnRlcnJ1cHQgb3IgRE1BKSBleGlzdCBmb3IgMUxpbmUgKHNpbXBsZXgpIGFuZCAyTGluZXMgKGZ1bGwNCi1kdXBsZXgpIG1vZGVzLg0KLQ0KLUBlbmR2ZXJiYXRpbQ0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFRyYW5zbWl0IGFuIGFtb3VudCBvZiBkYXRhIGluIGJsb2NraW5nIG1vZGUuDQotICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KLSAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuDQotICogQHBhcmFtICBwRGF0YSBwb2ludGVyIHRvIGRhdGEgYnVmZmVyDQotICogQHBhcmFtICBTaXplIGFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQNCi0gKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbg0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfVHJhbnNtaXQoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGksIHVpbnQ4X3QgKnBEYXRhLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCkgew0KLSAgdWludDMyX3QgdGlja3N0YXJ0Ow0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgZXJyb3Jjb2RlID0gSEFMX09LOw0KLSAgdWludDE2X3QgaW5pdGlhbF9UeFhmZXJDb3VudDsNCi0NCi0gIC8qIENoZWNrIERpcmVjdGlvbiBwYXJhbWV0ZXIgKi8NCi0gIGFzc2VydF9wYXJhbShJU19TUElfRElSRUNUSU9OXzJMSU5FU19PUl8xTElORShoc3BpLT5Jbml0LkRpcmVjdGlvbikpOw0KLQ0KLSAgLyogUHJvY2VzcyBMb2NrZWQgKi8NCi0gIF9fSEFMX0xPQ0soaHNwaSk7DQotDQotICAvKiBJbml0IHRpY2tzdGFydCBmb3IgdGltZW91dCBtYW5hZ2VtZW50Ki8NCi0gIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7DQotICBpbml0aWFsX1R4WGZlckNvdW50ID0gU2l6ZTsNCi0NCi0gIGlmIChoc3BpLT5TdGF0ZSAhPSBIQUxfU1BJX1NUQVRFX1JFQURZKSB7DQotICAgIGVycm9yY29kZSA9IEhBTF9CVVNZOw0KLSAgICBnb3RvIGVycm9yOw0KLSAgfQ0KLQ0KLSAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpIHsNCi0gICAgZXJyb3Jjb2RlID0gSEFMX0VSUk9SOw0KLSAgICBnb3RvIGVycm9yOw0KLSAgfQ0KLQ0KLSAgLyogU2V0IHRoZSB0cmFuc2FjdGlvbiBpbmZvcm1hdGlvbiAqLw0KLSAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX0JVU1lfVFg7DQotICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX05PTkU7DQotICBoc3BpLT5wVHhCdWZmUHRyID0gKHVpbnQ4X3QgKilwRGF0YTsNCi0gIGhzcGktPlR4WGZlclNpemUgPSBTaXplOw0KLSAgaHNwaS0+VHhYZmVyQ291bnQgPSBTaXplOw0KLQ0KLSAgLypJbml0IGZpZWxkIG5vdCB1c2VkIGluIGhhbmRsZSB0byB6ZXJvICovDQotICBoc3BpLT5wUnhCdWZmUHRyID0gKHVpbnQ4X3QgKilOVUxMOw0KLSAgaHNwaS0+UnhYZmVyU2l6ZSA9IDBVOw0KLSAgaHNwaS0+UnhYZmVyQ291bnQgPSAwVTsNCi0gIGhzcGktPlR4SVNSID0gTlVMTDsNCi0gIGhzcGktPlJ4SVNSID0gTlVMTDsNCi0NCi0gIC8qIENvbmZpZ3VyZSBjb21tdW5pY2F0aW9uIGRpcmVjdGlvbiA6IDFMaW5lICovDQotICBpZiAoaHNwaS0+SW5pdC5EaXJlY3Rpb24gPT0gU1BJX0RJUkVDVElPTl8xTElORSkgew0KLSAgICAvKiBEaXNhYmxlIFNQSSBQZXJpcGhlcmFsIGJlZm9yZSBzZXQgMUxpbmUgZGlyZWN0aW9uIChCSURJT0UgYml0KSAqLw0KLSAgICBfX0hBTF9TUElfRElTQUJMRShoc3BpKTsNCi0gICAgU1BJXzFMSU5FX1RYKGhzcGkpOw0KLSAgfQ0KLQ0KLSNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpDQotICAvKiBSZXNldCBDUkMgQ2FsY3VsYXRpb24gKi8NCi0gIGlmIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpIHsNCi0gICAgU1BJX1JFU0VUX0NSQyhoc3BpKTsNCi0gIH0NCi0jZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8NCi0NCi0gIC8qIENoZWNrIGlmIHRoZSBTUEkgaXMgYWxyZWFkeSBlbmFibGVkICovDQotICBpZiAoKGhzcGktPkluc3RhbmNlLT5DUjEgJiBTUElfQ1IxX1NQRSkgIT0gU1BJX0NSMV9TUEUpIHsNCi0gICAgLyogRW5hYmxlIFNQSSBwZXJpcGhlcmFsICovDQotICAgIF9fSEFMX1NQSV9FTkFCTEUoaHNwaSk7DQotICB9DQotDQotICAvKiBUcmFuc21pdCBkYXRhIGluIDE2IEJpdCBtb2RlICovDQotICBpZiAoaHNwaS0+SW5pdC5EYXRhU2l6ZSA+IFNQSV9EQVRBU0laRV84QklUKSB7DQotICAgIGlmICgoaHNwaS0+SW5pdC5Nb2RlID09IFNQSV9NT0RFX1NMQVZFKSB8fCAoaW5pdGlhbF9UeFhmZXJDb3VudCA9PSAweDAxVSkpIHsNCi0gICAgICBoc3BpLT5JbnN0YW5jZS0+RFIgPSAqKCh1aW50MTZfdCAqKWhzcGktPnBUeEJ1ZmZQdHIpOw0KLSAgICAgIGhzcGktPnBUeEJ1ZmZQdHIgKz0gc2l6ZW9mKHVpbnQxNl90KTsNCi0gICAgICBoc3BpLT5UeFhmZXJDb3VudC0tOw0KLSAgICB9DQotICAgIC8qIFRyYW5zbWl0IGRhdGEgaW4gMTYgQml0IG1vZGUgKi8NCi0gICAgd2hpbGUgKGhzcGktPlR4WGZlckNvdW50ID4gMFUpIHsNCi0gICAgICAvKiBXYWl0IHVudGlsIFRYRSBmbGFnIGlzIHNldCB0byBzZW5kIGRhdGEgKi8NCi0gICAgICBpZiAoX19IQUxfU1BJX0dFVF9GTEFHKGhzcGksIFNQSV9GTEFHX1RYRSkpIHsNCi0gICAgICAgIGhzcGktPkluc3RhbmNlLT5EUiA9ICooKHVpbnQxNl90ICopaHNwaS0+cFR4QnVmZlB0cik7DQotICAgICAgICBoc3BpLT5wVHhCdWZmUHRyICs9IHNpemVvZih1aW50MTZfdCk7DQotICAgICAgICBoc3BpLT5UeFhmZXJDb3VudC0tOw0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICAvKiBUaW1lb3V0IG1hbmFnZW1lbnQgKi8NCi0gICAgICAgIGlmICgoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+PSBUaW1lb3V0KSAmJg0KLSAgICAgICAgICAgICAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKSkgfHwNCi0gICAgICAgICAgICAoVGltZW91dCA9PSAwVSkpIHsNCi0gICAgICAgICAgZXJyb3Jjb2RlID0gSEFMX1RJTUVPVVQ7DQotICAgICAgICAgIGdvdG8gZXJyb3I7DQotICAgICAgICB9DQotICAgICAgfQ0KLSAgICB9DQotICB9DQotICAvKiBUcmFuc21pdCBkYXRhIGluIDggQml0IG1vZGUgKi8NCi0gIGVsc2Ugew0KLSAgICBpZiAoKGhzcGktPkluaXQuTW9kZSA9PSBTUElfTU9ERV9TTEFWRSkgfHwgKGluaXRpYWxfVHhYZmVyQ291bnQgPT0gMHgwMVUpKSB7DQotICAgICAgaWYgKGhzcGktPlR4WGZlckNvdW50ID4gMVUpIHsNCi0gICAgICAgIC8qIHdyaXRlIG9uIHRoZSBkYXRhIHJlZ2lzdGVyIGluIHBhY2tpbmcgbW9kZSAqLw0KLSAgICAgICAgaHNwaS0+SW5zdGFuY2UtPkRSID0gKigodWludDE2X3QgKiloc3BpLT5wVHhCdWZmUHRyKTsNCi0gICAgICAgIGhzcGktPnBUeEJ1ZmZQdHIgKz0gc2l6ZW9mKHVpbnQxNl90KTsNCi0gICAgICAgIGhzcGktPlR4WGZlckNvdW50IC09IDJVOw0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICAqKChfX0lPIHVpbnQ4X3QgKikmaHNwaS0+SW5zdGFuY2UtPkRSKSA9ICgqaHNwaS0+cFR4QnVmZlB0cik7DQotICAgICAgICBoc3BpLT5wVHhCdWZmUHRyKys7DQotICAgICAgICBoc3BpLT5UeFhmZXJDb3VudC0tOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgICB3aGlsZSAoaHNwaS0+VHhYZmVyQ291bnQgPiAwVSkgew0KLSAgICAgIC8qIFdhaXQgdW50aWwgVFhFIGZsYWcgaXMgc2V0IHRvIHNlbmQgZGF0YSAqLw0KLSAgICAgIGlmIChfX0hBTF9TUElfR0VUX0ZMQUcoaHNwaSwgU1BJX0ZMQUdfVFhFKSkgew0KLSAgICAgICAgaWYgKGhzcGktPlR4WGZlckNvdW50ID4gMVUpIHsNCi0gICAgICAgICAgLyogd3JpdGUgb24gdGhlIGRhdGEgcmVnaXN0ZXIgaW4gcGFja2luZyBtb2RlICovDQotICAgICAgICAgIGhzcGktPkluc3RhbmNlLT5EUiA9ICooKHVpbnQxNl90ICopaHNwaS0+cFR4QnVmZlB0cik7DQotICAgICAgICAgIGhzcGktPnBUeEJ1ZmZQdHIgKz0gc2l6ZW9mKHVpbnQxNl90KTsNCi0gICAgICAgICAgaHNwaS0+VHhYZmVyQ291bnQgLT0gMlU7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAqKChfX0lPIHVpbnQ4X3QgKikmaHNwaS0+SW5zdGFuY2UtPkRSKSA9ICgqaHNwaS0+cFR4QnVmZlB0cik7DQotICAgICAgICAgIGhzcGktPnBUeEJ1ZmZQdHIrKzsNCi0gICAgICAgICAgaHNwaS0+VHhYZmVyQ291bnQtLTsNCi0gICAgICAgIH0NCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgLyogVGltZW91dCBtYW5hZ2VtZW50ICovDQotICAgICAgICBpZiAoKCgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPj0gVGltZW91dCkgJiYNCi0gICAgICAgICAgICAgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkpIHx8DQotICAgICAgICAgICAgKFRpbWVvdXQgPT0gMFUpKSB7DQotICAgICAgICAgIGVycm9yY29kZSA9IEhBTF9USU1FT1VUOw0KLSAgICAgICAgICBnb3RvIGVycm9yOw0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0gICAgfQ0KLSAgfQ0KLSNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpDQotICAvKiBFbmFibGUgQ1JDIFRyYW5zbWlzc2lvbiAqLw0KLSAgaWYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkgew0KLSAgICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjEsIFNQSV9DUjFfQ1JDTkVYVCk7DQotICB9DQotI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovDQotDQotICAvKiBDaGVjayB0aGUgZW5kIG9mIHRoZSB0cmFuc2FjdGlvbiAqLw0KLSAgaWYgKFNQSV9FbmRSeFR4VHJhbnNhY3Rpb24oaHNwaSwgVGltZW91dCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spIHsNCi0gICAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9GTEFHOw0KLSAgfQ0KLQ0KLSAgLyogQ2xlYXIgb3ZlcnJ1biBmbGFnIGluIDIgTGluZXMgY29tbXVuaWNhdGlvbiBtb2RlIGJlY2F1c2UgcmVjZWl2ZWQgaXMgbm90DQotICAgKiByZWFkICovDQotICBpZiAoaHNwaS0+SW5pdC5EaXJlY3Rpb24gPT0gU1BJX0RJUkVDVElPTl8yTElORVMpIHsNCi0gICAgX19IQUxfU1BJX0NMRUFSX09WUkZMQUcoaHNwaSk7DQotICB9DQotDQotICBpZiAoaHNwaS0+RXJyb3JDb2RlICE9IEhBTF9TUElfRVJST1JfTk9ORSkgew0KLSAgICBlcnJvcmNvZGUgPSBIQUxfRVJST1I7DQotICB9DQotDQotZXJyb3I6DQotICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfUkVBRFk7DQotICAvKiBQcm9jZXNzIFVubG9ja2VkICovDQotICBfX0hBTF9VTkxPQ0soaHNwaSk7DQotICByZXR1cm4gZXJyb3Jjb2RlOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZS4NCi0gKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQotICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4NCi0gKiBAcGFyYW0gIHBEYXRhIHBvaW50ZXIgdG8gZGF0YSBidWZmZXINCi0gKiBAcGFyYW0gIFNpemUgYW1vdW50IG9mIGRhdGEgdG8gYmUgcmVjZWl2ZWQNCi0gKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbg0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfUmVjZWl2ZShTUElfSGFuZGxlVHlwZURlZiAqaHNwaSwgdWludDhfdCAqcERhdGEsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpIHsNCi0jaWYgKFVTRV9TUElfQ1JDICE9IDBVKQ0KLSAgX19JTyB1aW50MzJfdCB0bXByZWcgPSAwVTsNCi0gIF9fSU8gdWludDhfdCAqcHRtcHJlZzg7DQotICBfX0lPIHVpbnQ4X3QgdG1wcmVnOCA9IDA7DQotI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovDQotICB1aW50MzJfdCB0aWNrc3RhcnQ7DQotICBIQUxfU3RhdHVzVHlwZURlZiBlcnJvcmNvZGUgPSBIQUxfT0s7DQotDQotICBpZiAoKGhzcGktPkluaXQuTW9kZSA9PSBTUElfTU9ERV9NQVNURVIpICYmDQotICAgICAgKGhzcGktPkluaXQuRGlyZWN0aW9uID09IFNQSV9ESVJFQ1RJT05fMkxJTkVTKSkgew0KLSAgICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfQlVTWV9SWDsNCi0gICAgLyogQ2FsbCB0cmFuc21pdC1yZWNlaXZlIGZ1bmN0aW9uIHRvIHNlbmQgRHVtbXkgZGF0YSBvbiBUeCBsaW5lIGFuZCBnZW5lcmF0ZQ0KLSAgICAgKiBjbG9jayBvbiBDTEsgbGluZSAqLw0KLSAgICByZXR1cm4gSEFMX1NQSV9UcmFuc21pdFJlY2VpdmUoaHNwaSwgcERhdGEsIHBEYXRhLCBTaXplLCBUaW1lb3V0KTsNCi0gIH0NCi0NCi0gIC8qIFByb2Nlc3MgTG9ja2VkICovDQotICBfX0hBTF9MT0NLKGhzcGkpOw0KLQ0KLSAgLyogSW5pdCB0aWNrc3RhcnQgZm9yIHRpbWVvdXQgbWFuYWdlbWVudCovDQotICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOw0KLQ0KLSAgaWYgKGhzcGktPlN0YXRlICE9IEhBTF9TUElfU1RBVEVfUkVBRFkpIHsNCi0gICAgZXJyb3Jjb2RlID0gSEFMX0JVU1k7DQotICAgIGdvdG8gZXJyb3I7DQotICB9DQotDQotICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkgew0KLSAgICBlcnJvcmNvZGUgPSBIQUxfRVJST1I7DQotICAgIGdvdG8gZXJyb3I7DQotICB9DQotDQotICAvKiBTZXQgdGhlIHRyYW5zYWN0aW9uIGluZm9ybWF0aW9uICovDQotICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfQlVTWV9SWDsNCi0gIGhzcGktPkVycm9yQ29kZSA9IEhBTF9TUElfRVJST1JfTk9ORTsNCi0gIGhzcGktPnBSeEJ1ZmZQdHIgPSAodWludDhfdCAqKXBEYXRhOw0KLSAgaHNwaS0+UnhYZmVyU2l6ZSA9IFNpemU7DQotICBoc3BpLT5SeFhmZXJDb3VudCA9IFNpemU7DQotDQotICAvKkluaXQgZmllbGQgbm90IHVzZWQgaW4gaGFuZGxlIHRvIHplcm8gKi8NCi0gIGhzcGktPnBUeEJ1ZmZQdHIgPSAodWludDhfdCAqKU5VTEw7DQotICBoc3BpLT5UeFhmZXJTaXplID0gMFU7DQotICBoc3BpLT5UeFhmZXJDb3VudCA9IDBVOw0KLSAgaHNwaS0+UnhJU1IgPSBOVUxMOw0KLSAgaHNwaS0+VHhJU1IgPSBOVUxMOw0KLQ0KLSNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpDQotICAvKiBSZXNldCBDUkMgQ2FsY3VsYXRpb24gKi8NCi0gIGlmIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpIHsNCi0gICAgU1BJX1JFU0VUX0NSQyhoc3BpKTsNCi0gICAgLyogdGhpcyBpcyBkb25lIHRvIGhhbmRsZSB0aGUgQ1JDTkVYVCBiZWZvcmUgdGhlIGxhdGVzdCBkYXRhICovDQotICAgIGhzcGktPlJ4WGZlckNvdW50LS07DQotICB9DQotI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovDQotDQotICAvKiBTZXQgdGhlIFJ4IEZpZm8gdGhyZXNob2xkICovDQotICBpZiAoaHNwaS0+SW5pdC5EYXRhU2l6ZSA+IFNQSV9EQVRBU0laRV84QklUKSB7DQotICAgIC8qIFNldCBSWCBGaWZvIHRocmVzaG9sZCBhY2NvcmRpbmcgdGhlIHJlY2VwdGlvbiBkYXRhIGxlbmd0aDogMTZiaXQgKi8NCi0gICAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9SWEZJRk9fVEhSRVNIT0xEKTsNCi0gIH0gZWxzZSB7DQotICAgIC8qIFNldCBSWCBGaWZvIHRocmVzaG9sZCBhY2NvcmRpbmcgdGhlIHJlY2VwdGlvbiBkYXRhIGxlbmd0aDogOGJpdCAqLw0KLSAgICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9SWEZJRk9fVEhSRVNIT0xEKTsNCi0gIH0NCi0NCi0gIC8qIENvbmZpZ3VyZSBjb21tdW5pY2F0aW9uIGRpcmVjdGlvbjogMUxpbmUgKi8NCi0gIGlmIChoc3BpLT5Jbml0LkRpcmVjdGlvbiA9PSBTUElfRElSRUNUSU9OXzFMSU5FKSB7DQotICAgIC8qIERpc2FibGUgU1BJIFBlcmlwaGVyYWwgYmVmb3JlIHNldCAxTGluZSBkaXJlY3Rpb24gKEJJRElPRSBiaXQpICovDQotICAgIF9fSEFMX1NQSV9ESVNBQkxFKGhzcGkpOw0KLSAgICBTUElfMUxJTkVfUlgoaHNwaSk7DQotICB9DQotDQotICAvKiBDaGVjayBpZiB0aGUgU1BJIGlzIGFscmVhZHkgZW5hYmxlZCAqLw0KLSAgaWYgKChoc3BpLT5JbnN0YW5jZS0+Q1IxICYgU1BJX0NSMV9TUEUpICE9IFNQSV9DUjFfU1BFKSB7DQotICAgIC8qIEVuYWJsZSBTUEkgcGVyaXBoZXJhbCAqLw0KLSAgICBfX0hBTF9TUElfRU5BQkxFKGhzcGkpOw0KLSAgfQ0KLQ0KLSAgLyogUmVjZWl2ZSBkYXRhIGluIDggQml0IG1vZGUgKi8NCi0gIGlmIChoc3BpLT5Jbml0LkRhdGFTaXplIDw9IFNQSV9EQVRBU0laRV84QklUKSB7DQotICAgIC8qIFRyYW5zZmVyIGxvb3AgKi8NCi0gICAgd2hpbGUgKGhzcGktPlJ4WGZlckNvdW50ID4gMFUpIHsNCi0gICAgICAvKiBDaGVjayB0aGUgUlhORSBmbGFnICovDQotICAgICAgaWYgKF9fSEFMX1NQSV9HRVRfRkxBRyhoc3BpLCBTUElfRkxBR19SWE5FKSkgew0KLSAgICAgICAgLyogcmVhZCB0aGUgcmVjZWl2ZWQgZGF0YSAqLw0KLSAgICAgICAgKCoodWludDhfdCAqKWhzcGktPnBSeEJ1ZmZQdHIpID0gKihfX0lPIHVpbnQ4X3QgKikmaHNwaS0+SW5zdGFuY2UtPkRSOw0KLSAgICAgICAgaHNwaS0+cFJ4QnVmZlB0ciArPSBzaXplb2YodWludDhfdCk7DQotICAgICAgICBoc3BpLT5SeFhmZXJDb3VudC0tOw0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICAvKiBUaW1lb3V0IG1hbmFnZW1lbnQgKi8NCi0gICAgICAgIGlmICgoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+PSBUaW1lb3V0KSAmJg0KLSAgICAgICAgICAgICAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKSkgfHwNCi0gICAgICAgICAgICAoVGltZW91dCA9PSAwVSkpIHsNCi0gICAgICAgICAgZXJyb3Jjb2RlID0gSEFMX1RJTUVPVVQ7DQotICAgICAgICAgIGdvdG8gZXJyb3I7DQotICAgICAgICB9DQotICAgICAgfQ0KLSAgICB9DQotICB9IGVsc2Ugew0KLSAgICAvKiBUcmFuc2ZlciBsb29wICovDQotICAgIHdoaWxlIChoc3BpLT5SeFhmZXJDb3VudCA+IDBVKSB7DQotICAgICAgLyogQ2hlY2sgdGhlIFJYTkUgZmxhZyAqLw0KLSAgICAgIGlmIChfX0hBTF9TUElfR0VUX0ZMQUcoaHNwaSwgU1BJX0ZMQUdfUlhORSkpIHsNCi0gICAgICAgICooKHVpbnQxNl90ICopaHNwaS0+cFJ4QnVmZlB0cikgPSAodWludDE2X3QpaHNwaS0+SW5zdGFuY2UtPkRSOw0KLSAgICAgICAgaHNwaS0+cFJ4QnVmZlB0ciArPSBzaXplb2YodWludDE2X3QpOw0KLSAgICAgICAgaHNwaS0+UnhYZmVyQ291bnQtLTsNCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgLyogVGltZW91dCBtYW5hZ2VtZW50ICovDQotICAgICAgICBpZiAoKCgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPj0gVGltZW91dCkgJiYNCi0gICAgICAgICAgICAgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkpIHx8DQotICAgICAgICAgICAgKFRpbWVvdXQgPT0gMFUpKSB7DQotICAgICAgICAgIGVycm9yY29kZSA9IEhBTF9USU1FT1VUOw0KLSAgICAgICAgICBnb3RvIGVycm9yOw0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0gICAgfQ0KLSAgfQ0KLQ0KLSNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpDQotICAvKiBIYW5kbGUgdGhlIENSQyBUcmFuc21pc3Npb24gKi8NCi0gIGlmIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpIHsNCi0gICAgLyogZnJlZXplIHRoZSBDUkMgYmVmb3JlIHRoZSBsYXRlc3QgZGF0YSAqLw0KLSAgICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjEsIFNQSV9DUjFfQ1JDTkVYVCk7DQotDQotICAgIC8qIFJlYWQgdGhlIGxhdGVzdCBkYXRhICovDQotICAgIGlmIChTUElfV2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChoc3BpLCBTUElfRkxBR19SWE5FLCBTRVQsIFRpbWVvdXQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWNrc3RhcnQpICE9IEhBTF9PSykgew0KLSAgICAgIC8qIHRoZSBsYXRlc3QgZGF0YSBoYXMgbm90IGJlZW4gcmVjZWl2ZWQgKi8NCi0gICAgICBlcnJvcmNvZGUgPSBIQUxfVElNRU9VVDsNCi0gICAgICBnb3RvIGVycm9yOw0KLSAgICB9DQotDQotICAgIC8qIFJlY2VpdmUgbGFzdCBkYXRhIGluIDE2IEJpdCBtb2RlICovDQotICAgIGlmIChoc3BpLT5Jbml0LkRhdGFTaXplID4gU1BJX0RBVEFTSVpFXzhCSVQpIHsNCi0gICAgICAqKCh1aW50MTZfdCAqKWhzcGktPnBSeEJ1ZmZQdHIpID0gKHVpbnQxNl90KWhzcGktPkluc3RhbmNlLT5EUjsNCi0gICAgfQ0KLSAgICAvKiBSZWNlaXZlIGxhc3QgZGF0YSBpbiA4IEJpdCBtb2RlICovDQotICAgIGVsc2Ugew0KLSAgICAgICgqKHVpbnQ4X3QgKiloc3BpLT5wUnhCdWZmUHRyKSA9ICooX19JTyB1aW50OF90ICopJmhzcGktPkluc3RhbmNlLT5EUjsNCi0gICAgfQ0KLQ0KLSAgICAvKiBXYWl0IHRoZSBDUkMgZGF0YSAqLw0KLSAgICBpZiAoU1BJX1dhaXRGbGFnU3RhdGVVbnRpbFRpbWVvdXQoaHNwaSwgU1BJX0ZMQUdfUlhORSwgU0VULCBUaW1lb3V0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlja3N0YXJ0KSAhPSBIQUxfT0spIHsNCi0gICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9DUkMpOw0KLSAgICAgIGVycm9yY29kZSA9IEhBTF9USU1FT1VUOw0KLSAgICAgIGdvdG8gZXJyb3I7DQotICAgIH0NCi0NCi0gICAgLyogUmVhZCBDUkMgdG8gRmx1c2ggRFIgYW5kIFJYTkUgZmxhZyAqLw0KLSAgICBpZiAoaHNwaS0+SW5pdC5EYXRhU2l6ZSA9PSBTUElfREFUQVNJWkVfMTZCSVQpIHsNCi0gICAgICAvKiBSZWFkIDE2Yml0IENSQyAqLw0KLSAgICAgIHRtcHJlZyA9IFJFQURfUkVHKGhzcGktPkluc3RhbmNlLT5EUik7DQotICAgICAgLyogVG8gYXZvaWQgR0NDIHdhcm5pbmcgKi8NCi0gICAgICBVTlVTRUQodG1wcmVnKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAvKiBJbml0aWFsaXplIHRoZSA4Yml0IHRlbXBvcmFyeSBwb2ludGVyICovDQotICAgICAgcHRtcHJlZzggPSAoX19JTyB1aW50OF90ICopJmhzcGktPkluc3RhbmNlLT5EUjsNCi0gICAgICAvKiBSZWFkIDhiaXQgQ1JDICovDQotICAgICAgdG1wcmVnOCA9ICpwdG1wcmVnODsNCi0gICAgICAvKiBUbyBhdm9pZCBHQ0Mgd2FybmluZyAqLw0KLSAgICAgIFVOVVNFRCh0bXByZWc4KTsNCi0NCi0gICAgICBpZiAoKGhzcGktPkluaXQuRGF0YVNpemUgPT0gU1BJX0RBVEFTSVpFXzhCSVQpICYmDQotICAgICAgICAgIChoc3BpLT5Jbml0LkNSQ0xlbmd0aCA9PSBTUElfQ1JDX0xFTkdUSF8xNkJJVCkpIHsNCi0gICAgICAgIGlmIChTUElfV2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChoc3BpLCBTUElfRkxBR19SWE5FLCBTRVQsIFRpbWVvdXQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlja3N0YXJ0KSAhPSBIQUxfT0spIHsNCi0gICAgICAgICAgLyogRXJyb3Igb24gdGhlIENSQyByZWNlcHRpb24gKi8NCi0gICAgICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfQ1JDKTsNCi0gICAgICAgICAgZXJyb3Jjb2RlID0gSEFMX1RJTUVPVVQ7DQotICAgICAgICAgIGdvdG8gZXJyb3I7DQotICAgICAgICB9DQotICAgICAgICAvKiBSZWFkIDhiaXQgQ1JDIGFnYWluIGluIGNhc2Ugb2YgMTZiaXQgQ1JDIGluIDhiaXQgRGF0YSBtb2RlICovDQotICAgICAgICB0bXByZWc4ID0gKnB0bXByZWc4Ow0KLSAgICAgICAgLyogVG8gYXZvaWQgR0NDIHdhcm5pbmcgKi8NCi0gICAgICAgIFVOVVNFRCh0bXByZWc4KTsNCi0gICAgICB9DQotICAgIH0NCi0gIH0NCi0jZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8NCi0NCi0gIC8qIENoZWNrIHRoZSBlbmQgb2YgdGhlIHRyYW5zYWN0aW9uICovDQotICBpZiAoU1BJX0VuZFJ4VHJhbnNhY3Rpb24oaHNwaSwgVGltZW91dCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spIHsNCi0gICAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9GTEFHOw0KLSAgfQ0KLQ0KLSNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpDQotICAvKiBDaGVjayBpZiBDUkMgZXJyb3Igb2NjdXJyZWQgKi8NCi0gIGlmIChfX0hBTF9TUElfR0VUX0ZMQUcoaHNwaSwgU1BJX0ZMQUdfQ1JDRVJSKSkgew0KLSAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9DUkMpOw0KLSAgICBfX0hBTF9TUElfQ0xFQVJfQ1JDRVJSRkxBRyhoc3BpKTsNCi0gIH0NCi0jZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8NCi0NCi0gIGlmIChoc3BpLT5FcnJvckNvZGUgIT0gSEFMX1NQSV9FUlJPUl9OT05FKSB7DQotICAgIGVycm9yY29kZSA9IEhBTF9FUlJPUjsNCi0gIH0NCi0NCi1lcnJvcjoNCi0gIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9SRUFEWTsNCi0gIF9fSEFMX1VOTE9DSyhoc3BpKTsNCi0gIHJldHVybiBlcnJvcmNvZGU7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgVHJhbnNtaXQgYW5kIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZS4NCi0gKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQotICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4NCi0gKiBAcGFyYW0gIHBUeERhdGEgcG9pbnRlciB0byB0cmFuc21pc3Npb24gZGF0YSBidWZmZXINCi0gKiBAcGFyYW0gIHBSeERhdGEgcG9pbnRlciB0byByZWNlcHRpb24gZGF0YSBidWZmZXINCi0gKiBAcGFyYW0gIFNpemUgYW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudCBhbmQgcmVjZWl2ZWQNCi0gKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbg0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfVHJhbnNtaXRSZWNlaXZlKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBUeERhdGEsIHVpbnQ4X3QgKnBSeERhdGEsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCkgew0KLSAgdWludDE2X3QgaW5pdGlhbF9UeFhmZXJDb3VudDsNCi0gIHVpbnQxNl90IGluaXRpYWxfUnhYZmVyQ291bnQ7DQotICB1aW50MzJfdCB0bXBfbW9kZTsNCi0gIEhBTF9TUElfU3RhdGVUeXBlRGVmIHRtcF9zdGF0ZTsNCi0gIHVpbnQzMl90IHRpY2tzdGFydDsNCi0jaWYgKFVTRV9TUElfQ1JDICE9IDBVKQ0KLSAgX19JTyB1aW50MzJfdCB0bXByZWcgPSAwVTsNCi0gIHVpbnQzMl90IHNwaV9jcjE7DQotICB1aW50MzJfdCBzcGlfY3IyOw0KLSAgX19JTyB1aW50OF90ICpwdG1wcmVnODsNCi0gIF9fSU8gdWludDhfdCB0bXByZWc4ID0gMDsNCi0jZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8NCi0NCi0gIC8qIFZhcmlhYmxlIHVzZWQgdG8gYWx0ZXJuYXRlIFJ4IGFuZCBUeCBkdXJpbmcgdHJhbnNmZXIgKi8NCi0gIHVpbnQzMl90IHR4YWxsb3dlZCA9IDFVOw0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgZXJyb3Jjb2RlID0gSEFMX09LOw0KLQ0KLSAgLyogQ2hlY2sgRGlyZWN0aW9uIHBhcmFtZXRlciAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1NQSV9ESVJFQ1RJT05fMkxJTkVTKGhzcGktPkluaXQuRGlyZWN0aW9uKSk7DQotDQotICAvKiBQcm9jZXNzIExvY2tlZCAqLw0KLSAgX19IQUxfTE9DSyhoc3BpKTsNCi0NCi0gIC8qIEluaXQgdGlja3N0YXJ0IGZvciB0aW1lb3V0IG1hbmFnZW1lbnQqLw0KLSAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsNCi0NCi0gIC8qIEluaXQgdGVtcG9yYXJ5IHZhcmlhYmxlcyAqLw0KLSAgdG1wX3N0YXRlID0gaHNwaS0+U3RhdGU7DQotICB0bXBfbW9kZSA9IGhzcGktPkluaXQuTW9kZTsNCi0gIGluaXRpYWxfVHhYZmVyQ291bnQgPSBTaXplOw0KLSAgaW5pdGlhbF9SeFhmZXJDb3VudCA9IFNpemU7DQotI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkNCi0gIHNwaV9jcjEgPSBSRUFEX1JFRyhoc3BpLT5JbnN0YW5jZS0+Q1IxKTsNCi0gIHNwaV9jcjIgPSBSRUFEX1JFRyhoc3BpLT5JbnN0YW5jZS0+Q1IyKTsNCi0jZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8NCi0NCi0gIGlmICghKCh0bXBfc3RhdGUgPT0gSEFMX1NQSV9TVEFURV9SRUFEWSkgfHwNCi0gICAgICAgICgodG1wX21vZGUgPT0gU1BJX01PREVfTUFTVEVSKSAmJg0KLSAgICAgICAgIChoc3BpLT5Jbml0LkRpcmVjdGlvbiA9PSBTUElfRElSRUNUSU9OXzJMSU5FUykgJiYNCi0gICAgICAgICAodG1wX3N0YXRlID09IEhBTF9TUElfU1RBVEVfQlVTWV9SWCkpKSkgew0KLSAgICBlcnJvcmNvZGUgPSBIQUxfQlVTWTsNCi0gICAgZ290byBlcnJvcjsNCi0gIH0NCi0NCi0gIGlmICgocFR4RGF0YSA9PSBOVUxMKSB8fCAocFJ4RGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpIHsNCi0gICAgZXJyb3Jjb2RlID0gSEFMX0VSUk9SOw0KLSAgICBnb3RvIGVycm9yOw0KLSAgfQ0KLQ0KLSAgLyogRG9uJ3Qgb3ZlcndyaXRlIGluIGNhc2Ugb2YgSEFMX1NQSV9TVEFURV9CVVNZX1JYICovDQotICBpZiAoaHNwaS0+U3RhdGUgIT0gSEFMX1NQSV9TVEFURV9CVVNZX1JYKSB7DQotICAgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9CVVNZX1RYX1JYOw0KLSAgfQ0KLQ0KLSAgLyogU2V0IHRoZSB0cmFuc2FjdGlvbiBpbmZvcm1hdGlvbiAqLw0KLSAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9OT05FOw0KLSAgaHNwaS0+cFJ4QnVmZlB0ciA9ICh1aW50OF90ICopcFJ4RGF0YTsNCi0gIGhzcGktPlJ4WGZlckNvdW50ID0gU2l6ZTsNCi0gIGhzcGktPlJ4WGZlclNpemUgPSBTaXplOw0KLSAgaHNwaS0+cFR4QnVmZlB0ciA9ICh1aW50OF90ICopcFR4RGF0YTsNCi0gIGhzcGktPlR4WGZlckNvdW50ID0gU2l6ZTsNCi0gIGhzcGktPlR4WGZlclNpemUgPSBTaXplOw0KLQ0KLSAgLypJbml0IGZpZWxkIG5vdCB1c2VkIGluIGhhbmRsZSB0byB6ZXJvICovDQotICBoc3BpLT5SeElTUiA9IE5VTEw7DQotICBoc3BpLT5UeElTUiA9IE5VTEw7DQotDQotI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkNCi0gIC8qIFJlc2V0IENSQyBDYWxjdWxhdGlvbiAqLw0KLSAgaWYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkgew0KLSAgICBTUElfUkVTRVRfQ1JDKGhzcGkpOw0KLSAgfQ0KLSNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLw0KLQ0KLSAgLyogU2V0IHRoZSBSeCBGaWZvIHRocmVzaG9sZCAqLw0KLSAgaWYgKChoc3BpLT5Jbml0LkRhdGFTaXplID4gU1BJX0RBVEFTSVpFXzhCSVQpIHx8IChpbml0aWFsX1J4WGZlckNvdW50ID4gMVUpKSB7DQotICAgIC8qIFNldCBmaWZvcnh0aHJlc2hvbGQgYWNjb3JkaW5nIHRoZSByZWNlcHRpb24gZGF0YSBsZW5ndGg6IDE2Yml0ICovDQotICAgIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfUlhGSUZPX1RIUkVTSE9MRCk7DQotICB9IGVsc2Ugew0KLSAgICAvKiBTZXQgZmlmb3J4dGhyZXNob2xkIGFjY29yZGluZyB0aGUgcmVjZXB0aW9uIGRhdGEgbGVuZ3RoOiA4Yml0ICovDQotICAgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX1JYRklGT19USFJFU0hPTEQpOw0KLSAgfQ0KLQ0KLSAgLyogQ2hlY2sgaWYgdGhlIFNQSSBpcyBhbHJlYWR5IGVuYWJsZWQgKi8NCi0gIGlmICgoaHNwaS0+SW5zdGFuY2UtPkNSMSAmIFNQSV9DUjFfU1BFKSAhPSBTUElfQ1IxX1NQRSkgew0KLSAgICAvKiBFbmFibGUgU1BJIHBlcmlwaGVyYWwgKi8NCi0gICAgX19IQUxfU1BJX0VOQUJMRShoc3BpKTsNCi0gIH0NCi0NCi0gIC8qIFRyYW5zbWl0IGFuZCBSZWNlaXZlIGRhdGEgaW4gMTYgQml0IG1vZGUgKi8NCi0gIGlmIChoc3BpLT5Jbml0LkRhdGFTaXplID4gU1BJX0RBVEFTSVpFXzhCSVQpIHsNCi0gICAgaWYgKChoc3BpLT5Jbml0Lk1vZGUgPT0gU1BJX01PREVfU0xBVkUpIHx8IChpbml0aWFsX1R4WGZlckNvdW50ID09IDB4MDFVKSkgew0KLSAgICAgIGhzcGktPkluc3RhbmNlLT5EUiA9ICooKHVpbnQxNl90ICopaHNwaS0+cFR4QnVmZlB0cik7DQotICAgICAgaHNwaS0+cFR4QnVmZlB0ciArPSBzaXplb2YodWludDE2X3QpOw0KLSAgICAgIGhzcGktPlR4WGZlckNvdW50LS07DQotICAgIH0NCi0gICAgd2hpbGUgKChoc3BpLT5UeFhmZXJDb3VudCA+IDBVKSB8fCAoaHNwaS0+UnhYZmVyQ291bnQgPiAwVSkpIHsNCi0gICAgICAvKiBDaGVjayBUWEUgZmxhZyAqLw0KLSAgICAgIGlmICgoX19IQUxfU1BJX0dFVF9GTEFHKGhzcGksIFNQSV9GTEFHX1RYRSkpICYmDQotICAgICAgICAgIChoc3BpLT5UeFhmZXJDb3VudCA+IDBVKSAmJiAodHhhbGxvd2VkID09IDFVKSkgew0KLSAgICAgICAgaHNwaS0+SW5zdGFuY2UtPkRSID0gKigodWludDE2X3QgKiloc3BpLT5wVHhCdWZmUHRyKTsNCi0gICAgICAgIGhzcGktPnBUeEJ1ZmZQdHIgKz0gc2l6ZW9mKHVpbnQxNl90KTsNCi0gICAgICAgIGhzcGktPlR4WGZlckNvdW50LS07DQotICAgICAgICAvKiBOZXh0IERhdGEgaXMgYSByZWNlcHRpb24gKFJ4KS4gVHggbm90IGFsbG93ZWQgKi8NCi0gICAgICAgIHR4YWxsb3dlZCA9IDBVOw0KLQ0KLSNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpDQotICAgICAgICAvKiBFbmFibGUgQ1JDIFRyYW5zbWlzc2lvbiAqLw0KLSAgICAgICAgaWYgKChoc3BpLT5UeFhmZXJDb3VudCA9PSAwVSkgJiYNCi0gICAgICAgICAgICAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKSkgew0KLSAgICAgICAgICAvKiBTZXQgTlNTIFNvZnQgdG8gcmVjZWl2ZWQgY29ycmVjdGx5IHRoZSBDUkMgb24gc2xhdmUgbW9kZSB3aXRoIE5TUw0KLSAgICAgICAgICAgKiBwdWxzZSBhY3RpdmF0ZWQgKi8NCi0gICAgICAgICAgaWYgKChSRUFEX0JJVChzcGlfY3IxLCBTUElfQ1IxX01TVFIpID09IDBVKSAmJg0KLSAgICAgICAgICAgICAgKFJFQURfQklUKHNwaV9jcjIsIFNQSV9DUjJfTlNTUCkgPT0gU1BJX0NSMl9OU1NQKSkgew0KLSAgICAgICAgICAgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMSwgU1BJX0NSMV9TU00pOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMSwgU1BJX0NSMV9DUkNORVhUKTsNCi0gICAgICAgIH0NCi0jZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8NCi0gICAgICB9DQotDQotICAgICAgLyogQ2hlY2sgUlhORSBmbGFnICovDQotICAgICAgaWYgKChfX0hBTF9TUElfR0VUX0ZMQUcoaHNwaSwgU1BJX0ZMQUdfUlhORSkpICYmDQotICAgICAgICAgIChoc3BpLT5SeFhmZXJDb3VudCA+IDBVKSkgew0KLSAgICAgICAgKigodWludDE2X3QgKiloc3BpLT5wUnhCdWZmUHRyKSA9ICh1aW50MTZfdCloc3BpLT5JbnN0YW5jZS0+RFI7DQotICAgICAgICBoc3BpLT5wUnhCdWZmUHRyICs9IHNpemVvZih1aW50MTZfdCk7DQotICAgICAgICBoc3BpLT5SeFhmZXJDb3VudC0tOw0KLSAgICAgICAgLyogTmV4dCBEYXRhIGlzIGEgVHJhbnNtaXNzaW9uIChUeCkuIFR4IGlzIGFsbG93ZWQgKi8NCi0gICAgICAgIHR4YWxsb3dlZCA9IDFVOw0KLSAgICAgIH0NCi0gICAgICBpZiAoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+PSBUaW1lb3V0KSAmJg0KLSAgICAgICAgICAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKSkgew0KLSAgICAgICAgZXJyb3Jjb2RlID0gSEFMX1RJTUVPVVQ7DQotICAgICAgICBnb3RvIGVycm9yOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgfQ0KLSAgLyogVHJhbnNtaXQgYW5kIFJlY2VpdmUgZGF0YSBpbiA4IEJpdCBtb2RlICovDQotICBlbHNlIHsNCi0gICAgaWYgKChoc3BpLT5Jbml0Lk1vZGUgPT0gU1BJX01PREVfU0xBVkUpIHx8IChpbml0aWFsX1R4WGZlckNvdW50ID09IDB4MDFVKSkgew0KLSAgICAgIGlmIChoc3BpLT5UeFhmZXJDb3VudCA+IDFVKSB7DQotICAgICAgICBoc3BpLT5JbnN0YW5jZS0+RFIgPSAqKCh1aW50MTZfdCAqKWhzcGktPnBUeEJ1ZmZQdHIpOw0KLSAgICAgICAgaHNwaS0+cFR4QnVmZlB0ciArPSBzaXplb2YodWludDE2X3QpOw0KLSAgICAgICAgaHNwaS0+VHhYZmVyQ291bnQgLT0gMlU7DQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgICooX19JTyB1aW50OF90ICopJmhzcGktPkluc3RhbmNlLT5EUiA9ICgqaHNwaS0+cFR4QnVmZlB0cik7DQotICAgICAgICBoc3BpLT5wVHhCdWZmUHRyKys7DQotICAgICAgICBoc3BpLT5UeFhmZXJDb3VudC0tOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgICB3aGlsZSAoKGhzcGktPlR4WGZlckNvdW50ID4gMFUpIHx8IChoc3BpLT5SeFhmZXJDb3VudCA+IDBVKSkgew0KLSAgICAgIC8qIENoZWNrIFRYRSBmbGFnICovDQotICAgICAgaWYgKChfX0hBTF9TUElfR0VUX0ZMQUcoaHNwaSwgU1BJX0ZMQUdfVFhFKSkgJiYNCi0gICAgICAgICAgKGhzcGktPlR4WGZlckNvdW50ID4gMFUpICYmICh0eGFsbG93ZWQgPT0gMVUpKSB7DQotICAgICAgICBpZiAoaHNwaS0+VHhYZmVyQ291bnQgPiAxVSkgew0KLSAgICAgICAgICBoc3BpLT5JbnN0YW5jZS0+RFIgPSAqKCh1aW50MTZfdCAqKWhzcGktPnBUeEJ1ZmZQdHIpOw0KLSAgICAgICAgICBoc3BpLT5wVHhCdWZmUHRyICs9IHNpemVvZih1aW50MTZfdCk7DQotICAgICAgICAgIGhzcGktPlR4WGZlckNvdW50IC09IDJVOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgKihfX0lPIHVpbnQ4X3QgKikmaHNwaS0+SW5zdGFuY2UtPkRSID0gKCpoc3BpLT5wVHhCdWZmUHRyKTsNCi0gICAgICAgICAgaHNwaS0+cFR4QnVmZlB0cisrOw0KLSAgICAgICAgICBoc3BpLT5UeFhmZXJDb3VudC0tOw0KLSAgICAgICAgfQ0KLSAgICAgICAgLyogTmV4dCBEYXRhIGlzIGEgcmVjZXB0aW9uIChSeCkuIFR4IG5vdCBhbGxvd2VkICovDQotICAgICAgICB0eGFsbG93ZWQgPSAwVTsNCi0NCi0jaWYgKFVTRV9TUElfQ1JDICE9IDBVKQ0KLSAgICAgICAgLyogRW5hYmxlIENSQyBUcmFuc21pc3Npb24gKi8NCi0gICAgICAgIGlmICgoaHNwaS0+VHhYZmVyQ291bnQgPT0gMFUpICYmDQotICAgICAgICAgICAgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkpIHsNCi0gICAgICAgICAgLyogU2V0IE5TUyBTb2Z0IHRvIHJlY2VpdmVkIGNvcnJlY3RseSB0aGUgQ1JDIG9uIHNsYXZlIG1vZGUgd2l0aCBOU1MNCi0gICAgICAgICAgICogcHVsc2UgYWN0aXZhdGVkICovDQotICAgICAgICAgIGlmICgoUkVBRF9CSVQoc3BpX2NyMSwgU1BJX0NSMV9NU1RSKSA9PSAwVSkgJiYNCi0gICAgICAgICAgICAgIChSRUFEX0JJVChzcGlfY3IyLCBTUElfQ1IyX05TU1ApID09IFNQSV9DUjJfTlNTUCkpIHsNCi0gICAgICAgICAgICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjEsIFNQSV9DUjFfU1NNKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjEsIFNQSV9DUjFfQ1JDTkVYVCk7DQotICAgICAgICB9DQotI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovDQotICAgICAgfQ0KLQ0KLSAgICAgIC8qIFdhaXQgdW50aWwgUlhORSBmbGFnIGlzIHJlc2V0ICovDQotICAgICAgaWYgKChfX0hBTF9TUElfR0VUX0ZMQUcoaHNwaSwgU1BJX0ZMQUdfUlhORSkpICYmDQotICAgICAgICAgIChoc3BpLT5SeFhmZXJDb3VudCA+IDBVKSkgew0KLSAgICAgICAgaWYgKGhzcGktPlJ4WGZlckNvdW50ID4gMVUpIHsNCi0gICAgICAgICAgKigodWludDE2X3QgKiloc3BpLT5wUnhCdWZmUHRyKSA9ICh1aW50MTZfdCloc3BpLT5JbnN0YW5jZS0+RFI7DQotICAgICAgICAgIGhzcGktPnBSeEJ1ZmZQdHIgKz0gc2l6ZW9mKHVpbnQxNl90KTsNCi0gICAgICAgICAgaHNwaS0+UnhYZmVyQ291bnQgLT0gMlU7DQotICAgICAgICAgIGlmIChoc3BpLT5SeFhmZXJDb3VudCA8PSAxVSkgew0KLSAgICAgICAgICAgIC8qIFNldCBSWCBGaWZvIHRocmVzaG9sZCBiZWZvcmUgdG8gc3dpdGNoIG9uIDggYml0IGRhdGEgc2l6ZSAqLw0KLSAgICAgICAgICAgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX1JYRklGT19USFJFU0hPTEQpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAoKih1aW50OF90ICopaHNwaS0+cFJ4QnVmZlB0cikgPSAqKF9fSU8gdWludDhfdCAqKSZoc3BpLT5JbnN0YW5jZS0+RFI7DQotICAgICAgICAgIGhzcGktPnBSeEJ1ZmZQdHIrKzsNCi0gICAgICAgICAgaHNwaS0+UnhYZmVyQ291bnQtLTsNCi0gICAgICAgIH0NCi0gICAgICAgIC8qIE5leHQgRGF0YSBpcyBhIFRyYW5zbWlzc2lvbiAoVHgpLiBUeCBpcyBhbGxvd2VkICovDQotICAgICAgICB0eGFsbG93ZWQgPSAxVTsNCi0gICAgICB9DQotICAgICAgaWYgKCgoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID49IFRpbWVvdXQpICYmDQotICAgICAgICAgICAoKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkpKSB8fA0KLSAgICAgICAgICAoVGltZW91dCA9PSAwVSkpIHsNCi0gICAgICAgIGVycm9yY29kZSA9IEhBTF9USU1FT1VUOw0KLSAgICAgICAgZ290byBlcnJvcjsNCi0gICAgICB9DQotICAgIH0NCi0gIH0NCi0NCi0jaWYgKFVTRV9TUElfQ1JDICE9IDBVKQ0KLSAgLyogUmVhZCBDUkMgZnJvbSBEUiB0byBjbG9zZSBDUkMgY2FsY3VsYXRpb24gcHJvY2VzcyAqLw0KLSAgaWYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkgew0KLSAgICAvKiBXYWl0IHVudGlsIFRYRSBmbGFnICovDQotICAgIGlmIChTUElfV2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChoc3BpLCBTUElfRkxBR19SWE5FLCBTRVQsIFRpbWVvdXQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWNrc3RhcnQpICE9IEhBTF9PSykgew0KLSAgICAgIC8qIEVycm9yIG9uIHRoZSBDUkMgcmVjZXB0aW9uICovDQotICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfQ1JDKTsNCi0gICAgICBlcnJvcmNvZGUgPSBIQUxfVElNRU9VVDsNCi0gICAgICBnb3RvIGVycm9yOw0KLSAgICB9DQotICAgIC8qIFJlYWQgQ1JDICovDQotICAgIGlmIChoc3BpLT5Jbml0LkRhdGFTaXplID09IFNQSV9EQVRBU0laRV8xNkJJVCkgew0KLSAgICAgIC8qIFJlYWQgMTZiaXQgQ1JDICovDQotICAgICAgdG1wcmVnID0gUkVBRF9SRUcoaHNwaS0+SW5zdGFuY2UtPkRSKTsNCi0gICAgICAvKiBUbyBhdm9pZCBHQ0Mgd2FybmluZyAqLw0KLSAgICAgIFVOVVNFRCh0bXByZWcpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgIC8qIEluaXRpYWxpemUgdGhlIDhiaXQgdGVtcG9yYXJ5IHBvaW50ZXIgKi8NCi0gICAgICBwdG1wcmVnOCA9IChfX0lPIHVpbnQ4X3QgKikmaHNwaS0+SW5zdGFuY2UtPkRSOw0KLSAgICAgIC8qIFJlYWQgOGJpdCBDUkMgKi8NCi0gICAgICB0bXByZWc4ID0gKnB0bXByZWc4Ow0KLSAgICAgIC8qIFRvIGF2b2lkIEdDQyB3YXJuaW5nICovDQotICAgICAgVU5VU0VEKHRtcHJlZzgpOw0KLQ0KLSAgICAgIGlmIChoc3BpLT5Jbml0LkNSQ0xlbmd0aCA9PSBTUElfQ1JDX0xFTkdUSF8xNkJJVCkgew0KLSAgICAgICAgaWYgKFNQSV9XYWl0RmxhZ1N0YXRlVW50aWxUaW1lb3V0KGhzcGksIFNQSV9GTEFHX1JYTkUsIFNFVCwgVGltZW91dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWNrc3RhcnQpICE9IEhBTF9PSykgew0KLSAgICAgICAgICAvKiBFcnJvciBvbiB0aGUgQ1JDIHJlY2VwdGlvbiAqLw0KLSAgICAgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9DUkMpOw0KLSAgICAgICAgICBlcnJvcmNvZGUgPSBIQUxfVElNRU9VVDsNCi0gICAgICAgICAgZ290byBlcnJvcjsNCi0gICAgICAgIH0NCi0gICAgICAgIC8qIFJlYWQgOGJpdCBDUkMgYWdhaW4gaW4gY2FzZSBvZiAxNmJpdCBDUkMgaW4gOGJpdCBEYXRhIG1vZGUgKi8NCi0gICAgICAgIHRtcHJlZzggPSAqcHRtcHJlZzg7DQotICAgICAgICAvKiBUbyBhdm9pZCBHQ0Mgd2FybmluZyAqLw0KLSAgICAgICAgVU5VU0VEKHRtcHJlZzgpOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgLyogQ2hlY2sgaWYgQ1JDIGVycm9yIG9jY3VycmVkICovDQotICBpZiAoX19IQUxfU1BJX0dFVF9GTEFHKGhzcGksIFNQSV9GTEFHX0NSQ0VSUikpIHsNCi0gICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfQ1JDKTsNCi0gICAgLyogQ2xlYXIgQ1JDIEZsYWcgKi8NCi0gICAgX19IQUxfU1BJX0NMRUFSX0NSQ0VSUkZMQUcoaHNwaSk7DQotDQotICAgIGVycm9yY29kZSA9IEhBTF9FUlJPUjsNCi0gIH0NCi0jZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8NCi0NCi0gIC8qIENoZWNrIHRoZSBlbmQgb2YgdGhlIHRyYW5zYWN0aW9uICovDQotICBpZiAoU1BJX0VuZFJ4VHhUcmFuc2FjdGlvbihoc3BpLCBUaW1lb3V0LCB0aWNrc3RhcnQpICE9IEhBTF9PSykgew0KLSAgICBlcnJvcmNvZGUgPSBIQUxfRVJST1I7DQotICAgIGhzcGktPkVycm9yQ29kZSA9IEhBTF9TUElfRVJST1JfRkxBRzsNCi0gIH0NCi0NCi1lcnJvcjoNCi0gIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9SRUFEWTsNCi0gIF9fSEFMX1VOTE9DSyhoc3BpKTsNCi0gIHJldHVybiBlcnJvcmNvZGU7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgVHJhbnNtaXQgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBJbnRlcnJ1cHQuDQotICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KLSAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuDQotICogQHBhcmFtICBwRGF0YSBwb2ludGVyIHRvIGRhdGEgYnVmZmVyDQotICogQHBhcmFtICBTaXplIGFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX1RyYW5zbWl0X0lUKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLCB1aW50OF90ICpwRGF0YSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IFNpemUpIHsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIGVycm9yY29kZSA9IEhBTF9PSzsNCi0NCi0gIC8qIENoZWNrIERpcmVjdGlvbiBwYXJhbWV0ZXIgKi8NCi0gIGFzc2VydF9wYXJhbShJU19TUElfRElSRUNUSU9OXzJMSU5FU19PUl8xTElORShoc3BpLT5Jbml0LkRpcmVjdGlvbikpOw0KLQ0KLSAgLyogUHJvY2VzcyBMb2NrZWQgKi8NCi0gIF9fSEFMX0xPQ0soaHNwaSk7DQotDQotICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkgew0KLSAgICBlcnJvcmNvZGUgPSBIQUxfRVJST1I7DQotICAgIGdvdG8gZXJyb3I7DQotICB9DQotDQotICBpZiAoaHNwaS0+U3RhdGUgIT0gSEFMX1NQSV9TVEFURV9SRUFEWSkgew0KLSAgICBlcnJvcmNvZGUgPSBIQUxfQlVTWTsNCi0gICAgZ290byBlcnJvcjsNCi0gIH0NCi0NCi0gIC8qIFNldCB0aGUgdHJhbnNhY3Rpb24gaW5mb3JtYXRpb24gKi8NCi0gIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9CVVNZX1RYOw0KLSAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9OT05FOw0KLSAgaHNwaS0+cFR4QnVmZlB0ciA9ICh1aW50OF90ICopcERhdGE7DQotICBoc3BpLT5UeFhmZXJTaXplID0gU2l6ZTsNCi0gIGhzcGktPlR4WGZlckNvdW50ID0gU2l6ZTsNCi0NCi0gIC8qIEluaXQgZmllbGQgbm90IHVzZWQgaW4gaGFuZGxlIHRvIHplcm8gKi8NCi0gIGhzcGktPnBSeEJ1ZmZQdHIgPSAodWludDhfdCAqKU5VTEw7DQotICBoc3BpLT5SeFhmZXJTaXplID0gMFU7DQotICBoc3BpLT5SeFhmZXJDb3VudCA9IDBVOw0KLSAgaHNwaS0+UnhJU1IgPSBOVUxMOw0KLQ0KLSAgLyogU2V0IHRoZSBmdW5jdGlvbiBmb3IgSVQgdHJlYXRtZW50ICovDQotICBpZiAoaHNwaS0+SW5pdC5EYXRhU2l6ZSA+IFNQSV9EQVRBU0laRV84QklUKSB7DQotICAgIGhzcGktPlR4SVNSID0gU1BJX1R4SVNSXzE2QklUOw0KLSAgfSBlbHNlIHsNCi0gICAgaHNwaS0+VHhJU1IgPSBTUElfVHhJU1JfOEJJVDsNCi0gIH0NCi0NCi0gIC8qIENvbmZpZ3VyZSBjb21tdW5pY2F0aW9uIGRpcmVjdGlvbiA6IDFMaW5lICovDQotICBpZiAoaHNwaS0+SW5pdC5EaXJlY3Rpb24gPT0gU1BJX0RJUkVDVElPTl8xTElORSkgew0KLSAgICAvKiBEaXNhYmxlIFNQSSBQZXJpcGhlcmFsIGJlZm9yZSBzZXQgMUxpbmUgZGlyZWN0aW9uIChCSURJT0UgYml0KSAqLw0KLSAgICBfX0hBTF9TUElfRElTQUJMRShoc3BpKTsNCi0gICAgU1BJXzFMSU5FX1RYKGhzcGkpOw0KLSAgfQ0KLQ0KLSNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpDQotICAvKiBSZXNldCBDUkMgQ2FsY3VsYXRpb24gKi8NCi0gIGlmIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpIHsNCi0gICAgU1BJX1JFU0VUX0NSQyhoc3BpKTsNCi0gIH0NCi0jZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8NCi0NCi0gIC8qIEVuYWJsZSBUWEUgYW5kIEVSUiBpbnRlcnJ1cHQgKi8NCi0gIF9fSEFMX1NQSV9FTkFCTEVfSVQoaHNwaSwgKFNQSV9JVF9UWEUgfCBTUElfSVRfRVJSKSk7DQotDQotICAvKiBDaGVjayBpZiB0aGUgU1BJIGlzIGFscmVhZHkgZW5hYmxlZCAqLw0KLSAgaWYgKChoc3BpLT5JbnN0YW5jZS0+Q1IxICYgU1BJX0NSMV9TUEUpICE9IFNQSV9DUjFfU1BFKSB7DQotICAgIC8qIEVuYWJsZSBTUEkgcGVyaXBoZXJhbCAqLw0KLSAgICBfX0hBTF9TUElfRU5BQkxFKGhzcGkpOw0KLSAgfQ0KLQ0KLWVycm9yOg0KLSAgX19IQUxfVU5MT0NLKGhzcGkpOw0KLSAgcmV0dXJuIGVycm9yY29kZTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHdpdGggSW50ZXJydXB0Lg0KLSAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCi0gKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLg0KLSAqIEBwYXJhbSAgcERhdGEgcG9pbnRlciB0byBkYXRhIGJ1ZmZlcg0KLSAqIEBwYXJhbSAgU2l6ZSBhbW91bnQgb2YgZGF0YSB0byBiZSBzZW50DQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9SZWNlaXZlX0lUKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLCB1aW50OF90ICpwRGF0YSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgU2l6ZSkgew0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgZXJyb3Jjb2RlID0gSEFMX09LOw0KLQ0KLSAgaWYgKChoc3BpLT5Jbml0LkRpcmVjdGlvbiA9PSBTUElfRElSRUNUSU9OXzJMSU5FUykgJiYNCi0gICAgICAoaHNwaS0+SW5pdC5Nb2RlID09IFNQSV9NT0RFX01BU1RFUikpIHsNCi0gICAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX0JVU1lfUlg7DQotICAgIC8qIENhbGwgdHJhbnNtaXQtcmVjZWl2ZSBmdW5jdGlvbiB0byBzZW5kIER1bW15IGRhdGEgb24gVHggbGluZSBhbmQgZ2VuZXJhdGUNCi0gICAgICogY2xvY2sgb24gQ0xLIGxpbmUgKi8NCi0gICAgcmV0dXJuIEhBTF9TUElfVHJhbnNtaXRSZWNlaXZlX0lUKGhzcGksIHBEYXRhLCBwRGF0YSwgU2l6ZSk7DQotICB9DQotDQotICAvKiBQcm9jZXNzIExvY2tlZCAqLw0KLSAgX19IQUxfTE9DSyhoc3BpKTsNCi0NCi0gIGlmIChoc3BpLT5TdGF0ZSAhPSBIQUxfU1BJX1NUQVRFX1JFQURZKSB7DQotICAgIGVycm9yY29kZSA9IEhBTF9CVVNZOw0KLSAgICBnb3RvIGVycm9yOw0KLSAgfQ0KLQ0KLSAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpIHsNCi0gICAgZXJyb3Jjb2RlID0gSEFMX0VSUk9SOw0KLSAgICBnb3RvIGVycm9yOw0KLSAgfQ0KLQ0KLSAgLyogU2V0IHRoZSB0cmFuc2FjdGlvbiBpbmZvcm1hdGlvbiAqLw0KLSAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX0JVU1lfUlg7DQotICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX05PTkU7DQotICBoc3BpLT5wUnhCdWZmUHRyID0gKHVpbnQ4X3QgKilwRGF0YTsNCi0gIGhzcGktPlJ4WGZlclNpemUgPSBTaXplOw0KLSAgaHNwaS0+UnhYZmVyQ291bnQgPSBTaXplOw0KLQ0KLSAgLyogSW5pdCBmaWVsZCBub3QgdXNlZCBpbiBoYW5kbGUgdG8gemVybyAqLw0KLSAgaHNwaS0+cFR4QnVmZlB0ciA9ICh1aW50OF90ICopTlVMTDsNCi0gIGhzcGktPlR4WGZlclNpemUgPSAwVTsNCi0gIGhzcGktPlR4WGZlckNvdW50ID0gMFU7DQotICBoc3BpLT5UeElTUiA9IE5VTEw7DQotDQotICAvKiBDaGVjayB0aGUgZGF0YSBzaXplIHRvIGFkYXB0IFJ4IHRocmVzaG9sZCBhbmQgdGhlIHNldCB0aGUgZnVuY3Rpb24gZm9yIElUDQotICAgKiB0cmVhdG1lbnQgKi8NCi0gIGlmIChoc3BpLT5Jbml0LkRhdGFTaXplID4gU1BJX0RBVEFTSVpFXzhCSVQpIHsNCi0gICAgLyogU2V0IFJYIEZpZm8gdGhyZXNob2xkIGFjY29yZGluZyB0aGUgcmVjZXB0aW9uIGRhdGEgbGVuZ3RoOiAxNiBiaXQgKi8NCi0gICAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9SWEZJRk9fVEhSRVNIT0xEKTsNCi0gICAgaHNwaS0+UnhJU1IgPSBTUElfUnhJU1JfMTZCSVQ7DQotICB9IGVsc2Ugew0KLSAgICAvKiBTZXQgUlggRmlmbyB0aHJlc2hvbGQgYWNjb3JkaW5nIHRoZSByZWNlcHRpb24gZGF0YSBsZW5ndGg6IDggYml0ICovDQotICAgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX1JYRklGT19USFJFU0hPTEQpOw0KLSAgICBoc3BpLT5SeElTUiA9IFNQSV9SeElTUl84QklUOw0KLSAgfQ0KLQ0KLSAgLyogQ29uZmlndXJlIGNvbW11bmljYXRpb24gZGlyZWN0aW9uIDogMUxpbmUgKi8NCi0gIGlmIChoc3BpLT5Jbml0LkRpcmVjdGlvbiA9PSBTUElfRElSRUNUSU9OXzFMSU5FKSB7DQotICAgIC8qIERpc2FibGUgU1BJIFBlcmlwaGVyYWwgYmVmb3JlIHNldCAxTGluZSBkaXJlY3Rpb24gKEJJRElPRSBiaXQpICovDQotICAgIF9fSEFMX1NQSV9ESVNBQkxFKGhzcGkpOw0KLSAgICBTUElfMUxJTkVfUlgoaHNwaSk7DQotICB9DQotDQotI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkNCi0gIC8qIFJlc2V0IENSQyBDYWxjdWxhdGlvbiAqLw0KLSAgaWYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkgew0KLSAgICBoc3BpLT5DUkNTaXplID0gMVU7DQotICAgIGlmICgoaHNwaS0+SW5pdC5EYXRhU2l6ZSA8PSBTUElfREFUQVNJWkVfOEJJVCkgJiYNCi0gICAgICAgIChoc3BpLT5Jbml0LkNSQ0xlbmd0aCA9PSBTUElfQ1JDX0xFTkdUSF8xNkJJVCkpIHsNCi0gICAgICBoc3BpLT5DUkNTaXplID0gMlU7DQotICAgIH0NCi0gICAgU1BJX1JFU0VUX0NSQyhoc3BpKTsNCi0gIH0gZWxzZSB7DQotICAgIGhzcGktPkNSQ1NpemUgPSAwVTsNCi0gIH0NCi0jZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8NCi0NCi0gIC8qIEVuYWJsZSBUWEUgYW5kIEVSUiBpbnRlcnJ1cHQgKi8NCi0gIF9fSEFMX1NQSV9FTkFCTEVfSVQoaHNwaSwgKFNQSV9JVF9SWE5FIHwgU1BJX0lUX0VSUikpOw0KLQ0KLSAgLyogTm90ZSA6IFRoZSBTUEkgbXVzdCBiZSBlbmFibGVkIGFmdGVyIHVubG9ja2luZyBjdXJyZW50IHByb2Nlc3MNCi0gICAgICAgICAgICB0byBhdm9pZCB0aGUgcmlzayBvZiBTUEkgaW50ZXJydXB0IGhhbmRsZSBleGVjdXRpb24gYmVmb3JlIGN1cnJlbnQNCi0gICAgICAgICAgICBwcm9jZXNzIHVubG9jayAqLw0KLQ0KLSAgLyogQ2hlY2sgaWYgdGhlIFNQSSBpcyBhbHJlYWR5IGVuYWJsZWQgKi8NCi0gIGlmICgoaHNwaS0+SW5zdGFuY2UtPkNSMSAmIFNQSV9DUjFfU1BFKSAhPSBTUElfQ1IxX1NQRSkgew0KLSAgICAvKiBFbmFibGUgU1BJIHBlcmlwaGVyYWwgKi8NCi0gICAgX19IQUxfU1BJX0VOQUJMRShoc3BpKTsNCi0gIH0NCi0NCi1lcnJvcjoNCi0gIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8NCi0gIF9fSEFMX1VOTE9DSyhoc3BpKTsNCi0gIHJldHVybiBlcnJvcmNvZGU7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgVHJhbnNtaXQgYW5kIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aA0KLSAqIEludGVycnVwdC4NCi0gKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQotICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4NCi0gKiBAcGFyYW0gIHBUeERhdGEgcG9pbnRlciB0byB0cmFuc21pc3Npb24gZGF0YSBidWZmZXINCi0gKiBAcGFyYW0gIHBSeERhdGEgcG9pbnRlciB0byByZWNlcHRpb24gZGF0YSBidWZmZXINCi0gKiBAcGFyYW0gIFNpemUgYW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudCBhbmQgcmVjZWl2ZWQNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX1RyYW5zbWl0UmVjZWl2ZV9JVChTUElfSGFuZGxlVHlwZURlZiAqaHNwaSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwVHhEYXRhLCB1aW50OF90ICpwUnhEYXRhLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IFNpemUpIHsNCi0gIHVpbnQzMl90IHRtcF9tb2RlOw0KLSAgSEFMX1NQSV9TdGF0ZVR5cGVEZWYgdG1wX3N0YXRlOw0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgZXJyb3Jjb2RlID0gSEFMX09LOw0KLQ0KLSAgLyogQ2hlY2sgRGlyZWN0aW9uIHBhcmFtZXRlciAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1NQSV9ESVJFQ1RJT05fMkxJTkVTKGhzcGktPkluaXQuRGlyZWN0aW9uKSk7DQotDQotICAvKiBQcm9jZXNzIGxvY2tlZCAqLw0KLSAgX19IQUxfTE9DSyhoc3BpKTsNCi0NCi0gIC8qIEluaXQgdGVtcG9yYXJ5IHZhcmlhYmxlcyAqLw0KLSAgdG1wX3N0YXRlID0gaHNwaS0+U3RhdGU7DQotICB0bXBfbW9kZSA9IGhzcGktPkluaXQuTW9kZTsNCi0NCi0gIGlmICghKCh0bXBfc3RhdGUgPT0gSEFMX1NQSV9TVEFURV9SRUFEWSkgfHwNCi0gICAgICAgICgodG1wX21vZGUgPT0gU1BJX01PREVfTUFTVEVSKSAmJg0KLSAgICAgICAgIChoc3BpLT5Jbml0LkRpcmVjdGlvbiA9PSBTUElfRElSRUNUSU9OXzJMSU5FUykgJiYNCi0gICAgICAgICAodG1wX3N0YXRlID09IEhBTF9TUElfU1RBVEVfQlVTWV9SWCkpKSkgew0KLSAgICBlcnJvcmNvZGUgPSBIQUxfQlVTWTsNCi0gICAgZ290byBlcnJvcjsNCi0gIH0NCi0NCi0gIGlmICgocFR4RGF0YSA9PSBOVUxMKSB8fCAocFJ4RGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpIHsNCi0gICAgZXJyb3Jjb2RlID0gSEFMX0VSUk9SOw0KLSAgICBnb3RvIGVycm9yOw0KLSAgfQ0KLQ0KLSAgLyogRG9uJ3Qgb3ZlcndyaXRlIGluIGNhc2Ugb2YgSEFMX1NQSV9TVEFURV9CVVNZX1JYICovDQotICBpZiAoaHNwaS0+U3RhdGUgIT0gSEFMX1NQSV9TVEFURV9CVVNZX1JYKSB7DQotICAgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9CVVNZX1RYX1JYOw0KLSAgfQ0KLQ0KLSAgLyogU2V0IHRoZSB0cmFuc2FjdGlvbiBpbmZvcm1hdGlvbiAqLw0KLSAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9OT05FOw0KLSAgaHNwaS0+cFR4QnVmZlB0ciA9ICh1aW50OF90ICopcFR4RGF0YTsNCi0gIGhzcGktPlR4WGZlclNpemUgPSBTaXplOw0KLSAgaHNwaS0+VHhYZmVyQ291bnQgPSBTaXplOw0KLSAgaHNwaS0+cFJ4QnVmZlB0ciA9ICh1aW50OF90ICopcFJ4RGF0YTsNCi0gIGhzcGktPlJ4WGZlclNpemUgPSBTaXplOw0KLSAgaHNwaS0+UnhYZmVyQ291bnQgPSBTaXplOw0KLQ0KLSAgLyogU2V0IHRoZSBmdW5jdGlvbiBmb3IgSVQgdHJlYXRtZW50ICovDQotICBpZiAoaHNwaS0+SW5pdC5EYXRhU2l6ZSA+IFNQSV9EQVRBU0laRV84QklUKSB7DQotICAgIGhzcGktPlJ4SVNSID0gU1BJXzJsaW5lc1J4SVNSXzE2QklUOw0KLSAgICBoc3BpLT5UeElTUiA9IFNQSV8ybGluZXNUeElTUl8xNkJJVDsNCi0gIH0gZWxzZSB7DQotICAgIGhzcGktPlJ4SVNSID0gU1BJXzJsaW5lc1J4SVNSXzhCSVQ7DQotICAgIGhzcGktPlR4SVNSID0gU1BJXzJsaW5lc1R4SVNSXzhCSVQ7DQotICB9DQotDQotI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkNCi0gIC8qIFJlc2V0IENSQyBDYWxjdWxhdGlvbiAqLw0KLSAgaWYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkgew0KLSAgICBoc3BpLT5DUkNTaXplID0gMVU7DQotICAgIGlmICgoaHNwaS0+SW5pdC5EYXRhU2l6ZSA8PSBTUElfREFUQVNJWkVfOEJJVCkgJiYNCi0gICAgICAgIChoc3BpLT5Jbml0LkNSQ0xlbmd0aCA9PSBTUElfQ1JDX0xFTkdUSF8xNkJJVCkpIHsNCi0gICAgICBoc3BpLT5DUkNTaXplID0gMlU7DQotICAgIH0NCi0gICAgU1BJX1JFU0VUX0NSQyhoc3BpKTsNCi0gIH0gZWxzZSB7DQotICAgIGhzcGktPkNSQ1NpemUgPSAwVTsNCi0gIH0NCi0jZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8NCi0NCi0gIC8qIENoZWNrIGlmIHBhY2tpbmcgbW9kZSBpcyBlbmFibGVkIGFuZCBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gMiBkYXRhIHRvDQotICAgKiByZWNlaXZlICovDQotICBpZiAoKGhzcGktPkluaXQuRGF0YVNpemUgPiBTUElfREFUQVNJWkVfOEJJVCkgfHwgKFNpemUgPj0gMlUpKSB7DQotICAgIC8qIFNldCBSWCBGaWZvIHRocmVzaG9sZCBhY2NvcmRpbmcgdGhlIHJlY2VwdGlvbiBkYXRhIGxlbmd0aDogMTYgYml0ICovDQotICAgIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfUlhGSUZPX1RIUkVTSE9MRCk7DQotICB9IGVsc2Ugew0KLSAgICAvKiBTZXQgUlggRmlmbyB0aHJlc2hvbGQgYWNjb3JkaW5nIHRoZSByZWNlcHRpb24gZGF0YSBsZW5ndGg6IDggYml0ICovDQotICAgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX1JYRklGT19USFJFU0hPTEQpOw0KLSAgfQ0KLQ0KLSAgLyogRW5hYmxlIFRYRSwgUlhORSBhbmQgRVJSIGludGVycnVwdCAqLw0KLSAgX19IQUxfU1BJX0VOQUJMRV9JVChoc3BpLCAoU1BJX0lUX1RYRSB8IFNQSV9JVF9SWE5FIHwgU1BJX0lUX0VSUikpOw0KLQ0KLSAgLyogQ2hlY2sgaWYgdGhlIFNQSSBpcyBhbHJlYWR5IGVuYWJsZWQgKi8NCi0gIGlmICgoaHNwaS0+SW5zdGFuY2UtPkNSMSAmIFNQSV9DUjFfU1BFKSAhPSBTUElfQ1IxX1NQRSkgew0KLSAgICAvKiBFbmFibGUgU1BJIHBlcmlwaGVyYWwgKi8NCi0gICAgX19IQUxfU1BJX0VOQUJMRShoc3BpKTsNCi0gIH0NCi0NCi1lcnJvcjoNCi0gIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8NCi0gIF9fSEFMX1VOTE9DSyhoc3BpKTsNCi0gIHJldHVybiBlcnJvcmNvZGU7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgVHJhbnNtaXQgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBETUEuDQotICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KLSAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuDQotICogQHBhcmFtICBwRGF0YSBwb2ludGVyIHRvIGRhdGEgYnVmZmVyDQotICogQHBhcmFtICBTaXplIGFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX1RyYW5zbWl0X0RNQShTUElfSGFuZGxlVHlwZURlZiAqaHNwaSwgdWludDhfdCAqcERhdGEsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgU2l6ZSkgew0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgZXJyb3Jjb2RlID0gSEFMX09LOw0KLQ0KLSAgLyogQ2hlY2sgdHggZG1hIGhhbmRsZSAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1NQSV9ETUFfSEFORExFKGhzcGktPmhkbWF0eCkpOw0KLQ0KLSAgLyogQ2hlY2sgRGlyZWN0aW9uIHBhcmFtZXRlciAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1NQSV9ESVJFQ1RJT05fMkxJTkVTX09SXzFMSU5FKGhzcGktPkluaXQuRGlyZWN0aW9uKSk7DQotDQotICAvKiBQcm9jZXNzIExvY2tlZCAqLw0KLSAgX19IQUxfTE9DSyhoc3BpKTsNCi0NCi0gIGlmIChoc3BpLT5TdGF0ZSAhPSBIQUxfU1BJX1NUQVRFX1JFQURZKSB7DQotICAgIGVycm9yY29kZSA9IEhBTF9CVVNZOw0KLSAgICBnb3RvIGVycm9yOw0KLSAgfQ0KLQ0KLSAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpIHsNCi0gICAgZXJyb3Jjb2RlID0gSEFMX0VSUk9SOw0KLSAgICBnb3RvIGVycm9yOw0KLSAgfQ0KLQ0KLSAgLyogU2V0IHRoZSB0cmFuc2FjdGlvbiBpbmZvcm1hdGlvbiAqLw0KLSAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX0JVU1lfVFg7DQotICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX05PTkU7DQotICBoc3BpLT5wVHhCdWZmUHRyID0gKHVpbnQ4X3QgKilwRGF0YTsNCi0gIGhzcGktPlR4WGZlclNpemUgPSBTaXplOw0KLSAgaHNwaS0+VHhYZmVyQ291bnQgPSBTaXplOw0KLQ0KLSAgLyogSW5pdCBmaWVsZCBub3QgdXNlZCBpbiBoYW5kbGUgdG8gemVybyAqLw0KLSAgaHNwaS0+cFJ4QnVmZlB0ciA9ICh1aW50OF90ICopTlVMTDsNCi0gIGhzcGktPlR4SVNSID0gTlVMTDsNCi0gIGhzcGktPlJ4SVNSID0gTlVMTDsNCi0gIGhzcGktPlJ4WGZlclNpemUgPSAwVTsNCi0gIGhzcGktPlJ4WGZlckNvdW50ID0gMFU7DQotDQotICAvKiBDb25maWd1cmUgY29tbXVuaWNhdGlvbiBkaXJlY3Rpb24gOiAxTGluZSAqLw0KLSAgaWYgKGhzcGktPkluaXQuRGlyZWN0aW9uID09IFNQSV9ESVJFQ1RJT05fMUxJTkUpIHsNCi0gICAgLyogRGlzYWJsZSBTUEkgUGVyaXBoZXJhbCBiZWZvcmUgc2V0IDFMaW5lIGRpcmVjdGlvbiAoQklESU9FIGJpdCkgKi8NCi0gICAgX19IQUxfU1BJX0RJU0FCTEUoaHNwaSk7DQotICAgIFNQSV8xTElORV9UWChoc3BpKTsNCi0gIH0NCi0NCi0jaWYgKFVTRV9TUElfQ1JDICE9IDBVKQ0KLSAgLyogUmVzZXQgQ1JDIENhbGN1bGF0aW9uICovDQotICBpZiAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKSB7DQotICAgIFNQSV9SRVNFVF9DUkMoaHNwaSk7DQotICB9DQotI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovDQotDQotICAvKiBTZXQgdGhlIFNQSSBUeERNQSBIYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovDQotICBoc3BpLT5oZG1hdHgtPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gU1BJX0RNQUhhbGZUcmFuc21pdENwbHQ7DQotDQotICAvKiBTZXQgdGhlIFNQSSBUeERNQSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLw0KLSAgaHNwaS0+aGRtYXR4LT5YZmVyQ3BsdENhbGxiYWNrID0gU1BJX0RNQVRyYW5zbWl0Q3BsdDsNCi0NCi0gIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovDQotICBoc3BpLT5oZG1hdHgtPlhmZXJFcnJvckNhbGxiYWNrID0gU1BJX0RNQUVycm9yOw0KLQ0KLSAgLyogU2V0IHRoZSBETUEgQWJvcnRDcGx0Q2FsbGJhY2sgKi8NCi0gIGhzcGktPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOw0KLQ0KLSAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfTERNQVRYKTsNCi0gIC8qIFBhY2tpbmcgbW9kZSBpcyBlbmFibGVkIG9ubHkgaWYgdGhlIERNQSBzZXR0aW5nIGlzIEhBTFdPUkQgKi8NCi0gIGlmICgoaHNwaS0+SW5pdC5EYXRhU2l6ZSA8PSBTUElfREFUQVNJWkVfOEJJVCkgJiYNCi0gICAgICAoaHNwaS0+aGRtYXR4LT5Jbml0Lk1lbURhdGFBbGlnbm1lbnQgPT0gRE1BX01EQVRBQUxJR05fSEFMRldPUkQpKSB7DQotICAgIC8qIENoZWNrIHRoZSBldmVuL29kZCBvZiB0aGUgZGF0YSBzaXplICsgY3JjIGlmIGVuYWJsZWQgKi8NCi0gICAgaWYgKChoc3BpLT5UeFhmZXJDb3VudCAmIDB4MVUpID09IDBVKSB7DQotICAgICAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfTERNQVRYKTsNCi0gICAgICBoc3BpLT5UeFhmZXJDb3VudCA9IChoc3BpLT5UeFhmZXJDb3VudCA+PiAxVSk7DQotICAgIH0gZWxzZSB7DQotICAgICAgU0VUX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX0xETUFUWCk7DQotICAgICAgaHNwaS0+VHhYZmVyQ291bnQgPSAoaHNwaS0+VHhYZmVyQ291bnQgPj4gMVUpICsgMVU7DQotICAgIH0NCi0gIH0NCi0NCi0gIC8qIEVuYWJsZSB0aGUgVHggRE1BIFN0cmVhbS9DaGFubmVsICovDQotICBpZiAoSEFMX09LICE9IEhBTF9ETUFfU3RhcnRfSVQoaHNwaS0+aGRtYXR4LCAodWludDMyX3QpaHNwaS0+cFR4QnVmZlB0ciwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpJmhzcGktPkluc3RhbmNlLT5EUiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoc3BpLT5UeFhmZXJDb3VudCkpIHsNCi0gICAgLyogVXBkYXRlIFNQSSBlcnJvciBjb2RlICovDQotICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0RNQSk7DQotICAgIGVycm9yY29kZSA9IEhBTF9FUlJPUjsNCi0NCi0gICAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX1JFQURZOw0KLSAgICBnb3RvIGVycm9yOw0KLSAgfQ0KLQ0KLSAgLyogQ2hlY2sgaWYgdGhlIFNQSSBpcyBhbHJlYWR5IGVuYWJsZWQgKi8NCi0gIGlmICgoaHNwaS0+SW5zdGFuY2UtPkNSMSAmIFNQSV9DUjFfU1BFKSAhPSBTUElfQ1IxX1NQRSkgew0KLSAgICAvKiBFbmFibGUgU1BJIHBlcmlwaGVyYWwgKi8NCi0gICAgX19IQUxfU1BJX0VOQUJMRShoc3BpKTsNCi0gIH0NCi0NCi0gIC8qIEVuYWJsZSB0aGUgU1BJIEVycm9yIEludGVycnVwdCBCaXQgKi8NCi0gIF9fSEFMX1NQSV9FTkFCTEVfSVQoaHNwaSwgKFNQSV9JVF9FUlIpKTsNCi0NCi0gIC8qIEVuYWJsZSBUeCBETUEgUmVxdWVzdCAqLw0KLSAgU0VUX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1RYRE1BRU4pOw0KLQ0KLWVycm9yOg0KLSAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLw0KLSAgX19IQUxfVU5MT0NLKGhzcGkpOw0KLSAgcmV0dXJuIGVycm9yY29kZTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHdpdGggRE1BLg0KLSAqIEBub3RlICAgSW4gY2FzZSBvZiBNQVNURVIgbW9kZSBhbmQgU1BJX0RJUkVDVElPTl8yTElORVMgZGlyZWN0aW9uLCBoZG1hdHgNCi0gKiBzaGFsbCBiZSBkZWZpbmVkLg0KLSAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCi0gKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLg0KLSAqIEBwYXJhbSAgcERhdGEgcG9pbnRlciB0byBkYXRhIGJ1ZmZlcg0KLSAqIEBub3RlICAgV2hlbiB0aGUgQ1JDIGZlYXR1cmUgaXMgZW5hYmxlZCB0aGUgcERhdGEgTGVuZ3RoIG11c3QgYmUgU2l6ZSArIDEuDQotICogQHBhcmFtICBTaXplIGFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX1JlY2VpdmVfRE1BKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLCB1aW50OF90ICpwRGF0YSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IFNpemUpIHsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIGVycm9yY29kZSA9IEhBTF9PSzsNCi0NCi0gIC8qIENoZWNrIHJ4IGRtYSBoYW5kbGUgKi8NCi0gIGFzc2VydF9wYXJhbShJU19TUElfRE1BX0hBTkRMRShoc3BpLT5oZG1hcngpKTsNCi0NCi0gIGlmICgoaHNwaS0+SW5pdC5EaXJlY3Rpb24gPT0gU1BJX0RJUkVDVElPTl8yTElORVMpICYmDQotICAgICAgKGhzcGktPkluaXQuTW9kZSA9PSBTUElfTU9ERV9NQVNURVIpKSB7DQotICAgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9CVVNZX1JYOw0KLQ0KLSAgICAvKiBDaGVjayB0eCBkbWEgaGFuZGxlICovDQotICAgIGFzc2VydF9wYXJhbShJU19TUElfRE1BX0hBTkRMRShoc3BpLT5oZG1hdHgpKTsNCi0NCi0gICAgLyogQ2FsbCB0cmFuc21pdC1yZWNlaXZlIGZ1bmN0aW9uIHRvIHNlbmQgRHVtbXkgZGF0YSBvbiBUeCBsaW5lIGFuZCBnZW5lcmF0ZQ0KLSAgICAgKiBjbG9jayBvbiBDTEsgbGluZSAqLw0KLSAgICByZXR1cm4gSEFMX1NQSV9UcmFuc21pdFJlY2VpdmVfRE1BKGhzcGksIHBEYXRhLCBwRGF0YSwgU2l6ZSk7DQotICB9DQotDQotICAvKiBQcm9jZXNzIExvY2tlZCAqLw0KLSAgX19IQUxfTE9DSyhoc3BpKTsNCi0NCi0gIGlmIChoc3BpLT5TdGF0ZSAhPSBIQUxfU1BJX1NUQVRFX1JFQURZKSB7DQotICAgIGVycm9yY29kZSA9IEhBTF9CVVNZOw0KLSAgICBnb3RvIGVycm9yOw0KLSAgfQ0KLQ0KLSAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpIHsNCi0gICAgZXJyb3Jjb2RlID0gSEFMX0VSUk9SOw0KLSAgICBnb3RvIGVycm9yOw0KLSAgfQ0KLQ0KLSAgLyogU2V0IHRoZSB0cmFuc2FjdGlvbiBpbmZvcm1hdGlvbiAqLw0KLSAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX0JVU1lfUlg7DQotICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX05PTkU7DQotICBoc3BpLT5wUnhCdWZmUHRyID0gKHVpbnQ4X3QgKilwRGF0YTsNCi0gIGhzcGktPlJ4WGZlclNpemUgPSBTaXplOw0KLSAgaHNwaS0+UnhYZmVyQ291bnQgPSBTaXplOw0KLQ0KLSAgLypJbml0IGZpZWxkIG5vdCB1c2VkIGluIGhhbmRsZSB0byB6ZXJvICovDQotICBoc3BpLT5SeElTUiA9IE5VTEw7DQotICBoc3BpLT5UeElTUiA9IE5VTEw7DQotICBoc3BpLT5UeFhmZXJTaXplID0gMFU7DQotICBoc3BpLT5UeFhmZXJDb3VudCA9IDBVOw0KLQ0KLSAgLyogQ29uZmlndXJlIGNvbW11bmljYXRpb24gZGlyZWN0aW9uIDogMUxpbmUgKi8NCi0gIGlmIChoc3BpLT5Jbml0LkRpcmVjdGlvbiA9PSBTUElfRElSRUNUSU9OXzFMSU5FKSB7DQotICAgIC8qIERpc2FibGUgU1BJIFBlcmlwaGVyYWwgYmVmb3JlIHNldCAxTGluZSBkaXJlY3Rpb24gKEJJRElPRSBiaXQpICovDQotICAgIF9fSEFMX1NQSV9ESVNBQkxFKGhzcGkpOw0KLSAgICBTUElfMUxJTkVfUlgoaHNwaSk7DQotICB9DQotDQotI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkNCi0gIC8qIFJlc2V0IENSQyBDYWxjdWxhdGlvbiAqLw0KLSAgaWYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkgew0KLSAgICBTUElfUkVTRVRfQ1JDKGhzcGkpOw0KLSAgfQ0KLSNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLw0KLQ0KLSAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfTERNQVJYKTsNCi0gIGlmIChoc3BpLT5Jbml0LkRhdGFTaXplID4gU1BJX0RBVEFTSVpFXzhCSVQpIHsNCi0gICAgLyogU2V0IFJYIEZpZm8gdGhyZXNob2xkIGFjY29yZGluZyB0aGUgcmVjZXB0aW9uIGRhdGEgbGVuZ3RoOiAxNmJpdCAqLw0KLSAgICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX1JYRklGT19USFJFU0hPTEQpOw0KLSAgfSBlbHNlIHsNCi0gICAgLyogU2V0IFJYIEZpZm8gdGhyZXNob2xkIGFjY29yZGluZyB0aGUgcmVjZXB0aW9uIGRhdGEgbGVuZ3RoOiA4Yml0ICovDQotICAgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX1JYRklGT19USFJFU0hPTEQpOw0KLQ0KLSAgICBpZiAoaHNwaS0+aGRtYXJ4LT5Jbml0Lk1lbURhdGFBbGlnbm1lbnQgPT0gRE1BX01EQVRBQUxJR05fSEFMRldPUkQpIHsNCi0gICAgICAvKiBTZXQgUlggRmlmbyB0aHJlc2hvbGQgYWNjb3JkaW5nIHRoZSByZWNlcHRpb24gZGF0YSBsZW5ndGg6IDE2Yml0ICovDQotICAgICAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9SWEZJRk9fVEhSRVNIT0xEKTsNCi0NCi0gICAgICBpZiAoKGhzcGktPlJ4WGZlckNvdW50ICYgMHgxVSkgPT0gMHgwVSkgew0KLSAgICAgICAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfTERNQVJYKTsNCi0gICAgICAgIGhzcGktPlJ4WGZlckNvdW50ID0gaHNwaS0+UnhYZmVyQ291bnQgPj4gMVU7DQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9MRE1BUlgpOw0KLSAgICAgICAgaHNwaS0+UnhYZmVyQ291bnQgPSAoaHNwaS0+UnhYZmVyQ291bnQgPj4gMVUpICsgMVU7DQotICAgICAgfQ0KLSAgICB9DQotICB9DQotDQotICAvKiBTZXQgdGhlIFNQSSBSeERNQSBIYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovDQotICBoc3BpLT5oZG1hcngtPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gU1BJX0RNQUhhbGZSZWNlaXZlQ3BsdDsNCi0NCi0gIC8qIFNldCB0aGUgU1BJIFJ4IERNQSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLw0KLSAgaHNwaS0+aGRtYXJ4LT5YZmVyQ3BsdENhbGxiYWNrID0gU1BJX0RNQVJlY2VpdmVDcGx0Ow0KLQ0KLSAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8NCi0gIGhzcGktPmhkbWFyeC0+WGZlckVycm9yQ2FsbGJhY2sgPSBTUElfRE1BRXJyb3I7DQotDQotICAvKiBTZXQgdGhlIERNQSBBYm9ydENwbHRDYWxsYmFjayAqLw0KLSAgaHNwaS0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7DQotDQotICAvKiBFbmFibGUgdGhlIFJ4IERNQSBTdHJlYW0vQ2hhbm5lbCAgKi8NCi0gIGlmIChIQUxfT0sgIT0gSEFMX0RNQV9TdGFydF9JVChoc3BpLT5oZG1hcngsICh1aW50MzJfdCkmaHNwaS0+SW5zdGFuY2UtPkRSLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCloc3BpLT5wUnhCdWZmUHRyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhzcGktPlJ4WGZlckNvdW50KSkgew0KLSAgICAvKiBVcGRhdGUgU1BJIGVycm9yIGNvZGUgKi8NCi0gICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfRE1BKTsNCi0gICAgZXJyb3Jjb2RlID0gSEFMX0VSUk9SOw0KLQ0KLSAgICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfUkVBRFk7DQotICAgIGdvdG8gZXJyb3I7DQotICB9DQotDQotICAvKiBDaGVjayBpZiB0aGUgU1BJIGlzIGFscmVhZHkgZW5hYmxlZCAqLw0KLSAgaWYgKChoc3BpLT5JbnN0YW5jZS0+Q1IxICYgU1BJX0NSMV9TUEUpICE9IFNQSV9DUjFfU1BFKSB7DQotICAgIC8qIEVuYWJsZSBTUEkgcGVyaXBoZXJhbCAqLw0KLSAgICBfX0hBTF9TUElfRU5BQkxFKGhzcGkpOw0KLSAgfQ0KLQ0KLSAgLyogRW5hYmxlIHRoZSBTUEkgRXJyb3IgSW50ZXJydXB0IEJpdCAqLw0KLSAgX19IQUxfU1BJX0VOQUJMRV9JVChoc3BpLCAoU1BJX0lUX0VSUikpOw0KLQ0KLSAgLyogRW5hYmxlIFJ4IERNQSBSZXF1ZXN0ICovDQotICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfUlhETUFFTik7DQotDQotZXJyb3I6DQotICAvKiBQcm9jZXNzIFVubG9ja2VkICovDQotICBfX0hBTF9VTkxPQ0soaHNwaSk7DQotICByZXR1cm4gZXJyb3Jjb2RlOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFRyYW5zbWl0IGFuZCBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHdpdGggRE1BLg0KLSAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCi0gKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLg0KLSAqIEBwYXJhbSAgcFR4RGF0YSBwb2ludGVyIHRvIHRyYW5zbWlzc2lvbiBkYXRhIGJ1ZmZlcg0KLSAqIEBwYXJhbSAgcFJ4RGF0YSBwb2ludGVyIHRvIHJlY2VwdGlvbiBkYXRhIGJ1ZmZlcg0KLSAqIEBub3RlICAgV2hlbiB0aGUgQ1JDIGZlYXR1cmUgaXMgZW5hYmxlZCB0aGUgcFJ4RGF0YSBMZW5ndGggbXVzdCBiZSBTaXplICsgMQ0KLSAqIEBwYXJhbSAgU2l6ZSBhbW91bnQgb2YgZGF0YSB0byBiZSBzZW50DQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9UcmFuc21pdFJlY2VpdmVfRE1BKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwVHhEYXRhLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwUnhEYXRhLCB1aW50MTZfdCBTaXplKSB7DQotICB1aW50MzJfdCB0bXBfbW9kZTsNCi0gIEhBTF9TUElfU3RhdGVUeXBlRGVmIHRtcF9zdGF0ZTsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIGVycm9yY29kZSA9IEhBTF9PSzsNCi0NCi0gIC8qIENoZWNrIHJ4ICYgdHggZG1hIGhhbmRsZXMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19TUElfRE1BX0hBTkRMRShoc3BpLT5oZG1hcngpKTsNCi0gIGFzc2VydF9wYXJhbShJU19TUElfRE1BX0hBTkRMRShoc3BpLT5oZG1hdHgpKTsNCi0NCi0gIC8qIENoZWNrIERpcmVjdGlvbiBwYXJhbWV0ZXIgKi8NCi0gIGFzc2VydF9wYXJhbShJU19TUElfRElSRUNUSU9OXzJMSU5FUyhoc3BpLT5Jbml0LkRpcmVjdGlvbikpOw0KLQ0KLSAgLyogUHJvY2VzcyBsb2NrZWQgKi8NCi0gIF9fSEFMX0xPQ0soaHNwaSk7DQotDQotICAvKiBJbml0IHRlbXBvcmFyeSB2YXJpYWJsZXMgKi8NCi0gIHRtcF9zdGF0ZSA9IGhzcGktPlN0YXRlOw0KLSAgdG1wX21vZGUgPSBoc3BpLT5Jbml0Lk1vZGU7DQotDQotICBpZiAoISgodG1wX3N0YXRlID09IEhBTF9TUElfU1RBVEVfUkVBRFkpIHx8DQotICAgICAgICAoKHRtcF9tb2RlID09IFNQSV9NT0RFX01BU1RFUikgJiYNCi0gICAgICAgICAoaHNwaS0+SW5pdC5EaXJlY3Rpb24gPT0gU1BJX0RJUkVDVElPTl8yTElORVMpICYmDQotICAgICAgICAgKHRtcF9zdGF0ZSA9PSBIQUxfU1BJX1NUQVRFX0JVU1lfUlgpKSkpIHsNCi0gICAgZXJyb3Jjb2RlID0gSEFMX0JVU1k7DQotICAgIGdvdG8gZXJyb3I7DQotICB9DQotDQotICBpZiAoKHBUeERhdGEgPT0gTlVMTCkgfHwgKHBSeERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKSB7DQotICAgIGVycm9yY29kZSA9IEhBTF9FUlJPUjsNCi0gICAgZ290byBlcnJvcjsNCi0gIH0NCi0NCi0gIC8qIERvbid0IG92ZXJ3cml0ZSBpbiBjYXNlIG9mIEhBTF9TUElfU1RBVEVfQlVTWV9SWCAqLw0KLSAgaWYgKGhzcGktPlN0YXRlICE9IEhBTF9TUElfU1RBVEVfQlVTWV9SWCkgew0KLSAgICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfQlVTWV9UWF9SWDsNCi0gIH0NCi0NCi0gIC8qIFNldCB0aGUgdHJhbnNhY3Rpb24gaW5mb3JtYXRpb24gKi8NCi0gIGhzcGktPkVycm9yQ29kZSA9IEhBTF9TUElfRVJST1JfTk9ORTsNCi0gIGhzcGktPnBUeEJ1ZmZQdHIgPSAodWludDhfdCAqKXBUeERhdGE7DQotICBoc3BpLT5UeFhmZXJTaXplID0gU2l6ZTsNCi0gIGhzcGktPlR4WGZlckNvdW50ID0gU2l6ZTsNCi0gIGhzcGktPnBSeEJ1ZmZQdHIgPSAodWludDhfdCAqKXBSeERhdGE7DQotICBoc3BpLT5SeFhmZXJTaXplID0gU2l6ZTsNCi0gIGhzcGktPlJ4WGZlckNvdW50ID0gU2l6ZTsNCi0NCi0gIC8qIEluaXQgZmllbGQgbm90IHVzZWQgaW4gaGFuZGxlIHRvIHplcm8gKi8NCi0gIGhzcGktPlJ4SVNSID0gTlVMTDsNCi0gIGhzcGktPlR4SVNSID0gTlVMTDsNCi0NCi0jaWYgKFVTRV9TUElfQ1JDICE9IDBVKQ0KLSAgLyogUmVzZXQgQ1JDIENhbGN1bGF0aW9uICovDQotICBpZiAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKSB7DQotICAgIFNQSV9SRVNFVF9DUkMoaHNwaSk7DQotICB9DQotI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovDQotDQotICAvKiBSZXNldCB0aGUgdGhyZXNob2xkIGJpdCAqLw0KLSAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfTERNQVRYIHwgU1BJX0NSMl9MRE1BUlgpOw0KLQ0KLSAgLyogVGhlIHBhY2tpbmcgbW9kZSBtYW5hZ2VtZW50IGlzIGVuYWJsZWQgYnkgdGhlIERNQSBzZXR0aW5ncyBhY2NvcmRpbmcgdGhlDQotICAgKiBzcGkgZGF0YSBzaXplICovDQotICBpZiAoaHNwaS0+SW5pdC5EYXRhU2l6ZSA+IFNQSV9EQVRBU0laRV84QklUKSB7DQotICAgIC8qIFNldCBmaWZvcnh0aHJlc2hvbGQgYWNjb3JkaW5nIHRoZSByZWNlcHRpb24gZGF0YSBsZW5ndGg6IDE2Yml0ICovDQotICAgIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfUlhGSUZPX1RIUkVTSE9MRCk7DQotICB9IGVsc2Ugew0KLSAgICAvKiBTZXQgUlggRmlmbyB0aHJlc2hvbGQgYWNjb3JkaW5nIHRoZSByZWNlcHRpb24gZGF0YSBsZW5ndGg6IDhiaXQgKi8NCi0gICAgU0VUX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfUlhGSUZPX1RIUkVTSE9MRCk7DQotDQotICAgIGlmIChoc3BpLT5oZG1hdHgtPkluaXQuTWVtRGF0YUFsaWdubWVudCA9PSBETUFfTURBVEFBTElHTl9IQUxGV09SRCkgew0KLSAgICAgIGlmICgoaHNwaS0+VHhYZmVyU2l6ZSAmIDB4MVUpID09IDB4MFUpIHsNCi0gICAgICAgIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX0xETUFUWCk7DQotICAgICAgICBoc3BpLT5UeFhmZXJDb3VudCA9IGhzcGktPlR4WGZlckNvdW50ID4+IDFVOw0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfTERNQVRYKTsNCi0gICAgICAgIGhzcGktPlR4WGZlckNvdW50ID0gKGhzcGktPlR4WGZlckNvdW50ID4+IDFVKSArIDFVOw0KLSAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBpZiAoaHNwaS0+aGRtYXJ4LT5Jbml0Lk1lbURhdGFBbGlnbm1lbnQgPT0gRE1BX01EQVRBQUxJR05fSEFMRldPUkQpIHsNCi0gICAgICAvKiBTZXQgUlggRmlmbyB0aHJlc2hvbGQgYWNjb3JkaW5nIHRoZSByZWNlcHRpb24gZGF0YSBsZW5ndGg6IDE2Yml0ICovDQotICAgICAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9SWEZJRk9fVEhSRVNIT0xEKTsNCi0NCi0gICAgICBpZiAoKGhzcGktPlJ4WGZlckNvdW50ICYgMHgxVSkgPT0gMHgwVSkgew0KLSAgICAgICAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfTERNQVJYKTsNCi0gICAgICAgIGhzcGktPlJ4WGZlckNvdW50ID0gaHNwaS0+UnhYZmVyQ291bnQgPj4gMVU7DQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9MRE1BUlgpOw0KLSAgICAgICAgaHNwaS0+UnhYZmVyQ291bnQgPSAoaHNwaS0+UnhYZmVyQ291bnQgPj4gMVUpICsgMVU7DQotICAgICAgfQ0KLSAgICB9DQotICB9DQotDQotICAvKiBDaGVjayBpZiB3ZSBhcmUgaW4gUnggb25seSBvciBpbiBSeC9UeCBNb2RlIGFuZCBjb25maWd1cmUgdGhlIERNQSB0cmFuc2Zlcg0KLSAgICogY29tcGxldGUgY2FsbGJhY2sgKi8NCi0gIGlmIChoc3BpLT5TdGF0ZSA9PSBIQUxfU1BJX1NUQVRFX0JVU1lfUlgpIHsNCi0gICAgLyogU2V0IHRoZSBTUEkgUnggRE1BIEhhbGYgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8NCi0gICAgaHNwaS0+aGRtYXJ4LT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFNQSV9ETUFIYWxmUmVjZWl2ZUNwbHQ7DQotICAgIGhzcGktPmhkbWFyeC0+WGZlckNwbHRDYWxsYmFjayA9IFNQSV9ETUFSZWNlaXZlQ3BsdDsNCi0gIH0gZWxzZSB7DQotICAgIC8qIFNldCB0aGUgU1BJIFR4L1J4IERNQSBIYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovDQotICAgIGhzcGktPmhkbWFyeC0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBTUElfRE1BSGFsZlRyYW5zbWl0UmVjZWl2ZUNwbHQ7DQotICAgIGhzcGktPmhkbWFyeC0+WGZlckNwbHRDYWxsYmFjayA9IFNQSV9ETUFUcmFuc21pdFJlY2VpdmVDcGx0Ow0KLSAgfQ0KLQ0KLSAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8NCi0gIGhzcGktPmhkbWFyeC0+WGZlckVycm9yQ2FsbGJhY2sgPSBTUElfRE1BRXJyb3I7DQotDQotICAvKiBTZXQgdGhlIERNQSBBYm9ydENwbHRDYWxsYmFjayAqLw0KLSAgaHNwaS0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7DQotDQotICAvKiBFbmFibGUgdGhlIFJ4IERNQSBTdHJlYW0vQ2hhbm5lbCAgKi8NCi0gIGlmIChIQUxfT0sgIT0gSEFMX0RNQV9TdGFydF9JVChoc3BpLT5oZG1hcngsICh1aW50MzJfdCkmaHNwaS0+SW5zdGFuY2UtPkRSLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCloc3BpLT5wUnhCdWZmUHRyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhzcGktPlJ4WGZlckNvdW50KSkgew0KLSAgICAvKiBVcGRhdGUgU1BJIGVycm9yIGNvZGUgKi8NCi0gICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfRE1BKTsNCi0gICAgZXJyb3Jjb2RlID0gSEFMX0VSUk9SOw0KLQ0KLSAgICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfUkVBRFk7DQotICAgIGdvdG8gZXJyb3I7DQotICB9DQotDQotICAvKiBFbmFibGUgUnggRE1BIFJlcXVlc3QgKi8NCi0gIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9SWERNQUVOKTsNCi0NCi0gIC8qIFNldCB0aGUgU1BJIFR4IERNQSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayBhcyBOVUxMIGJlY2F1c2UgdGhlDQotICBjb21tdW5pY2F0aW9uIGNsb3NpbmcgaXMgcGVyZm9ybWVkIGluIERNQSByZWNlcHRpb24gY29tcGxldGUgY2FsbGJhY2sgICovDQotICBoc3BpLT5oZG1hdHgtPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gTlVMTDsNCi0gIGhzcGktPmhkbWF0eC0+WGZlckNwbHRDYWxsYmFjayA9IE5VTEw7DQotICBoc3BpLT5oZG1hdHgtPlhmZXJFcnJvckNhbGxiYWNrID0gTlVMTDsNCi0gIGhzcGktPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOw0KLQ0KLSAgLyogRW5hYmxlIHRoZSBUeCBETUEgU3RyZWFtL0NoYW5uZWwgICovDQotICBpZiAoSEFMX09LICE9IEhBTF9ETUFfU3RhcnRfSVQoaHNwaS0+aGRtYXR4LCAodWludDMyX3QpaHNwaS0+cFR4QnVmZlB0ciwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpJmhzcGktPkluc3RhbmNlLT5EUiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoc3BpLT5UeFhmZXJDb3VudCkpIHsNCi0gICAgLyogVXBkYXRlIFNQSSBlcnJvciBjb2RlICovDQotICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0RNQSk7DQotICAgIGVycm9yY29kZSA9IEhBTF9FUlJPUjsNCi0NCi0gICAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX1JFQURZOw0KLSAgICBnb3RvIGVycm9yOw0KLSAgfQ0KLQ0KLSAgLyogQ2hlY2sgaWYgdGhlIFNQSSBpcyBhbHJlYWR5IGVuYWJsZWQgKi8NCi0gIGlmICgoaHNwaS0+SW5zdGFuY2UtPkNSMSAmIFNQSV9DUjFfU1BFKSAhPSBTUElfQ1IxX1NQRSkgew0KLSAgICAvKiBFbmFibGUgU1BJIHBlcmlwaGVyYWwgKi8NCi0gICAgX19IQUxfU1BJX0VOQUJMRShoc3BpKTsNCi0gIH0NCi0gIC8qIEVuYWJsZSB0aGUgU1BJIEVycm9yIEludGVycnVwdCBCaXQgKi8NCi0gIF9fSEFMX1NQSV9FTkFCTEVfSVQoaHNwaSwgKFNQSV9JVF9FUlIpKTsNCi0NCi0gIC8qIEVuYWJsZSBUeCBETUEgUmVxdWVzdCAqLw0KLSAgU0VUX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1RYRE1BRU4pOw0KLQ0KLWVycm9yOg0KLSAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLw0KLSAgX19IQUxfVU5MT0NLKGhzcGkpOw0KLSAgcmV0dXJuIGVycm9yY29kZTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBBYm9ydCBvbmdvaW5nIHRyYW5zZmVyIChibG9ja2luZyBtb2RlKS4NCi0gKiBAcGFyYW0gIGhzcGkgU1BJIGhhbmRsZS4NCi0gKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGNvdWxkIGJlIHVzZWQgZm9yIGFib3J0aW5nIGFueSBvbmdvaW5nIHRyYW5zZmVyIChUeA0KLSAqIGFuZCBSeCksIHN0YXJ0ZWQgaW4gSW50ZXJydXB0IG9yIERNQSBtb2RlLiBUaGlzIHByb2NlZHVyZSBwZXJmb3JtcyBmb2xsb3dpbmcNCi0gKiBvcGVyYXRpb25zIDoNCi0gKiAgICAgICAgICAgLSBEaXNhYmxlIFNQSSBJbnRlcnJ1cHRzIChkZXBlbmRpbmcgb2YgdHJhbnNmZXIgZGlyZWN0aW9uKQ0KLSAqICAgICAgICAgICAtIERpc2FibGUgdGhlIERNQSB0cmFuc2ZlciBpbiB0aGUgcGVyaXBoZXJhbCByZWdpc3RlciAoaWYgZW5hYmxlZCkNCi0gKiAgICAgICAgICAgLSBBYm9ydCBETUEgdHJhbnNmZXIgYnkgY2FsbGluZyBIQUxfRE1BX0Fib3J0IChpbiBjYXNlIG9mIHRyYW5zZmVyDQotICogaW4gRE1BIG1vZGUpDQotICogICAgICAgICAgIC0gU2V0IGhhbmRsZSBTdGF0ZSB0byBSRUFEWQ0KLSAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgaXMgZXhlY3V0ZWQgaW4gYmxvY2tpbmcgbW9kZSA6IHdoZW4gZXhpdGluZyBmdW5jdGlvbiwNCi0gKiBBYm9ydCBpcyBjb25zaWRlcmVkIGFzIGNvbXBsZXRlZC4NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX0Fib3J0KFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKSB7DQotICBIQUxfU3RhdHVzVHlwZURlZiBlcnJvcmNvZGU7DQotICBfX0lPIHVpbnQzMl90IGNvdW50Ow0KLSAgX19JTyB1aW50MzJfdCByZXNldGNvdW50Ow0KLQ0KLSAgLyogSW5pdGlhbGl6ZWQgbG9jYWwgdmFyaWFibGUgICovDQotICBlcnJvcmNvZGUgPSBIQUxfT0s7DQotICByZXNldGNvdW50ID0gU1BJX0RFRkFVTFRfVElNRU9VVCAqIChTeXN0ZW1Db3JlQ2xvY2sgLyAyNFUgLyAxMDAwVSk7DQotICBjb3VudCA9IHJlc2V0Y291bnQ7DQotDQotICAvKiBDbGVhciBFUlJJRSBpbnRlcnJ1cHQgdG8gYXZvaWQgZXJyb3IgaW50ZXJydXB0cyBnZW5lcmF0aW9uIGR1cmluZyBBYm9ydA0KLSAgICogcHJvY2VkdXJlICovDQotICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9FUlJJRSk7DQotDQotICAvKiBEaXNhYmxlIFRYRUlFLCBSWE5FSUUgYW5kIEVSUklFKG1vZGUgZmF1bHQgZXZlbnQsIG92ZXJydW4gZXJyb3IsIFRJIGZyYW1lDQotICAgKiBlcnJvcikgaW50ZXJydXB0cyAqLw0KLSAgaWYgKEhBTF9JU19CSVRfU0VUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfVFhFSUUpKSB7DQotICAgIGhzcGktPlR4SVNSID0gU1BJX0Fib3J0VHhfSVNSOw0KLSAgICAvKiBXYWl0IEhBTF9TUElfU1RBVEVfQUJPUlQgc3RhdGUgKi8NCi0gICAgZG8gew0KLSAgICAgIGlmIChjb3VudCA9PSAwVSkgew0KLSAgICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfQUJPUlQpOw0KLSAgICAgICAgYnJlYWs7DQotICAgICAgfQ0KLSAgICAgIGNvdW50LS07DQotICAgIH0gd2hpbGUgKGhzcGktPlN0YXRlICE9IEhBTF9TUElfU1RBVEVfQUJPUlQpOw0KLSAgICAvKiBSZXNldCBUaW1lb3V0IENvdW50ZXIgKi8NCi0gICAgY291bnQgPSByZXNldGNvdW50Ow0KLSAgfQ0KLQ0KLSAgaWYgKEhBTF9JU19CSVRfU0VUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfUlhORUlFKSkgew0KLSAgICBoc3BpLT5SeElTUiA9IFNQSV9BYm9ydFJ4X0lTUjsNCi0gICAgLyogV2FpdCBIQUxfU1BJX1NUQVRFX0FCT1JUIHN0YXRlICovDQotICAgIGRvIHsNCi0gICAgICBpZiAoY291bnQgPT0gMFUpIHsNCi0gICAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0FCT1JUKTsNCi0gICAgICAgIGJyZWFrOw0KLSAgICAgIH0NCi0gICAgICBjb3VudC0tOw0KLSAgICB9IHdoaWxlIChoc3BpLT5TdGF0ZSAhPSBIQUxfU1BJX1NUQVRFX0FCT1JUKTsNCi0gICAgLyogUmVzZXQgVGltZW91dCBDb3VudGVyICovDQotICAgIGNvdW50ID0gcmVzZXRjb3VudDsNCi0gIH0NCi0NCi0gIC8qIERpc2FibGUgdGhlIFNQSSBETUEgVHggcmVxdWVzdCBpZiBlbmFibGVkICovDQotICBpZiAoSEFMX0lTX0JJVF9TRVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9UWERNQUVOKSkgew0KLSAgICAvKiBBYm9ydCB0aGUgU1BJIERNQSBUeCBTdHJlYW0vQ2hhbm5lbCA6IHVzZSBibG9ja2luZyBETUEgQWJvcnQgQVBJIChubw0KLSAgICAgKiBjYWxsYmFjaykgKi8NCi0gICAgaWYgKGhzcGktPmhkbWF0eCAhPSBOVUxMKSB7DQotICAgICAgLyogU2V0IHRoZSBTUEkgRE1BIEFib3J0IGNhbGxiYWNrIDoNCi0gICAgICB3aWxsIGxlYWQgdG8gY2FsbCBIQUxfU1BJX0Fib3J0Q3BsdENhbGxiYWNrKCkgYXQgZW5kIG9mIERNQSBhYm9ydA0KLSAgICAgIHByb2NlZHVyZSAqLw0KLSAgICAgIGhzcGktPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOw0KLQ0KLSAgICAgIC8qIEFib3J0IERNQSBUeCBIYW5kbGUgbGlua2VkIHRvIFNQSSBQZXJpcGhlcmFsICovDQotICAgICAgaWYgKEhBTF9ETUFfQWJvcnQoaHNwaS0+aGRtYXR4KSAhPSBIQUxfT0spIHsNCi0gICAgICAgIGhzcGktPkVycm9yQ29kZSA9IEhBTF9TUElfRVJST1JfQUJPUlQ7DQotICAgICAgfQ0KLQ0KLSAgICAgIC8qIERpc2FibGUgVHggRE1BIFJlcXVlc3QgKi8NCi0gICAgICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgKFNQSV9DUjJfVFhETUFFTikpOw0KLQ0KLSAgICAgIGlmIChTUElfRW5kUnhUeFRyYW5zYWN0aW9uKGhzcGksIFNQSV9ERUZBVUxUX1RJTUVPVVQsIEhBTF9HZXRUaWNrKCkpICE9DQotICAgICAgICAgIEhBTF9PSykgew0KLSAgICAgICAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9BQk9SVDsNCi0gICAgICB9DQotDQotICAgICAgLyogRGlzYWJsZSBTUEkgUGVyaXBoZXJhbCAqLw0KLSAgICAgIF9fSEFMX1NQSV9ESVNBQkxFKGhzcGkpOw0KLQ0KLSAgICAgIC8qIEVtcHR5IHRoZSBGUkxWTCBmaWZvICovDQotICAgICAgaWYgKFNQSV9XYWl0Rmlmb1N0YXRlVW50aWxUaW1lb3V0KGhzcGksIFNQSV9GTEFHX0ZSTFZMLCBTUElfRlJMVkxfRU1QVFksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQSV9ERUZBVUxUX1RJTUVPVVQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9HZXRUaWNrKCkpICE9IEhBTF9PSykgew0KLSAgICAgICAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9BQk9SVDsNCi0gICAgICB9DQotICAgIH0NCi0gIH0NCi0NCi0gIC8qIERpc2FibGUgdGhlIFNQSSBETUEgUnggcmVxdWVzdCBpZiBlbmFibGVkICovDQotICBpZiAoSEFMX0lTX0JJVF9TRVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9SWERNQUVOKSkgew0KLSAgICAvKiBBYm9ydCB0aGUgU1BJIERNQSBSeCBTdHJlYW0vQ2hhbm5lbCA6IHVzZSBibG9ja2luZyBETUEgQWJvcnQgQVBJIChubw0KLSAgICAgKiBjYWxsYmFjaykgKi8NCi0gICAgaWYgKGhzcGktPmhkbWFyeCAhPSBOVUxMKSB7DQotICAgICAgLyogU2V0IHRoZSBTUEkgRE1BIEFib3J0IGNhbGxiYWNrIDoNCi0gICAgICB3aWxsIGxlYWQgdG8gY2FsbCBIQUxfU1BJX0Fib3J0Q3BsdENhbGxiYWNrKCkgYXQgZW5kIG9mIERNQSBhYm9ydA0KLSAgICAgIHByb2NlZHVyZSAqLw0KLSAgICAgIGhzcGktPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOw0KLQ0KLSAgICAgIC8qIEFib3J0IERNQSBSeCBIYW5kbGUgbGlua2VkIHRvIFNQSSBQZXJpcGhlcmFsICovDQotICAgICAgaWYgKEhBTF9ETUFfQWJvcnQoaHNwaS0+aGRtYXJ4KSAhPSBIQUxfT0spIHsNCi0gICAgICAgIGhzcGktPkVycm9yQ29kZSA9IEhBTF9TUElfRVJST1JfQUJPUlQ7DQotICAgICAgfQ0KLQ0KLSAgICAgIC8qIERpc2FibGUgcGVyaXBoZXJhbCAqLw0KLSAgICAgIF9fSEFMX1NQSV9ESVNBQkxFKGhzcGkpOw0KLQ0KLSAgICAgIC8qIENvbnRyb2wgdGhlIEJTWSBmbGFnICovDQotICAgICAgaWYgKFNQSV9XYWl0RmxhZ1N0YXRlVW50aWxUaW1lb3V0KGhzcGksIFNQSV9GTEFHX0JTWSwgUkVTRVQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQSV9ERUZBVUxUX1RJTUVPVVQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9HZXRUaWNrKCkpICE9IEhBTF9PSykgew0KLSAgICAgICAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9BQk9SVDsNCi0gICAgICB9DQotDQotICAgICAgLyogRW1wdHkgdGhlIEZSTFZMIGZpZm8gKi8NCi0gICAgICBpZiAoU1BJX1dhaXRGaWZvU3RhdGVVbnRpbFRpbWVvdXQoaHNwaSwgU1BJX0ZMQUdfRlJMVkwsIFNQSV9GUkxWTF9FTVBUWSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BJX0RFRkFVTFRfVElNRU9VVCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0dldFRpY2soKSkgIT0gSEFMX09LKSB7DQotICAgICAgICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX0FCT1JUOw0KLSAgICAgIH0NCi0NCi0gICAgICAvKiBEaXNhYmxlIFJ4IERNQSBSZXF1ZXN0ICovDQotICAgICAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIChTUElfQ1IyX1JYRE1BRU4pKTsNCi0gICAgfQ0KLSAgfQ0KLSAgLyogUmVzZXQgVHggYW5kIFJ4IHRyYW5zZmVyIGNvdW50ZXJzICovDQotICBoc3BpLT5SeFhmZXJDb3VudCA9IDBVOw0KLSAgaHNwaS0+VHhYZmVyQ291bnQgPSAwVTsNCi0NCi0gIC8qIENoZWNrIGVycm9yIGR1cmluZyBBYm9ydCBwcm9jZWR1cmUgKi8NCi0gIGlmIChoc3BpLT5FcnJvckNvZGUgPT0gSEFMX1NQSV9FUlJPUl9BQk9SVCkgew0KLSAgICAvKiByZXR1cm4gSEFMX0Vycm9yIGluIGNhc2Ugb2YgZXJyb3IgZHVyaW5nIEFib3J0IHByb2NlZHVyZSAqLw0KLSAgICBlcnJvcmNvZGUgPSBIQUxfRVJST1I7DQotICB9IGVsc2Ugew0KLSAgICAvKiBSZXNldCBlcnJvckNvZGUgKi8NCi0gICAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9OT05FOw0KLSAgfQ0KLQ0KLSAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBTUiByZWdpc3RlciAqLw0KLSAgX19IQUxfU1BJX0NMRUFSX09WUkZMQUcoaHNwaSk7DQotICBfX0hBTF9TUElfQ0xFQVJfRlJFRkxBRyhoc3BpKTsNCi0NCi0gIC8qIFJlc3RvcmUgaHNwaS0+c3RhdGUgdG8gcmVhZHkgKi8NCi0gIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9SRUFEWTsNCi0NCi0gIHJldHVybiBlcnJvcmNvZGU7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQWJvcnQgb25nb2luZyB0cmFuc2ZlciAoSW50ZXJydXB0IG1vZGUpLg0KLSAqIEBwYXJhbSAgaHNwaSBTUEkgaGFuZGxlLg0KLSAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgY291bGQgYmUgdXNlZCBmb3IgYWJvcnRpbmcgYW55IG9uZ29pbmcgdHJhbnNmZXIgKFR4DQotICogYW5kIFJ4KSwgc3RhcnRlZCBpbiBJbnRlcnJ1cHQgb3IgRE1BIG1vZGUuIFRoaXMgcHJvY2VkdXJlIHBlcmZvcm1zIGZvbGxvd2luZw0KLSAqIG9wZXJhdGlvbnMgOg0KLSAqICAgICAgICAgICAtIERpc2FibGUgU1BJIEludGVycnVwdHMgKGRlcGVuZGluZyBvZiB0cmFuc2ZlciBkaXJlY3Rpb24pDQotICogICAgICAgICAgIC0gRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGluIHRoZSBwZXJpcGhlcmFsIHJlZ2lzdGVyIChpZiBlbmFibGVkKQ0KLSAqICAgICAgICAgICAtIEFib3J0IERNQSB0cmFuc2ZlciBieSBjYWxsaW5nIEhBTF9ETUFfQWJvcnRfSVQgKGluIGNhc2Ugb2YNCi0gKiB0cmFuc2ZlciBpbiBETUEgbW9kZSkNCi0gKiAgICAgICAgICAgLSBTZXQgaGFuZGxlIFN0YXRlIHRvIFJFQURZDQotICogICAgICAgICAgIC0gQXQgYWJvcnQgY29tcGxldGlvbiwgY2FsbCB1c2VyIGFib3J0IGNvbXBsZXRlIGNhbGxiYWNrDQotICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBpcyBleGVjdXRlZCBpbiBJbnRlcnJ1cHQgbW9kZSwgbWVhbmluZyB0aGF0IGFib3J0DQotICogcHJvY2VkdXJlIGNvdWxkIGJlIGNvbnNpZGVyZWQgYXMgY29tcGxldGVkIG9ubHkgd2hlbiB1c2VyIGFib3J0IGNvbXBsZXRlDQotICogY2FsbGJhY2sgaXMgZXhlY3V0ZWQgKG5vdCB3aGVuIGV4aXRpbmcgZnVuY3Rpb24pLg0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfQWJvcnRfSVQoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpIHsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIGVycm9yY29kZTsNCi0gIHVpbnQzMl90IGFib3J0Y3BsdDsNCi0gIF9fSU8gdWludDMyX3QgY291bnQ7DQotICBfX0lPIHVpbnQzMl90IHJlc2V0Y291bnQ7DQotDQotICAvKiBJbml0aWFsaXplZCBsb2NhbCB2YXJpYWJsZSAgKi8NCi0gIGVycm9yY29kZSA9IEhBTF9PSzsNCi0gIGFib3J0Y3BsdCA9IDFVOw0KLSAgcmVzZXRjb3VudCA9IFNQSV9ERUZBVUxUX1RJTUVPVVQgKiAoU3lzdGVtQ29yZUNsb2NrIC8gMjRVIC8gMTAwMFUpOw0KLSAgY291bnQgPSByZXNldGNvdW50Ow0KLQ0KLSAgLyogQ2xlYXIgRVJSSUUgaW50ZXJydXB0IHRvIGF2b2lkIGVycm9yIGludGVycnVwdHMgZ2VuZXJhdGlvbiBkdXJpbmcgQWJvcnQNCi0gICAqIHByb2NlZHVyZSAqLw0KLSAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfRVJSSUUpOw0KLQ0KLSAgLyogQ2hhbmdlIFJ4IGFuZCBUeCBJcnEgSGFuZGxlciB0byBEaXNhYmxlIFRYRUlFLCBSWE5FSUUgYW5kIEVSUklFIGludGVycnVwdHMNCi0gICAqLw0KLSAgaWYgKEhBTF9JU19CSVRfU0VUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfVFhFSUUpKSB7DQotICAgIGhzcGktPlR4SVNSID0gU1BJX0Fib3J0VHhfSVNSOw0KLSAgICAvKiBXYWl0IEhBTF9TUElfU1RBVEVfQUJPUlQgc3RhdGUgKi8NCi0gICAgZG8gew0KLSAgICAgIGlmIChjb3VudCA9PSAwVSkgew0KLSAgICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfQUJPUlQpOw0KLSAgICAgICAgYnJlYWs7DQotICAgICAgfQ0KLSAgICAgIGNvdW50LS07DQotICAgIH0gd2hpbGUgKGhzcGktPlN0YXRlICE9IEhBTF9TUElfU1RBVEVfQUJPUlQpOw0KLSAgICAvKiBSZXNldCBUaW1lb3V0IENvdW50ZXIgKi8NCi0gICAgY291bnQgPSByZXNldGNvdW50Ow0KLSAgfQ0KLQ0KLSAgaWYgKEhBTF9JU19CSVRfU0VUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfUlhORUlFKSkgew0KLSAgICBoc3BpLT5SeElTUiA9IFNQSV9BYm9ydFJ4X0lTUjsNCi0gICAgLyogV2FpdCBIQUxfU1BJX1NUQVRFX0FCT1JUIHN0YXRlICovDQotICAgIGRvIHsNCi0gICAgICBpZiAoY291bnQgPT0gMFUpIHsNCi0gICAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0FCT1JUKTsNCi0gICAgICAgIGJyZWFrOw0KLSAgICAgIH0NCi0gICAgICBjb3VudC0tOw0KLSAgICB9IHdoaWxlIChoc3BpLT5TdGF0ZSAhPSBIQUxfU1BJX1NUQVRFX0FCT1JUKTsNCi0gICAgLyogUmVzZXQgVGltZW91dCBDb3VudGVyICovDQotICAgIGNvdW50ID0gcmVzZXRjb3VudDsNCi0gIH0NCi0NCi0gIC8qIElmIERNQSBUeCBhbmQvb3IgRE1BIFJ4IEhhbmRsZXMgYXJlIGFzc29jaWF0ZWQgdG8gU1BJIEhhbmRsZSwgRE1BIEFib3J0DQotICAgICBjb21wbGV0ZSBjYWxsYmFja3Mgc2hvdWxkIGJlIGluaXRpYWxpc2VkIGJlZm9yZSBhbnkgY2FsbCB0byBETUEgQWJvcnQNCi0gICAgIGZ1bmN0aW9ucyAqLw0KLSAgLyogRE1BIFR4IEhhbmRsZSBpcyB2YWxpZCAqLw0KLSAgaWYgKGhzcGktPmhkbWF0eCAhPSBOVUxMKSB7DQotICAgIC8qIFNldCBETUEgQWJvcnQgQ29tcGxldGUgY2FsbGJhY2sgaWYgVUFSVCBETUEgVHggcmVxdWVzdCBpZiBlbmFibGVkLg0KLSAgICAgICBPdGhlcndpc2UsIHNldCBpdCB0byBOVUxMICovDQotICAgIGlmIChIQUxfSVNfQklUX1NFVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1RYRE1BRU4pKSB7DQotICAgICAgaHNwaS0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IFNQSV9ETUFUeEFib3J0Q2FsbGJhY2s7DQotICAgIH0gZWxzZSB7DQotICAgICAgaHNwaS0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7DQotICAgIH0NCi0gIH0NCi0gIC8qIERNQSBSeCBIYW5kbGUgaXMgdmFsaWQgKi8NCi0gIGlmIChoc3BpLT5oZG1hcnggIT0gTlVMTCkgew0KLSAgICAvKiBTZXQgRE1BIEFib3J0IENvbXBsZXRlIGNhbGxiYWNrIGlmIFVBUlQgRE1BIFJ4IHJlcXVlc3QgaWYgZW5hYmxlZC4NCi0gICAgICAgT3RoZXJ3aXNlLCBzZXQgaXQgdG8gTlVMTCAqLw0KLSAgICBpZiAoSEFMX0lTX0JJVF9TRVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9SWERNQUVOKSkgew0KLSAgICAgIGhzcGktPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBTUElfRE1BUnhBYm9ydENhbGxiYWNrOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgIGhzcGktPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOw0KLSAgICB9DQotICB9DQotDQotICAvKiBEaXNhYmxlIHRoZSBTUEkgRE1BIFR4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLw0KLSAgaWYgKEhBTF9JU19CSVRfU0VUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfVFhETUFFTikpIHsNCi0gICAgLyogQWJvcnQgdGhlIFNQSSBETUEgVHggU3RyZWFtL0NoYW5uZWwgKi8NCi0gICAgaWYgKGhzcGktPmhkbWF0eCAhPSBOVUxMKSB7DQotICAgICAgLyogQWJvcnQgRE1BIFR4IEhhbmRsZSBsaW5rZWQgdG8gU1BJIFBlcmlwaGVyYWwgKi8NCi0gICAgICBpZiAoSEFMX0RNQV9BYm9ydF9JVChoc3BpLT5oZG1hdHgpICE9IEhBTF9PSykgew0KLSAgICAgICAgaHNwaS0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7DQotICAgICAgICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX0FCT1JUOw0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICBhYm9ydGNwbHQgPSAwVTsNCi0gICAgICB9DQotICAgIH0NCi0gIH0NCi0gIC8qIERpc2FibGUgdGhlIFNQSSBETUEgUnggcmVxdWVzdCBpZiBlbmFibGVkICovDQotICBpZiAoSEFMX0lTX0JJVF9TRVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9SWERNQUVOKSkgew0KLSAgICAvKiBBYm9ydCB0aGUgU1BJIERNQSBSeCBTdHJlYW0vQ2hhbm5lbCAqLw0KLSAgICBpZiAoaHNwaS0+aGRtYXJ4ICE9IE5VTEwpIHsNCi0gICAgICAvKiBBYm9ydCBETUEgUnggSGFuZGxlIGxpbmtlZCB0byBTUEkgUGVyaXBoZXJhbCAqLw0KLSAgICAgIGlmIChIQUxfRE1BX0Fib3J0X0lUKGhzcGktPmhkbWFyeCkgIT0gSEFMX09LKSB7DQotICAgICAgICBoc3BpLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsNCi0gICAgICAgIGhzcGktPkVycm9yQ29kZSA9IEhBTF9TUElfRVJST1JfQUJPUlQ7DQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgIGFib3J0Y3BsdCA9IDBVOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgaWYgKGFib3J0Y3BsdCA9PSAxVSkgew0KLSAgICAvKiBSZXNldCBUeCBhbmQgUnggdHJhbnNmZXIgY291bnRlcnMgKi8NCi0gICAgaHNwaS0+UnhYZmVyQ291bnQgPSAwVTsNCi0gICAgaHNwaS0+VHhYZmVyQ291bnQgPSAwVTsNCi0NCi0gICAgLyogQ2hlY2sgZXJyb3IgZHVyaW5nIEFib3J0IHByb2NlZHVyZSAqLw0KLSAgICBpZiAoaHNwaS0+RXJyb3JDb2RlID09IEhBTF9TUElfRVJST1JfQUJPUlQpIHsNCi0gICAgICAvKiByZXR1cm4gSEFMX0Vycm9yIGluIGNhc2Ugb2YgZXJyb3IgZHVyaW5nIEFib3J0IHByb2NlZHVyZSAqLw0KLSAgICAgIGVycm9yY29kZSA9IEhBTF9FUlJPUjsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAvKiBSZXNldCBlcnJvckNvZGUgKi8NCi0gICAgICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX05PTkU7DQotICAgIH0NCi0NCi0gICAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBTUiByZWdpc3RlciAqLw0KLSAgICBfX0hBTF9TUElfQ0xFQVJfT1ZSRkxBRyhoc3BpKTsNCi0gICAgX19IQUxfU1BJX0NMRUFSX0ZSRUZMQUcoaHNwaSk7DQotDQotICAgIC8qIFJlc3RvcmUgaHNwaS0+U3RhdGUgdG8gUmVhZHkgKi8NCi0gICAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX1JFQURZOw0KLQ0KLSAgICAvKiBBcyBubyBETUEgdG8gYmUgYWJvcnRlZCwgY2FsbCBkaXJlY3RseSB1c2VyIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovDQotI2lmIChVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpDQotICAgIGhzcGktPkFib3J0Q3BsdENhbGxiYWNrKGhzcGkpOw0KLSNlbHNlDQotICAgIEhBTF9TUElfQWJvcnRDcGx0Q2FsbGJhY2soaHNwaSk7DQotI2VuZGlmIC8qIFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLSAgfQ0KLQ0KLSAgcmV0dXJuIGVycm9yY29kZTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBQYXVzZSB0aGUgRE1BIFRyYW5zZmVyLg0KLSAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCi0gKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNQSSBtb2R1bGUuDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9ETUFQYXVzZShTUElfSGFuZGxlVHlwZURlZiAqaHNwaSkgew0KLSAgLyogUHJvY2VzcyBMb2NrZWQgKi8NCi0gIF9fSEFMX0xPQ0soaHNwaSk7DQotDQotICAvKiBEaXNhYmxlIHRoZSBTUEkgRE1BIFR4ICYgUnggcmVxdWVzdHMgKi8NCi0gIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1RYRE1BRU4gfCBTUElfQ1IyX1JYRE1BRU4pOw0KLQ0KLSAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLw0KLSAgX19IQUxfVU5MT0NLKGhzcGkpOw0KLQ0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBSZXN1bWUgdGhlIERNQSBUcmFuc2Zlci4NCi0gKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQotICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTUEkgbW9kdWxlLg0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfRE1BUmVzdW1lKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKSB7DQotICAvKiBQcm9jZXNzIExvY2tlZCAqLw0KLSAgX19IQUxfTE9DSyhoc3BpKTsNCi0NCi0gIC8qIEVuYWJsZSB0aGUgU1BJIERNQSBUeCAmIFJ4IHJlcXVlc3RzICovDQotICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfVFhETUFFTiB8IFNQSV9DUjJfUlhETUFFTik7DQotDQotICAvKiBQcm9jZXNzIFVubG9ja2VkICovDQotICBfX0hBTF9VTkxPQ0soaHNwaSk7DQotDQotICByZXR1cm4gSEFMX09LOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFN0b3AgdGhlIERNQSBUcmFuc2Zlci4NCi0gKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQotICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTUEkgbW9kdWxlLg0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfRE1BU3RvcChTUElfSGFuZGxlVHlwZURlZiAqaHNwaSkgew0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgZXJyb3Jjb2RlID0gSEFMX09LOw0KLSAgLyogVGhlIExvY2sgaXMgbm90IGltcGxlbWVudGVkIG9uIHRoaXMgQVBJIHRvIGFsbG93IHRoZSB1c2VyIGFwcGxpY2F0aW9uDQotICAgICB0byBjYWxsIHRoZSBIQUwgU1BJIEFQSSB1bmRlciBjYWxsYmFja3MgSEFMX1NQSV9UeENwbHRDYWxsYmFjaygpIG9yDQotICAgICBIQUxfU1BJX1J4Q3BsdENhbGxiYWNrKCkgb3IgSEFMX1NQSV9UeFJ4Q3BsdENhbGxiYWNrKCk6IHdoZW4gY2FsbGluZw0KLSAgICAgSEFMX0RNQV9BYm9ydCgpIEFQSSB0aGUgRE1BIFRYL1JYIFRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdCBpcyBnZW5lcmF0ZWQNCi0gICAgIGFuZCB0aGUgY29ycmVzcG9uZCBjYWxsIGJhY2sgaXMgZXhlY3V0ZWQgSEFMX1NQSV9UeENwbHRDYWxsYmFjaygpIG9yDQotICAgICBIQUxfU1BJX1J4Q3BsdENhbGxiYWNrKCkgb3IgSEFMX1NQSV9UeFJ4Q3BsdENhbGxiYWNrKCkNCi0gICAgICovDQotDQotICAvKiBBYm9ydCB0aGUgU1BJIERNQSB0eCBTdHJlYW0vQ2hhbm5lbCAgKi8NCi0gIGlmIChoc3BpLT5oZG1hdHggIT0gTlVMTCkgew0KLSAgICBpZiAoSEFMX09LICE9IEhBTF9ETUFfQWJvcnQoaHNwaS0+aGRtYXR4KSkgew0KLSAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0RNQSk7DQotICAgICAgZXJyb3Jjb2RlID0gSEFMX0VSUk9SOw0KLSAgICB9DQotICB9DQotICAvKiBBYm9ydCB0aGUgU1BJIERNQSByeCBTdHJlYW0vQ2hhbm5lbCAgKi8NCi0gIGlmIChoc3BpLT5oZG1hcnggIT0gTlVMTCkgew0KLSAgICBpZiAoSEFMX09LICE9IEhBTF9ETUFfQWJvcnQoaHNwaS0+aGRtYXJ4KSkgew0KLSAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0RNQSk7DQotICAgICAgZXJyb3Jjb2RlID0gSEFMX0VSUk9SOw0KLSAgICB9DQotICB9DQotDQotICAvKiBEaXNhYmxlIHRoZSBTUEkgRE1BIFR4ICYgUnggcmVxdWVzdHMgKi8NCi0gIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1RYRE1BRU4gfCBTUElfQ1IyX1JYRE1BRU4pOw0KLSAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX1JFQURZOw0KLSAgcmV0dXJuIGVycm9yY29kZTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBIYW5kbGUgU1BJIGludGVycnVwdCByZXF1ZXN0Lg0KLSAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCi0gKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNQSSBtb2R1bGUuDQotICogQHJldHZhbCBOb25lDQotICovDQotdm9pZCBIQUxfU1BJX0lSUUhhbmRsZXIoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpIHsNCi0gIHVpbnQzMl90IGl0c291cmNlID0gaHNwaS0+SW5zdGFuY2UtPkNSMjsNCi0gIHVpbnQzMl90IGl0ZmxhZyA9IGhzcGktPkluc3RhbmNlLT5TUjsNCi0NCi0gIC8qIFNQSSBpbiBtb2RlIFJlY2VpdmVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSAgaWYgKChTUElfQ0hFQ0tfRkxBRyhpdGZsYWcsIFNQSV9GTEFHX09WUikgPT0gUkVTRVQpICYmDQotICAgICAgKFNQSV9DSEVDS19GTEFHKGl0ZmxhZywgU1BJX0ZMQUdfUlhORSkgIT0gUkVTRVQpICYmDQotICAgICAgKFNQSV9DSEVDS19JVF9TT1VSQ0UoaXRzb3VyY2UsIFNQSV9JVF9SWE5FKSAhPSBSRVNFVCkpIHsNCi0gICAgaHNwaS0+UnhJU1IoaHNwaSk7DQotICAgIHJldHVybjsNCi0gIH0NCi0NCi0gIC8qIFNQSSBpbiBtb2RlIFRyYW5zbWl0dGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSAgaWYgKChTUElfQ0hFQ0tfRkxBRyhpdGZsYWcsIFNQSV9GTEFHX1RYRSkgIT0gUkVTRVQpICYmDQotICAgICAgKFNQSV9DSEVDS19JVF9TT1VSQ0UoaXRzb3VyY2UsIFNQSV9JVF9UWEUpICE9IFJFU0VUKSkgew0KLSAgICBoc3BpLT5UeElTUihoc3BpKTsNCi0gICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLSAgLyogU1BJIGluIEVycm9yIFRyZWF0bWVudCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotICBpZiAoKChTUElfQ0hFQ0tfRkxBRyhpdGZsYWcsIFNQSV9GTEFHX01PREYpICE9IFJFU0VUKSB8fA0KLSAgICAgICAoU1BJX0NIRUNLX0ZMQUcoaXRmbGFnLCBTUElfRkxBR19PVlIpICE9IFJFU0VUKSB8fA0KLSAgICAgICAoU1BJX0NIRUNLX0ZMQUcoaXRmbGFnLCBTUElfRkxBR19GUkUpICE9IFJFU0VUKSkgJiYNCi0gICAgICAoU1BJX0NIRUNLX0lUX1NPVVJDRShpdHNvdXJjZSwgU1BJX0lUX0VSUikgIT0gUkVTRVQpKSB7DQotICAgIC8qIFNQSSBPdmVycnVuIGVycm9yIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0gICAgaWYgKFNQSV9DSEVDS19GTEFHKGl0ZmxhZywgU1BJX0ZMQUdfT1ZSKSAhPSBSRVNFVCkgew0KLSAgICAgIGlmIChoc3BpLT5TdGF0ZSAhPSBIQUxfU1BJX1NUQVRFX0JVU1lfVFgpIHsNCi0gICAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX09WUik7DQotICAgICAgICBfX0hBTF9TUElfQ0xFQVJfT1ZSRkxBRyhoc3BpKTsNCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgX19IQUxfU1BJX0NMRUFSX09WUkZMQUcoaHNwaSk7DQotICAgICAgICByZXR1cm47DQotICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qIFNQSSBNb2RlIEZhdWx0IGVycm9yIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0gICAgaWYgKFNQSV9DSEVDS19GTEFHKGl0ZmxhZywgU1BJX0ZMQUdfTU9ERikgIT0gUkVTRVQpIHsNCi0gICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9NT0RGKTsNCi0gICAgICBfX0hBTF9TUElfQ0xFQVJfTU9ERkZMQUcoaHNwaSk7DQotICAgIH0NCi0NCi0gICAgLyogU1BJIEZyYW1lIGVycm9yIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSAgICBpZiAoU1BJX0NIRUNLX0ZMQUcoaXRmbGFnLCBTUElfRkxBR19GUkUpICE9IFJFU0VUKSB7DQotICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfRlJFKTsNCi0gICAgICBfX0hBTF9TUElfQ0xFQVJfRlJFRkxBRyhoc3BpKTsNCi0gICAgfQ0KLQ0KLSAgICBpZiAoaHNwaS0+RXJyb3JDb2RlICE9IEhBTF9TUElfRVJST1JfTk9ORSkgew0KLSAgICAgIC8qIERpc2FibGUgYWxsIGludGVycnVwdHMgKi8NCi0gICAgICBfX0hBTF9TUElfRElTQUJMRV9JVChoc3BpLCBTUElfSVRfUlhORSB8IFNQSV9JVF9UWEUgfCBTUElfSVRfRVJSKTsNCi0NCi0gICAgICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfUkVBRFk7DQotICAgICAgLyogRGlzYWJsZSB0aGUgU1BJIERNQSByZXF1ZXN0cyBpZiBlbmFibGVkICovDQotICAgICAgaWYgKChIQUxfSVNfQklUX1NFVChpdHNvdXJjZSwgU1BJX0NSMl9UWERNQUVOKSkgfHwNCi0gICAgICAgICAgKEhBTF9JU19CSVRfU0VUKGl0c291cmNlLCBTUElfQ1IyX1JYRE1BRU4pKSkgew0KLSAgICAgICAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIChTUElfQ1IyX1RYRE1BRU4gfCBTUElfQ1IyX1JYRE1BRU4pKTsNCi0NCi0gICAgICAgIC8qIEFib3J0IHRoZSBTUEkgRE1BIFJ4IGNoYW5uZWwgKi8NCi0gICAgICAgIGlmIChoc3BpLT5oZG1hcnggIT0gTlVMTCkgew0KLSAgICAgICAgICAvKiBTZXQgdGhlIFNQSSBETUEgQWJvcnQgY2FsbGJhY2sgOg0KLSAgICAgICAgICB3aWxsIGxlYWQgdG8gY2FsbCBIQUxfU1BJX0Vycm9yQ2FsbGJhY2soKSBhdCBlbmQgb2YgRE1BIGFib3J0DQotICAgICAgICAgIHByb2NlZHVyZSAqLw0KLSAgICAgICAgICBoc3BpLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gU1BJX0RNQUFib3J0T25FcnJvcjsNCi0gICAgICAgICAgaWYgKEhBTF9PSyAhPSBIQUxfRE1BX0Fib3J0X0lUKGhzcGktPmhkbWFyeCkpIHsNCi0gICAgICAgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9BQk9SVCk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIC8qIEFib3J0IHRoZSBTUEkgRE1BIFR4IGNoYW5uZWwgKi8NCi0gICAgICAgIGlmIChoc3BpLT5oZG1hdHggIT0gTlVMTCkgew0KLSAgICAgICAgICAvKiBTZXQgdGhlIFNQSSBETUEgQWJvcnQgY2FsbGJhY2sgOg0KLSAgICAgICAgICB3aWxsIGxlYWQgdG8gY2FsbCBIQUxfU1BJX0Vycm9yQ2FsbGJhY2soKSBhdCBlbmQgb2YgRE1BIGFib3J0DQotICAgICAgICAgIHByb2NlZHVyZSAqLw0KLSAgICAgICAgICBoc3BpLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gU1BJX0RNQUFib3J0T25FcnJvcjsNCi0gICAgICAgICAgaWYgKEhBTF9PSyAhPSBIQUxfRE1BX0Fib3J0X0lUKGhzcGktPmhkbWF0eCkpIHsNCi0gICAgICAgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9BQk9SVCk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgLyogQ2FsbCB1c2VyIGVycm9yIGNhbGxiYWNrICovDQotI2lmIChVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpDQotICAgICAgICBoc3BpLT5FcnJvckNhbGxiYWNrKGhzcGkpOw0KLSNlbHNlDQotICAgICAgICBIQUxfU1BJX0Vycm9yQ2FsbGJhY2soaHNwaSk7DQotI2VuZGlmIC8qIFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm47DQotICB9DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgVHggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLg0KLSAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCi0gKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fd2VhayB2b2lkIEhBTF9TUElfVHhDcGx0Q2FsbGJhY2soU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpIHsNCi0gIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8NCi0gIFVOVVNFRChoc3BpKTsNCi0NCi0gIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwNCi0gICAgICAgICAgICB0aGUgSEFMX1NQSV9UeENwbHRDYWxsYmFjayBzaG91bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQ0KLSAgICovDQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUnggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLg0KLSAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCi0gKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fd2VhayB2b2lkIEhBTF9TUElfUnhDcGx0Q2FsbGJhY2soU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpIHsNCi0gIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8NCi0gIFVOVVNFRChoc3BpKTsNCi0NCi0gIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwNCi0gICAgICAgICAgICB0aGUgSEFMX1NQSV9SeENwbHRDYWxsYmFjayBzaG91bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQ0KLSAgICovDQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgVHggYW5kIFJ4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4NCi0gKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQotICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX3dlYWsgdm9pZCBIQUxfU1BJX1R4UnhDcGx0Q2FsbGJhY2soU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpIHsNCi0gIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8NCi0gIFVOVVNFRChoc3BpKTsNCi0NCi0gIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwNCi0gICAgICAgICAgICB0aGUgSEFMX1NQSV9UeFJ4Q3BsdENhbGxiYWNrIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlDQotICAgKi8NCi19DQotDQotLyoqDQotICogQGJyaWVmICBUeCBIYWxmIFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4NCi0gKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQotICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX3dlYWsgdm9pZCBIQUxfU1BJX1R4SGFsZkNwbHRDYWxsYmFjayhTUElfSGFuZGxlVHlwZURlZiAqaHNwaSkgew0KLSAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLw0KLSAgVU5VU0VEKGhzcGkpOw0KLQ0KLSAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLA0KLSAgICAgICAgICAgIHRoZSBIQUxfU1BJX1R4SGFsZkNwbHRDYWxsYmFjayBzaG91bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXINCi0gICAgIGZpbGUNCi0gICAqLw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJ4IEhhbGYgVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLg0KLSAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCi0gKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fd2VhayB2b2lkIEhBTF9TUElfUnhIYWxmQ3BsdENhbGxiYWNrKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKSB7DQotICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovDQotICBVTlVTRUQoaHNwaSk7DQotDQotICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsDQotICAgICAgICAgICAgdGhlIEhBTF9TUElfUnhIYWxmQ3BsdENhbGxiYWNrKCkgc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyDQotICAgICBmaWxlDQotICAgKi8NCi19DQotDQotLyoqDQotICogQGJyaWVmICBUeCBhbmQgUnggSGFsZiBUcmFuc2ZlciBjYWxsYmFjay4NCi0gKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQotICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX3dlYWsgdm9pZCBIQUxfU1BJX1R4UnhIYWxmQ3BsdENhbGxiYWNrKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKSB7DQotICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovDQotICBVTlVTRUQoaHNwaSk7DQotDQotICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsDQotICAgICAgICAgICAgdGhlIEhBTF9TUElfVHhSeEhhbGZDcGx0Q2FsbGJhY2soKSBzaG91bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXINCi0gICAgIGZpbGUNCi0gICAqLw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNQSSBlcnJvciBjYWxsYmFjay4NCi0gKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQotICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX3dlYWsgdm9pZCBIQUxfU1BJX0Vycm9yQ2FsbGJhY2soU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpIHsNCi0gIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8NCi0gIFVOVVNFRChoc3BpKTsNCi0NCi0gIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwNCi0gICAgICAgICAgICB0aGUgSEFMX1NQSV9FcnJvckNhbGxiYWNrIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlDQotICAgKi8NCi0gIC8qIE5PVEUgOiBUaGUgRXJyb3JDb2RlIHBhcmFtZXRlciBpbiB0aGUgaHNwaSBoYW5kbGUgaXMgdXBkYXRlZCBieSB0aGUgU1BJDQotICAgICBwcm9jZXNzZXMgYW5kIHVzZXIgY2FuIHVzZSBIQUxfU1BJX0dldEVycm9yKCkgQVBJIHRvIGNoZWNrIHRoZSBsYXRlc3QgZXJyb3INCi0gICAgIG9jY3VycmVkDQotICAgKi8NCi19DQotDQotLyoqDQotICogQGJyaWVmICBTUEkgQWJvcnQgQ29tcGxldGUgY2FsbGJhY2suDQotICogQHBhcmFtICBoc3BpIFNQSSBoYW5kbGUuDQotICogQHJldHZhbCBOb25lDQotICovDQotX193ZWFrIHZvaWQgSEFMX1NQSV9BYm9ydENwbHRDYWxsYmFjayhTUElfSGFuZGxlVHlwZURlZiAqaHNwaSkgew0KLSAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLw0KLSAgVU5VU0VEKGhzcGkpOw0KLQ0KLSAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLA0KLSAgICAgICAgICAgIHRoZSBIQUxfU1BJX0Fib3J0Q3BsdENhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLg0KLSAgICovDQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBTUElfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvcnMNCi1mdW5jdGlvbnMNCi0gICogQGJyaWVmICAgU1BJIGNvbnRyb2wgZnVuY3Rpb25zDQotICAqDQotQHZlcmJhdGltDQotID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgICAgICAgICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3JzIGZ1bmN0aW9ucyAjIyMjIw0KLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgIFsuLl0NCi0gICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBjb250cm9sIHRoZSBTUEkuDQotICAgICAoKykgSEFMX1NQSV9HZXRTdGF0ZSgpIEFQSSBjYW4gYmUgaGVscGZ1bCB0byBjaGVjayBpbiBydW4tdGltZSB0aGUgc3RhdGUgb2YNCi10aGUgU1BJIHBlcmlwaGVyYWwNCi0gICAgICgrKSBIQUxfU1BJX0dldEVycm9yKCkgY2hlY2sgaW4gcnVuLXRpbWUgRXJyb3JzIG9jY3VycmluZyBkdXJpbmcNCi1jb21tdW5pY2F0aW9uDQotQGVuZHZlcmJhdGltDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmV0dXJuIHRoZSBTUEkgaGFuZGxlIHN0YXRlLg0KLSAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCi0gKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLg0KLSAqIEByZXR2YWwgU1BJIHN0YXRlDQotICovDQotSEFMX1NQSV9TdGF0ZVR5cGVEZWYgSEFMX1NQSV9HZXRTdGF0ZShTUElfSGFuZGxlVHlwZURlZiAqaHNwaSkgew0KLSAgLyogUmV0dXJuIFNQSSBoYW5kbGUgc3RhdGUgKi8NCi0gIHJldHVybiBoc3BpLT5TdGF0ZTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBSZXR1cm4gdGhlIFNQSSBlcnJvciBjb2RlLg0KLSAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCi0gKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLg0KLSAqIEByZXR2YWwgU1BJIGVycm9yIGNvZGUgaW4gYml0bWFwIGZvcm1hdA0KLSAqLw0KLXVpbnQzMl90IEhBTF9TUElfR2V0RXJyb3IoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpIHsNCi0gIC8qIFJldHVybiBTUEkgRXJyb3JDb2RlICovDQotICByZXR1cm4gaHNwaS0+RXJyb3JDb2RlOw0KLX0NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBhZGR0b2dyb3VwIFNQSV9Qcml2YXRlX0Z1bmN0aW9ucw0KLSAqIEBicmllZiAgIFByaXZhdGUgZnVuY3Rpb25zDQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERNQSBTUEkgdHJhbnNtaXQgcHJvY2VzcyBjb21wbGV0ZSBjYWxsYmFjay4NCi0gKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQotICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgbW9kdWxlLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXN0YXRpYyB2b2lkIFNQSV9ETUFUcmFuc21pdENwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpIHsNCi0gIFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpID0NCi0gICAgICAoU1BJX0hhbmRsZVR5cGVEZWYgKikoKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPlBhcmVudCk7IC8qIERlcm9nYXRpb24gTUlTUkFDMjAxMi1SdWxlLTExLjUgKi8NCi0gIHVpbnQzMl90IHRpY2tzdGFydDsNCi0NCi0gIC8qIEluaXQgdGlja3N0YXJ0IGZvciB0aW1lb3V0IG1hbmFnZW1lbnQqLw0KLSAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsNCi0NCi0gIC8qIERNQSBOb3JtYWwgTW9kZSAqLw0KLSAgaWYgKChoZG1hLT5JbnN0YW5jZS0+Q0NSICYgRE1BX0NDUl9DSVJDKSAhPSBETUFfQ0NSX0NJUkMpIHsNCi0gICAgLyogRGlzYWJsZSBFUlIgaW50ZXJydXB0ICovDQotICAgIF9fSEFMX1NQSV9ESVNBQkxFX0lUKGhzcGksIFNQSV9JVF9FUlIpOw0KLQ0KLSAgICAvKiBEaXNhYmxlIFR4IERNQSBSZXF1ZXN0ICovDQotICAgIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1RYRE1BRU4pOw0KLQ0KLSAgICAvKiBDaGVjayB0aGUgZW5kIG9mIHRoZSB0cmFuc2FjdGlvbiAqLw0KLSAgICBpZiAoU1BJX0VuZFJ4VHhUcmFuc2FjdGlvbihoc3BpLCBTUElfREVGQVVMVF9USU1FT1VULCB0aWNrc3RhcnQpICE9DQotICAgICAgICBIQUxfT0spIHsNCi0gICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9GTEFHKTsNCi0gICAgfQ0KLQ0KLSAgICAvKiBDbGVhciBvdmVycnVuIGZsYWcgaW4gMiBMaW5lcyBjb21tdW5pY2F0aW9uIG1vZGUgYmVjYXVzZSByZWNlaXZlZCBkYXRhIGlzDQotICAgICAqIG5vdCByZWFkICovDQotICAgIGlmIChoc3BpLT5Jbml0LkRpcmVjdGlvbiA9PSBTUElfRElSRUNUSU9OXzJMSU5FUykgew0KLSAgICAgIF9fSEFMX1NQSV9DTEVBUl9PVlJGTEFHKGhzcGkpOw0KLSAgICB9DQotDQotICAgIGhzcGktPlR4WGZlckNvdW50ID0gMFU7DQotICAgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9SRUFEWTsNCi0NCi0gICAgaWYgKGhzcGktPkVycm9yQ29kZSAhPSBIQUxfU1BJX0VSUk9SX05PTkUpIHsNCi0gICAgICAvKiBDYWxsIHVzZXIgZXJyb3IgY2FsbGJhY2sgKi8NCi0jaWYgKFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkNCi0gICAgICBoc3BpLT5FcnJvckNhbGxiYWNrKGhzcGkpOw0KLSNlbHNlDQotICAgICAgSEFMX1NQSV9FcnJvckNhbGxiYWNrKGhzcGkpOw0KLSNlbmRpZiAvKiBVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi0gICAgICByZXR1cm47DQotICAgIH0NCi0gIH0NCi0gIC8qIENhbGwgdXNlciBUeCBjb21wbGV0ZSBjYWxsYmFjayAqLw0KLSNpZiAoVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQ0KLSAgaHNwaS0+VHhDcGx0Q2FsbGJhY2soaHNwaSk7DQotI2Vsc2UNCi0gIEhBTF9TUElfVHhDcGx0Q2FsbGJhY2soaHNwaSk7DQotI2VuZGlmIC8qIFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERNQSBTUEkgcmVjZWl2ZSBwcm9jZXNzIGNvbXBsZXRlIGNhbGxiYWNrLg0KLSAqIEBwYXJhbSAgaGRtYSBwb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCi0gKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBtb2R1bGUuDQotICogQHJldHZhbCBOb25lDQotICovDQotc3RhdGljIHZvaWQgU1BJX0RNQVJlY2VpdmVDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKSB7DQotICBTUElfSGFuZGxlVHlwZURlZiAqaHNwaSA9DQotICAgICAgKFNQSV9IYW5kbGVUeXBlRGVmICopKCgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5QYXJlbnQpOyAvKiBEZXJvZ2F0aW9uIE1JU1JBQzIwMTItUnVsZS0xMS41ICovDQotICB1aW50MzJfdCB0aWNrc3RhcnQ7DQotI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkNCi0gIF9fSU8gdWludDMyX3QgdG1wcmVnID0gMFU7DQotICBfX0lPIHVpbnQ4X3QgKnB0bXByZWc4Ow0KLSAgX19JTyB1aW50OF90IHRtcHJlZzggPSAwOw0KLSNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLw0KLQ0KLSAgLyogSW5pdCB0aWNrc3RhcnQgZm9yIHRpbWVvdXQgbWFuYWdlbWVudCovDQotICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOw0KLQ0KLSAgLyogRE1BIE5vcm1hbCBNb2RlICovDQotICBpZiAoKGhkbWEtPkluc3RhbmNlLT5DQ1IgJiBETUFfQ0NSX0NJUkMpICE9IERNQV9DQ1JfQ0lSQykgew0KLSAgICAvKiBEaXNhYmxlIEVSUiBpbnRlcnJ1cHQgKi8NCi0gICAgX19IQUxfU1BJX0RJU0FCTEVfSVQoaHNwaSwgU1BJX0lUX0VSUik7DQotDQotI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkNCi0gICAgLyogQ1JDIGhhbmRsaW5nICovDQotICAgIGlmIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpIHsNCi0gICAgICAvKiBXYWl0IHVudGlsIFJYTkUgZmxhZyAqLw0KLSAgICAgIGlmIChTUElfV2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChoc3BpLCBTUElfRkxBR19SWE5FLCBTRVQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQSV9ERUZBVUxUX1RJTUVPVVQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpY2tzdGFydCkgIT0gSEFMX09LKSB7DQotICAgICAgICAvKiBFcnJvciBvbiB0aGUgQ1JDIHJlY2VwdGlvbiAqLw0KLSAgICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfQ1JDKTsNCi0gICAgICB9DQotICAgICAgLyogUmVhZCBDUkMgKi8NCi0gICAgICBpZiAoaHNwaS0+SW5pdC5EYXRhU2l6ZSA+IFNQSV9EQVRBU0laRV84QklUKSB7DQotICAgICAgICAvKiBSZWFkIDE2Yml0IENSQyAqLw0KLSAgICAgICAgdG1wcmVnID0gUkVBRF9SRUcoaHNwaS0+SW5zdGFuY2UtPkRSKTsNCi0gICAgICAgIC8qIFRvIGF2b2lkIEdDQyB3YXJuaW5nICovDQotICAgICAgICBVTlVTRUQodG1wcmVnKTsNCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgOGJpdCB0ZW1wb3JhcnkgcG9pbnRlciAqLw0KLSAgICAgICAgcHRtcHJlZzggPSAoX19JTyB1aW50OF90ICopJmhzcGktPkluc3RhbmNlLT5EUjsNCi0gICAgICAgIC8qIFJlYWQgOGJpdCBDUkMgKi8NCi0gICAgICAgIHRtcHJlZzggPSAqcHRtcHJlZzg7DQotICAgICAgICAvKiBUbyBhdm9pZCBHQ0Mgd2FybmluZyAqLw0KLSAgICAgICAgVU5VU0VEKHRtcHJlZzgpOw0KLQ0KLSAgICAgICAgaWYgKGhzcGktPkluaXQuQ1JDTGVuZ3RoID09IFNQSV9DUkNfTEVOR1RIXzE2QklUKSB7DQotICAgICAgICAgIGlmIChTUElfV2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChoc3BpLCBTUElfRkxBR19SWE5FLCBTRVQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUElfREVGQVVMVF9USU1FT1VULA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlja3N0YXJ0KSAhPSBIQUxfT0spIHsNCi0gICAgICAgICAgICAvKiBFcnJvciBvbiB0aGUgQ1JDIHJlY2VwdGlvbiAqLw0KLSAgICAgICAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0NSQyk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgLyogUmVhZCA4Yml0IENSQyBhZ2FpbiBpbiBjYXNlIG9mIDE2Yml0IENSQyBpbiA4Yml0IERhdGEgbW9kZSAqLw0KLSAgICAgICAgICB0bXByZWc4ID0gKnB0bXByZWc4Ow0KLSAgICAgICAgICAvKiBUbyBhdm9pZCBHQ0Mgd2FybmluZyAqLw0KLSAgICAgICAgICBVTlVTRUQodG1wcmVnOCk7DQotICAgICAgICB9DQotICAgICAgfQ0KLSAgICB9DQotI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovDQotDQotICAgIC8qIENoZWNrIGlmIHdlIGFyZSBpbiBNYXN0ZXIgUlggMiBsaW5lIG1vZGUgKi8NCi0gICAgaWYgKChoc3BpLT5Jbml0LkRpcmVjdGlvbiA9PSBTUElfRElSRUNUSU9OXzJMSU5FUykgJiYNCi0gICAgICAgIChoc3BpLT5Jbml0Lk1vZGUgPT0gU1BJX01PREVfTUFTVEVSKSkgew0KLSAgICAgIC8qIERpc2FibGUgUngvVHggRE1BIFJlcXVlc3QgKGRvbmUgYnkgZGVmYXVsdCB0byBoYW5kbGUgdGhlIGNhc2UgbWFzdGVyIHJ4DQotICAgICAgICogZGlyZWN0aW9uIDIgbGluZXMpICovDQotICAgICAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfVFhETUFFTiB8IFNQSV9DUjJfUlhETUFFTik7DQotICAgIH0gZWxzZSB7DQotICAgICAgLyogTm9ybWFsIGNhc2UgKi8NCi0gICAgICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9SWERNQUVOKTsNCi0gICAgfQ0KLQ0KLSAgICAvKiBDaGVjayB0aGUgZW5kIG9mIHRoZSB0cmFuc2FjdGlvbiAqLw0KLSAgICBpZiAoU1BJX0VuZFJ4VHJhbnNhY3Rpb24oaHNwaSwgU1BJX0RFRkFVTFRfVElNRU9VVCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spIHsNCi0gICAgICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX0ZMQUc7DQotICAgIH0NCi0NCi0gICAgaHNwaS0+UnhYZmVyQ291bnQgPSAwVTsNCi0gICAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX1JFQURZOw0KLQ0KLSNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpDQotICAgIC8qIENoZWNrIGlmIENSQyBlcnJvciBvY2N1cnJlZCAqLw0KLSAgICBpZiAoX19IQUxfU1BJX0dFVF9GTEFHKGhzcGksIFNQSV9GTEFHX0NSQ0VSUikpIHsNCi0gICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9DUkMpOw0KLSAgICAgIF9fSEFMX1NQSV9DTEVBUl9DUkNFUlJGTEFHKGhzcGkpOw0KLSAgICB9DQotI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovDQotDQotICAgIGlmIChoc3BpLT5FcnJvckNvZGUgIT0gSEFMX1NQSV9FUlJPUl9OT05FKSB7DQotICAgICAgLyogQ2FsbCB1c2VyIGVycm9yIGNhbGxiYWNrICovDQotI2lmIChVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpDQotICAgICAgaHNwaS0+RXJyb3JDYWxsYmFjayhoc3BpKTsNCi0jZWxzZQ0KLSAgICAgIEhBTF9TUElfRXJyb3JDYWxsYmFjayhoc3BpKTsNCi0jZW5kaWYgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotICAgICAgcmV0dXJuOw0KLSAgICB9DQotICB9DQotICAvKiBDYWxsIHVzZXIgUnggY29tcGxldGUgY2FsbGJhY2sgKi8NCi0jaWYgKFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkNCi0gIGhzcGktPlJ4Q3BsdENhbGxiYWNrKGhzcGkpOw0KLSNlbHNlDQotICBIQUxfU1BJX1J4Q3BsdENhbGxiYWNrKGhzcGkpOw0KLSNlbmRpZiAvKiBVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi19DQotDQotLyoqDQotICogQGJyaWVmICBETUEgU1BJIHRyYW5zbWl0IHJlY2VpdmUgcHJvY2VzcyBjb21wbGV0ZSBjYWxsYmFjay4NCi0gKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQotICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgbW9kdWxlLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXN0YXRpYyB2b2lkIFNQSV9ETUFUcmFuc21pdFJlY2VpdmVDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKSB7DQotICBTUElfSGFuZGxlVHlwZURlZiAqaHNwaSA9DQotICAgICAgKFNQSV9IYW5kbGVUeXBlRGVmICopKCgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5QYXJlbnQpOyAvKiBEZXJvZ2F0aW9uIE1JU1JBQzIwMTItUnVsZS0xMS41ICovDQotICB1aW50MzJfdCB0aWNrc3RhcnQ7DQotI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkNCi0gIF9fSU8gdWludDMyX3QgdG1wcmVnID0gMFU7DQotICBfX0lPIHVpbnQ4X3QgKnB0bXByZWc4Ow0KLSAgX19JTyB1aW50OF90IHRtcHJlZzggPSAwOw0KLSNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLw0KLQ0KLSAgLyogSW5pdCB0aWNrc3RhcnQgZm9yIHRpbWVvdXQgbWFuYWdlbWVudCovDQotICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOw0KLQ0KLSAgLyogRE1BIE5vcm1hbCBNb2RlICovDQotICBpZiAoKGhkbWEtPkluc3RhbmNlLT5DQ1IgJiBETUFfQ0NSX0NJUkMpICE9IERNQV9DQ1JfQ0lSQykgew0KLSAgICAvKiBEaXNhYmxlIEVSUiBpbnRlcnJ1cHQgKi8NCi0gICAgX19IQUxfU1BJX0RJU0FCTEVfSVQoaHNwaSwgU1BJX0lUX0VSUik7DQotDQotI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkNCi0gICAgLyogQ1JDIGhhbmRsaW5nICovDQotICAgIGlmIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpIHsNCi0gICAgICBpZiAoKGhzcGktPkluaXQuRGF0YVNpemUgPT0gU1BJX0RBVEFTSVpFXzhCSVQpICYmDQotICAgICAgICAgIChoc3BpLT5Jbml0LkNSQ0xlbmd0aCA9PSBTUElfQ1JDX0xFTkdUSF84QklUKSkgew0KLSAgICAgICAgaWYgKFNQSV9XYWl0Rmlmb1N0YXRlVW50aWxUaW1lb3V0KA0KLSAgICAgICAgICAgICAgICBoc3BpLCBTUElfRkxBR19GUkxWTCwgU1BJX0ZSTFZMX1FVQVJURVJfRlVMTCwNCi0gICAgICAgICAgICAgICAgU1BJX0RFRkFVTFRfVElNRU9VVCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spIHsNCi0gICAgICAgICAgLyogRXJyb3Igb24gdGhlIENSQyByZWNlcHRpb24gKi8NCi0gICAgICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfQ1JDKTsNCi0gICAgICAgIH0NCi0gICAgICAgIC8qIEluaXRpYWxpemUgdGhlIDhiaXQgdGVtcG9yYXJ5IHBvaW50ZXIgKi8NCi0gICAgICAgIHB0bXByZWc4ID0gKF9fSU8gdWludDhfdCAqKSZoc3BpLT5JbnN0YW5jZS0+RFI7DQotICAgICAgICAvKiBSZWFkIDhiaXQgQ1JDICovDQotICAgICAgICB0bXByZWc4ID0gKnB0bXByZWc4Ow0KLSAgICAgICAgLyogVG8gYXZvaWQgR0NDIHdhcm5pbmcgKi8NCi0gICAgICAgIFVOVVNFRCh0bXByZWc4KTsNCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgaWYgKFNQSV9XYWl0Rmlmb1N0YXRlVW50aWxUaW1lb3V0KA0KLSAgICAgICAgICAgICAgICBoc3BpLCBTUElfRkxBR19GUkxWTCwgU1BJX0ZSTFZMX0hBTEZfRlVMTCwgU1BJX0RFRkFVTFRfVElNRU9VVCwNCi0gICAgICAgICAgICAgICAgdGlja3N0YXJ0KSAhPSBIQUxfT0spIHsNCi0gICAgICAgICAgLyogRXJyb3Igb24gdGhlIENSQyByZWNlcHRpb24gKi8NCi0gICAgICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfQ1JDKTsNCi0gICAgICAgIH0NCi0gICAgICAgIC8qIFJlYWQgQ1JDIHRvIEZsdXNoIERSIGFuZCBSWE5FIGZsYWcgKi8NCi0gICAgICAgIHRtcHJlZyA9IFJFQURfUkVHKGhzcGktPkluc3RhbmNlLT5EUik7DQotICAgICAgICAvKiBUbyBhdm9pZCBHQ0Mgd2FybmluZyAqLw0KLSAgICAgICAgVU5VU0VEKHRtcHJlZyk7DQotICAgICAgfQ0KLSAgICB9DQotI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovDQotDQotICAgIC8qIENoZWNrIHRoZSBlbmQgb2YgdGhlIHRyYW5zYWN0aW9uICovDQotICAgIGlmIChTUElfRW5kUnhUeFRyYW5zYWN0aW9uKGhzcGksIFNQSV9ERUZBVUxUX1RJTUVPVVQsIHRpY2tzdGFydCkgIT0NCi0gICAgICAgIEhBTF9PSykgew0KLSAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0ZMQUcpOw0KLSAgICB9DQotDQotICAgIC8qIERpc2FibGUgUngvVHggRE1BIFJlcXVlc3QgKi8NCi0gICAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfVFhETUFFTiB8IFNQSV9DUjJfUlhETUFFTik7DQotDQotICAgIGhzcGktPlR4WGZlckNvdW50ID0gMFU7DQotICAgIGhzcGktPlJ4WGZlckNvdW50ID0gMFU7DQotICAgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9SRUFEWTsNCi0NCi0jaWYgKFVTRV9TUElfQ1JDICE9IDBVKQ0KLSAgICAvKiBDaGVjayBpZiBDUkMgZXJyb3Igb2NjdXJyZWQgKi8NCi0gICAgaWYgKF9fSEFMX1NQSV9HRVRfRkxBRyhoc3BpLCBTUElfRkxBR19DUkNFUlIpKSB7DQotICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfQ1JDKTsNCi0gICAgICBfX0hBTF9TUElfQ0xFQVJfQ1JDRVJSRkxBRyhoc3BpKTsNCi0gICAgfQ0KLSNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLw0KLQ0KLSAgICBpZiAoaHNwaS0+RXJyb3JDb2RlICE9IEhBTF9TUElfRVJST1JfTk9ORSkgew0KLSAgICAgIC8qIENhbGwgdXNlciBlcnJvciBjYWxsYmFjayAqLw0KLSNpZiAoVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQ0KLSAgICAgIGhzcGktPkVycm9yQ2FsbGJhY2soaHNwaSk7DQotI2Vsc2UNCi0gICAgICBIQUxfU1BJX0Vycm9yQ2FsbGJhY2soaHNwaSk7DQotI2VuZGlmIC8qIFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLSAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgfQ0KLSAgLyogQ2FsbCB1c2VyIFR4UnggY29tcGxldGUgY2FsbGJhY2sgKi8NCi0jaWYgKFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkNCi0gIGhzcGktPlR4UnhDcGx0Q2FsbGJhY2soaHNwaSk7DQotI2Vsc2UNCi0gIEhBTF9TUElfVHhSeENwbHRDYWxsYmFjayhoc3BpKTsNCi0jZW5kaWYgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRE1BIFNQSSBoYWxmIHRyYW5zbWl0IHByb2Nlc3MgY29tcGxldGUgY2FsbGJhY2suDQotICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KLSAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIG1vZHVsZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1zdGF0aWMgdm9pZCBTUElfRE1BSGFsZlRyYW5zbWl0Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkgew0KLSAgU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkgPQ0KLSAgICAgIChTUElfSGFuZGxlVHlwZURlZiAqKSgoKERNQV9IYW5kbGVUeXBlRGVmICopaGRtYSkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+UGFyZW50KTsgLyogRGVyb2dhdGlvbiBNSVNSQUMyMDEyLVJ1bGUtMTEuNSAqLw0KLQ0KLSAgLyogQ2FsbCB1c2VyIFR4IGhhbGYgY29tcGxldGUgY2FsbGJhY2sgKi8NCi0jaWYgKFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkNCi0gIGhzcGktPlR4SGFsZkNwbHRDYWxsYmFjayhoc3BpKTsNCi0jZWxzZQ0KLSAgSEFMX1NQSV9UeEhhbGZDcGx0Q2FsbGJhY2soaHNwaSk7DQotI2VuZGlmIC8qIFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERNQSBTUEkgaGFsZiByZWNlaXZlIHByb2Nlc3MgY29tcGxldGUgY2FsbGJhY2sNCi0gKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQotICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgbW9kdWxlLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXN0YXRpYyB2b2lkIFNQSV9ETUFIYWxmUmVjZWl2ZUNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpIHsNCi0gIFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpID0NCi0gICAgICAoU1BJX0hhbmRsZVR5cGVEZWYgKikoKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPlBhcmVudCk7IC8qIERlcm9nYXRpb24gTUlTUkFDMjAxMi1SdWxlLTExLjUgKi8NCi0NCi0gIC8qIENhbGwgdXNlciBSeCBoYWxmIGNvbXBsZXRlIGNhbGxiYWNrICovDQotI2lmIChVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpDQotICBoc3BpLT5SeEhhbGZDcGx0Q2FsbGJhY2soaHNwaSk7DQotI2Vsc2UNCi0gIEhBTF9TUElfUnhIYWxmQ3BsdENhbGxiYWNrKGhzcGkpOw0KLSNlbmRpZiAvKiBVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi19DQotDQotLyoqDQotICogQGJyaWVmICBETUEgU1BJIGhhbGYgdHJhbnNtaXQgcmVjZWl2ZSBwcm9jZXNzIGNvbXBsZXRlIGNhbGxiYWNrLg0KLSAqIEBwYXJhbSAgaGRtYSBwb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCi0gKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBtb2R1bGUuDQotICogQHJldHZhbCBOb25lDQotICovDQotc3RhdGljIHZvaWQgU1BJX0RNQUhhbGZUcmFuc21pdFJlY2VpdmVDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKSB7DQotICBTUElfSGFuZGxlVHlwZURlZiAqaHNwaSA9DQotICAgICAgKFNQSV9IYW5kbGVUeXBlRGVmICopKCgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5QYXJlbnQpOyAvKiBEZXJvZ2F0aW9uIE1JU1JBQzIwMTItUnVsZS0xMS41ICovDQotDQotICAvKiBDYWxsIHVzZXIgVHhSeCBoYWxmIGNvbXBsZXRlIGNhbGxiYWNrICovDQotI2lmIChVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpDQotICBoc3BpLT5UeFJ4SGFsZkNwbHRDYWxsYmFjayhoc3BpKTsNCi0jZWxzZQ0KLSAgSEFMX1NQSV9UeFJ4SGFsZkNwbHRDYWxsYmFjayhoc3BpKTsNCi0jZW5kaWYgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRE1BIFNQSSBjb21tdW5pY2F0aW9uIGVycm9yIGNhbGxiYWNrLg0KLSAqIEBwYXJhbSAgaGRtYSBwb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCi0gKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBtb2R1bGUuDQotICogQHJldHZhbCBOb25lDQotICovDQotc3RhdGljIHZvaWQgU1BJX0RNQUVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKSB7DQotICBTUElfSGFuZGxlVHlwZURlZiAqaHNwaSA9DQotICAgICAgKFNQSV9IYW5kbGVUeXBlRGVmICopKCgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5QYXJlbnQpOyAvKiBEZXJvZ2F0aW9uIE1JU1JBQzIwMTItUnVsZS0xMS41ICovDQotDQotICAvKiBTdG9wIHRoZSBkaXNhYmxlIERNQSB0cmFuc2ZlciBvbiBTUEkgc2lkZSAqLw0KLSAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfVFhETUFFTiB8IFNQSV9DUjJfUlhETUFFTik7DQotDQotICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9ETUEpOw0KLSAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX1JFQURZOw0KLSAgLyogQ2FsbCB1c2VyIGVycm9yIGNhbGxiYWNrICovDQotI2lmIChVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpDQotICBoc3BpLT5FcnJvckNhbGxiYWNrKGhzcGkpOw0KLSNlbHNlDQotICBIQUxfU1BJX0Vycm9yQ2FsbGJhY2soaHNwaSk7DQotI2VuZGlmIC8qIFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERNQSBTUEkgY29tbXVuaWNhdGlvbiBhYm9ydCBjYWxsYmFjaywgd2hlbiBpbml0aWF0ZWQgYnkgSEFMIHNlcnZpY2VzDQotICogb24gRXJyb3IgKFRvIGJlIGNhbGxlZCBhdCBlbmQgb2YgRE1BIEFib3J0IHByb2NlZHVyZSBmb2xsb3dpbmcgZXJyb3INCi0gKiBvY2N1cnJlbmNlKS4NCi0gKiBAcGFyYW0gIGhkbWEgRE1BIGhhbmRsZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1zdGF0aWMgdm9pZCBTUElfRE1BQWJvcnRPbkVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKSB7DQotICBTUElfSGFuZGxlVHlwZURlZiAqaHNwaSA9DQotICAgICAgKFNQSV9IYW5kbGVUeXBlRGVmICopKCgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5QYXJlbnQpOyAvKiBEZXJvZ2F0aW9uIE1JU1JBQzIwMTItUnVsZS0xMS41ICovDQotICBoc3BpLT5SeFhmZXJDb3VudCA9IDBVOw0KLSAgaHNwaS0+VHhYZmVyQ291bnQgPSAwVTsNCi0NCi0gIC8qIENhbGwgdXNlciBlcnJvciBjYWxsYmFjayAqLw0KLSNpZiAoVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQ0KLSAgaHNwaS0+RXJyb3JDYWxsYmFjayhoc3BpKTsNCi0jZWxzZQ0KLSAgSEFMX1NQSV9FcnJvckNhbGxiYWNrKGhzcGkpOw0KLSNlbmRpZiAvKiBVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi19DQotDQotLyoqDQotICogQGJyaWVmICBETUEgU1BJIFR4IGNvbW11bmljYXRpb24gYWJvcnQgY2FsbGJhY2ssIHdoZW4gaW5pdGlhdGVkIGJ5IHVzZXINCi0gKiAgICAgICAgIChUbyBiZSBjYWxsZWQgYXQgZW5kIG9mIERNQSBUeCBBYm9ydCBwcm9jZWR1cmUgZm9sbG93aW5nIHVzZXIgYWJvcnQNCi0gKiByZXF1ZXN0KS4NCi0gKiBAbm90ZSAgIFdoZW4gdGhpcyBjYWxsYmFjayBpcyBleGVjdXRlZCwgVXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsIGJhY2sgaXMNCi0gKiBjYWxsZWQgb25seSBpZiBubyBBYm9ydCBzdGlsbCBvbmdvaW5nIGZvciBSeCBETUEgSGFuZGxlLg0KLSAqIEBwYXJhbSAgaGRtYSBETUEgaGFuZGxlLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXN0YXRpYyB2b2lkIFNQSV9ETUFUeEFib3J0Q2FsbGJhY2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpIHsNCi0gIFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpID0NCi0gICAgICAoU1BJX0hhbmRsZVR5cGVEZWYgKikoKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPlBhcmVudCk7IC8qIERlcm9nYXRpb24gTUlTUkFDMjAxMi1SdWxlLTExLjUgKi8NCi0NCi0gIGhzcGktPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOw0KLQ0KLSAgLyogRGlzYWJsZSBUeCBETUEgUmVxdWVzdCAqLw0KLSAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfVFhETUFFTik7DQotDQotICBpZiAoU1BJX0VuZFJ4VHhUcmFuc2FjdGlvbihoc3BpLCBTUElfREVGQVVMVF9USU1FT1VULCBIQUxfR2V0VGljaygpKSAhPQ0KLSAgICAgIEhBTF9PSykgew0KLSAgICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX0FCT1JUOw0KLSAgfQ0KLQ0KLSAgLyogRGlzYWJsZSBTUEkgUGVyaXBoZXJhbCAqLw0KLSAgX19IQUxfU1BJX0RJU0FCTEUoaHNwaSk7DQotDQotICAvKiBFbXB0eSB0aGUgRlJMVkwgZmlmbyAqLw0KLSAgaWYgKFNQSV9XYWl0Rmlmb1N0YXRlVW50aWxUaW1lb3V0KGhzcGksIFNQSV9GTEFHX0ZSTFZMLCBTUElfRlJMVkxfRU1QVFksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BJX0RFRkFVTFRfVElNRU9VVCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfR2V0VGljaygpKSAhPSBIQUxfT0spIHsNCi0gICAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9BQk9SVDsNCi0gIH0NCi0NCi0gIC8qIENoZWNrIGlmIGFuIEFib3J0IHByb2Nlc3MgaXMgc3RpbGwgb25nb2luZyAqLw0KLSAgaWYgKGhzcGktPmhkbWFyeCAhPSBOVUxMKSB7DQotICAgIGlmIChoc3BpLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrICE9IE5VTEwpIHsNCi0gICAgICByZXR1cm47DQotICAgIH0NCi0gIH0NCi0NCi0gIC8qIE5vIEFib3J0IHByb2Nlc3Mgc3RpbGwgb25nb2luZyA6IEFsbCBETUEgU3RyZWFtL0NoYW5uZWwgYXJlIGFib3J0ZWQsIGNhbGwNCi0gICAqIHVzZXIgQWJvcnQgQ29tcGxldGUgY2FsbGJhY2sgKi8NCi0gIGhzcGktPlJ4WGZlckNvdW50ID0gMFU7DQotICBoc3BpLT5UeFhmZXJDb3VudCA9IDBVOw0KLQ0KLSAgLyogQ2hlY2sgbm8gZXJyb3IgZHVyaW5nIEFib3J0IHByb2NlZHVyZSAqLw0KLSAgaWYgKGhzcGktPkVycm9yQ29kZSAhPSBIQUxfU1BJX0VSUk9SX0FCT1JUKSB7DQotICAgIC8qIFJlc2V0IGVycm9yQ29kZSAqLw0KLSAgICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX05PTkU7DQotICB9DQotDQotICAvKiBDbGVhciB0aGUgRXJyb3IgZmxhZ3MgaW4gdGhlIFNSIHJlZ2lzdGVyICovDQotICBfX0hBTF9TUElfQ0xFQVJfT1ZSRkxBRyhoc3BpKTsNCi0gIF9fSEFMX1NQSV9DTEVBUl9GUkVGTEFHKGhzcGkpOw0KLQ0KLSAgLyogUmVzdG9yZSBoc3BpLT5TdGF0ZSB0byBSZWFkeSAqLw0KLSAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX1JFQURZOw0KLQ0KLSAgLyogQ2FsbCB1c2VyIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovDQotI2lmIChVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpDQotICBoc3BpLT5BYm9ydENwbHRDYWxsYmFjayhoc3BpKTsNCi0jZWxzZQ0KLSAgSEFMX1NQSV9BYm9ydENwbHRDYWxsYmFjayhoc3BpKTsNCi0jZW5kaWYgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRE1BIFNQSSBSeCBjb21tdW5pY2F0aW9uIGFib3J0IGNhbGxiYWNrLCB3aGVuIGluaXRpYXRlZCBieSB1c2VyDQotICogICAgICAgICAoVG8gYmUgY2FsbGVkIGF0IGVuZCBvZiBETUEgUnggQWJvcnQgcHJvY2VkdXJlIGZvbGxvd2luZyB1c2VyIGFib3J0DQotICogcmVxdWVzdCkuDQotICogQG5vdGUgICBXaGVuIHRoaXMgY2FsbGJhY2sgaXMgZXhlY3V0ZWQsIFVzZXIgQWJvcnQgY29tcGxldGUgY2FsbCBiYWNrIGlzDQotICogY2FsbGVkIG9ubHkgaWYgbm8gQWJvcnQgc3RpbGwgb25nb2luZyBmb3IgVHggRE1BIEhhbmRsZS4NCi0gKiBAcGFyYW0gIGhkbWEgRE1BIGhhbmRsZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1zdGF0aWMgdm9pZCBTUElfRE1BUnhBYm9ydENhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKSB7DQotICBTUElfSGFuZGxlVHlwZURlZiAqaHNwaSA9DQotICAgICAgKFNQSV9IYW5kbGVUeXBlRGVmICopKCgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5QYXJlbnQpOyAvKiBEZXJvZ2F0aW9uIE1JU1JBQzIwMTItUnVsZS0xMS41ICovDQotDQotICAvKiBEaXNhYmxlIFNQSSBQZXJpcGhlcmFsICovDQotICBfX0hBTF9TUElfRElTQUJMRShoc3BpKTsNCi0NCi0gIGhzcGktPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOw0KLQ0KLSAgLyogRGlzYWJsZSBSeCBETUEgUmVxdWVzdCAqLw0KLSAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfUlhETUFFTik7DQotDQotICAvKiBDb250cm9sIHRoZSBCU1kgZmxhZyAqLw0KLSAgaWYgKFNQSV9XYWl0RmxhZ1N0YXRlVW50aWxUaW1lb3V0KGhzcGksIFNQSV9GTEFHX0JTWSwgUkVTRVQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BJX0RFRkFVTFRfVElNRU9VVCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfR2V0VGljaygpKSAhPSBIQUxfT0spIHsNCi0gICAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9BQk9SVDsNCi0gIH0NCi0NCi0gIC8qIEVtcHR5IHRoZSBGUkxWTCBmaWZvICovDQotICBpZiAoU1BJX1dhaXRGaWZvU3RhdGVVbnRpbFRpbWVvdXQoaHNwaSwgU1BJX0ZMQUdfRlJMVkwsIFNQSV9GUkxWTF9FTVBUWSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUElfREVGQVVMVF9USU1FT1VULA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9HZXRUaWNrKCkpICE9IEhBTF9PSykgew0KLSAgICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX0FCT1JUOw0KLSAgfQ0KLQ0KLSAgLyogQ2hlY2sgaWYgYW4gQWJvcnQgcHJvY2VzcyBpcyBzdGlsbCBvbmdvaW5nICovDQotICBpZiAoaHNwaS0+aGRtYXR4ICE9IE5VTEwpIHsNCi0gICAgaWYgKGhzcGktPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgIT0gTlVMTCkgew0KLSAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgLyogTm8gQWJvcnQgcHJvY2VzcyBzdGlsbCBvbmdvaW5nIDogQWxsIERNQSBTdHJlYW0vQ2hhbm5lbCBhcmUgYWJvcnRlZCwgY2FsbA0KLSAgICogdXNlciBBYm9ydCBDb21wbGV0ZSBjYWxsYmFjayAqLw0KLSAgaHNwaS0+UnhYZmVyQ291bnQgPSAwVTsNCi0gIGhzcGktPlR4WGZlckNvdW50ID0gMFU7DQotDQotICAvKiBDaGVjayBubyBlcnJvciBkdXJpbmcgQWJvcnQgcHJvY2VkdXJlICovDQotICBpZiAoaHNwaS0+RXJyb3JDb2RlICE9IEhBTF9TUElfRVJST1JfQUJPUlQpIHsNCi0gICAgLyogUmVzZXQgZXJyb3JDb2RlICovDQotICAgIGhzcGktPkVycm9yQ29kZSA9IEhBTF9TUElfRVJST1JfTk9ORTsNCi0gIH0NCi0NCi0gIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgU1IgcmVnaXN0ZXIgKi8NCi0gIF9fSEFMX1NQSV9DTEVBUl9PVlJGTEFHKGhzcGkpOw0KLSAgX19IQUxfU1BJX0NMRUFSX0ZSRUZMQUcoaHNwaSk7DQotDQotICAvKiBSZXN0b3JlIGhzcGktPlN0YXRlIHRvIFJlYWR5ICovDQotICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfUkVBRFk7DQotDQotICAvKiBDYWxsIHVzZXIgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8NCi0jaWYgKFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkNCi0gIGhzcGktPkFib3J0Q3BsdENhbGxiYWNrKGhzcGkpOw0KLSNlbHNlDQotICBIQUxfU1BJX0Fib3J0Q3BsdENhbGxiYWNrKGhzcGkpOw0KLSNlbmRpZiAvKiBVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi19DQotDQotLyoqDQotICogQGJyaWVmICBSeCA4LWJpdCBoYW5kbGVyIGZvciBUcmFuc21pdCBhbmQgUmVjZWl2ZSBpbiBJbnRlcnJ1cHQgbW9kZS4NCi0gKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQotICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1zdGF0aWMgdm9pZCBTUElfMmxpbmVzUnhJU1JfOEJJVChzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSkgew0KLSAgLyogUmVjZWl2ZSBkYXRhIGluIHBhY2tpbmcgbW9kZSAqLw0KLSAgaWYgKGhzcGktPlJ4WGZlckNvdW50ID4gMVUpIHsNCi0gICAgKigodWludDE2X3QgKiloc3BpLT5wUnhCdWZmUHRyKSA9ICh1aW50MTZfdCkoaHNwaS0+SW5zdGFuY2UtPkRSKTsNCi0gICAgaHNwaS0+cFJ4QnVmZlB0ciArPSBzaXplb2YodWludDE2X3QpOw0KLSAgICBoc3BpLT5SeFhmZXJDb3VudCAtPSAyVTsNCi0gICAgaWYgKGhzcGktPlJ4WGZlckNvdW50ID09IDFVKSB7DQotICAgICAgLyogU2V0IFJYIEZpZm8gdGhyZXNob2xkIGFjY29yZGluZyB0aGUgcmVjZXB0aW9uIGRhdGEgbGVuZ3RoOiA4Yml0ICovDQotICAgICAgU0VUX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfUlhGSUZPX1RIUkVTSE9MRCk7DQotICAgIH0NCi0gIH0NCi0gIC8qIFJlY2VpdmUgZGF0YSBpbiA4IEJpdCBtb2RlICovDQotICBlbHNlIHsNCi0gICAgKmhzcGktPnBSeEJ1ZmZQdHIgPSAqKChfX0lPIHVpbnQ4X3QgKikmaHNwaS0+SW5zdGFuY2UtPkRSKTsNCi0gICAgaHNwaS0+cFJ4QnVmZlB0cisrOw0KLSAgICBoc3BpLT5SeFhmZXJDb3VudC0tOw0KLSAgfQ0KLQ0KLSAgLyogQ2hlY2sgZW5kIG9mIHRoZSByZWNlcHRpb24gKi8NCi0gIGlmIChoc3BpLT5SeFhmZXJDb3VudCA9PSAwVSkgew0KLSNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpDQotICAgIGlmIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpIHsNCi0gICAgICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9SWEZJRk9fVEhSRVNIT0xEKTsNCi0gICAgICBoc3BpLT5SeElTUiA9IFNQSV8ybGluZXNSeElTUl84QklUQ1JDOw0KLSAgICAgIHJldHVybjsNCi0gICAgfQ0KLSNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLw0KLQ0KLSAgICAvKiBEaXNhYmxlIFJYTkUgIGFuZCBFUlIgaW50ZXJydXB0ICovDQotICAgIF9fSEFMX1NQSV9ESVNBQkxFX0lUKGhzcGksIChTUElfSVRfUlhORSB8IFNQSV9JVF9FUlIpKTsNCi0NCi0gICAgaWYgKGhzcGktPlR4WGZlckNvdW50ID09IDBVKSB7DQotICAgICAgU1BJX0Nsb3NlUnhUeF9JU1IoaHNwaSk7DQotICAgIH0NCi0gIH0NCi19DQotDQotI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkNCi0vKioNCi0gKiBAYnJpZWYgIFJ4IDgtYml0IGhhbmRsZXIgZm9yIFRyYW5zbWl0IGFuZCBSZWNlaXZlIGluIEludGVycnVwdCBtb2RlLg0KLSAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCi0gKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXN0YXRpYyB2b2lkIFNQSV8ybGluZXNSeElTUl84QklUQ1JDKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKSB7DQotICBfX0lPIHVpbnQ4X3QgKnB0bXByZWc4Ow0KLSAgX19JTyB1aW50OF90IHRtcHJlZzggPSAwOw0KLQ0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgOGJpdCB0ZW1wb3JhcnkgcG9pbnRlciAqLw0KLSAgcHRtcHJlZzggPSAoX19JTyB1aW50OF90ICopJmhzcGktPkluc3RhbmNlLT5EUjsNCi0gIC8qIFJlYWQgOGJpdCBDUkMgdG8gZmx1c2ggRGF0YSBSZWdpc3RlciAqLw0KLSAgdG1wcmVnOCA9ICpwdG1wcmVnODsNCi0gIC8qIFRvIGF2b2lkIEdDQyB3YXJuaW5nICovDQotICBVTlVTRUQodG1wcmVnOCk7DQotDQotICBoc3BpLT5DUkNTaXplLS07DQotDQotICAvKiBDaGVjayBlbmQgb2YgdGhlIHJlY2VwdGlvbiAqLw0KLSAgaWYgKGhzcGktPkNSQ1NpemUgPT0gMFUpIHsNCi0gICAgLyogRGlzYWJsZSBSWE5FIGFuZCBFUlIgaW50ZXJydXB0ICovDQotICAgIF9fSEFMX1NQSV9ESVNBQkxFX0lUKGhzcGksIChTUElfSVRfUlhORSB8IFNQSV9JVF9FUlIpKTsNCi0NCi0gICAgaWYgKGhzcGktPlR4WGZlckNvdW50ID09IDBVKSB7DQotICAgICAgU1BJX0Nsb3NlUnhUeF9JU1IoaHNwaSk7DQotICAgIH0NCi0gIH0NCi19DQotI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovDQotDQotLyoqDQotICogQGJyaWVmICBUeCA4LWJpdCBoYW5kbGVyIGZvciBUcmFuc21pdCBhbmQgUmVjZWl2ZSBpbiBJbnRlcnJ1cHQgbW9kZS4NCi0gKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQotICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1zdGF0aWMgdm9pZCBTUElfMmxpbmVzVHhJU1JfOEJJVChzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSkgew0KLSAgLyogVHJhbnNtaXQgZGF0YSBpbiBwYWNraW5nIEJpdCBtb2RlICovDQotICBpZiAoaHNwaS0+VHhYZmVyQ291bnQgPj0gMlUpIHsNCi0gICAgaHNwaS0+SW5zdGFuY2UtPkRSID0gKigodWludDE2X3QgKiloc3BpLT5wVHhCdWZmUHRyKTsNCi0gICAgaHNwaS0+cFR4QnVmZlB0ciArPSBzaXplb2YodWludDE2X3QpOw0KLSAgICBoc3BpLT5UeFhmZXJDb3VudCAtPSAyVTsNCi0gIH0NCi0gIC8qIFRyYW5zbWl0IGRhdGEgaW4gOCBCaXQgbW9kZSAqLw0KLSAgZWxzZSB7DQotICAgICooX19JTyB1aW50OF90ICopJmhzcGktPkluc3RhbmNlLT5EUiA9ICgqaHNwaS0+cFR4QnVmZlB0cik7DQotICAgIGhzcGktPnBUeEJ1ZmZQdHIrKzsNCi0gICAgaHNwaS0+VHhYZmVyQ291bnQtLTsNCi0gIH0NCi0NCi0gIC8qIENoZWNrIHRoZSBlbmQgb2YgdGhlIHRyYW5zbWlzc2lvbiAqLw0KLSAgaWYgKGhzcGktPlR4WGZlckNvdW50ID09IDBVKSB7DQotI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkNCi0gICAgaWYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkgew0KLSAgICAgIC8qIFNldCBDUkMgTmV4dCBCaXQgdG8gc2VuZCBDUkMgKi8NCi0gICAgICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjEsIFNQSV9DUjFfQ1JDTkVYVCk7DQotICAgICAgLyogRGlzYWJsZSBUWEUgaW50ZXJydXB0ICovDQotICAgICAgX19IQUxfU1BJX0RJU0FCTEVfSVQoaHNwaSwgU1BJX0lUX1RYRSk7DQotICAgICAgcmV0dXJuOw0KLSAgICB9DQotI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovDQotDQotICAgIC8qIERpc2FibGUgVFhFIGludGVycnVwdCAqLw0KLSAgICBfX0hBTF9TUElfRElTQUJMRV9JVChoc3BpLCBTUElfSVRfVFhFKTsNCi0NCi0gICAgaWYgKGhzcGktPlJ4WGZlckNvdW50ID09IDBVKSB7DQotICAgICAgU1BJX0Nsb3NlUnhUeF9JU1IoaHNwaSk7DQotICAgIH0NCi0gIH0NCi19DQotDQotLyoqDQotICogQGJyaWVmICBSeCAxNi1iaXQgaGFuZGxlciBmb3IgVHJhbnNtaXQgYW5kIFJlY2VpdmUgaW4gSW50ZXJydXB0IG1vZGUuDQotICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KLSAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuDQotICogQHJldHZhbCBOb25lDQotICovDQotc3RhdGljIHZvaWQgU1BJXzJsaW5lc1J4SVNSXzE2QklUKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKSB7DQotICAvKiBSZWNlaXZlIGRhdGEgaW4gMTYgQml0IG1vZGUgKi8NCi0gICooKHVpbnQxNl90ICopaHNwaS0+cFJ4QnVmZlB0cikgPSAodWludDE2X3QpKGhzcGktPkluc3RhbmNlLT5EUik7DQotICBoc3BpLT5wUnhCdWZmUHRyICs9IHNpemVvZih1aW50MTZfdCk7DQotICBoc3BpLT5SeFhmZXJDb3VudC0tOw0KLQ0KLSAgaWYgKGhzcGktPlJ4WGZlckNvdW50ID09IDBVKSB7DQotI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkNCi0gICAgaWYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkgew0KLSAgICAgIGhzcGktPlJ4SVNSID0gU1BJXzJsaW5lc1J4SVNSXzE2QklUQ1JDOw0KLSAgICAgIHJldHVybjsNCi0gICAgfQ0KLSNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLw0KLQ0KLSAgICAvKiBEaXNhYmxlIFJYTkUgaW50ZXJydXB0ICovDQotICAgIF9fSEFMX1NQSV9ESVNBQkxFX0lUKGhzcGksIFNQSV9JVF9SWE5FKTsNCi0NCi0gICAgaWYgKGhzcGktPlR4WGZlckNvdW50ID09IDBVKSB7DQotICAgICAgU1BJX0Nsb3NlUnhUeF9JU1IoaHNwaSk7DQotICAgIH0NCi0gIH0NCi19DQotDQotI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkNCi0vKioNCi0gKiBAYnJpZWYgIE1hbmFnZSB0aGUgQ1JDIDE2LWJpdCByZWNlaXZlIGZvciBUcmFuc21pdCBhbmQgUmVjZWl2ZSBpbiBJbnRlcnJ1cHQNCi0gKiBtb2RlLg0KLSAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCi0gKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXN0YXRpYyB2b2lkIFNQSV8ybGluZXNSeElTUl8xNkJJVENSQyhzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSkgew0KLSAgX19JTyB1aW50MzJfdCB0bXByZWcgPSAwVTsNCi0NCi0gIC8qIFJlYWQgMTZiaXQgQ1JDIHRvIGZsdXNoIERhdGEgUmVnaXN0ZXIgKi8NCi0gIHRtcHJlZyA9IFJFQURfUkVHKGhzcGktPkluc3RhbmNlLT5EUik7DQotICAvKiBUbyBhdm9pZCBHQ0Mgd2FybmluZyAqLw0KLSAgVU5VU0VEKHRtcHJlZyk7DQotDQotICAvKiBEaXNhYmxlIFJYTkUgaW50ZXJydXB0ICovDQotICBfX0hBTF9TUElfRElTQUJMRV9JVChoc3BpLCBTUElfSVRfUlhORSk7DQotDQotICBTUElfQ2xvc2VSeFR4X0lTUihoc3BpKTsNCi19DQotI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovDQotDQotLyoqDQotICogQGJyaWVmICBUeCAxNi1iaXQgaGFuZGxlciBmb3IgVHJhbnNtaXQgYW5kIFJlY2VpdmUgaW4gSW50ZXJydXB0IG1vZGUuDQotICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KLSAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuDQotICogQHJldHZhbCBOb25lDQotICovDQotc3RhdGljIHZvaWQgU1BJXzJsaW5lc1R4SVNSXzE2QklUKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKSB7DQotICAvKiBUcmFuc21pdCBkYXRhIGluIDE2IEJpdCBtb2RlICovDQotICBoc3BpLT5JbnN0YW5jZS0+RFIgPSAqKCh1aW50MTZfdCAqKWhzcGktPnBUeEJ1ZmZQdHIpOw0KLSAgaHNwaS0+cFR4QnVmZlB0ciArPSBzaXplb2YodWludDE2X3QpOw0KLSAgaHNwaS0+VHhYZmVyQ291bnQtLTsNCi0NCi0gIC8qIEVuYWJsZSBDUkMgVHJhbnNtaXNzaW9uICovDQotICBpZiAoaHNwaS0+VHhYZmVyQ291bnQgPT0gMFUpIHsNCi0jaWYgKFVTRV9TUElfQ1JDICE9IDBVKQ0KLSAgICBpZiAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKSB7DQotICAgICAgLyogU2V0IENSQyBOZXh0IEJpdCB0byBzZW5kIENSQyAqLw0KLSAgICAgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMSwgU1BJX0NSMV9DUkNORVhUKTsNCi0gICAgICAvKiBEaXNhYmxlIFRYRSBpbnRlcnJ1cHQgKi8NCi0gICAgICBfX0hBTF9TUElfRElTQUJMRV9JVChoc3BpLCBTUElfSVRfVFhFKTsNCi0gICAgICByZXR1cm47DQotICAgIH0NCi0jZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8NCi0NCi0gICAgLyogRGlzYWJsZSBUWEUgaW50ZXJydXB0ICovDQotICAgIF9fSEFMX1NQSV9ESVNBQkxFX0lUKGhzcGksIFNQSV9JVF9UWEUpOw0KLQ0KLSAgICBpZiAoaHNwaS0+UnhYZmVyQ291bnQgPT0gMFUpIHsNCi0gICAgICBTUElfQ2xvc2VSeFR4X0lTUihoc3BpKTsNCi0gICAgfQ0KLSAgfQ0KLX0NCi0NCi0jaWYgKFVTRV9TUElfQ1JDICE9IDBVKQ0KLS8qKg0KLSAqIEBicmllZiAgTWFuYWdlIHRoZSBDUkMgOC1iaXQgcmVjZWl2ZSBpbiBJbnRlcnJ1cHQgY29udGV4dC4NCi0gKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQotICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1zdGF0aWMgdm9pZCBTUElfUnhJU1JfOEJJVENSQyhzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSkgew0KLSAgX19JTyB1aW50OF90ICpwdG1wcmVnODsNCi0gIF9fSU8gdWludDhfdCB0bXByZWc4ID0gMDsNCi0NCi0gIC8qIEluaXRpYWxpemUgdGhlIDhiaXQgdGVtcG9yYXJ5IHBvaW50ZXIgKi8NCi0gIHB0bXByZWc4ID0gKF9fSU8gdWludDhfdCAqKSZoc3BpLT5JbnN0YW5jZS0+RFI7DQotICAvKiBSZWFkIDhiaXQgQ1JDIHRvIGZsdXNoIERhdGEgUmVnaXN0ZXIgKi8NCi0gIHRtcHJlZzggPSAqcHRtcHJlZzg7DQotICAvKiBUbyBhdm9pZCBHQ0Mgd2FybmluZyAqLw0KLSAgVU5VU0VEKHRtcHJlZzgpOw0KLQ0KLSAgaHNwaS0+Q1JDU2l6ZS0tOw0KLQ0KLSAgaWYgKGhzcGktPkNSQ1NpemUgPT0gMFUpIHsNCi0gICAgU1BJX0Nsb3NlUnhfSVNSKGhzcGkpOw0KLSAgfQ0KLX0NCi0jZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIE1hbmFnZSB0aGUgcmVjZWl2ZSA4LWJpdCBpbiBJbnRlcnJ1cHQgY29udGV4dC4NCi0gKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQotICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1zdGF0aWMgdm9pZCBTUElfUnhJU1JfOEJJVChzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSkgew0KLSAgKmhzcGktPnBSeEJ1ZmZQdHIgPSAoKihfX0lPIHVpbnQ4X3QgKikmaHNwaS0+SW5zdGFuY2UtPkRSKTsNCi0gIGhzcGktPnBSeEJ1ZmZQdHIrKzsNCi0gIGhzcGktPlJ4WGZlckNvdW50LS07DQotDQotI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkNCi0gIC8qIEVuYWJsZSBDUkMgVHJhbnNtaXNzaW9uICovDQotICBpZiAoKGhzcGktPlJ4WGZlckNvdW50ID09IDFVKSAmJg0KLSAgICAgIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpKSB7DQotICAgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMSwgU1BJX0NSMV9DUkNORVhUKTsNCi0gIH0NCi0jZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8NCi0NCi0gIGlmIChoc3BpLT5SeFhmZXJDb3VudCA9PSAwVSkgew0KLSNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpDQotICAgIGlmIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpIHsNCi0gICAgICBoc3BpLT5SeElTUiA9IFNQSV9SeElTUl84QklUQ1JDOw0KLSAgICAgIHJldHVybjsNCi0gICAgfQ0KLSNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLw0KLSAgICBTUElfQ2xvc2VSeF9JU1IoaHNwaSk7DQotICB9DQotfQ0KLQ0KLSNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpDQotLyoqDQotICogQGJyaWVmICBNYW5hZ2UgdGhlIENSQyAxNi1iaXQgcmVjZWl2ZSBpbiBJbnRlcnJ1cHQgY29udGV4dC4NCi0gKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQotICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1zdGF0aWMgdm9pZCBTUElfUnhJU1JfMTZCSVRDUkMoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpIHsNCi0gIF9fSU8gdWludDMyX3QgdG1wcmVnID0gMFU7DQotDQotICAvKiBSZWFkIDE2Yml0IENSQyB0byBmbHVzaCBEYXRhIFJlZ2lzdGVyICovDQotICB0bXByZWcgPSBSRUFEX1JFRyhoc3BpLT5JbnN0YW5jZS0+RFIpOw0KLSAgLyogVG8gYXZvaWQgR0NDIHdhcm5pbmcgKi8NCi0gIFVOVVNFRCh0bXByZWcpOw0KLQ0KLSAgLyogRGlzYWJsZSBSWE5FIGFuZCBFUlIgaW50ZXJydXB0ICovDQotICBfX0hBTF9TUElfRElTQUJMRV9JVChoc3BpLCAoU1BJX0lUX1JYTkUgfCBTUElfSVRfRVJSKSk7DQotDQotICBTUElfQ2xvc2VSeF9JU1IoaHNwaSk7DQotfQ0KLSNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgTWFuYWdlIHRoZSAxNi1iaXQgcmVjZWl2ZSBpbiBJbnRlcnJ1cHQgY29udGV4dC4NCi0gKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQotICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1zdGF0aWMgdm9pZCBTUElfUnhJU1JfMTZCSVQoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpIHsNCi0gICooKHVpbnQxNl90ICopaHNwaS0+cFJ4QnVmZlB0cikgPSAodWludDE2X3QpKGhzcGktPkluc3RhbmNlLT5EUik7DQotICBoc3BpLT5wUnhCdWZmUHRyICs9IHNpemVvZih1aW50MTZfdCk7DQotICBoc3BpLT5SeFhmZXJDb3VudC0tOw0KLQ0KLSNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpDQotICAvKiBFbmFibGUgQ1JDIFRyYW5zbWlzc2lvbiAqLw0KLSAgaWYgKChoc3BpLT5SeFhmZXJDb3VudCA9PSAxVSkgJiYNCi0gICAgICAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKSkgew0KLSAgICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjEsIFNQSV9DUjFfQ1JDTkVYVCk7DQotICB9DQotI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovDQotDQotICBpZiAoaHNwaS0+UnhYZmVyQ291bnQgPT0gMFUpIHsNCi0jaWYgKFVTRV9TUElfQ1JDICE9IDBVKQ0KLSAgICBpZiAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKSB7DQotICAgICAgaHNwaS0+UnhJU1IgPSBTUElfUnhJU1JfMTZCSVRDUkM7DQotICAgICAgcmV0dXJuOw0KLSAgICB9DQotI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovDQotICAgIFNQSV9DbG9zZVJ4X0lTUihoc3BpKTsNCi0gIH0NCi19DQotDQotLyoqDQotICogQGJyaWVmICBIYW5kbGUgdGhlIGRhdGEgOC1iaXQgdHJhbnNtaXQgaW4gSW50ZXJydXB0IG1vZGUuDQotICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KLSAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuDQotICogQHJldHZhbCBOb25lDQotICovDQotc3RhdGljIHZvaWQgU1BJX1R4SVNSXzhCSVQoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpIHsNCi0gICooX19JTyB1aW50OF90ICopJmhzcGktPkluc3RhbmNlLT5EUiA9ICgqaHNwaS0+cFR4QnVmZlB0cik7DQotICBoc3BpLT5wVHhCdWZmUHRyKys7DQotICBoc3BpLT5UeFhmZXJDb3VudC0tOw0KLQ0KLSAgaWYgKGhzcGktPlR4WGZlckNvdW50ID09IDBVKSB7DQotI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkNCi0gICAgaWYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkgew0KLSAgICAgIC8qIEVuYWJsZSBDUkMgVHJhbnNtaXNzaW9uICovDQotICAgICAgU0VUX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IxLCBTUElfQ1IxX0NSQ05FWFQpOw0KLSAgICB9DQotI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovDQotICAgIFNQSV9DbG9zZVR4X0lTUihoc3BpKTsNCi0gIH0NCi19DQotDQotLyoqDQotICogQGJyaWVmICBIYW5kbGUgdGhlIGRhdGEgMTYtYml0IHRyYW5zbWl0IGluIEludGVycnVwdCBtb2RlLg0KLSAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCi0gKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXN0YXRpYyB2b2lkIFNQSV9UeElTUl8xNkJJVChzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSkgew0KLSAgLyogVHJhbnNtaXQgZGF0YSBpbiAxNiBCaXQgbW9kZSAqLw0KLSAgaHNwaS0+SW5zdGFuY2UtPkRSID0gKigodWludDE2X3QgKiloc3BpLT5wVHhCdWZmUHRyKTsNCi0gIGhzcGktPnBUeEJ1ZmZQdHIgKz0gc2l6ZW9mKHVpbnQxNl90KTsNCi0gIGhzcGktPlR4WGZlckNvdW50LS07DQotDQotICBpZiAoaHNwaS0+VHhYZmVyQ291bnQgPT0gMFUpIHsNCi0jaWYgKFVTRV9TUElfQ1JDICE9IDBVKQ0KLSAgICBpZiAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKSB7DQotICAgICAgLyogRW5hYmxlIENSQyBUcmFuc21pc3Npb24gKi8NCi0gICAgICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjEsIFNQSV9DUjFfQ1JDTkVYVCk7DQotICAgIH0NCi0jZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8NCi0gICAgU1BJX0Nsb3NlVHhfSVNSKGhzcGkpOw0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEhhbmRsZSBTUEkgQ29tbXVuaWNhdGlvbiBUaW1lb3V0Lg0KLSAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCi0gKiAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuDQotICogQHBhcmFtICBGbGFnIFNQSSBmbGFnIHRvIGNoZWNrDQotICogQHBhcmFtICBTdGF0ZSBmbGFnIHN0YXRlIHRvIGNoZWNrDQotICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24NCi0gKiBAcGFyYW0gIFRpY2tzdGFydCB0aWNrIHN0YXJ0IHZhbHVlDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNQSV9XYWl0RmxhZ1N0YXRlVW50aWxUaW1lb3V0KFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBGbGFnLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbGFnU3RhdHVzIFN0YXRlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lb3V0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaWNrc3RhcnQpIHsNCi0gIF9fSU8gdWludDMyX3QgY291bnQ7DQotICB1aW50MzJfdCB0bXBfdGltZW91dDsNCi0gIHVpbnQzMl90IHRtcF90aWNrc3RhcnQ7DQotDQotICAvKiBBZGp1c3QgVGltZW91dCB2YWx1ZSAgaW4gY2FzZSBvZiBlbmQgb2YgdHJhbnNmZXIgKi8NCi0gIHRtcF90aW1lb3V0ID0gVGltZW91dCAtIChIQUxfR2V0VGljaygpIC0gVGlja3N0YXJ0KTsNCi0gIHRtcF90aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOw0KLQ0KLSAgLyogQ2FsY3VsYXRlIFRpbWVvdXQgYmFzZWQgb24gYSBzb2Z0d2FyZSBsb29wIHRvIGF2b2lkIGJsb2NraW5nIGlzc3VlIGlmDQotICAgKiBTeXN0aWNrIGlzIGRpc2FibGVkICovDQotICBjb3VudCA9IHRtcF90aW1lb3V0ICogKChTeXN0ZW1Db3JlQ2xvY2sgKiAzMlUpID4+IDIwVSk7DQotDQotICB3aGlsZSAoKF9fSEFMX1NQSV9HRVRfRkxBRyhoc3BpLCBGbGFnKSA/IFNFVCA6IFJFU0VUKSAhPSBTdGF0ZSkgew0KLSAgICBpZiAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKSB7DQotICAgICAgaWYgKCgoSEFMX0dldFRpY2soKSAtIHRtcF90aWNrc3RhcnQpID49IHRtcF90aW1lb3V0KSB8fA0KLSAgICAgICAgICAodG1wX3RpbWVvdXQgPT0gMFUpKSB7DQotICAgICAgICAvKiBEaXNhYmxlIHRoZSBTUEkgYW5kIHJlc2V0IHRoZSBDUkM6IHRoZSBDUkMgdmFsdWUgc2hvdWxkIGJlIGNsZWFyZWQNCi0gICAgICAgICAgIG9uIGJvdGggbWFzdGVyIGFuZCBzbGF2ZSBzaWRlcyBpbiBvcmRlciB0byByZXN5bmNocm9uaXplIHRoZSBtYXN0ZXINCi0gICAgICAgICAgIGFuZCBzbGF2ZSBmb3IgdGhlaXIgcmVzcGVjdGl2ZSBDUkMgY2FsY3VsYXRpb24gKi8NCi0NCi0gICAgICAgIC8qIERpc2FibGUgVFhFLCBSWE5FIGFuZCBFUlIgaW50ZXJydXB0cyBmb3IgdGhlIGludGVycnVwdCBwcm9jZXNzICovDQotICAgICAgICBfX0hBTF9TUElfRElTQUJMRV9JVChoc3BpLCAoU1BJX0lUX1RYRSB8IFNQSV9JVF9SWE5FIHwgU1BJX0lUX0VSUikpOw0KLQ0KLSAgICAgICAgaWYgKChoc3BpLT5Jbml0Lk1vZGUgPT0gU1BJX01PREVfTUFTVEVSKSAmJg0KLSAgICAgICAgICAgICgoaHNwaS0+SW5pdC5EaXJlY3Rpb24gPT0gU1BJX0RJUkVDVElPTl8xTElORSkgfHwNCi0gICAgICAgICAgICAgKGhzcGktPkluaXQuRGlyZWN0aW9uID09IFNQSV9ESVJFQ1RJT05fMkxJTkVTX1JYT05MWSkpKSB7DQotICAgICAgICAgIC8qIERpc2FibGUgU1BJIHBlcmlwaGVyYWwgKi8NCi0gICAgICAgICAgX19IQUxfU1BJX0RJU0FCTEUoaHNwaSk7DQotICAgICAgICB9DQotDQotICAgICAgICAvKiBSZXNldCBDUkMgQ2FsY3VsYXRpb24gKi8NCi0gICAgICAgIGlmIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpIHsNCi0gICAgICAgICAgU1BJX1JFU0VUX0NSQyhoc3BpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9SRUFEWTsNCi0NCi0gICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8NCi0gICAgICAgIF9fSEFMX1VOTE9DSyhoc3BpKTsNCi0NCi0gICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsNCi0gICAgICB9DQotICAgICAgLyogSWYgU3lzdGljayBpcyBkaXNhYmxlZCBvciBub3QgaW5jcmVtZW50ZWQsIGRlYWN0aXZhdGUgdGltZW91dCB0byBnbyBpbg0KLSAgICAgICAqIGRpc2FibGUgbG9vcCBwcm9jZWR1cmUgKi8NCi0gICAgICBpZiAoY291bnQgPT0gMFUpIHsNCi0gICAgICAgIHRtcF90aW1lb3V0ID0gMFU7DQotICAgICAgfQ0KLSAgICAgIGNvdW50LS07DQotICAgIH0NCi0gIH0NCi0NCi0gIHJldHVybiBIQUxfT0s7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSGFuZGxlIFNQSSBGSUZPIENvbW11bmljYXRpb24gVGltZW91dC4NCi0gKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQotICogICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLg0KLSAqIEBwYXJhbSAgRmlmbyBGaWZvIHRvIGNoZWNrDQotICogQHBhcmFtICBTdGF0ZSBGaWZvIHN0YXRlIHRvIGNoZWNrDQotICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24NCi0gKiBAcGFyYW0gIFRpY2tzdGFydCB0aWNrIHN0YXJ0IHZhbHVlDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNQSV9XYWl0Rmlmb1N0YXRlVW50aWxUaW1lb3V0KFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBGaWZvLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBTdGF0ZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZW91dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGlja3N0YXJ0KSB7DQotICBfX0lPIHVpbnQzMl90IGNvdW50Ow0KLSAgdWludDMyX3QgdG1wX3RpbWVvdXQ7DQotICB1aW50MzJfdCB0bXBfdGlja3N0YXJ0Ow0KLSAgX19JTyB1aW50OF90ICpwdG1wcmVnODsNCi0gIF9fSU8gdWludDhfdCB0bXByZWc4ID0gMDsNCi0NCi0gIC8qIEFkanVzdCBUaW1lb3V0IHZhbHVlICBpbiBjYXNlIG9mIGVuZCBvZiB0cmFuc2ZlciAqLw0KLSAgdG1wX3RpbWVvdXQgPSBUaW1lb3V0IC0gKEhBTF9HZXRUaWNrKCkgLSBUaWNrc3RhcnQpOw0KLSAgdG1wX3RpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7DQotDQotICAvKiBJbml0aWFsaXplIHRoZSA4Yml0IHRlbXBvcmFyeSBwb2ludGVyICovDQotICBwdG1wcmVnOCA9IChfX0lPIHVpbnQ4X3QgKikmaHNwaS0+SW5zdGFuY2UtPkRSOw0KLQ0KLSAgLyogQ2FsY3VsYXRlIFRpbWVvdXQgYmFzZWQgb24gYSBzb2Z0d2FyZSBsb29wIHRvIGF2b2lkIGJsb2NraW5nIGlzc3VlIGlmDQotICAgKiBTeXN0aWNrIGlzIGRpc2FibGVkICovDQotICBjb3VudCA9IHRtcF90aW1lb3V0ICogKChTeXN0ZW1Db3JlQ2xvY2sgKiAzNVUpID4+IDIwVSk7DQotDQotICB3aGlsZSAoKGhzcGktPkluc3RhbmNlLT5TUiAmIEZpZm8pICE9IFN0YXRlKSB7DQotICAgIGlmICgoRmlmbyA9PSBTUElfU1JfRlJMVkwpICYmIChTdGF0ZSA9PSBTUElfRlJMVkxfRU1QVFkpKSB7DQotICAgICAgLyogRmx1c2ggRGF0YSBSZWdpc3RlciBieSBhIGJsYW5rIHJlYWQgKi8NCi0gICAgICB0bXByZWc4ID0gKnB0bXByZWc4Ow0KLSAgICAgIC8qIFRvIGF2b2lkIEdDQyB3YXJuaW5nICovDQotICAgICAgVU5VU0VEKHRtcHJlZzgpOw0KLSAgICB9DQotDQotICAgIGlmIChUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpIHsNCi0gICAgICBpZiAoKChIQUxfR2V0VGljaygpIC0gdG1wX3RpY2tzdGFydCkgPj0gdG1wX3RpbWVvdXQpIHx8DQotICAgICAgICAgICh0bXBfdGltZW91dCA9PSAwVSkpIHsNCi0gICAgICAgIC8qIERpc2FibGUgdGhlIFNQSSBhbmQgcmVzZXQgdGhlIENSQzogdGhlIENSQyB2YWx1ZSBzaG91bGQgYmUgY2xlYXJlZA0KLSAgICAgICAgICAgb24gYm90aCBtYXN0ZXIgYW5kIHNsYXZlIHNpZGVzIGluIG9yZGVyIHRvIHJlc3luY2hyb25pemUgdGhlIG1hc3Rlcg0KLSAgICAgICAgICAgYW5kIHNsYXZlIGZvciB0aGVpciByZXNwZWN0aXZlIENSQyBjYWxjdWxhdGlvbiAqLw0KLQ0KLSAgICAgICAgLyogRGlzYWJsZSBUWEUsIFJYTkUgYW5kIEVSUiBpbnRlcnJ1cHRzIGZvciB0aGUgaW50ZXJydXB0IHByb2Nlc3MgKi8NCi0gICAgICAgIF9fSEFMX1NQSV9ESVNBQkxFX0lUKGhzcGksIChTUElfSVRfVFhFIHwgU1BJX0lUX1JYTkUgfCBTUElfSVRfRVJSKSk7DQotDQotICAgICAgICBpZiAoKGhzcGktPkluaXQuTW9kZSA9PSBTUElfTU9ERV9NQVNURVIpICYmDQotICAgICAgICAgICAgKChoc3BpLT5Jbml0LkRpcmVjdGlvbiA9PSBTUElfRElSRUNUSU9OXzFMSU5FKSB8fA0KLSAgICAgICAgICAgICAoaHNwaS0+SW5pdC5EaXJlY3Rpb24gPT0gU1BJX0RJUkVDVElPTl8yTElORVNfUlhPTkxZKSkpIHsNCi0gICAgICAgICAgLyogRGlzYWJsZSBTUEkgcGVyaXBoZXJhbCAqLw0KLSAgICAgICAgICBfX0hBTF9TUElfRElTQUJMRShoc3BpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qIFJlc2V0IENSQyBDYWxjdWxhdGlvbiAqLw0KLSAgICAgICAgaWYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkgew0KLSAgICAgICAgICBTUElfUkVTRVRfQ1JDKGhzcGkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX1JFQURZOw0KLQ0KLSAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLw0KLSAgICAgICAgX19IQUxfVU5MT0NLKGhzcGkpOw0KLQ0KLSAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOw0KLSAgICAgIH0NCi0gICAgICAvKiBJZiBTeXN0aWNrIGlzIGRpc2FibGVkIG9yIG5vdCBpbmNyZW1lbnRlZCwgZGVhY3RpdmF0ZSB0aW1lb3V0IHRvIGdvIGluDQotICAgICAgICogZGlzYWJsZSBsb29wIHByb2NlZHVyZSAqLw0KLSAgICAgIGlmIChjb3VudCA9PSAwVSkgew0KLSAgICAgICAgdG1wX3RpbWVvdXQgPSAwVTsNCi0gICAgICB9DQotICAgICAgY291bnQtLTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBIYW5kbGUgdGhlIGNoZWNrIG9mIHRoZSBSWCB0cmFuc2FjdGlvbiBjb21wbGV0ZS4NCi0gKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQotICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4NCi0gKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbg0KLSAqIEBwYXJhbSAgVGlja3N0YXJ0IHRpY2sgc3RhcnQgdmFsdWUNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1zdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU1BJX0VuZFJ4VHJhbnNhY3Rpb24oU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVvdXQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpY2tzdGFydCkgew0KLSAgaWYgKChoc3BpLT5Jbml0Lk1vZGUgPT0gU1BJX01PREVfTUFTVEVSKSAmJg0KLSAgICAgICgoaHNwaS0+SW5pdC5EaXJlY3Rpb24gPT0gU1BJX0RJUkVDVElPTl8xTElORSkgfHwNCi0gICAgICAgKGhzcGktPkluaXQuRGlyZWN0aW9uID09IFNQSV9ESVJFQ1RJT05fMkxJTkVTX1JYT05MWSkpKSB7DQotICAgIC8qIERpc2FibGUgU1BJIHBlcmlwaGVyYWwgKi8NCi0gICAgX19IQUxfU1BJX0RJU0FCTEUoaHNwaSk7DQotICB9DQotDQotICAvKiBDb250cm9sIHRoZSBCU1kgZmxhZyAqLw0KLSAgaWYgKFNQSV9XYWl0RmxhZ1N0YXRlVW50aWxUaW1lb3V0KGhzcGksIFNQSV9GTEFHX0JTWSwgUkVTRVQsIFRpbWVvdXQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja3N0YXJ0KSAhPSBIQUxfT0spIHsNCi0gICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfRkxBRyk7DQotICAgIHJldHVybiBIQUxfVElNRU9VVDsNCi0gIH0NCi0NCi0gIGlmICgoaHNwaS0+SW5pdC5Nb2RlID09IFNQSV9NT0RFX01BU1RFUikgJiYNCi0gICAgICAoKGhzcGktPkluaXQuRGlyZWN0aW9uID09IFNQSV9ESVJFQ1RJT05fMUxJTkUpIHx8DQotICAgICAgIChoc3BpLT5Jbml0LkRpcmVjdGlvbiA9PSBTUElfRElSRUNUSU9OXzJMSU5FU19SWE9OTFkpKSkgew0KLSAgICAvKiBFbXB0eSB0aGUgRlJMVkwgZmlmbyAqLw0KLSAgICBpZiAoU1BJX1dhaXRGaWZvU3RhdGVVbnRpbFRpbWVvdXQoaHNwaSwgU1BJX0ZMQUdfRlJMVkwsIFNQSV9GUkxWTF9FTVBUWSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVvdXQsIFRpY2tzdGFydCkgIT0gSEFMX09LKSB7DQotICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfRkxBRyk7DQotICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOw0KLSAgICB9DQotICB9DQotICByZXR1cm4gSEFMX09LOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEhhbmRsZSB0aGUgY2hlY2sgb2YgdGhlIFJYVFggb3IgVFggdHJhbnNhY3Rpb24gY29tcGxldGUuDQotICogQHBhcmFtICBoc3BpIFNQSSBoYW5kbGUNCi0gKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbg0KLSAqIEBwYXJhbSAgVGlja3N0YXJ0IHRpY2sgc3RhcnQgdmFsdWUNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1zdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU1BJX0VuZFJ4VHhUcmFuc2FjdGlvbihTUElfSGFuZGxlVHlwZURlZiAqaHNwaSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lb3V0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpY2tzdGFydCkgew0KLSAgLyogQ29udHJvbCBpZiB0aGUgVFggZmlmbyBpcyBlbXB0eSAqLw0KLSAgaWYgKFNQSV9XYWl0Rmlmb1N0YXRlVW50aWxUaW1lb3V0KGhzcGksIFNQSV9GTEFHX0ZUTFZMLCBTUElfRlRMVkxfRU1QVFksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZW91dCwgVGlja3N0YXJ0KSAhPSBIQUxfT0spIHsNCi0gICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfRkxBRyk7DQotICAgIHJldHVybiBIQUxfVElNRU9VVDsNCi0gIH0NCi0NCi0gIC8qIENvbnRyb2wgdGhlIEJTWSBmbGFnICovDQotICBpZiAoU1BJX1dhaXRGbGFnU3RhdGVVbnRpbFRpbWVvdXQoaHNwaSwgU1BJX0ZMQUdfQlNZLCBSRVNFVCwgVGltZW91dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrc3RhcnQpICE9IEhBTF9PSykgew0KLSAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9GTEFHKTsNCi0gICAgcmV0dXJuIEhBTF9USU1FT1VUOw0KLSAgfQ0KLQ0KLSAgLyogQ29udHJvbCBpZiB0aGUgUlggZmlmbyBpcyBlbXB0eSAqLw0KLSAgaWYgKFNQSV9XYWl0Rmlmb1N0YXRlVW50aWxUaW1lb3V0KGhzcGksIFNQSV9GTEFHX0ZSTFZMLCBTUElfRlJMVkxfRU1QVFksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZW91dCwgVGlja3N0YXJ0KSAhPSBIQUxfT0spIHsNCi0gICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfRkxBRyk7DQotICAgIHJldHVybiBIQUxfVElNRU9VVDsNCi0gIH0NCi0NCi0gIHJldHVybiBIQUxfT0s7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSGFuZGxlIHRoZSBlbmQgb2YgdGhlIFJYVFggdHJhbnNhY3Rpb24uDQotICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KLSAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuDQotICogQHJldHZhbCBOb25lDQotICovDQotc3RhdGljIHZvaWQgU1BJX0Nsb3NlUnhUeF9JU1IoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpIHsNCi0gIHVpbnQzMl90IHRpY2tzdGFydDsNCi0NCi0gIC8qIEluaXQgdGlja3N0YXJ0IGZvciB0aW1lb3V0IG1hbmFnZW1lbnQgKi8NCi0gIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7DQotDQotICAvKiBEaXNhYmxlIEVSUiBpbnRlcnJ1cHQgKi8NCi0gIF9fSEFMX1NQSV9ESVNBQkxFX0lUKGhzcGksIFNQSV9JVF9FUlIpOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIGVuZCBvZiB0aGUgdHJhbnNhY3Rpb24gKi8NCi0gIGlmIChTUElfRW5kUnhUeFRyYW5zYWN0aW9uKGhzcGksIFNQSV9ERUZBVUxUX1RJTUVPVVQsIHRpY2tzdGFydCkgIT0gSEFMX09LKSB7DQotICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0ZMQUcpOw0KLSAgfQ0KLQ0KLSNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpDQotICAvKiBDaGVjayBpZiBDUkMgZXJyb3Igb2NjdXJyZWQgKi8NCi0gIGlmIChfX0hBTF9TUElfR0VUX0ZMQUcoaHNwaSwgU1BJX0ZMQUdfQ1JDRVJSKSAhPSBSRVNFVCkgew0KLSAgICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfUkVBRFk7DQotICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0NSQyk7DQotICAgIF9fSEFMX1NQSV9DTEVBUl9DUkNFUlJGTEFHKGhzcGkpOw0KLSAgICAvKiBDYWxsIHVzZXIgZXJyb3IgY2FsbGJhY2sgKi8NCi0jaWYgKFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkNCi0gICAgaHNwaS0+RXJyb3JDYWxsYmFjayhoc3BpKTsNCi0jZWxzZQ0KLSAgICBIQUxfU1BJX0Vycm9yQ2FsbGJhY2soaHNwaSk7DQotI2VuZGlmIC8qIFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLSAgfSBlbHNlIHsNCi0jZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8NCi0gICAgaWYgKGhzcGktPkVycm9yQ29kZSA9PSBIQUxfU1BJX0VSUk9SX05PTkUpIHsNCi0gICAgICBpZiAoaHNwaS0+U3RhdGUgPT0gSEFMX1NQSV9TVEFURV9CVVNZX1JYKSB7DQotICAgICAgICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfUkVBRFk7DQotICAgICAgICAvKiBDYWxsIHVzZXIgUnggY29tcGxldGUgY2FsbGJhY2sgKi8NCi0jaWYgKFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkNCi0gICAgICAgIGhzcGktPlJ4Q3BsdENhbGxiYWNrKGhzcGkpOw0KLSNlbHNlDQotICAgICAgSEFMX1NQSV9SeENwbHRDYWxsYmFjayhoc3BpKTsNCi0jZW5kaWYgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9SRUFEWTsNCi0gICAgICAgIC8qIENhbGwgdXNlciBUeFJ4IGNvbXBsZXRlIGNhbGxiYWNrICovDQotI2lmIChVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpDQotICAgICAgICBoc3BpLT5UeFJ4Q3BsdENhbGxiYWNrKGhzcGkpOw0KLSNlbHNlDQotICAgICAgSEFMX1NQSV9UeFJ4Q3BsdENhbGxiYWNrKGhzcGkpOw0KLSNlbmRpZiAvKiBVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi0gICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX1JFQURZOw0KLSAgICAgIC8qIENhbGwgdXNlciBlcnJvciBjYWxsYmFjayAqLw0KLSNpZiAoVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQ0KLSAgICAgIGhzcGktPkVycm9yQ2FsbGJhY2soaHNwaSk7DQotI2Vsc2UNCi0gICAgSEFMX1NQSV9FcnJvckNhbGxiYWNrKGhzcGkpOw0KLSNlbmRpZiAvKiBVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi0gICAgfQ0KLSNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpDQotICB9DQotI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovDQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSGFuZGxlIHRoZSBlbmQgb2YgdGhlIFJYIHRyYW5zYWN0aW9uLg0KLSAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCi0gKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXN0YXRpYyB2b2lkIFNQSV9DbG9zZVJ4X0lTUihTUElfSGFuZGxlVHlwZURlZiAqaHNwaSkgew0KLSAgLyogRGlzYWJsZSBSWE5FIGFuZCBFUlIgaW50ZXJydXB0ICovDQotICBfX0hBTF9TUElfRElTQUJMRV9JVChoc3BpLCAoU1BJX0lUX1JYTkUgfCBTUElfSVRfRVJSKSk7DQotDQotICAvKiBDaGVjayB0aGUgZW5kIG9mIHRoZSB0cmFuc2FjdGlvbiAqLw0KLSAgaWYgKFNQSV9FbmRSeFRyYW5zYWN0aW9uKGhzcGksIFNQSV9ERUZBVUxUX1RJTUVPVVQsIEhBTF9HZXRUaWNrKCkpICE9DQotICAgICAgSEFMX09LKSB7DQotICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0ZMQUcpOw0KLSAgfQ0KLSAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX1JFQURZOw0KLQ0KLSNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpDQotICAvKiBDaGVjayBpZiBDUkMgZXJyb3Igb2NjdXJyZWQgKi8NCi0gIGlmIChfX0hBTF9TUElfR0VUX0ZMQUcoaHNwaSwgU1BJX0ZMQUdfQ1JDRVJSKSAhPSBSRVNFVCkgew0KLSAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9DUkMpOw0KLSAgICBfX0hBTF9TUElfQ0xFQVJfQ1JDRVJSRkxBRyhoc3BpKTsNCi0gICAgLyogQ2FsbCB1c2VyIGVycm9yIGNhbGxiYWNrICovDQotI2lmIChVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpDQotICAgIGhzcGktPkVycm9yQ2FsbGJhY2soaHNwaSk7DQotI2Vsc2UNCi0gICAgSEFMX1NQSV9FcnJvckNhbGxiYWNrKGhzcGkpOw0KLSNlbmRpZiAvKiBVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi0gIH0gZWxzZSB7DQotI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovDQotICAgIGlmIChoc3BpLT5FcnJvckNvZGUgPT0gSEFMX1NQSV9FUlJPUl9OT05FKSB7DQotICAgICAgLyogQ2FsbCB1c2VyIFJ4IGNvbXBsZXRlIGNhbGxiYWNrICovDQotI2lmIChVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpDQotICAgICAgaHNwaS0+UnhDcGx0Q2FsbGJhY2soaHNwaSk7DQotI2Vsc2UNCi0gICAgSEFMX1NQSV9SeENwbHRDYWxsYmFjayhoc3BpKTsNCi0jZW5kaWYgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotICAgIH0gZWxzZSB7DQotICAgICAgLyogQ2FsbCB1c2VyIGVycm9yIGNhbGxiYWNrICovDQotI2lmIChVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpDQotICAgICAgaHNwaS0+RXJyb3JDYWxsYmFjayhoc3BpKTsNCi0jZWxzZQ0KLSAgICBIQUxfU1BJX0Vycm9yQ2FsbGJhY2soaHNwaSk7DQotI2VuZGlmIC8qIFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLSAgICB9DQotI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkNCi0gIH0NCi0jZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8NCi19DQotDQotLyoqDQotICogQGJyaWVmICBIYW5kbGUgdGhlIGVuZCBvZiB0aGUgVFggdHJhbnNhY3Rpb24uDQotICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KLSAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuDQotICogQHJldHZhbCBOb25lDQotICovDQotc3RhdGljIHZvaWQgU1BJX0Nsb3NlVHhfSVNSKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKSB7DQotICB1aW50MzJfdCB0aWNrc3RhcnQ7DQotDQotICAvKiBJbml0IHRpY2tzdGFydCBmb3IgdGltZW91dCBtYW5hZ2VtZW50Ki8NCi0gIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7DQotDQotICAvKiBEaXNhYmxlIFRYRSBhbmQgRVJSIGludGVycnVwdCAqLw0KLSAgX19IQUxfU1BJX0RJU0FCTEVfSVQoaHNwaSwgKFNQSV9JVF9UWEUgfCBTUElfSVRfRVJSKSk7DQotDQotICAvKiBDaGVjayB0aGUgZW5kIG9mIHRoZSB0cmFuc2FjdGlvbiAqLw0KLSAgaWYgKFNQSV9FbmRSeFR4VHJhbnNhY3Rpb24oaHNwaSwgU1BJX0RFRkFVTFRfVElNRU9VVCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spIHsNCi0gICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfRkxBRyk7DQotICB9DQotDQotICAvKiBDbGVhciBvdmVycnVuIGZsYWcgaW4gMiBMaW5lcyBjb21tdW5pY2F0aW9uIG1vZGUgYmVjYXVzZSByZWNlaXZlZCBpcyBub3QNCi0gICAqIHJlYWQgKi8NCi0gIGlmIChoc3BpLT5Jbml0LkRpcmVjdGlvbiA9PSBTUElfRElSRUNUSU9OXzJMSU5FUykgew0KLSAgICBfX0hBTF9TUElfQ0xFQVJfT1ZSRkxBRyhoc3BpKTsNCi0gIH0NCi0NCi0gIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9SRUFEWTsNCi0gIGlmIChoc3BpLT5FcnJvckNvZGUgIT0gSEFMX1NQSV9FUlJPUl9OT05FKSB7DQotICAgIC8qIENhbGwgdXNlciBlcnJvciBjYWxsYmFjayAqLw0KLSNpZiAoVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQ0KLSAgICBoc3BpLT5FcnJvckNhbGxiYWNrKGhzcGkpOw0KLSNlbHNlDQotICAgIEhBTF9TUElfRXJyb3JDYWxsYmFjayhoc3BpKTsNCi0jZW5kaWYgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotICB9IGVsc2Ugew0KLSAgICAvKiBDYWxsIHVzZXIgUnggY29tcGxldGUgY2FsbGJhY2sgKi8NCi0jaWYgKFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkNCi0gICAgaHNwaS0+VHhDcGx0Q2FsbGJhY2soaHNwaSk7DQotI2Vsc2UNCi0gICAgSEFMX1NQSV9UeENwbHRDYWxsYmFjayhoc3BpKTsNCi0jZW5kaWYgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotICB9DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSGFuZGxlIGFib3J0IGEgUnggdHJhbnNhY3Rpb24uDQotICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KLSAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuDQotICogQHJldHZhbCBOb25lDQotICovDQotc3RhdGljIHZvaWQgU1BJX0Fib3J0UnhfSVNSKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKSB7DQotICBfX0lPIHVpbnQzMl90IGNvdW50Ow0KLQ0KLSAgLyogRGlzYWJsZSBTUEkgUGVyaXBoZXJhbCAqLw0KLSAgX19IQUxfU1BJX0RJU0FCTEUoaHNwaSk7DQotDQotICBjb3VudCA9IFNQSV9ERUZBVUxUX1RJTUVPVVQgKiAoU3lzdGVtQ29yZUNsb2NrIC8gMjRVIC8gMTAwMFUpOw0KLQ0KLSAgLyogRGlzYWJsZSBSWE5FSUUgaW50ZXJydXB0ICovDQotICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgKFNQSV9DUjJfUlhORUlFKSk7DQotDQotICAvKiBDaGVjayBSWE5FSUUgaXMgZGlzYWJsZWQgKi8NCi0gIGRvIHsNCi0gICAgaWYgKGNvdW50ID09IDBVKSB7DQotICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfQUJPUlQpOw0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotICAgIGNvdW50LS07DQotICB9IHdoaWxlIChIQUxfSVNfQklUX1NFVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1JYTkVJRSkpOw0KLQ0KLSAgLyogQ29udHJvbCB0aGUgQlNZIGZsYWcgKi8NCi0gIGlmIChTUElfV2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChoc3BpLCBTUElfRkxBR19CU1ksIFJFU0VULA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQSV9ERUZBVUxUX1RJTUVPVVQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0dldFRpY2soKSkgIT0gSEFMX09LKSB7DQotICAgIGhzcGktPkVycm9yQ29kZSA9IEhBTF9TUElfRVJST1JfQUJPUlQ7DQotICB9DQotDQotICAvKiBFbXB0eSB0aGUgRlJMVkwgZmlmbyAqLw0KLSAgaWYgKFNQSV9XYWl0Rmlmb1N0YXRlVW50aWxUaW1lb3V0KGhzcGksIFNQSV9GTEFHX0ZSTFZMLCBTUElfRlJMVkxfRU1QVFksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BJX0RFRkFVTFRfVElNRU9VVCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfR2V0VGljaygpKSAhPSBIQUxfT0spIHsNCi0gICAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9BQk9SVDsNCi0gIH0NCi0NCi0gIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9BQk9SVDsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBIYW5kbGUgYWJvcnQgYSBUeCBvciBSeC9UeCB0cmFuc2FjdGlvbi4NCi0gKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQotICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1zdGF0aWMgdm9pZCBTUElfQWJvcnRUeF9JU1IoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpIHsNCi0gIF9fSU8gdWludDMyX3QgY291bnQ7DQotDQotICBjb3VudCA9IFNQSV9ERUZBVUxUX1RJTUVPVVQgKiAoU3lzdGVtQ29yZUNsb2NrIC8gMjRVIC8gMTAwMFUpOw0KLQ0KLSAgLyogRGlzYWJsZSBUWEVJRSBpbnRlcnJ1cHQgKi8NCi0gIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCAoU1BJX0NSMl9UWEVJRSkpOw0KLQ0KLSAgLyogQ2hlY2sgVFhFSUUgaXMgZGlzYWJsZWQgKi8NCi0gIGRvIHsNCi0gICAgaWYgKGNvdW50ID09IDBVKSB7DQotICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfQUJPUlQpOw0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotICAgIGNvdW50LS07DQotICB9IHdoaWxlIChIQUxfSVNfQklUX1NFVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1RYRUlFKSk7DQotDQotICBpZiAoU1BJX0VuZFJ4VHhUcmFuc2FjdGlvbihoc3BpLCBTUElfREVGQVVMVF9USU1FT1VULCBIQUxfR2V0VGljaygpKSAhPQ0KLSAgICAgIEhBTF9PSykgew0KLSAgICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX0FCT1JUOw0KLSAgfQ0KLQ0KLSAgLyogRGlzYWJsZSBTUEkgUGVyaXBoZXJhbCAqLw0KLSAgX19IQUxfU1BJX0RJU0FCTEUoaHNwaSk7DQotDQotICAvKiBFbXB0eSB0aGUgRlJMVkwgZmlmbyAqLw0KLSAgaWYgKFNQSV9XYWl0Rmlmb1N0YXRlVW50aWxUaW1lb3V0KGhzcGksIFNQSV9GTEFHX0ZSTFZMLCBTUElfRlJMVkxfRU1QVFksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BJX0RFRkFVTFRfVElNRU9VVCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfR2V0VGljaygpKSAhPSBIQUxfT0spIHsNCi0gICAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9BQk9SVDsNCi0gIH0NCi0NCi0gIC8qIENoZWNrIGNhc2Ugb2YgRnVsbC1EdXBsZXggTW9kZSBhbmQgZGlzYWJsZSBkaXJlY3RseSBSWE5FSUUgaW50ZXJydXB0ICovDQotICBpZiAoSEFMX0lTX0JJVF9TRVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9SWE5FSUUpKSB7DQotICAgIC8qIERpc2FibGUgUlhORUlFIGludGVycnVwdCAqLw0KLSAgICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgKFNQSV9DUjJfUlhORUlFKSk7DQotDQotICAgIC8qIENoZWNrIFJYTkVJRSBpcyBkaXNhYmxlZCAqLw0KLSAgICBkbyB7DQotICAgICAgaWYgKGNvdW50ID09IDBVKSB7DQotICAgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9BQk9SVCk7DQotICAgICAgICBicmVhazsNCi0gICAgICB9DQotICAgICAgY291bnQtLTsNCi0gICAgfSB3aGlsZSAoSEFMX0lTX0JJVF9TRVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9SWE5FSUUpKTsNCi0NCi0gICAgLyogQ29udHJvbCB0aGUgQlNZIGZsYWcgKi8NCi0gICAgaWYgKFNQSV9XYWl0RmxhZ1N0YXRlVW50aWxUaW1lb3V0KGhzcGksIFNQSV9GTEFHX0JTWSwgUkVTRVQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUElfREVGQVVMVF9USU1FT1VULA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0dldFRpY2soKSkgIT0gSEFMX09LKSB7DQotICAgICAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9BQk9SVDsNCi0gICAgfQ0KLQ0KLSAgICAvKiBFbXB0eSB0aGUgRlJMVkwgZmlmbyAqLw0KLSAgICBpZiAoU1BJX1dhaXRGaWZvU3RhdGVVbnRpbFRpbWVvdXQoaHNwaSwgU1BJX0ZMQUdfRlJMVkwsIFNQSV9GUkxWTF9FTVBUWSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQSV9ERUZBVUxUX1RJTUVPVVQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfR2V0VGljaygpKSAhPSBIQUxfT0spIHsNCi0gICAgICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX0FCT1JUOw0KLSAgICB9DQotICB9DQotICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfQUJPUlQ7DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotI2VuZGlmIC8qIEhBTF9TUElfTU9EVUxFX0VOQUJMRUQgKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZzR4eF9oYWxfc3BpLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIFNQSSBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBTZXJpYWwgUGVyaXBoZXJhbCBJbnRlcmZhY2UgKFNQSSkKKyAgcGVyaXBoZXJhbDoKKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucworICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRlcm1zIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUKKyAgKiBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb2Z0d2FyZSBjb21wb25lbnQuCisgICogSWYgbm8gTElDRU5TRSBmaWxlIGNvbWVzIHdpdGggdGhpcyBzb2Z0d2FyZSwgaXQgaXMgcHJvdmlkZWQgQVMtSVMuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgVGhlIFNQSSBIQUwgZHJpdmVyIGNhbiBiZSB1c2VkIGFzIGZvbGxvd3M6CisKKyAgICAgICgjKSBEZWNsYXJlIGEgU1BJX0hhbmRsZVR5cGVEZWYgaGFuZGxlIHN0cnVjdHVyZSwgZm9yIGV4YW1wbGU6CisgICAgICAgICAgU1BJX0hhbmRsZVR5cGVEZWYgIGhzcGk7CisKKyAgICAgICgjKUluaXRpYWxpemUgdGhlIFNQSSBsb3cgbGV2ZWwgcmVzb3VyY2VzIGJ5IGltcGxlbWVudGluZyB0aGUKKyAgSEFMX1NQSV9Nc3BJbml0KCkgQVBJOgorICAgICAgICAgICgjIykgRW5hYmxlIHRoZSBTUEl4IGludGVyZmFjZSBjbG9jaworICAgICAgICAgICgjIykgU1BJIHBpbnMgY29uZmlndXJhdGlvbgorICAgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIGNsb2NrIGZvciB0aGUgU1BJIEdQSU9zCisgICAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGVzZSBTUEkgcGlucyBhcyBhbHRlcm5hdGUgZnVuY3Rpb24gcHVzaC1wdWxsCisgICAgICAgICAgKCMjKSBOVklDIGNvbmZpZ3VyYXRpb24gaWYgeW91IG5lZWQgdG8gdXNlIGludGVycnVwdCBwcm9jZXNzCisgICAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgU1BJeCBpbnRlcnJ1cHQgcHJpb3JpdHkKKyAgICAgICAgICAgICAgKCsrKykgRW5hYmxlIHRoZSBOVklDIFNQSSBJUlEgaGFuZGxlCisgICAgICAgICAgKCMjKSBETUEgQ29uZmlndXJhdGlvbiBpZiB5b3UgbmVlZCB0byB1c2UgRE1BIHByb2Nlc3MKKyAgICAgICAgICAgICAgKCsrKykgRGVjbGFyZSBhIERNQV9IYW5kbGVUeXBlRGVmIGhhbmRsZSBzdHJ1Y3R1cmUgZm9yIHRoZQorICB0cmFuc21pdCBvciByZWNlaXZlIFN0cmVhbS9DaGFubmVsCisgICAgICAgICAgICAgICgrKyspIEVuYWJsZSB0aGUgRE1BeCBjbG9jaworICAgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIERNQSBoYW5kbGUgcGFyYW1ldGVycworICAgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIERNQSBUeCBvciBSeCBTdHJlYW0vQ2hhbm5lbAorICAgICAgICAgICAgICAoKysrKSBBc3NvY2lhdGUgdGhlIGluaXRpYWxpemVkIGhkbWFfdHgob3IgX3J4KSAgaGFuZGxlIHRvIHRoZQorICBoc3BpIERNQSBUeCBvciBSeCBoYW5kbGUKKyAgICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZSBwcmlvcml0eSBhbmQgZW5hYmxlIHRoZSBOVklDIGZvciB0aGUgdHJhbnNmZXIKKyAgY29tcGxldGUgaW50ZXJydXB0IG9uIHRoZSBETUEgVHggb3IgUnggU3RyZWFtL0NoYW5uZWwKKworICAgICAgKCMpIFByb2dyYW0gdGhlIE1vZGUsIEJpZGlyZWN0aW9uYWxNb2RlICwgRGF0YSBzaXplLCBCYXVkcmF0ZSBQcmVzY2FsZXIsCisgIE5TUyBtYW5hZ2VtZW50LCBDbG9jayBwb2xhcml0eSBhbmQgcGhhc2UsIEZpcnN0Qml0IGFuZCBDUkMgY29uZmlndXJhdGlvbiBpbgorICB0aGUgaHNwaSBJbml0IHN0cnVjdHVyZS4KKworICAgICAgKCMpIEluaXRpYWxpemUgdGhlIFNQSSByZWdpc3RlcnMgYnkgY2FsbGluZyB0aGUgSEFMX1NQSV9Jbml0KCkgQVBJOgorICAgICAgICAgICgrKykgVGhpcyBBUEkgY29uZmlndXJlcyBhbHNvIHRoZSBsb3cgbGV2ZWwgSGFyZHdhcmUgR1BJTywgQ0xPQ0ssCisgIENPUlRFWC4uLmV0YykgYnkgY2FsbGluZyB0aGUgY3VzdG9taXplZCBIQUxfU1BJX01zcEluaXQoKSBBUEkuCisgICAgIFsuLl0KKyAgICAgICBDaXJjdWxhciBtb2RlIHJlc3RyaWN0aW9uOgorICAgICAgKCMpIFRoZSBETUEgY2lyY3VsYXIgbW9kZSBjYW5ub3QgYmUgdXNlZCB3aGVuIHRoZSBTUEkgaXMgY29uZmlndXJlZCBpbgorICB0aGVzZSBtb2RlczoKKyAgICAgICAgICAoIyMpIE1hc3RlciAyTGluZXMgUnhPbmx5CisgICAgICAgICAgKCMjKSBNYXN0ZXIgMUxpbmUgUngKKyAgICAgICgjKSBUaGUgQ1JDIGZlYXR1cmUgaXMgbm90IG1hbmFnZWQgd2hlbiB0aGUgRE1BIGNpcmN1bGFyIG1vZGUgaXMgZW5hYmxlZAorICAgICAgKCMpIFdoZW4gdGhlIFNQSSBETUEgUGF1c2UvU3RvcCBmZWF0dXJlcyBhcmUgdXNlZCwgd2UgbXVzdCB1c2UgdGhlCisgIGZvbGxvd2luZyBBUElzIHRoZSBIQUxfU1BJX0RNQVBhdXNlKCkvIEhBTF9TUElfRE1BU3RvcCgpIG9ubHkgdW5kZXIgdGhlIFNQSQorICBjYWxsYmFja3MKKyAgICAgWy4uXQorICAgICAgIE1hc3RlciBSZWNlaXZlIG1vZGUgcmVzdHJpY3Rpb246CisgICAgICAoIykgSW4gTWFzdGVyIHVuaWRpcmVjdGlvbmFsIHJlY2VpdmUtb25seSBtb2RlIChNU1RSID0xLCBCSURJTU9ERT0wLAorICBSWE9OTFk9MSkgb3IgYmlkaXJlY3Rpb25hbCByZWNlaXZlIG1vZGUgKE1TVFI9MSwgQklESU1PREU9MSwgQklESU9FPTApLCB0bworICBlbnN1cmUgdGhhdCB0aGUgU1BJIGRvZXMgbm90IGluaXRpYXRlIGEgbmV3IHRyYW5zZmVyIHRoZSBmb2xsb3dpbmcgcHJvY2VkdXJlCisgIGhhcyB0byBiZSByZXNwZWN0ZWQ6CisgICAgICAgICAgKCMjKSBIQUxfU1BJX0RlSW5pdCgpCisgICAgICAgICAgKCMjKSBIQUxfU1BJX0luaXQoKQorICAgICBbLi5dCisgICAgICAgQ2FsbGJhY2sgcmVnaXN0cmF0aW9uOgorCisgICAgICAoIykgVGhlIGNvbXBpbGF0aW9uIGZsYWcgVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTIHdoZW4gc2V0IHRvIDFVCisgICAgICAgICAgYWxsb3dzIHRoZSB1c2VyIHRvIGNvbmZpZ3VyZSBkeW5hbWljYWxseSB0aGUgZHJpdmVyIGNhbGxiYWNrcy4KKyAgICAgICAgICBVc2UgRnVuY3Rpb25zIEhBTF9TUElfUmVnaXN0ZXJDYWxsYmFjaygpIHRvIHJlZ2lzdGVyIGFuIGludGVycnVwdAorICBjYWxsYmFjay4KKworICAgICAgICAgIEZ1bmN0aW9uIEhBTF9TUElfUmVnaXN0ZXJDYWxsYmFjaygpIGFsbG93cyB0byByZWdpc3RlciBmb2xsb3dpbmcKKyAgY2FsbGJhY2tzOgorICAgICAgICAgICAgKCsrKSBUeENwbHRDYWxsYmFjayAgICAgICAgOiBTUEkgVHggQ29tcGxldGVkIGNhbGxiYWNrCisgICAgICAgICAgICAoKyspIFJ4Q3BsdENhbGxiYWNrICAgICAgICA6IFNQSSBSeCBDb21wbGV0ZWQgY2FsbGJhY2sKKyAgICAgICAgICAgICgrKykgVHhSeENwbHRDYWxsYmFjayAgICAgIDogU1BJIFR4UnggQ29tcGxldGVkIGNhbGxiYWNrCisgICAgICAgICAgICAoKyspIFR4SGFsZkNwbHRDYWxsYmFjayAgICA6IFNQSSBUeCBIYWxmIENvbXBsZXRlZCBjYWxsYmFjaworICAgICAgICAgICAgKCsrKSBSeEhhbGZDcGx0Q2FsbGJhY2sgICAgOiBTUEkgUnggSGFsZiBDb21wbGV0ZWQgY2FsbGJhY2sKKyAgICAgICAgICAgICgrKykgVHhSeEhhbGZDcGx0Q2FsbGJhY2sgIDogU1BJIFR4UnggSGFsZiBDb21wbGV0ZWQgY2FsbGJhY2sKKyAgICAgICAgICAgICgrKykgRXJyb3JDYWxsYmFjayAgICAgICAgIDogU1BJIEVycm9yIGNhbGxiYWNrCisgICAgICAgICAgICAoKyspIEFib3J0Q3BsdENhbGxiYWNrICAgICA6IFNQSSBBYm9ydCBjYWxsYmFjaworICAgICAgICAgICAgKCsrKSBNc3BJbml0Q2FsbGJhY2sgICAgICAgOiBTUEkgTXNwIEluaXQgY2FsbGJhY2sKKyAgICAgICAgICAgICgrKykgTXNwRGVJbml0Q2FsbGJhY2sgICAgIDogU1BJIE1zcCBEZUluaXQgY2FsbGJhY2sKKyAgICAgICAgICBUaGlzIGZ1bmN0aW9uIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSwgdGhlCisgIENhbGxiYWNrIElEIGFuZCBhIHBvaW50ZXIgdG8gdGhlIHVzZXIgY2FsbGJhY2sgZnVuY3Rpb24uCisKKworICAgICAgKCMpIFVzZSBmdW5jdGlvbiBIQUxfU1BJX1VuUmVnaXN0ZXJDYWxsYmFjayB0byByZXNldCBhIGNhbGxiYWNrIHRvIHRoZQorICBkZWZhdWx0IHdlYWsgZnVuY3Rpb24uIEhBTF9TUElfVW5SZWdpc3RlckNhbGxiYWNrIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTAorICBwZXJpcGhlcmFsIGhhbmRsZSwgYW5kIHRoZSBDYWxsYmFjayBJRC4gVGhpcyBmdW5jdGlvbiBhbGxvd3MgdG8gcmVzZXQKKyAgZm9sbG93aW5nIGNhbGxiYWNrczoKKyAgICAgICAgICAgICgrKykgVHhDcGx0Q2FsbGJhY2sgICAgICAgIDogU1BJIFR4IENvbXBsZXRlZCBjYWxsYmFjaworICAgICAgICAgICAgKCsrKSBSeENwbHRDYWxsYmFjayAgICAgICAgOiBTUEkgUnggQ29tcGxldGVkIGNhbGxiYWNrCisgICAgICAgICAgICAoKyspIFR4UnhDcGx0Q2FsbGJhY2sgICAgICA6IFNQSSBUeFJ4IENvbXBsZXRlZCBjYWxsYmFjaworICAgICAgICAgICAgKCsrKSBUeEhhbGZDcGx0Q2FsbGJhY2sgICAgOiBTUEkgVHggSGFsZiBDb21wbGV0ZWQgY2FsbGJhY2sKKyAgICAgICAgICAgICgrKykgUnhIYWxmQ3BsdENhbGxiYWNrICAgIDogU1BJIFJ4IEhhbGYgQ29tcGxldGVkIGNhbGxiYWNrCisgICAgICAgICAgICAoKyspIFR4UnhIYWxmQ3BsdENhbGxiYWNrICA6IFNQSSBUeFJ4IEhhbGYgQ29tcGxldGVkIGNhbGxiYWNrCisgICAgICAgICAgICAoKyspIEVycm9yQ2FsbGJhY2sgICAgICAgICA6IFNQSSBFcnJvciBjYWxsYmFjaworICAgICAgICAgICAgKCsrKSBBYm9ydENwbHRDYWxsYmFjayAgICAgOiBTUEkgQWJvcnQgY2FsbGJhY2sKKyAgICAgICAgICAgICgrKykgTXNwSW5pdENhbGxiYWNrICAgICAgIDogU1BJIE1zcCBJbml0IGNhbGxiYWNrCisgICAgICAgICAgICAoKyspIE1zcERlSW5pdENhbGxiYWNrICAgICA6IFNQSSBNc3AgRGVJbml0IGNhbGxiYWNrCisKKyAgICAgICBbLi5dCisgICAgICAgQnkgZGVmYXVsdCwgYWZ0ZXIgdGhlIEhBTF9TUElfSW5pdCgpIGFuZCB3aGVuIHRoZSBzdGF0ZSBpcworICBIQUxfU1BJX1NUQVRFX1JFU0VUIGFsbCBjYWxsYmFja3MgYXJlIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyB3ZWFrIGZ1bmN0aW9uczoKKyAgICAgICBleGFtcGxlcyBIQUxfU1BJX01hc3RlclR4Q3BsdENhbGxiYWNrKCksIEhBTF9TUElfTWFzdGVyUnhDcGx0Q2FsbGJhY2soKS4KKyAgICAgICBFeGNlcHRpb24gZG9uZSBmb3IgTXNwSW5pdCBhbmQgTXNwRGVJbml0IGZ1bmN0aW9ucyB0aGF0IGFyZQorICAgICAgIHJlc2V0IHRvIHRoZSBsZWdhY3kgd2VhayBmdW5jdGlvbnMgaW4gdGhlIEhBTF9TUElfSW5pdCgpLworICBIQUxfU1BJX0RlSW5pdCgpIG9ubHkgd2hlbiB0aGVzZSBjYWxsYmFja3MgYXJlIG51bGwgKG5vdCByZWdpc3RlcmVkCisgIGJlZm9yZWhhbmQpLiBJZiBNc3BJbml0IG9yIE1zcERlSW5pdCBhcmUgbm90IG51bGwsIHRoZSBIQUxfU1BJX0luaXQoKS8KKyAgSEFMX1NQSV9EZUluaXQoKSBrZWVwIGFuZCB1c2UgdGhlIHVzZXIgTXNwSW5pdC9Nc3BEZUluaXQgY2FsbGJhY2tzIChyZWdpc3RlcmVkCisgIGJlZm9yZWhhbmQpIHdoYXRldmVyIHRoZSBzdGF0ZS4KKworICAgICAgIFsuLl0KKyAgICAgICBDYWxsYmFja3MgY2FuIGJlIHJlZ2lzdGVyZWQvdW5yZWdpc3RlcmVkIGluIEhBTF9TUElfU1RBVEVfUkVBRFkgc3RhdGUKKyAgb25seS4gRXhjZXB0aW9uIGRvbmUgTXNwSW5pdC9Nc3BEZUluaXQgZnVuY3Rpb25zIHRoYXQgY2FuIGJlCisgIHJlZ2lzdGVyZWQvdW5yZWdpc3RlcmVkIGluIEhBTF9TUElfU1RBVEVfUkVBRFkgb3IgSEFMX1NQSV9TVEFURV9SRVNFVCBzdGF0ZSwKKyAgICAgICB0aHVzIHJlZ2lzdGVyZWQgKHVzZXIpIE1zcEluaXQvRGVJbml0IGNhbGxiYWNrcyBjYW4gYmUgdXNlZCBkdXJpbmcgdGhlCisgIEluaXQvRGVJbml0LiBUaGVuLCB0aGUgdXNlciBmaXJzdCByZWdpc3RlcnMgdGhlIE1zcEluaXQvTXNwRGVJbml0IHVzZXIKKyAgY2FsbGJhY2tzIHVzaW5nIEhBTF9TUElfUmVnaXN0ZXJDYWxsYmFjaygpIGJlZm9yZSBjYWxsaW5nIEhBTF9TUElfRGVJbml0KCkgb3IKKyAgSEFMX1NQSV9Jbml0KCkgZnVuY3Rpb24uCisKKyAgICAgICBbLi5dCisgICAgICAgV2hlbiB0aGUgY29tcGlsYXRpb24gZGVmaW5lIFVTRV9IQUxfUFBQX1JFR0lTVEVSX0NBTExCQUNLUyBpcyBzZXQgdG8gMCBvcgorICAgICAgIG5vdCBkZWZpbmVkLCB0aGUgY2FsbGJhY2sgcmVnaXN0ZXJpbmcgZmVhdHVyZSBpcyBub3QgYXZhaWxhYmxlCisgICAgICAgYW5kIHdlYWsgKHN1cmNoYXJnZWQpIGNhbGxiYWNrcyBhcmUgdXNlZC4KKworICAgICBbLi5dCisgICAgICAgVXNpbmcgdGhlIEhBTCBpdCBpcyBub3QgcG9zc2libGUgdG8gcmVhY2ggYWxsIHN1cHBvcnRlZCBTUEkgZnJlcXVlbmN5CisgIHdpdGggdGhlIGRpZmZlcmVudCBTUEkgTW9kZXMsIHRoZSBmb2xsb3dpbmcgdGFibGUgcmVzdW1lIHRoZSBtYXggU1BJIGZyZXF1ZW5jeQorICByZWFjaGVkIHdpdGggZGF0YSBzaXplIDhiaXRzLzE2Yml0cywgYWNjb3JkaW5nIHRvIGZyZXF1ZW5jeSBvZiB0aGUgQVBCeAorICBQZXJpcGhlcmFsIENsb2NrIChmUENMSykgdXNlZCBieSB0aGUgU1BJIGluc3RhbmNlLgorCisgIEBlbmR2ZXJiYXRpbQorCisgIEFkZGl0aW9uYWwgdGFibGUgOgorCisgICAgICAgRGF0YVNpemUgPSBTUElfREFUQVNJWkVfOEJJVDoKKyAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICB8ICAgICAgICAgfCAgICAgICAgICAgICAgICB8IDJMaW5lcyBGdWxsZHVwbGV4ICAgfCAgICAgMkxpbmVzIFJ4T25seSAgICB8CisgIDFMaW5lICAgICAgICB8IHwgUHJvY2VzcyB8IFRyYW5zZmVyIG1vZGUKKyAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IHwgfCB8CisgIE1hc3RlciAgfCAgU2xhdmUgICB8ICBNYXN0ZXIgICB8ICBTbGF2ZSAgIHwgIE1hc3RlciAgIHwgIFNsYXZlICAgfAorICAgICAgIHw9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09fAorICAgICAgIHwgICAgVCAgICB8ICAgICBQb2xsaW5nICAgIHwgRnBjbGsvNCAgfCBGcGNsay84ICB8ICAgIE5BICAgICB8ICAgIE5BICAgIHwKKyAgTkEgICAgIHwgICBOQSAgICAgfCB8ICAgIFgKKyAgfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLXwKKyAgICAgICB8ICAgIC8gICAgfCAgICAgSW50ZXJydXB0ICB8IEZwY2xrLzQgIHwgRnBjbGsvMTYgfCAgICBOQSAgICAgfCAgICBOQSAgICB8CisgIE5BICAgICB8ICAgTkEgICAgIHwgfCAgICBSCisgIHwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS18CisgICAgICAgfCAgICBYICAgIHwgICAgICAgRE1BICAgICAgfCBGcGNsay8yICB8IEZwY2xrLzIgIHwgICAgTkEgICAgIHwgICAgTkEgICAgfAorICBOQSAgICAgfCAgIE5BICAgICB8CisgICAgICAgfD09PT09PT09PXw9PT09PT09PT09PT09PT09fD09PT09PT09PT18PT09PT09PT09PXw9PT09PT09PT09PXw9PT09PT09PT09fD09PT09PT09PT09fD09PT09PT09PT18CisgICAgICAgfCAgICAgICAgIHwgICAgIFBvbGxpbmcgICAgfCBGcGNsay80ICB8IEZwY2xrLzggIHwgRnBjbGsvMTYgIHwgRnBjbGsvOCAgfAorICBGcGNsay84ICAgfCBGcGNsay84ICB8IHwKKyAgfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLXwKKyAgICAgICB8ICAgIFIgICAgfCAgICAgSW50ZXJydXB0ICB8IEZwY2xrLzggIHwgRnBjbGsvMTYgfCBGcGNsay84ICAgfCBGcGNsay84ICB8CisgIEZwY2xrLzggICB8IEZwY2xrLzQgIHwgfCAgICBYCisgIHwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS18CisgICAgICAgfCAgICAgICAgIHwgICAgICAgRE1BICAgICAgfCBGcGNsay80ICB8IEZwY2xrLzIgIHwgRnBjbGsvMiAgIHwgRnBjbGsvMTYgfAorICBGcGNsay8yICAgfCBGcGNsay8xNiB8CisgICAgICAgfD09PT09PT09PXw9PT09PT09PT09PT09PT09fD09PT09PT09PT18PT09PT09PT09PXw9PT09PT09PT09PXw9PT09PT09PT09fD09PT09PT09PT09fD09PT09PT09PT18CisgICAgICAgfCAgICAgICAgIHwgICAgIFBvbGxpbmcgICAgfCBGcGNsay84ICB8IEZwY2xrLzIgIHwgICAgIE5BICAgIHwgICAgTkEgICAgfAorICBGcGNsay84ICAgfCBGcGNsay84ICB8IHwKKyAgfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLXwKKyAgICAgICB8ICAgIFQgICAgfCAgICAgSW50ZXJydXB0ICB8IEZwY2xrLzIgIHwgRnBjbGsvNCAgfCAgICAgTkEgICAgfCAgICBOQSAgICB8CisgIEZwY2xrLzE2ICB8IEZwY2xrLzggIHwgfCAgICBYCisgIHwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS18CisgICAgICAgfCAgICAgICAgIHwgICAgICAgRE1BICAgICAgfCBGcGNsay8yICB8IEZwY2xrLzIgIHwgICAgIE5BICAgIHwgICAgTkEgICAgfAorICBGcGNsay84ICAgfCBGcGNsay8xNiB8CisgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisKKyAgICAgICBEYXRhU2l6ZSA9IFNQSV9EQVRBU0laRV8xNkJJVDoKKyAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICB8ICAgICAgICAgfCAgICAgICAgICAgICAgICB8IDJMaW5lcyBGdWxsZHVwbGV4ICAgfCAgICAgMkxpbmVzIFJ4T25seSAgICB8CisgIDFMaW5lICAgICAgICB8IHwgUHJvY2VzcyB8IFRyYW5zZmVyIG1vZGUKKyAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IHwgfCB8CisgIE1hc3RlciAgfCAgU2xhdmUgICB8ICBNYXN0ZXIgICB8ICBTbGF2ZSAgIHwgIE1hc3RlciAgIHwgIFNsYXZlICAgfAorICAgICAgIHw9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09fAorICAgICAgIHwgICAgVCAgICB8ICAgICBQb2xsaW5nICAgIHwgRnBjbGsvNCAgfCBGcGNsay84ICB8ICAgIE5BICAgICB8ICAgIE5BICAgIHwKKyAgTkEgICAgIHwgICBOQSAgICAgfCB8ICAgIFgKKyAgfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLXwKKyAgICAgICB8ICAgIC8gICAgfCAgICAgSW50ZXJydXB0ICB8IEZwY2xrLzQgIHwgRnBjbGsvMTYgfCAgICBOQSAgICAgfCAgICBOQSAgICB8CisgIE5BICAgICB8ICAgTkEgICAgIHwgfCAgICBSCisgIHwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS18CisgICAgICAgfCAgICBYICAgIHwgICAgICAgRE1BICAgICAgfCBGcGNsay8yICB8IEZwY2xrLzIgIHwgICAgTkEgICAgIHwgICAgTkEgICAgfAorICBOQSAgICAgfCAgIE5BICAgICB8CisgICAgICAgfD09PT09PT09PXw9PT09PT09PT09PT09PT09fD09PT09PT09PT18PT09PT09PT09PXw9PT09PT09PT09PXw9PT09PT09PT09fD09PT09PT09PT09fD09PT09PT09PT18CisgICAgICAgfCAgICAgICAgIHwgICAgIFBvbGxpbmcgICAgfCBGcGNsay80ICB8IEZwY2xrLzggIHwgRnBjbGsvMTYgIHwgRnBjbGsvOCAgfAorICBGcGNsay84ICAgfCBGcGNsay84ICB8IHwKKyAgfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLXwKKyAgICAgICB8ICAgIFIgICAgfCAgICAgSW50ZXJydXB0ICB8IEZwY2xrLzggIHwgRnBjbGsvMTYgfCBGcGNsay84ICAgfCBGcGNsay84ICB8CisgIEZwY2xrLzggICB8IEZwY2xrLzQgIHwgfCAgICBYCisgIHwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS18CisgICAgICAgfCAgICAgICAgIHwgICAgICAgRE1BICAgICAgfCBGcGNsay80ICB8IEZwY2xrLzIgIHwgRnBjbGsvMiAgIHwgRnBjbGsvMTYgfAorICBGcGNsay8yICAgfCBGcGNsay8xNiB8CisgICAgICAgfD09PT09PT09PXw9PT09PT09PT09PT09PT09fD09PT09PT09PT18PT09PT09PT09PXw9PT09PT09PT09PXw9PT09PT09PT09fD09PT09PT09PT09fD09PT09PT09PT18CisgICAgICAgfCAgICAgICAgIHwgICAgIFBvbGxpbmcgICAgfCBGcGNsay84ICB8IEZwY2xrLzIgIHwgICAgIE5BICAgIHwgICAgTkEgICAgfAorICBGcGNsay84ICAgfCBGcGNsay84ICB8IHwKKyAgfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLXwKKyAgICAgICB8ICAgIFQgICAgfCAgICAgSW50ZXJydXB0ICB8IEZwY2xrLzIgIHwgRnBjbGsvNCAgfCAgICAgTkEgICAgfCAgICBOQSAgICB8CisgIEZwY2xrLzE2ICB8IEZwY2xrLzggIHwgfCAgICBYCisgIHwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS18CisgICAgICAgfCAgICAgICAgIHwgICAgICAgRE1BICAgICAgfCBGcGNsay8yICB8IEZwY2xrLzIgIHwgICAgIE5BICAgIHwgICAgTkEgICAgfAorICBGcGNsay84ICAgfCBGcGNsay8xNiB8CisgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICAgQG5vdGUgVGhlIG1heCBTUEkgZnJlcXVlbmN5IGRlcGVuZCBvbiBTUEkgZGF0YSBzaXplICg0Yml0cywgNWJpdHMsLi4uLAorICA4Yml0cywuLi4xNWJpdHMsIDE2Yml0cyksIFNQSSBtb2RlKDIgTGluZXMgZnVsbGR1cGxleCwgMiBsaW5lcyBSeE9ubHksIDEgbGluZQorICBUWC9SWCkgYW5kIFByb2Nlc3MgbW9kZSAoUG9sbGluZywgSVQsIERNQSkuCisgICAgICAgQG5vdGUKKyAgICAgICAgICAgICgjKSBUWC9SWCBwcm9jZXNzZXMgYXJlIEhBTF9TUElfVHJhbnNtaXRSZWNlaXZlKCksCisgIEhBTF9TUElfVHJhbnNtaXRSZWNlaXZlX0lUKCkgYW5kIEhBTF9TUElfVHJhbnNtaXRSZWNlaXZlX0RNQSgpCisgICAgICAgICAgICAoIykgUlggcHJvY2Vzc2VzIGFyZSBIQUxfU1BJX1JlY2VpdmUoKSwgSEFMX1NQSV9SZWNlaXZlX0lUKCkgYW5kCisgIEhBTF9TUElfUmVjZWl2ZV9ETUEoKQorICAgICAgICAgICAgKCMpIFRYIHByb2Nlc3NlcyBhcmUgSEFMX1NQSV9UcmFuc21pdCgpLCBIQUxfU1BJX1RyYW5zbWl0X0lUKCkgYW5kCisgIEhBTF9TUElfVHJhbnNtaXRfRE1BKCkKKworICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzR4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzR4eF9IQUxfRHJpdmVyCisgKiBAeworICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJIFNQSQorICogQGJyaWVmIFNQSSBIQUwgbW9kdWxlIGRyaXZlcgorICogQHsKKyAqLworI2lmZGVmIEhBTF9TUElfTU9EVUxFX0VOQUJMRUQKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFNQSV9Qcml2YXRlX0NvbnN0YW50cyBTUEkgUHJpdmF0ZSBDb25zdGFudHMKKyAqIEB7CisgKi8KKyNkZWZpbmUgU1BJX0RFRkFVTFRfVElNRU9VVCAxMDBVCisvKioKKyAqIEB9CisgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBTUElfUHJpdmF0ZV9GdW5jdGlvbnMgU1BJIFByaXZhdGUgRnVuY3Rpb25zCisgKiBAeworICovCitzdGF0aWMgdm9pZCBTUElfRE1BVHJhbnNtaXRDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIFNQSV9ETUFSZWNlaXZlQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBTUElfRE1BVHJhbnNtaXRSZWNlaXZlQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBTUElfRE1BSGFsZlRyYW5zbWl0Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBTUElfRE1BSGFsZlJlY2VpdmVDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIFNQSV9ETUFIYWxmVHJhbnNtaXRSZWNlaXZlQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBTUElfRE1BRXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgU1BJX0RNQUFib3J0T25FcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBTUElfRE1BVHhBYm9ydENhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIFNQSV9ETUFSeEFib3J0Q2FsbGJhY2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNQSV9XYWl0RmxhZ1N0YXRlVW50aWxUaW1lb3V0KFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxhZ1N0YXR1cyBTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpY2tzdGFydCk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU1BJX1dhaXRGaWZvU3RhdGVVbnRpbFRpbWVvdXQoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRmlmbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpY2tzdGFydCk7CitzdGF0aWMgdm9pZCBTUElfVHhJU1JfOEJJVChzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7CitzdGF0aWMgdm9pZCBTUElfVHhJU1JfMTZCSVQoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOworc3RhdGljIHZvaWQgU1BJX1J4SVNSXzhCSVQoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOworc3RhdGljIHZvaWQgU1BJX1J4SVNSXzE2QklUKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKK3N0YXRpYyB2b2lkIFNQSV8ybGluZXNSeElTUl84QklUKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKK3N0YXRpYyB2b2lkIFNQSV8ybGluZXNUeElTUl84QklUKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKK3N0YXRpYyB2b2lkIFNQSV8ybGluZXNUeElTUl8xNkJJVChzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7CitzdGF0aWMgdm9pZCBTUElfMmxpbmVzUnhJU1JfMTZCSVQoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKK3N0YXRpYyB2b2lkIFNQSV9SeElTUl84QklUQ1JDKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKK3N0YXRpYyB2b2lkIFNQSV9SeElTUl8xNkJJVENSQyhzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7CitzdGF0aWMgdm9pZCBTUElfMmxpbmVzUnhJU1JfOEJJVENSQyhzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7CitzdGF0aWMgdm9pZCBTUElfMmxpbmVzUnhJU1JfMTZCSVRDUkMoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOworI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCitzdGF0aWMgdm9pZCBTUElfQWJvcnRSeF9JU1IoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOworc3RhdGljIHZvaWQgU1BJX0Fib3J0VHhfSVNSKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKK3N0YXRpYyB2b2lkIFNQSV9DbG9zZVJ4VHhfSVNSKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKK3N0YXRpYyB2b2lkIFNQSV9DbG9zZVJ4X0lTUihTUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7CitzdGF0aWMgdm9pZCBTUElfQ2xvc2VUeF9JU1IoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNQSV9FbmRSeFRyYW5zYWN0aW9uKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGlja3N0YXJ0KTsKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBTUElfRW5kUnhUeFRyYW5zYWN0aW9uKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpY2tzdGFydCk7CisvKioKKyAqIEB9CisgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgU1BJX0V4cG9ydGVkX0Z1bmN0aW9ucyBTUEkgRXhwb3J0ZWQgRnVuY3Rpb25zCisgKiBAeworICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uCitmdW5jdGlvbnMKKyAgKiAgQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBpbml0aWFsaXplIGFuZAorICAgICAgICAgIGRlLWluaXRpYWxpemUgdGhlIFNQSXggcGVyaXBoZXJhbDoKKworICAgICAgKCspIFVzZXIgbXVzdCBpbXBsZW1lbnQgSEFMX1NQSV9Nc3BJbml0KCkgZnVuY3Rpb24gaW4gd2hpY2ggaGUgY29uZmlndXJlcworICAgICAgICAgIGFsbCByZWxhdGVkIHBlcmlwaGVyYWxzIHJlc291cmNlcyAoQ0xPQ0ssIEdQSU8sIERNQSwgSVQgYW5kIE5WSUMgKS4KKworICAgICAgKCspIENhbGwgdGhlIGZ1bmN0aW9uIEhBTF9TUElfSW5pdCgpIHRvIGNvbmZpZ3VyZSB0aGUgc2VsZWN0ZWQgZGV2aWNlIHdpdGgKKyAgICAgICAgICB0aGUgc2VsZWN0ZWQgY29uZmlndXJhdGlvbjoKKyAgICAgICAgKCsrKSBNb2RlCisgICAgICAgICgrKykgRGlyZWN0aW9uCisgICAgICAgICgrKykgRGF0YSBTaXplCisgICAgICAgICgrKykgQ2xvY2sgUG9sYXJpdHkgYW5kIFBoYXNlCisgICAgICAgICgrKykgTlNTIE1hbmFnZW1lbnQKKyAgICAgICAgKCsrKSBCYXVkUmF0ZSBQcmVzY2FsZXIKKyAgICAgICAgKCsrKSBGaXJzdEJpdAorICAgICAgICAoKyspIFRJTW9kZQorICAgICAgICAoKyspIENSQyBDYWxjdWxhdGlvbgorICAgICAgICAoKyspIENSQyBQb2x5bm9taWFsIGlmIENSQyBlbmFibGVkCisgICAgICAgICgrKykgQ1JDIExlbmd0aCwgdXNlZCBvbmx5IHdpdGggRGF0YTggYW5kIERhdGExNgorICAgICAgICAoKyspIEZJRk8gcmVjZXB0aW9uIHRocmVzaG9sZAorCisgICAgICAoKykgQ2FsbCB0aGUgZnVuY3Rpb24gSEFMX1NQSV9EZUluaXQoKSB0byByZXN0b3JlIHRoZSBkZWZhdWx0Citjb25maWd1cmF0aW9uIG9mIHRoZSBzZWxlY3RlZCBTUEl4IHBlcmlwaGVyYWwuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBTUEkgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycworICogICAgICAgICBpbiB0aGUgU1BJX0luaXRUeXBlRGVmIGFuZCBpbml0aWFsaXplIHRoZSBhc3NvY2lhdGVkIGhhbmRsZS4KKyAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9Jbml0KFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKSB7CisgIHVpbnQzMl90IGZyeHRoOworCisgIC8qIENoZWNrIHRoZSBTUEkgaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYgKGhzcGkgPT0gTlVMTCkgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfU1BJX0FMTF9JTlNUQU5DRShoc3BpLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfU1BJX01PREUoaHNwaS0+SW5pdC5Nb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19TUElfRElSRUNUSU9OKGhzcGktPkluaXQuRGlyZWN0aW9uKSk7CisgIGFzc2VydF9wYXJhbShJU19TUElfREFUQVNJWkUoaHNwaS0+SW5pdC5EYXRhU2l6ZSkpOworICBhc3NlcnRfcGFyYW0oSVNfU1BJX05TUyhoc3BpLT5Jbml0Lk5TUykpOworICBhc3NlcnRfcGFyYW0oSVNfU1BJX05TU1AoaHNwaS0+SW5pdC5OU1NQTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfU1BJX0JBVURSQVRFX1BSRVNDQUxFUihoc3BpLT5Jbml0LkJhdWRSYXRlUHJlc2NhbGVyKSk7CisgIGFzc2VydF9wYXJhbShJU19TUElfRklSU1RfQklUKGhzcGktPkluaXQuRmlyc3RCaXQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NQSV9USU1PREUoaHNwaS0+SW5pdC5USU1vZGUpKTsKKyAgaWYgKGhzcGktPkluaXQuVElNb2RlID09IFNQSV9USU1PREVfRElTQUJMRSkgeworICAgIGFzc2VydF9wYXJhbShJU19TUElfQ1BPTChoc3BpLT5Jbml0LkNMS1BvbGFyaXR5KSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX1NQSV9DUEhBKGhzcGktPkluaXQuQ0xLUGhhc2UpKTsKKworICAgIGlmIChoc3BpLT5Jbml0Lk1vZGUgPT0gU1BJX01PREVfTUFTVEVSKSB7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfU1BJX0JBVURSQVRFX1BSRVNDQUxFUihoc3BpLT5Jbml0LkJhdWRSYXRlUHJlc2NhbGVyKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIEJhdWRyYXRlIHByZXNjYWxlciBub3QgdXNlIGluIE1vdG9yYW9sYSBTbGF2ZSBtb2RlLiBmb3JjZSB0byBkZWZhdWx0CisgICAgICAgKiB2YWx1ZSAqLworICAgICAgaHNwaS0+SW5pdC5CYXVkUmF0ZVByZXNjYWxlciA9IFNQSV9CQVVEUkFURVBSRVNDQUxFUl8yOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfU1BJX0JBVURSQVRFX1BSRVNDQUxFUihoc3BpLT5Jbml0LkJhdWRSYXRlUHJlc2NhbGVyKSk7CisKKyAgICAvKiBGb3JjZSBwb2xhcml0eSBhbmQgcGhhc2UgdG8gVEkgcHJvdG9jYW9sIHJlcXVpcmVtZW50cyAqLworICAgIGhzcGktPkluaXQuQ0xLUG9sYXJpdHkgPSBTUElfUE9MQVJJVFlfTE9XOworICAgIGhzcGktPkluaXQuQ0xLUGhhc2UgPSBTUElfUEhBU0VfMUVER0U7CisgIH0KKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgIGFzc2VydF9wYXJhbShJU19TUElfQ1JDX0NBTENVTEFUSU9OKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24pKTsKKyAgaWYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkgeworICAgIGFzc2VydF9wYXJhbShJU19TUElfQ1JDX1BPTFlOT01JQUwoaHNwaS0+SW5pdC5DUkNQb2x5bm9taWFsKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX1NQSV9DUkNfTEVOR1RIKGhzcGktPkluaXQuQ1JDTGVuZ3RoKSk7CisgIH0KKyNlbHNlCisgIGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPSBTUElfQ1JDQ0FMQ1VMQVRJT05fRElTQUJMRTsKKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisgIGlmIChoc3BpLT5TdGF0ZSA9PSBIQUxfU1BJX1NUQVRFX1JFU0VUKSB7CisgICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLworICAgIGhzcGktPkxvY2sgPSBIQUxfVU5MT0NLRUQ7CisKKyNpZiAoVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgIC8qIEluaXQgdGhlIFNQSSBDYWxsYmFjayBzZXR0aW5ncyAqLworICAgIGhzcGktPlR4Q3BsdENhbGxiYWNrID0KKyAgICAgICAgSEFMX1NQSV9UeENwbHRDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgVHhDcGx0Q2FsbGJhY2sgICAgICAgKi8KKyAgICBoc3BpLT5SeENwbHRDYWxsYmFjayA9CisgICAgICAgIEhBTF9TUElfUnhDcGx0Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIFJ4Q3BsdENhbGxiYWNrICAgICAgICovCisgICAgaHNwaS0+VHhSeENwbHRDYWxsYmFjayA9CisgICAgICAgIEhBTF9TUElfVHhSeENwbHRDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgVHhSeENwbHRDYWxsYmFjayAgICAgKi8KKyAgICBoc3BpLT5UeEhhbGZDcGx0Q2FsbGJhY2sgPQorICAgICAgICBIQUxfU1BJX1R4SGFsZkNwbHRDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgVHhIYWxmQ3BsdENhbGxiYWNrICAgKi8KKyAgICBoc3BpLT5SeEhhbGZDcGx0Q2FsbGJhY2sgPQorICAgICAgICBIQUxfU1BJX1J4SGFsZkNwbHRDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgUnhIYWxmQ3BsdENhbGxiYWNrICAgKi8KKyAgICBoc3BpLT5UeFJ4SGFsZkNwbHRDYWxsYmFjayA9CisgICAgICAgIEhBTF9TUElfVHhSeEhhbGZDcGx0Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIFR4UnhIYWxmQ3BsdENhbGxiYWNrICovCisgICAgaHNwaS0+RXJyb3JDYWxsYmFjayA9IEhBTF9TUElfRXJyb3JDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgRXJyb3JDYWxsYmFjayAqLworICAgIGhzcGktPkFib3J0Q3BsdENhbGxiYWNrID0KKyAgICAgICAgSEFMX1NQSV9BYm9ydENwbHRDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgQWJvcnRDcGx0Q2FsbGJhY2sgICAgKi8KKworICAgIGlmIChoc3BpLT5Nc3BJbml0Q2FsbGJhY2sgPT0gTlVMTCkgeworICAgICAgaHNwaS0+TXNwSW5pdENhbGxiYWNrID0gSEFMX1NQSV9Nc3BJbml0OyAvKiBMZWdhY3kgd2VhayBNc3BJbml0ICAqLworICAgIH0KKworICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLLCBOVklDLi4uICovCisgICAgaHNwaS0+TXNwSW5pdENhbGxiYWNrKGhzcGkpOworI2Vsc2UKKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgOiBHUElPLCBDTE9DSywgTlZJQy4uLiAqLworICAgIEhBTF9TUElfTXNwSW5pdChoc3BpKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorCisgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIFNQSSBwZXJpcGhlcmFsICovCisgIF9fSEFMX1NQSV9ESVNBQkxFKGhzcGkpOworCisgIC8qIEFsaWduIGJ5IGRlZmF1bHQgdGhlIHJzIGZpZm8gdGhyZXNob2xkIG9uIHRoZSBkYXRhIHNpemUgKi8KKyAgaWYgKGhzcGktPkluaXQuRGF0YVNpemUgPiBTUElfREFUQVNJWkVfOEJJVCkgeworICAgIGZyeHRoID0gU1BJX1JYRklGT19USFJFU0hPTERfSEY7CisgIH0gZWxzZSB7CisgICAgZnJ4dGggPSBTUElfUlhGSUZPX1RIUkVTSE9MRF9RRjsKKyAgfQorCisgIC8qIENSQyBjYWxjdWxhdGlvbiBpcyB2YWxpZCBvbmx5IGZvciAxNkJpdCBhbmQgOCBCaXQgKi8KKyAgaWYgKChoc3BpLT5Jbml0LkRhdGFTaXplICE9IFNQSV9EQVRBU0laRV8xNkJJVCkgJiYKKyAgICAgIChoc3BpLT5Jbml0LkRhdGFTaXplICE9IFNQSV9EQVRBU0laRV84QklUKSkgeworICAgIC8qIENSQyBtdXN0IGJlIGRpc2FibGVkICovCisgICAgaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9IFNQSV9DUkNDQUxDVUxBVElPTl9ESVNBQkxFOworICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTUEl4IENSMSAmIENSMiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIC8qIENvbmZpZ3VyZSA6IFNQSSBNb2RlLCBDb21tdW5pY2F0aW9uIE1vZGUsIENsb2NrIHBvbGFyaXR5IGFuZCBwaGFzZSwgTlNTCisgIG1hbmFnZW1lbnQsIENvbW11bmljYXRpb24gc3BlZWQsIEZpcnN0IGJpdCBhbmQgQ1JDIGNhbGN1bGF0aW9uIHN0YXRlICovCisgIFdSSVRFX1JFRygKKyAgICAgIGhzcGktPkluc3RhbmNlLT5DUjEsCisgICAgICAoKGhzcGktPkluaXQuTW9kZSAmIChTUElfQ1IxX01TVFIgfCBTUElfQ1IxX1NTSSkpIHwKKyAgICAgICAoaHNwaS0+SW5pdC5EaXJlY3Rpb24gJiAoU1BJX0NSMV9SWE9OTFkgfCBTUElfQ1IxX0JJRElNT0RFKSkgfAorICAgICAgIChoc3BpLT5Jbml0LkNMS1BvbGFyaXR5ICYgU1BJX0NSMV9DUE9MKSB8CisgICAgICAgKGhzcGktPkluaXQuQ0xLUGhhc2UgJiBTUElfQ1IxX0NQSEEpIHwgKGhzcGktPkluaXQuTlNTICYgU1BJX0NSMV9TU00pIHwKKyAgICAgICAoaHNwaS0+SW5pdC5CYXVkUmF0ZVByZXNjYWxlciAmIFNQSV9DUjFfQlJfTXNrKSB8CisgICAgICAgKGhzcGktPkluaXQuRmlyc3RCaXQgJiBTUElfQ1IxX0xTQkZJUlNUKSB8CisgICAgICAgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gJiBTUElfQ1IxX0NSQ0VOKSkpOworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNQSXggQ1JDTCBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKSB7CisgICAgLyogQWxpZ24gdGhlIENSQyBMZW5ndGggb24gdGhlIGRhdGEgc2l6ZSAqLworICAgIGlmIChoc3BpLT5Jbml0LkNSQ0xlbmd0aCA9PSBTUElfQ1JDX0xFTkdUSF9EQVRBU0laRSkgeworICAgICAgLyogQ1JDIExlbmd0aCBhbGlnbmVkIG9uIHRoZSBkYXRhIHNpemUgOiB2YWx1ZSBzZXQgYnkgZGVmYXVsdCAqLworICAgICAgaWYgKGhzcGktPkluaXQuRGF0YVNpemUgPiBTUElfREFUQVNJWkVfOEJJVCkgeworICAgICAgICBoc3BpLT5Jbml0LkNSQ0xlbmd0aCA9IFNQSV9DUkNfTEVOR1RIXzE2QklUOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaHNwaS0+SW5pdC5DUkNMZW5ndGggPSBTUElfQ1JDX0xFTkdUSF84QklUOworICAgICAgfQorICAgIH0KKworICAgIC8qIENvbmZpZ3VyZSA6IENSQyBMZW5ndGggKi8KKyAgICBpZiAoaHNwaS0+SW5pdC5DUkNMZW5ndGggPT0gU1BJX0NSQ19MRU5HVEhfMTZCSVQpIHsKKyAgICAgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMSwgU1BJX0NSMV9DUkNMKTsKKyAgICB9CisgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisgIC8qIENvbmZpZ3VyZSA6IE5TUyBtYW5hZ2VtZW50LCBUSSBNb2RlLCBOU1MgUHVsc2UsIERhdGEgc2l6ZSBhbmQgUnggRmlmbworICAgKiB0aHJlc2hvbGQgKi8KKyAgV1JJVEVfUkVHKGhzcGktPkluc3RhbmNlLT5DUjIsCisgICAgICAgICAgICAoKChoc3BpLT5Jbml0Lk5TUyA+PiAxNlUpICYgU1BJX0NSMl9TU09FKSB8CisgICAgICAgICAgICAgKGhzcGktPkluaXQuVElNb2RlICYgU1BJX0NSMl9GUkYpIHwKKyAgICAgICAgICAgICAoaHNwaS0+SW5pdC5OU1NQTW9kZSAmIFNQSV9DUjJfTlNTUCkgfAorICAgICAgICAgICAgIChoc3BpLT5Jbml0LkRhdGFTaXplICYgU1BJX0NSMl9EU19Nc2spIHwgKGZyeHRoICYgU1BJX0NSMl9GUlhUSCkpKTsKKworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNQSXggQ1JDUE9MWSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLSovCisgIC8qIENvbmZpZ3VyZSA6IENSQyBQb2x5bm9taWFsICovCisgIGlmIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpIHsKKyAgICBXUklURV9SRUcoaHNwaS0+SW5zdGFuY2UtPkNSQ1BSLAorICAgICAgICAgICAgICAoaHNwaS0+SW5pdC5DUkNQb2x5bm9taWFsICYgU1BJX0NSQ1BSX0NSQ1BPTFlfTXNrKSk7CisgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisjaWYgZGVmaW5lZChTUElfSTJTQ0ZHUl9JMlNNT0QpCisgIC8qIEFjdGl2YXRlIHRoZSBTUEkgbW9kZSAoTWFrZSBzdXJlIHRoYXQgSTJTTU9EIGJpdCBpbiBJMlNDRkdSIHJlZ2lzdGVyIGlzCisgICAqIHJlc2V0KSAqLworICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkkyU0NGR1IsIFNQSV9JMlNDRkdSX0kyU01PRCk7CisjZW5kaWYgLyogU1BJX0kyU0NGR1JfSTJTTU9EICovCisKKyAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9OT05FOworICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfUkVBRFk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgIERlLUluaXRpYWxpemUgdGhlIFNQSSBwZXJpcGhlcmFsLgorICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX0RlSW5pdChTUElfSGFuZGxlVHlwZURlZiAqaHNwaSkgeworICAvKiBDaGVjayB0aGUgU1BJIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmIChoc3BpID09IE5VTEwpIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgU1BJIEluc3RhbmNlIHBhcmFtZXRlciAqLworICBhc3NlcnRfcGFyYW0oSVNfU1BJX0FMTF9JTlNUQU5DRShoc3BpLT5JbnN0YW5jZSkpOworCisgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIFNQSSBQZXJpcGhlcmFsIENsb2NrICovCisgIF9fSEFMX1NQSV9ESVNBQkxFKGhzcGkpOworCisjaWYgKFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgaWYgKGhzcGktPk1zcERlSW5pdENhbGxiYWNrID09IE5VTEwpIHsKKyAgICBoc3BpLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9TUElfTXNwRGVJbml0OyAvKiBMZWdhY3kgd2VhayBNc3BEZUluaXQgICovCisgIH0KKworICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZTogR1BJTywgQ0xPQ0ssIE5WSUMuLi4gKi8KKyAgaHNwaS0+TXNwRGVJbml0Q2FsbGJhY2soaHNwaSk7CisjZWxzZQorICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZTogR1BJTywgQ0xPQ0ssIE5WSUMuLi4gKi8KKyAgSEFMX1NQSV9Nc3BEZUluaXQoaHNwaSk7CisjZW5kaWYgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKyAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9OT05FOworICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfUkVTRVQ7CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhoc3BpKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgU1BJIE1TUC4KKyAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX193ZWFrIHZvaWQgSEFMX1NQSV9Nc3BJbml0KFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKSB7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhzcGkpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfU1BJX01zcEluaXQgc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICogQGJyaWVmICBEZS1Jbml0aWFsaXplIHRoZSBTUEkgTVNQLgorICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAqIEByZXR2YWwgTm9uZQorICovCitfX3dlYWsgdm9pZCBIQUxfU1BJX01zcERlSW5pdChTUElfSGFuZGxlVHlwZURlZiAqaHNwaSkgeworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoc3BpKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1NQSV9Nc3BEZUluaXQgc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKyNpZiAoVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorLyoqCisgKiBAYnJpZWYgIFJlZ2lzdGVyIGEgVXNlciBTUEkgQ2FsbGJhY2sKKyAqICAgICAgICAgVG8gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSB3ZWFrIHByZWRlZmluZWQgY2FsbGJhY2sKKyAqIEBwYXJhbSAgaHNwaSBQb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNQSS4KKyAqIEBwYXJhbSAgQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgcmVnaXN0ZXJlZAorICogQHBhcmFtICBwQ2FsbGJhY2sgcG9pbnRlciB0byB0aGUgQ2FsbGJhY2sgZnVuY3Rpb24KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX1JlZ2lzdGVyQ2FsbGJhY2soU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1NQSV9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTUElfQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjaykgeworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgaWYgKHBDYWxsYmFjayA9PSBOVUxMKSB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaHNwaS0+RXJyb3JDb2RlIHw9IEhBTF9TUElfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoc3BpKTsKKworICBpZiAoSEFMX1NQSV9TVEFURV9SRUFEWSA9PSBoc3BpLT5TdGF0ZSkgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkgeworICAgICAgY2FzZSBIQUxfU1BJX1RYX0NPTVBMRVRFX0NCX0lEOgorICAgICAgICBoc3BpLT5UeENwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1NQSV9SWF9DT01QTEVURV9DQl9JRDoKKyAgICAgICAgaHNwaS0+UnhDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TUElfVFhfUlhfQ09NUExFVEVfQ0JfSUQ6CisgICAgICAgIGhzcGktPlR4UnhDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TUElfVFhfSEFMRl9DT01QTEVURV9DQl9JRDoKKyAgICAgICAgaHNwaS0+VHhIYWxmQ3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfU1BJX1JYX0hBTEZfQ09NUExFVEVfQ0JfSUQ6CisgICAgICAgIGhzcGktPlJ4SGFsZkNwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1NQSV9UWF9SWF9IQUxGX0NPTVBMRVRFX0NCX0lEOgorICAgICAgICBoc3BpLT5UeFJ4SGFsZkNwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1NQSV9FUlJPUl9DQl9JRDoKKyAgICAgICAgaHNwaS0+RXJyb3JDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1NQSV9BQk9SVF9DQl9JRDoKKyAgICAgICAgaHNwaS0+QWJvcnRDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TUElfTVNQSU5JVF9DQl9JRDoKKyAgICAgICAgaHNwaS0+TXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfU1BJX01TUERFSU5JVF9DQl9JRDoKKyAgICAgICAgaHNwaS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfSU5WQUxJRF9DQUxMQkFDSyk7CisKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfSBlbHNlIGlmIChIQUxfU1BJX1NUQVRFX1JFU0VUID09IGhzcGktPlN0YXRlKSB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKSB7CisgICAgICBjYXNlIEhBTF9TUElfTVNQSU5JVF9DQl9JRDoKKyAgICAgICAgaHNwaS0+TXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfU1BJX01TUERFSU5JVF9DQl9JRDoKKyAgICAgICAgaHNwaS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfSU5WQUxJRF9DQUxMQkFDSyk7CisKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9JTlZBTElEX0NBTExCQUNLKTsKKworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhzcGkpOworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIEBicmllZiAgVW5yZWdpc3RlciBhbiBTUEkgQ2FsbGJhY2sKKyAqICAgICAgICAgU1BJIGNhbGxiYWNrIGlzIHJlZGlyZWN0ZWQgdG8gdGhlIHdlYWsgcHJlZGVmaW5lZCBjYWxsYmFjaworICogQHBhcmFtICBoc3BpIFBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU1BJLgorICogQHBhcmFtICBDYWxsYmFja0lEIElEIG9mIHRoZSBjYWxsYmFjayB0byBiZSB1bnJlZ2lzdGVyZWQKKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX1VuUmVnaXN0ZXJDYWxsYmFjaygKKyAgICBTUElfSGFuZGxlVHlwZURlZiAqaHNwaSwgSEFMX1NQSV9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKSB7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhzcGkpOworCisgIGlmIChIQUxfU1BJX1NUQVRFX1JFQURZID09IGhzcGktPlN0YXRlKSB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKSB7CisgICAgICBjYXNlIEhBTF9TUElfVFhfQ09NUExFVEVfQ0JfSUQ6CisgICAgICAgIGhzcGktPlR4Q3BsdENhbGxiYWNrID0KKyAgICAgICAgICAgIEhBTF9TUElfVHhDcGx0Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIFR4Q3BsdENhbGxiYWNrICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TUElfUlhfQ09NUExFVEVfQ0JfSUQ6CisgICAgICAgIGhzcGktPlJ4Q3BsdENhbGxiYWNrID0KKyAgICAgICAgICAgIEhBTF9TUElfUnhDcGx0Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIFJ4Q3BsdENhbGxiYWNrICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TUElfVFhfUlhfQ09NUExFVEVfQ0JfSUQ6CisgICAgICAgIGhzcGktPlR4UnhDcGx0Q2FsbGJhY2sgPQorICAgICAgICAgICAgSEFMX1NQSV9UeFJ4Q3BsdENhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBUeFJ4Q3BsdENhbGxiYWNrICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfU1BJX1RYX0hBTEZfQ09NUExFVEVfQ0JfSUQ6CisgICAgICAgIGhzcGktPlR4SGFsZkNwbHRDYWxsYmFjayA9CisgICAgICAgICAgICBIQUxfU1BJX1R4SGFsZkNwbHRDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgVHhIYWxmQ3BsdENhbGxiYWNrICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1NQSV9SWF9IQUxGX0NPTVBMRVRFX0NCX0lEOgorICAgICAgICBoc3BpLT5SeEhhbGZDcGx0Q2FsbGJhY2sgPQorICAgICAgICAgICAgSEFMX1NQSV9SeEhhbGZDcGx0Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIFJ4SGFsZkNwbHRDYWxsYmFjayAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TUElfVFhfUlhfSEFMRl9DT01QTEVURV9DQl9JRDoKKyAgICAgICAgaHNwaS0+VHhSeEhhbGZDcGx0Q2FsbGJhY2sgPQorICAgICAgICAgICAgSEFMX1NQSV9UeFJ4SGFsZkNwbHRDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgVHhSeEhhbGZDcGx0Q2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1NQSV9FUlJPUl9DQl9JRDoKKyAgICAgICAgaHNwaS0+RXJyb3JDYWxsYmFjayA9CisgICAgICAgICAgICBIQUxfU1BJX0Vycm9yQ2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIEVycm9yQ2FsbGJhY2sgICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TUElfQUJPUlRfQ0JfSUQ6CisgICAgICAgIGhzcGktPkFib3J0Q3BsdENhbGxiYWNrID0KKyAgICAgICAgICAgIEhBTF9TUElfQWJvcnRDcGx0Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIEFib3J0Q3BsdENhbGxiYWNrICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TUElfTVNQSU5JVF9DQl9JRDoKKyAgICAgICAgaHNwaS0+TXNwSW5pdENhbGxiYWNrID0gSEFMX1NQSV9Nc3BJbml0OyAvKiBMZWdhY3kgd2VhayBNc3BJbml0ICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TUElfTVNQREVJTklUX0NCX0lEOgorICAgICAgICBoc3BpLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9TUElfTXNwRGVJbml0OyAvKiBMZWdhY3kgd2VhayBNc3BEZUluaXQgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9JTlZBTElEX0NBTExCQUNLKTsKKworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9IGVsc2UgaWYgKEhBTF9TUElfU1RBVEVfUkVTRVQgPT0gaHNwaS0+U3RhdGUpIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpIHsKKyAgICAgIGNhc2UgSEFMX1NQSV9NU1BJTklUX0NCX0lEOgorICAgICAgICBoc3BpLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfU1BJX01zcEluaXQ7IC8qIExlZ2FjeSB3ZWFrIE1zcEluaXQgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1NQSV9NU1BERUlOSVRfQ0JfSUQ6CisgICAgICAgIGhzcGktPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX1NQSV9Nc3BEZUluaXQ7IC8qIExlZ2FjeSB3ZWFrIE1zcERlSW5pdCAqLworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0spOworCisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfSU5WQUxJRF9DQUxMQkFDSyk7CisKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhoc3BpKTsKKyAgcmV0dXJuIHN0YXR1czsKK30KKyNlbmRpZiAvKiBVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFNQSV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKiAgQGJyaWVmICAgRGF0YSB0cmFuc2ZlcnMgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIG1hbmFnZSB0aGUgU1BJCisgICAgZGF0YSB0cmFuc2ZlcnMuCisKKyAgICBbLi5dIFRoZSBTUEkgc3VwcG9ydHMgbWFzdGVyIGFuZCBzbGF2ZSBtb2RlIDoKKworICAgICgjKSBUaGVyZSBhcmUgdHdvIG1vZGVzIG9mIHRyYW5zZmVyOgorICAgICAgICgrKykgQmxvY2tpbmcgbW9kZTogVGhlIGNvbW11bmljYXRpb24gaXMgcGVyZm9ybWVkIGluIHBvbGxpbmcgbW9kZS4KKyAgICAgICAgICAgIFRoZSBIQUwgc3RhdHVzIG9mIGFsbCBkYXRhIHByb2Nlc3NpbmcgaXMgcmV0dXJuZWQgYnkgdGhlIHNhbWUKK2Z1bmN0aW9uIGFmdGVyIGZpbmlzaGluZyB0cmFuc2Zlci4KKyAgICAgICAoKyspIE5vLUJsb2NraW5nIG1vZGU6IFRoZSBjb21tdW5pY2F0aW9uIGlzIHBlcmZvcm1lZCB1c2luZyBJbnRlcnJ1cHRzCisgICAgICAgICAgICBvciBETUEsIFRoZXNlIEFQSXMgcmV0dXJuIHRoZSBIQUwgc3RhdHVzLgorICAgICAgICAgICAgVGhlIGVuZCBvZiB0aGUgZGF0YSBwcm9jZXNzaW5nIHdpbGwgYmUgaW5kaWNhdGVkIHRocm91Z2ggdGhlCisgICAgICAgICAgICBkZWRpY2F0ZWQgU1BJIElSUSB3aGVuIHVzaW5nIEludGVycnVwdCBtb2RlIG9yIHRoZSBETUEgSVJRIHdoZW4KKyAgICAgICAgICAgIHVzaW5nIERNQSBtb2RlLgorICAgICAgICAgICAgVGhlIEhBTF9TUElfVHhDcGx0Q2FsbGJhY2soKSwgSEFMX1NQSV9SeENwbHRDYWxsYmFjaygpIGFuZAorSEFMX1NQSV9UeFJ4Q3BsdENhbGxiYWNrKCkgdXNlciBjYWxsYmFja3Mgd2lsbCBiZSBleGVjdXRlZCByZXNwZWN0aXZlbHkgYXQgdGhlCitlbmQgb2YgdGhlIHRyYW5zbWl0IG9yIFJlY2VpdmUgcHJvY2VzcyBUaGUgSEFMX1NQSV9FcnJvckNhbGxiYWNrKCl1c2VyIGNhbGxiYWNrCit3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gYSBjb21tdW5pY2F0aW9uIGVycm9yIGlzIGRldGVjdGVkCisKKyAgICAoIykgQVBJcyBwcm92aWRlZCBmb3IgdGhlc2UgMiB0cmFuc2ZlciBtb2RlcyAoQmxvY2tpbmcgbW9kZSBvciBOb24gYmxvY2tpbmcKK21vZGUgdXNpbmcgZWl0aGVyIEludGVycnVwdCBvciBETUEpIGV4aXN0IGZvciAxTGluZSAoc2ltcGxleCkgYW5kIDJMaW5lcyAoZnVsbAorZHVwbGV4KSBtb2Rlcy4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgKiBAYnJpZWYgIFRyYW5zbWl0IGFuIGFtb3VudCBvZiBkYXRhIGluIGJsb2NraW5nIG1vZGUuCisgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICogQHBhcmFtICBwRGF0YSBwb2ludGVyIHRvIGRhdGEgYnVmZmVyCisgKiBAcGFyYW0gIFNpemUgYW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudAorICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX1RyYW5zbWl0KFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZW91dCkgeworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisgIHVpbnQxNl90IGluaXRpYWxfVHhYZmVyQ291bnQ7CisKKyAgLyogQ2hlY2sgRGlyZWN0aW9uIHBhcmFtZXRlciAqLworICBhc3NlcnRfcGFyYW0oSVNfU1BJX0RJUkVDVElPTl8yTElORVNfT1JfMUxJTkUoaHNwaS0+SW5pdC5EaXJlY3Rpb24pKTsKKworICAvKiBJbml0IHRpY2tzdGFydCBmb3IgdGltZW91dCBtYW5hZ2VtZW50Ki8KKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKyAgaW5pdGlhbF9UeFhmZXJDb3VudCA9IFNpemU7CisKKyAgaWYgKGhzcGktPlN0YXRlICE9IEhBTF9TUElfU1RBVEVfUkVBRFkpIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KKworICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhzcGkpOworCisgIC8qIFNldCB0aGUgdHJhbnNhY3Rpb24gaW5mb3JtYXRpb24gKi8KKyAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX0JVU1lfVFg7CisgIGhzcGktPkVycm9yQ29kZSA9IEhBTF9TUElfRVJST1JfTk9ORTsKKyAgaHNwaS0+cFR4QnVmZlB0ciA9IChjb25zdCB1aW50OF90ICopcERhdGE7CisgIGhzcGktPlR4WGZlclNpemUgPSBTaXplOworICBoc3BpLT5UeFhmZXJDb3VudCA9IFNpemU7CisKKyAgLypJbml0IGZpZWxkIG5vdCB1c2VkIGluIGhhbmRsZSB0byB6ZXJvICovCisgIGhzcGktPnBSeEJ1ZmZQdHIgPSAodWludDhfdCAqKU5VTEw7CisgIGhzcGktPlJ4WGZlclNpemUgPSAwVTsKKyAgaHNwaS0+UnhYZmVyQ291bnQgPSAwVTsKKyAgaHNwaS0+VHhJU1IgPSBOVUxMOworICBoc3BpLT5SeElTUiA9IE5VTEw7CisKKyAgLyogQ29uZmlndXJlIGNvbW11bmljYXRpb24gZGlyZWN0aW9uIDogMUxpbmUgKi8KKyAgaWYgKGhzcGktPkluaXQuRGlyZWN0aW9uID09IFNQSV9ESVJFQ1RJT05fMUxJTkUpIHsKKyAgICAvKiBEaXNhYmxlIFNQSSBQZXJpcGhlcmFsIGJlZm9yZSBzZXQgMUxpbmUgZGlyZWN0aW9uIChCSURJT0UgYml0KSAqLworICAgIF9fSEFMX1NQSV9ESVNBQkxFKGhzcGkpOworICAgIFNQSV8xTElORV9UWChoc3BpKTsKKyAgfQorCisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAvKiBSZXNldCBDUkMgQ2FsY3VsYXRpb24gKi8KKyAgaWYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkgeworICAgIFNQSV9SRVNFVF9DUkMoaHNwaSk7CisgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisgIC8qIENoZWNrIGlmIHRoZSBTUEkgaXMgYWxyZWFkeSBlbmFibGVkICovCisgIGlmICgoaHNwaS0+SW5zdGFuY2UtPkNSMSAmIFNQSV9DUjFfU1BFKSAhPSBTUElfQ1IxX1NQRSkgeworICAgIC8qIEVuYWJsZSBTUEkgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX1NQSV9FTkFCTEUoaHNwaSk7CisgIH0KKworICAvKiBUcmFuc21pdCBkYXRhIGluIDE2IEJpdCBtb2RlICovCisgIGlmIChoc3BpLT5Jbml0LkRhdGFTaXplID4gU1BJX0RBVEFTSVpFXzhCSVQpIHsKKyAgICBpZiAoKGhzcGktPkluaXQuTW9kZSA9PSBTUElfTU9ERV9TTEFWRSkgfHwgKGluaXRpYWxfVHhYZmVyQ291bnQgPT0gMHgwMVUpKSB7CisgICAgICBoc3BpLT5JbnN0YW5jZS0+RFIgPSAqKChjb25zdCB1aW50MTZfdCAqKWhzcGktPnBUeEJ1ZmZQdHIpOworICAgICAgaHNwaS0+cFR4QnVmZlB0ciArPSBzaXplb2YodWludDE2X3QpOworICAgICAgaHNwaS0+VHhYZmVyQ291bnQtLTsKKyAgICB9CisgICAgLyogVHJhbnNtaXQgZGF0YSBpbiAxNiBCaXQgbW9kZSAqLworICAgIHdoaWxlIChoc3BpLT5UeFhmZXJDb3VudCA+IDBVKSB7CisgICAgICAvKiBXYWl0IHVudGlsIFRYRSBmbGFnIGlzIHNldCB0byBzZW5kIGRhdGEgKi8KKyAgICAgIGlmIChfX0hBTF9TUElfR0VUX0ZMQUcoaHNwaSwgU1BJX0ZMQUdfVFhFKSkgeworICAgICAgICBoc3BpLT5JbnN0YW5jZS0+RFIgPSAqKChjb25zdCB1aW50MTZfdCAqKWhzcGktPnBUeEJ1ZmZQdHIpOworICAgICAgICBoc3BpLT5wVHhCdWZmUHRyICs9IHNpemVvZih1aW50MTZfdCk7CisgICAgICAgIGhzcGktPlR4WGZlckNvdW50LS07CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBUaW1lb3V0IG1hbmFnZW1lbnQgKi8KKyAgICAgICAgaWYgKCgoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID49IFRpbWVvdXQpICYmCisgICAgICAgICAgICAgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkpIHx8CisgICAgICAgICAgICAoVGltZW91dCA9PSAwVSkpIHsKKyAgICAgICAgICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfUkVBRFk7CisgICAgICAgICAgX19IQUxfVU5MT0NLKGhzcGkpOworICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICAvKiBUcmFuc21pdCBkYXRhIGluIDggQml0IG1vZGUgKi8KKyAgZWxzZSB7CisgICAgaWYgKChoc3BpLT5Jbml0Lk1vZGUgPT0gU1BJX01PREVfU0xBVkUpIHx8IChpbml0aWFsX1R4WGZlckNvdW50ID09IDB4MDFVKSkgeworICAgICAgaWYgKGhzcGktPlR4WGZlckNvdW50ID4gMVUpIHsKKyAgICAgICAgLyogd3JpdGUgb24gdGhlIGRhdGEgcmVnaXN0ZXIgaW4gcGFja2luZyBtb2RlICovCisgICAgICAgIGhzcGktPkluc3RhbmNlLT5EUiA9ICooKGNvbnN0IHVpbnQxNl90ICopaHNwaS0+cFR4QnVmZlB0cik7CisgICAgICAgIGhzcGktPnBUeEJ1ZmZQdHIgKz0gc2l6ZW9mKHVpbnQxNl90KTsKKyAgICAgICAgaHNwaS0+VHhYZmVyQ291bnQgLT0gMlU7CisgICAgICB9IGVsc2UgeworICAgICAgICAqKChfX0lPIHVpbnQ4X3QgKikmaHNwaS0+SW5zdGFuY2UtPkRSKSA9CisgICAgICAgICAgICAqKChjb25zdCB1aW50OF90ICopaHNwaS0+cFR4QnVmZlB0cik7CisgICAgICAgIGhzcGktPnBUeEJ1ZmZQdHIrKzsKKyAgICAgICAgaHNwaS0+VHhYZmVyQ291bnQtLTsKKyAgICAgIH0KKyAgICB9CisgICAgd2hpbGUgKGhzcGktPlR4WGZlckNvdW50ID4gMFUpIHsKKyAgICAgIC8qIFdhaXQgdW50aWwgVFhFIGZsYWcgaXMgc2V0IHRvIHNlbmQgZGF0YSAqLworICAgICAgaWYgKF9fSEFMX1NQSV9HRVRfRkxBRyhoc3BpLCBTUElfRkxBR19UWEUpKSB7CisgICAgICAgIGlmIChoc3BpLT5UeFhmZXJDb3VudCA+IDFVKSB7CisgICAgICAgICAgLyogd3JpdGUgb24gdGhlIGRhdGEgcmVnaXN0ZXIgaW4gcGFja2luZyBtb2RlICovCisgICAgICAgICAgaHNwaS0+SW5zdGFuY2UtPkRSID0gKigoY29uc3QgdWludDE2X3QgKiloc3BpLT5wVHhCdWZmUHRyKTsKKyAgICAgICAgICBoc3BpLT5wVHhCdWZmUHRyICs9IHNpemVvZih1aW50MTZfdCk7CisgICAgICAgICAgaHNwaS0+VHhYZmVyQ291bnQgLT0gMlU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgKigoX19JTyB1aW50OF90ICopJmhzcGktPkluc3RhbmNlLT5EUikgPQorICAgICAgICAgICAgICAqKChjb25zdCB1aW50OF90ICopaHNwaS0+cFR4QnVmZlB0cik7CisgICAgICAgICAgaHNwaS0+cFR4QnVmZlB0cisrOworICAgICAgICAgIGhzcGktPlR4WGZlckNvdW50LS07CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFRpbWVvdXQgbWFuYWdlbWVudCAqLworICAgICAgICBpZiAoKCgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPj0gVGltZW91dCkgJiYKKyAgICAgICAgICAgICAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKSkgfHwKKyAgICAgICAgICAgIChUaW1lb3V0ID09IDBVKSkgeworICAgICAgICAgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9SRUFEWTsKKyAgICAgICAgICBfX0hBTF9VTkxPQ0soaHNwaSk7CisgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAvKiBFbmFibGUgQ1JDIFRyYW5zbWlzc2lvbiAqLworICBpZiAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKSB7CisgICAgU0VUX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IxLCBTUElfQ1IxX0NSQ05FWFQpOworICB9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKworICAvKiBDaGVjayB0aGUgZW5kIG9mIHRoZSB0cmFuc2FjdGlvbiAqLworICBpZiAoU1BJX0VuZFJ4VHhUcmFuc2FjdGlvbihoc3BpLCBUaW1lb3V0LCB0aWNrc3RhcnQpICE9IEhBTF9PSykgeworICAgIGhzcGktPkVycm9yQ29kZSA9IEhBTF9TUElfRVJST1JfRkxBRzsKKyAgfQorCisgIC8qIENsZWFyIG92ZXJydW4gZmxhZyBpbiAyIExpbmVzIGNvbW11bmljYXRpb24gbW9kZSBiZWNhdXNlIHJlY2VpdmVkIGlzIG5vdAorICAgKiByZWFkICovCisgIGlmIChoc3BpLT5Jbml0LkRpcmVjdGlvbiA9PSBTUElfRElSRUNUSU9OXzJMSU5FUykgeworICAgIF9fSEFMX1NQSV9DTEVBUl9PVlJGTEFHKGhzcGkpOworICB9CisKKyAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX1JFQURZOworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoc3BpKTsKKworICBpZiAoaHNwaS0+RXJyb3JDb2RlICE9IEhBTF9TUElfRVJST1JfTk9ORSkgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorfQorCisvKioKKyAqIEBicmllZiAgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlLgorICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAqIEBwYXJhbSAgcERhdGEgcG9pbnRlciB0byBkYXRhIGJ1ZmZlcgorICogQHBhcmFtICBTaXplIGFtb3VudCBvZiBkYXRhIHRvIGJlIHJlY2VpdmVkCisgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbgorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfUmVjZWl2ZShTUElfSGFuZGxlVHlwZURlZiAqaHNwaSwgdWludDhfdCAqcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCkgeworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgX19JTyB1aW50MzJfdCB0bXByZWcgPSAwVTsKKyAgX19JTyB1aW50OF90ICpwdG1wcmVnODsKKyAgX19JTyB1aW50OF90IHRtcHJlZzggPSAwOworI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisgIHVpbnQzMl90IHRpY2tzdGFydDsKKworICBpZiAoaHNwaS0+U3RhdGUgIT0gSEFMX1NQSV9TVEFURV9SRUFEWSkgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorCisgIGlmICgocERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKSB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIGlmICgoaHNwaS0+SW5pdC5Nb2RlID09IFNQSV9NT0RFX01BU1RFUikgJiYKKyAgICAgIChoc3BpLT5Jbml0LkRpcmVjdGlvbiA9PSBTUElfRElSRUNUSU9OXzJMSU5FUykpIHsKKyAgICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfQlVTWV9SWDsKKyAgICAvKiBDYWxsIHRyYW5zbWl0LXJlY2VpdmUgZnVuY3Rpb24gdG8gc2VuZCBEdW1teSBkYXRhIG9uIFR4IGxpbmUgYW5kIGdlbmVyYXRlCisgICAgICogY2xvY2sgb24gQ0xLIGxpbmUgKi8KKyAgICByZXR1cm4gSEFMX1NQSV9UcmFuc21pdFJlY2VpdmUoaHNwaSwgcERhdGEsIHBEYXRhLCBTaXplLCBUaW1lb3V0KTsKKyAgfQorCisgIC8qIEluaXQgdGlja3N0YXJ0IGZvciB0aW1lb3V0IG1hbmFnZW1lbnQqLworICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHNwaSk7CisKKyAgLyogU2V0IHRoZSB0cmFuc2FjdGlvbiBpbmZvcm1hdGlvbiAqLworICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfQlVTWV9SWDsKKyAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9OT05FOworICBoc3BpLT5wUnhCdWZmUHRyID0gKHVpbnQ4X3QgKilwRGF0YTsKKyAgaHNwaS0+UnhYZmVyU2l6ZSA9IFNpemU7CisgIGhzcGktPlJ4WGZlckNvdW50ID0gU2l6ZTsKKworICAvKkluaXQgZmllbGQgbm90IHVzZWQgaW4gaGFuZGxlIHRvIHplcm8gKi8KKyAgaHNwaS0+cFR4QnVmZlB0ciA9ICh1aW50OF90ICopTlVMTDsKKyAgaHNwaS0+VHhYZmVyU2l6ZSA9IDBVOworICBoc3BpLT5UeFhmZXJDb3VudCA9IDBVOworICBoc3BpLT5SeElTUiA9IE5VTEw7CisgIGhzcGktPlR4SVNSID0gTlVMTDsKKworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgLyogUmVzZXQgQ1JDIENhbGN1bGF0aW9uICovCisgIGlmIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpIHsKKyAgICBTUElfUkVTRVRfQ1JDKGhzcGkpOworICAgIC8qIHRoaXMgaXMgZG9uZSB0byBoYW5kbGUgdGhlIENSQ05FWFQgYmVmb3JlIHRoZSBsYXRlc3QgZGF0YSAqLworICAgIGhzcGktPlJ4WGZlckNvdW50LS07CisgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisgIC8qIFNldCB0aGUgUnggRmlmbyB0aHJlc2hvbGQgKi8KKyAgaWYgKGhzcGktPkluaXQuRGF0YVNpemUgPiBTUElfREFUQVNJWkVfOEJJVCkgeworICAgIC8qIFNldCBSWCBGaWZvIHRocmVzaG9sZCBhY2NvcmRpbmcgdGhlIHJlY2VwdGlvbiBkYXRhIGxlbmd0aDogMTZiaXQgKi8KKyAgICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX1JYRklGT19USFJFU0hPTEQpOworICB9IGVsc2UgeworICAgIC8qIFNldCBSWCBGaWZvIHRocmVzaG9sZCBhY2NvcmRpbmcgdGhlIHJlY2VwdGlvbiBkYXRhIGxlbmd0aDogOGJpdCAqLworICAgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX1JYRklGT19USFJFU0hPTEQpOworICB9CisKKyAgLyogQ29uZmlndXJlIGNvbW11bmljYXRpb24gZGlyZWN0aW9uOiAxTGluZSAqLworICBpZiAoaHNwaS0+SW5pdC5EaXJlY3Rpb24gPT0gU1BJX0RJUkVDVElPTl8xTElORSkgeworICAgIC8qIERpc2FibGUgU1BJIFBlcmlwaGVyYWwgYmVmb3JlIHNldCAxTGluZSBkaXJlY3Rpb24gKEJJRElPRSBiaXQpICovCisgICAgX19IQUxfU1BJX0RJU0FCTEUoaHNwaSk7CisgICAgU1BJXzFMSU5FX1JYKGhzcGkpOworICB9CisKKyAgLyogQ2hlY2sgaWYgdGhlIFNQSSBpcyBhbHJlYWR5IGVuYWJsZWQgKi8KKyAgaWYgKChoc3BpLT5JbnN0YW5jZS0+Q1IxICYgU1BJX0NSMV9TUEUpICE9IFNQSV9DUjFfU1BFKSB7CisgICAgLyogRW5hYmxlIFNQSSBwZXJpcGhlcmFsICovCisgICAgX19IQUxfU1BJX0VOQUJMRShoc3BpKTsKKyAgfQorCisgIC8qIFJlY2VpdmUgZGF0YSBpbiA4IEJpdCBtb2RlICovCisgIGlmIChoc3BpLT5Jbml0LkRhdGFTaXplIDw9IFNQSV9EQVRBU0laRV84QklUKSB7CisgICAgLyogVHJhbnNmZXIgbG9vcCAqLworICAgIHdoaWxlIChoc3BpLT5SeFhmZXJDb3VudCA+IDBVKSB7CisgICAgICAvKiBDaGVjayB0aGUgUlhORSBmbGFnICovCisgICAgICBpZiAoX19IQUxfU1BJX0dFVF9GTEFHKGhzcGksIFNQSV9GTEFHX1JYTkUpKSB7CisgICAgICAgIC8qIHJlYWQgdGhlIHJlY2VpdmVkIGRhdGEgKi8KKyAgICAgICAgKCoodWludDhfdCAqKWhzcGktPnBSeEJ1ZmZQdHIpID0gKihfX0lPIHVpbnQ4X3QgKikmaHNwaS0+SW5zdGFuY2UtPkRSOworICAgICAgICBoc3BpLT5wUnhCdWZmUHRyICs9IHNpemVvZih1aW50OF90KTsKKyAgICAgICAgaHNwaS0+UnhYZmVyQ291bnQtLTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFRpbWVvdXQgbWFuYWdlbWVudCAqLworICAgICAgICBpZiAoKCgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPj0gVGltZW91dCkgJiYKKyAgICAgICAgICAgICAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKSkgfHwKKyAgICAgICAgICAgIChUaW1lb3V0ID09IDBVKSkgeworICAgICAgICAgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9SRUFEWTsKKyAgICAgICAgICBfX0hBTF9VTkxPQ0soaHNwaSk7CisgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIC8qIFRyYW5zZmVyIGxvb3AgKi8KKyAgICB3aGlsZSAoaHNwaS0+UnhYZmVyQ291bnQgPiAwVSkgeworICAgICAgLyogQ2hlY2sgdGhlIFJYTkUgZmxhZyAqLworICAgICAgaWYgKF9fSEFMX1NQSV9HRVRfRkxBRyhoc3BpLCBTUElfRkxBR19SWE5FKSkgeworICAgICAgICAqKCh1aW50MTZfdCAqKWhzcGktPnBSeEJ1ZmZQdHIpID0gKHVpbnQxNl90KWhzcGktPkluc3RhbmNlLT5EUjsKKyAgICAgICAgaHNwaS0+cFJ4QnVmZlB0ciArPSBzaXplb2YodWludDE2X3QpOworICAgICAgICBoc3BpLT5SeFhmZXJDb3VudC0tOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogVGltZW91dCBtYW5hZ2VtZW50ICovCisgICAgICAgIGlmICgoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+PSBUaW1lb3V0KSAmJgorICAgICAgICAgICAgIChUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpKSB8fAorICAgICAgICAgICAgKFRpbWVvdXQgPT0gMFUpKSB7CisgICAgICAgICAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX1JFQURZOworICAgICAgICAgIF9fSEFMX1VOTE9DSyhoc3BpKTsKKyAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgLyogSGFuZGxlIHRoZSBDUkMgVHJhbnNtaXNzaW9uICovCisgIGlmIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpIHsKKyAgICAvKiBmcmVlemUgdGhlIENSQyBiZWZvcmUgdGhlIGxhdGVzdCBkYXRhICovCisgICAgU0VUX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IxLCBTUElfQ1IxX0NSQ05FWFQpOworCisgICAgLyogUmVhZCB0aGUgbGF0ZXN0IGRhdGEgKi8KKyAgICBpZiAoU1BJX1dhaXRGbGFnU3RhdGVVbnRpbFRpbWVvdXQoaHNwaSwgU1BJX0ZMQUdfUlhORSwgU0VULCBUaW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWNrc3RhcnQpICE9IEhBTF9PSykgeworICAgICAgLyogdGhlIGxhdGVzdCBkYXRhIGhhcyBub3QgYmVlbiByZWNlaXZlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhzcGkpOworICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgIH0KKworICAgIC8qIFJlY2VpdmUgbGFzdCBkYXRhIGluIDE2IEJpdCBtb2RlICovCisgICAgaWYgKGhzcGktPkluaXQuRGF0YVNpemUgPiBTUElfREFUQVNJWkVfOEJJVCkgeworICAgICAgKigodWludDE2X3QgKiloc3BpLT5wUnhCdWZmUHRyKSA9ICh1aW50MTZfdCloc3BpLT5JbnN0YW5jZS0+RFI7CisgICAgfQorICAgIC8qIFJlY2VpdmUgbGFzdCBkYXRhIGluIDggQml0IG1vZGUgKi8KKyAgICBlbHNlIHsKKyAgICAgICgqKHVpbnQ4X3QgKiloc3BpLT5wUnhCdWZmUHRyKSA9ICooX19JTyB1aW50OF90ICopJmhzcGktPkluc3RhbmNlLT5EUjsKKyAgICB9CisKKyAgICAvKiBXYWl0IHRoZSBDUkMgZGF0YSAqLworICAgIGlmIChTUElfV2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChoc3BpLCBTUElfRkxBR19SWE5FLCBTRVQsIFRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpY2tzdGFydCkgIT0gSEFMX09LKSB7CisgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9DUkMpOworICAgICAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX1JFQURZOworICAgICAgX19IQUxfVU5MT0NLKGhzcGkpOworICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgIH0KKworICAgIC8qIFJlYWQgQ1JDIHRvIEZsdXNoIERSIGFuZCBSWE5FIGZsYWcgKi8KKyAgICBpZiAoaHNwaS0+SW5pdC5EYXRhU2l6ZSA9PSBTUElfREFUQVNJWkVfMTZCSVQpIHsKKyAgICAgIC8qIFJlYWQgMTZiaXQgQ1JDICovCisgICAgICB0bXByZWcgPSBSRUFEX1JFRyhoc3BpLT5JbnN0YW5jZS0+RFIpOworICAgICAgLyogVG8gYXZvaWQgR0NDIHdhcm5pbmcgKi8KKyAgICAgIFVOVVNFRCh0bXByZWcpOworICAgIH0gZWxzZSB7CisgICAgICAvKiBJbml0aWFsaXplIHRoZSA4Yml0IHRlbXBvcmFyeSBwb2ludGVyICovCisgICAgICBwdG1wcmVnOCA9IChfX0lPIHVpbnQ4X3QgKikmaHNwaS0+SW5zdGFuY2UtPkRSOworICAgICAgLyogUmVhZCA4Yml0IENSQyAqLworICAgICAgdG1wcmVnOCA9ICpwdG1wcmVnODsKKyAgICAgIC8qIFRvIGF2b2lkIEdDQyB3YXJuaW5nICovCisgICAgICBVTlVTRUQodG1wcmVnOCk7CisKKyAgICAgIGlmICgoaHNwaS0+SW5pdC5EYXRhU2l6ZSA9PSBTUElfREFUQVNJWkVfOEJJVCkgJiYKKyAgICAgICAgICAoaHNwaS0+SW5pdC5DUkNMZW5ndGggPT0gU1BJX0NSQ19MRU5HVEhfMTZCSVQpKSB7CisgICAgICAgIGlmIChTUElfV2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChoc3BpLCBTUElfRkxBR19SWE5FLCBTRVQsIFRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWNrc3RhcnQpICE9IEhBTF9PSykgeworICAgICAgICAgIC8qIEVycm9yIG9uIHRoZSBDUkMgcmVjZXB0aW9uICovCisgICAgICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfQ1JDKTsKKyAgICAgICAgICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfUkVBRFk7CisgICAgICAgICAgX19IQUxfVU5MT0NLKGhzcGkpOworICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgfQorICAgICAgICAvKiBSZWFkIDhiaXQgQ1JDIGFnYWluIGluIGNhc2Ugb2YgMTZiaXQgQ1JDIGluIDhiaXQgRGF0YSBtb2RlICovCisgICAgICAgIHRtcHJlZzggPSAqcHRtcHJlZzg7CisgICAgICAgIC8qIFRvIGF2b2lkIEdDQyB3YXJuaW5nICovCisgICAgICAgIFVOVVNFRCh0bXByZWc4KTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisgIC8qIENoZWNrIHRoZSBlbmQgb2YgdGhlIHRyYW5zYWN0aW9uICovCisgIGlmIChTUElfRW5kUnhUcmFuc2FjdGlvbihoc3BpLCBUaW1lb3V0LCB0aWNrc3RhcnQpICE9IEhBTF9PSykgeworICAgIGhzcGktPkVycm9yQ29kZSA9IEhBTF9TUElfRVJST1JfRkxBRzsKKyAgfQorCisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAvKiBDaGVjayBpZiBDUkMgZXJyb3Igb2NjdXJyZWQgKi8KKyAgaWYgKF9fSEFMX1NQSV9HRVRfRkxBRyhoc3BpLCBTUElfRkxBR19DUkNFUlIpKSB7CisgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfQ1JDKTsKKyAgICBfX0hBTF9TUElfQ0xFQVJfQ1JDRVJSRkxBRyhoc3BpKTsKKyAgfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisKKyAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX1JFQURZOworICAvKiBVbmxvY2sgdGhlIHByb2Nlc3MgKi8KKyAgX19IQUxfVU5MT0NLKGhzcGkpOworICBpZiAoaHNwaS0+RXJyb3JDb2RlICE9IEhBTF9TUElfRVJST1JfTk9ORSkgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorfQorCisvKioKKyAqIEBicmllZiAgVHJhbnNtaXQgYW5kIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZS4KKyAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgKiBAcGFyYW0gIHBUeERhdGEgcG9pbnRlciB0byB0cmFuc21pc3Npb24gZGF0YSBidWZmZXIKKyAqIEBwYXJhbSAgcFJ4RGF0YSBwb2ludGVyIHRvIHJlY2VwdGlvbiBkYXRhIGJ1ZmZlcgorICogQHBhcmFtICBTaXplIGFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQgYW5kIHJlY2VpdmVkCisgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbgorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfVHJhbnNtaXRSZWNlaXZlKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcFR4RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBSeERhdGEsIHVpbnQxNl90IFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lb3V0KSB7CisgIHVpbnQxNl90IGluaXRpYWxfVHhYZmVyQ291bnQ7CisgIHVpbnQxNl90IGluaXRpYWxfUnhYZmVyQ291bnQ7CisgIHVpbnQzMl90IHRtcF9tb2RlOworICBIQUxfU1BJX1N0YXRlVHlwZURlZiB0bXBfc3RhdGU7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgIF9fSU8gdWludDMyX3QgdG1wcmVnID0gMFU7CisgIHVpbnQzMl90IHNwaV9jcjE7CisgIHVpbnQzMl90IHNwaV9jcjI7CisgIF9fSU8gdWludDhfdCAqcHRtcHJlZzg7CisgIF9fSU8gdWludDhfdCB0bXByZWc4ID0gMDsKKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisgIC8qIFZhcmlhYmxlIHVzZWQgdG8gYWx0ZXJuYXRlIFJ4IGFuZCBUeCBkdXJpbmcgdHJhbnNmZXIgKi8KKyAgdWludDMyX3QgdHhhbGxvd2VkID0gMVU7CisKKyAgLyogQ2hlY2sgRGlyZWN0aW9uIHBhcmFtZXRlciAqLworICBhc3NlcnRfcGFyYW0oSVNfU1BJX0RJUkVDVElPTl8yTElORVMoaHNwaS0+SW5pdC5EaXJlY3Rpb24pKTsKKworICAvKiBJbml0IHRpY2tzdGFydCBmb3IgdGltZW91dCBtYW5hZ2VtZW50Ki8KKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAvKiBJbml0IHRlbXBvcmFyeSB2YXJpYWJsZXMgKi8KKyAgdG1wX3N0YXRlID0gaHNwaS0+U3RhdGU7CisgIHRtcF9tb2RlID0gaHNwaS0+SW5pdC5Nb2RlOworICBpbml0aWFsX1R4WGZlckNvdW50ID0gU2l6ZTsKKyAgaW5pdGlhbF9SeFhmZXJDb3VudCA9IFNpemU7CisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICBzcGlfY3IxID0gUkVBRF9SRUcoaHNwaS0+SW5zdGFuY2UtPkNSMSk7CisgIHNwaV9jcjIgPSBSRUFEX1JFRyhoc3BpLT5JbnN0YW5jZS0+Q1IyKTsKKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisgIGlmICghKCh0bXBfc3RhdGUgPT0gSEFMX1NQSV9TVEFURV9SRUFEWSkgfHwKKyAgICAgICAgKCh0bXBfbW9kZSA9PSBTUElfTU9ERV9NQVNURVIpICYmCisgICAgICAgICAoaHNwaS0+SW5pdC5EaXJlY3Rpb24gPT0gU1BJX0RJUkVDVElPTl8yTElORVMpICYmCisgICAgICAgICAodG1wX3N0YXRlID09IEhBTF9TUElfU1RBVEVfQlVTWV9SWCkpKSkgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorCisgIGlmICgocFR4RGF0YSA9PSBOVUxMKSB8fCAocFJ4RGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoc3BpKTsKKworICAvKiBEb24ndCBvdmVyd3JpdGUgaW4gY2FzZSBvZiBIQUxfU1BJX1NUQVRFX0JVU1lfUlggKi8KKyAgaWYgKGhzcGktPlN0YXRlICE9IEhBTF9TUElfU1RBVEVfQlVTWV9SWCkgeworICAgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9CVVNZX1RYX1JYOworICB9CisKKyAgLyogU2V0IHRoZSB0cmFuc2FjdGlvbiBpbmZvcm1hdGlvbiAqLworICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX05PTkU7CisgIGhzcGktPnBSeEJ1ZmZQdHIgPSAodWludDhfdCAqKXBSeERhdGE7CisgIGhzcGktPlJ4WGZlckNvdW50ID0gU2l6ZTsKKyAgaHNwaS0+UnhYZmVyU2l6ZSA9IFNpemU7CisgIGhzcGktPnBUeEJ1ZmZQdHIgPSAoY29uc3QgdWludDhfdCAqKXBUeERhdGE7CisgIGhzcGktPlR4WGZlckNvdW50ID0gU2l6ZTsKKyAgaHNwaS0+VHhYZmVyU2l6ZSA9IFNpemU7CisKKyAgLypJbml0IGZpZWxkIG5vdCB1c2VkIGluIGhhbmRsZSB0byB6ZXJvICovCisgIGhzcGktPlJ4SVNSID0gTlVMTDsKKyAgaHNwaS0+VHhJU1IgPSBOVUxMOworCisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAvKiBSZXNldCBDUkMgQ2FsY3VsYXRpb24gKi8KKyAgaWYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkgeworICAgIFNQSV9SRVNFVF9DUkMoaHNwaSk7CisgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisgIC8qIFNldCB0aGUgUnggRmlmbyB0aHJlc2hvbGQgKi8KKyAgaWYgKChoc3BpLT5Jbml0LkRhdGFTaXplID4gU1BJX0RBVEFTSVpFXzhCSVQpIHx8IChpbml0aWFsX1J4WGZlckNvdW50ID4gMVUpKSB7CisgICAgLyogU2V0IGZpZm9yeHRocmVzaG9sZCBhY2NvcmRpbmcgdGhlIHJlY2VwdGlvbiBkYXRhIGxlbmd0aDogMTZiaXQgKi8KKyAgICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX1JYRklGT19USFJFU0hPTEQpOworICB9IGVsc2UgeworICAgIC8qIFNldCBmaWZvcnh0aHJlc2hvbGQgYWNjb3JkaW5nIHRoZSByZWNlcHRpb24gZGF0YSBsZW5ndGg6IDhiaXQgKi8KKyAgICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9SWEZJRk9fVEhSRVNIT0xEKTsKKyAgfQorCisgIC8qIENoZWNrIGlmIHRoZSBTUEkgaXMgYWxyZWFkeSBlbmFibGVkICovCisgIGlmICgoaHNwaS0+SW5zdGFuY2UtPkNSMSAmIFNQSV9DUjFfU1BFKSAhPSBTUElfQ1IxX1NQRSkgeworICAgIC8qIEVuYWJsZSBTUEkgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX1NQSV9FTkFCTEUoaHNwaSk7CisgIH0KKworICAvKiBUcmFuc21pdCBhbmQgUmVjZWl2ZSBkYXRhIGluIDE2IEJpdCBtb2RlICovCisgIGlmIChoc3BpLT5Jbml0LkRhdGFTaXplID4gU1BJX0RBVEFTSVpFXzhCSVQpIHsKKyAgICBpZiAoKGhzcGktPkluaXQuTW9kZSA9PSBTUElfTU9ERV9TTEFWRSkgfHwgKGluaXRpYWxfVHhYZmVyQ291bnQgPT0gMHgwMVUpKSB7CisgICAgICBoc3BpLT5JbnN0YW5jZS0+RFIgPSAqKChjb25zdCB1aW50MTZfdCAqKWhzcGktPnBUeEJ1ZmZQdHIpOworICAgICAgaHNwaS0+cFR4QnVmZlB0ciArPSBzaXplb2YodWludDE2X3QpOworICAgICAgaHNwaS0+VHhYZmVyQ291bnQtLTsKKworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgICAgIC8qIEVuYWJsZSBDUkMgVHJhbnNtaXNzaW9uICovCisgICAgICBpZiAoKGhzcGktPlR4WGZlckNvdW50ID09IDBVKSAmJgorICAgICAgICAgIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpKSB7CisgICAgICAgIC8qIFNldCBOU1MgU29mdCB0byByZWNlaXZlZCBjb3JyZWN0bHkgdGhlIENSQyBvbiBzbGF2ZSBtb2RlIHdpdGggTlNTCisgICAgICAgICAqIHB1bHNlIGFjdGl2YXRlZCAqLworICAgICAgICBpZiAoKFJFQURfQklUKHNwaV9jcjEsIFNQSV9DUjFfTVNUUikgPT0gMFUpICYmCisgICAgICAgICAgICAoUkVBRF9CSVQoc3BpX2NyMiwgU1BJX0NSMl9OU1NQKSA9PSBTUElfQ1IyX05TU1ApKSB7CisgICAgICAgICAgU0VUX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IxLCBTUElfQ1IxX1NTTSk7CisgICAgICAgIH0KKyAgICAgICAgU0VUX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IxLCBTUElfQ1IxX0NSQ05FWFQpOworICAgICAgfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisgICAgfQorICAgIHdoaWxlICgoaHNwaS0+VHhYZmVyQ291bnQgPiAwVSkgfHwgKGhzcGktPlJ4WGZlckNvdW50ID4gMFUpKSB7CisgICAgICAvKiBDaGVjayBUWEUgZmxhZyAqLworICAgICAgaWYgKChfX0hBTF9TUElfR0VUX0ZMQUcoaHNwaSwgU1BJX0ZMQUdfVFhFKSkgJiYKKyAgICAgICAgICAoaHNwaS0+VHhYZmVyQ291bnQgPiAwVSkgJiYgKHR4YWxsb3dlZCA9PSAxVSkpIHsKKyAgICAgICAgaHNwaS0+SW5zdGFuY2UtPkRSID0gKigoY29uc3QgdWludDE2X3QgKiloc3BpLT5wVHhCdWZmUHRyKTsKKyAgICAgICAgaHNwaS0+cFR4QnVmZlB0ciArPSBzaXplb2YodWludDE2X3QpOworICAgICAgICBoc3BpLT5UeFhmZXJDb3VudC0tOworICAgICAgICAvKiBOZXh0IERhdGEgaXMgYSByZWNlcHRpb24gKFJ4KS4gVHggbm90IGFsbG93ZWQgKi8KKyAgICAgICAgdHhhbGxvd2VkID0gMFU7CisKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgICAgICAgIC8qIEVuYWJsZSBDUkMgVHJhbnNtaXNzaW9uICovCisgICAgICAgIGlmICgoaHNwaS0+VHhYZmVyQ291bnQgPT0gMFUpICYmCisgICAgICAgICAgICAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKSkgeworICAgICAgICAgIC8qIFNldCBOU1MgU29mdCB0byByZWNlaXZlZCBjb3JyZWN0bHkgdGhlIENSQyBvbiBzbGF2ZSBtb2RlIHdpdGggTlNTCisgICAgICAgICAgICogcHVsc2UgYWN0aXZhdGVkICovCisgICAgICAgICAgaWYgKChSRUFEX0JJVChzcGlfY3IxLCBTUElfQ1IxX01TVFIpID09IDBVKSAmJgorICAgICAgICAgICAgICAoUkVBRF9CSVQoc3BpX2NyMiwgU1BJX0NSMl9OU1NQKSA9PSBTUElfQ1IyX05TU1ApKSB7CisgICAgICAgICAgICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjEsIFNQSV9DUjFfU1NNKTsKKyAgICAgICAgICB9CisgICAgICAgICAgU0VUX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IxLCBTUElfQ1IxX0NSQ05FWFQpOworICAgICAgICB9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKyAgICAgIH0KKworICAgICAgLyogQ2hlY2sgUlhORSBmbGFnICovCisgICAgICBpZiAoKF9fSEFMX1NQSV9HRVRfRkxBRyhoc3BpLCBTUElfRkxBR19SWE5FKSkgJiYKKyAgICAgICAgICAoaHNwaS0+UnhYZmVyQ291bnQgPiAwVSkpIHsKKyAgICAgICAgKigodWludDE2X3QgKiloc3BpLT5wUnhCdWZmUHRyKSA9ICh1aW50MTZfdCloc3BpLT5JbnN0YW5jZS0+RFI7CisgICAgICAgIGhzcGktPnBSeEJ1ZmZQdHIgKz0gc2l6ZW9mKHVpbnQxNl90KTsKKyAgICAgICAgaHNwaS0+UnhYZmVyQ291bnQtLTsKKyAgICAgICAgLyogTmV4dCBEYXRhIGlzIGEgVHJhbnNtaXNzaW9uIChUeCkuIFR4IGlzIGFsbG93ZWQgKi8KKyAgICAgICAgdHhhbGxvd2VkID0gMVU7CisgICAgICB9CisgICAgICBpZiAoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+PSBUaW1lb3V0KSAmJgorICAgICAgICAgIChUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpKSB7CisgICAgICAgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9SRUFEWTsKKyAgICAgICAgX19IQUxfVU5MT0NLKGhzcGkpOworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgfQorICB9CisgIC8qIFRyYW5zbWl0IGFuZCBSZWNlaXZlIGRhdGEgaW4gOCBCaXQgbW9kZSAqLworICBlbHNlIHsKKyAgICBpZiAoKGhzcGktPkluaXQuTW9kZSA9PSBTUElfTU9ERV9TTEFWRSkgfHwgKGluaXRpYWxfVHhYZmVyQ291bnQgPT0gMHgwMVUpKSB7CisgICAgICBpZiAoaHNwaS0+VHhYZmVyQ291bnQgPiAxVSkgeworICAgICAgICBoc3BpLT5JbnN0YW5jZS0+RFIgPSAqKChjb25zdCB1aW50MTZfdCAqKWhzcGktPnBUeEJ1ZmZQdHIpOworICAgICAgICBoc3BpLT5wVHhCdWZmUHRyICs9IHNpemVvZih1aW50MTZfdCk7CisgICAgICAgIGhzcGktPlR4WGZlckNvdW50IC09IDJVOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgKihfX0lPIHVpbnQ4X3QgKikmaHNwaS0+SW5zdGFuY2UtPkRSID0KKyAgICAgICAgICAgICooKGNvbnN0IHVpbnQ4X3QgKiloc3BpLT5wVHhCdWZmUHRyKTsKKyAgICAgICAgaHNwaS0+cFR4QnVmZlB0cisrOworICAgICAgICBoc3BpLT5UeFhmZXJDb3VudC0tOworCisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAgICAgICAvKiBFbmFibGUgQ1JDIFRyYW5zbWlzc2lvbiAqLworICAgICAgICBpZiAoKGhzcGktPlR4WGZlckNvdW50ID09IDBVKSAmJgorICAgICAgICAgICAgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkpIHsKKyAgICAgICAgICAvKiBTZXQgTlNTIFNvZnQgdG8gcmVjZWl2ZWQgY29ycmVjdGx5IHRoZSBDUkMgb24gc2xhdmUgbW9kZSB3aXRoIE5TUworICAgICAgICAgICAqIHB1bHNlIGFjdGl2YXRlZCAqLworICAgICAgICAgIGlmICgoUkVBRF9CSVQoc3BpX2NyMSwgU1BJX0NSMV9NU1RSKSA9PSAwVSkgJiYKKyAgICAgICAgICAgICAgKFJFQURfQklUKHNwaV9jcjIsIFNQSV9DUjJfTlNTUCkgPT0gU1BJX0NSMl9OU1NQKSkgeworICAgICAgICAgICAgU0VUX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IxLCBTUElfQ1IxX1NTTSk7CisgICAgICAgICAgfQorICAgICAgICAgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMSwgU1BJX0NSMV9DUkNORVhUKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisgICAgICB9CisgICAgfQorICAgIHdoaWxlICgoaHNwaS0+VHhYZmVyQ291bnQgPiAwVSkgfHwgKGhzcGktPlJ4WGZlckNvdW50ID4gMFUpKSB7CisgICAgICAvKiBDaGVjayBUWEUgZmxhZyAqLworICAgICAgaWYgKChfX0hBTF9TUElfR0VUX0ZMQUcoaHNwaSwgU1BJX0ZMQUdfVFhFKSkgJiYKKyAgICAgICAgICAoaHNwaS0+VHhYZmVyQ291bnQgPiAwVSkgJiYgKHR4YWxsb3dlZCA9PSAxVSkpIHsKKyAgICAgICAgaWYgKGhzcGktPlR4WGZlckNvdW50ID4gMVUpIHsKKyAgICAgICAgICBoc3BpLT5JbnN0YW5jZS0+RFIgPSAqKChjb25zdCB1aW50MTZfdCAqKWhzcGktPnBUeEJ1ZmZQdHIpOworICAgICAgICAgIGhzcGktPnBUeEJ1ZmZQdHIgKz0gc2l6ZW9mKHVpbnQxNl90KTsKKyAgICAgICAgICBoc3BpLT5UeFhmZXJDb3VudCAtPSAyVTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAqKF9fSU8gdWludDhfdCAqKSZoc3BpLT5JbnN0YW5jZS0+RFIgPQorICAgICAgICAgICAgICAqKChjb25zdCB1aW50OF90ICopaHNwaS0+cFR4QnVmZlB0cik7CisgICAgICAgICAgaHNwaS0+cFR4QnVmZlB0cisrOworICAgICAgICAgIGhzcGktPlR4WGZlckNvdW50LS07CisgICAgICAgIH0KKyAgICAgICAgLyogTmV4dCBEYXRhIGlzIGEgcmVjZXB0aW9uIChSeCkuIFR4IG5vdCBhbGxvd2VkICovCisgICAgICAgIHR4YWxsb3dlZCA9IDBVOworCisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAgICAgICAvKiBFbmFibGUgQ1JDIFRyYW5zbWlzc2lvbiAqLworICAgICAgICBpZiAoKGhzcGktPlR4WGZlckNvdW50ID09IDBVKSAmJgorICAgICAgICAgICAgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkpIHsKKyAgICAgICAgICAvKiBTZXQgTlNTIFNvZnQgdG8gcmVjZWl2ZWQgY29ycmVjdGx5IHRoZSBDUkMgb24gc2xhdmUgbW9kZSB3aXRoIE5TUworICAgICAgICAgICAqIHB1bHNlIGFjdGl2YXRlZCAqLworICAgICAgICAgIGlmICgoUkVBRF9CSVQoc3BpX2NyMSwgU1BJX0NSMV9NU1RSKSA9PSAwVSkgJiYKKyAgICAgICAgICAgICAgKFJFQURfQklUKHNwaV9jcjIsIFNQSV9DUjJfTlNTUCkgPT0gU1BJX0NSMl9OU1NQKSkgeworICAgICAgICAgICAgU0VUX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IxLCBTUElfQ1IxX1NTTSk7CisgICAgICAgICAgfQorICAgICAgICAgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMSwgU1BJX0NSMV9DUkNORVhUKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisgICAgICB9CisKKyAgICAgIC8qIFdhaXQgdW50aWwgUlhORSBmbGFnIGlzIHJlc2V0ICovCisgICAgICBpZiAoKF9fSEFMX1NQSV9HRVRfRkxBRyhoc3BpLCBTUElfRkxBR19SWE5FKSkgJiYKKyAgICAgICAgICAoaHNwaS0+UnhYZmVyQ291bnQgPiAwVSkpIHsKKyAgICAgICAgaWYgKGhzcGktPlJ4WGZlckNvdW50ID4gMVUpIHsKKyAgICAgICAgICAqKCh1aW50MTZfdCAqKWhzcGktPnBSeEJ1ZmZQdHIpID0gKHVpbnQxNl90KWhzcGktPkluc3RhbmNlLT5EUjsKKyAgICAgICAgICBoc3BpLT5wUnhCdWZmUHRyICs9IHNpemVvZih1aW50MTZfdCk7CisgICAgICAgICAgaHNwaS0+UnhYZmVyQ291bnQgLT0gMlU7CisgICAgICAgICAgaWYgKGhzcGktPlJ4WGZlckNvdW50IDw9IDFVKSB7CisgICAgICAgICAgICAvKiBTZXQgUlggRmlmbyB0aHJlc2hvbGQgYmVmb3JlIHRvIHN3aXRjaCBvbiA4IGJpdCBkYXRhIHNpemUgKi8KKyAgICAgICAgICAgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX1JYRklGT19USFJFU0hPTEQpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAoKih1aW50OF90ICopaHNwaS0+cFJ4QnVmZlB0cikgPSAqKF9fSU8gdWludDhfdCAqKSZoc3BpLT5JbnN0YW5jZS0+RFI7CisgICAgICAgICAgaHNwaS0+cFJ4QnVmZlB0cisrOworICAgICAgICAgIGhzcGktPlJ4WGZlckNvdW50LS07CisgICAgICAgIH0KKyAgICAgICAgLyogTmV4dCBEYXRhIGlzIGEgVHJhbnNtaXNzaW9uIChUeCkuIFR4IGlzIGFsbG93ZWQgKi8KKyAgICAgICAgdHhhbGxvd2VkID0gMVU7CisgICAgICB9CisgICAgICBpZiAoKCgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPj0gVGltZW91dCkgJiYKKyAgICAgICAgICAgKChUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpKSkgfHwKKyAgICAgICAgICAoVGltZW91dCA9PSAwVSkpIHsKKyAgICAgICAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX1JFQURZOworICAgICAgICBfX0hBTF9VTkxPQ0soaHNwaSk7CisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgLyogUmVhZCBDUkMgZnJvbSBEUiB0byBjbG9zZSBDUkMgY2FsY3VsYXRpb24gcHJvY2VzcyAqLworICBpZiAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKSB7CisgICAgLyogV2FpdCB1bnRpbCBUWEUgZmxhZyAqLworICAgIGlmIChTUElfV2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChoc3BpLCBTUElfRkxBR19SWE5FLCBTRVQsIFRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpY2tzdGFydCkgIT0gSEFMX09LKSB7CisgICAgICAvKiBFcnJvciBvbiB0aGUgQ1JDIHJlY2VwdGlvbiAqLworICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfQ1JDKTsKKyAgICAgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9SRUFEWTsKKyAgICAgIF9fSEFMX1VOTE9DSyhoc3BpKTsKKyAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICB9CisgICAgLyogUmVhZCBDUkMgKi8KKyAgICBpZiAoaHNwaS0+SW5pdC5EYXRhU2l6ZSA9PSBTUElfREFUQVNJWkVfMTZCSVQpIHsKKyAgICAgIC8qIFJlYWQgMTZiaXQgQ1JDICovCisgICAgICB0bXByZWcgPSBSRUFEX1JFRyhoc3BpLT5JbnN0YW5jZS0+RFIpOworICAgICAgLyogVG8gYXZvaWQgR0NDIHdhcm5pbmcgKi8KKyAgICAgIFVOVVNFRCh0bXByZWcpOworICAgIH0gZWxzZSB7CisgICAgICAvKiBJbml0aWFsaXplIHRoZSA4Yml0IHRlbXBvcmFyeSBwb2ludGVyICovCisgICAgICBwdG1wcmVnOCA9IChfX0lPIHVpbnQ4X3QgKikmaHNwaS0+SW5zdGFuY2UtPkRSOworICAgICAgLyogUmVhZCA4Yml0IENSQyAqLworICAgICAgdG1wcmVnOCA9ICpwdG1wcmVnODsKKyAgICAgIC8qIFRvIGF2b2lkIEdDQyB3YXJuaW5nICovCisgICAgICBVTlVTRUQodG1wcmVnOCk7CisKKyAgICAgIGlmIChoc3BpLT5Jbml0LkNSQ0xlbmd0aCA9PSBTUElfQ1JDX0xFTkdUSF8xNkJJVCkgeworICAgICAgICBpZiAoU1BJX1dhaXRGbGFnU3RhdGVVbnRpbFRpbWVvdXQoaHNwaSwgU1BJX0ZMQUdfUlhORSwgU0VULCBUaW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlja3N0YXJ0KSAhPSBIQUxfT0spIHsKKyAgICAgICAgICAvKiBFcnJvciBvbiB0aGUgQ1JDIHJlY2VwdGlvbiAqLworICAgICAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0NSQyk7CisgICAgICAgICAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX1JFQURZOworICAgICAgICAgIF9fSEFMX1VOTE9DSyhoc3BpKTsKKyAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgIH0KKyAgICAgICAgLyogUmVhZCA4Yml0IENSQyBhZ2FpbiBpbiBjYXNlIG9mIDE2Yml0IENSQyBpbiA4Yml0IERhdGEgbW9kZSAqLworICAgICAgICB0bXByZWc4ID0gKnB0bXByZWc4OworICAgICAgICAvKiBUbyBhdm9pZCBHQ0Mgd2FybmluZyAqLworICAgICAgICBVTlVTRUQodG1wcmVnOCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogQ2hlY2sgaWYgQ1JDIGVycm9yIG9jY3VycmVkICovCisgIGlmIChfX0hBTF9TUElfR0VUX0ZMQUcoaHNwaSwgU1BJX0ZMQUdfQ1JDRVJSKSkgeworICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0NSQyk7CisgICAgLyogQ2xlYXIgQ1JDIEZsYWcgKi8KKyAgICBfX0hBTF9TUElfQ0xFQVJfQ1JDRVJSRkxBRyhoc3BpKTsKKyAgICBfX0hBTF9VTkxPQ0soaHNwaSk7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisKKyAgLyogQ2hlY2sgdGhlIGVuZCBvZiB0aGUgdHJhbnNhY3Rpb24gKi8KKyAgaWYgKFNQSV9FbmRSeFR4VHJhbnNhY3Rpb24oaHNwaSwgVGltZW91dCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spIHsKKyAgICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX0ZMQUc7CisgICAgX19IQUxfVU5MT0NLKGhzcGkpOworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfUkVBRFk7CisgIC8qIFVubG9jayB0aGUgcHJvY2VzcyAqLworICBfX0hBTF9VTkxPQ0soaHNwaSk7CisKKyAgaWYgKGhzcGktPkVycm9yQ29kZSAhPSBIQUxfU1BJX0VSUk9SX05PTkUpIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9IGVsc2UgeworICAgIHJldHVybiBIQUxfT0s7CisgIH0KK30KKworLyoqCisgKiBAYnJpZWYgIFRyYW5zbWl0IGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHdpdGggSW50ZXJydXB0LgorICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAqIEBwYXJhbSAgcERhdGEgcG9pbnRlciB0byBkYXRhIGJ1ZmZlcgorICogQHBhcmFtICBTaXplIGFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQKKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX1RyYW5zbWl0X0lUKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSkgeworICAvKiBDaGVjayBEaXJlY3Rpb24gcGFyYW1ldGVyICovCisgIGFzc2VydF9wYXJhbShJU19TUElfRElSRUNUSU9OXzJMSU5FU19PUl8xTElORShoc3BpLT5Jbml0LkRpcmVjdGlvbikpOworCisgIGlmICgocERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKSB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIGlmIChoc3BpLT5TdGF0ZSAhPSBIQUxfU1BJX1NUQVRFX1JFQURZKSB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoc3BpKTsKKworICAvKiBTZXQgdGhlIHRyYW5zYWN0aW9uIGluZm9ybWF0aW9uICovCisgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9CVVNZX1RYOworICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX05PTkU7CisgIGhzcGktPnBUeEJ1ZmZQdHIgPSAoY29uc3QgdWludDhfdCAqKXBEYXRhOworICBoc3BpLT5UeFhmZXJTaXplID0gU2l6ZTsKKyAgaHNwaS0+VHhYZmVyQ291bnQgPSBTaXplOworCisgIC8qIEluaXQgZmllbGQgbm90IHVzZWQgaW4gaGFuZGxlIHRvIHplcm8gKi8KKyAgaHNwaS0+cFJ4QnVmZlB0ciA9ICh1aW50OF90ICopTlVMTDsKKyAgaHNwaS0+UnhYZmVyU2l6ZSA9IDBVOworICBoc3BpLT5SeFhmZXJDb3VudCA9IDBVOworICBoc3BpLT5SeElTUiA9IE5VTEw7CisKKyAgLyogU2V0IHRoZSBmdW5jdGlvbiBmb3IgSVQgdHJlYXRtZW50ICovCisgIGlmIChoc3BpLT5Jbml0LkRhdGFTaXplID4gU1BJX0RBVEFTSVpFXzhCSVQpIHsKKyAgICBoc3BpLT5UeElTUiA9IFNQSV9UeElTUl8xNkJJVDsKKyAgfSBlbHNlIHsKKyAgICBoc3BpLT5UeElTUiA9IFNQSV9UeElTUl84QklUOworICB9CisKKyAgLyogQ29uZmlndXJlIGNvbW11bmljYXRpb24gZGlyZWN0aW9uIDogMUxpbmUgKi8KKyAgaWYgKGhzcGktPkluaXQuRGlyZWN0aW9uID09IFNQSV9ESVJFQ1RJT05fMUxJTkUpIHsKKyAgICAvKiBEaXNhYmxlIFNQSSBQZXJpcGhlcmFsIGJlZm9yZSBzZXQgMUxpbmUgZGlyZWN0aW9uIChCSURJT0UgYml0KSAqLworICAgIF9fSEFMX1NQSV9ESVNBQkxFKGhzcGkpOworICAgIFNQSV8xTElORV9UWChoc3BpKTsKKyAgfQorCisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAvKiBSZXNldCBDUkMgQ2FsY3VsYXRpb24gKi8KKyAgaWYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkgeworICAgIFNQSV9SRVNFVF9DUkMoaHNwaSk7CisgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisgIC8qIENoZWNrIGlmIHRoZSBTUEkgaXMgYWxyZWFkeSBlbmFibGVkICovCisgIGlmICgoaHNwaS0+SW5zdGFuY2UtPkNSMSAmIFNQSV9DUjFfU1BFKSAhPSBTUElfQ1IxX1NQRSkgeworICAgIC8qIEVuYWJsZSBTUEkgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX1NQSV9FTkFCTEUoaHNwaSk7CisgIH0KKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoc3BpKTsKKyAgLyogRW5hYmxlIFRYRSBhbmQgRVJSIGludGVycnVwdCAqLworICBfX0hBTF9TUElfRU5BQkxFX0lUKGhzcGksIChTUElfSVRfVFhFIHwgU1BJX0lUX0VSUikpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICogQGJyaWVmICBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHdpdGggSW50ZXJydXB0LgorICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAqIEBwYXJhbSAgcERhdGEgcG9pbnRlciB0byBkYXRhIGJ1ZmZlcgorICogQHBhcmFtICBTaXplIGFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQKKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX1JlY2VpdmVfSVQoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGksIHVpbnQ4X3QgKnBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IFNpemUpIHsKKyAgaWYgKGhzcGktPlN0YXRlICE9IEhBTF9TUElfU1RBVEVfUkVBRFkpIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KKworICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICBpZiAoKGhzcGktPkluaXQuRGlyZWN0aW9uID09IFNQSV9ESVJFQ1RJT05fMkxJTkVTKSAmJgorICAgICAgKGhzcGktPkluaXQuTW9kZSA9PSBTUElfTU9ERV9NQVNURVIpKSB7CisgICAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX0JVU1lfUlg7CisgICAgLyogQ2FsbCB0cmFuc21pdC1yZWNlaXZlIGZ1bmN0aW9uIHRvIHNlbmQgRHVtbXkgZGF0YSBvbiBUeCBsaW5lIGFuZCBnZW5lcmF0ZQorICAgICAqIGNsb2NrIG9uIENMSyBsaW5lICovCisgICAgcmV0dXJuIEhBTF9TUElfVHJhbnNtaXRSZWNlaXZlX0lUKGhzcGksIHBEYXRhLCBwRGF0YSwgU2l6ZSk7CisgIH0KKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhzcGkpOworCisgIC8qIFNldCB0aGUgdHJhbnNhY3Rpb24gaW5mb3JtYXRpb24gKi8KKyAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX0JVU1lfUlg7CisgIGhzcGktPkVycm9yQ29kZSA9IEhBTF9TUElfRVJST1JfTk9ORTsKKyAgaHNwaS0+cFJ4QnVmZlB0ciA9ICh1aW50OF90ICopcERhdGE7CisgIGhzcGktPlJ4WGZlclNpemUgPSBTaXplOworICBoc3BpLT5SeFhmZXJDb3VudCA9IFNpemU7CisKKyAgLyogSW5pdCBmaWVsZCBub3QgdXNlZCBpbiBoYW5kbGUgdG8gemVybyAqLworICBoc3BpLT5wVHhCdWZmUHRyID0gKHVpbnQ4X3QgKilOVUxMOworICBoc3BpLT5UeFhmZXJTaXplID0gMFU7CisgIGhzcGktPlR4WGZlckNvdW50ID0gMFU7CisgIGhzcGktPlR4SVNSID0gTlVMTDsKKworICAvKiBDaGVjayB0aGUgZGF0YSBzaXplIHRvIGFkYXB0IFJ4IHRocmVzaG9sZCBhbmQgdGhlIHNldCB0aGUgZnVuY3Rpb24gZm9yIElUCisgICAqIHRyZWF0bWVudCAqLworICBpZiAoaHNwaS0+SW5pdC5EYXRhU2l6ZSA+IFNQSV9EQVRBU0laRV84QklUKSB7CisgICAgLyogU2V0IFJYIEZpZm8gdGhyZXNob2xkIGFjY29yZGluZyB0aGUgcmVjZXB0aW9uIGRhdGEgbGVuZ3RoOiAxNiBiaXQgKi8KKyAgICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX1JYRklGT19USFJFU0hPTEQpOworICAgIGhzcGktPlJ4SVNSID0gU1BJX1J4SVNSXzE2QklUOworICB9IGVsc2UgeworICAgIC8qIFNldCBSWCBGaWZvIHRocmVzaG9sZCBhY2NvcmRpbmcgdGhlIHJlY2VwdGlvbiBkYXRhIGxlbmd0aDogOCBiaXQgKi8KKyAgICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9SWEZJRk9fVEhSRVNIT0xEKTsKKyAgICBoc3BpLT5SeElTUiA9IFNQSV9SeElTUl84QklUOworICB9CisKKyAgLyogQ29uZmlndXJlIGNvbW11bmljYXRpb24gZGlyZWN0aW9uIDogMUxpbmUgKi8KKyAgaWYgKGhzcGktPkluaXQuRGlyZWN0aW9uID09IFNQSV9ESVJFQ1RJT05fMUxJTkUpIHsKKyAgICAvKiBEaXNhYmxlIFNQSSBQZXJpcGhlcmFsIGJlZm9yZSBzZXQgMUxpbmUgZGlyZWN0aW9uIChCSURJT0UgYml0KSAqLworICAgIF9fSEFMX1NQSV9ESVNBQkxFKGhzcGkpOworICAgIFNQSV8xTElORV9SWChoc3BpKTsKKyAgfQorCisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAvKiBSZXNldCBDUkMgQ2FsY3VsYXRpb24gKi8KKyAgaWYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkgeworICAgIGhzcGktPkNSQ1NpemUgPSAxVTsKKyAgICBpZiAoKGhzcGktPkluaXQuRGF0YVNpemUgPD0gU1BJX0RBVEFTSVpFXzhCSVQpICYmCisgICAgICAgIChoc3BpLT5Jbml0LkNSQ0xlbmd0aCA9PSBTUElfQ1JDX0xFTkdUSF8xNkJJVCkpIHsKKyAgICAgIGhzcGktPkNSQ1NpemUgPSAyVTsKKyAgICB9CisgICAgU1BJX1JFU0VUX0NSQyhoc3BpKTsKKyAgfSBlbHNlIHsKKyAgICBoc3BpLT5DUkNTaXplID0gMFU7CisgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisgIC8qIE5vdGUgOiBUaGUgU1BJIG11c3QgYmUgZW5hYmxlZCBhZnRlciB1bmxvY2tpbmcgY3VycmVudCBwcm9jZXNzCisgICAgICAgICAgICB0byBhdm9pZCB0aGUgcmlzayBvZiBTUEkgaW50ZXJydXB0IGhhbmRsZSBleGVjdXRpb24gYmVmb3JlIGN1cnJlbnQKKyAgICAgICAgICAgIHByb2Nlc3MgdW5sb2NrICovCisKKyAgLyogQ2hlY2sgaWYgdGhlIFNQSSBpcyBhbHJlYWR5IGVuYWJsZWQgKi8KKyAgaWYgKChoc3BpLT5JbnN0YW5jZS0+Q1IxICYgU1BJX0NSMV9TUEUpICE9IFNQSV9DUjFfU1BFKSB7CisgICAgLyogRW5hYmxlIFNQSSBwZXJpcGhlcmFsICovCisgICAgX19IQUxfU1BJX0VOQUJMRShoc3BpKTsKKyAgfQorCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhzcGkpOworICAvKiBFbmFibGUgUlhORSBhbmQgRVJSIGludGVycnVwdCAqLworICBfX0hBTF9TUElfRU5BQkxFX0lUKGhzcGksIChTUElfSVRfUlhORSB8IFNQSV9JVF9FUlIpKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiAgVHJhbnNtaXQgYW5kIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aAorICogSW50ZXJydXB0LgorICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAqIEBwYXJhbSAgcFR4RGF0YSBwb2ludGVyIHRvIHRyYW5zbWlzc2lvbiBkYXRhIGJ1ZmZlcgorICogQHBhcmFtICBwUnhEYXRhIHBvaW50ZXIgdG8gcmVjZXB0aW9uIGRhdGEgYnVmZmVyCisgKiBAcGFyYW0gIFNpemUgYW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudCBhbmQgcmVjZWl2ZWQKKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX1RyYW5zbWl0UmVjZWl2ZV9JVChTUElfSGFuZGxlVHlwZURlZiAqaHNwaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnBUeERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwUnhEYXRhLCB1aW50MTZfdCBTaXplKSB7CisgIHVpbnQzMl90IHRtcF9tb2RlOworICBIQUxfU1BJX1N0YXRlVHlwZURlZiB0bXBfc3RhdGU7CisKKyAgLyogQ2hlY2sgRGlyZWN0aW9uIHBhcmFtZXRlciAqLworICBhc3NlcnRfcGFyYW0oSVNfU1BJX0RJUkVDVElPTl8yTElORVMoaHNwaS0+SW5pdC5EaXJlY3Rpb24pKTsKKworICAvKiBJbml0IHRlbXBvcmFyeSB2YXJpYWJsZXMgKi8KKyAgdG1wX3N0YXRlID0gaHNwaS0+U3RhdGU7CisgIHRtcF9tb2RlID0gaHNwaS0+SW5pdC5Nb2RlOworCisgIGlmICghKCh0bXBfc3RhdGUgPT0gSEFMX1NQSV9TVEFURV9SRUFEWSkgfHwKKyAgICAgICAgKCh0bXBfbW9kZSA9PSBTUElfTU9ERV9NQVNURVIpICYmCisgICAgICAgICAoaHNwaS0+SW5pdC5EaXJlY3Rpb24gPT0gU1BJX0RJUkVDVElPTl8yTElORVMpICYmCisgICAgICAgICAodG1wX3N0YXRlID09IEhBTF9TUElfU1RBVEVfQlVTWV9SWCkpKSkgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorCisgIGlmICgocFR4RGF0YSA9PSBOVUxMKSB8fCAocFJ4RGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoc3BpKTsKKworICAvKiBEb24ndCBvdmVyd3JpdGUgaW4gY2FzZSBvZiBIQUxfU1BJX1NUQVRFX0JVU1lfUlggKi8KKyAgaWYgKGhzcGktPlN0YXRlICE9IEhBTF9TUElfU1RBVEVfQlVTWV9SWCkgeworICAgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9CVVNZX1RYX1JYOworICB9CisKKyAgLyogU2V0IHRoZSB0cmFuc2FjdGlvbiBpbmZvcm1hdGlvbiAqLworICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX05PTkU7CisgIGhzcGktPnBUeEJ1ZmZQdHIgPSAoY29uc3QgdWludDhfdCAqKXBUeERhdGE7CisgIGhzcGktPlR4WGZlclNpemUgPSBTaXplOworICBoc3BpLT5UeFhmZXJDb3VudCA9IFNpemU7CisgIGhzcGktPnBSeEJ1ZmZQdHIgPSAodWludDhfdCAqKXBSeERhdGE7CisgIGhzcGktPlJ4WGZlclNpemUgPSBTaXplOworICBoc3BpLT5SeFhmZXJDb3VudCA9IFNpemU7CisKKyAgLyogU2V0IHRoZSBmdW5jdGlvbiBmb3IgSVQgdHJlYXRtZW50ICovCisgIGlmIChoc3BpLT5Jbml0LkRhdGFTaXplID4gU1BJX0RBVEFTSVpFXzhCSVQpIHsKKyAgICBoc3BpLT5SeElTUiA9IFNQSV8ybGluZXNSeElTUl8xNkJJVDsKKyAgICBoc3BpLT5UeElTUiA9IFNQSV8ybGluZXNUeElTUl8xNkJJVDsKKyAgfSBlbHNlIHsKKyAgICBoc3BpLT5SeElTUiA9IFNQSV8ybGluZXNSeElTUl84QklUOworICAgIGhzcGktPlR4SVNSID0gU1BJXzJsaW5lc1R4SVNSXzhCSVQ7CisgIH0KKworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgLyogUmVzZXQgQ1JDIENhbGN1bGF0aW9uICovCisgIGlmIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpIHsKKyAgICBoc3BpLT5DUkNTaXplID0gMVU7CisgICAgaWYgKChoc3BpLT5Jbml0LkRhdGFTaXplIDw9IFNQSV9EQVRBU0laRV84QklUKSAmJgorICAgICAgICAoaHNwaS0+SW5pdC5DUkNMZW5ndGggPT0gU1BJX0NSQ19MRU5HVEhfMTZCSVQpKSB7CisgICAgICBoc3BpLT5DUkNTaXplID0gMlU7CisgICAgfQorICAgIFNQSV9SRVNFVF9DUkMoaHNwaSk7CisgIH0gZWxzZSB7CisgICAgaHNwaS0+Q1JDU2l6ZSA9IDBVOworICB9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKworICAvKiBDaGVjayBpZiBwYWNraW5nIG1vZGUgaXMgZW5hYmxlZCBhbmQgaWYgdGhlcmUgaXMgbW9yZSB0aGFuIDIgZGF0YSB0bworICAgKiByZWNlaXZlICovCisgIGlmICgoaHNwaS0+SW5pdC5EYXRhU2l6ZSA+IFNQSV9EQVRBU0laRV84QklUKSB8fCAoU2l6ZSA+PSAyVSkpIHsKKyAgICAvKiBTZXQgUlggRmlmbyB0aHJlc2hvbGQgYWNjb3JkaW5nIHRoZSByZWNlcHRpb24gZGF0YSBsZW5ndGg6IDE2IGJpdCAqLworICAgIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfUlhGSUZPX1RIUkVTSE9MRCk7CisgIH0gZWxzZSB7CisgICAgLyogU2V0IFJYIEZpZm8gdGhyZXNob2xkIGFjY29yZGluZyB0aGUgcmVjZXB0aW9uIGRhdGEgbGVuZ3RoOiA4IGJpdCAqLworICAgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX1JYRklGT19USFJFU0hPTEQpOworICB9CisKKyAgLyogQ2hlY2sgaWYgdGhlIFNQSSBpcyBhbHJlYWR5IGVuYWJsZWQgKi8KKyAgaWYgKChoc3BpLT5JbnN0YW5jZS0+Q1IxICYgU1BJX0NSMV9TUEUpICE9IFNQSV9DUjFfU1BFKSB7CisgICAgLyogRW5hYmxlIFNQSSBwZXJpcGhlcmFsICovCisgICAgX19IQUxfU1BJX0VOQUJMRShoc3BpKTsKKyAgfQorCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhzcGkpOworICAvKiBFbmFibGUgVFhFLCBSWE5FIGFuZCBFUlIgaW50ZXJydXB0ICovCisgIF9fSEFMX1NQSV9FTkFCTEVfSVQoaHNwaSwgKFNQSV9JVF9UWEUgfCBTUElfSVRfUlhORSB8IFNQSV9JVF9FUlIpKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiAgVHJhbnNtaXQgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBETUEuCisgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICogQHBhcmFtICBwRGF0YSBwb2ludGVyIHRvIGRhdGEgYnVmZmVyCisgKiBAcGFyYW0gIFNpemUgYW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudAorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfVHJhbnNtaXRfRE1BKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpIHsKKyAgLyogQ2hlY2sgdHggZG1hIGhhbmRsZSAqLworICBhc3NlcnRfcGFyYW0oSVNfU1BJX0RNQV9IQU5ETEUoaHNwaS0+aGRtYXR4KSk7CisKKyAgLyogQ2hlY2sgRGlyZWN0aW9uIHBhcmFtZXRlciAqLworICBhc3NlcnRfcGFyYW0oSVNfU1BJX0RJUkVDVElPTl8yTElORVNfT1JfMUxJTkUoaHNwaS0+SW5pdC5EaXJlY3Rpb24pKTsKKworICBpZiAoaHNwaS0+U3RhdGUgIT0gSEFMX1NQSV9TVEFURV9SRUFEWSkgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorCisgIGlmICgocERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKSB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHNwaSk7CisKKyAgLyogU2V0IHRoZSB0cmFuc2FjdGlvbiBpbmZvcm1hdGlvbiAqLworICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfQlVTWV9UWDsKKyAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9OT05FOworICBoc3BpLT5wVHhCdWZmUHRyID0gKGNvbnN0IHVpbnQ4X3QgKilwRGF0YTsKKyAgaHNwaS0+VHhYZmVyU2l6ZSA9IFNpemU7CisgIGhzcGktPlR4WGZlckNvdW50ID0gU2l6ZTsKKworICAvKiBJbml0IGZpZWxkIG5vdCB1c2VkIGluIGhhbmRsZSB0byB6ZXJvICovCisgIGhzcGktPnBSeEJ1ZmZQdHIgPSAodWludDhfdCAqKU5VTEw7CisgIGhzcGktPlR4SVNSID0gTlVMTDsKKyAgaHNwaS0+UnhJU1IgPSBOVUxMOworICBoc3BpLT5SeFhmZXJTaXplID0gMFU7CisgIGhzcGktPlJ4WGZlckNvdW50ID0gMFU7CisKKyAgLyogQ29uZmlndXJlIGNvbW11bmljYXRpb24gZGlyZWN0aW9uIDogMUxpbmUgKi8KKyAgaWYgKGhzcGktPkluaXQuRGlyZWN0aW9uID09IFNQSV9ESVJFQ1RJT05fMUxJTkUpIHsKKyAgICAvKiBEaXNhYmxlIFNQSSBQZXJpcGhlcmFsIGJlZm9yZSBzZXQgMUxpbmUgZGlyZWN0aW9uIChCSURJT0UgYml0KSAqLworICAgIF9fSEFMX1NQSV9ESVNBQkxFKGhzcGkpOworICAgIFNQSV8xTElORV9UWChoc3BpKTsKKyAgfQorCisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAvKiBSZXNldCBDUkMgQ2FsY3VsYXRpb24gKi8KKyAgaWYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkgeworICAgIFNQSV9SRVNFVF9DUkMoaHNwaSk7CisgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisgIC8qIFNldCB0aGUgU1BJIFR4RE1BIEhhbGYgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgaHNwaS0+aGRtYXR4LT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFNQSV9ETUFIYWxmVHJhbnNtaXRDcGx0OworCisgIC8qIFNldCB0aGUgU1BJIFR4RE1BIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgIGhzcGktPmhkbWF0eC0+WGZlckNwbHRDYWxsYmFjayA9IFNQSV9ETUFUcmFuc21pdENwbHQ7CisKKyAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgaHNwaS0+aGRtYXR4LT5YZmVyRXJyb3JDYWxsYmFjayA9IFNQSV9ETUFFcnJvcjsKKworICAvKiBTZXQgdGhlIERNQSBBYm9ydENwbHRDYWxsYmFjayAqLworICBoc3BpLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9MRE1BVFgpOworICAvKiBQYWNraW5nIG1vZGUgaXMgZW5hYmxlZCBvbmx5IGlmIHRoZSBETUEgc2V0dGluZyBpcyBIQUxXT1JEICovCisgIGlmICgoaHNwaS0+SW5pdC5EYXRhU2l6ZSA8PSBTUElfREFUQVNJWkVfOEJJVCkgJiYKKyAgICAgIChoc3BpLT5oZG1hdHgtPkluaXQuTWVtRGF0YUFsaWdubWVudCA9PSBETUFfTURBVEFBTElHTl9IQUxGV09SRCkpIHsKKyAgICAvKiBDaGVjayB0aGUgZXZlbi9vZGQgb2YgdGhlIGRhdGEgc2l6ZSArIGNyYyBpZiBlbmFibGVkICovCisgICAgaWYgKChoc3BpLT5UeFhmZXJDb3VudCAmIDB4MVUpID09IDBVKSB7CisgICAgICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9MRE1BVFgpOworICAgICAgaHNwaS0+VHhYZmVyQ291bnQgPSAoaHNwaS0+VHhYZmVyQ291bnQgPj4gMVUpOworICAgIH0gZWxzZSB7CisgICAgICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfTERNQVRYKTsKKyAgICAgIGhzcGktPlR4WGZlckNvdW50ID0gKGhzcGktPlR4WGZlckNvdW50ID4+IDFVKSArIDFVOworICAgIH0KKyAgfQorCisgIC8qIEVuYWJsZSB0aGUgVHggRE1BIFN0cmVhbS9DaGFubmVsICovCisgIGlmIChIQUxfT0sgIT0gSEFMX0RNQV9TdGFydF9JVChoc3BpLT5oZG1hdHgsICh1aW50MzJfdCloc3BpLT5wVHhCdWZmUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSZoc3BpLT5JbnN0YW5jZS0+RFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoc3BpLT5UeFhmZXJDb3VudCkpIHsKKyAgICAvKiBVcGRhdGUgU1BJIGVycm9yIGNvZGUgKi8KKyAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9ETUEpOworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHNwaSk7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIGlmIHRoZSBTUEkgaXMgYWxyZWFkeSBlbmFibGVkICovCisgIGlmICgoaHNwaS0+SW5zdGFuY2UtPkNSMSAmIFNQSV9DUjFfU1BFKSAhPSBTUElfQ1IxX1NQRSkgeworICAgIC8qIEVuYWJsZSBTUEkgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX1NQSV9FTkFCTEUoaHNwaSk7CisgIH0KKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoc3BpKTsKKworICAvKiBFbmFibGUgdGhlIFNQSSBFcnJvciBJbnRlcnJ1cHQgQml0ICovCisgIF9fSEFMX1NQSV9FTkFCTEVfSVQoaHNwaSwgKFNQSV9JVF9FUlIpKTsKKworICAvKiBFbmFibGUgVHggRE1BIFJlcXVlc3QgKi8KKyAgU0VUX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1RYRE1BRU4pOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICogQGJyaWVmICBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHdpdGggRE1BLgorICogQG5vdGUgICBJbiBjYXNlIG9mIE1BU1RFUiBtb2RlIGFuZCBTUElfRElSRUNUSU9OXzJMSU5FUyBkaXJlY3Rpb24sIGhkbWF0eAorICogc2hhbGwgYmUgZGVmaW5lZC4KKyAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgKiBAcGFyYW0gIHBEYXRhIHBvaW50ZXIgdG8gZGF0YSBidWZmZXIKKyAqIEBub3RlICAgV2hlbiB0aGUgQ1JDIGZlYXR1cmUgaXMgZW5hYmxlZCB0aGUgcERhdGEgTGVuZ3RoIG11c3QgYmUgU2l6ZSArIDEuCisgKiBAcGFyYW0gIFNpemUgYW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudAorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfUmVjZWl2ZV9ETUEoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGksIHVpbnQ4X3QgKnBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBTaXplKSB7CisgIC8qIENoZWNrIHJ4IGRtYSBoYW5kbGUgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1NQSV9ETUFfSEFORExFKGhzcGktPmhkbWFyeCkpOworCisgIGlmIChoc3BpLT5TdGF0ZSAhPSBIQUxfU1BJX1NUQVRFX1JFQURZKSB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9CisKKyAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgaWYgKChoc3BpLT5Jbml0LkRpcmVjdGlvbiA9PSBTUElfRElSRUNUSU9OXzJMSU5FUykgJiYKKyAgICAgIChoc3BpLT5Jbml0Lk1vZGUgPT0gU1BJX01PREVfTUFTVEVSKSkgeworICAgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9CVVNZX1JYOworCisgICAgLyogQ2hlY2sgdHggZG1hIGhhbmRsZSAqLworICAgIGFzc2VydF9wYXJhbShJU19TUElfRE1BX0hBTkRMRShoc3BpLT5oZG1hdHgpKTsKKworICAgIC8qIENhbGwgdHJhbnNtaXQtcmVjZWl2ZSBmdW5jdGlvbiB0byBzZW5kIER1bW15IGRhdGEgb24gVHggbGluZSBhbmQgZ2VuZXJhdGUKKyAgICAgKiBjbG9jayBvbiBDTEsgbGluZSAqLworICAgIHJldHVybiBIQUxfU1BJX1RyYW5zbWl0UmVjZWl2ZV9ETUEoaHNwaSwgcERhdGEsIHBEYXRhLCBTaXplKTsKKyAgfQorCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHNwaSk7CisKKyAgLyogU2V0IHRoZSB0cmFuc2FjdGlvbiBpbmZvcm1hdGlvbiAqLworICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfQlVTWV9SWDsKKyAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9OT05FOworICBoc3BpLT5wUnhCdWZmUHRyID0gKHVpbnQ4X3QgKilwRGF0YTsKKyAgaHNwaS0+UnhYZmVyU2l6ZSA9IFNpemU7CisgIGhzcGktPlJ4WGZlckNvdW50ID0gU2l6ZTsKKworICAvKkluaXQgZmllbGQgbm90IHVzZWQgaW4gaGFuZGxlIHRvIHplcm8gKi8KKyAgaHNwaS0+UnhJU1IgPSBOVUxMOworICBoc3BpLT5UeElTUiA9IE5VTEw7CisgIGhzcGktPlR4WGZlclNpemUgPSAwVTsKKyAgaHNwaS0+VHhYZmVyQ291bnQgPSAwVTsKKworICAvKiBDb25maWd1cmUgY29tbXVuaWNhdGlvbiBkaXJlY3Rpb24gOiAxTGluZSAqLworICBpZiAoaHNwaS0+SW5pdC5EaXJlY3Rpb24gPT0gU1BJX0RJUkVDVElPTl8xTElORSkgeworICAgIC8qIERpc2FibGUgU1BJIFBlcmlwaGVyYWwgYmVmb3JlIHNldCAxTGluZSBkaXJlY3Rpb24gKEJJRElPRSBiaXQpICovCisgICAgX19IQUxfU1BJX0RJU0FCTEUoaHNwaSk7CisgICAgU1BJXzFMSU5FX1JYKGhzcGkpOworICB9CisKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgIC8qIFJlc2V0IENSQyBDYWxjdWxhdGlvbiAqLworICBpZiAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKSB7CisgICAgU1BJX1JFU0VUX0NSQyhoc3BpKTsKKyAgfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisKKyAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfTERNQVJYKTsKKyAgaWYgKGhzcGktPkluaXQuRGF0YVNpemUgPiBTUElfREFUQVNJWkVfOEJJVCkgeworICAgIC8qIFNldCBSWCBGaWZvIHRocmVzaG9sZCBhY2NvcmRpbmcgdGhlIHJlY2VwdGlvbiBkYXRhIGxlbmd0aDogMTZiaXQgKi8KKyAgICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX1JYRklGT19USFJFU0hPTEQpOworICB9IGVsc2UgeworICAgIC8qIFNldCBSWCBGaWZvIHRocmVzaG9sZCBhY2NvcmRpbmcgdGhlIHJlY2VwdGlvbiBkYXRhIGxlbmd0aDogOGJpdCAqLworICAgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX1JYRklGT19USFJFU0hPTEQpOworCisgICAgaWYgKGhzcGktPmhkbWFyeC0+SW5pdC5NZW1EYXRhQWxpZ25tZW50ID09IERNQV9NREFUQUFMSUdOX0hBTEZXT1JEKSB7CisgICAgICAvKiBTZXQgUlggRmlmbyB0aHJlc2hvbGQgYWNjb3JkaW5nIHRoZSByZWNlcHRpb24gZGF0YSBsZW5ndGg6IDE2Yml0ICovCisgICAgICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX1JYRklGT19USFJFU0hPTEQpOworCisgICAgICBpZiAoKGhzcGktPlJ4WGZlckNvdW50ICYgMHgxVSkgPT0gMHgwVSkgeworICAgICAgICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9MRE1BUlgpOworICAgICAgICBoc3BpLT5SeFhmZXJDb3VudCA9IGhzcGktPlJ4WGZlckNvdW50ID4+IDFVOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgU0VUX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX0xETUFSWCk7CisgICAgICAgIGhzcGktPlJ4WGZlckNvdW50ID0gKGhzcGktPlJ4WGZlckNvdW50ID4+IDFVKSArIDFVOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIFNldCB0aGUgU1BJIFJ4RE1BIEhhbGYgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgaHNwaS0+aGRtYXJ4LT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFNQSV9ETUFIYWxmUmVjZWl2ZUNwbHQ7CisKKyAgLyogU2V0IHRoZSBTUEkgUnggRE1BIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgIGhzcGktPmhkbWFyeC0+WGZlckNwbHRDYWxsYmFjayA9IFNQSV9ETUFSZWNlaXZlQ3BsdDsKKworICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICBoc3BpLT5oZG1hcngtPlhmZXJFcnJvckNhbGxiYWNrID0gU1BJX0RNQUVycm9yOworCisgIC8qIFNldCB0aGUgRE1BIEFib3J0Q3BsdENhbGxiYWNrICovCisgIGhzcGktPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgIC8qIEVuYWJsZSB0aGUgUnggRE1BIFN0cmVhbS9DaGFubmVsICAqLworICBpZiAoSEFMX09LICE9IEhBTF9ETUFfU3RhcnRfSVQoaHNwaS0+aGRtYXJ4LCAodWludDMyX3QpJmhzcGktPkluc3RhbmNlLT5EUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCloc3BpLT5wUnhCdWZmUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHNwaS0+UnhYZmVyQ291bnQpKSB7CisgICAgLyogVXBkYXRlIFNQSSBlcnJvciBjb2RlICovCisgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfRE1BKTsKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhzcGkpOworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayBpZiB0aGUgU1BJIGlzIGFscmVhZHkgZW5hYmxlZCAqLworICBpZiAoKGhzcGktPkluc3RhbmNlLT5DUjEgJiBTUElfQ1IxX1NQRSkgIT0gU1BJX0NSMV9TUEUpIHsKKyAgICAvKiBFbmFibGUgU1BJIHBlcmlwaGVyYWwgKi8KKyAgICBfX0hBTF9TUElfRU5BQkxFKGhzcGkpOworICB9CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHNwaSk7CisKKyAgLyogRW5hYmxlIHRoZSBTUEkgRXJyb3IgSW50ZXJydXB0IEJpdCAqLworICBfX0hBTF9TUElfRU5BQkxFX0lUKGhzcGksIChTUElfSVRfRVJSKSk7CisKKyAgLyogRW5hYmxlIFJ4IERNQSBSZXF1ZXN0ICovCisgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9SWERNQUVOKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiAgVHJhbnNtaXQgYW5kIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBETUEuCisgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICogQHBhcmFtICBwVHhEYXRhIHBvaW50ZXIgdG8gdHJhbnNtaXNzaW9uIGRhdGEgYnVmZmVyCisgKiBAcGFyYW0gIHBSeERhdGEgcG9pbnRlciB0byByZWNlcHRpb24gZGF0YSBidWZmZXIKKyAqIEBub3RlICAgV2hlbiB0aGUgQ1JDIGZlYXR1cmUgaXMgZW5hYmxlZCB0aGUgcFJ4RGF0YSBMZW5ndGggbXVzdCBiZSBTaXplICsgMQorICogQHBhcmFtICBTaXplIGFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQKKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX1RyYW5zbWl0UmVjZWl2ZV9ETUEoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcFR4RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwUnhEYXRhLCB1aW50MTZfdCBTaXplKSB7CisgIHVpbnQzMl90IHRtcF9tb2RlOworICBIQUxfU1BJX1N0YXRlVHlwZURlZiB0bXBfc3RhdGU7CisKKyAgLyogQ2hlY2sgcnggJiB0eCBkbWEgaGFuZGxlcyAqLworICBhc3NlcnRfcGFyYW0oSVNfU1BJX0RNQV9IQU5ETEUoaHNwaS0+aGRtYXJ4KSk7CisgIGFzc2VydF9wYXJhbShJU19TUElfRE1BX0hBTkRMRShoc3BpLT5oZG1hdHgpKTsKKworICAvKiBDaGVjayBEaXJlY3Rpb24gcGFyYW1ldGVyICovCisgIGFzc2VydF9wYXJhbShJU19TUElfRElSRUNUSU9OXzJMSU5FUyhoc3BpLT5Jbml0LkRpcmVjdGlvbikpOworCisgIC8qIEluaXQgdGVtcG9yYXJ5IHZhcmlhYmxlcyAqLworICB0bXBfc3RhdGUgPSBoc3BpLT5TdGF0ZTsKKyAgdG1wX21vZGUgPSBoc3BpLT5Jbml0Lk1vZGU7CisKKyAgaWYgKCEoKHRtcF9zdGF0ZSA9PSBIQUxfU1BJX1NUQVRFX1JFQURZKSB8fAorICAgICAgICAoKHRtcF9tb2RlID09IFNQSV9NT0RFX01BU1RFUikgJiYKKyAgICAgICAgIChoc3BpLT5Jbml0LkRpcmVjdGlvbiA9PSBTUElfRElSRUNUSU9OXzJMSU5FUykgJiYKKyAgICAgICAgICh0bXBfc3RhdGUgPT0gSEFMX1NQSV9TVEFURV9CVVNZX1JYKSkpKSB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9CisKKyAgaWYgKChwVHhEYXRhID09IE5VTEwpIHx8IChwUnhEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhzcGkpOworCisgIC8qIERvbid0IG92ZXJ3cml0ZSBpbiBjYXNlIG9mIEhBTF9TUElfU1RBVEVfQlVTWV9SWCAqLworICBpZiAoaHNwaS0+U3RhdGUgIT0gSEFMX1NQSV9TVEFURV9CVVNZX1JYKSB7CisgICAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX0JVU1lfVFhfUlg7CisgIH0KKworICAvKiBTZXQgdGhlIHRyYW5zYWN0aW9uIGluZm9ybWF0aW9uICovCisgIGhzcGktPkVycm9yQ29kZSA9IEhBTF9TUElfRVJST1JfTk9ORTsKKyAgaHNwaS0+cFR4QnVmZlB0ciA9IChjb25zdCB1aW50OF90ICopcFR4RGF0YTsKKyAgaHNwaS0+VHhYZmVyU2l6ZSA9IFNpemU7CisgIGhzcGktPlR4WGZlckNvdW50ID0gU2l6ZTsKKyAgaHNwaS0+cFJ4QnVmZlB0ciA9ICh1aW50OF90ICopcFJ4RGF0YTsKKyAgaHNwaS0+UnhYZmVyU2l6ZSA9IFNpemU7CisgIGhzcGktPlJ4WGZlckNvdW50ID0gU2l6ZTsKKworICAvKiBJbml0IGZpZWxkIG5vdCB1c2VkIGluIGhhbmRsZSB0byB6ZXJvICovCisgIGhzcGktPlJ4SVNSID0gTlVMTDsKKyAgaHNwaS0+VHhJU1IgPSBOVUxMOworCisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAvKiBSZXNldCBDUkMgQ2FsY3VsYXRpb24gKi8KKyAgaWYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkgeworICAgIFNQSV9SRVNFVF9DUkMoaHNwaSk7CisgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisgIC8qIFJlc2V0IHRoZSB0aHJlc2hvbGQgYml0ICovCisgIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX0xETUFUWCB8IFNQSV9DUjJfTERNQVJYKTsKKworICAvKiBUaGUgcGFja2luZyBtb2RlIG1hbmFnZW1lbnQgaXMgZW5hYmxlZCBieSB0aGUgRE1BIHNldHRpbmdzIGFjY29yZGluZyB0aGUKKyAgICogc3BpIGRhdGEgc2l6ZSAqLworICBpZiAoaHNwaS0+SW5pdC5EYXRhU2l6ZSA+IFNQSV9EQVRBU0laRV84QklUKSB7CisgICAgLyogU2V0IGZpZm9yeHRocmVzaG9sZCBhY2NvcmRpbmcgdGhlIHJlY2VwdGlvbiBkYXRhIGxlbmd0aDogMTZiaXQgKi8KKyAgICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX1JYRklGT19USFJFU0hPTEQpOworICB9IGVsc2UgeworICAgIC8qIFNldCBSWCBGaWZvIHRocmVzaG9sZCBhY2NvcmRpbmcgdGhlIHJlY2VwdGlvbiBkYXRhIGxlbmd0aDogOGJpdCAqLworICAgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX1JYRklGT19USFJFU0hPTEQpOworCisgICAgaWYgKGhzcGktPmhkbWF0eC0+SW5pdC5NZW1EYXRhQWxpZ25tZW50ID09IERNQV9NREFUQUFMSUdOX0hBTEZXT1JEKSB7CisgICAgICBpZiAoKGhzcGktPlR4WGZlclNpemUgJiAweDFVKSA9PSAweDBVKSB7CisgICAgICAgIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX0xETUFUWCk7CisgICAgICAgIGhzcGktPlR4WGZlckNvdW50ID0gaHNwaS0+VHhYZmVyQ291bnQgPj4gMVU7CisgICAgICB9IGVsc2UgeworICAgICAgICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfTERNQVRYKTsKKyAgICAgICAgaHNwaS0+VHhYZmVyQ291bnQgPSAoaHNwaS0+VHhYZmVyQ291bnQgPj4gMVUpICsgMVU7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGhzcGktPmhkbWFyeC0+SW5pdC5NZW1EYXRhQWxpZ25tZW50ID09IERNQV9NREFUQUFMSUdOX0hBTEZXT1JEKSB7CisgICAgICAvKiBTZXQgUlggRmlmbyB0aHJlc2hvbGQgYWNjb3JkaW5nIHRoZSByZWNlcHRpb24gZGF0YSBsZW5ndGg6IDE2Yml0ICovCisgICAgICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX1JYRklGT19USFJFU0hPTEQpOworCisgICAgICBpZiAoKGhzcGktPlJ4WGZlckNvdW50ICYgMHgxVSkgPT0gMHgwVSkgeworICAgICAgICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9MRE1BUlgpOworICAgICAgICBoc3BpLT5SeFhmZXJDb3VudCA9IGhzcGktPlJ4WGZlckNvdW50ID4+IDFVOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgU0VUX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX0xETUFSWCk7CisgICAgICAgIGhzcGktPlJ4WGZlckNvdW50ID0gKGhzcGktPlJ4WGZlckNvdW50ID4+IDFVKSArIDFVOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIENoZWNrIGlmIHdlIGFyZSBpbiBSeCBvbmx5IG9yIGluIFJ4L1R4IE1vZGUgYW5kIGNvbmZpZ3VyZSB0aGUgRE1BIHRyYW5zZmVyCisgICAqIGNvbXBsZXRlIGNhbGxiYWNrICovCisgIGlmIChoc3BpLT5TdGF0ZSA9PSBIQUxfU1BJX1NUQVRFX0JVU1lfUlgpIHsKKyAgICAvKiBTZXQgdGhlIFNQSSBSeCBETUEgSGFsZiB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgIGhzcGktPmhkbWFyeC0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBTUElfRE1BSGFsZlJlY2VpdmVDcGx0OworICAgIGhzcGktPmhkbWFyeC0+WGZlckNwbHRDYWxsYmFjayA9IFNQSV9ETUFSZWNlaXZlQ3BsdDsKKyAgfSBlbHNlIHsKKyAgICAvKiBTZXQgdGhlIFNQSSBUeC9SeCBETUEgSGFsZiB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgIGhzcGktPmhkbWFyeC0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBTUElfRE1BSGFsZlRyYW5zbWl0UmVjZWl2ZUNwbHQ7CisgICAgaHNwaS0+aGRtYXJ4LT5YZmVyQ3BsdENhbGxiYWNrID0gU1BJX0RNQVRyYW5zbWl0UmVjZWl2ZUNwbHQ7CisgIH0KKworICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICBoc3BpLT5oZG1hcngtPlhmZXJFcnJvckNhbGxiYWNrID0gU1BJX0RNQUVycm9yOworCisgIC8qIFNldCB0aGUgRE1BIEFib3J0Q3BsdENhbGxiYWNrICovCisgIGhzcGktPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgIC8qIEVuYWJsZSB0aGUgUnggRE1BIFN0cmVhbS9DaGFubmVsICAqLworICBpZiAoSEFMX09LICE9IEhBTF9ETUFfU3RhcnRfSVQoaHNwaS0+aGRtYXJ4LCAodWludDMyX3QpJmhzcGktPkluc3RhbmNlLT5EUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCloc3BpLT5wUnhCdWZmUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHNwaS0+UnhYZmVyQ291bnQpKSB7CisgICAgLyogVXBkYXRlIFNQSSBlcnJvciBjb2RlICovCisgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfRE1BKTsKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhzcGkpOworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBFbmFibGUgUnggRE1BIFJlcXVlc3QgKi8KKyAgU0VUX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1JYRE1BRU4pOworCisgIC8qIFNldCB0aGUgU1BJIFR4IERNQSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayBhcyBOVUxMIGJlY2F1c2UgdGhlCisgIGNvbW11bmljYXRpb24gY2xvc2luZyBpcyBwZXJmb3JtZWQgaW4gRE1BIHJlY2VwdGlvbiBjb21wbGV0ZSBjYWxsYmFjayAgKi8KKyAgaHNwaS0+aGRtYXR4LT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IE5VTEw7CisgIGhzcGktPmhkbWF0eC0+WGZlckNwbHRDYWxsYmFjayA9IE5VTEw7CisgIGhzcGktPmhkbWF0eC0+WGZlckVycm9yQ2FsbGJhY2sgPSBOVUxMOworICBoc3BpLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICAvKiBFbmFibGUgdGhlIFR4IERNQSBTdHJlYW0vQ2hhbm5lbCAgKi8KKyAgaWYgKEhBTF9PSyAhPSBIQUxfRE1BX1N0YXJ0X0lUKGhzcGktPmhkbWF0eCwgKHVpbnQzMl90KWhzcGktPnBUeEJ1ZmZQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpJmhzcGktPkluc3RhbmNlLT5EUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhzcGktPlR4WGZlckNvdW50KSkgeworICAgIC8qIFVwZGF0ZSBTUEkgZXJyb3IgY29kZSAqLworICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0RNQSk7CisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoc3BpKTsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgaWYgdGhlIFNQSSBpcyBhbHJlYWR5IGVuYWJsZWQgKi8KKyAgaWYgKChoc3BpLT5JbnN0YW5jZS0+Q1IxICYgU1BJX0NSMV9TUEUpICE9IFNQSV9DUjFfU1BFKSB7CisgICAgLyogRW5hYmxlIFNQSSBwZXJpcGhlcmFsICovCisgICAgX19IQUxfU1BJX0VOQUJMRShoc3BpKTsKKyAgfQorCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhzcGkpOworCisgIC8qIEVuYWJsZSB0aGUgU1BJIEVycm9yIEludGVycnVwdCBCaXQgKi8KKyAgX19IQUxfU1BJX0VOQUJMRV9JVChoc3BpLCAoU1BJX0lUX0VSUikpOworCisgIC8qIEVuYWJsZSBUeCBETUEgUmVxdWVzdCAqLworICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfVFhETUFFTik7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgIEFib3J0IG9uZ29pbmcgdHJhbnNmZXIgKGJsb2NraW5nIG1vZGUpLgorICogQHBhcmFtICBoc3BpIFNQSSBoYW5kbGUuCisgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGNvdWxkIGJlIHVzZWQgZm9yIGFib3J0aW5nIGFueSBvbmdvaW5nIHRyYW5zZmVyIChUeAorICogYW5kIFJ4KSwgc3RhcnRlZCBpbiBJbnRlcnJ1cHQgb3IgRE1BIG1vZGUuIFRoaXMgcHJvY2VkdXJlIHBlcmZvcm1zIGZvbGxvd2luZworICogb3BlcmF0aW9ucyA6CisgKiAgICAgICAgICAgLSBEaXNhYmxlIFNQSSBJbnRlcnJ1cHRzIChkZXBlbmRpbmcgb2YgdHJhbnNmZXIgZGlyZWN0aW9uKQorICogICAgICAgICAgIC0gRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGluIHRoZSBwZXJpcGhlcmFsIHJlZ2lzdGVyIChpZiBlbmFibGVkKQorICogICAgICAgICAgIC0gQWJvcnQgRE1BIHRyYW5zZmVyIGJ5IGNhbGxpbmcgSEFMX0RNQV9BYm9ydCAoaW4gY2FzZSBvZiB0cmFuc2ZlcgorICogaW4gRE1BIG1vZGUpCisgKiAgICAgICAgICAgLSBTZXQgaGFuZGxlIFN0YXRlIHRvIFJFQURZCisgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGlzIGV4ZWN1dGVkIGluIGJsb2NraW5nIG1vZGUgOiB3aGVuIGV4aXRpbmcgZnVuY3Rpb24sCisgKiBBYm9ydCBpcyBjb25zaWRlcmVkIGFzIGNvbXBsZXRlZC4KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX0Fib3J0KFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKSB7CisgIEhBTF9TdGF0dXNUeXBlRGVmIGVycm9yY29kZTsKKyAgX19JTyB1aW50MzJfdCBjb3VudDsKKyAgX19JTyB1aW50MzJfdCByZXNldGNvdW50OworCisgIC8qIEluaXRpYWxpemVkIGxvY2FsIHZhcmlhYmxlICAqLworICBlcnJvcmNvZGUgPSBIQUxfT0s7CisgIHJlc2V0Y291bnQgPSBTUElfREVGQVVMVF9USU1FT1VUICogKFN5c3RlbUNvcmVDbG9jayAvIDI0VSAvIDEwMDBVKTsKKyAgY291bnQgPSByZXNldGNvdW50OworCisgIC8qIENsZWFyIEVSUklFIGludGVycnVwdCB0byBhdm9pZCBlcnJvciBpbnRlcnJ1cHRzIGdlbmVyYXRpb24gZHVyaW5nIEFib3J0CisgICAqIHByb2NlZHVyZSAqLworICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9FUlJJRSk7CisKKyAgLyogRGlzYWJsZSBUWEVJRSwgUlhORUlFIGFuZCBFUlJJRShtb2RlIGZhdWx0IGV2ZW50LCBvdmVycnVuIGVycm9yLCBUSSBmcmFtZQorICAgKiBlcnJvcikgaW50ZXJydXB0cyAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9UWEVJRSkpIHsKKyAgICBoc3BpLT5UeElTUiA9IFNQSV9BYm9ydFR4X0lTUjsKKyAgICAvKiBXYWl0IEhBTF9TUElfU1RBVEVfQUJPUlQgc3RhdGUgKi8KKyAgICBkbyB7CisgICAgICBpZiAoY291bnQgPT0gMFUpIHsKKyAgICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfQUJPUlQpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNvdW50LS07CisgICAgfSB3aGlsZSAoaHNwaS0+U3RhdGUgIT0gSEFMX1NQSV9TVEFURV9BQk9SVCk7CisgICAgLyogUmVzZXQgVGltZW91dCBDb3VudGVyICovCisgICAgY291bnQgPSByZXNldGNvdW50OworICB9CisKKyAgaWYgKEhBTF9JU19CSVRfU0VUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfUlhORUlFKSkgeworICAgIGhzcGktPlJ4SVNSID0gU1BJX0Fib3J0UnhfSVNSOworICAgIC8qIFdhaXQgSEFMX1NQSV9TVEFURV9BQk9SVCBzdGF0ZSAqLworICAgIGRvIHsKKyAgICAgIGlmIChjb3VudCA9PSAwVSkgeworICAgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9BQk9SVCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY291bnQtLTsKKyAgICB9IHdoaWxlIChoc3BpLT5TdGF0ZSAhPSBIQUxfU1BJX1NUQVRFX0FCT1JUKTsKKyAgICAvKiBSZXNldCBUaW1lb3V0IENvdW50ZXIgKi8KKyAgICBjb3VudCA9IHJlc2V0Y291bnQ7CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBTUEkgRE1BIFR4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9UWERNQUVOKSkgeworICAgIC8qIEFib3J0IHRoZSBTUEkgRE1BIFR4IFN0cmVhbS9DaGFubmVsIDogdXNlIGJsb2NraW5nIERNQSBBYm9ydCBBUEkgKG5vCisgICAgICogY2FsbGJhY2spICovCisgICAgaWYgKGhzcGktPmhkbWF0eCAhPSBOVUxMKSB7CisgICAgICAvKiBTZXQgdGhlIFNQSSBETUEgQWJvcnQgY2FsbGJhY2sgOgorICAgICAgd2lsbCBsZWFkIHRvIGNhbGwgSEFMX1NQSV9BYm9ydENwbHRDYWxsYmFjaygpIGF0IGVuZCBvZiBETUEgYWJvcnQKKyAgICAgIHByb2NlZHVyZSAqLworICAgICAgaHNwaS0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgICAgIC8qIEFib3J0IERNQSBUeCBIYW5kbGUgbGlua2VkIHRvIFNQSSBQZXJpcGhlcmFsICovCisgICAgICBpZiAoSEFMX0RNQV9BYm9ydChoc3BpLT5oZG1hdHgpICE9IEhBTF9PSykgeworICAgICAgICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX0FCT1JUOworICAgICAgfQorCisgICAgICAvKiBEaXNhYmxlIFR4IERNQSBSZXF1ZXN0ICovCisgICAgICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgKFNQSV9DUjJfVFhETUFFTikpOworCisgICAgICBpZiAoU1BJX0VuZFJ4VHhUcmFuc2FjdGlvbihoc3BpLCBTUElfREVGQVVMVF9USU1FT1VULCBIQUxfR2V0VGljaygpKSAhPQorICAgICAgICAgIEhBTF9PSykgeworICAgICAgICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX0FCT1JUOworICAgICAgfQorCisgICAgICAvKiBEaXNhYmxlIFNQSSBQZXJpcGhlcmFsICovCisgICAgICBfX0hBTF9TUElfRElTQUJMRShoc3BpKTsKKworICAgICAgLyogRW1wdHkgdGhlIEZSTFZMIGZpZm8gKi8KKyAgICAgIGlmIChTUElfV2FpdEZpZm9TdGF0ZVVudGlsVGltZW91dChoc3BpLCBTUElfRkxBR19GUkxWTCwgU1BJX0ZSTFZMX0VNUFRZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQSV9ERUZBVUxUX1RJTUVPVVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0dldFRpY2soKSkgIT0gSEFMX09LKSB7CisgICAgICAgIGhzcGktPkVycm9yQ29kZSA9IEhBTF9TUElfRVJST1JfQUJPUlQ7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogRGlzYWJsZSB0aGUgU1BJIERNQSBSeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfUlhETUFFTikpIHsKKyAgICAvKiBBYm9ydCB0aGUgU1BJIERNQSBSeCBTdHJlYW0vQ2hhbm5lbCA6IHVzZSBibG9ja2luZyBETUEgQWJvcnQgQVBJIChubworICAgICAqIGNhbGxiYWNrKSAqLworICAgIGlmIChoc3BpLT5oZG1hcnggIT0gTlVMTCkgeworICAgICAgLyogU2V0IHRoZSBTUEkgRE1BIEFib3J0IGNhbGxiYWNrIDoKKyAgICAgIHdpbGwgbGVhZCB0byBjYWxsIEhBTF9TUElfQWJvcnRDcGx0Q2FsbGJhY2soKSBhdCBlbmQgb2YgRE1BIGFib3J0CisgICAgICBwcm9jZWR1cmUgKi8KKyAgICAgIGhzcGktPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgICAgICAvKiBBYm9ydCBETUEgUnggSGFuZGxlIGxpbmtlZCB0byBTUEkgUGVyaXBoZXJhbCAqLworICAgICAgaWYgKEhBTF9ETUFfQWJvcnQoaHNwaS0+aGRtYXJ4KSAhPSBIQUxfT0spIHsKKyAgICAgICAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9BQk9SVDsKKyAgICAgIH0KKworICAgICAgLyogRGlzYWJsZSBwZXJpcGhlcmFsICovCisgICAgICBfX0hBTF9TUElfRElTQUJMRShoc3BpKTsKKworICAgICAgLyogQ29udHJvbCB0aGUgQlNZIGZsYWcgKi8KKyAgICAgIGlmIChTUElfV2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChoc3BpLCBTUElfRkxBR19CU1ksIFJFU0VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQSV9ERUZBVUxUX1RJTUVPVVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0dldFRpY2soKSkgIT0gSEFMX09LKSB7CisgICAgICAgIGhzcGktPkVycm9yQ29kZSA9IEhBTF9TUElfRVJST1JfQUJPUlQ7CisgICAgICB9CisKKyAgICAgIC8qIEVtcHR5IHRoZSBGUkxWTCBmaWZvICovCisgICAgICBpZiAoU1BJX1dhaXRGaWZvU3RhdGVVbnRpbFRpbWVvdXQoaHNwaSwgU1BJX0ZMQUdfRlJMVkwsIFNQSV9GUkxWTF9FTVBUWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUElfREVGQVVMVF9USU1FT1VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9HZXRUaWNrKCkpICE9IEhBTF9PSykgeworICAgICAgICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX0FCT1JUOworICAgICAgfQorCisgICAgICAvKiBEaXNhYmxlIFJ4IERNQSBSZXF1ZXN0ICovCisgICAgICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgKFNQSV9DUjJfUlhETUFFTikpOworICAgIH0KKyAgfQorICAvKiBSZXNldCBUeCBhbmQgUnggdHJhbnNmZXIgY291bnRlcnMgKi8KKyAgaHNwaS0+UnhYZmVyQ291bnQgPSAwVTsKKyAgaHNwaS0+VHhYZmVyQ291bnQgPSAwVTsKKworICAvKiBDaGVjayBlcnJvciBkdXJpbmcgQWJvcnQgcHJvY2VkdXJlICovCisgIGlmIChoc3BpLT5FcnJvckNvZGUgPT0gSEFMX1NQSV9FUlJPUl9BQk9SVCkgeworICAgIC8qIHJldHVybiBIQUxfRXJyb3IgaW4gY2FzZSBvZiBlcnJvciBkdXJpbmcgQWJvcnQgcHJvY2VkdXJlICovCisgICAgZXJyb3Jjb2RlID0gSEFMX0VSUk9SOworICB9IGVsc2UgeworICAgIC8qIFJlc2V0IGVycm9yQ29kZSAqLworICAgIGhzcGktPkVycm9yQ29kZSA9IEhBTF9TUElfRVJST1JfTk9ORTsKKyAgfQorCisgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgU1IgcmVnaXN0ZXIgKi8KKyAgX19IQUxfU1BJX0NMRUFSX09WUkZMQUcoaHNwaSk7CisgIF9fSEFMX1NQSV9DTEVBUl9GUkVGTEFHKGhzcGkpOworCisgIC8qIFJlc3RvcmUgaHNwaS0+c3RhdGUgdG8gcmVhZHkgKi8KKyAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX1JFQURZOworCisgIHJldHVybiBlcnJvcmNvZGU7Cit9CisKKy8qKgorICogQGJyaWVmICBBYm9ydCBvbmdvaW5nIHRyYW5zZmVyIChJbnRlcnJ1cHQgbW9kZSkuCisgKiBAcGFyYW0gIGhzcGkgU1BJIGhhbmRsZS4KKyAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgY291bGQgYmUgdXNlZCBmb3IgYWJvcnRpbmcgYW55IG9uZ29pbmcgdHJhbnNmZXIgKFR4CisgKiBhbmQgUngpLCBzdGFydGVkIGluIEludGVycnVwdCBvciBETUEgbW9kZS4gVGhpcyBwcm9jZWR1cmUgcGVyZm9ybXMgZm9sbG93aW5nCisgKiBvcGVyYXRpb25zIDoKKyAqICAgICAgICAgICAtIERpc2FibGUgU1BJIEludGVycnVwdHMgKGRlcGVuZGluZyBvZiB0cmFuc2ZlciBkaXJlY3Rpb24pCisgKiAgICAgICAgICAgLSBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgaW4gdGhlIHBlcmlwaGVyYWwgcmVnaXN0ZXIgKGlmIGVuYWJsZWQpCisgKiAgICAgICAgICAgLSBBYm9ydCBETUEgdHJhbnNmZXIgYnkgY2FsbGluZyBIQUxfRE1BX0Fib3J0X0lUIChpbiBjYXNlIG9mCisgKiB0cmFuc2ZlciBpbiBETUEgbW9kZSkKKyAqICAgICAgICAgICAtIFNldCBoYW5kbGUgU3RhdGUgdG8gUkVBRFkKKyAqICAgICAgICAgICAtIEF0IGFib3J0IGNvbXBsZXRpb24sIGNhbGwgdXNlciBhYm9ydCBjb21wbGV0ZSBjYWxsYmFjaworICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBpcyBleGVjdXRlZCBpbiBJbnRlcnJ1cHQgbW9kZSwgbWVhbmluZyB0aGF0IGFib3J0CisgKiBwcm9jZWR1cmUgY291bGQgYmUgY29uc2lkZXJlZCBhcyBjb21wbGV0ZWQgb25seSB3aGVuIHVzZXIgYWJvcnQgY29tcGxldGUKKyAqIGNhbGxiYWNrIGlzIGV4ZWN1dGVkIChub3Qgd2hlbiBleGl0aW5nIGZ1bmN0aW9uKS4KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX0Fib3J0X0lUKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKSB7CisgIEhBTF9TdGF0dXNUeXBlRGVmIGVycm9yY29kZTsKKyAgdWludDMyX3QgYWJvcnRjcGx0OworICBfX0lPIHVpbnQzMl90IGNvdW50OworICBfX0lPIHVpbnQzMl90IHJlc2V0Y291bnQ7CisKKyAgLyogSW5pdGlhbGl6ZWQgbG9jYWwgdmFyaWFibGUgICovCisgIGVycm9yY29kZSA9IEhBTF9PSzsKKyAgYWJvcnRjcGx0ID0gMVU7CisgIHJlc2V0Y291bnQgPSBTUElfREVGQVVMVF9USU1FT1VUICogKFN5c3RlbUNvcmVDbG9jayAvIDI0VSAvIDEwMDBVKTsKKyAgY291bnQgPSByZXNldGNvdW50OworCisgIC8qIENsZWFyIEVSUklFIGludGVycnVwdCB0byBhdm9pZCBlcnJvciBpbnRlcnJ1cHRzIGdlbmVyYXRpb24gZHVyaW5nIEFib3J0CisgICAqIHByb2NlZHVyZSAqLworICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9FUlJJRSk7CisKKyAgLyogQ2hhbmdlIFJ4IGFuZCBUeCBJcnEgSGFuZGxlciB0byBEaXNhYmxlIFRYRUlFLCBSWE5FSUUgYW5kIEVSUklFIGludGVycnVwdHMKKyAgICovCisgIGlmIChIQUxfSVNfQklUX1NFVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1RYRUlFKSkgeworICAgIGhzcGktPlR4SVNSID0gU1BJX0Fib3J0VHhfSVNSOworICAgIC8qIFdhaXQgSEFMX1NQSV9TVEFURV9BQk9SVCBzdGF0ZSAqLworICAgIGRvIHsKKyAgICAgIGlmIChjb3VudCA9PSAwVSkgeworICAgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9BQk9SVCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY291bnQtLTsKKyAgICB9IHdoaWxlIChoc3BpLT5TdGF0ZSAhPSBIQUxfU1BJX1NUQVRFX0FCT1JUKTsKKyAgICAvKiBSZXNldCBUaW1lb3V0IENvdW50ZXIgKi8KKyAgICBjb3VudCA9IHJlc2V0Y291bnQ7CisgIH0KKworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9SWE5FSUUpKSB7CisgICAgaHNwaS0+UnhJU1IgPSBTUElfQWJvcnRSeF9JU1I7CisgICAgLyogV2FpdCBIQUxfU1BJX1NUQVRFX0FCT1JUIHN0YXRlICovCisgICAgZG8geworICAgICAgaWYgKGNvdW50ID09IDBVKSB7CisgICAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0FCT1JUKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjb3VudC0tOworICAgIH0gd2hpbGUgKGhzcGktPlN0YXRlICE9IEhBTF9TUElfU1RBVEVfQUJPUlQpOworICAgIC8qIFJlc2V0IFRpbWVvdXQgQ291bnRlciAqLworICAgIGNvdW50ID0gcmVzZXRjb3VudDsKKyAgfQorCisgIC8qIElmIERNQSBUeCBhbmQvb3IgRE1BIFJ4IEhhbmRsZXMgYXJlIGFzc29jaWF0ZWQgdG8gU1BJIEhhbmRsZSwgRE1BIEFib3J0CisgICAgIGNvbXBsZXRlIGNhbGxiYWNrcyBzaG91bGQgYmUgaW5pdGlhbGlzZWQgYmVmb3JlIGFueSBjYWxsIHRvIERNQSBBYm9ydAorICAgICBmdW5jdGlvbnMgKi8KKyAgLyogRE1BIFR4IEhhbmRsZSBpcyB2YWxpZCAqLworICBpZiAoaHNwaS0+aGRtYXR4ICE9IE5VTEwpIHsKKyAgICAvKiBTZXQgRE1BIEFib3J0IENvbXBsZXRlIGNhbGxiYWNrIGlmIFVBUlQgRE1BIFR4IHJlcXVlc3QgaWYgZW5hYmxlZC4KKyAgICAgICBPdGhlcndpc2UsIHNldCBpdCB0byBOVUxMICovCisgICAgaWYgKEhBTF9JU19CSVRfU0VUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfVFhETUFFTikpIHsKKyAgICAgIGhzcGktPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBTUElfRE1BVHhBYm9ydENhbGxiYWNrOworICAgIH0gZWxzZSB7CisgICAgICBoc3BpLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKyAgICB9CisgIH0KKyAgLyogRE1BIFJ4IEhhbmRsZSBpcyB2YWxpZCAqLworICBpZiAoaHNwaS0+aGRtYXJ4ICE9IE5VTEwpIHsKKyAgICAvKiBTZXQgRE1BIEFib3J0IENvbXBsZXRlIGNhbGxiYWNrIGlmIFVBUlQgRE1BIFJ4IHJlcXVlc3QgaWYgZW5hYmxlZC4KKyAgICAgICBPdGhlcndpc2UsIHNldCBpdCB0byBOVUxMICovCisgICAgaWYgKEhBTF9JU19CSVRfU0VUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfUlhETUFFTikpIHsKKyAgICAgIGhzcGktPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBTUElfRE1BUnhBYm9ydENhbGxiYWNrOworICAgIH0gZWxzZSB7CisgICAgICBoc3BpLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKyAgICB9CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBTUEkgRE1BIFR4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9UWERNQUVOKSkgeworICAgIC8qIEFib3J0IHRoZSBTUEkgRE1BIFR4IFN0cmVhbS9DaGFubmVsICovCisgICAgaWYgKGhzcGktPmhkbWF0eCAhPSBOVUxMKSB7CisgICAgICAvKiBBYm9ydCBETUEgVHggSGFuZGxlIGxpbmtlZCB0byBTUEkgUGVyaXBoZXJhbCAqLworICAgICAgaWYgKEhBTF9ETUFfQWJvcnRfSVQoaHNwaS0+aGRtYXR4KSAhPSBIQUxfT0spIHsKKyAgICAgICAgaHNwaS0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisgICAgICAgIGhzcGktPkVycm9yQ29kZSA9IEhBTF9TUElfRVJST1JfQUJPUlQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBhYm9ydGNwbHQgPSAwVTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLyogRGlzYWJsZSB0aGUgU1BJIERNQSBSeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfUlhETUFFTikpIHsKKyAgICAvKiBBYm9ydCB0aGUgU1BJIERNQSBSeCBTdHJlYW0vQ2hhbm5lbCAqLworICAgIGlmIChoc3BpLT5oZG1hcnggIT0gTlVMTCkgeworICAgICAgLyogQWJvcnQgRE1BIFJ4IEhhbmRsZSBsaW5rZWQgdG8gU1BJIFBlcmlwaGVyYWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX0Fib3J0X0lUKGhzcGktPmhkbWFyeCkgIT0gSEFMX09LKSB7CisgICAgICAgIGhzcGktPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworICAgICAgICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX0FCT1JUOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYWJvcnRjcGx0ID0gMFU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKGFib3J0Y3BsdCA9PSAxVSkgeworICAgIC8qIFJlc2V0IFR4IGFuZCBSeCB0cmFuc2ZlciBjb3VudGVycyAqLworICAgIGhzcGktPlJ4WGZlckNvdW50ID0gMFU7CisgICAgaHNwaS0+VHhYZmVyQ291bnQgPSAwVTsKKworICAgIC8qIENoZWNrIGVycm9yIGR1cmluZyBBYm9ydCBwcm9jZWR1cmUgKi8KKyAgICBpZiAoaHNwaS0+RXJyb3JDb2RlID09IEhBTF9TUElfRVJST1JfQUJPUlQpIHsKKyAgICAgIC8qIHJldHVybiBIQUxfRXJyb3IgaW4gY2FzZSBvZiBlcnJvciBkdXJpbmcgQWJvcnQgcHJvY2VkdXJlICovCisgICAgICBlcnJvcmNvZGUgPSBIQUxfRVJST1I7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIFJlc2V0IGVycm9yQ29kZSAqLworICAgICAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9OT05FOworICAgIH0KKworICAgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgU1IgcmVnaXN0ZXIgKi8KKyAgICBfX0hBTF9TUElfQ0xFQVJfT1ZSRkxBRyhoc3BpKTsKKyAgICBfX0hBTF9TUElfQ0xFQVJfRlJFRkxBRyhoc3BpKTsKKworICAgIC8qIFJlc3RvcmUgaHNwaS0+U3RhdGUgdG8gUmVhZHkgKi8KKyAgICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBBcyBubyBETUEgdG8gYmUgYWJvcnRlZCwgY2FsbCBkaXJlY3RseSB1c2VyIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICBoc3BpLT5BYm9ydENwbHRDYWxsYmFjayhoc3BpKTsKKyNlbHNlCisgICAgSEFMX1NQSV9BYm9ydENwbHRDYWxsYmFjayhoc3BpKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorCisgIHJldHVybiBlcnJvcmNvZGU7Cit9CisKKy8qKgorICogQGJyaWVmICBQYXVzZSB0aGUgRE1BIFRyYW5zZmVyLgorICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTUEkgbW9kdWxlLgorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfRE1BUGF1c2UoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpIHsKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoc3BpKTsKKworICAvKiBEaXNhYmxlIHRoZSBTUEkgRE1BIFR4ICYgUnggcmVxdWVzdHMgKi8KKyAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfVFhETUFFTiB8IFNQSV9DUjJfUlhETUFFTik7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHNwaSk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgIFJlc3VtZSB0aGUgRE1BIFRyYW5zZmVyLgorICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTUEkgbW9kdWxlLgorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfRE1BUmVzdW1lKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKSB7CisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHNwaSk7CisKKyAgLyogRW5hYmxlIHRoZSBTUEkgRE1BIFR4ICYgUnggcmVxdWVzdHMgKi8KKyAgU0VUX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1RYRE1BRU4gfCBTUElfQ1IyX1JYRE1BRU4pOworCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhzcGkpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICogQGJyaWVmICBTdG9wIHRoZSBETUEgVHJhbnNmZXIuCisgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNQSSBtb2R1bGUuCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9ETUFTdG9wKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKSB7CisgIEhBTF9TdGF0dXNUeXBlRGVmIGVycm9yY29kZSA9IEhBTF9PSzsKKyAgLyogVGhlIExvY2sgaXMgbm90IGltcGxlbWVudGVkIG9uIHRoaXMgQVBJIHRvIGFsbG93IHRoZSB1c2VyIGFwcGxpY2F0aW9uCisgICAgIHRvIGNhbGwgdGhlIEhBTCBTUEkgQVBJIHVuZGVyIGNhbGxiYWNrcyBIQUxfU1BJX1R4Q3BsdENhbGxiYWNrKCkgb3IKKyAgICAgSEFMX1NQSV9SeENwbHRDYWxsYmFjaygpIG9yIEhBTF9TUElfVHhSeENwbHRDYWxsYmFjaygpOiB3aGVuIGNhbGxpbmcKKyAgICAgSEFMX0RNQV9BYm9ydCgpIEFQSSB0aGUgRE1BIFRYL1JYIFRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdCBpcyBnZW5lcmF0ZWQKKyAgICAgYW5kIHRoZSBjb3JyZXNwb25kIGNhbGwgYmFjayBpcyBleGVjdXRlZCBIQUxfU1BJX1R4Q3BsdENhbGxiYWNrKCkgb3IKKyAgICAgSEFMX1NQSV9SeENwbHRDYWxsYmFjaygpIG9yIEhBTF9TUElfVHhSeENwbHRDYWxsYmFjaygpCisgICAgICovCisKKyAgLyogQWJvcnQgdGhlIFNQSSBETUEgdHggU3RyZWFtL0NoYW5uZWwgICovCisgIGlmIChoc3BpLT5oZG1hdHggIT0gTlVMTCkgeworICAgIGlmIChIQUxfT0sgIT0gSEFMX0RNQV9BYm9ydChoc3BpLT5oZG1hdHgpKSB7CisgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9ETUEpOworICAgICAgZXJyb3Jjb2RlID0gSEFMX0VSUk9SOworICAgIH0KKyAgfQorICAvKiBBYm9ydCB0aGUgU1BJIERNQSByeCBTdHJlYW0vQ2hhbm5lbCAgKi8KKyAgaWYgKGhzcGktPmhkbWFyeCAhPSBOVUxMKSB7CisgICAgaWYgKEhBTF9PSyAhPSBIQUxfRE1BX0Fib3J0KGhzcGktPmhkbWFyeCkpIHsKKyAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0RNQSk7CisgICAgICBlcnJvcmNvZGUgPSBIQUxfRVJST1I7CisgICAgfQorICB9CisKKyAgLyogRGlzYWJsZSB0aGUgU1BJIERNQSBUeCAmIFJ4IHJlcXVlc3RzICovCisgIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1RYRE1BRU4gfCBTUElfQ1IyX1JYRE1BRU4pOworICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfUkVBRFk7CisgIHJldHVybiBlcnJvcmNvZGU7Cit9CisKKy8qKgorICogQGJyaWVmICBIYW5kbGUgU1BJIGludGVycnVwdCByZXF1ZXN0LgorICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTUEkgbW9kdWxlLgorICogQHJldHZhbCBOb25lCisgKi8KK3ZvaWQgSEFMX1NQSV9JUlFIYW5kbGVyKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKSB7CisgIHVpbnQzMl90IGl0c291cmNlID0gaHNwaS0+SW5zdGFuY2UtPkNSMjsKKyAgdWludDMyX3QgaXRmbGFnID0gaHNwaS0+SW5zdGFuY2UtPlNSOworCisgIC8qIFNQSSBpbiBtb2RlIFJlY2VpdmVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKFNQSV9DSEVDS19GTEFHKGl0ZmxhZywgU1BJX0ZMQUdfT1ZSKSA9PSBSRVNFVCkgJiYKKyAgICAgIChTUElfQ0hFQ0tfRkxBRyhpdGZsYWcsIFNQSV9GTEFHX1JYTkUpICE9IFJFU0VUKSAmJgorICAgICAgKFNQSV9DSEVDS19JVF9TT1VSQ0UoaXRzb3VyY2UsIFNQSV9JVF9SWE5FKSAhPSBSRVNFVCkpIHsKKyAgICBoc3BpLT5SeElTUihoc3BpKTsKKyAgICByZXR1cm47CisgIH0KKworICAvKiBTUEkgaW4gbW9kZSBUcmFuc21pdHRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKChTUElfQ0hFQ0tfRkxBRyhpdGZsYWcsIFNQSV9GTEFHX1RYRSkgIT0gUkVTRVQpICYmCisgICAgICAoU1BJX0NIRUNLX0lUX1NPVVJDRShpdHNvdXJjZSwgU1BJX0lUX1RYRSkgIT0gUkVTRVQpKSB7CisgICAgaHNwaS0+VHhJU1IoaHNwaSk7CisgICAgcmV0dXJuOworICB9CisKKyAgLyogU1BJIGluIEVycm9yIFRyZWF0bWVudCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKFNQSV9DSEVDS19GTEFHKGl0ZmxhZywgU1BJX0ZMQUdfTU9ERikgIT0gUkVTRVQpIHx8CisgICAgICAgKFNQSV9DSEVDS19GTEFHKGl0ZmxhZywgU1BJX0ZMQUdfT1ZSKSAhPSBSRVNFVCkgfHwKKyAgICAgICAoU1BJX0NIRUNLX0ZMQUcoaXRmbGFnLCBTUElfRkxBR19GUkUpICE9IFJFU0VUKSkgJiYKKyAgICAgIChTUElfQ0hFQ0tfSVRfU09VUkNFKGl0c291cmNlLCBTUElfSVRfRVJSKSAhPSBSRVNFVCkpIHsKKyAgICAvKiBTUEkgT3ZlcnJ1biBlcnJvciBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKFNQSV9DSEVDS19GTEFHKGl0ZmxhZywgU1BJX0ZMQUdfT1ZSKSAhPSBSRVNFVCkgeworICAgICAgaWYgKGhzcGktPlN0YXRlICE9IEhBTF9TUElfU1RBVEVfQlVTWV9UWCkgeworICAgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9PVlIpOworICAgICAgICBfX0hBTF9TUElfQ0xFQVJfT1ZSRkxBRyhoc3BpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIF9fSEFMX1NQSV9DTEVBUl9PVlJGTEFHKGhzcGkpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorCisgICAgLyogU1BJIE1vZGUgRmF1bHQgZXJyb3IgaW50ZXJydXB0IG9jY3VycmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmIChTUElfQ0hFQ0tfRkxBRyhpdGZsYWcsIFNQSV9GTEFHX01PREYpICE9IFJFU0VUKSB7CisgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9NT0RGKTsKKyAgICAgIF9fSEFMX1NQSV9DTEVBUl9NT0RGRkxBRyhoc3BpKTsKKyAgICB9CisKKyAgICAvKiBTUEkgRnJhbWUgZXJyb3IgaW50ZXJydXB0IG9jY3VycmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKFNQSV9DSEVDS19GTEFHKGl0ZmxhZywgU1BJX0ZMQUdfRlJFKSAhPSBSRVNFVCkgeworICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfRlJFKTsKKyAgICAgIF9fSEFMX1NQSV9DTEVBUl9GUkVGTEFHKGhzcGkpOworICAgIH0KKworICAgIGlmIChoc3BpLT5FcnJvckNvZGUgIT0gSEFMX1NQSV9FUlJPUl9OT05FKSB7CisgICAgICAvKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovCisgICAgICBfX0hBTF9TUElfRElTQUJMRV9JVChoc3BpLCBTUElfSVRfUlhORSB8IFNQSV9JVF9UWEUgfCBTUElfSVRfRVJSKTsKKworICAgICAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX1JFQURZOworICAgICAgLyogRGlzYWJsZSB0aGUgU1BJIERNQSByZXF1ZXN0cyBpZiBlbmFibGVkICovCisgICAgICBpZiAoKEhBTF9JU19CSVRfU0VUKGl0c291cmNlLCBTUElfQ1IyX1RYRE1BRU4pKSB8fAorICAgICAgICAgIChIQUxfSVNfQklUX1NFVChpdHNvdXJjZSwgU1BJX0NSMl9SWERNQUVOKSkpIHsKKyAgICAgICAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIChTUElfQ1IyX1RYRE1BRU4gfCBTUElfQ1IyX1JYRE1BRU4pKTsKKworICAgICAgICAvKiBBYm9ydCB0aGUgU1BJIERNQSBSeCBjaGFubmVsICovCisgICAgICAgIGlmIChoc3BpLT5oZG1hcnggIT0gTlVMTCkgeworICAgICAgICAgIC8qIFNldCB0aGUgU1BJIERNQSBBYm9ydCBjYWxsYmFjayA6CisgICAgICAgICAgd2lsbCBsZWFkIHRvIGNhbGwgSEFMX1NQSV9FcnJvckNhbGxiYWNrKCkgYXQgZW5kIG9mIERNQSBhYm9ydAorICAgICAgICAgIHByb2NlZHVyZSAqLworICAgICAgICAgIGhzcGktPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBTUElfRE1BQWJvcnRPbkVycm9yOworICAgICAgICAgIGlmIChIQUxfT0sgIT0gSEFMX0RNQV9BYm9ydF9JVChoc3BpLT5oZG1hcngpKSB7CisgICAgICAgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9BQk9SVCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIEFib3J0IHRoZSBTUEkgRE1BIFR4IGNoYW5uZWwgKi8KKyAgICAgICAgaWYgKGhzcGktPmhkbWF0eCAhPSBOVUxMKSB7CisgICAgICAgICAgLyogU2V0IHRoZSBTUEkgRE1BIEFib3J0IGNhbGxiYWNrIDoKKyAgICAgICAgICB3aWxsIGxlYWQgdG8gY2FsbCBIQUxfU1BJX0Vycm9yQ2FsbGJhY2soKSBhdCBlbmQgb2YgRE1BIGFib3J0CisgICAgICAgICAgcHJvY2VkdXJlICovCisgICAgICAgICAgaHNwaS0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IFNQSV9ETUFBYm9ydE9uRXJyb3I7CisgICAgICAgICAgaWYgKEhBTF9PSyAhPSBIQUxfRE1BX0Fib3J0X0lUKGhzcGktPmhkbWF0eCkpIHsKKyAgICAgICAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0FCT1JUKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIENhbGwgdXNlciBlcnJvciBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgICAgIGhzcGktPkVycm9yQ2FsbGJhY2soaHNwaSk7CisjZWxzZQorICAgICAgICBIQUxfU1BJX0Vycm9yQ2FsbGJhY2soaHNwaSk7CisjZW5kaWYgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgICB9CisgICAgfQorICAgIHJldHVybjsKKyAgfQorfQorCisvKioKKyAqIEBicmllZiAgVHggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLgorICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAqIEByZXR2YWwgTm9uZQorICovCitfX3dlYWsgdm9pZCBIQUxfU1BJX1R4Q3BsdENhbGxiYWNrKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKSB7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhzcGkpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfU1BJX1R4Q3BsdENhbGxiYWNrIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAqIEBicmllZiAgUnggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLgorICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAqIEByZXR2YWwgTm9uZQorICovCitfX3dlYWsgdm9pZCBIQUxfU1BJX1J4Q3BsdENhbGxiYWNrKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKSB7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhzcGkpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfU1BJX1J4Q3BsdENhbGxiYWNrIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAqIEBicmllZiAgVHggYW5kIFJ4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4KKyAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX193ZWFrIHZvaWQgSEFMX1NQSV9UeFJ4Q3BsdENhbGxiYWNrKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKSB7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhzcGkpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfU1BJX1R4UnhDcGx0Q2FsbGJhY2sgc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICogQGJyaWVmICBUeCBIYWxmIFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4KKyAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX193ZWFrIHZvaWQgSEFMX1NQSV9UeEhhbGZDcGx0Q2FsbGJhY2soU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpIHsKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHNwaSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9TUElfVHhIYWxmQ3BsdENhbGxiYWNrIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlcgorICAgICBmaWxlCisgICAqLworfQorCisvKioKKyAqIEBicmllZiAgUnggSGFsZiBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICogQHJldHZhbCBOb25lCisgKi8KK19fd2VhayB2b2lkIEhBTF9TUElfUnhIYWxmQ3BsdENhbGxiYWNrKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKSB7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhzcGkpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfU1BJX1J4SGFsZkNwbHRDYWxsYmFjaygpIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlcgorICAgICBmaWxlCisgICAqLworfQorCisvKioKKyAqIEBicmllZiAgVHggYW5kIFJ4IEhhbGYgVHJhbnNmZXIgY2FsbGJhY2suCisgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICogQHJldHZhbCBOb25lCisgKi8KK19fd2VhayB2b2lkIEhBTF9TUElfVHhSeEhhbGZDcGx0Q2FsbGJhY2soU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpIHsKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHNwaSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9TUElfVHhSeEhhbGZDcGx0Q2FsbGJhY2soKSBzaG91bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIKKyAgICAgZmlsZQorICAgKi8KK30KKworLyoqCisgKiBAYnJpZWYgIFNQSSBlcnJvciBjYWxsYmFjay4KKyAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX193ZWFrIHZvaWQgSEFMX1NQSV9FcnJvckNhbGxiYWNrKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKSB7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhzcGkpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfU1BJX0Vycm9yQ2FsbGJhY2sgc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCisgIC8qIE5PVEUgOiBUaGUgRXJyb3JDb2RlIHBhcmFtZXRlciBpbiB0aGUgaHNwaSBoYW5kbGUgaXMgdXBkYXRlZCBieSB0aGUgU1BJCisgICAgIHByb2Nlc3NlcyBhbmQgdXNlciBjYW4gdXNlIEhBTF9TUElfR2V0RXJyb3IoKSBBUEkgdG8gY2hlY2sgdGhlIGxhdGVzdCBlcnJvcgorICAgICBvY2N1cnJlZAorICAgKi8KK30KKworLyoqCisgKiBAYnJpZWYgIFNQSSBBYm9ydCBDb21wbGV0ZSBjYWxsYmFjay4KKyAqIEBwYXJhbSAgaHNwaSBTUEkgaGFuZGxlLgorICogQHJldHZhbCBOb25lCisgKi8KK19fd2VhayB2b2lkIEhBTF9TUElfQWJvcnRDcGx0Q2FsbGJhY2soU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpIHsKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHNwaSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9TUElfQWJvcnRDcGx0Q2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLworfQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBTUElfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvcnMKK2Z1bmN0aW9ucworICAqIEBicmllZiAgIFNQSSBjb250cm9sIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3JzIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBjb250cm9sIHRoZSBTUEkuCisgICAgICgrKSBIQUxfU1BJX0dldFN0YXRlKCkgQVBJIGNhbiBiZSBoZWxwZnVsIHRvIGNoZWNrIGluIHJ1bi10aW1lIHRoZSBzdGF0ZSBvZgordGhlIFNQSSBwZXJpcGhlcmFsCisgICAgICgrKSBIQUxfU1BJX0dldEVycm9yKCkgY2hlY2sgaW4gcnVuLXRpbWUgRXJyb3JzIG9jY3VycmluZyBkdXJpbmcKK2NvbW11bmljYXRpb24KK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICogQGJyaWVmICBSZXR1cm4gdGhlIFNQSSBoYW5kbGUgc3RhdGUuCisgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICogQHJldHZhbCBTUEkgc3RhdGUKKyAqLworSEFMX1NQSV9TdGF0ZVR5cGVEZWYgSEFMX1NQSV9HZXRTdGF0ZShjb25zdCBTUElfSGFuZGxlVHlwZURlZiAqaHNwaSkgeworICAvKiBSZXR1cm4gU1BJIGhhbmRsZSBzdGF0ZSAqLworICByZXR1cm4gaHNwaS0+U3RhdGU7Cit9CisKKy8qKgorICogQGJyaWVmICBSZXR1cm4gdGhlIFNQSSBlcnJvciBjb2RlLgorICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAqIEByZXR2YWwgU1BJIGVycm9yIGNvZGUgaW4gYml0bWFwIGZvcm1hdAorICovCit1aW50MzJfdCBIQUxfU1BJX0dldEVycm9yKGNvbnN0IFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKSB7CisgIC8qIFJldHVybiBTUEkgRXJyb3JDb2RlICovCisgIHJldHVybiBoc3BpLT5FcnJvckNvZGU7Cit9CisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBhZGR0b2dyb3VwIFNQSV9Qcml2YXRlX0Z1bmN0aW9ucworICogQGJyaWVmICAgUHJpdmF0ZSBmdW5jdGlvbnMKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgIERNQSBTUEkgdHJhbnNtaXQgcHJvY2VzcyBjb21wbGV0ZSBjYWxsYmFjay4KKyAqIEBwYXJhbSAgaGRtYSBwb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIG1vZHVsZS4KKyAqIEByZXR2YWwgTm9uZQorICovCitzdGF0aWMgdm9pZCBTUElfRE1BVHJhbnNtaXRDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKSB7CisgIFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpID0KKyAgICAgIChTUElfSGFuZGxlVHlwZURlZiAqKSgoKERNQV9IYW5kbGVUeXBlRGVmICopaGRtYSktPlBhcmVudCk7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKworICAvKiBJbml0IHRpY2tzdGFydCBmb3IgdGltZW91dCBtYW5hZ2VtZW50Ki8KKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAvKiBETUEgTm9ybWFsIE1vZGUgKi8KKyAgaWYgKChoZG1hLT5JbnN0YW5jZS0+Q0NSICYgRE1BX0NDUl9DSVJDKSAhPSBETUFfQ0NSX0NJUkMpIHsKKyAgICAvKiBEaXNhYmxlIEVSUiBpbnRlcnJ1cHQgKi8KKyAgICBfX0hBTF9TUElfRElTQUJMRV9JVChoc3BpLCBTUElfSVRfRVJSKTsKKworICAgIC8qIERpc2FibGUgVHggRE1BIFJlcXVlc3QgKi8KKyAgICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9UWERNQUVOKTsKKworICAgIC8qIENoZWNrIHRoZSBlbmQgb2YgdGhlIHRyYW5zYWN0aW9uICovCisgICAgaWYgKFNQSV9FbmRSeFR4VHJhbnNhY3Rpb24oaHNwaSwgU1BJX0RFRkFVTFRfVElNRU9VVCwgdGlja3N0YXJ0KSAhPQorICAgICAgICBIQUxfT0spIHsKKyAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0ZMQUcpOworICAgIH0KKworICAgIC8qIENsZWFyIG92ZXJydW4gZmxhZyBpbiAyIExpbmVzIGNvbW11bmljYXRpb24gbW9kZSBiZWNhdXNlIHJlY2VpdmVkIGRhdGEgaXMKKyAgICAgKiBub3QgcmVhZCAqLworICAgIGlmIChoc3BpLT5Jbml0LkRpcmVjdGlvbiA9PSBTUElfRElSRUNUSU9OXzJMSU5FUykgeworICAgICAgX19IQUxfU1BJX0NMRUFSX09WUkZMQUcoaHNwaSk7CisgICAgfQorCisgICAgaHNwaS0+VHhYZmVyQ291bnQgPSAwVTsKKyAgICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfUkVBRFk7CisKKyAgICBpZiAoaHNwaS0+RXJyb3JDb2RlICE9IEhBTF9TUElfRVJST1JfTk9ORSkgeworICAgICAgLyogQ2FsbCB1c2VyIGVycm9yIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICAgIGhzcGktPkVycm9yQ2FsbGJhY2soaHNwaSk7CisjZWxzZQorICAgICAgSEFMX1NQSV9FcnJvckNhbGxiYWNrKGhzcGkpOworI2VuZGlmIC8qIFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICAvKiBDYWxsIHVzZXIgVHggY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICBoc3BpLT5UeENwbHRDYWxsYmFjayhoc3BpKTsKKyNlbHNlCisgIEhBTF9TUElfVHhDcGx0Q2FsbGJhY2soaHNwaSk7CisjZW5kaWYgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9CisKKy8qKgorICogQGJyaWVmICBETUEgU1BJIHJlY2VpdmUgcHJvY2VzcyBjb21wbGV0ZSBjYWxsYmFjay4KKyAqIEBwYXJhbSAgaGRtYSBwb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIG1vZHVsZS4KKyAqIEByZXR2YWwgTm9uZQorICovCitzdGF0aWMgdm9pZCBTUElfRE1BUmVjZWl2ZUNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpIHsKKyAgU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkgPQorICAgICAgKFNQSV9IYW5kbGVUeXBlRGVmICopKCgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50KTsKKyAgdWludDMyX3QgdGlja3N0YXJ0OworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgX19JTyB1aW50MzJfdCB0bXByZWcgPSAwVTsKKyAgX19JTyB1aW50OF90ICpwdG1wcmVnODsKKyAgX19JTyB1aW50OF90IHRtcHJlZzggPSAwOworI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisKKyAgLyogSW5pdCB0aWNrc3RhcnQgZm9yIHRpbWVvdXQgbWFuYWdlbWVudCovCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgLyogRE1BIE5vcm1hbCBNb2RlICovCisgIGlmICgoaGRtYS0+SW5zdGFuY2UtPkNDUiAmIERNQV9DQ1JfQ0lSQykgIT0gRE1BX0NDUl9DSVJDKSB7CisgICAgLyogRGlzYWJsZSBFUlIgaW50ZXJydXB0ICovCisgICAgX19IQUxfU1BJX0RJU0FCTEVfSVQoaHNwaSwgU1BJX0lUX0VSUik7CisKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgICAgLyogQ1JDIGhhbmRsaW5nICovCisgICAgaWYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkgeworICAgICAgLyogV2FpdCB1bnRpbCBSWE5FIGZsYWcgKi8KKyAgICAgIGlmIChTUElfV2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChoc3BpLCBTUElfRkxBR19SWE5FLCBTRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BJX0RFRkFVTFRfVElNRU9VVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWNrc3RhcnQpICE9IEhBTF9PSykgeworICAgICAgICAvKiBFcnJvciBvbiB0aGUgQ1JDIHJlY2VwdGlvbiAqLworICAgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9DUkMpOworICAgICAgfQorICAgICAgLyogUmVhZCBDUkMgKi8KKyAgICAgIGlmIChoc3BpLT5Jbml0LkRhdGFTaXplID4gU1BJX0RBVEFTSVpFXzhCSVQpIHsKKyAgICAgICAgLyogUmVhZCAxNmJpdCBDUkMgKi8KKyAgICAgICAgdG1wcmVnID0gUkVBRF9SRUcoaHNwaS0+SW5zdGFuY2UtPkRSKTsKKyAgICAgICAgLyogVG8gYXZvaWQgR0NDIHdhcm5pbmcgKi8KKyAgICAgICAgVU5VU0VEKHRtcHJlZyk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBJbml0aWFsaXplIHRoZSA4Yml0IHRlbXBvcmFyeSBwb2ludGVyICovCisgICAgICAgIHB0bXByZWc4ID0gKF9fSU8gdWludDhfdCAqKSZoc3BpLT5JbnN0YW5jZS0+RFI7CisgICAgICAgIC8qIFJlYWQgOGJpdCBDUkMgKi8KKyAgICAgICAgdG1wcmVnOCA9ICpwdG1wcmVnODsKKyAgICAgICAgLyogVG8gYXZvaWQgR0NDIHdhcm5pbmcgKi8KKyAgICAgICAgVU5VU0VEKHRtcHJlZzgpOworCisgICAgICAgIGlmIChoc3BpLT5Jbml0LkNSQ0xlbmd0aCA9PSBTUElfQ1JDX0xFTkdUSF8xNkJJVCkgeworICAgICAgICAgIGlmIChTUElfV2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChoc3BpLCBTUElfRkxBR19SWE5FLCBTRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQSV9ERUZBVUxUX1RJTUVPVVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpY2tzdGFydCkgIT0gSEFMX09LKSB7CisgICAgICAgICAgICAvKiBFcnJvciBvbiB0aGUgQ1JDIHJlY2VwdGlvbiAqLworICAgICAgICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfQ1JDKTsKKyAgICAgICAgICB9CisgICAgICAgICAgLyogUmVhZCA4Yml0IENSQyBhZ2FpbiBpbiBjYXNlIG9mIDE2Yml0IENSQyBpbiA4Yml0IERhdGEgbW9kZSAqLworICAgICAgICAgIHRtcHJlZzggPSAqcHRtcHJlZzg7CisgICAgICAgICAgLyogVG8gYXZvaWQgR0NDIHdhcm5pbmcgKi8KKyAgICAgICAgICBVTlVTRUQodG1wcmVnOCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKworICAgIC8qIENoZWNrIGlmIHdlIGFyZSBpbiBNYXN0ZXIgUlggMiBsaW5lIG1vZGUgKi8KKyAgICBpZiAoKGhzcGktPkluaXQuRGlyZWN0aW9uID09IFNQSV9ESVJFQ1RJT05fMkxJTkVTKSAmJgorICAgICAgICAoaHNwaS0+SW5pdC5Nb2RlID09IFNQSV9NT0RFX01BU1RFUikpIHsKKyAgICAgIC8qIERpc2FibGUgUngvVHggRE1BIFJlcXVlc3QgKGRvbmUgYnkgZGVmYXVsdCB0byBoYW5kbGUgdGhlIGNhc2UgbWFzdGVyIHJ4CisgICAgICAgKiBkaXJlY3Rpb24gMiBsaW5lcykgKi8KKyAgICAgIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1RYRE1BRU4gfCBTUElfQ1IyX1JYRE1BRU4pOworICAgIH0gZWxzZSB7CisgICAgICAvKiBOb3JtYWwgY2FzZSAqLworICAgICAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfUlhETUFFTik7CisgICAgfQorCisgICAgLyogQ2hlY2sgdGhlIGVuZCBvZiB0aGUgdHJhbnNhY3Rpb24gKi8KKyAgICBpZiAoU1BJX0VuZFJ4VHJhbnNhY3Rpb24oaHNwaSwgU1BJX0RFRkFVTFRfVElNRU9VVCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spIHsKKyAgICAgIGhzcGktPkVycm9yQ29kZSA9IEhBTF9TUElfRVJST1JfRkxBRzsKKyAgICB9CisKKyAgICBoc3BpLT5SeFhmZXJDb3VudCA9IDBVOworICAgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9SRUFEWTsKKworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgICAvKiBDaGVjayBpZiBDUkMgZXJyb3Igb2NjdXJyZWQgKi8KKyAgICBpZiAoX19IQUxfU1BJX0dFVF9GTEFHKGhzcGksIFNQSV9GTEFHX0NSQ0VSUikpIHsKKyAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0NSQyk7CisgICAgICBfX0hBTF9TUElfQ0xFQVJfQ1JDRVJSRkxBRyhoc3BpKTsKKyAgICB9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKworICAgIGlmIChoc3BpLT5FcnJvckNvZGUgIT0gSEFMX1NQSV9FUlJPUl9OT05FKSB7CisgICAgICAvKiBDYWxsIHVzZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgICAgaHNwaS0+RXJyb3JDYWxsYmFjayhoc3BpKTsKKyNlbHNlCisgICAgICBIQUxfU1BJX0Vycm9yQ2FsbGJhY2soaHNwaSk7CisjZW5kaWYgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgICByZXR1cm47CisgICAgfQorICB9CisgIC8qIENhbGwgdXNlciBSeCBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgIGhzcGktPlJ4Q3BsdENhbGxiYWNrKGhzcGkpOworI2Vsc2UKKyAgSEFMX1NQSV9SeENwbHRDYWxsYmFjayhoc3BpKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30KKworLyoqCisgKiBAYnJpZWYgIERNQSBTUEkgdHJhbnNtaXQgcmVjZWl2ZSBwcm9jZXNzIGNvbXBsZXRlIGNhbGxiYWNrLgorICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgbW9kdWxlLgorICogQHJldHZhbCBOb25lCisgKi8KK3N0YXRpYyB2b2lkIFNQSV9ETUFUcmFuc21pdFJlY2VpdmVDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKSB7CisgIFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpID0KKyAgICAgIChTUElfSGFuZGxlVHlwZURlZiAqKSgoKERNQV9IYW5kbGVUeXBlRGVmICopaGRtYSktPlBhcmVudCk7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgIF9fSU8gdWludDMyX3QgdG1wcmVnID0gMFU7CisgIF9fSU8gdWludDhfdCAqcHRtcHJlZzg7CisgIF9fSU8gdWludDhfdCB0bXByZWc4ID0gMDsKKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisgIC8qIEluaXQgdGlja3N0YXJ0IGZvciB0aW1lb3V0IG1hbmFnZW1lbnQqLworICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgIC8qIERNQSBOb3JtYWwgTW9kZSAqLworICBpZiAoKGhkbWEtPkluc3RhbmNlLT5DQ1IgJiBETUFfQ0NSX0NJUkMpICE9IERNQV9DQ1JfQ0lSQykgeworICAgIC8qIERpc2FibGUgRVJSIGludGVycnVwdCAqLworICAgIF9fSEFMX1NQSV9ESVNBQkxFX0lUKGhzcGksIFNQSV9JVF9FUlIpOworCisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAgIC8qIENSQyBoYW5kbGluZyAqLworICAgIGlmIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpIHsKKyAgICAgIGlmICgoaHNwaS0+SW5pdC5EYXRhU2l6ZSA9PSBTUElfREFUQVNJWkVfOEJJVCkgJiYKKyAgICAgICAgICAoaHNwaS0+SW5pdC5DUkNMZW5ndGggPT0gU1BJX0NSQ19MRU5HVEhfOEJJVCkpIHsKKyAgICAgICAgaWYgKFNQSV9XYWl0Rmlmb1N0YXRlVW50aWxUaW1lb3V0KAorICAgICAgICAgICAgICAgIGhzcGksIFNQSV9GTEFHX0ZSTFZMLCBTUElfRlJMVkxfUVVBUlRFUl9GVUxMLAorICAgICAgICAgICAgICAgIFNQSV9ERUZBVUxUX1RJTUVPVVQsIHRpY2tzdGFydCkgIT0gSEFMX09LKSB7CisgICAgICAgICAgLyogRXJyb3Igb24gdGhlIENSQyByZWNlcHRpb24gKi8KKyAgICAgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9DUkMpOworICAgICAgICB9CisgICAgICAgIC8qIEluaXRpYWxpemUgdGhlIDhiaXQgdGVtcG9yYXJ5IHBvaW50ZXIgKi8KKyAgICAgICAgcHRtcHJlZzggPSAoX19JTyB1aW50OF90ICopJmhzcGktPkluc3RhbmNlLT5EUjsKKyAgICAgICAgLyogUmVhZCA4Yml0IENSQyAqLworICAgICAgICB0bXByZWc4ID0gKnB0bXByZWc4OworICAgICAgICAvKiBUbyBhdm9pZCBHQ0Mgd2FybmluZyAqLworICAgICAgICBVTlVTRUQodG1wcmVnOCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoU1BJX1dhaXRGaWZvU3RhdGVVbnRpbFRpbWVvdXQoCisgICAgICAgICAgICAgICAgaHNwaSwgU1BJX0ZMQUdfRlJMVkwsIFNQSV9GUkxWTF9IQUxGX0ZVTEwsIFNQSV9ERUZBVUxUX1RJTUVPVVQsCisgICAgICAgICAgICAgICAgdGlja3N0YXJ0KSAhPSBIQUxfT0spIHsKKyAgICAgICAgICAvKiBFcnJvciBvbiB0aGUgQ1JDIHJlY2VwdGlvbiAqLworICAgICAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0NSQyk7CisgICAgICAgIH0KKyAgICAgICAgLyogUmVhZCBDUkMgdG8gRmx1c2ggRFIgYW5kIFJYTkUgZmxhZyAqLworICAgICAgICB0bXByZWcgPSBSRUFEX1JFRyhoc3BpLT5JbnN0YW5jZS0+RFIpOworICAgICAgICAvKiBUbyBhdm9pZCBHQ0Mgd2FybmluZyAqLworICAgICAgICBVTlVTRUQodG1wcmVnKTsKKyAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKworICAgIC8qIENoZWNrIHRoZSBlbmQgb2YgdGhlIHRyYW5zYWN0aW9uICovCisgICAgaWYgKFNQSV9FbmRSeFR4VHJhbnNhY3Rpb24oaHNwaSwgU1BJX0RFRkFVTFRfVElNRU9VVCwgdGlja3N0YXJ0KSAhPQorICAgICAgICBIQUxfT0spIHsKKyAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0ZMQUcpOworICAgIH0KKworICAgIC8qIERpc2FibGUgUngvVHggRE1BIFJlcXVlc3QgKi8KKyAgICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9UWERNQUVOIHwgU1BJX0NSMl9SWERNQUVOKTsKKworICAgIGhzcGktPlR4WGZlckNvdW50ID0gMFU7CisgICAgaHNwaS0+UnhYZmVyQ291bnQgPSAwVTsKKyAgICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfUkVBRFk7CisKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgICAgLyogQ2hlY2sgaWYgQ1JDIGVycm9yIG9jY3VycmVkICovCisgICAgaWYgKF9fSEFMX1NQSV9HRVRfRkxBRyhoc3BpLCBTUElfRkxBR19DUkNFUlIpKSB7CisgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9DUkMpOworICAgICAgX19IQUxfU1BJX0NMRUFSX0NSQ0VSUkZMQUcoaHNwaSk7CisgICAgfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisKKyAgICBpZiAoaHNwaS0+RXJyb3JDb2RlICE9IEhBTF9TUElfRVJST1JfTk9ORSkgeworICAgICAgLyogQ2FsbCB1c2VyIGVycm9yIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICAgIGhzcGktPkVycm9yQ2FsbGJhY2soaHNwaSk7CisjZWxzZQorICAgICAgSEFMX1NQSV9FcnJvckNhbGxiYWNrKGhzcGkpOworI2VuZGlmIC8qIFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICAvKiBDYWxsIHVzZXIgVHhSeCBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgIGhzcGktPlR4UnhDcGx0Q2FsbGJhY2soaHNwaSk7CisjZWxzZQorICBIQUxfU1BJX1R4UnhDcGx0Q2FsbGJhY2soaHNwaSk7CisjZW5kaWYgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9CisKKy8qKgorICogQGJyaWVmICBETUEgU1BJIGhhbGYgdHJhbnNtaXQgcHJvY2VzcyBjb21wbGV0ZSBjYWxsYmFjay4KKyAqIEBwYXJhbSAgaGRtYSBwb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIG1vZHVsZS4KKyAqIEByZXR2YWwgTm9uZQorICovCitzdGF0aWMgdm9pZCBTUElfRE1BSGFsZlRyYW5zbWl0Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkgeworICBTUElfSGFuZGxlVHlwZURlZiAqaHNwaSA9CisgICAgICAoU1BJX0hhbmRsZVR5cGVEZWYgKikoKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQpOworCisgIC8qIENhbGwgdXNlciBUeCBoYWxmIGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgaHNwaS0+VHhIYWxmQ3BsdENhbGxiYWNrKGhzcGkpOworI2Vsc2UKKyAgSEFMX1NQSV9UeEhhbGZDcGx0Q2FsbGJhY2soaHNwaSk7CisjZW5kaWYgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9CisKKy8qKgorICogQGJyaWVmICBETUEgU1BJIGhhbGYgcmVjZWl2ZSBwcm9jZXNzIGNvbXBsZXRlIGNhbGxiYWNrCisgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBtb2R1bGUuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworc3RhdGljIHZvaWQgU1BJX0RNQUhhbGZSZWNlaXZlQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkgeworICBTUElfSGFuZGxlVHlwZURlZiAqaHNwaSA9CisgICAgICAoU1BJX0hhbmRsZVR5cGVEZWYgKikoKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQpOworCisgIC8qIENhbGwgdXNlciBSeCBoYWxmIGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgaHNwaS0+UnhIYWxmQ3BsdENhbGxiYWNrKGhzcGkpOworI2Vsc2UKKyAgSEFMX1NQSV9SeEhhbGZDcGx0Q2FsbGJhY2soaHNwaSk7CisjZW5kaWYgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9CisKKy8qKgorICogQGJyaWVmICBETUEgU1BJIGhhbGYgdHJhbnNtaXQgcmVjZWl2ZSBwcm9jZXNzIGNvbXBsZXRlIGNhbGxiYWNrLgorICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgbW9kdWxlLgorICogQHJldHZhbCBOb25lCisgKi8KK3N0YXRpYyB2b2lkIFNQSV9ETUFIYWxmVHJhbnNtaXRSZWNlaXZlQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkgeworICBTUElfSGFuZGxlVHlwZURlZiAqaHNwaSA9CisgICAgICAoU1BJX0hhbmRsZVR5cGVEZWYgKikoKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQpOworCisgIC8qIENhbGwgdXNlciBUeFJ4IGhhbGYgY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICBoc3BpLT5UeFJ4SGFsZkNwbHRDYWxsYmFjayhoc3BpKTsKKyNlbHNlCisgIEhBTF9TUElfVHhSeEhhbGZDcGx0Q2FsbGJhY2soaHNwaSk7CisjZW5kaWYgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9CisKKy8qKgorICogQGJyaWVmICBETUEgU1BJIGNvbW11bmljYXRpb24gZXJyb3IgY2FsbGJhY2suCisgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBtb2R1bGUuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworc3RhdGljIHZvaWQgU1BJX0RNQUVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKSB7CisgIFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpID0KKyAgICAgIChTUElfSGFuZGxlVHlwZURlZiAqKSgoKERNQV9IYW5kbGVUeXBlRGVmICopaGRtYSktPlBhcmVudCk7CisKKyAgLyogU3RvcCB0aGUgZGlzYWJsZSBETUEgdHJhbnNmZXIgb24gU1BJIHNpZGUgKi8KKyAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfVFhETUFFTiB8IFNQSV9DUjJfUlhETUFFTik7CisKKyAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfRE1BKTsKKyAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX1JFQURZOworICAvKiBDYWxsIHVzZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICBoc3BpLT5FcnJvckNhbGxiYWNrKGhzcGkpOworI2Vsc2UKKyAgSEFMX1NQSV9FcnJvckNhbGxiYWNrKGhzcGkpOworI2VuZGlmIC8qIFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfQorCisvKioKKyAqIEBicmllZiAgRE1BIFNQSSBjb21tdW5pY2F0aW9uIGFib3J0IGNhbGxiYWNrLCB3aGVuIGluaXRpYXRlZCBieSBIQUwgc2VydmljZXMKKyAqIG9uIEVycm9yIChUbyBiZSBjYWxsZWQgYXQgZW5kIG9mIERNQSBBYm9ydCBwcm9jZWR1cmUgZm9sbG93aW5nIGVycm9yCisgKiBvY2N1cnJlbmNlKS4KKyAqIEBwYXJhbSAgaGRtYSBETUEgaGFuZGxlLgorICogQHJldHZhbCBOb25lCisgKi8KK3N0YXRpYyB2b2lkIFNQSV9ETUFBYm9ydE9uRXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpIHsKKyAgU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkgPQorICAgICAgKFNQSV9IYW5kbGVUeXBlRGVmICopKCgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50KTsKKyAgaHNwaS0+UnhYZmVyQ291bnQgPSAwVTsKKyAgaHNwaS0+VHhYZmVyQ291bnQgPSAwVTsKKworICAvKiBDYWxsIHVzZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICBoc3BpLT5FcnJvckNhbGxiYWNrKGhzcGkpOworI2Vsc2UKKyAgSEFMX1NQSV9FcnJvckNhbGxiYWNrKGhzcGkpOworI2VuZGlmIC8qIFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfQorCisvKioKKyAqIEBicmllZiAgRE1BIFNQSSBUeCBjb21tdW5pY2F0aW9uIGFib3J0IGNhbGxiYWNrLCB3aGVuIGluaXRpYXRlZCBieSB1c2VyCisgKiAgICAgICAgIChUbyBiZSBjYWxsZWQgYXQgZW5kIG9mIERNQSBUeCBBYm9ydCBwcm9jZWR1cmUgZm9sbG93aW5nIHVzZXIgYWJvcnQKKyAqIHJlcXVlc3QpLgorICogQG5vdGUgICBXaGVuIHRoaXMgY2FsbGJhY2sgaXMgZXhlY3V0ZWQsIFVzZXIgQWJvcnQgY29tcGxldGUgY2FsbCBiYWNrIGlzCisgKiBjYWxsZWQgb25seSBpZiBubyBBYm9ydCBzdGlsbCBvbmdvaW5nIGZvciBSeCBETUEgSGFuZGxlLgorICogQHBhcmFtICBoZG1hIERNQSBoYW5kbGUuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworc3RhdGljIHZvaWQgU1BJX0RNQVR4QWJvcnRDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkgeworICBTUElfSGFuZGxlVHlwZURlZiAqaHNwaSA9CisgICAgICAoU1BJX0hhbmRsZVR5cGVEZWYgKikoKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQpOworCisgIGhzcGktPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgIC8qIERpc2FibGUgVHggRE1BIFJlcXVlc3QgKi8KKyAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfVFhETUFFTik7CisKKyAgaWYgKFNQSV9FbmRSeFR4VHJhbnNhY3Rpb24oaHNwaSwgU1BJX0RFRkFVTFRfVElNRU9VVCwgSEFMX0dldFRpY2soKSkgIT0KKyAgICAgIEhBTF9PSykgeworICAgIGhzcGktPkVycm9yQ29kZSA9IEhBTF9TUElfRVJST1JfQUJPUlQ7CisgIH0KKworICAvKiBEaXNhYmxlIFNQSSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1NQSV9ESVNBQkxFKGhzcGkpOworCisgIC8qIEVtcHR5IHRoZSBGUkxWTCBmaWZvICovCisgIGlmIChTUElfV2FpdEZpZm9TdGF0ZVVudGlsVGltZW91dChoc3BpLCBTUElfRkxBR19GUkxWTCwgU1BJX0ZSTFZMX0VNUFRZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BJX0RFRkFVTFRfVElNRU9VVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9HZXRUaWNrKCkpICE9IEhBTF9PSykgeworICAgIGhzcGktPkVycm9yQ29kZSA9IEhBTF9TUElfRVJST1JfQUJPUlQ7CisgIH0KKworICAvKiBDaGVjayBpZiBhbiBBYm9ydCBwcm9jZXNzIGlzIHN0aWxsIG9uZ29pbmcgKi8KKyAgaWYgKGhzcGktPmhkbWFyeCAhPSBOVUxMKSB7CisgICAgaWYgKGhzcGktPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgIT0gTlVMTCkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIC8qIE5vIEFib3J0IHByb2Nlc3Mgc3RpbGwgb25nb2luZyA6IEFsbCBETUEgU3RyZWFtL0NoYW5uZWwgYXJlIGFib3J0ZWQsIGNhbGwKKyAgICogdXNlciBBYm9ydCBDb21wbGV0ZSBjYWxsYmFjayAqLworICBoc3BpLT5SeFhmZXJDb3VudCA9IDBVOworICBoc3BpLT5UeFhmZXJDb3VudCA9IDBVOworCisgIC8qIENoZWNrIG5vIGVycm9yIGR1cmluZyBBYm9ydCBwcm9jZWR1cmUgKi8KKyAgaWYgKGhzcGktPkVycm9yQ29kZSAhPSBIQUxfU1BJX0VSUk9SX0FCT1JUKSB7CisgICAgLyogUmVzZXQgZXJyb3JDb2RlICovCisgICAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9OT05FOworICB9CisKKyAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBTUiByZWdpc3RlciAqLworICBfX0hBTF9TUElfQ0xFQVJfT1ZSRkxBRyhoc3BpKTsKKyAgX19IQUxfU1BJX0NMRUFSX0ZSRUZMQUcoaHNwaSk7CisKKyAgLyogUmVzdG9yZSBoc3BpLT5TdGF0ZSB0byBSZWFkeSAqLworICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfUkVBRFk7CisKKyAgLyogQ2FsbCB1c2VyIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgaHNwaS0+QWJvcnRDcGx0Q2FsbGJhY2soaHNwaSk7CisjZWxzZQorICBIQUxfU1BJX0Fib3J0Q3BsdENhbGxiYWNrKGhzcGkpOworI2VuZGlmIC8qIFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfQorCisvKioKKyAqIEBicmllZiAgRE1BIFNQSSBSeCBjb21tdW5pY2F0aW9uIGFib3J0IGNhbGxiYWNrLCB3aGVuIGluaXRpYXRlZCBieSB1c2VyCisgKiAgICAgICAgIChUbyBiZSBjYWxsZWQgYXQgZW5kIG9mIERNQSBSeCBBYm9ydCBwcm9jZWR1cmUgZm9sbG93aW5nIHVzZXIgYWJvcnQKKyAqIHJlcXVlc3QpLgorICogQG5vdGUgICBXaGVuIHRoaXMgY2FsbGJhY2sgaXMgZXhlY3V0ZWQsIFVzZXIgQWJvcnQgY29tcGxldGUgY2FsbCBiYWNrIGlzCisgKiBjYWxsZWQgb25seSBpZiBubyBBYm9ydCBzdGlsbCBvbmdvaW5nIGZvciBUeCBETUEgSGFuZGxlLgorICogQHBhcmFtICBoZG1hIERNQSBoYW5kbGUuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworc3RhdGljIHZvaWQgU1BJX0RNQVJ4QWJvcnRDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkgeworICBTUElfSGFuZGxlVHlwZURlZiAqaHNwaSA9CisgICAgICAoU1BJX0hhbmRsZVR5cGVEZWYgKikoKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQpOworCisgIC8qIERpc2FibGUgU1BJIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfU1BJX0RJU0FCTEUoaHNwaSk7CisKKyAgaHNwaS0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgLyogRGlzYWJsZSBSeCBETUEgUmVxdWVzdCAqLworICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9SWERNQUVOKTsKKworICAvKiBDb250cm9sIHRoZSBCU1kgZmxhZyAqLworICBpZiAoU1BJX1dhaXRGbGFnU3RhdGVVbnRpbFRpbWVvdXQoaHNwaSwgU1BJX0ZMQUdfQlNZLCBSRVNFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQSV9ERUZBVUxUX1RJTUVPVVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfR2V0VGljaygpKSAhPSBIQUxfT0spIHsKKyAgICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX0FCT1JUOworICB9CisKKyAgLyogRW1wdHkgdGhlIEZSTFZMIGZpZm8gKi8KKyAgaWYgKFNQSV9XYWl0Rmlmb1N0YXRlVW50aWxUaW1lb3V0KGhzcGksIFNQSV9GTEFHX0ZSTFZMLCBTUElfRlJMVkxfRU1QVFksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUElfREVGQVVMVF9USU1FT1VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0dldFRpY2soKSkgIT0gSEFMX09LKSB7CisgICAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9BQk9SVDsKKyAgfQorCisgIC8qIENoZWNrIGlmIGFuIEFib3J0IHByb2Nlc3MgaXMgc3RpbGwgb25nb2luZyAqLworICBpZiAoaHNwaS0+aGRtYXR4ICE9IE5VTEwpIHsKKyAgICBpZiAoaHNwaS0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayAhPSBOVUxMKSB7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgLyogTm8gQWJvcnQgcHJvY2VzcyBzdGlsbCBvbmdvaW5nIDogQWxsIERNQSBTdHJlYW0vQ2hhbm5lbCBhcmUgYWJvcnRlZCwgY2FsbAorICAgKiB1c2VyIEFib3J0IENvbXBsZXRlIGNhbGxiYWNrICovCisgIGhzcGktPlJ4WGZlckNvdW50ID0gMFU7CisgIGhzcGktPlR4WGZlckNvdW50ID0gMFU7CisKKyAgLyogQ2hlY2sgbm8gZXJyb3IgZHVyaW5nIEFib3J0IHByb2NlZHVyZSAqLworICBpZiAoaHNwaS0+RXJyb3JDb2RlICE9IEhBTF9TUElfRVJST1JfQUJPUlQpIHsKKyAgICAvKiBSZXNldCBlcnJvckNvZGUgKi8KKyAgICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX05PTkU7CisgIH0KKworICAvKiBDbGVhciB0aGUgRXJyb3IgZmxhZ3MgaW4gdGhlIFNSIHJlZ2lzdGVyICovCisgIF9fSEFMX1NQSV9DTEVBUl9PVlJGTEFHKGhzcGkpOworICBfX0hBTF9TUElfQ0xFQVJfRlJFRkxBRyhoc3BpKTsKKworICAvKiBSZXN0b3JlIGhzcGktPlN0YXRlIHRvIFJlYWR5ICovCisgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9SRUFEWTsKKworICAvKiBDYWxsIHVzZXIgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICBoc3BpLT5BYm9ydENwbHRDYWxsYmFjayhoc3BpKTsKKyNlbHNlCisgIEhBTF9TUElfQWJvcnRDcGx0Q2FsbGJhY2soaHNwaSk7CisjZW5kaWYgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9CisKKy8qKgorICogQGJyaWVmICBSeCA4LWJpdCBoYW5kbGVyIGZvciBUcmFuc21pdCBhbmQgUmVjZWl2ZSBpbiBJbnRlcnJ1cHQgbW9kZS4KKyAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworc3RhdGljIHZvaWQgU1BJXzJsaW5lc1J4SVNSXzhCSVQoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpIHsKKyAgLyogUmVjZWl2ZSBkYXRhIGluIHBhY2tpbmcgbW9kZSAqLworICBpZiAoaHNwaS0+UnhYZmVyQ291bnQgPiAxVSkgeworICAgICooKHVpbnQxNl90ICopaHNwaS0+cFJ4QnVmZlB0cikgPSAodWludDE2X3QpKGhzcGktPkluc3RhbmNlLT5EUik7CisgICAgaHNwaS0+cFJ4QnVmZlB0ciArPSBzaXplb2YodWludDE2X3QpOworICAgIGhzcGktPlJ4WGZlckNvdW50IC09IDJVOworICAgIGlmIChoc3BpLT5SeFhmZXJDb3VudCA9PSAxVSkgeworICAgICAgLyogU2V0IFJYIEZpZm8gdGhyZXNob2xkIGFjY29yZGluZyB0aGUgcmVjZXB0aW9uIGRhdGEgbGVuZ3RoOiA4Yml0ICovCisgICAgICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9SWEZJRk9fVEhSRVNIT0xEKTsKKyAgICB9CisgIH0KKyAgLyogUmVjZWl2ZSBkYXRhIGluIDggQml0IG1vZGUgKi8KKyAgZWxzZSB7CisgICAgKmhzcGktPnBSeEJ1ZmZQdHIgPSAqKChfX0lPIHVpbnQ4X3QgKikmaHNwaS0+SW5zdGFuY2UtPkRSKTsKKyAgICBoc3BpLT5wUnhCdWZmUHRyKys7CisgICAgaHNwaS0+UnhYZmVyQ291bnQtLTsKKyAgfQorCisgIC8qIENoZWNrIGVuZCBvZiB0aGUgcmVjZXB0aW9uICovCisgIGlmIChoc3BpLT5SeFhmZXJDb3VudCA9PSAwVSkgeworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgICBpZiAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKSB7CisgICAgICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9SWEZJRk9fVEhSRVNIT0xEKTsKKyAgICAgIGhzcGktPlJ4SVNSID0gU1BJXzJsaW5lc1J4SVNSXzhCSVRDUkM7CisgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisKKyAgICAvKiBEaXNhYmxlIFJYTkUgIGFuZCBFUlIgaW50ZXJydXB0ICovCisgICAgX19IQUxfU1BJX0RJU0FCTEVfSVQoaHNwaSwgKFNQSV9JVF9SWE5FIHwgU1BJX0lUX0VSUikpOworCisgICAgaWYgKGhzcGktPlR4WGZlckNvdW50ID09IDBVKSB7CisgICAgICBTUElfQ2xvc2VSeFR4X0lTUihoc3BpKTsKKyAgICB9CisgIH0KK30KKworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKy8qKgorICogQGJyaWVmICBSeCA4LWJpdCBoYW5kbGVyIGZvciBUcmFuc21pdCBhbmQgUmVjZWl2ZSBpbiBJbnRlcnJ1cHQgbW9kZS4KKyAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworc3RhdGljIHZvaWQgU1BJXzJsaW5lc1J4SVNSXzhCSVRDUkMoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpIHsKKyAgX19JTyB1aW50OF90ICpwdG1wcmVnODsKKyAgX19JTyB1aW50OF90IHRtcHJlZzggPSAwOworCisgIC8qIEluaXRpYWxpemUgdGhlIDhiaXQgdGVtcG9yYXJ5IHBvaW50ZXIgKi8KKyAgcHRtcHJlZzggPSAoX19JTyB1aW50OF90ICopJmhzcGktPkluc3RhbmNlLT5EUjsKKyAgLyogUmVhZCA4Yml0IENSQyB0byBmbHVzaCBEYXRhIFJlZ2lzdGVyICovCisgIHRtcHJlZzggPSAqcHRtcHJlZzg7CisgIC8qIFRvIGF2b2lkIEdDQyB3YXJuaW5nICovCisgIFVOVVNFRCh0bXByZWc4KTsKKworICBoc3BpLT5DUkNTaXplLS07CisKKyAgLyogQ2hlY2sgZW5kIG9mIHRoZSByZWNlcHRpb24gKi8KKyAgaWYgKGhzcGktPkNSQ1NpemUgPT0gMFUpIHsKKyAgICAvKiBEaXNhYmxlIFJYTkUgYW5kIEVSUiBpbnRlcnJ1cHQgKi8KKyAgICBfX0hBTF9TUElfRElTQUJMRV9JVChoc3BpLCAoU1BJX0lUX1JYTkUgfCBTUElfSVRfRVJSKSk7CisKKyAgICBpZiAoaHNwaS0+VHhYZmVyQ291bnQgPT0gMFUpIHsKKyAgICAgIFNQSV9DbG9zZVJ4VHhfSVNSKGhzcGkpOworICAgIH0KKyAgfQorfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisKKy8qKgorICogQGJyaWVmICBUeCA4LWJpdCBoYW5kbGVyIGZvciBUcmFuc21pdCBhbmQgUmVjZWl2ZSBpbiBJbnRlcnJ1cHQgbW9kZS4KKyAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworc3RhdGljIHZvaWQgU1BJXzJsaW5lc1R4SVNSXzhCSVQoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpIHsKKyAgLyogVHJhbnNtaXQgZGF0YSBpbiBwYWNraW5nIEJpdCBtb2RlICovCisgIGlmIChoc3BpLT5UeFhmZXJDb3VudCA+PSAyVSkgeworICAgIGhzcGktPkluc3RhbmNlLT5EUiA9ICooKGNvbnN0IHVpbnQxNl90ICopaHNwaS0+cFR4QnVmZlB0cik7CisgICAgaHNwaS0+cFR4QnVmZlB0ciArPSBzaXplb2YodWludDE2X3QpOworICAgIGhzcGktPlR4WGZlckNvdW50IC09IDJVOworICB9CisgIC8qIFRyYW5zbWl0IGRhdGEgaW4gOCBCaXQgbW9kZSAqLworICBlbHNlIHsKKyAgICAqKF9fSU8gdWludDhfdCAqKSZoc3BpLT5JbnN0YW5jZS0+RFIgPSAqKChjb25zdCB1aW50OF90ICopaHNwaS0+cFR4QnVmZlB0cik7CisgICAgaHNwaS0+cFR4QnVmZlB0cisrOworICAgIGhzcGktPlR4WGZlckNvdW50LS07CisgIH0KKworICAvKiBDaGVjayB0aGUgZW5kIG9mIHRoZSB0cmFuc21pc3Npb24gKi8KKyAgaWYgKGhzcGktPlR4WGZlckNvdW50ID09IDBVKSB7CisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAgIGlmIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpIHsKKyAgICAgIC8qIFNldCBDUkMgTmV4dCBCaXQgdG8gc2VuZCBDUkMgKi8KKyAgICAgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMSwgU1BJX0NSMV9DUkNORVhUKTsKKyAgICAgIC8qIERpc2FibGUgVFhFIGludGVycnVwdCAqLworICAgICAgX19IQUxfU1BJX0RJU0FCTEVfSVQoaHNwaSwgU1BJX0lUX1RYRSk7CisgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisKKyAgICAvKiBEaXNhYmxlIFRYRSBpbnRlcnJ1cHQgKi8KKyAgICBfX0hBTF9TUElfRElTQUJMRV9JVChoc3BpLCBTUElfSVRfVFhFKTsKKworICAgIGlmIChoc3BpLT5SeFhmZXJDb3VudCA9PSAwVSkgeworICAgICAgU1BJX0Nsb3NlUnhUeF9JU1IoaHNwaSk7CisgICAgfQorICB9Cit9CisKKy8qKgorICogQGJyaWVmICBSeCAxNi1iaXQgaGFuZGxlciBmb3IgVHJhbnNtaXQgYW5kIFJlY2VpdmUgaW4gSW50ZXJydXB0IG1vZGUuCisgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICogQHJldHZhbCBOb25lCisgKi8KK3N0YXRpYyB2b2lkIFNQSV8ybGluZXNSeElTUl8xNkJJVChzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSkgeworICAvKiBSZWNlaXZlIGRhdGEgaW4gMTYgQml0IG1vZGUgKi8KKyAgKigodWludDE2X3QgKiloc3BpLT5wUnhCdWZmUHRyKSA9ICh1aW50MTZfdCkoaHNwaS0+SW5zdGFuY2UtPkRSKTsKKyAgaHNwaS0+cFJ4QnVmZlB0ciArPSBzaXplb2YodWludDE2X3QpOworICBoc3BpLT5SeFhmZXJDb3VudC0tOworCisgIGlmIChoc3BpLT5SeFhmZXJDb3VudCA9PSAwVSkgeworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgICBpZiAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKSB7CisgICAgICBoc3BpLT5SeElTUiA9IFNQSV8ybGluZXNSeElTUl8xNkJJVENSQzsKKyAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKworICAgIC8qIERpc2FibGUgUlhORSBpbnRlcnJ1cHQgKi8KKyAgICBfX0hBTF9TUElfRElTQUJMRV9JVChoc3BpLCBTUElfSVRfUlhORSk7CisKKyAgICBpZiAoaHNwaS0+VHhYZmVyQ291bnQgPT0gMFUpIHsKKyAgICAgIFNQSV9DbG9zZVJ4VHhfSVNSKGhzcGkpOworICAgIH0KKyAgfQorfQorCisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorLyoqCisgKiBAYnJpZWYgIE1hbmFnZSB0aGUgQ1JDIDE2LWJpdCByZWNlaXZlIGZvciBUcmFuc21pdCBhbmQgUmVjZWl2ZSBpbiBJbnRlcnJ1cHQKKyAqIG1vZGUuCisgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICogQHJldHZhbCBOb25lCisgKi8KK3N0YXRpYyB2b2lkIFNQSV8ybGluZXNSeElTUl8xNkJJVENSQyhzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSkgeworICBfX0lPIHVpbnQzMl90IHRtcHJlZyA9IDBVOworCisgIC8qIFJlYWQgMTZiaXQgQ1JDIHRvIGZsdXNoIERhdGEgUmVnaXN0ZXIgKi8KKyAgdG1wcmVnID0gUkVBRF9SRUcoaHNwaS0+SW5zdGFuY2UtPkRSKTsKKyAgLyogVG8gYXZvaWQgR0NDIHdhcm5pbmcgKi8KKyAgVU5VU0VEKHRtcHJlZyk7CisKKyAgLyogRGlzYWJsZSBSWE5FIGludGVycnVwdCAqLworICBfX0hBTF9TUElfRElTQUJMRV9JVChoc3BpLCBTUElfSVRfUlhORSk7CisKKyAgU1BJX0Nsb3NlUnhUeF9JU1IoaHNwaSk7Cit9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKworLyoqCisgKiBAYnJpZWYgIFR4IDE2LWJpdCBoYW5kbGVyIGZvciBUcmFuc21pdCBhbmQgUmVjZWl2ZSBpbiBJbnRlcnJ1cHQgbW9kZS4KKyAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworc3RhdGljIHZvaWQgU1BJXzJsaW5lc1R4SVNSXzE2QklUKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKSB7CisgIC8qIFRyYW5zbWl0IGRhdGEgaW4gMTYgQml0IG1vZGUgKi8KKyAgaHNwaS0+SW5zdGFuY2UtPkRSID0gKigoY29uc3QgdWludDE2X3QgKiloc3BpLT5wVHhCdWZmUHRyKTsKKyAgaHNwaS0+cFR4QnVmZlB0ciArPSBzaXplb2YodWludDE2X3QpOworICBoc3BpLT5UeFhmZXJDb3VudC0tOworCisgIC8qIEVuYWJsZSBDUkMgVHJhbnNtaXNzaW9uICovCisgIGlmIChoc3BpLT5UeFhmZXJDb3VudCA9PSAwVSkgeworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgICBpZiAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKSB7CisgICAgICAvKiBTZXQgQ1JDIE5leHQgQml0IHRvIHNlbmQgQ1JDICovCisgICAgICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjEsIFNQSV9DUjFfQ1JDTkVYVCk7CisgICAgICAvKiBEaXNhYmxlIFRYRSBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1NQSV9ESVNBQkxFX0lUKGhzcGksIFNQSV9JVF9UWEUpOworICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisgICAgLyogRGlzYWJsZSBUWEUgaW50ZXJydXB0ICovCisgICAgX19IQUxfU1BJX0RJU0FCTEVfSVQoaHNwaSwgU1BJX0lUX1RYRSk7CisKKyAgICBpZiAoaHNwaS0+UnhYZmVyQ291bnQgPT0gMFUpIHsKKyAgICAgIFNQSV9DbG9zZVJ4VHhfSVNSKGhzcGkpOworICAgIH0KKyAgfQorfQorCisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorLyoqCisgKiBAYnJpZWYgIE1hbmFnZSB0aGUgQ1JDIDgtYml0IHJlY2VpdmUgaW4gSW50ZXJydXB0IGNvbnRleHQuCisgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICogQHJldHZhbCBOb25lCisgKi8KK3N0YXRpYyB2b2lkIFNQSV9SeElTUl84QklUQ1JDKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKSB7CisgIF9fSU8gdWludDhfdCAqcHRtcHJlZzg7CisgIF9fSU8gdWludDhfdCB0bXByZWc4ID0gMDsKKworICAvKiBJbml0aWFsaXplIHRoZSA4Yml0IHRlbXBvcmFyeSBwb2ludGVyICovCisgIHB0bXByZWc4ID0gKF9fSU8gdWludDhfdCAqKSZoc3BpLT5JbnN0YW5jZS0+RFI7CisgIC8qIFJlYWQgOGJpdCBDUkMgdG8gZmx1c2ggRGF0YSBSZWdpc3RlciAqLworICB0bXByZWc4ID0gKnB0bXByZWc4OworICAvKiBUbyBhdm9pZCBHQ0Mgd2FybmluZyAqLworICBVTlVTRUQodG1wcmVnOCk7CisKKyAgaHNwaS0+Q1JDU2l6ZS0tOworCisgIGlmIChoc3BpLT5DUkNTaXplID09IDBVKSB7CisgICAgU1BJX0Nsb3NlUnhfSVNSKGhzcGkpOworICB9Cit9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKworLyoqCisgKiBAYnJpZWYgIE1hbmFnZSB0aGUgcmVjZWl2ZSA4LWJpdCBpbiBJbnRlcnJ1cHQgY29udGV4dC4KKyAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworc3RhdGljIHZvaWQgU1BJX1J4SVNSXzhCSVQoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpIHsKKyAgKmhzcGktPnBSeEJ1ZmZQdHIgPSAoKihfX0lPIHVpbnQ4X3QgKikmaHNwaS0+SW5zdGFuY2UtPkRSKTsKKyAgaHNwaS0+cFJ4QnVmZlB0cisrOworICBoc3BpLT5SeFhmZXJDb3VudC0tOworCisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAvKiBFbmFibGUgQ1JDIFRyYW5zbWlzc2lvbiAqLworICBpZiAoKGhzcGktPlJ4WGZlckNvdW50ID09IDFVKSAmJgorICAgICAgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkpIHsKKyAgICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjEsIFNQSV9DUjFfQ1JDTkVYVCk7CisgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisgIGlmIChoc3BpLT5SeFhmZXJDb3VudCA9PSAwVSkgeworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgICBpZiAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKSB7CisgICAgICBoc3BpLT5SeElTUiA9IFNQSV9SeElTUl84QklUQ1JDOworICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworICAgIFNQSV9DbG9zZVJ4X0lTUihoc3BpKTsKKyAgfQorfQorCisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorLyoqCisgKiBAYnJpZWYgIE1hbmFnZSB0aGUgQ1JDIDE2LWJpdCByZWNlaXZlIGluIEludGVycnVwdCBjb250ZXh0LgorICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAqIEByZXR2YWwgTm9uZQorICovCitzdGF0aWMgdm9pZCBTUElfUnhJU1JfMTZCSVRDUkMoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpIHsKKyAgX19JTyB1aW50MzJfdCB0bXByZWcgPSAwVTsKKworICAvKiBSZWFkIDE2Yml0IENSQyB0byBmbHVzaCBEYXRhIFJlZ2lzdGVyICovCisgIHRtcHJlZyA9IFJFQURfUkVHKGhzcGktPkluc3RhbmNlLT5EUik7CisgIC8qIFRvIGF2b2lkIEdDQyB3YXJuaW5nICovCisgIFVOVVNFRCh0bXByZWcpOworCisgIC8qIERpc2FibGUgUlhORSBhbmQgRVJSIGludGVycnVwdCAqLworICBfX0hBTF9TUElfRElTQUJMRV9JVChoc3BpLCAoU1BJX0lUX1JYTkUgfCBTUElfSVRfRVJSKSk7CisKKyAgU1BJX0Nsb3NlUnhfSVNSKGhzcGkpOworfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisKKy8qKgorICogQGJyaWVmICBNYW5hZ2UgdGhlIDE2LWJpdCByZWNlaXZlIGluIEludGVycnVwdCBjb250ZXh0LgorICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAqIEByZXR2YWwgTm9uZQorICovCitzdGF0aWMgdm9pZCBTUElfUnhJU1JfMTZCSVQoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpIHsKKyAgKigodWludDE2X3QgKiloc3BpLT5wUnhCdWZmUHRyKSA9ICh1aW50MTZfdCkoaHNwaS0+SW5zdGFuY2UtPkRSKTsKKyAgaHNwaS0+cFJ4QnVmZlB0ciArPSBzaXplb2YodWludDE2X3QpOworICBoc3BpLT5SeFhmZXJDb3VudC0tOworCisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAvKiBFbmFibGUgQ1JDIFRyYW5zbWlzc2lvbiAqLworICBpZiAoKGhzcGktPlJ4WGZlckNvdW50ID09IDFVKSAmJgorICAgICAgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkpIHsKKyAgICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjEsIFNQSV9DUjFfQ1JDTkVYVCk7CisgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisgIGlmIChoc3BpLT5SeFhmZXJDb3VudCA9PSAwVSkgeworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgICBpZiAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKSB7CisgICAgICBoc3BpLT5SeElTUiA9IFNQSV9SeElTUl8xNkJJVENSQzsKKyAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKyAgICBTUElfQ2xvc2VSeF9JU1IoaHNwaSk7CisgIH0KK30KKworLyoqCisgKiBAYnJpZWYgIEhhbmRsZSB0aGUgZGF0YSA4LWJpdCB0cmFuc21pdCBpbiBJbnRlcnJ1cHQgbW9kZS4KKyAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworc3RhdGljIHZvaWQgU1BJX1R4SVNSXzhCSVQoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpIHsKKyAgKihfX0lPIHVpbnQ4X3QgKikmaHNwaS0+SW5zdGFuY2UtPkRSID0gKigoY29uc3QgdWludDhfdCAqKWhzcGktPnBUeEJ1ZmZQdHIpOworICBoc3BpLT5wVHhCdWZmUHRyKys7CisgIGhzcGktPlR4WGZlckNvdW50LS07CisKKyAgaWYgKGhzcGktPlR4WGZlckNvdW50ID09IDBVKSB7CisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAgIGlmIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpIHsKKyAgICAgIC8qIEVuYWJsZSBDUkMgVHJhbnNtaXNzaW9uICovCisgICAgICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjEsIFNQSV9DUjFfQ1JDTkVYVCk7CisgICAgfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisgICAgU1BJX0Nsb3NlVHhfSVNSKGhzcGkpOworICB9Cit9CisKKy8qKgorICogQGJyaWVmICBIYW5kbGUgdGhlIGRhdGEgMTYtYml0IHRyYW5zbWl0IGluIEludGVycnVwdCBtb2RlLgorICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAqIEByZXR2YWwgTm9uZQorICovCitzdGF0aWMgdm9pZCBTUElfVHhJU1JfMTZCSVQoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpIHsKKyAgLyogVHJhbnNtaXQgZGF0YSBpbiAxNiBCaXQgbW9kZSAqLworICBoc3BpLT5JbnN0YW5jZS0+RFIgPSAqKChjb25zdCB1aW50MTZfdCAqKWhzcGktPnBUeEJ1ZmZQdHIpOworICBoc3BpLT5wVHhCdWZmUHRyICs9IHNpemVvZih1aW50MTZfdCk7CisgIGhzcGktPlR4WGZlckNvdW50LS07CisKKyAgaWYgKGhzcGktPlR4WGZlckNvdW50ID09IDBVKSB7CisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAgIGlmIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpIHsKKyAgICAgIC8qIEVuYWJsZSBDUkMgVHJhbnNtaXNzaW9uICovCisgICAgICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjEsIFNQSV9DUjFfQ1JDTkVYVCk7CisgICAgfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisgICAgU1BJX0Nsb3NlVHhfSVNSKGhzcGkpOworICB9Cit9CisKKy8qKgorICogQGJyaWVmICBIYW5kbGUgU1BJIENvbW11bmljYXRpb24gVGltZW91dC4KKyAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAqICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAqIEBwYXJhbSAgRmxhZyBTUEkgZmxhZyB0byBjaGVjaworICogQHBhcmFtICBTdGF0ZSBmbGFnIHN0YXRlIHRvIGNoZWNrCisgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbgorICogQHBhcmFtICBUaWNrc3RhcnQgdGljayBzdGFydCB2YWx1ZQorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBTUElfV2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChTUElfSGFuZGxlVHlwZURlZiAqaHNwaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsYWdTdGF0dXMgU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaWNrc3RhcnQpIHsKKyAgX19JTyB1aW50MzJfdCBjb3VudDsKKyAgdWludDMyX3QgdG1wX3RpbWVvdXQ7CisgIHVpbnQzMl90IHRtcF90aWNrc3RhcnQ7CisKKyAgLyogQWRqdXN0IFRpbWVvdXQgdmFsdWUgIGluIGNhc2Ugb2YgZW5kIG9mIHRyYW5zZmVyICovCisgIHRtcF90aW1lb3V0ID0gVGltZW91dCAtIChIQUxfR2V0VGljaygpIC0gVGlja3N0YXJ0KTsKKyAgdG1wX3RpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgLyogQ2FsY3VsYXRlIFRpbWVvdXQgYmFzZWQgb24gYSBzb2Z0d2FyZSBsb29wIHRvIGF2b2lkIGJsb2NraW5nIGlzc3VlIGlmCisgICAqIFN5c3RpY2sgaXMgZGlzYWJsZWQgKi8KKyAgY291bnQgPSB0bXBfdGltZW91dCAqICgoU3lzdGVtQ29yZUNsb2NrICogMzJVKSA+PiAyMFUpOworCisgIHdoaWxlICgoX19IQUxfU1BJX0dFVF9GTEFHKGhzcGksIEZsYWcpID8gU0VUIDogUkVTRVQpICE9IFN0YXRlKSB7CisgICAgaWYgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkgeworICAgICAgaWYgKCgoSEFMX0dldFRpY2soKSAtIHRtcF90aWNrc3RhcnQpID49IHRtcF90aW1lb3V0KSB8fAorICAgICAgICAgICh0bXBfdGltZW91dCA9PSAwVSkpIHsKKyAgICAgICAgLyogRGlzYWJsZSB0aGUgU1BJIGFuZCByZXNldCB0aGUgQ1JDOiB0aGUgQ1JDIHZhbHVlIHNob3VsZCBiZSBjbGVhcmVkCisgICAgICAgICAgIG9uIGJvdGggbWFzdGVyIGFuZCBzbGF2ZSBzaWRlcyBpbiBvcmRlciB0byByZXN5bmNocm9uaXplIHRoZSBtYXN0ZXIKKyAgICAgICAgICAgYW5kIHNsYXZlIGZvciB0aGVpciByZXNwZWN0aXZlIENSQyBjYWxjdWxhdGlvbiAqLworCisgICAgICAgIC8qIERpc2FibGUgVFhFLCBSWE5FIGFuZCBFUlIgaW50ZXJydXB0cyBmb3IgdGhlIGludGVycnVwdCBwcm9jZXNzICovCisgICAgICAgIF9fSEFMX1NQSV9ESVNBQkxFX0lUKGhzcGksIChTUElfSVRfVFhFIHwgU1BJX0lUX1JYTkUgfCBTUElfSVRfRVJSKSk7CisKKyAgICAgICAgaWYgKChoc3BpLT5Jbml0Lk1vZGUgPT0gU1BJX01PREVfTUFTVEVSKSAmJgorICAgICAgICAgICAgKChoc3BpLT5Jbml0LkRpcmVjdGlvbiA9PSBTUElfRElSRUNUSU9OXzFMSU5FKSB8fAorICAgICAgICAgICAgIChoc3BpLT5Jbml0LkRpcmVjdGlvbiA9PSBTUElfRElSRUNUSU9OXzJMSU5FU19SWE9OTFkpKSkgeworICAgICAgICAgIC8qIERpc2FibGUgU1BJIHBlcmlwaGVyYWwgKi8KKyAgICAgICAgICBfX0hBTF9TUElfRElTQUJMRShoc3BpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFJlc2V0IENSQyBDYWxjdWxhdGlvbiAqLworICAgICAgICBpZiAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKSB7CisgICAgICAgICAgU1BJX1JFU0VUX0NSQyhoc3BpKTsKKyAgICAgICAgfQorCisgICAgICAgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9SRUFEWTsKKworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoc3BpKTsKKworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgICAvKiBJZiBTeXN0aWNrIGlzIGRpc2FibGVkIG9yIG5vdCBpbmNyZW1lbnRlZCwgZGVhY3RpdmF0ZSB0aW1lb3V0IHRvIGdvIGluCisgICAgICAgKiBkaXNhYmxlIGxvb3AgcHJvY2VkdXJlICovCisgICAgICBpZiAoY291bnQgPT0gMFUpIHsKKyAgICAgICAgdG1wX3RpbWVvdXQgPSAwVTsKKyAgICAgIH0KKyAgICAgIGNvdW50LS07CisgICAgfQorICB9CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgIEhhbmRsZSBTUEkgRklGTyBDb21tdW5pY2F0aW9uIFRpbWVvdXQuCisgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgKiBAcGFyYW0gIEZpZm8gRmlmbyB0byBjaGVjaworICogQHBhcmFtICBTdGF0ZSBGaWZvIHN0YXRlIHRvIGNoZWNrCisgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbgorICogQHBhcmFtICBUaWNrc3RhcnQgdGljayBzdGFydCB2YWx1ZQorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBTUElfV2FpdEZpZm9TdGF0ZVVudGlsVGltZW91dChTUElfSGFuZGxlVHlwZURlZiAqaHNwaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBGaWZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGlja3N0YXJ0KSB7CisgIF9fSU8gdWludDMyX3QgY291bnQ7CisgIHVpbnQzMl90IHRtcF90aW1lb3V0OworICB1aW50MzJfdCB0bXBfdGlja3N0YXJ0OworICBfX0lPIGNvbnN0IHVpbnQ4X3QgKnB0bXByZWc4OworICBfX0lPIHVpbnQ4X3QgdG1wcmVnOCA9IDA7CisKKyAgLyogQWRqdXN0IFRpbWVvdXQgdmFsdWUgIGluIGNhc2Ugb2YgZW5kIG9mIHRyYW5zZmVyICovCisgIHRtcF90aW1lb3V0ID0gVGltZW91dCAtIChIQUxfR2V0VGljaygpIC0gVGlja3N0YXJ0KTsKKyAgdG1wX3RpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgOGJpdCB0ZW1wb3JhcnkgcG9pbnRlciAqLworICBwdG1wcmVnOCA9IChfX0lPIHVpbnQ4X3QgKikmaHNwaS0+SW5zdGFuY2UtPkRSOworCisgIC8qIENhbGN1bGF0ZSBUaW1lb3V0IGJhc2VkIG9uIGEgc29mdHdhcmUgbG9vcCB0byBhdm9pZCBibG9ja2luZyBpc3N1ZSBpZgorICAgKiBTeXN0aWNrIGlzIGRpc2FibGVkICovCisgIGNvdW50ID0gdG1wX3RpbWVvdXQgKiAoKFN5c3RlbUNvcmVDbG9jayAqIDM1VSkgPj4gMjBVKTsKKworICB3aGlsZSAoKGhzcGktPkluc3RhbmNlLT5TUiAmIEZpZm8pICE9IFN0YXRlKSB7CisgICAgaWYgKChGaWZvID09IFNQSV9TUl9GUkxWTCkgJiYgKFN0YXRlID09IFNQSV9GUkxWTF9FTVBUWSkpIHsKKyAgICAgIC8qIEZsdXNoIERhdGEgUmVnaXN0ZXIgYnkgYSBibGFuayByZWFkICovCisgICAgICB0bXByZWc4ID0gKnB0bXByZWc4OworICAgICAgLyogVG8gYXZvaWQgR0NDIHdhcm5pbmcgKi8KKyAgICAgIFVOVVNFRCh0bXByZWc4KTsKKyAgICB9CisKKyAgICBpZiAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKSB7CisgICAgICBpZiAoKChIQUxfR2V0VGljaygpIC0gdG1wX3RpY2tzdGFydCkgPj0gdG1wX3RpbWVvdXQpIHx8CisgICAgICAgICAgKHRtcF90aW1lb3V0ID09IDBVKSkgeworICAgICAgICAvKiBEaXNhYmxlIHRoZSBTUEkgYW5kIHJlc2V0IHRoZSBDUkM6IHRoZSBDUkMgdmFsdWUgc2hvdWxkIGJlIGNsZWFyZWQKKyAgICAgICAgICAgb24gYm90aCBtYXN0ZXIgYW5kIHNsYXZlIHNpZGVzIGluIG9yZGVyIHRvIHJlc3luY2hyb25pemUgdGhlIG1hc3RlcgorICAgICAgICAgICBhbmQgc2xhdmUgZm9yIHRoZWlyIHJlc3BlY3RpdmUgQ1JDIGNhbGN1bGF0aW9uICovCisKKyAgICAgICAgLyogRGlzYWJsZSBUWEUsIFJYTkUgYW5kIEVSUiBpbnRlcnJ1cHRzIGZvciB0aGUgaW50ZXJydXB0IHByb2Nlc3MgKi8KKyAgICAgICAgX19IQUxfU1BJX0RJU0FCTEVfSVQoaHNwaSwgKFNQSV9JVF9UWEUgfCBTUElfSVRfUlhORSB8IFNQSV9JVF9FUlIpKTsKKworICAgICAgICBpZiAoKGhzcGktPkluaXQuTW9kZSA9PSBTUElfTU9ERV9NQVNURVIpICYmCisgICAgICAgICAgICAoKGhzcGktPkluaXQuRGlyZWN0aW9uID09IFNQSV9ESVJFQ1RJT05fMUxJTkUpIHx8CisgICAgICAgICAgICAgKGhzcGktPkluaXQuRGlyZWN0aW9uID09IFNQSV9ESVJFQ1RJT05fMkxJTkVTX1JYT05MWSkpKSB7CisgICAgICAgICAgLyogRGlzYWJsZSBTUEkgcGVyaXBoZXJhbCAqLworICAgICAgICAgIF9fSEFMX1NQSV9ESVNBQkxFKGhzcGkpOworICAgICAgICB9CisKKyAgICAgICAgLyogUmVzZXQgQ1JDIENhbGN1bGF0aW9uICovCisgICAgICAgIGlmIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpIHsKKyAgICAgICAgICBTUElfUkVTRVRfQ1JDKGhzcGkpOworICAgICAgICB9CisKKyAgICAgICAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX1JFQURZOworCisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhzcGkpOworCisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICAgIC8qIElmIFN5c3RpY2sgaXMgZGlzYWJsZWQgb3Igbm90IGluY3JlbWVudGVkLCBkZWFjdGl2YXRlIHRpbWVvdXQgdG8gZ28gaW4KKyAgICAgICAqIGRpc2FibGUgbG9vcCBwcm9jZWR1cmUgKi8KKyAgICAgIGlmIChjb3VudCA9PSAwVSkgeworICAgICAgICB0bXBfdGltZW91dCA9IDBVOworICAgICAgfQorICAgICAgY291bnQtLTsKKyAgICB9CisgIH0KKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiAgSGFuZGxlIHRoZSBjaGVjayBvZiB0aGUgUlggdHJhbnNhY3Rpb24gY29tcGxldGUuCisgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAqIEBwYXJhbSAgVGlja3N0YXJ0IHRpY2sgc3RhcnQgdmFsdWUKKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU1BJX0VuZFJ4VHJhbnNhY3Rpb24oU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaWNrc3RhcnQpIHsKKyAgaWYgKChoc3BpLT5Jbml0Lk1vZGUgPT0gU1BJX01PREVfTUFTVEVSKSAmJgorICAgICAgKChoc3BpLT5Jbml0LkRpcmVjdGlvbiA9PSBTUElfRElSRUNUSU9OXzFMSU5FKSB8fAorICAgICAgIChoc3BpLT5Jbml0LkRpcmVjdGlvbiA9PSBTUElfRElSRUNUSU9OXzJMSU5FU19SWE9OTFkpKSkgeworICAgIC8qIERpc2FibGUgU1BJIHBlcmlwaGVyYWwgKi8KKyAgICBfX0hBTF9TUElfRElTQUJMRShoc3BpKTsKKyAgfQorCisgIC8qIENvbnRyb2wgdGhlIEJTWSBmbGFnICovCisgIGlmIChTUElfV2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChoc3BpLCBTUElfRkxBR19CU1ksIFJFU0VULCBUaW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja3N0YXJ0KSAhPSBIQUxfT0spIHsKKyAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9GTEFHKTsKKyAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgIH0KKworICBpZiAoKGhzcGktPkluaXQuTW9kZSA9PSBTUElfTU9ERV9NQVNURVIpICYmCisgICAgICAoKGhzcGktPkluaXQuRGlyZWN0aW9uID09IFNQSV9ESVJFQ1RJT05fMUxJTkUpIHx8CisgICAgICAgKGhzcGktPkluaXQuRGlyZWN0aW9uID09IFNQSV9ESVJFQ1RJT05fMkxJTkVTX1JYT05MWSkpKSB7CisgICAgLyogRW1wdHkgdGhlIEZSTFZMIGZpZm8gKi8KKyAgICBpZiAoU1BJX1dhaXRGaWZvU3RhdGVVbnRpbFRpbWVvdXQoaHNwaSwgU1BJX0ZMQUdfRlJMVkwsIFNQSV9GUkxWTF9FTVBUWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZW91dCwgVGlja3N0YXJ0KSAhPSBIQUxfT0spIHsKKyAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0ZMQUcpOworICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgIH0KKyAgfQorICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiAgSGFuZGxlIHRoZSBjaGVjayBvZiB0aGUgUlhUWCBvciBUWCB0cmFuc2FjdGlvbiBjb21wbGV0ZS4KKyAqIEBwYXJhbSAgaHNwaSBTUEkgaGFuZGxlCisgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbgorICogQHBhcmFtICBUaWNrc3RhcnQgdGljayBzdGFydCB2YWx1ZQorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBTUElfRW5kUnhUeFRyYW5zYWN0aW9uKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpY2tzdGFydCkgeworICAvKiBDb250cm9sIGlmIHRoZSBUWCBmaWZvIGlzIGVtcHR5ICovCisgIGlmIChTUElfV2FpdEZpZm9TdGF0ZVVudGlsVGltZW91dChoc3BpLCBTUElfRkxBR19GVExWTCwgU1BJX0ZUTFZMX0VNUFRZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZW91dCwgVGlja3N0YXJ0KSAhPSBIQUxfT0spIHsKKyAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9GTEFHKTsKKyAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgIH0KKworICAvKiBDb250cm9sIHRoZSBCU1kgZmxhZyAqLworICBpZiAoU1BJX1dhaXRGbGFnU3RhdGVVbnRpbFRpbWVvdXQoaHNwaSwgU1BJX0ZMQUdfQlNZLCBSRVNFVCwgVGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tzdGFydCkgIT0gSEFMX09LKSB7CisgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfRkxBRyk7CisgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICB9CisKKyAgLyogQ29udHJvbCBpZiB0aGUgUlggZmlmbyBpcyBlbXB0eSAqLworICBpZiAoU1BJX1dhaXRGaWZvU3RhdGVVbnRpbFRpbWVvdXQoaHNwaSwgU1BJX0ZMQUdfRlJMVkwsIFNQSV9GUkxWTF9FTVBUWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVvdXQsIFRpY2tzdGFydCkgIT0gSEFMX09LKSB7CisgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfRkxBRyk7CisgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICB9CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgIEhhbmRsZSB0aGUgZW5kIG9mIHRoZSBSWFRYIHRyYW5zYWN0aW9uLgorICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAqIEByZXR2YWwgTm9uZQorICovCitzdGF0aWMgdm9pZCBTUElfQ2xvc2VSeFR4X0lTUihTUElfSGFuZGxlVHlwZURlZiAqaHNwaSkgeworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisKKyAgLyogSW5pdCB0aWNrc3RhcnQgZm9yIHRpbWVvdXQgbWFuYWdlbWVudCAqLworICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgIC8qIERpc2FibGUgRVJSIGludGVycnVwdCAqLworICBfX0hBTF9TUElfRElTQUJMRV9JVChoc3BpLCBTUElfSVRfRVJSKTsKKworICAvKiBDaGVjayB0aGUgZW5kIG9mIHRoZSB0cmFuc2FjdGlvbiAqLworICBpZiAoU1BJX0VuZFJ4VHhUcmFuc2FjdGlvbihoc3BpLCBTUElfREVGQVVMVF9USU1FT1VULCB0aWNrc3RhcnQpICE9IEhBTF9PSykgeworICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0ZMQUcpOworICB9CisKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgIC8qIENoZWNrIGlmIENSQyBlcnJvciBvY2N1cnJlZCAqLworICBpZiAoX19IQUxfU1BJX0dFVF9GTEFHKGhzcGksIFNQSV9GTEFHX0NSQ0VSUikgIT0gUkVTRVQpIHsKKyAgICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfUkVBRFk7CisgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfQ1JDKTsKKyAgICBfX0hBTF9TUElfQ0xFQVJfQ1JDRVJSRkxBRyhoc3BpKTsKKyAgICAvKiBDYWxsIHVzZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgIGhzcGktPkVycm9yQ2FsbGJhY2soaHNwaSk7CisjZWxzZQorICAgIEhBTF9TUElfRXJyb3JDYWxsYmFjayhoc3BpKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfSBlbHNlIHsKKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworICAgIGlmIChoc3BpLT5FcnJvckNvZGUgPT0gSEFMX1NQSV9FUlJPUl9OT05FKSB7CisgICAgICBpZiAoaHNwaS0+U3RhdGUgPT0gSEFMX1NQSV9TVEFURV9CVVNZX1JYKSB7CisgICAgICAgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9SRUFEWTsKKyAgICAgICAgLyogQ2FsbCB1c2VyIFJ4IGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICAgICAgaHNwaS0+UnhDcGx0Q2FsbGJhY2soaHNwaSk7CisjZWxzZQorICAgICAgSEFMX1NQSV9SeENwbHRDYWxsYmFjayhoc3BpKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9SRUFEWTsKKyAgICAgICAgLyogQ2FsbCB1c2VyIFR4UnggY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgICAgICBoc3BpLT5UeFJ4Q3BsdENhbGxiYWNrKGhzcGkpOworI2Vsc2UKKyAgICAgIEhBTF9TUElfVHhSeENwbHRDYWxsYmFjayhoc3BpKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX1JFQURZOworICAgICAgLyogQ2FsbCB1c2VyIGVycm9yIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICAgIGhzcGktPkVycm9yQ2FsbGJhY2soaHNwaSk7CisjZWxzZQorICAgIEhBTF9TUElfRXJyb3JDYWxsYmFjayhoc3BpKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICB9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KK30KKworLyoqCisgKiBAYnJpZWYgIEhhbmRsZSB0aGUgZW5kIG9mIHRoZSBSWCB0cmFuc2FjdGlvbi4KKyAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworc3RhdGljIHZvaWQgU1BJX0Nsb3NlUnhfSVNSKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKSB7CisgIC8qIERpc2FibGUgUlhORSBhbmQgRVJSIGludGVycnVwdCAqLworICBfX0hBTF9TUElfRElTQUJMRV9JVChoc3BpLCAoU1BJX0lUX1JYTkUgfCBTUElfSVRfRVJSKSk7CisKKyAgLyogQ2hlY2sgdGhlIGVuZCBvZiB0aGUgdHJhbnNhY3Rpb24gKi8KKyAgaWYgKFNQSV9FbmRSeFRyYW5zYWN0aW9uKGhzcGksIFNQSV9ERUZBVUxUX1RJTUVPVVQsIEhBTF9HZXRUaWNrKCkpICE9CisgICAgICBIQUxfT0spIHsKKyAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9GTEFHKTsKKyAgfQorICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfUkVBRFk7CisKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgIC8qIENoZWNrIGlmIENSQyBlcnJvciBvY2N1cnJlZCAqLworICBpZiAoX19IQUxfU1BJX0dFVF9GTEFHKGhzcGksIFNQSV9GTEFHX0NSQ0VSUikgIT0gUkVTRVQpIHsKKyAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9DUkMpOworICAgIF9fSEFMX1NQSV9DTEVBUl9DUkNFUlJGTEFHKGhzcGkpOworICAgIC8qIENhbGwgdXNlciBlcnJvciBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgaHNwaS0+RXJyb3JDYWxsYmFjayhoc3BpKTsKKyNlbHNlCisgICAgSEFMX1NQSV9FcnJvckNhbGxiYWNrKGhzcGkpOworI2VuZGlmIC8qIFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9IGVsc2UgeworI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisgICAgaWYgKGhzcGktPkVycm9yQ29kZSA9PSBIQUxfU1BJX0VSUk9SX05PTkUpIHsKKyAgICAgIC8qIENhbGwgdXNlciBSeCBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgICBoc3BpLT5SeENwbHRDYWxsYmFjayhoc3BpKTsKKyNlbHNlCisgICAgSEFMX1NQSV9SeENwbHRDYWxsYmFjayhoc3BpKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9IGVsc2UgeworICAgICAgLyogQ2FsbCB1c2VyIGVycm9yIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICAgIGhzcGktPkVycm9yQ2FsbGJhY2soaHNwaSk7CisjZWxzZQorICAgIEhBTF9TUElfRXJyb3JDYWxsYmFjayhoc3BpKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICB9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KK30KKworLyoqCisgKiBAYnJpZWYgIEhhbmRsZSB0aGUgZW5kIG9mIHRoZSBUWCB0cmFuc2FjdGlvbi4KKyAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworc3RhdGljIHZvaWQgU1BJX0Nsb3NlVHhfSVNSKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKSB7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKworICAvKiBJbml0IHRpY2tzdGFydCBmb3IgdGltZW91dCBtYW5hZ2VtZW50Ki8KKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAvKiBEaXNhYmxlIFRYRSBhbmQgRVJSIGludGVycnVwdCAqLworICBfX0hBTF9TUElfRElTQUJMRV9JVChoc3BpLCAoU1BJX0lUX1RYRSB8IFNQSV9JVF9FUlIpKTsKKworICAvKiBDaGVjayB0aGUgZW5kIG9mIHRoZSB0cmFuc2FjdGlvbiAqLworICBpZiAoU1BJX0VuZFJ4VHhUcmFuc2FjdGlvbihoc3BpLCBTUElfREVGQVVMVF9USU1FT1VULCB0aWNrc3RhcnQpICE9IEhBTF9PSykgeworICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0ZMQUcpOworICB9CisKKyAgLyogQ2xlYXIgb3ZlcnJ1biBmbGFnIGluIDIgTGluZXMgY29tbXVuaWNhdGlvbiBtb2RlIGJlY2F1c2UgcmVjZWl2ZWQgaXMgbm90CisgICAqIHJlYWQgKi8KKyAgaWYgKGhzcGktPkluaXQuRGlyZWN0aW9uID09IFNQSV9ESVJFQ1RJT05fMkxJTkVTKSB7CisgICAgX19IQUxfU1BJX0NMRUFSX09WUkZMQUcoaHNwaSk7CisgIH0KKworICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfUkVBRFk7CisgIGlmIChoc3BpLT5FcnJvckNvZGUgIT0gSEFMX1NQSV9FUlJPUl9OT05FKSB7CisgICAgLyogQ2FsbCB1c2VyIGVycm9yIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICBoc3BpLT5FcnJvckNhbGxiYWNrKGhzcGkpOworI2Vsc2UKKyAgICBIQUxfU1BJX0Vycm9yQ2FsbGJhY2soaHNwaSk7CisjZW5kaWYgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0gZWxzZSB7CisgICAgLyogQ2FsbCB1c2VyIFJ4IGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICBoc3BpLT5UeENwbHRDYWxsYmFjayhoc3BpKTsKKyNlbHNlCisgICAgSEFMX1NQSV9UeENwbHRDYWxsYmFjayhoc3BpKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorfQorCisvKioKKyAqIEBicmllZiAgSGFuZGxlIGFib3J0IGEgUnggdHJhbnNhY3Rpb24uCisgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICogQHJldHZhbCBOb25lCisgKi8KK3N0YXRpYyB2b2lkIFNQSV9BYm9ydFJ4X0lTUihTUElfSGFuZGxlVHlwZURlZiAqaHNwaSkgeworICBfX0lPIHVpbnQzMl90IGNvdW50OworCisgIC8qIERpc2FibGUgU1BJIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfU1BJX0RJU0FCTEUoaHNwaSk7CisKKyAgY291bnQgPSBTUElfREVGQVVMVF9USU1FT1VUICogKFN5c3RlbUNvcmVDbG9jayAvIDI0VSAvIDEwMDBVKTsKKworICAvKiBEaXNhYmxlIFJYTkVJRSBpbnRlcnJ1cHQgKi8KKyAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIChTUElfQ1IyX1JYTkVJRSkpOworCisgIC8qIENoZWNrIFJYTkVJRSBpcyBkaXNhYmxlZCAqLworICBkbyB7CisgICAgaWYgKGNvdW50ID09IDBVKSB7CisgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9BQk9SVCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY291bnQtLTsKKyAgfSB3aGlsZSAoSEFMX0lTX0JJVF9TRVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9SWE5FSUUpKTsKKworICAvKiBDb250cm9sIHRoZSBCU1kgZmxhZyAqLworICBpZiAoU1BJX1dhaXRGbGFnU3RhdGVVbnRpbFRpbWVvdXQoaHNwaSwgU1BJX0ZMQUdfQlNZLCBSRVNFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQSV9ERUZBVUxUX1RJTUVPVVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfR2V0VGljaygpKSAhPSBIQUxfT0spIHsKKyAgICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX0FCT1JUOworICB9CisKKyAgLyogRW1wdHkgdGhlIEZSTFZMIGZpZm8gKi8KKyAgaWYgKFNQSV9XYWl0Rmlmb1N0YXRlVW50aWxUaW1lb3V0KGhzcGksIFNQSV9GTEFHX0ZSTFZMLCBTUElfRlJMVkxfRU1QVFksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUElfREVGQVVMVF9USU1FT1VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0dldFRpY2soKSkgIT0gSEFMX09LKSB7CisgICAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9BQk9SVDsKKyAgfQorCisgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9BQk9SVDsKK30KKworLyoqCisgKiBAYnJpZWYgIEhhbmRsZSBhYm9ydCBhIFR4IG9yIFJ4L1R4IHRyYW5zYWN0aW9uLgorICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAqIEByZXR2YWwgTm9uZQorICovCitzdGF0aWMgdm9pZCBTUElfQWJvcnRUeF9JU1IoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpIHsKKyAgX19JTyB1aW50MzJfdCBjb3VudDsKKworICBjb3VudCA9IFNQSV9ERUZBVUxUX1RJTUVPVVQgKiAoU3lzdGVtQ29yZUNsb2NrIC8gMjRVIC8gMTAwMFUpOworCisgIC8qIERpc2FibGUgVFhFSUUgaW50ZXJydXB0ICovCisgIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCAoU1BJX0NSMl9UWEVJRSkpOworCisgIC8qIENoZWNrIFRYRUlFIGlzIGRpc2FibGVkICovCisgIGRvIHsKKyAgICBpZiAoY291bnQgPT0gMFUpIHsKKyAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0FCT1JUKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjb3VudC0tOworICB9IHdoaWxlIChIQUxfSVNfQklUX1NFVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1RYRUlFKSk7CisKKyAgaWYgKFNQSV9FbmRSeFR4VHJhbnNhY3Rpb24oaHNwaSwgU1BJX0RFRkFVTFRfVElNRU9VVCwgSEFMX0dldFRpY2soKSkgIT0KKyAgICAgIEhBTF9PSykgeworICAgIGhzcGktPkVycm9yQ29kZSA9IEhBTF9TUElfRVJST1JfQUJPUlQ7CisgIH0KKworICAvKiBEaXNhYmxlIFNQSSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1NQSV9ESVNBQkxFKGhzcGkpOworCisgIC8qIEVtcHR5IHRoZSBGUkxWTCBmaWZvICovCisgIGlmIChTUElfV2FpdEZpZm9TdGF0ZVVudGlsVGltZW91dChoc3BpLCBTUElfRkxBR19GUkxWTCwgU1BJX0ZSTFZMX0VNUFRZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BJX0RFRkFVTFRfVElNRU9VVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9HZXRUaWNrKCkpICE9IEhBTF9PSykgeworICAgIGhzcGktPkVycm9yQ29kZSA9IEhBTF9TUElfRVJST1JfQUJPUlQ7CisgIH0KKworICAvKiBDaGVjayBjYXNlIG9mIEZ1bGwtRHVwbGV4IE1vZGUgYW5kIGRpc2FibGUgZGlyZWN0bHkgUlhORUlFIGludGVycnVwdCAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9SWE5FSUUpKSB7CisgICAgLyogRGlzYWJsZSBSWE5FSUUgaW50ZXJydXB0ICovCisgICAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIChTUElfQ1IyX1JYTkVJRSkpOworCisgICAgLyogQ2hlY2sgUlhORUlFIGlzIGRpc2FibGVkICovCisgICAgZG8geworICAgICAgaWYgKGNvdW50ID09IDBVKSB7CisgICAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0FCT1JUKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjb3VudC0tOworICAgIH0gd2hpbGUgKEhBTF9JU19CSVRfU0VUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfUlhORUlFKSk7CisKKyAgICAvKiBDb250cm9sIHRoZSBCU1kgZmxhZyAqLworICAgIGlmIChTUElfV2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChoc3BpLCBTUElfRkxBR19CU1ksIFJFU0VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUElfREVGQVVMVF9USU1FT1VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfR2V0VGljaygpKSAhPSBIQUxfT0spIHsKKyAgICAgIGhzcGktPkVycm9yQ29kZSA9IEhBTF9TUElfRVJST1JfQUJPUlQ7CisgICAgfQorCisgICAgLyogRW1wdHkgdGhlIEZSTFZMIGZpZm8gKi8KKyAgICBpZiAoU1BJX1dhaXRGaWZvU3RhdGVVbnRpbFRpbWVvdXQoaHNwaSwgU1BJX0ZMQUdfRlJMVkwsIFNQSV9GUkxWTF9FTVBUWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BJX0RFRkFVTFRfVElNRU9VVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0dldFRpY2soKSkgIT0gSEFMX09LKSB7CisgICAgICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX0FCT1JUOworICAgIH0KKyAgfQorICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfQUJPUlQ7Cit9CisKKy8qKgorICogQH0KKyAqLworCisjZW5kaWYgLyogSEFMX1NQSV9NT0RVTEVfRU5BQkxFRCAqLworCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCmRpZmYgLS1naXQgYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfc3BpX2V4LmMgYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfc3BpX2V4LmMKaW5kZXggZGNlOWY1ZC4uNWU2ZmE2OSAxMDA2NDQKLS0tIGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3NwaV9leC5jCisrKyBiL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF9zcGlfZXguYwpAQCAtMSwxMDkgKzEsMTA5IEBACi0vKioNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQGZpbGUgICAgc3RtMzJnNHh4X2hhbF9zcGlfZXguYw0KLSAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtDQotICogQGJyaWVmICAgRXh0ZW5kZWQgU1BJIEhBTCBtb2R1bGUgZHJpdmVyLg0KLSAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcNCi0gKiAgICAgICAgICBTUEkgcGVyaXBoZXJhbCBleHRlbmRlZCBmdW5jdGlvbmFsaXRpZXMgOg0KLSAqICAgICAgICAgICArIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMNCi0gKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBAYXR0ZW50aW9uDQotICoNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQotICoNCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRlcm1zIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUNCi0gKiBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb2Z0d2FyZSBjb21wb25lbnQuDQotICogSWYgbm8gTElDRU5TRSBmaWxlIGNvbWVzIHdpdGggdGhpcyBzb2Z0d2FyZSwgaXQgaXMgcHJvdmlkZWQgQVMtSVMuDQotICoNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICovDQotDQotLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaW5jbHVkZSAic3RtMzJnNHh4X2hhbC5oIg0KLQ0KLS8qKiBAYWRkdG9ncm91cCBTVE0zMkc0eHhfSEFMX0RyaXZlcg0KLSAqIEB7DQotICovDQotDQotLyoqIEBkZWZncm91cCBTUElFeCBTUElFeA0KLSAqIEBicmllZiBTUEkgRXh0ZW5kZWQgSEFMIG1vZHVsZSBkcml2ZXINCi0gKiBAew0KLSAqLw0KLSNpZmRlZiBIQUxfU1BJX01PRFVMRV9FTkFCTEVEDQotDQotLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiBQcml2YXRlIGRlZmluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgU1BJRXhfUHJpdmF0ZV9Db25zdGFudHMgU1BJRXggUHJpdmF0ZSBDb25zdGFudHMNCi0gKiBAew0KLSAqLw0KLSNkZWZpbmUgU1BJX0ZJRk9fU0laRSA0VUwNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotDQotLyoqIEBkZWZncm91cCBTUElFeF9FeHBvcnRlZF9GdW5jdGlvbnMgU1BJRXggRXhwb3J0ZWQgRnVuY3Rpb25zDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFNQSUV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucw0KLSAgKiAgQGJyaWVmICAgRGF0YSB0cmFuc2ZlcnMgZnVuY3Rpb25zDQotICAqDQotQHZlcmJhdGltDQotICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAjIyMjIw0KLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIFsuLl0NCi0gICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGV4dGVuZGVkIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIFNQSQ0KLSAgICBkYXRhIHRyYW5zZmVycy4NCi0NCi0gICAgKCMpIFJ4IGRhdGEgZmx1c2ggZnVuY3Rpb246DQotICAgICAgICAoKyspIEhBTF9TUElFeF9GbHVzaFJ4RmlmbygpDQotDQotQGVuZHZlcmJhdGltDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRmx1c2ggdGhlIFJYIGZpZm8uDQotICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KLSAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU1BJIG1vZHVsZS4NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJRXhfRmx1c2hSeEZpZm8oU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpIHsNCi0gIF9fSU8gdWludDMyX3QgdG1wcmVnOw0KLSAgdWludDhfdCBjb3VudCA9IDBVOw0KLSAgd2hpbGUgKChoc3BpLT5JbnN0YW5jZS0+U1IgJiBTUElfRkxBR19GUkxWTCkgIT0gU1BJX0ZSTFZMX0VNUFRZKSB7DQotICAgIGNvdW50Kys7DQotICAgIHRtcHJlZyA9IGhzcGktPkluc3RhbmNlLT5EUjsNCi0gICAgVU5VU0VEKHRtcHJlZyk7IC8qIFRvIGF2b2lkIEdDQyB3YXJuaW5nICovDQotICAgIGlmIChjb3VudCA9PSBTUElfRklGT19TSVpFKSB7DQotICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOw0KLSAgICB9DQotICB9DQotICByZXR1cm4gSEFMX09LOw0KLX0NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotI2VuZGlmIC8qIEhBTF9TUElfTU9EVUxFX0VOQUJMRUQgKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQorLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAZmlsZSAgICBzdG0zMmc0eHhfaGFsX3NwaV9leC5jCisgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICogQGJyaWVmICAgRXh0ZW5kZWQgU1BJIEhBTCBtb2R1bGUgZHJpdmVyLgorICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICogICAgICAgICAgU1BJIHBlcmlwaGVyYWwgZXh0ZW5kZWQgZnVuY3Rpb25hbGl0aWVzIDoKKyAqICAgICAgICAgICArIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYXR0ZW50aW9uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0ZXJtcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlCisgKiBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb2Z0d2FyZSBjb21wb25lbnQuCisgKiBJZiBubyBMSUNFTlNFIGZpbGUgY29tZXMgd2l0aCB0aGlzIHNvZnR3YXJlLCBpdCBpcyBwcm92aWRlZCBBUy1JUy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmc0eHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkc0eHhfSEFMX0RyaXZlcgorICogQHsKKyAqLworCisvKiogQGRlZmdyb3VwIFNQSUV4IFNQSUV4CisgKiBAYnJpZWYgU1BJIEV4dGVuZGVkIEhBTCBtb2R1bGUgZHJpdmVyCisgKiBAeworICovCisjaWZkZWYgSEFMX1NQSV9NT0RVTEVfRU5BQkxFRAorCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgU1BJRXhfUHJpdmF0ZV9Db25zdGFudHMgU1BJRXggUHJpdmF0ZSBDb25zdGFudHMKKyAqIEB7CisgKi8KKyNkZWZpbmUgU1BJX0ZJRk9fU0laRSA0VUwKKy8qKgorICogQH0KKyAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIFNQSUV4X0V4cG9ydGVkX0Z1bmN0aW9ucyBTUElFeCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAqIEB7CisgKi8KKworLyoqIEBkZWZncm91cCBTUElFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKiAgQGJyaWVmICAgRGF0YSB0cmFuc2ZlcnMgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZXh0ZW5kZWQgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgU1BJCisgICAgZGF0YSB0cmFuc2ZlcnMuCisKKyAgICAoIykgUnggZGF0YSBmbHVzaCBmdW5jdGlvbjoKKyAgICAgICAgKCsrKSBIQUxfU1BJRXhfRmx1c2hSeEZpZm8oKQorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAqIEBicmllZiAgRmx1c2ggdGhlIFJYIGZpZm8uCisgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNQSSBtb2R1bGUuCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSUV4X0ZsdXNoUnhGaWZvKGNvbnN0IFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKSB7CisgIF9fSU8gdWludDMyX3QgdG1wcmVnOworICB1aW50OF90IGNvdW50ID0gMFU7CisgIHdoaWxlICgoaHNwaS0+SW5zdGFuY2UtPlNSICYgU1BJX0ZMQUdfRlJMVkwpICE9IFNQSV9GUkxWTF9FTVBUWSkgeworICAgIGNvdW50Kys7CisgICAgdG1wcmVnID0gaHNwaS0+SW5zdGFuY2UtPkRSOworICAgIFVOVVNFRCh0bXByZWcpOyAvKiBUbyBhdm9pZCBHQ0Mgd2FybmluZyAqLworICAgIGlmIChjb3VudCA9PSBTUElfRklGT19TSVpFKSB7CisgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgfQorICB9CisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworI2VuZGlmIC8qIEhBTF9TUElfTU9EVUxFX0VOQUJMRUQgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLwpkaWZmIC0tZ2l0IGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3RpbS5jIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3RpbS5jCmluZGV4IDkwMTg0ZGEuLjAxYTgwNGQgMTAwNjQ0Ci0tLSBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF90aW0uYworKysgYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfdGltLmMKQEAgLTEsNzY2MSArMSw3NjgyIEBACi0vKioNCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgKiBAZmlsZSAgICBzdG0zMmc0eHhfaGFsX3RpbS5jDQotICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtDQotICAqIEBicmllZiAgIFRJTSBIQUwgbW9kdWxlIGRyaXZlci4NCi0gICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZw0KLSAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIFRpbWVyIChUSU0pIHBlcmlwaGVyYWw6DQotICAqICAgICAgICAgICArIFRJTSBUaW1lIEJhc2UgSW5pdGlhbGl6YXRpb24NCi0gICogICAgICAgICAgICsgVElNIFRpbWUgQmFzZSBTdGFydA0KLSAgKiAgICAgICAgICAgKyBUSU0gVGltZSBCYXNlIFN0YXJ0IEludGVycnVwdGlvbg0KLSAgKiAgICAgICAgICAgKyBUSU0gVGltZSBCYXNlIFN0YXJ0IERNQQ0KLSAgKiAgICAgICAgICAgKyBUSU0gT3V0cHV0IENvbXBhcmUvUFdNIEluaXRpYWxpemF0aW9uDQotICAqICAgICAgICAgICArIFRJTSBPdXRwdXQgQ29tcGFyZS9QV00gQ2hhbm5lbCBDb25maWd1cmF0aW9uDQotICAqICAgICAgICAgICArIFRJTSBPdXRwdXQgQ29tcGFyZS9QV00gIFN0YXJ0DQotICAqICAgICAgICAgICArIFRJTSBPdXRwdXQgQ29tcGFyZS9QV00gIFN0YXJ0IEludGVycnVwdGlvbg0KLSAgKiAgICAgICAgICAgKyBUSU0gT3V0cHV0IENvbXBhcmUvUFdNIFN0YXJ0IERNQQ0KLSAgKiAgICAgICAgICAgKyBUSU0gSW5wdXQgQ2FwdHVyZSBJbml0aWFsaXphdGlvbg0KLSAgKiAgICAgICAgICAgKyBUSU0gSW5wdXQgQ2FwdHVyZSBDaGFubmVsIENvbmZpZ3VyYXRpb24NCi0gICogICAgICAgICAgICsgVElNIElucHV0IENhcHR1cmUgU3RhcnQNCi0gICogICAgICAgICAgICsgVElNIElucHV0IENhcHR1cmUgU3RhcnQgSW50ZXJydXB0aW9uDQotICAqICAgICAgICAgICArIFRJTSBJbnB1dCBDYXB0dXJlIFN0YXJ0IERNQQ0KLSAgKiAgICAgICAgICAgKyBUSU0gT25lIFB1bHNlIEluaXRpYWxpemF0aW9uDQotICAqICAgICAgICAgICArIFRJTSBPbmUgUHVsc2UgQ2hhbm5lbCBDb25maWd1cmF0aW9uDQotICAqICAgICAgICAgICArIFRJTSBPbmUgUHVsc2UgU3RhcnQNCi0gICogICAgICAgICAgICsgVElNIEVuY29kZXIgSW50ZXJmYWNlIEluaXRpYWxpemF0aW9uDQotICAqICAgICAgICAgICArIFRJTSBFbmNvZGVyIEludGVyZmFjZSBTdGFydA0KLSAgKiAgICAgICAgICAgKyBUSU0gRW5jb2RlciBJbnRlcmZhY2UgU3RhcnQgSW50ZXJydXB0aW9uDQotICAqICAgICAgICAgICArIFRJTSBFbmNvZGVyIEludGVyZmFjZSBTdGFydCBETUENCi0gICogICAgICAgICAgICsgQ29tbXV0YXRpb24gRXZlbnQgY29uZmlndXJhdGlvbiB3aXRoIEludGVycnVwdGlvbiBhbmQgRE1BDQotICAqICAgICAgICAgICArIFRJTSBPQ1JlZiBjbGVhciBjb25maWd1cmF0aW9uDQotICAqICAgICAgICAgICArIFRJTSBFeHRlcm5hbCBDbG9jayBjb25maWd1cmF0aW9uDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICogQGF0dGVudGlvbg0KLSAgKg0KLSAgKiBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLg0KLSAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KLSAgKg0KLSAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRlcm1zIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUNCi0gICogaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc29mdHdhcmUgY29tcG9uZW50Lg0KLSAgKiBJZiBubyBMSUNFTlNFIGZpbGUgY29tZXMgd2l0aCB0aGlzIHNvZnR3YXJlLCBpdCBpcyBwcm92aWRlZCBBUy1JUy4NCi0gICoNCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgQHZlcmJhdGltDQotICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgICAgICAgICAgICAgICAgICAgIyMjIyMgVElNRVIgR2VuZXJpYyBmZWF0dXJlcyAjIyMjIw0KLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICBbLi5dIFRoZSBUaW1lciBmZWF0dXJlcyBpbmNsdWRlOg0KLSAgICAgICAoIykgMTYtYml0IHVwLCBkb3duLCB1cC9kb3duIGF1dG8tcmVsb2FkIGNvdW50ZXIuDQotICAgICAgICgjKSAxNi1iaXQgcHJvZ3JhbW1hYmxlIHByZXNjYWxlciBhbGxvd2luZyBkaXZpZGluZyAoYWxzbyBvbiB0aGUgZmx5KSB0aGUNCi0gICAgICAgICAgIGNvdW50ZXIgY2xvY2sgZnJlcXVlbmN5IGVpdGhlciBieSBhbnkgZmFjdG9yIGJldHdlZW4gMSBhbmQgNjU1MzYuDQotICAgICAgICgjKSBVcCB0byA0IGluZGVwZW5kZW50IGNoYW5uZWxzIGZvcjoNCi0gICAgICAgICAgICgrKykgSW5wdXQgQ2FwdHVyZQ0KLSAgICAgICAgICAgKCsrKSBPdXRwdXQgQ29tcGFyZQ0KLSAgICAgICAgICAgKCsrKSBQV00gZ2VuZXJhdGlvbiAoRWRnZSBhbmQgQ2VudGVyLWFsaWduZWQgTW9kZSkNCi0gICAgICAgICAgICgrKykgT25lLXB1bHNlIG1vZGUgb3V0cHV0DQotICAgICAgICgjKSBTeW5jaHJvbml6YXRpb24gY2lyY3VpdCB0byBjb250cm9sIHRoZSB0aW1lciB3aXRoIGV4dGVybmFsIHNpZ25hbHMNCi1hbmQgdG8gaW50ZXJjb25uZWN0IHNldmVyYWwgdGltZXJzIHRvZ2V0aGVyLg0KLSAgICAgICAoIykgU3VwcG9ydHMgaW5jcmVtZW50YWwgZW5jb2RlciBmb3IgcG9zaXRpb25pbmcgcHVycG9zZXMNCi0NCi0gICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjDQotICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgWy4uXQ0KLSAgICAgKCMpIEluaXRpYWxpemUgdGhlIFRJTSBsb3cgbGV2ZWwgcmVzb3VyY2VzIGJ5IGltcGxlbWVudGluZyB0aGUgZm9sbG93aW5nDQotZnVuY3Rpb25zIGRlcGVuZGluZyBvbiB0aGUgc2VsZWN0ZWQgZmVhdHVyZToNCi0gICAgICAgICAgICgrKykgVGltZSBCYXNlIDogSEFMX1RJTV9CYXNlX01zcEluaXQoKQ0KLSAgICAgICAgICAgKCsrKSBJbnB1dCBDYXB0dXJlIDogSEFMX1RJTV9JQ19Nc3BJbml0KCkNCi0gICAgICAgICAgICgrKykgT3V0cHV0IENvbXBhcmUgOiBIQUxfVElNX09DX01zcEluaXQoKQ0KLSAgICAgICAgICAgKCsrKSBQV00gZ2VuZXJhdGlvbiA6IEhBTF9USU1fUFdNX01zcEluaXQoKQ0KLSAgICAgICAgICAgKCsrKSBPbmUtcHVsc2UgbW9kZSBvdXRwdXQgOiBIQUxfVElNX09uZVB1bHNlX01zcEluaXQoKQ0KLSAgICAgICAgICAgKCsrKSBFbmNvZGVyIG1vZGUgb3V0cHV0IDogSEFMX1RJTV9FbmNvZGVyX01zcEluaXQoKQ0KLQ0KLSAgICAgKCMpIEluaXRpYWxpemUgdGhlIFRJTSBsb3cgbGV2ZWwgcmVzb3VyY2VzIDoNCi0gICAgICAgICgjIykgRW5hYmxlIHRoZSBUSU0gaW50ZXJmYWNlIGNsb2NrIHVzaW5nIF9fSEFMX1JDQ19USU14X0NMS19FTkFCTEUoKTsNCi0gICAgICAgICgjIykgVElNIHBpbnMgY29uZmlndXJhdGlvbg0KLSAgICAgICAgICAgICgrKyspIEVuYWJsZSB0aGUgY2xvY2sgZm9yIHRoZSBUSU0gR1BJT3MgdXNpbmcgdGhlIGZvbGxvd2luZw0KLWZ1bmN0aW9uOg0KLSAgICAgICAgICAgICBfX0hBTF9SQ0NfR1BJT3hfQ0xLX0VOQUJMRSgpOw0KLSAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGVzZSBUSU0gcGlucyBpbiBBbHRlcm5hdGUgZnVuY3Rpb24gbW9kZSB1c2luZw0KLUhBTF9HUElPX0luaXQoKTsNCi0NCi0gICAgICgjKSBUaGUgZXh0ZXJuYWwgQ2xvY2sgY2FuIGJlIGNvbmZpZ3VyZWQsIGlmIG5lZWRlZCAodGhlIGRlZmF1bHQgY2xvY2sgaXMNCi10aGUgaW50ZXJuYWwgY2xvY2sgZnJvbSB0aGUgQVBCeCksIHVzaW5nIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb246DQotICAgICAgICAgSEFMX1RJTV9Db25maWdDbG9ja1NvdXJjZSwgdGhlIGNsb2NrIGNvbmZpZ3VyYXRpb24gc2hvdWxkIGJlIGRvbmUNCi1iZWZvcmUgYW55IHN0YXJ0IGZ1bmN0aW9uLg0KLQ0KLSAgICAgKCMpIENvbmZpZ3VyZSB0aGUgVElNIGluIHRoZSBkZXNpcmVkIGZ1bmN0aW9uaW5nIG1vZGUgdXNpbmcgb25lIG9mIHRoZQ0KLSAgICAgICBJbml0aWFsaXphdGlvbiBmdW5jdGlvbiBvZiB0aGlzIGRyaXZlcjoNCi0gICAgICAgKCsrKSBIQUxfVElNX0Jhc2VfSW5pdDogdG8gdXNlIHRoZSBUaW1lciB0byBnZW5lcmF0ZSBhIHNpbXBsZSB0aW1lIGJhc2UNCi0gICAgICAgKCsrKSBIQUxfVElNX09DX0luaXQsIEhBTF9USU1fT0NfQ29uZmlnQ2hhbm5lbCBhbmQgb3B0aW9uYWxseQ0KLUhBTF9USU1FeF9PQ19Db25maWdQdWxzZU9uQ29tcGFyZTogdG8gdXNlIHRoZSBUaW1lciB0byBnZW5lcmF0ZSBhbiBPdXRwdXQNCi1Db21wYXJlIHNpZ25hbC4NCi0gICAgICAgKCsrKSBIQUxfVElNX1BXTV9Jbml0IGFuZCBIQUxfVElNX1BXTV9Db25maWdDaGFubmVsOiB0byB1c2UgdGhlIFRpbWVyIHRvDQotZ2VuZXJhdGUgYSBQV00gc2lnbmFsLg0KLSAgICAgICAoKyspIEhBTF9USU1fSUNfSW5pdCBhbmQgSEFMX1RJTV9JQ19Db25maWdDaGFubmVsOiB0byB1c2UgdGhlIFRpbWVyIHRvDQotbWVhc3VyZSBhbiBleHRlcm5hbCBzaWduYWwuDQotICAgICAgICgrKykgSEFMX1RJTV9PbmVQdWxzZV9Jbml0IGFuZCBIQUxfVElNX09uZVB1bHNlX0NvbmZpZ0NoYW5uZWw6IHRvIHVzZSB0aGUNCi1UaW1lciBpbiBPbmUgUHVsc2UgTW9kZS4NCi0gICAgICAgKCsrKSBIQUxfVElNX0VuY29kZXJfSW5pdDogdG8gdXNlIHRoZSBUaW1lciBFbmNvZGVyIEludGVyZmFjZS4NCi0NCi0gICAgICgjKSBBY3RpdmF0ZSB0aGUgVElNIHBlcmlwaGVyYWwgdXNpbmcgb25lIG9mIHRoZSBzdGFydCBmdW5jdGlvbnMgZGVwZW5kaW5nDQotZnJvbSB0aGUgZmVhdHVyZSB1c2VkOg0KLSAgICAgICAgICAgKCsrKSBUaW1lIEJhc2UgOiBIQUxfVElNX0Jhc2VfU3RhcnQoKSwgSEFMX1RJTV9CYXNlX1N0YXJ0X0RNQSgpLA0KLUhBTF9USU1fQmFzZV9TdGFydF9JVCgpDQotICAgICAgICAgICAoKyspIElucHV0IENhcHR1cmUgOiAgSEFMX1RJTV9JQ19TdGFydCgpLCBIQUxfVElNX0lDX1N0YXJ0X0RNQSgpLA0KLUhBTF9USU1fSUNfU3RhcnRfSVQoKQ0KLSAgICAgICAgICAgKCsrKSBPdXRwdXQgQ29tcGFyZSA6IEhBTF9USU1fT0NfU3RhcnQoKSwgSEFMX1RJTV9PQ19TdGFydF9ETUEoKSwNCi1IQUxfVElNX09DX1N0YXJ0X0lUKCkNCi0gICAgICAgICAgICgrKykgUFdNIGdlbmVyYXRpb24gOiBIQUxfVElNX1BXTV9TdGFydCgpLCBIQUxfVElNX1BXTV9TdGFydF9ETUEoKSwNCi1IQUxfVElNX1BXTV9TdGFydF9JVCgpDQotICAgICAgICAgICAoKyspIE9uZS1wdWxzZSBtb2RlIG91dHB1dCA6IEhBTF9USU1fT25lUHVsc2VfU3RhcnQoKSwNCi1IQUxfVElNX09uZVB1bHNlX1N0YXJ0X0lUKCkNCi0gICAgICAgICAgICgrKykgRW5jb2RlciBtb2RlIG91dHB1dCA6IEhBTF9USU1fRW5jb2Rlcl9TdGFydCgpLA0KLUhBTF9USU1fRW5jb2Rlcl9TdGFydF9ETUEoKSwgSEFMX1RJTV9FbmNvZGVyX1N0YXJ0X0lUKCkuDQotDQotICAgICAoIykgVGhlIERNQSBCdXJzdCBpcyBtYW5hZ2VkIHdpdGggdGhlIHR3byBmb2xsb3dpbmcgZnVuY3Rpb25zOg0KLSAgICAgICAgIEhBTF9USU1fRE1BQnVyc3RfV3JpdGVTdGFydCgpDQotICAgICAgICAgSEFMX1RJTV9ETUFCdXJzdF9SZWFkU3RhcnQoKQ0KLQ0KLSAgICAqKiogQ2FsbGJhY2sgcmVnaXN0cmF0aW9uICoqKg0KLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotICBbLi5dDQotICBUaGUgY29tcGlsYXRpb24gZGVmaW5lICBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1Mgd2hlbiBzZXQgdG8gMQ0KLSAgYWxsb3dzIHRoZSB1c2VyIHRvIGNvbmZpZ3VyZSBkeW5hbWljYWxseSB0aGUgZHJpdmVyIGNhbGxiYWNrcy4NCi0NCi0gIFsuLl0NCi0gIFVzZSBGdW5jdGlvbiBIQUxfVElNX1JlZ2lzdGVyQ2FsbGJhY2soKSB0byByZWdpc3RlciBhIGNhbGxiYWNrLg0KLSAgSEFMX1RJTV9SZWdpc3RlckNhbGxiYWNrKCkgdGFrZXMgYXMgcGFyYW1ldGVycyB0aGUgSEFMIHBlcmlwaGVyYWwgaGFuZGxlLA0KLSAgdGhlIENhbGxiYWNrIElEIGFuZCBhIHBvaW50ZXIgdG8gdGhlIHVzZXIgY2FsbGJhY2sgZnVuY3Rpb24uDQotDQotICBbLi5dDQotICBVc2UgZnVuY3Rpb24gSEFMX1RJTV9VblJlZ2lzdGVyQ2FsbGJhY2soKSB0byByZXNldCBhIGNhbGxiYWNrIHRvIHRoZSBkZWZhdWx0DQotICB3ZWFrIGZ1bmN0aW9uLg0KLSAgSEFMX1RJTV9VblJlZ2lzdGVyQ2FsbGJhY2sgdGFrZXMgYXMgcGFyYW1ldGVycyB0aGUgSEFMIHBlcmlwaGVyYWwgaGFuZGxlLA0KLSAgYW5kIHRoZSBDYWxsYmFjayBJRC4NCi0NCi0gIFsuLl0NCi0gIFRoZXNlIGZ1bmN0aW9ucyBhbGxvdyB0byByZWdpc3Rlci91bnJlZ2lzdGVyIGZvbGxvd2luZyBjYWxsYmFja3M6DQotICAgICgrKSBCYXNlX01zcEluaXRDYWxsYmFjayAgICAgICAgICAgICAgOiBUSU0gQmFzZSBNc3AgSW5pdCBDYWxsYmFjay4NCi0gICAgKCspIEJhc2VfTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgICAgICA6IFRJTSBCYXNlIE1zcCBEZUluaXQgQ2FsbGJhY2suDQotICAgICgrKSBJQ19Nc3BJbml0Q2FsbGJhY2sgICAgICAgICAgICAgICAgOiBUSU0gSUMgTXNwIEluaXQgQ2FsbGJhY2suDQotICAgICgrKSBJQ19Nc3BEZUluaXRDYWxsYmFjayAgICAgICAgICAgICAgOiBUSU0gSUMgTXNwIERlSW5pdCBDYWxsYmFjay4NCi0gICAgKCspIE9DX01zcEluaXRDYWxsYmFjayAgICAgICAgICAgICAgICA6IFRJTSBPQyBNc3AgSW5pdCBDYWxsYmFjay4NCi0gICAgKCspIE9DX01zcERlSW5pdENhbGxiYWNrICAgICAgICAgICAgICA6IFRJTSBPQyBNc3AgRGVJbml0IENhbGxiYWNrLg0KLSAgICAoKykgUFdNX01zcEluaXRDYWxsYmFjayAgICAgICAgICAgICAgIDogVElNIFBXTSBNc3AgSW5pdCBDYWxsYmFjay4NCi0gICAgKCspIFBXTV9Nc3BEZUluaXRDYWxsYmFjayAgICAgICAgICAgICA6IFRJTSBQV00gTXNwIERlSW5pdCBDYWxsYmFjay4NCi0gICAgKCspIE9uZVB1bHNlX01zcEluaXRDYWxsYmFjayAgICAgICAgICA6IFRJTSBPbmUgUHVsc2UgTXNwIEluaXQgQ2FsbGJhY2suDQotICAgICgrKSBPbmVQdWxzZV9Nc3BEZUluaXRDYWxsYmFjayAgICAgICAgOiBUSU0gT25lIFB1bHNlIE1zcCBEZUluaXQgQ2FsbGJhY2suDQotICAgICgrKSBFbmNvZGVyX01zcEluaXRDYWxsYmFjayAgICAgICAgICAgOiBUSU0gRW5jb2RlciBNc3AgSW5pdCBDYWxsYmFjay4NCi0gICAgKCspIEVuY29kZXJfTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgICA6IFRJTSBFbmNvZGVyIE1zcCBEZUluaXQgQ2FsbGJhY2suDQotICAgICgrKSBIYWxsU2Vuc29yX01zcEluaXRDYWxsYmFjayAgICAgICAgOiBUSU0gSGFsbCBTZW5zb3IgTXNwIEluaXQgQ2FsbGJhY2suDQotICAgICgrKSBIYWxsU2Vuc29yX01zcERlSW5pdENhbGxiYWNrICAgICAgOiBUSU0gSGFsbCBTZW5zb3IgTXNwIERlSW5pdCBDYWxsYmFjay4NCi0gICAgKCspIFBlcmlvZEVsYXBzZWRDYWxsYmFjayAgICAgICAgICAgICA6IFRJTSBQZXJpb2QgRWxhcHNlZCBDYWxsYmFjay4NCi0gICAgKCspIFBlcmlvZEVsYXBzZWRIYWxmQ3BsdENhbGxiYWNrICAgICA6IFRJTSBQZXJpb2QgRWxhcHNlZCBoYWxmIGNvbXBsZXRlDQotQ2FsbGJhY2suDQotICAgICgrKSBUcmlnZ2VyQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgOiBUSU0gVHJpZ2dlciBDYWxsYmFjay4NCi0gICAgKCspIFRyaWdnZXJIYWxmQ3BsdENhbGxiYWNrICAgICAgICAgICA6IFRJTSBUcmlnZ2VyIGhhbGYgY29tcGxldGUgQ2FsbGJhY2suDQotICAgICgrKSBJQ19DYXB0dXJlQ2FsbGJhY2sgICAgICAgICAgICAgICAgOiBUSU0gSW5wdXQgQ2FwdHVyZSBDYWxsYmFjay4NCi0gICAgKCspIElDX0NhcHR1cmVIYWxmQ3BsdENhbGxiYWNrICAgICAgICA6IFRJTSBJbnB1dCBDYXB0dXJlIGhhbGYgY29tcGxldGUNCi1DYWxsYmFjay4NCi0gICAgKCspIE9DX0RlbGF5RWxhcHNlZENhbGxiYWNrICAgICAgICAgICA6IFRJTSBPdXRwdXQgQ29tcGFyZSBEZWxheSBFbGFwc2VkDQotQ2FsbGJhY2suDQotICAgICgrKSBQV01fUHVsc2VGaW5pc2hlZENhbGxiYWNrICAgICAgICAgOiBUSU0gUFdNIFB1bHNlIEZpbmlzaGVkIENhbGxiYWNrLg0KLSAgICAoKykgUFdNX1B1bHNlRmluaXNoZWRIYWxmQ3BsdENhbGxiYWNrIDogVElNIFBXTSBQdWxzZSBGaW5pc2hlZCBoYWxmIGNvbXBsZXRlDQotQ2FsbGJhY2suDQotICAgICgrKSBFcnJvckNhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgOiBUSU0gRXJyb3IgQ2FsbGJhY2suDQotICAgICgrKSBDb21tdXRhdGlvbkNhbGxiYWNrICAgICAgICAgICAgICAgOiBUSU0gQ29tbXV0YXRpb24gQ2FsbGJhY2suDQotICAgICgrKSBDb21tdXRhdGlvbkhhbGZDcGx0Q2FsbGJhY2sgICAgICAgOiBUSU0gQ29tbXV0YXRpb24gaGFsZiBjb21wbGV0ZQ0KLUNhbGxiYWNrLg0KLSAgICAoKykgQnJlYWtDYWxsYmFjayAgICAgICAgICAgICAgICAgICAgIDogVElNIEJyZWFrIENhbGxiYWNrLg0KLSAgICAoKykgQnJlYWsyQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgIDogVElNIEJyZWFrMiBDYWxsYmFjay4NCi0gICAgKCspIEVuY29kZXJJbmRleENhbGxiYWNrICAgICAgICAgICAgICA6IFRJTSBFbmNvZGVyIEluZGV4IENhbGxiYWNrLg0KLSAgICAoKykgRGlyZWN0aW9uQ2hhbmdlQ2FsbGJhY2sgICAgICAgICAgIDogVElNIERpcmVjdGlvbiBDaGFuZ2UgQ2FsbGJhY2sNCi0gICAgKCspIEluZGV4RXJyb3JDYWxsYmFjayAgICAgICAgICAgICAgICA6IFRJTSBJbmRleCBFcnJvciBDYWxsYmFjay4NCi0gICAgKCspIFRyYW5zaXRpb25FcnJvckNhbGxiYWNrICAgICAgICAgICA6IFRJTSBUcmFuc2l0aW9uIEVycm9yIENhbGxiYWNrDQotDQotICBbLi5dDQotQnkgZGVmYXVsdCwgYWZ0ZXIgdGhlIEluaXQgYW5kIHdoZW4gdGhlIHN0YXRlIGlzIEhBTF9USU1fU1RBVEVfUkVTRVQNCi1hbGwgaW50ZXJydXB0IGNhbGxiYWNrcyBhcmUgc2V0IHRvIHRoZSBjb3JyZXNwb25kaW5nIHdlYWsgZnVuY3Rpb25zOg0KLSAgZXhhbXBsZXMgSEFMX1RJTV9UcmlnZ2VyQ2FsbGJhY2soKSwgSEFMX1RJTV9FcnJvckNhbGxiYWNrKCkuDQotDQotICBbLi5dDQotICBFeGNlcHRpb24gZG9uZSBmb3IgTXNwSW5pdCBhbmQgTXNwRGVJbml0IGZ1bmN0aW9ucyB0aGF0IGFyZSByZXNldCB0byB0aGUNCi1sZWdhY3kgd2VhayBmdW5jdGlvbmFsaXRpZXMgaW4gdGhlIEluaXQgLyBEZUluaXQgb25seSB3aGVuIHRoZXNlIGNhbGxiYWNrcyBhcmUNCi1udWxsIChub3QgcmVnaXN0ZXJlZCBiZWZvcmVoYW5kKS4gSWYgbm90LCBNc3BJbml0IG9yIE1zcERlSW5pdCBhcmUgbm90IG51bGwsIHRoZQ0KLUluaXQgLyBEZUluaXQga2VlcCBhbmQgdXNlIHRoZSB1c2VyIE1zcEluaXQgLyBNc3BEZUluaXQgY2FsbGJhY2tzKHJlZ2lzdGVyZWQNCi1iZWZvcmVoYW5kKQ0KLQ0KLSAgWy4uXQ0KLSAgICBDYWxsYmFja3MgY2FuIGJlIHJlZ2lzdGVyZWQgLyB1bnJlZ2lzdGVyZWQgaW4gSEFMX1RJTV9TVEFURV9SRUFEWSBzdGF0ZQ0KLW9ubHkuIEV4Y2VwdGlvbiBkb25lIE1zcEluaXQgLyBNc3BEZUluaXQgdGhhdCBjYW4gYmUgcmVnaXN0ZXJlZCAvIHVucmVnaXN0ZXJlZA0KLSAgICBpbiBIQUxfVElNX1NUQVRFX1JFQURZIG9yIEhBTF9USU1fU1RBVEVfUkVTRVQgc3RhdGUsDQotICAgIHRodXMgcmVnaXN0ZXJlZCh1c2VyKSBNc3BJbml0IC8gRGVJbml0IGNhbGxiYWNrcyBjYW4gYmUgdXNlZCBkdXJpbmcgdGhlIEluaXQNCi0vIERlSW5pdC4gSW4gdGhhdCBjYXNlIGZpcnN0IHJlZ2lzdGVyIHRoZSBNc3BJbml0L01zcERlSW5pdCB1c2VyIGNhbGxiYWNrcyB1c2luZw0KLUhBTF9USU1fUmVnaXN0ZXJDYWxsYmFjaygpIGJlZm9yZSBjYWxsaW5nIERlSW5pdCBvciBJbml0IGZ1bmN0aW9uLg0KLQ0KLSAgWy4uXQ0KLSAgICAgIFdoZW4gVGhlIGNvbXBpbGF0aW9uIGRlZmluZSBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgaXMgc2V0IHRvIDAgb3INCi0gICAgICBub3QgZGVmaW5lZCwgdGhlIGNhbGxiYWNrIHJlZ2lzdHJhdGlvbiBmZWF0dXJlIGlzIG5vdCBhdmFpbGFibGUgYW5kIGFsbA0KLWNhbGxiYWNrcyBhcmUgc2V0IHRvIHRoZSBjb3JyZXNwb25kaW5nIHdlYWsgZnVuY3Rpb25zLg0KLQ0KLSAgQGVuZHZlcmJhdGltDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICovDQotDQotLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaW5jbHVkZSAic3RtMzJnNHh4X2hhbC5oIg0KLQ0KLS8qKiBAYWRkdG9ncm91cCBTVE0zMkc0eHhfSEFMX0RyaXZlcg0KLSAqIEB7DQotICovDQotDQotLyoqIEBkZWZncm91cCBUSU0gVElNDQotICogQGJyaWVmIFRJTSBIQUwgbW9kdWxlIGRyaXZlcg0KLSAqIEB7DQotICovDQotDQotI2lmZGVmIEhBTF9USU1fTU9EVUxFX0VOQUJMRUQNCi0NCi0vKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBhZGR0b2dyb3VwIFRJTV9Qcml2YXRlX0NvbnN0YW50cw0KLSAqIEB7DQotICovDQotI2RlZmluZSBUSU14X0FGMl9PQ1JTRUwgVElNMV9BRjJfT0NSU0VMDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0vKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGFkZHRvZ3JvdXAgVElNX1ByaXZhdGVfRnVuY3Rpb25zDQotICogQHsNCi0gKi8NCi1zdGF0aWMgdm9pZCBUSU1fT0MxX1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgVElNX09DX0luaXRUeXBlRGVmICpPQ19Db25maWcpOw0KLXN0YXRpYyB2b2lkIFRJTV9PQzNfU2V0Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCBUSU1fT0NfSW5pdFR5cGVEZWYgKk9DX0NvbmZpZyk7DQotc3RhdGljIHZvaWQgVElNX09DNF9TZXRDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIFRJTV9PQ19Jbml0VHlwZURlZiAqT0NfQ29uZmlnKTsNCi1zdGF0aWMgdm9pZCBUSU1fT0M1X1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgVElNX09DX0luaXRUeXBlRGVmICpPQ19Db25maWcpOw0KLXN0YXRpYyB2b2lkIFRJTV9PQzZfU2V0Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCBUSU1fT0NfSW5pdFR5cGVEZWYgKk9DX0NvbmZpZyk7DQotc3RhdGljIHZvaWQgVElNX1RJMV9Db25maWdJbnB1dFN0YWdlKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBUSU1fSUNQb2xhcml0eSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVElNX0lDRmlsdGVyKTsNCi1zdGF0aWMgdm9pZCBUSU1fVEkyX1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgVElNX0lDUG9sYXJpdHksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVElNX0lDU2VsZWN0aW9uLCB1aW50MzJfdCBUSU1fSUNGaWx0ZXIpOw0KLXN0YXRpYyB2b2lkIFRJTV9USTJfQ29uZmlnSW5wdXRTdGFnZShUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgVElNX0lDUG9sYXJpdHksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRJTV9JQ0ZpbHRlcik7DQotc3RhdGljIHZvaWQgVElNX1RJM19TZXRDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IFRJTV9JQ1BvbGFyaXR5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRJTV9JQ1NlbGVjdGlvbiwgdWludDMyX3QgVElNX0lDRmlsdGVyKTsNCi1zdGF0aWMgdm9pZCBUSU1fVEk0X1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgVElNX0lDUG9sYXJpdHksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVElNX0lDU2VsZWN0aW9uLCB1aW50MzJfdCBUSU1fSUNGaWx0ZXIpOw0KLXN0YXRpYyB2b2lkIFRJTV9JVFJ4X1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgSW5wdXRUcmlnZ2VyU291cmNlKTsNCi1zdGF0aWMgdm9pZCBUSU1fRE1BUGVyaW9kRWxhcHNlZENwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOw0KLXN0YXRpYyB2b2lkIFRJTV9ETUFQZXJpb2RFbGFwc2VkSGFsZkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOw0KLXN0YXRpYyB2b2lkIFRJTV9ETUFEZWxheVB1bHNlQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7DQotc3RhdGljIHZvaWQgVElNX0RNQVRyaWdnZXJDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsNCi1zdGF0aWMgdm9pZCBUSU1fRE1BVHJpZ2dlckhhbGZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsNCi1zdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgVElNX1NsYXZlVGltZXJfU2V0Q29uZmlnKA0KLSAgICBUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgVElNX1NsYXZlQ29uZmlnVHlwZURlZiAqc1NsYXZlQ29uZmlnKTsNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLS8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotDQotLyoqIEBkZWZncm91cCBUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zIFRJTSBFeHBvcnRlZCBGdW5jdGlvbnMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgVElNIFRpbWUgQmFzZSBmdW5jdGlvbnMNCi0gICogIEBicmllZiAgICBUaW1lIEJhc2UgZnVuY3Rpb25zDQotICAqDQotQHZlcmJhdGltDQotICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgICAgICAgICAgICMjIyMjIFRpbWUgQmFzZSBmdW5jdGlvbnMgIyMjIyMNCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgWy4uXQ0KLSAgICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOg0KLSAgICAoKykgSW5pdGlhbGl6ZSBhbmQgY29uZmlndXJlIHRoZSBUSU0gYmFzZS4NCi0gICAgKCspIERlLWluaXRpYWxpemUgdGhlIFRJTSBiYXNlLg0KLSAgICAoKykgU3RhcnQgdGhlIFRpbWUgQmFzZS4NCi0gICAgKCspIFN0b3AgdGhlIFRpbWUgQmFzZS4NCi0gICAgKCspIFN0YXJ0IHRoZSBUaW1lIEJhc2UgYW5kIGVuYWJsZSBpbnRlcnJ1cHQuDQotICAgICgrKSBTdG9wIHRoZSBUaW1lIEJhc2UgYW5kIGRpc2FibGUgaW50ZXJydXB0Lg0KLSAgICAoKykgU3RhcnQgdGhlIFRpbWUgQmFzZSBhbmQgZW5hYmxlIERNQSB0cmFuc2Zlci4NCi0gICAgKCspIFN0b3AgdGhlIFRpbWUgQmFzZSBhbmQgZGlzYWJsZSBETUEgdHJhbnNmZXIuDQotDQotQGVuZHZlcmJhdGltDQotICAqIEB7DQotICAqLw0KLS8qKg0KLSAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFRJTSBUaW1lIGJhc2UgVW5pdCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZA0KLSAqICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgVElNX0hhbmRsZVR5cGVEZWYgYW5kIGluaXRpYWxpemUgdGhlIGFzc29jaWF0ZWQNCi0gKiBoYW5kbGUuDQotICogQG5vdGUgICBTd2l0Y2hpbmcgZnJvbSBDZW50ZXIgQWxpZ25lZCBjb3VudGVyIG1vZGUgdG8gRWRnZSBjb3VudGVyIG1vZGUgKG9yDQotICogcmV2ZXJzZSkgcmVxdWlyZXMgYSB0aW1lciByZXNldCB0byBhdm9pZCB1bmV4cGVjdGVkIGRpcmVjdGlvbiBkdWUgdG8gRElSIGJpdA0KLSAqIHJlYWRvbmx5IGluIGNlbnRlciBhbGlnbmVkIG1vZGUuIEV4OiBjYWxsIEByZWYgSEFMX1RJTV9CYXNlX0RlSW5pdCgpIGJlZm9yZQ0KLSAqIEhBTF9USU1fQmFzZV9Jbml0KCkNCi0gKiBAcGFyYW0gIGh0aW0gVElNIEJhc2UgaGFuZGxlDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9CYXNlX0luaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pIHsNCi0gIC8qIENoZWNrIHRoZSBUSU0gaGFuZGxlIGFsbG9jYXRpb24gKi8NCi0gIGlmIChodGltID09IE5VTEwpIHsNCi0gICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gIH0NCi0NCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0NPVU5URVJfTU9ERShodGltLT5Jbml0LkNvdW50ZXJNb2RlKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMT0NLRElWSVNJT05fRElWKGh0aW0tPkluaXQuQ2xvY2tEaXZpc2lvbikpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9BVVRPUkVMT0FEX1BSRUxPQUQoaHRpbS0+SW5pdC5BdXRvUmVsb2FkUHJlbG9hZCkpOw0KLQ0KLSAgaWYgKGh0aW0tPlN0YXRlID09IEhBTF9USU1fU1RBVEVfUkVTRVQpIHsNCi0gICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLw0KLSAgICBodGltLT5Mb2NrID0gSEFMX1VOTE9DS0VEOw0KLQ0KLSNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpDQotICAgIC8qIFJlc2V0IGludGVycnVwdCBjYWxsYmFja3MgdG8gbGVnYWN5IHdlYWsgY2FsbGJhY2tzICovDQotICAgIFRJTV9SZXNldENhbGxiYWNrKGh0aW0pOw0KLQ0KLSAgICBpZiAoaHRpbS0+QmFzZV9Nc3BJbml0Q2FsbGJhY2sgPT0gTlVMTCkgew0KLSAgICAgIGh0aW0tPkJhc2VfTXNwSW5pdENhbGxiYWNrID0gSEFMX1RJTV9CYXNlX01zcEluaXQ7DQotICAgIH0NCi0gICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIDogR1BJTywgQ0xPQ0ssIE5WSUMgKi8NCi0gICAgaHRpbS0+QmFzZV9Nc3BJbml0Q2FsbGJhY2soaHRpbSk7DQotI2Vsc2UNCi0gICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIDogR1BJTywgQ0xPQ0ssIE5WSUMgKi8NCi0gICAgSEFMX1RJTV9CYXNlX01zcEluaXQoaHRpbSk7DQotI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLSAgfQ0KLQ0KLSAgLyogU2V0IHRoZSBUSU0gc3RhdGUgKi8NCi0gIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOw0KLQ0KLSAgLyogU2V0IHRoZSBUaW1lIEJhc2UgY29uZmlndXJhdGlvbiAqLw0KLSAgVElNX0Jhc2VfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCAmaHRpbS0+SW5pdCk7DQotDQotICAvKiBJbml0aWFsaXplIHRoZSBETUEgYnVyc3Qgb3BlcmF0aW9uIHN0YXRlICovDQotICBodGltLT5ETUFCdXJzdFN0YXRlID0gSEFMX0RNQV9CVVJTVF9TVEFURV9SRUFEWTsNCi0NCi0gIC8qIEluaXRpYWxpemUgdGhlIFRJTSBjaGFubmVscyBzdGF0ZSAqLw0KLSAgVElNX0NIQU5ORUxfU1RBVEVfU0VUX0FMTChodGltLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOw0KLSAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVRfQUxMKGh0aW0sIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7DQotDQotICAvKiBJbml0aWFsaXplIHRoZSBUSU0gc3RhdGUqLw0KLSAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOw0KLQ0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEZUluaXRpYWxpemVzIHRoZSBUSU0gQmFzZSBwZXJpcGhlcmFsDQotICogQHBhcmFtICBodGltIFRJTSBCYXNlIGhhbmRsZQ0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fQmFzZV9EZUluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pIHsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7DQotDQotICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfQlVTWTsNCi0NCi0gIC8qIERpc2FibGUgdGhlIFRJTSBQZXJpcGhlcmFsIENsb2NrICovDQotICBfX0hBTF9USU1fRElTQUJMRShodGltKTsNCi0NCi0jaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQ0KLSAgaWYgKGh0aW0tPkJhc2VfTXNwRGVJbml0Q2FsbGJhY2sgPT0gTlVMTCkgew0KLSAgICBodGltLT5CYXNlX01zcERlSW5pdENhbGxiYWNrID0gSEFMX1RJTV9CYXNlX01zcERlSW5pdDsNCi0gIH0NCi0gIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovDQotICBodGltLT5CYXNlX01zcERlSW5pdENhbGxiYWNrKGh0aW0pOw0KLSNlbHNlDQotICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZTogR1BJTywgQ0xPQ0ssIE5WSUMgKi8NCi0gIEhBTF9USU1fQmFzZV9Nc3BEZUluaXQoaHRpbSk7DQotI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLQ0KLSAgLyogQ2hhbmdlIHRoZSBETUEgYnVyc3Qgb3BlcmF0aW9uIHN0YXRlICovDQotICBodGltLT5ETUFCdXJzdFN0YXRlID0gSEFMX0RNQV9CVVJTVF9TVEFURV9SRVNFVDsNCi0NCi0gIC8qIENoYW5nZSB0aGUgVElNIGNoYW5uZWxzIHN0YXRlICovDQotICBUSU1fQ0hBTk5FTF9TVEFURV9TRVRfQUxMKGh0aW0sIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRVNFVCk7DQotICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVF9BTEwoaHRpbSwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFU0VUKTsNCi0NCi0gIC8qIENoYW5nZSBUSU0gc3RhdGUgKi8NCi0gIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRVNFVDsNCi0NCi0gIC8qIFJlbGVhc2UgTG9jayAqLw0KLSAgX19IQUxfVU5MT0NLKGh0aW0pOw0KLQ0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgVElNIEJhc2UgTVNQLg0KLSAqIEBwYXJhbSAgaHRpbSBUSU0gQmFzZSBoYW5kbGUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX3dlYWsgdm9pZCBIQUxfVElNX0Jhc2VfTXNwSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkgew0KLSAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLw0KLSAgVU5VU0VEKGh0aW0pOw0KLQ0KLSAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLA0KLSAgICAgICAgICAgIHRoZSBIQUxfVElNX0Jhc2VfTXNwSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlDQotICAgKi8NCi19DQotDQotLyoqDQotICogQGJyaWVmICBEZUluaXRpYWxpemVzIFRJTSBCYXNlIE1TUC4NCi0gKiBAcGFyYW0gIGh0aW0gVElNIEJhc2UgaGFuZGxlDQotICogQHJldHZhbCBOb25lDQotICovDQotX193ZWFrIHZvaWQgSEFMX1RJTV9CYXNlX01zcERlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkgew0KLSAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLw0KLSAgVU5VU0VEKGh0aW0pOw0KLQ0KLSAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLA0KLSAgICAgICAgICAgIHRoZSBIQUxfVElNX0Jhc2VfTXNwRGVJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUNCi0gICAqLw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFN0YXJ0cyB0aGUgVElNIEJhc2UgZ2VuZXJhdGlvbi4NCi0gKiBAcGFyYW0gIGh0aW0gVElNIEJhc2UgaGFuZGxlDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9CYXNlX1N0YXJ0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKSB7DQotICB1aW50MzJfdCB0bXBzbWNyOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsNCi0NCi0gIC8qIENoZWNrIHRoZSBUSU0gc3RhdGUgKi8NCi0gIGlmIChodGltLT5TdGF0ZSAhPSBIQUxfVElNX1NUQVRFX1JFQURZKSB7DQotICAgIHJldHVybiBIQUxfRVJST1I7DQotICB9DQotDQotICAvKiBTZXQgdGhlIFRJTSBzdGF0ZSAqLw0KLSAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7DQotDQotICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwsIGV4Y2VwdCBpbiB0cmlnZ2VyIG1vZGUgd2hlcmUgZW5hYmxlIGlzIGF1dG9tYXRpY2FsbHkNCi0gICAqIGRvbmUgd2l0aCB0cmlnZ2VyICovDQotICBpZiAoSVNfVElNX1NMQVZFX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSkgew0KLSAgICB0bXBzbWNyID0gaHRpbS0+SW5zdGFuY2UtPlNNQ1IgJiBUSU1fU01DUl9TTVM7DQotICAgIGlmICghSVNfVElNX1NMQVZFTU9ERV9UUklHR0VSX0VOQUJMRUQodG1wc21jcikpIHsNCi0gICAgICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOw0KLSAgICB9DQotICB9IGVsc2Ugew0KLSAgICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOw0KLSAgfQ0KLQ0KLSAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLw0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTdG9wcyB0aGUgVElNIEJhc2UgZ2VuZXJhdGlvbi4NCi0gKiBAcGFyYW0gIGh0aW0gVElNIEJhc2UgaGFuZGxlDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9CYXNlX1N0b3AoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pIHsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7DQotDQotICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovDQotICBfX0hBTF9USU1fRElTQUJMRShodGltKTsNCi0NCi0gIC8qIFNldCB0aGUgVElNIHN0YXRlICovDQotICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7DQotDQotICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovDQotICByZXR1cm4gSEFMX09LOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFN0YXJ0cyB0aGUgVElNIEJhc2UgZ2VuZXJhdGlvbiBpbiBpbnRlcnJ1cHQgbW9kZS4NCi0gKiBAcGFyYW0gIGh0aW0gVElNIEJhc2UgaGFuZGxlDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9CYXNlX1N0YXJ0X0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKSB7DQotICB1aW50MzJfdCB0bXBzbWNyOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsNCi0NCi0gIC8qIENoZWNrIHRoZSBUSU0gc3RhdGUgKi8NCi0gIGlmIChodGltLT5TdGF0ZSAhPSBIQUxfVElNX1NUQVRFX1JFQURZKSB7DQotICAgIHJldHVybiBIQUxfRVJST1I7DQotICB9DQotDQotICAvKiBTZXQgdGhlIFRJTSBzdGF0ZSAqLw0KLSAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7DQotDQotICAvKiBFbmFibGUgdGhlIFRJTSBVcGRhdGUgaW50ZXJydXB0ICovDQotICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9VUERBVEUpOw0KLQ0KLSAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsLCBleGNlcHQgaW4gdHJpZ2dlciBtb2RlIHdoZXJlIGVuYWJsZSBpcyBhdXRvbWF0aWNhbGx5DQotICAgKiBkb25lIHdpdGggdHJpZ2dlciAqLw0KLSAgaWYgKElTX1RJTV9TTEFWRV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpIHsNCi0gICAgdG1wc21jciA9IGh0aW0tPkluc3RhbmNlLT5TTUNSICYgVElNX1NNQ1JfU01TOw0KLSAgICBpZiAoIUlTX1RJTV9TTEFWRU1PREVfVFJJR0dFUl9FTkFCTEVEKHRtcHNtY3IpKSB7DQotICAgICAgX19IQUxfVElNX0VOQUJMRShodGltKTsNCi0gICAgfQ0KLSAgfSBlbHNlIHsNCi0gICAgX19IQUxfVElNX0VOQUJMRShodGltKTsNCi0gIH0NCi0NCi0gIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8NCi0gIHJldHVybiBIQUxfT0s7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU3RvcHMgdGhlIFRJTSBCYXNlIGdlbmVyYXRpb24gaW4gaW50ZXJydXB0IG1vZGUuDQotICogQHBhcmFtICBodGltIFRJTSBCYXNlIGhhbmRsZQ0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fQmFzZV9TdG9wX0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKSB7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOw0KLQ0KLSAgLyogRGlzYWJsZSB0aGUgVElNIFVwZGF0ZSBpbnRlcnJ1cHQgKi8NCi0gIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9VUERBVEUpOw0KLQ0KLSAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLw0KLSAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7DQotDQotICAvKiBTZXQgdGhlIFRJTSBzdGF0ZSAqLw0KLSAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOw0KLQ0KLSAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLw0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTdGFydHMgdGhlIFRJTSBCYXNlIGdlbmVyYXRpb24gaW4gRE1BIG1vZGUuDQotICogQHBhcmFtICBodGltIFRJTSBCYXNlIGhhbmRsZQ0KLSAqIEBwYXJhbSAgcERhdGEgVGhlIHNvdXJjZSBCdWZmZXIgYWRkcmVzcy4NCi0gKiBAcGFyYW0gIExlbmd0aCBUaGUgbGVuZ3RoIG9mIGRhdGEgdG8gYmUgdHJhbnNmZXJyZWQgZnJvbSBtZW1vcnkgdG8NCi0gKiBwZXJpcGhlcmFsLg0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fQmFzZV9TdGFydF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcERhdGEsIHVpbnQxNl90IExlbmd0aCkgew0KLSAgdWludDMyX3QgdG1wc21jcjsNCi0NCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0RNQV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOw0KLQ0KLSAgLyogU2V0IHRoZSBUSU0gc3RhdGUgKi8NCi0gIGlmIChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX0JVU1kpIHsNCi0gICAgcmV0dXJuIEhBTF9CVVNZOw0KLSAgfSBlbHNlIGlmIChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX1JFQURZKSB7DQotICAgIGlmICgocERhdGEgPT0gTlVMTCkgJiYgKExlbmd0aCA+IDBVKSkgew0KLSAgICAgIHJldHVybiBIQUxfRVJST1I7DQotICAgIH0gZWxzZSB7DQotICAgICAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7DQotICAgIH0NCi0gIH0gZWxzZSB7DQotICAgIHJldHVybiBIQUxfRVJST1I7DQotICB9DQotDQotICAvKiBTZXQgdGhlIERNQSBQZXJpb2QgZWxhcHNlZCBjYWxsYmFja3MgKi8NCi0gIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9VUERBVEVdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQVBlcmlvZEVsYXBzZWRDcGx0Ow0KLSAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX1VQREFURV0tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0NCi0gICAgICBUSU1fRE1BUGVyaW9kRWxhcHNlZEhhbGZDcGx0Ow0KLQ0KLSAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8NCi0gIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9VUERBVEVdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvcjsNCi0NCi0gIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8NCi0gIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9VUERBVEVdLCAodWludDMyX3QpcERhdGEsDQotICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5BUlIsIExlbmd0aCkgIT0gSEFMX09LKSB7DQotICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8NCi0gICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gIH0NCi0NCi0gIC8qIEVuYWJsZSB0aGUgVElNIFVwZGF0ZSBETUEgcmVxdWVzdCAqLw0KLSAgX19IQUxfVElNX0VOQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9VUERBVEUpOw0KLQ0KLSAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsLCBleGNlcHQgaW4gdHJpZ2dlciBtb2RlIHdoZXJlIGVuYWJsZSBpcyBhdXRvbWF0aWNhbGx5DQotICAgKiBkb25lIHdpdGggdHJpZ2dlciAqLw0KLSAgaWYgKElTX1RJTV9TTEFWRV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpIHsNCi0gICAgdG1wc21jciA9IGh0aW0tPkluc3RhbmNlLT5TTUNSICYgVElNX1NNQ1JfU01TOw0KLSAgICBpZiAoIUlTX1RJTV9TTEFWRU1PREVfVFJJR0dFUl9FTkFCTEVEKHRtcHNtY3IpKSB7DQotICAgICAgX19IQUxfVElNX0VOQUJMRShodGltKTsNCi0gICAgfQ0KLSAgfSBlbHNlIHsNCi0gICAgX19IQUxfVElNX0VOQUJMRShodGltKTsNCi0gIH0NCi0NCi0gIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8NCi0gIHJldHVybiBIQUxfT0s7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU3RvcHMgdGhlIFRJTSBCYXNlIGdlbmVyYXRpb24gaW4gRE1BIG1vZGUuDQotICogQHBhcmFtICBodGltIFRJTSBCYXNlIGhhbmRsZQ0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fQmFzZV9TdG9wX0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkgew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fRE1BX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7DQotDQotICAvKiBEaXNhYmxlIHRoZSBUSU0gVXBkYXRlIERNQSByZXF1ZXN0ICovDQotICBfX0hBTF9USU1fRElTQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9VUERBVEUpOw0KLQ0KLSAgKHZvaWQpSEFMX0RNQV9BYm9ydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfVVBEQVRFXSk7DQotDQotICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovDQotICBfX0hBTF9USU1fRElTQUJMRShodGltKTsNCi0NCi0gIC8qIFNldCB0aGUgVElNIHN0YXRlICovDQotICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7DQotDQotICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovDQotICByZXR1cm4gSEFMX09LOw0KLX0NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgVElNIE91dHB1dCBDb21wYXJlIGZ1bmN0aW9ucw0KLSAgKiAgQGJyaWVmICAgIFRJTSBPdXRwdXQgQ29tcGFyZSBmdW5jdGlvbnMNCi0gICoNCi1AdmVyYmF0aW0NCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICAgICAgICAgICAgICAgICMjIyMjIFRJTSBPdXRwdXQgQ29tcGFyZSBmdW5jdGlvbnMgIyMjIyMNCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgWy4uXQ0KLSAgICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOg0KLSAgICAoKykgSW5pdGlhbGl6ZSBhbmQgY29uZmlndXJlIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUuDQotICAgICgrKSBEZS1pbml0aWFsaXplIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUuDQotICAgICgrKSBTdGFydCB0aGUgVElNIE91dHB1dCBDb21wYXJlLg0KLSAgICAoKykgU3RvcCB0aGUgVElNIE91dHB1dCBDb21wYXJlLg0KLSAgICAoKykgU3RhcnQgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBhbmQgZW5hYmxlIGludGVycnVwdC4NCi0gICAgKCspIFN0b3AgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBhbmQgZGlzYWJsZSBpbnRlcnJ1cHQuDQotICAgICgrKSBTdGFydCB0aGUgVElNIE91dHB1dCBDb21wYXJlIGFuZCBlbmFibGUgRE1BIHRyYW5zZmVyLg0KLSAgICAoKykgU3RvcCB0aGUgVElNIE91dHB1dCBDb21wYXJlIGFuZCBkaXNhYmxlIERNQSB0cmFuc2Zlci4NCi0NCi1AZW5kdmVyYmF0aW0NCi0gICogQHsNCi0gICovDQotLyoqDQotICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgVElNIE91dHB1dCBDb21wYXJlIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkDQotICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBUSU1fSGFuZGxlVHlwZURlZiBhbmQgaW5pdGlhbGl6ZXMgdGhlIGFzc29jaWF0ZWQNCi0gKiBoYW5kbGUuDQotICogQG5vdGUgICBTd2l0Y2hpbmcgZnJvbSBDZW50ZXIgQWxpZ25lZCBjb3VudGVyIG1vZGUgdG8gRWRnZSBjb3VudGVyIG1vZGUgKG9yDQotICogcmV2ZXJzZSkgcmVxdWlyZXMgYSB0aW1lciByZXNldCB0byBhdm9pZCB1bmV4cGVjdGVkIGRpcmVjdGlvbiBkdWUgdG8gRElSIGJpdA0KLSAqIHJlYWRvbmx5IGluIGNlbnRlciBhbGlnbmVkIG1vZGUuIEV4OiBjYWxsIEByZWYgSEFMX1RJTV9PQ19EZUluaXQoKSBiZWZvcmUNCi0gKiBIQUxfVElNX09DX0luaXQoKQ0KLSAqIEBwYXJhbSAgaHRpbSBUSU0gT3V0cHV0IENvbXBhcmUgaGFuZGxlDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PQ19Jbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKSB7DQotICAvKiBDaGVjayB0aGUgVElNIGhhbmRsZSBhbGxvY2F0aW9uICovDQotICBpZiAoaHRpbSA9PSBOVUxMKSB7DQotICAgIHJldHVybiBIQUxfRVJST1I7DQotICB9DQotDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DT1VOVEVSX01PREUoaHRpbS0+SW5pdC5Db3VudGVyTW9kZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTE9DS0RJVklTSU9OX0RJVihodGltLT5Jbml0LkNsb2NrRGl2aXNpb24pKTsNCi0gIGFzc2VydF9wYXJhbShJU19USU1fQVVUT1JFTE9BRF9QUkVMT0FEKGh0aW0tPkluaXQuQXV0b1JlbG9hZFByZWxvYWQpKTsNCi0NCi0gIGlmIChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX1JFU0VUKSB7DQotICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8NCi0gICAgaHRpbS0+TG9jayA9IEhBTF9VTkxPQ0tFRDsNCi0NCi0jaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQ0KLSAgICAvKiBSZXNldCBpbnRlcnJ1cHQgY2FsbGJhY2tzIHRvIGxlZ2FjeSB3ZWFrIGNhbGxiYWNrcyAqLw0KLSAgICBUSU1fUmVzZXRDYWxsYmFjayhodGltKTsNCi0NCi0gICAgaWYgKGh0aW0tPk9DX01zcEluaXRDYWxsYmFjayA9PSBOVUxMKSB7DQotICAgICAgaHRpbS0+T0NfTXNwSW5pdENhbGxiYWNrID0gSEFMX1RJTV9PQ19Nc3BJbml0Ow0KLSAgICB9DQotICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLLCBOVklDICovDQotICAgIGh0aW0tPk9DX01zcEluaXRDYWxsYmFjayhodGltKTsNCi0jZWxzZQ0KLSAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgOiBHUElPLCBDTE9DSywgTlZJQyBhbmQgRE1BICovDQotICAgIEhBTF9USU1fT0NfTXNwSW5pdChodGltKTsNCi0jZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotICB9DQotDQotICAvKiBTZXQgdGhlIFRJTSBzdGF0ZSAqLw0KLSAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7DQotDQotICAvKiBJbml0IHRoZSBiYXNlIHRpbWUgZm9yIHRoZSBPdXRwdXQgQ29tcGFyZSAqLw0KLSAgVElNX0Jhc2VfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCAmaHRpbS0+SW5pdCk7DQotDQotICAvKiBJbml0aWFsaXplIHRoZSBETUEgYnVyc3Qgb3BlcmF0aW9uIHN0YXRlICovDQotICBodGltLT5ETUFCdXJzdFN0YXRlID0gSEFMX0RNQV9CVVJTVF9TVEFURV9SRUFEWTsNCi0NCi0gIC8qIEluaXRpYWxpemUgdGhlIFRJTSBjaGFubmVscyBzdGF0ZSAqLw0KLSAgVElNX0NIQU5ORUxfU1RBVEVfU0VUX0FMTChodGltLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOw0KLSAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVRfQUxMKGh0aW0sIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7DQotDQotICAvKiBJbml0aWFsaXplIHRoZSBUSU0gc3RhdGUqLw0KLSAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOw0KLQ0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEZUluaXRpYWxpemVzIHRoZSBUSU0gcGVyaXBoZXJhbA0KLSAqIEBwYXJhbSAgaHRpbSBUSU0gT3V0cHV0IENvbXBhcmUgaGFuZGxlDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PQ19EZUluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pIHsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7DQotDQotICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfQlVTWTsNCi0NCi0gIC8qIERpc2FibGUgdGhlIFRJTSBQZXJpcGhlcmFsIENsb2NrICovDQotICBfX0hBTF9USU1fRElTQUJMRShodGltKTsNCi0NCi0jaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQ0KLSAgaWYgKGh0aW0tPk9DX01zcERlSW5pdENhbGxiYWNrID09IE5VTEwpIHsNCi0gICAgaHRpbS0+T0NfTXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfVElNX09DX01zcERlSW5pdDsNCi0gIH0NCi0gIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovDQotICBodGltLT5PQ19Nc3BEZUluaXRDYWxsYmFjayhodGltKTsNCi0jZWxzZQ0KLSAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmU6IEdQSU8sIENMT0NLLCBOVklDIGFuZCBETUEgKi8NCi0gIEhBTF9USU1fT0NfTXNwRGVJbml0KGh0aW0pOw0KLSNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi0NCi0gIC8qIENoYW5nZSB0aGUgRE1BIGJ1cnN0IG9wZXJhdGlvbiBzdGF0ZSAqLw0KLSAgaHRpbS0+RE1BQnVyc3RTdGF0ZSA9IEhBTF9ETUFfQlVSU1RfU1RBVEVfUkVTRVQ7DQotDQotICAvKiBDaGFuZ2UgdGhlIFRJTSBjaGFubmVscyBzdGF0ZSAqLw0KLSAgVElNX0NIQU5ORUxfU1RBVEVfU0VUX0FMTChodGltLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVTRVQpOw0KLSAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVRfQUxMKGh0aW0sIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRVNFVCk7DQotDQotICAvKiBDaGFuZ2UgVElNIHN0YXRlICovDQotICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVTRVQ7DQotDQotICAvKiBSZWxlYXNlIExvY2sgKi8NCi0gIF9fSEFMX1VOTE9DSyhodGltKTsNCi0NCi0gIHJldHVybiBIQUxfT0s7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBNU1AuDQotICogQHBhcmFtICBodGltIFRJTSBPdXRwdXQgQ29tcGFyZSBoYW5kbGUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX3dlYWsgdm9pZCBIQUxfVElNX09DX01zcEluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pIHsNCi0gIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8NCi0gIFVOVVNFRChodGltKTsNCi0NCi0gIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwNCi0gICAgICAgICAgICB0aGUgSEFMX1RJTV9PQ19Nc3BJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUNCi0gICAqLw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERlSW5pdGlhbGl6ZXMgVElNIE91dHB1dCBDb21wYXJlIE1TUC4NCi0gKiBAcGFyYW0gIGh0aW0gVElNIE91dHB1dCBDb21wYXJlIGhhbmRsZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fd2VhayB2b2lkIEhBTF9USU1fT0NfTXNwRGVJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKSB7DQotICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovDQotICBVTlVTRUQoaHRpbSk7DQotDQotICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsDQotICAgICAgICAgICAgdGhlIEhBTF9USU1fT0NfTXNwRGVJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUNCi0gICAqLw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFN0YXJ0cyB0aGUgVElNIE91dHB1dCBDb21wYXJlIHNpZ25hbCBnZW5lcmF0aW9uLg0KLSAqIEBwYXJhbSAgaHRpbSBUSU0gT3V0cHV0IENvbXBhcmUgaGFuZGxlDQotICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVsIHRvIGJlIGVuYWJsZWQNCi0gKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzU6IFRJTSBDaGFubmVsIDUgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNjogVElNIENoYW5uZWwgNiBzZWxlY3RlZA0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT0NfU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpIHsNCi0gIHVpbnQzMl90IHRtcHNtY3I7DQotDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsNCi0NCi0gIC8qIENoZWNrIHRoZSBUSU0gY2hhbm5lbCBzdGF0ZSAqLw0KLSAgaWYgKFRJTV9DSEFOTkVMX1NUQVRFX0dFVChodGltLCBDaGFubmVsKSAhPSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpIHsNCi0gICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gIH0NCi0NCi0gIC8qIFNldCB0aGUgVElNIGNoYW5uZWwgc3RhdGUgKi8NCi0gIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBDaGFubmVsLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSk7DQotDQotICAvKiBFbmFibGUgdGhlIE91dHB1dCBjb21wYXJlIGNoYW5uZWwgKi8NCi0gIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4X0VOQUJMRSk7DQotDQotICBpZiAoSVNfVElNX0JSRUFLX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSAhPSBSRVNFVCkgew0KLSAgICAvKiBFbmFibGUgdGhlIG1haW4gb3V0cHV0ICovDQotICAgIF9fSEFMX1RJTV9NT0VfRU5BQkxFKGh0aW0pOw0KLSAgfQ0KLQ0KLSAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsLCBleGNlcHQgaW4gdHJpZ2dlciBtb2RlIHdoZXJlIGVuYWJsZSBpcyBhdXRvbWF0aWNhbGx5DQotICAgKiBkb25lIHdpdGggdHJpZ2dlciAqLw0KLSAgaWYgKElTX1RJTV9TTEFWRV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpIHsNCi0gICAgdG1wc21jciA9IGh0aW0tPkluc3RhbmNlLT5TTUNSICYgVElNX1NNQ1JfU01TOw0KLSAgICBpZiAoIUlTX1RJTV9TTEFWRU1PREVfVFJJR0dFUl9FTkFCTEVEKHRtcHNtY3IpKSB7DQotICAgICAgX19IQUxfVElNX0VOQUJMRShodGltKTsNCi0gICAgfQ0KLSAgfSBlbHNlIHsNCi0gICAgX19IQUxfVElNX0VOQUJMRShodGltKTsNCi0gIH0NCi0NCi0gIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8NCi0gIHJldHVybiBIQUxfT0s7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU3RvcHMgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBzaWduYWwgZ2VuZXJhdGlvbi4NCi0gKiBAcGFyYW0gIGh0aW0gVElNIE91dHB1dCBDb21wYXJlIGhhbmRsZQ0KLSAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbCB0byBiZSBkaXNhYmxlZA0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNTogVElNIENoYW5uZWwgNSBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF82OiBUSU0gQ2hhbm5lbCA2IHNlbGVjdGVkDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PQ19TdG9wKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKSB7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsNCi0NCi0gIC8qIERpc2FibGUgdGhlIE91dHB1dCBjb21wYXJlIGNoYW5uZWwgKi8NCi0gIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4X0RJU0FCTEUpOw0KLQ0KLSAgaWYgKElTX1RJTV9CUkVBS19JTlNUQU5DRShodGltLT5JbnN0YW5jZSkgIT0gUkVTRVQpIHsNCi0gICAgLyogRGlzYWJsZSB0aGUgTWFpbiBPdXRwdXQgKi8NCi0gICAgX19IQUxfVElNX01PRV9ESVNBQkxFKGh0aW0pOw0KLSAgfQ0KLQ0KLSAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLw0KLSAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7DQotDQotICAvKiBTZXQgdGhlIFRJTSBjaGFubmVsIHN0YXRlICovDQotICBUSU1fQ0hBTk5FTF9TVEFURV9TRVQoaHRpbSwgQ2hhbm5lbCwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsNCi0NCi0gIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8NCi0gIHJldHVybiBIQUxfT0s7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU3RhcnRzIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgc2lnbmFsIGdlbmVyYXRpb24gaW4gaW50ZXJydXB0IG1vZGUuDQotICogQHBhcmFtICBodGltIFRJTSBPdXRwdXQgQ29tcGFyZSBoYW5kbGUNCi0gKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWwgdG8gYmUgZW5hYmxlZA0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09DX1N0YXJ0X0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCkgew0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOw0KLSAgdWludDMyX3QgdG1wc21jcjsNCi0NCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIFRJTSBjaGFubmVsIHN0YXRlICovDQotICBpZiAoVElNX0NIQU5ORUxfU1RBVEVfR0VUKGh0aW0sIENoYW5uZWwpICE9IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSkgew0KLSAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgfQ0KLQ0KLSAgLyogU2V0IHRoZSBUSU0gY2hhbm5lbCBzdGF0ZSAqLw0KLSAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIENoYW5uZWwsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKTsNCi0NCi0gIHN3aXRjaCAoQ2hhbm5lbCkgew0KLSAgICBjYXNlIFRJTV9DSEFOTkVMXzE6IHsNCi0gICAgICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMSBpbnRlcnJ1cHQgKi8NCi0gICAgICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzEpOw0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotDQotICAgIGNhc2UgVElNX0NIQU5ORUxfMjogew0KLSAgICAgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAyIGludGVycnVwdCAqLw0KLSAgICAgIF9fSEFMX1RJTV9FTkFCTEVfSVQoaHRpbSwgVElNX0lUX0NDMik7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0NCi0gICAgY2FzZSBUSU1fQ0hBTk5FTF8zOiB7DQotICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDMgaW50ZXJydXB0ICovDQotICAgICAgX19IQUxfVElNX0VOQUJMRV9JVChodGltLCBUSU1fSVRfQ0MzKTsNCi0gICAgICBicmVhazsNCi0gICAgfQ0KLQ0KLSAgICBjYXNlIFRJTV9DSEFOTkVMXzQ6IHsNCi0gICAgICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgNCBpbnRlcnJ1cHQgKi8NCi0gICAgICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzQpOw0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotDQotICAgIGRlZmF1bHQ6DQotICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOw0KLSAgICAgIGJyZWFrOw0KLSAgfQ0KLQ0KLSAgaWYgKHN0YXR1cyA9PSBIQUxfT0spIHsNCi0gICAgLyogRW5hYmxlIHRoZSBPdXRwdXQgY29tcGFyZSBjaGFubmVsICovDQotICAgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4X0VOQUJMRSk7DQotDQotICAgIGlmIChJU19USU1fQlJFQUtfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpICE9IFJFU0VUKSB7DQotICAgICAgLyogRW5hYmxlIHRoZSBtYWluIG91dHB1dCAqLw0KLSAgICAgIF9fSEFMX1RJTV9NT0VfRU5BQkxFKGh0aW0pOw0KLSAgICB9DQotDQotICAgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCwgZXhjZXB0IGluIHRyaWdnZXIgbW9kZSB3aGVyZSBlbmFibGUgaXMNCi0gICAgICogYXV0b21hdGljYWxseSBkb25lIHdpdGggdHJpZ2dlciAqLw0KLSAgICBpZiAoSVNfVElNX1NMQVZFX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSkgew0KLSAgICAgIHRtcHNtY3IgPSBodGltLT5JbnN0YW5jZS0+U01DUiAmIFRJTV9TTUNSX1NNUzsNCi0gICAgICBpZiAoIUlTX1RJTV9TTEFWRU1PREVfVFJJR0dFUl9FTkFCTEVEKHRtcHNtY3IpKSB7DQotICAgICAgICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOw0KLSAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOw0KLSAgICB9DQotICB9DQotDQotICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovDQotICByZXR1cm4gc3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFN0b3BzIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgc2lnbmFsIGdlbmVyYXRpb24gaW4gaW50ZXJydXB0IG1vZGUuDQotICogQHBhcmFtICBodGltIFRJTSBPdXRwdXQgQ29tcGFyZSBoYW5kbGUNCi0gKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWwgdG8gYmUgZGlzYWJsZWQNCi0gKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PQ19TdG9wX0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKSB7DQotICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7DQotDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsNCi0NCi0gIHN3aXRjaCAoQ2hhbm5lbCkgew0KLSAgICBjYXNlIFRJTV9DSEFOTkVMXzE6IHsNCi0gICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDEgaW50ZXJydXB0ICovDQotICAgICAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDMSk7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0NCi0gICAgY2FzZSBUSU1fQ0hBTk5FTF8yOiB7DQotICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAyIGludGVycnVwdCAqLw0KLSAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzIpOw0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotDQotICAgIGNhc2UgVElNX0NIQU5ORUxfMzogew0KLSAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMyBpbnRlcnJ1cHQgKi8NCi0gICAgICBfX0hBTF9USU1fRElTQUJMRV9JVChodGltLCBUSU1fSVRfQ0MzKTsNCi0gICAgICBicmVhazsNCi0gICAgfQ0KLQ0KLSAgICBjYXNlIFRJTV9DSEFOTkVMXzQ6IHsNCi0gICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDQgaW50ZXJydXB0ICovDQotICAgICAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDNCk7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0NCi0gICAgZGVmYXVsdDoNCi0gICAgICBzdGF0dXMgPSBIQUxfRVJST1I7DQotICAgICAgYnJlYWs7DQotICB9DQotDQotICBpZiAoc3RhdHVzID09IEhBTF9PSykgew0KLSAgICAvKiBEaXNhYmxlIHRoZSBPdXRwdXQgY29tcGFyZSBjaGFubmVsICovDQotICAgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4X0RJU0FCTEUpOw0KLQ0KLSAgICBpZiAoSVNfVElNX0JSRUFLX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSAhPSBSRVNFVCkgew0KLSAgICAgIC8qIERpc2FibGUgdGhlIE1haW4gT3V0cHV0ICovDQotICAgICAgX19IQUxfVElNX01PRV9ESVNBQkxFKGh0aW0pOw0KLSAgICB9DQotDQotICAgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8NCi0gICAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7DQotDQotICAgIC8qIFNldCB0aGUgVElNIGNoYW5uZWwgc3RhdGUgKi8NCi0gICAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIENoYW5uZWwsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7DQotICB9DQotDQotICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovDQotICByZXR1cm4gc3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFN0YXJ0cyB0aGUgVElNIE91dHB1dCBDb21wYXJlIHNpZ25hbCBnZW5lcmF0aW9uIGluIERNQSBtb2RlLg0KLSAqIEBwYXJhbSAgaHRpbSBUSU0gT3V0cHV0IENvbXBhcmUgaGFuZGxlDQotICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVsIHRvIGJlIGVuYWJsZWQNCi0gKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkDQotICogQHBhcmFtICBwRGF0YSBUaGUgc291cmNlIEJ1ZmZlciBhZGRyZXNzLg0KLSAqIEBwYXJhbSAgTGVuZ3RoIFRoZSBsZW5ndGggb2YgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZCBmcm9tIG1lbW9yeSB0byBUSU0NCi0gKiBwZXJpcGhlcmFsDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PQ19TdGFydF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgKnBEYXRhLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IExlbmd0aCkgew0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOw0KLSAgdWludDMyX3QgdG1wc21jcjsNCi0NCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOw0KLQ0KLSAgLyogU2V0IHRoZSBUSU0gY2hhbm5lbCBzdGF0ZSAqLw0KLSAgaWYgKFRJTV9DSEFOTkVMX1NUQVRFX0dFVChodGltLCBDaGFubmVsKSA9PSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSkgew0KLSAgICByZXR1cm4gSEFMX0JVU1k7DQotICB9IGVsc2UgaWYgKFRJTV9DSEFOTkVMX1NUQVRFX0dFVChodGltLCBDaGFubmVsKSA9PQ0KLSAgICAgICAgICAgICBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpIHsNCi0gICAgaWYgKChwRGF0YSA9PSBOVUxMKSAmJiAoTGVuZ3RoID4gMFUpKSB7DQotICAgICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gICAgfSBlbHNlIHsNCi0gICAgICBUSU1fQ0hBTk5FTF9TVEFURV9TRVQoaHRpbSwgQ2hhbm5lbCwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX0JVU1kpOw0KLSAgICB9DQotICB9IGVsc2Ugew0KLSAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgfQ0KLQ0KLSAgc3dpdGNoIChDaGFubmVsKSB7DQotICAgIGNhc2UgVElNX0NIQU5ORUxfMTogew0KLSAgICAgIC8qIFNldCB0aGUgRE1BIGNvbXBhcmUgY2FsbGJhY2tzICovDQotICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BRGVsYXlQdWxzZUNwbHQ7DQotICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0NCi0gICAgICAgICAgVElNX0RNQURlbGF5UHVsc2VIYWxmQ3BsdDsNCi0NCi0gICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLw0KLSAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvcjsNCi0NCi0gICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovDQotICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0sICh1aW50MzJfdClwRGF0YSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5DQ1IxLCBMZW5ndGgpICE9IEhBTF9PSykgew0KLSAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLw0KLSAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gICAgICB9DQotDQotICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDEgRE1BIHJlcXVlc3QgKi8NCi0gICAgICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMSk7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0NCi0gICAgY2FzZSBUSU1fQ0hBTk5FTF8yOiB7DQotICAgICAgLyogU2V0IHRoZSBETUEgY29tcGFyZSBjYWxsYmFja3MgKi8NCi0gICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFEZWxheVB1bHNlQ3BsdDsNCi0gICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPQ0KLSAgICAgICAgICBUSU1fRE1BRGVsYXlQdWxzZUhhbGZDcGx0Ow0KLQ0KLSAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovDQotICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yOw0KLQ0KLSAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8NCi0gICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXSwgKHVpbnQzMl90KXBEYXRhLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkNDUjIsIExlbmd0aCkgIT0gSEFMX09LKSB7DQotICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovDQotICAgICAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgICAgIH0NCi0NCi0gICAgICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMiBETUEgcmVxdWVzdCAqLw0KLSAgICAgIF9fSEFMX1RJTV9FTkFCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MyKTsNCi0gICAgICBicmVhazsNCi0gICAgfQ0KLQ0KLSAgICBjYXNlIFRJTV9DSEFOTkVMXzM6IHsNCi0gICAgICAvKiBTZXQgdGhlIERNQSBjb21wYXJlIGNhbGxiYWNrcyAqLw0KLSAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQURlbGF5UHVsc2VDcGx0Ow0KLSAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9DQotICAgICAgICAgIFRJTV9ETUFEZWxheVB1bHNlSGFsZkNwbHQ7DQotDQotICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8NCi0gICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3I7DQotDQotICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLw0KLSAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdLCAodWludDMyX3QpcERhdGEsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+Q0NSMywgTGVuZ3RoKSAhPSBIQUxfT0spIHsNCi0gICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8NCi0gICAgICAgIHJldHVybiBIQUxfRVJST1I7DQotICAgICAgfQ0KLSAgICAgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAzIERNQSByZXF1ZXN0ICovDQotICAgICAgX19IQUxfVElNX0VOQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzMpOw0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotDQotICAgIGNhc2UgVElNX0NIQU5ORUxfNDogew0KLSAgICAgIC8qIFNldCB0aGUgRE1BIGNvbXBhcmUgY2FsbGJhY2tzICovDQotICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDNF0tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BRGVsYXlQdWxzZUNwbHQ7DQotICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDNF0tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0NCi0gICAgICAgICAgVElNX0RNQURlbGF5UHVsc2VIYWxmQ3BsdDsNCi0NCi0gICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLw0KLSAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvcjsNCi0NCi0gICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovDQotICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDNF0sICh1aW50MzJfdClwRGF0YSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5DQ1I0LCBMZW5ndGgpICE9IEhBTF9PSykgew0KLSAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLw0KLSAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gICAgICB9DQotICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDQgRE1BIHJlcXVlc3QgKi8NCi0gICAgICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBUSU1fRE1BX0NDNCk7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0NCi0gICAgZGVmYXVsdDoNCi0gICAgICBzdGF0dXMgPSBIQUxfRVJST1I7DQotICAgICAgYnJlYWs7DQotICB9DQotDQotICBpZiAoc3RhdHVzID09IEhBTF9PSykgew0KLSAgICAvKiBFbmFibGUgdGhlIE91dHB1dCBjb21wYXJlIGNoYW5uZWwgKi8NCi0gICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hfRU5BQkxFKTsNCi0NCi0gICAgaWYgKElTX1RJTV9CUkVBS19JTlNUQU5DRShodGltLT5JbnN0YW5jZSkgIT0gUkVTRVQpIHsNCi0gICAgICAvKiBFbmFibGUgdGhlIG1haW4gb3V0cHV0ICovDQotICAgICAgX19IQUxfVElNX01PRV9FTkFCTEUoaHRpbSk7DQotICAgIH0NCi0NCi0gICAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsLCBleGNlcHQgaW4gdHJpZ2dlciBtb2RlIHdoZXJlIGVuYWJsZSBpcw0KLSAgICAgKiBhdXRvbWF0aWNhbGx5IGRvbmUgd2l0aCB0cmlnZ2VyICovDQotICAgIGlmIChJU19USU1fU0xBVkVfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKSB7DQotICAgICAgdG1wc21jciA9IGh0aW0tPkluc3RhbmNlLT5TTUNSICYgVElNX1NNQ1JfU01TOw0KLSAgICAgIGlmICghSVNfVElNX1NMQVZFTU9ERV9UUklHR0VSX0VOQUJMRUQodG1wc21jcikpIHsNCi0gICAgICAgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7DQotICAgICAgfQ0KLSAgICB9IGVsc2Ugew0KLSAgICAgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7DQotICAgIH0NCi0gIH0NCi0NCi0gIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8NCi0gIHJldHVybiBzdGF0dXM7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU3RvcHMgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBzaWduYWwgZ2VuZXJhdGlvbiBpbiBETUEgbW9kZS4NCi0gKiBAcGFyYW0gIGh0aW0gVElNIE91dHB1dCBDb21wYXJlIGhhbmRsZQ0KLSAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbCB0byBiZSBkaXNhYmxlZA0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09DX1N0b3BfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCkgew0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fQ0NYX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7DQotDQotICBzd2l0Y2ggKENoYW5uZWwpIHsNCi0gICAgY2FzZSBUSU1fQ0hBTk5FTF8xOiB7DQotICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAxIERNQSByZXF1ZXN0ICovDQotICAgICAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MxKTsNCi0gICAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdKTsNCi0gICAgICBicmVhazsNCi0gICAgfQ0KLQ0KLSAgICBjYXNlIFRJTV9DSEFOTkVMXzI6IHsNCi0gICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDIgRE1BIHJlcXVlc3QgKi8NCi0gICAgICBfX0hBTF9USU1fRElTQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzIpOw0KLSAgICAgICh2b2lkKUhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0pOw0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotDQotICAgIGNhc2UgVElNX0NIQU5ORUxfMzogew0KLSAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMyBETUEgcmVxdWVzdCAqLw0KLSAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMyk7DQotICAgICAgKHZvaWQpSEFMX0RNQV9BYm9ydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXSk7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0NCi0gICAgY2FzZSBUSU1fQ0hBTk5FTF80OiB7DQotICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSA0IGludGVycnVwdCAqLw0KLSAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBUSU1fRE1BX0NDNCk7DQotICAgICAgKHZvaWQpSEFMX0RNQV9BYm9ydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XSk7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0NCi0gICAgZGVmYXVsdDoNCi0gICAgICBzdGF0dXMgPSBIQUxfRVJST1I7DQotICAgICAgYnJlYWs7DQotICB9DQotDQotICBpZiAoc3RhdHVzID09IEhBTF9PSykgew0KLSAgICAvKiBEaXNhYmxlIHRoZSBPdXRwdXQgY29tcGFyZSBjaGFubmVsICovDQotICAgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4X0RJU0FCTEUpOw0KLQ0KLSAgICBpZiAoSVNfVElNX0JSRUFLX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSAhPSBSRVNFVCkgew0KLSAgICAgIC8qIERpc2FibGUgdGhlIE1haW4gT3V0cHV0ICovDQotICAgICAgX19IQUxfVElNX01PRV9ESVNBQkxFKGh0aW0pOw0KLSAgICB9DQotDQotICAgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8NCi0gICAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7DQotDQotICAgIC8qIFNldCB0aGUgVElNIGNoYW5uZWwgc3RhdGUgKi8NCi0gICAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIENoYW5uZWwsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7DQotICB9DQotDQotICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovDQotICByZXR1cm4gc3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgVElNIFBXTSBmdW5jdGlvbnMNCi0gICogIEBicmllZiAgICBUSU0gUFdNIGZ1bmN0aW9ucw0KLSAgKg0KLUB2ZXJiYXRpbQ0KLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBUSU0gUFdNIGZ1bmN0aW9ucyAjIyMjIw0KLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICBbLi5dDQotICAgIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86DQotICAgICgrKSBJbml0aWFsaXplIGFuZCBjb25maWd1cmUgdGhlIFRJTSBQV00uDQotICAgICgrKSBEZS1pbml0aWFsaXplIHRoZSBUSU0gUFdNLg0KLSAgICAoKykgU3RhcnQgdGhlIFRJTSBQV00uDQotICAgICgrKSBTdG9wIHRoZSBUSU0gUFdNLg0KLSAgICAoKykgU3RhcnQgdGhlIFRJTSBQV00gYW5kIGVuYWJsZSBpbnRlcnJ1cHQuDQotICAgICgrKSBTdG9wIHRoZSBUSU0gUFdNIGFuZCBkaXNhYmxlIGludGVycnVwdC4NCi0gICAgKCspIFN0YXJ0IHRoZSBUSU0gUFdNIGFuZCBlbmFibGUgRE1BIHRyYW5zZmVyLg0KLSAgICAoKykgU3RvcCB0aGUgVElNIFBXTSBhbmQgZGlzYWJsZSBETUEgdHJhbnNmZXIuDQotDQotQGVuZHZlcmJhdGltDQotICAqIEB7DQotICAqLw0KLS8qKg0KLSAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFRJTSBQV00gVGltZSBCYXNlIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkDQotICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBUSU1fSGFuZGxlVHlwZURlZiBhbmQgaW5pdGlhbGl6ZXMgdGhlIGFzc29jaWF0ZWQNCi0gKiBoYW5kbGUuDQotICogQG5vdGUgICBTd2l0Y2hpbmcgZnJvbSBDZW50ZXIgQWxpZ25lZCBjb3VudGVyIG1vZGUgdG8gRWRnZSBjb3VudGVyIG1vZGUgKG9yDQotICogcmV2ZXJzZSkgcmVxdWlyZXMgYSB0aW1lciByZXNldCB0byBhdm9pZCB1bmV4cGVjdGVkIGRpcmVjdGlvbiBkdWUgdG8gRElSIGJpdA0KLSAqIHJlYWRvbmx5IGluIGNlbnRlciBhbGlnbmVkIG1vZGUuIEV4OiBjYWxsIEByZWYgSEFMX1RJTV9QV01fRGVJbml0KCkgYmVmb3JlDQotICogSEFMX1RJTV9QV01fSW5pdCgpDQotICogQHBhcmFtICBodGltIFRJTSBQV00gaGFuZGxlDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9QV01fSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkgew0KLSAgLyogQ2hlY2sgdGhlIFRJTSBoYW5kbGUgYWxsb2NhdGlvbiAqLw0KLSAgaWYgKGh0aW0gPT0gTlVMTCkgew0KLSAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgfQ0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsNCi0gIGFzc2VydF9wYXJhbShJU19USU1fQ09VTlRFUl9NT0RFKGh0aW0tPkluaXQuQ291bnRlck1vZGUpKTsNCi0gIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tESVZJU0lPTl9ESVYoaHRpbS0+SW5pdC5DbG9ja0RpdmlzaW9uKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0FVVE9SRUxPQURfUFJFTE9BRChodGltLT5Jbml0LkF1dG9SZWxvYWRQcmVsb2FkKSk7DQotDQotICBpZiAoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9SRVNFVCkgew0KLSAgICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovDQotICAgIGh0aW0tPkxvY2sgPSBIQUxfVU5MT0NLRUQ7DQotDQotI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkNCi0gICAgLyogUmVzZXQgaW50ZXJydXB0IGNhbGxiYWNrcyB0byBsZWdhY3kgd2VhayBjYWxsYmFja3MgKi8NCi0gICAgVElNX1Jlc2V0Q2FsbGJhY2soaHRpbSk7DQotDQotICAgIGlmIChodGltLT5QV01fTXNwSW5pdENhbGxiYWNrID09IE5VTEwpIHsNCi0gICAgICBodGltLT5QV01fTXNwSW5pdENhbGxiYWNrID0gSEFMX1RJTV9QV01fTXNwSW5pdDsNCi0gICAgfQ0KLSAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgOiBHUElPLCBDTE9DSywgTlZJQyAqLw0KLSAgICBodGltLT5QV01fTXNwSW5pdENhbGxiYWNrKGh0aW0pOw0KLSNlbHNlDQotICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLLCBOVklDIGFuZCBETUEgKi8NCi0gICAgSEFMX1RJTV9QV01fTXNwSW5pdChodGltKTsNCi0jZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotICB9DQotDQotICAvKiBTZXQgdGhlIFRJTSBzdGF0ZSAqLw0KLSAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7DQotDQotICAvKiBJbml0IHRoZSBiYXNlIHRpbWUgZm9yIHRoZSBQV00gKi8NCi0gIFRJTV9CYXNlX1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgJmh0aW0tPkluaXQpOw0KLQ0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgRE1BIGJ1cnN0IG9wZXJhdGlvbiBzdGF0ZSAqLw0KLSAgaHRpbS0+RE1BQnVyc3RTdGF0ZSA9IEhBTF9ETUFfQlVSU1RfU1RBVEVfUkVBRFk7DQotDQotICAvKiBJbml0aWFsaXplIHRoZSBUSU0gY2hhbm5lbHMgc3RhdGUgKi8NCi0gIFRJTV9DSEFOTkVMX1NUQVRFX1NFVF9BTEwoaHRpbSwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsNCi0gIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUX0FMTChodGltLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOw0KLQ0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgVElNIHN0YXRlKi8NCi0gIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRUFEWTsNCi0NCi0gIHJldHVybiBIQUxfT0s7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGVJbml0aWFsaXplcyB0aGUgVElNIHBlcmlwaGVyYWwNCi0gKiBAcGFyYW0gIGh0aW0gVElNIFBXTSBoYW5kbGUNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1BXTV9EZUluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pIHsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7DQotDQotICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfQlVTWTsNCi0NCi0gIC8qIERpc2FibGUgdGhlIFRJTSBQZXJpcGhlcmFsIENsb2NrICovDQotICBfX0hBTF9USU1fRElTQUJMRShodGltKTsNCi0NCi0jaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQ0KLSAgaWYgKGh0aW0tPlBXTV9Nc3BEZUluaXRDYWxsYmFjayA9PSBOVUxMKSB7DQotICAgIGh0aW0tPlBXTV9Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9USU1fUFdNX01zcERlSW5pdDsNCi0gIH0NCi0gIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovDQotICBodGltLT5QV01fTXNwRGVJbml0Q2FsbGJhY2soaHRpbSk7DQotI2Vsc2UNCi0gIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlOiBHUElPLCBDTE9DSywgTlZJQyBhbmQgRE1BICovDQotICBIQUxfVElNX1BXTV9Nc3BEZUluaXQoaHRpbSk7DQotI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLQ0KLSAgLyogQ2hhbmdlIHRoZSBETUEgYnVyc3Qgb3BlcmF0aW9uIHN0YXRlICovDQotICBodGltLT5ETUFCdXJzdFN0YXRlID0gSEFMX0RNQV9CVVJTVF9TVEFURV9SRVNFVDsNCi0NCi0gIC8qIENoYW5nZSB0aGUgVElNIGNoYW5uZWxzIHN0YXRlICovDQotICBUSU1fQ0hBTk5FTF9TVEFURV9TRVRfQUxMKGh0aW0sIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRVNFVCk7DQotICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVF9BTEwoaHRpbSwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFU0VUKTsNCi0NCi0gIC8qIENoYW5nZSBUSU0gc3RhdGUgKi8NCi0gIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRVNFVDsNCi0NCi0gIC8qIFJlbGVhc2UgTG9jayAqLw0KLSAgX19IQUxfVU5MT0NLKGh0aW0pOw0KLQ0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgVElNIFBXTSBNU1AuDQotICogQHBhcmFtICBodGltIFRJTSBQV00gaGFuZGxlDQotICogQHJldHZhbCBOb25lDQotICovDQotX193ZWFrIHZvaWQgSEFMX1RJTV9QV01fTXNwSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkgew0KLSAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLw0KLSAgVU5VU0VEKGh0aW0pOw0KLQ0KLSAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLA0KLSAgICAgICAgICAgIHRoZSBIQUxfVElNX1BXTV9Nc3BJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUNCi0gICAqLw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERlSW5pdGlhbGl6ZXMgVElNIFBXTSBNU1AuDQotICogQHBhcmFtICBodGltIFRJTSBQV00gaGFuZGxlDQotICogQHJldHZhbCBOb25lDQotICovDQotX193ZWFrIHZvaWQgSEFMX1RJTV9QV01fTXNwRGVJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKSB7DQotICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovDQotICBVTlVTRUQoaHRpbSk7DQotDQotICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsDQotICAgICAgICAgICAgdGhlIEhBTF9USU1fUFdNX01zcERlSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlDQotICAgKi8NCi19DQotDQotLyoqDQotICogQGJyaWVmICBTdGFydHMgdGhlIFBXTSBzaWduYWwgZ2VuZXJhdGlvbi4NCi0gKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQ0KLSAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbHMgdG8gYmUgZW5hYmxlZA0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNTogVElNIENoYW5uZWwgNSBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF82OiBUSU0gQ2hhbm5lbCA2IHNlbGVjdGVkDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9QV01fU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpIHsNCi0gIHVpbnQzMl90IHRtcHNtY3I7DQotDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsNCi0NCi0gIC8qIENoZWNrIHRoZSBUSU0gY2hhbm5lbCBzdGF0ZSAqLw0KLSAgaWYgKFRJTV9DSEFOTkVMX1NUQVRFX0dFVChodGltLCBDaGFubmVsKSAhPSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpIHsNCi0gICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gIH0NCi0NCi0gIC8qIFNldCB0aGUgVElNIGNoYW5uZWwgc3RhdGUgKi8NCi0gIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBDaGFubmVsLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSk7DQotDQotICAvKiBFbmFibGUgdGhlIENhcHR1cmUgY29tcGFyZSBjaGFubmVsICovDQotICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCwgVElNX0NDeF9FTkFCTEUpOw0KLQ0KLSAgaWYgKElTX1RJTV9CUkVBS19JTlNUQU5DRShodGltLT5JbnN0YW5jZSkgIT0gUkVTRVQpIHsNCi0gICAgLyogRW5hYmxlIHRoZSBtYWluIG91dHB1dCAqLw0KLSAgICBfX0hBTF9USU1fTU9FX0VOQUJMRShodGltKTsNCi0gIH0NCi0NCi0gIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCwgZXhjZXB0IGluIHRyaWdnZXIgbW9kZSB3aGVyZSBlbmFibGUgaXMgYXV0b21hdGljYWxseQ0KLSAgICogZG9uZSB3aXRoIHRyaWdnZXIgKi8NCi0gIGlmIChJU19USU1fU0xBVkVfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKSB7DQotICAgIHRtcHNtY3IgPSBodGltLT5JbnN0YW5jZS0+U01DUiAmIFRJTV9TTUNSX1NNUzsNCi0gICAgaWYgKCFJU19USU1fU0xBVkVNT0RFX1RSSUdHRVJfRU5BQkxFRCh0bXBzbWNyKSkgew0KLSAgICAgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7DQotICAgIH0NCi0gIH0gZWxzZSB7DQotICAgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7DQotICB9DQotDQotICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovDQotICByZXR1cm4gSEFMX09LOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFN0b3BzIHRoZSBQV00gc2lnbmFsIGdlbmVyYXRpb24uDQotICogQHBhcmFtICBodGltIFRJTSBQV00gaGFuZGxlDQotICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVscyB0byBiZSBkaXNhYmxlZA0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNTogVElNIENoYW5uZWwgNSBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF82OiBUSU0gQ2hhbm5lbCA2IHNlbGVjdGVkDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9QV01fU3RvcChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCkgew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fQ0NYX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7DQotDQotICAvKiBEaXNhYmxlIHRoZSBDYXB0dXJlIGNvbXBhcmUgY2hhbm5lbCAqLw0KLSAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hfRElTQUJMRSk7DQotDQotICBpZiAoSVNfVElNX0JSRUFLX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSAhPSBSRVNFVCkgew0KLSAgICAvKiBEaXNhYmxlIHRoZSBNYWluIE91dHB1dCAqLw0KLSAgICBfX0hBTF9USU1fTU9FX0RJU0FCTEUoaHRpbSk7DQotICB9DQotDQotICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovDQotICBfX0hBTF9USU1fRElTQUJMRShodGltKTsNCi0NCi0gIC8qIFNldCB0aGUgVElNIGNoYW5uZWwgc3RhdGUgKi8NCi0gIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBDaGFubmVsLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOw0KLQ0KLSAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLw0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTdGFydHMgdGhlIFBXTSBzaWduYWwgZ2VuZXJhdGlvbiBpbiBpbnRlcnJ1cHQgbW9kZS4NCi0gKiBAcGFyYW0gIGh0aW0gVElNIFBXTSBoYW5kbGUNCi0gKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWwgdG8gYmUgZW5hYmxlZA0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1BXTV9TdGFydF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKSB7DQotICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7DQotICB1aW50MzJfdCB0bXBzbWNyOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fQ0NYX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7DQotDQotICAvKiBDaGVjayB0aGUgVElNIGNoYW5uZWwgc3RhdGUgKi8NCi0gIGlmIChUSU1fQ0hBTk5FTF9TVEFURV9HRVQoaHRpbSwgQ2hhbm5lbCkgIT0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKSB7DQotICAgIHJldHVybiBIQUxfRVJST1I7DQotICB9DQotDQotICAvKiBTZXQgdGhlIFRJTSBjaGFubmVsIHN0YXRlICovDQotICBUSU1fQ0hBTk5FTF9TVEFURV9TRVQoaHRpbSwgQ2hhbm5lbCwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX0JVU1kpOw0KLQ0KLSAgc3dpdGNoIChDaGFubmVsKSB7DQotICAgIGNhc2UgVElNX0NIQU5ORUxfMTogew0KLSAgICAgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAxIGludGVycnVwdCAqLw0KLSAgICAgIF9fSEFMX1RJTV9FTkFCTEVfSVQoaHRpbSwgVElNX0lUX0NDMSk7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0NCi0gICAgY2FzZSBUSU1fQ0hBTk5FTF8yOiB7DQotICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDIgaW50ZXJydXB0ICovDQotICAgICAgX19IQUxfVElNX0VOQUJMRV9JVChodGltLCBUSU1fSVRfQ0MyKTsNCi0gICAgICBicmVhazsNCi0gICAgfQ0KLQ0KLSAgICBjYXNlIFRJTV9DSEFOTkVMXzM6IHsNCi0gICAgICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMyBpbnRlcnJ1cHQgKi8NCi0gICAgICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzMpOw0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotDQotICAgIGNhc2UgVElNX0NIQU5ORUxfNDogew0KLSAgICAgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSA0IGludGVycnVwdCAqLw0KLSAgICAgIF9fSEFMX1RJTV9FTkFCTEVfSVQoaHRpbSwgVElNX0lUX0NDNCk7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0NCi0gICAgZGVmYXVsdDoNCi0gICAgICBzdGF0dXMgPSBIQUxfRVJST1I7DQotICAgICAgYnJlYWs7DQotICB9DQotDQotICBpZiAoc3RhdHVzID09IEhBTF9PSykgew0KLSAgICAvKiBFbmFibGUgdGhlIENhcHR1cmUgY29tcGFyZSBjaGFubmVsICovDQotICAgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4X0VOQUJMRSk7DQotDQotICAgIGlmIChJU19USU1fQlJFQUtfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpICE9IFJFU0VUKSB7DQotICAgICAgLyogRW5hYmxlIHRoZSBtYWluIG91dHB1dCAqLw0KLSAgICAgIF9fSEFMX1RJTV9NT0VfRU5BQkxFKGh0aW0pOw0KLSAgICB9DQotDQotICAgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCwgZXhjZXB0IGluIHRyaWdnZXIgbW9kZSB3aGVyZSBlbmFibGUgaXMNCi0gICAgICogYXV0b21hdGljYWxseSBkb25lIHdpdGggdHJpZ2dlciAqLw0KLSAgICBpZiAoSVNfVElNX1NMQVZFX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSkgew0KLSAgICAgIHRtcHNtY3IgPSBodGltLT5JbnN0YW5jZS0+U01DUiAmIFRJTV9TTUNSX1NNUzsNCi0gICAgICBpZiAoIUlTX1RJTV9TTEFWRU1PREVfVFJJR0dFUl9FTkFCTEVEKHRtcHNtY3IpKSB7DQotICAgICAgICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOw0KLSAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOw0KLSAgICB9DQotICB9DQotDQotICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovDQotICByZXR1cm4gc3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFN0b3BzIHRoZSBQV00gc2lnbmFsIGdlbmVyYXRpb24gaW4gaW50ZXJydXB0IG1vZGUuDQotICogQHBhcmFtICBodGltIFRJTSBQV00gaGFuZGxlDQotICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVscyB0byBiZSBkaXNhYmxlZA0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1BXTV9TdG9wX0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCkgew0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fQ0NYX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7DQotDQotICBzd2l0Y2ggKENoYW5uZWwpIHsNCi0gICAgY2FzZSBUSU1fQ0hBTk5FTF8xOiB7DQotICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAxIGludGVycnVwdCAqLw0KLSAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzEpOw0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotDQotICAgIGNhc2UgVElNX0NIQU5ORUxfMjogew0KLSAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMiBpbnRlcnJ1cHQgKi8NCi0gICAgICBfX0hBTF9USU1fRElTQUJMRV9JVChodGltLCBUSU1fSVRfQ0MyKTsNCi0gICAgICBicmVhazsNCi0gICAgfQ0KLQ0KLSAgICBjYXNlIFRJTV9DSEFOTkVMXzM6IHsNCi0gICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDMgaW50ZXJydXB0ICovDQotICAgICAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDMyk7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0NCi0gICAgY2FzZSBUSU1fQ0hBTk5FTF80OiB7DQotICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSA0IGludGVycnVwdCAqLw0KLSAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzQpOw0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotDQotICAgIGRlZmF1bHQ6DQotICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOw0KLSAgICAgIGJyZWFrOw0KLSAgfQ0KLQ0KLSAgaWYgKHN0YXR1cyA9PSBIQUxfT0spIHsNCi0gICAgLyogRGlzYWJsZSB0aGUgQ2FwdHVyZSBjb21wYXJlIGNoYW5uZWwgKi8NCi0gICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hfRElTQUJMRSk7DQotDQotICAgIGlmIChJU19USU1fQlJFQUtfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpICE9IFJFU0VUKSB7DQotICAgICAgLyogRGlzYWJsZSB0aGUgTWFpbiBPdXRwdXQgKi8NCi0gICAgICBfX0hBTF9USU1fTU9FX0RJU0FCTEUoaHRpbSk7DQotICAgIH0NCi0NCi0gICAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLw0KLSAgICBfX0hBTF9USU1fRElTQUJMRShodGltKTsNCi0NCi0gICAgLyogU2V0IHRoZSBUSU0gY2hhbm5lbCBzdGF0ZSAqLw0KLSAgICBUSU1fQ0hBTk5FTF9TVEFURV9TRVQoaHRpbSwgQ2hhbm5lbCwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsNCi0gIH0NCi0NCi0gIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8NCi0gIHJldHVybiBzdGF0dXM7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU3RhcnRzIHRoZSBUSU0gUFdNIHNpZ25hbCBnZW5lcmF0aW9uIGluIERNQSBtb2RlLg0KLSAqIEBwYXJhbSAgaHRpbSBUSU0gUFdNIGhhbmRsZQ0KLSAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbHMgdG8gYmUgZW5hYmxlZA0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQNCi0gKiBAcGFyYW0gIHBEYXRhIFRoZSBzb3VyY2UgQnVmZmVyIGFkZHJlc3MuDQotICogQHBhcmFtICBMZW5ndGggVGhlIGxlbmd0aCBvZiBkYXRhIHRvIGJlIHRyYW5zZmVycmVkIGZyb20gbWVtb3J5IHRvIFRJTQ0KLSAqIHBlcmlwaGVyYWwNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1BXTV9TdGFydF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90ICpwRGF0YSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgTGVuZ3RoKSB7DQotICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7DQotICB1aW50MzJfdCB0bXBzbWNyOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fQ0NYX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7DQotDQotICAvKiBTZXQgdGhlIFRJTSBjaGFubmVsIHN0YXRlICovDQotICBpZiAoVElNX0NIQU5ORUxfU1RBVEVfR0VUKGh0aW0sIENoYW5uZWwpID09IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKSB7DQotICAgIHJldHVybiBIQUxfQlVTWTsNCi0gIH0gZWxzZSBpZiAoVElNX0NIQU5ORUxfU1RBVEVfR0VUKGh0aW0sIENoYW5uZWwpID09DQotICAgICAgICAgICAgIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSkgew0KLSAgICBpZiAoKHBEYXRhID09IE5VTEwpICYmIChMZW5ndGggPiAwVSkpIHsNCi0gICAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBDaGFubmVsLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSk7DQotICAgIH0NCi0gIH0gZWxzZSB7DQotICAgIHJldHVybiBIQUxfRVJST1I7DQotICB9DQotDQotICBzd2l0Y2ggKENoYW5uZWwpIHsNCi0gICAgY2FzZSBUSU1fQ0hBTk5FTF8xOiB7DQotICAgICAgLyogU2V0IHRoZSBETUEgY29tcGFyZSBjYWxsYmFja3MgKi8NCi0gICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFEZWxheVB1bHNlQ3BsdDsNCi0gICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPQ0KLSAgICAgICAgICBUSU1fRE1BRGVsYXlQdWxzZUhhbGZDcGx0Ow0KLQ0KLSAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovDQotICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yOw0KLQ0KLSAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8NCi0gICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXSwgKHVpbnQzMl90KXBEYXRhLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkNDUjEsIExlbmd0aCkgIT0gSEFMX09LKSB7DQotICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovDQotICAgICAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgICAgIH0NCi0NCi0gICAgICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMSBETUEgcmVxdWVzdCAqLw0KLSAgICAgIF9fSEFMX1RJTV9FTkFCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MxKTsNCi0gICAgICBicmVhazsNCi0gICAgfQ0KLQ0KLSAgICBjYXNlIFRJTV9DSEFOTkVMXzI6IHsNCi0gICAgICAvKiBTZXQgdGhlIERNQSBjb21wYXJlIGNhbGxiYWNrcyAqLw0KLSAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQURlbGF5UHVsc2VDcGx0Ow0KLSAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9DQotICAgICAgICAgIFRJTV9ETUFEZWxheVB1bHNlSGFsZkNwbHQ7DQotDQotICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8NCi0gICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3I7DQotDQotICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLw0KLSAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLCAodWludDMyX3QpcERhdGEsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+Q0NSMiwgTGVuZ3RoKSAhPSBIQUxfT0spIHsNCi0gICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8NCi0gICAgICAgIHJldHVybiBIQUxfRVJST1I7DQotICAgICAgfQ0KLSAgICAgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAyIERNQSByZXF1ZXN0ICovDQotICAgICAgX19IQUxfVElNX0VOQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzIpOw0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotDQotICAgIGNhc2UgVElNX0NIQU5ORUxfMzogew0KLSAgICAgIC8qIFNldCB0aGUgRE1BIGNvbXBhcmUgY2FsbGJhY2tzICovDQotICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BRGVsYXlQdWxzZUNwbHQ7DQotICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0NCi0gICAgICAgICAgVElNX0RNQURlbGF5UHVsc2VIYWxmQ3BsdDsNCi0NCi0gICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLw0KLSAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvcjsNCi0NCi0gICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovDQotICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10sICh1aW50MzJfdClwRGF0YSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5DQ1IzLCBMZW5ndGgpICE9IEhBTF9PSykgew0KLSAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLw0KLSAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gICAgICB9DQotICAgICAgLyogRW5hYmxlIHRoZSBUSU0gT3V0cHV0IENhcHR1cmUvQ29tcGFyZSAzIHJlcXVlc3QgKi8NCi0gICAgICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMyk7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0NCi0gICAgY2FzZSBUSU1fQ0hBTk5FTF80OiB7DQotICAgICAgLyogU2V0IHRoZSBETUEgY29tcGFyZSBjYWxsYmFja3MgKi8NCi0gICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFEZWxheVB1bHNlQ3BsdDsNCi0gICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPQ0KLSAgICAgICAgICBUSU1fRE1BRGVsYXlQdWxzZUhhbGZDcGx0Ow0KLQ0KLSAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovDQotICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDNF0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yOw0KLQ0KLSAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8NCi0gICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XSwgKHVpbnQzMl90KXBEYXRhLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkNDUjQsIExlbmd0aCkgIT0gSEFMX09LKSB7DQotICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovDQotICAgICAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgICAgIH0NCi0gICAgICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgNCBETUEgcmVxdWVzdCAqLw0KLSAgICAgIF9fSEFMX1RJTV9FTkFCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0M0KTsNCi0gICAgICBicmVhazsNCi0gICAgfQ0KLQ0KLSAgICBkZWZhdWx0Og0KLSAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsNCi0gICAgICBicmVhazsNCi0gIH0NCi0NCi0gIGlmIChzdGF0dXMgPT0gSEFMX09LKSB7DQotICAgIC8qIEVuYWJsZSB0aGUgQ2FwdHVyZSBjb21wYXJlIGNoYW5uZWwgKi8NCi0gICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hfRU5BQkxFKTsNCi0NCi0gICAgaWYgKElTX1RJTV9CUkVBS19JTlNUQU5DRShodGltLT5JbnN0YW5jZSkgIT0gUkVTRVQpIHsNCi0gICAgICAvKiBFbmFibGUgdGhlIG1haW4gb3V0cHV0ICovDQotICAgICAgX19IQUxfVElNX01PRV9FTkFCTEUoaHRpbSk7DQotICAgIH0NCi0NCi0gICAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsLCBleGNlcHQgaW4gdHJpZ2dlciBtb2RlIHdoZXJlIGVuYWJsZSBpcw0KLSAgICAgKiBhdXRvbWF0aWNhbGx5IGRvbmUgd2l0aCB0cmlnZ2VyICovDQotICAgIGlmIChJU19USU1fU0xBVkVfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKSB7DQotICAgICAgdG1wc21jciA9IGh0aW0tPkluc3RhbmNlLT5TTUNSICYgVElNX1NNQ1JfU01TOw0KLSAgICAgIGlmICghSVNfVElNX1NMQVZFTU9ERV9UUklHR0VSX0VOQUJMRUQodG1wc21jcikpIHsNCi0gICAgICAgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7DQotICAgICAgfQ0KLSAgICB9IGVsc2Ugew0KLSAgICAgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7DQotICAgIH0NCi0gIH0NCi0NCi0gIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8NCi0gIHJldHVybiBzdGF0dXM7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU3RvcHMgdGhlIFRJTSBQV00gc2lnbmFsIGdlbmVyYXRpb24gaW4gRE1BIG1vZGUuDQotICogQHBhcmFtICBodGltIFRJTSBQV00gaGFuZGxlDQotICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVscyB0byBiZSBkaXNhYmxlZA0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1BXTV9TdG9wX0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKSB7DQotICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7DQotDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsNCi0NCi0gIHN3aXRjaCAoQ2hhbm5lbCkgew0KLSAgICBjYXNlIFRJTV9DSEFOTkVMXzE6IHsNCi0gICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDEgRE1BIHJlcXVlc3QgKi8NCi0gICAgICBfX0hBTF9USU1fRElTQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzEpOw0KLSAgICAgICh2b2lkKUhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0pOw0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotDQotICAgIGNhc2UgVElNX0NIQU5ORUxfMjogew0KLSAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMiBETUEgcmVxdWVzdCAqLw0KLSAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMik7DQotICAgICAgKHZvaWQpSEFMX0RNQV9BYm9ydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXSk7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0NCi0gICAgY2FzZSBUSU1fQ0hBTk5FTF8zOiB7DQotICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAzIERNQSByZXF1ZXN0ICovDQotICAgICAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MzKTsNCi0gICAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdKTsNCi0gICAgICBicmVhazsNCi0gICAgfQ0KLQ0KLSAgICBjYXNlIFRJTV9DSEFOTkVMXzQ6IHsNCi0gICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDQgaW50ZXJydXB0ICovDQotICAgICAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0M0KTsNCi0gICAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdKTsNCi0gICAgICBicmVhazsNCi0gICAgfQ0KLQ0KLSAgICBkZWZhdWx0Og0KLSAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsNCi0gICAgICBicmVhazsNCi0gIH0NCi0NCi0gIGlmIChzdGF0dXMgPT0gSEFMX09LKSB7DQotICAgIC8qIERpc2FibGUgdGhlIENhcHR1cmUgY29tcGFyZSBjaGFubmVsICovDQotICAgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4X0RJU0FCTEUpOw0KLQ0KLSAgICBpZiAoSVNfVElNX0JSRUFLX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSAhPSBSRVNFVCkgew0KLSAgICAgIC8qIERpc2FibGUgdGhlIE1haW4gT3V0cHV0ICovDQotICAgICAgX19IQUxfVElNX01PRV9ESVNBQkxFKGh0aW0pOw0KLSAgICB9DQotDQotICAgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8NCi0gICAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7DQotDQotICAgIC8qIFNldCB0aGUgVElNIGNoYW5uZWwgc3RhdGUgKi8NCi0gICAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIENoYW5uZWwsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7DQotICB9DQotDQotICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovDQotICByZXR1cm4gc3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQgVElNIElucHV0IENhcHR1cmUgZnVuY3Rpb25zDQotICAqICBAYnJpZWYgICAgVElNIElucHV0IENhcHR1cmUgZnVuY3Rpb25zDQotICAqDQotQHZlcmJhdGltDQotICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgICAgICAgICAgICMjIyMjIFRJTSBJbnB1dCBDYXB0dXJlIGZ1bmN0aW9ucyAjIyMjIw0KLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIFsuLl0NCi0gICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOg0KLSAgICgrKSBJbml0aWFsaXplIGFuZCBjb25maWd1cmUgdGhlIFRJTSBJbnB1dCBDYXB0dXJlLg0KLSAgICgrKSBEZS1pbml0aWFsaXplIHRoZSBUSU0gSW5wdXQgQ2FwdHVyZS4NCi0gICAoKykgU3RhcnQgdGhlIFRJTSBJbnB1dCBDYXB0dXJlLg0KLSAgICgrKSBTdG9wIHRoZSBUSU0gSW5wdXQgQ2FwdHVyZS4NCi0gICAoKykgU3RhcnQgdGhlIFRJTSBJbnB1dCBDYXB0dXJlIGFuZCBlbmFibGUgaW50ZXJydXB0Lg0KLSAgICgrKSBTdG9wIHRoZSBUSU0gSW5wdXQgQ2FwdHVyZSBhbmQgZGlzYWJsZSBpbnRlcnJ1cHQuDQotICAgKCspIFN0YXJ0IHRoZSBUSU0gSW5wdXQgQ2FwdHVyZSBhbmQgZW5hYmxlIERNQSB0cmFuc2Zlci4NCi0gICAoKykgU3RvcCB0aGUgVElNIElucHV0IENhcHR1cmUgYW5kIGRpc2FibGUgRE1BIHRyYW5zZmVyLg0KLQ0KLUBlbmR2ZXJiYXRpbQ0KLSAgKiBAew0KLSAgKi8NCi0vKioNCi0gKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBUSU0gSW5wdXQgQ2FwdHVyZSBUaW1lIGJhc2UgYWNjb3JkaW5nIHRvIHRoZQ0KLSAqIHNwZWNpZmllZCBwYXJhbWV0ZXJzIGluIHRoZSBUSU1fSGFuZGxlVHlwZURlZiBhbmQgaW5pdGlhbGl6ZXMgdGhlIGFzc29jaWF0ZWQNCi0gKiBoYW5kbGUuDQotICogQG5vdGUgICBTd2l0Y2hpbmcgZnJvbSBDZW50ZXIgQWxpZ25lZCBjb3VudGVyIG1vZGUgdG8gRWRnZSBjb3VudGVyIG1vZGUgKG9yDQotICogcmV2ZXJzZSkgcmVxdWlyZXMgYSB0aW1lciByZXNldCB0byBhdm9pZCB1bmV4cGVjdGVkIGRpcmVjdGlvbiBkdWUgdG8gRElSIGJpdA0KLSAqIHJlYWRvbmx5IGluIGNlbnRlciBhbGlnbmVkIG1vZGUuIEV4OiBjYWxsIEByZWYgSEFMX1RJTV9JQ19EZUluaXQoKSBiZWZvcmUNCi0gKiBIQUxfVElNX0lDX0luaXQoKQ0KLSAqIEBwYXJhbSAgaHRpbSBUSU0gSW5wdXQgQ2FwdHVyZSBoYW5kbGUNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0lDX0luaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pIHsNCi0gIC8qIENoZWNrIHRoZSBUSU0gaGFuZGxlIGFsbG9jYXRpb24gKi8NCi0gIGlmIChodGltID09IE5VTEwpIHsNCi0gICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gIH0NCi0NCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0NPVU5URVJfTU9ERShodGltLT5Jbml0LkNvdW50ZXJNb2RlKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMT0NLRElWSVNJT05fRElWKGh0aW0tPkluaXQuQ2xvY2tEaXZpc2lvbikpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9BVVRPUkVMT0FEX1BSRUxPQUQoaHRpbS0+SW5pdC5BdXRvUmVsb2FkUHJlbG9hZCkpOw0KLQ0KLSAgaWYgKGh0aW0tPlN0YXRlID09IEhBTF9USU1fU1RBVEVfUkVTRVQpIHsNCi0gICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLw0KLSAgICBodGltLT5Mb2NrID0gSEFMX1VOTE9DS0VEOw0KLQ0KLSNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpDQotICAgIC8qIFJlc2V0IGludGVycnVwdCBjYWxsYmFja3MgdG8gbGVnYWN5IHdlYWsgY2FsbGJhY2tzICovDQotICAgIFRJTV9SZXNldENhbGxiYWNrKGh0aW0pOw0KLQ0KLSAgICBpZiAoaHRpbS0+SUNfTXNwSW5pdENhbGxiYWNrID09IE5VTEwpIHsNCi0gICAgICBodGltLT5JQ19Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfVElNX0lDX01zcEluaXQ7DQotICAgIH0NCi0gICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIDogR1BJTywgQ0xPQ0ssIE5WSUMgKi8NCi0gICAgaHRpbS0+SUNfTXNwSW5pdENhbGxiYWNrKGh0aW0pOw0KLSNlbHNlDQotICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLLCBOVklDIGFuZCBETUEgKi8NCi0gICAgSEFMX1RJTV9JQ19Nc3BJbml0KGh0aW0pOw0KLSNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi0gIH0NCi0NCi0gIC8qIFNldCB0aGUgVElNIHN0YXRlICovDQotICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfQlVTWTsNCi0NCi0gIC8qIEluaXQgdGhlIGJhc2UgdGltZSBmb3IgdGhlIGlucHV0IGNhcHR1cmUgKi8NCi0gIFRJTV9CYXNlX1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgJmh0aW0tPkluaXQpOw0KLQ0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgRE1BIGJ1cnN0IG9wZXJhdGlvbiBzdGF0ZSAqLw0KLSAgaHRpbS0+RE1BQnVyc3RTdGF0ZSA9IEhBTF9ETUFfQlVSU1RfU1RBVEVfUkVBRFk7DQotDQotICAvKiBJbml0aWFsaXplIHRoZSBUSU0gY2hhbm5lbHMgc3RhdGUgKi8NCi0gIFRJTV9DSEFOTkVMX1NUQVRFX1NFVF9BTEwoaHRpbSwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsNCi0gIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUX0FMTChodGltLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOw0KLQ0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgVElNIHN0YXRlKi8NCi0gIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRUFEWTsNCi0NCi0gIHJldHVybiBIQUxfT0s7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGVJbml0aWFsaXplcyB0aGUgVElNIHBlcmlwaGVyYWwNCi0gKiBAcGFyYW0gIGh0aW0gVElNIElucHV0IENhcHR1cmUgaGFuZGxlDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9JQ19EZUluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pIHsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7DQotDQotICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfQlVTWTsNCi0NCi0gIC8qIERpc2FibGUgdGhlIFRJTSBQZXJpcGhlcmFsIENsb2NrICovDQotICBfX0hBTF9USU1fRElTQUJMRShodGltKTsNCi0NCi0jaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQ0KLSAgaWYgKGh0aW0tPklDX01zcERlSW5pdENhbGxiYWNrID09IE5VTEwpIHsNCi0gICAgaHRpbS0+SUNfTXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfVElNX0lDX01zcERlSW5pdDsNCi0gIH0NCi0gIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovDQotICBodGltLT5JQ19Nc3BEZUluaXRDYWxsYmFjayhodGltKTsNCi0jZWxzZQ0KLSAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmU6IEdQSU8sIENMT0NLLCBOVklDIGFuZCBETUEgKi8NCi0gIEhBTF9USU1fSUNfTXNwRGVJbml0KGh0aW0pOw0KLSNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi0NCi0gIC8qIENoYW5nZSB0aGUgRE1BIGJ1cnN0IG9wZXJhdGlvbiBzdGF0ZSAqLw0KLSAgaHRpbS0+RE1BQnVyc3RTdGF0ZSA9IEhBTF9ETUFfQlVSU1RfU1RBVEVfUkVTRVQ7DQotDQotICAvKiBDaGFuZ2UgdGhlIFRJTSBjaGFubmVscyBzdGF0ZSAqLw0KLSAgVElNX0NIQU5ORUxfU1RBVEVfU0VUX0FMTChodGltLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVTRVQpOw0KLSAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVRfQUxMKGh0aW0sIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRVNFVCk7DQotDQotICAvKiBDaGFuZ2UgVElNIHN0YXRlICovDQotICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVTRVQ7DQotDQotICAvKiBSZWxlYXNlIExvY2sgKi8NCi0gIF9fSEFMX1VOTE9DSyhodGltKTsNCi0NCi0gIHJldHVybiBIQUxfT0s7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFRJTSBJbnB1dCBDYXB0dXJlIE1TUC4NCi0gKiBAcGFyYW0gIGh0aW0gVElNIElucHV0IENhcHR1cmUgaGFuZGxlDQotICogQHJldHZhbCBOb25lDQotICovDQotX193ZWFrIHZvaWQgSEFMX1RJTV9JQ19Nc3BJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKSB7DQotICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovDQotICBVTlVTRUQoaHRpbSk7DQotDQotICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsDQotICAgICAgICAgICAgdGhlIEhBTF9USU1fSUNfTXNwSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlDQotICAgKi8NCi19DQotDQotLyoqDQotICogQGJyaWVmICBEZUluaXRpYWxpemVzIFRJTSBJbnB1dCBDYXB0dXJlIE1TUC4NCi0gKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fd2VhayB2b2lkIEhBTF9USU1fSUNfTXNwRGVJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKSB7DQotICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovDQotICBVTlVTRUQoaHRpbSk7DQotDQotICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsDQotICAgICAgICAgICAgdGhlIEhBTF9USU1fSUNfTXNwRGVJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUNCi0gICAqLw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFN0YXJ0cyB0aGUgVElNIElucHV0IENhcHR1cmUgbWVhc3VyZW1lbnQuDQotICogQHBhcmFtICBodGltIFRJTSBJbnB1dCBDYXB0dXJlIGhhbmRsZQ0KLSAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbHMgdG8gYmUgZW5hYmxlZA0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0lDX1N0YXJ0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKSB7DQotICB1aW50MzJfdCB0bXBzbWNyOw0KLSAgSEFMX1RJTV9DaGFubmVsU3RhdGVUeXBlRGVmIGNoYW5uZWxfc3RhdGUgPQ0KLSAgICAgIFRJTV9DSEFOTkVMX1NUQVRFX0dFVChodGltLCBDaGFubmVsKTsNCi0gIEhBTF9USU1fQ2hhbm5lbFN0YXRlVHlwZURlZiBjb21wbGVtZW50YXJ5X2NoYW5uZWxfc3RhdGUgPQ0KLSAgICAgIFRJTV9DSEFOTkVMX05fU1RBVEVfR0VUKGh0aW0sIENoYW5uZWwpOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fQ0NYX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7DQotDQotICAvKiBDaGVjayB0aGUgVElNIGNoYW5uZWwgc3RhdGUgKi8NCi0gIGlmICgoY2hhbm5lbF9zdGF0ZSAhPSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpIHx8DQotICAgICAgKGNvbXBsZW1lbnRhcnlfY2hhbm5lbF9zdGF0ZSAhPSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpKSB7DQotICAgIHJldHVybiBIQUxfRVJST1I7DQotICB9DQotDQotICAvKiBTZXQgdGhlIFRJTSBjaGFubmVsIHN0YXRlICovDQotICBUSU1fQ0hBTk5FTF9TVEFURV9TRVQoaHRpbSwgQ2hhbm5lbCwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX0JVU1kpOw0KLSAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgQ2hhbm5lbCwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX0JVU1kpOw0KLQ0KLSAgLyogRW5hYmxlIHRoZSBJbnB1dCBDYXB0dXJlIGNoYW5uZWwgKi8NCi0gIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4X0VOQUJMRSk7DQotDQotICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwsIGV4Y2VwdCBpbiB0cmlnZ2VyIG1vZGUgd2hlcmUgZW5hYmxlIGlzIGF1dG9tYXRpY2FsbHkNCi0gICAqIGRvbmUgd2l0aCB0cmlnZ2VyICovDQotICBpZiAoSVNfVElNX1NMQVZFX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSkgew0KLSAgICB0bXBzbWNyID0gaHRpbS0+SW5zdGFuY2UtPlNNQ1IgJiBUSU1fU01DUl9TTVM7DQotICAgIGlmICghSVNfVElNX1NMQVZFTU9ERV9UUklHR0VSX0VOQUJMRUQodG1wc21jcikpIHsNCi0gICAgICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOw0KLSAgICB9DQotICB9IGVsc2Ugew0KLSAgICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOw0KLSAgfQ0KLQ0KLSAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLw0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTdG9wcyB0aGUgVElNIElucHV0IENhcHR1cmUgbWVhc3VyZW1lbnQuDQotICogQHBhcmFtICBodGltIFRJTSBJbnB1dCBDYXB0dXJlIGhhbmRsZQ0KLSAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbHMgdG8gYmUgZGlzYWJsZWQNCi0gKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9JQ19TdG9wKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKSB7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsNCi0NCi0gIC8qIERpc2FibGUgdGhlIElucHV0IENhcHR1cmUgY2hhbm5lbCAqLw0KLSAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hfRElTQUJMRSk7DQotDQotICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovDQotICBfX0hBTF9USU1fRElTQUJMRShodGltKTsNCi0NCi0gIC8qIFNldCB0aGUgVElNIGNoYW5uZWwgc3RhdGUgKi8NCi0gIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBDaGFubmVsLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOw0KLSAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgQ2hhbm5lbCwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsNCi0NCi0gIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8NCi0gIHJldHVybiBIQUxfT0s7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU3RhcnRzIHRoZSBUSU0gSW5wdXQgQ2FwdHVyZSBtZWFzdXJlbWVudCBpbiBpbnRlcnJ1cHQgbW9kZS4NCi0gKiBAcGFyYW0gIGh0aW0gVElNIElucHV0IENhcHR1cmUgaGFuZGxlDQotICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVscyB0byBiZSBlbmFibGVkDQotICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZA0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fSUNfU3RhcnRfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKSB7DQotICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7DQotICB1aW50MzJfdCB0bXBzbWNyOw0KLQ0KLSAgSEFMX1RJTV9DaGFubmVsU3RhdGVUeXBlRGVmIGNoYW5uZWxfc3RhdGUgPQ0KLSAgICAgIFRJTV9DSEFOTkVMX1NUQVRFX0dFVChodGltLCBDaGFubmVsKTsNCi0gIEhBTF9USU1fQ2hhbm5lbFN0YXRlVHlwZURlZiBjb21wbGVtZW50YXJ5X2NoYW5uZWxfc3RhdGUgPQ0KLSAgICAgIFRJTV9DSEFOTkVMX05fU1RBVEVfR0VUKGh0aW0sIENoYW5uZWwpOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fQ0NYX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7DQotDQotICAvKiBDaGVjayB0aGUgVElNIGNoYW5uZWwgc3RhdGUgKi8NCi0gIGlmICgoY2hhbm5lbF9zdGF0ZSAhPSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpIHx8DQotICAgICAgKGNvbXBsZW1lbnRhcnlfY2hhbm5lbF9zdGF0ZSAhPSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpKSB7DQotICAgIHJldHVybiBIQUxfRVJST1I7DQotICB9DQotDQotICAvKiBTZXQgdGhlIFRJTSBjaGFubmVsIHN0YXRlICovDQotICBUSU1fQ0hBTk5FTF9TVEFURV9TRVQoaHRpbSwgQ2hhbm5lbCwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX0JVU1kpOw0KLSAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgQ2hhbm5lbCwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX0JVU1kpOw0KLQ0KLSAgc3dpdGNoIChDaGFubmVsKSB7DQotICAgIGNhc2UgVElNX0NIQU5ORUxfMTogew0KLSAgICAgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAxIGludGVycnVwdCAqLw0KLSAgICAgIF9fSEFMX1RJTV9FTkFCTEVfSVQoaHRpbSwgVElNX0lUX0NDMSk7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0NCi0gICAgY2FzZSBUSU1fQ0hBTk5FTF8yOiB7DQotICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDIgaW50ZXJydXB0ICovDQotICAgICAgX19IQUxfVElNX0VOQUJMRV9JVChodGltLCBUSU1fSVRfQ0MyKTsNCi0gICAgICBicmVhazsNCi0gICAgfQ0KLQ0KLSAgICBjYXNlIFRJTV9DSEFOTkVMXzM6IHsNCi0gICAgICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMyBpbnRlcnJ1cHQgKi8NCi0gICAgICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzMpOw0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotDQotICAgIGNhc2UgVElNX0NIQU5ORUxfNDogew0KLSAgICAgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSA0IGludGVycnVwdCAqLw0KLSAgICAgIF9fSEFMX1RJTV9FTkFCTEVfSVQoaHRpbSwgVElNX0lUX0NDNCk7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0NCi0gICAgZGVmYXVsdDoNCi0gICAgICBzdGF0dXMgPSBIQUxfRVJST1I7DQotICAgICAgYnJlYWs7DQotICB9DQotDQotICBpZiAoc3RhdHVzID09IEhBTF9PSykgew0KLSAgICAvKiBFbmFibGUgdGhlIElucHV0IENhcHR1cmUgY2hhbm5lbCAqLw0KLSAgICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCwgVElNX0NDeF9FTkFCTEUpOw0KLQ0KLSAgICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwsIGV4Y2VwdCBpbiB0cmlnZ2VyIG1vZGUgd2hlcmUgZW5hYmxlIGlzDQotICAgICAqIGF1dG9tYXRpY2FsbHkgZG9uZSB3aXRoIHRyaWdnZXIgKi8NCi0gICAgaWYgKElTX1RJTV9TTEFWRV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpIHsNCi0gICAgICB0bXBzbWNyID0gaHRpbS0+SW5zdGFuY2UtPlNNQ1IgJiBUSU1fU01DUl9TTVM7DQotICAgICAgaWYgKCFJU19USU1fU0xBVkVNT0RFX1RSSUdHRVJfRU5BQkxFRCh0bXBzbWNyKSkgew0KLSAgICAgICAgX19IQUxfVElNX0VOQUJMRShodGltKTsNCi0gICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgX19IQUxfVElNX0VOQUJMRShodGltKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLw0KLSAgcmV0dXJuIHN0YXR1czsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTdG9wcyB0aGUgVElNIElucHV0IENhcHR1cmUgbWVhc3VyZW1lbnQgaW4gaW50ZXJydXB0IG1vZGUuDQotICogQHBhcmFtICBodGltIFRJTSBJbnB1dCBDYXB0dXJlIGhhbmRsZQ0KLSAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbHMgdG8gYmUgZGlzYWJsZWQNCi0gKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9JQ19TdG9wX0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKSB7DQotICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7DQotDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsNCi0NCi0gIHN3aXRjaCAoQ2hhbm5lbCkgew0KLSAgICBjYXNlIFRJTV9DSEFOTkVMXzE6IHsNCi0gICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDEgaW50ZXJydXB0ICovDQotICAgICAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDMSk7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0NCi0gICAgY2FzZSBUSU1fQ0hBTk5FTF8yOiB7DQotICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAyIGludGVycnVwdCAqLw0KLSAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzIpOw0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotDQotICAgIGNhc2UgVElNX0NIQU5ORUxfMzogew0KLSAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMyBpbnRlcnJ1cHQgKi8NCi0gICAgICBfX0hBTF9USU1fRElTQUJMRV9JVChodGltLCBUSU1fSVRfQ0MzKTsNCi0gICAgICBicmVhazsNCi0gICAgfQ0KLQ0KLSAgICBjYXNlIFRJTV9DSEFOTkVMXzQ6IHsNCi0gICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDQgaW50ZXJydXB0ICovDQotICAgICAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDNCk7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0NCi0gICAgZGVmYXVsdDoNCi0gICAgICBzdGF0dXMgPSBIQUxfRVJST1I7DQotICAgICAgYnJlYWs7DQotICB9DQotDQotICBpZiAoc3RhdHVzID09IEhBTF9PSykgew0KLSAgICAvKiBEaXNhYmxlIHRoZSBJbnB1dCBDYXB0dXJlIGNoYW5uZWwgKi8NCi0gICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hfRElTQUJMRSk7DQotDQotICAgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8NCi0gICAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7DQotDQotICAgIC8qIFNldCB0aGUgVElNIGNoYW5uZWwgc3RhdGUgKi8NCi0gICAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIENoYW5uZWwsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7DQotICAgIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIENoYW5uZWwsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7DQotICB9DQotDQotICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovDQotICByZXR1cm4gc3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFN0YXJ0cyB0aGUgVElNIElucHV0IENhcHR1cmUgbWVhc3VyZW1lbnQgaW4gRE1BIG1vZGUuDQotICogQHBhcmFtICBodGltIFRJTSBJbnB1dCBDYXB0dXJlIGhhbmRsZQ0KLSAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbHMgdG8gYmUgZW5hYmxlZA0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQNCi0gKiBAcGFyYW0gIHBEYXRhIFRoZSBkZXN0aW5hdGlvbiBCdWZmZXIgYWRkcmVzcy4NCi0gKiBAcGFyYW0gIExlbmd0aCBUaGUgbGVuZ3RoIG9mIGRhdGEgdG8gYmUgdHJhbnNmZXJyZWQgZnJvbSBUSU0gcGVyaXBoZXJhbCB0bw0KLSAqIG1lbW9yeS4NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0lDX1N0YXJ0X0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCAqcERhdGEsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgTGVuZ3RoKSB7DQotICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7DQotICB1aW50MzJfdCB0bXBzbWNyOw0KLQ0KLSAgSEFMX1RJTV9DaGFubmVsU3RhdGVUeXBlRGVmIGNoYW5uZWxfc3RhdGUgPQ0KLSAgICAgIFRJTV9DSEFOTkVMX1NUQVRFX0dFVChodGltLCBDaGFubmVsKTsNCi0gIEhBTF9USU1fQ2hhbm5lbFN0YXRlVHlwZURlZiBjb21wbGVtZW50YXJ5X2NoYW5uZWxfc3RhdGUgPQ0KLSAgICAgIFRJTV9DSEFOTkVMX05fU1RBVEVfR0VUKGh0aW0sIENoYW5uZWwpOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fQ0NYX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0RNQV9DQ19JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOw0KLQ0KLSAgLyogU2V0IHRoZSBUSU0gY2hhbm5lbCBzdGF0ZSAqLw0KLSAgaWYgKChjaGFubmVsX3N0YXRlID09IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKSB8fA0KLSAgICAgIChjb21wbGVtZW50YXJ5X2NoYW5uZWxfc3RhdGUgPT0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX0JVU1kpKSB7DQotICAgIHJldHVybiBIQUxfQlVTWTsNCi0gIH0gZWxzZSBpZiAoKGNoYW5uZWxfc3RhdGUgPT0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKSAmJg0KLSAgICAgICAgICAgICAoY29tcGxlbWVudGFyeV9jaGFubmVsX3N0YXRlID09IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSkpIHsNCi0gICAgaWYgKChwRGF0YSA9PSBOVUxMKSAmJiAoTGVuZ3RoID4gMFUpKSB7DQotICAgICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gICAgfSBlbHNlIHsNCi0gICAgICBUSU1fQ0hBTk5FTF9TVEFURV9TRVQoaHRpbSwgQ2hhbm5lbCwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX0JVU1kpOw0KLSAgICAgIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIENoYW5uZWwsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKTsNCi0gICAgfQ0KLSAgfSBlbHNlIHsNCi0gICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gIH0NCi0NCi0gIC8qIEVuYWJsZSB0aGUgSW5wdXQgQ2FwdHVyZSBjaGFubmVsICovDQotICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCwgVElNX0NDeF9FTkFCTEUpOw0KLQ0KLSAgc3dpdGNoIChDaGFubmVsKSB7DQotICAgIGNhc2UgVElNX0NIQU5ORUxfMTogew0KLSAgICAgIC8qIFNldCB0aGUgRE1BIGNhcHR1cmUgY2FsbGJhY2tzICovDQotICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BQ2FwdHVyZUNwbHQ7DQotICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gVElNX0RNQUNhcHR1cmVIYWxmQ3BsdDsNCi0NCi0gICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLw0KLSAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvcjsNCi0NCi0gICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovDQotICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+Q0NSMSwgKHVpbnQzMl90KXBEYXRhLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIExlbmd0aCkgIT0gSEFMX09LKSB7DQotICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovDQotICAgICAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgICAgIH0NCi0gICAgICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMSBETUEgcmVxdWVzdCAqLw0KLSAgICAgIF9fSEFMX1RJTV9FTkFCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MxKTsNCi0gICAgICBicmVhazsNCi0gICAgfQ0KLQ0KLSAgICBjYXNlIFRJTV9DSEFOTkVMXzI6IHsNCi0gICAgICAvKiBTZXQgdGhlIERNQSBjYXB0dXJlIGNhbGxiYWNrcyAqLw0KLSAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQUNhcHR1cmVDcGx0Ow0KLSAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFRJTV9ETUFDYXB0dXJlSGFsZkNwbHQ7DQotDQotICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8NCi0gICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3I7DQotDQotICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLw0KLSAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkNDUjIsICh1aW50MzJfdClwRGF0YSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBMZW5ndGgpICE9IEhBTF9PSykgew0KLSAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLw0KLSAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gICAgICB9DQotICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDIgIERNQSByZXF1ZXN0ICovDQotICAgICAgX19IQUxfVElNX0VOQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzIpOw0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotDQotICAgIGNhc2UgVElNX0NIQU5ORUxfMzogew0KLSAgICAgIC8qIFNldCB0aGUgRE1BIGNhcHR1cmUgY2FsbGJhY2tzICovDQotICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BQ2FwdHVyZUNwbHQ7DQotICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gVElNX0RNQUNhcHR1cmVIYWxmQ3BsdDsNCi0NCi0gICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLw0KLSAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvcjsNCi0NCi0gICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovDQotICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+Q0NSMywgKHVpbnQzMl90KXBEYXRhLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIExlbmd0aCkgIT0gSEFMX09LKSB7DQotICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovDQotICAgICAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgICAgIH0NCi0gICAgICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMyAgRE1BIHJlcXVlc3QgKi8NCi0gICAgICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMyk7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0NCi0gICAgY2FzZSBUSU1fQ0hBTk5FTF80OiB7DQotICAgICAgLyogU2V0IHRoZSBETUEgY2FwdHVyZSBjYWxsYmFja3MgKi8NCi0gICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFDYXB0dXJlQ3BsdDsNCi0gICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BQ2FwdHVyZUhhbGZDcGx0Ow0KLQ0KLSAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovDQotICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDNF0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yOw0KLQ0KLSAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8NCi0gICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5DQ1I0LCAodWludDMyX3QpcERhdGEsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVuZ3RoKSAhPSBIQUxfT0spIHsNCi0gICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8NCi0gICAgICAgIHJldHVybiBIQUxfRVJST1I7DQotICAgICAgfQ0KLSAgICAgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSA0ICBETUEgcmVxdWVzdCAqLw0KLSAgICAgIF9fSEFMX1RJTV9FTkFCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0M0KTsNCi0gICAgICBicmVhazsNCi0gICAgfQ0KLQ0KLSAgICBkZWZhdWx0Og0KLSAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsNCi0gICAgICBicmVhazsNCi0gIH0NCi0NCi0gIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCwgZXhjZXB0IGluIHRyaWdnZXIgbW9kZSB3aGVyZSBlbmFibGUgaXMgYXV0b21hdGljYWxseQ0KLSAgICogZG9uZSB3aXRoIHRyaWdnZXIgKi8NCi0gIGlmIChJU19USU1fU0xBVkVfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKSB7DQotICAgIHRtcHNtY3IgPSBodGltLT5JbnN0YW5jZS0+U01DUiAmIFRJTV9TTUNSX1NNUzsNCi0gICAgaWYgKCFJU19USU1fU0xBVkVNT0RFX1RSSUdHRVJfRU5BQkxFRCh0bXBzbWNyKSkgew0KLSAgICAgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7DQotICAgIH0NCi0gIH0gZWxzZSB7DQotICAgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7DQotICB9DQotDQotICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovDQotICByZXR1cm4gc3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFN0b3BzIHRoZSBUSU0gSW5wdXQgQ2FwdHVyZSBtZWFzdXJlbWVudCBpbiBETUEgbW9kZS4NCi0gKiBAcGFyYW0gIGh0aW0gVElNIElucHV0IENhcHR1cmUgaGFuZGxlDQotICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVscyB0byBiZSBkaXNhYmxlZA0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0lDX1N0b3BfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCkgew0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fQ0NYX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0RNQV9DQ19JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOw0KLQ0KLSAgLyogRGlzYWJsZSB0aGUgSW5wdXQgQ2FwdHVyZSBjaGFubmVsICovDQotICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCwgVElNX0NDeF9ESVNBQkxFKTsNCi0NCi0gIHN3aXRjaCAoQ2hhbm5lbCkgew0KLSAgICBjYXNlIFRJTV9DSEFOTkVMXzE6IHsNCi0gICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDEgRE1BIHJlcXVlc3QgKi8NCi0gICAgICBfX0hBTF9USU1fRElTQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzEpOw0KLSAgICAgICh2b2lkKUhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0pOw0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotDQotICAgIGNhc2UgVElNX0NIQU5ORUxfMjogew0KLSAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMiBETUEgcmVxdWVzdCAqLw0KLSAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMik7DQotICAgICAgKHZvaWQpSEFMX0RNQV9BYm9ydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXSk7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0NCi0gICAgY2FzZSBUSU1fQ0hBTk5FTF8zOiB7DQotICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAzICBETUEgcmVxdWVzdCAqLw0KLSAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMyk7DQotICAgICAgKHZvaWQpSEFMX0RNQV9BYm9ydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXSk7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0NCi0gICAgY2FzZSBUSU1fQ0hBTk5FTF80OiB7DQotICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSA0ICBETUEgcmVxdWVzdCAqLw0KLSAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBUSU1fRE1BX0NDNCk7DQotICAgICAgKHZvaWQpSEFMX0RNQV9BYm9ydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XSk7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0NCi0gICAgZGVmYXVsdDoNCi0gICAgICBzdGF0dXMgPSBIQUxfRVJST1I7DQotICAgICAgYnJlYWs7DQotICB9DQotDQotICBpZiAoc3RhdHVzID09IEhBTF9PSykgew0KLSAgICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovDQotICAgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOw0KLQ0KLSAgICAvKiBTZXQgdGhlIFRJTSBjaGFubmVsIHN0YXRlICovDQotICAgIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBDaGFubmVsLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOw0KLSAgICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBDaGFubmVsLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOw0KLSAgfQ0KLQ0KLSAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLw0KLSAgcmV0dXJuIHN0YXR1czsNCi19DQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA1IFRJTSBPbmUgUHVsc2UgZnVuY3Rpb25zDQotICAqICBAYnJpZWYgICAgVElNIE9uZSBQdWxzZSBmdW5jdGlvbnMNCi0gICoNCi1AdmVyYmF0aW0NCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFRJTSBPbmUgUHVsc2UgZnVuY3Rpb25zICMjIyMjDQotICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gIFsuLl0NCi0gICAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoNCi0gICAgKCspIEluaXRpYWxpemUgYW5kIGNvbmZpZ3VyZSB0aGUgVElNIE9uZSBQdWxzZS4NCi0gICAgKCspIERlLWluaXRpYWxpemUgdGhlIFRJTSBPbmUgUHVsc2UuDQotICAgICgrKSBTdGFydCB0aGUgVElNIE9uZSBQdWxzZS4NCi0gICAgKCspIFN0b3AgdGhlIFRJTSBPbmUgUHVsc2UuDQotICAgICgrKSBTdGFydCB0aGUgVElNIE9uZSBQdWxzZSBhbmQgZW5hYmxlIGludGVycnVwdC4NCi0gICAgKCspIFN0b3AgdGhlIFRJTSBPbmUgUHVsc2UgYW5kIGRpc2FibGUgaW50ZXJydXB0Lg0KLSAgICAoKykgU3RhcnQgdGhlIFRJTSBPbmUgUHVsc2UgYW5kIGVuYWJsZSBETUEgdHJhbnNmZXIuDQotICAgICgrKSBTdG9wIHRoZSBUSU0gT25lIFB1bHNlIGFuZCBkaXNhYmxlIERNQSB0cmFuc2Zlci4NCi0NCi1AZW5kdmVyYmF0aW0NCi0gICogQHsNCi0gICovDQotLyoqDQotICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgVElNIE9uZSBQdWxzZSBUaW1lIEJhc2UgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQNCi0gKiAgICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIFRJTV9IYW5kbGVUeXBlRGVmIGFuZCBpbml0aWFsaXplcyB0aGUgYXNzb2NpYXRlZA0KLSAqIGhhbmRsZS4NCi0gKiBAbm90ZSAgIFN3aXRjaGluZyBmcm9tIENlbnRlciBBbGlnbmVkIGNvdW50ZXIgbW9kZSB0byBFZGdlIGNvdW50ZXIgbW9kZSAob3INCi0gKiByZXZlcnNlKSByZXF1aXJlcyBhIHRpbWVyIHJlc2V0IHRvIGF2b2lkIHVuZXhwZWN0ZWQgZGlyZWN0aW9uIGR1ZSB0byBESVIgYml0DQotICogcmVhZG9ubHkgaW4gY2VudGVyIGFsaWduZWQgbW9kZS4gRXg6IGNhbGwgQHJlZiBIQUxfVElNX09uZVB1bHNlX0RlSW5pdCgpDQotICogYmVmb3JlIEhBTF9USU1fT25lUHVsc2VfSW5pdCgpDQotICogQG5vdGUgICBXaGVuIHRoZSB0aW1lciBpbnN0YW5jZSBpcyBpbml0aWFsaXplZCBpbiBPbmUgUHVsc2UgbW9kZSwgdGltZXINCi0gKiAgICAgICAgIGNoYW5uZWxzIDEgYW5kIGNoYW5uZWwgMiBhcmUgcmVzZXJ2ZWQgYW5kIGNhbm5vdCBiZSB1c2VkIGZvciBvdGhlcg0KLSAqICAgICAgICAgcHVycG9zZS4NCi0gKiBAcGFyYW0gIGh0aW0gVElNIE9uZSBQdWxzZSBoYW5kbGUNCi0gKiBAcGFyYW0gIE9uZVB1bHNlTW9kZSBTZWxlY3QgdGhlIE9uZSBwdWxzZSBtb2RlLg0KLSAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX09QTU9ERV9TSU5HTEU6IE9ubHkgb25lIHB1bHNlIHdpbGwgYmUgZ2VuZXJhdGVkLg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fT1BNT0RFX1JFUEVUSVRJVkU6IFJlcGV0aXRpdmUgcHVsc2VzIHdpbGwgYmUgZ2VuZXJhdGVkLg0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT25lUHVsc2VfSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgT25lUHVsc2VNb2RlKSB7DQotICAvKiBDaGVjayB0aGUgVElNIGhhbmRsZSBhbGxvY2F0aW9uICovDQotICBpZiAoaHRpbSA9PSBOVUxMKSB7DQotICAgIHJldHVybiBIQUxfRVJST1I7DQotICB9DQotDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DT1VOVEVSX01PREUoaHRpbS0+SW5pdC5Db3VudGVyTW9kZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTE9DS0RJVklTSU9OX0RJVihodGltLT5Jbml0LkNsb2NrRGl2aXNpb24pKTsNCi0gIGFzc2VydF9wYXJhbShJU19USU1fT1BNX01PREUoT25lUHVsc2VNb2RlKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0FVVE9SRUxPQURfUFJFTE9BRChodGltLT5Jbml0LkF1dG9SZWxvYWRQcmVsb2FkKSk7DQotDQotICBpZiAoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9SRVNFVCkgew0KLSAgICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovDQotICAgIGh0aW0tPkxvY2sgPSBIQUxfVU5MT0NLRUQ7DQotDQotI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkNCi0gICAgLyogUmVzZXQgaW50ZXJydXB0IGNhbGxiYWNrcyB0byBsZWdhY3kgd2VhayBjYWxsYmFja3MgKi8NCi0gICAgVElNX1Jlc2V0Q2FsbGJhY2soaHRpbSk7DQotDQotICAgIGlmIChodGltLT5PbmVQdWxzZV9Nc3BJbml0Q2FsbGJhY2sgPT0gTlVMTCkgew0KLSAgICAgIGh0aW0tPk9uZVB1bHNlX01zcEluaXRDYWxsYmFjayA9IEhBTF9USU1fT25lUHVsc2VfTXNwSW5pdDsNCi0gICAgfQ0KLSAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgOiBHUElPLCBDTE9DSywgTlZJQyAqLw0KLSAgICBodGltLT5PbmVQdWxzZV9Nc3BJbml0Q2FsbGJhY2soaHRpbSk7DQotI2Vsc2UNCi0gICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIDogR1BJTywgQ0xPQ0ssIE5WSUMgYW5kIERNQSAqLw0KLSAgICBIQUxfVElNX09uZVB1bHNlX01zcEluaXQoaHRpbSk7DQotI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLSAgfQ0KLQ0KLSAgLyogU2V0IHRoZSBUSU0gc3RhdGUgKi8NCi0gIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOw0KLQ0KLSAgLyogQ29uZmlndXJlIHRoZSBUaW1lIGJhc2UgaW4gdGhlIE9uZSBQdWxzZSBNb2RlICovDQotICBUSU1fQmFzZV9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsICZodGltLT5Jbml0KTsNCi0NCi0gIC8qIFJlc2V0IHRoZSBPUE0gQml0ICovDQotICBodGltLT5JbnN0YW5jZS0+Q1IxICY9IH5USU1fQ1IxX09QTTsNCi0NCi0gIC8qIENvbmZpZ3VyZSB0aGUgT1BNIE1vZGUgKi8NCi0gIGh0aW0tPkluc3RhbmNlLT5DUjEgfD0gT25lUHVsc2VNb2RlOw0KLQ0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgRE1BIGJ1cnN0IG9wZXJhdGlvbiBzdGF0ZSAqLw0KLSAgaHRpbS0+RE1BQnVyc3RTdGF0ZSA9IEhBTF9ETUFfQlVSU1RfU1RBVEVfUkVBRFk7DQotDQotICAvKiBJbml0aWFsaXplIHRoZSBUSU0gY2hhbm5lbHMgc3RhdGUgKi8NCi0gIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8xLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOw0KLSAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7DQotICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8xLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOw0KLSAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMiwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsNCi0NCi0gIC8qIEluaXRpYWxpemUgdGhlIFRJTSBzdGF0ZSovDQotICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7DQotDQotICByZXR1cm4gSEFMX09LOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERlSW5pdGlhbGl6ZXMgdGhlIFRJTSBPbmUgUHVsc2UNCi0gKiBAcGFyYW0gIGh0aW0gVElNIE9uZSBQdWxzZSBoYW5kbGUNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09uZVB1bHNlX0RlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkgew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsNCi0NCi0gIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOw0KLQ0KLSAgLyogRGlzYWJsZSB0aGUgVElNIFBlcmlwaGVyYWwgQ2xvY2sgKi8NCi0gIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOw0KLQ0KLSNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpDQotICBpZiAoaHRpbS0+T25lUHVsc2VfTXNwRGVJbml0Q2FsbGJhY2sgPT0gTlVMTCkgew0KLSAgICBodGltLT5PbmVQdWxzZV9Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9USU1fT25lUHVsc2VfTXNwRGVJbml0Ow0KLSAgfQ0KLSAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8NCi0gIGh0aW0tPk9uZVB1bHNlX01zcERlSW5pdENhbGxiYWNrKGh0aW0pOw0KLSNlbHNlDQotICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZTogR1BJTywgQ0xPQ0ssIE5WSUMgKi8NCi0gIEhBTF9USU1fT25lUHVsc2VfTXNwRGVJbml0KGh0aW0pOw0KLSNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi0NCi0gIC8qIENoYW5nZSB0aGUgRE1BIGJ1cnN0IG9wZXJhdGlvbiBzdGF0ZSAqLw0KLSAgaHRpbS0+RE1BQnVyc3RTdGF0ZSA9IEhBTF9ETUFfQlVSU1RfU1RBVEVfUkVTRVQ7DQotDQotICAvKiBTZXQgdGhlIFRJTSBjaGFubmVsIHN0YXRlICovDQotICBUSU1fQ0hBTk5FTF9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMSwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFU0VUKTsNCi0gIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8yLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVTRVQpOw0KLSAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMSwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFU0VUKTsNCi0gIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRVNFVCk7DQotDQotICAvKiBDaGFuZ2UgVElNIHN0YXRlICovDQotICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVTRVQ7DQotDQotICAvKiBSZWxlYXNlIExvY2sgKi8NCi0gIF9fSEFMX1VOTE9DSyhodGltKTsNCi0NCi0gIHJldHVybiBIQUxfT0s7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFRJTSBPbmUgUHVsc2UgTVNQLg0KLSAqIEBwYXJhbSAgaHRpbSBUSU0gT25lIFB1bHNlIGhhbmRsZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fd2VhayB2b2lkIEhBTF9USU1fT25lUHVsc2VfTXNwSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkgew0KLSAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLw0KLSAgVU5VU0VEKGh0aW0pOw0KLQ0KLSAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLA0KLSAgICAgICAgICAgIHRoZSBIQUxfVElNX09uZVB1bHNlX01zcEluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQ0KLSAgICovDQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGVJbml0aWFsaXplcyBUSU0gT25lIFB1bHNlIE1TUC4NCi0gKiBAcGFyYW0gIGh0aW0gVElNIE9uZSBQdWxzZSBoYW5kbGUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX3dlYWsgdm9pZCBIQUxfVElNX09uZVB1bHNlX01zcERlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkgew0KLSAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLw0KLSAgVU5VU0VEKGh0aW0pOw0KLQ0KLSAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLA0KLSAgICAgICAgICAgIHRoZSBIQUxfVElNX09uZVB1bHNlX01zcERlSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlDQotICAgKi8NCi19DQotDQotLyoqDQotICogQGJyaWVmICBTdGFydHMgdGhlIFRJTSBPbmUgUHVsc2Ugc2lnbmFsIGdlbmVyYXRpb24uDQotICogQG5vdGUgVGhvdWdoIE91dHB1dENoYW5uZWwgcGFyYW1ldGVyIGlzIGRlcHJlY2F0ZWQgYW5kIGlnbm9yZWQgYnkgdGhlDQotICogZnVuY3Rpb24gaXQgaGFzIGJlZW4ga2VwdCB0byBhdm9pZCBIQUxfVElNIEFQSSBjb21wYXRpYmlsaXR5IGJyZWFrLg0KLSAqIEBub3RlIFRoZSBwdWxzZSBvdXRwdXQgY2hhbm5lbCBpcyBkZXRlcm1pbmVkIHdoZW4gY2FsbGluZw0KLSAqICAgICAgIEByZWYgSEFMX1RJTV9PbmVQdWxzZV9Db25maWdDaGFubmVsKCkuDQotICogQHBhcmFtICBodGltIFRJTSBPbmUgUHVsc2UgaGFuZGxlDQotICogQHBhcmFtICBPdXRwdXRDaGFubmVsIFNlZSBub3RlIGFib3ZlDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PbmVQdWxzZV9TdGFydChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE91dHB1dENoYW5uZWwpIHsNCi0gIEhBTF9USU1fQ2hhbm5lbFN0YXRlVHlwZURlZiBjaGFubmVsXzFfc3RhdGUgPQ0KLSAgICAgIFRJTV9DSEFOTkVMX1NUQVRFX0dFVChodGltLCBUSU1fQ0hBTk5FTF8xKTsNCi0gIEhBTF9USU1fQ2hhbm5lbFN0YXRlVHlwZURlZiBjaGFubmVsXzJfc3RhdGUgPQ0KLSAgICAgIFRJTV9DSEFOTkVMX1NUQVRFX0dFVChodGltLCBUSU1fQ0hBTk5FTF8yKTsNCi0gIEhBTF9USU1fQ2hhbm5lbFN0YXRlVHlwZURlZiBjb21wbGVtZW50YXJ5X2NoYW5uZWxfMV9zdGF0ZSA9DQotICAgICAgVElNX0NIQU5ORUxfTl9TVEFURV9HRVQoaHRpbSwgVElNX0NIQU5ORUxfMSk7DQotICBIQUxfVElNX0NoYW5uZWxTdGF0ZVR5cGVEZWYgY29tcGxlbWVudGFyeV9jaGFubmVsXzJfc3RhdGUgPQ0KLSAgICAgIFRJTV9DSEFOTkVMX05fU1RBVEVfR0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIpOw0KLQ0KLSAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLw0KLSAgVU5VU0VEKE91dHB1dENoYW5uZWwpOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIFRJTSBjaGFubmVscyBzdGF0ZSAqLw0KLSAgaWYgKChjaGFubmVsXzFfc3RhdGUgIT0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKSB8fA0KLSAgICAgIChjaGFubmVsXzJfc3RhdGUgIT0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKSB8fA0KLSAgICAgIChjb21wbGVtZW50YXJ5X2NoYW5uZWxfMV9zdGF0ZSAhPSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpIHx8DQotICAgICAgKGNvbXBsZW1lbnRhcnlfY2hhbm5lbF8yX3N0YXRlICE9IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSkpIHsNCi0gICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gIH0NCi0NCi0gIC8qIFNldCB0aGUgVElNIGNoYW5uZWxzIHN0YXRlICovDQotICBUSU1fQ0hBTk5FTF9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMSwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX0JVU1kpOw0KLSAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKTsNCi0gIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKTsNCi0gIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKTsNCi0NCi0gIC8qIEVuYWJsZSB0aGUgQ2FwdHVyZSBjb21wYXJlIGFuZCB0aGUgSW5wdXQgQ2FwdHVyZSBjaGFubmVscw0KLSAgICAoaW4gdGhlIE9QTSBNb2RlIHRoZSB0d28gcG9zc2libGUgY2hhbm5lbHMgdGhhdCBjYW4gYmUgdXNlZCBhcmUNCi0gICAgVElNX0NIQU5ORUxfMSBhbmQgVElNX0NIQU5ORUxfMikgaWYgVElNX0NIQU5ORUxfMSBpcyB1c2VkIGFzIG91dHB1dCwgdGhlDQotICAgIFRJTV9DSEFOTkVMXzIgd2lsbCBiZSB1c2VkIGFzIGlucHV0IGFuZCBpZiBUSU1fQ0hBTk5FTF8xIGlzIHVzZWQgYXMgaW5wdXQsDQotICAgIHRoZSBUSU1fQ0hBTk5FTF8yIHdpbGwgYmUgdXNlZCBhcyBvdXRwdXQgd2hhdGV2ZXIgdGhlIGNvbWJpbmF0aW9uLCB0aGUNCi0gICAgVElNX0NIQU5ORUxfMSBhbmQgVElNX0NIQU5ORUxfMiBzaG91bGQgYmUgZW5hYmxlZCB0b2dldGhlcg0KLQ0KLSAgICBObyBuZWVkIHRvIGVuYWJsZSB0aGUgY291bnRlciwgaXQncyBlbmFibGVkIGF1dG9tYXRpY2FsbHkgYnkgaGFyZHdhcmUNCi0gICAgKHRoZSBjb3VudGVyIHN0YXJ0cyBpbiByZXNwb25zZSB0byBhIHN0aW11bHVzIGFuZCBnZW5lcmF0ZSBhIHB1bHNlICovDQotDQotICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMSwgVElNX0NDeF9FTkFCTEUpOw0KLSAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzIsIFRJTV9DQ3hfRU5BQkxFKTsNCi0NCi0gIGlmIChJU19USU1fQlJFQUtfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpICE9IFJFU0VUKSB7DQotICAgIC8qIEVuYWJsZSB0aGUgbWFpbiBvdXRwdXQgKi8NCi0gICAgX19IQUxfVElNX01PRV9FTkFCTEUoaHRpbSk7DQotICB9DQotDQotICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovDQotICByZXR1cm4gSEFMX09LOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFN0b3BzIHRoZSBUSU0gT25lIFB1bHNlIHNpZ25hbCBnZW5lcmF0aW9uLg0KLSAqIEBub3RlIFRob3VnaCBPdXRwdXRDaGFubmVsIHBhcmFtZXRlciBpcyBkZXByZWNhdGVkIGFuZCBpZ25vcmVkIGJ5IHRoZQ0KLSAqIGZ1bmN0aW9uIGl0IGhhcyBiZWVuIGtlcHQgdG8gYXZvaWQgSEFMX1RJTSBBUEkgY29tcGF0aWJpbGl0eSBicmVhay4NCi0gKiBAbm90ZSBUaGUgcHVsc2Ugb3V0cHV0IGNoYW5uZWwgaXMgZGV0ZXJtaW5lZCB3aGVuIGNhbGxpbmcNCi0gKiAgICAgICBAcmVmIEhBTF9USU1fT25lUHVsc2VfQ29uZmlnQ2hhbm5lbCgpLg0KLSAqIEBwYXJhbSAgaHRpbSBUSU0gT25lIFB1bHNlIGhhbmRsZQ0KLSAqIEBwYXJhbSAgT3V0cHV0Q2hhbm5lbCBTZWUgbm90ZSBhYm92ZQ0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT25lUHVsc2VfU3RvcChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgT3V0cHV0Q2hhbm5lbCkgew0KLSAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLw0KLSAgVU5VU0VEKE91dHB1dENoYW5uZWwpOw0KLQ0KLSAgLyogRGlzYWJsZSB0aGUgQ2FwdHVyZSBjb21wYXJlIGFuZCB0aGUgSW5wdXQgQ2FwdHVyZSBjaGFubmVscw0KLSAgKGluIHRoZSBPUE0gTW9kZSB0aGUgdHdvIHBvc3NpYmxlIGNoYW5uZWxzIHRoYXQgY2FuIGJlIHVzZWQgYXJlIFRJTV9DSEFOTkVMXzENCi0gIGFuZCBUSU1fQ0hBTk5FTF8yKSBpZiBUSU1fQ0hBTk5FTF8xIGlzIHVzZWQgYXMgb3V0cHV0LCB0aGUgVElNX0NIQU5ORUxfMiB3aWxsDQotICBiZSB1c2VkIGFzIGlucHV0IGFuZCBpZiBUSU1fQ0hBTk5FTF8xIGlzIHVzZWQgYXMgaW5wdXQsIHRoZSBUSU1fQ0hBTk5FTF8yIHdpbGwNCi0gIGJlIHVzZWQgYXMgb3V0cHV0IHdoYXRldmVyIHRoZSBjb21iaW5hdGlvbiwgdGhlIFRJTV9DSEFOTkVMXzEgYW5kDQotICBUSU1fQ0hBTk5FTF8yIHNob3VsZCBiZSBkaXNhYmxlZCB0b2dldGhlciAqLw0KLQ0KLSAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzEsIFRJTV9DQ3hfRElTQUJMRSk7DQotICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMiwgVElNX0NDeF9ESVNBQkxFKTsNCi0NCi0gIGlmIChJU19USU1fQlJFQUtfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpICE9IFJFU0VUKSB7DQotICAgIC8qIERpc2FibGUgdGhlIE1haW4gT3V0cHV0ICovDQotICAgIF9fSEFMX1RJTV9NT0VfRElTQUJMRShodGltKTsNCi0gIH0NCi0NCi0gIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8NCi0gIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOw0KLQ0KLSAgLyogU2V0IHRoZSBUSU0gY2hhbm5lbHMgc3RhdGUgKi8NCi0gIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8xLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOw0KLSAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7DQotICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8xLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOw0KLSAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMiwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsNCi0NCi0gIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8NCi0gIHJldHVybiBIQUxfT0s7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU3RhcnRzIHRoZSBUSU0gT25lIFB1bHNlIHNpZ25hbCBnZW5lcmF0aW9uIGluIGludGVycnVwdCBtb2RlLg0KLSAqIEBub3RlIFRob3VnaCBPdXRwdXRDaGFubmVsIHBhcmFtZXRlciBpcyBkZXByZWNhdGVkIGFuZCBpZ25vcmVkIGJ5IHRoZQ0KLSAqIGZ1bmN0aW9uIGl0IGhhcyBiZWVuIGtlcHQgdG8gYXZvaWQgSEFMX1RJTSBBUEkgY29tcGF0aWJpbGl0eSBicmVhay4NCi0gKiBAbm90ZSBUaGUgcHVsc2Ugb3V0cHV0IGNoYW5uZWwgaXMgZGV0ZXJtaW5lZCB3aGVuIGNhbGxpbmcNCi0gKiAgICAgICBAcmVmIEhBTF9USU1fT25lUHVsc2VfQ29uZmlnQ2hhbm5lbCgpLg0KLSAqIEBwYXJhbSAgaHRpbSBUSU0gT25lIFB1bHNlIGhhbmRsZQ0KLSAqIEBwYXJhbSAgT3V0cHV0Q2hhbm5lbCBTZWUgbm90ZSBhYm92ZQ0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT25lUHVsc2VfU3RhcnRfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBPdXRwdXRDaGFubmVsKSB7DQotICBIQUxfVElNX0NoYW5uZWxTdGF0ZVR5cGVEZWYgY2hhbm5lbF8xX3N0YXRlID0NCi0gICAgICBUSU1fQ0hBTk5FTF9TVEFURV9HRVQoaHRpbSwgVElNX0NIQU5ORUxfMSk7DQotICBIQUxfVElNX0NoYW5uZWxTdGF0ZVR5cGVEZWYgY2hhbm5lbF8yX3N0YXRlID0NCi0gICAgICBUSU1fQ0hBTk5FTF9TVEFURV9HRVQoaHRpbSwgVElNX0NIQU5ORUxfMik7DQotICBIQUxfVElNX0NoYW5uZWxTdGF0ZVR5cGVEZWYgY29tcGxlbWVudGFyeV9jaGFubmVsXzFfc3RhdGUgPQ0KLSAgICAgIFRJTV9DSEFOTkVMX05fU1RBVEVfR0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEpOw0KLSAgSEFMX1RJTV9DaGFubmVsU3RhdGVUeXBlRGVmIGNvbXBsZW1lbnRhcnlfY2hhbm5lbF8yX3N0YXRlID0NCi0gICAgICBUSU1fQ0hBTk5FTF9OX1NUQVRFX0dFVChodGltLCBUSU1fQ0hBTk5FTF8yKTsNCi0NCi0gIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8NCi0gIFVOVVNFRChPdXRwdXRDaGFubmVsKTsNCi0NCi0gIC8qIENoZWNrIHRoZSBUSU0gY2hhbm5lbHMgc3RhdGUgKi8NCi0gIGlmICgoY2hhbm5lbF8xX3N0YXRlICE9IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSkgfHwNCi0gICAgICAoY2hhbm5lbF8yX3N0YXRlICE9IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSkgfHwNCi0gICAgICAoY29tcGxlbWVudGFyeV9jaGFubmVsXzFfc3RhdGUgIT0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKSB8fA0KLSAgICAgIChjb21wbGVtZW50YXJ5X2NoYW5uZWxfMl9zdGF0ZSAhPSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpKSB7DQotICAgIHJldHVybiBIQUxfRVJST1I7DQotICB9DQotDQotICAvKiBTZXQgdGhlIFRJTSBjaGFubmVscyBzdGF0ZSAqLw0KLSAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKTsNCi0gIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8yLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSk7DQotICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8xLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSk7DQotICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8yLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSk7DQotDQotICAvKiBFbmFibGUgdGhlIENhcHR1cmUgY29tcGFyZSBhbmQgdGhlIElucHV0IENhcHR1cmUgY2hhbm5lbHMNCi0gICAgKGluIHRoZSBPUE0gTW9kZSB0aGUgdHdvIHBvc3NpYmxlIGNoYW5uZWxzIHRoYXQgY2FuIGJlIHVzZWQgYXJlDQotICAgIFRJTV9DSEFOTkVMXzEgYW5kIFRJTV9DSEFOTkVMXzIpIGlmIFRJTV9DSEFOTkVMXzEgaXMgdXNlZCBhcyBvdXRwdXQsIHRoZQ0KLSAgICBUSU1fQ0hBTk5FTF8yIHdpbGwgYmUgdXNlZCBhcyBpbnB1dCBhbmQgaWYgVElNX0NIQU5ORUxfMSBpcyB1c2VkIGFzIGlucHV0LA0KLSAgICB0aGUgVElNX0NIQU5ORUxfMiB3aWxsIGJlIHVzZWQgYXMgb3V0cHV0IHdoYXRldmVyIHRoZSBjb21iaW5hdGlvbiwgdGhlDQotICAgIFRJTV9DSEFOTkVMXzEgYW5kIFRJTV9DSEFOTkVMXzIgc2hvdWxkIGJlIGVuYWJsZWQgdG9nZXRoZXINCi0NCi0gICAgTm8gbmVlZCB0byBlbmFibGUgdGhlIGNvdW50ZXIsIGl0J3MgZW5hYmxlZCBhdXRvbWF0aWNhbGx5IGJ5IGhhcmR3YXJlDQotICAgICh0aGUgY291bnRlciBzdGFydHMgaW4gcmVzcG9uc2UgdG8gYSBzdGltdWx1cyBhbmQgZ2VuZXJhdGUgYSBwdWxzZSAqLw0KLQ0KLSAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDEgaW50ZXJydXB0ICovDQotICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzEpOw0KLQ0KLSAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDIgaW50ZXJydXB0ICovDQotICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzIpOw0KLQ0KLSAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzEsIFRJTV9DQ3hfRU5BQkxFKTsNCi0gIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8yLCBUSU1fQ0N4X0VOQUJMRSk7DQotDQotICBpZiAoSVNfVElNX0JSRUFLX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSAhPSBSRVNFVCkgew0KLSAgICAvKiBFbmFibGUgdGhlIG1haW4gb3V0cHV0ICovDQotICAgIF9fSEFMX1RJTV9NT0VfRU5BQkxFKGh0aW0pOw0KLSAgfQ0KLQ0KLSAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLw0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTdG9wcyB0aGUgVElNIE9uZSBQdWxzZSBzaWduYWwgZ2VuZXJhdGlvbiBpbiBpbnRlcnJ1cHQgbW9kZS4NCi0gKiBAbm90ZSBUaG91Z2ggT3V0cHV0Q2hhbm5lbCBwYXJhbWV0ZXIgaXMgZGVwcmVjYXRlZCBhbmQgaWdub3JlZCBieSB0aGUNCi0gKiBmdW5jdGlvbiBpdCBoYXMgYmVlbiBrZXB0IHRvIGF2b2lkIEhBTF9USU0gQVBJIGNvbXBhdGliaWxpdHkgYnJlYWsuDQotICogQG5vdGUgVGhlIHB1bHNlIG91dHB1dCBjaGFubmVsIGlzIGRldGVybWluZWQgd2hlbiBjYWxsaW5nDQotICogICAgICAgQHJlZiBIQUxfVElNX09uZVB1bHNlX0NvbmZpZ0NoYW5uZWwoKS4NCi0gKiBAcGFyYW0gIGh0aW0gVElNIE9uZSBQdWxzZSBoYW5kbGUNCi0gKiBAcGFyYW0gIE91dHB1dENoYW5uZWwgU2VlIG5vdGUgYWJvdmUNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09uZVB1bHNlX1N0b3BfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE91dHB1dENoYW5uZWwpIHsNCi0gIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8NCi0gIFVOVVNFRChPdXRwdXRDaGFubmVsKTsNCi0NCi0gIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMSBpbnRlcnJ1cHQgKi8NCi0gIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzEpOw0KLQ0KLSAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAyIGludGVycnVwdCAqLw0KLSAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDMik7DQotDQotICAvKiBEaXNhYmxlIHRoZSBDYXB0dXJlIGNvbXBhcmUgYW5kIHRoZSBJbnB1dCBDYXB0dXJlIGNoYW5uZWxzDQotICAoaW4gdGhlIE9QTSBNb2RlIHRoZSB0d28gcG9zc2libGUgY2hhbm5lbHMgdGhhdCBjYW4gYmUgdXNlZCBhcmUgVElNX0NIQU5ORUxfMQ0KLSAgYW5kIFRJTV9DSEFOTkVMXzIpIGlmIFRJTV9DSEFOTkVMXzEgaXMgdXNlZCBhcyBvdXRwdXQsIHRoZSBUSU1fQ0hBTk5FTF8yIHdpbGwNCi0gIGJlIHVzZWQgYXMgaW5wdXQgYW5kIGlmIFRJTV9DSEFOTkVMXzEgaXMgdXNlZCBhcyBpbnB1dCwgdGhlIFRJTV9DSEFOTkVMXzIgd2lsbA0KLSAgYmUgdXNlZCBhcyBvdXRwdXQgd2hhdGV2ZXIgdGhlIGNvbWJpbmF0aW9uLCB0aGUgVElNX0NIQU5ORUxfMSBhbmQNCi0gIFRJTV9DSEFOTkVMXzIgc2hvdWxkIGJlIGRpc2FibGVkIHRvZ2V0aGVyICovDQotICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMSwgVElNX0NDeF9ESVNBQkxFKTsNCi0gIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8yLCBUSU1fQ0N4X0RJU0FCTEUpOw0KLQ0KLSAgaWYgKElTX1RJTV9CUkVBS19JTlNUQU5DRShodGltLT5JbnN0YW5jZSkgIT0gUkVTRVQpIHsNCi0gICAgLyogRGlzYWJsZSB0aGUgTWFpbiBPdXRwdXQgKi8NCi0gICAgX19IQUxfVElNX01PRV9ESVNBQkxFKGh0aW0pOw0KLSAgfQ0KLQ0KLSAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLw0KLSAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7DQotDQotICAvKiBTZXQgdGhlIFRJTSBjaGFubmVscyBzdGF0ZSAqLw0KLSAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7DQotICBUSU1fQ0hBTk5FTF9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMiwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsNCi0gIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7DQotICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8yLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOw0KLQ0KLSAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLw0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA2IFRJTSBFbmNvZGVyIGZ1bmN0aW9ucw0KLSAgKiAgQGJyaWVmICAgIFRJTSBFbmNvZGVyIGZ1bmN0aW9ucw0KLSAgKg0KLUB2ZXJiYXRpbQ0KLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBUSU0gRW5jb2RlciBmdW5jdGlvbnMgIyMjIyMNCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgWy4uXQ0KLSAgICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOg0KLSAgICAoKykgSW5pdGlhbGl6ZSBhbmQgY29uZmlndXJlIHRoZSBUSU0gRW5jb2Rlci4NCi0gICAgKCspIERlLWluaXRpYWxpemUgdGhlIFRJTSBFbmNvZGVyLg0KLSAgICAoKykgU3RhcnQgdGhlIFRJTSBFbmNvZGVyLg0KLSAgICAoKykgU3RvcCB0aGUgVElNIEVuY29kZXIuDQotICAgICgrKSBTdGFydCB0aGUgVElNIEVuY29kZXIgYW5kIGVuYWJsZSBpbnRlcnJ1cHQuDQotICAgICgrKSBTdG9wIHRoZSBUSU0gRW5jb2RlciBhbmQgZGlzYWJsZSBpbnRlcnJ1cHQuDQotICAgICgrKSBTdGFydCB0aGUgVElNIEVuY29kZXIgYW5kIGVuYWJsZSBETUEgdHJhbnNmZXIuDQotICAgICgrKSBTdG9wIHRoZSBUSU0gRW5jb2RlciBhbmQgZGlzYWJsZSBETUEgdHJhbnNmZXIuDQotDQotQGVuZHZlcmJhdGltDQotICAqIEB7DQotICAqLw0KLS8qKg0KLSAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFRJTSBFbmNvZGVyIEludGVyZmFjZSBhbmQgaW5pdGlhbGl6ZSB0aGUgYXNzb2NpYXRlZA0KLSAqIGhhbmRsZS4NCi0gKiBAbm90ZSAgIFN3aXRjaGluZyBmcm9tIENlbnRlciBBbGlnbmVkIGNvdW50ZXIgbW9kZSB0byBFZGdlIGNvdW50ZXIgbW9kZSAob3INCi0gKiByZXZlcnNlKSByZXF1aXJlcyBhIHRpbWVyIHJlc2V0IHRvIGF2b2lkIHVuZXhwZWN0ZWQgZGlyZWN0aW9uIGR1ZSB0byBESVIgYml0DQotICogcmVhZG9ubHkgaW4gY2VudGVyIGFsaWduZWQgbW9kZS4gRXg6IGNhbGwgQHJlZiBIQUxfVElNX0VuY29kZXJfRGVJbml0KCkNCi0gKiBiZWZvcmUgSEFMX1RJTV9FbmNvZGVyX0luaXQoKQ0KLSAqIEBub3RlICAgRW5jb2RlciBtb2RlIGFuZCBFeHRlcm5hbCBjbG9jayBtb2RlIDIgYXJlIG5vdCBjb21wYXRpYmxlIGFuZCBtdXN0DQotICogbm90IGJlIHNlbGVjdGVkIHRvZ2V0aGVyIEV4OiBBIGNhbGwgZm9yIEByZWYgSEFMX1RJTV9FbmNvZGVyX0luaXQgd2lsbCBlcmFzZQ0KLSAqIHRoZSBzZXR0aW5ncyBvZiBAcmVmIEhBTF9USU1fQ29uZmlnQ2xvY2tTb3VyY2UgdXNpbmcgVElNX0NMT0NLU09VUkNFX0VUUk1PREUyDQotICogYW5kIHZpY2UgdmVyc2ENCi0gKiBAbm90ZSAgIFdoZW4gdGhlIHRpbWVyIGluc3RhbmNlIGlzIGluaXRpYWxpemVkIGluIEVuY29kZXIgbW9kZSwgdGltZXINCi0gKiAgICAgICAgIGNoYW5uZWxzIDEgYW5kIGNoYW5uZWwgMiBhcmUgcmVzZXJ2ZWQgYW5kIGNhbm5vdCBiZSB1c2VkIGZvciBvdGhlcg0KLSAqICAgICAgICAgcHVycG9zZS4NCi0gKiBAcGFyYW0gIGh0aW0gVElNIEVuY29kZXIgSW50ZXJmYWNlIGhhbmRsZQ0KLSAqIEBwYXJhbSAgc0NvbmZpZyBUSU0gRW5jb2RlciBJbnRlcmZhY2UgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0VuY29kZXJfSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fRW5jb2Rlcl9Jbml0VHlwZURlZiAqc0NvbmZpZykgew0KLSAgdWludDMyX3QgdG1wc21jcjsNCi0gIHVpbnQzMl90IHRtcGNjbXIxOw0KLSAgdWludDMyX3QgdG1wY2NlcjsNCi0NCi0gIC8qIENoZWNrIHRoZSBUSU0gaGFuZGxlIGFsbG9jYXRpb24gKi8NCi0gIGlmIChodGltID09IE5VTEwpIHsNCi0gICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gIH0NCi0NCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0VOQ09ERVJfSU5URVJGQUNFX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0NPVU5URVJfTU9ERShodGltLT5Jbml0LkNvdW50ZXJNb2RlKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMT0NLRElWSVNJT05fRElWKGh0aW0tPkluaXQuQ2xvY2tEaXZpc2lvbikpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9BVVRPUkVMT0FEX1BSRUxPQUQoaHRpbS0+SW5pdC5BdXRvUmVsb2FkUHJlbG9hZCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9FTkNPREVSX01PREUoc0NvbmZpZy0+RW5jb2Rlck1vZGUpKTsNCi0gIGFzc2VydF9wYXJhbShJU19USU1fSUNfU0VMRUNUSU9OKHNDb25maWctPklDMVNlbGVjdGlvbikpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JQ19TRUxFQ1RJT04oc0NvbmZpZy0+SUMyU2VsZWN0aW9uKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0VOQ09ERVJJTlBVVF9QT0xBUklUWShzQ29uZmlnLT5JQzFQb2xhcml0eSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9FTkNPREVSSU5QVVRfUE9MQVJJVFkoc0NvbmZpZy0+SUMyUG9sYXJpdHkpKTsNCi0gIGFzc2VydF9wYXJhbShJU19USU1fSUNfUFJFU0NBTEVSKHNDb25maWctPklDMVByZXNjYWxlcikpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JQ19QUkVTQ0FMRVIoc0NvbmZpZy0+SUMyUHJlc2NhbGVyKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0lDX0ZJTFRFUihzQ29uZmlnLT5JQzFGaWx0ZXIpKTsNCi0gIGFzc2VydF9wYXJhbShJU19USU1fSUNfRklMVEVSKHNDb25maWctPklDMkZpbHRlcikpOw0KLQ0KLSAgaWYgKGh0aW0tPlN0YXRlID09IEhBTF9USU1fU1RBVEVfUkVTRVQpIHsNCi0gICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLw0KLSAgICBodGltLT5Mb2NrID0gSEFMX1VOTE9DS0VEOw0KLQ0KLSNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpDQotICAgIC8qIFJlc2V0IGludGVycnVwdCBjYWxsYmFja3MgdG8gbGVnYWN5IHdlYWsgY2FsbGJhY2tzICovDQotICAgIFRJTV9SZXNldENhbGxiYWNrKGh0aW0pOw0KLQ0KLSAgICBpZiAoaHRpbS0+RW5jb2Rlcl9Nc3BJbml0Q2FsbGJhY2sgPT0gTlVMTCkgew0KLSAgICAgIGh0aW0tPkVuY29kZXJfTXNwSW5pdENhbGxiYWNrID0gSEFMX1RJTV9FbmNvZGVyX01zcEluaXQ7DQotICAgIH0NCi0gICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIDogR1BJTywgQ0xPQ0ssIE5WSUMgKi8NCi0gICAgaHRpbS0+RW5jb2Rlcl9Nc3BJbml0Q2FsbGJhY2soaHRpbSk7DQotI2Vsc2UNCi0gICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIDogR1BJTywgQ0xPQ0ssIE5WSUMgYW5kIERNQSAqLw0KLSAgICBIQUxfVElNX0VuY29kZXJfTXNwSW5pdChodGltKTsNCi0jZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotICB9DQotDQotICAvKiBTZXQgdGhlIFRJTSBzdGF0ZSAqLw0KLSAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7DQotDQotICAvKiBSZXNldCB0aGUgU01TIGFuZCBFQ0UgYml0cyAqLw0KLSAgaHRpbS0+SW5zdGFuY2UtPlNNQ1IgJj0gfihUSU1fU01DUl9TTVMgfCBUSU1fU01DUl9FQ0UpOw0KLQ0KLSAgLyogQ29uZmlndXJlIHRoZSBUaW1lIGJhc2UgaW4gdGhlIEVuY29kZXIgTW9kZSAqLw0KLSAgVElNX0Jhc2VfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCAmaHRpbS0+SW5pdCk7DQotDQotICAvKiBHZXQgdGhlIFRJTXggU01DUiByZWdpc3RlciB2YWx1ZSAqLw0KLSAgdG1wc21jciA9IGh0aW0tPkluc3RhbmNlLT5TTUNSOw0KLQ0KLSAgLyogR2V0IHRoZSBUSU14IENDTVIxIHJlZ2lzdGVyIHZhbHVlICovDQotICB0bXBjY21yMSA9IGh0aW0tPkluc3RhbmNlLT5DQ01SMTsNCi0NCi0gIC8qIEdldCB0aGUgVElNeCBDQ0VSIHJlZ2lzdGVyIHZhbHVlICovDQotICB0bXBjY2VyID0gaHRpbS0+SW5zdGFuY2UtPkNDRVI7DQotDQotICAvKiBTZXQgdGhlIGVuY29kZXIgTW9kZSAqLw0KLSAgdG1wc21jciB8PSBzQ29uZmlnLT5FbmNvZGVyTW9kZTsNCi0NCi0gIC8qIFNlbGVjdCB0aGUgQ2FwdHVyZSBDb21wYXJlIDEgYW5kIHRoZSBDYXB0dXJlIENvbXBhcmUgMiBhcyBpbnB1dCAqLw0KLSAgdG1wY2NtcjEgJj0gfihUSU1fQ0NNUjFfQ0MxUyB8IFRJTV9DQ01SMV9DQzJTKTsNCi0gIHRtcGNjbXIxIHw9IChzQ29uZmlnLT5JQzFTZWxlY3Rpb24gfCAoc0NvbmZpZy0+SUMyU2VsZWN0aW9uIDw8IDhVKSk7DQotDQotICAvKiBTZXQgdGhlIENhcHR1cmUgQ29tcGFyZSAxIGFuZCB0aGUgQ2FwdHVyZSBDb21wYXJlIDIgcHJlc2NhbGVycyBhbmQgZmlsdGVycw0KLSAgICovDQotICB0bXBjY21yMSAmPSB+KFRJTV9DQ01SMV9JQzFQU0MgfCBUSU1fQ0NNUjFfSUMyUFNDKTsNCi0gIHRtcGNjbXIxICY9IH4oVElNX0NDTVIxX0lDMUYgfCBUSU1fQ0NNUjFfSUMyRik7DQotICB0bXBjY21yMSB8PSBzQ29uZmlnLT5JQzFQcmVzY2FsZXIgfCAoc0NvbmZpZy0+SUMyUHJlc2NhbGVyIDw8IDhVKTsNCi0gIHRtcGNjbXIxIHw9IChzQ29uZmlnLT5JQzFGaWx0ZXIgPDwgNFUpIHwgKHNDb25maWctPklDMkZpbHRlciA8PCAxMlUpOw0KLQ0KLSAgLyogU2V0IHRoZSBUSTEgYW5kIHRoZSBUSTIgUG9sYXJpdGllcyAqLw0KLSAgdG1wY2NlciAmPSB+KFRJTV9DQ0VSX0NDMVAgfCBUSU1fQ0NFUl9DQzJQKTsNCi0gIHRtcGNjZXIgJj0gfihUSU1fQ0NFUl9DQzFOUCB8IFRJTV9DQ0VSX0NDMk5QKTsNCi0gIHRtcGNjZXIgfD0gc0NvbmZpZy0+SUMxUG9sYXJpdHkgfCAoc0NvbmZpZy0+SUMyUG9sYXJpdHkgPDwgNFUpOw0KLQ0KLSAgLyogV3JpdGUgdG8gVElNeCBTTUNSICovDQotICBodGltLT5JbnN0YW5jZS0+U01DUiA9IHRtcHNtY3I7DQotDQotICAvKiBXcml0ZSB0byBUSU14IENDTVIxICovDQotICBodGltLT5JbnN0YW5jZS0+Q0NNUjEgPSB0bXBjY21yMTsNCi0NCi0gIC8qIFdyaXRlIHRvIFRJTXggQ0NFUiAqLw0KLSAgaHRpbS0+SW5zdGFuY2UtPkNDRVIgPSB0bXBjY2VyOw0KLQ0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgRE1BIGJ1cnN0IG9wZXJhdGlvbiBzdGF0ZSAqLw0KLSAgaHRpbS0+RE1BQnVyc3RTdGF0ZSA9IEhBTF9ETUFfQlVSU1RfU1RBVEVfUkVBRFk7DQotDQotICAvKiBTZXQgdGhlIFRJTSBjaGFubmVscyBzdGF0ZSAqLw0KLSAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7DQotICBUSU1fQ0hBTk5FTF9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMiwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsNCi0gIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7DQotICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8yLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOw0KLQ0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgVElNIHN0YXRlKi8NCi0gIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRUFEWTsNCi0NCi0gIHJldHVybiBIQUxfT0s7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGVJbml0aWFsaXplcyB0aGUgVElNIEVuY29kZXIgaW50ZXJmYWNlDQotICogQHBhcmFtICBodGltIFRJTSBFbmNvZGVyIEludGVyZmFjZSBoYW5kbGUNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0VuY29kZXJfRGVJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKSB7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOw0KLQ0KLSAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7DQotDQotICAvKiBEaXNhYmxlIHRoZSBUSU0gUGVyaXBoZXJhbCBDbG9jayAqLw0KLSAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7DQotDQotI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkNCi0gIGlmIChodGltLT5FbmNvZGVyX01zcERlSW5pdENhbGxiYWNrID09IE5VTEwpIHsNCi0gICAgaHRpbS0+RW5jb2Rlcl9Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9USU1fRW5jb2Rlcl9Nc3BEZUluaXQ7DQotICB9DQotICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLw0KLSAgaHRpbS0+RW5jb2Rlcl9Nc3BEZUluaXRDYWxsYmFjayhodGltKTsNCi0jZWxzZQ0KLSAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmU6IEdQSU8sIENMT0NLLCBOVklDICovDQotICBIQUxfVElNX0VuY29kZXJfTXNwRGVJbml0KGh0aW0pOw0KLSNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi0NCi0gIC8qIENoYW5nZSB0aGUgRE1BIGJ1cnN0IG9wZXJhdGlvbiBzdGF0ZSAqLw0KLSAgaHRpbS0+RE1BQnVyc3RTdGF0ZSA9IEhBTF9ETUFfQlVSU1RfU1RBVEVfUkVTRVQ7DQotDQotICAvKiBTZXQgdGhlIFRJTSBjaGFubmVscyBzdGF0ZSAqLw0KLSAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRVNFVCk7DQotICBUSU1fQ0hBTk5FTF9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMiwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFU0VUKTsNCi0gIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRVNFVCk7DQotICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8yLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVTRVQpOw0KLQ0KLSAgLyogQ2hhbmdlIFRJTSBzdGF0ZSAqLw0KLSAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFU0VUOw0KLQ0KLSAgLyogUmVsZWFzZSBMb2NrICovDQotICBfX0hBTF9VTkxPQ0soaHRpbSk7DQotDQotICByZXR1cm4gSEFMX09LOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBUSU0gRW5jb2RlciBJbnRlcmZhY2UgTVNQLg0KLSAqIEBwYXJhbSAgaHRpbSBUSU0gRW5jb2RlciBJbnRlcmZhY2UgaGFuZGxlDQotICogQHJldHZhbCBOb25lDQotICovDQotX193ZWFrIHZvaWQgSEFMX1RJTV9FbmNvZGVyX01zcEluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pIHsNCi0gIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8NCi0gIFVOVVNFRChodGltKTsNCi0NCi0gIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwNCi0gICAgICAgICAgICB0aGUgSEFMX1RJTV9FbmNvZGVyX01zcEluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQ0KLSAgICovDQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGVJbml0aWFsaXplcyBUSU0gRW5jb2RlciBJbnRlcmZhY2UgTVNQLg0KLSAqIEBwYXJhbSAgaHRpbSBUSU0gRW5jb2RlciBJbnRlcmZhY2UgaGFuZGxlDQotICogQHJldHZhbCBOb25lDQotICovDQotX193ZWFrIHZvaWQgSEFMX1RJTV9FbmNvZGVyX01zcERlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkgew0KLSAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLw0KLSAgVU5VU0VEKGh0aW0pOw0KLQ0KLSAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLA0KLSAgICAgICAgICAgIHRoZSBIQUxfVElNX0VuY29kZXJfTXNwRGVJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUNCi0gICAqLw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFN0YXJ0cyB0aGUgVElNIEVuY29kZXIgSW50ZXJmYWNlLg0KLSAqIEBwYXJhbSAgaHRpbSBUSU0gRW5jb2RlciBJbnRlcmZhY2UgaGFuZGxlDQotICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVscyB0byBiZSBlbmFibGVkDQotICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMX0FMTDogVElNIENoYW5uZWwgMSBhbmQgVElNIENoYW5uZWwgMiBhcmUgc2VsZWN0ZWQNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0VuY29kZXJfU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpIHsNCi0gIEhBTF9USU1fQ2hhbm5lbFN0YXRlVHlwZURlZiBjaGFubmVsXzFfc3RhdGUgPQ0KLSAgICAgIFRJTV9DSEFOTkVMX1NUQVRFX0dFVChodGltLCBUSU1fQ0hBTk5FTF8xKTsNCi0gIEhBTF9USU1fQ2hhbm5lbFN0YXRlVHlwZURlZiBjaGFubmVsXzJfc3RhdGUgPQ0KLSAgICAgIFRJTV9DSEFOTkVMX1NUQVRFX0dFVChodGltLCBUSU1fQ0hBTk5FTF8yKTsNCi0gIEhBTF9USU1fQ2hhbm5lbFN0YXRlVHlwZURlZiBjb21wbGVtZW50YXJ5X2NoYW5uZWxfMV9zdGF0ZSA9DQotICAgICAgVElNX0NIQU5ORUxfTl9TVEFURV9HRVQoaHRpbSwgVElNX0NIQU5ORUxfMSk7DQotICBIQUxfVElNX0NoYW5uZWxTdGF0ZVR5cGVEZWYgY29tcGxlbWVudGFyeV9jaGFubmVsXzJfc3RhdGUgPQ0KLSAgICAgIFRJTV9DSEFOTkVMX05fU1RBVEVfR0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIpOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fRU5DT0RFUl9JTlRFUkZBQ0VfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsNCi0NCi0gIC8qIFNldCB0aGUgVElNIGNoYW5uZWwocykgc3RhdGUgKi8NCi0gIGlmIChDaGFubmVsID09IFRJTV9DSEFOTkVMXzEpIHsNCi0gICAgaWYgKChjaGFubmVsXzFfc3RhdGUgIT0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKSB8fA0KLSAgICAgICAgKGNvbXBsZW1lbnRhcnlfY2hhbm5lbF8xX3N0YXRlICE9IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSkpIHsNCi0gICAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8xLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSk7DQotICAgICAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMSwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX0JVU1kpOw0KLSAgICB9DQotICB9IGVsc2UgaWYgKENoYW5uZWwgPT0gVElNX0NIQU5ORUxfMikgew0KLSAgICBpZiAoKGNoYW5uZWxfMl9zdGF0ZSAhPSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpIHx8DQotICAgICAgICAoY29tcGxlbWVudGFyeV9jaGFubmVsXzJfc3RhdGUgIT0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKSkgew0KLSAgICAgIHJldHVybiBIQUxfRVJST1I7DQotICAgIH0gZWxzZSB7DQotICAgICAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKTsNCi0gICAgICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8yLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSk7DQotICAgIH0NCi0gIH0gZWxzZSB7DQotICAgIGlmICgoY2hhbm5lbF8xX3N0YXRlICE9IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSkgfHwNCi0gICAgICAgIChjaGFubmVsXzJfc3RhdGUgIT0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKSB8fA0KLSAgICAgICAgKGNvbXBsZW1lbnRhcnlfY2hhbm5lbF8xX3N0YXRlICE9IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSkgfHwNCi0gICAgICAgIChjb21wbGVtZW50YXJ5X2NoYW5uZWxfMl9zdGF0ZSAhPSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpKSB7DQotICAgICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gICAgfSBlbHNlIHsNCi0gICAgICBUSU1fQ0hBTk5FTF9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMSwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX0JVU1kpOw0KLSAgICAgIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8yLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSk7DQotICAgICAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMSwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX0JVU1kpOw0KLSAgICAgIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgLyogRW5hYmxlIHRoZSBlbmNvZGVyIGludGVyZmFjZSBjaGFubmVscyAqLw0KLSAgc3dpdGNoIChDaGFubmVsKSB7DQotICAgIGNhc2UgVElNX0NIQU5ORUxfMTogew0KLSAgICAgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8xLCBUSU1fQ0N4X0VOQUJMRSk7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0NCi0gICAgY2FzZSBUSU1fQ0hBTk5FTF8yOiB7DQotICAgICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzIsIFRJTV9DQ3hfRU5BQkxFKTsNCi0gICAgICBicmVhazsNCi0gICAgfQ0KLQ0KLSAgICBkZWZhdWx0OiB7DQotICAgICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzEsIFRJTV9DQ3hfRU5BQkxFKTsNCi0gICAgICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMiwgVElNX0NDeF9FTkFCTEUpOw0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotICB9DQotICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8NCi0gIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7DQotDQotICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovDQotICByZXR1cm4gSEFMX09LOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFN0b3BzIHRoZSBUSU0gRW5jb2RlciBJbnRlcmZhY2UuDQotICogQHBhcmFtICBodGltIFRJTSBFbmNvZGVyIEludGVyZmFjZSBoYW5kbGUNCi0gKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWxzIHRvIGJlIGRpc2FibGVkDQotICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMX0FMTDogVElNIENoYW5uZWwgMSBhbmQgVElNIENoYW5uZWwgMiBhcmUgc2VsZWN0ZWQNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0VuY29kZXJfU3RvcChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKSB7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9FTkNPREVSX0lOVEVSRkFDRV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOw0KLQ0KLSAgLyogRGlzYWJsZSB0aGUgSW5wdXQgQ2FwdHVyZSBjaGFubmVscyAxIGFuZCAyDQotICAgIChpbiB0aGUgRW5jb2RlckludGVyZmFjZSB0aGUgdHdvIHBvc3NpYmxlIGNoYW5uZWxzIHRoYXQgY2FuIGJlIHVzZWQgYXJlDQotICAgIFRJTV9DSEFOTkVMXzEgYW5kIFRJTV9DSEFOTkVMXzIpICovDQotICBzd2l0Y2ggKENoYW5uZWwpIHsNCi0gICAgY2FzZSBUSU1fQ0hBTk5FTF8xOiB7DQotICAgICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzEsIFRJTV9DQ3hfRElTQUJMRSk7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0NCi0gICAgY2FzZSBUSU1fQ0hBTk5FTF8yOiB7DQotICAgICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzIsIFRJTV9DQ3hfRElTQUJMRSk7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0NCi0gICAgZGVmYXVsdDogew0KLSAgICAgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8xLCBUSU1fQ0N4X0RJU0FCTEUpOw0KLSAgICAgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8yLCBUSU1fQ0N4X0RJU0FCTEUpOw0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotICB9DQotDQotICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovDQotICBfX0hBTF9USU1fRElTQUJMRShodGltKTsNCi0NCi0gIC8qIFNldCB0aGUgVElNIGNoYW5uZWwocykgc3RhdGUgKi8NCi0gIGlmICgoQ2hhbm5lbCA9PSBUSU1fQ0hBTk5FTF8xKSB8fCAoQ2hhbm5lbCA9PSBUSU1fQ0hBTk5FTF8yKSkgew0KLSAgICBUSU1fQ0hBTk5FTF9TVEFURV9TRVQoaHRpbSwgQ2hhbm5lbCwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsNCi0gICAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgQ2hhbm5lbCwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsNCi0gIH0gZWxzZSB7DQotICAgIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8xLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOw0KLSAgICBUSU1fQ0hBTk5FTF9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMiwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsNCi0gICAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMSwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsNCi0gICAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMiwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsNCi0gIH0NCi0NCi0gIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8NCi0gIHJldHVybiBIQUxfT0s7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU3RhcnRzIHRoZSBUSU0gRW5jb2RlciBJbnRlcmZhY2UgaW4gaW50ZXJydXB0IG1vZGUuDQotICogQHBhcmFtICBodGltIFRJTSBFbmNvZGVyIEludGVyZmFjZSBoYW5kbGUNCi0gKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWxzIHRvIGJlIGVuYWJsZWQNCi0gKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfQUxMOiBUSU0gQ2hhbm5lbCAxIGFuZCBUSU0gQ2hhbm5lbCAyIGFyZSBzZWxlY3RlZA0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fRW5jb2Rlcl9TdGFydF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCkgew0KLSAgSEFMX1RJTV9DaGFubmVsU3RhdGVUeXBlRGVmIGNoYW5uZWxfMV9zdGF0ZSA9DQotICAgICAgVElNX0NIQU5ORUxfU1RBVEVfR0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEpOw0KLSAgSEFMX1RJTV9DaGFubmVsU3RhdGVUeXBlRGVmIGNoYW5uZWxfMl9zdGF0ZSA9DQotICAgICAgVElNX0NIQU5ORUxfU1RBVEVfR0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIpOw0KLSAgSEFMX1RJTV9DaGFubmVsU3RhdGVUeXBlRGVmIGNvbXBsZW1lbnRhcnlfY2hhbm5lbF8xX3N0YXRlID0NCi0gICAgICBUSU1fQ0hBTk5FTF9OX1NUQVRFX0dFVChodGltLCBUSU1fQ0hBTk5FTF8xKTsNCi0gIEhBTF9USU1fQ2hhbm5lbFN0YXRlVHlwZURlZiBjb21wbGVtZW50YXJ5X2NoYW5uZWxfMl9zdGF0ZSA9DQotICAgICAgVElNX0NIQU5ORUxfTl9TVEFURV9HRVQoaHRpbSwgVElNX0NIQU5ORUxfMik7DQotDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9FTkNPREVSX0lOVEVSRkFDRV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOw0KLQ0KLSAgLyogU2V0IHRoZSBUSU0gY2hhbm5lbChzKSBzdGF0ZSAqLw0KLSAgaWYgKENoYW5uZWwgPT0gVElNX0NIQU5ORUxfMSkgew0KLSAgICBpZiAoKGNoYW5uZWxfMV9zdGF0ZSAhPSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpIHx8DQotICAgICAgICAoY29tcGxlbWVudGFyeV9jaGFubmVsXzFfc3RhdGUgIT0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKSkgew0KLSAgICAgIHJldHVybiBIQUxfRVJST1I7DQotICAgIH0gZWxzZSB7DQotICAgICAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKTsNCi0gICAgICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8xLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSk7DQotICAgIH0NCi0gIH0gZWxzZSBpZiAoQ2hhbm5lbCA9PSBUSU1fQ0hBTk5FTF8yKSB7DQotICAgIGlmICgoY2hhbm5lbF8yX3N0YXRlICE9IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSkgfHwNCi0gICAgICAgIChjb21wbGVtZW50YXJ5X2NoYW5uZWxfMl9zdGF0ZSAhPSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpKSB7DQotICAgICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gICAgfSBlbHNlIHsNCi0gICAgICBUSU1fQ0hBTk5FTF9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMiwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX0JVU1kpOw0KLSAgICAgIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKTsNCi0gICAgfQ0KLSAgfSBlbHNlIHsNCi0gICAgaWYgKChjaGFubmVsXzFfc3RhdGUgIT0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKSB8fA0KLSAgICAgICAgKGNoYW5uZWxfMl9zdGF0ZSAhPSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpIHx8DQotICAgICAgICAoY29tcGxlbWVudGFyeV9jaGFubmVsXzFfc3RhdGUgIT0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKSB8fA0KLSAgICAgICAgKGNvbXBsZW1lbnRhcnlfY2hhbm5lbF8yX3N0YXRlICE9IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSkpIHsNCi0gICAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8xLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSk7DQotICAgICAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKTsNCi0gICAgICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8xLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSk7DQotICAgICAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMiwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX0JVU1kpOw0KLSAgICB9DQotICB9DQotDQotICAvKiBFbmFibGUgdGhlIGVuY29kZXIgaW50ZXJmYWNlIGNoYW5uZWxzICovDQotICAvKiBFbmFibGUgdGhlIGNhcHR1cmUgY29tcGFyZSBJbnRlcnJ1cHRzIDEgYW5kL29yIDIgKi8NCi0gIHN3aXRjaCAoQ2hhbm5lbCkgew0KLSAgICBjYXNlIFRJTV9DSEFOTkVMXzE6IHsNCi0gICAgICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMSwgVElNX0NDeF9FTkFCTEUpOw0KLSAgICAgIF9fSEFMX1RJTV9FTkFCTEVfSVQoaHRpbSwgVElNX0lUX0NDMSk7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0NCi0gICAgY2FzZSBUSU1fQ0hBTk5FTF8yOiB7DQotICAgICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzIsIFRJTV9DQ3hfRU5BQkxFKTsNCi0gICAgICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzIpOw0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotDQotICAgIGRlZmF1bHQ6IHsNCi0gICAgICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMSwgVElNX0NDeF9FTkFCTEUpOw0KLSAgICAgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8yLCBUSU1fQ0N4X0VOQUJMRSk7DQotICAgICAgX19IQUxfVElNX0VOQUJMRV9JVChodGltLCBUSU1fSVRfQ0MxKTsNCi0gICAgICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzIpOw0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotICB9DQotDQotICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8NCi0gIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7DQotDQotICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovDQotICByZXR1cm4gSEFMX09LOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFN0b3BzIHRoZSBUSU0gRW5jb2RlciBJbnRlcmZhY2UgaW4gaW50ZXJydXB0IG1vZGUuDQotICogQHBhcmFtICBodGltIFRJTSBFbmNvZGVyIEludGVyZmFjZSBoYW5kbGUNCi0gKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWxzIHRvIGJlIGRpc2FibGVkDQotICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMX0FMTDogVElNIENoYW5uZWwgMSBhbmQgVElNIENoYW5uZWwgMiBhcmUgc2VsZWN0ZWQNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0VuY29kZXJfU3RvcF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKSB7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9FTkNPREVSX0lOVEVSRkFDRV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOw0KLQ0KLSAgLyogRGlzYWJsZSB0aGUgSW5wdXQgQ2FwdHVyZSBjaGFubmVscyAxIGFuZCAyDQotICAgIChpbiB0aGUgRW5jb2RlckludGVyZmFjZSB0aGUgdHdvIHBvc3NpYmxlIGNoYW5uZWxzIHRoYXQgY2FuIGJlIHVzZWQgYXJlDQotICAgIFRJTV9DSEFOTkVMXzEgYW5kIFRJTV9DSEFOTkVMXzIpICovDQotICBpZiAoQ2hhbm5lbCA9PSBUSU1fQ0hBTk5FTF8xKSB7DQotICAgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8xLCBUSU1fQ0N4X0RJU0FCTEUpOw0KLQ0KLSAgICAvKiBEaXNhYmxlIHRoZSBjYXB0dXJlIGNvbXBhcmUgSW50ZXJydXB0cyAxICovDQotICAgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzEpOw0KLSAgfSBlbHNlIGlmIChDaGFubmVsID09IFRJTV9DSEFOTkVMXzIpIHsNCi0gICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzIsIFRJTV9DQ3hfRElTQUJMRSk7DQotDQotICAgIC8qIERpc2FibGUgdGhlIGNhcHR1cmUgY29tcGFyZSBJbnRlcnJ1cHRzIDIgKi8NCi0gICAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDMik7DQotICB9IGVsc2Ugew0KLSAgICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMSwgVElNX0NDeF9ESVNBQkxFKTsNCi0gICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzIsIFRJTV9DQ3hfRElTQUJMRSk7DQotDQotICAgIC8qIERpc2FibGUgdGhlIGNhcHR1cmUgY29tcGFyZSBJbnRlcnJ1cHRzIDEgYW5kIDIgKi8NCi0gICAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDMSk7DQotICAgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzIpOw0KLSAgfQ0KLQ0KLSAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLw0KLSAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7DQotDQotICAvKiBTZXQgdGhlIFRJTSBjaGFubmVsKHMpIHN0YXRlICovDQotICBpZiAoKENoYW5uZWwgPT0gVElNX0NIQU5ORUxfMSkgfHwgKENoYW5uZWwgPT0gVElNX0NIQU5ORUxfMikpIHsNCi0gICAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIENoYW5uZWwsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7DQotICAgIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIENoYW5uZWwsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7DQotICB9IGVsc2Ugew0KLSAgICBUSU1fQ0hBTk5FTF9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMSwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsNCi0gICAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7DQotICAgIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7DQotICAgIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7DQotICB9DQotDQotICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovDQotICByZXR1cm4gSEFMX09LOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFN0YXJ0cyB0aGUgVElNIEVuY29kZXIgSW50ZXJmYWNlIGluIERNQSBtb2RlLg0KLSAqIEBwYXJhbSAgaHRpbSBUSU0gRW5jb2RlciBJbnRlcmZhY2UgaGFuZGxlDQotICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVscyB0byBiZSBlbmFibGVkDQotICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMX0FMTDogVElNIENoYW5uZWwgMSBhbmQgVElNIENoYW5uZWwgMiBhcmUgc2VsZWN0ZWQNCi0gKiBAcGFyYW0gIHBEYXRhMSBUaGUgZGVzdGluYXRpb24gQnVmZmVyIGFkZHJlc3MgZm9yIElDMS4NCi0gKiBAcGFyYW0gIHBEYXRhMiBUaGUgZGVzdGluYXRpb24gQnVmZmVyIGFkZHJlc3MgZm9yIElDMi4NCi0gKiBAcGFyYW0gIExlbmd0aCBUaGUgbGVuZ3RoIG9mIGRhdGEgdG8gYmUgdHJhbnNmZXJyZWQgZnJvbSBUSU0gcGVyaXBoZXJhbCB0bw0KLSAqIG1lbW9yeS4NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0VuY29kZXJfU3RhcnRfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgKnBEYXRhMSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwRGF0YTIsIHVpbnQxNl90IExlbmd0aCkgew0KLSAgSEFMX1RJTV9DaGFubmVsU3RhdGVUeXBlRGVmIGNoYW5uZWxfMV9zdGF0ZSA9DQotICAgICAgVElNX0NIQU5ORUxfU1RBVEVfR0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEpOw0KLSAgSEFMX1RJTV9DaGFubmVsU3RhdGVUeXBlRGVmIGNoYW5uZWxfMl9zdGF0ZSA9DQotICAgICAgVElNX0NIQU5ORUxfU1RBVEVfR0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIpOw0KLSAgSEFMX1RJTV9DaGFubmVsU3RhdGVUeXBlRGVmIGNvbXBsZW1lbnRhcnlfY2hhbm5lbF8xX3N0YXRlID0NCi0gICAgICBUSU1fQ0hBTk5FTF9OX1NUQVRFX0dFVChodGltLCBUSU1fQ0hBTk5FTF8xKTsNCi0gIEhBTF9USU1fQ2hhbm5lbFN0YXRlVHlwZURlZiBjb21wbGVtZW50YXJ5X2NoYW5uZWxfMl9zdGF0ZSA9DQotICAgICAgVElNX0NIQU5ORUxfTl9TVEFURV9HRVQoaHRpbSwgVElNX0NIQU5ORUxfMik7DQotDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9FTkNPREVSX0lOVEVSRkFDRV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOw0KLQ0KLSAgLyogU2V0IHRoZSBUSU0gY2hhbm5lbChzKSBzdGF0ZSAqLw0KLSAgaWYgKENoYW5uZWwgPT0gVElNX0NIQU5ORUxfMSkgew0KLSAgICBpZiAoKGNoYW5uZWxfMV9zdGF0ZSA9PSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSkgfHwNCi0gICAgICAgIChjb21wbGVtZW50YXJ5X2NoYW5uZWxfMV9zdGF0ZSA9PSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSkpIHsNCi0gICAgICByZXR1cm4gSEFMX0JVU1k7DQotICAgIH0gZWxzZSBpZiAoKGNoYW5uZWxfMV9zdGF0ZSA9PSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpICYmDQotICAgICAgICAgICAgICAgKGNvbXBsZW1lbnRhcnlfY2hhbm5lbF8xX3N0YXRlID09IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSkpIHsNCi0gICAgICBpZiAoKHBEYXRhMSA9PSBOVUxMKSAmJiAoTGVuZ3RoID4gMFUpKSB7DQotICAgICAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICBUSU1fQ0hBTk5FTF9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMSwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX0JVU1kpOw0KLSAgICAgICAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKTsNCi0gICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gICAgfQ0KLSAgfSBlbHNlIGlmIChDaGFubmVsID09IFRJTV9DSEFOTkVMXzIpIHsNCi0gICAgaWYgKChjaGFubmVsXzJfc3RhdGUgPT0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX0JVU1kpIHx8DQotICAgICAgICAoY29tcGxlbWVudGFyeV9jaGFubmVsXzJfc3RhdGUgPT0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX0JVU1kpKSB7DQotICAgICAgcmV0dXJuIEhBTF9CVVNZOw0KLSAgICB9IGVsc2UgaWYgKChjaGFubmVsXzJfc3RhdGUgPT0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKSAmJg0KLSAgICAgICAgICAgICAgIChjb21wbGVtZW50YXJ5X2NoYW5uZWxfMl9zdGF0ZSA9PSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpKSB7DQotICAgICAgaWYgKChwRGF0YTIgPT0gTlVMTCkgJiYgKExlbmd0aCA+IDBVKSkgew0KLSAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKTsNCi0gICAgICAgIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSk7DQotICAgICAgfQ0KLSAgICB9IGVsc2Ugew0KLSAgICAgIHJldHVybiBIQUxfRVJST1I7DQotICAgIH0NCi0gIH0gZWxzZSB7DQotICAgIGlmICgoY2hhbm5lbF8xX3N0YXRlID09IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKSB8fA0KLSAgICAgICAgKGNoYW5uZWxfMl9zdGF0ZSA9PSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSkgfHwNCi0gICAgICAgIChjb21wbGVtZW50YXJ5X2NoYW5uZWxfMV9zdGF0ZSA9PSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSkgfHwNCi0gICAgICAgIChjb21wbGVtZW50YXJ5X2NoYW5uZWxfMl9zdGF0ZSA9PSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSkpIHsNCi0gICAgICByZXR1cm4gSEFMX0JVU1k7DQotICAgIH0gZWxzZSBpZiAoKGNoYW5uZWxfMV9zdGF0ZSA9PSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpICYmDQotICAgICAgICAgICAgICAgKGNoYW5uZWxfMl9zdGF0ZSA9PSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpICYmDQotICAgICAgICAgICAgICAgKGNvbXBsZW1lbnRhcnlfY2hhbm5lbF8xX3N0YXRlID09IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSkgJiYNCi0gICAgICAgICAgICAgICAoY29tcGxlbWVudGFyeV9jaGFubmVsXzJfc3RhdGUgPT0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKSkgew0KLSAgICAgIGlmICgoKChwRGF0YTEgPT0gTlVMTCkgfHwgKHBEYXRhMiA9PSBOVUxMKSkpICYmIChMZW5ndGggPiAwVSkpIHsNCi0gICAgICAgIHJldHVybiBIQUxfRVJST1I7DQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8xLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSk7DQotICAgICAgICBUSU1fQ0hBTk5FTF9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMiwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX0JVU1kpOw0KLSAgICAgICAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKTsNCi0gICAgICAgIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSk7DQotICAgICAgfQ0KLSAgICB9IGVsc2Ugew0KLSAgICAgIHJldHVybiBIQUxfRVJST1I7DQotICAgIH0NCi0gIH0NCi0NCi0gIHN3aXRjaCAoQ2hhbm5lbCkgew0KLSAgICBjYXNlIFRJTV9DSEFOTkVMXzE6IHsNCi0gICAgICAvKiBTZXQgdGhlIERNQSBjYXB0dXJlIGNhbGxiYWNrcyAqLw0KLSAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQUNhcHR1cmVDcGx0Ow0KLSAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFRJTV9ETUFDYXB0dXJlSGFsZkNwbHQ7DQotDQotICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8NCi0gICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3I7DQotDQotICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLw0KLSAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkNDUjEsICh1aW50MzJfdClwRGF0YTEsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVuZ3RoKSAhPSBIQUxfT0spIHsNCi0gICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8NCi0gICAgICAgIHJldHVybiBIQUxfRVJST1I7DQotICAgICAgfQ0KLSAgICAgIC8qIEVuYWJsZSB0aGUgVElNIElucHV0IENhcHR1cmUgRE1BIHJlcXVlc3QgKi8NCi0gICAgICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMSk7DQotDQotICAgICAgLyogRW5hYmxlIHRoZSBDYXB0dXJlIGNvbXBhcmUgY2hhbm5lbCAqLw0KLSAgICAgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8xLCBUSU1fQ0N4X0VOQUJMRSk7DQotDQotICAgICAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovDQotICAgICAgX19IQUxfVElNX0VOQUJMRShodGltKTsNCi0NCi0gICAgICBicmVhazsNCi0gICAgfQ0KLQ0KLSAgICBjYXNlIFRJTV9DSEFOTkVMXzI6IHsNCi0gICAgICAvKiBTZXQgdGhlIERNQSBjYXB0dXJlIGNhbGxiYWNrcyAqLw0KLSAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQUNhcHR1cmVDcGx0Ow0KLSAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFRJTV9ETUFDYXB0dXJlSGFsZkNwbHQ7DQotDQotICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8NCi0gICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3I7DQotICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLw0KLSAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkNDUjIsICh1aW50MzJfdClwRGF0YTIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVuZ3RoKSAhPSBIQUxfT0spIHsNCi0gICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8NCi0gICAgICAgIHJldHVybiBIQUxfRVJST1I7DQotICAgICAgfQ0KLSAgICAgIC8qIEVuYWJsZSB0aGUgVElNIElucHV0IENhcHR1cmUgIERNQSByZXF1ZXN0ICovDQotICAgICAgX19IQUxfVElNX0VOQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzIpOw0KLQ0KLSAgICAgIC8qIEVuYWJsZSB0aGUgQ2FwdHVyZSBjb21wYXJlIGNoYW5uZWwgKi8NCi0gICAgICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMiwgVElNX0NDeF9FTkFCTEUpOw0KLQ0KLSAgICAgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLw0KLSAgICAgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7DQotDQotICAgICAgYnJlYWs7DQotICAgIH0NCi0NCi0gICAgZGVmYXVsdDogew0KLSAgICAgIC8qIFNldCB0aGUgRE1BIGNhcHR1cmUgY2FsbGJhY2tzICovDQotICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BQ2FwdHVyZUNwbHQ7DQotICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gVElNX0RNQUNhcHR1cmVIYWxmQ3BsdDsNCi0NCi0gICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLw0KLSAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvcjsNCi0NCi0gICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovDQotICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+Q0NSMSwgKHVpbnQzMl90KXBEYXRhMSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBMZW5ndGgpICE9IEhBTF9PSykgew0KLSAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLw0KLSAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gICAgICB9DQotDQotICAgICAgLyogU2V0IHRoZSBETUEgY2FwdHVyZSBjYWxsYmFja3MgKi8NCi0gICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFDYXB0dXJlQ3BsdDsNCi0gICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BQ2FwdHVyZUhhbGZDcGx0Ow0KLQ0KLSAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovDQotICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yOw0KLQ0KLSAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8NCi0gICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5DQ1IyLCAodWludDMyX3QpcERhdGEyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIExlbmd0aCkgIT0gSEFMX09LKSB7DQotICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovDQotICAgICAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgICAgIH0NCi0NCi0gICAgICAvKiBFbmFibGUgdGhlIFRJTSBJbnB1dCBDYXB0dXJlICBETUEgcmVxdWVzdCAqLw0KLSAgICAgIF9fSEFMX1RJTV9FTkFCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MxKTsNCi0gICAgICAvKiBFbmFibGUgdGhlIFRJTSBJbnB1dCBDYXB0dXJlICBETUEgcmVxdWVzdCAqLw0KLSAgICAgIF9fSEFMX1RJTV9FTkFCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MyKTsNCi0NCi0gICAgICAvKiBFbmFibGUgdGhlIENhcHR1cmUgY29tcGFyZSBjaGFubmVsICovDQotICAgICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzEsIFRJTV9DQ3hfRU5BQkxFKTsNCi0gICAgICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMiwgVElNX0NDeF9FTkFCTEUpOw0KLQ0KLSAgICAgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLw0KLSAgICAgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7DQotDQotICAgICAgYnJlYWs7DQotICAgIH0NCi0gIH0NCi0NCi0gIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8NCi0gIHJldHVybiBIQUxfT0s7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU3RvcHMgdGhlIFRJTSBFbmNvZGVyIEludGVyZmFjZSBpbiBETUEgbW9kZS4NCi0gKiBAcGFyYW0gIGh0aW0gVElNIEVuY29kZXIgSW50ZXJmYWNlIGhhbmRsZQ0KLSAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbHMgdG8gYmUgZW5hYmxlZA0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF9BTEw6IFRJTSBDaGFubmVsIDEgYW5kIFRJTSBDaGFubmVsIDIgYXJlIHNlbGVjdGVkDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9FbmNvZGVyX1N0b3BfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKSB7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9FTkNPREVSX0lOVEVSRkFDRV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOw0KLQ0KLSAgLyogRGlzYWJsZSB0aGUgSW5wdXQgQ2FwdHVyZSBjaGFubmVscyAxIGFuZCAyDQotICAgIChpbiB0aGUgRW5jb2RlckludGVyZmFjZSB0aGUgdHdvIHBvc3NpYmxlIGNoYW5uZWxzIHRoYXQgY2FuIGJlIHVzZWQgYXJlDQotICAgIFRJTV9DSEFOTkVMXzEgYW5kIFRJTV9DSEFOTkVMXzIpICovDQotICBpZiAoQ2hhbm5lbCA9PSBUSU1fQ0hBTk5FTF8xKSB7DQotICAgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8xLCBUSU1fQ0N4X0RJU0FCTEUpOw0KLQ0KLSAgICAvKiBEaXNhYmxlIHRoZSBjYXB0dXJlIGNvbXBhcmUgRE1BIFJlcXVlc3QgMSAqLw0KLSAgICBfX0hBTF9USU1fRElTQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzEpOw0KLSAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdKTsNCi0gIH0gZWxzZSBpZiAoQ2hhbm5lbCA9PSBUSU1fQ0hBTk5FTF8yKSB7DQotICAgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8yLCBUSU1fQ0N4X0RJU0FCTEUpOw0KLQ0KLSAgICAvKiBEaXNhYmxlIHRoZSBjYXB0dXJlIGNvbXBhcmUgRE1BIFJlcXVlc3QgMiAqLw0KLSAgICBfX0hBTF9USU1fRElTQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzIpOw0KLSAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdKTsNCi0gIH0gZWxzZSB7DQotICAgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8xLCBUSU1fQ0N4X0RJU0FCTEUpOw0KLSAgICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMiwgVElNX0NDeF9ESVNBQkxFKTsNCi0NCi0gICAgLyogRGlzYWJsZSB0aGUgY2FwdHVyZSBjb21wYXJlIERNQSBSZXF1ZXN0IDEgYW5kIDIgKi8NCi0gICAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MxKTsNCi0gICAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MyKTsNCi0gICAgKHZvaWQpSEFMX0RNQV9BYm9ydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXSk7DQotICAgICh2b2lkKUhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0pOw0KLSAgfQ0KLQ0KLSAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLw0KLSAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7DQotDQotICAvKiBTZXQgdGhlIFRJTSBjaGFubmVsKHMpIHN0YXRlICovDQotICBpZiAoKENoYW5uZWwgPT0gVElNX0NIQU5ORUxfMSkgfHwgKENoYW5uZWwgPT0gVElNX0NIQU5ORUxfMikpIHsNCi0gICAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIENoYW5uZWwsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7DQotICAgIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIENoYW5uZWwsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7DQotICB9IGVsc2Ugew0KLSAgICBUSU1fQ0hBTk5FTF9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMSwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsNCi0gICAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7DQotICAgIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7DQotICAgIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7DQotICB9DQotDQotICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovDQotICByZXR1cm4gSEFMX09LOw0KLX0NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLS8qKiBAZGVmZ3JvdXAgVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDcgVElNIElSUSBoYW5kbGVyIG1hbmFnZW1lbnQNCi0gICogIEBicmllZiAgICBUSU0gSVJRIGhhbmRsZXIgbWFuYWdlbWVudA0KLSAgKg0KLUB2ZXJiYXRpbQ0KLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSVJRIGhhbmRsZXIgbWFuYWdlbWVudCAjIyMjIw0KLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICBbLi5dDQotICAgIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBUaW1lciBJUlEgaGFuZGxlciBmdW5jdGlvbi4NCi0NCi1AZW5kdmVyYmF0aW0NCi0gICogQHsNCi0gICovDQotLyoqDQotICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgVElNIGludGVycnVwdHMgcmVxdWVzdHMuDQotICogQHBhcmFtICBodGltIFRJTSAgaGFuZGxlDQotICogQHJldHZhbCBOb25lDQotICovDQotdm9pZCBIQUxfVElNX0lSUUhhbmRsZXIoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pIHsNCi0gIC8qIENhcHR1cmUgY29tcGFyZSAxIGV2ZW50ICovDQotICBpZiAoX19IQUxfVElNX0dFVF9GTEFHKGh0aW0sIFRJTV9GTEFHX0NDMSkgIT0gUkVTRVQpIHsNCi0gICAgaWYgKF9fSEFMX1RJTV9HRVRfSVRfU09VUkNFKGh0aW0sIFRJTV9JVF9DQzEpICE9IFJFU0VUKSB7DQotICAgICAgew0KLSAgICAgICAgX19IQUxfVElNX0NMRUFSX0lUKGh0aW0sIFRJTV9JVF9DQzEpOw0KLSAgICAgICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfMTsNCi0NCi0gICAgICAgIC8qIElucHV0IGNhcHR1cmUgZXZlbnQgKi8NCi0gICAgICAgIGlmICgoaHRpbS0+SW5zdGFuY2UtPkNDTVIxICYgVElNX0NDTVIxX0NDMVMpICE9IDB4MDBVKSB7DQotI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkNCi0gICAgICAgICAgaHRpbS0+SUNfQ2FwdHVyZUNhbGxiYWNrKGh0aW0pOw0KLSNlbHNlDQotICAgICAgICAgIEhBTF9USU1fSUNfQ2FwdHVyZUNhbGxiYWNrKGh0aW0pOw0KLSNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi0gICAgICAgIH0NCi0gICAgICAgIC8qIE91dHB1dCBjb21wYXJlIGV2ZW50ICovDQotICAgICAgICBlbHNlIHsNCi0jaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQ0KLSAgICAgICAgICBodGltLT5PQ19EZWxheUVsYXBzZWRDYWxsYmFjayhodGltKTsNCi0gICAgICAgICAgaHRpbS0+UFdNX1B1bHNlRmluaXNoZWRDYWxsYmFjayhodGltKTsNCi0jZWxzZQ0KLSAgICAgICAgICBIQUxfVElNX09DX0RlbGF5RWxhcHNlZENhbGxiYWNrKGh0aW0pOw0KLSAgICAgICAgICBIQUxfVElNX1BXTV9QdWxzZUZpbmlzaGVkQ2FsbGJhY2soaHRpbSk7DQotI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLSAgICAgICAgfQ0KLSAgICAgICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfQ0xFQVJFRDsNCi0gICAgICB9DQotICAgIH0NCi0gIH0NCi0gIC8qIENhcHR1cmUgY29tcGFyZSAyIGV2ZW50ICovDQotICBpZiAoX19IQUxfVElNX0dFVF9GTEFHKGh0aW0sIFRJTV9GTEFHX0NDMikgIT0gUkVTRVQpIHsNCi0gICAgaWYgKF9fSEFMX1RJTV9HRVRfSVRfU09VUkNFKGh0aW0sIFRJTV9JVF9DQzIpICE9IFJFU0VUKSB7DQotICAgICAgX19IQUxfVElNX0NMRUFSX0lUKGh0aW0sIFRJTV9JVF9DQzIpOw0KLSAgICAgIGh0aW0tPkNoYW5uZWwgPSBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzI7DQotICAgICAgLyogSW5wdXQgY2FwdHVyZSBldmVudCAqLw0KLSAgICAgIGlmICgoaHRpbS0+SW5zdGFuY2UtPkNDTVIxICYgVElNX0NDTVIxX0NDMlMpICE9IDB4MDBVKSB7DQotI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkNCi0gICAgICAgIGh0aW0tPklDX0NhcHR1cmVDYWxsYmFjayhodGltKTsNCi0jZWxzZQ0KLSAgICAgICAgSEFMX1RJTV9JQ19DYXB0dXJlQ2FsbGJhY2soaHRpbSk7DQotI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLSAgICAgIH0NCi0gICAgICAvKiBPdXRwdXQgY29tcGFyZSBldmVudCAqLw0KLSAgICAgIGVsc2Ugew0KLSNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpDQotICAgICAgICBodGltLT5PQ19EZWxheUVsYXBzZWRDYWxsYmFjayhodGltKTsNCi0gICAgICAgIGh0aW0tPlBXTV9QdWxzZUZpbmlzaGVkQ2FsbGJhY2soaHRpbSk7DQotI2Vsc2UNCi0gICAgICAgIEhBTF9USU1fT0NfRGVsYXlFbGFwc2VkQ2FsbGJhY2soaHRpbSk7DQotICAgICAgICBIQUxfVElNX1BXTV9QdWxzZUZpbmlzaGVkQ2FsbGJhY2soaHRpbSk7DQotI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLSAgICAgIH0NCi0gICAgICBodGltLT5DaGFubmVsID0gSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF9DTEVBUkVEOw0KLSAgICB9DQotICB9DQotICAvKiBDYXB0dXJlIGNvbXBhcmUgMyBldmVudCAqLw0KLSAgaWYgKF9fSEFMX1RJTV9HRVRfRkxBRyhodGltLCBUSU1fRkxBR19DQzMpICE9IFJFU0VUKSB7DQotICAgIGlmIChfX0hBTF9USU1fR0VUX0lUX1NPVVJDRShodGltLCBUSU1fSVRfQ0MzKSAhPSBSRVNFVCkgew0KLSAgICAgIF9fSEFMX1RJTV9DTEVBUl9JVChodGltLCBUSU1fSVRfQ0MzKTsNCi0gICAgICBodGltLT5DaGFubmVsID0gSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF8zOw0KLSAgICAgIC8qIElucHV0IGNhcHR1cmUgZXZlbnQgKi8NCi0gICAgICBpZiAoKGh0aW0tPkluc3RhbmNlLT5DQ01SMiAmIFRJTV9DQ01SMl9DQzNTKSAhPSAweDAwVSkgew0KLSNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpDQotICAgICAgICBodGltLT5JQ19DYXB0dXJlQ2FsbGJhY2soaHRpbSk7DQotI2Vsc2UNCi0gICAgICAgIEhBTF9USU1fSUNfQ2FwdHVyZUNhbGxiYWNrKGh0aW0pOw0KLSNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi0gICAgICB9DQotICAgICAgLyogT3V0cHV0IGNvbXBhcmUgZXZlbnQgKi8NCi0gICAgICBlbHNlIHsNCi0jaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQ0KLSAgICAgICAgaHRpbS0+T0NfRGVsYXlFbGFwc2VkQ2FsbGJhY2soaHRpbSk7DQotICAgICAgICBodGltLT5QV01fUHVsc2VGaW5pc2hlZENhbGxiYWNrKGh0aW0pOw0KLSNlbHNlDQotICAgICAgICBIQUxfVElNX09DX0RlbGF5RWxhcHNlZENhbGxiYWNrKGh0aW0pOw0KLSAgICAgICAgSEFMX1RJTV9QV01fUHVsc2VGaW5pc2hlZENhbGxiYWNrKGh0aW0pOw0KLSNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi0gICAgICB9DQotICAgICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfQ0xFQVJFRDsNCi0gICAgfQ0KLSAgfQ0KLSAgLyogQ2FwdHVyZSBjb21wYXJlIDQgZXZlbnQgKi8NCi0gIGlmIChfX0hBTF9USU1fR0VUX0ZMQUcoaHRpbSwgVElNX0ZMQUdfQ0M0KSAhPSBSRVNFVCkgew0KLSAgICBpZiAoX19IQUxfVElNX0dFVF9JVF9TT1VSQ0UoaHRpbSwgVElNX0lUX0NDNCkgIT0gUkVTRVQpIHsNCi0gICAgICBfX0hBTF9USU1fQ0xFQVJfSVQoaHRpbSwgVElNX0lUX0NDNCk7DQotICAgICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfNDsNCi0gICAgICAvKiBJbnB1dCBjYXB0dXJlIGV2ZW50ICovDQotICAgICAgaWYgKChodGltLT5JbnN0YW5jZS0+Q0NNUjIgJiBUSU1fQ0NNUjJfQ0M0UykgIT0gMHgwMFUpIHsNCi0jaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQ0KLSAgICAgICAgaHRpbS0+SUNfQ2FwdHVyZUNhbGxiYWNrKGh0aW0pOw0KLSNlbHNlDQotICAgICAgICBIQUxfVElNX0lDX0NhcHR1cmVDYWxsYmFjayhodGltKTsNCi0jZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotICAgICAgfQ0KLSAgICAgIC8qIE91dHB1dCBjb21wYXJlIGV2ZW50ICovDQotICAgICAgZWxzZSB7DQotI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkNCi0gICAgICAgIGh0aW0tPk9DX0RlbGF5RWxhcHNlZENhbGxiYWNrKGh0aW0pOw0KLSAgICAgICAgaHRpbS0+UFdNX1B1bHNlRmluaXNoZWRDYWxsYmFjayhodGltKTsNCi0jZWxzZQ0KLSAgICAgICAgSEFMX1RJTV9PQ19EZWxheUVsYXBzZWRDYWxsYmFjayhodGltKTsNCi0gICAgICAgIEhBTF9USU1fUFdNX1B1bHNlRmluaXNoZWRDYWxsYmFjayhodGltKTsNCi0jZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotICAgICAgfQ0KLSAgICAgIGh0aW0tPkNoYW5uZWwgPSBIQUxfVElNX0FDVElWRV9DSEFOTkVMX0NMRUFSRUQ7DQotICAgIH0NCi0gIH0NCi0gIC8qIFRJTSBVcGRhdGUgZXZlbnQgKi8NCi0gIGlmIChfX0hBTF9USU1fR0VUX0ZMQUcoaHRpbSwgVElNX0ZMQUdfVVBEQVRFKSAhPSBSRVNFVCkgew0KLSAgICBpZiAoX19IQUxfVElNX0dFVF9JVF9TT1VSQ0UoaHRpbSwgVElNX0lUX1VQREFURSkgIT0gUkVTRVQpIHsNCi0gICAgICBfX0hBTF9USU1fQ0xFQVJfSVQoaHRpbSwgVElNX0lUX1VQREFURSk7DQotI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkNCi0gICAgICBodGltLT5QZXJpb2RFbGFwc2VkQ2FsbGJhY2soaHRpbSk7DQotI2Vsc2UNCi0gICAgICBIQUxfVElNX1BlcmlvZEVsYXBzZWRDYWxsYmFjayhodGltKTsNCi0jZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotICAgIH0NCi0gIH0NCi0gIC8qIFRJTSBCcmVhayBpbnB1dCBldmVudCAqLw0KLSAgaWYgKF9fSEFMX1RJTV9HRVRfRkxBRyhodGltLCBUSU1fRkxBR19CUkVBSykgIT0gUkVTRVQpIHsNCi0gICAgaWYgKF9fSEFMX1RJTV9HRVRfSVRfU09VUkNFKGh0aW0sIFRJTV9JVF9CUkVBSykgIT0gUkVTRVQpIHsNCi0gICAgICBfX0hBTF9USU1fQ0xFQVJfSVQoaHRpbSwgVElNX0lUX0JSRUFLKTsNCi0jaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQ0KLSAgICAgIGh0aW0tPkJyZWFrQ2FsbGJhY2soaHRpbSk7DQotI2Vsc2UNCi0gICAgICBIQUxfVElNRXhfQnJlYWtDYWxsYmFjayhodGltKTsNCi0jZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotICAgIH0NCi0gIH0NCi0gIC8qIFRJTSBCcmVhazIgaW5wdXQgZXZlbnQgKi8NCi0gIGlmIChfX0hBTF9USU1fR0VUX0ZMQUcoaHRpbSwgVElNX0ZMQUdfQlJFQUsyKSAhPSBSRVNFVCkgew0KLSAgICBpZiAoX19IQUxfVElNX0dFVF9JVF9TT1VSQ0UoaHRpbSwgVElNX0lUX0JSRUFLKSAhPSBSRVNFVCkgew0KLSAgICAgIF9fSEFMX1RJTV9DTEVBUl9GTEFHKGh0aW0sIFRJTV9GTEFHX0JSRUFLMik7DQotI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkNCi0gICAgICBodGltLT5CcmVhazJDYWxsYmFjayhodGltKTsNCi0jZWxzZQ0KLSAgICAgIEhBTF9USU1FeF9CcmVhazJDYWxsYmFjayhodGltKTsNCi0jZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotICAgIH0NCi0gIH0NCi0gIC8qIFRJTSBUcmlnZ2VyIGRldGVjdGlvbiBldmVudCAqLw0KLSAgaWYgKF9fSEFMX1RJTV9HRVRfRkxBRyhodGltLCBUSU1fRkxBR19UUklHR0VSKSAhPSBSRVNFVCkgew0KLSAgICBpZiAoX19IQUxfVElNX0dFVF9JVF9TT1VSQ0UoaHRpbSwgVElNX0lUX1RSSUdHRVIpICE9IFJFU0VUKSB7DQotICAgICAgX19IQUxfVElNX0NMRUFSX0lUKGh0aW0sIFRJTV9JVF9UUklHR0VSKTsNCi0jaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQ0KLSAgICAgIGh0aW0tPlRyaWdnZXJDYWxsYmFjayhodGltKTsNCi0jZWxzZQ0KLSAgICAgIEhBTF9USU1fVHJpZ2dlckNhbGxiYWNrKGh0aW0pOw0KLSNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi0gICAgfQ0KLSAgfQ0KLSAgLyogVElNIGNvbW11dGF0aW9uIGV2ZW50ICovDQotICBpZiAoX19IQUxfVElNX0dFVF9GTEFHKGh0aW0sIFRJTV9GTEFHX0NPTSkgIT0gUkVTRVQpIHsNCi0gICAgaWYgKF9fSEFMX1RJTV9HRVRfSVRfU09VUkNFKGh0aW0sIFRJTV9JVF9DT00pICE9IFJFU0VUKSB7DQotICAgICAgX19IQUxfVElNX0NMRUFSX0lUKGh0aW0sIFRJTV9GTEFHX0NPTSk7DQotI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkNCi0gICAgICBodGltLT5Db21tdXRhdGlvbkNhbGxiYWNrKGh0aW0pOw0KLSNlbHNlDQotICAgICAgSEFMX1RJTUV4X0NvbW11dENhbGxiYWNrKGh0aW0pOw0KLSNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi0gICAgfQ0KLSAgfQ0KLSAgLyogVElNIEVuY29kZXIgaW5kZXggZXZlbnQgKi8NCi0gIGlmIChfX0hBTF9USU1fR0VUX0ZMQUcoaHRpbSwgVElNX0ZMQUdfSURYKSAhPSBSRVNFVCkgew0KLSAgICBpZiAoX19IQUxfVElNX0dFVF9JVF9TT1VSQ0UoaHRpbSwgVElNX0lUX0lEWCkgIT0gUkVTRVQpIHsNCi0gICAgICBfX0hBTF9USU1fQ0xFQVJfSVQoaHRpbSwgVElNX0ZMQUdfSURYKTsNCi0jaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQ0KLSAgICAgIGh0aW0tPkVuY29kZXJJbmRleENhbGxiYWNrKGh0aW0pOw0KLSNlbHNlDQotICAgICAgSEFMX1RJTUV4X0VuY29kZXJJbmRleENhbGxiYWNrKGh0aW0pOw0KLSNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi0gICAgfQ0KLSAgfQ0KLSAgLyogVElNIERpcmVjdGlvbiBjaGFuZ2UgZXZlbnQgKi8NCi0gIGlmIChfX0hBTF9USU1fR0VUX0ZMQUcoaHRpbSwgVElNX0ZMQUdfRElSKSAhPSBSRVNFVCkgew0KLSAgICBpZiAoX19IQUxfVElNX0dFVF9JVF9TT1VSQ0UoaHRpbSwgVElNX0lUX0RJUikgIT0gUkVTRVQpIHsNCi0gICAgICBfX0hBTF9USU1fQ0xFQVJfSVQoaHRpbSwgVElNX0ZMQUdfRElSKTsNCi0jaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQ0KLSAgICAgIGh0aW0tPkRpcmVjdGlvbkNoYW5nZUNhbGxiYWNrKGh0aW0pOw0KLSNlbHNlDQotICAgICAgSEFMX1RJTUV4X0RpcmVjdGlvbkNoYW5nZUNhbGxiYWNrKGh0aW0pOw0KLSNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi0gICAgfQ0KLSAgfQ0KLSAgLyogVElNIEluZGV4IGVycm9yIGV2ZW50ICovDQotICBpZiAoX19IQUxfVElNX0dFVF9GTEFHKGh0aW0sIFRJTV9GTEFHX0lFUlIpICE9IFJFU0VUKSB7DQotICAgIGlmIChfX0hBTF9USU1fR0VUX0lUX1NPVVJDRShodGltLCBUSU1fSVRfSUVSUikgIT0gUkVTRVQpIHsNCi0gICAgICBfX0hBTF9USU1fQ0xFQVJfSVQoaHRpbSwgVElNX0ZMQUdfSUVSUik7DQotI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkNCi0gICAgICBodGltLT5JbmRleEVycm9yQ2FsbGJhY2soaHRpbSk7DQotI2Vsc2UNCi0gICAgICBIQUxfVElNRXhfSW5kZXhFcnJvckNhbGxiYWNrKGh0aW0pOw0KLSNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi0gICAgfQ0KLSAgfQ0KLSAgLyogVElNIFRyYW5zaXRpb24gZXJyb3IgZXZlbnQgKi8NCi0gIGlmIChfX0hBTF9USU1fR0VUX0ZMQUcoaHRpbSwgVElNX0ZMQUdfVEVSUikgIT0gUkVTRVQpIHsNCi0gICAgaWYgKF9fSEFMX1RJTV9HRVRfSVRfU09VUkNFKGh0aW0sIFRJTV9JVF9URVJSKSAhPSBSRVNFVCkgew0KLSAgICAgIF9fSEFMX1RJTV9DTEVBUl9JVChodGltLCBUSU1fRkxBR19URVJSKTsNCi0jaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQ0KLSAgICAgIGh0aW0tPlRyYW5zaXRpb25FcnJvckNhbGxiYWNrKGh0aW0pOw0KLSNlbHNlDQotICAgICAgSEFMX1RJTUV4X1RyYW5zaXRpb25FcnJvckNhbGxiYWNrKGh0aW0pOw0KLSNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi0gICAgfQ0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDggVElNIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMNCi0gICogIEBicmllZiAgICBUSU0gUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucw0KLSAgKg0KLUB2ZXJiYXRpbQ0KLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgICAgICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgIyMjIyMNCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSBbLi5dDQotICAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoNCi0gICAgICAoKykgQ29uZmlndXJlIFRoZSBJbnB1dCBPdXRwdXQgY2hhbm5lbHMgZm9yIE9DLCBQV00sIElDIG9yIE9uZSBQdWxzZSBtb2RlLg0KLSAgICAgICgrKSBDb25maWd1cmUgRXh0ZXJuYWwgQ2xvY2sgc291cmNlLg0KLSAgICAgICgrKSBDb25maWd1cmUgQ29tcGxlbWVudGFyeSBjaGFubmVscywgYnJlYWsgZmVhdHVyZXMgYW5kIGRlYWQgdGltZS4NCi0gICAgICAoKykgQ29uZmlndXJlIE1hc3RlciBhbmQgdGhlIFNsYXZlIHN5bmNocm9uaXphdGlvbi4NCi0gICAgICAoKykgQ29uZmlndXJlIHRoZSBETUEgQnVyc3QgTW9kZS4NCi0NCi1AZW5kdmVyYmF0aW0NCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgVElNIE91dHB1dCBDb21wYXJlIENoYW5uZWxzIGFjY29yZGluZyB0byB0aGUNCi0gKiBzcGVjaWZpZWQgcGFyYW1ldGVycyBpbiB0aGUgVElNX09DX0luaXRUeXBlRGVmLg0KLSAqIEBwYXJhbSAgaHRpbSBUSU0gT3V0cHV0IENvbXBhcmUgaGFuZGxlDQotICogQHBhcmFtICBzQ29uZmlnIFRJTSBPdXRwdXQgQ29tcGFyZSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZQ0KLSAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbHMgdG8gY29uZmlndXJlDQotICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF81OiBUSU0gQ2hhbm5lbCA1IHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzY6IFRJTSBDaGFubmVsIDYgc2VsZWN0ZWQNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09DX0NvbmZpZ0NoYW5uZWwoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9PQ19Jbml0VHlwZURlZiAqc0NvbmZpZywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCkgew0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fQ0hBTk5FTFMoQ2hhbm5lbCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PQ19DSEFOTkVMX01PREUoc0NvbmZpZy0+T0NNb2RlLCBDaGFubmVsKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX09DX1BPTEFSSVRZKHNDb25maWctPk9DUG9sYXJpdHkpKTsNCi0NCi0gIC8qIFByb2Nlc3MgTG9ja2VkICovDQotICBfX0hBTF9MT0NLKGh0aW0pOw0KLQ0KLSAgc3dpdGNoIChDaGFubmVsKSB7DQotICAgIGNhc2UgVElNX0NIQU5ORUxfMTogew0KLSAgICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzFfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsNCi0NCi0gICAgICAvKiBDb25maWd1cmUgdGhlIFRJTSBDaGFubmVsIDEgaW4gT3V0cHV0IENvbXBhcmUgKi8NCi0gICAgICBUSU1fT0MxX1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgc0NvbmZpZyk7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0NCi0gICAgY2FzZSBUSU1fQ0hBTk5FTF8yOiB7DQotICAgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDMl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOw0KLQ0KLSAgICAgIC8qIENvbmZpZ3VyZSB0aGUgVElNIENoYW5uZWwgMiBpbiBPdXRwdXQgQ29tcGFyZSAqLw0KLSAgICAgIFRJTV9PQzJfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCBzQ29uZmlnKTsNCi0gICAgICBicmVhazsNCi0gICAgfQ0KLQ0KLSAgICBjYXNlIFRJTV9DSEFOTkVMXzM6IHsNCi0gICAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0MzX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7DQotDQotICAgICAgLyogQ29uZmlndXJlIHRoZSBUSU0gQ2hhbm5lbCAzIGluIE91dHB1dCBDb21wYXJlICovDQotICAgICAgVElNX09DM19TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsIHNDb25maWcpOw0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotDQotICAgIGNhc2UgVElNX0NIQU5ORUxfNDogew0KLSAgICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzRfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsNCi0NCi0gICAgICAvKiBDb25maWd1cmUgdGhlIFRJTSBDaGFubmVsIDQgaW4gT3V0cHV0IENvbXBhcmUgKi8NCi0gICAgICBUSU1fT0M0X1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgc0NvbmZpZyk7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0NCi0gICAgY2FzZSBUSU1fQ0hBTk5FTF81OiB7DQotICAgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDNV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOw0KLQ0KLSAgICAgIC8qIENvbmZpZ3VyZSB0aGUgVElNIENoYW5uZWwgNSBpbiBPdXRwdXQgQ29tcGFyZSAqLw0KLSAgICAgIFRJTV9PQzVfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCBzQ29uZmlnKTsNCi0gICAgICBicmVhazsNCi0gICAgfQ0KLQ0KLSAgICBjYXNlIFRJTV9DSEFOTkVMXzY6IHsNCi0gICAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0M2X0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7DQotDQotICAgICAgLyogQ29uZmlndXJlIHRoZSBUSU0gQ2hhbm5lbCA2IGluIE91dHB1dCBDb21wYXJlICovDQotICAgICAgVElNX09DNl9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsIHNDb25maWcpOw0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotDQotICAgIGRlZmF1bHQ6DQotICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOw0KLSAgICAgIGJyZWFrOw0KLSAgfQ0KLQ0KLSAgX19IQUxfVU5MT0NLKGh0aW0pOw0KLQ0KLSAgcmV0dXJuIHN0YXR1czsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgVElNIElucHV0IENhcHR1cmUgQ2hhbm5lbHMgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQNCi0gKiAgICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIFRJTV9JQ19Jbml0VHlwZURlZi4NCi0gKiBAcGFyYW0gIGh0aW0gVElNIElDIGhhbmRsZQ0KLSAqIEBwYXJhbSAgc0NvbmZpZyBUSU0gSW5wdXQgQ2FwdHVyZSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZQ0KLSAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbCB0byBjb25maWd1cmUNCi0gKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9JQ19Db25maWdDaGFubmVsKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fSUNfSW5pdFR5cGVEZWYgKnNDb25maWcsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpIHsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsNCi0NCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDMV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JQ19QT0xBUklUWShzQ29uZmlnLT5JQ1BvbGFyaXR5KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0lDX1NFTEVDVElPTihzQ29uZmlnLT5JQ1NlbGVjdGlvbikpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JQ19QUkVTQ0FMRVIoc0NvbmZpZy0+SUNQcmVzY2FsZXIpKTsNCi0gIGFzc2VydF9wYXJhbShJU19USU1fSUNfRklMVEVSKHNDb25maWctPklDRmlsdGVyKSk7DQotDQotICAvKiBQcm9jZXNzIExvY2tlZCAqLw0KLSAgX19IQUxfTE9DSyhodGltKTsNCi0NCi0gIGlmIChDaGFubmVsID09IFRJTV9DSEFOTkVMXzEpIHsNCi0gICAgLyogVEkxIENvbmZpZ3VyYXRpb24gKi8NCi0gICAgVElNX1RJMV9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsIHNDb25maWctPklDUG9sYXJpdHksIHNDb25maWctPklDU2VsZWN0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICBzQ29uZmlnLT5JQ0ZpbHRlcik7DQotDQotICAgIC8qIFJlc2V0IHRoZSBJQzFQU0MgQml0cyAqLw0KLSAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjEgJj0gflRJTV9DQ01SMV9JQzFQU0M7DQotDQotICAgIC8qIFNldCB0aGUgSUMxUFNDIHZhbHVlICovDQotICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMSB8PSBzQ29uZmlnLT5JQ1ByZXNjYWxlcjsNCi0gIH0gZWxzZSBpZiAoQ2hhbm5lbCA9PSBUSU1fQ0hBTk5FTF8yKSB7DQotICAgIC8qIFRJMiBDb25maWd1cmF0aW9uICovDQotICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0MyX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7DQotDQotICAgIFRJTV9USTJfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCBzQ29uZmlnLT5JQ1BvbGFyaXR5LCBzQ29uZmlnLT5JQ1NlbGVjdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgc0NvbmZpZy0+SUNGaWx0ZXIpOw0KLQ0KLSAgICAvKiBSZXNldCB0aGUgSUMyUFNDIEJpdHMgKi8NCi0gICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIxICY9IH5USU1fQ0NNUjFfSUMyUFNDOw0KLQ0KLSAgICAvKiBTZXQgdGhlIElDMlBTQyB2YWx1ZSAqLw0KLSAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjEgfD0gKHNDb25maWctPklDUHJlc2NhbGVyIDw8IDhVKTsNCi0gIH0gZWxzZSBpZiAoQ2hhbm5lbCA9PSBUSU1fQ0hBTk5FTF8zKSB7DQotICAgIC8qIFRJMyBDb25maWd1cmF0aW9uICovDQotICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0MzX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7DQotDQotICAgIFRJTV9USTNfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCBzQ29uZmlnLT5JQ1BvbGFyaXR5LCBzQ29uZmlnLT5JQ1NlbGVjdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgc0NvbmZpZy0+SUNGaWx0ZXIpOw0KLQ0KLSAgICAvKiBSZXNldCB0aGUgSUMzUFNDIEJpdHMgKi8NCi0gICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIyICY9IH5USU1fQ0NNUjJfSUMzUFNDOw0KLQ0KLSAgICAvKiBTZXQgdGhlIElDM1BTQyB2YWx1ZSAqLw0KLSAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjIgfD0gc0NvbmZpZy0+SUNQcmVzY2FsZXI7DQotICB9IGVsc2UgaWYgKENoYW5uZWwgPT0gVElNX0NIQU5ORUxfNCkgew0KLSAgICAvKiBUSTQgQ29uZmlndXJhdGlvbiAqLw0KLSAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDNF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOw0KLQ0KLSAgICBUSU1fVEk0X1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgc0NvbmZpZy0+SUNQb2xhcml0eSwgc0NvbmZpZy0+SUNTZWxlY3Rpb24sDQotICAgICAgICAgICAgICAgICAgICAgIHNDb25maWctPklDRmlsdGVyKTsNCi0NCi0gICAgLyogUmVzZXQgdGhlIElDNFBTQyBCaXRzICovDQotICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMiAmPSB+VElNX0NDTVIyX0lDNFBTQzsNCi0NCi0gICAgLyogU2V0IHRoZSBJQzRQU0MgdmFsdWUgKi8NCi0gICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIyIHw9IChzQ29uZmlnLT5JQ1ByZXNjYWxlciA8PCA4VSk7DQotICB9IGVsc2Ugew0KLSAgICBzdGF0dXMgPSBIQUxfRVJST1I7DQotICB9DQotDQotICBfX0hBTF9VTkxPQ0soaHRpbSk7DQotDQotICByZXR1cm4gc3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBUSU0gUFdNICBjaGFubmVscyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZA0KLSAqICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgVElNX09DX0luaXRUeXBlRGVmLg0KLSAqIEBwYXJhbSAgaHRpbSBUSU0gUFdNIGhhbmRsZQ0KLSAqIEBwYXJhbSAgc0NvbmZpZyBUSU0gUFdNIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlDQotICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVscyB0byBiZSBjb25maWd1cmVkDQotICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF81OiBUSU0gQ2hhbm5lbCA1IHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzY6IFRJTSBDaGFubmVsIDYgc2VsZWN0ZWQNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1BXTV9Db25maWdDaGFubmVsKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX09DX0luaXRUeXBlRGVmICpzQ29uZmlnLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCkgew0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fQ0hBTk5FTFMoQ2hhbm5lbCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9QV01fTU9ERShzQ29uZmlnLT5PQ01vZGUpKTsNCi0gIGFzc2VydF9wYXJhbShJU19USU1fT0NfUE9MQVJJVFkoc0NvbmZpZy0+T0NQb2xhcml0eSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9GQVNUX1NUQVRFKHNDb25maWctPk9DRmFzdE1vZGUpKTsNCi0NCi0gIC8qIFByb2Nlc3MgTG9ja2VkICovDQotICBfX0hBTF9MT0NLKGh0aW0pOw0KLQ0KLSAgc3dpdGNoIChDaGFubmVsKSB7DQotICAgIGNhc2UgVElNX0NIQU5ORUxfMTogew0KLSAgICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzFfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsNCi0NCi0gICAgICAvKiBDb25maWd1cmUgdGhlIENoYW5uZWwgMSBpbiBQV00gbW9kZSAqLw0KLSAgICAgIFRJTV9PQzFfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCBzQ29uZmlnKTsNCi0NCi0gICAgICAvKiBTZXQgdGhlIFByZWxvYWQgZW5hYmxlIGJpdCBmb3IgY2hhbm5lbDEgKi8NCi0gICAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjEgfD0gVElNX0NDTVIxX09DMVBFOw0KLQ0KLSAgICAgIC8qIENvbmZpZ3VyZSB0aGUgT3V0cHV0IEZhc3QgbW9kZSAqLw0KLSAgICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMSAmPSB+VElNX0NDTVIxX09DMUZFOw0KLSAgICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMSB8PSBzQ29uZmlnLT5PQ0Zhc3RNb2RlOw0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotDQotICAgIGNhc2UgVElNX0NIQU5ORUxfMjogew0KLSAgICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzJfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsNCi0NCi0gICAgICAvKiBDb25maWd1cmUgdGhlIENoYW5uZWwgMiBpbiBQV00gbW9kZSAqLw0KLSAgICAgIFRJTV9PQzJfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCBzQ29uZmlnKTsNCi0NCi0gICAgICAvKiBTZXQgdGhlIFByZWxvYWQgZW5hYmxlIGJpdCBmb3IgY2hhbm5lbDIgKi8NCi0gICAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjEgfD0gVElNX0NDTVIxX09DMlBFOw0KLQ0KLSAgICAgIC8qIENvbmZpZ3VyZSB0aGUgT3V0cHV0IEZhc3QgbW9kZSAqLw0KLSAgICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMSAmPSB+VElNX0NDTVIxX09DMkZFOw0KLSAgICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMSB8PSBzQ29uZmlnLT5PQ0Zhc3RNb2RlIDw8IDhVOw0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotDQotICAgIGNhc2UgVElNX0NIQU5ORUxfMzogew0KLSAgICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzNfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsNCi0NCi0gICAgICAvKiBDb25maWd1cmUgdGhlIENoYW5uZWwgMyBpbiBQV00gbW9kZSAqLw0KLSAgICAgIFRJTV9PQzNfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCBzQ29uZmlnKTsNCi0NCi0gICAgICAvKiBTZXQgdGhlIFByZWxvYWQgZW5hYmxlIGJpdCBmb3IgY2hhbm5lbDMgKi8NCi0gICAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjIgfD0gVElNX0NDTVIyX09DM1BFOw0KLQ0KLSAgICAgIC8qIENvbmZpZ3VyZSB0aGUgT3V0cHV0IEZhc3QgbW9kZSAqLw0KLSAgICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMiAmPSB+VElNX0NDTVIyX09DM0ZFOw0KLSAgICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMiB8PSBzQ29uZmlnLT5PQ0Zhc3RNb2RlOw0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotDQotICAgIGNhc2UgVElNX0NIQU5ORUxfNDogew0KLSAgICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzRfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsNCi0NCi0gICAgICAvKiBDb25maWd1cmUgdGhlIENoYW5uZWwgNCBpbiBQV00gbW9kZSAqLw0KLSAgICAgIFRJTV9PQzRfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCBzQ29uZmlnKTsNCi0NCi0gICAgICAvKiBTZXQgdGhlIFByZWxvYWQgZW5hYmxlIGJpdCBmb3IgY2hhbm5lbDQgKi8NCi0gICAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjIgfD0gVElNX0NDTVIyX09DNFBFOw0KLQ0KLSAgICAgIC8qIENvbmZpZ3VyZSB0aGUgT3V0cHV0IEZhc3QgbW9kZSAqLw0KLSAgICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMiAmPSB+VElNX0NDTVIyX09DNEZFOw0KLSAgICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMiB8PSBzQ29uZmlnLT5PQ0Zhc3RNb2RlIDw8IDhVOw0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotDQotICAgIGNhc2UgVElNX0NIQU5ORUxfNTogew0KLSAgICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzVfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsNCi0NCi0gICAgICAvKiBDb25maWd1cmUgdGhlIENoYW5uZWwgNSBpbiBQV00gbW9kZSAqLw0KLSAgICAgIFRJTV9PQzVfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCBzQ29uZmlnKTsNCi0NCi0gICAgICAvKiBTZXQgdGhlIFByZWxvYWQgZW5hYmxlIGJpdCBmb3IgY2hhbm5lbDUqLw0KLSAgICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMyB8PSBUSU1fQ0NNUjNfT0M1UEU7DQotDQotICAgICAgLyogQ29uZmlndXJlIHRoZSBPdXRwdXQgRmFzdCBtb2RlICovDQotICAgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIzICY9IH5USU1fQ0NNUjNfT0M1RkU7DQotICAgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIzIHw9IHNDb25maWctPk9DRmFzdE1vZGU7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0NCi0gICAgY2FzZSBUSU1fQ0hBTk5FTF82OiB7DQotICAgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDNl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOw0KLQ0KLSAgICAgIC8qIENvbmZpZ3VyZSB0aGUgQ2hhbm5lbCA2IGluIFBXTSBtb2RlICovDQotICAgICAgVElNX09DNl9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsIHNDb25maWcpOw0KLQ0KLSAgICAgIC8qIFNldCB0aGUgUHJlbG9hZCBlbmFibGUgYml0IGZvciBjaGFubmVsNiAqLw0KLSAgICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMyB8PSBUSU1fQ0NNUjNfT0M2UEU7DQotDQotICAgICAgLyogQ29uZmlndXJlIHRoZSBPdXRwdXQgRmFzdCBtb2RlICovDQotICAgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIzICY9IH5USU1fQ0NNUjNfT0M2RkU7DQotICAgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIzIHw9IHNDb25maWctPk9DRmFzdE1vZGUgPDwgOFU7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0NCi0gICAgZGVmYXVsdDoNCi0gICAgICBzdGF0dXMgPSBIQUxfRVJST1I7DQotICAgICAgYnJlYWs7DQotICB9DQotDQotICBfX0hBTF9VTkxPQ0soaHRpbSk7DQotDQotICByZXR1cm4gc3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBUSU0gT25lIFB1bHNlIENoYW5uZWxzIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkDQotICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBUSU1fT25lUHVsc2VfSW5pdFR5cGVEZWYuDQotICogQHBhcmFtICBodGltIFRJTSBPbmUgUHVsc2UgaGFuZGxlDQotICogQHBhcmFtICBzQ29uZmlnIFRJTSBPbmUgUHVsc2UgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUNCi0gKiBAcGFyYW0gIE91dHB1dENoYW5uZWwgVElNIG91dHB1dCBjaGFubmVsIHRvIGNvbmZpZ3VyZQ0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZA0KLSAqIEBwYXJhbSAgSW5wdXRDaGFubmVsIFRJTSBpbnB1dCBDaGFubmVsIHRvIGNvbmZpZ3VyZQ0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZA0KLSAqIEBub3RlICBUbyBvdXRwdXQgYSB3YXZlZm9ybSB3aXRoIGEgbWluaW11bSBkZWxheSB1c2VyIGNhbiBlbmFibGUgdGhlIGZhc3QNCi0gKiAgICAgICAgbW9kZSBieSBjYWxsaW5nIHRoZSBAcmVmIF9fSEFMX1RJTV9FTkFCTEVfT0N4RkFTVCBtYWNyby4gVGhlbiBDQ3gNCi0gKiAgICAgICAgb3V0cHV0IGlzIGZvcmNlZCBpbiByZXNwb25zZSB0byB0aGUgZWRnZSBkZXRlY3Rpb24gb24gVEl4IGlucHV0LA0KLSAqICAgICAgICB3aXRob3V0IHRha2luZyBpbiBhY2NvdW50IHRoZSBjb21wYXJpc29uLg0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT25lUHVsc2VfQ29uZmlnQ2hhbm5lbCgNCi0gICAgVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIFRJTV9PbmVQdWxzZV9Jbml0VHlwZURlZiAqc0NvbmZpZywNCi0gICAgdWludDMyX3QgT3V0cHV0Q2hhbm5lbCwgdWludDMyX3QgSW5wdXRDaGFubmVsKSB7DQotICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7DQotICBUSU1fT0NfSW5pdFR5cGVEZWYgdGVtcDE7DQotDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PUE1fQ0hBTk5FTFMoT3V0cHV0Q2hhbm5lbCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PUE1fQ0hBTk5FTFMoSW5wdXRDaGFubmVsKSk7DQotDQotICBpZiAoT3V0cHV0Q2hhbm5lbCAhPSBJbnB1dENoYW5uZWwpIHsNCi0gICAgLyogUHJvY2VzcyBMb2NrZWQgKi8NCi0gICAgX19IQUxfTE9DSyhodGltKTsNCi0NCi0gICAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7DQotDQotICAgIC8qIEV4dHJhY3QgdGhlIE91dHB1dCBjb21wYXJlIGNvbmZpZ3VyYXRpb24gZnJvbSBzQ29uZmlnIHN0cnVjdHVyZSAqLw0KLSAgICB0ZW1wMS5PQ01vZGUgPSBzQ29uZmlnLT5PQ01vZGU7DQotICAgIHRlbXAxLlB1bHNlID0gc0NvbmZpZy0+UHVsc2U7DQotICAgIHRlbXAxLk9DUG9sYXJpdHkgPSBzQ29uZmlnLT5PQ1BvbGFyaXR5Ow0KLSAgICB0ZW1wMS5PQ05Qb2xhcml0eSA9IHNDb25maWctPk9DTlBvbGFyaXR5Ow0KLSAgICB0ZW1wMS5PQ0lkbGVTdGF0ZSA9IHNDb25maWctPk9DSWRsZVN0YXRlOw0KLSAgICB0ZW1wMS5PQ05JZGxlU3RhdGUgPSBzQ29uZmlnLT5PQ05JZGxlU3RhdGU7DQotDQotICAgIHN3aXRjaCAoT3V0cHV0Q2hhbm5lbCkgew0KLSAgICAgIGNhc2UgVElNX0NIQU5ORUxfMTogew0KLSAgICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzFfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsNCi0NCi0gICAgICAgIFRJTV9PQzFfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCAmdGVtcDEpOw0KLSAgICAgICAgYnJlYWs7DQotICAgICAgfQ0KLQ0KLSAgICAgIGNhc2UgVElNX0NIQU5ORUxfMjogew0KLSAgICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzJfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsNCi0NCi0gICAgICAgIFRJTV9PQzJfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCAmdGVtcDEpOw0KLSAgICAgICAgYnJlYWs7DQotICAgICAgfQ0KLQ0KLSAgICAgIGRlZmF1bHQ6DQotICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7DQotICAgICAgICBicmVhazsNCi0gICAgfQ0KLQ0KLSAgICBpZiAoc3RhdHVzID09IEhBTF9PSykgew0KLSAgICAgIHN3aXRjaCAoSW5wdXRDaGFubmVsKSB7DQotICAgICAgICBjYXNlIFRJTV9DSEFOTkVMXzE6IHsNCi0gICAgICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzFfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsNCi0NCi0gICAgICAgICAgVElNX1RJMV9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsIHNDb25maWctPklDUG9sYXJpdHksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNDb25maWctPklDU2VsZWN0aW9uLCBzQ29uZmlnLT5JQ0ZpbHRlcik7DQotDQotICAgICAgICAgIC8qIFJlc2V0IHRoZSBJQzFQU0MgQml0cyAqLw0KLSAgICAgICAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjEgJj0gflRJTV9DQ01SMV9JQzFQU0M7DQotDQotICAgICAgICAgIC8qIFNlbGVjdCB0aGUgVHJpZ2dlciBzb3VyY2UgKi8NCi0gICAgICAgICAgaHRpbS0+SW5zdGFuY2UtPlNNQ1IgJj0gflRJTV9TTUNSX1RTOw0KLSAgICAgICAgICBodGltLT5JbnN0YW5jZS0+U01DUiB8PSBUSU1fVFNfVEkxRlAxOw0KLQ0KLSAgICAgICAgICAvKiBTZWxlY3QgdGhlIFNsYXZlIE1vZGUgKi8NCi0gICAgICAgICAgaHRpbS0+SW5zdGFuY2UtPlNNQ1IgJj0gflRJTV9TTUNSX1NNUzsNCi0gICAgICAgICAgaHRpbS0+SW5zdGFuY2UtPlNNQ1IgfD0gVElNX1NMQVZFTU9ERV9UUklHR0VSOw0KLSAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGNhc2UgVElNX0NIQU5ORUxfMjogew0KLSAgICAgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDMl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOw0KLQ0KLSAgICAgICAgICBUSU1fVEkyX1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgc0NvbmZpZy0+SUNQb2xhcml0eSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc0NvbmZpZy0+SUNTZWxlY3Rpb24sIHNDb25maWctPklDRmlsdGVyKTsNCi0NCi0gICAgICAgICAgLyogUmVzZXQgdGhlIElDMlBTQyBCaXRzICovDQotICAgICAgICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMSAmPSB+VElNX0NDTVIxX0lDMlBTQzsNCi0NCi0gICAgICAgICAgLyogU2VsZWN0IHRoZSBUcmlnZ2VyIHNvdXJjZSAqLw0KLSAgICAgICAgICBodGltLT5JbnN0YW5jZS0+U01DUiAmPSB+VElNX1NNQ1JfVFM7DQotICAgICAgICAgIGh0aW0tPkluc3RhbmNlLT5TTUNSIHw9IFRJTV9UU19USTJGUDI7DQotDQotICAgICAgICAgIC8qIFNlbGVjdCB0aGUgU2xhdmUgTW9kZSAqLw0KLSAgICAgICAgICBodGltLT5JbnN0YW5jZS0+U01DUiAmPSB+VElNX1NNQ1JfU01TOw0KLSAgICAgICAgICBodGltLT5JbnN0YW5jZS0+U01DUiB8PSBUSU1fU0xBVkVNT0RFX1RSSUdHRVI7DQotICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOw0KLSAgICAgICAgICBicmVhazsNCi0gICAgICB9DQotICAgIH0NCi0NCi0gICAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOw0KLQ0KLSAgICBfX0hBTF9VTkxPQ0soaHRpbSk7DQotDQotICAgIHJldHVybiBzdGF0dXM7DQotICB9IGVsc2Ugew0KLSAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgRE1BIEJ1cnN0IHRvIHRyYW5zZmVyIERhdGEgZnJvbSB0aGUgbWVtb3J5IHRvIHRoZSBUSU0NCi0gKiBwZXJpcGhlcmFsDQotICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUNCi0gKiBAcGFyYW0gIEJ1cnN0QmFzZUFkZHJlc3MgVElNIEJhc2UgYWRkcmVzcyBmcm9tIHdoZXJlIHRoZSBETUEgIHdpbGwgc3RhcnQgdGhlDQotICogRGF0YSB3cml0ZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DUjENCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ1IyDQotICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX1NNQ1INCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfRElFUg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9TUg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9FR1INCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NNUjENCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NNUjINCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NFUg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DTlQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfUFNDDQotICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0FSUg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9SQ1INCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NSMQ0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DQ1IyDQotICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDUjMNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NSNA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9CRFRSDQotICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDTVIzDQotICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDUjUNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NSNg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9EVFIyDQotICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0VDUg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9USVNFTA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9BRjENCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQUYyDQotICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX09SDQotICogQHBhcmFtICBCdXJzdFJlcXVlc3RTcmMgVElNIERNQSBSZXF1ZXN0IHNvdXJjZXMNCi0gKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfVVBEQVRFOiBUSU0gdXBkYXRlIEludGVycnVwdCBzb3VyY2UNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9DQzE6IFRJTSBDYXB0dXJlIENvbXBhcmUgMSBETUEgc291cmNlDQotICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfQ0MyOiBUSU0gQ2FwdHVyZSBDb21wYXJlIDIgRE1BIHNvdXJjZQ0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX0NDMzogVElNIENhcHR1cmUgQ29tcGFyZSAzIERNQSBzb3VyY2UNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9DQzQ6IFRJTSBDYXB0dXJlIENvbXBhcmUgNCBETUEgc291cmNlDQotICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfQ09NOiBUSU0gQ29tbXV0YXRpb24gRE1BIHNvdXJjZQ0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX1RSSUdHRVI6IFRJTSBUcmlnZ2VyIERNQSBzb3VyY2UNCi0gKiBAcGFyYW0gIEJ1cnN0QnVmZmVyIFRoZSBCdWZmZXIgYWRkcmVzcy4NCi0gKiBAcGFyYW0gIEJ1cnN0TGVuZ3RoIERNQSBCdXJzdCBsZW5ndGguIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgdmFsdWUNCi0gKiAgICAgICAgIGJldHdlZW46IFRJTV9ETUFCVVJTVExFTkdUSF8xVFJBTlNGRVIgYW5kDQotICogVElNX0RNQUJVUlNUTEVOR1RIXzI2VFJBTlNGRVIuDQotICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSB1c2VkIG9ubHkgd2hlbiBCdXJzdExlbmd0aCBpcyBlcXVhbCB0byBETUENCi0gKiBkYXRhIHRyYW5zZmVyIGxlbmd0aC4NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0RNQUJ1cnN0X1dyaXRlU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEJ1cnN0QmFzZUFkZHJlc3MsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEJ1cnN0UmVxdWVzdFNyYywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKkJ1cnN0QnVmZmVyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBCdXJzdExlbmd0aCkgew0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzOw0KLQ0KLSAgc3RhdHVzID0gSEFMX1RJTV9ETUFCdXJzdF9NdWx0aVdyaXRlU3RhcnQoDQotICAgICAgaHRpbSwgQnVyc3RCYXNlQWRkcmVzcywgQnVyc3RSZXF1ZXN0U3JjLCBCdXJzdEJ1ZmZlciwgQnVyc3RMZW5ndGgsDQotICAgICAgKChCdXJzdExlbmd0aCkgPj4gOFUpICsgMVUpOw0KLQ0KLSAgcmV0dXJuIHN0YXR1czsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDb25maWd1cmUgdGhlIERNQSBCdXJzdCB0byB0cmFuc2ZlciBtdWx0aXBsZSBEYXRhIGZyb20gdGhlIG1lbW9yeSB0bw0KLSAqIHRoZSBUSU0gcGVyaXBoZXJhbA0KLSAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlDQotICogQHBhcmFtICBCdXJzdEJhc2VBZGRyZXNzIFRJTSBCYXNlIGFkZHJlc3MgZnJvbSB3aGVyZSB0aGUgRE1BIHdpbGwgc3RhcnQgdGhlDQotICogRGF0YSB3cml0ZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DUjENCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ1IyDQotICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX1NNQ1INCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfRElFUg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9TUg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9FR1INCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NNUjENCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NNUjINCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NFUg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DTlQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfUFNDDQotICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0FSUg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9SQ1INCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NSMQ0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DQ1IyDQotICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDUjMNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NSNA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9CRFRSDQotICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDTVIzDQotICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDUjUNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NSNg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9EVFIyDQotICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0VDUg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9USVNFTA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9BRjENCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQUYyDQotICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX09SDQotICogQHBhcmFtICBCdXJzdFJlcXVlc3RTcmMgVElNIERNQSBSZXF1ZXN0IHNvdXJjZXMNCi0gKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfVVBEQVRFOiBUSU0gdXBkYXRlIEludGVycnVwdCBzb3VyY2UNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9DQzE6IFRJTSBDYXB0dXJlIENvbXBhcmUgMSBETUEgc291cmNlDQotICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfQ0MyOiBUSU0gQ2FwdHVyZSBDb21wYXJlIDIgRE1BIHNvdXJjZQ0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX0NDMzogVElNIENhcHR1cmUgQ29tcGFyZSAzIERNQSBzb3VyY2UNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9DQzQ6IFRJTSBDYXB0dXJlIENvbXBhcmUgNCBETUEgc291cmNlDQotICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfQ09NOiBUSU0gQ29tbXV0YXRpb24gRE1BIHNvdXJjZQ0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX1RSSUdHRVI6IFRJTSBUcmlnZ2VyIERNQSBzb3VyY2UNCi0gKiBAcGFyYW0gIEJ1cnN0QnVmZmVyIFRoZSBCdWZmZXIgYWRkcmVzcy4NCi0gKiBAcGFyYW0gIEJ1cnN0TGVuZ3RoIERNQSBCdXJzdCBsZW5ndGguIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgdmFsdWUNCi0gKiAgICAgICAgIGJldHdlZW46IFRJTV9ETUFCVVJTVExFTkdUSF8xVFJBTlNGRVIgYW5kDQotICogVElNX0RNQUJVUlNUTEVOR1RIXzI2VFJBTlNGRVIuDQotICogQHBhcmFtICBEYXRhTGVuZ3RoIERhdGEgbGVuZ3RoLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIHZhbHVlDQotICogICAgICAgICBiZXR3ZWVuIDEgYW5kIDB4RkZGRi4NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0RNQUJ1cnN0X011bHRpV3JpdGVTdGFydChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBCdXJzdEJhc2VBZGRyZXNzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEJ1cnN0UmVxdWVzdFNyYywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqQnVyc3RCdWZmZXIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQnVyc3RMZW5ndGgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRGF0YUxlbmd0aCkgew0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fRE1BQlVSU1RfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsNCi0gIGFzc2VydF9wYXJhbShJU19USU1fRE1BX0JBU0UoQnVyc3RCYXNlQWRkcmVzcykpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9ETUFfU09VUkNFKEJ1cnN0UmVxdWVzdFNyYykpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9ETUFfTEVOR1RIKEJ1cnN0TGVuZ3RoKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0RNQV9EQVRBX0xFTkdUSChEYXRhTGVuZ3RoKSk7DQotDQotICBpZiAoaHRpbS0+RE1BQnVyc3RTdGF0ZSA9PSBIQUxfRE1BX0JVUlNUX1NUQVRFX0JVU1kpIHsNCi0gICAgcmV0dXJuIEhBTF9CVVNZOw0KLSAgfSBlbHNlIGlmIChodGltLT5ETUFCdXJzdFN0YXRlID09IEhBTF9ETUFfQlVSU1RfU1RBVEVfUkVBRFkpIHsNCi0gICAgaWYgKChCdXJzdEJ1ZmZlciA9PSBOVUxMKSAmJiAoQnVyc3RMZW5ndGggPiAwVSkpIHsNCi0gICAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgIGh0aW0tPkRNQUJ1cnN0U3RhdGUgPSBIQUxfRE1BX0JVUlNUX1NUQVRFX0JVU1k7DQotICAgIH0NCi0gIH0gZWxzZSB7DQotICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8NCi0gIH0NCi0NCi0gIHN3aXRjaCAoQnVyc3RSZXF1ZXN0U3JjKSB7DQotICAgIGNhc2UgVElNX0RNQV9VUERBVEU6IHsNCi0gICAgICAvKiBTZXQgdGhlIERNQSBQZXJpb2QgZWxhcHNlZCBjYWxsYmFja3MgKi8NCi0gICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfVVBEQVRFXS0+WGZlckNwbHRDYWxsYmFjayA9DQotICAgICAgICAgIFRJTV9ETUFQZXJpb2RFbGFwc2VkQ3BsdDsNCi0gICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfVVBEQVRFXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPQ0KLSAgICAgICAgICBUSU1fRE1BUGVyaW9kRWxhcHNlZEhhbGZDcGx0Ow0KLQ0KLSAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovDQotICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX1VQREFURV0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yOw0KLQ0KLSAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8NCi0gICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfVVBEQVRFXSwgKHVpbnQzMl90KUJ1cnN0QnVmZmVyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkRNQVIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YUxlbmd0aCkgIT0gSEFMX09LKSB7DQotICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovDQotICAgICAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgICAgIH0NCi0gICAgICBicmVhazsNCi0gICAgfQ0KLSAgICBjYXNlIFRJTV9ETUFfQ0MxOiB7DQotICAgICAgLyogU2V0IHRoZSBETUEgY29tcGFyZSBjYWxsYmFja3MgKi8NCi0gICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFEZWxheVB1bHNlQ3BsdDsNCi0gICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPQ0KLSAgICAgICAgICBUSU1fRE1BRGVsYXlQdWxzZUhhbGZDcGx0Ow0KLQ0KLSAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovDQotICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yOw0KLQ0KLSAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8NCi0gICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXSwgKHVpbnQzMl90KUJ1cnN0QnVmZmVyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkRNQVIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YUxlbmd0aCkgIT0gSEFMX09LKSB7DQotICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovDQotICAgICAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgICAgIH0NCi0gICAgICBicmVhazsNCi0gICAgfQ0KLSAgICBjYXNlIFRJTV9ETUFfQ0MyOiB7DQotICAgICAgLyogU2V0IHRoZSBETUEgY29tcGFyZSBjYWxsYmFja3MgKi8NCi0gICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFEZWxheVB1bHNlQ3BsdDsNCi0gICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPQ0KLSAgICAgICAgICBUSU1fRE1BRGVsYXlQdWxzZUhhbGZDcGx0Ow0KLQ0KLSAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovDQotICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yOw0KLQ0KLSAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8NCi0gICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXSwgKHVpbnQzMl90KUJ1cnN0QnVmZmVyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkRNQVIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YUxlbmd0aCkgIT0gSEFMX09LKSB7DQotICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovDQotICAgICAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgICAgIH0NCi0gICAgICBicmVhazsNCi0gICAgfQ0KLSAgICBjYXNlIFRJTV9ETUFfQ0MzOiB7DQotICAgICAgLyogU2V0IHRoZSBETUEgY29tcGFyZSBjYWxsYmFja3MgKi8NCi0gICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFEZWxheVB1bHNlQ3BsdDsNCi0gICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPQ0KLSAgICAgICAgICBUSU1fRE1BRGVsYXlQdWxzZUhhbGZDcGx0Ow0KLQ0KLSAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovDQotICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yOw0KLQ0KLSAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8NCi0gICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXSwgKHVpbnQzMl90KUJ1cnN0QnVmZmVyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkRNQVIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YUxlbmd0aCkgIT0gSEFMX09LKSB7DQotICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovDQotICAgICAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgICAgIH0NCi0gICAgICBicmVhazsNCi0gICAgfQ0KLSAgICBjYXNlIFRJTV9ETUFfQ0M0OiB7DQotICAgICAgLyogU2V0IHRoZSBETUEgY29tcGFyZSBjYWxsYmFja3MgKi8NCi0gICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFEZWxheVB1bHNlQ3BsdDsNCi0gICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPQ0KLSAgICAgICAgICBUSU1fRE1BRGVsYXlQdWxzZUhhbGZDcGx0Ow0KLQ0KLSAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovDQotICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDNF0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yOw0KLQ0KLSAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8NCi0gICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XSwgKHVpbnQzMl90KUJ1cnN0QnVmZmVyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkRNQVIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YUxlbmd0aCkgIT0gSEFMX09LKSB7DQotICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovDQotICAgICAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgICAgIH0NCi0gICAgICBicmVhazsNCi0gICAgfQ0KLSAgICBjYXNlIFRJTV9ETUFfQ09NOiB7DQotICAgICAgLyogU2V0IHRoZSBETUEgY29tbXV0YXRpb24gY2FsbGJhY2tzICovDQotICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NPTU1VVEFUSU9OXS0+WGZlckNwbHRDYWxsYmFjayA9DQotICAgICAgICAgIFRJTUV4X0RNQUNvbW11dGF0aW9uQ3BsdDsNCi0gICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ09NTVVUQVRJT05dLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9DQotICAgICAgICAgIFRJTUV4X0RNQUNvbW11dGF0aW9uSGFsZkNwbHQ7DQotDQotICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8NCi0gICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ09NTVVUQVRJT05dLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvcjsNCi0NCi0gICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovDQotICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoDQotICAgICAgICAgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ09NTVVUQVRJT05dLCAodWludDMyX3QpQnVyc3RCdWZmZXIsDQotICAgICAgICAgICAgICAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5ETUFSLCBEYXRhTGVuZ3RoKSAhPSBIQUxfT0spIHsNCi0gICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8NCi0gICAgICAgIHJldHVybiBIQUxfRVJST1I7DQotICAgICAgfQ0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotICAgIGNhc2UgVElNX0RNQV9UUklHR0VSOiB7DQotICAgICAgLyogU2V0IHRoZSBETUEgdHJpZ2dlciBjYWxsYmFja3MgKi8NCi0gICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfVFJJR0dFUl0tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BVHJpZ2dlckNwbHQ7DQotICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX1RSSUdHRVJdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9DQotICAgICAgICAgIFRJTV9ETUFUcmlnZ2VySGFsZkNwbHQ7DQotDQotICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8NCi0gICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfVFJJR0dFUl0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yOw0KLQ0KLSAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8NCi0gICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVCgNCi0gICAgICAgICAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9UUklHR0VSXSwgKHVpbnQzMl90KUJ1cnN0QnVmZmVyLA0KLSAgICAgICAgICAgICAgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+RE1BUiwgRGF0YUxlbmd0aCkgIT0gSEFMX09LKSB7DQotICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovDQotICAgICAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgICAgIH0NCi0gICAgICBicmVhazsNCi0gICAgfQ0KLSAgICBkZWZhdWx0Og0KLSAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsNCi0gICAgICBicmVhazsNCi0gIH0NCi0NCi0gIGlmIChzdGF0dXMgPT0gSEFMX09LKSB7DQotICAgIC8qIENvbmZpZ3VyZSB0aGUgRE1BIEJ1cnN0IE1vZGUgKi8NCi0gICAgaHRpbS0+SW5zdGFuY2UtPkRDUiA9IChCdXJzdEJhc2VBZGRyZXNzIHwgQnVyc3RMZW5ndGgpOw0KLSAgICAvKiBFbmFibGUgdGhlIFRJTSBETUEgUmVxdWVzdCAqLw0KLSAgICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBCdXJzdFJlcXVlc3RTcmMpOw0KLSAgfQ0KLQ0KLSAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLw0KLSAgcmV0dXJuIHN0YXR1czsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTdG9wcyB0aGUgVElNIERNQSBCdXJzdCBtb2RlDQotICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUNCi0gKiBAcGFyYW0gIEJ1cnN0UmVxdWVzdFNyYyBUSU0gRE1BIFJlcXVlc3Qgc291cmNlcyB0byBkaXNhYmxlDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9ETUFCdXJzdF9Xcml0ZVN0b3AoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQnVyc3RSZXF1ZXN0U3JjKSB7DQotICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7DQotDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9ETUFfU09VUkNFKEJ1cnN0UmVxdWVzdFNyYykpOw0KLQ0KLSAgLyogQWJvcnQgdGhlIERNQSB0cmFuc2ZlciAoYXQgbGVhc3QgZGlzYWJsZSB0aGUgRE1BIGNoYW5uZWwpICovDQotICBzd2l0Y2ggKEJ1cnN0UmVxdWVzdFNyYykgew0KLSAgICBjYXNlIFRJTV9ETUFfVVBEQVRFOiB7DQotICAgICAgKHZvaWQpSEFMX0RNQV9BYm9ydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfVVBEQVRFXSk7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0gICAgY2FzZSBUSU1fRE1BX0NDMTogew0KLSAgICAgICh2b2lkKUhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0pOw0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotICAgIGNhc2UgVElNX0RNQV9DQzI6IHsNCi0gICAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdKTsNCi0gICAgICBicmVhazsNCi0gICAgfQ0KLSAgICBjYXNlIFRJTV9ETUFfQ0MzOiB7DQotICAgICAgKHZvaWQpSEFMX0RNQV9BYm9ydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXSk7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0gICAgY2FzZSBUSU1fRE1BX0NDNDogew0KLSAgICAgICh2b2lkKUhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDNF0pOw0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotICAgIGNhc2UgVElNX0RNQV9DT006IHsNCi0gICAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DT01NVVRBVElPTl0pOw0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotICAgIGNhc2UgVElNX0RNQV9UUklHR0VSOiB7DQotICAgICAgKHZvaWQpSEFMX0RNQV9BYm9ydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfVFJJR0dFUl0pOw0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotICAgIGRlZmF1bHQ6DQotICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOw0KLSAgICAgIGJyZWFrOw0KLSAgfQ0KLQ0KLSAgaWYgKHN0YXR1cyA9PSBIQUxfT0spIHsNCi0gICAgLyogRGlzYWJsZSB0aGUgVElNIFVwZGF0ZSBETUEgcmVxdWVzdCAqLw0KLSAgICBfX0hBTF9USU1fRElTQUJMRV9ETUEoaHRpbSwgQnVyc3RSZXF1ZXN0U3JjKTsNCi0NCi0gICAgLyogQ2hhbmdlIHRoZSBETUEgYnVyc3Qgb3BlcmF0aW9uIHN0YXRlICovDQotICAgIGh0aW0tPkRNQUJ1cnN0U3RhdGUgPSBIQUxfRE1BX0JVUlNUX1NUQVRFX1JFQURZOw0KLSAgfQ0KLQ0KLSAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLw0KLSAgcmV0dXJuIHN0YXR1czsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDb25maWd1cmUgdGhlIERNQSBCdXJzdCB0byB0cmFuc2ZlciBEYXRhIGZyb20gdGhlIFRJTSBwZXJpcGhlcmFsIHRvDQotICogdGhlIG1lbW9yeQ0KLSAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlDQotICogQHBhcmFtICBCdXJzdEJhc2VBZGRyZXNzIFRJTSBCYXNlIGFkZHJlc3MgZnJvbSB3aGVyZSB0aGUgRE1BICB3aWxsIHN0YXJ0IHRoZQ0KLSAqIERhdGEgcmVhZCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DUjENCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ1IyDQotICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX1NNQ1INCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfRElFUg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9TUg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9FR1INCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NNUjENCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NNUjINCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NFUg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DTlQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfUFNDDQotICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0FSUg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9SQ1INCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NSMQ0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DQ1IyDQotICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDUjMNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NSNA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9CRFRSDQotICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDTVIzDQotICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDUjUNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NSNg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9EVFIyDQotICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0VDUg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9USVNFTA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9BRjENCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQUYyDQotICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX09SDQotICogQHBhcmFtICBCdXJzdFJlcXVlc3RTcmMgVElNIERNQSBSZXF1ZXN0IHNvdXJjZXMNCi0gKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfVVBEQVRFOiBUSU0gdXBkYXRlIEludGVycnVwdCBzb3VyY2UNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9DQzE6IFRJTSBDYXB0dXJlIENvbXBhcmUgMSBETUEgc291cmNlDQotICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfQ0MyOiBUSU0gQ2FwdHVyZSBDb21wYXJlIDIgRE1BIHNvdXJjZQ0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX0NDMzogVElNIENhcHR1cmUgQ29tcGFyZSAzIERNQSBzb3VyY2UNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9DQzQ6IFRJTSBDYXB0dXJlIENvbXBhcmUgNCBETUEgc291cmNlDQotICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfQ09NOiBUSU0gQ29tbXV0YXRpb24gRE1BIHNvdXJjZQ0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX1RSSUdHRVI6IFRJTSBUcmlnZ2VyIERNQSBzb3VyY2UNCi0gKiBAcGFyYW0gIEJ1cnN0QnVmZmVyIFRoZSBCdWZmZXIgYWRkcmVzcy4NCi0gKiBAcGFyYW0gIEJ1cnN0TGVuZ3RoIERNQSBCdXJzdCBsZW5ndGguIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgdmFsdWUNCi0gKiAgICAgICAgIGJldHdlZW46IFRJTV9ETUFCVVJTVExFTkdUSF8xVFJBTlNGRVIgYW5kDQotICogVElNX0RNQUJVUlNUTEVOR1RIXzI2VFJBTlNGRVIuDQotICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSB1c2VkIG9ubHkgd2hlbiBCdXJzdExlbmd0aCBpcyBlcXVhbCB0byBETUENCi0gKiBkYXRhIHRyYW5zZmVyIGxlbmd0aC4NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0RNQUJ1cnN0X1JlYWRTdGFydChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBCdXJzdEJhc2VBZGRyZXNzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEJ1cnN0UmVxdWVzdFNyYywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqQnVyc3RCdWZmZXIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQnVyc3RMZW5ndGgpIHsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1czsNCi0NCi0gIHN0YXR1cyA9IEhBTF9USU1fRE1BQnVyc3RfTXVsdGlSZWFkU3RhcnQoDQotICAgICAgaHRpbSwgQnVyc3RCYXNlQWRkcmVzcywgQnVyc3RSZXF1ZXN0U3JjLCBCdXJzdEJ1ZmZlciwgQnVyc3RMZW5ndGgsDQotICAgICAgKChCdXJzdExlbmd0aCkgPj4gOFUpICsgMVUpOw0KLQ0KLSAgcmV0dXJuIHN0YXR1czsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDb25maWd1cmUgdGhlIERNQSBCdXJzdCB0byB0cmFuc2ZlciBEYXRhIGZyb20gdGhlIFRJTSBwZXJpcGhlcmFsIHRvDQotICogdGhlIG1lbW9yeQ0KLSAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlDQotICogQHBhcmFtICBCdXJzdEJhc2VBZGRyZXNzIFRJTSBCYXNlIGFkZHJlc3MgZnJvbSB3aGVyZSB0aGUgRE1BICB3aWxsIHN0YXJ0IHRoZQ0KLSAqIERhdGEgcmVhZCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DUjENCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ1IyDQotICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX1NNQ1INCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfRElFUg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9TUg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9FR1INCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NNUjENCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NNUjINCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NFUg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DTlQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfUFNDDQotICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0FSUg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9SQ1INCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NSMQ0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DQ1IyDQotICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDUjMNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NSNA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9CRFRSDQotICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDTVIzDQotICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDUjUNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NSNg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9EVFIyDQotICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0VDUg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9USVNFTA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9BRjENCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQUYyDQotICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX09SDQotICogQHBhcmFtICBCdXJzdFJlcXVlc3RTcmMgVElNIERNQSBSZXF1ZXN0IHNvdXJjZXMNCi0gKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfVVBEQVRFOiBUSU0gdXBkYXRlIEludGVycnVwdCBzb3VyY2UNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9DQzE6IFRJTSBDYXB0dXJlIENvbXBhcmUgMSBETUEgc291cmNlDQotICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfQ0MyOiBUSU0gQ2FwdHVyZSBDb21wYXJlIDIgRE1BIHNvdXJjZQ0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX0NDMzogVElNIENhcHR1cmUgQ29tcGFyZSAzIERNQSBzb3VyY2UNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9DQzQ6IFRJTSBDYXB0dXJlIENvbXBhcmUgNCBETUEgc291cmNlDQotICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfQ09NOiBUSU0gQ29tbXV0YXRpb24gRE1BIHNvdXJjZQ0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX1RSSUdHRVI6IFRJTSBUcmlnZ2VyIERNQSBzb3VyY2UNCi0gKiBAcGFyYW0gIEJ1cnN0QnVmZmVyIFRoZSBCdWZmZXIgYWRkcmVzcy4NCi0gKiBAcGFyYW0gIEJ1cnN0TGVuZ3RoIERNQSBCdXJzdCBsZW5ndGguIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgdmFsdWUNCi0gKiAgICAgICAgIGJldHdlZW46IFRJTV9ETUFCVVJTVExFTkdUSF8xVFJBTlNGRVIgYW5kDQotICogVElNX0RNQUJVUlNUTEVOR1RIXzI2VFJBTlNGRVIuDQotICogQHBhcmFtICBEYXRhTGVuZ3RoIERhdGEgbGVuZ3RoLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIHZhbHVlDQotICogICAgICAgICBiZXR3ZWVuIDEgYW5kIDB4RkZGRi4NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0RNQUJ1cnN0X011bHRpUmVhZFN0YXJ0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQnVyc3RCYXNlQWRkcmVzcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEJ1cnN0UmVxdWVzdFNyYywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpCdXJzdEJ1ZmZlciwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEJ1cnN0TGVuZ3RoLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRGF0YUxlbmd0aCkgew0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fRE1BQlVSU1RfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsNCi0gIGFzc2VydF9wYXJhbShJU19USU1fRE1BX0JBU0UoQnVyc3RCYXNlQWRkcmVzcykpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9ETUFfU09VUkNFKEJ1cnN0UmVxdWVzdFNyYykpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9ETUFfTEVOR1RIKEJ1cnN0TGVuZ3RoKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0RNQV9EQVRBX0xFTkdUSChEYXRhTGVuZ3RoKSk7DQotDQotICBpZiAoaHRpbS0+RE1BQnVyc3RTdGF0ZSA9PSBIQUxfRE1BX0JVUlNUX1NUQVRFX0JVU1kpIHsNCi0gICAgcmV0dXJuIEhBTF9CVVNZOw0KLSAgfSBlbHNlIGlmIChodGltLT5ETUFCdXJzdFN0YXRlID09IEhBTF9ETUFfQlVSU1RfU1RBVEVfUkVBRFkpIHsNCi0gICAgaWYgKChCdXJzdEJ1ZmZlciA9PSBOVUxMKSAmJiAoQnVyc3RMZW5ndGggPiAwVSkpIHsNCi0gICAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgIGh0aW0tPkRNQUJ1cnN0U3RhdGUgPSBIQUxfRE1BX0JVUlNUX1NUQVRFX0JVU1k7DQotICAgIH0NCi0gIH0gZWxzZSB7DQotICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8NCi0gIH0NCi0gIHN3aXRjaCAoQnVyc3RSZXF1ZXN0U3JjKSB7DQotICAgIGNhc2UgVElNX0RNQV9VUERBVEU6IHsNCi0gICAgICAvKiBTZXQgdGhlIERNQSBQZXJpb2QgZWxhcHNlZCBjYWxsYmFja3MgKi8NCi0gICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfVVBEQVRFXS0+WGZlckNwbHRDYWxsYmFjayA9DQotICAgICAgICAgIFRJTV9ETUFQZXJpb2RFbGFwc2VkQ3BsdDsNCi0gICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfVVBEQVRFXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPQ0KLSAgICAgICAgICBUSU1fRE1BUGVyaW9kRWxhcHNlZEhhbGZDcGx0Ow0KLQ0KLSAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovDQotICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX1VQREFURV0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yOw0KLQ0KLSAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8NCi0gICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfVVBEQVRFXSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5ETUFSLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdClCdXJzdEJ1ZmZlciwgRGF0YUxlbmd0aCkgIT0gSEFMX09LKSB7DQotICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovDQotICAgICAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgICAgIH0NCi0gICAgICBicmVhazsNCi0gICAgfQ0KLSAgICBjYXNlIFRJTV9ETUFfQ0MxOiB7DQotICAgICAgLyogU2V0IHRoZSBETUEgY2FwdHVyZSBjYWxsYmFja3MgKi8NCi0gICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFDYXB0dXJlQ3BsdDsNCi0gICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BQ2FwdHVyZUhhbGZDcGx0Ow0KLQ0KLSAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovDQotICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yOw0KLQ0KLSAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8NCi0gICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5ETUFSLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdClCdXJzdEJ1ZmZlciwgRGF0YUxlbmd0aCkgIT0gSEFMX09LKSB7DQotICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovDQotICAgICAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgICAgIH0NCi0gICAgICBicmVhazsNCi0gICAgfQ0KLSAgICBjYXNlIFRJTV9ETUFfQ0MyOiB7DQotICAgICAgLyogU2V0IHRoZSBETUEgY2FwdHVyZSBjYWxsYmFja3MgKi8NCi0gICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFDYXB0dXJlQ3BsdDsNCi0gICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BQ2FwdHVyZUhhbGZDcGx0Ow0KLQ0KLSAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovDQotICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yOw0KLQ0KLSAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8NCi0gICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5ETUFSLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdClCdXJzdEJ1ZmZlciwgRGF0YUxlbmd0aCkgIT0gSEFMX09LKSB7DQotICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovDQotICAgICAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgICAgIH0NCi0gICAgICBicmVhazsNCi0gICAgfQ0KLSAgICBjYXNlIFRJTV9ETUFfQ0MzOiB7DQotICAgICAgLyogU2V0IHRoZSBETUEgY2FwdHVyZSBjYWxsYmFja3MgKi8NCi0gICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFDYXB0dXJlQ3BsdDsNCi0gICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BQ2FwdHVyZUhhbGZDcGx0Ow0KLQ0KLSAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovDQotICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yOw0KLQ0KLSAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8NCi0gICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5ETUFSLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdClCdXJzdEJ1ZmZlciwgRGF0YUxlbmd0aCkgIT0gSEFMX09LKSB7DQotICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovDQotICAgICAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgICAgIH0NCi0gICAgICBicmVhazsNCi0gICAgfQ0KLSAgICBjYXNlIFRJTV9ETUFfQ0M0OiB7DQotICAgICAgLyogU2V0IHRoZSBETUEgY2FwdHVyZSBjYWxsYmFja3MgKi8NCi0gICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFDYXB0dXJlQ3BsdDsNCi0gICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BQ2FwdHVyZUhhbGZDcGx0Ow0KLQ0KLSAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovDQotICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDNF0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yOw0KLQ0KLSAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8NCi0gICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5ETUFSLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdClCdXJzdEJ1ZmZlciwgRGF0YUxlbmd0aCkgIT0gSEFMX09LKSB7DQotICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovDQotICAgICAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgICAgIH0NCi0gICAgICBicmVhazsNCi0gICAgfQ0KLSAgICBjYXNlIFRJTV9ETUFfQ09NOiB7DQotICAgICAgLyogU2V0IHRoZSBETUEgY29tbXV0YXRpb24gY2FsbGJhY2tzICovDQotICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NPTU1VVEFUSU9OXS0+WGZlckNwbHRDYWxsYmFjayA9DQotICAgICAgICAgIFRJTUV4X0RNQUNvbW11dGF0aW9uQ3BsdDsNCi0gICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ09NTVVUQVRJT05dLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9DQotICAgICAgICAgIFRJTUV4X0RNQUNvbW11dGF0aW9uSGFsZkNwbHQ7DQotDQotICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8NCi0gICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ09NTVVUQVRJT05dLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvcjsNCi0NCi0gICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovDQotICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NPTU1VVEFUSU9OXSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5ETUFSLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdClCdXJzdEJ1ZmZlciwgRGF0YUxlbmd0aCkgIT0gSEFMX09LKSB7DQotICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovDQotICAgICAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgICAgIH0NCi0gICAgICBicmVhazsNCi0gICAgfQ0KLSAgICBjYXNlIFRJTV9ETUFfVFJJR0dFUjogew0KLSAgICAgIC8qIFNldCB0aGUgRE1BIHRyaWdnZXIgY2FsbGJhY2tzICovDQotICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX1RSSUdHRVJdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQVRyaWdnZXJDcGx0Ow0KLSAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9UUklHR0VSXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPQ0KLSAgICAgICAgICBUSU1fRE1BVHJpZ2dlckhhbGZDcGx0Ow0KLQ0KLSAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovDQotICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX1RSSUdHRVJdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvcjsNCi0NCi0gICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovDQotICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX1RSSUdHRVJdLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkRNQVIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KUJ1cnN0QnVmZmVyLCBEYXRhTGVuZ3RoKSAhPSBIQUxfT0spIHsNCi0gICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8NCi0gICAgICAgIHJldHVybiBIQUxfRVJST1I7DQotICAgICAgfQ0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotICAgIGRlZmF1bHQ6DQotICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOw0KLSAgICAgIGJyZWFrOw0KLSAgfQ0KLQ0KLSAgaWYgKHN0YXR1cyA9PSBIQUxfT0spIHsNCi0gICAgLyogQ29uZmlndXJlIHRoZSBETUEgQnVyc3QgTW9kZSAqLw0KLSAgICBodGltLT5JbnN0YW5jZS0+RENSID0gKEJ1cnN0QmFzZUFkZHJlc3MgfCBCdXJzdExlbmd0aCk7DQotDQotICAgIC8qIEVuYWJsZSB0aGUgVElNIERNQSBSZXF1ZXN0ICovDQotICAgIF9fSEFMX1RJTV9FTkFCTEVfRE1BKGh0aW0sIEJ1cnN0UmVxdWVzdFNyYyk7DQotICB9DQotDQotICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovDQotICByZXR1cm4gc3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFN0b3AgdGhlIERNQSBidXJzdCByZWFkaW5nDQotICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUNCi0gKiBAcGFyYW0gIEJ1cnN0UmVxdWVzdFNyYyBUSU0gRE1BIFJlcXVlc3Qgc291cmNlcyB0byBkaXNhYmxlLg0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fRE1BQnVyc3RfUmVhZFN0b3AoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBCdXJzdFJlcXVlc3RTcmMpIHsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsNCi0NCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0RNQV9TT1VSQ0UoQnVyc3RSZXF1ZXN0U3JjKSk7DQotDQotICAvKiBBYm9ydCB0aGUgRE1BIHRyYW5zZmVyIChhdCBsZWFzdCBkaXNhYmxlIHRoZSBETUEgY2hhbm5lbCkgKi8NCi0gIHN3aXRjaCAoQnVyc3RSZXF1ZXN0U3JjKSB7DQotICAgIGNhc2UgVElNX0RNQV9VUERBVEU6IHsNCi0gICAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9VUERBVEVdKTsNCi0gICAgICBicmVhazsNCi0gICAgfQ0KLSAgICBjYXNlIFRJTV9ETUFfQ0MxOiB7DQotICAgICAgKHZvaWQpSEFMX0RNQV9BYm9ydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXSk7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0gICAgY2FzZSBUSU1fRE1BX0NDMjogew0KLSAgICAgICh2b2lkKUhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0pOw0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotICAgIGNhc2UgVElNX0RNQV9DQzM6IHsNCi0gICAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdKTsNCi0gICAgICBicmVhazsNCi0gICAgfQ0KLSAgICBjYXNlIFRJTV9ETUFfQ0M0OiB7DQotICAgICAgKHZvaWQpSEFMX0RNQV9BYm9ydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XSk7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0gICAgY2FzZSBUSU1fRE1BX0NPTTogew0KLSAgICAgICh2b2lkKUhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NPTU1VVEFUSU9OXSk7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0gICAgY2FzZSBUSU1fRE1BX1RSSUdHRVI6IHsNCi0gICAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9UUklHR0VSXSk7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0gICAgZGVmYXVsdDoNCi0gICAgICBzdGF0dXMgPSBIQUxfRVJST1I7DQotICAgICAgYnJlYWs7DQotICB9DQotDQotICBpZiAoc3RhdHVzID09IEhBTF9PSykgew0KLSAgICAvKiBEaXNhYmxlIHRoZSBUSU0gVXBkYXRlIERNQSByZXF1ZXN0ICovDQotICAgIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBCdXJzdFJlcXVlc3RTcmMpOw0KLQ0KLSAgICAvKiBDaGFuZ2UgdGhlIERNQSBidXJzdCBvcGVyYXRpb24gc3RhdGUgKi8NCi0gICAgaHRpbS0+RE1BQnVyc3RTdGF0ZSA9IEhBTF9ETUFfQlVSU1RfU1RBVEVfUkVBRFk7DQotICB9DQotDQotICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovDQotICByZXR1cm4gc3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEdlbmVyYXRlIGEgc29mdHdhcmUgZXZlbnQNCi0gKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQ0KLSAqIEBwYXJhbSAgRXZlbnRTb3VyY2Ugc3BlY2lmaWVzIHRoZSBldmVudCBzb3VyY2UuDQotICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0VWRU5UU09VUkNFX1VQREFURTogVGltZXIgdXBkYXRlIEV2ZW50IHNvdXJjZQ0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRVZFTlRTT1VSQ0VfQ0MxOiBUaW1lciBDYXB0dXJlIENvbXBhcmUgMSBFdmVudCBzb3VyY2UNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0VWRU5UU09VUkNFX0NDMjogVGltZXIgQ2FwdHVyZSBDb21wYXJlIDIgRXZlbnQgc291cmNlDQotICogICAgICAgICAgICBAYXJnIFRJTV9FVkVOVFNPVVJDRV9DQzM6IFRpbWVyIENhcHR1cmUgQ29tcGFyZSAzIEV2ZW50IHNvdXJjZQ0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRVZFTlRTT1VSQ0VfQ0M0OiBUaW1lciBDYXB0dXJlIENvbXBhcmUgNCBFdmVudCBzb3VyY2UNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0VWRU5UU09VUkNFX0NPTTogVGltZXIgQ09NIGV2ZW50IHNvdXJjZQ0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRVZFTlRTT1VSQ0VfVFJJR0dFUjogVGltZXIgVHJpZ2dlciBFdmVudCBzb3VyY2UNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0VWRU5UU09VUkNFX0JSRUFLOiBUaW1lciBCcmVhayBldmVudCBzb3VyY2UNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0VWRU5UU09VUkNFX0JSRUFLMjogVGltZXIgQnJlYWsyIGV2ZW50IHNvdXJjZQ0KLSAqIEBub3RlICAgQmFzaWMgdGltZXJzIGNhbiBvbmx5IGdlbmVyYXRlIGFuIHVwZGF0ZSBldmVudC4NCi0gKiBAbm90ZSAgIFRJTV9FVkVOVFNPVVJDRV9DT00gaXMgcmVsZXZhbnQgb25seSB3aXRoIGFkdmFuY2VkIHRpbWVyIGluc3RhbmNlcy4NCi0gKiBAbm90ZSAgIFRJTV9FVkVOVFNPVVJDRV9CUkVBSyBhbmQgVElNX0VWRU5UU09VUkNFX0JSRUFLMiBhcmUgcmVsZXZhbnQNCi0gKiAgICAgICAgIG9ubHkgZm9yIHRpbWVyIGluc3RhbmNlcyBzdXBwb3J0aW5nIGJyZWFrIGlucHV0KHMpLg0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLQ0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fR2VuZXJhdGVFdmVudChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRXZlbnRTb3VyY2UpIHsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0VWRU5UX1NPVVJDRShFdmVudFNvdXJjZSkpOw0KLQ0KLSAgLyogUHJvY2VzcyBMb2NrZWQgKi8NCi0gIF9fSEFMX0xPQ0soaHRpbSk7DQotDQotICAvKiBDaGFuZ2UgdGhlIFRJTSBzdGF0ZSAqLw0KLSAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7DQotDQotICAvKiBTZXQgdGhlIGV2ZW50IHNvdXJjZXMgKi8NCi0gIGh0aW0tPkluc3RhbmNlLT5FR1IgPSBFdmVudFNvdXJjZTsNCi0NCi0gIC8qIENoYW5nZSB0aGUgVElNIHN0YXRlICovDQotICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7DQotDQotICBfX0hBTF9VTkxPQ0soaHRpbSk7DQotDQotICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovDQotICByZXR1cm4gSEFMX09LOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIE9DUmVmIGNsZWFyIGZlYXR1cmUNCi0gKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQ0KLSAqIEBwYXJhbSAgc0NsZWFySW5wdXRDb25maWcgcG9pbnRlciB0byBhIFRJTV9DbGVhcklucHV0Q29uZmlnVHlwZURlZiBzdHJ1Y3R1cmUNCi0gKiB0aGF0IGNvbnRhaW5zIHRoZSBPQ1JFRiBjbGVhciBmZWF0dXJlIGFuZCBwYXJhbWV0ZXJzIGZvciB0aGUgVElNIHBlcmlwaGVyYWwuDQotICogQHBhcmFtICBDaGFubmVsIHNwZWNpZmllcyB0aGUgVElNIENoYW5uZWwNCi0gKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDINCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMw0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0DQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzU6IFRJTSBDaGFubmVsIDUNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNjogVElNIENoYW5uZWwgNg0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fQ29uZmlnT0NyZWZDbGVhcigNCi0gICAgVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIFRJTV9DbGVhcklucHV0Q29uZmlnVHlwZURlZiAqc0NsZWFySW5wdXRDb25maWcsDQotICAgIHVpbnQzMl90IENoYW5uZWwpIHsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsNCi0NCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX09DWFJFRl9DTEVBUl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTEVBUklOUFVUX1NPVVJDRShzQ2xlYXJJbnB1dENvbmZpZy0+Q2xlYXJJbnB1dFNvdXJjZSkpOw0KLQ0KLSAgLyogUHJvY2VzcyBMb2NrZWQgKi8NCi0gIF9fSEFMX0xPQ0soaHRpbSk7DQotDQotICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfQlVTWTsNCi0NCi0gIHN3aXRjaCAoc0NsZWFySW5wdXRDb25maWctPkNsZWFySW5wdXRTb3VyY2UpIHsNCi0gICAgY2FzZSBUSU1fQ0xFQVJJTlBVVFNPVVJDRV9OT05FOiB7DQotICAgICAgLyogQ2xlYXIgdGhlIE9DUkVGIGNsZWFyIHNlbGVjdGlvbiBiaXQgYW5kIHRoZSB0aGUgRVRSIEJpdHMgKi8NCi0gICAgICBpZiAoSVNfVElNX09DQ1NfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKSB7DQotICAgICAgICBDTEVBUl9CSVQoaHRpbS0+SW5zdGFuY2UtPlNNQ1IsDQotICAgICAgICAgICAgICAgICAgKFRJTV9TTUNSX09DQ1MgfCBUSU1fU01DUl9FVEYgfCBUSU1fU01DUl9FVFBTIHwgVElNX1NNQ1JfRUNFIHwNCi0gICAgICAgICAgICAgICAgICAgVElNX1NNQ1JfRVRQKSk7DQotDQotICAgICAgICAvKiBDbGVhciBUSU14X0FGMl9PQ1JTRUwgKHJlc2V0IHZhbHVlKSAqLw0KLSAgICAgICAgQ0xFQVJfQklUKGh0aW0tPkluc3RhbmNlLT5BRjIsIFRJTXhfQUYyX09DUlNFTCk7DQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgIENMRUFSX0JJVChodGltLT5JbnN0YW5jZS0+U01DUiwNCi0gICAgICAgICAgICAgICAgICAoVElNX1NNQ1JfRVRGIHwgVElNX1NNQ1JfRVRQUyB8IFRJTV9TTUNSX0VDRSB8IFRJTV9TTUNSX0VUUCkpOw0KLSAgICAgIH0NCi0gICAgICBicmVhazsNCi0gICAgfQ0KLQ0KLSAgICBjYXNlIFRJTV9DTEVBUklOUFVUU09VUkNFX0NPTVAxOg0KLSAgICBjYXNlIFRJTV9DTEVBUklOUFVUU09VUkNFX0NPTVAyOg0KLSAgICBjYXNlIFRJTV9DTEVBUklOUFVUU09VUkNFX0NPTVAzOg0KLSAgICBjYXNlIFRJTV9DTEVBUklOUFVUU09VUkNFX0NPTVA0Og0KLSNpZiBkZWZpbmVkKENPTVA1KQ0KLSAgICBjYXNlIFRJTV9DTEVBUklOUFVUU09VUkNFX0NPTVA1Og0KLSNlbmRpZiAvKiBDT01QNSAqLw0KLSNpZiBkZWZpbmVkKENPTVA2KQ0KLSAgICBjYXNlIFRJTV9DTEVBUklOUFVUU09VUkNFX0NPTVA2Og0KLSNlbmRpZiAvKiBDT01QNiAqLw0KLSNpZiBkZWZpbmVkKENPTVA3KQ0KLSAgICBjYXNlIFRJTV9DTEVBUklOUFVUU09VUkNFX0NPTVA3Og0KLSNlbmRpZiAvKiBDT01QNyAqLw0KLSAgICB7DQotICAgICAgaWYgKElTX1RJTV9PQ0NTX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSkgew0KLSAgICAgICAgLyogQ2xlYXIgdGhlIE9DUkVGIGNsZWFyIHNlbGVjdGlvbiBiaXQgKi8NCi0gICAgICAgIENMRUFSX0JJVChodGltLT5JbnN0YW5jZS0+U01DUiwgVElNX1NNQ1JfT0NDUyk7DQotDQotICAgICAgICAvKiBDbGVhciBUSU0xX0FGMl9PQ1JTRUwgKHJlc2V0IHZhbHVlKSAqLw0KLSAgICAgICAgTU9ESUZZX1JFRyhodGltLT5JbnN0YW5jZS0+QUYyLCBUSU14X0FGMl9PQ1JTRUwsDQotICAgICAgICAgICAgICAgICAgIHNDbGVhcklucHV0Q29uZmlnLT5DbGVhcklucHV0U291cmNlKTsNCi0gICAgICB9DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0NCi0gICAgY2FzZSBUSU1fQ0xFQVJJTlBVVFNPVVJDRV9FVFI6IHsNCi0gICAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgICAgIGFzc2VydF9wYXJhbSgNCi0gICAgICAgICAgSVNfVElNX0NMRUFSSU5QVVRfUE9MQVJJVFkoc0NsZWFySW5wdXRDb25maWctPkNsZWFySW5wdXRQb2xhcml0eSkpOw0KLSAgICAgIGFzc2VydF9wYXJhbSgNCi0gICAgICAgICAgSVNfVElNX0NMRUFSSU5QVVRfUFJFU0NBTEVSKHNDbGVhcklucHV0Q29uZmlnLT5DbGVhcklucHV0UHJlc2NhbGVyKSk7DQotICAgICAgYXNzZXJ0X3BhcmFtKA0KLSAgICAgICAgICBJU19USU1fQ0xFQVJJTlBVVF9GSUxURVIoc0NsZWFySW5wdXRDb25maWctPkNsZWFySW5wdXRGaWx0ZXIpKTsNCi0NCi0gICAgICAvKiBXaGVuIE9DUmVmIGNsZWFyIGZlYXR1cmUgaXMgdXNlZCB3aXRoIEVUUiBzb3VyY2UsIEVUUiBwcmVzY2FsZXIgbXVzdCBiZQ0KLSAgICAgICAqIG9mZiAqLw0KLSAgICAgIGlmIChzQ2xlYXJJbnB1dENvbmZpZy0+Q2xlYXJJbnB1dFByZXNjYWxlciAhPQ0KLSAgICAgICAgICBUSU1fQ0xFQVJJTlBVVFBSRVNDQUxFUl9ESVYxKSB7DQotICAgICAgICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7DQotICAgICAgICBfX0hBTF9VTkxPQ0soaHRpbSk7DQotICAgICAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgICAgIH0NCi0NCi0gICAgICBUSU1fRVRSX1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgc0NsZWFySW5wdXRDb25maWctPkNsZWFySW5wdXRQcmVzY2FsZXIsDQotICAgICAgICAgICAgICAgICAgICAgICAgc0NsZWFySW5wdXRDb25maWctPkNsZWFySW5wdXRQb2xhcml0eSwNCi0gICAgICAgICAgICAgICAgICAgICAgICBzQ2xlYXJJbnB1dENvbmZpZy0+Q2xlYXJJbnB1dEZpbHRlcik7DQotDQotICAgICAgaWYgKElTX1RJTV9PQ0NTX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSkgew0KLSAgICAgICAgLyogU2V0IHRoZSBPQ1JFRiBjbGVhciBzZWxlY3Rpb24gYml0ICovDQotICAgICAgICBTRVRfQklUKGh0aW0tPkluc3RhbmNlLT5TTUNSLCBUSU1fU01DUl9PQ0NTKTsNCi0NCi0gICAgICAgIC8qIENsZWFyIFRJTXhfQUYyX09DUlNFTCAocmVzZXQgdmFsdWUpICovDQotICAgICAgICBDTEVBUl9CSVQoaHRpbS0+SW5zdGFuY2UtPkFGMiwgVElNeF9BRjJfT0NSU0VMKTsNCi0gICAgICB9DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0NCi0gICAgZGVmYXVsdDoNCi0gICAgICBzdGF0dXMgPSBIQUxfRVJST1I7DQotICAgICAgYnJlYWs7DQotICB9DQotDQotICBpZiAoc3RhdHVzID09IEhBTF9PSykgew0KLSAgICBzd2l0Y2ggKENoYW5uZWwpIHsNCi0gICAgICBjYXNlIFRJTV9DSEFOTkVMXzE6IHsNCi0gICAgICAgIGlmIChzQ2xlYXJJbnB1dENvbmZpZy0+Q2xlYXJJbnB1dFN0YXRlICE9ICh1aW50MzJfdClESVNBQkxFKSB7DQotICAgICAgICAgIC8qIEVuYWJsZSB0aGUgT0NSRUYgY2xlYXIgZmVhdHVyZSBmb3IgQ2hhbm5lbCAxICovDQotICAgICAgICAgIFNFVF9CSVQoaHRpbS0+SW5zdGFuY2UtPkNDTVIxLCBUSU1fQ0NNUjFfT0MxQ0UpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgLyogRGlzYWJsZSB0aGUgT0NSRUYgY2xlYXIgZmVhdHVyZSBmb3IgQ2hhbm5lbCAxICovDQotICAgICAgICAgIENMRUFSX0JJVChodGltLT5JbnN0YW5jZS0+Q0NNUjEsIFRJTV9DQ01SMV9PQzFDRSk7DQotICAgICAgICB9DQotICAgICAgICBicmVhazsNCi0gICAgICB9DQotICAgICAgY2FzZSBUSU1fQ0hBTk5FTF8yOiB7DQotICAgICAgICBpZiAoc0NsZWFySW5wdXRDb25maWctPkNsZWFySW5wdXRTdGF0ZSAhPSAodWludDMyX3QpRElTQUJMRSkgew0KLSAgICAgICAgICAvKiBFbmFibGUgdGhlIE9DUkVGIGNsZWFyIGZlYXR1cmUgZm9yIENoYW5uZWwgMiAqLw0KLSAgICAgICAgICBTRVRfQklUKGh0aW0tPkluc3RhbmNlLT5DQ01SMSwgVElNX0NDTVIxX09DMkNFKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgIC8qIERpc2FibGUgdGhlIE9DUkVGIGNsZWFyIGZlYXR1cmUgZm9yIENoYW5uZWwgMiAqLw0KLSAgICAgICAgICBDTEVBUl9CSVQoaHRpbS0+SW5zdGFuY2UtPkNDTVIxLCBUSU1fQ0NNUjFfT0MyQ0UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgYnJlYWs7DQotICAgICAgfQ0KLSAgICAgIGNhc2UgVElNX0NIQU5ORUxfMzogew0KLSAgICAgICAgaWYgKHNDbGVhcklucHV0Q29uZmlnLT5DbGVhcklucHV0U3RhdGUgIT0gKHVpbnQzMl90KURJU0FCTEUpIHsNCi0gICAgICAgICAgLyogRW5hYmxlIHRoZSBPQ1JFRiBjbGVhciBmZWF0dXJlIGZvciBDaGFubmVsIDMgKi8NCi0gICAgICAgICAgU0VUX0JJVChodGltLT5JbnN0YW5jZS0+Q0NNUjIsIFRJTV9DQ01SMl9PQzNDRSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBPQ1JFRiBjbGVhciBmZWF0dXJlIGZvciBDaGFubmVsIDMgKi8NCi0gICAgICAgICAgQ0xFQVJfQklUKGh0aW0tPkluc3RhbmNlLT5DQ01SMiwgVElNX0NDTVIyX09DM0NFKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGJyZWFrOw0KLSAgICAgIH0NCi0gICAgICBjYXNlIFRJTV9DSEFOTkVMXzQ6IHsNCi0gICAgICAgIGlmIChzQ2xlYXJJbnB1dENvbmZpZy0+Q2xlYXJJbnB1dFN0YXRlICE9ICh1aW50MzJfdClESVNBQkxFKSB7DQotICAgICAgICAgIC8qIEVuYWJsZSB0aGUgT0NSRUYgY2xlYXIgZmVhdHVyZSBmb3IgQ2hhbm5lbCA0ICovDQotICAgICAgICAgIFNFVF9CSVQoaHRpbS0+SW5zdGFuY2UtPkNDTVIyLCBUSU1fQ0NNUjJfT0M0Q0UpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgLyogRGlzYWJsZSB0aGUgT0NSRUYgY2xlYXIgZmVhdHVyZSBmb3IgQ2hhbm5lbCA0ICovDQotICAgICAgICAgIENMRUFSX0JJVChodGltLT5JbnN0YW5jZS0+Q0NNUjIsIFRJTV9DQ01SMl9PQzRDRSk7DQotICAgICAgICB9DQotICAgICAgICBicmVhazsNCi0gICAgICB9DQotICAgICAgY2FzZSBUSU1fQ0hBTk5FTF81OiB7DQotICAgICAgICBpZiAoc0NsZWFySW5wdXRDb25maWctPkNsZWFySW5wdXRTdGF0ZSAhPSAodWludDMyX3QpRElTQUJMRSkgew0KLSAgICAgICAgICAvKiBFbmFibGUgdGhlIE9DUkVGIGNsZWFyIGZlYXR1cmUgZm9yIENoYW5uZWwgNSAqLw0KLSAgICAgICAgICBTRVRfQklUKGh0aW0tPkluc3RhbmNlLT5DQ01SMywgVElNX0NDTVIzX09DNUNFKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgIC8qIERpc2FibGUgdGhlIE9DUkVGIGNsZWFyIGZlYXR1cmUgZm9yIENoYW5uZWwgNSAqLw0KLSAgICAgICAgICBDTEVBUl9CSVQoaHRpbS0+SW5zdGFuY2UtPkNDTVIzLCBUSU1fQ0NNUjNfT0M1Q0UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgYnJlYWs7DQotICAgICAgfQ0KLSAgICAgIGNhc2UgVElNX0NIQU5ORUxfNjogew0KLSAgICAgICAgaWYgKHNDbGVhcklucHV0Q29uZmlnLT5DbGVhcklucHV0U3RhdGUgIT0gKHVpbnQzMl90KURJU0FCTEUpIHsNCi0gICAgICAgICAgLyogRW5hYmxlIHRoZSBPQ1JFRiBjbGVhciBmZWF0dXJlIGZvciBDaGFubmVsIDYgKi8NCi0gICAgICAgICAgU0VUX0JJVChodGltLT5JbnN0YW5jZS0+Q0NNUjMsIFRJTV9DQ01SM19PQzZDRSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBPQ1JFRiBjbGVhciBmZWF0dXJlIGZvciBDaGFubmVsIDYgKi8NCi0gICAgICAgICAgQ0xFQVJfQklUKGh0aW0tPkluc3RhbmNlLT5DQ01SMywgVElNX0NDTVIzX09DNkNFKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGJyZWFrOw0KLSAgICAgIH0NCi0gICAgICBkZWZhdWx0Og0KLSAgICAgICAgYnJlYWs7DQotICAgIH0NCi0gIH0NCi0NCi0gIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRUFEWTsNCi0NCi0gIF9fSEFMX1VOTE9DSyhodGltKTsNCi0NCi0gIHJldHVybiBzdGF0dXM7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgIENvbmZpZ3VyZXMgdGhlIGNsb2NrIHNvdXJjZSB0byBiZSB1c2VkDQotICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUNCi0gKiBAcGFyYW0gIHNDbG9ja1NvdXJjZUNvbmZpZyBwb2ludGVyIHRvIGEgVElNX0Nsb2NrQ29uZmlnVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdA0KLSAqICAgICAgICAgY29udGFpbnMgdGhlIGNsb2NrIHNvdXJjZSBpbmZvcm1hdGlvbiBmb3IgdGhlIFRJTSBwZXJpcGhlcmFsLg0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fQ29uZmlnQ2xvY2tTb3VyY2UoDQotICAgIFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCBUSU1fQ2xvY2tDb25maWdUeXBlRGVmICpzQ2xvY2tTb3VyY2VDb25maWcpIHsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsNCi0gIHVpbnQzMl90IHRtcHNtY3I7DQotDQotICAvKiBQcm9jZXNzIExvY2tlZCAqLw0KLSAgX19IQUxfTE9DSyhodGltKTsNCi0NCi0gIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tTT1VSQ0Uoc0Nsb2NrU291cmNlQ29uZmlnLT5DbG9ja1NvdXJjZSkpOw0KLQ0KLSAgLyogUmVzZXQgdGhlIFNNUywgVFMsIEVDRSwgRVRQUyBhbmQgRVRSRiBiaXRzICovDQotICB0bXBzbWNyID0gaHRpbS0+SW5zdGFuY2UtPlNNQ1I7DQotICB0bXBzbWNyICY9IH4oVElNX1NNQ1JfU01TIHwgVElNX1NNQ1JfVFMpOw0KLSAgdG1wc21jciAmPSB+KFRJTV9TTUNSX0VURiB8IFRJTV9TTUNSX0VUUFMgfCBUSU1fU01DUl9FQ0UgfCBUSU1fU01DUl9FVFApOw0KLSAgaHRpbS0+SW5zdGFuY2UtPlNNQ1IgPSB0bXBzbWNyOw0KLQ0KLSAgc3dpdGNoIChzQ2xvY2tTb3VyY2VDb25maWctPkNsb2NrU291cmNlKSB7DQotICAgIGNhc2UgVElNX0NMT0NLU09VUkNFX0lOVEVSTkFMOiB7DQotICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOw0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotDQotICAgIGNhc2UgVElNX0NMT0NLU09VUkNFX0VUUk1PREUxOiB7DQotICAgICAgLyogQ2hlY2sgd2hldGhlciBvciBub3QgdGhlIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGV4dGVybmFsIHRyaWdnZXIgaW5wdXQNCi0gICAgICAgKiBtb2RlIDEgKEVUUkYpKi8NCi0gICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMT0NLU09VUkNFX0VUUk1PREUxX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7DQotDQotICAgICAgLyogQ2hlY2sgRVRSIGlucHV0IGNvbmRpdGlvbmluZyByZWxhdGVkIHBhcmFtZXRlcnMgKi8NCi0gICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMT0NLUFJFU0NBTEVSKHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tQcmVzY2FsZXIpKTsNCi0gICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMT0NLUE9MQVJJVFkoc0Nsb2NrU291cmNlQ29uZmlnLT5DbG9ja1BvbGFyaXR5KSk7DQotICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTE9DS0ZJTFRFUihzQ2xvY2tTb3VyY2VDb25maWctPkNsb2NrRmlsdGVyKSk7DQotDQotICAgICAgLyogQ29uZmlndXJlIHRoZSBFVFIgQ2xvY2sgc291cmNlICovDQotICAgICAgVElNX0VUUl9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsIHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tQcmVzY2FsZXIsDQotICAgICAgICAgICAgICAgICAgICAgICAgc0Nsb2NrU291cmNlQ29uZmlnLT5DbG9ja1BvbGFyaXR5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tGaWx0ZXIpOw0KLQ0KLSAgICAgIC8qIFNlbGVjdCB0aGUgRXh0ZXJuYWwgY2xvY2sgbW9kZTEgYW5kIHRoZSBFVFJGIHRyaWdnZXIgKi8NCi0gICAgICB0bXBzbWNyID0gaHRpbS0+SW5zdGFuY2UtPlNNQ1I7DQotICAgICAgdG1wc21jciB8PSAoVElNX1NMQVZFTU9ERV9FWFRFUk5BTDEgfCBUSU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTEpOw0KLSAgICAgIC8qIFdyaXRlIHRvIFRJTXggU01DUiAqLw0KLSAgICAgIGh0aW0tPkluc3RhbmNlLT5TTUNSID0gdG1wc21jcjsNCi0gICAgICBicmVhazsNCi0gICAgfQ0KLQ0KLSAgICBjYXNlIFRJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMjogew0KLSAgICAgIC8qIENoZWNrIHdoZXRoZXIgb3Igbm90IHRoZSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBleHRlcm5hbCB0cmlnZ2VyIGlucHV0DQotICAgICAgICogbW9kZSAyIChFVFJGKSovDQotICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOw0KLQ0KLSAgICAgIC8qIENoZWNrIEVUUiBpbnB1dCBjb25kaXRpb25pbmcgcmVsYXRlZCBwYXJhbWV0ZXJzICovDQotICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTE9DS1BSRVNDQUxFUihzQ2xvY2tTb3VyY2VDb25maWctPkNsb2NrUHJlc2NhbGVyKSk7DQotICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTE9DS1BPTEFSSVRZKHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tQb2xhcml0eSkpOw0KLSAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tGSUxURVIoc0Nsb2NrU291cmNlQ29uZmlnLT5DbG9ja0ZpbHRlcikpOw0KLQ0KLSAgICAgIC8qIENvbmZpZ3VyZSB0aGUgRVRSIENsb2NrIHNvdXJjZSAqLw0KLSAgICAgIFRJTV9FVFJfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCBzQ2xvY2tTb3VyY2VDb25maWctPkNsb2NrUHJlc2NhbGVyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tQb2xhcml0eSwNCi0gICAgICAgICAgICAgICAgICAgICAgICBzQ2xvY2tTb3VyY2VDb25maWctPkNsb2NrRmlsdGVyKTsNCi0gICAgICAvKiBFbmFibGUgdGhlIEV4dGVybmFsIGNsb2NrIG1vZGUyICovDQotICAgICAgaHRpbS0+SW5zdGFuY2UtPlNNQ1IgfD0gVElNX1NNQ1JfRUNFOw0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotDQotICAgIGNhc2UgVElNX0NMT0NLU09VUkNFX1RJMTogew0KLSAgICAgIC8qIENoZWNrIHdoZXRoZXIgb3Igbm90IHRoZSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBleHRlcm5hbCBjbG9jayBtb2RlIDENCi0gICAgICAgKi8NCi0gICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMT0NLU09VUkNFX1RJWF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOw0KLQ0KLSAgICAgIC8qIENoZWNrIFRJMSBpbnB1dCBjb25kaXRpb25pbmcgcmVsYXRlZCBwYXJhbWV0ZXJzICovDQotICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTE9DS1BPTEFSSVRZKHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tQb2xhcml0eSkpOw0KLSAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tGSUxURVIoc0Nsb2NrU291cmNlQ29uZmlnLT5DbG9ja0ZpbHRlcikpOw0KLQ0KLSAgICAgIFRJTV9USTFfQ29uZmlnSW5wdXRTdGFnZShodGltLT5JbnN0YW5jZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0Nsb2NrU291cmNlQ29uZmlnLT5DbG9ja1BvbGFyaXR5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQ2xvY2tTb3VyY2VDb25maWctPkNsb2NrRmlsdGVyKTsNCi0gICAgICBUSU1fSVRSeF9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsIFRJTV9DTE9DS1NPVVJDRV9USTEpOw0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotDQotICAgIGNhc2UgVElNX0NMT0NLU09VUkNFX1RJMjogew0KLSAgICAgIC8qIENoZWNrIHdoZXRoZXIgb3Igbm90IHRoZSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBleHRlcm5hbCBjbG9jayBtb2RlIDENCi0gICAgICAgKiAoRVRSRikqLw0KLSAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tTT1VSQ0VfVElYX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7DQotDQotICAgICAgLyogQ2hlY2sgVEkyIGlucHV0IGNvbmRpdGlvbmluZyByZWxhdGVkIHBhcmFtZXRlcnMgKi8NCi0gICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMT0NLUE9MQVJJVFkoc0Nsb2NrU291cmNlQ29uZmlnLT5DbG9ja1BvbGFyaXR5KSk7DQotICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTE9DS0ZJTFRFUihzQ2xvY2tTb3VyY2VDb25maWctPkNsb2NrRmlsdGVyKSk7DQotDQotICAgICAgVElNX1RJMl9Db25maWdJbnB1dFN0YWdlKGh0aW0tPkluc3RhbmNlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQ2xvY2tTb3VyY2VDb25maWctPkNsb2NrUG9sYXJpdHksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tGaWx0ZXIpOw0KLSAgICAgIFRJTV9JVFJ4X1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgVElNX0NMT0NLU09VUkNFX1RJMik7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0NCi0gICAgY2FzZSBUSU1fQ0xPQ0tTT1VSQ0VfVEkxRUQ6IHsNCi0gICAgICAvKiBDaGVjayB3aGV0aGVyIG9yIG5vdCB0aGUgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgZXh0ZXJuYWwgY2xvY2sgbW9kZSAxDQotICAgICAgICovDQotICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTE9DS1NPVVJDRV9USVhfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsNCi0NCi0gICAgICAvKiBDaGVjayBUSTEgaW5wdXQgY29uZGl0aW9uaW5nIHJlbGF0ZWQgcGFyYW1ldGVycyAqLw0KLSAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tQT0xBUklUWShzQ2xvY2tTb3VyY2VDb25maWctPkNsb2NrUG9sYXJpdHkpKTsNCi0gICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMT0NLRklMVEVSKHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tGaWx0ZXIpKTsNCi0NCi0gICAgICBUSU1fVEkxX0NvbmZpZ0lucHV0U3RhZ2UoaHRpbS0+SW5zdGFuY2UsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tQb2xhcml0eSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0Nsb2NrU291cmNlQ29uZmlnLT5DbG9ja0ZpbHRlcik7DQotICAgICAgVElNX0lUUnhfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0xPQ0tTT1VSQ0VfVEkxRUQpOw0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotDQotICAgIGNhc2UgVElNX0NMT0NLU09VUkNFX0lUUjA6DQotICAgIGNhc2UgVElNX0NMT0NLU09VUkNFX0lUUjE6DQotICAgIGNhc2UgVElNX0NMT0NLU09VUkNFX0lUUjI6DQotICAgIGNhc2UgVElNX0NMT0NLU09VUkNFX0lUUjM6DQotI2lmIGRlZmluZWQoVElNNSkNCi0gICAgY2FzZSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNDoNCi0jZW5kaWYgLyogVElNNSAqLw0KLSAgICBjYXNlIFRJTV9DTE9DS1NPVVJDRV9JVFI1Og0KLSAgICBjYXNlIFRJTV9DTE9DS1NPVVJDRV9JVFI2Og0KLSAgICBjYXNlIFRJTV9DTE9DS1NPVVJDRV9JVFI3Og0KLSAgICBjYXNlIFRJTV9DTE9DS1NPVVJDRV9JVFI4Og0KLSNpZiBkZWZpbmVkKFRJTTIwKQ0KLSAgICBjYXNlIFRJTV9DTE9DS1NPVVJDRV9JVFI5Og0KLSNlbmRpZiAvKiBUSU0yMCAqLw0KLSNpZiBkZWZpbmVkKEhSVElNMSkNCi0gICAgY2FzZSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMTA6DQotI2VuZGlmIC8qIEhSVElNMSAqLw0KLSAgICBjYXNlIFRJTV9DTE9DS1NPVVJDRV9JVFIxMTogew0KLSAgICAgIC8qIENoZWNrIHdoZXRoZXIgb3Igbm90IHRoZSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBpbnRlcm5hbCB0cmlnZ2VyIGlucHV0DQotICAgICAgICovDQotICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTE9DS1NPVVJDRV9JTlNUQU5DRSgNCi0gICAgICAgICAgKGh0aW0tPkluc3RhbmNlKSwgc0Nsb2NrU291cmNlQ29uZmlnLT5DbG9ja1NvdXJjZSkpOw0KLQ0KLSAgICAgIFRJTV9JVFJ4X1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgc0Nsb2NrU291cmNlQ29uZmlnLT5DbG9ja1NvdXJjZSk7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0NCi0gICAgZGVmYXVsdDoNCi0gICAgICBzdGF0dXMgPSBIQUxfRVJST1I7DQotICAgICAgYnJlYWs7DQotICB9DQotICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7DQotDQotICBfX0hBTF9VTkxPQ0soaHRpbSk7DQotDQotICByZXR1cm4gc3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNlbGVjdHMgdGhlIHNpZ25hbCBjb25uZWN0ZWQgdG8gdGhlIFRJMSBpbnB1dDogZGlyZWN0IGZyb20gQ0gxX2lucHV0DQotICogICAgICAgICBvciBhIFhPUiBjb21iaW5hdGlvbiBiZXR3ZWVuIENIMV9pbnB1dCwgQ0gyX2lucHV0ICYgQ0gzX2lucHV0DQotICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUuDQotICogQHBhcmFtICBUSTFfU2VsZWN0aW9uIEluZGljYXRlIHdoZXRoZXIgb3Igbm90IGNoYW5uZWwgMSBpcyBjb25uZWN0ZWQgdG8gdGhlDQotICogICAgICAgICBvdXRwdXQgb2YgYSBYT1IgZ2F0ZS4NCi0gKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fVEkxU0VMRUNUSU9OX0NIMTogVGhlIFRJTXhfQ0gxIHBpbiBpcyBjb25uZWN0ZWQgdG8gVEkxDQotICogaW5wdXQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX1RJMVNFTEVDVElPTl9YT1JDT01CSU5BVElPTjogVGhlIFRJTXhfQ0gxLCBDSDIgYW5kIENIMw0KLSAqICAgICAgICAgICAgcGlucyBhcmUgY29ubmVjdGVkIHRvIHRoZSBUSTEgaW5wdXQgKFhPUiBjb21iaW5hdGlvbikNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0NvbmZpZ1RJMUlucHV0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVEkxX1NlbGVjdGlvbikgew0KLSAgdWludDMyX3QgdG1wY3IyOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fWE9SX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX1RJMVNFTEVDVElPTihUSTFfU2VsZWN0aW9uKSk7DQotDQotICAvKiBHZXQgdGhlIFRJTXggQ1IyIHJlZ2lzdGVyIHZhbHVlICovDQotICB0bXBjcjIgPSBodGltLT5JbnN0YW5jZS0+Q1IyOw0KLQ0KLSAgLyogUmVzZXQgdGhlIFRJMSBzZWxlY3Rpb24gKi8NCi0gIHRtcGNyMiAmPSB+VElNX0NSMl9USTFTOw0KLQ0KLSAgLyogU2V0IHRoZSBUSTEgc2VsZWN0aW9uICovDQotICB0bXBjcjIgfD0gVEkxX1NlbGVjdGlvbjsNCi0NCi0gIC8qIFdyaXRlIHRvIFRJTXhDUjIgKi8NCi0gIGh0aW0tPkluc3RhbmNlLT5DUjIgPSB0bXBjcjI7DQotDQotICByZXR1cm4gSEFMX09LOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIFRJTSBpbiBTbGF2ZSBtb2RlDQotICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUuDQotICogQHBhcmFtICBzU2xhdmVDb25maWcgcG9pbnRlciB0byBhIFRJTV9TbGF2ZUNvbmZpZ1R5cGVEZWYgc3RydWN0dXJlIHRoYXQNCi0gKiAgICAgICAgIGNvbnRhaW5zIHRoZSBzZWxlY3RlZCB0cmlnZ2VyIChpbnRlcm5hbCB0cmlnZ2VyIGlucHV0LCBmaWx0ZXJlZA0KLSAqICAgICAgICAgdGltZXIgaW5wdXQgb3IgZXh0ZXJuYWwgdHJpZ2dlciBpbnB1dCkgYW5kIHRoZSBTbGF2ZSBtb2RlDQotICogICAgICAgICAoRGlzYWJsZSwgUmVzZXQsIEdhdGVkLCBUcmlnZ2VyLCBFeHRlcm5hbCBjbG9jayBtb2RlIDEsIFJlc2V0ICsNCi0gKiBUcmlnZ2VyLCBHYXRlZCArIFJlc2V0KS4NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1NsYXZlQ29uZmlnU3luY2hybygNCi0gICAgVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIFRJTV9TbGF2ZUNvbmZpZ1R5cGVEZWYgKnNTbGF2ZUNvbmZpZykgew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fU0xBVkVfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsNCi0gIGFzc2VydF9wYXJhbShJU19USU1fU0xBVkVfTU9ERShzU2xhdmVDb25maWctPlNsYXZlTW9kZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKA0KLSAgICAgIElTX1RJTV9UUklHR0VSX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBzU2xhdmVDb25maWctPklucHV0VHJpZ2dlcikpOw0KLQ0KLSAgX19IQUxfTE9DSyhodGltKTsNCi0NCi0gIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOw0KLQ0KLSAgaWYgKFRJTV9TbGF2ZVRpbWVyX1NldENvbmZpZyhodGltLCBzU2xhdmVDb25maWcpICE9IEhBTF9PSykgew0KLSAgICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7DQotICAgIF9fSEFMX1VOTE9DSyhodGltKTsNCi0gICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gIH0NCi0NCi0gIC8qIERpc2FibGUgVHJpZ2dlciBJbnRlcnJ1cHQgKi8NCi0gIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9UUklHR0VSKTsNCi0NCi0gIC8qIERpc2FibGUgVHJpZ2dlciBETUEgcmVxdWVzdCAqLw0KLSAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIFRJTV9ETUFfVFJJR0dFUik7DQotDQotICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7DQotDQotICBfX0hBTF9VTkxPQ0soaHRpbSk7DQotDQotICByZXR1cm4gSEFMX09LOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIFRJTSBpbiBTbGF2ZSBtb2RlIGluIGludGVycnVwdCBtb2RlDQotICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUuDQotICogQHBhcmFtICBzU2xhdmVDb25maWcgcG9pbnRlciB0byBhIFRJTV9TbGF2ZUNvbmZpZ1R5cGVEZWYgc3RydWN0dXJlIHRoYXQNCi0gKiAgICAgICAgIGNvbnRhaW5zIHRoZSBzZWxlY3RlZCB0cmlnZ2VyIChpbnRlcm5hbCB0cmlnZ2VyIGlucHV0LCBmaWx0ZXJlZA0KLSAqICAgICAgICAgdGltZXIgaW5wdXQgb3IgZXh0ZXJuYWwgdHJpZ2dlciBpbnB1dCkgYW5kIHRoZSBTbGF2ZSBtb2RlDQotICogICAgICAgICAoRGlzYWJsZSwgUmVzZXQsIEdhdGVkLCBUcmlnZ2VyLCBFeHRlcm5hbCBjbG9jayBtb2RlIDEsIFJlc2V0ICsNCi0gKiBUcmlnZ2VyLCBHYXRlZCArIFJlc2V0KS4NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1NsYXZlQ29uZmlnU3luY2hyb19JVCgNCi0gICAgVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIFRJTV9TbGF2ZUNvbmZpZ1R5cGVEZWYgKnNTbGF2ZUNvbmZpZykgew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fU0xBVkVfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsNCi0gIGFzc2VydF9wYXJhbShJU19USU1fU0xBVkVfTU9ERShzU2xhdmVDb25maWctPlNsYXZlTW9kZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKA0KLSAgICAgIElTX1RJTV9UUklHR0VSX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBzU2xhdmVDb25maWctPklucHV0VHJpZ2dlcikpOw0KLQ0KLSAgX19IQUxfTE9DSyhodGltKTsNCi0NCi0gIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOw0KLQ0KLSAgaWYgKFRJTV9TbGF2ZVRpbWVyX1NldENvbmZpZyhodGltLCBzU2xhdmVDb25maWcpICE9IEhBTF9PSykgew0KLSAgICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7DQotICAgIF9fSEFMX1VOTE9DSyhodGltKTsNCi0gICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gIH0NCi0NCi0gIC8qIEVuYWJsZSBUcmlnZ2VyIEludGVycnVwdCAqLw0KLSAgX19IQUxfVElNX0VOQUJMRV9JVChodGltLCBUSU1fSVRfVFJJR0dFUik7DQotDQotICAvKiBEaXNhYmxlIFRyaWdnZXIgRE1BIHJlcXVlc3QgKi8NCi0gIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBUSU1fRE1BX1RSSUdHRVIpOw0KLQ0KLSAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOw0KLQ0KLSAgX19IQUxfVU5MT0NLKGh0aW0pOw0KLQ0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBSZWFkIHRoZSBjYXB0dXJlZCB2YWx1ZSBmcm9tIENhcHR1cmUgQ29tcGFyZSB1bml0DQotICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUuDQotICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVscyB0byBiZSBlbmFibGVkDQotICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZA0KLSAqIEByZXR2YWwgQ2FwdHVyZWQgdmFsdWUNCi0gKi8NCi11aW50MzJfdCBIQUxfVElNX1JlYWRDYXB0dXJlZFZhbHVlKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKSB7DQotICB1aW50MzJfdCB0bXByZWcgPSAwVTsNCi0NCi0gIHN3aXRjaCAoQ2hhbm5lbCkgew0KLSAgICBjYXNlIFRJTV9DSEFOTkVMXzE6IHsNCi0gICAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0MxX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7DQotDQotICAgICAgLyogUmV0dXJuIHRoZSBjYXB0dXJlIDEgdmFsdWUgKi8NCi0gICAgICB0bXByZWcgPSBodGltLT5JbnN0YW5jZS0+Q0NSMTsNCi0NCi0gICAgICBicmVhazsNCi0gICAgfQ0KLSAgICBjYXNlIFRJTV9DSEFOTkVMXzI6IHsNCi0gICAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0MyX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7DQotDQotICAgICAgLyogUmV0dXJuIHRoZSBjYXB0dXJlIDIgdmFsdWUgKi8NCi0gICAgICB0bXByZWcgPSBodGltLT5JbnN0YW5jZS0+Q0NSMjsNCi0NCi0gICAgICBicmVhazsNCi0gICAgfQ0KLQ0KLSAgICBjYXNlIFRJTV9DSEFOTkVMXzM6IHsNCi0gICAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0MzX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7DQotDQotICAgICAgLyogUmV0dXJuIHRoZSBjYXB0dXJlIDMgdmFsdWUgKi8NCi0gICAgICB0bXByZWcgPSBodGltLT5JbnN0YW5jZS0+Q0NSMzsNCi0NCi0gICAgICBicmVhazsNCi0gICAgfQ0KLQ0KLSAgICBjYXNlIFRJTV9DSEFOTkVMXzQ6IHsNCi0gICAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0M0X0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7DQotDQotICAgICAgLyogUmV0dXJuIHRoZSBjYXB0dXJlIDQgdmFsdWUgKi8NCi0gICAgICB0bXByZWcgPSBodGltLT5JbnN0YW5jZS0+Q0NSNDsNCi0NCi0gICAgICBicmVhazsNCi0gICAgfQ0KLQ0KLSAgICBkZWZhdWx0Og0KLSAgICAgIGJyZWFrOw0KLSAgfQ0KLQ0KLSAgcmV0dXJuIHRtcHJlZzsNCi19DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA5IFRJTSBDYWxsYmFja3MgZnVuY3Rpb25zDQotICAqICBAYnJpZWYgICAgVElNIENhbGxiYWNrcyBmdW5jdGlvbnMNCi0gICoNCi1AdmVyYmF0aW0NCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFRJTSBDYWxsYmFja3MgZnVuY3Rpb25zICMjIyMjDQotICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gWy4uXQ0KLSAgIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBUSU0gY2FsbGJhY2sgZnVuY3Rpb25zOg0KLSAgICgrKSBUSU0gUGVyaW9kIGVsYXBzZWQgY2FsbGJhY2sNCi0gICAoKykgVElNIE91dHB1dCBDb21wYXJlIGNhbGxiYWNrDQotICAgKCspIFRJTSBJbnB1dCBjYXB0dXJlIGNhbGxiYWNrDQotICAgKCspIFRJTSBUcmlnZ2VyIGNhbGxiYWNrDQotICAgKCspIFRJTSBFcnJvciBjYWxsYmFjaw0KLSAgICgrKSBUSU0gSW5kZXggY2FsbGJhY2sNCi0gICAoKykgVElNIERpcmVjdGlvbiBjaGFuZ2UgY2FsbGJhY2sNCi0gICAoKykgVElNIEluZGV4IGVycm9yIGNhbGxiYWNrDQotICAgKCspIFRJTSBUcmFuc2l0aW9uIGVycm9yIGNhbGxiYWNrDQotDQotQGVuZHZlcmJhdGltDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUGVyaW9kIGVsYXBzZWQgY2FsbGJhY2sgaW4gbm9uLWJsb2NraW5nIG1vZGUNCi0gKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fd2VhayB2b2lkIEhBTF9USU1fUGVyaW9kRWxhcHNlZENhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKSB7DQotICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovDQotICBVTlVTRUQoaHRpbSk7DQotDQotICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsDQotICAgICAgICAgICAgdGhlIEhBTF9USU1fUGVyaW9kRWxhcHNlZENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyDQotICAgICBmaWxlDQotICAgKi8NCi19DQotDQotLyoqDQotICogQGJyaWVmICBQZXJpb2QgZWxhcHNlZCBoYWxmIGNvbXBsZXRlIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlDQotICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX3dlYWsgdm9pZCBIQUxfVElNX1BlcmlvZEVsYXBzZWRIYWxmQ3BsdENhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKSB7DQotICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovDQotICBVTlVTRUQoaHRpbSk7DQotDQotICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsDQotICAgICAgICAgICAgdGhlIEhBTF9USU1fUGVyaW9kRWxhcHNlZEhhbGZDcGx0Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4NCi0gICAgIHRoZSB1c2VyIGZpbGUNCi0gICAqLw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIE91dHB1dCBDb21wYXJlIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlDQotICogQHBhcmFtICBodGltIFRJTSBPQyBoYW5kbGUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX3dlYWsgdm9pZCBIQUxfVElNX09DX0RlbGF5RWxhcHNlZENhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKSB7DQotICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovDQotICBVTlVTRUQoaHRpbSk7DQotDQotICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsDQotICAgICAgICAgICAgdGhlIEhBTF9USU1fT0NfRGVsYXlFbGFwc2VkQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXINCi0gICAgIGZpbGUNCi0gICAqLw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIElucHV0IENhcHR1cmUgY2FsbGJhY2sgaW4gbm9uLWJsb2NraW5nIG1vZGUNCi0gKiBAcGFyYW0gIGh0aW0gVElNIElDIGhhbmRsZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fd2VhayB2b2lkIEhBTF9USU1fSUNfQ2FwdHVyZUNhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKSB7DQotICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovDQotICBVTlVTRUQoaHRpbSk7DQotDQotICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsDQotICAgICAgICAgICAgdGhlIEhBTF9USU1fSUNfQ2FwdHVyZUNhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUNCi0gICAqLw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIElucHV0IENhcHR1cmUgaGFsZiBjb21wbGV0ZSBjYWxsYmFjayBpbiBub24tYmxvY2tpbmcgbW9kZQ0KLSAqIEBwYXJhbSAgaHRpbSBUSU0gSUMgaGFuZGxlDQotICogQHJldHZhbCBOb25lDQotICovDQotX193ZWFrIHZvaWQgSEFMX1RJTV9JQ19DYXB0dXJlSGFsZkNwbHRDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkgew0KLSAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLw0KLSAgVU5VU0VEKGh0aW0pOw0KLQ0KLSAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLA0KLSAgICAgICAgICAgIHRoZSBIQUxfVElNX0lDX0NhcHR1cmVIYWxmQ3BsdENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZQ0KLSAgICAgdXNlciBmaWxlDQotICAgKi8NCi19DQotDQotLyoqDQotICogQGJyaWVmICBQV00gUHVsc2UgZmluaXNoZWQgY2FsbGJhY2sgaW4gbm9uLWJsb2NraW5nIG1vZGUNCi0gKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fd2VhayB2b2lkIEhBTF9USU1fUFdNX1B1bHNlRmluaXNoZWRDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkgew0KLSAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLw0KLSAgVU5VU0VEKGh0aW0pOw0KLQ0KLSAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLA0KLSAgICAgICAgICAgIHRoZSBIQUxfVElNX1BXTV9QdWxzZUZpbmlzaGVkQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlDQotICAgICB1c2VyIGZpbGUNCi0gICAqLw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFBXTSBQdWxzZSBmaW5pc2hlZCBoYWxmIGNvbXBsZXRlIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlDQotICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX3dlYWsgdm9pZCBIQUxfVElNX1BXTV9QdWxzZUZpbmlzaGVkSGFsZkNwbHRDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkgew0KLSAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLw0KLSAgVU5VU0VEKGh0aW0pOw0KLQ0KLSAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLA0KLSAgICAgICAgICAgIHRoZSBIQUxfVElNX1BXTV9QdWxzZUZpbmlzaGVkSGFsZkNwbHRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZA0KLSAgICAgaW4gdGhlIHVzZXIgZmlsZQ0KLSAgICovDQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSGFsbCBUcmlnZ2VyIGRldGVjdGlvbiBjYWxsYmFjayBpbiBub24tYmxvY2tpbmcgbW9kZQ0KLSAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlDQotICogQHJldHZhbCBOb25lDQotICovDQotX193ZWFrIHZvaWQgSEFMX1RJTV9UcmlnZ2VyQ2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pIHsNCi0gIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8NCi0gIFVOVVNFRChodGltKTsNCi0NCi0gIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwNCi0gICAgICAgICAgICB0aGUgSEFMX1RJTV9UcmlnZ2VyQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQ0KLSAgICovDQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSGFsbCBUcmlnZ2VyIGRldGVjdGlvbiBoYWxmIGNvbXBsZXRlIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlDQotICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX3dlYWsgdm9pZCBIQUxfVElNX1RyaWdnZXJIYWxmQ3BsdENhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKSB7DQotICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovDQotICBVTlVTRUQoaHRpbSk7DQotDQotICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsDQotICAgICAgICAgICAgdGhlIEhBTF9USU1fVHJpZ2dlckhhbGZDcGx0Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXINCi0gICAgIGZpbGUNCi0gICAqLw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFRpbWVyIGVycm9yIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlDQotICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX3dlYWsgdm9pZCBIQUxfVElNX0Vycm9yQ2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pIHsNCi0gIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8NCi0gIFVOVVNFRChodGltKTsNCi0NCi0gIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwNCi0gICAgICAgICAgICB0aGUgSEFMX1RJTV9FcnJvckNhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUNCi0gICAqLw0KLX0NCi0NCi0jaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQ0KLS8qKg0KLSAqIEBicmllZiAgUmVnaXN0ZXIgYSBVc2VyIFRJTSBjYWxsYmFjayB0byBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHdlYWsNCi0gKiBwcmVkZWZpbmVkIGNhbGxiYWNrDQotICogQHBhcmFtIGh0aW0gdGltIGhhbmRsZQ0KLSAqIEBwYXJhbSBDYWxsYmFja0lEIElEIG9mIHRoZSBjYWxsYmFjayB0byBiZSByZWdpc3RlcmVkDQotICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fQkFTRV9NU1BJTklUX0NCX0lEIEJhc2UgTXNwSW5pdCBDYWxsYmFjayBJRA0KLSAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX0JBU0VfTVNQREVJTklUX0NCX0lEIEJhc2UgTXNwRGVJbml0IENhbGxiYWNrIElEDQotICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fSUNfTVNQSU5JVF9DQl9JRCBJQyBNc3BJbml0IENhbGxiYWNrIElEDQotICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fSUNfTVNQREVJTklUX0NCX0lEIElDIE1zcERlSW5pdCBDYWxsYmFjayBJRA0KLSAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX09DX01TUElOSVRfQ0JfSUQgT0MgTXNwSW5pdCBDYWxsYmFjayBJRA0KLSAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX09DX01TUERFSU5JVF9DQl9JRCBPQyBNc3BEZUluaXQgQ2FsbGJhY2sgSUQNCi0gKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9QV01fTVNQSU5JVF9DQl9JRCBQV00gTXNwSW5pdCBDYWxsYmFjayBJRA0KLSAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX1BXTV9NU1BERUlOSVRfQ0JfSUQgUFdNIE1zcERlSW5pdCBDYWxsYmFjayBJRA0KLSAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX09ORV9QVUxTRV9NU1BJTklUX0NCX0lEIE9uZSBQdWxzZSBNc3BJbml0IENhbGxiYWNrDQotICogSUQNCi0gKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9PTkVfUFVMU0VfTVNQREVJTklUX0NCX0lEIE9uZSBQdWxzZSBNc3BEZUluaXQNCi0gKiBDYWxsYmFjayBJRA0KLSAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX0VOQ09ERVJfTVNQSU5JVF9DQl9JRCBFbmNvZGVyIE1zcEluaXQgQ2FsbGJhY2sgSUQNCi0gKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9FTkNPREVSX01TUERFSU5JVF9DQl9JRCBFbmNvZGVyIE1zcERlSW5pdCBDYWxsYmFjaw0KLSAqIElEDQotICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fSEFMTF9TRU5TT1JfTVNQSU5JVF9DQl9JRCBIYWxsIFNlbnNvciBNc3BJbml0DQotICogQ2FsbGJhY2sgSUQNCi0gKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9IQUxMX1NFTlNPUl9NU1BERUlOSVRfQ0JfSUQgSGFsbCBTZW5zb3IgTXNwRGVJbml0DQotICogQ2FsbGJhY2sgSUQNCi0gKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9QRVJJT0RfRUxBUFNFRF9DQl9JRCBQZXJpb2QgRWxhcHNlZCBDYWxsYmFjayBJRA0KLSAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX1BFUklPRF9FTEFQU0VEX0hBTEZfQ0JfSUQgUGVyaW9kIEVsYXBzZWQgaGFsZg0KLSAqIGNvbXBsZXRlIENhbGxiYWNrIElEDQotICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fVFJJR0dFUl9DQl9JRCBUcmlnZ2VyIENhbGxiYWNrIElEDQotICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fVFJJR0dFUl9IQUxGX0NCX0lEIFRyaWdnZXIgaGFsZiBjb21wbGV0ZSBDYWxsYmFjaw0KLSAqIElEDQotICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fSUNfQ0FQVFVSRV9DQl9JRCBJbnB1dCBDYXB0dXJlIENhbGxiYWNrIElEDQotICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fSUNfQ0FQVFVSRV9IQUxGX0NCX0lEIElucHV0IENhcHR1cmUgaGFsZiBjb21wbGV0ZQ0KLSAqIENhbGxiYWNrIElEDQotICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fT0NfREVMQVlfRUxBUFNFRF9DQl9JRCBPdXRwdXQgQ29tcGFyZSBEZWxheQ0KLSAqIEVsYXBzZWQgQ2FsbGJhY2sgSUQNCi0gKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9QV01fUFVMU0VfRklOSVNIRURfQ0JfSUQgUFdNIFB1bHNlIEZpbmlzaGVkDQotICogQ2FsbGJhY2sgSUQNCi0gKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9QV01fUFVMU0VfRklOSVNIRURfSEFMRl9DQl9JRCBQV00gUHVsc2UgRmluaXNoZWQNCi0gKiBoYWxmIGNvbXBsZXRlIENhbGxiYWNrIElEDQotICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fRVJST1JfQ0JfSUQgRXJyb3IgQ2FsbGJhY2sgSUQNCi0gKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9DT01NVVRBVElPTl9DQl9JRCBDb21tdXRhdGlvbiBDYWxsYmFjayBJRA0KLSAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX0NPTU1VVEFUSU9OX0hBTEZfQ0JfSUQgQ29tbXV0YXRpb24gaGFsZiBjb21wbGV0ZQ0KLSAqIENhbGxiYWNrIElEDQotICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fQlJFQUtfQ0JfSUQgQnJlYWsgQ2FsbGJhY2sgSUQNCi0gKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9CUkVBSzJfQ0JfSUQgQnJlYWsyIENhbGxiYWNrIElEDQotICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fRU5DT0RFUl9JTkRFWF9DQl9JRCBFbmNvZGVyIEluZGV4IENhbGxiYWNrIElEDQotICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fRElSRUNUSU9OX0NIQU5HRV9DQl9JRCBEaXJlY3Rpb24gQ2hhbmdlIENhbGxiYWNrDQotICogSUQNCi0gKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9JTkRFWF9FUlJPUl9DQl9JRCBJbmRleCBFcnJvciBDYWxsYmFjayBJRA0KLSAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX1RSQU5TSVRJT05fRVJST1JfQ0JfSUQgVHJhbnNpdGlvbiBFcnJvciBDYWxsYmFjaw0KLSAqIElEDQotICogICAgICAgICAgQHBhcmFtIHBDYWxsYmFjayBwb2ludGVyIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbg0KLSAqICAgICAgICAgIEByZXR2YWwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9SZWdpc3RlckNhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfVElNX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUSU1fQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjaykgew0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOw0KLQ0KLSAgaWYgKHBDYWxsYmFjayA9PSBOVUxMKSB7DQotICAgIHJldHVybiBIQUxfRVJST1I7DQotICB9DQotICAvKiBQcm9jZXNzIGxvY2tlZCAqLw0KLSAgX19IQUxfTE9DSyhodGltKTsNCi0NCi0gIGlmIChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX1JFQURZKSB7DQotICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkgew0KLSAgICAgIGNhc2UgSEFMX1RJTV9CQVNFX01TUElOSVRfQ0JfSUQ6DQotICAgICAgICBodGltLT5CYXNlX01zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgSEFMX1RJTV9CQVNFX01TUERFSU5JVF9DQl9JRDoNCi0gICAgICAgIGh0aW0tPkJhc2VfTXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9USU1fSUNfTVNQSU5JVF9DQl9JRDoNCi0gICAgICAgIGh0aW0tPklDX01zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgSEFMX1RJTV9JQ19NU1BERUlOSVRfQ0JfSUQ6DQotICAgICAgICBodGltLT5JQ19Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgSEFMX1RJTV9PQ19NU1BJTklUX0NCX0lEOg0KLSAgICAgICAgaHRpbS0+T0NfTXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfVElNX09DX01TUERFSU5JVF9DQl9JRDoNCi0gICAgICAgIGh0aW0tPk9DX01zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfVElNX1BXTV9NU1BJTklUX0NCX0lEOg0KLSAgICAgICAgaHRpbS0+UFdNX01zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgSEFMX1RJTV9QV01fTVNQREVJTklUX0NCX0lEOg0KLSAgICAgICAgaHRpbS0+UFdNX01zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfVElNX09ORV9QVUxTRV9NU1BJTklUX0NCX0lEOg0KLSAgICAgICAgaHRpbS0+T25lUHVsc2VfTXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfVElNX09ORV9QVUxTRV9NU1BERUlOSVRfQ0JfSUQ6DQotICAgICAgICBodGltLT5PbmVQdWxzZV9Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgSEFMX1RJTV9FTkNPREVSX01TUElOSVRfQ0JfSUQ6DQotICAgICAgICBodGltLT5FbmNvZGVyX01zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgSEFMX1RJTV9FTkNPREVSX01TUERFSU5JVF9DQl9JRDoNCi0gICAgICAgIGh0aW0tPkVuY29kZXJfTXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9USU1fSEFMTF9TRU5TT1JfTVNQSU5JVF9DQl9JRDoNCi0gICAgICAgIGh0aW0tPkhhbGxTZW5zb3JfTXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfVElNX0hBTExfU0VOU09SX01TUERFSU5JVF9DQl9JRDoNCi0gICAgICAgIGh0aW0tPkhhbGxTZW5zb3JfTXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9USU1fUEVSSU9EX0VMQVBTRURfQ0JfSUQ6DQotICAgICAgICBodGltLT5QZXJpb2RFbGFwc2VkQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9USU1fUEVSSU9EX0VMQVBTRURfSEFMRl9DQl9JRDoNCi0gICAgICAgIGh0aW0tPlBlcmlvZEVsYXBzZWRIYWxmQ3BsdENhbGxiYWNrID0gcENhbGxiYWNrOw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfVElNX1RSSUdHRVJfQ0JfSUQ6DQotICAgICAgICBodGltLT5UcmlnZ2VyQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9USU1fVFJJR0dFUl9IQUxGX0NCX0lEOg0KLSAgICAgICAgaHRpbS0+VHJpZ2dlckhhbGZDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9USU1fSUNfQ0FQVFVSRV9DQl9JRDoNCi0gICAgICAgIGh0aW0tPklDX0NhcHR1cmVDYWxsYmFjayA9IHBDYWxsYmFjazsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgSEFMX1RJTV9JQ19DQVBUVVJFX0hBTEZfQ0JfSUQ6DQotICAgICAgICBodGltLT5JQ19DYXB0dXJlSGFsZkNwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgSEFMX1RJTV9PQ19ERUxBWV9FTEFQU0VEX0NCX0lEOg0KLSAgICAgICAgaHRpbS0+T0NfRGVsYXlFbGFwc2VkQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9USU1fUFdNX1BVTFNFX0ZJTklTSEVEX0NCX0lEOg0KLSAgICAgICAgaHRpbS0+UFdNX1B1bHNlRmluaXNoZWRDYWxsYmFjayA9IHBDYWxsYmFjazsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgSEFMX1RJTV9QV01fUFVMU0VfRklOSVNIRURfSEFMRl9DQl9JRDoNCi0gICAgICAgIGh0aW0tPlBXTV9QdWxzZUZpbmlzaGVkSGFsZkNwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgSEFMX1RJTV9FUlJPUl9DQl9JRDoNCi0gICAgICAgIGh0aW0tPkVycm9yQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9USU1fQ09NTVVUQVRJT05fQ0JfSUQ6DQotICAgICAgICBodGltLT5Db21tdXRhdGlvbkNhbGxiYWNrID0gcENhbGxiYWNrOw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfVElNX0NPTU1VVEFUSU9OX0hBTEZfQ0JfSUQ6DQotICAgICAgICBodGltLT5Db21tdXRhdGlvbkhhbGZDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9USU1fQlJFQUtfQ0JfSUQ6DQotICAgICAgICBodGltLT5CcmVha0NhbGxiYWNrID0gcENhbGxiYWNrOw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfVElNX0JSRUFLMl9DQl9JRDoNCi0gICAgICAgIGh0aW0tPkJyZWFrMkNhbGxiYWNrID0gcENhbGxiYWNrOw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfVElNX0VOQ09ERVJfSU5ERVhfQ0JfSUQ6DQotICAgICAgICBodGltLT5FbmNvZGVySW5kZXhDYWxsYmFjayA9IHBDYWxsYmFjazsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgSEFMX1RJTV9ESVJFQ1RJT05fQ0hBTkdFX0NCX0lEOg0KLSAgICAgICAgaHRpbS0+RGlyZWN0aW9uQ2hhbmdlQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9USU1fSU5ERVhfRVJST1JfQ0JfSUQ6DQotICAgICAgICBodGltLT5JbmRleEVycm9yQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9USU1fVFJBTlNJVElPTl9FUlJPUl9DQl9JRDoNCi0gICAgICAgIGh0aW0tPlRyYW5zaXRpb25FcnJvckNhbGxiYWNrID0gcENhbGxiYWNrOw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgZGVmYXVsdDoNCi0gICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8NCi0gICAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsNCi0gICAgICAgIGJyZWFrOw0KLSAgICB9DQotICB9IGVsc2UgaWYgKGh0aW0tPlN0YXRlID09IEhBTF9USU1fU1RBVEVfUkVTRVQpIHsNCi0gICAgc3dpdGNoIChDYWxsYmFja0lEKSB7DQotICAgICAgY2FzZSBIQUxfVElNX0JBU0VfTVNQSU5JVF9DQl9JRDoNCi0gICAgICAgIGh0aW0tPkJhc2VfTXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfVElNX0JBU0VfTVNQREVJTklUX0NCX0lEOg0KLSAgICAgICAgaHRpbS0+QmFzZV9Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgSEFMX1RJTV9JQ19NU1BJTklUX0NCX0lEOg0KLSAgICAgICAgaHRpbS0+SUNfTXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfVElNX0lDX01TUERFSU5JVF9DQl9JRDoNCi0gICAgICAgIGh0aW0tPklDX01zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfVElNX09DX01TUElOSVRfQ0JfSUQ6DQotICAgICAgICBodGltLT5PQ19Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9USU1fT0NfTVNQREVJTklUX0NCX0lEOg0KLSAgICAgICAgaHRpbS0+T0NfTXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9USU1fUFdNX01TUElOSVRfQ0JfSUQ6DQotICAgICAgICBodGltLT5QV01fTXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfVElNX1BXTV9NU1BERUlOSVRfQ0JfSUQ6DQotICAgICAgICBodGltLT5QV01fTXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9USU1fT05FX1BVTFNFX01TUElOSVRfQ0JfSUQ6DQotICAgICAgICBodGltLT5PbmVQdWxzZV9Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9USU1fT05FX1BVTFNFX01TUERFSU5JVF9DQl9JRDoNCi0gICAgICAgIGh0aW0tPk9uZVB1bHNlX01zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfVElNX0VOQ09ERVJfTVNQSU5JVF9DQl9JRDoNCi0gICAgICAgIGh0aW0tPkVuY29kZXJfTXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfVElNX0VOQ09ERVJfTVNQREVJTklUX0NCX0lEOg0KLSAgICAgICAgaHRpbS0+RW5jb2Rlcl9Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgSEFMX1RJTV9IQUxMX1NFTlNPUl9NU1BJTklUX0NCX0lEOg0KLSAgICAgICAgaHRpbS0+SGFsbFNlbnNvcl9Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9USU1fSEFMTF9TRU5TT1JfTVNQREVJTklUX0NCX0lEOg0KLSAgICAgICAgaHRpbS0+SGFsbFNlbnNvcl9Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGRlZmF1bHQ6DQotICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovDQotICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7DQotICAgICAgICBicmVhazsNCi0gICAgfQ0KLSAgfSBlbHNlIHsNCi0gICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLw0KLSAgICBzdGF0dXMgPSBIQUxfRVJST1I7DQotICB9DQotDQotICAvKiBSZWxlYXNlIExvY2sgKi8NCi0gIF9fSEFMX1VOTE9DSyhodGltKTsNCi0NCi0gIHJldHVybiBzdGF0dXM7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgVW5yZWdpc3RlciBhIFRJTSBjYWxsYmFjaw0KLSAqICAgICAgICAgVElNIGNhbGxiYWNrIGlzIHJlZGlyZWN0ZWQgdG8gdGhlIHdlYWsgcHJlZGVmaW5lZCBjYWxsYmFjaw0KLSAqIEBwYXJhbSBodGltIHRpbSBoYW5kbGUNCi0gKiBAcGFyYW0gQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgdW5yZWdpc3RlcmVkDQotICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fQkFTRV9NU1BJTklUX0NCX0lEIEJhc2UgTXNwSW5pdCBDYWxsYmFjayBJRA0KLSAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX0JBU0VfTVNQREVJTklUX0NCX0lEIEJhc2UgTXNwRGVJbml0IENhbGxiYWNrIElEDQotICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fSUNfTVNQSU5JVF9DQl9JRCBJQyBNc3BJbml0IENhbGxiYWNrIElEDQotICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fSUNfTVNQREVJTklUX0NCX0lEIElDIE1zcERlSW5pdCBDYWxsYmFjayBJRA0KLSAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX09DX01TUElOSVRfQ0JfSUQgT0MgTXNwSW5pdCBDYWxsYmFjayBJRA0KLSAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX09DX01TUERFSU5JVF9DQl9JRCBPQyBNc3BEZUluaXQgQ2FsbGJhY2sgSUQNCi0gKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9QV01fTVNQSU5JVF9DQl9JRCBQV00gTXNwSW5pdCBDYWxsYmFjayBJRA0KLSAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX1BXTV9NU1BERUlOSVRfQ0JfSUQgUFdNIE1zcERlSW5pdCBDYWxsYmFjayBJRA0KLSAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX09ORV9QVUxTRV9NU1BJTklUX0NCX0lEIE9uZSBQdWxzZSBNc3BJbml0IENhbGxiYWNrDQotICogSUQNCi0gKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9PTkVfUFVMU0VfTVNQREVJTklUX0NCX0lEIE9uZSBQdWxzZSBNc3BEZUluaXQNCi0gKiBDYWxsYmFjayBJRA0KLSAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX0VOQ09ERVJfTVNQSU5JVF9DQl9JRCBFbmNvZGVyIE1zcEluaXQgQ2FsbGJhY2sgSUQNCi0gKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9FTkNPREVSX01TUERFSU5JVF9DQl9JRCBFbmNvZGVyIE1zcERlSW5pdCBDYWxsYmFjaw0KLSAqIElEDQotICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fSEFMTF9TRU5TT1JfTVNQSU5JVF9DQl9JRCBIYWxsIFNlbnNvciBNc3BJbml0DQotICogQ2FsbGJhY2sgSUQNCi0gKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9IQUxMX1NFTlNPUl9NU1BERUlOSVRfQ0JfSUQgSGFsbCBTZW5zb3IgTXNwRGVJbml0DQotICogQ2FsbGJhY2sgSUQNCi0gKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9QRVJJT0RfRUxBUFNFRF9DQl9JRCBQZXJpb2QgRWxhcHNlZCBDYWxsYmFjayBJRA0KLSAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX1BFUklPRF9FTEFQU0VEX0hBTEZfQ0JfSUQgUGVyaW9kIEVsYXBzZWQgaGFsZg0KLSAqIGNvbXBsZXRlIENhbGxiYWNrIElEDQotICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fVFJJR0dFUl9DQl9JRCBUcmlnZ2VyIENhbGxiYWNrIElEDQotICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fVFJJR0dFUl9IQUxGX0NCX0lEIFRyaWdnZXIgaGFsZiBjb21wbGV0ZSBDYWxsYmFjaw0KLSAqIElEDQotICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fSUNfQ0FQVFVSRV9DQl9JRCBJbnB1dCBDYXB0dXJlIENhbGxiYWNrIElEDQotICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fSUNfQ0FQVFVSRV9IQUxGX0NCX0lEIElucHV0IENhcHR1cmUgaGFsZiBjb21wbGV0ZQ0KLSAqIENhbGxiYWNrIElEDQotICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fT0NfREVMQVlfRUxBUFNFRF9DQl9JRCBPdXRwdXQgQ29tcGFyZSBEZWxheQ0KLSAqIEVsYXBzZWQgQ2FsbGJhY2sgSUQNCi0gKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9QV01fUFVMU0VfRklOSVNIRURfQ0JfSUQgUFdNIFB1bHNlIEZpbmlzaGVkDQotICogQ2FsbGJhY2sgSUQNCi0gKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9QV01fUFVMU0VfRklOSVNIRURfSEFMRl9DQl9JRCBQV00gUHVsc2UgRmluaXNoZWQNCi0gKiBoYWxmIGNvbXBsZXRlIENhbGxiYWNrIElEDQotICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fRVJST1JfQ0JfSUQgRXJyb3IgQ2FsbGJhY2sgSUQNCi0gKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9DT01NVVRBVElPTl9DQl9JRCBDb21tdXRhdGlvbiBDYWxsYmFjayBJRA0KLSAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX0NPTU1VVEFUSU9OX0hBTEZfQ0JfSUQgQ29tbXV0YXRpb24gaGFsZiBjb21wbGV0ZQ0KLSAqIENhbGxiYWNrIElEDQotICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fQlJFQUtfQ0JfSUQgQnJlYWsgQ2FsbGJhY2sgSUQNCi0gKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9CUkVBSzJfQ0JfSUQgQnJlYWsyIENhbGxiYWNrIElEDQotICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fRU5DT0RFUl9JTkRFWF9DQl9JRCBFbmNvZGVyIEluZGV4IENhbGxiYWNrIElEDQotICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fRElSRUNUSU9OX0NIQU5HRV9DQl9JRCBEaXJlY3Rpb24gQ2hhbmdlIENhbGxiYWNrDQotICogSUQNCi0gKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9JTkRFWF9FUlJPUl9DQl9JRCBJbmRleCBFcnJvciBDYWxsYmFjayBJRA0KLSAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX1RSQU5TSVRJT05fRVJST1JfQ0JfSUQgVHJhbnNpdGlvbiBFcnJvciBDYWxsYmFjaw0KLSAqIElEDQotICogICAgICAgICAgQHJldHZhbCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1VuUmVnaXN0ZXJDYWxsYmFjaygNCi0gICAgVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIEhBTF9USU1fQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCkgew0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOw0KLQ0KLSAgLyogUHJvY2VzcyBsb2NrZWQgKi8NCi0gIF9fSEFMX0xPQ0soaHRpbSk7DQotDQotICBpZiAoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9SRUFEWSkgew0KLSAgICBzd2l0Y2ggKENhbGxiYWNrSUQpIHsNCi0gICAgICBjYXNlIEhBTF9USU1fQkFTRV9NU1BJTklUX0NCX0lEOg0KLSAgICAgICAgLyogTGVnYWN5IHdlYWsgQmFzZSBNc3BJbml0IENhbGxiYWNrICovDQotICAgICAgICBodGltLT5CYXNlX01zcEluaXRDYWxsYmFjayA9IEhBTF9USU1fQmFzZV9Nc3BJbml0Ow0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfVElNX0JBU0VfTVNQREVJTklUX0NCX0lEOg0KLSAgICAgICAgLyogTGVnYWN5IHdlYWsgQmFzZSBNc3AgRGVJbml0IENhbGxiYWNrICovDQotICAgICAgICBodGltLT5CYXNlX01zcERlSW5pdENhbGxiYWNrID0gSEFMX1RJTV9CYXNlX01zcERlSW5pdDsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgSEFMX1RJTV9JQ19NU1BJTklUX0NCX0lEOg0KLSAgICAgICAgLyogTGVnYWN5IHdlYWsgSUMgTXNwIEluaXQgQ2FsbGJhY2sgKi8NCi0gICAgICAgIGh0aW0tPklDX01zcEluaXRDYWxsYmFjayA9IEhBTF9USU1fSUNfTXNwSW5pdDsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgSEFMX1RJTV9JQ19NU1BERUlOSVRfQ0JfSUQ6DQotICAgICAgICAvKiBMZWdhY3kgd2VhayBJQyBNc3AgRGVJbml0IENhbGxiYWNrICovDQotICAgICAgICBodGltLT5JQ19Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9USU1fSUNfTXNwRGVJbml0Ow0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfVElNX09DX01TUElOSVRfQ0JfSUQ6DQotICAgICAgICAvKiBMZWdhY3kgd2VhayBPQyBNc3AgSW5pdCBDYWxsYmFjayAqLw0KLSAgICAgICAgaHRpbS0+T0NfTXNwSW5pdENhbGxiYWNrID0gSEFMX1RJTV9PQ19Nc3BJbml0Ow0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfVElNX09DX01TUERFSU5JVF9DQl9JRDoNCi0gICAgICAgIC8qIExlZ2FjeSB3ZWFrIE9DIE1zcCBEZUluaXQgQ2FsbGJhY2sgKi8NCi0gICAgICAgIGh0aW0tPk9DX01zcERlSW5pdENhbGxiYWNrID0gSEFMX1RJTV9PQ19Nc3BEZUluaXQ7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9USU1fUFdNX01TUElOSVRfQ0JfSUQ6DQotICAgICAgICAvKiBMZWdhY3kgd2VhayBQV00gTXNwIEluaXQgQ2FsbGJhY2sgKi8NCi0gICAgICAgIGh0aW0tPlBXTV9Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfVElNX1BXTV9Nc3BJbml0Ow0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfVElNX1BXTV9NU1BERUlOSVRfQ0JfSUQ6DQotICAgICAgICAvKiBMZWdhY3kgd2VhayBQV00gTXNwIERlSW5pdCBDYWxsYmFjayAqLw0KLSAgICAgICAgaHRpbS0+UFdNX01zcERlSW5pdENhbGxiYWNrID0gSEFMX1RJTV9QV01fTXNwRGVJbml0Ow0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfVElNX09ORV9QVUxTRV9NU1BJTklUX0NCX0lEOg0KLSAgICAgICAgLyogTGVnYWN5IHdlYWsgT25lIFB1bHNlIE1zcCBJbml0IENhbGxiYWNrICovDQotICAgICAgICBodGltLT5PbmVQdWxzZV9Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfVElNX09uZVB1bHNlX01zcEluaXQ7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9USU1fT05FX1BVTFNFX01TUERFSU5JVF9DQl9JRDoNCi0gICAgICAgIC8qIExlZ2FjeSB3ZWFrIE9uZSBQdWxzZSBNc3AgRGVJbml0IENhbGxiYWNrICovDQotICAgICAgICBodGltLT5PbmVQdWxzZV9Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9USU1fT25lUHVsc2VfTXNwRGVJbml0Ow0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfVElNX0VOQ09ERVJfTVNQSU5JVF9DQl9JRDoNCi0gICAgICAgIC8qIExlZ2FjeSB3ZWFrIEVuY29kZXIgTXNwIEluaXQgQ2FsbGJhY2sgKi8NCi0gICAgICAgIGh0aW0tPkVuY29kZXJfTXNwSW5pdENhbGxiYWNrID0gSEFMX1RJTV9FbmNvZGVyX01zcEluaXQ7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9USU1fRU5DT0RFUl9NU1BERUlOSVRfQ0JfSUQ6DQotICAgICAgICAvKiBMZWdhY3kgd2VhayBFbmNvZGVyIE1zcCBEZUluaXQgQ2FsbGJhY2sgKi8NCi0gICAgICAgIGh0aW0tPkVuY29kZXJfTXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfVElNX0VuY29kZXJfTXNwRGVJbml0Ow0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfVElNX0hBTExfU0VOU09SX01TUElOSVRfQ0JfSUQ6DQotICAgICAgICAvKiBMZWdhY3kgd2VhayBIYWxsIFNlbnNvciBNc3AgSW5pdCBDYWxsYmFjayAqLw0KLSAgICAgICAgaHRpbS0+SGFsbFNlbnNvcl9Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfVElNRXhfSGFsbFNlbnNvcl9Nc3BJbml0Ow0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfVElNX0hBTExfU0VOU09SX01TUERFSU5JVF9DQl9JRDoNCi0gICAgICAgIC8qIExlZ2FjeSB3ZWFrIEhhbGwgU2Vuc29yIE1zcCBEZUluaXQgQ2FsbGJhY2sgKi8NCi0gICAgICAgIGh0aW0tPkhhbGxTZW5zb3JfTXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfVElNRXhfSGFsbFNlbnNvcl9Nc3BEZUluaXQ7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9USU1fUEVSSU9EX0VMQVBTRURfQ0JfSUQ6DQotICAgICAgICAvKiBMZWdhY3kgd2VhayBQZXJpb2QgRWxhcHNlZCBDYWxsYmFjayAqLw0KLSAgICAgICAgaHRpbS0+UGVyaW9kRWxhcHNlZENhbGxiYWNrID0gSEFMX1RJTV9QZXJpb2RFbGFwc2VkQ2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9USU1fUEVSSU9EX0VMQVBTRURfSEFMRl9DQl9JRDoNCi0gICAgICAgIC8qIExlZ2FjeSB3ZWFrIFBlcmlvZCBFbGFwc2VkIGhhbGYgY29tcGxldGUgQ2FsbGJhY2sgKi8NCi0gICAgICAgIGh0aW0tPlBlcmlvZEVsYXBzZWRIYWxmQ3BsdENhbGxiYWNrID0NCi0gICAgICAgICAgICBIQUxfVElNX1BlcmlvZEVsYXBzZWRIYWxmQ3BsdENhbGxiYWNrOw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfVElNX1RSSUdHRVJfQ0JfSUQ6DQotICAgICAgICAvKiBMZWdhY3kgd2VhayBUcmlnZ2VyIENhbGxiYWNrICovDQotICAgICAgICBodGltLT5UcmlnZ2VyQ2FsbGJhY2sgPSBIQUxfVElNX1RyaWdnZXJDYWxsYmFjazsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgSEFMX1RJTV9UUklHR0VSX0hBTEZfQ0JfSUQ6DQotICAgICAgICAvKiBMZWdhY3kgd2VhayBUcmlnZ2VyIGhhbGYgY29tcGxldGUgQ2FsbGJhY2sgKi8NCi0gICAgICAgIGh0aW0tPlRyaWdnZXJIYWxmQ3BsdENhbGxiYWNrID0gSEFMX1RJTV9UcmlnZ2VySGFsZkNwbHRDYWxsYmFjazsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgSEFMX1RJTV9JQ19DQVBUVVJFX0NCX0lEOg0KLSAgICAgICAgLyogTGVnYWN5IHdlYWsgSUMgQ2FwdHVyZSBDYWxsYmFjayAqLw0KLSAgICAgICAgaHRpbS0+SUNfQ2FwdHVyZUNhbGxiYWNrID0gSEFMX1RJTV9JQ19DYXB0dXJlQ2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9USU1fSUNfQ0FQVFVSRV9IQUxGX0NCX0lEOg0KLSAgICAgICAgLyogTGVnYWN5IHdlYWsgSUMgQ2FwdHVyZSBoYWxmIGNvbXBsZXRlIENhbGxiYWNrICovDQotICAgICAgICBodGltLT5JQ19DYXB0dXJlSGFsZkNwbHRDYWxsYmFjayA9IEhBTF9USU1fSUNfQ2FwdHVyZUhhbGZDcGx0Q2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9USU1fT0NfREVMQVlfRUxBUFNFRF9DQl9JRDoNCi0gICAgICAgIC8qIExlZ2FjeSB3ZWFrIE9DIERlbGF5IEVsYXBzZWQgQ2FsbGJhY2sgKi8NCi0gICAgICAgIGh0aW0tPk9DX0RlbGF5RWxhcHNlZENhbGxiYWNrID0gSEFMX1RJTV9PQ19EZWxheUVsYXBzZWRDYWxsYmFjazsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgSEFMX1RJTV9QV01fUFVMU0VfRklOSVNIRURfQ0JfSUQ6DQotICAgICAgICAvKiBMZWdhY3kgd2VhayBQV00gUHVsc2UgRmluaXNoZWQgQ2FsbGJhY2sgKi8NCi0gICAgICAgIGh0aW0tPlBXTV9QdWxzZUZpbmlzaGVkQ2FsbGJhY2sgPSBIQUxfVElNX1BXTV9QdWxzZUZpbmlzaGVkQ2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9USU1fUFdNX1BVTFNFX0ZJTklTSEVEX0hBTEZfQ0JfSUQ6DQotICAgICAgICAvKiBMZWdhY3kgd2VhayBQV00gUHVsc2UgRmluaXNoZWQgaGFsZiBjb21wbGV0ZSBDYWxsYmFjayAqLw0KLSAgICAgICAgaHRpbS0+UFdNX1B1bHNlRmluaXNoZWRIYWxmQ3BsdENhbGxiYWNrID0NCi0gICAgICAgICAgICBIQUxfVElNX1BXTV9QdWxzZUZpbmlzaGVkSGFsZkNwbHRDYWxsYmFjazsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgSEFMX1RJTV9FUlJPUl9DQl9JRDoNCi0gICAgICAgIC8qIExlZ2FjeSB3ZWFrIEVycm9yIENhbGxiYWNrICovDQotICAgICAgICBodGltLT5FcnJvckNhbGxiYWNrID0gSEFMX1RJTV9FcnJvckNhbGxiYWNrOw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfVElNX0NPTU1VVEFUSU9OX0NCX0lEOg0KLSAgICAgICAgLyogTGVnYWN5IHdlYWsgQ29tbXV0YXRpb24gQ2FsbGJhY2sgKi8NCi0gICAgICAgIGh0aW0tPkNvbW11dGF0aW9uQ2FsbGJhY2sgPSBIQUxfVElNRXhfQ29tbXV0Q2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9USU1fQ09NTVVUQVRJT05fSEFMRl9DQl9JRDoNCi0gICAgICAgIC8qIExlZ2FjeSB3ZWFrIENvbW11dGF0aW9uIGhhbGYgY29tcGxldGUgQ2FsbGJhY2sgKi8NCi0gICAgICAgIGh0aW0tPkNvbW11dGF0aW9uSGFsZkNwbHRDYWxsYmFjayA9IEhBTF9USU1FeF9Db21tdXRIYWxmQ3BsdENhbGxiYWNrOw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfVElNX0JSRUFLX0NCX0lEOg0KLSAgICAgICAgLyogTGVnYWN5IHdlYWsgQnJlYWsgQ2FsbGJhY2sgKi8NCi0gICAgICAgIGh0aW0tPkJyZWFrQ2FsbGJhY2sgPSBIQUxfVElNRXhfQnJlYWtDYWxsYmFjazsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgSEFMX1RJTV9CUkVBSzJfQ0JfSUQ6DQotICAgICAgICAvKiBMZWdhY3kgd2VhayBCcmVhazIgQ2FsbGJhY2sgKi8NCi0gICAgICAgIGh0aW0tPkJyZWFrMkNhbGxiYWNrID0gSEFMX1RJTUV4X0JyZWFrMkNhbGxiYWNrOw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfVElNX0VOQ09ERVJfSU5ERVhfQ0JfSUQ6DQotICAgICAgICAvKiBMZWdhY3kgd2VhayBFbmNvZGVyIEluZGV4IENhbGxiYWNrICovDQotICAgICAgICBodGltLT5FbmNvZGVySW5kZXhDYWxsYmFjayA9IEhBTF9USU1FeF9FbmNvZGVySW5kZXhDYWxsYmFjazsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgSEFMX1RJTV9ESVJFQ1RJT05fQ0hBTkdFX0NCX0lEOg0KLSAgICAgICAgLyogTGVnYWN5IHdlYWsgRGlyZWN0aW9uIENoYW5nZSBDYWxsYmFjayAqLw0KLSAgICAgICAgaHRpbS0+RGlyZWN0aW9uQ2hhbmdlQ2FsbGJhY2sgPSBIQUxfVElNRXhfRGlyZWN0aW9uQ2hhbmdlQ2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9USU1fSU5ERVhfRVJST1JfQ0JfSUQ6DQotICAgICAgICAvKiBMZWdhY3kgd2VhayBJbmRleCBFcnJvciBDYWxsYmFjayAqLw0KLSAgICAgICAgaHRpbS0+SW5kZXhFcnJvckNhbGxiYWNrID0gSEFMX1RJTUV4X0luZGV4RXJyb3JDYWxsYmFjazsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgSEFMX1RJTV9UUkFOU0lUSU9OX0VSUk9SX0NCX0lEOg0KLSAgICAgICAgLyogTGVnYWN5IHdlYWsgVHJhbnNpdGlvbiBFcnJvciBDYWxsYmFjayAqLw0KLSAgICAgICAgaHRpbS0+VHJhbnNpdGlvbkVycm9yQ2FsbGJhY2sgPSBIQUxfVElNRXhfVHJhbnNpdGlvbkVycm9yQ2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBkZWZhdWx0Og0KLSAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLw0KLSAgICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOw0KLSAgICAgICAgYnJlYWs7DQotICAgIH0NCi0gIH0gZWxzZSBpZiAoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9SRVNFVCkgew0KLSAgICBzd2l0Y2ggKENhbGxiYWNrSUQpIHsNCi0gICAgICBjYXNlIEhBTF9USU1fQkFTRV9NU1BJTklUX0NCX0lEOg0KLSAgICAgICAgLyogTGVnYWN5IHdlYWsgQmFzZSBNc3BJbml0IENhbGxiYWNrICovDQotICAgICAgICBodGltLT5CYXNlX01zcEluaXRDYWxsYmFjayA9IEhBTF9USU1fQmFzZV9Nc3BJbml0Ow0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfVElNX0JBU0VfTVNQREVJTklUX0NCX0lEOg0KLSAgICAgICAgLyogTGVnYWN5IHdlYWsgQmFzZSBNc3AgRGVJbml0IENhbGxiYWNrICovDQotICAgICAgICBodGltLT5CYXNlX01zcERlSW5pdENhbGxiYWNrID0gSEFMX1RJTV9CYXNlX01zcERlSW5pdDsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgSEFMX1RJTV9JQ19NU1BJTklUX0NCX0lEOg0KLSAgICAgICAgLyogTGVnYWN5IHdlYWsgSUMgTXNwIEluaXQgQ2FsbGJhY2sgKi8NCi0gICAgICAgIGh0aW0tPklDX01zcEluaXRDYWxsYmFjayA9IEhBTF9USU1fSUNfTXNwSW5pdDsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgSEFMX1RJTV9JQ19NU1BERUlOSVRfQ0JfSUQ6DQotICAgICAgICAvKiBMZWdhY3kgd2VhayBJQyBNc3AgRGVJbml0IENhbGxiYWNrICovDQotICAgICAgICBodGltLT5JQ19Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9USU1fSUNfTXNwRGVJbml0Ow0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfVElNX09DX01TUElOSVRfQ0JfSUQ6DQotICAgICAgICAvKiBMZWdhY3kgd2VhayBPQyBNc3AgSW5pdCBDYWxsYmFjayAqLw0KLSAgICAgICAgaHRpbS0+T0NfTXNwSW5pdENhbGxiYWNrID0gSEFMX1RJTV9PQ19Nc3BJbml0Ow0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfVElNX09DX01TUERFSU5JVF9DQl9JRDoNCi0gICAgICAgIC8qIExlZ2FjeSB3ZWFrIE9DIE1zcCBEZUluaXQgQ2FsbGJhY2sgKi8NCi0gICAgICAgIGh0aW0tPk9DX01zcERlSW5pdENhbGxiYWNrID0gSEFMX1RJTV9PQ19Nc3BEZUluaXQ7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9USU1fUFdNX01TUElOSVRfQ0JfSUQ6DQotICAgICAgICAvKiBMZWdhY3kgd2VhayBQV00gTXNwIEluaXQgQ2FsbGJhY2sgKi8NCi0gICAgICAgIGh0aW0tPlBXTV9Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfVElNX1BXTV9Nc3BJbml0Ow0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfVElNX1BXTV9NU1BERUlOSVRfQ0JfSUQ6DQotICAgICAgICAvKiBMZWdhY3kgd2VhayBQV00gTXNwIERlSW5pdCBDYWxsYmFjayAqLw0KLSAgICAgICAgaHRpbS0+UFdNX01zcERlSW5pdENhbGxiYWNrID0gSEFMX1RJTV9QV01fTXNwRGVJbml0Ow0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfVElNX09ORV9QVUxTRV9NU1BJTklUX0NCX0lEOg0KLSAgICAgICAgLyogTGVnYWN5IHdlYWsgT25lIFB1bHNlIE1zcCBJbml0IENhbGxiYWNrICovDQotICAgICAgICBodGltLT5PbmVQdWxzZV9Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfVElNX09uZVB1bHNlX01zcEluaXQ7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9USU1fT05FX1BVTFNFX01TUERFSU5JVF9DQl9JRDoNCi0gICAgICAgIC8qIExlZ2FjeSB3ZWFrIE9uZSBQdWxzZSBNc3AgRGVJbml0IENhbGxiYWNrICovDQotICAgICAgICBodGltLT5PbmVQdWxzZV9Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9USU1fT25lUHVsc2VfTXNwRGVJbml0Ow0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfVElNX0VOQ09ERVJfTVNQSU5JVF9DQl9JRDoNCi0gICAgICAgIC8qIExlZ2FjeSB3ZWFrIEVuY29kZXIgTXNwIEluaXQgQ2FsbGJhY2sgKi8NCi0gICAgICAgIGh0aW0tPkVuY29kZXJfTXNwSW5pdENhbGxiYWNrID0gSEFMX1RJTV9FbmNvZGVyX01zcEluaXQ7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9USU1fRU5DT0RFUl9NU1BERUlOSVRfQ0JfSUQ6DQotICAgICAgICAvKiBMZWdhY3kgd2VhayBFbmNvZGVyIE1zcCBEZUluaXQgQ2FsbGJhY2sgKi8NCi0gICAgICAgIGh0aW0tPkVuY29kZXJfTXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfVElNX0VuY29kZXJfTXNwRGVJbml0Ow0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfVElNX0hBTExfU0VOU09SX01TUElOSVRfQ0JfSUQ6DQotICAgICAgICAvKiBMZWdhY3kgd2VhayBIYWxsIFNlbnNvciBNc3AgSW5pdCBDYWxsYmFjayAqLw0KLSAgICAgICAgaHRpbS0+SGFsbFNlbnNvcl9Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfVElNRXhfSGFsbFNlbnNvcl9Nc3BJbml0Ow0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfVElNX0hBTExfU0VOU09SX01TUERFSU5JVF9DQl9JRDoNCi0gICAgICAgIC8qIExlZ2FjeSB3ZWFrIEhhbGwgU2Vuc29yIE1zcCBEZUluaXQgQ2FsbGJhY2sgKi8NCi0gICAgICAgIGh0aW0tPkhhbGxTZW5zb3JfTXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfVElNRXhfSGFsbFNlbnNvcl9Nc3BEZUluaXQ7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBkZWZhdWx0Og0KLSAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLw0KLSAgICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOw0KLSAgICAgICAgYnJlYWs7DQotICAgIH0NCi0gIH0gZWxzZSB7DQotICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8NCi0gICAgc3RhdHVzID0gSEFMX0VSUk9SOw0KLSAgfQ0KLQ0KLSAgLyogUmVsZWFzZSBMb2NrICovDQotICBfX0hBTF9VTkxPQ0soaHRpbSk7DQotDQotICByZXR1cm4gc3RhdHVzOw0KLX0NCi0jZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxMCBUSU0gUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMNCi0gICogIEBicmllZiAgIFRJTSBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucw0KLSAgKg0KLUB2ZXJiYXRpbQ0KLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMgIyMjIyMNCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICBbLi5dDQotICAgIFRoaXMgc3Vic2VjdGlvbiBwZXJtaXRzIHRvIGdldCBpbiBydW4tdGltZSB0aGUgc3RhdHVzIG9mIHRoZSBwZXJpcGhlcmFsDQotICAgIGFuZCB0aGUgZGF0YSBmbG93Lg0KLQ0KLUBlbmR2ZXJiYXRpbQ0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJldHVybiB0aGUgVElNIEJhc2UgaGFuZGxlIHN0YXRlLg0KLSAqIEBwYXJhbSAgaHRpbSBUSU0gQmFzZSBoYW5kbGUNCi0gKiBAcmV0dmFsIEhBTCBzdGF0ZQ0KLSAqLw0KLUhBTF9USU1fU3RhdGVUeXBlRGVmIEhBTF9USU1fQmFzZV9HZXRTdGF0ZShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkgew0KLSAgcmV0dXJuIGh0aW0tPlN0YXRlOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJldHVybiB0aGUgVElNIE9DIGhhbmRsZSBzdGF0ZS4NCi0gKiBAcGFyYW0gIGh0aW0gVElNIE91dHB1dCBDb21wYXJlIGhhbmRsZQ0KLSAqIEByZXR2YWwgSEFMIHN0YXRlDQotICovDQotSEFMX1RJTV9TdGF0ZVR5cGVEZWYgSEFMX1RJTV9PQ19HZXRTdGF0ZShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkgew0KLSAgcmV0dXJuIGh0aW0tPlN0YXRlOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJldHVybiB0aGUgVElNIFBXTSBoYW5kbGUgc3RhdGUuDQotICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUNCi0gKiBAcmV0dmFsIEhBTCBzdGF0ZQ0KLSAqLw0KLUhBTF9USU1fU3RhdGVUeXBlRGVmIEhBTF9USU1fUFdNX0dldFN0YXRlKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKSB7DQotICByZXR1cm4gaHRpbS0+U3RhdGU7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmV0dXJuIHRoZSBUSU0gSW5wdXQgQ2FwdHVyZSBoYW5kbGUgc3RhdGUuDQotICogQHBhcmFtICBodGltIFRJTSBJQyBoYW5kbGUNCi0gKiBAcmV0dmFsIEhBTCBzdGF0ZQ0KLSAqLw0KLUhBTF9USU1fU3RhdGVUeXBlRGVmIEhBTF9USU1fSUNfR2V0U3RhdGUoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pIHsNCi0gIHJldHVybiBodGltLT5TdGF0ZTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBSZXR1cm4gdGhlIFRJTSBPbmUgUHVsc2UgTW9kZSBoYW5kbGUgc3RhdGUuDQotICogQHBhcmFtICBodGltIFRJTSBPUE0gaGFuZGxlDQotICogQHJldHZhbCBIQUwgc3RhdGUNCi0gKi8NCi1IQUxfVElNX1N0YXRlVHlwZURlZiBIQUxfVElNX09uZVB1bHNlX0dldFN0YXRlKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKSB7DQotICByZXR1cm4gaHRpbS0+U3RhdGU7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmV0dXJuIHRoZSBUSU0gRW5jb2RlciBNb2RlIGhhbmRsZSBzdGF0ZS4NCi0gKiBAcGFyYW0gIGh0aW0gVElNIEVuY29kZXIgSW50ZXJmYWNlIGhhbmRsZQ0KLSAqIEByZXR2YWwgSEFMIHN0YXRlDQotICovDQotSEFMX1RJTV9TdGF0ZVR5cGVEZWYgSEFMX1RJTV9FbmNvZGVyX0dldFN0YXRlKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKSB7DQotICByZXR1cm4gaHRpbS0+U3RhdGU7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmV0dXJuIHRoZSBUSU0gRW5jb2RlciBNb2RlIGhhbmRsZSBzdGF0ZS4NCi0gKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQ0KLSAqIEByZXR2YWwgQWN0aXZlIGNoYW5uZWwNCi0gKi8NCi1IQUxfVElNX0FjdGl2ZUNoYW5uZWwgSEFMX1RJTV9HZXRBY3RpdmVDaGFubmVsKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKSB7DQotICByZXR1cm4gaHRpbS0+Q2hhbm5lbDsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBSZXR1cm4gYWN0dWFsIHN0YXRlIG9mIHRoZSBUSU0gY2hhbm5lbC4NCi0gKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQ0KLSAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbA0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDENCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNTogVElNIENoYW5uZWwgNQ0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF82OiBUSU0gQ2hhbm5lbCA2DQotICogQHJldHZhbCBUSU0gQ2hhbm5lbCBzdGF0ZQ0KLSAqLw0KLUhBTF9USU1fQ2hhbm5lbFN0YXRlVHlwZURlZiBIQUxfVElNX0dldENoYW5uZWxTdGF0ZShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCkgew0KLSAgSEFMX1RJTV9DaGFubmVsU3RhdGVUeXBlRGVmIGNoYW5uZWxfc3RhdGU7DQotDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsNCi0NCi0gIGNoYW5uZWxfc3RhdGUgPSBUSU1fQ0hBTk5FTF9TVEFURV9HRVQoaHRpbSwgQ2hhbm5lbCk7DQotDQotICByZXR1cm4gY2hhbm5lbF9zdGF0ZTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBSZXR1cm4gYWN0dWFsIHN0YXRlIG9mIGEgRE1BIGJ1cnN0IG9wZXJhdGlvbi4NCi0gKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQ0KLSAqIEByZXR2YWwgRE1BIGJ1cnN0IHN0YXRlDQotICovDQotSEFMX1RJTV9ETUFCdXJzdFN0YXRlVHlwZURlZiBIQUxfVElNX0RNQUJ1cnN0U3RhdGUoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pIHsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0RNQUJVUlNUX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7DQotDQotICByZXR1cm4gaHRpbS0+RE1BQnVyc3RTdGF0ZTsNCi19DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX1ByaXZhdGVfRnVuY3Rpb25zIFRJTSBQcml2YXRlIEZ1bmN0aW9ucw0KLSAqIEB7DQotICovDQotDQotLyoqDQotICogQGJyaWVmICBUSU0gRE1BIGVycm9yIGNhbGxiYWNrDQotICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gRE1BIGhhbmRsZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi12b2lkIFRJTV9ETUFFcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkgew0KLSAgVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0gPQ0KLSAgICAgIChUSU1fSGFuZGxlVHlwZURlZiAqKSgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50Ow0KLQ0KLSAgaWYgKGhkbWEgPT0gaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0pIHsNCi0gICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfMTsNCi0gICAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7DQotICB9IGVsc2UgaWYgKGhkbWEgPT0gaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0pIHsNCi0gICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfMjsNCi0gICAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7DQotICB9IGVsc2UgaWYgKGhkbWEgPT0gaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10pIHsNCi0gICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfMzsNCi0gICAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzMsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7DQotICB9IGVsc2UgaWYgKGhkbWEgPT0gaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDNF0pIHsNCi0gICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfNDsNCi0gICAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzQsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7DQotICB9IGVsc2Ugew0KLSAgICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7DQotICB9DQotDQotI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkNCi0gIGh0aW0tPkVycm9yQ2FsbGJhY2soaHRpbSk7DQotI2Vsc2UNCi0gIEhBTF9USU1fRXJyb3JDYWxsYmFjayhodGltKTsNCi0jZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotDQotICBodGltLT5DaGFubmVsID0gSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF9DTEVBUkVEOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFRJTSBETUEgRGVsYXkgUHVsc2UgY29tcGxldGUgY2FsbGJhY2suDQotICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gRE1BIGhhbmRsZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1zdGF0aWMgdm9pZCBUSU1fRE1BRGVsYXlQdWxzZUNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpIHsNCi0gIFRJTV9IYW5kbGVUeXBlRGVmICpodGltID0NCi0gICAgICAoVElNX0hhbmRsZVR5cGVEZWYgKikoKERNQV9IYW5kbGVUeXBlRGVmICopaGRtYSktPlBhcmVudDsNCi0NCi0gIGlmIChoZG1hID09IGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdKSB7DQotICAgIGh0aW0tPkNoYW5uZWwgPSBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzE7DQotDQotICAgIGlmIChoZG1hLT5Jbml0Lk1vZGUgPT0gRE1BX05PUk1BTCkgew0KLSAgICAgIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8xLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOw0KLSAgICB9DQotICB9IGVsc2UgaWYgKGhkbWEgPT0gaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0pIHsNCi0gICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfMjsNCi0NCi0gICAgaWYgKGhkbWEtPkluaXQuTW9kZSA9PSBETUFfTk9STUFMKSB7DQotICAgICAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7DQotICAgIH0NCi0gIH0gZWxzZSBpZiAoaGRtYSA9PSBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXSkgew0KLSAgICBodGltLT5DaGFubmVsID0gSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF8zOw0KLQ0KLSAgICBpZiAoaGRtYS0+SW5pdC5Nb2RlID09IERNQV9OT1JNQUwpIHsNCi0gICAgICBUSU1fQ0hBTk5FTF9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMywgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsNCi0gICAgfQ0KLSAgfSBlbHNlIGlmIChoZG1hID09IGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdKSB7DQotICAgIGh0aW0tPkNoYW5uZWwgPSBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzQ7DQotDQotICAgIGlmIChoZG1hLT5Jbml0Lk1vZGUgPT0gRE1BX05PUk1BTCkgew0KLSAgICAgIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF80LCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOw0KLSAgICB9DQotICB9IGVsc2Ugew0KLSAgICAvKiBub3RoaW5nIHRvIGRvICovDQotICB9DQotDQotI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkNCi0gIGh0aW0tPlBXTV9QdWxzZUZpbmlzaGVkQ2FsbGJhY2soaHRpbSk7DQotI2Vsc2UNCi0gIEhBTF9USU1fUFdNX1B1bHNlRmluaXNoZWRDYWxsYmFjayhodGltKTsNCi0jZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotDQotICBodGltLT5DaGFubmVsID0gSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF9DTEVBUkVEOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFRJTSBETUEgRGVsYXkgUHVsc2UgaGFsZiBjb21wbGV0ZSBjYWxsYmFjay4NCi0gKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBETUEgaGFuZGxlLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXZvaWQgVElNX0RNQURlbGF5UHVsc2VIYWxmQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkgew0KLSAgVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0gPQ0KLSAgICAgIChUSU1fSGFuZGxlVHlwZURlZiAqKSgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50Ow0KLQ0KLSAgaWYgKGhkbWEgPT0gaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0pIHsNCi0gICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfMTsNCi0gIH0gZWxzZSBpZiAoaGRtYSA9PSBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXSkgew0KLSAgICBodGltLT5DaGFubmVsID0gSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF8yOw0KLSAgfSBlbHNlIGlmIChoZG1hID09IGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdKSB7DQotICAgIGh0aW0tPkNoYW5uZWwgPSBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzM7DQotICB9IGVsc2UgaWYgKGhkbWEgPT0gaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDNF0pIHsNCi0gICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfNDsNCi0gIH0gZWxzZSB7DQotICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8NCi0gIH0NCi0NCi0jaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQ0KLSAgaHRpbS0+UFdNX1B1bHNlRmluaXNoZWRIYWxmQ3BsdENhbGxiYWNrKGh0aW0pOw0KLSNlbHNlDQotICBIQUxfVElNX1BXTV9QdWxzZUZpbmlzaGVkSGFsZkNwbHRDYWxsYmFjayhodGltKTsNCi0jZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotDQotICBodGltLT5DaGFubmVsID0gSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF9DTEVBUkVEOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFRJTSBETUEgQ2FwdHVyZSBjb21wbGV0ZSBjYWxsYmFjay4NCi0gKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBETUEgaGFuZGxlLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXZvaWQgVElNX0RNQUNhcHR1cmVDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKSB7DQotICBUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSA9DQotICAgICAgKFRJTV9IYW5kbGVUeXBlRGVmICopKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQ7DQotDQotICBpZiAoaGRtYSA9PSBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXSkgew0KLSAgICBodGltLT5DaGFubmVsID0gSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF8xOw0KLQ0KLSAgICBpZiAoaGRtYS0+SW5pdC5Nb2RlID09IERNQV9OT1JNQUwpIHsNCi0gICAgICBUSU1fQ0hBTk5FTF9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMSwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsNCi0gICAgICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8xLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOw0KLSAgICB9DQotICB9IGVsc2UgaWYgKGhkbWEgPT0gaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0pIHsNCi0gICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfMjsNCi0NCi0gICAgaWYgKGhkbWEtPkluaXQuTW9kZSA9PSBETUFfTk9STUFMKSB7DQotICAgICAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7DQotICAgICAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMiwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsNCi0gICAgfQ0KLSAgfSBlbHNlIGlmIChoZG1hID09IGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdKSB7DQotICAgIGh0aW0tPkNoYW5uZWwgPSBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzM7DQotDQotICAgIGlmIChoZG1hLT5Jbml0Lk1vZGUgPT0gRE1BX05PUk1BTCkgew0KLSAgICAgIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8zLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOw0KLSAgICAgIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzMsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7DQotICAgIH0NCi0gIH0gZWxzZSBpZiAoaGRtYSA9PSBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XSkgew0KLSAgICBodGltLT5DaGFubmVsID0gSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF80Ow0KLQ0KLSAgICBpZiAoaGRtYS0+SW5pdC5Nb2RlID09IERNQV9OT1JNQUwpIHsNCi0gICAgICBUSU1fQ0hBTk5FTF9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfNCwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsNCi0gICAgICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF80LCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOw0KLSAgICB9DQotICB9IGVsc2Ugew0KLSAgICAvKiBub3RoaW5nIHRvIGRvICovDQotICB9DQotDQotI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkNCi0gIGh0aW0tPklDX0NhcHR1cmVDYWxsYmFjayhodGltKTsNCi0jZWxzZQ0KLSAgSEFMX1RJTV9JQ19DYXB0dXJlQ2FsbGJhY2soaHRpbSk7DQotI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLQ0KLSAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfQ0xFQVJFRDsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBUSU0gRE1BIENhcHR1cmUgaGFsZiBjb21wbGV0ZSBjYWxsYmFjay4NCi0gKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBETUEgaGFuZGxlLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXZvaWQgVElNX0RNQUNhcHR1cmVIYWxmQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkgew0KLSAgVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0gPQ0KLSAgICAgIChUSU1fSGFuZGxlVHlwZURlZiAqKSgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50Ow0KLQ0KLSAgaWYgKGhkbWEgPT0gaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0pIHsNCi0gICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfMTsNCi0gIH0gZWxzZSBpZiAoaGRtYSA9PSBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXSkgew0KLSAgICBodGltLT5DaGFubmVsID0gSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF8yOw0KLSAgfSBlbHNlIGlmIChoZG1hID09IGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdKSB7DQotICAgIGh0aW0tPkNoYW5uZWwgPSBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzM7DQotICB9IGVsc2UgaWYgKGhkbWEgPT0gaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDNF0pIHsNCi0gICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfNDsNCi0gIH0gZWxzZSB7DQotICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8NCi0gIH0NCi0NCi0jaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQ0KLSAgaHRpbS0+SUNfQ2FwdHVyZUhhbGZDcGx0Q2FsbGJhY2soaHRpbSk7DQotI2Vsc2UNCi0gIEhBTF9USU1fSUNfQ2FwdHVyZUhhbGZDcGx0Q2FsbGJhY2soaHRpbSk7DQotI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLQ0KLSAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfQ0xFQVJFRDsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBUSU0gRE1BIFBlcmlvZCBFbGFwc2UgY29tcGxldGUgY2FsbGJhY2suDQotICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gRE1BIGhhbmRsZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1zdGF0aWMgdm9pZCBUSU1fRE1BUGVyaW9kRWxhcHNlZENwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpIHsNCi0gIFRJTV9IYW5kbGVUeXBlRGVmICpodGltID0NCi0gICAgICAoVElNX0hhbmRsZVR5cGVEZWYgKikoKERNQV9IYW5kbGVUeXBlRGVmICopaGRtYSktPlBhcmVudDsNCi0NCi0gIGlmIChodGltLT5oZG1hW1RJTV9ETUFfSURfVVBEQVRFXS0+SW5pdC5Nb2RlID09IERNQV9OT1JNQUwpIHsNCi0gICAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOw0KLSAgfQ0KLQ0KLSNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpDQotICBodGltLT5QZXJpb2RFbGFwc2VkQ2FsbGJhY2soaHRpbSk7DQotI2Vsc2UNCi0gIEhBTF9USU1fUGVyaW9kRWxhcHNlZENhbGxiYWNrKGh0aW0pOw0KLSNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi19DQotDQotLyoqDQotICogQGJyaWVmICBUSU0gRE1BIFBlcmlvZCBFbGFwc2UgaGFsZiBjb21wbGV0ZSBjYWxsYmFjay4NCi0gKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBETUEgaGFuZGxlLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXN0YXRpYyB2b2lkIFRJTV9ETUFQZXJpb2RFbGFwc2VkSGFsZkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpIHsNCi0gIFRJTV9IYW5kbGVUeXBlRGVmICpodGltID0NCi0gICAgICAoVElNX0hhbmRsZVR5cGVEZWYgKikoKERNQV9IYW5kbGVUeXBlRGVmICopaGRtYSktPlBhcmVudDsNCi0NCi0jaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQ0KLSAgaHRpbS0+UGVyaW9kRWxhcHNlZEhhbGZDcGx0Q2FsbGJhY2soaHRpbSk7DQotI2Vsc2UNCi0gIEhBTF9USU1fUGVyaW9kRWxhcHNlZEhhbGZDcGx0Q2FsbGJhY2soaHRpbSk7DQotI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFRJTSBETUEgVHJpZ2dlciBjYWxsYmFjay4NCi0gKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBETUEgaGFuZGxlLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXN0YXRpYyB2b2lkIFRJTV9ETUFUcmlnZ2VyQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkgew0KLSAgVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0gPQ0KLSAgICAgIChUSU1fSGFuZGxlVHlwZURlZiAqKSgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50Ow0KLQ0KLSAgaWYgKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9UUklHR0VSXS0+SW5pdC5Nb2RlID09IERNQV9OT1JNQUwpIHsNCi0gICAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOw0KLSAgfQ0KLQ0KLSNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpDQotICBodGltLT5UcmlnZ2VyQ2FsbGJhY2soaHRpbSk7DQotI2Vsc2UNCi0gIEhBTF9USU1fVHJpZ2dlckNhbGxiYWNrKGh0aW0pOw0KLSNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi19DQotDQotLyoqDQotICogQGJyaWVmICBUSU0gRE1BIFRyaWdnZXIgaGFsZiBjb21wbGV0ZSBjYWxsYmFjay4NCi0gKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBETUEgaGFuZGxlLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXN0YXRpYyB2b2lkIFRJTV9ETUFUcmlnZ2VySGFsZkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpIHsNCi0gIFRJTV9IYW5kbGVUeXBlRGVmICpodGltID0NCi0gICAgICAoVElNX0hhbmRsZVR5cGVEZWYgKikoKERNQV9IYW5kbGVUeXBlRGVmICopaGRtYSktPlBhcmVudDsNCi0NCi0jaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQ0KLSAgaHRpbS0+VHJpZ2dlckhhbGZDcGx0Q2FsbGJhY2soaHRpbSk7DQotI2Vsc2UNCi0gIEhBTF9USU1fVHJpZ2dlckhhbGZDcGx0Q2FsbGJhY2soaHRpbSk7DQotI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFRpbWUgQmFzZSBjb25maWd1cmF0aW9uDQotICogQHBhcmFtICBUSU14IFRJTSBwZXJpcGhlcmFsDQotICogQHBhcmFtICBTdHJ1Y3R1cmUgVElNIEJhc2UgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi12b2lkIFRJTV9CYXNlX1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgVElNX0Jhc2VfSW5pdFR5cGVEZWYgKlN0cnVjdHVyZSkgew0KLSAgdWludDMyX3QgdG1wY3IxOw0KLSAgdG1wY3IxID0gVElNeC0+Q1IxOw0KLQ0KLSAgLyogU2V0IFRJTSBUaW1lIEJhc2UgVW5pdCBwYXJhbWV0ZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotICBpZiAoSVNfVElNX0NPVU5URVJfTU9ERV9TRUxFQ1RfSU5TVEFOQ0UoVElNeCkpIHsNCi0gICAgLyogU2VsZWN0IHRoZSBDb3VudGVyIE1vZGUgKi8NCi0gICAgdG1wY3IxICY9IH4oVElNX0NSMV9ESVIgfCBUSU1fQ1IxX0NNUyk7DQotICAgIHRtcGNyMSB8PSBTdHJ1Y3R1cmUtPkNvdW50ZXJNb2RlOw0KLSAgfQ0KLQ0KLSAgaWYgKElTX1RJTV9DTE9DS19ESVZJU0lPTl9JTlNUQU5DRShUSU14KSkgew0KLSAgICAvKiBTZXQgdGhlIGNsb2NrIGRpdmlzaW9uICovDQotICAgIHRtcGNyMSAmPSB+VElNX0NSMV9DS0Q7DQotICAgIHRtcGNyMSB8PSAodWludDMyX3QpU3RydWN0dXJlLT5DbG9ja0RpdmlzaW9uOw0KLSAgfQ0KLQ0KLSAgLyogU2V0IHRoZSBhdXRvLXJlbG9hZCBwcmVsb2FkICovDQotICBNT0RJRllfUkVHKHRtcGNyMSwgVElNX0NSMV9BUlBFLCBTdHJ1Y3R1cmUtPkF1dG9SZWxvYWRQcmVsb2FkKTsNCi0NCi0gIFRJTXgtPkNSMSA9IHRtcGNyMTsNCi0NCi0gIC8qIFNldCB0aGUgQXV0b3JlbG9hZCB2YWx1ZSAqLw0KLSAgVElNeC0+QVJSID0gKHVpbnQzMl90KVN0cnVjdHVyZS0+UGVyaW9kOw0KLQ0KLSAgLyogU2V0IHRoZSBQcmVzY2FsZXIgdmFsdWUgKi8NCi0gIFRJTXgtPlBTQyA9IFN0cnVjdHVyZS0+UHJlc2NhbGVyOw0KLQ0KLSAgaWYgKElTX1RJTV9SRVBFVElUSU9OX0NPVU5URVJfSU5TVEFOQ0UoVElNeCkpIHsNCi0gICAgLyogU2V0IHRoZSBSZXBldGl0aW9uIENvdW50ZXIgdmFsdWUgKi8NCi0gICAgVElNeC0+UkNSID0gU3RydWN0dXJlLT5SZXBldGl0aW9uQ291bnRlcjsNCi0gIH0NCi0NCi0gIC8qIEdlbmVyYXRlIGFuIHVwZGF0ZSBldmVudCB0byByZWxvYWQgdGhlIFByZXNjYWxlcg0KLSAgICAgYW5kIHRoZSByZXBldGl0aW9uIGNvdW50ZXIgKG9ubHkgZm9yIGFkdmFuY2VkIHRpbWVyKSB2YWx1ZSBpbW1lZGlhdGVseSAqLw0KLSAgVElNeC0+RUdSID0gVElNX0VHUl9VRzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBUaW1lciBPdXRwdXQgQ29tcGFyZSAxIGNvbmZpZ3VyYXRpb24NCi0gKiBAcGFyYW0gIFRJTXggdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbA0KLSAqIEBwYXJhbSAgT0NfQ29uZmlnIFRoZSBvdXRwdXQgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1zdGF0aWMgdm9pZCBUSU1fT0MxX1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fT0NfSW5pdFR5cGVEZWYgKk9DX0NvbmZpZykgew0KLSAgdWludDMyX3QgdG1wY2Ntcng7DQotICB1aW50MzJfdCB0bXBjY2VyOw0KLSAgdWludDMyX3QgdG1wY3IyOw0KLQ0KLSAgLyogRGlzYWJsZSB0aGUgQ2hhbm5lbCAxOiBSZXNldCB0aGUgQ0MxRSBCaXQgKi8NCi0gIFRJTXgtPkNDRVIgJj0gflRJTV9DQ0VSX0NDMUU7DQotDQotICAvKiBHZXQgdGhlIFRJTXggQ0NFUiByZWdpc3RlciB2YWx1ZSAqLw0KLSAgdG1wY2NlciA9IFRJTXgtPkNDRVI7DQotICAvKiBHZXQgdGhlIFRJTXggQ1IyIHJlZ2lzdGVyIHZhbHVlICovDQotICB0bXBjcjIgPSBUSU14LT5DUjI7DQotDQotICAvKiBHZXQgdGhlIFRJTXggQ0NNUjEgcmVnaXN0ZXIgdmFsdWUgKi8NCi0gIHRtcGNjbXJ4ID0gVElNeC0+Q0NNUjE7DQotDQotICAvKiBSZXNldCB0aGUgT3V0cHV0IENvbXBhcmUgTW9kZSBCaXRzICovDQotICB0bXBjY21yeCAmPSB+VElNX0NDTVIxX09DMU07DQotICB0bXBjY21yeCAmPSB+VElNX0NDTVIxX0NDMVM7DQotICAvKiBTZWxlY3QgdGhlIE91dHB1dCBDb21wYXJlIE1vZGUgKi8NCi0gIHRtcGNjbXJ4IHw9IE9DX0NvbmZpZy0+T0NNb2RlOw0KLQ0KLSAgLyogUmVzZXQgdGhlIE91dHB1dCBQb2xhcml0eSBsZXZlbCAqLw0KLSAgdG1wY2NlciAmPSB+VElNX0NDRVJfQ0MxUDsNCi0gIC8qIFNldCB0aGUgT3V0cHV0IENvbXBhcmUgUG9sYXJpdHkgKi8NCi0gIHRtcGNjZXIgfD0gT0NfQ29uZmlnLT5PQ1BvbGFyaXR5Ow0KLQ0KLSAgaWYgKElTX1RJTV9DQ1hOX0lOU1RBTkNFKFRJTXgsIFRJTV9DSEFOTkVMXzEpKSB7DQotICAgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8NCi0gICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PQ05fUE9MQVJJVFkoT0NfQ29uZmlnLT5PQ05Qb2xhcml0eSkpOw0KLQ0KLSAgICAvKiBSZXNldCB0aGUgT3V0cHV0IE4gUG9sYXJpdHkgbGV2ZWwgKi8NCi0gICAgdG1wY2NlciAmPSB+VElNX0NDRVJfQ0MxTlA7DQotICAgIC8qIFNldCB0aGUgT3V0cHV0IE4gUG9sYXJpdHkgKi8NCi0gICAgdG1wY2NlciB8PSBPQ19Db25maWctPk9DTlBvbGFyaXR5Ow0KLSAgICAvKiBSZXNldCB0aGUgT3V0cHV0IE4gU3RhdGUgKi8NCi0gICAgdG1wY2NlciAmPSB+VElNX0NDRVJfQ0MxTkU7DQotICB9DQotDQotICBpZiAoSVNfVElNX0JSRUFLX0lOU1RBTkNFKFRJTXgpKSB7DQotICAgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8NCi0gICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PQ05JRExFX1NUQVRFKE9DX0NvbmZpZy0+T0NOSWRsZVN0YXRlKSk7DQotICAgIGFzc2VydF9wYXJhbShJU19USU1fT0NJRExFX1NUQVRFKE9DX0NvbmZpZy0+T0NJZGxlU3RhdGUpKTsNCi0NCi0gICAgLyogUmVzZXQgdGhlIE91dHB1dCBDb21wYXJlIGFuZCBPdXRwdXQgQ29tcGFyZSBOIElETEUgU3RhdGUgKi8NCi0gICAgdG1wY3IyICY9IH5USU1fQ1IyX09JUzE7DQotICAgIHRtcGNyMiAmPSB+VElNX0NSMl9PSVMxTjsNCi0gICAgLyogU2V0IHRoZSBPdXRwdXQgSWRsZSBzdGF0ZSAqLw0KLSAgICB0bXBjcjIgfD0gT0NfQ29uZmlnLT5PQ0lkbGVTdGF0ZTsNCi0gICAgLyogU2V0IHRoZSBPdXRwdXQgTiBJZGxlIHN0YXRlICovDQotICAgIHRtcGNyMiB8PSBPQ19Db25maWctPk9DTklkbGVTdGF0ZTsNCi0gIH0NCi0NCi0gIC8qIFdyaXRlIHRvIFRJTXggQ1IyICovDQotICBUSU14LT5DUjIgPSB0bXBjcjI7DQotDQotICAvKiBXcml0ZSB0byBUSU14IENDTVIxICovDQotICBUSU14LT5DQ01SMSA9IHRtcGNjbXJ4Ow0KLQ0KLSAgLyogU2V0IHRoZSBDYXB0dXJlIENvbXBhcmUgUmVnaXN0ZXIgdmFsdWUgKi8NCi0gIFRJTXgtPkNDUjEgPSBPQ19Db25maWctPlB1bHNlOw0KLQ0KLSAgLyogV3JpdGUgdG8gVElNeCBDQ0VSICovDQotICBUSU14LT5DQ0VSID0gdG1wY2NlcjsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBUaW1lciBPdXRwdXQgQ29tcGFyZSAyIGNvbmZpZ3VyYXRpb24NCi0gKiBAcGFyYW0gIFRJTXggdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbA0KLSAqIEBwYXJhbSAgT0NfQ29uZmlnIFRoZSBvdXRwdXQgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi12b2lkIFRJTV9PQzJfU2V0Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCBUSU1fT0NfSW5pdFR5cGVEZWYgKk9DX0NvbmZpZykgew0KLSAgdWludDMyX3QgdG1wY2Ntcng7DQotICB1aW50MzJfdCB0bXBjY2VyOw0KLSAgdWludDMyX3QgdG1wY3IyOw0KLQ0KLSAgLyogRGlzYWJsZSB0aGUgQ2hhbm5lbCAyOiBSZXNldCB0aGUgQ0MyRSBCaXQgKi8NCi0gIFRJTXgtPkNDRVIgJj0gflRJTV9DQ0VSX0NDMkU7DQotDQotICAvKiBHZXQgdGhlIFRJTXggQ0NFUiByZWdpc3RlciB2YWx1ZSAqLw0KLSAgdG1wY2NlciA9IFRJTXgtPkNDRVI7DQotICAvKiBHZXQgdGhlIFRJTXggQ1IyIHJlZ2lzdGVyIHZhbHVlICovDQotICB0bXBjcjIgPSBUSU14LT5DUjI7DQotDQotICAvKiBHZXQgdGhlIFRJTXggQ0NNUjEgcmVnaXN0ZXIgdmFsdWUgKi8NCi0gIHRtcGNjbXJ4ID0gVElNeC0+Q0NNUjE7DQotDQotICAvKiBSZXNldCB0aGUgT3V0cHV0IENvbXBhcmUgbW9kZSBhbmQgQ2FwdHVyZS9Db21wYXJlIHNlbGVjdGlvbiBCaXRzICovDQotICB0bXBjY21yeCAmPSB+VElNX0NDTVIxX09DMk07DQotICB0bXBjY21yeCAmPSB+VElNX0NDTVIxX0NDMlM7DQotDQotICAvKiBTZWxlY3QgdGhlIE91dHB1dCBDb21wYXJlIE1vZGUgKi8NCi0gIHRtcGNjbXJ4IHw9IChPQ19Db25maWctPk9DTW9kZSA8PCA4VSk7DQotDQotICAvKiBSZXNldCB0aGUgT3V0cHV0IFBvbGFyaXR5IGxldmVsICovDQotICB0bXBjY2VyICY9IH5USU1fQ0NFUl9DQzJQOw0KLSAgLyogU2V0IHRoZSBPdXRwdXQgQ29tcGFyZSBQb2xhcml0eSAqLw0KLSAgdG1wY2NlciB8PSAoT0NfQ29uZmlnLT5PQ1BvbGFyaXR5IDw8IDRVKTsNCi0NCi0gIGlmIChJU19USU1fQ0NYTl9JTlNUQU5DRShUSU14LCBUSU1fQ0hBTk5FTF8yKSkgew0KLSAgICBhc3NlcnRfcGFyYW0oSVNfVElNX09DTl9QT0xBUklUWShPQ19Db25maWctPk9DTlBvbGFyaXR5KSk7DQotDQotICAgIC8qIFJlc2V0IHRoZSBPdXRwdXQgTiBQb2xhcml0eSBsZXZlbCAqLw0KLSAgICB0bXBjY2VyICY9IH5USU1fQ0NFUl9DQzJOUDsNCi0gICAgLyogU2V0IHRoZSBPdXRwdXQgTiBQb2xhcml0eSAqLw0KLSAgICB0bXBjY2VyIHw9IChPQ19Db25maWctPk9DTlBvbGFyaXR5IDw8IDRVKTsNCi0gICAgLyogUmVzZXQgdGhlIE91dHB1dCBOIFN0YXRlICovDQotICAgIHRtcGNjZXIgJj0gflRJTV9DQ0VSX0NDMk5FOw0KLSAgfQ0KLQ0KLSAgaWYgKElTX1RJTV9CUkVBS19JTlNUQU5DRShUSU14KSkgew0KLSAgICAvKiBDaGVjayBwYXJhbWV0ZXJzICovDQotICAgIGFzc2VydF9wYXJhbShJU19USU1fT0NOSURMRV9TVEFURShPQ19Db25maWctPk9DTklkbGVTdGF0ZSkpOw0KLSAgICBhc3NlcnRfcGFyYW0oSVNfVElNX09DSURMRV9TVEFURShPQ19Db25maWctPk9DSWRsZVN0YXRlKSk7DQotDQotICAgIC8qIFJlc2V0IHRoZSBPdXRwdXQgQ29tcGFyZSBhbmQgT3V0cHV0IENvbXBhcmUgTiBJRExFIFN0YXRlICovDQotICAgIHRtcGNyMiAmPSB+VElNX0NSMl9PSVMyOw0KLSAgICB0bXBjcjIgJj0gflRJTV9DUjJfT0lTMk47DQotICAgIC8qIFNldCB0aGUgT3V0cHV0IElkbGUgc3RhdGUgKi8NCi0gICAgdG1wY3IyIHw9IChPQ19Db25maWctPk9DSWRsZVN0YXRlIDw8IDJVKTsNCi0gICAgLyogU2V0IHRoZSBPdXRwdXQgTiBJZGxlIHN0YXRlICovDQotICAgIHRtcGNyMiB8PSAoT0NfQ29uZmlnLT5PQ05JZGxlU3RhdGUgPDwgMlUpOw0KLSAgfQ0KLQ0KLSAgLyogV3JpdGUgdG8gVElNeCBDUjIgKi8NCi0gIFRJTXgtPkNSMiA9IHRtcGNyMjsNCi0NCi0gIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjEgKi8NCi0gIFRJTXgtPkNDTVIxID0gdG1wY2Ntcng7DQotDQotICAvKiBTZXQgdGhlIENhcHR1cmUgQ29tcGFyZSBSZWdpc3RlciB2YWx1ZSAqLw0KLSAgVElNeC0+Q0NSMiA9IE9DX0NvbmZpZy0+UHVsc2U7DQotDQotICAvKiBXcml0ZSB0byBUSU14IENDRVIgKi8NCi0gIFRJTXgtPkNDRVIgPSB0bXBjY2VyOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFRpbWVyIE91dHB1dCBDb21wYXJlIDMgY29uZmlndXJhdGlvbg0KLSAqIEBwYXJhbSAgVElNeCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsDQotICogQHBhcmFtICBPQ19Db25maWcgVGhlIG91dHB1dCBjb25maWd1cmF0aW9uIHN0cnVjdHVyZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXN0YXRpYyB2b2lkIFRJTV9PQzNfU2V0Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9PQ19Jbml0VHlwZURlZiAqT0NfQ29uZmlnKSB7DQotICB1aW50MzJfdCB0bXBjY21yeDsNCi0gIHVpbnQzMl90IHRtcGNjZXI7DQotICB1aW50MzJfdCB0bXBjcjI7DQotDQotICAvKiBEaXNhYmxlIHRoZSBDaGFubmVsIDM6IFJlc2V0IHRoZSBDQzJFIEJpdCAqLw0KLSAgVElNeC0+Q0NFUiAmPSB+VElNX0NDRVJfQ0MzRTsNCi0NCi0gIC8qIEdldCB0aGUgVElNeCBDQ0VSIHJlZ2lzdGVyIHZhbHVlICovDQotICB0bXBjY2VyID0gVElNeC0+Q0NFUjsNCi0gIC8qIEdldCB0aGUgVElNeCBDUjIgcmVnaXN0ZXIgdmFsdWUgKi8NCi0gIHRtcGNyMiA9IFRJTXgtPkNSMjsNCi0NCi0gIC8qIEdldCB0aGUgVElNeCBDQ01SMiByZWdpc3RlciB2YWx1ZSAqLw0KLSAgdG1wY2NtcnggPSBUSU14LT5DQ01SMjsNCi0NCi0gIC8qIFJlc2V0IHRoZSBPdXRwdXQgQ29tcGFyZSBtb2RlIGFuZCBDYXB0dXJlL0NvbXBhcmUgc2VsZWN0aW9uIEJpdHMgKi8NCi0gIHRtcGNjbXJ4ICY9IH5USU1fQ0NNUjJfT0MzTTsNCi0gIHRtcGNjbXJ4ICY9IH5USU1fQ0NNUjJfQ0MzUzsNCi0gIC8qIFNlbGVjdCB0aGUgT3V0cHV0IENvbXBhcmUgTW9kZSAqLw0KLSAgdG1wY2NtcnggfD0gT0NfQ29uZmlnLT5PQ01vZGU7DQotDQotICAvKiBSZXNldCB0aGUgT3V0cHV0IFBvbGFyaXR5IGxldmVsICovDQotICB0bXBjY2VyICY9IH5USU1fQ0NFUl9DQzNQOw0KLSAgLyogU2V0IHRoZSBPdXRwdXQgQ29tcGFyZSBQb2xhcml0eSAqLw0KLSAgdG1wY2NlciB8PSAoT0NfQ29uZmlnLT5PQ1BvbGFyaXR5IDw8IDhVKTsNCi0NCi0gIGlmIChJU19USU1fQ0NYTl9JTlNUQU5DRShUSU14LCBUSU1fQ0hBTk5FTF8zKSkgew0KLSAgICBhc3NlcnRfcGFyYW0oSVNfVElNX09DTl9QT0xBUklUWShPQ19Db25maWctPk9DTlBvbGFyaXR5KSk7DQotDQotICAgIC8qIFJlc2V0IHRoZSBPdXRwdXQgTiBQb2xhcml0eSBsZXZlbCAqLw0KLSAgICB0bXBjY2VyICY9IH5USU1fQ0NFUl9DQzNOUDsNCi0gICAgLyogU2V0IHRoZSBPdXRwdXQgTiBQb2xhcml0eSAqLw0KLSAgICB0bXBjY2VyIHw9IChPQ19Db25maWctPk9DTlBvbGFyaXR5IDw8IDhVKTsNCi0gICAgLyogUmVzZXQgdGhlIE91dHB1dCBOIFN0YXRlICovDQotICAgIHRtcGNjZXIgJj0gflRJTV9DQ0VSX0NDM05FOw0KLSAgfQ0KLQ0KLSAgaWYgKElTX1RJTV9CUkVBS19JTlNUQU5DRShUSU14KSkgew0KLSAgICAvKiBDaGVjayBwYXJhbWV0ZXJzICovDQotICAgIGFzc2VydF9wYXJhbShJU19USU1fT0NOSURMRV9TVEFURShPQ19Db25maWctPk9DTklkbGVTdGF0ZSkpOw0KLSAgICBhc3NlcnRfcGFyYW0oSVNfVElNX09DSURMRV9TVEFURShPQ19Db25maWctPk9DSWRsZVN0YXRlKSk7DQotDQotICAgIC8qIFJlc2V0IHRoZSBPdXRwdXQgQ29tcGFyZSBhbmQgT3V0cHV0IENvbXBhcmUgTiBJRExFIFN0YXRlICovDQotICAgIHRtcGNyMiAmPSB+VElNX0NSMl9PSVMzOw0KLSAgICB0bXBjcjIgJj0gflRJTV9DUjJfT0lTM047DQotICAgIC8qIFNldCB0aGUgT3V0cHV0IElkbGUgc3RhdGUgKi8NCi0gICAgdG1wY3IyIHw9IChPQ19Db25maWctPk9DSWRsZVN0YXRlIDw8IDRVKTsNCi0gICAgLyogU2V0IHRoZSBPdXRwdXQgTiBJZGxlIHN0YXRlICovDQotICAgIHRtcGNyMiB8PSAoT0NfQ29uZmlnLT5PQ05JZGxlU3RhdGUgPDwgNFUpOw0KLSAgfQ0KLQ0KLSAgLyogV3JpdGUgdG8gVElNeCBDUjIgKi8NCi0gIFRJTXgtPkNSMiA9IHRtcGNyMjsNCi0NCi0gIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjIgKi8NCi0gIFRJTXgtPkNDTVIyID0gdG1wY2Ntcng7DQotDQotICAvKiBTZXQgdGhlIENhcHR1cmUgQ29tcGFyZSBSZWdpc3RlciB2YWx1ZSAqLw0KLSAgVElNeC0+Q0NSMyA9IE9DX0NvbmZpZy0+UHVsc2U7DQotDQotICAvKiBXcml0ZSB0byBUSU14IENDRVIgKi8NCi0gIFRJTXgtPkNDRVIgPSB0bXBjY2VyOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFRpbWVyIE91dHB1dCBDb21wYXJlIDQgY29uZmlndXJhdGlvbg0KLSAqIEBwYXJhbSAgVElNeCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsDQotICogQHBhcmFtICBPQ19Db25maWcgVGhlIG91dHB1dCBjb25maWd1cmF0aW9uIHN0cnVjdHVyZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXN0YXRpYyB2b2lkIFRJTV9PQzRfU2V0Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9PQ19Jbml0VHlwZURlZiAqT0NfQ29uZmlnKSB7DQotICB1aW50MzJfdCB0bXBjY21yeDsNCi0gIHVpbnQzMl90IHRtcGNjZXI7DQotICB1aW50MzJfdCB0bXBjcjI7DQotDQotICAvKiBEaXNhYmxlIHRoZSBDaGFubmVsIDQ6IFJlc2V0IHRoZSBDQzRFIEJpdCAqLw0KLSAgVElNeC0+Q0NFUiAmPSB+VElNX0NDRVJfQ0M0RTsNCi0NCi0gIC8qIEdldCB0aGUgVElNeCBDQ0VSIHJlZ2lzdGVyIHZhbHVlICovDQotICB0bXBjY2VyID0gVElNeC0+Q0NFUjsNCi0gIC8qIEdldCB0aGUgVElNeCBDUjIgcmVnaXN0ZXIgdmFsdWUgKi8NCi0gIHRtcGNyMiA9IFRJTXgtPkNSMjsNCi0NCi0gIC8qIEdldCB0aGUgVElNeCBDQ01SMiByZWdpc3RlciB2YWx1ZSAqLw0KLSAgdG1wY2NtcnggPSBUSU14LT5DQ01SMjsNCi0NCi0gIC8qIFJlc2V0IHRoZSBPdXRwdXQgQ29tcGFyZSBtb2RlIGFuZCBDYXB0dXJlL0NvbXBhcmUgc2VsZWN0aW9uIEJpdHMgKi8NCi0gIHRtcGNjbXJ4ICY9IH5USU1fQ0NNUjJfT0M0TTsNCi0gIHRtcGNjbXJ4ICY9IH5USU1fQ0NNUjJfQ0M0UzsNCi0NCi0gIC8qIFNlbGVjdCB0aGUgT3V0cHV0IENvbXBhcmUgTW9kZSAqLw0KLSAgdG1wY2NtcnggfD0gKE9DX0NvbmZpZy0+T0NNb2RlIDw8IDhVKTsNCi0NCi0gIC8qIFJlc2V0IHRoZSBPdXRwdXQgUG9sYXJpdHkgbGV2ZWwgKi8NCi0gIHRtcGNjZXIgJj0gflRJTV9DQ0VSX0NDNFA7DQotICAvKiBTZXQgdGhlIE91dHB1dCBDb21wYXJlIFBvbGFyaXR5ICovDQotICB0bXBjY2VyIHw9IChPQ19Db25maWctPk9DUG9sYXJpdHkgPDwgMTJVKTsNCi0NCi0gIGlmIChJU19USU1fQ0NYTl9JTlNUQU5DRShUSU14LCBUSU1fQ0hBTk5FTF80KSkgew0KLSAgICBhc3NlcnRfcGFyYW0oSVNfVElNX09DTl9QT0xBUklUWShPQ19Db25maWctPk9DTlBvbGFyaXR5KSk7DQotDQotICAgIC8qIFJlc2V0IHRoZSBPdXRwdXQgTiBQb2xhcml0eSBsZXZlbCAqLw0KLSAgICB0bXBjY2VyICY9IH5USU1fQ0NFUl9DQzROUDsNCi0gICAgLyogU2V0IHRoZSBPdXRwdXQgTiBQb2xhcml0eSAqLw0KLSAgICB0bXBjY2VyIHw9IChPQ19Db25maWctPk9DTlBvbGFyaXR5IDw8IDEyVSk7DQotICAgIC8qIFJlc2V0IHRoZSBPdXRwdXQgTiBTdGF0ZSAqLw0KLSAgICB0bXBjY2VyICY9IH5USU1fQ0NFUl9DQzRORTsNCi0gIH0NCi0NCi0gIGlmIChJU19USU1fQlJFQUtfSU5TVEFOQ0UoVElNeCkpIHsNCi0gICAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLw0KLSAgICBhc3NlcnRfcGFyYW0oSVNfVElNX09DTklETEVfU1RBVEUoT0NfQ29uZmlnLT5PQ05JZGxlU3RhdGUpKTsNCi0gICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PQ0lETEVfU1RBVEUoT0NfQ29uZmlnLT5PQ0lkbGVTdGF0ZSkpOw0KLQ0KLSAgICAvKiBSZXNldCB0aGUgT3V0cHV0IENvbXBhcmUgSURMRSBTdGF0ZSAqLw0KLSAgICB0bXBjcjIgJj0gflRJTV9DUjJfT0lTNDsNCi0gICAgLyogUmVzZXQgdGhlIE91dHB1dCBDb21wYXJlIE4gSURMRSBTdGF0ZSAqLw0KLSAgICB0bXBjcjIgJj0gflRJTV9DUjJfT0lTNE47DQotDQotICAgIC8qIFNldCB0aGUgT3V0cHV0IElkbGUgc3RhdGUgKi8NCi0gICAgdG1wY3IyIHw9IChPQ19Db25maWctPk9DSWRsZVN0YXRlIDw8IDZVKTsNCi0gICAgLyogU2V0IHRoZSBPdXRwdXQgTiBJZGxlIHN0YXRlICovDQotICAgIHRtcGNyMiB8PSAoT0NfQ29uZmlnLT5PQ05JZGxlU3RhdGUgPDwgNlUpOw0KLSAgfQ0KLQ0KLSAgLyogV3JpdGUgdG8gVElNeCBDUjIgKi8NCi0gIFRJTXgtPkNSMiA9IHRtcGNyMjsNCi0NCi0gIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjIgKi8NCi0gIFRJTXgtPkNDTVIyID0gdG1wY2Ntcng7DQotDQotICAvKiBTZXQgdGhlIENhcHR1cmUgQ29tcGFyZSBSZWdpc3RlciB2YWx1ZSAqLw0KLSAgVElNeC0+Q0NSNCA9IE9DX0NvbmZpZy0+UHVsc2U7DQotDQotICAvKiBXcml0ZSB0byBUSU14IENDRVIgKi8NCi0gIFRJTXgtPkNDRVIgPSB0bXBjY2VyOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFRpbWVyIE91dHB1dCBDb21wYXJlIDUgY29uZmlndXJhdGlvbg0KLSAqIEBwYXJhbSAgVElNeCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsDQotICogQHBhcmFtICBPQ19Db25maWcgVGhlIG91dHB1dCBjb25maWd1cmF0aW9uIHN0cnVjdHVyZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXN0YXRpYyB2b2lkIFRJTV9PQzVfU2V0Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9PQ19Jbml0VHlwZURlZiAqT0NfQ29uZmlnKSB7DQotICB1aW50MzJfdCB0bXBjY21yeDsNCi0gIHVpbnQzMl90IHRtcGNjZXI7DQotICB1aW50MzJfdCB0bXBjcjI7DQotDQotICAvKiBEaXNhYmxlIHRoZSBvdXRwdXQ6IFJlc2V0IHRoZSBDQ3hFIEJpdCAqLw0KLSAgVElNeC0+Q0NFUiAmPSB+VElNX0NDRVJfQ0M1RTsNCi0NCi0gIC8qIEdldCB0aGUgVElNeCBDQ0VSIHJlZ2lzdGVyIHZhbHVlICovDQotICB0bXBjY2VyID0gVElNeC0+Q0NFUjsNCi0gIC8qIEdldCB0aGUgVElNeCBDUjIgcmVnaXN0ZXIgdmFsdWUgKi8NCi0gIHRtcGNyMiA9IFRJTXgtPkNSMjsNCi0gIC8qIEdldCB0aGUgVElNeCBDQ01SMSByZWdpc3RlciB2YWx1ZSAqLw0KLSAgdG1wY2NtcnggPSBUSU14LT5DQ01SMzsNCi0NCi0gIC8qIFJlc2V0IHRoZSBPdXRwdXQgQ29tcGFyZSBNb2RlIEJpdHMgKi8NCi0gIHRtcGNjbXJ4ICY9IH4oVElNX0NDTVIzX09DNU0pOw0KLSAgLyogU2VsZWN0IHRoZSBPdXRwdXQgQ29tcGFyZSBNb2RlICovDQotICB0bXBjY21yeCB8PSBPQ19Db25maWctPk9DTW9kZTsNCi0NCi0gIC8qIFJlc2V0IHRoZSBPdXRwdXQgUG9sYXJpdHkgbGV2ZWwgKi8NCi0gIHRtcGNjZXIgJj0gflRJTV9DQ0VSX0NDNVA7DQotICAvKiBTZXQgdGhlIE91dHB1dCBDb21wYXJlIFBvbGFyaXR5ICovDQotICB0bXBjY2VyIHw9IChPQ19Db25maWctPk9DUG9sYXJpdHkgPDwgMTZVKTsNCi0NCi0gIGlmIChJU19USU1fQlJFQUtfSU5TVEFOQ0UoVElNeCkpIHsNCi0gICAgLyogUmVzZXQgdGhlIE91dHB1dCBDb21wYXJlIElETEUgU3RhdGUgKi8NCi0gICAgdG1wY3IyICY9IH5USU1fQ1IyX09JUzU7DQotICAgIC8qIFNldCB0aGUgT3V0cHV0IElkbGUgc3RhdGUgKi8NCi0gICAgdG1wY3IyIHw9IChPQ19Db25maWctPk9DSWRsZVN0YXRlIDw8IDhVKTsNCi0gIH0NCi0gIC8qIFdyaXRlIHRvIFRJTXggQ1IyICovDQotICBUSU14LT5DUjIgPSB0bXBjcjI7DQotDQotICAvKiBXcml0ZSB0byBUSU14IENDTVIzICovDQotICBUSU14LT5DQ01SMyA9IHRtcGNjbXJ4Ow0KLQ0KLSAgLyogU2V0IHRoZSBDYXB0dXJlIENvbXBhcmUgUmVnaXN0ZXIgdmFsdWUgKi8NCi0gIFRJTXgtPkNDUjUgPSBPQ19Db25maWctPlB1bHNlOw0KLQ0KLSAgLyogV3JpdGUgdG8gVElNeCBDQ0VSICovDQotICBUSU14LT5DQ0VSID0gdG1wY2NlcjsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBUaW1lciBPdXRwdXQgQ29tcGFyZSA2IGNvbmZpZ3VyYXRpb24NCi0gKiBAcGFyYW0gIFRJTXggdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbA0KLSAqIEBwYXJhbSAgT0NfQ29uZmlnIFRoZSBvdXRwdXQgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1zdGF0aWMgdm9pZCBUSU1fT0M2X1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fT0NfSW5pdFR5cGVEZWYgKk9DX0NvbmZpZykgew0KLSAgdWludDMyX3QgdG1wY2Ntcng7DQotICB1aW50MzJfdCB0bXBjY2VyOw0KLSAgdWludDMyX3QgdG1wY3IyOw0KLQ0KLSAgLyogRGlzYWJsZSB0aGUgb3V0cHV0OiBSZXNldCB0aGUgQ0N4RSBCaXQgKi8NCi0gIFRJTXgtPkNDRVIgJj0gflRJTV9DQ0VSX0NDNkU7DQotDQotICAvKiBHZXQgdGhlIFRJTXggQ0NFUiByZWdpc3RlciB2YWx1ZSAqLw0KLSAgdG1wY2NlciA9IFRJTXgtPkNDRVI7DQotICAvKiBHZXQgdGhlIFRJTXggQ1IyIHJlZ2lzdGVyIHZhbHVlICovDQotICB0bXBjcjIgPSBUSU14LT5DUjI7DQotICAvKiBHZXQgdGhlIFRJTXggQ0NNUjEgcmVnaXN0ZXIgdmFsdWUgKi8NCi0gIHRtcGNjbXJ4ID0gVElNeC0+Q0NNUjM7DQotDQotICAvKiBSZXNldCB0aGUgT3V0cHV0IENvbXBhcmUgTW9kZSBCaXRzICovDQotICB0bXBjY21yeCAmPSB+KFRJTV9DQ01SM19PQzZNKTsNCi0gIC8qIFNlbGVjdCB0aGUgT3V0cHV0IENvbXBhcmUgTW9kZSAqLw0KLSAgdG1wY2NtcnggfD0gKE9DX0NvbmZpZy0+T0NNb2RlIDw8IDhVKTsNCi0NCi0gIC8qIFJlc2V0IHRoZSBPdXRwdXQgUG9sYXJpdHkgbGV2ZWwgKi8NCi0gIHRtcGNjZXIgJj0gKHVpbnQzMl90KX5USU1fQ0NFUl9DQzZQOw0KLSAgLyogU2V0IHRoZSBPdXRwdXQgQ29tcGFyZSBQb2xhcml0eSAqLw0KLSAgdG1wY2NlciB8PSAoT0NfQ29uZmlnLT5PQ1BvbGFyaXR5IDw8IDIwVSk7DQotDQotICBpZiAoSVNfVElNX0JSRUFLX0lOU1RBTkNFKFRJTXgpKSB7DQotICAgIC8qIFJlc2V0IHRoZSBPdXRwdXQgQ29tcGFyZSBJRExFIFN0YXRlICovDQotICAgIHRtcGNyMiAmPSB+VElNX0NSMl9PSVM2Ow0KLSAgICAvKiBTZXQgdGhlIE91dHB1dCBJZGxlIHN0YXRlICovDQotICAgIHRtcGNyMiB8PSAoT0NfQ29uZmlnLT5PQ0lkbGVTdGF0ZSA8PCAxMFUpOw0KLSAgfQ0KLQ0KLSAgLyogV3JpdGUgdG8gVElNeCBDUjIgKi8NCi0gIFRJTXgtPkNSMiA9IHRtcGNyMjsNCi0NCi0gIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjMgKi8NCi0gIFRJTXgtPkNDTVIzID0gdG1wY2Ntcng7DQotDQotICAvKiBTZXQgdGhlIENhcHR1cmUgQ29tcGFyZSBSZWdpc3RlciB2YWx1ZSAqLw0KLSAgVElNeC0+Q0NSNiA9IE9DX0NvbmZpZy0+UHVsc2U7DQotDQotICAvKiBXcml0ZSB0byBUSU14IENDRVIgKi8NCi0gIFRJTXgtPkNDRVIgPSB0bXBjY2VyOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNsYXZlIFRpbWVyIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb24NCi0gKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQ0KLSAqIEBwYXJhbSAgc1NsYXZlQ29uZmlnIFNsYXZlIHRpbWVyIGNvbmZpZ3VyYXRpb24NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1zdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgVElNX1NsYXZlVGltZXJfU2V0Q29uZmlnKA0KLSAgICBUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgVElNX1NsYXZlQ29uZmlnVHlwZURlZiAqc1NsYXZlQ29uZmlnKSB7DQotICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7DQotICB1aW50MzJfdCB0bXBzbWNyOw0KLSAgdWludDMyX3QgdG1wY2NtcjE7DQotICB1aW50MzJfdCB0bXBjY2VyOw0KLQ0KLSAgLyogR2V0IHRoZSBUSU14IFNNQ1IgcmVnaXN0ZXIgdmFsdWUgKi8NCi0gIHRtcHNtY3IgPSBodGltLT5JbnN0YW5jZS0+U01DUjsNCi0NCi0gIC8qIFJlc2V0IHRoZSBUcmlnZ2VyIFNlbGVjdGlvbiBCaXRzICovDQotICB0bXBzbWNyICY9IH5USU1fU01DUl9UUzsNCi0gIC8qIFNldCB0aGUgSW5wdXQgVHJpZ2dlciBzb3VyY2UgKi8NCi0gIHRtcHNtY3IgfD0gc1NsYXZlQ29uZmlnLT5JbnB1dFRyaWdnZXI7DQotDQotICAvKiBSZXNldCB0aGUgc2xhdmUgbW9kZSBCaXRzICovDQotICB0bXBzbWNyICY9IH5USU1fU01DUl9TTVM7DQotICAvKiBTZXQgdGhlIHNsYXZlIG1vZGUgKi8NCi0gIHRtcHNtY3IgfD0gc1NsYXZlQ29uZmlnLT5TbGF2ZU1vZGU7DQotDQotICAvKiBXcml0ZSB0byBUSU14IFNNQ1IgKi8NCi0gIGh0aW0tPkluc3RhbmNlLT5TTUNSID0gdG1wc21jcjsNCi0NCi0gIC8qIENvbmZpZ3VyZSB0aGUgdHJpZ2dlciBwcmVzY2FsZXIsIGZpbHRlciwgYW5kIHBvbGFyaXR5ICovDQotICBzd2l0Y2ggKHNTbGF2ZUNvbmZpZy0+SW5wdXRUcmlnZ2VyKSB7DQotICAgIGNhc2UgVElNX1RTX0VUUkY6IHsNCi0gICAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTFfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsNCi0gICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX1RSSUdHRVJQUkVTQ0FMRVIoc1NsYXZlQ29uZmlnLT5UcmlnZ2VyUHJlc2NhbGVyKSk7DQotICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9UUklHR0VSUE9MQVJJVFkoc1NsYXZlQ29uZmlnLT5UcmlnZ2VyUG9sYXJpdHkpKTsNCi0gICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX1RSSUdHRVJGSUxURVIoc1NsYXZlQ29uZmlnLT5UcmlnZ2VyRmlsdGVyKSk7DQotICAgICAgLyogQ29uZmlndXJlIHRoZSBFVFIgVHJpZ2dlciBzb3VyY2UgKi8NCi0gICAgICBUSU1fRVRSX1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgc1NsYXZlQ29uZmlnLT5UcmlnZ2VyUHJlc2NhbGVyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNTbGF2ZUNvbmZpZy0+VHJpZ2dlclBvbGFyaXR5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNTbGF2ZUNvbmZpZy0+VHJpZ2dlckZpbHRlcik7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0NCi0gICAgY2FzZSBUSU1fVFNfVEkxRl9FRDogew0KLSAgICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzFfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsNCi0gICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX1RSSUdHRVJGSUxURVIoc1NsYXZlQ29uZmlnLT5UcmlnZ2VyRmlsdGVyKSk7DQotDQotICAgICAgaWYgKChzU2xhdmVDb25maWctPlNsYXZlTW9kZSA9PSBUSU1fU0xBVkVNT0RFX0dBVEVEKSB8fA0KLSAgICAgICAgICAoc1NsYXZlQ29uZmlnLT5TbGF2ZU1vZGUgPT0gVElNX1NMQVZFTU9ERV9DT01CSU5FRF9HQVRFRFJFU0VUKSkgew0KLSAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gICAgICB9DQotDQotICAgICAgLyogRGlzYWJsZSB0aGUgQ2hhbm5lbCAxOiBSZXNldCB0aGUgQ0MxRSBCaXQgKi8NCi0gICAgICB0bXBjY2VyID0gaHRpbS0+SW5zdGFuY2UtPkNDRVI7DQotICAgICAgaHRpbS0+SW5zdGFuY2UtPkNDRVIgJj0gflRJTV9DQ0VSX0NDMUU7DQotICAgICAgdG1wY2NtcjEgPSBodGltLT5JbnN0YW5jZS0+Q0NNUjE7DQotDQotICAgICAgLyogU2V0IHRoZSBmaWx0ZXIgKi8NCi0gICAgICB0bXBjY21yMSAmPSB+VElNX0NDTVIxX0lDMUY7DQotICAgICAgdG1wY2NtcjEgfD0gKChzU2xhdmVDb25maWctPlRyaWdnZXJGaWx0ZXIpIDw8IDRVKTsNCi0NCi0gICAgICAvKiBXcml0ZSB0byBUSU14IENDTVIxIGFuZCBDQ0VSIHJlZ2lzdGVycyAqLw0KLSAgICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMSA9IHRtcGNjbXIxOw0KLSAgICAgIGh0aW0tPkluc3RhbmNlLT5DQ0VSID0gdG1wY2NlcjsNCi0gICAgICBicmVhazsNCi0gICAgfQ0KLQ0KLSAgICBjYXNlIFRJTV9UU19USTFGUDE6IHsNCi0gICAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0MxX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7DQotICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9UUklHR0VSUE9MQVJJVFkoc1NsYXZlQ29uZmlnLT5UcmlnZ2VyUG9sYXJpdHkpKTsNCi0gICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX1RSSUdHRVJGSUxURVIoc1NsYXZlQ29uZmlnLT5UcmlnZ2VyRmlsdGVyKSk7DQotDQotICAgICAgLyogQ29uZmlndXJlIFRJMSBGaWx0ZXIgYW5kIFBvbGFyaXR5ICovDQotICAgICAgVElNX1RJMV9Db25maWdJbnB1dFN0YWdlKGh0aW0tPkluc3RhbmNlLCBzU2xhdmVDb25maWctPlRyaWdnZXJQb2xhcml0eSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1NsYXZlQ29uZmlnLT5UcmlnZ2VyRmlsdGVyKTsNCi0gICAgICBicmVhazsNCi0gICAgfQ0KLQ0KLSAgICBjYXNlIFRJTV9UU19USTJGUDI6IHsNCi0gICAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0MyX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7DQotICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9UUklHR0VSUE9MQVJJVFkoc1NsYXZlQ29uZmlnLT5UcmlnZ2VyUG9sYXJpdHkpKTsNCi0gICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX1RSSUdHRVJGSUxURVIoc1NsYXZlQ29uZmlnLT5UcmlnZ2VyRmlsdGVyKSk7DQotDQotICAgICAgLyogQ29uZmlndXJlIFRJMiBGaWx0ZXIgYW5kIFBvbGFyaXR5ICovDQotICAgICAgVElNX1RJMl9Db25maWdJbnB1dFN0YWdlKGh0aW0tPkluc3RhbmNlLCBzU2xhdmVDb25maWctPlRyaWdnZXJQb2xhcml0eSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1NsYXZlQ29uZmlnLT5UcmlnZ2VyRmlsdGVyKTsNCi0gICAgICBicmVhazsNCi0gICAgfQ0KLQ0KLSAgICBjYXNlIFRJTV9UU19JVFIwOg0KLSAgICBjYXNlIFRJTV9UU19JVFIxOg0KLSAgICBjYXNlIFRJTV9UU19JVFIyOg0KLSAgICBjYXNlIFRJTV9UU19JVFIzOg0KLSNpZiBkZWZpbmVkKFRJTTUpDQotICAgIGNhc2UgVElNX1RTX0lUUjQ6DQotI2VuZGlmIC8qIFRJTTUgKi8NCi0gICAgY2FzZSBUSU1fVFNfSVRSNToNCi0gICAgY2FzZSBUSU1fVFNfSVRSNjoNCi0gICAgY2FzZSBUSU1fVFNfSVRSNzoNCi0gICAgY2FzZSBUSU1fVFNfSVRSODoNCi0jaWYgZGVmaW5lZChUSU0yMCkNCi0gICAgY2FzZSBUSU1fVFNfSVRSOToNCi0jZW5kaWYgLyogVElNMjAgKi8NCi0jaWYgZGVmaW5lZChIUlRJTTEpDQotICAgIGNhc2UgVElNX1RTX0lUUjEwOg0KLSNlbmRpZiAvKiBIUlRJTTEgKi8NCi0gICAgY2FzZSBUSU1fVFNfSVRSMTE6IHsNCi0gICAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVyICovDQotICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JTlRFUk5BTF9UUklHR0VSRVZFTlRfSU5TVEFOQ0UoDQotICAgICAgICAgIChodGltLT5JbnN0YW5jZSksIHNTbGF2ZUNvbmZpZy0+SW5wdXRUcmlnZ2VyKSk7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0NCi0gICAgZGVmYXVsdDoNCi0gICAgICBzdGF0dXMgPSBIQUxfRVJST1I7DQotICAgICAgYnJlYWs7DQotICB9DQotDQotICByZXR1cm4gc3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgVEkxIGFzIElucHV0Lg0KLSAqIEBwYXJhbSAgVElNeCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KLSAqIEBwYXJhbSAgVElNX0lDUG9sYXJpdHkgVGhlIElucHV0IFBvbGFyaXR5Lg0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIFRJTV9JQ1BPTEFSSVRZX1JJU0lORw0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fSUNQT0xBUklUWV9GQUxMSU5HDQotICogICAgICAgICAgICBAYXJnIFRJTV9JQ1BPTEFSSVRZX0JPVEhFREdFDQotICogQHBhcmFtICBUSU1fSUNTZWxlY3Rpb24gc3BlY2lmaWVzIHRoZSBpbnB1dCB0byBiZSB1c2VkLg0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIFRJTV9JQ1NFTEVDVElPTl9ESVJFQ1RUSTogVElNIElucHV0IDEgaXMgc2VsZWN0ZWQgdG8gYmUNCi0gKiBjb25uZWN0ZWQgdG8gSUMxLg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fSUNTRUxFQ1RJT05fSU5ESVJFQ1RUSTogVElNIElucHV0IDEgaXMgc2VsZWN0ZWQgdG8gYmUNCi0gKiBjb25uZWN0ZWQgdG8gSUMyLg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fSUNTRUxFQ1RJT05fVFJDOiBUSU0gSW5wdXQgMSBpcyBzZWxlY3RlZCB0byBiZSBjb25uZWN0ZWQNCi0gKiB0byBUUkMuDQotICogQHBhcmFtICBUSU1fSUNGaWx0ZXIgU3BlY2lmaWVzIHRoZSBJbnB1dCBDYXB0dXJlIEZpbHRlci4NCi0gKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwIGFuZCAweDBGLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqIEBub3RlIFRJTV9JQ0ZpbHRlciBhbmQgVElNX0lDUG9sYXJpdHkgYXJlIG5vdCB1c2VkIGluIElORElSRUNUIG1vZGUgYXMgVEkyRlAxDQotICogICAgICAgKG9uIGNoYW5uZWwyIHBhdGgpIGlzIHVzZWQgYXMgdGhlIGlucHV0IHNpZ25hbC4gVGhlcmVmb3JlIENDTVIxIG11c3QgYmUNCi0gKiAgICAgICAgcHJvdGVjdGVkIGFnYWluc3QgdW4taW5pdGlhbGl6ZWQgZmlsdGVyIGFuZCBwb2xhcml0eSB2YWx1ZXMuDQotICovDQotdm9pZCBUSU1fVEkxX1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgVElNX0lDUG9sYXJpdHksDQotICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUSU1fSUNTZWxlY3Rpb24sIHVpbnQzMl90IFRJTV9JQ0ZpbHRlcikgew0KLSAgdWludDMyX3QgdG1wY2NtcjE7DQotICB1aW50MzJfdCB0bXBjY2VyOw0KLQ0KLSAgLyogRGlzYWJsZSB0aGUgQ2hhbm5lbCAxOiBSZXNldCB0aGUgQ0MxRSBCaXQgKi8NCi0gIFRJTXgtPkNDRVIgJj0gflRJTV9DQ0VSX0NDMUU7DQotICB0bXBjY21yMSA9IFRJTXgtPkNDTVIxOw0KLSAgdG1wY2NlciA9IFRJTXgtPkNDRVI7DQotDQotICAvKiBTZWxlY3QgdGhlIElucHV0ICovDQotICBpZiAoSVNfVElNX0NDMl9JTlNUQU5DRShUSU14KSAhPSBSRVNFVCkgew0KLSAgICB0bXBjY21yMSAmPSB+VElNX0NDTVIxX0NDMVM7DQotICAgIHRtcGNjbXIxIHw9IFRJTV9JQ1NlbGVjdGlvbjsNCi0gIH0gZWxzZSB7DQotICAgIHRtcGNjbXIxIHw9IFRJTV9DQ01SMV9DQzFTXzA7DQotICB9DQotDQotICAvKiBTZXQgdGhlIGZpbHRlciAqLw0KLSAgdG1wY2NtcjEgJj0gflRJTV9DQ01SMV9JQzFGOw0KLSAgdG1wY2NtcjEgfD0gKChUSU1fSUNGaWx0ZXIgPDwgNFUpICYgVElNX0NDTVIxX0lDMUYpOw0KLQ0KLSAgLyogU2VsZWN0IHRoZSBQb2xhcml0eSBhbmQgc2V0IHRoZSBDQzFFIEJpdCAqLw0KLSAgdG1wY2NlciAmPSB+KFRJTV9DQ0VSX0NDMVAgfCBUSU1fQ0NFUl9DQzFOUCk7DQotICB0bXBjY2VyIHw9IChUSU1fSUNQb2xhcml0eSAmIChUSU1fQ0NFUl9DQzFQIHwgVElNX0NDRVJfQ0MxTlApKTsNCi0NCi0gIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjEgYW5kIENDRVIgcmVnaXN0ZXJzICovDQotICBUSU14LT5DQ01SMSA9IHRtcGNjbXIxOw0KLSAgVElNeC0+Q0NFUiA9IHRtcGNjZXI7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBQb2xhcml0eSBhbmQgRmlsdGVyIGZvciBUSTEuDQotICogQHBhcmFtICBUSU14IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQotICogQHBhcmFtICBUSU1fSUNQb2xhcml0eSBUaGUgSW5wdXQgUG9sYXJpdHkuDQotICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0lDUE9MQVJJVFlfUklTSU5HDQotICogICAgICAgICAgICBAYXJnIFRJTV9JQ1BPTEFSSVRZX0ZBTExJTkcNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0lDUE9MQVJJVFlfQk9USEVER0UNCi0gKiBAcGFyYW0gIFRJTV9JQ0ZpbHRlciBTcGVjaWZpZXMgdGhlIElucHV0IENhcHR1cmUgRmlsdGVyLg0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDB4MDAgYW5kIDB4MEYuDQotICogQHJldHZhbCBOb25lDQotICovDQotc3RhdGljIHZvaWQgVElNX1RJMV9Db25maWdJbnB1dFN0YWdlKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBUSU1fSUNQb2xhcml0eSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVElNX0lDRmlsdGVyKSB7DQotICB1aW50MzJfdCB0bXBjY21yMTsNCi0gIHVpbnQzMl90IHRtcGNjZXI7DQotDQotICAvKiBEaXNhYmxlIHRoZSBDaGFubmVsIDE6IFJlc2V0IHRoZSBDQzFFIEJpdCAqLw0KLSAgdG1wY2NlciA9IFRJTXgtPkNDRVI7DQotICBUSU14LT5DQ0VSICY9IH5USU1fQ0NFUl9DQzFFOw0KLSAgdG1wY2NtcjEgPSBUSU14LT5DQ01SMTsNCi0NCi0gIC8qIFNldCB0aGUgZmlsdGVyICovDQotICB0bXBjY21yMSAmPSB+VElNX0NDTVIxX0lDMUY7DQotICB0bXBjY21yMSB8PSAoVElNX0lDRmlsdGVyIDw8IDRVKTsNCi0NCi0gIC8qIFNlbGVjdCB0aGUgUG9sYXJpdHkgYW5kIHNldCB0aGUgQ0MxRSBCaXQgKi8NCi0gIHRtcGNjZXIgJj0gfihUSU1fQ0NFUl9DQzFQIHwgVElNX0NDRVJfQ0MxTlApOw0KLSAgdG1wY2NlciB8PSBUSU1fSUNQb2xhcml0eTsNCi0NCi0gIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjEgYW5kIENDRVIgcmVnaXN0ZXJzICovDQotICBUSU14LT5DQ01SMSA9IHRtcGNjbXIxOw0KLSAgVElNeC0+Q0NFUiA9IHRtcGNjZXI7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBUSTIgYXMgSW5wdXQuDQotICogQHBhcmFtICBUSU14IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwNCi0gKiBAcGFyYW0gIFRJTV9JQ1BvbGFyaXR5IFRoZSBJbnB1dCBQb2xhcml0eS4NCi0gKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fSUNQT0xBUklUWV9SSVNJTkcNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0lDUE9MQVJJVFlfRkFMTElORw0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fSUNQT0xBUklUWV9CT1RIRURHRQ0KLSAqIEBwYXJhbSAgVElNX0lDU2VsZWN0aW9uIHNwZWNpZmllcyB0aGUgaW5wdXQgdG8gYmUgdXNlZC4NCi0gKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fSUNTRUxFQ1RJT05fRElSRUNUVEk6IFRJTSBJbnB1dCAyIGlzIHNlbGVjdGVkIHRvIGJlDQotICogY29ubmVjdGVkIHRvIElDMi4NCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0lDU0VMRUNUSU9OX0lORElSRUNUVEk6IFRJTSBJbnB1dCAyIGlzIHNlbGVjdGVkIHRvIGJlDQotICogY29ubmVjdGVkIHRvIElDMS4NCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0lDU0VMRUNUSU9OX1RSQzogVElNIElucHV0IDIgaXMgc2VsZWN0ZWQgdG8gYmUgY29ubmVjdGVkDQotICogdG8gVFJDLg0KLSAqIEBwYXJhbSAgVElNX0lDRmlsdGVyIFNwZWNpZmllcyB0aGUgSW5wdXQgQ2FwdHVyZSBGaWx0ZXIuDQotICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMHgwMCBhbmQgMHgwRi4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKiBAbm90ZSBUSU1fSUNGaWx0ZXIgYW5kIFRJTV9JQ1BvbGFyaXR5IGFyZSBub3QgdXNlZCBpbiBJTkRJUkVDVCBtb2RlIGFzIFRJMUZQMg0KLSAqICAgICAgIChvbiBjaGFubmVsMSBwYXRoKSBpcyB1c2VkIGFzIHRoZSBpbnB1dCBzaWduYWwuIFRoZXJlZm9yZSBDQ01SMSBtdXN0IGJlDQotICogICAgICAgIHByb3RlY3RlZCBhZ2FpbnN0IHVuLWluaXRpYWxpemVkIGZpbHRlciBhbmQgcG9sYXJpdHkgdmFsdWVzLg0KLSAqLw0KLXN0YXRpYyB2b2lkIFRJTV9USTJfU2V0Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBUSU1fSUNQb2xhcml0eSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUSU1fSUNTZWxlY3Rpb24sIHVpbnQzMl90IFRJTV9JQ0ZpbHRlcikgew0KLSAgdWludDMyX3QgdG1wY2NtcjE7DQotICB1aW50MzJfdCB0bXBjY2VyOw0KLQ0KLSAgLyogRGlzYWJsZSB0aGUgQ2hhbm5lbCAyOiBSZXNldCB0aGUgQ0MyRSBCaXQgKi8NCi0gIFRJTXgtPkNDRVIgJj0gflRJTV9DQ0VSX0NDMkU7DQotICB0bXBjY21yMSA9IFRJTXgtPkNDTVIxOw0KLSAgdG1wY2NlciA9IFRJTXgtPkNDRVI7DQotDQotICAvKiBTZWxlY3QgdGhlIElucHV0ICovDQotICB0bXBjY21yMSAmPSB+VElNX0NDTVIxX0NDMlM7DQotICB0bXBjY21yMSB8PSAoVElNX0lDU2VsZWN0aW9uIDw8IDhVKTsNCi0NCi0gIC8qIFNldCB0aGUgZmlsdGVyICovDQotICB0bXBjY21yMSAmPSB+VElNX0NDTVIxX0lDMkY7DQotICB0bXBjY21yMSB8PSAoKFRJTV9JQ0ZpbHRlciA8PCAxMlUpICYgVElNX0NDTVIxX0lDMkYpOw0KLQ0KLSAgLyogU2VsZWN0IHRoZSBQb2xhcml0eSBhbmQgc2V0IHRoZSBDQzJFIEJpdCAqLw0KLSAgdG1wY2NlciAmPSB+KFRJTV9DQ0VSX0NDMlAgfCBUSU1fQ0NFUl9DQzJOUCk7DQotICB0bXBjY2VyIHw9ICgoVElNX0lDUG9sYXJpdHkgPDwgNFUpICYgKFRJTV9DQ0VSX0NDMlAgfCBUSU1fQ0NFUl9DQzJOUCkpOw0KLQ0KLSAgLyogV3JpdGUgdG8gVElNeCBDQ01SMSBhbmQgQ0NFUiByZWdpc3RlcnMgKi8NCi0gIFRJTXgtPkNDTVIxID0gdG1wY2NtcjE7DQotICBUSU14LT5DQ0VSID0gdG1wY2NlcjsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDb25maWd1cmUgdGhlIFBvbGFyaXR5IGFuZCBGaWx0ZXIgZm9yIFRJMi4NCi0gKiBAcGFyYW0gIFRJTXggdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCi0gKiBAcGFyYW0gIFRJTV9JQ1BvbGFyaXR5IFRoZSBJbnB1dCBQb2xhcml0eS4NCi0gKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fSUNQT0xBUklUWV9SSVNJTkcNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0lDUE9MQVJJVFlfRkFMTElORw0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fSUNQT0xBUklUWV9CT1RIRURHRQ0KLSAqIEBwYXJhbSAgVElNX0lDRmlsdGVyIFNwZWNpZmllcyB0aGUgSW5wdXQgQ2FwdHVyZSBGaWx0ZXIuDQotICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMHgwMCBhbmQgMHgwRi4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1zdGF0aWMgdm9pZCBUSU1fVEkyX0NvbmZpZ0lucHV0U3RhZ2UoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IFRJTV9JQ1BvbGFyaXR5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUSU1fSUNGaWx0ZXIpIHsNCi0gIHVpbnQzMl90IHRtcGNjbXIxOw0KLSAgdWludDMyX3QgdG1wY2NlcjsNCi0NCi0gIC8qIERpc2FibGUgdGhlIENoYW5uZWwgMjogUmVzZXQgdGhlIENDMkUgQml0ICovDQotICBUSU14LT5DQ0VSICY9IH5USU1fQ0NFUl9DQzJFOw0KLSAgdG1wY2NtcjEgPSBUSU14LT5DQ01SMTsNCi0gIHRtcGNjZXIgPSBUSU14LT5DQ0VSOw0KLQ0KLSAgLyogU2V0IHRoZSBmaWx0ZXIgKi8NCi0gIHRtcGNjbXIxICY9IH5USU1fQ0NNUjFfSUMyRjsNCi0gIHRtcGNjbXIxIHw9IChUSU1fSUNGaWx0ZXIgPDwgMTJVKTsNCi0NCi0gIC8qIFNlbGVjdCB0aGUgUG9sYXJpdHkgYW5kIHNldCB0aGUgQ0MyRSBCaXQgKi8NCi0gIHRtcGNjZXIgJj0gfihUSU1fQ0NFUl9DQzJQIHwgVElNX0NDRVJfQ0MyTlApOw0KLSAgdG1wY2NlciB8PSAoVElNX0lDUG9sYXJpdHkgPDwgNFUpOw0KLQ0KLSAgLyogV3JpdGUgdG8gVElNeCBDQ01SMSBhbmQgQ0NFUiByZWdpc3RlcnMgKi8NCi0gIFRJTXgtPkNDTVIxID0gdG1wY2NtcjE7DQotICBUSU14LT5DQ0VSID0gdG1wY2NlcjsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDb25maWd1cmUgdGhlIFRJMyBhcyBJbnB1dC4NCi0gKiBAcGFyYW0gIFRJTXggdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbA0KLSAqIEBwYXJhbSAgVElNX0lDUG9sYXJpdHkgVGhlIElucHV0IFBvbGFyaXR5Lg0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIFRJTV9JQ1BPTEFSSVRZX1JJU0lORw0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fSUNQT0xBUklUWV9GQUxMSU5HDQotICogICAgICAgICAgICBAYXJnIFRJTV9JQ1BPTEFSSVRZX0JPVEhFREdFDQotICogQHBhcmFtICBUSU1fSUNTZWxlY3Rpb24gc3BlY2lmaWVzIHRoZSBpbnB1dCB0byBiZSB1c2VkLg0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIFRJTV9JQ1NFTEVDVElPTl9ESVJFQ1RUSTogVElNIElucHV0IDMgaXMgc2VsZWN0ZWQgdG8gYmUNCi0gKiBjb25uZWN0ZWQgdG8gSUMzLg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fSUNTRUxFQ1RJT05fSU5ESVJFQ1RUSTogVElNIElucHV0IDMgaXMgc2VsZWN0ZWQgdG8gYmUNCi0gKiBjb25uZWN0ZWQgdG8gSUM0Lg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fSUNTRUxFQ1RJT05fVFJDOiBUSU0gSW5wdXQgMyBpcyBzZWxlY3RlZCB0byBiZSBjb25uZWN0ZWQNCi0gKiB0byBUUkMuDQotICogQHBhcmFtICBUSU1fSUNGaWx0ZXIgU3BlY2lmaWVzIHRoZSBJbnB1dCBDYXB0dXJlIEZpbHRlci4NCi0gKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwIGFuZCAweDBGLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqIEBub3RlIFRJTV9JQ0ZpbHRlciBhbmQgVElNX0lDUG9sYXJpdHkgYXJlIG5vdCB1c2VkIGluIElORElSRUNUIG1vZGUgYXMgVEkzRlA0DQotICogICAgICAgKG9uIGNoYW5uZWwxIHBhdGgpIGlzIHVzZWQgYXMgdGhlIGlucHV0IHNpZ25hbC4gVGhlcmVmb3JlIENDTVIyIG11c3QgYmUNCi0gKiAgICAgICAgcHJvdGVjdGVkIGFnYWluc3QgdW4taW5pdGlhbGl6ZWQgZmlsdGVyIGFuZCBwb2xhcml0eSB2YWx1ZXMuDQotICovDQotc3RhdGljIHZvaWQgVElNX1RJM19TZXRDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IFRJTV9JQ1BvbGFyaXR5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRJTV9JQ1NlbGVjdGlvbiwgdWludDMyX3QgVElNX0lDRmlsdGVyKSB7DQotICB1aW50MzJfdCB0bXBjY21yMjsNCi0gIHVpbnQzMl90IHRtcGNjZXI7DQotDQotICAvKiBEaXNhYmxlIHRoZSBDaGFubmVsIDM6IFJlc2V0IHRoZSBDQzNFIEJpdCAqLw0KLSAgVElNeC0+Q0NFUiAmPSB+VElNX0NDRVJfQ0MzRTsNCi0gIHRtcGNjbXIyID0gVElNeC0+Q0NNUjI7DQotICB0bXBjY2VyID0gVElNeC0+Q0NFUjsNCi0NCi0gIC8qIFNlbGVjdCB0aGUgSW5wdXQgKi8NCi0gIHRtcGNjbXIyICY9IH5USU1fQ0NNUjJfQ0MzUzsNCi0gIHRtcGNjbXIyIHw9IFRJTV9JQ1NlbGVjdGlvbjsNCi0NCi0gIC8qIFNldCB0aGUgZmlsdGVyICovDQotICB0bXBjY21yMiAmPSB+VElNX0NDTVIyX0lDM0Y7DQotICB0bXBjY21yMiB8PSAoKFRJTV9JQ0ZpbHRlciA8PCA0VSkgJiBUSU1fQ0NNUjJfSUMzRik7DQotDQotICAvKiBTZWxlY3QgdGhlIFBvbGFyaXR5IGFuZCBzZXQgdGhlIENDM0UgQml0ICovDQotICB0bXBjY2VyICY9IH4oVElNX0NDRVJfQ0MzUCB8IFRJTV9DQ0VSX0NDM05QKTsNCi0gIHRtcGNjZXIgfD0gKChUSU1fSUNQb2xhcml0eSA8PCA4VSkgJiAoVElNX0NDRVJfQ0MzUCB8IFRJTV9DQ0VSX0NDM05QKSk7DQotDQotICAvKiBXcml0ZSB0byBUSU14IENDTVIyIGFuZCBDQ0VSIHJlZ2lzdGVycyAqLw0KLSAgVElNeC0+Q0NNUjIgPSB0bXBjY21yMjsNCi0gIFRJTXgtPkNDRVIgPSB0bXBjY2VyOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgVEk0IGFzIElucHV0Lg0KLSAqIEBwYXJhbSAgVElNeCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsDQotICogQHBhcmFtICBUSU1fSUNQb2xhcml0eSBUaGUgSW5wdXQgUG9sYXJpdHkuDQotICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0lDUE9MQVJJVFlfUklTSU5HDQotICogICAgICAgICAgICBAYXJnIFRJTV9JQ1BPTEFSSVRZX0ZBTExJTkcNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0lDUE9MQVJJVFlfQk9USEVER0UNCi0gKiBAcGFyYW0gIFRJTV9JQ1NlbGVjdGlvbiBzcGVjaWZpZXMgdGhlIGlucHV0IHRvIGJlIHVzZWQuDQotICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0lDU0VMRUNUSU9OX0RJUkVDVFRJOiBUSU0gSW5wdXQgNCBpcyBzZWxlY3RlZCB0byBiZQ0KLSAqIGNvbm5lY3RlZCB0byBJQzQuDQotICogICAgICAgICAgICBAYXJnIFRJTV9JQ1NFTEVDVElPTl9JTkRJUkVDVFRJOiBUSU0gSW5wdXQgNCBpcyBzZWxlY3RlZCB0byBiZQ0KLSAqIGNvbm5lY3RlZCB0byBJQzMuDQotICogICAgICAgICAgICBAYXJnIFRJTV9JQ1NFTEVDVElPTl9UUkM6IFRJTSBJbnB1dCA0IGlzIHNlbGVjdGVkIHRvIGJlIGNvbm5lY3RlZA0KLSAqIHRvIFRSQy4NCi0gKiBAcGFyYW0gIFRJTV9JQ0ZpbHRlciBTcGVjaWZpZXMgdGhlIElucHV0IENhcHR1cmUgRmlsdGVyLg0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDB4MDAgYW5kIDB4MEYuDQotICogQG5vdGUgVElNX0lDRmlsdGVyIGFuZCBUSU1fSUNQb2xhcml0eSBhcmUgbm90IHVzZWQgaW4gSU5ESVJFQ1QgbW9kZSBhcyBUSTRGUDMNCi0gKiAgICAgICAob24gY2hhbm5lbDEgcGF0aCkgaXMgdXNlZCBhcyB0aGUgaW5wdXQgc2lnbmFsLiBUaGVyZWZvcmUgQ0NNUjIgbXVzdCBiZQ0KLSAqICAgICAgICBwcm90ZWN0ZWQgYWdhaW5zdCB1bi1pbml0aWFsaXplZCBmaWx0ZXIgYW5kIHBvbGFyaXR5IHZhbHVlcy4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1zdGF0aWMgdm9pZCBUSU1fVEk0X1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgVElNX0lDUG9sYXJpdHksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVElNX0lDU2VsZWN0aW9uLCB1aW50MzJfdCBUSU1fSUNGaWx0ZXIpIHsNCi0gIHVpbnQzMl90IHRtcGNjbXIyOw0KLSAgdWludDMyX3QgdG1wY2NlcjsNCi0NCi0gIC8qIERpc2FibGUgdGhlIENoYW5uZWwgNDogUmVzZXQgdGhlIENDNEUgQml0ICovDQotICBUSU14LT5DQ0VSICY9IH5USU1fQ0NFUl9DQzRFOw0KLSAgdG1wY2NtcjIgPSBUSU14LT5DQ01SMjsNCi0gIHRtcGNjZXIgPSBUSU14LT5DQ0VSOw0KLQ0KLSAgLyogU2VsZWN0IHRoZSBJbnB1dCAqLw0KLSAgdG1wY2NtcjIgJj0gflRJTV9DQ01SMl9DQzRTOw0KLSAgdG1wY2NtcjIgfD0gKFRJTV9JQ1NlbGVjdGlvbiA8PCA4VSk7DQotDQotICAvKiBTZXQgdGhlIGZpbHRlciAqLw0KLSAgdG1wY2NtcjIgJj0gflRJTV9DQ01SMl9JQzRGOw0KLSAgdG1wY2NtcjIgfD0gKChUSU1fSUNGaWx0ZXIgPDwgMTJVKSAmIFRJTV9DQ01SMl9JQzRGKTsNCi0NCi0gIC8qIFNlbGVjdCB0aGUgUG9sYXJpdHkgYW5kIHNldCB0aGUgQ0M0RSBCaXQgKi8NCi0gIHRtcGNjZXIgJj0gfihUSU1fQ0NFUl9DQzRQIHwgVElNX0NDRVJfQ0M0TlApOw0KLSAgdG1wY2NlciB8PSAoKFRJTV9JQ1BvbGFyaXR5IDw8IDEyVSkgJiAoVElNX0NDRVJfQ0M0UCB8IFRJTV9DQ0VSX0NDNE5QKSk7DQotDQotICAvKiBXcml0ZSB0byBUSU14IENDTVIyIGFuZCBDQ0VSIHJlZ2lzdGVycyAqLw0KLSAgVElNeC0+Q0NNUjIgPSB0bXBjY21yMjsNCi0gIFRJTXgtPkNDRVIgPSB0bXBjY2VyOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNlbGVjdHMgdGhlIElucHV0IFRyaWdnZXIgc291cmNlDQotICogQHBhcmFtICBUSU14IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwNCi0gKiBAcGFyYW0gIElucHV0VHJpZ2dlclNvdXJjZSBUaGUgSW5wdXQgVHJpZ2dlciBzb3VyY2UuDQotICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX1RTX0lUUjA6IEludGVybmFsIFRyaWdnZXIgMA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfSVRSMTogSW50ZXJuYWwgVHJpZ2dlciAxDQotICogICAgICAgICAgICBAYXJnIFRJTV9UU19JVFIyOiBJbnRlcm5hbCBUcmlnZ2VyIDINCi0gKiAgICAgICAgICAgIEBhcmcgVElNX1RTX0lUUjM6IEludGVybmFsIFRyaWdnZXIgMw0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfVEkxRl9FRDogVEkxIEVkZ2UgRGV0ZWN0b3INCi0gKiAgICAgICAgICAgIEBhcmcgVElNX1RTX1RJMUZQMTogRmlsdGVyZWQgVGltZXIgSW5wdXQgMQ0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfVEkyRlAyOiBGaWx0ZXJlZCBUaW1lciBJbnB1dCAyDQotICogICAgICAgICAgICBAYXJnIFRJTV9UU19FVFJGOiBFeHRlcm5hbCBUcmlnZ2VyIGlucHV0DQotICogICAgICAgICAgICBAYXJnIFRJTV9UU19JVFI0OiBJbnRlcm5hbCBUcmlnZ2VyIDQgICgqKQ0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfSVRSNTogSW50ZXJuYWwgVHJpZ2dlciA1DQotICogICAgICAgICAgICBAYXJnIFRJTV9UU19JVFI2OiBJbnRlcm5hbCBUcmlnZ2VyIDYNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX1RTX0lUUjc6IEludGVybmFsIFRyaWdnZXIgNw0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfSVRSODogSW50ZXJuYWwgVHJpZ2dlciA4DQotICogICAgICAgICAgICBAYXJnIFRJTV9UU19JVFI5OiBJbnRlcm5hbCBUcmlnZ2VyIDkgICAoKikNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX1RTX0lUUjEwOiBJbnRlcm5hbCBUcmlnZ2VyIDEwDQotICogICAgICAgICAgICBAYXJnIFRJTV9UU19JVFIxMTogSW50ZXJuYWwgVHJpZ2dlciAxMQ0KLSAqDQotICogICAgICAgKCopICBWYWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4NCi0gKg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXN0YXRpYyB2b2lkIFRJTV9JVFJ4X1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgSW5wdXRUcmlnZ2VyU291cmNlKSB7DQotICB1aW50MzJfdCB0bXBzbWNyOw0KLQ0KLSAgLyogR2V0IHRoZSBUSU14IFNNQ1IgcmVnaXN0ZXIgdmFsdWUgKi8NCi0gIHRtcHNtY3IgPSBUSU14LT5TTUNSOw0KLSAgLyogUmVzZXQgdGhlIFRTIEJpdHMgKi8NCi0gIHRtcHNtY3IgJj0gflRJTV9TTUNSX1RTOw0KLSAgLyogU2V0IHRoZSBJbnB1dCBUcmlnZ2VyIHNvdXJjZSBhbmQgdGhlIHNsYXZlIG1vZGUqLw0KLSAgdG1wc21jciB8PSAoSW5wdXRUcmlnZ2VyU291cmNlIHwgVElNX1NMQVZFTU9ERV9FWFRFUk5BTDEpOw0KLSAgLyogV3JpdGUgdG8gVElNeCBTTUNSICovDQotICBUSU14LT5TTUNSID0gdG1wc21jcjsNCi19DQotLyoqDQotICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBUSU14IEV4dGVybmFsIFRyaWdnZXIgKEVUUikuDQotICogQHBhcmFtICBUSU14IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwNCi0gKiBAcGFyYW0gIFRJTV9FeHRUUkdQcmVzY2FsZXIgVGhlIGV4dGVybmFsIFRyaWdnZXIgUHJlc2NhbGVyLg0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIFRJTV9FVFJQUkVTQ0FMRVJfRElWMTogRVRSUCBQcmVzY2FsZXIgT0ZGLg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRVRSUFJFU0NBTEVSX0RJVjI6IEVUUlAgZnJlcXVlbmN5IGRpdmlkZWQgYnkgMi4NCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0VUUlBSRVNDQUxFUl9ESVY0OiBFVFJQIGZyZXF1ZW5jeSBkaXZpZGVkIGJ5IDQuDQotICogICAgICAgICAgICBAYXJnIFRJTV9FVFJQUkVTQ0FMRVJfRElWODogRVRSUCBmcmVxdWVuY3kgZGl2aWRlZCBieSA4Lg0KLSAqIEBwYXJhbSAgVElNX0V4dFRSR1BvbGFyaXR5IFRoZSBleHRlcm5hbCBUcmlnZ2VyIFBvbGFyaXR5Lg0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIFRJTV9FVFJQT0xBUklUWV9JTlZFUlRFRDogYWN0aXZlIGxvdyBvciBmYWxsaW5nIGVkZ2UgYWN0aXZlLg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fRVRSUE9MQVJJVFlfTk9OSU5WRVJURUQ6IGFjdGl2ZSBoaWdoIG9yIHJpc2luZyBlZGdlDQotICogYWN0aXZlLg0KLSAqIEBwYXJhbSAgRXh0VFJHRmlsdGVyIEV4dGVybmFsIFRyaWdnZXIgRmlsdGVyLg0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDB4MDAgYW5kIDB4MEYNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi12b2lkIFRJTV9FVFJfU2V0Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBUSU1fRXh0VFJHUHJlc2NhbGVyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVElNX0V4dFRSR1BvbGFyaXR5LCB1aW50MzJfdCBFeHRUUkdGaWx0ZXIpIHsNCi0gIHVpbnQzMl90IHRtcHNtY3I7DQotDQotICB0bXBzbWNyID0gVElNeC0+U01DUjsNCi0NCi0gIC8qIFJlc2V0IHRoZSBFVFIgQml0cyAqLw0KLSAgdG1wc21jciAmPSB+KFRJTV9TTUNSX0VURiB8IFRJTV9TTUNSX0VUUFMgfCBUSU1fU01DUl9FQ0UgfCBUSU1fU01DUl9FVFApOw0KLQ0KLSAgLyogU2V0IHRoZSBQcmVzY2FsZXIsIHRoZSBGaWx0ZXIgdmFsdWUgYW5kIHRoZSBQb2xhcml0eSAqLw0KLSAgdG1wc21jciB8PSAodWludDMyX3QpKFRJTV9FeHRUUkdQcmVzY2FsZXIgfA0KLSAgICAgICAgICAgICAgICAgICAgICAgIChUSU1fRXh0VFJHUG9sYXJpdHkgfCAoRXh0VFJHRmlsdGVyIDw8IDhVKSkpOw0KLQ0KLSAgLyogV3JpdGUgdG8gVElNeCBTTUNSICovDQotICBUSU14LT5TTUNSID0gdG1wc21jcjsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBUSU0gQ2FwdHVyZSBDb21wYXJlIENoYW5uZWwgeC4NCi0gKiBAcGFyYW0gIFRJTXggdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbA0KLSAqIEBwYXJhbSAgQ2hhbm5lbCBzcGVjaWZpZXMgdGhlIFRJTSBDaGFubmVsDQotICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMQ0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF81OiBUSU0gQ2hhbm5lbCA1IHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzY6IFRJTSBDaGFubmVsIDYgc2VsZWN0ZWQNCi0gKiBAcGFyYW0gIENoYW5uZWxTdGF0ZSBzcGVjaWZpZXMgdGhlIFRJTSBDaGFubmVsIENDeEUgYml0IG5ldyBzdGF0ZS4NCi0gKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IFRJTV9DQ3hfRU5BQkxFIG9yIFRJTV9DQ3hfRElTQUJMRS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi12b2lkIFRJTV9DQ3hDaGFubmVsQ21kKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDaGFubmVsLA0KLSAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbFN0YXRlKSB7DQotICB1aW50MzJfdCB0bXA7DQotDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzFfSU5TVEFOQ0UoVElNeCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DSEFOTkVMUyhDaGFubmVsKSk7DQotDQotICB0bXAgPSBUSU1fQ0NFUl9DQzFFIDw8IChDaGFubmVsICYgMHgxRlUpOyAvKiAweDFGVSA9IDMxIGJpdHMgbWF4IHNoaWZ0ICovDQotDQotICAvKiBSZXNldCB0aGUgQ0N4RSBCaXQgKi8NCi0gIFRJTXgtPkNDRVIgJj0gfnRtcDsNCi0NCi0gIC8qIFNldCBvciByZXNldCB0aGUgQ0N4RSBCaXQgKi8NCi0gIFRJTXgtPkNDRVIgfD0NCi0gICAgICAodWludDMyX3QpKENoYW5uZWxTdGF0ZQ0KLSAgICAgICAgICAgICAgICAgPDwgKENoYW5uZWwgJiAweDFGVSkpOyAvKiAweDFGVSA9IDMxIGJpdHMgbWF4IHNoaWZ0ICovDQotfQ0KLQ0KLSNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpDQotLyoqDQotICogQGJyaWVmICBSZXNldCBpbnRlcnJ1cHQgY2FsbGJhY2tzIHRvIHRoZSBsZWdhY3kgd2VhayBjYWxsYmFja3MuDQotICogQHBhcmFtICBodGltIHBvaW50ZXIgdG8gYSBUSU1fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KLSAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBUSU0gbW9kdWxlLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXZvaWQgVElNX1Jlc2V0Q2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pIHsNCi0gIC8qIFJlc2V0IHRoZSBUSU0gY2FsbGJhY2sgdG8gdGhlIGxlZ2FjeSB3ZWFrIGNhbGxiYWNrcyAqLw0KLSAgaHRpbS0+UGVyaW9kRWxhcHNlZENhbGxiYWNrID0gSEFMX1RJTV9QZXJpb2RFbGFwc2VkQ2FsbGJhY2s7DQotICBodGltLT5QZXJpb2RFbGFwc2VkSGFsZkNwbHRDYWxsYmFjayA9IEhBTF9USU1fUGVyaW9kRWxhcHNlZEhhbGZDcGx0Q2FsbGJhY2s7DQotICBodGltLT5UcmlnZ2VyQ2FsbGJhY2sgPSBIQUxfVElNX1RyaWdnZXJDYWxsYmFjazsNCi0gIGh0aW0tPlRyaWdnZXJIYWxmQ3BsdENhbGxiYWNrID0gSEFMX1RJTV9UcmlnZ2VySGFsZkNwbHRDYWxsYmFjazsNCi0gIGh0aW0tPklDX0NhcHR1cmVDYWxsYmFjayA9IEhBTF9USU1fSUNfQ2FwdHVyZUNhbGxiYWNrOw0KLSAgaHRpbS0+SUNfQ2FwdHVyZUhhbGZDcGx0Q2FsbGJhY2sgPSBIQUxfVElNX0lDX0NhcHR1cmVIYWxmQ3BsdENhbGxiYWNrOw0KLSAgaHRpbS0+T0NfRGVsYXlFbGFwc2VkQ2FsbGJhY2sgPSBIQUxfVElNX09DX0RlbGF5RWxhcHNlZENhbGxiYWNrOw0KLSAgaHRpbS0+UFdNX1B1bHNlRmluaXNoZWRDYWxsYmFjayA9IEhBTF9USU1fUFdNX1B1bHNlRmluaXNoZWRDYWxsYmFjazsNCi0gIGh0aW0tPlBXTV9QdWxzZUZpbmlzaGVkSGFsZkNwbHRDYWxsYmFjayA9DQotICAgICAgSEFMX1RJTV9QV01fUHVsc2VGaW5pc2hlZEhhbGZDcGx0Q2FsbGJhY2s7DQotICBodGltLT5FcnJvckNhbGxiYWNrID0gSEFMX1RJTV9FcnJvckNhbGxiYWNrOw0KLSAgaHRpbS0+Q29tbXV0YXRpb25DYWxsYmFjayA9IEhBTF9USU1FeF9Db21tdXRDYWxsYmFjazsNCi0gIGh0aW0tPkNvbW11dGF0aW9uSGFsZkNwbHRDYWxsYmFjayA9IEhBTF9USU1FeF9Db21tdXRIYWxmQ3BsdENhbGxiYWNrOw0KLSAgaHRpbS0+QnJlYWtDYWxsYmFjayA9IEhBTF9USU1FeF9CcmVha0NhbGxiYWNrOw0KLSAgaHRpbS0+QnJlYWsyQ2FsbGJhY2sgPSBIQUxfVElNRXhfQnJlYWsyQ2FsbGJhY2s7DQotICBodGltLT5FbmNvZGVySW5kZXhDYWxsYmFjayA9IEhBTF9USU1FeF9FbmNvZGVySW5kZXhDYWxsYmFjazsNCi0gIGh0aW0tPkRpcmVjdGlvbkNoYW5nZUNhbGxiYWNrID0gSEFMX1RJTUV4X0RpcmVjdGlvbkNoYW5nZUNhbGxiYWNrOw0KLSAgaHRpbS0+SW5kZXhFcnJvckNhbGxiYWNrID0gSEFMX1RJTUV4X0luZGV4RXJyb3JDYWxsYmFjazsNCi0gIGh0aW0tPlRyYW5zaXRpb25FcnJvckNhbGxiYWNrID0gSEFMX1RJTUV4X1RyYW5zaXRpb25FcnJvckNhbGxiYWNrOw0KLX0NCi0jZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0jZW5kaWYgLyogSEFMX1RJTV9NT0RVTEVfRU5BQkxFRCAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnNHh4X2hhbF90aW0uYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgVElNIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcKKyAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIFRpbWVyIChUSU0pIHBlcmlwaGVyYWw6CisgICogICAgICAgICAgICsgVElNIFRpbWUgQmFzZSBJbml0aWFsaXphdGlvbgorICAqICAgICAgICAgICArIFRJTSBUaW1lIEJhc2UgU3RhcnQKKyAgKiAgICAgICAgICAgKyBUSU0gVGltZSBCYXNlIFN0YXJ0IEludGVycnVwdGlvbgorICAqICAgICAgICAgICArIFRJTSBUaW1lIEJhc2UgU3RhcnQgRE1BCisgICogICAgICAgICAgICsgVElNIE91dHB1dCBDb21wYXJlL1BXTSBJbml0aWFsaXphdGlvbgorICAqICAgICAgICAgICArIFRJTSBPdXRwdXQgQ29tcGFyZS9QV00gQ2hhbm5lbCBDb25maWd1cmF0aW9uCisgICogICAgICAgICAgICsgVElNIE91dHB1dCBDb21wYXJlL1BXTSAgU3RhcnQKKyAgKiAgICAgICAgICAgKyBUSU0gT3V0cHV0IENvbXBhcmUvUFdNICBTdGFydCBJbnRlcnJ1cHRpb24KKyAgKiAgICAgICAgICAgKyBUSU0gT3V0cHV0IENvbXBhcmUvUFdNIFN0YXJ0IERNQQorICAqICAgICAgICAgICArIFRJTSBJbnB1dCBDYXB0dXJlIEluaXRpYWxpemF0aW9uCisgICogICAgICAgICAgICsgVElNIElucHV0IENhcHR1cmUgQ2hhbm5lbCBDb25maWd1cmF0aW9uCisgICogICAgICAgICAgICsgVElNIElucHV0IENhcHR1cmUgU3RhcnQKKyAgKiAgICAgICAgICAgKyBUSU0gSW5wdXQgQ2FwdHVyZSBTdGFydCBJbnRlcnJ1cHRpb24KKyAgKiAgICAgICAgICAgKyBUSU0gSW5wdXQgQ2FwdHVyZSBTdGFydCBETUEKKyAgKiAgICAgICAgICAgKyBUSU0gT25lIFB1bHNlIEluaXRpYWxpemF0aW9uCisgICogICAgICAgICAgICsgVElNIE9uZSBQdWxzZSBDaGFubmVsIENvbmZpZ3VyYXRpb24KKyAgKiAgICAgICAgICAgKyBUSU0gT25lIFB1bHNlIFN0YXJ0CisgICogICAgICAgICAgICsgVElNIEVuY29kZXIgSW50ZXJmYWNlIEluaXRpYWxpemF0aW9uCisgICogICAgICAgICAgICsgVElNIEVuY29kZXIgSW50ZXJmYWNlIFN0YXJ0CisgICogICAgICAgICAgICsgVElNIEVuY29kZXIgSW50ZXJmYWNlIFN0YXJ0IEludGVycnVwdGlvbgorICAqICAgICAgICAgICArIFRJTSBFbmNvZGVyIEludGVyZmFjZSBTdGFydCBETUEKKyAgKiAgICAgICAgICAgKyBDb21tdXRhdGlvbiBFdmVudCBjb25maWd1cmF0aW9uIHdpdGggSW50ZXJydXB0aW9uIGFuZCBETUEKKyAgKiAgICAgICAgICAgKyBUSU0gT0NSZWYgY2xlYXIgY29uZmlndXJhdGlvbgorICAqICAgICAgICAgICArIFRJTSBFeHRlcm5hbCBDbG9jayBjb25maWd1cmF0aW9uCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGVybXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZQorICAqIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4KKyAgKiBJZiBubyBMSUNFTlNFIGZpbGUgY29tZXMgd2l0aCB0aGlzIHNvZnR3YXJlLCBpdCBpcyBwcm92aWRlZCBBUy1JUy4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFRJTUVSIEdlbmVyaWMgZmVhdHVyZXMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0gVGhlIFRpbWVyIGZlYXR1cmVzIGluY2x1ZGU6CisgICAgICAgKCMpIDE2LWJpdCB1cCwgZG93biwgdXAvZG93biBhdXRvLXJlbG9hZCBjb3VudGVyLgorICAgICAgICgjKSAxNi1iaXQgcHJvZ3JhbW1hYmxlIHByZXNjYWxlciBhbGxvd2luZyBkaXZpZGluZyAoYWxzbyBvbiB0aGUgZmx5KSB0aGUKKyAgICAgICAgICAgY291bnRlciBjbG9jayBmcmVxdWVuY3kgZWl0aGVyIGJ5IGFueSBmYWN0b3IgYmV0d2VlbiAxIGFuZCA2NTUzNi4KKyAgICAgICAoIykgVXAgdG8gNCBpbmRlcGVuZGVudCBjaGFubmVscyBmb3I6CisgICAgICAgICAgICgrKykgSW5wdXQgQ2FwdHVyZQorICAgICAgICAgICAoKyspIE91dHB1dCBDb21wYXJlCisgICAgICAgICAgICgrKykgUFdNIGdlbmVyYXRpb24gKEVkZ2UgYW5kIENlbnRlci1hbGlnbmVkIE1vZGUpCisgICAgICAgICAgICgrKykgT25lLXB1bHNlIG1vZGUgb3V0cHV0CisgICAgICAgKCMpIFN5bmNocm9uaXphdGlvbiBjaXJjdWl0IHRvIGNvbnRyb2wgdGhlIHRpbWVyIHdpdGggZXh0ZXJuYWwgc2lnbmFscworYW5kIHRvIGludGVyY29ubmVjdCBzZXZlcmFsIHRpbWVycyB0b2dldGhlci4KKyAgICAgICAoIykgU3VwcG9ydHMgaW5jcmVtZW50YWwgZW5jb2RlciBmb3IgcG9zaXRpb25pbmcgcHVycG9zZXMKKworICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICgjKSBJbml0aWFsaXplIHRoZSBUSU0gbG93IGxldmVsIHJlc291cmNlcyBieSBpbXBsZW1lbnRpbmcgdGhlIGZvbGxvd2luZworZnVuY3Rpb25zIGRlcGVuZGluZyBvbiB0aGUgc2VsZWN0ZWQgZmVhdHVyZToKKyAgICAgICAgICAgKCsrKSBUaW1lIEJhc2UgOiBIQUxfVElNX0Jhc2VfTXNwSW5pdCgpCisgICAgICAgICAgICgrKykgSW5wdXQgQ2FwdHVyZSA6IEhBTF9USU1fSUNfTXNwSW5pdCgpCisgICAgICAgICAgICgrKykgT3V0cHV0IENvbXBhcmUgOiBIQUxfVElNX09DX01zcEluaXQoKQorICAgICAgICAgICAoKyspIFBXTSBnZW5lcmF0aW9uIDogSEFMX1RJTV9QV01fTXNwSW5pdCgpCisgICAgICAgICAgICgrKykgT25lLXB1bHNlIG1vZGUgb3V0cHV0IDogSEFMX1RJTV9PbmVQdWxzZV9Nc3BJbml0KCkKKyAgICAgICAgICAgKCsrKSBFbmNvZGVyIG1vZGUgb3V0cHV0IDogSEFMX1RJTV9FbmNvZGVyX01zcEluaXQoKQorCisgICAgICgjKSBJbml0aWFsaXplIHRoZSBUSU0gbG93IGxldmVsIHJlc291cmNlcyA6CisgICAgICAgICgjIykgRW5hYmxlIHRoZSBUSU0gaW50ZXJmYWNlIGNsb2NrIHVzaW5nIF9fSEFMX1JDQ19USU14X0NMS19FTkFCTEUoKTsKKyAgICAgICAgKCMjKSBUSU0gcGlucyBjb25maWd1cmF0aW9uCisgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIGNsb2NrIGZvciB0aGUgVElNIEdQSU9zIHVzaW5nIHRoZSBmb2xsb3dpbmcKK2Z1bmN0aW9uOgorICAgICAgICAgICAgIF9fSEFMX1JDQ19HUElPeF9DTEtfRU5BQkxFKCk7CisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlc2UgVElNIHBpbnMgaW4gQWx0ZXJuYXRlIGZ1bmN0aW9uIG1vZGUgdXNpbmcKK0hBTF9HUElPX0luaXQoKTsKKworICAgICAoIykgVGhlIGV4dGVybmFsIENsb2NrIGNhbiBiZSBjb25maWd1cmVkLCBpZiBuZWVkZWQgKHRoZSBkZWZhdWx0IGNsb2NrIGlzCit0aGUgaW50ZXJuYWwgY2xvY2sgZnJvbSB0aGUgQVBCeCksIHVzaW5nIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb246CisgICAgICAgICBIQUxfVElNX0NvbmZpZ0Nsb2NrU291cmNlLCB0aGUgY2xvY2sgY29uZmlndXJhdGlvbiBzaG91bGQgYmUgZG9uZQorYmVmb3JlIGFueSBzdGFydCBmdW5jdGlvbi4KKworICAgICAoIykgQ29uZmlndXJlIHRoZSBUSU0gaW4gdGhlIGRlc2lyZWQgZnVuY3Rpb25pbmcgbW9kZSB1c2luZyBvbmUgb2YgdGhlCisgICAgICAgSW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gb2YgdGhpcyBkcml2ZXI6CisgICAgICAgKCsrKSBIQUxfVElNX0Jhc2VfSW5pdDogdG8gdXNlIHRoZSBUaW1lciB0byBnZW5lcmF0ZSBhIHNpbXBsZSB0aW1lIGJhc2UKKyAgICAgICAoKyspIEhBTF9USU1fT0NfSW5pdCwgSEFMX1RJTV9PQ19Db25maWdDaGFubmVsIGFuZCBvcHRpb25hbGx5CitIQUxfVElNRXhfT0NfQ29uZmlnUHVsc2VPbkNvbXBhcmU6IHRvIHVzZSB0aGUgVGltZXIgdG8gZ2VuZXJhdGUgYW4gT3V0cHV0CitDb21wYXJlIHNpZ25hbC4KKyAgICAgICAoKyspIEhBTF9USU1fUFdNX0luaXQgYW5kIEhBTF9USU1fUFdNX0NvbmZpZ0NoYW5uZWw6IHRvIHVzZSB0aGUgVGltZXIgdG8KK2dlbmVyYXRlIGEgUFdNIHNpZ25hbC4KKyAgICAgICAoKyspIEhBTF9USU1fSUNfSW5pdCBhbmQgSEFMX1RJTV9JQ19Db25maWdDaGFubmVsOiB0byB1c2UgdGhlIFRpbWVyIHRvCittZWFzdXJlIGFuIGV4dGVybmFsIHNpZ25hbC4KKyAgICAgICAoKyspIEhBTF9USU1fT25lUHVsc2VfSW5pdCBhbmQgSEFMX1RJTV9PbmVQdWxzZV9Db25maWdDaGFubmVsOiB0byB1c2UgdGhlCitUaW1lciBpbiBPbmUgUHVsc2UgTW9kZS4KKyAgICAgICAoKyspIEhBTF9USU1fRW5jb2Rlcl9Jbml0OiB0byB1c2UgdGhlIFRpbWVyIEVuY29kZXIgSW50ZXJmYWNlLgorCisgICAgICgjKSBBY3RpdmF0ZSB0aGUgVElNIHBlcmlwaGVyYWwgdXNpbmcgb25lIG9mIHRoZSBzdGFydCBmdW5jdGlvbnMgZGVwZW5kaW5nCitmcm9tIHRoZSBmZWF0dXJlIHVzZWQ6CisgICAgICAgICAgICgrKykgVGltZSBCYXNlIDogSEFMX1RJTV9CYXNlX1N0YXJ0KCksIEhBTF9USU1fQmFzZV9TdGFydF9ETUEoKSwKK0hBTF9USU1fQmFzZV9TdGFydF9JVCgpCisgICAgICAgICAgICgrKykgSW5wdXQgQ2FwdHVyZSA6ICBIQUxfVElNX0lDX1N0YXJ0KCksIEhBTF9USU1fSUNfU3RhcnRfRE1BKCksCitIQUxfVElNX0lDX1N0YXJ0X0lUKCkKKyAgICAgICAgICAgKCsrKSBPdXRwdXQgQ29tcGFyZSA6IEhBTF9USU1fT0NfU3RhcnQoKSwgSEFMX1RJTV9PQ19TdGFydF9ETUEoKSwKK0hBTF9USU1fT0NfU3RhcnRfSVQoKQorICAgICAgICAgICAoKyspIFBXTSBnZW5lcmF0aW9uIDogSEFMX1RJTV9QV01fU3RhcnQoKSwgSEFMX1RJTV9QV01fU3RhcnRfRE1BKCksCitIQUxfVElNX1BXTV9TdGFydF9JVCgpCisgICAgICAgICAgICgrKykgT25lLXB1bHNlIG1vZGUgb3V0cHV0IDogSEFMX1RJTV9PbmVQdWxzZV9TdGFydCgpLAorSEFMX1RJTV9PbmVQdWxzZV9TdGFydF9JVCgpCisgICAgICAgICAgICgrKykgRW5jb2RlciBtb2RlIG91dHB1dCA6IEhBTF9USU1fRW5jb2Rlcl9TdGFydCgpLAorSEFMX1RJTV9FbmNvZGVyX1N0YXJ0X0RNQSgpLCBIQUxfVElNX0VuY29kZXJfU3RhcnRfSVQoKS4KKworICAgICAoIykgVGhlIERNQSBCdXJzdCBpcyBtYW5hZ2VkIHdpdGggdGhlIHR3byBmb2xsb3dpbmcgZnVuY3Rpb25zOgorICAgICAgICAgSEFMX1RJTV9ETUFCdXJzdF9Xcml0ZVN0YXJ0KCkKKyAgICAgICAgIEhBTF9USU1fRE1BQnVyc3RfUmVhZFN0YXJ0KCkKKworICAgICoqKiBDYWxsYmFjayByZWdpc3RyYXRpb24gKioqCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIFsuLl0KKyAgVGhlIGNvbXBpbGF0aW9uIGRlZmluZSAgVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTIHdoZW4gc2V0IHRvIDEKKyAgYWxsb3dzIHRoZSB1c2VyIHRvIGNvbmZpZ3VyZSBkeW5hbWljYWxseSB0aGUgZHJpdmVyIGNhbGxiYWNrcy4KKworICBbLi5dCisgIFVzZSBGdW5jdGlvbiBIQUxfVElNX1JlZ2lzdGVyQ2FsbGJhY2soKSB0byByZWdpc3RlciBhIGNhbGxiYWNrLgorICBIQUxfVElNX1JlZ2lzdGVyQ2FsbGJhY2soKSB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZSBIQUwgcGVyaXBoZXJhbCBoYW5kbGUsCisgIHRoZSBDYWxsYmFjayBJRCBhbmQgYSBwb2ludGVyIHRvIHRoZSB1c2VyIGNhbGxiYWNrIGZ1bmN0aW9uLgorCisgIFsuLl0KKyAgVXNlIGZ1bmN0aW9uIEhBTF9USU1fVW5SZWdpc3RlckNhbGxiYWNrKCkgdG8gcmVzZXQgYSBjYWxsYmFjayB0byB0aGUgZGVmYXVsdAorICB3ZWFrIGZ1bmN0aW9uLgorICBIQUxfVElNX1VuUmVnaXN0ZXJDYWxsYmFjayB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZSBIQUwgcGVyaXBoZXJhbCBoYW5kbGUsCisgIGFuZCB0aGUgQ2FsbGJhY2sgSUQuCisKKyAgWy4uXQorICBUaGVzZSBmdW5jdGlvbnMgYWxsb3cgdG8gcmVnaXN0ZXIvdW5yZWdpc3RlciBmb2xsb3dpbmcgY2FsbGJhY2tzOgorICAgICgrKSBCYXNlX01zcEluaXRDYWxsYmFjayAgICAgICAgICAgICAgOiBUSU0gQmFzZSBNc3AgSW5pdCBDYWxsYmFjay4KKyAgICAoKykgQmFzZV9Nc3BEZUluaXRDYWxsYmFjayAgICAgICAgICAgIDogVElNIEJhc2UgTXNwIERlSW5pdCBDYWxsYmFjay4KKyAgICAoKykgSUNfTXNwSW5pdENhbGxiYWNrICAgICAgICAgICAgICAgIDogVElNIElDIE1zcCBJbml0IENhbGxiYWNrLgorICAgICgrKSBJQ19Nc3BEZUluaXRDYWxsYmFjayAgICAgICAgICAgICAgOiBUSU0gSUMgTXNwIERlSW5pdCBDYWxsYmFjay4KKyAgICAoKykgT0NfTXNwSW5pdENhbGxiYWNrICAgICAgICAgICAgICAgIDogVElNIE9DIE1zcCBJbml0IENhbGxiYWNrLgorICAgICgrKSBPQ19Nc3BEZUluaXRDYWxsYmFjayAgICAgICAgICAgICAgOiBUSU0gT0MgTXNwIERlSW5pdCBDYWxsYmFjay4KKyAgICAoKykgUFdNX01zcEluaXRDYWxsYmFjayAgICAgICAgICAgICAgIDogVElNIFBXTSBNc3AgSW5pdCBDYWxsYmFjay4KKyAgICAoKykgUFdNX01zcERlSW5pdENhbGxiYWNrICAgICAgICAgICAgIDogVElNIFBXTSBNc3AgRGVJbml0IENhbGxiYWNrLgorICAgICgrKSBPbmVQdWxzZV9Nc3BJbml0Q2FsbGJhY2sgICAgICAgICAgOiBUSU0gT25lIFB1bHNlIE1zcCBJbml0IENhbGxiYWNrLgorICAgICgrKSBPbmVQdWxzZV9Nc3BEZUluaXRDYWxsYmFjayAgICAgICAgOiBUSU0gT25lIFB1bHNlIE1zcCBEZUluaXQgQ2FsbGJhY2suCisgICAgKCspIEVuY29kZXJfTXNwSW5pdENhbGxiYWNrICAgICAgICAgICA6IFRJTSBFbmNvZGVyIE1zcCBJbml0IENhbGxiYWNrLgorICAgICgrKSBFbmNvZGVyX01zcERlSW5pdENhbGxiYWNrICAgICAgICAgOiBUSU0gRW5jb2RlciBNc3AgRGVJbml0IENhbGxiYWNrLgorICAgICgrKSBIYWxsU2Vuc29yX01zcEluaXRDYWxsYmFjayAgICAgICAgOiBUSU0gSGFsbCBTZW5zb3IgTXNwIEluaXQgQ2FsbGJhY2suCisgICAgKCspIEhhbGxTZW5zb3JfTXNwRGVJbml0Q2FsbGJhY2sgICAgICA6IFRJTSBIYWxsIFNlbnNvciBNc3AgRGVJbml0IENhbGxiYWNrLgorICAgICgrKSBQZXJpb2RFbGFwc2VkQ2FsbGJhY2sgICAgICAgICAgICAgOiBUSU0gUGVyaW9kIEVsYXBzZWQgQ2FsbGJhY2suCisgICAgKCspIFBlcmlvZEVsYXBzZWRIYWxmQ3BsdENhbGxiYWNrICAgICA6IFRJTSBQZXJpb2QgRWxhcHNlZCBoYWxmIGNvbXBsZXRlCitDYWxsYmFjay4KKyAgICAoKykgVHJpZ2dlckNhbGxiYWNrICAgICAgICAgICAgICAgICAgIDogVElNIFRyaWdnZXIgQ2FsbGJhY2suCisgICAgKCspIFRyaWdnZXJIYWxmQ3BsdENhbGxiYWNrICAgICAgICAgICA6IFRJTSBUcmlnZ2VyIGhhbGYgY29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIElDX0NhcHR1cmVDYWxsYmFjayAgICAgICAgICAgICAgICA6IFRJTSBJbnB1dCBDYXB0dXJlIENhbGxiYWNrLgorICAgICgrKSBJQ19DYXB0dXJlSGFsZkNwbHRDYWxsYmFjayAgICAgICAgOiBUSU0gSW5wdXQgQ2FwdHVyZSBoYWxmIGNvbXBsZXRlCitDYWxsYmFjay4KKyAgICAoKykgT0NfRGVsYXlFbGFwc2VkQ2FsbGJhY2sgICAgICAgICAgIDogVElNIE91dHB1dCBDb21wYXJlIERlbGF5IEVsYXBzZWQKK0NhbGxiYWNrLgorICAgICgrKSBQV01fUHVsc2VGaW5pc2hlZENhbGxiYWNrICAgICAgICAgOiBUSU0gUFdNIFB1bHNlIEZpbmlzaGVkIENhbGxiYWNrLgorICAgICgrKSBQV01fUHVsc2VGaW5pc2hlZEhhbGZDcGx0Q2FsbGJhY2sgOiBUSU0gUFdNIFB1bHNlIEZpbmlzaGVkIGhhbGYgY29tcGxldGUKK0NhbGxiYWNrLgorICAgICgrKSBFcnJvckNhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgOiBUSU0gRXJyb3IgQ2FsbGJhY2suCisgICAgKCspIENvbW11dGF0aW9uQ2FsbGJhY2sgICAgICAgICAgICAgICA6IFRJTSBDb21tdXRhdGlvbiBDYWxsYmFjay4KKyAgICAoKykgQ29tbXV0YXRpb25IYWxmQ3BsdENhbGxiYWNrICAgICAgIDogVElNIENvbW11dGF0aW9uIGhhbGYgY29tcGxldGUKK0NhbGxiYWNrLgorICAgICgrKSBCcmVha0NhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgOiBUSU0gQnJlYWsgQ2FsbGJhY2suCisgICAgKCspIEJyZWFrMkNhbGxiYWNrICAgICAgICAgICAgICAgICAgICA6IFRJTSBCcmVhazIgQ2FsbGJhY2suCisgICAgKCspIEVuY29kZXJJbmRleENhbGxiYWNrICAgICAgICAgICAgICA6IFRJTSBFbmNvZGVyIEluZGV4IENhbGxiYWNrLgorICAgICgrKSBEaXJlY3Rpb25DaGFuZ2VDYWxsYmFjayAgICAgICAgICAgOiBUSU0gRGlyZWN0aW9uIENoYW5nZSBDYWxsYmFjaworICAgICgrKSBJbmRleEVycm9yQ2FsbGJhY2sgICAgICAgICAgICAgICAgOiBUSU0gSW5kZXggRXJyb3IgQ2FsbGJhY2suCisgICAgKCspIFRyYW5zaXRpb25FcnJvckNhbGxiYWNrICAgICAgICAgICA6IFRJTSBUcmFuc2l0aW9uIEVycm9yIENhbGxiYWNrCisKKyAgWy4uXQorQnkgZGVmYXVsdCwgYWZ0ZXIgdGhlIEluaXQgYW5kIHdoZW4gdGhlIHN0YXRlIGlzIEhBTF9USU1fU1RBVEVfUkVTRVQKK2FsbCBpbnRlcnJ1cHQgY2FsbGJhY2tzIGFyZSBzZXQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgd2VhayBmdW5jdGlvbnM6CisgIGV4YW1wbGVzIEhBTF9USU1fVHJpZ2dlckNhbGxiYWNrKCksIEhBTF9USU1fRXJyb3JDYWxsYmFjaygpLgorCisgIFsuLl0KKyAgRXhjZXB0aW9uIGRvbmUgZm9yIE1zcEluaXQgYW5kIE1zcERlSW5pdCBmdW5jdGlvbnMgdGhhdCBhcmUgcmVzZXQgdG8gdGhlCitsZWdhY3kgd2VhayBmdW5jdGlvbmFsaXRpZXMgaW4gdGhlIEluaXQgLyBEZUluaXQgb25seSB3aGVuIHRoZXNlIGNhbGxiYWNrcyBhcmUKK251bGwgKG5vdCByZWdpc3RlcmVkIGJlZm9yZWhhbmQpLiBJZiBub3QsIE1zcEluaXQgb3IgTXNwRGVJbml0IGFyZSBub3QgbnVsbCwgdGhlCitJbml0IC8gRGVJbml0IGtlZXAgYW5kIHVzZSB0aGUgdXNlciBNc3BJbml0IC8gTXNwRGVJbml0IGNhbGxiYWNrcyhyZWdpc3RlcmVkCitiZWZvcmVoYW5kKQorCisgIFsuLl0KKyAgICBDYWxsYmFja3MgY2FuIGJlIHJlZ2lzdGVyZWQgLyB1bnJlZ2lzdGVyZWQgaW4gSEFMX1RJTV9TVEFURV9SRUFEWSBzdGF0ZQorb25seS4gRXhjZXB0aW9uIGRvbmUgTXNwSW5pdCAvIE1zcERlSW5pdCB0aGF0IGNhbiBiZSByZWdpc3RlcmVkIC8gdW5yZWdpc3RlcmVkCisgICAgaW4gSEFMX1RJTV9TVEFURV9SRUFEWSBvciBIQUxfVElNX1NUQVRFX1JFU0VUIHN0YXRlLAorICAgIHRodXMgcmVnaXN0ZXJlZCh1c2VyKSBNc3BJbml0IC8gRGVJbml0IGNhbGxiYWNrcyBjYW4gYmUgdXNlZCBkdXJpbmcgdGhlIEluaXQKKy8gRGVJbml0LiBJbiB0aGF0IGNhc2UgZmlyc3QgcmVnaXN0ZXIgdGhlIE1zcEluaXQvTXNwRGVJbml0IHVzZXIgY2FsbGJhY2tzIHVzaW5nCitIQUxfVElNX1JlZ2lzdGVyQ2FsbGJhY2soKSBiZWZvcmUgY2FsbGluZyBEZUluaXQgb3IgSW5pdCBmdW5jdGlvbi4KKworICBbLi5dCisgICAgICBXaGVuIFRoZSBjb21waWxhdGlvbiBkZWZpbmUgVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTIGlzIHNldCB0byAwIG9yCisgICAgICBub3QgZGVmaW5lZCwgdGhlIGNhbGxiYWNrIHJlZ2lzdHJhdGlvbiBmZWF0dXJlIGlzIG5vdCBhdmFpbGFibGUgYW5kIGFsbAorY2FsbGJhY2tzIGFyZSBzZXQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgd2VhayBmdW5jdGlvbnMuCisKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzR4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzR4eF9IQUxfRHJpdmVyCisgKiBAeworICovCisKKy8qKiBAZGVmZ3JvdXAgVElNIFRJTQorICogQGJyaWVmIFRJTSBIQUwgbW9kdWxlIGRyaXZlcgorICogQHsKKyAqLworCisjaWZkZWYgSEFMX1RJTV9NT0RVTEVfRU5BQkxFRAorCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBUSU1fUHJpdmF0ZV9Db25zdGFudHMKKyAqIEB7CisgKi8KKyNkZWZpbmUgVElNeF9BRjJfT0NSU0VMIFRJTTFfQUYyX09DUlNFTAorCisvKioKKyAqIEB9CisgKi8KKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBUSU1fUHJpdmF0ZV9GdW5jdGlvbnMKKyAqIEB7CisgKi8KK3N0YXRpYyB2b2lkIFRJTV9PQzFfU2V0Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVElNX09DX0luaXRUeXBlRGVmICpPQ19Db25maWcpOworc3RhdGljIHZvaWQgVElNX09DM19TZXRDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUSU1fT0NfSW5pdFR5cGVEZWYgKk9DX0NvbmZpZyk7CitzdGF0aWMgdm9pZCBUSU1fT0M0X1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRJTV9PQ19Jbml0VHlwZURlZiAqT0NfQ29uZmlnKTsKK3N0YXRpYyB2b2lkIFRJTV9PQzVfU2V0Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVElNX09DX0luaXRUeXBlRGVmICpPQ19Db25maWcpOworc3RhdGljIHZvaWQgVElNX09DNl9TZXRDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUSU1fT0NfSW5pdFR5cGVEZWYgKk9DX0NvbmZpZyk7CitzdGF0aWMgdm9pZCBUSU1fVEkxX0NvbmZpZ0lucHV0U3RhZ2UoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IFRJTV9JQ1BvbGFyaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRJTV9JQ0ZpbHRlcik7CitzdGF0aWMgdm9pZCBUSU1fVEkyX1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgVElNX0lDUG9sYXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUSU1fSUNTZWxlY3Rpb24sIHVpbnQzMl90IFRJTV9JQ0ZpbHRlcik7CitzdGF0aWMgdm9pZCBUSU1fVEkyX0NvbmZpZ0lucHV0U3RhZ2UoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IFRJTV9JQ1BvbGFyaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRJTV9JQ0ZpbHRlcik7CitzdGF0aWMgdm9pZCBUSU1fVEkzX1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgVElNX0lDUG9sYXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUSU1fSUNTZWxlY3Rpb24sIHVpbnQzMl90IFRJTV9JQ0ZpbHRlcik7CitzdGF0aWMgdm9pZCBUSU1fVEk0X1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgVElNX0lDUG9sYXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUSU1fSUNTZWxlY3Rpb24sIHVpbnQzMl90IFRJTV9JQ0ZpbHRlcik7CitzdGF0aWMgdm9pZCBUSU1fSVRSeF9TZXRDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IElucHV0VHJpZ2dlclNvdXJjZSk7CitzdGF0aWMgdm9pZCBUSU1fRE1BUGVyaW9kRWxhcHNlZENwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgVElNX0RNQVBlcmlvZEVsYXBzZWRIYWxmQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBUSU1fRE1BRGVsYXlQdWxzZUNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgVElNX0RNQVRyaWdnZXJDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIFRJTV9ETUFUcmlnZ2VySGFsZkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFRJTV9TbGF2ZVRpbWVyX1NldENvbmZpZygKKyAgICBUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgY29uc3QgVElNX1NsYXZlQ29uZmlnVHlwZURlZiAqc1NsYXZlQ29uZmlnKTsKKy8qKgorICogQH0KKyAqLworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zIFRJTSBFeHBvcnRlZCBGdW5jdGlvbnMKKyAqIEB7CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBUSU0gVGltZSBCYXNlIGZ1bmN0aW9ucworICAqICBAYnJpZWYgICAgVGltZSBCYXNlIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICMjIyMjIFRpbWUgQmFzZSBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICgrKSBJbml0aWFsaXplIGFuZCBjb25maWd1cmUgdGhlIFRJTSBiYXNlLgorICAgICgrKSBEZS1pbml0aWFsaXplIHRoZSBUSU0gYmFzZS4KKyAgICAoKykgU3RhcnQgdGhlIFRpbWUgQmFzZS4KKyAgICAoKykgU3RvcCB0aGUgVGltZSBCYXNlLgorICAgICgrKSBTdGFydCB0aGUgVGltZSBCYXNlIGFuZCBlbmFibGUgaW50ZXJydXB0LgorICAgICgrKSBTdG9wIHRoZSBUaW1lIEJhc2UgYW5kIGRpc2FibGUgaW50ZXJydXB0LgorICAgICgrKSBTdGFydCB0aGUgVGltZSBCYXNlIGFuZCBlbmFibGUgRE1BIHRyYW5zZmVyLgorICAgICgrKSBTdG9wIHRoZSBUaW1lIEJhc2UgYW5kIGRpc2FibGUgRE1BIHRyYW5zZmVyLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworLyoqCisgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBUSU0gVGltZSBiYXNlIFVuaXQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQKKyAqICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgVElNX0hhbmRsZVR5cGVEZWYgYW5kIGluaXRpYWxpemUgdGhlIGFzc29jaWF0ZWQKKyAqIGhhbmRsZS4KKyAqIEBub3RlICAgU3dpdGNoaW5nIGZyb20gQ2VudGVyIEFsaWduZWQgY291bnRlciBtb2RlIHRvIEVkZ2UgY291bnRlciBtb2RlIChvcgorICogcmV2ZXJzZSkgcmVxdWlyZXMgYSB0aW1lciByZXNldCB0byBhdm9pZCB1bmV4cGVjdGVkIGRpcmVjdGlvbiBkdWUgdG8gRElSIGJpdAorICogcmVhZG9ubHkgaW4gY2VudGVyIGFsaWduZWQgbW9kZS4gRXg6IGNhbGwgQHJlZiBIQUxfVElNX0Jhc2VfRGVJbml0KCkgYmVmb3JlCisgKiBIQUxfVElNX0Jhc2VfSW5pdCgpCisgKiBAcGFyYW0gIGh0aW0gVElNIEJhc2UgaGFuZGxlCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9CYXNlX0luaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pIHsKKyAgLyogQ2hlY2sgdGhlIFRJTSBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZiAoaHRpbSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DT1VOVEVSX01PREUoaHRpbS0+SW5pdC5Db3VudGVyTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMT0NLRElWSVNJT05fRElWKGh0aW0tPkluaXQuQ2xvY2tEaXZpc2lvbikpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX1BFUklPRChodGltLCBodGltLT5Jbml0LlBlcmlvZCkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0FVVE9SRUxPQURfUFJFTE9BRChodGltLT5Jbml0LkF1dG9SZWxvYWRQcmVsb2FkKSk7CisKKyAgaWYgKGh0aW0tPlN0YXRlID09IEhBTF9USU1fU1RBVEVfUkVTRVQpIHsKKyAgICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovCisgICAgaHRpbS0+TG9jayA9IEhBTF9VTkxPQ0tFRDsKKworI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAvKiBSZXNldCBpbnRlcnJ1cHQgY2FsbGJhY2tzIHRvIGxlZ2FjeSB3ZWFrIGNhbGxiYWNrcyAqLworICAgIFRJTV9SZXNldENhbGxiYWNrKGh0aW0pOworCisgICAgaWYgKGh0aW0tPkJhc2VfTXNwSW5pdENhbGxiYWNrID09IE5VTEwpIHsKKyAgICAgIGh0aW0tPkJhc2VfTXNwSW5pdENhbGxiYWNrID0gSEFMX1RJTV9CYXNlX01zcEluaXQ7CisgICAgfQorICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLLCBOVklDICovCisgICAgaHRpbS0+QmFzZV9Nc3BJbml0Q2FsbGJhY2soaHRpbSk7CisjZWxzZQorICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLLCBOVklDICovCisgICAgSEFMX1RJTV9CYXNlX01zcEluaXQoaHRpbSk7CisjZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KKworICAvKiBTZXQgdGhlIFRJTSBzdGF0ZSAqLworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfQlVTWTsKKworICAvKiBTZXQgdGhlIFRpbWUgQmFzZSBjb25maWd1cmF0aW9uICovCisgIFRJTV9CYXNlX1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgJmh0aW0tPkluaXQpOworCisgIC8qIEluaXRpYWxpemUgdGhlIERNQSBidXJzdCBvcGVyYXRpb24gc3RhdGUgKi8KKyAgaHRpbS0+RE1BQnVyc3RTdGF0ZSA9IEhBTF9ETUFfQlVSU1RfU1RBVEVfUkVBRFk7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgVElNIGNoYW5uZWxzIHN0YXRlICovCisgIFRJTV9DSEFOTkVMX1NUQVRFX1NFVF9BTEwoaHRpbSwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsKKyAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVRfQUxMKGh0aW0sIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgVElNIHN0YXRlKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICogQGJyaWVmICBEZUluaXRpYWxpemVzIHRoZSBUSU0gQmFzZSBwZXJpcGhlcmFsCisgKiBAcGFyYW0gIGh0aW0gVElNIEJhc2UgaGFuZGxlCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9CYXNlX0RlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkgeworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgVElNIFBlcmlwaGVyYWwgQ2xvY2sgKi8KKyAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7CisKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIGlmIChodGltLT5CYXNlX01zcERlSW5pdENhbGxiYWNrID09IE5VTEwpIHsKKyAgICBodGltLT5CYXNlX01zcERlSW5pdENhbGxiYWNrID0gSEFMX1RJTV9CYXNlX01zcERlSW5pdDsKKyAgfQorICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLworICBodGltLT5CYXNlX01zcERlSW5pdENhbGxiYWNrKGh0aW0pOworI2Vsc2UKKyAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmU6IEdQSU8sIENMT0NLLCBOVklDICovCisgIEhBTF9USU1fQmFzZV9Nc3BEZUluaXQoaHRpbSk7CisjZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKyAgLyogQ2hhbmdlIHRoZSBETUEgYnVyc3Qgb3BlcmF0aW9uIHN0YXRlICovCisgIGh0aW0tPkRNQUJ1cnN0U3RhdGUgPSBIQUxfRE1BX0JVUlNUX1NUQVRFX1JFU0VUOworCisgIC8qIENoYW5nZSB0aGUgVElNIGNoYW5uZWxzIHN0YXRlICovCisgIFRJTV9DSEFOTkVMX1NUQVRFX1NFVF9BTEwoaHRpbSwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFU0VUKTsKKyAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVRfQUxMKGh0aW0sIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRVNFVCk7CisKKyAgLyogQ2hhbmdlIFRJTSBzdGF0ZSAqLworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVTRVQ7CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhodGltKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFRJTSBCYXNlIE1TUC4KKyAqIEBwYXJhbSAgaHRpbSBUSU0gQmFzZSBoYW5kbGUKKyAqIEByZXR2YWwgTm9uZQorICovCitfX3dlYWsgdm9pZCBIQUxfVElNX0Jhc2VfTXNwSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkgeworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1RJTV9CYXNlX01zcEluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZXMgVElNIEJhc2UgTVNQLgorICogQHBhcmFtICBodGltIFRJTSBCYXNlIGhhbmRsZQorICogQHJldHZhbCBOb25lCisgKi8KK19fd2VhayB2b2lkIEhBTF9USU1fQmFzZV9Nc3BEZUluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pIHsKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHRpbSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9USU1fQmFzZV9Nc3BEZUluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgVElNIEJhc2UgZ2VuZXJhdGlvbi4KKyAqIEBwYXJhbSAgaHRpbSBUSU0gQmFzZSBoYW5kbGUKKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0Jhc2VfU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pIHsKKyAgdWludDMyX3QgdG1wc21jcjsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgLyogQ2hlY2sgdGhlIFRJTSBzdGF0ZSAqLworICBpZiAoaHRpbS0+U3RhdGUgIT0gSEFMX1RJTV9TVEFURV9SRUFEWSkgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBTZXQgdGhlIFRJTSBzdGF0ZSAqLworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfQlVTWTsKKworICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwsIGV4Y2VwdCBpbiB0cmlnZ2VyIG1vZGUgd2hlcmUgZW5hYmxlIGlzIGF1dG9tYXRpY2FsbHkKKyAgICogZG9uZSB3aXRoIHRyaWdnZXIgKi8KKyAgaWYgKElTX1RJTV9TTEFWRV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpIHsKKyAgICB0bXBzbWNyID0gaHRpbS0+SW5zdGFuY2UtPlNNQ1IgJiBUSU1fU01DUl9TTVM7CisgICAgaWYgKCFJU19USU1fU0xBVkVNT0RFX1RSSUdHRVJfRU5BQkxFRCh0bXBzbWNyKSkgeworICAgICAgX19IQUxfVElNX0VOQUJMRShodGltKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgX19IQUxfVElNX0VOQUJMRShodGltKTsKKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgIFN0b3BzIHRoZSBUSU0gQmFzZSBnZW5lcmF0aW9uLgorICogQHBhcmFtICBodGltIFRJTSBCYXNlIGhhbmRsZQorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fQmFzZV9TdG9wKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKSB7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisgIC8qIFNldCB0aGUgVElNIHN0YXRlICovCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRUFEWTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICogQGJyaWVmICBTdGFydHMgdGhlIFRJTSBCYXNlIGdlbmVyYXRpb24gaW4gaW50ZXJydXB0IG1vZGUuCisgKiBAcGFyYW0gIGh0aW0gVElNIEJhc2UgaGFuZGxlCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9CYXNlX1N0YXJ0X0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKSB7CisgIHVpbnQzMl90IHRtcHNtY3I7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgIC8qIENoZWNrIHRoZSBUSU0gc3RhdGUgKi8KKyAgaWYgKGh0aW0tPlN0YXRlICE9IEhBTF9USU1fU1RBVEVfUkVBRFkpIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogU2V0IHRoZSBUSU0gc3RhdGUgKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CisKKyAgLyogRW5hYmxlIHRoZSBUSU0gVXBkYXRlIGludGVycnVwdCAqLworICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9VUERBVEUpOworCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCwgZXhjZXB0IGluIHRyaWdnZXIgbW9kZSB3aGVyZSBlbmFibGUgaXMgYXV0b21hdGljYWxseQorICAgKiBkb25lIHdpdGggdHJpZ2dlciAqLworICBpZiAoSVNfVElNX1NMQVZFX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSkgeworICAgIHRtcHNtY3IgPSBodGltLT5JbnN0YW5jZS0+U01DUiAmIFRJTV9TTUNSX1NNUzsKKyAgICBpZiAoIUlTX1RJTV9TTEFWRU1PREVfVFJJR0dFUl9FTkFCTEVEKHRtcHNtY3IpKSB7CisgICAgICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOworICB9CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiAgU3RvcHMgdGhlIFRJTSBCYXNlIGdlbmVyYXRpb24gaW4gaW50ZXJydXB0IG1vZGUuCisgKiBAcGFyYW0gIGh0aW0gVElNIEJhc2UgaGFuZGxlCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9CYXNlX1N0b3BfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pIHsKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgIC8qIERpc2FibGUgdGhlIFRJTSBVcGRhdGUgaW50ZXJydXB0ICovCisgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9VUERBVEUpOworCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7CisKKyAgLyogU2V0IHRoZSBUSU0gc3RhdGUgKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgVElNIEJhc2UgZ2VuZXJhdGlvbiBpbiBETUEgbW9kZS4KKyAqIEBwYXJhbSAgaHRpbSBUSU0gQmFzZSBoYW5kbGUKKyAqIEBwYXJhbSAgcERhdGEgVGhlIHNvdXJjZSBCdWZmZXIgYWRkcmVzcy4KKyAqIEBwYXJhbSAgTGVuZ3RoIFRoZSBsZW5ndGggb2YgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZCBmcm9tIG1lbW9yeSB0bworICogcGVyaXBoZXJhbC4KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0Jhc2VfU3RhcnRfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCAqcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IExlbmd0aCkgeworICB1aW50MzJfdCB0bXBzbWNyOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fRE1BX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgLyogU2V0IHRoZSBUSU0gc3RhdGUgKi8KKyAgaWYgKGh0aW0tPlN0YXRlID09IEhBTF9USU1fU1RBVEVfQlVTWSkgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfSBlbHNlIGlmIChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX1JFQURZKSB7CisgICAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoTGVuZ3RoID09IDBVKSkgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9IGVsc2UgeworICAgICAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CisgICAgfQorICB9IGVsc2UgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBTZXQgdGhlIERNQSBQZXJpb2QgZWxhcHNlZCBjYWxsYmFja3MgKi8KKyAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX1VQREFURV0tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BUGVyaW9kRWxhcHNlZENwbHQ7CisgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9VUERBVEVdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9CisgICAgICBUSU1fRE1BUGVyaW9kRWxhcHNlZEhhbGZDcGx0OworCisgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9VUERBVEVdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvcjsKKworICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9VUERBVEVdLCAodWludDMyX3QpcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkFSUiwgTGVuZ3RoKSAhPSBIQUxfT0spIHsKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIEVuYWJsZSB0aGUgVElNIFVwZGF0ZSBETUEgcmVxdWVzdCAqLworICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBUSU1fRE1BX1VQREFURSk7CisKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsLCBleGNlcHQgaW4gdHJpZ2dlciBtb2RlIHdoZXJlIGVuYWJsZSBpcyBhdXRvbWF0aWNhbGx5CisgICAqIGRvbmUgd2l0aCB0cmlnZ2VyICovCisgIGlmIChJU19USU1fU0xBVkVfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKSB7CisgICAgdG1wc21jciA9IGh0aW0tPkluc3RhbmNlLT5TTUNSICYgVElNX1NNQ1JfU01TOworICAgIGlmICghSVNfVElNX1NMQVZFTU9ERV9UUklHR0VSX0VOQUJMRUQodG1wc21jcikpIHsKKyAgICAgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7CisgICAgfQorICB9IGVsc2UgeworICAgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7CisgIH0KKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICogQGJyaWVmICBTdG9wcyB0aGUgVElNIEJhc2UgZ2VuZXJhdGlvbiBpbiBETUEgbW9kZS4KKyAqIEBwYXJhbSAgaHRpbSBUSU0gQmFzZSBoYW5kbGUKKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0Jhc2VfU3RvcF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pIHsKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9ETUFfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICAvKiBEaXNhYmxlIHRoZSBUSU0gVXBkYXRlIERNQSByZXF1ZXN0ICovCisgIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBUSU1fRE1BX1VQREFURSk7CisKKyAgKHZvaWQpSEFMX0RNQV9BYm9ydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfVVBEQVRFXSk7CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9USU1fRElTQUJMRShodGltKTsKKworICAvKiBTZXQgdGhlIFRJTSBzdGF0ZSAqLworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBUSU0gT3V0cHV0IENvbXBhcmUgZnVuY3Rpb25zCisgICogIEBicmllZiAgICBUSU0gT3V0cHV0IENvbXBhcmUgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICMjIyMjIFRJTSBPdXRwdXQgQ29tcGFyZSBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICgrKSBJbml0aWFsaXplIGFuZCBjb25maWd1cmUgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZS4KKyAgICAoKykgRGUtaW5pdGlhbGl6ZSB0aGUgVElNIE91dHB1dCBDb21wYXJlLgorICAgICgrKSBTdGFydCB0aGUgVElNIE91dHB1dCBDb21wYXJlLgorICAgICgrKSBTdG9wIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUuCisgICAgKCspIFN0YXJ0IHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgYW5kIGVuYWJsZSBpbnRlcnJ1cHQuCisgICAgKCspIFN0b3AgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBhbmQgZGlzYWJsZSBpbnRlcnJ1cHQuCisgICAgKCspIFN0YXJ0IHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgYW5kIGVuYWJsZSBETUEgdHJhbnNmZXIuCisgICAgKCspIFN0b3AgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBhbmQgZGlzYWJsZSBETUEgdHJhbnNmZXIuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisvKioKKyAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAorICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBUSU1fSGFuZGxlVHlwZURlZiBhbmQgaW5pdGlhbGl6ZXMgdGhlIGFzc29jaWF0ZWQKKyAqIGhhbmRsZS4KKyAqIEBub3RlICAgU3dpdGNoaW5nIGZyb20gQ2VudGVyIEFsaWduZWQgY291bnRlciBtb2RlIHRvIEVkZ2UgY291bnRlciBtb2RlIChvcgorICogcmV2ZXJzZSkgcmVxdWlyZXMgYSB0aW1lciByZXNldCB0byBhdm9pZCB1bmV4cGVjdGVkIGRpcmVjdGlvbiBkdWUgdG8gRElSIGJpdAorICogcmVhZG9ubHkgaW4gY2VudGVyIGFsaWduZWQgbW9kZS4gRXg6IGNhbGwgQHJlZiBIQUxfVElNX09DX0RlSW5pdCgpIGJlZm9yZQorICogSEFMX1RJTV9PQ19Jbml0KCkKKyAqIEBwYXJhbSAgaHRpbSBUSU0gT3V0cHV0IENvbXBhcmUgaGFuZGxlCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PQ19Jbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKSB7CisgIC8qIENoZWNrIHRoZSBUSU0gaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYgKGh0aW0gPT0gTlVMTCkgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fQ09VTlRFUl9NT0RFKGh0aW0tPkluaXQuQ291bnRlck1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTE9DS0RJVklTSU9OX0RJVihodGltLT5Jbml0LkNsb2NrRGl2aXNpb24pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9QRVJJT0QoaHRpbSwgaHRpbS0+SW5pdC5QZXJpb2QpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9BVVRPUkVMT0FEX1BSRUxPQUQoaHRpbS0+SW5pdC5BdXRvUmVsb2FkUHJlbG9hZCkpOworCisgIGlmIChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX1JFU0VUKSB7CisgICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLworICAgIGh0aW0tPkxvY2sgPSBIQUxfVU5MT0NLRUQ7CisKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgLyogUmVzZXQgaW50ZXJydXB0IGNhbGxiYWNrcyB0byBsZWdhY3kgd2VhayBjYWxsYmFja3MgKi8KKyAgICBUSU1fUmVzZXRDYWxsYmFjayhodGltKTsKKworICAgIGlmIChodGltLT5PQ19Nc3BJbml0Q2FsbGJhY2sgPT0gTlVMTCkgeworICAgICAgaHRpbS0+T0NfTXNwSW5pdENhbGxiYWNrID0gSEFMX1RJTV9PQ19Nc3BJbml0OworICAgIH0KKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgOiBHUElPLCBDTE9DSywgTlZJQyAqLworICAgIGh0aW0tPk9DX01zcEluaXRDYWxsYmFjayhodGltKTsKKyNlbHNlCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIDogR1BJTywgQ0xPQ0ssIE5WSUMgYW5kIERNQSAqLworICAgIEhBTF9USU1fT0NfTXNwSW5pdChodGltKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorCisgIC8qIFNldCB0aGUgVElNIHN0YXRlICovCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworCisgIC8qIEluaXQgdGhlIGJhc2UgdGltZSBmb3IgdGhlIE91dHB1dCBDb21wYXJlICovCisgIFRJTV9CYXNlX1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgJmh0aW0tPkluaXQpOworCisgIC8qIEluaXRpYWxpemUgdGhlIERNQSBidXJzdCBvcGVyYXRpb24gc3RhdGUgKi8KKyAgaHRpbS0+RE1BQnVyc3RTdGF0ZSA9IEhBTF9ETUFfQlVSU1RfU1RBVEVfUkVBRFk7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgVElNIGNoYW5uZWxzIHN0YXRlICovCisgIFRJTV9DSEFOTkVMX1NUQVRFX1NFVF9BTEwoaHRpbSwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsKKyAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVRfQUxMKGh0aW0sIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgVElNIHN0YXRlKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICogQGJyaWVmICBEZUluaXRpYWxpemVzIHRoZSBUSU0gcGVyaXBoZXJhbAorICogQHBhcmFtICBodGltIFRJTSBPdXRwdXQgQ29tcGFyZSBoYW5kbGUKKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09DX0RlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkgeworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgVElNIFBlcmlwaGVyYWwgQ2xvY2sgKi8KKyAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7CisKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIGlmIChodGltLT5PQ19Nc3BEZUluaXRDYWxsYmFjayA9PSBOVUxMKSB7CisgICAgaHRpbS0+T0NfTXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfVElNX09DX01zcERlSW5pdDsKKyAgfQorICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLworICBodGltLT5PQ19Nc3BEZUluaXRDYWxsYmFjayhodGltKTsKKyNlbHNlCisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlOiBHUElPLCBDTE9DSywgTlZJQyBhbmQgRE1BICovCisgIEhBTF9USU1fT0NfTXNwRGVJbml0KGh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisgIC8qIENoYW5nZSB0aGUgRE1BIGJ1cnN0IG9wZXJhdGlvbiBzdGF0ZSAqLworICBodGltLT5ETUFCdXJzdFN0YXRlID0gSEFMX0RNQV9CVVJTVF9TVEFURV9SRVNFVDsKKworICAvKiBDaGFuZ2UgdGhlIFRJTSBjaGFubmVscyBzdGF0ZSAqLworICBUSU1fQ0hBTk5FTF9TVEFURV9TRVRfQUxMKGh0aW0sIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRVNFVCk7CisgIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUX0FMTChodGltLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVTRVQpOworCisgIC8qIENoYW5nZSBUSU0gc3RhdGUgKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFU0VUOworCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHRpbSk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgTVNQLgorICogQHBhcmFtICBodGltIFRJTSBPdXRwdXQgQ29tcGFyZSBoYW5kbGUKKyAqIEByZXR2YWwgTm9uZQorICovCitfX3dlYWsgdm9pZCBIQUxfVElNX09DX01zcEluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pIHsKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHRpbSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9USU1fT0NfTXNwSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAqIEBicmllZiAgRGVJbml0aWFsaXplcyBUSU0gT3V0cHV0IENvbXBhcmUgTVNQLgorICogQHBhcmFtICBodGltIFRJTSBPdXRwdXQgQ29tcGFyZSBoYW5kbGUKKyAqIEByZXR2YWwgTm9uZQorICovCitfX3dlYWsgdm9pZCBIQUxfVElNX09DX01zcERlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkgeworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1RJTV9PQ19Nc3BEZUluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgVElNIE91dHB1dCBDb21wYXJlIHNpZ25hbCBnZW5lcmF0aW9uLgorICogQHBhcmFtICBodGltIFRJTSBPdXRwdXQgQ29tcGFyZSBoYW5kbGUKKyAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbCB0byBiZSBlbmFibGVkCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF81OiBUSU0gQ2hhbm5lbCA1IHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNjogVElNIENoYW5uZWwgNiBzZWxlY3RlZAorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT0NfU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpIHsKKyAgdWludDMyX3QgdG1wc21jcjsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOworCisgIC8qIENoZWNrIHRoZSBUSU0gY2hhbm5lbCBzdGF0ZSAqLworICBpZiAoVElNX0NIQU5ORUxfU1RBVEVfR0VUKGh0aW0sIENoYW5uZWwpICE9IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSkgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBTZXQgdGhlIFRJTSBjaGFubmVsIHN0YXRlICovCisgIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBDaGFubmVsLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSk7CisKKyAgLyogRW5hYmxlIHRoZSBPdXRwdXQgY29tcGFyZSBjaGFubmVsICovCisgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4X0VOQUJMRSk7CisKKyAgaWYgKElTX1RJTV9CUkVBS19JTlNUQU5DRShodGltLT5JbnN0YW5jZSkgIT0gUkVTRVQpIHsKKyAgICAvKiBFbmFibGUgdGhlIG1haW4gb3V0cHV0ICovCisgICAgX19IQUxfVElNX01PRV9FTkFCTEUoaHRpbSk7CisgIH0KKworICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwsIGV4Y2VwdCBpbiB0cmlnZ2VyIG1vZGUgd2hlcmUgZW5hYmxlIGlzIGF1dG9tYXRpY2FsbHkKKyAgICogZG9uZSB3aXRoIHRyaWdnZXIgKi8KKyAgaWYgKElTX1RJTV9TTEFWRV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpIHsKKyAgICB0bXBzbWNyID0gaHRpbS0+SW5zdGFuY2UtPlNNQ1IgJiBUSU1fU01DUl9TTVM7CisgICAgaWYgKCFJU19USU1fU0xBVkVNT0RFX1RSSUdHRVJfRU5BQkxFRCh0bXBzbWNyKSkgeworICAgICAgX19IQUxfVElNX0VOQUJMRShodGltKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgX19IQUxfVElNX0VOQUJMRShodGltKTsKKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgIFN0b3BzIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgc2lnbmFsIGdlbmVyYXRpb24uCisgKiBAcGFyYW0gIGh0aW0gVElNIE91dHB1dCBDb21wYXJlIGhhbmRsZQorICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVsIHRvIGJlIGRpc2FibGVkCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF81OiBUSU0gQ2hhbm5lbCA1IHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNjogVElNIENoYW5uZWwgNiBzZWxlY3RlZAorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT0NfU3RvcChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCkgeworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOworCisgIC8qIERpc2FibGUgdGhlIE91dHB1dCBjb21wYXJlIGNoYW5uZWwgKi8KKyAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hfRElTQUJMRSk7CisKKyAgaWYgKElTX1RJTV9CUkVBS19JTlNUQU5DRShodGltLT5JbnN0YW5jZSkgIT0gUkVTRVQpIHsKKyAgICAvKiBEaXNhYmxlIHRoZSBNYWluIE91dHB1dCAqLworICAgIF9fSEFMX1RJTV9NT0VfRElTQUJMRShodGltKTsKKyAgfQorCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7CisKKyAgLyogU2V0IHRoZSBUSU0gY2hhbm5lbCBzdGF0ZSAqLworICBUSU1fQ0hBTk5FTF9TVEFURV9TRVQoaHRpbSwgQ2hhbm5lbCwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICogQGJyaWVmICBTdGFydHMgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBzaWduYWwgZ2VuZXJhdGlvbiBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAqIEBwYXJhbSAgaHRpbSBUSU0gT3V0cHV0IENvbXBhcmUgaGFuZGxlCisgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWwgdG8gYmUgZW5hYmxlZAorICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PQ19TdGFydF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCkgeworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisgIHVpbnQzMl90IHRtcHNtY3I7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hfQ0hBTk5FTChodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOworCisgIC8qIENoZWNrIHRoZSBUSU0gY2hhbm5lbCBzdGF0ZSAqLworICBpZiAoVElNX0NIQU5ORUxfU1RBVEVfR0VUKGh0aW0sIENoYW5uZWwpICE9IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSkgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBTZXQgdGhlIFRJTSBjaGFubmVsIHN0YXRlICovCisgIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBDaGFubmVsLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSk7CisKKyAgc3dpdGNoIChDaGFubmVsKSB7CisgICAgY2FzZSBUSU1fQ0hBTk5FTF8xOiB7CisgICAgICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMSBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfSVQoaHRpbSwgVElNX0lUX0NDMSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzI6IHsKKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAyIGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9JVChodGltLCBUSU1fSVRfQ0MyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMzogeworICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDMgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzMpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF80OiB7CisgICAgICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgNCBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfSVQoaHRpbSwgVElNX0lUX0NDNCk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgICAgYnJlYWs7CisgIH0KKworICBpZiAoc3RhdHVzID09IEhBTF9PSykgeworICAgIC8qIEVuYWJsZSB0aGUgT3V0cHV0IGNvbXBhcmUgY2hhbm5lbCAqLworICAgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4X0VOQUJMRSk7CisKKyAgICBpZiAoSVNfVElNX0JSRUFLX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSAhPSBSRVNFVCkgeworICAgICAgLyogRW5hYmxlIHRoZSBtYWluIG91dHB1dCAqLworICAgICAgX19IQUxfVElNX01PRV9FTkFCTEUoaHRpbSk7CisgICAgfQorCisgICAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsLCBleGNlcHQgaW4gdHJpZ2dlciBtb2RlIHdoZXJlIGVuYWJsZSBpcworICAgICAqIGF1dG9tYXRpY2FsbHkgZG9uZSB3aXRoIHRyaWdnZXIgKi8KKyAgICBpZiAoSVNfVElNX1NMQVZFX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSkgeworICAgICAgdG1wc21jciA9IGh0aW0tPkluc3RhbmNlLT5TTUNSICYgVElNX1NNQ1JfU01TOworICAgICAgaWYgKCFJU19USU1fU0xBVkVNT0RFX1RSSUdHRVJfRU5BQkxFRCh0bXBzbWNyKSkgeworICAgICAgICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOworICAgIH0KKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBAYnJpZWYgIFN0b3BzIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgc2lnbmFsIGdlbmVyYXRpb24gaW4gaW50ZXJydXB0IG1vZGUuCisgKiBAcGFyYW0gIGh0aW0gVElNIE91dHB1dCBDb21wYXJlIGhhbmRsZQorICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVsIHRvIGJlIGRpc2FibGVkCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09DX1N0b3BfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCkgeworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hfQ0hBTk5FTChodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOworCisgIHN3aXRjaCAoQ2hhbm5lbCkgeworICAgIGNhc2UgVElNX0NIQU5ORUxfMTogeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAxIGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDMSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzI6IHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMiBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzIpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8zOiB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDMgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9JVChodGltLCBUSU1fSVRfQ0MzKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfNDogeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSA0IGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDNCk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgICAgYnJlYWs7CisgIH0KKworICBpZiAoc3RhdHVzID09IEhBTF9PSykgeworICAgIC8qIERpc2FibGUgdGhlIE91dHB1dCBjb21wYXJlIGNoYW5uZWwgKi8KKyAgICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCwgVElNX0NDeF9ESVNBQkxFKTsKKworICAgIGlmIChJU19USU1fQlJFQUtfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpICE9IFJFU0VUKSB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBNYWluIE91dHB1dCAqLworICAgICAgX19IQUxfVElNX01PRV9ESVNBQkxFKGh0aW0pOworICAgIH0KKworICAgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgICBfX0hBTF9USU1fRElTQUJMRShodGltKTsKKworICAgIC8qIFNldCB0aGUgVElNIGNoYW5uZWwgc3RhdGUgKi8KKyAgICBUSU1fQ0hBTk5FTF9TVEFURV9TRVQoaHRpbSwgQ2hhbm5lbCwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsKKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgVElNIE91dHB1dCBDb21wYXJlIHNpZ25hbCBnZW5lcmF0aW9uIGluIERNQSBtb2RlLgorICogQHBhcmFtICBodGltIFRJTSBPdXRwdXQgQ29tcGFyZSBoYW5kbGUKKyAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbCB0byBiZSBlbmFibGVkCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAqIEBwYXJhbSAgcERhdGEgVGhlIHNvdXJjZSBCdWZmZXIgYWRkcmVzcy4KKyAqIEBwYXJhbSAgTGVuZ3RoIFRoZSBsZW5ndGggb2YgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZCBmcm9tIG1lbW9yeSB0byBUSU0KKyAqIHBlcmlwaGVyYWwKKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09DX1N0YXJ0X0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwsIGNvbnN0IHVpbnQzMl90ICpwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IExlbmd0aCkgeworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisgIHVpbnQzMl90IHRtcHNtY3I7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hfQ0hBTk5FTChodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOworCisgIC8qIFNldCB0aGUgVElNIGNoYW5uZWwgc3RhdGUgKi8KKyAgaWYgKFRJTV9DSEFOTkVMX1NUQVRFX0dFVChodGltLCBDaGFubmVsKSA9PSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSkgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfSBlbHNlIGlmIChUSU1fQ0hBTk5FTF9TVEFURV9HRVQoaHRpbSwgQ2hhbm5lbCkgPT0KKyAgICAgICAgICAgICBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpIHsKKyAgICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChMZW5ndGggPT0gMFUpKSB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0gZWxzZSB7CisgICAgICBUSU1fQ0hBTk5FTF9TVEFURV9TRVQoaHRpbSwgQ2hhbm5lbCwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX0JVU1kpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgc3dpdGNoIChDaGFubmVsKSB7CisgICAgY2FzZSBUSU1fQ0hBTk5FTF8xOiB7CisgICAgICAvKiBTZXQgdGhlIERNQSBjb21wYXJlIGNhbGxiYWNrcyAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BRGVsYXlQdWxzZUNwbHQ7CisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPQorICAgICAgICAgIFRJTV9ETUFEZWxheVB1bHNlSGFsZkNwbHQ7CisKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3I7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLCAodWludDMyX3QpcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5DQ1IxLCBMZW5ndGgpICE9IEhBTF9PSykgeworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAxIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzI6IHsKKyAgICAgIC8qIFNldCB0aGUgRE1BIGNvbXBhcmUgY2FsbGJhY2tzICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFEZWxheVB1bHNlQ3BsdDsKKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9CisgICAgICAgICAgVElNX0RNQURlbGF5UHVsc2VIYWxmQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvcjsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0sICh1aW50MzJfdClwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkNDUjIsIExlbmd0aCkgIT0gSEFMX09LKSB7CisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKworICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDIgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMzogeworICAgICAgLyogU2V0IHRoZSBETUEgY29tcGFyZSBjYWxsYmFja3MgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQURlbGF5UHVsc2VDcGx0OworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0KKyAgICAgICAgICBUSU1fRE1BRGVsYXlQdWxzZUhhbGZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXSwgKHVpbnQzMl90KXBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+Q0NSMywgTGVuZ3RoKSAhPSBIQUxfT0spIHsKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDMgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MzKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfNDogeworICAgICAgLyogU2V0IHRoZSBETUEgY29tcGFyZSBjYWxsYmFja3MgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQURlbGF5UHVsc2VDcGx0OworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDNF0tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0KKyAgICAgICAgICBUSU1fRE1BRGVsYXlQdWxzZUhhbGZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDNF0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XSwgKHVpbnQzMl90KXBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+Q0NSNCwgTGVuZ3RoKSAhPSBIQUxfT0spIHsKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDQgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0M0KTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICBicmVhazsKKyAgfQorCisgIGlmIChzdGF0dXMgPT0gSEFMX09LKSB7CisgICAgLyogRW5hYmxlIHRoZSBPdXRwdXQgY29tcGFyZSBjaGFubmVsICovCisgICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hfRU5BQkxFKTsKKworICAgIGlmIChJU19USU1fQlJFQUtfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpICE9IFJFU0VUKSB7CisgICAgICAvKiBFbmFibGUgdGhlIG1haW4gb3V0cHV0ICovCisgICAgICBfX0hBTF9USU1fTU9FX0VOQUJMRShodGltKTsKKyAgICB9CisKKyAgICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwsIGV4Y2VwdCBpbiB0cmlnZ2VyIG1vZGUgd2hlcmUgZW5hYmxlIGlzCisgICAgICogYXV0b21hdGljYWxseSBkb25lIHdpdGggdHJpZ2dlciAqLworICAgIGlmIChJU19USU1fU0xBVkVfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKSB7CisgICAgICB0bXBzbWNyID0gaHRpbS0+SW5zdGFuY2UtPlNNQ1IgJiBUSU1fU01DUl9TTVM7CisgICAgICBpZiAoIUlTX1RJTV9TTEFWRU1PREVfVFJJR0dFUl9FTkFCTEVEKHRtcHNtY3IpKSB7CisgICAgICAgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7CisgICAgfQorICB9CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIEBicmllZiAgU3RvcHMgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBzaWduYWwgZ2VuZXJhdGlvbiBpbiBETUEgbW9kZS4KKyAqIEBwYXJhbSAgaHRpbSBUSU0gT3V0cHV0IENvbXBhcmUgaGFuZGxlCisgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWwgdG8gYmUgZGlzYWJsZWQKKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZAorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT0NfU3RvcF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpIHsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYX0NIQU5ORUwoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsKKworICBzd2l0Y2ggKENoYW5uZWwpIHsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzE6IHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMSBETUEgcmVxdWVzdCAqLworICAgICAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MxKTsKKyAgICAgICh2b2lkKUhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0pOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8yOiB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDIgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMik7CisgICAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMzogeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAzIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzMpOworICAgICAgKHZvaWQpSEFMX0RNQV9BYm9ydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzQ6IHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgNCBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBUSU1fRE1BX0NDNCk7CisgICAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICBicmVhazsKKyAgfQorCisgIGlmIChzdGF0dXMgPT0gSEFMX09LKSB7CisgICAgLyogRGlzYWJsZSB0aGUgT3V0cHV0IGNvbXBhcmUgY2hhbm5lbCAqLworICAgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4X0RJU0FCTEUpOworCisgICAgaWYgKElTX1RJTV9CUkVBS19JTlNUQU5DRShodGltLT5JbnN0YW5jZSkgIT0gUkVTRVQpIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIE1haW4gT3V0cHV0ICovCisgICAgICBfX0hBTF9USU1fTU9FX0RJU0FCTEUoaHRpbSk7CisgICAgfQorCisgICAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICAgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisgICAgLyogU2V0IHRoZSBUSU0gY2hhbm5lbCBzdGF0ZSAqLworICAgIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBDaGFubmVsLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOworICB9CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBUSU0gUFdNIGZ1bmN0aW9ucworICAqICBAYnJpZWYgICAgVElNIFBXTSBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBUSU0gUFdNIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgKCspIEluaXRpYWxpemUgYW5kIGNvbmZpZ3VyZSB0aGUgVElNIFBXTS4KKyAgICAoKykgRGUtaW5pdGlhbGl6ZSB0aGUgVElNIFBXTS4KKyAgICAoKykgU3RhcnQgdGhlIFRJTSBQV00uCisgICAgKCspIFN0b3AgdGhlIFRJTSBQV00uCisgICAgKCspIFN0YXJ0IHRoZSBUSU0gUFdNIGFuZCBlbmFibGUgaW50ZXJydXB0LgorICAgICgrKSBTdG9wIHRoZSBUSU0gUFdNIGFuZCBkaXNhYmxlIGludGVycnVwdC4KKyAgICAoKykgU3RhcnQgdGhlIFRJTSBQV00gYW5kIGVuYWJsZSBETUEgdHJhbnNmZXIuCisgICAgKCspIFN0b3AgdGhlIFRJTSBQV00gYW5kIGRpc2FibGUgRE1BIHRyYW5zZmVyLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworLyoqCisgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBUSU0gUFdNIFRpbWUgQmFzZSBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAorICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBUSU1fSGFuZGxlVHlwZURlZiBhbmQgaW5pdGlhbGl6ZXMgdGhlIGFzc29jaWF0ZWQKKyAqIGhhbmRsZS4KKyAqIEBub3RlICAgU3dpdGNoaW5nIGZyb20gQ2VudGVyIEFsaWduZWQgY291bnRlciBtb2RlIHRvIEVkZ2UgY291bnRlciBtb2RlIChvcgorICogcmV2ZXJzZSkgcmVxdWlyZXMgYSB0aW1lciByZXNldCB0byBhdm9pZCB1bmV4cGVjdGVkIGRpcmVjdGlvbiBkdWUgdG8gRElSIGJpdAorICogcmVhZG9ubHkgaW4gY2VudGVyIGFsaWduZWQgbW9kZS4gRXg6IGNhbGwgQHJlZiBIQUxfVElNX1BXTV9EZUluaXQoKSBiZWZvcmUKKyAqIEhBTF9USU1fUFdNX0luaXQoKQorICogQHBhcmFtICBodGltIFRJTSBQV00gaGFuZGxlCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9QV01fSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkgeworICAvKiBDaGVjayB0aGUgVElNIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmIChodGltID09IE5VTEwpIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NPVU5URVJfTU9ERShodGltLT5Jbml0LkNvdW50ZXJNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tESVZJU0lPTl9ESVYoaHRpbS0+SW5pdC5DbG9ja0RpdmlzaW9uKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fUEVSSU9EKGh0aW0sIGh0aW0tPkluaXQuUGVyaW9kKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fQVVUT1JFTE9BRF9QUkVMT0FEKGh0aW0tPkluaXQuQXV0b1JlbG9hZFByZWxvYWQpKTsKKworICBpZiAoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9SRVNFVCkgeworICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KKyAgICBodGltLT5Mb2NrID0gSEFMX1VOTE9DS0VEOworCisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIC8qIFJlc2V0IGludGVycnVwdCBjYWxsYmFja3MgdG8gbGVnYWN5IHdlYWsgY2FsbGJhY2tzICovCisgICAgVElNX1Jlc2V0Q2FsbGJhY2soaHRpbSk7CisKKyAgICBpZiAoaHRpbS0+UFdNX01zcEluaXRDYWxsYmFjayA9PSBOVUxMKSB7CisgICAgICBodGltLT5QV01fTXNwSW5pdENhbGxiYWNrID0gSEFMX1RJTV9QV01fTXNwSW5pdDsKKyAgICB9CisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIDogR1BJTywgQ0xPQ0ssIE5WSUMgKi8KKyAgICBodGltLT5QV01fTXNwSW5pdENhbGxiYWNrKGh0aW0pOworI2Vsc2UKKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgOiBHUElPLCBDTE9DSywgTlZJQyBhbmQgRE1BICovCisgICAgSEFMX1RJTV9QV01fTXNwSW5pdChodGltKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorCisgIC8qIFNldCB0aGUgVElNIHN0YXRlICovCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworCisgIC8qIEluaXQgdGhlIGJhc2UgdGltZSBmb3IgdGhlIFBXTSAqLworICBUSU1fQmFzZV9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsICZodGltLT5Jbml0KTsKKworICAvKiBJbml0aWFsaXplIHRoZSBETUEgYnVyc3Qgb3BlcmF0aW9uIHN0YXRlICovCisgIGh0aW0tPkRNQUJ1cnN0U3RhdGUgPSBIQUxfRE1BX0JVUlNUX1NUQVRFX1JFQURZOworCisgIC8qIEluaXRpYWxpemUgdGhlIFRJTSBjaGFubmVscyBzdGF0ZSAqLworICBUSU1fQ0hBTk5FTF9TVEFURV9TRVRfQUxMKGh0aW0sIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7CisgIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUX0FMTChodGltLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOworCisgIC8qIEluaXRpYWxpemUgdGhlIFRJTSBzdGF0ZSovCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRUFEWTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiAgRGVJbml0aWFsaXplcyB0aGUgVElNIHBlcmlwaGVyYWwKKyAqIEBwYXJhbSAgaHRpbSBUSU0gUFdNIGhhbmRsZQorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fUFdNX0RlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkgeworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgVElNIFBlcmlwaGVyYWwgQ2xvY2sgKi8KKyAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7CisKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIGlmIChodGltLT5QV01fTXNwRGVJbml0Q2FsbGJhY2sgPT0gTlVMTCkgeworICAgIGh0aW0tPlBXTV9Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9USU1fUFdNX01zcERlSW5pdDsKKyAgfQorICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLworICBodGltLT5QV01fTXNwRGVJbml0Q2FsbGJhY2soaHRpbSk7CisjZWxzZQorICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZTogR1BJTywgQ0xPQ0ssIE5WSUMgYW5kIERNQSAqLworICBIQUxfVElNX1BXTV9Nc3BEZUluaXQoaHRpbSk7CisjZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKyAgLyogQ2hhbmdlIHRoZSBETUEgYnVyc3Qgb3BlcmF0aW9uIHN0YXRlICovCisgIGh0aW0tPkRNQUJ1cnN0U3RhdGUgPSBIQUxfRE1BX0JVUlNUX1NUQVRFX1JFU0VUOworCisgIC8qIENoYW5nZSB0aGUgVElNIGNoYW5uZWxzIHN0YXRlICovCisgIFRJTV9DSEFOTkVMX1NUQVRFX1NFVF9BTEwoaHRpbSwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFU0VUKTsKKyAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVRfQUxMKGh0aW0sIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRVNFVCk7CisKKyAgLyogQ2hhbmdlIFRJTSBzdGF0ZSAqLworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVTRVQ7CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhodGltKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFRJTSBQV00gTVNQLgorICogQHBhcmFtICBodGltIFRJTSBQV00gaGFuZGxlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX193ZWFrIHZvaWQgSEFMX1RJTV9QV01fTXNwSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkgeworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1RJTV9QV01fTXNwSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAqIEBicmllZiAgRGVJbml0aWFsaXplcyBUSU0gUFdNIE1TUC4KKyAqIEBwYXJhbSAgaHRpbSBUSU0gUFdNIGhhbmRsZQorICogQHJldHZhbCBOb25lCisgKi8KK19fd2VhayB2b2lkIEhBTF9USU1fUFdNX01zcERlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkgeworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1RJTV9QV01fTXNwRGVJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICogQGJyaWVmICBTdGFydHMgdGhlIFBXTSBzaWduYWwgZ2VuZXJhdGlvbi4KKyAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWxzIHRvIGJlIGVuYWJsZWQKKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzU6IFRJTSBDaGFubmVsIDUgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF82OiBUSU0gQ2hhbm5lbCA2IHNlbGVjdGVkCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9QV01fU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpIHsKKyAgdWludDMyX3QgdG1wc21jcjsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOworCisgIC8qIENoZWNrIHRoZSBUSU0gY2hhbm5lbCBzdGF0ZSAqLworICBpZiAoVElNX0NIQU5ORUxfU1RBVEVfR0VUKGh0aW0sIENoYW5uZWwpICE9IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSkgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBTZXQgdGhlIFRJTSBjaGFubmVsIHN0YXRlICovCisgIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBDaGFubmVsLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSk7CisKKyAgLyogRW5hYmxlIHRoZSBDYXB0dXJlIGNvbXBhcmUgY2hhbm5lbCAqLworICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCwgVElNX0NDeF9FTkFCTEUpOworCisgIGlmIChJU19USU1fQlJFQUtfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpICE9IFJFU0VUKSB7CisgICAgLyogRW5hYmxlIHRoZSBtYWluIG91dHB1dCAqLworICAgIF9fSEFMX1RJTV9NT0VfRU5BQkxFKGh0aW0pOworICB9CisKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsLCBleGNlcHQgaW4gdHJpZ2dlciBtb2RlIHdoZXJlIGVuYWJsZSBpcyBhdXRvbWF0aWNhbGx5CisgICAqIGRvbmUgd2l0aCB0cmlnZ2VyICovCisgIGlmIChJU19USU1fU0xBVkVfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKSB7CisgICAgdG1wc21jciA9IGh0aW0tPkluc3RhbmNlLT5TTUNSICYgVElNX1NNQ1JfU01TOworICAgIGlmICghSVNfVElNX1NMQVZFTU9ERV9UUklHR0VSX0VOQUJMRUQodG1wc21jcikpIHsKKyAgICAgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7CisgICAgfQorICB9IGVsc2UgeworICAgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7CisgIH0KKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICogQGJyaWVmICBTdG9wcyB0aGUgUFdNIHNpZ25hbCBnZW5lcmF0aW9uLgorICogQHBhcmFtICBodGltIFRJTSBQV00gaGFuZGxlCisgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWxzIHRvIGJlIGRpc2FibGVkCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF81OiBUSU0gQ2hhbm5lbCA1IHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNjogVElNIENoYW5uZWwgNiBzZWxlY3RlZAorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fUFdNX1N0b3AoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpIHsKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsKKworICAvKiBEaXNhYmxlIHRoZSBDYXB0dXJlIGNvbXBhcmUgY2hhbm5lbCAqLworICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCwgVElNX0NDeF9ESVNBQkxFKTsKKworICBpZiAoSVNfVElNX0JSRUFLX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSAhPSBSRVNFVCkgeworICAgIC8qIERpc2FibGUgdGhlIE1haW4gT3V0cHV0ICovCisgICAgX19IQUxfVElNX01PRV9ESVNBQkxFKGh0aW0pOworICB9CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9USU1fRElTQUJMRShodGltKTsKKworICAvKiBTZXQgdGhlIFRJTSBjaGFubmVsIHN0YXRlICovCisgIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBDaGFubmVsLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgUFdNIHNpZ25hbCBnZW5lcmF0aW9uIGluIGludGVycnVwdCBtb2RlLgorICogQHBhcmFtICBodGltIFRJTSBQV00gaGFuZGxlCisgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWwgdG8gYmUgZW5hYmxlZAorICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9QV01fU3RhcnRfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKSB7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKyAgdWludDMyX3QgdG1wc21jcjsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWF9DSEFOTkVMKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7CisKKyAgLyogQ2hlY2sgdGhlIFRJTSBjaGFubmVsIHN0YXRlICovCisgIGlmIChUSU1fQ0hBTk5FTF9TVEFURV9HRVQoaHRpbSwgQ2hhbm5lbCkgIT0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKSB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFNldCB0aGUgVElNIGNoYW5uZWwgc3RhdGUgKi8KKyAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIENoYW5uZWwsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKTsKKworICBzd2l0Y2ggKENoYW5uZWwpIHsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzE6IHsKKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAxIGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9JVChodGltLCBUSU1fSVRfQ0MxKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMjogeworICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDIgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzIpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8zOiB7CisgICAgICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMyBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfSVQoaHRpbSwgVElNX0lUX0NDMyk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzQ6IHsKKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSA0IGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9JVChodGltLCBUSU1fSVRfQ0M0KTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICBicmVhazsKKyAgfQorCisgIGlmIChzdGF0dXMgPT0gSEFMX09LKSB7CisgICAgLyogRW5hYmxlIHRoZSBDYXB0dXJlIGNvbXBhcmUgY2hhbm5lbCAqLworICAgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4X0VOQUJMRSk7CisKKyAgICBpZiAoSVNfVElNX0JSRUFLX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSAhPSBSRVNFVCkgeworICAgICAgLyogRW5hYmxlIHRoZSBtYWluIG91dHB1dCAqLworICAgICAgX19IQUxfVElNX01PRV9FTkFCTEUoaHRpbSk7CisgICAgfQorCisgICAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsLCBleGNlcHQgaW4gdHJpZ2dlciBtb2RlIHdoZXJlIGVuYWJsZSBpcworICAgICAqIGF1dG9tYXRpY2FsbHkgZG9uZSB3aXRoIHRyaWdnZXIgKi8KKyAgICBpZiAoSVNfVElNX1NMQVZFX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSkgeworICAgICAgdG1wc21jciA9IGh0aW0tPkluc3RhbmNlLT5TTUNSICYgVElNX1NNQ1JfU01TOworICAgICAgaWYgKCFJU19USU1fU0xBVkVNT0RFX1RSSUdHRVJfRU5BQkxFRCh0bXBzbWNyKSkgeworICAgICAgICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOworICAgIH0KKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBAYnJpZWYgIFN0b3BzIHRoZSBQV00gc2lnbmFsIGdlbmVyYXRpb24gaW4gaW50ZXJydXB0IG1vZGUuCisgKiBAcGFyYW0gIGh0aW0gVElNIFBXTSBoYW5kbGUKKyAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbHMgdG8gYmUgZGlzYWJsZWQKKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZAorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fUFdNX1N0b3BfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpIHsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYX0NIQU5ORUwoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsKKworICBzd2l0Y2ggKENoYW5uZWwpIHsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzE6IHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMSBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzEpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8yOiB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDIgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9JVChodGltLCBUSU1fSVRfQ0MyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMzogeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAzIGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDMyk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzQ6IHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgNCBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzQpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKHN0YXR1cyA9PSBIQUxfT0spIHsKKyAgICAvKiBEaXNhYmxlIHRoZSBDYXB0dXJlIGNvbXBhcmUgY2hhbm5lbCAqLworICAgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4X0RJU0FCTEUpOworCisgICAgaWYgKElTX1RJTV9CUkVBS19JTlNUQU5DRShodGltLT5JbnN0YW5jZSkgIT0gUkVTRVQpIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIE1haW4gT3V0cHV0ICovCisgICAgICBfX0hBTF9USU1fTU9FX0RJU0FCTEUoaHRpbSk7CisgICAgfQorCisgICAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICAgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisgICAgLyogU2V0IHRoZSBUSU0gY2hhbm5lbCBzdGF0ZSAqLworICAgIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBDaGFubmVsLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOworICB9CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIEBicmllZiAgU3RhcnRzIHRoZSBUSU0gUFdNIHNpZ25hbCBnZW5lcmF0aW9uIGluIERNQSBtb2RlLgorICogQHBhcmFtICBodGltIFRJTSBQV00gaGFuZGxlCisgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWxzIHRvIGJlIGVuYWJsZWQKKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZAorICogQHBhcmFtICBwRGF0YSBUaGUgc291cmNlIEJ1ZmZlciBhZGRyZXNzLgorICogQHBhcmFtICBMZW5ndGggVGhlIGxlbmd0aCBvZiBkYXRhIHRvIGJlIHRyYW5zZmVycmVkIGZyb20gbWVtb3J5IHRvIFRJTQorICogcGVyaXBoZXJhbAorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fUFdNX1N0YXJ0X0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsLCBjb25zdCB1aW50MzJfdCAqcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgTGVuZ3RoKSB7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKyAgdWludDMyX3QgdG1wc21jcjsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWF9DSEFOTkVMKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7CisKKyAgLyogU2V0IHRoZSBUSU0gY2hhbm5lbCBzdGF0ZSAqLworICBpZiAoVElNX0NIQU5ORUxfU1RBVEVfR0VUKGh0aW0sIENoYW5uZWwpID09IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKSB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9IGVsc2UgaWYgKFRJTV9DSEFOTkVMX1NUQVRFX0dFVChodGltLCBDaGFubmVsKSA9PQorICAgICAgICAgICAgIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSkgeworICAgIGlmICgocERhdGEgPT0gTlVMTCkgfHwgKExlbmd0aCA9PSAwVSkpIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfSBlbHNlIHsKKyAgICAgIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBDaGFubmVsLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSk7CisgICAgfQorICB9IGVsc2UgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICBzd2l0Y2ggKENoYW5uZWwpIHsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzE6IHsKKyAgICAgIC8qIFNldCB0aGUgRE1BIGNvbXBhcmUgY2FsbGJhY2tzICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFEZWxheVB1bHNlQ3BsdDsKKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9CisgICAgICAgICAgVElNX0RNQURlbGF5UHVsc2VIYWxmQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvcjsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0sICh1aW50MzJfdClwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkNDUjEsIExlbmd0aCkgIT0gSEFMX09LKSB7CisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKworICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDEgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MxKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMjogeworICAgICAgLyogU2V0IHRoZSBETUEgY29tcGFyZSBjYWxsYmFja3MgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQURlbGF5UHVsc2VDcGx0OworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0KKyAgICAgICAgICBUSU1fRE1BRGVsYXlQdWxzZUhhbGZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXSwgKHVpbnQzMl90KXBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+Q0NSMiwgTGVuZ3RoKSAhPSBIQUxfT0spIHsKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDIgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMzogeworICAgICAgLyogU2V0IHRoZSBETUEgY29tcGFyZSBjYWxsYmFja3MgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQURlbGF5UHVsc2VDcGx0OworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0KKyAgICAgICAgICBUSU1fRE1BRGVsYXlQdWxzZUhhbGZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXSwgKHVpbnQzMl90KXBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+Q0NSMywgTGVuZ3RoKSAhPSBIQUxfT0spIHsKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgLyogRW5hYmxlIHRoZSBUSU0gT3V0cHV0IENhcHR1cmUvQ29tcGFyZSAzIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MzKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfNDogeworICAgICAgLyogU2V0IHRoZSBETUEgY29tcGFyZSBjYWxsYmFja3MgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQURlbGF5UHVsc2VDcGx0OworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDNF0tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0KKyAgICAgICAgICBUSU1fRE1BRGVsYXlQdWxzZUhhbGZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDNF0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XSwgKHVpbnQzMl90KXBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+Q0NSNCwgTGVuZ3RoKSAhPSBIQUxfT0spIHsKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDQgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0M0KTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICBicmVhazsKKyAgfQorCisgIGlmIChzdGF0dXMgPT0gSEFMX09LKSB7CisgICAgLyogRW5hYmxlIHRoZSBDYXB0dXJlIGNvbXBhcmUgY2hhbm5lbCAqLworICAgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4X0VOQUJMRSk7CisKKyAgICBpZiAoSVNfVElNX0JSRUFLX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSAhPSBSRVNFVCkgeworICAgICAgLyogRW5hYmxlIHRoZSBtYWluIG91dHB1dCAqLworICAgICAgX19IQUxfVElNX01PRV9FTkFCTEUoaHRpbSk7CisgICAgfQorCisgICAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsLCBleGNlcHQgaW4gdHJpZ2dlciBtb2RlIHdoZXJlIGVuYWJsZSBpcworICAgICAqIGF1dG9tYXRpY2FsbHkgZG9uZSB3aXRoIHRyaWdnZXIgKi8KKyAgICBpZiAoSVNfVElNX1NMQVZFX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSkgeworICAgICAgdG1wc21jciA9IGh0aW0tPkluc3RhbmNlLT5TTUNSICYgVElNX1NNQ1JfU01TOworICAgICAgaWYgKCFJU19USU1fU0xBVkVNT0RFX1RSSUdHRVJfRU5BQkxFRCh0bXBzbWNyKSkgeworICAgICAgICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOworICAgIH0KKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBAYnJpZWYgIFN0b3BzIHRoZSBUSU0gUFdNIHNpZ25hbCBnZW5lcmF0aW9uIGluIERNQSBtb2RlLgorICogQHBhcmFtICBodGltIFRJTSBQV00gaGFuZGxlCisgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWxzIHRvIGJlIGRpc2FibGVkCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1BXTV9TdG9wX0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpIHsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYX0NIQU5ORUwoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsKKworICBzd2l0Y2ggKENoYW5uZWwpIHsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzE6IHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMSBETUEgcmVxdWVzdCAqLworICAgICAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MxKTsKKyAgICAgICh2b2lkKUhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0pOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8yOiB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDIgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMik7CisgICAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMzogeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAzIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzMpOworICAgICAgKHZvaWQpSEFMX0RNQV9BYm9ydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzQ6IHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgNCBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBUSU1fRE1BX0NDNCk7CisgICAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICBicmVhazsKKyAgfQorCisgIGlmIChzdGF0dXMgPT0gSEFMX09LKSB7CisgICAgLyogRGlzYWJsZSB0aGUgQ2FwdHVyZSBjb21wYXJlIGNoYW5uZWwgKi8KKyAgICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCwgVElNX0NDeF9ESVNBQkxFKTsKKworICAgIGlmIChJU19USU1fQlJFQUtfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpICE9IFJFU0VUKSB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBNYWluIE91dHB1dCAqLworICAgICAgX19IQUxfVElNX01PRV9ESVNBQkxFKGh0aW0pOworICAgIH0KKworICAgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgICBfX0hBTF9USU1fRElTQUJMRShodGltKTsKKworICAgIC8qIFNldCB0aGUgVElNIGNoYW5uZWwgc3RhdGUgKi8KKyAgICBUSU1fQ0hBTk5FTF9TVEFURV9TRVQoaHRpbSwgQ2hhbm5lbCwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsKKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQgVElNIElucHV0IENhcHR1cmUgZnVuY3Rpb25zCisgICogIEBicmllZiAgICBUSU0gSW5wdXQgQ2FwdHVyZSBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAjIyMjIyBUSU0gSW5wdXQgQ2FwdHVyZSBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgWy4uXQorICAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICgrKSBJbml0aWFsaXplIGFuZCBjb25maWd1cmUgdGhlIFRJTSBJbnB1dCBDYXB0dXJlLgorICAgKCspIERlLWluaXRpYWxpemUgdGhlIFRJTSBJbnB1dCBDYXB0dXJlLgorICAgKCspIFN0YXJ0IHRoZSBUSU0gSW5wdXQgQ2FwdHVyZS4KKyAgICgrKSBTdG9wIHRoZSBUSU0gSW5wdXQgQ2FwdHVyZS4KKyAgICgrKSBTdGFydCB0aGUgVElNIElucHV0IENhcHR1cmUgYW5kIGVuYWJsZSBpbnRlcnJ1cHQuCisgICAoKykgU3RvcCB0aGUgVElNIElucHV0IENhcHR1cmUgYW5kIGRpc2FibGUgaW50ZXJydXB0LgorICAgKCspIFN0YXJ0IHRoZSBUSU0gSW5wdXQgQ2FwdHVyZSBhbmQgZW5hYmxlIERNQSB0cmFuc2Zlci4KKyAgICgrKSBTdG9wIHRoZSBUSU0gSW5wdXQgQ2FwdHVyZSBhbmQgZGlzYWJsZSBETUEgdHJhbnNmZXIuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisvKioKKyAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFRJTSBJbnB1dCBDYXB0dXJlIFRpbWUgYmFzZSBhY2NvcmRpbmcgdG8gdGhlCisgKiBzcGVjaWZpZWQgcGFyYW1ldGVycyBpbiB0aGUgVElNX0hhbmRsZVR5cGVEZWYgYW5kIGluaXRpYWxpemVzIHRoZSBhc3NvY2lhdGVkCisgKiBoYW5kbGUuCisgKiBAbm90ZSAgIFN3aXRjaGluZyBmcm9tIENlbnRlciBBbGlnbmVkIGNvdW50ZXIgbW9kZSB0byBFZGdlIGNvdW50ZXIgbW9kZSAob3IKKyAqIHJldmVyc2UpIHJlcXVpcmVzIGEgdGltZXIgcmVzZXQgdG8gYXZvaWQgdW5leHBlY3RlZCBkaXJlY3Rpb24gZHVlIHRvIERJUiBiaXQKKyAqIHJlYWRvbmx5IGluIGNlbnRlciBhbGlnbmVkIG1vZGUuIEV4OiBjYWxsIEByZWYgSEFMX1RJTV9JQ19EZUluaXQoKSBiZWZvcmUKKyAqIEhBTF9USU1fSUNfSW5pdCgpCisgKiBAcGFyYW0gIGh0aW0gVElNIElucHV0IENhcHR1cmUgaGFuZGxlCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9JQ19Jbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKSB7CisgIC8qIENoZWNrIHRoZSBUSU0gaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYgKGh0aW0gPT0gTlVMTCkgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fQ09VTlRFUl9NT0RFKGh0aW0tPkluaXQuQ291bnRlck1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTE9DS0RJVklTSU9OX0RJVihodGltLT5Jbml0LkNsb2NrRGl2aXNpb24pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9QRVJJT0QoaHRpbSwgaHRpbS0+SW5pdC5QZXJpb2QpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9BVVRPUkVMT0FEX1BSRUxPQUQoaHRpbS0+SW5pdC5BdXRvUmVsb2FkUHJlbG9hZCkpOworCisgIGlmIChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX1JFU0VUKSB7CisgICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLworICAgIGh0aW0tPkxvY2sgPSBIQUxfVU5MT0NLRUQ7CisKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgLyogUmVzZXQgaW50ZXJydXB0IGNhbGxiYWNrcyB0byBsZWdhY3kgd2VhayBjYWxsYmFja3MgKi8KKyAgICBUSU1fUmVzZXRDYWxsYmFjayhodGltKTsKKworICAgIGlmIChodGltLT5JQ19Nc3BJbml0Q2FsbGJhY2sgPT0gTlVMTCkgeworICAgICAgaHRpbS0+SUNfTXNwSW5pdENhbGxiYWNrID0gSEFMX1RJTV9JQ19Nc3BJbml0OworICAgIH0KKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgOiBHUElPLCBDTE9DSywgTlZJQyAqLworICAgIGh0aW0tPklDX01zcEluaXRDYWxsYmFjayhodGltKTsKKyNlbHNlCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIDogR1BJTywgQ0xPQ0ssIE5WSUMgYW5kIERNQSAqLworICAgIEhBTF9USU1fSUNfTXNwSW5pdChodGltKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorCisgIC8qIFNldCB0aGUgVElNIHN0YXRlICovCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworCisgIC8qIEluaXQgdGhlIGJhc2UgdGltZSBmb3IgdGhlIGlucHV0IGNhcHR1cmUgKi8KKyAgVElNX0Jhc2VfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCAmaHRpbS0+SW5pdCk7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgRE1BIGJ1cnN0IG9wZXJhdGlvbiBzdGF0ZSAqLworICBodGltLT5ETUFCdXJzdFN0YXRlID0gSEFMX0RNQV9CVVJTVF9TVEFURV9SRUFEWTsKKworICAvKiBJbml0aWFsaXplIHRoZSBUSU0gY2hhbm5lbHMgc3RhdGUgKi8KKyAgVElNX0NIQU5ORUxfU1RBVEVfU0VUX0FMTChodGltLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOworICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVF9BTEwoaHRpbSwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsKKworICAvKiBJbml0aWFsaXplIHRoZSBUSU0gc3RhdGUqLworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZXMgdGhlIFRJTSBwZXJpcGhlcmFsCisgKiBAcGFyYW0gIGh0aW0gVElNIElucHV0IENhcHR1cmUgaGFuZGxlCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9JQ19EZUluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pIHsKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIFRJTSBQZXJpcGhlcmFsIENsb2NrICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBpZiAoaHRpbS0+SUNfTXNwRGVJbml0Q2FsbGJhY2sgPT0gTlVMTCkgeworICAgIGh0aW0tPklDX01zcERlSW5pdENhbGxiYWNrID0gSEFMX1RJTV9JQ19Nc3BEZUluaXQ7CisgIH0KKyAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgaHRpbS0+SUNfTXNwRGVJbml0Q2FsbGJhY2soaHRpbSk7CisjZWxzZQorICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZTogR1BJTywgQ0xPQ0ssIE5WSUMgYW5kIERNQSAqLworICBIQUxfVElNX0lDX01zcERlSW5pdChodGltKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworICAvKiBDaGFuZ2UgdGhlIERNQSBidXJzdCBvcGVyYXRpb24gc3RhdGUgKi8KKyAgaHRpbS0+RE1BQnVyc3RTdGF0ZSA9IEhBTF9ETUFfQlVSU1RfU1RBVEVfUkVTRVQ7CisKKyAgLyogQ2hhbmdlIHRoZSBUSU0gY2hhbm5lbHMgc3RhdGUgKi8KKyAgVElNX0NIQU5ORUxfU1RBVEVfU0VUX0FMTChodGltLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVTRVQpOworICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVF9BTEwoaHRpbSwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFU0VUKTsKKworICAvKiBDaGFuZ2UgVElNIHN0YXRlICovCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRVNFVDsKKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGh0aW0pOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgVElNIElucHV0IENhcHR1cmUgTVNQLgorICogQHBhcmFtICBodGltIFRJTSBJbnB1dCBDYXB0dXJlIGhhbmRsZQorICogQHJldHZhbCBOb25lCisgKi8KK19fd2VhayB2b2lkIEhBTF9USU1fSUNfTXNwSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkgeworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1RJTV9JQ19Nc3BJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICogQGJyaWVmICBEZUluaXRpYWxpemVzIFRJTSBJbnB1dCBDYXB0dXJlIE1TUC4KKyAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX193ZWFrIHZvaWQgSEFMX1RJTV9JQ19Nc3BEZUluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pIHsKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHRpbSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9USU1fSUNfTXNwRGVJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICogQGJyaWVmICBTdGFydHMgdGhlIFRJTSBJbnB1dCBDYXB0dXJlIG1lYXN1cmVtZW50LgorICogQHBhcmFtICBodGltIFRJTSBJbnB1dCBDYXB0dXJlIGhhbmRsZQorICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVscyB0byBiZSBlbmFibGVkCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0lDX1N0YXJ0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKSB7CisgIHVpbnQzMl90IHRtcHNtY3I7CisgIEhBTF9USU1fQ2hhbm5lbFN0YXRlVHlwZURlZiBjaGFubmVsX3N0YXRlID0KKyAgICAgIFRJTV9DSEFOTkVMX1NUQVRFX0dFVChodGltLCBDaGFubmVsKTsKKyAgSEFMX1RJTV9DaGFubmVsU3RhdGVUeXBlRGVmIGNvbXBsZW1lbnRhcnlfY2hhbm5lbF9zdGF0ZSA9CisgICAgICBUSU1fQ0hBTk5FTF9OX1NUQVRFX0dFVChodGltLCBDaGFubmVsKTsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWF9DSEFOTkVMKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7CisKKyAgLyogQ2hlY2sgdGhlIFRJTSBjaGFubmVsIHN0YXRlICovCisgIGlmICgoY2hhbm5lbF9zdGF0ZSAhPSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpIHx8CisgICAgICAoY29tcGxlbWVudGFyeV9jaGFubmVsX3N0YXRlICE9IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSkpIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogU2V0IHRoZSBUSU0gY2hhbm5lbCBzdGF0ZSAqLworICBUSU1fQ0hBTk5FTF9TVEFURV9TRVQoaHRpbSwgQ2hhbm5lbCwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX0JVU1kpOworICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBDaGFubmVsLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSk7CisKKyAgLyogRW5hYmxlIHRoZSBJbnB1dCBDYXB0dXJlIGNoYW5uZWwgKi8KKyAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hfRU5BQkxFKTsKKworICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwsIGV4Y2VwdCBpbiB0cmlnZ2VyIG1vZGUgd2hlcmUgZW5hYmxlIGlzIGF1dG9tYXRpY2FsbHkKKyAgICogZG9uZSB3aXRoIHRyaWdnZXIgKi8KKyAgaWYgKElTX1RJTV9TTEFWRV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpIHsKKyAgICB0bXBzbWNyID0gaHRpbS0+SW5zdGFuY2UtPlNNQ1IgJiBUSU1fU01DUl9TTVM7CisgICAgaWYgKCFJU19USU1fU0xBVkVNT0RFX1RSSUdHRVJfRU5BQkxFRCh0bXBzbWNyKSkgeworICAgICAgX19IQUxfVElNX0VOQUJMRShodGltKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgX19IQUxfVElNX0VOQUJMRShodGltKTsKKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgIFN0b3BzIHRoZSBUSU0gSW5wdXQgQ2FwdHVyZSBtZWFzdXJlbWVudC4KKyAqIEBwYXJhbSAgaHRpbSBUSU0gSW5wdXQgQ2FwdHVyZSBoYW5kbGUKKyAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbHMgdG8gYmUgZGlzYWJsZWQKKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZAorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fSUNfU3RvcChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCkgeworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWF9DSEFOTkVMKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7CisKKyAgLyogRGlzYWJsZSB0aGUgSW5wdXQgQ2FwdHVyZSBjaGFubmVsICovCisgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4X0RJU0FCTEUpOworCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7CisKKyAgLyogU2V0IHRoZSBUSU0gY2hhbm5lbCBzdGF0ZSAqLworICBUSU1fQ0hBTk5FTF9TVEFURV9TRVQoaHRpbSwgQ2hhbm5lbCwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsKKyAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgQ2hhbm5lbCwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICogQGJyaWVmICBTdGFydHMgdGhlIFRJTSBJbnB1dCBDYXB0dXJlIG1lYXN1cmVtZW50IGluIGludGVycnVwdCBtb2RlLgorICogQHBhcmFtICBodGltIFRJTSBJbnB1dCBDYXB0dXJlIGhhbmRsZQorICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVscyB0byBiZSBlbmFibGVkCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0lDX1N0YXJ0X0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKSB7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKyAgdWludDMyX3QgdG1wc21jcjsKKworICBIQUxfVElNX0NoYW5uZWxTdGF0ZVR5cGVEZWYgY2hhbm5lbF9zdGF0ZSA9CisgICAgICBUSU1fQ0hBTk5FTF9TVEFURV9HRVQoaHRpbSwgQ2hhbm5lbCk7CisgIEhBTF9USU1fQ2hhbm5lbFN0YXRlVHlwZURlZiBjb21wbGVtZW50YXJ5X2NoYW5uZWxfc3RhdGUgPQorICAgICAgVElNX0NIQU5ORUxfTl9TVEFURV9HRVQoaHRpbSwgQ2hhbm5lbCk7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hfQ0hBTk5FTChodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOworCisgIC8qIENoZWNrIHRoZSBUSU0gY2hhbm5lbCBzdGF0ZSAqLworICBpZiAoKGNoYW5uZWxfc3RhdGUgIT0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKSB8fAorICAgICAgKGNvbXBsZW1lbnRhcnlfY2hhbm5lbF9zdGF0ZSAhPSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpKSB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFNldCB0aGUgVElNIGNoYW5uZWwgc3RhdGUgKi8KKyAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIENoYW5uZWwsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKTsKKyAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgQ2hhbm5lbCwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX0JVU1kpOworCisgIHN3aXRjaCAoQ2hhbm5lbCkgeworICAgIGNhc2UgVElNX0NIQU5ORUxfMTogeworICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDEgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzEpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8yOiB7CisgICAgICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMiBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfSVQoaHRpbSwgVElNX0lUX0NDMik7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzM6IHsKKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAzIGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9JVChodGltLCBUSU1fSVRfQ0MzKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfNDogeworICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDQgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzQpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKHN0YXR1cyA9PSBIQUxfT0spIHsKKyAgICAvKiBFbmFibGUgdGhlIElucHV0IENhcHR1cmUgY2hhbm5lbCAqLworICAgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4X0VOQUJMRSk7CisKKyAgICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwsIGV4Y2VwdCBpbiB0cmlnZ2VyIG1vZGUgd2hlcmUgZW5hYmxlIGlzCisgICAgICogYXV0b21hdGljYWxseSBkb25lIHdpdGggdHJpZ2dlciAqLworICAgIGlmIChJU19USU1fU0xBVkVfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKSB7CisgICAgICB0bXBzbWNyID0gaHRpbS0+SW5zdGFuY2UtPlNNQ1IgJiBUSU1fU01DUl9TTVM7CisgICAgICBpZiAoIUlTX1RJTV9TTEFWRU1PREVfVFJJR0dFUl9FTkFCTEVEKHRtcHNtY3IpKSB7CisgICAgICAgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7CisgICAgfQorICB9CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIEBicmllZiAgU3RvcHMgdGhlIFRJTSBJbnB1dCBDYXB0dXJlIG1lYXN1cmVtZW50IGluIGludGVycnVwdCBtb2RlLgorICogQHBhcmFtICBodGltIFRJTSBJbnB1dCBDYXB0dXJlIGhhbmRsZQorICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVscyB0byBiZSBkaXNhYmxlZAorICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9JQ19TdG9wX0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpIHsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYX0NIQU5ORUwoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsKKworICBzd2l0Y2ggKENoYW5uZWwpIHsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzE6IHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMSBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzEpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8yOiB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDIgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9JVChodGltLCBUSU1fSVRfQ0MyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMzogeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAzIGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDMyk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzQ6IHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgNCBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzQpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKHN0YXR1cyA9PSBIQUxfT0spIHsKKyAgICAvKiBEaXNhYmxlIHRoZSBJbnB1dCBDYXB0dXJlIGNoYW5uZWwgKi8KKyAgICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCwgVElNX0NDeF9ESVNBQkxFKTsKKworICAgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgICBfX0hBTF9USU1fRElTQUJMRShodGltKTsKKworICAgIC8qIFNldCB0aGUgVElNIGNoYW5uZWwgc3RhdGUgKi8KKyAgICBUSU1fQ0hBTk5FTF9TVEFURV9TRVQoaHRpbSwgQ2hhbm5lbCwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsKKyAgICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBDaGFubmVsLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOworICB9CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIEBicmllZiAgU3RhcnRzIHRoZSBUSU0gSW5wdXQgQ2FwdHVyZSBtZWFzdXJlbWVudCBpbiBETUEgbW9kZS4KKyAqIEBwYXJhbSAgaHRpbSBUSU0gSW5wdXQgQ2FwdHVyZSBoYW5kbGUKKyAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbHMgdG8gYmUgZW5hYmxlZAorICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkCisgKiBAcGFyYW0gIHBEYXRhIFRoZSBkZXN0aW5hdGlvbiBCdWZmZXIgYWRkcmVzcy4KKyAqIEBwYXJhbSAgTGVuZ3RoIFRoZSBsZW5ndGggb2YgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZCBmcm9tIFRJTSBwZXJpcGhlcmFsIHRvCisgKiBtZW1vcnkuCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9JQ19TdGFydF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCAqcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBMZW5ndGgpIHsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworICB1aW50MzJfdCB0bXBzbWNyOworCisgIEhBTF9USU1fQ2hhbm5lbFN0YXRlVHlwZURlZiBjaGFubmVsX3N0YXRlID0KKyAgICAgIFRJTV9DSEFOTkVMX1NUQVRFX0dFVChodGltLCBDaGFubmVsKTsKKyAgSEFMX1RJTV9DaGFubmVsU3RhdGVUeXBlRGVmIGNvbXBsZW1lbnRhcnlfY2hhbm5lbF9zdGF0ZSA9CisgICAgICBUSU1fQ0hBTk5FTF9OX1NUQVRFX0dFVChodGltLCBDaGFubmVsKTsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWF9DSEFOTkVMKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fRE1BX0NDX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgLyogU2V0IHRoZSBUSU0gY2hhbm5lbCBzdGF0ZSAqLworICBpZiAoKGNoYW5uZWxfc3RhdGUgPT0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX0JVU1kpIHx8CisgICAgICAoY29tcGxlbWVudGFyeV9jaGFubmVsX3N0YXRlID09IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKSkgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfSBlbHNlIGlmICgoY2hhbm5lbF9zdGF0ZSA9PSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpICYmCisgICAgICAgICAgICAgKGNvbXBsZW1lbnRhcnlfY2hhbm5lbF9zdGF0ZSA9PSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpKSB7CisgICAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoTGVuZ3RoID09IDBVKSkgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9IGVsc2UgeworICAgICAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIENoYW5uZWwsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKTsKKyAgICAgIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIENoYW5uZWwsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIEVuYWJsZSB0aGUgSW5wdXQgQ2FwdHVyZSBjaGFubmVsICovCisgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4X0VOQUJMRSk7CisKKyAgc3dpdGNoIChDaGFubmVsKSB7CisgICAgY2FzZSBUSU1fQ0hBTk5FTF8xOiB7CisgICAgICAvKiBTZXQgdGhlIERNQSBjYXB0dXJlIGNhbGxiYWNrcyAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BQ2FwdHVyZUNwbHQ7CisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BQ2FwdHVyZUhhbGZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkNDUjEsICh1aW50MzJfdClwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExlbmd0aCkgIT0gSEFMX09LKSB7CisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAxIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzI6IHsKKyAgICAgIC8qIFNldCB0aGUgRE1BIGNhcHR1cmUgY2FsbGJhY2tzICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFDYXB0dXJlQ3BsdDsKKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFRJTV9ETUFDYXB0dXJlSGFsZkNwbHQ7CisKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3I7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+Q0NSMiwgKHVpbnQzMl90KXBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVuZ3RoKSAhPSBIQUxfT0spIHsKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDIgIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMik7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzM6IHsKKyAgICAgIC8qIFNldCB0aGUgRE1BIGNhcHR1cmUgY2FsbGJhY2tzICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFDYXB0dXJlQ3BsdDsKKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFRJTV9ETUFDYXB0dXJlSGFsZkNwbHQ7CisKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3I7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+Q0NSMywgKHVpbnQzMl90KXBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVuZ3RoKSAhPSBIQUxfT0spIHsKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDMgIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMyk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzQ6IHsKKyAgICAgIC8qIFNldCB0aGUgRE1BIGNhcHR1cmUgY2FsbGJhY2tzICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFDYXB0dXJlQ3BsdDsKKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFRJTV9ETUFDYXB0dXJlSGFsZkNwbHQ7CisKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3I7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+Q0NSNCwgKHVpbnQzMl90KXBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVuZ3RoKSAhPSBIQUxfT0spIHsKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDQgIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBUSU1fRE1BX0NDNCk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgICAgYnJlYWs7CisgIH0KKworICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwsIGV4Y2VwdCBpbiB0cmlnZ2VyIG1vZGUgd2hlcmUgZW5hYmxlIGlzIGF1dG9tYXRpY2FsbHkKKyAgICogZG9uZSB3aXRoIHRyaWdnZXIgKi8KKyAgaWYgKElTX1RJTV9TTEFWRV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpIHsKKyAgICB0bXBzbWNyID0gaHRpbS0+SW5zdGFuY2UtPlNNQ1IgJiBUSU1fU01DUl9TTVM7CisgICAgaWYgKCFJU19USU1fU0xBVkVNT0RFX1RSSUdHRVJfRU5BQkxFRCh0bXBzbWNyKSkgeworICAgICAgX19IQUxfVElNX0VOQUJMRShodGltKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgX19IQUxfVElNX0VOQUJMRShodGltKTsKKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBAYnJpZWYgIFN0b3BzIHRoZSBUSU0gSW5wdXQgQ2FwdHVyZSBtZWFzdXJlbWVudCBpbiBETUEgbW9kZS4KKyAqIEBwYXJhbSAgaHRpbSBUSU0gSW5wdXQgQ2FwdHVyZSBoYW5kbGUKKyAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbHMgdG8gYmUgZGlzYWJsZWQKKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZAorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fSUNfU3RvcF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpIHsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYX0NIQU5ORUwoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9ETUFfQ0NfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICAvKiBEaXNhYmxlIHRoZSBJbnB1dCBDYXB0dXJlIGNoYW5uZWwgKi8KKyAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hfRElTQUJMRSk7CisKKyAgc3dpdGNoIChDaGFubmVsKSB7CisgICAgY2FzZSBUSU1fQ0hBTk5FTF8xOiB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDEgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMSk7CisgICAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMjogeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAyIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzIpOworICAgICAgKHZvaWQpSEFMX0RNQV9BYm9ydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzM6IHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMyAgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMyk7CisgICAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfNDogeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSA0ICBETUEgcmVxdWVzdCAqLworICAgICAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0M0KTsKKyAgICAgICh2b2lkKUhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDNF0pOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKHN0YXR1cyA9PSBIQUxfT0spIHsKKyAgICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgICAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7CisKKyAgICAvKiBTZXQgdGhlIFRJTSBjaGFubmVsIHN0YXRlICovCisgICAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIENoYW5uZWwsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7CisgICAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgQ2hhbm5lbCwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsKKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHN0YXR1czsKK30KKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA1IFRJTSBPbmUgUHVsc2UgZnVuY3Rpb25zCisgICogIEBicmllZiAgICBUSU0gT25lIFB1bHNlIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBUSU0gT25lIFB1bHNlIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgKCspIEluaXRpYWxpemUgYW5kIGNvbmZpZ3VyZSB0aGUgVElNIE9uZSBQdWxzZS4KKyAgICAoKykgRGUtaW5pdGlhbGl6ZSB0aGUgVElNIE9uZSBQdWxzZS4KKyAgICAoKykgU3RhcnQgdGhlIFRJTSBPbmUgUHVsc2UuCisgICAgKCspIFN0b3AgdGhlIFRJTSBPbmUgUHVsc2UuCisgICAgKCspIFN0YXJ0IHRoZSBUSU0gT25lIFB1bHNlIGFuZCBlbmFibGUgaW50ZXJydXB0LgorICAgICgrKSBTdG9wIHRoZSBUSU0gT25lIFB1bHNlIGFuZCBkaXNhYmxlIGludGVycnVwdC4KKyAgICAoKykgU3RhcnQgdGhlIFRJTSBPbmUgUHVsc2UgYW5kIGVuYWJsZSBETUEgdHJhbnNmZXIuCisgICAgKCspIFN0b3AgdGhlIFRJTSBPbmUgUHVsc2UgYW5kIGRpc2FibGUgRE1BIHRyYW5zZmVyLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworLyoqCisgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBUSU0gT25lIFB1bHNlIFRpbWUgQmFzZSBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAorICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBUSU1fSGFuZGxlVHlwZURlZiBhbmQgaW5pdGlhbGl6ZXMgdGhlIGFzc29jaWF0ZWQKKyAqIGhhbmRsZS4KKyAqIEBub3RlICAgU3dpdGNoaW5nIGZyb20gQ2VudGVyIEFsaWduZWQgY291bnRlciBtb2RlIHRvIEVkZ2UgY291bnRlciBtb2RlIChvcgorICogcmV2ZXJzZSkgcmVxdWlyZXMgYSB0aW1lciByZXNldCB0byBhdm9pZCB1bmV4cGVjdGVkIGRpcmVjdGlvbiBkdWUgdG8gRElSIGJpdAorICogcmVhZG9ubHkgaW4gY2VudGVyIGFsaWduZWQgbW9kZS4gRXg6IGNhbGwgQHJlZiBIQUxfVElNX09uZVB1bHNlX0RlSW5pdCgpCisgKiBiZWZvcmUgSEFMX1RJTV9PbmVQdWxzZV9Jbml0KCkKKyAqIEBub3RlICAgV2hlbiB0aGUgdGltZXIgaW5zdGFuY2UgaXMgaW5pdGlhbGl6ZWQgaW4gT25lIFB1bHNlIG1vZGUsIHRpbWVyCisgKiAgICAgICAgIGNoYW5uZWxzIDEgYW5kIGNoYW5uZWwgMiBhcmUgcmVzZXJ2ZWQgYW5kIGNhbm5vdCBiZSB1c2VkIGZvciBvdGhlcgorICogICAgICAgICBwdXJwb3NlLgorICogQHBhcmFtICBodGltIFRJTSBPbmUgUHVsc2UgaGFuZGxlCisgKiBAcGFyYW0gIE9uZVB1bHNlTW9kZSBTZWxlY3QgdGhlIE9uZSBwdWxzZSBtb2RlLgorICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIFRJTV9PUE1PREVfU0lOR0xFOiBPbmx5IG9uZSBwdWxzZSB3aWxsIGJlIGdlbmVyYXRlZC4KKyAqICAgICAgICAgICAgQGFyZyBUSU1fT1BNT0RFX1JFUEVUSVRJVkU6IFJlcGV0aXRpdmUgcHVsc2VzIHdpbGwgYmUgZ2VuZXJhdGVkLgorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT25lUHVsc2VfSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBPbmVQdWxzZU1vZGUpIHsKKyAgLyogQ2hlY2sgdGhlIFRJTSBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZiAoaHRpbSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DT1VOVEVSX01PREUoaHRpbS0+SW5pdC5Db3VudGVyTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMT0NLRElWSVNJT05fRElWKGh0aW0tPkluaXQuQ2xvY2tEaXZpc2lvbikpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX09QTV9NT0RFKE9uZVB1bHNlTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX1BFUklPRChodGltLCBodGltLT5Jbml0LlBlcmlvZCkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0FVVE9SRUxPQURfUFJFTE9BRChodGltLT5Jbml0LkF1dG9SZWxvYWRQcmVsb2FkKSk7CisKKyAgaWYgKGh0aW0tPlN0YXRlID09IEhBTF9USU1fU1RBVEVfUkVTRVQpIHsKKyAgICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovCisgICAgaHRpbS0+TG9jayA9IEhBTF9VTkxPQ0tFRDsKKworI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAvKiBSZXNldCBpbnRlcnJ1cHQgY2FsbGJhY2tzIHRvIGxlZ2FjeSB3ZWFrIGNhbGxiYWNrcyAqLworICAgIFRJTV9SZXNldENhbGxiYWNrKGh0aW0pOworCisgICAgaWYgKGh0aW0tPk9uZVB1bHNlX01zcEluaXRDYWxsYmFjayA9PSBOVUxMKSB7CisgICAgICBodGltLT5PbmVQdWxzZV9Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfVElNX09uZVB1bHNlX01zcEluaXQ7CisgICAgfQorICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLLCBOVklDICovCisgICAgaHRpbS0+T25lUHVsc2VfTXNwSW5pdENhbGxiYWNrKGh0aW0pOworI2Vsc2UKKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgOiBHUElPLCBDTE9DSywgTlZJQyBhbmQgRE1BICovCisgICAgSEFMX1RJTV9PbmVQdWxzZV9Nc3BJbml0KGh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisKKyAgLyogU2V0IHRoZSBUSU0gc3RhdGUgKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CisKKyAgLyogQ29uZmlndXJlIHRoZSBUaW1lIGJhc2UgaW4gdGhlIE9uZSBQdWxzZSBNb2RlICovCisgIFRJTV9CYXNlX1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgJmh0aW0tPkluaXQpOworCisgIC8qIFJlc2V0IHRoZSBPUE0gQml0ICovCisgIGh0aW0tPkluc3RhbmNlLT5DUjEgJj0gflRJTV9DUjFfT1BNOworCisgIC8qIENvbmZpZ3VyZSB0aGUgT1BNIE1vZGUgKi8KKyAgaHRpbS0+SW5zdGFuY2UtPkNSMSB8PSBPbmVQdWxzZU1vZGU7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgRE1BIGJ1cnN0IG9wZXJhdGlvbiBzdGF0ZSAqLworICBodGltLT5ETUFCdXJzdFN0YXRlID0gSEFMX0RNQV9CVVJTVF9TVEFURV9SRUFEWTsKKworICAvKiBJbml0aWFsaXplIHRoZSBUSU0gY2hhbm5lbHMgc3RhdGUgKi8KKyAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7CisgIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8yLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOworICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8xLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOworICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8yLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOworCisgIC8qIEluaXRpYWxpemUgdGhlIFRJTSBzdGF0ZSovCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRUFEWTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiAgRGVJbml0aWFsaXplcyB0aGUgVElNIE9uZSBQdWxzZQorICogQHBhcmFtICBodGltIFRJTSBPbmUgUHVsc2UgaGFuZGxlCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PbmVQdWxzZV9EZUluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pIHsKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIFRJTSBQZXJpcGhlcmFsIENsb2NrICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBpZiAoaHRpbS0+T25lUHVsc2VfTXNwRGVJbml0Q2FsbGJhY2sgPT0gTlVMTCkgeworICAgIGh0aW0tPk9uZVB1bHNlX01zcERlSW5pdENhbGxiYWNrID0gSEFMX1RJTV9PbmVQdWxzZV9Nc3BEZUluaXQ7CisgIH0KKyAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgaHRpbS0+T25lUHVsc2VfTXNwRGVJbml0Q2FsbGJhY2soaHRpbSk7CisjZWxzZQorICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZTogR1BJTywgQ0xPQ0ssIE5WSUMgKi8KKyAgSEFMX1RJTV9PbmVQdWxzZV9Nc3BEZUluaXQoaHRpbSk7CisjZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKyAgLyogQ2hhbmdlIHRoZSBETUEgYnVyc3Qgb3BlcmF0aW9uIHN0YXRlICovCisgIGh0aW0tPkRNQUJ1cnN0U3RhdGUgPSBIQUxfRE1BX0JVUlNUX1NUQVRFX1JFU0VUOworCisgIC8qIFNldCB0aGUgVElNIGNoYW5uZWwgc3RhdGUgKi8KKyAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRVNFVCk7CisgIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8yLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVTRVQpOworICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8xLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVTRVQpOworICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8yLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVTRVQpOworCisgIC8qIENoYW5nZSBUSU0gc3RhdGUgKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFU0VUOworCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHRpbSk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBUSU0gT25lIFB1bHNlIE1TUC4KKyAqIEBwYXJhbSAgaHRpbSBUSU0gT25lIFB1bHNlIGhhbmRsZQorICogQHJldHZhbCBOb25lCisgKi8KK19fd2VhayB2b2lkIEhBTF9USU1fT25lUHVsc2VfTXNwSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkgeworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1RJTV9PbmVQdWxzZV9Nc3BJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICogQGJyaWVmICBEZUluaXRpYWxpemVzIFRJTSBPbmUgUHVsc2UgTVNQLgorICogQHBhcmFtICBodGltIFRJTSBPbmUgUHVsc2UgaGFuZGxlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX193ZWFrIHZvaWQgSEFMX1RJTV9PbmVQdWxzZV9Nc3BEZUluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pIHsKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHRpbSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9USU1fT25lUHVsc2VfTXNwRGVJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICogQGJyaWVmICBTdGFydHMgdGhlIFRJTSBPbmUgUHVsc2Ugc2lnbmFsIGdlbmVyYXRpb24uCisgKiBAbm90ZSBUaG91Z2ggT3V0cHV0Q2hhbm5lbCBwYXJhbWV0ZXIgaXMgZGVwcmVjYXRlZCBhbmQgaWdub3JlZCBieSB0aGUKKyAqIGZ1bmN0aW9uIGl0IGhhcyBiZWVuIGtlcHQgdG8gYXZvaWQgSEFMX1RJTSBBUEkgY29tcGF0aWJpbGl0eSBicmVhay4KKyAqIEBub3RlIFRoZSBwdWxzZSBvdXRwdXQgY2hhbm5lbCBpcyBkZXRlcm1pbmVkIHdoZW4gY2FsbGluZworICogICAgICAgQHJlZiBIQUxfVElNX09uZVB1bHNlX0NvbmZpZ0NoYW5uZWwoKS4KKyAqIEBwYXJhbSAgaHRpbSBUSU0gT25lIFB1bHNlIGhhbmRsZQorICogQHBhcmFtICBPdXRwdXRDaGFubmVsIFNlZSBub3RlIGFib3ZlCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PbmVQdWxzZV9TdGFydChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgT3V0cHV0Q2hhbm5lbCkgeworICBIQUxfVElNX0NoYW5uZWxTdGF0ZVR5cGVEZWYgY2hhbm5lbF8xX3N0YXRlID0KKyAgICAgIFRJTV9DSEFOTkVMX1NUQVRFX0dFVChodGltLCBUSU1fQ0hBTk5FTF8xKTsKKyAgSEFMX1RJTV9DaGFubmVsU3RhdGVUeXBlRGVmIGNoYW5uZWxfMl9zdGF0ZSA9CisgICAgICBUSU1fQ0hBTk5FTF9TVEFURV9HRVQoaHRpbSwgVElNX0NIQU5ORUxfMik7CisgIEhBTF9USU1fQ2hhbm5lbFN0YXRlVHlwZURlZiBjb21wbGVtZW50YXJ5X2NoYW5uZWxfMV9zdGF0ZSA9CisgICAgICBUSU1fQ0hBTk5FTF9OX1NUQVRFX0dFVChodGltLCBUSU1fQ0hBTk5FTF8xKTsKKyAgSEFMX1RJTV9DaGFubmVsU3RhdGVUeXBlRGVmIGNvbXBsZW1lbnRhcnlfY2hhbm5lbF8yX3N0YXRlID0KKyAgICAgIFRJTV9DSEFOTkVMX05fU1RBVEVfR0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIpOworCisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKE91dHB1dENoYW5uZWwpOworCisgIC8qIENoZWNrIHRoZSBUSU0gY2hhbm5lbHMgc3RhdGUgKi8KKyAgaWYgKChjaGFubmVsXzFfc3RhdGUgIT0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKSB8fAorICAgICAgKGNoYW5uZWxfMl9zdGF0ZSAhPSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpIHx8CisgICAgICAoY29tcGxlbWVudGFyeV9jaGFubmVsXzFfc3RhdGUgIT0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKSB8fAorICAgICAgKGNvbXBsZW1lbnRhcnlfY2hhbm5lbF8yX3N0YXRlICE9IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSkpIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogU2V0IHRoZSBUSU0gY2hhbm5lbHMgc3RhdGUgKi8KKyAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKTsKKyAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKTsKKyAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMSwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX0JVU1kpOworICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8yLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSk7CisKKyAgLyogRW5hYmxlIHRoZSBDYXB0dXJlIGNvbXBhcmUgYW5kIHRoZSBJbnB1dCBDYXB0dXJlIGNoYW5uZWxzCisgICAgKGluIHRoZSBPUE0gTW9kZSB0aGUgdHdvIHBvc3NpYmxlIGNoYW5uZWxzIHRoYXQgY2FuIGJlIHVzZWQgYXJlCisgICAgVElNX0NIQU5ORUxfMSBhbmQgVElNX0NIQU5ORUxfMikgaWYgVElNX0NIQU5ORUxfMSBpcyB1c2VkIGFzIG91dHB1dCwgdGhlCisgICAgVElNX0NIQU5ORUxfMiB3aWxsIGJlIHVzZWQgYXMgaW5wdXQgYW5kIGlmIFRJTV9DSEFOTkVMXzEgaXMgdXNlZCBhcyBpbnB1dCwKKyAgICB0aGUgVElNX0NIQU5ORUxfMiB3aWxsIGJlIHVzZWQgYXMgb3V0cHV0IHdoYXRldmVyIHRoZSBjb21iaW5hdGlvbiwgdGhlCisgICAgVElNX0NIQU5ORUxfMSBhbmQgVElNX0NIQU5ORUxfMiBzaG91bGQgYmUgZW5hYmxlZCB0b2dldGhlcgorCisgICAgTm8gbmVlZCB0byBlbmFibGUgdGhlIGNvdW50ZXIsIGl0J3MgZW5hYmxlZCBhdXRvbWF0aWNhbGx5IGJ5IGhhcmR3YXJlCisgICAgKHRoZSBjb3VudGVyIHN0YXJ0cyBpbiByZXNwb25zZSB0byBhIHN0aW11bHVzIGFuZCBnZW5lcmF0ZSBhIHB1bHNlICovCisKKyAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzEsIFRJTV9DQ3hfRU5BQkxFKTsKKyAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzIsIFRJTV9DQ3hfRU5BQkxFKTsKKworICBpZiAoSVNfVElNX0JSRUFLX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSAhPSBSRVNFVCkgeworICAgIC8qIEVuYWJsZSB0aGUgbWFpbiBvdXRwdXQgKi8KKyAgICBfX0hBTF9USU1fTU9FX0VOQUJMRShodGltKTsKKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgIFN0b3BzIHRoZSBUSU0gT25lIFB1bHNlIHNpZ25hbCBnZW5lcmF0aW9uLgorICogQG5vdGUgVGhvdWdoIE91dHB1dENoYW5uZWwgcGFyYW1ldGVyIGlzIGRlcHJlY2F0ZWQgYW5kIGlnbm9yZWQgYnkgdGhlCisgKiBmdW5jdGlvbiBpdCBoYXMgYmVlbiBrZXB0IHRvIGF2b2lkIEhBTF9USU0gQVBJIGNvbXBhdGliaWxpdHkgYnJlYWsuCisgKiBAbm90ZSBUaGUgcHVsc2Ugb3V0cHV0IGNoYW5uZWwgaXMgZGV0ZXJtaW5lZCB3aGVuIGNhbGxpbmcKKyAqICAgICAgIEByZWYgSEFMX1RJTV9PbmVQdWxzZV9Db25maWdDaGFubmVsKCkuCisgKiBAcGFyYW0gIGh0aW0gVElNIE9uZSBQdWxzZSBoYW5kbGUKKyAqIEBwYXJhbSAgT3V0cHV0Q2hhbm5lbCBTZWUgbm90ZSBhYm92ZQorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT25lUHVsc2VfU3RvcChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBPdXRwdXRDaGFubmVsKSB7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKE91dHB1dENoYW5uZWwpOworCisgIC8qIERpc2FibGUgdGhlIENhcHR1cmUgY29tcGFyZSBhbmQgdGhlIElucHV0IENhcHR1cmUgY2hhbm5lbHMKKyAgKGluIHRoZSBPUE0gTW9kZSB0aGUgdHdvIHBvc3NpYmxlIGNoYW5uZWxzIHRoYXQgY2FuIGJlIHVzZWQgYXJlIFRJTV9DSEFOTkVMXzEKKyAgYW5kIFRJTV9DSEFOTkVMXzIpIGlmIFRJTV9DSEFOTkVMXzEgaXMgdXNlZCBhcyBvdXRwdXQsIHRoZSBUSU1fQ0hBTk5FTF8yIHdpbGwKKyAgYmUgdXNlZCBhcyBpbnB1dCBhbmQgaWYgVElNX0NIQU5ORUxfMSBpcyB1c2VkIGFzIGlucHV0LCB0aGUgVElNX0NIQU5ORUxfMiB3aWxsCisgIGJlIHVzZWQgYXMgb3V0cHV0IHdoYXRldmVyIHRoZSBjb21iaW5hdGlvbiwgdGhlIFRJTV9DSEFOTkVMXzEgYW5kCisgIFRJTV9DSEFOTkVMXzIgc2hvdWxkIGJlIGRpc2FibGVkIHRvZ2V0aGVyICovCisKKyAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzEsIFRJTV9DQ3hfRElTQUJMRSk7CisgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8yLCBUSU1fQ0N4X0RJU0FCTEUpOworCisgIGlmIChJU19USU1fQlJFQUtfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpICE9IFJFU0VUKSB7CisgICAgLyogRGlzYWJsZSB0aGUgTWFpbiBPdXRwdXQgKi8KKyAgICBfX0hBTF9USU1fTU9FX0RJU0FCTEUoaHRpbSk7CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisgIC8qIFNldCB0aGUgVElNIGNoYW5uZWxzIHN0YXRlICovCisgIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8xLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOworICBUSU1fQ0hBTk5FTF9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMiwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsKKyAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMSwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsKKyAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMiwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICogQGJyaWVmICBTdGFydHMgdGhlIFRJTSBPbmUgUHVsc2Ugc2lnbmFsIGdlbmVyYXRpb24gaW4gaW50ZXJydXB0IG1vZGUuCisgKiBAbm90ZSBUaG91Z2ggT3V0cHV0Q2hhbm5lbCBwYXJhbWV0ZXIgaXMgZGVwcmVjYXRlZCBhbmQgaWdub3JlZCBieSB0aGUKKyAqIGZ1bmN0aW9uIGl0IGhhcyBiZWVuIGtlcHQgdG8gYXZvaWQgSEFMX1RJTSBBUEkgY29tcGF0aWJpbGl0eSBicmVhay4KKyAqIEBub3RlIFRoZSBwdWxzZSBvdXRwdXQgY2hhbm5lbCBpcyBkZXRlcm1pbmVkIHdoZW4gY2FsbGluZworICogICAgICAgQHJlZiBIQUxfVElNX09uZVB1bHNlX0NvbmZpZ0NoYW5uZWwoKS4KKyAqIEBwYXJhbSAgaHRpbSBUSU0gT25lIFB1bHNlIGhhbmRsZQorICogQHBhcmFtICBPdXRwdXRDaGFubmVsIFNlZSBub3RlIGFib3ZlCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PbmVQdWxzZV9TdGFydF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgT3V0cHV0Q2hhbm5lbCkgeworICBIQUxfVElNX0NoYW5uZWxTdGF0ZVR5cGVEZWYgY2hhbm5lbF8xX3N0YXRlID0KKyAgICAgIFRJTV9DSEFOTkVMX1NUQVRFX0dFVChodGltLCBUSU1fQ0hBTk5FTF8xKTsKKyAgSEFMX1RJTV9DaGFubmVsU3RhdGVUeXBlRGVmIGNoYW5uZWxfMl9zdGF0ZSA9CisgICAgICBUSU1fQ0hBTk5FTF9TVEFURV9HRVQoaHRpbSwgVElNX0NIQU5ORUxfMik7CisgIEhBTF9USU1fQ2hhbm5lbFN0YXRlVHlwZURlZiBjb21wbGVtZW50YXJ5X2NoYW5uZWxfMV9zdGF0ZSA9CisgICAgICBUSU1fQ0hBTk5FTF9OX1NUQVRFX0dFVChodGltLCBUSU1fQ0hBTk5FTF8xKTsKKyAgSEFMX1RJTV9DaGFubmVsU3RhdGVUeXBlRGVmIGNvbXBsZW1lbnRhcnlfY2hhbm5lbF8yX3N0YXRlID0KKyAgICAgIFRJTV9DSEFOTkVMX05fU1RBVEVfR0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIpOworCisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKE91dHB1dENoYW5uZWwpOworCisgIC8qIENoZWNrIHRoZSBUSU0gY2hhbm5lbHMgc3RhdGUgKi8KKyAgaWYgKChjaGFubmVsXzFfc3RhdGUgIT0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKSB8fAorICAgICAgKGNoYW5uZWxfMl9zdGF0ZSAhPSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpIHx8CisgICAgICAoY29tcGxlbWVudGFyeV9jaGFubmVsXzFfc3RhdGUgIT0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKSB8fAorICAgICAgKGNvbXBsZW1lbnRhcnlfY2hhbm5lbF8yX3N0YXRlICE9IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSkpIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogU2V0IHRoZSBUSU0gY2hhbm5lbHMgc3RhdGUgKi8KKyAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKTsKKyAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKTsKKyAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMSwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX0JVU1kpOworICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8yLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSk7CisKKyAgLyogRW5hYmxlIHRoZSBDYXB0dXJlIGNvbXBhcmUgYW5kIHRoZSBJbnB1dCBDYXB0dXJlIGNoYW5uZWxzCisgICAgKGluIHRoZSBPUE0gTW9kZSB0aGUgdHdvIHBvc3NpYmxlIGNoYW5uZWxzIHRoYXQgY2FuIGJlIHVzZWQgYXJlCisgICAgVElNX0NIQU5ORUxfMSBhbmQgVElNX0NIQU5ORUxfMikgaWYgVElNX0NIQU5ORUxfMSBpcyB1c2VkIGFzIG91dHB1dCwgdGhlCisgICAgVElNX0NIQU5ORUxfMiB3aWxsIGJlIHVzZWQgYXMgaW5wdXQgYW5kIGlmIFRJTV9DSEFOTkVMXzEgaXMgdXNlZCBhcyBpbnB1dCwKKyAgICB0aGUgVElNX0NIQU5ORUxfMiB3aWxsIGJlIHVzZWQgYXMgb3V0cHV0IHdoYXRldmVyIHRoZSBjb21iaW5hdGlvbiwgdGhlCisgICAgVElNX0NIQU5ORUxfMSBhbmQgVElNX0NIQU5ORUxfMiBzaG91bGQgYmUgZW5hYmxlZCB0b2dldGhlcgorCisgICAgTm8gbmVlZCB0byBlbmFibGUgdGhlIGNvdW50ZXIsIGl0J3MgZW5hYmxlZCBhdXRvbWF0aWNhbGx5IGJ5IGhhcmR3YXJlCisgICAgKHRoZSBjb3VudGVyIHN0YXJ0cyBpbiByZXNwb25zZSB0byBhIHN0aW11bHVzIGFuZCBnZW5lcmF0ZSBhIHB1bHNlICovCisKKyAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDEgaW50ZXJydXB0ICovCisgIF9fSEFMX1RJTV9FTkFCTEVfSVQoaHRpbSwgVElNX0lUX0NDMSk7CisKKyAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDIgaW50ZXJydXB0ICovCisgIF9fSEFMX1RJTV9FTkFCTEVfSVQoaHRpbSwgVElNX0lUX0NDMik7CisKKyAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzEsIFRJTV9DQ3hfRU5BQkxFKTsKKyAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzIsIFRJTV9DQ3hfRU5BQkxFKTsKKworICBpZiAoSVNfVElNX0JSRUFLX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSAhPSBSRVNFVCkgeworICAgIC8qIEVuYWJsZSB0aGUgbWFpbiBvdXRwdXQgKi8KKyAgICBfX0hBTF9USU1fTU9FX0VOQUJMRShodGltKTsKKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgIFN0b3BzIHRoZSBUSU0gT25lIFB1bHNlIHNpZ25hbCBnZW5lcmF0aW9uIGluIGludGVycnVwdCBtb2RlLgorICogQG5vdGUgVGhvdWdoIE91dHB1dENoYW5uZWwgcGFyYW1ldGVyIGlzIGRlcHJlY2F0ZWQgYW5kIGlnbm9yZWQgYnkgdGhlCisgKiBmdW5jdGlvbiBpdCBoYXMgYmVlbiBrZXB0IHRvIGF2b2lkIEhBTF9USU0gQVBJIGNvbXBhdGliaWxpdHkgYnJlYWsuCisgKiBAbm90ZSBUaGUgcHVsc2Ugb3V0cHV0IGNoYW5uZWwgaXMgZGV0ZXJtaW5lZCB3aGVuIGNhbGxpbmcKKyAqICAgICAgIEByZWYgSEFMX1RJTV9PbmVQdWxzZV9Db25maWdDaGFubmVsKCkuCisgKiBAcGFyYW0gIGh0aW0gVElNIE9uZSBQdWxzZSBoYW5kbGUKKyAqIEBwYXJhbSAgT3V0cHV0Q2hhbm5lbCBTZWUgbm90ZSBhYm92ZQorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT25lUHVsc2VfU3RvcF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBPdXRwdXRDaGFubmVsKSB7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKE91dHB1dENoYW5uZWwpOworCisgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMSBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDMSk7CisKKyAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAyIGludGVycnVwdCAqLworICBfX0hBTF9USU1fRElTQUJMRV9JVChodGltLCBUSU1fSVRfQ0MyKTsKKworICAvKiBEaXNhYmxlIHRoZSBDYXB0dXJlIGNvbXBhcmUgYW5kIHRoZSBJbnB1dCBDYXB0dXJlIGNoYW5uZWxzCisgIChpbiB0aGUgT1BNIE1vZGUgdGhlIHR3byBwb3NzaWJsZSBjaGFubmVscyB0aGF0IGNhbiBiZSB1c2VkIGFyZSBUSU1fQ0hBTk5FTF8xCisgIGFuZCBUSU1fQ0hBTk5FTF8yKSBpZiBUSU1fQ0hBTk5FTF8xIGlzIHVzZWQgYXMgb3V0cHV0LCB0aGUgVElNX0NIQU5ORUxfMiB3aWxsCisgIGJlIHVzZWQgYXMgaW5wdXQgYW5kIGlmIFRJTV9DSEFOTkVMXzEgaXMgdXNlZCBhcyBpbnB1dCwgdGhlIFRJTV9DSEFOTkVMXzIgd2lsbAorICBiZSB1c2VkIGFzIG91dHB1dCB3aGF0ZXZlciB0aGUgY29tYmluYXRpb24sIHRoZSBUSU1fQ0hBTk5FTF8xIGFuZAorICBUSU1fQ0hBTk5FTF8yIHNob3VsZCBiZSBkaXNhYmxlZCB0b2dldGhlciAqLworICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMSwgVElNX0NDeF9ESVNBQkxFKTsKKyAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzIsIFRJTV9DQ3hfRElTQUJMRSk7CisKKyAgaWYgKElTX1RJTV9CUkVBS19JTlNUQU5DRShodGltLT5JbnN0YW5jZSkgIT0gUkVTRVQpIHsKKyAgICAvKiBEaXNhYmxlIHRoZSBNYWluIE91dHB1dCAqLworICAgIF9fSEFMX1RJTV9NT0VfRElTQUJMRShodGltKTsKKyAgfQorCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7CisKKyAgLyogU2V0IHRoZSBUSU0gY2hhbm5lbHMgc3RhdGUgKi8KKyAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7CisgIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8yLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOworICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8xLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOworICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8yLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDYgVElNIEVuY29kZXIgZnVuY3Rpb25zCisgICogIEBicmllZiAgICBUSU0gRW5jb2RlciBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBUSU0gRW5jb2RlciBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICgrKSBJbml0aWFsaXplIGFuZCBjb25maWd1cmUgdGhlIFRJTSBFbmNvZGVyLgorICAgICgrKSBEZS1pbml0aWFsaXplIHRoZSBUSU0gRW5jb2Rlci4KKyAgICAoKykgU3RhcnQgdGhlIFRJTSBFbmNvZGVyLgorICAgICgrKSBTdG9wIHRoZSBUSU0gRW5jb2Rlci4KKyAgICAoKykgU3RhcnQgdGhlIFRJTSBFbmNvZGVyIGFuZCBlbmFibGUgaW50ZXJydXB0LgorICAgICgrKSBTdG9wIHRoZSBUSU0gRW5jb2RlciBhbmQgZGlzYWJsZSBpbnRlcnJ1cHQuCisgICAgKCspIFN0YXJ0IHRoZSBUSU0gRW5jb2RlciBhbmQgZW5hYmxlIERNQSB0cmFuc2Zlci4KKyAgICAoKykgU3RvcCB0aGUgVElNIEVuY29kZXIgYW5kIGRpc2FibGUgRE1BIHRyYW5zZmVyLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworLyoqCisgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBUSU0gRW5jb2RlciBJbnRlcmZhY2UgYW5kIGluaXRpYWxpemUgdGhlIGFzc29jaWF0ZWQKKyAqIGhhbmRsZS4KKyAqIEBub3RlICAgU3dpdGNoaW5nIGZyb20gQ2VudGVyIEFsaWduZWQgY291bnRlciBtb2RlIHRvIEVkZ2UgY291bnRlciBtb2RlIChvcgorICogcmV2ZXJzZSkgcmVxdWlyZXMgYSB0aW1lciByZXNldCB0byBhdm9pZCB1bmV4cGVjdGVkIGRpcmVjdGlvbiBkdWUgdG8gRElSIGJpdAorICogcmVhZG9ubHkgaW4gY2VudGVyIGFsaWduZWQgbW9kZS4gRXg6IGNhbGwgQHJlZiBIQUxfVElNX0VuY29kZXJfRGVJbml0KCkKKyAqIGJlZm9yZSBIQUxfVElNX0VuY29kZXJfSW5pdCgpCisgKiBAbm90ZSAgIEVuY29kZXIgbW9kZSBhbmQgRXh0ZXJuYWwgY2xvY2sgbW9kZSAyIGFyZSBub3QgY29tcGF0aWJsZSBhbmQgbXVzdAorICogbm90IGJlIHNlbGVjdGVkIHRvZ2V0aGVyIEV4OiBBIGNhbGwgZm9yIEByZWYgSEFMX1RJTV9FbmNvZGVyX0luaXQgd2lsbCBlcmFzZQorICogdGhlIHNldHRpbmdzIG9mIEByZWYgSEFMX1RJTV9Db25maWdDbG9ja1NvdXJjZSB1c2luZyBUSU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTIKKyAqIGFuZCB2aWNlIHZlcnNhCisgKiBAbm90ZSAgIFdoZW4gdGhlIHRpbWVyIGluc3RhbmNlIGlzIGluaXRpYWxpemVkIGluIEVuY29kZXIgbW9kZSwgdGltZXIKKyAqICAgICAgICAgY2hhbm5lbHMgMSBhbmQgY2hhbm5lbCAyIGFyZSByZXNlcnZlZCBhbmQgY2Fubm90IGJlIHVzZWQgZm9yIG90aGVyCisgKiAgICAgICAgIHB1cnBvc2UuCisgKiBAcGFyYW0gIGh0aW0gVElNIEVuY29kZXIgSW50ZXJmYWNlIGhhbmRsZQorICogQHBhcmFtICBzQ29uZmlnIFRJTSBFbmNvZGVyIEludGVyZmFjZSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZQorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fRW5jb2Rlcl9Jbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVElNX0VuY29kZXJfSW5pdFR5cGVEZWYgKnNDb25maWcpIHsKKyAgdWludDMyX3QgdG1wc21jcjsKKyAgdWludDMyX3QgdG1wY2NtcjE7CisgIHVpbnQzMl90IHRtcGNjZXI7CisKKyAgLyogQ2hlY2sgdGhlIFRJTSBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZiAoaHRpbSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fRU5DT0RFUl9JTlRFUkZBQ0VfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DT1VOVEVSX01PREUoaHRpbS0+SW5pdC5Db3VudGVyTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMT0NLRElWSVNJT05fRElWKGh0aW0tPkluaXQuQ2xvY2tEaXZpc2lvbikpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0FVVE9SRUxPQURfUFJFTE9BRChodGltLT5Jbml0LkF1dG9SZWxvYWRQcmVsb2FkKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fRU5DT0RFUl9NT0RFKHNDb25maWctPkVuY29kZXJNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fSUNfU0VMRUNUSU9OKHNDb25maWctPklDMVNlbGVjdGlvbikpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lDX1NFTEVDVElPTihzQ29uZmlnLT5JQzJTZWxlY3Rpb24pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9FTkNPREVSSU5QVVRfUE9MQVJJVFkoc0NvbmZpZy0+SUMxUG9sYXJpdHkpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9FTkNPREVSSU5QVVRfUE9MQVJJVFkoc0NvbmZpZy0+SUMyUG9sYXJpdHkpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JQ19QUkVTQ0FMRVIoc0NvbmZpZy0+SUMxUHJlc2NhbGVyKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fSUNfUFJFU0NBTEVSKHNDb25maWctPklDMlByZXNjYWxlcikpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lDX0ZJTFRFUihzQ29uZmlnLT5JQzFGaWx0ZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JQ19GSUxURVIoc0NvbmZpZy0+SUMyRmlsdGVyKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fUEVSSU9EKGh0aW0sIGh0aW0tPkluaXQuUGVyaW9kKSk7CisKKyAgaWYgKGh0aW0tPlN0YXRlID09IEhBTF9USU1fU1RBVEVfUkVTRVQpIHsKKyAgICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovCisgICAgaHRpbS0+TG9jayA9IEhBTF9VTkxPQ0tFRDsKKworI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAvKiBSZXNldCBpbnRlcnJ1cHQgY2FsbGJhY2tzIHRvIGxlZ2FjeSB3ZWFrIGNhbGxiYWNrcyAqLworICAgIFRJTV9SZXNldENhbGxiYWNrKGh0aW0pOworCisgICAgaWYgKGh0aW0tPkVuY29kZXJfTXNwSW5pdENhbGxiYWNrID09IE5VTEwpIHsKKyAgICAgIGh0aW0tPkVuY29kZXJfTXNwSW5pdENhbGxiYWNrID0gSEFMX1RJTV9FbmNvZGVyX01zcEluaXQ7CisgICAgfQorICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLLCBOVklDICovCisgICAgaHRpbS0+RW5jb2Rlcl9Nc3BJbml0Q2FsbGJhY2soaHRpbSk7CisjZWxzZQorICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLLCBOVklDIGFuZCBETUEgKi8KKyAgICBIQUxfVElNX0VuY29kZXJfTXNwSW5pdChodGltKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorCisgIC8qIFNldCB0aGUgVElNIHN0YXRlICovCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworCisgIC8qIFJlc2V0IHRoZSBTTVMgYW5kIEVDRSBiaXRzICovCisgIGh0aW0tPkluc3RhbmNlLT5TTUNSICY9IH4oVElNX1NNQ1JfU01TIHwgVElNX1NNQ1JfRUNFKTsKKworICAvKiBDb25maWd1cmUgdGhlIFRpbWUgYmFzZSBpbiB0aGUgRW5jb2RlciBNb2RlICovCisgIFRJTV9CYXNlX1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgJmh0aW0tPkluaXQpOworCisgIC8qIEdldCB0aGUgVElNeCBTTUNSIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcHNtY3IgPSBodGltLT5JbnN0YW5jZS0+U01DUjsKKworICAvKiBHZXQgdGhlIFRJTXggQ0NNUjEgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY2NtcjEgPSBodGltLT5JbnN0YW5jZS0+Q0NNUjE7CisKKyAgLyogR2V0IHRoZSBUSU14IENDRVIgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY2NlciA9IGh0aW0tPkluc3RhbmNlLT5DQ0VSOworCisgIC8qIFNldCB0aGUgZW5jb2RlciBNb2RlICovCisgIHRtcHNtY3IgfD0gc0NvbmZpZy0+RW5jb2Rlck1vZGU7CisKKyAgLyogU2VsZWN0IHRoZSBDYXB0dXJlIENvbXBhcmUgMSBhbmQgdGhlIENhcHR1cmUgQ29tcGFyZSAyIGFzIGlucHV0ICovCisgIHRtcGNjbXIxICY9IH4oVElNX0NDTVIxX0NDMVMgfCBUSU1fQ0NNUjFfQ0MyUyk7CisgIHRtcGNjbXIxIHw9IChzQ29uZmlnLT5JQzFTZWxlY3Rpb24gfCAoc0NvbmZpZy0+SUMyU2VsZWN0aW9uIDw8IDhVKSk7CisKKyAgLyogU2V0IHRoZSBDYXB0dXJlIENvbXBhcmUgMSBhbmQgdGhlIENhcHR1cmUgQ29tcGFyZSAyIHByZXNjYWxlcnMgYW5kIGZpbHRlcnMKKyAgICovCisgIHRtcGNjbXIxICY9IH4oVElNX0NDTVIxX0lDMVBTQyB8IFRJTV9DQ01SMV9JQzJQU0MpOworICB0bXBjY21yMSAmPSB+KFRJTV9DQ01SMV9JQzFGIHwgVElNX0NDTVIxX0lDMkYpOworICB0bXBjY21yMSB8PSBzQ29uZmlnLT5JQzFQcmVzY2FsZXIgfCAoc0NvbmZpZy0+SUMyUHJlc2NhbGVyIDw8IDhVKTsKKyAgdG1wY2NtcjEgfD0gKHNDb25maWctPklDMUZpbHRlciA8PCA0VSkgfCAoc0NvbmZpZy0+SUMyRmlsdGVyIDw8IDEyVSk7CisKKyAgLyogU2V0IHRoZSBUSTEgYW5kIHRoZSBUSTIgUG9sYXJpdGllcyAqLworICB0bXBjY2VyICY9IH4oVElNX0NDRVJfQ0MxUCB8IFRJTV9DQ0VSX0NDMlApOworICB0bXBjY2VyICY9IH4oVElNX0NDRVJfQ0MxTlAgfCBUSU1fQ0NFUl9DQzJOUCk7CisgIHRtcGNjZXIgfD0gc0NvbmZpZy0+SUMxUG9sYXJpdHkgfCAoc0NvbmZpZy0+SUMyUG9sYXJpdHkgPDwgNFUpOworCisgIC8qIFdyaXRlIHRvIFRJTXggU01DUiAqLworICBodGltLT5JbnN0YW5jZS0+U01DUiA9IHRtcHNtY3I7CisKKyAgLyogV3JpdGUgdG8gVElNeCBDQ01SMSAqLworICBodGltLT5JbnN0YW5jZS0+Q0NNUjEgPSB0bXBjY21yMTsKKworICAvKiBXcml0ZSB0byBUSU14IENDRVIgKi8KKyAgaHRpbS0+SW5zdGFuY2UtPkNDRVIgPSB0bXBjY2VyOworCisgIC8qIEluaXRpYWxpemUgdGhlIERNQSBidXJzdCBvcGVyYXRpb24gc3RhdGUgKi8KKyAgaHRpbS0+RE1BQnVyc3RTdGF0ZSA9IEhBTF9ETUFfQlVSU1RfU1RBVEVfUkVBRFk7CisKKyAgLyogU2V0IHRoZSBUSU0gY2hhbm5lbHMgc3RhdGUgKi8KKyAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7CisgIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8yLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOworICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8xLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOworICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8yLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOworCisgIC8qIEluaXRpYWxpemUgdGhlIFRJTSBzdGF0ZSovCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRUFEWTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiAgRGVJbml0aWFsaXplcyB0aGUgVElNIEVuY29kZXIgaW50ZXJmYWNlCisgKiBAcGFyYW0gIGh0aW0gVElNIEVuY29kZXIgSW50ZXJmYWNlIGhhbmRsZQorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fRW5jb2Rlcl9EZUluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pIHsKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIFRJTSBQZXJpcGhlcmFsIENsb2NrICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBpZiAoaHRpbS0+RW5jb2Rlcl9Nc3BEZUluaXRDYWxsYmFjayA9PSBOVUxMKSB7CisgICAgaHRpbS0+RW5jb2Rlcl9Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9USU1fRW5jb2Rlcl9Nc3BEZUluaXQ7CisgIH0KKyAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgaHRpbS0+RW5jb2Rlcl9Nc3BEZUluaXRDYWxsYmFjayhodGltKTsKKyNlbHNlCisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlOiBHUElPLCBDTE9DSywgTlZJQyAqLworICBIQUxfVElNX0VuY29kZXJfTXNwRGVJbml0KGh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisgIC8qIENoYW5nZSB0aGUgRE1BIGJ1cnN0IG9wZXJhdGlvbiBzdGF0ZSAqLworICBodGltLT5ETUFCdXJzdFN0YXRlID0gSEFMX0RNQV9CVVJTVF9TVEFURV9SRVNFVDsKKworICAvKiBTZXQgdGhlIFRJTSBjaGFubmVscyBzdGF0ZSAqLworICBUSU1fQ0hBTk5FTF9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMSwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFU0VUKTsKKyAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRVNFVCk7CisgIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRVNFVCk7CisgIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRVNFVCk7CisKKyAgLyogQ2hhbmdlIFRJTSBzdGF0ZSAqLworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVTRVQ7CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhodGltKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFRJTSBFbmNvZGVyIEludGVyZmFjZSBNU1AuCisgKiBAcGFyYW0gIGh0aW0gVElNIEVuY29kZXIgSW50ZXJmYWNlIGhhbmRsZQorICogQHJldHZhbCBOb25lCisgKi8KK19fd2VhayB2b2lkIEhBTF9USU1fRW5jb2Rlcl9Nc3BJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKSB7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh0aW0pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVElNX0VuY29kZXJfTXNwSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAqIEBicmllZiAgRGVJbml0aWFsaXplcyBUSU0gRW5jb2RlciBJbnRlcmZhY2UgTVNQLgorICogQHBhcmFtICBodGltIFRJTSBFbmNvZGVyIEludGVyZmFjZSBoYW5kbGUKKyAqIEByZXR2YWwgTm9uZQorICovCitfX3dlYWsgdm9pZCBIQUxfVElNX0VuY29kZXJfTXNwRGVJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKSB7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh0aW0pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVElNX0VuY29kZXJfTXNwRGVJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICogQGJyaWVmICBTdGFydHMgdGhlIFRJTSBFbmNvZGVyIEludGVyZmFjZS4KKyAqIEBwYXJhbSAgaHRpbSBUSU0gRW5jb2RlciBJbnRlcmZhY2UgaGFuZGxlCisgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWxzIHRvIGJlIGVuYWJsZWQKKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF9BTEw6IFRJTSBDaGFubmVsIDEgYW5kIFRJTSBDaGFubmVsIDIgYXJlIHNlbGVjdGVkCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9FbmNvZGVyX1N0YXJ0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpIHsKKyAgSEFMX1RJTV9DaGFubmVsU3RhdGVUeXBlRGVmIGNoYW5uZWxfMV9zdGF0ZSA9CisgICAgICBUSU1fQ0hBTk5FTF9TVEFURV9HRVQoaHRpbSwgVElNX0NIQU5ORUxfMSk7CisgIEhBTF9USU1fQ2hhbm5lbFN0YXRlVHlwZURlZiBjaGFubmVsXzJfc3RhdGUgPQorICAgICAgVElNX0NIQU5ORUxfU1RBVEVfR0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIpOworICBIQUxfVElNX0NoYW5uZWxTdGF0ZVR5cGVEZWYgY29tcGxlbWVudGFyeV9jaGFubmVsXzFfc3RhdGUgPQorICAgICAgVElNX0NIQU5ORUxfTl9TVEFURV9HRVQoaHRpbSwgVElNX0NIQU5ORUxfMSk7CisgIEhBTF9USU1fQ2hhbm5lbFN0YXRlVHlwZURlZiBjb21wbGVtZW50YXJ5X2NoYW5uZWxfMl9zdGF0ZSA9CisgICAgICBUSU1fQ0hBTk5FTF9OX1NUQVRFX0dFVChodGltLCBUSU1fQ0hBTk5FTF8yKTsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0VOQ09ERVJfSU5URVJGQUNFX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgLyogU2V0IHRoZSBUSU0gY2hhbm5lbChzKSBzdGF0ZSAqLworICBpZiAoQ2hhbm5lbCA9PSBUSU1fQ0hBTk5FTF8xKSB7CisgICAgaWYgKChjaGFubmVsXzFfc3RhdGUgIT0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKSB8fAorICAgICAgICAoY29tcGxlbWVudGFyeV9jaGFubmVsXzFfc3RhdGUgIT0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKSkgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9IGVsc2UgeworICAgICAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKTsKKyAgICAgIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoQ2hhbm5lbCA9PSBUSU1fQ0hBTk5FTF8yKSB7CisgICAgaWYgKChjaGFubmVsXzJfc3RhdGUgIT0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKSB8fAorICAgICAgICAoY29tcGxlbWVudGFyeV9jaGFubmVsXzJfc3RhdGUgIT0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKSkgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9IGVsc2UgeworICAgICAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKTsKKyAgICAgIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKChjaGFubmVsXzFfc3RhdGUgIT0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKSB8fAorICAgICAgICAoY2hhbm5lbF8yX3N0YXRlICE9IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSkgfHwKKyAgICAgICAgKGNvbXBsZW1lbnRhcnlfY2hhbm5lbF8xX3N0YXRlICE9IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSkgfHwKKyAgICAgICAgKGNvbXBsZW1lbnRhcnlfY2hhbm5lbF8yX3N0YXRlICE9IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSkpIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfSBlbHNlIHsKKyAgICAgIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8xLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSk7CisgICAgICBUSU1fQ0hBTk5FTF9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMiwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX0JVU1kpOworICAgICAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMSwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX0JVU1kpOworICAgICAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMiwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX0JVU1kpOworICAgIH0KKyAgfQorCisgIC8qIEVuYWJsZSB0aGUgZW5jb2RlciBpbnRlcmZhY2UgY2hhbm5lbHMgKi8KKyAgc3dpdGNoIChDaGFubmVsKSB7CisgICAgY2FzZSBUSU1fQ0hBTk5FTF8xOiB7CisgICAgICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMSwgVElNX0NDeF9FTkFCTEUpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8yOiB7CisgICAgICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMiwgVElNX0NDeF9FTkFCTEUpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGVmYXVsdDogeworICAgICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzEsIFRJTV9DQ3hfRU5BQkxFKTsKKyAgICAgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8yLCBUSU1fQ0N4X0VOQUJMRSk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiAgU3RvcHMgdGhlIFRJTSBFbmNvZGVyIEludGVyZmFjZS4KKyAqIEBwYXJhbSAgaHRpbSBUSU0gRW5jb2RlciBJbnRlcmZhY2UgaGFuZGxlCisgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWxzIHRvIGJlIGRpc2FibGVkCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfQUxMOiBUSU0gQ2hhbm5lbCAxIGFuZCBUSU0gQ2hhbm5lbCAyIGFyZSBzZWxlY3RlZAorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fRW5jb2Rlcl9TdG9wKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCkgeworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0VOQ09ERVJfSU5URVJGQUNFX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgLyogRGlzYWJsZSB0aGUgSW5wdXQgQ2FwdHVyZSBjaGFubmVscyAxIGFuZCAyCisgICAgKGluIHRoZSBFbmNvZGVySW50ZXJmYWNlIHRoZSB0d28gcG9zc2libGUgY2hhbm5lbHMgdGhhdCBjYW4gYmUgdXNlZCBhcmUKKyAgICBUSU1fQ0hBTk5FTF8xIGFuZCBUSU1fQ0hBTk5FTF8yKSAqLworICBzd2l0Y2ggKENoYW5uZWwpIHsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzE6IHsKKyAgICAgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8xLCBUSU1fQ0N4X0RJU0FCTEUpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8yOiB7CisgICAgICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMiwgVElNX0NDeF9ESVNBQkxFKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRlZmF1bHQ6IHsKKyAgICAgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8xLCBUSU1fQ0N4X0RJU0FCTEUpOworICAgICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzIsIFRJTV9DQ3hfRElTQUJMRSk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisgIC8qIFNldCB0aGUgVElNIGNoYW5uZWwocykgc3RhdGUgKi8KKyAgaWYgKChDaGFubmVsID09IFRJTV9DSEFOTkVMXzEpIHx8IChDaGFubmVsID09IFRJTV9DSEFOTkVMXzIpKSB7CisgICAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIENoYW5uZWwsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7CisgICAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgQ2hhbm5lbCwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsKKyAgfSBlbHNlIHsKKyAgICBUSU1fQ0hBTk5FTF9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMSwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsKKyAgICBUSU1fQ0hBTk5FTF9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMiwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsKKyAgICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8xLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOworICAgIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7CisgIH0KKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICogQGJyaWVmICBTdGFydHMgdGhlIFRJTSBFbmNvZGVyIEludGVyZmFjZSBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAqIEBwYXJhbSAgaHRpbSBUSU0gRW5jb2RlciBJbnRlcmZhY2UgaGFuZGxlCisgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWxzIHRvIGJlIGVuYWJsZWQKKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF9BTEw6IFRJTSBDaGFubmVsIDEgYW5kIFRJTSBDaGFubmVsIDIgYXJlIHNlbGVjdGVkCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9FbmNvZGVyX1N0YXJ0X0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpIHsKKyAgSEFMX1RJTV9DaGFubmVsU3RhdGVUeXBlRGVmIGNoYW5uZWxfMV9zdGF0ZSA9CisgICAgICBUSU1fQ0hBTk5FTF9TVEFURV9HRVQoaHRpbSwgVElNX0NIQU5ORUxfMSk7CisgIEhBTF9USU1fQ2hhbm5lbFN0YXRlVHlwZURlZiBjaGFubmVsXzJfc3RhdGUgPQorICAgICAgVElNX0NIQU5ORUxfU1RBVEVfR0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIpOworICBIQUxfVElNX0NoYW5uZWxTdGF0ZVR5cGVEZWYgY29tcGxlbWVudGFyeV9jaGFubmVsXzFfc3RhdGUgPQorICAgICAgVElNX0NIQU5ORUxfTl9TVEFURV9HRVQoaHRpbSwgVElNX0NIQU5ORUxfMSk7CisgIEhBTF9USU1fQ2hhbm5lbFN0YXRlVHlwZURlZiBjb21wbGVtZW50YXJ5X2NoYW5uZWxfMl9zdGF0ZSA9CisgICAgICBUSU1fQ0hBTk5FTF9OX1NUQVRFX0dFVChodGltLCBUSU1fQ0hBTk5FTF8yKTsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0VOQ09ERVJfSU5URVJGQUNFX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgLyogU2V0IHRoZSBUSU0gY2hhbm5lbChzKSBzdGF0ZSAqLworICBpZiAoQ2hhbm5lbCA9PSBUSU1fQ0hBTk5FTF8xKSB7CisgICAgaWYgKChjaGFubmVsXzFfc3RhdGUgIT0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKSB8fAorICAgICAgICAoY29tcGxlbWVudGFyeV9jaGFubmVsXzFfc3RhdGUgIT0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKSkgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9IGVsc2UgeworICAgICAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKTsKKyAgICAgIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoQ2hhbm5lbCA9PSBUSU1fQ0hBTk5FTF8yKSB7CisgICAgaWYgKChjaGFubmVsXzJfc3RhdGUgIT0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKSB8fAorICAgICAgICAoY29tcGxlbWVudGFyeV9jaGFubmVsXzJfc3RhdGUgIT0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKSkgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9IGVsc2UgeworICAgICAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKTsKKyAgICAgIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKChjaGFubmVsXzFfc3RhdGUgIT0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKSB8fAorICAgICAgICAoY2hhbm5lbF8yX3N0YXRlICE9IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSkgfHwKKyAgICAgICAgKGNvbXBsZW1lbnRhcnlfY2hhbm5lbF8xX3N0YXRlICE9IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSkgfHwKKyAgICAgICAgKGNvbXBsZW1lbnRhcnlfY2hhbm5lbF8yX3N0YXRlICE9IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSkpIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfSBlbHNlIHsKKyAgICAgIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8xLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSk7CisgICAgICBUSU1fQ0hBTk5FTF9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMiwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX0JVU1kpOworICAgICAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMSwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX0JVU1kpOworICAgICAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMiwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX0JVU1kpOworICAgIH0KKyAgfQorCisgIC8qIEVuYWJsZSB0aGUgZW5jb2RlciBpbnRlcmZhY2UgY2hhbm5lbHMgKi8KKyAgLyogRW5hYmxlIHRoZSBjYXB0dXJlIGNvbXBhcmUgSW50ZXJydXB0cyAxIGFuZC9vciAyICovCisgIHN3aXRjaCAoQ2hhbm5lbCkgeworICAgIGNhc2UgVElNX0NIQU5ORUxfMTogeworICAgICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzEsIFRJTV9DQ3hfRU5BQkxFKTsKKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfSVQoaHRpbSwgVElNX0lUX0NDMSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzI6IHsKKyAgICAgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8yLCBUSU1fQ0N4X0VOQUJMRSk7CisgICAgICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzIpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGVmYXVsdDogeworICAgICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzEsIFRJTV9DQ3hfRU5BQkxFKTsKKyAgICAgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8yLCBUSU1fQ0N4X0VOQUJMRSk7CisgICAgICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzEpOworICAgICAgX19IQUxfVElNX0VOQUJMRV9JVChodGltLCBUSU1fSVRfQ0MyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgIFN0b3BzIHRoZSBUSU0gRW5jb2RlciBJbnRlcmZhY2UgaW4gaW50ZXJydXB0IG1vZGUuCisgKiBAcGFyYW0gIGh0aW0gVElNIEVuY29kZXIgSW50ZXJmYWNlIGhhbmRsZQorICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVscyB0byBiZSBkaXNhYmxlZAorICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMX0FMTDogVElNIENoYW5uZWwgMSBhbmQgVElNIENoYW5uZWwgMiBhcmUgc2VsZWN0ZWQKKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0VuY29kZXJfU3RvcF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpIHsKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9FTkNPREVSX0lOVEVSRkFDRV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgIC8qIERpc2FibGUgdGhlIElucHV0IENhcHR1cmUgY2hhbm5lbHMgMSBhbmQgMgorICAgIChpbiB0aGUgRW5jb2RlckludGVyZmFjZSB0aGUgdHdvIHBvc3NpYmxlIGNoYW5uZWxzIHRoYXQgY2FuIGJlIHVzZWQgYXJlCisgICAgVElNX0NIQU5ORUxfMSBhbmQgVElNX0NIQU5ORUxfMikgKi8KKyAgaWYgKENoYW5uZWwgPT0gVElNX0NIQU5ORUxfMSkgeworICAgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8xLCBUSU1fQ0N4X0RJU0FCTEUpOworCisgICAgLyogRGlzYWJsZSB0aGUgY2FwdHVyZSBjb21wYXJlIEludGVycnVwdHMgMSAqLworICAgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzEpOworICB9IGVsc2UgaWYgKENoYW5uZWwgPT0gVElNX0NIQU5ORUxfMikgeworICAgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8yLCBUSU1fQ0N4X0RJU0FCTEUpOworCisgICAgLyogRGlzYWJsZSB0aGUgY2FwdHVyZSBjb21wYXJlIEludGVycnVwdHMgMiAqLworICAgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzIpOworICB9IGVsc2UgeworICAgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8xLCBUSU1fQ0N4X0RJU0FCTEUpOworICAgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8yLCBUSU1fQ0N4X0RJU0FCTEUpOworCisgICAgLyogRGlzYWJsZSB0aGUgY2FwdHVyZSBjb21wYXJlIEludGVycnVwdHMgMSBhbmQgMiAqLworICAgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzEpOworICAgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzIpOworICB9CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9USU1fRElTQUJMRShodGltKTsKKworICAvKiBTZXQgdGhlIFRJTSBjaGFubmVsKHMpIHN0YXRlICovCisgIGlmICgoQ2hhbm5lbCA9PSBUSU1fQ0hBTk5FTF8xKSB8fCAoQ2hhbm5lbCA9PSBUSU1fQ0hBTk5FTF8yKSkgeworICAgIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBDaGFubmVsLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOworICAgIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIENoYW5uZWwsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7CisgIH0gZWxzZSB7CisgICAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7CisgICAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7CisgICAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMSwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsKKyAgICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8yLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOworICB9CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiAgU3RhcnRzIHRoZSBUSU0gRW5jb2RlciBJbnRlcmZhY2UgaW4gRE1BIG1vZGUuCisgKiBAcGFyYW0gIGh0aW0gVElNIEVuY29kZXIgSW50ZXJmYWNlIGhhbmRsZQorICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVscyB0byBiZSBlbmFibGVkCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfQUxMOiBUSU0gQ2hhbm5lbCAxIGFuZCBUSU0gQ2hhbm5lbCAyIGFyZSBzZWxlY3RlZAorICogQHBhcmFtICBwRGF0YTEgVGhlIGRlc3RpbmF0aW9uIEJ1ZmZlciBhZGRyZXNzIGZvciBJQzEuCisgKiBAcGFyYW0gIHBEYXRhMiBUaGUgZGVzdGluYXRpb24gQnVmZmVyIGFkZHJlc3MgZm9yIElDMi4KKyAqIEBwYXJhbSAgTGVuZ3RoIFRoZSBsZW5ndGggb2YgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZCBmcm9tIFRJTSBwZXJpcGhlcmFsIHRvCisgKiBtZW1vcnkuCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9FbmNvZGVyX1N0YXJ0X0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgKnBEYXRhMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBEYXRhMiwgdWludDE2X3QgTGVuZ3RoKSB7CisgIEhBTF9USU1fQ2hhbm5lbFN0YXRlVHlwZURlZiBjaGFubmVsXzFfc3RhdGUgPQorICAgICAgVElNX0NIQU5ORUxfU1RBVEVfR0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEpOworICBIQUxfVElNX0NoYW5uZWxTdGF0ZVR5cGVEZWYgY2hhbm5lbF8yX3N0YXRlID0KKyAgICAgIFRJTV9DSEFOTkVMX1NUQVRFX0dFVChodGltLCBUSU1fQ0hBTk5FTF8yKTsKKyAgSEFMX1RJTV9DaGFubmVsU3RhdGVUeXBlRGVmIGNvbXBsZW1lbnRhcnlfY2hhbm5lbF8xX3N0YXRlID0KKyAgICAgIFRJTV9DSEFOTkVMX05fU1RBVEVfR0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEpOworICBIQUxfVElNX0NoYW5uZWxTdGF0ZVR5cGVEZWYgY29tcGxlbWVudGFyeV9jaGFubmVsXzJfc3RhdGUgPQorICAgICAgVElNX0NIQU5ORUxfTl9TVEFURV9HRVQoaHRpbSwgVElNX0NIQU5ORUxfMik7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9FTkNPREVSX0lOVEVSRkFDRV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgIC8qIFNldCB0aGUgVElNIGNoYW5uZWwocykgc3RhdGUgKi8KKyAgaWYgKENoYW5uZWwgPT0gVElNX0NIQU5ORUxfMSkgeworICAgIGlmICgoY2hhbm5lbF8xX3N0YXRlID09IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKSB8fAorICAgICAgICAoY29tcGxlbWVudGFyeV9jaGFubmVsXzFfc3RhdGUgPT0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX0JVU1kpKSB7CisgICAgICByZXR1cm4gSEFMX0JVU1k7CisgICAgfSBlbHNlIGlmICgoY2hhbm5lbF8xX3N0YXRlID09IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSkgJiYKKyAgICAgICAgICAgICAgIChjb21wbGVtZW50YXJ5X2NoYW5uZWxfMV9zdGF0ZSA9PSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpKSB7CisgICAgICBpZiAoKHBEYXRhMSA9PSBOVUxMKSB8fCAoTGVuZ3RoID09IDBVKSkgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKTsKKyAgICAgICAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX0JVU1kpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKyAgfSBlbHNlIGlmIChDaGFubmVsID09IFRJTV9DSEFOTkVMXzIpIHsKKyAgICBpZiAoKGNoYW5uZWxfMl9zdGF0ZSA9PSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSkgfHwKKyAgICAgICAgKGNvbXBsZW1lbnRhcnlfY2hhbm5lbF8yX3N0YXRlID09IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKSkgeworICAgICAgcmV0dXJuIEhBTF9CVVNZOworICAgIH0gZWxzZSBpZiAoKGNoYW5uZWxfMl9zdGF0ZSA9PSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpICYmCisgICAgICAgICAgICAgICAoY29tcGxlbWVudGFyeV9jaGFubmVsXzJfc3RhdGUgPT0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKSkgeworICAgICAgaWYgKChwRGF0YTIgPT0gTlVMTCkgfHwgKExlbmd0aCA9PSAwVSkpIHsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8yLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSk7CisgICAgICAgIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKChjaGFubmVsXzFfc3RhdGUgPT0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX0JVU1kpIHx8CisgICAgICAgIChjaGFubmVsXzJfc3RhdGUgPT0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX0JVU1kpIHx8CisgICAgICAgIChjb21wbGVtZW50YXJ5X2NoYW5uZWxfMV9zdGF0ZSA9PSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSkgfHwKKyAgICAgICAgKGNvbXBsZW1lbnRhcnlfY2hhbm5lbF8yX3N0YXRlID09IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKSkgeworICAgICAgcmV0dXJuIEhBTF9CVVNZOworICAgIH0gZWxzZSBpZiAoKGNoYW5uZWxfMV9zdGF0ZSA9PSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpICYmCisgICAgICAgICAgICAgICAoY2hhbm5lbF8yX3N0YXRlID09IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSkgJiYKKyAgICAgICAgICAgICAgIChjb21wbGVtZW50YXJ5X2NoYW5uZWxfMV9zdGF0ZSA9PSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpICYmCisgICAgICAgICAgICAgICAoY29tcGxlbWVudGFyeV9jaGFubmVsXzJfc3RhdGUgPT0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKSkgeworICAgICAgaWYgKCgoKHBEYXRhMSA9PSBOVUxMKSB8fCAocERhdGEyID09IE5VTEwpKSkgfHwgKExlbmd0aCA9PSAwVSkpIHsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8xLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSk7CisgICAgICAgIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8yLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSk7CisgICAgICAgIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKTsKKyAgICAgICAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX0JVU1kpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKyAgfQorCisgIHN3aXRjaCAoQ2hhbm5lbCkgeworICAgIGNhc2UgVElNX0NIQU5ORUxfMTogeworICAgICAgLyogU2V0IHRoZSBETUEgY2FwdHVyZSBjYWxsYmFja3MgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQUNhcHR1cmVDcGx0OworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gVElNX0RNQUNhcHR1cmVIYWxmQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvcjsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5DQ1IxLCAodWludDMyX3QpcERhdGExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVuZ3RoKSAhPSBIQUxfT0spIHsKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgLyogRW5hYmxlIHRoZSBUSU0gSW5wdXQgQ2FwdHVyZSBETUEgcmVxdWVzdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzEpOworCisgICAgICAvKiBFbmFibGUgdGhlIENhcHR1cmUgY29tcGFyZSBjaGFubmVsICovCisgICAgICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMSwgVElNX0NDeF9FTkFCTEUpOworCisgICAgICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7CisKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMjogeworICAgICAgLyogU2V0IHRoZSBETUEgY2FwdHVyZSBjYWxsYmFja3MgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQUNhcHR1cmVDcGx0OworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gVElNX0RNQUNhcHR1cmVIYWxmQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvcjsKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+Q0NSMiwgKHVpbnQzMl90KXBEYXRhMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExlbmd0aCkgIT0gSEFMX09LKSB7CisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIElucHV0IENhcHR1cmUgIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMik7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgQ2FwdHVyZSBjb21wYXJlIGNoYW5uZWwgKi8KKyAgICAgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8yLCBUSU1fQ0N4X0VOQUJMRSk7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRShodGltKTsKKworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGVmYXVsdDogeworICAgICAgLyogU2V0IHRoZSBETUEgY2FwdHVyZSBjYWxsYmFja3MgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQUNhcHR1cmVDcGx0OworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gVElNX0RNQUNhcHR1cmVIYWxmQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvcjsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5DQ1IxLCAodWludDMyX3QpcERhdGExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVuZ3RoKSAhPSBIQUxfT0spIHsKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorCisgICAgICAvKiBTZXQgdGhlIERNQSBjYXB0dXJlIGNhbGxiYWNrcyAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BQ2FwdHVyZUNwbHQ7CisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BQ2FwdHVyZUhhbGZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkNDUjIsICh1aW50MzJfdClwRGF0YTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMZW5ndGgpICE9IEhBTF9PSykgeworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIElucHV0IENhcHR1cmUgIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMSk7CisgICAgICAvKiBFbmFibGUgdGhlIFRJTSBJbnB1dCBDYXB0dXJlICBETUEgcmVxdWVzdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzIpOworCisgICAgICAvKiBFbmFibGUgdGhlIENhcHR1cmUgY29tcGFyZSBjaGFubmVsICovCisgICAgICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMSwgVElNX0NDeF9FTkFCTEUpOworICAgICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzIsIFRJTV9DQ3hfRU5BQkxFKTsKKworICAgICAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOworCisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICogQGJyaWVmICBTdG9wcyB0aGUgVElNIEVuY29kZXIgSW50ZXJmYWNlIGluIERNQSBtb2RlLgorICogQHBhcmFtICBodGltIFRJTSBFbmNvZGVyIEludGVyZmFjZSBoYW5kbGUKKyAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbHMgdG8gYmUgZW5hYmxlZAorICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMX0FMTDogVElNIENoYW5uZWwgMSBhbmQgVElNIENoYW5uZWwgMiBhcmUgc2VsZWN0ZWQKKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0VuY29kZXJfU3RvcF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCkgeworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0VOQ09ERVJfSU5URVJGQUNFX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgLyogRGlzYWJsZSB0aGUgSW5wdXQgQ2FwdHVyZSBjaGFubmVscyAxIGFuZCAyCisgICAgKGluIHRoZSBFbmNvZGVySW50ZXJmYWNlIHRoZSB0d28gcG9zc2libGUgY2hhbm5lbHMgdGhhdCBjYW4gYmUgdXNlZCBhcmUKKyAgICBUSU1fQ0hBTk5FTF8xIGFuZCBUSU1fQ0hBTk5FTF8yKSAqLworICBpZiAoQ2hhbm5lbCA9PSBUSU1fQ0hBTk5FTF8xKSB7CisgICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzEsIFRJTV9DQ3hfRElTQUJMRSk7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBjYXB0dXJlIGNvbXBhcmUgRE1BIFJlcXVlc3QgMSAqLworICAgIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMSk7CisgICAgKHZvaWQpSEFMX0RNQV9BYm9ydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXSk7CisgIH0gZWxzZSBpZiAoQ2hhbm5lbCA9PSBUSU1fQ0hBTk5FTF8yKSB7CisgICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzIsIFRJTV9DQ3hfRElTQUJMRSk7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBjYXB0dXJlIGNvbXBhcmUgRE1BIFJlcXVlc3QgMiAqLworICAgIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMik7CisgICAgKHZvaWQpSEFMX0RNQV9BYm9ydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXSk7CisgIH0gZWxzZSB7CisgICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzEsIFRJTV9DQ3hfRElTQUJMRSk7CisgICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzIsIFRJTV9DQ3hfRElTQUJMRSk7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBjYXB0dXJlIGNvbXBhcmUgRE1BIFJlcXVlc3QgMSBhbmQgMiAqLworICAgIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMSk7CisgICAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MyKTsKKyAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdKTsKKyAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdKTsKKyAgfQorCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7CisKKyAgLyogU2V0IHRoZSBUSU0gY2hhbm5lbChzKSBzdGF0ZSAqLworICBpZiAoKENoYW5uZWwgPT0gVElNX0NIQU5ORUxfMSkgfHwgKENoYW5uZWwgPT0gVElNX0NIQU5ORUxfMikpIHsKKyAgICBUSU1fQ0hBTk5FTF9TVEFURV9TRVQoaHRpbSwgQ2hhbm5lbCwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsKKyAgICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBDaGFubmVsLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOworICB9IGVsc2UgeworICAgIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8xLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOworICAgIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8yLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOworICAgIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7CisgICAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMiwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsKKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAfQorICovCisvKiogQGRlZmdyb3VwIFRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA3IFRJTSBJUlEgaGFuZGxlciBtYW5hZ2VtZW50CisgICogIEBicmllZiAgICBUSU0gSVJRIGhhbmRsZXIgbWFuYWdlbWVudAorICAqCitAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBJUlEgaGFuZGxlciBtYW5hZ2VtZW50ICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIFRpbWVyIElSUSBoYW5kbGVyIGZ1bmN0aW9uLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworLyoqCisgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBUSU0gaW50ZXJydXB0cyByZXF1ZXN0cy4KKyAqIEBwYXJhbSAgaHRpbSBUSU0gIGhhbmRsZQorICogQHJldHZhbCBOb25lCisgKi8KK3ZvaWQgSEFMX1RJTV9JUlFIYW5kbGVyKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKSB7CisgIHVpbnQzMl90IGl0c291cmNlID0gaHRpbS0+SW5zdGFuY2UtPkRJRVI7CisgIHVpbnQzMl90IGl0ZmxhZyA9IGh0aW0tPkluc3RhbmNlLT5TUjsKKworICAvKiBDYXB0dXJlIGNvbXBhcmUgMSBldmVudCAqLworICBpZiAoKGl0ZmxhZyAmIChUSU1fRkxBR19DQzEpKSA9PSAoVElNX0ZMQUdfQ0MxKSkgeworICAgIGlmICgoaXRzb3VyY2UgJiAoVElNX0lUX0NDMSkpID09IChUSU1fSVRfQ0MxKSkgeworICAgICAgeworICAgICAgICBfX0hBTF9USU1fQ0xFQVJfRkxBRyhodGltLCBUSU1fRkxBR19DQzEpOworICAgICAgICBodGltLT5DaGFubmVsID0gSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF8xOworCisgICAgICAgIC8qIElucHV0IGNhcHR1cmUgZXZlbnQgKi8KKyAgICAgICAgaWYgKChodGltLT5JbnN0YW5jZS0+Q0NNUjEgJiBUSU1fQ0NNUjFfQ0MxUykgIT0gMHgwMFUpIHsKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgICAgaHRpbS0+SUNfQ2FwdHVyZUNhbGxiYWNrKGh0aW0pOworI2Vsc2UKKyAgICAgICAgICBIQUxfVElNX0lDX0NhcHR1cmVDYWxsYmFjayhodGltKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAgICAgfQorICAgICAgICAvKiBPdXRwdXQgY29tcGFyZSBldmVudCAqLworICAgICAgICBlbHNlIHsKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgICAgaHRpbS0+T0NfRGVsYXlFbGFwc2VkQ2FsbGJhY2soaHRpbSk7CisgICAgICAgICAgaHRpbS0+UFdNX1B1bHNlRmluaXNoZWRDYWxsYmFjayhodGltKTsKKyNlbHNlCisgICAgICAgICAgSEFMX1RJTV9PQ19EZWxheUVsYXBzZWRDYWxsYmFjayhodGltKTsKKyAgICAgICAgICBIQUxfVElNX1BXTV9QdWxzZUZpbmlzaGVkQ2FsbGJhY2soaHRpbSk7CisjZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgICAgIH0KKyAgICAgICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfQ0xFQVJFRDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLyogQ2FwdHVyZSBjb21wYXJlIDIgZXZlbnQgKi8KKyAgaWYgKChpdGZsYWcgJiAoVElNX0ZMQUdfQ0MyKSkgPT0gKFRJTV9GTEFHX0NDMikpIHsKKyAgICBpZiAoKGl0c291cmNlICYgKFRJTV9JVF9DQzIpKSA9PSAoVElNX0lUX0NDMikpIHsKKyAgICAgIF9fSEFMX1RJTV9DTEVBUl9GTEFHKGh0aW0sIFRJTV9GTEFHX0NDMik7CisgICAgICBodGltLT5DaGFubmVsID0gSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF8yOworICAgICAgLyogSW5wdXQgY2FwdHVyZSBldmVudCAqLworICAgICAgaWYgKChodGltLT5JbnN0YW5jZS0+Q0NNUjEgJiBUSU1fQ0NNUjFfQ0MyUykgIT0gMHgwMFUpIHsKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgIGh0aW0tPklDX0NhcHR1cmVDYWxsYmFjayhodGltKTsKKyNlbHNlCisgICAgICAgIEhBTF9USU1fSUNfQ2FwdHVyZUNhbGxiYWNrKGh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgfQorICAgICAgLyogT3V0cHV0IGNvbXBhcmUgZXZlbnQgKi8KKyAgICAgIGVsc2UgeworI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgaHRpbS0+T0NfRGVsYXlFbGFwc2VkQ2FsbGJhY2soaHRpbSk7CisgICAgICAgIGh0aW0tPlBXTV9QdWxzZUZpbmlzaGVkQ2FsbGJhY2soaHRpbSk7CisjZWxzZQorICAgICAgICBIQUxfVElNX09DX0RlbGF5RWxhcHNlZENhbGxiYWNrKGh0aW0pOworICAgICAgICBIQUxfVElNX1BXTV9QdWxzZUZpbmlzaGVkQ2FsbGJhY2soaHRpbSk7CisjZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgICB9CisgICAgICBodGltLT5DaGFubmVsID0gSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF9DTEVBUkVEOworICAgIH0KKyAgfQorICAvKiBDYXB0dXJlIGNvbXBhcmUgMyBldmVudCAqLworICBpZiAoKGl0ZmxhZyAmIChUSU1fRkxBR19DQzMpKSA9PSAoVElNX0ZMQUdfQ0MzKSkgeworICAgIGlmICgoaXRzb3VyY2UgJiAoVElNX0lUX0NDMykpID09IChUSU1fSVRfQ0MzKSkgeworICAgICAgX19IQUxfVElNX0NMRUFSX0ZMQUcoaHRpbSwgVElNX0ZMQUdfQ0MzKTsKKyAgICAgIGh0aW0tPkNoYW5uZWwgPSBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzM7CisgICAgICAvKiBJbnB1dCBjYXB0dXJlIGV2ZW50ICovCisgICAgICBpZiAoKGh0aW0tPkluc3RhbmNlLT5DQ01SMiAmIFRJTV9DQ01SMl9DQzNTKSAhPSAweDAwVSkgeworI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgaHRpbS0+SUNfQ2FwdHVyZUNhbGxiYWNrKGh0aW0pOworI2Vsc2UKKyAgICAgICAgSEFMX1RJTV9JQ19DYXB0dXJlQ2FsbGJhY2soaHRpbSk7CisjZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgICB9CisgICAgICAvKiBPdXRwdXQgY29tcGFyZSBldmVudCAqLworICAgICAgZWxzZSB7CisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgICBodGltLT5PQ19EZWxheUVsYXBzZWRDYWxsYmFjayhodGltKTsKKyAgICAgICAgaHRpbS0+UFdNX1B1bHNlRmluaXNoZWRDYWxsYmFjayhodGltKTsKKyNlbHNlCisgICAgICAgIEhBTF9USU1fT0NfRGVsYXlFbGFwc2VkQ2FsbGJhY2soaHRpbSk7CisgICAgICAgIEhBTF9USU1fUFdNX1B1bHNlRmluaXNoZWRDYWxsYmFjayhodGltKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAgIH0KKyAgICAgIGh0aW0tPkNoYW5uZWwgPSBIQUxfVElNX0FDVElWRV9DSEFOTkVMX0NMRUFSRUQ7CisgICAgfQorICB9CisgIC8qIENhcHR1cmUgY29tcGFyZSA0IGV2ZW50ICovCisgIGlmICgoaXRmbGFnICYgKFRJTV9GTEFHX0NDNCkpID09IChUSU1fRkxBR19DQzQpKSB7CisgICAgaWYgKChpdHNvdXJjZSAmIChUSU1fSVRfQ0M0KSkgPT0gKFRJTV9JVF9DQzQpKSB7CisgICAgICBfX0hBTF9USU1fQ0xFQVJfRkxBRyhodGltLCBUSU1fRkxBR19DQzQpOworICAgICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfNDsKKyAgICAgIC8qIElucHV0IGNhcHR1cmUgZXZlbnQgKi8KKyAgICAgIGlmICgoaHRpbS0+SW5zdGFuY2UtPkNDTVIyICYgVElNX0NDTVIyX0NDNFMpICE9IDB4MDBVKSB7CisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgICBodGltLT5JQ19DYXB0dXJlQ2FsbGJhY2soaHRpbSk7CisjZWxzZQorICAgICAgICBIQUxfVElNX0lDX0NhcHR1cmVDYWxsYmFjayhodGltKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAgIH0KKyAgICAgIC8qIE91dHB1dCBjb21wYXJlIGV2ZW50ICovCisgICAgICBlbHNlIHsKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgIGh0aW0tPk9DX0RlbGF5RWxhcHNlZENhbGxiYWNrKGh0aW0pOworICAgICAgICBodGltLT5QV01fUHVsc2VGaW5pc2hlZENhbGxiYWNrKGh0aW0pOworI2Vsc2UKKyAgICAgICAgSEFMX1RJTV9PQ19EZWxheUVsYXBzZWRDYWxsYmFjayhodGltKTsKKyAgICAgICAgSEFMX1RJTV9QV01fUHVsc2VGaW5pc2hlZENhbGxiYWNrKGh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgfQorICAgICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfQ0xFQVJFRDsKKyAgICB9CisgIH0KKyAgLyogVElNIFVwZGF0ZSBldmVudCAqLworICBpZiAoKGl0ZmxhZyAmIChUSU1fRkxBR19VUERBVEUpKSA9PSAoVElNX0ZMQUdfVVBEQVRFKSkgeworICAgIGlmICgoaXRzb3VyY2UgJiAoVElNX0lUX1VQREFURSkpID09IChUSU1fSVRfVVBEQVRFKSkgeworICAgICAgX19IQUxfVElNX0NMRUFSX0ZMQUcoaHRpbSwgVElNX0ZMQUdfVVBEQVRFKTsKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICBodGltLT5QZXJpb2RFbGFwc2VkQ2FsbGJhY2soaHRpbSk7CisjZWxzZQorICAgICAgSEFMX1RJTV9QZXJpb2RFbGFwc2VkQ2FsbGJhY2soaHRpbSk7CisjZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgfQorICB9CisgIC8qIFRJTSBCcmVhayBpbnB1dCBldmVudCAqLworICBpZiAoKChpdGZsYWcgJiAoVElNX0ZMQUdfQlJFQUspKSA9PSAoVElNX0ZMQUdfQlJFQUspKSB8fAorICAgICAgKChpdGZsYWcgJiAoVElNX0ZMQUdfU1lTVEVNX0JSRUFLKSkgPT0gKFRJTV9GTEFHX1NZU1RFTV9CUkVBSykpKSB7CisgICAgaWYgKChpdHNvdXJjZSAmIChUSU1fSVRfQlJFQUspKSA9PSAoVElNX0lUX0JSRUFLKSkgeworICAgICAgX19IQUxfVElNX0NMRUFSX0ZMQUcoaHRpbSwgVElNX0ZMQUdfQlJFQUsgfCBUSU1fRkxBR19TWVNURU1fQlJFQUspOworI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgIGh0aW0tPkJyZWFrQ2FsbGJhY2soaHRpbSk7CisjZWxzZQorICAgICAgSEFMX1RJTUV4X0JyZWFrQ2FsbGJhY2soaHRpbSk7CisjZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgfQorICB9CisgIC8qIFRJTSBCcmVhazIgaW5wdXQgZXZlbnQgKi8KKyAgaWYgKChpdGZsYWcgJiAoVElNX0ZMQUdfQlJFQUsyKSkgPT0gKFRJTV9GTEFHX0JSRUFLMikpIHsKKyAgICBpZiAoKGl0c291cmNlICYgKFRJTV9JVF9CUkVBSykpID09IChUSU1fSVRfQlJFQUspKSB7CisgICAgICBfX0hBTF9USU1fQ0xFQVJfRkxBRyhodGltLCBUSU1fRkxBR19CUkVBSzIpOworI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgIGh0aW0tPkJyZWFrMkNhbGxiYWNrKGh0aW0pOworI2Vsc2UKKyAgICAgIEhBTF9USU1FeF9CcmVhazJDYWxsYmFjayhodGltKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgIH0KKyAgLyogVElNIFRyaWdnZXIgZGV0ZWN0aW9uIGV2ZW50ICovCisgIGlmICgoaXRmbGFnICYgKFRJTV9GTEFHX1RSSUdHRVIpKSA9PSAoVElNX0ZMQUdfVFJJR0dFUikpIHsKKyAgICBpZiAoKGl0c291cmNlICYgKFRJTV9JVF9UUklHR0VSKSkgPT0gKFRJTV9JVF9UUklHR0VSKSkgeworICAgICAgX19IQUxfVElNX0NMRUFSX0ZMQUcoaHRpbSwgVElNX0ZMQUdfVFJJR0dFUik7CisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgaHRpbS0+VHJpZ2dlckNhbGxiYWNrKGh0aW0pOworI2Vsc2UKKyAgICAgIEhBTF9USU1fVHJpZ2dlckNhbGxiYWNrKGh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KKyAgfQorICAvKiBUSU0gY29tbXV0YXRpb24gZXZlbnQgKi8KKyAgaWYgKChpdGZsYWcgJiAoVElNX0ZMQUdfQ09NKSkgPT0gKFRJTV9GTEFHX0NPTSkpIHsKKyAgICBpZiAoKGl0c291cmNlICYgKFRJTV9JVF9DT00pKSA9PSAoVElNX0lUX0NPTSkpIHsKKyAgICAgIF9fSEFMX1RJTV9DTEVBUl9GTEFHKGh0aW0sIFRJTV9GTEFHX0NPTSk7CisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgaHRpbS0+Q29tbXV0YXRpb25DYWxsYmFjayhodGltKTsKKyNlbHNlCisgICAgICBIQUxfVElNRXhfQ29tbXV0Q2FsbGJhY2soaHRpbSk7CisjZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgfQorICB9CisgIC8qIFRJTSBFbmNvZGVyIGluZGV4IGV2ZW50ICovCisgIGlmICgoaXRmbGFnICYgKFRJTV9GTEFHX0lEWCkpID09IChUSU1fRkxBR19JRFgpKSB7CisgICAgaWYgKChpdHNvdXJjZSAmIChUSU1fSVRfSURYKSkgPT0gKFRJTV9JVF9JRFgpKSB7CisgICAgICBfX0hBTF9USU1fQ0xFQVJfRkxBRyhodGltLCBUSU1fRkxBR19JRFgpOworI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgIGh0aW0tPkVuY29kZXJJbmRleENhbGxiYWNrKGh0aW0pOworI2Vsc2UKKyAgICAgIEhBTF9USU1FeF9FbmNvZGVySW5kZXhDYWxsYmFjayhodGltKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgIH0KKyAgLyogVElNIERpcmVjdGlvbiBjaGFuZ2UgZXZlbnQgKi8KKyAgaWYgKChpdGZsYWcgJiAoVElNX0ZMQUdfRElSKSkgPT0gKFRJTV9GTEFHX0RJUikpIHsKKyAgICBpZiAoKGl0c291cmNlICYgKFRJTV9JVF9ESVIpKSA9PSAoVElNX0lUX0RJUikpIHsKKyAgICAgIF9fSEFMX1RJTV9DTEVBUl9GTEFHKGh0aW0sIFRJTV9GTEFHX0RJUik7CisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgaHRpbS0+RGlyZWN0aW9uQ2hhbmdlQ2FsbGJhY2soaHRpbSk7CisjZWxzZQorICAgICAgSEFMX1RJTUV4X0RpcmVjdGlvbkNoYW5nZUNhbGxiYWNrKGh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KKyAgfQorICAvKiBUSU0gSW5kZXggZXJyb3IgZXZlbnQgKi8KKyAgaWYgKChpdGZsYWcgJiAoVElNX0ZMQUdfSUVSUikpID09IChUSU1fRkxBR19JRVJSKSkgeworICAgIGlmICgoaXRzb3VyY2UgJiAoVElNX0lUX0lFUlIpKSA9PSAoVElNX0lUX0lFUlIpKSB7CisgICAgICBfX0hBTF9USU1fQ0xFQVJfRkxBRyhodGltLCBUSU1fRkxBR19JRVJSKTsKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICBodGltLT5JbmRleEVycm9yQ2FsbGJhY2soaHRpbSk7CisjZWxzZQorICAgICAgSEFMX1RJTUV4X0luZGV4RXJyb3JDYWxsYmFjayhodGltKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgIH0KKyAgLyogVElNIFRyYW5zaXRpb24gZXJyb3IgZXZlbnQgKi8KKyAgaWYgKChpdGZsYWcgJiAoVElNX0ZMQUdfVEVSUikpID09IChUSU1fRkxBR19URVJSKSkgeworICAgIGlmICgoaXRzb3VyY2UgJiAoVElNX0lUX1RFUlIpKSA9PSAoVElNX0lUX1RFUlIpKSB7CisgICAgICBfX0hBTF9USU1fQ0xFQVJfRkxBRyhodGltLCBUSU1fRkxBR19URVJSKTsKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICBodGltLT5UcmFuc2l0aW9uRXJyb3JDYWxsYmFjayhodGltKTsKKyNlbHNlCisgICAgICBIQUxfVElNRXhfVHJhbnNpdGlvbkVycm9yQ2FsbGJhY2soaHRpbSk7CisjZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgfQorICB9Cit9CisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA4IFRJTSBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgICogIEBicmllZiAgICBUSU0gUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyBbLi5dCisgICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICAgKCspIENvbmZpZ3VyZSBUaGUgSW5wdXQgT3V0cHV0IGNoYW5uZWxzIGZvciBPQywgUFdNLCBJQyBvciBPbmUgUHVsc2UgbW9kZS4KKyAgICAgICgrKSBDb25maWd1cmUgRXh0ZXJuYWwgQ2xvY2sgc291cmNlLgorICAgICAgKCspIENvbmZpZ3VyZSBDb21wbGVtZW50YXJ5IGNoYW5uZWxzLCBicmVhayBmZWF0dXJlcyBhbmQgZGVhZCB0aW1lLgorICAgICAgKCspIENvbmZpZ3VyZSBNYXN0ZXIgYW5kIHRoZSBTbGF2ZSBzeW5jaHJvbml6YXRpb24uCisgICAgICAoKykgQ29uZmlndXJlIHRoZSBETUEgQnVyc3QgTW9kZS4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgQ2hhbm5lbHMgYWNjb3JkaW5nIHRvIHRoZQorICogc3BlY2lmaWVkIHBhcmFtZXRlcnMgaW4gdGhlIFRJTV9PQ19Jbml0VHlwZURlZi4KKyAqIEBwYXJhbSAgaHRpbSBUSU0gT3V0cHV0IENvbXBhcmUgaGFuZGxlCisgKiBAcGFyYW0gIHNDb25maWcgVElNIE91dHB1dCBDb21wYXJlIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlCisgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWxzIHRvIGNvbmZpZ3VyZQorICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNTogVElNIENoYW5uZWwgNSBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzY6IFRJTSBDaGFubmVsIDYgc2VsZWN0ZWQKKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09DX0NvbmZpZ0NoYW5uZWwoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVElNX09DX0luaXRUeXBlRGVmICpzQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpIHsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0hBTk5FTFMoQ2hhbm5lbCkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX09DX0NIQU5ORUxfTU9ERShzQ29uZmlnLT5PQ01vZGUsIENoYW5uZWwpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PQ19QT0xBUklUWShzQ29uZmlnLT5PQ1BvbGFyaXR5KSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodGltKTsKKworICBzd2l0Y2ggKENoYW5uZWwpIHsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzE6IHsKKyAgICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDMV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgICAgICAvKiBDb25maWd1cmUgdGhlIFRJTSBDaGFubmVsIDEgaW4gT3V0cHV0IENvbXBhcmUgKi8KKyAgICAgIFRJTV9PQzFfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCBzQ29uZmlnKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMjogeworICAgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0MyX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgICAgIC8qIENvbmZpZ3VyZSB0aGUgVElNIENoYW5uZWwgMiBpbiBPdXRwdXQgQ29tcGFyZSAqLworICAgICAgVElNX09DMl9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsIHNDb25maWcpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8zOiB7CisgICAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzNfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICAgICAgLyogQ29uZmlndXJlIHRoZSBUSU0gQ2hhbm5lbCAzIGluIE91dHB1dCBDb21wYXJlICovCisgICAgICBUSU1fT0MzX1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgc0NvbmZpZyk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzQ6IHsKKyAgICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDNF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgICAgICAvKiBDb25maWd1cmUgdGhlIFRJTSBDaGFubmVsIDQgaW4gT3V0cHV0IENvbXBhcmUgKi8KKyAgICAgIFRJTV9PQzRfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCBzQ29uZmlnKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfNTogeworICAgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0M1X0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgICAgIC8qIENvbmZpZ3VyZSB0aGUgVElNIENoYW5uZWwgNSBpbiBPdXRwdXQgQ29tcGFyZSAqLworICAgICAgVElNX09DNV9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsIHNDb25maWcpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF82OiB7CisgICAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzZfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICAgICAgLyogQ29uZmlndXJlIHRoZSBUSU0gQ2hhbm5lbCA2IGluIE91dHB1dCBDb21wYXJlICovCisgICAgICBUSU1fT0M2X1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgc0NvbmZpZyk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgICAgYnJlYWs7CisgIH0KKworICBfX0hBTF9VTkxPQ0soaHRpbSk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBUSU0gSW5wdXQgQ2FwdHVyZSBDaGFubmVscyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAorICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBUSU1fSUNfSW5pdFR5cGVEZWYuCisgKiBAcGFyYW0gIGh0aW0gVElNIElDIGhhbmRsZQorICogQHBhcmFtICBzQ29uZmlnIFRJTSBJbnB1dCBDYXB0dXJlIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlCisgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWwgdG8gY29uZmlndXJlCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0lDX0NvbmZpZ0NoYW5uZWwoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVElNX0lDX0luaXRUeXBlRGVmICpzQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpIHsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0MxX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fSUNfUE9MQVJJVFkoc0NvbmZpZy0+SUNQb2xhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lDX1NFTEVDVElPTihzQ29uZmlnLT5JQ1NlbGVjdGlvbikpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lDX1BSRVNDQUxFUihzQ29uZmlnLT5JQ1ByZXNjYWxlcikpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lDX0ZJTFRFUihzQ29uZmlnLT5JQ0ZpbHRlcikpOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHRpbSk7CisKKyAgaWYgKENoYW5uZWwgPT0gVElNX0NIQU5ORUxfMSkgeworICAgIC8qIFRJMSBDb25maWd1cmF0aW9uICovCisgICAgVElNX1RJMV9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsIHNDb25maWctPklDUG9sYXJpdHksIHNDb25maWctPklDU2VsZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgIHNDb25maWctPklDRmlsdGVyKTsKKworICAgIC8qIFJlc2V0IHRoZSBJQzFQU0MgQml0cyAqLworICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMSAmPSB+VElNX0NDTVIxX0lDMVBTQzsKKworICAgIC8qIFNldCB0aGUgSUMxUFNDIHZhbHVlICovCisgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIxIHw9IHNDb25maWctPklDUHJlc2NhbGVyOworICB9IGVsc2UgaWYgKENoYW5uZWwgPT0gVElNX0NIQU5ORUxfMikgeworICAgIC8qIFRJMiBDb25maWd1cmF0aW9uICovCisgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzJfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICAgIFRJTV9USTJfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCBzQ29uZmlnLT5JQ1BvbGFyaXR5LCBzQ29uZmlnLT5JQ1NlbGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICBzQ29uZmlnLT5JQ0ZpbHRlcik7CisKKyAgICAvKiBSZXNldCB0aGUgSUMyUFNDIEJpdHMgKi8KKyAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjEgJj0gflRJTV9DQ01SMV9JQzJQU0M7CisKKyAgICAvKiBTZXQgdGhlIElDMlBTQyB2YWx1ZSAqLworICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMSB8PSAoc0NvbmZpZy0+SUNQcmVzY2FsZXIgPDwgOFUpOworICB9IGVsc2UgaWYgKENoYW5uZWwgPT0gVElNX0NIQU5ORUxfMykgeworICAgIC8qIFRJMyBDb25maWd1cmF0aW9uICovCisgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzNfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICAgIFRJTV9USTNfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCBzQ29uZmlnLT5JQ1BvbGFyaXR5LCBzQ29uZmlnLT5JQ1NlbGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICBzQ29uZmlnLT5JQ0ZpbHRlcik7CisKKyAgICAvKiBSZXNldCB0aGUgSUMzUFNDIEJpdHMgKi8KKyAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjIgJj0gflRJTV9DQ01SMl9JQzNQU0M7CisKKyAgICAvKiBTZXQgdGhlIElDM1BTQyB2YWx1ZSAqLworICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMiB8PSBzQ29uZmlnLT5JQ1ByZXNjYWxlcjsKKyAgfSBlbHNlIGlmIChDaGFubmVsID09IFRJTV9DSEFOTkVMXzQpIHsKKyAgICAvKiBUSTQgQ29uZmlndXJhdGlvbiAqLworICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0M0X0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgICBUSU1fVEk0X1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgc0NvbmZpZy0+SUNQb2xhcml0eSwgc0NvbmZpZy0+SUNTZWxlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgc0NvbmZpZy0+SUNGaWx0ZXIpOworCisgICAgLyogUmVzZXQgdGhlIElDNFBTQyBCaXRzICovCisgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIyICY9IH5USU1fQ0NNUjJfSUM0UFNDOworCisgICAgLyogU2V0IHRoZSBJQzRQU0MgdmFsdWUgKi8KKyAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjIgfD0gKHNDb25maWctPklDUHJlc2NhbGVyIDw8IDhVKTsKKyAgfSBlbHNlIHsKKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKworICBfX0hBTF9VTkxPQ0soaHRpbSk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBUSU0gUFdNICBjaGFubmVscyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAorICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBUSU1fT0NfSW5pdFR5cGVEZWYuCisgKiBAcGFyYW0gIGh0aW0gVElNIFBXTSBoYW5kbGUKKyAqIEBwYXJhbSAgc0NvbmZpZyBUSU0gUFdNIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlCisgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWxzIHRvIGJlIGNvbmZpZ3VyZWQKKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzU6IFRJTSBDaGFubmVsIDUgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF82OiBUSU0gQ2hhbm5lbCA2IHNlbGVjdGVkCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9QV01fQ29uZmlnQ2hhbm5lbChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVElNX09DX0luaXRUeXBlRGVmICpzQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKSB7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NIQU5ORUxTKENoYW5uZWwpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9QV01fTU9ERShzQ29uZmlnLT5PQ01vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PQ19QT0xBUklUWShzQ29uZmlnLT5PQ1BvbGFyaXR5KSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fRkFTVF9TVEFURShzQ29uZmlnLT5PQ0Zhc3RNb2RlKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodGltKTsKKworICBzd2l0Y2ggKENoYW5uZWwpIHsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzE6IHsKKyAgICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDMV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgICAgICAvKiBDb25maWd1cmUgdGhlIENoYW5uZWwgMSBpbiBQV00gbW9kZSAqLworICAgICAgVElNX09DMV9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsIHNDb25maWcpOworCisgICAgICAvKiBTZXQgdGhlIFByZWxvYWQgZW5hYmxlIGJpdCBmb3IgY2hhbm5lbDEgKi8KKyAgICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMSB8PSBUSU1fQ0NNUjFfT0MxUEU7CisKKyAgICAgIC8qIENvbmZpZ3VyZSB0aGUgT3V0cHV0IEZhc3QgbW9kZSAqLworICAgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIxICY9IH5USU1fQ0NNUjFfT0MxRkU7CisgICAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjEgfD0gc0NvbmZpZy0+T0NGYXN0TW9kZTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMjogeworICAgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0MyX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgICAgIC8qIENvbmZpZ3VyZSB0aGUgQ2hhbm5lbCAyIGluIFBXTSBtb2RlICovCisgICAgICBUSU1fT0MyX1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgc0NvbmZpZyk7CisKKyAgICAgIC8qIFNldCB0aGUgUHJlbG9hZCBlbmFibGUgYml0IGZvciBjaGFubmVsMiAqLworICAgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIxIHw9IFRJTV9DQ01SMV9PQzJQRTsKKworICAgICAgLyogQ29uZmlndXJlIHRoZSBPdXRwdXQgRmFzdCBtb2RlICovCisgICAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjEgJj0gflRJTV9DQ01SMV9PQzJGRTsKKyAgICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMSB8PSBzQ29uZmlnLT5PQ0Zhc3RNb2RlIDw8IDhVOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8zOiB7CisgICAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzNfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICAgICAgLyogQ29uZmlndXJlIHRoZSBDaGFubmVsIDMgaW4gUFdNIG1vZGUgKi8KKyAgICAgIFRJTV9PQzNfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCBzQ29uZmlnKTsKKworICAgICAgLyogU2V0IHRoZSBQcmVsb2FkIGVuYWJsZSBiaXQgZm9yIGNoYW5uZWwzICovCisgICAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjIgfD0gVElNX0NDTVIyX09DM1BFOworCisgICAgICAvKiBDb25maWd1cmUgdGhlIE91dHB1dCBGYXN0IG1vZGUgKi8KKyAgICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMiAmPSB+VElNX0NDTVIyX09DM0ZFOworICAgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIyIHw9IHNDb25maWctPk9DRmFzdE1vZGU7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzQ6IHsKKyAgICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDNF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgICAgICAvKiBDb25maWd1cmUgdGhlIENoYW5uZWwgNCBpbiBQV00gbW9kZSAqLworICAgICAgVElNX09DNF9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsIHNDb25maWcpOworCisgICAgICAvKiBTZXQgdGhlIFByZWxvYWQgZW5hYmxlIGJpdCBmb3IgY2hhbm5lbDQgKi8KKyAgICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMiB8PSBUSU1fQ0NNUjJfT0M0UEU7CisKKyAgICAgIC8qIENvbmZpZ3VyZSB0aGUgT3V0cHV0IEZhc3QgbW9kZSAqLworICAgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIyICY9IH5USU1fQ0NNUjJfT0M0RkU7CisgICAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjIgfD0gc0NvbmZpZy0+T0NGYXN0TW9kZSA8PCA4VTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfNTogeworICAgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0M1X0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgICAgIC8qIENvbmZpZ3VyZSB0aGUgQ2hhbm5lbCA1IGluIFBXTSBtb2RlICovCisgICAgICBUSU1fT0M1X1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgc0NvbmZpZyk7CisKKyAgICAgIC8qIFNldCB0aGUgUHJlbG9hZCBlbmFibGUgYml0IGZvciBjaGFubmVsNSovCisgICAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjMgfD0gVElNX0NDTVIzX09DNVBFOworCisgICAgICAvKiBDb25maWd1cmUgdGhlIE91dHB1dCBGYXN0IG1vZGUgKi8KKyAgICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMyAmPSB+VElNX0NDTVIzX09DNUZFOworICAgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIzIHw9IHNDb25maWctPk9DRmFzdE1vZGU7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzY6IHsKKyAgICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDNl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgICAgICAvKiBDb25maWd1cmUgdGhlIENoYW5uZWwgNiBpbiBQV00gbW9kZSAqLworICAgICAgVElNX09DNl9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsIHNDb25maWcpOworCisgICAgICAvKiBTZXQgdGhlIFByZWxvYWQgZW5hYmxlIGJpdCBmb3IgY2hhbm5lbDYgKi8KKyAgICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMyB8PSBUSU1fQ0NNUjNfT0M2UEU7CisKKyAgICAgIC8qIENvbmZpZ3VyZSB0aGUgT3V0cHV0IEZhc3QgbW9kZSAqLworICAgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIzICY9IH5USU1fQ0NNUjNfT0M2RkU7CisgICAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjMgfD0gc0NvbmZpZy0+T0NGYXN0TW9kZSA8PCA4VTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICBicmVhazsKKyAgfQorCisgIF9fSEFMX1VOTE9DSyhodGltKTsKKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFRJTSBPbmUgUHVsc2UgQ2hhbm5lbHMgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQKKyAqICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgVElNX09uZVB1bHNlX0luaXRUeXBlRGVmLgorICogQHBhcmFtICBodGltIFRJTSBPbmUgUHVsc2UgaGFuZGxlCisgKiBAcGFyYW0gIHNDb25maWcgVElNIE9uZSBQdWxzZSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZQorICogQHBhcmFtICBPdXRwdXRDaGFubmVsIFRJTSBvdXRwdXQgY2hhbm5lbCB0byBjb25maWd1cmUKKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAqIEBwYXJhbSAgSW5wdXRDaGFubmVsIFRJTSBpbnB1dCBDaGFubmVsIHRvIGNvbmZpZ3VyZQorICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICogQG5vdGUgIFRvIG91dHB1dCBhIHdhdmVmb3JtIHdpdGggYSBtaW5pbXVtIGRlbGF5IHVzZXIgY2FuIGVuYWJsZSB0aGUgZmFzdAorICogICAgICAgIG1vZGUgYnkgY2FsbGluZyB0aGUgQHJlZiBfX0hBTF9USU1fRU5BQkxFX09DeEZBU1QgbWFjcm8uIFRoZW4gQ0N4CisgKiAgICAgICAgb3V0cHV0IGlzIGZvcmNlZCBpbiByZXNwb25zZSB0byB0aGUgZWRnZSBkZXRlY3Rpb24gb24gVEl4IGlucHV0LAorICogICAgICAgIHdpdGhvdXQgdGFraW5nIGluIGFjY291bnQgdGhlIGNvbXBhcmlzb24uCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PbmVQdWxzZV9Db25maWdDaGFubmVsKAorICAgIFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCBUSU1fT25lUHVsc2VfSW5pdFR5cGVEZWYgKnNDb25maWcsCisgICAgdWludDMyX3QgT3V0cHV0Q2hhbm5lbCwgdWludDMyX3QgSW5wdXRDaGFubmVsKSB7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKyAgVElNX09DX0luaXRUeXBlRGVmIHRlbXAxOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fT1BNX0NIQU5ORUxTKE91dHB1dENoYW5uZWwpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PUE1fQ0hBTk5FTFMoSW5wdXRDaGFubmVsKSk7CisKKyAgaWYgKE91dHB1dENoYW5uZWwgIT0gSW5wdXRDaGFubmVsKSB7CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGh0aW0pOworCisgICAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CisKKyAgICAvKiBFeHRyYWN0IHRoZSBPdXRwdXQgY29tcGFyZSBjb25maWd1cmF0aW9uIGZyb20gc0NvbmZpZyBzdHJ1Y3R1cmUgKi8KKyAgICB0ZW1wMS5PQ01vZGUgPSBzQ29uZmlnLT5PQ01vZGU7CisgICAgdGVtcDEuUHVsc2UgPSBzQ29uZmlnLT5QdWxzZTsKKyAgICB0ZW1wMS5PQ1BvbGFyaXR5ID0gc0NvbmZpZy0+T0NQb2xhcml0eTsKKyAgICB0ZW1wMS5PQ05Qb2xhcml0eSA9IHNDb25maWctPk9DTlBvbGFyaXR5OworICAgIHRlbXAxLk9DSWRsZVN0YXRlID0gc0NvbmZpZy0+T0NJZGxlU3RhdGU7CisgICAgdGVtcDEuT0NOSWRsZVN0YXRlID0gc0NvbmZpZy0+T0NOSWRsZVN0YXRlOworCisgICAgc3dpdGNoIChPdXRwdXRDaGFubmVsKSB7CisgICAgICBjYXNlIFRJTV9DSEFOTkVMXzE6IHsKKyAgICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzFfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICAgICAgICBUSU1fT0MxX1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgJnRlbXAxKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgVElNX0NIQU5ORUxfMjogeworICAgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDMl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgICAgICAgIFRJTV9PQzJfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCAmdGVtcDEpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoc3RhdHVzID09IEhBTF9PSykgeworICAgICAgc3dpdGNoIChJbnB1dENoYW5uZWwpIHsKKyAgICAgICAgY2FzZSBUSU1fQ0hBTk5FTF8xOiB7CisgICAgICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzFfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICAgICAgICAgIFRJTV9USTFfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCBzQ29uZmlnLT5JQ1BvbGFyaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNDb25maWctPklDU2VsZWN0aW9uLCBzQ29uZmlnLT5JQ0ZpbHRlcik7CisKKyAgICAgICAgICAvKiBSZXNldCB0aGUgSUMxUFNDIEJpdHMgKi8KKyAgICAgICAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjEgJj0gflRJTV9DQ01SMV9JQzFQU0M7CisKKyAgICAgICAgICAvKiBTZWxlY3QgdGhlIFRyaWdnZXIgc291cmNlICovCisgICAgICAgICAgaHRpbS0+SW5zdGFuY2UtPlNNQ1IgJj0gflRJTV9TTUNSX1RTOworICAgICAgICAgIGh0aW0tPkluc3RhbmNlLT5TTUNSIHw9IFRJTV9UU19USTFGUDE7CisKKyAgICAgICAgICAvKiBTZWxlY3QgdGhlIFNsYXZlIE1vZGUgKi8KKyAgICAgICAgICBodGltLT5JbnN0YW5jZS0+U01DUiAmPSB+VElNX1NNQ1JfU01TOworICAgICAgICAgIGh0aW0tPkluc3RhbmNlLT5TTUNSIHw9IFRJTV9TTEFWRU1PREVfVFJJR0dFUjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgVElNX0NIQU5ORUxfMjogeworICAgICAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0MyX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgICAgICAgICBUSU1fVEkyX1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgc0NvbmZpZy0+SUNQb2xhcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQ29uZmlnLT5JQ1NlbGVjdGlvbiwgc0NvbmZpZy0+SUNGaWx0ZXIpOworCisgICAgICAgICAgLyogUmVzZXQgdGhlIElDMlBTQyBCaXRzICovCisgICAgICAgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIxICY9IH5USU1fQ0NNUjFfSUMyUFNDOworCisgICAgICAgICAgLyogU2VsZWN0IHRoZSBUcmlnZ2VyIHNvdXJjZSAqLworICAgICAgICAgIGh0aW0tPkluc3RhbmNlLT5TTUNSICY9IH5USU1fU01DUl9UUzsKKyAgICAgICAgICBodGltLT5JbnN0YW5jZS0+U01DUiB8PSBUSU1fVFNfVEkyRlAyOworCisgICAgICAgICAgLyogU2VsZWN0IHRoZSBTbGF2ZSBNb2RlICovCisgICAgICAgICAgaHRpbS0+SW5zdGFuY2UtPlNNQ1IgJj0gflRJTV9TTUNSX1NNUzsKKyAgICAgICAgICBodGltLT5JbnN0YW5jZS0+U01DUiB8PSBUSU1fU0xBVkVNT0RFX1RSSUdHRVI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisKKyAgICBfX0hBTF9VTkxPQ0soaHRpbSk7CisKKyAgICByZXR1cm4gc3RhdHVzOworICB9IGVsc2UgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KK30KKworLyoqCisgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgRE1BIEJ1cnN0IHRvIHRyYW5zZmVyIERhdGEgZnJvbSB0aGUgbWVtb3J5IHRvIHRoZSBUSU0KKyAqIHBlcmlwaGVyYWwKKyAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgKiBAcGFyYW0gIEJ1cnN0QmFzZUFkZHJlc3MgVElNIEJhc2UgYWRkcmVzcyBmcm9tIHdoZXJlIHRoZSBETUEgIHdpbGwgc3RhcnQgdGhlCisgKiBEYXRhIHdyaXRlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ1IxCisgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ1IyCisgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfU01DUgorICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0RJRVIKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9TUgorICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0VHUgorICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDTVIxCisgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NNUjIKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DQ0VSCisgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ05UCisgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfUFNDCisgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQVJSCisgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfUkNSCisgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NSMQorICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDUjIKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DQ1IzCisgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NSNAorICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0JEVFIKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DQ01SMworICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDUjUKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DQ1I2CisgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfRFRSMgorICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0VDUgorICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX1RJU0VMCisgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQUYxCisgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQUYyCisgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfT1IKKyAqIEBwYXJhbSAgQnVyc3RSZXF1ZXN0U3JjIFRJTSBETUEgUmVxdWVzdCBzb3VyY2VzCisgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9VUERBVEU6IFRJTSB1cGRhdGUgSW50ZXJydXB0IHNvdXJjZQorICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfQ0MxOiBUSU0gQ2FwdHVyZSBDb21wYXJlIDEgRE1BIHNvdXJjZQorICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfQ0MyOiBUSU0gQ2FwdHVyZSBDb21wYXJlIDIgRE1BIHNvdXJjZQorICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfQ0MzOiBUSU0gQ2FwdHVyZSBDb21wYXJlIDMgRE1BIHNvdXJjZQorICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfQ0M0OiBUSU0gQ2FwdHVyZSBDb21wYXJlIDQgRE1BIHNvdXJjZQorICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfQ09NOiBUSU0gQ29tbXV0YXRpb24gRE1BIHNvdXJjZQorICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfVFJJR0dFUjogVElNIFRyaWdnZXIgRE1BIHNvdXJjZQorICogQHBhcmFtICBCdXJzdEJ1ZmZlciBUaGUgQnVmZmVyIGFkZHJlc3MuCisgKiBAcGFyYW0gIEJ1cnN0TGVuZ3RoIERNQSBCdXJzdCBsZW5ndGguIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgdmFsdWUKKyAqICAgICAgICAgYmV0d2VlbjogVElNX0RNQUJVUlNUTEVOR1RIXzFUUkFOU0ZFUiBhbmQKKyAqIFRJTV9ETUFCVVJTVExFTkdUSF8yNlRSQU5TRkVSLgorICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSB1c2VkIG9ubHkgd2hlbiBCdXJzdExlbmd0aCBpcyBlcXVhbCB0byBETUEKKyAqIGRhdGEgdHJhbnNmZXIgbGVuZ3RoLgorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fRE1BQnVyc3RfV3JpdGVTdGFydChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBCdXJzdEJhc2VBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEJ1cnN0UmVxdWVzdFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCAqQnVyc3RCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQnVyc3RMZW5ndGgpIHsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzOworCisgIHN0YXR1cyA9IEhBTF9USU1fRE1BQnVyc3RfTXVsdGlXcml0ZVN0YXJ0KAorICAgICAgaHRpbSwgQnVyc3RCYXNlQWRkcmVzcywgQnVyc3RSZXF1ZXN0U3JjLCBCdXJzdEJ1ZmZlciwgQnVyc3RMZW5ndGgsCisgICAgICAoKEJ1cnN0TGVuZ3RoKSA+PiA4VSkgKyAxVSk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgRE1BIEJ1cnN0IHRvIHRyYW5zZmVyIG11bHRpcGxlIERhdGEgZnJvbSB0aGUgbWVtb3J5IHRvCisgKiB0aGUgVElNIHBlcmlwaGVyYWwKKyAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgKiBAcGFyYW0gIEJ1cnN0QmFzZUFkZHJlc3MgVElNIEJhc2UgYWRkcmVzcyBmcm9tIHdoZXJlIHRoZSBETUEgd2lsbCBzdGFydCB0aGUKKyAqIERhdGEgd3JpdGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DUjEKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DUjIKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9TTUNSCisgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfRElFUgorICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX1NSCisgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfRUdSCisgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NNUjEKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DQ01SMgorICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDRVIKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DTlQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9QU0MKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9BUlIKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9SQ1IKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DQ1IxCisgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NSMgorICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDUjMKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DQ1I0CisgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQkRUUgorICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDTVIzCisgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NSNQorICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDUjYKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9EVFIyCisgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfRUNSCisgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfVElTRUwKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9BRjEKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9BRjIKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9PUgorICogQHBhcmFtICBCdXJzdFJlcXVlc3RTcmMgVElNIERNQSBSZXF1ZXN0IHNvdXJjZXMKKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX1VQREFURTogVElNIHVwZGF0ZSBJbnRlcnJ1cHQgc291cmNlCisgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9DQzE6IFRJTSBDYXB0dXJlIENvbXBhcmUgMSBETUEgc291cmNlCisgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9DQzI6IFRJTSBDYXB0dXJlIENvbXBhcmUgMiBETUEgc291cmNlCisgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9DQzM6IFRJTSBDYXB0dXJlIENvbXBhcmUgMyBETUEgc291cmNlCisgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9DQzQ6IFRJTSBDYXB0dXJlIENvbXBhcmUgNCBETUEgc291cmNlCisgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9DT006IFRJTSBDb21tdXRhdGlvbiBETUEgc291cmNlCisgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9UUklHR0VSOiBUSU0gVHJpZ2dlciBETUEgc291cmNlCisgKiBAcGFyYW0gIEJ1cnN0QnVmZmVyIFRoZSBCdWZmZXIgYWRkcmVzcy4KKyAqIEBwYXJhbSAgQnVyc3RMZW5ndGggRE1BIEJ1cnN0IGxlbmd0aC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSB2YWx1ZQorICogICAgICAgICBiZXR3ZWVuOiBUSU1fRE1BQlVSU1RMRU5HVEhfMVRSQU5TRkVSIGFuZAorICogVElNX0RNQUJVUlNUTEVOR1RIXzI2VFJBTlNGRVIuCisgKiBAcGFyYW0gIERhdGFMZW5ndGggRGF0YSBsZW5ndGguIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgdmFsdWUKKyAqICAgICAgICAgYmV0d2VlbiAxIGFuZCAweEZGRkYuCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9ETUFCdXJzdF9NdWx0aVdyaXRlU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBCdXJzdEJhc2VBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQnVyc3RSZXF1ZXN0U3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgKkJ1cnN0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQnVyc3RMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBEYXRhTGVuZ3RoKSB7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0RNQUJVUlNUX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fRE1BX0JBU0UoQnVyc3RCYXNlQWRkcmVzcykpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0RNQV9TT1VSQ0UoQnVyc3RSZXF1ZXN0U3JjKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fRE1BX0xFTkdUSChCdXJzdExlbmd0aCkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0RNQV9EQVRBX0xFTkdUSChEYXRhTGVuZ3RoKSk7CisKKyAgaWYgKGh0aW0tPkRNQUJ1cnN0U3RhdGUgPT0gSEFMX0RNQV9CVVJTVF9TVEFURV9CVVNZKSB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9IGVsc2UgaWYgKGh0aW0tPkRNQUJ1cnN0U3RhdGUgPT0gSEFMX0RNQV9CVVJTVF9TVEFURV9SRUFEWSkgeworICAgIGlmICgoQnVyc3RCdWZmZXIgPT0gTlVMTCkgJiYgKEJ1cnN0TGVuZ3RoID4gMFUpKSB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0gZWxzZSB7CisgICAgICBodGltLT5ETUFCdXJzdFN0YXRlID0gSEFMX0RNQV9CVVJTVF9TVEFURV9CVVNZOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiBub3RoaW5nIHRvIGRvICovCisgIH0KKworICBzd2l0Y2ggKEJ1cnN0UmVxdWVzdFNyYykgeworICAgIGNhc2UgVElNX0RNQV9VUERBVEU6IHsKKyAgICAgIC8qIFNldCB0aGUgRE1BIFBlcmlvZCBlbGFwc2VkIGNhbGxiYWNrcyAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX1VQREFURV0tPlhmZXJDcGx0Q2FsbGJhY2sgPQorICAgICAgICAgIFRJTV9ETUFQZXJpb2RFbGFwc2VkQ3BsdDsKKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9VUERBVEVdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9CisgICAgICAgICAgVElNX0RNQVBlcmlvZEVsYXBzZWRIYWxmQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9VUERBVEVdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvcjsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX1VQREFURV0sICh1aW50MzJfdClCdXJzdEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkRNQVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhTGVuZ3RoKSAhPSBIQUxfT0spIHsKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVElNX0RNQV9DQzE6IHsKKyAgICAgIC8qIFNldCB0aGUgRE1BIGNvbXBhcmUgY2FsbGJhY2tzICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFEZWxheVB1bHNlQ3BsdDsKKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9CisgICAgICAgICAgVElNX0RNQURlbGF5UHVsc2VIYWxmQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvcjsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0sICh1aW50MzJfdClCdXJzdEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkRNQVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhTGVuZ3RoKSAhPSBIQUxfT0spIHsKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVElNX0RNQV9DQzI6IHsKKyAgICAgIC8qIFNldCB0aGUgRE1BIGNvbXBhcmUgY2FsbGJhY2tzICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFEZWxheVB1bHNlQ3BsdDsKKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9CisgICAgICAgICAgVElNX0RNQURlbGF5UHVsc2VIYWxmQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvcjsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0sICh1aW50MzJfdClCdXJzdEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkRNQVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhTGVuZ3RoKSAhPSBIQUxfT0spIHsKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVElNX0RNQV9DQzM6IHsKKyAgICAgIC8qIFNldCB0aGUgRE1BIGNvbXBhcmUgY2FsbGJhY2tzICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFEZWxheVB1bHNlQ3BsdDsKKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9CisgICAgICAgICAgVElNX0RNQURlbGF5UHVsc2VIYWxmQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvcjsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10sICh1aW50MzJfdClCdXJzdEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkRNQVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhTGVuZ3RoKSAhPSBIQUxfT0spIHsKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVElNX0RNQV9DQzQ6IHsKKyAgICAgIC8qIFNldCB0aGUgRE1BIGNvbXBhcmUgY2FsbGJhY2tzICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFEZWxheVB1bHNlQ3BsdDsKKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9CisgICAgICAgICAgVElNX0RNQURlbGF5UHVsc2VIYWxmQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvcjsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDNF0sICh1aW50MzJfdClCdXJzdEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkRNQVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhTGVuZ3RoKSAhPSBIQUxfT0spIHsKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVElNX0RNQV9DT006IHsKKyAgICAgIC8qIFNldCB0aGUgRE1BIGNvbW11dGF0aW9uIGNhbGxiYWNrcyAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NPTU1VVEFUSU9OXS0+WGZlckNwbHRDYWxsYmFjayA9CisgICAgICAgICAgVElNRXhfRE1BQ29tbXV0YXRpb25DcGx0OworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NPTU1VVEFUSU9OXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPQorICAgICAgICAgIFRJTUV4X0RNQUNvbW11dGF0aW9uSGFsZkNwbHQ7CisKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ09NTVVUQVRJT05dLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvcjsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoCisgICAgICAgICAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DT01NVVRBVElPTl0sICh1aW50MzJfdClCdXJzdEJ1ZmZlciwKKyAgICAgICAgICAgICAgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+RE1BUiwgRGF0YUxlbmd0aCkgIT0gSEFMX09LKSB7CisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFRJTV9ETUFfVFJJR0dFUjogeworICAgICAgLyogU2V0IHRoZSBETUEgdHJpZ2dlciBjYWxsYmFja3MgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9UUklHR0VSXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFUcmlnZ2VyQ3BsdDsKKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9UUklHR0VSXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPQorICAgICAgICAgIFRJTV9ETUFUcmlnZ2VySGFsZkNwbHQ7CisKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfVFJJR0dFUl0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVCgKKyAgICAgICAgICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX1RSSUdHRVJdLCAodWludDMyX3QpQnVyc3RCdWZmZXIsCisgICAgICAgICAgICAgICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkRNQVIsIERhdGFMZW5ndGgpICE9IEhBTF9PSykgeworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKHN0YXR1cyA9PSBIQUxfT0spIHsKKyAgICAvKiBDb25maWd1cmUgdGhlIERNQSBCdXJzdCBNb2RlICovCisgICAgaHRpbS0+SW5zdGFuY2UtPkRDUiA9IChCdXJzdEJhc2VBZGRyZXNzIHwgQnVyc3RMZW5ndGgpOworICAgIC8qIEVuYWJsZSB0aGUgVElNIERNQSBSZXF1ZXN0ICovCisgICAgX19IQUxfVElNX0VOQUJMRV9ETUEoaHRpbSwgQnVyc3RSZXF1ZXN0U3JjKTsKKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBAYnJpZWYgIFN0b3BzIHRoZSBUSU0gRE1BIEJ1cnN0IG1vZGUKKyAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgKiBAcGFyYW0gIEJ1cnN0UmVxdWVzdFNyYyBUSU0gRE1BIFJlcXVlc3Qgc291cmNlcyB0byBkaXNhYmxlCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9ETUFCdXJzdF9Xcml0ZVN0b3AoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBCdXJzdFJlcXVlc3RTcmMpIHsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fRE1BX1NPVVJDRShCdXJzdFJlcXVlc3RTcmMpKTsKKworICAvKiBBYm9ydCB0aGUgRE1BIHRyYW5zZmVyIChhdCBsZWFzdCBkaXNhYmxlIHRoZSBETUEgY2hhbm5lbCkgKi8KKyAgc3dpdGNoIChCdXJzdFJlcXVlc3RTcmMpIHsKKyAgICBjYXNlIFRJTV9ETUFfVVBEQVRFOiB7CisgICAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9VUERBVEVdKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFRJTV9ETUFfQ0MxOiB7CisgICAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFRJTV9ETUFfQ0MyOiB7CisgICAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFRJTV9ETUFfQ0MzOiB7CisgICAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFRJTV9ETUFfQ0M0OiB7CisgICAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFRJTV9ETUFfQ09NOiB7CisgICAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DT01NVVRBVElPTl0pOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVElNX0RNQV9UUklHR0VSOiB7CisgICAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9UUklHR0VSXSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKHN0YXR1cyA9PSBIQUxfT0spIHsKKyAgICAvKiBEaXNhYmxlIHRoZSBUSU0gVXBkYXRlIERNQSByZXF1ZXN0ICovCisgICAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIEJ1cnN0UmVxdWVzdFNyYyk7CisKKyAgICAvKiBDaGFuZ2UgdGhlIERNQSBidXJzdCBvcGVyYXRpb24gc3RhdGUgKi8KKyAgICBodGltLT5ETUFCdXJzdFN0YXRlID0gSEFMX0RNQV9CVVJTVF9TVEFURV9SRUFEWTsKKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgRE1BIEJ1cnN0IHRvIHRyYW5zZmVyIERhdGEgZnJvbSB0aGUgVElNIHBlcmlwaGVyYWwgdG8KKyAqIHRoZSBtZW1vcnkKKyAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgKiBAcGFyYW0gIEJ1cnN0QmFzZUFkZHJlc3MgVElNIEJhc2UgYWRkcmVzcyBmcm9tIHdoZXJlIHRoZSBETUEgIHdpbGwgc3RhcnQgdGhlCisgKiBEYXRhIHJlYWQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DUjEKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DUjIKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9TTUNSCisgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfRElFUgorICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX1NSCisgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfRUdSCisgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NNUjEKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DQ01SMgorICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDRVIKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DTlQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9QU0MKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9BUlIKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9SQ1IKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DQ1IxCisgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NSMgorICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDUjMKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DQ1I0CisgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQkRUUgorICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDTVIzCisgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NSNQorICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDUjYKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9EVFIyCisgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfRUNSCisgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfVElTRUwKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9BRjEKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9BRjIKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9PUgorICogQHBhcmFtICBCdXJzdFJlcXVlc3RTcmMgVElNIERNQSBSZXF1ZXN0IHNvdXJjZXMKKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX1VQREFURTogVElNIHVwZGF0ZSBJbnRlcnJ1cHQgc291cmNlCisgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9DQzE6IFRJTSBDYXB0dXJlIENvbXBhcmUgMSBETUEgc291cmNlCisgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9DQzI6IFRJTSBDYXB0dXJlIENvbXBhcmUgMiBETUEgc291cmNlCisgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9DQzM6IFRJTSBDYXB0dXJlIENvbXBhcmUgMyBETUEgc291cmNlCisgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9DQzQ6IFRJTSBDYXB0dXJlIENvbXBhcmUgNCBETUEgc291cmNlCisgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9DT006IFRJTSBDb21tdXRhdGlvbiBETUEgc291cmNlCisgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9UUklHR0VSOiBUSU0gVHJpZ2dlciBETUEgc291cmNlCisgKiBAcGFyYW0gIEJ1cnN0QnVmZmVyIFRoZSBCdWZmZXIgYWRkcmVzcy4KKyAqIEBwYXJhbSAgQnVyc3RMZW5ndGggRE1BIEJ1cnN0IGxlbmd0aC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSB2YWx1ZQorICogICAgICAgICBiZXR3ZWVuOiBUSU1fRE1BQlVSU1RMRU5HVEhfMVRSQU5TRkVSIGFuZAorICogVElNX0RNQUJVUlNUTEVOR1RIXzI2VFJBTlNGRVIuCisgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIHVzZWQgb25seSB3aGVuIEJ1cnN0TGVuZ3RoIGlzIGVxdWFsIHRvIERNQQorICogZGF0YSB0cmFuc2ZlciBsZW5ndGguCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9ETUFCdXJzdF9SZWFkU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBCdXJzdEJhc2VBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQnVyc3RSZXF1ZXN0U3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKkJ1cnN0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQnVyc3RMZW5ndGgpIHsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzOworCisgIHN0YXR1cyA9IEhBTF9USU1fRE1BQnVyc3RfTXVsdGlSZWFkU3RhcnQoCisgICAgICBodGltLCBCdXJzdEJhc2VBZGRyZXNzLCBCdXJzdFJlcXVlc3RTcmMsIEJ1cnN0QnVmZmVyLCBCdXJzdExlbmd0aCwKKyAgICAgICgoQnVyc3RMZW5ndGgpID4+IDhVKSArIDFVKTsKKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBETUEgQnVyc3QgdG8gdHJhbnNmZXIgRGF0YSBmcm9tIHRoZSBUSU0gcGVyaXBoZXJhbCB0bworICogdGhlIG1lbW9yeQorICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAqIEBwYXJhbSAgQnVyc3RCYXNlQWRkcmVzcyBUSU0gQmFzZSBhZGRyZXNzIGZyb20gd2hlcmUgdGhlIERNQSAgd2lsbCBzdGFydCB0aGUKKyAqIERhdGEgcmVhZCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NSMQorICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NSMgorICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX1NNQ1IKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9ESUVSCisgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfU1IKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9FR1IKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DQ01SMQorICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDTVIyCisgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NFUgorICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NOVAorICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX1BTQworICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0FSUgorICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX1JDUgorICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDUjEKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DQ1IyCisgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NSMworICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDUjQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9CRFRSCisgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NNUjMKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DQ1I1CisgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NSNgorICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0RUUjIKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9FQ1IKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9USVNFTAorICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0FGMQorICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0FGMgorICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX09SCisgKiBAcGFyYW0gIEJ1cnN0UmVxdWVzdFNyYyBUSU0gRE1BIFJlcXVlc3Qgc291cmNlcworICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfVVBEQVRFOiBUSU0gdXBkYXRlIEludGVycnVwdCBzb3VyY2UKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX0NDMTogVElNIENhcHR1cmUgQ29tcGFyZSAxIERNQSBzb3VyY2UKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX0NDMjogVElNIENhcHR1cmUgQ29tcGFyZSAyIERNQSBzb3VyY2UKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX0NDMzogVElNIENhcHR1cmUgQ29tcGFyZSAzIERNQSBzb3VyY2UKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX0NDNDogVElNIENhcHR1cmUgQ29tcGFyZSA0IERNQSBzb3VyY2UKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX0NPTTogVElNIENvbW11dGF0aW9uIERNQSBzb3VyY2UKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX1RSSUdHRVI6IFRJTSBUcmlnZ2VyIERNQSBzb3VyY2UKKyAqIEBwYXJhbSAgQnVyc3RCdWZmZXIgVGhlIEJ1ZmZlciBhZGRyZXNzLgorICogQHBhcmFtICBCdXJzdExlbmd0aCBETUEgQnVyc3QgbGVuZ3RoLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIHZhbHVlCisgKiAgICAgICAgIGJldHdlZW46IFRJTV9ETUFCVVJTVExFTkdUSF8xVFJBTlNGRVIgYW5kCisgKiBUSU1fRE1BQlVSU1RMRU5HVEhfMjZUUkFOU0ZFUi4KKyAqIEBwYXJhbSAgRGF0YUxlbmd0aCBEYXRhIGxlbmd0aC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSB2YWx1ZQorICogICAgICAgICBiZXR3ZWVuIDEgYW5kIDB4RkZGRi4KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0RNQUJ1cnN0X011bHRpUmVhZFN0YXJ0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBCdXJzdEJhc2VBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBCdXJzdFJlcXVlc3RTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpCdXJzdEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQnVyc3RMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IERhdGFMZW5ndGgpIHsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fRE1BQlVSU1RfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9ETUFfQkFTRShCdXJzdEJhc2VBZGRyZXNzKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fRE1BX1NPVVJDRShCdXJzdFJlcXVlc3RTcmMpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9ETUFfTEVOR1RIKEJ1cnN0TGVuZ3RoKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fRE1BX0RBVEFfTEVOR1RIKERhdGFMZW5ndGgpKTsKKworICBpZiAoaHRpbS0+RE1BQnVyc3RTdGF0ZSA9PSBIQUxfRE1BX0JVUlNUX1NUQVRFX0JVU1kpIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0gZWxzZSBpZiAoaHRpbS0+RE1BQnVyc3RTdGF0ZSA9PSBIQUxfRE1BX0JVUlNUX1NUQVRFX1JFQURZKSB7CisgICAgaWYgKChCdXJzdEJ1ZmZlciA9PSBOVUxMKSAmJiAoQnVyc3RMZW5ndGggPiAwVSkpIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfSBlbHNlIHsKKyAgICAgIGh0aW0tPkRNQUJ1cnN0U3RhdGUgPSBIQUxfRE1BX0JVUlNUX1NUQVRFX0JVU1k7CisgICAgfQorICB9IGVsc2UgeworICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgfQorICBzd2l0Y2ggKEJ1cnN0UmVxdWVzdFNyYykgeworICAgIGNhc2UgVElNX0RNQV9VUERBVEU6IHsKKyAgICAgIC8qIFNldCB0aGUgRE1BIFBlcmlvZCBlbGFwc2VkIGNhbGxiYWNrcyAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX1VQREFURV0tPlhmZXJDcGx0Q2FsbGJhY2sgPQorICAgICAgICAgIFRJTV9ETUFQZXJpb2RFbGFwc2VkQ3BsdDsKKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9VUERBVEVdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9CisgICAgICAgICAgVElNX0RNQVBlcmlvZEVsYXBzZWRIYWxmQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9VUERBVEVdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvcjsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX1VQREFURV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5ETUFSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KUJ1cnN0QnVmZmVyLCBEYXRhTGVuZ3RoKSAhPSBIQUxfT0spIHsKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVElNX0RNQV9DQzE6IHsKKyAgICAgIC8qIFNldCB0aGUgRE1BIGNhcHR1cmUgY2FsbGJhY2tzICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFDYXB0dXJlQ3BsdDsKKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFRJTV9ETUFDYXB0dXJlSGFsZkNwbHQ7CisKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3I7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+RE1BUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdClCdXJzdEJ1ZmZlciwgRGF0YUxlbmd0aCkgIT0gSEFMX09LKSB7CisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFRJTV9ETUFfQ0MyOiB7CisgICAgICAvKiBTZXQgdGhlIERNQSBjYXB0dXJlIGNhbGxiYWNrcyAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BQ2FwdHVyZUNwbHQ7CisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BQ2FwdHVyZUhhbGZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkRNQVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpQnVyc3RCdWZmZXIsIERhdGFMZW5ndGgpICE9IEhBTF9PSykgeworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBUSU1fRE1BX0NDMzogeworICAgICAgLyogU2V0IHRoZSBETUEgY2FwdHVyZSBjYWxsYmFja3MgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQUNhcHR1cmVDcGx0OworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gVElNX0RNQUNhcHR1cmVIYWxmQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvcjsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5ETUFSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KUJ1cnN0QnVmZmVyLCBEYXRhTGVuZ3RoKSAhPSBIQUxfT0spIHsKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVElNX0RNQV9DQzQ6IHsKKyAgICAgIC8qIFNldCB0aGUgRE1BIGNhcHR1cmUgY2FsbGJhY2tzICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFDYXB0dXJlQ3BsdDsKKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFRJTV9ETUFDYXB0dXJlSGFsZkNwbHQ7CisKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3I7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+RE1BUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdClCdXJzdEJ1ZmZlciwgRGF0YUxlbmd0aCkgIT0gSEFMX09LKSB7CisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFRJTV9ETUFfQ09NOiB7CisgICAgICAvKiBTZXQgdGhlIERNQSBjb21tdXRhdGlvbiBjYWxsYmFja3MgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DT01NVVRBVElPTl0tPlhmZXJDcGx0Q2FsbGJhY2sgPQorICAgICAgICAgIFRJTUV4X0RNQUNvbW11dGF0aW9uQ3BsdDsKKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DT01NVVRBVElPTl0tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0KKyAgICAgICAgICBUSU1FeF9ETUFDb21tdXRhdGlvbkhhbGZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NPTU1VVEFUSU9OXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3I7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DT01NVVRBVElPTl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5ETUFSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KUJ1cnN0QnVmZmVyLCBEYXRhTGVuZ3RoKSAhPSBIQUxfT0spIHsKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVElNX0RNQV9UUklHR0VSOiB7CisgICAgICAvKiBTZXQgdGhlIERNQSB0cmlnZ2VyIGNhbGxiYWNrcyAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX1RSSUdHRVJdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQVRyaWdnZXJDcGx0OworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX1RSSUdHRVJdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9CisgICAgICAgICAgVElNX0RNQVRyaWdnZXJIYWxmQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9UUklHR0VSXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3I7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9UUklHR0VSXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkRNQVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpQnVyc3RCdWZmZXIsIERhdGFMZW5ndGgpICE9IEhBTF9PSykgeworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKHN0YXR1cyA9PSBIQUxfT0spIHsKKyAgICAvKiBDb25maWd1cmUgdGhlIERNQSBCdXJzdCBNb2RlICovCisgICAgaHRpbS0+SW5zdGFuY2UtPkRDUiA9IChCdXJzdEJhc2VBZGRyZXNzIHwgQnVyc3RMZW5ndGgpOworCisgICAgLyogRW5hYmxlIHRoZSBUSU0gRE1BIFJlcXVlc3QgKi8KKyAgICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBCdXJzdFJlcXVlc3RTcmMpOworICB9CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIEBicmllZiAgU3RvcCB0aGUgRE1BIGJ1cnN0IHJlYWRpbmcKKyAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgKiBAcGFyYW0gIEJ1cnN0UmVxdWVzdFNyYyBUSU0gRE1BIFJlcXVlc3Qgc291cmNlcyB0byBkaXNhYmxlLgorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fRE1BQnVyc3RfUmVhZFN0b3AoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEJ1cnN0UmVxdWVzdFNyYykgeworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9ETUFfU09VUkNFKEJ1cnN0UmVxdWVzdFNyYykpOworCisgIC8qIEFib3J0IHRoZSBETUEgdHJhbnNmZXIgKGF0IGxlYXN0IGRpc2FibGUgdGhlIERNQSBjaGFubmVsKSAqLworICBzd2l0Y2ggKEJ1cnN0UmVxdWVzdFNyYykgeworICAgIGNhc2UgVElNX0RNQV9VUERBVEU6IHsKKyAgICAgICh2b2lkKUhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX1VQREFURV0pOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVElNX0RNQV9DQzE6IHsKKyAgICAgICh2b2lkKUhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0pOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVElNX0RNQV9DQzI6IHsKKyAgICAgICh2b2lkKUhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0pOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVElNX0RNQV9DQzM6IHsKKyAgICAgICh2b2lkKUhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10pOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVElNX0RNQV9DQzQ6IHsKKyAgICAgICh2b2lkKUhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDNF0pOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVElNX0RNQV9DT006IHsKKyAgICAgICh2b2lkKUhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NPTU1VVEFUSU9OXSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBUSU1fRE1BX1RSSUdHRVI6IHsKKyAgICAgICh2b2lkKUhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX1RSSUdHRVJdKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgICAgYnJlYWs7CisgIH0KKworICBpZiAoc3RhdHVzID09IEhBTF9PSykgeworICAgIC8qIERpc2FibGUgdGhlIFRJTSBVcGRhdGUgRE1BIHJlcXVlc3QgKi8KKyAgICBfX0hBTF9USU1fRElTQUJMRV9ETUEoaHRpbSwgQnVyc3RSZXF1ZXN0U3JjKTsKKworICAgIC8qIENoYW5nZSB0aGUgRE1BIGJ1cnN0IG9wZXJhdGlvbiBzdGF0ZSAqLworICAgIGh0aW0tPkRNQUJ1cnN0U3RhdGUgPSBIQUxfRE1BX0JVUlNUX1NUQVRFX1JFQURZOworICB9CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIEBicmllZiAgR2VuZXJhdGUgYSBzb2Z0d2FyZSBldmVudAorICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAqIEBwYXJhbSAgRXZlbnRTb3VyY2Ugc3BlY2lmaWVzIHRoZSBldmVudCBzb3VyY2UuCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIFRJTV9FVkVOVFNPVVJDRV9VUERBVEU6IFRpbWVyIHVwZGF0ZSBFdmVudCBzb3VyY2UKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRVZFTlRTT1VSQ0VfQ0MxOiBUaW1lciBDYXB0dXJlIENvbXBhcmUgMSBFdmVudCBzb3VyY2UKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRVZFTlRTT1VSQ0VfQ0MyOiBUaW1lciBDYXB0dXJlIENvbXBhcmUgMiBFdmVudCBzb3VyY2UKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRVZFTlRTT1VSQ0VfQ0MzOiBUaW1lciBDYXB0dXJlIENvbXBhcmUgMyBFdmVudCBzb3VyY2UKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRVZFTlRTT1VSQ0VfQ0M0OiBUaW1lciBDYXB0dXJlIENvbXBhcmUgNCBFdmVudCBzb3VyY2UKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRVZFTlRTT1VSQ0VfQ09NOiBUaW1lciBDT00gZXZlbnQgc291cmNlCisgKiAgICAgICAgICAgIEBhcmcgVElNX0VWRU5UU09VUkNFX1RSSUdHRVI6IFRpbWVyIFRyaWdnZXIgRXZlbnQgc291cmNlCisgKiAgICAgICAgICAgIEBhcmcgVElNX0VWRU5UU09VUkNFX0JSRUFLOiBUaW1lciBCcmVhayBldmVudCBzb3VyY2UKKyAqICAgICAgICAgICAgQGFyZyBUSU1fRVZFTlRTT1VSQ0VfQlJFQUsyOiBUaW1lciBCcmVhazIgZXZlbnQgc291cmNlCisgKiBAbm90ZSAgIEJhc2ljIHRpbWVycyBjYW4gb25seSBnZW5lcmF0ZSBhbiB1cGRhdGUgZXZlbnQuCisgKiBAbm90ZSAgIFRJTV9FVkVOVFNPVVJDRV9DT00gaXMgcmVsZXZhbnQgb25seSB3aXRoIGFkdmFuY2VkIHRpbWVyIGluc3RhbmNlcy4KKyAqIEBub3RlICAgVElNX0VWRU5UU09VUkNFX0JSRUFLIGFuZCBUSU1fRVZFTlRTT1VSQ0VfQlJFQUsyIGFyZSByZWxldmFudAorICogICAgICAgICBvbmx5IGZvciB0aW1lciBpbnN0YW5jZXMgc3VwcG9ydGluZyBicmVhayBpbnB1dChzKS4KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fR2VuZXJhdGVFdmVudChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBFdmVudFNvdXJjZSkgeworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fRVZFTlRfU09VUkNFKEV2ZW50U291cmNlKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodGltKTsKKworICAvKiBDaGFuZ2UgdGhlIFRJTSBzdGF0ZSAqLworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfQlVTWTsKKworICAvKiBTZXQgdGhlIGV2ZW50IHNvdXJjZXMgKi8KKyAgaHRpbS0+SW5zdGFuY2UtPkVHUiA9IEV2ZW50U291cmNlOworCisgIC8qIENoYW5nZSB0aGUgVElNIHN0YXRlICovCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRUFEWTsKKworICBfX0hBTF9VTkxPQ0soaHRpbSk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgT0NSZWYgY2xlYXIgZmVhdHVyZQorICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAqIEBwYXJhbSAgc0NsZWFySW5wdXRDb25maWcgcG9pbnRlciB0byBhIFRJTV9DbGVhcklucHV0Q29uZmlnVHlwZURlZiBzdHJ1Y3R1cmUKKyAqIHRoYXQgY29udGFpbnMgdGhlIE9DUkVGIGNsZWFyIGZlYXR1cmUgYW5kIHBhcmFtZXRlcnMgZm9yIHRoZSBUSU0gcGVyaXBoZXJhbC4KKyAqIEBwYXJhbSAgQ2hhbm5lbCBzcGVjaWZpZXMgdGhlIFRJTSBDaGFubmVsCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMworICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF81OiBUSU0gQ2hhbm5lbCA1CisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNjogVElNIENoYW5uZWwgNgorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fQ29uZmlnT0NyZWZDbGVhcigKKyAgICBUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwKKyAgICBjb25zdCBUSU1fQ2xlYXJJbnB1dENvbmZpZ1R5cGVEZWYgKnNDbGVhcklucHV0Q29uZmlnLCB1aW50MzJfdCBDaGFubmVsKSB7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX09DWFJFRl9DTEVBUl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMRUFSSU5QVVRfU09VUkNFKHNDbGVhcklucHV0Q29uZmlnLT5DbGVhcklucHV0U291cmNlKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodGltKTsKKworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfQlVTWTsKKworICBzd2l0Y2ggKHNDbGVhcklucHV0Q29uZmlnLT5DbGVhcklucHV0U291cmNlKSB7CisgICAgY2FzZSBUSU1fQ0xFQVJJTlBVVFNPVVJDRV9OT05FOiB7CisgICAgICAvKiBDbGVhciB0aGUgT0NSRUYgY2xlYXIgc2VsZWN0aW9uIGJpdCBhbmQgdGhlIHRoZSBFVFIgQml0cyAqLworICAgICAgaWYgKElTX1RJTV9PQ0NTX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSkgeworICAgICAgICBDTEVBUl9CSVQoaHRpbS0+SW5zdGFuY2UtPlNNQ1IsCisgICAgICAgICAgICAgICAgICAoVElNX1NNQ1JfT0NDUyB8IFRJTV9TTUNSX0VURiB8IFRJTV9TTUNSX0VUUFMgfCBUSU1fU01DUl9FQ0UgfAorICAgICAgICAgICAgICAgICAgIFRJTV9TTUNSX0VUUCkpOworCisgICAgICAgIC8qIENsZWFyIFRJTXhfQUYyX09DUlNFTCAocmVzZXQgdmFsdWUpICovCisgICAgICAgIENMRUFSX0JJVChodGltLT5JbnN0YW5jZS0+QUYyLCBUSU14X0FGMl9PQ1JTRUwpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgQ0xFQVJfQklUKGh0aW0tPkluc3RhbmNlLT5TTUNSLAorICAgICAgICAgICAgICAgICAgKFRJTV9TTUNSX0VURiB8IFRJTV9TTUNSX0VUUFMgfCBUSU1fU01DUl9FQ0UgfCBUSU1fU01DUl9FVFApKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NMRUFSSU5QVVRTT1VSQ0VfQ09NUDE6CisgICAgY2FzZSBUSU1fQ0xFQVJJTlBVVFNPVVJDRV9DT01QMjoKKyAgICBjYXNlIFRJTV9DTEVBUklOUFVUU09VUkNFX0NPTVAzOgorICAgIGNhc2UgVElNX0NMRUFSSU5QVVRTT1VSQ0VfQ09NUDQ6CisjaWYgZGVmaW5lZChDT01QNSkKKyAgICBjYXNlIFRJTV9DTEVBUklOUFVUU09VUkNFX0NPTVA1OgorI2VuZGlmIC8qIENPTVA1ICovCisjaWYgZGVmaW5lZChDT01QNikKKyAgICBjYXNlIFRJTV9DTEVBUklOUFVUU09VUkNFX0NPTVA2OgorI2VuZGlmIC8qIENPTVA2ICovCisjaWYgZGVmaW5lZChDT01QNykKKyAgICBjYXNlIFRJTV9DTEVBUklOUFVUU09VUkNFX0NPTVA3OgorI2VuZGlmIC8qIENPTVA3ICovCisgICAgeworICAgICAgaWYgKElTX1RJTV9PQ0NTX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSkgeworICAgICAgICAvKiBDbGVhciB0aGUgT0NSRUYgY2xlYXIgc2VsZWN0aW9uIGJpdCAqLworICAgICAgICBDTEVBUl9CSVQoaHRpbS0+SW5zdGFuY2UtPlNNQ1IsIFRJTV9TTUNSX09DQ1MpOworICAgICAgfQorCisgICAgICAvKiBTZXQgdGhlIGNsZWFyIGlucHV0IHNvdXJjZSAqLworICAgICAgTU9ESUZZX1JFRyhodGltLT5JbnN0YW5jZS0+QUYyLCBUSU14X0FGMl9PQ1JTRUwsCisgICAgICAgICAgICAgICAgIHNDbGVhcklucHV0Q29uZmlnLT5DbGVhcklucHV0U291cmNlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NMRUFSSU5QVVRTT1VSQ0VfRVRSOiB7CisgICAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgICAgYXNzZXJ0X3BhcmFtKAorICAgICAgICAgIElTX1RJTV9DTEVBUklOUFVUX1BPTEFSSVRZKHNDbGVhcklucHV0Q29uZmlnLT5DbGVhcklucHV0UG9sYXJpdHkpKTsKKyAgICAgIGFzc2VydF9wYXJhbSgKKyAgICAgICAgICBJU19USU1fQ0xFQVJJTlBVVF9QUkVTQ0FMRVIoc0NsZWFySW5wdXRDb25maWctPkNsZWFySW5wdXRQcmVzY2FsZXIpKTsKKyAgICAgIGFzc2VydF9wYXJhbSgKKyAgICAgICAgICBJU19USU1fQ0xFQVJJTlBVVF9GSUxURVIoc0NsZWFySW5wdXRDb25maWctPkNsZWFySW5wdXRGaWx0ZXIpKTsKKworICAgICAgLyogV2hlbiBPQ1JlZiBjbGVhciBmZWF0dXJlIGlzIHVzZWQgd2l0aCBFVFIgc291cmNlLCBFVFIgcHJlc2NhbGVyIG11c3QgYmUKKyAgICAgICAqIG9mZiAqLworICAgICAgaWYgKHNDbGVhcklucHV0Q29uZmlnLT5DbGVhcklucHV0UHJlc2NhbGVyICE9CisgICAgICAgICAgVElNX0NMRUFSSU5QVVRQUkVTQ0FMRVJfRElWMSkgeworICAgICAgICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisgICAgICAgIF9fSEFMX1VOTE9DSyhodGltKTsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKworICAgICAgVElNX0VUUl9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsIHNDbGVhcklucHV0Q29uZmlnLT5DbGVhcklucHV0UHJlc2NhbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgc0NsZWFySW5wdXRDb25maWctPkNsZWFySW5wdXRQb2xhcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNDbGVhcklucHV0Q29uZmlnLT5DbGVhcklucHV0RmlsdGVyKTsKKworICAgICAgaWYgKElTX1RJTV9PQ0NTX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSkgeworICAgICAgICAvKiBTZXQgdGhlIE9DUkVGIGNsZWFyIHNlbGVjdGlvbiBiaXQgKi8KKyAgICAgICAgU0VUX0JJVChodGltLT5JbnN0YW5jZS0+U01DUiwgVElNX1NNQ1JfT0NDUyk7CisKKyAgICAgICAgLyogQ2xlYXIgVElNeF9BRjJfT0NSU0VMIChyZXNldCB2YWx1ZSkgKi8KKyAgICAgICAgQ0xFQVJfQklUKGh0aW0tPkluc3RhbmNlLT5BRjIsIFRJTXhfQUYyX09DUlNFTCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgICAgYnJlYWs7CisgIH0KKworICBpZiAoc3RhdHVzID09IEhBTF9PSykgeworICAgIHN3aXRjaCAoQ2hhbm5lbCkgeworICAgICAgY2FzZSBUSU1fQ0hBTk5FTF8xOiB7CisgICAgICAgIGlmIChzQ2xlYXJJbnB1dENvbmZpZy0+Q2xlYXJJbnB1dFN0YXRlICE9ICh1aW50MzJfdClESVNBQkxFKSB7CisgICAgICAgICAgLyogRW5hYmxlIHRoZSBPQ1JFRiBjbGVhciBmZWF0dXJlIGZvciBDaGFubmVsIDEgKi8KKyAgICAgICAgICBTRVRfQklUKGh0aW0tPkluc3RhbmNlLT5DQ01SMSwgVElNX0NDTVIxX09DMUNFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBPQ1JFRiBjbGVhciBmZWF0dXJlIGZvciBDaGFubmVsIDEgKi8KKyAgICAgICAgICBDTEVBUl9CSVQoaHRpbS0+SW5zdGFuY2UtPkNDTVIxLCBUSU1fQ0NNUjFfT0MxQ0UpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBUSU1fQ0hBTk5FTF8yOiB7CisgICAgICAgIGlmIChzQ2xlYXJJbnB1dENvbmZpZy0+Q2xlYXJJbnB1dFN0YXRlICE9ICh1aW50MzJfdClESVNBQkxFKSB7CisgICAgICAgICAgLyogRW5hYmxlIHRoZSBPQ1JFRiBjbGVhciBmZWF0dXJlIGZvciBDaGFubmVsIDIgKi8KKyAgICAgICAgICBTRVRfQklUKGh0aW0tPkluc3RhbmNlLT5DQ01SMSwgVElNX0NDTVIxX09DMkNFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBPQ1JFRiBjbGVhciBmZWF0dXJlIGZvciBDaGFubmVsIDIgKi8KKyAgICAgICAgICBDTEVBUl9CSVQoaHRpbS0+SW5zdGFuY2UtPkNDTVIxLCBUSU1fQ0NNUjFfT0MyQ0UpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBUSU1fQ0hBTk5FTF8zOiB7CisgICAgICAgIGlmIChzQ2xlYXJJbnB1dENvbmZpZy0+Q2xlYXJJbnB1dFN0YXRlICE9ICh1aW50MzJfdClESVNBQkxFKSB7CisgICAgICAgICAgLyogRW5hYmxlIHRoZSBPQ1JFRiBjbGVhciBmZWF0dXJlIGZvciBDaGFubmVsIDMgKi8KKyAgICAgICAgICBTRVRfQklUKGh0aW0tPkluc3RhbmNlLT5DQ01SMiwgVElNX0NDTVIyX09DM0NFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBPQ1JFRiBjbGVhciBmZWF0dXJlIGZvciBDaGFubmVsIDMgKi8KKyAgICAgICAgICBDTEVBUl9CSVQoaHRpbS0+SW5zdGFuY2UtPkNDTVIyLCBUSU1fQ0NNUjJfT0MzQ0UpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBUSU1fQ0hBTk5FTF80OiB7CisgICAgICAgIGlmIChzQ2xlYXJJbnB1dENvbmZpZy0+Q2xlYXJJbnB1dFN0YXRlICE9ICh1aW50MzJfdClESVNBQkxFKSB7CisgICAgICAgICAgLyogRW5hYmxlIHRoZSBPQ1JFRiBjbGVhciBmZWF0dXJlIGZvciBDaGFubmVsIDQgKi8KKyAgICAgICAgICBTRVRfQklUKGh0aW0tPkluc3RhbmNlLT5DQ01SMiwgVElNX0NDTVIyX09DNENFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBPQ1JFRiBjbGVhciBmZWF0dXJlIGZvciBDaGFubmVsIDQgKi8KKyAgICAgICAgICBDTEVBUl9CSVQoaHRpbS0+SW5zdGFuY2UtPkNDTVIyLCBUSU1fQ0NNUjJfT0M0Q0UpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBUSU1fQ0hBTk5FTF81OiB7CisgICAgICAgIGlmIChzQ2xlYXJJbnB1dENvbmZpZy0+Q2xlYXJJbnB1dFN0YXRlICE9ICh1aW50MzJfdClESVNBQkxFKSB7CisgICAgICAgICAgLyogRW5hYmxlIHRoZSBPQ1JFRiBjbGVhciBmZWF0dXJlIGZvciBDaGFubmVsIDUgKi8KKyAgICAgICAgICBTRVRfQklUKGh0aW0tPkluc3RhbmNlLT5DQ01SMywgVElNX0NDTVIzX09DNUNFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBPQ1JFRiBjbGVhciBmZWF0dXJlIGZvciBDaGFubmVsIDUgKi8KKyAgICAgICAgICBDTEVBUl9CSVQoaHRpbS0+SW5zdGFuY2UtPkNDTVIzLCBUSU1fQ0NNUjNfT0M1Q0UpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBUSU1fQ0hBTk5FTF82OiB7CisgICAgICAgIGlmIChzQ2xlYXJJbnB1dENvbmZpZy0+Q2xlYXJJbnB1dFN0YXRlICE9ICh1aW50MzJfdClESVNBQkxFKSB7CisgICAgICAgICAgLyogRW5hYmxlIHRoZSBPQ1JFRiBjbGVhciBmZWF0dXJlIGZvciBDaGFubmVsIDYgKi8KKyAgICAgICAgICBTRVRfQklUKGh0aW0tPkluc3RhbmNlLT5DQ01SMywgVElNX0NDTVIzX09DNkNFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBPQ1JFRiBjbGVhciBmZWF0dXJlIGZvciBDaGFubmVsIDYgKi8KKyAgICAgICAgICBDTEVBUl9CSVQoaHRpbS0+SW5zdGFuY2UtPkNDTVIzLCBUSU1fQ0NNUjNfT0M2Q0UpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworCisgIF9fSEFMX1VOTE9DSyhodGltKTsKKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIEBicmllZiAgIENvbmZpZ3VyZXMgdGhlIGNsb2NrIHNvdXJjZSB0byBiZSB1c2VkCisgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICogQHBhcmFtICBzQ2xvY2tTb3VyY2VDb25maWcgcG9pbnRlciB0byBhIFRJTV9DbG9ja0NvbmZpZ1R5cGVEZWYgc3RydWN0dXJlIHRoYXQKKyAqICAgICAgICAgY29udGFpbnMgdGhlIGNsb2NrIHNvdXJjZSBpbmZvcm1hdGlvbiBmb3IgdGhlIFRJTSBwZXJpcGhlcmFsLgorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fQ29uZmlnQ2xvY2tTb3VyY2UoCisgICAgVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIGNvbnN0IFRJTV9DbG9ja0NvbmZpZ1R5cGVEZWYgKnNDbG9ja1NvdXJjZUNvbmZpZykgeworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisgIHVpbnQzMl90IHRtcHNtY3I7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodGltKTsKKworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfQlVTWTsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMT0NLU09VUkNFKHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tTb3VyY2UpKTsKKworICAvKiBSZXNldCB0aGUgU01TLCBUUywgRUNFLCBFVFBTIGFuZCBFVFJGIGJpdHMgKi8KKyAgdG1wc21jciA9IGh0aW0tPkluc3RhbmNlLT5TTUNSOworICB0bXBzbWNyICY9IH4oVElNX1NNQ1JfU01TIHwgVElNX1NNQ1JfVFMpOworICB0bXBzbWNyICY9IH4oVElNX1NNQ1JfRVRGIHwgVElNX1NNQ1JfRVRQUyB8IFRJTV9TTUNSX0VDRSB8IFRJTV9TTUNSX0VUUCk7CisgIGh0aW0tPkluc3RhbmNlLT5TTUNSID0gdG1wc21jcjsKKworICBzd2l0Y2ggKHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tTb3VyY2UpIHsKKyAgICBjYXNlIFRJTV9DTE9DS1NPVVJDRV9JTlRFUk5BTDogeworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTE6IHsKKyAgICAgIC8qIENoZWNrIHdoZXRoZXIgb3Igbm90IHRoZSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBleHRlcm5hbCB0cmlnZ2VyIGlucHV0CisgICAgICAgKiBtb2RlIDEgKEVUUkYpKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTFfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICAgICAgLyogQ2hlY2sgRVRSIGlucHV0IGNvbmRpdGlvbmluZyByZWxhdGVkIHBhcmFtZXRlcnMgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tQUkVTQ0FMRVIoc0Nsb2NrU291cmNlQ29uZmlnLT5DbG9ja1ByZXNjYWxlcikpOworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTE9DS1BPTEFSSVRZKHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tQb2xhcml0eSkpOworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTE9DS0ZJTFRFUihzQ2xvY2tTb3VyY2VDb25maWctPkNsb2NrRmlsdGVyKSk7CisKKyAgICAgIC8qIENvbmZpZ3VyZSB0aGUgRVRSIENsb2NrIHNvdXJjZSAqLworICAgICAgVElNX0VUUl9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsIHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tQcmVzY2FsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBzQ2xvY2tTb3VyY2VDb25maWctPkNsb2NrUG9sYXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgICBzQ2xvY2tTb3VyY2VDb25maWctPkNsb2NrRmlsdGVyKTsKKworICAgICAgLyogU2VsZWN0IHRoZSBFeHRlcm5hbCBjbG9jayBtb2RlMSBhbmQgdGhlIEVUUkYgdHJpZ2dlciAqLworICAgICAgdG1wc21jciA9IGh0aW0tPkluc3RhbmNlLT5TTUNSOworICAgICAgdG1wc21jciB8PSAoVElNX1NMQVZFTU9ERV9FWFRFUk5BTDEgfCBUSU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTEpOworICAgICAgLyogV3JpdGUgdG8gVElNeCBTTUNSICovCisgICAgICBodGltLT5JbnN0YW5jZS0+U01DUiA9IHRtcHNtY3I7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMjogeworICAgICAgLyogQ2hlY2sgd2hldGhlciBvciBub3QgdGhlIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGV4dGVybmFsIHRyaWdnZXIgaW5wdXQKKyAgICAgICAqIG1vZGUgMiAoRVRSRikqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgICAgICAvKiBDaGVjayBFVFIgaW5wdXQgY29uZGl0aW9uaW5nIHJlbGF0ZWQgcGFyYW1ldGVycyAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTE9DS1BSRVNDQUxFUihzQ2xvY2tTb3VyY2VDb25maWctPkNsb2NrUHJlc2NhbGVyKSk7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMT0NLUE9MQVJJVFkoc0Nsb2NrU291cmNlQ29uZmlnLT5DbG9ja1BvbGFyaXR5KSk7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMT0NLRklMVEVSKHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tGaWx0ZXIpKTsKKworICAgICAgLyogQ29uZmlndXJlIHRoZSBFVFIgQ2xvY2sgc291cmNlICovCisgICAgICBUSU1fRVRSX1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgc0Nsb2NrU291cmNlQ29uZmlnLT5DbG9ja1ByZXNjYWxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tQb2xhcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tGaWx0ZXIpOworICAgICAgLyogRW5hYmxlIHRoZSBFeHRlcm5hbCBjbG9jayBtb2RlMiAqLworICAgICAgaHRpbS0+SW5zdGFuY2UtPlNNQ1IgfD0gVElNX1NNQ1JfRUNFOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0xPQ0tTT1VSQ0VfVEkxOiB7CisgICAgICAvKiBDaGVjayB3aGV0aGVyIG9yIG5vdCB0aGUgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgZXh0ZXJuYWwgY2xvY2sgbW9kZSAxCisgICAgICAgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tTT1VSQ0VfVElYX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgICAgIC8qIENoZWNrIFRJMSBpbnB1dCBjb25kaXRpb25pbmcgcmVsYXRlZCBwYXJhbWV0ZXJzICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMT0NLUE9MQVJJVFkoc0Nsb2NrU291cmNlQ29uZmlnLT5DbG9ja1BvbGFyaXR5KSk7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMT0NLRklMVEVSKHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tGaWx0ZXIpKTsKKworICAgICAgVElNX1RJMV9Db25maWdJbnB1dFN0YWdlKGh0aW0tPkluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tQb2xhcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQ2xvY2tTb3VyY2VDb25maWctPkNsb2NrRmlsdGVyKTsKKyAgICAgIFRJTV9JVFJ4X1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgVElNX0NMT0NLU09VUkNFX1RJMSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DTE9DS1NPVVJDRV9USTI6IHsKKyAgICAgIC8qIENoZWNrIHdoZXRoZXIgb3Igbm90IHRoZSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBleHRlcm5hbCBjbG9jayBtb2RlIDEKKyAgICAgICAqIChFVFJGKSovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMT0NLU09VUkNFX1RJWF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgICAgICAvKiBDaGVjayBUSTIgaW5wdXQgY29uZGl0aW9uaW5nIHJlbGF0ZWQgcGFyYW1ldGVycyAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTE9DS1BPTEFSSVRZKHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tQb2xhcml0eSkpOworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTE9DS0ZJTFRFUihzQ2xvY2tTb3VyY2VDb25maWctPkNsb2NrRmlsdGVyKSk7CisKKyAgICAgIFRJTV9USTJfQ29uZmlnSW5wdXRTdGFnZShodGltLT5JbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQ2xvY2tTb3VyY2VDb25maWctPkNsb2NrUG9sYXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0Nsb2NrU291cmNlQ29uZmlnLT5DbG9ja0ZpbHRlcik7CisgICAgICBUSU1fSVRSeF9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsIFRJTV9DTE9DS1NPVVJDRV9USTIpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0xPQ0tTT1VSQ0VfVEkxRUQ6IHsKKyAgICAgIC8qIENoZWNrIHdoZXRoZXIgb3Igbm90IHRoZSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBleHRlcm5hbCBjbG9jayBtb2RlIDEKKyAgICAgICAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTE9DS1NPVVJDRV9USVhfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICAgICAgLyogQ2hlY2sgVEkxIGlucHV0IGNvbmRpdGlvbmluZyByZWxhdGVkIHBhcmFtZXRlcnMgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tQT0xBUklUWShzQ2xvY2tTb3VyY2VDb25maWctPkNsb2NrUG9sYXJpdHkpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tGSUxURVIoc0Nsb2NrU291cmNlQ29uZmlnLT5DbG9ja0ZpbHRlcikpOworCisgICAgICBUSU1fVEkxX0NvbmZpZ0lucHV0U3RhZ2UoaHRpbS0+SW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0Nsb2NrU291cmNlQ29uZmlnLT5DbG9ja1BvbGFyaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tGaWx0ZXIpOworICAgICAgVElNX0lUUnhfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0xPQ0tTT1VSQ0VfVEkxRUQpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMDoKKyAgICBjYXNlIFRJTV9DTE9DS1NPVVJDRV9JVFIxOgorICAgIGNhc2UgVElNX0NMT0NLU09VUkNFX0lUUjI6CisgICAgY2FzZSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMzoKKyNpZiBkZWZpbmVkKFRJTTUpCisgICAgY2FzZSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNDoKKyNlbmRpZiAvKiBUSU01ICovCisgICAgY2FzZSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSNToKKyAgICBjYXNlIFRJTV9DTE9DS1NPVVJDRV9JVFI2OgorICAgIGNhc2UgVElNX0NMT0NLU09VUkNFX0lUUjc6CisgICAgY2FzZSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSODoKKyNpZiBkZWZpbmVkKFRJTTIwKQorICAgIGNhc2UgVElNX0NMT0NLU09VUkNFX0lUUjk6CisjZW5kaWYgLyogVElNMjAgKi8KKyNpZiBkZWZpbmVkKEhSVElNMSkKKyAgICBjYXNlIFRJTV9DTE9DS1NPVVJDRV9JVFIxMDoKKyNlbmRpZiAvKiBIUlRJTTEgKi8KKyAgICBjYXNlIFRJTV9DTE9DS1NPVVJDRV9JVFIxMTogeworICAgICAgLyogQ2hlY2sgd2hldGhlciBvciBub3QgdGhlIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGludGVybmFsIHRyaWdnZXIgaW5wdXQKKyAgICAgICAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTE9DS1NPVVJDRV9JTlNUQU5DRSgKKyAgICAgICAgICAoaHRpbS0+SW5zdGFuY2UpLCBzQ2xvY2tTb3VyY2VDb25maWctPkNsb2NrU291cmNlKSk7CisKKyAgICAgIFRJTV9JVFJ4X1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgc0Nsb2NrU291cmNlQ29uZmlnLT5DbG9ja1NvdXJjZSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgICAgYnJlYWs7CisgIH0KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworCisgIF9fSEFMX1VOTE9DSyhodGltKTsKKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIEBicmllZiAgU2VsZWN0cyB0aGUgc2lnbmFsIGNvbm5lY3RlZCB0byB0aGUgVEkxIGlucHV0OiBkaXJlY3QgZnJvbSBDSDFfaW5wdXQKKyAqICAgICAgICAgb3IgYSBYT1IgY29tYmluYXRpb24gYmV0d2VlbiBDSDFfaW5wdXQsIENIMl9pbnB1dCAmIENIM19pbnB1dAorICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUuCisgKiBAcGFyYW0gIFRJMV9TZWxlY3Rpb24gSW5kaWNhdGUgd2hldGhlciBvciBub3QgY2hhbm5lbCAxIGlzIGNvbm5lY3RlZCB0byB0aGUKKyAqICAgICAgICAgb3V0cHV0IG9mIGEgWE9SIGdhdGUuCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIFRJTV9USTFTRUxFQ1RJT05fQ0gxOiBUaGUgVElNeF9DSDEgcGluIGlzIGNvbm5lY3RlZCB0byBUSTEKKyAqIGlucHV0CisgKiAgICAgICAgICAgIEBhcmcgVElNX1RJMVNFTEVDVElPTl9YT1JDT01CSU5BVElPTjogVGhlIFRJTXhfQ0gxLCBDSDIgYW5kIENIMworICogICAgICAgICAgICBwaW5zIGFyZSBjb25uZWN0ZWQgdG8gdGhlIFRJMSBpbnB1dCAoWE9SIGNvbWJpbmF0aW9uKQorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fQ29uZmlnVEkxSW5wdXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRJMV9TZWxlY3Rpb24pIHsKKyAgdWludDMyX3QgdG1wY3IyOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fWE9SX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fVEkxU0VMRUNUSU9OKFRJMV9TZWxlY3Rpb24pKTsKKworICAvKiBHZXQgdGhlIFRJTXggQ1IyIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcGNyMiA9IGh0aW0tPkluc3RhbmNlLT5DUjI7CisKKyAgLyogUmVzZXQgdGhlIFRJMSBzZWxlY3Rpb24gKi8KKyAgdG1wY3IyICY9IH5USU1fQ1IyX1RJMVM7CisKKyAgLyogU2V0IHRoZSBUSTEgc2VsZWN0aW9uICovCisgIHRtcGNyMiB8PSBUSTFfU2VsZWN0aW9uOworCisgIC8qIFdyaXRlIHRvIFRJTXhDUjIgKi8KKyAgaHRpbS0+SW5zdGFuY2UtPkNSMiA9IHRtcGNyMjsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgVElNIGluIFNsYXZlIG1vZGUKKyAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlLgorICogQHBhcmFtICBzU2xhdmVDb25maWcgcG9pbnRlciB0byBhIFRJTV9TbGF2ZUNvbmZpZ1R5cGVEZWYgc3RydWN0dXJlIHRoYXQKKyAqICAgICAgICAgY29udGFpbnMgdGhlIHNlbGVjdGVkIHRyaWdnZXIgKGludGVybmFsIHRyaWdnZXIgaW5wdXQsIGZpbHRlcmVkCisgKiAgICAgICAgIHRpbWVyIGlucHV0IG9yIGV4dGVybmFsIHRyaWdnZXIgaW5wdXQpIGFuZCB0aGUgU2xhdmUgbW9kZQorICogICAgICAgICAoRGlzYWJsZSwgUmVzZXQsIEdhdGVkLCBUcmlnZ2VyLCBFeHRlcm5hbCBjbG9jayBtb2RlIDEsIFJlc2V0ICsKKyAqIFRyaWdnZXIsIEdhdGVkICsgUmVzZXQpLgorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fU2xhdmVDb25maWdTeW5jaHJvKAorICAgIFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCBjb25zdCBUSU1fU2xhdmVDb25maWdUeXBlRGVmICpzU2xhdmVDb25maWcpIHsKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9TTEFWRV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX1NMQVZFX01PREUoc1NsYXZlQ29uZmlnLT5TbGF2ZU1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKAorICAgICAgSVNfVElNX1RSSUdHRVJfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIHNTbGF2ZUNvbmZpZy0+SW5wdXRUcmlnZ2VyKSk7CisKKyAgX19IQUxfTE9DSyhodGltKTsKKworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfQlVTWTsKKworICBpZiAoVElNX1NsYXZlVGltZXJfU2V0Q29uZmlnKGh0aW0sIHNTbGF2ZUNvbmZpZykgIT0gSEFMX09LKSB7CisgICAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworICAgIF9fSEFMX1VOTE9DSyhodGltKTsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogRGlzYWJsZSBUcmlnZ2VyIEludGVycnVwdCAqLworICBfX0hBTF9USU1fRElTQUJMRV9JVChodGltLCBUSU1fSVRfVFJJR0dFUik7CisKKyAgLyogRGlzYWJsZSBUcmlnZ2VyIERNQSByZXF1ZXN0ICovCisgIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBUSU1fRE1BX1RSSUdHRVIpOworCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRUFEWTsKKworICBfX0hBTF9VTkxPQ0soaHRpbSk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIFRJTSBpbiBTbGF2ZSBtb2RlIGluIGludGVycnVwdCBtb2RlCisgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZS4KKyAqIEBwYXJhbSAgc1NsYXZlQ29uZmlnIHBvaW50ZXIgdG8gYSBUSU1fU2xhdmVDb25maWdUeXBlRGVmIHN0cnVjdHVyZSB0aGF0CisgKiAgICAgICAgIGNvbnRhaW5zIHRoZSBzZWxlY3RlZCB0cmlnZ2VyIChpbnRlcm5hbCB0cmlnZ2VyIGlucHV0LCBmaWx0ZXJlZAorICogICAgICAgICB0aW1lciBpbnB1dCBvciBleHRlcm5hbCB0cmlnZ2VyIGlucHV0KSBhbmQgdGhlIFNsYXZlIG1vZGUKKyAqICAgICAgICAgKERpc2FibGUsIFJlc2V0LCBHYXRlZCwgVHJpZ2dlciwgRXh0ZXJuYWwgY2xvY2sgbW9kZSAxLCBSZXNldCArCisgKiBUcmlnZ2VyLCBHYXRlZCArIFJlc2V0KS4KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1NsYXZlQ29uZmlnU3luY2hyb19JVCgKKyAgICBUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgY29uc3QgVElNX1NsYXZlQ29uZmlnVHlwZURlZiAqc1NsYXZlQ29uZmlnKSB7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fU0xBVkVfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9TTEFWRV9NT0RFKHNTbGF2ZUNvbmZpZy0+U2xhdmVNb2RlKSk7CisgIGFzc2VydF9wYXJhbSgKKyAgICAgIElTX1RJTV9UUklHR0VSX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBzU2xhdmVDb25maWctPklucHV0VHJpZ2dlcikpOworCisgIF9fSEFMX0xPQ0soaHRpbSk7CisKKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CisKKyAgaWYgKFRJTV9TbGF2ZVRpbWVyX1NldENvbmZpZyhodGltLCBzU2xhdmVDb25maWcpICE9IEhBTF9PSykgeworICAgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRUFEWTsKKyAgICBfX0hBTF9VTkxPQ0soaHRpbSk7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIEVuYWJsZSBUcmlnZ2VyIEludGVycnVwdCAqLworICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9UUklHR0VSKTsKKworICAvKiBEaXNhYmxlIFRyaWdnZXIgRE1BIHJlcXVlc3QgKi8KKyAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIFRJTV9ETUFfVFJJR0dFUik7CisKKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworCisgIF9fSEFMX1VOTE9DSyhodGltKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiAgUmVhZCB0aGUgY2FwdHVyZWQgdmFsdWUgZnJvbSBDYXB0dXJlIENvbXBhcmUgdW5pdAorICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUuCisgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWxzIHRvIGJlIGVuYWJsZWQKKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZAorICogQHJldHZhbCBDYXB0dXJlZCB2YWx1ZQorICovCit1aW50MzJfdCBIQUxfVElNX1JlYWRDYXB0dXJlZFZhbHVlKGNvbnN0IFRJTV9IYW5kbGVUeXBlRGVmICpodGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKSB7CisgIHVpbnQzMl90IHRtcHJlZyA9IDBVOworCisgIHN3aXRjaCAoQ2hhbm5lbCkgeworICAgIGNhc2UgVElNX0NIQU5ORUxfMTogeworICAgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0MxX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgICAgIC8qIFJldHVybiB0aGUgY2FwdHVyZSAxIHZhbHVlICovCisgICAgICB0bXByZWcgPSBodGltLT5JbnN0YW5jZS0+Q0NSMTsKKworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVElNX0NIQU5ORUxfMjogeworICAgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0MyX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgICAgIC8qIFJldHVybiB0aGUgY2FwdHVyZSAyIHZhbHVlICovCisgICAgICB0bXByZWcgPSBodGltLT5JbnN0YW5jZS0+Q0NSMjsKKworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8zOiB7CisgICAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzNfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICAgICAgLyogUmV0dXJuIHRoZSBjYXB0dXJlIDMgdmFsdWUgKi8KKyAgICAgIHRtcHJlZyA9IGh0aW0tPkluc3RhbmNlLT5DQ1IzOworCisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzQ6IHsKKyAgICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDNF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgICAgICAvKiBSZXR1cm4gdGhlIGNhcHR1cmUgNCB2YWx1ZSAqLworICAgICAgdG1wcmVnID0gaHRpbS0+SW5zdGFuY2UtPkNDUjQ7CisKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiB0bXByZWc7Cit9CisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA5IFRJTSBDYWxsYmFja3MgZnVuY3Rpb25zCisgICogIEBicmllZiAgICBUSU0gQ2FsbGJhY2tzIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBUSU0gQ2FsbGJhY2tzIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyBbLi5dCisgICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgVElNIGNhbGxiYWNrIGZ1bmN0aW9uczoKKyAgICgrKSBUSU0gUGVyaW9kIGVsYXBzZWQgY2FsbGJhY2sKKyAgICgrKSBUSU0gT3V0cHV0IENvbXBhcmUgY2FsbGJhY2sKKyAgICgrKSBUSU0gSW5wdXQgY2FwdHVyZSBjYWxsYmFjaworICAgKCspIFRJTSBUcmlnZ2VyIGNhbGxiYWNrCisgICAoKykgVElNIEVycm9yIGNhbGxiYWNrCisgICAoKykgVElNIEluZGV4IGNhbGxiYWNrCisgICAoKykgVElNIERpcmVjdGlvbiBjaGFuZ2UgY2FsbGJhY2sKKyAgICgrKSBUSU0gSW5kZXggZXJyb3IgY2FsbGJhY2sKKyAgICgrKSBUSU0gVHJhbnNpdGlvbiBlcnJvciBjYWxsYmFjaworCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAqIEBicmllZiAgUGVyaW9kIGVsYXBzZWQgY2FsbGJhY2sgaW4gbm9uLWJsb2NraW5nIG1vZGUKKyAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX193ZWFrIHZvaWQgSEFMX1RJTV9QZXJpb2RFbGFwc2VkQ2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pIHsKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHRpbSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9USU1fUGVyaW9kRWxhcHNlZENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyCisgICAgIGZpbGUKKyAgICovCit9CisKKy8qKgorICogQGJyaWVmICBQZXJpb2QgZWxhcHNlZCBoYWxmIGNvbXBsZXRlIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlCisgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICogQHJldHZhbCBOb25lCisgKi8KK19fd2VhayB2b2lkIEhBTF9USU1fUGVyaW9kRWxhcHNlZEhhbGZDcGx0Q2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pIHsKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHRpbSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9USU1fUGVyaW9kRWxhcHNlZEhhbGZDcGx0Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4KKyAgICAgdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgKiBAYnJpZWYgIE91dHB1dCBDb21wYXJlIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlCisgKiBAcGFyYW0gIGh0aW0gVElNIE9DIGhhbmRsZQorICogQHJldHZhbCBOb25lCisgKi8KK19fd2VhayB2b2lkIEhBTF9USU1fT0NfRGVsYXlFbGFwc2VkQ2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pIHsKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHRpbSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9USU1fT0NfRGVsYXlFbGFwc2VkQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIKKyAgICAgZmlsZQorICAgKi8KK30KKworLyoqCisgKiBAYnJpZWYgIElucHV0IENhcHR1cmUgY2FsbGJhY2sgaW4gbm9uLWJsb2NraW5nIG1vZGUKKyAqIEBwYXJhbSAgaHRpbSBUSU0gSUMgaGFuZGxlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX193ZWFrIHZvaWQgSEFMX1RJTV9JQ19DYXB0dXJlQ2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pIHsKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHRpbSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9USU1fSUNfQ2FwdHVyZUNhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICogQGJyaWVmICBJbnB1dCBDYXB0dXJlIGhhbGYgY29tcGxldGUgY2FsbGJhY2sgaW4gbm9uLWJsb2NraW5nIG1vZGUKKyAqIEBwYXJhbSAgaHRpbSBUSU0gSUMgaGFuZGxlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX193ZWFrIHZvaWQgSEFMX1RJTV9JQ19DYXB0dXJlSGFsZkNwbHRDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkgeworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1RJTV9JQ19DYXB0dXJlSGFsZkNwbHRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUKKyAgICAgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAqIEBicmllZiAgUFdNIFB1bHNlIGZpbmlzaGVkIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlCisgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICogQHJldHZhbCBOb25lCisgKi8KK19fd2VhayB2b2lkIEhBTF9USU1fUFdNX1B1bHNlRmluaXNoZWRDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkgeworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1RJTV9QV01fUHVsc2VGaW5pc2hlZENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZQorICAgICB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICogQGJyaWVmICBQV00gUHVsc2UgZmluaXNoZWQgaGFsZiBjb21wbGV0ZSBjYWxsYmFjayBpbiBub24tYmxvY2tpbmcgbW9kZQorICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAqIEByZXR2YWwgTm9uZQorICovCitfX3dlYWsgdm9pZCBIQUxfVElNX1BXTV9QdWxzZUZpbmlzaGVkSGFsZkNwbHRDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkgeworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1RJTV9QV01fUHVsc2VGaW5pc2hlZEhhbGZDcGx0Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQKKyAgICAgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgKiBAYnJpZWYgIEhhbGwgVHJpZ2dlciBkZXRlY3Rpb24gY2FsbGJhY2sgaW4gbm9uLWJsb2NraW5nIG1vZGUKKyAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX193ZWFrIHZvaWQgSEFMX1RJTV9UcmlnZ2VyQ2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pIHsKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHRpbSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9USU1fVHJpZ2dlckNhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICogQGJyaWVmICBIYWxsIFRyaWdnZXIgZGV0ZWN0aW9uIGhhbGYgY29tcGxldGUgY2FsbGJhY2sgaW4gbm9uLWJsb2NraW5nIG1vZGUKKyAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX193ZWFrIHZvaWQgSEFMX1RJTV9UcmlnZ2VySGFsZkNwbHRDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkgeworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1RJTV9UcmlnZ2VySGFsZkNwbHRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlcgorICAgICBmaWxlCisgICAqLworfQorCisvKioKKyAqIEBicmllZiAgVGltZXIgZXJyb3IgY2FsbGJhY2sgaW4gbm9uLWJsb2NraW5nIG1vZGUKKyAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX193ZWFrIHZvaWQgSEFMX1RJTV9FcnJvckNhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKSB7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh0aW0pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVElNX0Vycm9yQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKy8qKgorICogQGJyaWVmICBSZWdpc3RlciBhIFVzZXIgVElNIGNhbGxiYWNrIHRvIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgd2VhaworICogcHJlZGVmaW5lZCBjYWxsYmFjaworICogQHBhcmFtIGh0aW0gdGltIGhhbmRsZQorICogQHBhcmFtIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHJlZ2lzdGVyZWQKKyAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fQkFTRV9NU1BJTklUX0NCX0lEIEJhc2UgTXNwSW5pdCBDYWxsYmFjayBJRAorICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fQkFTRV9NU1BERUlOSVRfQ0JfSUQgQmFzZSBNc3BEZUluaXQgQ2FsbGJhY2sgSUQKKyAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX0lDX01TUElOSVRfQ0JfSUQgSUMgTXNwSW5pdCBDYWxsYmFjayBJRAorICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fSUNfTVNQREVJTklUX0NCX0lEIElDIE1zcERlSW5pdCBDYWxsYmFjayBJRAorICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fT0NfTVNQSU5JVF9DQl9JRCBPQyBNc3BJbml0IENhbGxiYWNrIElECisgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9PQ19NU1BERUlOSVRfQ0JfSUQgT0MgTXNwRGVJbml0IENhbGxiYWNrIElECisgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9QV01fTVNQSU5JVF9DQl9JRCBQV00gTXNwSW5pdCBDYWxsYmFjayBJRAorICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fUFdNX01TUERFSU5JVF9DQl9JRCBQV00gTXNwRGVJbml0IENhbGxiYWNrIElECisgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9PTkVfUFVMU0VfTVNQSU5JVF9DQl9JRCBPbmUgUHVsc2UgTXNwSW5pdCBDYWxsYmFjaworICogSUQKKyAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX09ORV9QVUxTRV9NU1BERUlOSVRfQ0JfSUQgT25lIFB1bHNlIE1zcERlSW5pdAorICogQ2FsbGJhY2sgSUQKKyAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX0VOQ09ERVJfTVNQSU5JVF9DQl9JRCBFbmNvZGVyIE1zcEluaXQgQ2FsbGJhY2sgSUQKKyAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX0VOQ09ERVJfTVNQREVJTklUX0NCX0lEIEVuY29kZXIgTXNwRGVJbml0IENhbGxiYWNrCisgKiBJRAorICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fSEFMTF9TRU5TT1JfTVNQSU5JVF9DQl9JRCBIYWxsIFNlbnNvciBNc3BJbml0CisgKiBDYWxsYmFjayBJRAorICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fSEFMTF9TRU5TT1JfTVNQREVJTklUX0NCX0lEIEhhbGwgU2Vuc29yIE1zcERlSW5pdAorICogQ2FsbGJhY2sgSUQKKyAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX1BFUklPRF9FTEFQU0VEX0NCX0lEIFBlcmlvZCBFbGFwc2VkIENhbGxiYWNrIElECisgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9QRVJJT0RfRUxBUFNFRF9IQUxGX0NCX0lEIFBlcmlvZCBFbGFwc2VkIGhhbGYKKyAqIGNvbXBsZXRlIENhbGxiYWNrIElECisgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9UUklHR0VSX0NCX0lEIFRyaWdnZXIgQ2FsbGJhY2sgSUQKKyAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX1RSSUdHRVJfSEFMRl9DQl9JRCBUcmlnZ2VyIGhhbGYgY29tcGxldGUgQ2FsbGJhY2sKKyAqIElECisgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9JQ19DQVBUVVJFX0NCX0lEIElucHV0IENhcHR1cmUgQ2FsbGJhY2sgSUQKKyAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX0lDX0NBUFRVUkVfSEFMRl9DQl9JRCBJbnB1dCBDYXB0dXJlIGhhbGYgY29tcGxldGUKKyAqIENhbGxiYWNrIElECisgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9PQ19ERUxBWV9FTEFQU0VEX0NCX0lEIE91dHB1dCBDb21wYXJlIERlbGF5CisgKiBFbGFwc2VkIENhbGxiYWNrIElECisgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9QV01fUFVMU0VfRklOSVNIRURfQ0JfSUQgUFdNIFB1bHNlIEZpbmlzaGVkCisgKiBDYWxsYmFjayBJRAorICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fUFdNX1BVTFNFX0ZJTklTSEVEX0hBTEZfQ0JfSUQgUFdNIFB1bHNlIEZpbmlzaGVkCisgKiBoYWxmIGNvbXBsZXRlIENhbGxiYWNrIElECisgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9FUlJPUl9DQl9JRCBFcnJvciBDYWxsYmFjayBJRAorICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fQ09NTVVUQVRJT05fQ0JfSUQgQ29tbXV0YXRpb24gQ2FsbGJhY2sgSUQKKyAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX0NPTU1VVEFUSU9OX0hBTEZfQ0JfSUQgQ29tbXV0YXRpb24gaGFsZiBjb21wbGV0ZQorICogQ2FsbGJhY2sgSUQKKyAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX0JSRUFLX0NCX0lEIEJyZWFrIENhbGxiYWNrIElECisgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9CUkVBSzJfQ0JfSUQgQnJlYWsyIENhbGxiYWNrIElECisgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9FTkNPREVSX0lOREVYX0NCX0lEIEVuY29kZXIgSW5kZXggQ2FsbGJhY2sgSUQKKyAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX0RJUkVDVElPTl9DSEFOR0VfQ0JfSUQgRGlyZWN0aW9uIENoYW5nZSBDYWxsYmFjaworICogSUQKKyAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX0lOREVYX0VSUk9SX0NCX0lEIEluZGV4IEVycm9yIENhbGxiYWNrIElECisgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9UUkFOU0lUSU9OX0VSUk9SX0NCX0lEIFRyYW5zaXRpb24gRXJyb3IgQ2FsbGJhY2sKKyAqIElECisgKiAgICAgICAgICBAcGFyYW0gcENhbGxiYWNrIHBvaW50ZXIgdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uCisgKiAgICAgICAgICBAcmV0dmFsIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1JlZ2lzdGVyQ2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1RJTV9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUSU1fQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjaykgeworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgaWYgKHBDYWxsYmFjayA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIGlmIChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX1JFQURZKSB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKSB7CisgICAgICBjYXNlIEhBTF9USU1fQkFTRV9NU1BJTklUX0NCX0lEOgorICAgICAgICBodGltLT5CYXNlX01zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9CQVNFX01TUERFSU5JVF9DQl9JRDoKKyAgICAgICAgaHRpbS0+QmFzZV9Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9JQ19NU1BJTklUX0NCX0lEOgorICAgICAgICBodGltLT5JQ19Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fSUNfTVNQREVJTklUX0NCX0lEOgorICAgICAgICBodGltLT5JQ19Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9PQ19NU1BJTklUX0NCX0lEOgorICAgICAgICBodGltLT5PQ19Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fT0NfTVNQREVJTklUX0NCX0lEOgorICAgICAgICBodGltLT5PQ19Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9QV01fTVNQSU5JVF9DQl9JRDoKKyAgICAgICAgaHRpbS0+UFdNX01zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9QV01fTVNQREVJTklUX0NCX0lEOgorICAgICAgICBodGltLT5QV01fTXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fT05FX1BVTFNFX01TUElOSVRfQ0JfSUQ6CisgICAgICAgIGh0aW0tPk9uZVB1bHNlX01zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9PTkVfUFVMU0VfTVNQREVJTklUX0NCX0lEOgorICAgICAgICBodGltLT5PbmVQdWxzZV9Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9FTkNPREVSX01TUElOSVRfQ0JfSUQ6CisgICAgICAgIGh0aW0tPkVuY29kZXJfTXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX0VOQ09ERVJfTVNQREVJTklUX0NCX0lEOgorICAgICAgICBodGltLT5FbmNvZGVyX01zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX0hBTExfU0VOU09SX01TUElOSVRfQ0JfSUQ6CisgICAgICAgIGh0aW0tPkhhbGxTZW5zb3JfTXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX0hBTExfU0VOU09SX01TUERFSU5JVF9DQl9JRDoKKyAgICAgICAgaHRpbS0+SGFsbFNlbnNvcl9Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9QRVJJT0RfRUxBUFNFRF9DQl9JRDoKKyAgICAgICAgaHRpbS0+UGVyaW9kRWxhcHNlZENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX1BFUklPRF9FTEFQU0VEX0hBTEZfQ0JfSUQ6CisgICAgICAgIGh0aW0tPlBlcmlvZEVsYXBzZWRIYWxmQ3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX1RSSUdHRVJfQ0JfSUQ6CisgICAgICAgIGh0aW0tPlRyaWdnZXJDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9UUklHR0VSX0hBTEZfQ0JfSUQ6CisgICAgICAgIGh0aW0tPlRyaWdnZXJIYWxmQ3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX0lDX0NBUFRVUkVfQ0JfSUQ6CisgICAgICAgIGh0aW0tPklDX0NhcHR1cmVDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9JQ19DQVBUVVJFX0hBTEZfQ0JfSUQ6CisgICAgICAgIGh0aW0tPklDX0NhcHR1cmVIYWxmQ3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX09DX0RFTEFZX0VMQVBTRURfQ0JfSUQ6CisgICAgICAgIGh0aW0tPk9DX0RlbGF5RWxhcHNlZENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX1BXTV9QVUxTRV9GSU5JU0hFRF9DQl9JRDoKKyAgICAgICAgaHRpbS0+UFdNX1B1bHNlRmluaXNoZWRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9QV01fUFVMU0VfRklOSVNIRURfSEFMRl9DQl9JRDoKKyAgICAgICAgaHRpbS0+UFdNX1B1bHNlRmluaXNoZWRIYWxmQ3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX0VSUk9SX0NCX0lEOgorICAgICAgICBodGltLT5FcnJvckNhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX0NPTU1VVEFUSU9OX0NCX0lEOgorICAgICAgICBodGltLT5Db21tdXRhdGlvbkNhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX0NPTU1VVEFUSU9OX0hBTEZfQ0JfSUQ6CisgICAgICAgIGh0aW0tPkNvbW11dGF0aW9uSGFsZkNwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9CUkVBS19DQl9JRDoKKyAgICAgICAgaHRpbS0+QnJlYWtDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9CUkVBSzJfQ0JfSUQ6CisgICAgICAgIGh0aW0tPkJyZWFrMkNhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX0VOQ09ERVJfSU5ERVhfQ0JfSUQ6CisgICAgICAgIGh0aW0tPkVuY29kZXJJbmRleENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX0RJUkVDVElPTl9DSEFOR0VfQ0JfSUQ6CisgICAgICAgIGh0aW0tPkRpcmVjdGlvbkNoYW5nZUNhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX0lOREVYX0VSUk9SX0NCX0lEOgorICAgICAgICBodGltLT5JbmRleEVycm9yQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fVFJBTlNJVElPTl9FUlJPUl9DQl9JRDoKKyAgICAgICAgaHRpbS0+VHJhbnNpdGlvbkVycm9yQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9IGVsc2UgaWYgKGh0aW0tPlN0YXRlID09IEhBTF9USU1fU1RBVEVfUkVTRVQpIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpIHsKKyAgICAgIGNhc2UgSEFMX1RJTV9CQVNFX01TUElOSVRfQ0JfSUQ6CisgICAgICAgIGh0aW0tPkJhc2VfTXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX0JBU0VfTVNQREVJTklUX0NCX0lEOgorICAgICAgICBodGltLT5CYXNlX01zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX0lDX01TUElOSVRfQ0JfSUQ6CisgICAgICAgIGh0aW0tPklDX01zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9JQ19NU1BERUlOSVRfQ0JfSUQ6CisgICAgICAgIGh0aW0tPklDX01zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX09DX01TUElOSVRfQ0JfSUQ6CisgICAgICAgIGh0aW0tPk9DX01zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9PQ19NU1BERUlOSVRfQ0JfSUQ6CisgICAgICAgIGh0aW0tPk9DX01zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX1BXTV9NU1BJTklUX0NCX0lEOgorICAgICAgICBodGltLT5QV01fTXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX1BXTV9NU1BERUlOSVRfQ0JfSUQ6CisgICAgICAgIGh0aW0tPlBXTV9Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9PTkVfUFVMU0VfTVNQSU5JVF9DQl9JRDoKKyAgICAgICAgaHRpbS0+T25lUHVsc2VfTXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX09ORV9QVUxTRV9NU1BERUlOSVRfQ0JfSUQ6CisgICAgICAgIGh0aW0tPk9uZVB1bHNlX01zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX0VOQ09ERVJfTVNQSU5JVF9DQl9JRDoKKyAgICAgICAgaHRpbS0+RW5jb2Rlcl9Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fRU5DT0RFUl9NU1BERUlOSVRfQ0JfSUQ6CisgICAgICAgIGh0aW0tPkVuY29kZXJfTXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fSEFMTF9TRU5TT1JfTVNQSU5JVF9DQl9JRDoKKyAgICAgICAgaHRpbS0+SGFsbFNlbnNvcl9Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fSEFMTF9TRU5TT1JfTVNQREVJTklUX0NCX0lEOgorICAgICAgICBodGltLT5IYWxsU2Vuc29yX01zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBAYnJpZWYgIFVucmVnaXN0ZXIgYSBUSU0gY2FsbGJhY2sKKyAqICAgICAgICAgVElNIGNhbGxiYWNrIGlzIHJlZGlyZWN0ZWQgdG8gdGhlIHdlYWsgcHJlZGVmaW5lZCBjYWxsYmFjaworICogQHBhcmFtIGh0aW0gdGltIGhhbmRsZQorICogQHBhcmFtIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHVucmVnaXN0ZXJlZAorICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9CQVNFX01TUElOSVRfQ0JfSUQgQmFzZSBNc3BJbml0IENhbGxiYWNrIElECisgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9CQVNFX01TUERFSU5JVF9DQl9JRCBCYXNlIE1zcERlSW5pdCBDYWxsYmFjayBJRAorICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fSUNfTVNQSU5JVF9DQl9JRCBJQyBNc3BJbml0IENhbGxiYWNrIElECisgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9JQ19NU1BERUlOSVRfQ0JfSUQgSUMgTXNwRGVJbml0IENhbGxiYWNrIElECisgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9PQ19NU1BJTklUX0NCX0lEIE9DIE1zcEluaXQgQ2FsbGJhY2sgSUQKKyAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX09DX01TUERFSU5JVF9DQl9JRCBPQyBNc3BEZUluaXQgQ2FsbGJhY2sgSUQKKyAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX1BXTV9NU1BJTklUX0NCX0lEIFBXTSBNc3BJbml0IENhbGxiYWNrIElECisgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9QV01fTVNQREVJTklUX0NCX0lEIFBXTSBNc3BEZUluaXQgQ2FsbGJhY2sgSUQKKyAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX09ORV9QVUxTRV9NU1BJTklUX0NCX0lEIE9uZSBQdWxzZSBNc3BJbml0IENhbGxiYWNrCisgKiBJRAorICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fT05FX1BVTFNFX01TUERFSU5JVF9DQl9JRCBPbmUgUHVsc2UgTXNwRGVJbml0CisgKiBDYWxsYmFjayBJRAorICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fRU5DT0RFUl9NU1BJTklUX0NCX0lEIEVuY29kZXIgTXNwSW5pdCBDYWxsYmFjayBJRAorICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fRU5DT0RFUl9NU1BERUlOSVRfQ0JfSUQgRW5jb2RlciBNc3BEZUluaXQgQ2FsbGJhY2sKKyAqIElECisgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9IQUxMX1NFTlNPUl9NU1BJTklUX0NCX0lEIEhhbGwgU2Vuc29yIE1zcEluaXQKKyAqIENhbGxiYWNrIElECisgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9IQUxMX1NFTlNPUl9NU1BERUlOSVRfQ0JfSUQgSGFsbCBTZW5zb3IgTXNwRGVJbml0CisgKiBDYWxsYmFjayBJRAorICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fUEVSSU9EX0VMQVBTRURfQ0JfSUQgUGVyaW9kIEVsYXBzZWQgQ2FsbGJhY2sgSUQKKyAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX1BFUklPRF9FTEFQU0VEX0hBTEZfQ0JfSUQgUGVyaW9kIEVsYXBzZWQgaGFsZgorICogY29tcGxldGUgQ2FsbGJhY2sgSUQKKyAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX1RSSUdHRVJfQ0JfSUQgVHJpZ2dlciBDYWxsYmFjayBJRAorICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fVFJJR0dFUl9IQUxGX0NCX0lEIFRyaWdnZXIgaGFsZiBjb21wbGV0ZSBDYWxsYmFjaworICogSUQKKyAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX0lDX0NBUFRVUkVfQ0JfSUQgSW5wdXQgQ2FwdHVyZSBDYWxsYmFjayBJRAorICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fSUNfQ0FQVFVSRV9IQUxGX0NCX0lEIElucHV0IENhcHR1cmUgaGFsZiBjb21wbGV0ZQorICogQ2FsbGJhY2sgSUQKKyAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX09DX0RFTEFZX0VMQVBTRURfQ0JfSUQgT3V0cHV0IENvbXBhcmUgRGVsYXkKKyAqIEVsYXBzZWQgQ2FsbGJhY2sgSUQKKyAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX1BXTV9QVUxTRV9GSU5JU0hFRF9DQl9JRCBQV00gUHVsc2UgRmluaXNoZWQKKyAqIENhbGxiYWNrIElECisgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9QV01fUFVMU0VfRklOSVNIRURfSEFMRl9DQl9JRCBQV00gUHVsc2UgRmluaXNoZWQKKyAqIGhhbGYgY29tcGxldGUgQ2FsbGJhY2sgSUQKKyAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX0VSUk9SX0NCX0lEIEVycm9yIENhbGxiYWNrIElECisgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9DT01NVVRBVElPTl9DQl9JRCBDb21tdXRhdGlvbiBDYWxsYmFjayBJRAorICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fQ09NTVVUQVRJT05fSEFMRl9DQl9JRCBDb21tdXRhdGlvbiBoYWxmIGNvbXBsZXRlCisgKiBDYWxsYmFjayBJRAorICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fQlJFQUtfQ0JfSUQgQnJlYWsgQ2FsbGJhY2sgSUQKKyAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX0JSRUFLMl9DQl9JRCBCcmVhazIgQ2FsbGJhY2sgSUQKKyAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX0VOQ09ERVJfSU5ERVhfQ0JfSUQgRW5jb2RlciBJbmRleCBDYWxsYmFjayBJRAorICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fRElSRUNUSU9OX0NIQU5HRV9DQl9JRCBEaXJlY3Rpb24gQ2hhbmdlIENhbGxiYWNrCisgKiBJRAorICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fSU5ERVhfRVJST1JfQ0JfSUQgSW5kZXggRXJyb3IgQ2FsbGJhY2sgSUQKKyAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX1RSQU5TSVRJT05fRVJST1JfQ0JfSUQgVHJhbnNpdGlvbiBFcnJvciBDYWxsYmFjaworICogSUQKKyAqICAgICAgICAgIEByZXR2YWwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fVW5SZWdpc3RlckNhbGxiYWNrKAorICAgIFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCBIQUxfVElNX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpIHsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIGlmIChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX1JFQURZKSB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKSB7CisgICAgICBjYXNlIEhBTF9USU1fQkFTRV9NU1BJTklUX0NCX0lEOgorICAgICAgICAvKiBMZWdhY3kgd2VhayBCYXNlIE1zcEluaXQgQ2FsbGJhY2sgKi8KKyAgICAgICAgaHRpbS0+QmFzZV9Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfVElNX0Jhc2VfTXNwSW5pdDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9CQVNFX01TUERFSU5JVF9DQl9JRDoKKyAgICAgICAgLyogTGVnYWN5IHdlYWsgQmFzZSBNc3AgRGVJbml0IENhbGxiYWNrICovCisgICAgICAgIGh0aW0tPkJhc2VfTXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfVElNX0Jhc2VfTXNwRGVJbml0OworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX0lDX01TUElOSVRfQ0JfSUQ6CisgICAgICAgIC8qIExlZ2FjeSB3ZWFrIElDIE1zcCBJbml0IENhbGxiYWNrICovCisgICAgICAgIGh0aW0tPklDX01zcEluaXRDYWxsYmFjayA9IEhBTF9USU1fSUNfTXNwSW5pdDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9JQ19NU1BERUlOSVRfQ0JfSUQ6CisgICAgICAgIC8qIExlZ2FjeSB3ZWFrIElDIE1zcCBEZUluaXQgQ2FsbGJhY2sgKi8KKyAgICAgICAgaHRpbS0+SUNfTXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfVElNX0lDX01zcERlSW5pdDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9PQ19NU1BJTklUX0NCX0lEOgorICAgICAgICAvKiBMZWdhY3kgd2VhayBPQyBNc3AgSW5pdCBDYWxsYmFjayAqLworICAgICAgICBodGltLT5PQ19Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfVElNX09DX01zcEluaXQ7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fT0NfTVNQREVJTklUX0NCX0lEOgorICAgICAgICAvKiBMZWdhY3kgd2VhayBPQyBNc3AgRGVJbml0IENhbGxiYWNrICovCisgICAgICAgIGh0aW0tPk9DX01zcERlSW5pdENhbGxiYWNrID0gSEFMX1RJTV9PQ19Nc3BEZUluaXQ7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fUFdNX01TUElOSVRfQ0JfSUQ6CisgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFBXTSBNc3AgSW5pdCBDYWxsYmFjayAqLworICAgICAgICBodGltLT5QV01fTXNwSW5pdENhbGxiYWNrID0gSEFMX1RJTV9QV01fTXNwSW5pdDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9QV01fTVNQREVJTklUX0NCX0lEOgorICAgICAgICAvKiBMZWdhY3kgd2VhayBQV00gTXNwIERlSW5pdCBDYWxsYmFjayAqLworICAgICAgICBodGltLT5QV01fTXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfVElNX1BXTV9Nc3BEZUluaXQ7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fT05FX1BVTFNFX01TUElOSVRfQ0JfSUQ6CisgICAgICAgIC8qIExlZ2FjeSB3ZWFrIE9uZSBQdWxzZSBNc3AgSW5pdCBDYWxsYmFjayAqLworICAgICAgICBodGltLT5PbmVQdWxzZV9Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfVElNX09uZVB1bHNlX01zcEluaXQ7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fT05FX1BVTFNFX01TUERFSU5JVF9DQl9JRDoKKyAgICAgICAgLyogTGVnYWN5IHdlYWsgT25lIFB1bHNlIE1zcCBEZUluaXQgQ2FsbGJhY2sgKi8KKyAgICAgICAgaHRpbS0+T25lUHVsc2VfTXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfVElNX09uZVB1bHNlX01zcERlSW5pdDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9FTkNPREVSX01TUElOSVRfQ0JfSUQ6CisgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEVuY29kZXIgTXNwIEluaXQgQ2FsbGJhY2sgKi8KKyAgICAgICAgaHRpbS0+RW5jb2Rlcl9Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfVElNX0VuY29kZXJfTXNwSW5pdDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9FTkNPREVSX01TUERFSU5JVF9DQl9JRDoKKyAgICAgICAgLyogTGVnYWN5IHdlYWsgRW5jb2RlciBNc3AgRGVJbml0IENhbGxiYWNrICovCisgICAgICAgIGh0aW0tPkVuY29kZXJfTXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfVElNX0VuY29kZXJfTXNwRGVJbml0OworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX0hBTExfU0VOU09SX01TUElOSVRfQ0JfSUQ6CisgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEhhbGwgU2Vuc29yIE1zcCBJbml0IENhbGxiYWNrICovCisgICAgICAgIGh0aW0tPkhhbGxTZW5zb3JfTXNwSW5pdENhbGxiYWNrID0gSEFMX1RJTUV4X0hhbGxTZW5zb3JfTXNwSW5pdDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9IQUxMX1NFTlNPUl9NU1BERUlOSVRfQ0JfSUQ6CisgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEhhbGwgU2Vuc29yIE1zcCBEZUluaXQgQ2FsbGJhY2sgKi8KKyAgICAgICAgaHRpbS0+SGFsbFNlbnNvcl9Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9USU1FeF9IYWxsU2Vuc29yX01zcERlSW5pdDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9QRVJJT0RfRUxBUFNFRF9DQl9JRDoKKyAgICAgICAgLyogTGVnYWN5IHdlYWsgUGVyaW9kIEVsYXBzZWQgQ2FsbGJhY2sgKi8KKyAgICAgICAgaHRpbS0+UGVyaW9kRWxhcHNlZENhbGxiYWNrID0gSEFMX1RJTV9QZXJpb2RFbGFwc2VkQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fUEVSSU9EX0VMQVBTRURfSEFMRl9DQl9JRDoKKyAgICAgICAgLyogTGVnYWN5IHdlYWsgUGVyaW9kIEVsYXBzZWQgaGFsZiBjb21wbGV0ZSBDYWxsYmFjayAqLworICAgICAgICBodGltLT5QZXJpb2RFbGFwc2VkSGFsZkNwbHRDYWxsYmFjayA9CisgICAgICAgICAgICBIQUxfVElNX1BlcmlvZEVsYXBzZWRIYWxmQ3BsdENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX1RSSUdHRVJfQ0JfSUQ6CisgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFRyaWdnZXIgQ2FsbGJhY2sgKi8KKyAgICAgICAgaHRpbS0+VHJpZ2dlckNhbGxiYWNrID0gSEFMX1RJTV9UcmlnZ2VyQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fVFJJR0dFUl9IQUxGX0NCX0lEOgorICAgICAgICAvKiBMZWdhY3kgd2VhayBUcmlnZ2VyIGhhbGYgY29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICAgICAgaHRpbS0+VHJpZ2dlckhhbGZDcGx0Q2FsbGJhY2sgPSBIQUxfVElNX1RyaWdnZXJIYWxmQ3BsdENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX0lDX0NBUFRVUkVfQ0JfSUQ6CisgICAgICAgIC8qIExlZ2FjeSB3ZWFrIElDIENhcHR1cmUgQ2FsbGJhY2sgKi8KKyAgICAgICAgaHRpbS0+SUNfQ2FwdHVyZUNhbGxiYWNrID0gSEFMX1RJTV9JQ19DYXB0dXJlQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fSUNfQ0FQVFVSRV9IQUxGX0NCX0lEOgorICAgICAgICAvKiBMZWdhY3kgd2VhayBJQyBDYXB0dXJlIGhhbGYgY29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICAgICAgaHRpbS0+SUNfQ2FwdHVyZUhhbGZDcGx0Q2FsbGJhY2sgPSBIQUxfVElNX0lDX0NhcHR1cmVIYWxmQ3BsdENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX09DX0RFTEFZX0VMQVBTRURfQ0JfSUQ6CisgICAgICAgIC8qIExlZ2FjeSB3ZWFrIE9DIERlbGF5IEVsYXBzZWQgQ2FsbGJhY2sgKi8KKyAgICAgICAgaHRpbS0+T0NfRGVsYXlFbGFwc2VkQ2FsbGJhY2sgPSBIQUxfVElNX09DX0RlbGF5RWxhcHNlZENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX1BXTV9QVUxTRV9GSU5JU0hFRF9DQl9JRDoKKyAgICAgICAgLyogTGVnYWN5IHdlYWsgUFdNIFB1bHNlIEZpbmlzaGVkIENhbGxiYWNrICovCisgICAgICAgIGh0aW0tPlBXTV9QdWxzZUZpbmlzaGVkQ2FsbGJhY2sgPSBIQUxfVElNX1BXTV9QdWxzZUZpbmlzaGVkQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fUFdNX1BVTFNFX0ZJTklTSEVEX0hBTEZfQ0JfSUQ6CisgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFBXTSBQdWxzZSBGaW5pc2hlZCBoYWxmIGNvbXBsZXRlIENhbGxiYWNrICovCisgICAgICAgIGh0aW0tPlBXTV9QdWxzZUZpbmlzaGVkSGFsZkNwbHRDYWxsYmFjayA9CisgICAgICAgICAgICBIQUxfVElNX1BXTV9QdWxzZUZpbmlzaGVkSGFsZkNwbHRDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9FUlJPUl9DQl9JRDoKKyAgICAgICAgLyogTGVnYWN5IHdlYWsgRXJyb3IgQ2FsbGJhY2sgKi8KKyAgICAgICAgaHRpbS0+RXJyb3JDYWxsYmFjayA9IEhBTF9USU1fRXJyb3JDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9DT01NVVRBVElPTl9DQl9JRDoKKyAgICAgICAgLyogTGVnYWN5IHdlYWsgQ29tbXV0YXRpb24gQ2FsbGJhY2sgKi8KKyAgICAgICAgaHRpbS0+Q29tbXV0YXRpb25DYWxsYmFjayA9IEhBTF9USU1FeF9Db21tdXRDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9DT01NVVRBVElPTl9IQUxGX0NCX0lEOgorICAgICAgICAvKiBMZWdhY3kgd2VhayBDb21tdXRhdGlvbiBoYWxmIGNvbXBsZXRlIENhbGxiYWNrICovCisgICAgICAgIGh0aW0tPkNvbW11dGF0aW9uSGFsZkNwbHRDYWxsYmFjayA9IEhBTF9USU1FeF9Db21tdXRIYWxmQ3BsdENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX0JSRUFLX0NCX0lEOgorICAgICAgICAvKiBMZWdhY3kgd2VhayBCcmVhayBDYWxsYmFjayAqLworICAgICAgICBodGltLT5CcmVha0NhbGxiYWNrID0gSEFMX1RJTUV4X0JyZWFrQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fQlJFQUsyX0NCX0lEOgorICAgICAgICAvKiBMZWdhY3kgd2VhayBCcmVhazIgQ2FsbGJhY2sgKi8KKyAgICAgICAgaHRpbS0+QnJlYWsyQ2FsbGJhY2sgPSBIQUxfVElNRXhfQnJlYWsyQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fRU5DT0RFUl9JTkRFWF9DQl9JRDoKKyAgICAgICAgLyogTGVnYWN5IHdlYWsgRW5jb2RlciBJbmRleCBDYWxsYmFjayAqLworICAgICAgICBodGltLT5FbmNvZGVySW5kZXhDYWxsYmFjayA9IEhBTF9USU1FeF9FbmNvZGVySW5kZXhDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9ESVJFQ1RJT05fQ0hBTkdFX0NCX0lEOgorICAgICAgICAvKiBMZWdhY3kgd2VhayBEaXJlY3Rpb24gQ2hhbmdlIENhbGxiYWNrICovCisgICAgICAgIGh0aW0tPkRpcmVjdGlvbkNoYW5nZUNhbGxiYWNrID0gSEFMX1RJTUV4X0RpcmVjdGlvbkNoYW5nZUNhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX0lOREVYX0VSUk9SX0NCX0lEOgorICAgICAgICAvKiBMZWdhY3kgd2VhayBJbmRleCBFcnJvciBDYWxsYmFjayAqLworICAgICAgICBodGltLT5JbmRleEVycm9yQ2FsbGJhY2sgPSBIQUxfVElNRXhfSW5kZXhFcnJvckNhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX1RSQU5TSVRJT05fRVJST1JfQ0JfSUQ6CisgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFRyYW5zaXRpb24gRXJyb3IgQ2FsbGJhY2sgKi8KKyAgICAgICAgaHRpbS0+VHJhbnNpdGlvbkVycm9yQ2FsbGJhY2sgPSBIQUxfVElNRXhfVHJhbnNpdGlvbkVycm9yQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9IGVsc2UgaWYgKGh0aW0tPlN0YXRlID09IEhBTF9USU1fU1RBVEVfUkVTRVQpIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpIHsKKyAgICAgIGNhc2UgSEFMX1RJTV9CQVNFX01TUElOSVRfQ0JfSUQ6CisgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEJhc2UgTXNwSW5pdCBDYWxsYmFjayAqLworICAgICAgICBodGltLT5CYXNlX01zcEluaXRDYWxsYmFjayA9IEhBTF9USU1fQmFzZV9Nc3BJbml0OworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX0JBU0VfTVNQREVJTklUX0NCX0lEOgorICAgICAgICAvKiBMZWdhY3kgd2VhayBCYXNlIE1zcCBEZUluaXQgQ2FsbGJhY2sgKi8KKyAgICAgICAgaHRpbS0+QmFzZV9Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9USU1fQmFzZV9Nc3BEZUluaXQ7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fSUNfTVNQSU5JVF9DQl9JRDoKKyAgICAgICAgLyogTGVnYWN5IHdlYWsgSUMgTXNwIEluaXQgQ2FsbGJhY2sgKi8KKyAgICAgICAgaHRpbS0+SUNfTXNwSW5pdENhbGxiYWNrID0gSEFMX1RJTV9JQ19Nc3BJbml0OworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX0lDX01TUERFSU5JVF9DQl9JRDoKKyAgICAgICAgLyogTGVnYWN5IHdlYWsgSUMgTXNwIERlSW5pdCBDYWxsYmFjayAqLworICAgICAgICBodGltLT5JQ19Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9USU1fSUNfTXNwRGVJbml0OworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX09DX01TUElOSVRfQ0JfSUQ6CisgICAgICAgIC8qIExlZ2FjeSB3ZWFrIE9DIE1zcCBJbml0IENhbGxiYWNrICovCisgICAgICAgIGh0aW0tPk9DX01zcEluaXRDYWxsYmFjayA9IEhBTF9USU1fT0NfTXNwSW5pdDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9PQ19NU1BERUlOSVRfQ0JfSUQ6CisgICAgICAgIC8qIExlZ2FjeSB3ZWFrIE9DIE1zcCBEZUluaXQgQ2FsbGJhY2sgKi8KKyAgICAgICAgaHRpbS0+T0NfTXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfVElNX09DX01zcERlSW5pdDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9QV01fTVNQSU5JVF9DQl9JRDoKKyAgICAgICAgLyogTGVnYWN5IHdlYWsgUFdNIE1zcCBJbml0IENhbGxiYWNrICovCisgICAgICAgIGh0aW0tPlBXTV9Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfVElNX1BXTV9Nc3BJbml0OworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX1BXTV9NU1BERUlOSVRfQ0JfSUQ6CisgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFBXTSBNc3AgRGVJbml0IENhbGxiYWNrICovCisgICAgICAgIGh0aW0tPlBXTV9Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9USU1fUFdNX01zcERlSW5pdDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9PTkVfUFVMU0VfTVNQSU5JVF9DQl9JRDoKKyAgICAgICAgLyogTGVnYWN5IHdlYWsgT25lIFB1bHNlIE1zcCBJbml0IENhbGxiYWNrICovCisgICAgICAgIGh0aW0tPk9uZVB1bHNlX01zcEluaXRDYWxsYmFjayA9IEhBTF9USU1fT25lUHVsc2VfTXNwSW5pdDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9PTkVfUFVMU0VfTVNQREVJTklUX0NCX0lEOgorICAgICAgICAvKiBMZWdhY3kgd2VhayBPbmUgUHVsc2UgTXNwIERlSW5pdCBDYWxsYmFjayAqLworICAgICAgICBodGltLT5PbmVQdWxzZV9Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9USU1fT25lUHVsc2VfTXNwRGVJbml0OworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX0VOQ09ERVJfTVNQSU5JVF9DQl9JRDoKKyAgICAgICAgLyogTGVnYWN5IHdlYWsgRW5jb2RlciBNc3AgSW5pdCBDYWxsYmFjayAqLworICAgICAgICBodGltLT5FbmNvZGVyX01zcEluaXRDYWxsYmFjayA9IEhBTF9USU1fRW5jb2Rlcl9Nc3BJbml0OworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX0VOQ09ERVJfTVNQREVJTklUX0NCX0lEOgorICAgICAgICAvKiBMZWdhY3kgd2VhayBFbmNvZGVyIE1zcCBEZUluaXQgQ2FsbGJhY2sgKi8KKyAgICAgICAgaHRpbS0+RW5jb2Rlcl9Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9USU1fRW5jb2Rlcl9Nc3BEZUluaXQ7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fSEFMTF9TRU5TT1JfTVNQSU5JVF9DQl9JRDoKKyAgICAgICAgLyogTGVnYWN5IHdlYWsgSGFsbCBTZW5zb3IgTXNwIEluaXQgQ2FsbGJhY2sgKi8KKyAgICAgICAgaHRpbS0+SGFsbFNlbnNvcl9Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfVElNRXhfSGFsbFNlbnNvcl9Nc3BJbml0OworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX0hBTExfU0VOU09SX01TUERFSU5JVF9DQl9JRDoKKyAgICAgICAgLyogTGVnYWN5IHdlYWsgSGFsbCBTZW5zb3IgTXNwIERlSW5pdCBDYWxsYmFjayAqLworICAgICAgICBodGltLT5IYWxsU2Vuc29yX01zcERlSW5pdENhbGxiYWNrID0gSEFMX1RJTUV4X0hhbGxTZW5zb3JfTXNwRGVJbml0OworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEwIFRJTSBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucworICAqICBAYnJpZWYgICBUSU0gUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwZXJtaXRzIHRvIGdldCBpbiBydW4tdGltZSB0aGUgc3RhdHVzIG9mIHRoZSBwZXJpcGhlcmFsCisgICAgYW5kIHRoZSBkYXRhIGZsb3cuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICogQGJyaWVmICBSZXR1cm4gdGhlIFRJTSBCYXNlIGhhbmRsZSBzdGF0ZS4KKyAqIEBwYXJhbSAgaHRpbSBUSU0gQmFzZSBoYW5kbGUKKyAqIEByZXR2YWwgSEFMIHN0YXRlCisgKi8KK0hBTF9USU1fU3RhdGVUeXBlRGVmIEhBTF9USU1fQmFzZV9HZXRTdGF0ZShjb25zdCBUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkgeworICByZXR1cm4gaHRpbS0+U3RhdGU7Cit9CisKKy8qKgorICogQGJyaWVmICBSZXR1cm4gdGhlIFRJTSBPQyBoYW5kbGUgc3RhdGUuCisgKiBAcGFyYW0gIGh0aW0gVElNIE91dHB1dCBDb21wYXJlIGhhbmRsZQorICogQHJldHZhbCBIQUwgc3RhdGUKKyAqLworSEFMX1RJTV9TdGF0ZVR5cGVEZWYgSEFMX1RJTV9PQ19HZXRTdGF0ZShjb25zdCBUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkgeworICByZXR1cm4gaHRpbS0+U3RhdGU7Cit9CisKKy8qKgorICogQGJyaWVmICBSZXR1cm4gdGhlIFRJTSBQV00gaGFuZGxlIHN0YXRlLgorICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAqIEByZXR2YWwgSEFMIHN0YXRlCisgKi8KK0hBTF9USU1fU3RhdGVUeXBlRGVmIEhBTF9USU1fUFdNX0dldFN0YXRlKGNvbnN0IFRJTV9IYW5kbGVUeXBlRGVmICpodGltKSB7CisgIHJldHVybiBodGltLT5TdGF0ZTsKK30KKworLyoqCisgKiBAYnJpZWYgIFJldHVybiB0aGUgVElNIElucHV0IENhcHR1cmUgaGFuZGxlIHN0YXRlLgorICogQHBhcmFtICBodGltIFRJTSBJQyBoYW5kbGUKKyAqIEByZXR2YWwgSEFMIHN0YXRlCisgKi8KK0hBTF9USU1fU3RhdGVUeXBlRGVmIEhBTF9USU1fSUNfR2V0U3RhdGUoY29uc3QgVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pIHsKKyAgcmV0dXJuIGh0aW0tPlN0YXRlOworfQorCisvKioKKyAqIEBicmllZiAgUmV0dXJuIHRoZSBUSU0gT25lIFB1bHNlIE1vZGUgaGFuZGxlIHN0YXRlLgorICogQHBhcmFtICBodGltIFRJTSBPUE0gaGFuZGxlCisgKiBAcmV0dmFsIEhBTCBzdGF0ZQorICovCitIQUxfVElNX1N0YXRlVHlwZURlZiBIQUxfVElNX09uZVB1bHNlX0dldFN0YXRlKGNvbnN0IFRJTV9IYW5kbGVUeXBlRGVmICpodGltKSB7CisgIHJldHVybiBodGltLT5TdGF0ZTsKK30KKworLyoqCisgKiBAYnJpZWYgIFJldHVybiB0aGUgVElNIEVuY29kZXIgTW9kZSBoYW5kbGUgc3RhdGUuCisgKiBAcGFyYW0gIGh0aW0gVElNIEVuY29kZXIgSW50ZXJmYWNlIGhhbmRsZQorICogQHJldHZhbCBIQUwgc3RhdGUKKyAqLworSEFMX1RJTV9TdGF0ZVR5cGVEZWYgSEFMX1RJTV9FbmNvZGVyX0dldFN0YXRlKGNvbnN0IFRJTV9IYW5kbGVUeXBlRGVmICpodGltKSB7CisgIHJldHVybiBodGltLT5TdGF0ZTsKK30KKworLyoqCisgKiBAYnJpZWYgIFJldHVybiB0aGUgVElNIEVuY29kZXIgTW9kZSBoYW5kbGUgc3RhdGUuCisgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICogQHJldHZhbCBBY3RpdmUgY2hhbm5lbAorICovCitIQUxfVElNX0FjdGl2ZUNoYW5uZWwgSEFMX1RJTV9HZXRBY3RpdmVDaGFubmVsKGNvbnN0IFRJTV9IYW5kbGVUeXBlRGVmICpodGltKSB7CisgIHJldHVybiBodGltLT5DaGFubmVsOworfQorCisvKioKKyAqIEBicmllZiAgUmV0dXJuIGFjdHVhbCBzdGF0ZSBvZiB0aGUgVElNIGNoYW5uZWwuCisgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVsCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMworICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF81OiBUSU0gQ2hhbm5lbCA1CisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNjogVElNIENoYW5uZWwgNgorICogQHJldHZhbCBUSU0gQ2hhbm5lbCBzdGF0ZQorICovCitIQUxfVElNX0NoYW5uZWxTdGF0ZVR5cGVEZWYgSEFMX1RJTV9HZXRDaGFubmVsU3RhdGUoCisgICAgY29uc3QgVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpIHsKKyAgSEFMX1RJTV9DaGFubmVsU3RhdGVUeXBlRGVmIGNoYW5uZWxfc3RhdGU7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsKKworICBjaGFubmVsX3N0YXRlID0gVElNX0NIQU5ORUxfU1RBVEVfR0VUKGh0aW0sIENoYW5uZWwpOworCisgIHJldHVybiBjaGFubmVsX3N0YXRlOworfQorCisvKioKKyAqIEBicmllZiAgUmV0dXJuIGFjdHVhbCBzdGF0ZSBvZiBhIERNQSBidXJzdCBvcGVyYXRpb24uCisgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICogQHJldHZhbCBETUEgYnVyc3Qgc3RhdGUKKyAqLworSEFMX1RJTV9ETUFCdXJzdFN0YXRlVHlwZURlZiBIQUxfVElNX0RNQUJ1cnN0U3RhdGUoCisgICAgY29uc3QgVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pIHsKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9ETUFCVVJTVF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgIHJldHVybiBodGltLT5ETUFCdXJzdFN0YXRlOworfQorCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX1ByaXZhdGVfRnVuY3Rpb25zIFRJTSBQcml2YXRlIEZ1bmN0aW9ucworICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiAgVElNIERNQSBlcnJvciBjYWxsYmFjaworICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gRE1BIGhhbmRsZS4KKyAqIEByZXR2YWwgTm9uZQorICovCit2b2lkIFRJTV9ETUFFcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkgeworICBUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSA9CisgICAgICAoVElNX0hhbmRsZVR5cGVEZWYgKikoKERNQV9IYW5kbGVUeXBlRGVmICopaGRtYSktPlBhcmVudDsKKworICBpZiAoaGRtYSA9PSBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXSkgeworICAgIGh0aW0tPkNoYW5uZWwgPSBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzE7CisgICAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7CisgIH0gZWxzZSBpZiAoaGRtYSA9PSBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXSkgeworICAgIGh0aW0tPkNoYW5uZWwgPSBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzI7CisgICAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7CisgIH0gZWxzZSBpZiAoaGRtYSA9PSBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXSkgeworICAgIGh0aW0tPkNoYW5uZWwgPSBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzM7CisgICAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzMsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7CisgIH0gZWxzZSBpZiAoaGRtYSA9PSBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XSkgeworICAgIGh0aW0tPkNoYW5uZWwgPSBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzQ7CisgICAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzQsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7CisgIH0gZWxzZSB7CisgICAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworICB9CisKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIGh0aW0tPkVycm9yQ2FsbGJhY2soaHRpbSk7CisjZWxzZQorICBIQUxfVElNX0Vycm9yQ2FsbGJhY2soaHRpbSk7CisjZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKyAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfQ0xFQVJFRDsKK30KKworLyoqCisgKiBAYnJpZWYgIFRJTSBETUEgRGVsYXkgUHVsc2UgY29tcGxldGUgY2FsbGJhY2suCisgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBETUEgaGFuZGxlLgorICogQHJldHZhbCBOb25lCisgKi8KK3N0YXRpYyB2b2lkIFRJTV9ETUFEZWxheVB1bHNlQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkgeworICBUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSA9CisgICAgICAoVElNX0hhbmRsZVR5cGVEZWYgKikoKERNQV9IYW5kbGVUeXBlRGVmICopaGRtYSktPlBhcmVudDsKKworICBpZiAoaGRtYSA9PSBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXSkgeworICAgIGh0aW0tPkNoYW5uZWwgPSBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzE7CisKKyAgICBpZiAoaGRtYS0+SW5pdC5Nb2RlID09IERNQV9OT1JNQUwpIHsKKyAgICAgIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8xLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOworICAgIH0KKyAgfSBlbHNlIGlmIChoZG1hID09IGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdKSB7CisgICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfMjsKKworICAgIGlmIChoZG1hLT5Jbml0Lk1vZGUgPT0gRE1BX05PUk1BTCkgeworICAgICAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7CisgICAgfQorICB9IGVsc2UgaWYgKGhkbWEgPT0gaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10pIHsKKyAgICBodGltLT5DaGFubmVsID0gSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF8zOworCisgICAgaWYgKGhkbWEtPkluaXQuTW9kZSA9PSBETUFfTk9STUFMKSB7CisgICAgICBUSU1fQ0hBTk5FTF9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMywgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoaGRtYSA9PSBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XSkgeworICAgIGh0aW0tPkNoYW5uZWwgPSBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzQ7CisKKyAgICBpZiAoaGRtYS0+SW5pdC5Nb2RlID09IERNQV9OT1JNQUwpIHsKKyAgICAgIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF80LCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiBub3RoaW5nIHRvIGRvICovCisgIH0KKworI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgaHRpbS0+UFdNX1B1bHNlRmluaXNoZWRDYWxsYmFjayhodGltKTsKKyNlbHNlCisgIEhBTF9USU1fUFdNX1B1bHNlRmluaXNoZWRDYWxsYmFjayhodGltKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworICBodGltLT5DaGFubmVsID0gSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF9DTEVBUkVEOworfQorCisvKioKKyAqIEBicmllZiAgVElNIERNQSBEZWxheSBQdWxzZSBoYWxmIGNvbXBsZXRlIGNhbGxiYWNrLgorICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gRE1BIGhhbmRsZS4KKyAqIEByZXR2YWwgTm9uZQorICovCit2b2lkIFRJTV9ETUFEZWxheVB1bHNlSGFsZkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpIHsKKyAgVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0gPQorICAgICAgKFRJTV9IYW5kbGVUeXBlRGVmICopKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQ7CisKKyAgaWYgKGhkbWEgPT0gaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0pIHsKKyAgICBodGltLT5DaGFubmVsID0gSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF8xOworICB9IGVsc2UgaWYgKGhkbWEgPT0gaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0pIHsKKyAgICBodGltLT5DaGFubmVsID0gSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF8yOworICB9IGVsc2UgaWYgKGhkbWEgPT0gaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10pIHsKKyAgICBodGltLT5DaGFubmVsID0gSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF8zOworICB9IGVsc2UgaWYgKGhkbWEgPT0gaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDNF0pIHsKKyAgICBodGltLT5DaGFubmVsID0gSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF80OworICB9IGVsc2UgeworICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgfQorCisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBodGltLT5QV01fUHVsc2VGaW5pc2hlZEhhbGZDcGx0Q2FsbGJhY2soaHRpbSk7CisjZWxzZQorICBIQUxfVElNX1BXTV9QdWxzZUZpbmlzaGVkSGFsZkNwbHRDYWxsYmFjayhodGltKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworICBodGltLT5DaGFubmVsID0gSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF9DTEVBUkVEOworfQorCisvKioKKyAqIEBicmllZiAgVElNIERNQSBDYXB0dXJlIGNvbXBsZXRlIGNhbGxiYWNrLgorICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gRE1BIGhhbmRsZS4KKyAqIEByZXR2YWwgTm9uZQorICovCit2b2lkIFRJTV9ETUFDYXB0dXJlQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkgeworICBUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSA9CisgICAgICAoVElNX0hhbmRsZVR5cGVEZWYgKikoKERNQV9IYW5kbGVUeXBlRGVmICopaGRtYSktPlBhcmVudDsKKworICBpZiAoaGRtYSA9PSBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXSkgeworICAgIGh0aW0tPkNoYW5uZWwgPSBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzE7CisKKyAgICBpZiAoaGRtYS0+SW5pdC5Nb2RlID09IERNQV9OT1JNQUwpIHsKKyAgICAgIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8xLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOworICAgICAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMSwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoaGRtYSA9PSBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXSkgeworICAgIGh0aW0tPkNoYW5uZWwgPSBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzI7CisKKyAgICBpZiAoaGRtYS0+SW5pdC5Nb2RlID09IERNQV9OT1JNQUwpIHsKKyAgICAgIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8yLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOworICAgICAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMiwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoaGRtYSA9PSBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXSkgeworICAgIGh0aW0tPkNoYW5uZWwgPSBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzM7CisKKyAgICBpZiAoaGRtYS0+SW5pdC5Nb2RlID09IERNQV9OT1JNQUwpIHsKKyAgICAgIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8zLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOworICAgICAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMywgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoaGRtYSA9PSBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XSkgeworICAgIGh0aW0tPkNoYW5uZWwgPSBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzQ7CisKKyAgICBpZiAoaGRtYS0+SW5pdC5Nb2RlID09IERNQV9OT1JNQUwpIHsKKyAgICAgIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF80LCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOworICAgICAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfNCwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyogbm90aGluZyB0byBkbyAqLworICB9CisKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIGh0aW0tPklDX0NhcHR1cmVDYWxsYmFjayhodGltKTsKKyNlbHNlCisgIEhBTF9USU1fSUNfQ2FwdHVyZUNhbGxiYWNrKGh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisgIGh0aW0tPkNoYW5uZWwgPSBIQUxfVElNX0FDVElWRV9DSEFOTkVMX0NMRUFSRUQ7Cit9CisKKy8qKgorICogQGJyaWVmICBUSU0gRE1BIENhcHR1cmUgaGFsZiBjb21wbGV0ZSBjYWxsYmFjay4KKyAqIEBwYXJhbSAgaGRtYSBwb2ludGVyIHRvIERNQSBoYW5kbGUuCisgKiBAcmV0dmFsIE5vbmUKKyAqLwordm9pZCBUSU1fRE1BQ2FwdHVyZUhhbGZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKSB7CisgIFRJTV9IYW5kbGVUeXBlRGVmICpodGltID0KKyAgICAgIChUSU1fSGFuZGxlVHlwZURlZiAqKSgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50OworCisgIGlmIChoZG1hID09IGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdKSB7CisgICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfMTsKKyAgfSBlbHNlIGlmIChoZG1hID09IGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdKSB7CisgICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfMjsKKyAgfSBlbHNlIGlmIChoZG1hID09IGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdKSB7CisgICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfMzsKKyAgfSBlbHNlIGlmIChoZG1hID09IGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdKSB7CisgICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfNDsKKyAgfSBlbHNlIHsKKyAgICAvKiBub3RoaW5nIHRvIGRvICovCisgIH0KKworI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgaHRpbS0+SUNfQ2FwdHVyZUhhbGZDcGx0Q2FsbGJhY2soaHRpbSk7CisjZWxzZQorICBIQUxfVElNX0lDX0NhcHR1cmVIYWxmQ3BsdENhbGxiYWNrKGh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisgIGh0aW0tPkNoYW5uZWwgPSBIQUxfVElNX0FDVElWRV9DSEFOTkVMX0NMRUFSRUQ7Cit9CisKKy8qKgorICogQGJyaWVmICBUSU0gRE1BIFBlcmlvZCBFbGFwc2UgY29tcGxldGUgY2FsbGJhY2suCisgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBETUEgaGFuZGxlLgorICogQHJldHZhbCBOb25lCisgKi8KK3N0YXRpYyB2b2lkIFRJTV9ETUFQZXJpb2RFbGFwc2VkQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkgeworICBUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSA9CisgICAgICAoVElNX0hhbmRsZVR5cGVEZWYgKikoKERNQV9IYW5kbGVUeXBlRGVmICopaGRtYSktPlBhcmVudDsKKworICBpZiAoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX1VQREFURV0tPkluaXQuTW9kZSA9PSBETUFfTk9STUFMKSB7CisgICAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworICB9CisKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIGh0aW0tPlBlcmlvZEVsYXBzZWRDYWxsYmFjayhodGltKTsKKyNlbHNlCisgIEhBTF9USU1fUGVyaW9kRWxhcHNlZENhbGxiYWNrKGh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfQorCisvKioKKyAqIEBicmllZiAgVElNIERNQSBQZXJpb2QgRWxhcHNlIGhhbGYgY29tcGxldGUgY2FsbGJhY2suCisgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBETUEgaGFuZGxlLgorICogQHJldHZhbCBOb25lCisgKi8KK3N0YXRpYyB2b2lkIFRJTV9ETUFQZXJpb2RFbGFwc2VkSGFsZkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpIHsKKyAgVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0gPQorICAgICAgKFRJTV9IYW5kbGVUeXBlRGVmICopKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQ7CisKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIGh0aW0tPlBlcmlvZEVsYXBzZWRIYWxmQ3BsdENhbGxiYWNrKGh0aW0pOworI2Vsc2UKKyAgSEFMX1RJTV9QZXJpb2RFbGFwc2VkSGFsZkNwbHRDYWxsYmFjayhodGltKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30KKworLyoqCisgKiBAYnJpZWYgIFRJTSBETUEgVHJpZ2dlciBjYWxsYmFjay4KKyAqIEBwYXJhbSAgaGRtYSBwb2ludGVyIHRvIERNQSBoYW5kbGUuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworc3RhdGljIHZvaWQgVElNX0RNQVRyaWdnZXJDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKSB7CisgIFRJTV9IYW5kbGVUeXBlRGVmICpodGltID0KKyAgICAgIChUSU1fSGFuZGxlVHlwZURlZiAqKSgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50OworCisgIGlmIChodGltLT5oZG1hW1RJTV9ETUFfSURfVFJJR0dFUl0tPkluaXQuTW9kZSA9PSBETUFfTk9STUFMKSB7CisgICAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworICB9CisKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIGh0aW0tPlRyaWdnZXJDYWxsYmFjayhodGltKTsKKyNlbHNlCisgIEhBTF9USU1fVHJpZ2dlckNhbGxiYWNrKGh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfQorCisvKioKKyAqIEBicmllZiAgVElNIERNQSBUcmlnZ2VyIGhhbGYgY29tcGxldGUgY2FsbGJhY2suCisgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBETUEgaGFuZGxlLgorICogQHJldHZhbCBOb25lCisgKi8KK3N0YXRpYyB2b2lkIFRJTV9ETUFUcmlnZ2VySGFsZkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpIHsKKyAgVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0gPQorICAgICAgKFRJTV9IYW5kbGVUeXBlRGVmICopKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQ7CisKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIGh0aW0tPlRyaWdnZXJIYWxmQ3BsdENhbGxiYWNrKGh0aW0pOworI2Vsc2UKKyAgSEFMX1RJTV9UcmlnZ2VySGFsZkNwbHRDYWxsYmFjayhodGltKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30KKworLyoqCisgKiBAYnJpZWYgIFRpbWUgQmFzZSBjb25maWd1cmF0aW9uCisgKiBAcGFyYW0gIFRJTXggVElNIHBlcmlwaGVyYWwKKyAqIEBwYXJhbSAgU3RydWN0dXJlIFRJTSBCYXNlIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlCisgKiBAcmV0dmFsIE5vbmUKKyAqLwordm9pZCBUSU1fQmFzZV9TZXRDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUSU1fQmFzZV9Jbml0VHlwZURlZiAqU3RydWN0dXJlKSB7CisgIHVpbnQzMl90IHRtcGNyMTsKKyAgdG1wY3IxID0gVElNeC0+Q1IxOworCisgIC8qIFNldCBUSU0gVGltZSBCYXNlIFVuaXQgcGFyYW1ldGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoSVNfVElNX0NPVU5URVJfTU9ERV9TRUxFQ1RfSU5TVEFOQ0UoVElNeCkpIHsKKyAgICAvKiBTZWxlY3QgdGhlIENvdW50ZXIgTW9kZSAqLworICAgIHRtcGNyMSAmPSB+KFRJTV9DUjFfRElSIHwgVElNX0NSMV9DTVMpOworICAgIHRtcGNyMSB8PSBTdHJ1Y3R1cmUtPkNvdW50ZXJNb2RlOworICB9CisKKyAgaWYgKElTX1RJTV9DTE9DS19ESVZJU0lPTl9JTlNUQU5DRShUSU14KSkgeworICAgIC8qIFNldCB0aGUgY2xvY2sgZGl2aXNpb24gKi8KKyAgICB0bXBjcjEgJj0gflRJTV9DUjFfQ0tEOworICAgIHRtcGNyMSB8PSAodWludDMyX3QpU3RydWN0dXJlLT5DbG9ja0RpdmlzaW9uOworICB9CisKKyAgLyogU2V0IHRoZSBhdXRvLXJlbG9hZCBwcmVsb2FkICovCisgIE1PRElGWV9SRUcodG1wY3IxLCBUSU1fQ1IxX0FSUEUsIFN0cnVjdHVyZS0+QXV0b1JlbG9hZFByZWxvYWQpOworCisgIFRJTXgtPkNSMSA9IHRtcGNyMTsKKworICAvKiBTZXQgdGhlIEF1dG9yZWxvYWQgdmFsdWUgKi8KKyAgVElNeC0+QVJSID0gKHVpbnQzMl90KVN0cnVjdHVyZS0+UGVyaW9kOworCisgIC8qIFNldCB0aGUgUHJlc2NhbGVyIHZhbHVlICovCisgIFRJTXgtPlBTQyA9IFN0cnVjdHVyZS0+UHJlc2NhbGVyOworCisgIGlmIChJU19USU1fUkVQRVRJVElPTl9DT1VOVEVSX0lOU1RBTkNFKFRJTXgpKSB7CisgICAgLyogU2V0IHRoZSBSZXBldGl0aW9uIENvdW50ZXIgdmFsdWUgKi8KKyAgICBUSU14LT5SQ1IgPSBTdHJ1Y3R1cmUtPlJlcGV0aXRpb25Db3VudGVyOworICB9CisKKyAgLyogR2VuZXJhdGUgYW4gdXBkYXRlIGV2ZW50IHRvIHJlbG9hZCB0aGUgUHJlc2NhbGVyCisgICAgIGFuZCB0aGUgcmVwZXRpdGlvbiBjb3VudGVyIChvbmx5IGZvciBhZHZhbmNlZCB0aW1lcikgdmFsdWUgaW1tZWRpYXRlbHkgKi8KKyAgVElNeC0+RUdSID0gVElNX0VHUl9VRzsKKworICAvKiBDaGVjayBpZiB0aGUgdXBkYXRlIGZsYWcgaXMgc2V0IGFmdGVyIHRoZSBVcGRhdGUgR2VuZXJhdGlvbiwgaWYgc28gY2xlYXIKKyAgICogdGhlIFVJRiBmbGFnICovCisgIGlmIChIQUxfSVNfQklUX1NFVChUSU14LT5TUiwgVElNX0ZMQUdfVVBEQVRFKSkgeworICAgIC8qIENsZWFyIHRoZSB1cGRhdGUgZmxhZyAqLworICAgIENMRUFSX0JJVChUSU14LT5TUiwgVElNX0ZMQUdfVVBEQVRFKTsKKyAgfQorfQorCisvKioKKyAqIEBicmllZiAgVGltZXIgT3V0cHV0IENvbXBhcmUgMSBjb25maWd1cmF0aW9uCisgKiBAcGFyYW0gIFRJTXggdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbAorICogQHBhcmFtICBPQ19Db25maWcgVGhlIG91dHB1dCBjb25maWd1cmF0aW9uIHN0cnVjdHVyZQorICogQHJldHZhbCBOb25lCisgKi8KK3N0YXRpYyB2b2lkIFRJTV9PQzFfU2V0Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVElNX09DX0luaXRUeXBlRGVmICpPQ19Db25maWcpIHsKKyAgdWludDMyX3QgdG1wY2Ntcng7CisgIHVpbnQzMl90IHRtcGNjZXI7CisgIHVpbnQzMl90IHRtcGNyMjsKKworICAvKiBHZXQgdGhlIFRJTXggQ0NFUiByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjY2VyID0gVElNeC0+Q0NFUjsKKworICAvKiBEaXNhYmxlIHRoZSBDaGFubmVsIDE6IFJlc2V0IHRoZSBDQzFFIEJpdCAqLworICBUSU14LT5DQ0VSICY9IH5USU1fQ0NFUl9DQzFFOworCisgIC8qIEdldCB0aGUgVElNeCBDUjIgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY3IyID0gVElNeC0+Q1IyOworCisgIC8qIEdldCB0aGUgVElNeCBDQ01SMSByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjY21yeCA9IFRJTXgtPkNDTVIxOworCisgIC8qIFJlc2V0IHRoZSBPdXRwdXQgQ29tcGFyZSBNb2RlIEJpdHMgKi8KKyAgdG1wY2NtcnggJj0gflRJTV9DQ01SMV9PQzFNOworICB0bXBjY21yeCAmPSB+VElNX0NDTVIxX0NDMVM7CisgIC8qIFNlbGVjdCB0aGUgT3V0cHV0IENvbXBhcmUgTW9kZSAqLworICB0bXBjY21yeCB8PSBPQ19Db25maWctPk9DTW9kZTsKKworICAvKiBSZXNldCB0aGUgT3V0cHV0IFBvbGFyaXR5IGxldmVsICovCisgIHRtcGNjZXIgJj0gflRJTV9DQ0VSX0NDMVA7CisgIC8qIFNldCB0aGUgT3V0cHV0IENvbXBhcmUgUG9sYXJpdHkgKi8KKyAgdG1wY2NlciB8PSBPQ19Db25maWctPk9DUG9sYXJpdHk7CisKKyAgaWYgKElTX1RJTV9DQ1hOX0lOU1RBTkNFKFRJTXgsIFRJTV9DSEFOTkVMXzEpKSB7CisgICAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19USU1fT0NOX1BPTEFSSVRZKE9DX0NvbmZpZy0+T0NOUG9sYXJpdHkpKTsKKworICAgIC8qIFJlc2V0IHRoZSBPdXRwdXQgTiBQb2xhcml0eSBsZXZlbCAqLworICAgIHRtcGNjZXIgJj0gflRJTV9DQ0VSX0NDMU5QOworICAgIC8qIFNldCB0aGUgT3V0cHV0IE4gUG9sYXJpdHkgKi8KKyAgICB0bXBjY2VyIHw9IE9DX0NvbmZpZy0+T0NOUG9sYXJpdHk7CisgICAgLyogUmVzZXQgdGhlIE91dHB1dCBOIFN0YXRlICovCisgICAgdG1wY2NlciAmPSB+VElNX0NDRVJfQ0MxTkU7CisgIH0KKworICBpZiAoSVNfVElNX0JSRUFLX0lOU1RBTkNFKFRJTXgpKSB7CisgICAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19USU1fT0NOSURMRV9TVEFURShPQ19Db25maWctPk9DTklkbGVTdGF0ZSkpOworICAgIGFzc2VydF9wYXJhbShJU19USU1fT0NJRExFX1NUQVRFKE9DX0NvbmZpZy0+T0NJZGxlU3RhdGUpKTsKKworICAgIC8qIFJlc2V0IHRoZSBPdXRwdXQgQ29tcGFyZSBhbmQgT3V0cHV0IENvbXBhcmUgTiBJRExFIFN0YXRlICovCisgICAgdG1wY3IyICY9IH5USU1fQ1IyX09JUzE7CisgICAgdG1wY3IyICY9IH5USU1fQ1IyX09JUzFOOworICAgIC8qIFNldCB0aGUgT3V0cHV0IElkbGUgc3RhdGUgKi8KKyAgICB0bXBjcjIgfD0gT0NfQ29uZmlnLT5PQ0lkbGVTdGF0ZTsKKyAgICAvKiBTZXQgdGhlIE91dHB1dCBOIElkbGUgc3RhdGUgKi8KKyAgICB0bXBjcjIgfD0gT0NfQ29uZmlnLT5PQ05JZGxlU3RhdGU7CisgIH0KKworICAvKiBXcml0ZSB0byBUSU14IENSMiAqLworICBUSU14LT5DUjIgPSB0bXBjcjI7CisKKyAgLyogV3JpdGUgdG8gVElNeCBDQ01SMSAqLworICBUSU14LT5DQ01SMSA9IHRtcGNjbXJ4OworCisgIC8qIFNldCB0aGUgQ2FwdHVyZSBDb21wYXJlIFJlZ2lzdGVyIHZhbHVlICovCisgIFRJTXgtPkNDUjEgPSBPQ19Db25maWctPlB1bHNlOworCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NFUiAqLworICBUSU14LT5DQ0VSID0gdG1wY2NlcjsKK30KKworLyoqCisgKiBAYnJpZWYgIFRpbWVyIE91dHB1dCBDb21wYXJlIDIgY29uZmlndXJhdGlvbgorICogQHBhcmFtICBUSU14IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwKKyAqIEBwYXJhbSAgT0NfQ29uZmlnIFRoZSBvdXRwdXQgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUKKyAqIEByZXR2YWwgTm9uZQorICovCit2b2lkIFRJTV9PQzJfU2V0Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCBjb25zdCBUSU1fT0NfSW5pdFR5cGVEZWYgKk9DX0NvbmZpZykgeworICB1aW50MzJfdCB0bXBjY21yeDsKKyAgdWludDMyX3QgdG1wY2NlcjsKKyAgdWludDMyX3QgdG1wY3IyOworCisgIC8qIEdldCB0aGUgVElNeCBDQ0VSIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcGNjZXIgPSBUSU14LT5DQ0VSOworCisgIC8qIERpc2FibGUgdGhlIENoYW5uZWwgMjogUmVzZXQgdGhlIENDMkUgQml0ICovCisgIFRJTXgtPkNDRVIgJj0gflRJTV9DQ0VSX0NDMkU7CisKKyAgLyogR2V0IHRoZSBUSU14IENSMiByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjcjIgPSBUSU14LT5DUjI7CisKKyAgLyogR2V0IHRoZSBUSU14IENDTVIxIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcGNjbXJ4ID0gVElNeC0+Q0NNUjE7CisKKyAgLyogUmVzZXQgdGhlIE91dHB1dCBDb21wYXJlIG1vZGUgYW5kIENhcHR1cmUvQ29tcGFyZSBzZWxlY3Rpb24gQml0cyAqLworICB0bXBjY21yeCAmPSB+VElNX0NDTVIxX09DMk07CisgIHRtcGNjbXJ4ICY9IH5USU1fQ0NNUjFfQ0MyUzsKKworICAvKiBTZWxlY3QgdGhlIE91dHB1dCBDb21wYXJlIE1vZGUgKi8KKyAgdG1wY2NtcnggfD0gKE9DX0NvbmZpZy0+T0NNb2RlIDw8IDhVKTsKKworICAvKiBSZXNldCB0aGUgT3V0cHV0IFBvbGFyaXR5IGxldmVsICovCisgIHRtcGNjZXIgJj0gflRJTV9DQ0VSX0NDMlA7CisgIC8qIFNldCB0aGUgT3V0cHV0IENvbXBhcmUgUG9sYXJpdHkgKi8KKyAgdG1wY2NlciB8PSAoT0NfQ29uZmlnLT5PQ1BvbGFyaXR5IDw8IDRVKTsKKworICBpZiAoSVNfVElNX0NDWE5fSU5TVEFOQ0UoVElNeCwgVElNX0NIQU5ORUxfMikpIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfVElNX09DTl9QT0xBUklUWShPQ19Db25maWctPk9DTlBvbGFyaXR5KSk7CisKKyAgICAvKiBSZXNldCB0aGUgT3V0cHV0IE4gUG9sYXJpdHkgbGV2ZWwgKi8KKyAgICB0bXBjY2VyICY9IH5USU1fQ0NFUl9DQzJOUDsKKyAgICAvKiBTZXQgdGhlIE91dHB1dCBOIFBvbGFyaXR5ICovCisgICAgdG1wY2NlciB8PSAoT0NfQ29uZmlnLT5PQ05Qb2xhcml0eSA8PCA0VSk7CisgICAgLyogUmVzZXQgdGhlIE91dHB1dCBOIFN0YXRlICovCisgICAgdG1wY2NlciAmPSB+VElNX0NDRVJfQ0MyTkU7CisgIH0KKworICBpZiAoSVNfVElNX0JSRUFLX0lOU1RBTkNFKFRJTXgpKSB7CisgICAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19USU1fT0NOSURMRV9TVEFURShPQ19Db25maWctPk9DTklkbGVTdGF0ZSkpOworICAgIGFzc2VydF9wYXJhbShJU19USU1fT0NJRExFX1NUQVRFKE9DX0NvbmZpZy0+T0NJZGxlU3RhdGUpKTsKKworICAgIC8qIFJlc2V0IHRoZSBPdXRwdXQgQ29tcGFyZSBhbmQgT3V0cHV0IENvbXBhcmUgTiBJRExFIFN0YXRlICovCisgICAgdG1wY3IyICY9IH5USU1fQ1IyX09JUzI7CisgICAgdG1wY3IyICY9IH5USU1fQ1IyX09JUzJOOworICAgIC8qIFNldCB0aGUgT3V0cHV0IElkbGUgc3RhdGUgKi8KKyAgICB0bXBjcjIgfD0gKE9DX0NvbmZpZy0+T0NJZGxlU3RhdGUgPDwgMlUpOworICAgIC8qIFNldCB0aGUgT3V0cHV0IE4gSWRsZSBzdGF0ZSAqLworICAgIHRtcGNyMiB8PSAoT0NfQ29uZmlnLT5PQ05JZGxlU3RhdGUgPDwgMlUpOworICB9CisKKyAgLyogV3JpdGUgdG8gVElNeCBDUjIgKi8KKyAgVElNeC0+Q1IyID0gdG1wY3IyOworCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjEgKi8KKyAgVElNeC0+Q0NNUjEgPSB0bXBjY21yeDsKKworICAvKiBTZXQgdGhlIENhcHR1cmUgQ29tcGFyZSBSZWdpc3RlciB2YWx1ZSAqLworICBUSU14LT5DQ1IyID0gT0NfQ29uZmlnLT5QdWxzZTsKKworICAvKiBXcml0ZSB0byBUSU14IENDRVIgKi8KKyAgVElNeC0+Q0NFUiA9IHRtcGNjZXI7Cit9CisKKy8qKgorICogQGJyaWVmICBUaW1lciBPdXRwdXQgQ29tcGFyZSAzIGNvbmZpZ3VyYXRpb24KKyAqIEBwYXJhbSAgVElNeCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsCisgKiBAcGFyYW0gIE9DX0NvbmZpZyBUaGUgb3V0cHV0IGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlCisgKiBAcmV0dmFsIE5vbmUKKyAqLworc3RhdGljIHZvaWQgVElNX09DM19TZXRDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUSU1fT0NfSW5pdFR5cGVEZWYgKk9DX0NvbmZpZykgeworICB1aW50MzJfdCB0bXBjY21yeDsKKyAgdWludDMyX3QgdG1wY2NlcjsKKyAgdWludDMyX3QgdG1wY3IyOworCisgIC8qIEdldCB0aGUgVElNeCBDQ0VSIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcGNjZXIgPSBUSU14LT5DQ0VSOworCisgIC8qIERpc2FibGUgdGhlIENoYW5uZWwgMzogUmVzZXQgdGhlIENDMkUgQml0ICovCisgIFRJTXgtPkNDRVIgJj0gflRJTV9DQ0VSX0NDM0U7CisKKyAgLyogR2V0IHRoZSBUSU14IENSMiByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjcjIgPSBUSU14LT5DUjI7CisKKyAgLyogR2V0IHRoZSBUSU14IENDTVIyIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcGNjbXJ4ID0gVElNeC0+Q0NNUjI7CisKKyAgLyogUmVzZXQgdGhlIE91dHB1dCBDb21wYXJlIG1vZGUgYW5kIENhcHR1cmUvQ29tcGFyZSBzZWxlY3Rpb24gQml0cyAqLworICB0bXBjY21yeCAmPSB+VElNX0NDTVIyX09DM007CisgIHRtcGNjbXJ4ICY9IH5USU1fQ0NNUjJfQ0MzUzsKKyAgLyogU2VsZWN0IHRoZSBPdXRwdXQgQ29tcGFyZSBNb2RlICovCisgIHRtcGNjbXJ4IHw9IE9DX0NvbmZpZy0+T0NNb2RlOworCisgIC8qIFJlc2V0IHRoZSBPdXRwdXQgUG9sYXJpdHkgbGV2ZWwgKi8KKyAgdG1wY2NlciAmPSB+VElNX0NDRVJfQ0MzUDsKKyAgLyogU2V0IHRoZSBPdXRwdXQgQ29tcGFyZSBQb2xhcml0eSAqLworICB0bXBjY2VyIHw9IChPQ19Db25maWctPk9DUG9sYXJpdHkgPDwgOFUpOworCisgIGlmIChJU19USU1fQ0NYTl9JTlNUQU5DRShUSU14LCBUSU1fQ0hBTk5FTF8zKSkgeworICAgIGFzc2VydF9wYXJhbShJU19USU1fT0NOX1BPTEFSSVRZKE9DX0NvbmZpZy0+T0NOUG9sYXJpdHkpKTsKKworICAgIC8qIFJlc2V0IHRoZSBPdXRwdXQgTiBQb2xhcml0eSBsZXZlbCAqLworICAgIHRtcGNjZXIgJj0gflRJTV9DQ0VSX0NDM05QOworICAgIC8qIFNldCB0aGUgT3V0cHV0IE4gUG9sYXJpdHkgKi8KKyAgICB0bXBjY2VyIHw9IChPQ19Db25maWctPk9DTlBvbGFyaXR5IDw8IDhVKTsKKyAgICAvKiBSZXNldCB0aGUgT3V0cHV0IE4gU3RhdGUgKi8KKyAgICB0bXBjY2VyICY9IH5USU1fQ0NFUl9DQzNORTsKKyAgfQorCisgIGlmIChJU19USU1fQlJFQUtfSU5TVEFOQ0UoVElNeCkpIHsKKyAgICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCisgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PQ05JRExFX1NUQVRFKE9DX0NvbmZpZy0+T0NOSWRsZVN0YXRlKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PQ0lETEVfU1RBVEUoT0NfQ29uZmlnLT5PQ0lkbGVTdGF0ZSkpOworCisgICAgLyogUmVzZXQgdGhlIE91dHB1dCBDb21wYXJlIGFuZCBPdXRwdXQgQ29tcGFyZSBOIElETEUgU3RhdGUgKi8KKyAgICB0bXBjcjIgJj0gflRJTV9DUjJfT0lTMzsKKyAgICB0bXBjcjIgJj0gflRJTV9DUjJfT0lTM047CisgICAgLyogU2V0IHRoZSBPdXRwdXQgSWRsZSBzdGF0ZSAqLworICAgIHRtcGNyMiB8PSAoT0NfQ29uZmlnLT5PQ0lkbGVTdGF0ZSA8PCA0VSk7CisgICAgLyogU2V0IHRoZSBPdXRwdXQgTiBJZGxlIHN0YXRlICovCisgICAgdG1wY3IyIHw9IChPQ19Db25maWctPk9DTklkbGVTdGF0ZSA8PCA0VSk7CisgIH0KKworICAvKiBXcml0ZSB0byBUSU14IENSMiAqLworICBUSU14LT5DUjIgPSB0bXBjcjI7CisKKyAgLyogV3JpdGUgdG8gVElNeCBDQ01SMiAqLworICBUSU14LT5DQ01SMiA9IHRtcGNjbXJ4OworCisgIC8qIFNldCB0aGUgQ2FwdHVyZSBDb21wYXJlIFJlZ2lzdGVyIHZhbHVlICovCisgIFRJTXgtPkNDUjMgPSBPQ19Db25maWctPlB1bHNlOworCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NFUiAqLworICBUSU14LT5DQ0VSID0gdG1wY2NlcjsKK30KKworLyoqCisgKiBAYnJpZWYgIFRpbWVyIE91dHB1dCBDb21wYXJlIDQgY29uZmlndXJhdGlvbgorICogQHBhcmFtICBUSU14IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwKKyAqIEBwYXJhbSAgT0NfQ29uZmlnIFRoZSBvdXRwdXQgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUKKyAqIEByZXR2YWwgTm9uZQorICovCitzdGF0aWMgdm9pZCBUSU1fT0M0X1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRJTV9PQ19Jbml0VHlwZURlZiAqT0NfQ29uZmlnKSB7CisgIHVpbnQzMl90IHRtcGNjbXJ4OworICB1aW50MzJfdCB0bXBjY2VyOworICB1aW50MzJfdCB0bXBjcjI7CisKKyAgLyogR2V0IHRoZSBUSU14IENDRVIgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY2NlciA9IFRJTXgtPkNDRVI7CisKKyAgLyogRGlzYWJsZSB0aGUgQ2hhbm5lbCA0OiBSZXNldCB0aGUgQ0M0RSBCaXQgKi8KKyAgVElNeC0+Q0NFUiAmPSB+VElNX0NDRVJfQ0M0RTsKKworICAvKiBHZXQgdGhlIFRJTXggQ1IyIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcGNyMiA9IFRJTXgtPkNSMjsKKworICAvKiBHZXQgdGhlIFRJTXggQ0NNUjIgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY2NtcnggPSBUSU14LT5DQ01SMjsKKworICAvKiBSZXNldCB0aGUgT3V0cHV0IENvbXBhcmUgbW9kZSBhbmQgQ2FwdHVyZS9Db21wYXJlIHNlbGVjdGlvbiBCaXRzICovCisgIHRtcGNjbXJ4ICY9IH5USU1fQ0NNUjJfT0M0TTsKKyAgdG1wY2NtcnggJj0gflRJTV9DQ01SMl9DQzRTOworCisgIC8qIFNlbGVjdCB0aGUgT3V0cHV0IENvbXBhcmUgTW9kZSAqLworICB0bXBjY21yeCB8PSAoT0NfQ29uZmlnLT5PQ01vZGUgPDwgOFUpOworCisgIC8qIFJlc2V0IHRoZSBPdXRwdXQgUG9sYXJpdHkgbGV2ZWwgKi8KKyAgdG1wY2NlciAmPSB+VElNX0NDRVJfQ0M0UDsKKyAgLyogU2V0IHRoZSBPdXRwdXQgQ29tcGFyZSBQb2xhcml0eSAqLworICB0bXBjY2VyIHw9IChPQ19Db25maWctPk9DUG9sYXJpdHkgPDwgMTJVKTsKKworICBpZiAoSVNfVElNX0NDWE5fSU5TVEFOQ0UoVElNeCwgVElNX0NIQU5ORUxfNCkpIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfVElNX09DTl9QT0xBUklUWShPQ19Db25maWctPk9DTlBvbGFyaXR5KSk7CisKKyAgICAvKiBSZXNldCB0aGUgT3V0cHV0IE4gUG9sYXJpdHkgbGV2ZWwgKi8KKyAgICB0bXBjY2VyICY9IH5USU1fQ0NFUl9DQzROUDsKKyAgICAvKiBTZXQgdGhlIE91dHB1dCBOIFBvbGFyaXR5ICovCisgICAgdG1wY2NlciB8PSAoT0NfQ29uZmlnLT5PQ05Qb2xhcml0eSA8PCAxMlUpOworICAgIC8qIFJlc2V0IHRoZSBPdXRwdXQgTiBTdGF0ZSAqLworICAgIHRtcGNjZXIgJj0gflRJTV9DQ0VSX0NDNE5FOworICB9CisKKyAgaWYgKElTX1RJTV9CUkVBS19JTlNUQU5DRShUSU14KSkgeworICAgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfVElNX09DTklETEVfU1RBVEUoT0NfQ29uZmlnLT5PQ05JZGxlU3RhdGUpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfVElNX09DSURMRV9TVEFURShPQ19Db25maWctPk9DSWRsZVN0YXRlKSk7CisKKyAgICAvKiBSZXNldCB0aGUgT3V0cHV0IENvbXBhcmUgSURMRSBTdGF0ZSAqLworICAgIHRtcGNyMiAmPSB+VElNX0NSMl9PSVM0OworICAgIC8qIFJlc2V0IHRoZSBPdXRwdXQgQ29tcGFyZSBOIElETEUgU3RhdGUgKi8KKyAgICB0bXBjcjIgJj0gflRJTV9DUjJfT0lTNE47CisKKyAgICAvKiBTZXQgdGhlIE91dHB1dCBJZGxlIHN0YXRlICovCisgICAgdG1wY3IyIHw9IChPQ19Db25maWctPk9DSWRsZVN0YXRlIDw8IDZVKTsKKyAgICAvKiBTZXQgdGhlIE91dHB1dCBOIElkbGUgc3RhdGUgKi8KKyAgICB0bXBjcjIgfD0gKE9DX0NvbmZpZy0+T0NOSWRsZVN0YXRlIDw8IDZVKTsKKyAgfQorCisgIC8qIFdyaXRlIHRvIFRJTXggQ1IyICovCisgIFRJTXgtPkNSMiA9IHRtcGNyMjsKKworICAvKiBXcml0ZSB0byBUSU14IENDTVIyICovCisgIFRJTXgtPkNDTVIyID0gdG1wY2Ntcng7CisKKyAgLyogU2V0IHRoZSBDYXB0dXJlIENvbXBhcmUgUmVnaXN0ZXIgdmFsdWUgKi8KKyAgVElNeC0+Q0NSNCA9IE9DX0NvbmZpZy0+UHVsc2U7CisKKyAgLyogV3JpdGUgdG8gVElNeCBDQ0VSICovCisgIFRJTXgtPkNDRVIgPSB0bXBjY2VyOworfQorCisvKioKKyAqIEBicmllZiAgVGltZXIgT3V0cHV0IENvbXBhcmUgNSBjb25maWd1cmF0aW9uCisgKiBAcGFyYW0gIFRJTXggdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbAorICogQHBhcmFtICBPQ19Db25maWcgVGhlIG91dHB1dCBjb25maWd1cmF0aW9uIHN0cnVjdHVyZQorICogQHJldHZhbCBOb25lCisgKi8KK3N0YXRpYyB2b2lkIFRJTV9PQzVfU2V0Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVElNX09DX0luaXRUeXBlRGVmICpPQ19Db25maWcpIHsKKyAgdWludDMyX3QgdG1wY2Ntcng7CisgIHVpbnQzMl90IHRtcGNjZXI7CisgIHVpbnQzMl90IHRtcGNyMjsKKworICAvKiBHZXQgdGhlIFRJTXggQ0NFUiByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjY2VyID0gVElNeC0+Q0NFUjsKKworICAvKiBEaXNhYmxlIHRoZSBvdXRwdXQ6IFJlc2V0IHRoZSBDQ3hFIEJpdCAqLworICBUSU14LT5DQ0VSICY9IH5USU1fQ0NFUl9DQzVFOworCisgIC8qIEdldCB0aGUgVElNeCBDUjIgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY3IyID0gVElNeC0+Q1IyOworICAvKiBHZXQgdGhlIFRJTXggQ0NNUjEgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY2NtcnggPSBUSU14LT5DQ01SMzsKKworICAvKiBSZXNldCB0aGUgT3V0cHV0IENvbXBhcmUgTW9kZSBCaXRzICovCisgIHRtcGNjbXJ4ICY9IH4oVElNX0NDTVIzX09DNU0pOworICAvKiBTZWxlY3QgdGhlIE91dHB1dCBDb21wYXJlIE1vZGUgKi8KKyAgdG1wY2NtcnggfD0gT0NfQ29uZmlnLT5PQ01vZGU7CisKKyAgLyogUmVzZXQgdGhlIE91dHB1dCBQb2xhcml0eSBsZXZlbCAqLworICB0bXBjY2VyICY9IH5USU1fQ0NFUl9DQzVQOworICAvKiBTZXQgdGhlIE91dHB1dCBDb21wYXJlIFBvbGFyaXR5ICovCisgIHRtcGNjZXIgfD0gKE9DX0NvbmZpZy0+T0NQb2xhcml0eSA8PCAxNlUpOworCisgIGlmIChJU19USU1fQlJFQUtfSU5TVEFOQ0UoVElNeCkpIHsKKyAgICAvKiBSZXNldCB0aGUgT3V0cHV0IENvbXBhcmUgSURMRSBTdGF0ZSAqLworICAgIHRtcGNyMiAmPSB+VElNX0NSMl9PSVM1OworICAgIC8qIFNldCB0aGUgT3V0cHV0IElkbGUgc3RhdGUgKi8KKyAgICB0bXBjcjIgfD0gKE9DX0NvbmZpZy0+T0NJZGxlU3RhdGUgPDwgOFUpOworICB9CisgIC8qIFdyaXRlIHRvIFRJTXggQ1IyICovCisgIFRJTXgtPkNSMiA9IHRtcGNyMjsKKworICAvKiBXcml0ZSB0byBUSU14IENDTVIzICovCisgIFRJTXgtPkNDTVIzID0gdG1wY2Ntcng7CisKKyAgLyogU2V0IHRoZSBDYXB0dXJlIENvbXBhcmUgUmVnaXN0ZXIgdmFsdWUgKi8KKyAgVElNeC0+Q0NSNSA9IE9DX0NvbmZpZy0+UHVsc2U7CisKKyAgLyogV3JpdGUgdG8gVElNeCBDQ0VSICovCisgIFRJTXgtPkNDRVIgPSB0bXBjY2VyOworfQorCisvKioKKyAqIEBicmllZiAgVGltZXIgT3V0cHV0IENvbXBhcmUgNiBjb25maWd1cmF0aW9uCisgKiBAcGFyYW0gIFRJTXggdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbAorICogQHBhcmFtICBPQ19Db25maWcgVGhlIG91dHB1dCBjb25maWd1cmF0aW9uIHN0cnVjdHVyZQorICogQHJldHZhbCBOb25lCisgKi8KK3N0YXRpYyB2b2lkIFRJTV9PQzZfU2V0Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVElNX09DX0luaXRUeXBlRGVmICpPQ19Db25maWcpIHsKKyAgdWludDMyX3QgdG1wY2Ntcng7CisgIHVpbnQzMl90IHRtcGNjZXI7CisgIHVpbnQzMl90IHRtcGNyMjsKKworICAvKiBHZXQgdGhlIFRJTXggQ0NFUiByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjY2VyID0gVElNeC0+Q0NFUjsKKworICAvKiBEaXNhYmxlIHRoZSBvdXRwdXQ6IFJlc2V0IHRoZSBDQ3hFIEJpdCAqLworICBUSU14LT5DQ0VSICY9IH5USU1fQ0NFUl9DQzZFOworCisgIC8qIEdldCB0aGUgVElNeCBDUjIgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY3IyID0gVElNeC0+Q1IyOworICAvKiBHZXQgdGhlIFRJTXggQ0NNUjEgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY2NtcnggPSBUSU14LT5DQ01SMzsKKworICAvKiBSZXNldCB0aGUgT3V0cHV0IENvbXBhcmUgTW9kZSBCaXRzICovCisgIHRtcGNjbXJ4ICY9IH4oVElNX0NDTVIzX09DNk0pOworICAvKiBTZWxlY3QgdGhlIE91dHB1dCBDb21wYXJlIE1vZGUgKi8KKyAgdG1wY2NtcnggfD0gKE9DX0NvbmZpZy0+T0NNb2RlIDw8IDhVKTsKKworICAvKiBSZXNldCB0aGUgT3V0cHV0IFBvbGFyaXR5IGxldmVsICovCisgIHRtcGNjZXIgJj0gKHVpbnQzMl90KX5USU1fQ0NFUl9DQzZQOworICAvKiBTZXQgdGhlIE91dHB1dCBDb21wYXJlIFBvbGFyaXR5ICovCisgIHRtcGNjZXIgfD0gKE9DX0NvbmZpZy0+T0NQb2xhcml0eSA8PCAyMFUpOworCisgIGlmIChJU19USU1fQlJFQUtfSU5TVEFOQ0UoVElNeCkpIHsKKyAgICAvKiBSZXNldCB0aGUgT3V0cHV0IENvbXBhcmUgSURMRSBTdGF0ZSAqLworICAgIHRtcGNyMiAmPSB+VElNX0NSMl9PSVM2OworICAgIC8qIFNldCB0aGUgT3V0cHV0IElkbGUgc3RhdGUgKi8KKyAgICB0bXBjcjIgfD0gKE9DX0NvbmZpZy0+T0NJZGxlU3RhdGUgPDwgMTBVKTsKKyAgfQorCisgIC8qIFdyaXRlIHRvIFRJTXggQ1IyICovCisgIFRJTXgtPkNSMiA9IHRtcGNyMjsKKworICAvKiBXcml0ZSB0byBUSU14IENDTVIzICovCisgIFRJTXgtPkNDTVIzID0gdG1wY2Ntcng7CisKKyAgLyogU2V0IHRoZSBDYXB0dXJlIENvbXBhcmUgUmVnaXN0ZXIgdmFsdWUgKi8KKyAgVElNeC0+Q0NSNiA9IE9DX0NvbmZpZy0+UHVsc2U7CisKKyAgLyogV3JpdGUgdG8gVElNeCBDQ0VSICovCisgIFRJTXgtPkNDRVIgPSB0bXBjY2VyOworfQorCisvKioKKyAqIEBicmllZiAgU2xhdmUgVGltZXIgY29uZmlndXJhdGlvbiBmdW5jdGlvbgorICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAqIEBwYXJhbSAgc1NsYXZlQ29uZmlnIFNsYXZlIHRpbWVyIGNvbmZpZ3VyYXRpb24KKyAqIEByZXR2YWwgTm9uZQorICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgVElNX1NsYXZlVGltZXJfU2V0Q29uZmlnKAorICAgIFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCBjb25zdCBUSU1fU2xhdmVDb25maWdUeXBlRGVmICpzU2xhdmVDb25maWcpIHsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworICB1aW50MzJfdCB0bXBzbWNyOworICB1aW50MzJfdCB0bXBjY21yMTsKKyAgdWludDMyX3QgdG1wY2NlcjsKKworICAvKiBHZXQgdGhlIFRJTXggU01DUiByZWdpc3RlciB2YWx1ZSAqLworICB0bXBzbWNyID0gaHRpbS0+SW5zdGFuY2UtPlNNQ1I7CisKKyAgLyogUmVzZXQgdGhlIFRyaWdnZXIgU2VsZWN0aW9uIEJpdHMgKi8KKyAgdG1wc21jciAmPSB+VElNX1NNQ1JfVFM7CisgIC8qIFNldCB0aGUgSW5wdXQgVHJpZ2dlciBzb3VyY2UgKi8KKyAgdG1wc21jciB8PSBzU2xhdmVDb25maWctPklucHV0VHJpZ2dlcjsKKworICAvKiBSZXNldCB0aGUgc2xhdmUgbW9kZSBCaXRzICovCisgIHRtcHNtY3IgJj0gflRJTV9TTUNSX1NNUzsKKyAgLyogU2V0IHRoZSBzbGF2ZSBtb2RlICovCisgIHRtcHNtY3IgfD0gc1NsYXZlQ29uZmlnLT5TbGF2ZU1vZGU7CisKKyAgLyogV3JpdGUgdG8gVElNeCBTTUNSICovCisgIGh0aW0tPkluc3RhbmNlLT5TTUNSID0gdG1wc21jcjsKKworICAvKiBDb25maWd1cmUgdGhlIHRyaWdnZXIgcHJlc2NhbGVyLCBmaWx0ZXIsIGFuZCBwb2xhcml0eSAqLworICBzd2l0Y2ggKHNTbGF2ZUNvbmZpZy0+SW5wdXRUcmlnZ2VyKSB7CisgICAgY2FzZSBUSU1fVFNfRVRSRjogeworICAgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTFfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fVFJJR0dFUlBSRVNDQUxFUihzU2xhdmVDb25maWctPlRyaWdnZXJQcmVzY2FsZXIpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fVFJJR0dFUlBPTEFSSVRZKHNTbGF2ZUNvbmZpZy0+VHJpZ2dlclBvbGFyaXR5KSk7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX1RSSUdHRVJGSUxURVIoc1NsYXZlQ29uZmlnLT5UcmlnZ2VyRmlsdGVyKSk7CisgICAgICAvKiBDb25maWd1cmUgdGhlIEVUUiBUcmlnZ2VyIHNvdXJjZSAqLworICAgICAgVElNX0VUUl9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsIHNTbGF2ZUNvbmZpZy0+VHJpZ2dlclByZXNjYWxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNTbGF2ZUNvbmZpZy0+VHJpZ2dlclBvbGFyaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgc1NsYXZlQ29uZmlnLT5UcmlnZ2VyRmlsdGVyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX1RTX1RJMUZfRUQ6IHsKKyAgICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDMV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9UUklHR0VSRklMVEVSKHNTbGF2ZUNvbmZpZy0+VHJpZ2dlckZpbHRlcikpOworCisgICAgICBpZiAoKHNTbGF2ZUNvbmZpZy0+U2xhdmVNb2RlID09IFRJTV9TTEFWRU1PREVfR0FURUQpIHx8CisgICAgICAgICAgKHNTbGF2ZUNvbmZpZy0+U2xhdmVNb2RlID09IFRJTV9TTEFWRU1PREVfQ09NQklORURfR0FURURSRVNFVCkpIHsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKworICAgICAgLyogRGlzYWJsZSB0aGUgQ2hhbm5lbCAxOiBSZXNldCB0aGUgQ0MxRSBCaXQgKi8KKyAgICAgIHRtcGNjZXIgPSBodGltLT5JbnN0YW5jZS0+Q0NFUjsKKyAgICAgIGh0aW0tPkluc3RhbmNlLT5DQ0VSICY9IH5USU1fQ0NFUl9DQzFFOworICAgICAgdG1wY2NtcjEgPSBodGltLT5JbnN0YW5jZS0+Q0NNUjE7CisKKyAgICAgIC8qIFNldCB0aGUgZmlsdGVyICovCisgICAgICB0bXBjY21yMSAmPSB+VElNX0NDTVIxX0lDMUY7CisgICAgICB0bXBjY21yMSB8PSAoKHNTbGF2ZUNvbmZpZy0+VHJpZ2dlckZpbHRlcikgPDwgNFUpOworCisgICAgICAvKiBXcml0ZSB0byBUSU14IENDTVIxIGFuZCBDQ0VSIHJlZ2lzdGVycyAqLworICAgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIxID0gdG1wY2NtcjE7CisgICAgICBodGltLT5JbnN0YW5jZS0+Q0NFUiA9IHRtcGNjZXI7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9UU19USTFGUDE6IHsKKyAgICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDMV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9UUklHR0VSUE9MQVJJVFkoc1NsYXZlQ29uZmlnLT5UcmlnZ2VyUG9sYXJpdHkpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fVFJJR0dFUkZJTFRFUihzU2xhdmVDb25maWctPlRyaWdnZXJGaWx0ZXIpKTsKKworICAgICAgLyogQ29uZmlndXJlIFRJMSBGaWx0ZXIgYW5kIFBvbGFyaXR5ICovCisgICAgICBUSU1fVEkxX0NvbmZpZ0lucHV0U3RhZ2UoaHRpbS0+SW5zdGFuY2UsIHNTbGF2ZUNvbmZpZy0+VHJpZ2dlclBvbGFyaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNTbGF2ZUNvbmZpZy0+VHJpZ2dlckZpbHRlcik7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9UU19USTJGUDI6IHsKKyAgICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDMl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9UUklHR0VSUE9MQVJJVFkoc1NsYXZlQ29uZmlnLT5UcmlnZ2VyUG9sYXJpdHkpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fVFJJR0dFUkZJTFRFUihzU2xhdmVDb25maWctPlRyaWdnZXJGaWx0ZXIpKTsKKworICAgICAgLyogQ29uZmlndXJlIFRJMiBGaWx0ZXIgYW5kIFBvbGFyaXR5ICovCisgICAgICBUSU1fVEkyX0NvbmZpZ0lucHV0U3RhZ2UoaHRpbS0+SW5zdGFuY2UsIHNTbGF2ZUNvbmZpZy0+VHJpZ2dlclBvbGFyaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNTbGF2ZUNvbmZpZy0+VHJpZ2dlckZpbHRlcik7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9UU19JVFIwOgorICAgIGNhc2UgVElNX1RTX0lUUjE6CisgICAgY2FzZSBUSU1fVFNfSVRSMjoKKyAgICBjYXNlIFRJTV9UU19JVFIzOgorI2lmIGRlZmluZWQoVElNNSkKKyAgICBjYXNlIFRJTV9UU19JVFI0OgorI2VuZGlmIC8qIFRJTTUgKi8KKyAgICBjYXNlIFRJTV9UU19JVFI1OgorICAgIGNhc2UgVElNX1RTX0lUUjY6CisgICAgY2FzZSBUSU1fVFNfSVRSNzoKKyAgICBjYXNlIFRJTV9UU19JVFI4OgorI2lmIGRlZmluZWQoVElNMjApCisgICAgY2FzZSBUSU1fVFNfSVRSOToKKyNlbmRpZiAvKiBUSU0yMCAqLworI2lmIGRlZmluZWQoSFJUSU0xKQorICAgIGNhc2UgVElNX1RTX0lUUjEwOgorI2VuZGlmIC8qIEhSVElNMSAqLworICAgIGNhc2UgVElNX1RTX0lUUjExOiB7CisgICAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVyICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0lOVEVSTkFMX1RSSUdHRVJFVkVOVF9JTlNUQU5DRSgKKyAgICAgICAgICAoaHRpbS0+SW5zdGFuY2UpLCBzU2xhdmVDb25maWctPklucHV0VHJpZ2dlcikpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgVEkxIGFzIElucHV0LgorICogQHBhcmFtICBUSU14IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuCisgKiBAcGFyYW0gIFRJTV9JQ1BvbGFyaXR5IFRoZSBJbnB1dCBQb2xhcml0eS4KKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgVElNX0lDUE9MQVJJVFlfUklTSU5HCisgKiAgICAgICAgICAgIEBhcmcgVElNX0lDUE9MQVJJVFlfRkFMTElORworICogICAgICAgICAgICBAYXJnIFRJTV9JQ1BPTEFSSVRZX0JPVEhFREdFCisgKiBAcGFyYW0gIFRJTV9JQ1NlbGVjdGlvbiBzcGVjaWZpZXMgdGhlIGlucHV0IHRvIGJlIHVzZWQuCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIFRJTV9JQ1NFTEVDVElPTl9ESVJFQ1RUSTogVElNIElucHV0IDEgaXMgc2VsZWN0ZWQgdG8gYmUKKyAqIGNvbm5lY3RlZCB0byBJQzEuCisgKiAgICAgICAgICAgIEBhcmcgVElNX0lDU0VMRUNUSU9OX0lORElSRUNUVEk6IFRJTSBJbnB1dCAxIGlzIHNlbGVjdGVkIHRvIGJlCisgKiBjb25uZWN0ZWQgdG8gSUMyLgorICogICAgICAgICAgICBAYXJnIFRJTV9JQ1NFTEVDVElPTl9UUkM6IFRJTSBJbnB1dCAxIGlzIHNlbGVjdGVkIHRvIGJlIGNvbm5lY3RlZAorICogdG8gVFJDLgorICogQHBhcmFtICBUSU1fSUNGaWx0ZXIgU3BlY2lmaWVzIHRoZSBJbnB1dCBDYXB0dXJlIEZpbHRlci4KKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDB4MDAgYW5kIDB4MEYuCisgKiBAcmV0dmFsIE5vbmUKKyAqIEBub3RlIFRJTV9JQ0ZpbHRlciBhbmQgVElNX0lDUG9sYXJpdHkgYXJlIG5vdCB1c2VkIGluIElORElSRUNUIG1vZGUgYXMgVEkyRlAxCisgKiAgICAgICAob24gY2hhbm5lbDIgcGF0aCkgaXMgdXNlZCBhcyB0aGUgaW5wdXQgc2lnbmFsLiBUaGVyZWZvcmUgQ0NNUjEgbXVzdCBiZQorICogICAgICAgIHByb3RlY3RlZCBhZ2FpbnN0IHVuLWluaXRpYWxpemVkIGZpbHRlciBhbmQgcG9sYXJpdHkgdmFsdWVzLgorICovCit2b2lkIFRJTV9USTFfU2V0Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBUSU1fSUNQb2xhcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVElNX0lDU2VsZWN0aW9uLCB1aW50MzJfdCBUSU1fSUNGaWx0ZXIpIHsKKyAgdWludDMyX3QgdG1wY2NtcjE7CisgIHVpbnQzMl90IHRtcGNjZXI7CisKKyAgLyogRGlzYWJsZSB0aGUgQ2hhbm5lbCAxOiBSZXNldCB0aGUgQ0MxRSBCaXQgKi8KKyAgdG1wY2NlciA9IFRJTXgtPkNDRVI7CisgIFRJTXgtPkNDRVIgJj0gflRJTV9DQ0VSX0NDMUU7CisgIHRtcGNjbXIxID0gVElNeC0+Q0NNUjE7CisKKyAgLyogU2VsZWN0IHRoZSBJbnB1dCAqLworICBpZiAoSVNfVElNX0NDMl9JTlNUQU5DRShUSU14KSAhPSBSRVNFVCkgeworICAgIHRtcGNjbXIxICY9IH5USU1fQ0NNUjFfQ0MxUzsKKyAgICB0bXBjY21yMSB8PSBUSU1fSUNTZWxlY3Rpb247CisgIH0gZWxzZSB7CisgICAgdG1wY2NtcjEgfD0gVElNX0NDTVIxX0NDMVNfMDsKKyAgfQorCisgIC8qIFNldCB0aGUgZmlsdGVyICovCisgIHRtcGNjbXIxICY9IH5USU1fQ0NNUjFfSUMxRjsKKyAgdG1wY2NtcjEgfD0gKChUSU1fSUNGaWx0ZXIgPDwgNFUpICYgVElNX0NDTVIxX0lDMUYpOworCisgIC8qIFNlbGVjdCB0aGUgUG9sYXJpdHkgYW5kIHNldCB0aGUgQ0MxRSBCaXQgKi8KKyAgdG1wY2NlciAmPSB+KFRJTV9DQ0VSX0NDMVAgfCBUSU1fQ0NFUl9DQzFOUCk7CisgIHRtcGNjZXIgfD0gKFRJTV9JQ1BvbGFyaXR5ICYgKFRJTV9DQ0VSX0NDMVAgfCBUSU1fQ0NFUl9DQzFOUCkpOworCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjEgYW5kIENDRVIgcmVnaXN0ZXJzICovCisgIFRJTXgtPkNDTVIxID0gdG1wY2NtcjE7CisgIFRJTXgtPkNDRVIgPSB0bXBjY2VyOworfQorCisvKioKKyAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBQb2xhcml0eSBhbmQgRmlsdGVyIGZvciBUSTEuCisgKiBAcGFyYW0gIFRJTXggdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4KKyAqIEBwYXJhbSAgVElNX0lDUG9sYXJpdHkgVGhlIElucHV0IFBvbGFyaXR5LgorICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBUSU1fSUNQT0xBUklUWV9SSVNJTkcKKyAqICAgICAgICAgICAgQGFyZyBUSU1fSUNQT0xBUklUWV9GQUxMSU5HCisgKiAgICAgICAgICAgIEBhcmcgVElNX0lDUE9MQVJJVFlfQk9USEVER0UKKyAqIEBwYXJhbSAgVElNX0lDRmlsdGVyIFNwZWNpZmllcyB0aGUgSW5wdXQgQ2FwdHVyZSBGaWx0ZXIuCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwIGFuZCAweDBGLgorICogQHJldHZhbCBOb25lCisgKi8KK3N0YXRpYyB2b2lkIFRJTV9USTFfQ29uZmlnSW5wdXRTdGFnZShUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgVElNX0lDUG9sYXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVElNX0lDRmlsdGVyKSB7CisgIHVpbnQzMl90IHRtcGNjbXIxOworICB1aW50MzJfdCB0bXBjY2VyOworCisgIC8qIERpc2FibGUgdGhlIENoYW5uZWwgMTogUmVzZXQgdGhlIENDMUUgQml0ICovCisgIHRtcGNjZXIgPSBUSU14LT5DQ0VSOworICBUSU14LT5DQ0VSICY9IH5USU1fQ0NFUl9DQzFFOworICB0bXBjY21yMSA9IFRJTXgtPkNDTVIxOworCisgIC8qIFNldCB0aGUgZmlsdGVyICovCisgIHRtcGNjbXIxICY9IH5USU1fQ0NNUjFfSUMxRjsKKyAgdG1wY2NtcjEgfD0gKFRJTV9JQ0ZpbHRlciA8PCA0VSk7CisKKyAgLyogU2VsZWN0IHRoZSBQb2xhcml0eSBhbmQgc2V0IHRoZSBDQzFFIEJpdCAqLworICB0bXBjY2VyICY9IH4oVElNX0NDRVJfQ0MxUCB8IFRJTV9DQ0VSX0NDMU5QKTsKKyAgdG1wY2NlciB8PSBUSU1fSUNQb2xhcml0eTsKKworICAvKiBXcml0ZSB0byBUSU14IENDTVIxIGFuZCBDQ0VSIHJlZ2lzdGVycyAqLworICBUSU14LT5DQ01SMSA9IHRtcGNjbXIxOworICBUSU14LT5DQ0VSID0gdG1wY2NlcjsKK30KKworLyoqCisgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgVEkyIGFzIElucHV0LgorICogQHBhcmFtICBUSU14IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwKKyAqIEBwYXJhbSAgVElNX0lDUG9sYXJpdHkgVGhlIElucHV0IFBvbGFyaXR5LgorICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBUSU1fSUNQT0xBUklUWV9SSVNJTkcKKyAqICAgICAgICAgICAgQGFyZyBUSU1fSUNQT0xBUklUWV9GQUxMSU5HCisgKiAgICAgICAgICAgIEBhcmcgVElNX0lDUE9MQVJJVFlfQk9USEVER0UKKyAqIEBwYXJhbSAgVElNX0lDU2VsZWN0aW9uIHNwZWNpZmllcyB0aGUgaW5wdXQgdG8gYmUgdXNlZC4KKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgVElNX0lDU0VMRUNUSU9OX0RJUkVDVFRJOiBUSU0gSW5wdXQgMiBpcyBzZWxlY3RlZCB0byBiZQorICogY29ubmVjdGVkIHRvIElDMi4KKyAqICAgICAgICAgICAgQGFyZyBUSU1fSUNTRUxFQ1RJT05fSU5ESVJFQ1RUSTogVElNIElucHV0IDIgaXMgc2VsZWN0ZWQgdG8gYmUKKyAqIGNvbm5lY3RlZCB0byBJQzEuCisgKiAgICAgICAgICAgIEBhcmcgVElNX0lDU0VMRUNUSU9OX1RSQzogVElNIElucHV0IDIgaXMgc2VsZWN0ZWQgdG8gYmUgY29ubmVjdGVkCisgKiB0byBUUkMuCisgKiBAcGFyYW0gIFRJTV9JQ0ZpbHRlciBTcGVjaWZpZXMgdGhlIElucHV0IENhcHR1cmUgRmlsdGVyLgorICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMHgwMCBhbmQgMHgwRi4KKyAqIEByZXR2YWwgTm9uZQorICogQG5vdGUgVElNX0lDRmlsdGVyIGFuZCBUSU1fSUNQb2xhcml0eSBhcmUgbm90IHVzZWQgaW4gSU5ESVJFQ1QgbW9kZSBhcyBUSTFGUDIKKyAqICAgICAgIChvbiBjaGFubmVsMSBwYXRoKSBpcyB1c2VkIGFzIHRoZSBpbnB1dCBzaWduYWwuIFRoZXJlZm9yZSBDQ01SMSBtdXN0IGJlCisgKiAgICAgICAgcHJvdGVjdGVkIGFnYWluc3QgdW4taW5pdGlhbGl6ZWQgZmlsdGVyIGFuZCBwb2xhcml0eSB2YWx1ZXMuCisgKi8KK3N0YXRpYyB2b2lkIFRJTV9USTJfU2V0Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBUSU1fSUNQb2xhcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRJTV9JQ1NlbGVjdGlvbiwgdWludDMyX3QgVElNX0lDRmlsdGVyKSB7CisgIHVpbnQzMl90IHRtcGNjbXIxOworICB1aW50MzJfdCB0bXBjY2VyOworCisgIC8qIERpc2FibGUgdGhlIENoYW5uZWwgMjogUmVzZXQgdGhlIENDMkUgQml0ICovCisgIHRtcGNjZXIgPSBUSU14LT5DQ0VSOworICBUSU14LT5DQ0VSICY9IH5USU1fQ0NFUl9DQzJFOworICB0bXBjY21yMSA9IFRJTXgtPkNDTVIxOworCisgIC8qIFNlbGVjdCB0aGUgSW5wdXQgKi8KKyAgdG1wY2NtcjEgJj0gflRJTV9DQ01SMV9DQzJTOworICB0bXBjY21yMSB8PSAoVElNX0lDU2VsZWN0aW9uIDw8IDhVKTsKKworICAvKiBTZXQgdGhlIGZpbHRlciAqLworICB0bXBjY21yMSAmPSB+VElNX0NDTVIxX0lDMkY7CisgIHRtcGNjbXIxIHw9ICgoVElNX0lDRmlsdGVyIDw8IDEyVSkgJiBUSU1fQ0NNUjFfSUMyRik7CisKKyAgLyogU2VsZWN0IHRoZSBQb2xhcml0eSBhbmQgc2V0IHRoZSBDQzJFIEJpdCAqLworICB0bXBjY2VyICY9IH4oVElNX0NDRVJfQ0MyUCB8IFRJTV9DQ0VSX0NDMk5QKTsKKyAgdG1wY2NlciB8PSAoKFRJTV9JQ1BvbGFyaXR5IDw8IDRVKSAmIChUSU1fQ0NFUl9DQzJQIHwgVElNX0NDRVJfQ0MyTlApKTsKKworICAvKiBXcml0ZSB0byBUSU14IENDTVIxIGFuZCBDQ0VSIHJlZ2lzdGVycyAqLworICBUSU14LT5DQ01SMSA9IHRtcGNjbXIxOworICBUSU14LT5DQ0VSID0gdG1wY2NlcjsKK30KKworLyoqCisgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgUG9sYXJpdHkgYW5kIEZpbHRlciBmb3IgVEkyLgorICogQHBhcmFtICBUSU14IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuCisgKiBAcGFyYW0gIFRJTV9JQ1BvbGFyaXR5IFRoZSBJbnB1dCBQb2xhcml0eS4KKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgVElNX0lDUE9MQVJJVFlfUklTSU5HCisgKiAgICAgICAgICAgIEBhcmcgVElNX0lDUE9MQVJJVFlfRkFMTElORworICogICAgICAgICAgICBAYXJnIFRJTV9JQ1BPTEFSSVRZX0JPVEhFREdFCisgKiBAcGFyYW0gIFRJTV9JQ0ZpbHRlciBTcGVjaWZpZXMgdGhlIElucHV0IENhcHR1cmUgRmlsdGVyLgorICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMHgwMCBhbmQgMHgwRi4KKyAqIEByZXR2YWwgTm9uZQorICovCitzdGF0aWMgdm9pZCBUSU1fVEkyX0NvbmZpZ0lucHV0U3RhZ2UoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IFRJTV9JQ1BvbGFyaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRJTV9JQ0ZpbHRlcikgeworICB1aW50MzJfdCB0bXBjY21yMTsKKyAgdWludDMyX3QgdG1wY2NlcjsKKworICAvKiBEaXNhYmxlIHRoZSBDaGFubmVsIDI6IFJlc2V0IHRoZSBDQzJFIEJpdCAqLworICB0bXBjY2VyID0gVElNeC0+Q0NFUjsKKyAgVElNeC0+Q0NFUiAmPSB+VElNX0NDRVJfQ0MyRTsKKyAgdG1wY2NtcjEgPSBUSU14LT5DQ01SMTsKKworICAvKiBTZXQgdGhlIGZpbHRlciAqLworICB0bXBjY21yMSAmPSB+VElNX0NDTVIxX0lDMkY7CisgIHRtcGNjbXIxIHw9IChUSU1fSUNGaWx0ZXIgPDwgMTJVKTsKKworICAvKiBTZWxlY3QgdGhlIFBvbGFyaXR5IGFuZCBzZXQgdGhlIENDMkUgQml0ICovCisgIHRtcGNjZXIgJj0gfihUSU1fQ0NFUl9DQzJQIHwgVElNX0NDRVJfQ0MyTlApOworICB0bXBjY2VyIHw9IChUSU1fSUNQb2xhcml0eSA8PCA0VSk7CisKKyAgLyogV3JpdGUgdG8gVElNeCBDQ01SMSBhbmQgQ0NFUiByZWdpc3RlcnMgKi8KKyAgVElNeC0+Q0NNUjEgPSB0bXBjY21yMTsKKyAgVElNeC0+Q0NFUiA9IHRtcGNjZXI7Cit9CisKKy8qKgorICogQGJyaWVmICBDb25maWd1cmUgdGhlIFRJMyBhcyBJbnB1dC4KKyAqIEBwYXJhbSAgVElNeCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsCisgKiBAcGFyYW0gIFRJTV9JQ1BvbGFyaXR5IFRoZSBJbnB1dCBQb2xhcml0eS4KKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgVElNX0lDUE9MQVJJVFlfUklTSU5HCisgKiAgICAgICAgICAgIEBhcmcgVElNX0lDUE9MQVJJVFlfRkFMTElORworICogICAgICAgICAgICBAYXJnIFRJTV9JQ1BPTEFSSVRZX0JPVEhFREdFCisgKiBAcGFyYW0gIFRJTV9JQ1NlbGVjdGlvbiBzcGVjaWZpZXMgdGhlIGlucHV0IHRvIGJlIHVzZWQuCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIFRJTV9JQ1NFTEVDVElPTl9ESVJFQ1RUSTogVElNIElucHV0IDMgaXMgc2VsZWN0ZWQgdG8gYmUKKyAqIGNvbm5lY3RlZCB0byBJQzMuCisgKiAgICAgICAgICAgIEBhcmcgVElNX0lDU0VMRUNUSU9OX0lORElSRUNUVEk6IFRJTSBJbnB1dCAzIGlzIHNlbGVjdGVkIHRvIGJlCisgKiBjb25uZWN0ZWQgdG8gSUM0LgorICogICAgICAgICAgICBAYXJnIFRJTV9JQ1NFTEVDVElPTl9UUkM6IFRJTSBJbnB1dCAzIGlzIHNlbGVjdGVkIHRvIGJlIGNvbm5lY3RlZAorICogdG8gVFJDLgorICogQHBhcmFtICBUSU1fSUNGaWx0ZXIgU3BlY2lmaWVzIHRoZSBJbnB1dCBDYXB0dXJlIEZpbHRlci4KKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDB4MDAgYW5kIDB4MEYuCisgKiBAcmV0dmFsIE5vbmUKKyAqIEBub3RlIFRJTV9JQ0ZpbHRlciBhbmQgVElNX0lDUG9sYXJpdHkgYXJlIG5vdCB1c2VkIGluIElORElSRUNUIG1vZGUgYXMgVEkzRlA0CisgKiAgICAgICAob24gY2hhbm5lbDEgcGF0aCkgaXMgdXNlZCBhcyB0aGUgaW5wdXQgc2lnbmFsLiBUaGVyZWZvcmUgQ0NNUjIgbXVzdCBiZQorICogICAgICAgIHByb3RlY3RlZCBhZ2FpbnN0IHVuLWluaXRpYWxpemVkIGZpbHRlciBhbmQgcG9sYXJpdHkgdmFsdWVzLgorICovCitzdGF0aWMgdm9pZCBUSU1fVEkzX1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgVElNX0lDUG9sYXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUSU1fSUNTZWxlY3Rpb24sIHVpbnQzMl90IFRJTV9JQ0ZpbHRlcikgeworICB1aW50MzJfdCB0bXBjY21yMjsKKyAgdWludDMyX3QgdG1wY2NlcjsKKworICAvKiBEaXNhYmxlIHRoZSBDaGFubmVsIDM6IFJlc2V0IHRoZSBDQzNFIEJpdCAqLworICB0bXBjY2VyID0gVElNeC0+Q0NFUjsKKyAgVElNeC0+Q0NFUiAmPSB+VElNX0NDRVJfQ0MzRTsKKyAgdG1wY2NtcjIgPSBUSU14LT5DQ01SMjsKKworICAvKiBTZWxlY3QgdGhlIElucHV0ICovCisgIHRtcGNjbXIyICY9IH5USU1fQ0NNUjJfQ0MzUzsKKyAgdG1wY2NtcjIgfD0gVElNX0lDU2VsZWN0aW9uOworCisgIC8qIFNldCB0aGUgZmlsdGVyICovCisgIHRtcGNjbXIyICY9IH5USU1fQ0NNUjJfSUMzRjsKKyAgdG1wY2NtcjIgfD0gKChUSU1fSUNGaWx0ZXIgPDwgNFUpICYgVElNX0NDTVIyX0lDM0YpOworCisgIC8qIFNlbGVjdCB0aGUgUG9sYXJpdHkgYW5kIHNldCB0aGUgQ0MzRSBCaXQgKi8KKyAgdG1wY2NlciAmPSB+KFRJTV9DQ0VSX0NDM1AgfCBUSU1fQ0NFUl9DQzNOUCk7CisgIHRtcGNjZXIgfD0gKChUSU1fSUNQb2xhcml0eSA8PCA4VSkgJiAoVElNX0NDRVJfQ0MzUCB8IFRJTV9DQ0VSX0NDM05QKSk7CisKKyAgLyogV3JpdGUgdG8gVElNeCBDQ01SMiBhbmQgQ0NFUiByZWdpc3RlcnMgKi8KKyAgVElNeC0+Q0NNUjIgPSB0bXBjY21yMjsKKyAgVElNeC0+Q0NFUiA9IHRtcGNjZXI7Cit9CisKKy8qKgorICogQGJyaWVmICBDb25maWd1cmUgdGhlIFRJNCBhcyBJbnB1dC4KKyAqIEBwYXJhbSAgVElNeCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsCisgKiBAcGFyYW0gIFRJTV9JQ1BvbGFyaXR5IFRoZSBJbnB1dCBQb2xhcml0eS4KKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgVElNX0lDUE9MQVJJVFlfUklTSU5HCisgKiAgICAgICAgICAgIEBhcmcgVElNX0lDUE9MQVJJVFlfRkFMTElORworICogICAgICAgICAgICBAYXJnIFRJTV9JQ1BPTEFSSVRZX0JPVEhFREdFCisgKiBAcGFyYW0gIFRJTV9JQ1NlbGVjdGlvbiBzcGVjaWZpZXMgdGhlIGlucHV0IHRvIGJlIHVzZWQuCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIFRJTV9JQ1NFTEVDVElPTl9ESVJFQ1RUSTogVElNIElucHV0IDQgaXMgc2VsZWN0ZWQgdG8gYmUKKyAqIGNvbm5lY3RlZCB0byBJQzQuCisgKiAgICAgICAgICAgIEBhcmcgVElNX0lDU0VMRUNUSU9OX0lORElSRUNUVEk6IFRJTSBJbnB1dCA0IGlzIHNlbGVjdGVkIHRvIGJlCisgKiBjb25uZWN0ZWQgdG8gSUMzLgorICogICAgICAgICAgICBAYXJnIFRJTV9JQ1NFTEVDVElPTl9UUkM6IFRJTSBJbnB1dCA0IGlzIHNlbGVjdGVkIHRvIGJlIGNvbm5lY3RlZAorICogdG8gVFJDLgorICogQHBhcmFtICBUSU1fSUNGaWx0ZXIgU3BlY2lmaWVzIHRoZSBJbnB1dCBDYXB0dXJlIEZpbHRlci4KKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDB4MDAgYW5kIDB4MEYuCisgKiBAbm90ZSBUSU1fSUNGaWx0ZXIgYW5kIFRJTV9JQ1BvbGFyaXR5IGFyZSBub3QgdXNlZCBpbiBJTkRJUkVDVCBtb2RlIGFzIFRJNEZQMworICogICAgICAgKG9uIGNoYW5uZWwxIHBhdGgpIGlzIHVzZWQgYXMgdGhlIGlucHV0IHNpZ25hbC4gVGhlcmVmb3JlIENDTVIyIG11c3QgYmUKKyAqICAgICAgICBwcm90ZWN0ZWQgYWdhaW5zdCB1bi1pbml0aWFsaXplZCBmaWx0ZXIgYW5kIHBvbGFyaXR5IHZhbHVlcy4KKyAqIEByZXR2YWwgTm9uZQorICovCitzdGF0aWMgdm9pZCBUSU1fVEk0X1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgVElNX0lDUG9sYXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUSU1fSUNTZWxlY3Rpb24sIHVpbnQzMl90IFRJTV9JQ0ZpbHRlcikgeworICB1aW50MzJfdCB0bXBjY21yMjsKKyAgdWludDMyX3QgdG1wY2NlcjsKKworICAvKiBEaXNhYmxlIHRoZSBDaGFubmVsIDQ6IFJlc2V0IHRoZSBDQzRFIEJpdCAqLworICB0bXBjY2VyID0gVElNeC0+Q0NFUjsKKyAgVElNeC0+Q0NFUiAmPSB+VElNX0NDRVJfQ0M0RTsKKyAgdG1wY2NtcjIgPSBUSU14LT5DQ01SMjsKKworICAvKiBTZWxlY3QgdGhlIElucHV0ICovCisgIHRtcGNjbXIyICY9IH5USU1fQ0NNUjJfQ0M0UzsKKyAgdG1wY2NtcjIgfD0gKFRJTV9JQ1NlbGVjdGlvbiA8PCA4VSk7CisKKyAgLyogU2V0IHRoZSBmaWx0ZXIgKi8KKyAgdG1wY2NtcjIgJj0gflRJTV9DQ01SMl9JQzRGOworICB0bXBjY21yMiB8PSAoKFRJTV9JQ0ZpbHRlciA8PCAxMlUpICYgVElNX0NDTVIyX0lDNEYpOworCisgIC8qIFNlbGVjdCB0aGUgUG9sYXJpdHkgYW5kIHNldCB0aGUgQ0M0RSBCaXQgKi8KKyAgdG1wY2NlciAmPSB+KFRJTV9DQ0VSX0NDNFAgfCBUSU1fQ0NFUl9DQzROUCk7CisgIHRtcGNjZXIgfD0gKChUSU1fSUNQb2xhcml0eSA8PCAxMlUpICYgKFRJTV9DQ0VSX0NDNFAgfCBUSU1fQ0NFUl9DQzROUCkpOworCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjIgYW5kIENDRVIgcmVnaXN0ZXJzICovCisgIFRJTXgtPkNDTVIyID0gdG1wY2NtcjI7CisgIFRJTXgtPkNDRVIgPSB0bXBjY2VyOworfQorCisvKioKKyAqIEBicmllZiAgU2VsZWN0cyB0aGUgSW5wdXQgVHJpZ2dlciBzb3VyY2UKKyAqIEBwYXJhbSAgVElNeCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsCisgKiBAcGFyYW0gIElucHV0VHJpZ2dlclNvdXJjZSBUaGUgSW5wdXQgVHJpZ2dlciBzb3VyY2UuCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIFRJTV9UU19JVFIwOiBJbnRlcm5hbCBUcmlnZ2VyIDAKKyAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfSVRSMTogSW50ZXJuYWwgVHJpZ2dlciAxCisgKiAgICAgICAgICAgIEBhcmcgVElNX1RTX0lUUjI6IEludGVybmFsIFRyaWdnZXIgMgorICogICAgICAgICAgICBAYXJnIFRJTV9UU19JVFIzOiBJbnRlcm5hbCBUcmlnZ2VyIDMKKyAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfSVRSNDogSW50ZXJuYWwgVHJpZ2dlciA0ICAoKikKKyAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfSVRSNTogSW50ZXJuYWwgVHJpZ2dlciA1CisgKiAgICAgICAgICAgIEBhcmcgVElNX1RTX0lUUjY6IEludGVybmFsIFRyaWdnZXIgNgorICogICAgICAgICAgICBAYXJnIFRJTV9UU19JVFI3OiBJbnRlcm5hbCBUcmlnZ2VyIDcKKyAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfSVRSODogSW50ZXJuYWwgVHJpZ2dlciA4CisgKiAgICAgICAgICAgIEBhcmcgVElNX1RTX0lUUjk6IEludGVybmFsIFRyaWdnZXIgOSAgICgqKQorICogICAgICAgICAgICBAYXJnIFRJTV9UU19JVFIxMDogSW50ZXJuYWwgVHJpZ2dlciAxMAorICogICAgICAgICAgICBAYXJnIFRJTV9UU19JVFIxMTogSW50ZXJuYWwgVHJpZ2dlciAxMQorICogICAgICAgICAgICBAYXJnIFRJTV9UU19USTFGX0VEOiBUSTEgRWRnZSBEZXRlY3RvcgorICogICAgICAgICAgICBAYXJnIFRJTV9UU19USTFGUDE6IEZpbHRlcmVkIFRpbWVyIElucHV0IDEKKyAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfVEkyRlAyOiBGaWx0ZXJlZCBUaW1lciBJbnB1dCAyCisgKiAgICAgICAgICAgIEBhcmcgVElNX1RTX0VUUkY6IEV4dGVybmFsIFRyaWdnZXIgaW5wdXQKKyAqCisgKiAgICAgICAoKikgIFZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICoKKyAqIEByZXR2YWwgTm9uZQorICovCitzdGF0aWMgdm9pZCBUSU1fSVRSeF9TZXRDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IElucHV0VHJpZ2dlclNvdXJjZSkgeworICB1aW50MzJfdCB0bXBzbWNyOworCisgIC8qIEdldCB0aGUgVElNeCBTTUNSIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcHNtY3IgPSBUSU14LT5TTUNSOworICAvKiBSZXNldCB0aGUgVFMgQml0cyAqLworICB0bXBzbWNyICY9IH5USU1fU01DUl9UUzsKKyAgLyogU2V0IHRoZSBJbnB1dCBUcmlnZ2VyIHNvdXJjZSBhbmQgdGhlIHNsYXZlIG1vZGUqLworICB0bXBzbWNyIHw9IChJbnB1dFRyaWdnZXJTb3VyY2UgfCBUSU1fU0xBVkVNT0RFX0VYVEVSTkFMMSk7CisgIC8qIFdyaXRlIHRvIFRJTXggU01DUiAqLworICBUSU14LT5TTUNSID0gdG1wc21jcjsKK30KKy8qKgorICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBUSU14IEV4dGVybmFsIFRyaWdnZXIgKEVUUikuCisgKiBAcGFyYW0gIFRJTXggdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbAorICogQHBhcmFtICBUSU1fRXh0VFJHUHJlc2NhbGVyIFRoZSBleHRlcm5hbCBUcmlnZ2VyIFByZXNjYWxlci4KKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgVElNX0VUUlBSRVNDQUxFUl9ESVYxOiBFVFJQIFByZXNjYWxlciBPRkYuCisgKiAgICAgICAgICAgIEBhcmcgVElNX0VUUlBSRVNDQUxFUl9ESVYyOiBFVFJQIGZyZXF1ZW5jeSBkaXZpZGVkIGJ5IDIuCisgKiAgICAgICAgICAgIEBhcmcgVElNX0VUUlBSRVNDQUxFUl9ESVY0OiBFVFJQIGZyZXF1ZW5jeSBkaXZpZGVkIGJ5IDQuCisgKiAgICAgICAgICAgIEBhcmcgVElNX0VUUlBSRVNDQUxFUl9ESVY4OiBFVFJQIGZyZXF1ZW5jeSBkaXZpZGVkIGJ5IDguCisgKiBAcGFyYW0gIFRJTV9FeHRUUkdQb2xhcml0eSBUaGUgZXh0ZXJuYWwgVHJpZ2dlciBQb2xhcml0eS4KKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgVElNX0VUUlBPTEFSSVRZX0lOVkVSVEVEOiBhY3RpdmUgbG93IG9yIGZhbGxpbmcgZWRnZSBhY3RpdmUuCisgKiAgICAgICAgICAgIEBhcmcgVElNX0VUUlBPTEFSSVRZX05PTklOVkVSVEVEOiBhY3RpdmUgaGlnaCBvciByaXNpbmcgZWRnZQorICogYWN0aXZlLgorICogQHBhcmFtICBFeHRUUkdGaWx0ZXIgRXh0ZXJuYWwgVHJpZ2dlciBGaWx0ZXIuCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwIGFuZCAweDBGCisgKiBAcmV0dmFsIE5vbmUKKyAqLwordm9pZCBUSU1fRVRSX1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgVElNX0V4dFRSR1ByZXNjYWxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVElNX0V4dFRSR1BvbGFyaXR5LCB1aW50MzJfdCBFeHRUUkdGaWx0ZXIpIHsKKyAgdWludDMyX3QgdG1wc21jcjsKKworICB0bXBzbWNyID0gVElNeC0+U01DUjsKKworICAvKiBSZXNldCB0aGUgRVRSIEJpdHMgKi8KKyAgdG1wc21jciAmPSB+KFRJTV9TTUNSX0VURiB8IFRJTV9TTUNSX0VUUFMgfCBUSU1fU01DUl9FQ0UgfCBUSU1fU01DUl9FVFApOworCisgIC8qIFNldCB0aGUgUHJlc2NhbGVyLCB0aGUgRmlsdGVyIHZhbHVlIGFuZCB0aGUgUG9sYXJpdHkgKi8KKyAgdG1wc21jciB8PSAodWludDMyX3QpKFRJTV9FeHRUUkdQcmVzY2FsZXIgfAorICAgICAgICAgICAgICAgICAgICAgICAgKFRJTV9FeHRUUkdQb2xhcml0eSB8IChFeHRUUkdGaWx0ZXIgPDwgOFUpKSk7CisKKyAgLyogV3JpdGUgdG8gVElNeCBTTUNSICovCisgIFRJTXgtPlNNQ1IgPSB0bXBzbWNyOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgVElNIENhcHR1cmUgQ29tcGFyZSBDaGFubmVsIHguCisgKiBAcGFyYW0gIFRJTXggdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbAorICogQHBhcmFtICBDaGFubmVsIHNwZWNpZmllcyB0aGUgVElNIENoYW5uZWwKKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMQorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNAorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzU6IFRJTSBDaGFubmVsIDUgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF82OiBUSU0gQ2hhbm5lbCA2IHNlbGVjdGVkCisgKiBAcGFyYW0gIENoYW5uZWxTdGF0ZSBzcGVjaWZpZXMgdGhlIFRJTSBDaGFubmVsIENDeEUgYml0IG5ldyBzdGF0ZS4KKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogVElNX0NDeF9FTkFCTEUgb3IgVElNX0NDeF9ESVNBQkxFLgorICogQHJldHZhbCBOb25lCisgKi8KK3ZvaWQgVElNX0NDeENoYW5uZWxDbWQoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWxTdGF0ZSkgeworICB1aW50MzJfdCB0bXA7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzFfSU5TVEFOQ0UoVElNeCkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NIQU5ORUxTKENoYW5uZWwpKTsKKworICB0bXAgPSBUSU1fQ0NFUl9DQzFFIDw8IChDaGFubmVsICYgMHgxRlUpOyAvKiAweDFGVSA9IDMxIGJpdHMgbWF4IHNoaWZ0ICovCisKKyAgLyogUmVzZXQgdGhlIENDeEUgQml0ICovCisgIFRJTXgtPkNDRVIgJj0gfnRtcDsKKworICAvKiBTZXQgb3IgcmVzZXQgdGhlIENDeEUgQml0ICovCisgIFRJTXgtPkNDRVIgfD0KKyAgICAgICh1aW50MzJfdCkoQ2hhbm5lbFN0YXRlCisgICAgICAgICAgICAgICAgIDw8IChDaGFubmVsICYgMHgxRlUpKTsgLyogMHgxRlUgPSAzMSBiaXRzIG1heCBzaGlmdCAqLworfQorCisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorLyoqCisgKiBAYnJpZWYgIFJlc2V0IGludGVycnVwdCBjYWxsYmFja3MgdG8gdGhlIGxlZ2FjeSB3ZWFrIGNhbGxiYWNrcy4KKyAqIEBwYXJhbSAgaHRpbSBwb2ludGVyIHRvIGEgVElNX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBUSU0gbW9kdWxlLgorICogQHJldHZhbCBOb25lCisgKi8KK3ZvaWQgVElNX1Jlc2V0Q2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pIHsKKyAgLyogUmVzZXQgdGhlIFRJTSBjYWxsYmFjayB0byB0aGUgbGVnYWN5IHdlYWsgY2FsbGJhY2tzICovCisgIGh0aW0tPlBlcmlvZEVsYXBzZWRDYWxsYmFjayA9IEhBTF9USU1fUGVyaW9kRWxhcHNlZENhbGxiYWNrOworICBodGltLT5QZXJpb2RFbGFwc2VkSGFsZkNwbHRDYWxsYmFjayA9IEhBTF9USU1fUGVyaW9kRWxhcHNlZEhhbGZDcGx0Q2FsbGJhY2s7CisgIGh0aW0tPlRyaWdnZXJDYWxsYmFjayA9IEhBTF9USU1fVHJpZ2dlckNhbGxiYWNrOworICBodGltLT5UcmlnZ2VySGFsZkNwbHRDYWxsYmFjayA9IEhBTF9USU1fVHJpZ2dlckhhbGZDcGx0Q2FsbGJhY2s7CisgIGh0aW0tPklDX0NhcHR1cmVDYWxsYmFjayA9IEhBTF9USU1fSUNfQ2FwdHVyZUNhbGxiYWNrOworICBodGltLT5JQ19DYXB0dXJlSGFsZkNwbHRDYWxsYmFjayA9IEhBTF9USU1fSUNfQ2FwdHVyZUhhbGZDcGx0Q2FsbGJhY2s7CisgIGh0aW0tPk9DX0RlbGF5RWxhcHNlZENhbGxiYWNrID0gSEFMX1RJTV9PQ19EZWxheUVsYXBzZWRDYWxsYmFjazsKKyAgaHRpbS0+UFdNX1B1bHNlRmluaXNoZWRDYWxsYmFjayA9IEhBTF9USU1fUFdNX1B1bHNlRmluaXNoZWRDYWxsYmFjazsKKyAgaHRpbS0+UFdNX1B1bHNlRmluaXNoZWRIYWxmQ3BsdENhbGxiYWNrID0KKyAgICAgIEhBTF9USU1fUFdNX1B1bHNlRmluaXNoZWRIYWxmQ3BsdENhbGxiYWNrOworICBodGltLT5FcnJvckNhbGxiYWNrID0gSEFMX1RJTV9FcnJvckNhbGxiYWNrOworICBodGltLT5Db21tdXRhdGlvbkNhbGxiYWNrID0gSEFMX1RJTUV4X0NvbW11dENhbGxiYWNrOworICBodGltLT5Db21tdXRhdGlvbkhhbGZDcGx0Q2FsbGJhY2sgPSBIQUxfVElNRXhfQ29tbXV0SGFsZkNwbHRDYWxsYmFjazsKKyAgaHRpbS0+QnJlYWtDYWxsYmFjayA9IEhBTF9USU1FeF9CcmVha0NhbGxiYWNrOworICBodGltLT5CcmVhazJDYWxsYmFjayA9IEhBTF9USU1FeF9CcmVhazJDYWxsYmFjazsKKyAgaHRpbS0+RW5jb2RlckluZGV4Q2FsbGJhY2sgPSBIQUxfVElNRXhfRW5jb2RlckluZGV4Q2FsbGJhY2s7CisgIGh0aW0tPkRpcmVjdGlvbkNoYW5nZUNhbGxiYWNrID0gSEFMX1RJTUV4X0RpcmVjdGlvbkNoYW5nZUNhbGxiYWNrOworICBodGltLT5JbmRleEVycm9yQ2FsbGJhY2sgPSBIQUxfVElNRXhfSW5kZXhFcnJvckNhbGxiYWNrOworICBodGltLT5UcmFuc2l0aW9uRXJyb3JDYWxsYmFjayA9IEhBTF9USU1FeF9UcmFuc2l0aW9uRXJyb3JDYWxsYmFjazsKK30KKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqCisgKiBAfQorICovCisKKyNlbmRpZiAvKiBIQUxfVElNX01PRFVMRV9FTkFCTEVEICovCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCmRpZmYgLS1naXQgYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfdGltX2V4LmMgYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfdGltX2V4LmMKaW5kZXggMDY2YzQ2OS4uMWVkNzBlZSAxMDA2NDQKLS0tIGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3RpbV9leC5jCisrKyBiL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF90aW1fZXguYwpAQCAtMSwzODIyICsxLDM4MDQgQEAKLS8qKg0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICAqIEBmaWxlICAgIHN0bTMyZzR4eF9oYWxfdGltX2V4LmMNCi0gICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0NCi0gICogQGJyaWVmICAgVElNIEhBTCBtb2R1bGUgZHJpdmVyLg0KLSAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nDQotICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgVGltZXIgRXh0ZW5kZWQgcGVyaXBoZXJhbDoNCi0gICogICAgICAgICAgICsgVGltZSBIYWxsIFNlbnNvciBJbnRlcmZhY2UgSW5pdGlhbGl6YXRpb24NCi0gICogICAgICAgICAgICsgVGltZSBIYWxsIFNlbnNvciBJbnRlcmZhY2UgU3RhcnQNCi0gICogICAgICAgICAgICsgVGltZSBDb21wbGVtZW50YXJ5IHNpZ25hbCBicmVhayBhbmQgZGVhZCB0aW1lIGNvbmZpZ3VyYXRpb24NCi0gICogICAgICAgICAgICsgVGltZSBNYXN0ZXIgYW5kIFNsYXZlIHN5bmNocm9uaXphdGlvbiBjb25maWd1cmF0aW9uDQotICAqICAgICAgICAgICArIFRpbWUgT3V0cHV0IENvbXBhcmUvUFdNIENoYW5uZWwgQ29uZmlndXJhdGlvbiAoZm9yIGNoYW5uZWxzIDUNCi0gIGFuZCA2KQ0KLSAgKiAgICAgICAgICAgKyBUaW1lIE9DUmVmIGNsZWFyIGNvbmZpZ3VyYXRpb24NCi0gICogICAgICAgICAgICsgVGltZXIgcmVtYXBwaW5nIGNhcGFiaWxpdGllcyBjb25maWd1cmF0aW9uDQotICAqICAgICAgICAgICArIFRpbWVyIGVuY29kZXIgaW5kZXggY29uZmlndXJhdGlvbg0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICAqIEBhdHRlbnRpb24NCi0gICoNCi0gICogQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4NCi0gICogQWxsIHJpZ2h0cyByZXNlcnZlZC4NCi0gICoNCi0gICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0ZXJtcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlDQotICAqIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4NCi0gICogSWYgbm8gTElDRU5TRSBmaWxlIGNvbWVzIHdpdGggdGhpcyBzb2Z0d2FyZSwgaXQgaXMgcHJvdmlkZWQgQVMtSVMuDQotICAqDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gIEB2ZXJiYXRpbQ0KLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFRJTUVSIEV4dGVuZGVkIGZlYXR1cmVzICMjIyMjDQotICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gIFsuLl0NCi0gICAgVGhlIFRpbWVyIEV4dGVuZGVkIGZlYXR1cmVzIGluY2x1ZGU6DQotICAgICgjKSBDb21wbGVtZW50YXJ5IG91dHB1dHMgd2l0aCBwcm9ncmFtbWFibGUgZGVhZC10aW1lIGZvciA6DQotICAgICAgICAoKyspIE91dHB1dCBDb21wYXJlDQotICAgICAgICAoKyspIFBXTSBnZW5lcmF0aW9uIChFZGdlIGFuZCBDZW50ZXItYWxpZ25lZCBNb2RlKQ0KLSAgICAgICAgKCsrKSBPbmUtcHVsc2UgbW9kZSBvdXRwdXQNCi0gICAgKCMpIFN5bmNocm9uaXphdGlvbiBjaXJjdWl0IHRvIGNvbnRyb2wgdGhlIHRpbWVyIHdpdGggZXh0ZXJuYWwgc2lnbmFscyBhbmQNCi0gIHRvIGludGVyY29ubmVjdCBzZXZlcmFsIHRpbWVycyB0b2dldGhlci4NCi0gICAgKCMpIEJyZWFrIGlucHV0IHRvIHB1dCB0aGUgdGltZXIgb3V0cHV0IHNpZ25hbHMgaW4gcmVzZXQgc3RhdGUgb3IgaW4gYSBrbm93bg0KLSAgc3RhdGUuDQotICAgICgjKSBTdXBwb3J0cyBpbmNyZW1lbnRhbCAocXVhZHJhdHVyZSkgZW5jb2RlciBhbmQgaGFsbC1zZW5zb3IgY2lyY3VpdHJ5IGZvcg0KLSAgICAgICAgcG9zaXRpb25pbmcgcHVycG9zZXMNCi0gICAgKCMpIEluIGNhc2Ugb2YgUHVsc2Ugb24gY29tcGFyZSwgY29uZmlndXJlIHB1bHNlIGxlbmd0aCBhbmQgZGVsYXkNCi0gICAgKCMpIEVuY29kZXIgaW5kZXggY29uZmlndXJhdGlvbg0KLQ0KLSAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMNCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICBbLi5dDQotICAgICAoIykgSW5pdGlhbGl6ZSB0aGUgVElNIGxvdyBsZXZlbCByZXNvdXJjZXMgYnkgaW1wbGVtZW50aW5nIHRoZSBmb2xsb3dpbmcNCi0gIGZ1bmN0aW9ucyBkZXBlbmRpbmcgb24gdGhlIHNlbGVjdGVkIGZlYXR1cmU6DQotICAgICAgICAgICAoKyspIEhhbGwgU2Vuc29yIG91dHB1dCA6IEhBTF9USU1FeF9IYWxsU2Vuc29yX01zcEluaXQoKQ0KLQ0KLSAgICAgKCMpIEluaXRpYWxpemUgdGhlIFRJTSBsb3cgbGV2ZWwgcmVzb3VyY2VzIDoNCi0gICAgICAgICgjIykgRW5hYmxlIHRoZSBUSU0gaW50ZXJmYWNlIGNsb2NrIHVzaW5nIF9fSEFMX1JDQ19USU14X0NMS19FTkFCTEUoKTsNCi0gICAgICAgICgjIykgVElNIHBpbnMgY29uZmlndXJhdGlvbg0KLSAgICAgICAgICAgICgrKyspIEVuYWJsZSB0aGUgY2xvY2sgZm9yIHRoZSBUSU0gR1BJT3MgdXNpbmcgdGhlIGZvbGxvd2luZw0KLSAgZnVuY3Rpb246DQotICAgICAgICAgICAgICBfX0hBTF9SQ0NfR1BJT3hfQ0xLX0VOQUJMRSgpOw0KLSAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGVzZSBUSU0gcGlucyBpbiBBbHRlcm5hdGUgZnVuY3Rpb24gbW9kZSB1c2luZw0KLSAgSEFMX0dQSU9fSW5pdCgpOw0KLQ0KLSAgICAgKCMpIFRoZSBleHRlcm5hbCBDbG9jayBjYW4gYmUgY29uZmlndXJlZCwgaWYgbmVlZGVkICh0aGUgZGVmYXVsdCBjbG9jayBpcw0KLSAgdGhlIGludGVybmFsIGNsb2NrIGZyb20gdGhlIEFQQngpLCB1c2luZyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uOg0KLSAgICAgICAgIEhBTF9USU1fQ29uZmlnQ2xvY2tTb3VyY2UsIHRoZSBjbG9jayBjb25maWd1cmF0aW9uIHNob3VsZCBiZSBkb25lDQotICBiZWZvcmUgYW55IHN0YXJ0IGZ1bmN0aW9uLg0KLQ0KLSAgICAgKCMpIENvbmZpZ3VyZSB0aGUgVElNIGluIHRoZSBkZXNpcmVkIGZ1bmN0aW9uaW5nIG1vZGUgdXNpbmcgb25lIG9mIHRoZQ0KLSAgICAgICAgIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIG9mIHRoaXMgZHJpdmVyOg0KLSAgICAgICAgICAoKyspIEhBTF9USU1FeF9IYWxsU2Vuc29yX0luaXQoKSBhbmQgSEFMX1RJTUV4X0NvbmZpZ0NvbW11dEV2ZW50KCk6IHRvDQotICB1c2UgdGhlIFRpbWVyIEhhbGwgU2Vuc29yIEludGVyZmFjZSBhbmQgdGhlIGNvbW11dGF0aW9uIGV2ZW50IHdpdGggdGhlDQotICBjb3JyZXNwb25kaW5nIEludGVycnVwdCBhbmQgRE1BIHJlcXVlc3QgaWYgbmVlZGVkIChOb3RlIHRoYXQgT25lIFRpbWVyIGlzIHVzZWQNCi0gIHRvIGludGVyZmFjZSB3aXRoIHRoZSBIYWxsIHNlbnNvciBJbnRlcmZhY2UgYW5kIGFub3RoZXIgVGltZXIgc2hvdWxkIGJlIHVzZWQNCi0gIHRvIHVzZSB0aGUgY29tbXV0YXRpb24gZXZlbnQpLg0KLSAgICAgKCMpIEluIGNhc2Ugb2YgUHVsc2UgT24gQ29tcGFyZToNCi0gICAgICAgICAgICgrKykgSEFMX1RJTUV4X09DX0NvbmZpZ1B1bHNlT25Db21wYXJlKCk6IHRvIGNvbmZpZ3VyZSBwdWxzZSB3aWR0aA0KLSAgYW5kIHByZXNjYWxlcg0KLQ0KLQ0KLSAgICAgKCMpIEFjdGl2YXRlIHRoZSBUSU0gcGVyaXBoZXJhbCB1c2luZyBvbmUgb2YgdGhlIHN0YXJ0IGZ1bmN0aW9uczoNCi0gICAgICAgICAgICgrKykgQ29tcGxlbWVudGFyeSBPdXRwdXQgQ29tcGFyZSA6IEhBTF9USU1FeF9PQ05fU3RhcnQoKSwNCi0gIEhBTF9USU1FeF9PQ05fU3RhcnRfRE1BKCksIEhBTF9USU1FeF9PQ05fU3RhcnRfSVQoKQ0KLSAgICAgICAgICAgKCsrKSBDb21wbGVtZW50YXJ5IFBXTSBnZW5lcmF0aW9uIDogSEFMX1RJTUV4X1BXTU5fU3RhcnQoKSwNCi0gIEhBTF9USU1FeF9QV01OX1N0YXJ0X0RNQSgpLCBIQUxfVElNRXhfUFdNTl9TdGFydF9JVCgpDQotICAgICAgICAgICAoKyspIENvbXBsZW1lbnRhcnkgT25lLXB1bHNlIG1vZGUgb3V0cHV0IDoNCi0gIEhBTF9USU1FeF9PbmVQdWxzZU5fU3RhcnQoKSwgSEFMX1RJTUV4X09uZVB1bHNlTl9TdGFydF9JVCgpDQotICAgICAgICAgICAoKyspIEhhbGwgU2Vuc29yIG91dHB1dCA6IEhBTF9USU1FeF9IYWxsU2Vuc29yX1N0YXJ0KCksDQotICBIQUxfVElNRXhfSGFsbFNlbnNvcl9TdGFydF9ETUEoKSwgSEFMX1RJTUV4X0hhbGxTZW5zb3JfU3RhcnRfSVQoKS4NCi0NCi0gIEBlbmR2ZXJiYXRpbQ0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICAqLw0KLQ0KLS8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotI2luY2x1ZGUgInN0bTMyZzR4eF9oYWwuaCINCi0NCi0vKiogQGFkZHRvZ3JvdXAgU1RNMzJHNHh4X0hBTF9Ecml2ZXINCi0gKiBAew0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNRXggVElNRXgNCi0gKiBAYnJpZWYgVElNIEV4dGVuZGVkIEhBTCBtb2R1bGUgZHJpdmVyDQotICogQHsNCi0gKi8NCi0NCi0jaWZkZWYgSEFMX1RJTV9NT0RVTEVfRU5BQkxFRA0KLQ0KLS8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgVElNRXhfUHJpdmF0ZV9Db25zdGFudHMgVElNIEV4dGVuZGVkIFByaXZhdGUgQ29uc3RhbnRzDQotICogQHsNCi0gKi8NCi0vKiBUaW1lb3V0IGZvciBicmVhayBpbnB1dCByZWFybSAqLw0KLSNkZWZpbmUgVElNX0JSRUFLSU5QVVRfUkVBUk1fVElNRU9VVCA1VUwgLyogNSBtaWxsaXNlY29uZHMgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLS8qIEVuZCBvZiBwcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotDQotLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotc3RhdGljIHZvaWQgVElNX0RNQURlbGF5UHVsc2VOQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7DQotc3RhdGljIHZvaWQgVElNX0RNQUVycm9yQ0N4TihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7DQotc3RhdGljIHZvaWQgVElNX0NDeE5DaGFubmVsQ21kKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDaGFubmVsLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsTlN0YXRlKTsNCi0NCi0vKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgVElNRXhfRXhwb3J0ZWRfRnVuY3Rpb25zIFRJTSBFeHRlbmRlZCBFeHBvcnRlZCBGdW5jdGlvbnMNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBFeHRlbmRlZCBUaW1lciBIYWxsIFNlbnNvcg0KLWZ1bmN0aW9ucw0KLSAgKiBAYnJpZWYgICAgVGltZXIgSGFsbCBTZW5zb3IgZnVuY3Rpb25zDQotICAqDQotQHZlcmJhdGltDQotICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgICAgICAgICAgICAgICAgICAgIyMjIyMgVGltZXIgSGFsbCBTZW5zb3IgZnVuY3Rpb25zICMjIyMjDQotICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gIFsuLl0NCi0gICAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoNCi0gICAgKCspIEluaXRpYWxpemUgYW5kIGNvbmZpZ3VyZSBUSU0gSEFMIFNlbnNvci4NCi0gICAgKCspIERlLWluaXRpYWxpemUgVElNIEhBTCBTZW5zb3IuDQotICAgICgrKSBTdGFydCB0aGUgSGFsbCBTZW5zb3IgSW50ZXJmYWNlLg0KLSAgICAoKykgU3RvcCB0aGUgSGFsbCBTZW5zb3IgSW50ZXJmYWNlLg0KLSAgICAoKykgU3RhcnQgdGhlIEhhbGwgU2Vuc29yIEludGVyZmFjZSBhbmQgZW5hYmxlIGludGVycnVwdHMuDQotICAgICgrKSBTdG9wIHRoZSBIYWxsIFNlbnNvciBJbnRlcmZhY2UgYW5kIGRpc2FibGUgaW50ZXJydXB0cy4NCi0gICAgKCspIFN0YXJ0IHRoZSBIYWxsIFNlbnNvciBJbnRlcmZhY2UgYW5kIGVuYWJsZSBETUEgdHJhbnNmZXJzLg0KLSAgICAoKykgU3RvcCB0aGUgSGFsbCBTZW5zb3IgSW50ZXJmYWNlIGFuZCBkaXNhYmxlIERNQSB0cmFuc2ZlcnMuDQotDQotQGVuZHZlcmJhdGltDQotICAqIEB7DQotICAqLw0KLS8qKg0KLSAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFRJTSBIYWxsIFNlbnNvciBJbnRlcmZhY2UgYW5kIGluaXRpYWxpemUgdGhlDQotICogYXNzb2NpYXRlZCBoYW5kbGUuDQotICogQG5vdGUgICBXaGVuIHRoZSB0aW1lciBpbnN0YW5jZSBpcyBpbml0aWFsaXplZCBpbiBIYWxsIFNlbnNvciBJbnRlcmZhY2UgbW9kZSwNCi0gKiAgICAgICAgIHRpbWVyIGNoYW5uZWxzIDEgYW5kIGNoYW5uZWwgMiBhcmUgcmVzZXJ2ZWQgYW5kIGNhbm5vdCBiZSB1c2VkIGZvcg0KLSAqICAgICAgICAgb3RoZXIgcHVycG9zZS4NCi0gKiBAcGFyYW0gIGh0aW0gVElNIEhhbGwgU2Vuc29yIEludGVyZmFjZSBoYW5kbGUNCi0gKiBAcGFyYW0gIHNDb25maWcgVElNIEhhbGwgU2Vuc29yIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0hhbGxTZW5zb3JfSW5pdCgNCi0gICAgVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIFRJTV9IYWxsU2Vuc29yX0luaXRUeXBlRGVmICpzQ29uZmlnKSB7DQotICBUSU1fT0NfSW5pdFR5cGVEZWYgT0NfQ29uZmlnOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIFRJTSBoYW5kbGUgYWxsb2NhdGlvbiAqLw0KLSAgaWYgKGh0aW0gPT0gTlVMTCkgew0KLSAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgfQ0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fSEFMTF9TRU5TT1JfSU5URVJGQUNFX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0NPVU5URVJfTU9ERShodGltLT5Jbml0LkNvdW50ZXJNb2RlKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMT0NLRElWSVNJT05fRElWKGh0aW0tPkluaXQuQ2xvY2tEaXZpc2lvbikpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9BVVRPUkVMT0FEX1BSRUxPQUQoaHRpbS0+SW5pdC5BdXRvUmVsb2FkUHJlbG9hZCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JQ19QT0xBUklUWShzQ29uZmlnLT5JQzFQb2xhcml0eSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JQ19QUkVTQ0FMRVIoc0NvbmZpZy0+SUMxUHJlc2NhbGVyKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0lDX0ZJTFRFUihzQ29uZmlnLT5JQzFGaWx0ZXIpKTsNCi0NCi0gIGlmIChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX1JFU0VUKSB7DQotICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8NCi0gICAgaHRpbS0+TG9jayA9IEhBTF9VTkxPQ0tFRDsNCi0NCi0jaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQ0KLSAgICAvKiBSZXNldCBpbnRlcnJ1cHQgY2FsbGJhY2tzIHRvIGxlZ2FjeSB3ZWVrIGNhbGxiYWNrcyAqLw0KLSAgICBUSU1fUmVzZXRDYWxsYmFjayhodGltKTsNCi0NCi0gICAgaWYgKGh0aW0tPkhhbGxTZW5zb3JfTXNwSW5pdENhbGxiYWNrID09IE5VTEwpIHsNCi0gICAgICBodGltLT5IYWxsU2Vuc29yX01zcEluaXRDYWxsYmFjayA9IEhBTF9USU1FeF9IYWxsU2Vuc29yX01zcEluaXQ7DQotICAgIH0NCi0gICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIDogR1BJTywgQ0xPQ0ssIE5WSUMgKi8NCi0gICAgaHRpbS0+SGFsbFNlbnNvcl9Nc3BJbml0Q2FsbGJhY2soaHRpbSk7DQotI2Vsc2UNCi0gICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIDogR1BJTywgQ0xPQ0ssIE5WSUMgYW5kIERNQSAqLw0KLSAgICBIQUxfVElNRXhfSGFsbFNlbnNvcl9Nc3BJbml0KGh0aW0pOw0KLSNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi0gIH0NCi0NCi0gIC8qIFNldCB0aGUgVElNIHN0YXRlICovDQotICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfQlVTWTsNCi0NCi0gIC8qIENvbmZpZ3VyZSB0aGUgVGltZSBiYXNlIGluIHRoZSBFbmNvZGVyIE1vZGUgKi8NCi0gIFRJTV9CYXNlX1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgJmh0aW0tPkluaXQpOw0KLQ0KLSAgLyogQ29uZmlndXJlIHRoZSBDaGFubmVsIDEgYXMgSW5wdXQgQ2hhbm5lbCB0byBpbnRlcmZhY2Ugd2l0aCB0aGUgdGhyZWUNCi0gICAqIE91dHB1dHMgb2YgdGhlICBIYWxsIHNlbnNvciAqLw0KLSAgVElNX1RJMV9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsIHNDb25maWctPklDMVBvbGFyaXR5LCBUSU1fSUNTRUxFQ1RJT05fVFJDLA0KLSAgICAgICAgICAgICAgICAgICAgc0NvbmZpZy0+SUMxRmlsdGVyKTsNCi0NCi0gIC8qIFJlc2V0IHRoZSBJQzFQU0MgQml0cyAqLw0KLSAgaHRpbS0+SW5zdGFuY2UtPkNDTVIxICY9IH5USU1fQ0NNUjFfSUMxUFNDOw0KLSAgLyogU2V0IHRoZSBJQzFQU0MgdmFsdWUgKi8NCi0gIGh0aW0tPkluc3RhbmNlLT5DQ01SMSB8PSBzQ29uZmlnLT5JQzFQcmVzY2FsZXI7DQotDQotICAvKiBFbmFibGUgdGhlIEhhbGwgc2Vuc29yIGludGVyZmFjZSAoWE9SIGZ1bmN0aW9uIG9mIHRoZSB0aHJlZSBpbnB1dHMpICovDQotICBodGltLT5JbnN0YW5jZS0+Q1IyIHw9IFRJTV9DUjJfVEkxUzsNCi0NCi0gIC8qIFNlbGVjdCB0aGUgVElNX1RTX1RJMUZfRUQgc2lnbmFsIGFzIElucHV0IHRyaWdnZXIgZm9yIHRoZSBUSU0gKi8NCi0gIGh0aW0tPkluc3RhbmNlLT5TTUNSICY9IH5USU1fU01DUl9UUzsNCi0gIGh0aW0tPkluc3RhbmNlLT5TTUNSIHw9IFRJTV9UU19USTFGX0VEOw0KLQ0KLSAgLyogVXNlIHRoZSBUSU1fVFNfVEkxRl9FRCBzaWduYWwgdG8gcmVzZXQgdGhlIFRJTSBjb3VudGVyIGVhY2ggZWRnZSBkZXRlY3Rpb24NCi0gICAqLw0KLSAgaHRpbS0+SW5zdGFuY2UtPlNNQ1IgJj0gflRJTV9TTUNSX1NNUzsNCi0gIGh0aW0tPkluc3RhbmNlLT5TTUNSIHw9IFRJTV9TTEFWRU1PREVfUkVTRVQ7DQotDQotICAvKiBQcm9ncmFtIGNoYW5uZWwgMiBpbiBQV00gMiBtb2RlIHdpdGggdGhlIGRlc2lyZWQgQ29tbXV0YXRpb25fRGVsYXkqLw0KLSAgT0NfQ29uZmlnLk9DRmFzdE1vZGUgPSBUSU1fT0NGQVNUX0RJU0FCTEU7DQotICBPQ19Db25maWcuT0NJZGxlU3RhdGUgPSBUSU1fT0NJRExFU1RBVEVfUkVTRVQ7DQotICBPQ19Db25maWcuT0NNb2RlID0gVElNX09DTU9ERV9QV00yOw0KLSAgT0NfQ29uZmlnLk9DTklkbGVTdGF0ZSA9IFRJTV9PQ05JRExFU1RBVEVfUkVTRVQ7DQotICBPQ19Db25maWcuT0NOUG9sYXJpdHkgPSBUSU1fT0NOUE9MQVJJVFlfSElHSDsNCi0gIE9DX0NvbmZpZy5PQ1BvbGFyaXR5ID0gVElNX09DUE9MQVJJVFlfSElHSDsNCi0gIE9DX0NvbmZpZy5QdWxzZSA9IHNDb25maWctPkNvbW11dGF0aW9uX0RlbGF5Ow0KLQ0KLSAgVElNX09DMl9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsICZPQ19Db25maWcpOw0KLQ0KLSAgLyogU2VsZWN0IE9DMlJFRiBhcyB0cmlnZ2VyIG91dHB1dCBvbiBUUkdPOiB3cml0ZSB0aGUgTU1TIGJpdHMgaW4gdGhlIFRJTXhfQ1IyDQotICAgIHJlZ2lzdGVyIHRvIDEwMSAqLw0KLSAgaHRpbS0+SW5zdGFuY2UtPkNSMiAmPSB+VElNX0NSMl9NTVM7DQotICBodGltLT5JbnN0YW5jZS0+Q1IyIHw9IFRJTV9UUkdPX09DMlJFRjsNCi0NCi0gIC8qIEluaXRpYWxpemUgdGhlIERNQSBidXJzdCBvcGVyYXRpb24gc3RhdGUgKi8NCi0gIGh0aW0tPkRNQUJ1cnN0U3RhdGUgPSBIQUxfRE1BX0JVUlNUX1NUQVRFX1JFQURZOw0KLQ0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgVElNIGNoYW5uZWxzIHN0YXRlICovDQotICBUSU1fQ0hBTk5FTF9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMSwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsNCi0gIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8yLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOw0KLSAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMSwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsNCi0gIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7DQotDQotICAvKiBJbml0aWFsaXplIHRoZSBUSU0gc3RhdGUqLw0KLSAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOw0KLQ0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEZUluaXRpYWxpemVzIHRoZSBUSU0gSGFsbCBTZW5zb3IgaW50ZXJmYWNlDQotICogQHBhcmFtICBodGltIFRJTSBIYWxsIFNlbnNvciBJbnRlcmZhY2UgaGFuZGxlDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0hhbGxTZW5zb3JfRGVJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKSB7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOw0KLQ0KLSAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7DQotDQotICAvKiBEaXNhYmxlIHRoZSBUSU0gUGVyaXBoZXJhbCBDbG9jayAqLw0KLSAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7DQotDQotI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkNCi0gIGlmIChodGltLT5IYWxsU2Vuc29yX01zcERlSW5pdENhbGxiYWNrID09IE5VTEwpIHsNCi0gICAgaHRpbS0+SGFsbFNlbnNvcl9Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9USU1FeF9IYWxsU2Vuc29yX01zcERlSW5pdDsNCi0gIH0NCi0gIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovDQotICBodGltLT5IYWxsU2Vuc29yX01zcERlSW5pdENhbGxiYWNrKGh0aW0pOw0KLSNlbHNlDQotICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZTogR1BJTywgQ0xPQ0ssIE5WSUMgKi8NCi0gIEhBTF9USU1FeF9IYWxsU2Vuc29yX01zcERlSW5pdChodGltKTsNCi0jZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotDQotICAvKiBDaGFuZ2UgdGhlIERNQSBidXJzdCBvcGVyYXRpb24gc3RhdGUgKi8NCi0gIGh0aW0tPkRNQUJ1cnN0U3RhdGUgPSBIQUxfRE1BX0JVUlNUX1NUQVRFX1JFU0VUOw0KLQ0KLSAgLyogQ2hhbmdlIHRoZSBUSU0gY2hhbm5lbHMgc3RhdGUgKi8NCi0gIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8xLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVTRVQpOw0KLSAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRVNFVCk7DQotICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8xLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVTRVQpOw0KLSAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMiwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFU0VUKTsNCi0NCi0gIC8qIENoYW5nZSBUSU0gc3RhdGUgKi8NCi0gIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRVNFVDsNCi0NCi0gIC8qIFJlbGVhc2UgTG9jayAqLw0KLSAgX19IQUxfVU5MT0NLKGh0aW0pOw0KLQ0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgVElNIEhhbGwgU2Vuc29yIE1TUC4NCi0gKiBAcGFyYW0gIGh0aW0gVElNIEhhbGwgU2Vuc29yIEludGVyZmFjZSBoYW5kbGUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX3dlYWsgdm9pZCBIQUxfVElNRXhfSGFsbFNlbnNvcl9Nc3BJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKSB7DQotICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovDQotICBVTlVTRUQoaHRpbSk7DQotDQotICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsDQotICAgICAgICAgICAgdGhlIEhBTF9USU1FeF9IYWxsU2Vuc29yX01zcEluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXINCi0gICAgIGZpbGUNCi0gICAqLw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERlSW5pdGlhbGl6ZXMgVElNIEhhbGwgU2Vuc29yIE1TUC4NCi0gKiBAcGFyYW0gIGh0aW0gVElNIEhhbGwgU2Vuc29yIEludGVyZmFjZSBoYW5kbGUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX3dlYWsgdm9pZCBIQUxfVElNRXhfSGFsbFNlbnNvcl9Nc3BEZUluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pIHsNCi0gIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8NCi0gIFVOVVNFRChodGltKTsNCi0NCi0gIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwNCi0gICAgICAgICAgICB0aGUgSEFMX1RJTUV4X0hhbGxTZW5zb3JfTXNwRGVJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyDQotICAgICBmaWxlDQotICAgKi8NCi19DQotDQotLyoqDQotICogQGJyaWVmICBTdGFydHMgdGhlIFRJTSBIYWxsIFNlbnNvciBJbnRlcmZhY2UuDQotICogQHBhcmFtICBodGltIFRJTSBIYWxsIFNlbnNvciBJbnRlcmZhY2UgaGFuZGxlDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0hhbGxTZW5zb3JfU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pIHsNCi0gIHVpbnQzMl90IHRtcHNtY3I7DQotICBIQUxfVElNX0NoYW5uZWxTdGF0ZVR5cGVEZWYgY2hhbm5lbF8xX3N0YXRlID0NCi0gICAgICBUSU1fQ0hBTk5FTF9TVEFURV9HRVQoaHRpbSwgVElNX0NIQU5ORUxfMSk7DQotICBIQUxfVElNX0NoYW5uZWxTdGF0ZVR5cGVEZWYgY2hhbm5lbF8yX3N0YXRlID0NCi0gICAgICBUSU1fQ0hBTk5FTF9TVEFURV9HRVQoaHRpbSwgVElNX0NIQU5ORUxfMik7DQotICBIQUxfVElNX0NoYW5uZWxTdGF0ZVR5cGVEZWYgY29tcGxlbWVudGFyeV9jaGFubmVsXzFfc3RhdGUgPQ0KLSAgICAgIFRJTV9DSEFOTkVMX05fU1RBVEVfR0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEpOw0KLSAgSEFMX1RJTV9DaGFubmVsU3RhdGVUeXBlRGVmIGNvbXBsZW1lbnRhcnlfY2hhbm5lbF8yX3N0YXRlID0NCi0gICAgICBUSU1fQ0hBTk5FTF9OX1NUQVRFX0dFVChodGltLCBUSU1fQ0hBTk5FTF8yKTsNCi0NCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0hBTExfU0VOU09SX0lOVEVSRkFDRV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIFRJTSBjaGFubmVscyBzdGF0ZSAqLw0KLSAgaWYgKChjaGFubmVsXzFfc3RhdGUgIT0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKSB8fA0KLSAgICAgIChjaGFubmVsXzJfc3RhdGUgIT0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKSB8fA0KLSAgICAgIChjb21wbGVtZW50YXJ5X2NoYW5uZWxfMV9zdGF0ZSAhPSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpIHx8DQotICAgICAgKGNvbXBsZW1lbnRhcnlfY2hhbm5lbF8yX3N0YXRlICE9IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSkpIHsNCi0gICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gIH0NCi0NCi0gIC8qIFNldCB0aGUgVElNIGNoYW5uZWxzIHN0YXRlICovDQotICBUSU1fQ0hBTk5FTF9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMSwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX0JVU1kpOw0KLSAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKTsNCi0gIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKTsNCi0gIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKTsNCi0NCi0gIC8qIEVuYWJsZSB0aGUgSW5wdXQgQ2FwdHVyZSBjaGFubmVsIDENCi0gIChpbiB0aGUgSGFsbCBTZW5zb3IgSW50ZXJmYWNlIHRoZSB0aHJlZSBwb3NzaWJsZSBjaGFubmVscyB0aGF0IGNhbiBiZSB1c2VkIGFyZQ0KLSAgVElNX0NIQU5ORUxfMSwgVElNX0NIQU5ORUxfMiBhbmQgVElNX0NIQU5ORUxfMykgKi8NCi0gIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8xLCBUSU1fQ0N4X0VOQUJMRSk7DQotDQotICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwsIGV4Y2VwdCBpbiB0cmlnZ2VyIG1vZGUgd2hlcmUgZW5hYmxlIGlzIGF1dG9tYXRpY2FsbHkNCi0gICAqIGRvbmUgd2l0aCB0cmlnZ2VyICovDQotICBpZiAoSVNfVElNX1NMQVZFX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSkgew0KLSAgICB0bXBzbWNyID0gaHRpbS0+SW5zdGFuY2UtPlNNQ1IgJiBUSU1fU01DUl9TTVM7DQotICAgIGlmICghSVNfVElNX1NMQVZFTU9ERV9UUklHR0VSX0VOQUJMRUQodG1wc21jcikpIHsNCi0gICAgICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOw0KLSAgICB9DQotICB9IGVsc2Ugew0KLSAgICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOw0KLSAgfQ0KLQ0KLSAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLw0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTdG9wcyB0aGUgVElNIEhhbGwgc2Vuc29yIEludGVyZmFjZS4NCi0gKiBAcGFyYW0gIGh0aW0gVElNIEhhbGwgU2Vuc29yIEludGVyZmFjZSBoYW5kbGUNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfSGFsbFNlbnNvcl9TdG9wKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKSB7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9IQUxMX1NFTlNPUl9JTlRFUkZBQ0VfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsNCi0NCi0gIC8qIERpc2FibGUgdGhlIElucHV0IENhcHR1cmUgY2hhbm5lbHMgMSwgMiBhbmQgMw0KLSAgKGluIHRoZSBIYWxsIFNlbnNvciBJbnRlcmZhY2UgdGhlIHRocmVlIHBvc3NpYmxlIGNoYW5uZWxzIHRoYXQgY2FuIGJlIHVzZWQgYXJlDQotICBUSU1fQ0hBTk5FTF8xLCBUSU1fQ0hBTk5FTF8yIGFuZCBUSU1fQ0hBTk5FTF8zKSAqLw0KLSAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzEsIFRJTV9DQ3hfRElTQUJMRSk7DQotDQotICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovDQotICBfX0hBTF9USU1fRElTQUJMRShodGltKTsNCi0NCi0gIC8qIFNldCB0aGUgVElNIGNoYW5uZWxzIHN0YXRlICovDQotICBUSU1fQ0hBTk5FTF9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMSwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsNCi0gIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8yLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOw0KLSAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMSwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsNCi0gIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7DQotDQotICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovDQotICByZXR1cm4gSEFMX09LOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFN0YXJ0cyB0aGUgVElNIEhhbGwgU2Vuc29yIEludGVyZmFjZSBpbiBpbnRlcnJ1cHQgbW9kZS4NCi0gKiBAcGFyYW0gIGh0aW0gVElNIEhhbGwgU2Vuc29yIEludGVyZmFjZSBoYW5kbGUNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfSGFsbFNlbnNvcl9TdGFydF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkgew0KLSAgdWludDMyX3QgdG1wc21jcjsNCi0gIEhBTF9USU1fQ2hhbm5lbFN0YXRlVHlwZURlZiBjaGFubmVsXzFfc3RhdGUgPQ0KLSAgICAgIFRJTV9DSEFOTkVMX1NUQVRFX0dFVChodGltLCBUSU1fQ0hBTk5FTF8xKTsNCi0gIEhBTF9USU1fQ2hhbm5lbFN0YXRlVHlwZURlZiBjaGFubmVsXzJfc3RhdGUgPQ0KLSAgICAgIFRJTV9DSEFOTkVMX1NUQVRFX0dFVChodGltLCBUSU1fQ0hBTk5FTF8yKTsNCi0gIEhBTF9USU1fQ2hhbm5lbFN0YXRlVHlwZURlZiBjb21wbGVtZW50YXJ5X2NoYW5uZWxfMV9zdGF0ZSA9DQotICAgICAgVElNX0NIQU5ORUxfTl9TVEFURV9HRVQoaHRpbSwgVElNX0NIQU5ORUxfMSk7DQotICBIQUxfVElNX0NoYW5uZWxTdGF0ZVR5cGVEZWYgY29tcGxlbWVudGFyeV9jaGFubmVsXzJfc3RhdGUgPQ0KLSAgICAgIFRJTV9DSEFOTkVMX05fU1RBVEVfR0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIpOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fSEFMTF9TRU5TT1JfSU5URVJGQUNFX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7DQotDQotICAvKiBDaGVjayB0aGUgVElNIGNoYW5uZWxzIHN0YXRlICovDQotICBpZiAoKGNoYW5uZWxfMV9zdGF0ZSAhPSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpIHx8DQotICAgICAgKGNoYW5uZWxfMl9zdGF0ZSAhPSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpIHx8DQotICAgICAgKGNvbXBsZW1lbnRhcnlfY2hhbm5lbF8xX3N0YXRlICE9IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSkgfHwNCi0gICAgICAoY29tcGxlbWVudGFyeV9jaGFubmVsXzJfc3RhdGUgIT0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKSkgew0KLSAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgfQ0KLQ0KLSAgLyogU2V0IHRoZSBUSU0gY2hhbm5lbHMgc3RhdGUgKi8NCi0gIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8xLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSk7DQotICBUSU1fQ0hBTk5FTF9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMiwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX0JVU1kpOw0KLSAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMSwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX0JVU1kpOw0KLSAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMiwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX0JVU1kpOw0KLQ0KLSAgLyogRW5hYmxlIHRoZSBjYXB0dXJlIGNvbXBhcmUgSW50ZXJydXB0cyAxIGV2ZW50ICovDQotICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzEpOw0KLQ0KLSAgLyogRW5hYmxlIHRoZSBJbnB1dCBDYXB0dXJlIGNoYW5uZWwgMQ0KLSAgKGluIHRoZSBIYWxsIFNlbnNvciBJbnRlcmZhY2UgdGhlIHRocmVlIHBvc3NpYmxlIGNoYW5uZWxzIHRoYXQgY2FuIGJlIHVzZWQgYXJlDQotICBUSU1fQ0hBTk5FTF8xLCBUSU1fQ0hBTk5FTF8yIGFuZCBUSU1fQ0hBTk5FTF8zKSAqLw0KLSAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzEsIFRJTV9DQ3hfRU5BQkxFKTsNCi0NCi0gIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCwgZXhjZXB0IGluIHRyaWdnZXIgbW9kZSB3aGVyZSBlbmFibGUgaXMgYXV0b21hdGljYWxseQ0KLSAgICogZG9uZSB3aXRoIHRyaWdnZXIgKi8NCi0gIGlmIChJU19USU1fU0xBVkVfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKSB7DQotICAgIHRtcHNtY3IgPSBodGltLT5JbnN0YW5jZS0+U01DUiAmIFRJTV9TTUNSX1NNUzsNCi0gICAgaWYgKCFJU19USU1fU0xBVkVNT0RFX1RSSUdHRVJfRU5BQkxFRCh0bXBzbWNyKSkgew0KLSAgICAgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7DQotICAgIH0NCi0gIH0gZWxzZSB7DQotICAgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7DQotICB9DQotDQotICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovDQotICByZXR1cm4gSEFMX09LOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFN0b3BzIHRoZSBUSU0gSGFsbCBTZW5zb3IgSW50ZXJmYWNlIGluIGludGVycnVwdCBtb2RlLg0KLSAqIEBwYXJhbSAgaHRpbSBUSU0gSGFsbCBTZW5zb3IgSW50ZXJmYWNlIGhhbmRsZQ0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9IYWxsU2Vuc29yX1N0b3BfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pIHsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0hBTExfU0VOU09SX0lOVEVSRkFDRV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOw0KLQ0KLSAgLyogRGlzYWJsZSB0aGUgSW5wdXQgQ2FwdHVyZSBjaGFubmVsIDENCi0gIChpbiB0aGUgSGFsbCBTZW5zb3IgSW50ZXJmYWNlIHRoZSB0aHJlZSBwb3NzaWJsZSBjaGFubmVscyB0aGF0IGNhbiBiZSB1c2VkIGFyZQ0KLSAgVElNX0NIQU5ORUxfMSwgVElNX0NIQU5ORUxfMiBhbmQgVElNX0NIQU5ORUxfMykgKi8NCi0gIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8xLCBUSU1fQ0N4X0RJU0FCTEUpOw0KLQ0KLSAgLyogRGlzYWJsZSB0aGUgY2FwdHVyZSBjb21wYXJlIEludGVycnVwdHMgZXZlbnQgKi8NCi0gIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzEpOw0KLQ0KLSAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLw0KLSAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7DQotDQotICAvKiBTZXQgdGhlIFRJTSBjaGFubmVscyBzdGF0ZSAqLw0KLSAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7DQotICBUSU1fQ0hBTk5FTF9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMiwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsNCi0gIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7DQotICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8yLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOw0KLQ0KLSAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLw0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTdGFydHMgdGhlIFRJTSBIYWxsIFNlbnNvciBJbnRlcmZhY2UgaW4gRE1BIG1vZGUuDQotICogQHBhcmFtICBodGltIFRJTSBIYWxsIFNlbnNvciBJbnRlcmZhY2UgaGFuZGxlDQotICogQHBhcmFtICBwRGF0YSBUaGUgZGVzdGluYXRpb24gQnVmZmVyIGFkZHJlc3MuDQotICogQHBhcmFtICBMZW5ndGggVGhlIGxlbmd0aCBvZiBkYXRhIHRvIGJlIHRyYW5zZmVycmVkIGZyb20gVElNIHBlcmlwaGVyYWwgdG8NCi0gKiBtZW1vcnkuDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0hhbGxTZW5zb3JfU3RhcnRfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcERhdGEsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IExlbmd0aCkgew0KLSAgdWludDMyX3QgdG1wc21jcjsNCi0gIEhBTF9USU1fQ2hhbm5lbFN0YXRlVHlwZURlZiBjaGFubmVsXzFfc3RhdGUgPQ0KLSAgICAgIFRJTV9DSEFOTkVMX1NUQVRFX0dFVChodGltLCBUSU1fQ0hBTk5FTF8xKTsNCi0gIEhBTF9USU1fQ2hhbm5lbFN0YXRlVHlwZURlZiBjb21wbGVtZW50YXJ5X2NoYW5uZWxfMV9zdGF0ZSA9DQotICAgICAgVElNX0NIQU5ORUxfTl9TVEFURV9HRVQoaHRpbSwgVElNX0NIQU5ORUxfMSk7DQotDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9IQUxMX1NFTlNPUl9JTlRFUkZBQ0VfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsNCi0NCi0gIC8qIFNldCB0aGUgVElNIGNoYW5uZWwgc3RhdGUgKi8NCi0gIGlmICgoY2hhbm5lbF8xX3N0YXRlID09IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKSB8fA0KLSAgICAgIChjb21wbGVtZW50YXJ5X2NoYW5uZWxfMV9zdGF0ZSA9PSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSkpIHsNCi0gICAgcmV0dXJuIEhBTF9CVVNZOw0KLSAgfSBlbHNlIGlmICgoY2hhbm5lbF8xX3N0YXRlID09IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSkgJiYNCi0gICAgICAgICAgICAgKGNvbXBsZW1lbnRhcnlfY2hhbm5lbF8xX3N0YXRlID09IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSkpIHsNCi0gICAgaWYgKChwRGF0YSA9PSBOVUxMKSAmJiAoTGVuZ3RoID4gMFUpKSB7DQotICAgICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gICAgfSBlbHNlIHsNCi0gICAgICBUSU1fQ0hBTk5FTF9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMSwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX0JVU1kpOw0KLSAgICAgIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKTsNCi0gICAgfQ0KLSAgfSBlbHNlIHsNCi0gICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gIH0NCi0NCi0gIC8qIEVuYWJsZSB0aGUgSW5wdXQgQ2FwdHVyZSBjaGFubmVsIDENCi0gIChpbiB0aGUgSGFsbCBTZW5zb3IgSW50ZXJmYWNlIHRoZSB0aHJlZSBwb3NzaWJsZSBjaGFubmVscyB0aGF0IGNhbiBiZSB1c2VkIGFyZQ0KLSAgVElNX0NIQU5ORUxfMSwgVElNX0NIQU5ORUxfMiBhbmQgVElNX0NIQU5ORUxfMykgKi8NCi0gIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8xLCBUSU1fQ0N4X0VOQUJMRSk7DQotDQotICAvKiBTZXQgdGhlIERNQSBJbnB1dCBDYXB0dXJlIDEgQ2FsbGJhY2tzICovDQotICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFDYXB0dXJlQ3BsdDsNCi0gIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFRJTV9ETUFDYXB0dXJlSGFsZkNwbHQ7DQotICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLw0KLSAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yOw0KLQ0KLSAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCBmb3IgQ2FwdHVyZSAxKi8NCi0gIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLA0KLSAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+Q0NSMSwgKHVpbnQzMl90KXBEYXRhLA0KLSAgICAgICAgICAgICAgICAgICAgICAgTGVuZ3RoKSAhPSBIQUxfT0spIHsNCi0gICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLw0KLSAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgfQ0KLSAgLyogRW5hYmxlIHRoZSBjYXB0dXJlIGNvbXBhcmUgMSBJbnRlcnJ1cHQgKi8NCi0gIF9fSEFMX1RJTV9FTkFCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MxKTsNCi0NCi0gIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCwgZXhjZXB0IGluIHRyaWdnZXIgbW9kZSB3aGVyZSBlbmFibGUgaXMgYXV0b21hdGljYWxseQ0KLSAgICogZG9uZSB3aXRoIHRyaWdnZXIgKi8NCi0gIGlmIChJU19USU1fU0xBVkVfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKSB7DQotICAgIHRtcHNtY3IgPSBodGltLT5JbnN0YW5jZS0+U01DUiAmIFRJTV9TTUNSX1NNUzsNCi0gICAgaWYgKCFJU19USU1fU0xBVkVNT0RFX1RSSUdHRVJfRU5BQkxFRCh0bXBzbWNyKSkgew0KLSAgICAgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7DQotICAgIH0NCi0gIH0gZWxzZSB7DQotICAgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7DQotICB9DQotDQotICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovDQotICByZXR1cm4gSEFMX09LOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFN0b3BzIHRoZSBUSU0gSGFsbCBTZW5zb3IgSW50ZXJmYWNlIGluIERNQSBtb2RlLg0KLSAqIEBwYXJhbSAgaHRpbSBUSU0gSGFsbCBTZW5zb3IgSW50ZXJmYWNlIGhhbmRsZQ0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9IYWxsU2Vuc29yX1N0b3BfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKSB7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9IQUxMX1NFTlNPUl9JTlRFUkZBQ0VfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsNCi0NCi0gIC8qIERpc2FibGUgdGhlIElucHV0IENhcHR1cmUgY2hhbm5lbCAxDQotICAoaW4gdGhlIEhhbGwgU2Vuc29yIEludGVyZmFjZSB0aGUgdGhyZWUgcG9zc2libGUgY2hhbm5lbHMgdGhhdCBjYW4gYmUgdXNlZCBhcmUNCi0gIFRJTV9DSEFOTkVMXzEsIFRJTV9DSEFOTkVMXzIgYW5kIFRJTV9DSEFOTkVMXzMpICovDQotICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMSwgVElNX0NDeF9ESVNBQkxFKTsNCi0NCi0gIC8qIERpc2FibGUgdGhlIGNhcHR1cmUgY29tcGFyZSBJbnRlcnJ1cHRzIDEgZXZlbnQgKi8NCi0gIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMSk7DQotDQotICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdKTsNCi0NCi0gIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8NCi0gIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOw0KLQ0KLSAgLyogU2V0IHRoZSBUSU0gY2hhbm5lbCBzdGF0ZSAqLw0KLSAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7DQotICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8xLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOw0KLQ0KLSAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLw0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTUV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgRXh0ZW5kZWQgVGltZXIgQ29tcGxlbWVudGFyeQ0KLU91dHB1dCBDb21wYXJlIGZ1bmN0aW9ucw0KLSAgKiAgQGJyaWVmICAgVGltZXIgQ29tcGxlbWVudGFyeSBPdXRwdXQgQ29tcGFyZSBmdW5jdGlvbnMNCi0gICoNCi1AdmVyYmF0aW0NCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICAgICAgICAgICAgIyMjIyMgVGltZXIgQ29tcGxlbWVudGFyeSBPdXRwdXQgQ29tcGFyZSBmdW5jdGlvbnMgIyMjIyMNCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgWy4uXQ0KLSAgICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOg0KLSAgICAoKykgU3RhcnQgdGhlIENvbXBsZW1lbnRhcnkgT3V0cHV0IENvbXBhcmUvUFdNLg0KLSAgICAoKykgU3RvcCB0aGUgQ29tcGxlbWVudGFyeSBPdXRwdXQgQ29tcGFyZS9QV00uDQotICAgICgrKSBTdGFydCB0aGUgQ29tcGxlbWVudGFyeSBPdXRwdXQgQ29tcGFyZS9QV00gYW5kIGVuYWJsZSBpbnRlcnJ1cHRzLg0KLSAgICAoKykgU3RvcCB0aGUgQ29tcGxlbWVudGFyeSBPdXRwdXQgQ29tcGFyZS9QV00gYW5kIGRpc2FibGUgaW50ZXJydXB0cy4NCi0gICAgKCspIFN0YXJ0IHRoZSBDb21wbGVtZW50YXJ5IE91dHB1dCBDb21wYXJlL1BXTSBhbmQgZW5hYmxlIERNQSB0cmFuc2ZlcnMuDQotICAgICgrKSBTdG9wIHRoZSBDb21wbGVtZW50YXJ5IE91dHB1dCBDb21wYXJlL1BXTSBhbmQgZGlzYWJsZSBETUEgdHJhbnNmZXJzLg0KLQ0KLUBlbmR2ZXJiYXRpbQ0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFN0YXJ0cyB0aGUgVElNIE91dHB1dCBDb21wYXJlIHNpZ25hbCBnZW5lcmF0aW9uIG9uIHRoZSBjb21wbGVtZW50YXJ5DQotICogICAgICAgICBvdXRwdXQuDQotICogQHBhcmFtICBodGltIFRJTSBPdXRwdXQgQ29tcGFyZSBoYW5kbGUNCi0gKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWwgdG8gYmUgZW5hYmxlZA0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfT0NOX1N0YXJ0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCkgew0KLSAgdWludDMyX3QgdG1wc21jcjsNCi0NCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWE5fSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsNCi0NCi0gIC8qIENoZWNrIHRoZSBUSU0gY29tcGxlbWVudGFyeSBjaGFubmVsIHN0YXRlICovDQotICBpZiAoVElNX0NIQU5ORUxfTl9TVEFURV9HRVQoaHRpbSwgQ2hhbm5lbCkgIT0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKSB7DQotICAgIHJldHVybiBIQUxfRVJST1I7DQotICB9DQotDQotICAvKiBTZXQgdGhlIFRJTSBjb21wbGVtZW50YXJ5IGNoYW5uZWwgc3RhdGUgKi8NCi0gIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIENoYW5uZWwsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKTsNCi0NCi0gIC8qIEVuYWJsZSB0aGUgQ2FwdHVyZSBjb21wYXJlIGNoYW5uZWwgTiAqLw0KLSAgVElNX0NDeE5DaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4Tl9FTkFCTEUpOw0KLQ0KLSAgLyogRW5hYmxlIHRoZSBNYWluIE91dHB1dCAqLw0KLSAgX19IQUxfVElNX01PRV9FTkFCTEUoaHRpbSk7DQotDQotICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwsIGV4Y2VwdCBpbiB0cmlnZ2VyIG1vZGUgd2hlcmUgZW5hYmxlIGlzIGF1dG9tYXRpY2FsbHkNCi0gICAqIGRvbmUgd2l0aCB0cmlnZ2VyICovDQotICBpZiAoSVNfVElNX1NMQVZFX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSkgew0KLSAgICB0bXBzbWNyID0gaHRpbS0+SW5zdGFuY2UtPlNNQ1IgJiBUSU1fU01DUl9TTVM7DQotICAgIGlmICghSVNfVElNX1NMQVZFTU9ERV9UUklHR0VSX0VOQUJMRUQodG1wc21jcikpIHsNCi0gICAgICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOw0KLSAgICB9DQotICB9IGVsc2Ugew0KLSAgICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOw0KLSAgfQ0KLQ0KLSAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLw0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTdG9wcyB0aGUgVElNIE91dHB1dCBDb21wYXJlIHNpZ25hbCBnZW5lcmF0aW9uIG9uIHRoZSBjb21wbGVtZW50YXJ5DQotICogICAgICAgICBvdXRwdXQuDQotICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUNCi0gKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWwgdG8gYmUgZGlzYWJsZWQNCi0gKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X09DTl9TdG9wKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKSB7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hOX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7DQotDQotICAvKiBEaXNhYmxlIHRoZSBDYXB0dXJlIGNvbXBhcmUgY2hhbm5lbCBOICovDQotICBUSU1fQ0N4TkNoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hOX0RJU0FCTEUpOw0KLQ0KLSAgLyogRGlzYWJsZSB0aGUgTWFpbiBPdXRwdXQgKi8NCi0gIF9fSEFMX1RJTV9NT0VfRElTQUJMRShodGltKTsNCi0NCi0gIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8NCi0gIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOw0KLQ0KLSAgLyogU2V0IHRoZSBUSU0gY29tcGxlbWVudGFyeSBjaGFubmVsIHN0YXRlICovDQotICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBDaGFubmVsLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOw0KLQ0KLSAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLw0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTdGFydHMgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBzaWduYWwgZ2VuZXJhdGlvbiBpbiBpbnRlcnJ1cHQgbW9kZQ0KLSAqICAgICAgICAgb24gdGhlIGNvbXBsZW1lbnRhcnkgb3V0cHV0Lg0KLSAqIEBwYXJhbSAgaHRpbSBUSU0gT0MgaGFuZGxlDQotICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVsIHRvIGJlIGVuYWJsZWQNCi0gKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X09DTl9TdGFydF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpIHsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsNCi0gIHVpbnQzMl90IHRtcHNtY3I7DQotDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hOX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7DQotDQotICAvKiBDaGVjayB0aGUgVElNIGNvbXBsZW1lbnRhcnkgY2hhbm5lbCBzdGF0ZSAqLw0KLSAgaWYgKFRJTV9DSEFOTkVMX05fU1RBVEVfR0VUKGh0aW0sIENoYW5uZWwpICE9IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSkgew0KLSAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgfQ0KLQ0KLSAgLyogU2V0IHRoZSBUSU0gY29tcGxlbWVudGFyeSBjaGFubmVsIHN0YXRlICovDQotICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBDaGFubmVsLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSk7DQotDQotICBzd2l0Y2ggKENoYW5uZWwpIHsNCi0gICAgY2FzZSBUSU1fQ0hBTk5FTF8xOiB7DQotICAgICAgLyogRW5hYmxlIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgaW50ZXJydXB0ICovDQotICAgICAgX19IQUxfVElNX0VOQUJMRV9JVChodGltLCBUSU1fSVRfQ0MxKTsNCi0gICAgICBicmVhazsNCi0gICAgfQ0KLQ0KLSAgICBjYXNlIFRJTV9DSEFOTkVMXzI6IHsNCi0gICAgICAvKiBFbmFibGUgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBpbnRlcnJ1cHQgKi8NCi0gICAgICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzIpOw0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotDQotICAgIGNhc2UgVElNX0NIQU5ORUxfMzogew0KLSAgICAgIC8qIEVuYWJsZSB0aGUgVElNIE91dHB1dCBDb21wYXJlIGludGVycnVwdCAqLw0KLSAgICAgIF9fSEFMX1RJTV9FTkFCTEVfSVQoaHRpbSwgVElNX0lUX0NDMyk7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0NCi0gICAgY2FzZSBUSU1fQ0hBTk5FTF80OiB7DQotICAgICAgLyogRW5hYmxlIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgaW50ZXJydXB0ICovDQotICAgICAgX19IQUxfVElNX0VOQUJMRV9JVChodGltLCBUSU1fSVRfQ0M0KTsNCi0gICAgICBicmVhazsNCi0gICAgfQ0KLQ0KLSAgICBkZWZhdWx0Og0KLSAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsNCi0gICAgICBicmVhazsNCi0gIH0NCi0NCi0gIGlmIChzdGF0dXMgPT0gSEFMX09LKSB7DQotICAgIC8qIEVuYWJsZSB0aGUgVElNIEJyZWFrIGludGVycnVwdCAqLw0KLSAgICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9CUkVBSyk7DQotDQotICAgIC8qIEVuYWJsZSB0aGUgQ2FwdHVyZSBjb21wYXJlIGNoYW5uZWwgTiAqLw0KLSAgICBUSU1fQ0N4TkNoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hOX0VOQUJMRSk7DQotDQotICAgIC8qIEVuYWJsZSB0aGUgTWFpbiBPdXRwdXQgKi8NCi0gICAgX19IQUxfVElNX01PRV9FTkFCTEUoaHRpbSk7DQotDQotICAgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCwgZXhjZXB0IGluIHRyaWdnZXIgbW9kZSB3aGVyZSBlbmFibGUgaXMNCi0gICAgICogYXV0b21hdGljYWxseSBkb25lIHdpdGggdHJpZ2dlciAqLw0KLSAgICBpZiAoSVNfVElNX1NMQVZFX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSkgew0KLSAgICAgIHRtcHNtY3IgPSBodGltLT5JbnN0YW5jZS0+U01DUiAmIFRJTV9TTUNSX1NNUzsNCi0gICAgICBpZiAoIUlTX1RJTV9TTEFWRU1PREVfVFJJR0dFUl9FTkFCTEVEKHRtcHNtY3IpKSB7DQotICAgICAgICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOw0KLSAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOw0KLSAgICB9DQotICB9DQotDQotICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovDQotICByZXR1cm4gc3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFN0b3BzIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgc2lnbmFsIGdlbmVyYXRpb24gaW4gaW50ZXJydXB0IG1vZGUNCi0gKiAgICAgICAgIG9uIHRoZSBjb21wbGVtZW50YXJ5IG91dHB1dC4NCi0gKiBAcGFyYW0gIGh0aW0gVElNIE91dHB1dCBDb21wYXJlIGhhbmRsZQ0KLSAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbCB0byBiZSBkaXNhYmxlZA0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfT0NOX1N0b3BfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpIHsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsNCi0gIHVpbnQzMl90IHRtcGNjZXI7DQotDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hOX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7DQotDQotICBzd2l0Y2ggKENoYW5uZWwpIHsNCi0gICAgY2FzZSBUSU1fQ0hBTk5FTF8xOiB7DQotICAgICAgLyogRGlzYWJsZSB0aGUgVElNIE91dHB1dCBDb21wYXJlIGludGVycnVwdCAqLw0KLSAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzEpOw0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotDQotICAgIGNhc2UgVElNX0NIQU5ORUxfMjogew0KLSAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBpbnRlcnJ1cHQgKi8NCi0gICAgICBfX0hBTF9USU1fRElTQUJMRV9JVChodGltLCBUSU1fSVRfQ0MyKTsNCi0gICAgICBicmVhazsNCi0gICAgfQ0KLQ0KLSAgICBjYXNlIFRJTV9DSEFOTkVMXzM6IHsNCi0gICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgaW50ZXJydXB0ICovDQotICAgICAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDMyk7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0NCi0gICAgY2FzZSBUSU1fQ0hBTk5FTF80OiB7DQotICAgICAgLyogRGlzYWJsZSB0aGUgVElNIE91dHB1dCBDb21wYXJlIGludGVycnVwdCAqLw0KLSAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzQpOw0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotDQotICAgIGRlZmF1bHQ6DQotICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOw0KLSAgICAgIGJyZWFrOw0KLSAgfQ0KLQ0KLSAgaWYgKHN0YXR1cyA9PSBIQUxfT0spIHsNCi0gICAgLyogRGlzYWJsZSB0aGUgQ2FwdHVyZSBjb21wYXJlIGNoYW5uZWwgTiAqLw0KLSAgICBUSU1fQ0N4TkNoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hOX0RJU0FCTEUpOw0KLQ0KLSAgICAvKiBEaXNhYmxlIHRoZSBUSU0gQnJlYWsgaW50ZXJydXB0IChvbmx5IGlmIG5vIG1vcmUgY2hhbm5lbCBpcyBhY3RpdmUpICovDQotICAgIHRtcGNjZXIgPSBodGltLT5JbnN0YW5jZS0+Q0NFUjsNCi0gICAgaWYgKCh0bXBjY2VyICYgKFRJTV9DQ0VSX0NDMU5FIHwgVElNX0NDRVJfQ0MyTkUgfCBUSU1fQ0NFUl9DQzNORSB8DQotICAgICAgICAgICAgICAgICAgICBUSU1fQ0NFUl9DQzRORSkpID09ICh1aW50MzJfdClSRVNFVCkgew0KLSAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9CUkVBSyk7DQotICAgIH0NCi0NCi0gICAgLyogRGlzYWJsZSB0aGUgTWFpbiBPdXRwdXQgKi8NCi0gICAgX19IQUxfVElNX01PRV9ESVNBQkxFKGh0aW0pOw0KLQ0KLSAgICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovDQotICAgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOw0KLQ0KLSAgICAvKiBTZXQgdGhlIFRJTSBjb21wbGVtZW50YXJ5IGNoYW5uZWwgc3RhdGUgKi8NCi0gICAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgQ2hhbm5lbCwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsNCi0gIH0NCi0NCi0gIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8NCi0gIHJldHVybiBzdGF0dXM7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU3RhcnRzIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgc2lnbmFsIGdlbmVyYXRpb24gaW4gRE1BIG1vZGUNCi0gKiAgICAgICAgIG9uIHRoZSBjb21wbGVtZW50YXJ5IG91dHB1dC4NCi0gKiBAcGFyYW0gIGh0aW0gVElNIE91dHB1dCBDb21wYXJlIGhhbmRsZQ0KLSAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbCB0byBiZSBlbmFibGVkDQotICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZA0KLSAqIEBwYXJhbSAgcERhdGEgVGhlIHNvdXJjZSBCdWZmZXIgYWRkcmVzcy4NCi0gKiBAcGFyYW0gIExlbmd0aCBUaGUgbGVuZ3RoIG9mIGRhdGEgdG8gYmUgdHJhbnNmZXJyZWQgZnJvbSBtZW1vcnkgdG8gVElNDQotICogcGVyaXBoZXJhbA0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9PQ05fU3RhcnRfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90ICpwRGF0YSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBMZW5ndGgpIHsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsNCi0gIHVpbnQzMl90IHRtcHNtY3I7DQotDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hOX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7DQotDQotICAvKiBTZXQgdGhlIFRJTSBjb21wbGVtZW50YXJ5IGNoYW5uZWwgc3RhdGUgKi8NCi0gIGlmIChUSU1fQ0hBTk5FTF9OX1NUQVRFX0dFVChodGltLCBDaGFubmVsKSA9PSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSkgew0KLSAgICByZXR1cm4gSEFMX0JVU1k7DQotICB9IGVsc2UgaWYgKFRJTV9DSEFOTkVMX05fU1RBVEVfR0VUKGh0aW0sIENoYW5uZWwpID09DQotICAgICAgICAgICAgIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSkgew0KLSAgICBpZiAoKHBEYXRhID09IE5VTEwpICYmIChMZW5ndGggPiAwVSkpIHsNCi0gICAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIENoYW5uZWwsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKTsNCi0gICAgfQ0KLSAgfSBlbHNlIHsNCi0gICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gIH0NCi0NCi0gIHN3aXRjaCAoQ2hhbm5lbCkgew0KLSAgICBjYXNlIFRJTV9DSEFOTkVMXzE6IHsNCi0gICAgICAvKiBTZXQgdGhlIERNQSBjb21wYXJlIGNhbGxiYWNrcyAqLw0KLSAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQURlbGF5UHVsc2VOQ3BsdDsNCi0gICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPQ0KLSAgICAgICAgICBUSU1fRE1BRGVsYXlQdWxzZUhhbGZDcGx0Ow0KLQ0KLSAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovDQotICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yQ0N4TjsNCi0NCi0gICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovDQotICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0sICh1aW50MzJfdClwRGF0YSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5DQ1IxLCBMZW5ndGgpICE9IEhBTF9PSykgew0KLSAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLw0KLSAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gICAgICB9DQotICAgICAgLyogRW5hYmxlIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgRE1BIHJlcXVlc3QgKi8NCi0gICAgICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMSk7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0NCi0gICAgY2FzZSBUSU1fQ0hBTk5FTF8yOiB7DQotICAgICAgLyogU2V0IHRoZSBETUEgY29tcGFyZSBjYWxsYmFja3MgKi8NCi0gICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFEZWxheVB1bHNlTkNwbHQ7DQotICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0NCi0gICAgICAgICAgVElNX0RNQURlbGF5UHVsc2VIYWxmQ3BsdDsNCi0NCi0gICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLw0KLSAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvckNDeE47DQotDQotICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLw0KLSAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLCAodWludDMyX3QpcERhdGEsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+Q0NSMiwgTGVuZ3RoKSAhPSBIQUxfT0spIHsNCi0gICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8NCi0gICAgICAgIHJldHVybiBIQUxfRVJST1I7DQotICAgICAgfQ0KLSAgICAgIC8qIEVuYWJsZSB0aGUgVElNIE91dHB1dCBDb21wYXJlIERNQSByZXF1ZXN0ICovDQotICAgICAgX19IQUxfVElNX0VOQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzIpOw0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotDQotICAgIGNhc2UgVElNX0NIQU5ORUxfMzogew0KLSAgICAgIC8qIFNldCB0aGUgRE1BIGNvbXBhcmUgY2FsbGJhY2tzICovDQotICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BRGVsYXlQdWxzZU5DcGx0Ow0KLSAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9DQotICAgICAgICAgIFRJTV9ETUFEZWxheVB1bHNlSGFsZkNwbHQ7DQotDQotICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8NCi0gICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3JDQ3hOOw0KLQ0KLSAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8NCi0gICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXSwgKHVpbnQzMl90KXBEYXRhLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkNDUjMsIExlbmd0aCkgIT0gSEFMX09LKSB7DQotICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovDQotICAgICAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgICAgIH0NCi0gICAgICAvKiBFbmFibGUgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBETUEgcmVxdWVzdCAqLw0KLSAgICAgIF9fSEFMX1RJTV9FTkFCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MzKTsNCi0gICAgICBicmVhazsNCi0gICAgfQ0KLQ0KLSAgICBjYXNlIFRJTV9DSEFOTkVMXzQ6IHsNCi0gICAgICAvKiBTZXQgdGhlIERNQSBjb21wYXJlIGNhbGxiYWNrcyAqLw0KLSAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQURlbGF5UHVsc2VOQ3BsdDsNCi0gICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPQ0KLSAgICAgICAgICBUSU1fRE1BRGVsYXlQdWxzZUhhbGZDcGx0Ow0KLQ0KLSAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovDQotICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDNF0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yQ0N4TjsNCi0NCi0gICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovDQotICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDNF0sICh1aW50MzJfdClwRGF0YSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5DQ1I0LCBMZW5ndGgpICE9IEhBTF9PSykgew0KLSAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLw0KLSAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gICAgICB9DQotICAgICAgLyogRW5hYmxlIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgRE1BIHJlcXVlc3QgKi8NCi0gICAgICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBUSU1fRE1BX0NDNCk7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0NCi0gICAgZGVmYXVsdDoNCi0gICAgICBzdGF0dXMgPSBIQUxfRVJST1I7DQotICAgICAgYnJlYWs7DQotICB9DQotDQotICBpZiAoc3RhdHVzID09IEhBTF9PSykgew0KLSAgICAvKiBFbmFibGUgdGhlIENhcHR1cmUgY29tcGFyZSBjaGFubmVsIE4gKi8NCi0gICAgVElNX0NDeE5DaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4Tl9FTkFCTEUpOw0KLQ0KLSAgICAvKiBFbmFibGUgdGhlIE1haW4gT3V0cHV0ICovDQotICAgIF9fSEFMX1RJTV9NT0VfRU5BQkxFKGh0aW0pOw0KLQ0KLSAgICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwsIGV4Y2VwdCBpbiB0cmlnZ2VyIG1vZGUgd2hlcmUgZW5hYmxlIGlzDQotICAgICAqIGF1dG9tYXRpY2FsbHkgZG9uZSB3aXRoIHRyaWdnZXIgKi8NCi0gICAgaWYgKElTX1RJTV9TTEFWRV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpIHsNCi0gICAgICB0bXBzbWNyID0gaHRpbS0+SW5zdGFuY2UtPlNNQ1IgJiBUSU1fU01DUl9TTVM7DQotICAgICAgaWYgKCFJU19USU1fU0xBVkVNT0RFX1RSSUdHRVJfRU5BQkxFRCh0bXBzbWNyKSkgew0KLSAgICAgICAgX19IQUxfVElNX0VOQUJMRShodGltKTsNCi0gICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgX19IQUxfVElNX0VOQUJMRShodGltKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLw0KLSAgcmV0dXJuIHN0YXR1czsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTdG9wcyB0aGUgVElNIE91dHB1dCBDb21wYXJlIHNpZ25hbCBnZW5lcmF0aW9uIGluIERNQSBtb2RlDQotICogICAgICAgICBvbiB0aGUgY29tcGxlbWVudGFyeSBvdXRwdXQuDQotICogQHBhcmFtICBodGltIFRJTSBPdXRwdXQgQ29tcGFyZSBoYW5kbGUNCi0gKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWwgdG8gYmUgZGlzYWJsZWQNCi0gKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X09DTl9TdG9wX0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpIHsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsNCi0NCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWE5fSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsNCi0NCi0gIHN3aXRjaCAoQ2hhbm5lbCkgew0KLSAgICBjYXNlIFRJTV9DSEFOTkVMXzE6IHsNCi0gICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgRE1BIHJlcXVlc3QgKi8NCi0gICAgICBfX0hBTF9USU1fRElTQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzEpOw0KLSAgICAgICh2b2lkKUhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0pOw0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotDQotICAgIGNhc2UgVElNX0NIQU5ORUxfMjogew0KLSAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBETUEgcmVxdWVzdCAqLw0KLSAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMik7DQotICAgICAgKHZvaWQpSEFMX0RNQV9BYm9ydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXSk7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0NCi0gICAgY2FzZSBUSU1fQ0hBTk5FTF8zOiB7DQotICAgICAgLyogRGlzYWJsZSB0aGUgVElNIE91dHB1dCBDb21wYXJlIERNQSByZXF1ZXN0ICovDQotICAgICAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MzKTsNCi0gICAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdKTsNCi0gICAgICBicmVhazsNCi0gICAgfQ0KLQ0KLSAgICBjYXNlIFRJTV9DSEFOTkVMXzQ6IHsNCi0gICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgaW50ZXJydXB0ICovDQotICAgICAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0M0KTsNCi0gICAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdKTsNCi0gICAgICBicmVhazsNCi0gICAgfQ0KLQ0KLSAgICBkZWZhdWx0Og0KLSAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsNCi0gICAgICBicmVhazsNCi0gIH0NCi0NCi0gIGlmIChzdGF0dXMgPT0gSEFMX09LKSB7DQotICAgIC8qIERpc2FibGUgdGhlIENhcHR1cmUgY29tcGFyZSBjaGFubmVsIE4gKi8NCi0gICAgVElNX0NDeE5DaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4Tl9ESVNBQkxFKTsNCi0NCi0gICAgLyogRGlzYWJsZSB0aGUgTWFpbiBPdXRwdXQgKi8NCi0gICAgX19IQUxfVElNX01PRV9ESVNBQkxFKGh0aW0pOw0KLQ0KLSAgICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovDQotICAgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOw0KLQ0KLSAgICAvKiBTZXQgdGhlIFRJTSBjb21wbGVtZW50YXJ5IGNoYW5uZWwgc3RhdGUgKi8NCi0gICAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgQ2hhbm5lbCwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsNCi0gIH0NCi0NCi0gIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8NCi0gIHJldHVybiBzdGF0dXM7DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBUSU1FeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIEV4dGVuZGVkIFRpbWVyIENvbXBsZW1lbnRhcnkgUFdNDQotZnVuY3Rpb25zDQotICAqIEBicmllZiAgICBUaW1lciBDb21wbGVtZW50YXJ5IFBXTSBmdW5jdGlvbnMNCi0gICoNCi1AdmVyYmF0aW0NCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICAgICAgICAgICAgICAgIyMjIyMgVGltZXIgQ29tcGxlbWVudGFyeSBQV00gZnVuY3Rpb25zICMjIyMjDQotICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gIFsuLl0NCi0gICAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoNCi0gICAgKCspIFN0YXJ0IHRoZSBDb21wbGVtZW50YXJ5IFBXTS4NCi0gICAgKCspIFN0b3AgdGhlIENvbXBsZW1lbnRhcnkgUFdNLg0KLSAgICAoKykgU3RhcnQgdGhlIENvbXBsZW1lbnRhcnkgUFdNIGFuZCBlbmFibGUgaW50ZXJydXB0cy4NCi0gICAgKCspIFN0b3AgdGhlIENvbXBsZW1lbnRhcnkgUFdNIGFuZCBkaXNhYmxlIGludGVycnVwdHMuDQotICAgICgrKSBTdGFydCB0aGUgQ29tcGxlbWVudGFyeSBQV00gYW5kIGVuYWJsZSBETUEgdHJhbnNmZXJzLg0KLSAgICAoKykgU3RvcCB0aGUgQ29tcGxlbWVudGFyeSBQV00gYW5kIGRpc2FibGUgRE1BIHRyYW5zZmVycy4NCi0gICAgKCspIFN0YXJ0IHRoZSBDb21wbGVtZW50YXJ5IElucHV0IENhcHR1cmUgbWVhc3VyZW1lbnQuDQotICAgICgrKSBTdG9wIHRoZSBDb21wbGVtZW50YXJ5IElucHV0IENhcHR1cmUuDQotICAgICgrKSBTdGFydCB0aGUgQ29tcGxlbWVudGFyeSBJbnB1dCBDYXB0dXJlIGFuZCBlbmFibGUgaW50ZXJydXB0cy4NCi0gICAgKCspIFN0b3AgdGhlIENvbXBsZW1lbnRhcnkgSW5wdXQgQ2FwdHVyZSBhbmQgZGlzYWJsZSBpbnRlcnJ1cHRzLg0KLSAgICAoKykgU3RhcnQgdGhlIENvbXBsZW1lbnRhcnkgSW5wdXQgQ2FwdHVyZSBhbmQgZW5hYmxlIERNQSB0cmFuc2ZlcnMuDQotICAgICgrKSBTdG9wIHRoZSBDb21wbGVtZW50YXJ5IElucHV0IENhcHR1cmUgYW5kIGRpc2FibGUgRE1BIHRyYW5zZmVycy4NCi0gICAgKCspIFN0YXJ0IHRoZSBDb21wbGVtZW50YXJ5IE9uZSBQdWxzZSBnZW5lcmF0aW9uLg0KLSAgICAoKykgU3RvcCB0aGUgQ29tcGxlbWVudGFyeSBPbmUgUHVsc2UuDQotICAgICgrKSBTdGFydCB0aGUgQ29tcGxlbWVudGFyeSBPbmUgUHVsc2UgYW5kIGVuYWJsZSBpbnRlcnJ1cHRzLg0KLSAgICAoKykgU3RvcCB0aGUgQ29tcGxlbWVudGFyeSBPbmUgUHVsc2UgYW5kIGRpc2FibGUgaW50ZXJydXB0cy4NCi0NCi1AZW5kdmVyYmF0aW0NCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICogQGJyaWVmICBTdGFydHMgdGhlIFBXTSBzaWduYWwgZ2VuZXJhdGlvbiBvbiB0aGUgY29tcGxlbWVudGFyeSBvdXRwdXQuDQotICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUNCi0gKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWwgdG8gYmUgZW5hYmxlZA0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfUFdNTl9TdGFydChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKSB7DQotICB1aW50MzJfdCB0bXBzbWNyOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fQ0NYTl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIFRJTSBjb21wbGVtZW50YXJ5IGNoYW5uZWwgc3RhdGUgKi8NCi0gIGlmIChUSU1fQ0hBTk5FTF9OX1NUQVRFX0dFVChodGltLCBDaGFubmVsKSAhPSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpIHsNCi0gICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gIH0NCi0NCi0gIC8qIFNldCB0aGUgVElNIGNvbXBsZW1lbnRhcnkgY2hhbm5lbCBzdGF0ZSAqLw0KLSAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgQ2hhbm5lbCwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX0JVU1kpOw0KLQ0KLSAgLyogRW5hYmxlIHRoZSBjb21wbGVtZW50YXJ5IFBXTSBvdXRwdXQgICovDQotICBUSU1fQ0N4TkNoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hOX0VOQUJMRSk7DQotDQotICAvKiBFbmFibGUgdGhlIE1haW4gT3V0cHV0ICovDQotICBfX0hBTF9USU1fTU9FX0VOQUJMRShodGltKTsNCi0NCi0gIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCwgZXhjZXB0IGluIHRyaWdnZXIgbW9kZSB3aGVyZSBlbmFibGUgaXMgYXV0b21hdGljYWxseQ0KLSAgICogZG9uZSB3aXRoIHRyaWdnZXIgKi8NCi0gIGlmIChJU19USU1fU0xBVkVfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKSB7DQotICAgIHRtcHNtY3IgPSBodGltLT5JbnN0YW5jZS0+U01DUiAmIFRJTV9TTUNSX1NNUzsNCi0gICAgaWYgKCFJU19USU1fU0xBVkVNT0RFX1RSSUdHRVJfRU5BQkxFRCh0bXBzbWNyKSkgew0KLSAgICAgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7DQotICAgIH0NCi0gIH0gZWxzZSB7DQotICAgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7DQotICB9DQotDQotICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovDQotICByZXR1cm4gSEFMX09LOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFN0b3BzIHRoZSBQV00gc2lnbmFsIGdlbmVyYXRpb24gb24gdGhlIGNvbXBsZW1lbnRhcnkgb3V0cHV0Lg0KLSAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlDQotICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVsIHRvIGJlIGRpc2FibGVkDQotICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZA0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9QV01OX1N0b3AoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKSB7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hOX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7DQotDQotICAvKiBEaXNhYmxlIHRoZSBjb21wbGVtZW50YXJ5IFBXTSBvdXRwdXQgICovDQotICBUSU1fQ0N4TkNoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hOX0RJU0FCTEUpOw0KLQ0KLSAgLyogRGlzYWJsZSB0aGUgTWFpbiBPdXRwdXQgKi8NCi0gIF9fSEFMX1RJTV9NT0VfRElTQUJMRShodGltKTsNCi0NCi0gIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8NCi0gIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOw0KLQ0KLSAgLyogU2V0IHRoZSBUSU0gY29tcGxlbWVudGFyeSBjaGFubmVsIHN0YXRlICovDQotICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBDaGFubmVsLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOw0KLQ0KLSAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLw0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTdGFydHMgdGhlIFBXTSBzaWduYWwgZ2VuZXJhdGlvbiBpbiBpbnRlcnJ1cHQgbW9kZSBvbiB0aGUNCi0gKiAgICAgICAgIGNvbXBsZW1lbnRhcnkgb3V0cHV0Lg0KLSAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlDQotICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVsIHRvIGJlIGRpc2FibGVkDQotICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZA0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9QV01OX1N0YXJ0X0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpIHsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsNCi0gIHVpbnQzMl90IHRtcHNtY3I7DQotDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hOX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7DQotDQotICAvKiBDaGVjayB0aGUgVElNIGNvbXBsZW1lbnRhcnkgY2hhbm5lbCBzdGF0ZSAqLw0KLSAgaWYgKFRJTV9DSEFOTkVMX05fU1RBVEVfR0VUKGh0aW0sIENoYW5uZWwpICE9IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSkgew0KLSAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgfQ0KLQ0KLSAgLyogU2V0IHRoZSBUSU0gY29tcGxlbWVudGFyeSBjaGFubmVsIHN0YXRlICovDQotICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBDaGFubmVsLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSk7DQotDQotICBzd2l0Y2ggKENoYW5uZWwpIHsNCi0gICAgY2FzZSBUSU1fQ0hBTk5FTF8xOiB7DQotICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDEgaW50ZXJydXB0ICovDQotICAgICAgX19IQUxfVElNX0VOQUJMRV9JVChodGltLCBUSU1fSVRfQ0MxKTsNCi0gICAgICBicmVhazsNCi0gICAgfQ0KLQ0KLSAgICBjYXNlIFRJTV9DSEFOTkVMXzI6IHsNCi0gICAgICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMiBpbnRlcnJ1cHQgKi8NCi0gICAgICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzIpOw0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotDQotICAgIGNhc2UgVElNX0NIQU5ORUxfMzogew0KLSAgICAgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAzIGludGVycnVwdCAqLw0KLSAgICAgIF9fSEFMX1RJTV9FTkFCTEVfSVQoaHRpbSwgVElNX0lUX0NDMyk7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0NCi0gICAgY2FzZSBUSU1fQ0hBTk5FTF80OiB7DQotICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDQgaW50ZXJydXB0ICovDQotICAgICAgX19IQUxfVElNX0VOQUJMRV9JVChodGltLCBUSU1fSVRfQ0M0KTsNCi0gICAgICBicmVhazsNCi0gICAgfQ0KLQ0KLSAgICBkZWZhdWx0Og0KLSAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsNCi0gICAgICBicmVhazsNCi0gIH0NCi0NCi0gIGlmIChzdGF0dXMgPT0gSEFMX09LKSB7DQotICAgIC8qIEVuYWJsZSB0aGUgVElNIEJyZWFrIGludGVycnVwdCAqLw0KLSAgICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9CUkVBSyk7DQotDQotICAgIC8qIEVuYWJsZSB0aGUgY29tcGxlbWVudGFyeSBQV00gb3V0cHV0ICAqLw0KLSAgICBUSU1fQ0N4TkNoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hOX0VOQUJMRSk7DQotDQotICAgIC8qIEVuYWJsZSB0aGUgTWFpbiBPdXRwdXQgKi8NCi0gICAgX19IQUxfVElNX01PRV9FTkFCTEUoaHRpbSk7DQotDQotICAgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCwgZXhjZXB0IGluIHRyaWdnZXIgbW9kZSB3aGVyZSBlbmFibGUgaXMNCi0gICAgICogYXV0b21hdGljYWxseSBkb25lIHdpdGggdHJpZ2dlciAqLw0KLSAgICBpZiAoSVNfVElNX1NMQVZFX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSkgew0KLSAgICAgIHRtcHNtY3IgPSBodGltLT5JbnN0YW5jZS0+U01DUiAmIFRJTV9TTUNSX1NNUzsNCi0gICAgICBpZiAoIUlTX1RJTV9TTEFWRU1PREVfVFJJR0dFUl9FTkFCTEVEKHRtcHNtY3IpKSB7DQotICAgICAgICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOw0KLSAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOw0KLSAgICB9DQotICB9DQotDQotICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovDQotICByZXR1cm4gc3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFN0b3BzIHRoZSBQV00gc2lnbmFsIGdlbmVyYXRpb24gaW4gaW50ZXJydXB0IG1vZGUgb24gdGhlDQotICogICAgICAgICBjb21wbGVtZW50YXJ5IG91dHB1dC4NCi0gKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQ0KLSAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbCB0byBiZSBkaXNhYmxlZA0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfUFdNTl9TdG9wX0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCkgew0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOw0KLSAgdWludDMyX3QgdG1wY2NlcjsNCi0NCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWE5fSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsNCi0NCi0gIHN3aXRjaCAoQ2hhbm5lbCkgew0KLSAgICBjYXNlIFRJTV9DSEFOTkVMXzE6IHsNCi0gICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDEgaW50ZXJydXB0ICovDQotICAgICAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDMSk7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0NCi0gICAgY2FzZSBUSU1fQ0hBTk5FTF8yOiB7DQotICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAyIGludGVycnVwdCAqLw0KLSAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzIpOw0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotDQotICAgIGNhc2UgVElNX0NIQU5ORUxfMzogew0KLSAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMyBpbnRlcnJ1cHQgKi8NCi0gICAgICBfX0hBTF9USU1fRElTQUJMRV9JVChodGltLCBUSU1fSVRfQ0MzKTsNCi0gICAgICBicmVhazsNCi0gICAgfQ0KLQ0KLSAgICBjYXNlIFRJTV9DSEFOTkVMXzQ6IHsNCi0gICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDQgaW50ZXJydXB0ICovDQotICAgICAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDNCk7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0NCi0gICAgZGVmYXVsdDoNCi0gICAgICBzdGF0dXMgPSBIQUxfRVJST1I7DQotICAgICAgYnJlYWs7DQotICB9DQotDQotICBpZiAoc3RhdHVzID09IEhBTF9PSykgew0KLSAgICAvKiBEaXNhYmxlIHRoZSBjb21wbGVtZW50YXJ5IFBXTSBvdXRwdXQgICovDQotICAgIFRJTV9DQ3hOQ2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCwgVElNX0NDeE5fRElTQUJMRSk7DQotDQotICAgIC8qIERpc2FibGUgdGhlIFRJTSBCcmVhayBpbnRlcnJ1cHQgKG9ubHkgaWYgbm8gbW9yZSBjaGFubmVsIGlzIGFjdGl2ZSkgKi8NCi0gICAgdG1wY2NlciA9IGh0aW0tPkluc3RhbmNlLT5DQ0VSOw0KLSAgICBpZiAoKHRtcGNjZXIgJiAoVElNX0NDRVJfQ0MxTkUgfCBUSU1fQ0NFUl9DQzJORSB8IFRJTV9DQ0VSX0NDM05FIHwNCi0gICAgICAgICAgICAgICAgICAgIFRJTV9DQ0VSX0NDNE5FKSkgPT0gKHVpbnQzMl90KVJFU0VUKSB7DQotICAgICAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0JSRUFLKTsNCi0gICAgfQ0KLQ0KLSAgICAvKiBEaXNhYmxlIHRoZSBNYWluIE91dHB1dCAqLw0KLSAgICBfX0hBTF9USU1fTU9FX0RJU0FCTEUoaHRpbSk7DQotDQotICAgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8NCi0gICAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7DQotDQotICAgIC8qIFNldCB0aGUgVElNIGNvbXBsZW1lbnRhcnkgY2hhbm5lbCBzdGF0ZSAqLw0KLSAgICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBDaGFubmVsLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOw0KLSAgfQ0KLQ0KLSAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLw0KLSAgcmV0dXJuIHN0YXR1czsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTdGFydHMgdGhlIFRJTSBQV00gc2lnbmFsIGdlbmVyYXRpb24gaW4gRE1BIG1vZGUgb24gdGhlDQotICogICAgICAgICBjb21wbGVtZW50YXJ5IG91dHB1dA0KLSAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlDQotICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVsIHRvIGJlIGVuYWJsZWQNCi0gKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkDQotICogQHBhcmFtICBwRGF0YSBUaGUgc291cmNlIEJ1ZmZlciBhZGRyZXNzLg0KLSAqIEBwYXJhbSAgTGVuZ3RoIFRoZSBsZW5ndGggb2YgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZCBmcm9tIG1lbW9yeSB0byBUSU0NCi0gKiBwZXJpcGhlcmFsDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X1BXTU5fU3RhcnRfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCAqcERhdGEsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IExlbmd0aCkgew0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOw0KLSAgdWludDMyX3QgdG1wc21jcjsNCi0NCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWE5fSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsNCi0NCi0gIC8qIFNldCB0aGUgVElNIGNvbXBsZW1lbnRhcnkgY2hhbm5lbCBzdGF0ZSAqLw0KLSAgaWYgKFRJTV9DSEFOTkVMX05fU1RBVEVfR0VUKGh0aW0sIENoYW5uZWwpID09IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKSB7DQotICAgIHJldHVybiBIQUxfQlVTWTsNCi0gIH0gZWxzZSBpZiAoVElNX0NIQU5ORUxfTl9TVEFURV9HRVQoaHRpbSwgQ2hhbm5lbCkgPT0NCi0gICAgICAgICAgICAgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKSB7DQotICAgIGlmICgocERhdGEgPT0gTlVMTCkgJiYgKExlbmd0aCA+IDBVKSkgew0KLSAgICAgIHJldHVybiBIQUxfRVJST1I7DQotICAgIH0gZWxzZSB7DQotICAgICAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgQ2hhbm5lbCwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX0JVU1kpOw0KLSAgICB9DQotICB9IGVsc2Ugew0KLSAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgfQ0KLQ0KLSAgc3dpdGNoIChDaGFubmVsKSB7DQotICAgIGNhc2UgVElNX0NIQU5ORUxfMTogew0KLSAgICAgIC8qIFNldCB0aGUgRE1BIGNvbXBhcmUgY2FsbGJhY2tzICovDQotICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BRGVsYXlQdWxzZU5DcGx0Ow0KLSAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9DQotICAgICAgICAgIFRJTV9ETUFEZWxheVB1bHNlSGFsZkNwbHQ7DQotDQotICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8NCi0gICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3JDQ3hOOw0KLQ0KLSAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8NCi0gICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXSwgKHVpbnQzMl90KXBEYXRhLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkNDUjEsIExlbmd0aCkgIT0gSEFMX09LKSB7DQotICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovDQotICAgICAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgICAgIH0NCi0gICAgICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMSBETUEgcmVxdWVzdCAqLw0KLSAgICAgIF9fSEFMX1RJTV9FTkFCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MxKTsNCi0gICAgICBicmVhazsNCi0gICAgfQ0KLQ0KLSAgICBjYXNlIFRJTV9DSEFOTkVMXzI6IHsNCi0gICAgICAvKiBTZXQgdGhlIERNQSBjb21wYXJlIGNhbGxiYWNrcyAqLw0KLSAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQURlbGF5UHVsc2VOQ3BsdDsNCi0gICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPQ0KLSAgICAgICAgICBUSU1fRE1BRGVsYXlQdWxzZUhhbGZDcGx0Ow0KLQ0KLSAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovDQotICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yQ0N4TjsNCi0NCi0gICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovDQotICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0sICh1aW50MzJfdClwRGF0YSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5DQ1IyLCBMZW5ndGgpICE9IEhBTF9PSykgew0KLSAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLw0KLSAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gICAgICB9DQotICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDIgRE1BIHJlcXVlc3QgKi8NCi0gICAgICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMik7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0NCi0gICAgY2FzZSBUSU1fQ0hBTk5FTF8zOiB7DQotICAgICAgLyogU2V0IHRoZSBETUEgY29tcGFyZSBjYWxsYmFja3MgKi8NCi0gICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFEZWxheVB1bHNlTkNwbHQ7DQotICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0NCi0gICAgICAgICAgVElNX0RNQURlbGF5UHVsc2VIYWxmQ3BsdDsNCi0NCi0gICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLw0KLSAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvckNDeE47DQotDQotICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLw0KLSAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdLCAodWludDMyX3QpcERhdGEsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+Q0NSMywgTGVuZ3RoKSAhPSBIQUxfT0spIHsNCi0gICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8NCi0gICAgICAgIHJldHVybiBIQUxfRVJST1I7DQotICAgICAgfQ0KLSAgICAgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAzIERNQSByZXF1ZXN0ICovDQotICAgICAgX19IQUxfVElNX0VOQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzMpOw0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotDQotICAgIGNhc2UgVElNX0NIQU5ORUxfNDogew0KLSAgICAgIC8qIFNldCB0aGUgRE1BIGNvbXBhcmUgY2FsbGJhY2tzICovDQotICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDNF0tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BRGVsYXlQdWxzZU5DcGx0Ow0KLSAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9DQotICAgICAgICAgIFRJTV9ETUFEZWxheVB1bHNlSGFsZkNwbHQ7DQotDQotICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8NCi0gICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3JDQ3hOOw0KLQ0KLSAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8NCi0gICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XSwgKHVpbnQzMl90KXBEYXRhLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkNDUjQsIExlbmd0aCkgIT0gSEFMX09LKSB7DQotICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovDQotICAgICAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgICAgIH0NCi0gICAgICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgNCBETUEgcmVxdWVzdCAqLw0KLSAgICAgIF9fSEFMX1RJTV9FTkFCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0M0KTsNCi0gICAgICBicmVhazsNCi0gICAgfQ0KLQ0KLSAgICBkZWZhdWx0Og0KLSAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsNCi0gICAgICBicmVhazsNCi0gIH0NCi0NCi0gIGlmIChzdGF0dXMgPT0gSEFMX09LKSB7DQotICAgIC8qIEVuYWJsZSB0aGUgY29tcGxlbWVudGFyeSBQV00gb3V0cHV0ICAqLw0KLSAgICBUSU1fQ0N4TkNoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hOX0VOQUJMRSk7DQotDQotICAgIC8qIEVuYWJsZSB0aGUgTWFpbiBPdXRwdXQgKi8NCi0gICAgX19IQUxfVElNX01PRV9FTkFCTEUoaHRpbSk7DQotDQotICAgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCwgZXhjZXB0IGluIHRyaWdnZXIgbW9kZSB3aGVyZSBlbmFibGUgaXMNCi0gICAgICogYXV0b21hdGljYWxseSBkb25lIHdpdGggdHJpZ2dlciAqLw0KLSAgICBpZiAoSVNfVElNX1NMQVZFX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSkgew0KLSAgICAgIHRtcHNtY3IgPSBodGltLT5JbnN0YW5jZS0+U01DUiAmIFRJTV9TTUNSX1NNUzsNCi0gICAgICBpZiAoIUlTX1RJTV9TTEFWRU1PREVfVFJJR0dFUl9FTkFCTEVEKHRtcHNtY3IpKSB7DQotICAgICAgICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOw0KLSAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOw0KLSAgICB9DQotICB9DQotDQotICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovDQotICByZXR1cm4gc3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFN0b3BzIHRoZSBUSU0gUFdNIHNpZ25hbCBnZW5lcmF0aW9uIGluIERNQSBtb2RlIG9uIHRoZSBjb21wbGVtZW50YXJ5DQotICogICAgICAgICBvdXRwdXQNCi0gKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQ0KLSAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbCB0byBiZSBkaXNhYmxlZA0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfUFdNTl9TdG9wX0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKSB7DQotICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7DQotDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hOX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7DQotDQotICBzd2l0Y2ggKENoYW5uZWwpIHsNCi0gICAgY2FzZSBUSU1fQ0hBTk5FTF8xOiB7DQotICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAxIERNQSByZXF1ZXN0ICovDQotICAgICAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MxKTsNCi0gICAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdKTsNCi0gICAgICBicmVhazsNCi0gICAgfQ0KLQ0KLSAgICBjYXNlIFRJTV9DSEFOTkVMXzI6IHsNCi0gICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDIgRE1BIHJlcXVlc3QgKi8NCi0gICAgICBfX0hBTF9USU1fRElTQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzIpOw0KLSAgICAgICh2b2lkKUhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0pOw0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotDQotICAgIGNhc2UgVElNX0NIQU5ORUxfMzogew0KLSAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMyBETUEgcmVxdWVzdCAqLw0KLSAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMyk7DQotICAgICAgKHZvaWQpSEFMX0RNQV9BYm9ydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXSk7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0NCi0gICAgY2FzZSBUSU1fQ0hBTk5FTF80OiB7DQotICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSA0IERNQSByZXF1ZXN0ICovDQotICAgICAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0M0KTsNCi0gICAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdKTsNCi0gICAgICBicmVhazsNCi0gICAgfQ0KLQ0KLSAgICBkZWZhdWx0Og0KLSAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsNCi0gICAgICBicmVhazsNCi0gIH0NCi0NCi0gIGlmIChzdGF0dXMgPT0gSEFMX09LKSB7DQotICAgIC8qIERpc2FibGUgdGhlIGNvbXBsZW1lbnRhcnkgUFdNIG91dHB1dCAqLw0KLSAgICBUSU1fQ0N4TkNoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hOX0RJU0FCTEUpOw0KLQ0KLSAgICAvKiBEaXNhYmxlIHRoZSBNYWluIE91dHB1dCAqLw0KLSAgICBfX0hBTF9USU1fTU9FX0RJU0FCTEUoaHRpbSk7DQotDQotICAgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8NCi0gICAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7DQotDQotICAgIC8qIFNldCB0aGUgVElNIGNvbXBsZW1lbnRhcnkgY2hhbm5lbCBzdGF0ZSAqLw0KLSAgICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBDaGFubmVsLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOw0KLSAgfQ0KLQ0KLSAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLw0KLSAgcmV0dXJuIHN0YXR1czsNCi19DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTUV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQgRXh0ZW5kZWQgVGltZXIgQ29tcGxlbWVudGFyeSBPbmUNCi1QdWxzZSBmdW5jdGlvbnMNCi0gICogQGJyaWVmICAgIFRpbWVyIENvbXBsZW1lbnRhcnkgT25lIFB1bHNlIGZ1bmN0aW9ucw0KLSAgKg0KLUB2ZXJiYXRpbQ0KLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgICAgICAgICAgICAgICMjIyMjIFRpbWVyIENvbXBsZW1lbnRhcnkgT25lIFB1bHNlIGZ1bmN0aW9ucyAjIyMjIw0KLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICBbLi5dDQotICAgIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86DQotICAgICgrKSBTdGFydCB0aGUgQ29tcGxlbWVudGFyeSBPbmUgUHVsc2UgZ2VuZXJhdGlvbi4NCi0gICAgKCspIFN0b3AgdGhlIENvbXBsZW1lbnRhcnkgT25lIFB1bHNlLg0KLSAgICAoKykgU3RhcnQgdGhlIENvbXBsZW1lbnRhcnkgT25lIFB1bHNlIGFuZCBlbmFibGUgaW50ZXJydXB0cy4NCi0gICAgKCspIFN0b3AgdGhlIENvbXBsZW1lbnRhcnkgT25lIFB1bHNlIGFuZCBkaXNhYmxlIGludGVycnVwdHMuDQotDQotQGVuZHZlcmJhdGltDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU3RhcnRzIHRoZSBUSU0gT25lIFB1bHNlIHNpZ25hbCBnZW5lcmF0aW9uIG9uIHRoZSBjb21wbGVtZW50YXJ5DQotICogICAgICAgICBvdXRwdXQuDQotICogQG5vdGUgT3V0cHV0Q2hhbm5lbCBtdXN0IG1hdGNoIHRoZSBwdWxzZSBvdXRwdXQgY2hhbm5lbCBjaG9zZW4gd2hlbiBjYWxsaW5nDQotICogICAgICAgQHJlZiBIQUxfVElNX09uZVB1bHNlX0NvbmZpZ0NoYW5uZWwoKS4NCi0gKiBAcGFyYW0gIGh0aW0gVElNIE9uZSBQdWxzZSBoYW5kbGUNCi0gKiBAcGFyYW0gIE91dHB1dENoYW5uZWwgcHVsc2Ugb3V0cHV0IGNoYW5uZWwgdG8gZW5hYmxlDQotICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X09uZVB1bHNlTl9TdGFydChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE91dHB1dENoYW5uZWwpIHsNCi0gIHVpbnQzMl90IGlucHV0X2NoYW5uZWwgPQ0KLSAgICAgIChPdXRwdXRDaGFubmVsID09IFRJTV9DSEFOTkVMXzEpID8gVElNX0NIQU5ORUxfMiA6IFRJTV9DSEFOTkVMXzE7DQotICBIQUxfVElNX0NoYW5uZWxTdGF0ZVR5cGVEZWYgY2hhbm5lbF8xX3N0YXRlID0NCi0gICAgICBUSU1fQ0hBTk5FTF9TVEFURV9HRVQoaHRpbSwgVElNX0NIQU5ORUxfMSk7DQotICBIQUxfVElNX0NoYW5uZWxTdGF0ZVR5cGVEZWYgY2hhbm5lbF8yX3N0YXRlID0NCi0gICAgICBUSU1fQ0hBTk5FTF9TVEFURV9HRVQoaHRpbSwgVElNX0NIQU5ORUxfMik7DQotICBIQUxfVElNX0NoYW5uZWxTdGF0ZVR5cGVEZWYgY29tcGxlbWVudGFyeV9jaGFubmVsXzFfc3RhdGUgPQ0KLSAgICAgIFRJTV9DSEFOTkVMX05fU1RBVEVfR0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEpOw0KLSAgSEFMX1RJTV9DaGFubmVsU3RhdGVUeXBlRGVmIGNvbXBsZW1lbnRhcnlfY2hhbm5lbF8yX3N0YXRlID0NCi0gICAgICBUSU1fQ0hBTk5FTF9OX1NUQVRFX0dFVChodGltLCBUSU1fQ0hBTk5FTF8yKTsNCi0NCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWE5fSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIE91dHB1dENoYW5uZWwpKTsNCi0NCi0gIC8qIENoZWNrIHRoZSBUSU0gY2hhbm5lbHMgc3RhdGUgKi8NCi0gIGlmICgoY2hhbm5lbF8xX3N0YXRlICE9IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSkgfHwNCi0gICAgICAoY2hhbm5lbF8yX3N0YXRlICE9IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSkgfHwNCi0gICAgICAoY29tcGxlbWVudGFyeV9jaGFubmVsXzFfc3RhdGUgIT0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKSB8fA0KLSAgICAgIChjb21wbGVtZW50YXJ5X2NoYW5uZWxfMl9zdGF0ZSAhPSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpKSB7DQotICAgIHJldHVybiBIQUxfRVJST1I7DQotICB9DQotDQotICAvKiBTZXQgdGhlIFRJTSBjaGFubmVscyBzdGF0ZSAqLw0KLSAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKTsNCi0gIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8yLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSk7DQotICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8xLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSk7DQotICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8yLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSk7DQotDQotICAvKiBFbmFibGUgdGhlIGNvbXBsZW1lbnRhcnkgT25lIFB1bHNlIG91dHB1dCBjaGFubmVsIGFuZCB0aGUgSW5wdXQgQ2FwdHVyZQ0KLSAgICogY2hhbm5lbCAqLw0KLSAgVElNX0NDeE5DaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBPdXRwdXRDaGFubmVsLCBUSU1fQ0N4Tl9FTkFCTEUpOw0KLSAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIGlucHV0X2NoYW5uZWwsIFRJTV9DQ3hfRU5BQkxFKTsNCi0NCi0gIC8qIEVuYWJsZSB0aGUgTWFpbiBPdXRwdXQgKi8NCi0gIF9fSEFMX1RJTV9NT0VfRU5BQkxFKGh0aW0pOw0KLQ0KLSAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLw0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTdG9wcyB0aGUgVElNIE9uZSBQdWxzZSBzaWduYWwgZ2VuZXJhdGlvbiBvbiB0aGUgY29tcGxlbWVudGFyeQ0KLSAqICAgICAgICAgb3V0cHV0Lg0KLSAqIEBub3RlIE91dHB1dENoYW5uZWwgbXVzdCBtYXRjaCB0aGUgcHVsc2Ugb3V0cHV0IGNoYW5uZWwgY2hvc2VuIHdoZW4gY2FsbGluZw0KLSAqICAgICAgIEByZWYgSEFMX1RJTV9PbmVQdWxzZV9Db25maWdDaGFubmVsKCkuDQotICogQHBhcmFtICBodGltIFRJTSBPbmUgUHVsc2UgaGFuZGxlDQotICogQHBhcmFtICBPdXRwdXRDaGFubmVsIHB1bHNlIG91dHB1dCBjaGFubmVsIHRvIGRpc2FibGUNCi0gKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfT25lUHVsc2VOX1N0b3AoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE91dHB1dENoYW5uZWwpIHsNCi0gIHVpbnQzMl90IGlucHV0X2NoYW5uZWwgPQ0KLSAgICAgIChPdXRwdXRDaGFubmVsID09IFRJTV9DSEFOTkVMXzEpID8gVElNX0NIQU5ORUxfMiA6IFRJTV9DSEFOTkVMXzE7DQotDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hOX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBPdXRwdXRDaGFubmVsKSk7DQotDQotICAvKiBEaXNhYmxlIHRoZSBjb21wbGVtZW50YXJ5IE9uZSBQdWxzZSBvdXRwdXQgY2hhbm5lbCBhbmQgdGhlIElucHV0IENhcHR1cmUNCi0gICAqIGNoYW5uZWwgKi8NCi0gIFRJTV9DQ3hOQ2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgT3V0cHV0Q2hhbm5lbCwgVElNX0NDeE5fRElTQUJMRSk7DQotICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgaW5wdXRfY2hhbm5lbCwgVElNX0NDeF9ESVNBQkxFKTsNCi0NCi0gIC8qIERpc2FibGUgdGhlIE1haW4gT3V0cHV0ICovDQotICBfX0hBTF9USU1fTU9FX0RJU0FCTEUoaHRpbSk7DQotDQotICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovDQotICBfX0hBTF9USU1fRElTQUJMRShodGltKTsNCi0NCi0gIC8qIFNldCB0aGUgVElNICBjaGFubmVscyBzdGF0ZSAqLw0KLSAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7DQotICBUSU1fQ0hBTk5FTF9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMiwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsNCi0gIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7DQotICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8yLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOw0KLQ0KLSAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLw0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTdGFydHMgdGhlIFRJTSBPbmUgUHVsc2Ugc2lnbmFsIGdlbmVyYXRpb24gaW4gaW50ZXJydXB0IG1vZGUgb24gdGhlDQotICogICAgICAgICBjb21wbGVtZW50YXJ5IGNoYW5uZWwuDQotICogQG5vdGUgT3V0cHV0Q2hhbm5lbCBtdXN0IG1hdGNoIHRoZSBwdWxzZSBvdXRwdXQgY2hhbm5lbCBjaG9zZW4gd2hlbiBjYWxsaW5nDQotICogICAgICAgQHJlZiBIQUxfVElNX09uZVB1bHNlX0NvbmZpZ0NoYW5uZWwoKS4NCi0gKiBAcGFyYW0gIGh0aW0gVElNIE9uZSBQdWxzZSBoYW5kbGUNCi0gKiBAcGFyYW0gIE91dHB1dENoYW5uZWwgcHVsc2Ugb3V0cHV0IGNoYW5uZWwgdG8gZW5hYmxlDQotICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X09uZVB1bHNlTl9TdGFydF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE91dHB1dENoYW5uZWwpIHsNCi0gIHVpbnQzMl90IGlucHV0X2NoYW5uZWwgPQ0KLSAgICAgIChPdXRwdXRDaGFubmVsID09IFRJTV9DSEFOTkVMXzEpID8gVElNX0NIQU5ORUxfMiA6IFRJTV9DSEFOTkVMXzE7DQotICBIQUxfVElNX0NoYW5uZWxTdGF0ZVR5cGVEZWYgY2hhbm5lbF8xX3N0YXRlID0NCi0gICAgICBUSU1fQ0hBTk5FTF9TVEFURV9HRVQoaHRpbSwgVElNX0NIQU5ORUxfMSk7DQotICBIQUxfVElNX0NoYW5uZWxTdGF0ZVR5cGVEZWYgY2hhbm5lbF8yX3N0YXRlID0NCi0gICAgICBUSU1fQ0hBTk5FTF9TVEFURV9HRVQoaHRpbSwgVElNX0NIQU5ORUxfMik7DQotICBIQUxfVElNX0NoYW5uZWxTdGF0ZVR5cGVEZWYgY29tcGxlbWVudGFyeV9jaGFubmVsXzFfc3RhdGUgPQ0KLSAgICAgIFRJTV9DSEFOTkVMX05fU1RBVEVfR0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEpOw0KLSAgSEFMX1RJTV9DaGFubmVsU3RhdGVUeXBlRGVmIGNvbXBsZW1lbnRhcnlfY2hhbm5lbF8yX3N0YXRlID0NCi0gICAgICBUSU1fQ0hBTk5FTF9OX1NUQVRFX0dFVChodGltLCBUSU1fQ0hBTk5FTF8yKTsNCi0NCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWE5fSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIE91dHB1dENoYW5uZWwpKTsNCi0NCi0gIC8qIENoZWNrIHRoZSBUSU0gY2hhbm5lbHMgc3RhdGUgKi8NCi0gIGlmICgoY2hhbm5lbF8xX3N0YXRlICE9IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSkgfHwNCi0gICAgICAoY2hhbm5lbF8yX3N0YXRlICE9IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSkgfHwNCi0gICAgICAoY29tcGxlbWVudGFyeV9jaGFubmVsXzFfc3RhdGUgIT0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKSB8fA0KLSAgICAgIChjb21wbGVtZW50YXJ5X2NoYW5uZWxfMl9zdGF0ZSAhPSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpKSB7DQotICAgIHJldHVybiBIQUxfRVJST1I7DQotICB9DQotDQotICAvKiBTZXQgdGhlIFRJTSBjaGFubmVscyBzdGF0ZSAqLw0KLSAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKTsNCi0gIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8yLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSk7DQotICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8xLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSk7DQotICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8yLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSk7DQotDQotICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMSBpbnRlcnJ1cHQgKi8NCi0gIF9fSEFMX1RJTV9FTkFCTEVfSVQoaHRpbSwgVElNX0lUX0NDMSk7DQotDQotICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMiBpbnRlcnJ1cHQgKi8NCi0gIF9fSEFMX1RJTV9FTkFCTEVfSVQoaHRpbSwgVElNX0lUX0NDMik7DQotDQotICAvKiBFbmFibGUgdGhlIGNvbXBsZW1lbnRhcnkgT25lIFB1bHNlIG91dHB1dCBjaGFubmVsIGFuZCB0aGUgSW5wdXQgQ2FwdHVyZQ0KLSAgICogY2hhbm5lbCAqLw0KLSAgVElNX0NDeE5DaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBPdXRwdXRDaGFubmVsLCBUSU1fQ0N4Tl9FTkFCTEUpOw0KLSAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIGlucHV0X2NoYW5uZWwsIFRJTV9DQ3hfRU5BQkxFKTsNCi0NCi0gIC8qIEVuYWJsZSB0aGUgTWFpbiBPdXRwdXQgKi8NCi0gIF9fSEFMX1RJTV9NT0VfRU5BQkxFKGh0aW0pOw0KLQ0KLSAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLw0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTdG9wcyB0aGUgVElNIE9uZSBQdWxzZSBzaWduYWwgZ2VuZXJhdGlvbiBpbiBpbnRlcnJ1cHQgbW9kZSBvbiB0aGUNCi0gKiAgICAgICAgIGNvbXBsZW1lbnRhcnkgY2hhbm5lbC4NCi0gKiBAbm90ZSBPdXRwdXRDaGFubmVsIG11c3QgbWF0Y2ggdGhlIHB1bHNlIG91dHB1dCBjaGFubmVsIGNob3NlbiB3aGVuIGNhbGxpbmcNCi0gKiAgICAgICBAcmVmIEhBTF9USU1fT25lUHVsc2VfQ29uZmlnQ2hhbm5lbCgpLg0KLSAqIEBwYXJhbSAgaHRpbSBUSU0gT25lIFB1bHNlIGhhbmRsZQ0KLSAqIEBwYXJhbSAgT3V0cHV0Q2hhbm5lbCBwdWxzZSBvdXRwdXQgY2hhbm5lbCB0byBkaXNhYmxlDQotICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X09uZVB1bHNlTl9TdG9wX0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBPdXRwdXRDaGFubmVsKSB7DQotICB1aW50MzJfdCBpbnB1dF9jaGFubmVsID0NCi0gICAgICAoT3V0cHV0Q2hhbm5lbCA9PSBUSU1fQ0hBTk5FTF8xKSA/IFRJTV9DSEFOTkVMXzIgOiBUSU1fQ0hBTk5FTF8xOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fQ0NYTl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgT3V0cHV0Q2hhbm5lbCkpOw0KLQ0KLSAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAxIGludGVycnVwdCAqLw0KLSAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDMSk7DQotDQotICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDIgaW50ZXJydXB0ICovDQotICBfX0hBTF9USU1fRElTQUJMRV9JVChodGltLCBUSU1fSVRfQ0MyKTsNCi0NCi0gIC8qIERpc2FibGUgdGhlIGNvbXBsZW1lbnRhcnkgT25lIFB1bHNlIG91dHB1dCBjaGFubmVsIGFuZCB0aGUgSW5wdXQgQ2FwdHVyZQ0KLSAgICogY2hhbm5lbCAqLw0KLSAgVElNX0NDeE5DaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBPdXRwdXRDaGFubmVsLCBUSU1fQ0N4Tl9ESVNBQkxFKTsNCi0gIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBpbnB1dF9jaGFubmVsLCBUSU1fQ0N4X0RJU0FCTEUpOw0KLQ0KLSAgLyogRGlzYWJsZSB0aGUgTWFpbiBPdXRwdXQgKi8NCi0gIF9fSEFMX1RJTV9NT0VfRElTQUJMRShodGltKTsNCi0NCi0gIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8NCi0gIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOw0KLQ0KLSAgLyogU2V0IHRoZSBUSU0gIGNoYW5uZWxzIHN0YXRlICovDQotICBUSU1fQ0hBTk5FTF9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMSwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsNCi0gIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8yLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOw0KLSAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMSwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsNCi0gIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7DQotDQotICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovDQotICByZXR1cm4gSEFMX09LOw0KLX0NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNSBFeHRlbmRlZCBQZXJpcGhlcmFsIENvbnRyb2wNCi1mdW5jdGlvbnMNCi0gICogQGJyaWVmICAgIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMNCi0gICoNCi1AdmVyYmF0aW0NCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICAgICAgICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAjIyMjIw0KLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICBbLi5dDQotICAgIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86DQotICAgICAgKCspIENvbmZpZ3VyZSB0aGUgY29tbXV0YXRpb24gZXZlbnQgaW4gY2FzZSBvZiB1c2Ugb2YgdGhlIEhhbGwgc2Vuc29yDQotaW50ZXJmYWNlLg0KLSAgICAgICgrKSBDb25maWd1cmUgT3V0cHV0IGNoYW5uZWxzIGZvciBPQyBhbmQgUFdNIG1vZGUuDQotDQotICAgICAgKCspIENvbmZpZ3VyZSBDb21wbGVtZW50YXJ5IGNoYW5uZWxzLCBicmVhayBmZWF0dXJlcyBhbmQgZGVhZCB0aW1lLg0KLSAgICAgICgrKSBDb25maWd1cmUgTWFzdGVyIHN5bmNocm9uaXphdGlvbi4NCi0gICAgICAoKykgQ29uZmlndXJlIHRpbWVyIHJlbWFwcGluZyBjYXBhYmlsaXRpZXMuDQotICAgICAgKCspIFNlbGVjdCB0aW1lciBpbnB1dCBzb3VyY2UuDQotICAgICAgKCspIEVuYWJsZSBvciBkaXNhYmxlIGNoYW5uZWwgZ3JvdXBpbmcuDQotICAgICAgKCspIENvbmZpZ3VyZSBQdWxzZSBvbiBjb21wYXJlLg0KLSAgICAgICgrKSBDb25maWd1cmUgRW5jb2RlciBpbmRleC4NCi0NCi1AZW5kdmVyYmF0aW0NCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICogQGJyaWVmICBDb25maWd1cmUgdGhlIFRJTSBjb21tdXRhdGlvbiBldmVudCBzZXF1ZW5jZS4NCi0gKiBAbm90ZSAgVGhpcyBmdW5jdGlvbiBpcyBtYW5kYXRvcnkgdG8gdXNlIHRoZSBjb21tdXRhdGlvbiBldmVudCBpbiBvcmRlciB0bw0KLSAqICAgICAgICB1cGRhdGUgdGhlIGNvbmZpZ3VyYXRpb24gYXQgZWFjaCBjb21tdXRhdGlvbiBkZXRlY3Rpb24gb24gdGhlIFRSR0kNCi0gKiBpbnB1dCBvZiB0aGUgVGltZXIsIHRoZSB0eXBpY2FsIHVzZSBvZiB0aGlzIGZlYXR1cmUgaXMgd2l0aCB0aGUgdXNlIG9mDQotICogYW5vdGhlciBUaW1lcihpbnRlcmZhY2UgVGltZXIpIGNvbmZpZ3VyZWQgaW4gSGFsbCBzZW5zb3IgaW50ZXJmYWNlLCB0aGlzDQotICogaW50ZXJmYWNlIFRpbWVyIHdpbGwgZ2VuZXJhdGUgdGhlIGNvbW11dGF0aW9uIGF0IGl0cyBUUkdPIG91dHB1dCAoY29ubmVjdGVkDQotICogdG8gVGltZXIgdXNlZCBpbiB0aGlzIGZ1bmN0aW9uKSBlYWNoIHRpbWUgdGhlIFRJMSBvZiB0aGUgSW50ZXJmYWNlIFRpbWVyDQotICogZGV0ZWN0IGEgY29tbXV0YXRpb24gYXQgaXRzIGlucHV0IFRJMS4NCi0gKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQ0KLSAqIEBwYXJhbSAgSW5wdXRUcmlnZ2VyIHRoZSBJbnRlcm5hbCB0cmlnZ2VyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIFRpbWVyDQotICogSW50ZXJmYWNpbmcgd2l0aCB0aGUgSGFsbCBzZW5zb3IgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nDQotICogdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfSVRSMDogSW50ZXJuYWwgdHJpZ2dlciAwIHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9UU19JVFIxOiBJbnRlcm5hbCB0cmlnZ2VyIDEgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX1RTX0lUUjI6IEludGVybmFsIHRyaWdnZXIgMiBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfSVRSMzogSW50ZXJuYWwgdHJpZ2dlciAzIHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9UU19JVFI0OiBJbnRlcm5hbCB0cmlnZ2VyIDQgc2VsZWN0ZWQgICAoKikNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX1RTX0lUUjU6IEludGVybmFsIHRyaWdnZXIgNSBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfSVRSNjogSW50ZXJuYWwgdHJpZ2dlciA2IHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9UU19JVFI3OiBJbnRlcm5hbCB0cmlnZ2VyIDcgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX1RTX0lUUjg6IEludGVybmFsIHRyaWdnZXIgOCBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfSVRSOTogSW50ZXJuYWwgdHJpZ2dlciA5IHNlbGVjdGVkICAgKCopDQotICogICAgICAgICAgICBAYXJnIFRJTV9UU19JVFIxMDogSW50ZXJuYWwgdHJpZ2dlciAxMCBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfSVRSMTE6IEludGVybmFsIHRyaWdnZXIgMTEgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX1RTX05PTkU6IE5vIHRyaWdnZXIgaXMgbmVlZGVkDQotICoNCi0gKiAgICAgICAgICgqKSAgVmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuDQotICoNCi0gKiBAcGFyYW0gIENvbW11dGF0aW9uU291cmNlIHRoZSBDb21tdXRhdGlvbiBFdmVudCBzb3VyY2UNCi0gKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ09NTVVUQVRJT05fVFJHSTogQ29tbXV0YXRpb24gc291cmNlIGlzIHRoZSBUUkdJIG9mIHRoZQ0KLSAqIEludGVyZmFjZSBUaW1lcg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ09NTVVUQVRJT05fU09GVFdBUkU6ICBDb21tdXRhdGlvbiBzb3VyY2UgaXMgc2V0IGJ5DQotICogc29mdHdhcmUgdXNpbmcgdGhlIENPTUcgYml0DQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0NvbmZpZ0NvbW11dEV2ZW50KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBJbnB1dFRyaWdnZXIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENvbW11dGF0aW9uU291cmNlKSB7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DT01NVVRBVElPTl9FVkVOVF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKA0KLSAgICAgIElTX1RJTV9JTlRFUk5BTF9UUklHR0VSRVZFTlRfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIElucHV0VHJpZ2dlcikpOw0KLQ0KLSAgX19IQUxfTE9DSyhodGltKTsNCi0NCi0jaWYgZGVmaW5lZChUSU01KSAmJiBkZWZpbmVkKFRJTTIwKQ0KLSAgaWYgKChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjApIHx8IChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjEpIHx8DQotICAgICAgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMikgfHwgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMykgfHwNCi0gICAgICAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFI0KSB8fCAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFI1KSB8fA0KLSAgICAgIChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjYpIHx8IChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjcpIHx8DQotICAgICAgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSOCkgfHwgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSOSkgfHwNCi0gICAgICAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFIxMCkgfHwgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMTEpKQ0KLSNlbGlmIGRlZmluZWQoVElNNSkNCi0gIGlmICgoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFIwKSB8fCAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFIxKSB8fA0KLSAgICAgIChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjIpIHx8IChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjMpIHx8DQotICAgICAgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSNCkgfHwgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSNSkgfHwNCi0gICAgICAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFI2KSB8fCAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFI3KSB8fA0KLSAgICAgIChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjgpIHx8IChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjExKSkNCi0jZWxpZiBkZWZpbmVkKFRJTTIwKQ0KLSAgaWYgKChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjApIHx8IChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjEpIHx8DQotICAgICAgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMikgfHwgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMykgfHwNCi0gICAgICAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFI1KSB8fCAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFI2KSB8fA0KLSAgICAgIChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjcpIHx8IChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjgpIHx8DQotICAgICAgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSOSkgfHwgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMTEpKQ0KLSNlbHNlDQotICBpZiAoKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMCkgfHwgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMSkgfHwNCi0gICAgICAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFIyKSB8fCAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFIzKSB8fA0KLSAgICAgIChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjUpIHx8IChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjYpIHx8DQotICAgICAgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSNykgfHwgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSOCkgfHwNCi0gICAgICAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFIxMSkpDQotI2VuZGlmIC8qIFRJTTUgJiYgVElNMjAgKi8NCi0gIHsNCi0gICAgLyogU2VsZWN0IHRoZSBJbnB1dCB0cmlnZ2VyICovDQotICAgIGh0aW0tPkluc3RhbmNlLT5TTUNSICY9IH5USU1fU01DUl9UUzsNCi0gICAgaHRpbS0+SW5zdGFuY2UtPlNNQ1IgfD0gSW5wdXRUcmlnZ2VyOw0KLSAgfQ0KLQ0KLSAgLyogU2VsZWN0IHRoZSBDYXB0dXJlIENvbXBhcmUgcHJlbG9hZCBmZWF0dXJlICovDQotICBodGltLT5JbnN0YW5jZS0+Q1IyIHw9IFRJTV9DUjJfQ0NQQzsNCi0gIC8qIFNlbGVjdCB0aGUgQ29tbXV0YXRpb24gZXZlbnQgc291cmNlICovDQotICBodGltLT5JbnN0YW5jZS0+Q1IyICY9IH5USU1fQ1IyX0NDVVM7DQotICBodGltLT5JbnN0YW5jZS0+Q1IyIHw9IENvbW11dGF0aW9uU291cmNlOw0KLQ0KLSAgLyogRGlzYWJsZSBDb21tdXRhdGlvbiBJbnRlcnJ1cHQgKi8NCi0gIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9DT00pOw0KLQ0KLSAgLyogRGlzYWJsZSBDb21tdXRhdGlvbiBETUEgcmVxdWVzdCAqLw0KLSAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ09NKTsNCi0NCi0gIF9fSEFMX1VOTE9DSyhodGltKTsNCi0NCi0gIHJldHVybiBIQUxfT0s7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBUSU0gY29tbXV0YXRpb24gZXZlbnQgc2VxdWVuY2Ugd2l0aCBpbnRlcnJ1cHQuDQotICogQG5vdGUgIFRoaXMgZnVuY3Rpb24gaXMgbWFuZGF0b3J5IHRvIHVzZSB0aGUgY29tbXV0YXRpb24gZXZlbnQgaW4gb3JkZXIgdG8NCi0gKiAgICAgICAgdXBkYXRlIHRoZSBjb25maWd1cmF0aW9uIGF0IGVhY2ggY29tbXV0YXRpb24gZGV0ZWN0aW9uIG9uIHRoZSBUUkdJDQotICogaW5wdXQgb2YgdGhlIFRpbWVyLCB0aGUgdHlwaWNhbCB1c2Ugb2YgdGhpcyBmZWF0dXJlIGlzIHdpdGggdGhlIHVzZSBvZg0KLSAqIGFub3RoZXIgVGltZXIoaW50ZXJmYWNlIFRpbWVyKSBjb25maWd1cmVkIGluIEhhbGwgc2Vuc29yIGludGVyZmFjZSwgdGhpcw0KLSAqIGludGVyZmFjZSBUaW1lciB3aWxsIGdlbmVyYXRlIHRoZSBjb21tdXRhdGlvbiBhdCBpdHMgVFJHTyBvdXRwdXQgKGNvbm5lY3RlZA0KLSAqIHRvIFRpbWVyIHVzZWQgaW4gdGhpcyBmdW5jdGlvbikgZWFjaCB0aW1lIHRoZSBUSTEgb2YgdGhlIEludGVyZmFjZSBUaW1lcg0KLSAqIGRldGVjdCBhIGNvbW11dGF0aW9uIGF0IGl0cyBpbnB1dCBUSTEuDQotICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUNCi0gKiBAcGFyYW0gIElucHV0VHJpZ2dlciB0aGUgSW50ZXJuYWwgdHJpZ2dlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBUaW1lcg0KLSAqIEludGVyZmFjaW5nIHdpdGggdGhlIEhhbGwgc2Vuc29yIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZw0KLSAqIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX1RTX0lUUjA6IEludGVybmFsIHRyaWdnZXIgMCBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfSVRSMTogSW50ZXJuYWwgdHJpZ2dlciAxIHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9UU19JVFIyOiBJbnRlcm5hbCB0cmlnZ2VyIDIgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX1RTX0lUUjM6IEludGVybmFsIHRyaWdnZXIgMyBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfSVRSNDogSW50ZXJuYWwgdHJpZ2dlciA0IHNlbGVjdGVkICAgKCopDQotICogICAgICAgICAgICBAYXJnIFRJTV9UU19JVFI1OiBJbnRlcm5hbCB0cmlnZ2VyIDUgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX1RTX0lUUjY6IEludGVybmFsIHRyaWdnZXIgNiBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfSVRSNzogSW50ZXJuYWwgdHJpZ2dlciA3IHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9UU19JVFI4OiBJbnRlcm5hbCB0cmlnZ2VyIDggc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX1RTX0lUUjk6IEludGVybmFsIHRyaWdnZXIgOSBzZWxlY3RlZCAgICgqKQ0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfSVRSMTA6IEludGVybmFsIHRyaWdnZXIgMTAgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX1RTX0lUUjExOiBJbnRlcm5hbCB0cmlnZ2VyIDExIHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9UU19OT05FOiBObyB0cmlnZ2VyIGlzIG5lZWRlZA0KLSAqDQotICogICAgICAgICAoKikgIFZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLg0KLSAqDQotICogQHBhcmFtICBDb21tdXRhdGlvblNvdXJjZSB0aGUgQ29tbXV0YXRpb24gRXZlbnQgc291cmNlDQotICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NPTU1VVEFUSU9OX1RSR0k6IENvbW11dGF0aW9uIHNvdXJjZSBpcyB0aGUgVFJHSSBvZiB0aGUNCi0gKiBJbnRlcmZhY2UgVGltZXINCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NPTU1VVEFUSU9OX1NPRlRXQVJFOiAgQ29tbXV0YXRpb24gc291cmNlIGlzIHNldCBieQ0KLSAqIHNvZnR3YXJlIHVzaW5nIHRoZSBDT01HIGJpdA0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9Db25maWdDb21tdXRFdmVudF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgSW5wdXRUcmlnZ2VyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDb21tdXRhdGlvblNvdXJjZSkgew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fQ09NTVVUQVRJT05fRVZFTlRfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsNCi0gIGFzc2VydF9wYXJhbSgNCi0gICAgICBJU19USU1fSU5URVJOQUxfVFJJR0dFUkVWRU5UX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBJbnB1dFRyaWdnZXIpKTsNCi0NCi0gIF9fSEFMX0xPQ0soaHRpbSk7DQotDQotI2lmIGRlZmluZWQoVElNNSkgJiYgZGVmaW5lZChUSU0yMCkNCi0gIGlmICgoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFIwKSB8fCAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFIxKSB8fA0KLSAgICAgIChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjIpIHx8IChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjMpIHx8DQotICAgICAgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSNCkgfHwgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSNSkgfHwNCi0gICAgICAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFI2KSB8fCAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFI3KSB8fA0KLSAgICAgIChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjgpIHx8IChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjkpIHx8DQotICAgICAgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMTApIHx8IChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjExKSkNCi0jZWxpZiBkZWZpbmVkKFRJTTUpDQotICBpZiAoKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMCkgfHwgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMSkgfHwNCi0gICAgICAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFIyKSB8fCAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFIzKSB8fA0KLSAgICAgIChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjQpIHx8IChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjUpIHx8DQotICAgICAgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSNikgfHwgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSNykgfHwNCi0gICAgICAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFI4KSB8fCAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFIxMSkpDQotI2VsaWYgZGVmaW5lZChUSU0yMCkNCi0gIGlmICgoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFIwKSB8fCAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFIxKSB8fA0KLSAgICAgIChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjIpIHx8IChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjMpIHx8DQotICAgICAgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSNSkgfHwgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSNikgfHwNCi0gICAgICAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFI3KSB8fCAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFI4KSB8fA0KLSAgICAgIChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjkpIHx8IChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjExKSkNCi0jZWxzZQ0KLSAgaWYgKChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjApIHx8IChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjEpIHx8DQotICAgICAgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMikgfHwgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMykgfHwNCi0gICAgICAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFI1KSB8fCAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFI2KSB8fA0KLSAgICAgIChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjcpIHx8IChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjgpIHx8DQotICAgICAgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMTEpKQ0KLSNlbmRpZiAvKiBUSU01ICYmIFRJTTIwICovDQotICB7DQotICAgIC8qIFNlbGVjdCB0aGUgSW5wdXQgdHJpZ2dlciAqLw0KLSAgICBodGltLT5JbnN0YW5jZS0+U01DUiAmPSB+VElNX1NNQ1JfVFM7DQotICAgIGh0aW0tPkluc3RhbmNlLT5TTUNSIHw9IElucHV0VHJpZ2dlcjsNCi0gIH0NCi0NCi0gIC8qIFNlbGVjdCB0aGUgQ2FwdHVyZSBDb21wYXJlIHByZWxvYWQgZmVhdHVyZSAqLw0KLSAgaHRpbS0+SW5zdGFuY2UtPkNSMiB8PSBUSU1fQ1IyX0NDUEM7DQotICAvKiBTZWxlY3QgdGhlIENvbW11dGF0aW9uIGV2ZW50IHNvdXJjZSAqLw0KLSAgaHRpbS0+SW5zdGFuY2UtPkNSMiAmPSB+VElNX0NSMl9DQ1VTOw0KLSAgaHRpbS0+SW5zdGFuY2UtPkNSMiB8PSBDb21tdXRhdGlvblNvdXJjZTsNCi0NCi0gIC8qIERpc2FibGUgQ29tbXV0YXRpb24gRE1BIHJlcXVlc3QgKi8NCi0gIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBUSU1fRE1BX0NPTSk7DQotDQotICAvKiBFbmFibGUgdGhlIENvbW11dGF0aW9uIEludGVycnVwdCAqLw0KLSAgX19IQUxfVElNX0VOQUJMRV9JVChodGltLCBUSU1fSVRfQ09NKTsNCi0NCi0gIF9fSEFMX1VOTE9DSyhodGltKTsNCi0NCi0gIHJldHVybiBIQUxfT0s7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBUSU0gY29tbXV0YXRpb24gZXZlbnQgc2VxdWVuY2Ugd2l0aCBETUEuDQotICogQG5vdGUgIFRoaXMgZnVuY3Rpb24gaXMgbWFuZGF0b3J5IHRvIHVzZSB0aGUgY29tbXV0YXRpb24gZXZlbnQgaW4gb3JkZXIgdG8NCi0gKiAgICAgICAgdXBkYXRlIHRoZSBjb25maWd1cmF0aW9uIGF0IGVhY2ggY29tbXV0YXRpb24gZGV0ZWN0aW9uIG9uIHRoZSBUUkdJDQotICogaW5wdXQgb2YgdGhlIFRpbWVyLCB0aGUgdHlwaWNhbCB1c2Ugb2YgdGhpcyBmZWF0dXJlIGlzIHdpdGggdGhlIHVzZSBvZg0KLSAqIGFub3RoZXIgVGltZXIoaW50ZXJmYWNlIFRpbWVyKSBjb25maWd1cmVkIGluIEhhbGwgc2Vuc29yIGludGVyZmFjZSwgdGhpcw0KLSAqIGludGVyZmFjZSBUaW1lciB3aWxsIGdlbmVyYXRlIHRoZSBjb21tdXRhdGlvbiBhdCBpdHMgVFJHTyBvdXRwdXQgKGNvbm5lY3RlZA0KLSAqIHRvIFRpbWVyIHVzZWQgaW4gdGhpcyBmdW5jdGlvbikgZWFjaCB0aW1lIHRoZSBUSTEgb2YgdGhlIEludGVyZmFjZSBUaW1lcg0KLSAqIGRldGVjdCBhIGNvbW11dGF0aW9uIGF0IGl0cyBpbnB1dCBUSTEuDQotICogQG5vdGUgIFRoZSB1c2VyIHNob3VsZCBjb25maWd1cmUgdGhlIERNQSBpbiBoaXMgb3duIHNvZnR3YXJlLCBpbiBUaGlzDQotICogZnVuY3Rpb24gb25seSB0aGUgQ09NREUgYml0IGlzIHNldA0KLSAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlDQotICogQHBhcmFtICBJbnB1dFRyaWdnZXIgdGhlIEludGVybmFsIHRyaWdnZXIgY29ycmVzcG9uZGluZyB0byB0aGUgVGltZXINCi0gKiBJbnRlcmZhY2luZyB3aXRoIHRoZSBIYWxsIHNlbnNvciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcNCi0gKiB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIFRJTV9UU19JVFIwOiBJbnRlcm5hbCB0cmlnZ2VyIDAgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX1RTX0lUUjE6IEludGVybmFsIHRyaWdnZXIgMSBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfSVRSMjogSW50ZXJuYWwgdHJpZ2dlciAyIHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9UU19JVFIzOiBJbnRlcm5hbCB0cmlnZ2VyIDMgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX1RTX0lUUjQ6IEludGVybmFsIHRyaWdnZXIgNCBzZWxlY3RlZCAgICgqKQ0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfSVRSNTogSW50ZXJuYWwgdHJpZ2dlciA1IHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9UU19JVFI2OiBJbnRlcm5hbCB0cmlnZ2VyIDYgc2VsZWN0ZWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX1RTX0lUUjc6IEludGVybmFsIHRyaWdnZXIgNyBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfSVRSODogSW50ZXJuYWwgdHJpZ2dlciA4IHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9UU19JVFI5OiBJbnRlcm5hbCB0cmlnZ2VyIDkgc2VsZWN0ZWQgICAoKikNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX1RTX0lUUjEwOiBJbnRlcm5hbCB0cmlnZ2VyIDEwIHNlbGVjdGVkDQotICogICAgICAgICAgICBAYXJnIFRJTV9UU19JVFIxMTogSW50ZXJuYWwgdHJpZ2dlciAxMSBzZWxlY3RlZA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfTk9ORTogTm8gdHJpZ2dlciBpcyBuZWVkZWQNCi0gKg0KLSAqICAgICAgICAgKCopICBWYWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4NCi0gKg0KLSAqIEBwYXJhbSAgQ29tbXV0YXRpb25Tb3VyY2UgdGhlIENvbW11dGF0aW9uIEV2ZW50IHNvdXJjZQ0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIFRJTV9DT01NVVRBVElPTl9UUkdJOiBDb21tdXRhdGlvbiBzb3VyY2UgaXMgdGhlIFRSR0kgb2YgdGhlDQotICogSW50ZXJmYWNlIFRpbWVyDQotICogICAgICAgICAgICBAYXJnIFRJTV9DT01NVVRBVElPTl9TT0ZUV0FSRTogIENvbW11dGF0aW9uIHNvdXJjZSBpcyBzZXQgYnkNCi0gKiBzb2Z0d2FyZSB1c2luZyB0aGUgQ09NRyBiaXQNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfQ29uZmlnQ29tbXV0RXZlbnRfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgSW5wdXRUcmlnZ2VyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ29tbXV0YXRpb25Tb3VyY2UpIHsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0NPTU1VVEFUSU9OX0VWRU5UX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7DQotICBhc3NlcnRfcGFyYW0oDQotICAgICAgSVNfVElNX0lOVEVSTkFMX1RSSUdHRVJFVkVOVF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgSW5wdXRUcmlnZ2VyKSk7DQotDQotICBfX0hBTF9MT0NLKGh0aW0pOw0KLQ0KLSNpZiBkZWZpbmVkKFRJTTUpICYmIGRlZmluZWQoVElNMjApDQotICBpZiAoKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMCkgfHwgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMSkgfHwNCi0gICAgICAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFIyKSB8fCAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFIzKSB8fA0KLSAgICAgIChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjQpIHx8IChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjUpIHx8DQotICAgICAgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSNikgfHwgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSNykgfHwNCi0gICAgICAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFI4KSB8fCAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFI5KSB8fA0KLSAgICAgIChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjEwKSB8fCAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFIxMSkpDQotI2VsaWYgZGVmaW5lZChUSU01KQ0KLSAgaWYgKChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjApIHx8IChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjEpIHx8DQotICAgICAgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMikgfHwgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMykgfHwNCi0gICAgICAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFI0KSB8fCAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFI1KSB8fA0KLSAgICAgIChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjYpIHx8IChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjcpIHx8DQotICAgICAgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSOCkgfHwgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMTEpKQ0KLSNlbGlmIGRlZmluZWQoVElNMjApDQotICBpZiAoKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMCkgfHwgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMSkgfHwNCi0gICAgICAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFIyKSB8fCAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFIzKSB8fA0KLSAgICAgIChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjUpIHx8IChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjYpIHx8DQotICAgICAgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSNykgfHwgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSOCkgfHwNCi0gICAgICAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFI5KSB8fCAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFIxMSkpDQotI2Vsc2UNCi0gIGlmICgoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFIwKSB8fCAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFIxKSB8fA0KLSAgICAgIChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjIpIHx8IChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjMpIHx8DQotICAgICAgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSNSkgfHwgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSNikgfHwNCi0gICAgICAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFI3KSB8fCAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFI4KSB8fA0KLSAgICAgIChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjExKSkNCi0jZW5kaWYgLyogVElNNSAmJiBUSU0yMCAqLw0KLSAgew0KLSAgICAvKiBTZWxlY3QgdGhlIElucHV0IHRyaWdnZXIgKi8NCi0gICAgaHRpbS0+SW5zdGFuY2UtPlNNQ1IgJj0gflRJTV9TTUNSX1RTOw0KLSAgICBodGltLT5JbnN0YW5jZS0+U01DUiB8PSBJbnB1dFRyaWdnZXI7DQotICB9DQotDQotICAvKiBTZWxlY3QgdGhlIENhcHR1cmUgQ29tcGFyZSBwcmVsb2FkIGZlYXR1cmUgKi8NCi0gIGh0aW0tPkluc3RhbmNlLT5DUjIgfD0gVElNX0NSMl9DQ1BDOw0KLSAgLyogU2VsZWN0IHRoZSBDb21tdXRhdGlvbiBldmVudCBzb3VyY2UgKi8NCi0gIGh0aW0tPkluc3RhbmNlLT5DUjIgJj0gflRJTV9DUjJfQ0NVUzsNCi0gIGh0aW0tPkluc3RhbmNlLT5DUjIgfD0gQ29tbXV0YXRpb25Tb3VyY2U7DQotDQotICAvKiBFbmFibGUgdGhlIENvbW11dGF0aW9uIERNQSBSZXF1ZXN0ICovDQotICAvKiBTZXQgdGhlIERNQSBDb21tdXRhdGlvbiBDYWxsYmFjayAqLw0KLSAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NPTU1VVEFUSU9OXS0+WGZlckNwbHRDYWxsYmFjayA9DQotICAgICAgVElNRXhfRE1BQ29tbXV0YXRpb25DcGx0Ow0KLSAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NPTU1VVEFUSU9OXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPQ0KLSAgICAgIFRJTUV4X0RNQUNvbW11dGF0aW9uSGFsZkNwbHQ7DQotICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLw0KLSAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NPTU1VVEFUSU9OXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3I7DQotDQotICAvKiBEaXNhYmxlIENvbW11dGF0aW9uIEludGVycnVwdCAqLw0KLSAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NPTSk7DQotDQotICAvKiBFbmFibGUgdGhlIENvbW11dGF0aW9uIERNQSBSZXF1ZXN0ICovDQotICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBUSU1fRE1BX0NPTSk7DQotDQotICBfX0hBTF9VTkxPQ0soaHRpbSk7DQotDQotICByZXR1cm4gSEFMX09LOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIFRJTSBpbiBtYXN0ZXIgbW9kZS4NCi0gKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZS4NCi0gKiBAcGFyYW0gIHNNYXN0ZXJDb25maWcgcG9pbnRlciB0byBhIFRJTV9NYXN0ZXJDb25maWdUeXBlRGVmIHN0cnVjdHVyZSB0aGF0DQotICogICAgICAgICBjb250YWlucyB0aGUgc2VsZWN0ZWQgdHJpZ2dlciBvdXRwdXQgKFRSR08pIGFuZCB0aGUgTWFzdGVyL1NsYXZlDQotICogICAgICAgICBtb2RlLg0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9NYXN0ZXJDb25maWdTeW5jaHJvbml6YXRpb24oDQotICAgIFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCBUSU1fTWFzdGVyQ29uZmlnVHlwZURlZiAqc01hc3RlckNvbmZpZykgew0KLSAgdWludDMyX3QgdG1wY3IyOw0KLSAgdWludDMyX3QgdG1wc21jcjsNCi0NCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX01BU1RFUl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9UUkdPX1NPVVJDRShzTWFzdGVyQ29uZmlnLT5NYXN0ZXJPdXRwdXRUcmlnZ2VyKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX01TTV9TVEFURShzTWFzdGVyQ29uZmlnLT5NYXN0ZXJTbGF2ZU1vZGUpKTsNCi0NCi0gIC8qIENoZWNrIGlucHV0IHN0YXRlICovDQotICBfX0hBTF9MT0NLKGh0aW0pOw0KLQ0KLSAgLyogQ2hhbmdlIHRoZSBoYW5kbGVyIHN0YXRlICovDQotICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfQlVTWTsNCi0NCi0gIC8qIEdldCB0aGUgVElNeCBDUjIgcmVnaXN0ZXIgdmFsdWUgKi8NCi0gIHRtcGNyMiA9IGh0aW0tPkluc3RhbmNlLT5DUjI7DQotDQotICAvKiBHZXQgdGhlIFRJTXggU01DUiByZWdpc3RlciB2YWx1ZSAqLw0KLSAgdG1wc21jciA9IGh0aW0tPkluc3RhbmNlLT5TTUNSOw0KLQ0KLSAgLyogSWYgdGhlIHRpbWVyIHN1cHBvcnRzIEFEQyBzeW5jaHJvbml6YXRpb24gdGhyb3VnaCBUUkdPMiwgc2V0IHRoZSBtYXN0ZXINCi0gICAqIG1vZGUgc2VsZWN0aW9uIDIgKi8NCi0gIGlmIChJU19USU1fVFJHTzJfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKSB7DQotICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICAgIGFzc2VydF9wYXJhbShJU19USU1fVFJHTzJfU09VUkNFKHNNYXN0ZXJDb25maWctPk1hc3Rlck91dHB1dFRyaWdnZXIyKSk7DQotDQotICAgIC8qIENsZWFyIHRoZSBNTVMyIGJpdHMgKi8NCi0gICAgdG1wY3IyICY9IH5USU1fQ1IyX01NUzI7DQotICAgIC8qIFNlbGVjdCB0aGUgVFJHTzIgc291cmNlKi8NCi0gICAgdG1wY3IyIHw9IHNNYXN0ZXJDb25maWctPk1hc3Rlck91dHB1dFRyaWdnZXIyOw0KLSAgfQ0KLQ0KLSAgLyogUmVzZXQgdGhlIE1NUyBCaXRzICovDQotICB0bXBjcjIgJj0gflRJTV9DUjJfTU1TOw0KLSAgLyogU2VsZWN0IHRoZSBUUkdPIHNvdXJjZSAqLw0KLSAgdG1wY3IyIHw9IHNNYXN0ZXJDb25maWctPk1hc3Rlck91dHB1dFRyaWdnZXI7DQotDQotICAvKiBVcGRhdGUgVElNeCBDUjIgKi8NCi0gIGh0aW0tPkluc3RhbmNlLT5DUjIgPSB0bXBjcjI7DQotDQotICBpZiAoSVNfVElNX1NMQVZFX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSkgew0KLSAgICAvKiBSZXNldCB0aGUgTVNNIEJpdCAqLw0KLSAgICB0bXBzbWNyICY9IH5USU1fU01DUl9NU007DQotICAgIC8qIFNldCBtYXN0ZXIgbW9kZSAqLw0KLSAgICB0bXBzbWNyIHw9IHNNYXN0ZXJDb25maWctPk1hc3RlclNsYXZlTW9kZTsNCi0NCi0gICAgLyogVXBkYXRlIFRJTXggU01DUiAqLw0KLSAgICBodGltLT5JbnN0YW5jZS0+U01DUiA9IHRtcHNtY3I7DQotICB9DQotDQotICAvKiBDaGFuZ2UgdGhlIGh0aW0gc3RhdGUgKi8NCi0gIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRUFEWTsNCi0NCi0gIF9fSEFMX1VOTE9DSyhodGltKTsNCi0NCi0gIHJldHVybiBIQUxfT0s7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgQnJlYWsgZmVhdHVyZSwgZGVhZCB0aW1lLCBMb2NrIGxldmVsLCBPU1NJL09TU1IgU3RhdGUNCi0gKiAgICAgICAgIGFuZCB0aGUgQU9FKGF1dG9tYXRpYyBvdXRwdXQgZW5hYmxlKS4NCi0gKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQ0KLSAqIEBwYXJhbSAgc0JyZWFrRGVhZFRpbWVDb25maWcgcG9pbnRlciB0byBhIFRJTV9Db25maWdCcmVha0RlYWRDb25maWdUeXBlRGVmDQotICogc3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhlIEJEVFIgUmVnaXN0ZXIgY29uZmlndXJhdGlvbiAgaW5mb3JtYXRpb24gZm9yIHRoZQ0KLSAqIFRJTSBwZXJpcGhlcmFsLg0KLSAqIEBub3RlICAgSW50ZXJydXB0cyBjYW4gYmUgZ2VuZXJhdGVkIHdoZW4gYW4gYWN0aXZlIGxldmVsIGlzIGRldGVjdGVkIG9uIHRoZQ0KLSAqICAgICAgICAgYnJlYWsgaW5wdXQsIHRoZSBicmVhayAyIGlucHV0IG9yIHRoZSBzeXN0ZW0gYnJlYWsgaW5wdXQuIEJyZWFrDQotICogICAgICAgICBpbnRlcnJ1cHQgY2FuIGJlIGVuYWJsZWQgYnkgY2FsbGluZyB0aGUgQHJlZiBfX0hBTF9USU1fRU5BQkxFX0lUDQotICogbWFjcm8uDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0NvbmZpZ0JyZWFrRGVhZFRpbWUoDQotICAgIFRJTV9IYW5kbGVUeXBlRGVmICpodGltLA0KLSAgICBUSU1fQnJlYWtEZWFkVGltZUNvbmZpZ1R5cGVEZWYgKnNCcmVha0RlYWRUaW1lQ29uZmlnKSB7DQotICAvKiBLZWVwIHRoaXMgdmFyaWFibGUgaW5pdGlhbGl6ZWQgdG8gMCBhcyBpdCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSBCRFRSDQotICAgKiByZWdpc3RlciAqLw0KLSAgdWludDMyX3QgdG1wYmR0ciA9IDBVOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fQlJFQUtfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsNCi0gIGFzc2VydF9wYXJhbShJU19USU1fT1NTUl9TVEFURShzQnJlYWtEZWFkVGltZUNvbmZpZy0+T2ZmU3RhdGVSdW5Nb2RlKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX09TU0lfU1RBVEUoc0JyZWFrRGVhZFRpbWVDb25maWctPk9mZlN0YXRlSURMRU1vZGUpKTsNCi0gIGFzc2VydF9wYXJhbShJU19USU1fTE9DS19MRVZFTChzQnJlYWtEZWFkVGltZUNvbmZpZy0+TG9ja0xldmVsKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0RFQURUSU1FKHNCcmVha0RlYWRUaW1lQ29uZmlnLT5EZWFkVGltZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9CUkVBS19TVEFURShzQnJlYWtEZWFkVGltZUNvbmZpZy0+QnJlYWtTdGF0ZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9CUkVBS19QT0xBUklUWShzQnJlYWtEZWFkVGltZUNvbmZpZy0+QnJlYWtQb2xhcml0eSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9CUkVBS19GSUxURVIoc0JyZWFrRGVhZFRpbWVDb25maWctPkJyZWFrRmlsdGVyKSk7DQotICBhc3NlcnRfcGFyYW0oDQotICAgICAgSVNfVElNX0FVVE9NQVRJQ19PVVRQVVRfU1RBVEUoc0JyZWFrRGVhZFRpbWVDb25maWctPkF1dG9tYXRpY091dHB1dCkpOw0KLQ0KLSAgLyogQ2hlY2sgaW5wdXQgc3RhdGUgKi8NCi0gIF9fSEFMX0xPQ0soaHRpbSk7DQotDQotICAvKiBTZXQgdGhlIExvY2sgbGV2ZWwsIHRoZSBCcmVhayBlbmFibGUgQml0IGFuZCB0aGUgUG9sYXJpdHksIHRoZSBPU1NSIFN0YXRlLA0KLSAgICAgdGhlIE9TU0kgU3RhdGUsIHRoZSBkZWFkIHRpbWUgdmFsdWUgYW5kIHRoZSBBdXRvbWF0aWMgT3V0cHV0IEVuYWJsZSBCaXQgKi8NCi0NCi0gIC8qIFNldCB0aGUgQkRUUiBiaXRzICovDQotICBNT0RJRllfUkVHKHRtcGJkdHIsIFRJTV9CRFRSX0RURywgc0JyZWFrRGVhZFRpbWVDb25maWctPkRlYWRUaW1lKTsNCi0gIE1PRElGWV9SRUcodG1wYmR0ciwgVElNX0JEVFJfTE9DSywgc0JyZWFrRGVhZFRpbWVDb25maWctPkxvY2tMZXZlbCk7DQotICBNT0RJRllfUkVHKHRtcGJkdHIsIFRJTV9CRFRSX09TU0ksIHNCcmVha0RlYWRUaW1lQ29uZmlnLT5PZmZTdGF0ZUlETEVNb2RlKTsNCi0gIE1PRElGWV9SRUcodG1wYmR0ciwgVElNX0JEVFJfT1NTUiwgc0JyZWFrRGVhZFRpbWVDb25maWctPk9mZlN0YXRlUnVuTW9kZSk7DQotICBNT0RJRllfUkVHKHRtcGJkdHIsIFRJTV9CRFRSX0JLRSwgc0JyZWFrRGVhZFRpbWVDb25maWctPkJyZWFrU3RhdGUpOw0KLSAgTU9ESUZZX1JFRyh0bXBiZHRyLCBUSU1fQkRUUl9CS1AsIHNCcmVha0RlYWRUaW1lQ29uZmlnLT5CcmVha1BvbGFyaXR5KTsNCi0gIE1PRElGWV9SRUcodG1wYmR0ciwgVElNX0JEVFJfQU9FLCBzQnJlYWtEZWFkVGltZUNvbmZpZy0+QXV0b21hdGljT3V0cHV0KTsNCi0gIE1PRElGWV9SRUcodG1wYmR0ciwgVElNX0JEVFJfQktGLA0KLSAgICAgICAgICAgICAoc0JyZWFrRGVhZFRpbWVDb25maWctPkJyZWFrRmlsdGVyIDw8IFRJTV9CRFRSX0JLRl9Qb3MpKTsNCi0NCi0gIGlmIChJU19USU1fQURWQU5DRURfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKSB7DQotICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICAgIGFzc2VydF9wYXJhbShJU19USU1fQlJFQUtfQUZNT0RFKHNCcmVha0RlYWRUaW1lQ29uZmlnLT5CcmVha0FGTW9kZSkpOw0KLQ0KLSAgICAvKiBTZXQgQlJFQUsgQUYgbW9kZSAqLw0KLSAgICBNT0RJRllfUkVHKHRtcGJkdHIsIFRJTV9CRFRSX0JLQklELCBzQnJlYWtEZWFkVGltZUNvbmZpZy0+QnJlYWtBRk1vZGUpOw0KLSAgfQ0KLQ0KLSAgaWYgKElTX1RJTV9CS0lOMl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpIHsNCi0gICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9CUkVBSzJfU1RBVEUoc0JyZWFrRGVhZFRpbWVDb25maWctPkJyZWFrMlN0YXRlKSk7DQotICAgIGFzc2VydF9wYXJhbShJU19USU1fQlJFQUsyX1BPTEFSSVRZKHNCcmVha0RlYWRUaW1lQ29uZmlnLT5CcmVhazJQb2xhcml0eSkpOw0KLSAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0JSRUFLX0ZJTFRFUihzQnJlYWtEZWFkVGltZUNvbmZpZy0+QnJlYWsyRmlsdGVyKSk7DQotDQotICAgIC8qIFNldCB0aGUgQlJFQUsyIGlucHV0IHJlbGF0ZWQgQkRUUiBiaXRzICovDQotICAgIE1PRElGWV9SRUcodG1wYmR0ciwgVElNX0JEVFJfQksyRiwNCi0gICAgICAgICAgICAgICAoc0JyZWFrRGVhZFRpbWVDb25maWctPkJyZWFrMkZpbHRlciA8PCBUSU1fQkRUUl9CSzJGX1BvcykpOw0KLSAgICBNT0RJRllfUkVHKHRtcGJkdHIsIFRJTV9CRFRSX0JLMkUsIHNCcmVha0RlYWRUaW1lQ29uZmlnLT5CcmVhazJTdGF0ZSk7DQotICAgIE1PRElGWV9SRUcodG1wYmR0ciwgVElNX0JEVFJfQksyUCwgc0JyZWFrRGVhZFRpbWVDb25maWctPkJyZWFrMlBvbGFyaXR5KTsNCi0NCi0gICAgaWYgKElTX1RJTV9BRFZBTkNFRF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpIHsNCi0gICAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQlJFQUsyX0FGTU9ERShzQnJlYWtEZWFkVGltZUNvbmZpZy0+QnJlYWsyQUZNb2RlKSk7DQotDQotICAgICAgLyogU2V0IEJSRUFLMiBBRiBtb2RlICovDQotICAgICAgTU9ESUZZX1JFRyh0bXBiZHRyLCBUSU1fQkRUUl9CSzJCSUQsIHNCcmVha0RlYWRUaW1lQ29uZmlnLT5CcmVhazJBRk1vZGUpOw0KLSAgICB9DQotICB9DQotDQotICAvKiBTZXQgVElNeF9CRFRSICovDQotICBodGltLT5JbnN0YW5jZS0+QkRUUiA9IHRtcGJkdHI7DQotDQotICBfX0hBTF9VTkxPQ0soaHRpbSk7DQotDQotICByZXR1cm4gSEFMX09LOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIGJyZWFrIGlucHV0IHNvdXJjZS4NCi0gKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZS4NCi0gKiBAcGFyYW0gIEJyZWFrSW5wdXQgQnJlYWsgaW5wdXQgdG8gY29uZmlndXJlDQotICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0JSRUFLSU5QVVRfQlJLOiBUaW1lciBicmVhayBpbnB1dA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQlJFQUtJTlBVVF9CUksyOiBUaW1lciBicmVhayAyIGlucHV0DQotICogQHBhcmFtICBzQnJlYWtJbnB1dENvbmZpZyBCcmVhayBpbnB1dCBzb3VyY2UgY29uZmlndXJhdGlvbg0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9Db25maWdCcmVha0lucHV0KA0KLSAgICBUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQnJlYWtJbnB1dCwNCi0gICAgVElNRXhfQnJlYWtJbnB1dENvbmZpZ1R5cGVEZWYgKnNCcmVha0lucHV0Q29uZmlnKQ0KLQ0KLXsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsNCi0gIHVpbnQzMl90IHRtcG9yeDsNCi0gIHVpbnQzMl90IGJraW5fZW5hYmxlX21hc2s7DQotICB1aW50MzJfdCBia2luX3BvbGFyaXR5X21hc2s7DQotICB1aW50MzJfdCBia2luX2VuYWJsZV9iaXRwb3M7DQotICB1aW50MzJfdCBia2luX3BvbGFyaXR5X2JpdHBvczsNCi0NCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0JSRUFLX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0JSRUFLSU5QVVQoQnJlYWtJbnB1dCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9CUkVBS0lOUFVUU09VUkNFKHNCcmVha0lucHV0Q29uZmlnLT5Tb3VyY2UpKTsNCi0gIGFzc2VydF9wYXJhbShJU19USU1fQlJFQUtJTlBVVFNPVVJDRV9TVEFURShzQnJlYWtJbnB1dENvbmZpZy0+RW5hYmxlKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0JSRUFLSU5QVVRTT1VSQ0VfUE9MQVJJVFkoc0JyZWFrSW5wdXRDb25maWctPlBvbGFyaXR5KSk7DQotDQotICAvKiBDaGVjayBpbnB1dCBzdGF0ZSAqLw0KLSAgX19IQUxfTE9DSyhodGltKTsNCi0NCi0gIHN3aXRjaCAoc0JyZWFrSW5wdXRDb25maWctPlNvdXJjZSkgew0KLSAgICBjYXNlIFRJTV9CUkVBS0lOUFVUU09VUkNFX0JLSU46IHsNCi0gICAgICBia2luX2VuYWJsZV9tYXNrID0gVElNMV9BRjFfQktJTkU7DQotICAgICAgYmtpbl9lbmFibGVfYml0cG9zID0gVElNMV9BRjFfQktJTkVfUG9zOw0KLSAgICAgIGJraW5fcG9sYXJpdHlfbWFzayA9IFRJTTFfQUYxX0JLSU5QOw0KLSAgICAgIGJraW5fcG9sYXJpdHlfYml0cG9zID0gVElNMV9BRjFfQktJTlBfUG9zOw0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotICAgIGNhc2UgVElNX0JSRUFLSU5QVVRTT1VSQ0VfQ09NUDE6IHsNCi0gICAgICBia2luX2VuYWJsZV9tYXNrID0gVElNMV9BRjFfQktDTVAxRTsNCi0gICAgICBia2luX2VuYWJsZV9iaXRwb3MgPSBUSU0xX0FGMV9CS0NNUDFFX1BvczsNCi0gICAgICBia2luX3BvbGFyaXR5X21hc2sgPSBUSU0xX0FGMV9CS0NNUDFQOw0KLSAgICAgIGJraW5fcG9sYXJpdHlfYml0cG9zID0gVElNMV9BRjFfQktDTVAxUF9Qb3M7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0gICAgY2FzZSBUSU1fQlJFQUtJTlBVVFNPVVJDRV9DT01QMjogew0KLSAgICAgIGJraW5fZW5hYmxlX21hc2sgPSBUSU0xX0FGMV9CS0NNUDJFOw0KLSAgICAgIGJraW5fZW5hYmxlX2JpdHBvcyA9IFRJTTFfQUYxX0JLQ01QMkVfUG9zOw0KLSAgICAgIGJraW5fcG9sYXJpdHlfbWFzayA9IFRJTTFfQUYxX0JLQ01QMlA7DQotICAgICAgYmtpbl9wb2xhcml0eV9iaXRwb3MgPSBUSU0xX0FGMV9CS0NNUDJQX1BvczsNCi0gICAgICBicmVhazsNCi0gICAgfQ0KLSAgICBjYXNlIFRJTV9CUkVBS0lOUFVUU09VUkNFX0NPTVAzOiB7DQotICAgICAgYmtpbl9lbmFibGVfbWFzayA9IFRJTTFfQUYxX0JLQ01QM0U7DQotICAgICAgYmtpbl9lbmFibGVfYml0cG9zID0gVElNMV9BRjFfQktDTVAzRV9Qb3M7DQotICAgICAgYmtpbl9wb2xhcml0eV9tYXNrID0gVElNMV9BRjFfQktDTVAzUDsNCi0gICAgICBia2luX3BvbGFyaXR5X2JpdHBvcyA9IFRJTTFfQUYxX0JLQ01QM1BfUG9zOw0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotICAgIGNhc2UgVElNX0JSRUFLSU5QVVRTT1VSQ0VfQ09NUDQ6IHsNCi0gICAgICBia2luX2VuYWJsZV9tYXNrID0gVElNMV9BRjFfQktDTVA0RTsNCi0gICAgICBia2luX2VuYWJsZV9iaXRwb3MgPSBUSU0xX0FGMV9CS0NNUDRFX1BvczsNCi0gICAgICBia2luX3BvbGFyaXR5X21hc2sgPSBUSU0xX0FGMV9CS0NNUDRQOw0KLSAgICAgIGJraW5fcG9sYXJpdHlfYml0cG9zID0gVElNMV9BRjFfQktDTVA0UF9Qb3M7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0jaWYgZGVmaW5lZChDT01QNSkNCi0gICAgY2FzZSBUSU1fQlJFQUtJTlBVVFNPVVJDRV9DT01QNTogew0KLSAgICAgIGJraW5fZW5hYmxlX21hc2sgPSBUSU0xX0FGMV9CS0NNUDVFOw0KLSAgICAgIGJraW5fZW5hYmxlX2JpdHBvcyA9IFRJTTFfQUYxX0JLQ01QNUVfUG9zOw0KLSAgICAgIC8qIE5vIHBhbGFyaXR5IGJpdCBmb3IgdGhpcyBDT01QLiBWYXJpYWJsZSBia2luX3BvbGFyaXR5X21hc2sga2VlcHMgaXRzDQotICAgICAgICogZGVmYXVsdCB2YWx1ZSAwICovDQotICAgICAgYmtpbl9wb2xhcml0eV9tYXNrID0gMFU7DQotICAgICAgYmtpbl9wb2xhcml0eV9iaXRwb3MgPSAwVTsNCi0gICAgICBicmVhazsNCi0gICAgfQ0KLSNlbmRpZiAvKiBDT01QNSAqLw0KLSNpZiBkZWZpbmVkKENPTVA2KQ0KLSAgICBjYXNlIFRJTV9CUkVBS0lOUFVUU09VUkNFX0NPTVA2OiB7DQotICAgICAgYmtpbl9lbmFibGVfbWFzayA9IFRJTTFfQUYxX0JLQ01QNkU7DQotICAgICAgYmtpbl9lbmFibGVfYml0cG9zID0gVElNMV9BRjFfQktDTVA2RV9Qb3M7DQotICAgICAgLyogTm8gcGFsYXJpdHkgYml0IGZvciB0aGlzIENPTVAuIFZhcmlhYmxlIGJraW5fcG9sYXJpdHlfbWFzayBrZWVwcyBpdHMNCi0gICAgICAgKiBkZWZhdWx0IHZhbHVlIDAgKi8NCi0gICAgICBia2luX3BvbGFyaXR5X21hc2sgPSAwVTsNCi0gICAgICBia2luX3BvbGFyaXR5X2JpdHBvcyA9IDBVOw0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotI2VuZGlmIC8qIENPTVA3ICovDQotI2lmIGRlZmluZWQoQ09NUDcpDQotICAgIGNhc2UgVElNX0JSRUFLSU5QVVRTT1VSQ0VfQ09NUDc6IHsNCi0gICAgICBia2luX2VuYWJsZV9tYXNrID0gVElNMV9BRjFfQktDTVA3RTsNCi0gICAgICBia2luX2VuYWJsZV9iaXRwb3MgPSBUSU0xX0FGMV9CS0NNUDdFX1BvczsNCi0gICAgICAvKiBObyBwYWxhcml0eSBiaXQgZm9yIHRoaXMgQ09NUC4gVmFyaWFibGUgYmtpbl9wb2xhcml0eV9tYXNrIGtlZXBzIGl0cw0KLSAgICAgICAqIGRlZmF1bHQgdmFsdWUgMCAqLw0KLSAgICAgIGJraW5fcG9sYXJpdHlfbWFzayA9IDBVOw0KLSAgICAgIGJraW5fcG9sYXJpdHlfYml0cG9zID0gMFU7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0jZW5kaWYgLyogQ09NUDcgKi8NCi0NCi0gICAgZGVmYXVsdDogew0KLSAgICAgIGJraW5fZW5hYmxlX21hc2sgPSAwVTsNCi0gICAgICBia2luX3BvbGFyaXR5X21hc2sgPSAwVTsNCi0gICAgICBia2luX2VuYWJsZV9iaXRwb3MgPSAwVTsNCi0gICAgICBia2luX3BvbGFyaXR5X2JpdHBvcyA9IDBVOw0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotICB9DQotDQotICBzd2l0Y2ggKEJyZWFrSW5wdXQpIHsNCi0gICAgY2FzZSBUSU1fQlJFQUtJTlBVVF9CUks6IHsNCi0gICAgICAvKiBHZXQgdGhlIFRJTXhfQUYxIHJlZ2lzdGVyIHZhbHVlICovDQotICAgICAgdG1wb3J4ID0gaHRpbS0+SW5zdGFuY2UtPkFGMTsNCi0NCi0gICAgICAvKiBFbmFibGUgdGhlIGJyZWFrIGlucHV0ICovDQotICAgICAgdG1wb3J4ICY9IH5ia2luX2VuYWJsZV9tYXNrOw0KLSAgICAgIHRtcG9yeCB8PQ0KLSAgICAgICAgICAoc0JyZWFrSW5wdXRDb25maWctPkVuYWJsZSA8PCBia2luX2VuYWJsZV9iaXRwb3MpICYgYmtpbl9lbmFibGVfbWFzazsNCi0NCi0gICAgICAvKiBTZXQgdGhlIGJyZWFrIGlucHV0IHBvbGFyaXR5ICovDQotICAgICAgdG1wb3J4ICY9IH5ia2luX3BvbGFyaXR5X21hc2s7DQotICAgICAgdG1wb3J4IHw9IChzQnJlYWtJbnB1dENvbmZpZy0+UG9sYXJpdHkgPDwgYmtpbl9wb2xhcml0eV9iaXRwb3MpICYNCi0gICAgICAgICAgICAgICAgYmtpbl9wb2xhcml0eV9tYXNrOw0KLQ0KLSAgICAgIC8qIFNldCBUSU14X0FGMSAqLw0KLSAgICAgIGh0aW0tPkluc3RhbmNlLT5BRjEgPSB0bXBvcng7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0gICAgY2FzZSBUSU1fQlJFQUtJTlBVVF9CUksyOiB7DQotICAgICAgLyogR2V0IHRoZSBUSU14X0FGMiByZWdpc3RlciB2YWx1ZSAqLw0KLSAgICAgIHRtcG9yeCA9IGh0aW0tPkluc3RhbmNlLT5BRjI7DQotDQotICAgICAgLyogRW5hYmxlIHRoZSBicmVhayBpbnB1dCAqLw0KLSAgICAgIHRtcG9yeCAmPSB+Ymtpbl9lbmFibGVfbWFzazsNCi0gICAgICB0bXBvcnggfD0NCi0gICAgICAgICAgKHNCcmVha0lucHV0Q29uZmlnLT5FbmFibGUgPDwgYmtpbl9lbmFibGVfYml0cG9zKSAmIGJraW5fZW5hYmxlX21hc2s7DQotDQotICAgICAgLyogU2V0IHRoZSBicmVhayBpbnB1dCBwb2xhcml0eSAqLw0KLSAgICAgIHRtcG9yeCAmPSB+Ymtpbl9wb2xhcml0eV9tYXNrOw0KLSAgICAgIHRtcG9yeCB8PSAoc0JyZWFrSW5wdXRDb25maWctPlBvbGFyaXR5IDw8IGJraW5fcG9sYXJpdHlfYml0cG9zKSAmDQotICAgICAgICAgICAgICAgIGJraW5fcG9sYXJpdHlfbWFzazsNCi0NCi0gICAgICAvKiBTZXQgVElNeF9BRjIgKi8NCi0gICAgICBodGltLT5JbnN0YW5jZS0+QUYyID0gdG1wb3J4Ow0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotICAgIGRlZmF1bHQ6DQotICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOw0KLSAgICAgIGJyZWFrOw0KLSAgfQ0KLQ0KLSAgX19IQUxfVU5MT0NLKGh0aW0pOw0KLQ0KLSAgcmV0dXJuIHN0YXR1czsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBUSU14IFJlbWFwcGluZyBpbnB1dCBjYXBhYmlsaXRpZXMuDQotICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUuDQotICogQHBhcmFtICBSZW1hcCBzcGVjaWZpZXMgdGhlIFRJTSByZW1hcHBpbmcgc291cmNlLg0KLSAqICAgICAgICAgRm9yIFRJTTEsIHRoZSBwYXJhbWV0ZXIgY2FuIHRha2Ugb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMV9FVFJfR1BJTyAgICAgICAgICAgVElNMSBFVFIgaXMgY29ubmVjdGVkIHRvIEdQSU8NCi0gKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTFfRVRSX0NPTVAxICAgICAgICAgIFRJTTEgRVRSIGlzIGNvbm5lY3RlZCB0byBDT01QMQ0KLSAqIG91dHB1dA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMV9FVFJfQ09NUDIgICAgICAgICAgVElNMSBFVFIgaXMgY29ubmVjdGVkIHRvIENPTVAyDQotICogb3V0cHV0DQotICogICAgICAgICAgICBAYXJnIFRJTV9USU0xX0VUUl9DT01QMyAgICAgICAgICBUSU0xIEVUUiBpcyBjb25uZWN0ZWQgdG8gQ09NUDMNCi0gKiBvdXRwdXQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTFfRVRSX0NPTVA0ICAgICAgICAgIFRJTTEgRVRSIGlzIGNvbm5lY3RlZCB0byBDT01QNA0KLSAqIG91dHB1dA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMV9FVFJfQ09NUDUgICAgICAgICAgVElNMSBFVFIgaXMgY29ubmVjdGVkIHRvIENPTVA1DQotICogb3V0cHV0ICAgICgqKQ0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMV9FVFJfQ09NUDYgICAgICAgICAgVElNMSBFVFIgaXMgY29ubmVjdGVkIHRvIENPTVA2DQotICogb3V0cHV0ICAgICgqKQ0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMV9FVFJfQ09NUDcgICAgICAgICAgVElNMSBFVFIgaXMgY29ubmVjdGVkIHRvIENPTVA3DQotICogb3V0cHV0ICAgICgqKQ0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMV9FVFJfQURDMV9BV0QxICAgICAgVElNMSBFVFIgaXMgY29ubmVjdGVkIHRvIEFEQzENCi0gKiBBV0QxDQotICogICAgICAgICAgICBAYXJnIFRJTV9USU0xX0VUUl9BREMxX0FXRDIgICAgICBUSU0xIEVUUiBpcyBjb25uZWN0ZWQgdG8gQURDMQ0KLSAqIEFXRDINCi0gKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTFfRVRSX0FEQzFfQVdEMyAgICAgIFRJTTEgRVRSIGlzIGNvbm5lY3RlZCB0byBBREMxDQotICogQVdEMw0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMV9FVFJfQURDNF9BV0QxICAgICAgVElNMSBFVFIgaXMgY29ubmVjdGVkIHRvIEFEQzQNCi0gKiBBV0QxICAgICAgICgqKQ0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMV9FVFJfQURDNF9BV0QyICAgICAgVElNMSBFVFIgaXMgY29ubmVjdGVkIHRvIEFEQzQNCi0gKiBBV0QyICAgICAgICgqKQ0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMV9FVFJfQURDNF9BV0QzICAgICAgVElNMSBFVFIgaXMgY29ubmVjdGVkIHRvIEFEQzQNCi0gKiBBV0QzICAgICAgICgqKQ0KLSAqDQotICogICAgICAgICBGb3IgVElNMiwgdGhlIHBhcmFtZXRlciBjYW4gdGFrZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIFRJTV9USU0yX0VUUl9HUElPICAgICAgICAgICBUSU0yIEVUUiBpcyBjb25uZWN0ZWQgdG8gR1BJTw0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMl9FVFJfQ09NUDEgICAgICAgICAgVElNMiBFVFIgaXMgY29ubmVjdGVkIHRvIENPTVAxDQotICogb3V0cHV0DQotICogICAgICAgICAgICBAYXJnIFRJTV9USU0yX0VUUl9DT01QMiAgICAgICAgICBUSU0yIEVUUiBpcyBjb25uZWN0ZWQgdG8gQ09NUDINCi0gKiBvdXRwdXQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTJfRVRSX0NPTVAzICAgICAgICAgIFRJTTIgRVRSIGlzIGNvbm5lY3RlZCB0byBDT01QMw0KLSAqIG91dHB1dA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMl9FVFJfQ09NUDQgICAgICAgICAgVElNMiBFVFIgaXMgY29ubmVjdGVkIHRvIENPTVA0DQotICogb3V0cHV0DQotICogICAgICAgICAgICBAYXJnIFRJTV9USU0yX0VUUl9DT01QNSAgICAgICAgICBUSU0yIEVUUiBpcyBjb25uZWN0ZWQgdG8gQ09NUDUNCi0gKiBvdXRwdXQgICAgKCopDQotICogICAgICAgICAgICBAYXJnIFRJTV9USU0yX0VUUl9DT01QNiAgICAgICAgICBUSU0yIEVUUiBpcyBjb25uZWN0ZWQgdG8gQ09NUDYNCi0gKiBvdXRwdXQgICAgKCopDQotICogICAgICAgICAgICBAYXJnIFRJTV9USU0yX0VUUl9DT01QNyAgICAgICAgICBUSU0yIEVUUiBpcyBjb25uZWN0ZWQgdG8gQ09NUDcNCi0gKiBvdXRwdXQgICAgKCopDQotICogICAgICAgICAgICBAYXJnIFRJTV9USU0yX0VUUl9USU0zX0VUUiAgICAgICBUSU0yIEVUUiBpcyBjb25uZWN0ZWQgdG8gVElNMyBFVFINCi0gKiBwaW4NCi0gKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTJfRVRSX1RJTTRfRVRSICAgICAgIFRJTTIgRVRSIGlzIGNvbm5lY3RlZCB0byBUSU00IEVUUg0KLSAqIHBpbg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMl9FVFJfVElNNV9FVFIgICAgICAgVElNMiBFVFIgaXMgY29ubmVjdGVkIHRvIFRJTTUgRVRSDQotICogcGluICAgICgqKQ0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMl9FVFJfTFNFDQotICoNCi0gKiAgICAgICAgIEZvciBUSU0zLCB0aGUgcGFyYW1ldGVyIGNhbiB0YWtlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTNfRVRSX0dQSU8gICAgICAgICAgIFRJTTMgRVRSIGlzIGNvbm5lY3RlZCB0byBHUElPDQotICogICAgICAgICAgICBAYXJnIFRJTV9USU0zX0VUUl9DT01QMSAgICAgICAgICBUSU0zIEVUUiBpcyBjb25uZWN0ZWQgdG8gQ09NUDENCi0gKiBvdXRwdXQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTNfRVRSX0NPTVAyICAgICAgICAgIFRJTTMgRVRSIGlzIGNvbm5lY3RlZCB0byBDT01QMg0KLSAqIG91dHB1dA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fVElNM19FVFJfQ09NUDMgICAgICAgICAgVElNMyBFVFIgaXMgY29ubmVjdGVkIHRvIENPTVAzDQotICogb3V0cHV0DQotICogICAgICAgICAgICBAYXJnIFRJTV9USU0zX0VUUl9DT01QNCAgICAgICAgICBUSU0zIEVUUiBpcyBjb25uZWN0ZWQgdG8gQ09NUDQNCi0gKiBvdXRwdXQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTNfRVRSX0NPTVA1ICAgICAgICAgIFRJTTMgRVRSIGlzIGNvbm5lY3RlZCB0byBDT01QNQ0KLSAqIG91dHB1dCAgICAoKikNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTNfRVRSX0NPTVA2ICAgICAgICAgIFRJTTMgRVRSIGlzIGNvbm5lY3RlZCB0byBDT01QNg0KLSAqIG91dHB1dCAgICAoKikNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTNfRVRSX0NPTVA3ICAgICAgICAgIFRJTTMgRVRSIGlzIGNvbm5lY3RlZCB0byBDT01QNw0KLSAqIG91dHB1dCAgICAoKikNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTNfRVRSX1RJTTJfRVRSICAgICAgIFRJTTMgRVRSIGlzIGNvbm5lY3RlZCB0byBUSU0yIEVUUg0KLSAqIHBpbg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fVElNM19FVFJfVElNNF9FVFIgICAgICAgVElNMyBFVFIgaXMgY29ubmVjdGVkIHRvIFRJTTQgRVRSDQotICogcGluDQotICogICAgICAgICAgICBAYXJnIFRJTV9USU0zX0VUUl9BREMyX0FXRDEgICAgICBUSU0zIEVUUiBpcyBjb25uZWN0ZWQgdG8gQURDMg0KLSAqIEFXRDENCi0gKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTNfRVRSX0FEQzJfQVdEMiAgICAgIFRJTTMgRVRSIGlzIGNvbm5lY3RlZCB0byBBREMyDQotICogQVdEMg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fVElNM19FVFJfQURDMl9BV0QzICAgICAgVElNMyBFVFIgaXMgY29ubmVjdGVkIHRvIEFEQzINCi0gKiBBV0QzDQotICoNCi0gKiAgICAgICAgIEZvciBUSU00LCB0aGUgcGFyYW1ldGVyIGNhbiB0YWtlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTRfRVRSX0dQSU8gICAgICAgICAgIFRJTTQgRVRSIGlzIGNvbm5lY3RlZCB0byBHUElPDQotICogICAgICAgICAgICBAYXJnIFRJTV9USU00X0VUUl9DT01QMSAgICAgICAgICBUSU00IEVUUiBpcyBjb25uZWN0ZWQgdG8gQ09NUDENCi0gKiBvdXRwdXQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTRfRVRSX0NPTVAyICAgICAgICAgIFRJTTQgRVRSIGlzIGNvbm5lY3RlZCB0byBDT01QMg0KLSAqIG91dHB1dA0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fVElNNF9FVFJfQ09NUDMgICAgICAgICAgVElNNCBFVFIgaXMgY29ubmVjdGVkIHRvIENPTVAzDQotICogb3V0cHV0DQotICogICAgICAgICAgICBAYXJnIFRJTV9USU00X0VUUl9DT01QNCAgICAgICAgICBUSU00IEVUUiBpcyBjb25uZWN0ZWQgdG8gQ09NUDQNCi0gKiBvdXRwdXQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTRfRVRSX0NPTVA1ICAgICAgICAgIFRJTTQgRVRSIGlzIGNvbm5lY3RlZCB0byBDT01QNQ0KLSAqIG91dHB1dCAgICAoKikNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTRfRVRSX0NPTVA2ICAgICAgICAgIFRJTTQgRVRSIGlzIGNvbm5lY3RlZCB0byBDT01QNg0KLSAqIG91dHB1dCAgICAoKikNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTRfRVRSX0NPTVA3ICAgICAgICAgIFRJTTQgRVRSIGlzIGNvbm5lY3RlZCB0byBDT01QNw0KLSAqIG91dHB1dCAgICAoKikNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTRfRVRSX1RJTTNfRVRSICAgICAgIFRJTTQgRVRSIGlzIGNvbm5lY3RlZCB0byBUSU0zIEVUUg0KLSAqIHBpbg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fVElNNF9FVFJfVElNNV9FVFIgICAgICAgVElNNCBFVFIgaXMgY29ubmVjdGVkIHRvIFRJTTUgRVRSDQotICogcGluICAgICgqKQ0KLSAqDQotICogICAgICAgICBGb3IgVElNNSwgdGhlIHBhcmFtZXRlciBjYW4gdGFrZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6ICgqKikNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTVfRVRSX0dQSU8gICAgICAgICAgIFRJTTUgRVRSIGlzIGNvbm5lY3RlZCB0byBHUElPICgqKQ0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fVElNNV9FVFJfQ09NUDEgICAgICAgICAgVElNNSBFVFIgaXMgY29ubmVjdGVkIHRvIENPTVAxDQotICogb3V0cHV0ICAgICgqKQ0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fVElNNV9FVFJfQ09NUDIgICAgICAgICAgVElNNSBFVFIgaXMgY29ubmVjdGVkIHRvIENPTVAyDQotICogb3V0cHV0ICAgICgqKQ0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fVElNNV9FVFJfQ09NUDMgICAgICAgICAgVElNNSBFVFIgaXMgY29ubmVjdGVkIHRvIENPTVAzDQotICogb3V0cHV0ICAgICgqKQ0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fVElNNV9FVFJfQ09NUDQgICAgICAgICAgVElNNSBFVFIgaXMgY29ubmVjdGVkIHRvIENPTVA0DQotICogb3V0cHV0ICAgICgqKQ0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fVElNNV9FVFJfQ09NUDUgICAgICAgICAgVElNNSBFVFIgaXMgY29ubmVjdGVkIHRvIENPTVA1DQotICogb3V0cHV0ICAgICgqKQ0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fVElNNV9FVFJfQ09NUDYgICAgICAgICAgVElNNSBFVFIgaXMgY29ubmVjdGVkIHRvIENPTVA2DQotICogb3V0cHV0ICAgICgqKQ0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fVElNNV9FVFJfQ09NUDcgICAgICAgICAgVElNNSBFVFIgaXMgY29ubmVjdGVkIHRvIENPTVA3DQotICogb3V0cHV0ICAgICgqKQ0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fVElNNV9FVFJfVElNMl9FVFIgICAgICAgVElNNSBFVFIgaXMgY29ubmVjdGVkIHRvIFRJTTIgRVRSDQotICogcGluICAgICgqKQ0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fVElNNV9FVFJfVElNM19FVFIgICAgICAgVElNNSBFVFIgaXMgY29ubmVjdGVkIHRvIFRJTTMgRVRSDQotICogcGluICAgICgqKQ0KLSAqDQotICogICAgICAgICBGb3IgVElNOCwgdGhlIHBhcmFtZXRlciBjYW4gdGFrZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIFRJTV9USU04X0VUUl9HUElPICAgICAgICAgICAgVElNOCBFVFIgaXMgY29ubmVjdGVkIHRvIEdQSU8NCi0gKiAgICAgICAgICAgIEBhcmcgVElNX1RJTThfRVRSX0NPTVAxICAgICAgICAgICBUSU04IEVUUiBpcyBjb25uZWN0ZWQgdG8gQ09NUDENCi0gKiBvdXRwdXQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX1RJTThfRVRSX0NPTVAyICAgICAgICAgICBUSU04IEVUUiBpcyBjb25uZWN0ZWQgdG8gQ09NUDINCi0gKiBvdXRwdXQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX1RJTThfRVRSX0NPTVAzICAgICAgICAgICBUSU04IEVUUiBpcyBjb25uZWN0ZWQgdG8gQ09NUDMNCi0gKiBvdXRwdXQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX1RJTThfRVRSX0NPTVA0ICAgICAgICAgICBUSU04IEVUUiBpcyBjb25uZWN0ZWQgdG8gQ09NUDQNCi0gKiBvdXRwdXQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX1RJTThfRVRSX0NPTVA1ICAgICAgICAgICBUSU04IEVUUiBpcyBjb25uZWN0ZWQgdG8gQ09NUDUNCi0gKiBvdXRwdXQgICAgKCopDQotICogICAgICAgICAgICBAYXJnIFRJTV9USU04X0VUUl9DT01QNiAgICAgICAgICAgVElNOCBFVFIgaXMgY29ubmVjdGVkIHRvIENPTVA2DQotICogb3V0cHV0ICAgICgqKQ0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fVElNOF9FVFJfQ09NUDcgICAgICAgICAgIFRJTTggRVRSIGlzIGNvbm5lY3RlZCB0byBDT01QNw0KLSAqIG91dHB1dCAgICAoKikNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX1RJTThfRVRSX0FEQzJfQVdEMSAgICAgICBUSU04IEVUUiBpcyBjb25uZWN0ZWQgdG8gQURDMg0KLSAqIEFXRDENCi0gKiAgICAgICAgICAgIEBhcmcgVElNX1RJTThfRVRSX0FEQzJfQVdEMiAgICAgICBUSU04IEVUUiBpcyBjb25uZWN0ZWQgdG8gQURDMg0KLSAqIEFXRDINCi0gKiAgICAgICAgICAgIEBhcmcgVElNX1RJTThfRVRSX0FEQzJfQVdEMyAgICAgICBUSU04IEVUUiBpcyBjb25uZWN0ZWQgdG8gQURDMg0KLSAqIEFXRDMNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX1RJTThfRVRSX0FEQzNfQVdEMSAgICAgICBUSU04IEVUUiBpcyBjb25uZWN0ZWQgdG8gQURDMw0KLSAqIEFXRDEgICAgICAgKCopDQotICogICAgICAgICAgICBAYXJnIFRJTV9USU04X0VUUl9BREMzX0FXRDIgICAgICAgVElNOCBFVFIgaXMgY29ubmVjdGVkIHRvIEFEQzMNCi0gKiBBV0QyICAgICAgICgqKQ0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fVElNOF9FVFJfQURDM19BV0QzICAgICAgIFRJTTggRVRSIGlzIGNvbm5lY3RlZCB0byBBREMzDQotICogQVdEMyAgICAgICAoKikNCi0gKg0KLSAqICAgICAgICAgRm9yIFRJTTIwLCB0aGUgcGFyYW1ldGVyIGNhbiB0YWtlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogKCoqKQ0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMjBfRVRSX0dQSU8gICAgICAgICAgICBUSU0yMCBFVFIgaXMgY29ubmVjdGVkIHRvIEdQSU8NCi0gKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTIwX0VUUl9DT01QMSAgICAgICAgICAgVElNMjAgRVRSIGlzIGNvbm5lY3RlZCB0byBDT01QMQ0KLSAqIG91dHB1dCAgKCopDQotICogICAgICAgICAgICBAYXJnIFRJTV9USU0yMF9FVFJfQ09NUDIgICAgICAgICAgIFRJTTIwIEVUUiBpcyBjb25uZWN0ZWQgdG8gQ09NUDINCi0gKiBvdXRwdXQgICgqKQ0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMjBfRVRSX0NPTVAzICAgICAgICAgICBUSU0yMCBFVFIgaXMgY29ubmVjdGVkIHRvIENPTVAzDQotICogb3V0cHV0ICAoKikNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTIwX0VUUl9DT01QNCAgICAgICAgICAgVElNMjAgRVRSIGlzIGNvbm5lY3RlZCB0byBDT01QNA0KLSAqIG91dHB1dCAgKCopDQotICogICAgICAgICAgICBAYXJnIFRJTV9USU0yMF9FVFJfQ09NUDUgICAgICAgICAgIFRJTTIwIEVUUiBpcyBjb25uZWN0ZWQgdG8gQ09NUDUNCi0gKiBvdXRwdXQgICgqKQ0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMjBfRVRSX0NPTVA2ICAgICAgICAgICBUSU0yMCBFVFIgaXMgY29ubmVjdGVkIHRvIENPTVA2DQotICogb3V0cHV0ICAoKikNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTIwX0VUUl9DT01QNyAgICAgICAgICAgVElNMjAgRVRSIGlzIGNvbm5lY3RlZCB0byBDT01QNw0KLSAqIG91dHB1dCAgKCopDQotICogICAgICAgICAgICBAYXJnIFRJTV9USU0yMF9FVFJfQURDM19BV0QxICAgICAgIFRJTTIwIEVUUiBpcyBjb25uZWN0ZWQgdG8gQURDMw0KLSAqIEFXRDEgICAgICgqKQ0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMjBfRVRSX0FEQzNfQVdEMiAgICAgICBUSU0yMCBFVFIgaXMgY29ubmVjdGVkIHRvIEFEQzMNCi0gKiBBV0QyICAgICAoKikNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTIwX0VUUl9BREMzX0FXRDMgICAgICAgVElNMjAgRVRSIGlzIGNvbm5lY3RlZCB0byBBREMzDQotICogQVdEMyAgICAgKCopDQotICogICAgICAgICAgICBAYXJnIFRJTV9USU0yMF9FVFJfQURDNV9BV0QxICAgICAgIFRJTTIwIEVUUiBpcyBjb25uZWN0ZWQgdG8gQURDNQ0KLSAqIEFXRDEgICAgICgqKQ0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMjBfRVRSX0FEQzVfQVdEMiAgICAgICBUSU0yMCBFVFIgaXMgY29ubmVjdGVkIHRvIEFEQzUNCi0gKiBBV0QyICAgICAoKikNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTIwX0VUUl9BREM1X0FXRDMgICAgICAgVElNMjAgRVRSIGlzIGNvbm5lY3RlZCB0byBBREM1DQotICogQVdEMyAgICAgKCopDQotICoNCi0gKiAgICAgICAgICgqKSAgVmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuIFxuDQotICogICAgICAgICAoKiopIFJlZ2lzdGVyIG5vdCBhdmFpbGFibGUgaW4gYWxsIGRldmljZXMuDQotICoNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfUmVtYXBDb25maWcoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFJlbWFwKSB7DQotICAvKiBDaGVjayBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX1JFTUFQX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX1JFTUFQKFJlbWFwKSk7DQotDQotICBfX0hBTF9MT0NLKGh0aW0pOw0KLQ0KLSAgTU9ESUZZX1JFRyhodGltLT5JbnN0YW5jZS0+QUYxLCBUSU0xX0FGMV9FVFJTRUxfTXNrLCBSZW1hcCk7DQotDQotICBfX0hBTF9VTkxPQ0soaHRpbSk7DQotDQotICByZXR1cm4gSEFMX09LOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBTZWxlY3QgdGhlIHRpbWVyIGlucHV0IHNvdXJjZQ0KLSAgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZS4NCi0gICogQHBhcmFtICBDaGFubmVsIHNwZWNpZmllcyB0aGUgVElNIENoYW5uZWwNCi0gICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJMSBpbnB1dCBjaGFubmVsDQotICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSTIgaW5wdXQgY2hhbm5lbA0KLSAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVEkzIGlucHV0IGNoYW5uZWwNCi0gICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJNCBpbnB1dCBjaGFubmVsDQotICAqIEBwYXJhbSAgVElTZWxlY3Rpb24gc3BlY2lmaWVzIHRoZSB0aW1lciBpbnB1dCBzb3VyY2UNCi0gICogICAgICAgICBGb3IgVElNMSB0aGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTFfVEkxX0dQSU86ICAgICAgICAgICAgICAgIFRJTTEgVEkxIGlzIGNvbm5lY3RlZCB0bw0KLSAgR1BJTw0KLSAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTFfVEkxX0NPTVAxOiAgICAgICAgICAgICAgIFRJTTEgVEkxIGlzIGNvbm5lY3RlZCB0bw0KLSAgQ09NUDEgb3V0cHV0DQotICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMV9USTFfQ09NUDI6ICAgICAgICAgICAgICAgVElNMSBUSTEgaXMgY29ubmVjdGVkIHRvDQotICBDT01QMiBvdXRwdXQNCi0gICogICAgICAgICAgICBAYXJnIFRJTV9USU0xX1RJMV9DT01QMzogICAgICAgICAgICAgICBUSU0xIFRJMSBpcyBjb25uZWN0ZWQgdG8NCi0gIENPTVAzIG91dHB1dA0KLSAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTFfVEkxX0NPTVA0OiAgICAgICAgICAgICAgIFRJTTEgVEkxIGlzIGNvbm5lY3RlZCB0bw0KLSAgQ09NUDQgb3V0cHV0DQotICAqDQotICAqICAgICAgICAgRm9yIFRJTTIgdGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgICAgICAgICBAYXJnIFRJTV9USU0yX1RJMV9HUElPOiAgICAgICAgICAgICAgICBUSU0yIFRJMSBpcyBjb25uZWN0ZWQgdG8NCi0gIEdQSU8NCi0gICogICAgICAgICAgICBAYXJnIFRJTV9USU0yX1RJMV9DT01QMTogICAgICAgICAgICAgICBUSU0yIFRJMSBpcyBjb25uZWN0ZWQgdG8NCi0gIENPTVAxIG91dHB1dA0KLSAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTJfVEkxX0NPTVAyOiAgICAgICAgICAgICAgIFRJTTIgVEkxIGlzIGNvbm5lY3RlZCB0bw0KLSAgQ09NUDIgb3V0cHV0DQotICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMl9USTFfQ09NUDM6ICAgICAgICAgICAgICAgVElNMiBUSTEgaXMgY29ubmVjdGVkIHRvDQotICBDT01QMyBvdXRwdXQNCi0gICogICAgICAgICAgICBAYXJnIFRJTV9USU0yX1RJMV9DT01QNDogICAgICAgICAgICAgICBUSU0yIFRJMSBpcyBjb25uZWN0ZWQgdG8NCi0gIENPTVA0IG91dHB1dA0KLSAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTJfVEkxX0NPTVA1OiAgICAgICAgICAgICAgIFRJTTIgVEkxIGlzIGNvbm5lY3RlZCB0bw0KLSAgQ09NUDUgb3V0cHV0ICAgICAoKikNCi0gICoNCi0gICogICAgICAgICAgICBAYXJnIFRJTV9USU0yX1RJMl9HUElPOiAgICAgICAgICAgICAgICBUSU0xIFRJMiBpcyBjb25uZWN0ZWQgdG8NCi0gIEdQSU8NCi0gICogICAgICAgICAgICBAYXJnIFRJTV9USU0yX1RJMl9DT01QMTogICAgICAgICAgICAgICBUSU0yIFRJMiBpcyBjb25uZWN0ZWQgdG8NCi0gIENPTVAxIG91dHB1dA0KLSAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTJfVEkyX0NPTVAyOiAgICAgICAgICAgICAgIFRJTTIgVEkyIGlzIGNvbm5lY3RlZCB0bw0KLSAgQ09NUDIgb3V0cHV0DQotICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMl9USTJfQ09NUDM6ICAgICAgICAgICAgICAgVElNMiBUSTIgaXMgY29ubmVjdGVkIHRvDQotICBDT01QMyBvdXRwdXQNCi0gICogICAgICAgICAgICBAYXJnIFRJTV9USU0yX1RJMl9DT01QNDogICAgICAgICAgICAgICBUSU0yIFRJMiBpcyBjb25uZWN0ZWQgdG8NCi0gIENPTVA0IG91dHB1dA0KLSAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTJfVEkyX0NPTVA2OiAgICAgICAgICAgICAgIFRJTTIgVEkyIGlzIGNvbm5lY3RlZCB0bw0KLSAgQ09NUDYgb3V0cHV0ICAgICAoKikNCi0gICoNCi0gICogICAgICAgICAgICBAYXJnIFRJTV9USU0yX1RJM19HUElPOiAgICAgICAgICAgICAgICBUSU0yIFRJMyBpcyBjb25uZWN0ZWQgdG8NCi0gIEdQSU8NCi0gICogICAgICAgICAgICBAYXJnIFRJTV9USU0yX1RJM19DT01QNDogICAgICAgICAgICAgICBUSU0yIFRJMyBpcyBjb25uZWN0ZWQgdG8NCi0gIENPTVA0IG91dHB1dA0KLSAgKg0KLSAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTJfVEk0X0dQSU86ICAgICAgICAgICAgICAgIFRJTTIgVEk0IGlzIGNvbm5lY3RlZCB0bw0KLSAgR1BJTw0KLSAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTJfVEk0X0NPTVAxOiAgICAgICAgICAgICAgIFRJTTIgVEk0IGlzIGNvbm5lY3RlZCB0bw0KLSAgQ09NUDEgb3V0cHV0DQotICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMl9USTRfQ09NUDI6ICAgICAgICAgICAgICAgVElNMiBUSTQgaXMgY29ubmVjdGVkIHRvDQotICBDT01QMiBvdXRwdXQNCi0gICoNCi0gICogICAgICAgICBGb3IgVElNMyB0aGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTNfVEkxX0dQSU86ICAgICAgICAgICAgICAgIFRJTTMgVEkxIGlzIGNvbm5lY3RlZCB0bw0KLSAgR1BJTw0KLSAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTNfVEkxX0NPTVAxOiAgICAgICAgICAgICAgIFRJTTMgVEkxIGlzIGNvbm5lY3RlZCB0bw0KLSAgQ09NUDEgb3V0cHV0DQotICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNM19USTFfQ09NUDI6ICAgICAgICAgICAgICAgVElNMyBUSTEgaXMgY29ubmVjdGVkIHRvDQotICBDT01QMiBvdXRwdXQNCi0gICogICAgICAgICAgICBAYXJnIFRJTV9USU0zX1RJMV9DT01QMzogICAgICAgICAgICAgICBUSU0zIFRJMSBpcyBjb25uZWN0ZWQgdG8NCi0gIENPTVAzIG91dHB1dA0KLSAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTNfVEkxX0NPTVA0OiAgICAgICAgICAgICAgIFRJTTMgVEkxIGlzIGNvbm5lY3RlZCB0bw0KLSAgQ09NUDQgb3V0cHV0DQotICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNM19USTFfQ09NUDU6ICAgICAgICAgICAgICAgVElNMyBUSTEgaXMgY29ubmVjdGVkIHRvDQotICBDT01QNSBvdXRwdXQgICAgICgqKQ0KLSAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTNfVEkxX0NPTVA2OiAgICAgICAgICAgICAgIFRJTTMgVEkxIGlzIGNvbm5lY3RlZCB0bw0KLSAgQ09NUDYgb3V0cHV0ICAgICAoKikNCi0gICogICAgICAgICAgICBAYXJnIFRJTV9USU0zX1RJMV9DT01QNzogICAgICAgICAgICAgICBUSU0zIFRJMSBpcyBjb25uZWN0ZWQgdG8NCi0gIENPTVA3IG91dHB1dCAgICAgKCopDQotICAqDQotICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNM19USTJfR1BJTzogICAgICAgICAgICAgICAgVElNMyBUSTIgaXMgY29ubmVjdGVkIHRvDQotICBHUElPDQotICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNM19USTJfQ09NUDE6ICAgICAgICAgICAgICAgVElNMyBUSTIgaXMgY29ubmVjdGVkIHRvDQotICBDT01QMSBvdXRwdXQNCi0gICogICAgICAgICAgICBAYXJnIFRJTV9USU0zX1RJMl9DT01QMjogICAgICAgICAgICAgICBUSU0zIFRJMiBpcyBjb25uZWN0ZWQgdG8NCi0gIENPTVAyIG91dHB1dA0KLSAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTNfVEkyX0NPTVAzOiAgICAgICAgICAgICAgIFRJTTMgVEkyIGlzIGNvbm5lY3RlZCB0bw0KLSAgQ09NUDMgb3V0cHV0DQotICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNM19USTJfQ09NUDQ6ICAgICAgICAgICAgICAgVElNMyBUSTIgaXMgY29ubmVjdGVkIHRvDQotICBDT01QNCBvdXRwdXQNCi0gICogICAgICAgICAgICBAYXJnIFRJTV9USU0zX1RJMl9DT01QNTogICAgICAgICAgICAgICBUSU0zIFRJMiBpcyBjb25uZWN0ZWQgdG8NCi0gIENPTVA1IG91dHB1dCAgICAgKCopDQotICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNM19USTJfQ09NUDY6ICAgICAgICAgICAgICAgVElNMyBUSTIgaXMgY29ubmVjdGVkIHRvDQotICBDT01QNiBvdXRwdXQgICAgICgqKQ0KLSAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTNfVEkyX0NPTVA3OiAgICAgICAgICAgICAgIFRJTTMgVEkyIGlzIGNvbm5lY3RlZCB0bw0KLSAgQ09NUDcgb3V0cHV0ICAgICAoKikNCi0gICoNCi0gICogICAgICAgICAgICBAYXJnIFRJTV9USU0zX1RJM19HUElPOiAgICAgICAgICAgICAgICBUSU0zIFRJMyBpcyBjb25uZWN0ZWQgdG8NCi0gIEdQSU8NCi0gICogICAgICAgICAgICBAYXJnIFRJTV9USU0zX1RJM19DT01QMzogICAgICAgICAgICAgICBUSU0zIFRJMyBpcyBjb25uZWN0ZWQgdG8NCi0gIENPTVAzIG91dHB1dA0KLQ0KLSAgKiAgICAgICAgIEZvciBUSU00IHRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNNF9USTFfR1BJTzogICAgICAgICAgICAgICAgVElNNCBUSTEgaXMgY29ubmVjdGVkIHRvDQotICBHUElPDQotICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNNF9USTFfQ09NUDE6ICAgICAgICAgICAgICAgVElNNCBUSTEgaXMgY29ubmVjdGVkIHRvDQotICBDT01QMSBvdXRwdXQNCi0gICogICAgICAgICAgICBAYXJnIFRJTV9USU00X1RJMV9DT01QMjogICAgICAgICAgICAgICBUSU00IFRJMSBpcyBjb25uZWN0ZWQgdG8NCi0gIENPTVAyIG91dHB1dA0KLSAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTRfVEkxX0NPTVAzOiAgICAgICAgICAgICAgIFRJTTQgVEkxIGlzIGNvbm5lY3RlZCB0bw0KLSAgQ09NUDMgb3V0cHV0DQotICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNNF9USTFfQ09NUDQ6ICAgICAgICAgICAgICAgVElNNCBUSTEgaXMgY29ubmVjdGVkIHRvDQotICBDT01QNCBvdXRwdXQNCi0gICogICAgICAgICAgICBAYXJnIFRJTV9USU00X1RJMV9DT01QNTogICAgICAgICAgICAgICBUSU00IFRJMSBpcyBjb25uZWN0ZWQgdG8NCi0gIENPTVA1IG91dHB1dCAgICAgKCopDQotICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNNF9USTFfQ09NUDY6ICAgICAgICAgICAgICAgVElNNCBUSTEgaXMgY29ubmVjdGVkIHRvDQotICBDT01QNiBvdXRwdXQgICAgICgqKQ0KLSAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTRfVEkxX0NPTVA3OiAgICAgICAgICAgICAgIFRJTTQgVEkxIGlzIGNvbm5lY3RlZCB0bw0KLSAgQ09NUDcgb3V0cHV0ICAgICAoKikNCi0gICoNCi0gICogICAgICAgICAgICBAYXJnIFRJTV9USU00X1RJMl9HUElPOiAgICAgICAgICAgICAgICBUSU00IFRJMiBpcyBjb25uZWN0ZWQgdG8NCi0gIEdQSU8NCi0gICogICAgICAgICAgICBAYXJnIFRJTV9USU00X1RJMl9DT01QMTogICAgICAgICAgICAgICBUSU00IFRJMiBpcyBjb25uZWN0ZWQgdG8NCi0gIENPTVAxIG91dHB1dA0KLSAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTRfVEkyX0NPTVAyOiAgICAgICAgICAgICAgIFRJTTQgVEkyIGlzIGNvbm5lY3RlZCB0bw0KLSAgQ09NUDIgb3V0cHV0DQotICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNNF9USTJfQ09NUDM6ICAgICAgICAgICAgICAgVElNNCBUSTIgaXMgY29ubmVjdGVkIHRvDQotICBDT01QMyBvdXRwdXQNCi0gICogICAgICAgICAgICBAYXJnIFRJTV9USU00X1RJMl9DT01QNDogICAgICAgICAgICAgICBUSU00IFRJMiBpcyBjb25uZWN0ZWQgdG8NCi0gIENPTVA0IG91dHB1dA0KLSAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTRfVEkyX0NPTVA1OiAgICAgICAgICAgICAgIFRJTTQgVEkyIGlzIGNvbm5lY3RlZCB0bw0KLSAgQ09NUDUgb3V0cHV0ICAgICAoKikNCi0gICogICAgICAgICAgICBAYXJnIFRJTV9USU00X1RJMl9DT01QNjogICAgICAgICAgICAgICBUSU00IFRJMiBpcyBjb25uZWN0ZWQgdG8NCi0gIENPTVA2IG91dHB1dCAgICAgKCopDQotICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNNF9USTJfQ09NUDc6ICAgICAgICAgICAgICAgVElNNCBUSTIgaXMgY29ubmVjdGVkIHRvDQotICBDT01QNyBvdXRwdXQgICAgICgqKQ0KLSAgKg0KLSAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTRfVEkzX0dQSU86ICAgICAgICAgICAgICAgIFRJTTQgVEkzIGlzIGNvbm5lY3RlZCB0bw0KLSAgR1BJTw0KLSAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTRfVEkzX0NPTVA1OiAgICAgICAgICAgICAgIFRJTTQgVEkzIGlzIGNvbm5lY3RlZCB0bw0KLSAgQ09NUDUgb3V0cHV0ICAgICAoKikNCi0gICoNCi0gICogICAgICAgICAgICBAYXJnIFRJTV9USU00X1RJNF9HUElPOiAgICAgICAgICAgICAgICBUSU00IFRJNCBpcyBjb25uZWN0ZWQgdG8NCi0gIEdQSU8NCi0gICogICAgICAgICAgICBAYXJnIFRJTV9USU00X1RJNF9DT01QNjogICAgICAgICAgICAgICBUSU00IFRJNCBpcyBjb25uZWN0ZWQgdG8NCi0gIENPTVA2IG91dHB1dCAgICAgKCopDQotICAqDQotICAqICAgICAgICAgRm9yIFRJTTUgdGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogICAgKCoqKQ0KLSAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTVfVEkxX0dQSU86ICAgICAgICAgICAgICAgIFRJTTUgVEkxIGlzIGNvbm5lY3RlZCB0bw0KLSAgR1BJTw0KLSAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTVfVEkxX0xTSTogICAgICAgICAgICAgICAgIFRJTTUgVEkxIGlzIGNvbm5lY3RlZCB0bw0KLSAgTFNJIGNsb2NrICAgICAgICAoKikNCi0gICogICAgICAgICAgICBAYXJnIFRJTV9USU01X1RJMV9MU0U6ICAgICAgICAgICAgICAgICBUSU01IFRJMSBpcyBjb25uZWN0ZWQgdG8NCi0gIExTRSBjbG9jayAgICAgICAgKCopDQotICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNNV9USTFfUlRDX1dLOiAgICAgICAgICAgICAgVElNNSBUSTEgaXMgY29ubmVjdGVkIHRvDQotICBSVEMgV2FrZXVwICAgICAgICgqKQ0KLSAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTVfVEkxX0NPTVAxOiAgICAgICAgICAgICAgIFRJTTUgVEkxIGlzIGNvbm5lY3RlZCB0bw0KLSAgQ09NUDEgb3V0cHV0ICAgICAoKikNCi0gICogICAgICAgICAgICBAYXJnIFRJTV9USU01X1RJMV9DT01QMjogICAgICAgICAgICAgICBUSU01IFRJMSBpcyBjb25uZWN0ZWQgdG8NCi0gIENPTVAyIG91dHB1dCAgICAgKCopDQotICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNNV9USTFfQ09NUDM6ICAgICAgICAgICAgICAgVElNNSBUSTEgaXMgY29ubmVjdGVkIHRvDQotICBDT01QMyBvdXRwdXQgICAgICgqKQ0KLSAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTVfVEkxX0NPTVA0OiAgICAgICAgICAgICAgIFRJTTUgVEkxIGlzIGNvbm5lY3RlZCB0bw0KLSAgQ09NUDQgb3V0cHV0ICAgICAoKikNCi0gICogICAgICAgICAgICBAYXJnIFRJTV9USU01X1RJMV9DT01QNTogICAgICAgICAgICAgICBUSU01IFRJMSBpcyBjb25uZWN0ZWQgdG8NCi0gIENPTVA1IG91dHB1dCAgICAgKCopDQotICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNNV9USTFfQ09NUDY6ICAgICAgICAgICAgICAgVElNNSBUSTEgaXMgY29ubmVjdGVkIHRvDQotICBDT01QNiBvdXRwdXQgICAgICgqKQ0KLSAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTVfVEkxX0NPTVA3OiAgICAgICAgICAgICAgIFRJTTUgVEkxIGlzIGNvbm5lY3RlZCB0bw0KLSAgQ09NUDcgb3V0cHV0ICAgICAoKikNCi0gICoNCi0gICogICAgICAgICAgICBAYXJnIFRJTV9USU01X1RJMl9HUElPOiAgICAgICAgICAgICAgICBUSU01IFRJMiBpcyBjb25uZWN0ZWQgdG8NCi0gIEdQSU8NCi0gICogICAgICAgICAgICBAYXJnIFRJTV9USU01X1RJMl9DT01QMTogICAgICAgICAgICAgICBUSU01IFRJMiBpcyBjb25uZWN0ZWQgdG8NCi0gIENPTVAxIG91dHB1dA0KLSAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTVfVEkyX0NPTVAyOiAgICAgICAgICAgICAgIFRJTTUgVEkyIGlzIGNvbm5lY3RlZCB0bw0KLSAgQ09NUDIgb3V0cHV0DQotICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNNV9USTJfQ09NUDM6ICAgICAgICAgICAgICAgVElNNSBUSTIgaXMgY29ubmVjdGVkIHRvDQotICBDT01QMyBvdXRwdXQNCi0gICogICAgICAgICAgICBAYXJnIFRJTV9USU01X1RJMl9DT01QNDogICAgICAgICAgICAgICBUSU01IFRJMiBpcyBjb25uZWN0ZWQgdG8NCi0gIENPTVA0IG91dHB1dA0KLSAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTVfVEkyX0NPTVA1OiAgICAgICAgICAgICAgIFRJTTUgVEkyIGlzIGNvbm5lY3RlZCB0bw0KLSAgQ09NUDUgb3V0cHV0ICAgICAoKikNCi0gICogICAgICAgICAgICBAYXJnIFRJTV9USU01X1RJMl9DT01QNjogICAgICAgICAgICAgICBUSU01IFRJMiBpcyBjb25uZWN0ZWQgdG8NCi0gIENPTVA2IG91dHB1dCAgICAgKCopDQotICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNNV9USTJfQ09NUDc6ICAgICAgICAgICAgICAgVElNNSBUSTIgaXMgY29ubmVjdGVkIHRvDQotICBDT01QNyBvdXRwdXQgICAgICgqKQ0KLSAgKg0KLSAgKiAgICAgICAgIEZvciBUSU04IHRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNOF9USTFfR1BJTzogICAgICAgICAgICAgICAgVElNOCBUSTEgaXMgY29ubmVjdGVkIHRvDQotICBHUElPDQotICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNOF9USTFfQ09NUDE6ICAgICAgICAgICAgICAgVElNOCBUSTEgaXMgY29ubmVjdGVkIHRvDQotICBDT01QMSBvdXRwdXQNCi0gICogICAgICAgICAgICBAYXJnIFRJTV9USU04X1RJMV9DT01QMjogICAgICAgICAgICAgICBUSU04IFRJMSBpcyBjb25uZWN0ZWQgdG8NCi0gIENPTVAyIG91dHB1dA0KLSAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTThfVEkxX0NPTVAzOiAgICAgICAgICAgICAgIFRJTTggVEkxIGlzIGNvbm5lY3RlZCB0bw0KLSAgQ09NUDMgb3V0cHV0DQotICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNOF9USTFfQ09NUDQ6ICAgICAgICAgICAgICAgVElNOCBUSTEgaXMgY29ubmVjdGVkIHRvDQotICBDT01QNCBvdXRwdXQNCi0gICoNCi0gICogICAgICAgICBGb3IgVElNMTUgdGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgICAgICAgICBAYXJnIFRJTV9USU0xNV9USTFfR1BJTzogICAgICAgICAgICAgICAgVElNMTUgVEkxIGlzIGNvbm5lY3RlZCB0bw0KLSAgR1BJTw0KLSAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTE1X1RJMV9MU0U6ICAgICAgICAgICAgICAgICBUSU0xNSBUSTEgaXMgY29ubmVjdGVkIHRvDQotICBMU0UgY2xvY2sNCi0gICogICAgICAgICAgICBAYXJnIFRJTV9USU0xNV9USTFfQ09NUDE6ICAgICAgICAgICAgICAgVElNMTUgVEkxIGlzIGNvbm5lY3RlZCB0bw0KLSAgQ09NUDEgb3V0cHV0DQotICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMTVfVEkxX0NPTVAyOiAgICAgICAgICAgICAgIFRJTTE1IFRJMSBpcyBjb25uZWN0ZWQgdG8NCi0gIENPTVAyIG91dHB1dA0KLSAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTE1X1RJMV9DT01QNTogICAgICAgICAgICAgICBUSU0xNSBUSTEgaXMgY29ubmVjdGVkIHRvDQotICBDT01QNSBvdXRwdXQgICAgICgqKQ0KLSAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTE1X1RJMV9DT01QNzogICAgICAgICAgICAgICBUSU0xNSBUSTEgaXMgY29ubmVjdGVkIHRvDQotICBDT01QNyBvdXRwdXQgICAgICgqKQ0KLSAgKg0KLSAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTE1X1RJMl9HUElPOiAgICAgICAgICAgICAgICBUSU0xNSBUSTIgaXMgY29ubmVjdGVkIHRvDQotICBHUElPDQotICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMTVfVEkyX0NPTVAyOiAgICAgICAgICAgICAgIFRJTTE1IFRJMiBpcyBjb25uZWN0ZWQgdG8NCi0gIENPTVAyIG91dHB1dA0KLSAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTE1X1RJMl9DT01QMzogICAgICAgICAgICAgICBUSU0xNSBUSTIgaXMgY29ubmVjdGVkIHRvDQotICBDT01QMyBvdXRwdXQNCi0gICogICAgICAgICAgICBAYXJnIFRJTV9USU0xNV9USTJfQ09NUDY6ICAgICAgICAgICAgICAgVElNMTUgVEkyIGlzIGNvbm5lY3RlZCB0bw0KLSAgQ09NUDYgb3V0cHV0ICAgICAoKikNCi0gICogICAgICAgICAgICBAYXJnIFRJTV9USU0xNV9USTJfQ09NUDc6ICAgICAgICAgICAgICAgVElNMTUgVEkyIGlzIGNvbm5lY3RlZCB0bw0KLSAgQ09NUDcgb3V0cHV0ICAgICAoKikNCi0gICoNCi0gICogICAgICAgICBGb3IgVElNMTYgdGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgICAgICAgICBAYXJnIFRJTV9USU0xNl9USTFfR1BJTzogICAgICAgICAgICAgICAgVElNMTYgVEkxIGlzIGNvbm5lY3RlZCB0bw0KLSAgR1BJTw0KLSAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTE2X1RJMV9DT01QNjogICAgICAgICAgICAgICBUSU0xNiBUSTEgaXMgY29ubmVjdGVkIHRvDQotICBDT01QNiBvdXRwdXQgICAgICgqKQ0KLSAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTE2X1RJMV9NQ086ICAgICAgICAgICAgICAgICBUSU0xNSBUSTEgaXMgY29ubmVjdGVkIHRvDQotICBNQ08gb3V0cHV0DQotICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMTZfVEkxX0hTRV8zMjogICAgICAgICAgICAgIFRJTTE1IFRJMSBpcyBjb25uZWN0ZWQgdG8NCi0gIEhTRSBkaXYgMzINCi0gICogICAgICAgICAgICBAYXJnIFRJTV9USU0xNl9USTFfUlRDX1dLOiAgICAgICAgICAgICAgVElNMTUgVEkxIGlzIGNvbm5lY3RlZCB0bw0KLSAgUlRDIHdha2V1cA0KLSAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTE2X1RJMV9MU0U6ICAgICAgICAgICAgICAgICBUSU0xNSBUSTEgaXMgY29ubmVjdGVkIHRvDQotICBMU0UgY2xvY2sNCi0gICogICAgICAgICAgICBAYXJnIFRJTV9USU0xNl9USTFfTFNJOiAgICAgICAgICAgICAgICAgVElNMTUgVEkxIGlzIGNvbm5lY3RlZCB0bw0KLSAgTFNJIGNsb2NrDQotICAqDQotICAqICAgICAgICAgRm9yIFRJTTE3IHRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMTdfVEkxX0dQSU86ICAgICAgICAgICAgICAgIFRJTTE3IFRJMSBpcyBjb25uZWN0ZWQgdG8NCi0gIEdQSU8NCi0gICogICAgICAgICAgICBAYXJnIFRJTV9USU0xN19USTFfQ09NUDU6ICAgICAgICAgICAgICAgVElNMTcgVEkxIGlzIGNvbm5lY3RlZCB0bw0KLSAgQ09NUDUgb3V0cHV0ICAgICAoKikNCi0gICogICAgICAgICAgICBAYXJnIFRJTV9USU0xN19USTFfTUNPOiAgICAgICAgICAgICAgICAgVElNMTcgVEkxIGlzIGNvbm5lY3RlZCB0bw0KLSAgTUNPIG91dHB1dA0KLSAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTE3X1RJMV9IU0VfMzI6ICAgICAgICAgICAgICBUSU0xNyBUSTEgaXMgY29ubmVjdGVkIHRvDQotICBIU0UgZGl2IDMyDQotICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMTdfVEkxX1JUQ19XSzogICAgICAgICAgICAgIFRJTTE3IFRJMSBpcyBjb25uZWN0ZWQgdG8NCi0gIFJUQyB3YWtldXANCi0gICogICAgICAgICAgICBAYXJnIFRJTV9USU0xN19USTFfTFNFOiAgICAgICAgICAgICAgICAgVElNMTcgVEkxIGlzIGNvbm5lY3RlZCB0bw0KLSAgTFNFIGNsb2NrDQotICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMTdfVEkxX0xTSTogICAgICAgICAgICAgICAgIFRJTTE3IFRJMSBpcyBjb25uZWN0ZWQgdG8NCi0gIExTSSBjbG9jaw0KLQ0KLSAgKiAgICAgICAgIEZvciBUSU0yMCB0aGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiAgICAoKiopDQotICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMjBfVEkxX0dQSU86ICAgICAgICAgICAgICAgIFRJTTIwIFRJMSBpcyBjb25uZWN0ZWQgdG8NCi0gIEdQSU8NCi0gICogICAgICAgICAgICBAYXJnIFRJTV9USU0yMF9USTFfQ09NUDE6ICAgICAgICAgICAgICAgVElNMjAgVEkxIGlzIGNvbm5lY3RlZCB0bw0KLSAgQ09NUDEgb3V0cHV0ICAgICAoKikNCi0gICogICAgICAgICAgICBAYXJnIFRJTV9USU0yMF9USTFfQ09NUDI6ICAgICAgICAgICAgICAgVElNMjAgVEkxIGlzIGNvbm5lY3RlZCB0bw0KLSAgQ09NUDIgb3V0cHV0ICAgICAoKikNCi0gICogICAgICAgICAgICBAYXJnIFRJTV9USU0yMF9USTFfQ09NUDM6ICAgICAgICAgICAgICAgVElNMjAgVEkxIGlzIGNvbm5lY3RlZCB0bw0KLSAgQ09NUDMgb3V0cHV0ICAgICAoKikNCi0gICogICAgICAgICAgICBAYXJnIFRJTV9USU0yMF9USTFfQ09NUDQ6ICAgICAgICAgICAgICAgVElNMjAgVEkxIGlzIGNvbm5lY3RlZCB0bw0KLSAgQ09NUDQgb3V0cHV0ICAgICAoKikNCi0gICoNCi0gICogICAgICAgICAoKikgIFZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLiBcbg0KLSAgKiAgICAgICAgICgqKikgUmVnaXN0ZXIgbm90IGF2YWlsYWJsZSBpbiBhbGwgZGV2aWNlcy4NCi0gICoNCi0gICogQHJldHZhbCBIQUwgc3RhdHVzDQotICAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9USVNlbGVjdGlvbihUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVElTZWxlY3Rpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpIHsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsNCi0NCi0gIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fVElTRUxfVElYX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX1RJU0VMKFRJU2VsZWN0aW9uKSk7DQotDQotICBfX0hBTF9MT0NLKGh0aW0pOw0KLQ0KLSAgc3dpdGNoIChDaGFubmVsKSB7DQotICAgIGNhc2UgVElNX0NIQU5ORUxfMToNCi0gICAgICBNT0RJRllfUkVHKGh0aW0tPkluc3RhbmNlLT5USVNFTCwgVElNX1RJU0VMX1RJMVNFTCwgVElTZWxlY3Rpb24pOw0KLQ0KLSAgICAgIC8qIElmIHJlcXVpcmVkLCBzZXQgT1IgYml0IHRvIHJlcXVlc3QgSFNFLzMyIGNsb2NrICovDQotICAgICAgaWYgKElTX1RJTV9IU0UzMl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpIHsNCi0gICAgICAgIFNFVF9CSVQoaHRpbS0+SW5zdGFuY2UtPk9SLCBUSU1fT1JfSFNFMzJFTik7DQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgIENMRUFSX0JJVChodGltLT5JbnN0YW5jZS0+T1IsIFRJTV9PUl9IU0UzMkVOKTsNCi0gICAgICB9DQotICAgICAgYnJlYWs7DQotICAgIGNhc2UgVElNX0NIQU5ORUxfMjoNCi0gICAgICBNT0RJRllfUkVHKGh0aW0tPkluc3RhbmNlLT5USVNFTCwgVElNX1RJU0VMX1RJMlNFTCwgVElTZWxlY3Rpb24pOw0KLSAgICAgIGJyZWFrOw0KLSAgICBjYXNlIFRJTV9DSEFOTkVMXzM6DQotICAgICAgTU9ESUZZX1JFRyhodGltLT5JbnN0YW5jZS0+VElTRUwsIFRJTV9USVNFTF9USTNTRUwsIFRJU2VsZWN0aW9uKTsNCi0gICAgICBicmVhazsNCi0gICAgY2FzZSBUSU1fQ0hBTk5FTF80Og0KLSAgICAgIE1PRElGWV9SRUcoaHRpbS0+SW5zdGFuY2UtPlRJU0VMLCBUSU1fVElTRUxfVEk0U0VMLCBUSVNlbGVjdGlvbik7DQotICAgICAgYnJlYWs7DQotICAgIGRlZmF1bHQ6DQotICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOw0KLSAgICAgIGJyZWFrOw0KLSAgfQ0KLQ0KLSAgX19IQUxfVU5MT0NLKGh0aW0pOw0KLQ0KLSAgcmV0dXJuIHN0YXR1czsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBHcm91cCBjaGFubmVsIDUgYW5kIGNoYW5uZWwgMSwgMiBvciAzDQotICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUuDQotICogQHBhcmFtICBDaGFubmVscyBzcGVjaWZpZXMgdGhlIHJlZmVyZW5jZSBzaWduYWwocykgdGhlIE9DNVJFRiBpcyBjb21iaW5lZA0KLSAqIHdpdGguIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICBUSU1fR1JPVVBDSDVfTk9ORTogTm8gZWZmZWN0IG9mIE9DNVJFRiBvbiBPQzFSRUZDLCBPQzJSRUZDIGFuZA0KLSAqIE9DM1JFRkMgVElNX0dST1VQQ0g1X09DMVJFRkM6IE9DMVJFRkMgaXMgdGhlIGxvZ2ljYWwgQU5EIG9mIE9DMVJFRkMgYW5kDQotICogT0M1UkVGIFRJTV9HUk9VUENINV9PQzJSRUZDOiBPQzJSRUZDIGlzIHRoZSBsb2dpY2FsIEFORCBvZiBPQzJSRUZDIGFuZCBPQzVSRUYNCi0gKiAgICAgICAgIFRJTV9HUk9VUENINV9PQzNSRUZDOiBPQzNSRUZDIGlzIHRoZSBsb2dpY2FsIEFORCBvZiBPQzNSRUZDIGFuZA0KLSAqIE9DNVJFRg0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9Hcm91cENoYW5uZWw1KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWxzKSB7DQotICAvKiBDaGVjayBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0NPTUJJTkVEM1BIQVNFUFdNX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0dST1VQQ0g1KENoYW5uZWxzKSk7DQotDQotICAvKiBQcm9jZXNzIExvY2tlZCAqLw0KLSAgX19IQUxfTE9DSyhodGltKTsNCi0NCi0gIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOw0KLQ0KLSAgLyogQ2xlYXIgR0M1Q3ggYml0IGZpZWxkcyAqLw0KLSAgaHRpbS0+SW5zdGFuY2UtPkNDUjUgJj0gfihUSU1fQ0NSNV9HQzVDMyB8IFRJTV9DQ1I1X0dDNUMyIHwgVElNX0NDUjVfR0M1QzEpOw0KLQ0KLSAgLyogU2V0IEdDNUN4IGJpdCBmaWVsZHMgKi8NCi0gIGh0aW0tPkluc3RhbmNlLT5DQ1I1IHw9IENoYW5uZWxzOw0KLQ0KLSAgLyogQ2hhbmdlIHRoZSBodGltIHN0YXRlICovDQotICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7DQotDQotICBfX0hBTF9VTkxPQ0soaHRpbSk7DQotDQotICByZXR1cm4gSEFMX09LOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FybSB0aGUgZGVzaWduYXRlZCBicmVhayBpbnB1dCAod2hlbiBpdCBvcGVyYXRlcyBpbiBiaWRpcmVjdGlvbmFsDQotICogbW9kZSkuDQotICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUuDQotICogQHBhcmFtICBCcmVha0lucHV0IEJyZWFrIGlucHV0IHRvIGRpc2FybQ0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIFRJTV9CUkVBS0lOUFVUX0JSSzogVGltZXIgYnJlYWsgaW5wdXQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0JSRUFLSU5QVVRfQlJLMjogVGltZXIgYnJlYWsgMiBpbnB1dA0KLSAqIEBub3RlICBUaGUgYnJlYWsgaW5wdXQgY2FuIGJlIGRpc2FybWVkIG9ubHkgd2hlbiBpdCBpcyBjb25maWd1cmVkIGluDQotICogICAgICAgIGJpZGlyZWN0aW9uYWwgbW9kZSBhbmQgd2hlbiB3aGVuIE1PRSBpcyByZXNldC4NCi0gKiBAbm90ZSAgUHVycG9zZSBpcyB0byBiZSBhYmxlIHRvIGhhdmUgdGhlIGlucHV0IHZvbHRhZ2UgYmFjayB0byBoaWdoLXN0YXRlLA0KLSAqICAgICAgICB3aGF0ZXZlciB0aGUgdGltZSBjb25zdGFudCBvbiB0aGUgb3V0cHV0IC4NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfRGlzYXJtQnJlYWtJbnB1dChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBCcmVha0lucHV0KSB7DQotICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7DQotICB1aW50MzJfdCB0bXBiZHRyOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fQURWQU5DRURfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsNCi0gIGFzc2VydF9wYXJhbShJU19USU1fQlJFQUtJTlBVVChCcmVha0lucHV0KSk7DQotDQotICBzd2l0Y2ggKEJyZWFrSW5wdXQpIHsNCi0gICAgY2FzZSBUSU1fQlJFQUtJTlBVVF9CUks6IHsNCi0gICAgICAvKiBDaGVjayBpbml0aWFsIGNvbmRpdGlvbnMgKi8NCi0gICAgICB0bXBiZHRyID0gUkVBRF9SRUcoaHRpbS0+SW5zdGFuY2UtPkJEVFIpOw0KLSAgICAgIGlmICgoUkVBRF9CSVQodG1wYmR0ciwgVElNX0JEVFJfQktCSUQpID09IFRJTV9CRFRSX0JLQklEKSAmJg0KLSAgICAgICAgICAoUkVBRF9CSVQodG1wYmR0ciwgVElNX0JEVFJfTU9FKSA9PSAwVSkpIHsNCi0gICAgICAgIC8qIEJyZWFrIGlucHV0IEJSSyBpcyBkaXNhcm1lZCAqLw0KLSAgICAgICAgU0VUX0JJVChodGltLT5JbnN0YW5jZS0+QkRUUiwgVElNX0JEVFJfQktEU1JNKTsNCi0gICAgICB9DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0NCi0gICAgY2FzZSBUSU1fQlJFQUtJTlBVVF9CUksyOiB7DQotICAgICAgLyogQ2hlY2sgaW5pdGlhbCBjb25kaXRpb25zICovDQotICAgICAgdG1wYmR0ciA9IFJFQURfUkVHKGh0aW0tPkluc3RhbmNlLT5CRFRSKTsNCi0gICAgICBpZiAoKFJFQURfQklUKHRtcGJkdHIsIFRJTV9CRFRSX0JLMkJJRCkgPT0gVElNX0JEVFJfQksyQklEKSAmJg0KLSAgICAgICAgICAoUkVBRF9CSVQodG1wYmR0ciwgVElNX0JEVFJfTU9FKSA9PSAwVSkpIHsNCi0gICAgICAgIC8qIEJyZWFrIGlucHV0IEJSSyBpcyBkaXNhcm1lZCAqLw0KLSAgICAgICAgU0VUX0JJVChodGltLT5JbnN0YW5jZS0+QkRUUiwgVElNX0JEVFJfQksyRFNSTSk7DQotICAgICAgfQ0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotICAgIGRlZmF1bHQ6DQotICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOw0KLSAgICAgIGJyZWFrOw0KLSAgfQ0KLQ0KLSAgcmV0dXJuIHN0YXR1czsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBBcm0gdGhlIGRlc2lnbmF0ZWQgYnJlYWsgaW5wdXQgKHdoZW4gaXQgb3BlcmF0ZXMgaW4gYmlkaXJlY3Rpb25hbA0KLSAqIG1vZGUpLg0KLSAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlLg0KLSAqIEBwYXJhbSAgQnJlYWtJbnB1dCBCcmVhayBpbnB1dCB0byBhcm0NCi0gKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQlJFQUtJTlBVVF9CUks6IFRpbWVyIGJyZWFrIGlucHV0DQotICogICAgICAgICAgICBAYXJnIFRJTV9CUkVBS0lOUFVUX0JSSzI6IFRpbWVyIGJyZWFrIDIgaW5wdXQNCi0gKiBAbm90ZSAgQXJtaW5nIGlzIHBvc3NpYmxlIGF0IGFueXRpbWUsIGV2ZW4gaWYgZmF1bHQgaXMgcHJlc2VudC4NCi0gKiBAbm90ZSAgQnJlYWsgaW5wdXQgaXMgYXV0b21hdGljYWxseSBhcm1lZCBhcyBzb29uIGFzIE1PRSBiaXQgaXMgc2V0Lg0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9SZUFybUJyZWFrSW5wdXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBCcmVha0lucHV0KSB7DQotICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7DQotICB1aW50MzJfdCB0aWNrc3RhcnQ7DQotDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9BRFZBTkNFRF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9CUkVBS0lOUFVUKEJyZWFrSW5wdXQpKTsNCi0NCi0gIHN3aXRjaCAoQnJlYWtJbnB1dCkgew0KLSAgICBjYXNlIFRJTV9CUkVBS0lOUFVUX0JSSzogew0KLSAgICAgIC8qIENoZWNrIGluaXRpYWwgY29uZGl0aW9ucyAqLw0KLSAgICAgIGlmIChSRUFEX0JJVChodGltLT5JbnN0YW5jZS0+QkRUUiwgVElNX0JEVFJfQktCSUQpID09IFRJTV9CRFRSX0JLQklEKSB7DQotICAgICAgICAvKiBCcmVhayBpbnB1dCBCUksgaXMgcmUtYXJtZWQgYXV0b21hdGljYWxseSBieSBoYXJkd2FyZS4gUG9sbCB0byBjaGVjaw0KLSAgICAgICAgICogd2hldGhlciBmYXVsdCBjb25kaXRpb24gZGlzYXBwZWFyZWQgKi8NCi0gICAgICAgIC8qIEluaXQgdGlja3N0YXJ0IGZvciB0aW1lb3V0IG1hbmFnZW1lbnQgKi8NCi0gICAgICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7DQotICAgICAgICB3aGlsZSAoUkVBRF9CSVQoaHRpbS0+SW5zdGFuY2UtPkJEVFIsIFRJTV9CRFRSX0JLRFNSTSkgIT0gMFVMKSB7DQotICAgICAgICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBUSU1fQlJFQUtJTlBVVF9SRUFSTV9USU1FT1VUKSB7DQotICAgICAgICAgICAgLyogTmV3IGNoZWNrIHRvIGF2b2lkIGZhbHNlIHRpbWVvdXQgZGV0ZWN0aW9uIGluIGNhc2Ugb2YgcHJlZW1wdGlvbg0KLSAgICAgICAgICAgICAqLw0KLSAgICAgICAgICAgIGlmIChSRUFEX0JJVChodGltLT5JbnN0YW5jZS0+QkRUUiwgVElNX0JEVFJfQktEU1JNKSAhPSAwVUwpIHsNCi0gICAgICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICB9DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0NCi0gICAgY2FzZSBUSU1fQlJFQUtJTlBVVF9CUksyOiB7DQotICAgICAgLyogQ2hlY2sgaW5pdGlhbCBjb25kaXRpb25zICovDQotICAgICAgaWYgKFJFQURfQklUKGh0aW0tPkluc3RhbmNlLT5CRFRSLCBUSU1fQkRUUl9CSzJCSUQpID09IFRJTV9CRFRSX0JLMkJJRCkgew0KLSAgICAgICAgLyogQnJlYWsgaW5wdXQgQlJLMiBpcyByZS1hcm1lZCBhdXRvbWF0aWNhbGx5IGJ5IGhhcmR3YXJlLiBQb2xsIHRvIGNoZWNrDQotICAgICAgICAgKiB3aGV0aGVyIGZhdWx0IGNvbmRpdGlvbiBkaXNhcHBlYXJlZCAqLw0KLSAgICAgICAgLyogSW5pdCB0aWNrc3RhcnQgZm9yIHRpbWVvdXQgbWFuYWdlbWVudCAqLw0KLSAgICAgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsNCi0gICAgICAgIHdoaWxlIChSRUFEX0JJVChodGltLT5JbnN0YW5jZS0+QkRUUiwgVElNX0JEVFJfQksyRFNSTSkgIT0gMFVMKSB7DQotICAgICAgICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBUSU1fQlJFQUtJTlBVVF9SRUFSTV9USU1FT1VUKSB7DQotICAgICAgICAgICAgLyogTmV3IGNoZWNrIHRvIGF2b2lkIGZhbHNlIHRpbWVvdXQgZGV0ZWN0aW9uIGluIGNhc2Ugb2YgcHJlZW1wdGlvbg0KLSAgICAgICAgICAgICAqLw0KLSAgICAgICAgICAgIGlmIChSRUFEX0JJVChodGltLT5JbnN0YW5jZS0+QkRUUiwgVElNX0JEVFJfQksyRFNSTSkgIT0gMFVMKSB7DQotICAgICAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgfQ0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotICAgIGRlZmF1bHQ6DQotICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOw0KLSAgICAgIGJyZWFrOw0KLSAgfQ0KLQ0KLSAgcmV0dXJuIHN0YXR1czsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgZGl0aGVyaW5nDQotICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUNCi0gKiBAbm90ZSAgIE1haW4gdXNhZ2UgaXMgUFdNIG1vZGUNCi0gKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2hlbiB0aW1lciBpcyBzdG9wcGVkIG9yIGRpc2FibGVkIChDRU4NCi0gKiA9MCkNCi0gKiBAbm90ZSAgIElmIGRpdGhlcmluZyBpcyBhY3RpdmF0ZWQsIHBheSBhdHRlbnRpb24gdG8gQVJSLCBDQ1J4LCBDTlQNCi0gKiBpbnRlcnByZXRhdGlvbjoNCi0gKiAgICAgICAgICAgLSBDTlQ6IG9ubHkgQ05UWzExOjBdIGhvbGRzIHRoZSBub24tZGl0aGVyZWQgcGFydCBmb3IgMTZiIHRpbWVycw0KLSAqIChvciBDTlRbMjY6MF0gZm9yIDMyYiB0aW1lcnMpDQotICogICAgICAgICAgIC0gQVJSOiBBUlJbMTU6NF0gaG9sZHMgdGhlIG5vbi1kaXRoZXJlZCBwYXJ0LCBhbmQgQVJSWzM6MF0gdGhlDQotICogZGl0aGVyIHBhcnQgZm9yIDE2YiB0aW1lcnMNCi0gKiAgICAgICAgICAgLSBDQ1J4OiBDQ1J4WzE1OjRdIGhvbGRzIHRoZSBub24tZGl0aGVyZWQgcGFydCwgYW5kIENDUnhbMzowXSB0aGUNCi0gKiBkaXRoZXIgcGFydCBmb3IgMTZiIHRpbWVycw0KLSAqICAgICAgICAgICAtIEFSUiBhbmQgQ0NSeCB2YWx1ZXMgYXJlIGxpbWl0ZWQgdG8gMHhGRkVGIGluIGRpdGhlcmluZyBtb2RlIGZvcg0KLSAqIDE2YiB0aW1lcnMgKGNvcnJlc3BvbmRzIHRvIDQwOTQgZm9yIHRoZSBpbnRlZ2VyIHBhcnQgYW5kIDE1IGZvciB0aGUgZGl0aGVyZWQNCi0gKiBwYXJ0KS4NCi0gKiBAbm90ZSAgIE1hY3JvcyBAcmVmIF9fSEFMX1RJTV9DQUxDX1BFUklPRF9ESVRIRVIoKQ0KLSAqIF9fSEFMX1RJTV9DQUxDX0RFTEFZX0RJVEhFUigpICBfX0hBTF9USU1fQ0FMQ19QVUxTRV9ESVRIRVIoKSBjYW4gYmUgdXNlZCB0bw0KLSAqIGNhbGN1bGF0ZSBwZXJpb2QgKEFSUikgYW5kIGRlbGF5IChDQ1J4KSB2YWx1ZS4NCi0gKiBAbm90ZSAgIEVuYWJsaW5nIGRpdGhlcmluZywgbW9kaWZpZXMgYXV0b21hdGljYWxseSB2YWx1ZXMgb2YgcmVnaXN0ZXJzDQotICogQVJSL0NDUnggdG8ga2VlcCB0aGUgc2FtZSBpbnRlZ2VyIHBhcnQuDQotICogQG5vdGUgICBFbmFibGluZyBkaXRoZXJpbmcsIG1vZGlmaWVzIGF1dG9tYXRpY2FsbHkgdmFsdWVzIG9mIHJlZ2lzdGVycw0KLSAqIEFSUi9DQ1J4IHRvIGtlZXAgdGhlIHNhbWUgaW50ZWdlciBwYXJ0LiBTbyBpdCBtYXkgYmUgbmVjZXNzYXJ5IHRvIHJlYWQgQVJSDQotICogdmFsdWUgb3IgQ0NSeCB2YWx1ZSB3aXRoIG1hY3JvcyBAcmVmIF9fSEFMX1RJTV9HRVRfQVVUT1JFTE9BRCgpDQotICogICAgICAgICBfX0hBTF9USU1fR0VUX0NPTVBBUkUoKSBhbmQgaWYgbmVjZXNzYXJ5IHVwZGF0ZSBJbml0IHN0cnVjdHVyZSBmaWVsZA0KLSAqIGh0aW0tPkluaXQuUGVyaW9kIC4NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfRGl0aGVyaW5nRW5hYmxlKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKSB7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOw0KLQ0KLSAgU0VUX0JJVChodGltLT5JbnN0YW5jZS0+Q1IxLCBUSU1fQ1IxX0RJVEhFTik7DQotICByZXR1cm4gSEFMX09LOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgZGl0aGVyaW5nDQotICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUNCi0gKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2hlbiB0aW1lciBpcyBzdG9wcGVkIG9yIGRpc2FibGVkIChDRU4NCi0gKiA9MCkNCi0gKiBAbm90ZSAgIElmIGRpdGhlcmluZyBpcyBhY3RpdmF0ZWQsIHBheSBhdHRlbnRpb24gdG8gQVJSLCBDQ1J4LCBDTlQNCi0gKiBpbnRlcnByZXRhdGlvbjoNCi0gKiAgICAgICAgICAgLSBDTlQ6IG9ubHkgQ05UWzExOjBdIGhvbGRzIHRoZSBub24tZGl0aGVyZWQgcGFydCBmb3IgMTZiIHRpbWVycw0KLSAqIChvciBDTlRbMjY6MF0gZm9yIDMyYiB0aW1lcnMpDQotICogICAgICAgICAgIC0gQVJSOiBBUlJbMTU6NF0gaG9sZHMgdGhlIG5vbi1kaXRoZXJlZCBwYXJ0LCBhbmQgQVJSWzM6MF0gdGhlDQotICogZGl0aGVyIHBhcnQgZm9yIDE2YiB0aW1lcnMNCi0gKiAgICAgICAgICAgLSBDQ1J4OiBDQ1J4WzE1OjRdIGhvbGRzIHRoZSBub24tZGl0aGVyZWQgcGFydCwgYW5kIENDUnhbMzowXSB0aGUNCi0gKiBkaXRoZXIgcGFydCBmb3IgMTZiIHRpbWVycw0KLSAqICAgICAgICAgICAtIEFSUiBhbmQgQ0NSeCB2YWx1ZXMgYXJlIGxpbWl0ZWQgdG8gMHhGRkVGIGluIGRpdGhlcmluZyBtb2RlDQotICogICAgICAgICAgICAgKGNvcnJlc3BvbmRzIHRvIDQwOTQgZm9yIHRoZSBpbnRlZ2VyIHBhcnQgYW5kIDE1IGZvciB0aGUgZGl0aGVyZWQNCi0gKiBwYXJ0KS4NCi0gKiBAbm90ZSAgIERpc2FibGluZyBkaXRoZXJpbmcsIG1vZGlmaWVzIGF1dG9tYXRpY2FsbHkgdmFsdWVzIG9mIHJlZ2lzdGVycw0KLSAqIEFSUi9DQ1J4IHRvIGtlZXAgdGhlIHNhbWUgaW50ZWdlciBwYXJ0LiBTbyBpdCBtYXkgYmUgbmVjZXNzYXJ5IHRvIHJlYWQgQVJSDQotICogdmFsdWUgb3IgQ0NSeCB2YWx1ZSB3aXRoIG1hY3JvcyBAcmVmIF9fSEFMX1RJTV9HRVRfQVVUT1JFTE9BRCgpDQotICogICAgICAgICBfX0hBTF9USU1fR0VUX0NPTVBBUkUoKSBhbmQgaWYgbmVjZXNzYXJ5IHVwZGF0ZSBJbml0IHN0cnVjdHVyZSBmaWVsZA0KLSAqIGh0aW0tPkluaXQuUGVyaW9kIC4NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfRGl0aGVyaW5nRGlzYWJsZShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkgew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsNCi0NCi0gIENMRUFSX0JJVChodGltLT5JbnN0YW5jZS0+Q1IxLCBUSU1fQ1IxX0RJVEhFTik7DQotICByZXR1cm4gSEFMX09LOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBwdWxzZSBvbiBjb21wYXJlIHB1bHNlIHdpZHRoIGFuZCBwdWxzZSBwcmVzY2FsZXINCi0gKiBAcGFyYW0gIGh0aW0gVElNIE91dHB1dCBDb21wYXJlIGhhbmRsZQ0KLSAqIEBwYXJhbSAgUHVsc2VXaWR0aFByZXNjYWxlciAgUHVsc2Ugd2lkdGggcHJlc2NhbGVyDQotICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MCBhbmQgTWF4X0RhdGEgPQ0KLSAqIDB4Nw0KLSAqIEBwYXJhbSAgUHVsc2VXaWR0aCAgUHVsc2Ugd2lkdGgNCi0gKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMCBhbmQgTWF4X0RhdGEgPQ0KLSAqIDB4RkYNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfT0NfQ29uZmlnUHVsc2VPbkNvbXBhcmUoDQotICAgIFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBQdWxzZVdpZHRoUHJlc2NhbGVyLA0KLSAgICB1aW50MzJfdCBQdWxzZVdpZHRoKSB7DQotICB1aW50MzJfdCB0bXBlY3I7DQotDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9QVUxTRU9OQ09NUEFSRV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9QVUxTRU9OQ09NUEFSRV9XSURUSChQdWxzZVdpZHRoKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX1BVTFNFT05DT01QQVJFX1dJRFRIUFJFU0NBTEVSKFB1bHNlV2lkdGhQcmVzY2FsZXIpKTsNCi0NCi0gIC8qIFByb2Nlc3MgTG9ja2VkICovDQotICBfX0hBTF9MT0NLKGh0aW0pOw0KLQ0KLSAgLyogU2V0IHRoZSBUSU0gc3RhdGUgKi8NCi0gIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOw0KLQ0KLSAgLyogR2V0IHRoZSBUSU14IEVDUiByZWdpc3RlciB2YWx1ZSAqLw0KLSAgdG1wZWNyID0gaHRpbS0+SW5zdGFuY2UtPkVDUjsNCi0gIC8qIFJlc2V0IHRoZSBQdWxzZSB3aWR0aCBwcmVzY2FsZXIgYW5kIHRoZSBQdWxzZSB3aWR0aCAqLw0KLSAgdG1wZWNyICY9IH4oVElNX0VDUl9QV1BSU0MgfCBUSU1fRUNSX1BXKTsNCi0gIC8qIFNldCB0aGUgUHVsc2Ugd2lkdGggcHJlc2NhbGVyIGFuZCBQdWxzZSB3aWR0aCovDQotICB0bXBlY3IgfD0gUHVsc2VXaWR0aFByZXNjYWxlciA8PCBUSU1fRUNSX1BXUFJTQ19Qb3M7DQotICB0bXBlY3IgfD0gUHVsc2VXaWR0aCA8PCBUSU1fRUNSX1BXX1BvczsNCi0gIC8qIFdyaXRlIHRvIFRJTXggRUNSICovDQotICBodGltLT5JbnN0YW5jZS0+RUNSID0gdG1wZWNyOw0KLQ0KLSAgLyogQ2hhbmdlIHRoZSBUSU0gc3RhdGUgKi8NCi0gIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRUFEWTsNCi0NCi0gIC8qIFJlbGVhc2UgTG9jayAqLw0KLSAgX19IQUxfVU5MT0NLKGh0aW0pOw0KLQ0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBDb25maWd1cmUgcHJlbG9hZCBzb3VyY2Ugb2YgU2xhdmUgTW9kZSBTZWxlY3Rpb24gYml0ZmllbGQgKFNNUyBpbg0KLSAqIFNNQ1IgcmVnaXN0ZXIpDQotICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUNCi0gKiBAcGFyYW0gIFNvdXJjZSBTb3VyY2Ugb2Ygc2xhdmUgbW9kZSBzZWxlY3Rpb24gcHJlbG9hZA0KLSAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX1NNU19QUkVMT0FEX1NPVVJDRV9VUERBVEU6IFRpbWVyIHVwZGF0ZSBldmVudCBpcyB1c2VkIGFzDQotICogc291cmNlIG9mIFNsYXZlIE1vZGUgU2VsZWN0aW9uIHByZWxvYWQNCi0gKiAgICAgICAgICAgIEBhcmcgVElNX1NNU19QUkVMT0FEX1NPVVJDRV9JTkRFWDogVGltZXIgaW5kZXggZXZlbnQgaXMgdXNlZCBhcw0KLSAqIHNvdXJjZSBvZiBTbGF2ZSBNb2RlIFNlbGVjdGlvbiBwcmVsb2FkDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0NvbmZpZ1NsYXZlTW9kZVByZWxvYWQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgU291cmNlKSB7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9TTEFWRV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9TTEFWRV9QUkVMT0FEX1NPVVJDRShTb3VyY2UpKTsNCi0NCi0gIE1PRElGWV9SRUcoaHRpbS0+SW5zdGFuY2UtPlNNQ1IsIFRJTV9TTUNSX1NNU1BTLCBTb3VyY2UpOw0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgcHJlbG9hZCBvZiBTbGF2ZSBNb2RlIFNlbGVjdGlvbiBiaXRmaWVsZCAoU01TIGluIFNNQ1INCi0gKiByZWdpc3RlcikNCi0gKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQ0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9FbmFibGVTbGF2ZU1vZGVQcmVsb2FkKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKSB7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9TTEFWRV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOw0KLQ0KLSAgU0VUX0JJVChodGltLT5JbnN0YW5jZS0+U01DUiwgVElNX1NNQ1JfU01TUEUpOw0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIHByZWxvYWQgb2YgU2xhdmUgTW9kZSBTZWxlY3Rpb24gYml0ZmllbGQgKFNNUyBpbiBTTUNSDQotICogcmVnaXN0ZXIpDQotICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfRGlzYWJsZVNsYXZlTW9kZVByZWxvYWQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pIHsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX1NMQVZFX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7DQotDQotICBDTEVBUl9CSVQoaHRpbS0+SW5zdGFuY2UtPlNNQ1IsIFRJTV9TTUNSX1NNU1BFKTsNCi0gIHJldHVybiBIQUxfT0s7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIGRlYWR0aW1lIHByZWxvYWQNCi0gKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQ0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9FbmFibGVEZWFkVGltZVByZWxvYWQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pIHsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0JSRUFLX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7DQotDQotICBTRVRfQklUKGh0aW0tPkluc3RhbmNlLT5EVFIyLCBUSU1fRFRSMl9EVFBFKTsNCi0gIHJldHVybiBIQUxfT0s7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBkZWFkdGltZSBwcmVsb2FkDQotICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfRGlzYWJsZURlYWRUaW1lUHJlbG9hZChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkgew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fQlJFQUtfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsNCi0NCi0gIENMRUFSX0JJVChodGltLT5JbnN0YW5jZS0+RFRSMiwgVElNX0RUUjJfRFRQRSk7DQotICByZXR1cm4gSEFMX09LOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIENvbmZpZ3VyZSBkZWFkdGltZQ0KLSAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlDQotICogQHBhcmFtICBEZWFkdGltZSBEZWFkdGltZSB2YWx1ZQ0KLSAqIEBub3RlICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAwIGFuZCBNYXhfRGF0YSA9DQotICogMHhGRg0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9Db25maWdEZWFkVGltZShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRGVhZHRpbWUpIHsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0JSRUFLX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0RFQURUSU1FKERlYWR0aW1lKSk7DQotDQotICBNT0RJRllfUkVHKGh0aW0tPkluc3RhbmNlLT5CRFRSLCBUSU1fQkRUUl9EVEcsIERlYWR0aW1lKTsNCi0gIHJldHVybiBIQUxfT0s7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ29uZmlndXJlIGFzeW1tZXRyaWNhbCBkZWFkdGltZQ0KLSAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlDQotICogQHBhcmFtICBGYWxsaW5nRGVhZHRpbWUgRmFsbGluZyBlZGdlIGRlYWR0aW1lIHZhbHVlDQotICogQG5vdGUgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MDAgYW5kIE1heF9EYXRhID0NCi0gKiAweEZGDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0NvbmZpZ0FzeW1tZXRyaWNhbERlYWRUaW1lKA0KLSAgICBUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgRmFsbGluZ0RlYWR0aW1lKSB7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9CUkVBS19JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9ERUFEVElNRShGYWxsaW5nRGVhZHRpbWUpKTsNCi0NCi0gIE1PRElGWV9SRUcoaHRpbS0+SW5zdGFuY2UtPkRUUjIsIFRJTV9EVFIyX0RUR0YsIEZhbGxpbmdEZWFkdGltZSk7DQotICByZXR1cm4gSEFMX09LOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSBhc3ltbWV0cmljYWwgZGVhZHRpbWUNCi0gKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQ0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9FbmFibGVBc3ltbWV0cmljYWxEZWFkVGltZSgNCi0gICAgVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pIHsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0JSRUFLX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7DQotDQotICBTRVRfQklUKGh0aW0tPkluc3RhbmNlLT5EVFIyLCBUSU1fRFRSMl9EVEFFKTsNCi0gIHJldHVybiBIQUxfT0s7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBhc3ltbWV0cmljYWwgZGVhZHRpbWUNCi0gKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQ0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9EaXNhYmxlQXN5bW1ldHJpY2FsRGVhZFRpbWUoDQotICAgIFRJTV9IYW5kbGVUeXBlRGVmICpodGltKSB7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9CUkVBS19JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOw0KLQ0KLSAgQ0xFQVJfQklUKGh0aW0tPkluc3RhbmNlLT5EVFIyLCBUSU1fRFRSMl9EVEFFKTsNCi0gIHJldHVybiBIQUxfT0s7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgZW5jb2RlciBpbmRleC4NCi0gKiBAbm90ZSAgIHdhcm5pbmcgaW4gY2FzZSBvZiBlbmNvZGVyIG1vZGUgY2xvY2sgcGx1cyBkaXJlY3Rpb24NCi0gKiAgICAgICAgICAgICAgICAgICAgQHJlZiBUSU1fRU5DT0RFUk1PREVfQ0xPQ0tQTFVTRElSRUNUSU9OX1gxIG9yIEByZWYNCi0gKiBUSU1fRU5DT0RFUk1PREVfQ0xPQ0tQTFVTRElSRUNUSU9OX1gyIERpcmVjdGlvbiBtdXN0IGJlIHNldCB0byBAcmVmDQotICogVElNX0VOQ09ERVJJTkRFWF9ESVJFQ1RJT05fVVBfRE9XTg0KLSAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlLg0KLSAqIEBwYXJhbSAgc0VuY29kZXJJbmRleENvbmZpZyBFbmNvZGVyIGluZGV4IGNvbmZpZ3VyYXRpb24NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfQ29uZmlnRW5jb2RlckluZGV4KA0KLSAgICBUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwNCi0gICAgVElNRXhfRW5jb2RlckluZGV4Q29uZmlnVHlwZURlZiAqc0VuY29kZXJJbmRleENvbmZpZykgew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fRU5DT0RFUl9JTlRFUkZBQ0VfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsNCi0gIGFzc2VydF9wYXJhbShJU19USU1fRU5DT0RFUklOREVYX1BPTEFSSVRZKHNFbmNvZGVySW5kZXhDb25maWctPlBvbGFyaXR5KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0VOQ09ERVJJTkRFWF9QUkVTQ0FMRVIoc0VuY29kZXJJbmRleENvbmZpZy0+UHJlc2NhbGVyKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0VOQ09ERVJJTkRFWF9GSUxURVIoc0VuY29kZXJJbmRleENvbmZpZy0+RmlsdGVyKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShzRW5jb2RlckluZGV4Q29uZmlnLT5GaXJzdEluZGV4RW5hYmxlKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0VOQ09ERVJJTkRFWF9QT1NJVElPTihzRW5jb2RlckluZGV4Q29uZmlnLT5Qb3NpdGlvbikpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9FTkNPREVSSU5ERVhfRElSRUNUSU9OKHNFbmNvZGVySW5kZXhDb25maWctPkRpcmVjdGlvbikpOw0KLQ0KLSAgLyogUHJvY2VzcyBMb2NrZWQgKi8NCi0gIF9fSEFMX0xPQ0soaHRpbSk7DQotDQotICAvKiBDb25maWd1cmVzIHRoZSBUSU14IEV4dGVybmFsIFRyaWdnZXIgKEVUUikgd2hpY2ggaXMgdXNlZCBhcyBJbmRleCBpbnB1dCAqLw0KLSAgVElNX0VUUl9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsIHNFbmNvZGVySW5kZXhDb25maWctPlByZXNjYWxlciwNCi0gICAgICAgICAgICAgICAgICAgIHNFbmNvZGVySW5kZXhDb25maWctPlBvbGFyaXR5LCBzRW5jb2RlckluZGV4Q29uZmlnLT5GaWx0ZXIpOw0KLQ0KLSAgLyogQ29uZmlndXJlcyB0aGUgZW5jb2RlciBpbmRleCAqLw0KLSAgTU9ESUZZX1JFRyhodGltLT5JbnN0YW5jZS0+RUNSLA0KLSAgICAgICAgICAgICBUSU1fRUNSX0lESVJfTXNrIHwgVElNX0VDUl9GSURYX01zayB8IFRJTV9FQ1JfSVBPU19Nc2ssDQotICAgICAgICAgICAgIChzRW5jb2RlckluZGV4Q29uZmlnLT5EaXJlY3Rpb24gfA0KLSAgICAgICAgICAgICAgKChzRW5jb2RlckluZGV4Q29uZmlnLT5GaXJzdEluZGV4RW5hYmxlID09IEVOQUJMRSkNCi0gICAgICAgICAgICAgICAgICAgPyAoMHgxVSA8PCBUSU1fRUNSX0ZJRFhfUG9zKQ0KLSAgICAgICAgICAgICAgICAgICA6IDBVKSB8DQotICAgICAgICAgICAgICBzRW5jb2RlckluZGV4Q29uZmlnLT5Qb3NpdGlvbiB8IFRJTV9FQ1JfSUUpKTsNCi0NCi0gIF9fSEFMX1VOTE9DSyhodGltKTsNCi0NCi0gIHJldHVybiBIQUxfT0s7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIGVuY29kZXIgaW5kZXgNCi0gKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQ0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9FbmFibGVFbmNvZGVySW5kZXgoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pIHsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0VOQ09ERVJfSU5URVJGQUNFX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7DQotDQotICBTRVRfQklUKGh0aW0tPkluc3RhbmNlLT5FQ1IsIFRJTV9FQ1JfSUUpOw0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIGVuY29kZXIgaW5kZXgNCi0gKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQ0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9EaXNhYmxlRW5jb2RlckluZGV4KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKSB7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9FTkNPREVSX0lOVEVSRkFDRV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOw0KLQ0KLSAgQ0xFQVJfQklUKGh0aW0tPkluc3RhbmNlLT5FQ1IsIFRJTV9FQ1JfSUUpOw0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgZW5jb2RlciBmaXJzdCBpbmRleA0KLSAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0VuYWJsZUVuY29kZXJGaXJzdEluZGV4KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKSB7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9FTkNPREVSX0lOVEVSRkFDRV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOw0KLQ0KLSAgU0VUX0JJVChodGltLT5JbnN0YW5jZS0+RUNSLCBUSU1fRUNSX0ZJRFgpOw0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBEaXNhYmxlIGVuY29kZXIgZmlyc3QgaW5kZXgNCi0gKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQ0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9EaXNhYmxlRW5jb2RlckZpcnN0SW5kZXgoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pIHsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0VOQ09ERVJfSU5URVJGQUNFX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7DQotDQotICBDTEVBUl9CSVQoaHRpbS0+SW5zdGFuY2UtPkVDUiwgVElNX0VDUl9GSURYKTsNCi0gIHJldHVybiBIQUxfT0s7DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBUSU1FeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA2IEV4dGVuZGVkIENhbGxiYWNrcyBmdW5jdGlvbnMNCi0gICogQGJyaWVmICAgIEV4dGVuZGVkIENhbGxiYWNrcyBmdW5jdGlvbnMNCi0gICoNCi1AdmVyYmF0aW0NCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICAgICAgICAgICAgICAgICAgIyMjIyMgRXh0ZW5kZWQgQ2FsbGJhY2tzIGZ1bmN0aW9ucyAjIyMjIw0KLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICBbLi5dDQotICAgIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBFeHRlbmRlZCBUSU0gY2FsbGJhY2sgZnVuY3Rpb25zOg0KLSAgICAoKykgVGltZXIgQ29tbXV0YXRpb24gY2FsbGJhY2sNCi0gICAgKCspIFRpbWVyIEJyZWFrIGNhbGxiYWNrDQotDQotQGVuZHZlcmJhdGltDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSGFsbCBjb21tdXRhdGlvbiBjaGFuZ2VkIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlDQotICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX3dlYWsgdm9pZCBIQUxfVElNRXhfQ29tbXV0Q2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pIHsNCi0gIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8NCi0gIFVOVVNFRChodGltKTsNCi0NCi0gIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwNCi0gICAgICAgICAgICB0aGUgSEFMX1RJTUV4X0NvbW11dENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUNCi0gICAqLw0KLX0NCi0vKioNCi0gKiBAYnJpZWYgIEhhbGwgY29tbXV0YXRpb24gY2hhbmdlZCBoYWxmIGNvbXBsZXRlIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlDQotICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUNCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX3dlYWsgdm9pZCBIQUxfVElNRXhfQ29tbXV0SGFsZkNwbHRDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkgew0KLSAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLw0KLSAgVU5VU0VEKGh0aW0pOw0KLQ0KLSAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLA0KLSAgICAgICAgICAgIHRoZSBIQUxfVElNRXhfQ29tbXV0SGFsZkNwbHRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUNCi0gICAgIHVzZXIgZmlsZQ0KLSAgICovDQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSGFsbCBCcmVhayBkZXRlY3Rpb24gY2FsbGJhY2sgaW4gbm9uLWJsb2NraW5nIG1vZGUNCi0gKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fd2VhayB2b2lkIEhBTF9USU1FeF9CcmVha0NhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKSB7DQotICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovDQotICBVTlVTRUQoaHRpbSk7DQotDQotICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsDQotICAgICAgICAgICAgdGhlIEhBTF9USU1FeF9CcmVha0NhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUNCi0gICAqLw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEhhbGwgQnJlYWsyIGRldGVjdGlvbiBjYWxsYmFjayBpbiBub24gYmxvY2tpbmcgbW9kZQ0KLSAqIEBwYXJhbSAgaHRpbTogVElNIGhhbmRsZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fd2VhayB2b2lkIEhBTF9USU1FeF9CcmVhazJDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkgew0KLSAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLw0KLSAgVU5VU0VEKGh0aW0pOw0KLQ0KLSAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLA0KLSAgICAgICAgICAgIHRoZSBIQUxfVElNRXhfQnJlYWsyQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQ0KLSAgICovDQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5jb2RlciBpbmRleCBjYWxsYmFjayBpbiBub24tYmxvY2tpbmcgbW9kZQ0KLSAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlDQotICogQHJldHZhbCBOb25lDQotICovDQotX193ZWFrIHZvaWQgSEFMX1RJTUV4X0VuY29kZXJJbmRleENhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKSB7DQotICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovDQotICBVTlVTRUQoaHRpbSk7DQotDQotICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsDQotICAgICAgICAgICAgdGhlIEhBTF9USU1FeF9FbmNvZGVySW5kZXhDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlcg0KLSAgICAgZmlsZQ0KLSAgICovDQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlyZWN0aW9uIGNoYW5nZSBjYWxsYmFjayBpbiBub24tYmxvY2tpbmcgbW9kZQ0KLSAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlDQotICogQHJldHZhbCBOb25lDQotICovDQotX193ZWFrIHZvaWQgSEFMX1RJTUV4X0RpcmVjdGlvbkNoYW5nZUNhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKSB7DQotICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovDQotICBVTlVTRUQoaHRpbSk7DQotDQotICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsDQotICAgICAgICAgICAgdGhlIEhBTF9USU1FeF9EaXJlY3Rpb25DaGFuZ2VDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUNCi0gICAgIHVzZXIgZmlsZQ0KLSAgICovDQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSW5kZXggZXJyb3IgY2FsbGJhY2sgaW4gbm9uLWJsb2NraW5nIG1vZGUNCi0gKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQ0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fd2VhayB2b2lkIEhBTF9USU1FeF9JbmRleEVycm9yQ2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pIHsNCi0gIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8NCi0gIFVOVVNFRChodGltKTsNCi0NCi0gIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwNCi0gICAgICAgICAgICB0aGUgSEFMX1RJTUV4X0luZGV4RXJyb3JDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlcg0KLSAgICAgZmlsZQ0KLSAgICovDQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgVHJhbnNpdGlvbiBlcnJvciBjYWxsYmFjayBpbiBub24tYmxvY2tpbmcgbW9kZQ0KLSAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlDQotICogQHJldHZhbCBOb25lDQotICovDQotX193ZWFrIHZvaWQgSEFMX1RJTUV4X1RyYW5zaXRpb25FcnJvckNhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKSB7DQotICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovDQotICBVTlVTRUQoaHRpbSk7DQotDQotICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsDQotICAgICAgICAgICAgdGhlIEhBTF9USU1FeF9UcmFuc2l0aW9uRXJyb3JDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUNCi0gICAgIHVzZXIgZmlsZQ0KLSAgICovDQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBUSU1FeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA3IEV4dGVuZGVkIFBlcmlwaGVyYWwgU3RhdGUNCi1mdW5jdGlvbnMNCi0gICogQGJyaWVmICAgIEV4dGVuZGVkIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zDQotICAqDQotQHZlcmJhdGltDQotICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgICAgICAgICAgICAgIyMjIyMgRXh0ZW5kZWQgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMgIyMjIyMNCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgWy4uXQ0KLSAgICBUaGlzIHN1YnNlY3Rpb24gcGVybWl0cyB0byBnZXQgaW4gcnVuLXRpbWUgdGhlIHN0YXR1cyBvZiB0aGUgcGVyaXBoZXJhbA0KLSAgICBhbmQgdGhlIGRhdGEgZmxvdy4NCi0NCi1AZW5kdmVyYmF0aW0NCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICogQGJyaWVmICBSZXR1cm4gdGhlIFRJTSBIYWxsIFNlbnNvciBpbnRlcmZhY2UgaGFuZGxlIHN0YXRlLg0KLSAqIEBwYXJhbSAgaHRpbSBUSU0gSGFsbCBTZW5zb3IgaGFuZGxlDQotICogQHJldHZhbCBIQUwgc3RhdGUNCi0gKi8NCi1IQUxfVElNX1N0YXRlVHlwZURlZiBIQUxfVElNRXhfSGFsbFNlbnNvcl9HZXRTdGF0ZShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkgew0KLSAgcmV0dXJuIGh0aW0tPlN0YXRlOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJldHVybiBhY3R1YWwgc3RhdGUgb2YgdGhlIFRJTSBjb21wbGVtZW50YXJ5IGNoYW5uZWwuDQotICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUNCi0gKiBAcGFyYW0gIENoYW5uZWxOIFRJTSBDb21wbGVtZW50YXJ5IGNoYW5uZWwNCi0gKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDINCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMw0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0DQotICogQHJldHZhbCBUSU0gQ29tcGxlbWVudGFyeSBjaGFubmVsIHN0YXRlDQotICovDQotSEFMX1RJTV9DaGFubmVsU3RhdGVUeXBlRGVmIEhBTF9USU1FeF9HZXRDaGFubmVsTlN0YXRlKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsTikgew0KLSAgSEFMX1RJTV9DaGFubmVsU3RhdGVUeXBlRGVmIGNoYW5uZWxfc3RhdGU7DQotDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hOX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsTikpOw0KLQ0KLSAgY2hhbm5lbF9zdGF0ZSA9IFRJTV9DSEFOTkVMX05fU1RBVEVfR0VUKGh0aW0sIENoYW5uZWxOKTsNCi0NCi0gIHJldHVybiBjaGFubmVsX3N0YXRlOw0KLX0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGRlZmdyb3VwIFRJTUV4X1ByaXZhdGVfRnVuY3Rpb25zIFRJTSBFeHRlbmRlZCBQcml2YXRlIEZ1bmN0aW9ucw0KLSAqIEB7DQotICovDQotDQotLyoqDQotICogQGJyaWVmICBUSU0gRE1BIENvbW11dGF0aW9uIGNhbGxiYWNrLg0KLSAqIEBwYXJhbSAgaGRtYSBwb2ludGVyIHRvIERNQSBoYW5kbGUuDQotICogQHJldHZhbCBOb25lDQotICovDQotdm9pZCBUSU1FeF9ETUFDb21tdXRhdGlvbkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpIHsNCi0gIFRJTV9IYW5kbGVUeXBlRGVmICpodGltID0NCi0gICAgICAoVElNX0hhbmRsZVR5cGVEZWYgKikoKERNQV9IYW5kbGVUeXBlRGVmICopaGRtYSktPlBhcmVudDsNCi0NCi0gIC8qIENoYW5nZSB0aGUgaHRpbSBzdGF0ZSAqLw0KLSAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOw0KLQ0KLSNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpDQotICBodGltLT5Db21tdXRhdGlvbkNhbGxiYWNrKGh0aW0pOw0KLSNlbHNlDQotICBIQUxfVElNRXhfQ29tbXV0Q2FsbGJhY2soaHRpbSk7DQotI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFRJTSBETUEgQ29tbXV0YXRpb24gaGFsZiBjb21wbGV0ZSBjYWxsYmFjay4NCi0gKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBETUEgaGFuZGxlLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXZvaWQgVElNRXhfRE1BQ29tbXV0YXRpb25IYWxmQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkgew0KLSAgVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0gPQ0KLSAgICAgIChUSU1fSGFuZGxlVHlwZURlZiAqKSgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50Ow0KLQ0KLSAgLyogQ2hhbmdlIHRoZSBodGltIHN0YXRlICovDQotICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7DQotDQotI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkNCi0gIGh0aW0tPkNvbW11dGF0aW9uSGFsZkNwbHRDYWxsYmFjayhodGltKTsNCi0jZWxzZQ0KLSAgSEFMX1RJTUV4X0NvbW11dEhhbGZDcGx0Q2FsbGJhY2soaHRpbSk7DQotI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFRJTSBETUEgRGVsYXkgUHVsc2UgY29tcGxldGUgY2FsbGJhY2sgKGNvbXBsZW1lbnRhcnkgY2hhbm5lbCkuDQotICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gRE1BIGhhbmRsZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1zdGF0aWMgdm9pZCBUSU1fRE1BRGVsYXlQdWxzZU5DcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKSB7DQotICBUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSA9DQotICAgICAgKFRJTV9IYW5kbGVUeXBlRGVmICopKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQ7DQotDQotICBpZiAoaGRtYSA9PSBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXSkgew0KLSAgICBodGltLT5DaGFubmVsID0gSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF8xOw0KLQ0KLSAgICBpZiAoaGRtYS0+SW5pdC5Nb2RlID09IERNQV9OT1JNQUwpIHsNCi0gICAgICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8xLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOw0KLSAgICB9DQotICB9IGVsc2UgaWYgKGhkbWEgPT0gaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0pIHsNCi0gICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfMjsNCi0NCi0gICAgaWYgKGhkbWEtPkluaXQuTW9kZSA9PSBETUFfTk9STUFMKSB7DQotICAgICAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMiwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsNCi0gICAgfQ0KLSAgfSBlbHNlIGlmIChoZG1hID09IGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdKSB7DQotICAgIGh0aW0tPkNoYW5uZWwgPSBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzM7DQotDQotICAgIGlmIChoZG1hLT5Jbml0Lk1vZGUgPT0gRE1BX05PUk1BTCkgew0KLSAgICAgIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzMsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7DQotICAgIH0NCi0gIH0gZWxzZSBpZiAoaGRtYSA9PSBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XSkgew0KLSAgICBodGltLT5DaGFubmVsID0gSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF80Ow0KLQ0KLSAgICBpZiAoaGRtYS0+SW5pdC5Nb2RlID09IERNQV9OT1JNQUwpIHsNCi0gICAgICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF80LCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOw0KLSAgICB9DQotICB9IGVsc2Ugew0KLSAgICAvKiBub3RoaW5nIHRvIGRvICovDQotICB9DQotDQotI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkNCi0gIGh0aW0tPlBXTV9QdWxzZUZpbmlzaGVkQ2FsbGJhY2soaHRpbSk7DQotI2Vsc2UNCi0gIEhBTF9USU1fUFdNX1B1bHNlRmluaXNoZWRDYWxsYmFjayhodGltKTsNCi0jZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotDQotICBodGltLT5DaGFubmVsID0gSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF9DTEVBUkVEOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFRJTSBETUEgZXJyb3IgY2FsbGJhY2sgKGNvbXBsZW1lbnRhcnkgY2hhbm5lbCkNCi0gKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBETUEgaGFuZGxlLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXN0YXRpYyB2b2lkIFRJTV9ETUFFcnJvckNDeE4oRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpIHsNCi0gIFRJTV9IYW5kbGVUeXBlRGVmICpodGltID0NCi0gICAgICAoVElNX0hhbmRsZVR5cGVEZWYgKikoKERNQV9IYW5kbGVUeXBlRGVmICopaGRtYSktPlBhcmVudDsNCi0NCi0gIGlmIChoZG1hID09IGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdKSB7DQotICAgIGh0aW0tPkNoYW5uZWwgPSBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzE7DQotICAgIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7DQotICB9IGVsc2UgaWYgKGhkbWEgPT0gaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0pIHsNCi0gICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfMjsNCi0gICAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMiwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsNCi0gIH0gZWxzZSBpZiAoaGRtYSA9PSBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXSkgew0KLSAgICBodGltLT5DaGFubmVsID0gSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF8zOw0KLSAgICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8zLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOw0KLSAgfSBlbHNlIHsNCi0gICAgLyogbm90aGluZyB0byBkbyAqLw0KLSAgfQ0KLQ0KLSNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpDQotICBodGltLT5FcnJvckNhbGxiYWNrKGh0aW0pOw0KLSNlbHNlDQotICBIQUxfVElNX0Vycm9yQ2FsbGJhY2soaHRpbSk7DQotI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLQ0KLSAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfQ0xFQVJFRDsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBUSU0gQ2FwdHVyZSBDb21wYXJlIENoYW5uZWwgeE4uDQotICogQHBhcmFtICBUSU14IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwNCi0gKiBAcGFyYW0gIENoYW5uZWwgc3BlY2lmaWVzIHRoZSBUSU0gQ2hhbm5lbA0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDENCi0gKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMg0KLSAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzDQotICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQNCi0gKiBAcGFyYW0gIENoYW5uZWxOU3RhdGUgc3BlY2lmaWVzIHRoZSBUSU0gQ2hhbm5lbCBDQ3hORSBiaXQgbmV3IHN0YXRlLg0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogVElNX0NDeE5fRU5BQkxFIG9yIFRJTV9DQ3hOX0Rpc2FibGUuDQotICogQHJldHZhbCBOb25lDQotICovDQotc3RhdGljIHZvaWQgVElNX0NDeE5DaGFubmVsQ21kKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDaGFubmVsLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsTlN0YXRlKSB7DQotICB1aW50MzJfdCB0bXA7DQotDQotICB0bXAgPSBUSU1fQ0NFUl9DQzFORSA8PCAoQ2hhbm5lbCAmIDB4MUZVKTsgLyogMHgxRlUgPSAzMSBiaXRzIG1heCBzaGlmdCAqLw0KLQ0KLSAgLyogUmVzZXQgdGhlIENDeE5FIEJpdCAqLw0KLSAgVElNeC0+Q0NFUiAmPSB+dG1wOw0KLQ0KLSAgLyogU2V0IG9yIHJlc2V0IHRoZSBDQ3hORSBCaXQgKi8NCi0gIFRJTXgtPkNDRVIgfD0NCi0gICAgICAodWludDMyX3QpKENoYW5uZWxOU3RhdGUNCi0gICAgICAgICAgICAgICAgIDw8IChDaGFubmVsICYgMHgxRlUpKTsgLyogMHgxRlUgPSAzMSBiaXRzIG1heCBzaGlmdCAqLw0KLX0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLSNlbmRpZiAvKiBIQUxfVElNX01PRFVMRV9FTkFCTEVEICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmc0eHhfaGFsX3RpbV9leC5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBUSU0gSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgVGltZXIgRXh0ZW5kZWQgcGVyaXBoZXJhbDoKKyAgKiAgICAgICAgICAgKyBUaW1lIEhhbGwgU2Vuc29yIEludGVyZmFjZSBJbml0aWFsaXphdGlvbgorICAqICAgICAgICAgICArIFRpbWUgSGFsbCBTZW5zb3IgSW50ZXJmYWNlIFN0YXJ0CisgICogICAgICAgICAgICsgVGltZSBDb21wbGVtZW50YXJ5IHNpZ25hbCBicmVhayBhbmQgZGVhZCB0aW1lIGNvbmZpZ3VyYXRpb24KKyAgKiAgICAgICAgICAgKyBUaW1lIE1hc3RlciBhbmQgU2xhdmUgc3luY2hyb25pemF0aW9uIGNvbmZpZ3VyYXRpb24KKyAgKiAgICAgICAgICAgKyBUaW1lIE91dHB1dCBDb21wYXJlL1BXTSBDaGFubmVsIENvbmZpZ3VyYXRpb24gKGZvciBjaGFubmVscyA1CisgIGFuZCA2KQorICAqICAgICAgICAgICArIFRpbWUgT0NSZWYgY2xlYXIgY29uZmlndXJhdGlvbgorICAqICAgICAgICAgICArIFRpbWVyIHJlbWFwcGluZyBjYXBhYmlsaXRpZXMgY29uZmlndXJhdGlvbgorICAqICAgICAgICAgICArIFRpbWVyIGVuY29kZXIgaW5kZXggY29uZmlndXJhdGlvbgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRlcm1zIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUKKyAgKiBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb2Z0d2FyZSBjb21wb25lbnQuCisgICogSWYgbm8gTElDRU5TRSBmaWxlIGNvbWVzIHdpdGggdGhpcyBzb2Z0d2FyZSwgaXQgaXMgcHJvdmlkZWQgQVMtSVMuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBUSU1FUiBFeHRlbmRlZCBmZWF0dXJlcyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgIFRoZSBUaW1lciBFeHRlbmRlZCBmZWF0dXJlcyBpbmNsdWRlOgorICAgICgjKSBDb21wbGVtZW50YXJ5IG91dHB1dHMgd2l0aCBwcm9ncmFtbWFibGUgZGVhZC10aW1lIGZvciA6CisgICAgICAgICgrKykgT3V0cHV0IENvbXBhcmUKKyAgICAgICAgKCsrKSBQV00gZ2VuZXJhdGlvbiAoRWRnZSBhbmQgQ2VudGVyLWFsaWduZWQgTW9kZSkKKyAgICAgICAgKCsrKSBPbmUtcHVsc2UgbW9kZSBvdXRwdXQKKyAgICAoIykgU3luY2hyb25pemF0aW9uIGNpcmN1aXQgdG8gY29udHJvbCB0aGUgdGltZXIgd2l0aCBleHRlcm5hbCBzaWduYWxzIGFuZAorICB0byBpbnRlcmNvbm5lY3Qgc2V2ZXJhbCB0aW1lcnMgdG9nZXRoZXIuCisgICAgKCMpIEJyZWFrIGlucHV0IHRvIHB1dCB0aGUgdGltZXIgb3V0cHV0IHNpZ25hbHMgaW4gcmVzZXQgc3RhdGUgb3IgaW4gYSBrbm93bgorICBzdGF0ZS4KKyAgICAoIykgU3VwcG9ydHMgaW5jcmVtZW50YWwgKHF1YWRyYXR1cmUpIGVuY29kZXIgYW5kIGhhbGwtc2Vuc29yIGNpcmN1aXRyeSBmb3IKKyAgICAgICAgcG9zaXRpb25pbmcgcHVycG9zZXMKKyAgICAoIykgSW4gY2FzZSBvZiBQdWxzZSBvbiBjb21wYXJlLCBjb25maWd1cmUgcHVsc2UgbGVuZ3RoIGFuZCBkZWxheQorICAgICgjKSBFbmNvZGVyIGluZGV4IGNvbmZpZ3VyYXRpb24KKworICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICgjKSBJbml0aWFsaXplIHRoZSBUSU0gbG93IGxldmVsIHJlc291cmNlcyBieSBpbXBsZW1lbnRpbmcgdGhlIGZvbGxvd2luZworICBmdW5jdGlvbnMgZGVwZW5kaW5nIG9uIHRoZSBzZWxlY3RlZCBmZWF0dXJlOgorICAgICAgICAgICAoKyspIEhhbGwgU2Vuc29yIG91dHB1dCA6IEhBTF9USU1FeF9IYWxsU2Vuc29yX01zcEluaXQoKQorCisgICAgICgjKSBJbml0aWFsaXplIHRoZSBUSU0gbG93IGxldmVsIHJlc291cmNlcyA6CisgICAgICAgICgjIykgRW5hYmxlIHRoZSBUSU0gaW50ZXJmYWNlIGNsb2NrIHVzaW5nIF9fSEFMX1JDQ19USU14X0NMS19FTkFCTEUoKTsKKyAgICAgICAgKCMjKSBUSU0gcGlucyBjb25maWd1cmF0aW9uCisgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIGNsb2NrIGZvciB0aGUgVElNIEdQSU9zIHVzaW5nIHRoZSBmb2xsb3dpbmcKKyAgZnVuY3Rpb246CisgICAgICAgICAgICAgIF9fSEFMX1JDQ19HUElPeF9DTEtfRU5BQkxFKCk7CisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlc2UgVElNIHBpbnMgaW4gQWx0ZXJuYXRlIGZ1bmN0aW9uIG1vZGUgdXNpbmcKKyAgSEFMX0dQSU9fSW5pdCgpOworCisgICAgICgjKSBUaGUgZXh0ZXJuYWwgQ2xvY2sgY2FuIGJlIGNvbmZpZ3VyZWQsIGlmIG5lZWRlZCAodGhlIGRlZmF1bHQgY2xvY2sgaXMKKyAgdGhlIGludGVybmFsIGNsb2NrIGZyb20gdGhlIEFQQngpLCB1c2luZyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uOgorICAgICAgICAgSEFMX1RJTV9Db25maWdDbG9ja1NvdXJjZSwgdGhlIGNsb2NrIGNvbmZpZ3VyYXRpb24gc2hvdWxkIGJlIGRvbmUKKyAgYmVmb3JlIGFueSBzdGFydCBmdW5jdGlvbi4KKworICAgICAoIykgQ29uZmlndXJlIHRoZSBUSU0gaW4gdGhlIGRlc2lyZWQgZnVuY3Rpb25pbmcgbW9kZSB1c2luZyBvbmUgb2YgdGhlCisgICAgICAgICBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBvZiB0aGlzIGRyaXZlcjoKKyAgICAgICAgICAoKyspIEhBTF9USU1FeF9IYWxsU2Vuc29yX0luaXQoKSBhbmQgSEFMX1RJTUV4X0NvbmZpZ0NvbW11dEV2ZW50KCk6IHRvCisgIHVzZSB0aGUgVGltZXIgSGFsbCBTZW5zb3IgSW50ZXJmYWNlIGFuZCB0aGUgY29tbXV0YXRpb24gZXZlbnQgd2l0aCB0aGUKKyAgY29ycmVzcG9uZGluZyBJbnRlcnJ1cHQgYW5kIERNQSByZXF1ZXN0IGlmIG5lZWRlZCAoTm90ZSB0aGF0IE9uZSBUaW1lciBpcyB1c2VkCisgIHRvIGludGVyZmFjZSB3aXRoIHRoZSBIYWxsIHNlbnNvciBJbnRlcmZhY2UgYW5kIGFub3RoZXIgVGltZXIgc2hvdWxkIGJlIHVzZWQKKyAgdG8gdXNlIHRoZSBjb21tdXRhdGlvbiBldmVudCkuCisgICAgICgjKSBJbiBjYXNlIG9mIFB1bHNlIE9uIENvbXBhcmU6CisgICAgICAgICAgICgrKykgSEFMX1RJTUV4X09DX0NvbmZpZ1B1bHNlT25Db21wYXJlKCk6IHRvIGNvbmZpZ3VyZSBwdWxzZSB3aWR0aAorICBhbmQgcHJlc2NhbGVyCisKKworICAgICAoIykgQWN0aXZhdGUgdGhlIFRJTSBwZXJpcGhlcmFsIHVzaW5nIG9uZSBvZiB0aGUgc3RhcnQgZnVuY3Rpb25zOgorICAgICAgICAgICAoKyspIENvbXBsZW1lbnRhcnkgT3V0cHV0IENvbXBhcmUgOiBIQUxfVElNRXhfT0NOX1N0YXJ0KCksCisgIEhBTF9USU1FeF9PQ05fU3RhcnRfRE1BKCksIEhBTF9USU1FeF9PQ05fU3RhcnRfSVQoKQorICAgICAgICAgICAoKyspIENvbXBsZW1lbnRhcnkgUFdNIGdlbmVyYXRpb24gOiBIQUxfVElNRXhfUFdNTl9TdGFydCgpLAorICBIQUxfVElNRXhfUFdNTl9TdGFydF9ETUEoKSwgSEFMX1RJTUV4X1BXTU5fU3RhcnRfSVQoKQorICAgICAgICAgICAoKyspIENvbXBsZW1lbnRhcnkgT25lLXB1bHNlIG1vZGUgb3V0cHV0IDoKKyAgSEFMX1RJTUV4X09uZVB1bHNlTl9TdGFydCgpLCBIQUxfVElNRXhfT25lUHVsc2VOX1N0YXJ0X0lUKCkKKyAgICAgICAgICAgKCsrKSBIYWxsIFNlbnNvciBvdXRwdXQgOiBIQUxfVElNRXhfSGFsbFNlbnNvcl9TdGFydCgpLAorICBIQUxfVElNRXhfSGFsbFNlbnNvcl9TdGFydF9ETUEoKSwgSEFMX1RJTUV4X0hhbGxTZW5zb3JfU3RhcnRfSVQoKS4KKworICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnNHh4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHNHh4X0hBTF9Ecml2ZXIKKyAqIEB7CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1FeCBUSU1FeAorICogQGJyaWVmIFRJTSBFeHRlbmRlZCBIQUwgbW9kdWxlIGRyaXZlcgorICogQHsKKyAqLworCisjaWZkZWYgSEFMX1RJTV9NT0RVTEVfRU5BQkxFRAorCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFRJTUV4X1ByaXZhdGVfQ29uc3RhbnRzIFRJTSBFeHRlbmRlZCBQcml2YXRlIENvbnN0YW50cworICogQHsKKyAqLworLyogVGltZW91dCBmb3IgYnJlYWsgaW5wdXQgcmVhcm0gKi8KKyNkZWZpbmUgVElNX0JSRUFLSU5QVVRfUkVBUk1fVElNRU9VVCA1VUwgLyogNSBtaWxsaXNlY29uZHMgKi8KKy8qKgorICogQH0KKyAqLworLyogRW5kIG9mIHByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHZvaWQgVElNX0RNQURlbGF5UHVsc2VOQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBUSU1fRE1BRXJyb3JDQ3hOKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIFRJTV9DQ3hOQ2hhbm5lbENtZChUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsTlN0YXRlKTsKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVElNRXhfRXhwb3J0ZWRfRnVuY3Rpb25zIFRJTSBFeHRlbmRlZCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAqIEB7CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1FeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEV4dGVuZGVkIFRpbWVyIEhhbGwgU2Vuc29yCitmdW5jdGlvbnMKKyAgKiBAYnJpZWYgICAgVGltZXIgSGFsbCBTZW5zb3IgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBUaW1lciBIYWxsIFNlbnNvciBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICgrKSBJbml0aWFsaXplIGFuZCBjb25maWd1cmUgVElNIEhBTCBTZW5zb3IuCisgICAgKCspIERlLWluaXRpYWxpemUgVElNIEhBTCBTZW5zb3IuCisgICAgKCspIFN0YXJ0IHRoZSBIYWxsIFNlbnNvciBJbnRlcmZhY2UuCisgICAgKCspIFN0b3AgdGhlIEhhbGwgU2Vuc29yIEludGVyZmFjZS4KKyAgICAoKykgU3RhcnQgdGhlIEhhbGwgU2Vuc29yIEludGVyZmFjZSBhbmQgZW5hYmxlIGludGVycnVwdHMuCisgICAgKCspIFN0b3AgdGhlIEhhbGwgU2Vuc29yIEludGVyZmFjZSBhbmQgZGlzYWJsZSBpbnRlcnJ1cHRzLgorICAgICgrKSBTdGFydCB0aGUgSGFsbCBTZW5zb3IgSW50ZXJmYWNlIGFuZCBlbmFibGUgRE1BIHRyYW5zZmVycy4KKyAgICAoKykgU3RvcCB0aGUgSGFsbCBTZW5zb3IgSW50ZXJmYWNlIGFuZCBkaXNhYmxlIERNQSB0cmFuc2ZlcnMuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisvKioKKyAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFRJTSBIYWxsIFNlbnNvciBJbnRlcmZhY2UgYW5kIGluaXRpYWxpemUgdGhlCisgKiBhc3NvY2lhdGVkIGhhbmRsZS4KKyAqIEBub3RlICAgV2hlbiB0aGUgdGltZXIgaW5zdGFuY2UgaXMgaW5pdGlhbGl6ZWQgaW4gSGFsbCBTZW5zb3IgSW50ZXJmYWNlIG1vZGUsCisgKiAgICAgICAgIHRpbWVyIGNoYW5uZWxzIDEgYW5kIGNoYW5uZWwgMiBhcmUgcmVzZXJ2ZWQgYW5kIGNhbm5vdCBiZSB1c2VkIGZvcgorICogICAgICAgICBvdGhlciBwdXJwb3NlLgorICogQHBhcmFtICBodGltIFRJTSBIYWxsIFNlbnNvciBJbnRlcmZhY2UgaGFuZGxlCisgKiBAcGFyYW0gIHNDb25maWcgVElNIEhhbGwgU2Vuc29yIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0hhbGxTZW5zb3JfSW5pdCgKKyAgICBUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgY29uc3QgVElNX0hhbGxTZW5zb3JfSW5pdFR5cGVEZWYgKnNDb25maWcpIHsKKyAgVElNX09DX0luaXRUeXBlRGVmIE9DX0NvbmZpZzsKKworICAvKiBDaGVjayB0aGUgVElNIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmIChodGltID09IE5VTEwpIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9IQUxMX1NFTlNPUl9JTlRFUkZBQ0VfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DT1VOVEVSX01PREUoaHRpbS0+SW5pdC5Db3VudGVyTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMT0NLRElWSVNJT05fRElWKGh0aW0tPkluaXQuQ2xvY2tEaXZpc2lvbikpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0FVVE9SRUxPQURfUFJFTE9BRChodGltLT5Jbml0LkF1dG9SZWxvYWRQcmVsb2FkKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fSUNfUE9MQVJJVFkoc0NvbmZpZy0+SUMxUG9sYXJpdHkpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9QRVJJT0QoaHRpbSwgaHRpbS0+SW5pdC5QZXJpb2QpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JQ19QUkVTQ0FMRVIoc0NvbmZpZy0+SUMxUHJlc2NhbGVyKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fSUNfRklMVEVSKHNDb25maWctPklDMUZpbHRlcikpOworCisgIGlmIChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX1JFU0VUKSB7CisgICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLworICAgIGh0aW0tPkxvY2sgPSBIQUxfVU5MT0NLRUQ7CisKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgLyogUmVzZXQgaW50ZXJydXB0IGNhbGxiYWNrcyB0byBsZWdhY3kgd2VlayBjYWxsYmFja3MgKi8KKyAgICBUSU1fUmVzZXRDYWxsYmFjayhodGltKTsKKworICAgIGlmIChodGltLT5IYWxsU2Vuc29yX01zcEluaXRDYWxsYmFjayA9PSBOVUxMKSB7CisgICAgICBodGltLT5IYWxsU2Vuc29yX01zcEluaXRDYWxsYmFjayA9IEhBTF9USU1FeF9IYWxsU2Vuc29yX01zcEluaXQ7CisgICAgfQorICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLLCBOVklDICovCisgICAgaHRpbS0+SGFsbFNlbnNvcl9Nc3BJbml0Q2FsbGJhY2soaHRpbSk7CisjZWxzZQorICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLLCBOVklDIGFuZCBETUEgKi8KKyAgICBIQUxfVElNRXhfSGFsbFNlbnNvcl9Nc3BJbml0KGh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisKKyAgLyogU2V0IHRoZSBUSU0gc3RhdGUgKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CisKKyAgLyogQ29uZmlndXJlIHRoZSBUaW1lIGJhc2UgaW4gdGhlIEVuY29kZXIgTW9kZSAqLworICBUSU1fQmFzZV9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsICZodGltLT5Jbml0KTsKKworICAvKiBDb25maWd1cmUgdGhlIENoYW5uZWwgMSBhcyBJbnB1dCBDaGFubmVsIHRvIGludGVyZmFjZSB3aXRoIHRoZSB0aHJlZQorICAgKiBPdXRwdXRzIG9mIHRoZSAgSGFsbCBzZW5zb3IgKi8KKyAgVElNX1RJMV9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsIHNDb25maWctPklDMVBvbGFyaXR5LCBUSU1fSUNTRUxFQ1RJT05fVFJDLAorICAgICAgICAgICAgICAgICAgICBzQ29uZmlnLT5JQzFGaWx0ZXIpOworCisgIC8qIFJlc2V0IHRoZSBJQzFQU0MgQml0cyAqLworICBodGltLT5JbnN0YW5jZS0+Q0NNUjEgJj0gflRJTV9DQ01SMV9JQzFQU0M7CisgIC8qIFNldCB0aGUgSUMxUFNDIHZhbHVlICovCisgIGh0aW0tPkluc3RhbmNlLT5DQ01SMSB8PSBzQ29uZmlnLT5JQzFQcmVzY2FsZXI7CisKKyAgLyogRW5hYmxlIHRoZSBIYWxsIHNlbnNvciBpbnRlcmZhY2UgKFhPUiBmdW5jdGlvbiBvZiB0aGUgdGhyZWUgaW5wdXRzKSAqLworICBodGltLT5JbnN0YW5jZS0+Q1IyIHw9IFRJTV9DUjJfVEkxUzsKKworICAvKiBTZWxlY3QgdGhlIFRJTV9UU19USTFGX0VEIHNpZ25hbCBhcyBJbnB1dCB0cmlnZ2VyIGZvciB0aGUgVElNICovCisgIGh0aW0tPkluc3RhbmNlLT5TTUNSICY9IH5USU1fU01DUl9UUzsKKyAgaHRpbS0+SW5zdGFuY2UtPlNNQ1IgfD0gVElNX1RTX1RJMUZfRUQ7CisKKyAgLyogVXNlIHRoZSBUSU1fVFNfVEkxRl9FRCBzaWduYWwgdG8gcmVzZXQgdGhlIFRJTSBjb3VudGVyIGVhY2ggZWRnZSBkZXRlY3Rpb24KKyAgICovCisgIGh0aW0tPkluc3RhbmNlLT5TTUNSICY9IH5USU1fU01DUl9TTVM7CisgIGh0aW0tPkluc3RhbmNlLT5TTUNSIHw9IFRJTV9TTEFWRU1PREVfUkVTRVQ7CisKKyAgLyogUHJvZ3JhbSBjaGFubmVsIDIgaW4gUFdNIDIgbW9kZSB3aXRoIHRoZSBkZXNpcmVkIENvbW11dGF0aW9uX0RlbGF5Ki8KKyAgT0NfQ29uZmlnLk9DRmFzdE1vZGUgPSBUSU1fT0NGQVNUX0RJU0FCTEU7CisgIE9DX0NvbmZpZy5PQ0lkbGVTdGF0ZSA9IFRJTV9PQ0lETEVTVEFURV9SRVNFVDsKKyAgT0NfQ29uZmlnLk9DTW9kZSA9IFRJTV9PQ01PREVfUFdNMjsKKyAgT0NfQ29uZmlnLk9DTklkbGVTdGF0ZSA9IFRJTV9PQ05JRExFU1RBVEVfUkVTRVQ7CisgIE9DX0NvbmZpZy5PQ05Qb2xhcml0eSA9IFRJTV9PQ05QT0xBUklUWV9ISUdIOworICBPQ19Db25maWcuT0NQb2xhcml0eSA9IFRJTV9PQ1BPTEFSSVRZX0hJR0g7CisgIE9DX0NvbmZpZy5QdWxzZSA9IHNDb25maWctPkNvbW11dGF0aW9uX0RlbGF5OworCisgIFRJTV9PQzJfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCAmT0NfQ29uZmlnKTsKKworICAvKiBTZWxlY3QgT0MyUkVGIGFzIHRyaWdnZXIgb3V0cHV0IG9uIFRSR086IHdyaXRlIHRoZSBNTVMgYml0cyBpbiB0aGUgVElNeF9DUjIKKyAgICByZWdpc3RlciB0byAxMDEgKi8KKyAgaHRpbS0+SW5zdGFuY2UtPkNSMiAmPSB+VElNX0NSMl9NTVM7CisgIGh0aW0tPkluc3RhbmNlLT5DUjIgfD0gVElNX1RSR09fT0MyUkVGOworCisgIC8qIEluaXRpYWxpemUgdGhlIERNQSBidXJzdCBvcGVyYXRpb24gc3RhdGUgKi8KKyAgaHRpbS0+RE1BQnVyc3RTdGF0ZSA9IEhBTF9ETUFfQlVSU1RfU1RBVEVfUkVBRFk7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgVElNIGNoYW5uZWxzIHN0YXRlICovCisgIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8xLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOworICBUSU1fQ0hBTk5FTF9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMiwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsKKyAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMSwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsKKyAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMiwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsKKworICAvKiBJbml0aWFsaXplIHRoZSBUSU0gc3RhdGUqLworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZXMgdGhlIFRJTSBIYWxsIFNlbnNvciBpbnRlcmZhY2UKKyAqIEBwYXJhbSAgaHRpbSBUSU0gSGFsbCBTZW5zb3IgSW50ZXJmYWNlIGhhbmRsZQorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9IYWxsU2Vuc29yX0RlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkgeworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgVElNIFBlcmlwaGVyYWwgQ2xvY2sgKi8KKyAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7CisKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIGlmIChodGltLT5IYWxsU2Vuc29yX01zcERlSW5pdENhbGxiYWNrID09IE5VTEwpIHsKKyAgICBodGltLT5IYWxsU2Vuc29yX01zcERlSW5pdENhbGxiYWNrID0gSEFMX1RJTUV4X0hhbGxTZW5zb3JfTXNwRGVJbml0OworICB9CisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgIGh0aW0tPkhhbGxTZW5zb3JfTXNwRGVJbml0Q2FsbGJhY2soaHRpbSk7CisjZWxzZQorICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZTogR1BJTywgQ0xPQ0ssIE5WSUMgKi8KKyAgSEFMX1RJTUV4X0hhbGxTZW5zb3JfTXNwRGVJbml0KGh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisgIC8qIENoYW5nZSB0aGUgRE1BIGJ1cnN0IG9wZXJhdGlvbiBzdGF0ZSAqLworICBodGltLT5ETUFCdXJzdFN0YXRlID0gSEFMX0RNQV9CVVJTVF9TVEFURV9SRVNFVDsKKworICAvKiBDaGFuZ2UgdGhlIFRJTSBjaGFubmVscyBzdGF0ZSAqLworICBUSU1fQ0hBTk5FTF9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMSwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFU0VUKTsKKyAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRVNFVCk7CisgIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRVNFVCk7CisgIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRVNFVCk7CisKKyAgLyogQ2hhbmdlIFRJTSBzdGF0ZSAqLworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVTRVQ7CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhodGltKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFRJTSBIYWxsIFNlbnNvciBNU1AuCisgKiBAcGFyYW0gIGh0aW0gVElNIEhhbGwgU2Vuc29yIEludGVyZmFjZSBoYW5kbGUKKyAqIEByZXR2YWwgTm9uZQorICovCitfX3dlYWsgdm9pZCBIQUxfVElNRXhfSGFsbFNlbnNvcl9Nc3BJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKSB7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh0aW0pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVElNRXhfSGFsbFNlbnNvcl9Nc3BJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyCisgICAgIGZpbGUKKyAgICovCit9CisKKy8qKgorICogQGJyaWVmICBEZUluaXRpYWxpemVzIFRJTSBIYWxsIFNlbnNvciBNU1AuCisgKiBAcGFyYW0gIGh0aW0gVElNIEhhbGwgU2Vuc29yIEludGVyZmFjZSBoYW5kbGUKKyAqIEByZXR2YWwgTm9uZQorICovCitfX3dlYWsgdm9pZCBIQUxfVElNRXhfSGFsbFNlbnNvcl9Nc3BEZUluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pIHsKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHRpbSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9USU1FeF9IYWxsU2Vuc29yX01zcERlSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlcgorICAgICBmaWxlCisgICAqLworfQorCisvKioKKyAqIEBicmllZiAgU3RhcnRzIHRoZSBUSU0gSGFsbCBTZW5zb3IgSW50ZXJmYWNlLgorICogQHBhcmFtICBodGltIFRJTSBIYWxsIFNlbnNvciBJbnRlcmZhY2UgaGFuZGxlCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0hhbGxTZW5zb3JfU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pIHsKKyAgdWludDMyX3QgdG1wc21jcjsKKyAgSEFMX1RJTV9DaGFubmVsU3RhdGVUeXBlRGVmIGNoYW5uZWxfMV9zdGF0ZSA9CisgICAgICBUSU1fQ0hBTk5FTF9TVEFURV9HRVQoaHRpbSwgVElNX0NIQU5ORUxfMSk7CisgIEhBTF9USU1fQ2hhbm5lbFN0YXRlVHlwZURlZiBjaGFubmVsXzJfc3RhdGUgPQorICAgICAgVElNX0NIQU5ORUxfU1RBVEVfR0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIpOworICBIQUxfVElNX0NoYW5uZWxTdGF0ZVR5cGVEZWYgY29tcGxlbWVudGFyeV9jaGFubmVsXzFfc3RhdGUgPQorICAgICAgVElNX0NIQU5ORUxfTl9TVEFURV9HRVQoaHRpbSwgVElNX0NIQU5ORUxfMSk7CisgIEhBTF9USU1fQ2hhbm5lbFN0YXRlVHlwZURlZiBjb21wbGVtZW50YXJ5X2NoYW5uZWxfMl9zdGF0ZSA9CisgICAgICBUSU1fQ0hBTk5FTF9OX1NUQVRFX0dFVChodGltLCBUSU1fQ0hBTk5FTF8yKTsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0hBTExfU0VOU09SX0lOVEVSRkFDRV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgIC8qIENoZWNrIHRoZSBUSU0gY2hhbm5lbHMgc3RhdGUgKi8KKyAgaWYgKChjaGFubmVsXzFfc3RhdGUgIT0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKSB8fAorICAgICAgKGNoYW5uZWxfMl9zdGF0ZSAhPSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpIHx8CisgICAgICAoY29tcGxlbWVudGFyeV9jaGFubmVsXzFfc3RhdGUgIT0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKSB8fAorICAgICAgKGNvbXBsZW1lbnRhcnlfY2hhbm5lbF8yX3N0YXRlICE9IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSkpIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogU2V0IHRoZSBUSU0gY2hhbm5lbHMgc3RhdGUgKi8KKyAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKTsKKyAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKTsKKyAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMSwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX0JVU1kpOworICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8yLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSk7CisKKyAgLyogRW5hYmxlIHRoZSBJbnB1dCBDYXB0dXJlIGNoYW5uZWwgMQorICAoaW4gdGhlIEhhbGwgU2Vuc29yIEludGVyZmFjZSB0aGUgdGhyZWUgcG9zc2libGUgY2hhbm5lbHMgdGhhdCBjYW4gYmUgdXNlZCBhcmUKKyAgVElNX0NIQU5ORUxfMSwgVElNX0NIQU5ORUxfMiBhbmQgVElNX0NIQU5ORUxfMykgKi8KKyAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzEsIFRJTV9DQ3hfRU5BQkxFKTsKKworICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwsIGV4Y2VwdCBpbiB0cmlnZ2VyIG1vZGUgd2hlcmUgZW5hYmxlIGlzIGF1dG9tYXRpY2FsbHkKKyAgICogZG9uZSB3aXRoIHRyaWdnZXIgKi8KKyAgaWYgKElTX1RJTV9TTEFWRV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpIHsKKyAgICB0bXBzbWNyID0gaHRpbS0+SW5zdGFuY2UtPlNNQ1IgJiBUSU1fU01DUl9TTVM7CisgICAgaWYgKCFJU19USU1fU0xBVkVNT0RFX1RSSUdHRVJfRU5BQkxFRCh0bXBzbWNyKSkgeworICAgICAgX19IQUxfVElNX0VOQUJMRShodGltKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgX19IQUxfVElNX0VOQUJMRShodGltKTsKKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgIFN0b3BzIHRoZSBUSU0gSGFsbCBzZW5zb3IgSW50ZXJmYWNlLgorICogQHBhcmFtICBodGltIFRJTSBIYWxsIFNlbnNvciBJbnRlcmZhY2UgaGFuZGxlCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0hhbGxTZW5zb3JfU3RvcChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkgeworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0hBTExfU0VOU09SX0lOVEVSRkFDRV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgIC8qIERpc2FibGUgdGhlIElucHV0IENhcHR1cmUgY2hhbm5lbHMgMSwgMiBhbmQgMworICAoaW4gdGhlIEhhbGwgU2Vuc29yIEludGVyZmFjZSB0aGUgdGhyZWUgcG9zc2libGUgY2hhbm5lbHMgdGhhdCBjYW4gYmUgdXNlZCBhcmUKKyAgVElNX0NIQU5ORUxfMSwgVElNX0NIQU5ORUxfMiBhbmQgVElNX0NIQU5ORUxfMykgKi8KKyAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzEsIFRJTV9DQ3hfRElTQUJMRSk7CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9USU1fRElTQUJMRShodGltKTsKKworICAvKiBTZXQgdGhlIFRJTSBjaGFubmVscyBzdGF0ZSAqLworICBUSU1fQ0hBTk5FTF9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMSwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsKKyAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7CisgIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7CisgIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiAgU3RhcnRzIHRoZSBUSU0gSGFsbCBTZW5zb3IgSW50ZXJmYWNlIGluIGludGVycnVwdCBtb2RlLgorICogQHBhcmFtICBodGltIFRJTSBIYWxsIFNlbnNvciBJbnRlcmZhY2UgaGFuZGxlCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0hhbGxTZW5zb3JfU3RhcnRfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pIHsKKyAgdWludDMyX3QgdG1wc21jcjsKKyAgSEFMX1RJTV9DaGFubmVsU3RhdGVUeXBlRGVmIGNoYW5uZWxfMV9zdGF0ZSA9CisgICAgICBUSU1fQ0hBTk5FTF9TVEFURV9HRVQoaHRpbSwgVElNX0NIQU5ORUxfMSk7CisgIEhBTF9USU1fQ2hhbm5lbFN0YXRlVHlwZURlZiBjaGFubmVsXzJfc3RhdGUgPQorICAgICAgVElNX0NIQU5ORUxfU1RBVEVfR0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIpOworICBIQUxfVElNX0NoYW5uZWxTdGF0ZVR5cGVEZWYgY29tcGxlbWVudGFyeV9jaGFubmVsXzFfc3RhdGUgPQorICAgICAgVElNX0NIQU5ORUxfTl9TVEFURV9HRVQoaHRpbSwgVElNX0NIQU5ORUxfMSk7CisgIEhBTF9USU1fQ2hhbm5lbFN0YXRlVHlwZURlZiBjb21wbGVtZW50YXJ5X2NoYW5uZWxfMl9zdGF0ZSA9CisgICAgICBUSU1fQ0hBTk5FTF9OX1NUQVRFX0dFVChodGltLCBUSU1fQ0hBTk5FTF8yKTsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0hBTExfU0VOU09SX0lOVEVSRkFDRV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgIC8qIENoZWNrIHRoZSBUSU0gY2hhbm5lbHMgc3RhdGUgKi8KKyAgaWYgKChjaGFubmVsXzFfc3RhdGUgIT0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKSB8fAorICAgICAgKGNoYW5uZWxfMl9zdGF0ZSAhPSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpIHx8CisgICAgICAoY29tcGxlbWVudGFyeV9jaGFubmVsXzFfc3RhdGUgIT0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKSB8fAorICAgICAgKGNvbXBsZW1lbnRhcnlfY2hhbm5lbF8yX3N0YXRlICE9IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSkpIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogU2V0IHRoZSBUSU0gY2hhbm5lbHMgc3RhdGUgKi8KKyAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKTsKKyAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKTsKKyAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMSwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX0JVU1kpOworICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8yLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSk7CisKKyAgLyogRW5hYmxlIHRoZSBjYXB0dXJlIGNvbXBhcmUgSW50ZXJydXB0cyAxIGV2ZW50ICovCisgIF9fSEFMX1RJTV9FTkFCTEVfSVQoaHRpbSwgVElNX0lUX0NDMSk7CisKKyAgLyogRW5hYmxlIHRoZSBJbnB1dCBDYXB0dXJlIGNoYW5uZWwgMQorICAoaW4gdGhlIEhhbGwgU2Vuc29yIEludGVyZmFjZSB0aGUgdGhyZWUgcG9zc2libGUgY2hhbm5lbHMgdGhhdCBjYW4gYmUgdXNlZCBhcmUKKyAgVElNX0NIQU5ORUxfMSwgVElNX0NIQU5ORUxfMiBhbmQgVElNX0NIQU5ORUxfMykgKi8KKyAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzEsIFRJTV9DQ3hfRU5BQkxFKTsKKworICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwsIGV4Y2VwdCBpbiB0cmlnZ2VyIG1vZGUgd2hlcmUgZW5hYmxlIGlzIGF1dG9tYXRpY2FsbHkKKyAgICogZG9uZSB3aXRoIHRyaWdnZXIgKi8KKyAgaWYgKElTX1RJTV9TTEFWRV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpIHsKKyAgICB0bXBzbWNyID0gaHRpbS0+SW5zdGFuY2UtPlNNQ1IgJiBUSU1fU01DUl9TTVM7CisgICAgaWYgKCFJU19USU1fU0xBVkVNT0RFX1RSSUdHRVJfRU5BQkxFRCh0bXBzbWNyKSkgeworICAgICAgX19IQUxfVElNX0VOQUJMRShodGltKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgX19IQUxfVElNX0VOQUJMRShodGltKTsKKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgIFN0b3BzIHRoZSBUSU0gSGFsbCBTZW5zb3IgSW50ZXJmYWNlIGluIGludGVycnVwdCBtb2RlLgorICogQHBhcmFtICBodGltIFRJTSBIYWxsIFNlbnNvciBJbnRlcmZhY2UgaGFuZGxlCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0hhbGxTZW5zb3JfU3RvcF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkgeworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0hBTExfU0VOU09SX0lOVEVSRkFDRV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgIC8qIERpc2FibGUgdGhlIElucHV0IENhcHR1cmUgY2hhbm5lbCAxCisgIChpbiB0aGUgSGFsbCBTZW5zb3IgSW50ZXJmYWNlIHRoZSB0aHJlZSBwb3NzaWJsZSBjaGFubmVscyB0aGF0IGNhbiBiZSB1c2VkIGFyZQorICBUSU1fQ0hBTk5FTF8xLCBUSU1fQ0hBTk5FTF8yIGFuZCBUSU1fQ0hBTk5FTF8zKSAqLworICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMSwgVElNX0NDeF9ESVNBQkxFKTsKKworICAvKiBEaXNhYmxlIHRoZSBjYXB0dXJlIGNvbXBhcmUgSW50ZXJydXB0cyBldmVudCAqLworICBfX0hBTF9USU1fRElTQUJMRV9JVChodGltLCBUSU1fSVRfQ0MxKTsKKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisgIC8qIFNldCB0aGUgVElNIGNoYW5uZWxzIHN0YXRlICovCisgIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8xLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOworICBUSU1fQ0hBTk5FTF9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMiwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsKKyAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMSwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsKKyAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMiwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICogQGJyaWVmICBTdGFydHMgdGhlIFRJTSBIYWxsIFNlbnNvciBJbnRlcmZhY2UgaW4gRE1BIG1vZGUuCisgKiBAcGFyYW0gIGh0aW0gVElNIEhhbGwgU2Vuc29yIEludGVyZmFjZSBoYW5kbGUKKyAqIEBwYXJhbSAgcERhdGEgVGhlIGRlc3RpbmF0aW9uIEJ1ZmZlciBhZGRyZXNzLgorICogQHBhcmFtICBMZW5ndGggVGhlIGxlbmd0aCBvZiBkYXRhIHRvIGJlIHRyYW5zZmVycmVkIGZyb20gVElNIHBlcmlwaGVyYWwgdG8KKyAqIG1lbW9yeS4KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfSGFsbFNlbnNvcl9TdGFydF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IExlbmd0aCkgeworICB1aW50MzJfdCB0bXBzbWNyOworICBIQUxfVElNX0NoYW5uZWxTdGF0ZVR5cGVEZWYgY2hhbm5lbF8xX3N0YXRlID0KKyAgICAgIFRJTV9DSEFOTkVMX1NUQVRFX0dFVChodGltLCBUSU1fQ0hBTk5FTF8xKTsKKyAgSEFMX1RJTV9DaGFubmVsU3RhdGVUeXBlRGVmIGNvbXBsZW1lbnRhcnlfY2hhbm5lbF8xX3N0YXRlID0KKyAgICAgIFRJTV9DSEFOTkVMX05fU1RBVEVfR0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEpOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fSEFMTF9TRU5TT1JfSU5URVJGQUNFX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgLyogU2V0IHRoZSBUSU0gY2hhbm5lbCBzdGF0ZSAqLworICBpZiAoKGNoYW5uZWxfMV9zdGF0ZSA9PSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSkgfHwKKyAgICAgIChjb21wbGVtZW50YXJ5X2NoYW5uZWxfMV9zdGF0ZSA9PSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSkpIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0gZWxzZSBpZiAoKGNoYW5uZWxfMV9zdGF0ZSA9PSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpICYmCisgICAgICAgICAgICAgKGNvbXBsZW1lbnRhcnlfY2hhbm5lbF8xX3N0YXRlID09IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSkpIHsKKyAgICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChMZW5ndGggPT0gMFUpKSB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0gZWxzZSB7CisgICAgICBUSU1fQ0hBTk5FTF9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMSwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX0JVU1kpOworICAgICAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMSwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX0JVU1kpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogRW5hYmxlIHRoZSBJbnB1dCBDYXB0dXJlIGNoYW5uZWwgMQorICAoaW4gdGhlIEhhbGwgU2Vuc29yIEludGVyZmFjZSB0aGUgdGhyZWUgcG9zc2libGUgY2hhbm5lbHMgdGhhdCBjYW4gYmUgdXNlZCBhcmUKKyAgVElNX0NIQU5ORUxfMSwgVElNX0NIQU5ORUxfMiBhbmQgVElNX0NIQU5ORUxfMykgKi8KKyAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzEsIFRJTV9DQ3hfRU5BQkxFKTsKKworICAvKiBTZXQgdGhlIERNQSBJbnB1dCBDYXB0dXJlIDEgQ2FsbGJhY2tzICovCisgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQUNhcHR1cmVDcGx0OworICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BQ2FwdHVyZUhhbGZDcGx0OworICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3I7CisKKyAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCBmb3IgQ2FwdHVyZSAxKi8KKyAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0sCisgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkNDUjEsICh1aW50MzJfdClwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgTGVuZ3RoKSAhPSBIQUxfT0spIHsKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICAvKiBFbmFibGUgdGhlIGNhcHR1cmUgY29tcGFyZSAxIEludGVycnVwdCAqLworICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMSk7CisKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsLCBleGNlcHQgaW4gdHJpZ2dlciBtb2RlIHdoZXJlIGVuYWJsZSBpcyBhdXRvbWF0aWNhbGx5CisgICAqIGRvbmUgd2l0aCB0cmlnZ2VyICovCisgIGlmIChJU19USU1fU0xBVkVfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKSB7CisgICAgdG1wc21jciA9IGh0aW0tPkluc3RhbmNlLT5TTUNSICYgVElNX1NNQ1JfU01TOworICAgIGlmICghSVNfVElNX1NMQVZFTU9ERV9UUklHR0VSX0VOQUJMRUQodG1wc21jcikpIHsKKyAgICAgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7CisgICAgfQorICB9IGVsc2UgeworICAgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7CisgIH0KKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICogQGJyaWVmICBTdG9wcyB0aGUgVElNIEhhbGwgU2Vuc29yIEludGVyZmFjZSBpbiBETUEgbW9kZS4KKyAqIEBwYXJhbSAgaHRpbSBUSU0gSGFsbCBTZW5zb3IgSW50ZXJmYWNlIGhhbmRsZQorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9IYWxsU2Vuc29yX1N0b3BfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKSB7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fSEFMTF9TRU5TT1JfSU5URVJGQUNFX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgLyogRGlzYWJsZSB0aGUgSW5wdXQgQ2FwdHVyZSBjaGFubmVsIDEKKyAgKGluIHRoZSBIYWxsIFNlbnNvciBJbnRlcmZhY2UgdGhlIHRocmVlIHBvc3NpYmxlIGNoYW5uZWxzIHRoYXQgY2FuIGJlIHVzZWQgYXJlCisgIFRJTV9DSEFOTkVMXzEsIFRJTV9DSEFOTkVMXzIgYW5kIFRJTV9DSEFOTkVMXzMpICovCisgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8xLCBUSU1fQ0N4X0RJU0FCTEUpOworCisgIC8qIERpc2FibGUgdGhlIGNhcHR1cmUgY29tcGFyZSBJbnRlcnJ1cHRzIDEgZXZlbnQgKi8KKyAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MxKTsKKworICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdKTsKKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisgIC8qIFNldCB0aGUgVElNIGNoYW5uZWwgc3RhdGUgKi8KKyAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7CisgIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1FeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIEV4dGVuZGVkIFRpbWVyIENvbXBsZW1lbnRhcnkKK091dHB1dCBDb21wYXJlIGZ1bmN0aW9ucworICAqICBAYnJpZWYgICBUaW1lciBDb21wbGVtZW50YXJ5IE91dHB1dCBDb21wYXJlIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICMjIyMjIFRpbWVyIENvbXBsZW1lbnRhcnkgT3V0cHV0IENvbXBhcmUgZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAoKykgU3RhcnQgdGhlIENvbXBsZW1lbnRhcnkgT3V0cHV0IENvbXBhcmUvUFdNLgorICAgICgrKSBTdG9wIHRoZSBDb21wbGVtZW50YXJ5IE91dHB1dCBDb21wYXJlL1BXTS4KKyAgICAoKykgU3RhcnQgdGhlIENvbXBsZW1lbnRhcnkgT3V0cHV0IENvbXBhcmUvUFdNIGFuZCBlbmFibGUgaW50ZXJydXB0cy4KKyAgICAoKykgU3RvcCB0aGUgQ29tcGxlbWVudGFyeSBPdXRwdXQgQ29tcGFyZS9QV00gYW5kIGRpc2FibGUgaW50ZXJydXB0cy4KKyAgICAoKykgU3RhcnQgdGhlIENvbXBsZW1lbnRhcnkgT3V0cHV0IENvbXBhcmUvUFdNIGFuZCBlbmFibGUgRE1BIHRyYW5zZmVycy4KKyAgICAoKykgU3RvcCB0aGUgQ29tcGxlbWVudGFyeSBPdXRwdXQgQ29tcGFyZS9QV00gYW5kIGRpc2FibGUgRE1BIHRyYW5zZmVycy4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgVElNIE91dHB1dCBDb21wYXJlIHNpZ25hbCBnZW5lcmF0aW9uIG9uIHRoZSBjb21wbGVtZW50YXJ5CisgKiAgICAgICAgIG91dHB1dC4KKyAqIEBwYXJhbSAgaHRpbSBUSU0gT3V0cHV0IENvbXBhcmUgaGFuZGxlCisgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWwgdG8gYmUgZW5hYmxlZAorICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X09DTl9TdGFydChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCkgeworICB1aW50MzJfdCB0bXBzbWNyOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYTl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOworCisgIC8qIENoZWNrIHRoZSBUSU0gY29tcGxlbWVudGFyeSBjaGFubmVsIHN0YXRlICovCisgIGlmIChUSU1fQ0hBTk5FTF9OX1NUQVRFX0dFVChodGltLCBDaGFubmVsKSAhPSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogU2V0IHRoZSBUSU0gY29tcGxlbWVudGFyeSBjaGFubmVsIHN0YXRlICovCisgIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIENoYW5uZWwsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKTsKKworICAvKiBFbmFibGUgdGhlIENhcHR1cmUgY29tcGFyZSBjaGFubmVsIE4gKi8KKyAgVElNX0NDeE5DaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4Tl9FTkFCTEUpOworCisgIC8qIEVuYWJsZSB0aGUgTWFpbiBPdXRwdXQgKi8KKyAgX19IQUxfVElNX01PRV9FTkFCTEUoaHRpbSk7CisKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsLCBleGNlcHQgaW4gdHJpZ2dlciBtb2RlIHdoZXJlIGVuYWJsZSBpcyBhdXRvbWF0aWNhbGx5CisgICAqIGRvbmUgd2l0aCB0cmlnZ2VyICovCisgIGlmIChJU19USU1fU0xBVkVfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKSB7CisgICAgdG1wc21jciA9IGh0aW0tPkluc3RhbmNlLT5TTUNSICYgVElNX1NNQ1JfU01TOworICAgIGlmICghSVNfVElNX1NMQVZFTU9ERV9UUklHR0VSX0VOQUJMRUQodG1wc21jcikpIHsKKyAgICAgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7CisgICAgfQorICB9IGVsc2UgeworICAgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7CisgIH0KKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICogQGJyaWVmICBTdG9wcyB0aGUgVElNIE91dHB1dCBDb21wYXJlIHNpZ25hbCBnZW5lcmF0aW9uIG9uIHRoZSBjb21wbGVtZW50YXJ5CisgKiAgICAgICAgIG91dHB1dC4KKyAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWwgdG8gYmUgZGlzYWJsZWQKKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZAorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9PQ05fU3RvcChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKSB7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYTl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOworCisgIC8qIERpc2FibGUgdGhlIENhcHR1cmUgY29tcGFyZSBjaGFubmVsIE4gKi8KKyAgVElNX0NDeE5DaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4Tl9ESVNBQkxFKTsKKworICAvKiBEaXNhYmxlIHRoZSBNYWluIE91dHB1dCAqLworICBfX0hBTF9USU1fTU9FX0RJU0FCTEUoaHRpbSk7CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9USU1fRElTQUJMRShodGltKTsKKworICAvKiBTZXQgdGhlIFRJTSBjb21wbGVtZW50YXJ5IGNoYW5uZWwgc3RhdGUgKi8KKyAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgQ2hhbm5lbCwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICogQGJyaWVmICBTdGFydHMgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBzaWduYWwgZ2VuZXJhdGlvbiBpbiBpbnRlcnJ1cHQgbW9kZQorICogICAgICAgICBvbiB0aGUgY29tcGxlbWVudGFyeSBvdXRwdXQuCisgKiBAcGFyYW0gIGh0aW0gVElNIE9DIGhhbmRsZQorICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVsIHRvIGJlIGVuYWJsZWQKKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZAorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9PQ05fU3RhcnRfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpIHsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworICB1aW50MzJfdCB0bXBzbWNyOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYTl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOworCisgIC8qIENoZWNrIHRoZSBUSU0gY29tcGxlbWVudGFyeSBjaGFubmVsIHN0YXRlICovCisgIGlmIChUSU1fQ0hBTk5FTF9OX1NUQVRFX0dFVChodGltLCBDaGFubmVsKSAhPSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogU2V0IHRoZSBUSU0gY29tcGxlbWVudGFyeSBjaGFubmVsIHN0YXRlICovCisgIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIENoYW5uZWwsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKTsKKworICBzd2l0Y2ggKENoYW5uZWwpIHsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzE6IHsKKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIE91dHB1dCBDb21wYXJlIGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9JVChodGltLCBUSU1fSVRfQ0MxKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMjogeworICAgICAgLyogRW5hYmxlIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzIpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8zOiB7CisgICAgICAvKiBFbmFibGUgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfSVQoaHRpbSwgVElNX0lUX0NDMyk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzQ6IHsKKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIE91dHB1dCBDb21wYXJlIGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9JVChodGltLCBUSU1fSVRfQ0M0KTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICBicmVhazsKKyAgfQorCisgIGlmIChzdGF0dXMgPT0gSEFMX09LKSB7CisgICAgLyogRW5hYmxlIHRoZSBUSU0gQnJlYWsgaW50ZXJydXB0ICovCisgICAgX19IQUxfVElNX0VOQUJMRV9JVChodGltLCBUSU1fSVRfQlJFQUspOworCisgICAgLyogRW5hYmxlIHRoZSBDYXB0dXJlIGNvbXBhcmUgY2hhbm5lbCBOICovCisgICAgVElNX0NDeE5DaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4Tl9FTkFCTEUpOworCisgICAgLyogRW5hYmxlIHRoZSBNYWluIE91dHB1dCAqLworICAgIF9fSEFMX1RJTV9NT0VfRU5BQkxFKGh0aW0pOworCisgICAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsLCBleGNlcHQgaW4gdHJpZ2dlciBtb2RlIHdoZXJlIGVuYWJsZSBpcworICAgICAqIGF1dG9tYXRpY2FsbHkgZG9uZSB3aXRoIHRyaWdnZXIgKi8KKyAgICBpZiAoSVNfVElNX1NMQVZFX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSkgeworICAgICAgdG1wc21jciA9IGh0aW0tPkluc3RhbmNlLT5TTUNSICYgVElNX1NNQ1JfU01TOworICAgICAgaWYgKCFJU19USU1fU0xBVkVNT0RFX1RSSUdHRVJfRU5BQkxFRCh0bXBzbWNyKSkgeworICAgICAgICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOworICAgIH0KKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBAYnJpZWYgIFN0b3BzIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgc2lnbmFsIGdlbmVyYXRpb24gaW4gaW50ZXJydXB0IG1vZGUKKyAqICAgICAgICAgb24gdGhlIGNvbXBsZW1lbnRhcnkgb3V0cHV0LgorICogQHBhcmFtICBodGltIFRJTSBPdXRwdXQgQ29tcGFyZSBoYW5kbGUKKyAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbCB0byBiZSBkaXNhYmxlZAorICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X09DTl9TdG9wX0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpIHsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworICB1aW50MzJfdCB0bXBjY2VyOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYTl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOworCisgIHN3aXRjaCAoQ2hhbm5lbCkgeworICAgIGNhc2UgVElNX0NIQU5ORUxfMTogeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIE91dHB1dCBDb21wYXJlIGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDMSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzI6IHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzIpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8zOiB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9JVChodGltLCBUSU1fSVRfQ0MzKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfNDogeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIE91dHB1dCBDb21wYXJlIGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDNCk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgICAgYnJlYWs7CisgIH0KKworICBpZiAoc3RhdHVzID09IEhBTF9PSykgeworICAgIC8qIERpc2FibGUgdGhlIENhcHR1cmUgY29tcGFyZSBjaGFubmVsIE4gKi8KKyAgICBUSU1fQ0N4TkNoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hOX0RJU0FCTEUpOworCisgICAgLyogRGlzYWJsZSB0aGUgVElNIEJyZWFrIGludGVycnVwdCAob25seSBpZiBubyBtb3JlIGNoYW5uZWwgaXMgYWN0aXZlKSAqLworICAgIHRtcGNjZXIgPSBodGltLT5JbnN0YW5jZS0+Q0NFUjsKKyAgICBpZiAoKHRtcGNjZXIgJiBUSU1fQ0NFUl9DQ3hORV9NQVNLKSA9PSAodWludDMyX3QpUkVTRVQpIHsKKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9CUkVBSyk7CisgICAgfQorCisgICAgLyogRGlzYWJsZSB0aGUgTWFpbiBPdXRwdXQgKi8KKyAgICBfX0hBTF9USU1fTU9FX0RJU0FCTEUoaHRpbSk7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgICAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7CisKKyAgICAvKiBTZXQgdGhlIFRJTSBjb21wbGVtZW50YXJ5IGNoYW5uZWwgc3RhdGUgKi8KKyAgICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBDaGFubmVsLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOworICB9CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIEBicmllZiAgU3RhcnRzIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgc2lnbmFsIGdlbmVyYXRpb24gaW4gRE1BIG1vZGUKKyAqICAgICAgICAgb24gdGhlIGNvbXBsZW1lbnRhcnkgb3V0cHV0LgorICogQHBhcmFtICBodGltIFRJTSBPdXRwdXQgQ29tcGFyZSBoYW5kbGUKKyAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbCB0byBiZSBlbmFibGVkCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAqIEBwYXJhbSAgcERhdGEgVGhlIHNvdXJjZSBCdWZmZXIgYWRkcmVzcy4KKyAqIEBwYXJhbSAgTGVuZ3RoIFRoZSBsZW5ndGggb2YgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZCBmcm9tIG1lbW9yeSB0byBUSU0KKyAqIHBlcmlwaGVyYWwKKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfT0NOX1N0YXJ0X0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCAqcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBMZW5ndGgpIHsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworICB1aW50MzJfdCB0bXBzbWNyOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYTl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOworCisgIC8qIFNldCB0aGUgVElNIGNvbXBsZW1lbnRhcnkgY2hhbm5lbCBzdGF0ZSAqLworICBpZiAoVElNX0NIQU5ORUxfTl9TVEFURV9HRVQoaHRpbSwgQ2hhbm5lbCkgPT0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX0JVU1kpIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0gZWxzZSBpZiAoVElNX0NIQU5ORUxfTl9TVEFURV9HRVQoaHRpbSwgQ2hhbm5lbCkgPT0KKyAgICAgICAgICAgICBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpIHsKKyAgICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChMZW5ndGggPT0gMFUpKSB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0gZWxzZSB7CisgICAgICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBDaGFubmVsLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSk7CisgICAgfQorICB9IGVsc2UgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICBzd2l0Y2ggKENoYW5uZWwpIHsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzE6IHsKKyAgICAgIC8qIFNldCB0aGUgRE1BIGNvbXBhcmUgY2FsbGJhY2tzICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFEZWxheVB1bHNlTkNwbHQ7CisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPQorICAgICAgICAgIFRJTV9ETUFEZWxheVB1bHNlSGFsZkNwbHQ7CisKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3JDQ3hOOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXSwgKHVpbnQzMl90KXBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+Q0NSMSwgTGVuZ3RoKSAhPSBIQUxfT0spIHsKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgLyogRW5hYmxlIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MxKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMjogeworICAgICAgLyogU2V0IHRoZSBETUEgY29tcGFyZSBjYWxsYmFja3MgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQURlbGF5UHVsc2VOQ3BsdDsKKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9CisgICAgICAgICAgVElNX0RNQURlbGF5UHVsc2VIYWxmQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvckNDeE47CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLCAodWludDMyX3QpcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5DQ1IyLCBMZW5ndGgpICE9IEhBTF9PSykgeworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgICAvKiBFbmFibGUgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBETUEgcmVxdWVzdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzIpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8zOiB7CisgICAgICAvKiBTZXQgdGhlIERNQSBjb21wYXJlIGNhbGxiYWNrcyAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BRGVsYXlQdWxzZU5DcGx0OworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0KKyAgICAgICAgICBUSU1fRE1BRGVsYXlQdWxzZUhhbGZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yQ0N4TjsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10sICh1aW50MzJfdClwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkNDUjMsIExlbmd0aCkgIT0gSEFMX09LKSB7CisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIE91dHB1dCBDb21wYXJlIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMyk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzQ6IHsKKyAgICAgIC8qIFNldCB0aGUgRE1BIGNvbXBhcmUgY2FsbGJhY2tzICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFEZWxheVB1bHNlTkNwbHQ7CisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPQorICAgICAgICAgIFRJTV9ETUFEZWxheVB1bHNlSGFsZkNwbHQ7CisKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3JDQ3hOOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XSwgKHVpbnQzMl90KXBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+Q0NSNCwgTGVuZ3RoKSAhPSBIQUxfT0spIHsKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgLyogRW5hYmxlIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0M0KTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICBicmVhazsKKyAgfQorCisgIGlmIChzdGF0dXMgPT0gSEFMX09LKSB7CisgICAgLyogRW5hYmxlIHRoZSBDYXB0dXJlIGNvbXBhcmUgY2hhbm5lbCBOICovCisgICAgVElNX0NDeE5DaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4Tl9FTkFCTEUpOworCisgICAgLyogRW5hYmxlIHRoZSBNYWluIE91dHB1dCAqLworICAgIF9fSEFMX1RJTV9NT0VfRU5BQkxFKGh0aW0pOworCisgICAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsLCBleGNlcHQgaW4gdHJpZ2dlciBtb2RlIHdoZXJlIGVuYWJsZSBpcworICAgICAqIGF1dG9tYXRpY2FsbHkgZG9uZSB3aXRoIHRyaWdnZXIgKi8KKyAgICBpZiAoSVNfVElNX1NMQVZFX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSkgeworICAgICAgdG1wc21jciA9IGh0aW0tPkluc3RhbmNlLT5TTUNSICYgVElNX1NNQ1JfU01TOworICAgICAgaWYgKCFJU19USU1fU0xBVkVNT0RFX1RSSUdHRVJfRU5BQkxFRCh0bXBzbWNyKSkgeworICAgICAgICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOworICAgIH0KKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBAYnJpZWYgIFN0b3BzIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgc2lnbmFsIGdlbmVyYXRpb24gaW4gRE1BIG1vZGUKKyAqICAgICAgICAgb24gdGhlIGNvbXBsZW1lbnRhcnkgb3V0cHV0LgorICogQHBhcmFtICBodGltIFRJTSBPdXRwdXQgQ29tcGFyZSBoYW5kbGUKKyAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbCB0byBiZSBkaXNhYmxlZAorICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X09DTl9TdG9wX0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCkgeworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hOX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7CisKKyAgc3dpdGNoIChDaGFubmVsKSB7CisgICAgY2FzZSBUSU1fQ0hBTk5FTF8xOiB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMSk7CisgICAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMjogeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIE91dHB1dCBDb21wYXJlIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzIpOworICAgICAgKHZvaWQpSEFMX0RNQV9BYm9ydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzM6IHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBETUEgcmVxdWVzdCAqLworICAgICAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MzKTsKKyAgICAgICh2b2lkKUhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10pOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF80OiB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzQpOworICAgICAgKHZvaWQpSEFMX0RNQV9BYm9ydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgICAgYnJlYWs7CisgIH0KKworICBpZiAoc3RhdHVzID09IEhBTF9PSykgeworICAgIC8qIERpc2FibGUgdGhlIENhcHR1cmUgY29tcGFyZSBjaGFubmVsIE4gKi8KKyAgICBUSU1fQ0N4TkNoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hOX0RJU0FCTEUpOworCisgICAgLyogRGlzYWJsZSB0aGUgTWFpbiBPdXRwdXQgKi8KKyAgICBfX0hBTF9USU1fTU9FX0RJU0FCTEUoaHRpbSk7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgICAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7CisKKyAgICAvKiBTZXQgdGhlIFRJTSBjb21wbGVtZW50YXJ5IGNoYW5uZWwgc3RhdGUgKi8KKyAgICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBDaGFubmVsLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOworICB9CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1FeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIEV4dGVuZGVkIFRpbWVyIENvbXBsZW1lbnRhcnkgUFdNCitmdW5jdGlvbnMKKyAgKiBAYnJpZWYgICAgVGltZXIgQ29tcGxlbWVudGFyeSBQV00gZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgIyMjIyMgVGltZXIgQ29tcGxlbWVudGFyeSBQV00gZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAoKykgU3RhcnQgdGhlIENvbXBsZW1lbnRhcnkgUFdNLgorICAgICgrKSBTdG9wIHRoZSBDb21wbGVtZW50YXJ5IFBXTS4KKyAgICAoKykgU3RhcnQgdGhlIENvbXBsZW1lbnRhcnkgUFdNIGFuZCBlbmFibGUgaW50ZXJydXB0cy4KKyAgICAoKykgU3RvcCB0aGUgQ29tcGxlbWVudGFyeSBQV00gYW5kIGRpc2FibGUgaW50ZXJydXB0cy4KKyAgICAoKykgU3RhcnQgdGhlIENvbXBsZW1lbnRhcnkgUFdNIGFuZCBlbmFibGUgRE1BIHRyYW5zZmVycy4KKyAgICAoKykgU3RvcCB0aGUgQ29tcGxlbWVudGFyeSBQV00gYW5kIGRpc2FibGUgRE1BIHRyYW5zZmVycy4KK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICogQGJyaWVmICBTdGFydHMgdGhlIFBXTSBzaWduYWwgZ2VuZXJhdGlvbiBvbiB0aGUgY29tcGxlbWVudGFyeSBvdXRwdXQuCisgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVsIHRvIGJlIGVuYWJsZWQKKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZAorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9QV01OX1N0YXJ0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCkgeworICB1aW50MzJfdCB0bXBzbWNyOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYTl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOworCisgIC8qIENoZWNrIHRoZSBUSU0gY29tcGxlbWVudGFyeSBjaGFubmVsIHN0YXRlICovCisgIGlmIChUSU1fQ0hBTk5FTF9OX1NUQVRFX0dFVChodGltLCBDaGFubmVsKSAhPSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogU2V0IHRoZSBUSU0gY29tcGxlbWVudGFyeSBjaGFubmVsIHN0YXRlICovCisgIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIENoYW5uZWwsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKTsKKworICAvKiBFbmFibGUgdGhlIGNvbXBsZW1lbnRhcnkgUFdNIG91dHB1dCAgKi8KKyAgVElNX0NDeE5DaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4Tl9FTkFCTEUpOworCisgIC8qIEVuYWJsZSB0aGUgTWFpbiBPdXRwdXQgKi8KKyAgX19IQUxfVElNX01PRV9FTkFCTEUoaHRpbSk7CisKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsLCBleGNlcHQgaW4gdHJpZ2dlciBtb2RlIHdoZXJlIGVuYWJsZSBpcyBhdXRvbWF0aWNhbGx5CisgICAqIGRvbmUgd2l0aCB0cmlnZ2VyICovCisgIGlmIChJU19USU1fU0xBVkVfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKSB7CisgICAgdG1wc21jciA9IGh0aW0tPkluc3RhbmNlLT5TTUNSICYgVElNX1NNQ1JfU01TOworICAgIGlmICghSVNfVElNX1NMQVZFTU9ERV9UUklHR0VSX0VOQUJMRUQodG1wc21jcikpIHsKKyAgICAgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7CisgICAgfQorICB9IGVsc2UgeworICAgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7CisgIH0KKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICogQGJyaWVmICBTdG9wcyB0aGUgUFdNIHNpZ25hbCBnZW5lcmF0aW9uIG9uIHRoZSBjb21wbGVtZW50YXJ5IG91dHB1dC4KKyAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWwgdG8gYmUgZGlzYWJsZWQKKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZAorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9QV01OX1N0b3AoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpIHsKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hOX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7CisKKyAgLyogRGlzYWJsZSB0aGUgY29tcGxlbWVudGFyeSBQV00gb3V0cHV0ICAqLworICBUSU1fQ0N4TkNoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hOX0RJU0FCTEUpOworCisgIC8qIERpc2FibGUgdGhlIE1haW4gT3V0cHV0ICovCisgIF9fSEFMX1RJTV9NT0VfRElTQUJMRShodGltKTsKKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisgIC8qIFNldCB0aGUgVElNIGNvbXBsZW1lbnRhcnkgY2hhbm5lbCBzdGF0ZSAqLworICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBDaGFubmVsLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgUFdNIHNpZ25hbCBnZW5lcmF0aW9uIGluIGludGVycnVwdCBtb2RlIG9uIHRoZQorICogICAgICAgICBjb21wbGVtZW50YXJ5IG91dHB1dC4KKyAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWwgdG8gYmUgZGlzYWJsZWQKKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZAorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9QV01OX1N0YXJ0X0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCkgeworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisgIHVpbnQzMl90IHRtcHNtY3I7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hOX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7CisKKyAgLyogQ2hlY2sgdGhlIFRJTSBjb21wbGVtZW50YXJ5IGNoYW5uZWwgc3RhdGUgKi8KKyAgaWYgKFRJTV9DSEFOTkVMX05fU1RBVEVfR0VUKGh0aW0sIENoYW5uZWwpICE9IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSkgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBTZXQgdGhlIFRJTSBjb21wbGVtZW50YXJ5IGNoYW5uZWwgc3RhdGUgKi8KKyAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgQ2hhbm5lbCwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX0JVU1kpOworCisgIHN3aXRjaCAoQ2hhbm5lbCkgeworICAgIGNhc2UgVElNX0NIQU5ORUxfMTogeworICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDEgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzEpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8yOiB7CisgICAgICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMiBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfSVQoaHRpbSwgVElNX0lUX0NDMik7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzM6IHsKKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAzIGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9JVChodGltLCBUSU1fSVRfQ0MzKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfNDogeworICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDQgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzQpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKHN0YXR1cyA9PSBIQUxfT0spIHsKKyAgICAvKiBFbmFibGUgdGhlIFRJTSBCcmVhayBpbnRlcnJ1cHQgKi8KKyAgICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9CUkVBSyk7CisKKyAgICAvKiBFbmFibGUgdGhlIGNvbXBsZW1lbnRhcnkgUFdNIG91dHB1dCAgKi8KKyAgICBUSU1fQ0N4TkNoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hOX0VOQUJMRSk7CisKKyAgICAvKiBFbmFibGUgdGhlIE1haW4gT3V0cHV0ICovCisgICAgX19IQUxfVElNX01PRV9FTkFCTEUoaHRpbSk7CisKKyAgICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwsIGV4Y2VwdCBpbiB0cmlnZ2VyIG1vZGUgd2hlcmUgZW5hYmxlIGlzCisgICAgICogYXV0b21hdGljYWxseSBkb25lIHdpdGggdHJpZ2dlciAqLworICAgIGlmIChJU19USU1fU0xBVkVfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKSB7CisgICAgICB0bXBzbWNyID0gaHRpbS0+SW5zdGFuY2UtPlNNQ1IgJiBUSU1fU01DUl9TTVM7CisgICAgICBpZiAoIUlTX1RJTV9TTEFWRU1PREVfVFJJR0dFUl9FTkFCTEVEKHRtcHNtY3IpKSB7CisgICAgICAgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7CisgICAgfQorICB9CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIEBicmllZiAgU3RvcHMgdGhlIFBXTSBzaWduYWwgZ2VuZXJhdGlvbiBpbiBpbnRlcnJ1cHQgbW9kZSBvbiB0aGUKKyAqICAgICAgICAgY29tcGxlbWVudGFyeSBvdXRwdXQuCisgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVsIHRvIGJlIGRpc2FibGVkCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfUFdNTl9TdG9wX0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKSB7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKyAgdWludDMyX3QgdG1wY2NlcjsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWE5fSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsKKworICBzd2l0Y2ggKENoYW5uZWwpIHsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzE6IHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMSBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzEpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8yOiB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDIgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9JVChodGltLCBUSU1fSVRfQ0MyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMzogeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAzIGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDMyk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzQ6IHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgNCBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzQpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKHN0YXR1cyA9PSBIQUxfT0spIHsKKyAgICAvKiBEaXNhYmxlIHRoZSBjb21wbGVtZW50YXJ5IFBXTSBvdXRwdXQgICovCisgICAgVElNX0NDeE5DaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4Tl9ESVNBQkxFKTsKKworICAgIC8qIERpc2FibGUgdGhlIFRJTSBCcmVhayBpbnRlcnJ1cHQgKG9ubHkgaWYgbm8gbW9yZSBjaGFubmVsIGlzIGFjdGl2ZSkgKi8KKyAgICB0bXBjY2VyID0gaHRpbS0+SW5zdGFuY2UtPkNDRVI7CisgICAgaWYgKCh0bXBjY2VyICYgVElNX0NDRVJfQ0N4TkVfTUFTSykgPT0gKHVpbnQzMl90KVJFU0VUKSB7CisgICAgICBfX0hBTF9USU1fRElTQUJMRV9JVChodGltLCBUSU1fSVRfQlJFQUspOworICAgIH0KKworICAgIC8qIERpc2FibGUgdGhlIE1haW4gT3V0cHV0ICovCisgICAgX19IQUxfVElNX01PRV9ESVNBQkxFKGh0aW0pOworCisgICAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICAgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisgICAgLyogU2V0IHRoZSBUSU0gY29tcGxlbWVudGFyeSBjaGFubmVsIHN0YXRlICovCisgICAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgQ2hhbm5lbCwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsKKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgVElNIFBXTSBzaWduYWwgZ2VuZXJhdGlvbiBpbiBETUEgbW9kZSBvbiB0aGUKKyAqICAgICAgICAgY29tcGxlbWVudGFyeSBvdXRwdXQKKyAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWwgdG8gYmUgZW5hYmxlZAorICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkCisgKiBAcGFyYW0gIHBEYXRhIFRoZSBzb3VyY2UgQnVmZmVyIGFkZHJlc3MuCisgKiBAcGFyYW0gIExlbmd0aCBUaGUgbGVuZ3RoIG9mIGRhdGEgdG8gYmUgdHJhbnNmZXJyZWQgZnJvbSBtZW1vcnkgdG8gVElNCisgKiBwZXJpcGhlcmFsCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X1BXTU5fU3RhcnRfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgKnBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IExlbmd0aCkgeworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisgIHVpbnQzMl90IHRtcHNtY3I7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hOX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7CisKKyAgLyogU2V0IHRoZSBUSU0gY29tcGxlbWVudGFyeSBjaGFubmVsIHN0YXRlICovCisgIGlmIChUSU1fQ0hBTk5FTF9OX1NUQVRFX0dFVChodGltLCBDaGFubmVsKSA9PSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSkgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfSBlbHNlIGlmIChUSU1fQ0hBTk5FTF9OX1NUQVRFX0dFVChodGltLCBDaGFubmVsKSA9PQorICAgICAgICAgICAgIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSkgeworICAgIGlmICgocERhdGEgPT0gTlVMTCkgfHwgKExlbmd0aCA9PSAwVSkpIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfSBlbHNlIHsKKyAgICAgIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIENoYW5uZWwsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIHN3aXRjaCAoQ2hhbm5lbCkgeworICAgIGNhc2UgVElNX0NIQU5ORUxfMTogeworICAgICAgLyogU2V0IHRoZSBETUEgY29tcGFyZSBjYWxsYmFja3MgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQURlbGF5UHVsc2VOQ3BsdDsKKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9CisgICAgICAgICAgVElNX0RNQURlbGF5UHVsc2VIYWxmQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvckNDeE47CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLCAodWludDMyX3QpcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5DQ1IxLCBMZW5ndGgpICE9IEhBTF9PSykgeworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMSBETUEgcmVxdWVzdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzEpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8yOiB7CisgICAgICAvKiBTZXQgdGhlIERNQSBjb21wYXJlIGNhbGxiYWNrcyAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BRGVsYXlQdWxzZU5DcGx0OworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0KKyAgICAgICAgICBUSU1fRE1BRGVsYXlQdWxzZUhhbGZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yQ0N4TjsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0sICh1aW50MzJfdClwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkNDUjIsIExlbmd0aCkgIT0gSEFMX09LKSB7CisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAyIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMik7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzM6IHsKKyAgICAgIC8qIFNldCB0aGUgRE1BIGNvbXBhcmUgY2FsbGJhY2tzICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFEZWxheVB1bHNlTkNwbHQ7CisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPQorICAgICAgICAgIFRJTV9ETUFEZWxheVB1bHNlSGFsZkNwbHQ7CisKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3JDQ3hOOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXSwgKHVpbnQzMl90KXBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+Q0NSMywgTGVuZ3RoKSAhPSBIQUxfT0spIHsKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDMgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MzKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfNDogeworICAgICAgLyogU2V0IHRoZSBETUEgY29tcGFyZSBjYWxsYmFja3MgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQURlbGF5UHVsc2VOQ3BsdDsKKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9CisgICAgICAgICAgVElNX0RNQURlbGF5UHVsc2VIYWxmQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvckNDeE47CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdLCAodWludDMyX3QpcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5DQ1I0LCBMZW5ndGgpICE9IEhBTF9PSykgeworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgNCBETUEgcmVxdWVzdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzQpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKHN0YXR1cyA9PSBIQUxfT0spIHsKKyAgICAvKiBFbmFibGUgdGhlIGNvbXBsZW1lbnRhcnkgUFdNIG91dHB1dCAgKi8KKyAgICBUSU1fQ0N4TkNoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hOX0VOQUJMRSk7CisKKyAgICAvKiBFbmFibGUgdGhlIE1haW4gT3V0cHV0ICovCisgICAgX19IQUxfVElNX01PRV9FTkFCTEUoaHRpbSk7CisKKyAgICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwsIGV4Y2VwdCBpbiB0cmlnZ2VyIG1vZGUgd2hlcmUgZW5hYmxlIGlzCisgICAgICogYXV0b21hdGljYWxseSBkb25lIHdpdGggdHJpZ2dlciAqLworICAgIGlmIChJU19USU1fU0xBVkVfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKSB7CisgICAgICB0bXBzbWNyID0gaHRpbS0+SW5zdGFuY2UtPlNNQ1IgJiBUSU1fU01DUl9TTVM7CisgICAgICBpZiAoIUlTX1RJTV9TTEFWRU1PREVfVFJJR0dFUl9FTkFCTEVEKHRtcHNtY3IpKSB7CisgICAgICAgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7CisgICAgfQorICB9CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIEBicmllZiAgU3RvcHMgdGhlIFRJTSBQV00gc2lnbmFsIGdlbmVyYXRpb24gaW4gRE1BIG1vZGUgb24gdGhlIGNvbXBsZW1lbnRhcnkKKyAqICAgICAgICAgb3V0cHV0CisgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVsIHRvIGJlIGRpc2FibGVkCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfUFdNTl9TdG9wX0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpIHsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYTl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOworCisgIHN3aXRjaCAoQ2hhbm5lbCkgeworICAgIGNhc2UgVElNX0NIQU5ORUxfMTogeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAxIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzEpOworICAgICAgKHZvaWQpSEFMX0RNQV9BYm9ydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzI6IHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMiBETUEgcmVxdWVzdCAqLworICAgICAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MyKTsKKyAgICAgICh2b2lkKUhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0pOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8zOiB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDMgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMyk7CisgICAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfNDogeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSA0IERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzQpOworICAgICAgKHZvaWQpSEFMX0RNQV9BYm9ydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgICAgYnJlYWs7CisgIH0KKworICBpZiAoc3RhdHVzID09IEhBTF9PSykgeworICAgIC8qIERpc2FibGUgdGhlIGNvbXBsZW1lbnRhcnkgUFdNIG91dHB1dCAqLworICAgIFRJTV9DQ3hOQ2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCwgVElNX0NDeE5fRElTQUJMRSk7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBNYWluIE91dHB1dCAqLworICAgIF9fSEFMX1RJTV9NT0VfRElTQUJMRShodGltKTsKKworICAgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgICBfX0hBTF9USU1fRElTQUJMRShodGltKTsKKworICAgIC8qIFNldCB0aGUgVElNIGNvbXBsZW1lbnRhcnkgY2hhbm5lbCBzdGF0ZSAqLworICAgIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIENoYW5uZWwsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7CisgIH0KKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFRJTUV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQgRXh0ZW5kZWQgVGltZXIgQ29tcGxlbWVudGFyeSBPbmUKK1B1bHNlIGZ1bmN0aW9ucworICAqIEBicmllZiAgICBUaW1lciBDb21wbGVtZW50YXJ5IE9uZSBQdWxzZSBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICMjIyMjIFRpbWVyIENvbXBsZW1lbnRhcnkgT25lIFB1bHNlIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgKCspIFN0YXJ0IHRoZSBDb21wbGVtZW50YXJ5IE9uZSBQdWxzZSBnZW5lcmF0aW9uLgorICAgICgrKSBTdG9wIHRoZSBDb21wbGVtZW50YXJ5IE9uZSBQdWxzZS4KKyAgICAoKykgU3RhcnQgdGhlIENvbXBsZW1lbnRhcnkgT25lIFB1bHNlIGFuZCBlbmFibGUgaW50ZXJydXB0cy4KKyAgICAoKykgU3RvcCB0aGUgQ29tcGxlbWVudGFyeSBPbmUgUHVsc2UgYW5kIGRpc2FibGUgaW50ZXJydXB0cy4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgVElNIE9uZSBQdWxzZSBzaWduYWwgZ2VuZXJhdGlvbiBvbiB0aGUgY29tcGxlbWVudGFyeQorICogICAgICAgICBvdXRwdXQuCisgKiBAbm90ZSBPdXRwdXRDaGFubmVsIG11c3QgbWF0Y2ggdGhlIHB1bHNlIG91dHB1dCBjaGFubmVsIGNob3NlbiB3aGVuIGNhbGxpbmcKKyAqICAgICAgIEByZWYgSEFMX1RJTV9PbmVQdWxzZV9Db25maWdDaGFubmVsKCkuCisgKiBAcGFyYW0gIGh0aW0gVElNIE9uZSBQdWxzZSBoYW5kbGUKKyAqIEBwYXJhbSAgT3V0cHV0Q2hhbm5lbCBwdWxzZSBvdXRwdXQgY2hhbm5lbCB0byBlbmFibGUKKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfT25lUHVsc2VOX1N0YXJ0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBPdXRwdXRDaGFubmVsKSB7CisgIHVpbnQzMl90IGlucHV0X2NoYW5uZWwgPQorICAgICAgKE91dHB1dENoYW5uZWwgPT0gVElNX0NIQU5ORUxfMSkgPyBUSU1fQ0hBTk5FTF8yIDogVElNX0NIQU5ORUxfMTsKKyAgSEFMX1RJTV9DaGFubmVsU3RhdGVUeXBlRGVmIGNoYW5uZWxfMV9zdGF0ZSA9CisgICAgICBUSU1fQ0hBTk5FTF9TVEFURV9HRVQoaHRpbSwgVElNX0NIQU5ORUxfMSk7CisgIEhBTF9USU1fQ2hhbm5lbFN0YXRlVHlwZURlZiBjaGFubmVsXzJfc3RhdGUgPQorICAgICAgVElNX0NIQU5ORUxfU1RBVEVfR0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIpOworICBIQUxfVElNX0NoYW5uZWxTdGF0ZVR5cGVEZWYgY29tcGxlbWVudGFyeV9jaGFubmVsXzFfc3RhdGUgPQorICAgICAgVElNX0NIQU5ORUxfTl9TVEFURV9HRVQoaHRpbSwgVElNX0NIQU5ORUxfMSk7CisgIEhBTF9USU1fQ2hhbm5lbFN0YXRlVHlwZURlZiBjb21wbGVtZW50YXJ5X2NoYW5uZWxfMl9zdGF0ZSA9CisgICAgICBUSU1fQ0hBTk5FTF9OX1NUQVRFX0dFVChodGltLCBUSU1fQ0hBTk5FTF8yKTsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWE5fSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIE91dHB1dENoYW5uZWwpKTsKKworICAvKiBDaGVjayB0aGUgVElNIGNoYW5uZWxzIHN0YXRlICovCisgIGlmICgoY2hhbm5lbF8xX3N0YXRlICE9IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSkgfHwKKyAgICAgIChjaGFubmVsXzJfc3RhdGUgIT0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKSB8fAorICAgICAgKGNvbXBsZW1lbnRhcnlfY2hhbm5lbF8xX3N0YXRlICE9IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSkgfHwKKyAgICAgIChjb21wbGVtZW50YXJ5X2NoYW5uZWxfMl9zdGF0ZSAhPSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpKSB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFNldCB0aGUgVElNIGNoYW5uZWxzIHN0YXRlICovCisgIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8xLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSk7CisgIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8yLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSk7CisgIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKTsKKyAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMiwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX0JVU1kpOworCisgIC8qIEVuYWJsZSB0aGUgY29tcGxlbWVudGFyeSBPbmUgUHVsc2Ugb3V0cHV0IGNoYW5uZWwgYW5kIHRoZSBJbnB1dCBDYXB0dXJlCisgICAqIGNoYW5uZWwgKi8KKyAgVElNX0NDeE5DaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBPdXRwdXRDaGFubmVsLCBUSU1fQ0N4Tl9FTkFCTEUpOworICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgaW5wdXRfY2hhbm5lbCwgVElNX0NDeF9FTkFCTEUpOworCisgIC8qIEVuYWJsZSB0aGUgTWFpbiBPdXRwdXQgKi8KKyAgX19IQUxfVElNX01PRV9FTkFCTEUoaHRpbSk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiAgU3RvcHMgdGhlIFRJTSBPbmUgUHVsc2Ugc2lnbmFsIGdlbmVyYXRpb24gb24gdGhlIGNvbXBsZW1lbnRhcnkKKyAqICAgICAgICAgb3V0cHV0LgorICogQG5vdGUgT3V0cHV0Q2hhbm5lbCBtdXN0IG1hdGNoIHRoZSBwdWxzZSBvdXRwdXQgY2hhbm5lbCBjaG9zZW4gd2hlbiBjYWxsaW5nCisgKiAgICAgICBAcmVmIEhBTF9USU1fT25lUHVsc2VfQ29uZmlnQ2hhbm5lbCgpLgorICogQHBhcmFtICBodGltIFRJTSBPbmUgUHVsc2UgaGFuZGxlCisgKiBAcGFyYW0gIE91dHB1dENoYW5uZWwgcHVsc2Ugb3V0cHV0IGNoYW5uZWwgdG8gZGlzYWJsZQorICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9PbmVQdWxzZU5fU3RvcChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBPdXRwdXRDaGFubmVsKSB7CisgIHVpbnQzMl90IGlucHV0X2NoYW5uZWwgPQorICAgICAgKE91dHB1dENoYW5uZWwgPT0gVElNX0NIQU5ORUxfMSkgPyBUSU1fQ0hBTk5FTF8yIDogVElNX0NIQU5ORUxfMTsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWE5fSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIE91dHB1dENoYW5uZWwpKTsKKworICAvKiBEaXNhYmxlIHRoZSBjb21wbGVtZW50YXJ5IE9uZSBQdWxzZSBvdXRwdXQgY2hhbm5lbCBhbmQgdGhlIElucHV0IENhcHR1cmUKKyAgICogY2hhbm5lbCAqLworICBUSU1fQ0N4TkNoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIE91dHB1dENoYW5uZWwsIFRJTV9DQ3hOX0RJU0FCTEUpOworICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgaW5wdXRfY2hhbm5lbCwgVElNX0NDeF9ESVNBQkxFKTsKKworICAvKiBEaXNhYmxlIHRoZSBNYWluIE91dHB1dCAqLworICBfX0hBTF9USU1fTU9FX0RJU0FCTEUoaHRpbSk7CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9USU1fRElTQUJMRShodGltKTsKKworICAvKiBTZXQgdGhlIFRJTSAgY2hhbm5lbHMgc3RhdGUgKi8KKyAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7CisgIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8yLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOworICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8xLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOworICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8yLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgVElNIE9uZSBQdWxzZSBzaWduYWwgZ2VuZXJhdGlvbiBpbiBpbnRlcnJ1cHQgbW9kZSBvbiB0aGUKKyAqICAgICAgICAgY29tcGxlbWVudGFyeSBjaGFubmVsLgorICogQG5vdGUgT3V0cHV0Q2hhbm5lbCBtdXN0IG1hdGNoIHRoZSBwdWxzZSBvdXRwdXQgY2hhbm5lbCBjaG9zZW4gd2hlbiBjYWxsaW5nCisgKiAgICAgICBAcmVmIEhBTF9USU1fT25lUHVsc2VfQ29uZmlnQ2hhbm5lbCgpLgorICogQHBhcmFtICBodGltIFRJTSBPbmUgUHVsc2UgaGFuZGxlCisgKiBAcGFyYW0gIE91dHB1dENoYW5uZWwgcHVsc2Ugb3V0cHV0IGNoYW5uZWwgdG8gZW5hYmxlCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X09uZVB1bHNlTl9TdGFydF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgT3V0cHV0Q2hhbm5lbCkgeworICB1aW50MzJfdCBpbnB1dF9jaGFubmVsID0KKyAgICAgIChPdXRwdXRDaGFubmVsID09IFRJTV9DSEFOTkVMXzEpID8gVElNX0NIQU5ORUxfMiA6IFRJTV9DSEFOTkVMXzE7CisgIEhBTF9USU1fQ2hhbm5lbFN0YXRlVHlwZURlZiBjaGFubmVsXzFfc3RhdGUgPQorICAgICAgVElNX0NIQU5ORUxfU1RBVEVfR0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEpOworICBIQUxfVElNX0NoYW5uZWxTdGF0ZVR5cGVEZWYgY2hhbm5lbF8yX3N0YXRlID0KKyAgICAgIFRJTV9DSEFOTkVMX1NUQVRFX0dFVChodGltLCBUSU1fQ0hBTk5FTF8yKTsKKyAgSEFMX1RJTV9DaGFubmVsU3RhdGVUeXBlRGVmIGNvbXBsZW1lbnRhcnlfY2hhbm5lbF8xX3N0YXRlID0KKyAgICAgIFRJTV9DSEFOTkVMX05fU1RBVEVfR0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEpOworICBIQUxfVElNX0NoYW5uZWxTdGF0ZVR5cGVEZWYgY29tcGxlbWVudGFyeV9jaGFubmVsXzJfc3RhdGUgPQorICAgICAgVElNX0NIQU5ORUxfTl9TVEFURV9HRVQoaHRpbSwgVElNX0NIQU5ORUxfMik7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hOX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBPdXRwdXRDaGFubmVsKSk7CisKKyAgLyogQ2hlY2sgdGhlIFRJTSBjaGFubmVscyBzdGF0ZSAqLworICBpZiAoKGNoYW5uZWxfMV9zdGF0ZSAhPSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpIHx8CisgICAgICAoY2hhbm5lbF8yX3N0YXRlICE9IEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSkgfHwKKyAgICAgIChjb21wbGVtZW50YXJ5X2NoYW5uZWxfMV9zdGF0ZSAhPSBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpIHx8CisgICAgICAoY29tcGxlbWVudGFyeV9jaGFubmVsXzJfc3RhdGUgIT0gSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKSkgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBTZXQgdGhlIFRJTSBjaGFubmVscyBzdGF0ZSAqLworICBUSU1fQ0hBTk5FTF9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMSwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX0JVU1kpOworICBUSU1fQ0hBTk5FTF9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMiwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX0JVU1kpOworICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8xLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfQlVTWSk7CisgIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9CVVNZKTsKKworICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMSBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfVElNX0VOQUJMRV9JVChodGltLCBUSU1fSVRfQ0MxKTsKKworICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMiBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfVElNX0VOQUJMRV9JVChodGltLCBUSU1fSVRfQ0MyKTsKKworICAvKiBFbmFibGUgdGhlIGNvbXBsZW1lbnRhcnkgT25lIFB1bHNlIG91dHB1dCBjaGFubmVsIGFuZCB0aGUgSW5wdXQgQ2FwdHVyZQorICAgKiBjaGFubmVsICovCisgIFRJTV9DQ3hOQ2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgT3V0cHV0Q2hhbm5lbCwgVElNX0NDeE5fRU5BQkxFKTsKKyAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIGlucHV0X2NoYW5uZWwsIFRJTV9DQ3hfRU5BQkxFKTsKKworICAvKiBFbmFibGUgdGhlIE1haW4gT3V0cHV0ICovCisgIF9fSEFMX1RJTV9NT0VfRU5BQkxFKGh0aW0pOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgIFN0b3BzIHRoZSBUSU0gT25lIFB1bHNlIHNpZ25hbCBnZW5lcmF0aW9uIGluIGludGVycnVwdCBtb2RlIG9uIHRoZQorICogICAgICAgICBjb21wbGVtZW50YXJ5IGNoYW5uZWwuCisgKiBAbm90ZSBPdXRwdXRDaGFubmVsIG11c3QgbWF0Y2ggdGhlIHB1bHNlIG91dHB1dCBjaGFubmVsIGNob3NlbiB3aGVuIGNhbGxpbmcKKyAqICAgICAgIEByZWYgSEFMX1RJTV9PbmVQdWxzZV9Db25maWdDaGFubmVsKCkuCisgKiBAcGFyYW0gIGh0aW0gVElNIE9uZSBQdWxzZSBoYW5kbGUKKyAqIEBwYXJhbSAgT3V0cHV0Q2hhbm5lbCBwdWxzZSBvdXRwdXQgY2hhbm5lbCB0byBkaXNhYmxlCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X09uZVB1bHNlTl9TdG9wX0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE91dHB1dENoYW5uZWwpIHsKKyAgdWludDMyX3QgaW5wdXRfY2hhbm5lbCA9CisgICAgICAoT3V0cHV0Q2hhbm5lbCA9PSBUSU1fQ0hBTk5FTF8xKSA/IFRJTV9DSEFOTkVMXzIgOiBUSU1fQ0hBTk5FTF8xOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYTl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgT3V0cHV0Q2hhbm5lbCkpOworCisgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMSBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDMSk7CisKKyAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAyIGludGVycnVwdCAqLworICBfX0hBTF9USU1fRElTQUJMRV9JVChodGltLCBUSU1fSVRfQ0MyKTsKKworICAvKiBEaXNhYmxlIHRoZSBjb21wbGVtZW50YXJ5IE9uZSBQdWxzZSBvdXRwdXQgY2hhbm5lbCBhbmQgdGhlIElucHV0IENhcHR1cmUKKyAgICogY2hhbm5lbCAqLworICBUSU1fQ0N4TkNoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIE91dHB1dENoYW5uZWwsIFRJTV9DQ3hOX0RJU0FCTEUpOworICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgaW5wdXRfY2hhbm5lbCwgVElNX0NDeF9ESVNBQkxFKTsKKworICAvKiBEaXNhYmxlIHRoZSBNYWluIE91dHB1dCAqLworICBfX0hBTF9USU1fTU9FX0RJU0FCTEUoaHRpbSk7CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9USU1fRElTQUJMRShodGltKTsKKworICAvKiBTZXQgdGhlIFRJTSAgY2hhbm5lbHMgc3RhdGUgKi8KKyAgVElNX0NIQU5ORUxfU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzEsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7CisgIFRJTV9DSEFOTkVMX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8yLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOworICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8xLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOworICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8yLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVElNRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNSBFeHRlbmRlZCBQZXJpcGhlcmFsIENvbnRyb2wKK2Z1bmN0aW9ucworICAqIEBicmllZiAgICBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgICAoKykgQ29uZmlndXJlIHRoZSBjb21tdXRhdGlvbiBldmVudCBpbiBjYXNlIG9mIHVzZSBvZiB0aGUgSGFsbCBzZW5zb3IKK2ludGVyZmFjZS4KKyAgICAgICgrKSBDb25maWd1cmUgT3V0cHV0IGNoYW5uZWxzIGZvciBPQyBhbmQgUFdNIG1vZGUuCisKKyAgICAgICgrKSBDb25maWd1cmUgQ29tcGxlbWVudGFyeSBjaGFubmVscywgYnJlYWsgZmVhdHVyZXMgYW5kIGRlYWQgdGltZS4KKyAgICAgICgrKSBDb25maWd1cmUgTWFzdGVyIHN5bmNocm9uaXphdGlvbi4KKyAgICAgICgrKSBDb25maWd1cmUgdGltZXIgcmVtYXBwaW5nIGNhcGFiaWxpdGllcy4KKyAgICAgICgrKSBTZWxlY3QgdGltZXIgaW5wdXQgc291cmNlLgorICAgICAgKCspIEVuYWJsZSBvciBkaXNhYmxlIGNoYW5uZWwgZ3JvdXBpbmcuCisgICAgICAoKykgQ29uZmlndXJlIFB1bHNlIG9uIGNvbXBhcmUuCisgICAgICAoKykgQ29uZmlndXJlIEVuY29kZXIgaW5kZXguCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICogQGJyaWVmICBDb25maWd1cmUgdGhlIFRJTSBjb21tdXRhdGlvbiBldmVudCBzZXF1ZW5jZS4KKyAqIEBub3RlICBUaGlzIGZ1bmN0aW9uIGlzIG1hbmRhdG9yeSB0byB1c2UgdGhlIGNvbW11dGF0aW9uIGV2ZW50IGluIG9yZGVyIHRvCisgKiAgICAgICAgdXBkYXRlIHRoZSBjb25maWd1cmF0aW9uIGF0IGVhY2ggY29tbXV0YXRpb24gZGV0ZWN0aW9uIG9uIHRoZSBUUkdJCisgKiBpbnB1dCBvZiB0aGUgVGltZXIsIHRoZSB0eXBpY2FsIHVzZSBvZiB0aGlzIGZlYXR1cmUgaXMgd2l0aCB0aGUgdXNlIG9mCisgKiBhbm90aGVyIFRpbWVyKGludGVyZmFjZSBUaW1lcikgY29uZmlndXJlZCBpbiBIYWxsIHNlbnNvciBpbnRlcmZhY2UsIHRoaXMKKyAqIGludGVyZmFjZSBUaW1lciB3aWxsIGdlbmVyYXRlIHRoZSBjb21tdXRhdGlvbiBhdCBpdHMgVFJHTyBvdXRwdXQgKGNvbm5lY3RlZAorICogdG8gVGltZXIgdXNlZCBpbiB0aGlzIGZ1bmN0aW9uKSBlYWNoIHRpbWUgdGhlIFRJMSBvZiB0aGUgSW50ZXJmYWNlIFRpbWVyCisgKiBkZXRlY3QgYSBjb21tdXRhdGlvbiBhdCBpdHMgaW5wdXQgVEkxLgorICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAqIEBwYXJhbSAgSW5wdXRUcmlnZ2VyIHRoZSBJbnRlcm5hbCB0cmlnZ2VyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIFRpbWVyCisgKiBJbnRlcmZhY2luZyB3aXRoIHRoZSBIYWxsIHNlbnNvciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcKKyAqIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfSVRSMDogSW50ZXJuYWwgdHJpZ2dlciAwIHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX1RTX0lUUjE6IEludGVybmFsIHRyaWdnZXIgMSBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9UU19JVFIyOiBJbnRlcm5hbCB0cmlnZ2VyIDIgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfSVRSMzogSW50ZXJuYWwgdHJpZ2dlciAzIHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX1RTX0lUUjQ6IEludGVybmFsIHRyaWdnZXIgNCBzZWxlY3RlZCAgICgqKQorICogICAgICAgICAgICBAYXJnIFRJTV9UU19JVFI1OiBJbnRlcm5hbCB0cmlnZ2VyIDUgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfSVRSNjogSW50ZXJuYWwgdHJpZ2dlciA2IHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX1RTX0lUUjc6IEludGVybmFsIHRyaWdnZXIgNyBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9UU19JVFI4OiBJbnRlcm5hbCB0cmlnZ2VyIDggc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfSVRSOTogSW50ZXJuYWwgdHJpZ2dlciA5IHNlbGVjdGVkICAgKCopCisgKiAgICAgICAgICAgIEBhcmcgVElNX1RTX0lUUjEwOiBJbnRlcm5hbCB0cmlnZ2VyIDEwIHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX1RTX0lUUjExOiBJbnRlcm5hbCB0cmlnZ2VyIDExIHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX1RTX05PTkU6IE5vIHRyaWdnZXIgaXMgbmVlZGVkCisgKgorICogICAgICAgICAoKikgIFZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICoKKyAqIEBwYXJhbSAgQ29tbXV0YXRpb25Tb3VyY2UgdGhlIENvbW11dGF0aW9uIEV2ZW50IHNvdXJjZQorICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ09NTVVUQVRJT05fVFJHSTogQ29tbXV0YXRpb24gc291cmNlIGlzIHRoZSBUUkdJIG9mIHRoZQorICogSW50ZXJmYWNlIFRpbWVyCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NPTU1VVEFUSU9OX1NPRlRXQVJFOiAgQ29tbXV0YXRpb24gc291cmNlIGlzIHNldCBieQorICogc29mdHdhcmUgdXNpbmcgdGhlIENPTUcgYml0CisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0NvbmZpZ0NvbW11dEV2ZW50KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IElucHV0VHJpZ2dlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDb21tdXRhdGlvblNvdXJjZSkgeworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NPTU1VVEFUSU9OX0VWRU5UX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbSgKKyAgICAgIElTX1RJTV9JTlRFUk5BTF9UUklHR0VSRVZFTlRfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIElucHV0VHJpZ2dlcikpOworCisgIF9fSEFMX0xPQ0soaHRpbSk7CisKKyNpZiBkZWZpbmVkKFRJTTUpICYmIGRlZmluZWQoVElNMjApCisgIGlmICgoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFIwKSB8fCAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFIxKSB8fAorICAgICAgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMikgfHwgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMykgfHwKKyAgICAgIChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjQpIHx8IChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjUpIHx8CisgICAgICAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFI2KSB8fCAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFI3KSB8fAorICAgICAgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSOCkgfHwgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSOSkgfHwKKyAgICAgIChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjEwKSB8fCAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFIxMSkpCisjZWxpZiBkZWZpbmVkKFRJTTUpCisgIGlmICgoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFIwKSB8fCAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFIxKSB8fAorICAgICAgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMikgfHwgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMykgfHwKKyAgICAgIChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjQpIHx8IChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjUpIHx8CisgICAgICAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFI2KSB8fCAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFI3KSB8fAorICAgICAgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSOCkgfHwgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMTEpKQorI2VsaWYgZGVmaW5lZChUSU0yMCkKKyAgaWYgKChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjApIHx8IChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjEpIHx8CisgICAgICAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFIyKSB8fCAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFIzKSB8fAorICAgICAgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSNSkgfHwgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSNikgfHwKKyAgICAgIChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjcpIHx8IChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjgpIHx8CisgICAgICAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFI5KSB8fCAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFIxMSkpCisjZWxzZQorICBpZiAoKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMCkgfHwgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMSkgfHwKKyAgICAgIChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjIpIHx8IChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjMpIHx8CisgICAgICAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFI1KSB8fCAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFI2KSB8fAorICAgICAgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSNykgfHwgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSOCkgfHwKKyAgICAgIChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjExKSkKKyNlbmRpZiAvKiBUSU01ICYmIFRJTTIwICovCisgIHsKKyAgICAvKiBTZWxlY3QgdGhlIElucHV0IHRyaWdnZXIgKi8KKyAgICBodGltLT5JbnN0YW5jZS0+U01DUiAmPSB+VElNX1NNQ1JfVFM7CisgICAgaHRpbS0+SW5zdGFuY2UtPlNNQ1IgfD0gSW5wdXRUcmlnZ2VyOworICB9CisKKyAgLyogU2VsZWN0IHRoZSBDYXB0dXJlIENvbXBhcmUgcHJlbG9hZCBmZWF0dXJlICovCisgIGh0aW0tPkluc3RhbmNlLT5DUjIgfD0gVElNX0NSMl9DQ1BDOworICAvKiBTZWxlY3QgdGhlIENvbW11dGF0aW9uIGV2ZW50IHNvdXJjZSAqLworICBodGltLT5JbnN0YW5jZS0+Q1IyICY9IH5USU1fQ1IyX0NDVVM7CisgIGh0aW0tPkluc3RhbmNlLT5DUjIgfD0gQ29tbXV0YXRpb25Tb3VyY2U7CisKKyAgLyogRGlzYWJsZSBDb21tdXRhdGlvbiBJbnRlcnJ1cHQgKi8KKyAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NPTSk7CisKKyAgLyogRGlzYWJsZSBDb21tdXRhdGlvbiBETUEgcmVxdWVzdCAqLworICBfX0hBTF9USU1fRElTQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DT00pOworCisgIF9fSEFMX1VOTE9DSyhodGltKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBUSU0gY29tbXV0YXRpb24gZXZlbnQgc2VxdWVuY2Ugd2l0aCBpbnRlcnJ1cHQuCisgKiBAbm90ZSAgVGhpcyBmdW5jdGlvbiBpcyBtYW5kYXRvcnkgdG8gdXNlIHRoZSBjb21tdXRhdGlvbiBldmVudCBpbiBvcmRlciB0bworICogICAgICAgIHVwZGF0ZSB0aGUgY29uZmlndXJhdGlvbiBhdCBlYWNoIGNvbW11dGF0aW9uIGRldGVjdGlvbiBvbiB0aGUgVFJHSQorICogaW5wdXQgb2YgdGhlIFRpbWVyLCB0aGUgdHlwaWNhbCB1c2Ugb2YgdGhpcyBmZWF0dXJlIGlzIHdpdGggdGhlIHVzZSBvZgorICogYW5vdGhlciBUaW1lcihpbnRlcmZhY2UgVGltZXIpIGNvbmZpZ3VyZWQgaW4gSGFsbCBzZW5zb3IgaW50ZXJmYWNlLCB0aGlzCisgKiBpbnRlcmZhY2UgVGltZXIgd2lsbCBnZW5lcmF0ZSB0aGUgY29tbXV0YXRpb24gYXQgaXRzIFRSR08gb3V0cHV0IChjb25uZWN0ZWQKKyAqIHRvIFRpbWVyIHVzZWQgaW4gdGhpcyBmdW5jdGlvbikgZWFjaCB0aW1lIHRoZSBUSTEgb2YgdGhlIEludGVyZmFjZSBUaW1lcgorICogZGV0ZWN0IGEgY29tbXV0YXRpb24gYXQgaXRzIGlucHV0IFRJMS4KKyAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgKiBAcGFyYW0gIElucHV0VHJpZ2dlciB0aGUgSW50ZXJuYWwgdHJpZ2dlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBUaW1lcgorICogSW50ZXJmYWNpbmcgd2l0aCB0aGUgSGFsbCBzZW5zb3IgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nCisgKiB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgVElNX1RTX0lUUjA6IEludGVybmFsIHRyaWdnZXIgMCBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9UU19JVFIxOiBJbnRlcm5hbCB0cmlnZ2VyIDEgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfSVRSMjogSW50ZXJuYWwgdHJpZ2dlciAyIHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX1RTX0lUUjM6IEludGVybmFsIHRyaWdnZXIgMyBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9UU19JVFI0OiBJbnRlcm5hbCB0cmlnZ2VyIDQgc2VsZWN0ZWQgICAoKikKKyAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfSVRSNTogSW50ZXJuYWwgdHJpZ2dlciA1IHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX1RTX0lUUjY6IEludGVybmFsIHRyaWdnZXIgNiBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9UU19JVFI3OiBJbnRlcm5hbCB0cmlnZ2VyIDcgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfSVRSODogSW50ZXJuYWwgdHJpZ2dlciA4IHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX1RTX0lUUjk6IEludGVybmFsIHRyaWdnZXIgOSBzZWxlY3RlZCAgICgqKQorICogICAgICAgICAgICBAYXJnIFRJTV9UU19JVFIxMDogSW50ZXJuYWwgdHJpZ2dlciAxMCBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9UU19JVFIxMTogSW50ZXJuYWwgdHJpZ2dlciAxMSBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9UU19OT05FOiBObyB0cmlnZ2VyIGlzIG5lZWRlZAorICoKKyAqICAgICAgICAgKCopICBWYWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4KKyAqCisgKiBAcGFyYW0gIENvbW11dGF0aW9uU291cmNlIHRoZSBDb21tdXRhdGlvbiBFdmVudCBzb3VyY2UKKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgVElNX0NPTU1VVEFUSU9OX1RSR0k6IENvbW11dGF0aW9uIHNvdXJjZSBpcyB0aGUgVFJHSSBvZiB0aGUKKyAqIEludGVyZmFjZSBUaW1lcgorICogICAgICAgICAgICBAYXJnIFRJTV9DT01NVVRBVElPTl9TT0ZUV0FSRTogIENvbW11dGF0aW9uIHNvdXJjZSBpcyBzZXQgYnkKKyAqIHNvZnR3YXJlIHVzaW5nIHRoZSBDT01HIGJpdAorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9Db25maWdDb21tdXRFdmVudF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBJbnB1dFRyaWdnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ29tbXV0YXRpb25Tb3VyY2UpIHsKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DT01NVVRBVElPTl9FVkVOVF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oCisgICAgICBJU19USU1fSU5URVJOQUxfVFJJR0dFUkVWRU5UX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBJbnB1dFRyaWdnZXIpKTsKKworICBfX0hBTF9MT0NLKGh0aW0pOworCisjaWYgZGVmaW5lZChUSU01KSAmJiBkZWZpbmVkKFRJTTIwKQorICBpZiAoKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMCkgfHwgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMSkgfHwKKyAgICAgIChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjIpIHx8IChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjMpIHx8CisgICAgICAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFI0KSB8fCAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFI1KSB8fAorICAgICAgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSNikgfHwgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSNykgfHwKKyAgICAgIChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjgpIHx8IChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjkpIHx8CisgICAgICAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFIxMCkgfHwgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMTEpKQorI2VsaWYgZGVmaW5lZChUSU01KQorICBpZiAoKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMCkgfHwgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMSkgfHwKKyAgICAgIChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjIpIHx8IChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjMpIHx8CisgICAgICAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFI0KSB8fCAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFI1KSB8fAorICAgICAgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSNikgfHwgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSNykgfHwKKyAgICAgIChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjgpIHx8IChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjExKSkKKyNlbGlmIGRlZmluZWQoVElNMjApCisgIGlmICgoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFIwKSB8fCAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFIxKSB8fAorICAgICAgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMikgfHwgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMykgfHwKKyAgICAgIChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjUpIHx8IChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjYpIHx8CisgICAgICAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFI3KSB8fCAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFI4KSB8fAorICAgICAgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSOSkgfHwgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMTEpKQorI2Vsc2UKKyAgaWYgKChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjApIHx8IChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjEpIHx8CisgICAgICAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFIyKSB8fCAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFIzKSB8fAorICAgICAgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSNSkgfHwgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSNikgfHwKKyAgICAgIChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjcpIHx8IChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjgpIHx8CisgICAgICAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFIxMSkpCisjZW5kaWYgLyogVElNNSAmJiBUSU0yMCAqLworICB7CisgICAgLyogU2VsZWN0IHRoZSBJbnB1dCB0cmlnZ2VyICovCisgICAgaHRpbS0+SW5zdGFuY2UtPlNNQ1IgJj0gflRJTV9TTUNSX1RTOworICAgIGh0aW0tPkluc3RhbmNlLT5TTUNSIHw9IElucHV0VHJpZ2dlcjsKKyAgfQorCisgIC8qIFNlbGVjdCB0aGUgQ2FwdHVyZSBDb21wYXJlIHByZWxvYWQgZmVhdHVyZSAqLworICBodGltLT5JbnN0YW5jZS0+Q1IyIHw9IFRJTV9DUjJfQ0NQQzsKKyAgLyogU2VsZWN0IHRoZSBDb21tdXRhdGlvbiBldmVudCBzb3VyY2UgKi8KKyAgaHRpbS0+SW5zdGFuY2UtPkNSMiAmPSB+VElNX0NSMl9DQ1VTOworICBodGltLT5JbnN0YW5jZS0+Q1IyIHw9IENvbW11dGF0aW9uU291cmNlOworCisgIC8qIERpc2FibGUgQ29tbXV0YXRpb24gRE1BIHJlcXVlc3QgKi8KKyAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ09NKTsKKworICAvKiBFbmFibGUgdGhlIENvbW11dGF0aW9uIEludGVycnVwdCAqLworICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DT00pOworCisgIF9fSEFMX1VOTE9DSyhodGltKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBUSU0gY29tbXV0YXRpb24gZXZlbnQgc2VxdWVuY2Ugd2l0aCBETUEuCisgKiBAbm90ZSAgVGhpcyBmdW5jdGlvbiBpcyBtYW5kYXRvcnkgdG8gdXNlIHRoZSBjb21tdXRhdGlvbiBldmVudCBpbiBvcmRlciB0bworICogICAgICAgIHVwZGF0ZSB0aGUgY29uZmlndXJhdGlvbiBhdCBlYWNoIGNvbW11dGF0aW9uIGRldGVjdGlvbiBvbiB0aGUgVFJHSQorICogaW5wdXQgb2YgdGhlIFRpbWVyLCB0aGUgdHlwaWNhbCB1c2Ugb2YgdGhpcyBmZWF0dXJlIGlzIHdpdGggdGhlIHVzZSBvZgorICogYW5vdGhlciBUaW1lcihpbnRlcmZhY2UgVGltZXIpIGNvbmZpZ3VyZWQgaW4gSGFsbCBzZW5zb3IgaW50ZXJmYWNlLCB0aGlzCisgKiBpbnRlcmZhY2UgVGltZXIgd2lsbCBnZW5lcmF0ZSB0aGUgY29tbXV0YXRpb24gYXQgaXRzIFRSR08gb3V0cHV0IChjb25uZWN0ZWQKKyAqIHRvIFRpbWVyIHVzZWQgaW4gdGhpcyBmdW5jdGlvbikgZWFjaCB0aW1lIHRoZSBUSTEgb2YgdGhlIEludGVyZmFjZSBUaW1lcgorICogZGV0ZWN0IGEgY29tbXV0YXRpb24gYXQgaXRzIGlucHV0IFRJMS4KKyAqIEBub3RlICBUaGUgdXNlciBzaG91bGQgY29uZmlndXJlIHRoZSBETUEgaW4gaGlzIG93biBzb2Z0d2FyZSwgaW4gVGhpcworICogZnVuY3Rpb24gb25seSB0aGUgQ09NREUgYml0IGlzIHNldAorICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAqIEBwYXJhbSAgSW5wdXRUcmlnZ2VyIHRoZSBJbnRlcm5hbCB0cmlnZ2VyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIFRpbWVyCisgKiBJbnRlcmZhY2luZyB3aXRoIHRoZSBIYWxsIHNlbnNvciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcKKyAqIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfSVRSMDogSW50ZXJuYWwgdHJpZ2dlciAwIHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX1RTX0lUUjE6IEludGVybmFsIHRyaWdnZXIgMSBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9UU19JVFIyOiBJbnRlcm5hbCB0cmlnZ2VyIDIgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfSVRSMzogSW50ZXJuYWwgdHJpZ2dlciAzIHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX1RTX0lUUjQ6IEludGVybmFsIHRyaWdnZXIgNCBzZWxlY3RlZCAgICgqKQorICogICAgICAgICAgICBAYXJnIFRJTV9UU19JVFI1OiBJbnRlcm5hbCB0cmlnZ2VyIDUgc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfSVRSNjogSW50ZXJuYWwgdHJpZ2dlciA2IHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX1RTX0lUUjc6IEludGVybmFsIHRyaWdnZXIgNyBzZWxlY3RlZAorICogICAgICAgICAgICBAYXJnIFRJTV9UU19JVFI4OiBJbnRlcm5hbCB0cmlnZ2VyIDggc2VsZWN0ZWQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfSVRSOTogSW50ZXJuYWwgdHJpZ2dlciA5IHNlbGVjdGVkICAgKCopCisgKiAgICAgICAgICAgIEBhcmcgVElNX1RTX0lUUjEwOiBJbnRlcm5hbCB0cmlnZ2VyIDEwIHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX1RTX0lUUjExOiBJbnRlcm5hbCB0cmlnZ2VyIDExIHNlbGVjdGVkCisgKiAgICAgICAgICAgIEBhcmcgVElNX1RTX05PTkU6IE5vIHRyaWdnZXIgaXMgbmVlZGVkCisgKgorICogICAgICAgICAoKikgIFZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICoKKyAqIEBwYXJhbSAgQ29tbXV0YXRpb25Tb3VyY2UgdGhlIENvbW11dGF0aW9uIEV2ZW50IHNvdXJjZQorICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ09NTVVUQVRJT05fVFJHSTogQ29tbXV0YXRpb24gc291cmNlIGlzIHRoZSBUUkdJIG9mIHRoZQorICogSW50ZXJmYWNlIFRpbWVyCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NPTU1VVEFUSU9OX1NPRlRXQVJFOiAgQ29tbXV0YXRpb24gc291cmNlIGlzIHNldCBieQorICogc29mdHdhcmUgdXNpbmcgdGhlIENPTUcgYml0CisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0NvbmZpZ0NvbW11dEV2ZW50X0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgSW5wdXRUcmlnZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDb21tdXRhdGlvblNvdXJjZSkgeworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NPTU1VVEFUSU9OX0VWRU5UX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbSgKKyAgICAgIElTX1RJTV9JTlRFUk5BTF9UUklHR0VSRVZFTlRfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIElucHV0VHJpZ2dlcikpOworCisgIF9fSEFMX0xPQ0soaHRpbSk7CisKKyNpZiBkZWZpbmVkKFRJTTUpICYmIGRlZmluZWQoVElNMjApCisgIGlmICgoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFIwKSB8fCAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFIxKSB8fAorICAgICAgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMikgfHwgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMykgfHwKKyAgICAgIChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjQpIHx8IChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjUpIHx8CisgICAgICAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFI2KSB8fCAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFI3KSB8fAorICAgICAgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSOCkgfHwgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSOSkgfHwKKyAgICAgIChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjEwKSB8fCAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFIxMSkpCisjZWxpZiBkZWZpbmVkKFRJTTUpCisgIGlmICgoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFIwKSB8fCAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFIxKSB8fAorICAgICAgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMikgfHwgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMykgfHwKKyAgICAgIChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjQpIHx8IChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjUpIHx8CisgICAgICAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFI2KSB8fCAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFI3KSB8fAorICAgICAgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSOCkgfHwgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMTEpKQorI2VsaWYgZGVmaW5lZChUSU0yMCkKKyAgaWYgKChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjApIHx8IChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjEpIHx8CisgICAgICAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFIyKSB8fCAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFIzKSB8fAorICAgICAgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSNSkgfHwgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSNikgfHwKKyAgICAgIChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjcpIHx8IChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjgpIHx8CisgICAgICAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFI5KSB8fCAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFIxMSkpCisjZWxzZQorICBpZiAoKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMCkgfHwgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMSkgfHwKKyAgICAgIChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjIpIHx8IChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjMpIHx8CisgICAgICAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFI1KSB8fCAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFI2KSB8fAorICAgICAgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSNykgfHwgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSOCkgfHwKKyAgICAgIChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjExKSkKKyNlbmRpZiAvKiBUSU01ICYmIFRJTTIwICovCisgIHsKKyAgICAvKiBTZWxlY3QgdGhlIElucHV0IHRyaWdnZXIgKi8KKyAgICBodGltLT5JbnN0YW5jZS0+U01DUiAmPSB+VElNX1NNQ1JfVFM7CisgICAgaHRpbS0+SW5zdGFuY2UtPlNNQ1IgfD0gSW5wdXRUcmlnZ2VyOworICB9CisKKyAgLyogU2VsZWN0IHRoZSBDYXB0dXJlIENvbXBhcmUgcHJlbG9hZCBmZWF0dXJlICovCisgIGh0aW0tPkluc3RhbmNlLT5DUjIgfD0gVElNX0NSMl9DQ1BDOworICAvKiBTZWxlY3QgdGhlIENvbW11dGF0aW9uIGV2ZW50IHNvdXJjZSAqLworICBodGltLT5JbnN0YW5jZS0+Q1IyICY9IH5USU1fQ1IyX0NDVVM7CisgIGh0aW0tPkluc3RhbmNlLT5DUjIgfD0gQ29tbXV0YXRpb25Tb3VyY2U7CisKKyAgLyogRW5hYmxlIHRoZSBDb21tdXRhdGlvbiBETUEgUmVxdWVzdCAqLworICAvKiBTZXQgdGhlIERNQSBDb21tdXRhdGlvbiBDYWxsYmFjayAqLworICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ09NTVVUQVRJT05dLT5YZmVyQ3BsdENhbGxiYWNrID0KKyAgICAgIFRJTUV4X0RNQUNvbW11dGF0aW9uQ3BsdDsKKyAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NPTU1VVEFUSU9OXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPQorICAgICAgVElNRXhfRE1BQ29tbXV0YXRpb25IYWxmQ3BsdDsKKyAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NPTU1VVEFUSU9OXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3I7CisKKyAgLyogRGlzYWJsZSBDb21tdXRhdGlvbiBJbnRlcnJ1cHQgKi8KKyAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NPTSk7CisKKyAgLyogRW5hYmxlIHRoZSBDb21tdXRhdGlvbiBETUEgUmVxdWVzdCAqLworICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBUSU1fRE1BX0NPTSk7CisKKyAgX19IQUxfVU5MT0NLKGh0aW0pOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBUSU0gaW4gbWFzdGVyIG1vZGUuCisgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZS4KKyAqIEBwYXJhbSAgc01hc3RlckNvbmZpZyBwb2ludGVyIHRvIGEgVElNX01hc3RlckNvbmZpZ1R5cGVEZWYgc3RydWN0dXJlIHRoYXQKKyAqICAgICAgICAgY29udGFpbnMgdGhlIHNlbGVjdGVkIHRyaWdnZXIgb3V0cHV0IChUUkdPKSBhbmQgdGhlIE1hc3Rlci9TbGF2ZQorICogICAgICAgICBtb2RlLgorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9NYXN0ZXJDb25maWdTeW5jaHJvbml6YXRpb24oCisgICAgVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIGNvbnN0IFRJTV9NYXN0ZXJDb25maWdUeXBlRGVmICpzTWFzdGVyQ29uZmlnKSB7CisgIHVpbnQzMl90IHRtcGNyMjsKKyAgdWludDMyX3QgdG1wc21jcjsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX01BU1RFUl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX1RSR09fU09VUkNFKHNNYXN0ZXJDb25maWctPk1hc3Rlck91dHB1dFRyaWdnZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9NU01fU1RBVEUoc01hc3RlckNvbmZpZy0+TWFzdGVyU2xhdmVNb2RlKSk7CisKKyAgLyogQ2hlY2sgaW5wdXQgc3RhdGUgKi8KKyAgX19IQUxfTE9DSyhodGltKTsKKworICAvKiBDaGFuZ2UgdGhlIGhhbmRsZXIgc3RhdGUgKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CisKKyAgLyogR2V0IHRoZSBUSU14IENSMiByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjcjIgPSBodGltLT5JbnN0YW5jZS0+Q1IyOworCisgIC8qIEdldCB0aGUgVElNeCBTTUNSIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcHNtY3IgPSBodGltLT5JbnN0YW5jZS0+U01DUjsKKworICAvKiBJZiB0aGUgdGltZXIgc3VwcG9ydHMgQURDIHN5bmNocm9uaXphdGlvbiB0aHJvdWdoIFRSR08yLCBzZXQgdGhlIG1hc3RlcgorICAgKiBtb2RlIHNlbGVjdGlvbiAyICovCisgIGlmIChJU19USU1fVFJHTzJfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKSB7CisgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfVElNX1RSR08yX1NPVVJDRShzTWFzdGVyQ29uZmlnLT5NYXN0ZXJPdXRwdXRUcmlnZ2VyMikpOworCisgICAgLyogQ2xlYXIgdGhlIE1NUzIgYml0cyAqLworICAgIHRtcGNyMiAmPSB+VElNX0NSMl9NTVMyOworICAgIC8qIFNlbGVjdCB0aGUgVFJHTzIgc291cmNlKi8KKyAgICB0bXBjcjIgfD0gc01hc3RlckNvbmZpZy0+TWFzdGVyT3V0cHV0VHJpZ2dlcjI7CisgIH0KKworICAvKiBSZXNldCB0aGUgTU1TIEJpdHMgKi8KKyAgdG1wY3IyICY9IH5USU1fQ1IyX01NUzsKKyAgLyogU2VsZWN0IHRoZSBUUkdPIHNvdXJjZSAqLworICB0bXBjcjIgfD0gc01hc3RlckNvbmZpZy0+TWFzdGVyT3V0cHV0VHJpZ2dlcjsKKworICAvKiBVcGRhdGUgVElNeCBDUjIgKi8KKyAgaHRpbS0+SW5zdGFuY2UtPkNSMiA9IHRtcGNyMjsKKworICBpZiAoSVNfVElNX1NMQVZFX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSkgeworICAgIC8qIFJlc2V0IHRoZSBNU00gQml0ICovCisgICAgdG1wc21jciAmPSB+VElNX1NNQ1JfTVNNOworICAgIC8qIFNldCBtYXN0ZXIgbW9kZSAqLworICAgIHRtcHNtY3IgfD0gc01hc3RlckNvbmZpZy0+TWFzdGVyU2xhdmVNb2RlOworCisgICAgLyogVXBkYXRlIFRJTXggU01DUiAqLworICAgIGh0aW0tPkluc3RhbmNlLT5TTUNSID0gdG1wc21jcjsKKyAgfQorCisgIC8qIENoYW5nZSB0aGUgaHRpbSBzdGF0ZSAqLworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisKKyAgX19IQUxfVU5MT0NLKGh0aW0pOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBCcmVhayBmZWF0dXJlLCBkZWFkIHRpbWUsIExvY2sgbGV2ZWwsIE9TU0kvT1NTUiBTdGF0ZQorICogICAgICAgICBhbmQgdGhlIEFPRShhdXRvbWF0aWMgb3V0cHV0IGVuYWJsZSkuCisgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICogQHBhcmFtICBzQnJlYWtEZWFkVGltZUNvbmZpZyBwb2ludGVyIHRvIGEgVElNX0NvbmZpZ0JyZWFrRGVhZENvbmZpZ1R5cGVEZWYKKyAqIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoZSBCRFRSIFJlZ2lzdGVyIGNvbmZpZ3VyYXRpb24gIGluZm9ybWF0aW9uIGZvciB0aGUKKyAqIFRJTSBwZXJpcGhlcmFsLgorICogQG5vdGUgICBJbnRlcnJ1cHRzIGNhbiBiZSBnZW5lcmF0ZWQgd2hlbiBhbiBhY3RpdmUgbGV2ZWwgaXMgZGV0ZWN0ZWQgb24gdGhlCisgKiAgICAgICAgIGJyZWFrIGlucHV0LCB0aGUgYnJlYWsgMiBpbnB1dCBvciB0aGUgc3lzdGVtIGJyZWFrIGlucHV0LiBCcmVhaworICogICAgICAgICBpbnRlcnJ1cHQgY2FuIGJlIGVuYWJsZWQgYnkgY2FsbGluZyB0aGUgQHJlZiBfX0hBTF9USU1fRU5BQkxFX0lUCisgKiBtYWNyby4KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfQ29uZmlnQnJlYWtEZWFkVGltZSgKKyAgICBUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwKKyAgICBjb25zdCBUSU1fQnJlYWtEZWFkVGltZUNvbmZpZ1R5cGVEZWYgKnNCcmVha0RlYWRUaW1lQ29uZmlnKSB7CisgIC8qIEtlZXAgdGhpcyB2YXJpYWJsZSBpbml0aWFsaXplZCB0byAwIGFzIGl0IGlzIHVzZWQgdG8gY29uZmlndXJlIEJEVFIKKyAgICogcmVnaXN0ZXIgKi8KKyAgdWludDMyX3QgdG1wYmR0ciA9IDBVOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQlJFQUtfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PU1NSX1NUQVRFKHNCcmVha0RlYWRUaW1lQ29uZmlnLT5PZmZTdGF0ZVJ1bk1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PU1NJX1NUQVRFKHNCcmVha0RlYWRUaW1lQ29uZmlnLT5PZmZTdGF0ZUlETEVNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fTE9DS19MRVZFTChzQnJlYWtEZWFkVGltZUNvbmZpZy0+TG9ja0xldmVsKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fREVBRFRJTUUoc0JyZWFrRGVhZFRpbWVDb25maWctPkRlYWRUaW1lKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fQlJFQUtfU1RBVEUoc0JyZWFrRGVhZFRpbWVDb25maWctPkJyZWFrU3RhdGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9CUkVBS19QT0xBUklUWShzQnJlYWtEZWFkVGltZUNvbmZpZy0+QnJlYWtQb2xhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0JSRUFLX0ZJTFRFUihzQnJlYWtEZWFkVGltZUNvbmZpZy0+QnJlYWtGaWx0ZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKAorICAgICAgSVNfVElNX0FVVE9NQVRJQ19PVVRQVVRfU1RBVEUoc0JyZWFrRGVhZFRpbWVDb25maWctPkF1dG9tYXRpY091dHB1dCkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0JSRUFLX0FGTU9ERShzQnJlYWtEZWFkVGltZUNvbmZpZy0+QnJlYWtBRk1vZGUpKTsKKworICAvKiBDaGVjayBpbnB1dCBzdGF0ZSAqLworICBfX0hBTF9MT0NLKGh0aW0pOworCisgIC8qIFNldCB0aGUgTG9jayBsZXZlbCwgdGhlIEJyZWFrIGVuYWJsZSBCaXQgYW5kIHRoZSBQb2xhcml0eSwgdGhlIE9TU1IgU3RhdGUsCisgICAgIHRoZSBPU1NJIFN0YXRlLCB0aGUgZGVhZCB0aW1lIHZhbHVlIGFuZCB0aGUgQXV0b21hdGljIE91dHB1dCBFbmFibGUgQml0ICovCisKKyAgLyogU2V0IHRoZSBCRFRSIGJpdHMgKi8KKyAgTU9ESUZZX1JFRyh0bXBiZHRyLCBUSU1fQkRUUl9EVEcsIHNCcmVha0RlYWRUaW1lQ29uZmlnLT5EZWFkVGltZSk7CisgIE1PRElGWV9SRUcodG1wYmR0ciwgVElNX0JEVFJfTE9DSywgc0JyZWFrRGVhZFRpbWVDb25maWctPkxvY2tMZXZlbCk7CisgIE1PRElGWV9SRUcodG1wYmR0ciwgVElNX0JEVFJfT1NTSSwgc0JyZWFrRGVhZFRpbWVDb25maWctPk9mZlN0YXRlSURMRU1vZGUpOworICBNT0RJRllfUkVHKHRtcGJkdHIsIFRJTV9CRFRSX09TU1IsIHNCcmVha0RlYWRUaW1lQ29uZmlnLT5PZmZTdGF0ZVJ1bk1vZGUpOworICBNT0RJRllfUkVHKHRtcGJkdHIsIFRJTV9CRFRSX0JLRSwgc0JyZWFrRGVhZFRpbWVDb25maWctPkJyZWFrU3RhdGUpOworICBNT0RJRllfUkVHKHRtcGJkdHIsIFRJTV9CRFRSX0JLUCwgc0JyZWFrRGVhZFRpbWVDb25maWctPkJyZWFrUG9sYXJpdHkpOworICBNT0RJRllfUkVHKHRtcGJkdHIsIFRJTV9CRFRSX0FPRSwgc0JyZWFrRGVhZFRpbWVDb25maWctPkF1dG9tYXRpY091dHB1dCk7CisgIE1PRElGWV9SRUcodG1wYmR0ciwgVElNX0JEVFJfQktGLAorICAgICAgICAgICAgIChzQnJlYWtEZWFkVGltZUNvbmZpZy0+QnJlYWtGaWx0ZXIgPDwgVElNX0JEVFJfQktGX1BvcykpOworICBNT0RJRllfUkVHKHRtcGJkdHIsIFRJTV9CRFRSX0JLQklELCBzQnJlYWtEZWFkVGltZUNvbmZpZy0+QnJlYWtBRk1vZGUpOworCisgIGlmIChJU19USU1fQktJTjJfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKSB7CisgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0JSRUFLMl9TVEFURShzQnJlYWtEZWFkVGltZUNvbmZpZy0+QnJlYWsyU3RhdGUpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0JSRUFLMl9QT0xBUklUWShzQnJlYWtEZWFkVGltZUNvbmZpZy0+QnJlYWsyUG9sYXJpdHkpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0JSRUFLX0ZJTFRFUihzQnJlYWtEZWFkVGltZUNvbmZpZy0+QnJlYWsyRmlsdGVyKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9CUkVBSzJfQUZNT0RFKHNCcmVha0RlYWRUaW1lQ29uZmlnLT5CcmVhazJBRk1vZGUpKTsKKworICAgIC8qIFNldCB0aGUgQlJFQUsyIGlucHV0IHJlbGF0ZWQgQkRUUiBiaXRzICovCisgICAgTU9ESUZZX1JFRyh0bXBiZHRyLCBUSU1fQkRUUl9CSzJGLAorICAgICAgICAgICAgICAgKHNCcmVha0RlYWRUaW1lQ29uZmlnLT5CcmVhazJGaWx0ZXIgPDwgVElNX0JEVFJfQksyRl9Qb3MpKTsKKyAgICBNT0RJRllfUkVHKHRtcGJkdHIsIFRJTV9CRFRSX0JLMkUsIHNCcmVha0RlYWRUaW1lQ29uZmlnLT5CcmVhazJTdGF0ZSk7CisgICAgTU9ESUZZX1JFRyh0bXBiZHRyLCBUSU1fQkRUUl9CSzJQLCBzQnJlYWtEZWFkVGltZUNvbmZpZy0+QnJlYWsyUG9sYXJpdHkpOworICAgIE1PRElGWV9SRUcodG1wYmR0ciwgVElNX0JEVFJfQksyQklELCBzQnJlYWtEZWFkVGltZUNvbmZpZy0+QnJlYWsyQUZNb2RlKTsKKyAgfQorCisgIC8qIFNldCBUSU14X0JEVFIgKi8KKyAgaHRpbS0+SW5zdGFuY2UtPkJEVFIgPSB0bXBiZHRyOworCisgIF9fSEFMX1VOTE9DSyhodGltKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgYnJlYWsgaW5wdXQgc291cmNlLgorICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUuCisgKiBAcGFyYW0gIEJyZWFrSW5wdXQgQnJlYWsgaW5wdXQgdG8gY29uZmlndXJlCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIFRJTV9CUkVBS0lOUFVUX0JSSzogVGltZXIgYnJlYWsgaW5wdXQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQlJFQUtJTlBVVF9CUksyOiBUaW1lciBicmVhayAyIGlucHV0CisgKiBAcGFyYW0gIHNCcmVha0lucHV0Q29uZmlnIEJyZWFrIGlucHV0IHNvdXJjZSBjb25maWd1cmF0aW9uCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0NvbmZpZ0JyZWFrSW5wdXQoCisgICAgVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IEJyZWFrSW5wdXQsCisgICAgY29uc3QgVElNRXhfQnJlYWtJbnB1dENvbmZpZ1R5cGVEZWYgKnNCcmVha0lucHV0Q29uZmlnKSB7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKyAgdWludDMyX3QgdG1wb3J4OworICB1aW50MzJfdCBia2luX2VuYWJsZV9tYXNrOworICB1aW50MzJfdCBia2luX3BvbGFyaXR5X21hc2s7CisgIHVpbnQzMl90IGJraW5fZW5hYmxlX2JpdHBvczsKKyAgdWludDMyX3QgYmtpbl9wb2xhcml0eV9iaXRwb3M7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9CUkVBS19JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0JSRUFLSU5QVVQoQnJlYWtJbnB1dCkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0JSRUFLSU5QVVRTT1VSQ0Uoc0JyZWFrSW5wdXRDb25maWctPlNvdXJjZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0JSRUFLSU5QVVRTT1VSQ0VfU1RBVEUoc0JyZWFrSW5wdXRDb25maWctPkVuYWJsZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0JSRUFLSU5QVVRTT1VSQ0VfUE9MQVJJVFkoc0JyZWFrSW5wdXRDb25maWctPlBvbGFyaXR5KSk7CisKKyAgLyogQ2hlY2sgaW5wdXQgc3RhdGUgKi8KKyAgX19IQUxfTE9DSyhodGltKTsKKworICBzd2l0Y2ggKHNCcmVha0lucHV0Q29uZmlnLT5Tb3VyY2UpIHsKKyAgICBjYXNlIFRJTV9CUkVBS0lOUFVUU09VUkNFX0JLSU46IHsKKyAgICAgIGJraW5fZW5hYmxlX21hc2sgPSBUSU0xX0FGMV9CS0lORTsKKyAgICAgIGJraW5fZW5hYmxlX2JpdHBvcyA9IFRJTTFfQUYxX0JLSU5FX1BvczsKKyAgICAgIGJraW5fcG9sYXJpdHlfbWFzayA9IFRJTTFfQUYxX0JLSU5QOworICAgICAgYmtpbl9wb2xhcml0eV9iaXRwb3MgPSBUSU0xX0FGMV9CS0lOUF9Qb3M7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBUSU1fQlJFQUtJTlBVVFNPVVJDRV9DT01QMTogeworICAgICAgYmtpbl9lbmFibGVfbWFzayA9IFRJTTFfQUYxX0JLQ01QMUU7CisgICAgICBia2luX2VuYWJsZV9iaXRwb3MgPSBUSU0xX0FGMV9CS0NNUDFFX1BvczsKKyAgICAgIGJraW5fcG9sYXJpdHlfbWFzayA9IFRJTTFfQUYxX0JLQ01QMVA7CisgICAgICBia2luX3BvbGFyaXR5X2JpdHBvcyA9IFRJTTFfQUYxX0JLQ01QMVBfUG9zOworICAgICAgYnJlYWs7CisgICAgfQorI2lmIGRlZmluZWQoQ09NUDIpCisgICAgY2FzZSBUSU1fQlJFQUtJTlBVVFNPVVJDRV9DT01QMjogeworICAgICAgYmtpbl9lbmFibGVfbWFzayA9IFRJTTFfQUYxX0JLQ01QMkU7CisgICAgICBia2luX2VuYWJsZV9iaXRwb3MgPSBUSU0xX0FGMV9CS0NNUDJFX1BvczsKKyAgICAgIGJraW5fcG9sYXJpdHlfbWFzayA9IFRJTTFfQUYxX0JLQ01QMlA7CisgICAgICBia2luX3BvbGFyaXR5X2JpdHBvcyA9IFRJTTFfQUYxX0JLQ01QMlBfUG9zOworICAgICAgYnJlYWs7CisgICAgfQorI2VuZGlmIC8qIENPTVAyICovCisgICAgY2FzZSBUSU1fQlJFQUtJTlBVVFNPVVJDRV9DT01QMzogeworICAgICAgYmtpbl9lbmFibGVfbWFzayA9IFRJTTFfQUYxX0JLQ01QM0U7CisgICAgICBia2luX2VuYWJsZV9iaXRwb3MgPSBUSU0xX0FGMV9CS0NNUDNFX1BvczsKKyAgICAgIGJraW5fcG9sYXJpdHlfbWFzayA9IFRJTTFfQUYxX0JLQ01QM1A7CisgICAgICBia2luX3BvbGFyaXR5X2JpdHBvcyA9IFRJTTFfQUYxX0JLQ01QM1BfUG9zOworICAgICAgYnJlYWs7CisgICAgfQorI2lmIGRlZmluZWQoQ09NUDQpCisgICAgY2FzZSBUSU1fQlJFQUtJTlBVVFNPVVJDRV9DT01QNDogeworICAgICAgYmtpbl9lbmFibGVfbWFzayA9IFRJTTFfQUYxX0JLQ01QNEU7CisgICAgICBia2luX2VuYWJsZV9iaXRwb3MgPSBUSU0xX0FGMV9CS0NNUDRFX1BvczsKKyAgICAgIGJraW5fcG9sYXJpdHlfbWFzayA9IFRJTTFfQUYxX0JLQ01QNFA7CisgICAgICBia2luX3BvbGFyaXR5X2JpdHBvcyA9IFRJTTFfQUYxX0JLQ01QNFBfUG9zOworICAgICAgYnJlYWs7CisgICAgfQorI2VuZGlmIC8qIENPTVA0ICovCisjaWYgZGVmaW5lZChDT01QNSkKKyAgICBjYXNlIFRJTV9CUkVBS0lOUFVUU09VUkNFX0NPTVA1OiB7CisgICAgICBia2luX2VuYWJsZV9tYXNrID0gVElNMV9BRjFfQktDTVA1RTsKKyAgICAgIGJraW5fZW5hYmxlX2JpdHBvcyA9IFRJTTFfQUYxX0JLQ01QNUVfUG9zOworICAgICAgLyogTm8gcGFsYXJpdHkgYml0IGZvciB0aGlzIENPTVAuIFZhcmlhYmxlIGJraW5fcG9sYXJpdHlfbWFzayBrZWVwcyBpdHMKKyAgICAgICAqIGRlZmF1bHQgdmFsdWUgMCAqLworICAgICAgYmtpbl9wb2xhcml0eV9tYXNrID0gMFU7CisgICAgICBia2luX3BvbGFyaXR5X2JpdHBvcyA9IDBVOworICAgICAgYnJlYWs7CisgICAgfQorI2VuZGlmIC8qIENPTVA1ICovCisjaWYgZGVmaW5lZChDT01QNikKKyAgICBjYXNlIFRJTV9CUkVBS0lOUFVUU09VUkNFX0NPTVA2OiB7CisgICAgICBia2luX2VuYWJsZV9tYXNrID0gVElNMV9BRjFfQktDTVA2RTsKKyAgICAgIGJraW5fZW5hYmxlX2JpdHBvcyA9IFRJTTFfQUYxX0JLQ01QNkVfUG9zOworICAgICAgLyogTm8gcGFsYXJpdHkgYml0IGZvciB0aGlzIENPTVAuIFZhcmlhYmxlIGJraW5fcG9sYXJpdHlfbWFzayBrZWVwcyBpdHMKKyAgICAgICAqIGRlZmF1bHQgdmFsdWUgMCAqLworICAgICAgYmtpbl9wb2xhcml0eV9tYXNrID0gMFU7CisgICAgICBia2luX3BvbGFyaXR5X2JpdHBvcyA9IDBVOworICAgICAgYnJlYWs7CisgICAgfQorI2VuZGlmIC8qIENPTVA3ICovCisjaWYgZGVmaW5lZChDT01QNykKKyAgICBjYXNlIFRJTV9CUkVBS0lOUFVUU09VUkNFX0NPTVA3OiB7CisgICAgICBia2luX2VuYWJsZV9tYXNrID0gVElNMV9BRjFfQktDTVA3RTsKKyAgICAgIGJraW5fZW5hYmxlX2JpdHBvcyA9IFRJTTFfQUYxX0JLQ01QN0VfUG9zOworICAgICAgLyogTm8gcGFsYXJpdHkgYml0IGZvciB0aGlzIENPTVAuIFZhcmlhYmxlIGJraW5fcG9sYXJpdHlfbWFzayBrZWVwcyBpdHMKKyAgICAgICAqIGRlZmF1bHQgdmFsdWUgMCAqLworICAgICAgYmtpbl9wb2xhcml0eV9tYXNrID0gMFU7CisgICAgICBia2luX3BvbGFyaXR5X2JpdHBvcyA9IDBVOworICAgICAgYnJlYWs7CisgICAgfQorI2VuZGlmIC8qIENPTVA3ICovCisKKyAgICBkZWZhdWx0OiB7CisgICAgICBia2luX2VuYWJsZV9tYXNrID0gMFU7CisgICAgICBia2luX3BvbGFyaXR5X21hc2sgPSAwVTsKKyAgICAgIGJraW5fZW5hYmxlX2JpdHBvcyA9IDBVOworICAgICAgYmtpbl9wb2xhcml0eV9iaXRwb3MgPSAwVTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIHN3aXRjaCAoQnJlYWtJbnB1dCkgeworICAgIGNhc2UgVElNX0JSRUFLSU5QVVRfQlJLOiB7CisgICAgICAvKiBHZXQgdGhlIFRJTXhfQUYxIHJlZ2lzdGVyIHZhbHVlICovCisgICAgICB0bXBvcnggPSBodGltLT5JbnN0YW5jZS0+QUYxOworCisgICAgICAvKiBFbmFibGUgdGhlIGJyZWFrIGlucHV0ICovCisgICAgICB0bXBvcnggJj0gfmJraW5fZW5hYmxlX21hc2s7CisgICAgICB0bXBvcnggfD0KKyAgICAgICAgICAoc0JyZWFrSW5wdXRDb25maWctPkVuYWJsZSA8PCBia2luX2VuYWJsZV9iaXRwb3MpICYgYmtpbl9lbmFibGVfbWFzazsKKworICAgICAgLyogU2V0IHRoZSBicmVhayBpbnB1dCBwb2xhcml0eSAqLworICAgICAgdG1wb3J4ICY9IH5ia2luX3BvbGFyaXR5X21hc2s7CisgICAgICB0bXBvcnggfD0gKHNCcmVha0lucHV0Q29uZmlnLT5Qb2xhcml0eSA8PCBia2luX3BvbGFyaXR5X2JpdHBvcykgJgorICAgICAgICAgICAgICAgIGJraW5fcG9sYXJpdHlfbWFzazsKKworICAgICAgLyogU2V0IFRJTXhfQUYxICovCisgICAgICBodGltLT5JbnN0YW5jZS0+QUYxID0gdG1wb3J4OworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVElNX0JSRUFLSU5QVVRfQlJLMjogeworICAgICAgLyogR2V0IHRoZSBUSU14X0FGMiByZWdpc3RlciB2YWx1ZSAqLworICAgICAgdG1wb3J4ID0gaHRpbS0+SW5zdGFuY2UtPkFGMjsKKworICAgICAgLyogRW5hYmxlIHRoZSBicmVhayBpbnB1dCAqLworICAgICAgdG1wb3J4ICY9IH5ia2luX2VuYWJsZV9tYXNrOworICAgICAgdG1wb3J4IHw9CisgICAgICAgICAgKHNCcmVha0lucHV0Q29uZmlnLT5FbmFibGUgPDwgYmtpbl9lbmFibGVfYml0cG9zKSAmIGJraW5fZW5hYmxlX21hc2s7CisKKyAgICAgIC8qIFNldCB0aGUgYnJlYWsgaW5wdXQgcG9sYXJpdHkgKi8KKyAgICAgIHRtcG9yeCAmPSB+Ymtpbl9wb2xhcml0eV9tYXNrOworICAgICAgdG1wb3J4IHw9IChzQnJlYWtJbnB1dENvbmZpZy0+UG9sYXJpdHkgPDwgYmtpbl9wb2xhcml0eV9iaXRwb3MpICYKKyAgICAgICAgICAgICAgICBia2luX3BvbGFyaXR5X21hc2s7CisKKyAgICAgIC8qIFNldCBUSU14X0FGMiAqLworICAgICAgaHRpbS0+SW5zdGFuY2UtPkFGMiA9IHRtcG9yeDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgICAgYnJlYWs7CisgIH0KKworICBfX0hBTF9VTkxPQ0soaHRpbSk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIFRJTXggUmVtYXBwaW5nIGlucHV0IGNhcGFiaWxpdGllcy4KKyAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlLgorICogQHBhcmFtICBSZW1hcCBzcGVjaWZpZXMgdGhlIFRJTSByZW1hcHBpbmcgc291cmNlLgorICogICAgICAgICBGb3IgVElNMSwgdGhlIHBhcmFtZXRlciBjYW4gdGFrZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTFfRVRSX0dQSU8gICAgICAgICAgIFRJTTEgRVRSIGlzIGNvbm5lY3RlZCB0byBHUElPCisgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTFfRVRSX0NPTVAxICAgICAgICAgIFRJTTEgRVRSIGlzIGNvbm5lY3RlZCB0byBDT01QMQorICogb3V0cHV0CisgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTFfRVRSX0NPTVAyICAgICAgICAgIFRJTTEgRVRSIGlzIGNvbm5lY3RlZCB0byBDT01QMgorICogb3V0cHV0CisgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTFfRVRSX0NPTVAzICAgICAgICAgIFRJTTEgRVRSIGlzIGNvbm5lY3RlZCB0byBDT01QMworICogb3V0cHV0CisgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTFfRVRSX0NPTVA0ICAgICAgICAgIFRJTTEgRVRSIGlzIGNvbm5lY3RlZCB0byBDT01QNAorICogb3V0cHV0CisgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTFfRVRSX0NPTVA1ICAgICAgICAgIFRJTTEgRVRSIGlzIGNvbm5lY3RlZCB0byBDT01QNQorICogb3V0cHV0ICAgICgqKQorICogICAgICAgICAgICBAYXJnIFRJTV9USU0xX0VUUl9DT01QNiAgICAgICAgICBUSU0xIEVUUiBpcyBjb25uZWN0ZWQgdG8gQ09NUDYKKyAqIG91dHB1dCAgICAoKikKKyAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMV9FVFJfQ09NUDcgICAgICAgICAgVElNMSBFVFIgaXMgY29ubmVjdGVkIHRvIENPTVA3CisgKiBvdXRwdXQgICAgKCopCisgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTFfRVRSX0FEQzFfQVdEMSAgICAgIFRJTTEgRVRSIGlzIGNvbm5lY3RlZCB0byBBREMxCisgKiBBV0QxCisgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTFfRVRSX0FEQzFfQVdEMiAgICAgIFRJTTEgRVRSIGlzIGNvbm5lY3RlZCB0byBBREMxCisgKiBBV0QyCisgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTFfRVRSX0FEQzFfQVdEMyAgICAgIFRJTTEgRVRSIGlzIGNvbm5lY3RlZCB0byBBREMxCisgKiBBV0QzCisgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTFfRVRSX0FEQzRfQVdEMSAgICAgIFRJTTEgRVRSIGlzIGNvbm5lY3RlZCB0byBBREM0CisgKiBBV0QxICAgICAgICgqKQorICogICAgICAgICAgICBAYXJnIFRJTV9USU0xX0VUUl9BREM0X0FXRDIgICAgICBUSU0xIEVUUiBpcyBjb25uZWN0ZWQgdG8gQURDNAorICogQVdEMiAgICAgICAoKikKKyAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMV9FVFJfQURDNF9BV0QzICAgICAgVElNMSBFVFIgaXMgY29ubmVjdGVkIHRvIEFEQzQKKyAqIEFXRDMgICAgICAgKCopCisgKgorICogICAgICAgICBGb3IgVElNMiwgdGhlIHBhcmFtZXRlciBjYW4gdGFrZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTJfRVRSX0dQSU8gICAgICAgICAgIFRJTTIgRVRSIGlzIGNvbm5lY3RlZCB0byBHUElPCisgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTJfRVRSX0NPTVAxICAgICAgICAgIFRJTTIgRVRSIGlzIGNvbm5lY3RlZCB0byBDT01QMQorICogb3V0cHV0CisgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTJfRVRSX0NPTVAyICAgICAgICAgIFRJTTIgRVRSIGlzIGNvbm5lY3RlZCB0byBDT01QMgorICogb3V0cHV0CisgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTJfRVRSX0NPTVAzICAgICAgICAgIFRJTTIgRVRSIGlzIGNvbm5lY3RlZCB0byBDT01QMworICogb3V0cHV0CisgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTJfRVRSX0NPTVA0ICAgICAgICAgIFRJTTIgRVRSIGlzIGNvbm5lY3RlZCB0byBDT01QNAorICogb3V0cHV0CisgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTJfRVRSX0NPTVA1ICAgICAgICAgIFRJTTIgRVRSIGlzIGNvbm5lY3RlZCB0byBDT01QNQorICogb3V0cHV0ICAgICgqKQorICogICAgICAgICAgICBAYXJnIFRJTV9USU0yX0VUUl9DT01QNiAgICAgICAgICBUSU0yIEVUUiBpcyBjb25uZWN0ZWQgdG8gQ09NUDYKKyAqIG91dHB1dCAgICAoKikKKyAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMl9FVFJfQ09NUDcgICAgICAgICAgVElNMiBFVFIgaXMgY29ubmVjdGVkIHRvIENPTVA3CisgKiBvdXRwdXQgICAgKCopCisgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTJfRVRSX1RJTTNfRVRSICAgICAgIFRJTTIgRVRSIGlzIGNvbm5lY3RlZCB0byBUSU0zIEVUUgorICogcGluCisgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTJfRVRSX1RJTTRfRVRSICAgICAgIFRJTTIgRVRSIGlzIGNvbm5lY3RlZCB0byBUSU00IEVUUgorICogcGluCisgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTJfRVRSX1RJTTVfRVRSICAgICAgIFRJTTIgRVRSIGlzIGNvbm5lY3RlZCB0byBUSU01IEVUUgorICogcGluICAgICgqKQorICogICAgICAgICAgICBAYXJnIFRJTV9USU0yX0VUUl9MU0UKKyAqCisgKiAgICAgICAgIEZvciBUSU0zLCB0aGUgcGFyYW1ldGVyIGNhbiB0YWtlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBUSU1fVElNM19FVFJfR1BJTyAgICAgICAgICAgVElNMyBFVFIgaXMgY29ubmVjdGVkIHRvIEdQSU8KKyAqICAgICAgICAgICAgQGFyZyBUSU1fVElNM19FVFJfQ09NUDEgICAgICAgICAgVElNMyBFVFIgaXMgY29ubmVjdGVkIHRvIENPTVAxCisgKiBvdXRwdXQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fVElNM19FVFJfQ09NUDIgICAgICAgICAgVElNMyBFVFIgaXMgY29ubmVjdGVkIHRvIENPTVAyCisgKiBvdXRwdXQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fVElNM19FVFJfQ09NUDMgICAgICAgICAgVElNMyBFVFIgaXMgY29ubmVjdGVkIHRvIENPTVAzCisgKiBvdXRwdXQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fVElNM19FVFJfQ09NUDQgICAgICAgICAgVElNMyBFVFIgaXMgY29ubmVjdGVkIHRvIENPTVA0CisgKiBvdXRwdXQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fVElNM19FVFJfQ09NUDUgICAgICAgICAgVElNMyBFVFIgaXMgY29ubmVjdGVkIHRvIENPTVA1CisgKiBvdXRwdXQgICAgKCopCisgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTNfRVRSX0NPTVA2ICAgICAgICAgIFRJTTMgRVRSIGlzIGNvbm5lY3RlZCB0byBDT01QNgorICogb3V0cHV0ICAgICgqKQorICogICAgICAgICAgICBAYXJnIFRJTV9USU0zX0VUUl9DT01QNyAgICAgICAgICBUSU0zIEVUUiBpcyBjb25uZWN0ZWQgdG8gQ09NUDcKKyAqIG91dHB1dCAgICAoKikKKyAqICAgICAgICAgICAgQGFyZyBUSU1fVElNM19FVFJfVElNMl9FVFIgICAgICAgVElNMyBFVFIgaXMgY29ubmVjdGVkIHRvIFRJTTIgRVRSCisgKiBwaW4KKyAqICAgICAgICAgICAgQGFyZyBUSU1fVElNM19FVFJfVElNNF9FVFIgICAgICAgVElNMyBFVFIgaXMgY29ubmVjdGVkIHRvIFRJTTQgRVRSCisgKiBwaW4KKyAqICAgICAgICAgICAgQGFyZyBUSU1fVElNM19FVFJfQURDMl9BV0QxICAgICAgVElNMyBFVFIgaXMgY29ubmVjdGVkIHRvIEFEQzIKKyAqIEFXRDEKKyAqICAgICAgICAgICAgQGFyZyBUSU1fVElNM19FVFJfQURDMl9BV0QyICAgICAgVElNMyBFVFIgaXMgY29ubmVjdGVkIHRvIEFEQzIKKyAqIEFXRDIKKyAqICAgICAgICAgICAgQGFyZyBUSU1fVElNM19FVFJfQURDMl9BV0QzICAgICAgVElNMyBFVFIgaXMgY29ubmVjdGVkIHRvIEFEQzIKKyAqIEFXRDMKKyAqCisgKiAgICAgICAgIEZvciBUSU00LCB0aGUgcGFyYW1ldGVyIGNhbiB0YWtlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBUSU1fVElNNF9FVFJfR1BJTyAgICAgICAgICAgVElNNCBFVFIgaXMgY29ubmVjdGVkIHRvIEdQSU8KKyAqICAgICAgICAgICAgQGFyZyBUSU1fVElNNF9FVFJfQ09NUDEgICAgICAgICAgVElNNCBFVFIgaXMgY29ubmVjdGVkIHRvIENPTVAxCisgKiBvdXRwdXQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fVElNNF9FVFJfQ09NUDIgICAgICAgICAgVElNNCBFVFIgaXMgY29ubmVjdGVkIHRvIENPTVAyCisgKiBvdXRwdXQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fVElNNF9FVFJfQ09NUDMgICAgICAgICAgVElNNCBFVFIgaXMgY29ubmVjdGVkIHRvIENPTVAzCisgKiBvdXRwdXQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fVElNNF9FVFJfQ09NUDQgICAgICAgICAgVElNNCBFVFIgaXMgY29ubmVjdGVkIHRvIENPTVA0CisgKiBvdXRwdXQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fVElNNF9FVFJfQ09NUDUgICAgICAgICAgVElNNCBFVFIgaXMgY29ubmVjdGVkIHRvIENPTVA1CisgKiBvdXRwdXQgICAgKCopCisgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTRfRVRSX0NPTVA2ICAgICAgICAgIFRJTTQgRVRSIGlzIGNvbm5lY3RlZCB0byBDT01QNgorICogb3V0cHV0ICAgICgqKQorICogICAgICAgICAgICBAYXJnIFRJTV9USU00X0VUUl9DT01QNyAgICAgICAgICBUSU00IEVUUiBpcyBjb25uZWN0ZWQgdG8gQ09NUDcKKyAqIG91dHB1dCAgICAoKikKKyAqICAgICAgICAgICAgQGFyZyBUSU1fVElNNF9FVFJfVElNM19FVFIgICAgICAgVElNNCBFVFIgaXMgY29ubmVjdGVkIHRvIFRJTTMgRVRSCisgKiBwaW4KKyAqICAgICAgICAgICAgQGFyZyBUSU1fVElNNF9FVFJfVElNNV9FVFIgICAgICAgVElNNCBFVFIgaXMgY29ubmVjdGVkIHRvIFRJTTUgRVRSCisgKiBwaW4gICAgKCopCisgKgorICogICAgICAgICBGb3IgVElNNSwgdGhlIHBhcmFtZXRlciBjYW4gdGFrZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6ICgqKikKKyAqICAgICAgICAgICAgQGFyZyBUSU1fVElNNV9FVFJfR1BJTyAgICAgICAgICAgVElNNSBFVFIgaXMgY29ubmVjdGVkIHRvIEdQSU8gKCopCisgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTVfRVRSX0NPTVAxICAgICAgICAgIFRJTTUgRVRSIGlzIGNvbm5lY3RlZCB0byBDT01QMQorICogb3V0cHV0ICAgICgqKQorICogICAgICAgICAgICBAYXJnIFRJTV9USU01X0VUUl9DT01QMiAgICAgICAgICBUSU01IEVUUiBpcyBjb25uZWN0ZWQgdG8gQ09NUDIKKyAqIG91dHB1dCAgICAoKikKKyAqICAgICAgICAgICAgQGFyZyBUSU1fVElNNV9FVFJfQ09NUDMgICAgICAgICAgVElNNSBFVFIgaXMgY29ubmVjdGVkIHRvIENPTVAzCisgKiBvdXRwdXQgICAgKCopCisgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTVfRVRSX0NPTVA0ICAgICAgICAgIFRJTTUgRVRSIGlzIGNvbm5lY3RlZCB0byBDT01QNAorICogb3V0cHV0ICAgICgqKQorICogICAgICAgICAgICBAYXJnIFRJTV9USU01X0VUUl9DT01QNSAgICAgICAgICBUSU01IEVUUiBpcyBjb25uZWN0ZWQgdG8gQ09NUDUKKyAqIG91dHB1dCAgICAoKikKKyAqICAgICAgICAgICAgQGFyZyBUSU1fVElNNV9FVFJfQ09NUDYgICAgICAgICAgVElNNSBFVFIgaXMgY29ubmVjdGVkIHRvIENPTVA2CisgKiBvdXRwdXQgICAgKCopCisgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTVfRVRSX0NPTVA3ICAgICAgICAgIFRJTTUgRVRSIGlzIGNvbm5lY3RlZCB0byBDT01QNworICogb3V0cHV0ICAgICgqKQorICogICAgICAgICAgICBAYXJnIFRJTV9USU01X0VUUl9USU0yX0VUUiAgICAgICBUSU01IEVUUiBpcyBjb25uZWN0ZWQgdG8gVElNMiBFVFIKKyAqIHBpbiAgICAoKikKKyAqICAgICAgICAgICAgQGFyZyBUSU1fVElNNV9FVFJfVElNM19FVFIgICAgICAgVElNNSBFVFIgaXMgY29ubmVjdGVkIHRvIFRJTTMgRVRSCisgKiBwaW4gICAgKCopCisgKgorICogICAgICAgICBGb3IgVElNOCwgdGhlIHBhcmFtZXRlciBjYW4gdGFrZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTThfRVRSX0dQSU8gICAgICAgICAgICBUSU04IEVUUiBpcyBjb25uZWN0ZWQgdG8gR1BJTworICogICAgICAgICAgICBAYXJnIFRJTV9USU04X0VUUl9DT01QMSAgICAgICAgICAgVElNOCBFVFIgaXMgY29ubmVjdGVkIHRvIENPTVAxCisgKiBvdXRwdXQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fVElNOF9FVFJfQ09NUDIgICAgICAgICAgIFRJTTggRVRSIGlzIGNvbm5lY3RlZCB0byBDT01QMgorICogb3V0cHV0CisgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTThfRVRSX0NPTVAzICAgICAgICAgICBUSU04IEVUUiBpcyBjb25uZWN0ZWQgdG8gQ09NUDMKKyAqIG91dHB1dAorICogICAgICAgICAgICBAYXJnIFRJTV9USU04X0VUUl9DT01QNCAgICAgICAgICAgVElNOCBFVFIgaXMgY29ubmVjdGVkIHRvIENPTVA0CisgKiBvdXRwdXQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fVElNOF9FVFJfQ09NUDUgICAgICAgICAgIFRJTTggRVRSIGlzIGNvbm5lY3RlZCB0byBDT01QNQorICogb3V0cHV0ICAgICgqKQorICogICAgICAgICAgICBAYXJnIFRJTV9USU04X0VUUl9DT01QNiAgICAgICAgICAgVElNOCBFVFIgaXMgY29ubmVjdGVkIHRvIENPTVA2CisgKiBvdXRwdXQgICAgKCopCisgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTThfRVRSX0NPTVA3ICAgICAgICAgICBUSU04IEVUUiBpcyBjb25uZWN0ZWQgdG8gQ09NUDcKKyAqIG91dHB1dCAgICAoKikKKyAqICAgICAgICAgICAgQGFyZyBUSU1fVElNOF9FVFJfQURDMl9BV0QxICAgICAgIFRJTTggRVRSIGlzIGNvbm5lY3RlZCB0byBBREMyCisgKiBBV0QxCisgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTThfRVRSX0FEQzJfQVdEMiAgICAgICBUSU04IEVUUiBpcyBjb25uZWN0ZWQgdG8gQURDMgorICogQVdEMgorICogICAgICAgICAgICBAYXJnIFRJTV9USU04X0VUUl9BREMyX0FXRDMgICAgICAgVElNOCBFVFIgaXMgY29ubmVjdGVkIHRvIEFEQzIKKyAqIEFXRDMKKyAqICAgICAgICAgICAgQGFyZyBUSU1fVElNOF9FVFJfQURDM19BV0QxICAgICAgIFRJTTggRVRSIGlzIGNvbm5lY3RlZCB0byBBREMzCisgKiBBV0QxICAgICAgICgqKQorICogICAgICAgICAgICBAYXJnIFRJTV9USU04X0VUUl9BREMzX0FXRDIgICAgICAgVElNOCBFVFIgaXMgY29ubmVjdGVkIHRvIEFEQzMKKyAqIEFXRDIgICAgICAgKCopCisgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTThfRVRSX0FEQzNfQVdEMyAgICAgICBUSU04IEVUUiBpcyBjb25uZWN0ZWQgdG8gQURDMworICogQVdEMyAgICAgICAoKikKKyAqCisgKiAgICAgICAgIEZvciBUSU0yMCwgdGhlIHBhcmFtZXRlciBjYW4gdGFrZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6ICgqKikKKyAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMjBfRVRSX0dQSU8gICAgICAgICAgICBUSU0yMCBFVFIgaXMgY29ubmVjdGVkIHRvIEdQSU8KKyAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMjBfRVRSX0NPTVAxICAgICAgICAgICBUSU0yMCBFVFIgaXMgY29ubmVjdGVkIHRvIENPTVAxCisgKiBvdXRwdXQgICgqKQorICogICAgICAgICAgICBAYXJnIFRJTV9USU0yMF9FVFJfQ09NUDIgICAgICAgICAgIFRJTTIwIEVUUiBpcyBjb25uZWN0ZWQgdG8gQ09NUDIKKyAqIG91dHB1dCAgKCopCisgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTIwX0VUUl9DT01QMyAgICAgICAgICAgVElNMjAgRVRSIGlzIGNvbm5lY3RlZCB0byBDT01QMworICogb3V0cHV0ICAoKikKKyAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMjBfRVRSX0NPTVA0ICAgICAgICAgICBUSU0yMCBFVFIgaXMgY29ubmVjdGVkIHRvIENPTVA0CisgKiBvdXRwdXQgICgqKQorICogICAgICAgICAgICBAYXJnIFRJTV9USU0yMF9FVFJfQ09NUDUgICAgICAgICAgIFRJTTIwIEVUUiBpcyBjb25uZWN0ZWQgdG8gQ09NUDUKKyAqIG91dHB1dCAgKCopCisgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTIwX0VUUl9DT01QNiAgICAgICAgICAgVElNMjAgRVRSIGlzIGNvbm5lY3RlZCB0byBDT01QNgorICogb3V0cHV0ICAoKikKKyAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMjBfRVRSX0NPTVA3ICAgICAgICAgICBUSU0yMCBFVFIgaXMgY29ubmVjdGVkIHRvIENPTVA3CisgKiBvdXRwdXQgICgqKQorICogICAgICAgICAgICBAYXJnIFRJTV9USU0yMF9FVFJfQURDM19BV0QxICAgICAgIFRJTTIwIEVUUiBpcyBjb25uZWN0ZWQgdG8gQURDMworICogQVdEMSAgICAgKCopCisgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTIwX0VUUl9BREMzX0FXRDIgICAgICAgVElNMjAgRVRSIGlzIGNvbm5lY3RlZCB0byBBREMzCisgKiBBV0QyICAgICAoKikKKyAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMjBfRVRSX0FEQzNfQVdEMyAgICAgICBUSU0yMCBFVFIgaXMgY29ubmVjdGVkIHRvIEFEQzMKKyAqIEFXRDMgICAgICgqKQorICogICAgICAgICAgICBAYXJnIFRJTV9USU0yMF9FVFJfQURDNV9BV0QxICAgICAgIFRJTTIwIEVUUiBpcyBjb25uZWN0ZWQgdG8gQURDNQorICogQVdEMSAgICAgKCopCisgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTIwX0VUUl9BREM1X0FXRDIgICAgICAgVElNMjAgRVRSIGlzIGNvbm5lY3RlZCB0byBBREM1CisgKiBBV0QyICAgICAoKikKKyAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMjBfRVRSX0FEQzVfQVdEMyAgICAgICBUSU0yMCBFVFIgaXMgY29ubmVjdGVkIHRvIEFEQzUKKyAqIEFXRDMgICAgICgqKQorICoKKyAqICAgICAgICAgKCopICBWYWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4gXG4KKyAqICAgICAgICAgKCoqKSBSZWdpc3RlciBub3QgYXZhaWxhYmxlIGluIGFsbCBkZXZpY2VzLgorICoKKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfUmVtYXBDb25maWcoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUmVtYXApIHsKKyAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX1JFTUFQX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fUkVNQVAoUmVtYXApKTsKKworICBfX0hBTF9MT0NLKGh0aW0pOworCisgIE1PRElGWV9SRUcoaHRpbS0+SW5zdGFuY2UtPkFGMSwgVElNMV9BRjFfRVRSU0VMX01zaywgUmVtYXApOworCisgIF9fSEFMX1VOTE9DSyhodGltKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNlbGVjdCB0aGUgdGltZXIgaW5wdXQgc291cmNlCisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUuCisgICogQHBhcmFtICBDaGFubmVsIHNwZWNpZmllcyB0aGUgVElNIENoYW5uZWwKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSTEgaW5wdXQgY2hhbm5lbAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSTIgaW5wdXQgY2hhbm5lbAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSTMgaW5wdXQgY2hhbm5lbAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSTQgaW5wdXQgY2hhbm5lbAorICAqIEBwYXJhbSAgVElTZWxlY3Rpb24gc3BlY2lmaWVzIHRoZSB0aW1lciBpbnB1dCBzb3VyY2UKKyAgKiAgICAgICAgIEZvciBUSU0xIHRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9USU0xX1RJMV9HUElPOiAgICAgICAgICAgICAgICBUSU0xIFRJMSBpcyBjb25uZWN0ZWQgdG8KKyAgR1BJTworICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMV9USTFfQ09NUDE6ICAgICAgICAgICAgICAgVElNMSBUSTEgaXMgY29ubmVjdGVkIHRvCisgIENPTVAxIG91dHB1dAorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMV9USTFfQ09NUDI6ICAgICAgICAgICAgICAgVElNMSBUSTEgaXMgY29ubmVjdGVkIHRvCisgIENPTVAyIG91dHB1dAorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMV9USTFfQ09NUDM6ICAgICAgICAgICAgICAgVElNMSBUSTEgaXMgY29ubmVjdGVkIHRvCisgIENPTVAzIG91dHB1dAorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMV9USTFfQ09NUDQ6ICAgICAgICAgICAgICAgVElNMSBUSTEgaXMgY29ubmVjdGVkIHRvCisgIENPTVA0IG91dHB1dAorICAqCisgICogICAgICAgICBGb3IgVElNMiB0aGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMl9USTFfR1BJTzogICAgICAgICAgICAgICAgVElNMiBUSTEgaXMgY29ubmVjdGVkIHRvCisgIEdQSU8KKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTJfVEkxX0NPTVAxOiAgICAgICAgICAgICAgIFRJTTIgVEkxIGlzIGNvbm5lY3RlZCB0bworICBDT01QMSBvdXRwdXQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTJfVEkxX0NPTVAyOiAgICAgICAgICAgICAgIFRJTTIgVEkxIGlzIGNvbm5lY3RlZCB0bworICBDT01QMiBvdXRwdXQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTJfVEkxX0NPTVAzOiAgICAgICAgICAgICAgIFRJTTIgVEkxIGlzIGNvbm5lY3RlZCB0bworICBDT01QMyBvdXRwdXQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTJfVEkxX0NPTVA0OiAgICAgICAgICAgICAgIFRJTTIgVEkxIGlzIGNvbm5lY3RlZCB0bworICBDT01QNCBvdXRwdXQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTJfVEkxX0NPTVA1OiAgICAgICAgICAgICAgIFRJTTIgVEkxIGlzIGNvbm5lY3RlZCB0bworICBDT01QNSBvdXRwdXQgICAgICgqKQorICAqCisgICogICAgICAgICAgICBAYXJnIFRJTV9USU0yX1RJMl9HUElPOiAgICAgICAgICAgICAgICBUSU0xIFRJMiBpcyBjb25uZWN0ZWQgdG8KKyAgR1BJTworICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMl9USTJfQ09NUDE6ICAgICAgICAgICAgICAgVElNMiBUSTIgaXMgY29ubmVjdGVkIHRvCisgIENPTVAxIG91dHB1dAorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMl9USTJfQ09NUDI6ICAgICAgICAgICAgICAgVElNMiBUSTIgaXMgY29ubmVjdGVkIHRvCisgIENPTVAyIG91dHB1dAorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMl9USTJfQ09NUDM6ICAgICAgICAgICAgICAgVElNMiBUSTIgaXMgY29ubmVjdGVkIHRvCisgIENPTVAzIG91dHB1dAorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMl9USTJfQ09NUDQ6ICAgICAgICAgICAgICAgVElNMiBUSTIgaXMgY29ubmVjdGVkIHRvCisgIENPTVA0IG91dHB1dAorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMl9USTJfQ09NUDY6ICAgICAgICAgICAgICAgVElNMiBUSTIgaXMgY29ubmVjdGVkIHRvCisgIENPTVA2IG91dHB1dCAgICAgKCopCisgICoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTJfVEkzX0dQSU86ICAgICAgICAgICAgICAgIFRJTTIgVEkzIGlzIGNvbm5lY3RlZCB0bworICBHUElPCisgICogICAgICAgICAgICBAYXJnIFRJTV9USU0yX1RJM19DT01QNDogICAgICAgICAgICAgICBUSU0yIFRJMyBpcyBjb25uZWN0ZWQgdG8KKyAgQ09NUDQgb3V0cHV0CisgICoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTJfVEk0X0dQSU86ICAgICAgICAgICAgICAgIFRJTTIgVEk0IGlzIGNvbm5lY3RlZCB0bworICBHUElPCisgICogICAgICAgICAgICBAYXJnIFRJTV9USU0yX1RJNF9DT01QMTogICAgICAgICAgICAgICBUSU0yIFRJNCBpcyBjb25uZWN0ZWQgdG8KKyAgQ09NUDEgb3V0cHV0CisgICogICAgICAgICAgICBAYXJnIFRJTV9USU0yX1RJNF9DT01QMjogICAgICAgICAgICAgICBUSU0yIFRJNCBpcyBjb25uZWN0ZWQgdG8KKyAgQ09NUDIgb3V0cHV0CisgICoKKyAgKiAgICAgICAgIEZvciBUSU0zIHRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9USU0zX1RJMV9HUElPOiAgICAgICAgICAgICAgICBUSU0zIFRJMSBpcyBjb25uZWN0ZWQgdG8KKyAgR1BJTworICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNM19USTFfQ09NUDE6ICAgICAgICAgICAgICAgVElNMyBUSTEgaXMgY29ubmVjdGVkIHRvCisgIENPTVAxIG91dHB1dAorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNM19USTFfQ09NUDI6ICAgICAgICAgICAgICAgVElNMyBUSTEgaXMgY29ubmVjdGVkIHRvCisgIENPTVAyIG91dHB1dAorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNM19USTFfQ09NUDM6ICAgICAgICAgICAgICAgVElNMyBUSTEgaXMgY29ubmVjdGVkIHRvCisgIENPTVAzIG91dHB1dAorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNM19USTFfQ09NUDQ6ICAgICAgICAgICAgICAgVElNMyBUSTEgaXMgY29ubmVjdGVkIHRvCisgIENPTVA0IG91dHB1dAorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNM19USTFfQ09NUDU6ICAgICAgICAgICAgICAgVElNMyBUSTEgaXMgY29ubmVjdGVkIHRvCisgIENPTVA1IG91dHB1dCAgICAgKCopCisgICogICAgICAgICAgICBAYXJnIFRJTV9USU0zX1RJMV9DT01QNjogICAgICAgICAgICAgICBUSU0zIFRJMSBpcyBjb25uZWN0ZWQgdG8KKyAgQ09NUDYgb3V0cHV0ICAgICAoKikKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTNfVEkxX0NPTVA3OiAgICAgICAgICAgICAgIFRJTTMgVEkxIGlzIGNvbm5lY3RlZCB0bworICBDT01QNyBvdXRwdXQgICAgICgqKQorICAqCisgICogICAgICAgICAgICBAYXJnIFRJTV9USU0zX1RJMl9HUElPOiAgICAgICAgICAgICAgICBUSU0zIFRJMiBpcyBjb25uZWN0ZWQgdG8KKyAgR1BJTworICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNM19USTJfQ09NUDE6ICAgICAgICAgICAgICAgVElNMyBUSTIgaXMgY29ubmVjdGVkIHRvCisgIENPTVAxIG91dHB1dAorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNM19USTJfQ09NUDI6ICAgICAgICAgICAgICAgVElNMyBUSTIgaXMgY29ubmVjdGVkIHRvCisgIENPTVAyIG91dHB1dAorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNM19USTJfQ09NUDM6ICAgICAgICAgICAgICAgVElNMyBUSTIgaXMgY29ubmVjdGVkIHRvCisgIENPTVAzIG91dHB1dAorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNM19USTJfQ09NUDQ6ICAgICAgICAgICAgICAgVElNMyBUSTIgaXMgY29ubmVjdGVkIHRvCisgIENPTVA0IG91dHB1dAorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNM19USTJfQ09NUDU6ICAgICAgICAgICAgICAgVElNMyBUSTIgaXMgY29ubmVjdGVkIHRvCisgIENPTVA1IG91dHB1dCAgICAgKCopCisgICogICAgICAgICAgICBAYXJnIFRJTV9USU0zX1RJMl9DT01QNjogICAgICAgICAgICAgICBUSU0zIFRJMiBpcyBjb25uZWN0ZWQgdG8KKyAgQ09NUDYgb3V0cHV0ICAgICAoKikKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTNfVEkyX0NPTVA3OiAgICAgICAgICAgICAgIFRJTTMgVEkyIGlzIGNvbm5lY3RlZCB0bworICBDT01QNyBvdXRwdXQgICAgICgqKQorICAqCisgICogICAgICAgICAgICBAYXJnIFRJTV9USU0zX1RJM19HUElPOiAgICAgICAgICAgICAgICBUSU0zIFRJMyBpcyBjb25uZWN0ZWQgdG8KKyAgR1BJTworICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNM19USTNfQ09NUDM6ICAgICAgICAgICAgICAgVElNMyBUSTMgaXMgY29ubmVjdGVkIHRvCisgIENPTVAzIG91dHB1dAorICAqCisgICogICAgICAgICBGb3IgVElNNCB0aGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNNF9USTFfR1BJTzogICAgICAgICAgICAgICAgVElNNCBUSTEgaXMgY29ubmVjdGVkIHRvCisgIEdQSU8KKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTRfVEkxX0NPTVAxOiAgICAgICAgICAgICAgIFRJTTQgVEkxIGlzIGNvbm5lY3RlZCB0bworICBDT01QMSBvdXRwdXQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTRfVEkxX0NPTVAyOiAgICAgICAgICAgICAgIFRJTTQgVEkxIGlzIGNvbm5lY3RlZCB0bworICBDT01QMiBvdXRwdXQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTRfVEkxX0NPTVAzOiAgICAgICAgICAgICAgIFRJTTQgVEkxIGlzIGNvbm5lY3RlZCB0bworICBDT01QMyBvdXRwdXQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTRfVEkxX0NPTVA0OiAgICAgICAgICAgICAgIFRJTTQgVEkxIGlzIGNvbm5lY3RlZCB0bworICBDT01QNCBvdXRwdXQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTRfVEkxX0NPTVA1OiAgICAgICAgICAgICAgIFRJTTQgVEkxIGlzIGNvbm5lY3RlZCB0bworICBDT01QNSBvdXRwdXQgICAgICgqKQorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNNF9USTFfQ09NUDY6ICAgICAgICAgICAgICAgVElNNCBUSTEgaXMgY29ubmVjdGVkIHRvCisgIENPTVA2IG91dHB1dCAgICAgKCopCisgICogICAgICAgICAgICBAYXJnIFRJTV9USU00X1RJMV9DT01QNzogICAgICAgICAgICAgICBUSU00IFRJMSBpcyBjb25uZWN0ZWQgdG8KKyAgQ09NUDcgb3V0cHV0ICAgICAoKikKKyAgKgorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNNF9USTJfR1BJTzogICAgICAgICAgICAgICAgVElNNCBUSTIgaXMgY29ubmVjdGVkIHRvCisgIEdQSU8KKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTRfVEkyX0NPTVAxOiAgICAgICAgICAgICAgIFRJTTQgVEkyIGlzIGNvbm5lY3RlZCB0bworICBDT01QMSBvdXRwdXQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTRfVEkyX0NPTVAyOiAgICAgICAgICAgICAgIFRJTTQgVEkyIGlzIGNvbm5lY3RlZCB0bworICBDT01QMiBvdXRwdXQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTRfVEkyX0NPTVAzOiAgICAgICAgICAgICAgIFRJTTQgVEkyIGlzIGNvbm5lY3RlZCB0bworICBDT01QMyBvdXRwdXQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTRfVEkyX0NPTVA0OiAgICAgICAgICAgICAgIFRJTTQgVEkyIGlzIGNvbm5lY3RlZCB0bworICBDT01QNCBvdXRwdXQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTRfVEkyX0NPTVA1OiAgICAgICAgICAgICAgIFRJTTQgVEkyIGlzIGNvbm5lY3RlZCB0bworICBDT01QNSBvdXRwdXQgICAgICgqKQorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNNF9USTJfQ09NUDY6ICAgICAgICAgICAgICAgVElNNCBUSTIgaXMgY29ubmVjdGVkIHRvCisgIENPTVA2IG91dHB1dCAgICAgKCopCisgICogICAgICAgICAgICBAYXJnIFRJTV9USU00X1RJMl9DT01QNzogICAgICAgICAgICAgICBUSU00IFRJMiBpcyBjb25uZWN0ZWQgdG8KKyAgQ09NUDcgb3V0cHV0ICAgICAoKikKKyAgKgorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNNF9USTNfR1BJTzogICAgICAgICAgICAgICAgVElNNCBUSTMgaXMgY29ubmVjdGVkIHRvCisgIEdQSU8KKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTRfVEkzX0NPTVA1OiAgICAgICAgICAgICAgIFRJTTQgVEkzIGlzIGNvbm5lY3RlZCB0bworICBDT01QNSBvdXRwdXQgICAgICgqKQorICAqCisgICogICAgICAgICAgICBAYXJnIFRJTV9USU00X1RJNF9HUElPOiAgICAgICAgICAgICAgICBUSU00IFRJNCBpcyBjb25uZWN0ZWQgdG8KKyAgR1BJTworICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNNF9USTRfQ09NUDY6ICAgICAgICAgICAgICAgVElNNCBUSTQgaXMgY29ubmVjdGVkIHRvCisgIENPTVA2IG91dHB1dCAgICAgKCopCisgICoKKyAgKiAgICAgICAgIEZvciBUSU01IHRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6ICAgICgqKikKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTVfVEkxX0dQSU86ICAgICAgICAgICAgICAgIFRJTTUgVEkxIGlzIGNvbm5lY3RlZCB0bworICBHUElPCisgICogICAgICAgICAgICBAYXJnIFRJTV9USU01X1RJMV9MU0k6ICAgICAgICAgICAgICAgICBUSU01IFRJMSBpcyBjb25uZWN0ZWQgdG8KKyAgTFNJIGNsb2NrICAgICAgICAoKikKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTVfVEkxX0xTRTogICAgICAgICAgICAgICAgIFRJTTUgVEkxIGlzIGNvbm5lY3RlZCB0bworICBMU0UgY2xvY2sgICAgICAgICgqKQorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNNV9USTFfUlRDX1dLOiAgICAgICAgICAgICAgVElNNSBUSTEgaXMgY29ubmVjdGVkIHRvCisgIFJUQyBXYWtldXAgICAgICAgKCopCisgICogICAgICAgICAgICBAYXJnIFRJTV9USU01X1RJMV9DT01QMTogICAgICAgICAgICAgICBUSU01IFRJMSBpcyBjb25uZWN0ZWQgdG8KKyAgQ09NUDEgb3V0cHV0ICAgICAoKikKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTVfVEkxX0NPTVAyOiAgICAgICAgICAgICAgIFRJTTUgVEkxIGlzIGNvbm5lY3RlZCB0bworICBDT01QMiBvdXRwdXQgICAgICgqKQorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNNV9USTFfQ09NUDM6ICAgICAgICAgICAgICAgVElNNSBUSTEgaXMgY29ubmVjdGVkIHRvCisgIENPTVAzIG91dHB1dCAgICAgKCopCisgICogICAgICAgICAgICBAYXJnIFRJTV9USU01X1RJMV9DT01QNDogICAgICAgICAgICAgICBUSU01IFRJMSBpcyBjb25uZWN0ZWQgdG8KKyAgQ09NUDQgb3V0cHV0ICAgICAoKikKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTVfVEkxX0NPTVA1OiAgICAgICAgICAgICAgIFRJTTUgVEkxIGlzIGNvbm5lY3RlZCB0bworICBDT01QNSBvdXRwdXQgICAgICgqKQorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNNV9USTFfQ09NUDY6ICAgICAgICAgICAgICAgVElNNSBUSTEgaXMgY29ubmVjdGVkIHRvCisgIENPTVA2IG91dHB1dCAgICAgKCopCisgICogICAgICAgICAgICBAYXJnIFRJTV9USU01X1RJMV9DT01QNzogICAgICAgICAgICAgICBUSU01IFRJMSBpcyBjb25uZWN0ZWQgdG8KKyAgQ09NUDcgb3V0cHV0ICAgICAoKikKKyAgKgorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNNV9USTJfR1BJTzogICAgICAgICAgICAgICAgVElNNSBUSTIgaXMgY29ubmVjdGVkIHRvCisgIEdQSU8KKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTVfVEkyX0NPTVAxOiAgICAgICAgICAgICAgIFRJTTUgVEkyIGlzIGNvbm5lY3RlZCB0bworICBDT01QMSBvdXRwdXQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTVfVEkyX0NPTVAyOiAgICAgICAgICAgICAgIFRJTTUgVEkyIGlzIGNvbm5lY3RlZCB0bworICBDT01QMiBvdXRwdXQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTVfVEkyX0NPTVAzOiAgICAgICAgICAgICAgIFRJTTUgVEkyIGlzIGNvbm5lY3RlZCB0bworICBDT01QMyBvdXRwdXQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTVfVEkyX0NPTVA0OiAgICAgICAgICAgICAgIFRJTTUgVEkyIGlzIGNvbm5lY3RlZCB0bworICBDT01QNCBvdXRwdXQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTVfVEkyX0NPTVA1OiAgICAgICAgICAgICAgIFRJTTUgVEkyIGlzIGNvbm5lY3RlZCB0bworICBDT01QNSBvdXRwdXQgICAgICgqKQorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNNV9USTJfQ09NUDY6ICAgICAgICAgICAgICAgVElNNSBUSTIgaXMgY29ubmVjdGVkIHRvCisgIENPTVA2IG91dHB1dCAgICAgKCopCisgICogICAgICAgICAgICBAYXJnIFRJTV9USU01X1RJMl9DT01QNzogICAgICAgICAgICAgICBUSU01IFRJMiBpcyBjb25uZWN0ZWQgdG8KKyAgQ09NUDcgb3V0cHV0ICAgICAoKikKKyAgKgorICAqICAgICAgICAgRm9yIFRJTTggdGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTThfVEkxX0dQSU86ICAgICAgICAgICAgICAgIFRJTTggVEkxIGlzIGNvbm5lY3RlZCB0bworICBHUElPCisgICogICAgICAgICAgICBAYXJnIFRJTV9USU04X1RJMV9DT01QMTogICAgICAgICAgICAgICBUSU04IFRJMSBpcyBjb25uZWN0ZWQgdG8KKyAgQ09NUDEgb3V0cHV0CisgICogICAgICAgICAgICBAYXJnIFRJTV9USU04X1RJMV9DT01QMjogICAgICAgICAgICAgICBUSU04IFRJMSBpcyBjb25uZWN0ZWQgdG8KKyAgQ09NUDIgb3V0cHV0CisgICogICAgICAgICAgICBAYXJnIFRJTV9USU04X1RJMV9DT01QMzogICAgICAgICAgICAgICBUSU04IFRJMSBpcyBjb25uZWN0ZWQgdG8KKyAgQ09NUDMgb3V0cHV0CisgICogICAgICAgICAgICBAYXJnIFRJTV9USU04X1RJMV9DT01QNDogICAgICAgICAgICAgICBUSU04IFRJMSBpcyBjb25uZWN0ZWQgdG8KKyAgQ09NUDQgb3V0cHV0CisgICoKKyAgKiAgICAgICAgIEZvciBUSU0xNSB0aGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMTVfVEkxX0dQSU86ICAgICAgICAgICAgICAgIFRJTTE1IFRJMSBpcyBjb25uZWN0ZWQgdG8KKyAgR1BJTworICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMTVfVEkxX0xTRTogICAgICAgICAgICAgICAgIFRJTTE1IFRJMSBpcyBjb25uZWN0ZWQgdG8KKyAgTFNFIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIFRJTV9USU0xNV9USTFfQ09NUDE6ICAgICAgICAgICAgICAgVElNMTUgVEkxIGlzIGNvbm5lY3RlZCB0bworICBDT01QMSBvdXRwdXQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTE1X1RJMV9DT01QMjogICAgICAgICAgICAgICBUSU0xNSBUSTEgaXMgY29ubmVjdGVkIHRvCisgIENPTVAyIG91dHB1dAorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMTVfVEkxX0NPTVA1OiAgICAgICAgICAgICAgIFRJTTE1IFRJMSBpcyBjb25uZWN0ZWQgdG8KKyAgQ09NUDUgb3V0cHV0ICAgICAoKikKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTE1X1RJMV9DT01QNzogICAgICAgICAgICAgICBUSU0xNSBUSTEgaXMgY29ubmVjdGVkIHRvCisgIENPTVA3IG91dHB1dCAgICAgKCopCisgICoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTE1X1RJMl9HUElPOiAgICAgICAgICAgICAgICBUSU0xNSBUSTIgaXMgY29ubmVjdGVkIHRvCisgIEdQSU8KKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTE1X1RJMl9DT01QMjogICAgICAgICAgICAgICBUSU0xNSBUSTIgaXMgY29ubmVjdGVkIHRvCisgIENPTVAyIG91dHB1dAorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMTVfVEkyX0NPTVAzOiAgICAgICAgICAgICAgIFRJTTE1IFRJMiBpcyBjb25uZWN0ZWQgdG8KKyAgQ09NUDMgb3V0cHV0CisgICogICAgICAgICAgICBAYXJnIFRJTV9USU0xNV9USTJfQ09NUDY6ICAgICAgICAgICAgICAgVElNMTUgVEkyIGlzIGNvbm5lY3RlZCB0bworICBDT01QNiBvdXRwdXQgICAgICgqKQorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMTVfVEkyX0NPTVA3OiAgICAgICAgICAgICAgIFRJTTE1IFRJMiBpcyBjb25uZWN0ZWQgdG8KKyAgQ09NUDcgb3V0cHV0ICAgICAoKikKKyAgKgorICAqICAgICAgICAgRm9yIFRJTTE2IHRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9USU0xNl9USTFfR1BJTzogICAgICAgICAgICAgICAgVElNMTYgVEkxIGlzIGNvbm5lY3RlZCB0bworICBHUElPCisgICogICAgICAgICAgICBAYXJnIFRJTV9USU0xNl9USTFfQ09NUDY6ICAgICAgICAgICAgICAgVElNMTYgVEkxIGlzIGNvbm5lY3RlZCB0bworICBDT01QNiBvdXRwdXQgICAgICgqKQorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMTZfVEkxX01DTzogICAgICAgICAgICAgICAgIFRJTTE1IFRJMSBpcyBjb25uZWN0ZWQgdG8KKyAgTUNPIG91dHB1dAorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMTZfVEkxX0hTRV8zMjogICAgICAgICAgICAgIFRJTTE1IFRJMSBpcyBjb25uZWN0ZWQgdG8KKyAgSFNFIGRpdiAzMgorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMTZfVEkxX1JUQ19XSzogICAgICAgICAgICAgIFRJTTE1IFRJMSBpcyBjb25uZWN0ZWQgdG8KKyAgUlRDIHdha2V1cAorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMTZfVEkxX0xTRTogICAgICAgICAgICAgICAgIFRJTTE1IFRJMSBpcyBjb25uZWN0ZWQgdG8KKyAgTFNFIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIFRJTV9USU0xNl9USTFfTFNJOiAgICAgICAgICAgICAgICAgVElNMTUgVEkxIGlzIGNvbm5lY3RlZCB0bworICBMU0kgY2xvY2sKKyAgKgorICAqICAgICAgICAgRm9yIFRJTTE3IHRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9USU0xN19USTFfR1BJTzogICAgICAgICAgICAgICAgVElNMTcgVEkxIGlzIGNvbm5lY3RlZCB0bworICBHUElPCisgICogICAgICAgICAgICBAYXJnIFRJTV9USU0xN19USTFfQ09NUDU6ICAgICAgICAgICAgICAgVElNMTcgVEkxIGlzIGNvbm5lY3RlZCB0bworICBDT01QNSBvdXRwdXQgICAgICgqKQorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMTdfVEkxX01DTzogICAgICAgICAgICAgICAgIFRJTTE3IFRJMSBpcyBjb25uZWN0ZWQgdG8KKyAgTUNPIG91dHB1dAorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMTdfVEkxX0hTRV8zMjogICAgICAgICAgICAgIFRJTTE3IFRJMSBpcyBjb25uZWN0ZWQgdG8KKyAgSFNFIGRpdiAzMgorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMTdfVEkxX1JUQ19XSzogICAgICAgICAgICAgIFRJTTE3IFRJMSBpcyBjb25uZWN0ZWQgdG8KKyAgUlRDIHdha2V1cAorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMTdfVEkxX0xTRTogICAgICAgICAgICAgICAgIFRJTTE3IFRJMSBpcyBjb25uZWN0ZWQgdG8KKyAgTFNFIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIFRJTV9USU0xN19USTFfTFNJOiAgICAgICAgICAgICAgICAgVElNMTcgVEkxIGlzIGNvbm5lY3RlZCB0bworICBMU0kgY2xvY2sKKworICAqICAgICAgICAgRm9yIFRJTTIwIHRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6ICAgICgqKikKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTIwX1RJMV9HUElPOiAgICAgICAgICAgICAgICBUSU0yMCBUSTEgaXMgY29ubmVjdGVkIHRvCisgIEdQSU8KKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTIwX1RJMV9DT01QMTogICAgICAgICAgICAgICBUSU0yMCBUSTEgaXMgY29ubmVjdGVkIHRvCisgIENPTVAxIG91dHB1dCAgICAgKCopCisgICogICAgICAgICAgICBAYXJnIFRJTV9USU0yMF9USTFfQ09NUDI6ICAgICAgICAgICAgICAgVElNMjAgVEkxIGlzIGNvbm5lY3RlZCB0bworICBDT01QMiBvdXRwdXQgICAgICgqKQorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMjBfVEkxX0NPTVAzOiAgICAgICAgICAgICAgIFRJTTIwIFRJMSBpcyBjb25uZWN0ZWQgdG8KKyAgQ09NUDMgb3V0cHV0ICAgICAoKikKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTIwX1RJMV9DT01QNDogICAgICAgICAgICAgICBUSU0yMCBUSTEgaXMgY29ubmVjdGVkIHRvCisgIENPTVA0IG91dHB1dCAgICAgKCopCisgICoKKyAgKiAgICAgICAgICgqKSAgVmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuIFxuCisgICogICAgICAgICAoKiopIFJlZ2lzdGVyIG5vdCBhdmFpbGFibGUgaW4gYWxsIGRldmljZXMuCisgICoKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9USVNlbGVjdGlvbihUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUSVNlbGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKSB7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fVElTRUxfVElYX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fVElTRUwoVElTZWxlY3Rpb24pKTsKKworICBfX0hBTF9MT0NLKGh0aW0pOworCisgIHN3aXRjaCAoQ2hhbm5lbCkgeworICAgIGNhc2UgVElNX0NIQU5ORUxfMToKKyAgICAgIE1PRElGWV9SRUcoaHRpbS0+SW5zdGFuY2UtPlRJU0VMLCBUSU1fVElTRUxfVEkxU0VMLCBUSVNlbGVjdGlvbik7CisKKyAgICAgIC8qIElmIHJlcXVpcmVkLCBzZXQgT1IgYml0IHRvIHJlcXVlc3QgSFNFLzMyIGNsb2NrICovCisgICAgICBpZiAoSVNfVElNX0hTRTMyX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSkgeworICAgICAgICBTRVRfQklUKGh0aW0tPkluc3RhbmNlLT5PUiwgVElNX09SX0hTRTMyRU4pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgQ0xFQVJfQklUKGh0aW0tPkluc3RhbmNlLT5PUiwgVElNX09SX0hTRTMyRU4pOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBUSU1fQ0hBTk5FTF8yOgorICAgICAgTU9ESUZZX1JFRyhodGltLT5JbnN0YW5jZS0+VElTRUwsIFRJTV9USVNFTF9USTJTRUwsIFRJU2VsZWN0aW9uKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVElNX0NIQU5ORUxfMzoKKyAgICAgIE1PRElGWV9SRUcoaHRpbS0+SW5zdGFuY2UtPlRJU0VMLCBUSU1fVElTRUxfVEkzU0VMLCBUSVNlbGVjdGlvbik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzQ6CisgICAgICBNT0RJRllfUkVHKGh0aW0tPkluc3RhbmNlLT5USVNFTCwgVElNX1RJU0VMX1RJNFNFTCwgVElTZWxlY3Rpb24pOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICAgIGJyZWFrOworICB9CisKKyAgX19IQUxfVU5MT0NLKGh0aW0pOworCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogQGJyaWVmICBHcm91cCBjaGFubmVsIDUgYW5kIGNoYW5uZWwgMSwgMiBvciAzCisgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZS4KKyAqIEBwYXJhbSAgQ2hhbm5lbHMgc3BlY2lmaWVzIHRoZSByZWZlcmVuY2Ugc2lnbmFsKHMpIHRoZSBPQzVSRUYgaXMgY29tYmluZWQKKyAqIHdpdGguIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIFRJTV9HUk9VUENINV9OT05FOiBObyBlZmZlY3Qgb2YgT0M1UkVGIG9uIE9DMVJFRkMsIE9DMlJFRkMgYW5kCisgKiBPQzNSRUZDIFRJTV9HUk9VUENINV9PQzFSRUZDOiBPQzFSRUZDIGlzIHRoZSBsb2dpY2FsIEFORCBvZiBPQzFSRUZDIGFuZAorICogT0M1UkVGIFRJTV9HUk9VUENINV9PQzJSRUZDOiBPQzJSRUZDIGlzIHRoZSBsb2dpY2FsIEFORCBvZiBPQzJSRUZDIGFuZCBPQzVSRUYKKyAqICAgICAgICAgVElNX0dST1VQQ0g1X09DM1JFRkM6IE9DM1JFRkMgaXMgdGhlIGxvZ2ljYWwgQU5EIG9mIE9DM1JFRkMgYW5kCisgKiBPQzVSRUYKKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfR3JvdXBDaGFubmVsNShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWxzKSB7CisgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DT01CSU5FRDNQSEFTRVBXTV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0dST1VQQ0g1KENoYW5uZWxzKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodGltKTsKKworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfQlVTWTsKKworICAvKiBDbGVhciBHQzVDeCBiaXQgZmllbGRzICovCisgIGh0aW0tPkluc3RhbmNlLT5DQ1I1ICY9IH4oVElNX0NDUjVfR0M1QzMgfCBUSU1fQ0NSNV9HQzVDMiB8IFRJTV9DQ1I1X0dDNUMxKTsKKworICAvKiBTZXQgR0M1Q3ggYml0IGZpZWxkcyAqLworICBodGltLT5JbnN0YW5jZS0+Q0NSNSB8PSBDaGFubmVsczsKKworICAvKiBDaGFuZ2UgdGhlIGh0aW0gc3RhdGUgKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworCisgIF9fSEFMX1VOTE9DSyhodGltKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYXJtIHRoZSBkZXNpZ25hdGVkIGJyZWFrIGlucHV0ICh3aGVuIGl0IG9wZXJhdGVzIGluIGJpZGlyZWN0aW9uYWwKKyAqIG1vZGUpLgorICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUuCisgKiBAcGFyYW0gIEJyZWFrSW5wdXQgQnJlYWsgaW5wdXQgdG8gZGlzYXJtCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIFRJTV9CUkVBS0lOUFVUX0JSSzogVGltZXIgYnJlYWsgaW5wdXQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQlJFQUtJTlBVVF9CUksyOiBUaW1lciBicmVhayAyIGlucHV0CisgKiBAbm90ZSAgVGhlIGJyZWFrIGlucHV0IGNhbiBiZSBkaXNhcm1lZCBvbmx5IHdoZW4gaXQgaXMgY29uZmlndXJlZCBpbgorICogICAgICAgIGJpZGlyZWN0aW9uYWwgbW9kZSBhbmQgd2hlbiB3aGVuIE1PRSBpcyByZXNldC4KKyAqIEBub3RlICBQdXJwb3NlIGlzIHRvIGJlIGFibGUgdG8gaGF2ZSB0aGUgaW5wdXQgdm9sdGFnZSBiYWNrIHRvIGhpZ2gtc3RhdGUsCisgKiAgICAgICAgd2hhdGV2ZXIgdGhlIHRpbWUgY29uc3RhbnQgb24gdGhlIG91dHB1dCAuCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0Rpc2FybUJyZWFrSW5wdXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBCcmVha0lucHV0KSB7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKyAgdWludDMyX3QgdG1wYmR0cjsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0JSRUFLX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fQlJFQUtJTlBVVChCcmVha0lucHV0KSk7CisKKyAgc3dpdGNoIChCcmVha0lucHV0KSB7CisgICAgY2FzZSBUSU1fQlJFQUtJTlBVVF9CUks6IHsKKyAgICAgIC8qIENoZWNrIGluaXRpYWwgY29uZGl0aW9ucyAqLworICAgICAgdG1wYmR0ciA9IFJFQURfUkVHKGh0aW0tPkluc3RhbmNlLT5CRFRSKTsKKyAgICAgIGlmICgoUkVBRF9CSVQodG1wYmR0ciwgVElNX0JEVFJfQktCSUQpID09IFRJTV9CRFRSX0JLQklEKSAmJgorICAgICAgICAgIChSRUFEX0JJVCh0bXBiZHRyLCBUSU1fQkRUUl9NT0UpID09IDBVKSkgeworICAgICAgICAvKiBCcmVhayBpbnB1dCBCUksgaXMgZGlzYXJtZWQgKi8KKyAgICAgICAgU0VUX0JJVChodGltLT5JbnN0YW5jZS0+QkRUUiwgVElNX0JEVFJfQktEU1JNKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFRJTV9CUkVBS0lOUFVUX0JSSzI6IHsKKyAgICAgIC8qIENoZWNrIGluaXRpYWwgY29uZGl0aW9ucyAqLworICAgICAgdG1wYmR0ciA9IFJFQURfUkVHKGh0aW0tPkluc3RhbmNlLT5CRFRSKTsKKyAgICAgIGlmICgoUkVBRF9CSVQodG1wYmR0ciwgVElNX0JEVFJfQksyQklEKSA9PSBUSU1fQkRUUl9CSzJCSUQpICYmCisgICAgICAgICAgKFJFQURfQklUKHRtcGJkdHIsIFRJTV9CRFRSX01PRSkgPT0gMFUpKSB7CisgICAgICAgIC8qIEJyZWFrIGlucHV0IEJSSyBpcyBkaXNhcm1lZCAqLworICAgICAgICBTRVRfQklUKGh0aW0tPkluc3RhbmNlLT5CRFRSLCBUSU1fQkRUUl9CSzJEU1JNKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIEBicmllZiAgQXJtIHRoZSBkZXNpZ25hdGVkIGJyZWFrIGlucHV0ICh3aGVuIGl0IG9wZXJhdGVzIGluIGJpZGlyZWN0aW9uYWwKKyAqIG1vZGUpLgorICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUuCisgKiBAcGFyYW0gIEJyZWFrSW5wdXQgQnJlYWsgaW5wdXQgdG8gYXJtCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIFRJTV9CUkVBS0lOUFVUX0JSSzogVGltZXIgYnJlYWsgaW5wdXQKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQlJFQUtJTlBVVF9CUksyOiBUaW1lciBicmVhayAyIGlucHV0CisgKiBAbm90ZSAgQXJtaW5nIGlzIHBvc3NpYmxlIGF0IGFueXRpbWUsIGV2ZW4gaWYgZmF1bHQgaXMgcHJlc2VudC4KKyAqIEBub3RlICBCcmVhayBpbnB1dCBpcyBhdXRvbWF0aWNhbGx5IGFybWVkIGFzIHNvb24gYXMgTU9FIGJpdCBpcyBzZXQuCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X1JlQXJtQnJlYWtJbnB1dChjb25zdCBUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQnJlYWtJbnB1dCkgeworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0JSRUFLX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fQlJFQUtJTlBVVChCcmVha0lucHV0KSk7CisKKyAgc3dpdGNoIChCcmVha0lucHV0KSB7CisgICAgY2FzZSBUSU1fQlJFQUtJTlBVVF9CUks6IHsKKyAgICAgIC8qIENoZWNrIGluaXRpYWwgY29uZGl0aW9ucyAqLworICAgICAgaWYgKFJFQURfQklUKGh0aW0tPkluc3RhbmNlLT5CRFRSLCBUSU1fQkRUUl9CS0JJRCkgPT0gVElNX0JEVFJfQktCSUQpIHsKKyAgICAgICAgLyogQnJlYWsgaW5wdXQgQlJLIGlzIHJlLWFybWVkIGF1dG9tYXRpY2FsbHkgYnkgaGFyZHdhcmUuIFBvbGwgdG8gY2hlY2sKKyAgICAgICAgICogd2hldGhlciBmYXVsdCBjb25kaXRpb24gZGlzYXBwZWFyZWQgKi8KKyAgICAgICAgLyogSW5pdCB0aWNrc3RhcnQgZm9yIHRpbWVvdXQgbWFuYWdlbWVudCAqLworICAgICAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworICAgICAgICB3aGlsZSAoUkVBRF9CSVQoaHRpbS0+SW5zdGFuY2UtPkJEVFIsIFRJTV9CRFRSX0JLRFNSTSkgIT0gMFVMKSB7CisgICAgICAgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFRJTV9CUkVBS0lOUFVUX1JFQVJNX1RJTUVPVVQpIHsKKyAgICAgICAgICAgIC8qIE5ldyBjaGVjayB0byBhdm9pZCBmYWxzZSB0aW1lb3V0IGRldGVjdGlvbiBpbiBjYXNlIG9mIHByZWVtcHRpb24KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKFJFQURfQklUKGh0aW0tPkluc3RhbmNlLT5CRFRSLCBUSU1fQkRUUl9CS0RTUk0pICE9IDBVTCkgeworICAgICAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9CUkVBS0lOUFVUX0JSSzI6IHsKKyAgICAgIC8qIENoZWNrIGluaXRpYWwgY29uZGl0aW9ucyAqLworICAgICAgaWYgKFJFQURfQklUKGh0aW0tPkluc3RhbmNlLT5CRFRSLCBUSU1fQkRUUl9CSzJCSUQpID09IFRJTV9CRFRSX0JLMkJJRCkgeworICAgICAgICAvKiBCcmVhayBpbnB1dCBCUksyIGlzIHJlLWFybWVkIGF1dG9tYXRpY2FsbHkgYnkgaGFyZHdhcmUuIFBvbGwgdG8gY2hlY2sKKyAgICAgICAgICogd2hldGhlciBmYXVsdCBjb25kaXRpb24gZGlzYXBwZWFyZWQgKi8KKyAgICAgICAgLyogSW5pdCB0aWNrc3RhcnQgZm9yIHRpbWVvdXQgbWFuYWdlbWVudCAqLworICAgICAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworICAgICAgICB3aGlsZSAoUkVBRF9CSVQoaHRpbS0+SW5zdGFuY2UtPkJEVFIsIFRJTV9CRFRSX0JLMkRTUk0pICE9IDBVTCkgeworICAgICAgICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBUSU1fQlJFQUtJTlBVVF9SRUFSTV9USU1FT1VUKSB7CisgICAgICAgICAgICAvKiBOZXcgY2hlY2sgdG8gYXZvaWQgZmFsc2UgdGltZW91dCBkZXRlY3Rpb24gaW4gY2FzZSBvZiBwcmVlbXB0aW9uCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChSRUFEX0JJVChodGltLT5JbnN0YW5jZS0+QkRUUiwgVElNX0JEVFJfQksyRFNSTSkgIT0gMFVMKSB7CisgICAgICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIGRpdGhlcmluZworICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAqIEBub3RlICAgTWFpbiB1c2FnZSBpcyBQV00gbW9kZQorICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdoZW4gdGltZXIgaXMgc3RvcHBlZCBvciBkaXNhYmxlZCAoQ0VOCisgKiA9MCkKKyAqIEBub3RlICAgSWYgZGl0aGVyaW5nIGlzIGFjdGl2YXRlZCwgcGF5IGF0dGVudGlvbiB0byBBUlIsIENDUngsIENOVAorICogaW50ZXJwcmV0YXRpb246CisgKiAgICAgICAgICAgLSBDTlQ6IG9ubHkgQ05UWzExOjBdIGhvbGRzIHRoZSBub24tZGl0aGVyZWQgcGFydCBmb3IgMTZiIHRpbWVycworICogKG9yIENOVFsyNjowXSBmb3IgMzJiIHRpbWVycykKKyAqICAgICAgICAgICAtIEFSUjogQVJSWzE1OjRdIGhvbGRzIHRoZSBub24tZGl0aGVyZWQgcGFydCwgYW5kIEFSUlszOjBdIHRoZQorICogZGl0aGVyIHBhcnQgZm9yIDE2YiB0aW1lcnMKKyAqICAgICAgICAgICAtIENDUng6IENDUnhbMTU6NF0gaG9sZHMgdGhlIG5vbi1kaXRoZXJlZCBwYXJ0LCBhbmQgQ0NSeFszOjBdIHRoZQorICogZGl0aGVyIHBhcnQgZm9yIDE2YiB0aW1lcnMKKyAqICAgICAgICAgICAtIEFSUiBhbmQgQ0NSeCB2YWx1ZXMgYXJlIGxpbWl0ZWQgdG8gMHhGRkVGIGluIGRpdGhlcmluZyBtb2RlIGZvcgorICogMTZiIHRpbWVycyAoY29ycmVzcG9uZHMgdG8gNDA5NCBmb3IgdGhlIGludGVnZXIgcGFydCBhbmQgMTUgZm9yIHRoZSBkaXRoZXJlZAorICogcGFydCkuCisgKiBAbm90ZSAgIE1hY3JvcyBAcmVmIF9fSEFMX1RJTV9DQUxDX1BFUklPRF9ESVRIRVIoKQorICogX19IQUxfVElNX0NBTENfREVMQVlfRElUSEVSKCkgIF9fSEFMX1RJTV9DQUxDX1BVTFNFX0RJVEhFUigpIGNhbiBiZSB1c2VkIHRvCisgKiBjYWxjdWxhdGUgcGVyaW9kIChBUlIpIGFuZCBkZWxheSAoQ0NSeCkgdmFsdWUuCisgKiBAbm90ZSAgIEVuYWJsaW5nIGRpdGhlcmluZywgbW9kaWZpZXMgYXV0b21hdGljYWxseSB2YWx1ZXMgb2YgcmVnaXN0ZXJzCisgKiBBUlIvQ0NSeCB0byBrZWVwIHRoZSBzYW1lIGludGVnZXIgcGFydC4KKyAqIEBub3RlICAgRW5hYmxpbmcgZGl0aGVyaW5nLCBtb2RpZmllcyBhdXRvbWF0aWNhbGx5IHZhbHVlcyBvZiByZWdpc3RlcnMKKyAqIEFSUi9DQ1J4IHRvIGtlZXAgdGhlIHNhbWUgaW50ZWdlciBwYXJ0LiBTbyBpdCBtYXkgYmUgbmVjZXNzYXJ5IHRvIHJlYWQgQVJSCisgKiB2YWx1ZSBvciBDQ1J4IHZhbHVlIHdpdGggbWFjcm9zIEByZWYgX19IQUxfVElNX0dFVF9BVVRPUkVMT0FEKCkKKyAqICAgICAgICAgX19IQUxfVElNX0dFVF9DT01QQVJFKCkgYW5kIGlmIG5lY2Vzc2FyeSB1cGRhdGUgSW5pdCBzdHJ1Y3R1cmUgZmllbGQKKyAqIGh0aW0tPkluaXQuUGVyaW9kIC4KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfRGl0aGVyaW5nRW5hYmxlKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKSB7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICBTRVRfQklUKGh0aW0tPkluc3RhbmNlLT5DUjEsIFRJTV9DUjFfRElUSEVOKTsKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgZGl0aGVyaW5nCisgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdoZW4gdGltZXIgaXMgc3RvcHBlZCBvciBkaXNhYmxlZCAoQ0VOCisgKiA9MCkKKyAqIEBub3RlICAgSWYgZGl0aGVyaW5nIGlzIGFjdGl2YXRlZCwgcGF5IGF0dGVudGlvbiB0byBBUlIsIENDUngsIENOVAorICogaW50ZXJwcmV0YXRpb246CisgKiAgICAgICAgICAgLSBDTlQ6IG9ubHkgQ05UWzExOjBdIGhvbGRzIHRoZSBub24tZGl0aGVyZWQgcGFydCBmb3IgMTZiIHRpbWVycworICogKG9yIENOVFsyNjowXSBmb3IgMzJiIHRpbWVycykKKyAqICAgICAgICAgICAtIEFSUjogQVJSWzE1OjRdIGhvbGRzIHRoZSBub24tZGl0aGVyZWQgcGFydCwgYW5kIEFSUlszOjBdIHRoZQorICogZGl0aGVyIHBhcnQgZm9yIDE2YiB0aW1lcnMKKyAqICAgICAgICAgICAtIENDUng6IENDUnhbMTU6NF0gaG9sZHMgdGhlIG5vbi1kaXRoZXJlZCBwYXJ0LCBhbmQgQ0NSeFszOjBdIHRoZQorICogZGl0aGVyIHBhcnQgZm9yIDE2YiB0aW1lcnMKKyAqICAgICAgICAgICAtIEFSUiBhbmQgQ0NSeCB2YWx1ZXMgYXJlIGxpbWl0ZWQgdG8gMHhGRkVGIGluIGRpdGhlcmluZyBtb2RlCisgKiAgICAgICAgICAgICAoY29ycmVzcG9uZHMgdG8gNDA5NCBmb3IgdGhlIGludGVnZXIgcGFydCBhbmQgMTUgZm9yIHRoZSBkaXRoZXJlZAorICogcGFydCkuCisgKiBAbm90ZSAgIERpc2FibGluZyBkaXRoZXJpbmcsIG1vZGlmaWVzIGF1dG9tYXRpY2FsbHkgdmFsdWVzIG9mIHJlZ2lzdGVycworICogQVJSL0NDUnggdG8ga2VlcCB0aGUgc2FtZSBpbnRlZ2VyIHBhcnQuIFNvIGl0IG1heSBiZSBuZWNlc3NhcnkgdG8gcmVhZCBBUlIKKyAqIHZhbHVlIG9yIENDUnggdmFsdWUgd2l0aCBtYWNyb3MgQHJlZiBfX0hBTF9USU1fR0VUX0FVVE9SRUxPQUQoKQorICogICAgICAgICBfX0hBTF9USU1fR0VUX0NPTVBBUkUoKSBhbmQgaWYgbmVjZXNzYXJ5IHVwZGF0ZSBJbml0IHN0cnVjdHVyZSBmaWVsZAorICogaHRpbS0+SW5pdC5QZXJpb2QgLgorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9EaXRoZXJpbmdEaXNhYmxlKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKSB7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICBDTEVBUl9CSVQoaHRpbS0+SW5zdGFuY2UtPkNSMSwgVElNX0NSMV9ESVRIRU4pOworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIHB1bHNlIG9uIGNvbXBhcmUgcHVsc2Ugd2lkdGggYW5kIHB1bHNlIHByZXNjYWxlcgorICogQHBhcmFtICBodGltIFRJTSBPdXRwdXQgQ29tcGFyZSBoYW5kbGUKKyAqIEBwYXJhbSAgUHVsc2VXaWR0aFByZXNjYWxlciAgUHVsc2Ugd2lkdGggcHJlc2NhbGVyCisgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwIGFuZCBNYXhfRGF0YSA9CisgKiAweDcKKyAqIEBwYXJhbSAgUHVsc2VXaWR0aCAgUHVsc2Ugd2lkdGgKKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAwIGFuZCBNYXhfRGF0YSA9CisgKiAweEZGCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X09DX0NvbmZpZ1B1bHNlT25Db21wYXJlKAorICAgIFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBQdWxzZVdpZHRoUHJlc2NhbGVyLAorICAgIHVpbnQzMl90IFB1bHNlV2lkdGgpIHsKKyAgdWludDMyX3QgdG1wZWNyOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fUFVMU0VPTkNPTVBBUkVfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9QVUxTRU9OQ09NUEFSRV9XSURUSChQdWxzZVdpZHRoKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fUFVMU0VPTkNPTVBBUkVfV0lEVEhQUkVTQ0FMRVIoUHVsc2VXaWR0aFByZXNjYWxlcikpOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHRpbSk7CisKKyAgLyogU2V0IHRoZSBUSU0gc3RhdGUgKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CisKKyAgLyogR2V0IHRoZSBUSU14IEVDUiByZWdpc3RlciB2YWx1ZSAqLworICB0bXBlY3IgPSBodGltLT5JbnN0YW5jZS0+RUNSOworICAvKiBSZXNldCB0aGUgUHVsc2Ugd2lkdGggcHJlc2NhbGVyIGFuZCB0aGUgUHVsc2Ugd2lkdGggKi8KKyAgdG1wZWNyICY9IH4oVElNX0VDUl9QV1BSU0MgfCBUSU1fRUNSX1BXKTsKKyAgLyogU2V0IHRoZSBQdWxzZSB3aWR0aCBwcmVzY2FsZXIgYW5kIFB1bHNlIHdpZHRoKi8KKyAgdG1wZWNyIHw9IFB1bHNlV2lkdGhQcmVzY2FsZXIgPDwgVElNX0VDUl9QV1BSU0NfUG9zOworICB0bXBlY3IgfD0gUHVsc2VXaWR0aCA8PCBUSU1fRUNSX1BXX1BvczsKKyAgLyogV3JpdGUgdG8gVElNeCBFQ1IgKi8KKyAgaHRpbS0+SW5zdGFuY2UtPkVDUiA9IHRtcGVjcjsKKworICAvKiBDaGFuZ2UgdGhlIFRJTSBzdGF0ZSAqLworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhodGltKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiAgQ29uZmlndXJlIHByZWxvYWQgc291cmNlIG9mIFNsYXZlIE1vZGUgU2VsZWN0aW9uIGJpdGZpZWxkIChTTVMgaW4KKyAqIFNNQ1IgcmVnaXN0ZXIpCisgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICogQHBhcmFtICBTb3VyY2UgU291cmNlIG9mIHNsYXZlIG1vZGUgc2VsZWN0aW9uIHByZWxvYWQKKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgQGFyZyBUSU1fU01TX1BSRUxPQURfU09VUkNFX1VQREFURTogVGltZXIgdXBkYXRlIGV2ZW50IGlzIHVzZWQgYXMKKyAqIHNvdXJjZSBvZiBTbGF2ZSBNb2RlIFNlbGVjdGlvbiBwcmVsb2FkCisgKiAgICAgICAgICAgIEBhcmcgVElNX1NNU19QUkVMT0FEX1NPVVJDRV9JTkRFWDogVGltZXIgaW5kZXggZXZlbnQgaXMgdXNlZCBhcworICogc291cmNlIG9mIFNsYXZlIE1vZGUgU2VsZWN0aW9uIHByZWxvYWQKKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfQ29uZmlnU2xhdmVNb2RlUHJlbG9hZChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFNvdXJjZSkgeworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX1NMQVZFX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fU0xBVkVfUFJFTE9BRF9TT1VSQ0UoU291cmNlKSk7CisKKyAgTU9ESUZZX1JFRyhodGltLT5JbnN0YW5jZS0+U01DUiwgVElNX1NNQ1JfU01TUFMsIFNvdXJjZSk7CisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgcHJlbG9hZCBvZiBTbGF2ZSBNb2RlIFNlbGVjdGlvbiBiaXRmaWVsZCAoU01TIGluIFNNQ1IKKyAqIHJlZ2lzdGVyKQorICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfRW5hYmxlU2xhdmVNb2RlUHJlbG9hZChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkgeworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX1NMQVZFX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgU0VUX0JJVChodGltLT5JbnN0YW5jZS0+U01DUiwgVElNX1NNQ1JfU01TUEUpOworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBwcmVsb2FkIG9mIFNsYXZlIE1vZGUgU2VsZWN0aW9uIGJpdGZpZWxkIChTTVMgaW4gU01DUgorICogcmVnaXN0ZXIpCisgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9EaXNhYmxlU2xhdmVNb2RlUHJlbG9hZChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkgeworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX1NMQVZFX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgQ0xFQVJfQklUKGh0aW0tPkluc3RhbmNlLT5TTUNSLCBUSU1fU01DUl9TTVNQRSk7CisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgZGVhZHRpbWUgcHJlbG9hZAorICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfRW5hYmxlRGVhZFRpbWVQcmVsb2FkKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKSB7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQlJFQUtfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICBTRVRfQklUKGh0aW0tPkluc3RhbmNlLT5EVFIyLCBUSU1fRFRSMl9EVFBFKTsKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgZGVhZHRpbWUgcHJlbG9hZAorICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfRGlzYWJsZURlYWRUaW1lUHJlbG9hZChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkgeworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0JSRUFLX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgQ0xFQVJfQklUKGh0aW0tPkluc3RhbmNlLT5EVFIyLCBUSU1fRFRSMl9EVFBFKTsKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgIENvbmZpZ3VyZSBkZWFkdGltZQorICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAqIEBwYXJhbSAgRGVhZHRpbWUgRGVhZHRpbWUgdmFsdWUKKyAqIEBub3RlICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAwIGFuZCBNYXhfRGF0YSA9CisgKiAweEZGCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0NvbmZpZ0RlYWRUaW1lKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IERlYWR0aW1lKSB7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQlJFQUtfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9ERUFEVElNRShEZWFkdGltZSkpOworCisgIE1PRElGWV9SRUcoaHRpbS0+SW5zdGFuY2UtPkJEVFIsIFRJTV9CRFRSX0RURywgRGVhZHRpbWUpOworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiAgQ29uZmlndXJlIGFzeW1tZXRyaWNhbCBkZWFkdGltZQorICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAqIEBwYXJhbSAgRmFsbGluZ0RlYWR0aW1lIEZhbGxpbmcgZWRnZSBkZWFkdGltZSB2YWx1ZQorICogQG5vdGUgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MDAgYW5kIE1heF9EYXRhID0KKyAqIDB4RkYKKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfQ29uZmlnQXN5bW1ldHJpY2FsRGVhZFRpbWUoCisgICAgVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IEZhbGxpbmdEZWFkdGltZSkgeworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0JSRUFLX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fREVBRFRJTUUoRmFsbGluZ0RlYWR0aW1lKSk7CisKKyAgTU9ESUZZX1JFRyhodGltLT5JbnN0YW5jZS0+RFRSMiwgVElNX0RUUjJfRFRHRiwgRmFsbGluZ0RlYWR0aW1lKTsKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBhc3ltbWV0cmljYWwgZGVhZHRpbWUKKyAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0VuYWJsZUFzeW1tZXRyaWNhbERlYWRUaW1lKAorICAgIFRJTV9IYW5kbGVUeXBlRGVmICpodGltKSB7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQlJFQUtfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICBTRVRfQklUKGh0aW0tPkluc3RhbmNlLT5EVFIyLCBUSU1fRFRSMl9EVEFFKTsKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgYXN5bW1ldHJpY2FsIGRlYWR0aW1lCisgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9EaXNhYmxlQXN5bW1ldHJpY2FsRGVhZFRpbWUoCisgICAgVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pIHsKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9CUkVBS19JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgIENMRUFSX0JJVChodGltLT5JbnN0YW5jZS0+RFRSMiwgVElNX0RUUjJfRFRBRSk7CisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBlbmNvZGVyIGluZGV4LgorICogQG5vdGUgICB3YXJuaW5nIGluIGNhc2Ugb2YgZW5jb2RlciBtb2RlIGNsb2NrIHBsdXMgZGlyZWN0aW9uCisgKiAgICAgICAgICAgICAgICAgICAgQHJlZiBUSU1fRU5DT0RFUk1PREVfQ0xPQ0tQTFVTRElSRUNUSU9OX1gxIG9yIEByZWYKKyAqIFRJTV9FTkNPREVSTU9ERV9DTE9DS1BMVVNESVJFQ1RJT05fWDIgRGlyZWN0aW9uIG11c3QgYmUgc2V0IHRvIEByZWYKKyAqIFRJTV9FTkNPREVSSU5ERVhfRElSRUNUSU9OX1VQX0RPV04KKyAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlLgorICogQHBhcmFtICBzRW5jb2RlckluZGV4Q29uZmlnIEVuY29kZXIgaW5kZXggY29uZmlndXJhdGlvbgorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9Db25maWdFbmNvZGVySW5kZXgoCisgICAgVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgVElNRXhfRW5jb2RlckluZGV4Q29uZmlnVHlwZURlZiAqc0VuY29kZXJJbmRleENvbmZpZykgeworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0VOQ09ERVJfSU5URVJGQUNFX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fRU5DT0RFUklOREVYX1BPTEFSSVRZKHNFbmNvZGVySW5kZXhDb25maWctPlBvbGFyaXR5KSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fRU5DT0RFUklOREVYX1BSRVNDQUxFUihzRW5jb2RlckluZGV4Q29uZmlnLT5QcmVzY2FsZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9FTkNPREVSSU5ERVhfRklMVEVSKHNFbmNvZGVySW5kZXhDb25maWctPkZpbHRlcikpOworICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShzRW5jb2RlckluZGV4Q29uZmlnLT5GaXJzdEluZGV4RW5hYmxlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fRU5DT0RFUklOREVYX1BPU0lUSU9OKHNFbmNvZGVySW5kZXhDb25maWctPlBvc2l0aW9uKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fRU5DT0RFUklOREVYX0RJUkVDVElPTihzRW5jb2RlckluZGV4Q29uZmlnLT5EaXJlY3Rpb24pKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGh0aW0pOworCisgIC8qIENvbmZpZ3VyZXMgdGhlIFRJTXggRXh0ZXJuYWwgVHJpZ2dlciAoRVRSKSB3aGljaCBpcyB1c2VkIGFzIEluZGV4IGlucHV0ICovCisgIFRJTV9FVFJfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCBzRW5jb2RlckluZGV4Q29uZmlnLT5QcmVzY2FsZXIsCisgICAgICAgICAgICAgICAgICAgIHNFbmNvZGVySW5kZXhDb25maWctPlBvbGFyaXR5LCBzRW5jb2RlckluZGV4Q29uZmlnLT5GaWx0ZXIpOworCisgIC8qIENvbmZpZ3VyZXMgdGhlIGVuY29kZXIgaW5kZXggKi8KKyAgTU9ESUZZX1JFRyhodGltLT5JbnN0YW5jZS0+RUNSLAorICAgICAgICAgICAgIFRJTV9FQ1JfSURJUl9Nc2sgfCBUSU1fRUNSX0ZJRFhfTXNrIHwgVElNX0VDUl9JUE9TX01zaywKKyAgICAgICAgICAgICAoc0VuY29kZXJJbmRleENvbmZpZy0+RGlyZWN0aW9uIHwKKyAgICAgICAgICAgICAgKChzRW5jb2RlckluZGV4Q29uZmlnLT5GaXJzdEluZGV4RW5hYmxlID09IEVOQUJMRSkKKyAgICAgICAgICAgICAgICAgICA/ICgweDFVIDw8IFRJTV9FQ1JfRklEWF9Qb3MpCisgICAgICAgICAgICAgICAgICAgOiAwVSkgfAorICAgICAgICAgICAgICBzRW5jb2RlckluZGV4Q29uZmlnLT5Qb3NpdGlvbiB8IFRJTV9FQ1JfSUUpKTsKKworICBfX0hBTF9VTkxPQ0soaHRpbSk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBlbmNvZGVyIGluZGV4CisgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9FbmFibGVFbmNvZGVySW5kZXgoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pIHsKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9FTkNPREVSX0lOVEVSRkFDRV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgIFNFVF9CSVQoaHRpbS0+SW5zdGFuY2UtPkVDUiwgVElNX0VDUl9JRSk7CisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIGVuY29kZXIgaW5kZXgKKyAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0Rpc2FibGVFbmNvZGVySW5kZXgoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pIHsKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9FTkNPREVSX0lOVEVSRkFDRV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgIENMRUFSX0JJVChodGltLT5JbnN0YW5jZS0+RUNSLCBUSU1fRUNSX0lFKTsKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSBlbmNvZGVyIGZpcnN0IGluZGV4CisgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9FbmFibGVFbmNvZGVyRmlyc3RJbmRleChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkgeworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0VOQ09ERVJfSU5URVJGQUNFX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgU0VUX0JJVChodGltLT5JbnN0YW5jZS0+RUNSLCBUSU1fRUNSX0ZJRFgpOworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBlbmNvZGVyIGZpcnN0IGluZGV4CisgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9EaXNhYmxlRW5jb2RlckZpcnN0SW5kZXgoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pIHsKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9FTkNPREVSX0lOVEVSRkFDRV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgIENMRUFSX0JJVChodGltLT5JbnN0YW5jZS0+RUNSLCBUSU1fRUNSX0ZJRFgpOworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBUSU1FeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA2IEV4dGVuZGVkIENhbGxiYWNrcyBmdW5jdGlvbnMKKyAgKiBAYnJpZWYgICAgRXh0ZW5kZWQgQ2FsbGJhY2tzIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICMjIyMjIEV4dGVuZGVkIENhbGxiYWNrcyBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgRXh0ZW5kZWQgVElNIGNhbGxiYWNrIGZ1bmN0aW9uczoKKyAgICAoKykgVGltZXIgQ29tbXV0YXRpb24gY2FsbGJhY2sKKyAgICAoKykgVGltZXIgQnJlYWsgY2FsbGJhY2sKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgKiBAYnJpZWYgIENvbW11dGF0aW9uIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlCisgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICogQHJldHZhbCBOb25lCisgKi8KK19fd2VhayB2b2lkIEhBTF9USU1FeF9Db21tdXRDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkgeworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1RJTUV4X0NvbW11dENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisvKioKKyAqIEBicmllZiAgQ29tbXV0YXRpb24gaGFsZiBjb21wbGV0ZSBjYWxsYmFjayBpbiBub24tYmxvY2tpbmcgbW9kZQorICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAqIEByZXR2YWwgTm9uZQorICovCitfX3dlYWsgdm9pZCBIQUxfVElNRXhfQ29tbXV0SGFsZkNwbHRDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkgeworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1RJTUV4X0NvbW11dEhhbGZDcGx0Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlCisgICAgIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgKiBAYnJpZWYgIEJyZWFrIGRldGVjdGlvbiBjYWxsYmFjayBpbiBub24tYmxvY2tpbmcgbW9kZQorICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAqIEByZXR2YWwgTm9uZQorICovCitfX3dlYWsgdm9pZCBIQUxfVElNRXhfQnJlYWtDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkgeworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1RJTUV4X0JyZWFrQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgKiBAYnJpZWYgIEJyZWFrMiBkZXRlY3Rpb24gY2FsbGJhY2sgaW4gbm9uIGJsb2NraW5nIG1vZGUKKyAqIEBwYXJhbSAgaHRpbTogVElNIGhhbmRsZQorICogQHJldHZhbCBOb25lCisgKi8KK19fd2VhayB2b2lkIEhBTF9USU1FeF9CcmVhazJDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkgeworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1RJTUV4X0JyZWFrMkNhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICogQGJyaWVmICBFbmNvZGVyIGluZGV4IGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlCisgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICogQHJldHZhbCBOb25lCisgKi8KK19fd2VhayB2b2lkIEhBTF9USU1FeF9FbmNvZGVySW5kZXhDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkgeworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1RJTUV4X0VuY29kZXJJbmRleENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyCisgICAgIGZpbGUKKyAgICovCit9CisKKy8qKgorICogQGJyaWVmICBEaXJlY3Rpb24gY2hhbmdlIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlCisgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICogQHJldHZhbCBOb25lCisgKi8KK19fd2VhayB2b2lkIEhBTF9USU1FeF9EaXJlY3Rpb25DaGFuZ2VDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkgeworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1RJTUV4X0RpcmVjdGlvbkNoYW5nZUNhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZQorICAgICB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICogQGJyaWVmICBJbmRleCBlcnJvciBjYWxsYmFjayBpbiBub24tYmxvY2tpbmcgbW9kZQorICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAqIEByZXR2YWwgTm9uZQorICovCitfX3dlYWsgdm9pZCBIQUxfVElNRXhfSW5kZXhFcnJvckNhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKSB7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh0aW0pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVElNRXhfSW5kZXhFcnJvckNhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyCisgICAgIGZpbGUKKyAgICovCit9CisKKy8qKgorICogQGJyaWVmICBUcmFuc2l0aW9uIGVycm9yIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlCisgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICogQHJldHZhbCBOb25lCisgKi8KK19fd2VhayB2b2lkIEhBTF9USU1FeF9UcmFuc2l0aW9uRXJyb3JDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkgeworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1RJTUV4X1RyYW5zaXRpb25FcnJvckNhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZQorICAgICB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFRJTUV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDcgRXh0ZW5kZWQgUGVyaXBoZXJhbCBTdGF0ZQorZnVuY3Rpb25zCisgICogQGJyaWVmICAgIEV4dGVuZGVkIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAjIyMjIyBFeHRlbmRlZCBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwZXJtaXRzIHRvIGdldCBpbiBydW4tdGltZSB0aGUgc3RhdHVzIG9mIHRoZSBwZXJpcGhlcmFsCisgICAgYW5kIHRoZSBkYXRhIGZsb3cuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICogQGJyaWVmICBSZXR1cm4gdGhlIFRJTSBIYWxsIFNlbnNvciBpbnRlcmZhY2UgaGFuZGxlIHN0YXRlLgorICogQHBhcmFtICBodGltIFRJTSBIYWxsIFNlbnNvciBoYW5kbGUKKyAqIEByZXR2YWwgSEFMIHN0YXRlCisgKi8KK0hBTF9USU1fU3RhdGVUeXBlRGVmIEhBTF9USU1FeF9IYWxsU2Vuc29yX0dldFN0YXRlKAorICAgIGNvbnN0IFRJTV9IYW5kbGVUeXBlRGVmICpodGltKSB7CisgIHJldHVybiBodGltLT5TdGF0ZTsKK30KKworLyoqCisgKiBAYnJpZWYgIFJldHVybiBhY3R1YWwgc3RhdGUgb2YgdGhlIFRJTSBjb21wbGVtZW50YXJ5IGNoYW5uZWwuCisgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICogQHBhcmFtICBDaGFubmVsTiBUSU0gQ29tcGxlbWVudGFyeSBjaGFubmVsCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMworICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQKKyAqIEByZXR2YWwgVElNIENvbXBsZW1lbnRhcnkgY2hhbm5lbCBzdGF0ZQorICovCitIQUxfVElNX0NoYW5uZWxTdGF0ZVR5cGVEZWYgSEFMX1RJTUV4X0dldENoYW5uZWxOU3RhdGUoCisgICAgY29uc3QgVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWxOKSB7CisgIEhBTF9USU1fQ2hhbm5lbFN0YXRlVHlwZURlZiBjaGFubmVsX3N0YXRlOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYTl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgQ2hhbm5lbE4pKTsKKworICBjaGFubmVsX3N0YXRlID0gVElNX0NIQU5ORUxfTl9TVEFURV9HRVQoaHRpbSwgQ2hhbm5lbE4pOworCisgIHJldHVybiBjaGFubmVsX3N0YXRlOworfQorLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisvKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBUSU1FeF9Qcml2YXRlX0Z1bmN0aW9ucyBUSU0gRXh0ZW5kZWQgUHJpdmF0ZSBGdW5jdGlvbnMKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgIFRJTSBETUEgQ29tbXV0YXRpb24gY2FsbGJhY2suCisgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBETUEgaGFuZGxlLgorICogQHJldHZhbCBOb25lCisgKi8KK3ZvaWQgVElNRXhfRE1BQ29tbXV0YXRpb25DcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKSB7CisgIFRJTV9IYW5kbGVUeXBlRGVmICpodGltID0KKyAgICAgIChUSU1fSGFuZGxlVHlwZURlZiAqKSgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50OworCisgIC8qIENoYW5nZSB0aGUgaHRpbSBzdGF0ZSAqLworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIGh0aW0tPkNvbW11dGF0aW9uQ2FsbGJhY2soaHRpbSk7CisjZWxzZQorICBIQUxfVElNRXhfQ29tbXV0Q2FsbGJhY2soaHRpbSk7CisjZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9CisKKy8qKgorICogQGJyaWVmICBUSU0gRE1BIENvbW11dGF0aW9uIGhhbGYgY29tcGxldGUgY2FsbGJhY2suCisgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBETUEgaGFuZGxlLgorICogQHJldHZhbCBOb25lCisgKi8KK3ZvaWQgVElNRXhfRE1BQ29tbXV0YXRpb25IYWxmQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkgeworICBUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSA9CisgICAgICAoVElNX0hhbmRsZVR5cGVEZWYgKikoKERNQV9IYW5kbGVUeXBlRGVmICopaGRtYSktPlBhcmVudDsKKworICAvKiBDaGFuZ2UgdGhlIGh0aW0gc3RhdGUgKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworCisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBodGltLT5Db21tdXRhdGlvbkhhbGZDcGx0Q2FsbGJhY2soaHRpbSk7CisjZWxzZQorICBIQUxfVElNRXhfQ29tbXV0SGFsZkNwbHRDYWxsYmFjayhodGltKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30KKworLyoqCisgKiBAYnJpZWYgIFRJTSBETUEgRGVsYXkgUHVsc2UgY29tcGxldGUgY2FsbGJhY2sgKGNvbXBsZW1lbnRhcnkgY2hhbm5lbCkuCisgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBETUEgaGFuZGxlLgorICogQHJldHZhbCBOb25lCisgKi8KK3N0YXRpYyB2b2lkIFRJTV9ETUFEZWxheVB1bHNlTkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpIHsKKyAgVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0gPQorICAgICAgKFRJTV9IYW5kbGVUeXBlRGVmICopKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQ7CisKKyAgaWYgKGhkbWEgPT0gaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0pIHsKKyAgICBodGltLT5DaGFubmVsID0gSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF8xOworCisgICAgaWYgKGhkbWEtPkluaXQuTW9kZSA9PSBETUFfTk9STUFMKSB7CisgICAgICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8xLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOworICAgIH0KKyAgfSBlbHNlIGlmIChoZG1hID09IGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdKSB7CisgICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfMjsKKworICAgIGlmIChoZG1hLT5Jbml0Lk1vZGUgPT0gRE1BX05PUk1BTCkgeworICAgICAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMiwgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoaGRtYSA9PSBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXSkgeworICAgIGh0aW0tPkNoYW5uZWwgPSBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzM7CisKKyAgICBpZiAoaGRtYS0+SW5pdC5Nb2RlID09IERNQV9OT1JNQUwpIHsKKyAgICAgIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzMsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7CisgICAgfQorICB9IGVsc2UgaWYgKGhkbWEgPT0gaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDNF0pIHsKKyAgICBodGltLT5DaGFubmVsID0gSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF80OworCisgICAgaWYgKGhkbWEtPkluaXQuTW9kZSA9PSBETUFfTk9STUFMKSB7CisgICAgICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF80LCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiBub3RoaW5nIHRvIGRvICovCisgIH0KKworI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgaHRpbS0+UFdNX1B1bHNlRmluaXNoZWRDYWxsYmFjayhodGltKTsKKyNlbHNlCisgIEhBTF9USU1fUFdNX1B1bHNlRmluaXNoZWRDYWxsYmFjayhodGltKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworICBodGltLT5DaGFubmVsID0gSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF9DTEVBUkVEOworfQorCisvKioKKyAqIEBicmllZiAgVElNIERNQSBlcnJvciBjYWxsYmFjayAoY29tcGxlbWVudGFyeSBjaGFubmVsKQorICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gRE1BIGhhbmRsZS4KKyAqIEByZXR2YWwgTm9uZQorICovCitzdGF0aWMgdm9pZCBUSU1fRE1BRXJyb3JDQ3hOKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKSB7CisgIFRJTV9IYW5kbGVUeXBlRGVmICpodGltID0KKyAgICAgIChUSU1fSGFuZGxlVHlwZURlZiAqKSgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50OworCisgIGlmIChoZG1hID09IGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdKSB7CisgICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfMTsKKyAgICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF8xLCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOworICB9IGVsc2UgaWYgKGhkbWEgPT0gaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0pIHsKKyAgICBodGltLT5DaGFubmVsID0gSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF8yOworICAgIFRJTV9DSEFOTkVMX05fU1RBVEVfU0VUKGh0aW0sIFRJTV9DSEFOTkVMXzIsIEhBTF9USU1fQ0hBTk5FTF9TVEFURV9SRUFEWSk7CisgIH0gZWxzZSBpZiAoaGRtYSA9PSBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXSkgeworICAgIGh0aW0tPkNoYW5uZWwgPSBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzM7CisgICAgVElNX0NIQU5ORUxfTl9TVEFURV9TRVQoaHRpbSwgVElNX0NIQU5ORUxfMywgSEFMX1RJTV9DSEFOTkVMX1NUQVRFX1JFQURZKTsKKyAgfSBlbHNlIGlmIChoZG1hID09IGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdKSB7CisgICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfNDsKKyAgICBUSU1fQ0hBTk5FTF9OX1NUQVRFX1NFVChodGltLCBUSU1fQ0hBTk5FTF80LCBIQUxfVElNX0NIQU5ORUxfU1RBVEVfUkVBRFkpOworICB9IGVsc2UgeworICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgfQorCisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBodGltLT5FcnJvckNhbGxiYWNrKGh0aW0pOworI2Vsc2UKKyAgSEFMX1RJTV9FcnJvckNhbGxiYWNrKGh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisgIGh0aW0tPkNoYW5uZWwgPSBIQUxfVElNX0FDVElWRV9DSEFOTkVMX0NMRUFSRUQ7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBUSU0gQ2FwdHVyZSBDb21wYXJlIENoYW5uZWwgeE4uCisgKiBAcGFyYW0gIFRJTXggdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbAorICogQHBhcmFtICBDaGFubmVsIHNwZWNpZmllcyB0aGUgVElNIENoYW5uZWwKKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMQorICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIKKyAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzCisgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNAorICogQHBhcmFtICBDaGFubmVsTlN0YXRlIHNwZWNpZmllcyB0aGUgVElNIENoYW5uZWwgQ0N4TkUgYml0IG5ldyBzdGF0ZS4KKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogVElNX0NDeE5fRU5BQkxFIG9yIFRJTV9DQ3hOX0Rpc2FibGUuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworc3RhdGljIHZvaWQgVElNX0NDeE5DaGFubmVsQ21kKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWxOU3RhdGUpIHsKKyAgdWludDMyX3QgdG1wOworCisgIHRtcCA9IFRJTV9DQ0VSX0NDMU5FIDw8IChDaGFubmVsICYgMHhGVSk7IC8qIDB4RlUgPSAxNSBiaXRzIG1heCBzaGlmdCAqLworCisgIC8qIFJlc2V0IHRoZSBDQ3hORSBCaXQgKi8KKyAgVElNeC0+Q0NFUiAmPSB+dG1wOworCisgIC8qIFNldCBvciByZXNldCB0aGUgQ0N4TkUgQml0ICovCisgIFRJTXgtPkNDRVIgfD0gKHVpbnQzMl90KShDaGFubmVsTlN0YXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoQ2hhbm5lbCAmIDB4RlUpKTsgLyogMHhGVSA9IDE1IGJpdHMgbWF4IHNoaWZ0ICovCit9CisvKioKKyAqIEB9CisgKi8KKworI2VuZGlmIC8qIEhBTF9USU1fTU9EVUxFX0VOQUJMRUQgKi8KKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KZGlmZiAtLWdpdCBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF91YXJ0LmMgYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfdWFydC5jCmluZGV4IDRiZWFiMDEuLjUzOGMxMzEgMTAwNjQ0Ci0tLSBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF91YXJ0LmMKKysrIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3VhcnQuYwpAQCAtMSw0NDQwICsxLDQ1MTMgQEAKLS8qKg0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICAqIEBmaWxlICAgIHN0bTMyZzR4eF9oYWxfdWFydC5jDQotICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtDQotICAqIEBicmllZiAgIFVBUlQgSEFMIG1vZHVsZSBkcml2ZXIuDQotICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcNCi0gICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBVbml2ZXJzYWwgQXN5bmNocm9ub3VzIFJlY2VpdmVyIFRyYW5zbWl0dGVyDQotIFBlcmlwaGVyYWwgKFVBUlQpLg0KLSAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zDQotICAqICAgICAgICAgICArIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMNCi0gICogICAgICAgICAgICsgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucw0KLSAgKg0KLSAgKg0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICAqIEBhdHRlbnRpb24NCi0gICoNCi0gICogQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4NCi0gICogQWxsIHJpZ2h0cyByZXNlcnZlZC4NCi0gICoNCi0gICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0ZXJtcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlDQotICAqIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4NCi0gICogSWYgbm8gTElDRU5TRSBmaWxlIGNvbWVzIHdpdGggdGhpcyBzb2Z0d2FyZSwgaXQgaXMgcHJvdmlkZWQgQVMtSVMuDQotICAqDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gIEB2ZXJiYXRpbQ0KLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIw0KLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICBbLi5dDQotICAgIFRoZSBVQVJUIEhBTCBkcml2ZXIgY2FuIGJlIHVzZWQgYXMgZm9sbG93czoNCi0NCi0gICAgKCMpIERlY2xhcmUgYSBVQVJUX0hhbmRsZVR5cGVEZWYgaGFuZGxlIHN0cnVjdHVyZSAoZWcuIFVBUlRfSGFuZGxlVHlwZURlZg0KLSBodWFydCkuDQotICAgICgjKSBJbml0aWFsaXplIHRoZSBVQVJUIGxvdyBsZXZlbCByZXNvdXJjZXMgYnkgaW1wbGVtZW50aW5nIHRoZQ0KLSBIQUxfVUFSVF9Nc3BJbml0KCkgQVBJOg0KLSAgICAgICAgKCsrKSBFbmFibGUgdGhlIFVTQVJUeCBpbnRlcmZhY2UgY2xvY2suDQotICAgICAgICAoKyspIFVBUlQgcGlucyBjb25maWd1cmF0aW9uOg0KLSAgICAgICAgICAgICgrKyspIEVuYWJsZSB0aGUgY2xvY2sgZm9yIHRoZSBVQVJUIEdQSU9zLg0KLSAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGVzZSBVQVJUIHBpbnMgYXMgYWx0ZXJuYXRlIGZ1bmN0aW9uIHB1bGwtdXAuDQotICAgICAgICAoKyspIE5WSUMgY29uZmlndXJhdGlvbiBpZiB5b3UgbmVlZCB0byB1c2UgaW50ZXJydXB0IHByb2Nlc3MNCi0gKEhBTF9VQVJUX1RyYW5zbWl0X0lUKCkgYW5kIEhBTF9VQVJUX1JlY2VpdmVfSVQoKSBBUElzKToNCi0gICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIFVTQVJUeCBpbnRlcnJ1cHQgcHJpb3JpdHkuDQotICAgICAgICAgICAgKCsrKykgRW5hYmxlIHRoZSBOVklDIFVTQVJUIElSUSBoYW5kbGUuDQotICAgICAgICAoKyspIFVBUlQgaW50ZXJydXB0cyBoYW5kbGluZzoNCi0gICAgICAgICAgICAgIC1AQC0gIFRoZSBzcGVjaWZpYyBVQVJUIGludGVycnVwdHMgKFRyYW5zbWlzc2lvbiBjb21wbGV0ZQ0KLSBpbnRlcnJ1cHQsIFJYTkUgaW50ZXJydXB0LCBSWC9UWCBGSUZPcyByZWxhdGVkIGludGVycnVwdHMgYW5kIEVycm9yIEludGVycnVwdHMpDQotICAgICAgICAgICAgICAgIGFyZSBtYW5hZ2VkIHVzaW5nIHRoZSBtYWNyb3MgX19IQUxfVUFSVF9FTkFCTEVfSVQoKSBhbmQNCi0gX19IQUxfVUFSVF9ESVNBQkxFX0lUKCkgaW5zaWRlIHRoZSB0cmFuc21pdCBhbmQgcmVjZWl2ZSBwcm9jZXNzZXMuDQotICAgICAgICAoKyspIERNQSBDb25maWd1cmF0aW9uIGlmIHlvdSBuZWVkIHRvIHVzZSBETUEgcHJvY2Vzcw0KLSAoSEFMX1VBUlRfVHJhbnNtaXRfRE1BKCkgYW5kIEhBTF9VQVJUX1JlY2VpdmVfRE1BKCkgQVBJcyk6DQotICAgICAgICAgICAgKCsrKykgRGVjbGFyZSBhIERNQSBoYW5kbGUgc3RydWN0dXJlIGZvciB0aGUgVHgvUnggY2hhbm5lbC4NCi0gICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIERNQXggaW50ZXJmYWNlIGNsb2NrLg0KLSAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgZGVjbGFyZWQgRE1BIGhhbmRsZSBzdHJ1Y3R1cmUgd2l0aCB0aGUgcmVxdWlyZWQNCi0gVHgvUnggcGFyYW1ldGVycy4NCi0gICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIERNQSBUeC9SeCBjaGFubmVsLg0KLSAgICAgICAgICAgICgrKyspIEFzc29jaWF0ZSB0aGUgaW5pdGlhbGl6ZWQgRE1BIGhhbmRsZSB0byB0aGUgVUFSVCBETUEgVHgvUngNCi0gaGFuZGxlLg0KLSAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgcHJpb3JpdHkgYW5kIGVuYWJsZSB0aGUgTlZJQyBmb3IgdGhlIHRyYW5zZmVyDQotIGNvbXBsZXRlIGludGVycnVwdCBvbiB0aGUgRE1BIFR4L1J4IGNoYW5uZWwuDQotDQotICAgICgjKSBQcm9ncmFtIHRoZSBCYXVkIFJhdGUsIFdvcmQgTGVuZ3RoLCBTdG9wIEJpdCwgUGFyaXR5LCBQcmVzY2FsZXIgdmFsdWUgLA0KLSBIYXJkd2FyZSBmbG93IGNvbnRyb2wgYW5kIE1vZGUgKFJlY2VpdmVyL1RyYW5zbWl0dGVyKSBpbiB0aGUgaHVhcnQgaGFuZGxlIEluaXQNCi0gc3RydWN0dXJlLg0KLQ0KLSAgICAoIykgSWYgcmVxdWlyZWQsIHByb2dyYW0gVUFSVCBhZHZhbmNlZCBmZWF0dXJlcyAoVFgvUlggcGlucyBzd2FwLCBhdXRvIEJhdWQNCi0gcmF0ZSBkZXRlY3Rpb24sLi4uKSBpbiB0aGUgaHVhcnQgaGFuZGxlIEFkdmFuY2VkSW5pdCBzdHJ1Y3R1cmUuDQotDQotICAgICgjKSBGb3IgdGhlIFVBUlQgYXN5bmNocm9ub3VzIG1vZGUsIGluaXRpYWxpemUgdGhlIFVBUlQgcmVnaXN0ZXJzIGJ5IGNhbGxpbmcNCi0gICAgICAgIHRoZSBIQUxfVUFSVF9Jbml0KCkgQVBJLg0KLQ0KLSAgICAoIykgRm9yIHRoZSBVQVJUIEhhbGYgZHVwbGV4IG1vZGUsIGluaXRpYWxpemUgdGhlIFVBUlQgcmVnaXN0ZXJzIGJ5IGNhbGxpbmcNCi0gICAgICAgIHRoZSBIQUxfSGFsZkR1cGxleF9Jbml0KCkgQVBJLg0KLQ0KLSAgICAoIykgRm9yIHRoZSBVQVJUIExJTiAoTG9jYWwgSW50ZXJjb25uZWN0aW9uIE5ldHdvcmspIG1vZGUsIGluaXRpYWxpemUgdGhlDQotIFVBUlQgcmVnaXN0ZXJzIGJ5IGNhbGxpbmcgdGhlIEhBTF9MSU5fSW5pdCgpIEFQSS4NCi0NCi0gICAgKCMpIEZvciB0aGUgVUFSVCBNdWx0aXByb2Nlc3NvciBtb2RlLCBpbml0aWFsaXplIHRoZSBVQVJUIHJlZ2lzdGVycw0KLSAgICAgICAgYnkgY2FsbGluZyB0aGUgSEFMX011bHRpUHJvY2Vzc29yX0luaXQoKSBBUEkuDQotDQotICAgICgjKSBGb3IgdGhlIFVBUlQgUlM0ODUgRHJpdmVyIEVuYWJsZWQgbW9kZSwgaW5pdGlhbGl6ZSB0aGUgVUFSVCByZWdpc3RlcnMNCi0gICAgICAgIGJ5IGNhbGxpbmcgdGhlIEhBTF9SUzQ4NUV4X0luaXQoKSBBUEkuDQotDQotICAgIFsuLl0NCi0gICAgKEApIFRoZXNlIEFQSSdzIChIQUxfVUFSVF9Jbml0KCksIEhBTF9IYWxmRHVwbGV4X0luaXQoKSwgSEFMX0xJTl9Jbml0KCksDQotIEhBTF9NdWx0aVByb2Nlc3Nvcl9Jbml0KCksIGFsc28gY29uZmlndXJlIHRoZSBsb3cgbGV2ZWwgSGFyZHdhcmUgR1BJTywgQ0xPQ0ssDQotIENPUlRFWC4uLmV0YykgYnkgY2FsbGluZyB0aGUgY3VzdG9taXplZCBIQUxfVUFSVF9Nc3BJbml0KCkgQVBJLg0KLQ0KLSAgICAjIyMjIyBDYWxsYmFjayByZWdpc3RyYXRpb24gIyMjIyMNCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLSAgICBbLi5dDQotICAgIFRoZSBjb21waWxhdGlvbiBkZWZpbmUgVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyB3aGVuIHNldCB0byAxDQotICAgIGFsbG93cyB0aGUgdXNlciB0byBjb25maWd1cmUgZHluYW1pY2FsbHkgdGhlIGRyaXZlciBjYWxsYmFja3MuDQotDQotICAgIFsuLl0NCi0gICAgVXNlIEZ1bmN0aW9uIEhBTF9VQVJUX1JlZ2lzdGVyQ2FsbGJhY2soKSB0byByZWdpc3RlciBhIHVzZXIgY2FsbGJhY2suDQotICAgIEZ1bmN0aW9uIEhBTF9VQVJUX1JlZ2lzdGVyQ2FsbGJhY2soKSBhbGxvd3MgdG8gcmVnaXN0ZXIgZm9sbG93aW5nIGNhbGxiYWNrczoNCi0gICAgKCspIFR4SGFsZkNwbHRDYWxsYmFjayAgICAgICAgOiBUeCBIYWxmIENvbXBsZXRlIENhbGxiYWNrLg0KLSAgICAoKykgVHhDcGx0Q2FsbGJhY2sgICAgICAgICAgICA6IFR4IENvbXBsZXRlIENhbGxiYWNrLg0KLSAgICAoKykgUnhIYWxmQ3BsdENhbGxiYWNrICAgICAgICA6IFJ4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2suDQotICAgICgrKSBSeENwbHRDYWxsYmFjayAgICAgICAgICAgIDogUnggQ29tcGxldGUgQ2FsbGJhY2suDQotICAgICgrKSBFcnJvckNhbGxiYWNrICAgICAgICAgICAgIDogRXJyb3IgQ2FsbGJhY2suDQotICAgICgrKSBBYm9ydENwbHRDYWxsYmFjayAgICAgICAgIDogQWJvcnQgQ29tcGxldGUgQ2FsbGJhY2suDQotICAgICgrKSBBYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrIDogQWJvcnQgVHJhbnNtaXQgQ29tcGxldGUgQ2FsbGJhY2suDQotICAgICgrKSBBYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2sgIDogQWJvcnQgUmVjZWl2ZSBDb21wbGV0ZSBDYWxsYmFjay4NCi0gICAgKCspIFdha2V1cENhbGxiYWNrICAgICAgICAgICAgOiBXYWtldXAgQ2FsbGJhY2suDQotICAgICgrKSBSeEZpZm9GdWxsQ2FsbGJhY2sgICAgICAgIDogUnggRmlmbyBGdWxsIENhbGxiYWNrLg0KLSAgICAoKykgVHhGaWZvRW1wdHlDYWxsYmFjayAgICAgICA6IFR4IEZpZm8gRW1wdHkgQ2FsbGJhY2suDQotICAgICgrKSBNc3BJbml0Q2FsbGJhY2sgICAgICAgICAgIDogVUFSVCBNc3BJbml0Lg0KLSAgICAoKykgTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgICA6IFVBUlQgTXNwRGVJbml0Lg0KLSAgICBUaGlzIGZ1bmN0aW9uIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSwgdGhlIENhbGxiYWNrIElEDQotICAgIGFuZCBhIHBvaW50ZXIgdG8gdGhlIHVzZXIgY2FsbGJhY2sgZnVuY3Rpb24uDQotDQotICAgIFsuLl0NCi0gICAgVXNlIGZ1bmN0aW9uIEhBTF9VQVJUX1VuUmVnaXN0ZXJDYWxsYmFjaygpIHRvIHJlc2V0IGEgY2FsbGJhY2sgdG8gdGhlDQotIGRlZmF1bHQgd2VhayAoc3VyY2hhcmdlZCkgZnVuY3Rpb24uIEhBTF9VQVJUX1VuUmVnaXN0ZXJDYWxsYmFjaygpIHRha2VzIGFzDQotIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSwgYW5kIHRoZSBDYWxsYmFjayBJRC4gVGhpcyBmdW5jdGlvbiBhbGxvd3MNCi0gdG8gcmVzZXQgZm9sbG93aW5nIGNhbGxiYWNrczoNCi0gICAgKCspIFR4SGFsZkNwbHRDYWxsYmFjayAgICAgICAgOiBUeCBIYWxmIENvbXBsZXRlIENhbGxiYWNrLg0KLSAgICAoKykgVHhDcGx0Q2FsbGJhY2sgICAgICAgICAgICA6IFR4IENvbXBsZXRlIENhbGxiYWNrLg0KLSAgICAoKykgUnhIYWxmQ3BsdENhbGxiYWNrICAgICAgICA6IFJ4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2suDQotICAgICgrKSBSeENwbHRDYWxsYmFjayAgICAgICAgICAgIDogUnggQ29tcGxldGUgQ2FsbGJhY2suDQotICAgICgrKSBFcnJvckNhbGxiYWNrICAgICAgICAgICAgIDogRXJyb3IgQ2FsbGJhY2suDQotICAgICgrKSBBYm9ydENwbHRDYWxsYmFjayAgICAgICAgIDogQWJvcnQgQ29tcGxldGUgQ2FsbGJhY2suDQotICAgICgrKSBBYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrIDogQWJvcnQgVHJhbnNtaXQgQ29tcGxldGUgQ2FsbGJhY2suDQotICAgICgrKSBBYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2sgIDogQWJvcnQgUmVjZWl2ZSBDb21wbGV0ZSBDYWxsYmFjay4NCi0gICAgKCspIFdha2V1cENhbGxiYWNrICAgICAgICAgICAgOiBXYWtldXAgQ2FsbGJhY2suDQotICAgICgrKSBSeEZpZm9GdWxsQ2FsbGJhY2sgICAgICAgIDogUnggRmlmbyBGdWxsIENhbGxiYWNrLg0KLSAgICAoKykgVHhGaWZvRW1wdHlDYWxsYmFjayAgICAgICA6IFR4IEZpZm8gRW1wdHkgQ2FsbGJhY2suDQotICAgICgrKSBNc3BJbml0Q2FsbGJhY2sgICAgICAgICAgIDogVUFSVCBNc3BJbml0Lg0KLSAgICAoKykgTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgICA6IFVBUlQgTXNwRGVJbml0Lg0KLQ0KLSAgICBbLi5dDQotICAgIEZvciBzcGVjaWZpYyBjYWxsYmFjayBSeEV2ZW50Q2FsbGJhY2ssIHVzZSBkZWRpY2F0ZWQgcmVnaXN0cmF0aW9uL3Jlc2V0DQotIGZ1bmN0aW9uczogcmVzcGVjdGl2ZWx5IEhBTF9VQVJUX1JlZ2lzdGVyUnhFdmVudENhbGxiYWNrKCkgLA0KLSBIQUxfVUFSVF9VblJlZ2lzdGVyUnhFdmVudENhbGxiYWNrKCkuDQotDQotICAgIFsuLl0NCi0gICAgQnkgZGVmYXVsdCwgYWZ0ZXIgdGhlIEhBTF9VQVJUX0luaXQoKSBhbmQgd2hlbiB0aGUgc3RhdGUgaXMNCi0gSEFMX1VBUlRfU1RBVEVfUkVTRVQgYWxsIGNhbGxiYWNrcyBhcmUgc2V0IHRvIHRoZSBjb3JyZXNwb25kaW5nIHdlYWsNCi0gKHN1cmNoYXJnZWQpIGZ1bmN0aW9uczogZXhhbXBsZXMgSEFMX1VBUlRfVHhDcGx0Q2FsbGJhY2soKSwNCi0gSEFMX1VBUlRfUnhIYWxmQ3BsdENhbGxiYWNrKCkuIEV4Y2VwdGlvbiBkb25lIGZvciBNc3BJbml0IGFuZCBNc3BEZUluaXQNCi0gZnVuY3Rpb25zIHRoYXQgYXJlIHJlc3BlY3RpdmVseSByZXNldCB0byB0aGUgbGVnYWN5IHdlYWsgKHN1cmNoYXJnZWQpIGZ1bmN0aW9ucw0KLSBpbiB0aGUgSEFMX1VBUlRfSW5pdCgpIGFuZCBIQUxfVUFSVF9EZUluaXQoKSBvbmx5IHdoZW4gdGhlc2UgY2FsbGJhY2tzIGFyZSBudWxsDQotIChub3QgcmVnaXN0ZXJlZCBiZWZvcmVoYW5kKS4gSWYgbm90LCBNc3BJbml0IG9yIE1zcERlSW5pdCBhcmUgbm90IG51bGwsIHRoZQ0KLSBIQUxfVUFSVF9Jbml0KCkgYW5kIEhBTF9VQVJUX0RlSW5pdCgpIGtlZXAgYW5kIHVzZSB0aGUgdXNlciBNc3BJbml0L01zcERlSW5pdA0KLSBjYWxsYmFja3MgKHJlZ2lzdGVyZWQgYmVmb3JlaGFuZCkuDQotDQotICAgIFsuLl0NCi0gICAgQ2FsbGJhY2tzIGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZCBpbiBIQUxfVUFSVF9TVEFURV9SRUFEWSBzdGF0ZSBvbmx5Lg0KLSAgICBFeGNlcHRpb24gZG9uZSBNc3BJbml0L01zcERlSW5pdCB0aGF0IGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZA0KLSAgICBpbiBIQUxfVUFSVF9TVEFURV9SRUFEWSBvciBIQUxfVUFSVF9TVEFURV9SRVNFVCBzdGF0ZSwgdGh1cyByZWdpc3RlcmVkDQotICh1c2VyKSBNc3BJbml0L0RlSW5pdCBjYWxsYmFja3MgY2FuIGJlIHVzZWQgZHVyaW5nIHRoZSBJbml0L0RlSW5pdC4gSW4gdGhhdA0KLSBjYXNlIGZpcnN0IHJlZ2lzdGVyIHRoZSBNc3BJbml0L01zcERlSW5pdCB1c2VyIGNhbGxiYWNrcyB1c2luZw0KLSBIQUxfVUFSVF9SZWdpc3RlckNhbGxiYWNrKCkgYmVmb3JlIGNhbGxpbmcgSEFMX1VBUlRfRGVJbml0KCkgb3IgSEFMX1VBUlRfSW5pdCgpDQotIGZ1bmN0aW9uLg0KLQ0KLSAgICBbLi5dDQotICAgIFdoZW4gVGhlIGNvbXBpbGF0aW9uIGRlZmluZSBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTIGlzIHNldCB0byAwIG9yDQotICAgIG5vdCBkZWZpbmVkLCB0aGUgY2FsbGJhY2sgcmVnaXN0cmF0aW9uIGZlYXR1cmUgaXMgbm90IGF2YWlsYWJsZQ0KLSAgICBhbmQgd2VhayAoc3VyY2hhcmdlZCkgY2FsbGJhY2tzIGFyZSB1c2VkLg0KLQ0KLQ0KLSAgQGVuZHZlcmJhdGltDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICovDQotDQotLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaW5jbHVkZSAic3RtMzJnNHh4X2hhbC5oIg0KLQ0KLS8qKiBAYWRkdG9ncm91cCBTVE0zMkc0eHhfSEFMX0RyaXZlcg0KLSAqIEB7DQotICovDQotDQotLyoqIEBkZWZncm91cCBVQVJUIFVBUlQNCi0gKiBAYnJpZWYgSEFMIFVBUlQgbW9kdWxlIGRyaXZlcg0KLSAqIEB7DQotICovDQotDQotI2lmZGVmIEhBTF9VQVJUX01PRFVMRV9FTkFCTEVEDQotDQotLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAZGVmZ3JvdXAgVUFSVF9Qcml2YXRlX0NvbnN0YW50cyBVQVJUIFByaXZhdGUgQ29uc3RhbnRzDQotICogQHsNCi0gKi8NCi0jZGVmaW5lIFVTQVJUX0NSMV9GSUVMRFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICgodWludDMyX3QpKFVTQVJUX0NSMV9NIHwgVVNBUlRfQ1IxX1BDRSB8IFVTQVJUX0NSMV9QUyB8IFVTQVJUX0NSMV9URSB8ICAgIFwNCi0gICAgICAgICAgICAgIFVTQVJUX0NSMV9SRSB8IFVTQVJUX0NSMV9PVkVSOCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgICAgIFVTQVJUX0NSMV9GSUZPRU4pKSAvKiE8IFVBUlQgb3IgVVNBUlQgQ1IxIGZpZWxkcyBvZiBwYXJhbWV0ZXJzIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgYnkgVUFSVF9TZXRDb25maWcgQVBJICovDQotDQotI2RlZmluZSBVU0FSVF9DUjNfRklFTERTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgKCh1aW50MzJfdCkoVVNBUlRfQ1IzX1JUU0UgfCBVU0FSVF9DUjNfQ1RTRSB8IFVTQVJUX0NSM19PTkVCSVQgfCAgICAgICAgICAgIFwNCi0gICAgICAgICAgICAgIFVTQVJUX0NSM19UWEZUQ0ZHIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICAgICAgICBVU0FSVF9DUjNfUlhGVENGRykpIC8qITwgVUFSVCBvciBVU0FSVCBDUjMgZmllbGRzIG9mIHBhcmFtZXRlcnMgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgYnkgVUFSVF9TZXRDb25maWcgQVBJICovDQotDQotI2RlZmluZSBMUFVBUlRfQlJSX01JTiAweDAwMDAwMzAwVSAvKiBMUFVBUlQgQlJSIG1pbmltdW0gYXV0aG9yaXplZCB2YWx1ZSAqLw0KLSNkZWZpbmUgTFBVQVJUX0JSUl9NQVggMHgwMDBGRkZGRlUgLyogTFBVQVJUIEJSUiBtYXhpbXVtIGF1dGhvcml6ZWQgdmFsdWUgKi8NCi0NCi0jZGVmaW5lIFVBUlRfQlJSX01JTiAweDEwVSAgICAgICAvKiBVQVJUIEJSUiBtaW5pbXVtIGF1dGhvcml6ZWQgdmFsdWUgKi8NCi0jZGVmaW5lIFVBUlRfQlJSX01BWCAweDAwMDBGRkZGVSAvKiBVQVJUIEJSUiBtYXhpbXVtIGF1dGhvcml6ZWQgdmFsdWUgKi8NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGFkZHRvZ3JvdXAgVUFSVF9Qcml2YXRlX0Z1bmN0aW9ucw0KLSAqIEB7DQotICovDQotc3RhdGljIHZvaWQgVUFSVF9FbmRUeFRyYW5zZmVyKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOw0KLXN0YXRpYyB2b2lkIFVBUlRfRW5kUnhUcmFuc2ZlcihVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsNCi1zdGF0aWMgdm9pZCBVQVJUX0RNQVRyYW5zbWl0Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7DQotc3RhdGljIHZvaWQgVUFSVF9ETUFSZWNlaXZlQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7DQotc3RhdGljIHZvaWQgVUFSVF9ETUFSeEhhbGZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsNCi1zdGF0aWMgdm9pZCBVQVJUX0RNQVR4SGFsZkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOw0KLXN0YXRpYyB2b2lkIFVBUlRfRE1BRXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOw0KLXN0YXRpYyB2b2lkIFVBUlRfRE1BQWJvcnRPbkVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsNCi1zdGF0aWMgdm9pZCBVQVJUX0RNQVR4QWJvcnRDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7DQotc3RhdGljIHZvaWQgVUFSVF9ETUFSeEFib3J0Q2FsbGJhY2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOw0KLXN0YXRpYyB2b2lkIFVBUlRfRE1BVHhPbmx5QWJvcnRDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7DQotc3RhdGljIHZvaWQgVUFSVF9ETUFSeE9ubHlBYm9ydENhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsNCi1zdGF0aWMgdm9pZCBVQVJUX1R4SVNSXzhCSVQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7DQotc3RhdGljIHZvaWQgVUFSVF9UeElTUl8xNkJJVChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsNCi1zdGF0aWMgdm9pZCBVQVJUX1R4SVNSXzhCSVRfRklGT0VOKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOw0KLXN0YXRpYyB2b2lkIFVBUlRfVHhJU1JfMTZCSVRfRklGT0VOKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOw0KLXN0YXRpYyB2b2lkIFVBUlRfRW5kVHJhbnNtaXRfSVQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7DQotc3RhdGljIHZvaWQgVUFSVF9SeElTUl84QklUKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOw0KLXN0YXRpYyB2b2lkIFVBUlRfUnhJU1JfMTZCSVQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7DQotc3RhdGljIHZvaWQgVUFSVF9SeElTUl84QklUX0ZJRk9FTihVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsNCi1zdGF0aWMgdm9pZCBVQVJUX1J4SVNSXzE2QklUX0ZJRk9FTihVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBhZGR0b2dyb3VwIFVBUlRfUHJpdmF0ZV92YXJpYWJsZXMNCi0gKiBAew0KLSAqLw0KLWNvbnN0IHVpbnQxNl90IFVBUlRQcmVzY1RhYmxlWzEyXSA9IHsxVSwgIDJVLCAgNFUsICA2VSwgIDhVLCAgIDEwVSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTJVLCAxNlUsIDMyVSwgNjRVLCAxMjhVLCAyNTZVfTsNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIEV4cG9ydGVkIENvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0NCi0vKiogQGRlZmdyb3VwIFVBUlRfRXhwb3J0ZWRfRnVuY3Rpb25zIFVBUlQgRXhwb3J0ZWQgRnVuY3Rpb25zDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFVBUlRfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQNCi1kZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMNCi0gICogIEBicmllZiAgICBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMNCi0gICoNCi1AdmVyYmF0aW0NCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zICMjIyMjDQotID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgWy4uXQ0KLSAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGluaXRpYWxpemUgdGhlDQotVVNBUlR4IG9yIHRoZSBVQVJUeSBpbiBhc3luY2hyb25vdXMgbW9kZS4NCi0gICAgICAoKykgRm9yIHRoZSBhc3luY2hyb25vdXMgbW9kZSB0aGUgcGFyYW1ldGVycyBiZWxvdyBjYW4gYmUgY29uZmlndXJlZDoNCi0gICAgICAgICgrKykgQmF1ZCBSYXRlDQotICAgICAgICAoKyspIFdvcmQgTGVuZ3RoDQotICAgICAgICAoKyspIFN0b3AgQml0DQotICAgICAgICAoKyspIFBhcml0eTogSWYgdGhlIHBhcml0eSBpcyBlbmFibGVkLCB0aGVuIHRoZSBNU0IgYml0IG9mIHRoZSBkYXRhDQotd3JpdHRlbiBpbiB0aGUgZGF0YSByZWdpc3RlciBpcyB0cmFuc21pdHRlZCBidXQgaXMgY2hhbmdlZCBieSB0aGUgcGFyaXR5IGJpdC4NCi0gICAgICAgICgrKykgSGFyZHdhcmUgZmxvdyBjb250cm9sDQotICAgICAgICAoKyspIFJlY2VpdmVyL3RyYW5zbWl0dGVyIG1vZGVzDQotICAgICAgICAoKyspIE92ZXIgU2FtcGxpbmcgTWV0aG9kDQotICAgICAgICAoKyspIE9uZS1CaXQgU2FtcGxpbmcgTWV0aG9kDQotICAgICAgKCspIEZvciB0aGUgYXN5bmNocm9ub3VzIG1vZGUsIHRoZSBmb2xsb3dpbmcgYWR2YW5jZWQgZmVhdHVyZXMgY2FuIGJlDQotY29uZmlndXJlZCBhcyB3ZWxsOg0KLSAgICAgICAgKCsrKSBUWCBhbmQvb3IgUlggcGluIGxldmVsIGludmVyc2lvbg0KLSAgICAgICAgKCsrKSBkYXRhIGxvZ2ljYWwgbGV2ZWwgaW52ZXJzaW9uDQotICAgICAgICAoKyspIFJYIGFuZCBUWCBwaW5zIHN3YXANCi0gICAgICAgICgrKykgUlggb3ZlcnJ1biBkZXRlY3Rpb24gZGlzYWJsaW5nDQotICAgICAgICAoKyspIERNQSBkaXNhYmxpbmcgb24gUlggZXJyb3INCi0gICAgICAgICgrKykgTVNCIGZpcnN0IG9uIGNvbW11bmljYXRpb24gbGluZQ0KLSAgICAgICAgKCsrKSBhdXRvIEJhdWQgcmF0ZSBkZXRlY3Rpb24NCi0gICAgWy4uXQ0KLSAgICBUaGUgSEFMX1VBUlRfSW5pdCgpLCBIQUxfSGFsZkR1cGxleF9Jbml0KCksIEhBTF9MSU5fSW5pdCgpYW5kDQotSEFMX011bHRpUHJvY2Vzc29yX0luaXQoKUFQSSBmb2xsb3cgcmVzcGVjdGl2ZWx5IHRoZSBVQVJUIGFzeW5jaHJvbm91cywgVUFSVA0KLUhhbGYgZHVwbGV4LCBVQVJUIExJTiBtb2RlIGFuZCBVQVJUIG11bHRpcHJvY2Vzc29yIG1vZGUgY29uZmlndXJhdGlvbiBwcm9jZWR1cmVzDQotKGRldGFpbHMgZm9yIHRoZSBwcm9jZWR1cmVzIGFyZSBhdmFpbGFibGUgaW4gcmVmZXJlbmNlIG1hbnVhbCkuDQotDQotQGVuZHZlcmJhdGltDQotDQotICBEZXBlbmRpbmcgb24gdGhlIGZyYW1lIGxlbmd0aCBkZWZpbmVkIGJ5IHRoZSBNMSBhbmQgTTAgYml0cyAoNy1iaXQsDQotICA4LWJpdCBvciA5LWJpdCksIHRoZSBwb3NzaWJsZSBVQVJUIGZvcm1hdHMgYXJlIGxpc3RlZCBpbiB0aGUNCi0gIGZvbGxvd2luZyB0YWJsZS4NCi0NCi0gIFRhYmxlIDEuIFVBUlQgZnJhbWUgZm9ybWF0Lg0KLSAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQotICAgIHwgIE0xIGJpdCB8ICBNMCBiaXQgfCAgUENFIGJpdCAgfCAgICAgICAgICAgICBVQVJUIGZyYW1lICAgICAgICAgICAgICAgIHwNCi0gICAgfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KLSAgICB8ICAgIDAgICAgfCAgICAwICAgIHwgICAgMCAgICAgIHwgICAgfCBTQiB8ICAgIDggYml0IGRhdGEgICB8IFNUQiB8ICAgICB8DQotICAgIHwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCi0gICAgfCAgICAwICAgIHwgICAgMCAgICB8ICAgIDEgICAgICB8ICAgIHwgU0IgfCA3IGJpdCBkYXRhIHwgUEIgfCBTVEIgfCAgICAgfA0KLSAgICB8LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQotICAgIHwgICAgMCAgICB8ICAgIDEgICAgfCAgICAwICAgICAgfCAgICB8IFNCIHwgICAgOSBiaXQgZGF0YSAgIHwgU1RCIHwgICAgIHwNCi0gICAgfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KLSAgICB8ICAgIDAgICAgfCAgICAxICAgIHwgICAgMSAgICAgIHwgICAgfCBTQiB8IDggYml0IGRhdGEgfCBQQiB8IFNUQiB8ICAgICB8DQotICAgIHwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCi0gICAgfCAgICAxICAgIHwgICAgMCAgICB8ICAgIDAgICAgICB8ICAgIHwgU0IgfCAgICA3IGJpdCBkYXRhICAgfCBTVEIgfCAgICAgfA0KLSAgICB8LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQotICAgIHwgICAgMSAgICB8ICAgIDAgICAgfCAgICAxICAgICAgfCAgICB8IFNCIHwgNiBiaXQgZGF0YSB8IFBCIHwgU1RCIHwgICAgIHwNCi0gICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KLQ0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgSW5pdGlhbGl6ZSB0aGUgVUFSVCBtb2RlIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkDQotICogICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIFVBUlRfSW5pdFR5cGVEZWYgYW5kIGluaXRpYWxpemUgdGhlIGFzc29jaWF0ZWQNCi0gKiBoYW5kbGUuDQotICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLg0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0luaXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkgew0KLSAgLyogQ2hlY2sgdGhlIFVBUlQgaGFuZGxlIGFsbG9jYXRpb24gKi8NCi0gIGlmIChodWFydCA9PSBOVUxMKSB7DQotICAgIHJldHVybiBIQUxfRVJST1I7DQotICB9DQotDQotICBpZiAoaHVhcnQtPkluaXQuSHdGbG93Q3RsICE9IFVBUlRfSFdDT05UUk9MX05PTkUpIHsNCi0gICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gICAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfSFdGTE9XX0lOU1RBTkNFKGh1YXJ0LT5JbnN0YW5jZSkpOw0KLSAgfSBlbHNlIHsNCi0gICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gICAgYXNzZXJ0X3BhcmFtKChJU19VQVJUX0lOU1RBTkNFKGh1YXJ0LT5JbnN0YW5jZSkpIHx8DQotICAgICAgICAgICAgICAgICAoSVNfTFBVQVJUX0lOU1RBTkNFKGh1YXJ0LT5JbnN0YW5jZSkpKTsNCi0gIH0NCi0NCi0gIGlmIChodWFydC0+Z1N0YXRlID09IEhBTF9VQVJUX1NUQVRFX1JFU0VUKSB7DQotICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8NCi0gICAgaHVhcnQtPkxvY2sgPSBIQUxfVU5MT0NLRUQ7DQotDQotI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpDQotICAgIFVBUlRfSW5pdENhbGxiYWNrc1RvRGVmYXVsdChodWFydCk7DQotDQotICAgIGlmIChodWFydC0+TXNwSW5pdENhbGxiYWNrID09IE5VTEwpIHsNCi0gICAgICBodWFydC0+TXNwSW5pdENhbGxiYWNrID0gSEFMX1VBUlRfTXNwSW5pdDsNCi0gICAgfQ0KLQ0KLSAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8NCi0gICAgaHVhcnQtPk1zcEluaXRDYWxsYmFjayhodWFydCk7DQotI2Vsc2UNCi0gICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIDogR1BJTywgQ0xPQ0sgKi8NCi0gICAgSEFMX1VBUlRfTXNwSW5pdChodWFydCk7DQotI2VuZGlmIC8qIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTKSAqLw0KLSAgfQ0KLQ0KLSAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX0JVU1k7DQotDQotICBfX0hBTF9VQVJUX0RJU0FCTEUoaHVhcnQpOw0KLQ0KLSAgLyogU2V0IHRoZSBVQVJUIENvbW11bmljYXRpb24gcGFyYW1ldGVycyAqLw0KLSAgaWYgKFVBUlRfU2V0Q29uZmlnKGh1YXJ0KSA9PSBIQUxfRVJST1IpIHsNCi0gICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gIH0NCi0NCi0gIGlmIChodWFydC0+QWR2YW5jZWRJbml0LkFkdkZlYXR1cmVJbml0ICE9IFVBUlRfQURWRkVBVFVSRV9OT19JTklUKSB7DQotICAgIFVBUlRfQWR2RmVhdHVyZUNvbmZpZyhodWFydCk7DQotICB9DQotDQotICAvKiBJbiBhc3luY2hyb25vdXMgbW9kZSwgdGhlIGZvbGxvd2luZyBiaXRzIG11c3QgYmUga2VwdCBjbGVhcmVkOg0KLSAgLSBMSU5FTiBhbmQgQ0xLRU4gYml0cyBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLA0KLSAgLSBTQ0VOLCBIRFNFTCBhbmQgSVJFTiAgYml0cyBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLiovDQotICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjIsIChVU0FSVF9DUjJfTElORU4gfCBVU0FSVF9DUjJfQ0xLRU4pKTsNCi0gIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywNCi0gICAgICAgICAgICAoVVNBUlRfQ1IzX1NDRU4gfCBVU0FSVF9DUjNfSERTRUwgfCBVU0FSVF9DUjNfSVJFTikpOw0KLQ0KLSAgX19IQUxfVUFSVF9FTkFCTEUoaHVhcnQpOw0KLQ0KLSAgLyogVEVBQ0sgYW5kL29yIFJFQUNLIHRvIGNoZWNrIGJlZm9yZSBtb3ZpbmcgaHVhcnQtPmdTdGF0ZSBhbmQgaHVhcnQtPlJ4U3RhdGUNCi0gICAqIHRvIFJlYWR5ICovDQotICByZXR1cm4gKFVBUlRfQ2hlY2tJZGxlU3RhdGUoaHVhcnQpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmIEluaXRpYWxpemUgdGhlIGhhbGYtZHVwbGV4IG1vZGUgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQNCi0gKiAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgVUFSVF9Jbml0VHlwZURlZiBhbmQgY3JlYXRlcyB0aGUgYXNzb2NpYXRlZCBoYW5kbGUuDQotICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLg0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9IYWxmRHVwbGV4X0luaXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkgew0KLSAgLyogQ2hlY2sgdGhlIFVBUlQgaGFuZGxlIGFsbG9jYXRpb24gKi8NCi0gIGlmIChodWFydCA9PSBOVUxMKSB7DQotICAgIHJldHVybiBIQUxfRVJST1I7DQotICB9DQotDQotICAvKiBDaGVjayBVQVJUIGluc3RhbmNlICovDQotICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9IQUxGRFVQTEVYX0lOU1RBTkNFKGh1YXJ0LT5JbnN0YW5jZSkpOw0KLQ0KLSAgaWYgKGh1YXJ0LT5nU3RhdGUgPT0gSEFMX1VBUlRfU1RBVEVfUkVTRVQpIHsNCi0gICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLw0KLSAgICBodWFydC0+TG9jayA9IEhBTF9VTkxPQ0tFRDsNCi0NCi0jaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkNCi0gICAgVUFSVF9Jbml0Q2FsbGJhY2tzVG9EZWZhdWx0KGh1YXJ0KTsNCi0NCi0gICAgaWYgKGh1YXJ0LT5Nc3BJbml0Q2FsbGJhY2sgPT0gTlVMTCkgew0KLSAgICAgIGh1YXJ0LT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfVUFSVF9Nc3BJbml0Ow0KLSAgICB9DQotDQotICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLw0KLSAgICBodWFydC0+TXNwSW5pdENhbGxiYWNrKGh1YXJ0KTsNCi0jZWxzZQ0KLSAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgOiBHUElPLCBDTE9DSyAqLw0KLSAgICBIQUxfVUFSVF9Nc3BJbml0KGh1YXJ0KTsNCi0jZW5kaWYgLyogKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MpICovDQotICB9DQotDQotICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWTsNCi0NCi0gIF9fSEFMX1VBUlRfRElTQUJMRShodWFydCk7DQotDQotICAvKiBTZXQgdGhlIFVBUlQgQ29tbXVuaWNhdGlvbiBwYXJhbWV0ZXJzICovDQotICBpZiAoVUFSVF9TZXRDb25maWcoaHVhcnQpID09IEhBTF9FUlJPUikgew0KLSAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgfQ0KLQ0KLSAgaWYgKGh1YXJ0LT5BZHZhbmNlZEluaXQuQWR2RmVhdHVyZUluaXQgIT0gVUFSVF9BRFZGRUFUVVJFX05PX0lOSVQpIHsNCi0gICAgVUFSVF9BZHZGZWF0dXJlQ29uZmlnKGh1YXJ0KTsNCi0gIH0NCi0NCi0gIC8qIEluIGhhbGYtZHVwbGV4IG1vZGUsIHRoZSBmb2xsb3dpbmcgYml0cyBtdXN0IGJlIGtlcHQgY2xlYXJlZDoNCi0gIC0gTElORU4gYW5kIENMS0VOIGJpdHMgaW4gdGhlIFVTQVJUX0NSMiByZWdpc3RlciwNCi0gIC0gU0NFTiBhbmQgSVJFTiBiaXRzIGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIuKi8NCi0gIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMiwgKFVTQVJUX0NSMl9MSU5FTiB8IFVTQVJUX0NSMl9DTEtFTikpOw0KLSAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCAoVVNBUlRfQ1IzX0lSRU4gfCBVU0FSVF9DUjNfU0NFTikpOw0KLQ0KLSAgLyogRW5hYmxlIHRoZSBIYWxmLUR1cGxleCBtb2RlIGJ5IHNldHRpbmcgdGhlIEhEU0VMIGJpdCBpbiB0aGUgQ1IzIHJlZ2lzdGVyICovDQotICBTRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfSERTRUwpOw0KLQ0KLSAgX19IQUxfVUFSVF9FTkFCTEUoaHVhcnQpOw0KLQ0KLSAgLyogVEVBQ0sgYW5kL29yIFJFQUNLIHRvIGNoZWNrIGJlZm9yZSBtb3ZpbmcgaHVhcnQtPmdTdGF0ZSBhbmQgaHVhcnQtPlJ4U3RhdGUNCi0gICAqIHRvIFJlYWR5ICovDQotICByZXR1cm4gKFVBUlRfQ2hlY2tJZGxlU3RhdGUoaHVhcnQpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmIEluaXRpYWxpemUgdGhlIExJTiBtb2RlIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkDQotICogICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIFVBUlRfSW5pdFR5cGVEZWYgYW5kIGNyZWF0ZXMgdGhlIGFzc29jaWF0ZWQgaGFuZGxlLg0KLSAqIEBwYXJhbSBodWFydCAgICAgICAgICAgICBVQVJUIGhhbmRsZS4NCi0gKiBAcGFyYW0gQnJlYWtEZXRlY3RMZW5ndGggU3BlY2lmaWVzIHRoZSBMSU4gYnJlYWsgZGV0ZWN0aW9uIGxlbmd0aC4NCi0gKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICBAYXJnIEByZWYgVUFSVF9MSU5CUkVBS0RFVEVDVExFTkdUSF8xMEIgMTAtYml0IGJyZWFrIGRldGVjdGlvbg0KLSAqICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0xJTkJSRUFLREVURUNUTEVOR1RIXzExQiAxMS1iaXQgYnJlYWsgZGV0ZWN0aW9uDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xJTl9Jbml0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEJyZWFrRGV0ZWN0TGVuZ3RoKSB7DQotICAvKiBDaGVjayB0aGUgVUFSVCBoYW5kbGUgYWxsb2NhdGlvbiAqLw0KLSAgaWYgKGh1YXJ0ID09IE5VTEwpIHsNCi0gICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gIH0NCi0NCi0gIC8qIENoZWNrIHRoZSBMSU4gVUFSVCBpbnN0YW5jZSAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfTElOX0lOU1RBTkNFKGh1YXJ0LT5JbnN0YW5jZSkpOw0KLSAgLyogQ2hlY2sgdGhlIEJyZWFrIGRldGVjdGlvbiBsZW5ndGggcGFyYW1ldGVyICovDQotICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9MSU5fQlJFQUtfREVURUNUX0xFTkdUSChCcmVha0RldGVjdExlbmd0aCkpOw0KLQ0KLSAgLyogTElOIG1vZGUgbGltaXRlZCB0byAxNi1iaXQgb3ZlcnNhbXBsaW5nIG9ubHkgKi8NCi0gIGlmIChodWFydC0+SW5pdC5PdmVyU2FtcGxpbmcgPT0gVUFSVF9PVkVSU0FNUExJTkdfOCkgew0KLSAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgfQ0KLSAgLyogTElOIG1vZGUgbGltaXRlZCB0byA4LWJpdCBkYXRhIGxlbmd0aCAqLw0KLSAgaWYgKGh1YXJ0LT5Jbml0LldvcmRMZW5ndGggIT0gVUFSVF9XT1JETEVOR1RIXzhCKSB7DQotICAgIHJldHVybiBIQUxfRVJST1I7DQotICB9DQotDQotICBpZiAoaHVhcnQtPmdTdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9SRVNFVCkgew0KLSAgICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovDQotICAgIGh1YXJ0LT5Mb2NrID0gSEFMX1VOTE9DS0VEOw0KLQ0KLSNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQ0KLSAgICBVQVJUX0luaXRDYWxsYmFja3NUb0RlZmF1bHQoaHVhcnQpOw0KLQ0KLSAgICBpZiAoaHVhcnQtPk1zcEluaXRDYWxsYmFjayA9PSBOVUxMKSB7DQotICAgICAgaHVhcnQtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9VQVJUX01zcEluaXQ7DQotICAgIH0NCi0NCi0gICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovDQotICAgIGh1YXJ0LT5Nc3BJbml0Q2FsbGJhY2soaHVhcnQpOw0KLSNlbHNlDQotICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLICovDQotICAgIEhBTF9VQVJUX01zcEluaXQoaHVhcnQpOw0KLSNlbmRpZiAvKiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUykgKi8NCi0gIH0NCi0NCi0gIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9CVVNZOw0KLQ0KLSAgX19IQUxfVUFSVF9ESVNBQkxFKGh1YXJ0KTsNCi0NCi0gIC8qIFNldCB0aGUgVUFSVCBDb21tdW5pY2F0aW9uIHBhcmFtZXRlcnMgKi8NCi0gIGlmIChVQVJUX1NldENvbmZpZyhodWFydCkgPT0gSEFMX0VSUk9SKSB7DQotICAgIHJldHVybiBIQUxfRVJST1I7DQotICB9DQotDQotICBpZiAoaHVhcnQtPkFkdmFuY2VkSW5pdC5BZHZGZWF0dXJlSW5pdCAhPSBVQVJUX0FEVkZFQVRVUkVfTk9fSU5JVCkgew0KLSAgICBVQVJUX0FkdkZlYXR1cmVDb25maWcoaHVhcnQpOw0KLSAgfQ0KLQ0KLSAgLyogSW4gTElOIG1vZGUsIHRoZSBmb2xsb3dpbmcgYml0cyBtdXN0IGJlIGtlcHQgY2xlYXJlZDoNCi0gIC0gTElORU4gYW5kIENMS0VOIGJpdHMgaW4gdGhlIFVTQVJUX0NSMiByZWdpc3RlciwNCi0gIC0gU0NFTiBhbmQgSVJFTiBiaXRzIGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIuKi8NCi0gIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX0NMS0VOKTsNCi0gIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywNCi0gICAgICAgICAgICAoVVNBUlRfQ1IzX0hEU0VMIHwgVVNBUlRfQ1IzX0lSRU4gfCBVU0FSVF9DUjNfU0NFTikpOw0KLQ0KLSAgLyogRW5hYmxlIHRoZSBMSU4gbW9kZSBieSBzZXR0aW5nIHRoZSBMSU5FTiBiaXQgaW4gdGhlIENSMiByZWdpc3RlciAqLw0KLSAgU0VUX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX0xJTkVOKTsNCi0NCi0gIC8qIFNldCB0aGUgVVNBUlQgTElOIEJyZWFrIGRldGVjdGlvbiBsZW5ndGguICovDQotICBNT0RJRllfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IyLCBVU0FSVF9DUjJfTEJETCwgQnJlYWtEZXRlY3RMZW5ndGgpOw0KLQ0KLSAgX19IQUxfVUFSVF9FTkFCTEUoaHVhcnQpOw0KLQ0KLSAgLyogVEVBQ0sgYW5kL29yIFJFQUNLIHRvIGNoZWNrIGJlZm9yZSBtb3ZpbmcgaHVhcnQtPmdTdGF0ZSBhbmQgaHVhcnQtPlJ4U3RhdGUNCi0gICAqIHRvIFJlYWR5ICovDQotICByZXR1cm4gKFVBUlRfQ2hlY2tJZGxlU3RhdGUoaHVhcnQpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmIEluaXRpYWxpemUgdGhlIG11bHRpcHJvY2Vzc29yIG1vZGUgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQNCi0gKiAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgVUFSVF9Jbml0VHlwZURlZiBhbmQgaW5pdGlhbGl6ZSB0aGUgYXNzb2NpYXRlZA0KLSAqIGhhbmRsZS4NCi0gKiBAcGFyYW0gaHVhcnQgICAgICAgIFVBUlQgaGFuZGxlLg0KLSAqIEBwYXJhbSBBZGRyZXNzICAgICAgVUFSVCBub2RlIGFkZHJlc3MgKDQtLCA2LSwgNy0gb3IgOC1iaXQgbG9uZykuDQotICogQHBhcmFtIFdha2VVcE1ldGhvZCBTcGVjaWZpZXMgdGhlIFVBUlQgd2FrZXVwIG1ldGhvZC4NCi0gKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICBAYXJnIEByZWYgVUFSVF9XQUtFVVBNRVRIT0RfSURMRUxJTkUgV2FrZVVwIGJ5IGFuIGlkbGUgbGluZQ0KLSAqIGRldGVjdGlvbg0KLSAqICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX1dBS0VVUE1FVEhPRF9BRERSRVNTTUFSSyBXYWtlVXAgYnkgYW4gYWRkcmVzcyBtYXJrDQotICogQG5vdGUgIElmIHRoZSB1c2VyIHJlc29ydHMgdG8gaWRsZSBsaW5lIGRldGVjdGlvbiB3YWtlIHVwLCB0aGUgQWRkcmVzcw0KLSAqIHBhcmFtZXRlciBpcyB1c2VsZXNzIGFuZCBpZ25vcmVkIGJ5IHRoZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbi4NCi0gKiBAbm90ZSAgSWYgdGhlIHVzZXIgcmVzb3J0cyB0byBhZGRyZXNzIG1hcmsgd2FrZSB1cCwgdGhlIGFkZHJlc3MgbGVuZ3RoDQotICogZGV0ZWN0aW9uIGlzIGNvbmZpZ3VyZWQgYnkgZGVmYXVsdCB0byA0IGJpdHMgb25seS4gRm9yIHRoZSBVQVJUIHRvIGJlIGFibGUgdG8NCi0gKiAgICAgICAgbWFuYWdlIDYtLCA3LSBvciA4LWJpdCBsb25nIGFkZHJlc3NlcyBkZXRlY3Rpb24sIHRoZSBBUEkNCi0gKiAgICAgICAgSEFMX011bHRpUHJvY2Vzc29yRXhfQWRkcmVzc0xlbmd0aF9TZXQoKSBtdXN0IGJlIGNhbGxlZCBhZnRlcg0KLSAqICAgICAgICBIQUxfTXVsdGlQcm9jZXNzb3JfSW5pdCgpLg0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9NdWx0aVByb2Nlc3Nvcl9Jbml0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBBZGRyZXNzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFdha2VVcE1ldGhvZCkgew0KLSAgLyogQ2hlY2sgdGhlIFVBUlQgaGFuZGxlIGFsbG9jYXRpb24gKi8NCi0gIGlmIChodWFydCA9PSBOVUxMKSB7DQotICAgIHJldHVybiBIQUxfRVJST1I7DQotICB9DQotDQotICAvKiBDaGVjayB0aGUgd2FrZSB1cCBtZXRob2QgcGFyYW1ldGVyICovDQotICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9XQUtFVVBNRVRIT0QoV2FrZVVwTWV0aG9kKSk7DQotDQotICBpZiAoaHVhcnQtPmdTdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9SRVNFVCkgew0KLSAgICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovDQotICAgIGh1YXJ0LT5Mb2NrID0gSEFMX1VOTE9DS0VEOw0KLQ0KLSNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQ0KLSAgICBVQVJUX0luaXRDYWxsYmFja3NUb0RlZmF1bHQoaHVhcnQpOw0KLQ0KLSAgICBpZiAoaHVhcnQtPk1zcEluaXRDYWxsYmFjayA9PSBOVUxMKSB7DQotICAgICAgaHVhcnQtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9VQVJUX01zcEluaXQ7DQotICAgIH0NCi0NCi0gICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovDQotICAgIGh1YXJ0LT5Nc3BJbml0Q2FsbGJhY2soaHVhcnQpOw0KLSNlbHNlDQotICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLICovDQotICAgIEhBTF9VQVJUX01zcEluaXQoaHVhcnQpOw0KLSNlbmRpZiAvKiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUykgKi8NCi0gIH0NCi0NCi0gIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9CVVNZOw0KLQ0KLSAgX19IQUxfVUFSVF9ESVNBQkxFKGh1YXJ0KTsNCi0NCi0gIC8qIFNldCB0aGUgVUFSVCBDb21tdW5pY2F0aW9uIHBhcmFtZXRlcnMgKi8NCi0gIGlmIChVQVJUX1NldENvbmZpZyhodWFydCkgPT0gSEFMX0VSUk9SKSB7DQotICAgIHJldHVybiBIQUxfRVJST1I7DQotICB9DQotDQotICBpZiAoaHVhcnQtPkFkdmFuY2VkSW5pdC5BZHZGZWF0dXJlSW5pdCAhPSBVQVJUX0FEVkZFQVRVUkVfTk9fSU5JVCkgew0KLSAgICBVQVJUX0FkdkZlYXR1cmVDb25maWcoaHVhcnQpOw0KLSAgfQ0KLQ0KLSAgLyogSW4gbXVsdGlwcm9jZXNzb3IgbW9kZSwgdGhlIGZvbGxvd2luZyBiaXRzIG11c3QgYmUga2VwdCBjbGVhcmVkOg0KLSAgLSBMSU5FTiBhbmQgQ0xLRU4gYml0cyBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLA0KLSAgLSBTQ0VOLCBIRFNFTCBhbmQgSVJFTiAgYml0cyBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLiAqLw0KLSAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IyLCAoVVNBUlRfQ1IyX0xJTkVOIHwgVVNBUlRfQ1IyX0NMS0VOKSk7DQotICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsDQotICAgICAgICAgICAgKFVTQVJUX0NSM19TQ0VOIHwgVVNBUlRfQ1IzX0hEU0VMIHwgVVNBUlRfQ1IzX0lSRU4pKTsNCi0NCi0gIGlmIChXYWtlVXBNZXRob2QgPT0gVUFSVF9XQUtFVVBNRVRIT0RfQUREUkVTU01BUkspIHsNCi0gICAgLyogSWYgYWRkcmVzcyBtYXJrIHdha2UgdXAgbWV0aG9kIGlzIGNob3Nlbiwgc2V0IHRoZSBVU0FSVCBhZGRyZXNzIG5vZGUgKi8NCi0gICAgTU9ESUZZX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX0FERCwNCi0gICAgICAgICAgICAgICAoKHVpbnQzMl90KUFkZHJlc3MgPDwgVUFSVF9DUjJfQUREUkVTU19MU0JfUE9TKSk7DQotICB9DQotDQotICAvKiBTZXQgdGhlIHdha2UgdXAgbWV0aG9kIGJ5IHNldHRpbmcgdGhlIFdBS0UgYml0IGluIHRoZSBDUjEgcmVnaXN0ZXIgKi8NCi0gIE1PRElGWV9SRUcoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9XQUtFLCBXYWtlVXBNZXRob2QpOw0KLQ0KLSAgX19IQUxfVUFSVF9FTkFCTEUoaHVhcnQpOw0KLQ0KLSAgLyogVEVBQ0sgYW5kL29yIFJFQUNLIHRvIGNoZWNrIGJlZm9yZSBtb3ZpbmcgaHVhcnQtPmdTdGF0ZSBhbmQgaHVhcnQtPlJ4U3RhdGUNCi0gICAqIHRvIFJlYWR5ICovDQotICByZXR1cm4gKFVBUlRfQ2hlY2tJZGxlU3RhdGUoaHVhcnQpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmIERlSW5pdGlhbGl6ZSB0aGUgVUFSVCBwZXJpcGhlcmFsLg0KLSAqIEBwYXJhbSBodWFydCBVQVJUIGhhbmRsZS4NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9EZUluaXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkgew0KLSAgLyogQ2hlY2sgdGhlIFVBUlQgaGFuZGxlIGFsbG9jYXRpb24gKi8NCi0gIGlmIChodWFydCA9PSBOVUxMKSB7DQotICAgIHJldHVybiBIQUxfRVJST1I7DQotICB9DQotDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKChJU19VQVJUX0lOU1RBTkNFKGh1YXJ0LT5JbnN0YW5jZSkpIHx8DQotICAgICAgICAgICAgICAgKElTX0xQVUFSVF9JTlNUQU5DRShodWFydC0+SW5zdGFuY2UpKSk7DQotDQotICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWTsNCi0NCi0gIF9fSEFMX1VBUlRfRElTQUJMRShodWFydCk7DQotDQotICBodWFydC0+SW5zdGFuY2UtPkNSMSA9IDB4MFU7DQotICBodWFydC0+SW5zdGFuY2UtPkNSMiA9IDB4MFU7DQotICBodWFydC0+SW5zdGFuY2UtPkNSMyA9IDB4MFU7DQotDQotI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpDQotICBpZiAoaHVhcnQtPk1zcERlSW5pdENhbGxiYWNrID09IE5VTEwpIHsNCi0gICAgaHVhcnQtPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX1VBUlRfTXNwRGVJbml0Ow0KLSAgfQ0KLSAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8NCi0gIGh1YXJ0LT5Nc3BEZUluaXRDYWxsYmFjayhodWFydCk7DQotI2Vsc2UNCi0gIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovDQotICBIQUxfVUFSVF9Nc3BEZUluaXQoaHVhcnQpOw0KLSNlbmRpZiAvKiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUykgKi8NCi0NCi0gIGh1YXJ0LT5FcnJvckNvZGUgPSBIQUxfVUFSVF9FUlJPUl9OT05FOw0KLSAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFU0VUOw0KLSAgaHVhcnQtPlJ4U3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRVNFVDsNCi0gIGh1YXJ0LT5SZWNlcHRpb25UeXBlID0gSEFMX1VBUlRfUkVDRVBUSU9OX1NUQU5EQVJEOw0KLQ0KLSAgX19IQUxfVU5MT0NLKGh1YXJ0KTsNCi0NCi0gIHJldHVybiBIQUxfT0s7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBJbml0aWFsaXplIHRoZSBVQVJUIE1TUC4NCi0gKiBAcGFyYW0gaHVhcnQgVUFSVCBoYW5kbGUuDQotICogQHJldHZhbCBOb25lDQotICovDQotX193ZWFrIHZvaWQgSEFMX1VBUlRfTXNwSW5pdChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KSB7DQotICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovDQotICBVTlVTRUQoaHVhcnQpOw0KLQ0KLSAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLA0KLSAgICAgICAgICAgIHRoZSBIQUxfVUFSVF9Nc3BJbml0IGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlDQotICAgKi8NCi19DQotDQotLyoqDQotICogQGJyaWVmIERlSW5pdGlhbGl6ZSB0aGUgVUFSVCBNU1AuDQotICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fd2VhayB2b2lkIEhBTF9VQVJUX01zcERlSW5pdChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KSB7DQotICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovDQotICBVTlVTRUQoaHVhcnQpOw0KLQ0KLSAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLA0KLSAgICAgICAgICAgIHRoZSBIQUxfVUFSVF9Nc3BEZUluaXQgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUNCi0gICAqLw0KLX0NCi0NCi0jaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkNCi0vKioNCi0gKiBAYnJpZWYgIFJlZ2lzdGVyIGEgVXNlciBVQVJUIENhbGxiYWNrDQotICogICAgICAgICBUbyBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHdlYWsgcHJlZGVmaW5lZCBjYWxsYmFjaw0KLSAqIEBwYXJhbSAgaHVhcnQgdWFydCBoYW5kbGUNCi0gKiBAcGFyYW0gIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHJlZ2lzdGVyZWQNCi0gKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVUFSVF9UWF9IQUxGQ09NUExFVEVfQ0JfSUQgVHggSGFsZiBDb21wbGV0ZSBDYWxsYmFjaw0KLSAqIElEDQotICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVUFSVF9UWF9DT01QTEVURV9DQl9JRCBUeCBDb21wbGV0ZSBDYWxsYmFjayBJRA0KLSAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1VBUlRfUlhfSEFMRkNPTVBMRVRFX0NCX0lEIFJ4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2sNCi0gKiBJRA0KLSAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1VBUlRfUlhfQ09NUExFVEVfQ0JfSUQgUnggQ29tcGxldGUgQ2FsbGJhY2sgSUQNCi0gKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VQVJUX0VSUk9SX0NCX0lEIEVycm9yIENhbGxiYWNrIElEDQotICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVUFSVF9BQk9SVF9DT01QTEVURV9DQl9JRCBBYm9ydCBDb21wbGV0ZSBDYWxsYmFjayBJRA0KLSAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1VBUlRfQUJPUlRfVFJBTlNNSVRfQ09NUExFVEVfQ0JfSUQgQWJvcnQgVHJhbnNtaXQNCi0gKiBDb21wbGV0ZSBDYWxsYmFjayBJRA0KLSAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1VBUlRfQUJPUlRfUkVDRUlWRV9DT01QTEVURV9DQl9JRCBBYm9ydCBSZWNlaXZlDQotICogQ29tcGxldGUgQ2FsbGJhY2sgSUQNCi0gKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VQVJUX1dBS0VVUF9DQl9JRCBXYWtldXAgQ2FsbGJhY2sgSUQNCi0gKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VQVJUX1JYX0ZJRk9fRlVMTF9DQl9JRCBSeCBGaWZvIEZ1bGwgQ2FsbGJhY2sgSUQNCi0gKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VQVJUX1RYX0ZJRk9fRU1QVFlfQ0JfSUQgVHggRmlmbyBFbXB0eSBDYWxsYmFjayBJRA0KLSAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1VBUlRfTVNQSU5JVF9DQl9JRCBNc3BJbml0IENhbGxiYWNrIElEDQotICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVUFSVF9NU1BERUlOSVRfQ0JfSUQgTXNwRGVJbml0IENhbGxiYWNrIElEDQotICogQHBhcmFtICBwQ2FsbGJhY2sgcG9pbnRlciB0byB0aGUgQ2FsbGJhY2sgZnVuY3Rpb24NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9SZWdpc3RlckNhbGxiYWNrKA0KLSAgICBVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCBIQUxfVUFSVF9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELA0KLSAgICBwVUFSVF9DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKSB7DQotICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7DQotDQotICBpZiAocENhbGxiYWNrID09IE5VTEwpIHsNCi0gICAgaHVhcnQtPkVycm9yQ29kZSB8PSBIQUxfVUFSVF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOw0KLQ0KLSAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgfQ0KLQ0KLSAgX19IQUxfTE9DSyhodWFydCk7DQotDQotICBpZiAoaHVhcnQtPmdTdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9SRUFEWSkgew0KLSAgICBzd2l0Y2ggKENhbGxiYWNrSUQpIHsNCi0gICAgICBjYXNlIEhBTF9VQVJUX1RYX0hBTEZDT01QTEVURV9DQl9JRDoNCi0gICAgICAgIGh1YXJ0LT5UeEhhbGZDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9VQVJUX1RYX0NPTVBMRVRFX0NCX0lEOg0KLSAgICAgICAgaHVhcnQtPlR4Q3BsdENhbGxiYWNrID0gcENhbGxiYWNrOw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfVUFSVF9SWF9IQUxGQ09NUExFVEVfQ0JfSUQ6DQotICAgICAgICBodWFydC0+UnhIYWxmQ3BsdENhbGxiYWNrID0gcENhbGxiYWNrOw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfVUFSVF9SWF9DT01QTEVURV9DQl9JRDoNCi0gICAgICAgIGh1YXJ0LT5SeENwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgSEFMX1VBUlRfRVJST1JfQ0JfSUQ6DQotICAgICAgICBodWFydC0+RXJyb3JDYWxsYmFjayA9IHBDYWxsYmFjazsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgSEFMX1VBUlRfQUJPUlRfQ09NUExFVEVfQ0JfSUQ6DQotICAgICAgICBodWFydC0+QWJvcnRDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9VQVJUX0FCT1JUX1RSQU5TTUlUX0NPTVBMRVRFX0NCX0lEOg0KLSAgICAgICAgaHVhcnQtPkFib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9VQVJUX0FCT1JUX1JFQ0VJVkVfQ09NUExFVEVfQ0JfSUQ6DQotICAgICAgICBodWFydC0+QWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrID0gcENhbGxiYWNrOw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfVUFSVF9XQUtFVVBfQ0JfSUQ6DQotICAgICAgICBodWFydC0+V2FrZXVwQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9VQVJUX1JYX0ZJRk9fRlVMTF9DQl9JRDoNCi0gICAgICAgIGh1YXJ0LT5SeEZpZm9GdWxsQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9VQVJUX1RYX0ZJRk9fRU1QVFlfQ0JfSUQ6DQotICAgICAgICBodWFydC0+VHhGaWZvRW1wdHlDYWxsYmFjayA9IHBDYWxsYmFjazsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgSEFMX1VBUlRfTVNQSU5JVF9DQl9JRDoNCi0gICAgICAgIGh1YXJ0LT5Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9VQVJUX01TUERFSU5JVF9DQl9JRDoNCi0gICAgICAgIGh1YXJ0LT5Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGRlZmF1bHQ6DQotICAgICAgICBodWFydC0+RXJyb3JDb2RlIHw9IEhBTF9VQVJUX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7DQotDQotICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7DQotICAgICAgICBicmVhazsNCi0gICAgfQ0KLSAgfSBlbHNlIGlmIChodWFydC0+Z1N0YXRlID09IEhBTF9VQVJUX1NUQVRFX1JFU0VUKSB7DQotICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkgew0KLSAgICAgIGNhc2UgSEFMX1VBUlRfTVNQSU5JVF9DQl9JRDoNCi0gICAgICAgIGh1YXJ0LT5Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9VQVJUX01TUERFSU5JVF9DQl9JRDoNCi0gICAgICAgIGh1YXJ0LT5Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGRlZmF1bHQ6DQotICAgICAgICBodWFydC0+RXJyb3JDb2RlIHw9IEhBTF9VQVJUX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7DQotDQotICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7DQotICAgICAgICBicmVhazsNCi0gICAgfQ0KLSAgfSBlbHNlIHsNCi0gICAgaHVhcnQtPkVycm9yQ29kZSB8PSBIQUxfVUFSVF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOw0KLQ0KLSAgICBzdGF0dXMgPSBIQUxfRVJST1I7DQotICB9DQotDQotICBfX0hBTF9VTkxPQ0soaHVhcnQpOw0KLQ0KLSAgcmV0dXJuIHN0YXR1czsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBVbnJlZ2lzdGVyIGFuIFVBUlQgQ2FsbGJhY2sNCi0gKiAgICAgICAgIFVBUlQgY2FsbGFiYWNrIGlzIHJlZGlyZWN0ZWQgdG8gdGhlIHdlYWsgcHJlZGVmaW5lZCBjYWxsYmFjaw0KLSAqIEBwYXJhbSAgaHVhcnQgdWFydCBoYW5kbGUNCi0gKiBAcGFyYW0gIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHVucmVnaXN0ZXJlZA0KLSAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VQVJUX1RYX0hBTEZDT01QTEVURV9DQl9JRCBUeCBIYWxmIENvbXBsZXRlIENhbGxiYWNrDQotICogSUQNCi0gKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VQVJUX1RYX0NPTVBMRVRFX0NCX0lEIFR4IENvbXBsZXRlIENhbGxiYWNrIElEDQotICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVUFSVF9SWF9IQUxGQ09NUExFVEVfQ0JfSUQgUnggSGFsZiBDb21wbGV0ZSBDYWxsYmFjaw0KLSAqIElEDQotICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVUFSVF9SWF9DT01QTEVURV9DQl9JRCBSeCBDb21wbGV0ZSBDYWxsYmFjayBJRA0KLSAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1VBUlRfRVJST1JfQ0JfSUQgRXJyb3IgQ2FsbGJhY2sgSUQNCi0gKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VQVJUX0FCT1JUX0NPTVBMRVRFX0NCX0lEIEFib3J0IENvbXBsZXRlIENhbGxiYWNrIElEDQotICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVUFSVF9BQk9SVF9UUkFOU01JVF9DT01QTEVURV9DQl9JRCBBYm9ydCBUcmFuc21pdA0KLSAqIENvbXBsZXRlIENhbGxiYWNrIElEDQotICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVUFSVF9BQk9SVF9SRUNFSVZFX0NPTVBMRVRFX0NCX0lEIEFib3J0IFJlY2VpdmUNCi0gKiBDb21wbGV0ZSBDYWxsYmFjayBJRA0KLSAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1VBUlRfV0FLRVVQX0NCX0lEIFdha2V1cCBDYWxsYmFjayBJRA0KLSAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1VBUlRfUlhfRklGT19GVUxMX0NCX0lEIFJ4IEZpZm8gRnVsbCBDYWxsYmFjayBJRA0KLSAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1VBUlRfVFhfRklGT19FTVBUWV9DQl9JRCBUeCBGaWZvIEVtcHR5IENhbGxiYWNrIElEDQotICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVUFSVF9NU1BJTklUX0NCX0lEIE1zcEluaXQgQ2FsbGJhY2sgSUQNCi0gKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VQVJUX01TUERFSU5JVF9DQl9JRCBNc3BEZUluaXQgQ2FsbGJhY2sgSUQNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9VblJlZ2lzdGVyQ2FsbGJhY2soDQotICAgIFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIEhBTF9VQVJUX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpIHsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsNCi0NCi0gIF9fSEFMX0xPQ0soaHVhcnQpOw0KLQ0KLSAgaWYgKEhBTF9VQVJUX1NUQVRFX1JFQURZID09IGh1YXJ0LT5nU3RhdGUpIHsNCi0gICAgc3dpdGNoIChDYWxsYmFja0lEKSB7DQotICAgICAgY2FzZSBIQUxfVUFSVF9UWF9IQUxGQ09NUExFVEVfQ0JfSUQ6DQotICAgICAgICBodWFydC0+VHhIYWxmQ3BsdENhbGxiYWNrID0NCi0gICAgICAgICAgICBIQUxfVUFSVF9UeEhhbGZDcGx0Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrICBUeEhhbGZDcGx0Q2FsbGJhY2sgKi8NCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgSEFMX1VBUlRfVFhfQ09NUExFVEVfQ0JfSUQ6DQotICAgICAgICBodWFydC0+VHhDcGx0Q2FsbGJhY2sgPQ0KLSAgICAgICAgICAgIEhBTF9VQVJUX1R4Q3BsdENhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBUeENwbHRDYWxsYmFjayAgICAgICAgICovDQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9VQVJUX1JYX0hBTEZDT01QTEVURV9DQl9JRDoNCi0gICAgICAgIGh1YXJ0LT5SeEhhbGZDcGx0Q2FsbGJhY2sgPQ0KLSAgICAgICAgICAgIEhBTF9VQVJUX1J4SGFsZkNwbHRDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgUnhIYWxmQ3BsdENhbGxiYWNrICovDQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9VQVJUX1JYX0NPTVBMRVRFX0NCX0lEOg0KLSAgICAgICAgaHVhcnQtPlJ4Q3BsdENhbGxiYWNrID0NCi0gICAgICAgICAgICBIQUxfVUFSVF9SeENwbHRDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgUnhDcGx0Q2FsbGJhY2sgICAgICAgICAqLw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfVUFSVF9FUlJPUl9DQl9JRDoNCi0gICAgICAgIGh1YXJ0LT5FcnJvckNhbGxiYWNrID0NCi0gICAgICAgICAgICBIQUxfVUFSVF9FcnJvckNhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBFcnJvckNhbGxiYWNrICAgICAgICAgICovDQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9VQVJUX0FCT1JUX0NPTVBMRVRFX0NCX0lEOg0KLSAgICAgICAgaHVhcnQtPkFib3J0Q3BsdENhbGxiYWNrID0NCi0gICAgICAgICAgICBIQUxfVUFSVF9BYm9ydENwbHRDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgQWJvcnRDcGx0Q2FsbGJhY2sgICAgICAqLw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfVUFSVF9BQk9SVF9UUkFOU01JVF9DT01QTEVURV9DQl9JRDoNCi0gICAgICAgIGh1YXJ0LT5BYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrID0NCi0gICAgICAgICAgICBIQUxfVUFSVF9BYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrOyAvKiBMZWdhY3kgd2Vhaw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2sgKi8NCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgSEFMX1VBUlRfQUJPUlRfUkVDRUlWRV9DT01QTEVURV9DQl9JRDoNCi0gICAgICAgIGh1YXJ0LT5BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2sgPQ0KLSAgICAgICAgICAgIEhBTF9VQVJUX0Fib3J0UmVjZWl2ZUNwbHRDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFib3J0UmVjZWl2ZUNwbHRDYWxsYmFjayAqLw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfVUFSVF9XQUtFVVBfQ0JfSUQ6DQotICAgICAgICBodWFydC0+V2FrZXVwQ2FsbGJhY2sgPQ0KLSAgICAgICAgICAgIEhBTF9VQVJURXhfV2FrZXVwQ2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIFdha2V1cENhbGxiYWNrICAgICAgICAgKi8NCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgSEFMX1VBUlRfUlhfRklGT19GVUxMX0NCX0lEOg0KLSAgICAgICAgaHVhcnQtPlJ4Rmlmb0Z1bGxDYWxsYmFjayA9DQotICAgICAgICAgICAgSEFMX1VBUlRFeF9SeEZpZm9GdWxsQ2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIFJ4Rmlmb0Z1bGxDYWxsYmFjayAqLw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgY2FzZSBIQUxfVUFSVF9UWF9GSUZPX0VNUFRZX0NCX0lEOg0KLSAgICAgICAgaHVhcnQtPlR4Rmlmb0VtcHR5Q2FsbGJhY2sgPQ0KLSAgICAgICAgICAgIEhBTF9VQVJURXhfVHhGaWZvRW1wdHlDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgVHhGaWZvRW1wdHlDYWxsYmFjaw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9VQVJUX01TUElOSVRfQ0JfSUQ6DQotICAgICAgICBodWFydC0+TXNwSW5pdENhbGxiYWNrID0NCi0gICAgICAgICAgICBIQUxfVUFSVF9Nc3BJbml0OyAvKiBMZWdhY3kgd2VhayBNc3BJbml0Q2FsbGJhY2sgICAgICAgICovDQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBjYXNlIEhBTF9VQVJUX01TUERFSU5JVF9DQl9JRDoNCi0gICAgICAgIGh1YXJ0LT5Nc3BEZUluaXRDYWxsYmFjayA9DQotICAgICAgICAgICAgSEFMX1VBUlRfTXNwRGVJbml0OyAvKiBMZWdhY3kgd2VhayBNc3BEZUluaXRDYWxsYmFjayAgICAgICovDQotICAgICAgICBicmVhazsNCi0NCi0gICAgICBkZWZhdWx0Og0KLSAgICAgICAgaHVhcnQtPkVycm9yQ29kZSB8PSBIQUxfVUFSVF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOw0KLQ0KLSAgICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOw0KLSAgICAgICAgYnJlYWs7DQotICAgIH0NCi0gIH0gZWxzZSBpZiAoSEFMX1VBUlRfU1RBVEVfUkVTRVQgPT0gaHVhcnQtPmdTdGF0ZSkgew0KLSAgICBzd2l0Y2ggKENhbGxiYWNrSUQpIHsNCi0gICAgICBjYXNlIEhBTF9VQVJUX01TUElOSVRfQ0JfSUQ6DQotICAgICAgICBodWFydC0+TXNwSW5pdENhbGxiYWNrID0gSEFMX1VBUlRfTXNwSW5pdDsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGNhc2UgSEFMX1VBUlRfTVNQREVJTklUX0NCX0lEOg0KLSAgICAgICAgaHVhcnQtPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX1VBUlRfTXNwRGVJbml0Ow0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgZGVmYXVsdDoNCi0gICAgICAgIGh1YXJ0LT5FcnJvckNvZGUgfD0gSEFMX1VBUlRfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsNCi0NCi0gICAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsNCi0gICAgICAgIGJyZWFrOw0KLSAgICB9DQotICB9IGVsc2Ugew0KLSAgICBodWFydC0+RXJyb3JDb2RlIHw9IEhBTF9VQVJUX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7DQotDQotICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsNCi0gIH0NCi0NCi0gIF9fSEFMX1VOTE9DSyhodWFydCk7DQotDQotICByZXR1cm4gc3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJlZ2lzdGVyIGEgVXNlciBVQVJUIFJ4IEV2ZW50IENhbGxiYWNrDQotICogICAgICAgICBUbyBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHdlYWsgcHJlZGVmaW5lZCBjYWxsYmFjaw0KLSAqIEBwYXJhbSAgaHVhcnQgICAgIFVhcnQgaGFuZGxlDQotICogQHBhcmFtICBwQ2FsbGJhY2sgUG9pbnRlciB0byB0aGUgUnggRXZlbnQgQ2FsbGJhY2sgZnVuY3Rpb24NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9SZWdpc3RlclJ4RXZlbnRDYWxsYmFjaygNCi0gICAgVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwgcFVBUlRfUnhFdmVudENhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spIHsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsNCi0NCi0gIGlmIChwQ2FsbGJhY2sgPT0gTlVMTCkgew0KLSAgICBodWFydC0+RXJyb3JDb2RlIHw9IEhBTF9VQVJUX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7DQotDQotICAgIHJldHVybiBIQUxfRVJST1I7DQotICB9DQotDQotICAvKiBQcm9jZXNzIGxvY2tlZCAqLw0KLSAgX19IQUxfTE9DSyhodWFydCk7DQotDQotICBpZiAoaHVhcnQtPmdTdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9SRUFEWSkgew0KLSAgICBodWFydC0+UnhFdmVudENhbGxiYWNrID0gcENhbGxiYWNrOw0KLSAgfSBlbHNlIHsNCi0gICAgaHVhcnQtPkVycm9yQ29kZSB8PSBIQUxfVUFSVF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOw0KLQ0KLSAgICBzdGF0dXMgPSBIQUxfRVJST1I7DQotICB9DQotDQotICAvKiBSZWxlYXNlIExvY2sgKi8NCi0gIF9fSEFMX1VOTE9DSyhodWFydCk7DQotDQotICByZXR1cm4gc3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFVuUmVnaXN0ZXIgdGhlIFVBUlQgUnggRXZlbnQgQ2FsbGJhY2sNCi0gKiAgICAgICAgIFVBUlQgUnggRXZlbnQgQ2FsbGJhY2sgaXMgcmVkaXJlY3RlZCB0byB0aGUgd2Vhaw0KLSAqIEhBTF9VQVJURXhfUnhFdmVudENhbGxiYWNrKCkgcHJlZGVmaW5lZCBjYWxsYmFjaw0KLSAqIEBwYXJhbSAgaHVhcnQgICAgIFVhcnQgaGFuZGxlDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfVW5SZWdpc3RlclJ4RXZlbnRDYWxsYmFjaygNCi0gICAgVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkgew0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOw0KLQ0KLSAgLyogUHJvY2VzcyBsb2NrZWQgKi8NCi0gIF9fSEFMX0xPQ0soaHVhcnQpOw0KLQ0KLSAgaWYgKGh1YXJ0LT5nU3RhdGUgPT0gSEFMX1VBUlRfU1RBVEVfUkVBRFkpIHsNCi0gICAgaHVhcnQtPlJ4RXZlbnRDYWxsYmFjayA9DQotICAgICAgICBIQUxfVUFSVEV4X1J4RXZlbnRDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgVUFSVCBSeCBFdmVudCBDYWxsYmFjayAgKi8NCi0gIH0gZWxzZSB7DQotICAgIGh1YXJ0LT5FcnJvckNvZGUgfD0gSEFMX1VBUlRfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsNCi0NCi0gICAgc3RhdHVzID0gSEFMX0VSUk9SOw0KLSAgfQ0KLQ0KLSAgLyogUmVsZWFzZSBMb2NrICovDQotICBfX0hBTF9VTkxPQ0soaHVhcnQpOw0KLSAgcmV0dXJuIHN0YXR1czsNCi19DQotDQotI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVUFSVF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMNCi0gICogQGJyaWVmIFVBUlQgVHJhbnNtaXQvUmVjZWl2ZSBmdW5jdGlvbnMNCi0gICoNCi1AdmVyYmF0aW0NCi0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICMjIyMjDQotID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBtYW5hZ2UgdGhlIFVBUlQNCi1hc3luY2hyb25vdXMgYW5kIEhhbGYgZHVwbGV4IGRhdGEgdHJhbnNmZXJzLg0KLQ0KLSAgICAoIykgVGhlcmUgYXJlIHR3byBtb2RlIG9mIHRyYW5zZmVyOg0KLSAgICAgICAoKykgQmxvY2tpbmcgbW9kZTogVGhlIGNvbW11bmljYXRpb24gaXMgcGVyZm9ybWVkIGluIHBvbGxpbmcgbW9kZS4NCi0gICAgICAgICAgIFRoZSBIQUwgc3RhdHVzIG9mIGFsbCBkYXRhIHByb2Nlc3NpbmcgaXMgcmV0dXJuZWQgYnkgdGhlIHNhbWUNCi1mdW5jdGlvbiBhZnRlciBmaW5pc2hpbmcgdHJhbnNmZXIuDQotICAgICAgICgrKSBOb24tQmxvY2tpbmcgbW9kZTogVGhlIGNvbW11bmljYXRpb24gaXMgcGVyZm9ybWVkIHVzaW5nIEludGVycnVwdHMNCi0gICAgICAgICAgIG9yIERNQSwgVGhlc2UgQVBJJ3MgcmV0dXJuIHRoZSBIQUwgc3RhdHVzLg0KLSAgICAgICAgICAgVGhlIGVuZCBvZiB0aGUgZGF0YSBwcm9jZXNzaW5nIHdpbGwgYmUgaW5kaWNhdGVkIHRocm91Z2ggdGhlDQotICAgICAgICAgICBkZWRpY2F0ZWQgVUFSVCBJUlEgd2hlbiB1c2luZyBJbnRlcnJ1cHQgbW9kZSBvciB0aGUgRE1BIElSUSB3aGVuDQotICAgICAgICAgICB1c2luZyBETUEgbW9kZS4NCi0gICAgICAgICAgIFRoZSBIQUxfVUFSVF9UeENwbHRDYWxsYmFjaygpLCBIQUxfVUFSVF9SeENwbHRDYWxsYmFjaygpIHVzZXINCi1jYWxsYmFja3Mgd2lsbCBiZSBleGVjdXRlZCByZXNwZWN0aXZlbHkgYXQgdGhlIGVuZCBvZiB0aGUgdHJhbnNtaXQgb3IgUmVjZWl2ZQ0KLXByb2Nlc3MgVGhlIEhBTF9VQVJUX0Vycm9yQ2FsbGJhY2soKXVzZXIgY2FsbGJhY2sgd2lsbCBiZSBleGVjdXRlZCB3aGVuIGENCi1jb21tdW5pY2F0aW9uIGVycm9yIGlzIGRldGVjdGVkDQotDQotICAgICgjKSBCbG9ja2luZyBtb2RlIEFQSSdzIGFyZSA6DQotICAgICAgICAoKykgSEFMX1VBUlRfVHJhbnNtaXQoKQ0KLSAgICAgICAgKCspIEhBTF9VQVJUX1JlY2VpdmUoKQ0KLQ0KLSAgICAoIykgTm9uLUJsb2NraW5nIG1vZGUgQVBJJ3Mgd2l0aCBJbnRlcnJ1cHQgYXJlIDoNCi0gICAgICAgICgrKSBIQUxfVUFSVF9UcmFuc21pdF9JVCgpDQotICAgICAgICAoKykgSEFMX1VBUlRfUmVjZWl2ZV9JVCgpDQotICAgICAgICAoKykgSEFMX1VBUlRfSVJRSGFuZGxlcigpDQotDQotICAgICgjKSBOb24tQmxvY2tpbmcgbW9kZSBBUEkncyB3aXRoIERNQSBhcmUgOg0KLSAgICAgICAgKCspIEhBTF9VQVJUX1RyYW5zbWl0X0RNQSgpDQotICAgICAgICAoKykgSEFMX1VBUlRfUmVjZWl2ZV9ETUEoKQ0KLSAgICAgICAgKCspIEhBTF9VQVJUX0RNQVBhdXNlKCkNCi0gICAgICAgICgrKSBIQUxfVUFSVF9ETUFSZXN1bWUoKQ0KLSAgICAgICAgKCspIEhBTF9VQVJUX0RNQVN0b3AoKQ0KLQ0KLSAgICAoIykgQSBzZXQgb2YgVHJhbnNmZXIgQ29tcGxldGUgQ2FsbGJhY2tzIGFyZSBwcm92aWRlZCBpbiBOb25fQmxvY2tpbmcgbW9kZToNCi0gICAgICAgICgrKSBIQUxfVUFSVF9UeEhhbGZDcGx0Q2FsbGJhY2soKQ0KLSAgICAgICAgKCspIEhBTF9VQVJUX1R4Q3BsdENhbGxiYWNrKCkNCi0gICAgICAgICgrKSBIQUxfVUFSVF9SeEhhbGZDcGx0Q2FsbGJhY2soKQ0KLSAgICAgICAgKCspIEhBTF9VQVJUX1J4Q3BsdENhbGxiYWNrKCkNCi0gICAgICAgICgrKSBIQUxfVUFSVF9FcnJvckNhbGxiYWNrKCkNCi0NCi0gICAgKCMpIE5vbi1CbG9ja2luZyBtb2RlIHRyYW5zZmVycyBjb3VsZCBiZSBhYm9ydGVkIHVzaW5nIEFib3J0IEFQSSdzIDoNCi0gICAgICAgICgrKSBIQUxfVUFSVF9BYm9ydCgpDQotICAgICAgICAoKykgSEFMX1VBUlRfQWJvcnRUcmFuc21pdCgpDQotICAgICAgICAoKykgSEFMX1VBUlRfQWJvcnRSZWNlaXZlKCkNCi0gICAgICAgICgrKSBIQUxfVUFSVF9BYm9ydF9JVCgpDQotICAgICAgICAoKykgSEFMX1VBUlRfQWJvcnRUcmFuc21pdF9JVCgpDQotICAgICAgICAoKykgSEFMX1VBUlRfQWJvcnRSZWNlaXZlX0lUKCkNCi0NCi0gICAgKCMpIEZvciBBYm9ydCBzZXJ2aWNlcyBiYXNlZCBvbiBpbnRlcnJ1cHRzIChIQUxfVUFSVF9BYm9ydHh4eF9JVCksIGEgc2V0IG9mDQotQWJvcnQgQ29tcGxldGUgQ2FsbGJhY2tzIGFyZSBwcm92aWRlZDoNCi0gICAgICAgICgrKSBIQUxfVUFSVF9BYm9ydENwbHRDYWxsYmFjaygpDQotICAgICAgICAoKykgSEFMX1VBUlRfQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjaygpDQotICAgICAgICAoKykgSEFMX1VBUlRfQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrKCkNCi0NCi0gICAgKCMpIEEgUnggRXZlbnQgUmVjZXB0aW9uIENhbGxiYWNrIChSeCBldmVudCBub3RpZmljYXRpb24pIGlzIGF2YWlsYWJsZSBmb3INCi1Ob25fQmxvY2tpbmcgbW9kZXMgb2YgZW5oYW5jZWQgcmVjZXB0aW9uIHNlcnZpY2VzOg0KLSAgICAgICAgKCspIEhBTF9VQVJURXhfUnhFdmVudENhbGxiYWNrKCkNCi0NCi0gICAgKCMpIEluIE5vbi1CbG9ja2luZyBtb2RlIHRyYW5zZmVycywgcG9zc2libGUgZXJyb3JzIGFyZSBzcGxpdCBpbnRvIDINCi1jYXRlZ29yaWVzLiBFcnJvcnMgYXJlIGhhbmRsZWQgYXMgZm9sbG93cyA6DQotICAgICAgICgrKSBFcnJvciBpcyBjb25zaWRlcmVkIGFzIFJlY292ZXJhYmxlIGFuZCBub24gYmxvY2tpbmcgOiBUcmFuc2ZlciBjb3VsZA0KLWdvIHRpbGwgZW5kLCBidXQgZXJyb3Igc2V2ZXJpdHkgaXMgdG8gYmUgZXZhbHVhdGVkIGJ5IHVzZXIgOiB0aGlzIGNvbmNlcm5zIEZyYW1lDQotRXJyb3IsIFBhcml0eSBFcnJvciBvciBOb2lzZSBFcnJvciBpbiBJbnRlcnJ1cHQgbW9kZSByZWNlcHRpb24gLiBSZWNlaXZlZA0KLWNoYXJhY3RlciBpcyB0aGVuIHJldHJpZXZlZCBhbmQgc3RvcmVkIGluIFJ4IGJ1ZmZlciwgRXJyb3IgY29kZSBpcyBzZXQgdG8gYWxsb3cNCi11c2VyIHRvIGlkZW50aWZ5IGVycm9yIHR5cGUsIGFuZCBIQUxfVUFSVF9FcnJvckNhbGxiYWNrKCkgdXNlciBjYWxsYmFjayBpcw0KLWV4ZWN1dGVkLiBUcmFuc2ZlciBpcyBrZXB0IG9uZ29pbmcgb24gVUFSVCBzaWRlLiBJZiB1c2VyIHdhbnRzIHRvIGFib3J0IGl0LA0KLUFib3J0IHNlcnZpY2VzIHNob3VsZCBiZSBjYWxsZWQgYnkgdXNlci4NCi0gICAgICAgKCspIEVycm9yIGlzIGNvbnNpZGVyZWQgYXMgQmxvY2tpbmcgOiBUcmFuc2ZlciBjb3VsZCBub3QgYmUgY29tcGxldGVkDQotcHJvcGVybHkgYW5kIGlzIGFib3J0ZWQuIFRoaXMgY29uY2VybnMgT3ZlcnJ1biBFcnJvciBJbiBJbnRlcnJ1cHQgbW9kZSByZWNlcHRpb24NCi1hbmQgYWxsIGVycm9ycyBpbiBETUEgbW9kZS4gRXJyb3IgY29kZSBpcyBzZXQgdG8gYWxsb3cgdXNlciB0byBpZGVudGlmeSBlcnJvcg0KLXR5cGUsIGFuZCBIQUxfVUFSVF9FcnJvckNhbGxiYWNrKCkgdXNlciBjYWxsYmFjayBpcyBleGVjdXRlZC4NCi0NCi0gICAgLUAtIEluIHRoZSBIYWxmIGR1cGxleCBjb21tdW5pY2F0aW9uLCBpdCBpcyBmb3JiaWRkZW4gdG8gcnVuIHRoZSB0cmFuc21pdA0KLSAgICAgICAgYW5kIHJlY2VpdmUgcHJvY2VzcyBpbiBwYXJhbGxlbCwgdGhlIFVBUlQgc3RhdGUNCi1IQUxfVUFSVF9TVEFURV9CVVNZX1RYX1JYIGNhbid0IGJlIHVzZWZ1bC4NCi0NCi1AZW5kdmVyYmF0aW0NCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICogQGJyaWVmIFNlbmQgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZS4NCi0gKiBAbm90ZSAgIFdoZW4gVUFSVCBwYXJpdHkgaXMgbm90IGVuYWJsZWQgKFBDRSA9IDApLCBhbmQgV29yZCBMZW5ndGggaXMNCi0gKiBjb25maWd1cmVkIHRvIDkgYml0cyAoTTEtTTAgPSAwMSksIHRoZSBzZW50IGRhdGEgaXMgaGFuZGxlZCBhcyBhIHNldCBvZiB1MTYuDQotICogSW4gdGhpcyBjYXNlLCBTaXplIG11c3QgaW5kaWNhdGUgdGhlIG51bWJlciBvZiB1MTYgcHJvdmlkZWQgdGhyb3VnaCBwRGF0YS4NCi0gKiBAbm90ZSBXaGVuIEZJRk8gbW9kZSBpcyBlbmFibGVkLCB3cml0aW5nIGEgZGF0YSBpbiB0aGUgVERSIHJlZ2lzdGVyIGFkZHMgb25lDQotICogICAgICAgZGF0YSB0byB0aGUgVFhGSUZPLiBXcml0ZSBvcGVyYXRpb25zIHRvIHRoZSBURFIgcmVnaXN0ZXIgYXJlIHBlcmZvcm1lZA0KLSAqICAgICAgIHdoZW4gVFhGTkYgZmxhZyBpcyBzZXQuIEZyb20gaGFyZHdhcmUgcGVyc3BlY3RpdmUsIFRYRk5GIGZsYWcgYW5kDQotICogICAgICAgVFhFIGFyZSBtYXBwZWQgb24gdGhlIHNhbWUgYml0LWZpZWxkLg0KLSAqIEBwYXJhbSBodWFydCAgIFVBUlQgaGFuZGxlLg0KLSAqIEBwYXJhbSBwRGF0YSAgIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIgKHU4IG9yIHUxNiBkYXRhIGVsZW1lbnRzKS4NCi0gKiBAcGFyYW0gU2l6ZSAgICBBbW91bnQgb2YgZGF0YSBlbGVtZW50cyAodTggb3IgdTE2KSB0byBiZSBzZW50Lg0KLSAqIEBwYXJhbSBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24uDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfVHJhbnNtaXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lb3V0KSB7DQotICBjb25zdCB1aW50OF90ICpwZGF0YThiaXRzOw0KLSAgY29uc3QgdWludDE2X3QgKnBkYXRhMTZiaXRzOw0KLSAgdWludDMyX3QgdGlja3N0YXJ0Ow0KLQ0KLSAgLyogQ2hlY2sgdGhhdCBhIFR4IHByb2Nlc3MgaXMgbm90IGFscmVhZHkgb25nb2luZyAqLw0KLSAgaWYgKGh1YXJ0LT5nU3RhdGUgPT0gSEFMX1VBUlRfU1RBVEVfUkVBRFkpIHsNCi0gICAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpIHsNCi0gICAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgICB9DQotDQotICAgIF9fSEFMX0xPQ0soaHVhcnQpOw0KLQ0KLSAgICBodWFydC0+RXJyb3JDb2RlID0gSEFMX1VBUlRfRVJST1JfTk9ORTsNCi0gICAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX0JVU1lfVFg7DQotDQotICAgIC8qIEluaXQgdGlja3N0YXJ0IGZvciB0aW1lb3V0IG1hbmFnZW1lbnQgKi8NCi0gICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsNCi0NCi0gICAgaHVhcnQtPlR4WGZlclNpemUgPSBTaXplOw0KLSAgICBodWFydC0+VHhYZmVyQ291bnQgPSBTaXplOw0KLQ0KLSAgICAvKiBJbiBjYXNlIG9mIDliaXRzL05vIFBhcml0eSB0cmFuc2ZlciwgcERhdGEgbmVlZHMgdG8gYmUgaGFuZGxlZCBhcyBhDQotICAgICAqIHVpbnQxNl90IHBvaW50ZXIgKi8NCi0gICAgaWYgKChodWFydC0+SW5pdC5Xb3JkTGVuZ3RoID09IFVBUlRfV09SRExFTkdUSF85QikgJiYNCi0gICAgICAgIChodWFydC0+SW5pdC5QYXJpdHkgPT0gVUFSVF9QQVJJVFlfTk9ORSkpIHsNCi0gICAgICBwZGF0YThiaXRzID0gTlVMTDsNCi0gICAgICBwZGF0YTE2Yml0cyA9IChjb25zdCB1aW50MTZfdCAqKXBEYXRhOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgIHBkYXRhOGJpdHMgPSBwRGF0YTsNCi0gICAgICBwZGF0YTE2Yml0cyA9IE5VTEw7DQotICAgIH0NCi0NCi0gICAgX19IQUxfVU5MT0NLKGh1YXJ0KTsNCi0NCi0gICAgd2hpbGUgKGh1YXJ0LT5UeFhmZXJDb3VudCA+IDBVKSB7DQotICAgICAgaWYgKFVBUlRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChodWFydCwgVUFSVF9GTEFHX1RYRSwgUkVTRVQsIHRpY2tzdGFydCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVvdXQpICE9IEhBTF9PSykgew0KLSAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOw0KLSAgICAgIH0NCi0gICAgICBpZiAocGRhdGE4Yml0cyA9PSBOVUxMKSB7DQotICAgICAgICBodWFydC0+SW5zdGFuY2UtPlREUiA9ICh1aW50MTZfdCkoKnBkYXRhMTZiaXRzICYgMHgwMUZGVSk7DQotICAgICAgICBwZGF0YTE2Yml0cysrOw0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICBodWFydC0+SW5zdGFuY2UtPlREUiA9ICh1aW50OF90KSgqcGRhdGE4Yml0cyAmIDB4RkZVKTsNCi0gICAgICAgIHBkYXRhOGJpdHMrKzsNCi0gICAgICB9DQotICAgICAgaHVhcnQtPlR4WGZlckNvdW50LS07DQotICAgIH0NCi0NCi0gICAgaWYgKFVBUlRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChodWFydCwgVUFSVF9GTEFHX1RDLCBSRVNFVCwgdGlja3N0YXJ0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVvdXQpICE9IEhBTF9PSykgew0KLSAgICAgIHJldHVybiBIQUxfVElNRU9VVDsNCi0gICAgfQ0KLQ0KLSAgICAvKiBBdCBlbmQgb2YgVHggcHJvY2VzcywgcmVzdG9yZSBodWFydC0+Z1N0YXRlIHRvIFJlYWR5ICovDQotICAgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsNCi0NCi0gICAgcmV0dXJuIEhBTF9PSzsNCi0gIH0gZWxzZSB7DQotICAgIHJldHVybiBIQUxfQlVTWTsNCi0gIH0NCi19DQotDQotLyoqDQotICogQGJyaWVmIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZS4NCi0gKiBAbm90ZSAgIFdoZW4gVUFSVCBwYXJpdHkgaXMgbm90IGVuYWJsZWQgKFBDRSA9IDApLCBhbmQgV29yZCBMZW5ndGggaXMNCi0gKiBjb25maWd1cmVkIHRvIDkgYml0cyAoTTEtTTAgPSAwMSksIHRoZSByZWNlaXZlZCBkYXRhIGlzIGhhbmRsZWQgYXMgYSBzZXQgb2YNCi0gKiB1MTYuIEluIHRoaXMgY2FzZSwgU2l6ZSBtdXN0IGluZGljYXRlIHRoZSBudW1iZXIgb2YgdTE2IGF2YWlsYWJsZSB0aHJvdWdoDQotICogcERhdGEuDQotICogQG5vdGUgV2hlbiBGSUZPIG1vZGUgaXMgZW5hYmxlZCwgdGhlIFJYRk5FIGZsYWcgaXMgc2V0IGFzIGxvbmcgYXMgdGhlIFJYRklGTw0KLSAqICAgICAgIGlzIG5vdCBlbXB0eS4gUmVhZCBvcGVyYXRpb25zIGZyb20gdGhlIFJEUiByZWdpc3RlciBhcmUgcGVyZm9ybWVkIHdoZW4NCi0gKiAgICAgICBSWEZORSBmbGFnIGlzIHNldC4gRnJvbSBoYXJkd2FyZSBwZXJzcGVjdGl2ZSwgUlhGTkUgZmxhZyBhbmQNCi0gKiAgICAgICBSWE5FIGFyZSBtYXBwZWQgb24gdGhlIHNhbWUgYml0LWZpZWxkLg0KLSAqIEBwYXJhbSBodWFydCAgIFVBUlQgaGFuZGxlLg0KLSAqIEBwYXJhbSBwRGF0YSAgIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIgKHU4IG9yIHUxNiBkYXRhIGVsZW1lbnRzKS4NCi0gKiBAcGFyYW0gU2l6ZSAgICBBbW91bnQgb2YgZGF0YSBlbGVtZW50cyAodTggb3IgdTE2KSB0byBiZSByZWNlaXZlZC4NCi0gKiBAcGFyYW0gVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uLg0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX1JlY2VpdmUoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwgdWludDhfdCAqcERhdGEsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBUaW1lb3V0KSB7DQotICB1aW50OF90ICpwZGF0YThiaXRzOw0KLSAgdWludDE2X3QgKnBkYXRhMTZiaXRzOw0KLSAgdWludDE2X3QgdWhNYXNrOw0KLSAgdWludDMyX3QgdGlja3N0YXJ0Ow0KLQ0KLSAgLyogQ2hlY2sgdGhhdCBhIFJ4IHByb2Nlc3MgaXMgbm90IGFscmVhZHkgb25nb2luZyAqLw0KLSAgaWYgKGh1YXJ0LT5SeFN0YXRlID09IEhBTF9VQVJUX1NUQVRFX1JFQURZKSB7DQotICAgIGlmICgocERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKSB7DQotICAgICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gICAgfQ0KLQ0KLSAgICBfX0hBTF9MT0NLKGh1YXJ0KTsNCi0NCi0gICAgaHVhcnQtPkVycm9yQ29kZSA9IEhBTF9VQVJUX0VSUk9SX05PTkU7DQotICAgIGh1YXJ0LT5SeFN0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWV9SWDsNCi0gICAgaHVhcnQtPlJlY2VwdGlvblR5cGUgPSBIQUxfVUFSVF9SRUNFUFRJT05fU1RBTkRBUkQ7DQotDQotICAgIC8qIEluaXQgdGlja3N0YXJ0IGZvciB0aW1lb3V0IG1hbmFnZW1lbnQgKi8NCi0gICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsNCi0NCi0gICAgaHVhcnQtPlJ4WGZlclNpemUgPSBTaXplOw0KLSAgICBodWFydC0+UnhYZmVyQ291bnQgPSBTaXplOw0KLQ0KLSAgICAvKiBDb21wdXRhdGlvbiBvZiBVQVJUIG1hc2sgdG8gYXBwbHkgdG8gUkRSIHJlZ2lzdGVyICovDQotICAgIFVBUlRfTUFTS19DT01QVVRBVElPTihodWFydCk7DQotICAgIHVoTWFzayA9IGh1YXJ0LT5NYXNrOw0KLQ0KLSAgICAvKiBJbiBjYXNlIG9mIDliaXRzL05vIFBhcml0eSB0cmFuc2ZlciwgcFJ4RGF0YSBuZWVkcyB0byBiZSBoYW5kbGVkIGFzIGENCi0gICAgICogdWludDE2X3QgcG9pbnRlciAqLw0KLSAgICBpZiAoKGh1YXJ0LT5Jbml0LldvcmRMZW5ndGggPT0gVUFSVF9XT1JETEVOR1RIXzlCKSAmJg0KLSAgICAgICAgKGh1YXJ0LT5Jbml0LlBhcml0eSA9PSBVQVJUX1BBUklUWV9OT05FKSkgew0KLSAgICAgIHBkYXRhOGJpdHMgPSBOVUxMOw0KLSAgICAgIHBkYXRhMTZiaXRzID0gKHVpbnQxNl90ICopcERhdGE7DQotICAgIH0gZWxzZSB7DQotICAgICAgcGRhdGE4Yml0cyA9IHBEYXRhOw0KLSAgICAgIHBkYXRhMTZiaXRzID0gTlVMTDsNCi0gICAgfQ0KLQ0KLSAgICBfX0hBTF9VTkxPQ0soaHVhcnQpOw0KLQ0KLSAgICAvKiBhcyBsb25nIGFzIGRhdGEgaGF2ZSB0byBiZSByZWNlaXZlZCAqLw0KLSAgICB3aGlsZSAoaHVhcnQtPlJ4WGZlckNvdW50ID4gMFUpIHsNCi0gICAgICBpZiAoVUFSVF9XYWl0T25GbGFnVW50aWxUaW1lb3V0KGh1YXJ0LCBVQVJUX0ZMQUdfUlhORSwgUkVTRVQsIHRpY2tzdGFydCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVvdXQpICE9IEhBTF9PSykgew0KLSAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOw0KLSAgICAgIH0NCi0gICAgICBpZiAocGRhdGE4Yml0cyA9PSBOVUxMKSB7DQotICAgICAgICAqcGRhdGExNmJpdHMgPSAodWludDE2X3QpKGh1YXJ0LT5JbnN0YW5jZS0+UkRSICYgdWhNYXNrKTsNCi0gICAgICAgIHBkYXRhMTZiaXRzKys7DQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgICpwZGF0YThiaXRzID0gKHVpbnQ4X3QpKGh1YXJ0LT5JbnN0YW5jZS0+UkRSICYgKHVpbnQ4X3QpdWhNYXNrKTsNCi0gICAgICAgIHBkYXRhOGJpdHMrKzsNCi0gICAgICB9DQotICAgICAgaHVhcnQtPlJ4WGZlckNvdW50LS07DQotICAgIH0NCi0NCi0gICAgLyogQXQgZW5kIG9mIFJ4IHByb2Nlc3MsIHJlc3RvcmUgaHVhcnQtPlJ4U3RhdGUgdG8gUmVhZHkgKi8NCi0gICAgaHVhcnQtPlJ4U3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsNCi0NCi0gICAgcmV0dXJuIEhBTF9PSzsNCi0gIH0gZWxzZSB7DQotICAgIHJldHVybiBIQUxfQlVTWTsNCi0gIH0NCi19DQotDQotLyoqDQotICogQGJyaWVmIFNlbmQgYW4gYW1vdW50IG9mIGRhdGEgaW4gaW50ZXJydXB0IG1vZGUuDQotICogQG5vdGUgICBXaGVuIFVBUlQgcGFyaXR5IGlzIG5vdCBlbmFibGVkIChQQ0UgPSAwKSwgYW5kIFdvcmQgTGVuZ3RoIGlzDQotICogY29uZmlndXJlZCB0byA5IGJpdHMgKE0xLU0wID0gMDEpLCB0aGUgc2VudCBkYXRhIGlzIGhhbmRsZWQgYXMgYSBzZXQgb2YgdTE2Lg0KLSAqIEluIHRoaXMgY2FzZSwgU2l6ZSBtdXN0IGluZGljYXRlIHRoZSBudW1iZXIgb2YgdTE2IHByb3ZpZGVkIHRocm91Z2ggcERhdGEuDQotICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLg0KLSAqIEBwYXJhbSBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyICh1OCBvciB1MTYgZGF0YSBlbGVtZW50cykuDQotICogQHBhcmFtIFNpemUgIEFtb3VudCBvZiBkYXRhIGVsZW1lbnRzICh1OCBvciB1MTYpIHRvIGJlIHNlbnQuDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfVHJhbnNtaXRfSVQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSkgew0KLSAgLyogQ2hlY2sgdGhhdCBhIFR4IHByb2Nlc3MgaXMgbm90IGFscmVhZHkgb25nb2luZyAqLw0KLSAgaWYgKGh1YXJ0LT5nU3RhdGUgPT0gSEFMX1VBUlRfU1RBVEVfUkVBRFkpIHsNCi0gICAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpIHsNCi0gICAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgICB9DQotDQotICAgIF9fSEFMX0xPQ0soaHVhcnQpOw0KLQ0KLSAgICBodWFydC0+cFR4QnVmZlB0ciA9IHBEYXRhOw0KLSAgICBodWFydC0+VHhYZmVyU2l6ZSA9IFNpemU7DQotICAgIGh1YXJ0LT5UeFhmZXJDb3VudCA9IFNpemU7DQotICAgIGh1YXJ0LT5UeElTUiA9IE5VTEw7DQotDQotICAgIGh1YXJ0LT5FcnJvckNvZGUgPSBIQUxfVUFSVF9FUlJPUl9OT05FOw0KLSAgICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWV9UWDsNCi0NCi0gICAgLyogQ29uZmlndXJlIFR4IGludGVycnVwdCBwcm9jZXNzaW5nICovDQotICAgIGlmIChodWFydC0+Rmlmb01vZGUgPT0gVUFSVF9GSUZPTU9ERV9FTkFCTEUpIHsNCi0gICAgICAvKiBTZXQgdGhlIFR4IElTUiBmdW5jdGlvbiBwb2ludGVyIGFjY29yZGluZyB0byB0aGUgZGF0YSB3b3JkIGxlbmd0aCAqLw0KLSAgICAgIGlmICgoaHVhcnQtPkluaXQuV29yZExlbmd0aCA9PSBVQVJUX1dPUkRMRU5HVEhfOUIpICYmDQotICAgICAgICAgIChodWFydC0+SW5pdC5QYXJpdHkgPT0gVUFSVF9QQVJJVFlfTk9ORSkpIHsNCi0gICAgICAgIGh1YXJ0LT5UeElTUiA9IFVBUlRfVHhJU1JfMTZCSVRfRklGT0VOOw0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICBodWFydC0+VHhJU1IgPSBVQVJUX1R4SVNSXzhCSVRfRklGT0VOOw0KLSAgICAgIH0NCi0NCi0gICAgICBfX0hBTF9VTkxPQ0soaHVhcnQpOw0KLQ0KLSAgICAgIC8qIEVuYWJsZSB0aGUgVFggRklGTyB0aHJlc2hvbGQgaW50ZXJydXB0ICovDQotICAgICAgQVRPTUlDX1NFVF9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19UWEZUSUUpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgIC8qIFNldCB0aGUgVHggSVNSIGZ1bmN0aW9uIHBvaW50ZXIgYWNjb3JkaW5nIHRvIHRoZSBkYXRhIHdvcmQgbGVuZ3RoICovDQotICAgICAgaWYgKChodWFydC0+SW5pdC5Xb3JkTGVuZ3RoID09IFVBUlRfV09SRExFTkdUSF85QikgJiYNCi0gICAgICAgICAgKGh1YXJ0LT5Jbml0LlBhcml0eSA9PSBVQVJUX1BBUklUWV9OT05FKSkgew0KLSAgICAgICAgaHVhcnQtPlR4SVNSID0gVUFSVF9UeElTUl8xNkJJVDsNCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgaHVhcnQtPlR4SVNSID0gVUFSVF9UeElTUl84QklUOw0KLSAgICAgIH0NCi0NCi0gICAgICBfX0hBTF9VTkxPQ0soaHVhcnQpOw0KLQ0KLSAgICAgIC8qIEVuYWJsZSB0aGUgVHJhbnNtaXQgRGF0YSBSZWdpc3RlciBFbXB0eSBpbnRlcnJ1cHQgKi8NCi0gICAgICBBVE9NSUNfU0VUX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1RYRUlFX1RYRk5GSUUpOw0KLSAgICB9DQotDQotICAgIHJldHVybiBIQUxfT0s7DQotICB9IGVsc2Ugew0KLSAgICByZXR1cm4gSEFMX0JVU1k7DQotICB9DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIGludGVycnVwdCBtb2RlLg0KLSAqIEBub3RlICAgV2hlbiBVQVJUIHBhcml0eSBpcyBub3QgZW5hYmxlZCAoUENFID0gMCksIGFuZCBXb3JkIExlbmd0aCBpcw0KLSAqIGNvbmZpZ3VyZWQgdG8gOSBiaXRzIChNMS1NMCA9IDAxKSwgdGhlIHJlY2VpdmVkIGRhdGEgaXMgaGFuZGxlZCBhcyBhIHNldCBvZg0KLSAqIHUxNi4gSW4gdGhpcyBjYXNlLCBTaXplIG11c3QgaW5kaWNhdGUgdGhlIG51bWJlciBvZiB1MTYgYXZhaWxhYmxlIHRocm91Z2gNCi0gKiBwRGF0YS4NCi0gKiBAcGFyYW0gaHVhcnQgVUFSVCBoYW5kbGUuDQotICogQHBhcmFtIHBEYXRhIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIgKHU4IG9yIHUxNiBkYXRhIGVsZW1lbnRzKS4NCi0gKiBAcGFyYW0gU2l6ZSAgQW1vdW50IG9mIGRhdGEgZWxlbWVudHMgKHU4IG9yIHUxNikgdG8gYmUgcmVjZWl2ZWQuDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfUmVjZWl2ZV9JVChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCB1aW50OF90ICpwRGF0YSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IFNpemUpIHsNCi0gIC8qIENoZWNrIHRoYXQgYSBSeCBwcm9jZXNzIGlzIG5vdCBhbHJlYWR5IG9uZ29pbmcgKi8NCi0gIGlmIChodWFydC0+UnhTdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9SRUFEWSkgew0KLSAgICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkgew0KLSAgICAgIHJldHVybiBIQUxfRVJST1I7DQotICAgIH0NCi0NCi0gICAgX19IQUxfTE9DSyhodWFydCk7DQotDQotICAgIC8qIFNldCBSZWNlcHRpb24gdHlwZSB0byBTdGFuZGFyZCByZWNlcHRpb24gKi8NCi0gICAgaHVhcnQtPlJlY2VwdGlvblR5cGUgPSBIQUxfVUFSVF9SRUNFUFRJT05fU1RBTkRBUkQ7DQotDQotICAgIGlmICghKElTX0xQVUFSVF9JTlNUQU5DRShodWFydC0+SW5zdGFuY2UpKSkgew0KLSAgICAgIC8qIENoZWNrIHRoYXQgVVNBUlQgUlRPRU4gYml0IGlzIHNldCAqLw0KLSAgICAgIGlmIChSRUFEX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX1JUT0VOKSAhPSAwVSkgew0KLSAgICAgICAgLyogRW5hYmxlIHRoZSBVQVJUIFJlY2VpdmVyIFRpbWVvdXQgSW50ZXJydXB0ICovDQotICAgICAgICBBVE9NSUNfU0VUX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1JUT0lFKTsNCi0gICAgICB9DQotICAgIH0NCi0NCi0gICAgcmV0dXJuIChVQVJUX1N0YXJ0X1JlY2VpdmVfSVQoaHVhcnQsIHBEYXRhLCBTaXplKSk7DQotICB9IGVsc2Ugew0KLSAgICByZXR1cm4gSEFMX0JVU1k7DQotICB9DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBTZW5kIGFuIGFtb3VudCBvZiBkYXRhIGluIERNQSBtb2RlLg0KLSAqIEBub3RlICAgV2hlbiBVQVJUIHBhcml0eSBpcyBub3QgZW5hYmxlZCAoUENFID0gMCksIGFuZCBXb3JkIExlbmd0aCBpcw0KLSAqIGNvbmZpZ3VyZWQgdG8gOSBiaXRzIChNMS1NMCA9IDAxKSwgdGhlIHNlbnQgZGF0YSBpcyBoYW5kbGVkIGFzIGEgc2V0IG9mIHUxNi4NCi0gKiBJbiB0aGlzIGNhc2UsIFNpemUgbXVzdCBpbmRpY2F0ZSB0aGUgbnVtYmVyIG9mIHUxNiBwcm92aWRlZCB0aHJvdWdoIHBEYXRhLg0KLSAqIEBwYXJhbSBodWFydCBVQVJUIGhhbmRsZS4NCi0gKiBAcGFyYW0gcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlciAodTggb3IgdTE2IGRhdGEgZWxlbWVudHMpLg0KLSAqIEBwYXJhbSBTaXplICBBbW91bnQgb2YgZGF0YSBlbGVtZW50cyAodTggb3IgdTE2KSB0byBiZSBzZW50Lg0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX1RyYW5zbWl0X0RNQShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSkgew0KLSAgLyogQ2hlY2sgdGhhdCBhIFR4IHByb2Nlc3MgaXMgbm90IGFscmVhZHkgb25nb2luZyAqLw0KLSAgaWYgKGh1YXJ0LT5nU3RhdGUgPT0gSEFMX1VBUlRfU1RBVEVfUkVBRFkpIHsNCi0gICAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpIHsNCi0gICAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgICB9DQotDQotICAgIF9fSEFMX0xPQ0soaHVhcnQpOw0KLQ0KLSAgICBodWFydC0+cFR4QnVmZlB0ciA9IHBEYXRhOw0KLSAgICBodWFydC0+VHhYZmVyU2l6ZSA9IFNpemU7DQotICAgIGh1YXJ0LT5UeFhmZXJDb3VudCA9IFNpemU7DQotDQotICAgIGh1YXJ0LT5FcnJvckNvZGUgPSBIQUxfVUFSVF9FUlJPUl9OT05FOw0KLSAgICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWV9UWDsNCi0NCi0gICAgaWYgKGh1YXJ0LT5oZG1hdHggIT0gTlVMTCkgew0KLSAgICAgIC8qIFNldCB0aGUgVUFSVCBETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8NCi0gICAgICBodWFydC0+aGRtYXR4LT5YZmVyQ3BsdENhbGxiYWNrID0gVUFSVF9ETUFUcmFuc21pdENwbHQ7DQotDQotICAgICAgLyogU2V0IHRoZSBVQVJUIERNQSBIYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovDQotICAgICAgaHVhcnQtPmhkbWF0eC0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBVQVJUX0RNQVR4SGFsZkNwbHQ7DQotDQotICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8NCi0gICAgICBodWFydC0+aGRtYXR4LT5YZmVyRXJyb3JDYWxsYmFjayA9IFVBUlRfRE1BRXJyb3I7DQotDQotICAgICAgLyogU2V0IHRoZSBETUEgYWJvcnQgY2FsbGJhY2sgKi8NCi0gICAgICBodWFydC0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7DQotDQotICAgICAgLyogRW5hYmxlIHRoZSBVQVJUIHRyYW5zbWl0IERNQSBjaGFubmVsICovDQotICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHVhcnQtPmhkbWF0eCwgKHVpbnQzMl90KWh1YXJ0LT5wVHhCdWZmUHRyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkmaHVhcnQtPkluc3RhbmNlLT5URFIsIFNpemUpICE9IEhBTF9PSykgew0KLSAgICAgICAgLyogU2V0IGVycm9yIGNvZGUgdG8gRE1BICovDQotICAgICAgICBodWFydC0+RXJyb3JDb2RlID0gSEFMX1VBUlRfRVJST1JfRE1BOw0KLQ0KLSAgICAgICAgX19IQUxfVU5MT0NLKGh1YXJ0KTsNCi0NCi0gICAgICAgIC8qIFJlc3RvcmUgaHVhcnQtPmdTdGF0ZSB0byByZWFkeSAqLw0KLSAgICAgICAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOw0KLQ0KLSAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gICAgICB9DQotICAgIH0NCi0gICAgLyogQ2xlYXIgdGhlIFRDIGZsYWcgaW4gdGhlIElDUiByZWdpc3RlciAqLw0KLSAgICBfX0hBTF9VQVJUX0NMRUFSX0ZMQUcoaHVhcnQsIFVBUlRfQ0xFQVJfVENGKTsNCi0NCi0gICAgX19IQUxfVU5MT0NLKGh1YXJ0KTsNCi0NCi0gICAgLyogRW5hYmxlIHRoZSBETUEgdHJhbnNmZXIgZm9yIHRyYW5zbWl0IHJlcXVlc3QgYnkgc2V0dGluZyB0aGUgRE1BVCBiaXQNCi0gICAgaW4gdGhlIFVBUlQgQ1IzIHJlZ2lzdGVyICovDQotICAgIEFUT01JQ19TRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCk7DQotDQotICAgIHJldHVybiBIQUxfT0s7DQotICB9IGVsc2Ugew0KLSAgICByZXR1cm4gSEFMX0JVU1k7DQotICB9DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIERNQSBtb2RlLg0KLSAqIEBub3RlICAgV2hlbiB0aGUgVUFSVCBwYXJpdHkgaXMgZW5hYmxlZCAoUENFID0gMSksIHRoZSByZWNlaXZlZCBkYXRhIGNvbnRhaW4NCi0gKiAgICAgICAgIHRoZSBwYXJpdHkgYml0IChNU0IgcG9zaXRpb24pLg0KLSAqIEBub3RlICAgV2hlbiBVQVJUIHBhcml0eSBpcyBub3QgZW5hYmxlZCAoUENFID0gMCksIGFuZCBXb3JkIExlbmd0aCBpcw0KLSAqIGNvbmZpZ3VyZWQgdG8gOSBiaXRzIChNMS1NMCA9IDAxKSwgdGhlIHJlY2VpdmVkIGRhdGEgaXMgaGFuZGxlZCBhcyBhIHNldCBvZg0KLSAqIHUxNi4gSW4gdGhpcyBjYXNlLCBTaXplIG11c3QgaW5kaWNhdGUgdGhlIG51bWJlciBvZiB1MTYgYXZhaWxhYmxlIHRocm91Z2gNCi0gKiBwRGF0YS4NCi0gKiBAcGFyYW0gaHVhcnQgVUFSVCBoYW5kbGUuDQotICogQHBhcmFtIHBEYXRhIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIgKHU4IG9yIHUxNiBkYXRhIGVsZW1lbnRzKS4NCi0gKiBAcGFyYW0gU2l6ZSAgQW1vdW50IG9mIGRhdGEgZWxlbWVudHMgKHU4IG9yIHUxNikgdG8gYmUgcmVjZWl2ZWQuDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfUmVjZWl2ZV9ETUEoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSkgew0KLSAgLyogQ2hlY2sgdGhhdCBhIFJ4IHByb2Nlc3MgaXMgbm90IGFscmVhZHkgb25nb2luZyAqLw0KLSAgaWYgKGh1YXJ0LT5SeFN0YXRlID09IEhBTF9VQVJUX1NUQVRFX1JFQURZKSB7DQotICAgIGlmICgocERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKSB7DQotICAgICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gICAgfQ0KLQ0KLSAgICBfX0hBTF9MT0NLKGh1YXJ0KTsNCi0NCi0gICAgLyogU2V0IFJlY2VwdGlvbiB0eXBlIHRvIFN0YW5kYXJkIHJlY2VwdGlvbiAqLw0KLSAgICBodWFydC0+UmVjZXB0aW9uVHlwZSA9IEhBTF9VQVJUX1JFQ0VQVElPTl9TVEFOREFSRDsNCi0NCi0gICAgaWYgKCEoSVNfTFBVQVJUX0lOU1RBTkNFKGh1YXJ0LT5JbnN0YW5jZSkpKSB7DQotICAgICAgLyogQ2hlY2sgdGhhdCBVU0FSVCBSVE9FTiBiaXQgaXMgc2V0ICovDQotICAgICAgaWYgKFJFQURfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IyLCBVU0FSVF9DUjJfUlRPRU4pICE9IDBVKSB7DQotICAgICAgICAvKiBFbmFibGUgdGhlIFVBUlQgUmVjZWl2ZXIgVGltZW91dCBJbnRlcnJ1cHQgKi8NCi0gICAgICAgIEFUT01JQ19TRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUlRPSUUpOw0KLSAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICByZXR1cm4gKFVBUlRfU3RhcnRfUmVjZWl2ZV9ETUEoaHVhcnQsIHBEYXRhLCBTaXplKSk7DQotICB9IGVsc2Ugew0KLSAgICByZXR1cm4gSEFMX0JVU1k7DQotICB9DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBQYXVzZSB0aGUgRE1BIFRyYW5zZmVyLg0KLSAqIEBwYXJhbSBodWFydCBVQVJUIGhhbmRsZS4NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9ETUFQYXVzZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KSB7DQotICBjb25zdCBIQUxfVUFSVF9TdGF0ZVR5cGVEZWYgZ3N0YXRlID0gaHVhcnQtPmdTdGF0ZTsNCi0gIGNvbnN0IEhBTF9VQVJUX1N0YXRlVHlwZURlZiByeHN0YXRlID0gaHVhcnQtPlJ4U3RhdGU7DQotDQotICBfX0hBTF9MT0NLKGh1YXJ0KTsNCi0NCi0gIGlmICgoSEFMX0lTX0JJVF9TRVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKSkgJiYNCi0gICAgICAoZ3N0YXRlID09IEhBTF9VQVJUX1NUQVRFX0JVU1lfVFgpKSB7DQotICAgIC8qIERpc2FibGUgdGhlIFVBUlQgRE1BIFR4IHJlcXVlc3QgKi8NCi0gICAgQVRPTUlDX0NMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOw0KLSAgfQ0KLSAgaWYgKChIQUxfSVNfQklUX1NFVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpKSAmJg0KLSAgICAgIChyeHN0YXRlID09IEhBTF9VQVJUX1NUQVRFX0JVU1lfUlgpKSB7DQotICAgIC8qIERpc2FibGUgUEUgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBpbnRlcnJ1cHRzDQotICAgICAqLw0KLSAgICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUEVJRSk7DQotICAgIEFUT01JQ19DTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOw0KLQ0KLSAgICAvKiBEaXNhYmxlIHRoZSBVQVJUIERNQSBSeCByZXF1ZXN0ICovDQotICAgIEFUT01JQ19DTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsNCi0gIH0NCi0NCi0gIF9fSEFMX1VOTE9DSyhodWFydCk7DQotDQotICByZXR1cm4gSEFMX09LOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgUmVzdW1lIHRoZSBETUEgVHJhbnNmZXIuDQotICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLg0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0RNQVJlc3VtZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KSB7DQotICBfX0hBTF9MT0NLKGh1YXJ0KTsNCi0NCi0gIGlmIChodWFydC0+Z1N0YXRlID09IEhBTF9VQVJUX1NUQVRFX0JVU1lfVFgpIHsNCi0gICAgLyogRW5hYmxlIHRoZSBVQVJUIERNQSBUeCByZXF1ZXN0ICovDQotICAgIEFUT01JQ19TRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCk7DQotICB9DQotICBpZiAoaHVhcnQtPlJ4U3RhdGUgPT0gSEFMX1VBUlRfU1RBVEVfQlVTWV9SWCkgew0KLSAgICAvKiBDbGVhciB0aGUgT3ZlcnJ1biBmbGFnIGJlZm9yZSByZXN1bWluZyB0aGUgUnggdHJhbnNmZXIgKi8NCi0gICAgX19IQUxfVUFSVF9DTEVBUl9GTEFHKGh1YXJ0LCBVQVJUX0NMRUFSX09SRUYpOw0KLQ0KLSAgICAvKiBSZS1lbmFibGUgUEUgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBpbnRlcnJ1cHRzDQotICAgICAqLw0KLSAgICBpZiAoaHVhcnQtPkluaXQuUGFyaXR5ICE9IFVBUlRfUEFSSVRZX05PTkUpIHsNCi0gICAgICBBVE9NSUNfU0VUX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1BFSUUpOw0KLSAgICB9DQotICAgIEFUT01JQ19TRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsNCi0NCi0gICAgLyogRW5hYmxlIHRoZSBVQVJUIERNQSBSeCByZXF1ZXN0ICovDQotICAgIEFUT01JQ19TRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7DQotICB9DQotDQotICBfX0hBTF9VTkxPQ0soaHVhcnQpOw0KLQ0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmIFN0b3AgdGhlIERNQSBUcmFuc2Zlci4NCi0gKiBAcGFyYW0gaHVhcnQgVUFSVCBoYW5kbGUuDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfRE1BU3RvcChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KSB7DQotICAvKiBUaGUgTG9jayBpcyBub3QgaW1wbGVtZW50ZWQgb24gdGhpcyBBUEkgdG8gYWxsb3cgdGhlIHVzZXIgYXBwbGljYXRpb24NCi0gICAgIHRvIGNhbGwgdGhlIEhBTCBVQVJUIEFQSSB1bmRlciBjYWxsYmFja3MgSEFMX1VBUlRfVHhDcGx0Q2FsbGJhY2soKSAvDQotICAgICBIQUxfVUFSVF9SeENwbHRDYWxsYmFjaygpIC8gSEFMX1VBUlRfVHhIYWxmQ3BsdENhbGxiYWNrIC8NCi0gICAgIEhBTF9VQVJUX1J4SGFsZkNwbHRDYWxsYmFjazogaW5kZWVkLCB3aGVuIEhBTF9ETUFfQWJvcnQoKSBBUEkgaXMgY2FsbGVkLA0KLSAgICAgdGhlIERNQSBUWC9SWCBUcmFuc2ZlciBvciBIYWxmIFRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdCBpcyBnZW5lcmF0ZWQgaWYNCi0gICAgIHRoZSBETUEgdHJhbnNmZXIgaW50ZXJydXB0aW9uIG9jY3VycyBhdCB0aGUgbWlkZGxlIG9yIGF0IHRoZSBlbmQgb2YgdGhlDQotICAgICBzdHJlYW0gYW5kIHRoZSBjb3JyZXNwb25kaW5nIGNhbGwgYmFjayBpcyBleGVjdXRlZC4gKi8NCi0NCi0gIGNvbnN0IEhBTF9VQVJUX1N0YXRlVHlwZURlZiBnc3RhdGUgPSBodWFydC0+Z1N0YXRlOw0KLSAgY29uc3QgSEFMX1VBUlRfU3RhdGVUeXBlRGVmIHJ4c3RhdGUgPSBodWFydC0+UnhTdGF0ZTsNCi0NCi0gIC8qIFN0b3AgVUFSVCBETUEgVHggcmVxdWVzdCBpZiBvbmdvaW5nICovDQotICBpZiAoKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCkpICYmDQotICAgICAgKGdzdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9CVVNZX1RYKSkgew0KLSAgICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCk7DQotDQotICAgIC8qIEFib3J0IHRoZSBVQVJUIERNQSBUeCBjaGFubmVsICovDQotICAgIGlmIChodWFydC0+aGRtYXR4ICE9IE5VTEwpIHsNCi0gICAgICBpZiAoSEFMX0RNQV9BYm9ydChodWFydC0+aGRtYXR4KSAhPSBIQUxfT0spIHsNCi0gICAgICAgIGlmIChIQUxfRE1BX0dldEVycm9yKGh1YXJ0LT5oZG1hdHgpID09IEhBTF9ETUFfRVJST1JfVElNRU9VVCkgew0KLSAgICAgICAgICAvKiBTZXQgZXJyb3IgY29kZSB0byBETUEgKi8NCi0gICAgICAgICAgaHVhcnQtPkVycm9yQ29kZSA9IEhBTF9VQVJUX0VSUk9SX0RNQTsNCi0NCi0gICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOw0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBVQVJUX0VuZFR4VHJhbnNmZXIoaHVhcnQpOw0KLSAgfQ0KLQ0KLSAgLyogU3RvcCBVQVJUIERNQSBSeCByZXF1ZXN0IGlmIG9uZ29pbmcgKi8NCi0gIGlmICgoSEFMX0lTX0JJVF9TRVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKSkgJiYNCi0gICAgICAocnhzdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9CVVNZX1JYKSkgew0KLSAgICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7DQotDQotICAgIC8qIEFib3J0IHRoZSBVQVJUIERNQSBSeCBjaGFubmVsICovDQotICAgIGlmIChodWFydC0+aGRtYXJ4ICE9IE5VTEwpIHsNCi0gICAgICBpZiAoSEFMX0RNQV9BYm9ydChodWFydC0+aGRtYXJ4KSAhPSBIQUxfT0spIHsNCi0gICAgICAgIGlmIChIQUxfRE1BX0dldEVycm9yKGh1YXJ0LT5oZG1hcngpID09IEhBTF9ETUFfRVJST1JfVElNRU9VVCkgew0KLSAgICAgICAgICAvKiBTZXQgZXJyb3IgY29kZSB0byBETUEgKi8NCi0gICAgICAgICAgaHVhcnQtPkVycm9yQ29kZSA9IEhBTF9VQVJUX0VSUk9SX0RNQTsNCi0NCi0gICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOw0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBVQVJUX0VuZFJ4VHJhbnNmZXIoaHVhcnQpOw0KLSAgfQ0KLQ0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBBYm9ydCBvbmdvaW5nIHRyYW5zZmVycyAoYmxvY2tpbmcgbW9kZSkuDQotICogQHBhcmFtICBodWFydCBVQVJUIGhhbmRsZS4NCi0gKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGNvdWxkIGJlIHVzZWQgZm9yIGFib3J0aW5nIGFueSBvbmdvaW5nIHRyYW5zZmVyDQotICogc3RhcnRlZCBpbiBJbnRlcnJ1cHQgb3IgRE1BIG1vZGUuIFRoaXMgcHJvY2VkdXJlIHBlcmZvcm1zIGZvbGxvd2luZw0KLSAqIG9wZXJhdGlvbnMgOg0KLSAqICAgICAgICAgICAtIERpc2FibGUgVUFSVCBJbnRlcnJ1cHRzIChUeCBhbmQgUngpDQotICogICAgICAgICAgIC0gRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGluIHRoZSBwZXJpcGhlcmFsIHJlZ2lzdGVyIChpZiBlbmFibGVkKQ0KLSAqICAgICAgICAgICAtIEFib3J0IERNQSB0cmFuc2ZlciBieSBjYWxsaW5nIEhBTF9ETUFfQWJvcnQgKGluIGNhc2Ugb2YgdHJhbnNmZXINCi0gKiBpbiBETUEgbW9kZSkNCi0gKiAgICAgICAgICAgLSBTZXQgaGFuZGxlIFN0YXRlIHRvIFJFQURZDQotICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBpcyBleGVjdXRlZCBpbiBibG9ja2luZyBtb2RlIDogd2hlbiBleGl0aW5nIGZ1bmN0aW9uLA0KLSAqIEFib3J0IGlzIGNvbnNpZGVyZWQgYXMgY29tcGxldGVkLg0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0Fib3J0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpIHsNCi0gIC8qIERpc2FibGUgVFhFLCBUQywgUlhORSwgUEUsIFJYRlQsIFRYRlQgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLA0KLSAgICogb3ZlcnJ1biBlcnJvcikgaW50ZXJydXB0cyAqLw0KLSAgQVRPTUlDX0NMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwNCi0gICAgICAgICAgICAgICAgICAgKFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSB8IFVTQVJUX0NSMV9QRUlFIHwNCi0gICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMV9UWEVJRV9UWEZORklFIHwgVVNBUlRfQ1IxX1RDSUUpKTsNCi0gIEFUT01JQ19DTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsDQotICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSM19FSUUgfCBVU0FSVF9DUjNfUlhGVElFIHwgVVNBUlRfQ1IzX1RYRlRJRSk7DQotDQotICAvKiBJZiBSZWNlcHRpb24gdGlsbCBJRExFIGV2ZW50IHdhcyBvbmdvaW5nLCBkaXNhYmxlIElETEVJRSBpbnRlcnJ1cHQgKi8NCi0gIGlmIChodWFydC0+UmVjZXB0aW9uVHlwZSA9PSBIQUxfVUFSVF9SRUNFUFRJT05fVE9JRExFKSB7DQotICAgIEFUT01JQ19DTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfSURMRUlFKSk7DQotICB9DQotDQotICAvKiBBYm9ydCB0aGUgVUFSVCBETUEgVHggY2hhbm5lbCBpZiBlbmFibGVkICovDQotICBpZiAoSEFMX0lTX0JJVF9TRVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKSkgew0KLSAgICAvKiBEaXNhYmxlIHRoZSBVQVJUIERNQSBUeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8NCi0gICAgQVRPTUlDX0NMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOw0KLQ0KLSAgICAvKiBBYm9ydCB0aGUgVUFSVCBETUEgVHggY2hhbm5lbCA6IHVzZSBibG9ja2luZyBETUEgQWJvcnQgQVBJIChubyBjYWxsYmFjaykNCi0gICAgICovDQotICAgIGlmIChodWFydC0+aGRtYXR4ICE9IE5VTEwpIHsNCi0gICAgICAvKiBTZXQgdGhlIFVBUlQgRE1BIEFib3J0IGNhbGxiYWNrIHRvIE51bGwuDQotICAgICAgICAgTm8gY2FsbCBiYWNrIGV4ZWN1dGlvbiBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLw0KLSAgICAgIGh1YXJ0LT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsNCi0NCi0gICAgICBpZiAoSEFMX0RNQV9BYm9ydChodWFydC0+aGRtYXR4KSAhPSBIQUxfT0spIHsNCi0gICAgICAgIGlmIChIQUxfRE1BX0dldEVycm9yKGh1YXJ0LT5oZG1hdHgpID09IEhBTF9ETUFfRVJST1JfVElNRU9VVCkgew0KLSAgICAgICAgICAvKiBTZXQgZXJyb3IgY29kZSB0byBETUEgKi8NCi0gICAgICAgICAgaHVhcnQtPkVycm9yQ29kZSA9IEhBTF9VQVJUX0VSUk9SX0RNQTsNCi0NCi0gICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOw0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgLyogQWJvcnQgdGhlIFVBUlQgRE1BIFJ4IGNoYW5uZWwgaWYgZW5hYmxlZCAqLw0KLSAgaWYgKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpIHsNCi0gICAgLyogRGlzYWJsZSB0aGUgVUFSVCBETUEgUnggcmVxdWVzdCBpZiBlbmFibGVkICovDQotICAgIEFUT01JQ19DTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsNCi0NCi0gICAgLyogQWJvcnQgdGhlIFVBUlQgRE1BIFJ4IGNoYW5uZWwgOiB1c2UgYmxvY2tpbmcgRE1BIEFib3J0IEFQSSAobm8gY2FsbGJhY2spDQotICAgICAqLw0KLSAgICBpZiAoaHVhcnQtPmhkbWFyeCAhPSBOVUxMKSB7DQotICAgICAgLyogU2V0IHRoZSBVQVJUIERNQSBBYm9ydCBjYWxsYmFjayB0byBOdWxsLg0KLSAgICAgICAgIE5vIGNhbGwgYmFjayBleGVjdXRpb24gYXQgZW5kIG9mIERNQSBhYm9ydCBwcm9jZWR1cmUgKi8NCi0gICAgICBodWFydC0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7DQotDQotICAgICAgaWYgKEhBTF9ETUFfQWJvcnQoaHVhcnQtPmhkbWFyeCkgIT0gSEFMX09LKSB7DQotICAgICAgICBpZiAoSEFMX0RNQV9HZXRFcnJvcihodWFydC0+aGRtYXJ4KSA9PSBIQUxfRE1BX0VSUk9SX1RJTUVPVVQpIHsNCi0gICAgICAgICAgLyogU2V0IGVycm9yIGNvZGUgdG8gRE1BICovDQotICAgICAgICAgIGh1YXJ0LT5FcnJvckNvZGUgPSBIQUxfVUFSVF9FUlJPUl9ETUE7DQotDQotICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsNCi0gICAgICAgIH0NCi0gICAgICB9DQotICAgIH0NCi0gIH0NCi0NCi0gIC8qIFJlc2V0IFR4IGFuZCBSeCB0cmFuc2ZlciBjb3VudGVycyAqLw0KLSAgaHVhcnQtPlR4WGZlckNvdW50ID0gMFU7DQotICBodWFydC0+UnhYZmVyQ291bnQgPSAwVTsNCi0NCi0gIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovDQotICBfX0hBTF9VQVJUX0NMRUFSX0ZMQUcoaHVhcnQsIFVBUlRfQ0xFQVJfT1JFRiB8IFVBUlRfQ0xFQVJfTkVGIHwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVBUlRfQ0xFQVJfUEVGIHwgVUFSVF9DTEVBUl9GRUYpOw0KLQ0KLSAgLyogRmx1c2ggdGhlIHdob2xlIFRYIEZJRk8gKGlmIG5lZWRlZCkgKi8NCi0gIGlmIChodWFydC0+Rmlmb01vZGUgPT0gVUFSVF9GSUZPTU9ERV9FTkFCTEUpIHsNCi0gICAgX19IQUxfVUFSVF9TRU5EX1JFUShodWFydCwgVUFSVF9UWERBVEFfRkxVU0hfUkVRVUVTVCk7DQotICB9DQotDQotICAvKiBEaXNjYXJkIHRoZSByZWNlaXZlZCBkYXRhICovDQotICBfX0hBTF9VQVJUX1NFTkRfUkVRKGh1YXJ0LCBVQVJUX1JYREFUQV9GTFVTSF9SRVFVRVNUKTsNCi0NCi0gIC8qIFJlc3RvcmUgaHVhcnQtPmdTdGF0ZSBhbmQgaHVhcnQtPlJ4U3RhdGUgdG8gUmVhZHkgKi8NCi0gIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsNCi0gIGh1YXJ0LT5SeFN0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7DQotICBodWFydC0+UmVjZXB0aW9uVHlwZSA9IEhBTF9VQVJUX1JFQ0VQVElPTl9TVEFOREFSRDsNCi0NCi0gIGh1YXJ0LT5FcnJvckNvZGUgPSBIQUxfVUFSVF9FUlJPUl9OT05FOw0KLQ0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBBYm9ydCBvbmdvaW5nIFRyYW5zbWl0IHRyYW5zZmVyIChibG9ja2luZyBtb2RlKS4NCi0gKiBAcGFyYW0gIGh1YXJ0IFVBUlQgaGFuZGxlLg0KLSAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgY291bGQgYmUgdXNlZCBmb3IgYWJvcnRpbmcgYW55IG9uZ29pbmcgVHggdHJhbnNmZXINCi0gKiBzdGFydGVkIGluIEludGVycnVwdCBvciBETUEgbW9kZS4gVGhpcyBwcm9jZWR1cmUgcGVyZm9ybXMgZm9sbG93aW5nDQotICogb3BlcmF0aW9ucyA6DQotICogICAgICAgICAgIC0gRGlzYWJsZSBVQVJUIEludGVycnVwdHMgKFR4KQ0KLSAqICAgICAgICAgICAtIERpc2FibGUgdGhlIERNQSB0cmFuc2ZlciBpbiB0aGUgcGVyaXBoZXJhbCByZWdpc3RlciAoaWYgZW5hYmxlZCkNCi0gKiAgICAgICAgICAgLSBBYm9ydCBETUEgdHJhbnNmZXIgYnkgY2FsbGluZyBIQUxfRE1BX0Fib3J0IChpbiBjYXNlIG9mIHRyYW5zZmVyDQotICogaW4gRE1BIG1vZGUpDQotICogICAgICAgICAgIC0gU2V0IGhhbmRsZSBTdGF0ZSB0byBSRUFEWQ0KLSAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgaXMgZXhlY3V0ZWQgaW4gYmxvY2tpbmcgbW9kZSA6IHdoZW4gZXhpdGluZyBmdW5jdGlvbiwNCi0gKiBBYm9ydCBpcyBjb25zaWRlcmVkIGFzIGNvbXBsZXRlZC4NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9BYm9ydFRyYW5zbWl0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpIHsNCi0gIC8qIERpc2FibGUgVENJRSwgVFhFSUUgYW5kIFRYRlRJRSBpbnRlcnJ1cHRzICovDQotICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLA0KLSAgICAgICAgICAgICAgICAgICAoVVNBUlRfQ1IxX1RDSUUgfCBVU0FSVF9DUjFfVFhFSUVfVFhGTkZJRSkpOw0KLSAgQVRPTUlDX0NMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX1RYRlRJRSk7DQotDQotICAvKiBBYm9ydCB0aGUgVUFSVCBETUEgVHggY2hhbm5lbCBpZiBlbmFibGVkICovDQotICBpZiAoSEFMX0lTX0JJVF9TRVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKSkgew0KLSAgICAvKiBEaXNhYmxlIHRoZSBVQVJUIERNQSBUeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8NCi0gICAgQVRPTUlDX0NMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOw0KLQ0KLSAgICAvKiBBYm9ydCB0aGUgVUFSVCBETUEgVHggY2hhbm5lbCA6IHVzZSBibG9ja2luZyBETUEgQWJvcnQgQVBJIChubyBjYWxsYmFjaykNCi0gICAgICovDQotICAgIGlmIChodWFydC0+aGRtYXR4ICE9IE5VTEwpIHsNCi0gICAgICAvKiBTZXQgdGhlIFVBUlQgRE1BIEFib3J0IGNhbGxiYWNrIHRvIE51bGwuDQotICAgICAgICAgTm8gY2FsbCBiYWNrIGV4ZWN1dGlvbiBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLw0KLSAgICAgIGh1YXJ0LT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsNCi0NCi0gICAgICBpZiAoSEFMX0RNQV9BYm9ydChodWFydC0+aGRtYXR4KSAhPSBIQUxfT0spIHsNCi0gICAgICAgIGlmIChIQUxfRE1BX0dldEVycm9yKGh1YXJ0LT5oZG1hdHgpID09IEhBTF9ETUFfRVJST1JfVElNRU9VVCkgew0KLSAgICAgICAgICAvKiBTZXQgZXJyb3IgY29kZSB0byBETUEgKi8NCi0gICAgICAgICAgaHVhcnQtPkVycm9yQ29kZSA9IEhBTF9VQVJUX0VSUk9SX0RNQTsNCi0NCi0gICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOw0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgLyogUmVzZXQgVHggdHJhbnNmZXIgY291bnRlciAqLw0KLSAgaHVhcnQtPlR4WGZlckNvdW50ID0gMFU7DQotDQotICAvKiBGbHVzaCB0aGUgd2hvbGUgVFggRklGTyAoaWYgbmVlZGVkKSAqLw0KLSAgaWYgKGh1YXJ0LT5GaWZvTW9kZSA9PSBVQVJUX0ZJRk9NT0RFX0VOQUJMRSkgew0KLSAgICBfX0hBTF9VQVJUX1NFTkRfUkVRKGh1YXJ0LCBVQVJUX1RYREFUQV9GTFVTSF9SRVFVRVNUKTsNCi0gIH0NCi0NCi0gIC8qIFJlc3RvcmUgaHVhcnQtPmdTdGF0ZSB0byBSZWFkeSAqLw0KLSAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOw0KLQ0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBBYm9ydCBvbmdvaW5nIFJlY2VpdmUgdHJhbnNmZXIgKGJsb2NraW5nIG1vZGUpLg0KLSAqIEBwYXJhbSAgaHVhcnQgVUFSVCBoYW5kbGUuDQotICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBjb3VsZCBiZSB1c2VkIGZvciBhYm9ydGluZyBhbnkgb25nb2luZyBSeCB0cmFuc2Zlcg0KLSAqIHN0YXJ0ZWQgaW4gSW50ZXJydXB0IG9yIERNQSBtb2RlLiBUaGlzIHByb2NlZHVyZSBwZXJmb3JtcyBmb2xsb3dpbmcNCi0gKiBvcGVyYXRpb25zIDoNCi0gKiAgICAgICAgICAgLSBEaXNhYmxlIFVBUlQgSW50ZXJydXB0cyAoUngpDQotICogICAgICAgICAgIC0gRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGluIHRoZSBwZXJpcGhlcmFsIHJlZ2lzdGVyIChpZiBlbmFibGVkKQ0KLSAqICAgICAgICAgICAtIEFib3J0IERNQSB0cmFuc2ZlciBieSBjYWxsaW5nIEhBTF9ETUFfQWJvcnQgKGluIGNhc2Ugb2YgdHJhbnNmZXINCi0gKiBpbiBETUEgbW9kZSkNCi0gKiAgICAgICAgICAgLSBTZXQgaGFuZGxlIFN0YXRlIHRvIFJFQURZDQotICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBpcyBleGVjdXRlZCBpbiBibG9ja2luZyBtb2RlIDogd2hlbiBleGl0aW5nIGZ1bmN0aW9uLA0KLSAqIEFib3J0IGlzIGNvbnNpZGVyZWQgYXMgY29tcGxldGVkLg0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0Fib3J0UmVjZWl2ZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KSB7DQotICAvKiBEaXNhYmxlIFBFSUUsIEVJRSwgUlhORUlFIGFuZCBSWEZUSUUgaW50ZXJydXB0cyAqLw0KLSAgQVRPTUlDX0NMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwNCi0gICAgICAgICAgICAgICAgICAgKFVTQVJUX0NSMV9QRUlFIHwgVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFKSk7DQotICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFIHwgVVNBUlRfQ1IzX1JYRlRJRSk7DQotDQotICAvKiBJZiBSZWNlcHRpb24gdGlsbCBJRExFIGV2ZW50IHdhcyBvbmdvaW5nLCBkaXNhYmxlIElETEVJRSBpbnRlcnJ1cHQgKi8NCi0gIGlmIChodWFydC0+UmVjZXB0aW9uVHlwZSA9PSBIQUxfVUFSVF9SRUNFUFRJT05fVE9JRExFKSB7DQotICAgIEFUT01JQ19DTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfSURMRUlFKSk7DQotICB9DQotDQotICAvKiBBYm9ydCB0aGUgVUFSVCBETUEgUnggY2hhbm5lbCBpZiBlbmFibGVkICovDQotICBpZiAoSEFMX0lTX0JJVF9TRVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKSkgew0KLSAgICAvKiBEaXNhYmxlIHRoZSBVQVJUIERNQSBSeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8NCi0gICAgQVRPTUlDX0NMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOw0KLQ0KLSAgICAvKiBBYm9ydCB0aGUgVUFSVCBETUEgUnggY2hhbm5lbCA6IHVzZSBibG9ja2luZyBETUEgQWJvcnQgQVBJIChubyBjYWxsYmFjaykNCi0gICAgICovDQotICAgIGlmIChodWFydC0+aGRtYXJ4ICE9IE5VTEwpIHsNCi0gICAgICAvKiBTZXQgdGhlIFVBUlQgRE1BIEFib3J0IGNhbGxiYWNrIHRvIE51bGwuDQotICAgICAgICAgTm8gY2FsbCBiYWNrIGV4ZWN1dGlvbiBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLw0KLSAgICAgIGh1YXJ0LT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsNCi0NCi0gICAgICBpZiAoSEFMX0RNQV9BYm9ydChodWFydC0+aGRtYXJ4KSAhPSBIQUxfT0spIHsNCi0gICAgICAgIGlmIChIQUxfRE1BX0dldEVycm9yKGh1YXJ0LT5oZG1hcngpID09IEhBTF9ETUFfRVJST1JfVElNRU9VVCkgew0KLSAgICAgICAgICAvKiBTZXQgZXJyb3IgY29kZSB0byBETUEgKi8NCi0gICAgICAgICAgaHVhcnQtPkVycm9yQ29kZSA9IEhBTF9VQVJUX0VSUk9SX0RNQTsNCi0NCi0gICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOw0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgLyogUmVzZXQgUnggdHJhbnNmZXIgY291bnRlciAqLw0KLSAgaHVhcnQtPlJ4WGZlckNvdW50ID0gMFU7DQotDQotICAvKiBDbGVhciB0aGUgRXJyb3IgZmxhZ3MgaW4gdGhlIElDUiByZWdpc3RlciAqLw0KLSAgX19IQUxfVUFSVF9DTEVBUl9GTEFHKGh1YXJ0LCBVQVJUX0NMRUFSX09SRUYgfCBVQVJUX0NMRUFSX05FRiB8DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQVJUX0NMRUFSX1BFRiB8IFVBUlRfQ0xFQVJfRkVGKTsNCi0NCi0gIC8qIERpc2NhcmQgdGhlIHJlY2VpdmVkIGRhdGEgKi8NCi0gIF9fSEFMX1VBUlRfU0VORF9SRVEoaHVhcnQsIFVBUlRfUlhEQVRBX0ZMVVNIX1JFUVVFU1QpOw0KLQ0KLSAgLyogUmVzdG9yZSBodWFydC0+UnhTdGF0ZSB0byBSZWFkeSAqLw0KLSAgaHVhcnQtPlJ4U3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsNCi0gIGh1YXJ0LT5SZWNlcHRpb25UeXBlID0gSEFMX1VBUlRfUkVDRVBUSU9OX1NUQU5EQVJEOw0KLQ0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBBYm9ydCBvbmdvaW5nIHRyYW5zZmVycyAoSW50ZXJydXB0IG1vZGUpLg0KLSAqIEBwYXJhbSAgaHVhcnQgVUFSVCBoYW5kbGUuDQotICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBjb3VsZCBiZSB1c2VkIGZvciBhYm9ydGluZyBhbnkgb25nb2luZyB0cmFuc2Zlcg0KLSAqIHN0YXJ0ZWQgaW4gSW50ZXJydXB0IG9yIERNQSBtb2RlLiBUaGlzIHByb2NlZHVyZSBwZXJmb3JtcyBmb2xsb3dpbmcNCi0gKiBvcGVyYXRpb25zIDoNCi0gKiAgICAgICAgICAgLSBEaXNhYmxlIFVBUlQgSW50ZXJydXB0cyAoVHggYW5kIFJ4KQ0KLSAqICAgICAgICAgICAtIERpc2FibGUgdGhlIERNQSB0cmFuc2ZlciBpbiB0aGUgcGVyaXBoZXJhbCByZWdpc3RlciAoaWYgZW5hYmxlZCkNCi0gKiAgICAgICAgICAgLSBBYm9ydCBETUEgdHJhbnNmZXIgYnkgY2FsbGluZyBIQUxfRE1BX0Fib3J0X0lUIChpbiBjYXNlIG9mDQotICogdHJhbnNmZXIgaW4gRE1BIG1vZGUpDQotICogICAgICAgICAgIC0gU2V0IGhhbmRsZSBTdGF0ZSB0byBSRUFEWQ0KLSAqICAgICAgICAgICAtIEF0IGFib3J0IGNvbXBsZXRpb24sIGNhbGwgdXNlciBhYm9ydCBjb21wbGV0ZSBjYWxsYmFjaw0KLSAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgaXMgZXhlY3V0ZWQgaW4gSW50ZXJydXB0IG1vZGUsIG1lYW5pbmcgdGhhdCBhYm9ydA0KLSAqIHByb2NlZHVyZSBjb3VsZCBiZSBjb25zaWRlcmVkIGFzIGNvbXBsZXRlZCBvbmx5IHdoZW4gdXNlciBhYm9ydCBjb21wbGV0ZQ0KLSAqIGNhbGxiYWNrIGlzIGV4ZWN1dGVkIChub3Qgd2hlbiBleGl0aW5nIGZ1bmN0aW9uKS4NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9BYm9ydF9JVChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KSB7DQotICB1aW50MzJfdCBhYm9ydGNwbHQgPSAxVTsNCi0NCi0gIC8qIERpc2FibGUgaW50ZXJydXB0cyAqLw0KLSAgQVRPTUlDX0NMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwNCi0gICAgICAgICAgICAgICAgICAgKFVTQVJUX0NSMV9QRUlFIHwgVVNBUlRfQ1IxX1RDSUUgfCBVU0FSVF9DUjFfUlhORUlFX1JYRk5FSUUgfA0KLSAgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX1RYRUlFX1RYRk5GSUUpKTsNCi0gIEFUT01JQ19DTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsDQotICAgICAgICAgICAgICAgICAgIChVU0FSVF9DUjNfRUlFIHwgVVNBUlRfQ1IzX1JYRlRJRSB8IFVTQVJUX0NSM19UWEZUSUUpKTsNCi0NCi0gIC8qIElmIFJlY2VwdGlvbiB0aWxsIElETEUgZXZlbnQgd2FzIG9uZ29pbmcsIGRpc2FibGUgSURMRUlFIGludGVycnVwdCAqLw0KLSAgaWYgKGh1YXJ0LT5SZWNlcHRpb25UeXBlID09IEhBTF9VQVJUX1JFQ0VQVElPTl9UT0lETEUpIHsNCi0gICAgQVRPTUlDX0NMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9JRExFSUUpKTsNCi0gIH0NCi0NCi0gIC8qIElmIERNQSBUeCBhbmQvb3IgRE1BIFJ4IEhhbmRsZXMgYXJlIGFzc29jaWF0ZWQgdG8gVUFSVCBIYW5kbGUsIERNQSBBYm9ydA0KLSAgICAgY29tcGxldGUgY2FsbGJhY2tzIHNob3VsZCBiZSBpbml0aWFsaXNlZCBiZWZvcmUgYW55IGNhbGwgdG8gRE1BIEFib3J0DQotICAgICBmdW5jdGlvbnMgKi8NCi0gIC8qIERNQSBUeCBIYW5kbGUgaXMgdmFsaWQgKi8NCi0gIGlmIChodWFydC0+aGRtYXR4ICE9IE5VTEwpIHsNCi0gICAgLyogU2V0IERNQSBBYm9ydCBDb21wbGV0ZSBjYWxsYmFjayBpZiBVQVJUIERNQSBUeCByZXF1ZXN0IGlmIGVuYWJsZWQuDQotICAgICAgIE90aGVyd2lzZSwgc2V0IGl0IHRvIE5VTEwgKi8NCi0gICAgaWYgKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCkpIHsNCi0gICAgICBodWFydC0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IFVBUlRfRE1BVHhBYm9ydENhbGxiYWNrOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgIGh1YXJ0LT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsNCi0gICAgfQ0KLSAgfQ0KLSAgLyogRE1BIFJ4IEhhbmRsZSBpcyB2YWxpZCAqLw0KLSAgaWYgKGh1YXJ0LT5oZG1hcnggIT0gTlVMTCkgew0KLSAgICAvKiBTZXQgRE1BIEFib3J0IENvbXBsZXRlIGNhbGxiYWNrIGlmIFVBUlQgRE1BIFJ4IHJlcXVlc3QgaWYgZW5hYmxlZC4NCi0gICAgICAgT3RoZXJ3aXNlLCBzZXQgaXQgdG8gTlVMTCAqLw0KLSAgICBpZiAoSEFMX0lTX0JJVF9TRVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKSkgew0KLSAgICAgIGh1YXJ0LT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gVUFSVF9ETUFSeEFib3J0Q2FsbGJhY2s7DQotICAgIH0gZWxzZSB7DQotICAgICAgaHVhcnQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOw0KLSAgICB9DQotICB9DQotDQotICAvKiBBYm9ydCB0aGUgVUFSVCBETUEgVHggY2hhbm5lbCBpZiBlbmFibGVkICovDQotICBpZiAoSEFMX0lTX0JJVF9TRVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKSkgew0KLSAgICAvKiBEaXNhYmxlIERNQSBUeCBhdCBVQVJUIGxldmVsICovDQotICAgIEFUT01JQ19DTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsNCi0NCi0gICAgLyogQWJvcnQgdGhlIFVBUlQgRE1BIFR4IGNoYW5uZWwgOiB1c2Ugbm9uIGJsb2NraW5nIERNQSBBYm9ydCBBUEkgKGNhbGxiYWNrKQ0KLSAgICAgKi8NCi0gICAgaWYgKGh1YXJ0LT5oZG1hdHggIT0gTlVMTCkgew0KLSAgICAgIC8qIFVBUlQgVHggRE1BIEFib3J0IGNhbGxiYWNrIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGlzZWQgOg0KLSAgICAgICAgIHdpbGwgbGVhZCB0byBjYWxsIEhBTF9VQVJUX0Fib3J0Q3BsdENhbGxiYWNrKCkgYXQgZW5kIG9mIERNQSBhYm9ydA0KLSAgICAgICAgIHByb2NlZHVyZSAqLw0KLQ0KLSAgICAgIC8qIEFib3J0IERNQSBUWCAqLw0KLSAgICAgIGlmIChIQUxfRE1BX0Fib3J0X0lUKGh1YXJ0LT5oZG1hdHgpICE9IEhBTF9PSykgew0KLSAgICAgICAgaHVhcnQtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOw0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICBhYm9ydGNwbHQgPSAwVTsNCi0gICAgICB9DQotICAgIH0NCi0gIH0NCi0NCi0gIC8qIEFib3J0IHRoZSBVQVJUIERNQSBSeCBjaGFubmVsIGlmIGVuYWJsZWQgKi8NCi0gIGlmIChIQUxfSVNfQklUX1NFVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpKSB7DQotICAgIC8qIERpc2FibGUgdGhlIFVBUlQgRE1BIFJ4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLw0KLSAgICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7DQotDQotICAgIC8qIEFib3J0IHRoZSBVQVJUIERNQSBSeCBjaGFubmVsIDogdXNlIG5vbiBibG9ja2luZyBETUEgQWJvcnQgQVBJIChjYWxsYmFjaykNCi0gICAgICovDQotICAgIGlmIChodWFydC0+aGRtYXJ4ICE9IE5VTEwpIHsNCi0gICAgICAvKiBVQVJUIFJ4IERNQSBBYm9ydCBjYWxsYmFjayBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpc2VkIDoNCi0gICAgICAgICB3aWxsIGxlYWQgdG8gY2FsbCBIQUxfVUFSVF9BYm9ydENwbHRDYWxsYmFjaygpIGF0IGVuZCBvZiBETUEgYWJvcnQNCi0gICAgICAgICBwcm9jZWR1cmUgKi8NCi0NCi0gICAgICAvKiBBYm9ydCBETUEgUlggKi8NCi0gICAgICBpZiAoSEFMX0RNQV9BYm9ydF9JVChodWFydC0+aGRtYXJ4KSAhPSBIQUxfT0spIHsNCi0gICAgICAgIGh1YXJ0LT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsNCi0gICAgICAgIGFib3J0Y3BsdCA9IDFVOw0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICBhYm9ydGNwbHQgPSAwVTsNCi0gICAgICB9DQotICAgIH0NCi0gIH0NCi0NCi0gIC8qIGlmIG5vIERNQSBhYm9ydCBjb21wbGV0ZSBjYWxsYmFjayBleGVjdXRpb24gaXMgcmVxdWlyZWQgPT4gY2FsbCB1c2VyIEFib3J0DQotICAgKiBDb21wbGV0ZSBjYWxsYmFjayAqLw0KLSAgaWYgKGFib3J0Y3BsdCA9PSAxVSkgew0KLSAgICAvKiBSZXNldCBUeCBhbmQgUnggdHJhbnNmZXIgY291bnRlcnMgKi8NCi0gICAgaHVhcnQtPlR4WGZlckNvdW50ID0gMFU7DQotICAgIGh1YXJ0LT5SeFhmZXJDb3VudCA9IDBVOw0KLQ0KLSAgICAvKiBDbGVhciBJU1IgZnVuY3Rpb24gcG9pbnRlcnMgKi8NCi0gICAgaHVhcnQtPlJ4SVNSID0gTlVMTDsNCi0gICAgaHVhcnQtPlR4SVNSID0gTlVMTDsNCi0NCi0gICAgLyogUmVzZXQgZXJyb3JDb2RlICovDQotICAgIGh1YXJ0LT5FcnJvckNvZGUgPSBIQUxfVUFSVF9FUlJPUl9OT05FOw0KLQ0KLSAgICAvKiBDbGVhciB0aGUgRXJyb3IgZmxhZ3MgaW4gdGhlIElDUiByZWdpc3RlciAqLw0KLSAgICBfX0hBTF9VQVJUX0NMRUFSX0ZMQUcoaHVhcnQsIFVBUlRfQ0xFQVJfT1JFRiB8IFVBUlRfQ0xFQVJfTkVGIHwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUFSVF9DTEVBUl9QRUYgfCBVQVJUX0NMRUFSX0ZFRik7DQotDQotICAgIC8qIEZsdXNoIHRoZSB3aG9sZSBUWCBGSUZPIChpZiBuZWVkZWQpICovDQotICAgIGlmIChodWFydC0+Rmlmb01vZGUgPT0gVUFSVF9GSUZPTU9ERV9FTkFCTEUpIHsNCi0gICAgICBfX0hBTF9VQVJUX1NFTkRfUkVRKGh1YXJ0LCBVQVJUX1RYREFUQV9GTFVTSF9SRVFVRVNUKTsNCi0gICAgfQ0KLQ0KLSAgICAvKiBEaXNjYXJkIHRoZSByZWNlaXZlZCBkYXRhICovDQotICAgIF9fSEFMX1VBUlRfU0VORF9SRVEoaHVhcnQsIFVBUlRfUlhEQVRBX0ZMVVNIX1JFUVVFU1QpOw0KLQ0KLSAgICAvKiBSZXN0b3JlIGh1YXJ0LT5nU3RhdGUgYW5kIGh1YXJ0LT5SeFN0YXRlIHRvIFJlYWR5ICovDQotICAgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsNCi0gICAgaHVhcnQtPlJ4U3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsNCi0gICAgaHVhcnQtPlJlY2VwdGlvblR5cGUgPSBIQUxfVUFSVF9SRUNFUFRJT05fU1RBTkRBUkQ7DQotDQotICAgIC8qIEFzIG5vIERNQSB0byBiZSBhYm9ydGVkLCBjYWxsIGRpcmVjdGx5IHVzZXIgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8NCi0jaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkNCi0gICAgLyogQ2FsbCByZWdpc3RlcmVkIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovDQotICAgIGh1YXJ0LT5BYm9ydENwbHRDYWxsYmFjayhodWFydCk7DQotI2Vsc2UNCi0gICAgLyogQ2FsbCBsZWdhY3kgd2VhayBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLw0KLSAgICBIQUxfVUFSVF9BYm9ydENwbHRDYWxsYmFjayhodWFydCk7DQotI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi0gIH0NCi0NCi0gIHJldHVybiBIQUxfT0s7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQWJvcnQgb25nb2luZyBUcmFuc21pdCB0cmFuc2ZlciAoSW50ZXJydXB0IG1vZGUpLg0KLSAqIEBwYXJhbSAgaHVhcnQgVUFSVCBoYW5kbGUuDQotICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBjb3VsZCBiZSB1c2VkIGZvciBhYm9ydGluZyBhbnkgb25nb2luZyBUeCB0cmFuc2Zlcg0KLSAqIHN0YXJ0ZWQgaW4gSW50ZXJydXB0IG9yIERNQSBtb2RlLiBUaGlzIHByb2NlZHVyZSBwZXJmb3JtcyBmb2xsb3dpbmcNCi0gKiBvcGVyYXRpb25zIDoNCi0gKiAgICAgICAgICAgLSBEaXNhYmxlIFVBUlQgSW50ZXJydXB0cyAoVHgpDQotICogICAgICAgICAgIC0gRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGluIHRoZSBwZXJpcGhlcmFsIHJlZ2lzdGVyIChpZiBlbmFibGVkKQ0KLSAqICAgICAgICAgICAtIEFib3J0IERNQSB0cmFuc2ZlciBieSBjYWxsaW5nIEhBTF9ETUFfQWJvcnRfSVQgKGluIGNhc2Ugb2YNCi0gKiB0cmFuc2ZlciBpbiBETUEgbW9kZSkNCi0gKiAgICAgICAgICAgLSBTZXQgaGFuZGxlIFN0YXRlIHRvIFJFQURZDQotICogICAgICAgICAgIC0gQXQgYWJvcnQgY29tcGxldGlvbiwgY2FsbCB1c2VyIGFib3J0IGNvbXBsZXRlIGNhbGxiYWNrDQotICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBpcyBleGVjdXRlZCBpbiBJbnRlcnJ1cHQgbW9kZSwgbWVhbmluZyB0aGF0IGFib3J0DQotICogcHJvY2VkdXJlIGNvdWxkIGJlIGNvbnNpZGVyZWQgYXMgY29tcGxldGVkIG9ubHkgd2hlbiB1c2VyIGFib3J0IGNvbXBsZXRlDQotICogY2FsbGJhY2sgaXMgZXhlY3V0ZWQgKG5vdCB3aGVuIGV4aXRpbmcgZnVuY3Rpb24pLg0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0Fib3J0VHJhbnNtaXRfSVQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkgew0KLSAgLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovDQotICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLA0KLSAgICAgICAgICAgICAgICAgICAoVVNBUlRfQ1IxX1RDSUUgfCBVU0FSVF9DUjFfVFhFSUVfVFhGTkZJRSkpOw0KLSAgQVRPTUlDX0NMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX1RYRlRJRSk7DQotDQotICAvKiBBYm9ydCB0aGUgVUFSVCBETUEgVHggY2hhbm5lbCBpZiBlbmFibGVkICovDQotICBpZiAoSEFMX0lTX0JJVF9TRVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKSkgew0KLSAgICAvKiBEaXNhYmxlIHRoZSBVQVJUIERNQSBUeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8NCi0gICAgQVRPTUlDX0NMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOw0KLQ0KLSAgICAvKiBBYm9ydCB0aGUgVUFSVCBETUEgVHggY2hhbm5lbCA6IHVzZSBub24gYmxvY2tpbmcgRE1BIEFib3J0IEFQSSAoY2FsbGJhY2spDQotICAgICAqLw0KLSAgICBpZiAoaHVhcnQtPmhkbWF0eCAhPSBOVUxMKSB7DQotICAgICAgLyogU2V0IHRoZSBVQVJUIERNQSBBYm9ydCBjYWxsYmFjayA6DQotICAgICAgICAgd2lsbCBsZWFkIHRvIGNhbGwgSEFMX1VBUlRfQWJvcnRDcGx0Q2FsbGJhY2soKSBhdCBlbmQgb2YgRE1BIGFib3J0DQotICAgICAgICAgcHJvY2VkdXJlICovDQotICAgICAgaHVhcnQtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBVQVJUX0RNQVR4T25seUFib3J0Q2FsbGJhY2s7DQotDQotICAgICAgLyogQWJvcnQgRE1BIFRYICovDQotICAgICAgaWYgKEhBTF9ETUFfQWJvcnRfSVQoaHVhcnQtPmhkbWF0eCkgIT0gSEFMX09LKSB7DQotICAgICAgICAvKiBDYWxsIERpcmVjdGx5IGh1YXJ0LT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrIGZ1bmN0aW9uIGluIGNhc2Ugb2YNCi0gICAgICAgICAqIGVycm9yICovDQotICAgICAgICBodWFydC0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayhodWFydC0+aGRtYXR4KTsNCi0gICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgLyogUmVzZXQgVHggdHJhbnNmZXIgY291bnRlciAqLw0KLSAgICAgIGh1YXJ0LT5UeFhmZXJDb3VudCA9IDBVOw0KLQ0KLSAgICAgIC8qIENsZWFyIFR4SVNSIGZ1bmN0aW9uIHBvaW50ZXJzICovDQotICAgICAgaHVhcnQtPlR4SVNSID0gTlVMTDsNCi0NCi0gICAgICAvKiBSZXN0b3JlIGh1YXJ0LT5nU3RhdGUgdG8gUmVhZHkgKi8NCi0gICAgICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7DQotDQotICAgICAgLyogQXMgbm8gRE1BIHRvIGJlIGFib3J0ZWQsIGNhbGwgZGlyZWN0bHkgdXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLw0KLSNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQ0KLSAgICAgIC8qIENhbGwgcmVnaXN0ZXJlZCBBYm9ydCBUcmFuc21pdCBDb21wbGV0ZSBDYWxsYmFjayAqLw0KLSAgICAgIGh1YXJ0LT5BYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrKGh1YXJ0KTsNCi0jZWxzZQ0KLSAgICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgQWJvcnQgVHJhbnNtaXQgQ29tcGxldGUgQ2FsbGJhY2sgKi8NCi0gICAgICBIQUxfVUFSVF9BYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrKGh1YXJ0KTsNCi0jZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLSAgICB9DQotICB9IGVsc2Ugew0KLSAgICAvKiBSZXNldCBUeCB0cmFuc2ZlciBjb3VudGVyICovDQotICAgIGh1YXJ0LT5UeFhmZXJDb3VudCA9IDBVOw0KLQ0KLSAgICAvKiBDbGVhciBUeElTUiBmdW5jdGlvbiBwb2ludGVycyAqLw0KLSAgICBodWFydC0+VHhJU1IgPSBOVUxMOw0KLQ0KLSAgICAvKiBGbHVzaCB0aGUgd2hvbGUgVFggRklGTyAoaWYgbmVlZGVkKSAqLw0KLSAgICBpZiAoaHVhcnQtPkZpZm9Nb2RlID09IFVBUlRfRklGT01PREVfRU5BQkxFKSB7DQotICAgICAgX19IQUxfVUFSVF9TRU5EX1JFUShodWFydCwgVUFSVF9UWERBVEFfRkxVU0hfUkVRVUVTVCk7DQotICAgIH0NCi0NCi0gICAgLyogUmVzdG9yZSBodWFydC0+Z1N0YXRlIHRvIFJlYWR5ICovDQotICAgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsNCi0NCi0gICAgLyogQXMgbm8gRE1BIHRvIGJlIGFib3J0ZWQsIGNhbGwgZGlyZWN0bHkgdXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLw0KLSNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQ0KLSAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgQWJvcnQgVHJhbnNtaXQgQ29tcGxldGUgQ2FsbGJhY2sgKi8NCi0gICAgaHVhcnQtPkFib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2soaHVhcnQpOw0KLSNlbHNlDQotICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgQWJvcnQgVHJhbnNtaXQgQ29tcGxldGUgQ2FsbGJhY2sgKi8NCi0gICAgSEFMX1VBUlRfQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayhodWFydCk7DQotI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi0gIH0NCi0NCi0gIHJldHVybiBIQUxfT0s7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgQWJvcnQgb25nb2luZyBSZWNlaXZlIHRyYW5zZmVyIChJbnRlcnJ1cHQgbW9kZSkuDQotICogQHBhcmFtICBodWFydCBVQVJUIGhhbmRsZS4NCi0gKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGNvdWxkIGJlIHVzZWQgZm9yIGFib3J0aW5nIGFueSBvbmdvaW5nIFJ4IHRyYW5zZmVyDQotICogc3RhcnRlZCBpbiBJbnRlcnJ1cHQgb3IgRE1BIG1vZGUuIFRoaXMgcHJvY2VkdXJlIHBlcmZvcm1zIGZvbGxvd2luZw0KLSAqIG9wZXJhdGlvbnMgOg0KLSAqICAgICAgICAgICAtIERpc2FibGUgVUFSVCBJbnRlcnJ1cHRzIChSeCkNCi0gKiAgICAgICAgICAgLSBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgaW4gdGhlIHBlcmlwaGVyYWwgcmVnaXN0ZXIgKGlmIGVuYWJsZWQpDQotICogICAgICAgICAgIC0gQWJvcnQgRE1BIHRyYW5zZmVyIGJ5IGNhbGxpbmcgSEFMX0RNQV9BYm9ydF9JVCAoaW4gY2FzZSBvZg0KLSAqIHRyYW5zZmVyIGluIERNQSBtb2RlKQ0KLSAqICAgICAgICAgICAtIFNldCBoYW5kbGUgU3RhdGUgdG8gUkVBRFkNCi0gKiAgICAgICAgICAgLSBBdCBhYm9ydCBjb21wbGV0aW9uLCBjYWxsIHVzZXIgYWJvcnQgY29tcGxldGUgY2FsbGJhY2sNCi0gKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGlzIGV4ZWN1dGVkIGluIEludGVycnVwdCBtb2RlLCBtZWFuaW5nIHRoYXQgYWJvcnQNCi0gKiBwcm9jZWR1cmUgY291bGQgYmUgY29uc2lkZXJlZCBhcyBjb21wbGV0ZWQgb25seSB3aGVuIHVzZXIgYWJvcnQgY29tcGxldGUNCi0gKiBjYWxsYmFjayBpcyBleGVjdXRlZCAobm90IHdoZW4gZXhpdGluZyBmdW5jdGlvbikuDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfQWJvcnRSZWNlaXZlX0lUKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpIHsNCi0gIC8qIERpc2FibGUgUlhORSwgUEUgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKQ0KLSAgICogaW50ZXJydXB0cyAqLw0KLSAgQVRPTUlDX0NMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwNCi0gICAgICAgICAgICAgICAgICAgKFVTQVJUX0NSMV9QRUlFIHwgVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFKSk7DQotICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCAoVVNBUlRfQ1IzX0VJRSB8IFVTQVJUX0NSM19SWEZUSUUpKTsNCi0NCi0gIC8qIElmIFJlY2VwdGlvbiB0aWxsIElETEUgZXZlbnQgd2FzIG9uZ29pbmcsIGRpc2FibGUgSURMRUlFIGludGVycnVwdCAqLw0KLSAgaWYgKGh1YXJ0LT5SZWNlcHRpb25UeXBlID09IEhBTF9VQVJUX1JFQ0VQVElPTl9UT0lETEUpIHsNCi0gICAgQVRPTUlDX0NMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9JRExFSUUpKTsNCi0gIH0NCi0NCi0gIC8qIEFib3J0IHRoZSBVQVJUIERNQSBSeCBjaGFubmVsIGlmIGVuYWJsZWQgKi8NCi0gIGlmIChIQUxfSVNfQklUX1NFVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpKSB7DQotICAgIC8qIERpc2FibGUgdGhlIFVBUlQgRE1BIFJ4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLw0KLSAgICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7DQotDQotICAgIC8qIEFib3J0IHRoZSBVQVJUIERNQSBSeCBjaGFubmVsIDogdXNlIG5vbiBibG9ja2luZyBETUEgQWJvcnQgQVBJIChjYWxsYmFjaykNCi0gICAgICovDQotICAgIGlmIChodWFydC0+aGRtYXJ4ICE9IE5VTEwpIHsNCi0gICAgICAvKiBTZXQgdGhlIFVBUlQgRE1BIEFib3J0IGNhbGxiYWNrIDoNCi0gICAgICAgICB3aWxsIGxlYWQgdG8gY2FsbCBIQUxfVUFSVF9BYm9ydENwbHRDYWxsYmFjaygpIGF0IGVuZCBvZiBETUEgYWJvcnQNCi0gICAgICAgICBwcm9jZWR1cmUgKi8NCi0gICAgICBodWFydC0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IFVBUlRfRE1BUnhPbmx5QWJvcnRDYWxsYmFjazsNCi0NCi0gICAgICAvKiBBYm9ydCBETUEgUlggKi8NCi0gICAgICBpZiAoSEFMX0RNQV9BYm9ydF9JVChodWFydC0+aGRtYXJ4KSAhPSBIQUxfT0spIHsNCi0gICAgICAgIC8qIENhbGwgRGlyZWN0bHkgaHVhcnQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgZnVuY3Rpb24gaW4gY2FzZSBvZg0KLSAgICAgICAgICogZXJyb3IgKi8NCi0gICAgICAgIGh1YXJ0LT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrKGh1YXJ0LT5oZG1hcngpOw0KLSAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICAvKiBSZXNldCBSeCB0cmFuc2ZlciBjb3VudGVyICovDQotICAgICAgaHVhcnQtPlJ4WGZlckNvdW50ID0gMFU7DQotDQotICAgICAgLyogQ2xlYXIgUnhJU1IgZnVuY3Rpb24gcG9pbnRlciAqLw0KLSAgICAgIGh1YXJ0LT5wUnhCdWZmUHRyID0gTlVMTDsNCi0NCi0gICAgICAvKiBDbGVhciB0aGUgRXJyb3IgZmxhZ3MgaW4gdGhlIElDUiByZWdpc3RlciAqLw0KLSAgICAgIF9fSEFMX1VBUlRfQ0xFQVJfRkxBRyhodWFydCwgVUFSVF9DTEVBUl9PUkVGIHwgVUFSVF9DTEVBUl9ORUYgfA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVBUlRfQ0xFQVJfUEVGIHwgVUFSVF9DTEVBUl9GRUYpOw0KLQ0KLSAgICAgIC8qIERpc2NhcmQgdGhlIHJlY2VpdmVkIGRhdGEgKi8NCi0gICAgICBfX0hBTF9VQVJUX1NFTkRfUkVRKGh1YXJ0LCBVQVJUX1JYREFUQV9GTFVTSF9SRVFVRVNUKTsNCi0NCi0gICAgICAvKiBSZXN0b3JlIGh1YXJ0LT5SeFN0YXRlIHRvIFJlYWR5ICovDQotICAgICAgaHVhcnQtPlJ4U3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsNCi0gICAgICBodWFydC0+UmVjZXB0aW9uVHlwZSA9IEhBTF9VQVJUX1JFQ0VQVElPTl9TVEFOREFSRDsNCi0NCi0gICAgICAvKiBBcyBubyBETUEgdG8gYmUgYWJvcnRlZCwgY2FsbCBkaXJlY3RseSB1c2VyIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovDQotI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpDQotICAgICAgLyogQ2FsbCByZWdpc3RlcmVkIEFib3J0IFJlY2VpdmUgQ29tcGxldGUgQ2FsbGJhY2sgKi8NCi0gICAgICBodWFydC0+QWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrKGh1YXJ0KTsNCi0jZWxzZQ0KLSAgICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgQWJvcnQgUmVjZWl2ZSBDb21wbGV0ZSBDYWxsYmFjayAqLw0KLSAgICAgIEhBTF9VQVJUX0Fib3J0UmVjZWl2ZUNwbHRDYWxsYmFjayhodWFydCk7DQotI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi0gICAgfQ0KLSAgfSBlbHNlIHsNCi0gICAgLyogUmVzZXQgUnggdHJhbnNmZXIgY291bnRlciAqLw0KLSAgICBodWFydC0+UnhYZmVyQ291bnQgPSAwVTsNCi0NCi0gICAgLyogQ2xlYXIgUnhJU1IgZnVuY3Rpb24gcG9pbnRlciAqLw0KLSAgICBodWFydC0+cFJ4QnVmZlB0ciA9IE5VTEw7DQotDQotICAgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovDQotICAgIF9fSEFMX1VBUlRfQ0xFQVJfRkxBRyhodWFydCwgVUFSVF9DTEVBUl9PUkVGIHwgVUFSVF9DTEVBUl9ORUYgfA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQVJUX0NMRUFSX1BFRiB8IFVBUlRfQ0xFQVJfRkVGKTsNCi0NCi0gICAgLyogUmVzdG9yZSBodWFydC0+UnhTdGF0ZSB0byBSZWFkeSAqLw0KLSAgICBodWFydC0+UnhTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOw0KLSAgICBodWFydC0+UmVjZXB0aW9uVHlwZSA9IEhBTF9VQVJUX1JFQ0VQVElPTl9TVEFOREFSRDsNCi0NCi0gICAgLyogQXMgbm8gRE1BIHRvIGJlIGFib3J0ZWQsIGNhbGwgZGlyZWN0bHkgdXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLw0KLSNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQ0KLSAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgQWJvcnQgUmVjZWl2ZSBDb21wbGV0ZSBDYWxsYmFjayAqLw0KLSAgICBodWFydC0+QWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrKGh1YXJ0KTsNCi0jZWxzZQ0KLSAgICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIEFib3J0IFJlY2VpdmUgQ29tcGxldGUgQ2FsbGJhY2sgKi8NCi0gICAgSEFMX1VBUlRfQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrKGh1YXJ0KTsNCi0jZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLSAgfQ0KLQ0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmIEhhbmRsZSBVQVJUIGludGVycnVwdCByZXF1ZXN0Lg0KLSAqIEBwYXJhbSBodWFydCBVQVJUIGhhbmRsZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi12b2lkIEhBTF9VQVJUX0lSUUhhbmRsZXIoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkgew0KLSAgdWludDMyX3QgaXNyZmxhZ3MgPSBSRUFEX1JFRyhodWFydC0+SW5zdGFuY2UtPklTUik7DQotICB1aW50MzJfdCBjcjFpdHMgPSBSRUFEX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMSk7DQotICB1aW50MzJfdCBjcjNpdHMgPSBSRUFEX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMyk7DQotDQotICB1aW50MzJfdCBlcnJvcmZsYWdzOw0KLSAgdWludDMyX3QgZXJyb3Jjb2RlOw0KLQ0KLSAgLyogSWYgbm8gZXJyb3Igb2NjdXJzICovDQotICBlcnJvcmZsYWdzID0NCi0gICAgICAoaXNyZmxhZ3MgJiAodWludDMyX3QpKFVTQVJUX0lTUl9QRSB8IFVTQVJUX0lTUl9GRSB8IFVTQVJUX0lTUl9PUkUgfA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX05FIHwgVVNBUlRfSVNSX1JUT0YpKTsNCi0gIGlmIChlcnJvcmZsYWdzID09IDBVKSB7DQotICAgIC8qIFVBUlQgaW4gbW9kZSBSZWNlaXZlcg0KLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSAgICBpZiAoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9SWE5FX1JYRk5FKSAhPSAwVSkgJiYNCi0gICAgICAgICgoKGNyMWl0cyAmIFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSkgIT0gMFUpIHx8DQotICAgICAgICAgKChjcjNpdHMgJiBVU0FSVF9DUjNfUlhGVElFKSAhPSAwVSkpKSB7DQotICAgICAgaWYgKGh1YXJ0LT5SeElTUiAhPSBOVUxMKSB7DQotICAgICAgICBodWFydC0+UnhJU1IoaHVhcnQpOw0KLSAgICAgIH0NCi0gICAgICByZXR1cm47DQotICAgIH0NCi0gIH0NCi0NCi0gIC8qIElmIHNvbWUgZXJyb3JzIG9jY3VyICovDQotICBpZiAoKGVycm9yZmxhZ3MgIT0gMFUpICYmDQotICAgICAgKCgoKGNyM2l0cyAmIChVU0FSVF9DUjNfUlhGVElFIHwgVVNBUlRfQ1IzX0VJRSkpICE9IDBVKSB8fA0KLSAgICAgICAgKChjcjFpdHMgJiAoVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFIHwgVVNBUlRfQ1IxX1BFSUUgfA0KLSAgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX1JUT0lFKSkgIT0gMFUpKSkpIHsNCi0gICAgLyogVUFSVCBwYXJpdHkgZXJyb3IgaW50ZXJydXB0IG9jY3VycmVkDQotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSAgICBpZiAoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9QRSkgIT0gMFUpICYmDQotICAgICAgICAoKGNyMWl0cyAmIFVTQVJUX0NSMV9QRUlFKSAhPSAwVSkpIHsNCi0gICAgICBfX0hBTF9VQVJUX0NMRUFSX0ZMQUcoaHVhcnQsIFVBUlRfQ0xFQVJfUEVGKTsNCi0NCi0gICAgICBodWFydC0+RXJyb3JDb2RlIHw9IEhBTF9VQVJUX0VSUk9SX1BFOw0KLSAgICB9DQotDQotICAgIC8qIFVBUlQgZnJhbWUgZXJyb3IgaW50ZXJydXB0IG9jY3VycmVkDQotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0gICAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfRkUpICE9IDBVKSAmJiAoKGNyM2l0cyAmIFVTQVJUX0NSM19FSUUpICE9IDBVKSkgew0KLSAgICAgIF9fSEFMX1VBUlRfQ0xFQVJfRkxBRyhodWFydCwgVUFSVF9DTEVBUl9GRUYpOw0KLQ0KLSAgICAgIGh1YXJ0LT5FcnJvckNvZGUgfD0gSEFMX1VBUlRfRVJST1JfRkU7DQotICAgIH0NCi0NCi0gICAgLyogVUFSVCBub2lzZSBlcnJvciBpbnRlcnJ1cHQgb2NjdXJyZWQNCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSAgICBpZiAoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9ORSkgIT0gMFUpICYmICgoY3IzaXRzICYgVVNBUlRfQ1IzX0VJRSkgIT0gMFUpKSB7DQotICAgICAgX19IQUxfVUFSVF9DTEVBUl9GTEFHKGh1YXJ0LCBVQVJUX0NMRUFSX05FRik7DQotDQotICAgICAgaHVhcnQtPkVycm9yQ29kZSB8PSBIQUxfVUFSVF9FUlJPUl9ORTsNCi0gICAgfQ0KLQ0KLSAgICAvKiBVQVJUIE92ZXItUnVuIGludGVycnVwdCBvY2N1cnJlZA0KLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotICAgIGlmICgoKGlzcmZsYWdzICYgVVNBUlRfSVNSX09SRSkgIT0gMFUpICYmDQotICAgICAgICAoKChjcjFpdHMgJiBVU0FSVF9DUjFfUlhORUlFX1JYRk5FSUUpICE9IDBVKSB8fA0KLSAgICAgICAgICgoY3IzaXRzICYgKFVTQVJUX0NSM19SWEZUSUUgfCBVU0FSVF9DUjNfRUlFKSkgIT0gMFUpKSkgew0KLSAgICAgIF9fSEFMX1VBUlRfQ0xFQVJfRkxBRyhodWFydCwgVUFSVF9DTEVBUl9PUkVGKTsNCi0NCi0gICAgICBodWFydC0+RXJyb3JDb2RlIHw9IEhBTF9VQVJUX0VSUk9SX09SRTsNCi0gICAgfQ0KLQ0KLSAgICAvKiBVQVJUIFJlY2VpdmVyIFRpbWVvdXQgaW50ZXJydXB0IG9jY3VycmVkDQotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotICAgIGlmICgoKGlzcmZsYWdzICYgVVNBUlRfSVNSX1JUT0YpICE9IDBVKSAmJg0KLSAgICAgICAgKChjcjFpdHMgJiBVU0FSVF9DUjFfUlRPSUUpICE9IDBVKSkgew0KLSAgICAgIF9fSEFMX1VBUlRfQ0xFQVJfRkxBRyhodWFydCwgVUFSVF9DTEVBUl9SVE9GKTsNCi0NCi0gICAgICBodWFydC0+RXJyb3JDb2RlIHw9IEhBTF9VQVJUX0VSUk9SX1JUTzsNCi0gICAgfQ0KLQ0KLSAgICAvKiBDYWxsIFVBUlQgRXJyb3IgQ2FsbCBiYWNrIGZ1bmN0aW9uIGlmIG5lZWQgYmUNCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotICAgIGlmIChodWFydC0+RXJyb3JDb2RlICE9IEhBTF9VQVJUX0VSUk9SX05PTkUpIHsNCi0gICAgICAvKiBVQVJUIGluIG1vZGUgUmVjZWl2ZXINCi0gICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotICAgICAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfUlhORV9SWEZORSkgIT0gMFUpICYmDQotICAgICAgICAgICgoKGNyMWl0cyAmIFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSkgIT0gMFUpIHx8DQotICAgICAgICAgICAoKGNyM2l0cyAmIFVTQVJUX0NSM19SWEZUSUUpICE9IDBVKSkpIHsNCi0gICAgICAgIGlmIChodWFydC0+UnhJU1IgIT0gTlVMTCkgew0KLSAgICAgICAgICBodWFydC0+UnhJU1IoaHVhcnQpOw0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0NCi0gICAgICAvKiBJZiBFcnJvciBpcyB0byBiZSBjb25zaWRlcmVkIGFzIGJsb2NraW5nIDoNCi0gICAgICAgICAgLSBSZWNlaXZlciBUaW1lb3V0IGVycm9yIGluIFJlY2VwdGlvbg0KLSAgICAgICAgICAtIE92ZXJydW4gZXJyb3IgaW4gUmVjZXB0aW9uDQotICAgICAgICAgIC0gYW55IGVycm9yIG9jY3VycyBpbiBETUEgbW9kZSByZWNlcHRpb24NCi0gICAgICAqLw0KLSAgICAgIGVycm9yY29kZSA9IGh1YXJ0LT5FcnJvckNvZGU7DQotICAgICAgaWYgKChIQUxfSVNfQklUX1NFVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpKSB8fA0KLSAgICAgICAgICAoKGVycm9yY29kZSAmIChIQUxfVUFSVF9FUlJPUl9SVE8gfCBIQUxfVUFSVF9FUlJPUl9PUkUpKSAhPSAwVSkpIHsNCi0gICAgICAgIC8qIEJsb2NraW5nIGVycm9yIDogdHJhbnNmZXIgaXMgYWJvcnRlZA0KLSAgICAgICAgICAgU2V0IHRoZSBVQVJUIHN0YXRlIHJlYWR5IHRvIGJlIGFibGUgdG8gc3RhcnQgYWdhaW4gdGhlIHByb2Nlc3MsDQotICAgICAgICAgICBEaXNhYmxlIFJ4IEludGVycnVwdHMsIGFuZCBkaXNhYmxlIFJ4IERNQSByZXF1ZXN0LCBpZiBvbmdvaW5nICovDQotICAgICAgICBVQVJUX0VuZFJ4VHJhbnNmZXIoaHVhcnQpOw0KLQ0KLSAgICAgICAgLyogQWJvcnQgdGhlIFVBUlQgRE1BIFJ4IGNoYW5uZWwgaWYgZW5hYmxlZCAqLw0KLSAgICAgICAgaWYgKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpIHsNCi0gICAgICAgICAgLyogRGlzYWJsZSB0aGUgVUFSVCBETUEgUnggcmVxdWVzdCBpZiBlbmFibGVkICovDQotICAgICAgICAgIEFUT01JQ19DTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsNCi0NCi0gICAgICAgICAgLyogQWJvcnQgdGhlIFVBUlQgRE1BIFJ4IGNoYW5uZWwgKi8NCi0gICAgICAgICAgaWYgKGh1YXJ0LT5oZG1hcnggIT0gTlVMTCkgew0KLSAgICAgICAgICAgIC8qIFNldCB0aGUgVUFSVCBETUEgQWJvcnQgY2FsbGJhY2sgOg0KLSAgICAgICAgICAgICAgIHdpbGwgbGVhZCB0byBjYWxsIEhBTF9VQVJUX0Vycm9yQ2FsbGJhY2soKSBhdCBlbmQgb2YgRE1BIGFib3J0DQotICAgICAgICAgICAgICAgcHJvY2VkdXJlICovDQotICAgICAgICAgICAgaHVhcnQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBVQVJUX0RNQUFib3J0T25FcnJvcjsNCi0NCi0gICAgICAgICAgICAvKiBBYm9ydCBETUEgUlggKi8NCi0gICAgICAgICAgICBpZiAoSEFMX0RNQV9BYm9ydF9JVChodWFydC0+aGRtYXJ4KSAhPSBIQUxfT0spIHsNCi0gICAgICAgICAgICAgIC8qIENhbGwgRGlyZWN0bHkgaHVhcnQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgZnVuY3Rpb24gaW4gY2FzZQ0KLSAgICAgICAgICAgICAgICogb2YgZXJyb3IgKi8NCi0gICAgICAgICAgICAgIGh1YXJ0LT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrKGh1YXJ0LT5oZG1hcngpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAvKiBDYWxsIHVzZXIgZXJyb3IgY2FsbGJhY2sgKi8NCi0jaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkNCi0gICAgICAgICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBlcnJvciBjYWxsYmFjayovDQotICAgICAgICAgICAgaHVhcnQtPkVycm9yQ2FsbGJhY2soaHVhcnQpOw0KLSNlbHNlDQotICAgICAgICAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIGVycm9yIGNhbGxiYWNrKi8NCi0gICAgICAgICAgICBIQUxfVUFSVF9FcnJvckNhbGxiYWNrKGh1YXJ0KTsNCi0jZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLSAgICAgICAgICB9DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAvKiBDYWxsIHVzZXIgZXJyb3IgY2FsbGJhY2sgKi8NCi0jaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkNCi0gICAgICAgICAgLypDYWxsIHJlZ2lzdGVyZWQgZXJyb3IgY2FsbGJhY2sqLw0KLSAgICAgICAgICBodWFydC0+RXJyb3JDYWxsYmFjayhodWFydCk7DQotI2Vsc2UNCi0gICAgICAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIGVycm9yIGNhbGxiYWNrKi8NCi0gICAgICAgICAgSEFMX1VBUlRfRXJyb3JDYWxsYmFjayhodWFydCk7DQotI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi0gICAgICAgIH0NCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgLyogTm9uIEJsb2NraW5nIGVycm9yIDogdHJhbnNmZXIgY291bGQgZ28gb24uDQotICAgICAgICAgICBFcnJvciBpcyBub3RpZmllZCB0byB1c2VyIHRocm91Z2ggdXNlciBlcnJvciBjYWxsYmFjayAqLw0KLSNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQ0KLSAgICAgICAgLypDYWxsIHJlZ2lzdGVyZWQgZXJyb3IgY2FsbGJhY2sqLw0KLSAgICAgICAgaHVhcnQtPkVycm9yQ2FsbGJhY2soaHVhcnQpOw0KLSNlbHNlDQotICAgICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgZXJyb3IgY2FsbGJhY2sqLw0KLSAgICAgICAgSEFMX1VBUlRfRXJyb3JDYWxsYmFjayhodWFydCk7DQotI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi0gICAgICAgIGh1YXJ0LT5FcnJvckNvZGUgPSBIQUxfVUFSVF9FUlJPUl9OT05FOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm47DQotDQotICB9IC8qIEVuZCBpZiBzb21lIGVycm9yIG9jY3VycyAqLw0KLQ0KLSAgLyogQ2hlY2sgY3VycmVudCByZWNlcHRpb24gTW9kZSA6DQotICAgICBJZiBSZWNlcHRpb24gdGlsbCBJRExFIGV2ZW50IGhhcyBiZWVuIHNlbGVjdGVkIDogKi8NCi0gIGlmICgoaHVhcnQtPlJlY2VwdGlvblR5cGUgPT0gSEFMX1VBUlRfUkVDRVBUSU9OX1RPSURMRSkgJiYNCi0gICAgICAoKGlzcmZsYWdzICYgVVNBUlRfSVNSX0lETEUpICE9IDBVKSAmJg0KLSAgICAgICgoY3IxaXRzICYgVVNBUlRfSVNSX0lETEUpICE9IDBVKSkgew0KLSAgICBfX0hBTF9VQVJUX0NMRUFSX0ZMQUcoaHVhcnQsIFVBUlRfQ0xFQVJfSURMRUYpOw0KLQ0KLSAgICAvKiBDaGVjayBpZiBETUEgbW9kZSBpcyBlbmFibGVkIGluIFVBUlQgKi8NCi0gICAgaWYgKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpIHsNCi0gICAgICAvKiBETUEgbW9kZSBlbmFibGVkICovDQotICAgICAgLyogQ2hlY2sgcmVjZWl2ZWQgbGVuZ3RoIDogSWYgYWxsIGV4cGVjdGVkIGRhdGEgYXJlIHJlY2VpdmVkLCBkbyBub3RoaW5nLA0KLSAgICAgICAgIChETUEgY3BsdCBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCkuDQotICAgICAgICAgT3RoZXJ3aXNlLCBpZiBhdCBsZWFzdCBvbmUgZGF0YSBoYXMgYWxyZWFkeSBiZWVuIHJlY2VpdmVkLCBJRExFIGV2ZW50DQotICAgICAgICAgaXMgdG8gYmUgbm90aWZpZWQgdG8gdXNlciAqLw0KLSAgICAgIHVpbnQxNl90IG5iX3JlbWFpbmluZ19yeF9kYXRhID0NCi0gICAgICAgICAgKHVpbnQxNl90KV9fSEFMX0RNQV9HRVRfQ09VTlRFUihodWFydC0+aGRtYXJ4KTsNCi0gICAgICBpZiAoKG5iX3JlbWFpbmluZ19yeF9kYXRhID4gMFUpICYmDQotICAgICAgICAgIChuYl9yZW1haW5pbmdfcnhfZGF0YSA8IGh1YXJ0LT5SeFhmZXJTaXplKSkgew0KLSAgICAgICAgLyogUmVjZXB0aW9uIGlzIG5vdCBjb21wbGV0ZSAqLw0KLSAgICAgICAgaHVhcnQtPlJ4WGZlckNvdW50ID0gbmJfcmVtYWluaW5nX3J4X2RhdGE7DQotDQotICAgICAgICAvKiBJbiBOb3JtYWwgbW9kZSwgZW5kIERNQSB4ZmVyIGFuZCBIQUwgVUFSVCBSeCBwcm9jZXNzKi8NCi0gICAgICAgIGlmIChIQUxfSVNfQklUX0NMUihodWFydC0+aGRtYXJ4LT5JbnN0YW5jZS0+Q0NSLCBETUFfQ0NSX0NJUkMpKSB7DQotICAgICAgICAgIC8qIERpc2FibGUgUEUgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKQ0KLSAgICAgICAgICAgKiBpbnRlcnJ1cHRzICovDQotICAgICAgICAgIEFUT01JQ19DTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9QRUlFKTsNCi0gICAgICAgICAgQVRPTUlDX0NMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7DQotDQotICAgICAgICAgIC8qIERpc2FibGUgdGhlIERNQSB0cmFuc2ZlciBmb3IgdGhlIHJlY2VpdmVyIHJlcXVlc3QgYnkgcmVzZXR0aW5nIHRoZQ0KLSAgICAgICAgICAgICBETUFSIGJpdCBpbiB0aGUgVUFSVCBDUjMgcmVnaXN0ZXIgKi8NCi0gICAgICAgICAgQVRPTUlDX0NMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOw0KLQ0KLSAgICAgICAgICAvKiBBdCBlbmQgb2YgUnggcHJvY2VzcywgcmVzdG9yZSBodWFydC0+UnhTdGF0ZSB0byBSZWFkeSAqLw0KLSAgICAgICAgICBodWFydC0+UnhTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOw0KLSAgICAgICAgICBodWFydC0+UmVjZXB0aW9uVHlwZSA9IEhBTF9VQVJUX1JFQ0VQVElPTl9TVEFOREFSRDsNCi0NCi0gICAgICAgICAgQVRPTUlDX0NMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX0lETEVJRSk7DQotDQotICAgICAgICAgIC8qIExhc3QgYnl0ZXMgcmVjZWl2ZWQsIHNvIG5vIG5lZWQgYXMgdGhlIGFib3J0IGlzIGltbWVkaWF0ZSAqLw0KLSAgICAgICAgICAodm9pZClIQUxfRE1BX0Fib3J0KGh1YXJ0LT5oZG1hcngpOw0KLSAgICAgICAgfQ0KLSNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQ0KLSAgICAgICAgLypDYWxsIHJlZ2lzdGVyZWQgUnggRXZlbnQgY2FsbGJhY2sqLw0KLSAgICAgICAgaHVhcnQtPlJ4RXZlbnRDYWxsYmFjayhodWFydCwgKGh1YXJ0LT5SeFhmZXJTaXplIC0gaHVhcnQtPlJ4WGZlckNvdW50KSk7DQotI2Vsc2UNCi0gICAgICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBSeCBFdmVudCBjYWxsYmFjayovDQotICAgICAgICBIQUxfVUFSVEV4X1J4RXZlbnRDYWxsYmFjayhodWFydCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChodWFydC0+UnhYZmVyU2l6ZSAtIGh1YXJ0LT5SeFhmZXJDb3VudCkpOw0KLSNlbmRpZiAvKiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUykgKi8NCi0gICAgICB9DQotICAgICAgcmV0dXJuOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgIC8qIERNQSBtb2RlIG5vdCBlbmFibGVkICovDQotICAgICAgLyogQ2hlY2sgcmVjZWl2ZWQgbGVuZ3RoIDogSWYgYWxsIGV4cGVjdGVkIGRhdGEgYXJlIHJlY2VpdmVkLCBkbyBub3RoaW5nLg0KLSAgICAgICAgIE90aGVyd2lzZSwgaWYgYXQgbGVhc3Qgb25lIGRhdGEgaGFzIGFscmVhZHkgYmVlbiByZWNlaXZlZCwgSURMRSBldmVudA0KLSAgICAgICAgIGlzIHRvIGJlIG5vdGlmaWVkIHRvIHVzZXIgKi8NCi0gICAgICB1aW50MTZfdCBuYl9yeF9kYXRhID0gaHVhcnQtPlJ4WGZlclNpemUgLSBodWFydC0+UnhYZmVyQ291bnQ7DQotICAgICAgaWYgKChodWFydC0+UnhYZmVyQ291bnQgPiAwVSkgJiYgKG5iX3J4X2RhdGEgPiAwVSkpIHsNCi0gICAgICAgIC8qIERpc2FibGUgdGhlIFVBUlQgUGFyaXR5IEVycm9yIEludGVycnVwdCBhbmQgUlhORSBpbnRlcnJ1cHRzICovDQotICAgICAgICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAoVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFIHwgVVNBUlRfQ1IxX1BFSUUpKTsNCi0NCi0gICAgICAgIC8qIERpc2FibGUgdGhlIFVBUlQgRXJyb3IgSW50ZXJydXB0OihGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4NCi0gICAgICAgICAqIGVycm9yKSBhbmQgUlggRklGTyBUaHJlc2hvbGQgaW50ZXJydXB0ICovDQotICAgICAgICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAoVVNBUlRfQ1IzX0VJRSB8IFVTQVJUX0NSM19SWEZUSUUpKTsNCi0NCi0gICAgICAgIC8qIFJ4IHByb2Nlc3MgaXMgY29tcGxldGVkLCByZXN0b3JlIGh1YXJ0LT5SeFN0YXRlIHRvIFJlYWR5ICovDQotICAgICAgICBodWFydC0+UnhTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOw0KLSAgICAgICAgaHVhcnQtPlJlY2VwdGlvblR5cGUgPSBIQUxfVUFSVF9SRUNFUFRJT05fU1RBTkRBUkQ7DQotDQotICAgICAgICAvKiBDbGVhciBSeElTUiBmdW5jdGlvbiBwb2ludGVyICovDQotICAgICAgICBodWFydC0+UnhJU1IgPSBOVUxMOw0KLQ0KLSAgICAgICAgQVRPTUlDX0NMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX0lETEVJRSk7DQotI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpDQotICAgICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBSeCBjb21wbGV0ZSBjYWxsYmFjayovDQotICAgICAgICBodWFydC0+UnhFdmVudENhbGxiYWNrKGh1YXJ0LCBuYl9yeF9kYXRhKTsNCi0jZWxzZQ0KLSAgICAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIFJ4IEV2ZW50IGNhbGxiYWNrKi8NCi0gICAgICAgIEhBTF9VQVJURXhfUnhFdmVudENhbGxiYWNrKGh1YXJ0LCBuYl9yeF9kYXRhKTsNCi0jZW5kaWYgLyogKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MpICovDQotICAgICAgfQ0KLSAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgLyogVUFSVCB3YWtldXAgZnJvbSBTdG9wIG1vZGUgaW50ZXJydXB0IG9jY3VycmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotICBpZiAoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9XVUYpICE9IDBVKSAmJg0KLSAgICAgICgoY3IzaXRzICYgVVNBUlRfQ1IzX1dVRklFKSAhPSAwVSkpIHsNCi0gICAgX19IQUxfVUFSVF9DTEVBUl9GTEFHKGh1YXJ0LCBVQVJUX0NMRUFSX1dVRik7DQotDQotICAgIC8qIFVBUlQgUnggc3RhdGUgaXMgbm90IHJlc2V0IGFzIGEgcmVjZXB0aW9uIHByb2Nlc3MgbWlnaHQgYmUgb25nb2luZy4NCi0gICAgICAgSWYgVUFSVCBoYW5kbGUgc3RhdGUgZmllbGRzIG5lZWQgdG8gYmUgcmVzZXQgdG8gUkVBRFksIHRoaXMgY291bGQgYmUgZG9uZQ0KLSAgICAgICBpbiBXYWtldXAgY2FsbGJhY2sgKi8NCi0NCi0jaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkNCi0gICAgLyogQ2FsbCByZWdpc3RlcmVkIFdha2V1cCBDYWxsYmFjayAqLw0KLSAgICBodWFydC0+V2FrZXVwQ2FsbGJhY2soaHVhcnQpOw0KLSNlbHNlDQotICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgV2FrZXVwIENhbGxiYWNrICovDQotICAgIEhBTF9VQVJURXhfV2FrZXVwQ2FsbGJhY2soaHVhcnQpOw0KLSNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotICAgIHJldHVybjsNCi0gIH0NCi0NCi0gIC8qIFVBUlQgaW4gbW9kZSBUcmFuc21pdHRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfVFhFX1RYRk5GKSAhPSAwVSkgJiYNCi0gICAgICAoKChjcjFpdHMgJiBVU0FSVF9DUjFfVFhFSUVfVFhGTkZJRSkgIT0gMFUpIHx8DQotICAgICAgICgoY3IzaXRzICYgVVNBUlRfQ1IzX1RYRlRJRSkgIT0gMFUpKSkgew0KLSAgICBpZiAoaHVhcnQtPlR4SVNSICE9IE5VTEwpIHsNCi0gICAgICBodWFydC0+VHhJU1IoaHVhcnQpOw0KLSAgICB9DQotICAgIHJldHVybjsNCi0gIH0NCi0NCi0gIC8qIFVBUlQgaW4gbW9kZSBUcmFuc21pdHRlciAodHJhbnNtaXNzaW9uIGVuZCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfVEMpICE9IDBVKSAmJiAoKGNyMWl0cyAmIFVTQVJUX0NSMV9UQ0lFKSAhPSAwVSkpIHsNCi0gICAgVUFSVF9FbmRUcmFuc21pdF9JVChodWFydCk7DQotICAgIHJldHVybjsNCi0gIH0NCi0NCi0gIC8qIFVBUlQgVFggRmlmbyBFbXB0eSBvY2N1cnJlZA0KLSAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotICBpZiAoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9UWEZFKSAhPSAwVSkgJiYNCi0gICAgICAoKGNyMWl0cyAmIFVTQVJUX0NSMV9UWEZFSUUpICE9IDBVKSkgew0KLSNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQ0KLSAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgVHggRmlmbyBFbXB0eSBDYWxsYmFjayAqLw0KLSAgICBodWFydC0+VHhGaWZvRW1wdHlDYWxsYmFjayhodWFydCk7DQotI2Vsc2UNCi0gICAgLyogQ2FsbCBsZWdhY3kgd2VhayBUeCBGaWZvIEVtcHR5IENhbGxiYWNrICovDQotICAgIEhBTF9VQVJURXhfVHhGaWZvRW1wdHlDYWxsYmFjayhodWFydCk7DQotI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi0gICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLSAgLyogVUFSVCBSWCBGaWZvIEZ1bGwgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotICBpZiAoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9SWEZGKSAhPSAwVSkgJiYNCi0gICAgICAoKGNyMWl0cyAmIFVTQVJUX0NSMV9SWEZGSUUpICE9IDBVKSkgew0KLSNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQ0KLSAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgUnggRmlmbyBGdWxsIENhbGxiYWNrICovDQotICAgIGh1YXJ0LT5SeEZpZm9GdWxsQ2FsbGJhY2soaHVhcnQpOw0KLSNlbHNlDQotICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgUnggRmlmbyBGdWxsIENhbGxiYWNrICovDQotICAgIEhBTF9VQVJURXhfUnhGaWZvRnVsbENhbGxiYWNrKGh1YXJ0KTsNCi0jZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLSAgICByZXR1cm47DQotICB9DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBUeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suDQotICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fd2VhayB2b2lkIEhBTF9VQVJUX1R4Q3BsdENhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpIHsNCi0gIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8NCi0gIFVOVVNFRChodWFydCk7DQotDQotICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsDQotICAgICAgICAgICAgdGhlIEhBTF9VQVJUX1R4Q3BsdENhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLg0KLSAgICovDQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgVHggSGFsZiBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suDQotICogQHBhcmFtICBodWFydCBVQVJUIGhhbmRsZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX3dlYWsgdm9pZCBIQUxfVUFSVF9UeEhhbGZDcGx0Q2FsbGJhY2soVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkgew0KLSAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLw0KLSAgVU5VU0VEKGh1YXJ0KTsNCi0NCi0gIC8qIE5PVEU6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLA0KLSAgICAgICAgICAgdGhlIEhBTF9VQVJUX1R4SGFsZkNwbHRDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4NCi0gICAqLw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFJ4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4NCi0gKiBAcGFyYW0gIGh1YXJ0IFVBUlQgaGFuZGxlLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fd2VhayB2b2lkIEhBTF9VQVJUX1J4Q3BsdENhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpIHsNCi0gIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8NCi0gIFVOVVNFRChodWFydCk7DQotDQotICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsDQotICAgICAgICAgICAgdGhlIEhBTF9VQVJUX1J4Q3BsdENhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLg0KLSAgICovDQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUnggSGFsZiBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suDQotICogQHBhcmFtICBodWFydCBVQVJUIGhhbmRsZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX3dlYWsgdm9pZCBIQUxfVUFSVF9SeEhhbGZDcGx0Q2FsbGJhY2soVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkgew0KLSAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLw0KLSAgVU5VU0VEKGh1YXJ0KTsNCi0NCi0gIC8qIE5PVEU6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLA0KLSAgICAgICAgICAgdGhlIEhBTF9VQVJUX1J4SGFsZkNwbHRDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4NCi0gICAqLw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFVBUlQgZXJyb3IgY2FsbGJhY2suDQotICogQHBhcmFtICBodWFydCBVQVJUIGhhbmRsZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1fX3dlYWsgdm9pZCBIQUxfVUFSVF9FcnJvckNhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpIHsNCi0gIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8NCi0gIFVOVVNFRChodWFydCk7DQotDQotICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsDQotICAgICAgICAgICAgdGhlIEhBTF9VQVJUX0Vycm9yQ2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuDQotICAgKi8NCi19DQotDQotLyoqDQotICogQGJyaWVmICBVQVJUIEFib3J0IENvbXBsZXRlIGNhbGxiYWNrLg0KLSAqIEBwYXJhbSAgaHVhcnQgVUFSVCBoYW5kbGUuDQotICogQHJldHZhbCBOb25lDQotICovDQotX193ZWFrIHZvaWQgSEFMX1VBUlRfQWJvcnRDcGx0Q2FsbGJhY2soVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkgew0KLSAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLw0KLSAgVU5VU0VEKGh1YXJ0KTsNCi0NCi0gIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwNCi0gICAgICAgICAgICB0aGUgSEFMX1VBUlRfQWJvcnRDcGx0Q2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuDQotICAgKi8NCi19DQotDQotLyoqDQotICogQGJyaWVmICBVQVJUIEFib3J0IENvbXBsZXRlIGNhbGxiYWNrLg0KLSAqIEBwYXJhbSAgaHVhcnQgVUFSVCBoYW5kbGUuDQotICogQHJldHZhbCBOb25lDQotICovDQotX193ZWFrIHZvaWQgSEFMX1VBUlRfQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KSB7DQotICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovDQotICBVTlVTRUQoaHVhcnQpOw0KLQ0KLSAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLA0KLSAgICAgICAgICAgIHRoZSBIQUxfVUFSVF9BYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUNCi0gICAgIHVzZXIgZmlsZS4NCi0gICAqLw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFVBUlQgQWJvcnQgUmVjZWl2ZSBDb21wbGV0ZSBjYWxsYmFjay4NCi0gKiBAcGFyYW0gIGh1YXJ0IFVBUlQgaGFuZGxlLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fd2VhayB2b2lkIEhBTF9VQVJUX0Fib3J0UmVjZWl2ZUNwbHRDYWxsYmFjayhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KSB7DQotICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovDQotICBVTlVTRUQoaHVhcnQpOw0KLQ0KLSAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLA0KLSAgICAgICAgICAgIHRoZSBIQUxfVUFSVF9BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyDQotICAgICBmaWxlLg0KLSAgICovDQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgUmVjZXB0aW9uIEV2ZW50IENhbGxiYWNrIChSeCBldmVudCBub3RpZmljYXRpb24gY2FsbGVkIGFmdGVyIHVzZSBvZg0KLSAqIGFkdmFuY2VkIHJlY2VwdGlvbiBzZXJ2aWNlKS4NCi0gKiBAcGFyYW0gIGh1YXJ0IFVBUlQgaGFuZGxlDQotICogQHBhcmFtICBTaXplICBOdW1iZXIgb2YgZGF0YSBhdmFpbGFibGUgaW4gYXBwbGljYXRpb24gcmVjZXB0aW9uIGJ1ZmZlcg0KLSAqIChpbmRpY2F0ZXMgYSBwb3NpdGlvbiBpbiByZWNlcHRpb24gYnVmZmVyIHVudGlsIHdoaWNoLCBkYXRhIGFyZSBhdmFpbGFibGUpDQotICogQHJldHZhbCBOb25lDQotICovDQotX193ZWFrIHZvaWQgSEFMX1VBUlRFeF9SeEV2ZW50Q2FsbGJhY2soVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBTaXplKSB7DQotICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovDQotICBVTlVTRUQoaHVhcnQpOw0KLSAgVU5VU0VEKFNpemUpOw0KLQ0KLSAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLA0KLSAgICAgICAgICAgIHRoZSBIQUxfVUFSVEV4X1J4RXZlbnRDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4NCi0gICAqLw0KLX0NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVUFSVF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMNCi0gICogIEBicmllZiAgIFVBUlQgY29udHJvbCBmdW5jdGlvbnMNCi0gICoNCi1AdmVyYmF0aW0NCi0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICMjIyMjDQotID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgWy4uXQ0KLSAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGNvbnRyb2wgdGhlIFVBUlQuDQotICAgICAoKykgSEFMX1VBUlRfUmVjZWl2ZXJUaW1lb3V0X0NvbmZpZygpIEFQSSBhbGxvd3MgdG8gY29uZmlndXJlIHRoZSByZWNlaXZlcg0KLXRpbWVvdXQgdmFsdWUgb24gdGhlIGZseQ0KLSAgICAgKCspIEhBTF9VQVJUX0VuYWJsZVJlY2VpdmVyVGltZW91dCgpIEFQSSBlbmFibGVzIHRoZSByZWNlaXZlciB0aW1lb3V0DQotZmVhdHVyZQ0KLSAgICAgKCspIEhBTF9VQVJUX0Rpc2FibGVSZWNlaXZlclRpbWVvdXQoKSBBUEkgZGlzYWJsZXMgdGhlIHJlY2VpdmVyIHRpbWVvdXQNCi1mZWF0dXJlDQotICAgICAoKykgSEFMX011bHRpUHJvY2Vzc29yX0VuYWJsZU11dGVNb2RlKCkgQVBJIGVuYWJsZXMgbXV0ZSBtb2RlDQotICAgICAoKykgSEFMX011bHRpUHJvY2Vzc29yX0Rpc2FibGVNdXRlTW9kZSgpIEFQSSBkaXNhYmxlcyBtdXRlIG1vZGUNCi0gICAgICgrKSBIQUxfTXVsdGlQcm9jZXNzb3JfRW50ZXJNdXRlTW9kZSgpIEFQSSBlbnRlcnMgbXV0ZSBtb2RlDQotICAgICAoKykgVUFSVF9TZXRDb25maWcoKSBBUEkgY29uZmlndXJlcyB0aGUgVUFSVCBwZXJpcGhlcmFsDQotICAgICAoKykgVUFSVF9BZHZGZWF0dXJlQ29uZmlnKCkgQVBJIG9wdGlvbmFsbHkgY29uZmlndXJlcyB0aGUgVUFSVCBhZHZhbmNlZA0KLWZlYXR1cmVzDQotICAgICAoKykgVUFSVF9DaGVja0lkbGVTdGF0ZSgpIEFQSSBlbnN1cmVzIHRoYXQgVEVBQ0sgYW5kL29yIFJFQUNLIGFyZSBzZXQgYWZ0ZXINCi1pbml0aWFsaXphdGlvbg0KLSAgICAgKCspIEhBTF9IYWxmRHVwbGV4X0VuYWJsZVRyYW5zbWl0dGVyKCkgQVBJIGRpc2FibGVzIHJlY2VpdmVyIGFuZCBlbmFibGVzDQotdHJhbnNtaXR0ZXINCi0gICAgICgrKSBIQUxfSGFsZkR1cGxleF9FbmFibGVSZWNlaXZlcigpIEFQSSBkaXNhYmxlcyB0cmFuc21pdHRlciBhbmQgZW5hYmxlcw0KLXJlY2VpdmVyDQotICAgICAoKykgSEFMX0xJTl9TZW5kQnJlYWsoKSBBUEkgdHJhbnNtaXRzIHRoZSBicmVhayBjaGFyYWN0ZXJzDQotQGVuZHZlcmJhdGltDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgVXBkYXRlIG9uIHRoZSBmbHkgdGhlIHJlY2VpdmVyIHRpbWVvdXQgdmFsdWUgaW4gUlRPUiByZWdpc3Rlci4NCi0gKiBAcGFyYW0gIGh1YXJ0IFBvaW50ZXIgdG8gYSBVQVJUX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCi0gKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVUFSVA0KLSAqIG1vZHVsZS4NCi0gKiBAcGFyYW0gIFRpbWVvdXRWYWx1ZSByZWNlaXZlciB0aW1lb3V0IHZhbHVlIGluIG51bWJlciBvZiBiYXVkIGJsb2Nrcy4gVGhlDQotICogdGltZW91dCB2YWx1ZSBtdXN0IGJlIGxlc3Mgb3IgZXF1YWwgdG8gMHgwRkZGRkZGRkYuDQotICogQHJldHZhbCBOb25lDQotICovDQotdm9pZCBIQUxfVUFSVF9SZWNlaXZlclRpbWVvdXRfQ29uZmlnKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVvdXRWYWx1ZSkgew0KLSAgaWYgKCEoSVNfTFBVQVJUX0lOU1RBTkNFKGh1YXJ0LT5JbnN0YW5jZSkpKSB7DQotICAgIGFzc2VydF9wYXJhbShJU19VQVJUX1JFQ0VJVkVSX1RJTUVPVVRfVkFMVUUoVGltZW91dFZhbHVlKSk7DQotICAgIE1PRElGWV9SRUcoaHVhcnQtPkluc3RhbmNlLT5SVE9SLCBVU0FSVF9SVE9SX1JUTywgVGltZW91dFZhbHVlKTsNCi0gIH0NCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgdGhlIFVBUlQgcmVjZWl2ZXIgdGltZW91dCBmZWF0dXJlLg0KLSAqIEBwYXJhbSAgaHVhcnQgUG9pbnRlciB0byBhIFVBUlRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KLSAqICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBVQVJUDQotICogbW9kdWxlLg0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0VuYWJsZVJlY2VpdmVyVGltZW91dChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KSB7DQotICBpZiAoIShJU19MUFVBUlRfSU5TVEFOQ0UoaHVhcnQtPkluc3RhbmNlKSkpIHsNCi0gICAgaWYgKGh1YXJ0LT5nU3RhdGUgPT0gSEFMX1VBUlRfU1RBVEVfUkVBRFkpIHsNCi0gICAgICAvKiBQcm9jZXNzIExvY2tlZCAqLw0KLSAgICAgIF9fSEFMX0xPQ0soaHVhcnQpOw0KLQ0KLSAgICAgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9CVVNZOw0KLQ0KLSAgICAgIC8qIFNldCB0aGUgVVNBUlQgUlRPRU4gYml0ICovDQotICAgICAgU0VUX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX1JUT0VOKTsNCi0NCi0gICAgICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7DQotDQotICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLw0KLSAgICAgIF9fSEFMX1VOTE9DSyhodWFydCk7DQotDQotICAgICAgcmV0dXJuIEhBTF9PSzsNCi0gICAgfSBlbHNlIHsNCi0gICAgICByZXR1cm4gSEFMX0JVU1k7DQotICAgIH0NCi0gIH0gZWxzZSB7DQotICAgIHJldHVybiBIQUxfRVJST1I7DQotICB9DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSB0aGUgVUFSVCByZWNlaXZlciB0aW1lb3V0IGZlYXR1cmUuDQotICogQHBhcmFtICBodWFydCBQb2ludGVyIHRvIGEgVUFSVF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQotICogICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFVBUlQNCi0gKiBtb2R1bGUuDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfRGlzYWJsZVJlY2VpdmVyVGltZW91dChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KSB7DQotICBpZiAoIShJU19MUFVBUlRfSU5TVEFOQ0UoaHVhcnQtPkluc3RhbmNlKSkpIHsNCi0gICAgaWYgKGh1YXJ0LT5nU3RhdGUgPT0gSEFMX1VBUlRfU1RBVEVfUkVBRFkpIHsNCi0gICAgICAvKiBQcm9jZXNzIExvY2tlZCAqLw0KLSAgICAgIF9fSEFMX0xPQ0soaHVhcnQpOw0KLQ0KLSAgICAgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9CVVNZOw0KLQ0KLSAgICAgIC8qIENsZWFyIHRoZSBVU0FSVCBSVE9FTiBiaXQgKi8NCi0gICAgICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjIsIFVTQVJUX0NSMl9SVE9FTik7DQotDQotICAgICAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOw0KLQ0KLSAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8NCi0gICAgICBfX0hBTF9VTkxPQ0soaHVhcnQpOw0KLQ0KLSAgICAgIHJldHVybiBIQUxfT0s7DQotICAgIH0gZWxzZSB7DQotICAgICAgcmV0dXJuIEhBTF9CVVNZOw0KLSAgICB9DQotICB9IGVsc2Ugew0KLSAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuYWJsZSBVQVJUIGluIG11dGUgbW9kZSAoZG9lcyBub3QgbWVhbiBVQVJUIGVudGVycyBtdXRlIG1vZGU7DQotICogICAgICAgICB0byBlbnRlciBtdXRlIG1vZGUsIEhBTF9NdWx0aVByb2Nlc3Nvcl9FbnRlck11dGVNb2RlKCkgQVBJIG11c3QgYmUNCi0gKiBjYWxsZWQpLg0KLSAqIEBwYXJhbSAgaHVhcnQgVUFSVCBoYW5kbGUuDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX011bHRpUHJvY2Vzc29yX0VuYWJsZU11dGVNb2RlKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpIHsNCi0gIF9fSEFMX0xPQ0soaHVhcnQpOw0KLQ0KLSAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX0JVU1k7DQotDQotICAvKiBFbmFibGUgVVNBUlQgbXV0ZSBtb2RlIGJ5IHNldHRpbmcgdGhlIE1NRSBiaXQgaW4gdGhlIENSMSByZWdpc3RlciAqLw0KLSAgQVRPTUlDX1NFVF9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9NTUUpOw0KLQ0KLSAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOw0KLQ0KLSAgcmV0dXJuIChVQVJUX0NoZWNrSWRsZVN0YXRlKGh1YXJ0KSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGlzYWJsZSBVQVJUIG11dGUgbW9kZSAoZG9lcyBub3QgbWVhbiB0aGUgVUFSVCBhY3R1YWxseSBleGl0cyBtdXRlDQotICogbW9kZSBhcyBpdCBtYXkgbm90IGhhdmUgYmVlbiBpbiBtdXRlIG1vZGUgYXQgdGhpcyB2ZXJ5IG1vbWVudCkuDQotICogQHBhcmFtICBodWFydCBVQVJUIGhhbmRsZS4NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfTXVsdGlQcm9jZXNzb3JfRGlzYWJsZU11dGVNb2RlKA0KLSAgICBVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KSB7DQotICBfX0hBTF9MT0NLKGh1YXJ0KTsNCi0NCi0gIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9CVVNZOw0KLQ0KLSAgLyogRGlzYWJsZSBVU0FSVCBtdXRlIG1vZGUgYnkgY2xlYXJpbmcgdGhlIE1NRSBiaXQgaW4gdGhlIENSMSByZWdpc3RlciAqLw0KLSAgQVRPTUlDX0NMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX01NRSk7DQotDQotICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7DQotDQotICByZXR1cm4gKFVBUlRfQ2hlY2tJZGxlU3RhdGUoaHVhcnQpKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmIEVudGVyIFVBUlQgbXV0ZSBtb2RlIChtZWFucyBVQVJUIGFjdHVhbGx5IGVudGVycyBtdXRlIG1vZGUpLg0KLSAqIEBub3RlICBUbyBleGl0IGZyb20gbXV0ZSBtb2RlLCBIQUxfTXVsdGlQcm9jZXNzb3JfRGlzYWJsZU11dGVNb2RlKCkgQVBJIG11c3QNCi0gKiBiZSBjYWxsZWQuDQotICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXZvaWQgSEFMX011bHRpUHJvY2Vzc29yX0VudGVyTXV0ZU1vZGUoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkgew0KLSAgX19IQUxfVUFSVF9TRU5EX1JFUShodWFydCwgVUFSVF9NVVRFX01PREVfUkVRVUVTVCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRW5hYmxlIHRoZSBVQVJUIHRyYW5zbWl0dGVyIGFuZCBkaXNhYmxlIHRoZSBVQVJUIHJlY2VpdmVyLg0KLSAqIEBwYXJhbSAgaHVhcnQgVUFSVCBoYW5kbGUuDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hhbGZEdXBsZXhfRW5hYmxlVHJhbnNtaXR0ZXIoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkgew0KLSAgX19IQUxfTE9DSyhodWFydCk7DQotICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWTsNCi0NCi0gIC8qIENsZWFyIFRFIGFuZCBSRSBiaXRzICovDQotICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCAoVVNBUlRfQ1IxX1RFIHwgVVNBUlRfQ1IxX1JFKSk7DQotDQotICAvKiBFbmFibGUgdGhlIFVTQVJUJ3MgdHJhbnNtaXQgaW50ZXJmYWNlIGJ5IHNldHRpbmcgdGhlIFRFIGJpdCBpbiB0aGUgVVNBUlQNCi0gICAqIENSMSByZWdpc3RlciAqLw0KLSAgQVRPTUlDX1NFVF9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9URSk7DQotDQotICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7DQotDQotICBfX0hBTF9VTkxPQ0soaHVhcnQpOw0KLQ0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgdGhlIFVBUlQgcmVjZWl2ZXIgYW5kIGRpc2FibGUgdGhlIFVBUlQgdHJhbnNtaXR0ZXIuDQotICogQHBhcmFtICBodWFydCBVQVJUIGhhbmRsZS4NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMuDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hhbGZEdXBsZXhfRW5hYmxlUmVjZWl2ZXIoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkgew0KLSAgX19IQUxfTE9DSyhodWFydCk7DQotICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWTsNCi0NCi0gIC8qIENsZWFyIFRFIGFuZCBSRSBiaXRzICovDQotICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCAoVVNBUlRfQ1IxX1RFIHwgVVNBUlRfQ1IxX1JFKSk7DQotDQotICAvKiBFbmFibGUgdGhlIFVTQVJUJ3MgcmVjZWl2ZSBpbnRlcmZhY2UgYnkgc2V0dGluZyB0aGUgUkUgYml0IGluIHRoZSBVU0FSVCBDUjENCi0gICAqIHJlZ2lzdGVyICovDQotICBBVE9NSUNfU0VUX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1JFKTsNCi0NCi0gIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsNCi0NCi0gIF9fSEFMX1VOTE9DSyhodWFydCk7DQotDQotICByZXR1cm4gSEFMX09LOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFRyYW5zbWl0IGJyZWFrIGNoYXJhY3RlcnMuDQotICogQHBhcmFtICBodWFydCBVQVJUIGhhbmRsZS4NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfTElOX1NlbmRCcmVhayhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KSB7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfTElOX0lOU1RBTkNFKGh1YXJ0LT5JbnN0YW5jZSkpOw0KLQ0KLSAgX19IQUxfTE9DSyhodWFydCk7DQotDQotICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWTsNCi0NCi0gIC8qIFNlbmQgYnJlYWsgY2hhcmFjdGVycyAqLw0KLSAgX19IQUxfVUFSVF9TRU5EX1JFUShodWFydCwgVUFSVF9TRU5EQlJFQUtfUkVRVUVTVCk7DQotDQotICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7DQotDQotICBfX0hBTF9VTkxPQ0soaHVhcnQpOw0KLQ0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFVBUlRfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNCBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvcg0KLWZ1bmN0aW9ucw0KLSAgKiAgQGJyaWVmICAgVUFSVCBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucw0KLSAgKg0KLUB2ZXJiYXRpbQ0KLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3IgZnVuY3Rpb25zICMjIyMjDQotICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgWy4uXQ0KLSAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvIDoNCi0gICAgICAoKykgUmV0dXJuIHRoZSBVQVJUIGhhbmRsZSBzdGF0ZS4NCi0gICAgICAoKykgUmV0dXJuIHRoZSBVQVJUIGhhbmRsZSBlcnJvciBjb2RlDQotDQotQGVuZHZlcmJhdGltDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiBSZXR1cm4gdGhlIFVBUlQgaGFuZGxlIHN0YXRlLg0KLSAqIEBwYXJhbSAgaHVhcnQgUG9pbnRlciB0byBhIFVBUlRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KLSAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVUFSVC4NCi0gKiBAcmV0dmFsIEhBTCBzdGF0ZQ0KLSAqLw0KLUhBTF9VQVJUX1N0YXRlVHlwZURlZiBIQUxfVUFSVF9HZXRTdGF0ZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KSB7DQotICB1aW50MzJfdCB0ZW1wMTsNCi0gIHVpbnQzMl90IHRlbXAyOw0KLSAgdGVtcDEgPSBodWFydC0+Z1N0YXRlOw0KLSAgdGVtcDIgPSBodWFydC0+UnhTdGF0ZTsNCi0NCi0gIHJldHVybiAoSEFMX1VBUlRfU3RhdGVUeXBlRGVmKSh0ZW1wMSB8IHRlbXAyKTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBSZXR1cm4gdGhlIFVBUlQgaGFuZGxlIGVycm9yIGNvZGUuDQotICogQHBhcmFtICBodWFydCBQb2ludGVyIHRvIGEgVUFSVF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQotICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBVQVJULg0KLSAqIEByZXR2YWwgVUFSVCBFcnJvciBDb2RlDQotICovDQotdWludDMyX3QgSEFMX1VBUlRfR2V0RXJyb3IoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkgew0KLSAgcmV0dXJuIGh1YXJ0LT5FcnJvckNvZGU7DQotfQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFVBUlRfUHJpdmF0ZV9GdW5jdGlvbnMgVUFSVCBQcml2YXRlIEZ1bmN0aW9ucw0KLSAqIEB7DQotICovDQotDQotLyoqDQotICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBjYWxsYmFja3MgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuDQotICogQHBhcmFtICBodWFydCBVQVJUIGhhbmRsZS4NCi0gKiBAcmV0dmFsIG5vbmUNCi0gKi8NCi0jaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkNCi12b2lkIFVBUlRfSW5pdENhbGxiYWNrc1RvRGVmYXVsdChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KSB7DQotICAvKiBJbml0IHRoZSBVQVJUIENhbGxiYWNrIHNldHRpbmdzICovDQotICBodWFydC0+VHhIYWxmQ3BsdENhbGxiYWNrID0NCi0gICAgICBIQUxfVUFSVF9UeEhhbGZDcGx0Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIFR4SGFsZkNwbHRDYWxsYmFjayAgICAgICAgKi8NCi0gIGh1YXJ0LT5UeENwbHRDYWxsYmFjayA9DQotICAgICAgSEFMX1VBUlRfVHhDcGx0Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIFR4Q3BsdENhbGxiYWNrICAgICAgICAgICAgKi8NCi0gIGh1YXJ0LT5SeEhhbGZDcGx0Q2FsbGJhY2sgPQ0KLSAgICAgIEhBTF9VQVJUX1J4SGFsZkNwbHRDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgUnhIYWxmQ3BsdENhbGxiYWNrICAgICAgICAqLw0KLSAgaHVhcnQtPlJ4Q3BsdENhbGxiYWNrID0NCi0gICAgICBIQUxfVUFSVF9SeENwbHRDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgUnhDcGx0Q2FsbGJhY2sgICAgICAgICAgICAqLw0KLSAgaHVhcnQtPkVycm9yQ2FsbGJhY2sgPSBIQUxfVUFSVF9FcnJvckNhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBFcnJvckNhbGxiYWNrICovDQotICBodWFydC0+QWJvcnRDcGx0Q2FsbGJhY2sgPQ0KLSAgICAgIEhBTF9VQVJUX0Fib3J0Q3BsdENhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBBYm9ydENwbHRDYWxsYmFjayAgICAgICAgICovDQotICBodWFydC0+QWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayA9DQotICAgICAgSEFMX1VBUlRfQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrICovDQotICBodWFydC0+QWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrID0NCi0gICAgICBIQUxfVUFSVF9BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIEFib3J0UmVjZWl2ZUNwbHRDYWxsYmFjaw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICBodWFydC0+V2FrZXVwQ2FsbGJhY2sgPQ0KLSAgICAgIEhBTF9VQVJURXhfV2FrZXVwQ2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIFdha2V1cENhbGxiYWNrICAgICAgICAgICAgKi8NCi0gIGh1YXJ0LT5SeEZpZm9GdWxsQ2FsbGJhY2sgPQ0KLSAgICAgIEhBTF9VQVJURXhfUnhGaWZvRnVsbENhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBSeEZpZm9GdWxsQ2FsbGJhY2sgICAgICAgICovDQotICBodWFydC0+VHhGaWZvRW1wdHlDYWxsYmFjayA9DQotICAgICAgSEFMX1VBUlRFeF9UeEZpZm9FbXB0eUNhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBUeEZpZm9FbXB0eUNhbGxiYWNrICovDQotICBodWFydC0+UnhFdmVudENhbGxiYWNrID0NCi0gICAgICBIQUxfVUFSVEV4X1J4RXZlbnRDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgUnhFdmVudENhbGxiYWNrICAgICAgICAgICAqLw0KLX0NCi0jZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiBDb25maWd1cmUgdGhlIFVBUlQgcGVyaXBoZXJhbC4NCi0gKiBAcGFyYW0gaHVhcnQgVUFSVCBoYW5kbGUuDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgVUFSVF9TZXRDb25maWcoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkgew0KLSAgdWludDMyX3QgdG1wcmVnOw0KLSAgdWludDE2X3QgYnJydGVtcDsNCi0gIFVBUlRfQ2xvY2tTb3VyY2VUeXBlRGVmIGNsb2Nrc291cmNlOw0KLSAgdWludDMyX3QgdXNhcnRkaXY7DQotICBIQUxfU3RhdHVzVHlwZURlZiByZXQgPSBIQUxfT0s7DQotICB1aW50MzJfdCBscHVhcnRfa2VyX2NrX3ByZXM7DQotICB1aW50MzJfdCBwY2xrOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19VQVJUX0JBVURSQVRFKGh1YXJ0LT5Jbml0LkJhdWRSYXRlKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9XT1JEX0xFTkdUSChodWFydC0+SW5pdC5Xb3JkTGVuZ3RoKSk7DQotICBpZiAoVUFSVF9JTlNUQU5DRV9MT1dQT1dFUihodWFydCkpIHsNCi0gICAgYXNzZXJ0X3BhcmFtKElTX0xQVUFSVF9TVE9QQklUUyhodWFydC0+SW5pdC5TdG9wQml0cykpOw0KLSAgfSBlbHNlIHsNCi0gICAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfU1RPUEJJVFMoaHVhcnQtPkluaXQuU3RvcEJpdHMpKTsNCi0gICAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfT05FX0JJVF9TQU1QTEUoaHVhcnQtPkluaXQuT25lQml0U2FtcGxpbmcpKTsNCi0gIH0NCi0NCi0gIGFzc2VydF9wYXJhbShJU19VQVJUX1BBUklUWShodWFydC0+SW5pdC5QYXJpdHkpKTsNCi0gIGFzc2VydF9wYXJhbShJU19VQVJUX01PREUoaHVhcnQtPkluaXQuTW9kZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfSEFSRFdBUkVfRkxPV19DT05UUk9MKGh1YXJ0LT5Jbml0Lkh3Rmxvd0N0bCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfT1ZFUlNBTVBMSU5HKGh1YXJ0LT5Jbml0Lk92ZXJTYW1wbGluZykpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfUFJFU0NBTEVSKGh1YXJ0LT5Jbml0LkNsb2NrUHJlc2NhbGVyKSk7DQotDQotICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQVJUIENSMSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0gIC8qIENsZWFyIE0sIFBDRSwgUFMsIFRFLCBSRSBhbmQgT1ZFUjggYml0cyBhbmQgY29uZmlndXJlDQotICAgKiAgdGhlIFVBUlQgV29yZCBMZW5ndGgsIFBhcml0eSwgTW9kZSBhbmQgb3ZlcnNhbXBsaW5nOg0KLSAgICogIHNldCB0aGUgTSBiaXRzIGFjY29yZGluZyB0byBodWFydC0+SW5pdC5Xb3JkTGVuZ3RoIHZhbHVlDQotICAgKiAgc2V0IFBDRSBhbmQgUFMgYml0cyBhY2NvcmRpbmcgdG8gaHVhcnQtPkluaXQuUGFyaXR5IHZhbHVlDQotICAgKiAgc2V0IFRFIGFuZCBSRSBiaXRzIGFjY29yZGluZyB0byBodWFydC0+SW5pdC5Nb2RlIHZhbHVlDQotICAgKiAgc2V0IE9WRVI4IGJpdCBhY2NvcmRpbmcgdG8gaHVhcnQtPkluaXQuT3ZlclNhbXBsaW5nIHZhbHVlICovDQotICB0bXByZWcgPSAodWludDMyX3QpaHVhcnQtPkluaXQuV29yZExlbmd0aCB8IGh1YXJ0LT5Jbml0LlBhcml0eSB8DQotICAgICAgICAgICBodWFydC0+SW5pdC5Nb2RlIHwgaHVhcnQtPkluaXQuT3ZlclNhbXBsaW5nOw0KLSAgTU9ESUZZX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX0ZJRUxEUywgdG1wcmVnKTsNCi0NCi0gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQgQ1IyIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSAgLyogQ29uZmlndXJlIHRoZSBVQVJUIFN0b3AgQml0czogU2V0IFNUT1BbMTM6MTJdIGJpdHMgYWNjb3JkaW5nDQotICAgKiB0byBodWFydC0+SW5pdC5TdG9wQml0cyB2YWx1ZSAqLw0KLSAgTU9ESUZZX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX1NUT1AsIGh1YXJ0LT5Jbml0LlN0b3BCaXRzKTsNCi0NCi0gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQgQ1IzIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSAgLyogQ29uZmlndXJlDQotICAgKiAtIFVBUlQgSGFyZFdhcmUgRmxvdyBDb250cm9sOiBzZXQgQ1RTRSBhbmQgUlRTRSBiaXRzIGFjY29yZGluZw0KLSAgICogICB0byBodWFydC0+SW5pdC5Id0Zsb3dDdGwgdmFsdWUNCi0gICAqIC0gb25lLWJpdCBzYW1wbGluZyBtZXRob2QgdmVyc3VzIHRocmVlIHNhbXBsZXMnIG1ham9yaXR5IHJ1bGUgYWNjb3JkaW5nDQotICAgKiAgIHRvIGh1YXJ0LT5Jbml0Lk9uZUJpdFNhbXBsaW5nIChub3QgYXBwbGljYWJsZSB0byBMUFVBUlQpICovDQotICB0bXByZWcgPSAodWludDMyX3QpaHVhcnQtPkluaXQuSHdGbG93Q3RsOw0KLQ0KLSAgaWYgKCEoVUFSVF9JTlNUQU5DRV9MT1dQT1dFUihodWFydCkpKSB7DQotICAgIHRtcHJlZyB8PSBodWFydC0+SW5pdC5PbmVCaXRTYW1wbGluZzsNCi0gIH0NCi0gIE1PRElGWV9SRUcoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19GSUVMRFMsIHRtcHJlZyk7DQotDQotICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQVJUIFBSRVNDIENvbmZpZ3VyYXRpb24NCi0gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0gIC8qIENvbmZpZ3VyZQ0KLSAgICogLSBVQVJUIENsb2NrIFByZXNjYWxlciA6IHNldCBQUkVTQ0FMRVIgYWNjb3JkaW5nIHRvDQotICAgKiBodWFydC0+SW5pdC5DbG9ja1ByZXNjYWxlciB2YWx1ZSAqLw0KLSAgTU9ESUZZX1JFRyhodWFydC0+SW5zdGFuY2UtPlBSRVNDLCBVU0FSVF9QUkVTQ19QUkVTQ0FMRVIsDQotICAgICAgICAgICAgIGh1YXJ0LT5Jbml0LkNsb2NrUHJlc2NhbGVyKTsNCi0NCi0gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQgQlJSIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSAgVUFSVF9HRVRDTE9DS1NPVVJDRShodWFydCwgY2xvY2tzb3VyY2UpOw0KLQ0KLSAgLyogQ2hlY2sgTFBVQVJUIGluc3RhbmNlICovDQotICBpZiAoVUFSVF9JTlNUQU5DRV9MT1dQT1dFUihodWFydCkpIHsNCi0gICAgLyogUmV0cmlldmUgZnJlcXVlbmN5IGNsb2NrICovDQotICAgIHN3aXRjaCAoY2xvY2tzb3VyY2UpIHsNCi0gICAgICBjYXNlIFVBUlRfQ0xPQ0tTT1VSQ0VfUENMSzE6DQotICAgICAgICBwY2xrID0gSEFMX1JDQ19HZXRQQ0xLMUZyZXEoKTsNCi0gICAgICAgIGJyZWFrOw0KLSAgICAgIGNhc2UgVUFSVF9DTE9DS1NPVVJDRV9IU0k6DQotICAgICAgICBwY2xrID0gKHVpbnQzMl90KUhTSV9WQUxVRTsNCi0gICAgICAgIGJyZWFrOw0KLSAgICAgIGNhc2UgVUFSVF9DTE9DS1NPVVJDRV9TWVNDTEs6DQotICAgICAgICBwY2xrID0gSEFMX1JDQ19HZXRTeXNDbG9ja0ZyZXEoKTsNCi0gICAgICAgIGJyZWFrOw0KLSAgICAgIGNhc2UgVUFSVF9DTE9DS1NPVVJDRV9MU0U6DQotICAgICAgICBwY2xrID0gKHVpbnQzMl90KUxTRV9WQUxVRTsNCi0gICAgICAgIGJyZWFrOw0KLSAgICAgIGRlZmF1bHQ6DQotICAgICAgICBwY2xrID0gMFU7DQotICAgICAgICByZXQgPSBIQUxfRVJST1I7DQotICAgICAgICBicmVhazsNCi0gICAgfQ0KLQ0KLSAgICAvKiBJZiBwcm9wZXIgY2xvY2sgc291cmNlIHJlcG9ydGVkICovDQotICAgIGlmIChwY2xrICE9IDBVKSB7DQotICAgICAgLyogQ29tcHV0ZSBjbG9jayBhZnRlciBQcmVzY2FsZXIgKi8NCi0gICAgICBscHVhcnRfa2VyX2NrX3ByZXMgPSAocGNsayAvIFVBUlRQcmVzY1RhYmxlW2h1YXJ0LT5Jbml0LkNsb2NrUHJlc2NhbGVyXSk7DQotDQotICAgICAgLyogRW5zdXJlIHRoYXQgRnJlcXVlbmN5IGNsb2NrIGlzIGluIHRoZSByYW5nZSBbMyAqIGJhdWRyYXRlLCA0MDk2ICoNCi0gICAgICAgKiBiYXVkcmF0ZV0gKi8NCi0gICAgICBpZiAoKGxwdWFydF9rZXJfY2tfcHJlcyA8ICgzVSAqIGh1YXJ0LT5Jbml0LkJhdWRSYXRlKSkgfHwNCi0gICAgICAgICAgKGxwdWFydF9rZXJfY2tfcHJlcyA+ICg0MDk2VSAqIGh1YXJ0LT5Jbml0LkJhdWRSYXRlKSkpIHsNCi0gICAgICAgIHJldCA9IEhBTF9FUlJPUjsNCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgLyogQ2hlY2sgY29tcHV0ZWQgVXNhcnREaXYgdmFsdWUgaXMgaW4gYWxsb2NhdGVkIHJhbmdlDQotICAgICAgICAgICAoaXQgaXMgZm9yYmlkZGVuIHRvIHdyaXRlIHZhbHVlcyBsb3dlciB0aGFuIDB4MzAwIGluIHRoZSBMUFVBUlRfQlJSDQotICAgICAgICAgICByZWdpc3RlcikgKi8NCi0gICAgICAgIHVzYXJ0ZGl2ID0gKHVpbnQzMl90KShVQVJUX0RJVl9MUFVBUlQocGNsaywgaHVhcnQtPkluaXQuQmF1ZFJhdGUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh1YXJ0LT5Jbml0LkNsb2NrUHJlc2NhbGVyKSk7DQotICAgICAgICBpZiAoKHVzYXJ0ZGl2ID49IExQVUFSVF9CUlJfTUlOKSAmJiAodXNhcnRkaXYgPD0gTFBVQVJUX0JSUl9NQVgpKSB7DQotICAgICAgICAgIGh1YXJ0LT5JbnN0YW5jZS0+QlJSID0gdXNhcnRkaXY7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICByZXQgPSBIQUxfRVJST1I7DQotICAgICAgICB9DQotICAgICAgfSAvKiBpZiAoIChscHVhcnRfa2VyX2NrX3ByZXMgPCAoMyAqIGh1YXJ0LT5Jbml0LkJhdWRSYXRlKSApIHx8DQotICAgICAgICAgICAgICAgIChscHVhcnRfa2VyX2NrX3ByZXMgPiAoNDA5NiAqIGh1YXJ0LT5Jbml0LkJhdWRSYXRlKSApKSAqLw0KLSAgICB9ICAgLyogaWYgKHBjbGsgIT0gMCkgKi8NCi0gIH0NCi0gIC8qIENoZWNrIFVBUlQgT3ZlciBTYW1wbGluZyB0byBzZXQgQmF1ZCBSYXRlIFJlZ2lzdGVyICovDQotICBlbHNlIGlmIChodWFydC0+SW5pdC5PdmVyU2FtcGxpbmcgPT0gVUFSVF9PVkVSU0FNUExJTkdfOCkgew0KLSAgICBzd2l0Y2ggKGNsb2Nrc291cmNlKSB7DQotICAgICAgY2FzZSBVQVJUX0NMT0NLU09VUkNFX1BDTEsxOg0KLSAgICAgICAgcGNsayA9IEhBTF9SQ0NfR2V0UENMSzFGcmVxKCk7DQotICAgICAgICBicmVhazsNCi0gICAgICBjYXNlIFVBUlRfQ0xPQ0tTT1VSQ0VfUENMSzI6DQotICAgICAgICBwY2xrID0gSEFMX1JDQ19HZXRQQ0xLMkZyZXEoKTsNCi0gICAgICAgIGJyZWFrOw0KLSAgICAgIGNhc2UgVUFSVF9DTE9DS1NPVVJDRV9IU0k6DQotICAgICAgICBwY2xrID0gKHVpbnQzMl90KUhTSV9WQUxVRTsNCi0gICAgICAgIGJyZWFrOw0KLSAgICAgIGNhc2UgVUFSVF9DTE9DS1NPVVJDRV9TWVNDTEs6DQotICAgICAgICBwY2xrID0gSEFMX1JDQ19HZXRTeXNDbG9ja0ZyZXEoKTsNCi0gICAgICAgIGJyZWFrOw0KLSAgICAgIGNhc2UgVUFSVF9DTE9DS1NPVVJDRV9MU0U6DQotICAgICAgICBwY2xrID0gKHVpbnQzMl90KUxTRV9WQUxVRTsNCi0gICAgICAgIGJyZWFrOw0KLSAgICAgIGRlZmF1bHQ6DQotICAgICAgICBwY2xrID0gMFU7DQotICAgICAgICByZXQgPSBIQUxfRVJST1I7DQotICAgICAgICBicmVhazsNCi0gICAgfQ0KLQ0KLSAgICAvKiBVU0FSVERJViBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAwZDE2ICovDQotICAgIGlmIChwY2xrICE9IDBVKSB7DQotICAgICAgdXNhcnRkaXYgPSAodWludDMyX3QpKFVBUlRfRElWX1NBTVBMSU5HOChwY2xrLCBodWFydC0+SW5pdC5CYXVkUmF0ZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh1YXJ0LT5Jbml0LkNsb2NrUHJlc2NhbGVyKSk7DQotICAgICAgaWYgKCh1c2FydGRpdiA+PSBVQVJUX0JSUl9NSU4pICYmICh1c2FydGRpdiA8PSBVQVJUX0JSUl9NQVgpKSB7DQotICAgICAgICBicnJ0ZW1wID0gKHVpbnQxNl90KSh1c2FydGRpdiAmIDB4RkZGMFUpOw0KLSAgICAgICAgYnJydGVtcCB8PSAodWludDE2X3QpKCh1c2FydGRpdiAmICh1aW50MTZfdCkweDAwMEZVKSA+PiAxVSk7DQotICAgICAgICBodWFydC0+SW5zdGFuY2UtPkJSUiA9IGJycnRlbXA7DQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgIHJldCA9IEhBTF9FUlJPUjsNCi0gICAgICB9DQotICAgIH0NCi0gIH0gZWxzZSB7DQotICAgIHN3aXRjaCAoY2xvY2tzb3VyY2UpIHsNCi0gICAgICBjYXNlIFVBUlRfQ0xPQ0tTT1VSQ0VfUENMSzE6DQotICAgICAgICBwY2xrID0gSEFMX1JDQ19HZXRQQ0xLMUZyZXEoKTsNCi0gICAgICAgIGJyZWFrOw0KLSAgICAgIGNhc2UgVUFSVF9DTE9DS1NPVVJDRV9QQ0xLMjoNCi0gICAgICAgIHBjbGsgPSBIQUxfUkNDX0dldFBDTEsyRnJlcSgpOw0KLSAgICAgICAgYnJlYWs7DQotICAgICAgY2FzZSBVQVJUX0NMT0NLU09VUkNFX0hTSToNCi0gICAgICAgIHBjbGsgPSAodWludDMyX3QpSFNJX1ZBTFVFOw0KLSAgICAgICAgYnJlYWs7DQotICAgICAgY2FzZSBVQVJUX0NMT0NLU09VUkNFX1NZU0NMSzoNCi0gICAgICAgIHBjbGsgPSBIQUxfUkNDX0dldFN5c0Nsb2NrRnJlcSgpOw0KLSAgICAgICAgYnJlYWs7DQotICAgICAgY2FzZSBVQVJUX0NMT0NLU09VUkNFX0xTRToNCi0gICAgICAgIHBjbGsgPSAodWludDMyX3QpTFNFX1ZBTFVFOw0KLSAgICAgICAgYnJlYWs7DQotICAgICAgZGVmYXVsdDoNCi0gICAgICAgIHBjbGsgPSAwVTsNCi0gICAgICAgIHJldCA9IEhBTF9FUlJPUjsNCi0gICAgICAgIGJyZWFrOw0KLSAgICB9DQotDQotICAgIGlmIChwY2xrICE9IDBVKSB7DQotICAgICAgLyogVVNBUlRESVYgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMGQxNiAqLw0KLSAgICAgIHVzYXJ0ZGl2ID0gKHVpbnQzMl90KShVQVJUX0RJVl9TQU1QTElORzE2KHBjbGssIGh1YXJ0LT5Jbml0LkJhdWRSYXRlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh1YXJ0LT5Jbml0LkNsb2NrUHJlc2NhbGVyKSk7DQotICAgICAgaWYgKCh1c2FydGRpdiA+PSBVQVJUX0JSUl9NSU4pICYmICh1c2FydGRpdiA8PSBVQVJUX0JSUl9NQVgpKSB7DQotICAgICAgICBodWFydC0+SW5zdGFuY2UtPkJSUiA9ICh1aW50MTZfdCl1c2FydGRpdjsNCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgcmV0ID0gSEFMX0VSUk9SOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgbnVtYmVyIG9mIGRhdGEgdG8gcHJvY2VzcyBkdXJpbmcgUlgvVFggSVNSIGV4ZWN1dGlvbiAqLw0KLSAgaHVhcnQtPk5iVHhEYXRhVG9Qcm9jZXNzID0gMTsNCi0gIGh1YXJ0LT5OYlJ4RGF0YVRvUHJvY2VzcyA9IDE7DQotDQotICAvKiBDbGVhciBJU1IgZnVuY3Rpb24gcG9pbnRlcnMgKi8NCi0gIGh1YXJ0LT5SeElTUiA9IE5VTEw7DQotICBodWFydC0+VHhJU1IgPSBOVUxMOw0KLQ0KLSAgcmV0dXJuIHJldDsNCi19DQotDQotLyoqDQotICogQGJyaWVmIENvbmZpZ3VyZSB0aGUgVUFSVCBwZXJpcGhlcmFsIGFkdmFuY2VkIGZlYXR1cmVzLg0KLSAqIEBwYXJhbSBodWFydCBVQVJUIGhhbmRsZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi12b2lkIFVBUlRfQWR2RmVhdHVyZUNvbmZpZyhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KSB7DQotICAvKiBDaGVjayB3aGV0aGVyIHRoZSBzZXQgb2YgYWR2YW5jZWQgZmVhdHVyZXMgdG8gY29uZmlndXJlIGlzIHByb3Blcmx5IHNldCAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfQURWRkVBVFVSRV9JTklUKGh1YXJ0LT5BZHZhbmNlZEluaXQuQWR2RmVhdHVyZUluaXQpKTsNCi0NCi0gIC8qIGlmIHJlcXVpcmVkLCBjb25maWd1cmUgVFggcGluIGFjdGl2ZSBsZXZlbCBpbnZlcnNpb24gKi8NCi0gIGlmIChIQUxfSVNfQklUX1NFVChodWFydC0+QWR2YW5jZWRJbml0LkFkdkZlYXR1cmVJbml0LA0KLSAgICAgICAgICAgICAgICAgICAgIFVBUlRfQURWRkVBVFVSRV9UWElOVkVSVF9JTklUKSkgew0KLSAgICBhc3NlcnRfcGFyYW0oDQotICAgICAgICBJU19VQVJUX0FEVkZFQVRVUkVfVFhJTlYoaHVhcnQtPkFkdmFuY2VkSW5pdC5UeFBpbkxldmVsSW52ZXJ0KSk7DQotICAgIE1PRElGWV9SRUcoaHVhcnQtPkluc3RhbmNlLT5DUjIsIFVTQVJUX0NSMl9UWElOViwNCi0gICAgICAgICAgICAgICBodWFydC0+QWR2YW5jZWRJbml0LlR4UGluTGV2ZWxJbnZlcnQpOw0KLSAgfQ0KLQ0KLSAgLyogaWYgcmVxdWlyZWQsIGNvbmZpZ3VyZSBSWCBwaW4gYWN0aXZlIGxldmVsIGludmVyc2lvbiAqLw0KLSAgaWYgKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5BZHZhbmNlZEluaXQuQWR2RmVhdHVyZUluaXQsDQotICAgICAgICAgICAgICAgICAgICAgVUFSVF9BRFZGRUFUVVJFX1JYSU5WRVJUX0lOSVQpKSB7DQotICAgIGFzc2VydF9wYXJhbSgNCi0gICAgICAgIElTX1VBUlRfQURWRkVBVFVSRV9SWElOVihodWFydC0+QWR2YW5jZWRJbml0LlJ4UGluTGV2ZWxJbnZlcnQpKTsNCi0gICAgTU9ESUZZX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX1JYSU5WLA0KLSAgICAgICAgICAgICAgIGh1YXJ0LT5BZHZhbmNlZEluaXQuUnhQaW5MZXZlbEludmVydCk7DQotICB9DQotDQotICAvKiBpZiByZXF1aXJlZCwgY29uZmlndXJlIGRhdGEgaW52ZXJzaW9uICovDQotICBpZiAoSEFMX0lTX0JJVF9TRVQoaHVhcnQtPkFkdmFuY2VkSW5pdC5BZHZGZWF0dXJlSW5pdCwNCi0gICAgICAgICAgICAgICAgICAgICBVQVJUX0FEVkZFQVRVUkVfREFUQUlOVkVSVF9JTklUKSkgew0KLSAgICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9BRFZGRUFUVVJFX0RBVEFJTlYoaHVhcnQtPkFkdmFuY2VkSW5pdC5EYXRhSW52ZXJ0KSk7DQotICAgIE1PRElGWV9SRUcoaHVhcnQtPkluc3RhbmNlLT5DUjIsIFVTQVJUX0NSMl9EQVRBSU5WLA0KLSAgICAgICAgICAgICAgIGh1YXJ0LT5BZHZhbmNlZEluaXQuRGF0YUludmVydCk7DQotICB9DQotDQotICAvKiBpZiByZXF1aXJlZCwgY29uZmlndXJlIFJYL1RYIHBpbnMgc3dhcCAqLw0KLSAgaWYgKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5BZHZhbmNlZEluaXQuQWR2RmVhdHVyZUluaXQsDQotICAgICAgICAgICAgICAgICAgICAgVUFSVF9BRFZGRUFUVVJFX1NXQVBfSU5JVCkpIHsNCi0gICAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfQURWRkVBVFVSRV9TV0FQKGh1YXJ0LT5BZHZhbmNlZEluaXQuU3dhcCkpOw0KLSAgICBNT0RJRllfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IyLCBVU0FSVF9DUjJfU1dBUCwgaHVhcnQtPkFkdmFuY2VkSW5pdC5Td2FwKTsNCi0gIH0NCi0NCi0gIC8qIGlmIHJlcXVpcmVkLCBjb25maWd1cmUgUlggb3ZlcnJ1biBkZXRlY3Rpb24gZGlzYWJsaW5nICovDQotICBpZiAoSEFMX0lTX0JJVF9TRVQoaHVhcnQtPkFkdmFuY2VkSW5pdC5BZHZGZWF0dXJlSW5pdCwNCi0gICAgICAgICAgICAgICAgICAgICBVQVJUX0FEVkZFQVRVUkVfUlhPVkVSUlVORElTQUJMRV9JTklUKSkgew0KLSAgICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9PVkVSUlVOKGh1YXJ0LT5BZHZhbmNlZEluaXQuT3ZlcnJ1bkRpc2FibGUpKTsNCi0gICAgTU9ESUZZX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX09WUkRJUywNCi0gICAgICAgICAgICAgICBodWFydC0+QWR2YW5jZWRJbml0Lk92ZXJydW5EaXNhYmxlKTsNCi0gIH0NCi0NCi0gIC8qIGlmIHJlcXVpcmVkLCBjb25maWd1cmUgRE1BIGRpc2FibGluZyBvbiByZWNlcHRpb24gZXJyb3IgKi8NCi0gIGlmIChIQUxfSVNfQklUX1NFVChodWFydC0+QWR2YW5jZWRJbml0LkFkdkZlYXR1cmVJbml0LA0KLSAgICAgICAgICAgICAgICAgICAgIFVBUlRfQURWRkVBVFVSRV9ETUFESVNBQkxFT05FUlJPUl9JTklUKSkgew0KLSAgICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9BRFZGRUFUVVJFX0RNQU9OUlhFUlJPUigNCi0gICAgICAgIGh1YXJ0LT5BZHZhbmNlZEluaXQuRE1BRGlzYWJsZW9uUnhFcnJvcikpOw0KLSAgICBNT0RJRllfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRERSRSwNCi0gICAgICAgICAgICAgICBodWFydC0+QWR2YW5jZWRJbml0LkRNQURpc2FibGVvblJ4RXJyb3IpOw0KLSAgfQ0KLQ0KLSAgLyogaWYgcmVxdWlyZWQsIGNvbmZpZ3VyZSBhdXRvIEJhdWQgcmF0ZSBkZXRlY3Rpb24gc2NoZW1lICovDQotICBpZiAoSEFMX0lTX0JJVF9TRVQoaHVhcnQtPkFkdmFuY2VkSW5pdC5BZHZGZWF0dXJlSW5pdCwNCi0gICAgICAgICAgICAgICAgICAgICBVQVJUX0FEVkZFQVRVUkVfQVVUT0JBVURSQVRFX0lOSVQpKSB7DQotICAgIGFzc2VydF9wYXJhbShJU19VU0FSVF9BVVRPQkFVRFJBVEVfREVURUNUSU9OX0lOU1RBTkNFKGh1YXJ0LT5JbnN0YW5jZSkpOw0KLSAgICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9BRFZGRUFUVVJFX0FVVE9CQVVEUkFURSgNCi0gICAgICAgIGh1YXJ0LT5BZHZhbmNlZEluaXQuQXV0b0JhdWRSYXRlRW5hYmxlKSk7DQotICAgIE1PRElGWV9SRUcoaHVhcnQtPkluc3RhbmNlLT5DUjIsIFVTQVJUX0NSMl9BQlJFTiwNCi0gICAgICAgICAgICAgICBodWFydC0+QWR2YW5jZWRJbml0LkF1dG9CYXVkUmF0ZUVuYWJsZSk7DQotICAgIC8qIHNldCBhdXRvIEJhdWRyYXRlIGRldGVjdGlvbiBwYXJhbWV0ZXJzIGlmIGRldGVjdGlvbiBpcyBlbmFibGVkICovDQotICAgIGlmIChodWFydC0+QWR2YW5jZWRJbml0LkF1dG9CYXVkUmF0ZUVuYWJsZSA9PQ0KLSAgICAgICAgVUFSVF9BRFZGRUFUVVJFX0FVVE9CQVVEUkFURV9FTkFCTEUpIHsNCi0gICAgICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9BRFZGRUFUVVJFX0FVVE9CQVVEUkFURU1PREUoDQotICAgICAgICAgIGh1YXJ0LT5BZHZhbmNlZEluaXQuQXV0b0JhdWRSYXRlTW9kZSkpOw0KLSAgICAgIE1PRElGWV9SRUcoaHVhcnQtPkluc3RhbmNlLT5DUjIsIFVTQVJUX0NSMl9BQlJNT0RFLA0KLSAgICAgICAgICAgICAgICAgaHVhcnQtPkFkdmFuY2VkSW5pdC5BdXRvQmF1ZFJhdGVNb2RlKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgLyogaWYgcmVxdWlyZWQsIGNvbmZpZ3VyZSBNU0IgZmlyc3Qgb24gY29tbXVuaWNhdGlvbiBsaW5lICovDQotICBpZiAoSEFMX0lTX0JJVF9TRVQoaHVhcnQtPkFkdmFuY2VkSW5pdC5BZHZGZWF0dXJlSW5pdCwNCi0gICAgICAgICAgICAgICAgICAgICBVQVJUX0FEVkZFQVRVUkVfTVNCRklSU1RfSU5JVCkpIHsNCi0gICAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfQURWRkVBVFVSRV9NU0JGSVJTVChodWFydC0+QWR2YW5jZWRJbml0Lk1TQkZpcnN0KSk7DQotICAgIE1PRElGWV9SRUcoaHVhcnQtPkluc3RhbmNlLT5DUjIsIFVTQVJUX0NSMl9NU0JGSVJTVCwNCi0gICAgICAgICAgICAgICBodWFydC0+QWR2YW5jZWRJbml0Lk1TQkZpcnN0KTsNCi0gIH0NCi19DQotDQotLyoqDQotICogQGJyaWVmIENoZWNrIHRoZSBVQVJUIElkbGUgU3RhdGUuDQotICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLg0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIFVBUlRfQ2hlY2tJZGxlU3RhdGUoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkgew0KLSAgdWludDMyX3QgdGlja3N0YXJ0Ow0KLQ0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgVUFSVCBFcnJvckNvZGUgKi8NCi0gIGh1YXJ0LT5FcnJvckNvZGUgPSBIQUxfVUFSVF9FUlJPUl9OT05FOw0KLQ0KLSAgLyogSW5pdCB0aWNrc3RhcnQgZm9yIHRpbWVvdXQgbWFuYWdlbWVudCAqLw0KLSAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsNCi0NCi0gIC8qIENoZWNrIGlmIHRoZSBUcmFuc21pdHRlciBpcyBlbmFibGVkICovDQotICBpZiAoKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxICYgVVNBUlRfQ1IxX1RFKSA9PSBVU0FSVF9DUjFfVEUpIHsNCi0gICAgLyogV2FpdCB1bnRpbCBURUFDSyBmbGFnIGlzIHNldCAqLw0KLSAgICBpZiAoVUFSVF9XYWl0T25GbGFnVW50aWxUaW1lb3V0KGh1YXJ0LCBVU0FSVF9JU1JfVEVBQ0ssIFJFU0VULCB0aWNrc3RhcnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1VBUlRfVElNRU9VVF9WQUxVRSkgIT0gSEFMX09LKSB7DQotICAgICAgLyogVGltZW91dCBvY2N1cnJlZCAqLw0KLSAgICAgIHJldHVybiBIQUxfVElNRU9VVDsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgLyogQ2hlY2sgaWYgdGhlIFJlY2VpdmVyIGlzIGVuYWJsZWQgKi8NCi0gIGlmICgoaHVhcnQtPkluc3RhbmNlLT5DUjEgJiBVU0FSVF9DUjFfUkUpID09IFVTQVJUX0NSMV9SRSkgew0KLSAgICAvKiBXYWl0IHVudGlsIFJFQUNLIGZsYWcgaXMgc2V0ICovDQotICAgIGlmIChVQVJUX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoaHVhcnQsIFVTQVJUX0lTUl9SRUFDSywgUkVTRVQsIHRpY2tzdGFydCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfVUFSVF9USU1FT1VUX1ZBTFVFKSAhPSBIQUxfT0spIHsNCi0gICAgICAvKiBUaW1lb3V0IG9jY3VycmVkICovDQotICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOw0KLSAgICB9DQotICB9DQotDQotICAvKiBJbml0aWFsaXplIHRoZSBVQVJUIFN0YXRlICovDQotICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7DQotICBodWFydC0+UnhTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOw0KLSAgaHVhcnQtPlJlY2VwdGlvblR5cGUgPSBIQUxfVUFSVF9SRUNFUFRJT05fU1RBTkRBUkQ7DQotDQotICBfX0hBTF9VTkxPQ0soaHVhcnQpOw0KLQ0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgVUFSVCBDb21tdW5pY2F0aW9uIFRpbWVvdXQuIEl0IHdhaXRzDQotICogICAgICAgICAgICAgICAgICB1bnRpbCBhIGZsYWcgaXMgbm8gbG9uZ2VyIGluIHRoZSBzcGVjaWZpZWQgc3RhdHVzLg0KLSAqIEBwYXJhbSBodWFydCAgICAgVUFSVCBoYW5kbGUuDQotICogQHBhcmFtIEZsYWcgICAgICBTcGVjaWZpZXMgdGhlIFVBUlQgZmxhZyB0byBjaGVjaw0KLSAqIEBwYXJhbSBTdGF0dXMgICAgVGhlIGFjdHVhbCBGbGFnIHN0YXR1cyAoU0VUIG9yIFJFU0VUKQ0KLSAqIEBwYXJhbSBUaWNrc3RhcnQgVGljayBzdGFydCB2YWx1ZQ0KLSAqIEBwYXJhbSBUaW1lb3V0ICAgVGltZW91dCBkdXJhdGlvbg0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIFVBUlRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBGbGFnLCBGbGFnU3RhdHVzIFN0YXR1cywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGlja3N0YXJ0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lb3V0KSB7DQotICAvKiBXYWl0IHVudGlsIGZsYWcgaXMgc2V0ICovDQotICB3aGlsZSAoKF9fSEFMX1VBUlRfR0VUX0ZMQUcoaHVhcnQsIEZsYWcpID8gU0VUIDogUkVTRVQpID09IFN0YXR1cykgew0KLSAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8NCi0gICAgaWYgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkgew0KLSAgICAgIGlmICgoKEhBTF9HZXRUaWNrKCkgLSBUaWNrc3RhcnQpID4gVGltZW91dCkgfHwgKFRpbWVvdXQgPT0gMFUpKSB7DQotICAgICAgICAvKiBEaXNhYmxlIFRYRSwgUlhORSwgUEUgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuDQotICAgICAgICAgICBlcnJvcikgaW50ZXJydXB0cyBmb3IgdGhlIGludGVycnVwdCBwcm9jZXNzICovDQotICAgICAgICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAoVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFIHwgVVNBUlRfQ1IxX1BFSUUgfA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX1RYRUlFX1RYRk5GSUUpKTsNCi0gICAgICAgIEFUT01JQ19DTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOw0KLQ0KLSAgICAgICAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOw0KLSAgICAgICAgaHVhcnQtPlJ4U3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsNCi0NCi0gICAgICAgIF9fSEFMX1VOTE9DSyhodWFydCk7DQotDQotICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7DQotICAgICAgfQ0KLQ0KLSAgICAgIGlmIChSRUFEX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1JFKSAhPSAwVSkgew0KLSAgICAgICAgaWYgKF9fSEFMX1VBUlRfR0VUX0ZMQUcoaHVhcnQsIFVBUlRfRkxBR19SVE9GKSA9PSBTRVQpIHsNCi0gICAgICAgICAgLyogQ2xlYXIgUmVjZWl2ZXIgVGltZW91dCBmbGFnKi8NCi0gICAgICAgICAgX19IQUxfVUFSVF9DTEVBUl9GTEFHKGh1YXJ0LCBVQVJUX0NMRUFSX1JUT0YpOw0KLQ0KLSAgICAgICAgICAvKiBEaXNhYmxlIFRYRSwgUlhORSwgUEUgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuDQotICAgICAgICAgICAgIGVycm9yKSBpbnRlcnJ1cHRzIGZvciB0aGUgaW50ZXJydXB0IHByb2Nlc3MgKi8NCi0gICAgICAgICAgQVRPTUlDX0NMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFIHwgVVNBUlRfQ1IxX1BFSUUgfA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfVFhFSUVfVFhGTkZJRSkpOw0KLSAgICAgICAgICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsNCi0NCi0gICAgICAgICAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOw0KLSAgICAgICAgICBodWFydC0+UnhTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOw0KLSAgICAgICAgICBodWFydC0+RXJyb3JDb2RlID0gSEFMX1VBUlRfRVJST1JfUlRPOw0KLQ0KLSAgICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovDQotICAgICAgICAgIF9fSEFMX1VOTE9DSyhodWFydCk7DQotDQotICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsNCi0gICAgICAgIH0NCi0gICAgICB9DQotICAgIH0NCi0gIH0NCi0gIHJldHVybiBIQUxfT0s7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU3RhcnQgUmVjZWl2ZSBvcGVyYXRpb24gaW4gaW50ZXJydXB0IG1vZGUuDQotICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGNvdWxkIGJlIGNhbGxlZCBieSBhbGwgSEFMIFVBUlQgQVBJIHByb3ZpZGluZyByZWNlcHRpb24NCi0gKiBpbiBJbnRlcnJ1cHQgbW9kZS4NCi0gKiBAbm90ZSAgIFdoZW4gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLCBwYXJhbWV0ZXJzIHZhbGlkaXR5IGlzIGNvbnNpZGVyZWQgYXMNCi0gKiBhbHJlYWR5IGNoZWNrZWQsIGkuZS4gUnggU3RhdGUsIGJ1ZmZlciBhZGRyZXNzLCAuLi4gVUFSVCBIYW5kbGUgaXMgYXNzdW1lZCBhcw0KLSAqIExvY2tlZC4NCi0gKiBAcGFyYW0gIGh1YXJ0IFVBUlQgaGFuZGxlLg0KLSAqIEBwYXJhbSAgcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlciAodTggb3IgdTE2IGRhdGEgZWxlbWVudHMpLg0KLSAqIEBwYXJhbSAgU2l6ZSAgQW1vdW50IG9mIGRhdGEgZWxlbWVudHMgKHU4IG9yIHUxNikgdG8gYmUgcmVjZWl2ZWQuDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgVUFSVF9TdGFydF9SZWNlaXZlX0lUKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKSB7DQotICBodWFydC0+cFJ4QnVmZlB0ciA9IHBEYXRhOw0KLSAgaHVhcnQtPlJ4WGZlclNpemUgPSBTaXplOw0KLSAgaHVhcnQtPlJ4WGZlckNvdW50ID0gU2l6ZTsNCi0gIGh1YXJ0LT5SeElTUiA9IE5VTEw7DQotDQotICAvKiBDb21wdXRhdGlvbiBvZiBVQVJUIG1hc2sgdG8gYXBwbHkgdG8gUkRSIHJlZ2lzdGVyICovDQotICBVQVJUX01BU0tfQ09NUFVUQVRJT04oaHVhcnQpOw0KLQ0KLSAgaHVhcnQtPkVycm9yQ29kZSA9IEhBTF9VQVJUX0VSUk9SX05PTkU7DQotICBodWFydC0+UnhTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX0JVU1lfUlg7DQotDQotICAvKiBFbmFibGUgdGhlIFVBUlQgRXJyb3IgSW50ZXJydXB0OiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKQ0KLSAgICovDQotICBBVE9NSUNfU0VUX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7DQotDQotICAvKiBDb25maWd1cmUgUnggaW50ZXJydXB0IHByb2Nlc3NpbmcgKi8NCi0gIGlmICgoaHVhcnQtPkZpZm9Nb2RlID09IFVBUlRfRklGT01PREVfRU5BQkxFKSAmJg0KLSAgICAgIChTaXplID49IGh1YXJ0LT5OYlJ4RGF0YVRvUHJvY2VzcykpIHsNCi0gICAgLyogU2V0IHRoZSBSeCBJU1IgZnVuY3Rpb24gcG9pbnRlciBhY2NvcmRpbmcgdG8gdGhlIGRhdGEgd29yZCBsZW5ndGggKi8NCi0gICAgaWYgKChodWFydC0+SW5pdC5Xb3JkTGVuZ3RoID09IFVBUlRfV09SRExFTkdUSF85QikgJiYNCi0gICAgICAgIChodWFydC0+SW5pdC5QYXJpdHkgPT0gVUFSVF9QQVJJVFlfTk9ORSkpIHsNCi0gICAgICBodWFydC0+UnhJU1IgPSBVQVJUX1J4SVNSXzE2QklUX0ZJRk9FTjsNCi0gICAgfSBlbHNlIHsNCi0gICAgICBodWFydC0+UnhJU1IgPSBVQVJUX1J4SVNSXzhCSVRfRklGT0VOOw0KLSAgICB9DQotDQotICAgIF9fSEFMX1VOTE9DSyhodWFydCk7DQotDQotICAgIC8qIEVuYWJsZSB0aGUgVUFSVCBQYXJpdHkgRXJyb3IgaW50ZXJydXB0IGFuZCBSWCBGSUZPIFRocmVzaG9sZCBpbnRlcnJ1cHQgKi8NCi0gICAgaWYgKGh1YXJ0LT5Jbml0LlBhcml0eSAhPSBVQVJUX1BBUklUWV9OT05FKSB7DQotICAgICAgQVRPTUlDX1NFVF9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9QRUlFKTsNCi0gICAgfQ0KLSAgICBBVE9NSUNfU0VUX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX1JYRlRJRSk7DQotICB9IGVsc2Ugew0KLSAgICAvKiBTZXQgdGhlIFJ4IElTUiBmdW5jdGlvbiBwb2ludGVyIGFjY29yZGluZyB0byB0aGUgZGF0YSB3b3JkIGxlbmd0aCAqLw0KLSAgICBpZiAoKGh1YXJ0LT5Jbml0LldvcmRMZW5ndGggPT0gVUFSVF9XT1JETEVOR1RIXzlCKSAmJg0KLSAgICAgICAgKGh1YXJ0LT5Jbml0LlBhcml0eSA9PSBVQVJUX1BBUklUWV9OT05FKSkgew0KLSAgICAgIGh1YXJ0LT5SeElTUiA9IFVBUlRfUnhJU1JfMTZCSVQ7DQotICAgIH0gZWxzZSB7DQotICAgICAgaHVhcnQtPlJ4SVNSID0gVUFSVF9SeElTUl84QklUOw0KLSAgICB9DQotDQotICAgIF9fSEFMX1VOTE9DSyhodWFydCk7DQotDQotICAgIC8qIEVuYWJsZSB0aGUgVUFSVCBQYXJpdHkgRXJyb3IgaW50ZXJydXB0IGFuZCBEYXRhIFJlZ2lzdGVyIE5vdCBFbXB0eQ0KLSAgICAgKiBpbnRlcnJ1cHQgKi8NCi0gICAgaWYgKGh1YXJ0LT5Jbml0LlBhcml0eSAhPSBVQVJUX1BBUklUWV9OT05FKSB7DQotICAgICAgQVRPTUlDX1NFVF9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsDQotICAgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX1BFSUUgfCBVU0FSVF9DUjFfUlhORUlFX1JYRk5FSUUpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgIEFUT01JQ19TRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUlhORUlFX1JYRk5FSUUpOw0KLSAgICB9DQotICB9DQotICByZXR1cm4gSEFMX09LOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFN0YXJ0IFJlY2VpdmUgb3BlcmF0aW9uIGluIERNQSBtb2RlLg0KLSAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBjb3VsZCBiZSBjYWxsZWQgYnkgYWxsIEhBTCBVQVJUIEFQSSBwcm92aWRpbmcgcmVjZXB0aW9uDQotICogaW4gRE1BIG1vZGUuDQotICogQG5vdGUgICBXaGVuIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiwgcGFyYW1ldGVycyB2YWxpZGl0eSBpcyBjb25zaWRlcmVkIGFzDQotICogYWxyZWFkeSBjaGVja2VkLCBpLmUuIFJ4IFN0YXRlLCBidWZmZXIgYWRkcmVzcywgLi4uIFVBUlQgSGFuZGxlIGlzIGFzc3VtZWQgYXMNCi0gKiBMb2NrZWQuDQotICogQHBhcmFtICBodWFydCBVQVJUIGhhbmRsZS4NCi0gKiBAcGFyYW0gIHBEYXRhIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIgKHU4IG9yIHUxNiBkYXRhIGVsZW1lbnRzKS4NCi0gKiBAcGFyYW0gIFNpemUgIEFtb3VudCBvZiBkYXRhIGVsZW1lbnRzICh1OCBvciB1MTYpIHRvIGJlIHJlY2VpdmVkLg0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIFVBUlRfU3RhcnRfUmVjZWl2ZV9ETUEoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKSB7DQotICBodWFydC0+cFJ4QnVmZlB0ciA9IHBEYXRhOw0KLSAgaHVhcnQtPlJ4WGZlclNpemUgPSBTaXplOw0KLQ0KLSAgaHVhcnQtPkVycm9yQ29kZSA9IEhBTF9VQVJUX0VSUk9SX05PTkU7DQotICBodWFydC0+UnhTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX0JVU1lfUlg7DQotDQotICBpZiAoaHVhcnQtPmhkbWFyeCAhPSBOVUxMKSB7DQotICAgIC8qIFNldCB0aGUgVUFSVCBETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8NCi0gICAgaHVhcnQtPmhkbWFyeC0+WGZlckNwbHRDYWxsYmFjayA9IFVBUlRfRE1BUmVjZWl2ZUNwbHQ7DQotDQotICAgIC8qIFNldCB0aGUgVUFSVCBETUEgSGFsZiB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLw0KLSAgICBodWFydC0+aGRtYXJ4LT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFVBUlRfRE1BUnhIYWxmQ3BsdDsNCi0NCi0gICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8NCi0gICAgaHVhcnQtPmhkbWFyeC0+WGZlckVycm9yQ2FsbGJhY2sgPSBVQVJUX0RNQUVycm9yOw0KLQ0KLSAgICAvKiBTZXQgdGhlIERNQSBhYm9ydCBjYWxsYmFjayAqLw0KLSAgICBodWFydC0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7DQotDQotICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8NCi0gICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHVhcnQtPmhkbWFyeCwgKHVpbnQzMl90KSZodWFydC0+SW5zdGFuY2UtPlJEUiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KWh1YXJ0LT5wUnhCdWZmUHRyLCBTaXplKSAhPSBIQUxfT0spIHsNCi0gICAgICAvKiBTZXQgZXJyb3IgY29kZSB0byBETUEgKi8NCi0gICAgICBodWFydC0+RXJyb3JDb2RlID0gSEFMX1VBUlRfRVJST1JfRE1BOw0KLQ0KLSAgICAgIF9fSEFMX1VOTE9DSyhodWFydCk7DQotDQotICAgICAgLyogUmVzdG9yZSBodWFydC0+UnhTdGF0ZSB0byByZWFkeSAqLw0KLSAgICAgIGh1YXJ0LT5SeFN0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7DQotDQotICAgICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gICAgfQ0KLSAgfQ0KLSAgX19IQUxfVU5MT0NLKGh1YXJ0KTsNCi0NCi0gIC8qIEVuYWJsZSB0aGUgVUFSVCBQYXJpdHkgRXJyb3IgSW50ZXJydXB0ICovDQotICBpZiAoaHVhcnQtPkluaXQuUGFyaXR5ICE9IFVBUlRfUEFSSVRZX05PTkUpIHsNCi0gICAgQVRPTUlDX1NFVF9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9QRUlFKTsNCi0gIH0NCi0NCi0gIC8qIEVuYWJsZSB0aGUgVUFSVCBFcnJvciBJbnRlcnJ1cHQ6IChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpDQotICAgKi8NCi0gIEFUT01JQ19TRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsNCi0NCi0gIC8qIEVuYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGZvciB0aGUgcmVjZWl2ZXIgcmVxdWVzdCBieSBzZXR0aW5nIHRoZSBETUFSIGJpdA0KLSAgaW4gdGhlIFVBUlQgQ1IzIHJlZ2lzdGVyICovDQotICBBVE9NSUNfU0VUX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOw0KLQ0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmQgb25nb2luZyBUeCB0cmFuc2ZlciBvbiBVQVJUIHBlcmlwaGVyYWwgKGZvbGxvd2luZyBlcnJvciBkZXRlY3Rpb24NCi0gKiBvciBUcmFuc21pdCBjb21wbGV0aW9uKS4NCi0gKiBAcGFyYW0gIGh1YXJ0IFVBUlQgaGFuZGxlLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXN0YXRpYyB2b2lkIFVBUlRfRW5kVHhUcmFuc2ZlcihVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KSB7DQotICAvKiBEaXNhYmxlIFRYRUlFLCBUQ0lFLCBUWEZUIGludGVycnVwdHMgKi8NCi0gIEFUT01JQ19DTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsDQotICAgICAgICAgICAgICAgICAgIChVU0FSVF9DUjFfVFhFSUVfVFhGTkZJRSB8IFVTQVJUX0NSMV9UQ0lFKSk7DQotICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCAoVVNBUlRfQ1IzX1RYRlRJRSkpOw0KLQ0KLSAgLyogQXQgZW5kIG9mIFR4IHByb2Nlc3MsIHJlc3RvcmUgaHVhcnQtPmdTdGF0ZSB0byBSZWFkeSAqLw0KLSAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEVuZCBvbmdvaW5nIFJ4IHRyYW5zZmVyIG9uIFVBUlQgcGVyaXBoZXJhbCAoZm9sbG93aW5nIGVycm9yIGRldGVjdGlvbg0KLSAqIG9yIFJlY2VwdGlvbiBjb21wbGV0aW9uKS4NCi0gKiBAcGFyYW0gIGh1YXJ0IFVBUlQgaGFuZGxlLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXN0YXRpYyB2b2lkIFVBUlRfRW5kUnhUcmFuc2ZlcihVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KSB7DQotICAvKiBEaXNhYmxlIFJYTkUsIFBFIGFuZCBFUlIgKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikNCi0gICAqIGludGVycnVwdHMgKi8NCi0gIEFUT01JQ19DTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsDQotICAgICAgICAgICAgICAgICAgIChVU0FSVF9DUjFfUlhORUlFX1JYRk5FSUUgfCBVU0FSVF9DUjFfUEVJRSkpOw0KLSAgQVRPTUlDX0NMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgKFVTQVJUX0NSM19FSUUgfCBVU0FSVF9DUjNfUlhGVElFKSk7DQotDQotICAvKiBJbiBjYXNlIG9mIHJlY2VwdGlvbiB3YWl0aW5nIGZvciBJRExFIGV2ZW50LCBkaXNhYmxlIGFsc28gdGhlIElETEUgSUUNCi0gICAqIGludGVycnVwdCBzb3VyY2UgKi8NCi0gIGlmIChodWFydC0+UmVjZXB0aW9uVHlwZSA9PSBIQUxfVUFSVF9SRUNFUFRJT05fVE9JRExFKSB7DQotICAgIEFUT01JQ19DTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9JRExFSUUpOw0KLSAgfQ0KLQ0KLSAgLyogQXQgZW5kIG9mIFJ4IHByb2Nlc3MsIHJlc3RvcmUgaHVhcnQtPlJ4U3RhdGUgdG8gUmVhZHkgKi8NCi0gIGh1YXJ0LT5SeFN0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7DQotICBodWFydC0+UmVjZXB0aW9uVHlwZSA9IEhBTF9VQVJUX1JFQ0VQVElPTl9TVEFOREFSRDsNCi0NCi0gIC8qIFJlc2V0IFJ4SXNyIGZ1bmN0aW9uIHBvaW50ZXIgKi8NCi0gIGh1YXJ0LT5SeElTUiA9IE5VTEw7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBETUEgVUFSVCB0cmFuc21pdCBwcm9jZXNzIGNvbXBsZXRlIGNhbGxiYWNrLg0KLSAqIEBwYXJhbSBoZG1hIERNQSBoYW5kbGUuDQotICogQHJldHZhbCBOb25lDQotICovDQotc3RhdGljIHZvaWQgVUFSVF9ETUFUcmFuc21pdENwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpIHsNCi0gIFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQgPSAoVUFSVF9IYW5kbGVUeXBlRGVmICopKGhkbWEtPlBhcmVudCk7DQotDQotICAvKiBETUEgTm9ybWFsIG1vZGUgKi8NCi0gIGlmIChIQUxfSVNfQklUX0NMUihoZG1hLT5JbnN0YW5jZS0+Q0NSLCBETUFfQ0NSX0NJUkMpKSB7DQotICAgIGh1YXJ0LT5UeFhmZXJDb3VudCA9IDBVOw0KLQ0KLSAgICAvKiBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgZm9yIHRyYW5zbWl0IHJlcXVlc3QgYnkgcmVzZXR0aW5nIHRoZSBETUFUIGJpdA0KLSAgICAgICBpbiB0aGUgVUFSVCBDUjMgcmVnaXN0ZXIgKi8NCi0gICAgQVRPTUlDX0NMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOw0KLQ0KLSAgICAvKiBFbmFibGUgdGhlIFVBUlQgVHJhbnNtaXQgQ29tcGxldGUgSW50ZXJydXB0ICovDQotICAgIEFUT01JQ19TRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVENJRSk7DQotICB9DQotICAvKiBETUEgQ2lyY3VsYXIgbW9kZSAqLw0KLSAgZWxzZSB7DQotI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpDQotICAgIC8qQ2FsbCByZWdpc3RlcmVkIFR4IGNvbXBsZXRlIGNhbGxiYWNrKi8NCi0gICAgaHVhcnQtPlR4Q3BsdENhbGxiYWNrKGh1YXJ0KTsNCi0jZWxzZQ0KLSAgICAvKkNhbGwgbGVnYWN5IHdlYWsgVHggY29tcGxldGUgY2FsbGJhY2sqLw0KLSAgICBIQUxfVUFSVF9UeENwbHRDYWxsYmFjayhodWFydCk7DQotI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi0gIH0NCi19DQotDQotLyoqDQotICogQGJyaWVmIERNQSBVQVJUIHRyYW5zbWl0IHByb2Nlc3MgaGFsZiBjb21wbGV0ZSBjYWxsYmFjay4NCi0gKiBAcGFyYW0gaGRtYSBETUEgaGFuZGxlLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXN0YXRpYyB2b2lkIFVBUlRfRE1BVHhIYWxmQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkgew0KLSAgVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCA9IChVQVJUX0hhbmRsZVR5cGVEZWYgKikoaGRtYS0+UGFyZW50KTsNCi0NCi0jaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkNCi0gIC8qQ2FsbCByZWdpc3RlcmVkIFR4IEhhbGYgY29tcGxldGUgY2FsbGJhY2sqLw0KLSAgaHVhcnQtPlR4SGFsZkNwbHRDYWxsYmFjayhodWFydCk7DQotI2Vsc2UNCi0gIC8qQ2FsbCBsZWdhY3kgd2VhayBUeCBIYWxmIGNvbXBsZXRlIGNhbGxiYWNrKi8NCi0gIEhBTF9VQVJUX1R4SGFsZkNwbHRDYWxsYmFjayhodWFydCk7DQotI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi19DQotDQotLyoqDQotICogQGJyaWVmIERNQSBVQVJUIHJlY2VpdmUgcHJvY2VzcyBjb21wbGV0ZSBjYWxsYmFjay4NCi0gKiBAcGFyYW0gaGRtYSBETUEgaGFuZGxlLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXN0YXRpYyB2b2lkIFVBUlRfRE1BUmVjZWl2ZUNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpIHsNCi0gIFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQgPSAoVUFSVF9IYW5kbGVUeXBlRGVmICopKGhkbWEtPlBhcmVudCk7DQotDQotICAvKiBETUEgTm9ybWFsIG1vZGUgKi8NCi0gIGlmIChIQUxfSVNfQklUX0NMUihoZG1hLT5JbnN0YW5jZS0+Q0NSLCBETUFfQ0NSX0NJUkMpKSB7DQotICAgIGh1YXJ0LT5SeFhmZXJDb3VudCA9IDBVOw0KLQ0KLSAgICAvKiBEaXNhYmxlIFBFIGFuZCBFUlIgKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgaW50ZXJydXB0cw0KLSAgICAgKi8NCi0gICAgQVRPTUlDX0NMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1BFSUUpOw0KLSAgICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsNCi0NCi0gICAgLyogRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGZvciB0aGUgcmVjZWl2ZXIgcmVxdWVzdCBieSByZXNldHRpbmcgdGhlIERNQVINCi0gICAgICAgYml0IGluIHRoZSBVQVJUIENSMyByZWdpc3RlciAqLw0KLSAgICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7DQotDQotICAgIC8qIEF0IGVuZCBvZiBSeCBwcm9jZXNzLCByZXN0b3JlIGh1YXJ0LT5SeFN0YXRlIHRvIFJlYWR5ICovDQotICAgIGh1YXJ0LT5SeFN0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7DQotDQotICAgIC8qIElmIFJlY2VwdGlvbiB0aWxsIElETEUgZXZlbnQgaGFzIGJlZW4gc2VsZWN0ZWQsIERpc2FibGUgSURMRSBJbnRlcnJ1cHQgKi8NCi0gICAgaWYgKGh1YXJ0LT5SZWNlcHRpb25UeXBlID09IEhBTF9VQVJUX1JFQ0VQVElPTl9UT0lETEUpIHsNCi0gICAgICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfSURMRUlFKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgLyogQ2hlY2sgY3VycmVudCByZWNlcHRpb24gTW9kZSA6DQotICAgICBJZiBSZWNlcHRpb24gdGlsbCBJRExFIGV2ZW50IGhhcyBiZWVuIHNlbGVjdGVkIDogdXNlIFJ4IEV2ZW50IGNhbGxiYWNrICovDQotICBpZiAoaHVhcnQtPlJlY2VwdGlvblR5cGUgPT0gSEFMX1VBUlRfUkVDRVBUSU9OX1RPSURMRSkgew0KLSNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQ0KLSAgICAvKkNhbGwgcmVnaXN0ZXJlZCBSeCBFdmVudCBjYWxsYmFjayovDQotICAgIGh1YXJ0LT5SeEV2ZW50Q2FsbGJhY2soaHVhcnQsIGh1YXJ0LT5SeFhmZXJTaXplKTsNCi0jZWxzZQ0KLSAgICAvKkNhbGwgbGVnYWN5IHdlYWsgUnggRXZlbnQgY2FsbGJhY2sqLw0KLSAgICBIQUxfVUFSVEV4X1J4RXZlbnRDYWxsYmFjayhodWFydCwgaHVhcnQtPlJ4WGZlclNpemUpOw0KLSNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotICB9IGVsc2Ugew0KLSAgICAvKiBJbiBvdGhlciBjYXNlcyA6IHVzZSBSeCBDb21wbGV0ZSBjYWxsYmFjayAqLw0KLSNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQ0KLSAgICAvKkNhbGwgcmVnaXN0ZXJlZCBSeCBjb21wbGV0ZSBjYWxsYmFjayovDQotICAgIGh1YXJ0LT5SeENwbHRDYWxsYmFjayhodWFydCk7DQotI2Vsc2UNCi0gICAgLypDYWxsIGxlZ2FjeSB3ZWFrIFJ4IGNvbXBsZXRlIGNhbGxiYWNrKi8NCi0gICAgSEFMX1VBUlRfUnhDcGx0Q2FsbGJhY2soaHVhcnQpOw0KLSNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotICB9DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBETUEgVUFSVCByZWNlaXZlIHByb2Nlc3MgaGFsZiBjb21wbGV0ZSBjYWxsYmFjay4NCi0gKiBAcGFyYW0gaGRtYSBETUEgaGFuZGxlLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXN0YXRpYyB2b2lkIFVBUlRfRE1BUnhIYWxmQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkgew0KLSAgVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCA9IChVQVJUX0hhbmRsZVR5cGVEZWYgKikoaGRtYS0+UGFyZW50KTsNCi0NCi0gIC8qIENoZWNrIGN1cnJlbnQgcmVjZXB0aW9uIE1vZGUgOg0KLSAgICAgSWYgUmVjZXB0aW9uIHRpbGwgSURMRSBldmVudCBoYXMgYmVlbiBzZWxlY3RlZCA6IHVzZSBSeCBFdmVudCBjYWxsYmFjayAqLw0KLSAgaWYgKGh1YXJ0LT5SZWNlcHRpb25UeXBlID09IEhBTF9VQVJUX1JFQ0VQVElPTl9UT0lETEUpIHsNCi0jaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkNCi0gICAgLypDYWxsIHJlZ2lzdGVyZWQgUnggRXZlbnQgY2FsbGJhY2sqLw0KLSAgICBodWFydC0+UnhFdmVudENhbGxiYWNrKGh1YXJ0LCBodWFydC0+UnhYZmVyU2l6ZSAvIDJVKTsNCi0jZWxzZQ0KLSAgICAvKkNhbGwgbGVnYWN5IHdlYWsgUnggRXZlbnQgY2FsbGJhY2sqLw0KLSAgICBIQUxfVUFSVEV4X1J4RXZlbnRDYWxsYmFjayhodWFydCwgaHVhcnQtPlJ4WGZlclNpemUgLyAyVSk7DQotI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi0gIH0gZWxzZSB7DQotICAgIC8qIEluIG90aGVyIGNhc2VzIDogdXNlIFJ4IEhhbGYgQ29tcGxldGUgY2FsbGJhY2sgKi8NCi0jaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkNCi0gICAgLypDYWxsIHJlZ2lzdGVyZWQgUnggSGFsZiBjb21wbGV0ZSBjYWxsYmFjayovDQotICAgIGh1YXJ0LT5SeEhhbGZDcGx0Q2FsbGJhY2soaHVhcnQpOw0KLSNlbHNlDQotICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBSeCBIYWxmIGNvbXBsZXRlIGNhbGxiYWNrKi8NCi0gICAgSEFMX1VBUlRfUnhIYWxmQ3BsdENhbGxiYWNrKGh1YXJ0KTsNCi0jZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgRE1BIFVBUlQgY29tbXVuaWNhdGlvbiBlcnJvciBjYWxsYmFjay4NCi0gKiBAcGFyYW0gaGRtYSBETUEgaGFuZGxlLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXN0YXRpYyB2b2lkIFVBUlRfRE1BRXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpIHsNCi0gIFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQgPSAoVUFSVF9IYW5kbGVUeXBlRGVmICopKGhkbWEtPlBhcmVudCk7DQotDQotICBjb25zdCBIQUxfVUFSVF9TdGF0ZVR5cGVEZWYgZ3N0YXRlID0gaHVhcnQtPmdTdGF0ZTsNCi0gIGNvbnN0IEhBTF9VQVJUX1N0YXRlVHlwZURlZiByeHN0YXRlID0gaHVhcnQtPlJ4U3RhdGU7DQotDQotICAvKiBTdG9wIFVBUlQgRE1BIFR4IHJlcXVlc3QgaWYgb25nb2luZyAqLw0KLSAgaWYgKChIQUxfSVNfQklUX1NFVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpKSAmJg0KLSAgICAgIChnc3RhdGUgPT0gSEFMX1VBUlRfU1RBVEVfQlVTWV9UWCkpIHsNCi0gICAgaHVhcnQtPlR4WGZlckNvdW50ID0gMFU7DQotICAgIFVBUlRfRW5kVHhUcmFuc2ZlcihodWFydCk7DQotICB9DQotDQotICAvKiBTdG9wIFVBUlQgRE1BIFJ4IHJlcXVlc3QgaWYgb25nb2luZyAqLw0KLSAgaWYgKChIQUxfSVNfQklUX1NFVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpKSAmJg0KLSAgICAgIChyeHN0YXRlID09IEhBTF9VQVJUX1NUQVRFX0JVU1lfUlgpKSB7DQotICAgIGh1YXJ0LT5SeFhmZXJDb3VudCA9IDBVOw0KLSAgICBVQVJUX0VuZFJ4VHJhbnNmZXIoaHVhcnQpOw0KLSAgfQ0KLQ0KLSAgaHVhcnQtPkVycm9yQ29kZSB8PSBIQUxfVUFSVF9FUlJPUl9ETUE7DQotDQotI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpDQotICAvKkNhbGwgcmVnaXN0ZXJlZCBlcnJvciBjYWxsYmFjayovDQotICBodWFydC0+RXJyb3JDYWxsYmFjayhodWFydCk7DQotI2Vsc2UNCi0gIC8qQ2FsbCBsZWdhY3kgd2VhayBlcnJvciBjYWxsYmFjayovDQotICBIQUxfVUFSVF9FcnJvckNhbGxiYWNrKGh1YXJ0KTsNCi0jZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERNQSBVQVJUIGNvbW11bmljYXRpb24gYWJvcnQgY2FsbGJhY2ssIHdoZW4gaW5pdGlhdGVkIGJ5IEhBTCBzZXJ2aWNlcw0KLSAqIG9uIEVycm9yIChUbyBiZSBjYWxsZWQgYXQgZW5kIG9mIERNQSBBYm9ydCBwcm9jZWR1cmUgZm9sbG93aW5nIGVycm9yDQotICogb2NjdXJyZW5jZSkuDQotICogQHBhcmFtICBoZG1hIERNQSBoYW5kbGUuDQotICogQHJldHZhbCBOb25lDQotICovDQotc3RhdGljIHZvaWQgVUFSVF9ETUFBYm9ydE9uRXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpIHsNCi0gIFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQgPSAoVUFSVF9IYW5kbGVUeXBlRGVmICopKGhkbWEtPlBhcmVudCk7DQotICBodWFydC0+UnhYZmVyQ291bnQgPSAwVTsNCi0gIGh1YXJ0LT5UeFhmZXJDb3VudCA9IDBVOw0KLQ0KLSNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQ0KLSAgLypDYWxsIHJlZ2lzdGVyZWQgZXJyb3IgY2FsbGJhY2sqLw0KLSAgaHVhcnQtPkVycm9yQ2FsbGJhY2soaHVhcnQpOw0KLSNlbHNlDQotICAvKkNhbGwgbGVnYWN5IHdlYWsgZXJyb3IgY2FsbGJhY2sqLw0KLSAgSEFMX1VBUlRfRXJyb3JDYWxsYmFjayhodWFydCk7DQotI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi19DQotDQotLyoqDQotICogQGJyaWVmICBETUEgVUFSVCBUeCBjb21tdW5pY2F0aW9uIGFib3J0IGNhbGxiYWNrLCB3aGVuIGluaXRpYXRlZCBieSB1c2VyDQotICogICAgICAgICAoVG8gYmUgY2FsbGVkIGF0IGVuZCBvZiBETUEgVHggQWJvcnQgcHJvY2VkdXJlIGZvbGxvd2luZyB1c2VyIGFib3J0DQotICogcmVxdWVzdCkuDQotICogQG5vdGUgICBXaGVuIHRoaXMgY2FsbGJhY2sgaXMgZXhlY3V0ZWQsIFVzZXIgQWJvcnQgY29tcGxldGUgY2FsbCBiYWNrIGlzDQotICogY2FsbGVkIG9ubHkgaWYgbm8gQWJvcnQgc3RpbGwgb25nb2luZyBmb3IgUnggRE1BIEhhbmRsZS4NCi0gKiBAcGFyYW0gIGhkbWEgRE1BIGhhbmRsZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1zdGF0aWMgdm9pZCBVQVJUX0RNQVR4QWJvcnRDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkgew0KLSAgVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCA9IChVQVJUX0hhbmRsZVR5cGVEZWYgKikoaGRtYS0+UGFyZW50KTsNCi0NCi0gIGh1YXJ0LT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsNCi0NCi0gIC8qIENoZWNrIGlmIGFuIEFib3J0IHByb2Nlc3MgaXMgc3RpbGwgb25nb2luZyAqLw0KLSAgaWYgKGh1YXJ0LT5oZG1hcnggIT0gTlVMTCkgew0KLSAgICBpZiAoaHVhcnQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgIT0gTlVMTCkgew0KLSAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgLyogTm8gQWJvcnQgcHJvY2VzcyBzdGlsbCBvbmdvaW5nIDogQWxsIERNQSBjaGFubmVscyBhcmUgYWJvcnRlZCwgY2FsbCB1c2VyDQotICAgKiBBYm9ydCBDb21wbGV0ZSBjYWxsYmFjayAqLw0KLSAgaHVhcnQtPlR4WGZlckNvdW50ID0gMFU7DQotICBodWFydC0+UnhYZmVyQ291bnQgPSAwVTsNCi0NCi0gIC8qIFJlc2V0IGVycm9yQ29kZSAqLw0KLSAgaHVhcnQtPkVycm9yQ29kZSA9IEhBTF9VQVJUX0VSUk9SX05PTkU7DQotDQotICAvKiBDbGVhciB0aGUgRXJyb3IgZmxhZ3MgaW4gdGhlIElDUiByZWdpc3RlciAqLw0KLSAgX19IQUxfVUFSVF9DTEVBUl9GTEFHKGh1YXJ0LCBVQVJUX0NMRUFSX09SRUYgfCBVQVJUX0NMRUFSX05FRiB8DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQVJUX0NMRUFSX1BFRiB8IFVBUlRfQ0xFQVJfRkVGKTsNCi0NCi0gIC8qIEZsdXNoIHRoZSB3aG9sZSBUWCBGSUZPIChpZiBuZWVkZWQpICovDQotICBpZiAoaHVhcnQtPkZpZm9Nb2RlID09IFVBUlRfRklGT01PREVfRU5BQkxFKSB7DQotICAgIF9fSEFMX1VBUlRfU0VORF9SRVEoaHVhcnQsIFVBUlRfVFhEQVRBX0ZMVVNIX1JFUVVFU1QpOw0KLSAgfQ0KLQ0KLSAgLyogUmVzdG9yZSBodWFydC0+Z1N0YXRlIGFuZCBodWFydC0+UnhTdGF0ZSB0byBSZWFkeSAqLw0KLSAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOw0KLSAgaHVhcnQtPlJ4U3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsNCi0gIGh1YXJ0LT5SZWNlcHRpb25UeXBlID0gSEFMX1VBUlRfUkVDRVBUSU9OX1NUQU5EQVJEOw0KLQ0KLSAgLyogQ2FsbCB1c2VyIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovDQotI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpDQotICAvKiBDYWxsIHJlZ2lzdGVyZWQgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8NCi0gIGh1YXJ0LT5BYm9ydENwbHRDYWxsYmFjayhodWFydCk7DQotI2Vsc2UNCi0gIC8qIENhbGwgbGVnYWN5IHdlYWsgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8NCi0gIEhBTF9VQVJUX0Fib3J0Q3BsdENhbGxiYWNrKGh1YXJ0KTsNCi0jZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERNQSBVQVJUIFJ4IGNvbW11bmljYXRpb24gYWJvcnQgY2FsbGJhY2ssIHdoZW4gaW5pdGlhdGVkIGJ5IHVzZXINCi0gKiAgICAgICAgIChUbyBiZSBjYWxsZWQgYXQgZW5kIG9mIERNQSBSeCBBYm9ydCBwcm9jZWR1cmUgZm9sbG93aW5nIHVzZXIgYWJvcnQNCi0gKiByZXF1ZXN0KS4NCi0gKiBAbm90ZSAgIFdoZW4gdGhpcyBjYWxsYmFjayBpcyBleGVjdXRlZCwgVXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsIGJhY2sgaXMNCi0gKiBjYWxsZWQgb25seSBpZiBubyBBYm9ydCBzdGlsbCBvbmdvaW5nIGZvciBUeCBETUEgSGFuZGxlLg0KLSAqIEBwYXJhbSAgaGRtYSBETUEgaGFuZGxlLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXN0YXRpYyB2b2lkIFVBUlRfRE1BUnhBYm9ydENhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKSB7DQotICBVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0ID0gKFVBUlRfSGFuZGxlVHlwZURlZiAqKShoZG1hLT5QYXJlbnQpOw0KLQ0KLSAgaHVhcnQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOw0KLQ0KLSAgLyogQ2hlY2sgaWYgYW4gQWJvcnQgcHJvY2VzcyBpcyBzdGlsbCBvbmdvaW5nICovDQotICBpZiAoaHVhcnQtPmhkbWF0eCAhPSBOVUxMKSB7DQotICAgIGlmIChodWFydC0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayAhPSBOVUxMKSB7DQotICAgICAgcmV0dXJuOw0KLSAgICB9DQotICB9DQotDQotICAvKiBObyBBYm9ydCBwcm9jZXNzIHN0aWxsIG9uZ29pbmcgOiBBbGwgRE1BIGNoYW5uZWxzIGFyZSBhYm9ydGVkLCBjYWxsIHVzZXINCi0gICAqIEFib3J0IENvbXBsZXRlIGNhbGxiYWNrICovDQotICBodWFydC0+VHhYZmVyQ291bnQgPSAwVTsNCi0gIGh1YXJ0LT5SeFhmZXJDb3VudCA9IDBVOw0KLQ0KLSAgLyogUmVzZXQgZXJyb3JDb2RlICovDQotICBodWFydC0+RXJyb3JDb2RlID0gSEFMX1VBUlRfRVJST1JfTk9ORTsNCi0NCi0gIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovDQotICBfX0hBTF9VQVJUX0NMRUFSX0ZMQUcoaHVhcnQsIFVBUlRfQ0xFQVJfT1JFRiB8IFVBUlRfQ0xFQVJfTkVGIHwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVBUlRfQ0xFQVJfUEVGIHwgVUFSVF9DTEVBUl9GRUYpOw0KLQ0KLSAgLyogRGlzY2FyZCB0aGUgcmVjZWl2ZWQgZGF0YSAqLw0KLSAgX19IQUxfVUFSVF9TRU5EX1JFUShodWFydCwgVUFSVF9SWERBVEFfRkxVU0hfUkVRVUVTVCk7DQotDQotICAvKiBSZXN0b3JlIGh1YXJ0LT5nU3RhdGUgYW5kIGh1YXJ0LT5SeFN0YXRlIHRvIFJlYWR5ICovDQotICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7DQotICBodWFydC0+UnhTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOw0KLSAgaHVhcnQtPlJlY2VwdGlvblR5cGUgPSBIQUxfVUFSVF9SRUNFUFRJT05fU1RBTkRBUkQ7DQotDQotICAvKiBDYWxsIHVzZXIgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8NCi0jaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkNCi0gIC8qIENhbGwgcmVnaXN0ZXJlZCBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLw0KLSAgaHVhcnQtPkFib3J0Q3BsdENhbGxiYWNrKGh1YXJ0KTsNCi0jZWxzZQ0KLSAgLyogQ2FsbCBsZWdhY3kgd2VhayBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLw0KLSAgSEFMX1VBUlRfQWJvcnRDcGx0Q2FsbGJhY2soaHVhcnQpOw0KLSNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRE1BIFVBUlQgVHggY29tbXVuaWNhdGlvbiBhYm9ydCBjYWxsYmFjaywgd2hlbiBpbml0aWF0ZWQgYnkgdXNlciBieSBhDQotICogY2FsbCB0byBIQUxfVUFSVF9BYm9ydFRyYW5zbWl0X0lUIEFQSSAoQWJvcnQgb25seSBUeCB0cmFuc2ZlcikgKFRoaXMgY2FsbGJhY2sNCi0gKiBpcyBleGVjdXRlZCBhdCBlbmQgb2YgRE1BIFR4IEFib3J0IHByb2NlZHVyZSBmb2xsb3dpbmcgdXNlciBhYm9ydCByZXF1ZXN0LA0KLSAqICAgICAgICAgYW5kIGxlYWRzIHRvIHVzZXIgVHggQWJvcnQgQ29tcGxldGUgY2FsbGJhY2sgZXhlY3V0aW9uKS4NCi0gKiBAcGFyYW0gIGhkbWEgRE1BIGhhbmRsZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1zdGF0aWMgdm9pZCBVQVJUX0RNQVR4T25seUFib3J0Q2FsbGJhY2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpIHsNCi0gIFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQgPSAoVUFSVF9IYW5kbGVUeXBlRGVmICopKGhkbWEtPlBhcmVudCk7DQotDQotICBodWFydC0+VHhYZmVyQ291bnQgPSAwVTsNCi0NCi0gIC8qIEZsdXNoIHRoZSB3aG9sZSBUWCBGSUZPIChpZiBuZWVkZWQpICovDQotICBpZiAoaHVhcnQtPkZpZm9Nb2RlID09IFVBUlRfRklGT01PREVfRU5BQkxFKSB7DQotICAgIF9fSEFMX1VBUlRfU0VORF9SRVEoaHVhcnQsIFVBUlRfVFhEQVRBX0ZMVVNIX1JFUVVFU1QpOw0KLSAgfQ0KLQ0KLSAgLyogUmVzdG9yZSBodWFydC0+Z1N0YXRlIHRvIFJlYWR5ICovDQotICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7DQotDQotICAvKiBDYWxsIHVzZXIgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8NCi0jaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkNCi0gIC8qIENhbGwgcmVnaXN0ZXJlZCBBYm9ydCBUcmFuc21pdCBDb21wbGV0ZSBDYWxsYmFjayAqLw0KLSAgaHVhcnQtPkFib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2soaHVhcnQpOw0KLSNlbHNlDQotICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIEFib3J0IFRyYW5zbWl0IENvbXBsZXRlIENhbGxiYWNrICovDQotICBIQUxfVUFSVF9BYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrKGh1YXJ0KTsNCi0jZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERNQSBVQVJUIFJ4IGNvbW11bmljYXRpb24gYWJvcnQgY2FsbGJhY2ssIHdoZW4gaW5pdGlhdGVkIGJ5IHVzZXIgYnkgYQ0KLSAqIGNhbGwgdG8gSEFMX1VBUlRfQWJvcnRSZWNlaXZlX0lUIEFQSSAoQWJvcnQgb25seSBSeCB0cmFuc2ZlcikgKFRoaXMgY2FsbGJhY2sNCi0gKiBpcyBleGVjdXRlZCBhdCBlbmQgb2YgRE1BIFJ4IEFib3J0IHByb2NlZHVyZSBmb2xsb3dpbmcgdXNlciBhYm9ydCByZXF1ZXN0LA0KLSAqICAgICAgICAgYW5kIGxlYWRzIHRvIHVzZXIgUnggQWJvcnQgQ29tcGxldGUgY2FsbGJhY2sgZXhlY3V0aW9uKS4NCi0gKiBAcGFyYW0gIGhkbWEgRE1BIGhhbmRsZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1zdGF0aWMgdm9pZCBVQVJUX0RNQVJ4T25seUFib3J0Q2FsbGJhY2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpIHsNCi0gIFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQgPQ0KLSAgICAgIChVQVJUX0hhbmRsZVR5cGVEZWYgKikoKERNQV9IYW5kbGVUeXBlRGVmICopaGRtYSktPlBhcmVudDsNCi0NCi0gIGh1YXJ0LT5SeFhmZXJDb3VudCA9IDBVOw0KLQ0KLSAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8NCi0gIF9fSEFMX1VBUlRfQ0xFQVJfRkxBRyhodWFydCwgVUFSVF9DTEVBUl9PUkVGIHwgVUFSVF9DTEVBUl9ORUYgfA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUFSVF9DTEVBUl9QRUYgfCBVQVJUX0NMRUFSX0ZFRik7DQotDQotICAvKiBEaXNjYXJkIHRoZSByZWNlaXZlZCBkYXRhICovDQotICBfX0hBTF9VQVJUX1NFTkRfUkVRKGh1YXJ0LCBVQVJUX1JYREFUQV9GTFVTSF9SRVFVRVNUKTsNCi0NCi0gIC8qIFJlc3RvcmUgaHVhcnQtPlJ4U3RhdGUgdG8gUmVhZHkgKi8NCi0gIGh1YXJ0LT5SeFN0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7DQotICBodWFydC0+UmVjZXB0aW9uVHlwZSA9IEhBTF9VQVJUX1JFQ0VQVElPTl9TVEFOREFSRDsNCi0NCi0gIC8qIENhbGwgdXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLw0KLSNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQ0KLSAgLyogQ2FsbCByZWdpc3RlcmVkIEFib3J0IFJlY2VpdmUgQ29tcGxldGUgQ2FsbGJhY2sgKi8NCi0gIGh1YXJ0LT5BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2soaHVhcnQpOw0KLSNlbHNlDQotICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIEFib3J0IFJlY2VpdmUgQ29tcGxldGUgQ2FsbGJhY2sgKi8NCi0gIEhBTF9VQVJUX0Fib3J0UmVjZWl2ZUNwbHRDYWxsYmFjayhodWFydCk7DQotI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi19DQotDQotLyoqDQotICogQGJyaWVmIFRYIGludGVycnVwdCBoYW5kbGVyIGZvciA3IG9yIDggYml0cyBkYXRhIHdvcmQgbGVuZ3RoIC4NCi0gKiBAbm90ZSAgIEZ1bmN0aW9uIGlzIGNhbGxlZCB1bmRlciBpbnRlcnJ1cHRpb24gb25seSwgb25jZQ0KLSAqICAgICAgICAgaW50ZXJydXB0aW9ucyBoYXZlIGJlZW4gZW5hYmxlZCBieSBIQUxfVUFSVF9UcmFuc21pdF9JVCgpLg0KLSAqIEBwYXJhbSBodWFydCBVQVJUIGhhbmRsZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1zdGF0aWMgdm9pZCBVQVJUX1R4SVNSXzhCSVQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkgew0KLSAgLyogQ2hlY2sgdGhhdCBhIFR4IHByb2Nlc3MgaXMgb25nb2luZyAqLw0KLSAgaWYgKGh1YXJ0LT5nU3RhdGUgPT0gSEFMX1VBUlRfU1RBVEVfQlVTWV9UWCkgew0KLSAgICBpZiAoaHVhcnQtPlR4WGZlckNvdW50ID09IDBVKSB7DQotICAgICAgLyogRGlzYWJsZSB0aGUgVUFSVCBUcmFuc21pdCBEYXRhIFJlZ2lzdGVyIEVtcHR5IEludGVycnVwdCAqLw0KLSAgICAgIEFUT01JQ19DTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9UWEVJRV9UWEZORklFKTsNCi0NCi0gICAgICAvKiBFbmFibGUgdGhlIFVBUlQgVHJhbnNtaXQgQ29tcGxldGUgSW50ZXJydXB0ICovDQotICAgICAgQVRPTUlDX1NFVF9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9UQ0lFKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICBodWFydC0+SW5zdGFuY2UtPlREUiA9ICh1aW50OF90KSgqaHVhcnQtPnBUeEJ1ZmZQdHIgJiAodWludDhfdCkweEZGKTsNCi0gICAgICBodWFydC0+cFR4QnVmZlB0cisrOw0KLSAgICAgIGh1YXJ0LT5UeFhmZXJDb3VudC0tOw0KLSAgICB9DQotICB9DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBUWCBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgOSBiaXRzIGRhdGEgd29yZCBsZW5ndGguDQotICogQG5vdGUgICBGdW5jdGlvbiBpcyBjYWxsZWQgdW5kZXIgaW50ZXJydXB0aW9uIG9ubHksIG9uY2UNCi0gKiAgICAgICAgIGludGVycnVwdGlvbnMgaGF2ZSBiZWVuIGVuYWJsZWQgYnkgSEFMX1VBUlRfVHJhbnNtaXRfSVQoKS4NCi0gKiBAcGFyYW0gaHVhcnQgVUFSVCBoYW5kbGUuDQotICogQHJldHZhbCBOb25lDQotICovDQotc3RhdGljIHZvaWQgVUFSVF9UeElTUl8xNkJJVChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KSB7DQotICBjb25zdCB1aW50MTZfdCAqdG1wOw0KLQ0KLSAgLyogQ2hlY2sgdGhhdCBhIFR4IHByb2Nlc3MgaXMgb25nb2luZyAqLw0KLSAgaWYgKGh1YXJ0LT5nU3RhdGUgPT0gSEFMX1VBUlRfU1RBVEVfQlVTWV9UWCkgew0KLSAgICBpZiAoaHVhcnQtPlR4WGZlckNvdW50ID09IDBVKSB7DQotICAgICAgLyogRGlzYWJsZSB0aGUgVUFSVCBUcmFuc21pdCBEYXRhIFJlZ2lzdGVyIEVtcHR5IEludGVycnVwdCAqLw0KLSAgICAgIEFUT01JQ19DTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9UWEVJRV9UWEZORklFKTsNCi0NCi0gICAgICAvKiBFbmFibGUgdGhlIFVBUlQgVHJhbnNtaXQgQ29tcGxldGUgSW50ZXJydXB0ICovDQotICAgICAgQVRPTUlDX1NFVF9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9UQ0lFKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICB0bXAgPSAoY29uc3QgdWludDE2X3QgKilodWFydC0+cFR4QnVmZlB0cjsNCi0gICAgICBodWFydC0+SW5zdGFuY2UtPlREUiA9ICgoKHVpbnQzMl90KSgqdG1wKSkgJiAweDAxRkZVTCk7DQotICAgICAgaHVhcnQtPnBUeEJ1ZmZQdHIgKz0gMlU7DQotICAgICAgaHVhcnQtPlR4WGZlckNvdW50LS07DQotICAgIH0NCi0gIH0NCi19DQotDQotLyoqDQotICogQGJyaWVmIFRYIGludGVycnVwdCBoYW5kbGVyIGZvciA3IG9yIDggYml0cyBkYXRhIHdvcmQgbGVuZ3RoIGFuZCBGSUZPIG1vZGUgaXMNCi0gKiBlbmFibGVkLg0KLSAqIEBub3RlICAgRnVuY3Rpb24gaXMgY2FsbGVkIHVuZGVyIGludGVycnVwdGlvbiBvbmx5LCBvbmNlDQotICogICAgICAgICBpbnRlcnJ1cHRpb25zIGhhdmUgYmVlbiBlbmFibGVkIGJ5IEhBTF9VQVJUX1RyYW5zbWl0X0lUKCkuDQotICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXN0YXRpYyB2b2lkIFVBUlRfVHhJU1JfOEJJVF9GSUZPRU4oVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkgew0KLSAgdWludDE2X3QgbmJfdHhfZGF0YTsNCi0NCi0gIC8qIENoZWNrIHRoYXQgYSBUeCBwcm9jZXNzIGlzIG9uZ29pbmcgKi8NCi0gIGlmIChodWFydC0+Z1N0YXRlID09IEhBTF9VQVJUX1NUQVRFX0JVU1lfVFgpIHsNCi0gICAgZm9yIChuYl90eF9kYXRhID0gaHVhcnQtPk5iVHhEYXRhVG9Qcm9jZXNzOyBuYl90eF9kYXRhID4gMFU7IG5iX3R4X2RhdGEtLSkgew0KLSAgICAgIGlmIChodWFydC0+VHhYZmVyQ291bnQgPT0gMFUpIHsNCi0gICAgICAgIC8qIERpc2FibGUgdGhlIFRYIEZJRk8gdGhyZXNob2xkIGludGVycnVwdCAqLw0KLSAgICAgICAgQVRPTUlDX0NMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX1RYRlRJRSk7DQotDQotICAgICAgICAvKiBFbmFibGUgdGhlIFVBUlQgVHJhbnNtaXQgQ29tcGxldGUgSW50ZXJydXB0ICovDQotICAgICAgICBBVE9NSUNfU0VUX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1RDSUUpOw0KLQ0KLSAgICAgICAgYnJlYWs7IC8qIGZvcmNlIGV4aXQgbG9vcCAqLw0KLSAgICAgIH0gZWxzZSBpZiAoUkVBRF9CSVQoaHVhcnQtPkluc3RhbmNlLT5JU1IsIFVTQVJUX0lTUl9UWEVfVFhGTkYpICE9IDBVKSB7DQotICAgICAgICBodWFydC0+SW5zdGFuY2UtPlREUiA9ICh1aW50OF90KSgqaHVhcnQtPnBUeEJ1ZmZQdHIgJiAodWludDhfdCkweEZGKTsNCi0gICAgICAgIGh1YXJ0LT5wVHhCdWZmUHRyKys7DQotICAgICAgICBodWFydC0+VHhYZmVyQ291bnQtLTsNCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgLyogTm90aGluZyB0byBkbyAqLw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgVFggaW50ZXJydXB0IGhhbmRsZXIgZm9yIDkgYml0cyBkYXRhIHdvcmQgbGVuZ3RoIGFuZCBGSUZPIG1vZGUgaXMNCi0gKiBlbmFibGVkLg0KLSAqIEBub3RlICAgRnVuY3Rpb24gaXMgY2FsbGVkIHVuZGVyIGludGVycnVwdGlvbiBvbmx5LCBvbmNlDQotICogICAgICAgICBpbnRlcnJ1cHRpb25zIGhhdmUgYmVlbiBlbmFibGVkIGJ5IEhBTF9VQVJUX1RyYW5zbWl0X0lUKCkuDQotICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXN0YXRpYyB2b2lkIFVBUlRfVHhJU1JfMTZCSVRfRklGT0VOKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpIHsNCi0gIGNvbnN0IHVpbnQxNl90ICp0bXA7DQotICB1aW50MTZfdCBuYl90eF9kYXRhOw0KLQ0KLSAgLyogQ2hlY2sgdGhhdCBhIFR4IHByb2Nlc3MgaXMgb25nb2luZyAqLw0KLSAgaWYgKGh1YXJ0LT5nU3RhdGUgPT0gSEFMX1VBUlRfU1RBVEVfQlVTWV9UWCkgew0KLSAgICBmb3IgKG5iX3R4X2RhdGEgPSBodWFydC0+TmJUeERhdGFUb1Byb2Nlc3M7IG5iX3R4X2RhdGEgPiAwVTsgbmJfdHhfZGF0YS0tKSB7DQotICAgICAgaWYgKGh1YXJ0LT5UeFhmZXJDb3VudCA9PSAwVSkgew0KLSAgICAgICAgLyogRGlzYWJsZSB0aGUgVFggRklGTyB0aHJlc2hvbGQgaW50ZXJydXB0ICovDQotICAgICAgICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfVFhGVElFKTsNCi0NCi0gICAgICAgIC8qIEVuYWJsZSB0aGUgVUFSVCBUcmFuc21pdCBDb21wbGV0ZSBJbnRlcnJ1cHQgKi8NCi0gICAgICAgIEFUT01JQ19TRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVENJRSk7DQotDQotICAgICAgICBicmVhazsgLyogZm9yY2UgZXhpdCBsb29wICovDQotICAgICAgfSBlbHNlIGlmIChSRUFEX0JJVChodWFydC0+SW5zdGFuY2UtPklTUiwgVVNBUlRfSVNSX1RYRV9UWEZORikgIT0gMFUpIHsNCi0gICAgICAgIHRtcCA9IChjb25zdCB1aW50MTZfdCAqKWh1YXJ0LT5wVHhCdWZmUHRyOw0KLSAgICAgICAgaHVhcnQtPkluc3RhbmNlLT5URFIgPSAoKCh1aW50MzJfdCkoKnRtcCkpICYgMHgwMUZGVUwpOw0KLSAgICAgICAgaHVhcnQtPnBUeEJ1ZmZQdHIgKz0gMlU7DQotICAgICAgICBodWFydC0+VHhYZmVyQ291bnQtLTsNCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgLyogTm90aGluZyB0byBkbyAqLw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFdyYXAgdXAgdHJhbnNtaXNzaW9uIGluIG5vbi1ibG9ja2luZyBtb2RlLg0KLSAqIEBwYXJhbSAgaHVhcnQgcG9pbnRlciB0byBhIFVBUlRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KLSAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFVBUlQgbW9kdWxlLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXN0YXRpYyB2b2lkIFVBUlRfRW5kVHJhbnNtaXRfSVQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkgew0KLSAgLyogRGlzYWJsZSB0aGUgVUFSVCBUcmFuc21pdCBDb21wbGV0ZSBJbnRlcnJ1cHQgKi8NCi0gIEFUT01JQ19DTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9UQ0lFKTsNCi0NCi0gIC8qIFR4IHByb2Nlc3MgaXMgZW5kZWQsIHJlc3RvcmUgaHVhcnQtPmdTdGF0ZSB0byBSZWFkeSAqLw0KLSAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOw0KLQ0KLSAgLyogQ2xlYXQgVHhJU1IgZnVuY3Rpb24gcG9pbnRlciAqLw0KLSAgaHVhcnQtPlR4SVNSID0gTlVMTDsNCi0NCi0jaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkNCi0gIC8qQ2FsbCByZWdpc3RlcmVkIFR4IGNvbXBsZXRlIGNhbGxiYWNrKi8NCi0gIGh1YXJ0LT5UeENwbHRDYWxsYmFjayhodWFydCk7DQotI2Vsc2UNCi0gIC8qQ2FsbCBsZWdhY3kgd2VhayBUeCBjb21wbGV0ZSBjYWxsYmFjayovDQotICBIQUxfVUFSVF9UeENwbHRDYWxsYmFjayhodWFydCk7DQotI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi19DQotDQotLyoqDQotICogQGJyaWVmIFJYIGludGVycnVwdCBoYW5kbGVyIGZvciA3IG9yIDggYml0cyBkYXRhIHdvcmQgbGVuZ3RoIC4NCi0gKiBAcGFyYW0gaHVhcnQgVUFSVCBoYW5kbGUuDQotICogQHJldHZhbCBOb25lDQotICovDQotc3RhdGljIHZvaWQgVUFSVF9SeElTUl84QklUKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpIHsNCi0gIHVpbnQxNl90IHVoTWFzayA9IGh1YXJ0LT5NYXNrOw0KLSAgdWludDE2X3QgdWhkYXRhOw0KLQ0KLSAgLyogQ2hlY2sgdGhhdCBhIFJ4IHByb2Nlc3MgaXMgb25nb2luZyAqLw0KLSAgaWYgKGh1YXJ0LT5SeFN0YXRlID09IEhBTF9VQVJUX1NUQVRFX0JVU1lfUlgpIHsNCi0gICAgdWhkYXRhID0gKHVpbnQxNl90KVJFQURfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+UkRSKTsNCi0gICAgKmh1YXJ0LT5wUnhCdWZmUHRyID0gKHVpbnQ4X3QpKHVoZGF0YSAmICh1aW50OF90KXVoTWFzayk7DQotICAgIGh1YXJ0LT5wUnhCdWZmUHRyKys7DQotICAgIGh1YXJ0LT5SeFhmZXJDb3VudC0tOw0KLQ0KLSAgICBpZiAoaHVhcnQtPlJ4WGZlckNvdW50ID09IDBVKSB7DQotICAgICAgLyogRGlzYWJsZSB0aGUgVUFSVCBQYXJpdHkgRXJyb3IgSW50ZXJydXB0IGFuZCBSWE5FIGludGVycnVwdHMgKi8NCi0gICAgICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLA0KLSAgICAgICAgICAgICAgICAgICAgICAgKFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSB8IFVTQVJUX0NSMV9QRUlFKSk7DQotDQotICAgICAgLyogRGlzYWJsZSB0aGUgVUFSVCBFcnJvciBJbnRlcnJ1cHQ6IChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4NCi0gICAgICAgKiBlcnJvcikgKi8NCi0gICAgICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsNCi0NCi0gICAgICAvKiBSeCBwcm9jZXNzIGlzIGNvbXBsZXRlZCwgcmVzdG9yZSBodWFydC0+UnhTdGF0ZSB0byBSZWFkeSAqLw0KLSAgICAgIGh1YXJ0LT5SeFN0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7DQotDQotICAgICAgLyogQ2xlYXIgUnhJU1IgZnVuY3Rpb24gcG9pbnRlciAqLw0KLSAgICAgIGh1YXJ0LT5SeElTUiA9IE5VTEw7DQotDQotICAgICAgLyogQ2hlY2sgY3VycmVudCByZWNlcHRpb24gTW9kZSA6DQotICAgICAgICAgSWYgUmVjZXB0aW9uIHRpbGwgSURMRSBldmVudCBoYXMgYmVlbiBzZWxlY3RlZCA6ICovDQotICAgICAgaWYgKGh1YXJ0LT5SZWNlcHRpb25UeXBlID09IEhBTF9VQVJUX1JFQ0VQVElPTl9UT0lETEUpIHsNCi0gICAgICAgIC8qIFNldCByZWNlcHRpb24gdHlwZSB0byBTdGFuZGFyZCAqLw0KLSAgICAgICAgaHVhcnQtPlJlY2VwdGlvblR5cGUgPSBIQUxfVUFSVF9SRUNFUFRJT05fU1RBTkRBUkQ7DQotDQotICAgICAgICAvKiBEaXNhYmxlIElETEUgaW50ZXJydXB0ICovDQotICAgICAgICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfSURMRUlFKTsNCi0NCi0gICAgICAgIGlmIChfX0hBTF9VQVJUX0dFVF9GTEFHKGh1YXJ0LCBVQVJUX0ZMQUdfSURMRSkgPT0gU0VUKSB7DQotICAgICAgICAgIC8qIENsZWFyIElETEUgRmxhZyAqLw0KLSAgICAgICAgICBfX0hBTF9VQVJUX0NMRUFSX0ZMQUcoaHVhcnQsIFVBUlRfQ0xFQVJfSURMRUYpOw0KLSAgICAgICAgfQ0KLSNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQ0KLSAgICAgICAgLypDYWxsIHJlZ2lzdGVyZWQgUnggRXZlbnQgY2FsbGJhY2sqLw0KLSAgICAgICAgaHVhcnQtPlJ4RXZlbnRDYWxsYmFjayhodWFydCwgaHVhcnQtPlJ4WGZlclNpemUpOw0KLSNlbHNlDQotICAgICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgUnggRXZlbnQgY2FsbGJhY2sqLw0KLSAgICAgICAgSEFMX1VBUlRFeF9SeEV2ZW50Q2FsbGJhY2soaHVhcnQsIGh1YXJ0LT5SeFhmZXJTaXplKTsNCi0jZW5kaWYgLyogKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MpICovDQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgIC8qIFN0YW5kYXJkIHJlY2VwdGlvbiBBUEkgY2FsbGVkICovDQotI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpDQotICAgICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBSeCBjb21wbGV0ZSBjYWxsYmFjayovDQotICAgICAgICBodWFydC0+UnhDcGx0Q2FsbGJhY2soaHVhcnQpOw0KLSNlbHNlDQotICAgICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgUnggY29tcGxldGUgY2FsbGJhY2sqLw0KLSAgICAgICAgSEFMX1VBUlRfUnhDcGx0Q2FsbGJhY2soaHVhcnQpOw0KLSNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotICAgICAgfQ0KLSAgICB9DQotICB9IGVsc2Ugew0KLSAgICAvKiBDbGVhciBSWE5FIGludGVycnVwdCBmbGFnICovDQotICAgIF9fSEFMX1VBUlRfU0VORF9SRVEoaHVhcnQsIFVBUlRfUlhEQVRBX0ZMVVNIX1JFUVVFU1QpOw0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgUlggaW50ZXJydXB0IGhhbmRsZXIgZm9yIDkgYml0cyBkYXRhIHdvcmQgbGVuZ3RoIC4NCi0gKiBAbm90ZSAgIEZ1bmN0aW9uIGlzIGNhbGxlZCB1bmRlciBpbnRlcnJ1cHRpb24gb25seSwgb25jZQ0KLSAqICAgICAgICAgaW50ZXJydXB0aW9ucyBoYXZlIGJlZW4gZW5hYmxlZCBieSBIQUxfVUFSVF9SZWNlaXZlX0lUKCkNCi0gKiBAcGFyYW0gaHVhcnQgVUFSVCBoYW5kbGUuDQotICogQHJldHZhbCBOb25lDQotICovDQotc3RhdGljIHZvaWQgVUFSVF9SeElTUl8xNkJJVChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KSB7DQotICB1aW50MTZfdCAqdG1wOw0KLSAgdWludDE2X3QgdWhNYXNrID0gaHVhcnQtPk1hc2s7DQotICB1aW50MTZfdCB1aGRhdGE7DQotDQotICAvKiBDaGVjayB0aGF0IGEgUnggcHJvY2VzcyBpcyBvbmdvaW5nICovDQotICBpZiAoaHVhcnQtPlJ4U3RhdGUgPT0gSEFMX1VBUlRfU1RBVEVfQlVTWV9SWCkgew0KLSAgICB1aGRhdGEgPSAodWludDE2X3QpUkVBRF9SRUcoaHVhcnQtPkluc3RhbmNlLT5SRFIpOw0KLSAgICB0bXAgPSAodWludDE2X3QgKilodWFydC0+cFJ4QnVmZlB0cjsNCi0gICAgKnRtcCA9ICh1aW50MTZfdCkodWhkYXRhICYgdWhNYXNrKTsNCi0gICAgaHVhcnQtPnBSeEJ1ZmZQdHIgKz0gMlU7DQotICAgIGh1YXJ0LT5SeFhmZXJDb3VudC0tOw0KLQ0KLSAgICBpZiAoaHVhcnQtPlJ4WGZlckNvdW50ID09IDBVKSB7DQotICAgICAgLyogRGlzYWJsZSB0aGUgVUFSVCBQYXJpdHkgRXJyb3IgSW50ZXJydXB0IGFuZCBSWE5FIGludGVycnVwdCovDQotICAgICAgQVRPTUlDX0NMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwNCi0gICAgICAgICAgICAgICAgICAgICAgIChVU0FSVF9DUjFfUlhORUlFX1JYRk5FSUUgfCBVU0FSVF9DUjFfUEVJRSkpOw0KLQ0KLSAgICAgIC8qIERpc2FibGUgdGhlIFVBUlQgRXJyb3IgSW50ZXJydXB0OiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuDQotICAgICAgICogZXJyb3IpICovDQotICAgICAgQVRPTUlDX0NMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7DQotDQotICAgICAgLyogUnggcHJvY2VzcyBpcyBjb21wbGV0ZWQsIHJlc3RvcmUgaHVhcnQtPlJ4U3RhdGUgdG8gUmVhZHkgKi8NCi0gICAgICBodWFydC0+UnhTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOw0KLQ0KLSAgICAgIC8qIENsZWFyIFJ4SVNSIGZ1bmN0aW9uIHBvaW50ZXIgKi8NCi0gICAgICBodWFydC0+UnhJU1IgPSBOVUxMOw0KLQ0KLSAgICAgIC8qIENoZWNrIGN1cnJlbnQgcmVjZXB0aW9uIE1vZGUgOg0KLSAgICAgICAgIElmIFJlY2VwdGlvbiB0aWxsIElETEUgZXZlbnQgaGFzIGJlZW4gc2VsZWN0ZWQgOiAqLw0KLSAgICAgIGlmIChodWFydC0+UmVjZXB0aW9uVHlwZSA9PSBIQUxfVUFSVF9SRUNFUFRJT05fVE9JRExFKSB7DQotICAgICAgICAvKiBTZXQgcmVjZXB0aW9uIHR5cGUgdG8gU3RhbmRhcmQgKi8NCi0gICAgICAgIGh1YXJ0LT5SZWNlcHRpb25UeXBlID0gSEFMX1VBUlRfUkVDRVBUSU9OX1NUQU5EQVJEOw0KLQ0KLSAgICAgICAgLyogRGlzYWJsZSBJRExFIGludGVycnVwdCAqLw0KLSAgICAgICAgQVRPTUlDX0NMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX0lETEVJRSk7DQotDQotICAgICAgICBpZiAoX19IQUxfVUFSVF9HRVRfRkxBRyhodWFydCwgVUFSVF9GTEFHX0lETEUpID09IFNFVCkgew0KLSAgICAgICAgICAvKiBDbGVhciBJRExFIEZsYWcgKi8NCi0gICAgICAgICAgX19IQUxfVUFSVF9DTEVBUl9GTEFHKGh1YXJ0LCBVQVJUX0NMRUFSX0lETEVGKTsNCi0gICAgICAgIH0NCi0jaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkNCi0gICAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIFJ4IEV2ZW50IGNhbGxiYWNrKi8NCi0gICAgICAgIGh1YXJ0LT5SeEV2ZW50Q2FsbGJhY2soaHVhcnQsIGh1YXJ0LT5SeFhmZXJTaXplKTsNCi0jZWxzZQ0KLSAgICAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIFJ4IEV2ZW50IGNhbGxiYWNrKi8NCi0gICAgICAgIEhBTF9VQVJURXhfUnhFdmVudENhbGxiYWNrKGh1YXJ0LCBodWFydC0+UnhYZmVyU2l6ZSk7DQotI2VuZGlmIC8qIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTKSAqLw0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICAvKiBTdGFuZGFyZCByZWNlcHRpb24gQVBJIGNhbGxlZCAqLw0KLSNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQ0KLSAgICAgICAgLypDYWxsIHJlZ2lzdGVyZWQgUnggY29tcGxldGUgY2FsbGJhY2sqLw0KLSAgICAgICAgaHVhcnQtPlJ4Q3BsdENhbGxiYWNrKGh1YXJ0KTsNCi0jZWxzZQ0KLSAgICAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIFJ4IGNvbXBsZXRlIGNhbGxiYWNrKi8NCi0gICAgICAgIEhBTF9VQVJUX1J4Q3BsdENhbGxiYWNrKGh1YXJ0KTsNCi0jZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgfSBlbHNlIHsNCi0gICAgLyogQ2xlYXIgUlhORSBpbnRlcnJ1cHQgZmxhZyAqLw0KLSAgICBfX0hBTF9VQVJUX1NFTkRfUkVRKGh1YXJ0LCBVQVJUX1JYREFUQV9GTFVTSF9SRVFVRVNUKTsNCi0gIH0NCi19DQotDQotLyoqDQotICogQGJyaWVmIFJYIGludGVycnVwdCBoYW5kbGVyIGZvciA3IG9yIDggIGJpdHMgZGF0YSB3b3JkIGxlbmd0aCBhbmQgRklGTyBtb2RlDQotICogaXMgZW5hYmxlZC4NCi0gKiBAbm90ZSAgIEZ1bmN0aW9uIGlzIGNhbGxlZCB1bmRlciBpbnRlcnJ1cHRpb24gb25seSwgb25jZQ0KLSAqICAgICAgICAgaW50ZXJydXB0aW9ucyBoYXZlIGJlZW4gZW5hYmxlZCBieSBIQUxfVUFSVF9SZWNlaXZlX0lUKCkNCi0gKiBAcGFyYW0gaHVhcnQgVUFSVCBoYW5kbGUuDQotICogQHJldHZhbCBOb25lDQotICovDQotc3RhdGljIHZvaWQgVUFSVF9SeElTUl84QklUX0ZJRk9FTihVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KSB7DQotICB1aW50MTZfdCB1aE1hc2sgPSBodWFydC0+TWFzazsNCi0gIHVpbnQxNl90IHVoZGF0YTsNCi0gIHVpbnQxNl90IG5iX3J4X2RhdGE7DQotICB1aW50MTZfdCByeGRhdGFjb3VudDsNCi0gIHVpbnQzMl90IGlzcmZsYWdzID0gUkVBRF9SRUcoaHVhcnQtPkluc3RhbmNlLT5JU1IpOw0KLSAgdWludDMyX3QgY3IxaXRzID0gUkVBRF9SRUcoaHVhcnQtPkluc3RhbmNlLT5DUjEpOw0KLSAgdWludDMyX3QgY3IzaXRzID0gUkVBRF9SRUcoaHVhcnQtPkluc3RhbmNlLT5DUjMpOw0KLQ0KLSAgLyogQ2hlY2sgdGhhdCBhIFJ4IHByb2Nlc3MgaXMgb25nb2luZyAqLw0KLSAgaWYgKGh1YXJ0LT5SeFN0YXRlID09IEhBTF9VQVJUX1NUQVRFX0JVU1lfUlgpIHsNCi0gICAgbmJfcnhfZGF0YSA9IGh1YXJ0LT5OYlJ4RGF0YVRvUHJvY2VzczsNCi0gICAgd2hpbGUgKChuYl9yeF9kYXRhID4gMFUpICYmICgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfUlhORV9SWEZORSkgIT0gMFUpKSB7DQotICAgICAgdWhkYXRhID0gKHVpbnQxNl90KVJFQURfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+UkRSKTsNCi0gICAgICAqaHVhcnQtPnBSeEJ1ZmZQdHIgPSAodWludDhfdCkodWhkYXRhICYgKHVpbnQ4X3QpdWhNYXNrKTsNCi0gICAgICBodWFydC0+cFJ4QnVmZlB0cisrOw0KLSAgICAgIGh1YXJ0LT5SeFhmZXJDb3VudC0tOw0KLSAgICAgIGlzcmZsYWdzID0gUkVBRF9SRUcoaHVhcnQtPkluc3RhbmNlLT5JU1IpOw0KLQ0KLSAgICAgIC8qIElmIHNvbWUgbm9uIGJsb2NraW5nIGVycm9ycyBvY2N1cnJlZCAqLw0KLSAgICAgIGlmICgoaXNyZmxhZ3MgJiAoVVNBUlRfSVNSX1BFIHwgVVNBUlRfSVNSX0ZFIHwgVVNBUlRfSVNSX05FKSkgIT0gMFUpIHsNCi0gICAgICAgIC8qIFVBUlQgcGFyaXR5IGVycm9yIGludGVycnVwdCBvY2N1cnJlZA0KLSAgICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotICAgICAgICBpZiAoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9QRSkgIT0gMFUpICYmDQotICAgICAgICAgICAgKChjcjFpdHMgJiBVU0FSVF9DUjFfUEVJRSkgIT0gMFUpKSB7DQotICAgICAgICAgIF9fSEFMX1VBUlRfQ0xFQVJfRkxBRyhodWFydCwgVUFSVF9DTEVBUl9QRUYpOw0KLQ0KLSAgICAgICAgICBodWFydC0+RXJyb3JDb2RlIHw9IEhBTF9VQVJUX0VSUk9SX1BFOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyogVUFSVCBmcmFtZSBlcnJvciBpbnRlcnJ1cHQgb2NjdXJyZWQNCi0gICAgICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0gICAgICAgIGlmICgoKGlzcmZsYWdzICYgVVNBUlRfSVNSX0ZFKSAhPSAwVSkgJiYNCi0gICAgICAgICAgICAoKGNyM2l0cyAmIFVTQVJUX0NSM19FSUUpICE9IDBVKSkgew0KLSAgICAgICAgICBfX0hBTF9VQVJUX0NMRUFSX0ZMQUcoaHVhcnQsIFVBUlRfQ0xFQVJfRkVGKTsNCi0NCi0gICAgICAgICAgaHVhcnQtPkVycm9yQ29kZSB8PSBIQUxfVUFSVF9FUlJPUl9GRTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qIFVBUlQgbm9pc2UgZXJyb3IgaW50ZXJydXB0IG9jY3VycmVkDQotICAgICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotICAgICAgICBpZiAoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9ORSkgIT0gMFUpICYmDQotICAgICAgICAgICAgKChjcjNpdHMgJiBVU0FSVF9DUjNfRUlFKSAhPSAwVSkpIHsNCi0gICAgICAgICAgX19IQUxfVUFSVF9DTEVBUl9GTEFHKGh1YXJ0LCBVQVJUX0NMRUFSX05FRik7DQotDQotICAgICAgICAgIGh1YXJ0LT5FcnJvckNvZGUgfD0gSEFMX1VBUlRfRVJST1JfTkU7DQotICAgICAgICB9DQotDQotICAgICAgICAvKiBDYWxsIFVBUlQgRXJyb3IgQ2FsbCBiYWNrIGZ1bmN0aW9uIGlmIG5lZWQgYmUNCi0gICAgICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSAgICAgICAgaWYgKGh1YXJ0LT5FcnJvckNvZGUgIT0gSEFMX1VBUlRfRVJST1JfTk9ORSkgew0KLSAgICAgICAgICAvKiBOb24gQmxvY2tpbmcgZXJyb3IgOiB0cmFuc2ZlciBjb3VsZCBnbyBvbi4NCi0gICAgICAgICAgRXJyb3IgaXMgbm90aWZpZWQgdG8gdXNlciB0aHJvdWdoIHVzZXIgZXJyb3IgY2FsbGJhY2sgKi8NCi0jaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkNCi0gICAgICAgICAgLypDYWxsIHJlZ2lzdGVyZWQgZXJyb3IgY2FsbGJhY2sqLw0KLSAgICAgICAgICBodWFydC0+RXJyb3JDYWxsYmFjayhodWFydCk7DQotI2Vsc2UNCi0gICAgICAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIGVycm9yIGNhbGxiYWNrKi8NCi0gICAgICAgICAgSEFMX1VBUlRfRXJyb3JDYWxsYmFjayhodWFydCk7DQotI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi0gICAgICAgICAgaHVhcnQtPkVycm9yQ29kZSA9IEhBTF9VQVJUX0VSUk9SX05PTkU7DQotICAgICAgICB9DQotICAgICAgfQ0KLQ0KLSAgICAgIGlmIChodWFydC0+UnhYZmVyQ291bnQgPT0gMFUpIHsNCi0gICAgICAgIC8qIERpc2FibGUgdGhlIFVBUlQgUGFyaXR5IEVycm9yIEludGVycnVwdCBhbmQgUlhGVCBpbnRlcnJ1cHQqLw0KLSAgICAgICAgQVRPTUlDX0NMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1BFSUUpOw0KLQ0KLSAgICAgICAgLyogRGlzYWJsZSB0aGUgVUFSVCBFcnJvciBJbnRlcnJ1cHQ6IChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4NCi0gICAgICAgICAgIGVycm9yKSBhbmQgUlggRklGTyBUaHJlc2hvbGQgaW50ZXJydXB0ICovDQotICAgICAgICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAoVVNBUlRfQ1IzX0VJRSB8IFVTQVJUX0NSM19SWEZUSUUpKTsNCi0NCi0gICAgICAgIC8qIFJ4IHByb2Nlc3MgaXMgY29tcGxldGVkLCByZXN0b3JlIGh1YXJ0LT5SeFN0YXRlIHRvIFJlYWR5ICovDQotICAgICAgICBodWFydC0+UnhTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOw0KLQ0KLSAgICAgICAgLyogQ2xlYXIgUnhJU1IgZnVuY3Rpb24gcG9pbnRlciAqLw0KLSAgICAgICAgaHVhcnQtPlJ4SVNSID0gTlVMTDsNCi0NCi0gICAgICAgIC8qIENoZWNrIGN1cnJlbnQgcmVjZXB0aW9uIE1vZGUgOg0KLSAgICAgICAgICAgSWYgUmVjZXB0aW9uIHRpbGwgSURMRSBldmVudCBoYXMgYmVlbiBzZWxlY3RlZCA6ICovDQotICAgICAgICBpZiAoaHVhcnQtPlJlY2VwdGlvblR5cGUgPT0gSEFMX1VBUlRfUkVDRVBUSU9OX1RPSURMRSkgew0KLSAgICAgICAgICAvKiBTZXQgcmVjZXB0aW9uIHR5cGUgdG8gU3RhbmRhcmQgKi8NCi0gICAgICAgICAgaHVhcnQtPlJlY2VwdGlvblR5cGUgPSBIQUxfVUFSVF9SRUNFUFRJT05fU1RBTkRBUkQ7DQotDQotICAgICAgICAgIC8qIERpc2FibGUgSURMRSBpbnRlcnJ1cHQgKi8NCi0gICAgICAgICAgQVRPTUlDX0NMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX0lETEVJRSk7DQotDQotICAgICAgICAgIGlmIChfX0hBTF9VQVJUX0dFVF9GTEFHKGh1YXJ0LCBVQVJUX0ZMQUdfSURMRSkgPT0gU0VUKSB7DQotICAgICAgICAgICAgLyogQ2xlYXIgSURMRSBGbGFnICovDQotICAgICAgICAgICAgX19IQUxfVUFSVF9DTEVBUl9GTEFHKGh1YXJ0LCBVQVJUX0NMRUFSX0lETEVGKTsNCi0gICAgICAgICAgfQ0KLSNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQ0KLSAgICAgICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBSeCBFdmVudCBjYWxsYmFjayovDQotICAgICAgICAgIGh1YXJ0LT5SeEV2ZW50Q2FsbGJhY2soaHVhcnQsIGh1YXJ0LT5SeFhmZXJTaXplKTsNCi0jZWxzZQ0KLSAgICAgICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgUnggRXZlbnQgY2FsbGJhY2sqLw0KLSAgICAgICAgICBIQUxfVUFSVEV4X1J4RXZlbnRDYWxsYmFjayhodWFydCwgaHVhcnQtPlJ4WGZlclNpemUpOw0KLSNlbmRpZiAvKiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUykgKi8NCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgIC8qIFN0YW5kYXJkIHJlY2VwdGlvbiBBUEkgY2FsbGVkICovDQotI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpDQotICAgICAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIFJ4IGNvbXBsZXRlIGNhbGxiYWNrKi8NCi0gICAgICAgICAgaHVhcnQtPlJ4Q3BsdENhbGxiYWNrKGh1YXJ0KTsNCi0jZWxzZQ0KLSAgICAgICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgUnggY29tcGxldGUgY2FsbGJhY2sqLw0KLSAgICAgICAgICBIQUxfVUFSVF9SeENwbHRDYWxsYmFjayhodWFydCk7DQotI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8NCi0gICAgICAgIH0NCi0gICAgICB9DQotICAgIH0NCi0NCi0gICAgLyogV2hlbiByZW1haW5pbmcgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlY2VpdmUgaXMgbGVzcyB0aGFuIHRoZSBSWCBGSUZPDQotICAgIHRocmVzaG9sZCwgbmV4dCBpbmNvbWluZyBmcmFtZXMgYXJlIHByb2Nlc3NlZCBhcyBpZiBGSUZPIG1vZGUgd2FzDQotICAgIGRpc2FibGVkIChpLmUuIG9uZSBpbnRlcnJ1cHQgcGVyIHJlY2VpdmVkIGZyYW1lKS4NCi0gICAgKi8NCi0gICAgcnhkYXRhY291bnQgPSBodWFydC0+UnhYZmVyQ291bnQ7DQotICAgIGlmICgocnhkYXRhY291bnQgIT0gMFUpICYmIChyeGRhdGFjb3VudCA8IGh1YXJ0LT5OYlJ4RGF0YVRvUHJvY2VzcykpIHsNCi0gICAgICAvKiBEaXNhYmxlIHRoZSBVQVJUIFJYRlQgaW50ZXJydXB0Ki8NCi0gICAgICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfUlhGVElFKTsNCi0NCi0gICAgICAvKiBVcGRhdGUgdGhlIFJ4SVNSIGZ1bmN0aW9uIHBvaW50ZXIgKi8NCi0gICAgICBodWFydC0+UnhJU1IgPSBVQVJUX1J4SVNSXzhCSVQ7DQotDQotICAgICAgLyogRW5hYmxlIHRoZSBVQVJUIERhdGEgUmVnaXN0ZXIgTm90IEVtcHR5IGludGVycnVwdCAqLw0KLSAgICAgIEFUT01JQ19TRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUlhORUlFX1JYRk5FSUUpOw0KLSAgICB9DQotICB9IGVsc2Ugew0KLSAgICAvKiBDbGVhciBSWE5FIGludGVycnVwdCBmbGFnICovDQotICAgIF9fSEFMX1VBUlRfU0VORF9SRVEoaHVhcnQsIFVBUlRfUlhEQVRBX0ZMVVNIX1JFUVVFU1QpOw0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgUlggaW50ZXJydXB0IGhhbmRsZXIgZm9yIDkgYml0cyBkYXRhIHdvcmQgbGVuZ3RoIGFuZCBGSUZPIG1vZGUgaXMNCi0gKiBlbmFibGVkLg0KLSAqIEBub3RlICAgRnVuY3Rpb24gaXMgY2FsbGVkIHVuZGVyIGludGVycnVwdGlvbiBvbmx5LCBvbmNlDQotICogICAgICAgICBpbnRlcnJ1cHRpb25zIGhhdmUgYmVlbiBlbmFibGVkIGJ5IEhBTF9VQVJUX1JlY2VpdmVfSVQoKQ0KLSAqIEBwYXJhbSBodWFydCBVQVJUIGhhbmRsZS4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi1zdGF0aWMgdm9pZCBVQVJUX1J4SVNSXzE2QklUX0ZJRk9FTihVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KSB7DQotICB1aW50MTZfdCAqdG1wOw0KLSAgdWludDE2X3QgdWhNYXNrID0gaHVhcnQtPk1hc2s7DQotICB1aW50MTZfdCB1aGRhdGE7DQotICB1aW50MTZfdCBuYl9yeF9kYXRhOw0KLSAgdWludDE2X3QgcnhkYXRhY291bnQ7DQotICB1aW50MzJfdCBpc3JmbGFncyA9IFJFQURfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+SVNSKTsNCi0gIHVpbnQzMl90IGNyMWl0cyA9IFJFQURfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxKTsNCi0gIHVpbnQzMl90IGNyM2l0cyA9IFJFQURfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzKTsNCi0NCi0gIC8qIENoZWNrIHRoYXQgYSBSeCBwcm9jZXNzIGlzIG9uZ29pbmcgKi8NCi0gIGlmIChodWFydC0+UnhTdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9CVVNZX1JYKSB7DQotICAgIG5iX3J4X2RhdGEgPSBodWFydC0+TmJSeERhdGFUb1Byb2Nlc3M7DQotICAgIHdoaWxlICgobmJfcnhfZGF0YSA+IDBVKSAmJiAoKGlzcmZsYWdzICYgVVNBUlRfSVNSX1JYTkVfUlhGTkUpICE9IDBVKSkgew0KLSAgICAgIHVoZGF0YSA9ICh1aW50MTZfdClSRUFEX1JFRyhodWFydC0+SW5zdGFuY2UtPlJEUik7DQotICAgICAgdG1wID0gKHVpbnQxNl90ICopaHVhcnQtPnBSeEJ1ZmZQdHI7DQotICAgICAgKnRtcCA9ICh1aW50MTZfdCkodWhkYXRhICYgdWhNYXNrKTsNCi0gICAgICBodWFydC0+cFJ4QnVmZlB0ciArPSAyVTsNCi0gICAgICBodWFydC0+UnhYZmVyQ291bnQtLTsNCi0gICAgICBpc3JmbGFncyA9IFJFQURfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+SVNSKTsNCi0NCi0gICAgICAvKiBJZiBzb21lIG5vbiBibG9ja2luZyBlcnJvcnMgb2NjdXJyZWQgKi8NCi0gICAgICBpZiAoKGlzcmZsYWdzICYgKFVTQVJUX0lTUl9QRSB8IFVTQVJUX0lTUl9GRSB8IFVTQVJUX0lTUl9ORSkpICE9IDBVKSB7DQotICAgICAgICAvKiBVQVJUIHBhcml0eSBlcnJvciBpbnRlcnJ1cHQgb2NjdXJyZWQNCi0gICAgICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSAgICAgICAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfUEUpICE9IDBVKSAmJg0KLSAgICAgICAgICAgICgoY3IxaXRzICYgVVNBUlRfQ1IxX1BFSUUpICE9IDBVKSkgew0KLSAgICAgICAgICBfX0hBTF9VQVJUX0NMRUFSX0ZMQUcoaHVhcnQsIFVBUlRfQ0xFQVJfUEVGKTsNCi0NCi0gICAgICAgICAgaHVhcnQtPkVycm9yQ29kZSB8PSBIQUxfVUFSVF9FUlJPUl9QRTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qIFVBUlQgZnJhbWUgZXJyb3IgaW50ZXJydXB0IG9jY3VycmVkDQotICAgICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotICAgICAgICBpZiAoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9GRSkgIT0gMFUpICYmDQotICAgICAgICAgICAgKChjcjNpdHMgJiBVU0FSVF9DUjNfRUlFKSAhPSAwVSkpIHsNCi0gICAgICAgICAgX19IQUxfVUFSVF9DTEVBUl9GTEFHKGh1YXJ0LCBVQVJUX0NMRUFSX0ZFRik7DQotDQotICAgICAgICAgIGh1YXJ0LT5FcnJvckNvZGUgfD0gSEFMX1VBUlRfRVJST1JfRkU7DQotICAgICAgICB9DQotDQotICAgICAgICAvKiBVQVJUIG5vaXNlIGVycm9yIGludGVycnVwdCBvY2N1cnJlZA0KLSAgICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSAgICAgICAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfTkUpICE9IDBVKSAmJg0KLSAgICAgICAgICAgICgoY3IzaXRzICYgVVNBUlRfQ1IzX0VJRSkgIT0gMFUpKSB7DQotICAgICAgICAgIF9fSEFMX1VBUlRfQ0xFQVJfRkxBRyhodWFydCwgVUFSVF9DTEVBUl9ORUYpOw0KLQ0KLSAgICAgICAgICBodWFydC0+RXJyb3JDb2RlIHw9IEhBTF9VQVJUX0VSUk9SX05FOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyogQ2FsbCBVQVJUIEVycm9yIENhbGwgYmFjayBmdW5jdGlvbiBpZiBuZWVkIGJlDQotICAgICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0gICAgICAgIGlmIChodWFydC0+RXJyb3JDb2RlICE9IEhBTF9VQVJUX0VSUk9SX05PTkUpIHsNCi0gICAgICAgICAgLyogTm9uIEJsb2NraW5nIGVycm9yIDogdHJhbnNmZXIgY291bGQgZ28gb24uDQotICAgICAgICAgIEVycm9yIGlzIG5vdGlmaWVkIHRvIHVzZXIgdGhyb3VnaCB1c2VyIGVycm9yIGNhbGxiYWNrICovDQotI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpDQotICAgICAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIGVycm9yIGNhbGxiYWNrKi8NCi0gICAgICAgICAgaHVhcnQtPkVycm9yQ2FsbGJhY2soaHVhcnQpOw0KLSNlbHNlDQotICAgICAgICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBlcnJvciBjYWxsYmFjayovDQotICAgICAgICAgIEhBTF9VQVJUX0Vycm9yQ2FsbGJhY2soaHVhcnQpOw0KLSNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotICAgICAgICAgIGh1YXJ0LT5FcnJvckNvZGUgPSBIQUxfVUFSVF9FUlJPUl9OT05FOw0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0NCi0gICAgICBpZiAoaHVhcnQtPlJ4WGZlckNvdW50ID09IDBVKSB7DQotICAgICAgICAvKiBEaXNhYmxlIHRoZSBVQVJUIFBhcml0eSBFcnJvciBJbnRlcnJ1cHQgYW5kIFJYRlQgaW50ZXJydXB0Ki8NCi0gICAgICAgIEFUT01JQ19DTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9QRUlFKTsNCi0NCi0gICAgICAgIC8qIERpc2FibGUgdGhlIFVBUlQgRXJyb3IgSW50ZXJydXB0OiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuDQotICAgICAgICAgICBlcnJvcikgYW5kIFJYIEZJRk8gVGhyZXNob2xkIGludGVycnVwdCAqLw0KLSAgICAgICAgQVRPTUlDX0NMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgKFVTQVJUX0NSM19FSUUgfCBVU0FSVF9DUjNfUlhGVElFKSk7DQotDQotICAgICAgICAvKiBSeCBwcm9jZXNzIGlzIGNvbXBsZXRlZCwgcmVzdG9yZSBodWFydC0+UnhTdGF0ZSB0byBSZWFkeSAqLw0KLSAgICAgICAgaHVhcnQtPlJ4U3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsNCi0NCi0gICAgICAgIC8qIENsZWFyIFJ4SVNSIGZ1bmN0aW9uIHBvaW50ZXIgKi8NCi0gICAgICAgIGh1YXJ0LT5SeElTUiA9IE5VTEw7DQotDQotICAgICAgICAvKiBDaGVjayBjdXJyZW50IHJlY2VwdGlvbiBNb2RlIDoNCi0gICAgICAgICAgIElmIFJlY2VwdGlvbiB0aWxsIElETEUgZXZlbnQgaGFzIGJlZW4gc2VsZWN0ZWQgOiAqLw0KLSAgICAgICAgaWYgKGh1YXJ0LT5SZWNlcHRpb25UeXBlID09IEhBTF9VQVJUX1JFQ0VQVElPTl9UT0lETEUpIHsNCi0gICAgICAgICAgLyogU2V0IHJlY2VwdGlvbiB0eXBlIHRvIFN0YW5kYXJkICovDQotICAgICAgICAgIGh1YXJ0LT5SZWNlcHRpb25UeXBlID0gSEFMX1VBUlRfUkVDRVBUSU9OX1NUQU5EQVJEOw0KLQ0KLSAgICAgICAgICAvKiBEaXNhYmxlIElETEUgaW50ZXJydXB0ICovDQotICAgICAgICAgIEFUT01JQ19DTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9JRExFSUUpOw0KLQ0KLSAgICAgICAgICBpZiAoX19IQUxfVUFSVF9HRVRfRkxBRyhodWFydCwgVUFSVF9GTEFHX0lETEUpID09IFNFVCkgew0KLSAgICAgICAgICAgIC8qIENsZWFyIElETEUgRmxhZyAqLw0KLSAgICAgICAgICAgIF9fSEFMX1VBUlRfQ0xFQVJfRkxBRyhodWFydCwgVUFSVF9DTEVBUl9JRExFRik7DQotICAgICAgICAgIH0NCi0jaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkNCi0gICAgICAgICAgLypDYWxsIHJlZ2lzdGVyZWQgUnggRXZlbnQgY2FsbGJhY2sqLw0KLSAgICAgICAgICBodWFydC0+UnhFdmVudENhbGxiYWNrKGh1YXJ0LCBodWFydC0+UnhYZmVyU2l6ZSk7DQotI2Vsc2UNCi0gICAgICAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIFJ4IEV2ZW50IGNhbGxiYWNrKi8NCi0gICAgICAgICAgSEFMX1VBUlRFeF9SeEV2ZW50Q2FsbGJhY2soaHVhcnQsIGh1YXJ0LT5SeFhmZXJTaXplKTsNCi0jZW5kaWYgLyogKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MpICovDQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAvKiBTdGFuZGFyZCByZWNlcHRpb24gQVBJIGNhbGxlZCAqLw0KLSNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQ0KLSAgICAgICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBSeCBjb21wbGV0ZSBjYWxsYmFjayovDQotICAgICAgICAgIGh1YXJ0LT5SeENwbHRDYWxsYmFjayhodWFydCk7DQotI2Vsc2UNCi0gICAgICAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIFJ4IGNvbXBsZXRlIGNhbGxiYWNrKi8NCi0gICAgICAgICAgSEFMX1VBUlRfUnhDcGx0Q2FsbGJhY2soaHVhcnQpOw0KLSNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovDQotICAgICAgICB9DQotICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qIFdoZW4gcmVtYWluaW5nIG51bWJlciBvZiBieXRlcyB0byByZWNlaXZlIGlzIGxlc3MgdGhhbiB0aGUgUlggRklGTw0KLSAgICB0aHJlc2hvbGQsIG5leHQgaW5jb21pbmcgZnJhbWVzIGFyZSBwcm9jZXNzZWQgYXMgaWYgRklGTyBtb2RlIHdhcw0KLSAgICBkaXNhYmxlZCAoaS5lLiBvbmUgaW50ZXJydXB0IHBlciByZWNlaXZlZCBmcmFtZSkuDQotICAgICovDQotICAgIHJ4ZGF0YWNvdW50ID0gaHVhcnQtPlJ4WGZlckNvdW50Ow0KLSAgICBpZiAoKHJ4ZGF0YWNvdW50ICE9IDBVKSAmJiAocnhkYXRhY291bnQgPCBodWFydC0+TmJSeERhdGFUb1Byb2Nlc3MpKSB7DQotICAgICAgLyogRGlzYWJsZSB0aGUgVUFSVCBSWEZUIGludGVycnVwdCovDQotICAgICAgQVRPTUlDX0NMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX1JYRlRJRSk7DQotDQotICAgICAgLyogVXBkYXRlIHRoZSBSeElTUiBmdW5jdGlvbiBwb2ludGVyICovDQotICAgICAgaHVhcnQtPlJ4SVNSID0gVUFSVF9SeElTUl8xNkJJVDsNCi0NCi0gICAgICAvKiBFbmFibGUgdGhlIFVBUlQgRGF0YSBSZWdpc3RlciBOb3QgRW1wdHkgaW50ZXJydXB0ICovDQotICAgICAgQVRPTUlDX1NFVF9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSk7DQotICAgIH0NCi0gIH0gZWxzZSB7DQotICAgIC8qIENsZWFyIFJYTkUgaW50ZXJydXB0IGZsYWcgKi8NCi0gICAgX19IQUxfVUFSVF9TRU5EX1JFUShodWFydCwgVUFSVF9SWERBVEFfRkxVU0hfUkVRVUVTVCk7DQotICB9DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotI2VuZGlmIC8qIEhBTF9VQVJUX01PRFVMRV9FTkFCTEVEICovDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmc0eHhfaGFsX3VhcnQuYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgVUFSVCBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBVbml2ZXJzYWwgQXN5bmNocm9ub3VzIFJlY2VpdmVyIFRyYW5zbWl0dGVyCisgUGVyaXBoZXJhbCAoVUFSVCkuCisgICogICAgICAgICAgICsgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgICoKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRlcm1zIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUKKyAgKiBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb2Z0d2FyZSBjb21wb25lbnQuCisgICogSWYgbm8gTElDRU5TRSBmaWxlIGNvbWVzIHdpdGggdGhpcyBzb2Z0d2FyZSwgaXQgaXMgcHJvdmlkZWQgQVMtSVMuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIEB2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgICBUaGUgVUFSVCBIQUwgZHJpdmVyIGNhbiBiZSB1c2VkIGFzIGZvbGxvd3M6CisKKyAgICAoIykgRGVjbGFyZSBhIFVBUlRfSGFuZGxlVHlwZURlZiBoYW5kbGUgc3RydWN0dXJlIChlZy4gVUFSVF9IYW5kbGVUeXBlRGVmCisgaHVhcnQpLgorICAgICgjKSBJbml0aWFsaXplIHRoZSBVQVJUIGxvdyBsZXZlbCByZXNvdXJjZXMgYnkgaW1wbGVtZW50aW5nIHRoZQorIEhBTF9VQVJUX01zcEluaXQoKSBBUEk6CisgICAgICAgICgrKykgRW5hYmxlIHRoZSBVU0FSVHggaW50ZXJmYWNlIGNsb2NrLgorICAgICAgICAoKyspIFVBUlQgcGlucyBjb25maWd1cmF0aW9uOgorICAgICAgICAgICAgKCsrKykgRW5hYmxlIHRoZSBjbG9jayBmb3IgdGhlIFVBUlQgR1BJT3MuCisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlc2UgVUFSVCBwaW5zIGFzIGFsdGVybmF0ZSBmdW5jdGlvbiBwdWxsLXVwLgorICAgICAgICAoKyspIE5WSUMgY29uZmlndXJhdGlvbiBpZiB5b3UgbmVlZCB0byB1c2UgaW50ZXJydXB0IHByb2Nlc3MKKyAoSEFMX1VBUlRfVHJhbnNtaXRfSVQoKSBhbmQgSEFMX1VBUlRfUmVjZWl2ZV9JVCgpIEFQSXMpOgorICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZSBVU0FSVHggaW50ZXJydXB0IHByaW9yaXR5LgorICAgICAgICAgICAgKCsrKykgRW5hYmxlIHRoZSBOVklDIFVTQVJUIElSUSBoYW5kbGUuCisgICAgICAgICgrKykgVUFSVCBpbnRlcnJ1cHRzIGhhbmRsaW5nOgorICAgICAgICAgICAgICAtQEAtICBUaGUgc3BlY2lmaWMgVUFSVCBpbnRlcnJ1cHRzIChUcmFuc21pc3Npb24gY29tcGxldGUKKyBpbnRlcnJ1cHQsIFJYTkUgaW50ZXJydXB0LCBSWC9UWCBGSUZPcyByZWxhdGVkIGludGVycnVwdHMgYW5kIEVycm9yIEludGVycnVwdHMpCisgICAgICAgICAgICAgICAgYXJlIG1hbmFnZWQgdXNpbmcgdGhlIG1hY3JvcyBfX0hBTF9VQVJUX0VOQUJMRV9JVCgpIGFuZAorIF9fSEFMX1VBUlRfRElTQUJMRV9JVCgpIGluc2lkZSB0aGUgdHJhbnNtaXQgYW5kIHJlY2VpdmUgcHJvY2Vzc2VzLgorICAgICAgICAoKyspIERNQSBDb25maWd1cmF0aW9uIGlmIHlvdSBuZWVkIHRvIHVzZSBETUEgcHJvY2VzcworIChIQUxfVUFSVF9UcmFuc21pdF9ETUEoKSBhbmQgSEFMX1VBUlRfUmVjZWl2ZV9ETUEoKSBBUElzKToKKyAgICAgICAgICAgICgrKyspIERlY2xhcmUgYSBETUEgaGFuZGxlIHN0cnVjdHVyZSBmb3IgdGhlIFR4L1J4IGNoYW5uZWwuCisgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIERNQXggaW50ZXJmYWNlIGNsb2NrLgorICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZSBkZWNsYXJlZCBETUEgaGFuZGxlIHN0cnVjdHVyZSB3aXRoIHRoZSByZXF1aXJlZAorIFR4L1J4IHBhcmFtZXRlcnMuCisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIERNQSBUeC9SeCBjaGFubmVsLgorICAgICAgICAgICAgKCsrKykgQXNzb2NpYXRlIHRoZSBpbml0aWFsaXplZCBETUEgaGFuZGxlIHRvIHRoZSBVQVJUIERNQSBUeC9SeAorIGhhbmRsZS4KKyAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgcHJpb3JpdHkgYW5kIGVuYWJsZSB0aGUgTlZJQyBmb3IgdGhlIHRyYW5zZmVyCisgY29tcGxldGUgaW50ZXJydXB0IG9uIHRoZSBETUEgVHgvUnggY2hhbm5lbC4KKworICAgICgjKSBQcm9ncmFtIHRoZSBCYXVkIFJhdGUsIFdvcmQgTGVuZ3RoLCBTdG9wIEJpdCwgUGFyaXR5LCBQcmVzY2FsZXIgdmFsdWUgLAorIEhhcmR3YXJlIGZsb3cgY29udHJvbCBhbmQgTW9kZSAoUmVjZWl2ZXIvVHJhbnNtaXR0ZXIpIGluIHRoZSBodWFydCBoYW5kbGUgSW5pdAorIHN0cnVjdHVyZS4KKworICAgICgjKSBJZiByZXF1aXJlZCwgcHJvZ3JhbSBVQVJUIGFkdmFuY2VkIGZlYXR1cmVzIChUWC9SWCBwaW5zIHN3YXAsIGF1dG8gQmF1ZAorIHJhdGUgZGV0ZWN0aW9uLC4uLikgaW4gdGhlIGh1YXJ0IGhhbmRsZSBBZHZhbmNlZEluaXQgc3RydWN0dXJlLgorCisgICAgKCMpIEZvciB0aGUgVUFSVCBhc3luY2hyb25vdXMgbW9kZSwgaW5pdGlhbGl6ZSB0aGUgVUFSVCByZWdpc3RlcnMgYnkgY2FsbGluZworICAgICAgICB0aGUgSEFMX1VBUlRfSW5pdCgpIEFQSS4KKworICAgICgjKSBGb3IgdGhlIFVBUlQgSGFsZiBkdXBsZXggbW9kZSwgaW5pdGlhbGl6ZSB0aGUgVUFSVCByZWdpc3RlcnMgYnkgY2FsbGluZworICAgICAgICB0aGUgSEFMX0hhbGZEdXBsZXhfSW5pdCgpIEFQSS4KKworICAgICgjKSBGb3IgdGhlIFVBUlQgTElOIChMb2NhbCBJbnRlcmNvbm5lY3Rpb24gTmV0d29yaykgbW9kZSwgaW5pdGlhbGl6ZSB0aGUKKyBVQVJUIHJlZ2lzdGVycyBieSBjYWxsaW5nIHRoZSBIQUxfTElOX0luaXQoKSBBUEkuCisKKyAgICAoIykgRm9yIHRoZSBVQVJUIE11bHRpcHJvY2Vzc29yIG1vZGUsIGluaXRpYWxpemUgdGhlIFVBUlQgcmVnaXN0ZXJzCisgICAgICAgIGJ5IGNhbGxpbmcgdGhlIEhBTF9NdWx0aVByb2Nlc3Nvcl9Jbml0KCkgQVBJLgorCisgICAgKCMpIEZvciB0aGUgVUFSVCBSUzQ4NSBEcml2ZXIgRW5hYmxlZCBtb2RlLCBpbml0aWFsaXplIHRoZSBVQVJUIHJlZ2lzdGVycworICAgICAgICBieSBjYWxsaW5nIHRoZSBIQUxfUlM0ODVFeF9Jbml0KCkgQVBJLgorCisgICAgWy4uXQorICAgIChAKSBUaGVzZSBBUEkncyAoSEFMX1VBUlRfSW5pdCgpLCBIQUxfSGFsZkR1cGxleF9Jbml0KCksIEhBTF9MSU5fSW5pdCgpLAorIEhBTF9NdWx0aVByb2Nlc3Nvcl9Jbml0KCksIGFsc28gY29uZmlndXJlIHRoZSBsb3cgbGV2ZWwgSGFyZHdhcmUgR1BJTywgQ0xPQ0ssCisgQ09SVEVYLi4uZXRjKSBieSBjYWxsaW5nIHRoZSBjdXN0b21pemVkIEhBTF9VQVJUX01zcEluaXQoKSBBUEkuCisKKyAgICAjIyMjIyBDYWxsYmFjayByZWdpc3RyYXRpb24gIyMjIyMKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBbLi5dCisgICAgVGhlIGNvbXBpbGF0aW9uIGRlZmluZSBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTIHdoZW4gc2V0IHRvIDEKKyAgICBhbGxvd3MgdGhlIHVzZXIgdG8gY29uZmlndXJlIGR5bmFtaWNhbGx5IHRoZSBkcml2ZXIgY2FsbGJhY2tzLgorCisgICAgWy4uXQorICAgIFVzZSBGdW5jdGlvbiBIQUxfVUFSVF9SZWdpc3RlckNhbGxiYWNrKCkgdG8gcmVnaXN0ZXIgYSB1c2VyIGNhbGxiYWNrLgorICAgIEZ1bmN0aW9uIEhBTF9VQVJUX1JlZ2lzdGVyQ2FsbGJhY2soKSBhbGxvd3MgdG8gcmVnaXN0ZXIgZm9sbG93aW5nIGNhbGxiYWNrczoKKyAgICAoKykgVHhIYWxmQ3BsdENhbGxiYWNrICAgICAgICA6IFR4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIFR4Q3BsdENhbGxiYWNrICAgICAgICAgICAgOiBUeCBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgUnhIYWxmQ3BsdENhbGxiYWNrICAgICAgICA6IFJ4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIFJ4Q3BsdENhbGxiYWNrICAgICAgICAgICAgOiBSeCBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgRXJyb3JDYWxsYmFjayAgICAgICAgICAgICA6IEVycm9yIENhbGxiYWNrLgorICAgICgrKSBBYm9ydENwbHRDYWxsYmFjayAgICAgICAgIDogQWJvcnQgQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIEFib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2sgOiBBYm9ydCBUcmFuc21pdCBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrICA6IEFib3J0IFJlY2VpdmUgQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIFdha2V1cENhbGxiYWNrICAgICAgICAgICAgOiBXYWtldXAgQ2FsbGJhY2suCisgICAgKCspIFJ4Rmlmb0Z1bGxDYWxsYmFjayAgICAgICAgOiBSeCBGaWZvIEZ1bGwgQ2FsbGJhY2suCisgICAgKCspIFR4Rmlmb0VtcHR5Q2FsbGJhY2sgICAgICAgOiBUeCBGaWZvIEVtcHR5IENhbGxiYWNrLgorICAgICgrKSBNc3BJbml0Q2FsbGJhY2sgICAgICAgICAgIDogVUFSVCBNc3BJbml0LgorICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgICAgICAgIDogVUFSVCBNc3BEZUluaXQuCisgICAgVGhpcyBmdW5jdGlvbiB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZSBIQUwgcGVyaXBoZXJhbCBoYW5kbGUsIHRoZSBDYWxsYmFjayBJRAorICAgIGFuZCBhIHBvaW50ZXIgdG8gdGhlIHVzZXIgY2FsbGJhY2sgZnVuY3Rpb24uCisKKyAgICBbLi5dCisgICAgVXNlIGZ1bmN0aW9uIEhBTF9VQVJUX1VuUmVnaXN0ZXJDYWxsYmFjaygpIHRvIHJlc2V0IGEgY2FsbGJhY2sgdG8gdGhlCisgZGVmYXVsdCB3ZWFrIGZ1bmN0aW9uLiBIQUxfVUFSVF9VblJlZ2lzdGVyQ2FsbGJhY2soKSB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZQorIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSwgYW5kIHRoZSBDYWxsYmFjayBJRC4gVGhpcyBmdW5jdGlvbiBhbGxvd3MgdG8gcmVzZXQKKyBmb2xsb3dpbmcgY2FsbGJhY2tzOgorICAgICgrKSBUeEhhbGZDcGx0Q2FsbGJhY2sgICAgICAgIDogVHggSGFsZiBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgVHhDcGx0Q2FsbGJhY2sgICAgICAgICAgICA6IFR4IENvbXBsZXRlIENhbGxiYWNrLgorICAgICgrKSBSeEhhbGZDcGx0Q2FsbGJhY2sgICAgICAgIDogUnggSGFsZiBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgUnhDcGx0Q2FsbGJhY2sgICAgICAgICAgICA6IFJ4IENvbXBsZXRlIENhbGxiYWNrLgorICAgICgrKSBFcnJvckNhbGxiYWNrICAgICAgICAgICAgIDogRXJyb3IgQ2FsbGJhY2suCisgICAgKCspIEFib3J0Q3BsdENhbGxiYWNrICAgICAgICAgOiBBYm9ydCBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayA6IEFib3J0IFRyYW5zbWl0IENvbXBsZXRlIENhbGxiYWNrLgorICAgICgrKSBBYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2sgIDogQWJvcnQgUmVjZWl2ZSBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgV2FrZXVwQ2FsbGJhY2sgICAgICAgICAgICA6IFdha2V1cCBDYWxsYmFjay4KKyAgICAoKykgUnhGaWZvRnVsbENhbGxiYWNrICAgICAgICA6IFJ4IEZpZm8gRnVsbCBDYWxsYmFjay4KKyAgICAoKykgVHhGaWZvRW1wdHlDYWxsYmFjayAgICAgICA6IFR4IEZpZm8gRW1wdHkgQ2FsbGJhY2suCisgICAgKCspIE1zcEluaXRDYWxsYmFjayAgICAgICAgICAgOiBVQVJUIE1zcEluaXQuCisgICAgKCspIE1zcERlSW5pdENhbGxiYWNrICAgICAgICAgOiBVQVJUIE1zcERlSW5pdC4KKworICAgIFsuLl0KKyAgICBGb3Igc3BlY2lmaWMgY2FsbGJhY2sgUnhFdmVudENhbGxiYWNrLCB1c2UgZGVkaWNhdGVkIHJlZ2lzdHJhdGlvbi9yZXNldAorIGZ1bmN0aW9uczogcmVzcGVjdGl2ZWx5IEhBTF9VQVJUX1JlZ2lzdGVyUnhFdmVudENhbGxiYWNrKCkgLAorIEhBTF9VQVJUX1VuUmVnaXN0ZXJSeEV2ZW50Q2FsbGJhY2soKS4KKworICAgIFsuLl0KKyAgICBCeSBkZWZhdWx0LCBhZnRlciB0aGUgSEFMX1VBUlRfSW5pdCgpIGFuZCB3aGVuIHRoZSBzdGF0ZSBpcworIEhBTF9VQVJUX1NUQVRFX1JFU0VUIGFsbCBjYWxsYmFja3MgYXJlIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyB3ZWFrIGZ1bmN0aW9uczoKKyAgICBleGFtcGxlcyBIQUxfVUFSVF9UeENwbHRDYWxsYmFjaygpLCBIQUxfVUFSVF9SeEhhbGZDcGx0Q2FsbGJhY2soKS4KKyAgICBFeGNlcHRpb24gZG9uZSBmb3IgTXNwSW5pdCBhbmQgTXNwRGVJbml0IGZ1bmN0aW9ucyB0aGF0IGFyZSByZXNwZWN0aXZlbHkKKyAgICByZXNldCB0byB0aGUgbGVnYWN5IHdlYWsgZnVuY3Rpb25zIGluIHRoZSBIQUxfVUFSVF9Jbml0KCkKKyAgICBhbmQgSEFMX1VBUlRfRGVJbml0KCkgb25seSB3aGVuIHRoZXNlIGNhbGxiYWNrcyBhcmUgbnVsbCAobm90IHJlZ2lzdGVyZWQKKyBiZWZvcmVoYW5kKS4gSWYgbm90LCBNc3BJbml0IG9yIE1zcERlSW5pdCBhcmUgbm90IG51bGwsIHRoZSBIQUxfVUFSVF9Jbml0KCkgYW5kCisgSEFMX1VBUlRfRGVJbml0KCkga2VlcCBhbmQgdXNlIHRoZSB1c2VyIE1zcEluaXQvTXNwRGVJbml0IGNhbGxiYWNrcyAocmVnaXN0ZXJlZAorIGJlZm9yZWhhbmQpLgorCisgICAgWy4uXQorICAgIENhbGxiYWNrcyBjYW4gYmUgcmVnaXN0ZXJlZC91bnJlZ2lzdGVyZWQgaW4gSEFMX1VBUlRfU1RBVEVfUkVBRFkgc3RhdGUgb25seS4KKyAgICBFeGNlcHRpb24gZG9uZSBNc3BJbml0L01zcERlSW5pdCB0aGF0IGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZAorICAgIGluIEhBTF9VQVJUX1NUQVRFX1JFQURZIG9yIEhBTF9VQVJUX1NUQVRFX1JFU0VUIHN0YXRlLCB0aHVzIHJlZ2lzdGVyZWQKKyAodXNlcikgTXNwSW5pdC9EZUluaXQgY2FsbGJhY2tzIGNhbiBiZSB1c2VkIGR1cmluZyB0aGUgSW5pdC9EZUluaXQuIEluIHRoYXQKKyBjYXNlIGZpcnN0IHJlZ2lzdGVyIHRoZSBNc3BJbml0L01zcERlSW5pdCB1c2VyIGNhbGxiYWNrcyB1c2luZworIEhBTF9VQVJUX1JlZ2lzdGVyQ2FsbGJhY2soKSBiZWZvcmUgY2FsbGluZyBIQUxfVUFSVF9EZUluaXQoKSBvciBIQUxfVUFSVF9Jbml0KCkKKyBmdW5jdGlvbi4KKworICAgIFsuLl0KKyAgICBXaGVuIFRoZSBjb21waWxhdGlvbiBkZWZpbmUgVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyBpcyBzZXQgdG8gMCBvcgorICAgIG5vdCBkZWZpbmVkLCB0aGUgY2FsbGJhY2sgcmVnaXN0cmF0aW9uIGZlYXR1cmUgaXMgbm90IGF2YWlsYWJsZQorICAgIGFuZCB3ZWFrIGNhbGxiYWNrcyBhcmUgdXNlZC4KKworCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmc0eHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkc0eHhfSEFMX0RyaXZlcgorICogQHsKKyAqLworCisvKiogQGRlZmdyb3VwIFVBUlQgVUFSVAorICogQGJyaWVmIEhBTCBVQVJUIG1vZHVsZSBkcml2ZXIKKyAqIEB7CisgKi8KKworI2lmZGVmIEhBTF9VQVJUX01PRFVMRV9FTkFCTEVECisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBVQVJUX1ByaXZhdGVfQ29uc3RhbnRzIFVBUlQgUHJpdmF0ZSBDb25zdGFudHMKKyAqIEB7CisgKi8KKyNkZWZpbmUgVVNBUlRfQ1IxX0ZJRUxEUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKHVpbnQzMl90KShVU0FSVF9DUjFfTSB8IFVTQVJUX0NSMV9QQ0UgfCBVU0FSVF9DUjFfUFMgfCBVU0FSVF9DUjFfVEUgfCAgICBcCisgICAgICAgICAgICAgIFVTQVJUX0NSMV9SRSB8IFVTQVJUX0NSMV9PVkVSOCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgVVNBUlRfQ1IxX0ZJRk9FTikpIC8qITwgVUFSVCBvciBVU0FSVCBDUjEgZmllbGRzIG9mIHBhcmFtZXRlcnMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGJ5IFVBUlRfU2V0Q29uZmlnIEFQSSAqLworCisjZGVmaW5lIFVTQVJUX0NSM19GSUVMRFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgodWludDMyX3QpKFVTQVJUX0NSM19SVFNFIHwgVVNBUlRfQ1IzX0NUU0UgfCBVU0FSVF9DUjNfT05FQklUIHwgICAgICAgICAgICBcCisgICAgICAgICAgICAgIFVTQVJUX0NSM19UWEZUQ0ZHIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIFVTQVJUX0NSM19SWEZUQ0ZHKSkgLyohPCBVQVJUIG9yIFVTQVJUIENSMyBmaWVsZHMgb2YgcGFyYW1ldGVycyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGJ5IFVBUlRfU2V0Q29uZmlnIEFQSSAqLworCisjZGVmaW5lIExQVUFSVF9CUlJfTUlOIDB4MDAwMDAzMDBVIC8qIExQVUFSVCBCUlIgbWluaW11bSBhdXRob3JpemVkIHZhbHVlICovCisjZGVmaW5lIExQVUFSVF9CUlJfTUFYIDB4MDAwRkZGRkZVIC8qIExQVUFSVCBCUlIgbWF4aW11bSBhdXRob3JpemVkIHZhbHVlICovCisKKyNkZWZpbmUgVUFSVF9CUlJfTUlOIDB4MTBVICAgICAgIC8qIFVBUlQgQlJSIG1pbmltdW0gYXV0aG9yaXplZCB2YWx1ZSAqLworI2RlZmluZSBVQVJUX0JSUl9NQVggMHgwMDAwRkZGRlUgLyogVUFSVCBCUlIgbWF4aW11bSBhdXRob3JpemVkIHZhbHVlICovCisvKioKKyAqIEB9CisgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgVUFSVF9Qcml2YXRlX0Z1bmN0aW9ucworICogQHsKKyAqLworc3RhdGljIHZvaWQgVUFSVF9FbmRSeFRyYW5zZmVyKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworc3RhdGljIHZvaWQgVUFSVF9FbmRUeFRyYW5zZmVyKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworc3RhdGljIHZvaWQgVUFSVF9ETUFUcmFuc21pdENwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgVUFSVF9ETUFSZWNlaXZlQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBVQVJUX0RNQVJ4SGFsZkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgVUFSVF9ETUFUeEhhbGZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIFVBUlRfRE1BRXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgVUFSVF9ETUFBYm9ydE9uRXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgVUFSVF9ETUFUeEFib3J0Q2FsbGJhY2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgVUFSVF9ETUFSeEFib3J0Q2FsbGJhY2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgVUFSVF9ETUFUeE9ubHlBYm9ydENhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIFVBUlRfRE1BUnhPbmx5QWJvcnRDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBVQVJUX1R4SVNSXzhCSVQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7CitzdGF0aWMgdm9pZCBVQVJUX1R4SVNSXzE2QklUKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworc3RhdGljIHZvaWQgVUFSVF9UeElTUl84QklUX0ZJRk9FTihVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK3N0YXRpYyB2b2lkIFVBUlRfVHhJU1JfMTZCSVRfRklGT0VOKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworc3RhdGljIHZvaWQgVUFSVF9FbmRUcmFuc21pdF9JVChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK3N0YXRpYyB2b2lkIFVBUlRfUnhJU1JfOEJJVChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK3N0YXRpYyB2b2lkIFVBUlRfUnhJU1JfMTZCSVQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7CitzdGF0aWMgdm9pZCBVQVJUX1J4SVNSXzhCSVRfRklGT0VOKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworc3RhdGljIHZvaWQgVUFSVF9SeElTUl8xNkJJVF9GSUZPRU4oVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7CisvKioKKyAqIEB9CisgKi8KKworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBVQVJUX1ByaXZhdGVfdmFyaWFibGVzCisgKiBAeworICovCitjb25zdCB1aW50MTZfdCBVQVJUUHJlc2NUYWJsZVsxMl0gPSB7MVUsICAyVSwgIDRVLCAgNlUsICA4VSwgICAxMFUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTJVLCAxNlUsIDMyVSwgNjRVLCAxMjhVLCAyNTZVfTsKKy8qKgorICogQH0KKyAqLworCisvKiBFeHBvcnRlZCBDb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBVQVJUX0V4cG9ydGVkX0Z1bmN0aW9ucyBVQVJUIEV4cG9ydGVkIEZ1bmN0aW9ucworICogQHsKKyAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQKK2RlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqICBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGluaXRpYWxpemUgdGhlCitVU0FSVHggb3IgdGhlIFVBUlR5IGluIGFzeW5jaHJvbm91cyBtb2RlLgorICAgICAgKCspIEZvciB0aGUgYXN5bmNocm9ub3VzIG1vZGUgdGhlIHBhcmFtZXRlcnMgYmVsb3cgY2FuIGJlIGNvbmZpZ3VyZWQ6CisgICAgICAgICgrKykgQmF1ZCBSYXRlCisgICAgICAgICgrKykgV29yZCBMZW5ndGgKKyAgICAgICAgKCsrKSBTdG9wIEJpdAorICAgICAgICAoKyspIFBhcml0eTogSWYgdGhlIHBhcml0eSBpcyBlbmFibGVkLCB0aGVuIHRoZSBNU0IgYml0IG9mIHRoZSBkYXRhCit3cml0dGVuIGluIHRoZSBkYXRhIHJlZ2lzdGVyIGlzIHRyYW5zbWl0dGVkIGJ1dCBpcyBjaGFuZ2VkIGJ5IHRoZSBwYXJpdHkgYml0LgorICAgICAgICAoKyspIEhhcmR3YXJlIGZsb3cgY29udHJvbAorICAgICAgICAoKyspIFJlY2VpdmVyL3RyYW5zbWl0dGVyIG1vZGVzCisgICAgICAgICgrKykgT3ZlciBTYW1wbGluZyBNZXRob2QKKyAgICAgICAgKCsrKSBPbmUtQml0IFNhbXBsaW5nIE1ldGhvZAorICAgICAgKCspIEZvciB0aGUgYXN5bmNocm9ub3VzIG1vZGUsIHRoZSBmb2xsb3dpbmcgYWR2YW5jZWQgZmVhdHVyZXMgY2FuIGJlCitjb25maWd1cmVkIGFzIHdlbGw6CisgICAgICAgICgrKykgVFggYW5kL29yIFJYIHBpbiBsZXZlbCBpbnZlcnNpb24KKyAgICAgICAgKCsrKSBkYXRhIGxvZ2ljYWwgbGV2ZWwgaW52ZXJzaW9uCisgICAgICAgICgrKykgUlggYW5kIFRYIHBpbnMgc3dhcAorICAgICAgICAoKyspIFJYIG92ZXJydW4gZGV0ZWN0aW9uIGRpc2FibGluZworICAgICAgICAoKyspIERNQSBkaXNhYmxpbmcgb24gUlggZXJyb3IKKyAgICAgICAgKCsrKSBNU0IgZmlyc3Qgb24gY29tbXVuaWNhdGlvbiBsaW5lCisgICAgICAgICgrKykgYXV0byBCYXVkIHJhdGUgZGV0ZWN0aW9uCisgICAgWy4uXQorICAgIFRoZSBIQUxfVUFSVF9Jbml0KCksIEhBTF9IYWxmRHVwbGV4X0luaXQoKSwgSEFMX0xJTl9Jbml0KClhbmQKK0hBTF9NdWx0aVByb2Nlc3Nvcl9Jbml0KClBUEkgZm9sbG93IHJlc3BlY3RpdmVseSB0aGUgVUFSVCBhc3luY2hyb25vdXMsIFVBUlQKK0hhbGYgZHVwbGV4LCBVQVJUIExJTiBtb2RlIGFuZCBVQVJUIG11bHRpcHJvY2Vzc29yIG1vZGUgY29uZmlndXJhdGlvbiBwcm9jZWR1cmVzCisoZGV0YWlscyBmb3IgdGhlIHByb2NlZHVyZXMgYXJlIGF2YWlsYWJsZSBpbiByZWZlcmVuY2UgbWFudWFsKS4KKworQGVuZHZlcmJhdGltCisKKyAgRGVwZW5kaW5nIG9uIHRoZSBmcmFtZSBsZW5ndGggZGVmaW5lZCBieSB0aGUgTTEgYW5kIE0wIGJpdHMgKDctYml0LAorICA4LWJpdCBvciA5LWJpdCksIHRoZSBwb3NzaWJsZSBVQVJUIGZvcm1hdHMgYXJlIGxpc3RlZCBpbiB0aGUKKyAgZm9sbG93aW5nIHRhYmxlLgorCisgIFRhYmxlIDEuIFVBUlQgZnJhbWUgZm9ybWF0LgorICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICB8ICBNMSBiaXQgfCAgTTAgYml0IHwgIFBDRSBiaXQgIHwgICAgICAgICAgICAgVUFSVCBmcmFtZSAgICAgICAgICAgICAgICB8CisgICAgfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgIHwgICAgMCAgICB8ICAgIDAgICAgfCAgICAwICAgICAgfCAgICB8IFNCIHwgICAgOCBiaXQgZGF0YSAgIHwgU1RCIHwgICAgIHwKKyAgICB8LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgfCAgICAwICAgIHwgICAgMCAgICB8ICAgIDEgICAgICB8ICAgIHwgU0IgfCA3IGJpdCBkYXRhIHwgUEIgfCBTVEIgfCAgICAgfAorICAgIHwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICB8ICAgIDAgICAgfCAgICAxICAgIHwgICAgMCAgICAgIHwgICAgfCBTQiB8ICAgIDkgYml0IGRhdGEgICB8IFNUQiB8ICAgICB8CisgICAgfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgIHwgICAgMCAgICB8ICAgIDEgICAgfCAgICAxICAgICAgfCAgICB8IFNCIHwgOCBiaXQgZGF0YSB8IFBCIHwgU1RCIHwgICAgIHwKKyAgICB8LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgfCAgICAxICAgIHwgICAgMCAgICB8ICAgIDAgICAgICB8ICAgIHwgU0IgfCAgICA3IGJpdCBkYXRhICAgfCBTVEIgfCAgICAgfAorICAgIHwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICB8ICAgIDEgICAgfCAgICAwICAgIHwgICAgMSAgICAgIHwgICAgfCBTQiB8IDYgYml0IGRhdGEgfCBQQiB8IFNUQiB8ICAgICB8CisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCisgICogQHsKKyAgKi8KKworLyoqCisgKiBAYnJpZWYgSW5pdGlhbGl6ZSB0aGUgVUFSVCBtb2RlIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCisgKiAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgVUFSVF9Jbml0VHlwZURlZiBhbmQgaW5pdGlhbGl6ZSB0aGUgYXNzb2NpYXRlZAorICogaGFuZGxlLgorICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0luaXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkgeworICAvKiBDaGVjayB0aGUgVUFSVCBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZiAoaHVhcnQgPT0gTlVMTCkgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICBpZiAoaHVhcnQtPkluaXQuSHdGbG93Q3RsICE9IFVBUlRfSFdDT05UUk9MX05PTkUpIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19VQVJUX0hXRkxPV19JTlNUQU5DRShodWFydC0+SW5zdGFuY2UpKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbSgoSVNfVUFSVF9JTlNUQU5DRShodWFydC0+SW5zdGFuY2UpKSB8fAorICAgICAgICAgICAgICAgICAoSVNfTFBVQVJUX0lOU1RBTkNFKGh1YXJ0LT5JbnN0YW5jZSkpKTsKKyAgfQorCisgIGlmIChodWFydC0+Z1N0YXRlID09IEhBTF9VQVJUX1NUQVRFX1JFU0VUKSB7CisgICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLworICAgIGh1YXJ0LT5Mb2NrID0gSEFMX1VOTE9DS0VEOworCisjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICBVQVJUX0luaXRDYWxsYmFja3NUb0RlZmF1bHQoaHVhcnQpOworCisgICAgaWYgKGh1YXJ0LT5Nc3BJbml0Q2FsbGJhY2sgPT0gTlVMTCkgeworICAgICAgaHVhcnQtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9VQVJUX01zcEluaXQ7CisgICAgfQorCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgICAgaHVhcnQtPk1zcEluaXRDYWxsYmFjayhodWFydCk7CisjZWxzZQorICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLICovCisgICAgSEFMX1VBUlRfTXNwSW5pdChodWFydCk7CisjZW5kaWYgLyogKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MpICovCisgIH0KKworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWTsKKworICBfX0hBTF9VQVJUX0RJU0FCTEUoaHVhcnQpOworCisgIC8qIFBlcmZvcm0gYWR2YW5jZWQgc2V0dGluZ3MgY29uZmlndXJhdGlvbiAqLworICAvKiBGb3Igc29tZSBpdGVtcywgY29uZmlndXJhdGlvbiByZXF1aXJlcyB0byBiZSBkb25lIHByaW9yIFRFIGFuZCBSRSBiaXRzIGFyZQorICAgKiBzZXQgKi8KKyAgaWYgKGh1YXJ0LT5BZHZhbmNlZEluaXQuQWR2RmVhdHVyZUluaXQgIT0gVUFSVF9BRFZGRUFUVVJFX05PX0lOSVQpIHsKKyAgICBVQVJUX0FkdkZlYXR1cmVDb25maWcoaHVhcnQpOworICB9CisKKyAgLyogU2V0IHRoZSBVQVJUIENvbW11bmljYXRpb24gcGFyYW1ldGVycyAqLworICBpZiAoVUFSVF9TZXRDb25maWcoaHVhcnQpID09IEhBTF9FUlJPUikgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBJbiBhc3luY2hyb25vdXMgbW9kZSwgdGhlIGZvbGxvd2luZyBiaXRzIG11c3QgYmUga2VwdCBjbGVhcmVkOgorICAtIExJTkVOIGFuZCBDTEtFTiBiaXRzIGluIHRoZSBVU0FSVF9DUjIgcmVnaXN0ZXIsCisgIC0gU0NFTiwgSERTRUwgYW5kIElSRU4gIGJpdHMgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3Rlci4qLworICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjIsIChVU0FSVF9DUjJfTElORU4gfCBVU0FSVF9DUjJfQ0xLRU4pKTsKKyAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLAorICAgICAgICAgICAgKFVTQVJUX0NSM19TQ0VOIHwgVVNBUlRfQ1IzX0hEU0VMIHwgVVNBUlRfQ1IzX0lSRU4pKTsKKworICBfX0hBTF9VQVJUX0VOQUJMRShodWFydCk7CisKKyAgLyogVEVBQ0sgYW5kL29yIFJFQUNLIHRvIGNoZWNrIGJlZm9yZSBtb3ZpbmcgaHVhcnQtPmdTdGF0ZSBhbmQgaHVhcnQtPlJ4U3RhdGUKKyAgICogdG8gUmVhZHkgKi8KKyAgcmV0dXJuIChVQVJUX0NoZWNrSWRsZVN0YXRlKGh1YXJ0KSk7Cit9CisKKy8qKgorICogQGJyaWVmIEluaXRpYWxpemUgdGhlIGhhbGYtZHVwbGV4IG1vZGUgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQKKyAqICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBVQVJUX0luaXRUeXBlRGVmIGFuZCBjcmVhdGVzIHRoZSBhc3NvY2lhdGVkIGhhbmRsZS4KKyAqIEBwYXJhbSBodWFydCBVQVJUIGhhbmRsZS4KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSGFsZkR1cGxleF9Jbml0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpIHsKKyAgLyogQ2hlY2sgdGhlIFVBUlQgaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYgKGh1YXJ0ID09IE5VTEwpIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgVUFSVCBpbnN0YW5jZSAqLworICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9IQUxGRFVQTEVYX0lOU1RBTkNFKGh1YXJ0LT5JbnN0YW5jZSkpOworCisgIGlmIChodWFydC0+Z1N0YXRlID09IEhBTF9VQVJUX1NUQVRFX1JFU0VUKSB7CisgICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLworICAgIGh1YXJ0LT5Mb2NrID0gSEFMX1VOTE9DS0VEOworCisjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICBVQVJUX0luaXRDYWxsYmFja3NUb0RlZmF1bHQoaHVhcnQpOworCisgICAgaWYgKGh1YXJ0LT5Nc3BJbml0Q2FsbGJhY2sgPT0gTlVMTCkgeworICAgICAgaHVhcnQtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9VQVJUX01zcEluaXQ7CisgICAgfQorCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgICAgaHVhcnQtPk1zcEluaXRDYWxsYmFjayhodWFydCk7CisjZWxzZQorICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLICovCisgICAgSEFMX1VBUlRfTXNwSW5pdChodWFydCk7CisjZW5kaWYgLyogKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MpICovCisgIH0KKworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWTsKKworICBfX0hBTF9VQVJUX0RJU0FCTEUoaHVhcnQpOworCisgIC8qIFBlcmZvcm0gYWR2YW5jZWQgc2V0dGluZ3MgY29uZmlndXJhdGlvbiAqLworICAvKiBGb3Igc29tZSBpdGVtcywgY29uZmlndXJhdGlvbiByZXF1aXJlcyB0byBiZSBkb25lIHByaW9yIFRFIGFuZCBSRSBiaXRzIGFyZQorICAgKiBzZXQgKi8KKyAgaWYgKGh1YXJ0LT5BZHZhbmNlZEluaXQuQWR2RmVhdHVyZUluaXQgIT0gVUFSVF9BRFZGRUFUVVJFX05PX0lOSVQpIHsKKyAgICBVQVJUX0FkdkZlYXR1cmVDb25maWcoaHVhcnQpOworICB9CisKKyAgLyogU2V0IHRoZSBVQVJUIENvbW11bmljYXRpb24gcGFyYW1ldGVycyAqLworICBpZiAoVUFSVF9TZXRDb25maWcoaHVhcnQpID09IEhBTF9FUlJPUikgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBJbiBoYWxmLWR1cGxleCBtb2RlLCB0aGUgZm9sbG93aW5nIGJpdHMgbXVzdCBiZSBrZXB0IGNsZWFyZWQ6CisgIC0gTElORU4gYW5kIENMS0VOIGJpdHMgaW4gdGhlIFVTQVJUX0NSMiByZWdpc3RlciwKKyAgLSBTQ0VOIGFuZCBJUkVOIGJpdHMgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3Rlci4qLworICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjIsIChVU0FSVF9DUjJfTElORU4gfCBVU0FSVF9DUjJfQ0xLRU4pKTsKKyAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCAoVVNBUlRfQ1IzX0lSRU4gfCBVU0FSVF9DUjNfU0NFTikpOworCisgIC8qIEVuYWJsZSB0aGUgSGFsZi1EdXBsZXggbW9kZSBieSBzZXR0aW5nIHRoZSBIRFNFTCBiaXQgaW4gdGhlIENSMyByZWdpc3RlciAqLworICBTRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfSERTRUwpOworCisgIF9fSEFMX1VBUlRfRU5BQkxFKGh1YXJ0KTsKKworICAvKiBURUFDSyBhbmQvb3IgUkVBQ0sgdG8gY2hlY2sgYmVmb3JlIG1vdmluZyBodWFydC0+Z1N0YXRlIGFuZCBodWFydC0+UnhTdGF0ZQorICAgKiB0byBSZWFkeSAqLworICByZXR1cm4gKFVBUlRfQ2hlY2tJZGxlU3RhdGUoaHVhcnQpKTsKK30KKworLyoqCisgKiBAYnJpZWYgSW5pdGlhbGl6ZSB0aGUgTElOIG1vZGUgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQKKyAqICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBVQVJUX0luaXRUeXBlRGVmIGFuZCBjcmVhdGVzIHRoZSBhc3NvY2lhdGVkIGhhbmRsZS4KKyAqIEBwYXJhbSBodWFydCAgICAgICAgICAgICBVQVJUIGhhbmRsZS4KKyAqIEBwYXJhbSBCcmVha0RldGVjdExlbmd0aCBTcGVjaWZpZXMgdGhlIExJTiBicmVhayBkZXRlY3Rpb24gbGVuZ3RoLgorICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICBAYXJnIEByZWYgVUFSVF9MSU5CUkVBS0RFVEVDVExFTkdUSF8xMEIgMTAtYml0IGJyZWFrIGRldGVjdGlvbgorICogICAgICAgICAgQGFyZyBAcmVmIFVBUlRfTElOQlJFQUtERVRFQ1RMRU5HVEhfMTFCIDExLWJpdCBicmVhayBkZXRlY3Rpb24KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTElOX0luaXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBCcmVha0RldGVjdExlbmd0aCkgeworICAvKiBDaGVjayB0aGUgVUFSVCBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZiAoaHVhcnQgPT0gTlVMTCkgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgTElOIFVBUlQgaW5zdGFuY2UgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfTElOX0lOU1RBTkNFKGh1YXJ0LT5JbnN0YW5jZSkpOworICAvKiBDaGVjayB0aGUgQnJlYWsgZGV0ZWN0aW9uIGxlbmd0aCBwYXJhbWV0ZXIgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfTElOX0JSRUFLX0RFVEVDVF9MRU5HVEgoQnJlYWtEZXRlY3RMZW5ndGgpKTsKKworICAvKiBMSU4gbW9kZSBsaW1pdGVkIHRvIDE2LWJpdCBvdmVyc2FtcGxpbmcgb25seSAqLworICBpZiAoaHVhcnQtPkluaXQuT3ZlclNhbXBsaW5nID09IFVBUlRfT1ZFUlNBTVBMSU5HXzgpIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIC8qIExJTiBtb2RlIGxpbWl0ZWQgdG8gOC1iaXQgZGF0YSBsZW5ndGggKi8KKyAgaWYgKGh1YXJ0LT5Jbml0LldvcmRMZW5ndGggIT0gVUFSVF9XT1JETEVOR1RIXzhCKSB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIGlmIChodWFydC0+Z1N0YXRlID09IEhBTF9VQVJUX1NUQVRFX1JFU0VUKSB7CisgICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLworICAgIGh1YXJ0LT5Mb2NrID0gSEFMX1VOTE9DS0VEOworCisjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICBVQVJUX0luaXRDYWxsYmFja3NUb0RlZmF1bHQoaHVhcnQpOworCisgICAgaWYgKGh1YXJ0LT5Nc3BJbml0Q2FsbGJhY2sgPT0gTlVMTCkgeworICAgICAgaHVhcnQtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9VQVJUX01zcEluaXQ7CisgICAgfQorCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgICAgaHVhcnQtPk1zcEluaXRDYWxsYmFjayhodWFydCk7CisjZWxzZQorICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLICovCisgICAgSEFMX1VBUlRfTXNwSW5pdChodWFydCk7CisjZW5kaWYgLyogKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MpICovCisgIH0KKworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWTsKKworICBfX0hBTF9VQVJUX0RJU0FCTEUoaHVhcnQpOworCisgIC8qIFBlcmZvcm0gYWR2YW5jZWQgc2V0dGluZ3MgY29uZmlndXJhdGlvbiAqLworICAvKiBGb3Igc29tZSBpdGVtcywgY29uZmlndXJhdGlvbiByZXF1aXJlcyB0byBiZSBkb25lIHByaW9yIFRFIGFuZCBSRSBiaXRzIGFyZQorICAgKiBzZXQgKi8KKyAgaWYgKGh1YXJ0LT5BZHZhbmNlZEluaXQuQWR2RmVhdHVyZUluaXQgIT0gVUFSVF9BRFZGRUFUVVJFX05PX0lOSVQpIHsKKyAgICBVQVJUX0FkdkZlYXR1cmVDb25maWcoaHVhcnQpOworICB9CisKKyAgLyogU2V0IHRoZSBVQVJUIENvbW11bmljYXRpb24gcGFyYW1ldGVycyAqLworICBpZiAoVUFSVF9TZXRDb25maWcoaHVhcnQpID09IEhBTF9FUlJPUikgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBJbiBMSU4gbW9kZSwgdGhlIGZvbGxvd2luZyBiaXRzIG11c3QgYmUga2VwdCBjbGVhcmVkOgorICAtIExJTkVOIGFuZCBDTEtFTiBiaXRzIGluIHRoZSBVU0FSVF9DUjIgcmVnaXN0ZXIsCisgIC0gU0NFTiBhbmQgSVJFTiBiaXRzIGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIuKi8KKyAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IyLCBVU0FSVF9DUjJfQ0xLRU4pOworICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsCisgICAgICAgICAgICAoVVNBUlRfQ1IzX0hEU0VMIHwgVVNBUlRfQ1IzX0lSRU4gfCBVU0FSVF9DUjNfU0NFTikpOworCisgIC8qIEVuYWJsZSB0aGUgTElOIG1vZGUgYnkgc2V0dGluZyB0aGUgTElORU4gYml0IGluIHRoZSBDUjIgcmVnaXN0ZXIgKi8KKyAgU0VUX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX0xJTkVOKTsKKworICAvKiBTZXQgdGhlIFVTQVJUIExJTiBCcmVhayBkZXRlY3Rpb24gbGVuZ3RoLiAqLworICBNT0RJRllfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IyLCBVU0FSVF9DUjJfTEJETCwgQnJlYWtEZXRlY3RMZW5ndGgpOworCisgIF9fSEFMX1VBUlRfRU5BQkxFKGh1YXJ0KTsKKworICAvKiBURUFDSyBhbmQvb3IgUkVBQ0sgdG8gY2hlY2sgYmVmb3JlIG1vdmluZyBodWFydC0+Z1N0YXRlIGFuZCBodWFydC0+UnhTdGF0ZQorICAgKiB0byBSZWFkeSAqLworICByZXR1cm4gKFVBUlRfQ2hlY2tJZGxlU3RhdGUoaHVhcnQpKTsKK30KKworLyoqCisgKiBAYnJpZWYgSW5pdGlhbGl6ZSB0aGUgbXVsdGlwcm9jZXNzb3IgbW9kZSBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAorICogICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIFVBUlRfSW5pdFR5cGVEZWYgYW5kIGluaXRpYWxpemUgdGhlIGFzc29jaWF0ZWQKKyAqIGhhbmRsZS4KKyAqIEBwYXJhbSBodWFydCAgICAgICAgVUFSVCBoYW5kbGUuCisgKiBAcGFyYW0gQWRkcmVzcyAgICAgIFVBUlQgbm9kZSBhZGRyZXNzICg0LSwgNi0sIDctIG9yIDgtYml0IGxvbmcpLgorICogQHBhcmFtIFdha2VVcE1ldGhvZCBTcGVjaWZpZXMgdGhlIFVBUlQgd2FrZXVwIG1ldGhvZC4KKyAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgQGFyZyBAcmVmIFVBUlRfV0FLRVVQTUVUSE9EX0lETEVMSU5FIFdha2VVcCBieSBhbiBpZGxlIGxpbmUKKyAqIGRldGVjdGlvbgorICogICAgICAgICAgQGFyZyBAcmVmIFVBUlRfV0FLRVVQTUVUSE9EX0FERFJFU1NNQVJLIFdha2VVcCBieSBhbiBhZGRyZXNzIG1hcmsKKyAqIEBub3RlICBJZiB0aGUgdXNlciByZXNvcnRzIHRvIGlkbGUgbGluZSBkZXRlY3Rpb24gd2FrZSB1cCwgdGhlIEFkZHJlc3MKKyAqIHBhcmFtZXRlciBpcyB1c2VsZXNzIGFuZCBpZ25vcmVkIGJ5IHRoZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbi4KKyAqIEBub3RlICBJZiB0aGUgdXNlciByZXNvcnRzIHRvIGFkZHJlc3MgbWFyayB3YWtlIHVwLCB0aGUgYWRkcmVzcyBsZW5ndGgKKyAqIGRldGVjdGlvbiBpcyBjb25maWd1cmVkIGJ5IGRlZmF1bHQgdG8gNCBiaXRzIG9ubHkuIEZvciB0aGUgVUFSVCB0byBiZSBhYmxlIHRvCisgKiAgICAgICAgbWFuYWdlIDYtLCA3LSBvciA4LWJpdCBsb25nIGFkZHJlc3NlcyBkZXRlY3Rpb24sIHRoZSBBUEkKKyAqICAgICAgICBIQUxfTXVsdGlQcm9jZXNzb3JFeF9BZGRyZXNzTGVuZ3RoX1NldCgpIG11c3QgYmUgY2FsbGVkIGFmdGVyCisgKiAgICAgICAgSEFMX011bHRpUHJvY2Vzc29yX0luaXQoKS4KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTXVsdGlQcm9jZXNzb3JfSW5pdChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgV2FrZVVwTWV0aG9kKSB7CisgIC8qIENoZWNrIHRoZSBVQVJUIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmIChodWFydCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHRoZSB3YWtlIHVwIG1ldGhvZCBwYXJhbWV0ZXIgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfV0FLRVVQTUVUSE9EKFdha2VVcE1ldGhvZCkpOworCisgIGlmIChodWFydC0+Z1N0YXRlID09IEhBTF9VQVJUX1NUQVRFX1JFU0VUKSB7CisgICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLworICAgIGh1YXJ0LT5Mb2NrID0gSEFMX1VOTE9DS0VEOworCisjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICBVQVJUX0luaXRDYWxsYmFja3NUb0RlZmF1bHQoaHVhcnQpOworCisgICAgaWYgKGh1YXJ0LT5Nc3BJbml0Q2FsbGJhY2sgPT0gTlVMTCkgeworICAgICAgaHVhcnQtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9VQVJUX01zcEluaXQ7CisgICAgfQorCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgICAgaHVhcnQtPk1zcEluaXRDYWxsYmFjayhodWFydCk7CisjZWxzZQorICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLICovCisgICAgSEFMX1VBUlRfTXNwSW5pdChodWFydCk7CisjZW5kaWYgLyogKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MpICovCisgIH0KKworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWTsKKworICBfX0hBTF9VQVJUX0RJU0FCTEUoaHVhcnQpOworCisgIC8qIFBlcmZvcm0gYWR2YW5jZWQgc2V0dGluZ3MgY29uZmlndXJhdGlvbiAqLworICAvKiBGb3Igc29tZSBpdGVtcywgY29uZmlndXJhdGlvbiByZXF1aXJlcyB0byBiZSBkb25lIHByaW9yIFRFIGFuZCBSRSBiaXRzIGFyZQorICAgKiBzZXQgKi8KKyAgaWYgKGh1YXJ0LT5BZHZhbmNlZEluaXQuQWR2RmVhdHVyZUluaXQgIT0gVUFSVF9BRFZGRUFUVVJFX05PX0lOSVQpIHsKKyAgICBVQVJUX0FkdkZlYXR1cmVDb25maWcoaHVhcnQpOworICB9CisKKyAgLyogU2V0IHRoZSBVQVJUIENvbW11bmljYXRpb24gcGFyYW1ldGVycyAqLworICBpZiAoVUFSVF9TZXRDb25maWcoaHVhcnQpID09IEhBTF9FUlJPUikgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBJbiBtdWx0aXByb2Nlc3NvciBtb2RlLCB0aGUgZm9sbG93aW5nIGJpdHMgbXVzdCBiZSBrZXB0IGNsZWFyZWQ6CisgIC0gTElORU4gYW5kIENMS0VOIGJpdHMgaW4gdGhlIFVTQVJUX0NSMiByZWdpc3RlciwKKyAgLSBTQ0VOLCBIRFNFTCBhbmQgSVJFTiAgYml0cyBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLiAqLworICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjIsIChVU0FSVF9DUjJfTElORU4gfCBVU0FSVF9DUjJfQ0xLRU4pKTsKKyAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLAorICAgICAgICAgICAgKFVTQVJUX0NSM19TQ0VOIHwgVVNBUlRfQ1IzX0hEU0VMIHwgVVNBUlRfQ1IzX0lSRU4pKTsKKworICBpZiAoV2FrZVVwTWV0aG9kID09IFVBUlRfV0FLRVVQTUVUSE9EX0FERFJFU1NNQVJLKSB7CisgICAgLyogSWYgYWRkcmVzcyBtYXJrIHdha2UgdXAgbWV0aG9kIGlzIGNob3Nlbiwgc2V0IHRoZSBVU0FSVCBhZGRyZXNzIG5vZGUgKi8KKyAgICBNT0RJRllfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IyLCBVU0FSVF9DUjJfQURELAorICAgICAgICAgICAgICAgKCh1aW50MzJfdClBZGRyZXNzIDw8IFVBUlRfQ1IyX0FERFJFU1NfTFNCX1BPUykpOworICB9CisKKyAgLyogU2V0IHRoZSB3YWtlIHVwIG1ldGhvZCBieSBzZXR0aW5nIHRoZSBXQUtFIGJpdCBpbiB0aGUgQ1IxIHJlZ2lzdGVyICovCisgIE1PRElGWV9SRUcoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9XQUtFLCBXYWtlVXBNZXRob2QpOworCisgIF9fSEFMX1VBUlRfRU5BQkxFKGh1YXJ0KTsKKworICAvKiBURUFDSyBhbmQvb3IgUkVBQ0sgdG8gY2hlY2sgYmVmb3JlIG1vdmluZyBodWFydC0+Z1N0YXRlIGFuZCBodWFydC0+UnhTdGF0ZQorICAgKiB0byBSZWFkeSAqLworICByZXR1cm4gKFVBUlRfQ2hlY2tJZGxlU3RhdGUoaHVhcnQpKTsKK30KKworLyoqCisgKiBAYnJpZWYgRGVJbml0aWFsaXplIHRoZSBVQVJUIHBlcmlwaGVyYWwuCisgKiBAcGFyYW0gaHVhcnQgVUFSVCBoYW5kbGUuCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfRGVJbml0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpIHsKKyAgLyogQ2hlY2sgdGhlIFVBUlQgaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYgKGh1YXJ0ID09IE5VTEwpIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKChJU19VQVJUX0lOU1RBTkNFKGh1YXJ0LT5JbnN0YW5jZSkpIHx8CisgICAgICAgICAgICAgICAoSVNfTFBVQVJUX0lOU1RBTkNFKGh1YXJ0LT5JbnN0YW5jZSkpKTsKKworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWTsKKworICBfX0hBTF9VQVJUX0RJU0FCTEUoaHVhcnQpOworCisgIGh1YXJ0LT5JbnN0YW5jZS0+Q1IxID0gMHgwVTsKKyAgaHVhcnQtPkluc3RhbmNlLT5DUjIgPSAweDBVOworICBodWFydC0+SW5zdGFuY2UtPkNSMyA9IDB4MFU7CisKKyNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBpZiAoaHVhcnQtPk1zcERlSW5pdENhbGxiYWNrID09IE5VTEwpIHsKKyAgICBodWFydC0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfVUFSVF9Nc3BEZUluaXQ7CisgIH0KKyAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgaHVhcnQtPk1zcERlSW5pdENhbGxiYWNrKGh1YXJ0KTsKKyNlbHNlCisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgIEhBTF9VQVJUX01zcERlSW5pdChodWFydCk7CisjZW5kaWYgLyogKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MpICovCisKKyAgaHVhcnQtPkVycm9yQ29kZSA9IEhBTF9VQVJUX0VSUk9SX05PTkU7CisgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRVNFVDsKKyAgaHVhcnQtPlJ4U3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRVNFVDsKKyAgaHVhcnQtPlJlY2VwdGlvblR5cGUgPSBIQUxfVUFSVF9SRUNFUFRJT05fU1RBTkRBUkQ7CisgIGh1YXJ0LT5SeEV2ZW50VHlwZSA9IEhBTF9VQVJUX1JYRVZFTlRfVEM7CisKKyAgX19IQUxfVU5MT0NLKGh1YXJ0KTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiBJbml0aWFsaXplIHRoZSBVQVJUIE1TUC4KKyAqIEBwYXJhbSBodWFydCBVQVJUIGhhbmRsZS4KKyAqIEByZXR2YWwgTm9uZQorICovCitfX3dlYWsgdm9pZCBIQUxfVUFSVF9Nc3BJbml0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpIHsKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHVhcnQpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVUFSVF9Nc3BJbml0IGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAqIEBicmllZiBEZUluaXRpYWxpemUgdGhlIFVBUlQgTVNQLgorICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICogQHJldHZhbCBOb25lCisgKi8KK19fd2VhayB2b2lkIEhBTF9VQVJUX01zcERlSW5pdChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KSB7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh1YXJ0KTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1VBUlRfTXNwRGVJbml0IGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKy8qKgorICogQGJyaWVmICBSZWdpc3RlciBhIFVzZXIgVUFSVCBDYWxsYmFjaworICogICAgICAgICBUbyBiZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSB3ZWFrIHByZWRlZmluZWQgY2FsbGJhY2sKKyAqIEBub3RlICAgVGhlIEhBTF9VQVJUX1JlZ2lzdGVyQ2FsbGJhY2soKSBtYXkgYmUgY2FsbGVkIGJlZm9yZSBIQUxfVUFSVF9Jbml0KCksCisgKiBIQUxfSGFsZkR1cGxleF9Jbml0KCksIEhBTF9MSU5fSW5pdCgpLCBIQUxfTXVsdGlQcm9jZXNzb3JfSW5pdCgpIG9yCisgKiBIQUxfUlM0ODVFeF9Jbml0KCkgaW4gSEFMX1VBUlRfU1RBVEVfUkVTRVQgdG8gcmVnaXN0ZXIgY2FsbGJhY2tzIGZvcgorICogSEFMX1VBUlRfTVNQSU5JVF9DQl9JRCBhbmQgSEFMX1VBUlRfTVNQREVJTklUX0NCX0lECisgKiBAcGFyYW0gIGh1YXJ0IHVhcnQgaGFuZGxlCisgKiBAcGFyYW0gIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHJlZ2lzdGVyZWQKKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1VBUlRfVFhfSEFMRkNPTVBMRVRFX0NCX0lEIFR4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2sKKyAqIElECisgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VQVJUX1RYX0NPTVBMRVRFX0NCX0lEIFR4IENvbXBsZXRlIENhbGxiYWNrIElECisgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VQVJUX1JYX0hBTEZDT01QTEVURV9DQl9JRCBSeCBIYWxmIENvbXBsZXRlIENhbGxiYWNrCisgKiBJRAorICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVUFSVF9SWF9DT01QTEVURV9DQl9JRCBSeCBDb21wbGV0ZSBDYWxsYmFjayBJRAorICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVUFSVF9FUlJPUl9DQl9JRCBFcnJvciBDYWxsYmFjayBJRAorICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVUFSVF9BQk9SVF9DT01QTEVURV9DQl9JRCBBYm9ydCBDb21wbGV0ZSBDYWxsYmFjayBJRAorICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVUFSVF9BQk9SVF9UUkFOU01JVF9DT01QTEVURV9DQl9JRCBBYm9ydCBUcmFuc21pdAorICogQ29tcGxldGUgQ2FsbGJhY2sgSUQKKyAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1VBUlRfQUJPUlRfUkVDRUlWRV9DT01QTEVURV9DQl9JRCBBYm9ydCBSZWNlaXZlCisgKiBDb21wbGV0ZSBDYWxsYmFjayBJRAorICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVUFSVF9XQUtFVVBfQ0JfSUQgV2FrZXVwIENhbGxiYWNrIElECisgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VQVJUX1JYX0ZJRk9fRlVMTF9DQl9JRCBSeCBGaWZvIEZ1bGwgQ2FsbGJhY2sgSUQKKyAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1VBUlRfVFhfRklGT19FTVBUWV9DQl9JRCBUeCBGaWZvIEVtcHR5IENhbGxiYWNrIElECisgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VQVJUX01TUElOSVRfQ0JfSUQgTXNwSW5pdCBDYWxsYmFjayBJRAorICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVUFSVF9NU1BERUlOSVRfQ0JfSUQgTXNwRGVJbml0IENhbGxiYWNrIElECisgKiBAcGFyYW0gIHBDYWxsYmFjayBwb2ludGVyIHRvIHRoZSBDYWxsYmFjayBmdW5jdGlvbgorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX1JlZ2lzdGVyQ2FsbGJhY2soCisgICAgVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwgSEFMX1VBUlRfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwKKyAgICBwVUFSVF9DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKSB7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBpZiAocENhbGxiYWNrID09IE5VTEwpIHsKKyAgICBodWFydC0+RXJyb3JDb2RlIHw9IEhBTF9VQVJUX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgaWYgKGh1YXJ0LT5nU3RhdGUgPT0gSEFMX1VBUlRfU1RBVEVfUkVBRFkpIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpIHsKKyAgICAgIGNhc2UgSEFMX1VBUlRfVFhfSEFMRkNPTVBMRVRFX0NCX0lEOgorICAgICAgICBodWFydC0+VHhIYWxmQ3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVUFSVF9UWF9DT01QTEVURV9DQl9JRDoKKyAgICAgICAgaHVhcnQtPlR4Q3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVUFSVF9SWF9IQUxGQ09NUExFVEVfQ0JfSUQ6CisgICAgICAgIGh1YXJ0LT5SeEhhbGZDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9VQVJUX1JYX0NPTVBMRVRFX0NCX0lEOgorICAgICAgICBodWFydC0+UnhDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9VQVJUX0VSUk9SX0NCX0lEOgorICAgICAgICBodWFydC0+RXJyb3JDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VBUlRfQUJPUlRfQ09NUExFVEVfQ0JfSUQ6CisgICAgICAgIGh1YXJ0LT5BYm9ydENwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VBUlRfQUJPUlRfVFJBTlNNSVRfQ09NUExFVEVfQ0JfSUQ6CisgICAgICAgIGh1YXJ0LT5BYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVUFSVF9BQk9SVF9SRUNFSVZFX0NPTVBMRVRFX0NCX0lEOgorICAgICAgICBodWFydC0+QWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVUFSVF9XQUtFVVBfQ0JfSUQ6CisgICAgICAgIGh1YXJ0LT5XYWtldXBDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VBUlRfUlhfRklGT19GVUxMX0NCX0lEOgorICAgICAgICBodWFydC0+UnhGaWZvRnVsbENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVUFSVF9UWF9GSUZPX0VNUFRZX0NCX0lEOgorICAgICAgICBodWFydC0+VHhGaWZvRW1wdHlDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VBUlRfTVNQSU5JVF9DQl9JRDoKKyAgICAgICAgaHVhcnQtPk1zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VBUlRfTVNQREVJTklUX0NCX0lEOgorICAgICAgICBodWFydC0+TXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICBodWFydC0+RXJyb3JDb2RlIHw9IEhBTF9VQVJUX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0gZWxzZSBpZiAoaHVhcnQtPmdTdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9SRVNFVCkgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkgeworICAgICAgY2FzZSBIQUxfVUFSVF9NU1BJTklUX0NCX0lEOgorICAgICAgICBodWFydC0+TXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVUFSVF9NU1BERUlOSVRfQ0JfSUQ6CisgICAgICAgIGh1YXJ0LT5Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGh1YXJ0LT5FcnJvckNvZGUgfD0gSEFMX1VBUlRfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBodWFydC0+RXJyb3JDb2RlIHw9IEhBTF9VQVJUX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIEBicmllZiAgVW5yZWdpc3RlciBhbiBVQVJUIENhbGxiYWNrCisgKiAgICAgICAgIFVBUlQgY2FsbGFiYWNrIGlzIHJlZGlyZWN0ZWQgdG8gdGhlIHdlYWsgcHJlZGVmaW5lZCBjYWxsYmFjaworICogQG5vdGUgICBUaGUgSEFMX1VBUlRfVW5SZWdpc3RlckNhbGxiYWNrKCkgbWF5IGJlIGNhbGxlZCBiZWZvcmUKKyAqIEhBTF9VQVJUX0luaXQoKSwgSEFMX0hhbGZEdXBsZXhfSW5pdCgpLCBIQUxfTElOX0luaXQoKSwKKyAqIEhBTF9NdWx0aVByb2Nlc3Nvcl9Jbml0KCkgb3IgSEFMX1JTNDg1RXhfSW5pdCgpIGluIEhBTF9VQVJUX1NUQVRFX1JFU0VUIHRvCisgKiB1bi1yZWdpc3RlciBjYWxsYmFja3MgZm9yIEhBTF9VQVJUX01TUElOSVRfQ0JfSUQgYW5kIEhBTF9VQVJUX01TUERFSU5JVF9DQl9JRAorICogQHBhcmFtICBodWFydCB1YXJ0IGhhbmRsZQorICogQHBhcmFtICBDYWxsYmFja0lEIElEIG9mIHRoZSBjYWxsYmFjayB0byBiZSB1bnJlZ2lzdGVyZWQKKyAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1VBUlRfVFhfSEFMRkNPTVBMRVRFX0NCX0lEIFR4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2sKKyAqIElECisgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VQVJUX1RYX0NPTVBMRVRFX0NCX0lEIFR4IENvbXBsZXRlIENhbGxiYWNrIElECisgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VQVJUX1JYX0hBTEZDT01QTEVURV9DQl9JRCBSeCBIYWxmIENvbXBsZXRlIENhbGxiYWNrCisgKiBJRAorICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVUFSVF9SWF9DT01QTEVURV9DQl9JRCBSeCBDb21wbGV0ZSBDYWxsYmFjayBJRAorICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVUFSVF9FUlJPUl9DQl9JRCBFcnJvciBDYWxsYmFjayBJRAorICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVUFSVF9BQk9SVF9DT01QTEVURV9DQl9JRCBBYm9ydCBDb21wbGV0ZSBDYWxsYmFjayBJRAorICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVUFSVF9BQk9SVF9UUkFOU01JVF9DT01QTEVURV9DQl9JRCBBYm9ydCBUcmFuc21pdAorICogQ29tcGxldGUgQ2FsbGJhY2sgSUQKKyAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1VBUlRfQUJPUlRfUkVDRUlWRV9DT01QTEVURV9DQl9JRCBBYm9ydCBSZWNlaXZlCisgKiBDb21wbGV0ZSBDYWxsYmFjayBJRAorICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVUFSVF9XQUtFVVBfQ0JfSUQgV2FrZXVwIENhbGxiYWNrIElECisgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VQVJUX1JYX0ZJRk9fRlVMTF9DQl9JRCBSeCBGaWZvIEZ1bGwgQ2FsbGJhY2sgSUQKKyAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1VBUlRfVFhfRklGT19FTVBUWV9DQl9JRCBUeCBGaWZvIEVtcHR5IENhbGxiYWNrIElECisgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VQVJUX01TUElOSVRfQ0JfSUQgTXNwSW5pdCBDYWxsYmFjayBJRAorICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVUFSVF9NU1BERUlOSVRfQ0JfSUQgTXNwRGVJbml0IENhbGxiYWNrIElECisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfVW5SZWdpc3RlckNhbGxiYWNrKAorICAgIFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIEhBTF9VQVJUX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpIHsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIGlmIChIQUxfVUFSVF9TVEFURV9SRUFEWSA9PSBodWFydC0+Z1N0YXRlKSB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKSB7CisgICAgICBjYXNlIEhBTF9VQVJUX1RYX0hBTEZDT01QTEVURV9DQl9JRDoKKyAgICAgICAgaHVhcnQtPlR4SGFsZkNwbHRDYWxsYmFjayA9CisgICAgICAgICAgICBIQUxfVUFSVF9UeEhhbGZDcGx0Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrICBUeEhhbGZDcGx0Q2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VBUlRfVFhfQ09NUExFVEVfQ0JfSUQ6CisgICAgICAgIGh1YXJ0LT5UeENwbHRDYWxsYmFjayA9CisgICAgICAgICAgICBIQUxfVUFSVF9UeENwbHRDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgVHhDcGx0Q2FsbGJhY2sgICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVUFSVF9SWF9IQUxGQ09NUExFVEVfQ0JfSUQ6CisgICAgICAgIGh1YXJ0LT5SeEhhbGZDcGx0Q2FsbGJhY2sgPQorICAgICAgICAgICAgSEFMX1VBUlRfUnhIYWxmQ3BsdENhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBSeEhhbGZDcGx0Q2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VBUlRfUlhfQ09NUExFVEVfQ0JfSUQ6CisgICAgICAgIGh1YXJ0LT5SeENwbHRDYWxsYmFjayA9CisgICAgICAgICAgICBIQUxfVUFSVF9SeENwbHRDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgUnhDcGx0Q2FsbGJhY2sgICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVUFSVF9FUlJPUl9DQl9JRDoKKyAgICAgICAgaHVhcnQtPkVycm9yQ2FsbGJhY2sgPQorICAgICAgICAgICAgSEFMX1VBUlRfRXJyb3JDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgRXJyb3JDYWxsYmFjayAgICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVUFSVF9BQk9SVF9DT01QTEVURV9DQl9JRDoKKyAgICAgICAgaHVhcnQtPkFib3J0Q3BsdENhbGxiYWNrID0KKyAgICAgICAgICAgIEhBTF9VQVJUX0Fib3J0Q3BsdENhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBBYm9ydENwbHRDYWxsYmFjayAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9VQVJUX0FCT1JUX1RSQU5TTUlUX0NPTVBMRVRFX0NCX0lEOgorICAgICAgICBodWFydC0+QWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayA9CisgICAgICAgICAgICBIQUxfVUFSVF9BYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrOyAvKiBMZWdhY3kgd2VhaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVUFSVF9BQk9SVF9SRUNFSVZFX0NPTVBMRVRFX0NCX0lEOgorICAgICAgICBodWFydC0+QWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrID0KKyAgICAgICAgICAgIEhBTF9VQVJUX0Fib3J0UmVjZWl2ZUNwbHRDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9VQVJUX1dBS0VVUF9DQl9JRDoKKyAgICAgICAgaHVhcnQtPldha2V1cENhbGxiYWNrID0KKyAgICAgICAgICAgIEhBTF9VQVJURXhfV2FrZXVwQ2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIFdha2V1cENhbGxiYWNrICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VBUlRfUlhfRklGT19GVUxMX0NCX0lEOgorICAgICAgICBodWFydC0+UnhGaWZvRnVsbENhbGxiYWNrID0KKyAgICAgICAgICAgIEhBTF9VQVJURXhfUnhGaWZvRnVsbENhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBSeEZpZm9GdWxsQ2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VBUlRfVFhfRklGT19FTVBUWV9DQl9JRDoKKyAgICAgICAgaHVhcnQtPlR4Rmlmb0VtcHR5Q2FsbGJhY2sgPQorICAgICAgICAgICAgSEFMX1VBUlRFeF9UeEZpZm9FbXB0eUNhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBUeEZpZm9FbXB0eUNhbGxiYWNrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVUFSVF9NU1BJTklUX0NCX0lEOgorICAgICAgICBodWFydC0+TXNwSW5pdENhbGxiYWNrID0KKyAgICAgICAgICAgIEhBTF9VQVJUX01zcEluaXQ7IC8qIExlZ2FjeSB3ZWFrIE1zcEluaXRDYWxsYmFjayAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VBUlRfTVNQREVJTklUX0NCX0lEOgorICAgICAgICBodWFydC0+TXNwRGVJbml0Q2FsbGJhY2sgPQorICAgICAgICAgICAgSEFMX1VBUlRfTXNwRGVJbml0OyAvKiBMZWdhY3kgd2VhayBNc3BEZUluaXRDYWxsYmFjayAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICBodWFydC0+RXJyb3JDb2RlIHw9IEhBTF9VQVJUX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0gZWxzZSBpZiAoSEFMX1VBUlRfU1RBVEVfUkVTRVQgPT0gaHVhcnQtPmdTdGF0ZSkgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkgeworICAgICAgY2FzZSBIQUxfVUFSVF9NU1BJTklUX0NCX0lEOgorICAgICAgICBodWFydC0+TXNwSW5pdENhbGxiYWNrID0gSEFMX1VBUlRfTXNwSW5pdDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VBUlRfTVNQREVJTklUX0NCX0lEOgorICAgICAgICBodWFydC0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfVUFSVF9Nc3BEZUluaXQ7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICBodWFydC0+RXJyb3JDb2RlIHw9IEhBTF9VQVJUX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaHVhcnQtPkVycm9yQ29kZSB8PSBIQUxfVUFSVF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBAYnJpZWYgIFJlZ2lzdGVyIGEgVXNlciBVQVJUIFJ4IEV2ZW50IENhbGxiYWNrCisgKiAgICAgICAgIFRvIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgd2VhayBwcmVkZWZpbmVkIGNhbGxiYWNrCisgKiBAcGFyYW0gIGh1YXJ0ICAgICBVYXJ0IGhhbmRsZQorICogQHBhcmFtICBwQ2FsbGJhY2sgUG9pbnRlciB0byB0aGUgUnggRXZlbnQgQ2FsbGJhY2sgZnVuY3Rpb24KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9SZWdpc3RlclJ4RXZlbnRDYWxsYmFjaygKKyAgICBVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCBwVUFSVF9SeEV2ZW50Q2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjaykgeworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgaWYgKHBDYWxsYmFjayA9PSBOVUxMKSB7CisgICAgaHVhcnQtPkVycm9yQ29kZSB8PSBIQUxfVUFSVF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIGlmIChodWFydC0+UnhTdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9SRUFEWSkgeworICAgIGh1YXJ0LT5SeEV2ZW50Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgIH0gZWxzZSB7CisgICAgaHVhcnQtPkVycm9yQ29kZSB8PSBIQUxfVUFSVF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBAYnJpZWYgIFVuUmVnaXN0ZXIgdGhlIFVBUlQgUnggRXZlbnQgQ2FsbGJhY2sKKyAqICAgICAgICAgVUFSVCBSeCBFdmVudCBDYWxsYmFjayBpcyByZWRpcmVjdGVkIHRvIHRoZSB3ZWFrCisgKiBIQUxfVUFSVEV4X1J4RXZlbnRDYWxsYmFjaygpIHByZWRlZmluZWQgY2FsbGJhY2sKKyAqIEBwYXJhbSAgaHVhcnQgICAgIFVhcnQgaGFuZGxlCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfVW5SZWdpc3RlclJ4RXZlbnRDYWxsYmFjaygKKyAgICBVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KSB7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBpZiAoaHVhcnQtPlJ4U3RhdGUgPT0gSEFMX1VBUlRfU1RBVEVfUkVBRFkpIHsKKyAgICBodWFydC0+UnhFdmVudENhbGxiYWNrID0KKyAgICAgICAgSEFMX1VBUlRFeF9SeEV2ZW50Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIFVBUlQgUnggRXZlbnQgQ2FsbGJhY2sgICovCisgIH0gZWxzZSB7CisgICAgaHVhcnQtPkVycm9yQ29kZSB8PSBIQUxfVUFSVF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKiBAYnJpZWYgVUFSVCBUcmFuc21pdC9SZWNlaXZlIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIG1hbmFnZSB0aGUgVUFSVAorYXN5bmNocm9ub3VzIGFuZCBIYWxmIGR1cGxleCBkYXRhIHRyYW5zZmVycy4KKworICAgICgjKSBUaGVyZSBhcmUgdHdvIG1vZGUgb2YgdHJhbnNmZXI6CisgICAgICAgKCspIEJsb2NraW5nIG1vZGU6IFRoZSBjb21tdW5pY2F0aW9uIGlzIHBlcmZvcm1lZCBpbiBwb2xsaW5nIG1vZGUuCisgICAgICAgICAgIFRoZSBIQUwgc3RhdHVzIG9mIGFsbCBkYXRhIHByb2Nlc3NpbmcgaXMgcmV0dXJuZWQgYnkgdGhlIHNhbWUKK2Z1bmN0aW9uIGFmdGVyIGZpbmlzaGluZyB0cmFuc2Zlci4KKyAgICAgICAoKykgTm9uLUJsb2NraW5nIG1vZGU6IFRoZSBjb21tdW5pY2F0aW9uIGlzIHBlcmZvcm1lZCB1c2luZyBJbnRlcnJ1cHRzCisgICAgICAgICAgIG9yIERNQSwgVGhlc2UgQVBJJ3MgcmV0dXJuIHRoZSBIQUwgc3RhdHVzLgorICAgICAgICAgICBUaGUgZW5kIG9mIHRoZSBkYXRhIHByb2Nlc3Npbmcgd2lsbCBiZSBpbmRpY2F0ZWQgdGhyb3VnaCB0aGUKKyAgICAgICAgICAgZGVkaWNhdGVkIFVBUlQgSVJRIHdoZW4gdXNpbmcgSW50ZXJydXB0IG1vZGUgb3IgdGhlIERNQSBJUlEgd2hlbgorICAgICAgICAgICB1c2luZyBETUEgbW9kZS4KKyAgICAgICAgICAgVGhlIEhBTF9VQVJUX1R4Q3BsdENhbGxiYWNrKCksIEhBTF9VQVJUX1J4Q3BsdENhbGxiYWNrKCkgdXNlcgorY2FsbGJhY2tzIHdpbGwgYmUgZXhlY3V0ZWQgcmVzcGVjdGl2ZWx5IGF0IHRoZSBlbmQgb2YgdGhlIHRyYW5zbWl0IG9yIFJlY2VpdmUKK3Byb2Nlc3MgVGhlIEhBTF9VQVJUX0Vycm9yQ2FsbGJhY2soKXVzZXIgY2FsbGJhY2sgd2lsbCBiZSBleGVjdXRlZCB3aGVuIGEKK2NvbW11bmljYXRpb24gZXJyb3IgaXMgZGV0ZWN0ZWQKKworICAgICgjKSBCbG9ja2luZyBtb2RlIEFQSSdzIGFyZSA6CisgICAgICAgICgrKSBIQUxfVUFSVF9UcmFuc21pdCgpCisgICAgICAgICgrKSBIQUxfVUFSVF9SZWNlaXZlKCkKKworICAgICgjKSBOb24tQmxvY2tpbmcgbW9kZSBBUEkncyB3aXRoIEludGVycnVwdCBhcmUgOgorICAgICAgICAoKykgSEFMX1VBUlRfVHJhbnNtaXRfSVQoKQorICAgICAgICAoKykgSEFMX1VBUlRfUmVjZWl2ZV9JVCgpCisgICAgICAgICgrKSBIQUxfVUFSVF9JUlFIYW5kbGVyKCkKKworICAgICgjKSBOb24tQmxvY2tpbmcgbW9kZSBBUEkncyB3aXRoIERNQSBhcmUgOgorICAgICAgICAoKykgSEFMX1VBUlRfVHJhbnNtaXRfRE1BKCkKKyAgICAgICAgKCspIEhBTF9VQVJUX1JlY2VpdmVfRE1BKCkKKyAgICAgICAgKCspIEhBTF9VQVJUX0RNQVBhdXNlKCkKKyAgICAgICAgKCspIEhBTF9VQVJUX0RNQVJlc3VtZSgpCisgICAgICAgICgrKSBIQUxfVUFSVF9ETUFTdG9wKCkKKworICAgICgjKSBBIHNldCBvZiBUcmFuc2ZlciBDb21wbGV0ZSBDYWxsYmFja3MgYXJlIHByb3ZpZGVkIGluIE5vbl9CbG9ja2luZyBtb2RlOgorICAgICAgICAoKykgSEFMX1VBUlRfVHhIYWxmQ3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCspIEhBTF9VQVJUX1R4Q3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCspIEhBTF9VQVJUX1J4SGFsZkNwbHRDYWxsYmFjaygpCisgICAgICAgICgrKSBIQUxfVUFSVF9SeENwbHRDYWxsYmFjaygpCisgICAgICAgICgrKSBIQUxfVUFSVF9FcnJvckNhbGxiYWNrKCkKKworICAgICgjKSBOb24tQmxvY2tpbmcgbW9kZSB0cmFuc2ZlcnMgY291bGQgYmUgYWJvcnRlZCB1c2luZyBBYm9ydCBBUEkncyA6CisgICAgICAgICgrKSBIQUxfVUFSVF9BYm9ydCgpCisgICAgICAgICgrKSBIQUxfVUFSVF9BYm9ydFRyYW5zbWl0KCkKKyAgICAgICAgKCspIEhBTF9VQVJUX0Fib3J0UmVjZWl2ZSgpCisgICAgICAgICgrKSBIQUxfVUFSVF9BYm9ydF9JVCgpCisgICAgICAgICgrKSBIQUxfVUFSVF9BYm9ydFRyYW5zbWl0X0lUKCkKKyAgICAgICAgKCspIEhBTF9VQVJUX0Fib3J0UmVjZWl2ZV9JVCgpCisKKyAgICAoIykgRm9yIEFib3J0IHNlcnZpY2VzIGJhc2VkIG9uIGludGVycnVwdHMgKEhBTF9VQVJUX0Fib3J0eHh4X0lUKSwgYSBzZXQgb2YKK0Fib3J0IENvbXBsZXRlIENhbGxiYWNrcyBhcmUgcHJvdmlkZWQ6CisgICAgICAgICgrKSBIQUxfVUFSVF9BYm9ydENwbHRDYWxsYmFjaygpCisgICAgICAgICgrKSBIQUxfVUFSVF9BYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCspIEhBTF9VQVJUX0Fib3J0UmVjZWl2ZUNwbHRDYWxsYmFjaygpCisKKyAgICAoIykgQSBSeCBFdmVudCBSZWNlcHRpb24gQ2FsbGJhY2sgKFJ4IGV2ZW50IG5vdGlmaWNhdGlvbikgaXMgYXZhaWxhYmxlIGZvcgorTm9uX0Jsb2NraW5nIG1vZGVzIG9mIGVuaGFuY2VkIHJlY2VwdGlvbiBzZXJ2aWNlczoKKyAgICAgICAgKCspIEhBTF9VQVJURXhfUnhFdmVudENhbGxiYWNrKCkKKworICAgICgjKSBJbiBOb24tQmxvY2tpbmcgbW9kZSB0cmFuc2ZlcnMsIHBvc3NpYmxlIGVycm9ycyBhcmUgc3BsaXQgaW50byAyCitjYXRlZ29yaWVzLiBFcnJvcnMgYXJlIGhhbmRsZWQgYXMgZm9sbG93cyA6CisgICAgICAgKCspIEVycm9yIGlzIGNvbnNpZGVyZWQgYXMgUmVjb3ZlcmFibGUgYW5kIG5vbiBibG9ja2luZyA6IFRyYW5zZmVyIGNvdWxkCitnbyB0aWxsIGVuZCwgYnV0IGVycm9yIHNldmVyaXR5IGlzIHRvIGJlIGV2YWx1YXRlZCBieSB1c2VyIDogdGhpcyBjb25jZXJucyBGcmFtZQorRXJyb3IsIFBhcml0eSBFcnJvciBvciBOb2lzZSBFcnJvciBpbiBJbnRlcnJ1cHQgbW9kZSByZWNlcHRpb24gLiBSZWNlaXZlZAorY2hhcmFjdGVyIGlzIHRoZW4gcmV0cmlldmVkIGFuZCBzdG9yZWQgaW4gUnggYnVmZmVyLCBFcnJvciBjb2RlIGlzIHNldCB0byBhbGxvdwordXNlciB0byBpZGVudGlmeSBlcnJvciB0eXBlLCBhbmQgSEFMX1VBUlRfRXJyb3JDYWxsYmFjaygpIHVzZXIgY2FsbGJhY2sgaXMKK2V4ZWN1dGVkLiBUcmFuc2ZlciBpcyBrZXB0IG9uZ29pbmcgb24gVUFSVCBzaWRlLiBJZiB1c2VyIHdhbnRzIHRvIGFib3J0IGl0LAorQWJvcnQgc2VydmljZXMgc2hvdWxkIGJlIGNhbGxlZCBieSB1c2VyLgorICAgICAgICgrKSBFcnJvciBpcyBjb25zaWRlcmVkIGFzIEJsb2NraW5nIDogVHJhbnNmZXIgY291bGQgbm90IGJlIGNvbXBsZXRlZAorcHJvcGVybHkgYW5kIGlzIGFib3J0ZWQuIFRoaXMgY29uY2VybnMgT3ZlcnJ1biBFcnJvciBJbiBJbnRlcnJ1cHQgbW9kZSByZWNlcHRpb24KK2FuZCBhbGwgZXJyb3JzIGluIERNQSBtb2RlLiBFcnJvciBjb2RlIGlzIHNldCB0byBhbGxvdyB1c2VyIHRvIGlkZW50aWZ5IGVycm9yCit0eXBlLCBhbmQgSEFMX1VBUlRfRXJyb3JDYWxsYmFjaygpIHVzZXIgY2FsbGJhY2sgaXMgZXhlY3V0ZWQuCisKKyAgICAtQC0gSW4gdGhlIEhhbGYgZHVwbGV4IGNvbW11bmljYXRpb24sIGl0IGlzIGZvcmJpZGRlbiB0byBydW4gdGhlIHRyYW5zbWl0CisgICAgICAgIGFuZCByZWNlaXZlIHByb2Nlc3MgaW4gcGFyYWxsZWwsIHRoZSBVQVJUIHN0YXRlCitIQUxfVUFSVF9TVEFURV9CVVNZX1RYX1JYIGNhbid0IGJlIHVzZWZ1bC4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgKiBAYnJpZWYgU2VuZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlLgorICogQG5vdGUgICBXaGVuIFVBUlQgcGFyaXR5IGlzIG5vdCBlbmFibGVkIChQQ0UgPSAwKSwgYW5kIFdvcmQgTGVuZ3RoIGlzCisgKiBjb25maWd1cmVkIHRvIDkgYml0cyAoTTEtTTAgPSAwMSksIHRoZSBzZW50IGRhdGEgaXMgaGFuZGxlZCBhcyBhIHNldCBvZiB1MTYuCisgKiBJbiB0aGlzIGNhc2UsIFNpemUgbXVzdCBpbmRpY2F0ZSB0aGUgbnVtYmVyIG9mIHUxNiBwcm92aWRlZCB0aHJvdWdoIHBEYXRhLgorICogQG5vdGUgV2hlbiBGSUZPIG1vZGUgaXMgZW5hYmxlZCwgd3JpdGluZyBhIGRhdGEgaW4gdGhlIFREUiByZWdpc3RlciBhZGRzIG9uZQorICogICAgICAgZGF0YSB0byB0aGUgVFhGSUZPLiBXcml0ZSBvcGVyYXRpb25zIHRvIHRoZSBURFIgcmVnaXN0ZXIgYXJlIHBlcmZvcm1lZAorICogICAgICAgd2hlbiBUWEZORiBmbGFnIGlzIHNldC4gRnJvbSBoYXJkd2FyZSBwZXJzcGVjdGl2ZSwgVFhGTkYgZmxhZyBhbmQKKyAqICAgICAgIFRYRSBhcmUgbWFwcGVkIG9uIHRoZSBzYW1lIGJpdC1maWVsZC4KKyAqIEBwYXJhbSBodWFydCAgIFVBUlQgaGFuZGxlLgorICogQHBhcmFtIHBEYXRhICAgUG9pbnRlciB0byBkYXRhIGJ1ZmZlciAodTggb3IgdTE2IGRhdGEgZWxlbWVudHMpLgorICogQHBhcmFtIFNpemUgICAgQW1vdW50IG9mIGRhdGEgZWxlbWVudHMgKHU4IG9yIHUxNikgdG8gYmUgc2VudC4KKyAqIEBwYXJhbSBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24uCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfVHJhbnNtaXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZW91dCkgeworICBjb25zdCB1aW50OF90ICpwZGF0YThiaXRzOworICBjb25zdCB1aW50MTZfdCAqcGRhdGExNmJpdHM7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKworICAvKiBDaGVjayB0aGF0IGEgVHggcHJvY2VzcyBpcyBub3QgYWxyZWFkeSBvbmdvaW5nICovCisgIGlmIChodWFydC0+Z1N0YXRlID09IEhBTF9VQVJUX1NUQVRFX1JFQURZKSB7CisgICAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgaHVhcnQtPkVycm9yQ29kZSA9IEhBTF9VQVJUX0VSUk9SX05PTkU7CisgICAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX0JVU1lfVFg7CisKKyAgICAvKiBJbml0IHRpY2tzdGFydCBmb3IgdGltZW91dCBtYW5hZ2VtZW50ICovCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgIGh1YXJ0LT5UeFhmZXJTaXplID0gU2l6ZTsKKyAgICBodWFydC0+VHhYZmVyQ291bnQgPSBTaXplOworCisgICAgLyogSW4gY2FzZSBvZiA5Yml0cy9ObyBQYXJpdHkgdHJhbnNmZXIsIHBEYXRhIG5lZWRzIHRvIGJlIGhhbmRsZWQgYXMgYQorICAgICAqIHVpbnQxNl90IHBvaW50ZXIgKi8KKyAgICBpZiAoKGh1YXJ0LT5Jbml0LldvcmRMZW5ndGggPT0gVUFSVF9XT1JETEVOR1RIXzlCKSAmJgorICAgICAgICAoaHVhcnQtPkluaXQuUGFyaXR5ID09IFVBUlRfUEFSSVRZX05PTkUpKSB7CisgICAgICBwZGF0YThiaXRzID0gTlVMTDsKKyAgICAgIHBkYXRhMTZiaXRzID0gKGNvbnN0IHVpbnQxNl90ICopcERhdGE7CisgICAgfSBlbHNlIHsKKyAgICAgIHBkYXRhOGJpdHMgPSBwRGF0YTsKKyAgICAgIHBkYXRhMTZiaXRzID0gTlVMTDsKKyAgICB9CisKKyAgICB3aGlsZSAoaHVhcnQtPlR4WGZlckNvdW50ID4gMFUpIHsKKyAgICAgIGlmIChVQVJUX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoaHVhcnQsIFVBUlRfRkxBR19UWEUsIFJFU0VULCB0aWNrc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVvdXQpICE9IEhBTF9PSykgeworICAgICAgICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgICAgaWYgKHBkYXRhOGJpdHMgPT0gTlVMTCkgeworICAgICAgICBodWFydC0+SW5zdGFuY2UtPlREUiA9ICh1aW50MTZfdCkoKnBkYXRhMTZiaXRzICYgMHgwMUZGVSk7CisgICAgICAgIHBkYXRhMTZiaXRzKys7CisgICAgICB9IGVsc2UgeworICAgICAgICBodWFydC0+SW5zdGFuY2UtPlREUiA9ICh1aW50OF90KSgqcGRhdGE4Yml0cyAmIDB4RkZVKTsKKyAgICAgICAgcGRhdGE4Yml0cysrOworICAgICAgfQorICAgICAgaHVhcnQtPlR4WGZlckNvdW50LS07CisgICAgfQorCisgICAgaWYgKFVBUlRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChodWFydCwgVUFSVF9GTEFHX1RDLCBSRVNFVCwgdGlja3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZW91dCkgIT0gSEFMX09LKSB7CisgICAgICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisKKyAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICB9CisKKyAgICAvKiBBdCBlbmQgb2YgVHggcHJvY2VzcywgcmVzdG9yZSBodWFydC0+Z1N0YXRlIHRvIFJlYWR5ICovCisgICAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgKiBAYnJpZWYgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlLgorICogQG5vdGUgICBXaGVuIFVBUlQgcGFyaXR5IGlzIG5vdCBlbmFibGVkIChQQ0UgPSAwKSwgYW5kIFdvcmQgTGVuZ3RoIGlzCisgKiBjb25maWd1cmVkIHRvIDkgYml0cyAoTTEtTTAgPSAwMSksIHRoZSByZWNlaXZlZCBkYXRhIGlzIGhhbmRsZWQgYXMgYSBzZXQgb2YKKyAqIHUxNi4gSW4gdGhpcyBjYXNlLCBTaXplIG11c3QgaW5kaWNhdGUgdGhlIG51bWJlciBvZiB1MTYgYXZhaWxhYmxlIHRocm91Z2gKKyAqIHBEYXRhLgorICogQG5vdGUgV2hlbiBGSUZPIG1vZGUgaXMgZW5hYmxlZCwgdGhlIFJYRk5FIGZsYWcgaXMgc2V0IGFzIGxvbmcgYXMgdGhlIFJYRklGTworICogICAgICAgaXMgbm90IGVtcHR5LiBSZWFkIG9wZXJhdGlvbnMgZnJvbSB0aGUgUkRSIHJlZ2lzdGVyIGFyZSBwZXJmb3JtZWQgd2hlbgorICogICAgICAgUlhGTkUgZmxhZyBpcyBzZXQuIEZyb20gaGFyZHdhcmUgcGVyc3BlY3RpdmUsIFJYRk5FIGZsYWcgYW5kCisgKiAgICAgICBSWE5FIGFyZSBtYXBwZWQgb24gdGhlIHNhbWUgYml0LWZpZWxkLgorICogQHBhcmFtIGh1YXJ0ICAgVUFSVCBoYW5kbGUuCisgKiBAcGFyYW0gcERhdGEgICBQb2ludGVyIHRvIGRhdGEgYnVmZmVyICh1OCBvciB1MTYgZGF0YSBlbGVtZW50cykuCisgKiBAcGFyYW0gU2l6ZSAgICBBbW91bnQgb2YgZGF0YSBlbGVtZW50cyAodTggb3IgdTE2KSB0byBiZSByZWNlaXZlZC4KKyAqIEBwYXJhbSBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24uCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfUmVjZWl2ZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCB1aW50OF90ICpwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCkgeworICB1aW50OF90ICpwZGF0YThiaXRzOworICB1aW50MTZfdCAqcGRhdGExNmJpdHM7CisgIHVpbnQxNl90IHVoTWFzazsKKyAgdWludDMyX3QgdGlja3N0YXJ0OworCisgIC8qIENoZWNrIHRoYXQgYSBSeCBwcm9jZXNzIGlzIG5vdCBhbHJlYWR5IG9uZ29pbmcgKi8KKyAgaWYgKGh1YXJ0LT5SeFN0YXRlID09IEhBTF9VQVJUX1NUQVRFX1JFQURZKSB7CisgICAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgaHVhcnQtPkVycm9yQ29kZSA9IEhBTF9VQVJUX0VSUk9SX05PTkU7CisgICAgaHVhcnQtPlJ4U3RhdGUgPSBIQUxfVUFSVF9TVEFURV9CVVNZX1JYOworICAgIGh1YXJ0LT5SZWNlcHRpb25UeXBlID0gSEFMX1VBUlRfUkVDRVBUSU9OX1NUQU5EQVJEOworCisgICAgLyogSW5pdCB0aWNrc3RhcnQgZm9yIHRpbWVvdXQgbWFuYWdlbWVudCAqLworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICBodWFydC0+UnhYZmVyU2l6ZSA9IFNpemU7CisgICAgaHVhcnQtPlJ4WGZlckNvdW50ID0gU2l6ZTsKKworICAgIC8qIENvbXB1dGF0aW9uIG9mIFVBUlQgbWFzayB0byBhcHBseSB0byBSRFIgcmVnaXN0ZXIgKi8KKyAgICBVQVJUX01BU0tfQ09NUFVUQVRJT04oaHVhcnQpOworICAgIHVoTWFzayA9IGh1YXJ0LT5NYXNrOworCisgICAgLyogSW4gY2FzZSBvZiA5Yml0cy9ObyBQYXJpdHkgdHJhbnNmZXIsIHBSeERhdGEgbmVlZHMgdG8gYmUgaGFuZGxlZCBhcyBhCisgICAgICogdWludDE2X3QgcG9pbnRlciAqLworICAgIGlmICgoaHVhcnQtPkluaXQuV29yZExlbmd0aCA9PSBVQVJUX1dPUkRMRU5HVEhfOUIpICYmCisgICAgICAgIChodWFydC0+SW5pdC5QYXJpdHkgPT0gVUFSVF9QQVJJVFlfTk9ORSkpIHsKKyAgICAgIHBkYXRhOGJpdHMgPSBOVUxMOworICAgICAgcGRhdGExNmJpdHMgPSAodWludDE2X3QgKilwRGF0YTsKKyAgICB9IGVsc2UgeworICAgICAgcGRhdGE4Yml0cyA9IHBEYXRhOworICAgICAgcGRhdGExNmJpdHMgPSBOVUxMOworICAgIH0KKworICAgIC8qIGFzIGxvbmcgYXMgZGF0YSBoYXZlIHRvIGJlIHJlY2VpdmVkICovCisgICAgd2hpbGUgKGh1YXJ0LT5SeFhmZXJDb3VudCA+IDBVKSB7CisgICAgICBpZiAoVUFSVF9XYWl0T25GbGFnVW50aWxUaW1lb3V0KGh1YXJ0LCBVQVJUX0ZMQUdfUlhORSwgUkVTRVQsIHRpY2tzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZW91dCkgIT0gSEFMX09LKSB7CisgICAgICAgIGh1YXJ0LT5SeFN0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgICAgaWYgKHBkYXRhOGJpdHMgPT0gTlVMTCkgeworICAgICAgICAqcGRhdGExNmJpdHMgPSAodWludDE2X3QpKGh1YXJ0LT5JbnN0YW5jZS0+UkRSICYgdWhNYXNrKTsKKyAgICAgICAgcGRhdGExNmJpdHMrKzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICpwZGF0YThiaXRzID0gKHVpbnQ4X3QpKGh1YXJ0LT5JbnN0YW5jZS0+UkRSICYgKHVpbnQ4X3QpdWhNYXNrKTsKKyAgICAgICAgcGRhdGE4Yml0cysrOworICAgICAgfQorICAgICAgaHVhcnQtPlJ4WGZlckNvdW50LS07CisgICAgfQorCisgICAgLyogQXQgZW5kIG9mIFJ4IHByb2Nlc3MsIHJlc3RvcmUgaHVhcnQtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgICBodWFydC0+UnhTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgKiBAYnJpZWYgU2VuZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAqIEBub3RlICAgV2hlbiBVQVJUIHBhcml0eSBpcyBub3QgZW5hYmxlZCAoUENFID0gMCksIGFuZCBXb3JkIExlbmd0aCBpcworICogY29uZmlndXJlZCB0byA5IGJpdHMgKE0xLU0wID0gMDEpLCB0aGUgc2VudCBkYXRhIGlzIGhhbmRsZWQgYXMgYSBzZXQgb2YgdTE2LgorICogSW4gdGhpcyBjYXNlLCBTaXplIG11c3QgaW5kaWNhdGUgdGhlIG51bWJlciBvZiB1MTYgcHJvdmlkZWQgdGhyb3VnaCBwRGF0YS4KKyAqIEBwYXJhbSBodWFydCBVQVJUIGhhbmRsZS4KKyAqIEBwYXJhbSBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyICh1OCBvciB1MTYgZGF0YSBlbGVtZW50cykuCisgKiBAcGFyYW0gU2l6ZSAgQW1vdW50IG9mIGRhdGEgZWxlbWVudHMgKHU4IG9yIHUxNikgdG8gYmUgc2VudC4KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9UcmFuc21pdF9JVChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpIHsKKyAgLyogQ2hlY2sgdGhhdCBhIFR4IHByb2Nlc3MgaXMgbm90IGFscmVhZHkgb25nb2luZyAqLworICBpZiAoaHVhcnQtPmdTdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9SRUFEWSkgeworICAgIGlmICgocERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKSB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIGh1YXJ0LT5wVHhCdWZmUHRyID0gcERhdGE7CisgICAgaHVhcnQtPlR4WGZlclNpemUgPSBTaXplOworICAgIGh1YXJ0LT5UeFhmZXJDb3VudCA9IFNpemU7CisgICAgaHVhcnQtPlR4SVNSID0gTlVMTDsKKworICAgIGh1YXJ0LT5FcnJvckNvZGUgPSBIQUxfVUFSVF9FUlJPUl9OT05FOworICAgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9CVVNZX1RYOworCisgICAgLyogQ29uZmlndXJlIFR4IGludGVycnVwdCBwcm9jZXNzaW5nICovCisgICAgaWYgKGh1YXJ0LT5GaWZvTW9kZSA9PSBVQVJUX0ZJRk9NT0RFX0VOQUJMRSkgeworICAgICAgLyogU2V0IHRoZSBUeCBJU1IgZnVuY3Rpb24gcG9pbnRlciBhY2NvcmRpbmcgdG8gdGhlIGRhdGEgd29yZCBsZW5ndGggKi8KKyAgICAgIGlmICgoaHVhcnQtPkluaXQuV29yZExlbmd0aCA9PSBVQVJUX1dPUkRMRU5HVEhfOUIpICYmCisgICAgICAgICAgKGh1YXJ0LT5Jbml0LlBhcml0eSA9PSBVQVJUX1BBUklUWV9OT05FKSkgeworICAgICAgICBodWFydC0+VHhJU1IgPSBVQVJUX1R4SVNSXzE2QklUX0ZJRk9FTjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGh1YXJ0LT5UeElTUiA9IFVBUlRfVHhJU1JfOEJJVF9GSUZPRU47CisgICAgICB9CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgVFggRklGTyB0aHJlc2hvbGQgaW50ZXJydXB0ICovCisgICAgICBBVE9NSUNfU0VUX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX1RYRlRJRSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIFNldCB0aGUgVHggSVNSIGZ1bmN0aW9uIHBvaW50ZXIgYWNjb3JkaW5nIHRvIHRoZSBkYXRhIHdvcmQgbGVuZ3RoICovCisgICAgICBpZiAoKGh1YXJ0LT5Jbml0LldvcmRMZW5ndGggPT0gVUFSVF9XT1JETEVOR1RIXzlCKSAmJgorICAgICAgICAgIChodWFydC0+SW5pdC5QYXJpdHkgPT0gVUFSVF9QQVJJVFlfTk9ORSkpIHsKKyAgICAgICAgaHVhcnQtPlR4SVNSID0gVUFSVF9UeElTUl8xNkJJVDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGh1YXJ0LT5UeElTUiA9IFVBUlRfVHhJU1JfOEJJVDsKKyAgICAgIH0KKworICAgICAgLyogRW5hYmxlIHRoZSBUcmFuc21pdCBEYXRhIFJlZ2lzdGVyIEVtcHR5IGludGVycnVwdCAqLworICAgICAgQVRPTUlDX1NFVF9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9UWEVJRV9UWEZORklFKTsKKyAgICB9CisKKyAgICByZXR1cm4gSEFMX09LOworICB9IGVsc2UgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAqIEBicmllZiBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIGludGVycnVwdCBtb2RlLgorICogQG5vdGUgICBXaGVuIFVBUlQgcGFyaXR5IGlzIG5vdCBlbmFibGVkIChQQ0UgPSAwKSwgYW5kIFdvcmQgTGVuZ3RoIGlzCisgKiBjb25maWd1cmVkIHRvIDkgYml0cyAoTTEtTTAgPSAwMSksIHRoZSByZWNlaXZlZCBkYXRhIGlzIGhhbmRsZWQgYXMgYSBzZXQgb2YKKyAqIHUxNi4gSW4gdGhpcyBjYXNlLCBTaXplIG11c3QgaW5kaWNhdGUgdGhlIG51bWJlciBvZiB1MTYgYXZhaWxhYmxlIHRocm91Z2gKKyAqIHBEYXRhLgorICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICogQHBhcmFtIHBEYXRhIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIgKHU4IG9yIHUxNiBkYXRhIGVsZW1lbnRzKS4KKyAqIEBwYXJhbSBTaXplICBBbW91bnQgb2YgZGF0YSBlbGVtZW50cyAodTggb3IgdTE2KSB0byBiZSByZWNlaXZlZC4KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9SZWNlaXZlX0lUKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIHVpbnQ4X3QgKnBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBTaXplKSB7CisgIC8qIENoZWNrIHRoYXQgYSBSeCBwcm9jZXNzIGlzIG5vdCBhbHJlYWR5IG9uZ29pbmcgKi8KKyAgaWYgKGh1YXJ0LT5SeFN0YXRlID09IEhBTF9VQVJUX1NUQVRFX1JFQURZKSB7CisgICAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogU2V0IFJlY2VwdGlvbiB0eXBlIHRvIFN0YW5kYXJkIHJlY2VwdGlvbiAqLworICAgIGh1YXJ0LT5SZWNlcHRpb25UeXBlID0gSEFMX1VBUlRfUkVDRVBUSU9OX1NUQU5EQVJEOworCisgICAgaWYgKCEoSVNfTFBVQVJUX0lOU1RBTkNFKGh1YXJ0LT5JbnN0YW5jZSkpKSB7CisgICAgICAvKiBDaGVjayB0aGF0IFVTQVJUIFJUT0VOIGJpdCBpcyBzZXQgKi8KKyAgICAgIGlmIChSRUFEX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX1JUT0VOKSAhPSAwVSkgeworICAgICAgICAvKiBFbmFibGUgdGhlIFVBUlQgUmVjZWl2ZXIgVGltZW91dCBJbnRlcnJ1cHQgKi8KKyAgICAgICAgQVRPTUlDX1NFVF9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9SVE9JRSk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIChVQVJUX1N0YXJ0X1JlY2VpdmVfSVQoaHVhcnQsIHBEYXRhLCBTaXplKSk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICogQGJyaWVmIFNlbmQgYW4gYW1vdW50IG9mIGRhdGEgaW4gRE1BIG1vZGUuCisgKiBAbm90ZSAgIFdoZW4gVUFSVCBwYXJpdHkgaXMgbm90IGVuYWJsZWQgKFBDRSA9IDApLCBhbmQgV29yZCBMZW5ndGggaXMKKyAqIGNvbmZpZ3VyZWQgdG8gOSBiaXRzIChNMS1NMCA9IDAxKSwgdGhlIHNlbnQgZGF0YSBpcyBoYW5kbGVkIGFzIGEgc2V0IG9mIHUxNi4KKyAqIEluIHRoaXMgY2FzZSwgU2l6ZSBtdXN0IGluZGljYXRlIHRoZSBudW1iZXIgb2YgdTE2IHByb3ZpZGVkIHRocm91Z2ggcERhdGEuCisgKiBAcGFyYW0gaHVhcnQgVUFSVCBoYW5kbGUuCisgKiBAcGFyYW0gcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlciAodTggb3IgdTE2IGRhdGEgZWxlbWVudHMpLgorICogQHBhcmFtIFNpemUgIEFtb3VudCBvZiBkYXRhIGVsZW1lbnRzICh1OCBvciB1MTYpIHRvIGJlIHNlbnQuCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfVHJhbnNtaXRfRE1BKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpIHsKKyAgLyogQ2hlY2sgdGhhdCBhIFR4IHByb2Nlc3MgaXMgbm90IGFscmVhZHkgb25nb2luZyAqLworICBpZiAoaHVhcnQtPmdTdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9SRUFEWSkgeworICAgIGlmICgocERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKSB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIGh1YXJ0LT5wVHhCdWZmUHRyID0gcERhdGE7CisgICAgaHVhcnQtPlR4WGZlclNpemUgPSBTaXplOworICAgIGh1YXJ0LT5UeFhmZXJDb3VudCA9IFNpemU7CisKKyAgICBodWFydC0+RXJyb3JDb2RlID0gSEFMX1VBUlRfRVJST1JfTk9ORTsKKyAgICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWV9UWDsKKworICAgIGlmIChodWFydC0+aGRtYXR4ICE9IE5VTEwpIHsKKyAgICAgIC8qIFNldCB0aGUgVUFSVCBETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICAgIGh1YXJ0LT5oZG1hdHgtPlhmZXJDcGx0Q2FsbGJhY2sgPSBVQVJUX0RNQVRyYW5zbWl0Q3BsdDsKKworICAgICAgLyogU2V0IHRoZSBVQVJUIERNQSBIYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgICBodWFydC0+aGRtYXR4LT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFVBUlRfRE1BVHhIYWxmQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh1YXJ0LT5oZG1hdHgtPlhmZXJFcnJvckNhbGxiYWNrID0gVUFSVF9ETUFFcnJvcjsKKworICAgICAgLyogU2V0IHRoZSBETUEgYWJvcnQgY2FsbGJhY2sgKi8KKyAgICAgIGh1YXJ0LT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICAgICAgLyogRW5hYmxlIHRoZSBVQVJUIHRyYW5zbWl0IERNQSBjaGFubmVsICovCisgICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodWFydC0+aGRtYXR4LCAodWludDMyX3QpaHVhcnQtPnBUeEJ1ZmZQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpJmh1YXJ0LT5JbnN0YW5jZS0+VERSLCBTaXplKSAhPSBIQUxfT0spIHsKKyAgICAgICAgLyogU2V0IGVycm9yIGNvZGUgdG8gRE1BICovCisgICAgICAgIGh1YXJ0LT5FcnJvckNvZGUgPSBIQUxfVUFSVF9FUlJPUl9ETUE7CisKKyAgICAgICAgLyogUmVzdG9yZSBodWFydC0+Z1N0YXRlIHRvIHJlYWR5ICovCisgICAgICAgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKyAgICAvKiBDbGVhciB0aGUgVEMgZmxhZyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCisgICAgX19IQUxfVUFSVF9DTEVBUl9GTEFHKGh1YXJ0LCBVQVJUX0NMRUFSX1RDRik7CisKKyAgICAvKiBFbmFibGUgdGhlIERNQSB0cmFuc2ZlciBmb3IgdHJhbnNtaXQgcmVxdWVzdCBieSBzZXR0aW5nIHRoZSBETUFUIGJpdAorICAgIGluIHRoZSBVQVJUIENSMyByZWdpc3RlciAqLworICAgIEFUT01JQ19TRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9IGVsc2UgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAqIEBicmllZiBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIERNQSBtb2RlLgorICogQG5vdGUgICBXaGVuIHRoZSBVQVJUIHBhcml0eSBpcyBlbmFibGVkIChQQ0UgPSAxKSwgdGhlIHJlY2VpdmVkIGRhdGEgY29udGFpbgorICogICAgICAgICB0aGUgcGFyaXR5IGJpdCAoTVNCIHBvc2l0aW9uKS4KKyAqIEBub3RlICAgV2hlbiBVQVJUIHBhcml0eSBpcyBub3QgZW5hYmxlZCAoUENFID0gMCksIGFuZCBXb3JkIExlbmd0aCBpcworICogY29uZmlndXJlZCB0byA5IGJpdHMgKE0xLU0wID0gMDEpLCB0aGUgcmVjZWl2ZWQgZGF0YSBpcyBoYW5kbGVkIGFzIGEgc2V0IG9mCisgKiB1MTYuIEluIHRoaXMgY2FzZSwgU2l6ZSBtdXN0IGluZGljYXRlIHRoZSBudW1iZXIgb2YgdTE2IGF2YWlsYWJsZSB0aHJvdWdoCisgKiBwRGF0YS4KKyAqIEBwYXJhbSBodWFydCBVQVJUIGhhbmRsZS4KKyAqIEBwYXJhbSBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyICh1OCBvciB1MTYgZGF0YSBlbGVtZW50cykuCisgKiBAcGFyYW0gU2l6ZSAgQW1vdW50IG9mIGRhdGEgZWxlbWVudHMgKHU4IG9yIHUxNikgdG8gYmUgcmVjZWl2ZWQuCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfUmVjZWl2ZV9ETUEoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKSB7CisgIC8qIENoZWNrIHRoYXQgYSBSeCBwcm9jZXNzIGlzIG5vdCBhbHJlYWR5IG9uZ29pbmcgKi8KKyAgaWYgKGh1YXJ0LT5SeFN0YXRlID09IEhBTF9VQVJUX1NUQVRFX1JFQURZKSB7CisgICAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogU2V0IFJlY2VwdGlvbiB0eXBlIHRvIFN0YW5kYXJkIHJlY2VwdGlvbiAqLworICAgIGh1YXJ0LT5SZWNlcHRpb25UeXBlID0gSEFMX1VBUlRfUkVDRVBUSU9OX1NUQU5EQVJEOworCisgICAgaWYgKCEoSVNfTFBVQVJUX0lOU1RBTkNFKGh1YXJ0LT5JbnN0YW5jZSkpKSB7CisgICAgICAvKiBDaGVjayB0aGF0IFVTQVJUIFJUT0VOIGJpdCBpcyBzZXQgKi8KKyAgICAgIGlmIChSRUFEX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX1JUT0VOKSAhPSAwVSkgeworICAgICAgICAvKiBFbmFibGUgdGhlIFVBUlQgUmVjZWl2ZXIgVGltZW91dCBJbnRlcnJ1cHQgKi8KKyAgICAgICAgQVRPTUlDX1NFVF9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9SVE9JRSk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIChVQVJUX1N0YXJ0X1JlY2VpdmVfRE1BKGh1YXJ0LCBwRGF0YSwgU2l6ZSkpOworICB9IGVsc2UgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAqIEBicmllZiBQYXVzZSB0aGUgRE1BIFRyYW5zZmVyLgorICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0RNQVBhdXNlKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpIHsKKyAgY29uc3QgSEFMX1VBUlRfU3RhdGVUeXBlRGVmIGdzdGF0ZSA9IGh1YXJ0LT5nU3RhdGU7CisgIGNvbnN0IEhBTF9VQVJUX1N0YXRlVHlwZURlZiByeHN0YXRlID0gaHVhcnQtPlJ4U3RhdGU7CisKKyAgaWYgKChIQUxfSVNfQklUX1NFVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpKSAmJgorICAgICAgKGdzdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9CVVNZX1RYKSkgeworICAgIC8qIERpc2FibGUgdGhlIFVBUlQgRE1BIFR4IHJlcXVlc3QgKi8KKyAgICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCk7CisgIH0KKyAgaWYgKChIQUxfSVNfQklUX1NFVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpKSAmJgorICAgICAgKHJ4c3RhdGUgPT0gSEFMX1VBUlRfU1RBVEVfQlVTWV9SWCkpIHsKKyAgICAvKiBEaXNhYmxlIFBFIGFuZCBFUlIgKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgaW50ZXJydXB0cworICAgICAqLworICAgIEFUT01JQ19DTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9QRUlFKTsKKyAgICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKworICAgIC8qIERpc2FibGUgdGhlIFVBUlQgRE1BIFJ4IHJlcXVlc3QgKi8KKyAgICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7CisgIH0KKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiBSZXN1bWUgdGhlIERNQSBUcmFuc2Zlci4KKyAqIEBwYXJhbSBodWFydCBVQVJUIGhhbmRsZS4KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9ETUFSZXN1bWUoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkgeworICBpZiAoaHVhcnQtPmdTdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9CVVNZX1RYKSB7CisgICAgLyogRW5hYmxlIHRoZSBVQVJUIERNQSBUeCByZXF1ZXN0ICovCisgICAgQVRPTUlDX1NFVF9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKyAgfQorICBpZiAoaHVhcnQtPlJ4U3RhdGUgPT0gSEFMX1VBUlRfU1RBVEVfQlVTWV9SWCkgeworICAgIC8qIENsZWFyIHRoZSBPdmVycnVuIGZsYWcgYmVmb3JlIHJlc3VtaW5nIHRoZSBSeCB0cmFuc2ZlciAqLworICAgIF9fSEFMX1VBUlRfQ0xFQVJfRkxBRyhodWFydCwgVUFSVF9DTEVBUl9PUkVGKTsKKworICAgIC8qIFJlLWVuYWJsZSBQRSBhbmQgRVJSIChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpIGludGVycnVwdHMKKyAgICAgKi8KKyAgICBpZiAoaHVhcnQtPkluaXQuUGFyaXR5ICE9IFVBUlRfUEFSSVRZX05PTkUpIHsKKyAgICAgIEFUT01JQ19TRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUEVJRSk7CisgICAgfQorICAgIEFUT01JQ19TRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKworICAgIC8qIEVuYWJsZSB0aGUgVUFSVCBETUEgUnggcmVxdWVzdCAqLworICAgIEFUT01JQ19TRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7CisgIH0KKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiBTdG9wIHRoZSBETUEgVHJhbnNmZXIuCisgKiBAcGFyYW0gaHVhcnQgVUFSVCBoYW5kbGUuCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfRE1BU3RvcChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KSB7CisgIC8qIFRoZSBMb2NrIGlzIG5vdCBpbXBsZW1lbnRlZCBvbiB0aGlzIEFQSSB0byBhbGxvdyB0aGUgdXNlciBhcHBsaWNhdGlvbgorICAgICB0byBjYWxsIHRoZSBIQUwgVUFSVCBBUEkgdW5kZXIgY2FsbGJhY2tzIEhBTF9VQVJUX1R4Q3BsdENhbGxiYWNrKCkgLworICAgICBIQUxfVUFSVF9SeENwbHRDYWxsYmFjaygpIC8gSEFMX1VBUlRfVHhIYWxmQ3BsdENhbGxiYWNrIC8KKyAgICAgSEFMX1VBUlRfUnhIYWxmQ3BsdENhbGxiYWNrOiBpbmRlZWQsIHdoZW4gSEFMX0RNQV9BYm9ydCgpIEFQSSBpcyBjYWxsZWQsCisgICAgIHRoZSBETUEgVFgvUlggVHJhbnNmZXIgb3IgSGFsZiBUcmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQgaXMgZ2VuZXJhdGVkIGlmCisgICAgIHRoZSBETUEgdHJhbnNmZXIgaW50ZXJydXB0aW9uIG9jY3VycyBhdCB0aGUgbWlkZGxlIG9yIGF0IHRoZSBlbmQgb2YgdGhlCisgICAgIHN0cmVhbSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgY2FsbCBiYWNrIGlzIGV4ZWN1dGVkLiAqLworCisgIGNvbnN0IEhBTF9VQVJUX1N0YXRlVHlwZURlZiBnc3RhdGUgPSBodWFydC0+Z1N0YXRlOworICBjb25zdCBIQUxfVUFSVF9TdGF0ZVR5cGVEZWYgcnhzdGF0ZSA9IGh1YXJ0LT5SeFN0YXRlOworCisgIC8qIFN0b3AgVUFSVCBETUEgVHggcmVxdWVzdCBpZiBvbmdvaW5nICovCisgIGlmICgoSEFMX0lTX0JJVF9TRVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKSkgJiYKKyAgICAgIChnc3RhdGUgPT0gSEFMX1VBUlRfU1RBVEVfQlVTWV9UWCkpIHsKKyAgICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCk7CisKKyAgICAvKiBBYm9ydCB0aGUgVUFSVCBETUEgVHggY2hhbm5lbCAqLworICAgIGlmIChodWFydC0+aGRtYXR4ICE9IE5VTEwpIHsKKyAgICAgIGlmIChIQUxfRE1BX0Fib3J0KGh1YXJ0LT5oZG1hdHgpICE9IEhBTF9PSykgeworICAgICAgICBpZiAoSEFMX0RNQV9HZXRFcnJvcihodWFydC0+aGRtYXR4KSA9PSBIQUxfRE1BX0VSUk9SX1RJTUVPVVQpIHsKKyAgICAgICAgICAvKiBTZXQgZXJyb3IgY29kZSB0byBETUEgKi8KKyAgICAgICAgICBodWFydC0+RXJyb3JDb2RlID0gSEFMX1VBUlRfRVJST1JfRE1BOworCisgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgVUFSVF9FbmRUeFRyYW5zZmVyKGh1YXJ0KTsKKyAgfQorCisgIC8qIFN0b3AgVUFSVCBETUEgUnggcmVxdWVzdCBpZiBvbmdvaW5nICovCisgIGlmICgoSEFMX0lTX0JJVF9TRVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKSkgJiYKKyAgICAgIChyeHN0YXRlID09IEhBTF9VQVJUX1NUQVRFX0JVU1lfUlgpKSB7CisgICAgQVRPTUlDX0NMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOworCisgICAgLyogQWJvcnQgdGhlIFVBUlQgRE1BIFJ4IGNoYW5uZWwgKi8KKyAgICBpZiAoaHVhcnQtPmhkbWFyeCAhPSBOVUxMKSB7CisgICAgICBpZiAoSEFMX0RNQV9BYm9ydChodWFydC0+aGRtYXJ4KSAhPSBIQUxfT0spIHsKKyAgICAgICAgaWYgKEhBTF9ETUFfR2V0RXJyb3IoaHVhcnQtPmhkbWFyeCkgPT0gSEFMX0RNQV9FUlJPUl9USU1FT1VUKSB7CisgICAgICAgICAgLyogU2V0IGVycm9yIGNvZGUgdG8gRE1BICovCisgICAgICAgICAgaHVhcnQtPkVycm9yQ29kZSA9IEhBTF9VQVJUX0VSUk9SX0RNQTsKKworICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIFVBUlRfRW5kUnhUcmFuc2ZlcihodWFydCk7CisgIH0KKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiAgQWJvcnQgb25nb2luZyB0cmFuc2ZlcnMgKGJsb2NraW5nIG1vZGUpLgorICogQHBhcmFtICBodWFydCBVQVJUIGhhbmRsZS4KKyAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgY291bGQgYmUgdXNlZCBmb3IgYWJvcnRpbmcgYW55IG9uZ29pbmcgdHJhbnNmZXIKKyAqIHN0YXJ0ZWQgaW4gSW50ZXJydXB0IG9yIERNQSBtb2RlLiBUaGlzIHByb2NlZHVyZSBwZXJmb3JtcyBmb2xsb3dpbmcKKyAqIG9wZXJhdGlvbnMgOgorICogICAgICAgICAgIC0gRGlzYWJsZSBVQVJUIEludGVycnVwdHMgKFR4IGFuZCBSeCkKKyAqICAgICAgICAgICAtIERpc2FibGUgdGhlIERNQSB0cmFuc2ZlciBpbiB0aGUgcGVyaXBoZXJhbCByZWdpc3RlciAoaWYgZW5hYmxlZCkKKyAqICAgICAgICAgICAtIEFib3J0IERNQSB0cmFuc2ZlciBieSBjYWxsaW5nIEhBTF9ETUFfQWJvcnQgKGluIGNhc2Ugb2YgdHJhbnNmZXIKKyAqIGluIERNQSBtb2RlKQorICogICAgICAgICAgIC0gU2V0IGhhbmRsZSBTdGF0ZSB0byBSRUFEWQorICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBpcyBleGVjdXRlZCBpbiBibG9ja2luZyBtb2RlIDogd2hlbiBleGl0aW5nIGZ1bmN0aW9uLAorICogQWJvcnQgaXMgY29uc2lkZXJlZCBhcyBjb21wbGV0ZWQuCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfQWJvcnQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkgeworICAvKiBEaXNhYmxlIFRYRSwgVEMsIFJYTkUsIFBFLCBSWEZULCBUWEZUIGFuZCBFUlIgKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwKKyAgICogb3ZlcnJ1biBlcnJvcikgaW50ZXJydXB0cyAqLworICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLAorICAgICAgICAgICAgICAgICAgIChVU0FSVF9DUjFfUlhORUlFX1JYRk5FSUUgfCBVU0FSVF9DUjFfUEVJRSB8CisgICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMV9UWEVJRV9UWEZORklFIHwgVVNBUlRfQ1IxX1RDSUUpKTsKKyAgQVRPTUlDX0NMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywKKyAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjNfRUlFIHwgVVNBUlRfQ1IzX1JYRlRJRSB8IFVTQVJUX0NSM19UWEZUSUUpOworCisgIC8qIElmIFJlY2VwdGlvbiB0aWxsIElETEUgZXZlbnQgd2FzIG9uZ29pbmcsIGRpc2FibGUgSURMRUlFIGludGVycnVwdCAqLworICBpZiAoaHVhcnQtPlJlY2VwdGlvblR5cGUgPT0gSEFMX1VBUlRfUkVDRVBUSU9OX1RPSURMRSkgeworICAgIEFUT01JQ19DTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfSURMRUlFKSk7CisgIH0KKworICAvKiBBYm9ydCB0aGUgVUFSVCBETUEgVHggY2hhbm5lbCBpZiBlbmFibGVkICovCisgIGlmIChIQUxfSVNfQklUX1NFVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpKSB7CisgICAgLyogRGlzYWJsZSB0aGUgVUFSVCBETUEgVHggcmVxdWVzdCBpZiBlbmFibGVkICovCisgICAgQVRPTUlDX0NMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworCisgICAgLyogQWJvcnQgdGhlIFVBUlQgRE1BIFR4IGNoYW5uZWwgOiB1c2UgYmxvY2tpbmcgRE1BIEFib3J0IEFQSSAobm8gY2FsbGJhY2spCisgICAgICovCisgICAgaWYgKGh1YXJ0LT5oZG1hdHggIT0gTlVMTCkgeworICAgICAgLyogU2V0IHRoZSBVQVJUIERNQSBBYm9ydCBjYWxsYmFjayB0byBOdWxsLgorICAgICAgICAgTm8gY2FsbCBiYWNrIGV4ZWN1dGlvbiBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgaHVhcnQtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgICAgICBpZiAoSEFMX0RNQV9BYm9ydChodWFydC0+aGRtYXR4KSAhPSBIQUxfT0spIHsKKyAgICAgICAgaWYgKEhBTF9ETUFfR2V0RXJyb3IoaHVhcnQtPmhkbWF0eCkgPT0gSEFMX0RNQV9FUlJPUl9USU1FT1VUKSB7CisgICAgICAgICAgLyogU2V0IGVycm9yIGNvZGUgdG8gRE1BICovCisgICAgICAgICAgaHVhcnQtPkVycm9yQ29kZSA9IEhBTF9VQVJUX0VSUk9SX0RNQTsKKworICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIEFib3J0IHRoZSBVQVJUIERNQSBSeCBjaGFubmVsIGlmIGVuYWJsZWQgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpIHsKKyAgICAvKiBEaXNhYmxlIHRoZSBVQVJUIERNQSBSeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7CisKKyAgICAvKiBBYm9ydCB0aGUgVUFSVCBETUEgUnggY2hhbm5lbCA6IHVzZSBibG9ja2luZyBETUEgQWJvcnQgQVBJIChubyBjYWxsYmFjaykKKyAgICAgKi8KKyAgICBpZiAoaHVhcnQtPmhkbWFyeCAhPSBOVUxMKSB7CisgICAgICAvKiBTZXQgdGhlIFVBUlQgRE1BIEFib3J0IGNhbGxiYWNrIHRvIE51bGwuCisgICAgICAgICBObyBjYWxsIGJhY2sgZXhlY3V0aW9uIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisgICAgICBodWFydC0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgICAgIGlmIChIQUxfRE1BX0Fib3J0KGh1YXJ0LT5oZG1hcngpICE9IEhBTF9PSykgeworICAgICAgICBpZiAoSEFMX0RNQV9HZXRFcnJvcihodWFydC0+aGRtYXJ4KSA9PSBIQUxfRE1BX0VSUk9SX1RJTUVPVVQpIHsKKyAgICAgICAgICAvKiBTZXQgZXJyb3IgY29kZSB0byBETUEgKi8KKyAgICAgICAgICBodWFydC0+RXJyb3JDb2RlID0gSEFMX1VBUlRfRVJST1JfRE1BOworCisgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogUmVzZXQgVHggYW5kIFJ4IHRyYW5zZmVyIGNvdW50ZXJzICovCisgIGh1YXJ0LT5UeFhmZXJDb3VudCA9IDBVOworICBodWFydC0+UnhYZmVyQ291bnQgPSAwVTsKKworICAvKiBDbGVhciB0aGUgRXJyb3IgZmxhZ3MgaW4gdGhlIElDUiByZWdpc3RlciAqLworICBfX0hBTF9VQVJUX0NMRUFSX0ZMQUcoaHVhcnQsIFVBUlRfQ0xFQVJfT1JFRiB8IFVBUlRfQ0xFQVJfTkVGIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUFSVF9DTEVBUl9QRUYgfCBVQVJUX0NMRUFSX0ZFRik7CisKKyAgLyogRmx1c2ggdGhlIHdob2xlIFRYIEZJRk8gKGlmIG5lZWRlZCkgKi8KKyAgaWYgKGh1YXJ0LT5GaWZvTW9kZSA9PSBVQVJUX0ZJRk9NT0RFX0VOQUJMRSkgeworICAgIF9fSEFMX1VBUlRfU0VORF9SRVEoaHVhcnQsIFVBUlRfVFhEQVRBX0ZMVVNIX1JFUVVFU1QpOworICB9CisKKyAgLyogRGlzY2FyZCB0aGUgcmVjZWl2ZWQgZGF0YSAqLworICBfX0hBTF9VQVJUX1NFTkRfUkVRKGh1YXJ0LCBVQVJUX1JYREFUQV9GTFVTSF9SRVFVRVNUKTsKKworICAvKiBSZXN0b3JlIGh1YXJ0LT5nU3RhdGUgYW5kIGh1YXJ0LT5SeFN0YXRlIHRvIFJlYWR5ICovCisgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKyAgaHVhcnQtPlJ4U3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKyAgaHVhcnQtPlJlY2VwdGlvblR5cGUgPSBIQUxfVUFSVF9SRUNFUFRJT05fU1RBTkRBUkQ7CisKKyAgaHVhcnQtPkVycm9yQ29kZSA9IEhBTF9VQVJUX0VSUk9SX05PTkU7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgIEFib3J0IG9uZ29pbmcgVHJhbnNtaXQgdHJhbnNmZXIgKGJsb2NraW5nIG1vZGUpLgorICogQHBhcmFtICBodWFydCBVQVJUIGhhbmRsZS4KKyAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgY291bGQgYmUgdXNlZCBmb3IgYWJvcnRpbmcgYW55IG9uZ29pbmcgVHggdHJhbnNmZXIKKyAqIHN0YXJ0ZWQgaW4gSW50ZXJydXB0IG9yIERNQSBtb2RlLiBUaGlzIHByb2NlZHVyZSBwZXJmb3JtcyBmb2xsb3dpbmcKKyAqIG9wZXJhdGlvbnMgOgorICogICAgICAgICAgIC0gRGlzYWJsZSBVQVJUIEludGVycnVwdHMgKFR4KQorICogICAgICAgICAgIC0gRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGluIHRoZSBwZXJpcGhlcmFsIHJlZ2lzdGVyIChpZiBlbmFibGVkKQorICogICAgICAgICAgIC0gQWJvcnQgRE1BIHRyYW5zZmVyIGJ5IGNhbGxpbmcgSEFMX0RNQV9BYm9ydCAoaW4gY2FzZSBvZiB0cmFuc2ZlcgorICogaW4gRE1BIG1vZGUpCisgKiAgICAgICAgICAgLSBTZXQgaGFuZGxlIFN0YXRlIHRvIFJFQURZCisgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGlzIGV4ZWN1dGVkIGluIGJsb2NraW5nIG1vZGUgOiB3aGVuIGV4aXRpbmcgZnVuY3Rpb24sCisgKiBBYm9ydCBpcyBjb25zaWRlcmVkIGFzIGNvbXBsZXRlZC4KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9BYm9ydFRyYW5zbWl0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpIHsKKyAgLyogRGlzYWJsZSBUQ0lFLCBUWEVJRSBhbmQgVFhGVElFIGludGVycnVwdHMgKi8KKyAgQVRPTUlDX0NMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwKKyAgICAgICAgICAgICAgICAgICAoVVNBUlRfQ1IxX1RDSUUgfCBVU0FSVF9DUjFfVFhFSUVfVFhGTkZJRSkpOworICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfVFhGVElFKTsKKworICAvKiBBYm9ydCB0aGUgVUFSVCBETUEgVHggY2hhbm5lbCBpZiBlbmFibGVkICovCisgIGlmIChIQUxfSVNfQklUX1NFVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpKSB7CisgICAgLyogRGlzYWJsZSB0aGUgVUFSVCBETUEgVHggcmVxdWVzdCBpZiBlbmFibGVkICovCisgICAgQVRPTUlDX0NMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworCisgICAgLyogQWJvcnQgdGhlIFVBUlQgRE1BIFR4IGNoYW5uZWwgOiB1c2UgYmxvY2tpbmcgRE1BIEFib3J0IEFQSSAobm8gY2FsbGJhY2spCisgICAgICovCisgICAgaWYgKGh1YXJ0LT5oZG1hdHggIT0gTlVMTCkgeworICAgICAgLyogU2V0IHRoZSBVQVJUIERNQSBBYm9ydCBjYWxsYmFjayB0byBOdWxsLgorICAgICAgICAgTm8gY2FsbCBiYWNrIGV4ZWN1dGlvbiBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgaHVhcnQtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgICAgICBpZiAoSEFMX0RNQV9BYm9ydChodWFydC0+aGRtYXR4KSAhPSBIQUxfT0spIHsKKyAgICAgICAgaWYgKEhBTF9ETUFfR2V0RXJyb3IoaHVhcnQtPmhkbWF0eCkgPT0gSEFMX0RNQV9FUlJPUl9USU1FT1VUKSB7CisgICAgICAgICAgLyogU2V0IGVycm9yIGNvZGUgdG8gRE1BICovCisgICAgICAgICAgaHVhcnQtPkVycm9yQ29kZSA9IEhBTF9VQVJUX0VSUk9SX0RNQTsKKworICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIFJlc2V0IFR4IHRyYW5zZmVyIGNvdW50ZXIgKi8KKyAgaHVhcnQtPlR4WGZlckNvdW50ID0gMFU7CisKKyAgLyogRmx1c2ggdGhlIHdob2xlIFRYIEZJRk8gKGlmIG5lZWRlZCkgKi8KKyAgaWYgKGh1YXJ0LT5GaWZvTW9kZSA9PSBVQVJUX0ZJRk9NT0RFX0VOQUJMRSkgeworICAgIF9fSEFMX1VBUlRfU0VORF9SRVEoaHVhcnQsIFVBUlRfVFhEQVRBX0ZMVVNIX1JFUVVFU1QpOworICB9CisKKyAgLyogUmVzdG9yZSBodWFydC0+Z1N0YXRlIHRvIFJlYWR5ICovCisgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiAgQWJvcnQgb25nb2luZyBSZWNlaXZlIHRyYW5zZmVyIChibG9ja2luZyBtb2RlKS4KKyAqIEBwYXJhbSAgaHVhcnQgVUFSVCBoYW5kbGUuCisgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGNvdWxkIGJlIHVzZWQgZm9yIGFib3J0aW5nIGFueSBvbmdvaW5nIFJ4IHRyYW5zZmVyCisgKiBzdGFydGVkIGluIEludGVycnVwdCBvciBETUEgbW9kZS4gVGhpcyBwcm9jZWR1cmUgcGVyZm9ybXMgZm9sbG93aW5nCisgKiBvcGVyYXRpb25zIDoKKyAqICAgICAgICAgICAtIERpc2FibGUgVUFSVCBJbnRlcnJ1cHRzIChSeCkKKyAqICAgICAgICAgICAtIERpc2FibGUgdGhlIERNQSB0cmFuc2ZlciBpbiB0aGUgcGVyaXBoZXJhbCByZWdpc3RlciAoaWYgZW5hYmxlZCkKKyAqICAgICAgICAgICAtIEFib3J0IERNQSB0cmFuc2ZlciBieSBjYWxsaW5nIEhBTF9ETUFfQWJvcnQgKGluIGNhc2Ugb2YgdHJhbnNmZXIKKyAqIGluIERNQSBtb2RlKQorICogICAgICAgICAgIC0gU2V0IGhhbmRsZSBTdGF0ZSB0byBSRUFEWQorICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBpcyBleGVjdXRlZCBpbiBibG9ja2luZyBtb2RlIDogd2hlbiBleGl0aW5nIGZ1bmN0aW9uLAorICogQWJvcnQgaXMgY29uc2lkZXJlZCBhcyBjb21wbGV0ZWQuCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfQWJvcnRSZWNlaXZlKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpIHsKKyAgLyogRGlzYWJsZSBQRUlFLCBFSUUsIFJYTkVJRSBhbmQgUlhGVElFIGludGVycnVwdHMgKi8KKyAgQVRPTUlDX0NMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwKKyAgICAgICAgICAgICAgICAgICAoVVNBUlRfQ1IxX1BFSUUgfCBVU0FSVF9DUjFfUlhORUlFX1JYRk5FSUUpKTsKKyAgQVRPTUlDX0NMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSB8IFVTQVJUX0NSM19SWEZUSUUpOworCisgIC8qIElmIFJlY2VwdGlvbiB0aWxsIElETEUgZXZlbnQgd2FzIG9uZ29pbmcsIGRpc2FibGUgSURMRUlFIGludGVycnVwdCAqLworICBpZiAoaHVhcnQtPlJlY2VwdGlvblR5cGUgPT0gSEFMX1VBUlRfUkVDRVBUSU9OX1RPSURMRSkgeworICAgIEFUT01JQ19DTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfSURMRUlFKSk7CisgIH0KKworICAvKiBBYm9ydCB0aGUgVUFSVCBETUEgUnggY2hhbm5lbCBpZiBlbmFibGVkICovCisgIGlmIChIQUxfSVNfQklUX1NFVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpKSB7CisgICAgLyogRGlzYWJsZSB0aGUgVUFSVCBETUEgUnggcmVxdWVzdCBpZiBlbmFibGVkICovCisgICAgQVRPTUlDX0NMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOworCisgICAgLyogQWJvcnQgdGhlIFVBUlQgRE1BIFJ4IGNoYW5uZWwgOiB1c2UgYmxvY2tpbmcgRE1BIEFib3J0IEFQSSAobm8gY2FsbGJhY2spCisgICAgICovCisgICAgaWYgKGh1YXJ0LT5oZG1hcnggIT0gTlVMTCkgeworICAgICAgLyogU2V0IHRoZSBVQVJUIERNQSBBYm9ydCBjYWxsYmFjayB0byBOdWxsLgorICAgICAgICAgTm8gY2FsbCBiYWNrIGV4ZWN1dGlvbiBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgaHVhcnQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgICAgICBpZiAoSEFMX0RNQV9BYm9ydChodWFydC0+aGRtYXJ4KSAhPSBIQUxfT0spIHsKKyAgICAgICAgaWYgKEhBTF9ETUFfR2V0RXJyb3IoaHVhcnQtPmhkbWFyeCkgPT0gSEFMX0RNQV9FUlJPUl9USU1FT1VUKSB7CisgICAgICAgICAgLyogU2V0IGVycm9yIGNvZGUgdG8gRE1BICovCisgICAgICAgICAgaHVhcnQtPkVycm9yQ29kZSA9IEhBTF9VQVJUX0VSUk9SX0RNQTsKKworICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIFJlc2V0IFJ4IHRyYW5zZmVyIGNvdW50ZXIgKi8KKyAgaHVhcnQtPlJ4WGZlckNvdW50ID0gMFU7CisKKyAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KKyAgX19IQUxfVUFSVF9DTEVBUl9GTEFHKGh1YXJ0LCBVQVJUX0NMRUFSX09SRUYgfCBVQVJUX0NMRUFSX05FRiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVBUlRfQ0xFQVJfUEVGIHwgVUFSVF9DTEVBUl9GRUYpOworCisgIC8qIERpc2NhcmQgdGhlIHJlY2VpdmVkIGRhdGEgKi8KKyAgX19IQUxfVUFSVF9TRU5EX1JFUShodWFydCwgVUFSVF9SWERBVEFfRkxVU0hfUkVRVUVTVCk7CisKKyAgLyogUmVzdG9yZSBodWFydC0+UnhTdGF0ZSB0byBSZWFkeSAqLworICBodWFydC0+UnhTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworICBodWFydC0+UmVjZXB0aW9uVHlwZSA9IEhBTF9VQVJUX1JFQ0VQVElPTl9TVEFOREFSRDsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiAgQWJvcnQgb25nb2luZyB0cmFuc2ZlcnMgKEludGVycnVwdCBtb2RlKS4KKyAqIEBwYXJhbSAgaHVhcnQgVUFSVCBoYW5kbGUuCisgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGNvdWxkIGJlIHVzZWQgZm9yIGFib3J0aW5nIGFueSBvbmdvaW5nIHRyYW5zZmVyCisgKiBzdGFydGVkIGluIEludGVycnVwdCBvciBETUEgbW9kZS4gVGhpcyBwcm9jZWR1cmUgcGVyZm9ybXMgZm9sbG93aW5nCisgKiBvcGVyYXRpb25zIDoKKyAqICAgICAgICAgICAtIERpc2FibGUgVUFSVCBJbnRlcnJ1cHRzIChUeCBhbmQgUngpCisgKiAgICAgICAgICAgLSBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgaW4gdGhlIHBlcmlwaGVyYWwgcmVnaXN0ZXIgKGlmIGVuYWJsZWQpCisgKiAgICAgICAgICAgLSBBYm9ydCBETUEgdHJhbnNmZXIgYnkgY2FsbGluZyBIQUxfRE1BX0Fib3J0X0lUIChpbiBjYXNlIG9mCisgKiB0cmFuc2ZlciBpbiBETUEgbW9kZSkKKyAqICAgICAgICAgICAtIFNldCBoYW5kbGUgU3RhdGUgdG8gUkVBRFkKKyAqICAgICAgICAgICAtIEF0IGFib3J0IGNvbXBsZXRpb24sIGNhbGwgdXNlciBhYm9ydCBjb21wbGV0ZSBjYWxsYmFjaworICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBpcyBleGVjdXRlZCBpbiBJbnRlcnJ1cHQgbW9kZSwgbWVhbmluZyB0aGF0IGFib3J0CisgKiBwcm9jZWR1cmUgY291bGQgYmUgY29uc2lkZXJlZCBhcyBjb21wbGV0ZWQgb25seSB3aGVuIHVzZXIgYWJvcnQgY29tcGxldGUKKyAqIGNhbGxiYWNrIGlzIGV4ZWN1dGVkIChub3Qgd2hlbiBleGl0aW5nIGZ1bmN0aW9uKS4KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9BYm9ydF9JVChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KSB7CisgIHVpbnQzMl90IGFib3J0Y3BsdCA9IDFVOworCisgIC8qIERpc2FibGUgaW50ZXJydXB0cyAqLworICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLAorICAgICAgICAgICAgICAgICAgIChVU0FSVF9DUjFfUEVJRSB8IFVTQVJUX0NSMV9UQ0lFIHwgVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFIHwKKyAgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX1RYRUlFX1RYRk5GSUUpKTsKKyAgQVRPTUlDX0NMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywKKyAgICAgICAgICAgICAgICAgICAoVVNBUlRfQ1IzX0VJRSB8IFVTQVJUX0NSM19SWEZUSUUgfCBVU0FSVF9DUjNfVFhGVElFKSk7CisKKyAgLyogSWYgUmVjZXB0aW9uIHRpbGwgSURMRSBldmVudCB3YXMgb25nb2luZywgZGlzYWJsZSBJRExFSUUgaW50ZXJydXB0ICovCisgIGlmIChodWFydC0+UmVjZXB0aW9uVHlwZSA9PSBIQUxfVUFSVF9SRUNFUFRJT05fVE9JRExFKSB7CisgICAgQVRPTUlDX0NMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9JRExFSUUpKTsKKyAgfQorCisgIC8qIElmIERNQSBUeCBhbmQvb3IgRE1BIFJ4IEhhbmRsZXMgYXJlIGFzc29jaWF0ZWQgdG8gVUFSVCBIYW5kbGUsIERNQSBBYm9ydAorICAgICBjb21wbGV0ZSBjYWxsYmFja3Mgc2hvdWxkIGJlIGluaXRpYWxpc2VkIGJlZm9yZSBhbnkgY2FsbCB0byBETUEgQWJvcnQKKyAgICAgZnVuY3Rpb25zICovCisgIC8qIERNQSBUeCBIYW5kbGUgaXMgdmFsaWQgKi8KKyAgaWYgKGh1YXJ0LT5oZG1hdHggIT0gTlVMTCkgeworICAgIC8qIFNldCBETUEgQWJvcnQgQ29tcGxldGUgY2FsbGJhY2sgaWYgVUFSVCBETUEgVHggcmVxdWVzdCBpZiBlbmFibGVkLgorICAgICAgIE90aGVyd2lzZSwgc2V0IGl0IHRvIE5VTEwgKi8KKyAgICBpZiAoSEFMX0lTX0JJVF9TRVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKSkgeworICAgICAgaHVhcnQtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBVQVJUX0RNQVR4QWJvcnRDYWxsYmFjazsKKyAgICB9IGVsc2UgeworICAgICAgaHVhcnQtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworICAgIH0KKyAgfQorICAvKiBETUEgUnggSGFuZGxlIGlzIHZhbGlkICovCisgIGlmIChodWFydC0+aGRtYXJ4ICE9IE5VTEwpIHsKKyAgICAvKiBTZXQgRE1BIEFib3J0IENvbXBsZXRlIGNhbGxiYWNrIGlmIFVBUlQgRE1BIFJ4IHJlcXVlc3QgaWYgZW5hYmxlZC4KKyAgICAgICBPdGhlcndpc2UsIHNldCBpdCB0byBOVUxMICovCisgICAgaWYgKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpIHsKKyAgICAgIGh1YXJ0LT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gVUFSVF9ETUFSeEFib3J0Q2FsbGJhY2s7CisgICAgfSBlbHNlIHsKKyAgICAgIGh1YXJ0LT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKyAgICB9CisgIH0KKworICAvKiBBYm9ydCB0aGUgVUFSVCBETUEgVHggY2hhbm5lbCBpZiBlbmFibGVkICovCisgIGlmIChIQUxfSVNfQklUX1NFVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpKSB7CisgICAgLyogRGlzYWJsZSBETUEgVHggYXQgVUFSVCBsZXZlbCAqLworICAgIEFUT01JQ19DTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKworICAgIC8qIEFib3J0IHRoZSBVQVJUIERNQSBUeCBjaGFubmVsIDogdXNlIG5vbiBibG9ja2luZyBETUEgQWJvcnQgQVBJIChjYWxsYmFjaykKKyAgICAgKi8KKyAgICBpZiAoaHVhcnQtPmhkbWF0eCAhPSBOVUxMKSB7CisgICAgICAvKiBVQVJUIFR4IERNQSBBYm9ydCBjYWxsYmFjayBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpc2VkIDoKKyAgICAgICAgIHdpbGwgbGVhZCB0byBjYWxsIEhBTF9VQVJUX0Fib3J0Q3BsdENhbGxiYWNrKCkgYXQgZW5kIG9mIERNQSBhYm9ydAorICAgICAgICAgcHJvY2VkdXJlICovCisKKyAgICAgIC8qIEFib3J0IERNQSBUWCAqLworICAgICAgaWYgKEhBTF9ETUFfQWJvcnRfSVQoaHVhcnQtPmhkbWF0eCkgIT0gSEFMX09LKSB7CisgICAgICAgIGh1YXJ0LT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGFib3J0Y3BsdCA9IDBVOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIEFib3J0IHRoZSBVQVJUIERNQSBSeCBjaGFubmVsIGlmIGVuYWJsZWQgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpIHsKKyAgICAvKiBEaXNhYmxlIHRoZSBVQVJUIERNQSBSeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7CisKKyAgICAvKiBBYm9ydCB0aGUgVUFSVCBETUEgUnggY2hhbm5lbCA6IHVzZSBub24gYmxvY2tpbmcgRE1BIEFib3J0IEFQSSAoY2FsbGJhY2spCisgICAgICovCisgICAgaWYgKGh1YXJ0LT5oZG1hcnggIT0gTlVMTCkgeworICAgICAgLyogVUFSVCBSeCBETUEgQWJvcnQgY2FsbGJhY2sgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXNlZCA6CisgICAgICAgICB3aWxsIGxlYWQgdG8gY2FsbCBIQUxfVUFSVF9BYm9ydENwbHRDYWxsYmFjaygpIGF0IGVuZCBvZiBETUEgYWJvcnQKKyAgICAgICAgIHByb2NlZHVyZSAqLworCisgICAgICAvKiBBYm9ydCBETUEgUlggKi8KKyAgICAgIGlmIChIQUxfRE1BX0Fib3J0X0lUKGh1YXJ0LT5oZG1hcngpICE9IEhBTF9PSykgeworICAgICAgICBodWFydC0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisgICAgICAgIGFib3J0Y3BsdCA9IDFVOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYWJvcnRjcGx0ID0gMFU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogaWYgbm8gRE1BIGFib3J0IGNvbXBsZXRlIGNhbGxiYWNrIGV4ZWN1dGlvbiBpcyByZXF1aXJlZCA9PiBjYWxsIHVzZXIgQWJvcnQKKyAgICogQ29tcGxldGUgY2FsbGJhY2sgKi8KKyAgaWYgKGFib3J0Y3BsdCA9PSAxVSkgeworICAgIC8qIFJlc2V0IFR4IGFuZCBSeCB0cmFuc2ZlciBjb3VudGVycyAqLworICAgIGh1YXJ0LT5UeFhmZXJDb3VudCA9IDBVOworICAgIGh1YXJ0LT5SeFhmZXJDb3VudCA9IDBVOworCisgICAgLyogQ2xlYXIgSVNSIGZ1bmN0aW9uIHBvaW50ZXJzICovCisgICAgaHVhcnQtPlJ4SVNSID0gTlVMTDsKKyAgICBodWFydC0+VHhJU1IgPSBOVUxMOworCisgICAgLyogUmVzZXQgZXJyb3JDb2RlICovCisgICAgaHVhcnQtPkVycm9yQ29kZSA9IEhBTF9VQVJUX0VSUk9SX05PTkU7CisKKyAgICAvKiBDbGVhciB0aGUgRXJyb3IgZmxhZ3MgaW4gdGhlIElDUiByZWdpc3RlciAqLworICAgIF9fSEFMX1VBUlRfQ0xFQVJfRkxBRyhodWFydCwgVUFSVF9DTEVBUl9PUkVGIHwgVUFSVF9DTEVBUl9ORUYgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVBUlRfQ0xFQVJfUEVGIHwgVUFSVF9DTEVBUl9GRUYpOworCisgICAgLyogRmx1c2ggdGhlIHdob2xlIFRYIEZJRk8gKGlmIG5lZWRlZCkgKi8KKyAgICBpZiAoaHVhcnQtPkZpZm9Nb2RlID09IFVBUlRfRklGT01PREVfRU5BQkxFKSB7CisgICAgICBfX0hBTF9VQVJUX1NFTkRfUkVRKGh1YXJ0LCBVQVJUX1RYREFUQV9GTFVTSF9SRVFVRVNUKTsKKyAgICB9CisKKyAgICAvKiBEaXNjYXJkIHRoZSByZWNlaXZlZCBkYXRhICovCisgICAgX19IQUxfVUFSVF9TRU5EX1JFUShodWFydCwgVUFSVF9SWERBVEFfRkxVU0hfUkVRVUVTVCk7CisKKyAgICAvKiBSZXN0b3JlIGh1YXJ0LT5nU3RhdGUgYW5kIGh1YXJ0LT5SeFN0YXRlIHRvIFJlYWR5ICovCisgICAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworICAgIGh1YXJ0LT5SeFN0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisgICAgaHVhcnQtPlJlY2VwdGlvblR5cGUgPSBIQUxfVUFSVF9SRUNFUFRJT05fU1RBTkRBUkQ7CisKKyAgICAvKiBBcyBubyBETUEgdG8gYmUgYWJvcnRlZCwgY2FsbCBkaXJlY3RseSB1c2VyIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICBodWFydC0+QWJvcnRDcGx0Q2FsbGJhY2soaHVhcnQpOworI2Vsc2UKKyAgICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgSEFMX1VBUlRfQWJvcnRDcGx0Q2FsbGJhY2soaHVhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICogQGJyaWVmICBBYm9ydCBvbmdvaW5nIFRyYW5zbWl0IHRyYW5zZmVyIChJbnRlcnJ1cHQgbW9kZSkuCisgKiBAcGFyYW0gIGh1YXJ0IFVBUlQgaGFuZGxlLgorICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBjb3VsZCBiZSB1c2VkIGZvciBhYm9ydGluZyBhbnkgb25nb2luZyBUeCB0cmFuc2ZlcgorICogc3RhcnRlZCBpbiBJbnRlcnJ1cHQgb3IgRE1BIG1vZGUuIFRoaXMgcHJvY2VkdXJlIHBlcmZvcm1zIGZvbGxvd2luZworICogb3BlcmF0aW9ucyA6CisgKiAgICAgICAgICAgLSBEaXNhYmxlIFVBUlQgSW50ZXJydXB0cyAoVHgpCisgKiAgICAgICAgICAgLSBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgaW4gdGhlIHBlcmlwaGVyYWwgcmVnaXN0ZXIgKGlmIGVuYWJsZWQpCisgKiAgICAgICAgICAgLSBBYm9ydCBETUEgdHJhbnNmZXIgYnkgY2FsbGluZyBIQUxfRE1BX0Fib3J0X0lUIChpbiBjYXNlIG9mCisgKiB0cmFuc2ZlciBpbiBETUEgbW9kZSkKKyAqICAgICAgICAgICAtIFNldCBoYW5kbGUgU3RhdGUgdG8gUkVBRFkKKyAqICAgICAgICAgICAtIEF0IGFib3J0IGNvbXBsZXRpb24sIGNhbGwgdXNlciBhYm9ydCBjb21wbGV0ZSBjYWxsYmFjaworICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBpcyBleGVjdXRlZCBpbiBJbnRlcnJ1cHQgbW9kZSwgbWVhbmluZyB0aGF0IGFib3J0CisgKiBwcm9jZWR1cmUgY291bGQgYmUgY29uc2lkZXJlZCBhcyBjb21wbGV0ZWQgb25seSB3aGVuIHVzZXIgYWJvcnQgY29tcGxldGUKKyAqIGNhbGxiYWNrIGlzIGV4ZWN1dGVkIChub3Qgd2hlbiBleGl0aW5nIGZ1bmN0aW9uKS4KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9BYm9ydFRyYW5zbWl0X0lUKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpIHsKKyAgLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCisgIEFUT01JQ19DTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsCisgICAgICAgICAgICAgICAgICAgKFVTQVJUX0NSMV9UQ0lFIHwgVVNBUlRfQ1IxX1RYRUlFX1RYRk5GSUUpKTsKKyAgQVRPTUlDX0NMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX1RYRlRJRSk7CisKKyAgLyogQWJvcnQgdGhlIFVBUlQgRE1BIFR4IGNoYW5uZWwgaWYgZW5hYmxlZCAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKSkgeworICAgIC8qIERpc2FibGUgdGhlIFVBUlQgRE1BIFR4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICAgIEFUT01JQ19DTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKworICAgIC8qIEFib3J0IHRoZSBVQVJUIERNQSBUeCBjaGFubmVsIDogdXNlIG5vbiBibG9ja2luZyBETUEgQWJvcnQgQVBJIChjYWxsYmFjaykKKyAgICAgKi8KKyAgICBpZiAoaHVhcnQtPmhkbWF0eCAhPSBOVUxMKSB7CisgICAgICAvKiBTZXQgdGhlIFVBUlQgRE1BIEFib3J0IGNhbGxiYWNrIDoKKyAgICAgICAgIHdpbGwgbGVhZCB0byBjYWxsIEhBTF9VQVJUX0Fib3J0Q3BsdENhbGxiYWNrKCkgYXQgZW5kIG9mIERNQSBhYm9ydAorICAgICAgICAgcHJvY2VkdXJlICovCisgICAgICBodWFydC0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IFVBUlRfRE1BVHhPbmx5QWJvcnRDYWxsYmFjazsKKworICAgICAgLyogQWJvcnQgRE1BIFRYICovCisgICAgICBpZiAoSEFMX0RNQV9BYm9ydF9JVChodWFydC0+aGRtYXR4KSAhPSBIQUxfT0spIHsKKyAgICAgICAgLyogQ2FsbCBEaXJlY3RseSBodWFydC0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayBmdW5jdGlvbiBpbiBjYXNlIG9mCisgICAgICAgICAqIGVycm9yICovCisgICAgICAgIGh1YXJ0LT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrKGh1YXJ0LT5oZG1hdHgpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvKiBSZXNldCBUeCB0cmFuc2ZlciBjb3VudGVyICovCisgICAgICBodWFydC0+VHhYZmVyQ291bnQgPSAwVTsKKworICAgICAgLyogQ2xlYXIgVHhJU1IgZnVuY3Rpb24gcG9pbnRlcnMgKi8KKyAgICAgIGh1YXJ0LT5UeElTUiA9IE5VTEw7CisKKyAgICAgIC8qIFJlc3RvcmUgaHVhcnQtPmdTdGF0ZSB0byBSZWFkeSAqLworICAgICAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworCisgICAgICAvKiBBcyBubyBETUEgdG8gYmUgYWJvcnRlZCwgY2FsbCBkaXJlY3RseSB1c2VyIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgIC8qIENhbGwgcmVnaXN0ZXJlZCBBYm9ydCBUcmFuc21pdCBDb21wbGV0ZSBDYWxsYmFjayAqLworICAgICAgaHVhcnQtPkFib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2soaHVhcnQpOworI2Vsc2UKKyAgICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgQWJvcnQgVHJhbnNtaXQgQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICAgIEhBTF9VQVJUX0Fib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2soaHVhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyogUmVzZXQgVHggdHJhbnNmZXIgY291bnRlciAqLworICAgIGh1YXJ0LT5UeFhmZXJDb3VudCA9IDBVOworCisgICAgLyogQ2xlYXIgVHhJU1IgZnVuY3Rpb24gcG9pbnRlcnMgKi8KKyAgICBodWFydC0+VHhJU1IgPSBOVUxMOworCisgICAgLyogRmx1c2ggdGhlIHdob2xlIFRYIEZJRk8gKGlmIG5lZWRlZCkgKi8KKyAgICBpZiAoaHVhcnQtPkZpZm9Nb2RlID09IFVBUlRfRklGT01PREVfRU5BQkxFKSB7CisgICAgICBfX0hBTF9VQVJUX1NFTkRfUkVRKGh1YXJ0LCBVQVJUX1RYREFUQV9GTFVTSF9SRVFVRVNUKTsKKyAgICB9CisKKyAgICAvKiBSZXN0b3JlIGh1YXJ0LT5nU3RhdGUgdG8gUmVhZHkgKi8KKyAgICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBBcyBubyBETUEgdG8gYmUgYWJvcnRlZCwgY2FsbCBkaXJlY3RseSB1c2VyIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgQWJvcnQgVHJhbnNtaXQgQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICBodWFydC0+QWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayhodWFydCk7CisjZWxzZQorICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgQWJvcnQgVHJhbnNtaXQgQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICBIQUxfVUFSVF9BYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrKGh1YXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiAgQWJvcnQgb25nb2luZyBSZWNlaXZlIHRyYW5zZmVyIChJbnRlcnJ1cHQgbW9kZSkuCisgKiBAcGFyYW0gIGh1YXJ0IFVBUlQgaGFuZGxlLgorICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBjb3VsZCBiZSB1c2VkIGZvciBhYm9ydGluZyBhbnkgb25nb2luZyBSeCB0cmFuc2ZlcgorICogc3RhcnRlZCBpbiBJbnRlcnJ1cHQgb3IgRE1BIG1vZGUuIFRoaXMgcHJvY2VkdXJlIHBlcmZvcm1zIGZvbGxvd2luZworICogb3BlcmF0aW9ucyA6CisgKiAgICAgICAgICAgLSBEaXNhYmxlIFVBUlQgSW50ZXJydXB0cyAoUngpCisgKiAgICAgICAgICAgLSBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgaW4gdGhlIHBlcmlwaGVyYWwgcmVnaXN0ZXIgKGlmIGVuYWJsZWQpCisgKiAgICAgICAgICAgLSBBYm9ydCBETUEgdHJhbnNmZXIgYnkgY2FsbGluZyBIQUxfRE1BX0Fib3J0X0lUIChpbiBjYXNlIG9mCisgKiB0cmFuc2ZlciBpbiBETUEgbW9kZSkKKyAqICAgICAgICAgICAtIFNldCBoYW5kbGUgU3RhdGUgdG8gUkVBRFkKKyAqICAgICAgICAgICAtIEF0IGFib3J0IGNvbXBsZXRpb24sIGNhbGwgdXNlciBhYm9ydCBjb21wbGV0ZSBjYWxsYmFjaworICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBpcyBleGVjdXRlZCBpbiBJbnRlcnJ1cHQgbW9kZSwgbWVhbmluZyB0aGF0IGFib3J0CisgKiBwcm9jZWR1cmUgY291bGQgYmUgY29uc2lkZXJlZCBhcyBjb21wbGV0ZWQgb25seSB3aGVuIHVzZXIgYWJvcnQgY29tcGxldGUKKyAqIGNhbGxiYWNrIGlzIGV4ZWN1dGVkIChub3Qgd2hlbiBleGl0aW5nIGZ1bmN0aW9uKS4KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9BYm9ydFJlY2VpdmVfSVQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkgeworICAvKiBEaXNhYmxlIFJYTkUsIFBFIGFuZCBFUlIgKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikKKyAgICogaW50ZXJydXB0cyAqLworICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLAorICAgICAgICAgICAgICAgICAgIChVU0FSVF9DUjFfUEVJRSB8IFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSkpOworICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCAoVVNBUlRfQ1IzX0VJRSB8IFVTQVJUX0NSM19SWEZUSUUpKTsKKworICAvKiBJZiBSZWNlcHRpb24gdGlsbCBJRExFIGV2ZW50IHdhcyBvbmdvaW5nLCBkaXNhYmxlIElETEVJRSBpbnRlcnJ1cHQgKi8KKyAgaWYgKGh1YXJ0LT5SZWNlcHRpb25UeXBlID09IEhBTF9VQVJUX1JFQ0VQVElPTl9UT0lETEUpIHsKKyAgICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCAoVVNBUlRfQ1IxX0lETEVJRSkpOworICB9CisKKyAgLyogQWJvcnQgdGhlIFVBUlQgRE1BIFJ4IGNoYW5uZWwgaWYgZW5hYmxlZCAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKSkgeworICAgIC8qIERpc2FibGUgdGhlIFVBUlQgRE1BIFJ4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICAgIEFUT01JQ19DTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKKworICAgIC8qIEFib3J0IHRoZSBVQVJUIERNQSBSeCBjaGFubmVsIDogdXNlIG5vbiBibG9ja2luZyBETUEgQWJvcnQgQVBJIChjYWxsYmFjaykKKyAgICAgKi8KKyAgICBpZiAoaHVhcnQtPmhkbWFyeCAhPSBOVUxMKSB7CisgICAgICAvKiBTZXQgdGhlIFVBUlQgRE1BIEFib3J0IGNhbGxiYWNrIDoKKyAgICAgICAgIHdpbGwgbGVhZCB0byBjYWxsIEhBTF9VQVJUX0Fib3J0Q3BsdENhbGxiYWNrKCkgYXQgZW5kIG9mIERNQSBhYm9ydAorICAgICAgICAgcHJvY2VkdXJlICovCisgICAgICBodWFydC0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IFVBUlRfRE1BUnhPbmx5QWJvcnRDYWxsYmFjazsKKworICAgICAgLyogQWJvcnQgRE1BIFJYICovCisgICAgICBpZiAoSEFMX0RNQV9BYm9ydF9JVChodWFydC0+aGRtYXJ4KSAhPSBIQUxfT0spIHsKKyAgICAgICAgLyogQ2FsbCBEaXJlY3RseSBodWFydC0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayBmdW5jdGlvbiBpbiBjYXNlIG9mCisgICAgICAgICAqIGVycm9yICovCisgICAgICAgIGh1YXJ0LT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrKGh1YXJ0LT5oZG1hcngpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvKiBSZXNldCBSeCB0cmFuc2ZlciBjb3VudGVyICovCisgICAgICBodWFydC0+UnhYZmVyQ291bnQgPSAwVTsKKworICAgICAgLyogQ2xlYXIgUnhJU1IgZnVuY3Rpb24gcG9pbnRlciAqLworICAgICAgaHVhcnQtPnBSeEJ1ZmZQdHIgPSBOVUxMOworCisgICAgICAvKiBDbGVhciB0aGUgRXJyb3IgZmxhZ3MgaW4gdGhlIElDUiByZWdpc3RlciAqLworICAgICAgX19IQUxfVUFSVF9DTEVBUl9GTEFHKGh1YXJ0LCBVQVJUX0NMRUFSX09SRUYgfCBVQVJUX0NMRUFSX05FRiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQVJUX0NMRUFSX1BFRiB8IFVBUlRfQ0xFQVJfRkVGKTsKKworICAgICAgLyogRGlzY2FyZCB0aGUgcmVjZWl2ZWQgZGF0YSAqLworICAgICAgX19IQUxfVUFSVF9TRU5EX1JFUShodWFydCwgVUFSVF9SWERBVEFfRkxVU0hfUkVRVUVTVCk7CisKKyAgICAgIC8qIFJlc3RvcmUgaHVhcnQtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgICAgIGh1YXJ0LT5SeFN0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisgICAgICBodWFydC0+UmVjZXB0aW9uVHlwZSA9IEhBTF9VQVJUX1JFQ0VQVElPTl9TVEFOREFSRDsKKworICAgICAgLyogQXMgbm8gRE1BIHRvIGJlIGFib3J0ZWQsIGNhbGwgZGlyZWN0bHkgdXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgQWJvcnQgUmVjZWl2ZSBDb21wbGV0ZSBDYWxsYmFjayAqLworICAgICAgaHVhcnQtPkFib3J0UmVjZWl2ZUNwbHRDYWxsYmFjayhodWFydCk7CisjZWxzZQorICAgICAgLyogQ2FsbCBsZWdhY3kgd2VhayBBYm9ydCBSZWNlaXZlIENvbXBsZXRlIENhbGxiYWNrICovCisgICAgICBIQUxfVUFSVF9BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2soaHVhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyogUmVzZXQgUnggdHJhbnNmZXIgY291bnRlciAqLworICAgIGh1YXJ0LT5SeFhmZXJDb3VudCA9IDBVOworCisgICAgLyogQ2xlYXIgUnhJU1IgZnVuY3Rpb24gcG9pbnRlciAqLworICAgIGh1YXJ0LT5wUnhCdWZmUHRyID0gTlVMTDsKKworICAgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCisgICAgX19IQUxfVUFSVF9DTEVBUl9GTEFHKGh1YXJ0LCBVQVJUX0NMRUFSX09SRUYgfCBVQVJUX0NMRUFSX05FRiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUFSVF9DTEVBUl9QRUYgfCBVQVJUX0NMRUFSX0ZFRik7CisKKyAgICAvKiBSZXN0b3JlIGh1YXJ0LT5SeFN0YXRlIHRvIFJlYWR5ICovCisgICAgaHVhcnQtPlJ4U3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKyAgICBodWFydC0+UmVjZXB0aW9uVHlwZSA9IEhBTF9VQVJUX1JFQ0VQVElPTl9TVEFOREFSRDsKKworICAgIC8qIEFzIG5vIERNQSB0byBiZSBhYm9ydGVkLCBjYWxsIGRpcmVjdGx5IHVzZXIgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIC8qIENhbGwgcmVnaXN0ZXJlZCBBYm9ydCBSZWNlaXZlIENvbXBsZXRlIENhbGxiYWNrICovCisgICAgaHVhcnQtPkFib3J0UmVjZWl2ZUNwbHRDYWxsYmFjayhodWFydCk7CisjZWxzZQorICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgQWJvcnQgUmVjZWl2ZSBDb21wbGV0ZSBDYWxsYmFjayAqLworICAgIEhBTF9VQVJUX0Fib3J0UmVjZWl2ZUNwbHRDYWxsYmFjayhodWFydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgSGFuZGxlIFVBUlQgaW50ZXJydXB0IHJlcXVlc3QuCisgKiBAcGFyYW0gaHVhcnQgVUFSVCBoYW5kbGUuCisgKiBAcmV0dmFsIE5vbmUKKyAqLwordm9pZCBIQUxfVUFSVF9JUlFIYW5kbGVyKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpIHsKKyAgdWludDMyX3QgaXNyZmxhZ3MgPSBSRUFEX1JFRyhodWFydC0+SW5zdGFuY2UtPklTUik7CisgIHVpbnQzMl90IGNyMWl0cyA9IFJFQURfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxKTsKKyAgdWludDMyX3QgY3IzaXRzID0gUkVBRF9SRUcoaHVhcnQtPkluc3RhbmNlLT5DUjMpOworCisgIHVpbnQzMl90IGVycm9yZmxhZ3M7CisgIHVpbnQzMl90IGVycm9yY29kZTsKKworICAvKiBJZiBubyBlcnJvciBvY2N1cnMgKi8KKyAgZXJyb3JmbGFncyA9CisgICAgICAoaXNyZmxhZ3MgJiAodWludDMyX3QpKFVTQVJUX0lTUl9QRSB8IFVTQVJUX0lTUl9GRSB8IFVTQVJUX0lTUl9PUkUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfTkUgfCBVU0FSVF9JU1JfUlRPRikpOworICBpZiAoZXJyb3JmbGFncyA9PSAwVSkgeworICAgIC8qIFVBUlQgaW4gbW9kZSBSZWNlaXZlcgorICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfUlhORV9SWEZORSkgIT0gMFUpICYmCisgICAgICAgICgoKGNyMWl0cyAmIFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSkgIT0gMFUpIHx8CisgICAgICAgICAoKGNyM2l0cyAmIFVTQVJUX0NSM19SWEZUSUUpICE9IDBVKSkpIHsKKyAgICAgIGlmIChodWFydC0+UnhJU1IgIT0gTlVMTCkgeworICAgICAgICBodWFydC0+UnhJU1IoaHVhcnQpOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIC8qIElmIHNvbWUgZXJyb3JzIG9jY3VyICovCisgIGlmICgoZXJyb3JmbGFncyAhPSAwVSkgJiYKKyAgICAgICgoKChjcjNpdHMgJiAoVVNBUlRfQ1IzX1JYRlRJRSB8IFVTQVJUX0NSM19FSUUpKSAhPSAwVSkgfHwKKyAgICAgICAgKChjcjFpdHMgJiAoVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFIHwgVVNBUlRfQ1IxX1BFSUUgfAorICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfUlRPSUUpKSAhPSAwVSkpKSkgeworICAgIC8qIFVBUlQgcGFyaXR5IGVycm9yIGludGVycnVwdCBvY2N1cnJlZAorICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmICgoKGlzcmZsYWdzICYgVVNBUlRfSVNSX1BFKSAhPSAwVSkgJiYKKyAgICAgICAgKChjcjFpdHMgJiBVU0FSVF9DUjFfUEVJRSkgIT0gMFUpKSB7CisgICAgICBfX0hBTF9VQVJUX0NMRUFSX0ZMQUcoaHVhcnQsIFVBUlRfQ0xFQVJfUEVGKTsKKworICAgICAgaHVhcnQtPkVycm9yQ29kZSB8PSBIQUxfVUFSVF9FUlJPUl9QRTsKKyAgICB9CisKKyAgICAvKiBVQVJUIGZyYW1lIGVycm9yIGludGVycnVwdCBvY2N1cnJlZAorICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9GRSkgIT0gMFUpICYmICgoY3IzaXRzICYgVVNBUlRfQ1IzX0VJRSkgIT0gMFUpKSB7CisgICAgICBfX0hBTF9VQVJUX0NMRUFSX0ZMQUcoaHVhcnQsIFVBUlRfQ0xFQVJfRkVGKTsKKworICAgICAgaHVhcnQtPkVycm9yQ29kZSB8PSBIQUxfVUFSVF9FUlJPUl9GRTsKKyAgICB9CisKKyAgICAvKiBVQVJUIG5vaXNlIGVycm9yIGludGVycnVwdCBvY2N1cnJlZAorICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9ORSkgIT0gMFUpICYmICgoY3IzaXRzICYgVVNBUlRfQ1IzX0VJRSkgIT0gMFUpKSB7CisgICAgICBfX0hBTF9VQVJUX0NMRUFSX0ZMQUcoaHVhcnQsIFVBUlRfQ0xFQVJfTkVGKTsKKworICAgICAgaHVhcnQtPkVycm9yQ29kZSB8PSBIQUxfVUFSVF9FUlJPUl9ORTsKKyAgICB9CisKKyAgICAvKiBVQVJUIE92ZXItUnVuIGludGVycnVwdCBvY2N1cnJlZAorICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9PUkUpICE9IDBVKSAmJgorICAgICAgICAoKChjcjFpdHMgJiBVU0FSVF9DUjFfUlhORUlFX1JYRk5FSUUpICE9IDBVKSB8fAorICAgICAgICAgKChjcjNpdHMgJiAoVVNBUlRfQ1IzX1JYRlRJRSB8IFVTQVJUX0NSM19FSUUpKSAhPSAwVSkpKSB7CisgICAgICBfX0hBTF9VQVJUX0NMRUFSX0ZMQUcoaHVhcnQsIFVBUlRfQ0xFQVJfT1JFRik7CisKKyAgICAgIGh1YXJ0LT5FcnJvckNvZGUgfD0gSEFMX1VBUlRfRVJST1JfT1JFOworICAgIH0KKworICAgIC8qIFVBUlQgUmVjZWl2ZXIgVGltZW91dCBpbnRlcnJ1cHQgb2NjdXJyZWQKKyAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmICgoKGlzcmZsYWdzICYgVVNBUlRfSVNSX1JUT0YpICE9IDBVKSAmJgorICAgICAgICAoKGNyMWl0cyAmIFVTQVJUX0NSMV9SVE9JRSkgIT0gMFUpKSB7CisgICAgICBfX0hBTF9VQVJUX0NMRUFSX0ZMQUcoaHVhcnQsIFVBUlRfQ0xFQVJfUlRPRik7CisKKyAgICAgIGh1YXJ0LT5FcnJvckNvZGUgfD0gSEFMX1VBUlRfRVJST1JfUlRPOworICAgIH0KKworICAgIC8qIENhbGwgVUFSVCBFcnJvciBDYWxsIGJhY2sgZnVuY3Rpb24gaWYgbmVlZCBiZQorICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmIChodWFydC0+RXJyb3JDb2RlICE9IEhBTF9VQVJUX0VSUk9SX05PTkUpIHsKKyAgICAgIC8qIFVBUlQgaW4gbW9kZSBSZWNlaXZlcgorICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgICAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfUlhORV9SWEZORSkgIT0gMFUpICYmCisgICAgICAgICAgKCgoY3IxaXRzICYgVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFKSAhPSAwVSkgfHwKKyAgICAgICAgICAgKChjcjNpdHMgJiBVU0FSVF9DUjNfUlhGVElFKSAhPSAwVSkpKSB7CisgICAgICAgIGlmIChodWFydC0+UnhJU1IgIT0gTlVMTCkgeworICAgICAgICAgIGh1YXJ0LT5SeElTUihodWFydCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogSWYgRXJyb3IgaXMgdG8gYmUgY29uc2lkZXJlZCBhcyBibG9ja2luZyA6CisgICAgICAgICAgLSBSZWNlaXZlciBUaW1lb3V0IGVycm9yIGluIFJlY2VwdGlvbgorICAgICAgICAgIC0gT3ZlcnJ1biBlcnJvciBpbiBSZWNlcHRpb24KKyAgICAgICAgICAtIGFueSBlcnJvciBvY2N1cnMgaW4gRE1BIG1vZGUgcmVjZXB0aW9uCisgICAgICAqLworICAgICAgZXJyb3Jjb2RlID0gaHVhcnQtPkVycm9yQ29kZTsKKyAgICAgIGlmICgoSEFMX0lTX0JJVF9TRVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKSkgfHwKKyAgICAgICAgICAoKGVycm9yY29kZSAmIChIQUxfVUFSVF9FUlJPUl9SVE8gfCBIQUxfVUFSVF9FUlJPUl9PUkUpKSAhPSAwVSkpIHsKKyAgICAgICAgLyogQmxvY2tpbmcgZXJyb3IgOiB0cmFuc2ZlciBpcyBhYm9ydGVkCisgICAgICAgICAgIFNldCB0aGUgVUFSVCBzdGF0ZSByZWFkeSB0byBiZSBhYmxlIHRvIHN0YXJ0IGFnYWluIHRoZSBwcm9jZXNzLAorICAgICAgICAgICBEaXNhYmxlIFJ4IEludGVycnVwdHMsIGFuZCBkaXNhYmxlIFJ4IERNQSByZXF1ZXN0LCBpZiBvbmdvaW5nICovCisgICAgICAgIFVBUlRfRW5kUnhUcmFuc2ZlcihodWFydCk7CisKKyAgICAgICAgLyogQWJvcnQgdGhlIFVBUlQgRE1BIFJ4IGNoYW5uZWwgaWYgZW5hYmxlZCAqLworICAgICAgICBpZiAoSEFMX0lTX0JJVF9TRVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKSkgeworICAgICAgICAgIC8qIERpc2FibGUgdGhlIFVBUlQgRE1BIFJ4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICAgICAgICAgIEFUT01JQ19DTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKKworICAgICAgICAgIC8qIEFib3J0IHRoZSBVQVJUIERNQSBSeCBjaGFubmVsICovCisgICAgICAgICAgaWYgKGh1YXJ0LT5oZG1hcnggIT0gTlVMTCkgeworICAgICAgICAgICAgLyogU2V0IHRoZSBVQVJUIERNQSBBYm9ydCBjYWxsYmFjayA6CisgICAgICAgICAgICAgICB3aWxsIGxlYWQgdG8gY2FsbCBIQUxfVUFSVF9FcnJvckNhbGxiYWNrKCkgYXQgZW5kIG9mIERNQSBhYm9ydAorICAgICAgICAgICAgICAgcHJvY2VkdXJlICovCisgICAgICAgICAgICBodWFydC0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IFVBUlRfRE1BQWJvcnRPbkVycm9yOworCisgICAgICAgICAgICAvKiBBYm9ydCBETUEgUlggKi8KKyAgICAgICAgICAgIGlmIChIQUxfRE1BX0Fib3J0X0lUKGh1YXJ0LT5oZG1hcngpICE9IEhBTF9PSykgeworICAgICAgICAgICAgICAvKiBDYWxsIERpcmVjdGx5IGh1YXJ0LT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrIGZ1bmN0aW9uIGluIGNhc2UKKyAgICAgICAgICAgICAgICogb2YgZXJyb3IgKi8KKyAgICAgICAgICAgICAgaHVhcnQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2soaHVhcnQtPmhkbWFyeCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIENhbGwgdXNlciBlcnJvciBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBlcnJvciBjYWxsYmFjayovCisgICAgICAgICAgICBodWFydC0+RXJyb3JDYWxsYmFjayhodWFydCk7CisjZWxzZQorICAgICAgICAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIGVycm9yIGNhbGxiYWNrKi8KKyAgICAgICAgICAgIEhBTF9VQVJUX0Vycm9yQ2FsbGJhY2soaHVhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLyogQ2FsbCB1c2VyIGVycm9yIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBlcnJvciBjYWxsYmFjayovCisgICAgICAgICAgaHVhcnQtPkVycm9yQ2FsbGJhY2soaHVhcnQpOworI2Vsc2UKKyAgICAgICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgZXJyb3IgY2FsbGJhY2sqLworICAgICAgICAgIEhBTF9VQVJUX0Vycm9yQ2FsbGJhY2soaHVhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogTm9uIEJsb2NraW5nIGVycm9yIDogdHJhbnNmZXIgY291bGQgZ28gb24uCisgICAgICAgICAgIEVycm9yIGlzIG5vdGlmaWVkIHRvIHVzZXIgdGhyb3VnaCB1c2VyIGVycm9yIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgLypDYWxsIHJlZ2lzdGVyZWQgZXJyb3IgY2FsbGJhY2sqLworICAgICAgICBodWFydC0+RXJyb3JDYWxsYmFjayhodWFydCk7CisjZWxzZQorICAgICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgZXJyb3IgY2FsbGJhY2sqLworICAgICAgICBIQUxfVUFSVF9FcnJvckNhbGxiYWNrKGh1YXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgICAgIGh1YXJ0LT5FcnJvckNvZGUgPSBIQUxfVUFSVF9FUlJPUl9OT05FOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm47CisKKyAgfSAvKiBFbmQgaWYgc29tZSBlcnJvciBvY2N1cnMgKi8KKworICAvKiBDaGVjayBjdXJyZW50IHJlY2VwdGlvbiBNb2RlIDoKKyAgICAgSWYgUmVjZXB0aW9uIHRpbGwgSURMRSBldmVudCBoYXMgYmVlbiBzZWxlY3RlZCA6ICovCisgIGlmICgoaHVhcnQtPlJlY2VwdGlvblR5cGUgPT0gSEFMX1VBUlRfUkVDRVBUSU9OX1RPSURMRSkgJiYKKyAgICAgICgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfSURMRSkgIT0gMFUpICYmCisgICAgICAoKGNyMWl0cyAmIFVTQVJUX0lTUl9JRExFKSAhPSAwVSkpIHsKKyAgICBfX0hBTF9VQVJUX0NMRUFSX0ZMQUcoaHVhcnQsIFVBUlRfQ0xFQVJfSURMRUYpOworCisgICAgLyogQ2hlY2sgaWYgRE1BIG1vZGUgaXMgZW5hYmxlZCBpbiBVQVJUICovCisgICAgaWYgKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpIHsKKyAgICAgIC8qIERNQSBtb2RlIGVuYWJsZWQgKi8KKyAgICAgIC8qIENoZWNrIHJlY2VpdmVkIGxlbmd0aCA6IElmIGFsbCBleHBlY3RlZCBkYXRhIGFyZSByZWNlaXZlZCwgZG8gbm90aGluZywKKyAgICAgICAgIChETUEgY3BsdCBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCkuCisgICAgICAgICBPdGhlcndpc2UsIGlmIGF0IGxlYXN0IG9uZSBkYXRhIGhhcyBhbHJlYWR5IGJlZW4gcmVjZWl2ZWQsIElETEUgZXZlbnQKKyAgICAgICAgIGlzIHRvIGJlIG5vdGlmaWVkIHRvIHVzZXIgKi8KKyAgICAgIHVpbnQxNl90IG5iX3JlbWFpbmluZ19yeF9kYXRhID0KKyAgICAgICAgICAodWludDE2X3QpX19IQUxfRE1BX0dFVF9DT1VOVEVSKGh1YXJ0LT5oZG1hcngpOworICAgICAgaWYgKChuYl9yZW1haW5pbmdfcnhfZGF0YSA+IDBVKSAmJgorICAgICAgICAgIChuYl9yZW1haW5pbmdfcnhfZGF0YSA8IGh1YXJ0LT5SeFhmZXJTaXplKSkgeworICAgICAgICAvKiBSZWNlcHRpb24gaXMgbm90IGNvbXBsZXRlICovCisgICAgICAgIGh1YXJ0LT5SeFhmZXJDb3VudCA9IG5iX3JlbWFpbmluZ19yeF9kYXRhOworCisgICAgICAgIC8qIEluIE5vcm1hbCBtb2RlLCBlbmQgRE1BIHhmZXIgYW5kIEhBTCBVQVJUIFJ4IHByb2Nlc3MqLworICAgICAgICBpZiAoSEFMX0lTX0JJVF9DTFIoaHVhcnQtPmhkbWFyeC0+SW5zdGFuY2UtPkNDUiwgRE1BX0NDUl9DSVJDKSkgeworICAgICAgICAgIC8qIERpc2FibGUgUEUgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKQorICAgICAgICAgICAqIGludGVycnVwdHMgKi8KKyAgICAgICAgICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUEVJRSk7CisgICAgICAgICAgQVRPTUlDX0NMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgZm9yIHRoZSByZWNlaXZlciByZXF1ZXN0IGJ5IHJlc2V0dGluZyB0aGUKKyAgICAgICAgICAgICBETUFSIGJpdCBpbiB0aGUgVUFSVCBDUjMgcmVnaXN0ZXIgKi8KKyAgICAgICAgICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7CisKKyAgICAgICAgICAvKiBBdCBlbmQgb2YgUnggcHJvY2VzcywgcmVzdG9yZSBodWFydC0+UnhTdGF0ZSB0byBSZWFkeSAqLworICAgICAgICAgIGh1YXJ0LT5SeFN0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisgICAgICAgICAgaHVhcnQtPlJlY2VwdGlvblR5cGUgPSBIQUxfVUFSVF9SRUNFUFRJT05fU1RBTkRBUkQ7CisKKyAgICAgICAgICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfSURMRUlFKTsKKworICAgICAgICAgIC8qIExhc3QgYnl0ZXMgcmVjZWl2ZWQsIHNvIG5vIG5lZWQgYXMgdGhlIGFib3J0IGlzIGltbWVkaWF0ZSAqLworICAgICAgICAgICh2b2lkKUhBTF9ETUFfQWJvcnQoaHVhcnQtPmhkbWFyeCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBJbml0aWFsaXplIHR5cGUgb2YgUnhFdmVudCB0aGF0IGNvcnJlc3BvbmQgdG8gUnhFdmVudCBjYWxsYmFjaworICAgICAgICAgICBleGVjdXRpb247IEluIHRoaXMgY2FzZSwgUnggRXZlbnQgdHlwZSBpcyBJZGxlIEV2ZW50ICovCisgICAgICAgIGh1YXJ0LT5SeEV2ZW50VHlwZSA9IEhBTF9VQVJUX1JYRVZFTlRfSURMRTsKKworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIFJ4IEV2ZW50IGNhbGxiYWNrKi8KKyAgICAgICAgaHVhcnQtPlJ4RXZlbnRDYWxsYmFjayhodWFydCwgKGh1YXJ0LT5SeFhmZXJTaXplIC0gaHVhcnQtPlJ4WGZlckNvdW50KSk7CisjZWxzZQorICAgICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgUnggRXZlbnQgY2FsbGJhY2sqLworICAgICAgICBIQUxfVUFSVEV4X1J4RXZlbnRDYWxsYmFjayhodWFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGh1YXJ0LT5SeFhmZXJTaXplIC0gaHVhcnQtPlJ4WGZlckNvdW50KSk7CisjZW5kaWYgLyogKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MpICovCisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBJZiBETUEgaXMgaW4gQ2lyY3VsYXIgbW9kZSwgSWRsZSBldmVudCBpcyB0byBiZSByZXBvcnRlZCB0byB1c2VyCisgICAgICAgICAgIGV2ZW4gaWYgb2NjdXJyaW5nIGFmdGVyIGEgVHJhbnNmZXIgQ29tcGxldGUgZXZlbnQgZnJvbSBETUEgKi8KKyAgICAgICAgaWYgKG5iX3JlbWFpbmluZ19yeF9kYXRhID09IGh1YXJ0LT5SeFhmZXJTaXplKSB7CisgICAgICAgICAgaWYgKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5oZG1hcngtPkluc3RhbmNlLT5DQ1IsIERNQV9DQ1JfQ0lSQykpIHsKKyAgICAgICAgICAgIC8qIEluaXRpYWxpemUgdHlwZSBvZiBSeEV2ZW50IHRoYXQgY29ycmVzcG9uZCB0byBSeEV2ZW50IGNhbGxiYWNrCisgICAgICAgICAgICAgICBleGVjdXRpb247IEluIHRoaXMgY2FzZSwgUnggRXZlbnQgdHlwZSBpcyBJZGxlIEV2ZW50ICovCisgICAgICAgICAgICBodWFydC0+UnhFdmVudFR5cGUgPSBIQUxfVUFSVF9SWEVWRU5UX0lETEU7CisKKyNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgICAgICAgLypDYWxsIHJlZ2lzdGVyZWQgUnggRXZlbnQgY2FsbGJhY2sqLworICAgICAgICAgICAgaHVhcnQtPlJ4RXZlbnRDYWxsYmFjayhodWFydCwgaHVhcnQtPlJ4WGZlclNpemUpOworI2Vsc2UKKyAgICAgICAgICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBSeCBFdmVudCBjYWxsYmFjayovCisgICAgICAgICAgICBIQUxfVUFSVEV4X1J4RXZlbnRDYWxsYmFjayhodWFydCwgaHVhcnQtPlJ4WGZlclNpemUpOworI2VuZGlmIC8qIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTKSAqLworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0gZWxzZSB7CisgICAgICAvKiBETUEgbW9kZSBub3QgZW5hYmxlZCAqLworICAgICAgLyogQ2hlY2sgcmVjZWl2ZWQgbGVuZ3RoIDogSWYgYWxsIGV4cGVjdGVkIGRhdGEgYXJlIHJlY2VpdmVkLCBkbyBub3RoaW5nLgorICAgICAgICAgT3RoZXJ3aXNlLCBpZiBhdCBsZWFzdCBvbmUgZGF0YSBoYXMgYWxyZWFkeSBiZWVuIHJlY2VpdmVkLCBJRExFIGV2ZW50CisgICAgICAgICBpcyB0byBiZSBub3RpZmllZCB0byB1c2VyICovCisgICAgICB1aW50MTZfdCBuYl9yeF9kYXRhID0gaHVhcnQtPlJ4WGZlclNpemUgLSBodWFydC0+UnhYZmVyQ291bnQ7CisgICAgICBpZiAoKGh1YXJ0LT5SeFhmZXJDb3VudCA+IDBVKSAmJiAobmJfcnhfZGF0YSA+IDBVKSkgeworICAgICAgICAvKiBEaXNhYmxlIHRoZSBVQVJUIFBhcml0eSBFcnJvciBJbnRlcnJ1cHQgYW5kIFJYTkUgaW50ZXJydXB0cyAqLworICAgICAgICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLAorICAgICAgICAgICAgICAgICAgICAgICAgIChVU0FSVF9DUjFfUlhORUlFX1JYRk5FSUUgfCBVU0FSVF9DUjFfUEVJRSkpOworCisgICAgICAgIC8qIERpc2FibGUgdGhlIFVBUlQgRXJyb3IgSW50ZXJydXB0OihGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4KKyAgICAgICAgICogZXJyb3IpIGFuZCBSWCBGSUZPIFRocmVzaG9sZCBpbnRlcnJ1cHQgKi8KKyAgICAgICAgQVRPTUlDX0NMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAoVVNBUlRfQ1IzX0VJRSB8IFVTQVJUX0NSM19SWEZUSUUpKTsKKworICAgICAgICAvKiBSeCBwcm9jZXNzIGlzIGNvbXBsZXRlZCwgcmVzdG9yZSBodWFydC0+UnhTdGF0ZSB0byBSZWFkeSAqLworICAgICAgICBodWFydC0+UnhTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworICAgICAgICBodWFydC0+UmVjZXB0aW9uVHlwZSA9IEhBTF9VQVJUX1JFQ0VQVElPTl9TVEFOREFSRDsKKworICAgICAgICAvKiBDbGVhciBSeElTUiBmdW5jdGlvbiBwb2ludGVyICovCisgICAgICAgIGh1YXJ0LT5SeElTUiA9IE5VTEw7CisKKyAgICAgICAgQVRPTUlDX0NMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX0lETEVJRSk7CisKKyAgICAgICAgLyogSW5pdGlhbGl6ZSB0eXBlIG9mIFJ4RXZlbnQgdGhhdCBjb3JyZXNwb25kIHRvIFJ4RXZlbnQgY2FsbGJhY2sKKyAgICAgICAgICAgZXhlY3V0aW9uOyBJbiB0aGlzIGNhc2UsIFJ4IEV2ZW50IHR5cGUgaXMgSWRsZSBFdmVudCAqLworICAgICAgICBodWFydC0+UnhFdmVudFR5cGUgPSBIQUxfVUFSVF9SWEVWRU5UX0lETEU7CisKKyNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBSeCBjb21wbGV0ZSBjYWxsYmFjayovCisgICAgICAgIGh1YXJ0LT5SeEV2ZW50Q2FsbGJhY2soaHVhcnQsIG5iX3J4X2RhdGEpOworI2Vsc2UKKyAgICAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIFJ4IEV2ZW50IGNhbGxiYWNrKi8KKyAgICAgICAgSEFMX1VBUlRFeF9SeEV2ZW50Q2FsbGJhY2soaHVhcnQsIG5iX3J4X2RhdGEpOworI2VuZGlmIC8qIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTKSAqLworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIC8qIFVBUlQgd2FrZXVwIGZyb20gU3RvcCBtb2RlIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9XVUYpICE9IDBVKSAmJgorICAgICAgKChjcjNpdHMgJiBVU0FSVF9DUjNfV1VGSUUpICE9IDBVKSkgeworICAgIF9fSEFMX1VBUlRfQ0xFQVJfRkxBRyhodWFydCwgVUFSVF9DTEVBUl9XVUYpOworCisgICAgLyogVUFSVCBSeCBzdGF0ZSBpcyBub3QgcmVzZXQgYXMgYSByZWNlcHRpb24gcHJvY2VzcyBtaWdodCBiZSBvbmdvaW5nLgorICAgICAgIElmIFVBUlQgaGFuZGxlIHN0YXRlIGZpZWxkcyBuZWVkIHRvIGJlIHJlc2V0IHRvIFJFQURZLCB0aGlzIGNvdWxkIGJlIGRvbmUKKyAgICAgICBpbiBXYWtldXAgY2FsbGJhY2sgKi8KKworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgLyogQ2FsbCByZWdpc3RlcmVkIFdha2V1cCBDYWxsYmFjayAqLworICAgIGh1YXJ0LT5XYWtldXBDYWxsYmFjayhodWFydCk7CisjZWxzZQorICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgV2FrZXVwIENhbGxiYWNrICovCisgICAgSEFMX1VBUlRFeF9XYWtldXBDYWxsYmFjayhodWFydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIHJldHVybjsKKyAgfQorCisgIC8qIFVBUlQgaW4gbW9kZSBUcmFuc21pdHRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9UWEVfVFhGTkYpICE9IDBVKSAmJgorICAgICAgKCgoY3IxaXRzICYgVVNBUlRfQ1IxX1RYRUlFX1RYRk5GSUUpICE9IDBVKSB8fAorICAgICAgICgoY3IzaXRzICYgVVNBUlRfQ1IzX1RYRlRJRSkgIT0gMFUpKSkgeworICAgIGlmIChodWFydC0+VHhJU1IgIT0gTlVMTCkgeworICAgICAgaHVhcnQtPlR4SVNSKGh1YXJ0KTsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisKKyAgLyogVUFSVCBpbiBtb2RlIFRyYW5zbWl0dGVyICh0cmFuc21pc3Npb24gZW5kKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKGlzcmZsYWdzICYgVVNBUlRfSVNSX1RDKSAhPSAwVSkgJiYgKChjcjFpdHMgJiBVU0FSVF9DUjFfVENJRSkgIT0gMFUpKSB7CisgICAgVUFSVF9FbmRUcmFuc21pdF9JVChodWFydCk7CisgICAgcmV0dXJuOworICB9CisKKyAgLyogVUFSVCBUWCBGaWZvIEVtcHR5IG9jY3VycmVkCisgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9UWEZFKSAhPSAwVSkgJiYKKyAgICAgICgoY3IxaXRzICYgVVNBUlRfQ1IxX1RYRkVJRSkgIT0gMFUpKSB7CisjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgVHggRmlmbyBFbXB0eSBDYWxsYmFjayAqLworICAgIGh1YXJ0LT5UeEZpZm9FbXB0eUNhbGxiYWNrKGh1YXJ0KTsKKyNlbHNlCisgICAgLyogQ2FsbCBsZWdhY3kgd2VhayBUeCBGaWZvIEVtcHR5IENhbGxiYWNrICovCisgICAgSEFMX1VBUlRFeF9UeEZpZm9FbXB0eUNhbGxiYWNrKGh1YXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgcmV0dXJuOworICB9CisKKyAgLyogVUFSVCBSWCBGaWZvIEZ1bGwgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKGlzcmZsYWdzICYgVVNBUlRfSVNSX1JYRkYpICE9IDBVKSAmJgorICAgICAgKChjcjFpdHMgJiBVU0FSVF9DUjFfUlhGRklFKSAhPSAwVSkpIHsKKyNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIC8qIENhbGwgcmVnaXN0ZXJlZCBSeCBGaWZvIEZ1bGwgQ2FsbGJhY2sgKi8KKyAgICBodWFydC0+UnhGaWZvRnVsbENhbGxiYWNrKGh1YXJ0KTsKKyNlbHNlCisgICAgLyogQ2FsbCBsZWdhY3kgd2VhayBSeCBGaWZvIEZ1bGwgQ2FsbGJhY2sgKi8KKyAgICBIQUxfVUFSVEV4X1J4Rmlmb0Z1bGxDYWxsYmFjayhodWFydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIHJldHVybjsKKyAgfQorfQorCisvKioKKyAqIEBicmllZiBUeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgKiBAcGFyYW0gaHVhcnQgVUFSVCBoYW5kbGUuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX193ZWFrIHZvaWQgSEFMX1VBUlRfVHhDcGx0Q2FsbGJhY2soVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkgeworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodWFydCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9VQVJUX1R4Q3BsdENhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgKiBAYnJpZWYgIFR4IEhhbGYgVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLgorICogQHBhcmFtICBodWFydCBVQVJUIGhhbmRsZS4KKyAqIEByZXR2YWwgTm9uZQorICovCitfX3dlYWsgdm9pZCBIQUxfVUFSVF9UeEhhbGZDcGx0Q2FsbGJhY2soVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkgeworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodWFydCk7CisKKyAgLyogTk9URTogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgIHRoZSBIQUxfVUFSVF9UeEhhbGZDcGx0Q2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLworfQorCisvKioKKyAqIEBicmllZiAgUnggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLgorICogQHBhcmFtICBodWFydCBVQVJUIGhhbmRsZS4KKyAqIEByZXR2YWwgTm9uZQorICovCitfX3dlYWsgdm9pZCBIQUxfVUFSVF9SeENwbHRDYWxsYmFjayhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KSB7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh1YXJ0KTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1VBUlRfUnhDcGx0Q2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLworfQorCisvKioKKyAqIEBicmllZiAgUnggSGFsZiBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgKiBAcGFyYW0gIGh1YXJ0IFVBUlQgaGFuZGxlLgorICogQHJldHZhbCBOb25lCisgKi8KK19fd2VhayB2b2lkIEhBTF9VQVJUX1J4SGFsZkNwbHRDYWxsYmFjayhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KSB7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh1YXJ0KTsKKworICAvKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgdGhlIEhBTF9VQVJUX1J4SGFsZkNwbHRDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKy8qKgorICogQGJyaWVmICBVQVJUIGVycm9yIGNhbGxiYWNrLgorICogQHBhcmFtICBodWFydCBVQVJUIGhhbmRsZS4KKyAqIEByZXR2YWwgTm9uZQorICovCitfX3dlYWsgdm9pZCBIQUxfVUFSVF9FcnJvckNhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpIHsKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHVhcnQpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVUFSVF9FcnJvckNhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgKiBAYnJpZWYgIFVBUlQgQWJvcnQgQ29tcGxldGUgY2FsbGJhY2suCisgKiBAcGFyYW0gIGh1YXJ0IFVBUlQgaGFuZGxlLgorICogQHJldHZhbCBOb25lCisgKi8KK19fd2VhayB2b2lkIEhBTF9VQVJUX0Fib3J0Q3BsdENhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpIHsKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHVhcnQpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVUFSVF9BYm9ydENwbHRDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKy8qKgorICogQGJyaWVmICBVQVJUIEFib3J0IENvbXBsZXRlIGNhbGxiYWNrLgorICogQHBhcmFtICBodWFydCBVQVJUIGhhbmRsZS4KKyAqIEByZXR2YWwgTm9uZQorICovCitfX3dlYWsgdm9pZCBIQUxfVUFSVF9BYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpIHsKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHVhcnQpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVUFSVF9BYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUKKyAgICAgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgKiBAYnJpZWYgIFVBUlQgQWJvcnQgUmVjZWl2ZSBDb21wbGV0ZSBjYWxsYmFjay4KKyAqIEBwYXJhbSAgaHVhcnQgVUFSVCBoYW5kbGUuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworX193ZWFrIHZvaWQgSEFMX1VBUlRfQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpIHsKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHVhcnQpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVUFSVF9BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyCisgICAgIGZpbGUuCisgICAqLworfQorCisvKioKKyAqIEBicmllZiAgUmVjZXB0aW9uIEV2ZW50IENhbGxiYWNrIChSeCBldmVudCBub3RpZmljYXRpb24gY2FsbGVkIGFmdGVyIHVzZSBvZgorICogYWR2YW5jZWQgcmVjZXB0aW9uIHNlcnZpY2UpLgorICogQHBhcmFtICBodWFydCBVQVJUIGhhbmRsZQorICogQHBhcmFtICBTaXplICBOdW1iZXIgb2YgZGF0YSBhdmFpbGFibGUgaW4gYXBwbGljYXRpb24gcmVjZXB0aW9uIGJ1ZmZlcgorICogKGluZGljYXRlcyBhIHBvc2l0aW9uIGluIHJlY2VwdGlvbiBidWZmZXIgdW50aWwgd2hpY2gsIGRhdGEgYXJlIGF2YWlsYWJsZSkKKyAqIEByZXR2YWwgTm9uZQorICovCitfX3dlYWsgdm9pZCBIQUxfVUFSVEV4X1J4RXZlbnRDYWxsYmFjayhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgU2l6ZSkgeworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodWFydCk7CisgIFVOVVNFRChTaXplKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1VBUlRFeF9SeEV2ZW50Q2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLworfQorCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqICBAYnJpZWYgICBVQVJUIGNvbnRyb2wgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGNvbnRyb2wgdGhlIFVBUlQuCisgICAgICgrKSBIQUxfVUFSVF9SZWNlaXZlclRpbWVvdXRfQ29uZmlnKCkgQVBJIGFsbG93cyB0byBjb25maWd1cmUgdGhlIHJlY2VpdmVyCit0aW1lb3V0IHZhbHVlIG9uIHRoZSBmbHkKKyAgICAgKCspIEhBTF9VQVJUX0VuYWJsZVJlY2VpdmVyVGltZW91dCgpIEFQSSBlbmFibGVzIHRoZSByZWNlaXZlciB0aW1lb3V0CitmZWF0dXJlCisgICAgICgrKSBIQUxfVUFSVF9EaXNhYmxlUmVjZWl2ZXJUaW1lb3V0KCkgQVBJIGRpc2FibGVzIHRoZSByZWNlaXZlciB0aW1lb3V0CitmZWF0dXJlCisgICAgICgrKSBIQUxfTXVsdGlQcm9jZXNzb3JfRW5hYmxlTXV0ZU1vZGUoKSBBUEkgZW5hYmxlcyBtdXRlIG1vZGUKKyAgICAgKCspIEhBTF9NdWx0aVByb2Nlc3Nvcl9EaXNhYmxlTXV0ZU1vZGUoKSBBUEkgZGlzYWJsZXMgbXV0ZSBtb2RlCisgICAgICgrKSBIQUxfTXVsdGlQcm9jZXNzb3JfRW50ZXJNdXRlTW9kZSgpIEFQSSBlbnRlcnMgbXV0ZSBtb2RlCisgICAgICgrKSBVQVJUX1NldENvbmZpZygpIEFQSSBjb25maWd1cmVzIHRoZSBVQVJUIHBlcmlwaGVyYWwKKyAgICAgKCspIFVBUlRfQWR2RmVhdHVyZUNvbmZpZygpIEFQSSBvcHRpb25hbGx5IGNvbmZpZ3VyZXMgdGhlIFVBUlQgYWR2YW5jZWQKK2ZlYXR1cmVzCisgICAgICgrKSBVQVJUX0NoZWNrSWRsZVN0YXRlKCkgQVBJIGVuc3VyZXMgdGhhdCBURUFDSyBhbmQvb3IgUkVBQ0sgYXJlIHNldCBhZnRlcgoraW5pdGlhbGl6YXRpb24KKyAgICAgKCspIEhBTF9IYWxmRHVwbGV4X0VuYWJsZVRyYW5zbWl0dGVyKCkgQVBJIGRpc2FibGVzIHJlY2VpdmVyIGFuZCBlbmFibGVzCit0cmFuc21pdHRlcgorICAgICAoKykgSEFMX0hhbGZEdXBsZXhfRW5hYmxlUmVjZWl2ZXIoKSBBUEkgZGlzYWJsZXMgdHJhbnNtaXR0ZXIgYW5kIGVuYWJsZXMKK3JlY2VpdmVyCisgICAgICgrKSBIQUxfTElOX1NlbmRCcmVhaygpIEFQSSB0cmFuc21pdHMgdGhlIGJyZWFrIGNoYXJhY3RlcnMKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICogQGJyaWVmICBVcGRhdGUgb24gdGhlIGZseSB0aGUgcmVjZWl2ZXIgdGltZW91dCB2YWx1ZSBpbiBSVE9SIHJlZ2lzdGVyLgorICogQHBhcmFtICBodWFydCBQb2ludGVyIHRvIGEgVUFSVF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVUFSVAorICogbW9kdWxlLgorICogQHBhcmFtICBUaW1lb3V0VmFsdWUgcmVjZWl2ZXIgdGltZW91dCB2YWx1ZSBpbiBudW1iZXIgb2YgYmF1ZCBibG9ja3MuIFRoZQorICogdGltZW91dCB2YWx1ZSBtdXN0IGJlIGxlc3Mgb3IgZXF1YWwgdG8gMHgwRkZGRkZGRkYuCisgKiBAcmV0dmFsIE5vbmUKKyAqLwordm9pZCBIQUxfVUFSVF9SZWNlaXZlclRpbWVvdXRfQ29uZmlnKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZW91dFZhbHVlKSB7CisgIGlmICghKElTX0xQVUFSVF9JTlNUQU5DRShodWFydC0+SW5zdGFuY2UpKSkgeworICAgIGFzc2VydF9wYXJhbShJU19VQVJUX1JFQ0VJVkVSX1RJTUVPVVRfVkFMVUUoVGltZW91dFZhbHVlKSk7CisgICAgTU9ESUZZX1JFRyhodWFydC0+SW5zdGFuY2UtPlJUT1IsIFVTQVJUX1JUT1JfUlRPLCBUaW1lb3V0VmFsdWUpOworICB9Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgdGhlIFVBUlQgcmVjZWl2ZXIgdGltZW91dCBmZWF0dXJlLgorICogQHBhcmFtICBodWFydCBQb2ludGVyIHRvIGEgVUFSVF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVUFSVAorICogbW9kdWxlLgorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0VuYWJsZVJlY2VpdmVyVGltZW91dChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KSB7CisgIGlmICghKElTX0xQVUFSVF9JTlNUQU5DRShodWFydC0+SW5zdGFuY2UpKSkgeworICAgIGlmIChodWFydC0+Z1N0YXRlID09IEhBTF9VQVJUX1NUQVRFX1JFQURZKSB7CisgICAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgICAgX19IQUxfTE9DSyhodWFydCk7CisKKyAgICAgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9CVVNZOworCisgICAgICAvKiBTZXQgdGhlIFVTQVJUIFJUT0VOIGJpdCAqLworICAgICAgU0VUX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX1JUT0VOKTsKKworICAgICAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaHVhcnQpOworCisgICAgICByZXR1cm4gSEFMX09LOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gSEFMX0JVU1k7CisgICAgfQorICB9IGVsc2UgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KK30KKworLyoqCisgKiBAYnJpZWYgIERpc2FibGUgdGhlIFVBUlQgcmVjZWl2ZXIgdGltZW91dCBmZWF0dXJlLgorICogQHBhcmFtICBodWFydCBQb2ludGVyIHRvIGEgVUFSVF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVUFSVAorICogbW9kdWxlLgorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0Rpc2FibGVSZWNlaXZlclRpbWVvdXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkgeworICBpZiAoIShJU19MUFVBUlRfSU5TVEFOQ0UoaHVhcnQtPkluc3RhbmNlKSkpIHsKKyAgICBpZiAoaHVhcnQtPmdTdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9SRUFEWSkgeworICAgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICAgIF9fSEFMX0xPQ0soaHVhcnQpOworCisgICAgICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWTsKKworICAgICAgLyogQ2xlYXIgdGhlIFVTQVJUIFJUT0VOIGJpdCAqLworICAgICAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IyLCBVU0FSVF9DUjJfUlRPRU4pOworCisgICAgICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhodWFydCk7CisKKyAgICAgIHJldHVybiBIQUxfT0s7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBIQUxfQlVTWTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorfQorCisvKioKKyAqIEBicmllZiAgRW5hYmxlIFVBUlQgaW4gbXV0ZSBtb2RlIChkb2VzIG5vdCBtZWFuIFVBUlQgZW50ZXJzIG11dGUgbW9kZTsKKyAqICAgICAgICAgdG8gZW50ZXIgbXV0ZSBtb2RlLCBIQUxfTXVsdGlQcm9jZXNzb3JfRW50ZXJNdXRlTW9kZSgpIEFQSSBtdXN0IGJlCisgKiBjYWxsZWQpLgorICogQHBhcmFtICBodWFydCBVQVJUIGhhbmRsZS4KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTXVsdGlQcm9jZXNzb3JfRW5hYmxlTXV0ZU1vZGUoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkgeworICBfX0hBTF9MT0NLKGh1YXJ0KTsKKworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWTsKKworICAvKiBFbmFibGUgVVNBUlQgbXV0ZSBtb2RlIGJ5IHNldHRpbmcgdGhlIE1NRSBiaXQgaW4gdGhlIENSMSByZWdpc3RlciAqLworICBBVE9NSUNfU0VUX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX01NRSk7CisKKyAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworCisgIHJldHVybiAoVUFSVF9DaGVja0lkbGVTdGF0ZShodWFydCkpOworfQorCisvKioKKyAqIEBicmllZiAgRGlzYWJsZSBVQVJUIG11dGUgbW9kZSAoZG9lcyBub3QgbWVhbiB0aGUgVUFSVCBhY3R1YWxseSBleGl0cyBtdXRlCisgKiBtb2RlIGFzIGl0IG1heSBub3QgaGF2ZSBiZWVuIGluIG11dGUgbW9kZSBhdCB0aGlzIHZlcnkgbW9tZW50KS4KKyAqIEBwYXJhbSAgaHVhcnQgVUFSVCBoYW5kbGUuCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX011bHRpUHJvY2Vzc29yX0Rpc2FibGVNdXRlTW9kZSgKKyAgICBVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KSB7CisgIF9fSEFMX0xPQ0soaHVhcnQpOworCisgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgVVNBUlQgbXV0ZSBtb2RlIGJ5IGNsZWFyaW5nIHRoZSBNTUUgYml0IGluIHRoZSBDUjEgcmVnaXN0ZXIgKi8KKyAgQVRPTUlDX0NMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX01NRSk7CisKKyAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworCisgIHJldHVybiAoVUFSVF9DaGVja0lkbGVTdGF0ZShodWFydCkpOworfQorCisvKioKKyAqIEBicmllZiBFbnRlciBVQVJUIG11dGUgbW9kZSAobWVhbnMgVUFSVCBhY3R1YWxseSBlbnRlcnMgbXV0ZSBtb2RlKS4KKyAqIEBub3RlICBUbyBleGl0IGZyb20gbXV0ZSBtb2RlLCBIQUxfTXVsdGlQcm9jZXNzb3JfRGlzYWJsZU11dGVNb2RlKCkgQVBJIG11c3QKKyAqIGJlIGNhbGxlZC4KKyAqIEBwYXJhbSBodWFydCBVQVJUIGhhbmRsZS4KKyAqIEByZXR2YWwgTm9uZQorICovCit2b2lkIEhBTF9NdWx0aVByb2Nlc3Nvcl9FbnRlck11dGVNb2RlKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpIHsKKyAgX19IQUxfVUFSVF9TRU5EX1JFUShodWFydCwgVUFSVF9NVVRFX01PREVfUkVRVUVTVCk7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgdGhlIFVBUlQgdHJhbnNtaXR0ZXIgYW5kIGRpc2FibGUgdGhlIFVBUlQgcmVjZWl2ZXIuCisgKiBAcGFyYW0gIGh1YXJ0IFVBUlQgaGFuZGxlLgorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IYWxmRHVwbGV4X0VuYWJsZVRyYW5zbWl0dGVyKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpIHsKKyAgX19IQUxfTE9DSyhodWFydCk7CisgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9CVVNZOworCisgIC8qIENsZWFyIFRFIGFuZCBSRSBiaXRzICovCisgIEFUT01JQ19DTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfVEUgfCBVU0FSVF9DUjFfUkUpKTsKKworICAvKiBFbmFibGUgdGhlIFVTQVJUJ3MgdHJhbnNtaXQgaW50ZXJmYWNlIGJ5IHNldHRpbmcgdGhlIFRFIGJpdCBpbiB0aGUgVVNBUlQKKyAgICogQ1IxIHJlZ2lzdGVyICovCisgIEFUT01JQ19TRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVEUpOworCisgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKworICBfX0hBTF9VTkxPQ0soaHVhcnQpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICogQGJyaWVmICBFbmFibGUgdGhlIFVBUlQgcmVjZWl2ZXIgYW5kIGRpc2FibGUgdGhlIFVBUlQgdHJhbnNtaXR0ZXIuCisgKiBAcGFyYW0gIGh1YXJ0IFVBUlQgaGFuZGxlLgorICogQHJldHZhbCBIQUwgc3RhdHVzLgorICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSGFsZkR1cGxleF9FbmFibGVSZWNlaXZlcihVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KSB7CisgIF9fSEFMX0xPQ0soaHVhcnQpOworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWTsKKworICAvKiBDbGVhciBURSBhbmQgUkUgYml0cyAqLworICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCAoVVNBUlRfQ1IxX1RFIHwgVVNBUlRfQ1IxX1JFKSk7CisKKyAgLyogRW5hYmxlIHRoZSBVU0FSVCdzIHJlY2VpdmUgaW50ZXJmYWNlIGJ5IHNldHRpbmcgdGhlIFJFIGJpdCBpbiB0aGUgVVNBUlQgQ1IxCisgICAqIHJlZ2lzdGVyICovCisgIEFUT01JQ19TRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUkUpOworCisgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKworICBfX0hBTF9VTkxPQ0soaHVhcnQpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICogQGJyaWVmICBUcmFuc21pdCBicmVhayBjaGFyYWN0ZXJzLgorICogQHBhcmFtICBodWFydCBVQVJUIGhhbmRsZS4KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTElOX1NlbmRCcmVhayhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KSB7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19VQVJUX0xJTl9JTlNUQU5DRShodWFydC0+SW5zdGFuY2UpKTsKKworICBfX0hBTF9MT0NLKGh1YXJ0KTsKKworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWTsKKworICAvKiBTZW5kIGJyZWFrIGNoYXJhY3RlcnMgKi8KKyAgX19IQUxfVUFSVF9TRU5EX1JFUShodWFydCwgVUFSVF9TRU5EQlJFQUtfUkVRVUVTVCk7CisKKyAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworCisgIF9fSEFMX1VOTE9DSyhodWFydCk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA0IFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9yCitmdW5jdGlvbnMKKyAgKiAgQGJyaWVmICAgVUFSVCBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvciBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gOgorICAgICAgKCspIFJldHVybiB0aGUgVUFSVCBoYW5kbGUgc3RhdGUuCisgICAgICAoKykgUmV0dXJuIHRoZSBVQVJUIGhhbmRsZSBlcnJvciBjb2RlCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICogQGJyaWVmIFJldHVybiB0aGUgVUFSVCBoYW5kbGUgc3RhdGUuCisgKiBAcGFyYW0gIGh1YXJ0IFBvaW50ZXIgdG8gYSBVQVJUX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVUFSVC4KKyAqIEByZXR2YWwgSEFMIHN0YXRlCisgKi8KK0hBTF9VQVJUX1N0YXRlVHlwZURlZiBIQUxfVUFSVF9HZXRTdGF0ZShjb25zdCBVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KSB7CisgIHVpbnQzMl90IHRlbXAxOworICB1aW50MzJfdCB0ZW1wMjsKKyAgdGVtcDEgPSBodWFydC0+Z1N0YXRlOworICB0ZW1wMiA9IGh1YXJ0LT5SeFN0YXRlOworCisgIHJldHVybiAoSEFMX1VBUlRfU3RhdGVUeXBlRGVmKSh0ZW1wMSB8IHRlbXAyKTsKK30KKworLyoqCisgKiBAYnJpZWYgIFJldHVybiB0aGUgVUFSVCBoYW5kbGUgZXJyb3IgY29kZS4KKyAqIEBwYXJhbSAgaHVhcnQgUG9pbnRlciB0byBhIFVBUlRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBVQVJULgorICogQHJldHZhbCBVQVJUIEVycm9yIENvZGUKKyAqLwordWludDMyX3QgSEFMX1VBUlRfR2V0RXJyb3IoY29uc3QgVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkgeworICByZXR1cm4gaHVhcnQtPkVycm9yQ29kZTsKK30KKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX1ByaXZhdGVfRnVuY3Rpb25zIFVBUlQgUHJpdmF0ZSBGdW5jdGlvbnMKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIGNhbGxiYWNrcyB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAqIEBwYXJhbSAgaHVhcnQgVUFSVCBoYW5kbGUuCisgKiBAcmV0dmFsIG5vbmUKKyAqLworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCit2b2lkIFVBUlRfSW5pdENhbGxiYWNrc1RvRGVmYXVsdChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KSB7CisgIC8qIEluaXQgdGhlIFVBUlQgQ2FsbGJhY2sgc2V0dGluZ3MgKi8KKyAgaHVhcnQtPlR4SGFsZkNwbHRDYWxsYmFjayA9CisgICAgICBIQUxfVUFSVF9UeEhhbGZDcGx0Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIFR4SGFsZkNwbHRDYWxsYmFjayAgICAgICAgKi8KKyAgaHVhcnQtPlR4Q3BsdENhbGxiYWNrID0KKyAgICAgIEhBTF9VQVJUX1R4Q3BsdENhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBUeENwbHRDYWxsYmFjayAgICAgICAgICAgICovCisgIGh1YXJ0LT5SeEhhbGZDcGx0Q2FsbGJhY2sgPQorICAgICAgSEFMX1VBUlRfUnhIYWxmQ3BsdENhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBSeEhhbGZDcGx0Q2FsbGJhY2sgICAgICAgICovCisgIGh1YXJ0LT5SeENwbHRDYWxsYmFjayA9CisgICAgICBIQUxfVUFSVF9SeENwbHRDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgUnhDcGx0Q2FsbGJhY2sgICAgICAgICAgICAqLworICBodWFydC0+RXJyb3JDYWxsYmFjayA9IEhBTF9VQVJUX0Vycm9yQ2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIEVycm9yQ2FsbGJhY2sgKi8KKyAgaHVhcnQtPkFib3J0Q3BsdENhbGxiYWNrID0KKyAgICAgIEhBTF9VQVJUX0Fib3J0Q3BsdENhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBBYm9ydENwbHRDYWxsYmFjayAgICAgICAgICovCisgIGh1YXJ0LT5BYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrID0KKyAgICAgIEhBTF9VQVJUX0Fib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrICovCisgIGh1YXJ0LT5BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2sgPQorICAgICAgSEFMX1VBUlRfQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBBYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIGh1YXJ0LT5XYWtldXBDYWxsYmFjayA9CisgICAgICBIQUxfVUFSVEV4X1dha2V1cENhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBXYWtldXBDYWxsYmFjayAgICAgICAgICAgICovCisgIGh1YXJ0LT5SeEZpZm9GdWxsQ2FsbGJhY2sgPQorICAgICAgSEFMX1VBUlRFeF9SeEZpZm9GdWxsQ2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIFJ4Rmlmb0Z1bGxDYWxsYmFjayAgICAgICAgKi8KKyAgaHVhcnQtPlR4Rmlmb0VtcHR5Q2FsbGJhY2sgPQorICAgICAgSEFMX1VBUlRFeF9UeEZpZm9FbXB0eUNhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBUeEZpZm9FbXB0eUNhbGxiYWNrICovCisgIGh1YXJ0LT5SeEV2ZW50Q2FsbGJhY2sgPQorICAgICAgSEFMX1VBUlRFeF9SeEV2ZW50Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIFJ4RXZlbnRDYWxsYmFjayAgICAgICAgICAgKi8KK30KKyNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qKgorICogQGJyaWVmIENvbmZpZ3VyZSB0aGUgVUFSVCBwZXJpcGhlcmFsLgorICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIFVBUlRfU2V0Q29uZmlnKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpIHsKKyAgdWludDMyX3QgdG1wcmVnOworICB1aW50MTZfdCBicnJ0ZW1wOworICBVQVJUX0Nsb2NrU291cmNlVHlwZURlZiBjbG9ja3NvdXJjZTsKKyAgdWludDMyX3QgdXNhcnRkaXY7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHJldCA9IEhBTF9PSzsKKyAgdWludDMyX3QgbHB1YXJ0X2tlcl9ja19wcmVzOworICB1aW50MzJfdCBwY2xrOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19VQVJUX0JBVURSQVRFKGh1YXJ0LT5Jbml0LkJhdWRSYXRlKSk7CisgIGFzc2VydF9wYXJhbShJU19VQVJUX1dPUkRfTEVOR1RIKGh1YXJ0LT5Jbml0LldvcmRMZW5ndGgpKTsKKyAgaWYgKFVBUlRfSU5TVEFOQ0VfTE9XUE9XRVIoaHVhcnQpKSB7CisgICAgYXNzZXJ0X3BhcmFtKElTX0xQVUFSVF9TVE9QQklUUyhodWFydC0+SW5pdC5TdG9wQml0cykpOworICB9IGVsc2UgeworICAgIGFzc2VydF9wYXJhbShJU19VQVJUX1NUT1BCSVRTKGh1YXJ0LT5Jbml0LlN0b3BCaXRzKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfT05FX0JJVF9TQU1QTEUoaHVhcnQtPkluaXQuT25lQml0U2FtcGxpbmcpKTsKKyAgfQorCisgIGFzc2VydF9wYXJhbShJU19VQVJUX1BBUklUWShodWFydC0+SW5pdC5QYXJpdHkpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfTU9ERShodWFydC0+SW5pdC5Nb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19VQVJUX0hBUkRXQVJFX0ZMT1dfQ09OVFJPTChodWFydC0+SW5pdC5Id0Zsb3dDdGwpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfT1ZFUlNBTVBMSU5HKGh1YXJ0LT5Jbml0Lk92ZXJTYW1wbGluZykpOworICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9QUkVTQ0FMRVIoaHVhcnQtPkluaXQuQ2xvY2tQcmVzY2FsZXIpKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQVJUIENSMSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgLyogQ2xlYXIgTSwgUENFLCBQUywgVEUsIFJFIGFuZCBPVkVSOCBiaXRzIGFuZCBjb25maWd1cmUKKyAgICogIHRoZSBVQVJUIFdvcmQgTGVuZ3RoLCBQYXJpdHksIE1vZGUgYW5kIG92ZXJzYW1wbGluZzoKKyAgICogIHNldCB0aGUgTSBiaXRzIGFjY29yZGluZyB0byBodWFydC0+SW5pdC5Xb3JkTGVuZ3RoIHZhbHVlCisgICAqICBzZXQgUENFIGFuZCBQUyBiaXRzIGFjY29yZGluZyB0byBodWFydC0+SW5pdC5QYXJpdHkgdmFsdWUKKyAgICogIHNldCBURSBhbmQgUkUgYml0cyBhY2NvcmRpbmcgdG8gaHVhcnQtPkluaXQuTW9kZSB2YWx1ZQorICAgKiAgc2V0IE9WRVI4IGJpdCBhY2NvcmRpbmcgdG8gaHVhcnQtPkluaXQuT3ZlclNhbXBsaW5nIHZhbHVlICovCisgIHRtcHJlZyA9ICh1aW50MzJfdClodWFydC0+SW5pdC5Xb3JkTGVuZ3RoIHwgaHVhcnQtPkluaXQuUGFyaXR5IHwKKyAgICAgICAgICAgaHVhcnQtPkluaXQuTW9kZSB8IGh1YXJ0LT5Jbml0Lk92ZXJTYW1wbGluZzsKKyAgTU9ESUZZX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX0ZJRUxEUywgdG1wcmVnKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQVJUIENSMiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgLyogQ29uZmlndXJlIHRoZSBVQVJUIFN0b3AgQml0czogU2V0IFNUT1BbMTM6MTJdIGJpdHMgYWNjb3JkaW5nCisgICAqIHRvIGh1YXJ0LT5Jbml0LlN0b3BCaXRzIHZhbHVlICovCisgIE1PRElGWV9SRUcoaHVhcnQtPkluc3RhbmNlLT5DUjIsIFVTQVJUX0NSMl9TVE9QLCBodWFydC0+SW5pdC5TdG9wQml0cyk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVU0FSVCBDUjMgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIC8qIENvbmZpZ3VyZQorICAgKiAtIFVBUlQgSGFyZFdhcmUgRmxvdyBDb250cm9sOiBzZXQgQ1RTRSBhbmQgUlRTRSBiaXRzIGFjY29yZGluZworICAgKiAgIHRvIGh1YXJ0LT5Jbml0Lkh3Rmxvd0N0bCB2YWx1ZQorICAgKiAtIG9uZS1iaXQgc2FtcGxpbmcgbWV0aG9kIHZlcnN1cyB0aHJlZSBzYW1wbGVzJyBtYWpvcml0eSBydWxlIGFjY29yZGluZworICAgKiAgIHRvIGh1YXJ0LT5Jbml0Lk9uZUJpdFNhbXBsaW5nIChub3QgYXBwbGljYWJsZSB0byBMUFVBUlQpICovCisgIHRtcHJlZyA9ICh1aW50MzJfdClodWFydC0+SW5pdC5Id0Zsb3dDdGw7CisKKyAgaWYgKCEoVUFSVF9JTlNUQU5DRV9MT1dQT1dFUihodWFydCkpKSB7CisgICAgdG1wcmVnIHw9IGh1YXJ0LT5Jbml0Lk9uZUJpdFNhbXBsaW5nOworICB9CisgIE1PRElGWV9SRUcoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19GSUVMRFMsIHRtcHJlZyk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVU0FSVCBQUkVTQyBDb25maWd1cmF0aW9uCisgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgLyogQ29uZmlndXJlCisgICAqIC0gVUFSVCBDbG9jayBQcmVzY2FsZXIgOiBzZXQgUFJFU0NBTEVSIGFjY29yZGluZyB0bworICAgKiBodWFydC0+SW5pdC5DbG9ja1ByZXNjYWxlciB2YWx1ZSAqLworICBNT0RJRllfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+UFJFU0MsIFVTQVJUX1BSRVNDX1BSRVNDQUxFUiwKKyAgICAgICAgICAgICBodWFydC0+SW5pdC5DbG9ja1ByZXNjYWxlcik7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVU0FSVCBCUlIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFVBUlRfR0VUQ0xPQ0tTT1VSQ0UoaHVhcnQsIGNsb2Nrc291cmNlKTsKKworICAvKiBDaGVjayBMUFVBUlQgaW5zdGFuY2UgKi8KKyAgaWYgKFVBUlRfSU5TVEFOQ0VfTE9XUE9XRVIoaHVhcnQpKSB7CisgICAgLyogUmV0cmlldmUgZnJlcXVlbmN5IGNsb2NrICovCisgICAgc3dpdGNoIChjbG9ja3NvdXJjZSkgeworICAgICAgY2FzZSBVQVJUX0NMT0NLU09VUkNFX1BDTEsxOgorICAgICAgICBwY2xrID0gSEFMX1JDQ19HZXRQQ0xLMUZyZXEoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFVBUlRfQ0xPQ0tTT1VSQ0VfSFNJOgorICAgICAgICBwY2xrID0gKHVpbnQzMl90KUhTSV9WQUxVRTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFVBUlRfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOgorICAgICAgICBwY2xrID0gSEFMX1JDQ19HZXRTeXNDbG9ja0ZyZXEoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFVBUlRfQ0xPQ0tTT1VSQ0VfTFNFOgorICAgICAgICBwY2xrID0gKHVpbnQzMl90KUxTRV9WQUxVRTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBwY2xrID0gMFU7CisgICAgICAgIHJldCA9IEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogSWYgcHJvcGVyIGNsb2NrIHNvdXJjZSByZXBvcnRlZCAqLworICAgIGlmIChwY2xrICE9IDBVKSB7CisgICAgICAvKiBDb21wdXRlIGNsb2NrIGFmdGVyIFByZXNjYWxlciAqLworICAgICAgbHB1YXJ0X2tlcl9ja19wcmVzID0gKHBjbGsgLyBVQVJUUHJlc2NUYWJsZVtodWFydC0+SW5pdC5DbG9ja1ByZXNjYWxlcl0pOworCisgICAgICAvKiBFbnN1cmUgdGhhdCBGcmVxdWVuY3kgY2xvY2sgaXMgaW4gdGhlIHJhbmdlIFszICogYmF1ZHJhdGUsIDQwOTYgKgorICAgICAgICogYmF1ZHJhdGVdICovCisgICAgICBpZiAoKGxwdWFydF9rZXJfY2tfcHJlcyA8ICgzVSAqIGh1YXJ0LT5Jbml0LkJhdWRSYXRlKSkgfHwKKyAgICAgICAgICAobHB1YXJ0X2tlcl9ja19wcmVzID4gKDQwOTZVICogaHVhcnQtPkluaXQuQmF1ZFJhdGUpKSkgeworICAgICAgICByZXQgPSBIQUxfRVJST1I7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBDaGVjayBjb21wdXRlZCBVc2FydERpdiB2YWx1ZSBpcyBpbiBhbGxvY2F0ZWQgcmFuZ2UKKyAgICAgICAgICAgKGl0IGlzIGZvcmJpZGRlbiB0byB3cml0ZSB2YWx1ZXMgbG93ZXIgdGhhbiAweDMwMCBpbiB0aGUgTFBVQVJUX0JSUgorICAgICAgICAgICByZWdpc3RlcikgKi8KKyAgICAgICAgdXNhcnRkaXYgPSAodWludDMyX3QpKFVBUlRfRElWX0xQVUFSVChwY2xrLCBodWFydC0+SW5pdC5CYXVkUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodWFydC0+SW5pdC5DbG9ja1ByZXNjYWxlcikpOworICAgICAgICBpZiAoKHVzYXJ0ZGl2ID49IExQVUFSVF9CUlJfTUlOKSAmJiAodXNhcnRkaXYgPD0gTFBVQVJUX0JSUl9NQVgpKSB7CisgICAgICAgICAgaHVhcnQtPkluc3RhbmNlLT5CUlIgPSB1c2FydGRpdjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXQgPSBIQUxfRVJST1I7CisgICAgICAgIH0KKyAgICAgIH0gLyogaWYgKCAobHB1YXJ0X2tlcl9ja19wcmVzIDwgKDMgKiBodWFydC0+SW5pdC5CYXVkUmF0ZSkgKSB8fAorICAgICAgICAgICAgICAgIChscHVhcnRfa2VyX2NrX3ByZXMgPiAoNDA5NiAqIGh1YXJ0LT5Jbml0LkJhdWRSYXRlKSApKSAqLworICAgIH0gICAvKiBpZiAocGNsayAhPSAwKSAqLworICB9CisgIC8qIENoZWNrIFVBUlQgT3ZlciBTYW1wbGluZyB0byBzZXQgQmF1ZCBSYXRlIFJlZ2lzdGVyICovCisgIGVsc2UgaWYgKGh1YXJ0LT5Jbml0Lk92ZXJTYW1wbGluZyA9PSBVQVJUX09WRVJTQU1QTElOR184KSB7CisgICAgc3dpdGNoIChjbG9ja3NvdXJjZSkgeworICAgICAgY2FzZSBVQVJUX0NMT0NLU09VUkNFX1BDTEsxOgorICAgICAgICBwY2xrID0gSEFMX1JDQ19HZXRQQ0xLMUZyZXEoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFVBUlRfQ0xPQ0tTT1VSQ0VfUENMSzI6CisgICAgICAgIHBjbGsgPSBIQUxfUkNDX0dldFBDTEsyRnJlcSgpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVUFSVF9DTE9DS1NPVVJDRV9IU0k6CisgICAgICAgIHBjbGsgPSAodWludDMyX3QpSFNJX1ZBTFVFOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVUFSVF9DTE9DS1NPVVJDRV9TWVNDTEs6CisgICAgICAgIHBjbGsgPSBIQUxfUkNDX0dldFN5c0Nsb2NrRnJlcSgpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVUFSVF9DTE9DS1NPVVJDRV9MU0U6CisgICAgICAgIHBjbGsgPSAodWludDMyX3QpTFNFX1ZBTFVFOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHBjbGsgPSAwVTsKKyAgICAgICAgcmV0ID0gSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBVU0FSVERJViBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAwZDE2ICovCisgICAgaWYgKHBjbGsgIT0gMFUpIHsKKyAgICAgIHVzYXJ0ZGl2ID0gKHVpbnQzMl90KShVQVJUX0RJVl9TQU1QTElORzgocGNsaywgaHVhcnQtPkluaXQuQmF1ZFJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh1YXJ0LT5Jbml0LkNsb2NrUHJlc2NhbGVyKSk7CisgICAgICBpZiAoKHVzYXJ0ZGl2ID49IFVBUlRfQlJSX01JTikgJiYgKHVzYXJ0ZGl2IDw9IFVBUlRfQlJSX01BWCkpIHsKKyAgICAgICAgYnJydGVtcCA9ICh1aW50MTZfdCkodXNhcnRkaXYgJiAweEZGRjBVKTsKKyAgICAgICAgYnJydGVtcCB8PSAodWludDE2X3QpKCh1c2FydGRpdiAmICh1aW50MTZfdCkweDAwMEZVKSA+PiAxVSk7CisgICAgICAgIGh1YXJ0LT5JbnN0YW5jZS0+QlJSID0gYnJydGVtcDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldCA9IEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgc3dpdGNoIChjbG9ja3NvdXJjZSkgeworICAgICAgY2FzZSBVQVJUX0NMT0NLU09VUkNFX1BDTEsxOgorICAgICAgICBwY2xrID0gSEFMX1JDQ19HZXRQQ0xLMUZyZXEoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFVBUlRfQ0xPQ0tTT1VSQ0VfUENMSzI6CisgICAgICAgIHBjbGsgPSBIQUxfUkNDX0dldFBDTEsyRnJlcSgpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVUFSVF9DTE9DS1NPVVJDRV9IU0k6CisgICAgICAgIHBjbGsgPSAodWludDMyX3QpSFNJX1ZBTFVFOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVUFSVF9DTE9DS1NPVVJDRV9TWVNDTEs6CisgICAgICAgIHBjbGsgPSBIQUxfUkNDX0dldFN5c0Nsb2NrRnJlcSgpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVUFSVF9DTE9DS1NPVVJDRV9MU0U6CisgICAgICAgIHBjbGsgPSAodWludDMyX3QpTFNFX1ZBTFVFOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHBjbGsgPSAwVTsKKyAgICAgICAgcmV0ID0gSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAocGNsayAhPSAwVSkgeworICAgICAgLyogVVNBUlRESVYgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMGQxNiAqLworICAgICAgdXNhcnRkaXYgPSAodWludDMyX3QpKFVBUlRfRElWX1NBTVBMSU5HMTYocGNsaywgaHVhcnQtPkluaXQuQmF1ZFJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodWFydC0+SW5pdC5DbG9ja1ByZXNjYWxlcikpOworICAgICAgaWYgKCh1c2FydGRpdiA+PSBVQVJUX0JSUl9NSU4pICYmICh1c2FydGRpdiA8PSBVQVJUX0JSUl9NQVgpKSB7CisgICAgICAgIGh1YXJ0LT5JbnN0YW5jZS0+QlJSID0gKHVpbnQxNl90KXVzYXJ0ZGl2OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ID0gSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIEluaXRpYWxpemUgdGhlIG51bWJlciBvZiBkYXRhIHRvIHByb2Nlc3MgZHVyaW5nIFJYL1RYIElTUiBleGVjdXRpb24gKi8KKyAgaHVhcnQtPk5iVHhEYXRhVG9Qcm9jZXNzID0gMTsKKyAgaHVhcnQtPk5iUnhEYXRhVG9Qcm9jZXNzID0gMTsKKworICAvKiBDbGVhciBJU1IgZnVuY3Rpb24gcG9pbnRlcnMgKi8KKyAgaHVhcnQtPlJ4SVNSID0gTlVMTDsKKyAgaHVhcnQtPlR4SVNSID0gTlVMTDsKKworICByZXR1cm4gcmV0OworfQorCisvKioKKyAqIEBicmllZiBDb25maWd1cmUgdGhlIFVBUlQgcGVyaXBoZXJhbCBhZHZhbmNlZCBmZWF0dXJlcy4KKyAqIEBwYXJhbSBodWFydCBVQVJUIGhhbmRsZS4KKyAqIEByZXR2YWwgTm9uZQorICovCit2b2lkIFVBUlRfQWR2RmVhdHVyZUNvbmZpZyhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KSB7CisgIC8qIENoZWNrIHdoZXRoZXIgdGhlIHNldCBvZiBhZHZhbmNlZCBmZWF0dXJlcyB0byBjb25maWd1cmUgaXMgcHJvcGVybHkgc2V0ICovCisgIGFzc2VydF9wYXJhbShJU19VQVJUX0FEVkZFQVRVUkVfSU5JVChodWFydC0+QWR2YW5jZWRJbml0LkFkdkZlYXR1cmVJbml0KSk7CisKKyAgLyogaWYgcmVxdWlyZWQsIGNvbmZpZ3VyZSBSWC9UWCBwaW5zIHN3YXAgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5BZHZhbmNlZEluaXQuQWR2RmVhdHVyZUluaXQsCisgICAgICAgICAgICAgICAgICAgICBVQVJUX0FEVkZFQVRVUkVfU1dBUF9JTklUKSkgeworICAgIGFzc2VydF9wYXJhbShJU19VQVJUX0FEVkZFQVRVUkVfU1dBUChodWFydC0+QWR2YW5jZWRJbml0LlN3YXApKTsKKyAgICBNT0RJRllfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IyLCBVU0FSVF9DUjJfU1dBUCwgaHVhcnQtPkFkdmFuY2VkSW5pdC5Td2FwKTsKKyAgfQorCisgIC8qIGlmIHJlcXVpcmVkLCBjb25maWd1cmUgVFggcGluIGFjdGl2ZSBsZXZlbCBpbnZlcnNpb24gKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5BZHZhbmNlZEluaXQuQWR2RmVhdHVyZUluaXQsCisgICAgICAgICAgICAgICAgICAgICBVQVJUX0FEVkZFQVRVUkVfVFhJTlZFUlRfSU5JVCkpIHsKKyAgICBhc3NlcnRfcGFyYW0oCisgICAgICAgIElTX1VBUlRfQURWRkVBVFVSRV9UWElOVihodWFydC0+QWR2YW5jZWRJbml0LlR4UGluTGV2ZWxJbnZlcnQpKTsKKyAgICBNT0RJRllfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IyLCBVU0FSVF9DUjJfVFhJTlYsCisgICAgICAgICAgICAgICBodWFydC0+QWR2YW5jZWRJbml0LlR4UGluTGV2ZWxJbnZlcnQpOworICB9CisKKyAgLyogaWYgcmVxdWlyZWQsIGNvbmZpZ3VyZSBSWCBwaW4gYWN0aXZlIGxldmVsIGludmVyc2lvbiAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHVhcnQtPkFkdmFuY2VkSW5pdC5BZHZGZWF0dXJlSW5pdCwKKyAgICAgICAgICAgICAgICAgICAgIFVBUlRfQURWRkVBVFVSRV9SWElOVkVSVF9JTklUKSkgeworICAgIGFzc2VydF9wYXJhbSgKKyAgICAgICAgSVNfVUFSVF9BRFZGRUFUVVJFX1JYSU5WKGh1YXJ0LT5BZHZhbmNlZEluaXQuUnhQaW5MZXZlbEludmVydCkpOworICAgIE1PRElGWV9SRUcoaHVhcnQtPkluc3RhbmNlLT5DUjIsIFVTQVJUX0NSMl9SWElOViwKKyAgICAgICAgICAgICAgIGh1YXJ0LT5BZHZhbmNlZEluaXQuUnhQaW5MZXZlbEludmVydCk7CisgIH0KKworICAvKiBpZiByZXF1aXJlZCwgY29uZmlndXJlIGRhdGEgaW52ZXJzaW9uICovCisgIGlmIChIQUxfSVNfQklUX1NFVChodWFydC0+QWR2YW5jZWRJbml0LkFkdkZlYXR1cmVJbml0LAorICAgICAgICAgICAgICAgICAgICAgVUFSVF9BRFZGRUFUVVJFX0RBVEFJTlZFUlRfSU5JVCkpIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9BRFZGRUFUVVJFX0RBVEFJTlYoaHVhcnQtPkFkdmFuY2VkSW5pdC5EYXRhSW52ZXJ0KSk7CisgICAgTU9ESUZZX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX0RBVEFJTlYsCisgICAgICAgICAgICAgICBodWFydC0+QWR2YW5jZWRJbml0LkRhdGFJbnZlcnQpOworICB9CisKKyAgLyogaWYgcmVxdWlyZWQsIGNvbmZpZ3VyZSBSWCBvdmVycnVuIGRldGVjdGlvbiBkaXNhYmxpbmcgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5BZHZhbmNlZEluaXQuQWR2RmVhdHVyZUluaXQsCisgICAgICAgICAgICAgICAgICAgICBVQVJUX0FEVkZFQVRVUkVfUlhPVkVSUlVORElTQUJMRV9JTklUKSkgeworICAgIGFzc2VydF9wYXJhbShJU19VQVJUX09WRVJSVU4oaHVhcnQtPkFkdmFuY2VkSW5pdC5PdmVycnVuRGlzYWJsZSkpOworICAgIE1PRElGWV9SRUcoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19PVlJESVMsCisgICAgICAgICAgICAgICBodWFydC0+QWR2YW5jZWRJbml0Lk92ZXJydW5EaXNhYmxlKTsKKyAgfQorCisgIC8qIGlmIHJlcXVpcmVkLCBjb25maWd1cmUgRE1BIGRpc2FibGluZyBvbiByZWNlcHRpb24gZXJyb3IgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5BZHZhbmNlZEluaXQuQWR2RmVhdHVyZUluaXQsCisgICAgICAgICAgICAgICAgICAgICBVQVJUX0FEVkZFQVRVUkVfRE1BRElTQUJMRU9ORVJST1JfSU5JVCkpIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9BRFZGRUFUVVJFX0RNQU9OUlhFUlJPUigKKyAgICAgICAgaHVhcnQtPkFkdmFuY2VkSW5pdC5ETUFEaXNhYmxlb25SeEVycm9yKSk7CisgICAgTU9ESUZZX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0REUkUsCisgICAgICAgICAgICAgICBodWFydC0+QWR2YW5jZWRJbml0LkRNQURpc2FibGVvblJ4RXJyb3IpOworICB9CisKKyAgLyogaWYgcmVxdWlyZWQsIGNvbmZpZ3VyZSBhdXRvIEJhdWQgcmF0ZSBkZXRlY3Rpb24gc2NoZW1lICovCisgIGlmIChIQUxfSVNfQklUX1NFVChodWFydC0+QWR2YW5jZWRJbml0LkFkdkZlYXR1cmVJbml0LAorICAgICAgICAgICAgICAgICAgICAgVUFSVF9BRFZGRUFUVVJFX0FVVE9CQVVEUkFURV9JTklUKSkgeworICAgIGFzc2VydF9wYXJhbShJU19VU0FSVF9BVVRPQkFVRFJBVEVfREVURUNUSU9OX0lOU1RBTkNFKGh1YXJ0LT5JbnN0YW5jZSkpOworICAgIGFzc2VydF9wYXJhbShJU19VQVJUX0FEVkZFQVRVUkVfQVVUT0JBVURSQVRFKAorICAgICAgICBodWFydC0+QWR2YW5jZWRJbml0LkF1dG9CYXVkUmF0ZUVuYWJsZSkpOworICAgIE1PRElGWV9SRUcoaHVhcnQtPkluc3RhbmNlLT5DUjIsIFVTQVJUX0NSMl9BQlJFTiwKKyAgICAgICAgICAgICAgIGh1YXJ0LT5BZHZhbmNlZEluaXQuQXV0b0JhdWRSYXRlRW5hYmxlKTsKKyAgICAvKiBzZXQgYXV0byBCYXVkcmF0ZSBkZXRlY3Rpb24gcGFyYW1ldGVycyBpZiBkZXRlY3Rpb24gaXMgZW5hYmxlZCAqLworICAgIGlmIChodWFydC0+QWR2YW5jZWRJbml0LkF1dG9CYXVkUmF0ZUVuYWJsZSA9PQorICAgICAgICBVQVJUX0FEVkZFQVRVUkVfQVVUT0JBVURSQVRFX0VOQUJMRSkgeworICAgICAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfQURWRkVBVFVSRV9BVVRPQkFVRFJBVEVNT0RFKAorICAgICAgICAgIGh1YXJ0LT5BZHZhbmNlZEluaXQuQXV0b0JhdWRSYXRlTW9kZSkpOworICAgICAgTU9ESUZZX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX0FCUk1PREUsCisgICAgICAgICAgICAgICAgIGh1YXJ0LT5BZHZhbmNlZEluaXQuQXV0b0JhdWRSYXRlTW9kZSk7CisgICAgfQorICB9CisKKyAgLyogaWYgcmVxdWlyZWQsIGNvbmZpZ3VyZSBNU0IgZmlyc3Qgb24gY29tbXVuaWNhdGlvbiBsaW5lICovCisgIGlmIChIQUxfSVNfQklUX1NFVChodWFydC0+QWR2YW5jZWRJbml0LkFkdkZlYXR1cmVJbml0LAorICAgICAgICAgICAgICAgICAgICAgVUFSVF9BRFZGRUFUVVJFX01TQkZJUlNUX0lOSVQpKSB7CisgICAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfQURWRkVBVFVSRV9NU0JGSVJTVChodWFydC0+QWR2YW5jZWRJbml0Lk1TQkZpcnN0KSk7CisgICAgTU9ESUZZX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX01TQkZJUlNULAorICAgICAgICAgICAgICAgaHVhcnQtPkFkdmFuY2VkSW5pdC5NU0JGaXJzdCk7CisgIH0KK30KKworLyoqCisgKiBAYnJpZWYgQ2hlY2sgdGhlIFVBUlQgSWRsZSBTdGF0ZS4KKyAqIEBwYXJhbSBodWFydCBVQVJUIGhhbmRsZS4KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBVQVJUX0NoZWNrSWRsZVN0YXRlKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpIHsKKyAgdWludDMyX3QgdGlja3N0YXJ0OworCisgIC8qIEluaXRpYWxpemUgdGhlIFVBUlQgRXJyb3JDb2RlICovCisgIGh1YXJ0LT5FcnJvckNvZGUgPSBIQUxfVUFSVF9FUlJPUl9OT05FOworCisgIC8qIEluaXQgdGlja3N0YXJ0IGZvciB0aW1lb3V0IG1hbmFnZW1lbnQgKi8KKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAvKiBDaGVjayBpZiB0aGUgVHJhbnNtaXR0ZXIgaXMgZW5hYmxlZCAqLworICBpZiAoKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxICYgVVNBUlRfQ1IxX1RFKSA9PSBVU0FSVF9DUjFfVEUpIHsKKyAgICAvKiBXYWl0IHVudGlsIFRFQUNLIGZsYWcgaXMgc2V0ICovCisgICAgaWYgKFVBUlRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChodWFydCwgVVNBUlRfSVNSX1RFQUNLLCBSRVNFVCwgdGlja3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1VBUlRfVElNRU9VVF9WQUxVRSkgIT0gSEFMX09LKSB7CisgICAgICAvKiBEaXNhYmxlIFRYRSBpbnRlcnJ1cHQgZm9yIHRoZSBpbnRlcnJ1cHQgcHJvY2VzcyAqLworICAgICAgQVRPTUlDX0NMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9UWEVJRV9UWEZORklFKSk7CisKKyAgICAgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKworICAgICAgX19IQUxfVU5MT0NLKGh1YXJ0KTsKKworICAgICAgLyogVGltZW91dCBvY2N1cnJlZCAqLworICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgIH0KKyAgfQorCisgIC8qIENoZWNrIGlmIHRoZSBSZWNlaXZlciBpcyBlbmFibGVkICovCisgIGlmICgoaHVhcnQtPkluc3RhbmNlLT5DUjEgJiBVU0FSVF9DUjFfUkUpID09IFVTQVJUX0NSMV9SRSkgeworICAgIC8qIFdhaXQgdW50aWwgUkVBQ0sgZmxhZyBpcyBzZXQgKi8KKyAgICBpZiAoVUFSVF9XYWl0T25GbGFnVW50aWxUaW1lb3V0KGh1YXJ0LCBVU0FSVF9JU1JfUkVBQ0ssIFJFU0VULCB0aWNrc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfVUFSVF9USU1FT1VUX1ZBTFVFKSAhPSBIQUxfT0spIHsKKyAgICAgIC8qIERpc2FibGUgUlhORSwgUEUgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKQorICAgICAgaW50ZXJydXB0cyBmb3IgdGhlIGludGVycnVwdCBwcm9jZXNzICovCisgICAgICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLAorICAgICAgICAgICAgICAgICAgICAgICAoVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFIHwgVVNBUlRfQ1IxX1BFSUUpKTsKKyAgICAgIEFUT01JQ19DTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgICAgICBodWFydC0+UnhTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworCisgICAgICBfX0hBTF9VTkxPQ0soaHVhcnQpOworCisgICAgICAvKiBUaW1lb3V0IG9jY3VycmVkICovCisgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgfQorICB9CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgVUFSVCBTdGF0ZSAqLworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisgIGh1YXJ0LT5SeFN0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisgIGh1YXJ0LT5SZWNlcHRpb25UeXBlID0gSEFMX1VBUlRfUkVDRVBUSU9OX1NUQU5EQVJEOworICBodWFydC0+UnhFdmVudFR5cGUgPSBIQUxfVUFSVF9SWEVWRU5UX1RDOworCisgIF9fSEFMX1VOTE9DSyhodWFydCk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBVQVJUIENvbW11bmljYXRpb24gVGltZW91dC4gSXQgd2FpdHMKKyAqICAgICAgICAgICAgICAgICAgdW50aWwgYSBmbGFnIGlzIG5vIGxvbmdlciBpbiB0aGUgc3BlY2lmaWVkIHN0YXR1cy4KKyAqIEBwYXJhbSBodWFydCAgICAgVUFSVCBoYW5kbGUuCisgKiBAcGFyYW0gRmxhZyAgICAgIFNwZWNpZmllcyB0aGUgVUFSVCBmbGFnIHRvIGNoZWNrCisgKiBAcGFyYW0gU3RhdHVzICAgIFRoZSBhY3R1YWwgRmxhZyBzdGF0dXMgKFNFVCBvciBSRVNFVCkKKyAqIEBwYXJhbSBUaWNrc3RhcnQgVGljayBzdGFydCB2YWx1ZQorICogQHBhcmFtIFRpbWVvdXQgICBUaW1lb3V0IGR1cmF0aW9uCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgVUFSVF9XYWl0T25GbGFnVW50aWxUaW1lb3V0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRmxhZywgRmxhZ1N0YXR1cyBTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGlja3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVvdXQpIHsKKyAgLyogV2FpdCB1bnRpbCBmbGFnIGlzIHNldCAqLworICB3aGlsZSAoKF9fSEFMX1VBUlRfR0VUX0ZMQUcoaHVhcnQsIEZsYWcpID8gU0VUIDogUkVTRVQpID09IFN0YXR1cykgeworICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLworICAgIGlmIChUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpIHsKKyAgICAgIGlmICgoKEhBTF9HZXRUaWNrKCkgLSBUaWNrc3RhcnQpID4gVGltZW91dCkgfHwgKFRpbWVvdXQgPT0gMFUpKSB7CisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKworICAgICAgaWYgKChSRUFEX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1JFKSAhPSAwVSkgJiYKKyAgICAgICAgICAoRmxhZyAhPSBVQVJUX0ZMQUdfVFhFKSAmJiAoRmxhZyAhPSBVQVJUX0ZMQUdfVEMpKSB7CisgICAgICAgIGlmIChfX0hBTF9VQVJUX0dFVF9GTEFHKGh1YXJ0LCBVQVJUX0ZMQUdfT1JFKSA9PSBTRVQpIHsKKyAgICAgICAgICAvKiBDbGVhciBPdmVycnVuIEVycm9yIGZsYWcqLworICAgICAgICAgIF9fSEFMX1VBUlRfQ0xFQVJfRkxBRyhodWFydCwgVUFSVF9DTEVBUl9PUkVGKTsKKworICAgICAgICAgIC8qIEJsb2NraW5nIGVycm9yIDogdHJhbnNmZXIgaXMgYWJvcnRlZAorICAgICAgICAgIFNldCB0aGUgVUFSVCBzdGF0ZSByZWFkeSB0byBiZSBhYmxlIHRvIHN0YXJ0IGFnYWluIHRoZSBwcm9jZXNzLAorICAgICAgICAgIERpc2FibGUgUnggSW50ZXJydXB0cyBpZiBvbmdvaW5nICovCisgICAgICAgICAgVUFSVF9FbmRSeFRyYW5zZmVyKGh1YXJ0KTsKKworICAgICAgICAgIGh1YXJ0LT5FcnJvckNvZGUgPSBIQUxfVUFSVF9FUlJPUl9PUkU7CisKKyAgICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgICAgX19IQUxfVU5MT0NLKGh1YXJ0KTsKKworICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgaWYgKF9fSEFMX1VBUlRfR0VUX0ZMQUcoaHVhcnQsIFVBUlRfRkxBR19SVE9GKSA9PSBTRVQpIHsKKyAgICAgICAgICAvKiBDbGVhciBSZWNlaXZlciBUaW1lb3V0IGZsYWcqLworICAgICAgICAgIF9fSEFMX1VBUlRfQ0xFQVJfRkxBRyhodWFydCwgVUFSVF9DTEVBUl9SVE9GKTsKKworICAgICAgICAgIC8qIEJsb2NraW5nIGVycm9yIDogdHJhbnNmZXIgaXMgYWJvcnRlZAorICAgICAgICAgIFNldCB0aGUgVUFSVCBzdGF0ZSByZWFkeSB0byBiZSBhYmxlIHRvIHN0YXJ0IGFnYWluIHRoZSBwcm9jZXNzLAorICAgICAgICAgIERpc2FibGUgUnggSW50ZXJydXB0cyBpZiBvbmdvaW5nICovCisgICAgICAgICAgVUFSVF9FbmRSeFRyYW5zZmVyKGh1YXJ0KTsKKworICAgICAgICAgIGh1YXJ0LT5FcnJvckNvZGUgPSBIQUxfVUFSVF9FUlJPUl9SVE87CisKKyAgICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgICAgX19IQUxfVU5MT0NLKGh1YXJ0KTsKKworICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiAgU3RhcnQgUmVjZWl2ZSBvcGVyYXRpb24gaW4gaW50ZXJydXB0IG1vZGUuCisgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gY291bGQgYmUgY2FsbGVkIGJ5IGFsbCBIQUwgVUFSVCBBUEkgcHJvdmlkaW5nIHJlY2VwdGlvbgorICogaW4gSW50ZXJydXB0IG1vZGUuCisgKiBAbm90ZSAgIFdoZW4gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLCBwYXJhbWV0ZXJzIHZhbGlkaXR5IGlzIGNvbnNpZGVyZWQgYXMKKyAqIGFscmVhZHkgY2hlY2tlZCwgaS5lLiBSeCBTdGF0ZSwgYnVmZmVyIGFkZHJlc3MsIC4uLiBVQVJUIEhhbmRsZSBpcyBhc3N1bWVkIGFzCisgKiBMb2NrZWQuCisgKiBAcGFyYW0gIGh1YXJ0IFVBUlQgaGFuZGxlLgorICogQHBhcmFtICBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyICh1OCBvciB1MTYgZGF0YSBlbGVtZW50cykuCisgKiBAcGFyYW0gIFNpemUgIEFtb3VudCBvZiBkYXRhIGVsZW1lbnRzICh1OCBvciB1MTYpIHRvIGJlIHJlY2VpdmVkLgorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIFVBUlRfU3RhcnRfUmVjZWl2ZV9JVChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKSB7CisgIGh1YXJ0LT5wUnhCdWZmUHRyID0gcERhdGE7CisgIGh1YXJ0LT5SeFhmZXJTaXplID0gU2l6ZTsKKyAgaHVhcnQtPlJ4WGZlckNvdW50ID0gU2l6ZTsKKyAgaHVhcnQtPlJ4SVNSID0gTlVMTDsKKworICAvKiBDb21wdXRhdGlvbiBvZiBVQVJUIG1hc2sgdG8gYXBwbHkgdG8gUkRSIHJlZ2lzdGVyICovCisgIFVBUlRfTUFTS19DT01QVVRBVElPTihodWFydCk7CisKKyAgaHVhcnQtPkVycm9yQ29kZSA9IEhBTF9VQVJUX0VSUk9SX05PTkU7CisgIGh1YXJ0LT5SeFN0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWV9SWDsKKworICAvKiBFbmFibGUgdGhlIFVBUlQgRXJyb3IgSW50ZXJydXB0OiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKQorICAgKi8KKyAgQVRPTUlDX1NFVF9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgIC8qIENvbmZpZ3VyZSBSeCBpbnRlcnJ1cHQgcHJvY2Vzc2luZyAqLworICBpZiAoKGh1YXJ0LT5GaWZvTW9kZSA9PSBVQVJUX0ZJRk9NT0RFX0VOQUJMRSkgJiYKKyAgICAgIChTaXplID49IGh1YXJ0LT5OYlJ4RGF0YVRvUHJvY2VzcykpIHsKKyAgICAvKiBTZXQgdGhlIFJ4IElTUiBmdW5jdGlvbiBwb2ludGVyIGFjY29yZGluZyB0byB0aGUgZGF0YSB3b3JkIGxlbmd0aCAqLworICAgIGlmICgoaHVhcnQtPkluaXQuV29yZExlbmd0aCA9PSBVQVJUX1dPUkRMRU5HVEhfOUIpICYmCisgICAgICAgIChodWFydC0+SW5pdC5QYXJpdHkgPT0gVUFSVF9QQVJJVFlfTk9ORSkpIHsKKyAgICAgIGh1YXJ0LT5SeElTUiA9IFVBUlRfUnhJU1JfMTZCSVRfRklGT0VOOworICAgIH0gZWxzZSB7CisgICAgICBodWFydC0+UnhJU1IgPSBVQVJUX1J4SVNSXzhCSVRfRklGT0VOOworICAgIH0KKworICAgIC8qIEVuYWJsZSB0aGUgVUFSVCBQYXJpdHkgRXJyb3IgaW50ZXJydXB0IGFuZCBSWCBGSUZPIFRocmVzaG9sZCBpbnRlcnJ1cHQgKi8KKyAgICBpZiAoaHVhcnQtPkluaXQuUGFyaXR5ICE9IFVBUlRfUEFSSVRZX05PTkUpIHsKKyAgICAgIEFUT01JQ19TRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUEVJRSk7CisgICAgfQorICAgIEFUT01JQ19TRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfUlhGVElFKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBTZXQgdGhlIFJ4IElTUiBmdW5jdGlvbiBwb2ludGVyIGFjY29yZGluZyB0byB0aGUgZGF0YSB3b3JkIGxlbmd0aCAqLworICAgIGlmICgoaHVhcnQtPkluaXQuV29yZExlbmd0aCA9PSBVQVJUX1dPUkRMRU5HVEhfOUIpICYmCisgICAgICAgIChodWFydC0+SW5pdC5QYXJpdHkgPT0gVUFSVF9QQVJJVFlfTk9ORSkpIHsKKyAgICAgIGh1YXJ0LT5SeElTUiA9IFVBUlRfUnhJU1JfMTZCSVQ7CisgICAgfSBlbHNlIHsKKyAgICAgIGh1YXJ0LT5SeElTUiA9IFVBUlRfUnhJU1JfOEJJVDsKKyAgICB9CisKKyAgICAvKiBFbmFibGUgdGhlIFVBUlQgUGFyaXR5IEVycm9yIGludGVycnVwdCBhbmQgRGF0YSBSZWdpc3RlciBOb3QgRW1wdHkKKyAgICAgKiBpbnRlcnJ1cHQgKi8KKyAgICBpZiAoaHVhcnQtPkluaXQuUGFyaXR5ICE9IFVBUlRfUEFSSVRZX05PTkUpIHsKKyAgICAgIEFUT01JQ19TRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLAorICAgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX1BFSUUgfCBVU0FSVF9DUjFfUlhORUlFX1JYRk5FSUUpOworICAgIH0gZWxzZSB7CisgICAgICBBVE9NSUNfU0VUX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgIFN0YXJ0IFJlY2VpdmUgb3BlcmF0aW9uIGluIERNQSBtb2RlLgorICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGNvdWxkIGJlIGNhbGxlZCBieSBhbGwgSEFMIFVBUlQgQVBJIHByb3ZpZGluZyByZWNlcHRpb24KKyAqIGluIERNQSBtb2RlLgorICogQG5vdGUgICBXaGVuIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiwgcGFyYW1ldGVycyB2YWxpZGl0eSBpcyBjb25zaWRlcmVkIGFzCisgKiBhbHJlYWR5IGNoZWNrZWQsIGkuZS4gUnggU3RhdGUsIGJ1ZmZlciBhZGRyZXNzLCAuLi4gVUFSVCBIYW5kbGUgaXMgYXNzdW1lZCBhcworICogTG9ja2VkLgorICogQHBhcmFtICBodWFydCBVQVJUIGhhbmRsZS4KKyAqIEBwYXJhbSAgcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlciAodTggb3IgdTE2IGRhdGEgZWxlbWVudHMpLgorICogQHBhcmFtICBTaXplICBBbW91bnQgb2YgZGF0YSBlbGVtZW50cyAodTggb3IgdTE2KSB0byBiZSByZWNlaXZlZC4KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBVQVJUX1N0YXJ0X1JlY2VpdmVfRE1BKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKSB7CisgIGh1YXJ0LT5wUnhCdWZmUHRyID0gcERhdGE7CisgIGh1YXJ0LT5SeFhmZXJTaXplID0gU2l6ZTsKKworICBodWFydC0+RXJyb3JDb2RlID0gSEFMX1VBUlRfRVJST1JfTk9ORTsKKyAgaHVhcnQtPlJ4U3RhdGUgPSBIQUxfVUFSVF9TVEFURV9CVVNZX1JYOworCisgIGlmIChodWFydC0+aGRtYXJ4ICE9IE5VTEwpIHsKKyAgICAvKiBTZXQgdGhlIFVBUlQgRE1BIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgaHVhcnQtPmhkbWFyeC0+WGZlckNwbHRDYWxsYmFjayA9IFVBUlRfRE1BUmVjZWl2ZUNwbHQ7CisKKyAgICAvKiBTZXQgdGhlIFVBUlQgRE1BIEhhbGYgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICBodWFydC0+aGRtYXJ4LT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFVBUlRfRE1BUnhIYWxmQ3BsdDsKKworICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgaHVhcnQtPmhkbWFyeC0+WGZlckVycm9yQ2FsbGJhY2sgPSBVQVJUX0RNQUVycm9yOworCisgICAgLyogU2V0IHRoZSBETUEgYWJvcnQgY2FsbGJhY2sgKi8KKyAgICBodWFydC0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHVhcnQtPmhkbWFyeCwgKHVpbnQzMl90KSZodWFydC0+SW5zdGFuY2UtPlJEUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpaHVhcnQtPnBSeEJ1ZmZQdHIsIFNpemUpICE9IEhBTF9PSykgeworICAgICAgLyogU2V0IGVycm9yIGNvZGUgdG8gRE1BICovCisgICAgICBodWFydC0+RXJyb3JDb2RlID0gSEFMX1VBUlRfRVJST1JfRE1BOworCisgICAgICAvKiBSZXN0b3JlIGh1YXJ0LT5SeFN0YXRlIHRvIHJlYWR5ICovCisgICAgICBodWFydC0+UnhTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworCisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKyAgfQorCisgIC8qIEVuYWJsZSB0aGUgVUFSVCBQYXJpdHkgRXJyb3IgSW50ZXJydXB0ICovCisgIGlmIChodWFydC0+SW5pdC5QYXJpdHkgIT0gVUFSVF9QQVJJVFlfTk9ORSkgeworICAgIEFUT01JQ19TRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUEVJRSk7CisgIH0KKworICAvKiBFbmFibGUgdGhlIFVBUlQgRXJyb3IgSW50ZXJydXB0OiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKQorICAgKi8KKyAgQVRPTUlDX1NFVF9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgIC8qIEVuYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGZvciB0aGUgcmVjZWl2ZXIgcmVxdWVzdCBieSBzZXR0aW5nIHRoZSBETUFSIGJpdAorICBpbiB0aGUgVUFSVCBDUjMgcmVnaXN0ZXIgKi8KKyAgQVRPTUlDX1NFVF9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiAgRW5kIG9uZ29pbmcgVHggdHJhbnNmZXIgb24gVUFSVCBwZXJpcGhlcmFsIChmb2xsb3dpbmcgZXJyb3IgZGV0ZWN0aW9uCisgKiBvciBUcmFuc21pdCBjb21wbGV0aW9uKS4KKyAqIEBwYXJhbSAgaHVhcnQgVUFSVCBoYW5kbGUuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworc3RhdGljIHZvaWQgVUFSVF9FbmRUeFRyYW5zZmVyKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpIHsKKyAgLyogRGlzYWJsZSBUWEVJRSwgVENJRSwgVFhGVCBpbnRlcnJ1cHRzICovCisgIEFUT01JQ19DTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsCisgICAgICAgICAgICAgICAgICAgKFVTQVJUX0NSMV9UWEVJRV9UWEZORklFIHwgVVNBUlRfQ1IxX1RDSUUpKTsKKyAgQVRPTUlDX0NMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgKFVTQVJUX0NSM19UWEZUSUUpKTsKKworICAvKiBBdCBlbmQgb2YgVHggcHJvY2VzcywgcmVzdG9yZSBodWFydC0+Z1N0YXRlIHRvIFJlYWR5ICovCisgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuZCBvbmdvaW5nIFJ4IHRyYW5zZmVyIG9uIFVBUlQgcGVyaXBoZXJhbCAoZm9sbG93aW5nIGVycm9yIGRldGVjdGlvbgorICogb3IgUmVjZXB0aW9uIGNvbXBsZXRpb24pLgorICogQHBhcmFtICBodWFydCBVQVJUIGhhbmRsZS4KKyAqIEByZXR2YWwgTm9uZQorICovCitzdGF0aWMgdm9pZCBVQVJUX0VuZFJ4VHJhbnNmZXIoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkgeworICAvKiBEaXNhYmxlIFJYTkUsIFBFIGFuZCBFUlIgKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikKKyAgICogaW50ZXJydXB0cyAqLworICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLAorICAgICAgICAgICAgICAgICAgIChVU0FSVF9DUjFfUlhORUlFX1JYRk5FSUUgfCBVU0FSVF9DUjFfUEVJRSkpOworICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCAoVVNBUlRfQ1IzX0VJRSB8IFVTQVJUX0NSM19SWEZUSUUpKTsKKworICAvKiBJbiBjYXNlIG9mIHJlY2VwdGlvbiB3YWl0aW5nIGZvciBJRExFIGV2ZW50LCBkaXNhYmxlIGFsc28gdGhlIElETEUgSUUKKyAgICogaW50ZXJydXB0IHNvdXJjZSAqLworICBpZiAoaHVhcnQtPlJlY2VwdGlvblR5cGUgPT0gSEFMX1VBUlRfUkVDRVBUSU9OX1RPSURMRSkgeworICAgIEFUT01JQ19DTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9JRExFSUUpOworICB9CisKKyAgLyogQXQgZW5kIG9mIFJ4IHByb2Nlc3MsIHJlc3RvcmUgaHVhcnQtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgaHVhcnQtPlJ4U3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKyAgaHVhcnQtPlJlY2VwdGlvblR5cGUgPSBIQUxfVUFSVF9SRUNFUFRJT05fU1RBTkRBUkQ7CisKKyAgLyogUmVzZXQgUnhJc3IgZnVuY3Rpb24gcG9pbnRlciAqLworICBodWFydC0+UnhJU1IgPSBOVUxMOworfQorCisvKioKKyAqIEBicmllZiBETUEgVUFSVCB0cmFuc21pdCBwcm9jZXNzIGNvbXBsZXRlIGNhbGxiYWNrLgorICogQHBhcmFtIGhkbWEgRE1BIGhhbmRsZS4KKyAqIEByZXR2YWwgTm9uZQorICovCitzdGF0aWMgdm9pZCBVQVJUX0RNQVRyYW5zbWl0Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkgeworICBVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0ID0gKFVBUlRfSGFuZGxlVHlwZURlZiAqKShoZG1hLT5QYXJlbnQpOworCisgIC8qIERNQSBOb3JtYWwgbW9kZSAqLworICBpZiAoSEFMX0lTX0JJVF9DTFIoaGRtYS0+SW5zdGFuY2UtPkNDUiwgRE1BX0NDUl9DSVJDKSkgeworICAgIGh1YXJ0LT5UeFhmZXJDb3VudCA9IDBVOworCisgICAgLyogRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGZvciB0cmFuc21pdCByZXF1ZXN0IGJ5IHJlc2V0dGluZyB0aGUgRE1BVCBiaXQKKyAgICAgICBpbiB0aGUgVUFSVCBDUjMgcmVnaXN0ZXIgKi8KKyAgICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCk7CisKKyAgICAvKiBFbmFibGUgdGhlIFVBUlQgVHJhbnNtaXQgQ29tcGxldGUgSW50ZXJydXB0ICovCisgICAgQVRPTUlDX1NFVF9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9UQ0lFKTsKKyAgfQorICAvKiBETUEgQ2lyY3VsYXIgbW9kZSAqLworICBlbHNlIHsKKyNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIC8qQ2FsbCByZWdpc3RlcmVkIFR4IGNvbXBsZXRlIGNhbGxiYWNrKi8KKyAgICBodWFydC0+VHhDcGx0Q2FsbGJhY2soaHVhcnQpOworI2Vsc2UKKyAgICAvKkNhbGwgbGVnYWN5IHdlYWsgVHggY29tcGxldGUgY2FsbGJhY2sqLworICAgIEhBTF9VQVJUX1R4Q3BsdENhbGxiYWNrKGh1YXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KK30KKworLyoqCisgKiBAYnJpZWYgRE1BIFVBUlQgdHJhbnNtaXQgcHJvY2VzcyBoYWxmIGNvbXBsZXRlIGNhbGxiYWNrLgorICogQHBhcmFtIGhkbWEgRE1BIGhhbmRsZS4KKyAqIEByZXR2YWwgTm9uZQorICovCitzdGF0aWMgdm9pZCBVQVJUX0RNQVR4SGFsZkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpIHsKKyAgVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCA9IChVQVJUX0hhbmRsZVR5cGVEZWYgKikoaGRtYS0+UGFyZW50KTsKKworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIC8qQ2FsbCByZWdpc3RlcmVkIFR4IEhhbGYgY29tcGxldGUgY2FsbGJhY2sqLworICBodWFydC0+VHhIYWxmQ3BsdENhbGxiYWNrKGh1YXJ0KTsKKyNlbHNlCisgIC8qQ2FsbCBsZWdhY3kgd2VhayBUeCBIYWxmIGNvbXBsZXRlIGNhbGxiYWNrKi8KKyAgSEFMX1VBUlRfVHhIYWxmQ3BsdENhbGxiYWNrKGh1YXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9CisKKy8qKgorICogQGJyaWVmIERNQSBVQVJUIHJlY2VpdmUgcHJvY2VzcyBjb21wbGV0ZSBjYWxsYmFjay4KKyAqIEBwYXJhbSBoZG1hIERNQSBoYW5kbGUuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworc3RhdGljIHZvaWQgVUFSVF9ETUFSZWNlaXZlQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkgeworICBVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0ID0gKFVBUlRfSGFuZGxlVHlwZURlZiAqKShoZG1hLT5QYXJlbnQpOworCisgIC8qIERNQSBOb3JtYWwgbW9kZSAqLworICBpZiAoSEFMX0lTX0JJVF9DTFIoaGRtYS0+SW5zdGFuY2UtPkNDUiwgRE1BX0NDUl9DSVJDKSkgeworICAgIGh1YXJ0LT5SeFhmZXJDb3VudCA9IDBVOworCisgICAgLyogRGlzYWJsZSBQRSBhbmQgRVJSIChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpIGludGVycnVwdHMKKyAgICAgKi8KKyAgICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUEVJRSk7CisgICAgQVRPTUlDX0NMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgZm9yIHRoZSByZWNlaXZlciByZXF1ZXN0IGJ5IHJlc2V0dGluZyB0aGUgRE1BUgorICAgICAgIGJpdCBpbiB0aGUgVUFSVCBDUjMgcmVnaXN0ZXIgKi8KKyAgICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7CisKKyAgICAvKiBBdCBlbmQgb2YgUnggcHJvY2VzcywgcmVzdG9yZSBodWFydC0+UnhTdGF0ZSB0byBSZWFkeSAqLworICAgIGh1YXJ0LT5SeFN0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBJZiBSZWNlcHRpb24gdGlsbCBJRExFIGV2ZW50IGhhcyBiZWVuIHNlbGVjdGVkLCBEaXNhYmxlIElETEUgSW50ZXJydXB0ICovCisgICAgaWYgKGh1YXJ0LT5SZWNlcHRpb25UeXBlID09IEhBTF9VQVJUX1JFQ0VQVElPTl9UT0lETEUpIHsKKyAgICAgIEFUT01JQ19DTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9JRExFSUUpOworICAgIH0KKyAgfQorCisgIC8qIEluaXRpYWxpemUgdHlwZSBvZiBSeEV2ZW50IHRoYXQgY29ycmVzcG9uZCB0byBSeEV2ZW50IGNhbGxiYWNrIGV4ZWN1dGlvbjsKKyAgICAgSW4gdGhpcyBjYXNlLCBSeCBFdmVudCB0eXBlIGlzIFRyYW5zZmVyIENvbXBsZXRlICovCisgIGh1YXJ0LT5SeEV2ZW50VHlwZSA9IEhBTF9VQVJUX1JYRVZFTlRfVEM7CisKKyAgLyogQ2hlY2sgY3VycmVudCByZWNlcHRpb24gTW9kZSA6CisgICAgIElmIFJlY2VwdGlvbiB0aWxsIElETEUgZXZlbnQgaGFzIGJlZW4gc2VsZWN0ZWQgOiB1c2UgUnggRXZlbnQgY2FsbGJhY2sgKi8KKyAgaWYgKGh1YXJ0LT5SZWNlcHRpb25UeXBlID09IEhBTF9VQVJUX1JFQ0VQVElPTl9UT0lETEUpIHsKKyNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIC8qQ2FsbCByZWdpc3RlcmVkIFJ4IEV2ZW50IGNhbGxiYWNrKi8KKyAgICBodWFydC0+UnhFdmVudENhbGxiYWNrKGh1YXJ0LCBodWFydC0+UnhYZmVyU2l6ZSk7CisjZWxzZQorICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBSeCBFdmVudCBjYWxsYmFjayovCisgICAgSEFMX1VBUlRFeF9SeEV2ZW50Q2FsbGJhY2soaHVhcnQsIGh1YXJ0LT5SeFhmZXJTaXplKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0gZWxzZSB7CisgICAgLyogSW4gb3RoZXIgY2FzZXMgOiB1c2UgUnggQ29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIC8qQ2FsbCByZWdpc3RlcmVkIFJ4IGNvbXBsZXRlIGNhbGxiYWNrKi8KKyAgICBodWFydC0+UnhDcGx0Q2FsbGJhY2soaHVhcnQpOworI2Vsc2UKKyAgICAvKkNhbGwgbGVnYWN5IHdlYWsgUnggY29tcGxldGUgY2FsbGJhY2sqLworICAgIEhBTF9VQVJUX1J4Q3BsdENhbGxiYWNrKGh1YXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KK30KKworLyoqCisgKiBAYnJpZWYgRE1BIFVBUlQgcmVjZWl2ZSBwcm9jZXNzIGhhbGYgY29tcGxldGUgY2FsbGJhY2suCisgKiBAcGFyYW0gaGRtYSBETUEgaGFuZGxlLgorICogQHJldHZhbCBOb25lCisgKi8KK3N0YXRpYyB2b2lkIFVBUlRfRE1BUnhIYWxmQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkgeworICBVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0ID0gKFVBUlRfSGFuZGxlVHlwZURlZiAqKShoZG1hLT5QYXJlbnQpOworCisgIC8qIEluaXRpYWxpemUgdHlwZSBvZiBSeEV2ZW50IHRoYXQgY29ycmVzcG9uZCB0byBSeEV2ZW50IGNhbGxiYWNrIGV4ZWN1dGlvbjsKKyAgICAgSW4gdGhpcyBjYXNlLCBSeCBFdmVudCB0eXBlIGlzIEhhbGYgVHJhbnNmZXIgKi8KKyAgaHVhcnQtPlJ4RXZlbnRUeXBlID0gSEFMX1VBUlRfUlhFVkVOVF9IVDsKKworICAvKiBDaGVjayBjdXJyZW50IHJlY2VwdGlvbiBNb2RlIDoKKyAgICAgSWYgUmVjZXB0aW9uIHRpbGwgSURMRSBldmVudCBoYXMgYmVlbiBzZWxlY3RlZCA6IHVzZSBSeCBFdmVudCBjYWxsYmFjayAqLworICBpZiAoaHVhcnQtPlJlY2VwdGlvblR5cGUgPT0gSEFMX1VBUlRfUkVDRVBUSU9OX1RPSURMRSkgeworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgLypDYWxsIHJlZ2lzdGVyZWQgUnggRXZlbnQgY2FsbGJhY2sqLworICAgIGh1YXJ0LT5SeEV2ZW50Q2FsbGJhY2soaHVhcnQsIGh1YXJ0LT5SeFhmZXJTaXplIC8gMlUpOworI2Vsc2UKKyAgICAvKkNhbGwgbGVnYWN5IHdlYWsgUnggRXZlbnQgY2FsbGJhY2sqLworICAgIEhBTF9VQVJURXhfUnhFdmVudENhbGxiYWNrKGh1YXJ0LCBodWFydC0+UnhYZmVyU2l6ZSAvIDJVKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0gZWxzZSB7CisgICAgLyogSW4gb3RoZXIgY2FzZXMgOiB1c2UgUnggSGFsZiBDb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgLypDYWxsIHJlZ2lzdGVyZWQgUnggSGFsZiBjb21wbGV0ZSBjYWxsYmFjayovCisgICAgaHVhcnQtPlJ4SGFsZkNwbHRDYWxsYmFjayhodWFydCk7CisjZWxzZQorICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBSeCBIYWxmIGNvbXBsZXRlIGNhbGxiYWNrKi8KKyAgICBIQUxfVUFSVF9SeEhhbGZDcGx0Q2FsbGJhY2soaHVhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorfQorCisvKioKKyAqIEBicmllZiBETUEgVUFSVCBjb21tdW5pY2F0aW9uIGVycm9yIGNhbGxiYWNrLgorICogQHBhcmFtIGhkbWEgRE1BIGhhbmRsZS4KKyAqIEByZXR2YWwgTm9uZQorICovCitzdGF0aWMgdm9pZCBVQVJUX0RNQUVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKSB7CisgIFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQgPSAoVUFSVF9IYW5kbGVUeXBlRGVmICopKGhkbWEtPlBhcmVudCk7CisKKyAgY29uc3QgSEFMX1VBUlRfU3RhdGVUeXBlRGVmIGdzdGF0ZSA9IGh1YXJ0LT5nU3RhdGU7CisgIGNvbnN0IEhBTF9VQVJUX1N0YXRlVHlwZURlZiByeHN0YXRlID0gaHVhcnQtPlJ4U3RhdGU7CisKKyAgLyogU3RvcCBVQVJUIERNQSBUeCByZXF1ZXN0IGlmIG9uZ29pbmcgKi8KKyAgaWYgKChIQUxfSVNfQklUX1NFVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpKSAmJgorICAgICAgKGdzdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9CVVNZX1RYKSkgeworICAgIGh1YXJ0LT5UeFhmZXJDb3VudCA9IDBVOworICAgIFVBUlRfRW5kVHhUcmFuc2ZlcihodWFydCk7CisgIH0KKworICAvKiBTdG9wIFVBUlQgRE1BIFJ4IHJlcXVlc3QgaWYgb25nb2luZyAqLworICBpZiAoKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpICYmCisgICAgICAocnhzdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9CVVNZX1JYKSkgeworICAgIGh1YXJ0LT5SeFhmZXJDb3VudCA9IDBVOworICAgIFVBUlRfRW5kUnhUcmFuc2ZlcihodWFydCk7CisgIH0KKworICBodWFydC0+RXJyb3JDb2RlIHw9IEhBTF9VQVJUX0VSUk9SX0RNQTsKKworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIC8qQ2FsbCByZWdpc3RlcmVkIGVycm9yIGNhbGxiYWNrKi8KKyAgaHVhcnQtPkVycm9yQ2FsbGJhY2soaHVhcnQpOworI2Vsc2UKKyAgLypDYWxsIGxlZ2FjeSB3ZWFrIGVycm9yIGNhbGxiYWNrKi8KKyAgSEFMX1VBUlRfRXJyb3JDYWxsYmFjayhodWFydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfQorCisvKioKKyAqIEBicmllZiAgRE1BIFVBUlQgY29tbXVuaWNhdGlvbiBhYm9ydCBjYWxsYmFjaywgd2hlbiBpbml0aWF0ZWQgYnkgSEFMIHNlcnZpY2VzCisgKiBvbiBFcnJvciAoVG8gYmUgY2FsbGVkIGF0IGVuZCBvZiBETUEgQWJvcnQgcHJvY2VkdXJlIGZvbGxvd2luZyBlcnJvcgorICogb2NjdXJyZW5jZSkuCisgKiBAcGFyYW0gIGhkbWEgRE1BIGhhbmRsZS4KKyAqIEByZXR2YWwgTm9uZQorICovCitzdGF0aWMgdm9pZCBVQVJUX0RNQUFib3J0T25FcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkgeworICBVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0ID0gKFVBUlRfSGFuZGxlVHlwZURlZiAqKShoZG1hLT5QYXJlbnQpOworICBodWFydC0+UnhYZmVyQ291bnQgPSAwVTsKKworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIC8qQ2FsbCByZWdpc3RlcmVkIGVycm9yIGNhbGxiYWNrKi8KKyAgaHVhcnQtPkVycm9yQ2FsbGJhY2soaHVhcnQpOworI2Vsc2UKKyAgLypDYWxsIGxlZ2FjeSB3ZWFrIGVycm9yIGNhbGxiYWNrKi8KKyAgSEFMX1VBUlRfRXJyb3JDYWxsYmFjayhodWFydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfQorCisvKioKKyAqIEBicmllZiAgRE1BIFVBUlQgVHggY29tbXVuaWNhdGlvbiBhYm9ydCBjYWxsYmFjaywgd2hlbiBpbml0aWF0ZWQgYnkgdXNlcgorICogICAgICAgICAoVG8gYmUgY2FsbGVkIGF0IGVuZCBvZiBETUEgVHggQWJvcnQgcHJvY2VkdXJlIGZvbGxvd2luZyB1c2VyIGFib3J0CisgKiByZXF1ZXN0KS4KKyAqIEBub3RlICAgV2hlbiB0aGlzIGNhbGxiYWNrIGlzIGV4ZWN1dGVkLCBVc2VyIEFib3J0IGNvbXBsZXRlIGNhbGwgYmFjayBpcworICogY2FsbGVkIG9ubHkgaWYgbm8gQWJvcnQgc3RpbGwgb25nb2luZyBmb3IgUnggRE1BIEhhbmRsZS4KKyAqIEBwYXJhbSAgaGRtYSBETUEgaGFuZGxlLgorICogQHJldHZhbCBOb25lCisgKi8KK3N0YXRpYyB2b2lkIFVBUlRfRE1BVHhBYm9ydENhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKSB7CisgIFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQgPSAoVUFSVF9IYW5kbGVUeXBlRGVmICopKGhkbWEtPlBhcmVudCk7CisKKyAgaHVhcnQtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgIC8qIENoZWNrIGlmIGFuIEFib3J0IHByb2Nlc3MgaXMgc3RpbGwgb25nb2luZyAqLworICBpZiAoaHVhcnQtPmhkbWFyeCAhPSBOVUxMKSB7CisgICAgaWYgKGh1YXJ0LT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrICE9IE5VTEwpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKworICAvKiBObyBBYm9ydCBwcm9jZXNzIHN0aWxsIG9uZ29pbmcgOiBBbGwgRE1BIGNoYW5uZWxzIGFyZSBhYm9ydGVkLCBjYWxsIHVzZXIKKyAgICogQWJvcnQgQ29tcGxldGUgY2FsbGJhY2sgKi8KKyAgaHVhcnQtPlR4WGZlckNvdW50ID0gMFU7CisgIGh1YXJ0LT5SeFhmZXJDb3VudCA9IDBVOworCisgIC8qIFJlc2V0IGVycm9yQ29kZSAqLworICBodWFydC0+RXJyb3JDb2RlID0gSEFMX1VBUlRfRVJST1JfTk9ORTsKKworICAvKiBDbGVhciB0aGUgRXJyb3IgZmxhZ3MgaW4gdGhlIElDUiByZWdpc3RlciAqLworICBfX0hBTF9VQVJUX0NMRUFSX0ZMQUcoaHVhcnQsIFVBUlRfQ0xFQVJfT1JFRiB8IFVBUlRfQ0xFQVJfTkVGIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUFSVF9DTEVBUl9QRUYgfCBVQVJUX0NMRUFSX0ZFRik7CisKKyAgLyogRmx1c2ggdGhlIHdob2xlIFRYIEZJRk8gKGlmIG5lZWRlZCkgKi8KKyAgaWYgKGh1YXJ0LT5GaWZvTW9kZSA9PSBVQVJUX0ZJRk9NT0RFX0VOQUJMRSkgeworICAgIF9fSEFMX1VBUlRfU0VORF9SRVEoaHVhcnQsIFVBUlRfVFhEQVRBX0ZMVVNIX1JFUVVFU1QpOworICB9CisKKyAgLyogUmVzdG9yZSBodWFydC0+Z1N0YXRlIGFuZCBodWFydC0+UnhTdGF0ZSB0byBSZWFkeSAqLworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisgIGh1YXJ0LT5SeFN0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisgIGh1YXJ0LT5SZWNlcHRpb25UeXBlID0gSEFMX1VBUlRfUkVDRVBUSU9OX1NUQU5EQVJEOworCisgIC8qIENhbGwgdXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIC8qIENhbGwgcmVnaXN0ZXJlZCBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworICBodWFydC0+QWJvcnRDcGx0Q2FsbGJhY2soaHVhcnQpOworI2Vsc2UKKyAgLyogQ2FsbCBsZWdhY3kgd2VhayBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworICBIQUxfVUFSVF9BYm9ydENwbHRDYWxsYmFjayhodWFydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfQorCisvKioKKyAqIEBicmllZiAgRE1BIFVBUlQgUnggY29tbXVuaWNhdGlvbiBhYm9ydCBjYWxsYmFjaywgd2hlbiBpbml0aWF0ZWQgYnkgdXNlcgorICogICAgICAgICAoVG8gYmUgY2FsbGVkIGF0IGVuZCBvZiBETUEgUnggQWJvcnQgcHJvY2VkdXJlIGZvbGxvd2luZyB1c2VyIGFib3J0CisgKiByZXF1ZXN0KS4KKyAqIEBub3RlICAgV2hlbiB0aGlzIGNhbGxiYWNrIGlzIGV4ZWN1dGVkLCBVc2VyIEFib3J0IGNvbXBsZXRlIGNhbGwgYmFjayBpcworICogY2FsbGVkIG9ubHkgaWYgbm8gQWJvcnQgc3RpbGwgb25nb2luZyBmb3IgVHggRE1BIEhhbmRsZS4KKyAqIEBwYXJhbSAgaGRtYSBETUEgaGFuZGxlLgorICogQHJldHZhbCBOb25lCisgKi8KK3N0YXRpYyB2b2lkIFVBUlRfRE1BUnhBYm9ydENhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKSB7CisgIFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQgPSAoVUFSVF9IYW5kbGVUeXBlRGVmICopKGhkbWEtPlBhcmVudCk7CisKKyAgaHVhcnQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgIC8qIENoZWNrIGlmIGFuIEFib3J0IHByb2Nlc3MgaXMgc3RpbGwgb25nb2luZyAqLworICBpZiAoaHVhcnQtPmhkbWF0eCAhPSBOVUxMKSB7CisgICAgaWYgKGh1YXJ0LT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrICE9IE5VTEwpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKworICAvKiBObyBBYm9ydCBwcm9jZXNzIHN0aWxsIG9uZ29pbmcgOiBBbGwgRE1BIGNoYW5uZWxzIGFyZSBhYm9ydGVkLCBjYWxsIHVzZXIKKyAgICogQWJvcnQgQ29tcGxldGUgY2FsbGJhY2sgKi8KKyAgaHVhcnQtPlR4WGZlckNvdW50ID0gMFU7CisgIGh1YXJ0LT5SeFhmZXJDb3VudCA9IDBVOworCisgIC8qIFJlc2V0IGVycm9yQ29kZSAqLworICBodWFydC0+RXJyb3JDb2RlID0gSEFMX1VBUlRfRVJST1JfTk9ORTsKKworICAvKiBDbGVhciB0aGUgRXJyb3IgZmxhZ3MgaW4gdGhlIElDUiByZWdpc3RlciAqLworICBfX0hBTF9VQVJUX0NMRUFSX0ZMQUcoaHVhcnQsIFVBUlRfQ0xFQVJfT1JFRiB8IFVBUlRfQ0xFQVJfTkVGIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUFSVF9DTEVBUl9QRUYgfCBVQVJUX0NMRUFSX0ZFRik7CisKKyAgLyogRGlzY2FyZCB0aGUgcmVjZWl2ZWQgZGF0YSAqLworICBfX0hBTF9VQVJUX1NFTkRfUkVRKGh1YXJ0LCBVQVJUX1JYREFUQV9GTFVTSF9SRVFVRVNUKTsKKworICAvKiBSZXN0b3JlIGh1YXJ0LT5nU3RhdGUgYW5kIGh1YXJ0LT5SeFN0YXRlIHRvIFJlYWR5ICovCisgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKyAgaHVhcnQtPlJ4U3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKyAgaHVhcnQtPlJlY2VwdGlvblR5cGUgPSBIQUxfVUFSVF9SRUNFUFRJT05fU1RBTkRBUkQ7CisKKyAgLyogQ2FsbCB1c2VyIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgLyogQ2FsbCByZWdpc3RlcmVkIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovCisgIGh1YXJ0LT5BYm9ydENwbHRDYWxsYmFjayhodWFydCk7CisjZWxzZQorICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovCisgIEhBTF9VQVJUX0Fib3J0Q3BsdENhbGxiYWNrKGh1YXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9CisKKy8qKgorICogQGJyaWVmICBETUEgVUFSVCBUeCBjb21tdW5pY2F0aW9uIGFib3J0IGNhbGxiYWNrLCB3aGVuIGluaXRpYXRlZCBieSB1c2VyIGJ5IGEKKyAqIGNhbGwgdG8gSEFMX1VBUlRfQWJvcnRUcmFuc21pdF9JVCBBUEkgKEFib3J0IG9ubHkgVHggdHJhbnNmZXIpIChUaGlzIGNhbGxiYWNrCisgKiBpcyBleGVjdXRlZCBhdCBlbmQgb2YgRE1BIFR4IEFib3J0IHByb2NlZHVyZSBmb2xsb3dpbmcgdXNlciBhYm9ydCByZXF1ZXN0LAorICogICAgICAgICBhbmQgbGVhZHMgdG8gdXNlciBUeCBBYm9ydCBDb21wbGV0ZSBjYWxsYmFjayBleGVjdXRpb24pLgorICogQHBhcmFtICBoZG1hIERNQSBoYW5kbGUuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworc3RhdGljIHZvaWQgVUFSVF9ETUFUeE9ubHlBYm9ydENhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKSB7CisgIFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQgPSAoVUFSVF9IYW5kbGVUeXBlRGVmICopKGhkbWEtPlBhcmVudCk7CisKKyAgaHVhcnQtPlR4WGZlckNvdW50ID0gMFU7CisKKyAgLyogRmx1c2ggdGhlIHdob2xlIFRYIEZJRk8gKGlmIG5lZWRlZCkgKi8KKyAgaWYgKGh1YXJ0LT5GaWZvTW9kZSA9PSBVQVJUX0ZJRk9NT0RFX0VOQUJMRSkgeworICAgIF9fSEFMX1VBUlRfU0VORF9SRVEoaHVhcnQsIFVBUlRfVFhEQVRBX0ZMVVNIX1JFUVVFU1QpOworICB9CisKKyAgLyogUmVzdG9yZSBodWFydC0+Z1N0YXRlIHRvIFJlYWR5ICovCisgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKworICAvKiBDYWxsIHVzZXIgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAvKiBDYWxsIHJlZ2lzdGVyZWQgQWJvcnQgVHJhbnNtaXQgQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgaHVhcnQtPkFib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2soaHVhcnQpOworI2Vsc2UKKyAgLyogQ2FsbCBsZWdhY3kgd2VhayBBYm9ydCBUcmFuc21pdCBDb21wbGV0ZSBDYWxsYmFjayAqLworICBIQUxfVUFSVF9BYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrKGh1YXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9CisKKy8qKgorICogQGJyaWVmICBETUEgVUFSVCBSeCBjb21tdW5pY2F0aW9uIGFib3J0IGNhbGxiYWNrLCB3aGVuIGluaXRpYXRlZCBieSB1c2VyIGJ5IGEKKyAqIGNhbGwgdG8gSEFMX1VBUlRfQWJvcnRSZWNlaXZlX0lUIEFQSSAoQWJvcnQgb25seSBSeCB0cmFuc2ZlcikgKFRoaXMgY2FsbGJhY2sKKyAqIGlzIGV4ZWN1dGVkIGF0IGVuZCBvZiBETUEgUnggQWJvcnQgcHJvY2VkdXJlIGZvbGxvd2luZyB1c2VyIGFib3J0IHJlcXVlc3QsCisgKiAgICAgICAgIGFuZCBsZWFkcyB0byB1c2VyIFJ4IEFib3J0IENvbXBsZXRlIGNhbGxiYWNrIGV4ZWN1dGlvbikuCisgKiBAcGFyYW0gIGhkbWEgRE1BIGhhbmRsZS4KKyAqIEByZXR2YWwgTm9uZQorICovCitzdGF0aWMgdm9pZCBVQVJUX0RNQVJ4T25seUFib3J0Q2FsbGJhY2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpIHsKKyAgVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCA9CisgICAgICAoVUFSVF9IYW5kbGVUeXBlRGVmICopKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQ7CisKKyAgaHVhcnQtPlJ4WGZlckNvdW50ID0gMFU7CisKKyAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KKyAgX19IQUxfVUFSVF9DTEVBUl9GTEFHKGh1YXJ0LCBVQVJUX0NMRUFSX09SRUYgfCBVQVJUX0NMRUFSX05FRiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVBUlRfQ0xFQVJfUEVGIHwgVUFSVF9DTEVBUl9GRUYpOworCisgIC8qIERpc2NhcmQgdGhlIHJlY2VpdmVkIGRhdGEgKi8KKyAgX19IQUxfVUFSVF9TRU5EX1JFUShodWFydCwgVUFSVF9SWERBVEFfRkxVU0hfUkVRVUVTVCk7CisKKyAgLyogUmVzdG9yZSBodWFydC0+UnhTdGF0ZSB0byBSZWFkeSAqLworICBodWFydC0+UnhTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworICBodWFydC0+UmVjZXB0aW9uVHlwZSA9IEhBTF9VQVJUX1JFQ0VQVElPTl9TVEFOREFSRDsKKworICAvKiBDYWxsIHVzZXIgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAvKiBDYWxsIHJlZ2lzdGVyZWQgQWJvcnQgUmVjZWl2ZSBDb21wbGV0ZSBDYWxsYmFjayAqLworICBodWFydC0+QWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrKGh1YXJ0KTsKKyNlbHNlCisgIC8qIENhbGwgbGVnYWN5IHdlYWsgQWJvcnQgUmVjZWl2ZSBDb21wbGV0ZSBDYWxsYmFjayAqLworICBIQUxfVUFSVF9BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2soaHVhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30KKworLyoqCisgKiBAYnJpZWYgVFggaW50ZXJydXB0IGhhbmRsZXIgZm9yIDcgb3IgOCBiaXRzIGRhdGEgd29yZCBsZW5ndGggLgorICogQG5vdGUgICBGdW5jdGlvbiBpcyBjYWxsZWQgdW5kZXIgaW50ZXJydXB0aW9uIG9ubHksIG9uY2UKKyAqICAgICAgICAgaW50ZXJydXB0aW9ucyBoYXZlIGJlZW4gZW5hYmxlZCBieSBIQUxfVUFSVF9UcmFuc21pdF9JVCgpLgorICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICogQHJldHZhbCBOb25lCisgKi8KK3N0YXRpYyB2b2lkIFVBUlRfVHhJU1JfOEJJVChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KSB7CisgIC8qIENoZWNrIHRoYXQgYSBUeCBwcm9jZXNzIGlzIG9uZ29pbmcgKi8KKyAgaWYgKGh1YXJ0LT5nU3RhdGUgPT0gSEFMX1VBUlRfU1RBVEVfQlVTWV9UWCkgeworICAgIGlmIChodWFydC0+VHhYZmVyQ291bnQgPT0gMFUpIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFVBUlQgVHJhbnNtaXQgRGF0YSBSZWdpc3RlciBFbXB0eSBJbnRlcnJ1cHQgKi8KKyAgICAgIEFUT01JQ19DTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9UWEVJRV9UWEZORklFKTsKKworICAgICAgLyogRW5hYmxlIHRoZSBVQVJUIFRyYW5zbWl0IENvbXBsZXRlIEludGVycnVwdCAqLworICAgICAgQVRPTUlDX1NFVF9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9UQ0lFKTsKKyAgICB9IGVsc2UgeworICAgICAgaHVhcnQtPkluc3RhbmNlLT5URFIgPSAodWludDhfdCkoKmh1YXJ0LT5wVHhCdWZmUHRyICYgKHVpbnQ4X3QpMHhGRik7CisgICAgICBodWFydC0+cFR4QnVmZlB0cisrOworICAgICAgaHVhcnQtPlR4WGZlckNvdW50LS07CisgICAgfQorICB9Cit9CisKKy8qKgorICogQGJyaWVmIFRYIGludGVycnVwdCBoYW5kbGVyIGZvciA5IGJpdHMgZGF0YSB3b3JkIGxlbmd0aC4KKyAqIEBub3RlICAgRnVuY3Rpb24gaXMgY2FsbGVkIHVuZGVyIGludGVycnVwdGlvbiBvbmx5LCBvbmNlCisgKiAgICAgICAgIGludGVycnVwdGlvbnMgaGF2ZSBiZWVuIGVuYWJsZWQgYnkgSEFMX1VBUlRfVHJhbnNtaXRfSVQoKS4KKyAqIEBwYXJhbSBodWFydCBVQVJUIGhhbmRsZS4KKyAqIEByZXR2YWwgTm9uZQorICovCitzdGF0aWMgdm9pZCBVQVJUX1R4SVNSXzE2QklUKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpIHsKKyAgY29uc3QgdWludDE2X3QgKnRtcDsKKworICAvKiBDaGVjayB0aGF0IGEgVHggcHJvY2VzcyBpcyBvbmdvaW5nICovCisgIGlmIChodWFydC0+Z1N0YXRlID09IEhBTF9VQVJUX1NUQVRFX0JVU1lfVFgpIHsKKyAgICBpZiAoaHVhcnQtPlR4WGZlckNvdW50ID09IDBVKSB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBVQVJUIFRyYW5zbWl0IERhdGEgUmVnaXN0ZXIgRW1wdHkgSW50ZXJydXB0ICovCisgICAgICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVFhFSUVfVFhGTkZJRSk7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgVUFSVCBUcmFuc21pdCBDb21wbGV0ZSBJbnRlcnJ1cHQgKi8KKyAgICAgIEFUT01JQ19TRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVENJRSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRtcCA9IChjb25zdCB1aW50MTZfdCAqKWh1YXJ0LT5wVHhCdWZmUHRyOworICAgICAgaHVhcnQtPkluc3RhbmNlLT5URFIgPSAoKCh1aW50MzJfdCkoKnRtcCkpICYgMHgwMUZGVUwpOworICAgICAgaHVhcnQtPnBUeEJ1ZmZQdHIgKz0gMlU7CisgICAgICBodWFydC0+VHhYZmVyQ291bnQtLTsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBAYnJpZWYgVFggaW50ZXJydXB0IGhhbmRsZXIgZm9yIDcgb3IgOCBiaXRzIGRhdGEgd29yZCBsZW5ndGggYW5kIEZJRk8gbW9kZSBpcworICogZW5hYmxlZC4KKyAqIEBub3RlICAgRnVuY3Rpb24gaXMgY2FsbGVkIHVuZGVyIGludGVycnVwdGlvbiBvbmx5LCBvbmNlCisgKiAgICAgICAgIGludGVycnVwdGlvbnMgaGF2ZSBiZWVuIGVuYWJsZWQgYnkgSEFMX1VBUlRfVHJhbnNtaXRfSVQoKS4KKyAqIEBwYXJhbSBodWFydCBVQVJUIGhhbmRsZS4KKyAqIEByZXR2YWwgTm9uZQorICovCitzdGF0aWMgdm9pZCBVQVJUX1R4SVNSXzhCSVRfRklGT0VOKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpIHsKKyAgdWludDE2X3QgbmJfdHhfZGF0YTsKKworICAvKiBDaGVjayB0aGF0IGEgVHggcHJvY2VzcyBpcyBvbmdvaW5nICovCisgIGlmIChodWFydC0+Z1N0YXRlID09IEhBTF9VQVJUX1NUQVRFX0JVU1lfVFgpIHsKKyAgICBmb3IgKG5iX3R4X2RhdGEgPSBodWFydC0+TmJUeERhdGFUb1Byb2Nlc3M7IG5iX3R4X2RhdGEgPiAwVTsgbmJfdHhfZGF0YS0tKSB7CisgICAgICBpZiAoaHVhcnQtPlR4WGZlckNvdW50ID09IDBVKSB7CisgICAgICAgIC8qIERpc2FibGUgdGhlIFRYIEZJRk8gdGhyZXNob2xkIGludGVycnVwdCAqLworICAgICAgICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfVFhGVElFKTsKKworICAgICAgICAvKiBFbmFibGUgdGhlIFVBUlQgVHJhbnNtaXQgQ29tcGxldGUgSW50ZXJydXB0ICovCisgICAgICAgIEFUT01JQ19TRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVENJRSk7CisKKyAgICAgICAgYnJlYWs7IC8qIGZvcmNlIGV4aXQgbG9vcCAqLworICAgICAgfSBlbHNlIGlmIChSRUFEX0JJVChodWFydC0+SW5zdGFuY2UtPklTUiwgVVNBUlRfSVNSX1RYRV9UWEZORikgIT0gMFUpIHsKKyAgICAgICAgaHVhcnQtPkluc3RhbmNlLT5URFIgPSAodWludDhfdCkoKmh1YXJ0LT5wVHhCdWZmUHRyICYgKHVpbnQ4X3QpMHhGRik7CisgICAgICAgIGh1YXJ0LT5wVHhCdWZmUHRyKys7CisgICAgICAgIGh1YXJ0LT5UeFhmZXJDb3VudC0tOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogTm90aGluZyB0byBkbyAqLworICAgICAgfQorICAgIH0KKyAgfQorfQorCisvKioKKyAqIEBicmllZiBUWCBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgOSBiaXRzIGRhdGEgd29yZCBsZW5ndGggYW5kIEZJRk8gbW9kZSBpcworICogZW5hYmxlZC4KKyAqIEBub3RlICAgRnVuY3Rpb24gaXMgY2FsbGVkIHVuZGVyIGludGVycnVwdGlvbiBvbmx5LCBvbmNlCisgKiAgICAgICAgIGludGVycnVwdGlvbnMgaGF2ZSBiZWVuIGVuYWJsZWQgYnkgSEFMX1VBUlRfVHJhbnNtaXRfSVQoKS4KKyAqIEBwYXJhbSBodWFydCBVQVJUIGhhbmRsZS4KKyAqIEByZXR2YWwgTm9uZQorICovCitzdGF0aWMgdm9pZCBVQVJUX1R4SVNSXzE2QklUX0ZJRk9FTihVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KSB7CisgIGNvbnN0IHVpbnQxNl90ICp0bXA7CisgIHVpbnQxNl90IG5iX3R4X2RhdGE7CisKKyAgLyogQ2hlY2sgdGhhdCBhIFR4IHByb2Nlc3MgaXMgb25nb2luZyAqLworICBpZiAoaHVhcnQtPmdTdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9CVVNZX1RYKSB7CisgICAgZm9yIChuYl90eF9kYXRhID0gaHVhcnQtPk5iVHhEYXRhVG9Qcm9jZXNzOyBuYl90eF9kYXRhID4gMFU7IG5iX3R4X2RhdGEtLSkgeworICAgICAgaWYgKGh1YXJ0LT5UeFhmZXJDb3VudCA9PSAwVSkgeworICAgICAgICAvKiBEaXNhYmxlIHRoZSBUWCBGSUZPIHRocmVzaG9sZCBpbnRlcnJ1cHQgKi8KKyAgICAgICAgQVRPTUlDX0NMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX1RYRlRJRSk7CisKKyAgICAgICAgLyogRW5hYmxlIHRoZSBVQVJUIFRyYW5zbWl0IENvbXBsZXRlIEludGVycnVwdCAqLworICAgICAgICBBVE9NSUNfU0VUX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1RDSUUpOworCisgICAgICAgIGJyZWFrOyAvKiBmb3JjZSBleGl0IGxvb3AgKi8KKyAgICAgIH0gZWxzZSBpZiAoUkVBRF9CSVQoaHVhcnQtPkluc3RhbmNlLT5JU1IsIFVTQVJUX0lTUl9UWEVfVFhGTkYpICE9IDBVKSB7CisgICAgICAgIHRtcCA9IChjb25zdCB1aW50MTZfdCAqKWh1YXJ0LT5wVHhCdWZmUHRyOworICAgICAgICBodWFydC0+SW5zdGFuY2UtPlREUiA9ICgoKHVpbnQzMl90KSgqdG1wKSkgJiAweDAxRkZVTCk7CisgICAgICAgIGh1YXJ0LT5wVHhCdWZmUHRyICs9IDJVOworICAgICAgICBodWFydC0+VHhYZmVyQ291bnQtLTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworLyoqCisgKiBAYnJpZWYgIFdyYXAgdXAgdHJhbnNtaXNzaW9uIGluIG5vbi1ibG9ja2luZyBtb2RlLgorICogQHBhcmFtICBodWFydCBwb2ludGVyIHRvIGEgVUFSVF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBVQVJUIG1vZHVsZS4KKyAqIEByZXR2YWwgTm9uZQorICovCitzdGF0aWMgdm9pZCBVQVJUX0VuZFRyYW5zbWl0X0lUKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpIHsKKyAgLyogRGlzYWJsZSB0aGUgVUFSVCBUcmFuc21pdCBDb21wbGV0ZSBJbnRlcnJ1cHQgKi8KKyAgQVRPTUlDX0NMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1RDSUUpOworCisgIC8qIFR4IHByb2Nlc3MgaXMgZW5kZWQsIHJlc3RvcmUgaHVhcnQtPmdTdGF0ZSB0byBSZWFkeSAqLworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisKKyAgLyogQ2xlYXQgVHhJU1IgZnVuY3Rpb24gcG9pbnRlciAqLworICBodWFydC0+VHhJU1IgPSBOVUxMOworCisjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgLypDYWxsIHJlZ2lzdGVyZWQgVHggY29tcGxldGUgY2FsbGJhY2sqLworICBodWFydC0+VHhDcGx0Q2FsbGJhY2soaHVhcnQpOworI2Vsc2UKKyAgLypDYWxsIGxlZ2FjeSB3ZWFrIFR4IGNvbXBsZXRlIGNhbGxiYWNrKi8KKyAgSEFMX1VBUlRfVHhDcGx0Q2FsbGJhY2soaHVhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30KKworLyoqCisgKiBAYnJpZWYgUlggaW50ZXJydXB0IGhhbmRsZXIgZm9yIDcgb3IgOCBiaXRzIGRhdGEgd29yZCBsZW5ndGggLgorICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICogQHJldHZhbCBOb25lCisgKi8KK3N0YXRpYyB2b2lkIFVBUlRfUnhJU1JfOEJJVChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KSB7CisgIHVpbnQxNl90IHVoTWFzayA9IGh1YXJ0LT5NYXNrOworICB1aW50MTZfdCB1aGRhdGE7CisKKyAgLyogQ2hlY2sgdGhhdCBhIFJ4IHByb2Nlc3MgaXMgb25nb2luZyAqLworICBpZiAoaHVhcnQtPlJ4U3RhdGUgPT0gSEFMX1VBUlRfU1RBVEVfQlVTWV9SWCkgeworICAgIHVoZGF0YSA9ICh1aW50MTZfdClSRUFEX1JFRyhodWFydC0+SW5zdGFuY2UtPlJEUik7CisgICAgKmh1YXJ0LT5wUnhCdWZmUHRyID0gKHVpbnQ4X3QpKHVoZGF0YSAmICh1aW50OF90KXVoTWFzayk7CisgICAgaHVhcnQtPnBSeEJ1ZmZQdHIrKzsKKyAgICBodWFydC0+UnhYZmVyQ291bnQtLTsKKworICAgIGlmIChodWFydC0+UnhYZmVyQ291bnQgPT0gMFUpIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFVBUlQgUGFyaXR5IEVycm9yIEludGVycnVwdCBhbmQgUlhORSBpbnRlcnJ1cHRzICovCisgICAgICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLAorICAgICAgICAgICAgICAgICAgICAgICAoVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFIHwgVVNBUlRfQ1IxX1BFSUUpKTsKKworICAgICAgLyogRGlzYWJsZSB0aGUgVUFSVCBFcnJvciBJbnRlcnJ1cHQ6IChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4KKyAgICAgICAqIGVycm9yKSAqLworICAgICAgQVRPTUlDX0NMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgICAgIC8qIFJ4IHByb2Nlc3MgaXMgY29tcGxldGVkLCByZXN0b3JlIGh1YXJ0LT5SeFN0YXRlIHRvIFJlYWR5ICovCisgICAgICBodWFydC0+UnhTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworCisgICAgICAvKiBDbGVhciBSeElTUiBmdW5jdGlvbiBwb2ludGVyICovCisgICAgICBodWFydC0+UnhJU1IgPSBOVUxMOworCisgICAgICAvKiBJbml0aWFsaXplIHR5cGUgb2YgUnhFdmVudCB0byBUcmFuc2ZlciBDb21wbGV0ZSAqLworICAgICAgaHVhcnQtPlJ4RXZlbnRUeXBlID0gSEFMX1VBUlRfUlhFVkVOVF9UQzsKKworICAgICAgaWYgKCEoSVNfTFBVQVJUX0lOU1RBTkNFKGh1YXJ0LT5JbnN0YW5jZSkpKSB7CisgICAgICAgIC8qIENoZWNrIHRoYXQgVVNBUlQgUlRPRU4gYml0IGlzIHNldCAqLworICAgICAgICBpZiAoUkVBRF9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjIsIFVTQVJUX0NSMl9SVE9FTikgIT0gMFUpIHsKKyAgICAgICAgICAvKiBFbmFibGUgdGhlIFVBUlQgUmVjZWl2ZXIgVGltZW91dCBJbnRlcnJ1cHQgKi8KKyAgICAgICAgICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUlRPSUUpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIENoZWNrIGN1cnJlbnQgcmVjZXB0aW9uIE1vZGUgOgorICAgICAgICAgSWYgUmVjZXB0aW9uIHRpbGwgSURMRSBldmVudCBoYXMgYmVlbiBzZWxlY3RlZCA6ICovCisgICAgICBpZiAoaHVhcnQtPlJlY2VwdGlvblR5cGUgPT0gSEFMX1VBUlRfUkVDRVBUSU9OX1RPSURMRSkgeworICAgICAgICAvKiBTZXQgcmVjZXB0aW9uIHR5cGUgdG8gU3RhbmRhcmQgKi8KKyAgICAgICAgaHVhcnQtPlJlY2VwdGlvblR5cGUgPSBIQUxfVUFSVF9SRUNFUFRJT05fU1RBTkRBUkQ7CisKKyAgICAgICAgLyogRGlzYWJsZSBJRExFIGludGVycnVwdCAqLworICAgICAgICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfSURMRUlFKTsKKworICAgICAgICBpZiAoX19IQUxfVUFSVF9HRVRfRkxBRyhodWFydCwgVUFSVF9GTEFHX0lETEUpID09IFNFVCkgeworICAgICAgICAgIC8qIENsZWFyIElETEUgRmxhZyAqLworICAgICAgICAgIF9fSEFMX1VBUlRfQ0xFQVJfRkxBRyhodWFydCwgVUFSVF9DTEVBUl9JRExFRik7CisgICAgICAgIH0KKworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIFJ4IEV2ZW50IGNhbGxiYWNrKi8KKyAgICAgICAgaHVhcnQtPlJ4RXZlbnRDYWxsYmFjayhodWFydCwgaHVhcnQtPlJ4WGZlclNpemUpOworI2Vsc2UKKyAgICAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIFJ4IEV2ZW50IGNhbGxiYWNrKi8KKyAgICAgICAgSEFMX1VBUlRFeF9SeEV2ZW50Q2FsbGJhY2soaHVhcnQsIGh1YXJ0LT5SeFhmZXJTaXplKTsKKyNlbmRpZiAvKiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUykgKi8KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFN0YW5kYXJkIHJlY2VwdGlvbiBBUEkgY2FsbGVkICovCisjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgLypDYWxsIHJlZ2lzdGVyZWQgUnggY29tcGxldGUgY2FsbGJhY2sqLworICAgICAgICBodWFydC0+UnhDcGx0Q2FsbGJhY2soaHVhcnQpOworI2Vsc2UKKyAgICAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIFJ4IGNvbXBsZXRlIGNhbGxiYWNrKi8KKyAgICAgICAgSEFMX1VBUlRfUnhDcGx0Q2FsbGJhY2soaHVhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyogQ2xlYXIgUlhORSBpbnRlcnJ1cHQgZmxhZyAqLworICAgIF9fSEFMX1VBUlRfU0VORF9SRVEoaHVhcnQsIFVBUlRfUlhEQVRBX0ZMVVNIX1JFUVVFU1QpOworICB9Cit9CisKKy8qKgorICogQGJyaWVmIFJYIGludGVycnVwdCBoYW5kbGVyIGZvciA5IGJpdHMgZGF0YSB3b3JkIGxlbmd0aCAuCisgKiBAbm90ZSAgIEZ1bmN0aW9uIGlzIGNhbGxlZCB1bmRlciBpbnRlcnJ1cHRpb24gb25seSwgb25jZQorICogICAgICAgICBpbnRlcnJ1cHRpb25zIGhhdmUgYmVlbiBlbmFibGVkIGJ5IEhBTF9VQVJUX1JlY2VpdmVfSVQoKQorICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICogQHJldHZhbCBOb25lCisgKi8KK3N0YXRpYyB2b2lkIFVBUlRfUnhJU1JfMTZCSVQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkgeworICB1aW50MTZfdCAqdG1wOworICB1aW50MTZfdCB1aE1hc2sgPSBodWFydC0+TWFzazsKKyAgdWludDE2X3QgdWhkYXRhOworCisgIC8qIENoZWNrIHRoYXQgYSBSeCBwcm9jZXNzIGlzIG9uZ29pbmcgKi8KKyAgaWYgKGh1YXJ0LT5SeFN0YXRlID09IEhBTF9VQVJUX1NUQVRFX0JVU1lfUlgpIHsKKyAgICB1aGRhdGEgPSAodWludDE2X3QpUkVBRF9SRUcoaHVhcnQtPkluc3RhbmNlLT5SRFIpOworICAgIHRtcCA9ICh1aW50MTZfdCAqKWh1YXJ0LT5wUnhCdWZmUHRyOworICAgICp0bXAgPSAodWludDE2X3QpKHVoZGF0YSAmIHVoTWFzayk7CisgICAgaHVhcnQtPnBSeEJ1ZmZQdHIgKz0gMlU7CisgICAgaHVhcnQtPlJ4WGZlckNvdW50LS07CisKKyAgICBpZiAoaHVhcnQtPlJ4WGZlckNvdW50ID09IDBVKSB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBVQVJUIFBhcml0eSBFcnJvciBJbnRlcnJ1cHQgYW5kIFJYTkUgaW50ZXJydXB0Ki8KKyAgICAgIEFUT01JQ19DTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsCisgICAgICAgICAgICAgICAgICAgICAgIChVU0FSVF9DUjFfUlhORUlFX1JYRk5FSUUgfCBVU0FSVF9DUjFfUEVJRSkpOworCisgICAgICAvKiBEaXNhYmxlIHRoZSBVQVJUIEVycm9yIEludGVycnVwdDogKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1bgorICAgICAgICogZXJyb3IpICovCisgICAgICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKworICAgICAgLyogUnggcHJvY2VzcyBpcyBjb21wbGV0ZWQsIHJlc3RvcmUgaHVhcnQtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgICAgIGh1YXJ0LT5SeFN0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisKKyAgICAgIC8qIENsZWFyIFJ4SVNSIGZ1bmN0aW9uIHBvaW50ZXIgKi8KKyAgICAgIGh1YXJ0LT5SeElTUiA9IE5VTEw7CisKKyAgICAgIC8qIEluaXRpYWxpemUgdHlwZSBvZiBSeEV2ZW50IHRvIFRyYW5zZmVyIENvbXBsZXRlICovCisgICAgICBodWFydC0+UnhFdmVudFR5cGUgPSBIQUxfVUFSVF9SWEVWRU5UX1RDOworCisgICAgICBpZiAoIShJU19MUFVBUlRfSU5TVEFOQ0UoaHVhcnQtPkluc3RhbmNlKSkpIHsKKyAgICAgICAgLyogQ2hlY2sgdGhhdCBVU0FSVCBSVE9FTiBiaXQgaXMgc2V0ICovCisgICAgICAgIGlmIChSRUFEX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX1JUT0VOKSAhPSAwVSkgeworICAgICAgICAgIC8qIEVuYWJsZSB0aGUgVUFSVCBSZWNlaXZlciBUaW1lb3V0IEludGVycnVwdCAqLworICAgICAgICAgIEFUT01JQ19DTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9SVE9JRSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogQ2hlY2sgY3VycmVudCByZWNlcHRpb24gTW9kZSA6CisgICAgICAgICBJZiBSZWNlcHRpb24gdGlsbCBJRExFIGV2ZW50IGhhcyBiZWVuIHNlbGVjdGVkIDogKi8KKyAgICAgIGlmIChodWFydC0+UmVjZXB0aW9uVHlwZSA9PSBIQUxfVUFSVF9SRUNFUFRJT05fVE9JRExFKSB7CisgICAgICAgIC8qIFNldCByZWNlcHRpb24gdHlwZSB0byBTdGFuZGFyZCAqLworICAgICAgICBodWFydC0+UmVjZXB0aW9uVHlwZSA9IEhBTF9VQVJUX1JFQ0VQVElPTl9TVEFOREFSRDsKKworICAgICAgICAvKiBEaXNhYmxlIElETEUgaW50ZXJydXB0ICovCisgICAgICAgIEFUT01JQ19DTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9JRExFSUUpOworCisgICAgICAgIGlmIChfX0hBTF9VQVJUX0dFVF9GTEFHKGh1YXJ0LCBVQVJUX0ZMQUdfSURMRSkgPT0gU0VUKSB7CisgICAgICAgICAgLyogQ2xlYXIgSURMRSBGbGFnICovCisgICAgICAgICAgX19IQUxfVUFSVF9DTEVBUl9GTEFHKGh1YXJ0LCBVQVJUX0NMRUFSX0lETEVGKTsKKyAgICAgICAgfQorCisjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgLypDYWxsIHJlZ2lzdGVyZWQgUnggRXZlbnQgY2FsbGJhY2sqLworICAgICAgICBodWFydC0+UnhFdmVudENhbGxiYWNrKGh1YXJ0LCBodWFydC0+UnhYZmVyU2l6ZSk7CisjZWxzZQorICAgICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgUnggRXZlbnQgY2FsbGJhY2sqLworICAgICAgICBIQUxfVUFSVEV4X1J4RXZlbnRDYWxsYmFjayhodWFydCwgaHVhcnQtPlJ4WGZlclNpemUpOworI2VuZGlmIC8qIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTKSAqLworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogU3RhbmRhcmQgcmVjZXB0aW9uIEFQSSBjYWxsZWQgKi8KKyNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBSeCBjb21wbGV0ZSBjYWxsYmFjayovCisgICAgICAgIGh1YXJ0LT5SeENwbHRDYWxsYmFjayhodWFydCk7CisjZWxzZQorICAgICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgUnggY29tcGxldGUgY2FsbGJhY2sqLworICAgICAgICBIQUxfVUFSVF9SeENwbHRDYWxsYmFjayhodWFydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiBDbGVhciBSWE5FIGludGVycnVwdCBmbGFnICovCisgICAgX19IQUxfVUFSVF9TRU5EX1JFUShodWFydCwgVUFSVF9SWERBVEFfRkxVU0hfUkVRVUVTVCk7CisgIH0KK30KKworLyoqCisgKiBAYnJpZWYgUlggaW50ZXJydXB0IGhhbmRsZXIgZm9yIDcgb3IgOCAgYml0cyBkYXRhIHdvcmQgbGVuZ3RoIGFuZCBGSUZPIG1vZGUKKyAqIGlzIGVuYWJsZWQuCisgKiBAbm90ZSAgIEZ1bmN0aW9uIGlzIGNhbGxlZCB1bmRlciBpbnRlcnJ1cHRpb24gb25seSwgb25jZQorICogICAgICAgICBpbnRlcnJ1cHRpb25zIGhhdmUgYmVlbiBlbmFibGVkIGJ5IEhBTF9VQVJUX1JlY2VpdmVfSVQoKQorICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICogQHJldHZhbCBOb25lCisgKi8KK3N0YXRpYyB2b2lkIFVBUlRfUnhJU1JfOEJJVF9GSUZPRU4oVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkgeworICB1aW50MTZfdCB1aE1hc2sgPSBodWFydC0+TWFzazsKKyAgdWludDE2X3QgdWhkYXRhOworICB1aW50MTZfdCBuYl9yeF9kYXRhOworICB1aW50MTZfdCByeGRhdGFjb3VudDsKKyAgdWludDMyX3QgaXNyZmxhZ3MgPSBSRUFEX1JFRyhodWFydC0+SW5zdGFuY2UtPklTUik7CisgIHVpbnQzMl90IGNyMWl0cyA9IFJFQURfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxKTsKKyAgdWludDMyX3QgY3IzaXRzID0gUkVBRF9SRUcoaHVhcnQtPkluc3RhbmNlLT5DUjMpOworCisgIC8qIENoZWNrIHRoYXQgYSBSeCBwcm9jZXNzIGlzIG9uZ29pbmcgKi8KKyAgaWYgKGh1YXJ0LT5SeFN0YXRlID09IEhBTF9VQVJUX1NUQVRFX0JVU1lfUlgpIHsKKyAgICBuYl9yeF9kYXRhID0gaHVhcnQtPk5iUnhEYXRhVG9Qcm9jZXNzOworICAgIHdoaWxlICgobmJfcnhfZGF0YSA+IDBVKSAmJiAoKGlzcmZsYWdzICYgVVNBUlRfSVNSX1JYTkVfUlhGTkUpICE9IDBVKSkgeworICAgICAgdWhkYXRhID0gKHVpbnQxNl90KVJFQURfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+UkRSKTsKKyAgICAgICpodWFydC0+cFJ4QnVmZlB0ciA9ICh1aW50OF90KSh1aGRhdGEgJiAodWludDhfdCl1aE1hc2spOworICAgICAgaHVhcnQtPnBSeEJ1ZmZQdHIrKzsKKyAgICAgIGh1YXJ0LT5SeFhmZXJDb3VudC0tOworICAgICAgaXNyZmxhZ3MgPSBSRUFEX1JFRyhodWFydC0+SW5zdGFuY2UtPklTUik7CisKKyAgICAgIC8qIElmIHNvbWUgbm9uIGJsb2NraW5nIGVycm9ycyBvY2N1cnJlZCAqLworICAgICAgaWYgKChpc3JmbGFncyAmIChVU0FSVF9JU1JfUEUgfCBVU0FSVF9JU1JfRkUgfCBVU0FSVF9JU1JfTkUpKSAhPSAwVSkgeworICAgICAgICAvKiBVQVJUIHBhcml0eSBlcnJvciBpbnRlcnJ1cHQgb2NjdXJyZWQKKyAgICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgICAgIGlmICgoKGlzcmZsYWdzICYgVVNBUlRfSVNSX1BFKSAhPSAwVSkgJiYKKyAgICAgICAgICAgICgoY3IxaXRzICYgVVNBUlRfQ1IxX1BFSUUpICE9IDBVKSkgeworICAgICAgICAgIF9fSEFMX1VBUlRfQ0xFQVJfRkxBRyhodWFydCwgVUFSVF9DTEVBUl9QRUYpOworCisgICAgICAgICAgaHVhcnQtPkVycm9yQ29kZSB8PSBIQUxfVUFSVF9FUlJPUl9QRTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFVBUlQgZnJhbWUgZXJyb3IgaW50ZXJydXB0IG9jY3VycmVkCisgICAgICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAgICAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfRkUpICE9IDBVKSAmJgorICAgICAgICAgICAgKChjcjNpdHMgJiBVU0FSVF9DUjNfRUlFKSAhPSAwVSkpIHsKKyAgICAgICAgICBfX0hBTF9VQVJUX0NMRUFSX0ZMQUcoaHVhcnQsIFVBUlRfQ0xFQVJfRkVGKTsKKworICAgICAgICAgIGh1YXJ0LT5FcnJvckNvZGUgfD0gSEFMX1VBUlRfRVJST1JfRkU7CisgICAgICAgIH0KKworICAgICAgICAvKiBVQVJUIG5vaXNlIGVycm9yIGludGVycnVwdCBvY2N1cnJlZAorICAgICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgICAgIGlmICgoKGlzcmZsYWdzICYgVVNBUlRfSVNSX05FKSAhPSAwVSkgJiYKKyAgICAgICAgICAgICgoY3IzaXRzICYgVVNBUlRfQ1IzX0VJRSkgIT0gMFUpKSB7CisgICAgICAgICAgX19IQUxfVUFSVF9DTEVBUl9GTEFHKGh1YXJ0LCBVQVJUX0NMRUFSX05FRik7CisKKyAgICAgICAgICBodWFydC0+RXJyb3JDb2RlIHw9IEhBTF9VQVJUX0VSUk9SX05FOworICAgICAgICB9CisKKyAgICAgICAgLyogQ2FsbCBVQVJUIEVycm9yIENhbGwgYmFjayBmdW5jdGlvbiBpZiBuZWVkIGJlCisgICAgICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgICAgICBpZiAoaHVhcnQtPkVycm9yQ29kZSAhPSBIQUxfVUFSVF9FUlJPUl9OT05FKSB7CisgICAgICAgICAgLyogTm9uIEJsb2NraW5nIGVycm9yIDogdHJhbnNmZXIgY291bGQgZ28gb24uCisgICAgICAgICAgRXJyb3IgaXMgbm90aWZpZWQgdG8gdXNlciB0aHJvdWdoIHVzZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIGVycm9yIGNhbGxiYWNrKi8KKyAgICAgICAgICBodWFydC0+RXJyb3JDYWxsYmFjayhodWFydCk7CisjZWxzZQorICAgICAgICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBlcnJvciBjYWxsYmFjayovCisgICAgICAgICAgSEFMX1VBUlRfRXJyb3JDYWxsYmFjayhodWFydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgICAgIGh1YXJ0LT5FcnJvckNvZGUgPSBIQUxfVUFSVF9FUlJPUl9OT05FOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChodWFydC0+UnhYZmVyQ291bnQgPT0gMFUpIHsKKyAgICAgICAgLyogRGlzYWJsZSB0aGUgVUFSVCBQYXJpdHkgRXJyb3IgSW50ZXJydXB0IGFuZCBSWEZUIGludGVycnVwdCovCisgICAgICAgIEFUT01JQ19DTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9QRUlFKTsKKworICAgICAgICAvKiBEaXNhYmxlIHRoZSBVQVJUIEVycm9yIEludGVycnVwdDogKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1bgorICAgICAgICAgICBlcnJvcikgYW5kIFJYIEZJRk8gVGhyZXNob2xkIGludGVycnVwdCAqLworICAgICAgICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLAorICAgICAgICAgICAgICAgICAgICAgICAgIChVU0FSVF9DUjNfRUlFIHwgVVNBUlRfQ1IzX1JYRlRJRSkpOworCisgICAgICAgIC8qIFJ4IHByb2Nlc3MgaXMgY29tcGxldGVkLCByZXN0b3JlIGh1YXJ0LT5SeFN0YXRlIHRvIFJlYWR5ICovCisgICAgICAgIGh1YXJ0LT5SeFN0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgLyogQ2xlYXIgUnhJU1IgZnVuY3Rpb24gcG9pbnRlciAqLworICAgICAgICBodWFydC0+UnhJU1IgPSBOVUxMOworCisgICAgICAgIC8qIEluaXRpYWxpemUgdHlwZSBvZiBSeEV2ZW50IHRvIFRyYW5zZmVyIENvbXBsZXRlICovCisgICAgICAgIGh1YXJ0LT5SeEV2ZW50VHlwZSA9IEhBTF9VQVJUX1JYRVZFTlRfVEM7CisKKyAgICAgICAgaWYgKCEoSVNfTFBVQVJUX0lOU1RBTkNFKGh1YXJ0LT5JbnN0YW5jZSkpKSB7CisgICAgICAgICAgLyogQ2hlY2sgdGhhdCBVU0FSVCBSVE9FTiBiaXQgaXMgc2V0ICovCisgICAgICAgICAgaWYgKFJFQURfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IyLCBVU0FSVF9DUjJfUlRPRU4pICE9IDBVKSB7CisgICAgICAgICAgICAvKiBFbmFibGUgdGhlIFVBUlQgUmVjZWl2ZXIgVGltZW91dCBJbnRlcnJ1cHQgKi8KKyAgICAgICAgICAgIEFUT01JQ19DTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9SVE9JRSk7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogQ2hlY2sgY3VycmVudCByZWNlcHRpb24gTW9kZSA6CisgICAgICAgICAgIElmIFJlY2VwdGlvbiB0aWxsIElETEUgZXZlbnQgaGFzIGJlZW4gc2VsZWN0ZWQgOiAqLworICAgICAgICBpZiAoaHVhcnQtPlJlY2VwdGlvblR5cGUgPT0gSEFMX1VBUlRfUkVDRVBUSU9OX1RPSURMRSkgeworICAgICAgICAgIC8qIFNldCByZWNlcHRpb24gdHlwZSB0byBTdGFuZGFyZCAqLworICAgICAgICAgIGh1YXJ0LT5SZWNlcHRpb25UeXBlID0gSEFMX1VBUlRfUkVDRVBUSU9OX1NUQU5EQVJEOworCisgICAgICAgICAgLyogRGlzYWJsZSBJRExFIGludGVycnVwdCAqLworICAgICAgICAgIEFUT01JQ19DTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9JRExFSUUpOworCisgICAgICAgICAgaWYgKF9fSEFMX1VBUlRfR0VUX0ZMQUcoaHVhcnQsIFVBUlRfRkxBR19JRExFKSA9PSBTRVQpIHsKKyAgICAgICAgICAgIC8qIENsZWFyIElETEUgRmxhZyAqLworICAgICAgICAgICAgX19IQUxfVUFSVF9DTEVBUl9GTEFHKGh1YXJ0LCBVQVJUX0NMRUFSX0lETEVGKTsKKyAgICAgICAgICB9CisKKyNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIFJ4IEV2ZW50IGNhbGxiYWNrKi8KKyAgICAgICAgICBodWFydC0+UnhFdmVudENhbGxiYWNrKGh1YXJ0LCBodWFydC0+UnhYZmVyU2l6ZSk7CisjZWxzZQorICAgICAgICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBSeCBFdmVudCBjYWxsYmFjayovCisgICAgICAgICAgSEFMX1VBUlRFeF9SeEV2ZW50Q2FsbGJhY2soaHVhcnQsIGh1YXJ0LT5SeFhmZXJTaXplKTsKKyNlbmRpZiAvKiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUykgKi8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvKiBTdGFuZGFyZCByZWNlcHRpb24gQVBJIGNhbGxlZCAqLworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgICAgLypDYWxsIHJlZ2lzdGVyZWQgUnggY29tcGxldGUgY2FsbGJhY2sqLworICAgICAgICAgIGh1YXJ0LT5SeENwbHRDYWxsYmFjayhodWFydCk7CisjZWxzZQorICAgICAgICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBSeCBjb21wbGV0ZSBjYWxsYmFjayovCisgICAgICAgICAgSEFMX1VBUlRfUnhDcGx0Q2FsbGJhY2soaHVhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBXaGVuIHJlbWFpbmluZyBudW1iZXIgb2YgYnl0ZXMgdG8gcmVjZWl2ZSBpcyBsZXNzIHRoYW4gdGhlIFJYIEZJRk8KKyAgICB0aHJlc2hvbGQsIG5leHQgaW5jb21pbmcgZnJhbWVzIGFyZSBwcm9jZXNzZWQgYXMgaWYgRklGTyBtb2RlIHdhcworICAgIGRpc2FibGVkIChpLmUuIG9uZSBpbnRlcnJ1cHQgcGVyIHJlY2VpdmVkIGZyYW1lKS4KKyAgICAqLworICAgIHJ4ZGF0YWNvdW50ID0gaHVhcnQtPlJ4WGZlckNvdW50OworICAgIGlmICgocnhkYXRhY291bnQgIT0gMFUpICYmIChyeGRhdGFjb3VudCA8IGh1YXJ0LT5OYlJ4RGF0YVRvUHJvY2VzcykpIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFVBUlQgUlhGVCBpbnRlcnJ1cHQqLworICAgICAgQVRPTUlDX0NMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX1JYRlRJRSk7CisKKyAgICAgIC8qIFVwZGF0ZSB0aGUgUnhJU1IgZnVuY3Rpb24gcG9pbnRlciAqLworICAgICAgaHVhcnQtPlJ4SVNSID0gVUFSVF9SeElTUl84QklUOworCisgICAgICAvKiBFbmFibGUgdGhlIFVBUlQgRGF0YSBSZWdpc3RlciBOb3QgRW1wdHkgaW50ZXJydXB0ICovCisgICAgICBBVE9NSUNfU0VUX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyogQ2xlYXIgUlhORSBpbnRlcnJ1cHQgZmxhZyAqLworICAgIF9fSEFMX1VBUlRfU0VORF9SRVEoaHVhcnQsIFVBUlRfUlhEQVRBX0ZMVVNIX1JFUVVFU1QpOworICB9Cit9CisKKy8qKgorICogQGJyaWVmIFJYIGludGVycnVwdCBoYW5kbGVyIGZvciA5IGJpdHMgZGF0YSB3b3JkIGxlbmd0aCBhbmQgRklGTyBtb2RlIGlzCisgKiBlbmFibGVkLgorICogQG5vdGUgICBGdW5jdGlvbiBpcyBjYWxsZWQgdW5kZXIgaW50ZXJydXB0aW9uIG9ubHksIG9uY2UKKyAqICAgICAgICAgaW50ZXJydXB0aW9ucyBoYXZlIGJlZW4gZW5hYmxlZCBieSBIQUxfVUFSVF9SZWNlaXZlX0lUKCkKKyAqIEBwYXJhbSBodWFydCBVQVJUIGhhbmRsZS4KKyAqIEByZXR2YWwgTm9uZQorICovCitzdGF0aWMgdm9pZCBVQVJUX1J4SVNSXzE2QklUX0ZJRk9FTihVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KSB7CisgIHVpbnQxNl90ICp0bXA7CisgIHVpbnQxNl90IHVoTWFzayA9IGh1YXJ0LT5NYXNrOworICB1aW50MTZfdCB1aGRhdGE7CisgIHVpbnQxNl90IG5iX3J4X2RhdGE7CisgIHVpbnQxNl90IHJ4ZGF0YWNvdW50OworICB1aW50MzJfdCBpc3JmbGFncyA9IFJFQURfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+SVNSKTsKKyAgdWludDMyX3QgY3IxaXRzID0gUkVBRF9SRUcoaHVhcnQtPkluc3RhbmNlLT5DUjEpOworICB1aW50MzJfdCBjcjNpdHMgPSBSRUFEX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMyk7CisKKyAgLyogQ2hlY2sgdGhhdCBhIFJ4IHByb2Nlc3MgaXMgb25nb2luZyAqLworICBpZiAoaHVhcnQtPlJ4U3RhdGUgPT0gSEFMX1VBUlRfU1RBVEVfQlVTWV9SWCkgeworICAgIG5iX3J4X2RhdGEgPSBodWFydC0+TmJSeERhdGFUb1Byb2Nlc3M7CisgICAgd2hpbGUgKChuYl9yeF9kYXRhID4gMFUpICYmICgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfUlhORV9SWEZORSkgIT0gMFUpKSB7CisgICAgICB1aGRhdGEgPSAodWludDE2X3QpUkVBRF9SRUcoaHVhcnQtPkluc3RhbmNlLT5SRFIpOworICAgICAgdG1wID0gKHVpbnQxNl90ICopaHVhcnQtPnBSeEJ1ZmZQdHI7CisgICAgICAqdG1wID0gKHVpbnQxNl90KSh1aGRhdGEgJiB1aE1hc2spOworICAgICAgaHVhcnQtPnBSeEJ1ZmZQdHIgKz0gMlU7CisgICAgICBodWFydC0+UnhYZmVyQ291bnQtLTsKKyAgICAgIGlzcmZsYWdzID0gUkVBRF9SRUcoaHVhcnQtPkluc3RhbmNlLT5JU1IpOworCisgICAgICAvKiBJZiBzb21lIG5vbiBibG9ja2luZyBlcnJvcnMgb2NjdXJyZWQgKi8KKyAgICAgIGlmICgoaXNyZmxhZ3MgJiAoVVNBUlRfSVNSX1BFIHwgVVNBUlRfSVNSX0ZFIHwgVVNBUlRfSVNSX05FKSkgIT0gMFUpIHsKKyAgICAgICAgLyogVUFSVCBwYXJpdHkgZXJyb3IgaW50ZXJydXB0IG9jY3VycmVkCisgICAgICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgICAgICBpZiAoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9QRSkgIT0gMFUpICYmCisgICAgICAgICAgICAoKGNyMWl0cyAmIFVTQVJUX0NSMV9QRUlFKSAhPSAwVSkpIHsKKyAgICAgICAgICBfX0hBTF9VQVJUX0NMRUFSX0ZMQUcoaHVhcnQsIFVBUlRfQ0xFQVJfUEVGKTsKKworICAgICAgICAgIGh1YXJ0LT5FcnJvckNvZGUgfD0gSEFMX1VBUlRfRVJST1JfUEU7CisgICAgICAgIH0KKworICAgICAgICAvKiBVQVJUIGZyYW1lIGVycm9yIGludGVycnVwdCBvY2N1cnJlZAorICAgICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgICAgIGlmICgoKGlzcmZsYWdzICYgVVNBUlRfSVNSX0ZFKSAhPSAwVSkgJiYKKyAgICAgICAgICAgICgoY3IzaXRzICYgVVNBUlRfQ1IzX0VJRSkgIT0gMFUpKSB7CisgICAgICAgICAgX19IQUxfVUFSVF9DTEVBUl9GTEFHKGh1YXJ0LCBVQVJUX0NMRUFSX0ZFRik7CisKKyAgICAgICAgICBodWFydC0+RXJyb3JDb2RlIHw9IEhBTF9VQVJUX0VSUk9SX0ZFOworICAgICAgICB9CisKKyAgICAgICAgLyogVUFSVCBub2lzZSBlcnJvciBpbnRlcnJ1cHQgb2NjdXJyZWQKKyAgICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgICAgICBpZiAoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9ORSkgIT0gMFUpICYmCisgICAgICAgICAgICAoKGNyM2l0cyAmIFVTQVJUX0NSM19FSUUpICE9IDBVKSkgeworICAgICAgICAgIF9fSEFMX1VBUlRfQ0xFQVJfRkxBRyhodWFydCwgVUFSVF9DTEVBUl9ORUYpOworCisgICAgICAgICAgaHVhcnQtPkVycm9yQ29kZSB8PSBIQUxfVUFSVF9FUlJPUl9ORTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENhbGwgVUFSVCBFcnJvciBDYWxsIGJhY2sgZnVuY3Rpb24gaWYgbmVlZCBiZQorICAgICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAgICAgaWYgKGh1YXJ0LT5FcnJvckNvZGUgIT0gSEFMX1VBUlRfRVJST1JfTk9ORSkgeworICAgICAgICAgIC8qIE5vbiBCbG9ja2luZyBlcnJvciA6IHRyYW5zZmVyIGNvdWxkIGdvIG9uLgorICAgICAgICAgIEVycm9yIGlzIG5vdGlmaWVkIHRvIHVzZXIgdGhyb3VnaCB1c2VyIGVycm9yIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBlcnJvciBjYWxsYmFjayovCisgICAgICAgICAgaHVhcnQtPkVycm9yQ2FsbGJhY2soaHVhcnQpOworI2Vsc2UKKyAgICAgICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgZXJyb3IgY2FsbGJhY2sqLworICAgICAgICAgIEhBTF9VQVJUX0Vycm9yQ2FsbGJhY2soaHVhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAgICAgICBodWFydC0+RXJyb3JDb2RlID0gSEFMX1VBUlRfRVJST1JfTk9ORTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoaHVhcnQtPlJ4WGZlckNvdW50ID09IDBVKSB7CisgICAgICAgIC8qIERpc2FibGUgdGhlIFVBUlQgUGFyaXR5IEVycm9yIEludGVycnVwdCBhbmQgUlhGVCBpbnRlcnJ1cHQqLworICAgICAgICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUEVJRSk7CisKKyAgICAgICAgLyogRGlzYWJsZSB0aGUgVUFSVCBFcnJvciBJbnRlcnJ1cHQ6IChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4KKyAgICAgICAgICAgZXJyb3IpIGFuZCBSWCBGSUZPIFRocmVzaG9sZCBpbnRlcnJ1cHQgKi8KKyAgICAgICAgQVRPTUlDX0NMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAoVVNBUlRfQ1IzX0VJRSB8IFVTQVJUX0NSM19SWEZUSUUpKTsKKworICAgICAgICAvKiBSeCBwcm9jZXNzIGlzIGNvbXBsZXRlZCwgcmVzdG9yZSBodWFydC0+UnhTdGF0ZSB0byBSZWFkeSAqLworICAgICAgICBodWFydC0+UnhTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworCisgICAgICAgIC8qIENsZWFyIFJ4SVNSIGZ1bmN0aW9uIHBvaW50ZXIgKi8KKyAgICAgICAgaHVhcnQtPlJ4SVNSID0gTlVMTDsKKworICAgICAgICAvKiBJbml0aWFsaXplIHR5cGUgb2YgUnhFdmVudCB0byBUcmFuc2ZlciBDb21wbGV0ZSAqLworICAgICAgICBodWFydC0+UnhFdmVudFR5cGUgPSBIQUxfVUFSVF9SWEVWRU5UX1RDOworCisgICAgICAgIGlmICghKElTX0xQVUFSVF9JTlNUQU5DRShodWFydC0+SW5zdGFuY2UpKSkgeworICAgICAgICAgIC8qIENoZWNrIHRoYXQgVVNBUlQgUlRPRU4gYml0IGlzIHNldCAqLworICAgICAgICAgIGlmIChSRUFEX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX1JUT0VOKSAhPSAwVSkgeworICAgICAgICAgICAgLyogRW5hYmxlIHRoZSBVQVJUIFJlY2VpdmVyIFRpbWVvdXQgSW50ZXJydXB0ICovCisgICAgICAgICAgICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUlRPSUUpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIENoZWNrIGN1cnJlbnQgcmVjZXB0aW9uIE1vZGUgOgorICAgICAgICAgICBJZiBSZWNlcHRpb24gdGlsbCBJRExFIGV2ZW50IGhhcyBiZWVuIHNlbGVjdGVkIDogKi8KKyAgICAgICAgaWYgKGh1YXJ0LT5SZWNlcHRpb25UeXBlID09IEhBTF9VQVJUX1JFQ0VQVElPTl9UT0lETEUpIHsKKyAgICAgICAgICAvKiBTZXQgcmVjZXB0aW9uIHR5cGUgdG8gU3RhbmRhcmQgKi8KKyAgICAgICAgICBodWFydC0+UmVjZXB0aW9uVHlwZSA9IEhBTF9VQVJUX1JFQ0VQVElPTl9TVEFOREFSRDsKKworICAgICAgICAgIC8qIERpc2FibGUgSURMRSBpbnRlcnJ1cHQgKi8KKyAgICAgICAgICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfSURMRUlFKTsKKworICAgICAgICAgIGlmIChfX0hBTF9VQVJUX0dFVF9GTEFHKGh1YXJ0LCBVQVJUX0ZMQUdfSURMRSkgPT0gU0VUKSB7CisgICAgICAgICAgICAvKiBDbGVhciBJRExFIEZsYWcgKi8KKyAgICAgICAgICAgIF9fSEFMX1VBUlRfQ0xFQVJfRkxBRyhodWFydCwgVUFSVF9DTEVBUl9JRExFRik7CisgICAgICAgICAgfQorCisjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBSeCBFdmVudCBjYWxsYmFjayovCisgICAgICAgICAgaHVhcnQtPlJ4RXZlbnRDYWxsYmFjayhodWFydCwgaHVhcnQtPlJ4WGZlclNpemUpOworI2Vsc2UKKyAgICAgICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgUnggRXZlbnQgY2FsbGJhY2sqLworICAgICAgICAgIEhBTF9VQVJURXhfUnhFdmVudENhbGxiYWNrKGh1YXJ0LCBodWFydC0+UnhYZmVyU2l6ZSk7CisjZW5kaWYgLyogKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MpICovCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLyogU3RhbmRhcmQgcmVjZXB0aW9uIEFQSSBjYWxsZWQgKi8KKyNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIFJ4IGNvbXBsZXRlIGNhbGxiYWNrKi8KKyAgICAgICAgICBodWFydC0+UnhDcGx0Q2FsbGJhY2soaHVhcnQpOworI2Vsc2UKKyAgICAgICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgUnggY29tcGxldGUgY2FsbGJhY2sqLworICAgICAgICAgIEhBTF9VQVJUX1J4Q3BsdENhbGxiYWNrKGh1YXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgLyogV2hlbiByZW1haW5pbmcgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlY2VpdmUgaXMgbGVzcyB0aGFuIHRoZSBSWCBGSUZPCisgICAgdGhyZXNob2xkLCBuZXh0IGluY29taW5nIGZyYW1lcyBhcmUgcHJvY2Vzc2VkIGFzIGlmIEZJRk8gbW9kZSB3YXMKKyAgICBkaXNhYmxlZCAoaS5lLiBvbmUgaW50ZXJydXB0IHBlciByZWNlaXZlZCBmcmFtZSkuCisgICAgKi8KKyAgICByeGRhdGFjb3VudCA9IGh1YXJ0LT5SeFhmZXJDb3VudDsKKyAgICBpZiAoKHJ4ZGF0YWNvdW50ICE9IDBVKSAmJiAocnhkYXRhY291bnQgPCBodWFydC0+TmJSeERhdGFUb1Byb2Nlc3MpKSB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBVQVJUIFJYRlQgaW50ZXJydXB0Ki8KKyAgICAgIEFUT01JQ19DTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19SWEZUSUUpOworCisgICAgICAvKiBVcGRhdGUgdGhlIFJ4SVNSIGZ1bmN0aW9uIHBvaW50ZXIgKi8KKyAgICAgIGh1YXJ0LT5SeElTUiA9IFVBUlRfUnhJU1JfMTZCSVQ7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgVUFSVCBEYXRhIFJlZ2lzdGVyIE5vdCBFbXB0eSBpbnRlcnJ1cHQgKi8KKyAgICAgIEFUT01JQ19TRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUlhORUlFX1JYRk5FSUUpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiBDbGVhciBSWE5FIGludGVycnVwdCBmbGFnICovCisgICAgX19IQUxfVUFSVF9TRU5EX1JFUShodWFydCwgVUFSVF9SWERBVEFfRkxVU0hfUkVRVUVTVCk7CisgIH0KK30KKworLyoqCisgKiBAfQorICovCisKKyNlbmRpZiAvKiBIQUxfVUFSVF9NT0RVTEVfRU5BQkxFRCAqLworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLwpkaWZmIC0tZ2l0IGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3VhcnRfZXguYyBiL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2hhbF91YXJ0X2V4LmMKaW5kZXggNWQ4ZjA1My4uN2ZjNjM3NSAxMDA2NDQKLS0tIGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Ecml2ZXJzL1NUTTMyRzR4eF9IQUxfRHJpdmVyL1NyYy9zdG0zMmc0eHhfaGFsX3VhcnRfZXguYworKysgYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9oYWxfdWFydF9leC5jCkBAIC0xLDEwMDEgKzEsMTAzNSBAQAotLyoqDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICogQGZpbGUgICAgc3RtMzJnNHh4X2hhbF91YXJ0X2V4LmMNCi0gICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0NCi0gICogQGJyaWVmICAgRXh0ZW5kZWQgVUFSVCBIQUwgbW9kdWxlIGRyaXZlci4NCi0gICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZw0KLSAgZXh0ZW5kZWQNCi0gICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBVbml2ZXJzYWwgQXN5bmNocm9ub3VzIFJlY2VpdmVyIFRyYW5zbWl0dGVyDQotICBQZXJpcGhlcmFsIChVQVJUKS4NCi0gICogICAgICAgICAgICsgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucw0KLSAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zDQotICAqDQotICAqDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICogQGF0dGVudGlvbg0KLSAgKg0KLSAgKiBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLg0KLSAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KLSAgKg0KLSAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRlcm1zIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUNCi0gICogaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc29mdHdhcmUgY29tcG9uZW50Lg0KLSAgKiBJZiBubyBMSUNFTlNFIGZpbGUgY29tZXMgd2l0aCB0aGlzIHNvZnR3YXJlLCBpdCBpcyBwcm92aWRlZCBBUy1JUy4NCi0gICoNCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgQHZlcmJhdGltDQotICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgICAgICAgICAgICAjIyMjIyBVQVJUIHBlcmlwaGVyYWwgZXh0ZW5kZWQgZmVhdHVyZXMgICMjIyMjDQotICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi0gICAgKCMpIERlY2xhcmUgYSBVQVJUX0hhbmRsZVR5cGVEZWYgaGFuZGxlIHN0cnVjdHVyZS4NCi0NCi0gICAgKCMpIEZvciB0aGUgVUFSVCBSUzQ4NSBEcml2ZXIgRW5hYmxlIG1vZGUsIGluaXRpYWxpemUgdGhlIFVBUlQgcmVnaXN0ZXJzDQotICAgICAgICBieSBjYWxsaW5nIHRoZSBIQUxfUlM0ODVFeF9Jbml0KCkgQVBJLg0KLQ0KLSAgICAoIykgRklGTyBtb2RlIGVuYWJsaW5nL2Rpc2FibGluZyBhbmQgUlgvVFggRklGTyB0aHJlc2hvbGQgcHJvZ3JhbW1pbmcuDQotDQotICAgICAgICAtQC0gV2hlbiBVQVJUIG9wZXJhdGVzIGluIEZJRk8gbW9kZSwgRklGTyBtb2RlIG11c3QgYmUgZW5hYmxlZCBwcmlvcg0KLSAgICAgICAgICAgIHN0YXJ0aW5nIFJYL1RYIHRyYW5zZmVycy4gQWxzbyBSWC9UWCBGSUZPIHRocmVzaG9sZHMgbXVzdCBiZQ0KLSAgICAgICAgICAgIGNvbmZpZ3VyZWQgcHJpb3Igc3RhcnRpbmcgUlgvVFggdHJhbnNmZXJzLg0KLQ0KLSAgQGVuZHZlcmJhdGltDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICovDQotDQotLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaW5jbHVkZSAic3RtMzJnNHh4X2hhbC5oIg0KLQ0KLS8qKiBAYWRkdG9ncm91cCBTVE0zMkc0eHhfSEFMX0RyaXZlcg0KLSAqIEB7DQotICovDQotDQotLyoqIEBkZWZncm91cCBVQVJURXggVUFSVEV4DQotICogQGJyaWVmIFVBUlQgRXh0ZW5kZWQgSEFMIG1vZHVsZSBkcml2ZXINCi0gKiBAew0KLSAqLw0KLQ0KLSNpZmRlZiBIQUxfVUFSVF9NT0RVTEVfRU5BQkxFRA0KLQ0KLS8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiogQGRlZmdyb3VwIFVBUlRFWF9Qcml2YXRlX0NvbnN0YW50cyBVQVJURXggUHJpdmF0ZSBDb25zdGFudHMNCi0gKiBAew0KLSAqLw0KLS8qIFVBUlQgUlggRklGTyBkZXB0aCAqLw0KLSNkZWZpbmUgUlhfRklGT19ERVBUSCA4VQ0KLQ0KLS8qIFVBUlQgVFggRklGTyBkZXB0aCAqLw0KLSNkZWZpbmUgVFhfRklGT19ERVBUSCA4VQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBkZWZncm91cCBVQVJURXhfUHJpdmF0ZV9GdW5jdGlvbnMgVUFSVEV4IFByaXZhdGUgRnVuY3Rpb25zDQotICogQHsNCi0gKi8NCi1zdGF0aWMgdm9pZCBVQVJURXhfV2FrZXVwX0FkZHJlc3NDb25maWcoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUFSVF9XYWtlVXBUeXBlRGVmIFdha2VVcFNlbGVjdGlvbik7DQotc3RhdGljIHZvaWQgVUFSVEV4X1NldE5iRGF0YVRvUHJvY2VzcyhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsNCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotDQotLyoqIEBkZWZncm91cCBVQVJURXhfRXhwb3J0ZWRfRnVuY3Rpb25zICBVQVJURXggRXhwb3J0ZWQgRnVuY3Rpb25zDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFVBUlRFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZA0KLWRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucw0KLSAgKiBAYnJpZWYgICAgRXh0ZW5kZWQgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gRnVuY3Rpb25zDQotICAqDQotQHZlcmJhdGltDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICAgICAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucyAjIyMjIw0KLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgIFsuLl0NCi0gICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBpbml0aWFsaXplIHRoZQ0KLVVTQVJUeCBvciB0aGUgVUFSVHkgaW4gYXN5bmNocm9ub3VzIG1vZGUuDQotICAgICAgKCspIEZvciB0aGUgYXN5bmNocm9ub3VzIG1vZGUgdGhlIHBhcmFtZXRlcnMgYmVsb3cgY2FuIGJlIGNvbmZpZ3VyZWQ6DQotICAgICAgICAoKyspIEJhdWQgUmF0ZQ0KLSAgICAgICAgKCsrKSBXb3JkIExlbmd0aA0KLSAgICAgICAgKCsrKSBTdG9wIEJpdA0KLSAgICAgICAgKCsrKSBQYXJpdHk6IElmIHRoZSBwYXJpdHkgaXMgZW5hYmxlZCwgdGhlbiB0aGUgTVNCIGJpdCBvZiB0aGUgZGF0YQ0KLXdyaXR0ZW4gaW4gdGhlIGRhdGEgcmVnaXN0ZXIgaXMgdHJhbnNtaXR0ZWQgYnV0IGlzIGNoYW5nZWQgYnkgdGhlIHBhcml0eSBiaXQuDQotICAgICAgICAoKyspIEhhcmR3YXJlIGZsb3cgY29udHJvbA0KLSAgICAgICAgKCsrKSBSZWNlaXZlci90cmFuc21pdHRlciBtb2Rlcw0KLSAgICAgICAgKCsrKSBPdmVyIFNhbXBsaW5nIE1ldGhvZA0KLSAgICAgICAgKCsrKSBPbmUtQml0IFNhbXBsaW5nIE1ldGhvZA0KLSAgICAgICgrKSBGb3IgdGhlIGFzeW5jaHJvbm91cyBtb2RlLCB0aGUgZm9sbG93aW5nIGFkdmFuY2VkIGZlYXR1cmVzIGNhbiBiZQ0KLWNvbmZpZ3VyZWQgYXMgd2VsbDoNCi0gICAgICAgICgrKykgVFggYW5kL29yIFJYIHBpbiBsZXZlbCBpbnZlcnNpb24NCi0gICAgICAgICgrKykgZGF0YSBsb2dpY2FsIGxldmVsIGludmVyc2lvbg0KLSAgICAgICAgKCsrKSBSWCBhbmQgVFggcGlucyBzd2FwDQotICAgICAgICAoKyspIFJYIG92ZXJydW4gZGV0ZWN0aW9uIGRpc2FibGluZw0KLSAgICAgICAgKCsrKSBETUEgZGlzYWJsaW5nIG9uIFJYIGVycm9yDQotICAgICAgICAoKyspIE1TQiBmaXJzdCBvbiBjb21tdW5pY2F0aW9uIGxpbmUNCi0gICAgICAgICgrKykgYXV0byBCYXVkIHJhdGUgZGV0ZWN0aW9uDQotICAgIFsuLl0NCi0gICAgVGhlIEhBTF9SUzQ4NUV4X0luaXQoKSBBUEkgZm9sbG93cyB0aGUgVUFSVCBSUzQ4NSBtb2RlIGNvbmZpZ3VyYXRpb24NCi0gICAgIHByb2NlZHVyZXMgKGRldGFpbHMgZm9yIHRoZSBwcm9jZWR1cmVzIGFyZSBhdmFpbGFibGUgaW4gcmVmZXJlbmNlIG1hbnVhbCkuDQotDQotQGVuZHZlcmJhdGltDQotDQotICBEZXBlbmRpbmcgb24gdGhlIGZyYW1lIGxlbmd0aCBkZWZpbmVkIGJ5IHRoZSBNMSBhbmQgTTAgYml0cyAoNy1iaXQsDQotICA4LWJpdCBvciA5LWJpdCksIHRoZSBwb3NzaWJsZSBVQVJUIGZvcm1hdHMgYXJlIGxpc3RlZCBpbiB0aGUNCi0gIGZvbGxvd2luZyB0YWJsZS4NCi0NCi0gICAgVGFibGUgMS4gVUFSVCBmcmFtZSBmb3JtYXQuDQotICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCi0gICAgfCAgTTEgYml0IHwgIE0wIGJpdCB8ICBQQ0UgYml0ICB8ICAgICAgICAgICAgIFVBUlQgZnJhbWUgICAgICAgICAgICAgICAgfA0KLSAgICB8LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQotICAgIHwgICAgMCAgICB8ICAgIDAgICAgfCAgICAwICAgICAgfCAgICB8IFNCIHwgICAgOCBiaXQgZGF0YSAgIHwgU1RCIHwgICAgIHwNCi0gICAgfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KLSAgICB8ICAgIDAgICAgfCAgICAwICAgIHwgICAgMSAgICAgIHwgICAgfCBTQiB8IDcgYml0IGRhdGEgfCBQQiB8IFNUQiB8ICAgICB8DQotICAgIHwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCi0gICAgfCAgICAwICAgIHwgICAgMSAgICB8ICAgIDAgICAgICB8ICAgIHwgU0IgfCAgICA5IGJpdCBkYXRhICAgfCBTVEIgfCAgICAgfA0KLSAgICB8LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQotICAgIHwgICAgMCAgICB8ICAgIDEgICAgfCAgICAxICAgICAgfCAgICB8IFNCIHwgOCBiaXQgZGF0YSB8IFBCIHwgU1RCIHwgICAgIHwNCi0gICAgfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KLSAgICB8ICAgIDEgICAgfCAgICAwICAgIHwgICAgMCAgICAgIHwgICAgfCBTQiB8ICAgIDcgYml0IGRhdGEgICB8IFNUQiB8ICAgICB8DQotICAgIHwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCi0gICAgfCAgICAxICAgIHwgICAgMCAgICB8ICAgIDEgICAgICB8ICAgIHwgU0IgfCA2IGJpdCBkYXRhIHwgUEIgfCBTVEIgfCAgICAgfA0KLSAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQotDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiBJbml0aWFsaXplIHRoZSBSUzQ4NSBEcml2ZXIgZW5hYmxlIGZlYXR1cmUgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQNCi0gKiAgICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIFVBUlRfSW5pdFR5cGVEZWYgYW5kIGNyZWF0ZXMgdGhlIGFzc29jaWF0ZWQgaGFuZGxlLg0KLSAqIEBwYXJhbSBodWFydCAgICAgICAgICAgIFVBUlQgaGFuZGxlLg0KLSAqIEBwYXJhbSBQb2xhcml0eSAgICAgICAgIFNlbGVjdCB0aGUgZHJpdmVyIGVuYWJsZSBwb2xhcml0eS4NCi0gKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAqICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0RFX1BPTEFSSVRZX0hJR0ggREUgc2lnbmFsIGlzIGFjdGl2ZSBoaWdoDQotICogICAgICAgICAgQGFyZyBAcmVmIFVBUlRfREVfUE9MQVJJVFlfTE9XICBERSBzaWduYWwgaXMgYWN0aXZlIGxvdw0KLSAqIEBwYXJhbSBBc3NlcnRpb25UaW1lICAgIERyaXZlciBFbmFibGUgYXNzZXJ0aW9uIHRpbWU6DQotICogICAgICAgNS1iaXQgdmFsdWUgZGVmaW5pbmcgdGhlIHRpbWUgYmV0d2VlbiB0aGUgYWN0aXZhdGlvbiBvZiB0aGUgREUgKERyaXZlcg0KLSAqIEVuYWJsZSkgc2lnbmFsIGFuZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdGFydCBiaXQuIEl0IGlzIGV4cHJlc3NlZCBpbiBzYW1wbGUNCi0gKiB0aW1lIHVuaXRzICgxLzggb3IgMS8xNiBiaXQgdGltZSwgZGVwZW5kaW5nIG9uIHRoZSBvdmVyc2FtcGxpbmcgcmF0ZSkNCi0gKiBAcGFyYW0gRGVhc3NlcnRpb25UaW1lICBEcml2ZXIgRW5hYmxlIGRlYXNzZXJ0aW9uIHRpbWU6DQotICogICAgICAgNS1iaXQgdmFsdWUgZGVmaW5pbmcgdGhlIHRpbWUgYmV0d2VlbiB0aGUgZW5kIG9mIHRoZSBsYXN0IHN0b3AgYml0LCBpbg0KLSAqIGEgdHJhbnNtaXR0ZWQgbWVzc2FnZSwgYW5kIHRoZSBkZS1hY3RpdmF0aW9uIG9mIHRoZSBERSAoRHJpdmVyIEVuYWJsZSkNCi0gKiBzaWduYWwuIEl0IGlzIGV4cHJlc3NlZCBpbiBzYW1wbGUgdGltZSB1bml0cyAoMS84IG9yIDEvMTYgYml0IHRpbWUsIGRlcGVuZGluZw0KLSAqIG9uIHRoZSBvdmVyc2FtcGxpbmcgcmF0ZSkuDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JTNDg1RXhfSW5pdChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCB1aW50MzJfdCBQb2xhcml0eSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEFzc2VydGlvblRpbWUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBEZWFzc2VydGlvblRpbWUpIHsNCi0gIHVpbnQzMl90IHRlbXA7DQotDQotICAvKiBDaGVjayB0aGUgVUFSVCBoYW5kbGUgYWxsb2NhdGlvbiAqLw0KLSAgaWYgKGh1YXJ0ID09IE5VTEwpIHsNCi0gICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gIH0NCi0gIC8qIENoZWNrIHRoZSBEcml2ZXIgRW5hYmxlIFVBUlQgaW5zdGFuY2UgKi8NCi0gIGFzc2VydF9wYXJhbShJU19VQVJUX0RSSVZFUl9FTkFCTEVfSU5TVEFOQ0UoaHVhcnQtPkluc3RhbmNlKSk7DQotDQotICAvKiBDaGVjayB0aGUgRHJpdmVyIEVuYWJsZSBwb2xhcml0eSAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfREVfUE9MQVJJVFkoUG9sYXJpdHkpKTsNCi0NCi0gIC8qIENoZWNrIHRoZSBEcml2ZXIgRW5hYmxlIGFzc2VydGlvbiB0aW1lICovDQotICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9BU1NFUlRJT05USU1FKEFzc2VydGlvblRpbWUpKTsNCi0NCi0gIC8qIENoZWNrIHRoZSBEcml2ZXIgRW5hYmxlIGRlYXNzZXJ0aW9uIHRpbWUgKi8NCi0gIGFzc2VydF9wYXJhbShJU19VQVJUX0RFQVNTRVJUSU9OVElNRShEZWFzc2VydGlvblRpbWUpKTsNCi0NCi0gIGlmIChodWFydC0+Z1N0YXRlID09IEhBTF9VQVJUX1NUQVRFX1JFU0VUKSB7DQotICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8NCi0gICAgaHVhcnQtPkxvY2sgPSBIQUxfVU5MT0NLRUQ7DQotDQotI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpDQotICAgIFVBUlRfSW5pdENhbGxiYWNrc1RvRGVmYXVsdChodWFydCk7DQotDQotICAgIGlmIChodWFydC0+TXNwSW5pdENhbGxiYWNrID09IE5VTEwpIHsNCi0gICAgICBodWFydC0+TXNwSW5pdENhbGxiYWNrID0gSEFMX1VBUlRfTXNwSW5pdDsNCi0gICAgfQ0KLQ0KLSAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8NCi0gICAgaHVhcnQtPk1zcEluaXRDYWxsYmFjayhodWFydCk7DQotI2Vsc2UNCi0gICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIDogR1BJTywgQ0xPQ0ssIENPUlRFWCAqLw0KLSAgICBIQUxfVUFSVF9Nc3BJbml0KGh1YXJ0KTsNCi0jZW5kaWYgLyogKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MpICovDQotICB9DQotDQotICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWTsNCi0NCi0gIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8NCi0gIF9fSEFMX1VBUlRfRElTQUJMRShodWFydCk7DQotDQotICAvKiBTZXQgdGhlIFVBUlQgQ29tbXVuaWNhdGlvbiBwYXJhbWV0ZXJzICovDQotICBpZiAoVUFSVF9TZXRDb25maWcoaHVhcnQpID09IEhBTF9FUlJPUikgew0KLSAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgfQ0KLQ0KLSAgaWYgKGh1YXJ0LT5BZHZhbmNlZEluaXQuQWR2RmVhdHVyZUluaXQgIT0gVUFSVF9BRFZGRUFUVVJFX05PX0lOSVQpIHsNCi0gICAgVUFSVF9BZHZGZWF0dXJlQ29uZmlnKGh1YXJ0KTsNCi0gIH0NCi0NCi0gIC8qIEVuYWJsZSB0aGUgRHJpdmVyIEVuYWJsZSBtb2RlIGJ5IHNldHRpbmcgdGhlIERFTSBiaXQgaW4gdGhlIENSMyByZWdpc3RlciAqLw0KLSAgU0VUX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RFTSk7DQotDQotICAvKiBTZXQgdGhlIERyaXZlciBFbmFibGUgcG9sYXJpdHkgKi8NCi0gIE1PRElGWV9SRUcoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ERVAsIFBvbGFyaXR5KTsNCi0NCi0gIC8qIFNldCB0aGUgRHJpdmVyIEVuYWJsZSBhc3NlcnRpb24gYW5kIGRlYXNzZXJ0aW9uIHRpbWVzICovDQotICB0ZW1wID0gKEFzc2VydGlvblRpbWUgPDwgVUFSVF9DUjFfREVBVF9BRERSRVNTX0xTQl9QT1MpOw0KLSAgdGVtcCB8PSAoRGVhc3NlcnRpb25UaW1lIDw8IFVBUlRfQ1IxX0RFRFRfQUREUkVTU19MU0JfUE9TKTsNCi0gIE1PRElGWV9SRUcoaHVhcnQtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfREVEVCB8IFVTQVJUX0NSMV9ERUFUKSwgdGVtcCk7DQotDQotICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8NCi0gIF9fSEFMX1VBUlRfRU5BQkxFKGh1YXJ0KTsNCi0NCi0gIC8qIFRFQUNLIGFuZC9vciBSRUFDSyB0byBjaGVjayBiZWZvcmUgbW92aW5nIGh1YXJ0LT5nU3RhdGUgYW5kIGh1YXJ0LT5SeFN0YXRlDQotICAgKiB0byBSZWFkeSAqLw0KLSAgcmV0dXJuIChVQVJUX0NoZWNrSWRsZVN0YXRlKGh1YXJ0KSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqIEBkZWZncm91cCBVQVJURXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zDQotICAqICBAYnJpZWYgRXh0ZW5kZWQgZnVuY3Rpb25zDQotICAqDQotQHZlcmJhdGltDQotID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAjIyMjIw0KLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBXYWtldXAgYW5kIEZJRk8gbW9kZSByZWxhdGVkIGNhbGxiYWNrDQotZnVuY3Rpb25zLg0KLQ0KLSAgICAoIykgV2FrZXVwIGZyb20gU3RvcCBtb2RlIENhbGxiYWNrOg0KLSAgICAgICAgKCspIEhBTF9VQVJURXhfV2FrZXVwQ2FsbGJhY2soKQ0KLQ0KLSAgICAoIykgVFgvUlggRmlmb3MgQ2FsbGJhY2tzOg0KLSAgICAgICAgKCspIEhBTF9VQVJURXhfUnhGaWZvRnVsbENhbGxiYWNrKCkNCi0gICAgICAgICgrKSBIQUxfVUFSVEV4X1R4Rmlmb0VtcHR5Q2FsbGJhY2soKQ0KLQ0KLUBlbmR2ZXJiYXRpbQ0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgVUFSVCB3YWtldXAgZnJvbSBTdG9wIG1vZGUgY2FsbGJhY2suDQotICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLV9fd2VhayB2b2lkIEhBTF9VQVJURXhfV2FrZXVwQ2FsbGJhY2soVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkgew0KLSAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLw0KLSAgVU5VU0VEKGh1YXJ0KTsNCi0NCi0gIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwNCi0gICAgICAgICAgICB0aGUgSEFMX1VBUlRFeF9XYWtldXBDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4NCi0gICAqLw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFVBUlQgUlggRmlmbyBmdWxsIGNhbGxiYWNrLg0KLSAqIEBwYXJhbSAgaHVhcnQgVUFSVCBoYW5kbGUuDQotICogQHJldHZhbCBOb25lDQotICovDQotX193ZWFrIHZvaWQgSEFMX1VBUlRFeF9SeEZpZm9GdWxsQ2FsbGJhY2soVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkgew0KLSAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLw0KLSAgVU5VU0VEKGh1YXJ0KTsNCi0NCi0gIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwNCi0gICAgICAgICAgICB0aGUgSEFMX1VBUlRFeF9SeEZpZm9GdWxsQ2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyDQotICAgICBmaWxlLg0KLSAgICovDQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgVUFSVCBUWCBGaWZvIGVtcHR5IGNhbGxiYWNrLg0KLSAqIEBwYXJhbSAgaHVhcnQgVUFSVCBoYW5kbGUuDQotICogQHJldHZhbCBOb25lDQotICovDQotX193ZWFrIHZvaWQgSEFMX1VBUlRFeF9UeEZpZm9FbXB0eUNhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpIHsNCi0gIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8NCi0gIFVOVVNFRChodWFydCk7DQotDQotICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsDQotICAgICAgICAgICAgdGhlIEhBTF9VQVJURXhfVHhGaWZvRW1wdHlDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXINCi0gICAgIGZpbGUuDQotICAgKi8NCi19DQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGRlZmdyb3VwIFVBUlRFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMNCi0gICogQGJyaWVmICAgIEV4dGVuZGVkIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMNCi0gICoNCi1AdmVyYmF0aW0NCi0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICMjIyMjDQotID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgWy4uXSBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6DQotICAgICAoKykgSEFMX011bHRpUHJvY2Vzc29yRXhfQWRkcmVzc0xlbmd0aF9TZXQoKSBBUEkgb3B0aW9uYWxseSBzZXRzIHRoZSBVQVJUDQotbm9kZSBhZGRyZXNzIGRldGVjdGlvbiBsZW5ndGggdG8gbW9yZSB0aGFuIDQgYml0cyBmb3IgbXVsdGlwcm9jZXNzb3IgYWRkcmVzcw0KLW1hcmsgd2FrZSB1cC4NCi0gICAgICgrKSBIQUxfVUFSVEV4X1N0b3BNb2RlV2FrZVVwU291cmNlQ29uZmlnKCkgQVBJIGRlZmluZXMgdGhlIHdha2UtdXAgZnJvbQ0KLXN0b3AgbW9kZSB0cmlnZ2VyOiBhZGRyZXNzIG1hdGNoLCBTdGFydCBCaXQgZGV0ZWN0aW9uIG9yIFJYTkUgYml0IHN0YXR1cy4NCi0gICAgICgrKSBIQUxfVUFSVEV4X0VuYWJsZVN0b3BNb2RlKCkgQVBJIGVuYWJsZXMgdGhlIFVBUlQgdG8gd2FrZSB1cCB0aGUgTUNVDQotZnJvbSBzdG9wIG1vZGUNCi0gICAgICgrKSBIQUxfVUFSVEV4X0Rpc2FibGVTdG9wTW9kZSgpIEFQSSBkaXNhYmxlcyB0aGUgYWJvdmUgZnVuY3Rpb25hbGl0eQ0KLSAgICAgKCspIEhBTF9VQVJURXhfRW5hYmxlRmlmb01vZGUoKSBBUEkgZW5hYmxlcyB0aGUgRklGTyBtb2RlDQotICAgICAoKykgSEFMX1VBUlRFeF9EaXNhYmxlRmlmb01vZGUoKSBBUEkgZGlzYWJsZXMgdGhlIEZJRk8gbW9kZQ0KLSAgICAgKCspIEhBTF9VQVJURXhfU2V0VHhGaWZvVGhyZXNob2xkKCkgQVBJIHNldHMgdGhlIFRYIEZJRk8gdGhyZXNob2xkDQotICAgICAoKykgSEFMX1VBUlRFeF9TZXRSeEZpZm9UaHJlc2hvbGQoKSBBUEkgc2V0cyB0aGUgUlggRklGTyB0aHJlc2hvbGQNCi0NCi0gICAgWy4uXSBUaGlzIHN1YnNlY3Rpb24gYWxzbyBwcm92aWRlcyBhIHNldCBvZiBhZGRpdGlvbmFsIGZ1bmN0aW9ucyBwcm92aWRpbmcNCi1lbmhhbmNlZCByZWNlcHRpb24gc2VydmljZXMgdG8gdXNlci4gKEZvciBleGFtcGxlLCB0aGVzZSBmdW5jdGlvbnMgYWxsb3cNCi1hcHBsaWNhdGlvbiB0byBoYW5kbGUgdXNlIGNhc2VzIHdoZXJlIG51bWJlciBvZiBkYXRhIHRvIGJlIHJlY2VpdmVkIGlzIHVua25vd24pLg0KLQ0KLSAgICAoIykgQ29tcGFyZWQgdG8gc3RhbmRhcmQgcmVjZXB0aW9uIHNlcnZpY2VzIHdoaWNoIG9ubHkgY29uc2lkZXIgbnVtYmVyIG9mDQotcmVjZWl2ZWQgZGF0YSBlbGVtZW50cyBhcyByZWNlcHRpb24gY29tcGxldGlvbiBjcml0ZXJpYSwgdGhlc2UgZnVuY3Rpb25zIGFsc28NCi1jb25zaWRlciBhZGRpdGlvbmFsIGV2ZW50cyBhcyB0cmlnZ2VycyBmb3IgdXBkYXRpbmcgcmVjZXB0aW9uIHN0YXR1cyB0byBjYWxsZXIgOg0KLSAgICAgICAoKykgRGV0ZWN0aW9uIG9mIGluYWN0aXZpdHkgcGVyaW9kIChSWCBsaW5lIGhhcyBub3QgYmVlbiBhY3RpdmUgZm9yIGENCi1naXZlbiBwZXJpb2QpLg0KLSAgICAgICAgICAoKyspIFJYIGluYWN0aXZpdHkgZGV0ZWN0ZWQgYnkgSURMRSBldmVudCwgaS5lLiBSWCBsaW5lIGhhcyBiZWVuIGluDQotaWRsZSBzdGF0ZSAobm9ybWFsbHkgaGlnaCBzdGF0ZSkgZm9yIDEgZnJhbWUgdGltZSwgYWZ0ZXIgbGFzdCByZWNlaXZlZCBieXRlLg0KLSAgICAgICAgICAoKyspIFJYIGluYWN0aXZpdHkgZGV0ZWN0ZWQgYnkgUlRPLCBpLmUuIGxpbmUgaGFzIGJlZW4gaW4gaWRsZSBzdGF0ZQ0KLSAgICAgICAgICAgICAgIGZvciBhIHByb2dyYW1tYWJsZSB0aW1lLCBhZnRlciBsYXN0IHJlY2VpdmVkIGJ5dGUuDQotICAgICAgICgrKSBEZXRlY3Rpb24gdGhhdCBhIHNwZWNpZmljIGNoYXJhY3RlciBoYXMgYmVlbiByZWNlaXZlZC4NCi0NCi0gICAgKCMpIFRoZXJlIGFyZSB0d28gbW9kZSBvZiB0cmFuc2ZlcjoNCi0gICAgICAgKCspIEJsb2NraW5nIG1vZGU6IFRoZSByZWNlcHRpb24gaXMgcGVyZm9ybWVkIGluIHBvbGxpbmcgbW9kZSwgdW50aWwNCi1laXRoZXIgZXhwZWN0ZWQgbnVtYmVyIG9mIGRhdGEgaXMgcmVjZWl2ZWQsIG9yIHRpbGwgSURMRSBldmVudCBvY2N1cnMuIFJlY2VwdGlvbg0KLWlzIGhhbmRsZWQgb25seSBkdXJpbmcgZnVuY3Rpb24gZXhlY3V0aW9uLiBXaGVuIGZ1bmN0aW9uIGV4aXRzLCBubyBkYXRhDQotcmVjZXB0aW9uIGNvdWxkIG9jY3VyLiBIQUwgc3RhdHVzIGFuZCBudW1iZXIgb2YgYWN0dWFsbHkgcmVjZWl2ZWQgZGF0YSBlbGVtZW50cywNCi0gICAgICAgICAgIGFyZSByZXR1cm5lZCBieSBmdW5jdGlvbiBhZnRlciBmaW5pc2hpbmcgdHJhbnNmZXIuDQotICAgICAgICgrKSBOb24tQmxvY2tpbmcgbW9kZTogVGhlIHJlY2VwdGlvbiBpcyBwZXJmb3JtZWQgdXNpbmcgSW50ZXJydXB0cyBvcg0KLURNQS4gVGhlc2UgQVBJJ3MgcmV0dXJuIHRoZSBIQUwgc3RhdHVzLiBUaGUgZW5kIG9mIHRoZSBkYXRhIHByb2Nlc3Npbmcgd2lsbCBiZQ0KLWluZGljYXRlZCB0aHJvdWdoIHRoZSBkZWRpY2F0ZWQgVUFSVCBJUlEgd2hlbiB1c2luZyBJbnRlcnJ1cHQgbW9kZSBvciB0aGUgRE1BDQotSVJRIHdoZW4gdXNpbmcgRE1BIG1vZGUuIFRoZSBIQUxfVUFSVEV4X1J4RXZlbnRDYWxsYmFjaygpIHVzZXIgY2FsbGJhY2sgd2lsbCBiZQ0KLWV4ZWN1dGVkIGR1cmluZyBSZWNlaXZlIHByb2Nlc3MgVGhlIEhBTF9VQVJUX0Vycm9yQ2FsbGJhY2soKXVzZXIgY2FsbGJhY2sgd2lsbA0KLWJlIGV4ZWN1dGVkIHdoZW4gYSByZWNlcHRpb24gZXJyb3IgaXMgZGV0ZWN0ZWQuDQotDQotICAgICgjKSBCbG9ja2luZyBtb2RlIEFQSToNCi0gICAgICAgICgrKSBIQUxfVUFSVEV4X1JlY2VpdmVUb0lkbGUoKQ0KLQ0KLSAgICAoIykgTm9uLUJsb2NraW5nIG1vZGUgQVBJIHdpdGggSW50ZXJydXB0Og0KLSAgICAgICAgKCspIEhBTF9VQVJURXhfUmVjZWl2ZVRvSWRsZV9JVCgpDQotDQotICAgICgjKSBOb24tQmxvY2tpbmcgbW9kZSBBUEkgd2l0aCBETUE6DQotICAgICAgICAoKykgSEFMX1VBUlRFeF9SZWNlaXZlVG9JZGxlX0RNQSgpDQotDQotQGVuZHZlcmJhdGltDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiBCeSBkZWZhdWx0IGluIG11bHRpcHJvY2Vzc29yIG1vZGUsIHdoZW4gdGhlIHdha2UgdXAgbWV0aG9kIGlzIHNldA0KLSAqICAgICAgICB0byBhZGRyZXNzIG1hcmssIHRoZSBVQVJUIGhhbmRsZXMgb25seSA0LWJpdCBsb25nIGFkZHJlc3NlcyBkZXRlY3Rpb247DQotICogICAgICAgIHRoaXMgQVBJIGFsbG93cyB0byBlbmFibGUgbG9uZ2VyIGFkZHJlc3NlcyBkZXRlY3Rpb24gKDYtLCA3LSBvciA4LWJpdA0KLSAqICAgICAgICBsb25nKS4NCi0gKiBAbm90ZSAgQWRkcmVzc2VzIGRldGVjdGlvbiBsZW5ndGhzIGFyZTogNi1iaXQgYWRkcmVzcyBkZXRlY3Rpb24gaW4gNy1iaXQgZGF0YQ0KLSAqIG1vZGUsIDctYml0IGFkZHJlc3MgZGV0ZWN0aW9uIGluIDgtYml0IGRhdGEgbW9kZSwgOC1iaXQgYWRkcmVzcyBkZXRlY3Rpb24gaW4NCi0gKiA5LWJpdCBkYXRhIG1vZGUuDQotICogQHBhcmFtIGh1YXJ0ICAgICAgICAgVUFSVCBoYW5kbGUuDQotICogQHBhcmFtIEFkZHJlc3NMZW5ndGggVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gKiAgICAgICAgICBAYXJnIEByZWYgVUFSVF9BRERSRVNTX0RFVEVDVF80QiA0LWJpdCBsb25nIGFkZHJlc3MNCi0gKiAgICAgICAgICBAYXJnIEByZWYgVUFSVF9BRERSRVNTX0RFVEVDVF83QiA2LSwgNy0gb3IgOC1iaXQgbG9uZyBhZGRyZXNzDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX011bHRpUHJvY2Vzc29yRXhfQWRkcmVzc0xlbmd0aF9TZXQoDQotICAgIFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIHVpbnQzMl90IEFkZHJlc3NMZW5ndGgpIHsNCi0gIC8qIENoZWNrIHRoZSBVQVJUIGhhbmRsZSBhbGxvY2F0aW9uICovDQotICBpZiAoaHVhcnQgPT0gTlVMTCkgew0KLSAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgfQ0KLQ0KLSAgLyogQ2hlY2sgdGhlIGFkZHJlc3MgbGVuZ3RoIHBhcmFtZXRlciAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfQUREUkVTU0xFTkdUSF9ERVRFQ1QoQWRkcmVzc0xlbmd0aCkpOw0KLQ0KLSAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX0JVU1k7DQotDQotICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovDQotICBfX0hBTF9VQVJUX0RJU0FCTEUoaHVhcnQpOw0KLQ0KLSAgLyogU2V0IHRoZSBhZGRyZXNzIGxlbmd0aCAqLw0KLSAgTU9ESUZZX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX0FERE03LCBBZGRyZXNzTGVuZ3RoKTsNCi0NCi0gIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLw0KLSAgX19IQUxfVUFSVF9FTkFCTEUoaHVhcnQpOw0KLQ0KLSAgLyogVEVBQ0sgYW5kL29yIFJFQUNLIHRvIGNoZWNrIGJlZm9yZSBtb3ZpbmcgaHVhcnQtPmdTdGF0ZSB0byBSZWFkeSAqLw0KLSAgcmV0dXJuIChVQVJUX0NoZWNrSWRsZVN0YXRlKGh1YXJ0KSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBTZXQgV2FrZXVwIGZyb20gU3RvcCBtb2RlIGludGVycnVwdCBmbGFnIHNlbGVjdGlvbi4NCi0gKiBAbm90ZSBJdCBpcyB0aGUgYXBwbGljYXRpb24gcmVzcG9uc2liaWxpdHkgdG8gZW5hYmxlIHRoZSBpbnRlcnJ1cHQgdXNlZCBhcw0KLSAqICAgICAgIHVzYXJ0X3drdXAgaW50ZXJydXB0IHNvdXJjZSBiZWZvcmUgZW50ZXJpbmcgbG93LXBvd2VyIG1vZGUuDQotICogQHBhcmFtIGh1YXJ0ICAgICAgICAgICBVQVJUIGhhbmRsZS4NCi0gKiBAcGFyYW0gV2FrZVVwU2VsZWN0aW9uIEFkZHJlc3MgbWF0Y2gsIFN0YXJ0IEJpdCBkZXRlY3Rpb24gb3IgUlhORS9SWEZORSBiaXQNCi0gKiBzdGF0dXMuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgQGFyZyBAcmVmIFVBUlRfV0FLRVVQX09OX0FERFJFU1MNCi0gKiAgICAgICAgICBAYXJnIEByZWYgVUFSVF9XQUtFVVBfT05fU1RBUlRCSVQNCi0gKiAgICAgICAgICBAYXJnIEByZWYgVUFSVF9XQUtFVVBfT05fUkVBRERBVEFfTk9ORU1QVFkNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVEV4X1N0b3BNb2RlV2FrZVVwU291cmNlQ29uZmlnKA0KLSAgICBVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCBVQVJUX1dha2VVcFR5cGVEZWYgV2FrZVVwU2VsZWN0aW9uKSB7DQotICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7DQotICB1aW50MzJfdCB0aWNrc3RhcnQ7DQotDQotICAvKiBjaGVjayB0aGUgd2FrZS11cCBmcm9tIHN0b3AgbW9kZSBVQVJUIGluc3RhbmNlICovDQotICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9XQUtFVVBfRlJPTVNUT1BfSU5TVEFOQ0UoaHVhcnQtPkluc3RhbmNlKSk7DQotICAvKiBjaGVjayB0aGUgd2FrZS11cCBzZWxlY3Rpb24gcGFyYW1ldGVyICovDQotICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9XQUtFVVBfU0VMRUNUSU9OKFdha2VVcFNlbGVjdGlvbi5XYWtlVXBFdmVudCkpOw0KLQ0KLSAgLyogUHJvY2VzcyBMb2NrZWQgKi8NCi0gIF9fSEFMX0xPQ0soaHVhcnQpOw0KLQ0KLSAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX0JVU1k7DQotDQotICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovDQotICBfX0hBTF9VQVJUX0RJU0FCTEUoaHVhcnQpOw0KLQ0KLSAgLyogU2V0IHRoZSB3YWtlLXVwIHNlbGVjdGlvbiBzY2hlbWUgKi8NCi0gIE1PRElGWV9SRUcoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19XVVMsIFdha2VVcFNlbGVjdGlvbi5XYWtlVXBFdmVudCk7DQotDQotICBpZiAoV2FrZVVwU2VsZWN0aW9uLldha2VVcEV2ZW50ID09IFVBUlRfV0FLRVVQX09OX0FERFJFU1MpIHsNCi0gICAgVUFSVEV4X1dha2V1cF9BZGRyZXNzQ29uZmlnKGh1YXJ0LCBXYWtlVXBTZWxlY3Rpb24pOw0KLSAgfQ0KLQ0KLSAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovDQotICBfX0hBTF9VQVJUX0VOQUJMRShodWFydCk7DQotDQotICAvKiBJbml0IHRpY2tzdGFydCBmb3IgdGltZW91dCBtYW5hZ2VtZW50ICovDQotICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOw0KLQ0KLSAgLyogV2FpdCB1bnRpbCBSRUFDSyBmbGFnIGlzIHNldCAqLw0KLSAgaWYgKFVBUlRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChodWFydCwgVVNBUlRfSVNSX1JFQUNLLCBSRVNFVCwgdGlja3N0YXJ0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfVUFSVF9USU1FT1VUX1ZBTFVFKSAhPSBIQUxfT0spIHsNCi0gICAgc3RhdHVzID0gSEFMX1RJTUVPVVQ7DQotICB9IGVsc2Ugew0KLSAgICAvKiBJbml0aWFsaXplIHRoZSBVQVJUIFN0YXRlICovDQotICAgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsNCi0gIH0NCi0NCi0gIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8NCi0gIF9fSEFMX1VOTE9DSyhodWFydCk7DQotDQotICByZXR1cm4gc3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgRW5hYmxlIFVBUlQgU3RvcCBNb2RlLg0KLSAqIEBub3RlIFRoZSBVQVJUIGlzIGFibGUgdG8gd2FrZSB1cCB0aGUgTUNVIGZyb20gU3RvcCAxIG1vZGUgYXMgbG9uZyBhcyBVQVJUDQotICogY2xvY2sgaXMgSFNJIG9yIExTRS4NCi0gKiBAcGFyYW0gaHVhcnQgVUFSVCBoYW5kbGUuDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRFeF9FbmFibGVTdG9wTW9kZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KSB7DQotICAvKiBQcm9jZXNzIExvY2tlZCAqLw0KLSAgX19IQUxfTE9DSyhodWFydCk7DQotDQotICAvKiBTZXQgVUVTTSBiaXQgKi8NCi0gIEFUT01JQ19TRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVUVTTSk7DQotDQotICAvKiBQcm9jZXNzIFVubG9ja2VkICovDQotICBfX0hBTF9VTkxPQ0soaHVhcnQpOw0KLQ0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmIERpc2FibGUgVUFSVCBTdG9wIE1vZGUuDQotICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLg0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJURXhfRGlzYWJsZVN0b3BNb2RlKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpIHsNCi0gIC8qIFByb2Nlc3MgTG9ja2VkICovDQotICBfX0hBTF9MT0NLKGh1YXJ0KTsNCi0NCi0gIC8qIENsZWFyIFVFU00gYml0ICovDQotICBBVE9NSUNfQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVUVTTSk7DQotDQotICAvKiBQcm9jZXNzIFVubG9ja2VkICovDQotICBfX0hBTF9VTkxPQ0soaHVhcnQpOw0KLQ0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBFbmFibGUgdGhlIEZJRk8gbW9kZS4NCi0gKiBAcGFyYW0gaHVhcnQgICAgICBVQVJUIGhhbmRsZS4NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVEV4X0VuYWJsZUZpZm9Nb2RlKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpIHsNCi0gIHVpbnQzMl90IHRtcGNyMTsNCi0NCi0gIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoaHVhcnQtPkluc3RhbmNlKSk7DQotDQotICAvKiBQcm9jZXNzIExvY2tlZCAqLw0KLSAgX19IQUxfTE9DSyhodWFydCk7DQotDQotICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWTsNCi0NCi0gIC8qIFNhdmUgYWN0dWFsIFVBUlQgY29uZmlndXJhdGlvbiAqLw0KLSAgdG1wY3IxID0gUkVBRF9SRUcoaHVhcnQtPkluc3RhbmNlLT5DUjEpOw0KLQ0KLSAgLyogRGlzYWJsZSBVQVJUICovDQotICBfX0hBTF9VQVJUX0RJU0FCTEUoaHVhcnQpOw0KLQ0KLSAgLyogRW5hYmxlIEZJRk8gbW9kZSAqLw0KLSAgU0VUX0JJVCh0bXBjcjEsIFVTQVJUX0NSMV9GSUZPRU4pOw0KLSAgaHVhcnQtPkZpZm9Nb2RlID0gVUFSVF9GSUZPTU9ERV9FTkFCTEU7DQotDQotICAvKiBSZXN0b3JlIFVBUlQgY29uZmlndXJhdGlvbiAqLw0KLSAgV1JJVEVfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCB0bXBjcjEpOw0KLQ0KLSAgLyogRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgZGF0YSB0byBwcm9jZXNzIGR1cmluZyBSWC9UWCBJU1IgZXhlY3V0aW9uICovDQotICBVQVJURXhfU2V0TmJEYXRhVG9Qcm9jZXNzKGh1YXJ0KTsNCi0NCi0gIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsNCi0NCi0gIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8NCi0gIF9fSEFMX1VOTE9DSyhodWFydCk7DQotDQotICByZXR1cm4gSEFMX09LOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERpc2FibGUgdGhlIEZJRk8gbW9kZS4NCi0gKiBAcGFyYW0gaHVhcnQgICAgICBVQVJUIGhhbmRsZS4NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVEV4X0Rpc2FibGVGaWZvTW9kZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KSB7DQotICB1aW50MzJfdCB0bXBjcjE7DQotDQotICAvKiBDaGVjayBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9GSUZPX0lOU1RBTkNFKGh1YXJ0LT5JbnN0YW5jZSkpOw0KLQ0KLSAgLyogUHJvY2VzcyBMb2NrZWQgKi8NCi0gIF9fSEFMX0xPQ0soaHVhcnQpOw0KLQ0KLSAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX0JVU1k7DQotDQotICAvKiBTYXZlIGFjdHVhbCBVQVJUIGNvbmZpZ3VyYXRpb24gKi8NCi0gIHRtcGNyMSA9IFJFQURfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxKTsNCi0NCi0gIC8qIERpc2FibGUgVUFSVCAqLw0KLSAgX19IQUxfVUFSVF9ESVNBQkxFKGh1YXJ0KTsNCi0NCi0gIC8qIEVuYWJsZSBGSUZPIG1vZGUgKi8NCi0gIENMRUFSX0JJVCh0bXBjcjEsIFVTQVJUX0NSMV9GSUZPRU4pOw0KLSAgaHVhcnQtPkZpZm9Nb2RlID0gVUFSVF9GSUZPTU9ERV9ESVNBQkxFOw0KLQ0KLSAgLyogUmVzdG9yZSBVQVJUIGNvbmZpZ3VyYXRpb24gKi8NCi0gIFdSSVRFX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMSwgdG1wY3IxKTsNCi0NCi0gIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsNCi0NCi0gIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8NCi0gIF9fSEFMX1VOTE9DSyhodWFydCk7DQotDQotICByZXR1cm4gSEFMX09LOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCB0aGUgVFhGSUZPIHRocmVzaG9sZC4NCi0gKiBAcGFyYW0gaHVhcnQgICAgICBVQVJUIGhhbmRsZS4NCi0gKiBAcGFyYW0gVGhyZXNob2xkICBUWCBGSUZPIHRocmVzaG9sZCB2YWx1ZQ0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9UWEZJRk9fVEhSRVNIT0xEXzFfOA0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfVFhGSUZPX1RIUkVTSE9MRF8xXzQNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX1RYRklGT19USFJFU0hPTERfMV8yDQotICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9UWEZJRk9fVEhSRVNIT0xEXzNfNA0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfVFhGSUZPX1RIUkVTSE9MRF83XzgNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX1RYRklGT19USFJFU0hPTERfOF84DQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRFeF9TZXRUeEZpZm9UaHJlc2hvbGQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaHJlc2hvbGQpIHsNCi0gIHVpbnQzMl90IHRtcGNyMTsNCi0NCi0gIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoaHVhcnQtPkluc3RhbmNlKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9UWEZJRk9fVEhSRVNIT0xEKFRocmVzaG9sZCkpOw0KLQ0KLSAgLyogUHJvY2VzcyBMb2NrZWQgKi8NCi0gIF9fSEFMX0xPQ0soaHVhcnQpOw0KLQ0KLSAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX0JVU1k7DQotDQotICAvKiBTYXZlIGFjdHVhbCBVQVJUIGNvbmZpZ3VyYXRpb24gKi8NCi0gIHRtcGNyMSA9IFJFQURfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxKTsNCi0NCi0gIC8qIERpc2FibGUgVUFSVCAqLw0KLSAgX19IQUxfVUFSVF9ESVNBQkxFKGh1YXJ0KTsNCi0NCi0gIC8qIFVwZGF0ZSBUWCB0aHJlc2hvbGQgY29uZmlndXJhdGlvbiAqLw0KLSAgTU9ESUZZX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX1RYRlRDRkcsIFRocmVzaG9sZCk7DQotDQotICAvKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBkYXRhIHRvIHByb2Nlc3MgZHVyaW5nIFJYL1RYIElTUiBleGVjdXRpb24gKi8NCi0gIFVBUlRFeF9TZXROYkRhdGFUb1Byb2Nlc3MoaHVhcnQpOw0KLQ0KLSAgLyogUmVzdG9yZSBVQVJUIGNvbmZpZ3VyYXRpb24gKi8NCi0gIFdSSVRFX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMSwgdG1wY3IxKTsNCi0NCi0gIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsNCi0NCi0gIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8NCi0gIF9fSEFMX1VOTE9DSyhodWFydCk7DQotDQotICByZXR1cm4gSEFMX09LOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCB0aGUgUlhGSUZPIHRocmVzaG9sZC4NCi0gKiBAcGFyYW0gaHVhcnQgICAgICBVQVJUIGhhbmRsZS4NCi0gKiBAcGFyYW0gVGhyZXNob2xkICBSWCBGSUZPIHRocmVzaG9sZCB2YWx1ZQ0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9SWEZJRk9fVEhSRVNIT0xEXzFfOA0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfUlhGSUZPX1RIUkVTSE9MRF8xXzQNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX1JYRklGT19USFJFU0hPTERfMV8yDQotICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9SWEZJRk9fVEhSRVNIT0xEXzNfNA0KLSAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfUlhGSUZPX1RIUkVTSE9MRF83XzgNCi0gKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX1JYRklGT19USFJFU0hPTERfOF84DQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRFeF9TZXRSeEZpZm9UaHJlc2hvbGQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaHJlc2hvbGQpIHsNCi0gIHVpbnQzMl90IHRtcGNyMTsNCi0NCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9GSUZPX0lOU1RBTkNFKGh1YXJ0LT5JbnN0YW5jZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfUlhGSUZPX1RIUkVTSE9MRChUaHJlc2hvbGQpKTsNCi0NCi0gIC8qIFByb2Nlc3MgTG9ja2VkICovDQotICBfX0hBTF9MT0NLKGh1YXJ0KTsNCi0NCi0gIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9CVVNZOw0KLQ0KLSAgLyogU2F2ZSBhY3R1YWwgVUFSVCBjb25maWd1cmF0aW9uICovDQotICB0bXBjcjEgPSBSRUFEX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMSk7DQotDQotICAvKiBEaXNhYmxlIFVBUlQgKi8NCi0gIF9fSEFMX1VBUlRfRElTQUJMRShodWFydCk7DQotDQotICAvKiBVcGRhdGUgUlggdGhyZXNob2xkIGNvbmZpZ3VyYXRpb24gKi8NCi0gIE1PRElGWV9SRUcoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19SWEZUQ0ZHLCBUaHJlc2hvbGQpOw0KLQ0KLSAgLyogRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgZGF0YSB0byBwcm9jZXNzIGR1cmluZyBSWC9UWCBJU1IgZXhlY3V0aW9uICovDQotICBVQVJURXhfU2V0TmJEYXRhVG9Qcm9jZXNzKGh1YXJ0KTsNCi0NCi0gIC8qIFJlc3RvcmUgVUFSVCBjb25maWd1cmF0aW9uICovDQotICBXUklURV9SRUcoaHVhcnQtPkluc3RhbmNlLT5DUjEsIHRtcGNyMSk7DQotDQotICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7DQotDQotICAvKiBQcm9jZXNzIFVubG9ja2VkICovDQotICBfX0hBTF9VTkxPQ0soaHVhcnQpOw0KLQ0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZSB0aWxsIGVpdGhlciB0aGUgZXhwZWN0ZWQNCi0gKiBudW1iZXIgb2YgZGF0YSBpcyByZWNlaXZlZCBvciBhbiBJRExFIGV2ZW50IG9jY3Vycy4NCi0gKiBAbm90ZSAgSEFMX09LIGlzIHJldHVybmVkIGlmIHJlY2VwdGlvbiBpcyBjb21wbGV0ZWQgKGV4cGVjdGVkIG51bWJlciBvZiBkYXRhDQotICogaGFzIGJlZW4gcmVjZWl2ZWQpIG9yIGlmIHJlY2VwdGlvbiBpcyBzdG9wcGVkIGFmdGVyIElETEUgZXZlbnQgKGxlc3MgdGhhbiB0aGUNCi0gKiBleHBlY3RlZCBudW1iZXIgb2YgZGF0YSBoYXMgYmVlbiByZWNlaXZlZCkgSW4gdGhpcyBjYXNlLCBSeExlbiBvdXRwdXQNCi0gKiBwYXJhbWV0ZXIgaW5kaWNhdGVzIG51bWJlciBvZiBkYXRhIGF2YWlsYWJsZSBpbiByZWNlcHRpb24gYnVmZmVyLg0KLSAqIEBub3RlICBXaGVuIFVBUlQgcGFyaXR5IGlzIG5vdCBlbmFibGVkIChQQ0UgPSAwKSwgYW5kIFdvcmQgTGVuZ3RoIGlzDQotICogY29uZmlndXJlZCB0byA5IGJpdHMgKE0xLU0wID0gMDEpLCB0aGUgcmVjZWl2ZWQgZGF0YSBpcyBoYW5kbGVkIGFzIGEgc2V0IG9mDQotICogdWludDE2X3QuIEluIHRoaXMgY2FzZSwgU2l6ZSBtdXN0IGluZGljYXRlIHRoZSBudW1iZXIgb2YgdWludDE2X3QgYXZhaWxhYmxlDQotICogdGhyb3VnaCBwRGF0YS4NCi0gKiBAbm90ZSBXaGVuIEZJRk8gbW9kZSBpcyBlbmFibGVkLCB0aGUgUlhGTkUgZmxhZyBpcyBzZXQgYXMgbG9uZyBhcyB0aGUgUlhGSUZPDQotICogICAgICAgaXMgbm90IGVtcHR5LiBSZWFkIG9wZXJhdGlvbnMgZnJvbSB0aGUgUkRSIHJlZ2lzdGVyIGFyZSBwZXJmb3JtZWQgd2hlbg0KLSAqICAgICAgIFJYRk5FIGZsYWcgaXMgc2V0LiBGcm9tIGhhcmR3YXJlIHBlcnNwZWN0aXZlLCBSWEZORSBmbGFnIGFuZA0KLSAqICAgICAgIFJYTkUgYXJlIG1hcHBlZCBvbiB0aGUgc2FtZSBiaXQtZmllbGQuDQotICogQHBhcmFtIGh1YXJ0ICAgVUFSVCBoYW5kbGUuDQotICogQHBhcmFtIHBEYXRhICAgUG9pbnRlciB0byBkYXRhIGJ1ZmZlciAodWludDhfdCBvciB1aW50MTZfdCBkYXRhIGVsZW1lbnRzKS4NCi0gKiBAcGFyYW0gU2l6ZSAgICBBbW91bnQgb2YgZGF0YSBlbGVtZW50cyAodWludDhfdCBvciB1aW50MTZfdCkgdG8gYmUgcmVjZWl2ZWQuDQotICogQHBhcmFtIFJ4TGVuICAgTnVtYmVyIG9mIGRhdGEgZWxlbWVudHMgZmluYWxseSByZWNlaXZlZA0KLSAqICAgICAgICAgICAgICAgIChjb3VsZCBiZSBsb3dlciB0aGFuIFNpemUsIGluIGNhc2UgcmVjZXB0aW9uIGVuZHMgb24gSURMRQ0KLSAqIGV2ZW50KQ0KLSAqIEBwYXJhbSBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24gZXhwcmVzc2VkIGluIG1zIChjb3ZlcnMgdGhlIHdob2xlIHJlY2VwdGlvbg0KLSAqIHNlcXVlbmNlKS4NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVEV4X1JlY2VpdmVUb0lkbGUoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICpSeExlbiwgdWludDMyX3QgVGltZW91dCkgew0KLSAgdWludDhfdCAqcGRhdGE4Yml0czsNCi0gIHVpbnQxNl90ICpwZGF0YTE2Yml0czsNCi0gIHVpbnQxNl90IHVoTWFzazsNCi0gIHVpbnQzMl90IHRpY2tzdGFydDsNCi0NCi0gIC8qIENoZWNrIHRoYXQgYSBSeCBwcm9jZXNzIGlzIG5vdCBhbHJlYWR5IG9uZ29pbmcgKi8NCi0gIGlmIChodWFydC0+UnhTdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9SRUFEWSkgew0KLSAgICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkgew0KLSAgICAgIHJldHVybiBIQUxfRVJST1I7DQotICAgIH0NCi0NCi0gICAgX19IQUxfTE9DSyhodWFydCk7DQotDQotICAgIGh1YXJ0LT5FcnJvckNvZGUgPSBIQUxfVUFSVF9FUlJPUl9OT05FOw0KLSAgICBodWFydC0+UnhTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX0JVU1lfUlg7DQotICAgIGh1YXJ0LT5SZWNlcHRpb25UeXBlID0gSEFMX1VBUlRfUkVDRVBUSU9OX1RPSURMRTsNCi0NCi0gICAgLyogSW5pdCB0aWNrc3RhcnQgZm9yIHRpbWVvdXQgbWFuYWdlbWVudCAqLw0KLSAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOw0KLQ0KLSAgICBodWFydC0+UnhYZmVyU2l6ZSA9IFNpemU7DQotICAgIGh1YXJ0LT5SeFhmZXJDb3VudCA9IFNpemU7DQotDQotICAgIC8qIENvbXB1dGF0aW9uIG9mIFVBUlQgbWFzayB0byBhcHBseSB0byBSRFIgcmVnaXN0ZXIgKi8NCi0gICAgVUFSVF9NQVNLX0NPTVBVVEFUSU9OKGh1YXJ0KTsNCi0gICAgdWhNYXNrID0gaHVhcnQtPk1hc2s7DQotDQotICAgIC8qIEluIGNhc2Ugb2YgOWJpdHMvTm8gUGFyaXR5IHRyYW5zZmVyLCBwUnhEYXRhIG5lZWRzIHRvIGJlIGhhbmRsZWQgYXMgYQ0KLSAgICAgKiB1aW50MTZfdCBwb2ludGVyICovDQotICAgIGlmICgoaHVhcnQtPkluaXQuV29yZExlbmd0aCA9PSBVQVJUX1dPUkRMRU5HVEhfOUIpICYmDQotICAgICAgICAoaHVhcnQtPkluaXQuUGFyaXR5ID09IFVBUlRfUEFSSVRZX05PTkUpKSB7DQotICAgICAgcGRhdGE4Yml0cyA9IE5VTEw7DQotICAgICAgcGRhdGExNmJpdHMgPSAodWludDE2X3QgKilwRGF0YTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICBwZGF0YThiaXRzID0gcERhdGE7DQotICAgICAgcGRhdGExNmJpdHMgPSBOVUxMOw0KLSAgICB9DQotDQotICAgIF9fSEFMX1VOTE9DSyhodWFydCk7DQotDQotICAgIC8qIEluaXRpYWxpemUgb3V0cHV0IG51bWJlciBvZiByZWNlaXZlZCBlbGVtZW50cyAqLw0KLSAgICAqUnhMZW4gPSAwVTsNCi0NCi0gICAgLyogYXMgbG9uZyBhcyBkYXRhIGhhdmUgdG8gYmUgcmVjZWl2ZWQgKi8NCi0gICAgd2hpbGUgKGh1YXJ0LT5SeFhmZXJDb3VudCA+IDBVKSB7DQotICAgICAgLyogQ2hlY2sgaWYgSURMRSBmbGFnIGlzIHNldCAqLw0KLSAgICAgIGlmIChfX0hBTF9VQVJUX0dFVF9GTEFHKGh1YXJ0LCBVQVJUX0ZMQUdfSURMRSkpIHsNCi0gICAgICAgIC8qIENsZWFyIElETEUgZmxhZyBpbiBJU1IgKi8NCi0gICAgICAgIF9fSEFMX1VBUlRfQ0xFQVJfRkxBRyhodWFydCwgVUFSVF9DTEVBUl9JRExFRik7DQotDQotICAgICAgICAvKiBJZiBTZXQsIGJ1dCBubyBkYXRhIGV2ZXIgcmVjZWl2ZWQsIGNsZWFyIGZsYWcgd2l0aG91dCBleGl0aW5nIGxvb3AgKi8NCi0gICAgICAgIC8qIElmIFNldCwgYW5kIGRhdGEgaGFzIGFscmVhZHkgYmVlbiByZWNlaXZlZCwgdGhpcyBtZWFucyBJZGxlIEV2ZW50IGlzDQotICAgICAgICAgKiB2YWxpZCA6IEVuZCByZWNlcHRpb24gKi8NCi0gICAgICAgIGlmICgqUnhMZW4gPiAwVSkgew0KLSAgICAgICAgICBodWFydC0+UnhTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOw0KLQ0KLSAgICAgICAgICByZXR1cm4gSEFMX09LOw0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0NCi0gICAgICAvKiBDaGVjayBpZiBSWE5FIGZsYWcgaXMgc2V0ICovDQotICAgICAgaWYgKF9fSEFMX1VBUlRfR0VUX0ZMQUcoaHVhcnQsIFVBUlRfRkxBR19SWE5FKSkgew0KLSAgICAgICAgaWYgKHBkYXRhOGJpdHMgPT0gTlVMTCkgew0KLSAgICAgICAgICAqcGRhdGExNmJpdHMgPSAodWludDE2X3QpKGh1YXJ0LT5JbnN0YW5jZS0+UkRSICYgdWhNYXNrKTsNCi0gICAgICAgICAgcGRhdGExNmJpdHMrKzsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICpwZGF0YThiaXRzID0gKHVpbnQ4X3QpKGh1YXJ0LT5JbnN0YW5jZS0+UkRSICYgKHVpbnQ4X3QpdWhNYXNrKTsNCi0gICAgICAgICAgcGRhdGE4Yml0cysrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgLyogSW5jcmVtZW50IG51bWJlciBvZiByZWNlaXZlZCBlbGVtZW50cyAqLw0KLSAgICAgICAgKlJ4TGVuICs9IDFVOw0KLSAgICAgICAgaHVhcnQtPlJ4WGZlckNvdW50LS07DQotICAgICAgfQ0KLQ0KLSAgICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLw0KLSAgICAgIGlmIChUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpIHsNCi0gICAgICAgIGlmICgoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gVGltZW91dCkgfHwgKFRpbWVvdXQgPT0gMFUpKSB7DQotICAgICAgICAgIGh1YXJ0LT5SeFN0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7DQotDQotICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsNCi0gICAgICAgIH0NCi0gICAgICB9DQotICAgIH0NCi0NCi0gICAgLyogU2V0IG51bWJlciBvZiByZWNlaXZlZCBlbGVtZW50cyBpbiBvdXRwdXQgcGFyYW1ldGVyIDogUnhMZW4gKi8NCi0gICAgKlJ4TGVuID0gaHVhcnQtPlJ4WGZlclNpemUgLSBodWFydC0+UnhYZmVyQ291bnQ7DQotICAgIC8qIEF0IGVuZCBvZiBSeCBwcm9jZXNzLCByZXN0b3JlIGh1YXJ0LT5SeFN0YXRlIHRvIFJlYWR5ICovDQotICAgIGh1YXJ0LT5SeFN0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7DQotDQotICAgIHJldHVybiBIQUxfT0s7DQotICB9IGVsc2Ugew0KLSAgICByZXR1cm4gSEFMX0JVU1k7DQotICB9DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIGludGVycnVwdCBtb2RlIHRpbGwgZWl0aGVyIHRoZSBleHBlY3RlZA0KLSAqIG51bWJlciBvZiBkYXRhIGlzIHJlY2VpdmVkIG9yIGFuIElETEUgZXZlbnQgb2NjdXJzLg0KLSAqIEBub3RlICBSZWNlcHRpb24gaXMgaW5pdGlhdGVkIGJ5IHRoaXMgZnVuY3Rpb24gY2FsbC4gRnVydGhlciBwcm9ncmVzcyBvZg0KLSAqIHJlY2VwdGlvbiBpcyBhY2hpZXZlZCB0aGFua3MgdG8gVUFSVCBpbnRlcnJ1cHRzIHJhaXNlZCBieSBSWE5FIGFuZCBJRExFDQotICogZXZlbnRzLiBDYWxsYmFjayBpcyBjYWxsZWQgYXQgZW5kIG9mIHJlY2VwdGlvbiBpbmRpY2F0aW5nIG51bWJlciBvZiByZWNlaXZlZA0KLSAqIGRhdGEgZWxlbWVudHMuDQotICogQG5vdGUgIFdoZW4gVUFSVCBwYXJpdHkgaXMgbm90IGVuYWJsZWQgKFBDRSA9IDApLCBhbmQgV29yZCBMZW5ndGggaXMNCi0gKiBjb25maWd1cmVkIHRvIDkgYml0cyAoTTEtTTAgPSAwMSksIHRoZSByZWNlaXZlZCBkYXRhIGlzIGhhbmRsZWQgYXMgYSBzZXQgb2YNCi0gKiB1aW50MTZfdC4gSW4gdGhpcyBjYXNlLCBTaXplIG11c3QgaW5kaWNhdGUgdGhlIG51bWJlciBvZiB1aW50MTZfdCBhdmFpbGFibGUNCi0gKiB0aHJvdWdoIHBEYXRhLg0KLSAqIEBwYXJhbSBodWFydCBVQVJUIGhhbmRsZS4NCi0gKiBAcGFyYW0gcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlciAodWludDhfdCBvciB1aW50MTZfdCBkYXRhIGVsZW1lbnRzKS4NCi0gKiBAcGFyYW0gU2l6ZSAgQW1vdW50IG9mIGRhdGEgZWxlbWVudHMgKHVpbnQ4X3Qgb3IgdWludDE2X3QpIHRvIGJlIHJlY2VpdmVkLg0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJURXhfUmVjZWl2ZVRvSWRsZV9JVChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSkgew0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzOw0KLQ0KLSAgLyogQ2hlY2sgdGhhdCBhIFJ4IHByb2Nlc3MgaXMgbm90IGFscmVhZHkgb25nb2luZyAqLw0KLSAgaWYgKGh1YXJ0LT5SeFN0YXRlID09IEhBTF9VQVJUX1NUQVRFX1JFQURZKSB7DQotICAgIGlmICgocERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKSB7DQotICAgICAgcmV0dXJuIEhBTF9FUlJPUjsNCi0gICAgfQ0KLQ0KLSAgICBfX0hBTF9MT0NLKGh1YXJ0KTsNCi0NCi0gICAgLyogU2V0IFJlY2VwdGlvbiB0eXBlIHRvIHJlY2VwdGlvbiB0aWxsIElETEUgRXZlbnQqLw0KLSAgICBodWFydC0+UmVjZXB0aW9uVHlwZSA9IEhBTF9VQVJUX1JFQ0VQVElPTl9UT0lETEU7DQotDQotICAgIHN0YXR1cyA9IFVBUlRfU3RhcnRfUmVjZWl2ZV9JVChodWFydCwgcERhdGEsIFNpemUpOw0KLQ0KLSAgICAvKiBDaGVjayBSeCBwcm9jZXNzIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzdGFydGVkICovDQotICAgIGlmIChzdGF0dXMgPT0gSEFMX09LKSB7DQotICAgICAgaWYgKGh1YXJ0LT5SZWNlcHRpb25UeXBlID09IEhBTF9VQVJUX1JFQ0VQVElPTl9UT0lETEUpIHsNCi0gICAgICAgIF9fSEFMX1VBUlRfQ0xFQVJfRkxBRyhodWFydCwgVUFSVF9DTEVBUl9JRExFRik7DQotICAgICAgICBBVE9NSUNfU0VUX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX0lETEVJRSk7DQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgIC8qIEluIGNhc2Ugb2YgZXJyb3JzIGFscmVhZHkgcGVuZGluZyB3aGVuIHJlY2VwdGlvbiBpcyBzdGFydGVkLA0KLSAgICAgICAgICAgSW50ZXJydXB0cyBtYXkgaGF2ZSBhbHJlYWR5IGJlZW4gcmFpc2VkIGFuZCBsZWFkIHRvIHJlY2VwdGlvbg0KLSAgICAgICAgICAgYWJvcnRpb24uIChPdmVycnVuIGVycm9yIGZvciBpbnN0YW5jZSkuIEluIHN1Y2ggY2FzZSBSZWNlcHRpb24gVHlwZQ0KLSAgICAgICAgICAgaGFzIGJlZW4gcmVzZXQgdG8gSEFMX1VBUlRfUkVDRVBUSU9OX1NUQU5EQVJELiAqLw0KLSAgICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOw0KLSAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICByZXR1cm4gc3RhdHVzOw0KLSAgfSBlbHNlIHsNCi0gICAgcmV0dXJuIEhBTF9CVVNZOw0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBETUEgbW9kZSB0aWxsIGVpdGhlciB0aGUgZXhwZWN0ZWQgbnVtYmVyDQotICogICAgICAgIG9mIGRhdGEgaXMgcmVjZWl2ZWQgb3IgYW4gSURMRSBldmVudCBvY2N1cnMuDQotICogQG5vdGUgIFJlY2VwdGlvbiBpcyBpbml0aWF0ZWQgYnkgdGhpcyBmdW5jdGlvbiBjYWxsLiBGdXJ0aGVyIHByb2dyZXNzIG9mDQotICogcmVjZXB0aW9uIGlzIGFjaGlldmVkIHRoYW5rcyB0byBETUEgc2VydmljZXMsIHRyYW5zZmVycmluZyBhdXRvbWF0aWNhbGx5DQotICogcmVjZWl2ZWQgZGF0YSBlbGVtZW50cyBpbiB1c2VyIHJlY2VwdGlvbiBidWZmZXIgYW5kIGNhbGxpbmcgcmVnaXN0ZXJlZA0KLSAqIGNhbGxiYWNrcyBhdCBoYWxmL2VuZCBvZiByZWNlcHRpb24uIFVBUlQgSURMRSBldmVudHMgYXJlIGFsc28gdXNlZCB0bw0KLSAqIGNvbnNpZGVyIHJlY2VwdGlvbiBwaGFzZSBhcyBlbmRlZC4gSW4gYWxsIGNhc2VzLCBjYWxsYmFjayBleGVjdXRpb24gd2lsbA0KLSAqIGluZGljYXRlIG51bWJlciBvZiByZWNlaXZlZCBkYXRhIGVsZW1lbnRzLg0KLSAqIEBub3RlICBXaGVuIHRoZSBVQVJUIHBhcml0eSBpcyBlbmFibGVkIChQQ0UgPSAxKSwgdGhlIHJlY2VpdmVkIGRhdGEgY29udGFpbg0KLSAqICAgICAgICB0aGUgcGFyaXR5IGJpdCAoTVNCIHBvc2l0aW9uKS4NCi0gKiBAbm90ZSAgV2hlbiBVQVJUIHBhcml0eSBpcyBub3QgZW5hYmxlZCAoUENFID0gMCksIGFuZCBXb3JkIExlbmd0aCBpcw0KLSAqIGNvbmZpZ3VyZWQgdG8gOSBiaXRzIChNMS1NMCA9IDAxKSwgdGhlIHJlY2VpdmVkIGRhdGEgaXMgaGFuZGxlZCBhcyBhIHNldCBvZg0KLSAqIHVpbnQxNl90LiBJbiB0aGlzIGNhc2UsIFNpemUgbXVzdCBpbmRpY2F0ZSB0aGUgbnVtYmVyIG9mIHVpbnQxNl90IGF2YWlsYWJsZQ0KLSAqIHRocm91Z2ggcERhdGEuDQotICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLg0KLSAqIEBwYXJhbSBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyICh1aW50OF90IG9yIHVpbnQxNl90IGRhdGEgZWxlbWVudHMpLg0KLSAqIEBwYXJhbSBTaXplICBBbW91bnQgb2YgZGF0YSBlbGVtZW50cyAodWludDhfdCBvciB1aW50MTZfdCkgdG8gYmUgcmVjZWl2ZWQuDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRFeF9SZWNlaXZlVG9JZGxlX0RNQShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpIHsNCi0gIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1czsNCi0NCi0gIC8qIENoZWNrIHRoYXQgYSBSeCBwcm9jZXNzIGlzIG5vdCBhbHJlYWR5IG9uZ29pbmcgKi8NCi0gIGlmIChodWFydC0+UnhTdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9SRUFEWSkgew0KLSAgICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkgew0KLSAgICAgIHJldHVybiBIQUxfRVJST1I7DQotICAgIH0NCi0NCi0gICAgX19IQUxfTE9DSyhodWFydCk7DQotDQotICAgIC8qIFNldCBSZWNlcHRpb24gdHlwZSB0byByZWNlcHRpb24gdGlsbCBJRExFIEV2ZW50Ki8NCi0gICAgaHVhcnQtPlJlY2VwdGlvblR5cGUgPSBIQUxfVUFSVF9SRUNFUFRJT05fVE9JRExFOw0KLQ0KLSAgICBzdGF0dXMgPSBVQVJUX1N0YXJ0X1JlY2VpdmVfRE1BKGh1YXJ0LCBwRGF0YSwgU2l6ZSk7DQotDQotICAgIC8qIENoZWNrIFJ4IHByb2Nlc3MgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQgKi8NCi0gICAgaWYgKHN0YXR1cyA9PSBIQUxfT0spIHsNCi0gICAgICBpZiAoaHVhcnQtPlJlY2VwdGlvblR5cGUgPT0gSEFMX1VBUlRfUkVDRVBUSU9OX1RPSURMRSkgew0KLSAgICAgICAgX19IQUxfVUFSVF9DTEVBUl9GTEFHKGh1YXJ0LCBVQVJUX0NMRUFSX0lETEVGKTsNCi0gICAgICAgIEFUT01JQ19TRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfSURMRUlFKTsNCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgLyogSW4gY2FzZSBvZiBlcnJvcnMgYWxyZWFkeSBwZW5kaW5nIHdoZW4gcmVjZXB0aW9uIGlzIHN0YXJ0ZWQsDQotICAgICAgICAgICBJbnRlcnJ1cHRzIG1heSBoYXZlIGFscmVhZHkgYmVlbiByYWlzZWQgYW5kIGxlYWQgdG8gcmVjZXB0aW9uDQotICAgICAgICAgICBhYm9ydGlvbi4gKE92ZXJydW4gZXJyb3IgZm9yIGluc3RhbmNlKS4gSW4gc3VjaCBjYXNlIFJlY2VwdGlvbiBUeXBlDQotICAgICAgICAgICBoYXMgYmVlbiByZXNldCB0byBIQUxfVUFSVF9SRUNFUFRJT05fU1RBTkRBUkQuICovDQotICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7DQotICAgICAgfQ0KLSAgICB9DQotDQotICAgIHJldHVybiBzdGF0dXM7DQotICB9IGVsc2Ugew0KLSAgICByZXR1cm4gSEFMX0JVU1k7DQotICB9DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKiogQGFkZHRvZ3JvdXAgVUFSVEV4X1ByaXZhdGVfRnVuY3Rpb25zDQotICogQHsNCi0gKi8NCi0NCi0vKioNCi0gKiBAYnJpZWYgSW5pdGlhbGl6ZSB0aGUgVUFSVCB3YWtlLXVwIGZyb20gc3RvcCBtb2RlIHBhcmFtZXRlcnMgd2hlbiB0cmlnZ2VyZWQNCi0gKiBieSBhZGRyZXNzIGRldGVjdGlvbi4NCi0gKiBAcGFyYW0gaHVhcnQgICAgICAgICAgIFVBUlQgaGFuZGxlLg0KLSAqIEBwYXJhbSBXYWtlVXBTZWxlY3Rpb24gVUFSVCB3YWtlIHVwIGZyb20gc3RvcCBtb2RlIHBhcmFtZXRlcnMuDQotICogQHJldHZhbCBOb25lDQotICovDQotc3RhdGljIHZvaWQgVUFSVEV4X1dha2V1cF9BZGRyZXNzQ29uZmlnKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVBUlRfV2FrZVVwVHlwZURlZiBXYWtlVXBTZWxlY3Rpb24pIHsNCi0gIGFzc2VydF9wYXJhbShJU19VQVJUX0FERFJFU1NMRU5HVEhfREVURUNUKFdha2VVcFNlbGVjdGlvbi5BZGRyZXNzTGVuZ3RoKSk7DQotDQotICAvKiBTZXQgdGhlIFVTQVJUIGFkZHJlc3MgbGVuZ3RoICovDQotICBNT0RJRllfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IyLCBVU0FSVF9DUjJfQURETTcsDQotICAgICAgICAgICAgIFdha2VVcFNlbGVjdGlvbi5BZGRyZXNzTGVuZ3RoKTsNCi0NCi0gIC8qIFNldCB0aGUgVVNBUlQgYWRkcmVzcyBub2RlICovDQotICBNT0RJRllfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IyLCBVU0FSVF9DUjJfQURELA0KLSAgICAgICAgICAgICAoKHVpbnQzMl90KVdha2VVcFNlbGVjdGlvbi5BZGRyZXNzIDw8IFVBUlRfQ1IyX0FERFJFU1NfTFNCX1BPUykpOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgZGF0YSB0byBwcm9jZXNzIGluIFJYL1RYIElTUi4NCi0gKiBAbm90ZSBUaGUgUlggRklGTyBkZXB0aCBhbmQgdGhlIFRYIEZJRk8gZGVwdGggaXMgZXh0cmFjdGVkIGZyb20NCi0gKiAgICAgICB0aGUgVUFSVCBjb25maWd1cmF0aW9uIHJlZ2lzdGVycy4NCi0gKiBAcGFyYW0gaHVhcnQgVUFSVCBoYW5kbGUuDQotICogQHJldHZhbCBOb25lDQotICovDQotc3RhdGljIHZvaWQgVUFSVEV4X1NldE5iRGF0YVRvUHJvY2VzcyhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KSB7DQotICB1aW50OF90IHJ4X2ZpZm9fZGVwdGg7DQotICB1aW50OF90IHR4X2ZpZm9fZGVwdGg7DQotICB1aW50OF90IHJ4X2ZpZm9fdGhyZXNob2xkOw0KLSAgdWludDhfdCB0eF9maWZvX3RocmVzaG9sZDsNCi0gIHN0YXRpYyBjb25zdCB1aW50OF90IG51bWVyYXRvcltdID0gezFVLCAxVSwgMVUsIDNVLCA3VSwgMVUsIDBVLCAwVX07DQotICBzdGF0aWMgY29uc3QgdWludDhfdCBkZW5vbWluYXRvcltdID0gezhVLCA0VSwgMlUsIDRVLCA4VSwgMVUsIDFVLCAxVX07DQotDQotICBpZiAoaHVhcnQtPkZpZm9Nb2RlID09IFVBUlRfRklGT01PREVfRElTQUJMRSkgew0KLSAgICBodWFydC0+TmJUeERhdGFUb1Byb2Nlc3MgPSAxVTsNCi0gICAgaHVhcnQtPk5iUnhEYXRhVG9Qcm9jZXNzID0gMVU7DQotICB9IGVsc2Ugew0KLSAgICByeF9maWZvX2RlcHRoID0gUlhfRklGT19ERVBUSDsNCi0gICAgdHhfZmlmb19kZXB0aCA9IFRYX0ZJRk9fREVQVEg7DQotICAgIHJ4X2ZpZm9fdGhyZXNob2xkID0NCi0gICAgICAgICh1aW50OF90KShSRUFEX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX1JYRlRDRkcpID4+DQotICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IzX1JYRlRDRkdfUG9zKTsNCi0gICAgdHhfZmlmb190aHJlc2hvbGQgPQ0KLSAgICAgICAgKHVpbnQ4X3QpKFJFQURfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfVFhGVENGRykgPj4NCi0gICAgICAgICAgICAgICAgICBVU0FSVF9DUjNfVFhGVENGR19Qb3MpOw0KLSAgICBodWFydC0+TmJUeERhdGFUb1Byb2Nlc3MgPQ0KLSAgICAgICAgKCh1aW50MTZfdCl0eF9maWZvX2RlcHRoICogbnVtZXJhdG9yW3R4X2ZpZm9fdGhyZXNob2xkXSkgLw0KLSAgICAgICAgKHVpbnQxNl90KWRlbm9taW5hdG9yW3R4X2ZpZm9fdGhyZXNob2xkXTsNCi0gICAgaHVhcnQtPk5iUnhEYXRhVG9Qcm9jZXNzID0NCi0gICAgICAgICgodWludDE2X3QpcnhfZmlmb19kZXB0aCAqIG51bWVyYXRvcltyeF9maWZvX3RocmVzaG9sZF0pIC8NCi0gICAgICAgICh1aW50MTZfdClkZW5vbWluYXRvcltyeF9maWZvX3RocmVzaG9sZF07DQotICB9DQotfQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotI2VuZGlmIC8qIEhBTF9VQVJUX01PRFVMRV9FTkFCTEVEICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmc0eHhfaGFsX3VhcnRfZXguYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgRXh0ZW5kZWQgVUFSVCBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCisgIGV4dGVuZGVkCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBVbml2ZXJzYWwgQXN5bmNocm9ub3VzIFJlY2VpdmVyIFRyYW5zbWl0dGVyCisgIFBlcmlwaGVyYWwgKFVBUlQpLgorICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgICoKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRlcm1zIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUKKyAgKiBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb2Z0d2FyZSBjb21wb25lbnQuCisgICogSWYgbm8gTElDRU5TRSBmaWxlIGNvbWVzIHdpdGggdGhpcyBzb2Z0d2FyZSwgaXQgaXMgcHJvdmlkZWQgQVMtSVMuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICMjIyMjIFVBUlQgcGVyaXBoZXJhbCBleHRlbmRlZCBmZWF0dXJlcyAgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAoIykgRGVjbGFyZSBhIFVBUlRfSGFuZGxlVHlwZURlZiBoYW5kbGUgc3RydWN0dXJlLgorCisgICAgKCMpIEZvciB0aGUgVUFSVCBSUzQ4NSBEcml2ZXIgRW5hYmxlIG1vZGUsIGluaXRpYWxpemUgdGhlIFVBUlQgcmVnaXN0ZXJzCisgICAgICAgIGJ5IGNhbGxpbmcgdGhlIEhBTF9SUzQ4NUV4X0luaXQoKSBBUEkuCisKKyAgICAoIykgRklGTyBtb2RlIGVuYWJsaW5nL2Rpc2FibGluZyBhbmQgUlgvVFggRklGTyB0aHJlc2hvbGQgcHJvZ3JhbW1pbmcuCisKKyAgICAgICAgLUAtIFdoZW4gVUFSVCBvcGVyYXRlcyBpbiBGSUZPIG1vZGUsIEZJRk8gbW9kZSBtdXN0IGJlIGVuYWJsZWQgcHJpb3IKKyAgICAgICAgICAgIHN0YXJ0aW5nIFJYL1RYIHRyYW5zZmVycy4gQWxzbyBSWC9UWCBGSUZPIHRocmVzaG9sZHMgbXVzdCBiZQorICAgICAgICAgICAgY29uZmlndXJlZCBwcmlvciBzdGFydGluZyBSWC9UWCB0cmFuc2ZlcnMuCisKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzR4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzR4eF9IQUxfRHJpdmVyCisgKiBAeworICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVEV4IFVBUlRFeAorICogQGJyaWVmIFVBUlQgRXh0ZW5kZWQgSEFMIG1vZHVsZSBkcml2ZXIKKyAqIEB7CisgKi8KKworI2lmZGVmIEhBTF9VQVJUX01PRFVMRV9FTkFCTEVECisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBVQVJURVhfUHJpdmF0ZV9Db25zdGFudHMgVUFSVEV4IFByaXZhdGUgQ29uc3RhbnRzCisgKiBAeworICovCisvKiBVQVJUIFJYIEZJRk8gZGVwdGggKi8KKyNkZWZpbmUgUlhfRklGT19ERVBUSCA4VQorCisvKiBVQVJUIFRYIEZJRk8gZGVwdGggKi8KKyNkZWZpbmUgVFhfRklGT19ERVBUSCA4VQorLyoqCisgKiBAfQorICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVUFSVEV4X1ByaXZhdGVfRnVuY3Rpb25zIFVBUlRFeCBQcml2YXRlIEZ1bmN0aW9ucworICogQHsKKyAqLworc3RhdGljIHZvaWQgVUFSVEV4X1dha2V1cF9BZGRyZXNzQ29uZmlnKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUFSVF9XYWtlVXBUeXBlRGVmIFdha2VVcFNlbGVjdGlvbik7CitzdGF0aWMgdm9pZCBVQVJURXhfU2V0TmJEYXRhVG9Qcm9jZXNzKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworLyoqCisgKiBAfQorICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVEV4X0V4cG9ydGVkX0Z1bmN0aW9ucyAgVUFSVEV4IEV4cG9ydGVkIEZ1bmN0aW9ucworICogQHsKKyAqLworCisvKiogQGRlZmdyb3VwIFVBUlRFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZAorZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogQGJyaWVmICAgIEV4dGVuZGVkIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIEZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBpbml0aWFsaXplIHRoZQorVVNBUlR4IG9yIHRoZSBVQVJUeSBpbiBhc3luY2hyb25vdXMgbW9kZS4KKyAgICAgICgrKSBGb3IgdGhlIGFzeW5jaHJvbm91cyBtb2RlIHRoZSBwYXJhbWV0ZXJzIGJlbG93IGNhbiBiZSBjb25maWd1cmVkOgorICAgICAgICAoKyspIEJhdWQgUmF0ZQorICAgICAgICAoKyspIFdvcmQgTGVuZ3RoCisgICAgICAgICgrKykgU3RvcCBCaXQKKyAgICAgICAgKCsrKSBQYXJpdHk6IElmIHRoZSBwYXJpdHkgaXMgZW5hYmxlZCwgdGhlbiB0aGUgTVNCIGJpdCBvZiB0aGUgZGF0YQord3JpdHRlbiBpbiB0aGUgZGF0YSByZWdpc3RlciBpcyB0cmFuc21pdHRlZCBidXQgaXMgY2hhbmdlZCBieSB0aGUgcGFyaXR5IGJpdC4KKyAgICAgICAgKCsrKSBIYXJkd2FyZSBmbG93IGNvbnRyb2wKKyAgICAgICAgKCsrKSBSZWNlaXZlci90cmFuc21pdHRlciBtb2RlcworICAgICAgICAoKyspIE92ZXIgU2FtcGxpbmcgTWV0aG9kCisgICAgICAgICgrKykgT25lLUJpdCBTYW1wbGluZyBNZXRob2QKKyAgICAgICgrKSBGb3IgdGhlIGFzeW5jaHJvbm91cyBtb2RlLCB0aGUgZm9sbG93aW5nIGFkdmFuY2VkIGZlYXR1cmVzIGNhbiBiZQorY29uZmlndXJlZCBhcyB3ZWxsOgorICAgICAgICAoKyspIFRYIGFuZC9vciBSWCBwaW4gbGV2ZWwgaW52ZXJzaW9uCisgICAgICAgICgrKykgZGF0YSBsb2dpY2FsIGxldmVsIGludmVyc2lvbgorICAgICAgICAoKyspIFJYIGFuZCBUWCBwaW5zIHN3YXAKKyAgICAgICAgKCsrKSBSWCBvdmVycnVuIGRldGVjdGlvbiBkaXNhYmxpbmcKKyAgICAgICAgKCsrKSBETUEgZGlzYWJsaW5nIG9uIFJYIGVycm9yCisgICAgICAgICgrKykgTVNCIGZpcnN0IG9uIGNvbW11bmljYXRpb24gbGluZQorICAgICAgICAoKyspIGF1dG8gQmF1ZCByYXRlIGRldGVjdGlvbgorICAgIFsuLl0KKyAgICBUaGUgSEFMX1JTNDg1RXhfSW5pdCgpIEFQSSBmb2xsb3dzIHRoZSBVQVJUIFJTNDg1IG1vZGUgY29uZmlndXJhdGlvbgorICAgICBwcm9jZWR1cmVzIChkZXRhaWxzIGZvciB0aGUgcHJvY2VkdXJlcyBhcmUgYXZhaWxhYmxlIGluIHJlZmVyZW5jZSBtYW51YWwpLgorCitAZW5kdmVyYmF0aW0KKworICBEZXBlbmRpbmcgb24gdGhlIGZyYW1lIGxlbmd0aCBkZWZpbmVkIGJ5IHRoZSBNMSBhbmQgTTAgYml0cyAoNy1iaXQsCisgIDgtYml0IG9yIDktYml0KSwgdGhlIHBvc3NpYmxlIFVBUlQgZm9ybWF0cyBhcmUgbGlzdGVkIGluIHRoZQorICBmb2xsb3dpbmcgdGFibGUuCisKKyAgICBUYWJsZSAxLiBVQVJUIGZyYW1lIGZvcm1hdC4KKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCAgTTEgYml0IHwgIE0wIGJpdCB8ICBQQ0UgYml0ICB8ICAgICAgICAgICAgIFVBUlQgZnJhbWUgICAgICAgICAgICAgICAgfAorICAgIHwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICB8ICAgIDAgICAgfCAgICAwICAgIHwgICAgMCAgICAgIHwgICAgfCBTQiB8ICAgIDggYml0IGRhdGEgICB8IFNUQiB8ICAgICB8CisgICAgfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgIHwgICAgMCAgICB8ICAgIDAgICAgfCAgICAxICAgICAgfCAgICB8IFNCIHwgNyBiaXQgZGF0YSB8IFBCIHwgU1RCIHwgICAgIHwKKyAgICB8LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgfCAgICAwICAgIHwgICAgMSAgICB8ICAgIDAgICAgICB8ICAgIHwgU0IgfCAgICA5IGJpdCBkYXRhICAgfCBTVEIgfCAgICAgfAorICAgIHwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICB8ICAgIDAgICAgfCAgICAxICAgIHwgICAgMSAgICAgIHwgICAgfCBTQiB8IDggYml0IGRhdGEgfCBQQiB8IFNUQiB8ICAgICB8CisgICAgfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgIHwgICAgMSAgICB8ICAgIDAgICAgfCAgICAwICAgICAgfCAgICB8IFNCIHwgICAgNyBiaXQgZGF0YSAgIHwgU1RCIHwgICAgIHwKKyAgICB8LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgfCAgICAxICAgIHwgICAgMCAgICB8ICAgIDEgICAgICB8ICAgIHwgU0IgfCA2IGJpdCBkYXRhIHwgUEIgfCBTVEIgfCAgICAgfAorICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKworICAqIEB7CisgICovCisKKy8qKgorICogQGJyaWVmIEluaXRpYWxpemUgdGhlIFJTNDg1IERyaXZlciBlbmFibGUgZmVhdHVyZSBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAorICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBVQVJUX0luaXRUeXBlRGVmIGFuZCBjcmVhdGVzIHRoZSBhc3NvY2lhdGVkIGhhbmRsZS4KKyAqIEBwYXJhbSBodWFydCAgICAgICAgICAgIFVBUlQgaGFuZGxlLgorICogQHBhcmFtIFBvbGFyaXR5ICAgICAgICAgU2VsZWN0IHRoZSBkcml2ZXIgZW5hYmxlIHBvbGFyaXR5LgorICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0RFX1BPTEFSSVRZX0hJR0ggREUgc2lnbmFsIGlzIGFjdGl2ZSBoaWdoCisgKiAgICAgICAgICBAYXJnIEByZWYgVUFSVF9ERV9QT0xBUklUWV9MT1cgIERFIHNpZ25hbCBpcyBhY3RpdmUgbG93CisgKiBAcGFyYW0gQXNzZXJ0aW9uVGltZSAgICBEcml2ZXIgRW5hYmxlIGFzc2VydGlvbiB0aW1lOgorICogICAgICAgNS1iaXQgdmFsdWUgZGVmaW5pbmcgdGhlIHRpbWUgYmV0d2VlbiB0aGUgYWN0aXZhdGlvbiBvZiB0aGUgREUgKERyaXZlcgorICogRW5hYmxlKSBzaWduYWwgYW5kIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0YXJ0IGJpdC4gSXQgaXMgZXhwcmVzc2VkIGluIHNhbXBsZQorICogdGltZSB1bml0cyAoMS84IG9yIDEvMTYgYml0IHRpbWUsIGRlcGVuZGluZyBvbiB0aGUgb3ZlcnNhbXBsaW5nIHJhdGUpCisgKiBAcGFyYW0gRGVhc3NlcnRpb25UaW1lICBEcml2ZXIgRW5hYmxlIGRlYXNzZXJ0aW9uIHRpbWU6CisgKiAgICAgICA1LWJpdCB2YWx1ZSBkZWZpbmluZyB0aGUgdGltZSBiZXR3ZWVuIHRoZSBlbmQgb2YgdGhlIGxhc3Qgc3RvcCBiaXQsIGluCisgKiBhIHRyYW5zbWl0dGVkIG1lc3NhZ2UsIGFuZCB0aGUgZGUtYWN0aXZhdGlvbiBvZiB0aGUgREUgKERyaXZlciBFbmFibGUpCisgKiBzaWduYWwuIEl0IGlzIGV4cHJlc3NlZCBpbiBzYW1wbGUgdGltZSB1bml0cyAoMS84IG9yIDEvMTYgYml0IHRpbWUsIGRlcGVuZGluZworICogb24gdGhlIG92ZXJzYW1wbGluZyByYXRlKS4KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlM0ODVFeF9Jbml0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIHVpbnQzMl90IFBvbGFyaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBBc3NlcnRpb25UaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBEZWFzc2VydGlvblRpbWUpIHsKKyAgdWludDMyX3QgdGVtcDsKKworICAvKiBDaGVjayB0aGUgVUFSVCBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZiAoaHVhcnQgPT0gTlVMTCkgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKyAgLyogQ2hlY2sgdGhlIERyaXZlciBFbmFibGUgVUFSVCBpbnN0YW5jZSAqLworICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9EUklWRVJfRU5BQkxFX0lOU1RBTkNFKGh1YXJ0LT5JbnN0YW5jZSkpOworCisgIC8qIENoZWNrIHRoZSBEcml2ZXIgRW5hYmxlIHBvbGFyaXR5ICovCisgIGFzc2VydF9wYXJhbShJU19VQVJUX0RFX1BPTEFSSVRZKFBvbGFyaXR5KSk7CisKKyAgLyogQ2hlY2sgdGhlIERyaXZlciBFbmFibGUgYXNzZXJ0aW9uIHRpbWUgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfQVNTRVJUSU9OVElNRShBc3NlcnRpb25UaW1lKSk7CisKKyAgLyogQ2hlY2sgdGhlIERyaXZlciBFbmFibGUgZGVhc3NlcnRpb24gdGltZSAqLworICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9ERUFTU0VSVElPTlRJTUUoRGVhc3NlcnRpb25UaW1lKSk7CisKKyAgaWYgKGh1YXJ0LT5nU3RhdGUgPT0gSEFMX1VBUlRfU1RBVEVfUkVTRVQpIHsKKyAgICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovCisgICAgaHVhcnQtPkxvY2sgPSBIQUxfVU5MT0NLRUQ7CisKKyNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIFVBUlRfSW5pdENhbGxiYWNrc1RvRGVmYXVsdChodWFydCk7CisKKyAgICBpZiAoaHVhcnQtPk1zcEluaXRDYWxsYmFjayA9PSBOVUxMKSB7CisgICAgICBodWFydC0+TXNwSW5pdENhbGxiYWNrID0gSEFMX1VBUlRfTXNwSW5pdDsKKyAgICB9CisKKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgICBodWFydC0+TXNwSW5pdENhbGxiYWNrKGh1YXJ0KTsKKyNlbHNlCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIDogR1BJTywgQ0xPQ0ssIENPUlRFWCAqLworICAgIEhBTF9VQVJUX01zcEluaXQoaHVhcnQpOworI2VuZGlmIC8qIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTKSAqLworICB9CisKKyAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9VQVJUX0RJU0FCTEUoaHVhcnQpOworCisgIC8qIFBlcmZvcm0gYWR2YW5jZWQgc2V0dGluZ3MgY29uZmlndXJhdGlvbiAqLworICAvKiBGb3Igc29tZSBpdGVtcywgY29uZmlndXJhdGlvbiByZXF1aXJlcyB0byBiZSBkb25lIHByaW9yIFRFIGFuZCBSRSBiaXRzIGFyZQorICAgKiBzZXQgKi8KKyAgaWYgKGh1YXJ0LT5BZHZhbmNlZEluaXQuQWR2RmVhdHVyZUluaXQgIT0gVUFSVF9BRFZGRUFUVVJFX05PX0lOSVQpIHsKKyAgICBVQVJUX0FkdkZlYXR1cmVDb25maWcoaHVhcnQpOworICB9CisKKyAgLyogU2V0IHRoZSBVQVJUIENvbW11bmljYXRpb24gcGFyYW1ldGVycyAqLworICBpZiAoVUFSVF9TZXRDb25maWcoaHVhcnQpID09IEhBTF9FUlJPUikgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBFbmFibGUgdGhlIERyaXZlciBFbmFibGUgbW9kZSBieSBzZXR0aW5nIHRoZSBERU0gYml0IGluIHRoZSBDUjMgcmVnaXN0ZXIgKi8KKyAgU0VUX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RFTSk7CisKKyAgLyogU2V0IHRoZSBEcml2ZXIgRW5hYmxlIHBvbGFyaXR5ICovCisgIE1PRElGWV9SRUcoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ERVAsIFBvbGFyaXR5KTsKKworICAvKiBTZXQgdGhlIERyaXZlciBFbmFibGUgYXNzZXJ0aW9uIGFuZCBkZWFzc2VydGlvbiB0aW1lcyAqLworICB0ZW1wID0gKEFzc2VydGlvblRpbWUgPDwgVUFSVF9DUjFfREVBVF9BRERSRVNTX0xTQl9QT1MpOworICB0ZW1wIHw9IChEZWFzc2VydGlvblRpbWUgPDwgVUFSVF9DUjFfREVEVF9BRERSRVNTX0xTQl9QT1MpOworICBNT0RJRllfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCAoVVNBUlRfQ1IxX0RFRFQgfCBVU0FSVF9DUjFfREVBVCksIHRlbXApOworCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9VQVJUX0VOQUJMRShodWFydCk7CisKKyAgLyogVEVBQ0sgYW5kL29yIFJFQUNLIHRvIGNoZWNrIGJlZm9yZSBtb3ZpbmcgaHVhcnQtPmdTdGF0ZSBhbmQgaHVhcnQtPlJ4U3RhdGUKKyAgICogdG8gUmVhZHkgKi8KKyAgcmV0dXJuIChVQVJUX0NoZWNrSWRsZVN0YXRlKGh1YXJ0KSk7Cit9CisKKy8qKgorICogQH0KKyAqLworCisvKiogQGRlZmdyb3VwIFVBUlRFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKiAgQGJyaWVmIEV4dGVuZGVkIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgV2FrZXVwIGFuZCBGSUZPIG1vZGUgcmVsYXRlZCBjYWxsYmFjaworZnVuY3Rpb25zLgorCisgICAgKCMpIFdha2V1cCBmcm9tIFN0b3AgbW9kZSBDYWxsYmFjazoKKyAgICAgICAgKCspIEhBTF9VQVJURXhfV2FrZXVwQ2FsbGJhY2soKQorCisgICAgKCMpIFRYL1JYIEZpZm9zIENhbGxiYWNrczoKKyAgICAgICAgKCspIEhBTF9VQVJURXhfUnhGaWZvRnVsbENhbGxiYWNrKCkKKyAgICAgICAgKCspIEhBTF9VQVJURXhfVHhGaWZvRW1wdHlDYWxsYmFjaygpCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICogQGJyaWVmIFVBUlQgd2FrZXVwIGZyb20gU3RvcCBtb2RlIGNhbGxiYWNrLgorICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICogQHJldHZhbCBOb25lCisgKi8KK19fd2VhayB2b2lkIEhBTF9VQVJURXhfV2FrZXVwQ2FsbGJhY2soVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkgeworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodWFydCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9VQVJURXhfV2FrZXVwQ2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLworfQorCisvKioKKyAqIEBicmllZiAgVUFSVCBSWCBGaWZvIGZ1bGwgY2FsbGJhY2suCisgKiBAcGFyYW0gIGh1YXJ0IFVBUlQgaGFuZGxlLgorICogQHJldHZhbCBOb25lCisgKi8KK19fd2VhayB2b2lkIEhBTF9VQVJURXhfUnhGaWZvRnVsbENhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpIHsKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHVhcnQpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVUFSVEV4X1J4Rmlmb0Z1bGxDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIKKyAgICAgZmlsZS4KKyAgICovCit9CisKKy8qKgorICogQGJyaWVmICBVQVJUIFRYIEZpZm8gZW1wdHkgY2FsbGJhY2suCisgKiBAcGFyYW0gIGh1YXJ0IFVBUlQgaGFuZGxlLgorICogQHJldHZhbCBOb25lCisgKi8KK19fd2VhayB2b2lkIEhBTF9VQVJURXhfVHhGaWZvRW1wdHlDYWxsYmFjayhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KSB7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh1YXJ0KTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1VBUlRFeF9UeEZpZm9FbXB0eUNhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlcgorICAgICBmaWxlLgorICAgKi8KK30KKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVEV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqIEBicmllZiAgICBFeHRlbmRlZCBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gVGhpcyBzZWN0aW9uIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOgorICAgICAoKykgSEFMX011bHRpUHJvY2Vzc29yRXhfQWRkcmVzc0xlbmd0aF9TZXQoKSBBUEkgb3B0aW9uYWxseSBzZXRzIHRoZSBVQVJUCitub2RlIGFkZHJlc3MgZGV0ZWN0aW9uIGxlbmd0aCB0byBtb3JlIHRoYW4gNCBiaXRzIGZvciBtdWx0aXByb2Nlc3NvciBhZGRyZXNzCittYXJrIHdha2UgdXAuCisgICAgICgrKSBIQUxfVUFSVEV4X1N0b3BNb2RlV2FrZVVwU291cmNlQ29uZmlnKCkgQVBJIGRlZmluZXMgdGhlIHdha2UtdXAgZnJvbQorc3RvcCBtb2RlIHRyaWdnZXI6IGFkZHJlc3MgbWF0Y2gsIFN0YXJ0IEJpdCBkZXRlY3Rpb24gb3IgUlhORSBiaXQgc3RhdHVzLgorICAgICAoKykgSEFMX1VBUlRFeF9FbmFibGVTdG9wTW9kZSgpIEFQSSBlbmFibGVzIHRoZSBVQVJUIHRvIHdha2UgdXAgdGhlIE1DVQorZnJvbSBzdG9wIG1vZGUKKyAgICAgKCspIEhBTF9VQVJURXhfRGlzYWJsZVN0b3BNb2RlKCkgQVBJIGRpc2FibGVzIHRoZSBhYm92ZSBmdW5jdGlvbmFsaXR5CisgICAgICgrKSBIQUxfVUFSVEV4X0VuYWJsZUZpZm9Nb2RlKCkgQVBJIGVuYWJsZXMgdGhlIEZJRk8gbW9kZQorICAgICAoKykgSEFMX1VBUlRFeF9EaXNhYmxlRmlmb01vZGUoKSBBUEkgZGlzYWJsZXMgdGhlIEZJRk8gbW9kZQorICAgICAoKykgSEFMX1VBUlRFeF9TZXRUeEZpZm9UaHJlc2hvbGQoKSBBUEkgc2V0cyB0aGUgVFggRklGTyB0aHJlc2hvbGQKKyAgICAgKCspIEhBTF9VQVJURXhfU2V0UnhGaWZvVGhyZXNob2xkKCkgQVBJIHNldHMgdGhlIFJYIEZJRk8gdGhyZXNob2xkCisKKyAgICBbLi5dIFRoaXMgc3Vic2VjdGlvbiBhbHNvIHByb3ZpZGVzIGEgc2V0IG9mIGFkZGl0aW9uYWwgZnVuY3Rpb25zIHByb3ZpZGluZworZW5oYW5jZWQgcmVjZXB0aW9uIHNlcnZpY2VzIHRvIHVzZXIuIChGb3IgZXhhbXBsZSwgdGhlc2UgZnVuY3Rpb25zIGFsbG93CithcHBsaWNhdGlvbiB0byBoYW5kbGUgdXNlIGNhc2VzIHdoZXJlIG51bWJlciBvZiBkYXRhIHRvIGJlIHJlY2VpdmVkIGlzIHVua25vd24pLgorCisgICAgKCMpIENvbXBhcmVkIHRvIHN0YW5kYXJkIHJlY2VwdGlvbiBzZXJ2aWNlcyB3aGljaCBvbmx5IGNvbnNpZGVyIG51bWJlciBvZgorcmVjZWl2ZWQgZGF0YSBlbGVtZW50cyBhcyByZWNlcHRpb24gY29tcGxldGlvbiBjcml0ZXJpYSwgdGhlc2UgZnVuY3Rpb25zIGFsc28KK2NvbnNpZGVyIGFkZGl0aW9uYWwgZXZlbnRzIGFzIHRyaWdnZXJzIGZvciB1cGRhdGluZyByZWNlcHRpb24gc3RhdHVzIHRvIGNhbGxlciA6CisgICAgICAgKCspIERldGVjdGlvbiBvZiBpbmFjdGl2aXR5IHBlcmlvZCAoUlggbGluZSBoYXMgbm90IGJlZW4gYWN0aXZlIGZvciBhCitnaXZlbiBwZXJpb2QpLgorICAgICAgICAgICgrKykgUlggaW5hY3Rpdml0eSBkZXRlY3RlZCBieSBJRExFIGV2ZW50LCBpLmUuIFJYIGxpbmUgaGFzIGJlZW4gaW4KK2lkbGUgc3RhdGUgKG5vcm1hbGx5IGhpZ2ggc3RhdGUpIGZvciAxIGZyYW1lIHRpbWUsIGFmdGVyIGxhc3QgcmVjZWl2ZWQgYnl0ZS4KKyAgICAgICAgICAoKyspIFJYIGluYWN0aXZpdHkgZGV0ZWN0ZWQgYnkgUlRPLCBpLmUuIGxpbmUgaGFzIGJlZW4gaW4gaWRsZSBzdGF0ZQorICAgICAgICAgICAgICAgZm9yIGEgcHJvZ3JhbW1hYmxlIHRpbWUsIGFmdGVyIGxhc3QgcmVjZWl2ZWQgYnl0ZS4KKyAgICAgICAoKykgRGV0ZWN0aW9uIHRoYXQgYSBzcGVjaWZpYyBjaGFyYWN0ZXIgaGFzIGJlZW4gcmVjZWl2ZWQuCisKKyAgICAoIykgVGhlcmUgYXJlIHR3byBtb2RlIG9mIHRyYW5zZmVyOgorICAgICAgICgrKSBCbG9ja2luZyBtb2RlOiBUaGUgcmVjZXB0aW9uIGlzIHBlcmZvcm1lZCBpbiBwb2xsaW5nIG1vZGUsIHVudGlsCitlaXRoZXIgZXhwZWN0ZWQgbnVtYmVyIG9mIGRhdGEgaXMgcmVjZWl2ZWQsIG9yIHRpbGwgSURMRSBldmVudCBvY2N1cnMuIFJlY2VwdGlvbgoraXMgaGFuZGxlZCBvbmx5IGR1cmluZyBmdW5jdGlvbiBleGVjdXRpb24uIFdoZW4gZnVuY3Rpb24gZXhpdHMsIG5vIGRhdGEKK3JlY2VwdGlvbiBjb3VsZCBvY2N1ci4gSEFMIHN0YXR1cyBhbmQgbnVtYmVyIG9mIGFjdHVhbGx5IHJlY2VpdmVkIGRhdGEgZWxlbWVudHMsCisgICAgICAgICAgIGFyZSByZXR1cm5lZCBieSBmdW5jdGlvbiBhZnRlciBmaW5pc2hpbmcgdHJhbnNmZXIuCisgICAgICAgKCspIE5vbi1CbG9ja2luZyBtb2RlOiBUaGUgcmVjZXB0aW9uIGlzIHBlcmZvcm1lZCB1c2luZyBJbnRlcnJ1cHRzIG9yCitETUEuIFRoZXNlIEFQSSdzIHJldHVybiB0aGUgSEFMIHN0YXR1cy4gVGhlIGVuZCBvZiB0aGUgZGF0YSBwcm9jZXNzaW5nIHdpbGwgYmUKK2luZGljYXRlZCB0aHJvdWdoIHRoZSBkZWRpY2F0ZWQgVUFSVCBJUlEgd2hlbiB1c2luZyBJbnRlcnJ1cHQgbW9kZSBvciB0aGUgRE1BCitJUlEgd2hlbiB1c2luZyBETUEgbW9kZS4gVGhlIEhBTF9VQVJURXhfUnhFdmVudENhbGxiYWNrKCkgdXNlciBjYWxsYmFjayB3aWxsIGJlCitleGVjdXRlZCBkdXJpbmcgUmVjZWl2ZSBwcm9jZXNzIFRoZSBIQUxfVUFSVF9FcnJvckNhbGxiYWNrKCl1c2VyIGNhbGxiYWNrIHdpbGwKK2JlIGV4ZWN1dGVkIHdoZW4gYSByZWNlcHRpb24gZXJyb3IgaXMgZGV0ZWN0ZWQuCisKKyAgICAoIykgQmxvY2tpbmcgbW9kZSBBUEk6CisgICAgICAgICgrKSBIQUxfVUFSVEV4X1JlY2VpdmVUb0lkbGUoKQorCisgICAgKCMpIE5vbi1CbG9ja2luZyBtb2RlIEFQSSB3aXRoIEludGVycnVwdDoKKyAgICAgICAgKCspIEhBTF9VQVJURXhfUmVjZWl2ZVRvSWRsZV9JVCgpCisKKyAgICAoIykgTm9uLUJsb2NraW5nIG1vZGUgQVBJIHdpdGggRE1BOgorICAgICAgICAoKykgSEFMX1VBUlRFeF9SZWNlaXZlVG9JZGxlX0RNQSgpCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICogQGJyaWVmIEJ5IGRlZmF1bHQgaW4gbXVsdGlwcm9jZXNzb3IgbW9kZSwgd2hlbiB0aGUgd2FrZSB1cCBtZXRob2QgaXMgc2V0CisgKiAgICAgICAgdG8gYWRkcmVzcyBtYXJrLCB0aGUgVUFSVCBoYW5kbGVzIG9ubHkgNC1iaXQgbG9uZyBhZGRyZXNzZXMgZGV0ZWN0aW9uOworICogICAgICAgIHRoaXMgQVBJIGFsbG93cyB0byBlbmFibGUgbG9uZ2VyIGFkZHJlc3NlcyBkZXRlY3Rpb24gKDYtLCA3LSBvciA4LWJpdAorICogICAgICAgIGxvbmcpLgorICogQG5vdGUgIEFkZHJlc3NlcyBkZXRlY3Rpb24gbGVuZ3RocyBhcmU6IDYtYml0IGFkZHJlc3MgZGV0ZWN0aW9uIGluIDctYml0IGRhdGEKKyAqIG1vZGUsIDctYml0IGFkZHJlc3MgZGV0ZWN0aW9uIGluIDgtYml0IGRhdGEgbW9kZSwgOC1iaXQgYWRkcmVzcyBkZXRlY3Rpb24gaW4KKyAqIDktYml0IGRhdGEgbW9kZS4KKyAqIEBwYXJhbSBodWFydCAgICAgICAgIFVBUlQgaGFuZGxlLgorICogQHBhcmFtIEFkZHJlc3NMZW5ndGggVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0FERFJFU1NfREVURUNUXzRCIDQtYml0IGxvbmcgYWRkcmVzcworICogICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQUREUkVTU19ERVRFQ1RfN0IgNi0sIDctIG9yIDgtYml0IGxvbmcgYWRkcmVzcworICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9NdWx0aVByb2Nlc3NvckV4X0FkZHJlc3NMZW5ndGhfU2V0KAorICAgIFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIHVpbnQzMl90IEFkZHJlc3NMZW5ndGgpIHsKKyAgLyogQ2hlY2sgdGhlIFVBUlQgaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYgKGh1YXJ0ID09IE5VTEwpIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgdGhlIGFkZHJlc3MgbGVuZ3RoIHBhcmFtZXRlciAqLworICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9BRERSRVNTTEVOR1RIX0RFVEVDVChBZGRyZXNzTGVuZ3RoKSk7CisKKyAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9VQVJUX0RJU0FCTEUoaHVhcnQpOworCisgIC8qIFNldCB0aGUgYWRkcmVzcyBsZW5ndGggKi8KKyAgTU9ESUZZX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX0FERE03LCBBZGRyZXNzTGVuZ3RoKTsKKworICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVUFSVF9FTkFCTEUoaHVhcnQpOworCisgIC8qIFRFQUNLIGFuZC9vciBSRUFDSyB0byBjaGVjayBiZWZvcmUgbW92aW5nIGh1YXJ0LT5nU3RhdGUgdG8gUmVhZHkgKi8KKyAgcmV0dXJuIChVQVJUX0NoZWNrSWRsZVN0YXRlKGh1YXJ0KSk7Cit9CisKKy8qKgorICogQGJyaWVmIFNldCBXYWtldXAgZnJvbSBTdG9wIG1vZGUgaW50ZXJydXB0IGZsYWcgc2VsZWN0aW9uLgorICogQG5vdGUgSXQgaXMgdGhlIGFwcGxpY2F0aW9uIHJlc3BvbnNpYmlsaXR5IHRvIGVuYWJsZSB0aGUgaW50ZXJydXB0IHVzZWQgYXMKKyAqICAgICAgIHVzYXJ0X3drdXAgaW50ZXJydXB0IHNvdXJjZSBiZWZvcmUgZW50ZXJpbmcgbG93LXBvd2VyIG1vZGUuCisgKiBAcGFyYW0gaHVhcnQgICAgICAgICAgIFVBUlQgaGFuZGxlLgorICogQHBhcmFtIFdha2VVcFNlbGVjdGlvbiBBZGRyZXNzIG1hdGNoLCBTdGFydCBCaXQgZGV0ZWN0aW9uIG9yIFJYTkUvUlhGTkUgYml0CisgKiBzdGF0dXMuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICBAYXJnIEByZWYgVUFSVF9XQUtFVVBfT05fQUREUkVTUworICogICAgICAgICAgQGFyZyBAcmVmIFVBUlRfV0FLRVVQX09OX1NUQVJUQklUCisgKiAgICAgICAgICBAYXJnIEByZWYgVUFSVF9XQUtFVVBfT05fUkVBRERBVEFfTk9ORU1QVFkKKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVEV4X1N0b3BNb2RlV2FrZVVwU291cmNlQ29uZmlnKAorICAgIFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIFVBUlRfV2FrZVVwVHlwZURlZiBXYWtlVXBTZWxlY3Rpb24pIHsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisKKyAgLyogY2hlY2sgdGhlIHdha2UtdXAgZnJvbSBzdG9wIG1vZGUgVUFSVCBpbnN0YW5jZSAqLworICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9XQUtFVVBfRlJPTVNUT1BfSU5TVEFOQ0UoaHVhcnQtPkluc3RhbmNlKSk7CisgIC8qIGNoZWNrIHRoZSB3YWtlLXVwIHNlbGVjdGlvbiBwYXJhbWV0ZXIgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfV0FLRVVQX1NFTEVDVElPTihXYWtlVXBTZWxlY3Rpb24uV2FrZVVwRXZlbnQpKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGh1YXJ0KTsKKworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWTsKKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1VBUlRfRElTQUJMRShodWFydCk7CisKKyAgLyogU2V0IHRoZSB3YWtlLXVwIHNlbGVjdGlvbiBzY2hlbWUgKi8KKyAgTU9ESUZZX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX1dVUywgV2FrZVVwU2VsZWN0aW9uLldha2VVcEV2ZW50KTsKKworICBpZiAoV2FrZVVwU2VsZWN0aW9uLldha2VVcEV2ZW50ID09IFVBUlRfV0FLRVVQX09OX0FERFJFU1MpIHsKKyAgICBVQVJURXhfV2FrZXVwX0FkZHJlc3NDb25maWcoaHVhcnQsIFdha2VVcFNlbGVjdGlvbik7CisgIH0KKworICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVUFSVF9FTkFCTEUoaHVhcnQpOworCisgIC8qIEluaXQgdGlja3N0YXJ0IGZvciB0aW1lb3V0IG1hbmFnZW1lbnQgKi8KKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAvKiBXYWl0IHVudGlsIFJFQUNLIGZsYWcgaXMgc2V0ICovCisgIGlmIChVQVJUX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoaHVhcnQsIFVTQVJUX0lTUl9SRUFDSywgUkVTRVQsIHRpY2tzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfVUFSVF9USU1FT1VUX1ZBTFVFKSAhPSBIQUxfT0spIHsKKyAgICBzdGF0dXMgPSBIQUxfVElNRU9VVDsKKyAgfSBlbHNlIHsKKyAgICAvKiBJbml0aWFsaXplIHRoZSBVQVJUIFN0YXRlICovCisgICAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworICB9CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHVhcnQpOworCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogQGJyaWVmIEVuYWJsZSBVQVJUIFN0b3AgTW9kZS4KKyAqIEBub3RlIFRoZSBVQVJUIGlzIGFibGUgdG8gd2FrZSB1cCB0aGUgTUNVIGZyb20gU3RvcCAxIG1vZGUgYXMgbG9uZyBhcyBVQVJUCisgKiBjbG9jayBpcyBIU0kgb3IgTFNFLgorICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJURXhfRW5hYmxlU3RvcE1vZGUoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkgeworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGh1YXJ0KTsKKworICAvKiBTZXQgVUVTTSBiaXQgKi8KKyAgQVRPTUlDX1NFVF9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9VRVNNKTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhodWFydCk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgRGlzYWJsZSBVQVJUIFN0b3AgTW9kZS4KKyAqIEBwYXJhbSBodWFydCBVQVJUIGhhbmRsZS4KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVEV4X0Rpc2FibGVTdG9wTW9kZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KSB7CisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHVhcnQpOworCisgIC8qIENsZWFyIFVFU00gYml0ICovCisgIEFUT01JQ19DTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9VRVNNKTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhodWFydCk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgIEVuYWJsZSB0aGUgRklGTyBtb2RlLgorICogQHBhcmFtIGh1YXJ0ICAgICAgVUFSVCBoYW5kbGUuCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRFeF9FbmFibGVGaWZvTW9kZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KSB7CisgIHVpbnQzMl90IHRtcGNyMTsKKworICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoaHVhcnQtPkluc3RhbmNlKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodWFydCk7CisKKyAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX0JVU1k7CisKKyAgLyogU2F2ZSBhY3R1YWwgVUFSVCBjb25maWd1cmF0aW9uICovCisgIHRtcGNyMSA9IFJFQURfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxKTsKKworICAvKiBEaXNhYmxlIFVBUlQgKi8KKyAgX19IQUxfVUFSVF9ESVNBQkxFKGh1YXJ0KTsKKworICAvKiBFbmFibGUgRklGTyBtb2RlICovCisgIFNFVF9CSVQodG1wY3IxLCBVU0FSVF9DUjFfRklGT0VOKTsKKyAgaHVhcnQtPkZpZm9Nb2RlID0gVUFSVF9GSUZPTU9ERV9FTkFCTEU7CisKKyAgLyogUmVzdG9yZSBVQVJUIGNvbmZpZ3VyYXRpb24gKi8KKyAgV1JJVEVfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCB0bXBjcjEpOworCisgIC8qIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGRhdGEgdG8gcHJvY2VzcyBkdXJpbmcgUlgvVFggSVNSIGV4ZWN1dGlvbiAqLworICBVQVJURXhfU2V0TmJEYXRhVG9Qcm9jZXNzKGh1YXJ0KTsKKworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHVhcnQpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICogQGJyaWVmICBEaXNhYmxlIHRoZSBGSUZPIG1vZGUuCisgKiBAcGFyYW0gaHVhcnQgICAgICBVQVJUIGhhbmRsZS4KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVEV4X0Rpc2FibGVGaWZvTW9kZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KSB7CisgIHVpbnQzMl90IHRtcGNyMTsKKworICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoaHVhcnQtPkluc3RhbmNlKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodWFydCk7CisKKyAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX0JVU1k7CisKKyAgLyogU2F2ZSBhY3R1YWwgVUFSVCBjb25maWd1cmF0aW9uICovCisgIHRtcGNyMSA9IFJFQURfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxKTsKKworICAvKiBEaXNhYmxlIFVBUlQgKi8KKyAgX19IQUxfVUFSVF9ESVNBQkxFKGh1YXJ0KTsKKworICAvKiBEaXNhYmxlIEZJRk8gbW9kZSAqLworICBDTEVBUl9CSVQodG1wY3IxLCBVU0FSVF9DUjFfRklGT0VOKTsKKyAgaHVhcnQtPkZpZm9Nb2RlID0gVUFSVF9GSUZPTU9ERV9ESVNBQkxFOworCisgIC8qIFJlc3RvcmUgVUFSVCBjb25maWd1cmF0aW9uICovCisgIFdSSVRFX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMSwgdG1wY3IxKTsKKworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHVhcnQpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICogQGJyaWVmICBTZXQgdGhlIFRYRklGTyB0aHJlc2hvbGQuCisgKiBAcGFyYW0gaHVhcnQgICAgICBVQVJUIGhhbmRsZS4KKyAqIEBwYXJhbSBUaHJlc2hvbGQgIFRYIEZJRk8gdGhyZXNob2xkIHZhbHVlCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9UWEZJRk9fVEhSRVNIT0xEXzFfOAorICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9UWEZJRk9fVEhSRVNIT0xEXzFfNAorICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9UWEZJRk9fVEhSRVNIT0xEXzFfMgorICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9UWEZJRk9fVEhSRVNIT0xEXzNfNAorICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9UWEZJRk9fVEhSRVNIT0xEXzdfOAorICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9UWEZJRk9fVEhSRVNIT0xEXzhfOAorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJURXhfU2V0VHhGaWZvVGhyZXNob2xkKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaHJlc2hvbGQpIHsKKyAgdWludDMyX3QgdG1wY3IxOworCisgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfRklGT19JTlNUQU5DRShodWFydC0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfVFhGSUZPX1RIUkVTSE9MRChUaHJlc2hvbGQpKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGh1YXJ0KTsKKworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWTsKKworICAvKiBTYXZlIGFjdHVhbCBVQVJUIGNvbmZpZ3VyYXRpb24gKi8KKyAgdG1wY3IxID0gUkVBRF9SRUcoaHVhcnQtPkluc3RhbmNlLT5DUjEpOworCisgIC8qIERpc2FibGUgVUFSVCAqLworICBfX0hBTF9VQVJUX0RJU0FCTEUoaHVhcnQpOworCisgIC8qIFVwZGF0ZSBUWCB0aHJlc2hvbGQgY29uZmlndXJhdGlvbiAqLworICBNT0RJRllfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfVFhGVENGRywgVGhyZXNob2xkKTsKKworICAvKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBkYXRhIHRvIHByb2Nlc3MgZHVyaW5nIFJYL1RYIElTUiBleGVjdXRpb24gKi8KKyAgVUFSVEV4X1NldE5iRGF0YVRvUHJvY2VzcyhodWFydCk7CisKKyAgLyogUmVzdG9yZSBVQVJUIGNvbmZpZ3VyYXRpb24gKi8KKyAgV1JJVEVfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCB0bXBjcjEpOworCisgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhodWFydCk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgIFNldCB0aGUgUlhGSUZPIHRocmVzaG9sZC4KKyAqIEBwYXJhbSBodWFydCAgICAgIFVBUlQgaGFuZGxlLgorICogQHBhcmFtIFRocmVzaG9sZCAgUlggRklGTyB0aHJlc2hvbGQgdmFsdWUKKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX1JYRklGT19USFJFU0hPTERfMV84CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX1JYRklGT19USFJFU0hPTERfMV80CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX1JYRklGT19USFJFU0hPTERfMV8yCisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX1JYRklGT19USFJFU0hPTERfM180CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX1JYRklGT19USFJFU0hPTERfN184CisgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX1JYRklGT19USFJFU0hPTERfOF84CisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRFeF9TZXRSeEZpZm9UaHJlc2hvbGQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRocmVzaG9sZCkgeworICB1aW50MzJfdCB0bXBjcjE7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfRklGT19JTlNUQU5DRShodWFydC0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfUlhGSUZPX1RIUkVTSE9MRChUaHJlc2hvbGQpKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGh1YXJ0KTsKKworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWTsKKworICAvKiBTYXZlIGFjdHVhbCBVQVJUIGNvbmZpZ3VyYXRpb24gKi8KKyAgdG1wY3IxID0gUkVBRF9SRUcoaHVhcnQtPkluc3RhbmNlLT5DUjEpOworCisgIC8qIERpc2FibGUgVUFSVCAqLworICBfX0hBTF9VQVJUX0RJU0FCTEUoaHVhcnQpOworCisgIC8qIFVwZGF0ZSBSWCB0aHJlc2hvbGQgY29uZmlndXJhdGlvbiAqLworICBNT0RJRllfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfUlhGVENGRywgVGhyZXNob2xkKTsKKworICAvKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBkYXRhIHRvIHByb2Nlc3MgZHVyaW5nIFJYL1RYIElTUiBleGVjdXRpb24gKi8KKyAgVUFSVEV4X1NldE5iRGF0YVRvUHJvY2VzcyhodWFydCk7CisKKyAgLyogUmVzdG9yZSBVQVJUIGNvbmZpZ3VyYXRpb24gKi8KKyAgV1JJVEVfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCB0bXBjcjEpOworCisgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhodWFydCk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlIHRpbGwgZWl0aGVyIHRoZSBleHBlY3RlZAorICogbnVtYmVyIG9mIGRhdGEgaXMgcmVjZWl2ZWQgb3IgYW4gSURMRSBldmVudCBvY2N1cnMuCisgKiBAbm90ZSAgSEFMX09LIGlzIHJldHVybmVkIGlmIHJlY2VwdGlvbiBpcyBjb21wbGV0ZWQgKGV4cGVjdGVkIG51bWJlciBvZiBkYXRhCisgKiBoYXMgYmVlbiByZWNlaXZlZCkgb3IgaWYgcmVjZXB0aW9uIGlzIHN0b3BwZWQgYWZ0ZXIgSURMRSBldmVudCAobGVzcyB0aGFuIHRoZQorICogZXhwZWN0ZWQgbnVtYmVyIG9mIGRhdGEgaGFzIGJlZW4gcmVjZWl2ZWQpIEluIHRoaXMgY2FzZSwgUnhMZW4gb3V0cHV0CisgKiBwYXJhbWV0ZXIgaW5kaWNhdGVzIG51bWJlciBvZiBkYXRhIGF2YWlsYWJsZSBpbiByZWNlcHRpb24gYnVmZmVyLgorICogQG5vdGUgIFdoZW4gVUFSVCBwYXJpdHkgaXMgbm90IGVuYWJsZWQgKFBDRSA9IDApLCBhbmQgV29yZCBMZW5ndGggaXMKKyAqIGNvbmZpZ3VyZWQgdG8gOSBiaXRzIChNMS1NMCA9IDAxKSwgdGhlIHJlY2VpdmVkIGRhdGEgaXMgaGFuZGxlZCBhcyBhIHNldCBvZgorICogdWludDE2X3QuIEluIHRoaXMgY2FzZSwgU2l6ZSBtdXN0IGluZGljYXRlIHRoZSBudW1iZXIgb2YgdWludDE2X3QgYXZhaWxhYmxlCisgKiB0aHJvdWdoIHBEYXRhLgorICogQG5vdGUgV2hlbiBGSUZPIG1vZGUgaXMgZW5hYmxlZCwgdGhlIFJYRk5FIGZsYWcgaXMgc2V0IGFzIGxvbmcgYXMgdGhlIFJYRklGTworICogICAgICAgaXMgbm90IGVtcHR5LiBSZWFkIG9wZXJhdGlvbnMgZnJvbSB0aGUgUkRSIHJlZ2lzdGVyIGFyZSBwZXJmb3JtZWQgd2hlbgorICogICAgICAgUlhGTkUgZmxhZyBpcyBzZXQuIEZyb20gaGFyZHdhcmUgcGVyc3BlY3RpdmUsIFJYRk5FIGZsYWcgYW5kCisgKiAgICAgICBSWE5FIGFyZSBtYXBwZWQgb24gdGhlIHNhbWUgYml0LWZpZWxkLgorICogQHBhcmFtIGh1YXJ0ICAgVUFSVCBoYW5kbGUuCisgKiBAcGFyYW0gcERhdGEgICBQb2ludGVyIHRvIGRhdGEgYnVmZmVyICh1aW50OF90IG9yIHVpbnQxNl90IGRhdGEgZWxlbWVudHMpLgorICogQHBhcmFtIFNpemUgICAgQW1vdW50IG9mIGRhdGEgZWxlbWVudHMgKHVpbnQ4X3Qgb3IgdWludDE2X3QpIHRvIGJlIHJlY2VpdmVkLgorICogQHBhcmFtIFJ4TGVuICAgTnVtYmVyIG9mIGRhdGEgZWxlbWVudHMgZmluYWxseSByZWNlaXZlZAorICogICAgICAgICAgICAgICAgKGNvdWxkIGJlIGxvd2VyIHRoYW4gU2l6ZSwgaW4gY2FzZSByZWNlcHRpb24gZW5kcyBvbiBJRExFCisgKiBldmVudCkKKyAqIEBwYXJhbSBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24gZXhwcmVzc2VkIGluIG1zIChjb3ZlcnMgdGhlIHdob2xlIHJlY2VwdGlvbgorICogc2VxdWVuY2UpLgorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJURXhfUmVjZWl2ZVRvSWRsZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICpSeExlbiwgdWludDMyX3QgVGltZW91dCkgeworICB1aW50OF90ICpwZGF0YThiaXRzOworICB1aW50MTZfdCAqcGRhdGExNmJpdHM7CisgIHVpbnQxNl90IHVoTWFzazsKKyAgdWludDMyX3QgdGlja3N0YXJ0OworCisgIC8qIENoZWNrIHRoYXQgYSBSeCBwcm9jZXNzIGlzIG5vdCBhbHJlYWR5IG9uZ29pbmcgKi8KKyAgaWYgKGh1YXJ0LT5SeFN0YXRlID09IEhBTF9VQVJUX1NUQVRFX1JFQURZKSB7CisgICAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgaHVhcnQtPkVycm9yQ29kZSA9IEhBTF9VQVJUX0VSUk9SX05PTkU7CisgICAgaHVhcnQtPlJ4U3RhdGUgPSBIQUxfVUFSVF9TVEFURV9CVVNZX1JYOworICAgIGh1YXJ0LT5SZWNlcHRpb25UeXBlID0gSEFMX1VBUlRfUkVDRVBUSU9OX1RPSURMRTsKKyAgICBodWFydC0+UnhFdmVudFR5cGUgPSBIQUxfVUFSVF9SWEVWRU5UX1RDOworCisgICAgLyogSW5pdCB0aWNrc3RhcnQgZm9yIHRpbWVvdXQgbWFuYWdlbWVudCAqLworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICBodWFydC0+UnhYZmVyU2l6ZSA9IFNpemU7CisgICAgaHVhcnQtPlJ4WGZlckNvdW50ID0gU2l6ZTsKKworICAgIC8qIENvbXB1dGF0aW9uIG9mIFVBUlQgbWFzayB0byBhcHBseSB0byBSRFIgcmVnaXN0ZXIgKi8KKyAgICBVQVJUX01BU0tfQ09NUFVUQVRJT04oaHVhcnQpOworICAgIHVoTWFzayA9IGh1YXJ0LT5NYXNrOworCisgICAgLyogSW4gY2FzZSBvZiA5Yml0cy9ObyBQYXJpdHkgdHJhbnNmZXIsIHBSeERhdGEgbmVlZHMgdG8gYmUgaGFuZGxlZCBhcyBhCisgICAgICogdWludDE2X3QgcG9pbnRlciAqLworICAgIGlmICgoaHVhcnQtPkluaXQuV29yZExlbmd0aCA9PSBVQVJUX1dPUkRMRU5HVEhfOUIpICYmCisgICAgICAgIChodWFydC0+SW5pdC5QYXJpdHkgPT0gVUFSVF9QQVJJVFlfTk9ORSkpIHsKKyAgICAgIHBkYXRhOGJpdHMgPSBOVUxMOworICAgICAgcGRhdGExNmJpdHMgPSAodWludDE2X3QgKilwRGF0YTsKKyAgICB9IGVsc2UgeworICAgICAgcGRhdGE4Yml0cyA9IHBEYXRhOworICAgICAgcGRhdGExNmJpdHMgPSBOVUxMOworICAgIH0KKworICAgIC8qIEluaXRpYWxpemUgb3V0cHV0IG51bWJlciBvZiByZWNlaXZlZCBlbGVtZW50cyAqLworICAgICpSeExlbiA9IDBVOworCisgICAgLyogYXMgbG9uZyBhcyBkYXRhIGhhdmUgdG8gYmUgcmVjZWl2ZWQgKi8KKyAgICB3aGlsZSAoaHVhcnQtPlJ4WGZlckNvdW50ID4gMFUpIHsKKyAgICAgIC8qIENoZWNrIGlmIElETEUgZmxhZyBpcyBzZXQgKi8KKyAgICAgIGlmIChfX0hBTF9VQVJUX0dFVF9GTEFHKGh1YXJ0LCBVQVJUX0ZMQUdfSURMRSkpIHsKKyAgICAgICAgLyogQ2xlYXIgSURMRSBmbGFnIGluIElTUiAqLworICAgICAgICBfX0hBTF9VQVJUX0NMRUFSX0ZMQUcoaHVhcnQsIFVBUlRfQ0xFQVJfSURMRUYpOworCisgICAgICAgIC8qIElmIFNldCwgYnV0IG5vIGRhdGEgZXZlciByZWNlaXZlZCwgY2xlYXIgZmxhZyB3aXRob3V0IGV4aXRpbmcgbG9vcCAqLworICAgICAgICAvKiBJZiBTZXQsIGFuZCBkYXRhIGhhcyBhbHJlYWR5IGJlZW4gcmVjZWl2ZWQsIHRoaXMgbWVhbnMgSWRsZSBFdmVudCBpcworICAgICAgICAgKiB2YWxpZCA6IEVuZCByZWNlcHRpb24gKi8KKyAgICAgICAgaWYgKCpSeExlbiA+IDBVKSB7CisgICAgICAgICAgaHVhcnQtPlJ4RXZlbnRUeXBlID0gSEFMX1VBUlRfUlhFVkVOVF9JRExFOworICAgICAgICAgIGh1YXJ0LT5SeFN0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgICByZXR1cm4gSEFMX09LOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIENoZWNrIGlmIFJYTkUgZmxhZyBpcyBzZXQgKi8KKyAgICAgIGlmIChfX0hBTF9VQVJUX0dFVF9GTEFHKGh1YXJ0LCBVQVJUX0ZMQUdfUlhORSkpIHsKKyAgICAgICAgaWYgKHBkYXRhOGJpdHMgPT0gTlVMTCkgeworICAgICAgICAgICpwZGF0YTE2Yml0cyA9ICh1aW50MTZfdCkoaHVhcnQtPkluc3RhbmNlLT5SRFIgJiB1aE1hc2spOworICAgICAgICAgIHBkYXRhMTZiaXRzKys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgKnBkYXRhOGJpdHMgPSAodWludDhfdCkoaHVhcnQtPkluc3RhbmNlLT5SRFIgJiAodWludDhfdCl1aE1hc2spOworICAgICAgICAgIHBkYXRhOGJpdHMrKzsKKyAgICAgICAgfQorICAgICAgICAvKiBJbmNyZW1lbnQgbnVtYmVyIG9mIHJlY2VpdmVkIGVsZW1lbnRzICovCisgICAgICAgICpSeExlbiArPSAxVTsKKyAgICAgICAgaHVhcnQtPlJ4WGZlckNvdW50LS07CisgICAgICB9CisKKyAgICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLworICAgICAgaWYgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkgeworICAgICAgICBpZiAoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFRpbWVvdXQpIHx8IChUaW1lb3V0ID09IDBVKSkgeworICAgICAgICAgIGh1YXJ0LT5SeFN0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBTZXQgbnVtYmVyIG9mIHJlY2VpdmVkIGVsZW1lbnRzIGluIG91dHB1dCBwYXJhbWV0ZXIgOiBSeExlbiAqLworICAgICpSeExlbiA9IGh1YXJ0LT5SeFhmZXJTaXplIC0gaHVhcnQtPlJ4WGZlckNvdW50OworICAgIC8qIEF0IGVuZCBvZiBSeCBwcm9jZXNzLCByZXN0b3JlIGh1YXJ0LT5SeFN0YXRlIHRvIFJlYWR5ICovCisgICAgaHVhcnQtPlJ4U3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICogQGJyaWVmIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gaW50ZXJydXB0IG1vZGUgdGlsbCBlaXRoZXIgdGhlIGV4cGVjdGVkCisgKiBudW1iZXIgb2YgZGF0YSBpcyByZWNlaXZlZCBvciBhbiBJRExFIGV2ZW50IG9jY3Vycy4KKyAqIEBub3RlICBSZWNlcHRpb24gaXMgaW5pdGlhdGVkIGJ5IHRoaXMgZnVuY3Rpb24gY2FsbC4gRnVydGhlciBwcm9ncmVzcyBvZgorICogcmVjZXB0aW9uIGlzIGFjaGlldmVkIHRoYW5rcyB0byBVQVJUIGludGVycnVwdHMgcmFpc2VkIGJ5IFJYTkUgYW5kIElETEUKKyAqIGV2ZW50cy4gQ2FsbGJhY2sgaXMgY2FsbGVkIGF0IGVuZCBvZiByZWNlcHRpb24gaW5kaWNhdGluZyBudW1iZXIgb2YgcmVjZWl2ZWQKKyAqIGRhdGEgZWxlbWVudHMuCisgKiBAbm90ZSAgV2hlbiBVQVJUIHBhcml0eSBpcyBub3QgZW5hYmxlZCAoUENFID0gMCksIGFuZCBXb3JkIExlbmd0aCBpcworICogY29uZmlndXJlZCB0byA5IGJpdHMgKE0xLU0wID0gMDEpLCB0aGUgcmVjZWl2ZWQgZGF0YSBpcyBoYW5kbGVkIGFzIGEgc2V0IG9mCisgKiB1aW50MTZfdC4gSW4gdGhpcyBjYXNlLCBTaXplIG11c3QgaW5kaWNhdGUgdGhlIG51bWJlciBvZiB1aW50MTZfdCBhdmFpbGFibGUKKyAqIHRocm91Z2ggcERhdGEuCisgKiBAcGFyYW0gaHVhcnQgVUFSVCBoYW5kbGUuCisgKiBAcGFyYW0gcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlciAodWludDhfdCBvciB1aW50MTZfdCBkYXRhIGVsZW1lbnRzKS4KKyAqIEBwYXJhbSBTaXplICBBbW91bnQgb2YgZGF0YSBlbGVtZW50cyAodWludDhfdCBvciB1aW50MTZfdCkgdG8gYmUgcmVjZWl2ZWQuCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRFeF9SZWNlaXZlVG9JZGxlX0lUKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpIHsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIENoZWNrIHRoYXQgYSBSeCBwcm9jZXNzIGlzIG5vdCBhbHJlYWR5IG9uZ29pbmcgKi8KKyAgaWYgKGh1YXJ0LT5SeFN0YXRlID09IEhBTF9VQVJUX1NUQVRFX1JFQURZKSB7CisgICAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogU2V0IFJlY2VwdGlvbiB0eXBlIHRvIHJlY2VwdGlvbiB0aWxsIElETEUgRXZlbnQqLworICAgIGh1YXJ0LT5SZWNlcHRpb25UeXBlID0gSEFMX1VBUlRfUkVDRVBUSU9OX1RPSURMRTsKKyAgICBodWFydC0+UnhFdmVudFR5cGUgPSBIQUxfVUFSVF9SWEVWRU5UX1RDOworCisgICAgKHZvaWQpVUFSVF9TdGFydF9SZWNlaXZlX0lUKGh1YXJ0LCBwRGF0YSwgU2l6ZSk7CisKKyAgICBpZiAoaHVhcnQtPlJlY2VwdGlvblR5cGUgPT0gSEFMX1VBUlRfUkVDRVBUSU9OX1RPSURMRSkgeworICAgICAgX19IQUxfVUFSVF9DTEVBUl9GTEFHKGh1YXJ0LCBVQVJUX0NMRUFSX0lETEVGKTsKKyAgICAgIEFUT01JQ19TRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfSURMRUlFKTsKKyAgICB9IGVsc2UgeworICAgICAgLyogSW4gY2FzZSBvZiBlcnJvcnMgYWxyZWFkeSBwZW5kaW5nIHdoZW4gcmVjZXB0aW9uIGlzIHN0YXJ0ZWQsCisgICAgICAgICBJbnRlcnJ1cHRzIG1heSBoYXZlIGFscmVhZHkgYmVlbiByYWlzZWQgYW5kIGxlYWQgdG8gcmVjZXB0aW9uIGFib3J0aW9uLgorICAgICAgICAgKE92ZXJydW4gZXJyb3IgZm9yIGluc3RhbmNlKS4KKyAgICAgICAgIEluIHN1Y2ggY2FzZSBSZWNlcHRpb24gVHlwZSBoYXMgYmVlbiByZXNldCB0bworICAgICAgICAgSEFMX1VBUlRfUkVDRVBUSU9OX1NUQU5EQVJELiAqLworICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICogQGJyaWVmIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gRE1BIG1vZGUgdGlsbCBlaXRoZXIgdGhlIGV4cGVjdGVkIG51bWJlcgorICogICAgICAgIG9mIGRhdGEgaXMgcmVjZWl2ZWQgb3IgYW4gSURMRSBldmVudCBvY2N1cnMuCisgKiBAbm90ZSAgUmVjZXB0aW9uIGlzIGluaXRpYXRlZCBieSB0aGlzIGZ1bmN0aW9uIGNhbGwuIEZ1cnRoZXIgcHJvZ3Jlc3Mgb2YKKyAqIHJlY2VwdGlvbiBpcyBhY2hpZXZlZCB0aGFua3MgdG8gRE1BIHNlcnZpY2VzLCB0cmFuc2ZlcnJpbmcgYXV0b21hdGljYWxseQorICogcmVjZWl2ZWQgZGF0YSBlbGVtZW50cyBpbiB1c2VyIHJlY2VwdGlvbiBidWZmZXIgYW5kIGNhbGxpbmcgcmVnaXN0ZXJlZAorICogY2FsbGJhY2tzIGF0IGhhbGYvZW5kIG9mIHJlY2VwdGlvbi4gVUFSVCBJRExFIGV2ZW50cyBhcmUgYWxzbyB1c2VkIHRvCisgKiBjb25zaWRlciByZWNlcHRpb24gcGhhc2UgYXMgZW5kZWQuIEluIGFsbCBjYXNlcywgY2FsbGJhY2sgZXhlY3V0aW9uIHdpbGwKKyAqIGluZGljYXRlIG51bWJlciBvZiByZWNlaXZlZCBkYXRhIGVsZW1lbnRzLgorICogQG5vdGUgIFdoZW4gdGhlIFVBUlQgcGFyaXR5IGlzIGVuYWJsZWQgKFBDRSA9IDEpLCB0aGUgcmVjZWl2ZWQgZGF0YSBjb250YWluCisgKiAgICAgICAgdGhlIHBhcml0eSBiaXQgKE1TQiBwb3NpdGlvbikuCisgKiBAbm90ZSAgV2hlbiBVQVJUIHBhcml0eSBpcyBub3QgZW5hYmxlZCAoUENFID0gMCksIGFuZCBXb3JkIExlbmd0aCBpcworICogY29uZmlndXJlZCB0byA5IGJpdHMgKE0xLU0wID0gMDEpLCB0aGUgcmVjZWl2ZWQgZGF0YSBpcyBoYW5kbGVkIGFzIGEgc2V0IG9mCisgKiB1aW50MTZfdC4gSW4gdGhpcyBjYXNlLCBTaXplIG11c3QgaW5kaWNhdGUgdGhlIG51bWJlciBvZiB1aW50MTZfdCBhdmFpbGFibGUKKyAqIHRocm91Z2ggcERhdGEuCisgKiBAcGFyYW0gaHVhcnQgVUFSVCBoYW5kbGUuCisgKiBAcGFyYW0gcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlciAodWludDhfdCBvciB1aW50MTZfdCBkYXRhIGVsZW1lbnRzKS4KKyAqIEBwYXJhbSBTaXplICBBbW91bnQgb2YgZGF0YSBlbGVtZW50cyAodWludDhfdCBvciB1aW50MTZfdCkgdG8gYmUgcmVjZWl2ZWQuCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRFeF9SZWNlaXZlVG9JZGxlX0RNQShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSkgeworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXM7CisKKyAgLyogQ2hlY2sgdGhhdCBhIFJ4IHByb2Nlc3MgaXMgbm90IGFscmVhZHkgb25nb2luZyAqLworICBpZiAoaHVhcnQtPlJ4U3RhdGUgPT0gSEFMX1VBUlRfU1RBVEVfUkVBRFkpIHsKKyAgICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBTZXQgUmVjZXB0aW9uIHR5cGUgdG8gcmVjZXB0aW9uIHRpbGwgSURMRSBFdmVudCovCisgICAgaHVhcnQtPlJlY2VwdGlvblR5cGUgPSBIQUxfVUFSVF9SRUNFUFRJT05fVE9JRExFOworICAgIGh1YXJ0LT5SeEV2ZW50VHlwZSA9IEhBTF9VQVJUX1JYRVZFTlRfVEM7CisKKyAgICBzdGF0dXMgPSBVQVJUX1N0YXJ0X1JlY2VpdmVfRE1BKGh1YXJ0LCBwRGF0YSwgU2l6ZSk7CisKKyAgICAvKiBDaGVjayBSeCBwcm9jZXNzIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzdGFydGVkICovCisgICAgaWYgKHN0YXR1cyA9PSBIQUxfT0spIHsKKyAgICAgIGlmIChodWFydC0+UmVjZXB0aW9uVHlwZSA9PSBIQUxfVUFSVF9SRUNFUFRJT05fVE9JRExFKSB7CisgICAgICAgIF9fSEFMX1VBUlRfQ0xFQVJfRkxBRyhodWFydCwgVUFSVF9DTEVBUl9JRExFRik7CisgICAgICAgIEFUT01JQ19TRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfSURMRUlFKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIEluIGNhc2Ugb2YgZXJyb3JzIGFscmVhZHkgcGVuZGluZyB3aGVuIHJlY2VwdGlvbiBpcyBzdGFydGVkLAorICAgICAgICAgICBJbnRlcnJ1cHRzIG1heSBoYXZlIGFscmVhZHkgYmVlbiByYWlzZWQgYW5kIGxlYWQgdG8gcmVjZXB0aW9uCisgICAgICAgICAgIGFib3J0aW9uLiAoT3ZlcnJ1biBlcnJvciBmb3IgaW5zdGFuY2UpLiBJbiBzdWNoIGNhc2UgUmVjZXB0aW9uIFR5cGUKKyAgICAgICAgICAgaGFzIGJlZW4gcmVzZXQgdG8gSEFMX1VBUlRfUkVDRVBUSU9OX1NUQU5EQVJELiAqLworICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgKiBAYnJpZWYgUHJvdmlkZSBSeCBFdmVudCB0eXBlIHRoYXQgaGFzIGxlYWQgdG8gUnhFdmVudCBjYWxsYmFjayBleGVjdXRpb24uCisgKiBAbm90ZSAgV2hlbiBIQUxfVUFSVEV4X1JlY2VpdmVUb0lkbGVfSVQoKSBvciBIQUxfVUFSVEV4X1JlY2VpdmVUb0lkbGVfRE1BKCkKKyAqIEFQSSBhcmUgY2FsbGVkLCBwcm9ncmVzcyBvZiByZWNlcHRpb24gcHJvY2VzcyBpcyBwcm92aWRlZCB0byBhcHBsaWNhdGlvbgorICogdGhyb3VnaCBjYWxscyBvZiBSeCBFdmVudCBjYWxsYmFjayAoZWl0aGVyIGRlZmF1bHQgb25lCisgKiAgICAgICAgSEFMX1VBUlRFeF9SeEV2ZW50Q2FsbGJhY2soKSBvciB1c2VyIHJlZ2lzdGVyZWQgb25lKS4gQXMgc2V2ZXJhbCB0eXBlcworICogb2YgZXZlbnRzIGNvdWxkIG9jY3VyIChJRExFIGV2ZW50LCBIYWxmIFRyYW5zZmVyLCBvciBUcmFuc2ZlciBDb21wbGV0ZSksIHRoaXMKKyAqIGZ1bmN0aW9uIGFsbG93cyB0byByZXRyaWV2ZSB0aGUgUnggRXZlbnQgdHlwZSB0aGF0IGhhcyBsZWFkIHRvIFJ4IEV2ZW50CisgKiBjYWxsYmFjayBleGVjdXRpb24uCisgKiBAbm90ZSAgVGhpcyBmdW5jdGlvbiBpcyBleHBlY3RlZCB0byBiZSBjYWxsZWQgd2l0aGluIHRoZSB1c2VyIGltcGxlbWVudGF0aW9uCisgKiBvZiBSeCBFdmVudCBDYWxsYmFjaywgaW4gb3JkZXIgdG8gcHJvdmlkZSB0aGUgYWNjdXJhdGUgdmFsdWUgOiBJbiBJbnRlcnJ1cHQKKyAqIE1vZGUgOgorICogICAgICAgICAgIC0gSEFMX1VBUlRfUlhFVkVOVF9UQyA6IHdoZW4gUmVjZXB0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZCAoZXhwZWN0ZWQKKyAqIG5iIG9mIGRhdGEgaGFzIGJlZW4gcmVjZWl2ZWQpCisgKiAgICAgICAgICAgLSBIQUxfVUFSVF9SWEVWRU5UX0lETEUgOiB3aGVuIElkbGUgZXZlbnQgb2NjdXJyZWQgcHJpb3IgcmVjZXB0aW9uCisgKiBoYXMgYmVlbiBjb21wbGV0ZWQgKG5iIG9mIHJlY2VpdmVkIGRhdGEgaXMgbG93ZXIgdGhhbiBleHBlY3RlZCBvbmUpIEluIERNQQorICogTW9kZSA6CisgKiAgICAgICAgICAgLSBIQUxfVUFSVF9SWEVWRU5UX1RDIDogd2hlbiBSZWNlcHRpb24gaGFzIGJlZW4gY29tcGxldGVkIChleHBlY3RlZAorICogbmIgb2YgZGF0YSBoYXMgYmVlbiByZWNlaXZlZCkKKyAqICAgICAgICAgICAtIEhBTF9VQVJUX1JYRVZFTlRfSFQgOiB3aGVuIGhhbGYgb2YgZXhwZWN0ZWQgbmIgb2YgZGF0YSBoYXMgYmVlbgorICogcmVjZWl2ZWQKKyAqICAgICAgICAgICAtIEhBTF9VQVJUX1JYRVZFTlRfSURMRSA6IHdoZW4gSWRsZSBldmVudCBvY2N1cnJlZCBwcmlvciByZWNlcHRpb24KKyAqIGhhcyBiZWVuIGNvbXBsZXRlZCAobmIgb2YgcmVjZWl2ZWQgZGF0YSBpcyBsb3dlciB0aGFuIGV4cGVjdGVkIG9uZSkuIEluIERNQQorICogbW9kZSwgUnhFdmVudCBjYWxsYmFjayBjb3VsZCBiZSBjYWxsZWQgc2V2ZXJhbCB0aW1lczsgV2hlbiBETUEgaXMgY29uZmlndXJlZAorICogaW4gTm9ybWFsIE1vZGUsIEhUIGV2ZW50IGRvZXMgbm90IHN0b3AgUmVjZXB0aW9uIHByb2Nlc3M7IFdoZW4gRE1BIGlzCisgKiBjb25maWd1cmVkIGluIENpcmN1bGFyIE1vZGUsIEhULCBUQyBvciBJRExFIGV2ZW50cyBkb24ndCBzdG9wIFJlY2VwdGlvbgorICogcHJvY2VzczsKKyAqIEBwYXJhbSAgaHVhcnQgVUFSVCBoYW5kbGUuCisgKiBAcmV0dmFsIFJ4IEV2ZW50IFR5cGUgKHJldHVybiB2YWxlIHdpbGwgYmUgYSB2YWx1ZSBvZiBAcmVmCisgKiBVQVJUX1J4RXZlbnRfVHlwZV9WYWx1ZXMpCisgKi8KK0hBTF9VQVJUX1J4RXZlbnRUeXBlVHlwZURlZiBIQUxfVUFSVEV4X0dldFJ4RXZlbnRUeXBlKAorICAgIGNvbnN0IFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpIHsKKyAgLyogUmV0dXJuIFJ4IEV2ZW50IHR5cGUgdmFsdWUsIGFzIHN0b3JlZCBpbiBVQVJUIGhhbmRsZSAqLworICByZXR1cm4gKGh1YXJ0LT5SeEV2ZW50VHlwZSk7Cit9CisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyoqIEBhZGR0b2dyb3VwIFVBUlRFeF9Qcml2YXRlX0Z1bmN0aW9ucworICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiBJbml0aWFsaXplIHRoZSBVQVJUIHdha2UtdXAgZnJvbSBzdG9wIG1vZGUgcGFyYW1ldGVycyB3aGVuIHRyaWdnZXJlZAorICogYnkgYWRkcmVzcyBkZXRlY3Rpb24uCisgKiBAcGFyYW0gaHVhcnQgICAgICAgICAgIFVBUlQgaGFuZGxlLgorICogQHBhcmFtIFdha2VVcFNlbGVjdGlvbiBVQVJUIHdha2UgdXAgZnJvbSBzdG9wIG1vZGUgcGFyYW1ldGVycy4KKyAqIEByZXR2YWwgTm9uZQorICovCitzdGF0aWMgdm9pZCBVQVJURXhfV2FrZXVwX0FkZHJlc3NDb25maWcoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQVJUX1dha2VVcFR5cGVEZWYgV2FrZVVwU2VsZWN0aW9uKSB7CisgIGFzc2VydF9wYXJhbShJU19VQVJUX0FERFJFU1NMRU5HVEhfREVURUNUKFdha2VVcFNlbGVjdGlvbi5BZGRyZXNzTGVuZ3RoKSk7CisKKyAgLyogU2V0IHRoZSBVU0FSVCBhZGRyZXNzIGxlbmd0aCAqLworICBNT0RJRllfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IyLCBVU0FSVF9DUjJfQURETTcsCisgICAgICAgICAgICAgV2FrZVVwU2VsZWN0aW9uLkFkZHJlc3NMZW5ndGgpOworCisgIC8qIFNldCB0aGUgVVNBUlQgYWRkcmVzcyBub2RlICovCisgIE1PRElGWV9SRUcoaHVhcnQtPkluc3RhbmNlLT5DUjIsIFVTQVJUX0NSMl9BREQsCisgICAgICAgICAgICAgKCh1aW50MzJfdClXYWtlVXBTZWxlY3Rpb24uQWRkcmVzcyA8PCBVQVJUX0NSMl9BRERSRVNTX0xTQl9QT1MpKTsKK30KKworLyoqCisgKiBAYnJpZWYgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgZGF0YSB0byBwcm9jZXNzIGluIFJYL1RYIElTUi4KKyAqIEBub3RlIFRoZSBSWCBGSUZPIGRlcHRoIGFuZCB0aGUgVFggRklGTyBkZXB0aCBpcyBleHRyYWN0ZWQgZnJvbQorICogICAgICAgdGhlIFVBUlQgY29uZmlndXJhdGlvbiByZWdpc3RlcnMuCisgKiBAcGFyYW0gaHVhcnQgVUFSVCBoYW5kbGUuCisgKiBAcmV0dmFsIE5vbmUKKyAqLworc3RhdGljIHZvaWQgVUFSVEV4X1NldE5iRGF0YVRvUHJvY2VzcyhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KSB7CisgIHVpbnQ4X3QgcnhfZmlmb19kZXB0aDsKKyAgdWludDhfdCB0eF9maWZvX2RlcHRoOworICB1aW50OF90IHJ4X2ZpZm9fdGhyZXNob2xkOworICB1aW50OF90IHR4X2ZpZm9fdGhyZXNob2xkOworICBzdGF0aWMgY29uc3QgdWludDhfdCBudW1lcmF0b3JbXSA9IHsxVSwgMVUsIDFVLCAzVSwgN1UsIDFVLCAwVSwgMFV9OworICBzdGF0aWMgY29uc3QgdWludDhfdCBkZW5vbWluYXRvcltdID0gezhVLCA0VSwgMlUsIDRVLCA4VSwgMVUsIDFVLCAxVX07CisKKyAgaWYgKGh1YXJ0LT5GaWZvTW9kZSA9PSBVQVJUX0ZJRk9NT0RFX0RJU0FCTEUpIHsKKyAgICBodWFydC0+TmJUeERhdGFUb1Byb2Nlc3MgPSAxVTsKKyAgICBodWFydC0+TmJSeERhdGFUb1Byb2Nlc3MgPSAxVTsKKyAgfSBlbHNlIHsKKyAgICByeF9maWZvX2RlcHRoID0gUlhfRklGT19ERVBUSDsKKyAgICB0eF9maWZvX2RlcHRoID0gVFhfRklGT19ERVBUSDsKKyAgICByeF9maWZvX3RocmVzaG9sZCA9CisgICAgICAgICh1aW50OF90KShSRUFEX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX1JYRlRDRkcpID4+CisgICAgICAgICAgICAgICAgICBVU0FSVF9DUjNfUlhGVENGR19Qb3MpOworICAgIHR4X2ZpZm9fdGhyZXNob2xkID0KKyAgICAgICAgKHVpbnQ4X3QpKFJFQURfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfVFhGVENGRykgPj4KKyAgICAgICAgICAgICAgICAgIFVTQVJUX0NSM19UWEZUQ0ZHX1Bvcyk7CisgICAgaHVhcnQtPk5iVHhEYXRhVG9Qcm9jZXNzID0KKyAgICAgICAgKCh1aW50MTZfdCl0eF9maWZvX2RlcHRoICogbnVtZXJhdG9yW3R4X2ZpZm9fdGhyZXNob2xkXSkgLworICAgICAgICAodWludDE2X3QpZGVub21pbmF0b3JbdHhfZmlmb190aHJlc2hvbGRdOworICAgIGh1YXJ0LT5OYlJ4RGF0YVRvUHJvY2VzcyA9CisgICAgICAgICgodWludDE2X3QpcnhfZmlmb19kZXB0aCAqIG51bWVyYXRvcltyeF9maWZvX3RocmVzaG9sZF0pIC8KKyAgICAgICAgKHVpbnQxNl90KWRlbm9taW5hdG9yW3J4X2ZpZm9fdGhyZXNob2xkXTsKKyAgfQorfQorLyoqCisgKiBAfQorICovCisKKyNlbmRpZiAvKiBIQUxfVUFSVF9NT0RVTEVfRU5BQkxFRCAqLworCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCmRpZmYgLS1naXQgYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9sbF9hZGMuYyBiL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2xsX2FkYy5jCmluZGV4IDUzNjFmNmQuLjM2N2RmYTggMTAwNjQ0Ci0tLSBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2xsX2FkYy5jCisrKyBiL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2xsX2FkYy5jCkBAIC0xLDEyNTMgKzEsMTI0NyBAQAotLyoqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEBmaWxlICAgIHN0bTMyZzR4eF9sbF9hZGMuYw0KLSAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtDQotICogQGJyaWVmICAgQURDIExMIG1vZHVsZSBkcml2ZXINCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQGF0dGVudGlvbg0KLSAqDQotICogQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KLSAqDQotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0ZXJtcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlDQotICogaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc29mdHdhcmUgY29tcG9uZW50Lg0KLSAqIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcyB3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLg0KLSAqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqLw0KLSNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikNCi0NCi0vKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpbmNsdWRlICJzdG0zMmc0eHhfbGxfYWRjLmgiDQotDQotI2luY2x1ZGUgInN0bTMyZzR4eF9sbF9idXMuaCINCi0NCi0jaWZkZWYgVVNFX0ZVTExfQVNTRVJUDQotI2luY2x1ZGUgInN0bTMyX2Fzc2VydC5oIg0KLSNlbHNlDQotI2RlZmluZSBhc3NlcnRfcGFyYW0oZXhwcikgKCh2b2lkKTBVKQ0KLSNlbmRpZg0KLQ0KLS8qKiBAYWRkdG9ncm91cCBTVE0zMkc0eHhfTExfRHJpdmVyDQotICogQHsNCi0gKi8NCi0NCi0jaWYgZGVmaW5lZChBREMxKSB8fCBkZWZpbmVkKEFEQzIpIHx8IGRlZmluZWQoQURDMykgfHwgZGVmaW5lZChBREM0KSB8fCBcDQotICAgIGRlZmluZWQoQURDNSkNCi0NCi0vKiogQGFkZHRvZ3JvdXAgQURDX0xMIEFEQw0KLSAqIEB7DQotICovDQotDQotLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyoqIEBhZGR0b2dyb3VwIEFEQ19MTF9Qcml2YXRlX0NvbnN0YW50cw0KLSAqIEB7DQotICovDQotDQotLyogRGVmaW5pdGlvbnMgb2YgQURDIGhhcmR3YXJlIGNvbnN0cmFpbnRzIGRlbGF5cyAqLw0KLS8qIE5vdGU6IE9ubHkgQURDIHBlcmlwaGVyYWwgSFcgZGVsYXlzIGFyZSBkZWZpbmVkIGluIEFEQyBMTCBkcml2ZXIgZHJpdmVyLCAgICovDQotLyogICAgICAgbm90IHRpbWVvdXQgdmFsdWVzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0vKiAgICAgICBUaW1lb3V0IHZhbHVlcyBmb3IgQURDIG9wZXJhdGlvbnMgYXJlIGRlcGVuZGVudCB0byBkZXZpY2UgY2xvY2sgICAgICAqLw0KLS8qICAgICAgIGNvbmZpZ3VyYXRpb24gKHN5c3RlbSBjbG9jayB2ZXJzdXMgQURDIGNsb2NrKSwgICAgICAgICAgICAgICAgICAgICAgICovDQotLyogICAgICAgYW5kIHRoZXJlZm9yZSBtdXN0IGJlIGRlZmluZWQgaW4gdXNlciBhcHBsaWNhdGlvbi4gICAgICAgICAgICAgICAgICAgKi8NCi0vKiAgICAgICBSZWZlciB0byBAcmVmIEFEQ19MTF9FQ19IV19ERUxBWVMgZm9yIGRlc2NyaXB0aW9uIG9mIEFEQyB0aW1lb3V0ICAgICAqLw0KLS8qICAgICAgIHZhbHVlcyBkZWZpbml0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotLyogTm90ZTogQURDIHRpbWVvdXQgdmFsdWVzIGFyZSBkZWZpbmVkIGhlcmUgaW4gQ1BVIGN5Y2xlcyB0byBiZSBpbmRlcGVuZGVudCAgKi8NCi0vKiAgICAgICBvZiBkZXZpY2UgY2xvY2sgc2V0dGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLS8qICAgICAgIEluIHVzZXIgYXBwbGljYXRpb24sIEFEQyB0aW1lb3V0IHZhbHVlcyBzaG91bGQgYmUgZGVmaW5lZCB3aXRoICAgICAgICovDQotLyogICAgICAgdGVtcG9yYWwgdmFsdWVzLCBpbiBmdW5jdGlvbiBvZiBkZXZpY2UgY2xvY2sgc2V0dGluZ3MuICAgICAgICAgICAgICAgKi8NCi0vKiAgICAgICBIaWdoZXN0IHJhdGlvIENQVSBjbG9jayBmcmVxdWVuY3kgdnMgQURDIGNsb2NrIGZyZXF1ZW5jeTogICAgICAgICAgICAqLw0KLS8qICAgICAgICAtIEFEQyBjbG9jayBmcm9tIHN5bmNocm9ub3VzIGNsb2NrIHdpdGggQUhCIHByZXNjYWxlciA1MTIsICAgICAgICAgICovDQotLyogICAgICAgICAgQURDIHByZXNjYWxlciA0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0vKiAgICAgICAgICAgUmF0aW8gbWF4ID0gNTEyICo0ID0gMjA0OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLS8qICAgICAgICAtIEFEQyBjbG9jayBmcm9tIGFzeW5jaHJvbm91cyBjbG9jayAoUExMUCkgd2l0aCBwcmVzY2FsZXIgMjU2LiAgICAgICovDQotLyogICAgICAgICAgSGlnaGVzdCBDUFUgY2xvY2sgUExMIChQTExSKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0vKiAgICAgICAgICAgUmF0aW8gbWF4ID0gUExMUm1heCAvUFBMUG1pbiAqIDI1NiA9IChWQ08vMikgLyAoVkNPLzMxKSAqIDI1NiAgICAqLw0KLS8qICAgICAgICAgICAgICAgICAgICAgPSAzOTY4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotLyogVW5pdDogQ1BVIGN5Y2xlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIEFEQ19DTE9DS19SQVRJT19WU19DUFVfSElHSEVTVCAoMzk2OFVMKQ0KLSNkZWZpbmUgQURDX1RJTUVPVVRfRElTQUJMRV9DUFVfQ1lDTEVTIChBRENfQ0xPQ0tfUkFUSU9fVlNfQ1BVX0hJR0hFU1QgKiAxVUwpDQotI2RlZmluZSBBRENfVElNRU9VVF9TVE9QX0NPTlZFUlNJT05fQ1BVX0NZQ0xFUyBcDQotICAoQURDX0NMT0NLX1JBVElPX1ZTX0NQVV9ISUdIRVNUICogMVVMKQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0NCi0vKiogQGFkZHRvZ3JvdXAgQURDX0xMX1ByaXZhdGVfTWFjcm9zDQotICogQHsNCi0gKi8NCi0NCi0vKiBDaGVjayBvZiBwYXJhbWV0ZXJzIGZvciBjb25maWd1cmF0aW9uIG9mIEFEQyBoaWVyYXJjaGljYWwgc2NvcGU6ICAgICAgICAgICAqLw0KLS8qIGNvbW1vbiB0byBzZXZlcmFsIEFEQyBpbnN0YW5jZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBJU19MTF9BRENfQ09NTU9OX0NMT0NLKF9fQ0xPQ0tfXykgICAgICAgICAgXA0KLSAgKCgoX19DTE9DS19fKSA9PSBMTF9BRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjEpIHx8IFwNCi0gICAoKF9fQ0xPQ0tfXykgPT0gTExfQURDX0NMT0NLX1NZTkNfUENMS19ESVYyKSB8fCBcDQotICAgKChfX0NMT0NLX18pID09IExMX0FEQ19DTE9DS19TWU5DX1BDTEtfRElWNCkgfHwgXA0KLSAgICgoX19DTE9DS19fKSA9PSBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMSkgfHwgICAgIFwNCi0gICAoKF9fQ0xPQ0tfXykgPT0gTExfQURDX0NMT0NLX0FTWU5DX0RJVjIpIHx8ICAgICBcDQotICAgKChfX0NMT0NLX18pID09IExMX0FEQ19DTE9DS19BU1lOQ19ESVY0KSB8fCAgICAgXA0KLSAgICgoX19DTE9DS19fKSA9PSBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWNikgfHwgICAgIFwNCi0gICAoKF9fQ0xPQ0tfXykgPT0gTExfQURDX0NMT0NLX0FTWU5DX0RJVjgpIHx8ICAgICBcDQotICAgKChfX0NMT0NLX18pID09IExMX0FEQ19DTE9DS19BU1lOQ19ESVYxMCkgfHwgICAgXA0KLSAgICgoX19DTE9DS19fKSA9PSBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMTIpIHx8ICAgIFwNCi0gICAoKF9fQ0xPQ0tfXykgPT0gTExfQURDX0NMT0NLX0FTWU5DX0RJVjE2KSB8fCAgICBcDQotICAgKChfX0NMT0NLX18pID09IExMX0FEQ19DTE9DS19BU1lOQ19ESVYzMikgfHwgICAgXA0KLSAgICgoX19DTE9DS19fKSA9PSBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWNjQpIHx8ICAgIFwNCi0gICAoKF9fQ0xPQ0tfXykgPT0gTExfQURDX0NMT0NLX0FTWU5DX0RJVjEyOCkgfHwgICBcDQotICAgKChfX0NMT0NLX18pID09IExMX0FEQ19DTE9DS19BU1lOQ19ESVYyNTYpKQ0KLQ0KLS8qIENoZWNrIG9mIHBhcmFtZXRlcnMgZm9yIGNvbmZpZ3VyYXRpb24gb2YgQURDIGhpZXJhcmNoaWNhbCBzY29wZTogICAgICAgICAgICovDQotLyogQURDIGluc3RhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIElTX0xMX0FEQ19SRVNPTFVUSU9OKF9fUkVTT0xVVElPTl9fKSAgICAgIFwNCi0gICgoKF9fUkVTT0xVVElPTl9fKSA9PSBMTF9BRENfUkVTT0xVVElPTl8xMkIpIHx8IFwNCi0gICAoKF9fUkVTT0xVVElPTl9fKSA9PSBMTF9BRENfUkVTT0xVVElPTl8xMEIpIHx8IFwNCi0gICAoKF9fUkVTT0xVVElPTl9fKSA9PSBMTF9BRENfUkVTT0xVVElPTl84QikgfHwgIFwNCi0gICAoKF9fUkVTT0xVVElPTl9fKSA9PSBMTF9BRENfUkVTT0xVVElPTl82QikpDQotDQotI2RlZmluZSBJU19MTF9BRENfREFUQV9BTElHTihfX0RBVEFfQUxJR05fXykgICAgICAgIFwNCi0gICgoKF9fREFUQV9BTElHTl9fKSA9PSBMTF9BRENfREFUQV9BTElHTl9SSUdIVCkgfHwgXA0KLSAgICgoX19EQVRBX0FMSUdOX18pID09IExMX0FEQ19EQVRBX0FMSUdOX0xFRlQpKQ0KLQ0KLSNkZWZpbmUgSVNfTExfQURDX0xPV19QT1dFUihfX0xPV19QT1dFUl9fKSAgICAgXA0KLSAgKCgoX19MT1dfUE9XRVJfXykgPT0gTExfQURDX0xQX01PREVfTk9ORSkgfHwgXA0KLSAgICgoX19MT1dfUE9XRVJfXykgPT0gTExfQURDX0xQX0FVVE9XQUlUKSkNCi0NCi0vKiBDaGVjayBvZiBwYXJhbWV0ZXJzIGZvciBjb25maWd1cmF0aW9uIG9mIEFEQyBoaWVyYXJjaGljYWwgc2NvcGU6ICAgICAgICAgICAqLw0KLS8qIEFEQyBncm91cCByZWd1bGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2lmIGRlZmluZWQoU1RNMzJHNDc0eHgpIHx8IGRlZmluZWQoU1RNMzJHNDg0eHgpDQotI2RlZmluZSBJU19MTF9BRENfUkVHX1RSSUdfU09VUkNFKF9fQURDX0lOU1RBTkNFX18sIF9fUkVHX1RSSUdfU09VUkNFX18pIFwNCi0gICgoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19TT0ZUV0FSRSkgfHwgICAgICAgICAgICAgICAgXA0KLSAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0xX1RSR08pIHx8ICAgICAgICAgICBcDQotICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfVFJHTzIpIHx8ICAgICAgICAgIFwNCi0gICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9DSDMpIHx8ICAgICAgICAgICAgXA0KLSAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0yX1RSR08pIHx8ICAgICAgICAgICBcDQotICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTNfVFJHTykgfHwgICAgICAgICAgIFwNCi0gICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNNF9UUkdPKSB8fCAgICAgICAgICAgXA0KLSAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU02X1RSR08pIHx8ICAgICAgICAgICBcDQotICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTdfVFJHTykgfHwgICAgICAgICAgIFwNCi0gICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNOF9UUkdPKSB8fCAgICAgICAgICAgXA0KLSAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU04X1RSR08yKSB8fCAgICAgICAgICBcDQotICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTE1X1RSR08pIHx8ICAgICAgICAgIFwNCi0gICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMjBfVFJHTykgfHwgICAgICAgICAgXA0KLSAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0yMF9UUkdPMikgfHwgICAgICAgICBcDQotICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTIwX0NIMSkgfHwgICAgICAgICAgIFwNCi0gICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfSFJUSU1fVFJHMSkgfHwgICAgICAgICAgXA0KLSAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9IUlRJTV9UUkczKSB8fCAgICAgICAgICBcDQotICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX0hSVElNX1RSRzUpIHx8ICAgICAgICAgIFwNCi0gICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfSFJUSU1fVFJHNikgfHwgICAgICAgICAgXA0KLSAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9IUlRJTV9UUkc3KSB8fCAgICAgICAgICBcDQotICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX0hSVElNX1RSRzgpIHx8ICAgICAgICAgIFwNCi0gICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfSFJUSU1fVFJHOSkgfHwgICAgICAgICAgXA0KLSAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9IUlRJTV9UUkcxMCkgfHwgICAgICAgICBcDQotICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX0xQVElNX09VVCkgfHwgICAgICAgICAgIFwNCi0gICAoKCgoX19BRENfSU5TVEFOQ0VfXykgPT0gQURDMSkgfHwgKChfX0FEQ19JTlNUQU5DRV9fKSA9PSBBREMyKSkgJiYgICAgXA0KLSAgICAoKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfQ0gxKSB8fCAgICAgICAgICBcDQotICAgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9DSDIpIHx8ICAgICAgICAgIFwNCi0gICAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0yX0NIMikgfHwgICAgICAgICAgXA0KLSAgICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTNfQ0g0KSB8fCAgICAgICAgICBcDQotICAgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNNF9DSDQpIHx8ICAgICAgICAgIFwNCi0gICAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0yMF9DSDIpIHx8ICAgICAgICAgXA0KLSAgICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTIwX0NIMykgfHwgICAgICAgICBcDQotICAgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfRVhUSV9MSU5FMTEpKSkgfHwgICAgIFwNCi0gICAoKCgoX19BRENfSU5TVEFOQ0VfXykgPT0gQURDMykgfHwgKChfX0FEQ19JTlNUQU5DRV9fKSA9PSBBREM0KSB8fCAgICAgXA0KLSAgICAgKChfX0FEQ19JTlNUQU5DRV9fKSA9PSBBREM1KSkgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICgoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMl9DSDEpIHx8ICAgICAgICAgIFwNCi0gICAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0yX0NIMykgfHwgICAgICAgICAgXA0KLSAgICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTNfQ0gxKSB8fCAgICAgICAgICBcDQotICAgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNNF9DSDEpIHx8ICAgICAgICAgIFwNCi0gICAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU04X0NIMSkgfHwgICAgICAgICAgXA0KLSAgICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX0VYVElfTElORTIpIHx8ICAgICAgICBcDQotICAgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfSFJUSU1fVFJHMikgfHwgICAgICAgIFwNCi0gICAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9IUlRJTV9UUkc0KSkpKQ0KLSNlbGlmIGRlZmluZWQoU1RNMzJHNDczeHgpIHx8IGRlZmluZWQoU1RNMzJHNDgzeHgpDQotI2RlZmluZSBJU19MTF9BRENfUkVHX1RSSUdfU09VUkNFKF9fQURDX0lOU1RBTkNFX18sIF9fUkVHX1RSSUdfU09VUkNFX18pIFwNCi0gICgoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19TT0ZUV0FSRSkgfHwgICAgICAgICAgICAgICAgXA0KLSAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0xX1RSR08pIHx8ICAgICAgICAgICBcDQotICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfVFJHTzIpIHx8ICAgICAgICAgIFwNCi0gICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9DSDMpIHx8ICAgICAgICAgICAgXA0KLSAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0yX1RSR08pIHx8ICAgICAgICAgICBcDQotICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTJfQ0gyKSB8fCAgICAgICAgICAgIFwNCi0gICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNM19UUkdPKSB8fCAgICAgICAgICAgXA0KLSAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU00X1RSR08pIHx8ICAgICAgICAgICBcDQotICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTZfVFJHTykgfHwgICAgICAgICAgIFwNCi0gICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNN19UUkdPKSB8fCAgICAgICAgICAgXA0KLSAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU04X1RSR08pIHx8ICAgICAgICAgICBcDQotICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTThfVFJHTzIpIHx8ICAgICAgICAgIFwNCi0gICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMTVfVFJHTykgfHwgICAgICAgICAgXA0KLSAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0yMF9UUkdPKSB8fCAgICAgICAgICBcDQotICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTIwX1RSR08yKSB8fCAgICAgICAgIFwNCi0gICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMjBfQ0gxKSB8fCAgICAgICAgICAgXA0KLSAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9MUFRJTV9PVVQpIHx8ICAgICAgICAgICBcDQotICAgKCgoKF9fQURDX0lOU1RBTkNFX18pID09IEFEQzEpIHx8ICgoX19BRENfSU5TVEFOQ0VfXykgPT0gQURDMikpICYmICAgIFwNCi0gICAgKCgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0xX0NIMSkgfHwgICAgICAgICAgXA0KLSAgICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfQ0gyKSB8fCAgICAgICAgICBcDQotICAgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMl9DSDIpIHx8ICAgICAgICAgIFwNCi0gICAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0zX0NINCkgfHwgICAgICAgICAgXA0KLSAgICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTRfQ0g0KSB8fCAgICAgICAgICBcDQotICAgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMjBfQ0gyKSB8fCAgICAgICAgIFwNCi0gICAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0yMF9DSDMpIHx8ICAgICAgICAgXA0KLSAgICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX0VYVElfTElORTExKSkpIHx8ICAgICBcDQotICAgKCgoKF9fQURDX0lOU1RBTkNFX18pID09IEFEQzMpIHx8ICgoX19BRENfSU5TVEFOQ0VfXykgPT0gQURDNCkgfHwgICAgIFwNCi0gICAgICgoX19BRENfSU5TVEFOQ0VfXykgPT0gQURDNSkpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAoKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTJfQ0gxKSB8fCAgICAgICAgICBcDQotICAgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMl9DSDMpIHx8ICAgICAgICAgIFwNCi0gICAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0zX0NIMSkgfHwgICAgICAgICAgXA0KLSAgICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTRfQ0gxKSB8fCAgICAgICAgICBcDQotICAgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNOF9DSDEpIHx8ICAgICAgICAgIFwNCi0gICAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9FWFRJX0xJTkUyKSkpKQ0KLSNlbGlmIGRlZmluZWQoU1RNMzJHNDcxeHgpDQotI2RlZmluZSBJU19MTF9BRENfUkVHX1RSSUdfU09VUkNFKF9fQURDX0lOU1RBTkNFX18sIF9fUkVHX1RSSUdfU09VUkNFX18pIFwNCi0gICgoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19TT0ZUV0FSRSkgfHwgICAgICAgICAgICAgICAgXA0KLSAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0xX1RSR08pIHx8ICAgICAgICAgICBcDQotICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfVFJHTzIpIHx8ICAgICAgICAgIFwNCi0gICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9DSDMpIHx8ICAgICAgICAgICAgXA0KLSAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0yX1RSR08pIHx8ICAgICAgICAgICBcDQotICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTJfQ0gyKSB8fCAgICAgICAgICAgIFwNCi0gICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNM19UUkdPKSB8fCAgICAgICAgICAgXA0KLSAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU00X1RSR08pIHx8ICAgICAgICAgICBcDQotICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTZfVFJHTykgfHwgICAgICAgICAgIFwNCi0gICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNN19UUkdPKSB8fCAgICAgICAgICAgXA0KLSAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU04X1RSR08pIHx8ICAgICAgICAgICBcDQotICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTThfVFJHTzIpIHx8ICAgICAgICAgIFwNCi0gICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMTVfVFJHTykgfHwgICAgICAgICAgXA0KLSAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9MUFRJTV9PVVQpIHx8ICAgICAgICAgICBcDQotICAgKCgoKF9fQURDX0lOU1RBTkNFX18pID09IEFEQzEpIHx8ICgoX19BRENfSU5TVEFOQ0VfXykgPT0gQURDMikpICYmICAgIFwNCi0gICAgKCgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0xX0NIMSkgfHwgICAgICAgICAgXA0KLSAgICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfQ0gyKSB8fCAgICAgICAgICBcDQotICAgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMl9DSDIpIHx8ICAgICAgICAgIFwNCi0gICAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0zX0NINCkgfHwgICAgICAgICAgXA0KLSAgICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTRfQ0g0KSB8fCAgICAgICAgICBcDQotICAgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfRVhUSV9MSU5FMTEpKSkgfHwgICAgIFwNCi0gICAoKChfX0FEQ19JTlNUQU5DRV9fKSA9PSBBREMzKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAoKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTJfQ0gxKSB8fCAgICAgICAgICBcDQotICAgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMl9DSDMpIHx8ICAgICAgICAgIFwNCi0gICAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0zX0NIMSkgfHwgICAgICAgICAgXA0KLSAgICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTRfQ0gxKSB8fCAgICAgICAgICBcDQotICAgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNOF9DSDEpIHx8ICAgICAgICAgIFwNCi0gICAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9FWFRJX0xJTkUyKSkpKQ0KLSNlbGlmIGRlZmluZWQoU1RNMzJHQksxQ0IpIHx8IGRlZmluZWQoU1RNMzJHNDMxeHgpIHx8IGRlZmluZWQoU1RNMzJHNDQxeHgpDQotI2RlZmluZSBJU19MTF9BRENfUkVHX1RSSUdfU09VUkNFKF9fQURDX0lOU1RBTkNFX18sIF9fUkVHX1RSSUdfU09VUkNFX18pIFwNCi0gICgoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19TT0ZUV0FSRSkgfHwgICAgICAgICAgICAgICAgXA0KLSAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0xX1RSR08pIHx8ICAgICAgICAgICBcDQotICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfVFJHTzIpIHx8ICAgICAgICAgIFwNCi0gICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9DSDEpIHx8ICAgICAgICAgICAgXA0KLSAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0xX0NIMikgfHwgICAgICAgICAgICBcDQotICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfQ0gzKSB8fCAgICAgICAgICAgIFwNCi0gICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMl9UUkdPKSB8fCAgICAgICAgICAgXA0KLSAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0yX0NIMikgfHwgICAgICAgICAgICBcDQotICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTNfVFJHTykgfHwgICAgICAgICAgIFwNCi0gICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNM19DSDQpIHx8ICAgICAgICAgICAgXA0KLSAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU00X1RSR08pIHx8ICAgICAgICAgICBcDQotICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTRfQ0g0KSB8fCAgICAgICAgICAgIFwNCi0gICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNNl9UUkdPKSB8fCAgICAgICAgICAgXA0KLSAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU03X1RSR08pIHx8ICAgICAgICAgICBcDQotICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTThfVFJHTykgfHwgICAgICAgICAgIFwNCi0gICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNOF9UUkdPMikgfHwgICAgICAgICAgXA0KLSAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0xNV9UUkdPKSB8fCAgICAgICAgICBcDQotICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX0xQVElNX09VVCkgfHwgICAgICAgICAgIFwNCi0gICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfRVhUSV9MSU5FMTEpKQ0KLSNlbGlmIGRlZmluZWQoU1RNMzJHNDkxeHgpIHx8IGRlZmluZWQoU1RNMzJHNEExeHgpDQotI2RlZmluZSBJU19MTF9BRENfUkVHX1RSSUdfU09VUkNFKF9fQURDX0lOU1RBTkNFX18sIF9fUkVHX1RSSUdfU09VUkNFX18pIFwNCi0gICgoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19TT0ZUV0FSRSkgfHwgICAgICAgICAgICAgICAgXA0KLSAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0xX1RSR08pIHx8ICAgICAgICAgICBcDQotICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfVFJHTzIpIHx8ICAgICAgICAgIFwNCi0gICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9DSDMpIHx8ICAgICAgICAgICAgXA0KLSAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0yX1RSR08pIHx8ICAgICAgICAgICBcDQotICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTNfVFJHTykgfHwgICAgICAgICAgIFwNCi0gICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNNF9UUkdPKSB8fCAgICAgICAgICAgXA0KLSAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU02X1RSR08pIHx8ICAgICAgICAgICBcDQotICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTdfVFJHTykgfHwgICAgICAgICAgIFwNCi0gICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNOF9UUkdPKSB8fCAgICAgICAgICAgXA0KLSAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU04X1RSR08yKSB8fCAgICAgICAgICBcDQotICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTE1X1RSR08pIHx8ICAgICAgICAgIFwNCi0gICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMjBfVFJHTykgfHwgICAgICAgICAgXA0KLSAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0yMF9UUkdPMikgfHwgICAgICAgICBcDQotICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTIwX0NIMSkgfHwgICAgICAgICAgIFwNCi0gICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfTFBUSU1fT1VUKSB8fCAgICAgICAgICAgXA0KLSAgICgoKChfX0FEQ19JTlNUQU5DRV9fKSA9PSBBREMxKSB8fCAoKF9fQURDX0lOU1RBTkNFX18pID09IEFEQzIpKSAmJiAgICBcDQotICAgICgoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9DSDEpIHx8ICAgICAgICAgIFwNCi0gICAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0xX0NIMikgfHwgICAgICAgICAgXA0KLSAgICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTJfQ0gyKSB8fCAgICAgICAgICBcDQotICAgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNM19DSDQpIHx8ICAgICAgICAgIFwNCi0gICAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU00X0NINCkgfHwgICAgICAgICAgXA0KLSAgICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTIwX0NIMikgfHwgICAgICAgICBcDQotICAgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMjBfQ0gzKSB8fCAgICAgICAgIFwNCi0gICAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9FWFRJX0xJTkUxMSkpKSB8fCAgICAgXA0KLSAgICgoKF9fQURDX0lOU1RBTkNFX18pID09IEFEQzMpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICgoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMl9DSDEpIHx8ICAgICAgICAgIFwNCi0gICAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0yX0NIMykgfHwgICAgICAgICAgXA0KLSAgICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTNfQ0gxKSB8fCAgICAgICAgICBcDQotICAgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNNF9DSDEpIHx8ICAgICAgICAgIFwNCi0gICAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU04X0NIMSkgfHwgICAgICAgICAgXA0KLSAgICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX0VYVElfTElORTIpKSkpDQotI2VuZGlmDQotDQotI2RlZmluZSBJU19MTF9BRENfUkVHX0NPTlRJTlVPVVNfTU9ERShfX1JFR19DT05USU5VT1VTX01PREVfXykgXA0KLSAgKCgoX19SRUdfQ09OVElOVU9VU19NT0RFX18pID09IExMX0FEQ19SRUdfQ09OVl9TSU5HTEUpIHx8ICAgIFwNCi0gICAoKF9fUkVHX0NPTlRJTlVPVVNfTU9ERV9fKSA9PSBMTF9BRENfUkVHX0NPTlZfQ09OVElOVU9VUykpDQotDQotI2RlZmluZSBJU19MTF9BRENfUkVHX0RNQV9UUkFOU0ZFUihfX1JFR19ETUFfVFJBTlNGRVJfXykgICAgICAgICAgXA0KLSAgKCgoX19SRUdfRE1BX1RSQU5TRkVSX18pID09IExMX0FEQ19SRUdfRE1BX1RSQU5TRkVSX05PTkUpIHx8ICAgIFwNCi0gICAoKF9fUkVHX0RNQV9UUkFOU0ZFUl9fKSA9PSBMTF9BRENfUkVHX0RNQV9UUkFOU0ZFUl9MSU1JVEVEKSB8fCBcDQotICAgKChfX1JFR19ETUFfVFJBTlNGRVJfXykgPT0gTExfQURDX1JFR19ETUFfVFJBTlNGRVJfVU5MSU1JVEVEKSkNCi0NCi0jZGVmaW5lIElTX0xMX0FEQ19SRUdfT1ZSX0RBVEFfQkVIQVZJT1IoX19SRUdfT1ZSX0RBVEFfQkVIQVZJT1JfXykgICBcDQotICAoKChfX1JFR19PVlJfREFUQV9CRUhBVklPUl9fKSA9PSBMTF9BRENfUkVHX09WUl9EQVRBX1BSRVNFUlZFRCkgfHwgXA0KLSAgICgoX19SRUdfT1ZSX0RBVEFfQkVIQVZJT1JfXykgPT0gTExfQURDX1JFR19PVlJfREFUQV9PVkVSV1JJVFRFTikpDQotDQotI2RlZmluZSBJU19MTF9BRENfUkVHX1NFUV9TQ0FOX0xFTkdUSChfX1JFR19TRVFfU0NBTl9MRU5HVEhfXykgICAgICAgICAgXA0KLSAgKCgoX19SRUdfU0VRX1NDQU5fTEVOR1RIX18pID09IExMX0FEQ19SRUdfU0VRX1NDQU5fRElTQUJMRSkgfHwgICAgICAgIFwNCi0gICAoKF9fUkVHX1NFUV9TQ0FOX0xFTkdUSF9fKSA9PSBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV8yUkFOS1MpIHx8ICBcDQotICAgKChfX1JFR19TRVFfU0NBTl9MRU5HVEhfXykgPT0gTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfM1JBTktTKSB8fCAgXA0KLSAgICgoX19SRUdfU0VRX1NDQU5fTEVOR1RIX18pID09IExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzRSQU5LUykgfHwgIFwNCi0gICAoKF9fUkVHX1NFUV9TQ0FOX0xFTkdUSF9fKSA9PSBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV81UkFOS1MpIHx8ICBcDQotICAgKChfX1JFR19TRVFfU0NBTl9MRU5HVEhfXykgPT0gTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfNlJBTktTKSB8fCAgXA0KLSAgICgoX19SRUdfU0VRX1NDQU5fTEVOR1RIX18pID09IExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzdSQU5LUykgfHwgIFwNCi0gICAoKF9fUkVHX1NFUV9TQ0FOX0xFTkdUSF9fKSA9PSBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV84UkFOS1MpIHx8ICBcDQotICAgKChfX1JFR19TRVFfU0NBTl9MRU5HVEhfXykgPT0gTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfOVJBTktTKSB8fCAgXA0KLSAgICgoX19SRUdfU0VRX1NDQU5fTEVOR1RIX18pID09IExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzEwUkFOS1MpIHx8IFwNCi0gICAoKF9fUkVHX1NFUV9TQ0FOX0xFTkdUSF9fKSA9PSBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV8xMVJBTktTKSB8fCBcDQotICAgKChfX1JFR19TRVFfU0NBTl9MRU5HVEhfXykgPT0gTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMTJSQU5LUykgfHwgXA0KLSAgICgoX19SRUdfU0VRX1NDQU5fTEVOR1RIX18pID09IExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzEzUkFOS1MpIHx8IFwNCi0gICAoKF9fUkVHX1NFUV9TQ0FOX0xFTkdUSF9fKSA9PSBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV8xNFJBTktTKSB8fCBcDQotICAgKChfX1JFR19TRVFfU0NBTl9MRU5HVEhfXykgPT0gTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMTVSQU5LUykgfHwgXA0KLSAgICgoX19SRUdfU0VRX1NDQU5fTEVOR1RIX18pID09IExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzE2UkFOS1MpKQ0KLQ0KLSNkZWZpbmUgSVNfTExfQURDX1JFR19TRVFfU0NBTl9ESVNDT05UX01PREUoX19SRUdfU0VRX0RJU0NPTlRfTU9ERV9fKSBcDQotICAoKChfX1JFR19TRVFfRElTQ09OVF9NT0RFX18pID09IExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfRElTQUJMRSkgfHwgIFwNCi0gICAoKF9fUkVHX1NFUV9ESVNDT05UX01PREVfXykgPT0gTExfQURDX1JFR19TRVFfRElTQ09OVF8xUkFOSykgfHwgICAgXA0KLSAgICgoX19SRUdfU0VRX0RJU0NPTlRfTU9ERV9fKSA9PSBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzJSQU5LUykgfHwgICBcDQotICAgKChfX1JFR19TRVFfRElTQ09OVF9NT0RFX18pID09IExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfM1JBTktTKSB8fCAgIFwNCi0gICAoKF9fUkVHX1NFUV9ESVNDT05UX01PREVfXykgPT0gTExfQURDX1JFR19TRVFfRElTQ09OVF80UkFOS1MpIHx8ICAgXA0KLSAgICgoX19SRUdfU0VRX0RJU0NPTlRfTU9ERV9fKSA9PSBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzVSQU5LUykgfHwgICBcDQotICAgKChfX1JFR19TRVFfRElTQ09OVF9NT0RFX18pID09IExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfNlJBTktTKSB8fCAgIFwNCi0gICAoKF9fUkVHX1NFUV9ESVNDT05UX01PREVfXykgPT0gTExfQURDX1JFR19TRVFfRElTQ09OVF83UkFOS1MpIHx8ICAgXA0KLSAgICgoX19SRUdfU0VRX0RJU0NPTlRfTU9ERV9fKSA9PSBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzhSQU5LUykpDQotDQotLyogQ2hlY2sgb2YgcGFyYW1ldGVycyBmb3IgY29uZmlndXJhdGlvbiBvZiBBREMgaGllcmFyY2hpY2FsIHNjb3BlOiAgICAgICAgICAgKi8NCi0vKiBBREMgZ3JvdXAgaW5qZWN0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNpZiBkZWZpbmVkKFNUTTMyRzQ3NHh4KSB8fCBkZWZpbmVkKFNUTTMyRzQ4NHh4KQ0KLSNkZWZpbmUgSVNfTExfQURDX0lOSl9UUklHX1NPVVJDRShfX0FEQ19JTlNUQU5DRV9fLCBfX0lOSl9UUklHX1NPVVJDRV9fKSBcDQotICAoKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfU09GVFdBUkUpIHx8ICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNMV9UUkdPKSB8fCAgICAgICAgICAgXA0KLSAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0xX1RSR08yKSB8fCAgICAgICAgICBcDQotICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTFfQ0g0KSB8fCAgICAgICAgICAgIFwNCi0gICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNMl9UUkdPKSB8fCAgICAgICAgICAgXA0KLSAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0zX1RSR08pIHx8ICAgICAgICAgICBcDQotICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTRfVFJHTykgfHwgICAgICAgICAgIFwNCi0gICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNNl9UUkdPKSB8fCAgICAgICAgICAgXA0KLSAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU03X1RSR08pIHx8ICAgICAgICAgICBcDQotICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTThfVFJHTykgfHwgICAgICAgICAgIFwNCi0gICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNOF9UUkdPMikgfHwgICAgICAgICAgXA0KLSAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU04X0NINCkgfHwgICAgICAgICAgICBcDQotICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTE1X1RSR08pIHx8ICAgICAgICAgIFwNCi0gICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNMjBfVFJHTykgfHwgICAgICAgICAgXA0KLSAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0yMF9UUkdPMikgfHwgICAgICAgICBcDQotICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX0hSVElNX1RSRzIpIHx8ICAgICAgICAgIFwNCi0gICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfSFJUSU1fVFJHNCkgfHwgICAgICAgICAgXA0KLSAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9IUlRJTV9UUkc1KSB8fCAgICAgICAgICBcDQotICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX0hSVElNX1RSRzYpIHx8ICAgICAgICAgIFwNCi0gICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfSFJUSU1fVFJHNykgfHwgICAgICAgICAgXA0KLSAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9IUlRJTV9UUkc4KSB8fCAgICAgICAgICBcDQotICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX0hSVElNX1RSRzkpIHx8ICAgICAgICAgIFwNCi0gICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfSFJUSU1fVFJHMTApIHx8ICAgICAgICAgXA0KLSAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9MUFRJTV9PVVQpIHx8ICAgICAgICAgICBcDQotICAgKCgoKF9fQURDX0lOU1RBTkNFX18pID09IEFEQzEpIHx8ICgoX19BRENfSU5TVEFOQ0VfXykgPT0gQURDMikpICYmICAgIFwNCi0gICAgKCgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0yX0NIMSkgfHwgICAgICAgICAgXA0KLSAgICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTNfQ0gxKSB8fCAgICAgICAgICBcDQotICAgICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNM19DSDMpIHx8ICAgICAgICAgIFwNCi0gICAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0zX0NINCkgfHwgICAgICAgICAgXA0KLSAgICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTE2X0NIMSkgfHwgICAgICAgICBcDQotICAgICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNMjBfQ0g0KSB8fCAgICAgICAgIFwNCi0gICAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9FWFRJX0xJTkUxNSkpKSB8fCAgICAgXA0KLSAgICgoKChfX0FEQ19JTlNUQU5DRV9fKSA9PSBBREMzKSB8fCAoKF9fQURDX0lOU1RBTkNFX18pID09IEFEQzQpIHx8ICAgICBcDQotICAgICAoKF9fQURDX0lOU1RBTkNFX18pID09IEFEQzUpKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgKCgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0xX0NIMykgfHwgICAgICAgICAgXA0KLSAgICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTRfQ0gzKSB8fCAgICAgICAgICBcDQotICAgICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNNF9DSDQpIHx8ICAgICAgICAgIFwNCi0gICAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU04X0NIMikgfHwgICAgICAgICAgXA0KLSAgICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTIwX0NIMikgfHwgICAgICAgICBcDQotICAgICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfSFJUSU1fVFJHMSkgfHwgICAgICAgIFwNCi0gICAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9IUlRJTV9UUkczKSB8fCAgICAgICAgXA0KLSAgICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX0VYVElfTElORTMpKSkpDQotI2VsaWYgZGVmaW5lZChTVE0zMkc0NzN4eCkgfHwgZGVmaW5lZChTVE0zMkc0ODN4eCkNCi0jZGVmaW5lIElTX0xMX0FEQ19JTkpfVFJJR19TT1VSQ0UoX19BRENfSU5TVEFOQ0VfXywgX19JTkpfVFJJR19TT1VSQ0VfXykgXA0KLSAgKCgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX1NPRlRXQVJFKSB8fCAgICAgICAgICAgICAgICBcDQotICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTFfVFJHTykgfHwgICAgICAgICAgIFwNCi0gICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNMV9UUkdPMikgfHwgICAgICAgICAgXA0KLSAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0xX0NINCkgfHwgICAgICAgICAgICBcDQotICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTJfVFJHTykgfHwgICAgICAgICAgIFwNCi0gICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNM19UUkdPKSB8fCAgICAgICAgICAgXA0KLSAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU00X1RSR08pIHx8ICAgICAgICAgICBcDQotICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTZfVFJHTykgfHwgICAgICAgICAgIFwNCi0gICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNN19UUkdPKSB8fCAgICAgICAgICAgXA0KLSAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU04X1RSR08pIHx8ICAgICAgICAgICBcDQotICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTThfVFJHTzIpIHx8ICAgICAgICAgIFwNCi0gICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNOF9DSDQpIHx8ICAgICAgICAgICAgXA0KLSAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0xNV9UUkdPKSB8fCAgICAgICAgICBcDQotICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTIwX1RSR08pIHx8ICAgICAgICAgIFwNCi0gICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNMjBfVFJHTzIpIHx8ICAgICAgICAgXA0KLSAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9MUFRJTV9PVVQpIHx8ICAgICAgICAgICBcDQotICAgKCgoKF9fQURDX0lOU1RBTkNFX18pID09IEFEQzEpIHx8ICgoX19BRENfSU5TVEFOQ0VfXykgPT0gQURDMikpICYmICAgIFwNCi0gICAgKCgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0yX0NIMSkgfHwgICAgICAgICAgXA0KLSAgICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTNfQ0gxKSB8fCAgICAgICAgICBcDQotICAgICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNM19DSDMpIHx8ICAgICAgICAgIFwNCi0gICAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0zX0NINCkgfHwgICAgICAgICAgXA0KLSAgICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTE2X0NIMSkgfHwgICAgICAgICBcDQotICAgICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNMjBfQ0g0KSB8fCAgICAgICAgIFwNCi0gICAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9FWFRJX0xJTkUxNSkpKSB8fCAgICAgXA0KLSAgICgoKChfX0FEQ19JTlNUQU5DRV9fKSA9PSBBREMzKSB8fCAoKF9fQURDX0lOU1RBTkNFX18pID09IEFEQzQpIHx8ICAgICBcDQotICAgICAoKF9fQURDX0lOU1RBTkNFX18pID09IEFEQzUpKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgKCgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0xX0NIMykgfHwgICAgICAgICAgXA0KLSAgICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTRfQ0gzKSB8fCAgICAgICAgICBcDQotICAgICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNNF9DSDQpIHx8ICAgICAgICAgIFwNCi0gICAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU04X0NIMikgfHwgICAgICAgICAgXA0KLSAgICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTIwX0NIMikgfHwgICAgICAgICBcDQotICAgICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfRVhUSV9MSU5FMykpKSkNCi0jZWxpZiBkZWZpbmVkKFNUTTMyRzQ3MXh4KQ0KLSNkZWZpbmUgSVNfTExfQURDX0lOSl9UUklHX1NPVVJDRShfX0FEQ19JTlNUQU5DRV9fLCBfX0lOSl9UUklHX1NPVVJDRV9fKSBcDQotICAoKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfU09GVFdBUkUpIHx8ICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNMV9UUkdPKSB8fCAgICAgICAgICAgXA0KLSAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0xX1RSR08yKSB8fCAgICAgICAgICBcDQotICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTFfQ0g0KSB8fCAgICAgICAgICAgIFwNCi0gICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNMl9UUkdPKSB8fCAgICAgICAgICAgXA0KLSAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0zX1RSR08pIHx8ICAgICAgICAgICBcDQotICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTRfVFJHTykgfHwgICAgICAgICAgIFwNCi0gICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNNl9UUkdPKSB8fCAgICAgICAgICAgXA0KLSAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU03X1RSR08pIHx8ICAgICAgICAgICBcDQotICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTThfVFJHTykgfHwgICAgICAgICAgIFwNCi0gICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNOF9UUkdPMikgfHwgICAgICAgICAgXA0KLSAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU04X0NINCkgfHwgICAgICAgICAgICBcDQotICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTE1X1RSR08pIHx8ICAgICAgICAgIFwNCi0gICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfTFBUSU1fT1VUKSB8fCAgICAgICAgICAgXA0KLSAgICgoKChfX0FEQ19JTlNUQU5DRV9fKSA9PSBBREMxKSB8fCAoKF9fQURDX0lOU1RBTkNFX18pID09IEFEQzIpKSAmJiAgICBcDQotICAgICgoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNMl9DSDEpIHx8ICAgICAgICAgIFwNCi0gICAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0zX0NIMSkgfHwgICAgICAgICAgXA0KLSAgICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTNfQ0gzKSB8fCAgICAgICAgICBcDQotICAgICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNM19DSDQpIHx8ICAgICAgICAgIFwNCi0gICAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0xNl9DSDEpIHx8ICAgICAgICAgXA0KLSAgICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX0VYVElfTElORTE1KSkpIHx8ICAgICBcDQotICAgKCgoKF9fQURDX0lOU1RBTkNFX18pID09IEFEQzMpKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgKCgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0xX0NIMykgfHwgICAgICAgICAgXA0KLSAgICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTRfQ0gzKSB8fCAgICAgICAgICBcDQotICAgICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNNF9DSDQpIHx8ICAgICAgICAgIFwNCi0gICAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU04X0NIMikgfHwgICAgICAgICAgXA0KLSAgICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX0VYVElfTElORTMpKSkpDQotI2VsaWYgZGVmaW5lZChTVE0zMkdCSzFDQikgfHwgZGVmaW5lZChTVE0zMkc0MzF4eCkgfHwgZGVmaW5lZChTVE0zMkc0NDF4eCkNCi0jZGVmaW5lIElTX0xMX0FEQ19JTkpfVFJJR19TT1VSQ0UoX19BRENfSU5TVEFOQ0VfXywgX19JTkpfVFJJR19TT1VSQ0VfXykgXA0KLSAgKCgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX1NPRlRXQVJFKSB8fCAgICAgICAgICAgICAgICBcDQotICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTFfVFJHTykgfHwgICAgICAgICAgIFwNCi0gICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNMV9UUkdPMikgfHwgICAgICAgICAgXA0KLSAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0xX0NINCkgfHwgICAgICAgICAgICBcDQotICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTJfVFJHTykgfHwgICAgICAgICAgIFwNCi0gICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNMl9DSDEpIHx8ICAgICAgICAgICAgXA0KLSAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0zX1RSR08pIHx8ICAgICAgICAgICBcDQotICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTNfQ0gxKSB8fCAgICAgICAgICAgIFwNCi0gICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNM19DSDMpIHx8ICAgICAgICAgICAgXA0KLSAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0zX0NINCkgfHwgICAgICAgICAgICBcDQotICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTRfVFJHTykgfHwgICAgICAgICAgIFwNCi0gICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNNl9UUkdPKSB8fCAgICAgICAgICAgXA0KLSAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU03X1RSR08pIHx8ICAgICAgICAgICBcDQotICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTThfVFJHTykgfHwgICAgICAgICAgIFwNCi0gICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNOF9UUkdPMikgfHwgICAgICAgICAgXA0KLSAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU04X0NINCkgfHwgICAgICAgICAgICBcDQotICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTE1X1RSR08pIHx8ICAgICAgICAgIFwNCi0gICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNMTZfQ0gxKSB8fCAgICAgICAgICAgXA0KLSAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9MUFRJTV9PVVQpIHx8ICAgICAgICAgICBcDQotICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX0VYVElfTElORTE1KSkNCi0jZWxpZiBkZWZpbmVkKFNUTTMyRzQ5MXh4KSB8fCBkZWZpbmVkKFNUTTMyRzRBMXh4KQ0KLSNkZWZpbmUgSVNfTExfQURDX0lOSl9UUklHX1NPVVJDRShfX0FEQ19JTlNUQU5DRV9fLCBfX0lOSl9UUklHX1NPVVJDRV9fKSBcDQotICAoKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfU09GVFdBUkUpIHx8ICAgICAgICAgICAgICAgIFwNCi0gICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNMV9UUkdPKSB8fCAgICAgICAgICAgXA0KLSAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0xX1RSR08yKSB8fCAgICAgICAgICBcDQotICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTFfQ0g0KSB8fCAgICAgICAgICAgIFwNCi0gICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNMl9UUkdPKSB8fCAgICAgICAgICAgXA0KLSAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0zX1RSR08pIHx8ICAgICAgICAgICBcDQotICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTRfVFJHTykgfHwgICAgICAgICAgIFwNCi0gICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNNl9UUkdPKSB8fCAgICAgICAgICAgXA0KLSAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU03X1RSR08pIHx8ICAgICAgICAgICBcDQotICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTThfVFJHTykgfHwgICAgICAgICAgIFwNCi0gICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNOF9UUkdPMikgfHwgICAgICAgICAgXA0KLSAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU04X0NINCkgfHwgICAgICAgICAgICBcDQotICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTE1X1RSR08pIHx8ICAgICAgICAgIFwNCi0gICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNMjBfVFJHTykgfHwgICAgICAgICAgXA0KLSAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0yMF9UUkdPMikgfHwgICAgICAgICBcDQotICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX0xQVElNX09VVCkgfHwgICAgICAgICAgIFwNCi0gICAoKCgoX19BRENfSU5TVEFOQ0VfXykgPT0gQURDMSkgfHwgKChfX0FEQ19JTlNUQU5DRV9fKSA9PSBBREMyKSkgJiYgICAgXA0KLSAgICAoKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTJfQ0gxKSB8fCAgICAgICAgICBcDQotICAgICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNM19DSDEpIHx8ICAgICAgICAgIFwNCi0gICAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0zX0NIMykgfHwgICAgICAgICAgXA0KLSAgICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTNfQ0g0KSB8fCAgICAgICAgICBcDQotICAgICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNMTZfQ0gxKSB8fCAgICAgICAgIFwNCi0gICAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0yMF9DSDQpIHx8ICAgICAgICAgXA0KLSAgICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX0VYVElfTElORTE1KSkpIHx8ICAgICBcDQotICAgKCgoKF9fQURDX0lOU1RBTkNFX18pID09IEFEQzMpKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgKCgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0xX0NIMykgfHwgICAgICAgICAgXA0KLSAgICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTRfQ0gzKSB8fCAgICAgICAgICBcDQotICAgICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNNF9DSDQpIHx8ICAgICAgICAgIFwNCi0gICAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU04X0NIMikgfHwgICAgICAgICAgXA0KLSAgICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTIwX0NIMikgfHwgICAgICAgICBcDQotICAgICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfRVhUSV9MSU5FMykpKSkNCi0jZW5kaWYNCi0NCi0jZGVmaW5lIElTX0xMX0FEQ19JTkpfVFJJR19FWFRfRURHRShfX0lOSl9UUklHX0VYVF9FREdFX18pICAgICBcDQotICAoKChfX0lOSl9UUklHX0VYVF9FREdFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfUklTSU5HKSB8fCAgXA0KLSAgICgoX19JTkpfVFJJR19FWFRfRURHRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX0ZBTExJTkcpIHx8IFwNCi0gICAoKF9fSU5KX1RSSUdfRVhUX0VER0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9SSVNJTkdGQUxMSU5HKSkNCi0NCi0jZGVmaW5lIElTX0xMX0FEQ19JTkpfVFJJR19BVVRPKF9fSU5KX1RSSUdfQVVUT19fKSAgICAgICAgIFwNCi0gICgoKF9fSU5KX1RSSUdfQVVUT19fKSA9PSBMTF9BRENfSU5KX1RSSUdfSU5ERVBFTkRFTlQpIHx8IFwNCi0gICAoKF9fSU5KX1RSSUdfQVVUT19fKSA9PSBMTF9BRENfSU5KX1RSSUdfRlJPTV9HUlBfUkVHVUxBUikpDQotDQotI2RlZmluZSBJU19MTF9BRENfSU5KX1NFUV9TQ0FOX0xFTkdUSChfX0lOSl9TRVFfU0NBTl9MRU5HVEhfXykgICAgICAgICBcDQotICAoKChfX0lOSl9TRVFfU0NBTl9MRU5HVEhfXykgPT0gTExfQURDX0lOSl9TRVFfU0NBTl9ESVNBQkxFKSB8fCAgICAgICBcDQotICAgKChfX0lOSl9TRVFfU0NBTl9MRU5HVEhfXykgPT0gTExfQURDX0lOSl9TRVFfU0NBTl9FTkFCTEVfMlJBTktTKSB8fCBcDQotICAgKChfX0lOSl9TRVFfU0NBTl9MRU5HVEhfXykgPT0gTExfQURDX0lOSl9TRVFfU0NBTl9FTkFCTEVfM1JBTktTKSB8fCBcDQotICAgKChfX0lOSl9TRVFfU0NBTl9MRU5HVEhfXykgPT0gTExfQURDX0lOSl9TRVFfU0NBTl9FTkFCTEVfNFJBTktTKSkNCi0NCi0jZGVmaW5lIElTX0xMX0FEQ19JTkpfU0VRX1NDQU5fRElTQ09OVF9NT0RFKF9fSU5KX1NFUV9ESVNDT05UX01PREVfXykgXA0KLSAgKCgoX19JTkpfU0VRX0RJU0NPTlRfTU9ERV9fKSA9PSBMTF9BRENfSU5KX1NFUV9ESVNDT05UX0RJU0FCTEUpIHx8ICBcDQotICAgKChfX0lOSl9TRVFfRElTQ09OVF9NT0RFX18pID09IExMX0FEQ19JTkpfU0VRX0RJU0NPTlRfMVJBTkspKQ0KLQ0KLSNpZiBkZWZpbmVkKEFEQ19NVUxUSU1PREVfU1VQUE9SVCkNCi0vKiBDaGVjayBvZiBwYXJhbWV0ZXJzIGZvciBjb25maWd1cmF0aW9uIG9mIEFEQyBoaWVyYXJjaGljYWwgc2NvcGU6ICAgICAgICAgICAqLw0KLS8qIG11bHRpbW9kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBJU19MTF9BRENfTVVMVElfTU9ERShfX01VTFRJX01PREVfXykgICAgICAgICAgICAgICAgICBcDQotICAoKChfX01VTFRJX01PREVfXykgPT0gTExfQURDX01VTFRJX0lOREVQRU5ERU5UKSB8fCAgICAgICAgICBcDQotICAgKChfX01VTFRJX01PREVfXykgPT0gTExfQURDX01VTFRJX0RVQUxfUkVHX1NJTVVMVCkgfHwgICAgICBcDQotICAgKChfX01VTFRJX01PREVfXykgPT0gTExfQURDX01VTFRJX0RVQUxfUkVHX0lOVEVSTCkgfHwgICAgICBcDQotICAgKChfX01VTFRJX01PREVfXykgPT0gTExfQURDX01VTFRJX0RVQUxfSU5KX1NJTVVMVCkgfHwgICAgICBcDQotICAgKChfX01VTFRJX01PREVfXykgPT0gTExfQURDX01VTFRJX0RVQUxfSU5KX0FMVEVSTikgfHwgICAgICBcDQotICAgKChfX01VTFRJX01PREVfXykgPT0gTExfQURDX01VTFRJX0RVQUxfUkVHX1NJTV9JTkpfU0lNKSB8fCBcDQotICAgKChfX01VTFRJX01PREVfXykgPT0gTExfQURDX01VTFRJX0RVQUxfUkVHX1NJTV9JTkpfQUxUKSB8fCBcDQotICAgKChfX01VTFRJX01PREVfXykgPT0gTExfQURDX01VTFRJX0RVQUxfUkVHX0lOVF9JTkpfU0lNKSkNCi0NCi0jZGVmaW5lIElTX0xMX0FEQ19NVUxUSV9ETUFfVFJBTlNGRVIoX19NVUxUSV9ETUFfVFJBTlNGRVJfXykgICAgICAgICAgICAgXA0KLSAgKCgoX19NVUxUSV9ETUFfVFJBTlNGRVJfXykgPT0gTExfQURDX01VTFRJX1JFR19ETUFfRUFDSF9BREMpIHx8ICAgICAgICBcDQotICAgKChfX01VTFRJX0RNQV9UUkFOU0ZFUl9fKSA9PSBMTF9BRENfTVVMVElfUkVHX0RNQV9MSU1JVF9SRVMxMl8xMEIpIHx8IFwNCi0gICAoKF9fTVVMVElfRE1BX1RSQU5TRkVSX18pID09IExMX0FEQ19NVUxUSV9SRUdfRE1BX0xJTUlUX1JFUzhfNkIpIHx8ICAgXA0KLSAgICgoX19NVUxUSV9ETUFfVFJBTlNGRVJfXykgPT0gTExfQURDX01VTFRJX1JFR19ETUFfVU5MTVRfUkVTMTJfMTBCKSB8fCBcDQotICAgKChfX01VTFRJX0RNQV9UUkFOU0ZFUl9fKSA9PSBMTF9BRENfTVVMVElfUkVHX0RNQV9VTkxNVF9SRVM4XzZCKSkNCi0NCi0jZGVmaW5lIElTX0xMX0FEQ19NVUxUSV9UV09TTVBfREVMQVkoX19NVUxUSV9UV09TTVBfREVMQVlfXykgICAgICAgICAgIFwNCi0gICgoKF9fTVVMVElfVFdPU01QX0RFTEFZX18pID09IExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfMUNZQ0xFKSB8fCAgIFwNCi0gICAoKF9fTVVMVElfVFdPU01QX0RFTEFZX18pID09IExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfMkNZQ0xFUykgfHwgIFwNCi0gICAoKF9fTVVMVElfVFdPU01QX0RFTEFZX18pID09IExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfM0NZQ0xFUykgfHwgIFwNCi0gICAoKF9fTVVMVElfVFdPU01QX0RFTEFZX18pID09IExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfNENZQ0xFUykgfHwgIFwNCi0gICAoKF9fTVVMVElfVFdPU01QX0RFTEFZX18pID09IExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfNUNZQ0xFUykgfHwgIFwNCi0gICAoKF9fTVVMVElfVFdPU01QX0RFTEFZX18pID09IExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfNkNZQ0xFUykgfHwgIFwNCi0gICAoKF9fTVVMVElfVFdPU01QX0RFTEFZX18pID09IExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfN0NZQ0xFUykgfHwgIFwNCi0gICAoKF9fTVVMVElfVFdPU01QX0RFTEFZX18pID09IExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfOENZQ0xFUykgfHwgIFwNCi0gICAoKF9fTVVMVElfVFdPU01QX0RFTEFZX18pID09IExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfOUNZQ0xFUykgfHwgIFwNCi0gICAoKF9fTVVMVElfVFdPU01QX0RFTEFZX18pID09IExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfMTBDWUNMRVMpIHx8IFwNCi0gICAoKF9fTVVMVElfVFdPU01QX0RFTEFZX18pID09IExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfMTFDWUNMRVMpIHx8IFwNCi0gICAoKF9fTVVMVElfVFdPU01QX0RFTEFZX18pID09IExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfMTJDWUNMRVMpKQ0KLQ0KLSNkZWZpbmUgSVNfTExfQURDX01VTFRJX01BU1RFUl9TTEFWRShfX01VTFRJX01BU1RFUl9TTEFWRV9fKSBcDQotICAoKChfX01VTFRJX01BU1RFUl9TTEFWRV9fKSA9PSBMTF9BRENfTVVMVElfTUFTVEVSKSB8fCAgICAgIFwNCi0gICAoKF9fTVVMVElfTUFTVEVSX1NMQVZFX18pID09IExMX0FEQ19NVUxUSV9TTEFWRSkgfHwgICAgICAgXA0KLSAgICgoX19NVUxUSV9NQVNURVJfU0xBVkVfXykgPT0gTExfQURDX01VTFRJX01BU1RFUl9TTEFWRSkpDQotDQotI2VuZGlmIC8qIEFEQ19NVUxUSU1PREVfU1VQUE9SVCAqLw0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0NCi0vKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qKiBAYWRkdG9ncm91cCBBRENfTExfRXhwb3J0ZWRfRnVuY3Rpb25zDQotICogQHsNCi0gKi8NCi0NCi0vKiogQGFkZHRvZ3JvdXAgQURDX0xMX0VGX0luaXQNCi0gKiBAew0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGUtaW5pdGlhbGl6ZSByZWdpc3RlcnMgb2YgYWxsIEFEQyBpbnN0YW5jZXMgYmVsb25naW5nIHRvDQotICogICAgICAgICB0aGUgc2FtZSBBREMgY29tbW9uIGluc3RhbmNlIHRvIHRoZWlyIGRlZmF1bHQgcmVzZXQgdmFsdWVzLg0KLSAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBpcyBwZXJmb3JtaW5nIGEgaGFyZCByZXNldCwgdXNpbmcgaGlnaCBsZXZlbA0KLSAqICAgICAgICAgY2xvY2sgc291cmNlIFJDQyBBREMgcmVzZXQuDQotICogICAgICAgICBDYXV0aW9uOiBPbiB0aGlzIFNUTTMyIHNlcmllcywgaWYgc2V2ZXJhbCBBREMgaW5zdGFuY2VzIGFyZSBhdmFpbGFibGUNCi0gKiAgICAgICAgIG9uIHRoZSBzZWxlY3RlZCBkZXZpY2UsIFJDQyBBREMgcmVzZXQgd2lsbCByZXNldA0KLSAqICAgICAgICAgYWxsIEFEQyBpbnN0YW5jZXMgYmVsb25naW5nIHRvIHRoZSBjb21tb24gQURDIGluc3RhbmNlLg0KLSAqICAgICAgICAgVG8gZGUtaW5pdGlhbGl6ZSBvbmx5IDEgQURDIGluc3RhbmNlLCB1c2UNCi0gKiAgICAgICAgIGZ1bmN0aW9uIEByZWYgTExfQURDX0RlSW5pdCgpLg0KLSAqIEBwYXJhbSAgQURDeHlfQ09NTU9OIEFEQyBjb21tb24gaW5zdGFuY2UNCi0gKiAgICAgICAgIChjYW4gYmUgc2V0IGRpcmVjdGx5IGZyb20gQ01TSVMgZGVmaW5pdGlvbiBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8NCi0gKiBAcmVmIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRSgpICkNCi0gKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOg0KLSAqICAgICAgICAgIC0gU1VDQ0VTUzogQURDIGNvbW1vbiByZWdpc3RlcnMgYXJlIGRlLWluaXRpYWxpemVkDQotICogICAgICAgICAgLSBFUlJPUjogbm90IGFwcGxpY2FibGUNCi0gKi8NCi1FcnJvclN0YXR1cyBMTF9BRENfQ29tbW9uRGVJbml0KEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OKSB7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0FEQ19DT01NT05fSU5TVEFOQ0UoQURDeHlfQ09NTU9OKSk7DQotDQotICBpZiAoQURDeHlfQ09NTU9OID09IEFEQzEyX0NPTU1PTikgew0KLSAgICAvKiBGb3JjZSByZXNldCBvZiBBREMgY2xvY2sgKGNvcmUgY2xvY2spICovDQotICAgIExMX0FIQjJfR1JQMV9Gb3JjZVJlc2V0KExMX0FIQjJfR1JQMV9QRVJJUEhfQURDMTIpOw0KLQ0KLSAgICAvKiBSZWxlYXNlIHJlc2V0IG9mIEFEQyBjbG9jayAoY29yZSBjbG9jaykgKi8NCi0gICAgTExfQUhCMl9HUlAxX1JlbGVhc2VSZXNldChMTF9BSEIyX0dSUDFfUEVSSVBIX0FEQzEyKTsNCi0gIH0NCi0jaWYgZGVmaW5lZChBREMzNDVfQ09NTU9OKQ0KLSAgZWxzZSB7DQotICAgIC8qIEZvcmNlIHJlc2V0IG9mIEFEQyBjbG9jayAoY29yZSBjbG9jaykgKi8NCi0gICAgTExfQUhCMl9HUlAxX0ZvcmNlUmVzZXQoTExfQUhCMl9HUlAxX1BFUklQSF9BREMzNDUpOw0KLQ0KLSAgICAvKiBSZWxlYXNlIHJlc2V0IG9mIEFEQyBjbG9jayAoY29yZSBjbG9jaykgKi8NCi0gICAgTExfQUhCMl9HUlAxX1JlbGVhc2VSZXNldChMTF9BSEIyX0dSUDFfUEVSSVBIX0FEQzM0NSk7DQotICB9DQotI2VuZGlmDQotDQotICByZXR1cm4gU1VDQ0VTUzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBJbml0aWFsaXplIHNvbWUgZmVhdHVyZXMgb2YgQURDIGNvbW1vbiBwYXJhbWV0ZXJzDQotICogICAgICAgICAoYWxsIEFEQyBpbnN0YW5jZXMgYmVsb25naW5nIHRvIHRoZSBzYW1lIEFEQyBjb21tb24gaW5zdGFuY2UpDQotICogICAgICAgICBhbmQgbXVsdGltb2RlIChmb3IgZGV2aWNlcyB3aXRoIHNldmVyYWwgQURDIGluc3RhbmNlcyBhdmFpbGFibGUpLg0KLSAqIEBub3RlICAgVGhlIHNldHRpbmcgb2YgQURDIGNvbW1vbiBwYXJhbWV0ZXJzIGlzIGNvbmRpdGlvbmVkIHRvDQotICogICAgICAgICBBREMgaW5zdGFuY2VzIHN0YXRlOg0KLSAqICAgICAgICAgQWxsIEFEQyBpbnN0YW5jZXMgYmVsb25naW5nIHRvIHRoZSBzYW1lIEFEQyBjb21tb24gaW5zdGFuY2UNCi0gKiAgICAgICAgIG11c3QgYmUgZGlzYWJsZWQuDQotICogQHBhcmFtICBBREN4eV9DT01NT04gQURDIGNvbW1vbiBpbnN0YW5jZQ0KLSAqICAgICAgICAgKGNhbiBiZSBzZXQgZGlyZWN0bHkgZnJvbSBDTVNJUyBkZWZpbml0aW9uIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybw0KLSAqIEByZWYgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKCkgKQ0KLSAqIEBwYXJhbSAgQURDX0NvbW1vbkluaXRTdHJ1Y3QgUG9pbnRlciB0byBhIEByZWYgTExfQURDX0NvbW1vbkluaXRUeXBlRGVmDQotICogc3RydWN0dXJlDQotICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToNCi0gKiAgICAgICAgICAtIFNVQ0NFU1M6IEFEQyBjb21tb24gcmVnaXN0ZXJzIGFyZSBpbml0aWFsaXplZA0KLSAqICAgICAgICAgIC0gRVJST1I6IEFEQyBjb21tb24gcmVnaXN0ZXJzIGFyZSBub3QgaW5pdGlhbGl6ZWQNCi0gKi8NCi1FcnJvclN0YXR1cyBMTF9BRENfQ29tbW9uSW5pdChBRENfQ29tbW9uX1R5cGVEZWYgKkFEQ3h5X0NPTU1PTiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTF9BRENfQ29tbW9uSW5pdFR5cGVEZWYgKkFEQ19Db21tb25Jbml0U3RydWN0KSB7DQotICBFcnJvclN0YXR1cyBzdGF0dXMgPSBTVUNDRVNTOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19BRENfQ09NTU9OX0lOU1RBTkNFKEFEQ3h5X0NPTU1PTikpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0xMX0FEQ19DT01NT05fQ0xPQ0soQURDX0NvbW1vbkluaXRTdHJ1Y3QtPkNvbW1vbkNsb2NrKSk7DQotDQotI2lmIGRlZmluZWQoQURDX01VTFRJTU9ERV9TVVBQT1JUKQ0KLSAgYXNzZXJ0X3BhcmFtKElTX0xMX0FEQ19NVUxUSV9NT0RFKEFEQ19Db21tb25Jbml0U3RydWN0LT5NdWx0aW1vZGUpKTsNCi0gIGlmIChBRENfQ29tbW9uSW5pdFN0cnVjdC0+TXVsdGltb2RlICE9IExMX0FEQ19NVUxUSV9JTkRFUEVOREVOVCkgew0KLSAgICBhc3NlcnRfcGFyYW0oDQotICAgICAgICBJU19MTF9BRENfTVVMVElfRE1BX1RSQU5TRkVSKEFEQ19Db21tb25Jbml0U3RydWN0LT5NdWx0aURNQVRyYW5zZmVyKSk7DQotICAgIGFzc2VydF9wYXJhbShJU19MTF9BRENfTVVMVElfVFdPU01QX0RFTEFZKA0KLSAgICAgICAgQURDX0NvbW1vbkluaXRTdHJ1Y3QtPk11bHRpVHdvU2FtcGxpbmdEZWxheSkpOw0KLSAgfQ0KLSNlbmRpZiAvKiBBRENfTVVMVElNT0RFX1NVUFBPUlQgKi8NCi0NCi0gIC8qIE5vdGU6IEhhcmR3YXJlIGNvbnN0cmFpbnQgKHJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIGZ1bmN0aW9ucyAgICAgICAgICAgICAqLw0KLSAgLyogICAgICAgIkxMX0FEQ19TZXRDb21tb25YWFgoKSIgYW5kICJMTF9BRENfU2V0TXVsdGlYWFgoKSIpOiAgICAgICAgICAgICAgICovDQotICAvKiAgICAgICBPbiB0aGlzIFNUTTMyIHNlcmllcywgc2V0dGluZyBvZiB0aGVzZSBmZWF0dXJlcyBpcyBjb25kaXRpb25lZCB0byAgKi8NCi0gIC8qICAgICAgIEFEQyBzdGF0ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgLyogICAgICAgQWxsIEFEQyBpbnN0YW5jZXMgb2YgdGhlIEFEQyBjb21tb24gZ3JvdXAgbXVzdCBiZSBkaXNhYmxlZC4gICAgICAgICovDQotICBpZiAoX19MTF9BRENfSVNfRU5BQkxFRF9BTExfQ09NTU9OX0lOU1RBTkNFKEFEQ3h5X0NPTU1PTikgPT0gMFVMKSB7DQotICAgIC8qIENvbmZpZ3VyYXRpb24gb2YgQURDIGhpZXJhcmNoaWNhbCBzY29wZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgLyogIC0gY29tbW9uIHRvIHNldmVyYWwgQURDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICAvKiAgICAoYWxsIEFEQyBpbnN0YW5jZXMgYmVsb25naW5nIHRvIHRoZSBzYW1lIEFEQyBjb21tb24gaW5zdGFuY2UpICAgICAgICovDQotICAgIC8qICAgIC0gU2V0IEFEQyBjbG9jayAoY29udmVyc2lvbiBjbG9jaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgLyogIC0gbXVsdGltb2RlIChpZiBzZXZlcmFsIEFEQyBpbnN0YW5jZXMgYXZhaWxhYmxlIG9uIHRoZSAgICAgICAgICAgICAgICAqLw0KLSAgICAvKiAgICBzZWxlY3RlZCBkZXZpY2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIC8qICAgIC0gU2V0IEFEQyBtdWx0aW1vZGUgY29uZmlndXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgLyogICAgLSBTZXQgQURDIG11bHRpbW9kZSBETUEgdHJhbnNmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICAvKiAgICAtIFNldCBBREMgbXVsdGltb2RlOiBkZWxheSBiZXR3ZWVuIDIgc2FtcGxpbmcgcGhhc2VzICAgICAgICAgICAgICAgICovDQotI2lmIGRlZmluZWQoQURDX01VTFRJTU9ERV9TVVBQT1JUKQ0KLSAgICBpZiAoQURDX0NvbW1vbkluaXRTdHJ1Y3QtPk11bHRpbW9kZSAhPSBMTF9BRENfTVVMVElfSU5ERVBFTkRFTlQpIHsNCi0gICAgICBNT0RJRllfUkVHKEFEQ3h5X0NPTU1PTi0+Q0NSLA0KLSAgICAgICAgICAgICAgICAgQURDX0NDUl9DS01PREUgfCBBRENfQ0NSX1BSRVNDIHwgQURDX0NDUl9EVUFMIHwgQURDX0NDUl9NRE1BIHwNCi0gICAgICAgICAgICAgICAgICAgICBBRENfQ0NSX0RFTEFZLA0KLSAgICAgICAgICAgICAgICAgQURDX0NvbW1vbkluaXRTdHJ1Y3QtPkNvbW1vbkNsb2NrIHwNCi0gICAgICAgICAgICAgICAgICAgICBBRENfQ29tbW9uSW5pdFN0cnVjdC0+TXVsdGltb2RlIHwNCi0gICAgICAgICAgICAgICAgICAgICBBRENfQ29tbW9uSW5pdFN0cnVjdC0+TXVsdGlETUFUcmFuc2ZlciB8DQotICAgICAgICAgICAgICAgICAgICAgQURDX0NvbW1vbkluaXRTdHJ1Y3QtPk11bHRpVHdvU2FtcGxpbmdEZWxheSk7DQotICAgIH0gZWxzZSB7DQotICAgICAgTU9ESUZZX1JFRyhBREN4eV9DT01NT04tPkNDUiwNCi0gICAgICAgICAgICAgICAgIEFEQ19DQ1JfQ0tNT0RFIHwgQURDX0NDUl9QUkVTQyB8IEFEQ19DQ1JfRFVBTCB8IEFEQ19DQ1JfTURNQSB8DQotICAgICAgICAgICAgICAgICAgICAgQURDX0NDUl9ERUxBWSwNCi0gICAgICAgICAgICAgICAgIEFEQ19Db21tb25Jbml0U3RydWN0LT5Db21tb25DbG9jayB8IExMX0FEQ19NVUxUSV9JTkRFUEVOREVOVCk7DQotICAgIH0NCi0jZWxzZQ0KLSAgICBMTF9BRENfU2V0Q29tbW9uQ2xvY2soQURDeHlfQ09NTU9OLCBBRENfQ29tbW9uSW5pdFN0cnVjdC0+Q29tbW9uQ2xvY2spOw0KLSNlbmRpZg0KLSAgfSBlbHNlIHsNCi0gICAgLyogSW5pdGlhbGl6YXRpb24gZXJyb3I6IE9uZSBvciBzZXZlcmFsIEFEQyBpbnN0YW5jZXMgYmVsb25naW5nIHRvICAgICAgICAqLw0KLSAgICAvKiB0aGUgc2FtZSBBREMgY29tbW9uIGluc3RhbmNlIGFyZSBub3QgZGlzYWJsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIHN0YXR1cyA9IEVSUk9SOw0KLSAgfQ0KLQ0KLSAgcmV0dXJuIHN0YXR1czsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBTZXQgZWFjaCBAcmVmIExMX0FEQ19Db21tb25Jbml0VHlwZURlZiBmaWVsZCB0byBkZWZhdWx0IHZhbHVlLg0KLSAqIEBwYXJhbSAgQURDX0NvbW1vbkluaXRTdHJ1Y3QgUG9pbnRlciB0byBhIEByZWYgTExfQURDX0NvbW1vbkluaXRUeXBlRGVmDQotICogc3RydWN0dXJlIHdob3NlIGZpZWxkcyB3aWxsIGJlIHNldCB0byBkZWZhdWx0IHZhbHVlcy4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi12b2lkIExMX0FEQ19Db21tb25TdHJ1Y3RJbml0KExMX0FEQ19Db21tb25Jbml0VHlwZURlZiAqQURDX0NvbW1vbkluaXRTdHJ1Y3QpIHsNCi0gIC8qIFNldCBBRENfQ29tbW9uSW5pdFN0cnVjdCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMgKi8NCi0gIC8qIFNldCBmaWVsZHMgb2YgQURDIGNvbW1vbiAqLw0KLSAgLyogKGFsbCBBREMgaW5zdGFuY2VzIGJlbG9uZ2luZyB0byB0aGUgc2FtZSBBREMgY29tbW9uIGluc3RhbmNlKSAqLw0KLSAgQURDX0NvbW1vbkluaXRTdHJ1Y3QtPkNvbW1vbkNsb2NrID0gTExfQURDX0NMT0NLX1NZTkNfUENMS19ESVYyOw0KLQ0KLSNpZiBkZWZpbmVkKEFEQ19NVUxUSU1PREVfU1VQUE9SVCkNCi0gIC8qIFNldCBmaWVsZHMgb2YgQURDIG11bHRpbW9kZSAqLw0KLSAgQURDX0NvbW1vbkluaXRTdHJ1Y3QtPk11bHRpbW9kZSA9IExMX0FEQ19NVUxUSV9JTkRFUEVOREVOVDsNCi0gIEFEQ19Db21tb25Jbml0U3RydWN0LT5NdWx0aURNQVRyYW5zZmVyID0gTExfQURDX01VTFRJX1JFR19ETUFfRUFDSF9BREM7DQotICBBRENfQ29tbW9uSW5pdFN0cnVjdC0+TXVsdGlUd29TYW1wbGluZ0RlbGF5ID0NCi0gICAgICBMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzFDWUNMRTsNCi0jZW5kaWYgLyogQURDX01VTFRJTU9ERV9TVVBQT1JUICovDQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgRGUtaW5pdGlhbGl6ZSByZWdpc3RlcnMgb2YgdGhlIHNlbGVjdGVkIEFEQyBpbnN0YW5jZQ0KLSAqICAgICAgICAgdG8gdGhlaXIgZGVmYXVsdCByZXNldCB2YWx1ZXMuDQotICogQG5vdGUgICBUbyByZXNldCBhbGwgQURDIGluc3RhbmNlcyBxdWlja2x5IChwZXJmb3JtIGEgaGFyZCByZXNldCksDQotICogICAgICAgICB1c2UgZnVuY3Rpb24gQHJlZiBMTF9BRENfQ29tbW9uRGVJbml0KCkuDQotICogQG5vdGUgICBJZiB0aGlzIGZ1bmN0aW9ucyByZXR1cm5zIGVycm9yIHN0YXR1cywgaXQgbWVhbnMgdGhhdCBBREMgaW5zdGFuY2UNCi0gKiAgICAgICAgIGlzIGluIGFuIHVua25vd24gc3RhdGUuDQotICogICAgICAgICBJbiB0aGlzIGNhc2UsIHBlcmZvcm0gYSBoYXJkIHJlc2V0IHVzaW5nIGhpZ2ggbGV2ZWwNCi0gKiAgICAgICAgIGNsb2NrIHNvdXJjZSBSQ0MgQURDIHJlc2V0Lg0KLSAqICAgICAgICAgQ2F1dGlvbjogT24gdGhpcyBTVE0zMiBzZXJpZXMsIGlmIHNldmVyYWwgQURDIGluc3RhbmNlcyBhcmUgYXZhaWxhYmxlDQotICogICAgICAgICBvbiB0aGUgc2VsZWN0ZWQgZGV2aWNlLCBSQ0MgQURDIHJlc2V0IHdpbGwgcmVzZXQNCi0gKiAgICAgICAgIGFsbCBBREMgaW5zdGFuY2VzIGJlbG9uZ2luZyB0byB0aGUgY29tbW9uIEFEQyBpbnN0YW5jZS4NCi0gKiAgICAgICAgIFJlZmVyIHRvIGZ1bmN0aW9uIEByZWYgTExfQURDX0NvbW1vbkRlSW5pdCgpLg0KLSAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UNCi0gKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOg0KLSAqICAgICAgICAgIC0gU1VDQ0VTUzogQURDIHJlZ2lzdGVycyBhcmUgZGUtaW5pdGlhbGl6ZWQNCi0gKiAgICAgICAgICAtIEVSUk9SOiBBREMgcmVnaXN0ZXJzIGFyZSBub3QgZGUtaW5pdGlhbGl6ZWQNCi0gKi8NCi1FcnJvclN0YXR1cyBMTF9BRENfRGVJbml0KEFEQ19UeXBlRGVmICpBREN4KSB7DQotICBFcnJvclN0YXR1cyBzdGF0dXMgPSBTVUNDRVNTOw0KLQ0KLSAgX19JTyB1aW50MzJfdCB0aW1lb3V0X2NwdV9jeWNsZXMgPSAwVUw7DQotDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoQURDeCkpOw0KLQ0KLSAgLyogRGlzYWJsZSBBREMgaW5zdGFuY2UgaWYgbm90IGFscmVhZHkgZGlzYWJsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICBpZiAoTExfQURDX0lzRW5hYmxlZChBREN4KSA9PSAxVUwpIHsNCi0gICAgLyogU2V0IEFEQyBncm91cCByZWd1bGFyIHRyaWdnZXIgc291cmNlIHRvIFNXIHN0YXJ0IHRvIGVuc3VyZSB0byBub3QgICAgICAqLw0KLSAgICAvKiBoYXZlIGFuIGV4dGVybmFsIHRyaWdnZXIgZXZlbnQgb2NjdXJyaW5nIGR1cmluZyB0aGUgY29udmVyc2lvbiBzdG9wICAgICovDQotICAgIC8qIEFEQyBkaXNhYmxlIHByb2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgTExfQURDX1JFR19TZXRUcmlnZ2VyU291cmNlKEFEQ3gsIExMX0FEQ19SRUdfVFJJR19TT0ZUV0FSRSk7DQotDQotICAgIC8qIFN0b3AgcG90ZW50aWFsIEFEQyBjb252ZXJzaW9uIG9uIGdvaW5nIG9uIEFEQyBncm91cCByZWd1bGFyLiAgICAgICAgICAgKi8NCi0gICAgaWYgKExMX0FEQ19SRUdfSXNDb252ZXJzaW9uT25nb2luZyhBREN4KSAhPSAwVUwpIHsNCi0gICAgICBpZiAoTExfQURDX1JFR19Jc1N0b3BDb252ZXJzaW9uT25nb2luZyhBREN4KSA9PSAwVUwpIHsNCi0gICAgICAgIExMX0FEQ19SRUdfU3RvcENvbnZlcnNpb24oQURDeCk7DQotICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qIFNldCBBREMgZ3JvdXAgaW5qZWN0ZWQgdHJpZ2dlciBzb3VyY2UgdG8gU1cgc3RhcnQgdG8gZW5zdXJlIHRvIG5vdCAgICAgKi8NCi0gICAgLyogaGF2ZSBhbiBleHRlcm5hbCB0cmlnZ2VyIGV2ZW50IG9jY3VycmluZyBkdXJpbmcgdGhlIGNvbnZlcnNpb24gc3RvcCAgICAqLw0KLSAgICAvKiBBREMgZGlzYWJsZSBwcm9jZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIExMX0FEQ19JTkpfU2V0VHJpZ2dlclNvdXJjZShBREN4LCBMTF9BRENfSU5KX1RSSUdfU09GVFdBUkUpOw0KLQ0KLSAgICAvKiBTdG9wIHBvdGVudGlhbCBBREMgY29udmVyc2lvbiBvbiBnb2luZyBvbiBBREMgZ3JvdXAgaW5qZWN0ZWQuICAgICAgICAgICovDQotICAgIGlmIChMTF9BRENfSU5KX0lzQ29udmVyc2lvbk9uZ29pbmcoQURDeCkgIT0gMFVMKSB7DQotICAgICAgaWYgKExMX0FEQ19JTkpfSXNTdG9wQ29udmVyc2lvbk9uZ29pbmcoQURDeCkgPT0gMFVMKSB7DQotICAgICAgICBMTF9BRENfSU5KX1N0b3BDb252ZXJzaW9uKEFEQ3gpOw0KLSAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKiBXYWl0IGZvciBBREMgY29udmVyc2lvbnMgYXJlIGVmZmVjdGl2ZWx5IHN0b3BwZWQgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIHRpbWVvdXRfY3B1X2N5Y2xlcyA9IEFEQ19USU1FT1VUX1NUT1BfQ09OVkVSU0lPTl9DUFVfQ1lDTEVTOw0KLSAgICB3aGlsZSAoKExMX0FEQ19SRUdfSXNTdG9wQ29udmVyc2lvbk9uZ29pbmcoQURDeCkgfA0KLSAgICAgICAgICAgIExMX0FEQ19JTkpfSXNTdG9wQ29udmVyc2lvbk9uZ29pbmcoQURDeCkpID09IDFVTCkgew0KLSAgICAgIHRpbWVvdXRfY3B1X2N5Y2xlcy0tOw0KLSAgICAgIGlmICh0aW1lb3V0X2NwdV9jeWNsZXMgPT0gMFVMKSB7DQotICAgICAgICAvKiBUaW1lLW91dCBlcnJvciAqLw0KLSAgICAgICAgc3RhdHVzID0gRVJST1I7DQotICAgICAgICBicmVhazsNCi0gICAgICB9DQotICAgIH0NCi0NCi0gICAgLyogRmx1c2ggZ3JvdXAgaW5qZWN0ZWQgY29udGV4dHMgcXVldWUgKHJlZ2lzdGVyIEpTUVIpOiAgICAgICAgICAgICAgICAgICAqLw0KLSAgICAvKiBOb3RlOiBCaXQgSlFNIG11c3QgYmUgc2V0IHRvIGVtcHR5IHRoZSBjb250ZXh0cyBxdWV1ZSAob3RoZXJ3aXNlICAgICAgICovDQotICAgIC8qICAgICAgIGNvbnRleHRzIHF1ZXVlIGlzIG1haW50YWluZWQgd2l0aCB0aGUgbGFzdCBhY3RpdmUgY29udGV4dCkuICAgICAgKi8NCi0gICAgTExfQURDX0lOSl9TZXRRdWV1ZU1vZGUoQURDeCwgTExfQURDX0lOSl9RVUVVRV8yQ09OVEVYVFNfRU5EX0VNUFRZKTsNCi0NCi0gICAgLyogRGlzYWJsZSB0aGUgQURDIGluc3RhbmNlICovDQotICAgIExMX0FEQ19EaXNhYmxlKEFEQ3gpOw0KLQ0KLSAgICAvKiBXYWl0IGZvciBBREMgaW5zdGFuY2UgaXMgZWZmZWN0aXZlbHkgZGlzYWJsZWQgKi8NCi0gICAgdGltZW91dF9jcHVfY3ljbGVzID0gQURDX1RJTUVPVVRfRElTQUJMRV9DUFVfQ1lDTEVTOw0KLSAgICB3aGlsZSAoTExfQURDX0lzRGlzYWJsZU9uZ29pbmcoQURDeCkgPT0gMVVMKSB7DQotICAgICAgdGltZW91dF9jcHVfY3ljbGVzLS07DQotICAgICAgaWYgKHRpbWVvdXRfY3B1X2N5Y2xlcyA9PSAwVUwpIHsNCi0gICAgICAgIC8qIFRpbWUtb3V0IGVycm9yICovDQotICAgICAgICBzdGF0dXMgPSBFUlJPUjsNCi0gICAgICAgIGJyZWFrOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgLyogQ2hlY2sgd2hldGhlciBBREMgc3RhdGUgaXMgY29tcGxpYW50IHdpdGggZXhwZWN0ZWQgc3RhdGUgKi8NCi0gIGlmIChSRUFEX0JJVChBREN4LT5DUiwgKEFEQ19DUl9KQURTVFAgfCBBRENfQ1JfQURTVFAgfCBBRENfQ1JfSkFEU1RBUlQgfA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NSX0FEU1RBUlQgfCBBRENfQ1JfQURESVMgfCBBRENfQ1JfQURFTikpID09DQotICAgICAgMFVMKSB7DQotICAgIC8qID09PT09PT09PT0gUmVzZXQgQURDIHJlZ2lzdGVycyA9PT09PT09PT09ICovDQotICAgIC8qIFJlc2V0IHJlZ2lzdGVyIElFUiAqLw0KLSAgICBDTEVBUl9CSVQoQURDeC0+SUVSLCAoTExfQURDX0lUX0FEUkRZIHwgTExfQURDX0lUX0VPQyB8IExMX0FEQ19JVF9FT1MgfA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgTExfQURDX0lUX09WUiB8IExMX0FEQ19JVF9FT1NNUCB8IExMX0FEQ19JVF9KRU9DIHwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIExMX0FEQ19JVF9KRU9TIHwgTExfQURDX0lUX0pRT1ZGIHwgTExfQURDX0lUX0FXRDEgfA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgTExfQURDX0lUX0FXRDIgfCBMTF9BRENfSVRfQVdEMykpOw0KLQ0KLSAgICAvKiBSZXNldCByZWdpc3RlciBJU1IgKi8NCi0gICAgU0VUX0JJVChBREN4LT5JU1IsDQotICAgICAgICAgICAgKExMX0FEQ19GTEFHX0FEUkRZIHwgTExfQURDX0ZMQUdfRU9DIHwgTExfQURDX0ZMQUdfRU9TIHwNCi0gICAgICAgICAgICAgTExfQURDX0ZMQUdfT1ZSIHwgTExfQURDX0ZMQUdfRU9TTVAgfCBMTF9BRENfRkxBR19KRU9DIHwNCi0gICAgICAgICAgICAgTExfQURDX0ZMQUdfSkVPUyB8IExMX0FEQ19GTEFHX0pRT1ZGIHwgTExfQURDX0ZMQUdfQVdEMSB8DQotICAgICAgICAgICAgIExMX0FEQ19GTEFHX0FXRDIgfCBMTF9BRENfRkxBR19BV0QzKSk7DQotDQotICAgIC8qIFJlc2V0IHJlZ2lzdGVyIENSICovDQotICAgIC8qICAtIEJpdHMgQURDX0NSX0pBRFNUUCwgQURDX0NSX0FEU1RQLCBBRENfQ1JfSkFEU1RBUlQsIEFEQ19DUl9BRFNUQVJULCAgKi8NCi0gICAgLyogICAgQURDX0NSX0FEQ0FMLCBBRENfQ1JfQURESVMsIEFEQ19DUl9BREVOIGFyZSBpbiAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICAvKiAgICBhY2Nlc3MgbW9kZSAicmVhZC1zZXQiOiBubyBkaXJlY3QgcmVzZXQgYXBwbGljYWJsZS4gICAgICAgICAgICAgICAgICovDQotICAgIC8qICAtIFJlc2V0IENhbGlicmF0aW9uIG1vZGUgdG8gZGVmYXVsdCBzZXR0aW5nIChzaW5nbGUgZW5kZWQpLiAgICAgICAgICAgKi8NCi0gICAgLyogIC0gRGlzYWJsZSBBREMgaW50ZXJuYWwgdm9sdGFnZSByZWd1bGF0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICAvKiAgLSBFbmFibGUgQURDIGRlZXAgcG93ZXIgZG93bi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIC8qICAgIE5vdGU6IEFEQyBpbnRlcm5hbCB2b2x0YWdlIHJlZ3VsYXRvciBkaXNhYmxlIGFuZCBBREMgZGVlcCBwb3dlciAgICAgKi8NCi0gICAgLyogICAgICAgICAgZG93biBlbmFibGUgYXJlIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZSBkaXNhYmxlZDogICAgICAgICAgICAqLw0KLSAgICAvKiAgICAgICAgICBhbHJlYWR5IGRvbmUgYWJvdmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIENMRUFSX0JJVChBREN4LT5DUiwgQURDX0NSX0FEVlJFR0VOIHwgQURDX0NSX0FEQ0FMRElGKTsNCi0gICAgU0VUX0JJVChBREN4LT5DUiwgQURDX0NSX0RFRVBQV0QpOw0KLQ0KLSAgICAvKiBSZXNldCByZWdpc3RlciBDRkdSICovDQotICAgIE1PRElGWV9SRUcoDQotICAgICAgICBBREN4LT5DRkdSLA0KLSAgICAgICAgKEFEQ19DRkdSX0FXRDFDSCB8IEFEQ19DRkdSX0pBVVRPIHwgQURDX0NGR1JfSkFXRDFFTiB8IEFEQ19DRkdSX0FXRDFFTiB8DQotICAgICAgICAgQURDX0NGR1JfQVdEMVNHTCB8IEFEQ19DRkdSX0pRTSB8IEFEQ19DRkdSX0pESVNDRU4gfCBBRENfQ0ZHUl9ESVNDTlVNIHwNCi0gICAgICAgICBBRENfQ0ZHUl9ESVNDRU4gfCBBRENfQ0ZHUl9BVVRETFkgfCBBRENfQ0ZHUl9DT05UIHwgQURDX0NGR1JfT1ZSTU9EIHwNCi0gICAgICAgICBBRENfQ0ZHUl9FWFRFTiB8IEFEQ19DRkdSX0VYVFNFTCB8IEFEQ19DRkdSX0FMSUdOIHwgQURDX0NGR1JfUkVTIHwNCi0gICAgICAgICBBRENfQ0ZHUl9ETUFDRkcgfCBBRENfQ0ZHUl9ETUFFTiksDQotICAgICAgICBBRENfQ0ZHUl9KUURJUyk7DQotDQotICAgIC8qIFJlc2V0IHJlZ2lzdGVyIENGR1IyICovDQotICAgIENMRUFSX0JJVCgNCi0gICAgICAgIEFEQ3gtPkNGR1IyLA0KLSAgICAgICAgKEFEQ19DRkdSMl9ST1ZTTSB8IEFEQ19DRkdSMl9UUk9WUyB8IEFEQ19DRkdSMl9PVlNTIHwgQURDX0NGR1IyX1NXVFJJRyB8DQotICAgICAgICAgQURDX0NGR1IyX0JVTEIgfCBBRENfQ0ZHUjJfU01QVFJJRyB8IEFEQ19DRkdSMl9HQ09NUCB8IEFEQ19DRkdSMl9PVlNSIHwNCi0gICAgICAgICBBRENfQ0ZHUjJfSk9WU0UgfCBBRENfQ0ZHUjJfUk9WU0UpKTsNCi0NCi0gICAgLyogUmVzZXQgcmVnaXN0ZXIgU01QUjEgKi8NCi0gICAgQ0xFQVJfQklUKEFEQ3gtPlNNUFIxLCAoQURDX1NNUFIxX1NNUDkgfCBBRENfU01QUjFfU01QOCB8IEFEQ19TTVBSMV9TTVA3IHwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX1NNUFIxX1NNUDYgfCBBRENfU01QUjFfU01QNSB8IEFEQ19TTVBSMV9TTVA0IHwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX1NNUFIxX1NNUDMgfCBBRENfU01QUjFfU01QMiB8IEFEQ19TTVBSMV9TTVAxKSk7DQotDQotICAgIC8qIFJlc2V0IHJlZ2lzdGVyIFNNUFIyICovDQotICAgIENMRUFSX0JJVChBREN4LT5TTVBSMiwNCi0gICAgICAgICAgICAgIChBRENfU01QUjJfU01QMTggfCBBRENfU01QUjJfU01QMTcgfCBBRENfU01QUjJfU01QMTYgfA0KLSAgICAgICAgICAgICAgIEFEQ19TTVBSMl9TTVAxNSB8IEFEQ19TTVBSMl9TTVAxNCB8IEFEQ19TTVBSMl9TTVAxMyB8DQotICAgICAgICAgICAgICAgQURDX1NNUFIyX1NNUDEyIHwgQURDX1NNUFIyX1NNUDExIHwgQURDX1NNUFIyX1NNUDEwKSk7DQotDQotICAgIC8qIFJlc2V0IHJlZ2lzdGVyIFRSMSAqLw0KLSAgICBNT0RJRllfUkVHKEFEQ3gtPlRSMSwgQURDX1RSMV9BV0RGSUxUIHwgQURDX1RSMV9IVDEgfCBBRENfVFIxX0xUMSwNCi0gICAgICAgICAgICAgICBBRENfVFIxX0hUMSk7DQotDQotICAgIC8qIFJlc2V0IHJlZ2lzdGVyIFRSMiAqLw0KLSAgICBNT0RJRllfUkVHKEFEQ3gtPlRSMiwgQURDX1RSMl9IVDIgfCBBRENfVFIyX0xUMiwgQURDX1RSMl9IVDIpOw0KLQ0KLSAgICAvKiBSZXNldCByZWdpc3RlciBUUjMgKi8NCi0gICAgTU9ESUZZX1JFRyhBREN4LT5UUjMsIEFEQ19UUjNfSFQzIHwgQURDX1RSM19MVDMsIEFEQ19UUjNfSFQzKTsNCi0NCi0gICAgLyogUmVzZXQgcmVnaXN0ZXIgU1FSMSAqLw0KLSAgICBDTEVBUl9CSVQoQURDeC0+U1FSMSwgKEFEQ19TUVIxX1NRNCB8IEFEQ19TUVIxX1NRMyB8IEFEQ19TUVIxX1NRMiB8DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX1NRUjFfU1ExIHwgQURDX1NRUjFfTCkpOw0KLQ0KLSAgICAvKiBSZXNldCByZWdpc3RlciBTUVIyICovDQotICAgIENMRUFSX0JJVChBREN4LT5TUVIyLCAoQURDX1NRUjJfU1E5IHwgQURDX1NRUjJfU1E4IHwgQURDX1NRUjJfU1E3IHwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfU1FSMl9TUTYgfCBBRENfU1FSMl9TUTUpKTsNCi0NCi0gICAgLyogUmVzZXQgcmVnaXN0ZXIgU1FSMyAqLw0KLSAgICBDTEVBUl9CSVQoQURDeC0+U1FSMywgKEFEQ19TUVIzX1NRMTQgfCBBRENfU1FSM19TUTEzIHwgQURDX1NRUjNfU1ExMiB8DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX1NRUjNfU1ExMSB8IEFEQ19TUVIzX1NRMTApKTsNCi0NCi0gICAgLyogUmVzZXQgcmVnaXN0ZXIgU1FSNCAqLw0KLSAgICBDTEVBUl9CSVQoQURDeC0+U1FSNCwgQURDX1NRUjRfU1ExNiB8IEFEQ19TUVI0X1NRMTUpOw0KLQ0KLSAgICAvKiBSZXNldCByZWdpc3RlciBKU1FSICovDQotICAgIENMRUFSX0JJVChBREN4LT5KU1FSLA0KLSAgICAgICAgICAgICAgKEFEQ19KU1FSX0pMIHwgQURDX0pTUVJfSkVYVFNFTCB8IEFEQ19KU1FSX0pFWFRFTiB8DQotICAgICAgICAgICAgICAgQURDX0pTUVJfSlNRNCB8IEFEQ19KU1FSX0pTUTMgfCBBRENfSlNRUl9KU1EyIHwgQURDX0pTUVJfSlNRMSkpOw0KLQ0KLSAgICAvKiBSZXNldCByZWdpc3RlciBEUiAqLw0KLSAgICAvKiBOb3RlOiBiaXRzIGluIGFjY2VzcyBtb2RlIHJlYWQgb25seSwgbm8gZGlyZWN0IHJlc2V0IGFwcGxpY2FibGUgKi8NCi0NCi0gICAgLyogUmVzZXQgcmVnaXN0ZXIgT0ZSMSAqLw0KLSAgICBDTEVBUl9CSVQoQURDeC0+T0ZSMSwgQURDX09GUjFfT0ZGU0VUMV9FTiB8IEFEQ19PRlIxX09GRlNFVDFfQ0ggfA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19PRlIxX09GRlNFVDEgfCBBRENfT0ZSMV9TQVRFTiB8DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX09GUjFfT0ZGU0VUUE9TKTsNCi0gICAgLyogUmVzZXQgcmVnaXN0ZXIgT0ZSMiAqLw0KLSAgICBDTEVBUl9CSVQoQURDeC0+T0ZSMiwgQURDX09GUjJfT0ZGU0VUMl9FTiB8IEFEQ19PRlIyX09GRlNFVDJfQ0ggfA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19PRlIyX09GRlNFVDIgfCBBRENfT0ZSMl9TQVRFTiB8DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX09GUjJfT0ZGU0VUUE9TKTsNCi0gICAgLyogUmVzZXQgcmVnaXN0ZXIgT0ZSMyAqLw0KLSAgICBDTEVBUl9CSVQoQURDeC0+T0ZSMywgQURDX09GUjNfT0ZGU0VUM19FTiB8IEFEQ19PRlIzX09GRlNFVDNfQ0ggfA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19PRlIzX09GRlNFVDMgfCBBRENfT0ZSM19TQVRFTiB8DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX09GUjNfT0ZGU0VUUE9TKTsNCi0gICAgLyogUmVzZXQgcmVnaXN0ZXIgT0ZSNCAqLw0KLSAgICBDTEVBUl9CSVQoQURDeC0+T0ZSNCwgQURDX09GUjRfT0ZGU0VUNF9FTiB8IEFEQ19PRlI0X09GRlNFVDRfQ0ggfA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19PRlI0X09GRlNFVDQgfCBBRENfT0ZSNF9TQVRFTiB8DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX09GUjRfT0ZGU0VUUE9TKTsNCi0NCi0gICAgLyogUmVzZXQgcmVnaXN0ZXJzIEpEUjEsIEpEUjIsIEpEUjMsIEpEUjQgKi8NCi0gICAgLyogTm90ZTogYml0cyBpbiBhY2Nlc3MgbW9kZSByZWFkIG9ubHksIG5vIGRpcmVjdCByZXNldCBhcHBsaWNhYmxlICovDQotDQotICAgIC8qIFJlc2V0IHJlZ2lzdGVyIEFXRDJDUiAqLw0KLSAgICBDTEVBUl9CSVQoQURDeC0+QVdEMkNSLCBBRENfQVdEMkNSX0FXRDJDSCk7DQotDQotICAgIC8qIFJlc2V0IHJlZ2lzdGVyIEFXRDNDUiAqLw0KLSAgICBDTEVBUl9CSVQoQURDeC0+QVdEM0NSLCBBRENfQVdEM0NSX0FXRDNDSCk7DQotDQotICAgIC8qIFJlc2V0IHJlZ2lzdGVyIERJRlNFTCAqLw0KLSAgICBDTEVBUl9CSVQoQURDeC0+RElGU0VMLCBBRENfRElGU0VMX0RJRlNFTCk7DQotDQotICAgIC8qIFJlc2V0IHJlZ2lzdGVyIENBTEZBQ1QgKi8NCi0gICAgQ0xFQVJfQklUKEFEQ3gtPkNBTEZBQ1QsIEFEQ19DQUxGQUNUX0NBTEZBQ1RfRCB8IEFEQ19DQUxGQUNUX0NBTEZBQ1RfUyk7DQotDQotICAgIC8qIFJlc2V0IHJlZ2lzdGVyIEdDT01QICovDQotICAgIENMRUFSX0JJVChBREN4LT5HQ09NUCwgQURDX0dDT01QX0dDT01QQ09FRkYpOw0KLSAgfSBlbHNlIHsNCi0gICAgLyogQURDIGluc3RhbmNlIGlzIGluIGFuIHVua25vd24gc3RhdGUgKi8NCi0gICAgLyogTmVlZCB0byBwZXJmb3JtaW5nIGEgaGFyZCByZXNldCBvZiBBREMgaW5zdGFuY2UsIHVzaW5nIGhpZ2ggbGV2ZWwgICAgICAqLw0KLSAgICAvKiBjbG9jayBzb3VyY2UgUkNDIEFEQyByZXNldC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIC8qIENhdXRpb246IE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBpZiBzZXZlcmFsIEFEQyBpbnN0YW5jZXMgYXJlIGF2YWlsYWJsZSAgKi8NCi0gICAgLyogICAgICAgICAgb24gdGhlIHNlbGVjdGVkIGRldmljZSwgUkNDIEFEQyByZXNldCB3aWxsIHJlc2V0ICAgICAgICAgICAgICAqLw0KLSAgICAvKiAgICAgICAgICBhbGwgQURDIGluc3RhbmNlcyBiZWxvbmdpbmcgdG8gdGhlIGNvbW1vbiBBREMgaW5zdGFuY2UuICAgICAgICovDQotICAgIC8qIENhdXRpb246IE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBpZiBzZXZlcmFsIEFEQyBpbnN0YW5jZXMgYXJlIGF2YWlsYWJsZSAgKi8NCi0gICAgLyogICAgICAgICAgb24gdGhlIHNlbGVjdGVkIGRldmljZSwgUkNDIEFEQyByZXNldCB3aWxsIHJlc2V0ICAgICAgICAgICAgICAqLw0KLSAgICAvKiAgICAgICAgICBhbGwgQURDIGluc3RhbmNlcyBiZWxvbmdpbmcgdG8gdGhlIGNvbW1vbiBBREMgaW5zdGFuY2UuICAgICAgICovDQotICAgIHN0YXR1cyA9IEVSUk9SOw0KLSAgfQ0KLQ0KLSAgcmV0dXJuIHN0YXR1czsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBJbml0aWFsaXplIHNvbWUgZmVhdHVyZXMgb2YgQURDIGluc3RhbmNlLg0KLSAqIEBub3RlICAgVGhlc2UgcGFyYW1ldGVycyBoYXZlIGFuIGltcGFjdCBvbiBBREMgc2NvcGU6IEFEQyBpbnN0YW5jZS4NCi0gKiAgICAgICAgIEFmZmVjdHMgYm90aCBncm91cCByZWd1bGFyIGFuZCBncm91cCBpbmplY3RlZCAoYXZhaWxhYmlsaXR5DQotICogICAgICAgICBvZiBBREMgZ3JvdXAgaW5qZWN0ZWQgZGVwZW5kcyBvbiBTVE0zMiBmYW1pbGllcykuDQotICogICAgICAgICBSZWZlciB0byBjb3JyZXNwb25kaW5nIHVuaXRhcnkgZnVuY3Rpb25zIGludG8NCi0gKiAgICAgICAgIEByZWYgQURDX0xMX0VGX0NvbmZpZ3VyYXRpb25fQURDX0luc3RhbmNlIC4NCi0gKiBAbm90ZSAgIFRoZSBzZXR0aW5nIG9mIHRoZXNlIHBhcmFtZXRlcnMgYnkgZnVuY3Rpb24gQHJlZiBMTF9BRENfSW5pdCgpDQotICogICAgICAgICBpcyBjb25kaXRpb25lZCB0byBBREMgc3RhdGU6DQotICogICAgICAgICBBREMgaW5zdGFuY2UgbXVzdCBiZSBkaXNhYmxlZC4NCi0gKiAgICAgICAgIFRoaXMgY29uZGl0aW9uIGlzIGFwcGxpZWQgdG8gYWxsIEFEQyBmZWF0dXJlcywgZm9yIGVmZmljaWVuY3kNCi0gKiAgICAgICAgIGFuZCBjb21wYXRpYmlsaXR5IG92ZXIgYWxsIFNUTTMyIGZhbWlsaWVzLiBIb3dldmVyLCB0aGUgZGlmZmVyZW50DQotICogICAgICAgICBmZWF0dXJlcyBjYW4gYmUgc2V0IHVuZGVyIGRpZmZlcmVudCBBREMgc3RhdGUgY29uZGl0aW9ucw0KLSAqICAgICAgICAgKHNldHRpbmcgcG9zc2libGUgd2l0aCBBREMgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcsDQotICogICAgICAgICBBREMgZW5hYmxlZCB3aXRoIGNvbnZlcnNpb24gb24gZ29pbmcsIC4uLikNCi0gKiAgICAgICAgIEVhY2ggZmVhdHVyZSBjYW4gYmUgdXBkYXRlZCBhZnRlcndhcmRzIHdpdGggYSB1bml0YXJ5IGZ1bmN0aW9uDQotICogICAgICAgICBhbmQgcG90ZW50aWFsbHkgd2l0aCBBREMgaW4gYSBkaWZmZXJlbnQgc3RhdGUgdGhhbiBkaXNhYmxlZCwNCi0gKiAgICAgICAgIHJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIGVhY2ggZnVuY3Rpb24gZm9yIHNldHRpbmcNCi0gKiAgICAgICAgIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZS4NCi0gKiBAbm90ZSAgIEFmdGVyIHVzaW5nIHRoaXMgZnVuY3Rpb24sIHNvbWUgb3RoZXIgZmVhdHVyZXMgbXVzdCBiZSBjb25maWd1cmVkDQotICogICAgICAgICB1c2luZyBMTCB1bml0YXJ5IGZ1bmN0aW9ucy4NCi0gKiAgICAgICAgIFRoZSBtaW5pbXVtIGNvbmZpZ3VyYXRpb24gcmVtYWluaW5nIHRvIGJlIGRvbmUgaXM6DQotICogICAgICAgICAgLSBTZXQgQURDIGdyb3VwIHJlZ3VsYXIgb3IgZ3JvdXAgaW5qZWN0ZWQgc2VxdWVuY2VyOg0KLSAqICAgICAgICAgICAgbWFwIGNoYW5uZWwgb24gdGhlIHNlbGVjdGVkIHNlcXVlbmNlciByYW5rLg0KLSAqICAgICAgICAgICAgUmVmZXIgdG8gZnVuY3Rpb24gQHJlZiBMTF9BRENfUkVHX1NldFNlcXVlbmNlclJhbmtzKCkuDQotICogICAgICAgICAgLSBTZXQgQURDIGNoYW5uZWwgc2FtcGxpbmcgdGltZQ0KLSAqICAgICAgICAgICAgUmVmZXIgdG8gZnVuY3Rpb24gTExfQURDX1NldENoYW5uZWxTYW1wbGluZ1RpbWUoKTsNCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHBhcmFtICBBRENfSW5pdFN0cnVjdCBQb2ludGVyIHRvIGEgQHJlZiBMTF9BRENfUkVHX0luaXRUeXBlRGVmIHN0cnVjdHVyZQ0KLSAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6DQotICogICAgICAgICAgLSBTVUNDRVNTOiBBREMgcmVnaXN0ZXJzIGFyZSBpbml0aWFsaXplZA0KLSAqICAgICAgICAgIC0gRVJST1I6IEFEQyByZWdpc3RlcnMgYXJlIG5vdCBpbml0aWFsaXplZA0KLSAqLw0KLUVycm9yU3RhdHVzIExMX0FEQ19Jbml0KEFEQ19UeXBlRGVmICpBREN4LCBMTF9BRENfSW5pdFR5cGVEZWYgKkFEQ19Jbml0U3RydWN0KSB7DQotICBFcnJvclN0YXR1cyBzdGF0dXMgPSBTVUNDRVNTOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKEFEQ3gpKTsNCi0NCi0gIGFzc2VydF9wYXJhbShJU19MTF9BRENfUkVTT0xVVElPTihBRENfSW5pdFN0cnVjdC0+UmVzb2x1dGlvbikpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0xMX0FEQ19EQVRBX0FMSUdOKEFEQ19Jbml0U3RydWN0LT5EYXRhQWxpZ25tZW50KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfTExfQURDX0xPV19QT1dFUihBRENfSW5pdFN0cnVjdC0+TG93UG93ZXJNb2RlKSk7DQotDQotICAvKiBOb3RlOiBIYXJkd2FyZSBjb25zdHJhaW50IChyZWZlciB0byBkZXNjcmlwdGlvbiBvZiB0aGlzIGZ1bmN0aW9uKTogICAgICAgKi8NCi0gIC8qICAgICAgIEFEQyBpbnN0YW5jZSBtdXN0IGJlIGRpc2FibGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgaWYgKExMX0FEQ19Jc0VuYWJsZWQoQURDeCkgPT0gMFVMKSB7DQotICAgIC8qIENvbmZpZ3VyYXRpb24gb2YgQURDIGhpZXJhcmNoaWNhbCBzY29wZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgLyogIC0gQURDIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICAvKiAgICAtIFNldCBBREMgZGF0YSByZXNvbHV0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIC8qICAgIC0gU2V0IEFEQyBjb252ZXJzaW9uIGRhdGEgYWxpZ25tZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgLyogICAgLSBTZXQgQURDIGxvdyBwb3dlciBtb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICBNT0RJRllfUkVHKEFEQ3gtPkNGR1IsIEFEQ19DRkdSX1JFUyB8IEFEQ19DRkdSX0FMSUdOIHwgQURDX0NGR1JfQVVURExZLA0KLSAgICAgICAgICAgICAgIEFEQ19Jbml0U3RydWN0LT5SZXNvbHV0aW9uIHwgQURDX0luaXRTdHJ1Y3QtPkRhdGFBbGlnbm1lbnQgfA0KLSAgICAgICAgICAgICAgICAgICBBRENfSW5pdFN0cnVjdC0+TG93UG93ZXJNb2RlKTsNCi0NCi0gIH0gZWxzZSB7DQotICAgIC8qIEluaXRpYWxpemF0aW9uIGVycm9yOiBBREMgaW5zdGFuY2UgaXMgbm90IGRpc2FibGVkLiAqLw0KLSAgICBzdGF0dXMgPSBFUlJPUjsNCi0gIH0NCi0NCi0gIHJldHVybiBzdGF0dXM7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgU2V0IGVhY2ggQHJlZiBMTF9BRENfSW5pdFR5cGVEZWYgZmllbGQgdG8gZGVmYXVsdCB2YWx1ZS4NCi0gKiBAcGFyYW0gIEFEQ19Jbml0U3RydWN0IFBvaW50ZXIgdG8gYSBAcmVmIExMX0FEQ19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUNCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIHdob3NlIGZpZWxkcyB3aWxsIGJlIHNldCB0byBkZWZhdWx0IHZhbHVlcy4NCi0gKiBAcmV0dmFsIE5vbmUNCi0gKi8NCi12b2lkIExMX0FEQ19TdHJ1Y3RJbml0KExMX0FEQ19Jbml0VHlwZURlZiAqQURDX0luaXRTdHJ1Y3QpIHsNCi0gIC8qIFNldCBBRENfSW5pdFN0cnVjdCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMgKi8NCi0gIC8qIFNldCBmaWVsZHMgb2YgQURDIGluc3RhbmNlICovDQotICBBRENfSW5pdFN0cnVjdC0+UmVzb2x1dGlvbiA9IExMX0FEQ19SRVNPTFVUSU9OXzEyQjsNCi0gIEFEQ19Jbml0U3RydWN0LT5EYXRhQWxpZ25tZW50ID0gTExfQURDX0RBVEFfQUxJR05fUklHSFQ7DQotICBBRENfSW5pdFN0cnVjdC0+TG93UG93ZXJNb2RlID0gTExfQURDX0xQX01PREVfTk9ORTsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBJbml0aWFsaXplIHNvbWUgZmVhdHVyZXMgb2YgQURDIGdyb3VwIHJlZ3VsYXIuDQotICogQG5vdGUgICBUaGVzZSBwYXJhbWV0ZXJzIGhhdmUgYW4gaW1wYWN0IG9uIEFEQyBzY29wZTogQURDIGdyb3VwIHJlZ3VsYXIuDQotICogICAgICAgICBSZWZlciB0byBjb3JyZXNwb25kaW5nIHVuaXRhcnkgZnVuY3Rpb25zIGludG8NCi0gKiAgICAgICAgIEByZWYgQURDX0xMX0VGX0NvbmZpZ3VyYXRpb25fQURDX0dyb3VwX1JlZ3VsYXINCi0gKiAgICAgICAgIChmdW5jdGlvbnMgd2l0aCBwcmVmaXggIlJFRyIpLg0KLSAqIEBub3RlICAgVGhlIHNldHRpbmcgb2YgdGhlc2UgcGFyYW1ldGVycyBieSBmdW5jdGlvbiBAcmVmIExMX0FEQ19Jbml0KCkNCi0gKiAgICAgICAgIGlzIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZToNCi0gKiAgICAgICAgIEFEQyBpbnN0YW5jZSBtdXN0IGJlIGRpc2FibGVkLg0KLSAqICAgICAgICAgVGhpcyBjb25kaXRpb24gaXMgYXBwbGllZCB0byBhbGwgQURDIGZlYXR1cmVzLCBmb3IgZWZmaWNpZW5jeQ0KLSAqICAgICAgICAgYW5kIGNvbXBhdGliaWxpdHkgb3ZlciBhbGwgU1RNMzIgZmFtaWxpZXMuIEhvd2V2ZXIsIHRoZSBkaWZmZXJlbnQNCi0gKiAgICAgICAgIGZlYXR1cmVzIGNhbiBiZSBzZXQgdW5kZXIgZGlmZmVyZW50IEFEQyBzdGF0ZSBjb25kaXRpb25zDQotICogICAgICAgICAoc2V0dGluZyBwb3NzaWJsZSB3aXRoIEFEQyBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZywNCi0gKiAgICAgICAgIEFEQyBlbmFibGVkIHdpdGggY29udmVyc2lvbiBvbiBnb2luZywgLi4uKQ0KLSAqICAgICAgICAgRWFjaCBmZWF0dXJlIGNhbiBiZSB1cGRhdGVkIGFmdGVyd2FyZHMgd2l0aCBhIHVuaXRhcnkgZnVuY3Rpb24NCi0gKiAgICAgICAgIGFuZCBwb3RlbnRpYWxseSB3aXRoIEFEQyBpbiBhIGRpZmZlcmVudCBzdGF0ZSB0aGFuIGRpc2FibGVkLA0KLSAqICAgICAgICAgcmVmZXIgdG8gZGVzY3JpcHRpb24gb2YgZWFjaCBmdW5jdGlvbiBmb3Igc2V0dGluZw0KLSAqICAgICAgICAgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlLg0KLSAqIEBub3RlICAgQWZ0ZXIgdXNpbmcgdGhpcyBmdW5jdGlvbiwgb3RoZXIgZmVhdHVyZXMgbXVzdCBiZSBjb25maWd1cmVkDQotICogICAgICAgICB1c2luZyBMTCB1bml0YXJ5IGZ1bmN0aW9ucy4NCi0gKiAgICAgICAgIFRoZSBtaW5pbXVtIGNvbmZpZ3VyYXRpb24gcmVtYWluaW5nIHRvIGJlIGRvbmUgaXM6DQotICogICAgICAgICAgLSBTZXQgQURDIGdyb3VwIHJlZ3VsYXIgb3IgZ3JvdXAgaW5qZWN0ZWQgc2VxdWVuY2VyOg0KLSAqICAgICAgICAgICAgbWFwIGNoYW5uZWwgb24gdGhlIHNlbGVjdGVkIHNlcXVlbmNlciByYW5rLg0KLSAqICAgICAgICAgICAgUmVmZXIgdG8gZnVuY3Rpb24gQHJlZiBMTF9BRENfUkVHX1NldFNlcXVlbmNlclJhbmtzKCkuDQotICogICAgICAgICAgLSBTZXQgQURDIGNoYW5uZWwgc2FtcGxpbmcgdGltZQ0KLSAqICAgICAgICAgICAgUmVmZXIgdG8gZnVuY3Rpb24gTExfQURDX1NldENoYW5uZWxTYW1wbGluZ1RpbWUoKTsNCi0gKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlDQotICogQHBhcmFtICBBRENfUkVHX0luaXRTdHJ1Y3QgUG9pbnRlciB0byBhIEByZWYgTExfQURDX1JFR19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUNCi0gKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOg0KLSAqICAgICAgICAgIC0gU1VDQ0VTUzogQURDIHJlZ2lzdGVycyBhcmUgaW5pdGlhbGl6ZWQNCi0gKiAgICAgICAgICAtIEVSUk9SOiBBREMgcmVnaXN0ZXJzIGFyZSBub3QgaW5pdGlhbGl6ZWQNCi0gKi8NCi1FcnJvclN0YXR1cyBMTF9BRENfUkVHX0luaXQoQURDX1R5cGVEZWYgKkFEQ3gsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX0FEQ19SRUdfSW5pdFR5cGVEZWYgKkFEQ19SRUdfSW5pdFN0cnVjdCkgew0KLSAgRXJyb3JTdGF0dXMgc3RhdHVzID0gU1VDQ0VTUzsNCi0NCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShBREN4KSk7DQotICBhc3NlcnRfcGFyYW0oDQotICAgICAgSVNfTExfQURDX1JFR19UUklHX1NPVVJDRShBREN4LCBBRENfUkVHX0luaXRTdHJ1Y3QtPlRyaWdnZXJTb3VyY2UpKTsNCi0gIGFzc2VydF9wYXJhbSgNCi0gICAgICBJU19MTF9BRENfUkVHX1NFUV9TQ0FOX0xFTkdUSChBRENfUkVHX0luaXRTdHJ1Y3QtPlNlcXVlbmNlckxlbmd0aCkpOw0KLSAgaWYgKEFEQ19SRUdfSW5pdFN0cnVjdC0+U2VxdWVuY2VyTGVuZ3RoICE9IExMX0FEQ19SRUdfU0VRX1NDQU5fRElTQUJMRSkgew0KLSAgICBhc3NlcnRfcGFyYW0oSVNfTExfQURDX1JFR19TRVFfU0NBTl9ESVNDT05UX01PREUoDQotICAgICAgICBBRENfUkVHX0luaXRTdHJ1Y3QtPlNlcXVlbmNlckRpc2NvbnQpKTsNCi0NCi0gICAgLyogQURDIGdyb3VwIHJlZ3VsYXIgY29udGludW91cyBtb2RlIGFuZCBkaXNjb250aW51b3VzIG1vZGUgKi8NCi0gICAgLyogY2FuIG5vdCBiZSBlbmFibGVkIHNpbXVsdGVuYWVvdXNseSAqLw0KLSAgICBhc3NlcnRfcGFyYW0oDQotICAgICAgICAoQURDX1JFR19Jbml0U3RydWN0LT5Db250aW51b3VzTW9kZSA9PSBMTF9BRENfUkVHX0NPTlZfU0lOR0xFKSB8fA0KLSAgICAgICAgKEFEQ19SRUdfSW5pdFN0cnVjdC0+U2VxdWVuY2VyRGlzY29udCA9PQ0KLSAgICAgICAgIExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfRElTQUJMRSkpOw0KLSAgfQ0KLSAgYXNzZXJ0X3BhcmFtKA0KLSAgICAgIElTX0xMX0FEQ19SRUdfQ09OVElOVU9VU19NT0RFKEFEQ19SRUdfSW5pdFN0cnVjdC0+Q29udGludW91c01vZGUpKTsNCi0gIGFzc2VydF9wYXJhbShJU19MTF9BRENfUkVHX0RNQV9UUkFOU0ZFUihBRENfUkVHX0luaXRTdHJ1Y3QtPkRNQVRyYW5zZmVyKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfTExfQURDX1JFR19PVlJfREFUQV9CRUhBVklPUihBRENfUkVHX0luaXRTdHJ1Y3QtPk92ZXJydW4pKTsNCi0NCi0gIC8qIE5vdGU6IEhhcmR3YXJlIGNvbnN0cmFpbnQgKHJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIHRoaXMgZnVuY3Rpb24pOiAgICAgICAqLw0KLSAgLyogICAgICAgQURDIGluc3RhbmNlIG11c3QgYmUgZGlzYWJsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICBpZiAoTExfQURDX0lzRW5hYmxlZChBREN4KSA9PSAwVUwpIHsNCi0gICAgLyogQ29uZmlndXJhdGlvbiBvZiBBREMgaGllcmFyY2hpY2FsIHNjb3BlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICAvKiAgLSBBREMgZ3JvdXAgcmVndWxhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIC8qICAgIC0gU2V0IEFEQyBncm91cCByZWd1bGFyIHRyaWdnZXIgc291cmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgLyogICAgLSBTZXQgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGxlbmd0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICAvKiAgICAtIFNldCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZGlzY29udGludW91cyBtb2RlICAgICAgICAgICAgICAgICovDQotICAgIC8qICAgIC0gU2V0IEFEQyBncm91cCByZWd1bGFyIGNvbnRpbnVvdXMgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgLyogICAgLSBTZXQgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBkYXRhIHRyYW5zZmVyOiBubyB0cmFuc2ZlciBvciAgICAqLw0KLSAgICAvKiAgICAgIHRyYW5zZmVyIGJ5IERNQSwgYW5kIERNQSByZXF1ZXN0cyBtb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIC8qICAgIC0gU2V0IEFEQyBncm91cCByZWd1bGFyIG92ZXJydW4gYmVoYXZpb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgLyogTm90ZTogT24gdGhpcyBTVE0zMiBzZXJpZXMsIEFEQyB0cmlnZ2VyIGVkZ2UgaXMgc2V0IHRvIHZhbHVlIDB4MCBieSAgICAqLw0KLSAgICAvKiAgICAgICBzZXR0aW5nIG9mIHRyaWdnZXIgc291cmNlIHRvIFNXIHN0YXJ0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIGlmIChBRENfUkVHX0luaXRTdHJ1Y3QtPlNlcXVlbmNlckxlbmd0aCAhPSBMTF9BRENfUkVHX1NFUV9TQ0FOX0RJU0FCTEUpIHsNCi0gICAgICBNT0RJRllfUkVHKEFEQ3gtPkNGR1IsDQotICAgICAgICAgICAgICAgICBBRENfQ0ZHUl9FWFRTRUwgfCBBRENfQ0ZHUl9FWFRFTiB8IEFEQ19DRkdSX0RJU0NFTiB8DQotICAgICAgICAgICAgICAgICAgICAgQURDX0NGR1JfRElTQ05VTSB8IEFEQ19DRkdSX0NPTlQgfCBBRENfQ0ZHUl9ETUFFTiB8DQotICAgICAgICAgICAgICAgICAgICAgQURDX0NGR1JfRE1BQ0ZHIHwgQURDX0NGR1JfT1ZSTU9ELA0KLSAgICAgICAgICAgICAgICAgQURDX1JFR19Jbml0U3RydWN0LT5UcmlnZ2VyU291cmNlIHwNCi0gICAgICAgICAgICAgICAgICAgICBBRENfUkVHX0luaXRTdHJ1Y3QtPlNlcXVlbmNlckRpc2NvbnQgfA0KLSAgICAgICAgICAgICAgICAgICAgIEFEQ19SRUdfSW5pdFN0cnVjdC0+Q29udGludW91c01vZGUgfA0KLSAgICAgICAgICAgICAgICAgICAgIEFEQ19SRUdfSW5pdFN0cnVjdC0+RE1BVHJhbnNmZXIgfA0KLSAgICAgICAgICAgICAgICAgICAgIEFEQ19SRUdfSW5pdFN0cnVjdC0+T3ZlcnJ1bik7DQotICAgIH0gZWxzZSB7DQotICAgICAgTU9ESUZZX1JFRygNCi0gICAgICAgICAgQURDeC0+Q0ZHUiwNCi0gICAgICAgICAgQURDX0NGR1JfRVhUU0VMIHwgQURDX0NGR1JfRVhURU4gfCBBRENfQ0ZHUl9ESVNDRU4gfA0KLSAgICAgICAgICAgICAgQURDX0NGR1JfRElTQ05VTSB8IEFEQ19DRkdSX0NPTlQgfCBBRENfQ0ZHUl9ETUFFTiB8DQotICAgICAgICAgICAgICBBRENfQ0ZHUl9ETUFDRkcgfCBBRENfQ0ZHUl9PVlJNT0QsDQotICAgICAgICAgIEFEQ19SRUdfSW5pdFN0cnVjdC0+VHJpZ2dlclNvdXJjZSB8IExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfRElTQUJMRSB8DQotICAgICAgICAgICAgICBBRENfUkVHX0luaXRTdHJ1Y3QtPkNvbnRpbnVvdXNNb2RlIHwNCi0gICAgICAgICAgICAgIEFEQ19SRUdfSW5pdFN0cnVjdC0+RE1BVHJhbnNmZXIgfCBBRENfUkVHX0luaXRTdHJ1Y3QtPk92ZXJydW4pOw0KLSAgICB9DQotDQotICAgIC8qIFNldCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgbGVuZ3RoIGFuZCBzY2FuIGRpcmVjdGlvbiAqLw0KLSAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlckxlbmd0aChBREN4LCBBRENfUkVHX0luaXRTdHJ1Y3QtPlNlcXVlbmNlckxlbmd0aCk7DQotICB9IGVsc2Ugew0KLSAgICAvKiBJbml0aWFsaXphdGlvbiBlcnJvcjogQURDIGluc3RhbmNlIGlzIG5vdCBkaXNhYmxlZC4gKi8NCi0gICAgc3RhdHVzID0gRVJST1I7DQotICB9DQotICByZXR1cm4gc3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCBlYWNoIEByZWYgTExfQURDX1JFR19Jbml0VHlwZURlZiBmaWVsZCB0byBkZWZhdWx0IHZhbHVlLg0KLSAqIEBwYXJhbSAgQURDX1JFR19Jbml0U3RydWN0IFBvaW50ZXIgdG8gYSBAcmVmIExMX0FEQ19SRUdfSW5pdFR5cGVEZWYgc3RydWN0dXJlDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hvc2UgZmllbGRzIHdpbGwgYmUgc2V0IHRvIGRlZmF1bHQgdmFsdWVzLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXZvaWQgTExfQURDX1JFR19TdHJ1Y3RJbml0KExMX0FEQ19SRUdfSW5pdFR5cGVEZWYgKkFEQ19SRUdfSW5pdFN0cnVjdCkgew0KLSAgLyogU2V0IEFEQ19SRUdfSW5pdFN0cnVjdCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMgKi8NCi0gIC8qIFNldCBmaWVsZHMgb2YgQURDIGdyb3VwIHJlZ3VsYXIgKi8NCi0gIC8qIE5vdGU6IE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBBREMgdHJpZ2dlciBlZGdlIGlzIHNldCB0byB2YWx1ZSAweDAgYnkgICAgICAqLw0KLSAgLyogICAgICAgc2V0dGluZyBvZiB0cmlnZ2VyIHNvdXJjZSB0byBTVyBzdGFydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICBBRENfUkVHX0luaXRTdHJ1Y3QtPlRyaWdnZXJTb3VyY2UgPSBMTF9BRENfUkVHX1RSSUdfU09GVFdBUkU7DQotICBBRENfUkVHX0luaXRTdHJ1Y3QtPlNlcXVlbmNlckxlbmd0aCA9IExMX0FEQ19SRUdfU0VRX1NDQU5fRElTQUJMRTsNCi0gIEFEQ19SRUdfSW5pdFN0cnVjdC0+U2VxdWVuY2VyRGlzY29udCA9IExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfRElTQUJMRTsNCi0gIEFEQ19SRUdfSW5pdFN0cnVjdC0+Q29udGludW91c01vZGUgPSBMTF9BRENfUkVHX0NPTlZfU0lOR0xFOw0KLSAgQURDX1JFR19Jbml0U3RydWN0LT5ETUFUcmFuc2ZlciA9IExMX0FEQ19SRUdfRE1BX1RSQU5TRkVSX05PTkU7DQotICBBRENfUkVHX0luaXRTdHJ1Y3QtPk92ZXJydW4gPSBMTF9BRENfUkVHX09WUl9EQVRBX09WRVJXUklUVEVOOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIEluaXRpYWxpemUgc29tZSBmZWF0dXJlcyBvZiBBREMgZ3JvdXAgaW5qZWN0ZWQuDQotICogQG5vdGUgICBUaGVzZSBwYXJhbWV0ZXJzIGhhdmUgYW4gaW1wYWN0IG9uIEFEQyBzY29wZTogQURDIGdyb3VwIGluamVjdGVkLg0KLSAqICAgICAgICAgUmVmZXIgdG8gY29ycmVzcG9uZGluZyB1bml0YXJ5IGZ1bmN0aW9ucyBpbnRvDQotICogICAgICAgICBAcmVmIEFEQ19MTF9FRl9Db25maWd1cmF0aW9uX0FEQ19Hcm91cF9SZWd1bGFyDQotICogICAgICAgICAoZnVuY3Rpb25zIHdpdGggcHJlZml4ICJJTkoiKS4NCi0gKiBAbm90ZSAgIFRoZSBzZXR0aW5nIG9mIHRoZXNlIHBhcmFtZXRlcnMgYnkgZnVuY3Rpb24gQHJlZiBMTF9BRENfSW5pdCgpDQotICogICAgICAgICBpcyBjb25kaXRpb25lZCB0byBBREMgc3RhdGU6DQotICogICAgICAgICBBREMgaW5zdGFuY2UgbXVzdCBiZSBkaXNhYmxlZC4NCi0gKiAgICAgICAgIFRoaXMgY29uZGl0aW9uIGlzIGFwcGxpZWQgdG8gYWxsIEFEQyBmZWF0dXJlcywgZm9yIGVmZmljaWVuY3kNCi0gKiAgICAgICAgIGFuZCBjb21wYXRpYmlsaXR5IG92ZXIgYWxsIFNUTTMyIGZhbWlsaWVzLiBIb3dldmVyLCB0aGUgZGlmZmVyZW50DQotICogICAgICAgICBmZWF0dXJlcyBjYW4gYmUgc2V0IHVuZGVyIGRpZmZlcmVudCBBREMgc3RhdGUgY29uZGl0aW9ucw0KLSAqICAgICAgICAgKHNldHRpbmcgcG9zc2libGUgd2l0aCBBREMgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcsDQotICogICAgICAgICBBREMgZW5hYmxlZCB3aXRoIGNvbnZlcnNpb24gb24gZ29pbmcsIC4uLikNCi0gKiAgICAgICAgIEVhY2ggZmVhdHVyZSBjYW4gYmUgdXBkYXRlZCBhZnRlcndhcmRzIHdpdGggYSB1bml0YXJ5IGZ1bmN0aW9uDQotICogICAgICAgICBhbmQgcG90ZW50aWFsbHkgd2l0aCBBREMgaW4gYSBkaWZmZXJlbnQgc3RhdGUgdGhhbiBkaXNhYmxlZCwNCi0gKiAgICAgICAgIHJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIGVhY2ggZnVuY3Rpb24gZm9yIHNldHRpbmcNCi0gKiAgICAgICAgIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZS4NCi0gKiBAbm90ZSAgIEFmdGVyIHVzaW5nIHRoaXMgZnVuY3Rpb24sIG90aGVyIGZlYXR1cmVzIG11c3QgYmUgY29uZmlndXJlZA0KLSAqICAgICAgICAgdXNpbmcgTEwgdW5pdGFyeSBmdW5jdGlvbnMuDQotICogICAgICAgICBUaGUgbWluaW11bSBjb25maWd1cmF0aW9uIHJlbWFpbmluZyB0byBiZSBkb25lIGlzOg0KLSAqICAgICAgICAgIC0gU2V0IEFEQyBncm91cCBpbmplY3RlZCBzZXF1ZW5jZXI6DQotICogICAgICAgICAgICBtYXAgY2hhbm5lbCBvbiB0aGUgc2VsZWN0ZWQgc2VxdWVuY2VyIHJhbmsuDQotICogICAgICAgICAgICBSZWZlciB0byBmdW5jdGlvbiBAcmVmIExMX0FEQ19JTkpfU2V0U2VxdWVuY2VyUmFua3MoKS4NCi0gKiAgICAgICAgICAtIFNldCBBREMgY2hhbm5lbCBzYW1wbGluZyB0aW1lDQotICogICAgICAgICAgICBSZWZlciB0byBmdW5jdGlvbiBMTF9BRENfU2V0Q2hhbm5lbFNhbXBsaW5nVGltZSgpOw0KLSAqIEBub3RlICAgQ2F1dGlvbiBpZiBmZWF0dXJlIEFEQyBncm91cCBpbmplY3RlZCBjb250ZXh0cyBxdWV1ZSBpcyBlbmFibGVkDQotICogICAgICAgICAocmVmZXIgdG8gd2l0aCBmdW5jdGlvbiBAcmVmIExMX0FEQ19JTkpfU2V0UXVldWVNb2RlKCkgKToNCi0gKiAgICAgICAgIHVzaW5nIHN1Y2Nlc3NpdmVseSBzZXZlcmFsIHRpbWVzIHRoaXMgZnVuY3Rpb24gd2lsbCBhcHBlYXIgYXMNCi0gKiAgICAgICAgIGhhdmluZyBubyBlZmZlY3QuDQotICogICAgICAgICBUbyBzZXQgc2V2ZXJhbCBmZWF0dXJlcyBvZiBBREMgZ3JvdXAgaW5qZWN0ZWQsIHVzZQ0KLSAqICAgICAgICAgZnVuY3Rpb24gQHJlZiBMTF9BRENfSU5KX0NvbmZpZ1F1ZXVlQ29udGV4dCgpLg0KLSAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UNCi0gKiBAcGFyYW0gIEFEQ19JTkpfSW5pdFN0cnVjdCBQb2ludGVyIHRvIGEgQHJlZiBMTF9BRENfSU5KX0luaXRUeXBlRGVmIHN0cnVjdHVyZQ0KLSAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6DQotICogICAgICAgICAgLSBTVUNDRVNTOiBBREMgcmVnaXN0ZXJzIGFyZSBpbml0aWFsaXplZA0KLSAqICAgICAgICAgIC0gRVJST1I6IEFEQyByZWdpc3RlcnMgYXJlIG5vdCBpbml0aWFsaXplZA0KLSAqLw0KLUVycm9yU3RhdHVzIExMX0FEQ19JTkpfSW5pdChBRENfVHlwZURlZiAqQURDeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfQURDX0lOSl9Jbml0VHlwZURlZiAqQURDX0lOSl9Jbml0U3RydWN0KSB7DQotICBFcnJvclN0YXR1cyBzdGF0dXMgPSBTVUNDRVNTOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKEFEQ3gpKTsNCi0gIGFzc2VydF9wYXJhbSgNCi0gICAgICBJU19MTF9BRENfSU5KX1RSSUdfU09VUkNFKEFEQ3gsIEFEQ19JTkpfSW5pdFN0cnVjdC0+VHJpZ2dlclNvdXJjZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKA0KLSAgICAgIElTX0xMX0FEQ19JTkpfU0VRX1NDQU5fTEVOR1RIKEFEQ19JTkpfSW5pdFN0cnVjdC0+U2VxdWVuY2VyTGVuZ3RoKSk7DQotICBpZiAoQURDX0lOSl9Jbml0U3RydWN0LT5TZXF1ZW5jZXJMZW5ndGggIT0gTExfQURDX0lOSl9TRVFfU0NBTl9ESVNBQkxFKSB7DQotICAgIGFzc2VydF9wYXJhbShJU19MTF9BRENfSU5KX1NFUV9TQ0FOX0RJU0NPTlRfTU9ERSgNCi0gICAgICAgIEFEQ19JTkpfSW5pdFN0cnVjdC0+U2VxdWVuY2VyRGlzY29udCkpOw0KLSAgfQ0KLSAgYXNzZXJ0X3BhcmFtKElTX0xMX0FEQ19JTkpfVFJJR19BVVRPKEFEQ19JTkpfSW5pdFN0cnVjdC0+VHJpZ0F1dG8pKTsNCi0NCi0gIC8qIE5vdGU6IEhhcmR3YXJlIGNvbnN0cmFpbnQgKHJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIHRoaXMgZnVuY3Rpb24pOiAgICAgICAqLw0KLSAgLyogICAgICAgQURDIGluc3RhbmNlIG11c3QgYmUgZGlzYWJsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICBpZiAoTExfQURDX0lzRW5hYmxlZChBREN4KSA9PSAwVUwpIHsNCi0gICAgLyogQ29uZmlndXJhdGlvbiBvZiBBREMgaGllcmFyY2hpY2FsIHNjb3BlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICAvKiAgLSBBREMgZ3JvdXAgaW5qZWN0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIC8qICAgIC0gU2V0IEFEQyBncm91cCBpbmplY3RlZCB0cmlnZ2VyIHNvdXJjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgLyogICAgLSBTZXQgQURDIGdyb3VwIGluamVjdGVkIHNlcXVlbmNlciBsZW5ndGggICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICAvKiAgICAtIFNldCBBREMgZ3JvdXAgaW5qZWN0ZWQgc2VxdWVuY2VyIGRpc2NvbnRpbnVvdXMgbW9kZSAgICAgICAgICAgICAgICovDQotICAgIC8qICAgIC0gU2V0IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXI6IGluZGVwZW5kZW50IG9yICAgICAgICAgKi8NCi0gICAgLyogICAgICBmcm9tIEFEQyBncm91cCByZWd1bGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICAvKiBOb3RlOiBPbiB0aGlzIFNUTTMyIHNlcmllcywgQURDIHRyaWdnZXIgZWRnZSBpcyBzZXQgdG8gdmFsdWUgMHgwIGJ5ICAgICovDQotICAgIC8qICAgICAgIHNldHRpbmcgb2YgdHJpZ2dlciBzb3VyY2UgdG8gU1cgc3RhcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgaWYgKEFEQ19JTkpfSW5pdFN0cnVjdC0+U2VxdWVuY2VyTGVuZ3RoICE9IExMX0FEQ19SRUdfU0VRX1NDQU5fRElTQUJMRSkgew0KLSAgICAgIE1PRElGWV9SRUcoDQotICAgICAgICAgIEFEQ3gtPkNGR1IsIEFEQ19DRkdSX0pESVNDRU4gfCBBRENfQ0ZHUl9KQVVUTywNCi0gICAgICAgICAgQURDX0lOSl9Jbml0U3RydWN0LT5TZXF1ZW5jZXJEaXNjb250IHwgQURDX0lOSl9Jbml0U3RydWN0LT5UcmlnQXV0byk7DQotICAgIH0gZWxzZSB7DQotICAgICAgTU9ESUZZX1JFRyhBREN4LT5DRkdSLCBBRENfQ0ZHUl9KRElTQ0VOIHwgQURDX0NGR1JfSkFVVE8sDQotICAgICAgICAgICAgICAgICBMTF9BRENfUkVHX1NFUV9ESVNDT05UX0RJU0FCTEUgfCBBRENfSU5KX0luaXRTdHJ1Y3QtPlRyaWdBdXRvKTsNCi0gICAgfQ0KLQ0KLSAgICBNT0RJRllfUkVHKEFEQ3gtPkpTUVIsIEFEQ19KU1FSX0pFWFRTRUwgfCBBRENfSlNRUl9KRVhURU4gfCBBRENfSlNRUl9KTCwNCi0gICAgICAgICAgICAgICBBRENfSU5KX0luaXRTdHJ1Y3QtPlRyaWdnZXJTb3VyY2UgfA0KLSAgICAgICAgICAgICAgICAgICBBRENfSU5KX0luaXRTdHJ1Y3QtPlNlcXVlbmNlckxlbmd0aCk7DQotICB9IGVsc2Ugew0KLSAgICAvKiBJbml0aWFsaXphdGlvbiBlcnJvcjogQURDIGluc3RhbmNlIGlzIG5vdCBkaXNhYmxlZC4gKi8NCi0gICAgc3RhdHVzID0gRVJST1I7DQotICB9DQotICByZXR1cm4gc3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFNldCBlYWNoIEByZWYgTExfQURDX0lOSl9Jbml0VHlwZURlZiBmaWVsZCB0byBkZWZhdWx0IHZhbHVlLg0KLSAqIEBwYXJhbSAgQURDX0lOSl9Jbml0U3RydWN0IFBvaW50ZXIgdG8gYSBAcmVmIExMX0FEQ19JTkpfSW5pdFR5cGVEZWYgc3RydWN0dXJlDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hvc2UgZmllbGRzIHdpbGwgYmUgc2V0IHRvIGRlZmF1bHQgdmFsdWVzLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXZvaWQgTExfQURDX0lOSl9TdHJ1Y3RJbml0KExMX0FEQ19JTkpfSW5pdFR5cGVEZWYgKkFEQ19JTkpfSW5pdFN0cnVjdCkgew0KLSAgLyogU2V0IEFEQ19JTkpfSW5pdFN0cnVjdCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMgKi8NCi0gIC8qIFNldCBmaWVsZHMgb2YgQURDIGdyb3VwIGluamVjdGVkICovDQotICBBRENfSU5KX0luaXRTdHJ1Y3QtPlRyaWdnZXJTb3VyY2UgPSBMTF9BRENfSU5KX1RSSUdfU09GVFdBUkU7DQotICBBRENfSU5KX0luaXRTdHJ1Y3QtPlNlcXVlbmNlckxlbmd0aCA9IExMX0FEQ19JTkpfU0VRX1NDQU5fRElTQUJMRTsNCi0gIEFEQ19JTkpfSW5pdFN0cnVjdC0+U2VxdWVuY2VyRGlzY29udCA9IExMX0FEQ19JTkpfU0VRX0RJU0NPTlRfRElTQUJMRTsNCi0gIEFEQ19JTkpfSW5pdFN0cnVjdC0+VHJpZ0F1dG8gPSBMTF9BRENfSU5KX1RSSUdfSU5ERVBFTkRFTlQ7DQotfQ0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotDQotLyoqDQotICogQH0NCi0gKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLSNlbmRpZiAvKiBBREMxIHx8IEFEQzIgfHwgQURDMyB8fCBBREM0IHx8IEFEQzUgKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLSNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8NCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBmaWxlICAgIHN0bTMyZzR4eF9sbF9hZGMuYworICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAqIEBicmllZiAgIEFEQyBMTCBtb2R1bGUgZHJpdmVyCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYXR0ZW50aW9uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0ZXJtcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlCisgKiBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb2Z0d2FyZSBjb21wb25lbnQuCisgKiBJZiBubyBMSUNFTlNFIGZpbGUgY29tZXMgd2l0aCB0aGlzIHNvZnR3YXJlLCBpdCBpcyBwcm92aWRlZCBBUy1JUy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmc0eHhfbGxfYWRjLmgiCisKKyNpbmNsdWRlICJzdG0zMmc0eHhfbGxfYnVzLmgiCisKKyNpZmRlZiBVU0VfRlVMTF9BU1NFUlQKKyNpbmNsdWRlICJzdG0zMl9hc3NlcnQuaCIKKyNlbHNlCisjZGVmaW5lIGFzc2VydF9wYXJhbShleHByKSAoKHZvaWQpMFUpCisjZW5kaWYgLyogVVNFX0ZVTExfQVNTRVJUICovCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkc0eHhfTExfRHJpdmVyCisgKiBAeworICovCisKKyNpZiBkZWZpbmVkKEFEQzEpIHx8IGRlZmluZWQoQURDMikgfHwgZGVmaW5lZChBREMzKSB8fCBkZWZpbmVkKEFEQzQpIHx8IFwKKyAgICBkZWZpbmVkKEFEQzUpCisKKy8qKiBAYWRkdG9ncm91cCBBRENfTEwgQURDCisgKiBAeworICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBBRENfTExfUHJpdmF0ZV9Db25zdGFudHMKKyAqIEB7CisgKi8KKworLyogRGVmaW5pdGlvbnMgb2YgQURDIGhhcmR3YXJlIGNvbnN0cmFpbnRzIGRlbGF5cyAqLworLyogTm90ZTogT25seSBBREMgcGVyaXBoZXJhbCBIVyBkZWxheXMgYXJlIGRlZmluZWQgaW4gQURDIExMIGRyaXZlciBkcml2ZXIsICAgKi8KKy8qICAgICAgIG5vdCB0aW1lb3V0IHZhbHVlczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICBUaW1lb3V0IHZhbHVlcyBmb3IgQURDIG9wZXJhdGlvbnMgYXJlIGRlcGVuZGVudCB0byBkZXZpY2UgY2xvY2sgICAgICAqLworLyogICAgICAgY29uZmlndXJhdGlvbiAoc3lzdGVtIGNsb2NrIHZlcnN1cyBBREMgY2xvY2spLCAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIGFuZCB0aGVyZWZvcmUgbXVzdCBiZSBkZWZpbmVkIGluIHVzZXIgYXBwbGljYXRpb24uICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICBSZWZlciB0byBAcmVmIEFEQ19MTF9FQ19IV19ERUxBWVMgZm9yIGRlc2NyaXB0aW9uIG9mIEFEQyB0aW1lb3V0ICAgICAqLworLyogICAgICAgdmFsdWVzIGRlZmluaXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5vdGU6IEFEQyB0aW1lb3V0IHZhbHVlcyBhcmUgZGVmaW5lZCBoZXJlIGluIENQVSBjeWNsZXMgdG8gYmUgaW5kZXBlbmRlbnQgICovCisvKiAgICAgICBvZiBkZXZpY2UgY2xvY2sgc2V0dGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgSW4gdXNlciBhcHBsaWNhdGlvbiwgQURDIHRpbWVvdXQgdmFsdWVzIHNob3VsZCBiZSBkZWZpbmVkIHdpdGggICAgICAgKi8KKy8qICAgICAgIHRlbXBvcmFsIHZhbHVlcywgaW4gZnVuY3Rpb24gb2YgZGV2aWNlIGNsb2NrIHNldHRpbmdzLiAgICAgICAgICAgICAgICovCisvKiAgICAgICBIaWdoZXN0IHJhdGlvIENQVSBjbG9jayBmcmVxdWVuY3kgdnMgQURDIGNsb2NrIGZyZXF1ZW5jeTogICAgICAgICAgICAqLworLyogICAgICAgIC0gQURDIGNsb2NrIGZyb20gc3luY2hyb25vdXMgY2xvY2sgd2l0aCBBSEIgcHJlc2NhbGVyIDUxMiwgICAgICAgICAgKi8KKy8qICAgICAgICAgIEFEQyBwcmVzY2FsZXIgNC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgUmF0aW8gbWF4ID0gNTEyICo0ID0gMjA0OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgIC0gQURDIGNsb2NrIGZyb20gYXN5bmNocm9ub3VzIGNsb2NrIChQTExQKSB3aXRoIHByZXNjYWxlciAyNTYuICAgICAgKi8KKy8qICAgICAgICAgIEhpZ2hlc3QgQ1BVIGNsb2NrIFBMTCAoUExMUikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgUmF0aW8gbWF4ID0gUExMUm1heCAvUFBMUG1pbiAqIDI1NiA9IChWQ08vMikgLyAoVkNPLzMxKSAqIDI1NiAgICAqLworLyogICAgICAgICAgICAgICAgICAgICA9IDM5NjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFVuaXQ6IENQVSBjeWNsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFEQ19DTE9DS19SQVRJT19WU19DUFVfSElHSEVTVCAoMzk2OFVMKQorI2RlZmluZSBBRENfVElNRU9VVF9ESVNBQkxFX0NQVV9DWUNMRVMgKEFEQ19DTE9DS19SQVRJT19WU19DUFVfSElHSEVTVCAqIDFVTCkKKyNkZWZpbmUgQURDX1RJTUVPVVRfU1RPUF9DT05WRVJTSU9OX0NQVV9DWUNMRVMgXAorICAoQURDX0NMT0NLX1JBVElPX1ZTX0NQVV9ISUdIRVNUICogMVVMKQorCisvKioKKyAqIEB9CisgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBhZGR0b2dyb3VwIEFEQ19MTF9Qcml2YXRlX01hY3JvcworICogQHsKKyAqLworCisvKiBDaGVjayBvZiBwYXJhbWV0ZXJzIGZvciBjb25maWd1cmF0aW9uIG9mIEFEQyBoaWVyYXJjaGljYWwgc2NvcGU6ICAgICAgICAgICAqLworLyogY29tbW9uIHRvIHNldmVyYWwgQURDIGluc3RhbmNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSVNfTExfQURDX0NPTU1PTl9DTE9DSyhfX0NMT0NLX18pICAgICAgICAgIFwKKyAgKCgoX19DTE9DS19fKSA9PSBMTF9BRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjEpIHx8IFwKKyAgICgoX19DTE9DS19fKSA9PSBMTF9BRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjIpIHx8IFwKKyAgICgoX19DTE9DS19fKSA9PSBMTF9BRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjQpIHx8IFwKKyAgICgoX19DTE9DS19fKSA9PSBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMSkgfHwgICAgIFwKKyAgICgoX19DTE9DS19fKSA9PSBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMikgfHwgICAgIFwKKyAgICgoX19DTE9DS19fKSA9PSBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWNCkgfHwgICAgIFwKKyAgICgoX19DTE9DS19fKSA9PSBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWNikgfHwgICAgIFwKKyAgICgoX19DTE9DS19fKSA9PSBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWOCkgfHwgICAgIFwKKyAgICgoX19DTE9DS19fKSA9PSBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMTApIHx8ICAgIFwKKyAgICgoX19DTE9DS19fKSA9PSBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMTIpIHx8ICAgIFwKKyAgICgoX19DTE9DS19fKSA9PSBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMTYpIHx8ICAgIFwKKyAgICgoX19DTE9DS19fKSA9PSBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMzIpIHx8ICAgIFwKKyAgICgoX19DTE9DS19fKSA9PSBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWNjQpIHx8ICAgIFwKKyAgICgoX19DTE9DS19fKSA9PSBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMTI4KSB8fCAgIFwKKyAgICgoX19DTE9DS19fKSA9PSBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMjU2KSkKKworLyogQ2hlY2sgb2YgcGFyYW1ldGVycyBmb3IgY29uZmlndXJhdGlvbiBvZiBBREMgaGllcmFyY2hpY2FsIHNjb3BlOiAgICAgICAgICAgKi8KKy8qIEFEQyBpbnN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElTX0xMX0FEQ19SRVNPTFVUSU9OKF9fUkVTT0xVVElPTl9fKSAgICAgIFwKKyAgKCgoX19SRVNPTFVUSU9OX18pID09IExMX0FEQ19SRVNPTFVUSU9OXzEyQikgfHwgXAorICAgKChfX1JFU09MVVRJT05fXykgPT0gTExfQURDX1JFU09MVVRJT05fMTBCKSB8fCBcCisgICAoKF9fUkVTT0xVVElPTl9fKSA9PSBMTF9BRENfUkVTT0xVVElPTl84QikgfHwgIFwKKyAgICgoX19SRVNPTFVUSU9OX18pID09IExMX0FEQ19SRVNPTFVUSU9OXzZCKSkKKworI2RlZmluZSBJU19MTF9BRENfREFUQV9BTElHTihfX0RBVEFfQUxJR05fXykgICAgICAgIFwKKyAgKCgoX19EQVRBX0FMSUdOX18pID09IExMX0FEQ19EQVRBX0FMSUdOX1JJR0hUKSB8fCBcCisgICAoKF9fREFUQV9BTElHTl9fKSA9PSBMTF9BRENfREFUQV9BTElHTl9MRUZUKSkKKworI2RlZmluZSBJU19MTF9BRENfTE9XX1BPV0VSKF9fTE9XX1BPV0VSX18pICAgICBcCisgICgoKF9fTE9XX1BPV0VSX18pID09IExMX0FEQ19MUF9NT0RFX05PTkUpIHx8IFwKKyAgICgoX19MT1dfUE9XRVJfXykgPT0gTExfQURDX0xQX0FVVE9XQUlUKSkKKworLyogQ2hlY2sgb2YgcGFyYW1ldGVycyBmb3IgY29uZmlndXJhdGlvbiBvZiBBREMgaGllcmFyY2hpY2FsIHNjb3BlOiAgICAgICAgICAgKi8KKy8qIEFEQyBncm91cCByZWd1bGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjaWYgZGVmaW5lZChTVE0zMkc0NzR4eCkgfHwgZGVmaW5lZChTVE0zMkc0ODR4eCkKKyNkZWZpbmUgSVNfTExfQURDX1JFR19UUklHX1NPVVJDRShfX0FEQ19JTlNUQU5DRV9fLCBfX1JFR19UUklHX1NPVVJDRV9fKSBcCisgICgoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19TT0ZUV0FSRSkgfHwgICAgICAgICAgICAgICAgXAorICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfVFJHTykgfHwgICAgICAgICAgIFwKKyAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0xX1RSR08yKSB8fCAgICAgICAgICBcCisgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9DSDMpIHx8ICAgICAgICAgICAgXAorICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTJfVFJHTykgfHwgICAgICAgICAgIFwKKyAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0zX1RSR08pIHx8ICAgICAgICAgICBcCisgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNNF9UUkdPKSB8fCAgICAgICAgICAgXAorICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTZfVFJHTykgfHwgICAgICAgICAgIFwKKyAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU03X1RSR08pIHx8ICAgICAgICAgICBcCisgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNOF9UUkdPKSB8fCAgICAgICAgICAgXAorICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTThfVFJHTzIpIHx8ICAgICAgICAgIFwKKyAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0xNV9UUkdPKSB8fCAgICAgICAgICBcCisgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMjBfVFJHTykgfHwgICAgICAgICAgXAorICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTIwX1RSR08yKSB8fCAgICAgICAgIFwKKyAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0yMF9DSDEpIHx8ICAgICAgICAgICBcCisgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfSFJUSU1fVFJHMSkgfHwgICAgICAgICAgXAorICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX0hSVElNX1RSRzMpIHx8ICAgICAgICAgIFwKKyAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9IUlRJTV9UUkc1KSB8fCAgICAgICAgICBcCisgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfSFJUSU1fVFJHNikgfHwgICAgICAgICAgXAorICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX0hSVElNX1RSRzcpIHx8ICAgICAgICAgIFwKKyAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9IUlRJTV9UUkc4KSB8fCAgICAgICAgICBcCisgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfSFJUSU1fVFJHOSkgfHwgICAgICAgICAgXAorICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX0hSVElNX1RSRzEwKSB8fCAgICAgICAgIFwKKyAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9MUFRJTV9PVVQpIHx8ICAgICAgICAgICBcCisgICAoKCgoX19BRENfSU5TVEFOQ0VfXykgPT0gQURDMSkgfHwgKChfX0FEQ19JTlNUQU5DRV9fKSA9PSBBREMyKSkgJiYgICAgXAorICAgICgoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9DSDEpIHx8ICAgICAgICAgIFwKKyAgICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfQ0gyKSB8fCAgICAgICAgICBcCisgICAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0yX0NIMikgfHwgICAgICAgICAgXAorICAgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNM19DSDQpIHx8ICAgICAgICAgIFwKKyAgICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTRfQ0g0KSB8fCAgICAgICAgICBcCisgICAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0yMF9DSDIpIHx8ICAgICAgICAgXAorICAgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMjBfQ0gzKSB8fCAgICAgICAgIFwKKyAgICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX0VYVElfTElORTExKSkpIHx8ICAgICBcCisgICAoKCgoX19BRENfSU5TVEFOQ0VfXykgPT0gQURDMykgfHwgKChfX0FEQ19JTlNUQU5DRV9fKSA9PSBBREM0KSB8fCAgICAgXAorICAgICAoKF9fQURDX0lOU1RBTkNFX18pID09IEFEQzUpKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTJfQ0gxKSB8fCAgICAgICAgICBcCisgICAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0yX0NIMykgfHwgICAgICAgICAgXAorICAgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNM19DSDEpIHx8ICAgICAgICAgIFwKKyAgICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTRfQ0gxKSB8fCAgICAgICAgICBcCisgICAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU04X0NIMSkgfHwgICAgICAgICAgXAorICAgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfRVhUSV9MSU5FMikgfHwgICAgICAgIFwKKyAgICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX0hSVElNX1RSRzIpIHx8ICAgICAgICBcCisgICAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9IUlRJTV9UUkc0KSkpKQorI2VsaWYgZGVmaW5lZChTVE0zMkc0NzN4eCkgfHwgZGVmaW5lZChTVE0zMkc0ODN4eCkKKyNkZWZpbmUgSVNfTExfQURDX1JFR19UUklHX1NPVVJDRShfX0FEQ19JTlNUQU5DRV9fLCBfX1JFR19UUklHX1NPVVJDRV9fKSBcCisgICgoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19TT0ZUV0FSRSkgfHwgICAgICAgICAgICAgICAgXAorICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfVFJHTykgfHwgICAgICAgICAgIFwKKyAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0xX1RSR08yKSB8fCAgICAgICAgICBcCisgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9DSDMpIHx8ICAgICAgICAgICAgXAorICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTJfVFJHTykgfHwgICAgICAgICAgIFwKKyAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0yX0NIMikgfHwgICAgICAgICAgICBcCisgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNM19UUkdPKSB8fCAgICAgICAgICAgXAorICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTRfVFJHTykgfHwgICAgICAgICAgIFwKKyAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU02X1RSR08pIHx8ICAgICAgICAgICBcCisgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNN19UUkdPKSB8fCAgICAgICAgICAgXAorICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTThfVFJHTykgfHwgICAgICAgICAgIFwKKyAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU04X1RSR08yKSB8fCAgICAgICAgICBcCisgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMTVfVFJHTykgfHwgICAgICAgICAgXAorICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTIwX1RSR08pIHx8ICAgICAgICAgIFwKKyAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0yMF9UUkdPMikgfHwgICAgICAgICBcCisgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMjBfQ0gxKSB8fCAgICAgICAgICAgXAorICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX0xQVElNX09VVCkgfHwgICAgICAgICAgIFwKKyAgICgoKChfX0FEQ19JTlNUQU5DRV9fKSA9PSBBREMxKSB8fCAoKF9fQURDX0lOU1RBTkNFX18pID09IEFEQzIpKSAmJiAgICBcCisgICAgKCgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0xX0NIMSkgfHwgICAgICAgICAgXAorICAgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9DSDIpIHx8ICAgICAgICAgIFwKKyAgICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTJfQ0gyKSB8fCAgICAgICAgICBcCisgICAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0zX0NINCkgfHwgICAgICAgICAgXAorICAgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNNF9DSDQpIHx8ICAgICAgICAgIFwKKyAgICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTIwX0NIMikgfHwgICAgICAgICBcCisgICAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0yMF9DSDMpIHx8ICAgICAgICAgXAorICAgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfRVhUSV9MSU5FMTEpKSkgfHwgICAgIFwKKyAgICgoKChfX0FEQ19JTlNUQU5DRV9fKSA9PSBBREMzKSB8fCAoKF9fQURDX0lOU1RBTkNFX18pID09IEFEQzQpIHx8ICAgICBcCisgICAgICgoX19BRENfSU5TVEFOQ0VfXykgPT0gQURDNSkpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMl9DSDEpIHx8ICAgICAgICAgIFwKKyAgICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTJfQ0gzKSB8fCAgICAgICAgICBcCisgICAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0zX0NIMSkgfHwgICAgICAgICAgXAorICAgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNNF9DSDEpIHx8ICAgICAgICAgIFwKKyAgICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTThfQ0gxKSB8fCAgICAgICAgICBcCisgICAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9FWFRJX0xJTkUyKSkpKQorI2VsaWYgZGVmaW5lZChTVE0zMkc0NzF4eCkKKyNkZWZpbmUgSVNfTExfQURDX1JFR19UUklHX1NPVVJDRShfX0FEQ19JTlNUQU5DRV9fLCBfX1JFR19UUklHX1NPVVJDRV9fKSBcCisgICgoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19TT0ZUV0FSRSkgfHwgICAgICAgICAgICAgICAgXAorICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfVFJHTykgfHwgICAgICAgICAgIFwKKyAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0xX1RSR08yKSB8fCAgICAgICAgICBcCisgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9DSDMpIHx8ICAgICAgICAgICAgXAorICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTJfVFJHTykgfHwgICAgICAgICAgIFwKKyAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0yX0NIMikgfHwgICAgICAgICAgICBcCisgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNM19UUkdPKSB8fCAgICAgICAgICAgXAorICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTRfVFJHTykgfHwgICAgICAgICAgIFwKKyAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU02X1RSR08pIHx8ICAgICAgICAgICBcCisgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNN19UUkdPKSB8fCAgICAgICAgICAgXAorICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTThfVFJHTykgfHwgICAgICAgICAgIFwKKyAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU04X1RSR08yKSB8fCAgICAgICAgICBcCisgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMTVfVFJHTykgfHwgICAgICAgICAgXAorICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX0xQVElNX09VVCkgfHwgICAgICAgICAgIFwKKyAgICgoKChfX0FEQ19JTlNUQU5DRV9fKSA9PSBBREMxKSB8fCAoKF9fQURDX0lOU1RBTkNFX18pID09IEFEQzIpKSAmJiAgICBcCisgICAgKCgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0xX0NIMSkgfHwgICAgICAgICAgXAorICAgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9DSDIpIHx8ICAgICAgICAgIFwKKyAgICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTJfQ0gyKSB8fCAgICAgICAgICBcCisgICAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0zX0NINCkgfHwgICAgICAgICAgXAorICAgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNNF9DSDQpIHx8ICAgICAgICAgIFwKKyAgICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX0VYVElfTElORTExKSkpIHx8ICAgICBcCisgICAoKChfX0FEQ19JTlNUQU5DRV9fKSA9PSBBREMzKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMl9DSDEpIHx8ICAgICAgICAgIFwKKyAgICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTJfQ0gzKSB8fCAgICAgICAgICBcCisgICAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0zX0NIMSkgfHwgICAgICAgICAgXAorICAgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNNF9DSDEpIHx8ICAgICAgICAgIFwKKyAgICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTThfQ0gxKSB8fCAgICAgICAgICBcCisgICAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9FWFRJX0xJTkUyKSkpKQorI2VsaWYgZGVmaW5lZChTVE0zMkc0MTF4QikgfHwgZGVmaW5lZChTVE0zMkc0MTF4QykgfHwgZGVmaW5lZChTVE0zMkc0MTR4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJHQksxQ0IpIHx8IGRlZmluZWQoU1RNMzJHNDMxeHgpIHx8IGRlZmluZWQoU1RNMzJHNDQxeHgpCisjZGVmaW5lIElTX0xMX0FEQ19SRUdfVFJJR19TT1VSQ0UoX19BRENfSU5TVEFOQ0VfXywgX19SRUdfVFJJR19TT1VSQ0VfXykgXAorICAoKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfU09GVFdBUkUpIHx8ICAgICAgICAgICAgICAgIFwKKyAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0xX1RSR08pIHx8ICAgICAgICAgICBcCisgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9UUkdPMikgfHwgICAgICAgICAgXAorICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfQ0gxKSB8fCAgICAgICAgICAgIFwKKyAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0xX0NIMikgfHwgICAgICAgICAgICBcCisgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9DSDMpIHx8ICAgICAgICAgICAgXAorICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTJfVFJHTykgfHwgICAgICAgICAgIFwKKyAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0yX0NIMikgfHwgICAgICAgICAgICBcCisgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNM19UUkdPKSB8fCAgICAgICAgICAgXAorICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTNfQ0g0KSB8fCAgICAgICAgICAgIFwKKyAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU00X1RSR08pIHx8ICAgICAgICAgICBcCisgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNNF9DSDQpIHx8ICAgICAgICAgICAgXAorICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTZfVFJHTykgfHwgICAgICAgICAgIFwKKyAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU03X1RSR08pIHx8ICAgICAgICAgICBcCisgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNOF9UUkdPKSB8fCAgICAgICAgICAgXAorICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTThfVFJHTzIpIHx8ICAgICAgICAgIFwKKyAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0xNV9UUkdPKSB8fCAgICAgICAgICBcCisgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfTFBUSU1fT1VUKSB8fCAgICAgICAgICAgXAorICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX0VYVElfTElORTExKSkKKyNlbGlmIGRlZmluZWQoU1RNMzJHNDkxeHgpIHx8IGRlZmluZWQoU1RNMzJHNEExeHgpCisjZGVmaW5lIElTX0xMX0FEQ19SRUdfVFJJR19TT1VSQ0UoX19BRENfSU5TVEFOQ0VfXywgX19SRUdfVFJJR19TT1VSQ0VfXykgXAorICAoKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfU09GVFdBUkUpIHx8ICAgICAgICAgICAgICAgIFwKKyAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0xX1RSR08pIHx8ICAgICAgICAgICBcCisgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9UUkdPMikgfHwgICAgICAgICAgXAorICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfQ0gzKSB8fCAgICAgICAgICAgIFwKKyAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0yX1RSR08pIHx8ICAgICAgICAgICBcCisgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNM19UUkdPKSB8fCAgICAgICAgICAgXAorICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTRfVFJHTykgfHwgICAgICAgICAgIFwKKyAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU02X1RSR08pIHx8ICAgICAgICAgICBcCisgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNN19UUkdPKSB8fCAgICAgICAgICAgXAorICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTThfVFJHTykgfHwgICAgICAgICAgIFwKKyAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU04X1RSR08yKSB8fCAgICAgICAgICBcCisgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMTVfVFJHTykgfHwgICAgICAgICAgXAorICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTIwX1RSR08pIHx8ICAgICAgICAgIFwKKyAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0yMF9UUkdPMikgfHwgICAgICAgICBcCisgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMjBfQ0gxKSB8fCAgICAgICAgICAgXAorICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX0xQVElNX09VVCkgfHwgICAgICAgICAgIFwKKyAgICgoKChfX0FEQ19JTlNUQU5DRV9fKSA9PSBBREMxKSB8fCAoKF9fQURDX0lOU1RBTkNFX18pID09IEFEQzIpKSAmJiAgICBcCisgICAgKCgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0xX0NIMSkgfHwgICAgICAgICAgXAorICAgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9DSDIpIHx8ICAgICAgICAgIFwKKyAgICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTJfQ0gyKSB8fCAgICAgICAgICBcCisgICAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0zX0NINCkgfHwgICAgICAgICAgXAorICAgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNNF9DSDQpIHx8ICAgICAgICAgIFwKKyAgICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTIwX0NIMikgfHwgICAgICAgICBcCisgICAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0yMF9DSDMpIHx8ICAgICAgICAgXAorICAgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfRVhUSV9MSU5FMTEpKSkgfHwgICAgIFwKKyAgICgoKF9fQURDX0lOU1RBTkNFX18pID09IEFEQzMpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0yX0NIMSkgfHwgICAgICAgICAgXAorICAgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMl9DSDMpIHx8ICAgICAgICAgIFwKKyAgICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTNfQ0gxKSB8fCAgICAgICAgICBcCisgICAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU00X0NIMSkgfHwgICAgICAgICAgXAorICAgICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNOF9DSDEpIHx8ICAgICAgICAgIFwKKyAgICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX0VYVElfTElORTIpKSkpCisjZW5kaWYgLyogU1RNMzJHNHh4ICovCisKKyNkZWZpbmUgSVNfTExfQURDX1JFR19DT05USU5VT1VTX01PREUoX19SRUdfQ09OVElOVU9VU19NT0RFX18pIFwKKyAgKCgoX19SRUdfQ09OVElOVU9VU19NT0RFX18pID09IExMX0FEQ19SRUdfQ09OVl9TSU5HTEUpIHx8ICAgIFwKKyAgICgoX19SRUdfQ09OVElOVU9VU19NT0RFX18pID09IExMX0FEQ19SRUdfQ09OVl9DT05USU5VT1VTKSkKKworI2RlZmluZSBJU19MTF9BRENfUkVHX0RNQV9UUkFOU0ZFUihfX1JFR19ETUFfVFJBTlNGRVJfXykgICAgICAgICAgXAorICAoKChfX1JFR19ETUFfVFJBTlNGRVJfXykgPT0gTExfQURDX1JFR19ETUFfVFJBTlNGRVJfTk9ORSkgfHwgICAgXAorICAgKChfX1JFR19ETUFfVFJBTlNGRVJfXykgPT0gTExfQURDX1JFR19ETUFfVFJBTlNGRVJfTElNSVRFRCkgfHwgXAorICAgKChfX1JFR19ETUFfVFJBTlNGRVJfXykgPT0gTExfQURDX1JFR19ETUFfVFJBTlNGRVJfVU5MSU1JVEVEKSkKKworI2RlZmluZSBJU19MTF9BRENfUkVHX09WUl9EQVRBX0JFSEFWSU9SKF9fUkVHX09WUl9EQVRBX0JFSEFWSU9SX18pICAgXAorICAoKChfX1JFR19PVlJfREFUQV9CRUhBVklPUl9fKSA9PSBMTF9BRENfUkVHX09WUl9EQVRBX1BSRVNFUlZFRCkgfHwgXAorICAgKChfX1JFR19PVlJfREFUQV9CRUhBVklPUl9fKSA9PSBMTF9BRENfUkVHX09WUl9EQVRBX09WRVJXUklUVEVOKSkKKworI2RlZmluZSBJU19MTF9BRENfUkVHX1NFUV9TQ0FOX0xFTkdUSChfX1JFR19TRVFfU0NBTl9MRU5HVEhfXykgICAgICAgICAgXAorICAoKChfX1JFR19TRVFfU0NBTl9MRU5HVEhfXykgPT0gTExfQURDX1JFR19TRVFfU0NBTl9ESVNBQkxFKSB8fCAgICAgICAgXAorICAgKChfX1JFR19TRVFfU0NBTl9MRU5HVEhfXykgPT0gTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMlJBTktTKSB8fCAgXAorICAgKChfX1JFR19TRVFfU0NBTl9MRU5HVEhfXykgPT0gTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfM1JBTktTKSB8fCAgXAorICAgKChfX1JFR19TRVFfU0NBTl9MRU5HVEhfXykgPT0gTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfNFJBTktTKSB8fCAgXAorICAgKChfX1JFR19TRVFfU0NBTl9MRU5HVEhfXykgPT0gTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfNVJBTktTKSB8fCAgXAorICAgKChfX1JFR19TRVFfU0NBTl9MRU5HVEhfXykgPT0gTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfNlJBTktTKSB8fCAgXAorICAgKChfX1JFR19TRVFfU0NBTl9MRU5HVEhfXykgPT0gTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfN1JBTktTKSB8fCAgXAorICAgKChfX1JFR19TRVFfU0NBTl9MRU5HVEhfXykgPT0gTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfOFJBTktTKSB8fCAgXAorICAgKChfX1JFR19TRVFfU0NBTl9MRU5HVEhfXykgPT0gTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfOVJBTktTKSB8fCAgXAorICAgKChfX1JFR19TRVFfU0NBTl9MRU5HVEhfXykgPT0gTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMTBSQU5LUykgfHwgXAorICAgKChfX1JFR19TRVFfU0NBTl9MRU5HVEhfXykgPT0gTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMTFSQU5LUykgfHwgXAorICAgKChfX1JFR19TRVFfU0NBTl9MRU5HVEhfXykgPT0gTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMTJSQU5LUykgfHwgXAorICAgKChfX1JFR19TRVFfU0NBTl9MRU5HVEhfXykgPT0gTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMTNSQU5LUykgfHwgXAorICAgKChfX1JFR19TRVFfU0NBTl9MRU5HVEhfXykgPT0gTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMTRSQU5LUykgfHwgXAorICAgKChfX1JFR19TRVFfU0NBTl9MRU5HVEhfXykgPT0gTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMTVSQU5LUykgfHwgXAorICAgKChfX1JFR19TRVFfU0NBTl9MRU5HVEhfXykgPT0gTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMTZSQU5LUykpCisKKyNkZWZpbmUgSVNfTExfQURDX1JFR19TRVFfU0NBTl9ESVNDT05UX01PREUoX19SRUdfU0VRX0RJU0NPTlRfTU9ERV9fKSBcCisgICgoKF9fUkVHX1NFUV9ESVNDT05UX01PREVfXykgPT0gTExfQURDX1JFR19TRVFfRElTQ09OVF9ESVNBQkxFKSB8fCAgXAorICAgKChfX1JFR19TRVFfRElTQ09OVF9NT0RFX18pID09IExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfMVJBTkspIHx8ICAgIFwKKyAgICgoX19SRUdfU0VRX0RJU0NPTlRfTU9ERV9fKSA9PSBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzJSQU5LUykgfHwgICBcCisgICAoKF9fUkVHX1NFUV9ESVNDT05UX01PREVfXykgPT0gTExfQURDX1JFR19TRVFfRElTQ09OVF8zUkFOS1MpIHx8ICAgXAorICAgKChfX1JFR19TRVFfRElTQ09OVF9NT0RFX18pID09IExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfNFJBTktTKSB8fCAgIFwKKyAgICgoX19SRUdfU0VRX0RJU0NPTlRfTU9ERV9fKSA9PSBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzVSQU5LUykgfHwgICBcCisgICAoKF9fUkVHX1NFUV9ESVNDT05UX01PREVfXykgPT0gTExfQURDX1JFR19TRVFfRElTQ09OVF82UkFOS1MpIHx8ICAgXAorICAgKChfX1JFR19TRVFfRElTQ09OVF9NT0RFX18pID09IExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfN1JBTktTKSB8fCAgIFwKKyAgICgoX19SRUdfU0VRX0RJU0NPTlRfTU9ERV9fKSA9PSBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzhSQU5LUykpCisKKy8qIENoZWNrIG9mIHBhcmFtZXRlcnMgZm9yIGNvbmZpZ3VyYXRpb24gb2YgQURDIGhpZXJhcmNoaWNhbCBzY29wZTogICAgICAgICAgICovCisvKiBBREMgZ3JvdXAgaW5qZWN0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2lmIGRlZmluZWQoU1RNMzJHNDc0eHgpIHx8IGRlZmluZWQoU1RNMzJHNDg0eHgpCisjZGVmaW5lIElTX0xMX0FEQ19JTkpfVFJJR19TT1VSQ0UoX19BRENfSU5TVEFOQ0VfXywgX19JTkpfVFJJR19TT1VSQ0VfXykgXAorICAoKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfU09GVFdBUkUpIHx8ICAgICAgICAgICAgICAgIFwKKyAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0xX1RSR08pIHx8ICAgICAgICAgICBcCisgICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNMV9UUkdPMikgfHwgICAgICAgICAgXAorICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTFfQ0g0KSB8fCAgICAgICAgICAgIFwKKyAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0yX1RSR08pIHx8ICAgICAgICAgICBcCisgICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNM19UUkdPKSB8fCAgICAgICAgICAgXAorICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTRfVFJHTykgfHwgICAgICAgICAgIFwKKyAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU02X1RSR08pIHx8ICAgICAgICAgICBcCisgICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNN19UUkdPKSB8fCAgICAgICAgICAgXAorICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTThfVFJHTykgfHwgICAgICAgICAgIFwKKyAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU04X1RSR08yKSB8fCAgICAgICAgICBcCisgICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNOF9DSDQpIHx8ICAgICAgICAgICAgXAorICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTE1X1RSR08pIHx8ICAgICAgICAgIFwKKyAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0yMF9UUkdPKSB8fCAgICAgICAgICBcCisgICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNMjBfVFJHTzIpIHx8ICAgICAgICAgXAorICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX0hSVElNX1RSRzIpIHx8ICAgICAgICAgIFwKKyAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9IUlRJTV9UUkc0KSB8fCAgICAgICAgICBcCisgICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfSFJUSU1fVFJHNSkgfHwgICAgICAgICAgXAorICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX0hSVElNX1RSRzYpIHx8ICAgICAgICAgIFwKKyAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9IUlRJTV9UUkc3KSB8fCAgICAgICAgICBcCisgICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfSFJUSU1fVFJHOCkgfHwgICAgICAgICAgXAorICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX0hSVElNX1RSRzkpIHx8ICAgICAgICAgIFwKKyAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9IUlRJTV9UUkcxMCkgfHwgICAgICAgICBcCisgICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfTFBUSU1fT1VUKSB8fCAgICAgICAgICAgXAorICAgKCgoKF9fQURDX0lOU1RBTkNFX18pID09IEFEQzEpIHx8ICgoX19BRENfSU5TVEFOQ0VfXykgPT0gQURDMikpICYmICAgIFwKKyAgICAoKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTJfQ0gxKSB8fCAgICAgICAgICBcCisgICAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0zX0NIMSkgfHwgICAgICAgICAgXAorICAgICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNM19DSDMpIHx8ICAgICAgICAgIFwKKyAgICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTNfQ0g0KSB8fCAgICAgICAgICBcCisgICAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0xNl9DSDEpIHx8ICAgICAgICAgXAorICAgICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNMjBfQ0g0KSB8fCAgICAgICAgIFwKKyAgICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX0VYVElfTElORTE1KSkpIHx8ICAgICBcCisgICAoKCgoX19BRENfSU5TVEFOQ0VfXykgPT0gQURDMykgfHwgKChfX0FEQ19JTlNUQU5DRV9fKSA9PSBBREM0KSB8fCAgICAgXAorICAgICAoKF9fQURDX0lOU1RBTkNFX18pID09IEFEQzUpKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTFfQ0gzKSB8fCAgICAgICAgICBcCisgICAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU00X0NIMykgfHwgICAgICAgICAgXAorICAgICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNNF9DSDQpIHx8ICAgICAgICAgIFwKKyAgICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTThfQ0gyKSB8fCAgICAgICAgICBcCisgICAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0yMF9DSDIpIHx8ICAgICAgICAgXAorICAgICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfSFJUSU1fVFJHMSkgfHwgICAgICAgIFwKKyAgICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX0hSVElNX1RSRzMpIHx8ICAgICAgICBcCisgICAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9FWFRJX0xJTkUzKSkpKQorI2VsaWYgZGVmaW5lZChTVE0zMkc0NzN4eCkgfHwgZGVmaW5lZChTVE0zMkc0ODN4eCkKKyNkZWZpbmUgSVNfTExfQURDX0lOSl9UUklHX1NPVVJDRShfX0FEQ19JTlNUQU5DRV9fLCBfX0lOSl9UUklHX1NPVVJDRV9fKSBcCisgICgoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19TT0ZUV0FSRSkgfHwgICAgICAgICAgICAgICAgXAorICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTFfVFJHTykgfHwgICAgICAgICAgIFwKKyAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0xX1RSR08yKSB8fCAgICAgICAgICBcCisgICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNMV9DSDQpIHx8ICAgICAgICAgICAgXAorICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTJfVFJHTykgfHwgICAgICAgICAgIFwKKyAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0zX1RSR08pIHx8ICAgICAgICAgICBcCisgICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNNF9UUkdPKSB8fCAgICAgICAgICAgXAorICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTZfVFJHTykgfHwgICAgICAgICAgIFwKKyAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU03X1RSR08pIHx8ICAgICAgICAgICBcCisgICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNOF9UUkdPKSB8fCAgICAgICAgICAgXAorICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTThfVFJHTzIpIHx8ICAgICAgICAgIFwKKyAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU04X0NINCkgfHwgICAgICAgICAgICBcCisgICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNMTVfVFJHTykgfHwgICAgICAgICAgXAorICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTIwX1RSR08pIHx8ICAgICAgICAgIFwKKyAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0yMF9UUkdPMikgfHwgICAgICAgICBcCisgICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfTFBUSU1fT1VUKSB8fCAgICAgICAgICAgXAorICAgKCgoKF9fQURDX0lOU1RBTkNFX18pID09IEFEQzEpIHx8ICgoX19BRENfSU5TVEFOQ0VfXykgPT0gQURDMikpICYmICAgIFwKKyAgICAoKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTJfQ0gxKSB8fCAgICAgICAgICBcCisgICAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0zX0NIMSkgfHwgICAgICAgICAgXAorICAgICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNM19DSDMpIHx8ICAgICAgICAgIFwKKyAgICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTNfQ0g0KSB8fCAgICAgICAgICBcCisgICAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0xNl9DSDEpIHx8ICAgICAgICAgXAorICAgICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNMjBfQ0g0KSB8fCAgICAgICAgIFwKKyAgICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX0VYVElfTElORTE1KSkpIHx8ICAgICBcCisgICAoKCgoX19BRENfSU5TVEFOQ0VfXykgPT0gQURDMykgfHwgKChfX0FEQ19JTlNUQU5DRV9fKSA9PSBBREM0KSB8fCAgICAgXAorICAgICAoKF9fQURDX0lOU1RBTkNFX18pID09IEFEQzUpKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTFfQ0gzKSB8fCAgICAgICAgICBcCisgICAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU00X0NIMykgfHwgICAgICAgICAgXAorICAgICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNNF9DSDQpIHx8ICAgICAgICAgIFwKKyAgICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTThfQ0gyKSB8fCAgICAgICAgICBcCisgICAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0yMF9DSDIpIHx8ICAgICAgICAgXAorICAgICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfRVhUSV9MSU5FMykpKSkKKyNlbGlmIGRlZmluZWQoU1RNMzJHNDcxeHgpCisjZGVmaW5lIElTX0xMX0FEQ19JTkpfVFJJR19TT1VSQ0UoX19BRENfSU5TVEFOQ0VfXywgX19JTkpfVFJJR19TT1VSQ0VfXykgXAorICAoKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfU09GVFdBUkUpIHx8ICAgICAgICAgICAgICAgIFwKKyAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0xX1RSR08pIHx8ICAgICAgICAgICBcCisgICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNMV9UUkdPMikgfHwgICAgICAgICAgXAorICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTFfQ0g0KSB8fCAgICAgICAgICAgIFwKKyAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0yX1RSR08pIHx8ICAgICAgICAgICBcCisgICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNM19UUkdPKSB8fCAgICAgICAgICAgXAorICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTRfVFJHTykgfHwgICAgICAgICAgIFwKKyAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU02X1RSR08pIHx8ICAgICAgICAgICBcCisgICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNN19UUkdPKSB8fCAgICAgICAgICAgXAorICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTThfVFJHTykgfHwgICAgICAgICAgIFwKKyAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU04X1RSR08yKSB8fCAgICAgICAgICBcCisgICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNOF9DSDQpIHx8ICAgICAgICAgICAgXAorICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTE1X1RSR08pIHx8ICAgICAgICAgIFwKKyAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9MUFRJTV9PVVQpIHx8ICAgICAgICAgICBcCisgICAoKCgoX19BRENfSU5TVEFOQ0VfXykgPT0gQURDMSkgfHwgKChfX0FEQ19JTlNUQU5DRV9fKSA9PSBBREMyKSkgJiYgICAgXAorICAgICgoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNMl9DSDEpIHx8ICAgICAgICAgIFwKKyAgICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTNfQ0gxKSB8fCAgICAgICAgICBcCisgICAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0zX0NIMykgfHwgICAgICAgICAgXAorICAgICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNM19DSDQpIHx8ICAgICAgICAgIFwKKyAgICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTE2X0NIMSkgfHwgICAgICAgICBcCisgICAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9FWFRJX0xJTkUxNSkpKSB8fCAgICAgXAorICAgKCgoKF9fQURDX0lOU1RBTkNFX18pID09IEFEQzMpKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTFfQ0gzKSB8fCAgICAgICAgICBcCisgICAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU00X0NIMykgfHwgICAgICAgICAgXAorICAgICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNNF9DSDQpIHx8ICAgICAgICAgIFwKKyAgICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTThfQ0gyKSB8fCAgICAgICAgICBcCisgICAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9FWFRJX0xJTkUzKSkpKQorI2VsaWYgZGVmaW5lZChTVE0zMkc0MTF4QikgfHwgZGVmaW5lZChTVE0zMkc0MTF4QykgfHwgZGVmaW5lZChTVE0zMkc0MTR4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJHQksxQ0IpIHx8IGRlZmluZWQoU1RNMzJHNDMxeHgpIHx8IGRlZmluZWQoU1RNMzJHNDQxeHgpCisjZGVmaW5lIElTX0xMX0FEQ19JTkpfVFJJR19TT1VSQ0UoX19BRENfSU5TVEFOQ0VfXywgX19JTkpfVFJJR19TT1VSQ0VfXykgXAorICAoKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfU09GVFdBUkUpIHx8ICAgICAgICAgICAgICAgIFwKKyAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0xX1RSR08pIHx8ICAgICAgICAgICBcCisgICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNMV9UUkdPMikgfHwgICAgICAgICAgXAorICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTFfQ0g0KSB8fCAgICAgICAgICAgIFwKKyAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0yX1RSR08pIHx8ICAgICAgICAgICBcCisgICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNMl9DSDEpIHx8ICAgICAgICAgICAgXAorICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTNfVFJHTykgfHwgICAgICAgICAgIFwKKyAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0zX0NIMSkgfHwgICAgICAgICAgICBcCisgICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNM19DSDMpIHx8ICAgICAgICAgICAgXAorICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTNfQ0g0KSB8fCAgICAgICAgICAgIFwKKyAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU00X1RSR08pIHx8ICAgICAgICAgICBcCisgICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNNl9UUkdPKSB8fCAgICAgICAgICAgXAorICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTdfVFJHTykgfHwgICAgICAgICAgIFwKKyAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU04X1RSR08pIHx8ICAgICAgICAgICBcCisgICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNOF9UUkdPMikgfHwgICAgICAgICAgXAorICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTThfQ0g0KSB8fCAgICAgICAgICAgIFwKKyAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0xNV9UUkdPKSB8fCAgICAgICAgICBcCisgICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNMTZfQ0gxKSB8fCAgICAgICAgICAgXAorICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX0xQVElNX09VVCkgfHwgICAgICAgICAgIFwKKyAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9FWFRJX0xJTkUxNSkpCisjZWxpZiBkZWZpbmVkKFNUTTMyRzQ5MXh4KSB8fCBkZWZpbmVkKFNUTTMyRzRBMXh4KQorI2RlZmluZSBJU19MTF9BRENfSU5KX1RSSUdfU09VUkNFKF9fQURDX0lOU1RBTkNFX18sIF9fSU5KX1RSSUdfU09VUkNFX18pIFwKKyAgKCgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX1NPRlRXQVJFKSB8fCAgICAgICAgICAgICAgICBcCisgICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNMV9UUkdPKSB8fCAgICAgICAgICAgXAorICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTFfVFJHTzIpIHx8ICAgICAgICAgIFwKKyAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0xX0NINCkgfHwgICAgICAgICAgICBcCisgICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNMl9UUkdPKSB8fCAgICAgICAgICAgXAorICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTNfVFJHTykgfHwgICAgICAgICAgIFwKKyAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU00X1RSR08pIHx8ICAgICAgICAgICBcCisgICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNNl9UUkdPKSB8fCAgICAgICAgICAgXAorICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTdfVFJHTykgfHwgICAgICAgICAgIFwKKyAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU04X1RSR08pIHx8ICAgICAgICAgICBcCisgICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNOF9UUkdPMikgfHwgICAgICAgICAgXAorICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTThfQ0g0KSB8fCAgICAgICAgICAgIFwKKyAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0xNV9UUkdPKSB8fCAgICAgICAgICBcCisgICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNMjBfVFJHTykgfHwgICAgICAgICAgXAorICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTIwX1RSR08yKSB8fCAgICAgICAgIFwKKyAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9MUFRJTV9PVVQpIHx8ICAgICAgICAgICBcCisgICAoKCgoX19BRENfSU5TVEFOQ0VfXykgPT0gQURDMSkgfHwgKChfX0FEQ19JTlNUQU5DRV9fKSA9PSBBREMyKSkgJiYgICAgXAorICAgICgoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNMl9DSDEpIHx8ICAgICAgICAgIFwKKyAgICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTNfQ0gxKSB8fCAgICAgICAgICBcCisgICAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0zX0NIMykgfHwgICAgICAgICAgXAorICAgICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNM19DSDQpIHx8ICAgICAgICAgIFwKKyAgICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTE2X0NIMSkgfHwgICAgICAgICBcCisgICAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0yMF9DSDQpIHx8ICAgICAgICAgXAorICAgICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfRVhUSV9MSU5FMTUpKSkgfHwgICAgIFwKKyAgICgoKChfX0FEQ19JTlNUQU5DRV9fKSA9PSBBREMzKSkgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0xX0NIMykgfHwgICAgICAgICAgXAorICAgICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNNF9DSDMpIHx8ICAgICAgICAgIFwKKyAgICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTRfQ0g0KSB8fCAgICAgICAgICBcCisgICAgICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU04X0NIMikgfHwgICAgICAgICAgXAorICAgICAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNMjBfQ0gyKSB8fCAgICAgICAgIFwKKyAgICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX0VYVElfTElORTMpKSkpCisjZW5kaWYgLyogU1RNMzJHNHh4ICovCisKKyNkZWZpbmUgSVNfTExfQURDX0lOSl9UUklHX0VYVF9FREdFKF9fSU5KX1RSSUdfRVhUX0VER0VfXykgICAgIFwKKyAgKCgoX19JTkpfVFJJR19FWFRfRURHRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1JJU0lORykgfHwgIFwKKyAgICgoX19JTkpfVFJJR19FWFRfRURHRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX0ZBTExJTkcpIHx8IFwKKyAgICgoX19JTkpfVFJJR19FWFRfRURHRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1JJU0lOR0ZBTExJTkcpKQorCisjZGVmaW5lIElTX0xMX0FEQ19JTkpfVFJJR19BVVRPKF9fSU5KX1RSSUdfQVVUT19fKSAgICAgICAgIFwKKyAgKCgoX19JTkpfVFJJR19BVVRPX18pID09IExMX0FEQ19JTkpfVFJJR19JTkRFUEVOREVOVCkgfHwgXAorICAgKChfX0lOSl9UUklHX0FVVE9fXykgPT0gTExfQURDX0lOSl9UUklHX0ZST01fR1JQX1JFR1VMQVIpKQorCisjZGVmaW5lIElTX0xMX0FEQ19JTkpfU0VRX1NDQU5fTEVOR1RIKF9fSU5KX1NFUV9TQ0FOX0xFTkdUSF9fKSAgICAgICAgIFwKKyAgKCgoX19JTkpfU0VRX1NDQU5fTEVOR1RIX18pID09IExMX0FEQ19JTkpfU0VRX1NDQU5fRElTQUJMRSkgfHwgICAgICAgXAorICAgKChfX0lOSl9TRVFfU0NBTl9MRU5HVEhfXykgPT0gTExfQURDX0lOSl9TRVFfU0NBTl9FTkFCTEVfMlJBTktTKSB8fCBcCisgICAoKF9fSU5KX1NFUV9TQ0FOX0xFTkdUSF9fKSA9PSBMTF9BRENfSU5KX1NFUV9TQ0FOX0VOQUJMRV8zUkFOS1MpIHx8IFwKKyAgICgoX19JTkpfU0VRX1NDQU5fTEVOR1RIX18pID09IExMX0FEQ19JTkpfU0VRX1NDQU5fRU5BQkxFXzRSQU5LUykpCisKKyNkZWZpbmUgSVNfTExfQURDX0lOSl9TRVFfU0NBTl9ESVNDT05UX01PREUoX19JTkpfU0VRX0RJU0NPTlRfTU9ERV9fKSBcCisgICgoKF9fSU5KX1NFUV9ESVNDT05UX01PREVfXykgPT0gTExfQURDX0lOSl9TRVFfRElTQ09OVF9ESVNBQkxFKSB8fCAgXAorICAgKChfX0lOSl9TRVFfRElTQ09OVF9NT0RFX18pID09IExMX0FEQ19JTkpfU0VRX0RJU0NPTlRfMVJBTkspKQorCisjaWYgZGVmaW5lZChBRENfTVVMVElNT0RFX1NVUFBPUlQpCisvKiBDaGVjayBvZiBwYXJhbWV0ZXJzIGZvciBjb25maWd1cmF0aW9uIG9mIEFEQyBoaWVyYXJjaGljYWwgc2NvcGU6ICAgICAgICAgICAqLworLyogbXVsdGltb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSVNfTExfQURDX01VTFRJX01PREUoX19NVUxUSV9NT0RFX18pICAgICAgICAgICAgICAgICAgXAorICAoKChfX01VTFRJX01PREVfXykgPT0gTExfQURDX01VTFRJX0lOREVQRU5ERU5UKSB8fCAgICAgICAgICBcCisgICAoKF9fTVVMVElfTU9ERV9fKSA9PSBMTF9BRENfTVVMVElfRFVBTF9SRUdfU0lNVUxUKSB8fCAgICAgIFwKKyAgICgoX19NVUxUSV9NT0RFX18pID09IExMX0FEQ19NVUxUSV9EVUFMX1JFR19JTlRFUkwpIHx8ICAgICAgXAorICAgKChfX01VTFRJX01PREVfXykgPT0gTExfQURDX01VTFRJX0RVQUxfSU5KX1NJTVVMVCkgfHwgICAgICBcCisgICAoKF9fTVVMVElfTU9ERV9fKSA9PSBMTF9BRENfTVVMVElfRFVBTF9JTkpfQUxURVJOKSB8fCAgICAgIFwKKyAgICgoX19NVUxUSV9NT0RFX18pID09IExMX0FEQ19NVUxUSV9EVUFMX1JFR19TSU1fSU5KX1NJTSkgfHwgXAorICAgKChfX01VTFRJX01PREVfXykgPT0gTExfQURDX01VTFRJX0RVQUxfUkVHX1NJTV9JTkpfQUxUKSB8fCBcCisgICAoKF9fTVVMVElfTU9ERV9fKSA9PSBMTF9BRENfTVVMVElfRFVBTF9SRUdfSU5UX0lOSl9TSU0pKQorCisjZGVmaW5lIElTX0xMX0FEQ19NVUxUSV9ETUFfVFJBTlNGRVIoX19NVUxUSV9ETUFfVFJBTlNGRVJfXykgICAgICAgICAgICAgXAorICAoKChfX01VTFRJX0RNQV9UUkFOU0ZFUl9fKSA9PSBMTF9BRENfTVVMVElfUkVHX0RNQV9FQUNIX0FEQykgfHwgICAgICAgIFwKKyAgICgoX19NVUxUSV9ETUFfVFJBTlNGRVJfXykgPT0gTExfQURDX01VTFRJX1JFR19ETUFfTElNSVRfUkVTMTJfMTBCKSB8fCBcCisgICAoKF9fTVVMVElfRE1BX1RSQU5TRkVSX18pID09IExMX0FEQ19NVUxUSV9SRUdfRE1BX0xJTUlUX1JFUzhfNkIpIHx8ICAgXAorICAgKChfX01VTFRJX0RNQV9UUkFOU0ZFUl9fKSA9PSBMTF9BRENfTVVMVElfUkVHX0RNQV9VTkxNVF9SRVMxMl8xMEIpIHx8IFwKKyAgICgoX19NVUxUSV9ETUFfVFJBTlNGRVJfXykgPT0gTExfQURDX01VTFRJX1JFR19ETUFfVU5MTVRfUkVTOF82QikpCisKKyNkZWZpbmUgSVNfTExfQURDX01VTFRJX1RXT1NNUF9ERUxBWShfX01VTFRJX1RXT1NNUF9ERUxBWV9fKSAgICAgICAgICAgXAorICAoKChfX01VTFRJX1RXT1NNUF9ERUxBWV9fKSA9PSBMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzFDWUNMRSkgfHwgICBcCisgICAoKF9fTVVMVElfVFdPU01QX0RFTEFZX18pID09IExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfMkNZQ0xFUykgfHwgIFwKKyAgICgoX19NVUxUSV9UV09TTVBfREVMQVlfXykgPT0gTExfQURDX01VTFRJX1RXT1NNUF9ERUxBWV8zQ1lDTEVTKSB8fCAgXAorICAgKChfX01VTFRJX1RXT1NNUF9ERUxBWV9fKSA9PSBMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzRDWUNMRVMpIHx8ICBcCisgICAoKF9fTVVMVElfVFdPU01QX0RFTEFZX18pID09IExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfNUNZQ0xFUykgfHwgIFwKKyAgICgoX19NVUxUSV9UV09TTVBfREVMQVlfXykgPT0gTExfQURDX01VTFRJX1RXT1NNUF9ERUxBWV82Q1lDTEVTKSB8fCAgXAorICAgKChfX01VTFRJX1RXT1NNUF9ERUxBWV9fKSA9PSBMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzdDWUNMRVMpIHx8ICBcCisgICAoKF9fTVVMVElfVFdPU01QX0RFTEFZX18pID09IExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfOENZQ0xFUykgfHwgIFwKKyAgICgoX19NVUxUSV9UV09TTVBfREVMQVlfXykgPT0gTExfQURDX01VTFRJX1RXT1NNUF9ERUxBWV85Q1lDTEVTKSB8fCAgXAorICAgKChfX01VTFRJX1RXT1NNUF9ERUxBWV9fKSA9PSBMTF9BRENfTVVMVElfVFdPU01QX0RFTEFZXzEwQ1lDTEVTKSB8fCBcCisgICAoKF9fTVVMVElfVFdPU01QX0RFTEFZX18pID09IExMX0FEQ19NVUxUSV9UV09TTVBfREVMQVlfMTFDWUNMRVMpIHx8IFwKKyAgICgoX19NVUxUSV9UV09TTVBfREVMQVlfXykgPT0gTExfQURDX01VTFRJX1RXT1NNUF9ERUxBWV8xMkNZQ0xFUykpCisKKyNkZWZpbmUgSVNfTExfQURDX01VTFRJX01BU1RFUl9TTEFWRShfX01VTFRJX01BU1RFUl9TTEFWRV9fKSBcCisgICgoKF9fTVVMVElfTUFTVEVSX1NMQVZFX18pID09IExMX0FEQ19NVUxUSV9NQVNURVIpIHx8ICAgICAgXAorICAgKChfX01VTFRJX01BU1RFUl9TTEFWRV9fKSA9PSBMTF9BRENfTVVMVElfU0xBVkUpIHx8ICAgICAgIFwKKyAgICgoX19NVUxUSV9NQVNURVJfU0xBVkVfXykgPT0gTExfQURDX01VTFRJX01BU1RFUl9TTEFWRSkpCisKKyNlbmRpZiAvKiBBRENfTVVMVElNT0RFX1NVUFBPUlQgKi8KKy8qKgorICogQH0KKyAqLworCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIEFEQ19MTF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAqIEB7CisgKi8KKworLyoqIEBhZGR0b2dyb3VwIEFEQ19MTF9FRl9Jbml0CisgKiBAeworICovCisKKy8qKgorICogQGJyaWVmICBEZS1pbml0aWFsaXplIHJlZ2lzdGVycyBvZiBhbGwgQURDIGluc3RhbmNlcyBiZWxvbmdpbmcgdG8KKyAqICAgICAgICAgdGhlIHNhbWUgQURDIGNvbW1vbiBpbnN0YW5jZSB0byB0aGVpciBkZWZhdWx0IHJlc2V0IHZhbHVlcy4KKyAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBpcyBwZXJmb3JtaW5nIGEgaGFyZCByZXNldCwgdXNpbmcgaGlnaCBsZXZlbAorICogICAgICAgICBjbG9jayBzb3VyY2UgUkNDIEFEQyByZXNldC4KKyAqICAgICAgICAgQ2F1dGlvbjogT24gdGhpcyBTVE0zMiBzZXJpZXMsIGlmIHNldmVyYWwgQURDIGluc3RhbmNlcyBhcmUgYXZhaWxhYmxlCisgKiAgICAgICAgIG9uIHRoZSBzZWxlY3RlZCBkZXZpY2UsIFJDQyBBREMgcmVzZXQgd2lsbCByZXNldAorICogICAgICAgICBhbGwgQURDIGluc3RhbmNlcyBiZWxvbmdpbmcgdG8gdGhlIGNvbW1vbiBBREMgaW5zdGFuY2UuCisgKiAgICAgICAgIFRvIGRlLWluaXRpYWxpemUgb25seSAxIEFEQyBpbnN0YW5jZSwgdXNlCisgKiAgICAgICAgIGZ1bmN0aW9uIEByZWYgTExfQURDX0RlSW5pdCgpLgorICogQHBhcmFtICBBREN4eV9DT01NT04gQURDIGNvbW1vbiBpbnN0YW5jZQorICogICAgICAgICAoY2FuIGJlIHNldCBkaXJlY3RseSBmcm9tIENNU0lTIGRlZmluaXRpb24gb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvCisgKiBAcmVmIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRSgpICkKKyAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgKiAgICAgICAgICAtIFNVQ0NFU1M6IEFEQyBjb21tb24gcmVnaXN0ZXJzIGFyZSBkZS1pbml0aWFsaXplZAorICogICAgICAgICAgLSBFUlJPUjogbm90IGFwcGxpY2FibGUKKyAqLworRXJyb3JTdGF0dXMgTExfQURDX0NvbW1vbkRlSW5pdChjb25zdCBBRENfQ29tbW9uX1R5cGVEZWYgKkFEQ3h5X0NPTU1PTikgeworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0NPTU1PTl9JTlNUQU5DRShBREN4eV9DT01NT04pKTsKKworICBpZiAoQURDeHlfQ09NTU9OID09IEFEQzEyX0NPTU1PTikgeworICAgIC8qIEZvcmNlIHJlc2V0IG9mIEFEQyBjbG9jayAoY29yZSBjbG9jaykgKi8KKyAgICBMTF9BSEIyX0dSUDFfRm9yY2VSZXNldChMTF9BSEIyX0dSUDFfUEVSSVBIX0FEQzEyKTsKKworICAgIC8qIFJlbGVhc2UgcmVzZXQgb2YgQURDIGNsb2NrIChjb3JlIGNsb2NrKSAqLworICAgIExMX0FIQjJfR1JQMV9SZWxlYXNlUmVzZXQoTExfQUhCMl9HUlAxX1BFUklQSF9BREMxMik7CisgIH0KKyNpZiBkZWZpbmVkKEFEQzM0NV9DT01NT04pCisgIGVsc2UgeworICAgIC8qIEZvcmNlIHJlc2V0IG9mIEFEQyBjbG9jayAoY29yZSBjbG9jaykgKi8KKyAgICBMTF9BSEIyX0dSUDFfRm9yY2VSZXNldChMTF9BSEIyX0dSUDFfUEVSSVBIX0FEQzM0NSk7CisKKyAgICAvKiBSZWxlYXNlIHJlc2V0IG9mIEFEQyBjbG9jayAoY29yZSBjbG9jaykgKi8KKyAgICBMTF9BSEIyX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FIQjJfR1JQMV9QRVJJUEhfQURDMzQ1KTsKKyAgfQorI2VuZGlmIC8qIEFEQzM0NV9DT01NT04gKi8KKworICByZXR1cm4gU1VDQ0VTUzsKK30KKworLyoqCisgKiBAYnJpZWYgIEluaXRpYWxpemUgc29tZSBmZWF0dXJlcyBvZiBBREMgY29tbW9uIHBhcmFtZXRlcnMKKyAqICAgICAgICAgKGFsbCBBREMgaW5zdGFuY2VzIGJlbG9uZ2luZyB0byB0aGUgc2FtZSBBREMgY29tbW9uIGluc3RhbmNlKQorICogICAgICAgICBhbmQgbXVsdGltb2RlIChmb3IgZGV2aWNlcyB3aXRoIHNldmVyYWwgQURDIGluc3RhbmNlcyBhdmFpbGFibGUpLgorICogQG5vdGUgICBUaGUgc2V0dGluZyBvZiBBREMgY29tbW9uIHBhcmFtZXRlcnMgaXMgY29uZGl0aW9uZWQgdG8KKyAqICAgICAgICAgQURDIGluc3RhbmNlcyBzdGF0ZToKKyAqICAgICAgICAgQWxsIEFEQyBpbnN0YW5jZXMgYmVsb25naW5nIHRvIHRoZSBzYW1lIEFEQyBjb21tb24gaW5zdGFuY2UKKyAqICAgICAgICAgbXVzdCBiZSBkaXNhYmxlZC4KKyAqIEBwYXJhbSAgQURDeHlfQ09NTU9OIEFEQyBjb21tb24gaW5zdGFuY2UKKyAqICAgICAgICAgKGNhbiBiZSBzZXQgZGlyZWN0bHkgZnJvbSBDTVNJUyBkZWZpbml0aW9uIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybworICogQHJlZiBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoKSApCisgKiBAcGFyYW0gIHBBRENfQ29tbW9uSW5pdFN0cnVjdCBQb2ludGVyIHRvIGEgQHJlZiBMTF9BRENfQ29tbW9uSW5pdFR5cGVEZWYKKyAqIHN0cnVjdHVyZQorICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAqICAgICAgICAgIC0gU1VDQ0VTUzogQURDIGNvbW1vbiByZWdpc3RlcnMgYXJlIGluaXRpYWxpemVkCisgKiAgICAgICAgICAtIEVSUk9SOiBBREMgY29tbW9uIHJlZ2lzdGVycyBhcmUgbm90IGluaXRpYWxpemVkCisgKi8KK0Vycm9yU3RhdHVzIExMX0FEQ19Db21tb25Jbml0KAorICAgIEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OLAorICAgIGNvbnN0IExMX0FEQ19Db21tb25Jbml0VHlwZURlZiAqcEFEQ19Db21tb25Jbml0U3RydWN0KSB7CisgIEVycm9yU3RhdHVzIHN0YXR1cyA9IFNVQ0NFU1M7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19DT01NT05fSU5TVEFOQ0UoQURDeHlfQ09NTU9OKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9BRENfQ09NTU9OX0NMT0NLKHBBRENfQ29tbW9uSW5pdFN0cnVjdC0+Q29tbW9uQ2xvY2spKTsKKworI2lmIGRlZmluZWQoQURDX01VTFRJTU9ERV9TVVBQT1JUKQorICBhc3NlcnRfcGFyYW0oSVNfTExfQURDX01VTFRJX01PREUocEFEQ19Db21tb25Jbml0U3RydWN0LT5NdWx0aW1vZGUpKTsKKyAgaWYgKHBBRENfQ29tbW9uSW5pdFN0cnVjdC0+TXVsdGltb2RlICE9IExMX0FEQ19NVUxUSV9JTkRFUEVOREVOVCkgeworICAgIGFzc2VydF9wYXJhbSgKKyAgICAgICAgSVNfTExfQURDX01VTFRJX0RNQV9UUkFOU0ZFUihwQURDX0NvbW1vbkluaXRTdHJ1Y3QtPk11bHRpRE1BVHJhbnNmZXIpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTExfQURDX01VTFRJX1RXT1NNUF9ERUxBWSgKKyAgICAgICAgcEFEQ19Db21tb25Jbml0U3RydWN0LT5NdWx0aVR3b1NhbXBsaW5nRGVsYXkpKTsKKyAgfQorI2VuZGlmIC8qIEFEQ19NVUxUSU1PREVfU1VQUE9SVCAqLworCisgIC8qIE5vdGU6IEhhcmR3YXJlIGNvbnN0cmFpbnQgKHJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIGZ1bmN0aW9ucyAgICAgICAgICAgICAqLworICAvKiAgICAgICAiTExfQURDX1NldENvbW1vblhYWCgpIiBhbmQgIkxMX0FEQ19TZXRNdWx0aVhYWCgpIik6ICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgT24gdGhpcyBTVE0zMiBzZXJpZXMsIHNldHRpbmcgb2YgdGhlc2UgZmVhdHVyZXMgaXMgY29uZGl0aW9uZWQgdG8gICovCisgIC8qICAgICAgIEFEQyBzdGF0ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICBBbGwgQURDIGluc3RhbmNlcyBvZiB0aGUgQURDIGNvbW1vbiBncm91cCBtdXN0IGJlIGRpc2FibGVkLiAgICAgICAgKi8KKyAgaWYgKF9fTExfQURDX0lTX0VOQUJMRURfQUxMX0NPTU1PTl9JTlNUQU5DRShBREN4eV9DT01NT04pID09IDBVTCkgeworICAgIC8qIENvbmZpZ3VyYXRpb24gb2YgQURDIGhpZXJhcmNoaWNhbCBzY29wZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgLSBjb21tb24gdG8gc2V2ZXJhbCBBREMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogICAgKGFsbCBBREMgaW5zdGFuY2VzIGJlbG9uZ2luZyB0byB0aGUgc2FtZSBBREMgY29tbW9uIGluc3RhbmNlKSAgICAgICAqLworICAgIC8qICAgIC0gU2V0IEFEQyBjbG9jayAoY29udmVyc2lvbiBjbG9jaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgLSBtdWx0aW1vZGUgKGlmIHNldmVyYWwgQURDIGluc3RhbmNlcyBhdmFpbGFibGUgb24gdGhlICAgICAgICAgICAgICAgICovCisgICAgLyogICAgc2VsZWN0ZWQgZGV2aWNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgIC0gU2V0IEFEQyBtdWx0aW1vZGUgY29uZmlndXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAtIFNldCBBREMgbXVsdGltb2RlIERNQSB0cmFuc2ZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogICAgLSBTZXQgQURDIG11bHRpbW9kZTogZGVsYXkgYmV0d2VlbiAyIHNhbXBsaW5nIHBoYXNlcyAgICAgICAgICAgICAgICAqLworI2lmIGRlZmluZWQoQURDX01VTFRJTU9ERV9TVVBQT1JUKQorICAgIGlmIChwQURDX0NvbW1vbkluaXRTdHJ1Y3QtPk11bHRpbW9kZSAhPSBMTF9BRENfTVVMVElfSU5ERVBFTkRFTlQpIHsKKyAgICAgIE1PRElGWV9SRUcoQURDeHlfQ09NTU9OLT5DQ1IsCisgICAgICAgICAgICAgICAgIEFEQ19DQ1JfQ0tNT0RFIHwgQURDX0NDUl9QUkVTQyB8IEFEQ19DQ1JfRFVBTCB8IEFEQ19DQ1JfTURNQSB8CisgICAgICAgICAgICAgICAgICAgICBBRENfQ0NSX0RFTEFZLAorICAgICAgICAgICAgICAgICBwQURDX0NvbW1vbkluaXRTdHJ1Y3QtPkNvbW1vbkNsb2NrIHwKKyAgICAgICAgICAgICAgICAgICAgIHBBRENfQ29tbW9uSW5pdFN0cnVjdC0+TXVsdGltb2RlIHwKKyAgICAgICAgICAgICAgICAgICAgIHBBRENfQ29tbW9uSW5pdFN0cnVjdC0+TXVsdGlETUFUcmFuc2ZlciB8CisgICAgICAgICAgICAgICAgICAgICBwQURDX0NvbW1vbkluaXRTdHJ1Y3QtPk11bHRpVHdvU2FtcGxpbmdEZWxheSk7CisgICAgfSBlbHNlIHsKKyAgICAgIE1PRElGWV9SRUcoQURDeHlfQ09NTU9OLT5DQ1IsCisgICAgICAgICAgICAgICAgIEFEQ19DQ1JfQ0tNT0RFIHwgQURDX0NDUl9QUkVTQyB8IEFEQ19DQ1JfRFVBTCB8IEFEQ19DQ1JfTURNQSB8CisgICAgICAgICAgICAgICAgICAgICBBRENfQ0NSX0RFTEFZLAorICAgICAgICAgICAgICAgICBwQURDX0NvbW1vbkluaXRTdHJ1Y3QtPkNvbW1vbkNsb2NrIHwgTExfQURDX01VTFRJX0lOREVQRU5ERU5UKTsKKyAgICB9CisjZWxzZQorICAgIExMX0FEQ19TZXRDb21tb25DbG9jayhBREN4eV9DT01NT04sIHBBRENfQ29tbW9uSW5pdFN0cnVjdC0+Q29tbW9uQ2xvY2spOworI2VuZGlmIC8qIEFEQ19NVUxUSU1PREVfU1VQUE9SVCAqLworICB9IGVsc2UgeworICAgIC8qIEluaXRpYWxpemF0aW9uIGVycm9yOiBPbmUgb3Igc2V2ZXJhbCBBREMgaW5zdGFuY2VzIGJlbG9uZ2luZyB0byAgICAgICAgKi8KKyAgICAvKiB0aGUgc2FtZSBBREMgY29tbW9uIGluc3RhbmNlIGFyZSBub3QgZGlzYWJsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgc3RhdHVzID0gRVJST1I7CisgIH0KKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIEBicmllZiAgU2V0IGVhY2ggQHJlZiBMTF9BRENfQ29tbW9uSW5pdFR5cGVEZWYgZmllbGQgdG8gZGVmYXVsdCB2YWx1ZS4KKyAqIEBwYXJhbSAgcEFEQ19Db21tb25Jbml0U3RydWN0IFBvaW50ZXIgdG8gYSBAcmVmIExMX0FEQ19Db21tb25Jbml0VHlwZURlZgorICogc3RydWN0dXJlIHdob3NlIGZpZWxkcyB3aWxsIGJlIHNldCB0byBkZWZhdWx0IHZhbHVlcy4KKyAqIEByZXR2YWwgTm9uZQorICovCit2b2lkIExMX0FEQ19Db21tb25TdHJ1Y3RJbml0KExMX0FEQ19Db21tb25Jbml0VHlwZURlZiAqcEFEQ19Db21tb25Jbml0U3RydWN0KSB7CisgIC8qIFNldCBwQURDX0NvbW1vbkluaXRTdHJ1Y3QgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzICovCisgIC8qIFNldCBmaWVsZHMgb2YgQURDIGNvbW1vbiAqLworICAvKiAoYWxsIEFEQyBpbnN0YW5jZXMgYmVsb25naW5nIHRvIHRoZSBzYW1lIEFEQyBjb21tb24gaW5zdGFuY2UpICovCisgIHBBRENfQ29tbW9uSW5pdFN0cnVjdC0+Q29tbW9uQ2xvY2sgPSBMTF9BRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjI7CisKKyNpZiBkZWZpbmVkKEFEQ19NVUxUSU1PREVfU1VQUE9SVCkKKyAgLyogU2V0IGZpZWxkcyBvZiBBREMgbXVsdGltb2RlICovCisgIHBBRENfQ29tbW9uSW5pdFN0cnVjdC0+TXVsdGltb2RlID0gTExfQURDX01VTFRJX0lOREVQRU5ERU5UOworICBwQURDX0NvbW1vbkluaXRTdHJ1Y3QtPk11bHRpRE1BVHJhbnNmZXIgPSBMTF9BRENfTVVMVElfUkVHX0RNQV9FQUNIX0FEQzsKKyAgcEFEQ19Db21tb25Jbml0U3RydWN0LT5NdWx0aVR3b1NhbXBsaW5nRGVsYXkgPQorICAgICAgTExfQURDX01VTFRJX1RXT1NNUF9ERUxBWV8xQ1lDTEU7CisjZW5kaWYgLyogQURDX01VTFRJTU9ERV9TVVBQT1JUICovCit9CisKKy8qKgorICogQGJyaWVmICBEZS1pbml0aWFsaXplIHJlZ2lzdGVycyBvZiB0aGUgc2VsZWN0ZWQgQURDIGluc3RhbmNlCisgKiAgICAgICAgIHRvIHRoZWlyIGRlZmF1bHQgcmVzZXQgdmFsdWVzLgorICogQG5vdGUgICBUbyByZXNldCBhbGwgQURDIGluc3RhbmNlcyBxdWlja2x5IChwZXJmb3JtIGEgaGFyZCByZXNldCksCisgKiAgICAgICAgIHVzZSBmdW5jdGlvbiBAcmVmIExMX0FEQ19Db21tb25EZUluaXQoKS4KKyAqIEBub3RlICAgSWYgdGhpcyBmdW5jdGlvbnMgcmV0dXJucyBlcnJvciBzdGF0dXMsIGl0IG1lYW5zIHRoYXQgQURDIGluc3RhbmNlCisgKiAgICAgICAgIGlzIGluIGFuIHVua25vd24gc3RhdGUuCisgKiAgICAgICAgIEluIHRoaXMgY2FzZSwgcGVyZm9ybSBhIGhhcmQgcmVzZXQgdXNpbmcgaGlnaCBsZXZlbAorICogICAgICAgICBjbG9jayBzb3VyY2UgUkNDIEFEQyByZXNldC4KKyAqICAgICAgICAgQ2F1dGlvbjogT24gdGhpcyBTVE0zMiBzZXJpZXMsIGlmIHNldmVyYWwgQURDIGluc3RhbmNlcyBhcmUgYXZhaWxhYmxlCisgKiAgICAgICAgIG9uIHRoZSBzZWxlY3RlZCBkZXZpY2UsIFJDQyBBREMgcmVzZXQgd2lsbCByZXNldAorICogICAgICAgICBhbGwgQURDIGluc3RhbmNlcyBiZWxvbmdpbmcgdG8gdGhlIGNvbW1vbiBBREMgaW5zdGFuY2UuCisgKiAgICAgICAgIFJlZmVyIHRvIGZ1bmN0aW9uIEByZWYgTExfQURDX0NvbW1vbkRlSW5pdCgpLgorICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAqICAgICAgICAgIC0gU1VDQ0VTUzogQURDIHJlZ2lzdGVycyBhcmUgZGUtaW5pdGlhbGl6ZWQKKyAqICAgICAgICAgIC0gRVJST1I6IEFEQyByZWdpc3RlcnMgYXJlIG5vdCBkZS1pbml0aWFsaXplZAorICovCitFcnJvclN0YXR1cyBMTF9BRENfRGVJbml0KEFEQ19UeXBlRGVmICpBREN4KSB7CisgIEVycm9yU3RhdHVzIHN0YXR1cyA9IFNVQ0NFU1M7CisKKyAgX19JTyB1aW50MzJfdCB0aW1lb3V0X2NwdV9jeWNsZXMgPSAwVUw7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoQURDeCkpOworCisgIC8qIERpc2FibGUgQURDIGluc3RhbmNlIGlmIG5vdCBhbHJlYWR5IGRpc2FibGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpZiAoTExfQURDX0lzRW5hYmxlZChBREN4KSA9PSAxVUwpIHsKKyAgICAvKiBTdG9wIHBvdGVudGlhbCBBREMgY29udmVyc2lvbiBvbiBnb2luZyBvbiBBREMgZ3JvdXAgcmVndWxhci4gICAgICAgICAgICovCisgICAgaWYgKExMX0FEQ19SRUdfSXNDb252ZXJzaW9uT25nb2luZyhBREN4KSAhPSAwVUwpIHsKKyAgICAgIGlmIChMTF9BRENfUkVHX0lzU3RvcENvbnZlcnNpb25PbmdvaW5nKEFEQ3gpID09IDBVTCkgeworICAgICAgICBMTF9BRENfUkVHX1N0b3BDb252ZXJzaW9uKEFEQ3gpOworICAgICAgfQorICAgIH0KKworICAgIC8qIFN0b3AgcG90ZW50aWFsIEFEQyBjb252ZXJzaW9uIG9uIGdvaW5nIG9uIEFEQyBncm91cCBpbmplY3RlZC4gICAgICAgICAgKi8KKyAgICBpZiAoTExfQURDX0lOSl9Jc0NvbnZlcnNpb25PbmdvaW5nKEFEQ3gpICE9IDBVTCkgeworICAgICAgaWYgKExMX0FEQ19JTkpfSXNTdG9wQ29udmVyc2lvbk9uZ29pbmcoQURDeCkgPT0gMFVMKSB7CisgICAgICAgIExMX0FEQ19JTkpfU3RvcENvbnZlcnNpb24oQURDeCk7CisgICAgICB9CisgICAgfQorCisgICAgLyogV2FpdCBmb3IgQURDIGNvbnZlcnNpb25zIGFyZSBlZmZlY3RpdmVseSBzdG9wcGVkICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHRpbWVvdXRfY3B1X2N5Y2xlcyA9IEFEQ19USU1FT1VUX1NUT1BfQ09OVkVSU0lPTl9DUFVfQ1lDTEVTOworICAgIHdoaWxlICgoTExfQURDX1JFR19Jc1N0b3BDb252ZXJzaW9uT25nb2luZyhBREN4KSB8CisgICAgICAgICAgICBMTF9BRENfSU5KX0lzU3RvcENvbnZlcnNpb25PbmdvaW5nKEFEQ3gpKSA9PSAxVUwpIHsKKyAgICAgIHRpbWVvdXRfY3B1X2N5Y2xlcy0tOworICAgICAgaWYgKHRpbWVvdXRfY3B1X2N5Y2xlcyA9PSAwVUwpIHsKKyAgICAgICAgLyogVGltZS1vdXQgZXJyb3IgKi8KKyAgICAgICAgc3RhdHVzID0gRVJST1I7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIC8qIEZsdXNoIGdyb3VwIGluamVjdGVkIGNvbnRleHRzIHF1ZXVlIChyZWdpc3RlciBKU1FSKTogICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBOb3RlOiBCaXQgSlFNIG11c3QgYmUgc2V0IHRvIGVtcHR5IHRoZSBjb250ZXh0cyBxdWV1ZSAob3RoZXJ3aXNlICAgICAgICovCisgICAgLyogICAgICAgY29udGV4dHMgcXVldWUgaXMgbWFpbnRhaW5lZCB3aXRoIHRoZSBsYXN0IGFjdGl2ZSBjb250ZXh0KS4gICAgICAqLworICAgIExMX0FEQ19JTkpfU2V0UXVldWVNb2RlKEFEQ3gsIExMX0FEQ19JTkpfUVVFVUVfMkNPTlRFWFRTX0VORF9FTVBUWSk7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBBREMgaW5zdGFuY2UgKi8KKyAgICBMTF9BRENfRGlzYWJsZShBREN4KTsKKworICAgIC8qIFdhaXQgZm9yIEFEQyBpbnN0YW5jZSBpcyBlZmZlY3RpdmVseSBkaXNhYmxlZCAqLworICAgIHRpbWVvdXRfY3B1X2N5Y2xlcyA9IEFEQ19USU1FT1VUX0RJU0FCTEVfQ1BVX0NZQ0xFUzsKKyAgICB3aGlsZSAoTExfQURDX0lzRGlzYWJsZU9uZ29pbmcoQURDeCkgPT0gMVVMKSB7CisgICAgICB0aW1lb3V0X2NwdV9jeWNsZXMtLTsKKyAgICAgIGlmICh0aW1lb3V0X2NwdV9jeWNsZXMgPT0gMFVMKSB7CisgICAgICAgIC8qIFRpbWUtb3V0IGVycm9yICovCisgICAgICAgIHN0YXR1cyA9IEVSUk9SOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBDaGVjayB3aGV0aGVyIEFEQyBzdGF0ZSBpcyBjb21wbGlhbnQgd2l0aCBleHBlY3RlZCBzdGF0ZSAqLworICBpZiAoUkVBRF9CSVQoQURDeC0+Q1IsIChBRENfQ1JfSkFEU1RQIHwgQURDX0NSX0FEU1RQIHwgQURDX0NSX0pBRFNUQVJUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NSX0FEU1RBUlQgfCBBRENfQ1JfQURESVMgfCBBRENfQ1JfQURFTikpID09CisgICAgICAwVUwpIHsKKyAgICAvKiA9PT09PT09PT09IFJlc2V0IEFEQyByZWdpc3RlcnMgPT09PT09PT09PSAqLworICAgIC8qIFJlc2V0IHJlZ2lzdGVyIElFUiAqLworICAgIENMRUFSX0JJVChBREN4LT5JRVIsIChMTF9BRENfSVRfQURSRFkgfCBMTF9BRENfSVRfRU9DIHwgTExfQURDX0lUX0VPUyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgIExMX0FEQ19JVF9PVlIgfCBMTF9BRENfSVRfRU9TTVAgfCBMTF9BRENfSVRfSkVPQyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgIExMX0FEQ19JVF9KRU9TIHwgTExfQURDX0lUX0pRT1ZGIHwgTExfQURDX0lUX0FXRDEgfAorICAgICAgICAgICAgICAgICAgICAgICAgICBMTF9BRENfSVRfQVdEMiB8IExMX0FEQ19JVF9BV0QzKSk7CisKKyAgICAvKiBSZXNldCByZWdpc3RlciBJU1IgKi8KKyAgICBTRVRfQklUKEFEQ3gtPklTUiwKKyAgICAgICAgICAgIChMTF9BRENfRkxBR19BRFJEWSB8IExMX0FEQ19GTEFHX0VPQyB8IExMX0FEQ19GTEFHX0VPUyB8CisgICAgICAgICAgICAgTExfQURDX0ZMQUdfT1ZSIHwgTExfQURDX0ZMQUdfRU9TTVAgfCBMTF9BRENfRkxBR19KRU9DIHwKKyAgICAgICAgICAgICBMTF9BRENfRkxBR19KRU9TIHwgTExfQURDX0ZMQUdfSlFPVkYgfCBMTF9BRENfRkxBR19BV0QxIHwKKyAgICAgICAgICAgICBMTF9BRENfRkxBR19BV0QyIHwgTExfQURDX0ZMQUdfQVdEMykpOworCisgICAgLyogUmVzZXQgcmVnaXN0ZXIgQ1IgKi8KKyAgICAvKiAgLSBCaXRzIEFEQ19DUl9KQURTVFAsIEFEQ19DUl9BRFNUUCwgQURDX0NSX0pBRFNUQVJULCBBRENfQ1JfQURTVEFSVCwgICovCisgICAgLyogICAgQURDX0NSX0FEQ0FMLCBBRENfQ1JfQURESVMsIEFEQ19DUl9BREVOIGFyZSBpbiAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgIGFjY2VzcyBtb2RlICJyZWFkLXNldCI6IG5vIGRpcmVjdCByZXNldCBhcHBsaWNhYmxlLiAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgLSBSZXNldCBDYWxpYnJhdGlvbiBtb2RlIHRvIGRlZmF1bHQgc2V0dGluZyAoc2luZ2xlIGVuZGVkKS4gICAgICAgICAgICovCisgICAgLyogIC0gRGlzYWJsZSBBREMgaW50ZXJuYWwgdm9sdGFnZSByZWd1bGF0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAtIEVuYWJsZSBBREMgZGVlcCBwb3dlciBkb3duLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICBOb3RlOiBBREMgaW50ZXJuYWwgdm9sdGFnZSByZWd1bGF0b3IgZGlzYWJsZSBhbmQgQURDIGRlZXAgcG93ZXIgICAgICovCisgICAgLyogICAgICAgICAgZG93biBlbmFibGUgYXJlIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZSBkaXNhYmxlZDogICAgICAgICAgICAqLworICAgIC8qICAgICAgICAgIGFscmVhZHkgZG9uZSBhYm92ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBDTEVBUl9CSVQoQURDeC0+Q1IsIEFEQ19DUl9BRFZSRUdFTiB8IEFEQ19DUl9BRENBTERJRik7CisgICAgU0VUX0JJVChBREN4LT5DUiwgQURDX0NSX0RFRVBQV0QpOworCisgICAgLyogUmVzZXQgcmVnaXN0ZXIgQ0ZHUiAqLworICAgIE1PRElGWV9SRUcoCisgICAgICAgIEFEQ3gtPkNGR1IsCisgICAgICAgIChBRENfQ0ZHUl9BV0QxQ0ggfCBBRENfQ0ZHUl9KQVVUTyB8IEFEQ19DRkdSX0pBV0QxRU4gfCBBRENfQ0ZHUl9BV0QxRU4gfAorICAgICAgICAgQURDX0NGR1JfQVdEMVNHTCB8IEFEQ19DRkdSX0pRTSB8IEFEQ19DRkdSX0pESVNDRU4gfCBBRENfQ0ZHUl9ESVNDTlVNIHwKKyAgICAgICAgIEFEQ19DRkdSX0RJU0NFTiB8IEFEQ19DRkdSX0FVVERMWSB8IEFEQ19DRkdSX0NPTlQgfCBBRENfQ0ZHUl9PVlJNT0QgfAorICAgICAgICAgQURDX0NGR1JfRVhURU4gfCBBRENfQ0ZHUl9FWFRTRUwgfCBBRENfQ0ZHUl9BTElHTiB8IEFEQ19DRkdSX1JFUyB8CisgICAgICAgICBBRENfQ0ZHUl9ETUFDRkcgfCBBRENfQ0ZHUl9ETUFFTiksCisgICAgICAgIEFEQ19DRkdSX0pRRElTKTsKKworICAgIC8qIFJlc2V0IHJlZ2lzdGVyIENGR1IyICovCisgICAgQ0xFQVJfQklUKAorICAgICAgICBBREN4LT5DRkdSMiwKKyAgICAgICAgKEFEQ19DRkdSMl9ST1ZTTSB8IEFEQ19DRkdSMl9UUk9WUyB8IEFEQ19DRkdSMl9PVlNTIHwgQURDX0NGR1IyX1NXVFJJRyB8CisgICAgICAgICBBRENfQ0ZHUjJfQlVMQiB8IEFEQ19DRkdSMl9TTVBUUklHIHwgQURDX0NGR1IyX0dDT01QIHwgQURDX0NGR1IyX09WU1IgfAorICAgICAgICAgQURDX0NGR1IyX0pPVlNFIHwgQURDX0NGR1IyX1JPVlNFKSk7CisKKyAgICAvKiBSZXNldCByZWdpc3RlciBTTVBSMSAqLworICAgIENMRUFSX0JJVChBREN4LT5TTVBSMSwgKEFEQ19TTVBSMV9TTVA5IHwgQURDX1NNUFIxX1NNUDggfCBBRENfU01QUjFfU01QNyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX1NNUFIxX1NNUDYgfCBBRENfU01QUjFfU01QNSB8IEFEQ19TTVBSMV9TTVA0IHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfU01QUjFfU01QMyB8IEFEQ19TTVBSMV9TTVAyIHwgQURDX1NNUFIxX1NNUDEpKTsKKworICAgIC8qIFJlc2V0IHJlZ2lzdGVyIFNNUFIyICovCisgICAgQ0xFQVJfQklUKEFEQ3gtPlNNUFIyLAorICAgICAgICAgICAgICAoQURDX1NNUFIyX1NNUDE4IHwgQURDX1NNUFIyX1NNUDE3IHwgQURDX1NNUFIyX1NNUDE2IHwKKyAgICAgICAgICAgICAgIEFEQ19TTVBSMl9TTVAxNSB8IEFEQ19TTVBSMl9TTVAxNCB8IEFEQ19TTVBSMl9TTVAxMyB8CisgICAgICAgICAgICAgICBBRENfU01QUjJfU01QMTIgfCBBRENfU01QUjJfU01QMTEgfCBBRENfU01QUjJfU01QMTApKTsKKworICAgIC8qIFJlc2V0IHJlZ2lzdGVyIFRSMSAqLworICAgIE1PRElGWV9SRUcoQURDeC0+VFIxLCBBRENfVFIxX0FXREZJTFQgfCBBRENfVFIxX0hUMSB8IEFEQ19UUjFfTFQxLAorICAgICAgICAgICAgICAgQURDX1RSMV9IVDEpOworCisgICAgLyogUmVzZXQgcmVnaXN0ZXIgVFIyICovCisgICAgTU9ESUZZX1JFRyhBREN4LT5UUjIsIEFEQ19UUjJfSFQyIHwgQURDX1RSMl9MVDIsIEFEQ19UUjJfSFQyKTsKKworICAgIC8qIFJlc2V0IHJlZ2lzdGVyIFRSMyAqLworICAgIE1PRElGWV9SRUcoQURDeC0+VFIzLCBBRENfVFIzX0hUMyB8IEFEQ19UUjNfTFQzLCBBRENfVFIzX0hUMyk7CisKKyAgICAvKiBSZXNldCByZWdpc3RlciBTUVIxICovCisgICAgQ0xFQVJfQklUKEFEQ3gtPlNRUjEsIChBRENfU1FSMV9TUTQgfCBBRENfU1FSMV9TUTMgfCBBRENfU1FSMV9TUTIgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX1NRUjFfU1ExIHwgQURDX1NRUjFfTCkpOworCisgICAgLyogUmVzZXQgcmVnaXN0ZXIgU1FSMiAqLworICAgIENMRUFSX0JJVChBREN4LT5TUVIyLCAoQURDX1NRUjJfU1E5IHwgQURDX1NRUjJfU1E4IHwgQURDX1NRUjJfU1E3IHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19TUVIyX1NRNiB8IEFEQ19TUVIyX1NRNSkpOworCisgICAgLyogUmVzZXQgcmVnaXN0ZXIgU1FSMyAqLworICAgIENMRUFSX0JJVChBREN4LT5TUVIzLCAoQURDX1NRUjNfU1ExNCB8IEFEQ19TUVIzX1NRMTMgfCBBRENfU1FSM19TUTEyIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19TUVIzX1NRMTEgfCBBRENfU1FSM19TUTEwKSk7CisKKyAgICAvKiBSZXNldCByZWdpc3RlciBTUVI0ICovCisgICAgQ0xFQVJfQklUKEFEQ3gtPlNRUjQsIEFEQ19TUVI0X1NRMTYgfCBBRENfU1FSNF9TUTE1KTsKKworICAgIC8qIFJlc2V0IHJlZ2lzdGVyIEpTUVIgKi8KKyAgICBDTEVBUl9CSVQoQURDeC0+SlNRUiwKKyAgICAgICAgICAgICAgKEFEQ19KU1FSX0pMIHwgQURDX0pTUVJfSkVYVFNFTCB8IEFEQ19KU1FSX0pFWFRFTiB8CisgICAgICAgICAgICAgICBBRENfSlNRUl9KU1E0IHwgQURDX0pTUVJfSlNRMyB8IEFEQ19KU1FSX0pTUTIgfCBBRENfSlNRUl9KU1ExKSk7CisKKyAgICAvKiBSZXNldCByZWdpc3RlciBEUiAqLworICAgIC8qIE5vdGU6IGJpdHMgaW4gYWNjZXNzIG1vZGUgcmVhZCBvbmx5LCBubyBkaXJlY3QgcmVzZXQgYXBwbGljYWJsZSAqLworCisgICAgLyogUmVzZXQgcmVnaXN0ZXIgT0ZSMSAqLworICAgIENMRUFSX0JJVChBREN4LT5PRlIxLCBBRENfT0ZSMV9PRkZTRVQxX0VOIHwgQURDX09GUjFfT0ZGU0VUMV9DSCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfT0ZSMV9PRkZTRVQxIHwgQURDX09GUjFfU0FURU4gfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX09GUjFfT0ZGU0VUUE9TKTsKKyAgICAvKiBSZXNldCByZWdpc3RlciBPRlIyICovCisgICAgQ0xFQVJfQklUKEFEQ3gtPk9GUjIsIEFEQ19PRlIyX09GRlNFVDJfRU4gfCBBRENfT0ZSMl9PRkZTRVQyX0NIIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19PRlIyX09GRlNFVDIgfCBBRENfT0ZSMl9TQVRFTiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfT0ZSMl9PRkZTRVRQT1MpOworICAgIC8qIFJlc2V0IHJlZ2lzdGVyIE9GUjMgKi8KKyAgICBDTEVBUl9CSVQoQURDeC0+T0ZSMywgQURDX09GUjNfT0ZGU0VUM19FTiB8IEFEQ19PRlIzX09GRlNFVDNfQ0ggfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX09GUjNfT0ZGU0VUMyB8IEFEQ19PRlIzX1NBVEVOIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19PRlIzX09GRlNFVFBPUyk7CisgICAgLyogUmVzZXQgcmVnaXN0ZXIgT0ZSNCAqLworICAgIENMRUFSX0JJVChBREN4LT5PRlI0LCBBRENfT0ZSNF9PRkZTRVQ0X0VOIHwgQURDX09GUjRfT0ZGU0VUNF9DSCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfT0ZSNF9PRkZTRVQ0IHwgQURDX09GUjRfU0FURU4gfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX09GUjRfT0ZGU0VUUE9TKTsKKworICAgIC8qIFJlc2V0IHJlZ2lzdGVycyBKRFIxLCBKRFIyLCBKRFIzLCBKRFI0ICovCisgICAgLyogTm90ZTogYml0cyBpbiBhY2Nlc3MgbW9kZSByZWFkIG9ubHksIG5vIGRpcmVjdCByZXNldCBhcHBsaWNhYmxlICovCisKKyAgICAvKiBSZXNldCByZWdpc3RlciBBV0QyQ1IgKi8KKyAgICBDTEVBUl9CSVQoQURDeC0+QVdEMkNSLCBBRENfQVdEMkNSX0FXRDJDSCk7CisKKyAgICAvKiBSZXNldCByZWdpc3RlciBBV0QzQ1IgKi8KKyAgICBDTEVBUl9CSVQoQURDeC0+QVdEM0NSLCBBRENfQVdEM0NSX0FXRDNDSCk7CisKKyAgICAvKiBSZXNldCByZWdpc3RlciBESUZTRUwgKi8KKyAgICBDTEVBUl9CSVQoQURDeC0+RElGU0VMLCBBRENfRElGU0VMX0RJRlNFTCk7CisKKyAgICAvKiBSZXNldCByZWdpc3RlciBDQUxGQUNUICovCisgICAgQ0xFQVJfQklUKEFEQ3gtPkNBTEZBQ1QsIEFEQ19DQUxGQUNUX0NBTEZBQ1RfRCB8IEFEQ19DQUxGQUNUX0NBTEZBQ1RfUyk7CisKKyAgICAvKiBSZXNldCByZWdpc3RlciBHQ09NUCAqLworICAgIENMRUFSX0JJVChBREN4LT5HQ09NUCwgQURDX0dDT01QX0dDT01QQ09FRkYpOworICB9IGVsc2UgeworICAgIC8qIEFEQyBpbnN0YW5jZSBpcyBpbiBhbiB1bmtub3duIHN0YXRlICovCisgICAgLyogTmVlZCB0byBwZXJmb3JtaW5nIGEgaGFyZCByZXNldCBvZiBBREMgaW5zdGFuY2UsIHVzaW5nIGhpZ2ggbGV2ZWwgICAgICAqLworICAgIC8qIGNsb2NrIHNvdXJjZSBSQ0MgQURDIHJlc2V0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBDYXV0aW9uOiBPbiB0aGlzIFNUTTMyIHNlcmllcywgaWYgc2V2ZXJhbCBBREMgaW5zdGFuY2VzIGFyZSBhdmFpbGFibGUgICovCisgICAgLyogICAgICAgICAgb24gdGhlIHNlbGVjdGVkIGRldmljZSwgUkNDIEFEQyByZXNldCB3aWxsIHJlc2V0ICAgICAgICAgICAgICAqLworICAgIC8qICAgICAgICAgIGFsbCBBREMgaW5zdGFuY2VzIGJlbG9uZ2luZyB0byB0aGUgY29tbW9uIEFEQyBpbnN0YW5jZS4gICAgICAgKi8KKyAgICAvKiBDYXV0aW9uOiBPbiB0aGlzIFNUTTMyIHNlcmllcywgaWYgc2V2ZXJhbCBBREMgaW5zdGFuY2VzIGFyZSBhdmFpbGFibGUgICovCisgICAgLyogICAgICAgICAgb24gdGhlIHNlbGVjdGVkIGRldmljZSwgUkNDIEFEQyByZXNldCB3aWxsIHJlc2V0ICAgICAgICAgICAgICAqLworICAgIC8qICAgICAgICAgIGFsbCBBREMgaW5zdGFuY2VzIGJlbG9uZ2luZyB0byB0aGUgY29tbW9uIEFEQyBpbnN0YW5jZS4gICAgICAgKi8KKyAgICBzdGF0dXMgPSBFUlJPUjsKKyAgfQorCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogQGJyaWVmICBJbml0aWFsaXplIHNvbWUgZmVhdHVyZXMgb2YgQURDIGluc3RhbmNlLgorICogQG5vdGUgICBUaGVzZSBwYXJhbWV0ZXJzIGhhdmUgYW4gaW1wYWN0IG9uIEFEQyBzY29wZTogQURDIGluc3RhbmNlLgorICogICAgICAgICBBZmZlY3RzIGJvdGggZ3JvdXAgcmVndWxhciBhbmQgZ3JvdXAgaW5qZWN0ZWQgKGF2YWlsYWJpbGl0eQorICogICAgICAgICBvZiBBREMgZ3JvdXAgaW5qZWN0ZWQgZGVwZW5kcyBvbiBTVE0zMiBzZXJpZXMpLgorICogICAgICAgICBSZWZlciB0byBjb3JyZXNwb25kaW5nIHVuaXRhcnkgZnVuY3Rpb25zIGludG8KKyAqICAgICAgICAgQHJlZiBBRENfTExfRUZfQ29uZmlndXJhdGlvbl9BRENfSW5zdGFuY2UgLgorICogQG5vdGUgICBUaGUgc2V0dGluZyBvZiB0aGVzZSBwYXJhbWV0ZXJzIGJ5IGZ1bmN0aW9uIEByZWYgTExfQURDX0luaXQoKQorICogICAgICAgICBpcyBjb25kaXRpb25lZCB0byBBREMgc3RhdGU6CisgKiAgICAgICAgIEFEQyBpbnN0YW5jZSBtdXN0IGJlIGRpc2FibGVkLgorICogICAgICAgICBUaGlzIGNvbmRpdGlvbiBpcyBhcHBsaWVkIHRvIGFsbCBBREMgZmVhdHVyZXMsIGZvciBlZmZpY2llbmN5CisgKiAgICAgICAgIGFuZCBjb21wYXRpYmlsaXR5IG92ZXIgYWxsIFNUTTMyIHNlcmllcy4gSG93ZXZlciwgdGhlIGRpZmZlcmVudAorICogICAgICAgICBmZWF0dXJlcyBjYW4gYmUgc2V0IHVuZGVyIGRpZmZlcmVudCBBREMgc3RhdGUgY29uZGl0aW9ucworICogICAgICAgICAoc2V0dGluZyBwb3NzaWJsZSB3aXRoIEFEQyBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZywKKyAqICAgICAgICAgQURDIGVuYWJsZWQgd2l0aCBjb252ZXJzaW9uIG9uIGdvaW5nLCAuLi4pCisgKiAgICAgICAgIEVhY2ggZmVhdHVyZSBjYW4gYmUgdXBkYXRlZCBhZnRlcndhcmRzIHdpdGggYSB1bml0YXJ5IGZ1bmN0aW9uCisgKiAgICAgICAgIGFuZCBwb3RlbnRpYWxseSB3aXRoIEFEQyBpbiBhIGRpZmZlcmVudCBzdGF0ZSB0aGFuIGRpc2FibGVkLAorICogICAgICAgICByZWZlciB0byBkZXNjcmlwdGlvbiBvZiBlYWNoIGZ1bmN0aW9uIGZvciBzZXR0aW5nCisgKiAgICAgICAgIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZS4KKyAqIEBub3RlICAgQWZ0ZXIgdXNpbmcgdGhpcyBmdW5jdGlvbiwgc29tZSBvdGhlciBmZWF0dXJlcyBtdXN0IGJlIGNvbmZpZ3VyZWQKKyAqICAgICAgICAgdXNpbmcgTEwgdW5pdGFyeSBmdW5jdGlvbnMuCisgKiAgICAgICAgIFRoZSBtaW5pbXVtIGNvbmZpZ3VyYXRpb24gcmVtYWluaW5nIHRvIGJlIGRvbmUgaXM6CisgKiAgICAgICAgICAtIFNldCBBREMgZ3JvdXAgcmVndWxhciBvciBncm91cCBpbmplY3RlZCBzZXF1ZW5jZXI6CisgKiAgICAgICAgICAgIG1hcCBjaGFubmVsIG9uIHRoZSBzZWxlY3RlZCBzZXF1ZW5jZXIgcmFuay4KKyAqICAgICAgICAgICAgUmVmZXIgdG8gZnVuY3Rpb24gQHJlZiBMTF9BRENfUkVHX1NldFNlcXVlbmNlclJhbmtzKCkuCisgKiAgICAgICAgICAtIFNldCBBREMgY2hhbm5lbCBzYW1wbGluZyB0aW1lCisgKiAgICAgICAgICAgIFJlZmVyIHRvIGZ1bmN0aW9uIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lKCk7CisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcGFyYW0gIHBBRENfSW5pdFN0cnVjdCBQb2ludGVyIHRvIGEgQHJlZiBMTF9BRENfUkVHX0luaXRUeXBlRGVmIHN0cnVjdHVyZQorICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAqICAgICAgICAgIC0gU1VDQ0VTUzogQURDIHJlZ2lzdGVycyBhcmUgaW5pdGlhbGl6ZWQKKyAqICAgICAgICAgIC0gRVJST1I6IEFEQyByZWdpc3RlcnMgYXJlIG5vdCBpbml0aWFsaXplZAorICovCitFcnJvclN0YXR1cyBMTF9BRENfSW5pdChBRENfVHlwZURlZiAqQURDeCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExMX0FEQ19Jbml0VHlwZURlZiAqcEFEQ19Jbml0U3RydWN0KSB7CisgIEVycm9yU3RhdHVzIHN0YXR1cyA9IFNVQ0NFU1M7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoQURDeCkpOworCisgIGFzc2VydF9wYXJhbShJU19MTF9BRENfUkVTT0xVVElPTihwQURDX0luaXRTdHJ1Y3QtPlJlc29sdXRpb24pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0FEQ19EQVRBX0FMSUdOKHBBRENfSW5pdFN0cnVjdC0+RGF0YUFsaWdubWVudCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfQURDX0xPV19QT1dFUihwQURDX0luaXRTdHJ1Y3QtPkxvd1Bvd2VyTW9kZSkpOworCisgIC8qIE5vdGU6IEhhcmR3YXJlIGNvbnN0cmFpbnQgKHJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIHRoaXMgZnVuY3Rpb24pOiAgICAgICAqLworICAvKiAgICAgICBBREMgaW5zdGFuY2UgbXVzdCBiZSBkaXNhYmxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaWYgKExMX0FEQ19Jc0VuYWJsZWQoQURDeCkgPT0gMFVMKSB7CisgICAgLyogQ29uZmlndXJhdGlvbiBvZiBBREMgaGllcmFyY2hpY2FsIHNjb3BlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAtIEFEQyBpbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAtIFNldCBBREMgZGF0YSByZXNvbHV0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogICAgLSBTZXQgQURDIGNvbnZlcnNpb24gZGF0YSBhbGlnbm1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgIC0gU2V0IEFEQyBsb3cgcG93ZXIgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBNT0RJRllfUkVHKEFEQ3gtPkNGR1IsIEFEQ19DRkdSX1JFUyB8IEFEQ19DRkdSX0FMSUdOIHwgQURDX0NGR1JfQVVURExZLAorICAgICAgICAgICAgICAgcEFEQ19Jbml0U3RydWN0LT5SZXNvbHV0aW9uIHwgcEFEQ19Jbml0U3RydWN0LT5EYXRhQWxpZ25tZW50IHwKKyAgICAgICAgICAgICAgICAgICBwQURDX0luaXRTdHJ1Y3QtPkxvd1Bvd2VyTW9kZSk7CisKKyAgfSBlbHNlIHsKKyAgICAvKiBJbml0aWFsaXphdGlvbiBlcnJvcjogQURDIGluc3RhbmNlIGlzIG5vdCBkaXNhYmxlZC4gKi8KKyAgICBzdGF0dXMgPSBFUlJPUjsKKyAgfQorCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogQGJyaWVmICBTZXQgZWFjaCBAcmVmIExMX0FEQ19Jbml0VHlwZURlZiBmaWVsZCB0byBkZWZhdWx0IHZhbHVlLgorICogQHBhcmFtICBwQURDX0luaXRTdHJ1Y3QgUG9pbnRlciB0byBhIEByZWYgTExfQURDX0luaXRUeXBlRGVmIHN0cnVjdHVyZQorICogICAgICAgICAgICAgICAgICAgICAgICB3aG9zZSBmaWVsZHMgd2lsbCBiZSBzZXQgdG8gZGVmYXVsdCB2YWx1ZXMuCisgKiBAcmV0dmFsIE5vbmUKKyAqLwordm9pZCBMTF9BRENfU3RydWN0SW5pdChMTF9BRENfSW5pdFR5cGVEZWYgKnBBRENfSW5pdFN0cnVjdCkgeworICAvKiBTZXQgcEFEQ19Jbml0U3RydWN0IGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcyAqLworICAvKiBTZXQgZmllbGRzIG9mIEFEQyBpbnN0YW5jZSAqLworICBwQURDX0luaXRTdHJ1Y3QtPlJlc29sdXRpb24gPSBMTF9BRENfUkVTT0xVVElPTl8xMkI7CisgIHBBRENfSW5pdFN0cnVjdC0+RGF0YUFsaWdubWVudCA9IExMX0FEQ19EQVRBX0FMSUdOX1JJR0hUOworICBwQURDX0luaXRTdHJ1Y3QtPkxvd1Bvd2VyTW9kZSA9IExMX0FEQ19MUF9NT0RFX05PTkU7Cit9CisKKy8qKgorICogQGJyaWVmICBJbml0aWFsaXplIHNvbWUgZmVhdHVyZXMgb2YgQURDIGdyb3VwIHJlZ3VsYXIuCisgKiBAbm90ZSAgIFRoZXNlIHBhcmFtZXRlcnMgaGF2ZSBhbiBpbXBhY3Qgb24gQURDIHNjb3BlOiBBREMgZ3JvdXAgcmVndWxhci4KKyAqICAgICAgICAgUmVmZXIgdG8gY29ycmVzcG9uZGluZyB1bml0YXJ5IGZ1bmN0aW9ucyBpbnRvCisgKiAgICAgICAgIEByZWYgQURDX0xMX0VGX0NvbmZpZ3VyYXRpb25fQURDX0dyb3VwX1JlZ3VsYXIKKyAqICAgICAgICAgKGZ1bmN0aW9ucyB3aXRoIHByZWZpeCAiUkVHIikuCisgKiBAbm90ZSAgIFRoZSBzZXR0aW5nIG9mIHRoZXNlIHBhcmFtZXRlcnMgYnkgZnVuY3Rpb24gQHJlZiBMTF9BRENfSW5pdCgpCisgKiAgICAgICAgIGlzIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZToKKyAqICAgICAgICAgQURDIGluc3RhbmNlIG11c3QgYmUgZGlzYWJsZWQuCisgKiAgICAgICAgIFRoaXMgY29uZGl0aW9uIGlzIGFwcGxpZWQgdG8gYWxsIEFEQyBmZWF0dXJlcywgZm9yIGVmZmljaWVuY3kKKyAqICAgICAgICAgYW5kIGNvbXBhdGliaWxpdHkgb3ZlciBhbGwgU1RNMzIgc2VyaWVzLiBIb3dldmVyLCB0aGUgZGlmZmVyZW50CisgKiAgICAgICAgIGZlYXR1cmVzIGNhbiBiZSBzZXQgdW5kZXIgZGlmZmVyZW50IEFEQyBzdGF0ZSBjb25kaXRpb25zCisgKiAgICAgICAgIChzZXR0aW5nIHBvc3NpYmxlIHdpdGggQURDIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nLAorICogICAgICAgICBBREMgZW5hYmxlZCB3aXRoIGNvbnZlcnNpb24gb24gZ29pbmcsIC4uLikKKyAqICAgICAgICAgRWFjaCBmZWF0dXJlIGNhbiBiZSB1cGRhdGVkIGFmdGVyd2FyZHMgd2l0aCBhIHVuaXRhcnkgZnVuY3Rpb24KKyAqICAgICAgICAgYW5kIHBvdGVudGlhbGx5IHdpdGggQURDIGluIGEgZGlmZmVyZW50IHN0YXRlIHRoYW4gZGlzYWJsZWQsCisgKiAgICAgICAgIHJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIGVhY2ggZnVuY3Rpb24gZm9yIHNldHRpbmcKKyAqICAgICAgICAgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlLgorICogQG5vdGUgICBBZnRlciB1c2luZyB0aGlzIGZ1bmN0aW9uLCBvdGhlciBmZWF0dXJlcyBtdXN0IGJlIGNvbmZpZ3VyZWQKKyAqICAgICAgICAgdXNpbmcgTEwgdW5pdGFyeSBmdW5jdGlvbnMuCisgKiAgICAgICAgIFRoZSBtaW5pbXVtIGNvbmZpZ3VyYXRpb24gcmVtYWluaW5nIHRvIGJlIGRvbmUgaXM6CisgKiAgICAgICAgICAtIFNldCBBREMgZ3JvdXAgcmVndWxhciBvciBncm91cCBpbmplY3RlZCBzZXF1ZW5jZXI6CisgKiAgICAgICAgICAgIG1hcCBjaGFubmVsIG9uIHRoZSBzZWxlY3RlZCBzZXF1ZW5jZXIgcmFuay4KKyAqICAgICAgICAgICAgUmVmZXIgdG8gZnVuY3Rpb24gQHJlZiBMTF9BRENfUkVHX1NldFNlcXVlbmNlclJhbmtzKCkuCisgKiAgICAgICAgICAtIFNldCBBREMgY2hhbm5lbCBzYW1wbGluZyB0aW1lCisgKiAgICAgICAgICAgIFJlZmVyIHRvIGZ1bmN0aW9uIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lKCk7CisgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgKiBAcGFyYW0gIHBBRENfUmVnSW5pdFN0cnVjdCBQb2ludGVyIHRvIGEgQHJlZiBMTF9BRENfUkVHX0luaXRUeXBlRGVmIHN0cnVjdHVyZQorICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAqICAgICAgICAgIC0gU1VDQ0VTUzogQURDIHJlZ2lzdGVycyBhcmUgaW5pdGlhbGl6ZWQKKyAqICAgICAgICAgIC0gRVJST1I6IEFEQyByZWdpc3RlcnMgYXJlIG5vdCBpbml0aWFsaXplZAorICovCitFcnJvclN0YXR1cyBMTF9BRENfUkVHX0luaXQoQURDX1R5cGVEZWYgKkFEQ3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTExfQURDX1JFR19Jbml0VHlwZURlZiAqcEFEQ19SZWdJbml0U3RydWN0KSB7CisgIEVycm9yU3RhdHVzIHN0YXR1cyA9IFNVQ0NFU1M7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoQURDeCkpOworICBhc3NlcnRfcGFyYW0oCisgICAgICBJU19MTF9BRENfUkVHX1RSSUdfU09VUkNFKEFEQ3gsIHBBRENfUmVnSW5pdFN0cnVjdC0+VHJpZ2dlclNvdXJjZSkpOworICBhc3NlcnRfcGFyYW0oCisgICAgICBJU19MTF9BRENfUkVHX1NFUV9TQ0FOX0xFTkdUSChwQURDX1JlZ0luaXRTdHJ1Y3QtPlNlcXVlbmNlckxlbmd0aCkpOworICBpZiAocEFEQ19SZWdJbml0U3RydWN0LT5TZXF1ZW5jZXJMZW5ndGggIT0gTExfQURDX1JFR19TRVFfU0NBTl9ESVNBQkxFKSB7CisgICAgYXNzZXJ0X3BhcmFtKElTX0xMX0FEQ19SRUdfU0VRX1NDQU5fRElTQ09OVF9NT0RFKAorICAgICAgICBwQURDX1JlZ0luaXRTdHJ1Y3QtPlNlcXVlbmNlckRpc2NvbnQpKTsKKworICAgIC8qIEFEQyBncm91cCByZWd1bGFyIGNvbnRpbnVvdXMgbW9kZSBhbmQgZGlzY29udGludW91cyBtb2RlICovCisgICAgLyogY2FuIG5vdCBiZSBlbmFibGVkIHNpbXVsdGVuYWVvdXNseSAqLworICAgIGFzc2VydF9wYXJhbSgKKyAgICAgICAgKHBBRENfUmVnSW5pdFN0cnVjdC0+Q29udGludW91c01vZGUgPT0gTExfQURDX1JFR19DT05WX1NJTkdMRSkgfHwKKyAgICAgICAgKHBBRENfUmVnSW5pdFN0cnVjdC0+U2VxdWVuY2VyRGlzY29udCA9PQorICAgICAgICAgTExfQURDX1JFR19TRVFfRElTQ09OVF9ESVNBQkxFKSk7CisgIH0KKyAgYXNzZXJ0X3BhcmFtKAorICAgICAgSVNfTExfQURDX1JFR19DT05USU5VT1VTX01PREUocEFEQ19SZWdJbml0U3RydWN0LT5Db250aW51b3VzTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfQURDX1JFR19ETUFfVFJBTlNGRVIocEFEQ19SZWdJbml0U3RydWN0LT5ETUFUcmFuc2ZlcikpOworICBhc3NlcnRfcGFyYW0oSVNfTExfQURDX1JFR19PVlJfREFUQV9CRUhBVklPUihwQURDX1JlZ0luaXRTdHJ1Y3QtPk92ZXJydW4pKTsKKworICAvKiBOb3RlOiBIYXJkd2FyZSBjb25zdHJhaW50IChyZWZlciB0byBkZXNjcmlwdGlvbiBvZiB0aGlzIGZ1bmN0aW9uKTogICAgICAgKi8KKyAgLyogICAgICAgQURDIGluc3RhbmNlIG11c3QgYmUgZGlzYWJsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIGlmIChMTF9BRENfSXNFbmFibGVkKEFEQ3gpID09IDBVTCkgeworICAgIC8qIENvbmZpZ3VyYXRpb24gb2YgQURDIGhpZXJhcmNoaWNhbCBzY29wZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgLSBBREMgZ3JvdXAgcmVndWxhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogICAgLSBTZXQgQURDIGdyb3VwIHJlZ3VsYXIgdHJpZ2dlciBzb3VyY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgIC0gU2V0IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBsZW5ndGggICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAtIFNldCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZGlzY29udGludW91cyBtb2RlICAgICAgICAgICAgICAgICovCisgICAgLyogICAgLSBTZXQgQURDIGdyb3VwIHJlZ3VsYXIgY29udGludW91cyBtb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgIC0gU2V0IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gZGF0YSB0cmFuc2Zlcjogbm8gdHJhbnNmZXIgb3IgICAgKi8KKyAgICAvKiAgICAgIHRyYW5zZmVyIGJ5IERNQSwgYW5kIERNQSByZXF1ZXN0cyBtb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogICAgLSBTZXQgQURDIGdyb3VwIHJlZ3VsYXIgb3ZlcnJ1biBiZWhhdmlvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIE5vdGU6IE9uIHRoaXMgU1RNMzIgc2VyaWVzLCBBREMgdHJpZ2dlciBlZGdlIGlzIHNldCB0byB2YWx1ZSAweDAgYnkgICAgKi8KKyAgICAvKiAgICAgICBzZXR0aW5nIG9mIHRyaWdnZXIgc291cmNlIHRvIFNXIHN0YXJ0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYgKHBBRENfUmVnSW5pdFN0cnVjdC0+U2VxdWVuY2VyTGVuZ3RoICE9IExMX0FEQ19SRUdfU0VRX1NDQU5fRElTQUJMRSkgeworICAgICAgTU9ESUZZX1JFRyhBREN4LT5DRkdSLAorICAgICAgICAgICAgICAgICBBRENfQ0ZHUl9FWFRTRUwgfCBBRENfQ0ZHUl9FWFRFTiB8IEFEQ19DRkdSX0RJU0NFTiB8CisgICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUl9ESVNDTlVNIHwgQURDX0NGR1JfQ09OVCB8IEFEQ19DRkdSX0RNQUVOIHwKKyAgICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSX0RNQUNGRyB8IEFEQ19DRkdSX09WUk1PRCwKKyAgICAgICAgICAgICAgICAgcEFEQ19SZWdJbml0U3RydWN0LT5UcmlnZ2VyU291cmNlIHwKKyAgICAgICAgICAgICAgICAgICAgIHBBRENfUmVnSW5pdFN0cnVjdC0+U2VxdWVuY2VyRGlzY29udCB8CisgICAgICAgICAgICAgICAgICAgICBwQURDX1JlZ0luaXRTdHJ1Y3QtPkNvbnRpbnVvdXNNb2RlIHwKKyAgICAgICAgICAgICAgICAgICAgIHBBRENfUmVnSW5pdFN0cnVjdC0+RE1BVHJhbnNmZXIgfAorICAgICAgICAgICAgICAgICAgICAgcEFEQ19SZWdJbml0U3RydWN0LT5PdmVycnVuKTsKKyAgICB9IGVsc2UgeworICAgICAgTU9ESUZZX1JFRygKKyAgICAgICAgICBBREN4LT5DRkdSLAorICAgICAgICAgIEFEQ19DRkdSX0VYVFNFTCB8IEFEQ19DRkdSX0VYVEVOIHwgQURDX0NGR1JfRElTQ0VOIHwKKyAgICAgICAgICAgICAgQURDX0NGR1JfRElTQ05VTSB8IEFEQ19DRkdSX0NPTlQgfCBBRENfQ0ZHUl9ETUFFTiB8CisgICAgICAgICAgICAgIEFEQ19DRkdSX0RNQUNGRyB8IEFEQ19DRkdSX09WUk1PRCwKKyAgICAgICAgICBwQURDX1JlZ0luaXRTdHJ1Y3QtPlRyaWdnZXJTb3VyY2UgfCBMTF9BRENfUkVHX1NFUV9ESVNDT05UX0RJU0FCTEUgfAorICAgICAgICAgICAgICBwQURDX1JlZ0luaXRTdHJ1Y3QtPkNvbnRpbnVvdXNNb2RlIHwKKyAgICAgICAgICAgICAgcEFEQ19SZWdJbml0U3RydWN0LT5ETUFUcmFuc2ZlciB8IHBBRENfUmVnSW5pdFN0cnVjdC0+T3ZlcnJ1bik7CisgICAgfQorCisgICAgLyogU2V0IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBsZW5ndGggYW5kIHNjYW4gZGlyZWN0aW9uICovCisgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJMZW5ndGgoQURDeCwgcEFEQ19SZWdJbml0U3RydWN0LT5TZXF1ZW5jZXJMZW5ndGgpOworICB9IGVsc2UgeworICAgIC8qIEluaXRpYWxpemF0aW9uIGVycm9yOiBBREMgaW5zdGFuY2UgaXMgbm90IGRpc2FibGVkLiAqLworICAgIHN0YXR1cyA9IEVSUk9SOworICB9CisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogQGJyaWVmICBTZXQgZWFjaCBAcmVmIExMX0FEQ19SRUdfSW5pdFR5cGVEZWYgZmllbGQgdG8gZGVmYXVsdCB2YWx1ZS4KKyAqIEBwYXJhbSAgcEFEQ19SZWdJbml0U3RydWN0IFBvaW50ZXIgdG8gYSBAcmVmIExMX0FEQ19SRUdfSW5pdFR5cGVEZWYgc3RydWN0dXJlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aG9zZSBmaWVsZHMgd2lsbCBiZSBzZXQgdG8gZGVmYXVsdCB2YWx1ZXMuCisgKiBAcmV0dmFsIE5vbmUKKyAqLwordm9pZCBMTF9BRENfUkVHX1N0cnVjdEluaXQoTExfQURDX1JFR19Jbml0VHlwZURlZiAqcEFEQ19SZWdJbml0U3RydWN0KSB7CisgIC8qIFNldCBwQURDX1JlZ0luaXRTdHJ1Y3QgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzICovCisgIC8qIFNldCBmaWVsZHMgb2YgQURDIGdyb3VwIHJlZ3VsYXIgKi8KKyAgLyogTm90ZTogT24gdGhpcyBTVE0zMiBzZXJpZXMsIEFEQyB0cmlnZ2VyIGVkZ2UgaXMgc2V0IHRvIHZhbHVlIDB4MCBieSAgICAgICovCisgIC8qICAgICAgIHNldHRpbmcgb2YgdHJpZ2dlciBzb3VyY2UgdG8gU1cgc3RhcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBwQURDX1JlZ0luaXRTdHJ1Y3QtPlRyaWdnZXJTb3VyY2UgPSBMTF9BRENfUkVHX1RSSUdfU09GVFdBUkU7CisgIHBBRENfUmVnSW5pdFN0cnVjdC0+U2VxdWVuY2VyTGVuZ3RoID0gTExfQURDX1JFR19TRVFfU0NBTl9ESVNBQkxFOworICBwQURDX1JlZ0luaXRTdHJ1Y3QtPlNlcXVlbmNlckRpc2NvbnQgPSBMTF9BRENfUkVHX1NFUV9ESVNDT05UX0RJU0FCTEU7CisgIHBBRENfUmVnSW5pdFN0cnVjdC0+Q29udGludW91c01vZGUgPSBMTF9BRENfUkVHX0NPTlZfU0lOR0xFOworICBwQURDX1JlZ0luaXRTdHJ1Y3QtPkRNQVRyYW5zZmVyID0gTExfQURDX1JFR19ETUFfVFJBTlNGRVJfTk9ORTsKKyAgcEFEQ19SZWdJbml0U3RydWN0LT5PdmVycnVuID0gTExfQURDX1JFR19PVlJfREFUQV9PVkVSV1JJVFRFTjsKK30KKworLyoqCisgKiBAYnJpZWYgIEluaXRpYWxpemUgc29tZSBmZWF0dXJlcyBvZiBBREMgZ3JvdXAgaW5qZWN0ZWQuCisgKiBAbm90ZSAgIFRoZXNlIHBhcmFtZXRlcnMgaGF2ZSBhbiBpbXBhY3Qgb24gQURDIHNjb3BlOiBBREMgZ3JvdXAgaW5qZWN0ZWQuCisgKiAgICAgICAgIFJlZmVyIHRvIGNvcnJlc3BvbmRpbmcgdW5pdGFyeSBmdW5jdGlvbnMgaW50bworICogICAgICAgICBAcmVmIEFEQ19MTF9FRl9Db25maWd1cmF0aW9uX0FEQ19Hcm91cF9SZWd1bGFyCisgKiAgICAgICAgIChmdW5jdGlvbnMgd2l0aCBwcmVmaXggIklOSiIpLgorICogQG5vdGUgICBUaGUgc2V0dGluZyBvZiB0aGVzZSBwYXJhbWV0ZXJzIGJ5IGZ1bmN0aW9uIEByZWYgTExfQURDX0luaXQoKQorICogICAgICAgICBpcyBjb25kaXRpb25lZCB0byBBREMgc3RhdGU6CisgKiAgICAgICAgIEFEQyBpbnN0YW5jZSBtdXN0IGJlIGRpc2FibGVkLgorICogICAgICAgICBUaGlzIGNvbmRpdGlvbiBpcyBhcHBsaWVkIHRvIGFsbCBBREMgZmVhdHVyZXMsIGZvciBlZmZpY2llbmN5CisgKiAgICAgICAgIGFuZCBjb21wYXRpYmlsaXR5IG92ZXIgYWxsIFNUTTMyIHNlcmllcy4gSG93ZXZlciwgdGhlIGRpZmZlcmVudAorICogICAgICAgICBmZWF0dXJlcyBjYW4gYmUgc2V0IHVuZGVyIGRpZmZlcmVudCBBREMgc3RhdGUgY29uZGl0aW9ucworICogICAgICAgICAoc2V0dGluZyBwb3NzaWJsZSB3aXRoIEFEQyBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZywKKyAqICAgICAgICAgQURDIGVuYWJsZWQgd2l0aCBjb252ZXJzaW9uIG9uIGdvaW5nLCAuLi4pCisgKiAgICAgICAgIEVhY2ggZmVhdHVyZSBjYW4gYmUgdXBkYXRlZCBhZnRlcndhcmRzIHdpdGggYSB1bml0YXJ5IGZ1bmN0aW9uCisgKiAgICAgICAgIGFuZCBwb3RlbnRpYWxseSB3aXRoIEFEQyBpbiBhIGRpZmZlcmVudCBzdGF0ZSB0aGFuIGRpc2FibGVkLAorICogICAgICAgICByZWZlciB0byBkZXNjcmlwdGlvbiBvZiBlYWNoIGZ1bmN0aW9uIGZvciBzZXR0aW5nCisgKiAgICAgICAgIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZS4KKyAqIEBub3RlICAgQWZ0ZXIgdXNpbmcgdGhpcyBmdW5jdGlvbiwgb3RoZXIgZmVhdHVyZXMgbXVzdCBiZSBjb25maWd1cmVkCisgKiAgICAgICAgIHVzaW5nIExMIHVuaXRhcnkgZnVuY3Rpb25zLgorICogICAgICAgICBUaGUgbWluaW11bSBjb25maWd1cmF0aW9uIHJlbWFpbmluZyB0byBiZSBkb25lIGlzOgorICogICAgICAgICAgLSBTZXQgQURDIGdyb3VwIGluamVjdGVkIHNlcXVlbmNlcjoKKyAqICAgICAgICAgICAgbWFwIGNoYW5uZWwgb24gdGhlIHNlbGVjdGVkIHNlcXVlbmNlciByYW5rLgorICogICAgICAgICAgICBSZWZlciB0byBmdW5jdGlvbiBAcmVmIExMX0FEQ19JTkpfU2V0U2VxdWVuY2VyUmFua3MoKS4KKyAqICAgICAgICAgIC0gU2V0IEFEQyBjaGFubmVsIHNhbXBsaW5nIHRpbWUKKyAqICAgICAgICAgICAgUmVmZXIgdG8gZnVuY3Rpb24gTExfQURDX1NldENoYW5uZWxTYW1wbGluZ1RpbWUoKTsKKyAqIEBub3RlICAgQ2F1dGlvbiBpZiBmZWF0dXJlIEFEQyBncm91cCBpbmplY3RlZCBjb250ZXh0cyBxdWV1ZSBpcyBlbmFibGVkCisgKiAgICAgICAgIChyZWZlciB0byB3aXRoIGZ1bmN0aW9uIEByZWYgTExfQURDX0lOSl9TZXRRdWV1ZU1vZGUoKSApOgorICogICAgICAgICB1c2luZyBzdWNjZXNzaXZlbHkgc2V2ZXJhbCB0aW1lcyB0aGlzIGZ1bmN0aW9uIHdpbGwgYXBwZWFyIGFzCisgKiAgICAgICAgIGhhdmluZyBubyBlZmZlY3QuCisgKiAgICAgICAgIFRvIHNldCBzZXZlcmFsIGZlYXR1cmVzIG9mIEFEQyBncm91cCBpbmplY3RlZCwgdXNlCisgKiAgICAgICAgIGZ1bmN0aW9uIEByZWYgTExfQURDX0lOSl9Db25maWdRdWV1ZUNvbnRleHQoKS4KKyAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAqIEBwYXJhbSAgcEFEQ19JbmpJbml0U3RydWN0IFBvaW50ZXIgdG8gYSBAcmVmIExMX0FEQ19JTkpfSW5pdFR5cGVEZWYgc3RydWN0dXJlCisgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICogICAgICAgICAgLSBTVUNDRVNTOiBBREMgcmVnaXN0ZXJzIGFyZSBpbml0aWFsaXplZAorICogICAgICAgICAgLSBFUlJPUjogQURDIHJlZ2lzdGVycyBhcmUgbm90IGluaXRpYWxpemVkCisgKi8KK0Vycm9yU3RhdHVzIExMX0FEQ19JTkpfSW5pdChBRENfVHlwZURlZiAqQURDeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMTF9BRENfSU5KX0luaXRUeXBlRGVmICpwQURDX0luakluaXRTdHJ1Y3QpIHsKKyAgRXJyb3JTdGF0dXMgc3RhdHVzID0gU1VDQ0VTUzsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShBREN4KSk7CisgIGFzc2VydF9wYXJhbSgKKyAgICAgIElTX0xMX0FEQ19JTkpfVFJJR19TT1VSQ0UoQURDeCwgcEFEQ19JbmpJbml0U3RydWN0LT5UcmlnZ2VyU291cmNlKSk7CisgIGFzc2VydF9wYXJhbSgKKyAgICAgIElTX0xMX0FEQ19JTkpfU0VRX1NDQU5fTEVOR1RIKHBBRENfSW5qSW5pdFN0cnVjdC0+U2VxdWVuY2VyTGVuZ3RoKSk7CisgIGlmIChwQURDX0luakluaXRTdHJ1Y3QtPlNlcXVlbmNlckxlbmd0aCAhPSBMTF9BRENfSU5KX1NFUV9TQ0FOX0RJU0FCTEUpIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTExfQURDX0lOSl9TRVFfU0NBTl9ESVNDT05UX01PREUoCisgICAgICAgIHBBRENfSW5qSW5pdFN0cnVjdC0+U2VxdWVuY2VyRGlzY29udCkpOworICB9CisgIGFzc2VydF9wYXJhbShJU19MTF9BRENfSU5KX1RSSUdfQVVUTyhwQURDX0luakluaXRTdHJ1Y3QtPlRyaWdBdXRvKSk7CisKKyAgLyogTm90ZTogSGFyZHdhcmUgY29uc3RyYWludCAocmVmZXIgdG8gZGVzY3JpcHRpb24gb2YgdGhpcyBmdW5jdGlvbik6ICAgICAgICovCisgIC8qICAgICAgIEFEQyBpbnN0YW5jZSBtdXN0IGJlIGRpc2FibGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpZiAoTExfQURDX0lzRW5hYmxlZChBREN4KSA9PSAwVUwpIHsKKyAgICAvKiBDb25maWd1cmF0aW9uIG9mIEFEQyBoaWVyYXJjaGljYWwgc2NvcGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogIC0gQURDIGdyb3VwIGluamVjdGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgIC0gU2V0IEFEQyBncm91cCBpbmplY3RlZCB0cmlnZ2VyIHNvdXJjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAtIFNldCBBREMgZ3JvdXAgaW5qZWN0ZWQgc2VxdWVuY2VyIGxlbmd0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogICAgLSBTZXQgQURDIGdyb3VwIGluamVjdGVkIHNlcXVlbmNlciBkaXNjb250aW51b3VzIG1vZGUgICAgICAgICAgICAgICAqLworICAgIC8qICAgIC0gU2V0IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXI6IGluZGVwZW5kZW50IG9yICAgICAgICAgKi8KKyAgICAvKiAgICAgIGZyb20gQURDIGdyb3VwIHJlZ3VsYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogTm90ZTogT24gdGhpcyBTVE0zMiBzZXJpZXMsIEFEQyB0cmlnZ2VyIGVkZ2UgaXMgc2V0IHRvIHZhbHVlIDB4MCBieSAgICAqLworICAgIC8qICAgICAgIHNldHRpbmcgb2YgdHJpZ2dlciBzb3VyY2UgdG8gU1cgc3RhcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpZiAocEFEQ19JbmpJbml0U3RydWN0LT5TZXF1ZW5jZXJMZW5ndGggIT0gTExfQURDX1JFR19TRVFfU0NBTl9ESVNBQkxFKSB7CisgICAgICBNT0RJRllfUkVHKAorICAgICAgICAgIEFEQ3gtPkNGR1IsIEFEQ19DRkdSX0pESVNDRU4gfCBBRENfQ0ZHUl9KQVVUTywKKyAgICAgICAgICBwQURDX0luakluaXRTdHJ1Y3QtPlNlcXVlbmNlckRpc2NvbnQgfCBwQURDX0luakluaXRTdHJ1Y3QtPlRyaWdBdXRvKTsKKyAgICB9IGVsc2UgeworICAgICAgTU9ESUZZX1JFRyhBREN4LT5DRkdSLCBBRENfQ0ZHUl9KRElTQ0VOIHwgQURDX0NGR1JfSkFVVE8sCisgICAgICAgICAgICAgICAgIExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfRElTQUJMRSB8IHBBRENfSW5qSW5pdFN0cnVjdC0+VHJpZ0F1dG8pOworICAgIH0KKworICAgIE1PRElGWV9SRUcoQURDeC0+SlNRUiwgQURDX0pTUVJfSkVYVFNFTCB8IEFEQ19KU1FSX0pFWFRFTiB8IEFEQ19KU1FSX0pMLAorICAgICAgICAgICAgICAgcEFEQ19JbmpJbml0U3RydWN0LT5UcmlnZ2VyU291cmNlIHwKKyAgICAgICAgICAgICAgICAgICBwQURDX0luakluaXRTdHJ1Y3QtPlNlcXVlbmNlckxlbmd0aCk7CisgIH0gZWxzZSB7CisgICAgLyogSW5pdGlhbGl6YXRpb24gZXJyb3I6IEFEQyBpbnN0YW5jZSBpcyBub3QgZGlzYWJsZWQuICovCisgICAgc3RhdHVzID0gRVJST1I7CisgIH0KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBAYnJpZWYgIFNldCBlYWNoIEByZWYgTExfQURDX0lOSl9Jbml0VHlwZURlZiBmaWVsZCB0byBkZWZhdWx0IHZhbHVlLgorICogQHBhcmFtICBwQURDX0luakluaXRTdHJ1Y3QgUG9pbnRlciB0byBhIEByZWYgTExfQURDX0lOSl9Jbml0VHlwZURlZiBzdHJ1Y3R1cmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdob3NlIGZpZWxkcyB3aWxsIGJlIHNldCB0byBkZWZhdWx0IHZhbHVlcy4KKyAqIEByZXR2YWwgTm9uZQorICovCit2b2lkIExMX0FEQ19JTkpfU3RydWN0SW5pdChMTF9BRENfSU5KX0luaXRUeXBlRGVmICpwQURDX0luakluaXRTdHJ1Y3QpIHsKKyAgLyogU2V0IHBBRENfSW5qSW5pdFN0cnVjdCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMgKi8KKyAgLyogU2V0IGZpZWxkcyBvZiBBREMgZ3JvdXAgaW5qZWN0ZWQgKi8KKyAgcEFEQ19JbmpJbml0U3RydWN0LT5UcmlnZ2VyU291cmNlID0gTExfQURDX0lOSl9UUklHX1NPRlRXQVJFOworICBwQURDX0luakluaXRTdHJ1Y3QtPlNlcXVlbmNlckxlbmd0aCA9IExMX0FEQ19JTkpfU0VRX1NDQU5fRElTQUJMRTsKKyAgcEFEQ19JbmpJbml0U3RydWN0LT5TZXF1ZW5jZXJEaXNjb250ID0gTExfQURDX0lOSl9TRVFfRElTQ09OVF9ESVNBQkxFOworICBwQURDX0luakluaXRTdHJ1Y3QtPlRyaWdBdXRvID0gTExfQURDX0lOSl9UUklHX0lOREVQRU5ERU5UOworfQorCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisjZW5kaWYgLyogQURDMSB8fCBBREMyIHx8IEFEQzMgfHwgQURDNCB8fCBBREM1ICovCisKKy8qKgorICogQH0KKyAqLworCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCmRpZmYgLS1naXQgYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0RyaXZlcnMvU1RNMzJHNHh4X0hBTF9Ecml2ZXIvU3JjL3N0bTMyZzR4eF9sbF91c2IuYyBiL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2xsX3VzYi5jCmluZGV4IDU5M2E5MDkuLjJkZDU1NzIgMTAwNjQ0Ci0tLSBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2xsX3VzYi5jCisrKyBiL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHJpdmVycy9TVE0zMkc0eHhfSEFMX0RyaXZlci9TcmMvc3RtMzJnNHh4X2xsX3VzYi5jCkBAIC0xLDczNyArMSw4MDkgQEAKLS8qKg0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICAqIEBmaWxlICAgIHN0bTMyZzR4eF9sbF91c2IuYw0KLSAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQ0KLSAgKiBAYnJpZWYgICBVU0IgTG93IExheWVyIEhBTCBtb2R1bGUgZHJpdmVyLg0KLSAgKg0KLSAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nDQotICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgVVNCIFBlcmlwaGVyYWwgQ29udHJvbGxlcjoNCi0gICogICAgICAgICAgICsgSW5pdGlhbGl6YXRpb24vZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zDQotICAqICAgICAgICAgICArIEkvTyBvcGVyYXRpb24gZnVuY3Rpb25zDQotICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMNCi0gICogICAgICAgICAgICsgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMNCi0gICoNCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgKiBAYXR0ZW50aW9uDQotICAqDQotICAqIENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuDQotICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQotICAqDQotICAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGVybXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZQ0KLSAgKiBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb2Z0d2FyZSBjb21wb25lbnQuDQotICAqIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcyB3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLg0KLSAgKg0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICBAdmVyYmF0aW0NCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIw0KLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgIFsuLl0NCi0gICAgICAoIykgRmlsbCBwYXJhbWV0ZXJzIG9mIEluaXQgc3RydWN0dXJlIGluIFVTQl9PVEdfQ2ZnVHlwZURlZiBzdHJ1Y3R1cmUuDQotDQotICAgICAgKCMpIENhbGwgVVNCX0NvcmVJbml0KCkgQVBJIHRvIGluaXRpYWxpemUgdGhlIFVTQiBDb3JlIHBlcmlwaGVyYWwuDQotDQotICAgICAgKCMpIFRoZSB1cHBlciBIQUwgSENEL1BDRCBkcml2ZXIgd2lsbCBjYWxsIHRoZSByaWdodCByb3V0aW5lcyBmb3IgaXRzDQotICBpbnRlcm5hbCBwcm9jZXNzZXMuDQotDQotICBAZW5kdmVyYmF0aW0NCi0NCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgKi8NCi0NCi0vKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpbmNsdWRlICJzdG0zMmc0eHhfaGFsLmgiDQotDQotLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzR4eF9MTF9VU0JfRFJJVkVSDQotICogQHsNCi0gKi8NCi0NCi0jaWYgZGVmaW5lZChIQUxfUENEX01PRFVMRV9FTkFCTEVEKSB8fCBkZWZpbmVkKEhBTF9IQ0RfTU9EVUxFX0VOQUJMRUQpDQotI2lmIGRlZmluZWQoVVNCKQ0KLS8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFVTQiBDb3JlDQotICogQHBhcmFtICBVU0J4IFVTQiBJbnN0YW5jZQ0KLSAqIEBwYXJhbSAgY2ZnIHBvaW50ZXIgdG8gYSBVU0JfQ2ZnVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KLSAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVVNCeCBwZXJpcGhlcmFsLg0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIFVTQl9Db3JlSW5pdChVU0JfVHlwZURlZiAqVVNCeCwgVVNCX0NmZ1R5cGVEZWYgY2ZnKSB7DQotICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovDQotICBVTlVTRUQoVVNCeCk7DQotICBVTlVTRUQoY2ZnKTsNCi0NCi0gIC8qIE5PVEUgOiAtIFRoaXMgZnVuY3Rpb24gaXMgbm90IHJlcXVpcmVkIGJ5IFVTQiBEZXZpY2UgRlMgcGVyaXBoZXJhbCwgaXQgaXMNCi0gICAgIHVzZWQgb25seSBieSBVU0IgT1RHIEZTIHBlcmlwaGVyYWwuDQotICAgICAgICAgICAgLSBUaGlzIGZ1bmN0aW9uIGlzIGFkZGVkIHRvIGVuc3VyZSBjb21wYXRpYmlsaXR5IGFjcm9zcyBwbGF0Zm9ybXMuDQotICAgKi8NCi0NCi0gIHJldHVybiBIQUxfT0s7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgVVNCX0VuYWJsZUdsb2JhbEludA0KLSAqICAgICAgICAgRW5hYmxlcyB0aGUgY29udHJvbGxlcidzIEdsb2JhbCBJbnQgaW4gdGhlIEFIQiBDb25maWcgcmVnDQotICogQHBhcmFtICBVU0J4IFNlbGVjdGVkIGRldmljZQ0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIFVTQl9FbmFibGVHbG9iYWxJbnQoVVNCX1R5cGVEZWYgKlVTQngpIHsNCi0gIHVpbnQzMl90IHdpbnRlcnJ1cHRtYXNrOw0KLQ0KLSAgLyogQ2xlYXIgcGVuZGluZyBpbnRlcnJ1cHRzICovDQotICBVU0J4LT5JU1RSID0gMFU7DQotDQotICAvKiBTZXQgd2ludGVycnVwdG1hc2sgdmFyaWFibGUgKi8NCi0gIHdpbnRlcnJ1cHRtYXNrID0gVVNCX0NOVFJfQ1RSTSB8IFVTQl9DTlRSX1dLVVBNIHwgVVNCX0NOVFJfU1VTUE0gfA0KLSAgICAgICAgICAgICAgICAgICBVU0JfQ05UUl9FUlJNIHwgVVNCX0NOVFJfU09GTSB8IFVTQl9DTlRSX0VTT0ZNIHwNCi0gICAgICAgICAgICAgICAgICAgVVNCX0NOVFJfUkVTRVRNIHwgVVNCX0NOVFJfTDFSRVFNOw0KLQ0KLSAgLyogU2V0IGludGVycnVwdCBtYXNrICovDQotICBVU0J4LT5DTlRSID0gKHVpbnQxNl90KXdpbnRlcnJ1cHRtYXNrOw0KLQ0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBVU0JfRGlzYWJsZUdsb2JhbEludA0KLSAqICAgICAgICAgRGlzYWJsZSB0aGUgY29udHJvbGxlcidzIEdsb2JhbCBJbnQgaW4gdGhlIEFIQiBDb25maWcgcmVnDQotICogQHBhcmFtICBVU0J4IFNlbGVjdGVkIGRldmljZQ0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIFVTQl9EaXNhYmxlR2xvYmFsSW50KFVTQl9UeXBlRGVmICpVU0J4KSB7DQotICB1aW50MzJfdCB3aW50ZXJydXB0bWFzazsNCi0NCi0gIC8qIFNldCB3aW50ZXJydXB0bWFzayB2YXJpYWJsZSAqLw0KLSAgd2ludGVycnVwdG1hc2sgPSBVU0JfQ05UUl9DVFJNIHwgVVNCX0NOVFJfV0tVUE0gfCBVU0JfQ05UUl9TVVNQTSB8DQotICAgICAgICAgICAgICAgICAgIFVTQl9DTlRSX0VSUk0gfCBVU0JfQ05UUl9TT0ZNIHwgVVNCX0NOVFJfRVNPRk0gfA0KLSAgICAgICAgICAgICAgICAgICBVU0JfQ05UUl9SRVNFVE0gfCBVU0JfQ05UUl9MMVJFUU07DQotDQotICAvKiBDbGVhciBpbnRlcnJ1cHQgbWFzayAqLw0KLSAgVVNCeC0+Q05UUiAmPSAodWludDE2X3QpKH53aW50ZXJydXB0bWFzayk7DQotDQotICByZXR1cm4gSEFMX09LOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFVTQl9TZXRDdXJyZW50TW9kZSBTZXQgZnVuY3Rpb25hbCBtb2RlDQotICogQHBhcmFtICBVU0J4IFNlbGVjdGVkIGRldmljZQ0KLSAqIEBwYXJhbSAgbW9kZSBjdXJyZW50IGNvcmUgbW9kZQ0KLSAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIHRoZXNlIHZhbHVlczoNCi0gKiAgICAgICAgICAgIEBhcmcgVVNCX0RFVklDRV9NT0RFIFBlcmlwaGVyYWwgbW9kZQ0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIFVTQl9TZXRDdXJyZW50TW9kZShVU0JfVHlwZURlZiAqVVNCeCwgVVNCX01vZGVUeXBlRGVmIG1vZGUpIHsNCi0gIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8NCi0gIFVOVVNFRChVU0J4KTsNCi0gIFVOVVNFRChtb2RlKTsNCi0NCi0gIC8qIE5PVEUgOiAtIFRoaXMgZnVuY3Rpb24gaXMgbm90IHJlcXVpcmVkIGJ5IFVTQiBEZXZpY2UgRlMgcGVyaXBoZXJhbCwgaXQgaXMNCi0gICAgIHVzZWQgb25seSBieSBVU0IgT1RHIEZTIHBlcmlwaGVyYWwuDQotICAgICAgICAgICAgLSBUaGlzIGZ1bmN0aW9uIGlzIGFkZGVkIHRvIGVuc3VyZSBjb21wYXRpYmlsaXR5IGFjcm9zcyBwbGF0Zm9ybXMuDQotICAgKi8NCi0gIHJldHVybiBIQUxfT0s7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgVVNCX0RldkluaXQgSW5pdGlhbGl6ZXMgdGhlIFVTQiBjb250cm9sbGVyIHJlZ2lzdGVycw0KLSAqICAgICAgICAgZm9yIGRldmljZSBtb2RlDQotICogQHBhcmFtICBVU0J4IFNlbGVjdGVkIGRldmljZQ0KLSAqIEBwYXJhbSAgY2ZnICBwb2ludGVyIHRvIGEgVVNCX0NmZ1R5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCi0gKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFVTQnggcGVyaXBoZXJhbC4NCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBVU0JfRGV2SW5pdChVU0JfVHlwZURlZiAqVVNCeCwgVVNCX0NmZ1R5cGVEZWYgY2ZnKSB7DQotICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovDQotICBVTlVTRUQoY2ZnKTsNCi0NCi0gIC8qIEluaXQgRGV2aWNlICovDQotICAvKiBDTlRSX0ZSRVMgPSAxICovDQotICBVU0J4LT5DTlRSID0gKHVpbnQxNl90KVVTQl9DTlRSX0ZSRVM7DQotDQotICAvKiBDTlRSX0ZSRVMgPSAwICovDQotICBVU0J4LT5DTlRSID0gMFU7DQotDQotICAvKiBDbGVhciBwZW5kaW5nIGludGVycnVwdHMgKi8NCi0gIFVTQngtPklTVFIgPSAwVTsNCi0NCi0gIC8qU2V0IEJ0YWJsZSBBZGRyZXNzKi8NCi0gIFVTQngtPkJUQUJMRSA9IEJUQUJMRV9BRERSRVNTOw0KLQ0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotI2lmIGRlZmluZWQoSEFMX1BDRF9NT0RVTEVfRU5BQkxFRCkNCi0vKioNCi0gKiBAYnJpZWYgIEFjdGl2YXRlIGFuZCBjb25maWd1cmUgYW4gZW5kcG9pbnQNCi0gKiBAcGFyYW0gIFVTQnggU2VsZWN0ZWQgZGV2aWNlDQotICogQHBhcmFtICBlcCBwb2ludGVyIHRvIGVuZHBvaW50IHN0cnVjdHVyZQ0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIFVTQl9BY3RpdmF0ZUVuZHBvaW50KFVTQl9UeXBlRGVmICpVU0J4LCBVU0JfRVBUeXBlRGVmICplcCkgew0KLSAgSEFMX1N0YXR1c1R5cGVEZWYgcmV0ID0gSEFMX09LOw0KLSAgdWludDE2X3Qgd0VwUmVnVmFsOw0KLQ0KLSAgd0VwUmVnVmFsID0gUENEX0dFVF9FTkRQT0lOVChVU0J4LCBlcC0+bnVtKSAmIFVTQl9FUF9UX01BU0s7DQotDQotICAvKiBpbml0aWFsaXplIEVuZHBvaW50ICovDQotICBzd2l0Y2ggKGVwLT50eXBlKSB7DQotICAgIGNhc2UgRVBfVFlQRV9DVFJMOg0KLSAgICAgIHdFcFJlZ1ZhbCB8PSBVU0JfRVBfQ09OVFJPTDsNCi0gICAgICBicmVhazsNCi0NCi0gICAgY2FzZSBFUF9UWVBFX0JVTEs6DQotICAgICAgd0VwUmVnVmFsIHw9IFVTQl9FUF9CVUxLOw0KLSAgICAgIGJyZWFrOw0KLQ0KLSAgICBjYXNlIEVQX1RZUEVfSU5UUjoNCi0gICAgICB3RXBSZWdWYWwgfD0gVVNCX0VQX0lOVEVSUlVQVDsNCi0gICAgICBicmVhazsNCi0NCi0gICAgY2FzZSBFUF9UWVBFX0lTT0M6DQotICAgICAgd0VwUmVnVmFsIHw9IFVTQl9FUF9JU09DSFJPTk9VUzsNCi0gICAgICBicmVhazsNCi0NCi0gICAgZGVmYXVsdDoNCi0gICAgICByZXQgPSBIQUxfRVJST1I7DQotICAgICAgYnJlYWs7DQotICB9DQotDQotICBQQ0RfU0VUX0VORFBPSU5UKFVTQngsIGVwLT5udW0sICh3RXBSZWdWYWwgfCBVU0JfRVBfQ1RSX1JYIHwgVVNCX0VQX0NUUl9UWCkpOw0KLQ0KLSAgUENEX1NFVF9FUF9BRERSRVNTKFVTQngsIGVwLT5udW0sIGVwLT5udW0pOw0KLQ0KLSAgaWYgKGVwLT5kb3VibGVidWZmZXIgPT0gMFUpIHsNCi0gICAgaWYgKGVwLT5pc19pbiAhPSAwVSkgew0KLSAgICAgIC8qU2V0IHRoZSBlbmRwb2ludCBUcmFuc21pdCBidWZmZXIgYWRkcmVzcyAqLw0KLSAgICAgIFBDRF9TRVRfRVBfVFhfQUREUkVTUyhVU0J4LCBlcC0+bnVtLCBlcC0+cG1hYWRyZXNzKTsNCi0gICAgICBQQ0RfQ0xFQVJfVFhfRFRPRyhVU0J4LCBlcC0+bnVtKTsNCi0NCi0gICAgICBpZiAoZXAtPnR5cGUgIT0gRVBfVFlQRV9JU09DKSB7DQotICAgICAgICAvKiBDb25maWd1cmUgTkFLIHN0YXR1cyBmb3IgdGhlIEVuZHBvaW50ICovDQotICAgICAgICBQQ0RfU0VUX0VQX1RYX1NUQVRVUyhVU0J4LCBlcC0+bnVtLCBVU0JfRVBfVFhfTkFLKTsNCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgLyogQ29uZmlndXJlIFRYIEVuZHBvaW50IHRvIGRpc2FibGVkIHN0YXRlICovDQotICAgICAgICBQQ0RfU0VUX0VQX1RYX1NUQVRVUyhVU0J4LCBlcC0+bnVtLCBVU0JfRVBfVFhfRElTKTsNCi0gICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgLyogU2V0IHRoZSBlbmRwb2ludCBSZWNlaXZlIGJ1ZmZlciBhZGRyZXNzICovDQotICAgICAgUENEX1NFVF9FUF9SWF9BRERSRVNTKFVTQngsIGVwLT5udW0sIGVwLT5wbWFhZHJlc3MpOw0KLQ0KLSAgICAgIC8qIFNldCB0aGUgZW5kcG9pbnQgUmVjZWl2ZSBidWZmZXIgY291bnRlciAqLw0KLSAgICAgIFBDRF9TRVRfRVBfUlhfQ05UKFVTQngsIGVwLT5udW0sIGVwLT5tYXhwYWNrZXQpOw0KLSAgICAgIFBDRF9DTEVBUl9SWF9EVE9HKFVTQngsIGVwLT5udW0pOw0KLQ0KLSAgICAgIC8qIENvbmZpZ3VyZSBWQUxJRCBzdGF0dXMgZm9yIHRoZSBFbmRwb2ludCAqLw0KLSAgICAgIFBDRF9TRVRfRVBfUlhfU1RBVFVTKFVTQngsIGVwLT5udW0sIFVTQl9FUF9SWF9WQUxJRCk7DQotICAgIH0NCi0gIH0NCi0jaWYgKFVTRV9VU0JfRE9VQkxFX0JVRkZFUiA9PSAxVSkNCi0gIC8qIERvdWJsZSBCdWZmZXIgKi8NCi0gIGVsc2Ugew0KLSAgICBpZiAoZXAtPnR5cGUgPT0gRVBfVFlQRV9CVUxLKSB7DQotICAgICAgLyogU2V0IGJ1bGsgZW5kcG9pbnQgYXMgZG91YmxlIGJ1ZmZlcmVkICovDQotICAgICAgUENEX1NFVF9CVUxLX0VQX0RCVUYoVVNCeCwgZXAtPm51bSk7DQotICAgIH0gZWxzZSB7DQotICAgICAgLyogU2V0IHRoZSBJU09DIGVuZHBvaW50IGluIGRvdWJsZSBidWZmZXIgbW9kZSAqLw0KLSAgICAgIFBDRF9DTEVBUl9FUF9LSU5EKFVTQngsIGVwLT5udW0pOw0KLSAgICB9DQotDQotICAgIC8qIFNldCBidWZmZXIgYWRkcmVzcyBmb3IgZG91YmxlIGJ1ZmZlcmVkIG1vZGUgKi8NCi0gICAgUENEX1NFVF9FUF9EQlVGX0FERFIoVVNCeCwgZXAtPm51bSwgZXAtPnBtYWFkZHIwLCBlcC0+cG1hYWRkcjEpOw0KLQ0KLSAgICBpZiAoZXAtPmlzX2luID09IDBVKSB7DQotICAgICAgLyogQ2xlYXIgdGhlIGRhdGEgdG9nZ2xlIGJpdHMgZm9yIHRoZSBlbmRwb2ludCBJTi9PVVQgKi8NCi0gICAgICBQQ0RfQ0xFQVJfUlhfRFRPRyhVU0J4LCBlcC0+bnVtKTsNCi0gICAgICBQQ0RfQ0xFQVJfVFhfRFRPRyhVU0J4LCBlcC0+bnVtKTsNCi0NCi0gICAgICBQQ0RfU0VUX0VQX1JYX1NUQVRVUyhVU0J4LCBlcC0+bnVtLCBVU0JfRVBfUlhfVkFMSUQpOw0KLSAgICAgIFBDRF9TRVRfRVBfVFhfU1RBVFVTKFVTQngsIGVwLT5udW0sIFVTQl9FUF9UWF9ESVMpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgIC8qIENsZWFyIHRoZSBkYXRhIHRvZ2dsZSBiaXRzIGZvciB0aGUgZW5kcG9pbnQgSU4vT1VUICovDQotICAgICAgUENEX0NMRUFSX1JYX0RUT0coVVNCeCwgZXAtPm51bSk7DQotICAgICAgUENEX0NMRUFSX1RYX0RUT0coVVNCeCwgZXAtPm51bSk7DQotDQotICAgICAgaWYgKGVwLT50eXBlICE9IEVQX1RZUEVfSVNPQykgew0KLSAgICAgICAgLyogQ29uZmlndXJlIE5BSyBzdGF0dXMgZm9yIHRoZSBFbmRwb2ludCAqLw0KLSAgICAgICAgUENEX1NFVF9FUF9UWF9TVEFUVVMoVVNCeCwgZXAtPm51bSwgVVNCX0VQX1RYX05BSyk7DQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgIC8qIENvbmZpZ3VyZSBUWCBFbmRwb2ludCB0byBkaXNhYmxlZCBzdGF0ZSAqLw0KLSAgICAgICAgUENEX1NFVF9FUF9UWF9TVEFUVVMoVVNCeCwgZXAtPm51bSwgVVNCX0VQX1RYX0RJUyk7DQotICAgICAgfQ0KLQ0KLSAgICAgIFBDRF9TRVRfRVBfUlhfU1RBVFVTKFVTQngsIGVwLT5udW0sIFVTQl9FUF9SWF9ESVMpOw0KLSAgICB9DQotICB9DQotI2VuZGlmIC8qIChVU0VfVVNCX0RPVUJMRV9CVUZGRVIgPT0gMVUpICovDQotDQotICByZXR1cm4gcmV0Ow0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIERlLWFjdGl2YXRlIGFuZCBkZS1pbml0aWFsaXplIGFuIGVuZHBvaW50DQotICogQHBhcmFtICBVU0J4IFNlbGVjdGVkIGRldmljZQ0KLSAqIEBwYXJhbSAgZXAgcG9pbnRlciB0byBlbmRwb2ludCBzdHJ1Y3R1cmUNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBVU0JfRGVhY3RpdmF0ZUVuZHBvaW50KFVTQl9UeXBlRGVmICpVU0J4LCBVU0JfRVBUeXBlRGVmICplcCkgew0KLSAgaWYgKGVwLT5kb3VibGVidWZmZXIgPT0gMFUpIHsNCi0gICAgaWYgKGVwLT5pc19pbiAhPSAwVSkgew0KLSAgICAgIFBDRF9DTEVBUl9UWF9EVE9HKFVTQngsIGVwLT5udW0pOw0KLQ0KLSAgICAgIC8qIENvbmZpZ3VyZSBESVNBQkxFIHN0YXR1cyBmb3IgdGhlIEVuZHBvaW50ICovDQotICAgICAgUENEX1NFVF9FUF9UWF9TVEFUVVMoVVNCeCwgZXAtPm51bSwgVVNCX0VQX1RYX0RJUyk7DQotICAgIH0NCi0NCi0gICAgZWxzZSB7DQotICAgICAgUENEX0NMRUFSX1JYX0RUT0coVVNCeCwgZXAtPm51bSk7DQotDQotICAgICAgLyogQ29uZmlndXJlIERJU0FCTEUgc3RhdHVzIGZvciB0aGUgRW5kcG9pbnQgKi8NCi0gICAgICBQQ0RfU0VUX0VQX1JYX1NUQVRVUyhVU0J4LCBlcC0+bnVtLCBVU0JfRVBfUlhfRElTKTsNCi0gICAgfQ0KLSAgfQ0KLSNpZiAoVVNFX1VTQl9ET1VCTEVfQlVGRkVSID09IDFVKQ0KLSAgLyogRG91YmxlIEJ1ZmZlciAqLw0KLSAgZWxzZSB7DQotICAgIGlmIChlcC0+aXNfaW4gPT0gMFUpIHsNCi0gICAgICAvKiBDbGVhciB0aGUgZGF0YSB0b2dnbGUgYml0cyBmb3IgdGhlIGVuZHBvaW50IElOL09VVCovDQotICAgICAgUENEX0NMRUFSX1JYX0RUT0coVVNCeCwgZXAtPm51bSk7DQotICAgICAgUENEX0NMRUFSX1RYX0RUT0coVVNCeCwgZXAtPm51bSk7DQotDQotICAgICAgLyogUmVzZXQgdmFsdWUgb2YgdGhlIGRhdGEgdG9nZ2xlIGJpdHMgZm9yIHRoZSBlbmRwb2ludCBvdXQqLw0KLSAgICAgIFBDRF9UWF9EVE9HKFVTQngsIGVwLT5udW0pOw0KLQ0KLSAgICAgIFBDRF9TRVRfRVBfUlhfU1RBVFVTKFVTQngsIGVwLT5udW0sIFVTQl9FUF9SWF9ESVMpOw0KLSAgICAgIFBDRF9TRVRfRVBfVFhfU1RBVFVTKFVTQngsIGVwLT5udW0sIFVTQl9FUF9UWF9ESVMpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgIC8qIENsZWFyIHRoZSBkYXRhIHRvZ2dsZSBiaXRzIGZvciB0aGUgZW5kcG9pbnQgSU4vT1VUKi8NCi0gICAgICBQQ0RfQ0xFQVJfUlhfRFRPRyhVU0J4LCBlcC0+bnVtKTsNCi0gICAgICBQQ0RfQ0xFQVJfVFhfRFRPRyhVU0J4LCBlcC0+bnVtKTsNCi0gICAgICBQQ0RfUlhfRFRPRyhVU0J4LCBlcC0+bnVtKTsNCi0NCi0gICAgICAvKiBDb25maWd1cmUgRElTQUJMRSBzdGF0dXMgZm9yIHRoZSBFbmRwb2ludCovDQotICAgICAgUENEX1NFVF9FUF9UWF9TVEFUVVMoVVNCeCwgZXAtPm51bSwgVVNCX0VQX1RYX0RJUyk7DQotICAgICAgUENEX1NFVF9FUF9SWF9TVEFUVVMoVVNCeCwgZXAtPm51bSwgVVNCX0VQX1JYX0RJUyk7DQotICAgIH0NCi0gIH0NCi0jZW5kaWYgLyogKFVTRV9VU0JfRE9VQkxFX0JVRkZFUiA9PSAxVSkgKi8NCi0NCi0gIHJldHVybiBIQUxfT0s7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgVVNCX0VQU3RhcnRYZmVyIHNldHVwIGFuZCBzdGFydHMgYSB0cmFuc2ZlciBvdmVyIGFuIEVQDQotICogQHBhcmFtICBVU0J4IFNlbGVjdGVkIGRldmljZQ0KLSAqIEBwYXJhbSAgZXAgcG9pbnRlciB0byBlbmRwb2ludCBzdHJ1Y3R1cmUNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBVU0JfRVBTdGFydFhmZXIoVVNCX1R5cGVEZWYgKlVTQngsIFVTQl9FUFR5cGVEZWYgKmVwKSB7DQotICB1aW50MzJfdCBsZW47DQotI2lmIChVU0VfVVNCX0RPVUJMRV9CVUZGRVIgPT0gMVUpDQotICB1aW50MTZfdCBwbWFidWZmZXI7DQotICB1aW50MTZfdCB3RVBWYWw7DQotI2VuZGlmIC8qIChVU0VfVVNCX0RPVUJMRV9CVUZGRVIgPT0gMVUpICovDQotDQotICAvKiBJTiBlbmRwb2ludCAqLw0KLSAgaWYgKGVwLT5pc19pbiA9PSAxVSkgew0KLSAgICAvKk11bHRpIHBhY2tldCB0cmFuc2ZlciovDQotICAgIGlmIChlcC0+eGZlcl9sZW4gPiBlcC0+bWF4cGFja2V0KSB7DQotICAgICAgbGVuID0gZXAtPm1heHBhY2tldDsNCi0gICAgfSBlbHNlIHsNCi0gICAgICBsZW4gPSBlcC0+eGZlcl9sZW47DQotICAgIH0NCi0NCi0gICAgLyogY29uZmlndXJlIGFuZCB2YWxpZGF0ZSBUeCBlbmRwb2ludCAqLw0KLSAgICBpZiAoZXAtPmRvdWJsZWJ1ZmZlciA9PSAwVSkgew0KLSAgICAgIFVTQl9Xcml0ZVBNQShVU0J4LCBlcC0+eGZlcl9idWZmLCBlcC0+cG1hYWRyZXNzLCAodWludDE2X3QpbGVuKTsNCi0gICAgICBQQ0RfU0VUX0VQX1RYX0NOVChVU0J4LCBlcC0+bnVtLCBsZW4pOw0KLSAgICB9DQotI2lmIChVU0VfVVNCX0RPVUJMRV9CVUZGRVIgPT0gMVUpDQotICAgIGVsc2Ugew0KLSAgICAgIC8qIGRvdWJsZSBidWZmZXIgYnVsayBtYW5hZ2VtZW50ICovDQotICAgICAgaWYgKGVwLT50eXBlID09IEVQX1RZUEVfQlVMSykgew0KLSAgICAgICAgaWYgKGVwLT54ZmVyX2xlbl9kYiA+IGVwLT5tYXhwYWNrZXQpIHsNCi0gICAgICAgICAgLyogZW5hYmxlIGRvdWJsZSBidWZmZXIgKi8NCi0gICAgICAgICAgUENEX1NFVF9CVUxLX0VQX0RCVUYoVVNCeCwgZXAtPm51bSk7DQotDQotICAgICAgICAgIC8qIGVhY2ggVGltZSB0byB3cml0ZSBpbiBQTUEgeGZlcl9sZW5fZGIgd2lsbCAqLw0KLSAgICAgICAgICBlcC0+eGZlcl9sZW5fZGIgLT0gbGVuOw0KLQ0KLSAgICAgICAgICAvKiBGaWxsIHRoZSB0d28gZmlyc3QgYnVmZmVyIGluIHRoZSBCdWZmZXIwICYgQnVmZmVyMSAqLw0KLSAgICAgICAgICBpZiAoKFBDRF9HRVRfRU5EUE9JTlQoVVNCeCwgZXAtPm51bSkgJiBVU0JfRVBfRFRPR19UWCkgIT0gMFUpIHsNCi0gICAgICAgICAgICAvKiBTZXQgdGhlIERvdWJsZSBidWZmZXIgY291bnRlciBmb3IgcG1hYnVmZmVyMSAqLw0KLSAgICAgICAgICAgIFBDRF9TRVRfRVBfREJVRjFfQ05UKFVTQngsIGVwLT5udW0sIGVwLT5pc19pbiwgbGVuKTsNCi0gICAgICAgICAgICBwbWFidWZmZXIgPSBlcC0+cG1hYWRkcjE7DQotDQotICAgICAgICAgICAgLyogV3JpdGUgdGhlIHVzZXIgYnVmZmVyIHRvIFVTQiBQTUEgKi8NCi0gICAgICAgICAgICBVU0JfV3JpdGVQTUEoVVNCeCwgZXAtPnhmZXJfYnVmZiwgcG1hYnVmZmVyLCAodWludDE2X3QpbGVuKTsNCi0gICAgICAgICAgICBlcC0+eGZlcl9idWZmICs9IGxlbjsNCi0NCi0gICAgICAgICAgICBpZiAoZXAtPnhmZXJfbGVuX2RiID4gZXAtPm1heHBhY2tldCkgew0KLSAgICAgICAgICAgICAgZXAtPnhmZXJfbGVuX2RiIC09IGxlbjsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgbGVuID0gZXAtPnhmZXJfbGVuX2RiOw0KLSAgICAgICAgICAgICAgZXAtPnhmZXJfbGVuX2RiID0gMFU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIC8qIFNldCB0aGUgRG91YmxlIGJ1ZmZlciBjb3VudGVyIGZvciBwbWFidWZmZXIwICovDQotICAgICAgICAgICAgUENEX1NFVF9FUF9EQlVGMF9DTlQoVVNCeCwgZXAtPm51bSwgZXAtPmlzX2luLCBsZW4pOw0KLSAgICAgICAgICAgIHBtYWJ1ZmZlciA9IGVwLT5wbWFhZGRyMDsNCi0NCi0gICAgICAgICAgICAvKiBXcml0ZSB0aGUgdXNlciBidWZmZXIgdG8gVVNCIFBNQSAqLw0KLSAgICAgICAgICAgIFVTQl9Xcml0ZVBNQShVU0J4LCBlcC0+eGZlcl9idWZmLCBwbWFidWZmZXIsICh1aW50MTZfdClsZW4pOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIC8qIFNldCB0aGUgRG91YmxlIGJ1ZmZlciBjb3VudGVyIGZvciBwbWFidWZmZXIwICovDQotICAgICAgICAgICAgUENEX1NFVF9FUF9EQlVGMF9DTlQoVVNCeCwgZXAtPm51bSwgZXAtPmlzX2luLCBsZW4pOw0KLSAgICAgICAgICAgIHBtYWJ1ZmZlciA9IGVwLT5wbWFhZGRyMDsNCi0NCi0gICAgICAgICAgICAvKiBXcml0ZSB0aGUgdXNlciBidWZmZXIgdG8gVVNCIFBNQSAqLw0KLSAgICAgICAgICAgIFVTQl9Xcml0ZVBNQShVU0J4LCBlcC0+eGZlcl9idWZmLCBwbWFidWZmZXIsICh1aW50MTZfdClsZW4pOw0KLSAgICAgICAgICAgIGVwLT54ZmVyX2J1ZmYgKz0gbGVuOw0KLQ0KLSAgICAgICAgICAgIGlmIChlcC0+eGZlcl9sZW5fZGIgPiBlcC0+bWF4cGFja2V0KSB7DQotICAgICAgICAgICAgICBlcC0+eGZlcl9sZW5fZGIgLT0gbGVuOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICBsZW4gPSBlcC0+eGZlcl9sZW5fZGI7DQotICAgICAgICAgICAgICBlcC0+eGZlcl9sZW5fZGIgPSAwVTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgLyogU2V0IHRoZSBEb3VibGUgYnVmZmVyIGNvdW50ZXIgZm9yIHBtYWJ1ZmZlcjEgKi8NCi0gICAgICAgICAgICBQQ0RfU0VUX0VQX0RCVUYxX0NOVChVU0J4LCBlcC0+bnVtLCBlcC0+aXNfaW4sIGxlbik7DQotICAgICAgICAgICAgcG1hYnVmZmVyID0gZXAtPnBtYWFkZHIxOw0KLQ0KLSAgICAgICAgICAgIC8qIFdyaXRlIHRoZSB1c2VyIGJ1ZmZlciB0byBVU0IgUE1BICovDQotICAgICAgICAgICAgVVNCX1dyaXRlUE1BKFVTQngsIGVwLT54ZmVyX2J1ZmYsIHBtYWJ1ZmZlciwgKHVpbnQxNl90KWxlbik7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIC8qIGF1dG8gU3dpdGNoIHRvIHNpbmdsZSBidWZmZXIgbW9kZSB3aGVuIHRyYW5zZmVyIDxNcHMgbm8gbmVlZCB0bw0KLSAgICAgICAgICAgbWFuYWdlIGluIGRvdWJsZSBidWZmZXIgKi8NCi0gICAgICAgIGVsc2Ugew0KLSAgICAgICAgICBsZW4gPSBlcC0+eGZlcl9sZW5fZGI7DQotDQotICAgICAgICAgIC8qIGRpc2FibGUgZG91YmxlIGJ1ZmZlciBtb2RlIGZvciBCdWxrIGVuZHBvaW50ICovDQotICAgICAgICAgIFBDRF9DTEVBUl9CVUxLX0VQX0RCVUYoVVNCeCwgZXAtPm51bSk7DQotDQotICAgICAgICAgIC8qIFNldCBUeCBjb3VudCB3aXRoIG5icmUgb2YgYnl0ZSB0byBiZSB0cmFuc21pdHRlZCAqLw0KLSAgICAgICAgICBQQ0RfU0VUX0VQX1RYX0NOVChVU0J4LCBlcC0+bnVtLCBsZW4pOw0KLSAgICAgICAgICBwbWFidWZmZXIgPSBlcC0+cG1hYWRkcjA7DQotDQotICAgICAgICAgIC8qIFdyaXRlIHRoZSB1c2VyIGJ1ZmZlciB0byBVU0IgUE1BICovDQotICAgICAgICAgIFVTQl9Xcml0ZVBNQShVU0J4LCBlcC0+eGZlcl9idWZmLCBwbWFidWZmZXIsICh1aW50MTZfdClsZW4pOw0KLSAgICAgICAgfQ0KLSAgICAgIH0gZWxzZSAvKiBtYW5hZ2UgaXNvY2hyb25vdXMgZG91YmxlIGJ1ZmZlciBJTiBtb2RlICovDQotICAgICAgew0KLSAgICAgICAgLyogZWFjaCBUaW1lIHRvIHdyaXRlIGluIFBNQSB4ZmVyX2xlbl9kYiB3aWxsICovDQotICAgICAgICBlcC0+eGZlcl9sZW5fZGIgLT0gbGVuOw0KLQ0KLSAgICAgICAgLyogRmlsbCB0aGUgZGF0YSBidWZmZXIgKi8NCi0gICAgICAgIGlmICgoUENEX0dFVF9FTkRQT0lOVChVU0J4LCBlcC0+bnVtKSAmIFVTQl9FUF9EVE9HX1RYKSAhPSAwVSkgew0KLSAgICAgICAgICAvKiBTZXQgdGhlIERvdWJsZSBidWZmZXIgY291bnRlciBmb3IgcG1hYnVmZmVyMSAqLw0KLSAgICAgICAgICBQQ0RfU0VUX0VQX0RCVUYxX0NOVChVU0J4LCBlcC0+bnVtLCBlcC0+aXNfaW4sIGxlbik7DQotICAgICAgICAgIHBtYWJ1ZmZlciA9IGVwLT5wbWFhZGRyMTsNCi0NCi0gICAgICAgICAgLyogV3JpdGUgdGhlIHVzZXIgYnVmZmVyIHRvIFVTQiBQTUEgKi8NCi0gICAgICAgICAgVVNCX1dyaXRlUE1BKFVTQngsIGVwLT54ZmVyX2J1ZmYsIHBtYWJ1ZmZlciwgKHVpbnQxNl90KWxlbik7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAvKiBTZXQgdGhlIERvdWJsZSBidWZmZXIgY291bnRlciBmb3IgcG1hYnVmZmVyMCAqLw0KLSAgICAgICAgICBQQ0RfU0VUX0VQX0RCVUYwX0NOVChVU0J4LCBlcC0+bnVtLCBlcC0+aXNfaW4sIGxlbik7DQotICAgICAgICAgIHBtYWJ1ZmZlciA9IGVwLT5wbWFhZGRyMDsNCi0NCi0gICAgICAgICAgLyogV3JpdGUgdGhlIHVzZXIgYnVmZmVyIHRvIFVTQiBQTUEgKi8NCi0gICAgICAgICAgVVNCX1dyaXRlUE1BKFVTQngsIGVwLT54ZmVyX2J1ZmYsIHBtYWJ1ZmZlciwgKHVpbnQxNl90KWxlbik7DQotICAgICAgICB9DQotICAgICAgfQ0KLSAgICB9DQotI2VuZGlmIC8qIChVU0VfVVNCX0RPVUJMRV9CVUZGRVIgPT0gMVUpICovDQotDQotICAgIFBDRF9TRVRfRVBfVFhfU1RBVFVTKFVTQngsIGVwLT5udW0sIFVTQl9FUF9UWF9WQUxJRCk7DQotICB9IGVsc2UgLyogT1VUIGVuZHBvaW50ICovDQotICB7DQotICAgIGlmIChlcC0+ZG91YmxlYnVmZmVyID09IDBVKSB7DQotICAgICAgLyogTXVsdGkgcGFja2V0IHRyYW5zZmVyICovDQotICAgICAgaWYgKGVwLT54ZmVyX2xlbiA+IGVwLT5tYXhwYWNrZXQpIHsNCi0gICAgICAgIGxlbiA9IGVwLT5tYXhwYWNrZXQ7DQotICAgICAgICBlcC0+eGZlcl9sZW4gLT0gbGVuOw0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICBsZW4gPSBlcC0+eGZlcl9sZW47DQotICAgICAgICBlcC0+eGZlcl9sZW4gPSAwVTsNCi0gICAgICB9DQotICAgICAgLyogY29uZmlndXJlIGFuZCB2YWxpZGF0ZSBSeCBlbmRwb2ludCAqLw0KLSAgICAgIFBDRF9TRVRfRVBfUlhfQ05UKFVTQngsIGVwLT5udW0sIGxlbik7DQotICAgIH0NCi0jaWYgKFVTRV9VU0JfRE9VQkxFX0JVRkZFUiA9PSAxVSkNCi0gICAgZWxzZSB7DQotICAgICAgLyogRmlyc3QgVHJhbnNmZXIgQ29taW5nIEZyb20gSEFMX1BDRF9FUF9SZWNlaXZlICYgRnJvbSBJU1IgKi8NCi0gICAgICAvKiBTZXQgdGhlIERvdWJsZSBidWZmZXIgY291bnRlciAqLw0KLSAgICAgIGlmIChlcC0+dHlwZSA9PSBFUF9UWVBFX0JVTEspIHsNCi0gICAgICAgIFBDRF9TRVRfRVBfREJVRl9DTlQoVVNCeCwgZXAtPm51bSwgZXAtPmlzX2luLCBlcC0+bWF4cGFja2V0KTsNCi0NCi0gICAgICAgIC8qIENvbWluZyBmcm9tIElTUiAqLw0KLSAgICAgICAgaWYgKGVwLT54ZmVyX2NvdW50ICE9IDBVKSB7DQotICAgICAgICAgIC8qIHVwZGF0ZSBsYXN0IHZhbHVlIHRvIGNoZWNrIGlmIHRoZXJlIGlzIGJsb2NraW5nIHN0YXRlICovDQotICAgICAgICAgIHdFUFZhbCA9IFBDRF9HRVRfRU5EUE9JTlQoVVNCeCwgZXAtPm51bSk7DQotDQotICAgICAgICAgIC8qQmxvY2tpbmcgU3RhdGUgKi8NCi0gICAgICAgICAgaWYgKCgoKHdFUFZhbCAmIFVTQl9FUF9EVE9HX1JYKSAhPSAwVSkgJiYNCi0gICAgICAgICAgICAgICAoKHdFUFZhbCAmIFVTQl9FUF9EVE9HX1RYKSAhPSAwVSkpIHx8DQotICAgICAgICAgICAgICAoKCh3RVBWYWwgJiBVU0JfRVBfRFRPR19SWCkgPT0gMFUpICYmDQotICAgICAgICAgICAgICAgKCh3RVBWYWwgJiBVU0JfRVBfRFRPR19UWCkgPT0gMFUpKSkgew0KLSAgICAgICAgICAgIFBDRF9GUkVFX1VTRVJfQlVGRkVSKFVTQngsIGVwLT5udW0sIDBVKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0gICAgICAvKiBpc28gb3V0IGRvdWJsZSAqLw0KLSAgICAgIGVsc2UgaWYgKGVwLT50eXBlID09IEVQX1RZUEVfSVNPQykgew0KLSAgICAgICAgLyogTXVsdGkgcGFja2V0IHRyYW5zZmVyICovDQotICAgICAgICBpZiAoZXAtPnhmZXJfbGVuID4gZXAtPm1heHBhY2tldCkgew0KLSAgICAgICAgICBsZW4gPSBlcC0+bWF4cGFja2V0Ow0KLSAgICAgICAgICBlcC0+eGZlcl9sZW4gLT0gbGVuOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgbGVuID0gZXAtPnhmZXJfbGVuOw0KLSAgICAgICAgICBlcC0+eGZlcl9sZW4gPSAwVTsNCi0gICAgICAgIH0NCi0gICAgICAgIFBDRF9TRVRfRVBfREJVRl9DTlQoVVNCeCwgZXAtPm51bSwgZXAtPmlzX2luLCBsZW4pOw0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICByZXR1cm4gSEFMX0VSUk9SOw0KLSAgICAgIH0NCi0gICAgfQ0KLSNlbmRpZiAvKiAoVVNFX1VTQl9ET1VCTEVfQlVGRkVSID09IDFVKSAqLw0KLQ0KLSAgICBQQ0RfU0VUX0VQX1JYX1NUQVRVUyhVU0J4LCBlcC0+bnVtLCBVU0JfRVBfUlhfVkFMSUQpOw0KLSAgfQ0KLQ0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBVU0JfRVBTZXRTdGFsbCBzZXQgYSBzdGFsbCBjb25kaXRpb24gb3ZlciBhbiBFUA0KLSAqIEBwYXJhbSAgVVNCeCBTZWxlY3RlZCBkZXZpY2UNCi0gKiBAcGFyYW0gIGVwIHBvaW50ZXIgdG8gZW5kcG9pbnQgc3RydWN0dXJlDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgVVNCX0VQU2V0U3RhbGwoVVNCX1R5cGVEZWYgKlVTQngsIFVTQl9FUFR5cGVEZWYgKmVwKSB7DQotICBpZiAoZXAtPmlzX2luICE9IDBVKSB7DQotICAgIFBDRF9TRVRfRVBfVFhfU1RBVFVTKFVTQngsIGVwLT5udW0sIFVTQl9FUF9UWF9TVEFMTCk7DQotICB9IGVsc2Ugew0KLSAgICBQQ0RfU0VUX0VQX1JYX1NUQVRVUyhVU0J4LCBlcC0+bnVtLCBVU0JfRVBfUlhfU1RBTEwpOw0KLSAgfQ0KLQ0KLSAgcmV0dXJuIEhBTF9PSzsNCi19DQotDQotLyoqDQotICogQGJyaWVmICBVU0JfRVBDbGVhclN0YWxsIENsZWFyIGEgc3RhbGwgY29uZGl0aW9uIG92ZXIgYW4gRVANCi0gKiBAcGFyYW0gIFVTQnggU2VsZWN0ZWQgZGV2aWNlDQotICogQHBhcmFtICBlcCBwb2ludGVyIHRvIGVuZHBvaW50IHN0cnVjdHVyZQ0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIFVTQl9FUENsZWFyU3RhbGwoVVNCX1R5cGVEZWYgKlVTQngsIFVTQl9FUFR5cGVEZWYgKmVwKSB7DQotICBpZiAoZXAtPmRvdWJsZWJ1ZmZlciA9PSAwVSkgew0KLSAgICBpZiAoZXAtPmlzX2luICE9IDBVKSB7DQotICAgICAgUENEX0NMRUFSX1RYX0RUT0coVVNCeCwgZXAtPm51bSk7DQotDQotICAgICAgaWYgKGVwLT50eXBlICE9IEVQX1RZUEVfSVNPQykgew0KLSAgICAgICAgLyogQ29uZmlndXJlIE5BSyBzdGF0dXMgZm9yIHRoZSBFbmRwb2ludCAqLw0KLSAgICAgICAgUENEX1NFVF9FUF9UWF9TVEFUVVMoVVNCeCwgZXAtPm51bSwgVVNCX0VQX1RYX05BSyk7DQotICAgICAgfQ0KLSAgICB9IGVsc2Ugew0KLSAgICAgIFBDRF9DTEVBUl9SWF9EVE9HKFVTQngsIGVwLT5udW0pOw0KLQ0KLSAgICAgIC8qIENvbmZpZ3VyZSBWQUxJRCBzdGF0dXMgZm9yIHRoZSBFbmRwb2ludCAqLw0KLSAgICAgIFBDRF9TRVRfRVBfUlhfU1RBVFVTKFVTQngsIGVwLT5udW0sIFVTQl9FUF9SWF9WQUxJRCk7DQotICAgIH0NCi0gIH0NCi0NCi0gIHJldHVybiBIQUxfT0s7DQotfQ0KLSNlbmRpZiAvKiBkZWZpbmVkIChIQUxfUENEX01PRFVMRV9FTkFCTEVEKSAqLw0KLQ0KLS8qKg0KLSAqIEBicmllZiAgVVNCX1N0b3BEZXZpY2UgU3RvcCB0aGUgdXNiIGRldmljZSBtb2RlDQotICogQHBhcmFtICBVU0J4IFNlbGVjdGVkIGRldmljZQ0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIFVTQl9TdG9wRGV2aWNlKFVTQl9UeXBlRGVmICpVU0J4KSB7DQotICAvKiBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzIGFuZCBmb3JjZSBVU0IgcmVzZXQgKi8NCi0gIFVTQngtPkNOVFIgPSAodWludDE2X3QpVVNCX0NOVFJfRlJFUzsNCi0NCi0gIC8qIGNsZWFyIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIgKi8NCi0gIFVTQngtPklTVFIgPSAwVTsNCi0NCi0gIC8qIHN3aXRjaC1vZmYgZGV2aWNlICovDQotICBVU0J4LT5DTlRSID0gKHVpbnQxNl90KShVU0JfQ05UUl9GUkVTIHwgVVNCX0NOVFJfUERXTik7DQotDQotICByZXR1cm4gSEFMX09LOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFVTQl9TZXREZXZBZGRyZXNzIFN0b3AgdGhlIHVzYiBkZXZpY2UgbW9kZQ0KLSAqIEBwYXJhbSAgVVNCeCBTZWxlY3RlZCBkZXZpY2UNCi0gKiBAcGFyYW0gIGFkZHJlc3MgbmV3IGRldmljZSBhZGRyZXNzIHRvIGJlIGFzc2lnbmVkDQotICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgZnJvbSAwIHRvIDI1NQ0KLSAqIEByZXR2YWwgSEFMIHN0YXR1cw0KLSAqLw0KLUhBTF9TdGF0dXNUeXBlRGVmIFVTQl9TZXREZXZBZGRyZXNzKFVTQl9UeXBlRGVmICpVU0J4LCB1aW50OF90IGFkZHJlc3MpIHsNCi0gIGlmIChhZGRyZXNzID09IDBVKSB7DQotICAgIC8qIHNldCBkZXZpY2UgYWRkcmVzcyBhbmQgZW5hYmxlIGZ1bmN0aW9uICovDQotICAgIFVTQngtPkRBRERSID0gKHVpbnQxNl90KVVTQl9EQUREUl9FRjsNCi0gIH0NCi0NCi0gIHJldHVybiBIQUxfT0s7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgVVNCX0RldkNvbm5lY3QgQ29ubmVjdCB0aGUgVVNCIGRldmljZSBieSBlbmFibGluZyB0aGUNCi0gKiBwdWxsLXVwL3B1bGwtZG93bg0KLSAqIEBwYXJhbSAgVVNCeCBTZWxlY3RlZCBkZXZpY2UNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi1IQUxfU3RhdHVzVHlwZURlZiBVU0JfRGV2Q29ubmVjdChVU0JfVHlwZURlZiAqVVNCeCkgew0KLSAgLyogRW5hYmxpbmcgRFAgUHVsbC1VUCBiaXQgdG8gQ29ubmVjdCBpbnRlcm5hbCBQVSByZXNpc3RvciBvbiBVU0IgRFAgbGluZSAqLw0KLSAgVVNCeC0+QkNEUiB8PSAodWludDE2X3QpVVNCX0JDRFJfRFBQVTsNCi0NCi0gIHJldHVybiBIQUxfT0s7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiAgVVNCX0RldkRpc2Nvbm5lY3QgRGlzY29ubmVjdCB0aGUgVVNCIGRldmljZSBieSBkaXNhYmxpbmcgdGhlDQotICogcHVsbC11cC9wdWxsLWRvd24NCi0gKiBAcGFyYW0gIFVTQnggU2VsZWN0ZWQgZGV2aWNlDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgVVNCX0RldkRpc2Nvbm5lY3QoVVNCX1R5cGVEZWYgKlVTQngpIHsNCi0gIC8qIERpc2FibGUgRFAgUHVsbC1VcCBiaXQgdG8gZGlzY29ubmVjdCB0aGUgSW50ZXJuYWwgUFUgcmVzaXN0b3Igb24gVVNCIERQDQotICAgKiBsaW5lICovDQotICBVU0J4LT5CQ0RSICY9ICh1aW50MTZfdCkofihVU0JfQkNEUl9EUFBVKSk7DQotDQotICByZXR1cm4gSEFMX09LOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFVTQl9SZWFkSW50ZXJydXB0cyByZXR1cm4gdGhlIGdsb2JhbCBVU0IgaW50ZXJydXB0IHN0YXR1cw0KLSAqIEBwYXJhbSAgVVNCeCBTZWxlY3RlZCBkZXZpY2UNCi0gKiBAcmV0dmFsIEhBTCBzdGF0dXMNCi0gKi8NCi11aW50MzJfdCBVU0JfUmVhZEludGVycnVwdHMoVVNCX1R5cGVEZWYgKlVTQngpIHsNCi0gIHVpbnQzMl90IHRtcHJlZzsNCi0NCi0gIHRtcHJlZyA9IFVTQngtPklTVFI7DQotICByZXR1cm4gdG1wcmVnOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFVTQl9BY3RpdmF0ZVJlbW90ZVdha2V1cCA6IGFjdGl2ZSByZW1vdGUgd2FrZXVwIHNpZ25hbGxpbmcNCi0gKiBAcGFyYW0gIFVTQnggU2VsZWN0ZWQgZGV2aWNlDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgVVNCX0FjdGl2YXRlUmVtb3RlV2FrZXVwKFVTQl9UeXBlRGVmICpVU0J4KSB7DQotICBVU0J4LT5DTlRSIHw9ICh1aW50MTZfdClVU0JfQ05UUl9SRVNVTUU7DQotDQotICByZXR1cm4gSEFMX09LOw0KLX0NCi0NCi0vKioNCi0gKiBAYnJpZWYgIFVTQl9EZUFjdGl2YXRlUmVtb3RlV2FrZXVwIGRlLWFjdGl2ZSByZW1vdGUgd2FrZXVwIHNpZ25hbGxpbmcNCi0gKiBAcGFyYW0gIFVTQnggU2VsZWN0ZWQgZGV2aWNlDQotICogQHJldHZhbCBIQUwgc3RhdHVzDQotICovDQotSEFMX1N0YXR1c1R5cGVEZWYgVVNCX0RlQWN0aXZhdGVSZW1vdGVXYWtldXAoVVNCX1R5cGVEZWYgKlVTQngpIHsNCi0gIFVTQngtPkNOVFIgJj0gKHVpbnQxNl90KSh+VVNCX0NOVFJfUkVTVU1FKTsNCi0NCi0gIHJldHVybiBIQUxfT0s7DQotfQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBDb3B5IGEgYnVmZmVyIGZyb20gdXNlciBtZW1vcnkgYXJlYSB0byBwYWNrZXQgbWVtb3J5IGFyZWEgKFBNQSkNCi0gKiBAcGFyYW0gICBVU0J4IFVTQiBwZXJpcGhlcmFsIGluc3RhbmNlIHJlZ2lzdGVyIGFkZHJlc3MuDQotICogQHBhcmFtICAgcGJVc3JCdWYgcG9pbnRlciB0byB1c2VyIG1lbW9yeSBhcmVhLg0KLSAqIEBwYXJhbSAgIHdQTUFCdWZBZGRyIGFkZHJlc3MgaW50byBQTUEuDQotICogQHBhcmFtICAgd05CeXRlcyBuby4gb2YgYnl0ZXMgdG8gYmUgY29waWVkLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXZvaWQgVVNCX1dyaXRlUE1BKFVTQl9UeXBlRGVmICpVU0J4LCB1aW50OF90ICpwYlVzckJ1ZiwgdWludDE2X3Qgd1BNQUJ1ZkFkZHIsDQotICAgICAgICAgICAgICAgICAgdWludDE2X3Qgd05CeXRlcykgew0KLSAgdWludDMyX3QgbiA9ICgodWludDMyX3Qpd05CeXRlcyArIDFVKSA+PiAxOw0KLSAgdWludDMyX3QgQmFzZUFkZHIgPSAodWludDMyX3QpVVNCeDsNCi0gIHVpbnQzMl90IGk7DQotICB1aW50MzJfdCB0ZW1wMTsNCi0gIHVpbnQzMl90IHRlbXAyOw0KLSAgX19JTyB1aW50MTZfdCAqcGR3VmFsOw0KLSAgdWludDhfdCAqcEJ1ZiA9IHBiVXNyQnVmOw0KLQ0KLSAgcGR3VmFsID0gKF9fSU8gdWludDE2X3QgKikoQmFzZUFkZHIgKyAweDQwMFUgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCl3UE1BQnVmQWRkciAqIFBNQV9BQ0NFU1MpKTsNCi0NCi0gIGZvciAoaSA9IG47IGkgIT0gMFU7IGktLSkgew0KLSAgICB0ZW1wMSA9ICpwQnVmOw0KLSAgICBwQnVmKys7DQotICAgIHRlbXAyID0gdGVtcDEgfCAoKHVpbnQxNl90KSgodWludDE2X3QpKnBCdWYgPDwgOCkpOw0KLSAgICAqcGR3VmFsID0gKHVpbnQxNl90KXRlbXAyOw0KLSAgICBwZHdWYWwrKzsNCi0NCi0jaWYgUE1BX0FDQ0VTUyA+IDFVDQotICAgIHBkd1ZhbCsrOw0KLSNlbmRpZiAvKiBQTUFfQUNDRVNTICovDQotDQotICAgIHBCdWYrKzsNCi0gIH0NCi19DQotDQotLyoqDQotICogQGJyaWVmIENvcHkgZGF0YSBmcm9tIHBhY2tldCBtZW1vcnkgYXJlYSAoUE1BKSB0byB1c2VyIG1lbW9yeSBidWZmZXINCi0gKiBAcGFyYW0gICBVU0J4IFVTQiBwZXJpcGhlcmFsIGluc3RhbmNlIHJlZ2lzdGVyIGFkZHJlc3MuDQotICogQHBhcmFtICAgcGJVc3JCdWYgcG9pbnRlciB0byB1c2VyIG1lbW9yeSBhcmVhLg0KLSAqIEBwYXJhbSAgIHdQTUFCdWZBZGRyIGFkZHJlc3MgaW50byBQTUEuDQotICogQHBhcmFtICAgd05CeXRlcyBuby4gb2YgYnl0ZXMgdG8gYmUgY29waWVkLg0KLSAqIEByZXR2YWwgTm9uZQ0KLSAqLw0KLXZvaWQgVVNCX1JlYWRQTUEoVVNCX1R5cGVEZWYgKlVTQngsIHVpbnQ4X3QgKnBiVXNyQnVmLCB1aW50MTZfdCB3UE1BQnVmQWRkciwNCi0gICAgICAgICAgICAgICAgIHVpbnQxNl90IHdOQnl0ZXMpIHsNCi0gIHVpbnQzMl90IG4gPSAodWludDMyX3Qpd05CeXRlcyA+PiAxOw0KLSAgdWludDMyX3QgQmFzZUFkZHIgPSAodWludDMyX3QpVVNCeDsNCi0gIHVpbnQzMl90IGk7DQotICB1aW50MzJfdCB0ZW1wOw0KLSAgX19JTyB1aW50MTZfdCAqcGR3VmFsOw0KLSAgdWludDhfdCAqcEJ1ZiA9IHBiVXNyQnVmOw0KLQ0KLSAgcGR3VmFsID0gKF9fSU8gdWludDE2X3QgKikoQmFzZUFkZHIgKyAweDQwMFUgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCl3UE1BQnVmQWRkciAqIFBNQV9BQ0NFU1MpKTsNCi0NCi0gIGZvciAoaSA9IG47IGkgIT0gMFU7IGktLSkgew0KLSAgICB0ZW1wID0gKihfX0lPIHVpbnQxNl90ICopcGR3VmFsOw0KLSAgICBwZHdWYWwrKzsNCi0gICAgKnBCdWYgPSAodWludDhfdCkoKHRlbXAgPj4gMCkgJiAweEZGVSk7DQotICAgIHBCdWYrKzsNCi0gICAgKnBCdWYgPSAodWludDhfdCkoKHRlbXAgPj4gOCkgJiAweEZGVSk7DQotICAgIHBCdWYrKzsNCi0NCi0jaWYgUE1BX0FDQ0VTUyA+IDFVDQotICAgIHBkd1ZhbCsrOw0KLSNlbmRpZiAvKiBQTUFfQUNDRVNTICovDQotICB9DQotDQotICBpZiAoKHdOQnl0ZXMgJSAyVSkgIT0gMFUpIHsNCi0gICAgdGVtcCA9ICpwZHdWYWw7DQotICAgICpwQnVmID0gKHVpbnQ4X3QpKCh0ZW1wID4+IDApICYgMHhGRlUpOw0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEB9DQotICovDQotI2VuZGlmIC8qIGRlZmluZWQgKFVTQikgKi8NCi0jZW5kaWYgLyogZGVmaW5lZCAoSEFMX1BDRF9NT0RVTEVfRU5BQkxFRCkgfHwgZGVmaW5lZCAoSEFMX0hDRF9NT0RVTEVfRU5BQkxFRCkgXA0KLSAgICAgICAgKi8NCi0NCi0vKioNCi0gKiBAfQ0KLSAqLw0KKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmc0eHhfbGxfdXNiLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIFVTQiBMb3cgTGF5ZXIgSEFMIG1vZHVsZSBkcml2ZXIuCisgICoKKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBVU0IgUGVyaXBoZXJhbCBDb250cm9sbGVyOgorICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uL2RlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIEkvTyBvcGVyYXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0ZXJtcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlCisgICogaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc29mdHdhcmUgY29tcG9uZW50LgorICAqIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcyB3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICBAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgKCMpIEZpbGwgcGFyYW1ldGVycyBvZiBJbml0IHN0cnVjdHVyZSBpbiBVU0JfQ2ZnVHlwZURlZiBzdHJ1Y3R1cmUuCisKKyAgICAgICgjKSBDYWxsIFVTQl9Db3JlSW5pdCgpIEFQSSB0byBpbml0aWFsaXplIHRoZSBVU0IgQ29yZSBwZXJpcGhlcmFsLgorCisgICAgICAoIykgVGhlIHVwcGVyIEhBTCBIQ0QvUENEIGRyaXZlciB3aWxsIGNhbGwgdGhlIHJpZ2h0IHJvdXRpbmVzIGZvciBpdHMKKyAgaW50ZXJuYWwgcHJvY2Vzc2VzLgorCisgIEBlbmR2ZXJiYXRpbQorCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzR4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzR4eF9MTF9VU0JfRFJJVkVSCisgKiBAeworICovCisKKyNpZiBkZWZpbmVkKEhBTF9QQ0RfTU9EVUxFX0VOQUJMRUQpIHx8IGRlZmluZWQoSEFMX0hDRF9NT0RVTEVfRU5BQkxFRCkKKyNpZiBkZWZpbmVkKFVTQikKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBVU0IgQ29yZQorICogQHBhcmFtICBVU0J4IFVTQiBJbnN0YW5jZQorICogQHBhcmFtICBjZmcgcG9pbnRlciB0byBhIFVTQl9DZmdUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFVTQnggcGVyaXBoZXJhbC4KKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBVU0JfQ29yZUluaXQoVVNCX1R5cGVEZWYgKlVTQngsIFVTQl9DZmdUeXBlRGVmIGNmZykgeworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChVU0J4KTsKKyAgVU5VU0VEKGNmZyk7CisKKyAgLyogTk9URSA6IC0gVGhpcyBmdW5jdGlvbiBpcyBub3QgcmVxdWlyZWQgYnkgVVNCIERldmljZSBGUyBwZXJpcGhlcmFsLCBpdCBpcworICAgICB1c2VkIG9ubHkgYnkgVVNCIE9URyBGUyBwZXJpcGhlcmFsLgorICAgICAgICAgICAgLSBUaGlzIGZ1bmN0aW9uIGlzIGFkZGVkIHRvIGVuc3VyZSBjb21wYXRpYmlsaXR5IGFjcm9zcyBwbGF0Zm9ybXMuCisgICAqLworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICogQGJyaWVmICBVU0JfRW5hYmxlR2xvYmFsSW50CisgKiAgICAgICAgIEVuYWJsZXMgdGhlIGNvbnRyb2xsZXIncyBHbG9iYWwgSW50IGluIHRoZSBBSEIgQ29uZmlnIHJlZworICogQHBhcmFtICBVU0J4IFNlbGVjdGVkIGRldmljZQorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIFVTQl9FbmFibGVHbG9iYWxJbnQoVVNCX1R5cGVEZWYgKlVTQngpIHsKKyAgdWludDMyX3Qgd2ludGVycnVwdG1hc2s7CisKKyAgLyogQ2xlYXIgcGVuZGluZyBpbnRlcnJ1cHRzICovCisgIFVTQngtPklTVFIgPSAwVTsKKworICAvKiBTZXQgd2ludGVycnVwdG1hc2sgdmFyaWFibGUgKi8KKyAgd2ludGVycnVwdG1hc2sgPSBVU0JfQ05UUl9DVFJNIHwgVVNCX0NOVFJfV0tVUE0gfCBVU0JfQ05UUl9TVVNQTSB8CisgICAgICAgICAgICAgICAgICAgVVNCX0NOVFJfRVJSTSB8IFVTQl9DTlRSX1NPRk0gfCBVU0JfQ05UUl9FU09GTSB8CisgICAgICAgICAgICAgICAgICAgVVNCX0NOVFJfUkVTRVRNIHwgVVNCX0NOVFJfTDFSRVFNOworCisgIC8qIFNldCBpbnRlcnJ1cHQgbWFzayAqLworICBVU0J4LT5DTlRSID0gKHVpbnQxNl90KXdpbnRlcnJ1cHRtYXNrOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICogQGJyaWVmICBVU0JfRGlzYWJsZUdsb2JhbEludAorICogICAgICAgICBEaXNhYmxlIHRoZSBjb250cm9sbGVyJ3MgR2xvYmFsIEludCBpbiB0aGUgQUhCIENvbmZpZyByZWcKKyAqIEBwYXJhbSAgVVNCeCBTZWxlY3RlZCBkZXZpY2UKKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBVU0JfRGlzYWJsZUdsb2JhbEludChVU0JfVHlwZURlZiAqVVNCeCkgeworICB1aW50MzJfdCB3aW50ZXJydXB0bWFzazsKKworICAvKiBTZXQgd2ludGVycnVwdG1hc2sgdmFyaWFibGUgKi8KKyAgd2ludGVycnVwdG1hc2sgPSBVU0JfQ05UUl9DVFJNIHwgVVNCX0NOVFJfV0tVUE0gfCBVU0JfQ05UUl9TVVNQTSB8CisgICAgICAgICAgICAgICAgICAgVVNCX0NOVFJfRVJSTSB8IFVTQl9DTlRSX1NPRk0gfCBVU0JfQ05UUl9FU09GTSB8CisgICAgICAgICAgICAgICAgICAgVVNCX0NOVFJfUkVTRVRNIHwgVVNCX0NOVFJfTDFSRVFNOworCisgIC8qIENsZWFyIGludGVycnVwdCBtYXNrICovCisgIFVTQngtPkNOVFIgJj0gKHVpbnQxNl90KSh+d2ludGVycnVwdG1hc2spOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICogQGJyaWVmICBVU0JfU2V0Q3VycmVudE1vZGUgU2V0IGZ1bmN0aW9uYWwgbW9kZQorICogQHBhcmFtICBVU0J4IFNlbGVjdGVkIGRldmljZQorICogQHBhcmFtICBtb2RlIGN1cnJlbnQgY29yZSBtb2RlCisgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSB0aGVzZSB2YWx1ZXM6CisgKiAgICAgICAgICAgIEBhcmcgVVNCX0RFVklDRV9NT0RFIFBlcmlwaGVyYWwgbW9kZQorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIFVTQl9TZXRDdXJyZW50TW9kZShVU0JfVHlwZURlZiAqVVNCeCwgVVNCX01vZGVUeXBlRGVmIG1vZGUpIHsKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoVVNCeCk7CisgIFVOVVNFRChtb2RlKTsKKworICAvKiBOT1RFIDogLSBUaGlzIGZ1bmN0aW9uIGlzIG5vdCByZXF1aXJlZCBieSBVU0IgRGV2aWNlIEZTIHBlcmlwaGVyYWwsIGl0IGlzCisgICAgIHVzZWQgb25seSBieSBVU0IgT1RHIEZTIHBlcmlwaGVyYWwuCisgICAgICAgICAgICAtIFRoaXMgZnVuY3Rpb24gaXMgYWRkZWQgdG8gZW5zdXJlIGNvbXBhdGliaWxpdHkgYWNyb3NzIHBsYXRmb3Jtcy4KKyAgICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICogQGJyaWVmICBVU0JfRGV2SW5pdCBJbml0aWFsaXplcyB0aGUgVVNCIGNvbnRyb2xsZXIgcmVnaXN0ZXJzCisgKiAgICAgICAgIGZvciBkZXZpY2UgbW9kZQorICogQHBhcmFtICBVU0J4IFNlbGVjdGVkIGRldmljZQorICogQHBhcmFtICBjZmcgIHBvaW50ZXIgdG8gYSBVU0JfQ2ZnVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBVU0J4IHBlcmlwaGVyYWwuCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgVVNCX0RldkluaXQoVVNCX1R5cGVEZWYgKlVTQngsIFVTQl9DZmdUeXBlRGVmIGNmZykgeworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChjZmcpOworCisgIC8qIEluaXQgRGV2aWNlICovCisgIC8qIENOVFJfRlJFUyA9IDEgKi8KKyAgVVNCeC0+Q05UUiA9ICh1aW50MTZfdClVU0JfQ05UUl9GUkVTOworCisgIC8qIENOVFJfRlJFUyA9IDAgKi8KKyAgVVNCeC0+Q05UUiA9IDBVOworCisgIC8qIENsZWFyIHBlbmRpbmcgaW50ZXJydXB0cyAqLworICBVU0J4LT5JU1RSID0gMFU7CisKKyAgLypTZXQgQnRhYmxlIEFkZHJlc3MqLworICBVU0J4LT5CVEFCTEUgPSBCVEFCTEVfQUREUkVTUzsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFVTQl9GbHVzaFR4RmlmbyA6IEZsdXNoIGEgVHggRklGTworICAqIEBwYXJhbSAgVVNCeCA6IFNlbGVjdGVkIGRldmljZQorICAqIEBwYXJhbSAgbnVtIDogRklGTyBudW1iZXIKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIGZyb20gMSB0byAxNQorICAgICAgICAgICAgMTUgbWVhbnMgRmx1c2ggYWxsIFR4IEZJRk9zCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBVU0JfRmx1c2hUeEZpZm8oVVNCX1R5cGVEZWYgY29uc3QgKlVTQngsIHVpbnQzMl90IG51bSkgeworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChVU0J4KTsKKyAgVU5VU0VEKG51bSk7CisKKyAgLyogTk9URSA6IC0gVGhpcyBmdW5jdGlvbiBpcyBub3QgcmVxdWlyZWQgYnkgVVNCIERldmljZSBGUyBwZXJpcGhlcmFsLCBpdCBpcworICAgICB1c2VkIG9ubHkgYnkgVVNCIE9URyBGUyBwZXJpcGhlcmFsLgorICAgICAgICAgICAgLSBUaGlzIGZ1bmN0aW9uIGlzIGFkZGVkIHRvIGVuc3VyZSBjb21wYXRpYmlsaXR5IGFjcm9zcyBwbGF0Zm9ybXMuCisgICAqLworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICogQGJyaWVmICBVU0JfRmx1c2hSeEZpZm8gOiBGbHVzaCBSeCBGSUZPCisgKiBAcGFyYW0gIFVTQnggOiBTZWxlY3RlZCBkZXZpY2UKKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBVU0JfRmx1c2hSeEZpZm8oVVNCX1R5cGVEZWYgY29uc3QgKlVTQngpIHsKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoVVNCeCk7CisKKyAgLyogTk9URSA6IC0gVGhpcyBmdW5jdGlvbiBpcyBub3QgcmVxdWlyZWQgYnkgVVNCIERldmljZSBGUyBwZXJpcGhlcmFsLCBpdCBpcworICAgICB1c2VkIG9ubHkgYnkgVVNCIE9URyBGUyBwZXJpcGhlcmFsLgorICAgICAgICAgICAgLSBUaGlzIGZ1bmN0aW9uIGlzIGFkZGVkIHRvIGVuc3VyZSBjb21wYXRpYmlsaXR5IGFjcm9zcyBwbGF0Zm9ybXMuCisgICAqLworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKyNpZiBkZWZpbmVkKEhBTF9QQ0RfTU9EVUxFX0VOQUJMRUQpCisvKioKKyAqIEBicmllZiAgQWN0aXZhdGUgYW5kIGNvbmZpZ3VyZSBhbiBlbmRwb2ludAorICogQHBhcmFtICBVU0J4IFNlbGVjdGVkIGRldmljZQorICogQHBhcmFtICBlcCBwb2ludGVyIHRvIGVuZHBvaW50IHN0cnVjdHVyZQorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIFVTQl9BY3RpdmF0ZUVuZHBvaW50KFVTQl9UeXBlRGVmICpVU0J4LCBVU0JfRVBUeXBlRGVmICplcCkgeworICBIQUxfU3RhdHVzVHlwZURlZiByZXQgPSBIQUxfT0s7CisgIHVpbnQxNl90IHdFcFJlZ1ZhbDsKKworICB3RXBSZWdWYWwgPSBQQ0RfR0VUX0VORFBPSU5UKFVTQngsIGVwLT5udW0pICYgVVNCX0VQX1RfTUFTSzsKKworICAvKiBpbml0aWFsaXplIEVuZHBvaW50ICovCisgIHN3aXRjaCAoZXAtPnR5cGUpIHsKKyAgICBjYXNlIEVQX1RZUEVfQ1RSTDoKKyAgICAgIHdFcFJlZ1ZhbCB8PSBVU0JfRVBfQ09OVFJPTDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBFUF9UWVBFX0JVTEs6CisgICAgICB3RXBSZWdWYWwgfD0gVVNCX0VQX0JVTEs7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRVBfVFlQRV9JTlRSOgorICAgICAgd0VwUmVnVmFsIHw9IFVTQl9FUF9JTlRFUlJVUFQ7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRVBfVFlQRV9JU09DOgorICAgICAgd0VwUmVnVmFsIHw9IFVTQl9FUF9JU09DSFJPTk9VUzsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIHJldCA9IEhBTF9FUlJPUjsKKyAgICAgIGJyZWFrOworICB9CisKKyAgUENEX1NFVF9FTkRQT0lOVChVU0J4LCBlcC0+bnVtLCAod0VwUmVnVmFsIHwgVVNCX0VQX0NUUl9SWCB8IFVTQl9FUF9DVFJfVFgpKTsKKworICBQQ0RfU0VUX0VQX0FERFJFU1MoVVNCeCwgZXAtPm51bSwgZXAtPm51bSk7CisKKyAgaWYgKGVwLT5kb3VibGVidWZmZXIgPT0gMFUpIHsKKyAgICBpZiAoZXAtPmlzX2luICE9IDBVKSB7CisgICAgICAvKlNldCB0aGUgZW5kcG9pbnQgVHJhbnNtaXQgYnVmZmVyIGFkZHJlc3MgKi8KKyAgICAgIFBDRF9TRVRfRVBfVFhfQUREUkVTUyhVU0J4LCBlcC0+bnVtLCBlcC0+cG1hYWRyZXNzKTsKKyAgICAgIFBDRF9DTEVBUl9UWF9EVE9HKFVTQngsIGVwLT5udW0pOworCisgICAgICBpZiAoZXAtPnR5cGUgIT0gRVBfVFlQRV9JU09DKSB7CisgICAgICAgIC8qIENvbmZpZ3VyZSBOQUsgc3RhdHVzIGZvciB0aGUgRW5kcG9pbnQgKi8KKyAgICAgICAgUENEX1NFVF9FUF9UWF9TVEFUVVMoVVNCeCwgZXAtPm51bSwgVVNCX0VQX1RYX05BSyk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBDb25maWd1cmUgVFggRW5kcG9pbnQgdG8gZGlzYWJsZWQgc3RhdGUgKi8KKyAgICAgICAgUENEX1NFVF9FUF9UWF9TVEFUVVMoVVNCeCwgZXAtPm51bSwgVVNCX0VQX1RYX0RJUyk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIFNldCB0aGUgZW5kcG9pbnQgUmVjZWl2ZSBidWZmZXIgYWRkcmVzcyAqLworICAgICAgUENEX1NFVF9FUF9SWF9BRERSRVNTKFVTQngsIGVwLT5udW0sIGVwLT5wbWFhZHJlc3MpOworCisgICAgICAvKiBTZXQgdGhlIGVuZHBvaW50IFJlY2VpdmUgYnVmZmVyIGNvdW50ZXIgKi8KKyAgICAgIFBDRF9TRVRfRVBfUlhfQ05UKFVTQngsIGVwLT5udW0sIGVwLT5tYXhwYWNrZXQpOworICAgICAgUENEX0NMRUFSX1JYX0RUT0coVVNCeCwgZXAtPm51bSk7CisKKyAgICAgIGlmIChlcC0+bnVtID09IDBVKSB7CisgICAgICAgIC8qIENvbmZpZ3VyZSBWQUxJRCBzdGF0dXMgZm9yIEVQMCAqLworICAgICAgICBQQ0RfU0VUX0VQX1JYX1NUQVRVUyhVU0J4LCBlcC0+bnVtLCBVU0JfRVBfUlhfVkFMSUQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogQ29uZmlndXJlIE5BSyBzdGF0dXMgZm9yIE9VVCBFbmRwb2ludCAqLworICAgICAgICBQQ0RfU0VUX0VQX1JYX1NUQVRVUyhVU0J4LCBlcC0+bnVtLCBVU0JfRVBfUlhfTkFLKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyNpZiAoVVNFX1VTQl9ET1VCTEVfQlVGRkVSID09IDFVKQorICAvKiBEb3VibGUgQnVmZmVyICovCisgIGVsc2UgeworICAgIGlmIChlcC0+dHlwZSA9PSBFUF9UWVBFX0JVTEspIHsKKyAgICAgIC8qIFNldCBidWxrIGVuZHBvaW50IGFzIGRvdWJsZSBidWZmZXJlZCAqLworICAgICAgUENEX1NFVF9CVUxLX0VQX0RCVUYoVVNCeCwgZXAtPm51bSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIFNldCB0aGUgSVNPQyBlbmRwb2ludCBpbiBkb3VibGUgYnVmZmVyIG1vZGUgKi8KKyAgICAgIFBDRF9DTEVBUl9FUF9LSU5EKFVTQngsIGVwLT5udW0pOworICAgIH0KKworICAgIC8qIFNldCBidWZmZXIgYWRkcmVzcyBmb3IgZG91YmxlIGJ1ZmZlcmVkIG1vZGUgKi8KKyAgICBQQ0RfU0VUX0VQX0RCVUZfQUREUihVU0J4LCBlcC0+bnVtLCBlcC0+cG1hYWRkcjAsIGVwLT5wbWFhZGRyMSk7CisKKyAgICBpZiAoZXAtPmlzX2luID09IDBVKSB7CisgICAgICAvKiBDbGVhciB0aGUgZGF0YSB0b2dnbGUgYml0cyBmb3IgdGhlIGVuZHBvaW50IElOL09VVCAqLworICAgICAgUENEX0NMRUFSX1JYX0RUT0coVVNCeCwgZXAtPm51bSk7CisgICAgICBQQ0RfQ0xFQVJfVFhfRFRPRyhVU0J4LCBlcC0+bnVtKTsKKworICAgICAgLyogU2V0IGVuZHBvaW50IFJYIGNvdW50ICovCisgICAgICBQQ0RfU0VUX0VQX0RCVUZfQ05UKFVTQngsIGVwLT5udW0sIGVwLT5pc19pbiwgZXAtPm1heHBhY2tldCk7CisKKyAgICAgIC8qIFNldCBlbmRwb2ludCBSWCB0byB2YWxpZCBzdGF0ZSAqLworICAgICAgUENEX1NFVF9FUF9SWF9TVEFUVVMoVVNCeCwgZXAtPm51bSwgVVNCX0VQX1JYX1ZBTElEKTsKKyAgICAgIFBDRF9TRVRfRVBfVFhfU1RBVFVTKFVTQngsIGVwLT5udW0sIFVTQl9FUF9UWF9ESVMpOworICAgIH0gZWxzZSB7CisgICAgICAvKiBDbGVhciB0aGUgZGF0YSB0b2dnbGUgYml0cyBmb3IgdGhlIGVuZHBvaW50IElOL09VVCAqLworICAgICAgUENEX0NMRUFSX1JYX0RUT0coVVNCeCwgZXAtPm51bSk7CisgICAgICBQQ0RfQ0xFQVJfVFhfRFRPRyhVU0J4LCBlcC0+bnVtKTsKKworICAgICAgaWYgKGVwLT50eXBlICE9IEVQX1RZUEVfSVNPQykgeworICAgICAgICAvKiBDb25maWd1cmUgTkFLIHN0YXR1cyBmb3IgdGhlIEVuZHBvaW50ICovCisgICAgICAgIFBDRF9TRVRfRVBfVFhfU1RBVFVTKFVTQngsIGVwLT5udW0sIFVTQl9FUF9UWF9OQUspOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogQ29uZmlndXJlIFRYIEVuZHBvaW50IHRvIGRpc2FibGVkIHN0YXRlICovCisgICAgICAgIFBDRF9TRVRfRVBfVFhfU1RBVFVTKFVTQngsIGVwLT5udW0sIFVTQl9FUF9UWF9ESVMpOworICAgICAgfQorCisgICAgICBQQ0RfU0VUX0VQX1JYX1NUQVRVUyhVU0J4LCBlcC0+bnVtLCBVU0JfRVBfUlhfRElTKTsKKyAgICB9CisgIH0KKyNlbmRpZiAvKiAoVVNFX1VTQl9ET1VCTEVfQlVGRkVSID09IDFVKSAqLworCisgIHJldHVybiByZXQ7Cit9CisKKy8qKgorICogQGJyaWVmICBEZS1hY3RpdmF0ZSBhbmQgZGUtaW5pdGlhbGl6ZSBhbiBlbmRwb2ludAorICogQHBhcmFtICBVU0J4IFNlbGVjdGVkIGRldmljZQorICogQHBhcmFtICBlcCBwb2ludGVyIHRvIGVuZHBvaW50IHN0cnVjdHVyZQorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIFVTQl9EZWFjdGl2YXRlRW5kcG9pbnQoVVNCX1R5cGVEZWYgKlVTQngsIFVTQl9FUFR5cGVEZWYgKmVwKSB7CisgIGlmIChlcC0+ZG91YmxlYnVmZmVyID09IDBVKSB7CisgICAgaWYgKGVwLT5pc19pbiAhPSAwVSkgeworICAgICAgUENEX0NMRUFSX1RYX0RUT0coVVNCeCwgZXAtPm51bSk7CisKKyAgICAgIC8qIENvbmZpZ3VyZSBESVNBQkxFIHN0YXR1cyBmb3IgdGhlIEVuZHBvaW50ICovCisgICAgICBQQ0RfU0VUX0VQX1RYX1NUQVRVUyhVU0J4LCBlcC0+bnVtLCBVU0JfRVBfVFhfRElTKTsKKyAgICB9CisKKyAgICBlbHNlIHsKKyAgICAgIFBDRF9DTEVBUl9SWF9EVE9HKFVTQngsIGVwLT5udW0pOworCisgICAgICAvKiBDb25maWd1cmUgRElTQUJMRSBzdGF0dXMgZm9yIHRoZSBFbmRwb2ludCAqLworICAgICAgUENEX1NFVF9FUF9SWF9TVEFUVVMoVVNCeCwgZXAtPm51bSwgVVNCX0VQX1JYX0RJUyk7CisgICAgfQorICB9CisjaWYgKFVTRV9VU0JfRE9VQkxFX0JVRkZFUiA9PSAxVSkKKyAgLyogRG91YmxlIEJ1ZmZlciAqLworICBlbHNlIHsKKyAgICBpZiAoZXAtPmlzX2luID09IDBVKSB7CisgICAgICAvKiBDbGVhciB0aGUgZGF0YSB0b2dnbGUgYml0cyBmb3IgdGhlIGVuZHBvaW50IElOL09VVCovCisgICAgICBQQ0RfQ0xFQVJfUlhfRFRPRyhVU0J4LCBlcC0+bnVtKTsKKyAgICAgIFBDRF9DTEVBUl9UWF9EVE9HKFVTQngsIGVwLT5udW0pOworCisgICAgICAvKiBSZXNldCB2YWx1ZSBvZiB0aGUgZGF0YSB0b2dnbGUgYml0cyBmb3IgdGhlIGVuZHBvaW50IG91dCovCisgICAgICBQQ0RfVFhfRFRPRyhVU0J4LCBlcC0+bnVtKTsKKworICAgICAgUENEX1NFVF9FUF9SWF9TVEFUVVMoVVNCeCwgZXAtPm51bSwgVVNCX0VQX1JYX0RJUyk7CisgICAgICBQQ0RfU0VUX0VQX1RYX1NUQVRVUyhVU0J4LCBlcC0+bnVtLCBVU0JfRVBfVFhfRElTKTsKKyAgICB9IGVsc2UgeworICAgICAgLyogQ2xlYXIgdGhlIGRhdGEgdG9nZ2xlIGJpdHMgZm9yIHRoZSBlbmRwb2ludCBJTi9PVVQqLworICAgICAgUENEX0NMRUFSX1JYX0RUT0coVVNCeCwgZXAtPm51bSk7CisgICAgICBQQ0RfQ0xFQVJfVFhfRFRPRyhVU0J4LCBlcC0+bnVtKTsKKyAgICAgIFBDRF9SWF9EVE9HKFVTQngsIGVwLT5udW0pOworCisgICAgICAvKiBDb25maWd1cmUgRElTQUJMRSBzdGF0dXMgZm9yIHRoZSBFbmRwb2ludCovCisgICAgICBQQ0RfU0VUX0VQX1RYX1NUQVRVUyhVU0J4LCBlcC0+bnVtLCBVU0JfRVBfVFhfRElTKTsKKyAgICAgIFBDRF9TRVRfRVBfUlhfU1RBVFVTKFVTQngsIGVwLT5udW0sIFVTQl9FUF9SWF9ESVMpOworICAgIH0KKyAgfQorI2VuZGlmIC8qIChVU0VfVVNCX0RPVUJMRV9CVUZGRVIgPT0gMVUpICovCisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgIFVTQl9FUFN0YXJ0WGZlciBzZXR1cCBhbmQgc3RhcnRzIGEgdHJhbnNmZXIgb3ZlciBhbiBFUAorICogQHBhcmFtICBVU0J4IFNlbGVjdGVkIGRldmljZQorICogQHBhcmFtICBlcCBwb2ludGVyIHRvIGVuZHBvaW50IHN0cnVjdHVyZQorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIFVTQl9FUFN0YXJ0WGZlcihVU0JfVHlwZURlZiAqVVNCeCwgVVNCX0VQVHlwZURlZiAqZXApIHsKKyAgdWludDMyX3QgbGVuOworI2lmIChVU0VfVVNCX0RPVUJMRV9CVUZGRVIgPT0gMVUpCisgIHVpbnQxNl90IHBtYWJ1ZmZlcjsKKyAgdWludDE2X3Qgd0VQVmFsOworI2VuZGlmIC8qIChVU0VfVVNCX0RPVUJMRV9CVUZGRVIgPT0gMVUpICovCisKKyAgLyogSU4gZW5kcG9pbnQgKi8KKyAgaWYgKGVwLT5pc19pbiA9PSAxVSkgeworICAgIC8qIE11bHRpIHBhY2tldCB0cmFuc2ZlciAqLworICAgIGlmIChlcC0+eGZlcl9sZW4gPiBlcC0+bWF4cGFja2V0KSB7CisgICAgICBsZW4gPSBlcC0+bWF4cGFja2V0OworICAgIH0gZWxzZSB7CisgICAgICBsZW4gPSBlcC0+eGZlcl9sZW47CisgICAgfQorCisgICAgLyogY29uZmlndXJlIGFuZCB2YWxpZGF0ZSBUeCBlbmRwb2ludCAqLworICAgIGlmIChlcC0+ZG91YmxlYnVmZmVyID09IDBVKSB7CisgICAgICBVU0JfV3JpdGVQTUEoVVNCeCwgZXAtPnhmZXJfYnVmZiwgZXAtPnBtYWFkcmVzcywgKHVpbnQxNl90KWxlbik7CisgICAgICBQQ0RfU0VUX0VQX1RYX0NOVChVU0J4LCBlcC0+bnVtLCBsZW4pOworICAgIH0KKyNpZiAoVVNFX1VTQl9ET1VCTEVfQlVGRkVSID09IDFVKQorICAgIGVsc2UgeworICAgICAgLyogZG91YmxlIGJ1ZmZlciBidWxrIG1hbmFnZW1lbnQgKi8KKyAgICAgIGlmIChlcC0+dHlwZSA9PSBFUF9UWVBFX0JVTEspIHsKKyAgICAgICAgaWYgKGVwLT54ZmVyX2xlbl9kYiA+IGVwLT5tYXhwYWNrZXQpIHsKKyAgICAgICAgICAvKiBlbmFibGUgZG91YmxlIGJ1ZmZlciAqLworICAgICAgICAgIFBDRF9TRVRfQlVMS19FUF9EQlVGKFVTQngsIGVwLT5udW0pOworCisgICAgICAgICAgLyogZWFjaCBUaW1lIHRvIHdyaXRlIGluIFBNQSB4ZmVyX2xlbl9kYiB3aWxsICovCisgICAgICAgICAgZXAtPnhmZXJfbGVuX2RiIC09IGxlbjsKKworICAgICAgICAgIC8qIEZpbGwgdGhlIHR3byBmaXJzdCBidWZmZXIgaW4gdGhlIEJ1ZmZlcjAgJiBCdWZmZXIxICovCisgICAgICAgICAgaWYgKChQQ0RfR0VUX0VORFBPSU5UKFVTQngsIGVwLT5udW0pICYgVVNCX0VQX0RUT0dfVFgpICE9IDBVKSB7CisgICAgICAgICAgICAvKiBTZXQgdGhlIERvdWJsZSBidWZmZXIgY291bnRlciBmb3IgcG1hYnVmZmVyMSAqLworICAgICAgICAgICAgUENEX1NFVF9FUF9EQlVGMV9DTlQoVVNCeCwgZXAtPm51bSwgZXAtPmlzX2luLCBsZW4pOworICAgICAgICAgICAgcG1hYnVmZmVyID0gZXAtPnBtYWFkZHIxOworCisgICAgICAgICAgICAvKiBXcml0ZSB0aGUgdXNlciBidWZmZXIgdG8gVVNCIFBNQSAqLworICAgICAgICAgICAgVVNCX1dyaXRlUE1BKFVTQngsIGVwLT54ZmVyX2J1ZmYsIHBtYWJ1ZmZlciwgKHVpbnQxNl90KWxlbik7CisgICAgICAgICAgICBlcC0+eGZlcl9idWZmICs9IGxlbjsKKworICAgICAgICAgICAgaWYgKGVwLT54ZmVyX2xlbl9kYiA+IGVwLT5tYXhwYWNrZXQpIHsKKyAgICAgICAgICAgICAgZXAtPnhmZXJfbGVuX2RiIC09IGxlbjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGxlbiA9IGVwLT54ZmVyX2xlbl9kYjsKKyAgICAgICAgICAgICAgZXAtPnhmZXJfbGVuX2RiID0gMFU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFNldCB0aGUgRG91YmxlIGJ1ZmZlciBjb3VudGVyIGZvciBwbWFidWZmZXIwICovCisgICAgICAgICAgICBQQ0RfU0VUX0VQX0RCVUYwX0NOVChVU0J4LCBlcC0+bnVtLCBlcC0+aXNfaW4sIGxlbik7CisgICAgICAgICAgICBwbWFidWZmZXIgPSBlcC0+cG1hYWRkcjA7CisKKyAgICAgICAgICAgIC8qIFdyaXRlIHRoZSB1c2VyIGJ1ZmZlciB0byBVU0IgUE1BICovCisgICAgICAgICAgICBVU0JfV3JpdGVQTUEoVVNCeCwgZXAtPnhmZXJfYnVmZiwgcG1hYnVmZmVyLCAodWludDE2X3QpbGVuKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogU2V0IHRoZSBEb3VibGUgYnVmZmVyIGNvdW50ZXIgZm9yIHBtYWJ1ZmZlcjAgKi8KKyAgICAgICAgICAgIFBDRF9TRVRfRVBfREJVRjBfQ05UKFVTQngsIGVwLT5udW0sIGVwLT5pc19pbiwgbGVuKTsKKyAgICAgICAgICAgIHBtYWJ1ZmZlciA9IGVwLT5wbWFhZGRyMDsKKworICAgICAgICAgICAgLyogV3JpdGUgdGhlIHVzZXIgYnVmZmVyIHRvIFVTQiBQTUEgKi8KKyAgICAgICAgICAgIFVTQl9Xcml0ZVBNQShVU0J4LCBlcC0+eGZlcl9idWZmLCBwbWFidWZmZXIsICh1aW50MTZfdClsZW4pOworICAgICAgICAgICAgZXAtPnhmZXJfYnVmZiArPSBsZW47CisKKyAgICAgICAgICAgIGlmIChlcC0+eGZlcl9sZW5fZGIgPiBlcC0+bWF4cGFja2V0KSB7CisgICAgICAgICAgICAgIGVwLT54ZmVyX2xlbl9kYiAtPSBsZW47CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBsZW4gPSBlcC0+eGZlcl9sZW5fZGI7CisgICAgICAgICAgICAgIGVwLT54ZmVyX2xlbl9kYiA9IDBVOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBTZXQgdGhlIERvdWJsZSBidWZmZXIgY291bnRlciBmb3IgcG1hYnVmZmVyMSAqLworICAgICAgICAgICAgUENEX1NFVF9FUF9EQlVGMV9DTlQoVVNCeCwgZXAtPm51bSwgZXAtPmlzX2luLCBsZW4pOworICAgICAgICAgICAgcG1hYnVmZmVyID0gZXAtPnBtYWFkZHIxOworCisgICAgICAgICAgICAvKiBXcml0ZSB0aGUgdXNlciBidWZmZXIgdG8gVVNCIFBNQSAqLworICAgICAgICAgICAgVVNCX1dyaXRlUE1BKFVTQngsIGVwLT54ZmVyX2J1ZmYsIHBtYWJ1ZmZlciwgKHVpbnQxNl90KWxlbik7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIGF1dG8gU3dpdGNoIHRvIHNpbmdsZSBidWZmZXIgbW9kZSB3aGVuIHRyYW5zZmVyIDxNcHMgbm8gbmVlZCB0bworICAgICAgICAgICBtYW5hZ2UgaW4gZG91YmxlIGJ1ZmZlciAqLworICAgICAgICBlbHNlIHsKKyAgICAgICAgICBsZW4gPSBlcC0+eGZlcl9sZW5fZGI7CisKKyAgICAgICAgICAvKiBkaXNhYmxlIGRvdWJsZSBidWZmZXIgbW9kZSBmb3IgQnVsayBlbmRwb2ludCAqLworICAgICAgICAgIFBDRF9DTEVBUl9CVUxLX0VQX0RCVUYoVVNCeCwgZXAtPm51bSk7CisKKyAgICAgICAgICAvKiBTZXQgVHggY291bnQgd2l0aCBuYnJlIG9mIGJ5dGUgdG8gYmUgdHJhbnNtaXR0ZWQgKi8KKyAgICAgICAgICBQQ0RfU0VUX0VQX1RYX0NOVChVU0J4LCBlcC0+bnVtLCBsZW4pOworICAgICAgICAgIHBtYWJ1ZmZlciA9IGVwLT5wbWFhZGRyMDsKKworICAgICAgICAgIC8qIFdyaXRlIHRoZSB1c2VyIGJ1ZmZlciB0byBVU0IgUE1BICovCisgICAgICAgICAgVVNCX1dyaXRlUE1BKFVTQngsIGVwLT54ZmVyX2J1ZmYsIHBtYWJ1ZmZlciwgKHVpbnQxNl90KWxlbik7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSAvKiBNYW5hZ2UgaXNvY2hyb25vdXMgZG91YmxlIGJ1ZmZlciBJTiBtb2RlICovCisgICAgICB7CisgICAgICAgIC8qIEVhY2ggVGltZSB0byB3cml0ZSBpbiBQTUEgeGZlcl9sZW5fZGIgd2lsbCAqLworICAgICAgICBlcC0+eGZlcl9sZW5fZGIgLT0gbGVuOworCisgICAgICAgIC8qIEZpbGwgdGhlIGRhdGEgYnVmZmVyICovCisgICAgICAgIGlmICgoUENEX0dFVF9FTkRQT0lOVChVU0J4LCBlcC0+bnVtKSAmIFVTQl9FUF9EVE9HX1RYKSAhPSAwVSkgeworICAgICAgICAgIC8qIFNldCB0aGUgRG91YmxlIGJ1ZmZlciBjb3VudGVyIGZvciBwbWFidWZmZXIxICovCisgICAgICAgICAgUENEX1NFVF9FUF9EQlVGMV9DTlQoVVNCeCwgZXAtPm51bSwgZXAtPmlzX2luLCBsZW4pOworICAgICAgICAgIHBtYWJ1ZmZlciA9IGVwLT5wbWFhZGRyMTsKKworICAgICAgICAgIC8qIFdyaXRlIHRoZSB1c2VyIGJ1ZmZlciB0byBVU0IgUE1BICovCisgICAgICAgICAgVVNCX1dyaXRlUE1BKFVTQngsIGVwLT54ZmVyX2J1ZmYsIHBtYWJ1ZmZlciwgKHVpbnQxNl90KWxlbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLyogU2V0IHRoZSBEb3VibGUgYnVmZmVyIGNvdW50ZXIgZm9yIHBtYWJ1ZmZlcjAgKi8KKyAgICAgICAgICBQQ0RfU0VUX0VQX0RCVUYwX0NOVChVU0J4LCBlcC0+bnVtLCBlcC0+aXNfaW4sIGxlbik7CisgICAgICAgICAgcG1hYnVmZmVyID0gZXAtPnBtYWFkZHIwOworCisgICAgICAgICAgLyogV3JpdGUgdGhlIHVzZXIgYnVmZmVyIHRvIFVTQiBQTUEgKi8KKyAgICAgICAgICBVU0JfV3JpdGVQTUEoVVNCeCwgZXAtPnhmZXJfYnVmZiwgcG1hYnVmZmVyLCAodWludDE2X3QpbGVuKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiAoVVNFX1VTQl9ET1VCTEVfQlVGRkVSID09IDFVKSAqLworCisgICAgUENEX1NFVF9FUF9UWF9TVEFUVVMoVVNCeCwgZXAtPm51bSwgVVNCX0VQX1RYX1ZBTElEKTsKKyAgfSBlbHNlIC8qIE9VVCBlbmRwb2ludCAqLworICB7CisgICAgaWYgKGVwLT5kb3VibGVidWZmZXIgPT0gMFUpIHsKKyAgICAgIGlmICgoZXAtPnhmZXJfbGVuID09IDBVKSAmJiAoZXAtPnR5cGUgPT0gRVBfVFlQRV9DVFJMKSkgeworICAgICAgICAvKiBUaGlzIGlzIGEgc3RhdHVzIG91dCBzdGFnZSBzZXQgdGhlIE9VVF9TVEFUVVMgKi8KKyAgICAgICAgUENEX1NFVF9PVVRfU1RBVFVTKFVTQngsIGVwLT5udW0pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgUENEX0NMRUFSX09VVF9TVEFUVVMoVVNCeCwgZXAtPm51bSk7CisgICAgICB9CisKKyAgICAgIC8qIE11bHRpIHBhY2tldCB0cmFuc2ZlciAqLworICAgICAgaWYgKGVwLT54ZmVyX2xlbiA+IGVwLT5tYXhwYWNrZXQpIHsKKyAgICAgICAgZXAtPnhmZXJfbGVuIC09IGVwLT5tYXhwYWNrZXQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBlcC0+eGZlcl9sZW4gPSAwVTsKKyAgICAgIH0KKyAgICB9CisjaWYgKFVTRV9VU0JfRE9VQkxFX0JVRkZFUiA9PSAxVSkKKyAgICBlbHNlIHsKKyAgICAgIC8qIEZpcnN0IFRyYW5zZmVyIENvbWluZyBGcm9tIEhBTF9QQ0RfRVBfUmVjZWl2ZSAmIEZyb20gSVNSICovCisgICAgICAvKiBTZXQgdGhlIERvdWJsZSBidWZmZXIgY291bnRlciAqLworICAgICAgaWYgKGVwLT50eXBlID09IEVQX1RZUEVfQlVMSykgeworICAgICAgICAvKiBDb21pbmcgZnJvbSBJU1IgKi8KKyAgICAgICAgaWYgKGVwLT54ZmVyX2NvdW50ICE9IDBVKSB7CisgICAgICAgICAgLyogVXBkYXRlIGxhc3QgdmFsdWUgdG8gY2hlY2sgaWYgdGhlcmUgaXMgYmxvY2tpbmcgc3RhdGUgKi8KKyAgICAgICAgICB3RVBWYWwgPSBQQ0RfR0VUX0VORFBPSU5UKFVTQngsIGVwLT5udW0pOworCisgICAgICAgICAgLyogQmxvY2tpbmcgU3RhdGUgKi8KKyAgICAgICAgICBpZiAoKCgod0VQVmFsICYgVVNCX0VQX0RUT0dfUlgpICE9IDBVKSAmJgorICAgICAgICAgICAgICAgKCh3RVBWYWwgJiBVU0JfRVBfRFRPR19UWCkgIT0gMFUpKSB8fAorICAgICAgICAgICAgICAoKCh3RVBWYWwgJiBVU0JfRVBfRFRPR19SWCkgPT0gMFUpICYmCisgICAgICAgICAgICAgICAoKHdFUFZhbCAmIFVTQl9FUF9EVE9HX1RYKSA9PSAwVSkpKSB7CisgICAgICAgICAgICBQQ0RfRlJFRV9VU0VSX0JVRkZFUihVU0J4LCBlcC0+bnVtLCAwVSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICAvKiBpc28gb3V0IGRvdWJsZSAqLworICAgICAgZWxzZSBpZiAoZXAtPnR5cGUgPT0gRVBfVFlQRV9JU09DKSB7CisgICAgICAgIC8qIE9ubHkgc2luZ2xlIHBhY2tldCB0cmFuc2ZlciBzdXBwb3J0ZWQgaW4gRlMgKi8KKyAgICAgICAgZXAtPnhmZXJfbGVuID0gMFU7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiAoVVNFX1VTQl9ET1VCTEVfQlVGRkVSID09IDFVKSAqLworCisgICAgUENEX1NFVF9FUF9SWF9TVEFUVVMoVVNCeCwgZXAtPm51bSwgVVNCX0VQX1JYX1ZBTElEKTsKKyAgfQorCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICogQGJyaWVmICBVU0JfRVBTZXRTdGFsbCBzZXQgYSBzdGFsbCBjb25kaXRpb24gb3ZlciBhbiBFUAorICogQHBhcmFtICBVU0J4IFNlbGVjdGVkIGRldmljZQorICogQHBhcmFtICBlcCBwb2ludGVyIHRvIGVuZHBvaW50IHN0cnVjdHVyZQorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIFVTQl9FUFNldFN0YWxsKFVTQl9UeXBlRGVmICpVU0J4LCBVU0JfRVBUeXBlRGVmICplcCkgeworICBpZiAoZXAtPmlzX2luICE9IDBVKSB7CisgICAgUENEX1NFVF9FUF9UWF9TVEFUVVMoVVNCeCwgZXAtPm51bSwgVVNCX0VQX1RYX1NUQUxMKTsKKyAgfSBlbHNlIHsKKyAgICBQQ0RfU0VUX0VQX1JYX1NUQVRVUyhVU0J4LCBlcC0+bnVtLCBVU0JfRVBfUlhfU1RBTEwpOworICB9CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgIFVTQl9FUENsZWFyU3RhbGwgQ2xlYXIgYSBzdGFsbCBjb25kaXRpb24gb3ZlciBhbiBFUAorICogQHBhcmFtICBVU0J4IFNlbGVjdGVkIGRldmljZQorICogQHBhcmFtICBlcCBwb2ludGVyIHRvIGVuZHBvaW50IHN0cnVjdHVyZQorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIFVTQl9FUENsZWFyU3RhbGwoVVNCX1R5cGVEZWYgKlVTQngsIFVTQl9FUFR5cGVEZWYgKmVwKSB7CisgIGlmIChlcC0+aXNfaW4gIT0gMFUpIHsKKyAgICBQQ0RfQ0xFQVJfVFhfRFRPRyhVU0J4LCBlcC0+bnVtKTsKKworICAgIGlmIChlcC0+dHlwZSAhPSBFUF9UWVBFX0lTT0MpIHsKKyAgICAgIC8qIENvbmZpZ3VyZSBOQUsgc3RhdHVzIGZvciB0aGUgRW5kcG9pbnQgKi8KKyAgICAgIFBDRF9TRVRfRVBfVFhfU1RBVFVTKFVTQngsIGVwLT5udW0sIFVTQl9FUF9UWF9OQUspOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBQQ0RfQ0xFQVJfUlhfRFRPRyhVU0J4LCBlcC0+bnVtKTsKKworICAgIC8qIENvbmZpZ3VyZSBWQUxJRCBzdGF0dXMgZm9yIHRoZSBFbmRwb2ludCAqLworICAgIFBDRF9TRVRfRVBfUlhfU1RBVFVTKFVTQngsIGVwLT5udW0sIFVTQl9FUF9SWF9WQUxJRCk7CisgIH0KKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiAgVVNCX0VQU3RvcHRYZmVyICBTdG9wIHRyYW5zZmVyIG9uIGFuIEVQCisgKiBAcGFyYW0gIFVTQnggIHVzYiBkZXZpY2UgaW5zdGFuY2UKKyAqIEBwYXJhbSAgZXAgcG9pbnRlciB0byBlbmRwb2ludCBzdHJ1Y3R1cmUKKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBVU0JfRVBTdG9wWGZlcihVU0JfVHlwZURlZiAqVVNCeCwgVVNCX0VQVHlwZURlZiAqZXApIHsKKyAgLyogSU4gZW5kcG9pbnQgKi8KKyAgaWYgKGVwLT5pc19pbiA9PSAxVSkgeworICAgIGlmIChlcC0+ZG91YmxlYnVmZmVyID09IDBVKSB7CisgICAgICBpZiAoZXAtPnR5cGUgIT0gRVBfVFlQRV9JU09DKSB7CisgICAgICAgIC8qIENvbmZpZ3VyZSBOQUsgc3RhdHVzIGZvciB0aGUgRW5kcG9pbnQgKi8KKyAgICAgICAgUENEX1NFVF9FUF9UWF9TVEFUVVMoVVNCeCwgZXAtPm51bSwgVVNCX0VQX1RYX05BSyk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBDb25maWd1cmUgVFggRW5kcG9pbnQgdG8gZGlzYWJsZWQgc3RhdGUgKi8KKyAgICAgICAgUENEX1NFVF9FUF9UWF9TVEFUVVMoVVNCeCwgZXAtPm51bSwgVVNCX0VQX1RYX0RJUyk7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgLyogT1VUIGVuZHBvaW50ICovCisgIHsKKyAgICBpZiAoZXAtPmRvdWJsZWJ1ZmZlciA9PSAwVSkgeworICAgICAgaWYgKGVwLT50eXBlICE9IEVQX1RZUEVfSVNPQykgeworICAgICAgICAvKiBDb25maWd1cmUgTkFLIHN0YXR1cyBmb3IgdGhlIEVuZHBvaW50ICovCisgICAgICAgIFBDRF9TRVRfRVBfUlhfU1RBVFVTKFVTQngsIGVwLT5udW0sIFVTQl9FUF9SWF9OQUspOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogQ29uZmlndXJlIFJYIEVuZHBvaW50IHRvIGRpc2FibGVkIHN0YXRlICovCisgICAgICAgIFBDRF9TRVRfRVBfUlhfU1RBVFVTKFVTQngsIGVwLT5udW0sIFVTQl9FUF9SWF9ESVMpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBIQUxfT0s7Cit9CisjZW5kaWYgLyogZGVmaW5lZCAoSEFMX1BDRF9NT0RVTEVfRU5BQkxFRCkgKi8KKworLyoqCisgKiBAYnJpZWYgIFVTQl9TdG9wRGV2aWNlIFN0b3AgdGhlIHVzYiBkZXZpY2UgbW9kZQorICogQHBhcmFtICBVU0J4IFNlbGVjdGVkIGRldmljZQorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIFVTQl9TdG9wRGV2aWNlKFVTQl9UeXBlRGVmICpVU0J4KSB7CisgIC8qIGRpc2FibGUgYWxsIGludGVycnVwdHMgYW5kIGZvcmNlIFVTQiByZXNldCAqLworICBVU0J4LT5DTlRSID0gKHVpbnQxNl90KVVTQl9DTlRSX0ZSRVM7CisKKyAgLyogY2xlYXIgaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlciAqLworICBVU0J4LT5JU1RSID0gMFU7CisKKyAgLyogc3dpdGNoLW9mZiBkZXZpY2UgKi8KKyAgVVNCeC0+Q05UUiA9ICh1aW50MTZfdCkoVVNCX0NOVFJfRlJFUyB8IFVTQl9DTlRSX1BEV04pOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICogQGJyaWVmICBVU0JfU2V0RGV2QWRkcmVzcyBTdG9wIHRoZSB1c2IgZGV2aWNlIG1vZGUKKyAqIEBwYXJhbSAgVVNCeCBTZWxlY3RlZCBkZXZpY2UKKyAqIEBwYXJhbSAgYWRkcmVzcyBuZXcgZGV2aWNlIGFkZHJlc3MgdG8gYmUgYXNzaWduZWQKKyAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIGZyb20gMCB0byAyNTUKKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBVU0JfU2V0RGV2QWRkcmVzcyhVU0JfVHlwZURlZiAqVVNCeCwgdWludDhfdCBhZGRyZXNzKSB7CisgIGlmIChhZGRyZXNzID09IDBVKSB7CisgICAgLyogc2V0IGRldmljZSBhZGRyZXNzIGFuZCBlbmFibGUgZnVuY3Rpb24gKi8KKyAgICBVU0J4LT5EQUREUiA9ICh1aW50MTZfdClVU0JfREFERFJfRUY7CisgIH0KKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAqIEBicmllZiAgVVNCX0RldkNvbm5lY3QgQ29ubmVjdCB0aGUgVVNCIGRldmljZSBieSBlbmFibGluZyB0aGUKKyAqIHB1bGwtdXAvcHVsbC1kb3duCisgKiBAcGFyYW0gIFVTQnggU2VsZWN0ZWQgZGV2aWNlCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgVVNCX0RldkNvbm5lY3QoVVNCX1R5cGVEZWYgKlVTQngpIHsKKyAgLyogRW5hYmxpbmcgRFAgUHVsbC1VUCBiaXQgdG8gQ29ubmVjdCBpbnRlcm5hbCBQVSByZXNpc3RvciBvbiBVU0IgRFAgbGluZSAqLworICBVU0J4LT5CQ0RSIHw9ICh1aW50MTZfdClVU0JfQkNEUl9EUFBVOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICogQGJyaWVmICBVU0JfRGV2RGlzY29ubmVjdCBEaXNjb25uZWN0IHRoZSBVU0IgZGV2aWNlIGJ5IGRpc2FibGluZyB0aGUKKyAqIHB1bGwtdXAvcHVsbC1kb3duCisgKiBAcGFyYW0gIFVTQnggU2VsZWN0ZWQgZGV2aWNlCisgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAqLworSEFMX1N0YXR1c1R5cGVEZWYgVVNCX0RldkRpc2Nvbm5lY3QoVVNCX1R5cGVEZWYgKlVTQngpIHsKKyAgLyogRGlzYWJsZSBEUCBQdWxsLVVwIGJpdCB0byBkaXNjb25uZWN0IHRoZSBJbnRlcm5hbCBQVSByZXNpc3RvciBvbiBVU0IgRFAKKyAgICogbGluZSAqLworICBVU0J4LT5CQ0RSICY9ICh1aW50MTZfdCkofihVU0JfQkNEUl9EUFBVKSk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgIFVTQl9SZWFkSW50ZXJydXB0cyByZXR1cm4gdGhlIGdsb2JhbCBVU0IgaW50ZXJydXB0IHN0YXR1cworICogQHBhcmFtICBVU0J4IFNlbGVjdGVkIGRldmljZQorICogQHJldHZhbCBVU0IgR2xvYmFsIEludGVycnVwdCBzdGF0dXMKKyAqLwordWludDMyX3QgVVNCX1JlYWRJbnRlcnJ1cHRzKFVTQl9UeXBlRGVmIGNvbnN0ICpVU0J4KSB7CisgIHVpbnQzMl90IHRtcHJlZzsKKworICB0bXByZWcgPSBVU0J4LT5JU1RSOworICByZXR1cm4gdG1wcmVnOworfQorCisvKioKKyAqIEBicmllZiAgVVNCX0FjdGl2YXRlUmVtb3RlV2FrZXVwIDogYWN0aXZlIHJlbW90ZSB3YWtldXAgc2lnbmFsbGluZworICogQHBhcmFtICBVU0J4IFNlbGVjdGVkIGRldmljZQorICogQHJldHZhbCBIQUwgc3RhdHVzCisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIFVTQl9BY3RpdmF0ZVJlbW90ZVdha2V1cChVU0JfVHlwZURlZiAqVVNCeCkgeworICBVU0J4LT5DTlRSIHw9ICh1aW50MTZfdClVU0JfQ05UUl9SRVNVTUU7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgIFVTQl9EZUFjdGl2YXRlUmVtb3RlV2FrZXVwIGRlLWFjdGl2ZSByZW1vdGUgd2FrZXVwIHNpZ25hbGxpbmcKKyAqIEBwYXJhbSAgVVNCeCBTZWxlY3RlZCBkZXZpY2UKKyAqIEByZXR2YWwgSEFMIHN0YXR1cworICovCitIQUxfU3RhdHVzVHlwZURlZiBVU0JfRGVBY3RpdmF0ZVJlbW90ZVdha2V1cChVU0JfVHlwZURlZiAqVVNCeCkgeworICBVU0J4LT5DTlRSICY9ICh1aW50MTZfdCkoflVTQl9DTlRSX1JFU1VNRSk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgQ29weSBhIGJ1ZmZlciBmcm9tIHVzZXIgbWVtb3J5IGFyZWEgdG8gcGFja2V0IG1lbW9yeSBhcmVhIChQTUEpCisgKiBAcGFyYW0gICBVU0J4IFVTQiBwZXJpcGhlcmFsIGluc3RhbmNlIHJlZ2lzdGVyIGFkZHJlc3MuCisgKiBAcGFyYW0gICBwYlVzckJ1ZiBwb2ludGVyIHRvIHVzZXIgbWVtb3J5IGFyZWEuCisgKiBAcGFyYW0gICB3UE1BQnVmQWRkciBhZGRyZXNzIGludG8gUE1BLgorICogQHBhcmFtICAgd05CeXRlcyBuby4gb2YgYnl0ZXMgdG8gYmUgY29waWVkLgorICogQHJldHZhbCBOb25lCisgKi8KK3ZvaWQgVVNCX1dyaXRlUE1BKFVTQl9UeXBlRGVmIGNvbnN0ICpVU0J4LCB1aW50OF90ICpwYlVzckJ1ZiwKKyAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHdQTUFCdWZBZGRyLCB1aW50MTZfdCB3TkJ5dGVzKSB7CisgIHVpbnQzMl90IG4gPSAoKHVpbnQzMl90KXdOQnl0ZXMgKyAxVSkgPj4gMTsKKyAgdWludDMyX3QgQmFzZUFkZHIgPSAodWludDMyX3QpVVNCeDsKKyAgdWludDMyX3QgY291bnQ7CisgIHVpbnQxNl90IFdyVmFsOworICBfX0lPIHVpbnQxNl90ICpwZHdWYWw7CisgIHVpbnQ4X3QgKnBCdWYgPSBwYlVzckJ1ZjsKKworICBwZHdWYWwgPSAoX19JTyB1aW50MTZfdCAqKShCYXNlQWRkciArIDB4NDAwVSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3Qpd1BNQUJ1ZkFkZHIgKiBQTUFfQUNDRVNTKSk7CisKKyAgZm9yIChjb3VudCA9IG47IGNvdW50ICE9IDBVOyBjb3VudC0tKSB7CisgICAgV3JWYWwgPSBwQnVmWzBdOworICAgIFdyVmFsIHw9ICh1aW50MTZfdClwQnVmWzFdIDw8IDg7CisgICAgKnBkd1ZhbCA9IChXclZhbCAmIDB4RkZGRlUpOworICAgIHBkd1ZhbCsrOworCisjaWYgUE1BX0FDQ0VTUyA+IDFVCisgICAgcGR3VmFsKys7CisjZW5kaWYgLyogUE1BX0FDQ0VTUyAqLworCisgICAgcEJ1ZisrOworICAgIHBCdWYrKzsKKyAgfQorfQorCisvKioKKyAqIEBicmllZiBDb3B5IGRhdGEgZnJvbSBwYWNrZXQgbWVtb3J5IGFyZWEgKFBNQSkgdG8gdXNlciBtZW1vcnkgYnVmZmVyCisgKiBAcGFyYW0gICBVU0J4IFVTQiBwZXJpcGhlcmFsIGluc3RhbmNlIHJlZ2lzdGVyIGFkZHJlc3MuCisgKiBAcGFyYW0gICBwYlVzckJ1ZiBwb2ludGVyIHRvIHVzZXIgbWVtb3J5IGFyZWEuCisgKiBAcGFyYW0gICB3UE1BQnVmQWRkciBhZGRyZXNzIGludG8gUE1BLgorICogQHBhcmFtICAgd05CeXRlcyBuby4gb2YgYnl0ZXMgdG8gYmUgY29waWVkLgorICogQHJldHZhbCBOb25lCisgKi8KK3ZvaWQgVVNCX1JlYWRQTUEoVVNCX1R5cGVEZWYgY29uc3QgKlVTQngsIHVpbnQ4X3QgKnBiVXNyQnVmLAorICAgICAgICAgICAgICAgICB1aW50MTZfdCB3UE1BQnVmQWRkciwgdWludDE2X3Qgd05CeXRlcykgeworICB1aW50MzJfdCBuID0gKHVpbnQzMl90KXdOQnl0ZXMgPj4gMTsKKyAgdWludDMyX3QgQmFzZUFkZHIgPSAodWludDMyX3QpVVNCeDsKKyAgdWludDMyX3QgY291bnQ7CisgIHVpbnQzMl90IFJkVmFsOworICBfX0lPIHVpbnQxNl90ICpwZHdWYWw7CisgIHVpbnQ4X3QgKnBCdWYgPSBwYlVzckJ1ZjsKKworICBwZHdWYWwgPSAoX19JTyB1aW50MTZfdCAqKShCYXNlQWRkciArIDB4NDAwVSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3Qpd1BNQUJ1ZkFkZHIgKiBQTUFfQUNDRVNTKSk7CisKKyAgZm9yIChjb3VudCA9IG47IGNvdW50ICE9IDBVOyBjb3VudC0tKSB7CisgICAgUmRWYWwgPSAqKF9fSU8gdWludDE2X3QgKilwZHdWYWw7CisgICAgcGR3VmFsKys7CisgICAgKnBCdWYgPSAodWludDhfdCkoKFJkVmFsID4+IDApICYgMHhGRlUpOworICAgIHBCdWYrKzsKKyAgICAqcEJ1ZiA9ICh1aW50OF90KSgoUmRWYWwgPj4gOCkgJiAweEZGVSk7CisgICAgcEJ1ZisrOworCisjaWYgUE1BX0FDQ0VTUyA+IDFVCisgICAgcGR3VmFsKys7CisjZW5kaWYgLyogUE1BX0FDQ0VTUyAqLworICB9CisKKyAgaWYgKCh3TkJ5dGVzICUgMlUpICE9IDBVKSB7CisgICAgUmRWYWwgPSAqcGR3VmFsOworICAgICpwQnVmID0gKHVpbnQ4X3QpKChSZFZhbCA+PiAwKSAmIDB4RkZVKTsKKyAgfQorfQorCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCisjZW5kaWYgLyogZGVmaW5lZCAoVVNCKSAqLworI2VuZGlmIC8qIGRlZmluZWQgKEhBTF9QQ0RfTU9EVUxFX0VOQUJMRUQpIHx8IGRlZmluZWQgKEhBTF9IQ0RfTU9EVUxFX0VOQUJMRUQpIFwKKyAgICAgICAgKi8KKworLyoqCisgKiBAfQorICovCmRpZmYgLS1naXQgYS9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0R1YWxfSU1VIERlYnVnLmNmZyBiL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHVhbF9JTVUgRGVidWcuY2ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNzQ3ODMKLS0tIC9kZXYvbnVsbAorKysgYi9mcmM5NzEvaW11X2ZkY2FuL0R1YWxfSU1VL0R1YWxfSU1VIERlYnVnLmNmZwpAQCAtMCwwICsxLDQ0IEBACisjIFRoaXMgaXMgYW4gZ2VuZXJpY0JvYXJkIGJvYXJkIHdpdGggYSBzaW5nbGUgU1RNMzJHNDczUkVUeCBjaGlwCisjCisjIEdlbmVyYXRlZCBieSBTVE0zMkN1YmVJREUKKyMgVGFrZSBjYXJlIHRoYXQgc3VjaCBmaWxlLCBhcyBnZW5lcmF0ZWQsIG1heSBiZSBvdmVycmlkZGVuIHdpdGhvdXQgYW55IGVhcmx5IG5vdGljZS4gUGxlYXNlIGhhdmUgYSBsb29rIHRvIGRlYnVnIGxhdW5jaCBjb25maWd1cmF0aW9uIHNldHVwKHMpCisKK3NvdXJjZSBbZmluZCBpbnRlcmZhY2Uvc3RsaW5rLWRhcC5jZmddCisKKworc2V0IFdPUktBUkVBU0laRSAweDgwMDAKKwordHJhbnNwb3J0IHNlbGVjdCAiZGFwZGlyZWN0X3N3ZCIKKworc2V0IENISVBOQU1FIFNUTTMyRzQ3M1JFVHgKK3NldCBCT0FSRE5BTUUgZ2VuZXJpY0JvYXJkCisKKyMgRW5hYmxlIGRlYnVnIHdoZW4gaW4gbG93IHBvd2VyIG1vZGVzCitzZXQgRU5BQkxFX0xPV19QT1dFUiAxCisKKyMgU3RvcCBXYXRjaGRvZyBjb3VudGVycyB3aGVuIGhhbHQKK3NldCBTVE9QX1dBVENIRE9HIDEKKworIyBTVGxpbmsgRGVidWcgY2xvY2sgZnJlcXVlbmN5CitzZXQgQ0xPQ0tfRlJFUSA4MDAwCisKKyMgUmVzZXQgY29uZmlndXJhdGlvbgorIyB1c2UgaGFyZHdhcmUgcmVzZXQsIGNvbm5lY3QgdW5kZXIgcmVzZXQKKyMgY29ubmVjdF9hc3NlcnRfc3JzdCBuZWVkZWQgaWYgbG93IHBvd2VyIG1vZGUgYXBwbGljYXRpb24gcnVubmluZyAoV0ZJLi4uKQorcmVzZXRfY29uZmlnIHNyc3Rfb25seSBzcnN0X25vZ2F0ZSBjb25uZWN0X2Fzc2VydF9zcnN0CitzZXQgQ09OTkVDVF9VTkRFUl9SRVNFVCAxCitzZXQgQ09SRV9SRVNFVCAwCisKKyMgQUNDRVNTIFBPUlQgTlVNQkVSCitzZXQgQVBfTlVNIDAKKyMgR0RCIFBPUlQKK3NldCBHREJfUE9SVCAzMzMzCisKKworCisKKworIyBCQ1RNIENQVSB2YXJpYWJsZXMKKworc291cmNlIFtmaW5kIHRhcmdldC9zdG0zMmc0eC5jZmddCisKZGlmZiAtLWdpdCBhL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvRHVhbF9JTVUuaW9jIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9EdWFsX0lNVS5pb2MKaW5kZXggZmZjMDY0OC4uYjYxYTVmZCAxMDA2NDQKLS0tIGEvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9EdWFsX0lNVS5pb2MKKysrIGIvZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9EdWFsX0lNVS5pb2MKQEAgLTIzLDIzICsyMywyNyBAQAogRkRDQU4yLk5vbWluYWxUaW1lU2VnMj0zCiBGaWxlLlZlcnNpb249NgogR1BJTy5ncm91cGVkQnk9R3JvdXAgQnkgUGVyaXBoZXJhbHMKK0lXREcuSVBQYXJhbWV0ZXJzPVByZXNjYWxlcixSZWxvYWQKK0lXREcuUHJlc2NhbGVyPUlXREdfUFJFU0NBTEVSXzE2CitJV0RHLlJlbG9hZD0yMDAKIEtlZXBVc2VyUGxhY2VtZW50PWZhbHNlCiBNY3UuQ1BOPVNUTTMyRzQ3M1JFVDYKIE1jdS5GYW1pbHk9U1RNMzJHNAogTWN1LklQMD1BREM1CiBNY3UuSVAxPUZEQ0FOMgotTWN1LklQMTA9VElNMwotTWN1LklQMTE9VVNBUlQxCi1NY3UuSVAxMj1VU0IKLU1jdS5JUDI9TlZJQwotTWN1LklQMz1SQ0MKLU1jdS5JUDQ9U1BJMQotTWN1LklQNT1TUEkyCi1NY3UuSVA2PVNQSTMKLU1jdS5JUDc9U1lTCi1NY3UuSVA4PVRJTTEKLU1jdS5JUDk9VElNMgotTWN1LklQTmI9MTMKK01jdS5JUDEwPVRJTTIKK01jdS5JUDExPVRJTTMKK01jdS5JUDEyPVVTQVJUMQorTWN1LklQMTM9VVNCCitNY3UuSVAyPUlXREcKK01jdS5JUDM9TlZJQworTWN1LklQND1SQ0MKK01jdS5JUDU9U1BJMQorTWN1LklQNj1TUEkyCitNY3UuSVA3PVNQSTMKK01jdS5JUDg9U1lTCitNY3UuSVA5PVRJTTEKK01jdS5JUE5iPTE0CiBNY3UuTmFtZT1TVE0zMkc0NzNSKEItQy1FKVR4CiBNY3UuUGFja2FnZT1MUUZQNjQKIE1jdS5QaW4wPVBDMTMKQEAgLTg5LDIxICs5MywyMiBAQAogTWN1LlBpbjQ5PVBCNwogTWN1LlBpbjU9UEMwCiBNY3UuUGluNTA9UEI5Ci1NY3UuUGluNTE9VlBfU1lTX1ZTX1N5c3RpY2sKLU1jdS5QaW41Mj1WUF9TWVNfVlNfREJTaWduYWxzCi1NY3UuUGluNTM9VlBfVElNMV9WU19DbG9ja1NvdXJjZUlOVAotTWN1LlBpbjU0PVZQX1RJTTJfVlNfQ2xvY2tTb3VyY2VJTlQKLU1jdS5QaW41NT1WUF9USU0zX1ZTX0Nsb2NrU291cmNlSU5UCitNY3UuUGluNTE9VlBfSVdER19WU19JV0RHCitNY3UuUGluNTI9VlBfU1lTX1ZTX1N5c3RpY2sKK01jdS5QaW41Mz1WUF9TWVNfVlNfREJTaWduYWxzCitNY3UuUGluNTQ9VlBfVElNMV9WU19DbG9ja1NvdXJjZUlOVAorTWN1LlBpbjU1PVZQX1RJTTJfVlNfQ2xvY2tTb3VyY2VJTlQKK01jdS5QaW41Nj1WUF9USU0zX1ZTX0Nsb2NrU291cmNlSU5UCiBNY3UuUGluNj1QQzEKIE1jdS5QaW43PVBDMgogTWN1LlBpbjg9UEMzCiBNY3UuUGluOT1QQTAKLU1jdS5QaW5zTmI9NTYKK01jdS5QaW5zTmI9NTcKIE1jdS5UaGlyZFBhcnR5TmI9MAogTWN1LlVzZXJDb25zdGFudHM9CiBNY3UuVXNlck5hbWU9U1RNMzJHNDczUkVUeAotTXhDdWJlLlZlcnNpb249Ni4xMC4wCi1NeERiLlZlcnNpb249REIuNi4wLjEwMAorTXhDdWJlLlZlcnNpb249Ni4xMi4xCitNeERiLlZlcnNpb249REIuNi4wLjEyMQogTlZJQy5CdXNGYXVsdF9JUlFuPXRydWVcOjBcOjBcOmZhbHNlXDpmYWxzZVw6dHJ1ZVw6ZmFsc2VcOmZhbHNlXDpmYWxzZQogTlZJQy5EZWJ1Z01vbml0b3JfSVJRbj10cnVlXDowXDowXDpmYWxzZVw6ZmFsc2VcOnRydWVcOmZhbHNlXDpmYWxzZVw6ZmFsc2UKIE5WSUMuRm9yY2VFbmFibGVETUFWZWN0b3I9dHJ1ZQpAQCAtMzE3LDEyICszMjIsMTIgQEAKIFByb2plY3RNYW5hZ2VyLkRlZmF1bHRGV0xvY2F0aW9uPXRydWUKIFByb2plY3RNYW5hZ2VyLkRlbGV0ZVByZXZpb3VzPXRydWUKIFByb2plY3RNYW5hZ2VyLkRldmljZUlkPVNUTTMyRzQ3M1JFVHgKLVByb2plY3RNYW5hZ2VyLkZpcm13YXJlUGFja2FnZT1TVE0zMkN1YmUgRldfRzQgVjEuNS4xCitQcm9qZWN0TWFuYWdlci5GaXJtd2FyZVBhY2thZ2U9U1RNMzJDdWJlIEZXX0c0IFYxLjYuMQogUHJvamVjdE1hbmFnZXIuRnJlZVBpbnM9ZmFsc2UKIFByb2plY3RNYW5hZ2VyLkhhbEFzc2VydEZ1bGw9ZmFsc2UKIFByb2plY3RNYW5hZ2VyLkhlYXBTaXplPTB4MjAwCiBQcm9qZWN0TWFuYWdlci5LZWVwVXNlckNvZGU9dHJ1ZQotUHJvamVjdE1hbmFnZXIuTGFzdEZpcm13YXJlPWZhbHNlCitQcm9qZWN0TWFuYWdlci5MYXN0RmlybXdhcmU9dHJ1ZQogUHJvamVjdE1hbmFnZXIuTGlicmFyeUNvcHk9MQogUHJvamVjdE1hbmFnZXIuTWFpbkxvY2F0aW9uPUNvcmUvU3JjCiBQcm9qZWN0TWFuYWdlci5Ob01haW49ZmFsc2UKQEAgLTMzOCw3ICszNDMsNyBAQAogUHJvamVjdE1hbmFnZXIuVUFTY3JpcHRBZnRlclBhdGg9CiBQcm9qZWN0TWFuYWdlci5VQVNjcmlwdEJlZm9yZVBhdGg9CiBQcm9qZWN0TWFuYWdlci5VbmRlclJvb3Q9dHJ1ZQotUHJvamVjdE1hbmFnZXIuZnVuY3Rpb25saXN0c29ydD0xLVN5c3RlbUNsb2NrX0NvbmZpZy1SQ0MtZmFsc2UtSEFMLWZhbHNlLDItTVhfR1BJT19Jbml0LUdQSU8tZmFsc2UtSEFMLXRydWUsMy1NWF9GRENBTjJfSW5pdC1GRENBTjItZmFsc2UtSEFMLXRydWUsNC1NWF9BREM1X0luaXQtQURDNS1mYWxzZS1IQUwtdHJ1ZSw1LU1YX1NQSTFfSW5pdC1TUEkxLWZhbHNlLUhBTC10cnVlLDYtTVhfU1BJMl9Jbml0LVNQSTItZmFsc2UtSEFMLXRydWUsNy1NWF9TUEkzX0luaXQtU1BJMy1mYWxzZS1IQUwtdHJ1ZSw4LU1YX1VTQVJUMV9VQVJUX0luaXQtVVNBUlQxLWZhbHNlLUhBTC10cnVlLDktTVhfVElNM19Jbml0LVRJTTMtZmFsc2UtSEFMLXRydWUsMTAtTVhfVVNCX1BDRF9Jbml0LVVTQi1mYWxzZS1IQUwtdHJ1ZSwxMS1NWF9USU0yX0luaXQtVElNMi1mYWxzZS1IQUwtdHJ1ZSwxMi1NWF9USU0xX0luaXQtVElNMS1mYWxzZS1IQUwtdHJ1ZQorUHJvamVjdE1hbmFnZXIuZnVuY3Rpb25saXN0c29ydD0xLVN5c3RlbUNsb2NrX0NvbmZpZy1SQ0MtZmFsc2UtSEFMLWZhbHNlLDItTVhfR1BJT19Jbml0LUdQSU8tZmFsc2UtSEFMLXRydWUsMy1NWF9GRENBTjJfSW5pdC1GRENBTjItZmFsc2UtSEFMLXRydWUsNC1NWF9BREM1X0luaXQtQURDNS1mYWxzZS1IQUwtdHJ1ZSw1LU1YX1NQSTFfSW5pdC1TUEkxLWZhbHNlLUhBTC10cnVlLDYtTVhfU1BJMl9Jbml0LVNQSTItZmFsc2UtSEFMLXRydWUsNy1NWF9TUEkzX0luaXQtU1BJMy1mYWxzZS1IQUwtdHJ1ZSw4LU1YX1VTQVJUMV9VQVJUX0luaXQtVVNBUlQxLWZhbHNlLUhBTC10cnVlLDktTVhfVElNM19Jbml0LVRJTTMtZmFsc2UtSEFMLXRydWUsMTAtTVhfVVNCX1BDRF9Jbml0LVVTQi1mYWxzZS1IQUwtdHJ1ZSwxMS1NWF9USU0yX0luaXQtVElNMi1mYWxzZS1IQUwtdHJ1ZSwxMi1NWF9USU0xX0luaXQtVElNMS1mYWxzZS1IQUwtdHJ1ZSwxMy1NWF9JV0RHX0luaXQtSVdERy1mYWxzZS1IQUwtdHJ1ZQogUkNDLkFEQzEyRnJlcV9WYWx1ZT0xNjgwMDAwMDAKIFJDQy5BREMzNDVGcmVxX1ZhbHVlPTE2ODAwMDAwMAogUkNDLkFIQkZyZXFfVmFsdWU9MTY4MDAwMDAwCkBAIC00MzgsNiArNDQzLDggQEAKIFVTQVJUMS5WaXJ0dWFsTW9kZS1Bc3luY2hyb25vdXM9Vk1fQVNZTkMKIFVTQi5JUFBhcmFtZXRlcnM9U29mX2VuYWJsZQogVVNCLlNvZl9lbmFibGU9RElTQUJMRQorVlBfSVdER19WU19JV0RHLk1vZGU9SVdER19BY3RpdmF0ZQorVlBfSVdER19WU19JV0RHLlNpZ25hbD1JV0RHX1ZTX0lXREcKIFZQX1NZU19WU19EQlNpZ25hbHMuTW9kZT1EaXNhYmxlRGVhZEJhdHRlcnlTaWduYWxzCiBWUF9TWVNfVlNfREJTaWduYWxzLlNpZ25hbD1TWVNfVlNfREJTaWduYWxzCiBWUF9TWVNfVlNfU3lzdGljay5Nb2RlPVN5c1RpY2sKZGlmZiAtLWdpdCBhL2ZyYzk3MS9pbXVfZmRjYW4vUkVBRE1FLm1kIGIvZnJjOTcxL2ltdV9mZGNhbi9SRUFETUUubWQKaW5kZXggOGU4MmY3My4uN2JmNzMyOCAxMDA2NDQKLS0tIGEvZnJjOTcxL2ltdV9mZGNhbi9SRUFETUUubWQKKysrIGIvZnJjOTcxL2ltdV9mZGNhbi9SRUFETUUubWQKQEAgLTIzLDcgKzIzLDggQEAKICAgICAqIFRoZSBtYWluIGNvZGUgbGl2ZXMgaW4gW2BEdWFsX0lNVS9Db3JlL1NyY2BdKC9EdWFsX0lNVS9Db3JlL1NyYy8pLiBNYWtlIHN1cmUgeW91ciBjaGFuZ2VzIGhhcHBlbiBpbnNpZGUgc2VjdGlvbnMgbWFya2VkIGAvKiBVU0VSIENPREUgQkVHSU4gLi4uICovYCBgLyogVVNFUiBDT0RFIEVORCAuLi4gKi9gLiBDb2RlIG91dHNpZGUgdGhlc2UgbWFya2VycyB3aWxsIGJlIG92ZXJ3cml0dGVuIGJ5IEN1YmVJREUgd2hlbiBnZW5lcmF0aW5nIGNvZGUgYWZ0ZXIgY2hhbmdlcyB0byB0aGUgYC5pb2NgIGZpbGUuCiAzKSBCdWlsZCArIFJ1bjoKICAgICAqIE9wdGlvbiAxOiBPcGVuIEN1YmVJREUgR1VJIHRvIGJ1aWxkLCBkZWJ1Zywgb3IgcnVuLgotICAgICogT3B0aW9uIDI6IAorICAgIDwhLS0gVE9ETyhzaW5keSk6IGZpeCB0aGlzIGJ1aWxkIHNjcmlwdCAtLT4KKyAgICAqIE9wdGlvbiAyIChETyBOT1QgVVNFLiBOT1QgU0FGRSkgCiAgICAgICAgIDEpIFNTSCBvbnRvIHRoZSBidWlsZCBzZXJ2ZXIuIAogICAgICAgICAyKSBSdW4gYGJhemVsIGJ1aWxkIC1jIG9wdCAtLWNvbmZpZz1jb3J0ZXgtbTRmLWltdSAvL2ZyYzk3MS9pbXVfZmRjYW4vRHVhbF9JTVUvQ29yZTptYWluLmVsZmAuIFRoZSBvdXRwdXQgLmVsZiBmaWxlIHNob3VsZCBiZSBpbiBiYXplbC1iaW4vZnJjOTcxL2ltdV9mZGNhbi9EdWFsX0lNVS9Db3JlLgogICAgICAgICAzKSAoSWYgZGVwbG95aW5nIGNvZGUgbG9jYWxseSkgTW92ZSBmaWxlIHRvIGxvY2FsIGRpcmVjdG9yeS4gRm9yIGV4YW1wbGU6IGBzY3AgPHVzZXJuYW1lPkBidWlsZC5mcmM5NzEub3JnOjxwYXRoL3RvL21haW4uZWxmPiA8bG9jYWwvcGF0aC90by9zYXZlL2ZpbGUvYC4gQSBnb29kIHNwb3QgdG8gcHV0IHRoaXMgbG9jYWxseSBpcyAuL0R1YWxfSU1VL0RlYnVnLy4KZGlmZiAtLWdpdCBhL2ZyYzk3MS9vcmluL3NldF9vcmluX2Nsb2NrLnNoIGIvZnJjOTcxL29yaW4vc2V0X29yaW5fY2xvY2suc2gKaW5kZXggYmM5ZGQ4Zi4uZmQ2MTVjNSAxMDA3NTUKLS0tIGEvZnJjOTcxL29yaW4vc2V0X29yaW5fY2xvY2suc2gKKysrIGIvZnJjOTcxL29yaW4vc2V0X29yaW5fY2xvY2suc2gKQEAgLTEyLDcgKzEyLDcgQEAKIAogZm9yIG9yaW4gaW4gJE9SSU5fTElTVDsgZG8KICAgICBlY2hvICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIKLSAgICBlY2hvICJTZXR0aW5nIGNsb2NrIGZvciAke1JPQk9UX1BSRUZJWH03MS4xMCR7b3Jpbn0iCisgICAgZWNobyAiU2V0dGluZyBjbG9jayBmb3IgMTAuJHtST0JPVF9QUkVGSVh9LjcxLjEwJHtvcmlufSIKICAgICBlY2hvICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIKICAgICBjdXJyZW50X3RpbWU9YHN1ZG8gaHdjbG9ja2AKICAgICBJRlM9Ii4iCmRpZmYgLS1naXQgYS9mcmM5NzEvdmlzaW9uL0JVSUxEIGIvZnJjOTcxL3Zpc2lvbi9CVUlMRAppbmRleCA0OGE4ZmIxLi5kYzQwYmFiIDEwMDY0NAotLS0gYS9mcmM5NzEvdmlzaW9uL0JVSUxECisrKyBiL2ZyYzk3MS92aXNpb24vQlVJTEQKQEAgLTIzOCw2ICsyMzgsNyBAQAogICAgICAgICAiOnRhcmdldF9tYXBfZmJzIiwKICAgICAgICAgIi8vYW9zL2V2ZW50czpzaW11bGF0ZWRfZXZlbnRfbG9vcCIsCiAgICAgICAgICIvL2ZyYzk3MS9jb250cm9sX2xvb3BzOmNvbnRyb2xfbG9vcCIsCisgICAgICAgICIvL2ZyYzk3MS92aXNpb246dmlzaW9uX3V0aWxfbGliIiwKICAgICAgICAgIi8vZnJjOTcxL3Zpc2lvbjp2aXN1YWxpemVfcm9ib3QiLAogICAgICAgICAiLy9mcmM5NzEvdmlzaW9uL2NlcmVzOnBvc2VfZ3JhcGhfM2RfbGliIiwKICAgICAgICAgIi8vdGhpcmRfcGFydHk6b3BlbmN2IiwKQEAgLTQzNywxMSArNDM4LDE2IEBACiAgICAgaGRycyA9IFsidmlzaW9uX3V0aWxfbGliLmgiXSwKICAgICB2aXNpYmlsaXR5ID0gWyIvL3Zpc2liaWxpdHk6cHVibGljIl0sCiAgICAgZGVwcyA9IFsKKyAgICAgICAgIi8vYW9zL3V0aWw6bWF0aCIsCisgICAgICAgICIvL2ZyYzk3MS9jb250cm9sX2xvb3BzOnF1YXRlcm5pb25fdXRpbHMiLAogICAgICAgICAiLy9mcmM5NzEvdmlzaW9uOmNhbGlicmF0aW9uX2ZicyIsCisgICAgICAgICIvL2ZyYzk3MS92aXNpb24vY2VyZXM6cG9zZV9ncmFwaF8zZF9saWIiLAogICAgICAgICAiLy90aGlyZF9wYXJ0eTpvcGVuY3YiLAogICAgICAgICAiQGNvbV9nb29nbGVfYWJzbC8vYWJzbC9sb2ciLAogICAgICAgICAiQGNvbV9nb29nbGVfYWJzbC8vYWJzbC9sb2c6Y2hlY2siLAogICAgICAgICAiQGNvbV9nb29nbGVfYWJzbC8vYWJzbC9zdHJpbmdzOnN0cl9mb3JtYXQiLAorICAgICAgICAiQGNvbV9nb29nbGVfY2VyZXNfc29sdmVyLy86Y2VyZXMiLAorICAgICAgICAiQG9yZ190dXhmYW1pbHlfZWlnZW4vLzplaWdlbiIsCiAgICAgXSwKICkKIApkaWZmIC0tZ2l0IGEvZnJjOTcxL3Zpc2lvbi9pbWFnZV9sb2dnZXIuY2MgYi9mcmM5NzEvdmlzaW9uL2ltYWdlX2xvZ2dlci5jYwppbmRleCBjYjhmYzRlLi4wMWNlYWY0IDEwMDY0NAotLS0gYS9mcmM5NzEvdmlzaW9uL2ltYWdlX2xvZ2dlci5jYworKysgYi9mcmM5NzEvdmlzaW9uL2ltYWdlX2xvZ2dlci5jYwpAQCAtNzUsNiArNzUsOCBAQAogICAgIH0pOwogICB9CiAKKyAgTE9HKElORk8pIDw8ICJTdGFydGluZyBpbWFnZV9sb2dnZXI7IHdpbGwgd2FpdCBvbiBqb3lzdGljayBlbmFibGVkIHRvIHN0YXJ0ICIKKyAgICAgICAgICAgICAgICJsb2dnaW5nIjsKICAgZXZlbnRfbG9vcC5PblJ1bihbXSgpIHsKICAgICBlcnJubyA9IDA7CiAgICAgc2V0cHJpb3JpdHkoUFJJT19QUk9DRVNTLCAwLCAtMjApOwpkaWZmIC0tZ2l0IGEvZnJjOTcxL3Zpc2lvbi90YXJnZXRfbWFwcGVyLmNjIGIvZnJjOTcxL3Zpc2lvbi90YXJnZXRfbWFwcGVyLmNjCmluZGV4IDM2ZjBhMjkuLjk5YjY3ZDIgMTAwNjQ0Ci0tLSBhL2ZyYzk3MS92aXNpb24vdGFyZ2V0X21hcHBlci5jYworKysgYi9mcmM5NzEvdmlzaW9uL3RhcmdldF9tYXBwZXIuY2MKQEAgLTUsNiArNSw3IEBACiAjaW5jbHVkZSAiZnJjOTcxL2NvbnRyb2xfbG9vcHMvY29udHJvbF9sb29wLmgiCiAjaW5jbHVkZSAiZnJjOTcxL3Zpc2lvbi9jZXJlcy9wb3NlX2dyYXBoXzNkX2Vycm9yX3Rlcm0uaCIKICNpbmNsdWRlICJmcmM5NzEvdmlzaW9uL2dlb21ldHJ5LmgiCisjaW5jbHVkZSAiZnJjOTcxL3Zpc2lvbi92aXNpb25fdXRpbF9saWIuaCIKIAogQUJTTF9GTEFHKHVpbnQ2NF90LCBtYXhfbnVtX2l0ZXJhdGlvbnMsIDEwMCwKICAgICAgICAgICAiTWF4aW11bSBudW1iZXIgb2YgaXRlcmF0aW9ucyBmb3IgdGhlIGNlcmVzIHNvbHZlciIpOwpAQCAtMjgsODkgKzI5LDYgQEAKICAgICAgICAgICAiV2hldGhlciB0byBkbyBhIGZpbmFsIGZpdCBvZiB0aGUgc29sdmVkIG1hcCB0byB0aGUgb3JpZ2luYWwgbWFwIik7CiAKIG5hbWVzcGFjZSBmcmM5NzE6OnZpc2lvbiB7Ci1FaWdlbjo6QWZmaW5lM2QgUG9zZVV0aWxzOjpQb3NlM2RUb0FmZmluZTNkKAotICAgIGNvbnN0IGNlcmVzOjpleGFtcGxlczo6UG9zZTNkICZwb3NlM2QpIHsKLSAgRWlnZW46OkFmZmluZTNkIEhfd29ybGRfcG9zZSA9Ci0gICAgICBFaWdlbjo6VHJhbnNsYXRpb24zZChwb3NlM2QucCgwKSwgcG9zZTNkLnAoMSksIHBvc2UzZC5wKDIpKSAqIHBvc2UzZC5xOwotICByZXR1cm4gSF93b3JsZF9wb3NlOwotfQotCi1jZXJlczo6ZXhhbXBsZXM6OlBvc2UzZCBQb3NlVXRpbHM6OkFmZmluZTNkVG9Qb3NlM2QoY29uc3QgRWlnZW46OkFmZmluZTNkICZIKSB7Ci0gIHJldHVybiBjZXJlczo6ZXhhbXBsZXM6OlBvc2UzZHsucCA9IEgudHJhbnNsYXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5xID0gRWlnZW46OlF1YXRlcm5pb25kKEgucm90YXRpb24oKSl9OwotfQotCi1jZXJlczo6ZXhhbXBsZXM6OlBvc2UzZCBQb3NlVXRpbHM6OkNvbXB1dGVSZWxhdGl2ZVBvc2UoCi0gICAgY29uc3QgY2VyZXM6OmV4YW1wbGVzOjpQb3NlM2QgJnBvc2VfMSwKLSAgICBjb25zdCBjZXJlczo6ZXhhbXBsZXM6OlBvc2UzZCAmcG9zZV8yKSB7Ci0gIEVpZ2VuOjpBZmZpbmUzZCBIX3dvcmxkXzEgPSBQb3NlM2RUb0FmZmluZTNkKHBvc2VfMSk7Ci0gIEVpZ2VuOjpBZmZpbmUzZCBIX3dvcmxkXzIgPSBQb3NlM2RUb0FmZmluZTNkKHBvc2VfMik7Ci0KLSAgLy8gR2V0IHRoZSBsb2NhdGlvbiBvZiAyIGluIHRoZSAxIGZyYW1lCi0gIEVpZ2VuOjpBZmZpbmUzZCBIXzFfMiA9IEhfd29ybGRfMS5pbnZlcnNlKCkgKiBIX3dvcmxkXzI7Ci0gIHJldHVybiBBZmZpbmUzZFRvUG9zZTNkKEhfMV8yKTsKLX0KLQotY2VyZXM6OmV4YW1wbGVzOjpQb3NlM2QgUG9zZVV0aWxzOjpDb21wdXRlT2Zmc2V0UG9zZSgKLSAgICBjb25zdCBjZXJlczo6ZXhhbXBsZXM6OlBvc2UzZCAmcG9zZV8xLAotICAgIGNvbnN0IGNlcmVzOjpleGFtcGxlczo6UG9zZTNkICZwb3NlXzJfcmVsYXRpdmUpIHsKLSAgYXV0byBIX3dvcmxkXzEgPSBQb3NlM2RUb0FmZmluZTNkKHBvc2VfMSk7Ci0gIGF1dG8gSF8xXzIgPSBQb3NlM2RUb0FmZmluZTNkKHBvc2VfMl9yZWxhdGl2ZSk7Ci0gIGF1dG8gSF93b3JsZF8yID0gSF93b3JsZF8xICogSF8xXzI7Ci0KLSAgcmV0dXJuIEFmZmluZTNkVG9Qb3NlM2QoSF93b3JsZF8yKTsKLX0KLQotRWlnZW46OlF1YXRlcm5pb25kIFBvc2VVdGlsczo6RXVsZXJBbmdsZXNUb1F1YXRlcm5pb24oCi0gICAgY29uc3QgRWlnZW46OlZlY3RvcjNkICZycHkpIHsKLSAgRWlnZW46OkFuZ2xlQXhpc2Qgcm9sbF9hbmdsZShycHkueCgpLCBFaWdlbjo6VmVjdG9yM2Q6OlVuaXRYKCkpOwotICBFaWdlbjo6QW5nbGVBeGlzZCBwaXRjaF9hbmdsZShycHkueSgpLCBFaWdlbjo6VmVjdG9yM2Q6OlVuaXRZKCkpOwotICBFaWdlbjo6QW5nbGVBeGlzZCB5YXdfYW5nbGUocnB5LnooKSwgRWlnZW46OlZlY3RvcjNkOjpVbml0WigpKTsKLQotICByZXR1cm4geWF3X2FuZ2xlICogcGl0Y2hfYW5nbGUgKiByb2xsX2FuZ2xlOwotfQotCi1FaWdlbjo6VmVjdG9yM2QgUG9zZVV0aWxzOjpRdWF0ZXJuaW9uVG9FdWxlckFuZ2xlcygKLSAgICBjb25zdCBFaWdlbjo6UXVhdGVybmlvbmQgJnEpIHsKLSAgcmV0dXJuIFJvdGF0aW9uTWF0cml4VG9FdWxlckFuZ2xlcyhxLnRvUm90YXRpb25NYXRyaXgoKSk7Ci19Ci0KLUVpZ2VuOjpWZWN0b3IzZCBQb3NlVXRpbHM6OlJvdGF0aW9uTWF0cml4VG9FdWxlckFuZ2xlcygKLSAgICBjb25zdCBFaWdlbjo6TWF0cml4M2QgJlIpIHsKLSAgZG91YmxlIHJvbGwgPSBhb3M6Om1hdGg6Ok5vcm1hbGl6ZUFuZ2xlKHN0ZDo6YXRhbjIoUigyLCAxKSwgUigyLCAyKSkpOwotICBkb3VibGUgcGl0Y2ggPSBhb3M6Om1hdGg6Ok5vcm1hbGl6ZUFuZ2xlKC1zdGQ6OmFzaW4oUigyLCAwKSkpOwotICBkb3VibGUgeWF3ID0gYW9zOjptYXRoOjpOb3JtYWxpemVBbmdsZShzdGQ6OmF0YW4yKFIoMSwgMCksIFIoMCwgMCkpKTsKLQotICByZXR1cm4gRWlnZW46OlZlY3RvcjNkKHJvbGwsIHBpdGNoLCB5YXcpOwotfQotCi1mbGF0YnVmZmVyczo6T2Zmc2V0PFRhcmdldFBvc2VGYnM+IFBvc2VVdGlsczo6VGFyZ2V0UG9zZVRvRmJzKAotICAgIGNvbnN0IFRhcmdldE1hcHBlcjo6VGFyZ2V0UG9zZSAmdGFyZ2V0X3Bvc2UsCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpmYmIpIHsKLSAgY29uc3QgYXV0byBwb3NpdGlvbl9vZmZzZXQgPQotICAgICAgQ3JlYXRlUG9zaXRpb24oKmZiYiwgdGFyZ2V0X3Bvc2UucG9zZS5wKDApLCB0YXJnZXRfcG9zZS5wb3NlLnAoMSksCi0gICAgICAgICAgICAgICAgICAgICB0YXJnZXRfcG9zZS5wb3NlLnAoMikpOwotICBjb25zdCBhdXRvIG9yaWVudGF0aW9uX29mZnNldCA9Ci0gICAgICBDcmVhdGVRdWF0ZXJuaW9uKCpmYmIsIHRhcmdldF9wb3NlLnBvc2UucS53KCksIHRhcmdldF9wb3NlLnBvc2UucS54KCksCi0gICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9wb3NlLnBvc2UucS55KCksIHRhcmdldF9wb3NlLnBvc2UucS56KCkpOwotICByZXR1cm4gQ3JlYXRlVGFyZ2V0UG9zZUZicygqZmJiLCB0YXJnZXRfcG9zZS5pZCwgcG9zaXRpb25fb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmllbnRhdGlvbl9vZmZzZXQpOwotfQotCi1UYXJnZXRNYXBwZXI6OlRhcmdldFBvc2UgUG9zZVV0aWxzOjpUYXJnZXRQb3NlRnJvbUZicygKLSAgICBjb25zdCBUYXJnZXRQb3NlRmJzICZ0YXJnZXRfcG9zZV9mYnMpIHsKLSAgcmV0dXJuIHsuaWQgPSBzdGF0aWNfY2FzdDxUYXJnZXRNYXBwZXI6OlRhcmdldElkPih0YXJnZXRfcG9zZV9mYnMuaWQoKSksCi0gICAgICAgICAgLnBvc2UgPSBjZXJlczo6ZXhhbXBsZXM6OlBvc2UzZHsKLSAgICAgICAgICAgICAgRWlnZW46OlZlY3RvcjNkKHRhcmdldF9wb3NlX2Zicy5wb3NpdGlvbigpLT54KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfcG9zZV9mYnMucG9zaXRpb24oKS0+eSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X3Bvc2VfZmJzLnBvc2l0aW9uKCktPnooKSksCi0gICAgICAgICAgICAgIEVpZ2VuOjpRdWF0ZXJuaW9uZCh0YXJnZXRfcG9zZV9mYnMub3JpZW50YXRpb24oKS0+dygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X3Bvc2VfZmJzLm9yaWVudGF0aW9uKCktPngoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9wb3NlX2Zicy5vcmllbnRhdGlvbigpLT55KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfcG9zZV9mYnMub3JpZW50YXRpb24oKS0+eigpKQotICAgICAgICAgICAgICAgICAgLm5vcm1hbGl6ZWQoKX19OwotfQotCiBjZXJlczo6ZXhhbXBsZXM6OlZlY3Rvck9mQ29uc3RyYWludHMgRGF0YUFkYXB0ZXI6Ok1hdGNoVGFyZ2V0RGV0ZWN0aW9ucygKICAgICBjb25zdCBzdGQ6OnZlY3RvcjxEYXRhQWRhcHRlcjo6VGltZXN0YW1wZWREZXRlY3Rpb24+CiAgICAgICAgICZ0aW1lc3RhbXBlZF90YXJnZXRfZGV0ZWN0aW9ucywKQEAgLTI0NSw3ICsxNjMsNyBAQAogICAgICAgYW9zOjpKc29uRmlsZVRvRmxhdGJ1ZmZlcjxUYXJnZXRNYXA+KHRhcmdldF9wb3Nlc19wYXRoKTsKICAgZm9yIChjb25zdCBhdXRvICp0YXJnZXRfcG9zZV9mYnMgOiAqdGFyZ2V0X21hcC5tZXNzYWdlKCkudGFyZ2V0X3Bvc2VzKCkpIHsKICAgICBpZGVhbF90YXJnZXRfcG9zZXNfW3RhcmdldF9wb3NlX2Zicy0+aWQoKV0gPQotICAgICAgICBQb3NlVXRpbHM6OlRhcmdldFBvc2VGcm9tRmJzKCp0YXJnZXRfcG9zZV9mYnMpLnBvc2U7CisgICAgICAgIFRhcmdldFBvc2VGcm9tRmJzKCp0YXJnZXRfcG9zZV9mYnMpLnBvc2U7CiAgIH0KICAgdGFyZ2V0X3Bvc2VzXyA9IGlkZWFsX3RhcmdldF9wb3Nlc187CiAgIENvdW50Q29uc3RyYWludHMoKTsKQEAgLTI2Myw2ICsxODEsMzMgQEAKICAgQ291bnRDb25zdHJhaW50cygpOwogfQogCitmbGF0YnVmZmVyczo6T2Zmc2V0PFRhcmdldFBvc2VGYnM+IFRhcmdldE1hcHBlcjo6VGFyZ2V0UG9zZVRvRmJzKAorICAgIGNvbnN0IFRhcmdldE1hcHBlcjo6VGFyZ2V0UG9zZSAmdGFyZ2V0X3Bvc2UsCisgICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpmYmIpIHsKKyAgY29uc3QgYXV0byBwb3NpdGlvbl9vZmZzZXQgPQorICAgICAgQ3JlYXRlUG9zaXRpb24oKmZiYiwgdGFyZ2V0X3Bvc2UucG9zZS5wKDApLCB0YXJnZXRfcG9zZS5wb3NlLnAoMSksCisgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfcG9zZS5wb3NlLnAoMikpOworICBjb25zdCBhdXRvIG9yaWVudGF0aW9uX29mZnNldCA9CisgICAgICBDcmVhdGVRdWF0ZXJuaW9uKCpmYmIsIHRhcmdldF9wb3NlLnBvc2UucS53KCksIHRhcmdldF9wb3NlLnBvc2UucS54KCksCisgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9wb3NlLnBvc2UucS55KCksIHRhcmdldF9wb3NlLnBvc2UucS56KCkpOworICByZXR1cm4gQ3JlYXRlVGFyZ2V0UG9zZUZicygqZmJiLCB0YXJnZXRfcG9zZS5pZCwgcG9zaXRpb25fb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmllbnRhdGlvbl9vZmZzZXQpOworfQorCitUYXJnZXRNYXBwZXI6OlRhcmdldFBvc2UgVGFyZ2V0TWFwcGVyOjpUYXJnZXRQb3NlRnJvbUZicygKKyAgICBjb25zdCBUYXJnZXRQb3NlRmJzICZ0YXJnZXRfcG9zZV9mYnMpIHsKKyAgcmV0dXJuIHsuaWQgPSBzdGF0aWNfY2FzdDxUYXJnZXRNYXBwZXI6OlRhcmdldElkPih0YXJnZXRfcG9zZV9mYnMuaWQoKSksCisgICAgICAgICAgLnBvc2UgPSBjZXJlczo6ZXhhbXBsZXM6OlBvc2UzZHsKKyAgICAgICAgICAgICAgRWlnZW46OlZlY3RvcjNkKHRhcmdldF9wb3NlX2Zicy5wb3NpdGlvbigpLT54KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfcG9zZV9mYnMucG9zaXRpb24oKS0+eSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X3Bvc2VfZmJzLnBvc2l0aW9uKCktPnooKSksCisgICAgICAgICAgICAgIEVpZ2VuOjpRdWF0ZXJuaW9uZCh0YXJnZXRfcG9zZV9mYnMub3JpZW50YXRpb24oKS0+dygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X3Bvc2VfZmJzLm9yaWVudGF0aW9uKCktPngoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9wb3NlX2Zicy5vcmllbnRhdGlvbigpLT55KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfcG9zZV9mYnMub3JpZW50YXRpb24oKS0+eigpKQorICAgICAgICAgICAgICAgICAgLm5vcm1hbGl6ZWQoKX19OworfQorCiBuYW1lc3BhY2Ugewogc3RkOjpwYWlyPFRhcmdldE1hcHBlcjo6VGFyZ2V0SWQsIFRhcmdldE1hcHBlcjo6VGFyZ2V0SWQ+IE1ha2VJZFBhaXIoCiAgICAgY29uc3QgY2VyZXM6OmV4YW1wbGVzOjpDb25zdHJhaW50M2QgJmNvbnN0cmFpbnQpIHsKQEAgLTU4MCw3ICs1MjUsNyBAQAogICBzdGQ6OnZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PFRhcmdldFBvc2VGYnM+PiB0YXJnZXRfcG9zZXNfZmJzOwogICBmb3IgKGNvbnN0IGF1dG8gJltpZCwgcG9zZV0gOiB0YXJnZXRfcG9zZXNfKSB7CiAgICAgdGFyZ2V0X3Bvc2VzX2Zicy5lbXBsYWNlX2JhY2soCi0gICAgICAgIFBvc2VVdGlsczo6VGFyZ2V0UG9zZVRvRmJzKFRhcmdldFBvc2V7LmlkID0gaWQsIC5wb3NlID0gcG9zZX0sICZmYmIpKTsKKyAgICAgICAgVGFyZ2V0UG9zZVRvRmJzKFRhcmdldFBvc2V7LmlkID0gaWQsIC5wb3NlID0gcG9zZX0sICZmYmIpKTsKICAgfQogCiAgIGNvbnN0IGF1dG8gZmllbGRfbmFtZV9vZmZzZXQgPSBmYmIuQ3JlYXRlU3RyaW5nKGZpZWxkX25hbWUpOwpkaWZmIC0tZ2l0IGEvZnJjOTcxL3Zpc2lvbi90YXJnZXRfbWFwcGVyLmggYi9mcmM5NzEvdmlzaW9uL3RhcmdldF9tYXBwZXIuaAppbmRleCBjYWUxYzY5Li5hYTM0MDA2IDEwMDY0NAotLS0gYS9mcmM5NzEvdmlzaW9uL3RhcmdldF9tYXBwZXIuaAorKysgYi9mcmM5NzEvdmlzaW9uL3RhcmdldF9tYXBwZXIuaApAQCAtOSw4ICs5LDExIEBACiAjaW5jbHVkZSAiYW9zL2V2ZW50cy9zaW11bGF0ZWRfZXZlbnRfbG9vcC5oIgogI2luY2x1ZGUgImZyYzk3MS92aXNpb24vY2VyZXMvdHlwZXMuaCIKICNpbmNsdWRlICJmcmM5NzEvdmlzaW9uL3RhcmdldF9tYXBfZ2VuZXJhdGVkLmgiCisjaW5jbHVkZSAiZnJjOTcxL3Zpc2lvbi92aXNpb25fdXRpbF9saWIuaCIKICNpbmNsdWRlICJmcmM5NzEvdmlzaW9uL3Zpc3VhbGl6ZV9yb2JvdC5oIgogCitBQlNMX0RFQ0xBUkVfRkxBRyhkb3VibGUsIG91dGxpZXJfc3RkX2RldnMpOworCiBuYW1lc3BhY2UgZnJjOTcxOjp2aXNpb24gewogCiAvLyBFc3RpbWF0ZXMgcG9zaXRpb25zIG9mIHZpc2lvbiB0YXJnZXRzIChleC4gQXByaWwgVGFncykgdXNpbmcKQEAgLTQ2LDYgKzQ5LDE1IEBACiAgIC8vIFByaW50cyB0YXJnZXQgcG9zZXMgaW50byBhIFRhcmdldE1hcCBmbGF0YnVmZmVyIGpzb24KICAgc3RkOjpzdHJpbmcgTWFwVG9Kc29uKHN0ZDo6c3RyaW5nX3ZpZXcgZmllbGRfbmFtZSkgY29uc3Q7CiAKKyAgLy8gQnVpbGRzIGEgVGFyZ2V0UG9zZUZicyBmcm9tIGEgVGFyZ2V0UG9zZQorICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUYXJnZXRQb3NlRmJzPiBUYXJnZXRQb3NlVG9GYnMoCisgICAgICBjb25zdCBUYXJnZXRNYXBwZXI6OlRhcmdldFBvc2UgJnRhcmdldF9wb3NlLAorICAgICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpmYmIpOworCisgIC8vIENvbnZlcnRzIGEgVGFyZ2V0UG9zZUZicyB0byBhIFRhcmdldFBvc2UKKyAgc3RhdGljIFRhcmdldE1hcHBlcjo6VGFyZ2V0UG9zZSBUYXJnZXRQb3NlRnJvbUZicygKKyAgICAgIGNvbnN0IFRhcmdldFBvc2VGYnMgJnRhcmdldF9wb3NlX2Zicyk7CisKICAgc3RhdGljIHN0ZDo6b3B0aW9uYWw8VGFyZ2V0UG9zZT4gR2V0VGFyZ2V0UG9zZUJ5SWQoCiAgICAgICBzdGQ6OnZlY3RvcjxUYXJnZXRQb3NlPiB0YXJnZXRfcG9zZXMsIFRhcmdldElkIHRhcmdldF9pZCk7CiAKQEAgLTEzNCw0MyArMTQ2LDYgQEAKICAgU3RhdHMgc3RhdHNfd2l0aF9vdXRsaWVyc187CiB9OwogCi0vLyBVdGlsaXR5IGZ1bmN0aW9ucyBmb3IgZGVhbGluZyB3aXRoIGNlcmVzOjpleGFtcGxlczo6UG9zZTNkIHN0cnVjdHMKLWNsYXNzIFBvc2VVdGlscyB7Ci0gcHVibGljOgotICAvLyBFbWJlZHMgYSAzZCBwb3NlIGludG8gYW4gYWZmaW5lIHRyYW5zZm9ybWF0aW9uCi0gIHN0YXRpYyBFaWdlbjo6QWZmaW5lM2QgUG9zZTNkVG9BZmZpbmUzZCgKLSAgICAgIGNvbnN0IGNlcmVzOjpleGFtcGxlczo6UG9zZTNkICZwb3NlM2QpOwotICAvLyBJbnZlcnNlIG9mIGFib3ZlIGZ1bmN0aW9uCi0gIHN0YXRpYyBjZXJlczo6ZXhhbXBsZXM6OlBvc2UzZCBBZmZpbmUzZFRvUG9zZTNkKGNvbnN0IEVpZ2VuOjpBZmZpbmUzZCAmSCk7Ci0KLSAgLy8gQ29tcHV0ZXMgcG9zZV8yIHJlbGF0aXZlIHRvIHBvc2VfMS4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIChwb3NlXzFeLTEgKgotICAvLyBwb3NlXzIpCi0gIHN0YXRpYyBjZXJlczo6ZXhhbXBsZXM6OlBvc2UzZCBDb21wdXRlUmVsYXRpdmVQb3NlKAotICAgICAgY29uc3QgY2VyZXM6OmV4YW1wbGVzOjpQb3NlM2QgJnBvc2VfMSwKLSAgICAgIGNvbnN0IGNlcmVzOjpleGFtcGxlczo6UG9zZTNkICZwb3NlXzIpOwotCi0gIC8vIENvbXB1dGVzIHBvc2VfMiBnaXZlbiBhIHBvc2VfMSBhbmQgcG9zZV8yIHJlbGF0aXZlIHRvIHBvc2VfMS4gVGhpcyBpcwotICAvLyBlcXVpdmFsZW50IHRvIChwb3NlXzEgKiBwb3NlXzJfcmVsYXRpdmUpCi0gIHN0YXRpYyBjZXJlczo6ZXhhbXBsZXM6OlBvc2UzZCBDb21wdXRlT2Zmc2V0UG9zZSgKLSAgICAgIGNvbnN0IGNlcmVzOjpleGFtcGxlczo6UG9zZTNkICZwb3NlXzEsCi0gICAgICBjb25zdCBjZXJlczo6ZXhhbXBsZXM6OlBvc2UzZCAmcG9zZV8yX3JlbGF0aXZlKTsKLQotICAvLyBDb252ZXJ0cyBhIHJvdGF0aW9uIHdpdGggcm9sbCwgcGl0Y2gsIGFuZCB5YXcgaW50byBhIHF1YXRlcm5pb24KLSAgc3RhdGljIEVpZ2VuOjpRdWF0ZXJuaW9uZCBFdWxlckFuZ2xlc1RvUXVhdGVybmlvbihjb25zdCBFaWdlbjo6VmVjdG9yM2QgJnJweSk7Ci0gIC8vIEludmVyc2Ugb2YgYWJvdmUgZnVuY3Rpb24KLSAgc3RhdGljIEVpZ2VuOjpWZWN0b3IzZCBRdWF0ZXJuaW9uVG9FdWxlckFuZ2xlcyhjb25zdCBFaWdlbjo6UXVhdGVybmlvbmQgJnEpOwotICAvLyBDb252ZXJ0cyBhIDNkIHJvdGF0aW9uIG1hdHJpeCBpbnRvIGEgcm90YXRpb24gd2l0aCByb2xsLCBwaXRjaCwgYW5kIHlhdwotICBzdGF0aWMgRWlnZW46OlZlY3RvcjNkIFJvdGF0aW9uTWF0cml4VG9FdWxlckFuZ2xlcyhjb25zdCBFaWdlbjo6TWF0cml4M2QgJlIpOwotCi0gIC8vIEJ1aWxkcyBhIFRhcmdldFBvc2VGYnMgZnJvbSBhIFRhcmdldFBvc2UKLSAgc3RhdGljIGZsYXRidWZmZXJzOjpPZmZzZXQ8VGFyZ2V0UG9zZUZicz4gVGFyZ2V0UG9zZVRvRmJzKAotICAgICAgY29uc3QgVGFyZ2V0TWFwcGVyOjpUYXJnZXRQb3NlICZ0YXJnZXRfcG9zZSwKLSAgICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqZmJiKTsKLSAgLy8gQ29udmVydHMgYSBUYXJnZXRQb3NlRmJzIHRvIGEgVGFyZ2V0UG9zZQotICBzdGF0aWMgVGFyZ2V0TWFwcGVyOjpUYXJnZXRQb3NlIFRhcmdldFBvc2VGcm9tRmJzKAotICAgICAgY29uc3QgVGFyZ2V0UG9zZUZicyAmdGFyZ2V0X3Bvc2VfZmJzKTsKLX07Ci0KIC8vIFRyYW5zZm9ybXMgcm9ib3QgcG9zaXRpb24gYW5kIHRhcmdldCBkZXRlY3Rpb24gZGF0YSBpbnRvIHRhcmdldCBjb25zdHJhaW50cwogLy8gdG8gYmUgdXNlZCBmb3IgbWFwcGluZy4KIGNsYXNzIERhdGFBZGFwdGVyIHsKZGlmZiAtLWdpdCBhL2ZyYzk3MS92aXNpb24vdGFyZ2V0X21hcHBlcl90ZXN0LmNjIGIvZnJjOTcxL3Zpc2lvbi90YXJnZXRfbWFwcGVyX3Rlc3QuY2MKaW5kZXggNGU5ZGI2Zi4uNjJmOTY5YyAxMDA2NDQKLS0tIGEvZnJjOTcxL3Zpc2lvbi90YXJnZXRfbWFwcGVyX3Rlc3QuY2MKKysrIGIvZnJjOTcxL3Zpc2lvbi90YXJnZXRfbWFwcGVyX3Rlc3QuY2MKQEAgLTEyLDExICsxMiwxMyBAQAogI2luY2x1ZGUgImFvcy90ZXN0aW5nL3BhdGguaCIKICNpbmNsdWRlICJhb3MvdGVzdGluZy9yYW5kb21fc2VlZC5oIgogI2luY2x1ZGUgImFvcy91dGlsL21hdGguaCIKKyNpbmNsdWRlICJ2aXNpb25fdXRpbF9saWIuaCIKIAogQUJTTF9ERUNMQVJFX0ZMQUcoaW50MzJfdCwgbWluX3RhcmdldF9pZCk7CiBBQlNMX0RFQ0xBUkVfRkxBRyhpbnQzMl90LCBtYXhfdGFyZ2V0X2lkKTsKIAogbmFtZXNwYWNlIGZyYzk3MTo6dmlzaW9uIHsKK3VzaW5nIGZyYzk3MTo6dmlzaW9uOjpQb3NlVXRpbHM7CiAKIG5hbWVzcGFjZSB7CiBjb25zdGV4cHIgZG91YmxlIGtUb2xlcmFuY2VNZXRlcnMgPSAwLjA1OwpAQCAtMTUxLDQ0ICsxNTMsNiBAQAogCiB9ICAvLyBuYW1lc3BhY2UKIAotVEVTVChQb3NlVXRpbHNUZXN0LCBFdWxlckFuZ2xlc0FuZFF1YXRlcm5pb25Db252ZXJzaW9ucykgewotICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgY29udmVyc2lvbnMgYXJlIGNvbnNpc3RlbnQgYmFjayBhbmQgZm9ydGguCi0gIC8vIFRoZXNlIGFuZ2xlcyBzaG91bGRuJ3QgZ2V0IGNoYW5nZWQgdG8gYSBkaWZmZXJlbnQsIGVxdWl2YWxlbnQgcm9sbCBwaXRjaAotICAvLyB5YXcuCi0gIEVYUEVDVF9FVUxFUl9BTkdMRVNfUVVBVEVSTklPTl9CQUNLX0FORF9GT1JUSF9FUSgwLjAsIDAuMCwgTV9QSSk7Ci0gIEVYUEVDVF9FVUxFUl9BTkdMRVNfUVVBVEVSTklPTl9CQUNLX0FORF9GT1JUSF9FUSgwLjAsIDAuMCwgLU1fUEkpOwotICBFWFBFQ1RfRVVMRVJfQU5HTEVTX1FVQVRFUk5JT05fQkFDS19BTkRfRk9SVEhfRVEoMC4wLCAwLjAsIE1fUElfMik7Ci0gIEVYUEVDVF9FVUxFUl9BTkdMRVNfUVVBVEVSTklPTl9CQUNLX0FORF9GT1JUSF9FUSgwLjAsIDAuMCwgLU1fUElfMik7Ci0gIEVYUEVDVF9FVUxFUl9BTkdMRVNfUVVBVEVSTklPTl9CQUNLX0FORF9GT1JUSF9FUSgwLjAsIDAuMCwgMC4wKTsKLSAgRVhQRUNUX0VVTEVSX0FOR0xFU19RVUFURVJOSU9OX0JBQ0tfQU5EX0ZPUlRIX0VRKDAuMCwgTV9QSV80LCAwLjApOwotICBFWFBFQ1RfRVVMRVJfQU5HTEVTX1FVQVRFUk5JT05fQkFDS19BTkRfRk9SVEhfRVEoMC4wLCAtTV9QSV80LCAwLjApOwotICBFWFBFQ1RfRVVMRVJfQU5HTEVTX1FVQVRFUk5JT05fQkFDS19BTkRfRk9SVEhfRVEoMC4wLCAtTV9QSV80LCBNX1BJXzQpOwotICBFWFBFQ1RfRVVMRVJfQU5HTEVTX1FVQVRFUk5JT05fQkFDS19BTkRfRk9SVEhfRVEoTV9QSV80LCAtTV9QSV80LCBNX1BJXzQpOwotICBFWFBFQ1RfRVVMRVJfQU5HTEVTX1FVQVRFUk5JT05fQkFDS19BTkRfRk9SVEhfRVEoLU1fUElfMiwgLU1fUElfNCwgTV9QSV80KTsKLQotICAvLyBOb3csIGRvIGEgc3dlZXAgb2Ygcm9sbCwgcGl0Y2gsIGFuZCB5YXdzIGluIHRoZSBub3JtYWxpemVkCi0gIC8vIHJhbmdlLgotICAvLyAtIHJvbGw6ICgtcGkvMiwgcGkvMikKLSAgLy8gLSBwaXRjaDogKC1waS8yLCBwaS8yKQotICAvLyAtIHlhdzogWy1waSwgcGkpCi0gIGNvbnN0ZXhwciBkb3VibGUga1RoZXRhTWF4Um9sbCA9IE1fUElfMiAtIGtUb2xlcmFuY2VSYWRpYW5zOwotICBjb25zdGV4cHIgZG91YmxlIGtUaGV0YU1heFBpdGNoID0gTV9QSV8yIC0ga1RvbGVyYW5jZVJhZGlhbnM7Ci0gIGNvbnN0ZXhwciBkb3VibGUga1RoZXRhTWF4WWF3ID0gTV9QSTsKLSAgY29uc3RleHByIGRvdWJsZSBrRGVsdGFUaGV0YSA9IE1fUEkgLyAxNjsKLQotICBmb3IgKGRvdWJsZSByb2xsID0gLWtUaGV0YU1heFJvbGw7IHJvbGwgPCBrVGhldGFNYXhSb2xsOwotICAgICAgIHJvbGwgKz0ga0RlbHRhVGhldGEpIHsKLSAgICBmb3IgKGRvdWJsZSBwaXRjaCA9IC1rVGhldGFNYXhQaXRjaDsgcGl0Y2ggPCBrVGhldGFNYXhQaXRjaDsKLSAgICAgICAgIHBpdGNoICs9IGtEZWx0YVRoZXRhKSB7Ci0gICAgICBmb3IgKGRvdWJsZSB5YXcgPSAta1RoZXRhTWF4WWF3OyB5YXcgPCBrVGhldGFNYXhZYXc7IHlhdyArPSBrRGVsdGFUaGV0YSkgewotICAgICAgICBTQ09QRURfVFJBQ0UoCi0gICAgICAgICAgICBhYnNsOjpTdHJGb3JtYXQoInJvbGw6ICVmLCBwaXRjaDogJWYsIHlhdzogJWYiLCByb2xsLCBwaXRjaCwgeWF3KSk7Ci0gICAgICAgIEVYUEVDVF9FVUxFUl9BTkdMRVNfUVVBVEVSTklPTl9CQUNLX0FORF9GT1JUSF9FUShyb2xsLCBwaXRjaCwgeWF3KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQogVEVTVChEYXRhQWRhcHRlclRlc3QsIENvbXB1dGVDb25maWRlbmNlKSB7CiAgIC8vIENoZWNrIHRoZSBjb25maWRlbmNlIG1hdHJpY2VzLiBEb24ndCBjaGVjayB0aGUgYWN0dWFsIHZhbHVlcwogICAvLyBpbiBjYXNlIHRoZSBjb25zdGFudHMgY2hhbmdlLCBqdXN0IGNoZWNrIHRoYXQgdGhlIGNvbmZpZGVuY2Ugb2YgY29udHJhaW50cwpAQCAtNTAwLDcgKzQ2NCw3IEBACiAgIGNlcmVzOjpleGFtcGxlczo6TWFwT2ZQb3NlcyB0YXJnZXRfcG9zZXM7CiAgIGZvciAoY29uc3QgYXV0byAqdGFyZ2V0X3Bvc2VfZmJzIDogKnRhcmdldF9tYXBfZmJzLm1lc3NhZ2UoKS50YXJnZXRfcG9zZXMoKSkgewogICAgIGNvbnN0IFRhcmdldE1hcHBlcjo6VGFyZ2V0UG9zZSB0YXJnZXRfcG9zZSA9Ci0gICAgICAgIFBvc2VVdGlsczo6VGFyZ2V0UG9zZUZyb21GYnMoKnRhcmdldF9wb3NlX2Zicyk7CisgICAgICAgIFRhcmdldE1hcHBlcjo6VGFyZ2V0UG9zZUZyb21GYnMoKnRhcmdldF9wb3NlX2Zicyk7CiAgICAgYWN0dWFsX3RhcmdldF9wb3Nlcy5lbXBsYWNlX2JhY2sodGFyZ2V0X3Bvc2UpOwogICAgIHRhcmdldF9wb3Nlc1t0YXJnZXRfcG9zZS5pZF0gPSB0YXJnZXRfcG9zZS5wb3NlOwogICB9CmRpZmYgLS1naXQgYS9mcmM5NzEvdmlzaW9uL3Zpc2lvbl91dGlsX2xpYi5jYyBiL2ZyYzk3MS92aXNpb24vdmlzaW9uX3V0aWxfbGliLmNjCmluZGV4IDA4OWYzYWMuLjk0NGZhNzYgMTAwNjQ0Ci0tLSBhL2ZyYzk3MS92aXNpb24vdmlzaW9uX3V0aWxfbGliLmNjCisrKyBiL2ZyYzk3MS92aXNpb24vdmlzaW9uX3V0aWxfbGliLmNjCkBAIC0xLDkgKzEsMTQgQEAKICNpbmNsdWRlICJmcmM5NzEvdmlzaW9uL3Zpc2lvbl91dGlsX2xpYi5oIgogCisjaW5jbHVkZSA8bnVtZXJpYz4KKwogI2luY2x1ZGUgImFic2wvbG9nL2NoZWNrLmgiCiAjaW5jbHVkZSAiYWJzbC9sb2cvbG9nLmgiCiAjaW5jbHVkZSAiYWJzbC9zdHJpbmdzL3N0cl9mb3JtYXQuaCIKIAorI2luY2x1ZGUgImFvcy91dGlsL21hdGguaCIKKyNpbmNsdWRlICJmcmM5NzEvY29udHJvbF9sb29wcy9xdWF0ZXJuaW9uX3V0aWxzLmgiCisKIG5hbWVzcGFjZSBmcmM5NzE6OnZpc2lvbiB7CiAKIHN0ZDo6b3B0aW9uYWw8Y3Y6Ok1hdD4gQ2FtZXJhRXh0cmluc2ljcygKQEAgLTc1LDQgKzgwLDE0NyBAQAogICByZXR1cm4gY2FsaWJyYXRpb25fZmlsZW5hbWU7CiB9CiAKK0VpZ2VuOjpBZmZpbmUzZCBQb3NlVXRpbHM6OlBvc2UzZFRvQWZmaW5lM2QoCisgICAgY29uc3QgY2VyZXM6OmV4YW1wbGVzOjpQb3NlM2QgJnBvc2UzZCkgeworICBFaWdlbjo6QWZmaW5lM2QgSF93b3JsZF9wb3NlID0KKyAgICAgIEVpZ2VuOjpUcmFuc2xhdGlvbjNkKHBvc2UzZC5wKDApLCBwb3NlM2QucCgxKSwgcG9zZTNkLnAoMikpICogcG9zZTNkLnE7CisgIHJldHVybiBIX3dvcmxkX3Bvc2U7Cit9CisKK2NlcmVzOjpleGFtcGxlczo6UG9zZTNkIFBvc2VVdGlsczo6QWZmaW5lM2RUb1Bvc2UzZChjb25zdCBFaWdlbjo6QWZmaW5lM2QgJkgpIHsKKyAgcmV0dXJuIGNlcmVzOjpleGFtcGxlczo6UG9zZTNkey5wID0gSC50cmFuc2xhdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnEgPSBFaWdlbjo6UXVhdGVybmlvbmQoSC5yb3RhdGlvbigpKX07Cit9CisKK2NlcmVzOjpleGFtcGxlczo6UG9zZTNkIFBvc2VVdGlsczo6Q29tcHV0ZVJlbGF0aXZlUG9zZSgKKyAgICBjb25zdCBjZXJlczo6ZXhhbXBsZXM6OlBvc2UzZCAmcG9zZV8xLAorICAgIGNvbnN0IGNlcmVzOjpleGFtcGxlczo6UG9zZTNkICZwb3NlXzIpIHsKKyAgRWlnZW46OkFmZmluZTNkIEhfd29ybGRfMSA9IFBvc2UzZFRvQWZmaW5lM2QocG9zZV8xKTsKKyAgRWlnZW46OkFmZmluZTNkIEhfd29ybGRfMiA9IFBvc2UzZFRvQWZmaW5lM2QocG9zZV8yKTsKKworICAvLyBHZXQgdGhlIGxvY2F0aW9uIG9mIDIgaW4gdGhlIDEgZnJhbWUKKyAgRWlnZW46OkFmZmluZTNkIEhfMV8yID0gSF93b3JsZF8xLmludmVyc2UoKSAqIEhfd29ybGRfMjsKKyAgcmV0dXJuIEFmZmluZTNkVG9Qb3NlM2QoSF8xXzIpOworfQorCitjZXJlczo6ZXhhbXBsZXM6OlBvc2UzZCBQb3NlVXRpbHM6OkNvbXB1dGVPZmZzZXRQb3NlKAorICAgIGNvbnN0IGNlcmVzOjpleGFtcGxlczo6UG9zZTNkICZwb3NlXzEsCisgICAgY29uc3QgY2VyZXM6OmV4YW1wbGVzOjpQb3NlM2QgJnBvc2VfMl9yZWxhdGl2ZSkgeworICBhdXRvIEhfd29ybGRfMSA9IFBvc2UzZFRvQWZmaW5lM2QocG9zZV8xKTsKKyAgYXV0byBIXzFfMiA9IFBvc2UzZFRvQWZmaW5lM2QocG9zZV8yX3JlbGF0aXZlKTsKKyAgYXV0byBIX3dvcmxkXzIgPSBIX3dvcmxkXzEgKiBIXzFfMjsKKworICByZXR1cm4gQWZmaW5lM2RUb1Bvc2UzZChIX3dvcmxkXzIpOworfQorCitFaWdlbjo6UXVhdGVybmlvbmQgUG9zZVV0aWxzOjpFdWxlckFuZ2xlc1RvUXVhdGVybmlvbigKKyAgICBjb25zdCBFaWdlbjo6VmVjdG9yM2QgJnJweSkgeworICBFaWdlbjo6QW5nbGVBeGlzZCByb2xsX2FuZ2xlKHJweS54KCksIEVpZ2VuOjpWZWN0b3IzZDo6VW5pdFgoKSk7CisgIEVpZ2VuOjpBbmdsZUF4aXNkIHBpdGNoX2FuZ2xlKHJweS55KCksIEVpZ2VuOjpWZWN0b3IzZDo6VW5pdFkoKSk7CisgIEVpZ2VuOjpBbmdsZUF4aXNkIHlhd19hbmdsZShycHkueigpLCBFaWdlbjo6VmVjdG9yM2Q6OlVuaXRaKCkpOworCisgIHJldHVybiB5YXdfYW5nbGUgKiBwaXRjaF9hbmdsZSAqIHJvbGxfYW5nbGU7Cit9CisKK0VpZ2VuOjpWZWN0b3IzZCBQb3NlVXRpbHM6OlF1YXRlcm5pb25Ub0V1bGVyQW5nbGVzKAorICAgIGNvbnN0IEVpZ2VuOjpRdWF0ZXJuaW9uZCAmcSkgeworICByZXR1cm4gUm90YXRpb25NYXRyaXhUb0V1bGVyQW5nbGVzKHEudG9Sb3RhdGlvbk1hdHJpeCgpKTsKK30KKworRWlnZW46OlZlY3RvcjNkIFBvc2VVdGlsczo6Um90YXRpb25NYXRyaXhUb0V1bGVyQW5nbGVzKAorICAgIGNvbnN0IEVpZ2VuOjpNYXRyaXgzZCAmUikgeworICBkb3VibGUgcm9sbCA9IGFvczo6bWF0aDo6Tm9ybWFsaXplQW5nbGUoc3RkOjphdGFuMihSKDIsIDEpLCBSKDIsIDIpKSk7CisgIGRvdWJsZSBwaXRjaCA9IGFvczo6bWF0aDo6Tm9ybWFsaXplQW5nbGUoLXN0ZDo6YXNpbihSKDIsIDApKSk7CisgIGRvdWJsZSB5YXcgPSBhb3M6Om1hdGg6Ok5vcm1hbGl6ZUFuZ2xlKHN0ZDo6YXRhbjIoUigxLCAwKSwgUigwLCAwKSkpOworCisgIHJldHVybiBFaWdlbjo6VmVjdG9yM2Qocm9sbCwgcGl0Y2gsIHlhdyk7Cit9CisKKy8vIENvbXB1dGUgdGhlIGF2ZXJhZ2UgcG9zZSBnaXZlbiBhIGxpc3Qgb2YgdHJhbnNsYXRpb25zIChhcworLy8gRWlnZW46OlZlY3RvcjNkJ3MpIGFuZCByb3RhdGlvbnMgKGFzIEVpZ2VuOjpWZWN0b3I0ZCBxdWF0ZXJuaW9ucykKKy8vIFJldHVybmVkIGFzIGFuIEVpZ2VuOjpBZmZpbmUzZCBwb3NlCisvLyBBbHNvLCBjb21wdXRlIHRoZSB2YXJpYW5jZSBvZiBlYWNoIG9mIHRoZXNlIGxpc3Qgb2YgdmVjdG9ycworCisvLyBOT1RFOiB2YXJpYW5jZSBmb3Igcm90YXRpb25zIGNhbiBnZXQgZGljZXksIHNvIHdlJ3ZlIGNoZWF0ZWQgYQorLy8gbGl0dGxlIGJ5IGRvaW5nIHR3byB0aGluZ3M6CisvLyAxKSBDb21wdXRpbmcgdmFyaWFuY2UgcmVsYXRpdmUgdG8gdGhlIG1lYW4sIHNvIHRoYXQgd2UncmUgZG9pbmcKKy8vIHRoaXMgb24gc21hbGwgYW5nbGVzIGFuZCBkb24ndCBoYXZlIHRvIGRlYWwgd2l0aCB3cmFwcGluZyBhdAorLy8gMTgwLzM2MCBkZWdyZWVzCisvLyAyKSBSZXR1cm5pbmcgdGhlIHZhcmlhbmNlIGluIEV1bGVyIGFuZ2xlcywgc2luY2UgSSdtIG5vdCBzdXJlIG9mIGEKKy8vIGJldHRlciB3YXkgdG8gcmVwcmVzZW50IHZhcmlhbmNlIGZvciByb3RhdGlvbnMuICAoTWF5YmUgbG9nIG9mCisvLyByb3RhdGlvbnMsIGluIHRoZSBMaWUgYWxnZWJyYT8pCisKK0VpZ2VuOjpBZmZpbmUzZCBDb21wdXRlQXZlcmFnZVBvc2UoCisgICAgc3RkOjp2ZWN0b3I8RWlnZW46OlZlY3RvcjNkPiAmdHJhbnNsYXRpb25fbGlzdCwKKyAgICBzdGQ6OnZlY3RvcjxFaWdlbjo6VmVjdG9yNGQ+ICZyb3RhdGlvbl9saXN0LAorICAgIEVpZ2VuOjpWZWN0b3IzZCAqdHJhbnNsYXRpb25fdmFyaWFuY2UsIEVpZ2VuOjpWZWN0b3IzZCAqcm90YXRpb25fdmFyaWFuY2UpIHsKKyAgRWlnZW46OlZlY3RvcjNkIGF2Z190cmFuc2xhdGlvbiA9CisgICAgICBzdGQ6OmFjY3VtdWxhdGUodHJhbnNsYXRpb25fbGlzdC5iZWdpbigpLCB0cmFuc2xhdGlvbl9saXN0LmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgIEVpZ2VuOjpWZWN0b3IzZHswLCAwLCAwfSkgLworICAgICAgdHJhbnNsYXRpb25fbGlzdC5zaXplKCk7CisKKyAgRWlnZW46OlF1YXRlcm5pb25kIGF2Z19yb3RhdGlvbl9xKAorICAgICAgZnJjOTcxOjpjb250cm9sczo6UXVhdGVybmlvbk1lYW4ocm90YXRpb25fbGlzdCkpOworICBFaWdlbjo6QWZmaW5lM2QgYXZlcmFnZV9wb3NlID0KKyAgICAgIEVpZ2VuOjpUcmFuc2xhdGlvbjNkKGF2Z190cmFuc2xhdGlvbikgKiBhdmdfcm90YXRpb25fcTsKKworICBDSEVDS19FUSh0cmFuc2xhdGlvbl9saXN0LnNpemUoKSwgcm90YXRpb25fbGlzdC5zaXplKCkpOworICBpZiAodHJhbnNsYXRpb25fdmFyaWFuY2UgIT0gbnVsbHB0cikgeworICAgIENIRUNLKHJvdGF0aW9uX3ZhcmlhbmNlICE9IG51bGxwdHIpOworICAgIEVpZ2VuOjpWZWN0b3IzZCB0cmFuc2xhdGlvbl92YXJpYW5jZV9zdW0oMC4wLCAwLjAsIDAuMCk7CisgICAgRWlnZW46OlZlY3RvcjNkIHJvdGF0aW9uX3ZhcmlhbmNlX3N1bSgwLjAsIDAuMCwgMC4wKTsKKyAgICBmb3IgKHVpbnQgaSA9IDA7IGkgPCB0cmFuc2xhdGlvbl9saXN0LnNpemUoKTsgaSsrKSB7CisgICAgICBFaWdlbjo6UXVhdGVybmlvbmQgcm90YXRpb25fcShyb3RhdGlvbl9saXN0W2ldKTsKKyAgICAgIEVpZ2VuOjpBZmZpbmUzZCBwb3NlID0KKyAgICAgICAgICBFaWdlbjo6VHJhbnNsYXRpb24zZCh0cmFuc2xhdGlvbl9saXN0W2ldKSAqIHJvdGF0aW9uX3E7CisgICAgICBFaWdlbjo6QWZmaW5lM2QgZGVsdGFfcG9zZSA9IGF2ZXJhZ2VfcG9zZSAqIHBvc2UuaW52ZXJzZSgpOworICAgICAgdHJhbnNsYXRpb25fdmFyaWFuY2Vfc3VtID0KKyAgICAgICAgICB0cmFuc2xhdGlvbl92YXJpYW5jZV9zdW0gKworICAgICAgICAgIEVpZ2VuOjpWZWN0b3IzZChkZWx0YV9wb3NlLnRyYW5zbGF0aW9uKCkuYXJyYXkoKS5zcXVhcmUoKSk7CisgICAgICByb3RhdGlvbl92YXJpYW5jZV9zdW0gPQorICAgICAgICAgIHJvdGF0aW9uX3ZhcmlhbmNlX3N1bSArCisgICAgICAgICAgRWlnZW46OlZlY3RvcjNkKFBvc2VVdGlsczo6Um90YXRpb25NYXRyaXhUb0V1bGVyQW5nbGVzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGFfcG9zZS5yb3RhdGlvbigpLm1hdHJpeCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFycmF5KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zcXVhcmUoKSk7CisgICAgfQorICAgIC8vIENvbXB1dGUgdGhlIHZhcmlhbmNlIG9uIHRoZSB0cmFuc2xhdGlvbnMgKGluIG0pCisgICAgaWYgKHRyYW5zbGF0aW9uX3ZhcmlhbmNlICE9IG51bGxwdHIpIHsKKyAgICAgIENIRUNLKHRyYW5zbGF0aW9uX2xpc3Quc2l6ZSgpID4gMSkKKyAgICAgICAgICA8PCAiSGF2ZSB0byBoYXZlIGF0IGxlYXN0IHR3byB0cmFuc2xhdGlvbnMgdG8gY29tcHV0ZSB2YXJpYW5jZSI7CisgICAgICAqdHJhbnNsYXRpb25fdmFyaWFuY2UgPQorICAgICAgICAgIHRyYW5zbGF0aW9uX3ZhcmlhbmNlX3N1bSAvIHRyYW5zbGF0aW9uX2xpc3Quc2l6ZSgpOworICAgIH0KKworICAgIC8vIENvbXB1dGUgdGhlIHZhcmlhbmNlIG9uIHRoZSByb3RhdGlvbnMgKGluIGV1bGVyIGFuZ2xlcywgcmFkaWFucyksCisgICAgLy8gcmVmZXJlbmNlZCB0byB0aGUgbWVhbiwgdG8gcmVtb3ZlIGlzc3VlcyB3aXRoIEV1bGVyIGFuZ2xlcyBieQorICAgIC8vIGtlZXBpbmcgdGhlbSBuZWFyIHplcm8KKyAgICBpZiAocm90YXRpb25fdmFyaWFuY2UgIT0gbnVsbHB0cikgeworICAgICAgQ0hFQ0socm90YXRpb25fbGlzdC5zaXplKCkgPiAxKQorICAgICAgICAgIDw8ICJIYXZlIHRvIGhhdmUgYXQgbGVhc3QgdHdvIHJvdGF0aW9ucyB0byBjb21wdXRlIHZhcmlhbmNlIjsKKyAgICAgICpyb3RhdGlvbl92YXJpYW5jZSA9IHJvdGF0aW9uX3ZhcmlhbmNlX3N1bSAvIHJvdGF0aW9uX2xpc3Quc2l6ZSgpOworICAgIH0KKyAgfQorICByZXR1cm4gYXZlcmFnZV9wb3NlOworfQorCisvLyBIZWxwZXIgZnVuY3Rpb24gdG8gY29tcHV0ZSBhdmVyYWdlIHBvc2Ugd2hlbiBzdXBwbGllZCB3aXRoIGxpc3QKKy8vIG9mIEVpZ2VuOjpBZmZpbmUzZCdzCitFaWdlbjo6QWZmaW5lM2QgQ29tcHV0ZUF2ZXJhZ2VQb3NlKHN0ZDo6dmVjdG9yPEVpZ2VuOjpBZmZpbmUzZD4gJnBvc2VfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWlnZW46OlZlY3RvcjNkICp0cmFuc2xhdGlvbl92YXJpYW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWlnZW46OlZlY3RvcjNkICpyb3RhdGlvbl92YXJpYW5jZSkgeworICBzdGQ6OnZlY3RvcjxFaWdlbjo6VmVjdG9yM2Q+IHRyYW5zbGF0aW9uX2xpc3Q7CisgIHN0ZDo6dmVjdG9yPEVpZ2VuOjpWZWN0b3I0ZD4gcm90YXRpb25fbGlzdDsKKworICBmb3IgKEVpZ2VuOjpBZmZpbmUzZCBwb3NlIDogcG9zZV9saXN0KSB7CisgICAgdHJhbnNsYXRpb25fbGlzdC5wdXNoX2JhY2socG9zZS50cmFuc2xhdGlvbigpKTsKKyAgICBFaWdlbjo6UXVhdGVybmlvbmQgcXVhdChwb3NlLnJvdGF0aW9uKCkubWF0cml4KCkpOworICAgIHJvdGF0aW9uX2xpc3QucHVzaF9iYWNrKAorICAgICAgICBFaWdlbjo6VmVjdG9yNGQocXVhdC54KCksIHF1YXQueSgpLCBxdWF0LnooKSwgcXVhdC53KCkpKTsKKyAgfQorCisgIHJldHVybiBDb21wdXRlQXZlcmFnZVBvc2UodHJhbnNsYXRpb25fbGlzdCwgcm90YXRpb25fbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGlvbl92YXJpYW5jZSwgcm90YXRpb25fdmFyaWFuY2UpOworfQorCiB9ICAvLyBuYW1lc3BhY2UgZnJjOTcxOjp2aXNpb24KZGlmZiAtLWdpdCBhL2ZyYzk3MS92aXNpb24vdmlzaW9uX3V0aWxfbGliLmggYi9mcmM5NzEvdmlzaW9uL3Zpc2lvbl91dGlsX2xpYi5oCmluZGV4IGEyNmFmM2IuLmVlNjIxZGQgMTAwNjQ0Ci0tLSBhL2ZyYzk3MS92aXNpb24vdmlzaW9uX3V0aWxfbGliLmgKKysrIGIvZnJjOTcxL3Zpc2lvbi92aXNpb25fdXRpbF9saWIuaApAQCAtMyw5ICszLDEzIEBACiAjaW5jbHVkZSA8b3B0aW9uYWw+CiAjaW5jbHVkZSA8c3RyaW5nX3ZpZXc+CiAKKyNpbmNsdWRlICJFaWdlbi9EZW5zZSIKKyNpbmNsdWRlICJFaWdlbi9HZW9tZXRyeSIKKyNpbmNsdWRlICJFaWdlbi9TVkQiCiAjaW5jbHVkZSAib3BlbmN2Mi9pbWdwcm9jLmhwcCIKIAogI2luY2x1ZGUgImZyYzk3MS92aXNpb24vY2FsaWJyYXRpb25fZ2VuZXJhdGVkLmgiCisjaW5jbHVkZSAiZnJjOTcxL3Zpc2lvbi9jZXJlcy90eXBlcy5oIgogCiAvLyBFeHRyYWN0IHRoZSBDYW1lcmFFeHRyaW5zaWNzIGZyb20gYSBDYW1lcmFDYWxpYnJhdGlvbiBzdHJ1Y3QKIG5hbWVzcGFjZSBmcmM5NzE6OnZpc2lvbiB7CkBAIC0zMSw2ICszNSw1NSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2FtZXJhX251bWJlciwgc3RkOjpzdHJpbmcgY2FtZXJhX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB0aW1lc3RhbXApOwogCisvLyBVdGlsaXR5IGZ1bmN0aW9ucyBmb3IgZGVhbGluZyB3aXRoIGNlcmVzOjpleGFtcGxlczo6UG9zZTNkIHN0cnVjdHMKK2NsYXNzIFBvc2VVdGlscyB7CisgcHVibGljOgorICAvLyBFbWJlZHMgYSAzZCBwb3NlIGludG8gYW4gYWZmaW5lIHRyYW5zZm9ybWF0aW9uCisgIHN0YXRpYyBFaWdlbjo6QWZmaW5lM2QgUG9zZTNkVG9BZmZpbmUzZCgKKyAgICAgIGNvbnN0IGNlcmVzOjpleGFtcGxlczo6UG9zZTNkICZwb3NlM2QpOworICAvLyBJbnZlcnNlIG9mIGFib3ZlIGZ1bmN0aW9uCisgIHN0YXRpYyBjZXJlczo6ZXhhbXBsZXM6OlBvc2UzZCBBZmZpbmUzZFRvUG9zZTNkKGNvbnN0IEVpZ2VuOjpBZmZpbmUzZCAmSCk7CisKKyAgLy8gQ29tcHV0ZXMgcG9zZV8yIHJlbGF0aXZlIHRvIHBvc2VfMS4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIChwb3NlXzFeLTEgKgorICAvLyBwb3NlXzIpCisgIHN0YXRpYyBjZXJlczo6ZXhhbXBsZXM6OlBvc2UzZCBDb21wdXRlUmVsYXRpdmVQb3NlKAorICAgICAgY29uc3QgY2VyZXM6OmV4YW1wbGVzOjpQb3NlM2QgJnBvc2VfMSwKKyAgICAgIGNvbnN0IGNlcmVzOjpleGFtcGxlczo6UG9zZTNkICZwb3NlXzIpOworCisgIC8vIENvbXB1dGVzIHBvc2VfMiBnaXZlbiBhIHBvc2VfMSBhbmQgcG9zZV8yIHJlbGF0aXZlIHRvIHBvc2VfMS4gVGhpcyBpcworICAvLyBlcXVpdmFsZW50IHRvIChwb3NlXzEgKiBwb3NlXzJfcmVsYXRpdmUpCisgIHN0YXRpYyBjZXJlczo6ZXhhbXBsZXM6OlBvc2UzZCBDb21wdXRlT2Zmc2V0UG9zZSgKKyAgICAgIGNvbnN0IGNlcmVzOjpleGFtcGxlczo6UG9zZTNkICZwb3NlXzEsCisgICAgICBjb25zdCBjZXJlczo6ZXhhbXBsZXM6OlBvc2UzZCAmcG9zZV8yX3JlbGF0aXZlKTsKKworICAvLyBDb252ZXJ0cyBhIHJvdGF0aW9uIHdpdGggcm9sbCwgcGl0Y2gsIGFuZCB5YXcgaW50byBhIHF1YXRlcm5pb24KKyAgc3RhdGljIEVpZ2VuOjpRdWF0ZXJuaW9uZCBFdWxlckFuZ2xlc1RvUXVhdGVybmlvbihjb25zdCBFaWdlbjo6VmVjdG9yM2QgJnJweSk7CisgIC8vIEludmVyc2Ugb2YgYWJvdmUgZnVuY3Rpb24KKyAgc3RhdGljIEVpZ2VuOjpWZWN0b3IzZCBRdWF0ZXJuaW9uVG9FdWxlckFuZ2xlcyhjb25zdCBFaWdlbjo6UXVhdGVybmlvbmQgJnEpOworICAvLyBDb252ZXJ0cyBhIDNkIHJvdGF0aW9uIG1hdHJpeCBpbnRvIGEgcm90YXRpb24gd2l0aCByb2xsLCBwaXRjaCwgYW5kIHlhdworICBzdGF0aWMgRWlnZW46OlZlY3RvcjNkIFJvdGF0aW9uTWF0cml4VG9FdWxlckFuZ2xlcyhjb25zdCBFaWdlbjo6TWF0cml4M2QgJlIpOworfTsKKworLy8gQ29tcHV0ZSB0aGUgYXZlcmFnZSBvZiBhIHNldCBvZiBxdWF0ZXJuaW9ucworRWlnZW46OlZlY3RvcjRkIFF1YXRlcm5pb25BdmVyYWdlKHN0ZDo6dmVjdG9yPEVpZ2VuOjpWZWN0b3I0ZD4gcXVhdGVybmlvbnMpOworCisvLyBDb21wdXRlIHRoZSBhdmVyYWdlIHBvc2UgZ2l2ZW4gYSBsaXN0IG9mIHRyYW5zbGF0aW9ucyAoYXMKKy8vIEVpZ2VuOjpWZWN0b3IzZCdzKSBhbmQgcm90YXRpb25zIChhcyBFaWdlbjo6VmVjdG9yNGQgcXVhdGVybmlvbnMpCisvLyBSZXR1cm5lZCBhcyBhbiBFaWdlbjo6QWZmaW5lM2QgcG9zZQorLy8gQWxzbywgY29tcHV0ZSB0aGUgdmFyaWFuY2Ugb2YgZWFjaCBvZiB0aGVzZSBsaXN0IG9mIHZlY3RvcnMKK0VpZ2VuOjpBZmZpbmUzZCBDb21wdXRlQXZlcmFnZVBvc2UoCisgICAgc3RkOjp2ZWN0b3I8RWlnZW46OlZlY3RvcjNkPiAmdHJhbnNsYXRpb25fbGlzdCwKKyAgICBzdGQ6OnZlY3RvcjxFaWdlbjo6VmVjdG9yNGQ+ICZyb3RhdGlvbl9saXN0LAorICAgIEVpZ2VuOjpWZWN0b3IzZCAqdHJhbnNsYXRpb25fdmFyaWFuY2UgPSBudWxscHRyLAorICAgIEVpZ2VuOjpWZWN0b3IzZCAqcm90YXRpb25fdmFyaWFuY2UgPSBudWxscHRyKTsKKworLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNvbXB1dGUgYXZlcmFnZSBwb3NlIHdoZW4gc3VwcGxpZWQgd2l0aCBsaXN0CisvLyBvZiBFaWdlbjo6QWZmaW5lM2QncworRWlnZW46OkFmZmluZTNkIENvbXB1dGVBdmVyYWdlUG9zZSgKKyAgICBzdGQ6OnZlY3RvcjxFaWdlbjo6QWZmaW5lM2Q+ICZwb3NlX2xpc3QsCisgICAgRWlnZW46OlZlY3RvcjNkICp0cmFuc2xhdGlvbl92YXJpYW5jZSA9IG51bGxwdHIsCisgICAgRWlnZW46OlZlY3RvcjNkICpyb3RhdGlvbl92YXJpYW5jZSA9IG51bGxwdHIpOworCiB9ICAvLyBuYW1lc3BhY2UgZnJjOTcxOjp2aXNpb24KIAogI2VuZGlmICAvLyBGUkM5NzFfVklTSU9OX1ZJU0lPTl9VVElMX0xJQl9IXwpkaWZmIC0tZ2l0IGEvZnJjOTcxL3Zpc2lvbi92aXNpb25fdXRpbF9saWJfdGVzdC5jYyBiL2ZyYzk3MS92aXNpb24vdmlzaW9uX3V0aWxfbGliX3Rlc3QuY2MKaW5kZXggZmY5YzBhMy4uYmRmODI1OCAxMDA2NDQKLS0tIGEvZnJjOTcxL3Zpc2lvbi92aXNpb25fdXRpbF9saWJfdGVzdC5jYworKysgYi9mcmM5NzEvdmlzaW9uL3Zpc2lvbl91dGlsX2xpYl90ZXN0LmNjCkBAIC0xLDcgKzEsMTAgQEAKICNpbmNsdWRlICJmcmM5NzEvdmlzaW9uL3Zpc2lvbl91dGlsX2xpYi5oIgogCisjaW5jbHVkZSAiYWJzbC9zdHJpbmdzL3N0cl9mb3JtYXQuaCIKICNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgogCisjaW5jbHVkZSAiYW9zL3V0aWwvbWF0aC5oIgorCiBuYW1lc3BhY2UgZnJjOTcxOjp2aXNpb24gewogLy8gRm9yIG5vdywganVzdCB0ZXN0aW5nIGV4dHJhY3RpbmcgY2FtZXJhIG51bWJlciBmcm9tIGNoYW5uZWwgbmFtZQogVEVTVChWaXNpb25VdGlsc1Rlc3QsIENhbWVyYU51bWJlckZyb21DaGFubmVsKSB7CkBAIC0xMiw0ICsxNSwxMTQgQEAKICAgQVNTRVJUX0VRKENhbWVyYU51bWJlckZyb21DaGFubmVsKCIvb3JpbjEvY2FtZXJhMSIpLnZhbHVlKCksIDEpOwogICBBU1NFUlRfRVEoQ2FtZXJhTnVtYmVyRnJvbUNoYW5uZWwoIi9vcmluMSIpLCBzdGQ6Om51bGxvcHQpOwogfQorCituYW1lc3BhY2UgeworY29uc3RleHByIGRvdWJsZSBrVG9sZXJhbmNlUmFkaWFucyA9IDAuMDU7CisvLyBDb252ZXJzaW9ucyBiZXR3ZWVuIGV1bGVyIGFuZ2xlcyBhbmQgcXVhdGVybmlvbiByZXN1bHQgaW4gc2xpZ2h0bHktb2ZmCisvLyBkb3VibGVzCitjb25zdGV4cHIgZG91YmxlIGtPcmllbnRhdGlvbkVxVG9sZXJhbmNlID0gMWUtMTA7Cit9ICAvLyBuYW1lc3BhY2UKKworLy8gQW5nbGVzIG5vcm1hbGl6ZWQgYnkgYW9zOjptYXRoOjpOb3JtYWxpemVBbmdsZSgpCisjZGVmaW5lIEVYUEVDVF9OT1JNQUxJWkVEX0FOR0xFU19ORUFSKHRoZXRhMSwgdGhldGEyLCB0b2xlcmFuY2UpICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG91YmxlIGRlbHRhID0gc3RkOjphYnMoYW9zOjptYXRoOjpEaWZmQW5nbGUodGhldGExLCB0aGV0YTIpKTsgICAgICAgICBcCisgICAgLyogSGF2ZSB0byBjaGVjayBkZWx0YSAtIDJwaSBmb3IgdGhlIGNhc2UgdGhhdCBvbmUgYW5nbGUgaXMgdmVyeSAqLyAgICBcCisgICAgLyogY2xvc2UgdG8gLXBpLCBhbmQgdGhlIG90aGVyIGlzIHZlcnkgY2xvc2UgdG8gK3BpICovICAgICAgICAgICAgICAgICBcCisgICAgRVhQRUNUX1RSVUUoZGVsdGEgPCB0b2xlcmFuY2UgfHwgc3RkOjphYnMoYW9zOjptYXRoOjpEaWZmQW5nbGUoICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhLCAyLjAgKiBNX1BJKSkgPCB0b2xlcmFuY2UpOyBcCisgIH0KKworI2RlZmluZSBFWFBFQ1RfUE9TRV9ORUFSKHBvc2UxLCBwb3NlMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgMzsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgRVhQRUNUX05FQVIocG9zZTEucChpKSwgcG9zZTIucChpKSwga1RvbGVyYW5jZU1ldGVycyk7ICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGF1dG8gcnB5XzEgPSBQb3NlVXRpbHM6OlF1YXRlcm5pb25Ub0V1bGVyQW5nbGVzKHBvc2UxLnEpOyAgICAgICAgICAgICAgXAorICAgIGF1dG8gcnB5XzIgPSBQb3NlVXRpbHM6OlF1YXRlcm5pb25Ub0V1bGVyQW5nbGVzKHBvc2UyLnEpOyAgICAgICAgICAgICAgXAorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgMzsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgU0NPUEVEX1RSQUNFKGFic2w6OlN0ckZvcm1hdCgicnB5XzEoJWQpID0gJWYsIHJweV8yKCVkKSA9ICVmIiwgaSwgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBycHlfMShpKSwgaSwgcnB5XzIoaSkpKTsgICAgICAgICAgICAgICAgXAorICAgICAgRVhQRUNUX05PUk1BTElaRURfQU5HTEVTX05FQVIocnB5XzEoaSksIHJweV8yKGkpLCBrVG9sZXJhbmNlUmFkaWFucykgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNkZWZpbmUgRVhQRUNUX1BPU0VfRVEocG9zZTEsIHBvc2UyKSBcCisgIEVYUEVDVF9FUShwb3NlMS5wLCBwb3NlMi5wKTsgICAgICAgXAorICBFWFBFQ1RfRVEocG9zZTEucSwgcG9zZTIucSk7CisKKyNkZWZpbmUgRVhQRUNUX1FVQVRFUk5JT05fTkVBUihxMSwgcTIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRVhQRUNUX05FQVIocTEueCgpLCBxMi54KCksIGtPcmllbnRhdGlvbkVxVG9sZXJhbmNlKSA8PCBxMSA8PCAiICE9ICIgPDwgcTI7IFwKKyAgRVhQRUNUX05FQVIocTEueSgpLCBxMi55KCksIGtPcmllbnRhdGlvbkVxVG9sZXJhbmNlKSA8PCBxMSA8PCAiICE9ICIgPDwgcTI7IFwKKyAgRVhQRUNUX05FQVIocTEueigpLCBxMi56KCksIGtPcmllbnRhdGlvbkVxVG9sZXJhbmNlKSA8PCBxMSA8PCAiICE9ICIgPDwgcTI7IFwKKyAgRVhQRUNUX05FQVIocTEudygpLCBxMi53KCksIGtPcmllbnRhdGlvbkVxVG9sZXJhbmNlKSA8PCBxMSA8PCAiICE9ICIgPDwgcTI7CisKKy8vIEV4cGVjdHMgc2FtZSByb2xsLCBwaXRjaCwgYW5kIHlhdyB2YWx1ZXMgKG5vdCBlcXVpdmFsZW50IHJvdGF0aW9uKQorI2RlZmluZSBFWFBFQ1RfUlBZX0VRKHJweV8xLCBycHlfMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgMzsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgU0NPUEVEX1RSQUNFKGFic2w6OlN0ckZvcm1hdCgicnB5XzEoJWQpID0gJWYsIHJweV8yKCVkKSA9ICVmIiwgaSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBycHlfMShpKSwgaSwgcnB5XzIoaSkpKTsgICAgICAgICAgICAgXAorICAgICAgRVhQRUNUX05PUk1BTElaRURfQU5HTEVTX05FQVIocnB5XzEoaSksIHJweV8yKGkpLCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga09yaWVudGF0aW9uRXFUb2xlcmFuY2UpICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNkZWZpbmUgRVhQRUNUX0VVTEVSX0FOR0xFU19RVUFURVJOSU9OX0JBQ0tfQU5EX0ZPUlRIX0VRKHJvbGwsIHBpdGNoLCB5YXcpIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhdXRvIHJweSA9IEVpZ2VuOjpWZWN0b3IzZChyb2xsLCBwaXRjaCwgeWF3KTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhdXRvIGNvbnZlcnRlZF9ycHkgPSBQb3NlVXRpbHM6OlF1YXRlcm5pb25Ub0V1bGVyQW5nbGVzKCAgICAgICAgICAgICAgIFwKKyAgICAgICAgUG9zZVV0aWxzOjpFdWxlckFuZ2xlc1RvUXVhdGVybmlvbihycHkpKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBFWFBFQ1RfUlBZX0VRKGNvbnZlcnRlZF9ycHksIHJweSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisvLyBCb3RoIGNvbmZpZGVuY2UgbWF0cml4ZXMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgZGltZW5zaW9ucyBhbmQgYmUgc3F1YXJlCisjZGVmaW5lIEVYUEVDVF9DT05GSURFTkNFX0dUKGNvbmZpZGVuY2UxLCBjb25maWRlbmNlMikgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBBU1NFUlRfRVEoY29uZmlkZW5jZTEucm93cygpLCBjb25maWRlbmNlMi5yb3dzKCkpOyBcCisgICAgQVNTRVJUX0VRKGNvbmZpZGVuY2UxLnJvd3MoKSwgY29uZmlkZW5jZTEuY29scygpKTsgXAorICAgIEFTU0VSVF9FUShjb25maWRlbmNlMi5yb3dzKCksIGNvbmZpZGVuY2UyLmNvbHMoKSk7IFwKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvbmZpZGVuY2UxLnJvd3MoKTsgaSsrKSB7ICBcCisgICAgICBFWFBFQ1RfR1QoY29uZmlkZW5jZTEoaSwgaSksIGNvbmZpZGVuY2UyKGksIGkpKTsgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCitURVNUKFBvc2VVdGlsc1Rlc3QsIEV1bGVyQW5nbGVzQW5kUXVhdGVybmlvbkNvbnZlcnNpb25zKSB7CisgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBjb252ZXJzaW9ucyBhcmUgY29uc2lzdGVudCBiYWNrIGFuZCBmb3J0aC4KKyAgLy8gVGhlc2UgYW5nbGVzIHNob3VsZG4ndCBnZXQgY2hhbmdlZCB0byBhIGRpZmZlcmVudCwgZXF1aXZhbGVudCByb2xsIHBpdGNoCisgIC8vIHlhdy4KKyAgRVhQRUNUX0VVTEVSX0FOR0xFU19RVUFURVJOSU9OX0JBQ0tfQU5EX0ZPUlRIX0VRKDAuMCwgMC4wLCBNX1BJKTsKKyAgRVhQRUNUX0VVTEVSX0FOR0xFU19RVUFURVJOSU9OX0JBQ0tfQU5EX0ZPUlRIX0VRKDAuMCwgMC4wLCAtTV9QSSk7CisgIEVYUEVDVF9FVUxFUl9BTkdMRVNfUVVBVEVSTklPTl9CQUNLX0FORF9GT1JUSF9FUSgwLjAsIDAuMCwgTV9QSV8yKTsKKyAgRVhQRUNUX0VVTEVSX0FOR0xFU19RVUFURVJOSU9OX0JBQ0tfQU5EX0ZPUlRIX0VRKDAuMCwgMC4wLCAtTV9QSV8yKTsKKyAgRVhQRUNUX0VVTEVSX0FOR0xFU19RVUFURVJOSU9OX0JBQ0tfQU5EX0ZPUlRIX0VRKDAuMCwgMC4wLCAwLjApOworICBFWFBFQ1RfRVVMRVJfQU5HTEVTX1FVQVRFUk5JT05fQkFDS19BTkRfRk9SVEhfRVEoMC4wLCBNX1BJXzQsIDAuMCk7CisgIEVYUEVDVF9FVUxFUl9BTkdMRVNfUVVBVEVSTklPTl9CQUNLX0FORF9GT1JUSF9FUSgwLjAsIC1NX1BJXzQsIDAuMCk7CisgIEVYUEVDVF9FVUxFUl9BTkdMRVNfUVVBVEVSTklPTl9CQUNLX0FORF9GT1JUSF9FUSgwLjAsIC1NX1BJXzQsIE1fUElfNCk7CisgIEVYUEVDVF9FVUxFUl9BTkdMRVNfUVVBVEVSTklPTl9CQUNLX0FORF9GT1JUSF9FUShNX1BJXzQsIC1NX1BJXzQsIE1fUElfNCk7CisgIEVYUEVDVF9FVUxFUl9BTkdMRVNfUVVBVEVSTklPTl9CQUNLX0FORF9GT1JUSF9FUSgtTV9QSV8yLCAtTV9QSV80LCBNX1BJXzQpOworCisgIC8vIE5vdywgZG8gYSBzd2VlcCBvZiByb2xsLCBwaXRjaCwgYW5kIHlhd3MgaW4gdGhlIG5vcm1hbGl6ZWQKKyAgLy8gcmFuZ2UuCisgIC8vIC0gcm9sbDogKC1waS8yLCBwaS8yKQorICAvLyAtIHBpdGNoOiAoLXBpLzIsIHBpLzIpCisgIC8vIC0geWF3OiBbLXBpLCBwaSkKKyAgY29uc3RleHByIGRvdWJsZSBrVGhldGFNYXhSb2xsID0gTV9QSV8yIC0ga1RvbGVyYW5jZVJhZGlhbnM7CisgIGNvbnN0ZXhwciBkb3VibGUga1RoZXRhTWF4UGl0Y2ggPSBNX1BJXzIgLSBrVG9sZXJhbmNlUmFkaWFuczsKKyAgY29uc3RleHByIGRvdWJsZSBrVGhldGFNYXhZYXcgPSBNX1BJOworICBjb25zdGV4cHIgZG91YmxlIGtEZWx0YVRoZXRhID0gTV9QSSAvIDE2OworCisgIGZvciAoZG91YmxlIHJvbGwgPSAta1RoZXRhTWF4Um9sbDsgcm9sbCA8IGtUaGV0YU1heFJvbGw7CisgICAgICAgcm9sbCArPSBrRGVsdGFUaGV0YSkgeworICAgIGZvciAoZG91YmxlIHBpdGNoID0gLWtUaGV0YU1heFBpdGNoOyBwaXRjaCA8IGtUaGV0YU1heFBpdGNoOworICAgICAgICAgcGl0Y2ggKz0ga0RlbHRhVGhldGEpIHsKKyAgICAgIGZvciAoZG91YmxlIHlhdyA9IC1rVGhldGFNYXhZYXc7IHlhdyA8IGtUaGV0YU1heFlhdzsgeWF3ICs9IGtEZWx0YVRoZXRhKSB7CisgICAgICAgIFNDT1BFRF9UUkFDRSgKKyAgICAgICAgICAgIGFic2w6OlN0ckZvcm1hdCgicm9sbDogJWYsIHBpdGNoOiAlZiwgeWF3OiAlZiIsIHJvbGwsIHBpdGNoLCB5YXcpKTsKKyAgICAgICAgRVhQRUNUX0VVTEVSX0FOR0xFU19RVUFURVJOSU9OX0JBQ0tfQU5EX0ZPUlRIX0VRKHJvbGwsIHBpdGNoLCB5YXcpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCiB9ICAvLyBuYW1lc3BhY2UgZnJjOTcxOjp2aXNpb24KZGlmZiAtLWdpdCBhL3kyMDIzL2NvbnRyb2xfbG9vcHMvc3VwZXJzdHJ1Y3R1cmUvYXJtL2FybV9kZXNpZ24uY2MgYi95MjAyMy9jb250cm9sX2xvb3BzL3N1cGVyc3RydWN0dXJlL2FybS9hcm1fZGVzaWduLmNjCmluZGV4IDA3NDM5ZDYuLjRmN2M2MjkgMTAwNjQ0Ci0tLSBhL3kyMDIzL2NvbnRyb2xfbG9vcHMvc3VwZXJzdHJ1Y3R1cmUvYXJtL2FybV9kZXNpZ24uY2MKKysrIGIveTIwMjMvY29udHJvbF9sb29wcy9zdXBlcnN0cnVjdHVyZS9hcm0vYXJtX2Rlc2lnbi5jYwpAQCAtMTA2LDEzICsxMDYsMTMgQEAKICAgICBjb25zdCBhdXRvIHhfYmxvY2tlZCA9IFguYmxvY2s8NCwgMT4oMCwgMCk7CiAKICAgICBjb25zdCA6OkVpZ2VuOjpNYXRyaXg8ZG91YmxlLCA0LCA0PiBmaW5hbF9BID0KLSAgICAgICAgOjpmcmM5NzE6OmNvbnRyb2xfbG9vcHM6Ok51bWVyaWNhbEphY29iaWFuWDw0LCAyPigKKyAgICAgICAgOjpmcmM5NzE6OmNvbnRyb2xfbG9vcHM6Ok51bWVyaWNhbEphY29iaWFuWDw0LCAyLCBkb3VibGU+KAogICAgICAgICAgICAgW2R5bmFtaWNzXShjb25zdCBhdXRvICZ4X2Jsb2NrZWQsIGNvbnN0IGF1dG8gJlUsIGRvdWJsZSBrRHQpIHsKICAgICAgICAgICAgICAgcmV0dXJuIGR5bmFtaWNzLlVuYm91bmRlZERpc2NyZXRlRHluYW1pY3MoeF9ibG9ja2VkLCBVLCBrRHQpOwogICAgICAgICAgICAgfSwKICAgICAgICAgICAgIHhfYmxvY2tlZCwgVSwgMC4wMDUwNSk7CiAgICAgY29uc3QgOjpFaWdlbjo6TWF0cml4PGRvdWJsZSwgNCwgMj4gZmluYWxfQiA9Ci0gICAgICAgIDo6ZnJjOTcxOjpjb250cm9sX2xvb3BzOjpOdW1lcmljYWxKYWNvYmlhblU8NCwgMj4oCisgICAgICAgIDo6ZnJjOTcxOjpjb250cm9sX2xvb3BzOjpOdW1lcmljYWxKYWNvYmlhblU8NCwgMiwgZG91YmxlPigKICAgICAgICAgICAgIFtkeW5hbWljc10oY29uc3QgYXV0byAmeF9ibG9ja2VkLCBjb25zdCBhdXRvICZVLCBkb3VibGUga0R0KSB7CiAgICAgICAgICAgICAgIHJldHVybiBkeW5hbWljcy5VbmJvdW5kZWREaXNjcmV0ZUR5bmFtaWNzKHhfYmxvY2tlZCwgVSwga0R0KTsKICAgICAgICAgICAgIH0sCmRpZmYgLS1naXQgYS95MjAyMy9jb250cm9sX2xvb3BzL3N1cGVyc3RydWN0dXJlL2FybS90cmFqZWN0b3J5LmNjIGIveTIwMjMvY29udHJvbF9sb29wcy9zdXBlcnN0cnVjdHVyZS9hcm0vdHJhamVjdG9yeS5jYwppbmRleCBmN2FlNWY5Li40YWQ0NDI0IDEwMDY0NAotLS0gYS95MjAyMy9jb250cm9sX2xvb3BzL3N1cGVyc3RydWN0dXJlL2FybS90cmFqZWN0b3J5LmNjCisrKyBiL3kyMDIzL2NvbnRyb2xfbG9vcHMvc3VwZXJzdHJ1Y3R1cmUvYXJtL3RyYWplY3RvcnkuY2MKQEAgLTczNiwxNCArNzM2LDE0IEBACiAgIGNvbnN0IGF1dG8geF9ibG9ja2VkID0gYXJtX1guYmxvY2s8NCwgMT4oMCwgMCk7CiAKICAgY29uc3QgOjpFaWdlbjo6TWF0cml4PGRvdWJsZSwgNCwgND4gZmluYWxfQSA9Ci0gICAgICA6OmZyYzk3MTo6Y29udHJvbF9sb29wczo6TnVtZXJpY2FsSmFjb2JpYW5YPDQsIDI+KAorICAgICAgOjpmcmM5NzE6OmNvbnRyb2xfbG9vcHM6Ok51bWVyaWNhbEphY29iaWFuWDw0LCAyLCBkb3VibGU+KAogICAgICAgICAgIFt0aGlzXShjb25zdCBhdXRvICZ4X2Jsb2NrZWQsIGNvbnN0IGF1dG8gJlUsIGRvdWJsZSBkdCkgewogICAgICAgICAgICAgcmV0dXJuIHRoaXMtPmR5bmFtaWNzXy0+VW5ib3VuZGVkRGlzY3JldGVEeW5hbWljcyh4X2Jsb2NrZWQsIFUsIGR0KTsKICAgICAgICAgICB9LAogICAgICAgICAgIHhfYmxvY2tlZCwgYXJtX1UsIDAuMDA1MDUpOwogCiAgIGNvbnN0IDo6RWlnZW46Ok1hdHJpeDxkb3VibGUsIDQsIDI+IGZpbmFsX0IgPQotICAgICAgOjpmcmM5NzE6OmNvbnRyb2xfbG9vcHM6Ok51bWVyaWNhbEphY29iaWFuVTw0LCAyPigKKyAgICAgIDo6ZnJjOTcxOjpjb250cm9sX2xvb3BzOjpOdW1lcmljYWxKYWNvYmlhblU8NCwgMiwgZG91YmxlPigKICAgICAgICAgICBbdGhpc10oY29uc3QgYXV0byAmeF9ibG9ja2VkLCBjb25zdCBhdXRvICZVLCBkb3VibGUgZHQpIHsKICAgICAgICAgICAgIHJldHVybiB0aGlzLT5keW5hbWljc18tPlVuYm91bmRlZERpc2NyZXRlRHluYW1pY3MoeF9ibG9ja2VkLCBVLCBkdCk7CiAgICAgICAgICAgfSwKZGlmZiAtLWdpdCBhL3kyMDIzL3Zpc2lvbi9hcHJpbF9kZXRlY3Rpb25fdGVzdC5jYyBiL3kyMDIzL3Zpc2lvbi9hcHJpbF9kZXRlY3Rpb25fdGVzdC5jYwppbmRleCA5ZjRmOGI3Li43ZTUwYjA5IDEwMDY0NAotLS0gYS95MjAyMy92aXNpb24vYXByaWxfZGV0ZWN0aW9uX3Rlc3QuY2MKKysrIGIveTIwMjMvdmlzaW9uL2FwcmlsX2RldGVjdGlvbl90ZXN0LmNjCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSAiZnJjOTcxL2NvbnN0YW50cy9jb25zdGFudHNfc2VuZGVyX2xpYi5oIgogI2luY2x1ZGUgImZyYzk3MS92aXNpb24vdGFyZ2V0X21hcHBlci5oIgogI2luY2x1ZGUgImZyYzk3MS92aXNpb24vdmlzaW9uX2dlbmVyYXRlZC5oIgorI2luY2x1ZGUgImZyYzk3MS92aXNpb24vdmlzaW9uX3V0aWxfbGliLmgiCiAjaW5jbHVkZSAieTIwMjMvY29uc3RhbnRzL2NvbnN0YW50c19nZW5lcmF0ZWQuaCIKICNpbmNsdWRlICJ5MjAyMy9jb25zdGFudHMvY29uc3RhbnRzX2xpc3RfZ2VuZXJhdGVkLmgiCiAjaW5jbHVkZSAieTIwMjMvdmlzaW9uL2Fwcmlscm9ib3RpY3MuaCIKQEAgLTYxLDcgKzYyLDcgQEAKICAgICBBU1NFUlRfRVEoYXByaWxfcG9zZV9mZXRjaGVyXy0+dGFyZ2V0X3Bvc2VzKCktPnNpemUoKSwgMSk7CiAKICAgICBmcmM5NzE6OnZpc2lvbjo6VGFyZ2V0TWFwcGVyOjpUYXJnZXRQb3NlIHRhcmdldF9wb3NlID0KLSAgICAgICAgZnJjOTcxOjp2aXNpb246OlBvc2VVdGlsczo6VGFyZ2V0UG9zZUZyb21GYnMoCisgICAgICAgIGZyYzk3MTo6dmlzaW9uOjpUYXJnZXRNYXBwZXI6OlRhcmdldFBvc2VGcm9tRmJzKAogICAgICAgICAgICAgKmFwcmlsX3Bvc2VfZmV0Y2hlcl8tPnRhcmdldF9wb3NlcygpLT5HZXQoMCkpOwogCiAgICAgQVNTRVJUX0VRKGFwcmlsX3Bvc2VfZmV0Y2hlcl8tPnRhcmdldF9wb3NlcygpLT5HZXQoMCktPmlkKCksIDgpOwpkaWZmIC0tZ2l0IGEveTIwMjMvdmlzaW9uL2NhbGlicmF0ZV9tdWx0aV9jYW1lcmFzLmNjIGIveTIwMjMvdmlzaW9uL2NhbGlicmF0ZV9tdWx0aV9jYW1lcmFzLmNjCmluZGV4IDgwMzJjNzY0Li41YzI5Nzk3IDEwMDY0NAotLS0gYS95MjAyMy92aXNpb24vY2FsaWJyYXRlX211bHRpX2NhbWVyYXMuY2MKKysrIGIveTIwMjMvdmlzaW9uL2NhbGlicmF0ZV9tdWx0aV9jYW1lcmFzLmNjCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSAiZnJjOTcxL3Zpc2lvbi9jaGFydWNvX2xpYi5oIgogI2luY2x1ZGUgImZyYzk3MS92aXNpb24vZXh0cmluc2ljc19jYWxpYnJhdGlvbi5oIgogI2luY2x1ZGUgImZyYzk3MS92aXNpb24vdGFyZ2V0X21hcHBlci5oIgorI2luY2x1ZGUgImZyYzk3MS92aXNpb24vdmlzaW9uX3V0aWxfbGliLmgiCiAjaW5jbHVkZSAiZnJjOTcxL3Zpc2lvbi92aXN1YWxpemVfcm9ib3QuaCIKIC8vIGNsYW5nLWZvcm1hdCBvZmYKIC8vIE9wZW5DViBlaWdlbiBmaWxlcyBtdXN0IGJlIGluY2x1ZGVkIGFmdGVyIEVpZ2VuIGluY2x1ZGVzCkBAIC0zNjIsNyArMzYzLDcgQEAKICAgICB9CiAKICAgICBjb25zdCBUYXJnZXRNYXBwZXI6OlRhcmdldFBvc2UgdGFyZ2V0X3Bvc2UgPQotICAgICAgICBQb3NlVXRpbHM6OlRhcmdldFBvc2VGcm9tRmJzKCp0YXJnZXRfcG9zZV9mYnMpOworICAgICAgICBUYXJnZXRNYXBwZXI6OlRhcmdldFBvc2VGcm9tRmJzKCp0YXJnZXRfcG9zZV9mYnMpOwogCiAgICAgdGFyZ2V0X3Bvc2VzLmVtcGxhY2VfYmFjayh0YXJnZXRfcG9zZSk7CiAKZGlmZiAtLWdpdCBhL3kyMDIzL3Zpc2lvbi90YXJnZXRfbWFwcGluZy5jYyBiL3kyMDIzL3Zpc2lvbi90YXJnZXRfbWFwcGluZy5jYwppbmRleCBmMzNhODNhLi4zMjVhZDkwIDEwMDY0NAotLS0gYS95MjAyMy92aXNpb24vdGFyZ2V0X21hcHBpbmcuY2MKKysrIGIveTIwMjMvdmlzaW9uL3RhcmdldF9tYXBwaW5nLmNjCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSAiZnJjOTcxL2NvbnRyb2xfbG9vcHMvcG9zZS5oIgogI2luY2x1ZGUgImZyYzk3MS92aXNpb24vY2FsaWJyYXRpb25fZ2VuZXJhdGVkLmgiCiAjaW5jbHVkZSAiZnJjOTcxL3Zpc2lvbi90YXJnZXRfbWFwcGVyLmgiCisjaW5jbHVkZSAiZnJjOTcxL3Zpc2lvbi92aXNpb25fdXRpbF9saWIuaCIKICNpbmNsdWRlICJmcmM5NzEvdmlzaW9uL3Zpc3VhbGl6ZV9yb2JvdC5oIgogI2luY2x1ZGUgInkyMDIzL2NvbnN0YW50cy9zaW11bGF0ZWRfY29uc3RhbnRzX3NlbmRlci5oIgogI2luY2x1ZGUgInkyMDIzL3Zpc2lvbi9hcHJpbHJvYm90aWNzLmgiCkBAIC0yMzksNyArMjQwLDcgQEAKICAgICB9CiAKICAgICBjb25zdCBUYXJnZXRNYXBwZXI6OlRhcmdldFBvc2UgdGFyZ2V0X3Bvc2UgPQotICAgICAgICBQb3NlVXRpbHM6OlRhcmdldFBvc2VGcm9tRmJzKCp0YXJnZXRfcG9zZV9mYnMpOworICAgICAgICBUYXJnZXRNYXBwZXI6OlRhcmdldFBvc2VGcm9tRmJzKCp0YXJnZXRfcG9zZV9mYnMpOwogCiAgICAgRWlnZW46OkFmZmluZTNkIEhfY2FtZXJhX3RhcmdldCA9CiAgICAgICAgIEVpZ2VuOjpUcmFuc2xhdGlvbjNkKHRhcmdldF9wb3NlLnBvc2UucCkgKiB0YXJnZXRfcG9zZS5wb3NlLnE7CmRpZmYgLS1naXQgYS95MjAyNC92aXNpb24vY2FsaWJyYXRlX211bHRpX2NhbWVyYXMuY2MgYi95MjAyNC92aXNpb24vY2FsaWJyYXRlX211bHRpX2NhbWVyYXMuY2MKaW5kZXggN2E5ZjQxMi4uYjBmYTMzYiAxMDA2NDQKLS0tIGEveTIwMjQvdmlzaW9uL2NhbGlicmF0ZV9tdWx0aV9jYW1lcmFzLmNjCisrKyBiL3kyMDI0L3Zpc2lvbi9jYWxpYnJhdGVfbXVsdGlfY2FtZXJhcy5jYwpAQCAtNDAsNiArNDAsOSBAQAogICAgICAgICAgICJUaHJvdyBvdXQgdGFyZ2V0IHBvc2VzIHdpdGggYSBoaWdoZXIgcG9zZSBlcnJvciB0aGFuIHRoaXMiKTsKIEFCU0xfRkxBRyhkb3VibGUsIG1heF9wb3NlX2Vycm9yX3JhdGlvLCAwLjQsCiAgICAgICAgICAgIlRocm93IG91dCB0YXJnZXQgcG9zZXMgd2l0aCBhIGhpZ2hlciBwb3NlIGVycm9yIHJhdGlvIHRoYW4gdGhpcyIpOworQUJTTF9GTEFHKGJvb2wsIHJvYm90LCBmYWxzZSwKKyAgICAgICAgICAiSWYgdHJ1ZSB3ZSdyZSBjYWxpYnJhdGluZyBleHRyaW5zaWNzIGZvciB0aGUgcm9ib3QsIHVzZSB0aGUgIgorICAgICAgICAgICJjb3JyZWN0IG5vZGUgcGF0aCBmb3IgdGhlIHJvYm90LiIpOwogQUJTTF9GTEFHKHN0ZDo6c3RyaW5nLCBvdXRwdXRfZm9sZGVyLCAiL3RtcCIsCiAgICAgICAgICAgIkRpcmVjdG9yeSBpbiB3aGljaCB0byBzdG9yZSB0aGUgdXBkYXRlZCBjYWxpYnJhdGlvbiBmaWxlcyIpOwogQUJTTF9GTEFHKHN0ZDo6c3RyaW5nLCB0YXJnZXRfdHlwZSwgImNoYXJ1Y29fZGlhbW9uZCIsCkBAIC00OSwxMiArNTIsMTAgQEAKIEFCU0xfRkxBRygKICAgICB1aW50NjRfdCwgd2FpdF9rZXksIDEsCiAgICAgIlRpbWUgaW4gbXMgdG8gd2FpdCBiZXR3ZWVuIGltYWdlcyAoMCB0byB3YWl0IGluZGVmaW5pdGVseSB1bnRpbCBjbGljaykiKTsKLUFCU0xfRkxBRyhib29sLCByb2JvdCwgZmFsc2UsCi0gICAgICAgICAgIklmIHRydWUgd2UncmUgY2FsaWJyYXRpbmcgZXh0cmluc2ljcyBmb3IgdGhlIHJvYm90LCB1c2UgdGhlICIKLSAgICAgICAgICAiY29ycmVjdCBub2RlIHBhdGggZm9yIHRoZSByb2JvdC4iKTsKIAogQUJTTF9ERUNMQVJFX0ZMQUcoaW50MzJfdCwgbWluX3RhcmdldF9pZCk7CiBBQlNMX0RFQ0xBUkVfRkxBRyhpbnQzMl90LCBtYXhfdGFyZ2V0X2lkKTsKK0FCU0xfREVDTEFSRV9GTEFHKGRvdWJsZSwgb3V0bGllcl9zdGRfZGV2cyk7CiAKIC8vIENhbGlicmF0ZSBleHRyaW5zaWMgcmVsYXRpb25zaGlwIGJldHdlZW4gY2FtZXJhcyB1c2luZyB0d28gdGFyZ2V0cwogLy8gc2VlbiBqb2ludGx5IGJldHdlZW4gY2FtZXJhcy4gIFVzZXMgdHdvIHR5cGVzIG9mIGluZm9ybWF0aW9uOiAxKQpAQCAtNzIsOCArNzMsNiBAQAogLy8gZnJvbSBhbGwgY2FtZXJhcywgbm90IGp1c3QgZmlyc3QgY2FtZXJhCiAKIG5hbWVzcGFjZSB5MjAyNDo6dmlzaW9uIHsKLXVzaW5nIGZyYzk3MTo6dmlzaW9uOjpEYXRhQWRhcHRlcjsKLXVzaW5nIGZyYzk3MTo6dmlzaW9uOjpJbWFnZUNhbGxiYWNrOwogdXNpbmcgZnJjOTcxOjp2aXNpb246OlBvc2VVdGlsczsKIHVzaW5nIGZyYzk3MTo6dmlzaW9uOjpUYXJnZXRNYXA7CiB1c2luZyBmcmM5NzE6OnZpc2lvbjo6VGFyZ2V0TWFwcGVyOwpAQCAtODMsOCArODIsOCBAQAogc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga0ltYWdlUGVyaW9kTXMgPQogICAgIDEuMCAvIDYwLjAgKiAxMDAwLjA7ICAvLyBJbWFnZSBjYXB0dXJlIHBlcmlvZCBpbiBtcwogCisvLyBTZXQgdXAgb3VyIGNhbWVyYSBuYW1pbmcgZGF0YQogc3RkOjp2ZWN0b3I8Q2FtZXJhTm9kZT4gbm9kZV9saXN0KHkyMDI0Ojp2aXNpb246OkNyZWF0ZU5vZGVMaXN0KCkpOwotCiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBvcmRlcmluZ19tYXAoCiAgICAgeTIwMjQ6OnZpc2lvbjo6Q3JlYXRlT3JkZXJpbmdNYXAobm9kZV9saXN0KSk7CiAKQEAgLTExMSw1NyArMTEwLDggQEAKIHN0ZDo6dmVjdG9yPFRpbWVzdGFtcGVkQ2FtZXJhRGV0ZWN0aW9uPiB0d29fYm9hcmRfZXh0cmluc2ljc19saXN0OwogVmlzdWFsaXplUm9ib3QgdmlzX3JvYm90XzsKIAotLy8gVE9ETzxqaW0+OiBJbXBsZW1lbnQgdmFyaWFuY2UgY2FsY3MKLUVpZ2VuOjpBZmZpbmUzZCBDb21wdXRlQXZlcmFnZVBvc2UoCi0gICAgc3RkOjp2ZWN0b3I8RWlnZW46OlZlY3RvcjNkPiAmdHJhbnNsYXRpb25fbGlzdCwKLSAgICBzdGQ6OnZlY3RvcjxFaWdlbjo6VmVjdG9yNGQ+ICZyb3RhdGlvbl9saXN0LAotICAgIEVpZ2VuOjpWZWN0b3IzZCAqdHJhbnNsYXRpb25fdmFyaWFuY2UgPSBudWxscHRyLAotICAgIEVpZ2VuOjpWZWN0b3IzZCAqcm90YXRpb25fdmFyaWFuY2UgPSBudWxscHRyKSB7Ci0gIEVpZ2VuOjpWZWN0b3IzZCBhdmdfdHJhbnNsYXRpb24gPQotICAgICAgc3RkOjphY2N1bXVsYXRlKHRyYW5zbGF0aW9uX2xpc3QuYmVnaW4oKSwgdHJhbnNsYXRpb25fbGlzdC5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICBFaWdlbjo6VmVjdG9yM2R7MCwgMCwgMH0pIC8KLSAgICAgIHRyYW5zbGF0aW9uX2xpc3Quc2l6ZSgpOwotCi0gIC8vIFRPRE88SmltPjogVXNlIFF1YXRlcm5pb25NZWFuIGZyb20gcXVhdGVybmlvbl91dGlscy5jYyAoYnV0IHRoaXMKLSAgLy8gcmVxdWlyZXMgYSBmaXhlZCBudW1iZXIgb2YgcXVhdGVybmlvbnMgdG8gYmUgYXZlcmFnZWQKLSAgRWlnZW46OlZlY3RvcjRkIGF2Z19yb3RhdGlvbiA9Ci0gICAgICBzdGQ6OmFjY3VtdWxhdGUocm90YXRpb25fbGlzdC5iZWdpbigpLCByb3RhdGlvbl9saXN0LmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgIEVpZ2VuOjpWZWN0b3I0ZHswLCAwLCAwLCAwfSkgLwotICAgICAgcm90YXRpb25fbGlzdC5zaXplKCk7Ci0gIC8vIE5vcm1hbGl6ZSwgc28gaXQncyBhIHZhbGlkIHF1YXRlcm5pb24KLSAgYXZnX3JvdGF0aW9uID0gYXZnX3JvdGF0aW9uIC8gYXZnX3JvdGF0aW9uLm5vcm0oKTsKLSAgRWlnZW46OlF1YXRlcm5pb25kIGF2Z19yb3RhdGlvbl9xe2F2Z19yb3RhdGlvblswXSwgYXZnX3JvdGF0aW9uWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZnX3JvdGF0aW9uWzJdLCBhdmdfcm90YXRpb25bM119OwotICBFaWdlbjo6VHJhbnNsYXRpb24zZCB0cmFuc2xhdGlvbihhdmdfdHJhbnNsYXRpb24pOwotICBFaWdlbjo6QWZmaW5lM2QgcmV0dXJuX3Bvc2UgPSB0cmFuc2xhdGlvbiAqIGF2Z19yb3RhdGlvbl9xOwotICBpZiAodHJhbnNsYXRpb25fdmFyaWFuY2UgIT0gbnVsbHB0cikgewotICAgICp0cmFuc2xhdGlvbl92YXJpYW5jZSA9IEVpZ2VuOjpWZWN0b3IzZCgpOwotICB9Ci0gIGlmIChyb3RhdGlvbl92YXJpYW5jZSAhPSBudWxscHRyKSB7Ci0gICAgKnJvdGF0aW9uX3ZhcmlhbmNlID0gRWlnZW46OlZlY3RvcjNkKCk7Ci0gIH0KLQotICByZXR1cm4gcmV0dXJuX3Bvc2U7Ci19Ci0KLUVpZ2VuOjpBZmZpbmUzZCBDb21wdXRlQXZlcmFnZVBvc2UoCi0gICAgc3RkOjp2ZWN0b3I8RWlnZW46OkFmZmluZTNkPiAmcG9zZV9saXN0LAotICAgIEVpZ2VuOjpWZWN0b3IzZCAqdHJhbnNsYXRpb25fdmFyaWFuY2UgPSBudWxscHRyLAotICAgIEVpZ2VuOjpWZWN0b3IzZCAqcm90YXRpb25fdmFyaWFuY2UgPSBudWxscHRyKSB7Ci0gIHN0ZDo6dmVjdG9yPEVpZ2VuOjpWZWN0b3IzZD4gdHJhbnNsYXRpb25fbGlzdDsKLSAgc3RkOjp2ZWN0b3I8RWlnZW46OlZlY3RvcjRkPiByb3RhdGlvbl9saXN0OwotCi0gIGZvciAoRWlnZW46OkFmZmluZTNkIHBvc2UgOiBwb3NlX2xpc3QpIHsKLSAgICB0cmFuc2xhdGlvbl9saXN0LnB1c2hfYmFjayhwb3NlLnRyYW5zbGF0aW9uKCkpOwotICAgIEVpZ2VuOjpRdWF0ZXJuaW9uZCBxdWF0KHBvc2Uucm90YXRpb24oKS5tYXRyaXgoKSk7Ci0gICAgcm90YXRpb25fbGlzdC5wdXNoX2JhY2soCi0gICAgICAgIEVpZ2VuOjpWZWN0b3I0ZChxdWF0LncoKSwgcXVhdC54KCksIHF1YXQueSgpLCBxdWF0LnooKSkpOwotICB9Ci0KLSAgcmV0dXJuIENvbXB1dGVBdmVyYWdlUG9zZSh0cmFuc2xhdGlvbl9saXN0LCByb3RhdGlvbl9saXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0aW9uX3ZhcmlhbmNlLCByb3RhdGlvbl92YXJpYW5jZSk7Ci19Ci0KKy8vIEhlbHBlciBmdW5jdGlvbiB0byBjb21wdXRlIGF2ZXJhZ2UgcG9zZSB3aGVuIHN1cHBsaWVkIHdpdGggbGlzdAorLy8gb2YgVGltZXN0YW1wZWRDYW1lcmFEZXRlY3Rpb24ncwogRWlnZW46OkFmZmluZTNkIENvbXB1dGVBdmVyYWdlUG9zZSgKICAgICBzdGQ6OnZlY3RvcjxUaW1lc3RhbXBlZENhbWVyYURldGVjdGlvbj4gJnBvc2VfbGlzdCwKICAgICBFaWdlbjo6VmVjdG9yM2QgKnRyYW5zbGF0aW9uX3ZhcmlhbmNlID0gbnVsbHB0ciwKQEAgLTE3MiwxOCArMTIyLDk1IEBACiAgIGZvciAoVGltZXN0YW1wZWRDYW1lcmFEZXRlY3Rpb24gcG9zZSA6IHBvc2VfbGlzdCkgewogICAgIHRyYW5zbGF0aW9uX2xpc3QucHVzaF9iYWNrKHBvc2UuSF9jYW1lcmFfdGFyZ2V0LnRyYW5zbGF0aW9uKCkpOwogICAgIEVpZ2VuOjpRdWF0ZXJuaW9uZCBxdWF0KHBvc2UuSF9jYW1lcmFfdGFyZ2V0LnJvdGF0aW9uKCkubWF0cml4KCkpOworICAgIC8vIE5PVEU6IEVpZ2VuIGluaXRpYWxpZXMgYXMgKHgseSx6LHcpIGZyb20gVmVjdG9yNGQncwogICAgIHJvdGF0aW9uX2xpc3QucHVzaF9iYWNrKAotICAgICAgICBFaWdlbjo6VmVjdG9yNGQocXVhdC53KCksIHF1YXQueCgpLCBxdWF0LnkoKSwgcXVhdC56KCkpKTsKKyAgICAgICAgRWlnZW46OlZlY3RvcjRkKHF1YXQueCgpLCBxdWF0LnkoKSwgcXVhdC56KCksIHF1YXQudygpKSk7CiAgIH0KLSAgcmV0dXJuIENvbXB1dGVBdmVyYWdlUG9zZSh0cmFuc2xhdGlvbl9saXN0LCByb3RhdGlvbl9saXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0aW9uX3ZhcmlhbmNlLCByb3RhdGlvbl92YXJpYW5jZSk7CisgIHJldHVybiBmcmM5NzE6OnZpc2lvbjo6Q29tcHV0ZUF2ZXJhZ2VQb3NlKAorICAgICAgdHJhbnNsYXRpb25fbGlzdCwgcm90YXRpb25fbGlzdCwgdHJhbnNsYXRpb25fdmFyaWFuY2UsIHJvdGF0aW9uX3ZhcmlhbmNlKTsKIH0KIAorLy8gRG8gb3V0bGllciByZWplY3Rpb24uICBHaXZlbiBhIGxpc3Qgb2YgcG9zZXMsIGNvbXB1dGUgdGhlCisvLyBtZWFuIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24sIGFuZCB0aHJvdyBvdXQgdGhvc2UgbW9yZSB0aGFuCisvLyBGTEFHU19vdXRsaWVyX3N0ZF9kZXZzIHN0YW5kYXJkIGRldmlhdGlvbnMgYXdheSBmcm9tIHRoZSBtZWFuLgorLy8gUmVwZWF0IGZvciB0aGUgZGVzaXJlZCBudW1iZXIgb2YgaXRlcmF0aW9ucyBvciB1bnRpbCB3ZSBkb24ndCB0aHJvdworLy8gb3V0IGFueSBtb3JlIG91dGxpZXJzCit2b2lkIFJlbW92ZU91dGxpZXJzKHN0ZDo6dmVjdG9yPFRpbWVzdGFtcGVkQ2FtZXJhRGV0ZWN0aW9uPiAmcG9zZV9saXN0LAorICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX2l0ZXJhdGlvbnMgPSAxKSB7CisgIGZvciAoaW50IGkgPSAxOyBpIDw9IG51bV9pdGVyYXRpb25zOyBpKyspIHsKKyAgICBFaWdlbjo6VmVjdG9yM2QgdHJhbnNsYXRpb25fdmFyaWFuY2UsIHJvdGF0aW9uX3ZhcmlhbmNlOworICAgIEVpZ2VuOjpBZmZpbmUzZCBhdmdfcG9zZSA9IENvbXB1dGVBdmVyYWdlUG9zZSgKKyAgICAgICAgcG9zZV9saXN0LCAmdHJhbnNsYXRpb25fdmFyaWFuY2UsICZyb3RhdGlvbl92YXJpYW5jZSk7CisKKyAgICBzaXplX3Qgb3JpZ2luYWxfc2l6ZSA9IHBvc2VfbGlzdC5zaXplKCk7CisgICAgLy8gQ3JlYXRlIGEgbGFtYmRhIHRvIGlkZW50aWZ5IHRoZSBvdXRsaWVycyB0byBiZSByZW1vdmVkCisgICAgYXV0byByZW1vdmVfbGFtYmRhID0gW3RyYW5zbGF0aW9uX3ZhcmlhbmNlLCByb3RhdGlvbl92YXJpYW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXZnX3Bvc2VdKGNvbnN0IFRpbWVzdGFtcGVkQ2FtZXJhRGV0ZWN0aW9uICZwb3NlKSB7CisgICAgICBFaWdlbjo6QWZmaW5lM2QgSF9kZWx0YSA9IGF2Z19wb3NlICogcG9zZS5IX2NhbWVyYV90YXJnZXQuaW52ZXJzZSgpOworICAgICAgLy8gQ29tcHV0ZSB0aGUgei1zY29yZSBmb3IgZWFjaCBkaW1lbnNpb24sIGFuZCB1c2UgdGhlIG1heCB0bworICAgICAgLy8gZGVjaWRlIG9uIG91dGxpZXJzLiAgVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSBNYWhhbGFub2JpcworICAgICAgLy8gZGlzdGFuY2UgKHNjYWxlIGJ5IGludmVyc2Ugb2YgdGhlIGNvdmFyaWFuY2UgbWF0cml4KSwgYnV0IHdlJ3JlCisgICAgICAvLyB0cmVhdGluZyBlYWNoIGRpbWVuc2lvbiBpbmRlcGVuZGVudGx5CisgICAgICBFaWdlbjo6TWF0cml4M2QgdHJhbnNsYXRpb25fc2lnbWEgPSB0cmFuc2xhdGlvbl92YXJpYW5jZS5hc0RpYWdvbmFsKCk7CisgICAgICBFaWdlbjo6TWF0cml4M2Qgcm90YXRpb25fc2lnbWEgPSByb3RhdGlvbl92YXJpYW5jZS5hc0RpYWdvbmFsKCk7CisgICAgICBFaWdlbjo6VmVjdG9yM2QgZGVsdGFfcm90YXRpb24gPQorICAgICAgICAgIFBvc2VVdGlsczo6Um90YXRpb25NYXRyaXhUb0V1bGVyQW5nbGVzKEhfZGVsdGEucm90YXRpb24oKS5tYXRyaXgoKSk7CisgICAgICBkb3VibGUgbWF4X3RyYW5zbGF0aW9uX3pfc2NvcmUgPSBzdGQ6OnNxcnQoCisgICAgICAgICAgSF9kZWx0YS50cmFuc2xhdGlvbigpCisgICAgICAgICAgICAgIC5jd2lzZVByb2R1Y3QodHJhbnNsYXRpb25fc2lnbWEuaW52ZXJzZSgpICogSF9kZWx0YS50cmFuc2xhdGlvbigpKQorICAgICAgICAgICAgICAubWF4Q29lZmYoKSk7CisgICAgICBkb3VibGUgbWF4X3JvdGF0aW9uX3pfc2NvcmUgPSBzdGQ6OnNxcnQoc3RhdGljX2Nhc3Q8ZG91YmxlPigKKyAgICAgICAgICAoZGVsdGFfcm90YXRpb24uYXJyYXkoKSAqCisgICAgICAgICAgIChyb3RhdGlvbl9zaWdtYS5pbnZlcnNlKCkgKiBkZWx0YV9yb3RhdGlvbikuYXJyYXkoKSkKKyAgICAgICAgICAgICAgLm1heENvZWZmKCkpKTsKKyAgICAgIGRvdWJsZSB6X3Njb3JlID0gc3RkOjptYXgobWF4X3RyYW5zbGF0aW9uX3pfc2NvcmUsIG1heF9yb3RhdGlvbl96X3Njb3JlKTsKKyAgICAgIC8vIFJlbW92ZSBvYnNlcnZhdGlvbnMgdGhhdCB2YXJ5IHNpZ25pZmljYW50bHkgZnJvbSB0aGUgbWVhbgorICAgICAgaWYgKHpfc2NvcmUgPiBhYnNsOjpHZXRGbGFnKEZMQUdTX291dGxpZXJfc3RkX2RldnMpKSB7CisgICAgICAgIFZMT0coMSkgPDwgIlJlbW92aW5nIG91dGxpZXIgd2l0aCB6X3Njb3JlICIgPDwgel9zY29yZQorICAgICAgICAgICAgICAgIDw8ICIgcmVsYXRpdmUgdG8gc3RkIGRldiA9ICIKKyAgICAgICAgICAgICAgICA8PCBhYnNsOjpHZXRGbGFnKEZMQUdTX291dGxpZXJfc3RkX2RldnMpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9OworICAgIHBvc2VfbGlzdC5lcmFzZSgKKyAgICAgICAgc3RkOjpyZW1vdmVfaWYocG9zZV9saXN0LmJlZ2luKCksIHBvc2VfbGlzdC5lbmQoKSwgcmVtb3ZlX2xhbWJkYSksCisgICAgICAgIHBvc2VfbGlzdC5lbmQoKSk7CisKKyAgICBWTE9HKDEpIDw8ICJJdGVyYXRpb24gIyIgPDwgaSA8PCAiOiByZW1vdmVkICIKKyAgICAgICAgICAgIDw8IChvcmlnaW5hbF9zaXplIC0gcG9zZV9saXN0LnNpemUoKSkKKyAgICAgICAgICAgIDw8ICIgb3V0bGllciBjb25zdHJhaW50cyBvdXQgb2YgIiA8PCBvcmlnaW5hbF9zaXplCisgICAgICAgICAgICA8PCAiIHRvdGFsXG5TdGQgRGV2J3MgYXJlOiAiCisgICAgICAgICAgICA8PCB0cmFuc2xhdGlvbl92YXJpYW5jZS5hcnJheSgpLnNxcnQoKS50cmFuc3Bvc2UoKSA8PCAibSBhbmQgIgorICAgICAgICAgICAgPDwgcm90YXRpb25fdmFyaWFuY2UuYXJyYXkoKS5zcXJ0KCkudHJhbnNwb3NlKCkgKiAxODAuMCAvIE1fUEkKKyAgICAgICAgICAgIDw8ICJkZWciOworICAgIGlmIChvcmlnaW5hbF9zaXplIC0gcG9zZV9saXN0LnNpemUoKSA9PSAwKSB7CisgICAgICBWTE9HKDEpIDw8ICJBdCBzdGVwICIgPDwgaQorICAgICAgICAgICAgICA8PCAiLCBlbmRpbmcgb3V0bGllciByZWplY3Rpb24gZWFybHkgZHVlIHRvIGNvbnZlcmdlbmNlIGF0ICIKKyAgICAgICAgICAgICAgPDwgcG9zZV9saXN0LnNpemUoKSA8PCAiIGVsZW1lbnRzLlxuU3RkIERldidzIGFyZTogIgorICAgICAgICAgICAgICA8PCB0cmFuc2xhdGlvbl92YXJpYW5jZS5hcnJheSgpLnNxcnQoKS50cmFuc3Bvc2UoKSA8PCAibSBhbmQgIgorICAgICAgICAgICAgICA8PCByb3RhdGlvbl92YXJpYW5jZS5hcnJheSgpLnNxcnQoKS50cmFuc3Bvc2UoKSAqIDE4MC4wIC8gTV9QSQorICAgICAgICAgICAgICA8PCAiZGVnIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgc3RkOjptYXA8c3RkOjpzdHJpbmcsIGFvczo6ZGlzdHJpYnV0ZWRfY2xvY2s6OnRpbWVfcG9pbnQ+CisgICAgbGFzdF9lb2ZzX2RlYnVnOworaW50IGRpc3BsYXlfY291bnQgPSAxOworCisvLyBUYWtlIGluIGxpc3Qgb2YgcG9zZXMgZnJvbSBhIGNhbWVyYSBvYnNlcnZhdGlvbiBhbmQgYWRkIHRvIHJ1bm5pbmcgbGlzdAorLy8gT25lIG9mIHR3byBvcHRpb25zOgorLy8gMSkgV2Ugc2VlIHR3byBib2FyZHMgaW4gb25lIHZpZXctLSBzdG9yZSB0aGlzIHRvIGdldCBhbiBlc3RpbWF0ZSBvZgorLy8gdGhlIG9mZnNldCBiZXR3ZWVuIHRoZSB0d28gYm9hcmRzCisvLyAyKSBXZSBzZWUganVzdCBvbmUgYm9hcmQtLSBzYXZlIHRoaXMgYW5kIHRyeSB0byBwYWlyIGl0IHdpdGggYSBwcmV2aW91cworLy8gb2JzZXJ2YXRpb24gZnJvbSBhbm90aGVyIGNhbWVyYQogdm9pZCBIYW5kbGVQb3Nlcyhjdjo6TWF0IHJnYl9pbWFnZSwKICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8VGFyZ2V0TWFwcGVyOjpUYXJnZXRQb3NlPiB0YXJnZXRfcG9zZXMsCiAgICAgICAgICAgICAgICAgIGFvczo6ZGlzdHJpYnV0ZWRfY2xvY2s6OnRpbWVfcG9pbnQgZGlzdHJpYnV0ZWRfZW9mLAogICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjYW1lcmFfbmFtZSkgewotICAvLyBUaGlzIGlzIHVzZWQgdG8gdHJhbnNmb3JtIHBvaW50cyBmb3IgdmlzdWFsaXphdGlvbgorICAvLyBUaGlzIChIX3dvcmxkX2JvYXJkKSBpcyB1c2VkIHRvIHRyYW5zZm9ybSBwb2ludHMgZm9yIHZpc3VhbGl6YXRpb24KICAgLy8gQXNzdW1lcyB0YXJnZXRzIGFyZSBhbGlnbmVkIHdpdGggeC0+cmlnaHQsIHktPnVwLCB6LT5vdXQgb2YgYm9hcmQKICAgRWlnZW46OkFmZmluZTNkIEhfd29ybGRfYm9hcmQ7CiAgIEhfd29ybGRfYm9hcmQgPSBFaWdlbjo6VHJhbnNsYXRpb24zZDo6SWRlbnRpdHkoKSAqCkBAIC0yMjksNiArMjU2LDE1IEBACiAgICAgLy8gU3RvcmUgdGhpcyBvYnNlcnZhdGlvbiBvZiB0aGUgdHJhbnNmb3JtIGJldHdlZW4gdHdvIGJvYXJkcwogICAgIHR3b19ib2FyZF9leHRyaW5zaWNzX2xpc3QucHVzaF9iYWNrKGJvYXJkQV9ib2FyZEIpOwogCisgICAgLy8gQWxzbywgc3RvcmUgb25lIG9mIHRoZSBvYnNlcnZhdGlvbnMsIHNvIHdlIGNhbiBwb3RlbnRpYWxseQorICAgIC8vIG1hdGNoIGFnYWluc3QgdGhlIG5leHQgc2luZ2xlLXRhcmdldCBvYnNlcnZhdGlvbiB0aGF0IGNvbWVzIGluCisgICAgVGltZXN0YW1wZWRDYW1lcmFEZXRlY3Rpb24gbmV3X29ic2VydmF0aW9ueworICAgICAgICAudGltZSA9IGRpc3RyaWJ1dGVkX2VvZiwKKyAgICAgICAgLkhfY2FtZXJhX3RhcmdldCA9IEhfY2FtZXJhX2JvYXJkQSwKKyAgICAgICAgLmNhbWVyYV9uYW1lID0gY2FtZXJhX25hbWUsCisgICAgICAgIC5ib2FyZF9pZCA9IHRhcmdldF9wb3Nlc1tmcm9tX2luZGV4XS5pZH07CisgICAgbGFzdF9vYnNlcnZhdGlvbiA9IG5ld19vYnNlcnZhdGlvbjsKKwogICAgIGlmIChhYnNsOjpHZXRGbGFnKEZMQUdTX3Zpc3VhbGl6ZSkpIHsKICAgICAgIHZpc19yb2JvdF8uRHJhd0ZyYW1lQXhlcygKICAgICAgICAgICBIX3dvcmxkX2JvYXJkLApAQCAtMjUyLDggKzI4OCw5IEBACiAgICAgICAgIC5ib2FyZF9pZCA9IHRhcmdldF9wb3Nlc1swXS5pZH07CiAKICAgICAvLyBPbmx5IHRha2UgdHdvIG9ic2VydmF0aW9ucyBpZiB0aGV5J3JlIHdpdGhpbiBoYWxmIGFuIGltYWdlIGN5Y2xlIG9mCi0gICAgLy8gZWFjaCBvdGhlciAoaS5lLiwgYXMgY2xvc2UgaW4gdGltZSBhcyBwb3NzaWJsZSkgQW5kLCBpZiB0d28gY29uc2VjdXRpdmUKLSAgICAvLyBvYnNlcnZhdGlvbnMgYXJlIGZyb20gdGhlIHNhbWUgY2FtZXJhLCBqdXN0IHJlcGxhY2Ugd2l0aCB0aGUgbmV3ZXN0IG9uZQorICAgIC8vIGVhY2ggb3RoZXIgKGkuZS4sIGFzIGNsb3NlIGluIHRpbWUgYXMgcG9zc2libGUpLiAgQW5kLCBpZiB0d28KKyAgICAvLyBjb25zZWN1dGl2ZSBvYnNlcnZhdGlvbnMgYXJlIGZyb20gdGhlIHNhbWUgY2FtZXJhLCBqdXN0IHJlcGxhY2Ugd2l0aAorICAgIC8vIHRoZSBuZXdlc3Qgb25lCiAgICAgaWYgKChuZXdfb2JzZXJ2YXRpb24uY2FtZXJhX25hbWUgIT0gbGFzdF9vYnNlcnZhdGlvbi5jYW1lcmFfbmFtZSkgJiYKICAgICAgICAgKHN0ZDo6YWJzKChkaXN0cmlidXRlZF9lb2YgLSBsYXN0X29ic2VydmF0aW9uLnRpbWUpLmNvdW50KCkpIDwKICAgICAgICAgIGtJbWFnZVBlcmlvZE1zIC8gMi4wICogMTAwMDAwMC4wKSkgewpAQCAtMjcxLDQ0ICszMDgsNTEgQEAKICAgICAgIGRldGVjdGlvbl9saXN0LnB1c2hfYmFjayhuZXdfcGFpcik7CiAKICAgICAgIC8vIFRoaXMgYml0IGlzIGp1c3QgZm9yIHZpc3VhbGl6YXRpb24gYW5kIGNoZWNraW5nIHB1cnBvc2VzLS0gdXNlIHRoZQotICAgICAgLy8gbGFzdCB0d28tYm9hcmQgb2JzZXJ2YXRpb24gdG8gZmlndXJlIG91dCB0aGUgY3VycmVudCBlc3RpbWF0ZQotICAgICAgLy8gYmV0d2VlbiB0aGUgdHdvIGNhbWVyYXMKKyAgICAgIC8vIGZpcnN0IHR3by1ib2FyZCBvYnNlcnZhdGlvbiB0byBmaWd1cmUgb3V0IHRoZSBjdXJyZW50IGVzdGltYXRlCisgICAgICAvLyBiZXR3ZWVuIHRoZSB0d28gY2FtZXJhcyAodGhpcyBjb3VsZCBiZSBpbmNvcnJlY3QsIGJ1dCBpdCBrZWVwcyBpdAorICAgICAgLy8gY29uc3RhbnQpCiAgICAgICBpZiAoYWJzbDo6R2V0RmxhZyhGTEFHU192aXN1YWxpemUpICYmCiAgICAgICAgICAgdHdvX2JvYXJkX2V4dHJpbnNpY3NfbGlzdC5zaXplKCkgPiAwKSB7CiAgICAgICAgIGRyYXdfdmlzID0gdHJ1ZTsKLSAgICAgICAgVGltZXN0YW1wZWRDYW1lcmFEZXRlY3Rpb24gJmxhc3RfdHdvX2JvYXJkX2V4dCA9Ci0gICAgICAgICAgICB0d29fYm9hcmRfZXh0cmluc2ljc19saXN0LmJhY2soKTsKLSAgICAgICAgRWlnZW46OkFmZmluZTNkICZIX2JvYXJkQV9ib2FyZEIgPSBsYXN0X3R3b19ib2FyZF9leHQuSF9jYW1lcmFfdGFyZ2V0OwotICAgICAgICBpbnQgYm9hcmRBX2JvYXJkQl9pZCA9IGxhc3RfdHdvX2JvYXJkX2V4dC5ib2FyZF9pZDsKKyAgICAgICAgVGltZXN0YW1wZWRDYW1lcmFEZXRlY3Rpb24gJmZpcnN0X3R3b19ib2FyZF9leHQgPQorICAgICAgICAgICAgdHdvX2JvYXJkX2V4dHJpbnNpY3NfbGlzdC5mcm9udCgpOworICAgICAgICBFaWdlbjo6QWZmaW5lM2QgJkhfYm9hcmRBX2JvYXJkQiA9IGZpcnN0X3R3b19ib2FyZF9leHQuSF9jYW1lcmFfdGFyZ2V0OworICAgICAgICBpbnQgYm9hcmRBX2lkID0gZmlyc3RfdHdvX2JvYXJkX2V4dC5ib2FyZF9pZDsKIAogICAgICAgICBUaW1lc3RhbXBlZENhbWVyYURldGVjdGlvbiBjYW1lcmExX2JvYXJkQSA9IG5ld19wYWlyLmZpcnN0OwotICAgICAgICBUaW1lc3RhbXBlZENhbWVyYURldGVjdGlvbiBjYW1lcmEyX2JvYXJkQiA9IG5ld19wYWlyLnNlY29uZDsKLSAgICAgICAgLy8gSWYgY2FtZXJhMV9ib2FyZEEgZG9lc24ndCBwb2ludCB0byB0aGUgZmlyc3QgdGFyZ2V0LCB0aGVuIHN3YXAKLSAgICAgICAgLy8gdGhlc2UgdHdvCi0gICAgICAgIGlmIChjYW1lcmExX2JvYXJkQS5ib2FyZF9pZCAhPSBib2FyZEFfYm9hcmRCX2lkKSB7Ci0gICAgICAgICAgY2FtZXJhMV9ib2FyZEEgPSBuZXdfcGFpci5zZWNvbmQ7Ci0gICAgICAgICAgY2FtZXJhMl9ib2FyZEIgPSBuZXdfcGFpci5maXJzdDsKKyAgICAgICAgVGltZXN0YW1wZWRDYW1lcmFEZXRlY3Rpb24gY2FtZXJhMl9ib2FyZEEgPSBuZXdfcGFpci5zZWNvbmQ7CisgICAgICAgIEVpZ2VuOjpBZmZpbmUzZCBIX2NhbWVyYTFfYm9hcmRBID0gY2FtZXJhMV9ib2FyZEEuSF9jYW1lcmFfdGFyZ2V0OworICAgICAgICBFaWdlbjo6QWZmaW5lM2QgSF9jYW1lcmEyX2JvYXJkQSA9IGNhbWVyYTJfYm9hcmRBLkhfY2FtZXJhX3RhcmdldDsKKyAgICAgICAgLy8gSWYgY2FtZXJhMV9ib2FyZEEgZG9lc24ndCBjdXJyZW50bHkgcG9pbnQgdG8gYm9hcmRBLCB0aGVuIGZpeCBpdAorICAgICAgICBpZiAoY2FtZXJhMV9ib2FyZEEuYm9hcmRfaWQgIT0gYm9hcmRBX2lkKSB7CisgICAgICAgICAgSF9jYW1lcmExX2JvYXJkQSA9IEhfY2FtZXJhMV9ib2FyZEEgKiBIX2JvYXJkQV9ib2FyZEIuaW52ZXJzZSgpOworICAgICAgICB9CisgICAgICAgIC8vIElmIGNhbWVyYTJfYm9hcmRBIGRvZXNuJ3QgY3VycmVudGx5IHBvaW50IHRvIGJvYXJkQSwgdGhlbiBmaXggaXQKKyAgICAgICAgaWYgKGNhbWVyYTJfYm9hcmRBLmJvYXJkX2lkICE9IGJvYXJkQV9pZCkgeworICAgICAgICAgIEhfY2FtZXJhMl9ib2FyZEEgPSBIX2NhbWVyYTJfYm9hcmRBICogSF9ib2FyZEFfYm9hcmRCLmludmVyc2UoKTsKICAgICAgICAgfQogICAgICAgICBWTE9HKDEpIDw8ICJDYW1lcmEgIiA8PCBjYW1lcmExX2JvYXJkQS5jYW1lcmFfbmFtZSA8PCAiIHNlZWluZyBib2FyZCAiCiAgICAgICAgICAgICAgICAgPDwgY2FtZXJhMV9ib2FyZEEuYm9hcmRfaWQgPDwgIiBhbmQgY2FtZXJhICIKLSAgICAgICAgICAgICAgICA8PCBjYW1lcmEyX2JvYXJkQi5jYW1lcmFfbmFtZSA8PCAiIHNlZWluZyBib2FyZCAiCi0gICAgICAgICAgICAgICAgPDwgY2FtZXJhMl9ib2FyZEIuYm9hcmRfaWQ7CisgICAgICAgICAgICAgICAgPDwgY2FtZXJhMl9ib2FyZEEuY2FtZXJhX25hbWUgPDwgIiBzZWVpbmcgYm9hcmQgIgorICAgICAgICAgICAgICAgIDw8IGNhbWVyYTJfYm9hcmRBLmJvYXJkX2lkOwogCi0gICAgICAgIHZpc19yb2JvdF8uRHJhd1JvYm90T3V0bGluZSgKLSAgICAgICAgICAgIEhfd29ybGRfYm9hcmQgKiBjYW1lcmExX2JvYXJkQS5IX2NhbWVyYV90YXJnZXQuaW52ZXJzZSgpLAotICAgICAgICAgICAgY2FtZXJhMV9ib2FyZEEuY2FtZXJhX25hbWUsCi0gICAgICAgICAgICBrT3JpbkNvbG9ycy5hdChjYW1lcmExX2JvYXJkQS5jYW1lcmFfbmFtZSkpOwotICAgICAgICB2aXNfcm9ib3RfLkRyYXdSb2JvdE91dGxpbmUoCi0gICAgICAgICAgICBIX3dvcmxkX2JvYXJkICogSF9ib2FyZEFfYm9hcmRCICoKLSAgICAgICAgICAgICAgICBjYW1lcmEyX2JvYXJkQi5IX2NhbWVyYV90YXJnZXQuaW52ZXJzZSgpLAotICAgICAgICAgICAgY2FtZXJhMl9ib2FyZEIuY2FtZXJhX25hbWUsCi0gICAgICAgICAgICBrT3JpbkNvbG9ycy5hdChjYW1lcmEyX2JvYXJkQi5jYW1lcmFfbmFtZSkpOworICAgICAgICAvLyBEcmF3IHRoZSB0d28gcG9zZXMgb2YgdGhlIGNhbWVyYXMsIGFuZCB0aGUgbG9jYXRpb25zIG9mIHRoZQorICAgICAgICAvLyBib2FyZHMgV2UgdXNlICJCb2FyZCBBIiBhcyB0aGUgb3JpZ2luICh3aXRoIGV2ZXJ5dGhpbmcgcmVsYXRpdmUKKyAgICAgICAgLy8gdG8gSF93b3JsZF9ib2FyZCkKKyAgICAgICAgdmlzX3JvYm90Xy5EcmF3Um9ib3RPdXRsaW5lKEhfd29ybGRfYm9hcmQgKiBIX2NhbWVyYTFfYm9hcmRBLmludmVyc2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYTFfYm9hcmRBLmNhbWVyYV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga09yaW5Db2xvcnMuYXQoY2FtZXJhMV9ib2FyZEEuY2FtZXJhX25hbWUpKTsKKyAgICAgICAgdmlzX3JvYm90Xy5EcmF3Um9ib3RPdXRsaW5lKEhfd29ybGRfYm9hcmQgKiBIX2NhbWVyYTJfYm9hcmRBLmludmVyc2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYTJfYm9hcmRBLmNhbWVyYV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga09yaW5Db2xvcnMuYXQoY2FtZXJhMl9ib2FyZEEuY2FtZXJhX25hbWUpKTsKICAgICAgICAgdmlzX3JvYm90Xy5EcmF3RnJhbWVBeGVzKAogICAgICAgICAgICAgSF93b3JsZF9ib2FyZCwKLSAgICAgICAgICAgIHN0ZDo6c3RyaW5nKCJCb2FyZCAiKSArIHN0ZDo6dG9fc3RyaW5nKGxhc3RfdHdvX2JvYXJkX2V4dC5ib2FyZF9pZCksCisgICAgICAgICAgICBzdGQ6OnN0cmluZygiQm9hcmQgIikgKworICAgICAgICAgICAgICAgIHN0ZDo6dG9fc3RyaW5nKGZpcnN0X3R3b19ib2FyZF9leHQuYm9hcmRfaWQpLAogICAgICAgICAgICAgY3Y6OlNjYWxhcigwLCAyNTUsIDApKTsKICAgICAgICAgdmlzX3JvYm90Xy5EcmF3RnJhbWVBeGVzKEhfd29ybGRfYm9hcmQgKiBIX2JvYXJkQV9ib2FyZEIsICJCb2FyZCBCIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN2OjpTY2FsYXIoMjU1LCAwLCAwKSk7CisKICAgICAgICAgVkxPRygxKSA8PCAiU3RvcmluZyBvYnNlcnZhdGlvbiBiZXR3ZWVuICIgPDwgbmV3X3BhaXIuZmlyc3QuY2FtZXJhX25hbWUKICAgICAgICAgICAgICAgICA8PCAiLCB0YXJnZXQgIiA8PCBuZXdfcGFpci5maXJzdC5ib2FyZF9pZCA8PCAiIGFuZCAiCiAgICAgICAgICAgICAgICAgPDwgbmV3X3BhaXIuc2Vjb25kLmNhbWVyYV9uYW1lIDw8ICIsIHRhcmdldCAiCkBAIC0zNDEsNiArMzg1LDEwIEBACiAgICAgfQogCiAgICAgaWYgKGRyYXdfdmlzKSB7CisgICAgICBjdjo6cHV0VGV4dCh2aXNfcm9ib3RfLmltYWdlXywKKyAgICAgICAgICAgICAgICAgICJEaXNwbGF5ICMiICsgc3RkOjp0b19zdHJpbmcoZGlzcGxheV9jb3VudCsrKSwKKyAgICAgICAgICAgICAgICAgIGN2OjpQb2ludCg2MDAsIDEwKSwgY3Y6OkZPTlRfSEVSU0hFWV9QTEFJTiwgMS4wLAorICAgICAgICAgICAgICAgICAgY3Y6OlNjYWxhcigyNTUsIDI1NSwgMjU1KSk7CiAgICAgICBjdjo6aW1zaG93KCJPdmVyaGVhZCBWaWV3IiwgdmlzX3JvYm90Xy5pbWFnZV8pOwogICAgICAgY3Y6OndhaXRLZXkoYWJzbDo6R2V0RmxhZyhGTEFHU193YWl0X2tleSkpOwogICAgICAgdmlzX3JvYm90Xy5DbGVhckltYWdlKCk7CkBAIC0zNTUsNiArNDAzLDE0IEBACiAgIC8vIENyZWF0ZSBlbXB0eSBSR0IgaW1hZ2UgaW4gdGhpcyBjYXNlCiAgIGN2OjpNYXQgcmdiX2ltYWdlOwogICBzdGQ6OnZlY3RvcjxUYXJnZXRNYXBwZXI6OlRhcmdldFBvc2U+IHRhcmdldF9wb3NlczsKKyAgVkxPRygxKSA8PCAiOiBEaWZmIHNpbmNlIGxhc3QgaW1hZ2UgZnJvbSAiIDw8IGNhbWVyYV9uYW1lIDw8ICIgaXMgIgorICAgICAgICAgIDw8IChkaXN0cmlidXRlZF9lb2YgLSBsYXN0X2VvZnNfZGVidWcuYXQoY2FtZXJhX25hbWUpKS5jb3VudCgpIC8KKyAgICAgICAgICAgICAgICAgMTAwMDAwMC4wCisgICAgICAgICAgPDwgIm1zIjsKKworICBpZiAobGFzdF9lb2ZzX2RlYnVnLmZpbmQoY2FtZXJhX25hbWUpID09IGxhc3RfZW9mc19kZWJ1Zy5lbmQoKSkgeworICAgIGxhc3RfZW9mc19kZWJ1Z1tjYW1lcmFfbmFtZV0gPSBkaXN0cmlidXRlZF9lb2Y7CisgIH0KIAogICBmb3IgKGNvbnN0IGF1dG8gKnRhcmdldF9wb3NlX2ZicyA6ICptYXAudGFyZ2V0X3Bvc2VzKCkpIHsKICAgICAvLyBTa2lwIGRldGVjdGlvbnMgd2l0aCBpbnZhbGlkIGlkcwpAQCAtMzg0LDcgKzQ0MCw3IEBACiAgICAgfQogCiAgICAgY29uc3QgVGFyZ2V0TWFwcGVyOjpUYXJnZXRQb3NlIHRhcmdldF9wb3NlID0KLSAgICAgICAgUG9zZVV0aWxzOjpUYXJnZXRQb3NlRnJvbUZicygqdGFyZ2V0X3Bvc2VfZmJzKTsKKyAgICAgICAgVGFyZ2V0TWFwcGVyOjpUYXJnZXRQb3NlRnJvbUZicygqdGFyZ2V0X3Bvc2VfZmJzKTsKIAogICAgIHRhcmdldF9wb3Nlcy5lbXBsYWNlX2JhY2sodGFyZ2V0X3Bvc2UpOwogCkBAIC0zOTMsNyArNDQ5LDEzIEBACiAgICAgVkxPRygxKSA8PCBjYW1lcmFfbmFtZSA8PCAiIHNhdyB0YXJnZXQgIiA8PCB0YXJnZXRfcG9zZS5pZAogICAgICAgICAgICAgPDwgIiBmcm9tIFRhcmdldE1hcCBhdCB0aW1lc3RhbXAgIiA8PCBkaXN0cmlidXRlZF9lb2YKICAgICAgICAgICAgIDw8ICIgd2l0aCBwb3NlID0gIiA8PCBIX2NhbWVyYV90YXJnZXQubWF0cml4KCk7CisgICAgTE9HKElORk8pIDw8ICJwb3NlIGluZm8gZm9yIHRhcmdldCAiIDw8IHRhcmdldF9wb3NlX2Zicy0+aWQoKQorICAgICAgICAgICAgICA8PCAiOiBcbmNvbmZpZGVuY2U6ICIgPDwgdGFyZ2V0X3Bvc2VfZmJzLT5jb25maWRlbmNlKCkKKyAgICAgICAgICAgICAgPDwgIiwgcG9zZV9lcnJvcjogIiA8PCB0YXJnZXRfcG9zZV9mYnMtPnBvc2VfZXJyb3IoKQorICAgICAgICAgICAgICA8PCAiLCBwb3NlX2Vycm9yX3JhdGlvOiAiIDw8IHRhcmdldF9wb3NlX2Zicy0+cG9zZV9lcnJvcl9yYXRpbygpCisgICAgICAgICAgICAgIDw8ICIsIGRpc3RfZmFjdG9yOiAiIDw8IHRhcmdldF9wb3NlX2Zicy0+ZGlzdG9ydGlvbl9mYWN0b3IoKTsKICAgfQorICBsYXN0X2VvZnNfZGVidWdbY2FtZXJhX25hbWVdID0gZGlzdHJpYnV0ZWRfZW9mOwogICBIYW5kbGVQb3NlcyhyZ2JfaW1hZ2UsIHRhcmdldF9wb3NlcywgZGlzdHJpYnV0ZWRfZW9mLCBjYW1lcmFfbmFtZSk7CiB9CiAKQEAgLTQzMiwxMiArNDk0LDU5IEBACiAgIEhhbmRsZVBvc2VzKHJnYl9pbWFnZSwgdGFyZ2V0X3Bvc2VzLCBkaXN0cmlidXRlZF9lb2YsIGNhbWVyYV9uYW1lKTsKIH0KIAordm9pZCBXcml0ZUV4dHJpbnNpY0ZpbGUoRWlnZW46OkFmZmluZTNkIGV4dHJpbnNpYywgQ2FtZXJhTm9kZSBjYW1lcmFfbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbGlicmF0aW9uOjpDYW1lcmFDYWxpYnJhdGlvbiAqb3JpZ2luYWxfY2FsKSB7CisgIC8vIFdyaXRlIG91dCB0aGlzIGV4dHJpbnNpYyB0byBhIGZpbGUKKyAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyIGZiYjsKKyAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGZsb2F0Pj4gZGF0YV9vZmZzZXQgPQorICAgICAgZmJiLkNyZWF0ZVZlY3RvcihmcmM5NzE6OnZpc2lvbjo6TWF0cml4VG9WZWN0b3IoZXh0cmluc2ljLm1hdHJpeCgpKSk7CisgIGNhbGlicmF0aW9uOjpUcmFuc2Zvcm1hdGlvbk1hdHJpeDo6QnVpbGRlciBtYXRyaXhfYnVpbGRlcihmYmIpOworICBtYXRyaXhfYnVpbGRlci5hZGRfZGF0YShkYXRhX29mZnNldCk7CisgIGZsYXRidWZmZXJzOjpPZmZzZXQ8Y2FsaWJyYXRpb246OlRyYW5zZm9ybWF0aW9uTWF0cml4PgorICAgICAgZXh0cmluc2ljX2NhbGlicmF0aW9uX29mZnNldCA9IG1hdHJpeF9idWlsZGVyLkZpbmlzaCgpOworCisgIGNhbGlicmF0aW9uOjpDYW1lcmFDYWxpYnJhdGlvbjo6QnVpbGRlciBjYWxpYnJhdGlvbl9idWlsZGVyKGZiYik7CisgIGNhbGlicmF0aW9uX2J1aWxkZXIuYWRkX2ZpeGVkX2V4dHJpbnNpY3MoZXh0cmluc2ljX2NhbGlicmF0aW9uX29mZnNldCk7CisgIGNvbnN0IGFvczo6cmVhbHRpbWVfY2xvY2s6OnRpbWVfcG9pbnQgcmVhbHRpbWVfbm93ID0KKyAgICAgIGFvczo6cmVhbHRpbWVfY2xvY2s6Om5vdygpOworICBjYWxpYnJhdGlvbl9idWlsZGVyLmFkZF9jYWxpYnJhdGlvbl90aW1lc3RhbXAoCisgICAgICByZWFsdGltZV9ub3cudGltZV9zaW5jZV9lcG9jaCgpLmNvdW50KCkpOworICBmYmIuRmluaXNoKGNhbGlicmF0aW9uX2J1aWxkZXIuRmluaXNoKCkpOworICBhb3M6OkZsYXRidWZmZXJEZXRhY2hlZEJ1ZmZlcjxjYWxpYnJhdGlvbjo6Q2FtZXJhQ2FsaWJyYXRpb24+CisgICAgICBzb2x2ZWRfZXh0cmluc2ljcyA9IGZiYi5SZWxlYXNlKCk7CisKKyAgYW9zOjpGbGF0YnVmZmVyRGV0YWNoZWRCdWZmZXI8ZnJjOTcxOjp2aXNpb246OmNhbGlicmF0aW9uOjpDYW1lcmFDYWxpYnJhdGlvbj4KKyAgICAgIGNhbF9jb3B5ID0gYW9zOjpSZWN1cnNpdmVDb3B5RmxhdEJ1ZmZlcihvcmlnaW5hbF9jYWwpOworICBjYWxfY29weS5tdXRhYmxlX21lc3NhZ2UoKS0+Y2xlYXJfZml4ZWRfZXh0cmluc2ljcygpOworICBjYWxfY29weS5tdXRhYmxlX21lc3NhZ2UoKS0+Y2xlYXJfY2FsaWJyYXRpb25fdGltZXN0YW1wKCk7CisgIGFvczo6RmxhdGJ1ZmZlckRldGFjaGVkQnVmZmVyPGNhbGlicmF0aW9uOjpDYW1lcmFDYWxpYnJhdGlvbj4KKyAgICAgIG1lcmdlZF9jYWxpYnJhdGlvbiA9IGFvczo6TWVyZ2VGbGF0QnVmZmVycygmY2FsX2NvcHkubWVzc2FnZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzb2x2ZWRfZXh0cmluc2ljcy5tZXNzYWdlKCkpOworCisgIHN0ZDo6c3RyaW5nc3RyZWFtIHRpbWVfc3M7CisgIHRpbWVfc3MgPDwgcmVhbHRpbWVfbm93OworCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGNhbGlicmF0aW9uX2ZpbGVuYW1lID0gZnJjOTcxOjp2aXNpb246OkNhbGlicmF0aW9uRmlsZW5hbWUoCisgICAgICBhYnNsOjpHZXRGbGFnKEZMQUdTX291dHB1dF9mb2xkZXIpLCBjYW1lcmFfbm9kZS5ub2RlX25hbWUsCisgICAgICBhYnNsOjpHZXRGbGFnKEZMQUdTX3RlYW1fbnVtYmVyKSwgY2FtZXJhX25vZGUuY2FtZXJhX251bWJlciwKKyAgICAgIGNhbF9jb3B5Lm1lc3NhZ2UoKS5jYW1lcmFfaWQoKS0+ZGF0YSgpLCB0aW1lX3NzLnN0cigpKTsKKyAgTE9HKElORk8pIDw8IGNhbGlicmF0aW9uX2ZpbGVuYW1lIDw8ICIgLT4gIgorICAgICAgICAgICAgPDwgYW9zOjpGbGF0YnVmZmVyVG9Kc29uKG1lcmdlZF9jYWxpYnJhdGlvbiwgey5tdWx0aV9saW5lID0gdHJ1ZX0pOworCisgIGFvczo6dXRpbDo6V3JpdGVTdHJpbmdUb0ZpbGVPckRpZSgKKyAgICAgIGNhbGlicmF0aW9uX2ZpbGVuYW1lLAorICAgICAgYW9zOjpGbGF0YnVmZmVyVG9Kc29uKG1lcmdlZF9jYWxpYnJhdGlvbiwgey5tdWx0aV9saW5lID0gdHJ1ZX0pKTsKK30KKwogdm9pZCBFeHRyaW5zaWNzTWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKSB7CiAgIHZpc19yb2JvdF8gPSBWaXN1YWxpemVSb2JvdChjdjo6U2l6ZSgxMDAwLCAxMDAwKSk7CiAgIHZpc19yb2JvdF8uQ2xlYXJJbWFnZSgpOwogICBjb25zdCBkb3VibGUga0ZvY2FsTGVuZ3RoID0gMTAwMC4wOwogICBjb25zdCBpbnQga0ltYWdlV2lkdGggPSAxMDAwOwogICB2aXNfcm9ib3RfLlNldERlZmF1bHRWaWV3cG9pbnQoa0ltYWdlV2lkdGgsIGtGb2NhbExlbmd0aCk7CisgIExPRyhJTkZPKSA8PCAiQ09QWVRISVMsIGNvdW50LCBjYW1lcmFfbmFtZSwgdGFyZ2V0X2lkLCB0aW1lc3RhbXAsIG1hZ19ULCAiCisgICAgICAgICAgICAgICAibWFnX1JfZGVnLCAiCisgICAgICAgICAgICAgICAiY29uZmlkZW5jZSwgcG9zZV9lcnJvciwgcG9zZV9lcnJvcl9yYXRpbywgZGlzdG9ydGlvbl9mYWN0b3IiOwogCiAgIHN0ZDo6b3B0aW9uYWw8YW9zOjpGbGF0YnVmZmVyRGV0YWNoZWRCdWZmZXI8YW9zOjpDb25maWd1cmF0aW9uPj4gY29uZmlnID0KICAgICAgIChhYnNsOjpHZXRGbGFnKEZMQUdTX2NvbmZpZykuZW1wdHkoKQpAQCAtNDY3LDcgKzU3Niw2IEBACiAKICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPGFvczo6RXZlbnRMb29wPj4gZGV0ZWN0aW9uX2V2ZW50X2xvb3BzOwogICBzdGQ6OnZlY3RvcjxmcmM5NzE6OnZpc2lvbjo6Q2hhcnVjb0V4dHJhY3RvciAqPiBjaGFydWNvX2V4dHJhY3RvcnM7Ci0gIHN0ZDo6dmVjdG9yPGZyYzk3MTo6dmlzaW9uOjpJbWFnZUNhbGxiYWNrICo+IGltYWdlX2NhbGxiYWNrczsKICAgc3RkOjp2ZWN0b3I8RWlnZW46OkFmZmluZTNkPiBkZWZhdWx0X2V4dHJpbnNpY3M7CiAKICAgZm9yIChjb25zdCBDYW1lcmFOb2RlICZjYW1lcmFfbm9kZSA6IG5vZGVfbGlzdCkgewpAQCAtNTE0LDE3ICs2MjIsNTAgQEAKICAgICAgICAgfSk7CiAgICAgVkxPRygxKSA8PCAiQ3JlYXRlZCB3YXRjaGVyIGZvciB1c2luZyB0aGUgZGV0ZWN0aW9uIGV2ZW50IGxvb3AgZm9yICIKICAgICAgICAgICAgIDw8IGNhbWVyYV9ub2RlLmNhbWVyYV9uYW1lKCk7CisKKyAgICAvLyBEaXNwbGF5IGltYWdlcywgaWYgdGhleSBleGlzdAorICAgIHN0ZDo6c3RyaW5nIGNhbWVyYV9uYW1lID0gY2FtZXJhX25vZGUuY2FtZXJhX25hbWUoKTsKKyAgICBkZXRlY3Rpb25fZXZlbnRfbG9vcHMuYmFjaygpLT5NYWtlV2F0Y2hlcigKKyAgICAgICAgY2FtZXJhX25hbWUuY19zdHIoKSwKKyAgICAgICAgW2NhbWVyYV9uYW1lXShjb25zdCBmcmM5NzE6OnZpc2lvbjo6Q2FtZXJhSW1hZ2UgJmltYWdlKSB7CisgICAgICAgICAgY3Y6Ok1hdCBpbWFnZV9jb2xvcl9tYXQoY3Y6OlNpemUoaW1hZ2UuY29scygpLCBpbWFnZS5yb3dzKCkpLCBDVl84VUMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopaW1hZ2UuZGF0YSgpLT5kYXRhKCkpOworICAgICAgICAgIGN2OjpNYXQgYmdyX2ltYWdlKGN2OjpTaXplKGltYWdlLmNvbHMoKSwgaW1hZ2Uucm93cygpKSwgQ1ZfOFVDMyk7CisgICAgICAgICAgY3Y6OmN2dENvbG9yKGltYWdlX2NvbG9yX21hdCwgYmdyX2ltYWdlLCBjdjo6Q09MT1JfWVVWMkJHUl9ZVVlWKTsKKyAgICAgICAgICBjdjo6cmVzaXplKGJncl9pbWFnZSwgYmdyX2ltYWdlLCBjdjo6U2l6ZSg1MDAsIDUwMCkpOworICAgICAgICAgIGN2OjppbXNob3coY2FtZXJhX25hbWUuY19zdHIoKSwgYmdyX2ltYWdlKTsKKyAgICAgICAgICBjdjo6d2FpdEtleSgxKTsKKyAgICAgICAgfSk7CiAgIH0KIAogICByZWFkZXIuZXZlbnRfbG9vcF9mYWN0b3J5KCktPlJ1bigpOwogCi0gIC8vIERvIHF1aWNrIGNoZWNrIHRvIHNlZSB3aGF0IGF2ZXJhZ2VkIHR3by1ib2FyZCBwb3NlIGZvcgotICAvLyBlYWNoIGNhbWVyYSBpcyBpbmRpdmlkdWFsbHkKICAgQ0hFQ0tfR1QodHdvX2JvYXJkX2V4dHJpbnNpY3NfbGlzdC5zaXplKCksIDB1KQogICAgICAgPDwgIk11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgdmlldyBvZiBib3RoIGJvYXJkcyI7CiAgIGludCBiYXNlX3RhcmdldF9pZCA9IHR3b19ib2FyZF9leHRyaW5zaWNzX2xpc3RbMF0uYm9hcmRfaWQ7CiAgIFZMT0coMSkgPDwgIkJhc2UgaWQgZm9yIHR3b19ib2FyZF9leHRyaW5zaWNzX2xpc3QgaXMgIiA8PCBiYXNlX3RhcmdldF9pZDsKIAorICBpbnQgcHJlX291dGxpZXJfbnVtID0gdHdvX2JvYXJkX2V4dHJpbnNpY3NfbGlzdC5zaXplKCk7CisgIFJlbW92ZU91dGxpZXJzKHR3b19ib2FyZF9leHRyaW5zaWNzX2xpc3QpOworCisgIExPRyhJTkZPKSA8PCAiU3RhcnRlZCB3aXRoICIgPDwgcHJlX291dGxpZXJfbnVtCisgICAgICAgICAgICA8PCAiIG9ic2VydmF0aW9ucy4gIEFmdGVyIE9VVExJRVIgcmVqZWN0aW9uLCAiCisgICAgICAgICAgICA8PCB0d29fYm9hcmRfZXh0cmluc2ljc19saXN0LnNpemUoKSA8PCAiIG9ic2VydmF0aW9ucyByZW1haW5pbmciOworICBFaWdlbjo6QWZmaW5lM2QgSF9ib2FyZEFfYm9hcmRCX2F2ZyA9CisgICAgICBDb21wdXRlQXZlcmFnZVBvc2UodHdvX2JvYXJkX2V4dHJpbnNpY3NfbGlzdCk7CisgIExPRyhJTkZPKSA8PCAiRXN0aW1hdGUgb2YgdHdvIGJvYXJkIHBvc2UgdXNpbmcgYWxsIG5vZGVzIHdpdGggIgorICAgICAgICAgICAgPDwgdHdvX2JvYXJkX2V4dHJpbnNpY3NfbGlzdC5zaXplKCkgPDwgIiBvYnNlcnZhdGlvbnMgaXM6XG4iCisgICAgICAgICAgICA8PCBIX2JvYXJkQV9ib2FyZEJfYXZnLm1hdHJpeCgpIDw8ICJcbk9yIHRyYW5zbGF0aW9uIG9mICIKKyAgICAgICAgICAgIDw8IEhfYm9hcmRBX2JvYXJkQl9hdmcudHJhbnNsYXRpb24oKS50cmFuc3Bvc2UoKQorICAgICAgICAgICAgPDwgIiAobSkgYW5kIHJvdGF0aW9uIChyLHAseSkgb2YgIgorICAgICAgICAgICAgPDwgUG9zZVV0aWxzOjpSb3RhdGlvbk1hdHJpeFRvRXVsZXJBbmdsZXMoCisgICAgICAgICAgICAgICAgICAgSF9ib2FyZEFfYm9hcmRCX2F2Zy5yb3RhdGlvbigpLm1hdHJpeCgpKQorICAgICAgICAgICAgICAgICAgICAgICAudHJhbnNwb3NlKCkgKgorICAgICAgICAgICAgICAgICAgIDE4MC4wIC8gTV9QSQorICAgICAgICAgICAgPDwgIiAoZGVnKSI7CisKKyAgLy8gRG8gcXVpY2sgY2hlY2sgdG8gc2VlIHdoYXQgYXZlcmFnZWQgdHdvLWJvYXJkIHBvc2UgZm9yCisgIC8vIGVhY2ggY2FtZXJhIGlzIGluZGl2aWR1YWxseSwgYW5kIGNvbXBhcmUgd2l0aCBvdmVyYWxsIGF2ZXJhZ2UKICAgZm9yIChhdXRvIGNhbWVyYV9ub2RlIDogbm9kZV9saXN0KSB7CiAgICAgc3RkOjp2ZWN0b3I8VGltZXN0YW1wZWRDYW1lcmFEZXRlY3Rpb24+IHBvc2VfbGlzdDsKICAgICBmb3IgKGF1dG8gZXh0IDogdHdvX2JvYXJkX2V4dHJpbnNpY3NfbGlzdCkgewpAQCAtNTM0LDMyICs2NzUsNzQgQEAKICAgICAgICAgcG9zZV9saXN0LnB1c2hfYmFjayhleHQpOwogICAgICAgfQogICAgIH0KLSAgICBFaWdlbjo6QWZmaW5lM2QgYXZnX3Bvc2VfZnJvbV9jYW1lcmEgPSBDb21wdXRlQXZlcmFnZVBvc2UocG9zZV9saXN0KTsKLSAgICBWTE9HKDEpIDw8ICJFc3RpbWF0ZSBmcm9tICIgPDwgY2FtZXJhX25vZGUuY2FtZXJhX25hbWUoKSA8PCAiIHdpdGggIgotICAgICAgICAgICAgPDwgcG9zZV9saXN0LnNpemUoKSA8PCAiIG9ic2VydmF0aW9ucyBpczpcbiIKLSAgICAgICAgICAgIDw8IGF2Z19wb3NlX2Zyb21fY2FtZXJhLm1hdHJpeCgpOworICAgIENIRUNLKHBvc2VfbGlzdC5zaXplKCkgPiAwKQorICAgICAgICA8PCAiRGlkbid0IGdldCBhbnkgdHdvX2JvYXJkIGV4dHJpbnNpY3MgZm9yIGNhbWVyYSAiCisgICAgICAgIDw8IGNhbWVyYV9ub2RlLmNhbWVyYV9uYW1lKCk7CisgICAgRWlnZW46OlZlY3RvcjNkIHRyYW5zbGF0aW9uX3ZhcmlhbmNlLCByb3RhdGlvbl92YXJpYW5jZTsKKyAgICBFaWdlbjo6QWZmaW5lM2QgYXZnX3Bvc2VfZnJvbV9jYW1lcmEgPSBDb21wdXRlQXZlcmFnZVBvc2UoCisgICAgICAgIHBvc2VfbGlzdCwgJnRyYW5zbGF0aW9uX3ZhcmlhbmNlLCAmcm90YXRpb25fdmFyaWFuY2UpOworCisgICAgRWlnZW46OlZlY3RvcjNkIHRyYW5zbGF0aW9uX3N0ZF9kZXYgPSB0cmFuc2xhdGlvbl92YXJpYW5jZS5hcnJheSgpLnNxcnQoKTsKKyAgICBMT0coSU5GTykgPDwgY2FtZXJhX25vZGUuY2FtZXJhX25hbWUoKSA8PCAiIGhhcyBhdmVyYWdlIHBvc2UgZnJvbSAiCisgICAgICAgICAgICAgIDw8IHBvc2VfbGlzdC5zaXplKCkgPDwgIiB2aWV3cyBvZiB0d28gdGFyZ2V0cyBvZiBcbiIKKyAgICAgICAgICAgICAgPDwgYXZnX3Bvc2VfZnJvbV9jYW1lcmEubWF0cml4KCkKKyAgICAgICAgICAgICAgPDwgIlxuVHJhbnNsYXRpb24gc3RhbmRhcmQgZGV2aWF0aW9uIGlzICIKKyAgICAgICAgICAgICAgPDwgdHJhbnNsYXRpb25fc3RkX2Rldi50cmFuc3Bvc2UoKTsKKyAgICBkb3VibGUgc3RkZXZfbm9ybSA9IHRyYW5zbGF0aW9uX3N0ZF9kZXYubm9ybSgpOworICAgIGRvdWJsZSB0aHJlc2hvbGQgPSAwLjAzOyAgLy8gMyBjbSB0aHJlc2hvbGQgb24gdHJhbnNsYXRpb24gdmFyaWF0aW9uCisgICAgaWYgKHN0ZGV2X25vcm0gPiB0aHJlc2hvbGQpIHsKKyAgICAgIExPRyhJTkZPKSA8PCAiV0FSTklORzogfFNURF9ERVZ8IGlzICIgPDwgc3RkZXZfbm9ybSAqIDEwMCA8PCAiID4gIgorICAgICAgICAgICAgICAgIDw8IHRocmVzaG9sZCAqIDEwMCA8PCAiIGNtISEhIVxuU3RkIGRldiB2ZWN0b3IgKGluIG0pIGlzICIKKyAgICAgICAgICAgICAgICA8PCB0cmFuc2xhdGlvbl9zdGRfZGV2LnRyYW5zcG9zZSgpOworICAgIH0KKworICAgIEVpZ2VuOjpWZWN0b3IzZCByb3RhdGlvbl9zdGRfZGV2ID0gcm90YXRpb25fdmFyaWFuY2UuYXJyYXkoKS5zcXJ0KCk7CisgICAgTE9HKElORk8pIDw8IGNhbWVyYV9ub2RlLmNhbWVyYV9uYW1lKCkKKyAgICAgICAgICAgICAgPDwgIiB3aXRoIHJvdGF0aW9uYWwgc3RhbmRhcmQgZGV2aWF0aW9uIG9mOiAiCisgICAgICAgICAgICAgIDw8IHJvdGF0aW9uX3N0ZF9kZXYudHJhbnNwb3NlKCkgPDwgIiAocmFkaWFucykiOworICAgIGRvdWJsZSByb3Rfc3RkZXZfbm9ybSA9IHJvdGF0aW9uX3N0ZF9kZXYubm9ybSgpOworICAgIGRvdWJsZSByb3RfdGhyZXNob2xkID0gMyAqIE1fUEkgLyAxODAuMDsgIC8vIFdhcm4gaWYgbW9yZSB0aGFuIDMgZGVncmVlcworICAgIGlmIChyb3Rfc3RkZXZfbm9ybSA+IHJvdF90aHJlc2hvbGQpIHsKKyAgICAgIExPRyhJTkZPKSA8PCAiV0FSTklORzogUk9UQVRJT05BTCBTVEQgREVWIGlzICIKKyAgICAgICAgICAgICAgICA8PCByb3Rfc3RkZXZfbm9ybSAqIDE4MC4wIC8gTV9QSSA8PCAiID4gIgorICAgICAgICAgICAgICAgIDw8IHJvdF90aHJlc2hvbGQgKiAxODAuMCAvIE1fUEkKKyAgICAgICAgICAgICAgICA8PCAiIGRlZ3JlZXMhISEhXG5TdGQgZGV2IHZlY3RvciAoaW4gZGVnKSBpcyAiCisgICAgICAgICAgICAgICAgPDwgKHJvdGF0aW9uX3N0ZF9kZXYgKiAxODAuMCAvIE1fUEkpLnRyYW5zcG9zZSgpOworICAgIH0KKyAgICAvLyBDaGVjayBpZiBhIHBhcnRpY3VsYXIgY2FtZXJhIGRldmlhdGVzIHNpZ25pZmljYW50bHkgZnJvbSB0aGUgb3ZlcmFsbAorICAgIC8vIGF2ZXJhZ2UgQW55IG9mIHRoZXNlIGZhY3RvcnMgY291bGQgaW5kaWNhdGUgYSBwcm9ibGVtIHdpdGggdGhhdCBjYW1lcmEKKyAgICBFaWdlbjo6QWZmaW5lM2QgZGVsdGFfZnJvbV9vdmVyYWxsID0KKyAgICAgICAgSF9ib2FyZEFfYm9hcmRCX2F2ZyAqIGF2Z19wb3NlX2Zyb21fY2FtZXJhLmludmVyc2UoKTsKKyAgICBMT0coSU5GTykgPDwgY2FtZXJhX25vZGUuY2FtZXJhX25hbWUoKQorICAgICAgICAgICAgICA8PCAiIGhhZCBlc3RpbWF0ZSBkaWZmZXJlbnQgZnJvbSBwb29sZWQgYXZlcmFnZSBvZlxuIgorICAgICAgICAgICAgICA8PCAifGRUfCA9ICIgPDwgZGVsdGFfZnJvbV9vdmVyYWxsLnRyYW5zbGF0aW9uKCkubm9ybSgpCisgICAgICAgICAgICAgIDw8ICJtICBhbmQgfGRSfCA9ICIKKyAgICAgICAgICAgICAgPDwgKFBvc2VVdGlsczo6Um90YXRpb25NYXRyaXhUb0V1bGVyQW5nbGVzKAorICAgICAgICAgICAgICAgICAgICAgIGRlbHRhX2Zyb21fb3ZlcmFsbC5yb3RhdGlvbigpLm1hdHJpeCgpKSAqCisgICAgICAgICAgICAgICAgICAxODAuMCAvIE1fUEkpCisgICAgICAgICAgICAgICAgICAgICAubm9ybSgpCisgICAgICAgICAgICAgIDw8ICIgZGVnIjsKICAgfQotICBFaWdlbjo6QWZmaW5lM2QgSF9ib2FyZEFfYm9hcmRCX2F2ZyA9Ci0gICAgICBDb21wdXRlQXZlcmFnZVBvc2UodHdvX2JvYXJkX2V4dHJpbnNpY3NfbGlzdCk7Ci0gIC8vIFRPRE86IFNob3VsZCBwcm9iYWJseSBkbyBzb21lIG91dGxpZXIgcmVqZWN0aW9uCi0gIFZMT0coMSkgPDwgIkVzdGltYXRlIG9mIHR3byBib2FyZCBwb3NlIHVzaW5nIGFsbCBub2RlcyB3aXRoICIKLSAgICAgICAgICA8PCB0d29fYm9hcmRfZXh0cmluc2ljc19saXN0LnNpemUoKSA8PCAiIG9ic2VydmF0aW9ucyBpczpcbiIKLSAgICAgICAgICA8PCBIX2JvYXJkQV9ib2FyZEJfYXZnLm1hdHJpeCgpIDw8ICJcbiI7CiAKICAgLy8gTmV4dCwgY29tcHV0ZSB0aGUgcmVsYXRpdmUgY2FtZXJhIHBvc2VzCiAgIExPRyhJTkZPKSA8PCAiR290ICIgPDwgZGV0ZWN0aW9uX2xpc3Quc2l6ZSgpIDw8ICIgZXh0cmluc2ljIG9ic2VydmF0aW9ucyI7Ci0gIHN0ZDo6dmVjdG9yPEVpZ2VuOjpBZmZpbmUzZD4gSF9jYW1lcmExX2NhbWVyYTJfbGlzdDsKKyAgc3RkOjp2ZWN0b3I8VGltZXN0YW1wZWRDYW1lcmFEZXRlY3Rpb24+IEhfY2FtZXJhMV9jYW1lcmEyX2xpc3Q7CiAgIHN0ZDo6dmVjdG9yPEVpZ2VuOjpBZmZpbmUzZD4gdXBkYXRlZF9leHRyaW5zaWNzOwogICAvLyBVc2UgdGhlIGZpcnN0IG5vZGUncyBleHRyaW5zaWNzIGFzIG91ciBiYXNlLCBhbmQgZml4IGZyb20gdGhlcmUKICAgdXBkYXRlZF9leHRyaW5zaWNzLnB1c2hfYmFjayhkZWZhdWx0X2V4dHJpbnNpY3NbMF0pOwogICBMT0coSU5GTykgPDwgIkRlZmF1bHQgZXh0cmluc2ljIGZvciBjYW1lcmEgIiA8PCBub2RlX2xpc3QuYXQoMCkuY2FtZXJhX25hbWUoKQotICAgICAgICAgICAgPDwgIiBpcyAiIDw8IGRlZmF1bHRfZXh0cmluc2ljc1swXS5tYXRyaXgoKTsKKyAgICAgICAgICAgIDw8ICIgaXNcbiIKKyAgICAgICAgICAgIDw8IGRlZmF1bHRfZXh0cmluc2ljc1swXS5tYXRyaXgoKTsKICAgZm9yICh1aW50IGkgPSAwOyBpIDwgbm9kZV9saXN0LnNpemUoKSAtIDE7IGkrKykgewogICAgIEhfY2FtZXJhMV9jYW1lcmEyX2xpc3QuY2xlYXIoKTsKICAgICAvLyBHbyB0aHJvdWdoIHRoZSBsaXN0LCBhbmQgZmluZCBzdWNjZXNzaXZlIHBhaXJzIG9mCi0gICAgLy8gY2FtZXJhcyBXZSdsbCBiZSBjYWxjdWxhdGluZyBhbmQgd3JpdGluZyB0aGUgc2Vjb25kCi0gICAgLy8gb2YgdGhlIHBhaXIgKHRoZSBpKzEndGggY2FtZXJhKQorICAgIC8vIGNhbWVyYXMuIFdlJ2xsIGJlIGNhbGN1bGF0aW5nIGFuZCB3cml0aW5nIHRoZSBzZWNvbmQKKyAgICAvLyBvZiB0aGUgcGFpcidzICh0aGUgaSsxJ3RoIGNhbWVyYSkgZXh0cmluc2ljcwogICAgIGZvciAoYXV0byBbcG9zZTEsIHBvc2UyXSA6IGRldGVjdGlvbl9saXN0KSB7CisgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBhc3N1bWVzIG91ciBwb3NlcyBhcmUgb3JkZXJlZCBieSB0aGUgbm9kZV9saXN0CisgICAgICBDSEVDSyghKChwb3NlMS5jYW1lcmFfbmFtZSA9PSBub2RlX2xpc3QuYXQoaSArIDEpLmNhbWVyYV9uYW1lKCkpICYmCisgICAgICAgICAgICAgIChwb3NlMi5jYW1lcmFfbmFtZSA9PSBub2RlX2xpc3QuYXQoaSkuY2FtZXJhX25hbWUoKSkpKQorICAgICAgICAgIDw8ICJUaGUgY2FtZXJhIG9yZGVyaW5nIG9uIG91ciBkZXRlY3Rpb25zIGlzIGluY29ycmVjdCEiOwogICAgICAgaWYgKChwb3NlMS5jYW1lcmFfbmFtZSA9PSBub2RlX2xpc3QuYXQoaSkuY2FtZXJhX25hbWUoKSkgJiYKICAgICAgICAgICAocG9zZTIuY2FtZXJhX25hbWUgPT0gbm9kZV9saXN0LmF0KGkgKyAxKS5jYW1lcmFfbmFtZSgpKSkgewogICAgICAgICBFaWdlbjo6QWZmaW5lM2QgSF9jYW1lcmExX2JvYXJkQSA9IHBvc2UxLkhfY2FtZXJhX3RhcmdldDsKQEAgLTU4NCw3ICs3NjcsMTIgQEAKICAgICAgICAgLy8gQ29tcHV0ZSBjYW1lcmExLT5jYW1lcmEyIG1hcAogICAgICAgICBFaWdlbjo6QWZmaW5lM2QgSF9jYW1lcmExX2NhbWVyYTIgPQogICAgICAgICAgICAgSF9jYW1lcmExX2JvYXJkQSAqIEhfY2FtZXJhMl9ib2FyZEEuaW52ZXJzZSgpOwotICAgICAgICBIX2NhbWVyYTFfY2FtZXJhMl9saXN0LnB1c2hfYmFjayhIX2NhbWVyYTFfY2FtZXJhMik7CisgICAgICAgIC8vIFNldCB0aGUgbGlzdCB1cCBhcyBUaW1lc3RhbXBlZENhbWVyYURldGVjdGlvbidzIHRvIHVzZSB0aGUgb3V0bGllcgorICAgICAgICAvLyByZW1vdmFsIGZ1bmN0aW9uCisgICAgICAgIFRpbWVzdGFtcGVkQ2FtZXJhRGV0ZWN0aW9uIGNhbWVyYTFfY2FtZXJhMnsKKyAgICAgICAgICAgIC5IX2NhbWVyYV90YXJnZXQgPSBIX2NhbWVyYTFfY2FtZXJhMiwKKyAgICAgICAgICAgIC5jYW1lcmFfbmFtZSA9IG5vZGVfbGlzdC5hdChpICsgMSkuY2FtZXJhX25hbWUoKX07CisgICAgICAgIEhfY2FtZXJhMV9jYW1lcmEyX2xpc3QucHVzaF9iYWNrKGNhbWVyYTFfY2FtZXJhMik7CiAgICAgICAgIFZMT0coMSkgPDwgIk1hcCBmcm9tIGNhbWVyYSAiIDw8IHBvc2UxLmNhbWVyYV9uYW1lIDw8ICIgYW5kIHRhZyAiCiAgICAgICAgICAgICAgICAgPDwgcG9zZTEuYm9hcmRfaWQgPDwgIiB3aXRoIG9ic2VydmF0aW9uOiBcbiIKICAgICAgICAgICAgICAgICA8PCBwb3NlMS5IX2NhbWVyYV90YXJnZXQubWF0cml4KCkgPDwgIlxuIHRvIGNhbWVyYSAiCkBAIC02MTksNiArODA3LDE3IEBACiAgICAgICAgICAgICAgICAgPDwgSF9jYW1lcmExX2NhbWVyYTJfbGlzdC5zaXplKCkKICAgICAgICAgICAgICAgICA8PCAiIG9ic2VydmF0aW9ucywgYW5kIHRoZSBhdmVyYWdlIHBvc2UgaXM6XG4iCiAgICAgICAgICAgICAgICAgPDwgSF9jYW1lcmExX2NhbWVyYTJfYXZnLm1hdHJpeCgpOworCisgICAgICBSZW1vdmVPdXRsaWVycyhIX2NhbWVyYTFfY2FtZXJhMl9saXN0KTsKKworICAgICAgSF9jYW1lcmExX2NhbWVyYTJfYXZnID0gQ29tcHV0ZUF2ZXJhZ2VQb3NlKEhfY2FtZXJhMV9jYW1lcmEyX2xpc3QpOworICAgICAgTE9HKElORk8pIDw8ICJBZnRlciBvdXRsaWVyIHJlamVjdGlvbiwgZnJvbSAiCisgICAgICAgICAgICAgICAgPDwgbm9kZV9saXN0LmF0KGkpLmNhbWVyYV9uYW1lKCkgPDwgIiB0byAiCisgICAgICAgICAgICAgICAgPDwgbm9kZV9saXN0LmF0KGkgKyAxKS5jYW1lcmFfbmFtZSgpIDw8ICIgZm91bmQgIgorICAgICAgICAgICAgICAgIDw8IEhfY2FtZXJhMV9jYW1lcmEyX2xpc3Quc2l6ZSgpCisgICAgICAgICAgICAgICAgPDwgIiBvYnNlcnZhdGlvbnMsIGFuZCB0aGUgYXZlcmFnZSBwb3NlIGlzOlxuIgorICAgICAgICAgICAgICAgIDw8IEhfY2FtZXJhMV9jYW1lcmEyX2F2Zy5tYXRyaXgoKTsKKwogICAgICAgRWlnZW46OkFmZmluZTNkIEhfY2FtZXJhMV9jYW1lcmEyX2RlZmF1bHQgPQogICAgICAgICAgIGRlZmF1bHRfZXh0cmluc2ljc1tpXS5pbnZlcnNlKCkgKiBkZWZhdWx0X2V4dHJpbnNpY3NbaSArIDFdOwogICAgICAgTE9HKElORk8pIDw8ICJDb21wYXJlIHRoaXMgdG8gdGhhdCBmcm9tIGRlZmF1bHQgdmFsdWVzOlxuIgpAQCAtNjM0LDYgKzgzMyw3IEBACiAgICAgICAgICAgPDwgRWlnZW46OkFuZ2xlQXhpc2QoSF9jYW1lcmExX2NhbWVyYTJfZGlmZi5yb3RhdGlvbigpKS5hbmdsZSgpICoKICAgICAgICAgICAgICAgICAgMTgwLjAgLyBNX1BJCiAgICAgICAgICAgPDwgIiBkZWdyZWVzKSI7CisKICAgICAgIC8vIE5leHQgZXh0cmluc2ljIGlzIGp1c3QgcHJldmlvdXMgb25lICogYXZnX2RlbHRhX3Bvc2UKICAgICAgIEVpZ2VuOjpBZmZpbmUzZCBuZXh0X2V4dHJpbnNpYyA9CiAgICAgICAgICAgdXBkYXRlZF9leHRyaW5zaWNzLmJhY2soKSAqIEhfY2FtZXJhMV9jYW1lcmEyX2F2ZzsKQEAgLTY0NSw1MSArODQ1LDggQEAKICAgICAgICAgICAgICAgICA8PCBub2RlX2xpc3QuYXQoaSArIDEpLmNhbWVyYV9uYW1lKCkgPDwgIiBpcyBcbiIKICAgICAgICAgICAgICAgICA8PCBuZXh0X2V4dHJpbnNpYy5tYXRyaXgoKTsKIAotICAgICAgLy8gV3JpdGUgb3V0IHRoaXMgZXh0cmluc2ljIHRvIGEgZmlsZQotICAgICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyIGZiYjsKLSAgICAgIGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbG9hdD4+IGRhdGFfb2Zmc2V0ID0KLSAgICAgICAgICBmYmIuQ3JlYXRlVmVjdG9yKAotICAgICAgICAgICAgICBmcmM5NzE6OnZpc2lvbjo6TWF0cml4VG9WZWN0b3IobmV4dF9leHRyaW5zaWMubWF0cml4KCkpKTsKLSAgICAgIGNhbGlicmF0aW9uOjpUcmFuc2Zvcm1hdGlvbk1hdHJpeDo6QnVpbGRlciBtYXRyaXhfYnVpbGRlcihmYmIpOwotICAgICAgbWF0cml4X2J1aWxkZXIuYWRkX2RhdGEoZGF0YV9vZmZzZXQpOwotICAgICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxjYWxpYnJhdGlvbjo6VHJhbnNmb3JtYXRpb25NYXRyaXg+Ci0gICAgICAgICAgZXh0cmluc2ljX2NhbGlicmF0aW9uX29mZnNldCA9IG1hdHJpeF9idWlsZGVyLkZpbmlzaCgpOwotCi0gICAgICBjYWxpYnJhdGlvbjo6Q2FtZXJhQ2FsaWJyYXRpb246OkJ1aWxkZXIgY2FsaWJyYXRpb25fYnVpbGRlcihmYmIpOwotICAgICAgY2FsaWJyYXRpb25fYnVpbGRlci5hZGRfZml4ZWRfZXh0cmluc2ljcyhleHRyaW5zaWNfY2FsaWJyYXRpb25fb2Zmc2V0KTsKLSAgICAgIGNvbnN0IGFvczo6cmVhbHRpbWVfY2xvY2s6OnRpbWVfcG9pbnQgcmVhbHRpbWVfbm93ID0KLSAgICAgICAgICBhb3M6OnJlYWx0aW1lX2Nsb2NrOjpub3coKTsKLSAgICAgIGNhbGlicmF0aW9uX2J1aWxkZXIuYWRkX2NhbGlicmF0aW9uX3RpbWVzdGFtcCgKLSAgICAgICAgICByZWFsdGltZV9ub3cudGltZV9zaW5jZV9lcG9jaCgpLmNvdW50KCkpOwotICAgICAgZmJiLkZpbmlzaChjYWxpYnJhdGlvbl9idWlsZGVyLkZpbmlzaCgpKTsKLSAgICAgIGFvczo6RmxhdGJ1ZmZlckRldGFjaGVkQnVmZmVyPGNhbGlicmF0aW9uOjpDYW1lcmFDYWxpYnJhdGlvbj4KLSAgICAgICAgICBzb2x2ZWRfZXh0cmluc2ljcyA9IGZiYi5SZWxlYXNlKCk7Ci0KLSAgICAgIGFvczo6RmxhdGJ1ZmZlckRldGFjaGVkQnVmZmVyPAotICAgICAgICAgIGZyYzk3MTo6dmlzaW9uOjpjYWxpYnJhdGlvbjo6Q2FtZXJhQ2FsaWJyYXRpb24+Ci0gICAgICAgICAgY2FsX2NvcHkgPSBhb3M6OlJlY3Vyc2l2ZUNvcHlGbGF0QnVmZmVyKGNhbGlicmF0aW9uX2xpc3RbaSArIDFdKTsKLSAgICAgIGNhbF9jb3B5Lm11dGFibGVfbWVzc2FnZSgpLT5jbGVhcl9maXhlZF9leHRyaW5zaWNzKCk7Ci0gICAgICBjYWxfY29weS5tdXRhYmxlX21lc3NhZ2UoKS0+Y2xlYXJfY2FsaWJyYXRpb25fdGltZXN0YW1wKCk7Ci0gICAgICBhb3M6OkZsYXRidWZmZXJEZXRhY2hlZEJ1ZmZlcjxjYWxpYnJhdGlvbjo6Q2FtZXJhQ2FsaWJyYXRpb24+Ci0gICAgICAgICAgbWVyZ2VkX2NhbGlicmF0aW9uID0gYW9zOjpNZXJnZUZsYXRCdWZmZXJzKAotICAgICAgICAgICAgICAmY2FsX2NvcHkubWVzc2FnZSgpLCAmc29sdmVkX2V4dHJpbnNpY3MubWVzc2FnZSgpKTsKLQotICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gdGltZV9zczsKLSAgICAgIHRpbWVfc3MgPDwgcmVhbHRpbWVfbm93OwotCi0gICAgICBDYW1lcmFOb2RlICZjYW1lcmFfbm9kZSA9IG5vZGVfbGlzdFtpICsgMV07Ci0gICAgICBjb25zdCBzdGQ6OnN0cmluZyBjYWxpYnJhdGlvbl9maWxlbmFtZSA9Ci0gICAgICAgICAgZnJjOTcxOjp2aXNpb246OkNhbGlicmF0aW9uRmlsZW5hbWUoCi0gICAgICAgICAgICAgIGFic2w6OkdldEZsYWcoRkxBR1Nfb3V0cHV0X2ZvbGRlciksIGNhbWVyYV9ub2RlLm5vZGVfbmFtZSwKLSAgICAgICAgICAgICAgYWJzbDo6R2V0RmxhZyhGTEFHU190ZWFtX251bWJlciksIGNhbWVyYV9ub2RlLmNhbWVyYV9udW1iZXIsCi0gICAgICAgICAgICAgIGNhbF9jb3B5Lm1lc3NhZ2UoKS5jYW1lcmFfaWQoKS0+ZGF0YSgpLCB0aW1lX3NzLnN0cigpKTsKLSAgICAgIExPRyhJTkZPKSA8PCBjYWxpYnJhdGlvbl9maWxlbmFtZSA8PCAiIC0+ICIKLSAgICAgICAgICAgICAgICA8PCBhb3M6OkZsYXRidWZmZXJUb0pzb24obWVyZ2VkX2NhbGlicmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Lm11bHRpX2xpbmUgPSB0cnVlfSk7Ci0KLSAgICAgIGFvczo6dXRpbDo6V3JpdGVTdHJpbmdUb0ZpbGVPckRpZSgKLSAgICAgICAgICBjYWxpYnJhdGlvbl9maWxlbmFtZSwKLSAgICAgICAgICBhb3M6OkZsYXRidWZmZXJUb0pzb24obWVyZ2VkX2NhbGlicmF0aW9uLCB7Lm11bHRpX2xpbmUgPSB0cnVlfSkpOworICAgICAgV3JpdGVFeHRyaW5zaWNGaWxlKG5leHRfZXh0cmluc2ljLCBub2RlX2xpc3RbaSArIDFdLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGlicmF0aW9uX2xpc3RbaSArIDFdKTsKIAogICAgICAgaWYgKGFic2w6OkdldEZsYWcoRkxBR1NfdmlzdWFsaXplKSkgewogICAgICAgICAvLyBEcmF3IGVhY2ggb2YgdGhlIHVwZGF0ZWQgZXh0cmluc2ljIGNhbWVyYSBsb2NhdGlvbnMKQEAgLTcxMiw5ICs4NjksOCBAQAogICB9CiAKICAgLy8gQ2xlYW51cAotICBmb3IgKHVpbnQgaSA9IDA7IGkgPCBpbWFnZV9jYWxsYmFja3Muc2l6ZSgpOyBpKyspIHsKKyAgZm9yICh1aW50IGkgPSAwOyBpIDwgY2hhcnVjb19leHRyYWN0b3JzLnNpemUoKTsgaSsrKSB7CiAgICAgZGVsZXRlIGNoYXJ1Y29fZXh0cmFjdG9yc1tpXTsKLSAgICBkZWxldGUgaW1hZ2VfY2FsbGJhY2tzW2ldOwogICB9CiB9CiB9ICAvLyBuYW1lc3BhY2UgeTIwMjQ6OnZpc2lvbgpkaWZmIC0tZ2l0IGEveTIwMjQvdmlzaW9uL3RhcmdldF9tYXBwaW5nLmNjIGIveTIwMjQvdmlzaW9uL3RhcmdldF9tYXBwaW5nLmNjCmluZGV4IGY1ZmEzNGMuLmQ5YjA2N2EgMTAwNjQ0Ci0tLSBhL3kyMDI0L3Zpc2lvbi90YXJnZXRfbWFwcGluZy5jYworKysgYi95MjAyNC92aXNpb24vdGFyZ2V0X21hcHBpbmcuY2MKQEAgLTI2Niw3ICsyNjYsNyBAQAogICAgIH0KIAogICAgIGNvbnN0IFRhcmdldE1hcHBlcjo6VGFyZ2V0UG9zZSB0YXJnZXRfcG9zZSA9Ci0gICAgICAgIFBvc2VVdGlsczo6VGFyZ2V0UG9zZUZyb21GYnMoKnRhcmdldF9wb3NlX2Zicyk7CisgICAgICAgIFRhcmdldE1hcHBlcjo6VGFyZ2V0UG9zZUZyb21GYnMoKnRhcmdldF9wb3NlX2Zicyk7CiAKICAgICBFaWdlbjo6QWZmaW5lM2QgSF9jYW1lcmFfdGFyZ2V0ID0KICAgICAgICAgRWlnZW46OlRyYW5zbGF0aW9uM2QodGFyZ2V0X3Bvc2UucG9zZS5wKSAqIHRhcmdldF9wb3NlLnBvc2UucTsKZGlmZiAtLWdpdCBhL3kyMDI0L3Zpc2lvbi92aWV3ZXIuY2MgYi95MjAyNC92aXNpb24vdmlld2VyLmNjCmluZGV4IGM3MmMwOGUuLmM3NDE0NDUgMTAwNjQ0Ci0tLSBhL3kyMDI0L3Zpc2lvbi92aWV3ZXIuY2MKKysrIGIveTIwMjQvdmlzaW9uL3ZpZXdlci5jYwpAQCAtODYsNyArODYsOSBAQAogCiAgIGZyYzk3MTo6Y29uc3RhbnRzOjpDb25zdGFudHNGZXRjaGVyPHkyMDI0OjpDb25zdGFudHM+IGNvbnN0YW50c19mZXRjaGVyKAogICAgICAgJmV2ZW50X2xvb3ApOwotICBDSEVDSyhhYnNsOjpHZXRGbGFnKEZMQUdTX2NoYW5uZWwpLmxlbmd0aCgpID09IDgpOworICBDSEVDSyhhYnNsOjpHZXRGbGFnKEZMQUdTX2NoYW5uZWwpLmxlbmd0aCgpID09IDgpCisgICAgICA8PCAiIGNoYW5uZWwgc2hvdWxkIGJlIG9mIHRoZSBmb3JtICcvY2FtZXJhTicgZm9yIHZpZXdpbmcgaW1hZ2VzIGZyb20gIgorICAgICAgICAgImNhbWVyYSBOIjsKICAgaW50IGNhbWVyYV9pZCA9IHN0ZDo6c3RvaShhYnNsOjpHZXRGbGFnKEZMQUdTX2NoYW5uZWwpLnN1YnN0cig3LCAxKSk7CiAgIGNvbnN0IGF1dG8gKmNhbGlicmF0aW9uX2RhdGEgPSBGaW5kQ2FtZXJhQ2FsaWJyYXRpb24oCiAgICAgICBjb25zdGFudHNfZmV0Y2hlci5jb25zdGFudHMoKSwgZXZlbnRfbG9vcC5ub2RlKCktPm5hbWUoKS0+c3RyaW5nX3ZpZXcoKSwKZGlmZiAtLWdpdCBhL3kyMDI0X2JvdDMvY29uc3RhbnRzLzk5NzEuanNvbiBiL3kyMDI0X2JvdDMvY29uc3RhbnRzLzk5NzEuanNvbgppbmRleCA1NTgzYjQ0Li40ZWIxYWNmIDEwMDY0NAotLS0gYS95MjAyNF9ib3QzL2NvbnN0YW50cy85OTcxLmpzb24KKysrIGIveTIwMjRfYm90My9jb25zdGFudHMvOTk3MS5qc29uCkBAIC0xLDMgKzEsNSBAQAoreyUgZnJvbSAneTIwMjRfYm90My9jb25zdGFudHMvY29tbW9uLmppbmphMicgaW1wb3J0IGFybV96ZXJvICV9CisKIHsKICAgImNhbWVyYXMiOiBbCiAgICAgewpAQCAtMTMsNiArMTUsMjEgQEAKICAgICAgICJjYWxpYnJhdGlvbiI6IHslIGluY2x1ZGUgJ3kyMDI0X2JvdDMvY29uc3RhbnRzL2NhbGliX2ZpbGVzL2NhbGlicmF0aW9uX29yaW4xLTk5NzEtMV9jYW0tMjQtMTFfMjAyNC0wMy0yNF8xMS01Mi00OS5qc29uJyAlfQogICAgIH0KICAgXSwKLSAgInJvYm90Ijoge30sCisgICJyb2JvdCI6IHsKKyAgICAiYXJtX2NvbnN0YW50cyI6IHsKKyAgICAgIHslIHNldCBfID0gYXJtX3plcm8udXBkYXRlKAorICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIm1lYXN1cmVkX2Fic29sdXRlX3Bvc2l0aW9uIiA6IDAuMDk5Mjg5NTkyNjQ5NTA3OAorICAgICAgICAgIH0KKyAgICAgICkgJX0KKyAgICAgICJ6ZXJvaW5nX2NvbnN0YW50cyI6IHt7IGFybV96ZXJvIHwgdG9qc29uKGluZGVudD0yKX19LAorICAgICAgInBvdGVudGlvbWV0ZXJfb2Zmc2V0Ijoge3sgMCB9fSwKKyAgICAgICJhcm1fcG9zaXRpb25zIjogeworICAgICAgICAiaW50YWtlIjogMCwKKyAgICAgICAgImlkbGUiOiAxLAorICAgICAgICAiYW1wIjogMgorICAgICAgfQorICAgIH0KKyAgfSwKICAgeyUgaW5jbHVkZSAneTIwMjRfYm90My9jb25zdGFudHMvY29tbW9uLmpzb24nICV9CiB9CmRpZmYgLS1naXQgYS95MjAyNF9ib3QzL2NvbnN0YW50cy9CVUlMRCBiL3kyMDI0X2JvdDMvY29uc3RhbnRzL0JVSUxECmluZGV4IDFjZTY5YTAuLjMyM2JkNDkgMTAwNjQ0Ci0tLSBhL3kyMDI0X2JvdDMvY29uc3RhbnRzL0JVSUxECisrKyBiL3kyMDI0X2JvdDMvY29uc3RhbnRzL0JVSUxECkBAIC0yNiw2ICsyNiw3IEBACiAgICAgICAgICJjb21tb24uamluamEyIiwKICAgICAgICAgImNvbW1vbi5qc29uIiwKICAgICAgICAgIi8veTIwMjRfYm90My9jb25zdGFudHMvY2FsaWJfZmlsZXMiLAorICAgICAgICAiLy95MjAyNF9ib3QzL2NvbnRyb2xfbG9vcHMvc3VwZXJzdHJ1Y3R1cmUvYXJtOmFybV9qc29uIiwKICAgICAgICAgIi8veTIwMjRfYm90My92aXNpb24vbWFwcyIsCiAgICAgXSwKICAgICBwYXJhbWV0ZXJzID0ge30sCkBAIC00MCw2ICs0MSw3IEBACiAgICAgICAgICJjb21tb24uamluamEyIiwKICAgICAgICAgImNvbW1vbi5qc29uIiwKICAgICAgICAgIi8veTIwMjRfYm90My9jb25zdGFudHMvY2FsaWJfZmlsZXMiLAorICAgICAgICAiLy95MjAyNF9ib3QzL2NvbnRyb2xfbG9vcHMvc3VwZXJzdHJ1Y3R1cmUvYXJtOmFybV9qc29uIiwKICAgICAgICAgIi8veTIwMjRfYm90My92aXNpb24vbWFwcyIsCiAgICAgXSwKICAgICBwYXJhbWV0ZXJzID0ge30sCmRpZmYgLS1naXQgYS95MjAyNF9ib3QzL2NvbnN0YW50cy9jb21tb24uamluamEyIGIveTIwMjRfYm90My9jb25zdGFudHMvY29tbW9uLmppbmphMgppbmRleCA5YjdhZjgyLi44MDlmOGM4IDEwMDY0NAotLS0gYS95MjAyNF9ib3QzL2NvbnN0YW50cy9jb21tb24uamluamEyCisrKyBiL3kyMDI0X2JvdDMvY29uc3RhbnRzL2NvbW1vbi5qaW5qYTIKQEAgLTEsMyArMSwxNiBAQAogeyUgc2V0IHBpID0gMy4xNDE1OTI2NSAlfQogCiB7JXNldCB6ZXJvaW5nX3NhbXBsZV9zaXplID0gMjAwICV9CisKK3sjIEFybSAjfQoreyUgc2V0IGFybV9lbmNvZGVyX3JhdGlvID0gKDQuMCAvIDEuMCkgJX0KKworeyUKK3NldCBhcm1femVybyA9IHsKKyAgICAiYXZlcmFnZV9maWx0ZXJfc2l6ZSI6IHplcm9pbmdfc2FtcGxlX3NpemUsCisgICAgIm9uZV9yZXZvbHV0aW9uX2Rpc3RhbmNlIjogcGkgKiAyLjAgKiBhcm1fZW5jb2Rlcl9yYXRpbywKKyAgICAiemVyb2luZ190aHJlc2hvbGQiOiAwLjAwMDUsCisgICAgIm1vdmluZ19idWZmZXJfc2l6ZSI6IDIwLAorICAgICJhbGxvd2FibGVfZW5jb2Rlcl9lcnJvciI6IDAuOQorfQorJX0KZGlmZiAtLWdpdCBhL3kyMDI0X2JvdDMvY29uc3RhbnRzL2NvbW1vbi5qc29uIGIveTIwMjRfYm90My9jb25zdGFudHMvY29tbW9uLmpzb24KaW5kZXggZTdiNzBiNC4uZDVhYmVjMCAxMDA2NDQKLS0tIGEveTIwMjRfYm90My9jb25zdGFudHMvY29tbW9uLmpzb24KKysrIGIveTIwMjRfYm90My9jb25zdGFudHMvY29tbW9uLmpzb24KQEAgLTEsMiArMSwyMSBAQAogImNvbW1vbiI6IHsKKyAgImFybSI6IHsKKyAgICAiemVyb2luZ192b2x0YWdlIjogMy4wLAorICAgICJvcGVyYXRpbmdfdm9sdGFnZSI6IDEyLjAsCisgICAgInplcm9pbmdfcHJvZmlsZV9wYXJhbXMiOiB7CisgICAgICAibWF4X3ZlbG9jaXR5IjogMC41LAorICAgICAgIm1heF9hY2NlbGVyYXRpb24iOiAzLjAKKyAgICB9LAorICAgICJkZWZhdWx0X3Byb2ZpbGVfcGFyYW1zIjp7CisgICAgICAibWF4X3ZlbG9jaXR5IjogMi4wLAorICAgICAgIm1heF9hY2NlbGVyYXRpb24iOiAxMC4wCisgICAgfSwKKyAgICAicmFuZ2UiOiB7CisgICAgICAgICJsb3dlcl9oYXJkIjogLTUwLAorICAgICAgICAidXBwZXJfaGFyZCI6IDUwLAorICAgICAgICAibG93ZXIiOiAtNTAsCisgICAgICAgICJ1cHBlciI6IDUwCisgICAgfSwKKyAgICAibG9vcCI6IHslIGluY2x1ZGUgJ3kyMDI0X2JvdDMvY29udHJvbF9sb29wcy9zdXBlcnN0cnVjdHVyZS9hcm0vaW50ZWdyYWxfYXJtX3BsYW50Lmpzb24nICV9CisgIH0KIH0KZGlmZiAtLWdpdCBhL3kyMDI0X2JvdDMvY29uc3RhbnRzL2NvbnN0YW50cy5mYnMgYi95MjAyNF9ib3QzL2NvbnN0YW50cy9jb25zdGFudHMuZmJzCmluZGV4IDBjN2E3OTIuLjk5OTk5YmQgMTAwNjQ0Ci0tLSBhL3kyMDI0X2JvdDMvY29uc3RhbnRzL2NvbnN0YW50cy5mYnMKKysrIGIveTIwMjRfYm90My9jb25zdGFudHMvY29uc3RhbnRzLmZicwpAQCAtMTAsMTIgKzEwLDI2IEBACiAgIGNhbGlicmF0aW9uOmZyYzk3MS52aXNpb24uY2FsaWJyYXRpb24uQ2FtZXJhQ2FsaWJyYXRpb24gKGlkOiAwKTsKIH0KIAordGFibGUgQXJtUG9zaXRpb25zIHsKKyAgaW50YWtlOmRvdWJsZSAoaWQ6IDApOworICBpZGxlOmRvdWJsZSAoaWQ6IDEpOworICBhbXA6ZG91YmxlIChpZDogMik7Cit9CisKK3RhYmxlIFBvdEFuZEFic0VuY29kZXJDb25zdGFudHMgeworICB6ZXJvaW5nX2NvbnN0YW50czpmcmM5NzEuemVyb2luZy5Qb3RBbmRBYnNvbHV0ZUVuY29kZXJaZXJvaW5nQ29uc3RhbnRzIChpZDogMCk7CisgIHBvdGVudGlvbWV0ZXJfb2Zmc2V0OmRvdWJsZSAoaWQ6IDEpOworICBhcm1fcG9zaXRpb25zOkFybVBvc2l0aW9ucyAoaWQ6IDIpOworfQorCiB0YWJsZSBSb2JvdENvbnN0YW50cyB7CisgIGFybV9jb25zdGFudHM6UG90QW5kQWJzRW5jb2RlckNvbnN0YW50cyAoaWQ6IDApOwogfQogCiAvLyBDb21tb24gdGFibGUgZm9yIGNvbnN0YW50cyB1bnJlbGF0ZWQgdG8gdGhlIHJvYm90CiB0YWJsZSBDb21tb24gewogICB0YXJnZXRfbWFwOmZyYzk3MS52aXNpb24uVGFyZ2V0TWFwIChpZDogMCk7CisgIGFybTpmcmM5NzEuY29udHJvbF9sb29wcy5TdGF0aWNaZXJvaW5nU2luZ2xlRE9GUHJvZmlsZWRTdWJzeXN0ZW1Db21tb25QYXJhbXMgKGlkOiAxKTsKIH0KIAogdGFibGUgQ29uc3RhbnRzIHsKZGlmZiAtLWdpdCBhL3kyMDI0X2JvdDMvY29uc3RhbnRzL3Rlc3RfZGF0YS90ZXN0X3RlYW0uanNvbiBiL3kyMDI0X2JvdDMvY29uc3RhbnRzL3Rlc3RfZGF0YS90ZXN0X3RlYW0uanNvbgppbmRleCBkZWFjZWY0Li4wNjI4NmU3IDEwMDY0NAotLS0gYS95MjAyNF9ib3QzL2NvbnN0YW50cy90ZXN0X2RhdGEvdGVzdF90ZWFtLmpzb24KKysrIGIveTIwMjRfYm90My9jb25zdGFudHMvdGVzdF9kYXRhL3Rlc3RfdGVhbS5qc29uCkBAIC0xLDQgKzEsMjEgQEAKK3slIGZyb20gJ3kyMDI0X2JvdDMvY29uc3RhbnRzL2NvbW1vbi5qaW5qYTInIGltcG9ydCBhcm1femVybyAlfQorCiB7Ci0gICJyb2JvdCI6IHt9LAorICAicm9ib3QiOiB7CisgICAgImFybV9jb25zdGFudHMiOiB7CisgICAgICB7JSBzZXQgXyA9IGFybV96ZXJvLnVwZGF0ZSgKKyAgICAgICAgICB7CisgICAgICAgICAgICAgICJtZWFzdXJlZF9hYnNvbHV0ZV9wb3NpdGlvbiIgOiAwLjA5OTI4OTU5MjY0OTUwNzgKKyAgICAgICAgICB9CisgICAgICApICV9CisgICAgICAiemVyb2luZ19jb25zdGFudHMiOiB7eyBhcm1femVybyB8IHRvanNvbihpbmRlbnQ9Mil9fSwKKyAgICAgICJwb3RlbnRpb21ldGVyX29mZnNldCI6IHt7IDAgfX0sCisgICAgICAiYXJtX3Bvc2l0aW9ucyI6IHsKKyAgICAgICAgImludGFrZSI6IDAsCisgICAgICAgICJpZGxlIjogMSwKKyAgICAgICAgImFtcCI6IDIKKyAgICAgIH0KKyAgICB9CisgIH0sCiAgIHslIGluY2x1ZGUgJ3kyMDI0X2JvdDMvY29uc3RhbnRzL2NvbW1vbi5qc29uJyAlfQogfQpkaWZmIC0tZ2l0IGEveTIwMjRfYm90My9jb250cm9sX2xvb3BzL3B5dGhvbi9CVUlMRCBiL3kyMDI0X2JvdDMvY29udHJvbF9sb29wcy9weXRob24vQlVJTEQKaW5kZXggOWVjNmI1Ny4uODUzNzE5ZCAxMDA2NDQKLS0tIGEveTIwMjRfYm90My9jb250cm9sX2xvb3BzL3B5dGhvbi9CVUlMRAorKysgYi95MjAyNF9ib3QzL2NvbnRyb2xfbG9vcHMvcHl0aG9uL0JVSUxECkBAIC02LDMgKzYsMTkgQEAKICAgICB2aXNpYmlsaXR5ID0gWyIvL3Zpc2liaWxpdHk6cHVibGljIl0sCiAgICAgZGVwcyA9IFsiLy95MjAyNF9ib3QzL2NvbnRyb2xfbG9vcHM6cHl0aG9uX2luaXQiXSwKICkKKworcHlfYmluYXJ5KAorICAgIG5hbWUgPSAiYXJtIiwKKyAgICBzcmNzID0gWworICAgICAgICAiYXJtLnB5IiwKKyAgICBdLAorICAgIGxlZ2FjeV9jcmVhdGVfaW5pdCA9IEZhbHNlLAorICAgIHRhcmdldF9jb21wYXRpYmxlX3dpdGggPSBbIkBwbGF0Zm9ybXMvL2NwdTp4ODZfNjQiXSwKKyAgICBkZXBzID0gWworICAgICAgICAiOnB5dGhvbl9pbml0IiwKKyAgICAgICAgIi8vZnJjOTcxL2NvbnRyb2xfbG9vcHMvcHl0aG9uOmNvbnRyb2xzIiwKKyAgICAgICAgIi8vZnJjOTcxL2NvbnRyb2xfbG9vcHMvcHl0aG9uOmxpbmVhcl9zeXN0ZW0iLAorICAgICAgICAiQHBpcC8vZ2xvZyIsCisgICAgICAgICJAcGlwLy9weXRob25fZ2ZsYWdzIiwKKyAgICBdLAorKQpkaWZmIC0tZ2l0IGEveTIwMjRfYm90My9jb250cm9sX2xvb3BzL3B5dGhvbi9hcm0ucHkgYi95MjAyNF9ib3QzL2NvbnRyb2xfbG9vcHMvcHl0aG9uL2FybS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjAyYmU4Ci0tLSAvZGV2L251bGwKKysrIGIveTIwMjRfYm90My9jb250cm9sX2xvb3BzL3B5dGhvbi9hcm0ucHkKQEAgLTAsMCArMSw2MSBAQAorIyEvdXNyL2Jpbi9weXRob24zCisKK2Zyb20gYW9zLnV0aWwudHJhcGV6b2lkX3Byb2ZpbGUgaW1wb3J0IFRyYXBlem9pZFByb2ZpbGUKK2Zyb20gZnJjOTcxLmNvbnRyb2xfbG9vcHMucHl0aG9uIGltcG9ydCBjb250cm9sX2xvb3AKK2Zyb20gZnJjOTcxLmNvbnRyb2xfbG9vcHMucHl0aG9uIGltcG9ydCBsaW5lYXJfc3lzdGVtCitmcm9tIGZyYzk3MS5jb250cm9sX2xvb3BzLnB5dGhvbiBpbXBvcnQgY29udHJvbHMKK2ltcG9ydCBudW1weQoraW1wb3J0IHN5cworZnJvbSBtYXRwbG90bGliIGltcG9ydCBweWxhYgoraW1wb3J0IGdmbGFncworaW1wb3J0IGdsb2cKKworRkxBR1MgPSBnZmxhZ3MuRkxBR1MKKwordHJ5OgorICAgIGdmbGFncy5ERUZJTkVfYm9vbCgncGxvdCcsIEZhbHNlLCAnSWYgdHJ1ZSwgcGxvdCB0aGUgbG9vcCByZXNwb25zZS4nKQorZXhjZXB0IGdmbGFncy5EdXBsaWNhdGVGbGFnRXJyb3I6CisgICAgcGFzcworCitnZmxhZ3MuREVGSU5FX2Jvb2woJ2h5YnJpZCcsIEZhbHNlLCAnSWYgdHJ1ZSwgbWFrZSBpdCBoeWJyaWQuJykKKwora0FybSA9IGxpbmVhcl9zeXN0ZW0uTGluZWFyU3lzdGVtUGFyYW1zKAorICAgIG5hbWU9J0FybScsCisgICAgbW90b3I9Y29udHJvbF9sb29wLktyYWtlbkZPQygpLAorICAgIEc9KDE0LiAvIDYwLikgKiAoMzIuIC8gNDguKSwKKyAgICByYWRpdXM9MzYgKiAwLjAwNSAvIG51bXB5LnBpIC8gMi4wLAorICAgIG1hc3M9NS4wLAorICAgIHFfcG9zPTAuMjAsCisgICAgcV92ZWw9ODAuMCwKKyAgICBrYWxtYW5fcV9wb3M9MC4xMiwKKyAgICBrYWxtYW5fcV92ZWw9Mi4wLAorICAgIGthbG1hbl9xX3ZvbHRhZ2U9OC4wLAorICAgIGthbG1hbl9yX3Bvc2l0aW9uPTAuMDUsCisgICAgZHQ9MC4wMDUsCispCisKKworZGVmIG1haW4oYXJndik6CisgICAgaWYgRkxBR1MucGxvdDoKKyAgICAgICAgUiA9IG51bXB5Lm1hdHJpeChbWzAuNF0sIFswLjBdXSkKKyAgICAgICAgbGluZWFyX3N5c3RlbS5QbG90S2ljayhrQXJtLCBSKQorICAgICAgICBsaW5lYXJfc3lzdGVtLlBsb3RNb3Rpb24oa0FybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfdmVsb2NpdHk9Mi4wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2FjY2VsZXJhdGlvbj0xNS4wKQorICAgICAgICByZXR1cm4KKworICAgICMgV3JpdGUgdGhlIGdlbmVyYXRlZCBjb25zdGFudHMgb3V0IHRvIGEgZmlsZS4KKyAgICBpZiBsZW4oYXJndikgIT0gNzoKKyAgICAgICAgZ2xvZy5mYXRhbCgKKyAgICAgICAgICAgICdFeHBlY3RlZCAuaCBmaWxlIG5hbWUgYW5kIC5jYyBmaWxlIG5hbWUgZm9yIHRoZSBhcm0gcGl2b3QgYW5kIGludGVncmFsIGFybSBwaXZvdC4nCisgICAgICAgICkKKyAgICBlbHNlOgorICAgICAgICBuYW1lc3BhY2VzID0gWyd5MjAyNF9ib3QzJywgJ2NvbnRyb2xfbG9vcHMnLCAnc3VwZXJzdHJ1Y3R1cmUnLCAnYXJtJ10KKyAgICAgICAgbGluZWFyX3N5c3RlbS5Xcml0ZUxpbmVhclN5c3RlbShrQXJtLCBhcmd2WzE6NF0sIGFyZ3ZbNDo3XSwgbmFtZXNwYWNlcykKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGFyZ3YgPSBGTEFHUyhzeXMuYXJndikKKyAgICBnbG9nLmluaXQoKQorICAgIHN5cy5leGl0KG1haW4oYXJndikpCmRpZmYgLS1naXQgYS95MjAyNF9ib3QzL2NvbnRyb2xfbG9vcHMvc3VwZXJzdHJ1Y3R1cmUvQlVJTEQgYi95MjAyNF9ib3QzL2NvbnRyb2xfbG9vcHMvc3VwZXJzdHJ1Y3R1cmUvQlVJTEQKaW5kZXggOGQ5MDliZi4uYmNhYzUxOCAxMDA2NDQKLS0tIGEveTIwMjRfYm90My9jb250cm9sX2xvb3BzL3N1cGVyc3RydWN0dXJlL0JVSUxECisrKyBiL3kyMDI0X2JvdDMvY29udHJvbF9sb29wcy9zdXBlcnN0cnVjdHVyZS9CVUlMRApAQCAtMTQyLDYgKzE0Miw3IEBACiAgICAgICAgICIvL2ZyYzk3MS9jb250cm9sX2xvb3BzOnBvc2l0aW9uX3NlbnNvcl9zaW0iLAogICAgICAgICAiLy9mcmM5NzEvY29udHJvbF9sb29wczpzdWJzeXN0ZW1fc2ltdWxhdG9yIiwKICAgICAgICAgIi8vZnJjOTcxL2NvbnRyb2xfbG9vcHM6dGVhbV9udW1iZXJfdGVzdF9lbnZpcm9ubWVudCIsCisgICAgICAgICIvL3kyMDI0X2JvdDMvY29udHJvbF9sb29wcy9zdXBlcnN0cnVjdHVyZS9hcm06YXJtX3BsYW50cyIsCiAgICAgXSwKICkKIApkaWZmIC0tZ2l0IGEveTIwMjRfYm90My9jb250cm9sX2xvb3BzL3N1cGVyc3RydWN0dXJlL2FybS9CVUlMRCBiL3kyMDI0X2JvdDMvY29udHJvbF9sb29wcy9zdXBlcnN0cnVjdHVyZS9hcm0vQlVJTEQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZkMmZlYwotLS0gL2Rldi9udWxsCisrKyBiL3kyMDI0X2JvdDMvY29udHJvbF9sb29wcy9zdXBlcnN0cnVjdHVyZS9hcm0vQlVJTEQKQEAgLTAsMCArMSw0MiBAQAorcGFja2FnZShkZWZhdWx0X3Zpc2liaWxpdHkgPSBbIi8veTIwMjRfYm90MzpfX3N1YnBhY2thZ2VzX18iXSkKKworZ2VucnVsZSgKKyAgICBuYW1lID0gImdlbnJ1bGVfYXJtIiwKKyAgICBvdXRzID0gWworICAgICAgICAiYXJtX3BsYW50LmgiLAorICAgICAgICAiYXJtX3BsYW50LmNjIiwKKyAgICAgICAgImFybV9wbGFudC5qc29uIiwKKyAgICAgICAgImludGVncmFsX2FybV9wbGFudC5oIiwKKyAgICAgICAgImludGVncmFsX2FybV9wbGFudC5jYyIsCisgICAgICAgICJpbnRlZ3JhbF9hcm1fcGxhbnQuanNvbiIsCisgICAgXSwKKyAgICBjbWQgPSAiJChsb2NhdGlvbiAvL3kyMDI0X2JvdDMvY29udHJvbF9sb29wcy9weXRob246YXJtKSAkKE9VVFMpIiwKKyAgICB0YXJnZXRfY29tcGF0aWJsZV93aXRoID0gWyJAcGxhdGZvcm1zLy9vczpsaW51eCJdLAorICAgIHRvb2xzID0gWworICAgICAgICAiLy95MjAyNF9ib3QzL2NvbnRyb2xfbG9vcHMvcHl0aG9uOmFybSIsCisgICAgXSwKKykKKworY2NfbGlicmFyeSgKKyAgICBuYW1lID0gImFybV9wbGFudHMiLAorICAgIHNyY3MgPSBbCisgICAgICAgICJhcm1fcGxhbnQuY2MiLAorICAgICAgICAiaW50ZWdyYWxfYXJtX3BsYW50LmNjIiwKKyAgICBdLAorICAgIGhkcnMgPSBbCisgICAgICAgICJhcm1fcGxhbnQuaCIsCisgICAgICAgICJpbnRlZ3JhbF9hcm1fcGxhbnQuaCIsCisgICAgXSwKKyAgICB0YXJnZXRfY29tcGF0aWJsZV93aXRoID0gWyJAcGxhdGZvcm1zLy9vczpsaW51eCJdLAorICAgIHZpc2liaWxpdHkgPSBbIi8vdmlzaWJpbGl0eTpwdWJsaWMiXSwKKyAgICBkZXBzID0gWworICAgICAgICAiLy9mcmM5NzEvY29udHJvbF9sb29wczpoeWJyaWRfc3RhdGVfZmVlZGJhY2tfbG9vcCIsCisgICAgICAgICIvL2ZyYzk3MS9jb250cm9sX2xvb3BzOnN0YXRlX2ZlZWRiYWNrX2xvb3AiLAorICAgIF0sCispCisKK2ZpbGVncm91cCgKKyAgICBuYW1lID0gImFybV9qc29uIiwKKyAgICBzcmNzID0gWyJpbnRlZ3JhbF9hcm1fcGxhbnQuanNvbiJdLAorICAgIHZpc2liaWxpdHkgPSBbIi8vdmlzaWJpbGl0eTpwdWJsaWMiXSwKKykKZGlmZiAtLWdpdCBhL3kyMDI0X2JvdDMvY29udHJvbF9sb29wcy9zdXBlcnN0cnVjdHVyZS9zdXBlcnN0cnVjdHVyZS5jYyBiL3kyMDI0X2JvdDMvY29udHJvbF9sb29wcy9zdXBlcnN0cnVjdHVyZS9zdXBlcnN0cnVjdHVyZS5jYwppbmRleCBjMThkYTE1Li4yYzUxMGFkIDEwMDY0NAotLS0gYS95MjAyNF9ib3QzL2NvbnRyb2xfbG9vcHMvc3VwZXJzdHJ1Y3R1cmUvc3VwZXJzdHJ1Y3R1cmUuY2MKKysrIGIveTIwMjRfYm90My9jb250cm9sX2xvb3BzL3N1cGVyc3RydWN0dXJlL3N1cGVyc3RydWN0dXJlLmNjCkBAIC0yNiw3ICsyNiw5IEBACiAgICAgICBjb25zdGFudHNfZmV0Y2hlcl8oZXZlbnRfbG9vcCksCiAgICAgICByb2JvdF9jb25zdGFudHNfKCZjb25zdGFudHNfZmV0Y2hlcl8uY29uc3RhbnRzKCkpLAogICAgICAgam95c3RpY2tfc3RhdGVfZmV0Y2hlcl8oCi0gICAgICAgICAgZXZlbnRfbG9vcC0+TWFrZUZldGNoZXI8YW9zOjpKb3lzdGlja1N0YXRlPigiL2FvcyIpKSB7CisgICAgICAgICAgZXZlbnRfbG9vcC0+TWFrZUZldGNoZXI8YW9zOjpKb3lzdGlja1N0YXRlPigiL2FvcyIpKSwKKyAgICAgIGFybV8ocm9ib3RfY29uc3RhbnRzXy0+Y29tbW9uKCktPmFybSgpLAorICAgICAgICAgICByb2JvdF9jb25zdGFudHNfLT5yb2JvdCgpLT5hcm1fY29uc3RhbnRzKCktPnplcm9pbmdfY29uc3RhbnRzKCkpIHsKICAgZXZlbnRfbG9vcC0+U2V0UnVudGltZVJlYWx0aW1lUHJpb3JpdHkoMzApOwogfQogCkBAIC0zOCwzMyArNDAsNzEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQb3NpdGlvbiAqcG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW9zOjpTZW5kZXI8T3V0cHV0Pjo6QnVpbGRlciAqb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFvczo6U2VuZGVyPFN0YXR1cz46OkJ1aWxkZXIgKnN0YXR1cykgewotICAodm9pZClwb3NpdGlvbjsKLQogICBpZiAoV2FzUmVzZXQoKSkgewogICAgIEFPU19MT0coRVJST1IsICJXUElMaWIgcmVzZXQsIHJlc3RhcnRpbmdcbiIpOwogICB9CiAKICAgT3V0cHV0VCBvdXRwdXRfc3RydWN0OwogCi0gIGlmICh1bnNhZmVfZ29hbCAhPSBudWxscHRyKSB7Ci0gIH0KLQogICBpZiAoam95c3RpY2tfc3RhdGVfZmV0Y2hlcl8uRmV0Y2goKSAmJgogICAgICAgam95c3RpY2tfc3RhdGVfZmV0Y2hlcl8tPmhhc19hbGxpYW5jZSgpKSB7CiAgICAgYWxsaWFuY2VfID0gam95c3RpY2tfc3RhdGVfZmV0Y2hlcl8tPmFsbGlhbmNlKCk7CiAgIH0KIAorICBhb3M6OkZsYXRidWZmZXJGaXhlZEFsbG9jYXRvckFycmF5PAorICAgICAgZnJjOTcxOjpjb250cm9sX2xvb3BzOjpTdGF0aWNaZXJvaW5nU2luZ2xlRE9GUHJvZmlsZWRTdWJzeXN0ZW1Hb2FsLCA1MTI+CisgICAgICBhcm1fZ29hbF9idWZmZXI7CisKKyAgQXJtU3RhdHVzIGFybV9zdGF0dXMgPSBBcm1TdGF0dXM6OklETEU7CisgIGRvdWJsZSBhcm1fcG9zaXRpb24gPQorICAgICAgcm9ib3RfY29uc3RhbnRzXy0+cm9ib3QoKS0+YXJtX2NvbnN0YW50cygpLT5hcm1fcG9zaXRpb25zKCktPmlkbGUoKTsKKyAgaWYgKHVuc2FmZV9nb2FsICE9IG51bGxwdHIpIHsKKyAgICBzd2l0Y2ggKHVuc2FmZV9nb2FsLT5hcm1fcG9zaXRpb24oKSkgeworICAgICAgY2FzZSBQaXZvdEdvYWw6OklOVEFLRToKKyAgICAgICAgYXJtX3N0YXR1cyA9IEFybVN0YXR1czo6SU5UQUtFOworICAgICAgICBhcm1fcG9zaXRpb24gPSByb2JvdF9jb25zdGFudHNfLT5yb2JvdCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAtPmFybV9jb25zdGFudHMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5hcm1fcG9zaXRpb25zKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+aW50YWtlKCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQaXZvdEdvYWw6OkFNUDoKKyAgICAgICAgYXJtX3N0YXR1cyA9IEFybVN0YXR1czo6QU1QOworICAgICAgICBhcm1fcG9zaXRpb24gPQorICAgICAgICAgICAgcm9ib3RfY29uc3RhbnRzXy0+cm9ib3QoKS0+YXJtX2NvbnN0YW50cygpLT5hcm1fcG9zaXRpb25zKCktPmFtcCgpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGFybV9wb3NpdGlvbiA9CisgICAgICAgICAgICByb2JvdF9jb25zdGFudHNfLT5yb2JvdCgpLT5hcm1fY29uc3RhbnRzKCktPmFybV9wb3NpdGlvbnMoKS0+aWRsZSgpOworICAgIH0KKyAgfQorCisgIGFybV9nb2FsX2J1ZmZlci5GaW5pc2goCisgICAgICBmcmM5NzE6OmNvbnRyb2xfbG9vcHM6OkNyZWF0ZVN0YXRpY1plcm9pbmdTaW5nbGVET0ZQcm9maWxlZFN1YnN5c3RlbUdvYWwoCisgICAgICAgICAgKmFybV9nb2FsX2J1ZmZlci5mYmIoKSwgYXJtX3Bvc2l0aW9uKSk7CisKKyAgY29uc3QgZnJjOTcxOjpjb250cm9sX2xvb3BzOjpTdGF0aWNaZXJvaW5nU2luZ2xlRE9GUHJvZmlsZWRTdWJzeXN0ZW1Hb2FsCisgICAgICAqYXJtX2dvYWwgPSAmYXJtX2dvYWxfYnVmZmVyLm1lc3NhZ2UoKTsKKworICAvLyBzdGF0aWNfemVyb2luZ19zaW5nbGVfZG9mX3Byb2ZpbGVkX3N1YnN5c3RlbS5oCisgIGNvbnN0IGZsYXRidWZmZXJzOjpPZmZzZXQ8UG90QW5kQWJzb2x1dGVFbmNvZGVyUHJvZmlsZWRKb2ludFN0YXR1cz4KKyAgICAgIGFybV9vZmZzZXQgPQorICAgICAgICAgIGFybV8uSXRlcmF0ZShhcm1fZ29hbCwgcG9zaXRpb24tPmFybSgpLAorICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgIT0gbnVsbHB0ciA/ICZvdXRwdXRfc3RydWN0LmFybV92b2x0YWdlIDogbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLT5mYmIoKSk7CisKICAgaWYgKG91dHB1dCkgewogICAgIG91dHB1dC0+Q2hlY2tPayhvdXRwdXQtPlNlbmQoT3V0cHV0OjpQYWNrKCpvdXRwdXQtPmZiYigpLCAmb3V0cHV0X3N0cnVjdCkpKTsKICAgfQogCiAgIFN0YXR1czo6QnVpbGRlciBzdGF0dXNfYnVpbGRlciA9IHN0YXR1cy0+TWFrZUJ1aWxkZXI8U3RhdHVzPigpOwogCi0gIGNvbnN0IGJvb2wgemVyb2VkID0gdHJ1ZTsKLSAgY29uc3QgYm9vbCBlc3RvcHBlZCA9IGZhbHNlOworICBjb25zdCBib29sIHplcm9lZCA9IGFybV8uemVyb2VkKCk7CisgIGNvbnN0IGJvb2wgZXN0b3BwZWQgPSBhcm1fLmVzdG9wcGVkKCk7CiAKICAgc3RhdHVzX2J1aWxkZXIuYWRkX3plcm9lZCh6ZXJvZWQpOwogICBzdGF0dXNfYnVpbGRlci5hZGRfZXN0b3BwZWQoZXN0b3BwZWQpOworICBzdGF0dXNfYnVpbGRlci5hZGRfYXJtKGFybV9vZmZzZXQpOworICBzdGF0dXNfYnVpbGRlci5hZGRfYXJtX3N0YXR1cyhhcm1fc3RhdHVzKTsKIAogICAodm9pZClzdGF0dXMtPlNlbmQoc3RhdHVzX2J1aWxkZXIuRmluaXNoKCkpOwogfQpkaWZmIC0tZ2l0IGEveTIwMjRfYm90My9jb250cm9sX2xvb3BzL3N1cGVyc3RydWN0dXJlL3N1cGVyc3RydWN0dXJlLmggYi95MjAyNF9ib3QzL2NvbnRyb2xfbG9vcHMvc3VwZXJzdHJ1Y3R1cmUvc3VwZXJzdHJ1Y3R1cmUuaAppbmRleCA2MzYyYmMwLi5iNzQ5OWMyIDEwMDY0NAotLS0gYS95MjAyNF9ib3QzL2NvbnRyb2xfbG9vcHMvc3VwZXJzdHJ1Y3R1cmUvc3VwZXJzdHJ1Y3R1cmUuaAorKysgYi95MjAyNF9ib3QzL2NvbnRyb2xfbG9vcHMvc3VwZXJzdHJ1Y3R1cmUvc3VwZXJzdHJ1Y3R1cmUuaApAQCAtMzUsNiArMzUsOCBAQAogCiAgIGRvdWJsZSByb2JvdF92ZWxvY2l0eSgpIGNvbnN0OwogCisgIGlubGluZSBjb25zdCBQb3RBbmRBYnNvbHV0ZUVuY29kZXJTdWJzeXN0ZW0gJmFybSgpIGNvbnN0IHsgcmV0dXJuIGFybV87IH0KKwogIHByb3RlY3RlZDoKICAgdmlydHVhbCB2b2lkIFJ1bkl0ZXJhdGlvbihjb25zdCBHb2FsICp1bnNhZmVfZ29hbCwgY29uc3QgUG9zaXRpb24gKnBvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFvczo6U2VuZGVyPE91dHB1dD46OkJ1aWxkZXIgKm91dHB1dCwKQEAgLTQ3LDYgKzQ5LDggQEAKIAogICBhb3M6OkFsbGlhbmNlIGFsbGlhbmNlXyA9IGFvczo6QWxsaWFuY2U6OmtJbnZhbGlkOwogCisgIFBvdEFuZEFic29sdXRlRW5jb2RlclN1YnN5c3RlbSBhcm1fOworCiAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihTdXBlcnN0cnVjdHVyZSk7CiB9OwogCmRpZmYgLS1naXQgYS95MjAyNF9ib3QzL2NvbnRyb2xfbG9vcHMvc3VwZXJzdHJ1Y3R1cmUvc3VwZXJzdHJ1Y3R1cmVfY2FuX3Bvc2l0aW9uLmZicyBiL3kyMDI0X2JvdDMvY29udHJvbF9sb29wcy9zdXBlcnN0cnVjdHVyZS9zdXBlcnN0cnVjdHVyZV9jYW5fcG9zaXRpb24uZmJzCmluZGV4IDE1YTA1NjUuLmQzNGNkOWIgMTAwNjQ0Ci0tLSBhL3kyMDI0X2JvdDMvY29udHJvbF9sb29wcy9zdXBlcnN0cnVjdHVyZS9zdXBlcnN0cnVjdHVyZV9jYW5fcG9zaXRpb24uZmJzCisrKyBiL3kyMDI0X2JvdDMvY29udHJvbF9sb29wcy9zdXBlcnN0cnVjdHVyZS9zdXBlcnN0cnVjdHVyZV9jYW5fcG9zaXRpb24uZmJzCkBAIC0xMSw2ICsxMSwxMiBAQAogICAgIC8vIFRoZSBjdHJlOjpwaG9lbml4OjpTdGF0dXNDb2RlIG9mIHRoZSBtZWFzdXJlbWVudAogICAgIC8vIFNob3VsZCBiZSBPSyA9IDAKICAgICBzdGF0dXM6aW50IChpZDogMSk7CisKKyAgICAvLyBDQU4gUG9zaXRpb24gb2YgdGhlIHJvbGxlciBmYWxjb24KKyAgICBpbnRha2Vfcm9sbGVyOmZyYzk3MS5jb250cm9sX2xvb3BzLkNBTlRhbG9uRlggKGlkOiAyKTsKKworICAgIC8vIENBTiBQb3NpdGlvbiBvZiB0aGUgYXJtIHBpdm90IGZhbGNvbgorICAgIGFybV9waXZvdDpmcmM5NzEuY29udHJvbF9sb29wcy5DQU5UYWxvbkZYIChpZDogMyk7CiB9CiAKIHJvb3RfdHlwZSBDQU5Qb3NpdGlvbjsKZGlmZiAtLWdpdCBhL3kyMDI0X2JvdDMvY29udHJvbF9sb29wcy9zdXBlcnN0cnVjdHVyZS9zdXBlcnN0cnVjdHVyZV9nb2FsLmZicyBiL3kyMDI0X2JvdDMvY29udHJvbF9sb29wcy9zdXBlcnN0cnVjdHVyZS9zdXBlcnN0cnVjdHVyZV9nb2FsLmZicwppbmRleCA5NDdmNzQwLi42NmVjZmRmIDEwMDY0NAotLS0gYS95MjAyNF9ib3QzL2NvbnRyb2xfbG9vcHMvc3VwZXJzdHJ1Y3R1cmUvc3VwZXJzdHJ1Y3R1cmVfZ29hbC5mYnMKKysrIGIveTIwMjRfYm90My9jb250cm9sX2xvb3BzL3N1cGVyc3RydWN0dXJlL3N1cGVyc3RydWN0dXJlX2dvYWwuZmJzCkBAIC0yLDYgKzIsMzMgQEAKIAogbmFtZXNwYWNlIHkyMDI0X2JvdDMuY29udHJvbF9sb29wcy5zdXBlcnN0cnVjdHVyZTsKIAotdGFibGUgR29hbCB7CisvLyBSZXByZXNlbnRzIGdvYWwgZm9yIHRoZSBpbnRha2Ugcm9sbGVycworLy8gSU5UQUtFIHdpbGwgdHVybiBvbiB0aGUgcm9sbGVycyB0byBpbnRha2UgdGhlIG5vdGUuCisvLyBTQ09SRSB3aWxsIHR1cm4gb24gdGhlIHJvbGxlcnMgdG8gc2hvb3QgdGhlIG5vdGUuCisvLyBTUElUIHdpbGwgdHVybiBvbiB0aGUgcm9sbGVycyAoaW4gcmV2ZXJzZSkgdG8gc3BpdCBvdXQgdGhlIG5vdGUuCitlbnVtIEludGFrZUdvYWwgOiB1Ynl0ZSB7CisgICAgTk9ORSA9IDAsCisgICAgSU5UQUtFID0gMSwKKyAgICBTQ09SRSA9IDIsCisgICAgU1BJVCA9IDMsCiB9CisKKy8vIFJlcHJlc2VudHMgZ29hbCBmb3IgdGhlIGludGFrZSBhcm0KKy8vIElETEUgd2lsbCBwbGFjZSB0aGUgYXJtIGF0IHRoZSByZXN0aW5nIHBvc2l0aW9uLgorLy8gSU5UQUtFIHdpbGwgcGxhY2UgdGhlIGFybSBhdCB0aGUgaW50YWtlIHBvc2l0aW9uLgorLy8gQU1QIHdpbGwgcGxhY2UgdGhlIGFybSBhdCB0aGUgYW1wIHNjb3JpbmcgcG9zaXRpb24uCitlbnVtIFBpdm90R29hbDogdWJ5dGUgeworICAgIElETEUgPSAwLAorICAgIElOVEFLRSA9IDEsCisgICAgQU1QID0gMiwKK30KKwordGFibGUgR29hbCB7CisgICAgLy8gSW50YWtlIHJvbGxlciBnb2FsCisgICAgcm9sbGVyX2dvYWw6IEludGFrZUdvYWwgPSBOT05FIChpZDogMCk7CisKKyAgICAvLyBBcm0gcG9zaXRpb24gZ29hbAorICAgIGFybV9wb3NpdGlvbjogUGl2b3RHb2FsIChpZDogMSk7Cit9CisKIHJvb3RfdHlwZSBHb2FsOwpkaWZmIC0tZ2l0IGEveTIwMjRfYm90My9jb250cm9sX2xvb3BzL3N1cGVyc3RydWN0dXJlL3N1cGVyc3RydWN0dXJlX2xpYl90ZXN0LmNjIGIveTIwMjRfYm90My9jb250cm9sX2xvb3BzL3N1cGVyc3RydWN0dXJlL3N1cGVyc3RydWN0dXJlX2xpYl90ZXN0LmNjCmluZGV4IGZlMjZhZjIuLmQ5ZjY4NGMgMTAwNjQ0Ci0tLSBhL3kyMDI0X2JvdDMvY29udHJvbF9sb29wcy9zdXBlcnN0cnVjdHVyZS9zdXBlcnN0cnVjdHVyZV9saWJfdGVzdC5jYworKysgYi95MjAyNF9ib3QzL2NvbnRyb2xfbG9vcHMvc3VwZXJzdHJ1Y3R1cmUvc3VwZXJzdHJ1Y3R1cmVfbGliX3Rlc3QuY2MKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRlICJmcmM5NzEvY29udHJvbF9sb29wcy90ZWFtX251bWJlcl90ZXN0X2Vudmlyb25tZW50LmgiCiAjaW5jbHVkZSAiZnJjOTcxL3plcm9pbmcvYWJzb2x1dGVfZW5jb2Rlci5oIgogI2luY2x1ZGUgInkyMDI0X2JvdDMvY29uc3RhbnRzL3NpbXVsYXRlZF9jb25zdGFudHNfc2VuZGVyLmgiCisjaW5jbHVkZSAieTIwMjRfYm90My9jb250cm9sX2xvb3BzL3N1cGVyc3RydWN0dXJlL2FybS9hcm1fcGxhbnQuaCIKICNpbmNsdWRlICJ5MjAyNF9ib3QzL2NvbnRyb2xfbG9vcHMvc3VwZXJzdHJ1Y3R1cmUvc3VwZXJzdHJ1Y3R1cmUuaCIKICNpbmNsdWRlICJ5MjAyNF9ib3QzL2NvbnRyb2xfbG9vcHMvc3VwZXJzdHJ1Y3R1cmUvc3VwZXJzdHJ1Y3R1cmVfY2FuX3Bvc2l0aW9uX2dlbmVyYXRlZC5oIgogCkBAIC01NiwxMCArNTcsMjggQEAKICAgICAgICAgc3VwZXJzdHJ1Y3R1cmVfc3RhdHVzX2ZldGNoZXJfKAogICAgICAgICAgICAgZXZlbnRfbG9vcF8tPk1ha2VGZXRjaGVyPFN0YXR1cz4oIi9zdXBlcnN0cnVjdHVyZSIpKSwKICAgICAgICAgc3VwZXJzdHJ1Y3R1cmVfb3V0cHV0X2ZldGNoZXJfKAotICAgICAgICAgICAgZXZlbnRfbG9vcF8tPk1ha2VGZXRjaGVyPE91dHB1dD4oIi9zdXBlcnN0cnVjdHVyZSIpKSB7Ci0gICAgKHZvaWQpZHRfOwotICAgICh2b2lkKXNpbXVsYXRlZF9yb2JvdF9jb25zdGFudHM7CisgICAgICAgICAgICBldmVudF9sb29wXy0+TWFrZUZldGNoZXI8T3V0cHV0PigiL3N1cGVyc3RydWN0dXJlIikpLAorICAgICAgICBhcm1fKG5ldyBDYXBwZWRUZXN0UGxhbnQoYXJtOjpNYWtlQXJtUGxhbnQoKSksCisgICAgICAgICAgICAgUG9zaXRpb25TZW5zb3JTaW11bGF0b3Ioc2ltdWxhdGVkX3JvYm90X2NvbnN0YW50cy0+cm9ib3QoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPmFybV9jb25zdGFudHMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnplcm9pbmdfY29uc3RhbnRzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5vbmVfcmV2b2x1dGlvbl9kaXN0YW5jZSgpKSwKKyAgICAgICAgICAgICB7LnN1YnN5c3RlbV9wYXJhbXMgPSB7c2ltdWxhdGVkX3JvYm90X2NvbnN0YW50cy0+Y29tbW9uKCktPmFybSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW11bGF0ZWRfcm9ib3RfY29uc3RhbnRzLT5yb2JvdCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPmFybV9jb25zdGFudHMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT56ZXJvaW5nX2NvbnN0YW50cygpfSwKKyAgICAgICAgICAgICAgLnBvdGVudGlvbWV0ZXJfb2Zmc2V0ID0gc2ltdWxhdGVkX3JvYm90X2NvbnN0YW50cy0+cm9ib3QoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5hcm1fY29uc3RhbnRzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+cG90ZW50aW9tZXRlcl9vZmZzZXQoKX0sCisgICAgICAgICAgICAgZnJjOTcxOjpjb25zdGFudHM6OlJhbmdlOjpGcm9tRmxhdGJ1ZmZlcigKKyAgICAgICAgICAgICAgICAgc2ltdWxhdGVkX3JvYm90X2NvbnN0YW50cy0+Y29tbW9uKCktPmFybSgpLT5yYW5nZSgpKSwKKyAgICAgICAgICAgICBzaW11bGF0ZWRfcm9ib3RfY29uc3RhbnRzLT5yb2JvdCgpCisgICAgICAgICAgICAgICAgIC0+YXJtX2NvbnN0YW50cygpCisgICAgICAgICAgICAgICAgIC0+emVyb2luZ19jb25zdGFudHMoKQorICAgICAgICAgICAgICAgICAtPm1lYXN1cmVkX2Fic29sdXRlX3Bvc2l0aW9uKCksCisgICAgICAgICAgICAgZHRfKQogCisgIHsKICAgICBwaGFzZWRfbG9vcF9oYW5kbGVfID0gZXZlbnRfbG9vcF8tPkFkZFBoYXNlZExvb3AoCiAgICAgICAgIFt0aGlzXShpbnQpIHsKICAgICAgICAgICAvLyBTa2lwIHRoaXMgdGhlIGZpcnN0IHRpbWUuCkBAIC03OCw4ICs5NywxNSBAQAogICAgIDo6YW9zOjpTZW5kZXI8UG9zaXRpb24+OjpCdWlsZGVyIGJ1aWxkZXIgPQogICAgICAgICBzdXBlcnN0cnVjdHVyZV9wb3NpdGlvbl9zZW5kZXJfLk1ha2VCdWlsZGVyKCk7CiAKKyAgICBmcmM5NzE6OlBvdEFuZEFic29sdXRlUG9zaXRpb246OkJ1aWxkZXIgYXJtX2J1aWxkZXIgPQorICAgICAgICBidWlsZGVyLk1ha2VCdWlsZGVyPGZyYzk3MTo6UG90QW5kQWJzb2x1dGVQb3NpdGlvbj4oKTsKKyAgICBmbGF0YnVmZmVyczo6T2Zmc2V0PGZyYzk3MTo6UG90QW5kQWJzb2x1dGVQb3NpdGlvbj4gYXJtX29mZnNldCA9CisgICAgICAgIGFybV8uZW5jb2RlcigpLT5HZXRTZW5zb3JWYWx1ZXMoJmFybV9idWlsZGVyKTsKKwogICAgIFBvc2l0aW9uOjpCdWlsZGVyIHBvc2l0aW9uX2J1aWxkZXIgPSBidWlsZGVyLk1ha2VCdWlsZGVyPFBvc2l0aW9uPigpOwogCisgICAgcG9zaXRpb25fYnVpbGRlci5hZGRfYXJtKGFybV9vZmZzZXQpOworCiAgICAgQ0hFQ0tfRVEoYnVpbGRlci5TZW5kKHBvc2l0aW9uX2J1aWxkZXIuRmluaXNoKCkpLAogICAgICAgICAgICAgIGFvczo6UmF3U2VuZGVyOjpFcnJvcjo6a09rKTsKICAgfQpAQCAtOTQsNiArMTIwLDggQEAKICAgOjphb3M6OkZldGNoZXI8U3RhdHVzPiBzdXBlcnN0cnVjdHVyZV9zdGF0dXNfZmV0Y2hlcl87CiAgIDo6YW9zOjpGZXRjaGVyPE91dHB1dD4gc3VwZXJzdHJ1Y3R1cmVfb3V0cHV0X2ZldGNoZXJfOwogCisgIFBvdEFuZEFic29sdXRlRW5jb2RlclNpbXVsYXRvciBhcm1fOworCiAgIGJvb2wgZmlyc3RfID0gdHJ1ZTsKIH07CiAKQEAgLTE1NCw2ICsxODIsMjkgQEAKICAgICAgICAgPDwgIjogTm8gc3RhdHVzIjsKICAgICBBU1NFUlRfVFJVRShzdXBlcnN0cnVjdHVyZV9vdXRwdXRfZmV0Y2hlcl8uZ2V0KCkgIT0gbnVsbHB0cikKICAgICAgICAgPDwgIjogTm8gb3V0cHV0IjsKKworICAgIGRvdWJsZSBzZXRfcG9pbnQ7CisgICAgYXV0byBhcm1fcG9zaXRpb25zID0KKyAgICAgICAgc2ltdWxhdGVkX3JvYm90X2NvbnN0YW50c18tPnJvYm90KCktPmFybV9jb25zdGFudHMoKS0+YXJtX3Bvc2l0aW9ucygpOworCisgICAgc3dpdGNoIChzdXBlcnN0cnVjdHVyZV9nb2FsX2ZldGNoZXJfLT5hcm1fcG9zaXRpb24oKSkgeworICAgICAgY2FzZSBQaXZvdEdvYWw6OklETEU6CisgICAgICAgIHNldF9wb2ludCA9IGFybV9wb3NpdGlvbnMtPmlkbGUoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBpdm90R29hbDo6SU5UQUtFOgorICAgICAgICBzZXRfcG9pbnQgPSBhcm1fcG9zaXRpb25zLT5pbnRha2UoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBpdm90R29hbDo6QU1QOgorICAgICAgICBzZXRfcG9pbnQgPSBhcm1fcG9zaXRpb25zLT5hbXAoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBMT0coRkFUQUwpIDw8ICJQaXZvdEdvYWwgaXMgbm90IElETEUsIElOVEFLRSwgb3IgQU1QIjsKKyAgICB9CisKKyAgICBFWFBFQ1RfTkVBUigKKyAgICAgICAgc2V0X3BvaW50LAorICAgICAgICBzdXBlcnN0cnVjdHVyZV9zdGF0dXNfZmV0Y2hlcl8tPmFybSgpLT51bnByb2ZpbGVkX2dvYWxfcG9zaXRpb24oKSwKKyAgICAgICAgMC4wMyk7CiAgIH0KIAogICB2b2lkIENoZWNrSWZaZXJvZWQoKSB7CkBAIC0yMTEsNyArMjYyLDYgQEAKIAogLy8gVGVzdHMgdGhhdCB0aGUgc3VwZXJzdHJ1Y3R1cmUgZG9lcyBub3RoaW5nIHdoZW4gdGhlIGdvYWwgaXMgdG8gcmVtYWluCiAvLyBzdGlsbC4KLQogVEVTVF9GKFN1cGVyc3RydWN0dXJlVGVzdCwgRG9lc05vdGhpbmcpIHsKICAgU2V0RW5hYmxlZCh0cnVlKTsKICAgV2FpdFVudGlsWmVyb2VkKCk7CkBAIC0yNDAsNCArMjkwLDUwIEBACiAgIENoZWNrSWZaZXJvZWQoKTsKIH0KIAorVEVTVF9GKFN1cGVyc3RydWN0dXJlVGVzdCwgQXJtUGl2b3RNb3ZlbWVudCkgeworICBTZXRFbmFibGVkKHRydWUpOworICBXYWl0VW50aWxaZXJvZWQoKTsKKworICB7CisgICAgYXV0byBidWlsZGVyID0gc3VwZXJzdHJ1Y3R1cmVfZ29hbF9zZW5kZXJfLk1ha2VCdWlsZGVyKCk7CisgICAgR29hbDo6QnVpbGRlciBnb2FsX2J1aWxkZXIgPSBidWlsZGVyLk1ha2VCdWlsZGVyPEdvYWw+KCk7CisgICAgZ29hbF9idWlsZGVyLmFkZF9hcm1fcG9zaXRpb24oUGl2b3RHb2FsOjpJTlRBS0UpOworCisgICAgQVNTRVJUX0VRKGJ1aWxkZXIuU2VuZChnb2FsX2J1aWxkZXIuRmluaXNoKCkpLCBhb3M6OlJhd1NlbmRlcjo6RXJyb3I6OmtPayk7CisgIH0KKyAgUnVuRm9yKGNocm9ubzo6c2Vjb25kcygyMCkpOworICBBU1NFUlRfVFJVRShzdXBlcnN0cnVjdHVyZV9zdGF0dXNfZmV0Y2hlcl8uRmV0Y2goKSk7CisgIEVYUEVDVF9FUShzdXBlcnN0cnVjdHVyZV9zdGF0dXNfZmV0Y2hlcl8tPmFybV9zdGF0dXMoKSwgQXJtU3RhdHVzOjpJTlRBS0UpOworCisgIFZlcmlmeU5lYXJHb2FsKCk7CisKKyAgeworICAgIGF1dG8gYnVpbGRlciA9IHN1cGVyc3RydWN0dXJlX2dvYWxfc2VuZGVyXy5NYWtlQnVpbGRlcigpOworICAgIEdvYWw6OkJ1aWxkZXIgZ29hbF9idWlsZGVyID0gYnVpbGRlci5NYWtlQnVpbGRlcjxHb2FsPigpOworICAgIGdvYWxfYnVpbGRlci5hZGRfYXJtX3Bvc2l0aW9uKFBpdm90R29hbDo6QU1QKTsKKworICAgIEFTU0VSVF9FUShidWlsZGVyLlNlbmQoZ29hbF9idWlsZGVyLkZpbmlzaCgpKSwgYW9zOjpSYXdTZW5kZXI6OkVycm9yOjprT2spOworICB9CisgIFJ1bkZvcihjaHJvbm86OnNlY29uZHMoMTApKTsKKworICBBU1NFUlRfVFJVRShzdXBlcnN0cnVjdHVyZV9zdGF0dXNfZmV0Y2hlcl8uRmV0Y2goKSk7CisgIEVYUEVDVF9FUShzdXBlcnN0cnVjdHVyZV9zdGF0dXNfZmV0Y2hlcl8tPmFybV9zdGF0dXMoKSwgQXJtU3RhdHVzOjpBTVApOworCisgIFZlcmlmeU5lYXJHb2FsKCk7CisKKyAgeworICAgIGF1dG8gYnVpbGRlciA9IHN1cGVyc3RydWN0dXJlX2dvYWxfc2VuZGVyXy5NYWtlQnVpbGRlcigpOworICAgIEdvYWw6OkJ1aWxkZXIgZ29hbF9idWlsZGVyID0gYnVpbGRlci5NYWtlQnVpbGRlcjxHb2FsPigpOworICAgIGdvYWxfYnVpbGRlci5hZGRfYXJtX3Bvc2l0aW9uKFBpdm90R29hbDo6SURMRSk7CisKKyAgICBBU1NFUlRfRVEoYnVpbGRlci5TZW5kKGdvYWxfYnVpbGRlci5GaW5pc2goKSksIGFvczo6UmF3U2VuZGVyOjpFcnJvcjo6a09rKTsKKyAgfQorICBSdW5Gb3IoY2hyb25vOjpzZWNvbmRzKDEwKSk7CisKKyAgQVNTRVJUX1RSVUUoc3VwZXJzdHJ1Y3R1cmVfc3RhdHVzX2ZldGNoZXJfLkZldGNoKCkpOworICBFWFBFQ1RfRVEoc3VwZXJzdHJ1Y3R1cmVfc3RhdHVzX2ZldGNoZXJfLT5hcm1fc3RhdHVzKCksIEFybVN0YXR1czo6SURMRSk7CisKKyAgVmVyaWZ5TmVhckdvYWwoKTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIHkyMDI0X2JvdDM6OmNvbnRyb2xfbG9vcHM6OnN1cGVyc3RydWN0dXJlOjp0ZXN0aW5nCmRpZmYgLS1naXQgYS95MjAyNF9ib3QzL2NvbnRyb2xfbG9vcHMvc3VwZXJzdHJ1Y3R1cmUvc3VwZXJzdHJ1Y3R1cmVfb3V0cHV0LmZicyBiL3kyMDI0X2JvdDMvY29udHJvbF9sb29wcy9zdXBlcnN0cnVjdHVyZS9zdXBlcnN0cnVjdHVyZV9vdXRwdXQuZmJzCmluZGV4IDI4Nzk5ZGUuLmZhYWEyMWUgMTAwNjQ0Ci0tLSBhL3kyMDI0X2JvdDMvY29udHJvbF9sb29wcy9zdXBlcnN0cnVjdHVyZS9zdXBlcnN0cnVjdHVyZV9vdXRwdXQuZmJzCisrKyBiL3kyMDI0X2JvdDMvY29udHJvbF9sb29wcy9zdXBlcnN0cnVjdHVyZS9zdXBlcnN0cnVjdHVyZV9vdXRwdXQuZmJzCkBAIC0xLDYgKzEsMTEgQEAKIG5hbWVzcGFjZSB5MjAyNF9ib3QzLmNvbnRyb2xfbG9vcHMuc3VwZXJzdHJ1Y3R1cmU7CiAKIHRhYmxlIE91dHB1dCB7CisgICAgLy8gUm9sbGVyIHZvbHRhZ2UsIHBvc2l0aXZlIGlzIGZvciBpbnRha2UgYW5kIHNjb3JpbmcKKyAgICByb2xsZXJfdm9sdGFnZTogZG91YmxlIChpZDogMCk7CisKKyAgICAvLyBBcm0gdm9sdGFnZSwgcG9zaXRpdmUgaXMgbW92aW5nIGFybSB1cAorICAgIGFybV92b2x0YWdlOiBkb3VibGUgKGlkOiAxKTsKIH0KIAogcm9vdF90eXBlIE91dHB1dDsKZGlmZiAtLWdpdCBhL3kyMDI0X2JvdDMvY29udHJvbF9sb29wcy9zdXBlcnN0cnVjdHVyZS9zdXBlcnN0cnVjdHVyZV9wb3NpdGlvbi5mYnMgYi95MjAyNF9ib3QzL2NvbnRyb2xfbG9vcHMvc3VwZXJzdHJ1Y3R1cmUvc3VwZXJzdHJ1Y3R1cmVfcG9zaXRpb24uZmJzCmluZGV4IGYwNTUzYTUuLjZmMjYxNGIgMTAwNjQ0Ci0tLSBhL3kyMDI0X2JvdDMvY29udHJvbF9sb29wcy9zdXBlcnN0cnVjdHVyZS9zdXBlcnN0cnVjdHVyZV9wb3NpdGlvbi5mYnMKKysrIGIveTIwMjRfYm90My9jb250cm9sX2xvb3BzL3N1cGVyc3RydWN0dXJlL3N1cGVyc3RydWN0dXJlX3Bvc2l0aW9uLmZicwpAQCAtNCw2ICs0LDExIEBACiBuYW1lc3BhY2UgeTIwMjRfYm90My5jb250cm9sX2xvb3BzLnN1cGVyc3RydWN0dXJlOwogCiB0YWJsZSBQb3NpdGlvbiB7CisgICAgLy8gWmVybyBmb3IgdGhlIGludGFrZSBwb3NpdGlvbiB2YWx1ZSBpcyBob3Jpem9udGFsLCBwb3NpdGl2ZSBpcyB1cC4KKyAgICBhcm06ZnJjOTcxLlBvdEFuZEFic29sdXRlUG9zaXRpb24gKGlkOiAwKTsKKworICAgIC8vIEJlYW1icmVhayBmb3IgdGhlIGludGFrZSwgMSBtZWFucyBub3RlIGlzIHByZXNlbnQuCisgICAgaW50YWtlX2JlYW1icmVhazpib29sIChpZDogMSk7CiB9CiAKIHJvb3RfdHlwZSBQb3NpdGlvbjsKZGlmZiAtLWdpdCBhL3kyMDI0X2JvdDMvY29udHJvbF9sb29wcy9zdXBlcnN0cnVjdHVyZS9zdXBlcnN0cnVjdHVyZV9zdGF0dXMuZmJzIGIveTIwMjRfYm90My9jb250cm9sX2xvb3BzL3N1cGVyc3RydWN0dXJlL3N1cGVyc3RydWN0dXJlX3N0YXR1cy5mYnMKaW5kZXggY2E1ODc2ZS4uNDA3YWY1ZiAxMDA2NDQKLS0tIGEveTIwMjRfYm90My9jb250cm9sX2xvb3BzL3N1cGVyc3RydWN0dXJlL3N1cGVyc3RydWN0dXJlX3N0YXR1cy5mYnMKKysrIGIveTIwMjRfYm90My9jb250cm9sX2xvb3BzL3N1cGVyc3RydWN0dXJlL3N1cGVyc3RydWN0dXJlX3N0YXR1cy5mYnMKQEAgLTMsMTIgKzMsMzYgQEAKIAogbmFtZXNwYWNlIHkyMDI0X2JvdDMuY29udHJvbF9sb29wcy5zdXBlcnN0cnVjdHVyZTsKIAotdGFibGUgU3RhdHVzIHsKLSAgLy8gQWxsIHN1YnN5c3RlbXMga25vdyB0aGVpciBsb2NhdGlvbi4KLSAgemVyb2VkOmJvb2wgKGlkOiAwKTsKKy8vIEVxdWl2YWxlbnQgdG8gSW50YWtlR29hbCBlbnVtIGluIGdvYWwgZmxhdGJ1ZmZlcgorZW51bSBJbnRha2VSb2xsZXJTdGF0dXMgOiB1Ynl0ZSB7CisgICAgTk9ORSA9IDAsCisgICAgSU5UQUtFID0gMSwKKyAgICBTQ09SRSA9IDIsCisgICAgU1BJVCA9IDMsCit9CiAKLSAgLy8gSWYgdHJ1ZSwgd2UgaGF2ZSBhYm9ydGVkLiBUaGlzIGlzIHRoZSBvciBvZiBhbGwgc3Vic3lzdGVtIGVzdG9wcy4KLSAgZXN0b3BwZWQ6Ym9vbCAoaWQ6IDEpOworLy8gRXF1aXZhbGVudCB0byBQaXZvdEdvYWwgZW51bSBpbiBnb2FsIGZsYXRidWZmZXIKK2VudW0gQXJtU3RhdHVzOiB1Ynl0ZSB7CisgICAgSURMRSA9IDAsCisgICAgSU5UQUtFID0gMSwKKyAgICBBTVAgPSAyLAorfQorCit0YWJsZSBTdGF0dXMgeworICAgIC8vIEFsbCBzdWJzeXN0ZW1zIGtub3cgdGhlaXIgbG9jYXRpb24uCisgICAgemVyb2VkOmJvb2wgKGlkOiAwKTsKKworICAgIC8vIElmIHRydWUsIHdlIGhhdmUgYWJvcnRlZC4gVGhpcyBpcyB0aGUgb3Igb2YgYWxsIHN1YnN5c3RlbSBlc3RvcHMuCisgICAgZXN0b3BwZWQ6Ym9vbCAoaWQ6IDEpOworCisgICAgLy8gRXN0aW1hdGVkIEFuZ2xlcyArIFZlbG9jaXRpZXMgb2YgdGhlIEludGFrZQorICAgIGFybTpmcmM5NzEuY29udHJvbF9sb29wcy5Qb3RBbmRBYnNvbHV0ZUVuY29kZXJQcm9maWxlZEpvaW50U3RhdHVzIChpZDogMik7CisKKyAgICAvLyBUZWxscyB1cyB3aGF0IEludGFrZUdvYWwgaXMKKyAgICBpbnRha2Vfcm9sbGVyX3N0YXR1czogSW50YWtlUm9sbGVyU3RhdHVzIChpZDogMyk7CisKKyAgICAvLyBUZWxscyB1cyB3aGF0IFBpdm90R29hbCBpcworICAgIGFybV9zdGF0dXM6IEFybVN0YXR1cyAoaWQ6IDQpOwogfQogCiByb290X3R5cGUgU3RhdHVzOwpkaWZmIC0tZ2l0IGEveTIwMjRfc3dlcnZlL3Zpc2lvbi90YXJnZXRfbWFwcGluZy5jYyBiL3kyMDI0X3N3ZXJ2ZS92aXNpb24vdGFyZ2V0X21hcHBpbmcuY2MKaW5kZXggYjhiMWY2Mi4uZGQzM2YxMSAxMDA2NDQKLS0tIGEveTIwMjRfc3dlcnZlL3Zpc2lvbi90YXJnZXRfbWFwcGluZy5jYworKysgYi95MjAyNF9zd2VydmUvdmlzaW9uL3RhcmdldF9tYXBwaW5nLmNjCkBAIC0yNjgsNyArMjY4LDcgQEAKICAgICB9CiAKICAgICBjb25zdCBUYXJnZXRNYXBwZXI6OlRhcmdldFBvc2UgdGFyZ2V0X3Bvc2UgPQotICAgICAgICBQb3NlVXRpbHM6OlRhcmdldFBvc2VGcm9tRmJzKCp0YXJnZXRfcG9zZV9mYnMpOworICAgICAgICBUYXJnZXRNYXBwZXI6OlRhcmdldFBvc2VGcm9tRmJzKCp0YXJnZXRfcG9zZV9mYnMpOwogCiAgICAgRWlnZW46OkFmZmluZTNkIEhfY2FtZXJhX3RhcmdldCA9CiAgICAgICAgIEVpZ2VuOjpUcmFuc2xhdGlvbjNkKHRhcmdldF9wb3NlLnBvc2UucCkgKiB0YXJnZXRfcG9zZS5wb3NlLnE7CmRpZmYgLS1naXQgYS95MjAyNF9zd2VydmUveTIwMjRfc3dlcnZlX3JvYm9yaW8uanNvbiBiL3kyMDI0X3N3ZXJ2ZS95MjAyNF9zd2VydmVfcm9ib3Jpby5qc29uCmluZGV4IGIxNWEwMGYuLjZkOTMzZjcgMTAwNjQ0Ci0tLSBhL3kyMDI0X3N3ZXJ2ZS95MjAyNF9zd2VydmVfcm9ib3Jpby5qc29uCisrKyBiL3kyMDI0X3N3ZXJ2ZS95MjAyNF9zd2VydmVfcm9ib3Jpby5qc29uCkBAIC0zMTUsOCArMzE1LDcgQEAKICAgICAgICAgICAgICJuYW1lIjogIndwaWxpYl9pbnRlcmZhY2UiLAogICAgICAgICAgICAgImV4ZWN1dGFibGVfbmFtZSI6ICJ3cGlsaWJfaW50ZXJmYWNlIiwKICAgICAgICAgICAgICJhcmdzIjogWwotICAgICAgICAgICAgICAgICItLW5vZGllX29uX21hbGxvYyIsCi0gICAgICAgICAgICAgICAgIi0tY3RyZV9kaWFnX3NlcnZlciIKKyAgICAgICAgICAgICAgIi0tbm9kaWVfb25fbWFsbG9jIgogICAgICAgICAgICAgXSwKICAgICAgICAgICAgICJub2RlcyI6IFsKICAgICAgICAgICAgICAgICAicm9ib3JpbyIK